aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-x[-rw-r--r--].gitignore10
-rw-r--r--.htaccess4
-rw-r--r--LICENSE2
-rw-r--r--README11
-rw-r--r--README.md40
-rw-r--r--assets/diamondlattice.pngbin0 -> 534585 bytes
-rw-r--r--assets/home.html206
-rw-r--r--assets/logo_antiprism.pngbin0 -> 62321 bytes
-rw-r--r--assets/narrow.css218
-rw-r--r--assets/redmatrixlogo.pngbin0 -> 105403 bytes
-rw-r--r--assets/wide.css396
-rwxr-xr-x[-rw-r--r--]boot.php2400
-rw-r--r--doc/Account-Basics.md59
-rw-r--r--doc/Bugs-and-Issues.md31
-rw-r--r--doc/Channels.md27
-rw-r--r--doc/Cloud.md36
-rw-r--r--doc/Comanche.md143
-rw-r--r--doc/Connecting-to-Channels.md20
-rw-r--r--doc/Connectors.md67
-rw-r--r--doc/Developers.md41
-rw-r--r--doc/Features.md107
-rw-r--r--doc/Groups-and-Privacy.md53
-rw-r--r--doc/Home.md40
-rw-r--r--doc/Hooks.md135
-rw-r--r--doc/Install.md44
-rw-r--r--doc/Installing-Connectors.md135
-rw-r--r--doc/Intro-for-Developers.md105
-rw-r--r--doc/Making-Friends.md59
-rw-r--r--doc/Message-Flow.md54
-rw-r--r--doc/Pages.md36
-rw-r--r--doc/Permissions.md45
-rw-r--r--doc/Plugins.md429
-rw-r--r--doc/Profiles.md17
-rw-r--r--doc/README.md38
-rw-r--r--doc/Remove-Account.md23
-rw-r--r--doc/Schema-development.md76
-rw-r--r--doc/Settings.md227
-rw-r--r--doc/Tags-and-Mentions.md30
-rw-r--r--doc/TermsOfService.md4
-rw-r--r--doc/To-Do-Code.md55
-rw-r--r--doc/To-Do.md23
-rw-r--r--doc/Translations.md91
-rw-r--r--doc/Webpages.md14
-rw-r--r--doc/andfinally.md26
-rw-r--r--doc/api_functions.md138
-rw-r--r--doc/bbcode.html68
-rw-r--r--doc/dev-function-overview.md52
-rw-r--r--doc/groupsandpages.md11
-rw-r--r--doc/guide.md13
-rw-r--r--doc/html/BaseObject_8php.html120
-rw-r--r--doc/html/Contact_8php.html513
-rw-r--r--doc/html/Contact_8php.js18
-rw-r--r--doc/html/ConversationObject_8php.html120
-rw-r--r--doc/html/ITemplateEngine_8php.html120
-rw-r--r--doc/html/ItemObject_8php.html120
-rw-r--r--doc/html/ProtoDriver_8php.html122
-rw-r--r--doc/html/README_8md.html112
-rw-r--r--doc/html/Scrape_8php.html171
-rw-r--r--doc/html/Scrape_8php.js5
-rw-r--r--doc/html/__well__known_8php.html137
-rw-r--r--doc/html/__well__known_8php.js4
-rw-r--r--doc/html/account_8php.html328
-rw-r--r--doc/html/account_8php.js13
-rw-r--r--doc/html/achievements_8php.html137
-rw-r--r--doc/html/achievements_8php.js4
-rw-r--r--doc/html/acl_8php.html157
-rw-r--r--doc/html/acl_8php.js5
-rw-r--r--doc/html/acl__selectors_8php.html279
-rw-r--r--doc/html/acl__selectors_8php.js7
-rw-r--r--doc/html/activities_8php.html149
-rw-r--r--doc/html/activities_8php.js4
-rw-r--r--doc/html/admin_8php.html590
-rw-r--r--doc/html/admin_8php.js20
-rw-r--r--doc/html/allfriends_8php.html137
-rw-r--r--doc/html/allfriends_8php.js4
-rw-r--r--doc/html/annotated.html147
-rw-r--r--doc/html/annotated.js32
-rw-r--r--doc/html/apps_8php.html137
-rw-r--r--doc/html/apps_8php.js4
-rw-r--r--doc/html/apw_2README_8md.html112
-rw-r--r--doc/html/apw_2php_2style_8php.html149
-rw-r--r--doc/html/apw_2php_2style_8php.js5
-rw-r--r--doc/html/apw_2php_2theme_8php.html137
-rw-r--r--doc/html/apw_2php_2theme_8php.js4
-rw-r--r--doc/html/auth_8php.html199
-rw-r--r--doc/html/auth_8php.js6
-rw-r--r--doc/html/bb2diaspora_8php.html342
-rw-r--r--doc/html/bb2diaspora_8php.js12
-rw-r--r--doc/html/bbcode_8php.html300
-rw-r--r--doc/html/bbcode_8php.js12
-rw-r--r--doc/html/bc_s.pngbin0 -> 676 bytes
-rw-r--r--doc/html/bdwn.pngbin0 -> 147 bytes
-rw-r--r--doc/html/blocks_8php.html137
-rw-r--r--doc/html/blocks_8php.js4
-rw-r--r--doc/html/blogga_2php_2README_8md.html112
-rw-r--r--doc/html/blogga_2php_2theme_8php.html138
-rw-r--r--doc/html/blogga_2php_2theme_8php.js4
-rw-r--r--doc/html/blogga_2view_2theme_2blog_2theme_8php.html220
-rw-r--r--doc/html/blogga_2view_2theme_2blog_2theme_8php.js8
-rw-r--r--doc/html/boot_8php.html4556
-rw-r--r--doc/html/boot_8php.js273
-rw-r--r--doc/html/cache_8php.html120
-rw-r--r--doc/html/chanman_8php.html112
-rw-r--r--doc/html/channel_8php.html174
-rw-r--r--doc/html/channel_8php.js5
-rw-r--r--doc/html/chanview_8php.html137
-rw-r--r--doc/html/chanview_8php.js4
-rw-r--r--doc/html/classApp-members.html208
-rw-r--r--doc/html/classApp.html1751
-rw-r--r--doc/html/classApp.js94
-rw-r--r--doc/html/classBaseObject-members.html120
-rw-r--r--doc/html/classBaseObject.html221
-rw-r--r--doc/html/classBaseObject.js4
-rw-r--r--doc/html/classBaseObject.pngbin0 -> 625 bytes
-rw-r--r--doc/html/classCache-members.html120
-rw-r--r--doc/html/classCache.html218
-rw-r--r--doc/html/classConversation-members.html141
-rw-r--r--doc/html/classConversation.html656
-rw-r--r--doc/html/classConversation.js25
-rw-r--r--doc/html/classConversation.pngbin0 -> 436 bytes
-rw-r--r--doc/html/classFKOAuth1-members.html119
-rw-r--r--doc/html/classFKOAuth1.html169
-rw-r--r--doc/html/classFKOAuth1.js5
-rw-r--r--doc/html/classFKOAuth1.pngbin0 -> 433 bytes
-rw-r--r--doc/html/classFKOAuthDataStore-members.html123
-rw-r--r--doc/html/classFKOAuthDataStore.html306
-rw-r--r--doc/html/classFKOAuthDataStore.js9
-rw-r--r--doc/html/classFKOAuthDataStore.pngbin0 -> 560 bytes
-rw-r--r--doc/html/classFriendicaSmarty-members.html120
-rw-r--r--doc/html/classFriendicaSmarty.html188
-rw-r--r--doc/html/classFriendicaSmarty.js6
-rw-r--r--doc/html/classFriendicaSmarty.pngbin0 -> 487 bytes
-rw-r--r--doc/html/classFriendicaSmartyEngine-members.html122
-rw-r--r--doc/html/classFriendicaSmartyEngine.html267
-rw-r--r--doc/html/classFriendicaSmartyEngine.js7
-rw-r--r--doc/html/classFriendicaSmartyEngine.pngbin0 -> 647 bytes
-rw-r--r--doc/html/classItem-members.html165
-rw-r--r--doc/html/classItem.html1264
-rw-r--r--doc/html/classItem.js49
-rw-r--r--doc/html/classItem.pngbin0 -> 391 bytes
-rw-r--r--doc/html/classPhoto-members.html145
-rw-r--r--doc/html/classPhoto.html826
-rw-r--r--doc/html/classPhoto.js30
-rw-r--r--doc/html/classProtoDriver-members.html124
-rw-r--r--doc/html/classProtoDriver.html410
-rw-r--r--doc/html/classProtoDriver.js10
-rw-r--r--doc/html/classProtoDriver.pngbin0 -> 428 bytes
-rw-r--r--doc/html/classRedBasicAuth-members.html127
-rw-r--r--doc/html/classRedBasicAuth.html314
-rw-r--r--doc/html/classRedBasicAuth.js13
-rw-r--r--doc/html/classRedBasicAuth.pngbin0 -> 485 bytes
-rw-r--r--doc/html/classRedBrowser-members.html122
-rw-r--r--doc/html/classRedBrowser.html244
-rw-r--r--doc/html/classRedBrowser.js8
-rw-r--r--doc/html/classRedBrowser.pngbin0 -> 418 bytes
-rw-r--r--doc/html/classRedDirectory-members.html131
-rw-r--r--doc/html/classRedDirectory.html438
-rw-r--r--doc/html/classRedDirectory.js17
-rw-r--r--doc/html/classRedDirectory.pngbin0 -> 615 bytes
-rw-r--r--doc/html/classRedFile-members.html130
-rw-r--r--doc/html/classRedFile.html400
-rw-r--r--doc/html/classRedFile.js16
-rw-r--r--doc/html/classRedFile.pngbin0 -> 457 bytes
-rw-r--r--doc/html/classRedInode-members.html123
-rw-r--r--doc/html/classRedInode.html251
-rw-r--r--doc/html/classRedInode.js9
-rw-r--r--doc/html/classRedInode.pngbin0 -> 354 bytes
-rw-r--r--doc/html/classTemplate-members.html142
-rw-r--r--doc/html/classTemplate.html742
-rw-r--r--doc/html/classTemplate.js27
-rw-r--r--doc/html/classTemplate.pngbin0 -> 489 bytes
-rw-r--r--doc/html/classZotDriver-members.html124
-rw-r--r--doc/html/classZotDriver.html425
-rw-r--r--doc/html/classZotDriver.js10
-rw-r--r--doc/html/classZotDriver.pngbin0 -> 420 bytes
-rw-r--r--doc/html/classdba-members.html128
-rw-r--r--doc/html/classdba.html363
-rw-r--r--doc/html/classdba.js14
-rw-r--r--doc/html/classdba__driver-members.html129
-rw-r--r--doc/html/classdba__driver.html483
-rw-r--r--doc/html/classdba__driver.js15
-rw-r--r--doc/html/classdba__driver.pngbin0 -> 591 bytes
-rw-r--r--doc/html/classdba__mysql-members.html129
-rw-r--r--doc/html/classdba__mysql.html263
-rw-r--r--doc/html/classdba__mysql.js7
-rw-r--r--doc/html/classdba__mysql.pngbin0 -> 443 bytes
-rw-r--r--doc/html/classdba__mysqli-members.html129
-rw-r--r--doc/html/classdba__mysqli.html263
-rw-r--r--doc/html/classdba__mysqli.js7
-rw-r--r--doc/html/classdba__mysqli.pngbin0 -> 441 bytes
-rw-r--r--doc/html/classenotify-members.html118
-rw-r--r--doc/html/classenotify.html167
-rw-r--r--doc/html/classes.html142
-rw-r--r--doc/html/classphoto__driver-members.html147
-rw-r--r--doc/html/classphoto__driver.html945
-rw-r--r--doc/html/classphoto__driver.js33
-rw-r--r--doc/html/classphoto__driver.pngbin0 -> 652 bytes
-rw-r--r--doc/html/classphoto__gd-members.html147
-rw-r--r--doc/html/classphoto__gd.html434
-rw-r--r--doc/html/classphoto__gd.js13
-rw-r--r--doc/html/classphoto__gd.pngbin0 -> 431 bytes
-rw-r--r--doc/html/classphoto__imagick-members.html148
-rw-r--r--doc/html/classphoto__imagick.html461
-rw-r--r--doc/html/classphoto__imagick.js14
-rw-r--r--doc/html/classphoto__imagick.pngbin0 -> 483 bytes
-rw-r--r--doc/html/cli__startup_8php.html138
-rw-r--r--doc/html/cli__startup_8php.js4
-rw-r--r--doc/html/cli__suggest_8php.html147
-rw-r--r--doc/html/cli__suggest_8php.js4
-rw-r--r--doc/html/closed.pngbin0 -> 132 bytes
-rw-r--r--doc/html/cloud_8php.html138
-rw-r--r--doc/html/cloud_8php.js4
-rw-r--r--doc/html/comanche_8php.html325
-rw-r--r--doc/html/comanche_8php.js11
-rw-r--r--doc/html/common_8php.html155
-rw-r--r--doc/html/common_8php.js5
-rw-r--r--doc/html/community_8php.html167
-rw-r--r--doc/html/community_8php.js5
-rw-r--r--doc/html/config_8md.html112
-rw-r--r--doc/html/connect_8php.html173
-rw-r--r--doc/html/connect_8php.js6
-rw-r--r--doc/html/connections_8php.html193
-rw-r--r--doc/html/connections_8php.js7
-rw-r--r--doc/html/connedit_8php.html193
-rw-r--r--doc/html/connedit_8php.js7
-rw-r--r--doc/html/contact__selectors_8php.html207
-rw-r--r--doc/html/contact__selectors_8php.js7
-rw-r--r--doc/html/contact__widgets_8php.html216
-rw-r--r--doc/html/contact__widgets_8php.js7
-rw-r--r--doc/html/contactgroup_8php.html137
-rw-r--r--doc/html/contactgroup_8php.js4
-rw-r--r--doc/html/conversation_8php.html779
-rw-r--r--doc/html/conversation_8php.js27
-rw-r--r--doc/html/crepair_8php.html173
-rw-r--r--doc/html/crepair_8php.js6
-rw-r--r--doc/html/cronhooks_8php.html147
-rw-r--r--doc/html/cronhooks_8php.js4
-rw-r--r--doc/html/crypto_8php.html465
-rw-r--r--doc/html/crypto_8php.js14
-rw-r--r--doc/html/dark_8php.html112
-rw-r--r--doc/html/darkness_8php.html112
-rw-r--r--doc/html/darknessleftaside_8php.html112
-rw-r--r--doc/html/darknessrightaside_8php.html112
-rw-r--r--doc/html/datetime_8php.html597
-rw-r--r--doc/html/datetime_8php.js17
-rw-r--r--doc/html/db__update_8php.html120
-rw-r--r--doc/html/db__update_8php.js7
-rw-r--r--doc/html/dba_8php.html112
-rw-r--r--doc/html/dba_8php.js11
-rw-r--r--doc/html/dba__driver_8php.html327
-rw-r--r--doc/html/dba__driver_8php.js12
-rw-r--r--doc/html/dba__mysql_8php.html120
-rw-r--r--doc/html/dba__mysqli_8php.html120
-rw-r--r--doc/html/default_8php.html133
-rw-r--r--doc/html/default_8php.js4
-rw-r--r--doc/html/delegate_8php.html137
-rw-r--r--doc/html/delegate_8php.js4
-rw-r--r--doc/html/deliver_8php.html147
-rw-r--r--doc/html/deliver_8php.js4
-rw-r--r--doc/html/dir_032dd9e2cfe278a2cfa5eb9547448eb9.html118
-rw-r--r--doc/html/dir_032dd9e2cfe278a2cfa5eb9547448eb9.js7
-rw-r--r--doc/html/dir_05f4fba29266e8fd7869afcd6cefb5cb.html132
-rw-r--r--doc/html/dir_05f4fba29266e8fd7869afcd6cefb5cb.js14
-rw-r--r--doc/html/dir_0eaa4a0adae8ba4811e133c6e594aeee.html112
-rw-r--r--doc/html/dir_0eaa4a0adae8ba4811e133c6e594aeee.js4
-rw-r--r--doc/html/dir_21bc5169ff11430004758be31dcfc6c4.html116
-rw-r--r--doc/html/dir_21bc5169ff11430004758be31dcfc6c4.js10
-rw-r--r--doc/html/dir_23ec12649285f9fabf3a6b7380226c28.html137
-rw-r--r--doc/html/dir_23ec12649285f9fabf3a6b7380226c28.js15
-rw-r--r--doc/html/dir_25f74a9991dbbca1b52a94e358ca73c1.html112
-rw-r--r--doc/html/dir_25f74a9991dbbca1b52a94e358ca73c1.js4
-rw-r--r--doc/html/dir_3d9c9d0c5e9556dd3eba1e072fa6eaeb.html112
-rw-r--r--doc/html/dir_3d9c9d0c5e9556dd3eba1e072fa6eaeb.js4
-rw-r--r--doc/html/dir_55dbaf9b7b53c4fc605c9011743a7353.html114
-rw-r--r--doc/html/dir_55dbaf9b7b53c4fc605c9011743a7353.js5
-rw-r--r--doc/html/dir_6b44a0e797e2f12381093380e3e54763.html120
-rw-r--r--doc/html/dir_6b44a0e797e2f12381093380e3e54763.js8
-rw-r--r--doc/html/dir_6cee3bb9ace89cc4e2f065aa2ca7bc5b.html112
-rw-r--r--doc/html/dir_6cee3bb9ace89cc4e2f065aa2ca7bc5b.js4
-rw-r--r--doc/html/dir_720432dea4a717197ae070dbc42b8f20.html112
-rw-r--r--doc/html/dir_720432dea4a717197ae070dbc42b8f20.js4
-rw-r--r--doc/html/dir_817f6d302394b98e59575acdb59998bc.html122
-rw-r--r--doc/html/dir_817f6d302394b98e59575acdb59998bc.js9
-rw-r--r--doc/html/dir_8543001e5d25368a6edede3e63efb554.html116
-rw-r--r--doc/html/dir_8543001e5d25368a6edede3e63efb554.js6
-rw-r--r--doc/html/dir_8e4ceba158be32034f698ffd6810bb05.html122
-rw-r--r--doc/html/dir_8e4ceba158be32034f698ffd6810bb05.js4
-rw-r--r--doc/html/dir_922c77e958c99a98db92d38a3a349bf2.html114
-rw-r--r--doc/html/dir_922c77e958c99a98db92d38a3a349bf2.js5
-rw-r--r--doc/html/dir_92d6b429199666aa3765c8a934db5e14.html112
-rw-r--r--doc/html/dir_92d6b429199666aa3765c8a934db5e14.js4
-rw-r--r--doc/html/dir_955ae6074e6c84afe72925e364242b14.html122
-rw-r--r--doc/html/dir_955ae6074e6c84afe72925e364242b14.js4
-rw-r--r--doc/html/dir__fns_8php.html237
-rw-r--r--doc/html/dir__fns_8php.js9
-rw-r--r--doc/html/dir_a8a0005c2b8590c535262d232c22afab.html116
-rw-r--r--doc/html/dir_a8a0005c2b8590c535262d232c22afab.js6
-rw-r--r--doc/html/dir_aae29906d7bfc07d076125f669c8352e.html116
-rw-r--r--doc/html/dir_aae29906d7bfc07d076125f669c8352e.js10
-rw-r--r--doc/html/dir_b2f003339c516cc00c8cadcafbe82f13.html114
-rw-r--r--doc/html/dir_b2f003339c516cc00c8cadcafbe82f13.js5
-rw-r--r--doc/html/dir_c02447ad39a5307c81c64e880ec9e8d3.html118
-rw-r--r--doc/html/dir_c02447ad39a5307c81c64e880ec9e8d3.js7
-rw-r--r--doc/html/dir_cb8a8f75dcdd0b3fbfcc82e9eda410c5.html116
-rw-r--r--doc/html/dir_cb8a8f75dcdd0b3fbfcc82e9eda410c5.js6
-rw-r--r--doc/html/dir_d41ce877eb409a4791b288730010abe2.html362
-rw-r--r--doc/html/dir_d41ce877eb409a4791b288730010abe2.js129
-rw-r--r--doc/html/dir_d44c64559bbebec7f509842c48db8b23.html257
-rw-r--r--doc/html/dir_d44c64559bbebec7f509842c48db8b23.js91
-rw-r--r--doc/html/dir_d520c5cf583201d9437764f209363c22.html114
-rw-r--r--doc/html/dir_d520c5cf583201d9437764f209363c22.js5
-rw-r--r--doc/html/dir_d795dfe8933002397556cc7aa16eca15.html112
-rw-r--r--doc/html/dir_d795dfe8933002397556cc7aa16eca15.js4
-rw-r--r--doc/html/dirfind_8php.html155
-rw-r--r--doc/html/dirfind_8php.js5
-rw-r--r--doc/html/dirprofile_8php.html137
-rw-r--r--doc/html/dirprofile_8php.js4
-rw-r--r--doc/html/dirsearch_8php.html174
-rw-r--r--doc/html/dirsearch_8php.js6
-rw-r--r--doc/html/display_8php.html155
-rw-r--r--doc/html/display_8php.js4
-rw-r--r--doc/html/docblox__errorchecker_8php.html314
-rw-r--r--doc/html/docblox__errorchecker_8php.js14
-rw-r--r--doc/html/doxygen.css1184
-rw-r--r--doc/html/doxygen.pngbin0 -> 3779 bytes
-rw-r--r--doc/html/dynsections.js97
-rw-r--r--doc/html/editblock_8php.html137
-rw-r--r--doc/html/editblock_8php.js4
-rw-r--r--doc/html/editlayout_8php.html137
-rw-r--r--doc/html/editlayout_8php.js4
-rw-r--r--doc/html/editpost_8php.html137
-rw-r--r--doc/html/editpost_8php.js4
-rw-r--r--doc/html/editwebpage_8php.html137
-rw-r--r--doc/html/editwebpage_8php.js4
-rw-r--r--doc/html/enotify_8php.html145
-rw-r--r--doc/html/enotify_8php.js5
-rw-r--r--doc/html/event_8php.html265
-rw-r--r--doc/html/event_8php.js10
-rw-r--r--doc/html/events_8php.html155
-rw-r--r--doc/html/events_8php.js5
-rw-r--r--doc/html/expire_8php.html147
-rw-r--r--doc/html/expire_8php.js4
-rw-r--r--doc/html/extract_8php.html181
-rw-r--r--doc/html/extract_8php.js7
-rw-r--r--doc/html/fbrowser_8php.html149
-rw-r--r--doc/html/fbrowser_8php.js4
-rw-r--r--doc/html/fcontact_8php.html187
-rw-r--r--doc/html/fcontact_8php.js5
-rw-r--r--doc/html/features_8php.html166
-rw-r--r--doc/html/features_8php.js5
-rw-r--r--doc/html/feed_8php.html137
-rw-r--r--doc/html/feed_8php.js4
-rw-r--r--doc/html/filer_8php.html137
-rw-r--r--doc/html/filer_8php.js4
-rw-r--r--doc/html/filerm_8php.html137
-rw-r--r--doc/html/filerm_8php.js4
-rw-r--r--doc/html/files.html385
-rw-r--r--doc/html/files.js8
-rw-r--r--doc/html/filestorage_8php.html155
-rw-r--r--doc/html/filestorage_8php.js5
-rw-r--r--doc/html/fpostit_8php.html172
-rw-r--r--doc/html/fpostit_8php.js5
-rw-r--r--doc/html/fred-48.pngbin0 -> 1706 bytes
-rw-r--r--doc/html/fresh_8md.html112
-rw-r--r--doc/html/friendica-to-smarty-tpl_8py.html158
-rw-r--r--doc/html/friendica-to-smarty-tpl_8py.js18
-rw-r--r--doc/html/friendica__smarty_8php.html122
-rw-r--r--doc/html/fsuggest_8php.html155
-rw-r--r--doc/html/fsuggest_8php.js5
-rw-r--r--doc/html/ftv2blank.pngbin0 -> 86 bytes
-rw-r--r--doc/html/ftv2cl.pngbin0 -> 453 bytes
-rw-r--r--doc/html/ftv2doc.pngbin0 -> 746 bytes
-rw-r--r--doc/html/ftv2folderclosed.pngbin0 -> 616 bytes
-rw-r--r--doc/html/ftv2folderopen.pngbin0 -> 597 bytes
-rw-r--r--doc/html/ftv2lastnode.pngbin0 -> 86 bytes
-rw-r--r--doc/html/ftv2link.pngbin0 -> 746 bytes
-rw-r--r--doc/html/ftv2mlastnode.pngbin0 -> 246 bytes
-rw-r--r--doc/html/ftv2mnode.pngbin0 -> 246 bytes
-rw-r--r--doc/html/ftv2mo.pngbin0 -> 403 bytes
-rw-r--r--doc/html/ftv2node.pngbin0 -> 86 bytes
-rw-r--r--doc/html/ftv2ns.pngbin0 -> 388 bytes
-rw-r--r--doc/html/ftv2plastnode.pngbin0 -> 229 bytes
-rw-r--r--doc/html/ftv2pnode.pngbin0 -> 229 bytes
-rw-r--r--doc/html/ftv2splitbar.pngbin0 -> 314 bytes
-rw-r--r--doc/html/ftv2vertline.pngbin0 -> 86 bytes
-rw-r--r--doc/html/full_8php.html133
-rw-r--r--doc/html/full_8php.js4
-rw-r--r--doc/html/functions.html491
-rw-r--r--doc/html/functions_0x5f.html195
-rw-r--r--doc/html/functions_0x61.html155
-rw-r--r--doc/html/functions_0x62.html148
-rw-r--r--doc/html/functions_0x63.html190
-rw-r--r--doc/html/functions_0x64.html173
-rw-r--r--doc/html/functions_0x65.html150
-rw-r--r--doc/html/functions_0x66.html150
-rw-r--r--doc/html/functions_0x67.html309
-rw-r--r--doc/html/functions_0x68.html154
-rw-r--r--doc/html/functions_0x69.html178
-rw-r--r--doc/html/functions_0x6c.html162
-rw-r--r--doc/html/functions_0x6e.html151
-rw-r--r--doc/html/functions_0x6f.html148
-rw-r--r--doc/html/functions_0x70.html151
-rw-r--r--doc/html/functions_0x71.html150
-rw-r--r--doc/html/functions_0x72.html167
-rw-r--r--doc/html/functions_0x73.html251
-rw-r--r--doc/html/functions_0x74.html148
-rw-r--r--doc/html/functions_0x76.html151
-rw-r--r--doc/html/functions_dup.js23
-rw-r--r--doc/html/functions_func.html194
-rw-r--r--doc/html/functions_func.js22
-rw-r--r--doc/html/functions_func_0x61.html154
-rw-r--r--doc/html/functions_func_0x62.html147
-rw-r--r--doc/html/functions_func_0x63.html189
-rw-r--r--doc/html/functions_func_0x64.html172
-rw-r--r--doc/html/functions_func_0x65.html149
-rw-r--r--doc/html/functions_func_0x66.html149
-rw-r--r--doc/html/functions_func_0x67.html308
-rw-r--r--doc/html/functions_func_0x68.html153
-rw-r--r--doc/html/functions_func_0x69.html177
-rw-r--r--doc/html/functions_func_0x6c.html161
-rw-r--r--doc/html/functions_func_0x6e.html150
-rw-r--r--doc/html/functions_func_0x6f.html147
-rw-r--r--doc/html/functions_func_0x70.html150
-rw-r--r--doc/html/functions_func_0x71.html149
-rw-r--r--doc/html/functions_func_0x72.html166
-rw-r--r--doc/html/functions_func_0x73.html250
-rw-r--r--doc/html/functions_func_0x74.html147
-rw-r--r--doc/html/functions_func_0x76.html150
-rw-r--r--doc/html/functions_vars.html472
-rw-r--r--doc/html/globals.html341
-rw-r--r--doc/html/globals_0x5f.html153
-rw-r--r--doc/html/globals_0x61.html633
-rw-r--r--doc/html/globals_0x62.html225
-rw-r--r--doc/html/globals_0x63.html465
-rw-r--r--doc/html/globals_0x64.html297
-rw-r--r--doc/html/globals_0x65.html225
-rw-r--r--doc/html/globals_0x66.html279
-rw-r--r--doc/html/globals_0x67.html363
-rw-r--r--doc/html/globals_0x68.html228
-rw-r--r--doc/html/globals_0x69.html352
-rw-r--r--doc/html/globals_0x6a.html162
-rw-r--r--doc/html/globals_0x6b.html156
-rw-r--r--doc/html/globals_0x6c.html252
-rw-r--r--doc/html/globals_0x6d.html285
-rw-r--r--doc/html/globals_0x6e.html354
-rw-r--r--doc/html/globals_0x6f.html201
-rw-r--r--doc/html/globals_0x70.html576
-rw-r--r--doc/html/globals_0x71.html162
-rw-r--r--doc/html/globals_0x72.html315
-rw-r--r--doc/html/globals_0x73.html345
-rw-r--r--doc/html/globals_0x74.html285
-rw-r--r--doc/html/globals_0x75.html240
-rw-r--r--doc/html/globals_0x76.html189
-rw-r--r--doc/html/globals_0x77.html249
-rw-r--r--doc/html/globals_0x78.html201
-rw-r--r--doc/html/globals_0x7a.html240
-rw-r--r--doc/html/globals_dup.js30
-rw-r--r--doc/html/globals_func.html152
-rw-r--r--doc/html/globals_func.js29
-rw-r--r--doc/html/globals_func_0x61.html485
-rw-r--r--doc/html/globals_func_0x62.html224
-rw-r--r--doc/html/globals_func_0x63.html446
-rw-r--r--doc/html/globals_func_0x64.html269
-rw-r--r--doc/html/globals_func_0x65.html212
-rw-r--r--doc/html/globals_func_0x66.html275
-rw-r--r--doc/html/globals_func_0x67.html353
-rw-r--r--doc/html/globals_func_0x68.html203
-rw-r--r--doc/html/globals_func_0x69.html266
-rw-r--r--doc/html/globals_func_0x6a.html158
-rw-r--r--doc/html/globals_func_0x6b.html152
-rw-r--r--doc/html/globals_func_0x6c.html230
-rw-r--r--doc/html/globals_func_0x6d.html254
-rw-r--r--doc/html/globals_func_0x6e.html233
-rw-r--r--doc/html/globals_func_0x6f.html200
-rw-r--r--doc/html/globals_func_0x70.html443
-rw-r--r--doc/html/globals_func_0x71.html161
-rw-r--r--doc/html/globals_func_0x72.html290
-rw-r--r--doc/html/globals_func_0x73.html332
-rw-r--r--doc/html/globals_func_0x74.html242
-rw-r--r--doc/html/globals_func_0x75.html227
-rw-r--r--doc/html/globals_func_0x76.html188
-rw-r--r--doc/html/globals_func_0x77.html245
-rw-r--r--doc/html/globals_func_0x78.html179
-rw-r--r--doc/html/globals_func_0x7a.html233
-rw-r--r--doc/html/globals_vars.html336
-rw-r--r--doc/html/globals_vars.js25
-rw-r--r--doc/html/globals_vars_0x61.html292
-rw-r--r--doc/html/globals_vars_0x63.html163
-rw-r--r--doc/html/globals_vars_0x64.html172
-rw-r--r--doc/html/globals_vars_0x65.html157
-rw-r--r--doc/html/globals_vars_0x66.html148
-rw-r--r--doc/html/globals_vars_0x67.html154
-rw-r--r--doc/html/globals_vars_0x68.html169
-rw-r--r--doc/html/globals_vars_0x69.html229
-rw-r--r--doc/html/globals_vars_0x6a.html148
-rw-r--r--doc/html/globals_vars_0x6b.html148
-rw-r--r--doc/html/globals_vars_0x6c.html166
-rw-r--r--doc/html/globals_vars_0x6d.html175
-rw-r--r--doc/html/globals_vars_0x6e.html265
-rw-r--r--doc/html/globals_vars_0x70.html277
-rw-r--r--doc/html/globals_vars_0x72.html169
-rw-r--r--doc/html/globals_vars_0x73.html157
-rw-r--r--doc/html/globals_vars_0x74.html187
-rw-r--r--doc/html/globals_vars_0x75.html157
-rw-r--r--doc/html/globals_vars_0x77.html148
-rw-r--r--doc/html/globals_vars_0x78.html166
-rw-r--r--doc/html/globals_vars_0x7a.html151
-rw-r--r--doc/html/gprobe_8php.html147
-rw-r--r--doc/html/gprobe_8php.js4
-rw-r--r--doc/html/greenthumbnails_8php.html112
-rw-r--r--doc/html/hcard_8php.html155
-rw-r--r--doc/html/hcard_8php.js5
-rw-r--r--doc/html/help_8php.html158
-rw-r--r--doc/html/help_8php.js5
-rw-r--r--doc/html/hierarchy.html152
-rw-r--r--doc/html/hierarchy.js50
-rw-r--r--doc/html/home_8php.html155
-rw-r--r--doc/html/home_8php.js5
-rw-r--r--doc/html/hostxrd_8php.html137
-rw-r--r--doc/html/hostxrd_8php.js4
-rw-r--r--doc/html/html2bbcode_8php.html265
-rw-r--r--doc/html/html2bbcode_8php.js7
-rw-r--r--doc/html/html2plain_8php.html241
-rw-r--r--doc/html/html2plain_8php.js7
-rw-r--r--doc/html/identity_8php.html704
-rw-r--r--doc/html/identity_8php.js25
-rw-r--r--doc/html/import_8php.html155
-rw-r--r--doc/html/import_8php.js5
-rw-r--r--doc/html/include_2api_8php.html1597
-rw-r--r--doc/html/include_2api_8php.js55
-rw-r--r--doc/html/include_2attach_8php.html588
-rw-r--r--doc/html/include_2attach_8php.js15
-rw-r--r--doc/html/include_2chanman_8php.html137
-rw-r--r--doc/html/include_2chanman_8php.js4
-rw-r--r--doc/html/include_2config_8php.html557
-rw-r--r--doc/html/include_2config_8php.js16
-rw-r--r--doc/html/include_2directory_8php.html147
-rw-r--r--doc/html/include_2directory_8php.js4
-rw-r--r--doc/html/include_2follow_8php.html168
-rw-r--r--doc/html/include_2follow_8php.js4
-rw-r--r--doc/html/include_2group_8php.html493
-rw-r--r--doc/html/include_2group_8php.js15
-rw-r--r--doc/html/include_2menu_8php.html431
-rw-r--r--doc/html/include_2menu_8php.js14
-rw-r--r--doc/html/include_2message_8php.html322
-rw-r--r--doc/html/include_2message_8php.js8
-rw-r--r--doc/html/include_2network_8php.html700
-rw-r--r--doc/html/include_2network_8php.js23
-rw-r--r--doc/html/include_2notify_8php.html139
-rw-r--r--doc/html/include_2notify_8php.js4
-rw-r--r--doc/html/include_2oembed_8php.html306
-rw-r--r--doc/html/include_2oembed_8php.js11
-rw-r--r--doc/html/include_2photos_8php.html403
-rw-r--r--doc/html/include_2photos_8php.js11
-rw-r--r--doc/html/include_2settings_8php.html150
-rw-r--r--doc/html/include_2settings_8php.js4
-rw-r--r--doc/html/index.html106
-rw-r--r--doc/html/interfaceITemplateEngine-members.html119
-rw-r--r--doc/html/interfaceITemplateEngine.html197
-rw-r--r--doc/html/interfaceITemplateEngine.js5
-rw-r--r--doc/html/interfaceITemplateEngine.pngbin0 -> 893 bytes
-rw-r--r--doc/html/intro_8php.html173
-rw-r--r--doc/html/intro_8php.js6
-rw-r--r--doc/html/invite_8php.html157
-rw-r--r--doc/html/invite_8php.js5
-rw-r--r--doc/html/iquery_8php.html147
-rw-r--r--doc/html/iquery_8php.js4
-rw-r--r--doc/html/item_8php.html380
-rw-r--r--doc/html/item_8php.js9
-rw-r--r--doc/html/items_8php.html1658
-rw-r--r--doc/html/items_8php.js58
-rw-r--r--doc/html/jquery.js77
-rw-r--r--doc/html/language_8php.html323
-rw-r--r--doc/html/language_8php.js12
-rw-r--r--doc/html/lastpost_8php.html190
-rw-r--r--doc/html/lastpost_8php.js6
-rw-r--r--doc/html/layouts_8php.html137
-rw-r--r--doc/html/layouts_8php.js4
-rw-r--r--doc/html/like_8php.html137
-rw-r--r--doc/html/like_8php.js4
-rw-r--r--doc/html/lockview_8php.html137
-rw-r--r--doc/html/lockview_8php.js4
-rw-r--r--doc/html/login_8php.html137
-rw-r--r--doc/html/login_8php.js4
-rw-r--r--doc/html/lostpass_8php.html155
-rw-r--r--doc/html/lostpass_8php.js5
-rw-r--r--doc/html/magic_8php.html137
-rw-r--r--doc/html/magic_8php.js4
-rw-r--r--doc/html/mail_8php.html155
-rw-r--r--doc/html/mail_8php.js5
-rw-r--r--doc/html/manage_8php.html137
-rw-r--r--doc/html/manage_8php.js4
-rw-r--r--doc/html/match_8php.html137
-rw-r--r--doc/html/match_8php.js4
-rw-r--r--doc/html/md_README.html110
-rw-r--r--doc/html/md_config.html112
-rw-r--r--doc/html/md_fresh.html124
-rw-r--r--doc/html/minimal_8php.html112
-rw-r--r--doc/html/minimalisticdarkness_8php.html215
-rw-r--r--doc/html/minimalisticdarkness_8php.js9
-rw-r--r--doc/html/mitem_8php.html173
-rw-r--r--doc/html/mitem_8php.js6
-rw-r--r--doc/html/mod_2api_8php.html175
-rw-r--r--doc/html/mod_2api_8php.js6
-rw-r--r--doc/html/mod_2attach_8php.html137
-rw-r--r--doc/html/mod_2attach_8php.js4
-rw-r--r--doc/html/mod_2chanman_8php.html112
-rw-r--r--doc/html/mod_2directory_8php.html155
-rw-r--r--doc/html/mod_2directory_8php.js5
-rw-r--r--doc/html/mod_2follow_8php.html155
-rw-r--r--doc/html/mod_2follow_8php.js5
-rw-r--r--doc/html/mod_2group_8php.html155
-rw-r--r--doc/html/mod_2group_8php.js5
-rw-r--r--doc/html/mod_2menu_8php.html155
-rw-r--r--doc/html/mod_2menu_8php.js5
-rw-r--r--doc/html/mod_2message_8php.html137
-rw-r--r--doc/html/mod_2message_8php.js4
-rw-r--r--doc/html/mod_2network_8php.html173
-rw-r--r--doc/html/mod_2network_8php.js5
-rw-r--r--doc/html/mod_2notify_8php.html155
-rw-r--r--doc/html/mod_2notify_8php.js5
-rw-r--r--doc/html/mod_2oembed_8php.html137
-rw-r--r--doc/html/mod_2oembed_8php.js4
-rw-r--r--doc/html/mod_2photos_8php.html176
-rw-r--r--doc/html/mod_2photos_8php.js6
-rw-r--r--doc/html/mod_2settings_8php.html193
-rw-r--r--doc/html/mod_2settings_8php.js7
-rw-r--r--doc/html/mod__import_8php.html135
-rw-r--r--doc/html/mod__import_8php.js4
-rw-r--r--doc/html/mod__new__channel_8php.html133
-rw-r--r--doc/html/mod__new__channel_8php.js4
-rw-r--r--doc/html/mod__register_8php.html133
-rw-r--r--doc/html/mod__register_8php.js4
-rw-r--r--doc/html/mood_8php.html155
-rw-r--r--doc/html/mood_8php.js5
-rw-r--r--doc/html/msearch_8php.html137
-rw-r--r--doc/html/msearch_8php.js4
-rw-r--r--doc/html/namespaceFriendica.html115
-rw-r--r--doc/html/namespaceacl__selectors.html112
-rw-r--r--doc/html/namespacefriendica-to-smarty-tpl.html376
-rw-r--r--doc/html/namespacemembers.html176
-rw-r--r--doc/html/namespacemembers_func.html130
-rw-r--r--doc/html/namespacemembers_vars.html163
-rw-r--r--doc/html/namespaces.html121
-rw-r--r--doc/html/namespaces.js8
-rw-r--r--doc/html/namespaceupdatetpl.html212
-rw-r--r--doc/html/namespaceutil.html144
-rw-r--r--doc/html/nav_8php.html167
-rw-r--r--doc/html/nav_8php.js5
-rw-r--r--doc/html/nav_f.pngbin0 -> 153 bytes
-rw-r--r--doc/html/nav_g.pngbin0 -> 95 bytes
-rw-r--r--doc/html/nav_h.pngbin0 -> 98 bytes
-rw-r--r--doc/html/navtree.css143
-rw-r--r--doc/html/navtree.js543
-rw-r--r--doc/html/navtreeindex0.js253
-rw-r--r--doc/html/navtreeindex1.js253
-rw-r--r--doc/html/navtreeindex2.js253
-rw-r--r--doc/html/navtreeindex3.js253
-rw-r--r--doc/html/navtreeindex4.js253
-rw-r--r--doc/html/navtreeindex5.js253
-rw-r--r--doc/html/navtreeindex6.js253
-rw-r--r--doc/html/navtreeindex7.js253
-rw-r--r--doc/html/navtreeindex8.js49
-rw-r--r--doc/html/new__channel_8php.html173
-rw-r--r--doc/html/new__channel_8php.js6
-rw-r--r--doc/html/nogroup_8php.html155
-rw-r--r--doc/html/nogroup_8php.js5
-rw-r--r--doc/html/none_8php.html112
-rw-r--r--doc/html/notes_8php.html137
-rw-r--r--doc/html/notes_8php.js4
-rw-r--r--doc/html/notifications_8php.html155
-rw-r--r--doc/html/notifications_8php.js5
-rw-r--r--doc/html/notifier_8php.html147
-rw-r--r--doc/html/notifier_8php.js4
-rw-r--r--doc/html/oauth_8php.html160
-rw-r--r--doc/html/oauth_8php.js7
-rw-r--r--doc/html/oexchange_8php.html155
-rw-r--r--doc/html/oexchange_8php.js5
-rw-r--r--doc/html/olddefault_8php.html112
-rw-r--r--doc/html/onedirsync_8php.html147
-rw-r--r--doc/html/onedirsync_8php.js4
-rw-r--r--doc/html/onepoll_8php.html147
-rw-r--r--doc/html/onepoll_8php.js4
-rw-r--r--doc/html/open.pngbin0 -> 123 bytes
-rw-r--r--doc/html/opensearch_8php.html137
-rw-r--r--doc/html/opensearch_8php.js4
-rw-r--r--doc/html/page_8php.html155
-rw-r--r--doc/html/page_8php.js5
-rw-r--r--doc/html/page__widgets_8php.html177
-rw-r--r--doc/html/page__widgets_8php.js5
-rw-r--r--doc/html/pages.html113
-rw-r--r--doc/html/parse__url_8php.html215
-rw-r--r--doc/html/parse__url_8php.js7
-rw-r--r--doc/html/passion_8php.html112
-rw-r--r--doc/html/passionwide_8php.html112
-rw-r--r--doc/html/permissions_8php.html274
-rw-r--r--doc/html/permissions_8php.js8
-rw-r--r--doc/html/photo_8php.html139
-rw-r--r--doc/html/photo_8php.js4
-rw-r--r--doc/html/photo__driver_8php.html269
-rw-r--r--doc/html/photo__driver_8php.js8
-rw-r--r--doc/html/photo__gd_8php.html120
-rw-r--r--doc/html/photo__imagick_8php.html120
-rw-r--r--doc/html/php2po_8php.html245
-rw-r--r--doc/html/php2po_8php.js11
-rw-r--r--doc/html/php_2default_8php.html133
-rw-r--r--doc/html/php_2default_8php.js4
-rw-r--r--doc/html/php_2theme__init_8php.html136
-rw-r--r--doc/html/php_2theme__init_8php.js4
-rw-r--r--doc/html/php_8php.html137
-rw-r--r--doc/html/php_8php.js4
-rw-r--r--doc/html/pine_8php.html112
-rw-r--r--doc/html/ping_8php.html137
-rw-r--r--doc/html/ping_8php.js4
-rw-r--r--doc/html/plugin_8php.html850
-rw-r--r--doc/html/plugin_8php.js33
-rw-r--r--doc/html/po2php_8php.html147
-rw-r--r--doc/html/po2php_8php.js4
-rw-r--r--doc/html/poco_8php.html137
-rw-r--r--doc/html/poco_8php.js4
-rw-r--r--doc/html/poke_8php.html157
-rw-r--r--doc/html/poke_8php.js5
-rw-r--r--doc/html/poller_8php.html147
-rw-r--r--doc/html/poller_8php.js4
-rw-r--r--doc/html/post_8php.html200
-rw-r--r--doc/html/post_8php.js5
-rw-r--r--doc/html/post__to__red_8php.html569
-rw-r--r--doc/html/post__to__red_8php.js27
-rw-r--r--doc/html/pretheme_8php.html137
-rw-r--r--doc/html/pretheme_8php.js4
-rw-r--r--doc/html/probe_8php.html137
-rw-r--r--doc/html/probe_8php.js4
-rw-r--r--doc/html/profile_8php.html165
-rw-r--r--doc/html/profile_8php.js5
-rw-r--r--doc/html/profile__advanced_8php.html139
-rw-r--r--doc/html/profile__advanced_8php.js4
-rw-r--r--doc/html/profile__photo_8php.html155
-rw-r--r--doc/html/profile__photo_8php.js5
-rw-r--r--doc/html/profile__selectors_8php.html209
-rw-r--r--doc/html/profile__selectors_8php.js6
-rw-r--r--doc/html/profiles_8php.html173
-rw-r--r--doc/html/profiles_8php.js6
-rw-r--r--doc/html/profperm_8php.html155
-rw-r--r--doc/html/profperm_8php.js5
-rw-r--r--doc/html/pubsites_8php.html139
-rw-r--r--doc/html/pubsites_8php.js4
-rw-r--r--doc/html/qsearch_8php.html137
-rw-r--r--doc/html/qsearch_8php.js4
-rw-r--r--doc/html/queue_8php.html147
-rw-r--r--doc/html/queue_8php.js4
-rw-r--r--doc/html/queue__fn_8php.html155
-rw-r--r--doc/html/queue__fn_8php.js5
-rw-r--r--doc/html/r!-64.pngbin0 -> 2945 bytes
-rw-r--r--doc/html/randprof_8php.html137
-rw-r--r--doc/html/randprof_8php.js4
-rw-r--r--doc/html/redbasic_2php_2style_8php.html511
-rw-r--r--doc/html/redbasic_2php_2style_8php.js30
-rw-r--r--doc/html/redbasic_2php_2theme_8php.html145
-rw-r--r--doc/html/redbasic_2php_2theme_8php.js4
-rw-r--r--doc/html/redbasic_8php.html112
-rw-r--r--doc/html/reddav_8php.html217
-rw-r--r--doc/html/reddav_8php.js10
-rw-r--r--doc/html/redir_8php.html137
-rw-r--r--doc/html/redir_8php.js4
-rw-r--r--doc/html/redstrap_2php_2style_8php.html377
-rw-r--r--doc/html/redstrap_2php_2style_8php.js20
-rw-r--r--doc/html/redstrap_2php_2theme_8php.html137
-rw-r--r--doc/html/redstrap_2php_2theme_8php.js4
-rw-r--r--doc/html/register_8php.html173
-rw-r--r--doc/html/register_8php.js6
-rw-r--r--doc/html/regmod_8php.html137
-rw-r--r--doc/html/regmod_8php.js4
-rw-r--r--doc/html/removeme_8php.html155
-rw-r--r--doc/html/removeme_8php.js5
-rw-r--r--doc/html/resize.js93
-rw-r--r--doc/html/rhash-64.pngbin0 -> 3115 bytes
-rw-r--r--doc/html/rm-64.pngbin0 -> 5236 bytes
-rw-r--r--doc/html/rmagic_8php.html173
-rw-r--r--doc/html/rmagic_8php.js6
-rw-r--r--doc/html/rpost_8php.html141
-rw-r--r--doc/html/rpost_8php.js4
-rw-r--r--doc/html/rsd__xml_8php.html137
-rw-r--r--doc/html/rsd__xml_8php.js4
-rw-r--r--doc/html/search/all_24.html26
-rw-r--r--doc/html/search/all_24.js175
-rw-r--r--doc/html/search/all_5f.html26
-rw-r--r--doc/html/search/all_5f.js18
-rw-r--r--doc/html/search/all_61.html26
-rw-r--r--doc/html/search/all_61.js182
-rw-r--r--doc/html/search/all_62.html26
-rw-r--r--doc/html/search/all_62.js35
-rw-r--r--doc/html/search/all_63.html26
-rw-r--r--doc/html/search/all_63.js150
-rw-r--r--doc/html/search/all_64.html26
-rw-r--r--doc/html/search/all_64.js82
-rw-r--r--doc/html/search/all_65.html26
-rw-r--r--doc/html/search/all_65.js40
-rw-r--r--doc/html/search/all_66.html26
-rw-r--r--doc/html/search/all_66.js74
-rw-r--r--doc/html/search/all_67.html26
-rw-r--r--doc/html/search/all_67.js126
-rw-r--r--doc/html/search/all_68.html26
-rw-r--r--doc/html/search/all_68.js36
-rw-r--r--doc/html/search/all_69.html26
-rw-r--r--doc/html/search/all_69.js88
-rw-r--r--doc/html/search/all_6a.html26
-rw-r--r--doc/html/search/all_6a.js7
-rw-r--r--doc/html/search/all_6b.html26
-rw-r--r--doc/html/search/all_6b.js5
-rw-r--r--doc/html/search/all_6c.html26
-rw-r--r--doc/html/search/all_6c.js49
-rw-r--r--doc/html/search/all_6d.html26
-rw-r--r--doc/html/search/all_6d.js62
-rw-r--r--doc/html/search/all_6e.html26
-rw-r--r--doc/html/search/all_6e.js85
-rw-r--r--doc/html/search/all_6f.html26
-rw-r--r--doc/html/search/all_6f.js31
-rw-r--r--doc/html/search/all_70.html26
-rw-r--r--doc/html/search/all_70.js185
-rw-r--r--doc/html/search/all_71.html26
-rw-r--r--doc/html/search/all_71.js9
-rw-r--r--doc/html/search/all_72.html26
-rw-r--r--doc/html/search/all_72.js79
-rw-r--r--doc/html/search/all_73.html26
-rw-r--r--doc/html/search/all_73.js121
-rw-r--r--doc/html/search/all_74.html26
-rw-r--r--doc/html/search/all_74.js69
-rw-r--r--doc/html/search/all_75.html26
-rw-r--r--doc/html/search/all_75.js42
-rw-r--r--doc/html/search/all_76.html26
-rw-r--r--doc/html/search/all_76.js22
-rw-r--r--doc/html/search/all_77.html26
-rw-r--r--doc/html/search/all_77.js43
-rw-r--r--doc/html/search/all_78.html26
-rw-r--r--doc/html/search/all_78.js23
-rw-r--r--doc/html/search/all_7a.html26
-rw-r--r--doc/html/search/all_7a.js38
-rw-r--r--doc/html/search/classes_61.html26
-rw-r--r--doc/html/search/classes_61.js4
-rw-r--r--doc/html/search/classes_62.html26
-rw-r--r--doc/html/search/classes_62.js4
-rw-r--r--doc/html/search/classes_63.html26
-rw-r--r--doc/html/search/classes_63.js5
-rw-r--r--doc/html/search/classes_64.html26
-rw-r--r--doc/html/search/classes_64.js6
-rw-r--r--doc/html/search/classes_65.html26
-rw-r--r--doc/html/search/classes_65.js4
-rw-r--r--doc/html/search/classes_66.html26
-rw-r--r--doc/html/search/classes_66.js7
-rw-r--r--doc/html/search/classes_69.html26
-rw-r--r--doc/html/search/classes_69.js5
-rw-r--r--doc/html/search/classes_70.html26
-rw-r--r--doc/html/search/classes_70.js7
-rw-r--r--doc/html/search/classes_72.html26
-rw-r--r--doc/html/search/classes_72.js7
-rw-r--r--doc/html/search/classes_74.html26
-rw-r--r--doc/html/search/classes_74.js4
-rw-r--r--doc/html/search/classes_7a.html26
-rw-r--r--doc/html/search/classes_7a.js4
-rw-r--r--doc/html/search/close.pngbin0 -> 273 bytes
-rw-r--r--doc/html/search/files_5f.html26
-rw-r--r--doc/html/search/files_5f.js4
-rw-r--r--doc/html/search/files_61.html26
-rw-r--r--doc/html/search/files_61.js15
-rw-r--r--doc/html/search/files_62.html26
-rw-r--r--doc/html/search/files_62.js8
-rw-r--r--doc/html/search/files_63.html26
-rw-r--r--doc/html/search/files_63.js31
-rw-r--r--doc/html/search/files_64.html26
-rw-r--r--doc/html/search/files_64.js24
-rw-r--r--doc/html/search/files_65.html26
-rw-r--r--doc/html/search/files_65.js12
-rw-r--r--doc/html/search/files_66.html26
-rw-r--r--doc/html/search/files_66.js17
-rw-r--r--doc/html/search/files_67.html26
-rw-r--r--doc/html/search/files_67.js7
-rw-r--r--doc/html/search/files_68.html26
-rw-r--r--doc/html/search/files_68.js8
-rw-r--r--doc/html/search/files_69.html26
-rw-r--r--doc/html/search/files_69.js10
-rw-r--r--doc/html/search/files_6c.html26
-rw-r--r--doc/html/search/files_6c.js9
-rw-r--r--doc/html/search/files_6d.html26
-rw-r--r--doc/html/search/files_6d.js17
-rw-r--r--doc/html/search/files_6e.html26
-rw-r--r--doc/html/search/files_6e.js13
-rw-r--r--doc/html/search/files_6f.html26
-rw-r--r--doc/html/search/files_6f.js11
-rw-r--r--doc/html/search/files_70.html26
-rw-r--r--doc/html/search/files_70.js35
-rw-r--r--doc/html/search/files_71.html26
-rw-r--r--doc/html/search/files_71.js5
-rw-r--r--doc/html/search/files_72.html26
-rw-r--r--doc/html/search/files_72.js14
-rw-r--r--doc/html/search/files_73.html26
-rw-r--r--doc/html/search/files_73.js22
-rw-r--r--doc/html/search/files_74.html26
-rw-r--r--doc/html/search/files_74.js21
-rw-r--r--doc/html/search/files_75.html26
-rw-r--r--doc/html/search/files_75.js10
-rw-r--r--doc/html/search/files_76.html26
-rw-r--r--doc/html/search/files_76.js7
-rw-r--r--doc/html/search/files_77.html26
-rw-r--r--doc/html/search/files_77.js10
-rw-r--r--doc/html/search/files_78.html26
-rw-r--r--doc/html/search/files_78.js6
-rw-r--r--doc/html/search/files_7a.html26
-rw-r--r--doc/html/search/files_7a.js7
-rw-r--r--doc/html/search/functions_5f.html26
-rw-r--r--doc/html/search/functions_5f.js17
-rw-r--r--doc/html/search/functions_61.html26
-rw-r--r--doc/html/search/functions_61.js118
-rw-r--r--doc/html/search/functions_62.html26
-rw-r--r--doc/html/search/functions_62.js29
-rw-r--r--doc/html/search/functions_63.html26
-rw-r--r--doc/html/search/functions_63.js114
-rw-r--r--doc/html/search/functions_64.html26
-rw-r--r--doc/html/search/functions_64.js49
-rw-r--r--doc/html/search/functions_65.html26
-rw-r--r--doc/html/search/functions_65.js25
-rw-r--r--doc/html/search/functions_66.html26
-rw-r--r--doc/html/search/functions_66.js48
-rw-r--r--doc/html/search/functions_67.html26
-rw-r--r--doc/html/search/functions_67.js119
-rw-r--r--doc/html/search/functions_68.html26
-rw-r--r--doc/html/search/functions_68.js23
-rw-r--r--doc/html/search/functions_69.html26
-rw-r--r--doc/html/search/functions_69.js52
-rw-r--r--doc/html/search/functions_6a.html26
-rw-r--r--doc/html/search/functions_6a.js6
-rw-r--r--doc/html/search/functions_6b.html26
-rw-r--r--doc/html/search/functions_6b.js4
-rw-r--r--doc/html/search/functions_6c.html26
-rw-r--r--doc/html/search/functions_6c.js35
-rw-r--r--doc/html/search/functions_6d.html26
-rw-r--r--doc/html/search/functions_6d.js38
-rw-r--r--doc/html/search/functions_6e.html26
-rw-r--r--doc/html/search/functions_6e.js33
-rw-r--r--doc/html/search/functions_6f.html26
-rw-r--r--doc/html/search/functions_6f.js21
-rw-r--r--doc/html/search/functions_70.html26
-rw-r--r--doc/html/search/functions_70.js103
-rw-r--r--doc/html/search/functions_71.html26
-rw-r--r--doc/html/search/functions_71.js7
-rw-r--r--doc/html/search/functions_72.html26
-rw-r--r--doc/html/search/functions_72.js55
-rw-r--r--doc/html/search/functions_73.html26
-rw-r--r--doc/html/search/functions_73.js98
-rw-r--r--doc/html/search/functions_74.html26
-rw-r--r--doc/html/search/functions_74.js35
-rw-r--r--doc/html/search/functions_75.html26
-rw-r--r--doc/html/search/functions_75.js29
-rw-r--r--doc/html/search/functions_76.html26
-rw-r--r--doc/html/search/functions_76.js18
-rw-r--r--doc/html/search/functions_77.html26
-rw-r--r--doc/html/search/functions_77.js35
-rw-r--r--doc/html/search/functions_78.html26
-rw-r--r--doc/html/search/functions_78.js13
-rw-r--r--doc/html/search/functions_7a.html26
-rw-r--r--doc/html/search/functions_7a.js31
-rw-r--r--doc/html/search/mag_sel.pngbin0 -> 563 bytes
-rw-r--r--doc/html/search/namespaces_61.html26
-rw-r--r--doc/html/search/namespaces_61.js4
-rw-r--r--doc/html/search/namespaces_66.html26
-rw-r--r--doc/html/search/namespaces_66.js5
-rw-r--r--doc/html/search/namespaces_75.html26
-rw-r--r--doc/html/search/namespaces_75.js5
-rw-r--r--doc/html/search/nomatches.html12
-rw-r--r--doc/html/search/pages_61.html26
-rw-r--r--doc/html/search/pages_61.js4
-rw-r--r--doc/html/search/pages_63.html26
-rw-r--r--doc/html/search/pages_63.js4
-rw-r--r--doc/html/search/pages_66.html26
-rw-r--r--doc/html/search/pages_66.js4
-rw-r--r--doc/html/search/pages_72.html26
-rw-r--r--doc/html/search/pages_72.js4
-rw-r--r--doc/html/search/search.css271
-rw-r--r--doc/html/search/search.js807
-rw-r--r--doc/html/search/search_l.pngbin0 -> 604 bytes
-rw-r--r--doc/html/search/search_m.pngbin0 -> 158 bytes
-rw-r--r--doc/html/search/search_r.pngbin0 -> 612 bytes
-rw-r--r--doc/html/search/variables_24.html26
-rw-r--r--doc/html/search/variables_24.js175
-rw-r--r--doc/html/search/variables_61.html26
-rw-r--r--doc/html/search/variables_61.js52
-rw-r--r--doc/html/search/variables_63.html26
-rw-r--r--doc/html/search/variables_63.js9
-rw-r--r--doc/html/search/variables_64.html26
-rw-r--r--doc/html/search/variables_64.js12
-rw-r--r--doc/html/search/variables_65.html26
-rw-r--r--doc/html/search/variables_65.js8
-rw-r--r--doc/html/search/variables_66.html26
-rw-r--r--doc/html/search/variables_66.js8
-rw-r--r--doc/html/search/variables_67.html26
-rw-r--r--doc/html/search/variables_67.js6
-rw-r--r--doc/html/search/variables_68.html26
-rw-r--r--doc/html/search/variables_68.js11
-rw-r--r--doc/html/search/variables_69.html26
-rw-r--r--doc/html/search/variables_69.js30
-rw-r--r--doc/html/search/variables_6a.html26
-rw-r--r--doc/html/search/variables_6a.js4
-rw-r--r--doc/html/search/variables_6b.html26
-rw-r--r--doc/html/search/variables_6b.js4
-rw-r--r--doc/html/search/variables_6c.html26
-rw-r--r--doc/html/search/variables_6c.js11
-rw-r--r--doc/html/search/variables_6d.html26
-rw-r--r--doc/html/search/variables_6d.js13
-rw-r--r--doc/html/search/variables_6e.html26
-rw-r--r--doc/html/search/variables_6e.js45
-rw-r--r--doc/html/search/variables_6f.html26
-rw-r--r--doc/html/search/variables_6f.js5
-rw-r--r--doc/html/search/variables_70.html26
-rw-r--r--doc/html/search/variables_70.js49
-rw-r--r--doc/html/search/variables_72.html26
-rw-r--r--doc/html/search/variables_72.js12
-rw-r--r--doc/html/search/variables_73.html26
-rw-r--r--doc/html/search/variables_73.js7
-rw-r--r--doc/html/search/variables_74.html26
-rw-r--r--doc/html/search/variables_74.js18
-rw-r--r--doc/html/search/variables_75.html26
-rw-r--r--doc/html/search/variables_75.js7
-rw-r--r--doc/html/search/variables_77.html26
-rw-r--r--doc/html/search/variables_77.js4
-rw-r--r--doc/html/search/variables_78.html26
-rw-r--r--doc/html/search/variables_78.js10
-rw-r--r--doc/html/search/variables_7a.html26
-rw-r--r--doc/html/search/variables_7a.js5
-rw-r--r--doc/html/search_8php.html173
-rw-r--r--doc/html/search_8php.js5
-rw-r--r--doc/html/search__ac_8php.html137
-rw-r--r--doc/html/search__ac_8php.js4
-rw-r--r--doc/html/security_8php.html462
-rw-r--r--doc/html/security_8php.js15
-rw-r--r--doc/html/session_8php.html317
-rw-r--r--doc/html/session_8php.js13
-rw-r--r--doc/html/settings_8php.html175
-rw-r--r--doc/html/settings_8php.js6
-rw-r--r--doc/html/setup_8php.html499
-rw-r--r--doc/html/setup_8php.js20
-rw-r--r--doc/html/share_8php.html137
-rw-r--r--doc/html/share_8php.js4
-rw-r--r--doc/html/siteinfo_8php.html155
-rw-r--r--doc/html/siteinfo_8php.js5
-rw-r--r--doc/html/sitelist_8php.html137
-rw-r--r--doc/html/sitelist_8php.js4
-rw-r--r--doc/html/smilies_8php.html137
-rw-r--r--doc/html/smilies_8php.js4
-rw-r--r--doc/html/socgraph_8php.html430
-rw-r--r--doc/html/socgraph_8php.js12
-rw-r--r--doc/html/sources_8php.html155
-rw-r--r--doc/html/sources_8php.js5
-rw-r--r--doc/html/sslify_8php.html137
-rw-r--r--doc/html/sslify_8php.js4
-rw-r--r--doc/html/starred_8php.html137
-rw-r--r--doc/html/starred_8php.js4
-rw-r--r--doc/html/style_8php.html378
-rw-r--r--doc/html/style_8php.js20
-rw-r--r--doc/html/subthread_8php.html137
-rw-r--r--doc/html/subthread_8php.js4
-rw-r--r--doc/html/suggest_8php.html155
-rw-r--r--doc/html/suggest_8php.js5
-rw-r--r--doc/html/sync_off.pngbin0 -> 853 bytes
-rw-r--r--doc/html/sync_on.pngbin0 -> 845 bytes
-rw-r--r--doc/html/system__unavailable_8php.html138
-rw-r--r--doc/html/system__unavailable_8php.js4
-rw-r--r--doc/html/tab_a.pngbin0 -> 142 bytes
-rw-r--r--doc/html/tab_b.pngbin0 -> 169 bytes
-rw-r--r--doc/html/tab_h.pngbin0 -> 177 bytes
-rw-r--r--doc/html/tab_s.pngbin0 -> 184 bytes
-rw-r--r--doc/html/tabs.css60
-rw-r--r--doc/html/tagger_8php.html137
-rw-r--r--doc/html/tagger_8php.js4
-rw-r--r--doc/html/tagrm_8php.html155
-rw-r--r--doc/html/tagrm_8php.js5
-rw-r--r--doc/html/taxonomy_8php.html591
-rw-r--r--doc/html/taxonomy_8php.js18
-rw-r--r--doc/html/template__processor_8php.html184
-rw-r--r--doc/html/template__processor_8php.js7
-rw-r--r--doc/html/test_2php_2theme_8php.html166
-rw-r--r--doc/html/test_2php_2theme_8php.js5
-rw-r--r--doc/html/test_8php.html147
-rw-r--r--doc/html/test_8php.js4
-rw-r--r--doc/html/text_8php.html2306
-rw-r--r--doc/html/text_8php.js93
-rw-r--r--doc/html/theme_2apw_2schema_2default_8php.html112
-rw-r--r--doc/html/theme_2blogga_2php_2default_8php.html165
-rw-r--r--doc/html/theme_2blogga_2php_2default_8php.js6
-rw-r--r--doc/html/theme_2blogga_2php_2theme__init_8php.html112
-rw-r--r--doc/html/theme_2blogga_2view_2theme_2blog_2default_8php.html161
-rw-r--r--doc/html/theme_2blogga_2view_2theme_2blog_2default_8php.js6
-rw-r--r--doc/html/theme_2redbasic_2php_2theme__init_8php.html112
-rw-r--r--doc/html/theme_2redstrap_2php_2default_8php.html133
-rw-r--r--doc/html/theme_2redstrap_2php_2default_8php.js4
-rw-r--r--doc/html/theme_2redstrap_2php_2theme__init_8php.html112
-rw-r--r--doc/html/theme_8php.html137
-rw-r--r--doc/html/theme_8php.js4
-rw-r--r--doc/html/theme__init_8php.html136
-rw-r--r--doc/html/theme__init_8php.js4
-rw-r--r--doc/html/thing_8php.html159
-rw-r--r--doc/html/thing_8php.js5
-rw-r--r--doc/html/toggle__mobile_8php.html137
-rw-r--r--doc/html/toggle__mobile_8php.js4
-rw-r--r--doc/html/toggle__safesearch_8php.html137
-rw-r--r--doc/html/toggle__safesearch_8php.js4
-rw-r--r--doc/html/tpldebug_8php.html174
-rw-r--r--doc/html/tpldebug_8php.js6
-rw-r--r--doc/html/typo_8php.html193
-rw-r--r--doc/html/typo_8php.js8
-rw-r--r--doc/html/typohelper_8php.html153
-rw-r--r--doc/html/typohelper_8php.js5
-rw-r--r--doc/html/uexport_8php.html137
-rw-r--r--doc/html/uexport_8php.js4
-rw-r--r--doc/html/update__channel_8php.html141
-rw-r--r--doc/html/update__channel_8php.js4
-rw-r--r--doc/html/update__community_8php.html137
-rw-r--r--doc/html/update__community_8php.js4
-rw-r--r--doc/html/update__display_8php.html137
-rw-r--r--doc/html/update__display_8php.js4
-rw-r--r--doc/html/update__network_8php.html137
-rw-r--r--doc/html/update__network_8php.js4
-rw-r--r--doc/html/update__search_8php.html141
-rw-r--r--doc/html/update__search_8php.js4
-rw-r--r--doc/html/updatetpl_8py.html140
-rw-r--r--doc/html/updatetpl_8py.js9
-rw-r--r--doc/html/view_2theme_2apw_2php_2config_8php.html362
-rw-r--r--doc/html/view_2theme_2apw_2php_2config_8php.js6
-rw-r--r--doc/html/view_2theme_2blogga_2php_2config_8php.html232
-rw-r--r--doc/html/view_2theme_2blogga_2php_2config_8php.js8
-rw-r--r--doc/html/view_2theme_2blogga_2view_2theme_2blog_2config_8php.html226
-rw-r--r--doc/html/view_2theme_2blogga_2view_2theme_2blog_2config_8php.js8
-rw-r--r--doc/html/view_2theme_2redbasic_2php_2config_8php.html185
-rw-r--r--doc/html/view_2theme_2redbasic_2php_2config_8php.js6
-rw-r--r--doc/html/view_2theme_2redstrap_2php_2config_8php.html238
-rw-r--r--doc/html/view_2theme_2redstrap_2php_2config_8php.js6
-rw-r--r--doc/html/view_8php.html138
-rw-r--r--doc/html/view_8php.js4
-rw-r--r--doc/html/viewconnections_8php.html155
-rw-r--r--doc/html/viewconnections_8php.js5
-rw-r--r--doc/html/viewsrc_8php.html137
-rw-r--r--doc/html/viewsrc_8php.js4
-rw-r--r--doc/html/vote_8php.html173
-rw-r--r--doc/html/vote_8php.js6
-rw-r--r--doc/html/wall__attach_8php.html137
-rw-r--r--doc/html/wall__attach_8php.js4
-rw-r--r--doc/html/wall__upload_8php.html139
-rw-r--r--doc/html/wall__upload_8php.js4
-rw-r--r--doc/html/webfinger_8php.html137
-rw-r--r--doc/html/webfinger_8php.js4
-rw-r--r--doc/html/webpages_8php.html137
-rw-r--r--doc/html/webpages_8php.js4
-rw-r--r--doc/html/wfinger_8php.html139
-rw-r--r--doc/html/wfinger_8php.js4
-rw-r--r--doc/html/widedarkness_8php.html112
-rw-r--r--doc/html/widgets_8php.html534
-rw-r--r--doc/html/widgets_8php.js26
-rw-r--r--doc/html/xchan_8php.html137
-rw-r--r--doc/html/xchan_8php.js4
-rw-r--r--doc/html/xrd_8php.html137
-rw-r--r--doc/html/xrd_8php.js4
-rw-r--r--doc/html/xref_8php.html137
-rw-r--r--doc/html/xref_8php.js4
-rw-r--r--doc/html/zfinger_8php.html141
-rw-r--r--doc/html/zfinger_8php.js4
-rw-r--r--doc/html/zot_8php.html1101
-rw-r--r--doc/html/zot_8php.js31
-rw-r--r--doc/html/zotfeed_8php.html137
-rw-r--r--doc/html/zotfeed_8php.js4
-rw-r--r--doc/html/zperms_8php.html138
-rw-r--r--doc/html/zperms_8php.js4
-rw-r--r--doc/html/zping_8php.html137
-rw-r--r--doc/html/zping_8php.js4
-rw-r--r--doc/install/sample-lighttpd.conf85
-rw-r--r--doc/install/sample-nginx.conf127
-rw-r--r--doc/makingnewfriends.md11
-rw-r--r--doc/network.md9
-rw-r--r--doc/peopleyouknow.md13
-rw-r--r--done175
-rw-r--r--images/default-profile-mm.jpgbin322 -> 0 bytes
-rw-r--r--images/default-profile-sm.jpgbin346 -> 0 bytes
-rw-r--r--images/default-profile.jpgbin490 -> 0 bytes
-rw-r--r--images/default_profile_photos/blank/175.jpgbin0 -> 910 bytes
-rw-r--r--images/default_profile_photos/blank/48.jpgbin0 -> 566 bytes
-rw-r--r--images/default_profile_photos/blank/80.jpgbin0 -> 614 bytes
-rw-r--r--images/default_profile_photos/rainbow_man/175.jpg (renamed from images/person-175.jpg)bin8510 -> 8510 bytes
-rw-r--r--images/default_profile_photos/rainbow_man/48.jpg (renamed from images/person-48.jpg)bin1274 -> 1274 bytes
-rw-r--r--images/default_profile_photos/rainbow_man/80.jpg (renamed from images/person-80.jpg)bin2303 -> 2303 bytes
-rw-r--r--images/default_profile_photos/red_koala/175.jpgbin0 -> 22969 bytes
-rw-r--r--images/default_profile_photos/red_koala/48.jpgbin0 -> 4856 bytes
-rw-r--r--images/default_profile_photos/red_koala/80.jpgbin0 -> 9105 bytes
-rw-r--r--images/diaspora.pngbin461 -> 0 bytes
-rw-r--r--images/friendica-128.jpgbin8368 -> 0 bytes
-rw-r--r--images/friendica-128.pngbin6453 -> 0 bytes
-rw-r--r--images/friendica-16.jpgbin659 -> 0 bytes
-rw-r--r--images/friendica-16.pngbin756 -> 0 bytes
-rw-r--r--images/friendica-1600.pngbin286517 -> 0 bytes
-rw-r--r--images/friendica-256.jpgbin17130 -> 0 bytes
-rw-r--r--images/friendica-256.pngbin10273 -> 0 bytes
-rw-r--r--images/friendica-32.jpgbin1541 -> 0 bytes
-rw-r--r--images/friendica-32.pngbin1593 -> 0 bytes
-rw-r--r--images/friendica-48.pngbin2404 -> 0 bytes
-rw-r--r--images/friendica-64.jpgbin3450 -> 0 bytes
-rw-r--r--images/friendica-64.pngbin3250 -> 0 bytes
-rw-r--r--images/friendica-96.pngbin5484 -> 0 bytes
-rw-r--r--images/friendica-red.svg240
-rw-r--r--images/friendica-red.xcfbin87425 -> 0 bytes
-rw-r--r--images/friendica.svg240
-rw-r--r--images/friendika-128.jpgbin8368 -> 0 bytes
-rw-r--r--images/friendika-128.pngbin6453 -> 0 bytes
-rw-r--r--images/friendika-16.jpgbin659 -> 0 bytes
-rw-r--r--images/friendika-16.pngbin756 -> 0 bytes
-rw-r--r--images/friendika-1600.pngbin286517 -> 0 bytes
-rw-r--r--images/friendika-256.jpgbin17130 -> 0 bytes
-rw-r--r--images/friendika-256.pngbin10273 -> 0 bytes
-rw-r--r--images/friendika-32.jpgbin1541 -> 0 bytes
-rw-r--r--images/friendika-32.pngbin1593 -> 0 bytes
-rw-r--r--images/friendika-48.pngbin2404 -> 0 bytes
-rw-r--r--images/friendika-64.jpgbin3450 -> 0 bytes
-rw-r--r--images/friendika-64.pngbin3250 -> 0 bytes
-rw-r--r--images/friendika-96.pngbin5484 -> 0 bytes
-rw-r--r--images/friendika.svg240
-rw-r--r--images/nosign.pngbin0 -> 17512 bytes
-rw-r--r--images/r!-64.pngbin0 -> 2945 bytes
-rw-r--r--images/r!.pngbin0 -> 1439 bytes
-rw-r--r--images/r!.xcfbin0 -> 85093 bytes
-rw-r--r--images/red_antiprism.pngbin0 -> 120847 bytes
-rw-r--r--images/red_antiprism.xcfbin0 -> 659160 bytes
-rw-r--r--images/rhash-16.pngbin0 -> 679 bytes
-rw-r--r--images/rhash-32.pngbin0 -> 1322 bytes
-rw-r--r--images/rhash-64.pngbin0 -> 3115 bytes
-rw-r--r--images/rhash.xcfbin0 -> 94324 bytes
-rw-r--r--images/rm-16.pngbin0 -> 949 bytes
-rw-r--r--images/rm-32.pngbin0 -> 2451 bytes
-rw-r--r--images/rm-64.pngbin0 -> 5236 bytes
-rw-r--r--images/rm300.pngbin0 -> 6426 bytes
-rw-r--r--include/BaseObject.php2
-rw-r--r--include/Contact.php329
-rw-r--r--include/ConversationObject.php84
-rwxr-xr-xinclude/ITemplateEngine.php11
-rw-r--r--include/ItemObject.php203
-rw-r--r--include/Photo.php768
-rw-r--r--include/ProtoDriver.php2
-rw-r--r--include/Scrape.php712
-rw-r--r--include/account.php24
-rw-r--r--include/acl_selectors.php61
-rw-r--r--include/activities.php11
-rw-r--r--include/api.php191
-rw-r--r--include/attach.php388
-rw-r--r--include/auth.php52
-rw-r--r--include/bb2diaspora.php2
-rw-r--r--include/bbcode.php475
-rw-r--r--include/cache.php2
-rw-r--r--include/cli_startup.php9
-rw-r--r--include/cli_suggest.php22
-rw-r--r--include/comanche.php180
-rw-r--r--include/config.php356
-rw-r--r--include/contact_selectors.php18
-rw-r--r--include/contact_widgets.php35
-rw-r--r--include/conversation.php612
-rw-r--r--include/cronhooks.php2
-rw-r--r--include/crypto.php195
-rw-r--r--include/datetime.php63
-rw-r--r--include/dba.php289
-rwxr-xr-xinclude/dba/dba_driver.php167
-rwxr-xr-xinclude/dba/dba_mysql.php63
-rwxr-xr-xinclude/dba/dba_mysqli.php76
-rw-r--r--include/deliver.php16
-rw-r--r--include/dir_fns.php179
-rw-r--r--include/directory.php57
-rw-r--r--include/enotify.php208
-rw-r--r--include/event.php107
-rw-r--r--include/expire.php2
-rw-r--r--include/fcontact.php41
-rw-r--r--include/features.php20
-rw-r--r--include/follow.php79
-rwxr-xr-x[-rw-r--r--]include/friendica_smarty.php83
-rw-r--r--include/gprobe.php2
-rw-r--r--include/group.php87
-rw-r--r--include/html2bbcode.php2
-rw-r--r--include/html2plain.php4
-rw-r--r--include/identity.php925
-rw-r--r--include/iquery.php139
-rwxr-xr-xinclude/items.php3661
-rw-r--r--include/js_strings.php18
-rw-r--r--include/language.php66
-rw-r--r--include/menu.php306
-rw-r--r--include/message.php180
-rw-r--r--include/nav.php52
-rw-r--r--include/network.php703
-rw-r--r--include/notifier.php199
-rw-r--r--include/notify.php2
-rw-r--r--include/oauth.php74
-rwxr-xr-xinclude/oembed.php25
-rw-r--r--include/onedirsync.php61
-rw-r--r--include/onepoll.php34
-rw-r--r--include/page_widgets.php39
-rw-r--r--include/permissions.php53
-rw-r--r--include/photo/photo_driver.php668
-rw-r--r--include/photo/photo_gd.php140
-rw-r--r--include/photo/photo_imagick.php177
-rw-r--r--include/photos.php132
-rwxr-xr-x[-rw-r--r--]include/plugin.php277
-rw-r--r--include/poller.php237
-rw-r--r--include/profile_advanced.php90
-rw-r--r--include/profile_selectors.php2
-rw-r--r--include/queue.php6
-rw-r--r--include/queue_fn.php2
-rw-r--r--include/reddav.php991
-rw-r--r--include/security.php142
-rw-r--r--include/session.php45
-rw-r--r--include/socgraph.php179
-rw-r--r--include/system_unavailable.php2
-rw-r--r--include/taxonomy.php341
-rwxr-xr-x[-rw-r--r--]include/template_processor.php28
-rwxr-xr-x[-rw-r--r--]include/text.php1191
-rw-r--r--include/widgets.php577
-rw-r--r--include/zot.php1457
-rwxr-xr-x[-rw-r--r--]index.php39
-rw-r--r--install/INSTALL.txt157
-rw-r--r--install/database.sql360
-rwxr-xr-x[-rw-r--r--]install/htconfig.sample.php56
-rw-r--r--install/update.php619
-rw-r--r--js/acl.js258
-rw-r--r--js/ajaxupload.js695
-rw-r--r--js/fk.autocomplete.js194
-rw-r--r--js/jquery.js4
-rw-r--r--js/main.js954
-rw-r--r--library/IXR_Library.php1371
-rw-r--r--library/OAuth1.php13
-rwxr-xr-xlibrary/bootstrap-datetimepicker/css/bootstrap-datetimepicker.css174
-rwxr-xr-xlibrary/bootstrap-datetimepicker/css/bootstrap-datetimepicker.min.css8
-rwxr-xr-xlibrary/bootstrap-datetimepicker/js/bootstrap-datetimepicker.min.js28
-rw-r--r--library/bootstrap-datetimepicker/js/moment.js7063
-rw-r--r--library/bootstrap/css/bootstrap-theme.css397
-rw-r--r--library/bootstrap/css/bootstrap-theme.min.css7
-rw-r--r--library/bootstrap/css/bootstrap.css7118
-rw-r--r--library/bootstrap/css/bootstrap.min.css7
-rw-r--r--library/bootstrap/fonts/glyphicons-halflings-regular.eotbin0 -> 20290 bytes
-rw-r--r--library/bootstrap/fonts/glyphicons-halflings-regular.svg229
-rw-r--r--library/bootstrap/fonts/glyphicons-halflings-regular.ttfbin0 -> 41236 bytes
-rw-r--r--library/bootstrap/fonts/glyphicons-halflings-regular.woffbin0 -> 23292 bytes
-rw-r--r--library/bootstrap/js/bootbox.min.js6
-rw-r--r--library/bootstrap/js/bootstrap.js2006
-rw-r--r--library/bootstrap/js/bootstrap.min.js7
-rw-r--r--library/colorbox/README.md376
-rw-r--r--library/colorbox/colorbox.ai1811
-rw-r--r--library/colorbox/colorbox.css52
-rw-r--r--library/colorbox/colorbox.jquery.json30
-rw-r--r--library/colorbox/component.json8
-rw-r--r--library/colorbox/content/ajax.html11
-rw-r--r--library/colorbox/content/homer.jpgbin0 -> 8917 bytes
-rw-r--r--library/colorbox/content/marylou.jpgbin0 -> 55125 bytes
-rw-r--r--library/colorbox/content/ohoopee1.jpgbin0 -> 74827 bytes
-rw-r--r--library/colorbox/content/ohoopee2.jpgbin0 -> 117411 bytes
-rw-r--r--library/colorbox/content/ohoopee3.jpgbin0 -> 71514 bytes
-rw-r--r--library/colorbox/example1/colorbox.css86
-rw-r--r--library/colorbox/example1/images/border.pngbin0 -> 112 bytes
-rw-r--r--library/colorbox/example1/images/controls.pngbin0 -> 2893 bytes
-rw-r--r--library/colorbox/example1/images/ie6/borderBottomCenter.pngbin0 -> 111 bytes
-rw-r--r--library/colorbox/example1/images/ie6/borderBottomLeft.pngbin0 -> 215 bytes
-rw-r--r--library/colorbox/example1/images/ie6/borderBottomRight.pngbin0 -> 217 bytes
-rw-r--r--library/colorbox/example1/images/ie6/borderMiddleLeft.pngbin0 -> 108 bytes
-rw-r--r--library/colorbox/example1/images/ie6/borderMiddleRight.pngbin0 -> 108 bytes
-rw-r--r--library/colorbox/example1/images/ie6/borderTopCenter.pngbin0 -> 111 bytes
-rw-r--r--library/colorbox/example1/images/ie6/borderTopLeft.pngbin0 -> 216 bytes
-rw-r--r--library/colorbox/example1/images/ie6/borderTopRight.pngbin0 -> 214 bytes
-rw-r--r--library/colorbox/example1/images/loading.gifbin0 -> 9427 bytes
-rw-r--r--library/colorbox/example1/images/loading_background.pngbin0 -> 157 bytes
-rw-r--r--library/colorbox/example1/images/overlay.pngbin0 -> 182 bytes
-rw-r--r--library/colorbox/example1/index.html87
-rw-r--r--library/colorbox/example2/colorbox.css43
-rw-r--r--library/colorbox/example2/images/controls.pngbin0 -> 570 bytes
-rw-r--r--library/colorbox/example2/images/loading.gifbin0 -> 9427 bytes
-rw-r--r--library/colorbox/example2/index.html87
-rw-r--r--library/colorbox/example3/colorbox.css38
-rw-r--r--library/colorbox/example3/images/controls.pngbin0 -> 1633 bytes
-rw-r--r--library/colorbox/example3/images/loading.gifbin0 -> 9427 bytes
-rw-r--r--library/colorbox/example3/index.html87
-rw-r--r--library/colorbox/example4/colorbox.css82
-rw-r--r--library/colorbox/example4/images/border1.pngbin0 -> 1057 bytes
-rw-r--r--library/colorbox/example4/images/border2.pngbin0 -> 170 bytes
-rw-r--r--library/colorbox/example4/images/ie6/borderBottomCenter.pngbin0 -> 153 bytes
-rw-r--r--library/colorbox/example4/images/ie6/borderBottomLeft.pngbin0 -> 473 bytes
-rw-r--r--library/colorbox/example4/images/ie6/borderBottomRight.pngbin0 -> 470 bytes
-rw-r--r--library/colorbox/example4/images/ie6/borderMiddleLeft.pngbin0 -> 148 bytes
-rw-r--r--library/colorbox/example4/images/ie6/borderMiddleRight.pngbin0 -> 139 bytes
-rw-r--r--library/colorbox/example4/images/ie6/borderTopCenter.pngbin0 -> 153 bytes
-rw-r--r--library/colorbox/example4/images/ie6/borderTopLeft.pngbin0 -> 359 bytes
-rw-r--r--library/colorbox/example4/images/ie6/borderTopRight.pngbin0 -> 465 bytes
-rw-r--r--library/colorbox/example4/images/loading.gifbin0 -> 9427 bytes
-rw-r--r--library/colorbox/example4/index.html87
-rw-r--r--library/colorbox/example5/colorbox.css52
-rw-r--r--library/colorbox/example5/images/border.pngbin0 -> 163 bytes
-rw-r--r--library/colorbox/example5/images/controls.pngbin0 -> 2033 bytes
-rw-r--r--library/colorbox/example5/images/loading.gifbin0 -> 9427 bytes
-rw-r--r--library/colorbox/example5/images/loading_background.pngbin0 -> 166 bytes
-rw-r--r--library/colorbox/example5/index.html87
-rw-r--r--library/colorbox/i18n/jquery.colorbox-cs.js14
-rw-r--r--library/colorbox/i18n/jquery.colorbox-da.js14
-rw-r--r--library/colorbox/i18n/jquery.colorbox-de.js13
-rw-r--r--library/colorbox/i18n/jquery.colorbox-es.js13
-rw-r--r--library/colorbox/i18n/jquery.colorbox-fr.js14
-rw-r--r--library/colorbox/i18n/jquery.colorbox-it.js13
-rw-r--r--library/colorbox/i18n/jquery.colorbox-ru.js14
-rw-r--r--library/colorbox/images/border.pngbin0 -> 163 bytes
-rw-r--r--library/colorbox/images/controls.pngbin0 -> 2033 bytes
-rw-r--r--library/colorbox/images/loading.gifbin0 -> 9427 bytes
-rw-r--r--library/colorbox/images/loading_background.pngbin0 -> 166 bytes
-rw-r--r--library/colorbox/jquery.colorbox-min.js1
-rw-r--r--library/colorbox/jquery.colorbox.js975
-rw-r--r--library/colorpicker/css/colorpicker.css161
-rw-r--r--library/colorpicker/css/layout.css218
-rw-r--r--library/colorpicker/images/blank.gifbin0 -> 49 bytes
-rw-r--r--library/colorpicker/images/colorpicker_background.pngbin0 -> 1897 bytes
-rw-r--r--library/colorpicker/images/colorpicker_hex.pngbin0 -> 532 bytes
-rw-r--r--library/colorpicker/images/colorpicker_hsb_b.pngbin0 -> 970 bytes
-rw-r--r--library/colorpicker/images/colorpicker_hsb_h.pngbin0 -> 1012 bytes
-rw-r--r--library/colorpicker/images/colorpicker_hsb_s.pngbin0 -> 1171 bytes
-rw-r--r--library/colorpicker/images/colorpicker_indic.gifbin0 -> 86 bytes
-rw-r--r--library/colorpicker/images/colorpicker_overlay.pngbin0 -> 10355 bytes
-rw-r--r--library/colorpicker/images/colorpicker_rgb_b.pngbin0 -> 970 bytes
-rw-r--r--library/colorpicker/images/colorpicker_rgb_g.pngbin0 -> 1069 bytes
-rw-r--r--library/colorpicker/images/colorpicker_rgb_r.pngbin0 -> 1066 bytes
-rw-r--r--library/colorpicker/images/colorpicker_select.gifbin0 -> 78 bytes
-rw-r--r--library/colorpicker/images/colorpicker_submit.pngbin0 -> 984 bytes
-rw-r--r--library/colorpicker/images/custom_background.pngbin0 -> 1916 bytes
-rw-r--r--library/colorpicker/images/custom_hex.pngbin0 -> 562 bytes
-rw-r--r--library/colorpicker/images/custom_hsb_b.pngbin0 -> 1097 bytes
-rw-r--r--library/colorpicker/images/custom_hsb_h.pngbin0 -> 970 bytes
-rw-r--r--library/colorpicker/images/custom_hsb_s.pngbin0 -> 1168 bytes
-rw-r--r--library/colorpicker/images/custom_indic.gifbin0 -> 86 bytes
-rw-r--r--library/colorpicker/images/custom_rgb_b.pngbin0 -> 1008 bytes
-rw-r--r--library/colorpicker/images/custom_rgb_g.pngbin0 -> 1069 bytes
-rw-r--r--library/colorpicker/images/custom_rgb_r.pngbin0 -> 1018 bytes
-rw-r--r--library/colorpicker/images/custom_submit.pngbin0 -> 997 bytes
-rw-r--r--library/colorpicker/images/select.pngbin0 -> 506 bytes
-rw-r--r--library/colorpicker/images/select2.pngbin0 -> 518 bytes
-rw-r--r--library/colorpicker/images/slider.pngbin0 -> 315 bytes
-rw-r--r--library/colorpicker/index.html184
-rw-r--r--library/colorpicker/js/colorpicker.js484
-rw-r--r--library/colorpicker/js/eye.js34
-rw-r--r--library/colorpicker/js/layout.js67
-rw-r--r--library/colorpicker/js/utils.js252
-rw-r--r--library/cryptojs/README1
-rw-r--r--library/cryptojs/components/aes-min.js10
-rw-r--r--library/cryptojs/components/aes.js213
-rw-r--r--library/cryptojs/components/cipher-core-min.js14
-rw-r--r--library/cryptojs/components/cipher-core.js863
-rw-r--r--library/cryptojs/components/core-min.js13
-rw-r--r--library/cryptojs/components/core.js712
-rw-r--r--library/cryptojs/components/enc-base64-min.js8
-rw-r--r--library/cryptojs/components/enc-base64.js109
-rw-r--r--library/cryptojs/components/enc-utf16-min.js8
-rw-r--r--library/cryptojs/components/enc-utf16.js135
-rw-r--r--library/cryptojs/components/evpkdf-min.js8
-rw-r--r--library/cryptojs/components/evpkdf.js118
-rw-r--r--library/cryptojs/components/format-hex-min.js7
-rw-r--r--library/cryptojs/components/format-hex.js52
-rw-r--r--library/cryptojs/components/hmac-min.js8
-rw-r--r--library/cryptojs/components/hmac.js131
-rw-r--r--library/cryptojs/components/lib-typedarrays-min.js8
-rw-r--r--library/cryptojs/components/lib-typedarrays.js62
-rw-r--r--library/cryptojs/components/md5-min.js12
-rw-r--r--library/cryptojs/components/md5.js254
-rw-r--r--library/cryptojs/components/mode-cfb-min.js7
-rw-r--r--library/cryptojs/components/mode-cfb.js64
-rw-r--r--library/cryptojs/components/mode-ctr-gladman-min.js14
-rw-r--r--library/cryptojs/components/mode-ctr-gladman.js102
-rw-r--r--library/cryptojs/components/mode-ctr-min.js7
-rw-r--r--library/cryptojs/components/mode-ctr.js44
-rw-r--r--library/cryptojs/components/mode-ecb-min.js7
-rw-r--r--library/cryptojs/components/mode-ecb.js26
-rw-r--r--library/cryptojs/components/mode-ofb-min.js7
-rw-r--r--library/cryptojs/components/mode-ofb.js40
-rw-r--r--library/cryptojs/components/pad-ansix923-min.js7
-rw-r--r--library/cryptojs/components/pad-ansix923.js35
-rw-r--r--library/cryptojs/components/pad-iso10126-min.js7
-rw-r--r--library/cryptojs/components/pad-iso10126.js30
-rw-r--r--library/cryptojs/components/pad-iso97971-min.js7
-rw-r--r--library/cryptojs/components/pad-iso97971.js26
-rw-r--r--library/cryptojs/components/pad-nopadding-min.js7
-rw-r--r--library/cryptojs/components/pad-nopadding.js16
-rw-r--r--library/cryptojs/components/pad-zeropadding-min.js7
-rw-r--r--library/cryptojs/components/pad-zeropadding.js31
-rw-r--r--library/cryptojs/components/pbkdf2-min.js8
-rw-r--r--library/cryptojs/components/pbkdf2.js131
-rw-r--r--library/cryptojs/components/rabbit-legacy-min.js11
-rw-r--r--library/cryptojs/components/rabbit-legacy.js176
-rw-r--r--library/cryptojs/components/rabbit-min.js11
-rw-r--r--library/cryptojs/components/rabbit.js178
-rw-r--r--library/cryptojs/components/rc4-min.js8
-rw-r--r--library/cryptojs/components/rc4.js125
-rw-r--r--library/cryptojs/components/ripemd160-min.js22
-rw-r--r--library/cryptojs/components/ripemd160.js253
-rw-r--r--library/cryptojs/components/sha1-min.js8
-rw-r--r--library/cryptojs/components/sha1.js136
-rw-r--r--library/cryptojs/components/sha224-min.js7
-rw-r--r--library/cryptojs/components/sha224.js66
-rw-r--r--library/cryptojs/components/sha256-min.js9
-rw-r--r--library/cryptojs/components/sha256.js185
-rw-r--r--library/cryptojs/components/sha3-min.js11
-rw-r--r--library/cryptojs/components/sha3.js309
-rw-r--r--library/cryptojs/components/sha384-min.js8
-rw-r--r--library/cryptojs/components/sha384.js69
-rw-r--r--library/cryptojs/components/sha512-min.js15
-rw-r--r--library/cryptojs/components/sha512.js309
-rw-r--r--library/cryptojs/components/tripledes-min.js26
-rw-r--r--library/cryptojs/components/tripledes.js756
-rw-r--r--library/cryptojs/components/x64-core-min.js7
-rw-r--r--library/cryptojs/components/x64-core.js290
-rw-r--r--library/cryptojs/rollups/aes.js35
-rw-r--r--library/cryptojs/rollups/hmac-md5.js21
-rw-r--r--library/cryptojs/rollups/hmac-ripemd160.js31
-rw-r--r--library/cryptojs/rollups/hmac-sha1.js17
-rw-r--r--library/cryptojs/rollups/hmac-sha224.js19
-rw-r--r--library/cryptojs/rollups/hmac-sha256.js18
-rw-r--r--library/cryptojs/rollups/hmac-sha3.js21
-rw-r--r--library/cryptojs/rollups/hmac-sha384.js27
-rw-r--r--library/cryptojs/rollups/hmac-sha512.js25
-rw-r--r--library/cryptojs/rollups/md5.js19
-rw-r--r--library/cryptojs/rollups/pbkdf2.js19
-rw-r--r--library/cryptojs/rollups/rabbit-legacy.js36
-rw-r--r--library/cryptojs/rollups/rabbit.js36
-rw-r--r--library/cryptojs/rollups/rc4.js33
-rw-r--r--library/cryptojs/rollups/ripemd160.js29
-rw-r--r--library/cryptojs/rollups/sha1.js15
-rw-r--r--library/cryptojs/rollups/sha224.js17
-rw-r--r--library/cryptojs/rollups/sha256.js16
-rw-r--r--library/cryptojs/rollups/sha3.js19
-rw-r--r--library/cryptojs/rollups/sha384.js25
-rw-r--r--library/cryptojs/rollups/sha512.js23
-rw-r--r--library/cryptojs/rollups/tripledes.js51
-rw-r--r--library/fancybox/jquery.fancybox-1.3.4.js5
-rw-r--r--library/font_awesome/.gitignore30
-rw-r--r--library/font_awesome/.ruby-version1
-rw-r--r--library/font_awesome/CONTRIBUTING.md75
-rw-r--r--library/font_awesome/Gemfile4
-rw-r--r--library/font_awesome/Gemfile.lock46
-rw-r--r--library/font_awesome/README.md62
-rw-r--r--library/font_awesome/_config.yml54
-rw-r--r--library/font_awesome/composer.json27
-rw-r--r--library/font_awesome/css/font-awesome-ie7.css1203
-rw-r--r--library/font_awesome/css/font-awesome-ie7.min.css384
-rw-r--r--library/font_awesome/css/font-awesome.css1479
-rw-r--r--library/font_awesome/css/font-awesome.min.css403
-rw-r--r--library/font_awesome/font/FontAwesome.otfbin0 -> 61896 bytes
-rwxr-xr-xlibrary/font_awesome/font/fontawesome-webfont.eotbin0 -> 37405 bytes
-rwxr-xr-xlibrary/font_awesome/font/fontawesome-webfont.svg399
-rwxr-xr-xlibrary/font_awesome/font/fontawesome-webfont.ttfbin0 -> 79076 bytes
-rwxr-xr-xlibrary/font_awesome/font/fontawesome-webfont.woffbin0 -> 43572 bytes
-rw-r--r--library/font_awesome/less/bootstrap.less84
-rw-r--r--library/font_awesome/less/core.less129
-rw-r--r--library/font_awesome/less/extras.less93
-rw-r--r--library/font_awesome/less/font-awesome-ie7.less1953
-rw-r--r--library/font_awesome/less/font-awesome.less33
-rw-r--r--library/font_awesome/less/icons.less381
-rw-r--r--library/font_awesome/less/mixins.less48
-rw-r--r--library/font_awesome/less/path.less14
-rw-r--r--library/font_awesome/less/variables.less735
-rw-r--r--library/font_awesome/package.json44
-rw-r--r--library/font_awesome/scss/_bootstrap.scss84
-rw-r--r--library/font_awesome/scss/_core.scss129
-rw-r--r--library/font_awesome/scss/_extras.scss93
-rw-r--r--library/font_awesome/scss/_icons.scss381
-rw-r--r--library/font_awesome/scss/_mixins.scss48
-rw-r--r--library/font_awesome/scss/_path.scss14
-rw-r--r--library/font_awesome/scss/_variables.scss734
-rw-r--r--library/font_awesome/scss/font-awesome-ie7.scss1953
-rw-r--r--library/font_awesome/scss/font-awesome.scss33
-rw-r--r--library/font_awesome/src/CNAME1
-rw-r--r--library/font_awesome/src/Makefile36
-rw-r--r--library/font_awesome/src/_includes/ads/carbon-dark-vertical.html1
-rw-r--r--library/font_awesome/src/_includes/ads/carbon-light-horizontal.html1
-rw-r--r--library/font_awesome/src/_includes/ads/carbon-light-vertical.html1
-rw-r--r--library/font_awesome/src/_includes/brand-license.html4
-rw-r--r--library/font_awesome/src/_includes/cheatsheet.html19
-rw-r--r--library/font_awesome/src/_includes/community.html20
-rw-r--r--library/font_awesome/src/_includes/community/getting-support.html22
-rw-r--r--library/font_awesome/src/_includes/community/project-milestones.html7
-rw-r--r--library/font_awesome/src/_includes/community/reporting-bugs.html18
-rw-r--r--library/font_awesome/src/_includes/community/requesting-new-icons.html27
-rw-r--r--library/font_awesome/src/_includes/community/submitting-pull-requests.html12
-rw-r--r--library/font_awesome/src/_includes/examples.html24
-rw-r--r--library/font_awesome/src/_includes/examples/animated-spinner.html20
-rw-r--r--library/font_awesome/src/_includes/examples/bordered-pulled.html33
-rw-r--r--library/font_awesome/src/_includes/examples/bulleted-lists.html31
-rw-r--r--library/font_awesome/src/_includes/examples/button-dropdowns.html36
-rw-r--r--library/font_awesome/src/_includes/examples/button-groups.html25
-rw-r--r--library/font_awesome/src/_includes/examples/buttons.html57
-rw-r--r--library/font_awesome/src/_includes/examples/custom.html16
-rw-r--r--library/font_awesome/src/_includes/examples/form-inputs.html31
-rw-r--r--library/font_awesome/src/_includes/examples/inline-icons.html19
-rw-r--r--library/font_awesome/src/_includes/examples/larger-icons.html35
-rw-r--r--library/font_awesome/src/_includes/examples/navigation.html26
-rw-r--r--library/font_awesome/src/_includes/examples/new.html47
-rw-r--r--library/font_awesome/src/_includes/examples/rotated-flipped.html29
-rw-r--r--library/font_awesome/src/_includes/examples/stacked.html55
-rw-r--r--library/font_awesome/src/_includes/footer.html23
-rw-r--r--library/font_awesome/src/_includes/get-started.html105
-rw-r--r--library/font_awesome/src/_includes/icons.html18
-rw-r--r--library/font_awesome/src/_includes/icons/brand.html15
-rw-r--r--library/font_awesome/src/_includes/icons/currency.html12
-rw-r--r--library/font_awesome/src/_includes/icons/directional.html12
-rw-r--r--library/font_awesome/src/_includes/icons/medical.html12
-rw-r--r--library/font_awesome/src/_includes/icons/new.html18
-rw-r--r--library/font_awesome/src/_includes/icons/text-editor.html12
-rw-r--r--library/font_awesome/src/_includes/icons/video-player.html12
-rw-r--r--library/font_awesome/src/_includes/icons/web-application.html12
-rw-r--r--library/font_awesome/src/_includes/jumbotron-slider.html53
-rw-r--r--library/font_awesome/src/_includes/jumbotron.html6
-rw-r--r--library/font_awesome/src/_includes/license-code.less25
-rw-r--r--library/font_awesome/src/_includes/license.html57
-rw-r--r--library/font_awesome/src/_includes/navbar.html69
-rw-r--r--library/font_awesome/src/_includes/stripe-ad.html10
-rw-r--r--library/font_awesome/src/_includes/stripe-social.html18
-rw-r--r--library/font_awesome/src/_includes/tell-me-thanks.html22
-rw-r--r--library/font_awesome/src/_includes/tests/rotated-flipped-inside-anchor.html6
-rw-r--r--library/font_awesome/src/_includes/tests/rotated-flipped-inside-btn.html6
-rw-r--r--library/font_awesome/src/_includes/tests/rotated-flipped.html6
-rw-r--r--library/font_awesome/src/_includes/tests/stacked-inside-anchor.html69
-rw-r--r--library/font_awesome/src/_includes/tests/stacked.html51
-rw-r--r--library/font_awesome/src/_includes/thanks-to.html26
-rw-r--r--library/font_awesome/src/_includes/whats-new.html38
-rw-r--r--library/font_awesome/src/_includes/why.html41
-rw-r--r--library/font_awesome/src/_layouts/base.html64
-rw-r--r--library/font_awesome/src/_layouts/icon.html62
-rw-r--r--library/font_awesome/src/_plugins/icon_page_generator.rb46
-rw-r--r--library/font_awesome/src/_plugins/site.rb142
-rwxr-xr-xlibrary/font_awesome/src/assets/css/prettify.css30
-rw-r--r--library/font_awesome/src/assets/css/pygments.css71
-rw-r--r--library/font_awesome/src/assets/font-awesome/font/FontAwesome.otfbin0 -> 61896 bytes
-rwxr-xr-xlibrary/font_awesome/src/assets/font-awesome/font/fontawesome-webfont.eotbin0 -> 37405 bytes
-rwxr-xr-xlibrary/font_awesome/src/assets/font-awesome/font/fontawesome-webfont.svg399
-rwxr-xr-xlibrary/font_awesome/src/assets/font-awesome/font/fontawesome-webfont.ttfbin0 -> 79076 bytes
-rwxr-xr-xlibrary/font_awesome/src/assets/font-awesome/font/fontawesome-webfont.woffbin0 -> 43572 bytes
-rw-r--r--library/font_awesome/src/assets/font-awesome/less/bootstrap.less84
-rw-r--r--library/font_awesome/src/assets/font-awesome/less/core.less129
-rw-r--r--library/font_awesome/src/assets/font-awesome/less/extras.less93
-rw-r--r--library/font_awesome/src/assets/font-awesome/less/font-awesome-ie7.less67
-rw-r--r--library/font_awesome/src/assets/font-awesome/less/font-awesome.less11
-rw-r--r--library/font_awesome/src/assets/font-awesome/less/icons.less7
-rw-r--r--library/font_awesome/src/assets/font-awesome/less/mixins.less48
-rw-r--r--library/font_awesome/src/assets/font-awesome/less/path.less14
-rw-r--r--library/font_awesome/src/assets/font-awesome/less/variables.less17
-rw-r--r--library/font_awesome/src/assets/font-awesome/scss/_bootstrap.scss84
-rw-r--r--library/font_awesome/src/assets/font-awesome/scss/_core.scss129
-rw-r--r--library/font_awesome/src/assets/font-awesome/scss/_extras.scss93
-rw-r--r--library/font_awesome/src/assets/font-awesome/scss/_icons.scss7
-rw-r--r--library/font_awesome/src/assets/font-awesome/scss/_mixins.scss48
-rw-r--r--library/font_awesome/src/assets/font-awesome/scss/_path.scss14
-rw-r--r--library/font_awesome/src/assets/font-awesome/scss/_variables.scss16
-rw-r--r--library/font_awesome/src/assets/font-awesome/scss/font-awesome-ie7.scss67
-rw-r--r--library/font_awesome/src/assets/font-awesome/scss/font-awesome.scss11
-rw-r--r--library/font_awesome/src/assets/img/contribution-sample.pngbin0 -> 2441 bytes
-rw-r--r--library/font_awesome/src/assets/img/fort_awesome.jpgbin0 -> 114822 bytes
-rw-r--r--library/font_awesome/src/assets/img/glyphicons-halflings-white.pngbin0 -> 8777 bytes
-rw-r--r--library/font_awesome/src/assets/img/glyphicons-halflings.pngbin0 -> 12799 bytes
-rw-r--r--library/font_awesome/src/assets/img/icon-flag.pdf1355
-rwxr-xr-xlibrary/font_awesome/src/assets/js/ZeroClipboard-1.1.7.min.js8
-rwxr-xr-xlibrary/font_awesome/src/assets/js/ZeroClipboard-1.1.7.swfbin0 -> 1635 bytes
-rw-r--r--library/font_awesome/src/assets/js/backbone.min.js37
-rw-r--r--library/font_awesome/src/assets/js/bootstrap-2.3.1.min.js6
-rw-r--r--library/font_awesome/src/assets/js/bootstrap-222.min.js6
-rw-r--r--library/font_awesome/src/assets/js/jquery-1.7.1.min.js4
-rw-r--r--library/font_awesome/src/assets/js/prettify.min.js28
-rw-r--r--library/font_awesome/src/assets/js/site.js38
-rw-r--r--library/font_awesome/src/assets/js/underscore.min.js31
-rwxr-xr-xlibrary/font_awesome/src/assets/less/bootstrap-2.3.2/accordion.less34
-rwxr-xr-xlibrary/font_awesome/src/assets/less/bootstrap-2.3.2/alerts.less79
-rwxr-xr-xlibrary/font_awesome/src/assets/less/bootstrap-2.3.2/bootstrap.less63
-rwxr-xr-xlibrary/font_awesome/src/assets/less/bootstrap-2.3.2/breadcrumbs.less24
-rwxr-xr-xlibrary/font_awesome/src/assets/less/bootstrap-2.3.2/button-groups.less229
-rwxr-xr-xlibrary/font_awesome/src/assets/less/bootstrap-2.3.2/buttons.less228
-rwxr-xr-xlibrary/font_awesome/src/assets/less/bootstrap-2.3.2/carousel.less158
-rwxr-xr-xlibrary/font_awesome/src/assets/less/bootstrap-2.3.2/close.less32
-rwxr-xr-xlibrary/font_awesome/src/assets/less/bootstrap-2.3.2/code.less61
-rwxr-xr-xlibrary/font_awesome/src/assets/less/bootstrap-2.3.2/component-animations.less22
-rwxr-xr-xlibrary/font_awesome/src/assets/less/bootstrap-2.3.2/dropdowns.less248
-rwxr-xr-xlibrary/font_awesome/src/assets/less/bootstrap-2.3.2/forms.less690
-rwxr-xr-xlibrary/font_awesome/src/assets/less/bootstrap-2.3.2/grid.less21
-rwxr-xr-xlibrary/font_awesome/src/assets/less/bootstrap-2.3.2/hero-unit.less25
-rwxr-xr-xlibrary/font_awesome/src/assets/less/bootstrap-2.3.2/labels-badges.less84
-rwxr-xr-xlibrary/font_awesome/src/assets/less/bootstrap-2.3.2/layouts.less16
-rwxr-xr-xlibrary/font_awesome/src/assets/less/bootstrap-2.3.2/media.less55
-rwxr-xr-xlibrary/font_awesome/src/assets/less/bootstrap-2.3.2/mixins.less702
-rwxr-xr-xlibrary/font_awesome/src/assets/less/bootstrap-2.3.2/modals.less95
-rwxr-xr-xlibrary/font_awesome/src/assets/less/bootstrap-2.3.2/navbar.less497
-rwxr-xr-xlibrary/font_awesome/src/assets/less/bootstrap-2.3.2/navs.less409
-rwxr-xr-xlibrary/font_awesome/src/assets/less/bootstrap-2.3.2/pager.less43
-rwxr-xr-xlibrary/font_awesome/src/assets/less/bootstrap-2.3.2/pagination.less123
-rwxr-xr-xlibrary/font_awesome/src/assets/less/bootstrap-2.3.2/popovers.less133
-rwxr-xr-xlibrary/font_awesome/src/assets/less/bootstrap-2.3.2/progress-bars.less122
-rwxr-xr-xlibrary/font_awesome/src/assets/less/bootstrap-2.3.2/reset.less216
-rwxr-xr-xlibrary/font_awesome/src/assets/less/bootstrap-2.3.2/responsive-1200px-min.less28
-rwxr-xr-xlibrary/font_awesome/src/assets/less/bootstrap-2.3.2/responsive-767px-max.less193
-rwxr-xr-xlibrary/font_awesome/src/assets/less/bootstrap-2.3.2/responsive-768px-979px.less19
-rwxr-xr-xlibrary/font_awesome/src/assets/less/bootstrap-2.3.2/responsive-navbar.less189
-rwxr-xr-xlibrary/font_awesome/src/assets/less/bootstrap-2.3.2/responsive-utilities.less59
-rwxr-xr-xlibrary/font_awesome/src/assets/less/bootstrap-2.3.2/responsive.less48
-rwxr-xr-xlibrary/font_awesome/src/assets/less/bootstrap-2.3.2/scaffolding.less53
-rwxr-xr-xlibrary/font_awesome/src/assets/less/bootstrap-2.3.2/sprites.less197
-rwxr-xr-xlibrary/font_awesome/src/assets/less/bootstrap-2.3.2/tables.less244
-rwxr-xr-xlibrary/font_awesome/src/assets/less/bootstrap-2.3.2/thumbnails.less53
-rwxr-xr-xlibrary/font_awesome/src/assets/less/bootstrap-2.3.2/tooltip.less70
-rwxr-xr-xlibrary/font_awesome/src/assets/less/bootstrap-2.3.2/type.less247
-rwxr-xr-xlibrary/font_awesome/src/assets/less/bootstrap-2.3.2/utilities.less30
-rwxr-xr-xlibrary/font_awesome/src/assets/less/bootstrap-2.3.2/variables.less301
-rwxr-xr-xlibrary/font_awesome/src/assets/less/bootstrap-2.3.2/wells.less29
-rw-r--r--library/font_awesome/src/assets/less/lazy.less85
-rw-r--r--library/font_awesome/src/assets/less/mixins.less58
-rwxr-xr-xlibrary/font_awesome/src/assets/less/responsive-1200px-min.less56
-rwxr-xr-xlibrary/font_awesome/src/assets/less/responsive-767px-max.less83
-rwxr-xr-xlibrary/font_awesome/src/assets/less/responsive-768px-979px.less67
-rwxr-xr-xlibrary/font_awesome/src/assets/less/responsive-navbar.less11
-rwxr-xr-xlibrary/font_awesome/src/assets/less/responsive.less55
-rw-r--r--library/font_awesome/src/assets/less/site.less354
-rwxr-xr-xlibrary/font_awesome/src/assets/less/sticky-footer.less17
-rwxr-xr-xlibrary/font_awesome/src/assets/less/variables.less347
-rw-r--r--library/font_awesome/src/cheatsheet.html14
-rw-r--r--library/font_awesome/src/community.html15
-rw-r--r--library/font_awesome/src/design.html1
-rw-r--r--library/font_awesome/src/examples.html15
-rw-r--r--library/font_awesome/src/get-started.html15
-rw-r--r--library/font_awesome/src/icons.html15
-rw-r--r--library/font_awesome/src/icons.yml2590
-rw-r--r--library/font_awesome/src/index.html22
-rw-r--r--library/font_awesome/src/license.html15
-rw-r--r--library/font_awesome/src/test.html714
-rw-r--r--library/font_awesome/src/whats-new.html17
-rw-r--r--library/fullcalendar/changelog.txt24
-rw-r--r--library/fullcalendar/fullcalendar.css321
-rw-r--r--library/fullcalendar/fullcalendar.js665
-rw-r--r--library/fullcalendar/fullcalendar.min.js121
-rw-r--r--library/fullcalendar/fullcalendar.print.css47
-rw-r--r--library/fullcalendar/gcal.js13
-rw-r--r--library/fullcalendar/license.txt20
-rw-r--r--library/jquery_ac/friendica.complete.js7
-rw-r--r--library/jslider/css/jslider.css8
-rw-r--r--library/jslider/img/jslider.pngbin1021 -> 832 bytes
-rw-r--r--library/phpqrcode/CHANGELOG38
-rw-r--r--library/phpqrcode/INSTALL67
-rw-r--r--library/phpqrcode/LICENSE165
-rw-r--r--library/phpqrcode/README45
-rw-r--r--library/phpqrcode/VERSION2
-rw-r--r--library/phpqrcode/bindings/tcpdf/qrcode.php2875
-rw-r--r--library/phpqrcode/cache/frame_1.dat2
-rw-r--r--library/phpqrcode/cache/frame_1.pngbin0 -> 126 bytes
-rw-r--r--library/phpqrcode/cache/frame_10.datbin0 -> 204 bytes
-rw-r--r--library/phpqrcode/cache/frame_10.pngbin0 -> 202 bytes
-rw-r--r--library/phpqrcode/cache/frame_11.datbin0 -> 210 bytes
-rw-r--r--library/phpqrcode/cache/frame_11.pngbin0 -> 205 bytes
-rw-r--r--library/phpqrcode/cache/frame_12.datbin0 -> 222 bytes
-rw-r--r--library/phpqrcode/cache/frame_12.pngbin0 -> 216 bytes
-rw-r--r--library/phpqrcode/cache/frame_13.datbin0 -> 223 bytes
-rw-r--r--library/phpqrcode/cache/frame_13.pngbin0 -> 210 bytes
-rw-r--r--library/phpqrcode/cache/frame_14.datbin0 -> 227 bytes
-rw-r--r--library/phpqrcode/cache/frame_14.pngbin0 -> 213 bytes
-rw-r--r--library/phpqrcode/cache/frame_15.datbin0 -> 242 bytes
-rw-r--r--library/phpqrcode/cache/frame_15.pngbin0 -> 219 bytes
-rw-r--r--library/phpqrcode/cache/frame_16.dat1
-rw-r--r--library/phpqrcode/cache/frame_16.pngbin0 -> 211 bytes
-rw-r--r--library/phpqrcode/cache/frame_17.datbin0 -> 237 bytes
-rw-r--r--library/phpqrcode/cache/frame_17.pngbin0 -> 211 bytes
-rw-r--r--library/phpqrcode/cache/frame_18.dat2
-rw-r--r--library/phpqrcode/cache/frame_18.pngbin0 -> 228 bytes
-rw-r--r--library/phpqrcode/cache/frame_19.dat3
-rw-r--r--library/phpqrcode/cache/frame_19.pngbin0 -> 225 bytes
-rw-r--r--library/phpqrcode/cache/frame_2.dat1
-rw-r--r--library/phpqrcode/cache/frame_2.pngbin0 -> 144 bytes
-rw-r--r--library/phpqrcode/cache/frame_20.datbin0 -> 250 bytes
-rw-r--r--library/phpqrcode/cache/frame_20.pngbin0 -> 225 bytes
-rw-r--r--library/phpqrcode/cache/frame_21.dat1
-rw-r--r--library/phpqrcode/cache/frame_21.pngbin0 -> 235 bytes
-rw-r--r--library/phpqrcode/cache/frame_22.dat3
-rw-r--r--library/phpqrcode/cache/frame_22.pngbin0 -> 226 bytes
-rw-r--r--library/phpqrcode/cache/frame_23.dat3
-rw-r--r--library/phpqrcode/cache/frame_23.pngbin0 -> 220 bytes
-rw-r--r--library/phpqrcode/cache/frame_24.dat1
-rw-r--r--library/phpqrcode/cache/frame_24.pngbin0 -> 242 bytes
-rw-r--r--library/phpqrcode/cache/frame_25.dat3
-rw-r--r--library/phpqrcode/cache/frame_25.pngbin0 -> 242 bytes
-rw-r--r--library/phpqrcode/cache/frame_26.dat2
-rw-r--r--library/phpqrcode/cache/frame_26.pngbin0 -> 244 bytes
-rw-r--r--library/phpqrcode/cache/frame_27.datbin0 -> 284 bytes
-rw-r--r--library/phpqrcode/cache/frame_27.pngbin0 -> 237 bytes
-rw-r--r--library/phpqrcode/cache/frame_28.datbin0 -> 318 bytes
-rw-r--r--library/phpqrcode/cache/frame_28.pngbin0 -> 234 bytes
-rw-r--r--library/phpqrcode/cache/frame_29.dat2
-rw-r--r--library/phpqrcode/cache/frame_29.pngbin0 -> 232 bytes
-rw-r--r--library/phpqrcode/cache/frame_3.dat1
-rw-r--r--library/phpqrcode/cache/frame_3.pngbin0 -> 147 bytes
-rw-r--r--library/phpqrcode/cache/frame_30.datbin0 -> 324 bytes
-rw-r--r--library/phpqrcode/cache/frame_30.pngbin0 -> 255 bytes
-rw-r--r--library/phpqrcode/cache/frame_31.dat1
-rw-r--r--library/phpqrcode/cache/frame_31.pngbin0 -> 260 bytes
-rw-r--r--library/phpqrcode/cache/frame_32.dat2
-rw-r--r--library/phpqrcode/cache/frame_32.pngbin0 -> 262 bytes
-rw-r--r--library/phpqrcode/cache/frame_33.dat14
-rw-r--r--library/phpqrcode/cache/frame_33.pngbin0 -> 253 bytes
-rw-r--r--library/phpqrcode/cache/frame_34.datbin0 -> 331 bytes
-rw-r--r--library/phpqrcode/cache/frame_34.pngbin0 -> 256 bytes
-rw-r--r--library/phpqrcode/cache/frame_35.datbin0 -> 342 bytes
-rw-r--r--library/phpqrcode/cache/frame_35.pngbin0 -> 243 bytes
-rw-r--r--library/phpqrcode/cache/frame_36.datbin0 -> 370 bytes
-rw-r--r--library/phpqrcode/cache/frame_36.pngbin0 -> 272 bytes
-rw-r--r--library/phpqrcode/cache/frame_37.datbin0 -> 376 bytes
-rw-r--r--library/phpqrcode/cache/frame_37.pngbin0 -> 279 bytes
-rw-r--r--library/phpqrcode/cache/frame_38.dat1
-rw-r--r--library/phpqrcode/cache/frame_38.pngbin0 -> 279 bytes
-rw-r--r--library/phpqrcode/cache/frame_39.datbin0 -> 404 bytes
-rw-r--r--library/phpqrcode/cache/frame_39.pngbin0 -> 264 bytes
-rw-r--r--library/phpqrcode/cache/frame_4.dat1
-rw-r--r--library/phpqrcode/cache/frame_4.pngbin0 -> 149 bytes
-rw-r--r--library/phpqrcode/cache/frame_40.dat2
-rw-r--r--library/phpqrcode/cache/frame_40.pngbin0 -> 267 bytes
-rw-r--r--library/phpqrcode/cache/frame_5.dat1
-rw-r--r--library/phpqrcode/cache/frame_5.pngbin0 -> 150 bytes
-rw-r--r--library/phpqrcode/cache/frame_6.datbin0 -> 132 bytes
-rw-r--r--library/phpqrcode/cache/frame_6.pngbin0 -> 151 bytes
-rw-r--r--library/phpqrcode/cache/frame_7.datbin0 -> 196 bytes
-rw-r--r--library/phpqrcode/cache/frame_7.pngbin0 -> 189 bytes
-rw-r--r--library/phpqrcode/cache/frame_8.datbin0 -> 201 bytes
-rw-r--r--library/phpqrcode/cache/frame_8.pngbin0 -> 204 bytes
-rw-r--r--library/phpqrcode/cache/frame_9.datbin0 -> 206 bytes
-rw-r--r--library/phpqrcode/cache/frame_9.pngbin0 -> 199 bytes
-rw-r--r--library/phpqrcode/cache/mask_0/mask_101_0.datbin0 -> 157 bytes
-rw-r--r--library/phpqrcode/cache/mask_0/mask_105_0.datbin0 -> 162 bytes
-rw-r--r--library/phpqrcode/cache/mask_0/mask_109_0.dat2
-rw-r--r--library/phpqrcode/cache/mask_0/mask_113_0.dat2
-rw-r--r--library/phpqrcode/cache/mask_0/mask_117_0.dat2
-rw-r--r--library/phpqrcode/cache/mask_0/mask_121_0.dat1
-rw-r--r--library/phpqrcode/cache/mask_0/mask_125_0.dat2
-rw-r--r--library/phpqrcode/cache/mask_0/mask_129_0.dat2
-rw-r--r--library/phpqrcode/cache/mask_0/mask_133_0.dat2
-rw-r--r--library/phpqrcode/cache/mask_0/mask_137_0.dat1
-rw-r--r--library/phpqrcode/cache/mask_0/mask_141_0.dat2
-rw-r--r--library/phpqrcode/cache/mask_0/mask_145_0.dat2
-rw-r--r--library/phpqrcode/cache/mask_0/mask_149_0.dat3
-rw-r--r--library/phpqrcode/cache/mask_0/mask_153_0.dat1
-rw-r--r--library/phpqrcode/cache/mask_0/mask_157_0.dat2
-rw-r--r--library/phpqrcode/cache/mask_0/mask_161_0.datbin0 -> 241 bytes
-rw-r--r--library/phpqrcode/cache/mask_0/mask_165_0.dat2
-rw-r--r--library/phpqrcode/cache/mask_0/mask_169_0.dat2
-rw-r--r--library/phpqrcode/cache/mask_0/mask_173_0.dat1
-rw-r--r--library/phpqrcode/cache/mask_0/mask_177_0.dat2
-rw-r--r--library/phpqrcode/cache/mask_0/mask_21_0.datbin0 -> 48 bytes
-rw-r--r--library/phpqrcode/cache/mask_0/mask_25_0.datbin0 -> 57 bytes
-rw-r--r--library/phpqrcode/cache/mask_0/mask_29_0.datbin0 -> 59 bytes
-rw-r--r--library/phpqrcode/cache/mask_0/mask_33_0.datbin0 -> 62 bytes
-rw-r--r--library/phpqrcode/cache/mask_0/mask_37_0.datbin0 -> 65 bytes
-rw-r--r--library/phpqrcode/cache/mask_0/mask_41_0.datbin0 -> 68 bytes
-rw-r--r--library/phpqrcode/cache/mask_0/mask_45_0.datbin0 -> 106 bytes
-rw-r--r--library/phpqrcode/cache/mask_0/mask_49_0.dat2
-rw-r--r--library/phpqrcode/cache/mask_0/mask_53_0.dat2
-rw-r--r--library/phpqrcode/cache/mask_0/mask_57_0.dat4
-rw-r--r--library/phpqrcode/cache/mask_0/mask_61_0.datbin0 -> 119 bytes
-rw-r--r--library/phpqrcode/cache/mask_0/mask_65_0.datbin0 -> 123 bytes
-rw-r--r--library/phpqrcode/cache/mask_0/mask_69_0.dat1
-rw-r--r--library/phpqrcode/cache/mask_0/mask_73_0.dat1
-rw-r--r--library/phpqrcode/cache/mask_0/mask_77_0.dat2
-rw-r--r--library/phpqrcode/cache/mask_0/mask_81_0.dat2
-rw-r--r--library/phpqrcode/cache/mask_0/mask_85_0.dat2
-rw-r--r--library/phpqrcode/cache/mask_0/mask_89_0.dat1
-rw-r--r--library/phpqrcode/cache/mask_0/mask_93_0.dat3
-rw-r--r--library/phpqrcode/cache/mask_0/mask_97_0.datbin0 -> 150 bytes
-rw-r--r--library/phpqrcode/cache/mask_1/mask_101_1.dat2
-rw-r--r--library/phpqrcode/cache/mask_1/mask_105_1.dat1
-rw-r--r--library/phpqrcode/cache/mask_1/mask_109_1.dat1
-rw-r--r--library/phpqrcode/cache/mask_1/mask_113_1.dat1
-rw-r--r--library/phpqrcode/cache/mask_1/mask_117_1.dat2
-rw-r--r--library/phpqrcode/cache/mask_1/mask_121_1.dat2
-rw-r--r--library/phpqrcode/cache/mask_1/mask_125_1.dat2
-rw-r--r--library/phpqrcode/cache/mask_1/mask_129_1.datbin0 -> 164 bytes
-rw-r--r--library/phpqrcode/cache/mask_1/mask_133_1.dat1
-rw-r--r--library/phpqrcode/cache/mask_1/mask_137_1.dat3
-rw-r--r--library/phpqrcode/cache/mask_1/mask_141_1.dat2
-rw-r--r--library/phpqrcode/cache/mask_1/mask_145_1.dat1
-rw-r--r--library/phpqrcode/cache/mask_1/mask_149_1.dat1
-rw-r--r--library/phpqrcode/cache/mask_1/mask_153_1.dat2
-rw-r--r--library/phpqrcode/cache/mask_1/mask_157_1.dat2
-rw-r--r--library/phpqrcode/cache/mask_1/mask_161_1.dat1
-rw-r--r--library/phpqrcode/cache/mask_1/mask_165_1.dat1
-rw-r--r--library/phpqrcode/cache/mask_1/mask_169_1.dat1
-rw-r--r--library/phpqrcode/cache/mask_1/mask_173_1.dat1
-rw-r--r--library/phpqrcode/cache/mask_1/mask_177_1.dat1
-rw-r--r--library/phpqrcode/cache/mask_1/mask_21_1.datbin0 -> 42 bytes
-rw-r--r--library/phpqrcode/cache/mask_1/mask_25_1.datbin0 -> 48 bytes
-rw-r--r--library/phpqrcode/cache/mask_1/mask_29_1.datbin0 -> 50 bytes
-rw-r--r--library/phpqrcode/cache/mask_1/mask_33_1.datbin0 -> 53 bytes
-rw-r--r--library/phpqrcode/cache/mask_1/mask_37_1.datbin0 -> 56 bytes
-rw-r--r--library/phpqrcode/cache/mask_1/mask_41_1.datbin0 -> 58 bytes
-rw-r--r--library/phpqrcode/cache/mask_1/mask_45_1.datbin0 -> 82 bytes
-rw-r--r--library/phpqrcode/cache/mask_1/mask_49_1.datbin0 -> 84 bytes
-rw-r--r--library/phpqrcode/cache/mask_1/mask_53_1.datbin0 -> 87 bytes
-rw-r--r--library/phpqrcode/cache/mask_1/mask_57_1.datbin0 -> 92 bytes
-rw-r--r--library/phpqrcode/cache/mask_1/mask_61_1.dat1
-rw-r--r--library/phpqrcode/cache/mask_1/mask_65_1.datbin0 -> 99 bytes
-rw-r--r--library/phpqrcode/cache/mask_1/mask_69_1.datbin0 -> 102 bytes
-rw-r--r--library/phpqrcode/cache/mask_1/mask_73_1.datbin0 -> 104 bytes
-rw-r--r--library/phpqrcode/cache/mask_1/mask_77_1.datbin0 -> 110 bytes
-rw-r--r--library/phpqrcode/cache/mask_1/mask_81_1.datbin0 -> 114 bytes
-rw-r--r--library/phpqrcode/cache/mask_1/mask_85_1.dat2
-rw-r--r--library/phpqrcode/cache/mask_1/mask_89_1.dat1
-rw-r--r--library/phpqrcode/cache/mask_1/mask_93_1.dat2
-rw-r--r--library/phpqrcode/cache/mask_1/mask_97_1.dat2
-rw-r--r--library/phpqrcode/cache/mask_2/mask_101_2.dat3
-rw-r--r--library/phpqrcode/cache/mask_2/mask_105_2.dat1
-rw-r--r--library/phpqrcode/cache/mask_2/mask_109_2.dat2
-rw-r--r--library/phpqrcode/cache/mask_2/mask_113_2.dat1
-rw-r--r--library/phpqrcode/cache/mask_2/mask_117_2.dat2
-rw-r--r--library/phpqrcode/cache/mask_2/mask_121_2.datbin0 -> 127 bytes
-rw-r--r--library/phpqrcode/cache/mask_2/mask_125_2.dat1
-rw-r--r--library/phpqrcode/cache/mask_2/mask_129_2.dat2
-rw-r--r--library/phpqrcode/cache/mask_2/mask_133_2.dat10
-rw-r--r--library/phpqrcode/cache/mask_2/mask_137_2.dat2
-rw-r--r--library/phpqrcode/cache/mask_2/mask_141_2.dat2
-rw-r--r--library/phpqrcode/cache/mask_2/mask_145_2.dat4
-rw-r--r--library/phpqrcode/cache/mask_2/mask_149_2.dat1
-rw-r--r--library/phpqrcode/cache/mask_2/mask_153_2.dat2
-rw-r--r--library/phpqrcode/cache/mask_2/mask_157_2.dat3
-rw-r--r--library/phpqrcode/cache/mask_2/mask_161_2.datbin0 -> 190 bytes
-rw-r--r--library/phpqrcode/cache/mask_2/mask_165_2.dat2
-rw-r--r--library/phpqrcode/cache/mask_2/mask_169_2.datbin0 -> 196 bytes
-rw-r--r--library/phpqrcode/cache/mask_2/mask_173_2.dat1
-rw-r--r--library/phpqrcode/cache/mask_2/mask_177_2.dat2
-rw-r--r--library/phpqrcode/cache/mask_2/mask_21_2.datbin0 -> 35 bytes
-rw-r--r--library/phpqrcode/cache/mask_2/mask_25_2.datbin0 -> 41 bytes
-rw-r--r--library/phpqrcode/cache/mask_2/mask_29_2.datbin0 -> 45 bytes
-rw-r--r--library/phpqrcode/cache/mask_2/mask_33_2.datbin0 -> 47 bytes
-rw-r--r--library/phpqrcode/cache/mask_2/mask_37_2.datbin0 -> 47 bytes
-rw-r--r--library/phpqrcode/cache/mask_2/mask_41_2.dat1
-rw-r--r--library/phpqrcode/cache/mask_2/mask_45_2.datbin0 -> 68 bytes
-rw-r--r--library/phpqrcode/cache/mask_2/mask_49_2.datbin0 -> 70 bytes
-rw-r--r--library/phpqrcode/cache/mask_2/mask_53_2.datbin0 -> 73 bytes
-rw-r--r--library/phpqrcode/cache/mask_2/mask_57_2.datbin0 -> 76 bytes
-rw-r--r--library/phpqrcode/cache/mask_2/mask_61_2.datbin0 -> 78 bytes
-rw-r--r--library/phpqrcode/cache/mask_2/mask_65_2.datbin0 -> 89 bytes
-rw-r--r--library/phpqrcode/cache/mask_2/mask_69_2.datbin0 -> 88 bytes
-rw-r--r--library/phpqrcode/cache/mask_2/mask_73_2.datbin0 -> 94 bytes
-rw-r--r--library/phpqrcode/cache/mask_2/mask_77_2.dat1
-rw-r--r--library/phpqrcode/cache/mask_2/mask_81_2.dat2
-rw-r--r--library/phpqrcode/cache/mask_2/mask_85_2.dat2
-rw-r--r--library/phpqrcode/cache/mask_2/mask_89_2.dat1
-rw-r--r--library/phpqrcode/cache/mask_2/mask_93_2.datbin0 -> 103 bytes
-rw-r--r--library/phpqrcode/cache/mask_2/mask_97_2.dat2
-rw-r--r--library/phpqrcode/cache/mask_3/mask_101_3.dat1
-rw-r--r--library/phpqrcode/cache/mask_3/mask_105_3.dat1
-rw-r--r--library/phpqrcode/cache/mask_3/mask_109_3.dat1
-rw-r--r--library/phpqrcode/cache/mask_3/mask_113_3.dat2
-rw-r--r--library/phpqrcode/cache/mask_3/mask_117_3.dat4
-rw-r--r--library/phpqrcode/cache/mask_3/mask_121_3.datbin0 -> 212 bytes
-rw-r--r--library/phpqrcode/cache/mask_3/mask_125_3.dat2
-rw-r--r--library/phpqrcode/cache/mask_3/mask_129_3.dat8
-rw-r--r--library/phpqrcode/cache/mask_3/mask_133_3.datbin0 -> 216 bytes
-rw-r--r--library/phpqrcode/cache/mask_3/mask_137_3.dat2
-rw-r--r--library/phpqrcode/cache/mask_3/mask_141_3.dat2
-rw-r--r--library/phpqrcode/cache/mask_3/mask_145_3.dat3
-rw-r--r--library/phpqrcode/cache/mask_3/mask_149_3.dat1
-rw-r--r--library/phpqrcode/cache/mask_3/mask_153_3.dat2
-rw-r--r--library/phpqrcode/cache/mask_3/mask_157_3.datbin0 -> 248 bytes
-rw-r--r--library/phpqrcode/cache/mask_3/mask_161_3.dat3
-rw-r--r--library/phpqrcode/cache/mask_3/mask_165_3.dat2
-rw-r--r--library/phpqrcode/cache/mask_3/mask_169_3.dat1
-rw-r--r--library/phpqrcode/cache/mask_3/mask_173_3.dat1
-rw-r--r--library/phpqrcode/cache/mask_3/mask_177_3.datbin0 -> 312 bytes
-rw-r--r--library/phpqrcode/cache/mask_3/mask_21_3.datbin0 -> 60 bytes
-rw-r--r--library/phpqrcode/cache/mask_3/mask_25_3.datbin0 -> 75 bytes
-rw-r--r--library/phpqrcode/cache/mask_3/mask_29_3.datbin0 -> 75 bytes
-rw-r--r--library/phpqrcode/cache/mask_3/mask_33_3.datbin0 -> 79 bytes
-rw-r--r--library/phpqrcode/cache/mask_3/mask_37_3.datbin0 -> 83 bytes
-rw-r--r--library/phpqrcode/cache/mask_3/mask_41_3.datbin0 -> 85 bytes
-rw-r--r--library/phpqrcode/cache/mask_3/mask_45_3.dat2
-rw-r--r--library/phpqrcode/cache/mask_3/mask_49_3.datbin0 -> 127 bytes
-rw-r--r--library/phpqrcode/cache/mask_3/mask_53_3.dat2
-rw-r--r--library/phpqrcode/cache/mask_3/mask_57_3.datbin0 -> 126 bytes
-rw-r--r--library/phpqrcode/cache/mask_3/mask_61_3.dat2
-rw-r--r--library/phpqrcode/cache/mask_3/mask_65_3.dat2
-rw-r--r--library/phpqrcode/cache/mask_3/mask_69_3.dat2
-rw-r--r--library/phpqrcode/cache/mask_3/mask_73_3.dat2
-rw-r--r--library/phpqrcode/cache/mask_3/mask_77_3.dat2
-rw-r--r--library/phpqrcode/cache/mask_3/mask_81_3.dat2
-rw-r--r--library/phpqrcode/cache/mask_3/mask_85_3.datbin0 -> 160 bytes
-rw-r--r--library/phpqrcode/cache/mask_3/mask_89_3.dat2
-rw-r--r--library/phpqrcode/cache/mask_3/mask_93_3.dat2
-rw-r--r--library/phpqrcode/cache/mask_3/mask_97_3.datbin0 -> 175 bytes
-rw-r--r--library/phpqrcode/cache/mask_4/mask_101_4.dat2
-rw-r--r--library/phpqrcode/cache/mask_4/mask_105_4.dat2
-rw-r--r--library/phpqrcode/cache/mask_4/mask_109_4.datbin0 -> 182 bytes
-rw-r--r--library/phpqrcode/cache/mask_4/mask_113_4.dat2
-rw-r--r--library/phpqrcode/cache/mask_4/mask_117_4.dat2
-rw-r--r--library/phpqrcode/cache/mask_4/mask_121_4.datbin0 -> 208 bytes
-rw-r--r--library/phpqrcode/cache/mask_4/mask_125_4.datbin0 -> 213 bytes
-rw-r--r--library/phpqrcode/cache/mask_4/mask_129_4.datbin0 -> 220 bytes
-rw-r--r--library/phpqrcode/cache/mask_4/mask_133_4.dat3
-rw-r--r--library/phpqrcode/cache/mask_4/mask_137_4.datbin0 -> 248 bytes
-rw-r--r--library/phpqrcode/cache/mask_4/mask_141_4.datbin0 -> 254 bytes
-rw-r--r--library/phpqrcode/cache/mask_4/mask_145_4.datbin0 -> 255 bytes
-rw-r--r--library/phpqrcode/cache/mask_4/mask_149_4.dat2
-rw-r--r--library/phpqrcode/cache/mask_4/mask_153_4.dat2
-rw-r--r--library/phpqrcode/cache/mask_4/mask_157_4.dat1
-rw-r--r--library/phpqrcode/cache/mask_4/mask_161_4.dat1
-rw-r--r--library/phpqrcode/cache/mask_4/mask_165_4.dat3
-rw-r--r--library/phpqrcode/cache/mask_4/mask_169_4.datbin0 -> 297 bytes
-rw-r--r--library/phpqrcode/cache/mask_4/mask_173_4.dat2
-rw-r--r--library/phpqrcode/cache/mask_4/mask_177_4.dat2
-rw-r--r--library/phpqrcode/cache/mask_4/mask_21_4.datbin0 -> 57 bytes
-rw-r--r--library/phpqrcode/cache/mask_4/mask_25_4.datbin0 -> 76 bytes
-rw-r--r--library/phpqrcode/cache/mask_4/mask_29_4.datbin0 -> 78 bytes
-rw-r--r--library/phpqrcode/cache/mask_4/mask_33_4.datbin0 -> 89 bytes
-rw-r--r--library/phpqrcode/cache/mask_4/mask_37_4.datbin0 -> 86 bytes
-rw-r--r--library/phpqrcode/cache/mask_4/mask_41_4.datbin0 -> 89 bytes
-rw-r--r--library/phpqrcode/cache/mask_4/mask_45_4.datbin0 -> 120 bytes
-rw-r--r--library/phpqrcode/cache/mask_4/mask_49_4.datbin0 -> 124 bytes
-rw-r--r--library/phpqrcode/cache/mask_4/mask_53_4.datbin0 -> 128 bytes
-rw-r--r--library/phpqrcode/cache/mask_4/mask_57_4.datbin0 -> 130 bytes
-rw-r--r--library/phpqrcode/cache/mask_4/mask_61_4.datbin0 -> 132 bytes
-rw-r--r--library/phpqrcode/cache/mask_4/mask_65_4.dat2
-rw-r--r--library/phpqrcode/cache/mask_4/mask_69_4.dat1
-rw-r--r--library/phpqrcode/cache/mask_4/mask_73_4.dat3
-rw-r--r--library/phpqrcode/cache/mask_4/mask_77_4.dat2
-rw-r--r--library/phpqrcode/cache/mask_4/mask_81_4.dat3
-rw-r--r--library/phpqrcode/cache/mask_4/mask_85_4.datbin0 -> 154 bytes
-rw-r--r--library/phpqrcode/cache/mask_4/mask_89_4.dat2
-rw-r--r--library/phpqrcode/cache/mask_4/mask_93_4.dat2
-rw-r--r--library/phpqrcode/cache/mask_4/mask_97_4.datbin0 -> 176 bytes
-rw-r--r--library/phpqrcode/cache/mask_5/mask_101_5.dat2
-rw-r--r--library/phpqrcode/cache/mask_5/mask_105_5.datbin0 -> 224 bytes
-rw-r--r--library/phpqrcode/cache/mask_5/mask_109_5.datbin0 -> 211 bytes
-rw-r--r--library/phpqrcode/cache/mask_5/mask_113_5.dat9
-rw-r--r--library/phpqrcode/cache/mask_5/mask_117_5.dat1
-rw-r--r--library/phpqrcode/cache/mask_5/mask_121_5.datbin0 -> 256 bytes
-rw-r--r--library/phpqrcode/cache/mask_5/mask_125_5.dat2
-rw-r--r--library/phpqrcode/cache/mask_5/mask_129_5.datbin0 -> 259 bytes
-rw-r--r--library/phpqrcode/cache/mask_5/mask_133_5.dat2
-rw-r--r--library/phpqrcode/cache/mask_5/mask_137_5.dat3
-rw-r--r--library/phpqrcode/cache/mask_5/mask_141_5.datbin0 -> 297 bytes
-rw-r--r--library/phpqrcode/cache/mask_5/mask_145_5.datbin0 -> 300 bytes
-rw-r--r--library/phpqrcode/cache/mask_5/mask_149_5.dat3
-rw-r--r--library/phpqrcode/cache/mask_5/mask_153_5.dat2
-rw-r--r--library/phpqrcode/cache/mask_5/mask_157_5.dat1
-rw-r--r--library/phpqrcode/cache/mask_5/mask_161_5.dat2
-rw-r--r--library/phpqrcode/cache/mask_5/mask_165_5.datbin0 -> 332 bytes
-rw-r--r--library/phpqrcode/cache/mask_5/mask_169_5.dat1
-rw-r--r--library/phpqrcode/cache/mask_5/mask_173_5.dat4
-rw-r--r--library/phpqrcode/cache/mask_5/mask_177_5.dat11
-rw-r--r--library/phpqrcode/cache/mask_5/mask_21_5.datbin0 -> 74 bytes
-rw-r--r--library/phpqrcode/cache/mask_5/mask_25_5.dat2
-rw-r--r--library/phpqrcode/cache/mask_5/mask_29_5.dat2
-rw-r--r--library/phpqrcode/cache/mask_5/mask_33_5.datbin0 -> 106 bytes
-rw-r--r--library/phpqrcode/cache/mask_5/mask_37_5.datbin0 -> 103 bytes
-rw-r--r--library/phpqrcode/cache/mask_5/mask_41_5.dat2
-rw-r--r--library/phpqrcode/cache/mask_5/mask_45_5.dat1
-rw-r--r--library/phpqrcode/cache/mask_5/mask_49_5.datbin0 -> 146 bytes
-rw-r--r--library/phpqrcode/cache/mask_5/mask_53_5.dat1
-rw-r--r--library/phpqrcode/cache/mask_5/mask_57_5.dat2
-rw-r--r--library/phpqrcode/cache/mask_5/mask_61_5.dat1
-rw-r--r--library/phpqrcode/cache/mask_5/mask_65_5.datbin0 -> 163 bytes
-rw-r--r--library/phpqrcode/cache/mask_5/mask_69_5.datbin0 -> 167 bytes
-rw-r--r--library/phpqrcode/cache/mask_5/mask_73_5.datbin0 -> 184 bytes
-rw-r--r--library/phpqrcode/cache/mask_5/mask_77_5.dat1
-rw-r--r--library/phpqrcode/cache/mask_5/mask_81_5.dat3
-rw-r--r--library/phpqrcode/cache/mask_5/mask_85_5.datbin0 -> 186 bytes
-rw-r--r--library/phpqrcode/cache/mask_5/mask_89_5.dat2
-rw-r--r--library/phpqrcode/cache/mask_5/mask_93_5.dat2
-rw-r--r--library/phpqrcode/cache/mask_5/mask_97_5.dat1
-rw-r--r--library/phpqrcode/cache/mask_6/mask_101_6.dat2
-rw-r--r--library/phpqrcode/cache/mask_6/mask_105_6.dat3
-rw-r--r--library/phpqrcode/cache/mask_6/mask_109_6.dat1
-rw-r--r--library/phpqrcode/cache/mask_6/mask_113_6.dat3
-rw-r--r--library/phpqrcode/cache/mask_6/mask_117_6.dat1
-rw-r--r--library/phpqrcode/cache/mask_6/mask_121_6.datbin0 -> 309 bytes
-rw-r--r--library/phpqrcode/cache/mask_6/mask_125_6.dat1
-rw-r--r--library/phpqrcode/cache/mask_6/mask_129_6.datbin0 -> 310 bytes
-rw-r--r--library/phpqrcode/cache/mask_6/mask_133_6.datbin0 -> 296 bytes
-rw-r--r--library/phpqrcode/cache/mask_6/mask_137_6.dat2
-rw-r--r--library/phpqrcode/cache/mask_6/mask_141_6.dat10
-rw-r--r--library/phpqrcode/cache/mask_6/mask_145_6.datbin0 -> 357 bytes
-rw-r--r--library/phpqrcode/cache/mask_6/mask_149_6.dat2
-rw-r--r--library/phpqrcode/cache/mask_6/mask_153_6.datbin0 -> 367 bytes
-rw-r--r--library/phpqrcode/cache/mask_6/mask_157_6.dat1
-rw-r--r--library/phpqrcode/cache/mask_6/mask_161_6.datbin0 -> 399 bytes
-rw-r--r--library/phpqrcode/cache/mask_6/mask_165_6.datbin0 -> 400 bytes
-rw-r--r--library/phpqrcode/cache/mask_6/mask_169_6.dat1
-rw-r--r--library/phpqrcode/cache/mask_6/mask_173_6.dat1
-rw-r--r--library/phpqrcode/cache/mask_6/mask_177_6.dat14
-rw-r--r--library/phpqrcode/cache/mask_6/mask_21_6.dat1
-rw-r--r--library/phpqrcode/cache/mask_6/mask_25_6.dat1
-rw-r--r--library/phpqrcode/cache/mask_6/mask_29_6.dat3
-rw-r--r--library/phpqrcode/cache/mask_6/mask_33_6.datbin0 -> 124 bytes
-rw-r--r--library/phpqrcode/cache/mask_6/mask_37_6.dat1
-rw-r--r--library/phpqrcode/cache/mask_6/mask_41_6.datbin0 -> 132 bytes
-rw-r--r--library/phpqrcode/cache/mask_6/mask_45_6.datbin0 -> 189 bytes
-rw-r--r--library/phpqrcode/cache/mask_6/mask_49_6.dat2
-rw-r--r--library/phpqrcode/cache/mask_6/mask_53_6.datbin0 -> 195 bytes
-rw-r--r--library/phpqrcode/cache/mask_6/mask_57_6.dat2
-rw-r--r--library/phpqrcode/cache/mask_6/mask_61_6.dat2
-rw-r--r--library/phpqrcode/cache/mask_6/mask_65_6.dat1
-rw-r--r--library/phpqrcode/cache/mask_6/mask_69_6.dat1
-rw-r--r--library/phpqrcode/cache/mask_6/mask_73_6.datbin0 -> 230 bytes
-rw-r--r--library/phpqrcode/cache/mask_6/mask_77_6.dat1
-rw-r--r--library/phpqrcode/cache/mask_6/mask_81_6.dat3
-rw-r--r--library/phpqrcode/cache/mask_6/mask_85_6.datbin0 -> 229 bytes
-rw-r--r--library/phpqrcode/cache/mask_6/mask_89_6.datbin0 -> 263 bytes
-rw-r--r--library/phpqrcode/cache/mask_6/mask_93_6.datbin0 -> 276 bytes
-rw-r--r--library/phpqrcode/cache/mask_6/mask_97_6.dat2
-rw-r--r--library/phpqrcode/cache/mask_7/mask_101_7.dat1
-rw-r--r--library/phpqrcode/cache/mask_7/mask_105_7.dat2
-rw-r--r--library/phpqrcode/cache/mask_7/mask_109_7.dat2
-rw-r--r--library/phpqrcode/cache/mask_7/mask_113_7.dat11
-rw-r--r--library/phpqrcode/cache/mask_7/mask_117_7.dat2
-rw-r--r--library/phpqrcode/cache/mask_7/mask_121_7.dat2
-rw-r--r--library/phpqrcode/cache/mask_7/mask_125_7.datbin0 -> 288 bytes
-rw-r--r--library/phpqrcode/cache/mask_7/mask_129_7.datbin0 -> 282 bytes
-rw-r--r--library/phpqrcode/cache/mask_7/mask_133_7.datbin0 -> 281 bytes
-rw-r--r--library/phpqrcode/cache/mask_7/mask_137_7.dat5
-rw-r--r--library/phpqrcode/cache/mask_7/mask_141_7.dat1
-rw-r--r--library/phpqrcode/cache/mask_7/mask_145_7.dat2
-rw-r--r--library/phpqrcode/cache/mask_7/mask_149_7.dat1
-rw-r--r--library/phpqrcode/cache/mask_7/mask_153_7.dat2
-rw-r--r--library/phpqrcode/cache/mask_7/mask_157_7.dat2
-rw-r--r--library/phpqrcode/cache/mask_7/mask_161_7.dat1
-rw-r--r--library/phpqrcode/cache/mask_7/mask_165_7.dat1
-rw-r--r--library/phpqrcode/cache/mask_7/mask_169_7.datbin0 -> 383 bytes
-rw-r--r--library/phpqrcode/cache/mask_7/mask_173_7.dat1
-rw-r--r--library/phpqrcode/cache/mask_7/mask_177_7.datbin0 -> 407 bytes
-rw-r--r--library/phpqrcode/cache/mask_7/mask_21_7.dat4
-rw-r--r--library/phpqrcode/cache/mask_7/mask_25_7.dat1
-rw-r--r--library/phpqrcode/cache/mask_7/mask_29_7.dat2
-rw-r--r--library/phpqrcode/cache/mask_7/mask_33_7.dat1
-rw-r--r--library/phpqrcode/cache/mask_7/mask_37_7.datbin0 -> 122 bytes
-rw-r--r--library/phpqrcode/cache/mask_7/mask_41_7.dat1
-rw-r--r--library/phpqrcode/cache/mask_7/mask_45_7.datbin0 -> 173 bytes
-rw-r--r--library/phpqrcode/cache/mask_7/mask_49_7.dat1
-rw-r--r--library/phpqrcode/cache/mask_7/mask_53_7.dat1
-rw-r--r--library/phpqrcode/cache/mask_7/mask_57_7.dat1
-rw-r--r--library/phpqrcode/cache/mask_7/mask_61_7.dat2
-rw-r--r--library/phpqrcode/cache/mask_7/mask_65_7.dat1
-rw-r--r--library/phpqrcode/cache/mask_7/mask_69_7.datbin0 -> 202 bytes
-rw-r--r--library/phpqrcode/cache/mask_7/mask_73_7.datbin0 -> 221 bytes
-rw-r--r--library/phpqrcode/cache/mask_7/mask_77_7.datbin0 -> 226 bytes
-rw-r--r--library/phpqrcode/cache/mask_7/mask_81_7.dat1
-rw-r--r--library/phpqrcode/cache/mask_7/mask_85_7.datbin0 -> 213 bytes
-rw-r--r--library/phpqrcode/cache/mask_7/mask_89_7.datbin0 -> 244 bytes
-rw-r--r--library/phpqrcode/cache/mask_7/mask_93_7.datbin0 -> 248 bytes
-rw-r--r--library/phpqrcode/cache/mask_7/mask_97_7.dat2
-rw-r--r--library/phpqrcode/index.php94
-rw-r--r--library/phpqrcode/phpqrcode.php3312
-rw-r--r--library/phpqrcode/qrbitstream.php180
-rw-r--r--library/phpqrcode/qrconfig.php17
-rw-r--r--library/phpqrcode/qrconst.php54
-rw-r--r--library/phpqrcode/qrencode.php502
-rw-r--r--library/phpqrcode/qrimage.php95
-rw-r--r--library/phpqrcode/qrinput.php729
-rw-r--r--library/phpqrcode/qrlib.php43
-rw-r--r--library/phpqrcode/qrmask.php328
-rw-r--r--library/phpqrcode/qrrscode.php210
-rw-r--r--library/phpqrcode/qrspec.php592
-rw-r--r--library/phpqrcode/qrsplit.php311
-rw-r--r--library/phpqrcode/qrtools.php172
-rw-r--r--library/phpqrcode/tools/merge.bat2
-rw-r--r--library/phpqrcode/tools/merge.php70
-rw-r--r--library/phpqrcode/tools/merge.sh2
-rw-r--r--library/phpqrcode/tools/merged_config.php17
-rw-r--r--library/phpqrcode/tools/merged_header.php36
-rwxr-xr-xlibrary/prettyphoto/README30
-rw-r--r--library/prettyphoto/css/prettyPhoto.css170
-rwxr-xr-xlibrary/prettyphoto/images/prettyPhoto/dark_rounded/btnNext.pngbin0 -> 1411 bytes
-rwxr-xr-xlibrary/prettyphoto/images/prettyPhoto/dark_rounded/btnPrevious.pngbin0 -> 1442 bytes
-rwxr-xr-xlibrary/prettyphoto/images/prettyPhoto/dark_rounded/contentPattern.pngbin0 -> 130 bytes
-rwxr-xr-xlibrary/prettyphoto/images/prettyPhoto/dark_rounded/default_thumbnail.gifbin0 -> 227 bytes
-rwxr-xr-xlibrary/prettyphoto/images/prettyPhoto/dark_rounded/loader.gifbin0 -> 2545 bytes
-rwxr-xr-xlibrary/prettyphoto/images/prettyPhoto/dark_rounded/sprite.pngbin0 -> 4076 bytes
-rwxr-xr-xlibrary/prettyphoto/images/prettyPhoto/dark_square/btnNext.pngbin0 -> 1411 bytes
-rwxr-xr-xlibrary/prettyphoto/images/prettyPhoto/dark_square/btnPrevious.pngbin0 -> 1442 bytes
-rwxr-xr-xlibrary/prettyphoto/images/prettyPhoto/dark_square/contentPattern.pngbin0 -> 121 bytes
-rwxr-xr-xlibrary/prettyphoto/images/prettyPhoto/dark_square/default_thumbnail.gifbin0 -> 227 bytes
-rwxr-xr-xlibrary/prettyphoto/images/prettyPhoto/dark_square/loader.gifbin0 -> 2545 bytes
-rwxr-xr-xlibrary/prettyphoto/images/prettyPhoto/dark_square/sprite.pngbin0 -> 3507 bytes
-rw-r--r--library/prettyphoto/images/prettyPhoto/default/default_thumb.pngbin0 -> 1537 bytes
-rw-r--r--library/prettyphoto/images/prettyPhoto/default/loader.gifbin0 -> 6331 bytes
-rw-r--r--library/prettyphoto/images/prettyPhoto/default/sprite.pngbin0 -> 6682 bytes
-rw-r--r--library/prettyphoto/images/prettyPhoto/default/sprite_next.pngbin0 -> 1358 bytes
-rw-r--r--library/prettyphoto/images/prettyPhoto/default/sprite_prev.pngbin0 -> 1376 bytes
-rw-r--r--library/prettyphoto/images/prettyPhoto/default/sprite_x.pngbin0 -> 1097 bytes
-rw-r--r--library/prettyphoto/images/prettyPhoto/default/sprite_y.pngbin0 -> 1162 bytes
-rwxr-xr-xlibrary/prettyphoto/images/prettyPhoto/facebook/btnNext.pngbin0 -> 845 bytes
-rwxr-xr-xlibrary/prettyphoto/images/prettyPhoto/facebook/btnPrevious.pngbin0 -> 828 bytes
-rwxr-xr-xlibrary/prettyphoto/images/prettyPhoto/facebook/contentPatternBottom.pngbin0 -> 142 bytes
-rwxr-xr-xlibrary/prettyphoto/images/prettyPhoto/facebook/contentPatternLeft.pngbin0 -> 137 bytes
-rwxr-xr-xlibrary/prettyphoto/images/prettyPhoto/facebook/contentPatternRight.pngbin0 -> 136 bytes
-rwxr-xr-xlibrary/prettyphoto/images/prettyPhoto/facebook/contentPatternTop.pngbin0 -> 142 bytes
-rwxr-xr-xlibrary/prettyphoto/images/prettyPhoto/facebook/default_thumbnail.gifbin0 -> 227 bytes
-rwxr-xr-xlibrary/prettyphoto/images/prettyPhoto/facebook/loader.gifbin0 -> 2545 bytes
-rwxr-xr-xlibrary/prettyphoto/images/prettyPhoto/facebook/sprite.pngbin0 -> 4227 bytes
-rwxr-xr-xlibrary/prettyphoto/images/prettyPhoto/light_rounded/btnNext.pngbin0 -> 1411 bytes
-rwxr-xr-xlibrary/prettyphoto/images/prettyPhoto/light_rounded/btnPrevious.pngbin0 -> 1442 bytes
-rwxr-xr-xlibrary/prettyphoto/images/prettyPhoto/light_rounded/default_thumbnail.gifbin0 -> 227 bytes
-rwxr-xr-xlibrary/prettyphoto/images/prettyPhoto/light_rounded/loader.gifbin0 -> 2545 bytes
-rwxr-xr-xlibrary/prettyphoto/images/prettyPhoto/light_rounded/sprite.pngbin0 -> 4099 bytes
-rwxr-xr-xlibrary/prettyphoto/images/prettyPhoto/light_square/btnNext.pngbin0 -> 1411 bytes
-rwxr-xr-xlibrary/prettyphoto/images/prettyPhoto/light_square/btnPrevious.pngbin0 -> 1442 bytes
-rwxr-xr-xlibrary/prettyphoto/images/prettyPhoto/light_square/default_thumbnail.gifbin0 -> 227 bytes
-rwxr-xr-xlibrary/prettyphoto/images/prettyPhoto/light_square/loader.gifbin0 -> 2545 bytes
-rwxr-xr-xlibrary/prettyphoto/images/prettyPhoto/light_square/sprite.pngbin0 -> 3507 bytes
-rwxr-xr-xlibrary/prettyphoto/js/jquery-1.3.2.min.js19
-rw-r--r--library/prettyphoto/js/jquery-1.4.4.min.js167
-rw-r--r--library/prettyphoto/js/jquery-1.6.1.min.js18
-rw-r--r--library/prettyphoto/js/jquery.prettyPhoto.js7
-rw-r--r--library/tinymce/jscripts/tiny_mce/plugins/bbcode/editor_plugin.js2
-rw-r--r--library/tinymce/jscripts/tiny_mce/plugins/bbcode/editor_plugin_src.js59
-rw-r--r--mod/_well_known.php13
-rw-r--r--mod/achievements.php84
-rw-r--r--mod/acl.php92
-rw-r--r--mod/admin.php200
-rw-r--r--mod/allfriends.php60
-rw-r--r--mod/attach.php18
-rw-r--r--mod/authtest.php50
-rw-r--r--mod/blocks.php102
-rw-r--r--mod/chanman.php31
-rw-r--r--mod/channel.php187
-rw-r--r--mod/chanview.php35
-rw-r--r--mod/cloud.php92
-rw-r--r--mod/common.php8
-rw-r--r--mod/community.php8
-rw-r--r--mod/connect.php124
-rw-r--r--mod/connections.php415
-rw-r--r--mod/connedit.php497
-rw-r--r--mod/contactgroup.php2
-rw-r--r--mod/crepair.php171
-rw-r--r--mod/directory.php85
-rw-r--r--mod/dirfind.php68
-rw-r--r--mod/dirprofile.php185
-rw-r--r--mod/dirsearch.php179
-rw-r--r--mod/display.php131
-rw-r--r--mod/editblock.php169
-rw-r--r--mod/editlayout.php153
-rw-r--r--mod/editpost.php55
-rw-r--r--mod/editwebpage.php195
-rwxr-xr-xmod/events.php44
-rw-r--r--mod/fbrowser.php7
-rw-r--r--mod/feed.php14
-rw-r--r--mod/filestorage.php180
-rw-r--r--mod/follow.php23
-rw-r--r--mod/fsuggest.php5
-rw-r--r--mod/group.php32
-rw-r--r--mod/hcard.php53
-rw-r--r--mod/help.php58
-rw-r--r--mod/home.php88
-rw-r--r--mod/import.php125
-rw-r--r--mod/intro.php110
-rw-r--r--mod/invite.php52
-rw-r--r--mod/item.php877
-rw-r--r--mod/layouts.php111
-rwxr-xr-xmod/like.php39
-rw-r--r--mod/lockview.php4
-rw-r--r--mod/magic.php168
-rw-r--r--mod/mail.php349
-rw-r--r--mod/manage.php17
-rw-r--r--mod/match.php12
-rw-r--r--mod/menu.php118
-rw-r--r--mod/message.php371
-rw-r--r--mod/mitem.php197
-rwxr-xr-xmod/mood.php30
-rw-r--r--mod/network.php457
-rw-r--r--mod/nogroup.php65
-rw-r--r--mod/notes.php16
-rw-r--r--mod/notifications.php414
-rw-r--r--mod/oembed.php2
-rw-r--r--mod/oexchange.php24
-rw-r--r--mod/page.php86
-rw-r--r--mod/parse_url.php44
-rw-r--r--mod/photo.php34
-rw-r--r--mod/photos.php635
-rw-r--r--mod/ping.php8
-rwxr-xr-xmod/poke.php166
-rw-r--r--mod/post.php807
-rw-r--r--mod/probe.php14
-rw-r--r--mod/profile.php88
-rw-r--r--mod/profile_photo.php64
-rw-r--r--mod/profiles.php32
-rw-r--r--mod/profperm.php9
-rw-r--r--mod/pubsites.php42
-rw-r--r--mod/qsearch.php50
-rw-r--r--mod/randprof.php3
-rw-r--r--mod/redir.php60
-rw-r--r--mod/register.php29
-rw-r--r--mod/removeme.php21
-rw-r--r--mod/rpost.php122
-rw-r--r--mod/search.php185
-rw-r--r--mod/search_ac.php36
-rw-r--r--mod/settings.php287
-rwxr-xr-xmod/setup.php126
-rw-r--r--mod/share.php73
-rw-r--r--mod/siteinfo.php64
-rw-r--r--mod/sitelist.php51
-rw-r--r--mod/sources.php161
-rw-r--r--mod/sslify.php24
-rw-r--r--mod/starred.php8
-rwxr-xr-xmod/subthread.php25
-rw-r--r--mod/suggest.php59
-rw-r--r--mod/tagger.php193
-rw-r--r--mod/thing.php324
-rw-r--r--mod/toggle_mobile.php4
-rw-r--r--mod/toggle_safesearch.php25
-rw-r--r--mod/update_channel.php20
-rw-r--r--mod/update_display.php13
-rw-r--r--mod/update_network.php25
-rw-r--r--mod/update_search.php66
-rw-r--r--mod/view.php2
-rw-r--r--mod/viewconnections.php47
-rw-r--r--mod/wall_upload.php7
-rw-r--r--mod/webpages.php127
-rw-r--r--mod/wfinger.php99
-rw-r--r--mod/xref.php20
-rw-r--r--mod/zfinger.php131
-rw-r--r--mod/zotfeed.php6
-rw-r--r--mod/zperms.php84
-rw-r--r--mod/zping.php28
-rw-r--r--spec/dfrn-snap2.jpgbin246724 -> 0 bytes
-rw-r--r--spec/dfrn2.odtbin209276 -> 0 bytes
-rw-r--r--spec/dfrn2.pdfbin304958 -> 0 bytes
-rw-r--r--spec/zot-2012.txt44
-rw-r--r--spec/zot.txt362
-rw-r--r--util/Doxyfile21
-rw-r--r--util/Doxygen.footer4
-rw-r--r--util/db_update.php20
-rw-r--r--util/fresh.md3
-rwxr-xr-xutil/makedocs2
-rw-r--r--util/messages.po8273
-rwxr-xr-xutil/pconfig34
-rwxr-xr-xutil/precompile_smarty3.php27
-rwxr-xr-xutil/run_xgettext.sh88
-rwxr-xr-xutil/shred/FriendicaOAuth.sh173
-rwxr-xr-xutil/shred/JSON.sh129
-rwxr-xr-xutil/shred/OAuth.sh214
-rwxr-xr-xutil/shred/shred214
-rw-r--r--util/strings.php2385
-rw-r--r--util/tpldebug.php43
-rw-r--r--util/typo.php18
-rw-r--r--util/wp/post_to_red/post_to_red.php489
-rw-r--r--util/wp/post_to_red/readme.txt39
-rw-r--r--vendor/autoload.php7
l---------vendor/bin/sabredav1
l---------vendor/bin/vobjectvalidate.php1
-rw-r--r--vendor/composer/ClassLoader.php246
-rw-r--r--vendor/composer/autoload_classmap.php9
-rw-r--r--vendor/composer/autoload_namespaces.php15
-rw-r--r--vendor/composer/autoload_real.php43
-rw-r--r--vendor/composer/installed.json130
-rw-r--r--vendor/sabre/dav/.gitignore22
-rw-r--r--vendor/sabre/dav/.travis.yml20
-rw-r--r--vendor/sabre/dav/ChangeLog1122
-rw-r--r--vendor/sabre/dav/LICENSE27
-rw-r--r--vendor/sabre/dav/README.md30
-rwxr-xr-xvendor/sabre/dav/bin/googlecode_upload.py248
-rwxr-xr-xvendor/sabre/dav/bin/migrateto17.php284
-rwxr-xr-xvendor/sabre/dav/bin/naturalselection.py140
-rwxr-xr-xvendor/sabre/dav/bin/sabredav2
-rwxr-xr-xvendor/sabre/dav/bin/sabredav.php53
-rw-r--r--vendor/sabre/dav/build.xml79
-rw-r--r--vendor/sabre/dav/docs/caldav-ctag.txt336
-rw-r--r--vendor/sabre/dav/docs/caldav-notifications.txt1568
-rw-r--r--vendor/sabre/dav/docs/caldav-proxy.txt560
-rw-r--r--vendor/sabre/dav/docs/caldav-sharing.txt1624
-rw-r--r--vendor/sabre/dav/docs/draft-daboo-carddav-directory-gateway-02.txt560
-rw-r--r--vendor/sabre/dav/docs/draft-desruisseaux-caldav-sched-10.txt5544
-rw-r--r--vendor/sabre/dav/docs/draft-ietf-httpbis-p1-messaging-11.txt5152
-rw-r--r--vendor/sabre/dav/docs/draft-ietf-httpbis-p4-conditional-11.txt1512
-rw-r--r--vendor/sabre/dav/docs/draft-ietf-httpbis-p5-range-11.txt1512
-rw-r--r--vendor/sabre/dav/docs/draft-ietf-httpbis-p6-cache-11.txt2352
-rw-r--r--vendor/sabre/dav/docs/draft-nottingham-http-new-status-04.txt560
-rw-r--r--vendor/sabre/dav/docs/rfc2425.txt1851
-rw-r--r--vendor/sabre/dav/docs/rfc2426.txt2355
-rw-r--r--vendor/sabre/dav/docs/rfc2518.txt5267
-rw-r--r--vendor/sabre/dav/docs/rfc2616.txt9859
-rw-r--r--vendor/sabre/dav/docs/rfc2617.txt1907
-rw-r--r--vendor/sabre/dav/docs/rfc3253.pdf10329
-rw-r--r--vendor/sabre/dav/docs/rfc3744.pdf6295
-rw-r--r--vendor/sabre/dav/docs/rfc4437.pdf3127
-rw-r--r--vendor/sabre/dav/docs/rfc4790.txt1459
-rw-r--r--vendor/sabre/dav/docs/rfc4791.txt5995
-rw-r--r--vendor/sabre/dav/docs/rfc4918.pdf13609
-rw-r--r--vendor/sabre/dav/docs/rfc5051.txt395
-rw-r--r--vendor/sabre/dav/docs/rfc5397.txt281
-rw-r--r--vendor/sabre/dav/docs/rfc5545.txt9411
-rw-r--r--vendor/sabre/dav/docs/rfc5546.txt7451
-rw-r--r--vendor/sabre/dav/docs/rfc5689.txt675
-rw-r--r--vendor/sabre/dav/docs/rfc5785.txt451
-rw-r--r--vendor/sabre/dav/docs/rfc5789.txt563
-rw-r--r--vendor/sabre/dav/docs/rfc6047.txt1235
-rw-r--r--vendor/sabre/dav/docs/rfc6321.txt3027
-rw-r--r--vendor/sabre/dav/docs/rfc6350.txt4147
-rw-r--r--vendor/sabre/dav/docs/rfc6351.txt1235
-rw-r--r--vendor/sabre/dav/docs/rfc6352.txt2691
-rw-r--r--vendor/sabre/dav/examples/addressbookserver.php56
-rw-r--r--vendor/sabre/dav/examples/basicauth.php26
-rw-r--r--vendor/sabre/dav/examples/digestauth.php25
-rw-r--r--vendor/sabre/dav/examples/simplefsserver.php123
-rw-r--r--vendor/sabre/dav/examples/sql/mysql.addressbook.sql18
-rw-r--r--vendor/sabre/dav/examples/sql/mysql.calendars.sql28
-rw-r--r--vendor/sabre/dav/examples/sql/mysql.locks.sql13
-rw-r--r--vendor/sabre/dav/examples/sql/mysql.principals.sql22
-rw-r--r--vendor/sabre/dav/examples/sql/mysql.users.sql9
-rw-r--r--vendor/sabre/dav/examples/sql/pgsql.addressbook.sql33
-rw-r--r--vendor/sabre/dav/examples/sql/pgsql.calendars.sql42
-rw-r--r--vendor/sabre/dav/examples/sql/pgsql.locks.sql13
-rw-r--r--vendor/sabre/dav/examples/sql/pgsql.principals.sql40
-rw-r--r--vendor/sabre/dav/examples/sql/pgsql.users.sql15
-rw-r--r--vendor/sabre/dav/examples/sql/sqlite.addressbooks.sql17
-rw-r--r--vendor/sabre/dav/examples/sql/sqlite.calendars.sql26
-rw-r--r--vendor/sabre/dav/examples/sql/sqlite.locks.sql12
-rw-r--r--vendor/sabre/dav/examples/sql/sqlite.principals.sql21
-rw-r--r--vendor/sabre/dav/examples/sql/sqlite.users.sql9
-rw-r--r--vendor/sabre/dav/examples/webserver/apache2_htaccess.conf16
-rw-r--r--vendor/sabre/dav/examples/webserver/apache2_vhost.conf33
-rw-r--r--vendor/sabre/dav/examples/webserver/apache2_vhost_cgi.conf21
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/Backend/AbstractBackend.php155
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/Backend/BackendInterface.php233
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/Backend/NotificationSupport.php47
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/Backend/PDO.php691
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/Backend/SharingSupport.php243
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/Calendar.php376
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/CalendarObject.php279
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/CalendarQueryParser.php298
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/CalendarQueryValidator.php392
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/CalendarRootNode.php77
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/Exception/InvalidComponentType.php35
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/ICSExportPlugin.php142
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/ICalendar.php36
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/ICalendarObject.php21
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/IShareableCalendar.php48
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/ISharedCalendar.php36
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/Notifications/Collection.php173
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/Notifications/ICollection.php24
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/Notifications/INode.php38
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/Notifications/INotificationType.php44
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/Notifications/Node.php192
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/Notifications/Notification/Invite.php324
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/Notifications/Notification/InviteReply.php218
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/Notifications/Notification/SystemStatus.php182
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/Plugin.php1338
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/Principal/Collection.php32
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/Principal/IProxyRead.php19
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/Principal/IProxyWrite.php19
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/Principal/ProxyRead.php180
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/Principal/ProxyWrite.php180
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/Principal/User.php134
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/Property/AllowedSharingModes.php74
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/Property/Invite.php227
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/Property/ScheduleCalendarTransp.php102
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/Property/SupportedCalendarComponentSet.php88
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/Property/SupportedCalendarData.php40
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/Property/SupportedCollationSet.php45
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/Schedule/IMip.php111
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/Schedule/IOutbox.php16
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/Schedule/Outbox.php163
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/ShareableCalendar.php72
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/SharedCalendar.php116
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/SharingPlugin.php526
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/UserCalendars.php342
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/Version.php24
-rw-r--r--vendor/sabre/dav/lib/Sabre/CardDAV/AddressBook.php315
-rw-r--r--vendor/sabre/dav/lib/Sabre/CardDAV/AddressBookQueryParser.php221
-rw-r--r--vendor/sabre/dav/lib/Sabre/CardDAV/AddressBookRoot.php80
-rw-r--r--vendor/sabre/dav/lib/Sabre/CardDAV/Backend/AbstractBackend.php18
-rw-r--r--vendor/sabre/dav/lib/Sabre/CardDAV/Backend/BackendInterface.php166
-rw-r--r--vendor/sabre/dav/lib/Sabre/CardDAV/Backend/PDO.php333
-rw-r--r--vendor/sabre/dav/lib/Sabre/CardDAV/Card.php260
-rw-r--r--vendor/sabre/dav/lib/Sabre/CardDAV/IAddressBook.php20
-rw-r--r--vendor/sabre/dav/lib/Sabre/CardDAV/ICard.php20
-rw-r--r--vendor/sabre/dav/lib/Sabre/CardDAV/IDirectory.php21
-rw-r--r--vendor/sabre/dav/lib/Sabre/CardDAV/Plugin.php706
-rw-r--r--vendor/sabre/dav/lib/Sabre/CardDAV/Property/SupportedAddressData.php72
-rw-r--r--vendor/sabre/dav/lib/Sabre/CardDAV/UserAddressBooks.php260
-rw-r--r--vendor/sabre/dav/lib/Sabre/CardDAV/VCFExportPlugin.php108
-rw-r--r--vendor/sabre/dav/lib/Sabre/CardDAV/Version.php26
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Auth/Backend/AbstractBasic.php87
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Auth/Backend/AbstractDigest.php101
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Auth/Backend/Apache.php63
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Auth/Backend/BackendInterface.php36
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Auth/Backend/File.php77
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Auth/Backend/PDO.php65
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Auth/Plugin.php112
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Browser/GuessContentType.php99
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Browser/MapGetToPropFind.php57
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Browser/Plugin.php491
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Browser/assets/icons/addressbook.pngbin0 -> 7232 bytes
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Browser/assets/icons/calendar.pngbin0 -> 4388 bytes
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Browser/assets/icons/card.pngbin0 -> 5695 bytes
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Browser/assets/icons/collection.pngbin0 -> 3474 bytes
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Browser/assets/icons/file.pngbin0 -> 2837 bytes
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Browser/assets/icons/parent.pngbin0 -> 3474 bytes
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Browser/assets/icons/principal.pngbin0 -> 5480 bytes
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Client.php566
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Collection.php110
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Exception.php64
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Exception/BadRequest.php28
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Exception/Conflict.php28
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Exception/ConflictingLock.php37
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Exception/FileNotFound.php19
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Exception/Forbidden.php27
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Exception/InsufficientStorage.php27
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Exception/InvalidResourceType.php33
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Exception/LockTokenMatchesRequestUri.php41
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Exception/Locked.php73
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Exception/MethodNotAllowed.php45
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Exception/NotAuthenticated.php30
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Exception/NotFound.php28
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Exception/NotImplemented.php27
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Exception/PaymentRequired.php30
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Exception/PreconditionFailed.php71
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Exception/ReportNotSupported.php32
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Exception/RequestedRangeNotSatisfiable.php31
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Exception/ServiceUnavailable.php30
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Exception/UnsupportedMediaType.php28
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/FS/Directory.php140
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/FS/File.php91
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/FS/Node.php82
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/FSExt/Directory.php159
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/FSExt/File.php118
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/FSExt/Node.php214
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/File.php85
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/ICollection.php77
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/IExtendedCollection.php28
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/IFile.php77
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/INode.php46
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/IProperties.php71
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/IQuota.php27
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Locks/Backend/AbstractBackend.php21
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Locks/Backend/BackendInterface.php51
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Locks/Backend/FS.php193
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Locks/Backend/File.php183
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Locks/Backend/PDO.php167
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Locks/LockInfo.php81
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Locks/Plugin.php642
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Mount/Plugin.php83
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Node.php55
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/ObjectTree.php159
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/PartialUpdate/IFile.php40
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/PartialUpdate/Plugin.php212
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Property.php31
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Property/GetLastModified.php78
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Property/Href.php99
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Property/HrefList.php105
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Property/IHref.php25
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Property/LockDiscovery.php104
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Property/ResourceType.php127
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Property/Response.php157
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Property/ResponseList.php59
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Property/SupportedLock.php78
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Property/SupportedReportSet.php111
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/PropertyInterface.php21
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Server.php2175
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/ServerPlugin.php90
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/SimpleCollection.php108
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/SimpleFile.php121
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/StringUtil.php91
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/TemporaryFileFilterPlugin.php289
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Tree.php193
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Tree/Filesystem.php133
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/URLUtil.php121
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/UUIDUtil.php64
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Version.php24
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/XMLUtil.php187
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAVACL/AbstractPrincipalCollection.php155
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAVACL/Exception/AceConflict.php35
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAVACL/Exception/NeedPrivileges.php83
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAVACL/Exception/NoAbstract.php35
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAVACL/Exception/NotRecognizedPrincipal.php35
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAVACL/Exception/NotSupportedPrivilege.php35
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAVACL/IACL.php74
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAVACL/IPrincipal.php77
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAVACL/IPrincipalCollection.php42
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAVACL/Plugin.php1402
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAVACL/Principal.php281
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAVACL/PrincipalBackend/AbstractBackend.php18
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAVACL/PrincipalBackend/BackendInterface.php153
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAVACL/PrincipalBackend/PDO.php428
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAVACL/PrincipalCollection.php33
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAVACL/Property/Acl.php211
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAVACL/Property/AclRestrictions.php34
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAVACL/Property/CurrentUserPrivilegeSet.php124
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAVACL/Property/Principal.php161
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAVACL/Property/SupportedPrivilegeSet.php94
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAVACL/Version.php24
-rw-r--r--vendor/sabre/dav/lib/Sabre/HTTP/AWSAuth.php227
-rw-r--r--vendor/sabre/dav/lib/Sabre/HTTP/AbstractAuth.php111
-rw-r--r--vendor/sabre/dav/lib/Sabre/HTTP/BasicAuth.php67
-rw-r--r--vendor/sabre/dav/lib/Sabre/HTTP/DigestAuth.php240
-rw-r--r--vendor/sabre/dav/lib/Sabre/HTTP/Request.php284
-rw-r--r--vendor/sabre/dav/lib/Sabre/HTTP/Response.php175
-rw-r--r--vendor/sabre/dav/lib/Sabre/HTTP/Util.php82
-rw-r--r--vendor/sabre/dav/lib/Sabre/HTTP/Version.php24
-rw-r--r--vendor/sabre/dav/lib/Sabre/autoload.php25
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/Backend/AbstractPDOTest.php550
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/Backend/AbstractTest.php88
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/Backend/Mock.php400
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/Backend/PDOMySQLTest.php39
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/Backend/PDOSqliteTest.php25
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/CalendarObjectTest.php359
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/CalendarQueryParserTest.php540
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/CalendarQueryVAlarmTest.php122
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/CalendarQueryValidatorTest.php804
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/CalendarTest.php255
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/ExpandEventsDTSTARTandDTENDTest.php110
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/ExpandEventsDTSTARTandDTENDbyDayTest.php104
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/ExpandEventsDoubleEventsTest.php104
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/FreeBusyReportTest.php159
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/FreeBusyRequestTest.php282
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/GetEventsByTimerangeTest.php97
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/ICSExportPluginTest.php227
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/Issue166Test.php63
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/Issue172Test.php135
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/Issue203Test.php139
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/Issue205Test.php98
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/Issue211Test.php90
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/Issue220Test.php100
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/Issue228Test.php78
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/Notifications/CollectionTest.php90
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/Notifications/NodeTest.php101
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/Notifications/Notification/InviteReplyTest.php134
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/Notifications/Notification/InviteTest.php230
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/Notifications/Notification/SystemStatusTest.php61
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/OutboxPostTest.php545
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/PluginTest.php1126
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/Principal/CollectionTest.php19
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/Principal/ProxyReadTest.php101
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/Principal/ProxyWriteTest.php39
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/Principal/UserTest.php126
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/Property/AllowedSharingModesTest.php46
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/Property/InviteTest.php196
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/Property/ScheduleCalendarTranspTest.php99
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/Property/SupportedCalendarComponentSetTest.php67
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/Property/SupportedCalendarDataTest.php44
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/Property/SupportedCollationSetTest.php46
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/Schedule/IMip/Mock.php52
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/Schedule/OutboxTest.php68
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/ShareableCalendarTest.php62
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/SharedCalendarTest.php122
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/SharingPluginTest.php391
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/TestUtil.php208
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/UserCalendarsSharedCalendarsTest.php93
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/UserCalendarsTest.php207
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/ValidateICalTest.php250
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/VersionTest.php17
-rw-r--r--vendor/sabre/dav/tests/Sabre/CardDAV/AbstractPluginTest.php41
-rw-r--r--vendor/sabre/dav/tests/Sabre/CardDAV/AddressBookQueryParserTest.php329
-rw-r--r--vendor/sabre/dav/tests/Sabre/CardDAV/AddressBookQueryTest.php192
-rw-r--r--vendor/sabre/dav/tests/Sabre/CardDAV/AddressBookRootTest.php31
-rw-r--r--vendor/sabre/dav/tests/Sabre/CardDAV/AddressBookTest.php162
-rw-r--r--vendor/sabre/dav/tests/Sabre/CardDAV/Backend/AbstractPDOTest.php249
-rw-r--r--vendor/sabre/dav/tests/Sabre/CardDAV/Backend/Mock.php130
-rw-r--r--vendor/sabre/dav/tests/Sabre/CardDAV/Backend/PDOMySQLTest.php60
-rw-r--r--vendor/sabre/dav/tests/Sabre/CardDAV/Backend/PDOSqliteTest.php69
-rw-r--r--vendor/sabre/dav/tests/Sabre/CardDAV/CardTest.php184
-rw-r--r--vendor/sabre/dav/tests/Sabre/CardDAV/IDirectoryTest.php30
-rw-r--r--vendor/sabre/dav/tests/Sabre/CardDAV/MultiGetTest.php55
-rw-r--r--vendor/sabre/dav/tests/Sabre/CardDAV/PluginTest.php149
-rw-r--r--vendor/sabre/dav/tests/Sabre/CardDAV/Property/SupportedAddressDataTest.php44
-rw-r--r--vendor/sabre/dav/tests/Sabre/CardDAV/SogoStripContentTypeTest.php43
-rw-r--r--vendor/sabre/dav/tests/Sabre/CardDAV/TestUtil.php68
-rw-r--r--vendor/sabre/dav/tests/Sabre/CardDAV/UserAddressBooksTest.php162
-rw-r--r--vendor/sabre/dav/tests/Sabre/CardDAV/VCFExportTest.php75
-rw-r--r--vendor/sabre/dav/tests/Sabre/CardDAV/ValidateFilterTest.php204
-rw-r--r--vendor/sabre/dav/tests/Sabre/CardDAV/ValidateVCardTest.php155
-rw-r--r--vendor/sabre/dav/tests/Sabre/CardDAV/VersionTest.php17
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/AbstractServer.php64
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/Auth/Backend/AbstractBasicTest.php91
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/Auth/Backend/AbstractDigestTest.php149
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/Auth/Backend/AbstractPDOTest.php35
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/Auth/Backend/ApacheTest.php45
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/Auth/Backend/FileTest.php42
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/Auth/Backend/Mock.php37
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/Auth/Backend/PDOMySQLTest.php31
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/Auth/Backend/PDOSqliteTest.php28
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/Auth/PluginTest.php84
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/BasicNodeTest.php234
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/Browser/GuessContentTypeTest.php68
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/Browser/MapGetToPropFindTest.php44
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/Browser/PluginTest.php114
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/ClientMock.php32
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/ClientTest.php949
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/Exception/LockedTest.php68
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/Exception/PaymentRequiredTest.php14
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/ExceptionTest.php30
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/FSExt/FileTest.php95
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/FSExt/NodeTest.php178
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/FSExt/ServerTest.php224
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/HTTPPreferParsingTest.php200
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/Issue33Test.php105
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/Locks/Backend/AbstractTest.php196
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/Locks/Backend/FSTest.php31
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/Locks/Backend/FileTest.php24
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/Locks/Backend/PDOMySQLTest.php32
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/Locks/Backend/PDOTest.php29
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/Locks/GetIfConditionsTest.php375
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/Locks/MSWordTest.php123
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/Locks/PluginTest.php966
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/Mount/PluginTest.php58
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/ObjectTreeTest.php100
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/PartialUpdate/FileMock.php79
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/PartialUpdate/PluginTest.php130
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/Property/GetLastModifiedTest.php75
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/Property/HrefListTest.php91
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/Property/HrefTest.php119
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/Property/ResourceTypeTest.php111
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/Property/ResponseListTest.php19
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/Property/ResponseTest.php230
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/Property/SupportedReportSetTest.php128
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/ServerCopyMoveTest.php268
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/ServerEventsTest.php76
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/ServerFinderBlockTest.php53
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/ServerMKCOLTest.php371
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/ServerPluginTest.php98
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/ServerPreconditionTest.php395
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/ServerPropsTest.php413
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/ServerRangeTest.php274
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/ServerSimpleTest.php767
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/ServerUpdatePropertiesTest.php130
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/SimpleFileTest.php19
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/StringUtilTest.php122
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/TemporaryFileFilterTest.php252
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/TestPlugin.php34
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/Tree/FilesystemTest.php88
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/TreeTest.php175
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/URLUtilTest.php131
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/UUIDUtilTest.php25
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/XMLUtilTest.php284
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAVACL/ACLMethodTest.php331
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAVACL/AllowAccessTest.php139
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAVACL/BlockAccessTest.php190
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAVACL/Exception/AceConflictTest.php39
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAVACL/Exception/NeedPrivilegesExceptionTest.php49
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAVACL/Exception/NoAbstractTest.php39
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAVACL/Exception/NotRecognizedPrincipalTest.php39
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAVACL/Exception/NotSupportedPrivilegeTest.php39
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAVACL/ExpandPropertiesTest.php358
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAVACL/MockACLNode.php56
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAVACL/MockPrincipal.php66
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAVACL/PluginAdminTest.php83
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAVACL/PluginPropertiesTest.php407
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAVACL/PluginUpdatePropertiesTest.php127
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAVACL/PrincipalBackend/AbstractPDOTest.php178
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAVACL/PrincipalBackend/Mock.php184
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAVACL/PrincipalBackend/PDOMySQLTest.php45
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAVACL/PrincipalBackend/PDOSqliteTest.php42
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAVACL/PrincipalCollectionTest.php52
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAVACL/PrincipalPropertySearchTest.php246
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAVACL/PrincipalSearchPropertySetTest.php135
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAVACL/PrincipalTest.php204
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAVACL/Property/ACLRestrictionsTest.php35
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAVACL/Property/ACLTest.php335
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAVACL/Property/CurrentUserPrivilegeSetTest.php68
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAVACL/Property/PrincipalTest.php181
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAVACL/Property/SupportedPrivilegeSetTest.php106
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAVACL/SimplePluginTest.php322
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAVACL/VersionTest.php17
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAVServerTest.php179
-rw-r--r--vendor/sabre/dav/tests/Sabre/HTTP/AWSAuthTest.php242
-rw-r--r--vendor/sabre/dav/tests/Sabre/HTTP/BasicAuthTest.php132
-rw-r--r--vendor/sabre/dav/tests/Sabre/HTTP/DigestAuthTest.php228
-rw-r--r--vendor/sabre/dav/tests/Sabre/HTTP/RequestTest.php150
-rw-r--r--vendor/sabre/dav/tests/Sabre/HTTP/ResponseMock.php29
-rw-r--r--vendor/sabre/dav/tests/Sabre/HTTP/ResponseTest.php70
-rw-r--r--vendor/sabre/dav/tests/Sabre/HTTP/UtilTest.php78
-rw-r--r--vendor/sabre/dav/tests/Sabre/HTTP/VersionTest.php17
-rw-r--r--vendor/sabre/dav/tests/Sabre/TestUtil.php51
-rw-r--r--vendor/sabre/dav/tests/bootstrap.php22
-rw-r--r--vendor/sabre/dav/tests/phpunit.xml29
-rw-r--r--vendor/sabre/vobject/.gitignore4
-rw-r--r--vendor/sabre/vobject/.travis.yml9
-rw-r--r--vendor/sabre/vobject/ChangeLog84
-rw-r--r--vendor/sabre/vobject/LICENSE27
-rw-r--r--vendor/sabre/vobject/README.md384
-rwxr-xr-xvendor/sabre/vobject/bin/bench.php12
-rwxr-xr-xvendor/sabre/vobject/bin/generateicalendardata.php91
-rwxr-xr-xvendor/sabre/vobject/bin/vobjectvalidate.php139
-rw-r--r--vendor/sabre/vobject/lib/Sabre/VObject/Component.php405
-rw-r--r--vendor/sabre/vobject/lib/Sabre/VObject/Component/VAlarm.php108
-rw-r--r--vendor/sabre/vobject/lib/Sabre/VObject/Component/VCalendar.php244
-rw-r--r--vendor/sabre/vobject/lib/Sabre/VObject/Component/VCard.php107
-rw-r--r--vendor/sabre/vobject/lib/Sabre/VObject/Component/VEvent.php70
-rw-r--r--vendor/sabre/vobject/lib/Sabre/VObject/Component/VFreeBusy.php68
-rw-r--r--vendor/sabre/vobject/lib/Sabre/VObject/Component/VJournal.php46
-rw-r--r--vendor/sabre/vobject/lib/Sabre/VObject/Component/VTodo.php68
-rw-r--r--vendor/sabre/vobject/lib/Sabre/VObject/DateTimeParser.php181
-rw-r--r--vendor/sabre/vobject/lib/Sabre/VObject/Document.php109
-rw-r--r--vendor/sabre/vobject/lib/Sabre/VObject/ElementList.php172
-rw-r--r--vendor/sabre/vobject/lib/Sabre/VObject/FreeBusyGenerator.php322
-rw-r--r--vendor/sabre/vobject/lib/Sabre/VObject/Node.php187
-rw-r--r--vendor/sabre/vobject/lib/Sabre/VObject/Parameter.php104
-rw-r--r--vendor/sabre/vobject/lib/Sabre/VObject/ParseException.php12
-rw-r--r--vendor/sabre/vobject/lib/Sabre/VObject/Property.php444
-rw-r--r--vendor/sabre/vobject/lib/Sabre/VObject/Property/Compound.php125
-rw-r--r--vendor/sabre/vobject/lib/Sabre/VObject/Property/DateTime.php245
-rw-r--r--vendor/sabre/vobject/lib/Sabre/VObject/Property/MultiDateTime.php180
-rw-r--r--vendor/sabre/vobject/lib/Sabre/VObject/Reader.php223
-rw-r--r--vendor/sabre/vobject/lib/Sabre/VObject/RecurrenceIterator.php1144
-rw-r--r--vendor/sabre/vobject/lib/Sabre/VObject/Splitter/ICalendar.php111
-rw-r--r--vendor/sabre/vobject/lib/Sabre/VObject/Splitter/SplitterInterface.php39
-rw-r--r--vendor/sabre/vobject/lib/Sabre/VObject/Splitter/VCard.php76
-rw-r--r--vendor/sabre/vobject/lib/Sabre/VObject/StringUtil.php61
-rw-r--r--vendor/sabre/vobject/lib/Sabre/VObject/TimeZoneUtil.php482
-rw-r--r--vendor/sabre/vobject/lib/Sabre/VObject/Version.php24
-rw-r--r--vendor/sabre/vobject/lib/Sabre/VObject/includes.php41
-rw-r--r--vendor/sabre/vobject/tests/Sabre/VObject/Component/VAlarmTest.php175
-rw-r--r--vendor/sabre/vobject/tests/Sabre/VObject/Component/VCalendarTest.php244
-rw-r--r--vendor/sabre/vobject/tests/Sabre/VObject/Component/VCardTest.php100
-rw-r--r--vendor/sabre/vobject/tests/Sabre/VObject/Component/VEventTest.php74
-rw-r--r--vendor/sabre/vobject/tests/Sabre/VObject/Component/VFreeBusyTest.php39
-rw-r--r--vendor/sabre/vobject/tests/Sabre/VObject/Component/VJournalTest.php41
-rw-r--r--vendor/sabre/vobject/tests/Sabre/VObject/Component/VTodoTest.php67
-rw-r--r--vendor/sabre/vobject/tests/Sabre/VObject/ComponentTest.php413
-rw-r--r--vendor/sabre/vobject/tests/Sabre/VObject/DateTimeParserTest.php153
-rw-r--r--vendor/sabre/vobject/tests/Sabre/VObject/DocumentTest.php26
-rw-r--r--vendor/sabre/vobject/tests/Sabre/VObject/ElementListTest.php32
-rw-r--r--vendor/sabre/vobject/tests/Sabre/VObject/EmClientTest.php55
-rw-r--r--vendor/sabre/vobject/tests/Sabre/VObject/FreeBusyGeneratorTest.php246
-rw-r--r--vendor/sabre/vobject/tests/Sabre/VObject/Issue153Test.php14
-rw-r--r--vendor/sabre/vobject/tests/Sabre/VObject/Issue154Test.php29
-rw-r--r--vendor/sabre/vobject/tests/Sabre/VObject/Issue48Test.php47
-rw-r--r--vendor/sabre/vobject/tests/Sabre/VObject/Issue50Test.php128
-rw-r--r--vendor/sabre/vobject/tests/Sabre/VObject/ParameterTest.php44
-rw-r--r--vendor/sabre/vobject/tests/Sabre/VObject/Property/CompoundTest.php59
-rw-r--r--vendor/sabre/vobject/tests/Sabre/VObject/Property/DateTimeTest.php240
-rw-r--r--vendor/sabre/vobject/tests/Sabre/VObject/Property/MultiDateTimeTest.php208
-rw-r--r--vendor/sabre/vobject/tests/Sabre/VObject/PropertyTest.php324
-rw-r--r--vendor/sabre/vobject/tests/Sabre/VObject/ReaderTest.php367
-rw-r--r--vendor/sabre/vobject/tests/Sabre/VObject/RecurrenceIteratorFifthTuesdayProblemTest.php44
-rw-r--r--vendor/sabre/vobject/tests/Sabre/VObject/RecurrenceIteratorIncorrectExpandTest.php62
-rw-r--r--vendor/sabre/vobject/tests/Sabre/VObject/RecurrenceIteratorInfiniteLoopProblemTest.php91
-rw-r--r--vendor/sabre/vobject/tests/Sabre/VObject/RecurrenceIteratorMinusOneProblemTest.php30
-rw-r--r--vendor/sabre/vobject/tests/Sabre/VObject/RecurrenceIteratorMissingOverriddenTest.php63
-rw-r--r--vendor/sabre/vobject/tests/Sabre/VObject/RecurrenceIteratorTest.php1425
-rw-r--r--vendor/sabre/vobject/tests/Sabre/VObject/SlashRTest.php19
-rw-r--r--vendor/sabre/vobject/tests/Sabre/VObject/Splitter/ICalendarTest.php283
-rw-r--r--vendor/sabre/vobject/tests/Sabre/VObject/Splitter/VCardTest.php138
-rw-r--r--vendor/sabre/vobject/tests/Sabre/VObject/StringUtilTest.php59
-rw-r--r--vendor/sabre/vobject/tests/Sabre/VObject/TimeZoneUtilTest.php297
-rw-r--r--vendor/sabre/vobject/tests/Sabre/VObject/VersionTest.php17
-rw-r--r--vendor/sabre/vobject/tests/Sabre/VObject/issue153.vcf352
-rw-r--r--vendor/sabre/vobject/tests/bootstrap.php15
-rw-r--r--vendor/sabre/vobject/tests/phpunit.xml17
-rw-r--r--version.inc2
-rw-r--r--view/cs/follow_notify_eml.tpl14
-rw-r--r--view/cs/friend_complete_eml.tpl21
-rw-r--r--view/cs/htconfig.tpl70
-rw-r--r--view/cs/intro_complete_eml.tpl23
-rw-r--r--view/cs/lostpass_eml.tpl35
-rw-r--r--view/cs/passchanged_eml.tpl26
-rw-r--r--view/cs/register_open_eml.tpl30
-rw-r--r--view/cs/register_verify_eml.tpl23
-rw-r--r--view/cs/request_notify_eml.tpl18
-rw-r--r--view/cs/update_fail_eml.tpl13
-rw-r--r--view/css/bootstrap-red.css67
-rw-r--r--view/css/conversation.css436
-rw-r--r--view/css/default.css14
-rw-r--r--view/css/full.css2
-rw-r--r--view/css/mod_admin.css63
-rw-r--r--view/css/mod_connect.css11
-rw-r--r--view/css/mod_connections.css137
-rw-r--r--view/css/mod_connedit.css137
-rw-r--r--view/css/mod_directory.css44
-rw-r--r--view/css/mod_filestorage.css11
-rw-r--r--view/css/mod_group.css66
-rw-r--r--view/css/mod_mail.css100
-rw-r--r--view/css/mod_manage.css17
-rw-r--r--view/css/mod_message.css100
-rw-r--r--view/css/mod_photos.css167
-rw-r--r--view/css/mod_profiles.css156
-rw-r--r--view/css/mod_register.css7
-rw-r--r--view/css/mod_settings.css11
-rw-r--r--view/css/mod_setup.css34
-rw-r--r--view/css/mod_thing.css27
-rw-r--r--view/css/widgets.css123
-rw-r--r--view/de/follow_notify_eml.tpl14
-rw-r--r--view/de/friend_complete_eml.tpl26
-rw-r--r--view/de/htconfig.tpl70
-rw-r--r--view/de/intro_complete_eml.tpl28
-rw-r--r--view/de/lostpass_eml.tpl36
-rw-r--r--view/de/messages.po11416
-rw-r--r--view/de/passchanged_eml.tpl24
-rw-r--r--view/de/register_open_eml.tpl41
-rw-r--r--view/de/register_verify_eml.tpl22
-rw-r--r--view/de/request_notify_eml.tpl18
-rw-r--r--view/de/strings.php3259
-rw-r--r--view/de/update_fail_eml.tpl20
-rw-r--r--view/en/follow_notify_eml.tpl10
-rw-r--r--view/en/friend_complete_eml.tpl14
-rw-r--r--view/en/htconfig.tpl52
-rw-r--r--view/en/intro_complete_eml.tpl18
-rw-r--r--view/en/lostpass_eml.tpl12
-rw-r--r--view/en/passchanged_eml.tpl10
-rw-r--r--view/en/register_open_eml.tpl10
-rw-r--r--view/en/register_verify_eml.tpl12
-rw-r--r--view/en/request_notify_eml.tpl12
-rw-r--r--view/en/update_fail_eml.tpl16
-rw-r--r--view/eo/follow_notify_eml.tpl14
-rw-r--r--view/eo/friend_complete_eml.tpl26
-rw-r--r--view/eo/htconfig.tpl70
-rw-r--r--view/eo/intro_complete_eml.tpl28
-rw-r--r--view/eo/lostpass_eml.tpl36
-rw-r--r--view/eo/passchanged_eml.tpl24
-rw-r--r--view/eo/register_open_eml.tpl41
-rw-r--r--view/eo/register_verify_eml.tpl22
-rw-r--r--view/eo/request_notify_eml.tpl18
-rw-r--r--view/eo/update_fail_eml.tpl20
-rw-r--r--view/es/follow_notify_eml.tpl13
-rw-r--r--view/es/friend_complete_eml.tpl21
-rw-r--r--view/es/htconfig.tpl70
-rw-r--r--view/es/intro_complete_eml.tpl27
-rw-r--r--view/es/lostpass_eml.tpl36
-rw-r--r--view/es/passchanged_eml.tpl21
-rw-r--r--view/es/register_open_eml.tpl26
-rw-r--r--view/es/register_verify_eml.tpl25
-rw-r--r--view/es/request_notify_eml.tpl16
-rw-r--r--view/es/update_fail_eml.tpl13
-rw-r--r--view/fr/follow_notify_eml.tpl14
-rw-r--r--view/fr/friend_complete_eml.tpl25
-rw-r--r--view/fr/htconfig.tpl70
-rw-r--r--view/fr/intro_complete_eml.tpl28
-rw-r--r--view/fr/lostpass_eml.tpl36
-rw-r--r--view/fr/passchanged_eml.tpl24
-rw-r--r--view/fr/register_open_eml.tpl27
-rw-r--r--view/fr/register_verify_eml.tpl24
-rw-r--r--view/fr/request_notify_eml.tpl18
-rw-r--r--view/fr/update_fail_eml.tpl13
-rw-r--r--view/it/follow_notify_eml.tpl14
-rw-r--r--view/it/friend_complete_eml.tpl26
-rw-r--r--view/it/htconfig.tpl70
-rw-r--r--view/it/intro_complete_eml.tpl28
-rw-r--r--view/it/lostpass_eml.tpl36
-rw-r--r--view/it/messages.po12423
-rw-r--r--view/it/passchanged_eml.tpl24
-rw-r--r--view/it/register_open_eml.tpl41
-rw-r--r--view/it/register_verify_eml.tpl22
-rw-r--r--view/it/request_notify_eml.tpl18
-rw-r--r--view/it/strings.php3454
-rw-r--r--view/it/update_fail_eml.tpl13
-rw-r--r--view/js/acl.js270
-rw-r--r--view/js/ajaxupload.js720
-rw-r--r--view/js/autocomplete.js200
-rw-r--r--view/js/crypto.js291
-rw-r--r--view/js/icon_translate.js53
-rw-r--r--view/js/jquery-compat.js71
-rw-r--r--view/js/jquery-migrate-1.1.1.js511
-rw-r--r--view/js/jquery.htmlstream.js (renamed from js/jquery.htmlstream.js)0
-rw-r--r--view/js/jquery.js5
-rw-r--r--view/js/jquery.spin.js80
-rw-r--r--view/js/jquery.textinputs.js (renamed from js/jquery.textinputs.js)0
-rw-r--r--view/js/main.js1211
-rw-r--r--view/js/mod_connections.js58
-rw-r--r--view/js/mod_connedit.js82
-rw-r--r--view/js/mod_directory.js8
-rw-r--r--view/js/mod_mail.js13
-rw-r--r--view/js/mod_message.js5
-rw-r--r--view/js/mod_mitem.js22
-rw-r--r--view/js/mod_network.js10
-rw-r--r--view/js/mod_poke.js14
-rw-r--r--view/js/mod_settings.js99
-rw-r--r--view/js/mod_sources.js15
-rw-r--r--view/js/spin.js349
-rw-r--r--view/js/webtoolkit.base64.js (renamed from js/webtoolkit.base64.js)0
-rw-r--r--view/nb-no/follow_notify_eml.tpl14
-rw-r--r--view/nb-no/friend_complete_eml.tpl26
-rw-r--r--view/nb-no/htconfig.tpl70
-rw-r--r--view/nb-no/intro_complete_eml.tpl28
-rw-r--r--view/nb-no/lostpass_eml.tpl36
-rw-r--r--view/nb-no/passchanged_eml.tpl24
-rw-r--r--view/nb-no/register_open_eml.tpl41
-rw-r--r--view/nb-no/register_verify_eml.tpl22
-rw-r--r--view/nb-no/request_notify_eml.tpl18
-rw-r--r--view/nb-no/update_fail_eml.tpl20
-rw-r--r--view/pdl/mod_blocks.pdl3
-rw-r--r--view/pdl/mod_channel.pdl6
-rw-r--r--view/pdl/mod_chanview.pdl3
-rw-r--r--view/pdl/mod_cloud.pdl3
-rw-r--r--view/pdl/mod_common.pdl3
-rw-r--r--view/pdl/mod_connect.pdl3
-rw-r--r--view/pdl/mod_connections.pdl5
-rw-r--r--view/pdl/mod_connedit.pdl6
-rw-r--r--view/pdl/mod_directory.pdl7
-rw-r--r--view/pdl/mod_group.pdl3
-rw-r--r--view/pdl/mod_layouts.pdl3
-rw-r--r--view/pdl/mod_mail.pdl3
-rw-r--r--view/pdl/mod_menu.pdl3
-rw-r--r--view/pdl/mod_message.pdl3
-rw-r--r--view/pdl/mod_mitem.pdl4
-rw-r--r--view/pdl/mod_network.pdl15
-rw-r--r--view/pdl/mod_new_channel.pdl1
-rw-r--r--view/pdl/mod_photos.pdl4
-rw-r--r--view/pdl/mod_profile.pdl3
-rw-r--r--view/pdl/mod_profile_photo.pdl3
-rw-r--r--view/pdl/mod_profiles.pdl3
-rw-r--r--view/pdl/mod_profperm.pdl3
-rw-r--r--view/pdl/mod_register.pdl1
-rw-r--r--view/pdl/mod_search.pdl3
-rw-r--r--view/pdl/mod_settings.pdl4
-rw-r--r--view/pdl/mod_suggest.pdl4
-rw-r--r--view/pdl/mod_viewconnections.pdl3
-rw-r--r--view/pdl/mod_webpages.pdl3
-rw-r--r--view/php/default.php10
-rw-r--r--view/php/mod_new_channel.php3
-rw-r--r--view/php/mod_register.php3
-rw-r--r--view/php/none.php1
-rw-r--r--view/php/theme_init.php57
-rw-r--r--view/pt-br/follow_notify_eml.tpl14
-rw-r--r--view/pt-br/friend_complete_eml.tpl22
-rw-r--r--view/pt-br/htconfig.tpl70
-rw-r--r--view/pt-br/intro_complete_eml.tpl22
-rw-r--r--view/pt-br/lostpass_eml.tpl32
-rw-r--r--view/pt-br/passchanged_eml.tpl20
-rw-r--r--view/pt-br/register_open_eml.tpl19
-rw-r--r--view/pt-br/register_verify_eml.tpl25
-rw-r--r--view/pt-br/request_notify_eml.tpl17
-rw-r--r--view/pt-br/update_fail_eml.tpl13
-rw-r--r--view/ru/follow_notify_eml.tpl14
-rw-r--r--view/ru/friend_complete_eml.tpl22
-rw-r--r--view/ru/htconfig.tpl70
-rw-r--r--view/ru/intro_complete_eml.tpl22
-rw-r--r--view/ru/lostpass_eml.tpl32
-rw-r--r--view/ru/passchanged_eml.tpl20
-rw-r--r--view/ru/register_open_eml.tpl19
-rw-r--r--view/ru/register_verify_eml.tpl25
-rw-r--r--view/ru/request_notify_eml.tpl17
-rw-r--r--view/ru/update_fail_eml.tpl13
-rw-r--r--view/sv/follow_notify_eml.tpl16
-rw-r--r--view/sv/friend_complete_eml.tpl27
-rw-r--r--view/sv/htconfig.tpl70
-rw-r--r--view/sv/intro_complete_eml.tpl29
-rw-r--r--view/sv/lostpass_eml.tpl39
-rw-r--r--view/sv/passchanged_eml.tpl24
-rw-r--r--view/sv/register_open_eml.tpl24
-rw-r--r--view/sv/register_verify_eml.tpl28
-rw-r--r--view/sv/request_notify_eml.tpl20
-rw-r--r--view/sv/update_fail_eml.tpl13
-rw-r--r--view/theme/fancyred/css/style.css3934
-rw-r--r--view/theme/fancyred/img/bbedit.pngbin2145 -> 0 bytes
-rw-r--r--view/theme/fancyred/img/bg.pngbin119030 -> 0 bytes
-rw-r--r--view/theme/fancyred/img/border.jpgbin342 -> 0 bytes
-rw-r--r--view/theme/fancyred/img/editicons.pngbin6300 -> 0 bytes
-rw-r--r--view/theme/fancyred/img/events.pngbin1686 -> 0 bytes
-rw-r--r--view/theme/fancyred/img/ff-16.jpgbin644 -> 0 bytes
-rw-r--r--view/theme/fancyred/img/file.gifbin613 -> 0 bytes
-rw-r--r--view/theme/fancyred/img/friendika-16.pngbin699 -> 0 bytes
-rw-r--r--view/theme/fancyred/img/head.jpgbin383 -> 0 bytes
-rw-r--r--view/theme/fancyred/img/home.pngbin1198 -> 0 bytes
-rw-r--r--view/theme/fancyred/img/introductions.pngbin1275 -> 0 bytes
-rw-r--r--view/theme/fancyred/img/jotperms.pngbin510 -> 0 bytes
-rw-r--r--view/theme/fancyred/img/lock.curbin4286 -> 0 bytes
-rw-r--r--view/theme/fancyred/img/login-bg.gifbin237 -> 0 bytes
-rw-r--r--view/theme/fancyred/img/message.pngbin765 -> 0 bytes
-rw-r--r--view/theme/fancyred/img/network.pngbin1650 -> 0 bytes
-rw-r--r--view/theme/fancyred/img/notify_on.pngbin721 -> 0 bytes
-rw-r--r--view/theme/fancyred/img/photo-menu.jpgbin459 -> 0 bytes
-rw-r--r--view/theme/fancyred/img/screenshot.jpgbin72559 -> 0 bytes
-rw-r--r--view/theme/fancyred/img/settings.pngbin1609 -> 0 bytes
-rw-r--r--view/theme/fancyred/img/shiny.pngbin362 -> 0 bytes
-rw-r--r--view/theme/fancyred/js/fancyred.js89
-rw-r--r--view/theme/fancyred/php/config.php80
-rw-r--r--view/theme/fancyred/php/style.php99
-rw-r--r--view/theme/fancyred/php/theme.php6
-rw-r--r--view/theme/fancyred/tpl/smarty3/theme_settings.tpl12
-rw-r--r--view/theme/fancyred/tpl/theme_settings.tpl7
-rw-r--r--view/theme/redbasic/css/dark.css186
-rw-r--r--view/theme/redbasic/css/fancy.css107
-rw-r--r--view/theme/redbasic/css/mod_page.css24
-rw-r--r--view/theme/redbasic/css/sloppy_photos.css58
-rw-r--r--view/theme/redbasic/css/style.css2997
-rw-r--r--view/theme/redbasic/img/bg.pngbin119030 -> 0 bytes
-rw-r--r--view/theme/redbasic/img/events.pngbin1686 -> 0 bytes
-rw-r--r--view/theme/redbasic/img/head.jpgbin383 -> 0 bytes
-rw-r--r--view/theme/redbasic/img/home.pngbin1198 -> 0 bytes
-rw-r--r--view/theme/redbasic/img/introductions.pngbin1210 -> 0 bytes
-rw-r--r--view/theme/redbasic/img/lock.curbin4286 -> 0 bytes
-rw-r--r--view/theme/redbasic/img/message.pngbin765 -> 0 bytes
-rw-r--r--view/theme/redbasic/img/network.pngbin1632 -> 0 bytes
-rw-r--r--view/theme/redbasic/img/screenshot.jpgbin72559 -> 135205 bytes
-rw-r--r--view/theme/redbasic/img/settings.pngbin1609 -> 0 bytes
-rw-r--r--view/theme/redbasic/js/redbasic.js72
-rw-r--r--view/theme/redbasic/php/config.php149
-rw-r--r--view/theme/redbasic/php/style.php211
-rw-r--r--view/theme/redbasic/php/theme.php16
-rw-r--r--view/theme/redbasic/php/theme_init.php5
-rw-r--r--view/theme/redbasic/schema/dark.php10
-rw-r--r--view/theme/redbasic/tpl/smarty3/theme_settings.tpl12
-rw-r--r--view/theme/redbasic/tpl/theme_settings.tpl29
-rwxr-xr-x[-rw-r--r--]view/tpl/404.tpl2
-rwxr-xr-x[-rw-r--r--]view/tpl/abook_edit.tpl98
-rwxr-xr-x[-rw-r--r--]view/tpl/acl_selector.tpl8
-rwxr-xr-x[-rw-r--r--]view/tpl/admin_aside.tpl33
-rwxr-xr-xview/tpl/admin_hubloc.tpl22
-rwxr-xr-x[-rw-r--r--]view/tpl/admin_logs.tpl24
-rwxr-xr-x[-rw-r--r--]view/tpl/admin_plugins.tpl18
-rwxr-xr-x[-rw-r--r--]view/tpl/admin_plugins_details.tpl46
-rw-r--r--view/tpl/admin_remoteupdate.tpl98
-rwxr-xr-x[-rw-r--r--]view/tpl/admin_site.tpl71
-rwxr-xr-x[-rw-r--r--]view/tpl/admin_summary.tpl44
-rwxr-xr-x[-rw-r--r--]view/tpl/admin_users.tpl87
-rwxr-xr-x[-rw-r--r--]view/tpl/album_edit.tpl10
-rw-r--r--view/tpl/alt_pager.tpl4
-rwxr-xr-x[-rw-r--r--]view/tpl/api_config_xml.tpl18
-rwxr-xr-x[-rw-r--r--]view/tpl/api_friends_xml.tpl6
-rwxr-xr-x[-rw-r--r--]view/tpl/api_ratelimit_xml.tpl8
-rwxr-xr-x[-rw-r--r--]view/tpl/api_status_xml.tpl84
-rwxr-xr-x[-rw-r--r--]view/tpl/api_test_xml.tpl2
-rwxr-xr-x[-rw-r--r--]view/tpl/api_timeline_atom.tpl96
-rwxr-xr-x[-rw-r--r--]view/tpl/api_timeline_rss.tpl28
-rwxr-xr-x[-rw-r--r--]view/tpl/api_timeline_xml.tpl36
-rwxr-xr-x[-rw-r--r--]view/tpl/api_user_xml.tpl88
-rwxr-xr-x[-rw-r--r--]view/tpl/apps.tpl8
-rwxr-xr-x[-rw-r--r--]view/tpl/atom_feed.tpl31
-rwxr-xr-x[-rw-r--r--]view/tpl/atom_feed_dfrn.tpl24
-rw-r--r--view/tpl/atom_mail.tpl17
-rw-r--r--view/tpl/atom_suggest.tpl11
-rw-r--r--view/tpl/attach_edit.tpl40
-rw-r--r--view/tpl/auto_request.tpl37
-rwxr-xr-x[-rw-r--r--]view/tpl/birthdays_reminder.tpl14
-rwxr-xr-x[-rw-r--r--]view/tpl/build_query.tpl47
-rwxr-xr-x[-rw-r--r--]view/tpl/categories_widget.tpl12
-rwxr-xr-x[-rw-r--r--]view/tpl/channel.tpl18
-rwxr-xr-x[-rw-r--r--]view/tpl/channel_import.tpl26
-rwxr-xr-x[-rw-r--r--]view/tpl/channels.tpl37
-rwxr-xr-x[-rw-r--r--]view/tpl/chanview.tpl4
-rwxr-xr-x[-rw-r--r--]view/tpl/comment_item.tpl110
-rwxr-xr-x[-rw-r--r--]view/tpl/common_friends.tpl11
-rwxr-xr-x[-rw-r--r--]view/tpl/common_tabs.tpl8
-rwxr-xr-x[-rw-r--r--]view/tpl/contact_block.tpl14
-rw-r--r--view/tpl/contact_edit.tpl89
-rwxr-xr-x[-rw-r--r--]view/tpl/contact_head.tpl6
-rwxr-xr-x[-rw-r--r--]view/tpl/contact_slider.tpl4
-rwxr-xr-x[-rw-r--r--]view/tpl/contact_template.tpl7
-rwxr-xr-x[-rw-r--r--]view/tpl/contacts-template.tpl22
-rw-r--r--view/tpl/content.tpl2
-rwxr-xr-x[-rw-r--r--]view/tpl/conv.tpl20
-rwxr-xr-x[-rw-r--r--]view/tpl/conv_frame.tpl11
-rwxr-xr-x[-rw-r--r--]view/tpl/conv_item.tpl161
-rwxr-xr-x[-rw-r--r--]view/tpl/conversation.tpl28
-rwxr-xr-x[-rw-r--r--]view/tpl/convobj.tpl6
-rwxr-xr-x[-rw-r--r--]view/tpl/crepair.tpl41
-rwxr-xr-x[-rw-r--r--]view/tpl/cropbody.tpl14
-rwxr-xr-x[-rw-r--r--]view/tpl/crophead.tpl0
-rwxr-xr-x[-rw-r--r--]view/tpl/delegate.tpl52
-rw-r--r--view/tpl/design_tools.tpl9
-rw-r--r--view/tpl/dfrn_req_confirm.tpl21
-rw-r--r--view/tpl/dfrn_request.tpl59
-rw-r--r--view/tpl/diasp_dec_hdr.tpl8
-rw-r--r--view/tpl/dir_sort_links.tpl6
-rwxr-xr-x[-rw-r--r--]view/tpl/directory_header.tpl14
-rw-r--r--view/tpl/directory_item.tpl11
-rwxr-xr-x[-rw-r--r--]view/tpl/direntry.tpl21
-rwxr-xr-xview/tpl/direntry_large.tpl39
-rwxr-xr-x[-rw-r--r--]view/tpl/display-head.tpl0
-rwxr-xr-xview/tpl/edpage_head.tpl1
-rwxr-xr-x[-rw-r--r--]view/tpl/edpost_head.tpl2
-rwxr-xr-x[-rw-r--r--]view/tpl/email_notify_html.tpl24
-rwxr-xr-x[-rw-r--r--]view/tpl/email_notify_text.tpl15
-rwxr-xr-x[-rw-r--r--]view/tpl/event.tpl12
-rwxr-xr-x[-rw-r--r--]view/tpl/event_form.tpl42
-rwxr-xr-x[-rw-r--r--]view/tpl/event_head.tpl26
-rwxr-xr-x[-rw-r--r--]view/tpl/events-js.tpl6
-rw-r--r--view/tpl/events.tpl24
-rwxr-xr-x[-rw-r--r--]view/tpl/events_reminder.tpl14
-rwxr-xr-x[-rw-r--r--]view/tpl/failed_updates.tpl18
-rw-r--r--view/tpl/fake_feed.tpl13
-rwxr-xr-x[-rw-r--r--]view/tpl/field.tpl7
-rwxr-xr-x[-rw-r--r--]view/tpl/field_acheckbox.tpl9
-rwxr-xr-x[-rw-r--r--]view/tpl/field_checkbox.tpl7
-rwxr-xr-x[-rw-r--r--]view/tpl/field_combobox.tpl23
-rwxr-xr-x[-rw-r--r--]view/tpl/field_custom.tpl7
-rwxr-xr-x[-rw-r--r--]view/tpl/field_input.tpl9
-rwxr-xr-x[-rw-r--r--]view/tpl/field_intcheckbox.tpl7
-rw-r--r--view/tpl/field_openid.tpl6
-rwxr-xr-x[-rw-r--r--]view/tpl/field_password.tpl7
-rwxr-xr-x[-rw-r--r--]view/tpl/field_radio.tpl7
-rwxr-xr-x[-rw-r--r--]view/tpl/field_richtext.tpl7
-rwxr-xr-x[-rw-r--r--]view/tpl/field_select.tpl9
-rwxr-xr-x[-rw-r--r--]view/tpl/field_select_raw.tpl9
-rwxr-xr-x[-rw-r--r--]view/tpl/field_textarea.tpl7
-rwxr-xr-x[-rw-r--r--]view/tpl/field_themeselect.tpl10
-rwxr-xr-x[-rw-r--r--]view/tpl/field_yesno.tpl12
-rwxr-xr-x[-rw-r--r--]view/tpl/fileas_widget.tpl12
-rwxr-xr-x[-rw-r--r--]view/tpl/filebrowser.tpl16
-rwxr-xr-x[-rw-r--r--]view/tpl/filer_dialog.tpl4
-rw-r--r--view/tpl/filestorage.tpl22
-rwxr-xr-x[-rw-r--r--]view/tpl/follow.tpl9
-rw-r--r--view/tpl/follow_slap.tpl25
-rwxr-xr-x[-rw-r--r--]view/tpl/generic_links_widget.tpl12
-rwxr-xr-x[-rw-r--r--]view/tpl/group_drop.tpl10
-rwxr-xr-x[-rw-r--r--]view/tpl/group_edit.tpl21
-rwxr-xr-x[-rw-r--r--]view/tpl/group_selection.tpl8
-rwxr-xr-x[-rw-r--r--]view/tpl/group_side.tpl31
-rwxr-xr-x[-rw-r--r--]view/tpl/groupeditor.tpl8
-rwxr-xr-x[-rw-r--r--]view/tpl/head.tpl21
-rwxr-xr-x[-rw-r--r--]view/tpl/hide_comments.tpl4
-rwxr-xr-x[-rw-r--r--]view/tpl/install.tpl13
-rwxr-xr-x[-rw-r--r--]view/tpl/install_checks.tpl34
-rwxr-xr-x[-rw-r--r--]view/tpl/install_db.tpl32
-rwxr-xr-x[-rw-r--r--]view/tpl/install_settings.tpl32
-rwxr-xr-x[-rw-r--r--]view/tpl/intros.tpl23
-rwxr-xr-x[-rw-r--r--]view/tpl/intros_header.tpl2
-rwxr-xr-x[-rw-r--r--]view/tpl/invite.tpl12
-rw-r--r--view/tpl/item_attach.tpl6
-rw-r--r--view/tpl/item_categories.tpl8
-rw-r--r--view/tpl/item_filer.tpl8
-rwxr-xr-x[-rw-r--r--]view/tpl/jot-header.tpl141
-rwxr-xr-x[-rw-r--r--]view/tpl/jot.tpl141
-rwxr-xr-x[-rw-r--r--]view/tpl/jot_geotag.tpl1
-rwxr-xr-x[-rw-r--r--]view/tpl/js_strings.tpl51
-rwxr-xr-x[-rw-r--r--]view/tpl/lang_selector.tpl8
-rwxr-xr-x[-rw-r--r--]view/tpl/like_noshare.tpl8
-rw-r--r--view/tpl/list_things.tpl13
-rwxr-xr-x[-rw-r--r--]view/tpl/login.tpl23
-rwxr-xr-x[-rw-r--r--]view/tpl/logout.tpl4
-rwxr-xr-x[-rw-r--r--]view/tpl/lostpass.tpl8
-rw-r--r--view/tpl/magicsig.tpl9
-rwxr-xr-x[-rw-r--r--]view/tpl/mail_conv.tpl16
-rwxr-xr-x[-rw-r--r--]view/tpl/mail_display.tpl20
-rwxr-xr-x[-rw-r--r--]view/tpl/mail_head.tpl4
-rwxr-xr-x[-rw-r--r--]view/tpl/mail_list.tpl25
-rwxr-xr-x[-rw-r--r--]view/tpl/main_slider.tpl26
-rwxr-xr-x[-rw-r--r--]view/tpl/match.tpl12
-rw-r--r--view/tpl/menuedit.tpl21
-rw-r--r--view/tpl/menulist.tpl16
-rwxr-xr-x[-rw-r--r--]view/tpl/message_side.tpl9
-rwxr-xr-x[-rw-r--r--]view/tpl/micropro_img.tpl2
-rwxr-xr-x[-rw-r--r--]view/tpl/micropro_txt.tpl2
-rw-r--r--view/tpl/mitemedit.tpl41
-rw-r--r--view/tpl/mitemlist.tpl18
-rw-r--r--view/tpl/moderated_comment.tpl34
-rwxr-xr-x[-rw-r--r--]view/tpl/mood_content.tpl14
-rwxr-xr-x[-rw-r--r--]view/tpl/msg-header.tpl61
-rwxr-xr-x[-rw-r--r--]view/tpl/nav.tpl182
-rwxr-xr-x[-rw-r--r--]view/tpl/netfriend.tpl10
-rwxr-xr-x[-rw-r--r--]view/tpl/new_channel.tpl20
-rwxr-xr-x[-rw-r--r--]view/tpl/nogroup-template.tpl10
-rw-r--r--view/tpl/notes.tpl10
-rwxr-xr-x[-rw-r--r--]view/tpl/notifications.tpl7
-rwxr-xr-x[-rw-r--r--]view/tpl/notifications_comments_item.tpl4
-rwxr-xr-x[-rw-r--r--]view/tpl/notifications_dislikes_item.tpl4
-rwxr-xr-x[-rw-r--r--]view/tpl/notifications_friends_item.tpl4
-rwxr-xr-x[-rw-r--r--]view/tpl/notifications_likes_item.tpl4
-rw-r--r--view/tpl/notifications_network_item.tpl3
-rwxr-xr-x[-rw-r--r--]view/tpl/notifications_posts_item.tpl4
-rwxr-xr-x[-rw-r--r--]view/tpl/notify.tpl4
-rwxr-xr-x[-rw-r--r--]view/tpl/oauth_authorize.tpl10
-rwxr-xr-x[-rw-r--r--]view/tpl/oauth_authorize_done.tpl6
-rwxr-xr-xview/tpl/oembed_video.tpl6
-rwxr-xr-x[-rw-r--r--]view/tpl/oexchange_xrd.tpl8
-rwxr-xr-x[-rw-r--r--]view/tpl/opensearch.tpl16
-rwxr-xr-x[-rw-r--r--]view/tpl/page_display.tpl12
-rw-r--r--view/tpl/pagetypes.tpl5
-rwxr-xr-x[-rw-r--r--]view/tpl/peoplefind.tpl20
-rwxr-xr-x[-rw-r--r--]view/tpl/photo_album.tpl8
-rwxr-xr-x[-rw-r--r--]view/tpl/photo_albums.tpl18
-rwxr-xr-x[-rw-r--r--]view/tpl/photo_drop.tpl4
-rw-r--r--view/tpl/photo_edit.tpl50
-rwxr-xr-x[-rw-r--r--]view/tpl/photo_item.tpl26
-rwxr-xr-x[-rw-r--r--]view/tpl/photo_top.tpl9
-rwxr-xr-x[-rw-r--r--]view/tpl/photo_view.tpl97
-rwxr-xr-x[-rw-r--r--]view/tpl/photos_recent.tpl14
-rwxr-xr-x[-rw-r--r--]view/tpl/photos_upload.tpl23
-rwxr-xr-x[-rw-r--r--]view/tpl/poco_entry_xml.tpl10
-rwxr-xr-x[-rw-r--r--]view/tpl/poco_xml.tpl24
-rwxr-xr-x[-rw-r--r--]view/tpl/poke_content.tpl26
-rwxr-xr-x[-rw-r--r--]view/tpl/posted_date_widget.tpl10
-rwxr-xr-x[-rw-r--r--]view/tpl/profed_head.tpl6
-rw-r--r--view/tpl/profile-hide-friends.tpl16
-rw-r--r--view/tpl/profile-hide-wall.tpl16
-rw-r--r--view/tpl/profile-in-directory.tpl16
-rw-r--r--view/tpl/profile-in-netdir.tpl16
-rwxr-xr-x[-rw-r--r--]view/tpl/profile_advanced.tpl205
-rwxr-xr-x[-rw-r--r--]view/tpl/profile_edit.tpl167
-rw-r--r--view/tpl/profile_edlink.tpl2
-rwxr-xr-x[-rw-r--r--]view/tpl/profile_entry.tpl7
-rwxr-xr-x[-rw-r--r--]view/tpl/profile_listing_header.tpl11
-rwxr-xr-x[-rw-r--r--]view/tpl/profile_photo.tpl20
-rw-r--r--view/tpl/profile_publish.tpl16
-rwxr-xr-x[-rw-r--r--]view/tpl/profile_vcard.tpl53
-rwxr-xr-x[-rw-r--r--]view/tpl/prv_message.tpl53
-rwxr-xr-x[-rw-r--r--]view/tpl/pwdreset.tpl14
-rwxr-xr-x[-rw-r--r--]view/tpl/register.tpl46
-rwxr-xr-x[-rw-r--r--]view/tpl/remote_friends_common.tpl16
-rwxr-xr-x[-rw-r--r--]view/tpl/removeme.tpl14
-rwxr-xr-x[-rw-r--r--]view/tpl/rmagic.tpl6
-rw-r--r--view/tpl/safesearch.tpl4
-rw-r--r--view/tpl/saved_searches.tpl14
-rwxr-xr-x[-rw-r--r--]view/tpl/saved_searches_aside.tpl14
-rwxr-xr-x[-rw-r--r--]view/tpl/search_item.tpl70
-rw-r--r--view/tpl/sellpage_edit.tpl23
-rw-r--r--view/tpl/sellpage_submit.tpl3
-rw-r--r--view/tpl/sellpage_view.tpl11
-rwxr-xr-x[-rw-r--r--]view/tpl/settings.tpl104
-rwxr-xr-x[-rw-r--r--]view/tpl/settings_account.tpl22
-rwxr-xr-x[-rw-r--r--]view/tpl/settings_addons.tpl8
-rwxr-xr-x[-rw-r--r--]view/tpl/settings_connectors.tpl6
-rwxr-xr-x[-rw-r--r--]view/tpl/settings_display.tpl24
-rwxr-xr-x[-rw-r--r--]view/tpl/settings_features.tpl21
-rwxr-xr-x[-rw-r--r--]view/tpl/settings_nick_set.tpl3
-rw-r--r--view/tpl/settings_nick_subdir.tpl6
-rwxr-xr-x[-rw-r--r--]view/tpl/settings_oauth.tpl34
-rwxr-xr-x[-rw-r--r--]view/tpl/settings_oauth_edit.tpl18
-rw-r--r--view/tpl/show_thing.tpl16
-rwxr-xr-xview/tpl/siteinfo.tpl14
-rw-r--r--view/tpl/smarty3/404.tpl6
-rw-r--r--view/tpl/smarty3/README4
-rw-r--r--view/tpl/smarty3/abook_edit.tpl79
-rw-r--r--view/tpl/smarty3/acl_selector.tpl33
-rw-r--r--view/tpl/smarty3/admin_aside.tpl47
-rw-r--r--view/tpl/smarty3/admin_logs.tpl24
-rw-r--r--view/tpl/smarty3/admin_plugins.tpl20
-rw-r--r--view/tpl/smarty3/admin_plugins_details.tpl41
-rw-r--r--view/tpl/smarty3/admin_remoteupdate.tpl103
-rw-r--r--view/tpl/smarty3/admin_site.tpl87
-rw-r--r--view/tpl/smarty3/admin_summary.tpl45
-rw-r--r--view/tpl/smarty3/admin_users.tpl94
-rw-r--r--view/tpl/smarty3/album_edit.tpl20
-rw-r--r--view/tpl/smarty3/api_config_xml.tpl71
-rw-r--r--view/tpl/smarty3/api_friends_xml.tpl10
-rw-r--r--view/tpl/smarty3/api_ratelimit_xml.tpl11
-rw-r--r--view/tpl/smarty3/api_status_xml.tpl51
-rw-r--r--view/tpl/smarty3/api_test_xml.tpl6
-rw-r--r--view/tpl/smarty3/api_timeline_atom.tpl95
-rw-r--r--view/tpl/smarty3/api_timeline_rss.tpl31
-rw-r--r--view/tpl/smarty3/api_timeline_xml.tpl25
-rw-r--r--view/tpl/smarty3/api_user_xml.tpl51
-rw-r--r--view/tpl/smarty3/apps.tpl12
-rw-r--r--view/tpl/smarty3/atom_feed.tpl34
-rw-r--r--view/tpl/smarty3/atom_feed_dfrn.tpl34
-rw-r--r--view/tpl/smarty3/atom_mail.tpl22
-rw-r--r--view/tpl/smarty3/atom_suggest.tpl16
-rw-r--r--view/tpl/smarty3/auto_request.tpl42
-rw-r--r--view/tpl/smarty3/birthdays_reminder.tpl15
-rw-r--r--view/tpl/smarty3/build_query.tpl57
-rw-r--r--view/tpl/smarty3/categories_widget.tpl17
-rw-r--r--view/tpl/smarty3/channel.tpl17
-rw-r--r--view/tpl/smarty3/channel_import.tpl40
-rw-r--r--view/tpl/smarty3/channels.tpl27
-rw-r--r--view/tpl/smarty3/chanview.tpl7
-rw-r--r--view/tpl/smarty3/comment_item.tpl73
-rw-r--r--view/tpl/smarty3/common_friends.tpl17
-rw-r--r--view/tpl/smarty3/common_tabs.tpl11
-rw-r--r--view/tpl/smarty3/contact_block.tpl17
-rw-r--r--view/tpl/smarty3/contact_edit.tpl94
-rw-r--r--view/tpl/smarty3/contact_head.tpl35
-rw-r--r--view/tpl/smarty3/contact_slider.tpl9
-rw-r--r--view/tpl/smarty3/contact_template.tpl14
-rw-r--r--view/tpl/smarty3/contacts-template.tpl31
-rw-r--r--view/tpl/smarty3/content.tpl7
-rw-r--r--view/tpl/smarty3/conv.tpl22
-rw-r--r--view/tpl/smarty3/conv_frame.tpl19
-rw-r--r--view/tpl/smarty3/conv_item.tpl120
-rw-r--r--view/tpl/smarty3/conversation.tpl33
-rw-r--r--view/tpl/smarty3/convobj.tpl9
-rw-r--r--view/tpl/smarty3/crepair.tpl51
-rw-r--r--view/tpl/smarty3/cropbody.tpl63
-rw-r--r--view/tpl/smarty3/crophead.tpl9
-rw-r--r--view/tpl/smarty3/delegate.tpl62
-rw-r--r--view/tpl/smarty3/dfrn_req_confirm.tpl26
-rw-r--r--view/tpl/smarty3/dfrn_request.tpl64
-rw-r--r--view/tpl/smarty3/diasp_dec_hdr.tpl13
-rw-r--r--view/tpl/smarty3/directory_header.tpl21
-rw-r--r--view/tpl/smarty3/directory_item.tpl16
-rw-r--r--view/tpl/smarty3/direntry.tpl16
-rw-r--r--view/tpl/smarty3/display-head.tpl13
-rw-r--r--view/tpl/smarty3/edpost_head.tpl6
-rw-r--r--view/tpl/smarty3/email_notify_html.tpl32
-rw-r--r--view/tpl/smarty3/email_notify_text.tpl18
-rw-r--r--view/tpl/smarty3/event.tpl15
-rw-r--r--view/tpl/smarty3/event_form.tpl54
-rw-r--r--view/tpl/smarty3/event_head.tpl144
-rw-r--r--view/tpl/smarty3/events-js.tpl11
-rw-r--r--view/tpl/smarty3/events.tpl29
-rw-r--r--view/tpl/smarty3/events_reminder.tpl15
-rw-r--r--view/tpl/smarty3/failed_updates.tpl22
-rw-r--r--view/tpl/smarty3/fake_feed.tpl18
-rw-r--r--view/tpl/smarty3/field.tpl9
-rw-r--r--view/tpl/smarty3/field_acheckbox.tpl12
-rw-r--r--view/tpl/smarty3/field_checkbox.tpl11
-rw-r--r--view/tpl/smarty3/field_combobox.tpl23
-rw-r--r--view/tpl/smarty3/field_custom.tpl11
-rw-r--r--view/tpl/smarty3/field_input.tpl12
-rw-r--r--view/tpl/smarty3/field_intcheckbox.tpl11
-rw-r--r--view/tpl/smarty3/field_openid.tpl11
-rw-r--r--view/tpl/smarty3/field_password.tpl11
-rw-r--r--view/tpl/smarty3/field_radio.tpl11
-rw-r--r--view/tpl/smarty3/field_richtext.tpl11
-rw-r--r--view/tpl/smarty3/field_select.tpl13
-rw-r--r--view/tpl/smarty3/field_select_raw.tpl13
-rw-r--r--view/tpl/smarty3/field_textarea.tpl11
-rw-r--r--view/tpl/smarty3/field_themeselect.tpl14
-rw-r--r--view/tpl/smarty3/field_yesno.tpl18
-rw-r--r--view/tpl/smarty3/fileas_widget.tpl17
-rw-r--r--view/tpl/smarty3/filebrowser.tpl89
-rw-r--r--view/tpl/smarty3/filer_dialog.tpl9
-rw-r--r--view/tpl/smarty3/follow.tpl13
-rw-r--r--view/tpl/smarty3/follow_slap.tpl30
-rw-r--r--view/tpl/smarty3/generic_links_widget.tpl16
-rw-r--r--view/tpl/smarty3/group_drop.tpl14
-rw-r--r--view/tpl/smarty3/group_edit.tpl28
-rw-r--r--view/tpl/smarty3/group_selection.tpl13
-rw-r--r--view/tpl/smarty3/group_side.tpl38
-rw-r--r--view/tpl/smarty3/groupeditor.tpl21
-rw-r--r--view/tpl/smarty3/head.tpl35
-rw-r--r--view/tpl/smarty3/hide_comments.tpl9
-rw-r--r--view/tpl/smarty3/install.tpl15
-rw-r--r--view/tpl/smarty3/install_checks.tpl29
-rw-r--r--view/tpl/smarty3/install_db.tpl35
-rw-r--r--view/tpl/smarty3/install_settings.tpl32
-rw-r--r--view/tpl/smarty3/intros.tpl23
-rw-r--r--view/tpl/smarty3/intros_header.tpl6
-rw-r--r--view/tpl/smarty3/invite.tpl35
-rw-r--r--view/tpl/smarty3/jot-header.tpl323
-rw-r--r--view/tpl/smarty3/jot.tpl91
-rw-r--r--view/tpl/smarty3/jot_geotag.tpl13
-rw-r--r--view/tpl/smarty3/js_strings.tpl39
-rw-r--r--view/tpl/smarty3/lang_selector.tpl15
-rw-r--r--view/tpl/smarty3/like_noshare.tpl10
-rw-r--r--view/tpl/smarty3/login.tpl36
-rw-r--r--view/tpl/smarty3/logout.tpl11
-rw-r--r--view/tpl/smarty3/lostpass.tpl23
-rw-r--r--view/tpl/smarty3/magicsig.tpl14
-rw-r--r--view/tpl/smarty3/mail_conv.tpl19
-rw-r--r--view/tpl/smarty3/mail_display.tpl15
-rw-r--r--view/tpl/smarty3/mail_head.tpl8
-rw-r--r--view/tpl/smarty3/mail_list.tpl24
-rw-r--r--view/tpl/smarty3/main_slider.tpl28
-rw-r--r--view/tpl/smarty3/match.tpl21
-rw-r--r--view/tpl/smarty3/message_side.tpl15
-rw-r--r--view/tpl/smarty3/micropro_img.tpl6
-rw-r--r--view/tpl/smarty3/micropro_txt.tpl6
-rw-r--r--view/tpl/smarty3/moderated_comment.tpl39
-rw-r--r--view/tpl/smarty3/mood_content.tpl25
-rw-r--r--view/tpl/smarty3/msg-header.tpl102
-rw-r--r--view/tpl/smarty3/nav.tpl153
-rw-r--r--view/tpl/smarty3/netfriend.tpl19
-rw-r--r--view/tpl/smarty3/new_channel.tpl34
-rw-r--r--view/tpl/smarty3/nogroup-template.tpl17
-rw-r--r--view/tpl/smarty3/notifications.tpl13
-rw-r--r--view/tpl/smarty3/notifications_comments_item.tpl8
-rw-r--r--view/tpl/smarty3/notifications_dislikes_item.tpl8
-rw-r--r--view/tpl/smarty3/notifications_friends_item.tpl8
-rw-r--r--view/tpl/smarty3/notifications_likes_item.tpl8
-rw-r--r--view/tpl/smarty3/notifications_network_item.tpl8
-rw-r--r--view/tpl/smarty3/notifications_posts_item.tpl8
-rw-r--r--view/tpl/smarty3/notify.tpl8
-rw-r--r--view/tpl/smarty3/oauth_authorize.tpl15
-rw-r--r--view/tpl/smarty3/oauth_authorize_done.tpl9
-rw-r--r--view/tpl/smarty3/oembed_video.tpl9
-rw-r--r--view/tpl/smarty3/oexchange_xrd.tpl38
-rw-r--r--view/tpl/smarty3/opensearch.tpl18
-rw-r--r--view/tpl/smarty3/page_display.tpl12
-rw-r--r--view/tpl/smarty3/pagetypes.tpl10
-rw-r--r--view/tpl/smarty3/peoplefind.tpl19
-rw-r--r--view/tpl/smarty3/photo_album.tpl12
-rw-r--r--view/tpl/smarty3/photo_albums.tpl18
-rw-r--r--view/tpl/smarty3/photo_drop.tpl9
-rw-r--r--view/tpl/smarty3/photo_edit.tpl55
-rw-r--r--view/tpl/smarty3/photo_item.tpl27
-rw-r--r--view/tpl/smarty3/photo_top.tpl13
-rw-r--r--view/tpl/smarty3/photo_view.tpl42
-rw-r--r--view/tpl/smarty3/photos_recent.tpl16
-rw-r--r--view/tpl/smarty3/photos_upload.tpl51
-rw-r--r--view/tpl/smarty3/poco_entry_xml.tpl12
-rw-r--r--view/tpl/smarty3/poco_xml.tpl23
-rw-r--r--view/tpl/smarty3/poke_content.tpl37
-rw-r--r--view/tpl/smarty3/posted_date_widget.tpl14
-rw-r--r--view/tpl/smarty3/profed_head.tpl41
-rw-r--r--view/tpl/smarty3/profile-hide-friends.tpl21
-rw-r--r--view/tpl/smarty3/profile-hide-wall.tpl21
-rw-r--r--view/tpl/smarty3/profile-in-directory.tpl21
-rw-r--r--view/tpl/smarty3/profile-in-netdir.tpl21
-rw-r--r--view/tpl/smarty3/profile_advanced.tpl175
-rw-r--r--view/tpl/smarty3/profile_edit.tpl316
-rw-r--r--view/tpl/smarty3/profile_edlink.tpl7
-rw-r--r--view/tpl/smarty3/profile_entry.tpl16
-rw-r--r--view/tpl/smarty3/profile_listing_header.tpl13
-rw-r--r--view/tpl/smarty3/profile_photo.tpl34
-rw-r--r--view/tpl/smarty3/profile_publish.tpl21
-rw-r--r--view/tpl/smarty3/profile_vcard.tpl57
-rw-r--r--view/tpl/smarty3/prv_message.tpl44
-rw-r--r--view/tpl/smarty3/pwdreset.tpl22
-rw-r--r--view/tpl/smarty3/register.tpl50
-rw-r--r--view/tpl/smarty3/remote_friends_common.tpl26
-rw-r--r--view/tpl/smarty3/removeme.tpl25
-rw-r--r--view/tpl/smarty3/rmagic.tpl16
-rw-r--r--view/tpl/smarty3/saved_searches_aside.tpl19
-rw-r--r--view/tpl/smarty3/search_item.tpl68
-rw-r--r--view/tpl/smarty3/settings.tpl119
-rw-r--r--view/tpl/smarty3/settings_account.tpl33
-rw-r--r--view/tpl/smarty3/settings_addons.tpl15
-rw-r--r--view/tpl/smarty3/settings_connectors.tpl14
-rw-r--r--view/tpl/smarty3/settings_display.tpl27
-rw-r--r--view/tpl/smarty3/settings_features.tpl25
-rw-r--r--view/tpl/smarty3/settings_nick_set.tpl10
-rw-r--r--view/tpl/smarty3/settings_nick_subdir.tpl11
-rw-r--r--view/tpl/smarty3/settings_oauth.tpl36
-rw-r--r--view/tpl/smarty3/settings_oauth_edit.tpl22
-rw-r--r--view/tpl/smarty3/suggest_friends.tpl21
-rw-r--r--view/tpl/smarty3/suggestions.tpl26
-rw-r--r--view/tpl/smarty3/tag_slap.tpl35
-rw-r--r--view/tpl/smarty3/threaded_conversation.tpl18
-rw-r--r--view/tpl/smarty3/toggle_mobile_footer.tpl7
-rw-r--r--view/tpl/smarty3/viewcontact_template.tpl14
-rw-r--r--view/tpl/smarty3/wall_item.tpl84
-rw-r--r--view/tpl/smarty3/wall_thread.tpl125
-rw-r--r--view/tpl/smarty3/wallmessage.tpl37
-rw-r--r--view/tpl/smarty3/wallmsg-header.tpl87
-rw-r--r--view/tpl/smarty3/wallwall_item.tpl91
-rw-r--r--view/tpl/smarty3/wallwall_thread.tpl112
-rw-r--r--view/tpl/smarty3/xchan_vcard.tpl25
-rw-r--r--view/tpl/smarty3/xrd_host.tpl23
-rw-r--r--view/tpl/smarty3/xrd_person.tpl34
-rw-r--r--view/tpl/sources_edit.tpl22
-rw-r--r--view/tpl/sources_list.tpl15
-rw-r--r--view/tpl/sources_new.tpl15
-rwxr-xr-x[-rw-r--r--]view/tpl/suggest_friends.tpl16
-rwxr-xr-xview/tpl/suggest_page.tpl9
-rw-r--r--view/tpl/suggest_widget.tpl10
-rwxr-xr-x[-rw-r--r--]view/tpl/suggestions.tpl23
-rw-r--r--view/tpl/tag_slap.tpl30
-rw-r--r--view/tpl/thing_edit.tpl29
-rw-r--r--view/tpl/thing_input.tpl28
-rwxr-xr-x[-rw-r--r--]view/tpl/threaded_conversation.tpl17
-rwxr-xr-x[-rw-r--r--]view/tpl/toggle_mobile_footer.tpl2
-rw-r--r--view/tpl/usermenu.tpl13
-rwxr-xr-x[-rw-r--r--]view/tpl/viewcontact_template.tpl10
-rw-r--r--view/tpl/wall_item.tpl79
-rw-r--r--view/tpl/wall_thread.tpl120
-rw-r--r--view/tpl/wallmessage.tpl32
-rw-r--r--view/tpl/wallmsg-header.tpl82
-rw-r--r--view/tpl/wallwall_item.tpl86
-rw-r--r--view/tpl/wallwall_thread.tpl107
-rw-r--r--view/tpl/webpagelist.tpl18
-rw-r--r--view/tpl/write_pages.tpl3
-rwxr-xr-x[-rw-r--r--]view/tpl/xchan_vcard.tpl20
-rwxr-xr-x[-rw-r--r--]view/tpl/xrd_host.tpl12
-rwxr-xr-x[-rw-r--r--]view/tpl/xrd_person.tpl20
3537 files changed, 437724 insertions, 58619 deletions
diff --git a/.gitignore b/.gitignore
index 6cb36fb26..21f90f09a 100644..100755
--- a/.gitignore
+++ b/.gitignore
@@ -2,6 +2,7 @@ favicon.*
.htconfig.php
\#*
include/jquery-1.4.2.min.js
+*.gz
*.log
*.out
*.version*
@@ -9,11 +10,14 @@ home.html
addon
*~
compiled/
+custom/
# patch attempts
*.orig
*.rej
+# composer files (for fetching sabre)
+composer.*
#ignore documentation, it should be newly built
doc/api
@@ -29,3 +33,9 @@ report/
#ignore OSX .DS_Store files
.DS_Store
+
+#netbeans project folder
+nbproject
+
+#Kdevelop project files
+*.kdev4
diff --git a/.htaccess b/.htaccess
index 6cb3a0749..2f4fb1381 100644
--- a/.htaccess
+++ b/.htaccess
@@ -2,7 +2,8 @@ Options -Indexes
AddType application/x-java-archive .jar
AddType audio/ogg .oga
-<FilesMatch "\.(out|log)$">
+# don't allow any web access to logfiles, even after rotation/compression
+<FilesMatch "\.(out|log|gz)$">
Deny from all
</FilesMatch>
@@ -11,6 +12,7 @@ Deny from all
# Protect repository directory from browsing
RewriteRule "(^|/)\.git" - [F]
+
# Rewrite current-style URLs of the form 'index.php?q=x'.
# Also place auth information into REMOTE_USER for sites running
# in CGI mode.
diff --git a/LICENSE b/LICENSE
index 01f1c19d5..b8c943177 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2010-2013 the Friendica Project
+Copyright (c) 2010-2013 the Red Project
All rights reserved.
Permission is hereby granted, free of charge, to any person obtaining a copy
diff --git a/README b/README
deleted file mode 100644
index a930d0910..000000000
--- a/README
+++ /dev/null
@@ -1,11 +0,0 @@
-Friendica RED Interaction Engine
-================================
-
-Red is a new concept in electronic communications which is based on our earlier work with Friendica and our pioneering developments in decentralised, federated social networking.
-
-Red is prototype code and has limited functionality at the present time. This message will be changed when it approaches stability.
-
-At its heart, Red is a decentralised collection of location agnostic info streams (e.g. "channels") which are attached to permission controlled web resources, and which have the ability to discover each other and interact. You could call it a type of social network, but that would be degrading. This is a different concept in online communications, starting where social networks leave off and extending those somewhat primitive types of interactions in new ways - particularly when it comes to privacy.
-
-
-Social networking emulation is one form that these streams can take, but they can take many other forms - limited only by your imagination.
diff --git a/README.md b/README.md
new file mode 100644
index 000000000..93dad882b
--- /dev/null
+++ b/README.md
@@ -0,0 +1,40 @@
+![the Red Matrix](images/rm300.png)
+
+***"Connected Websites"***
+
+The modern web is "missing" a few important pieces which would make it much more useful. Many corporations have stepped in with products to supply these missing pieces, but with a loss of freedom and privacy and increased **centralisation**.
+
+Centralisation is generally considered a bad thing in network design as the loss of one critical node or centralised service could seriously impact the entire network - possibly taking a long time to recover. Recognising this, the original web was based on decentralised services. Over the years, this fundamental design strength has been largely overlooked, as people congregate into centralised services which provide the missing pieces.
+
+These missing pieces are (in no particular order):
+
+- Secure and private "spam free" communications
+
+- Identity and "single-signon" across the entire network
+
+- Privacy controls and permissions which extend to the entire network
+
+- Directory services (like a phone book)
+
+
+
+The Red Matrix (sometimes referred to as just "Red") is a collection of web servers and services which provides these missing pieces, but within a decentralised identity and messaging framework (known as "Zot"). Red operates as an independent network within the larger internet where all the nodes or servers (we call them "hubs") are able to fully interact with each other in ways that are simply not possible using other services. Additionally the owners of each network hub have the ability to set their own rules with regard to communications privacy and data ownership, because each operates with complete independence. These hubs require only slightly more resources than a blog or content management system, and the software is being designed with the ability to natively incorporate both kinds of functionality, as well as cloud storage.
+
+![The Red Matrix model](images/red_antiprism.png)
+
+
+Whilst other decentralised communications networks exist, an additional weakness we've found in the implementation of these systems is the binding of network identity with the physical server where it resides; for example if you are "eric@example.website", your identity is often tied permanently to "example.website". We see this as a problem. Many hubs on the Indie Web are run by enthusiasts with varying skill levels and financial resources - and the technology is changing quite rapidly. Often the cost or workload involved in maintaining these services becomes a burden (or hardware fails) and people or entire social communities are left stranded when their server goes offline. Their identity no longer exists. They may have to "start over" building their social circle from scratch when this happens. In some cases communities are unable to recover from this kind of disruption and the entire community dissolves.
+
+We've been working on decentralisation for several years and have seen this happen time and time again.
+Within the Red Matrix, identity is nomadic. It defines you and it belongs to you - and is not locked to a particular network address. You can take your identity, and all your friends and associates with you - to any other hub in the network, at any time. If your hub goes offline for any reason, you have the ability to relocate to any other hub and carry on as if nothing happened. You still have all your friends and associations.
+
+
+The Red Matrix is free and open source distributed under the MIT license.
+
+
+Please connect with one of the developer channels ("Channel One" would be a good choice) if you are interested in helping us out.
+
+[Please help us change the world by providing a small donation.](http://pledgie.com/campaigns/18417) (Large donations are also graciously accepted).
+
+
+If you would like to become a member of the Red Matrix **right now** , please select a public hub from one of our open providers at [https://zothub.com/pubsites](https://zothub.com/pubsites). All sites are interlinked and you can always move to another, so the choice of site can be somewhat arbitrary. \ No newline at end of file
diff --git a/assets/diamondlattice.png b/assets/diamondlattice.png
new file mode 100644
index 000000000..f1ed7dbd0
--- /dev/null
+++ b/assets/diamondlattice.png
Binary files differ
diff --git a/assets/home.html b/assets/home.html
new file mode 100644
index 000000000..3f018edfc
--- /dev/null
+++ b/assets/home.html
@@ -0,0 +1,206 @@
+<style>section { position: relative; } nav { z-index: 9999; position: fixed; width: 100%; top: 0; left: 0; } header { z-index: 10000; }</style>
+<script>
+// Scroll backgrounds at different rates to achieve the parallax effect
+$(window).scroll(function(e){
+ parallax();
+ });
+ function parallax(){
+ var scrolled = $(window).scrollTop();
+ $('.bg').css('top',-(scrolled*0.4)+'px');
+ $('.bg2').css('top',-(scrolled*0.5)+'px');
+
+}
+</script>
+<link rel='stylesheet' media='screen and (max-width: 830px)' href='assets/narrow.css' />
+<link rel='stylesheet' media='screen and (min-width: 831px)' href='assets/wide.css' />
+
+
+ <div id="header" align="center"><h1>Red Matrix</h1>
+ <div id="menubutton1"><p style="margin-top:2px;"><a href="#decentralise" style="color:#FFFFFF;text-decoration:none;margin-top:0px;">decentralised</a></p></div>
+ <div id="menubutton2"><p style="margin-top:2px;"><a href="#identity" style="color:#FFFFFF;text-decoration:none;margin-top:0px;">identity</a></p></div>
+ <div id="menubutton3"><p style="margin-top:2px;"><a href="#control" style="color:#FFFFFF;text-decoration:none;margin-top:0px;">control</a></p></div>
+ <div id="menubutton4"><p style="margin-top:2px;"><a href="#freedom" style="color:#FFFFFF;text-decoration:none;margin-top:0px;">freedom</a></p></div>
+ <div id="menubutton6"><p style="margin-top:2px;"><a href="#privacy" style="color:#FFFFFF;text-decoration:none;margin-top:0px;">privacy</a></p></div>
+ </div>
+
+<body>
+<div class="bg"></div>
+<div class="bg2"></div>
+<div class="bg-mask"></div>
+<div id="bg-narrow"></div>
+
+
+<div class="section-heading" style="margin-top: 32px;">
+The internet is broken. We're fixing it.</div>
+
+<div>
+<div id="tagline">
+<img style="float:center;width:175px;padding:5px;" src="assets/logo_antiprism.png"><br>
+<span style="color:#808080;font-weight:bold;font-size:1.5em;">ma&middot;trix:</span><span style="color:#808080;font-weight:light;font-size:1.2em;"><i> something within or from which something else originates, develops, or takes form </i></span>
+</div>
+</div>
+
+<div id="intro-text">
+<p>Imagine an internet slightly different than what we have today. The internet of the future won't require logging in with passwords on every site you wish to access. It will just know who you are. An internet where you need to keep track of hundreds/thousands of passwords on hundreds/thousands of websites is fundamentally broken. But an internet with no privacy and where all your online activities are monitored and tracked is likewise broken.
+</p>
+<p>Imagine if you had an internet where the people using it could <b>create new services</b> and <b>communicate freely and privately</b> - and where you didn't need a different account on every website in the network in order to use each website. Where you had your own space and could <b>share anything you wanted</b> with anybody you wanted, any time you wanted. Where the <b>things you share in private stay private</b> instead of being under constant surveillance from advertising corporations and government intelligence agencies.
+</p>
+</div>
+
+<div class="summary-menu-container">
+<a class="summary-menu-item" href="#decentralise" >Decentralise</a>
+<a class="summary-menu-item" href="#identity" >Identity</a>
+<a class="summary-menu-item" href="#freedom" >Freedom</a>
+<a class="summary-menu-item" href="#control" >Access Control</a>
+<a class="summary-menu-item" href="#privacy" >Privacy</a>
+<a class="summary-menu-item" href="#identity" >Got Zot?</a>
+</div>
+
+<div class="summary-nodes-container">
+<div class="summary-node-1">
+<div class="summary-node-1-text">
+<div class="summary-node-header"><a href="#decentralise" style="color:#FFFFFF;text-decoration:none;margin-top:0px;font-size: 1.2em;">Decentralised</a></div>
+<div class="summary-node-text">
+<p id=menutrigger1><a href="#decentralise" style="color:#FFFFFF;text-decoration:none;margin-top:0px;">No centralised servers means no one can censor your content or disable the network.</a></p>
+</div>
+</div>
+</div>
+<div class="summary-node-2">
+<div class="summary-node-2-text">
+<div class="summary-node-header"><a href="#identity" style="color:#FFFFFF;text-decoration:none;margin-top:0px;font-size: 1.2em;">Nomadic Identity</a></div>
+<div class="summary-node-text">
+<p id=menutrigger2><a href="#identity" style="color:#FFFFFF;text-decoration:none;margin-top:0px;">You own and control your identity, and it can move freely inside the matrix.</a></p>
+</div>
+</div>
+</div>
+
+<div class="summary-node-3">
+<div class="summary-node-3-text">
+<div class="summary-node-header"><a href="#freedom" style="color:#FFFFFF;text-decoration:none;margin-top:0px;font-size: 1.2em;">Freedom</a></div>
+<div class="summary-node-text">
+<p id=menutrigger3><a href="#freedom" style="color:#FFFFFF;text-decoration:none;margin-top:0px;">Use a trusted hub, or run your own server. Move where you want and take your data and connections with you. The choices are yours.</p>
+</div>
+</div>
+</div>
+<div class="summary-node-4">
+<div class="summary-node-4-text">
+<div class="summary-node-header"><a href="#control" style="color:#FFFFFF;text-decoration:none;margin-top:0px;font-size: 1.2em;">Access Control</a></div>
+<div class="summary-node-text">
+<p id=menutrigger4><a href="#control" style="color:#FFFFFF;text-decoration:none;margin-top:0px;">Share what you want with whom you want. Permissions extend to the entire matrix.</a></p>
+</div>
+</div>
+</div>
+<div class="summary-node-5">
+<div class="summary-node-5-text">
+<div class="summary-node-header"></div>
+<div class="summary-node-text">
+<p><a href="#identity" style="color:#FFFFFF;text-decoration:none;margin-top:0px;">Got Zot?</a></p>
+</div>
+</div>
+</div>
+<div class="summary-node-6">
+<div class="summary-node-6-text">
+<div class="summary-node-header"><a href="#privacy" style="color:#FFFFFF;text-decoration:none;margin-top:0px;font-size: 1.2em;">Privacy</a></div>
+<p class="summary-node-text"><a href="#privacy" style="color:#FFFFFF;text-decoration:none;margin-top:0px;">Privacy and encryption to suit your needs.</a></p>
+</div>
+</div>
+</div>
+
+
+<div id="menutrigger"></div>
+<section id="decentralise">
+
+<div class="section-heading">Decentralise. Build a more robust network.</div>
+<div class="section-text">
+<p>
+Now open your eyes. We've done some amazing things with decentralisation technology over the last few years and have created a different kind of network. We call it the Red Matrix. Forget the old internet - it's hopelessly broken and increasingly being choked off in order to take your money and spy on you. We're building tomorrow's internet today. And we're doing things a bit differently than what you may be used to. We could wait for this new internet to be built, but we don't really trust the typical corporations and governmental bodies to do it right. So we're building it on top of the old internet. And we're building privacy into its DNA. And it's <strong>here now</strong>.
+</p>
+<p>
+The Red Matrix is a decentralised network where the <strong>people using it are in charge</strong> and the size of your server farm and wealth do not offer any comparable advantage. Anybody may participate on a level playing field. Cloud storage, file sharing, communications, content creation and management belong to <strong>everybody</strong> and can be shared with <strong>anybody</strong> (or <strong>somebody</strong>, or <strong>nobody</strong>). This is only a representative sample of the services we plan to offer. In an internet where creativity is allowed to flourish and corporate overlords have no power, the door is open to entirely new forms of expression and applications. The Red Matrix software is free and open source; created by volunteers and distributed under the MIT license.
+</p>
+<p>
+And the Red Matrix has <strong>Got Zot.</strong>
+</p>
+<p>
+So what the heck is <strong><em>Zot</em></strong>? I'm glad you asked...
+</div>
+</section>
+
+<br />
+<section id="identity">
+
+<div class="section-heading">Your identity is your own. One identity across the network.</div>
+<div class="section-text">
+
+<p>
+Zot is a revolutionary protocol which provides <strong>decentralised communications and identity</strong> management across the matrix. The resulting platform can provide web services comparable to those offered by large corporate providers, but without the large corporate provider and their associated privacy issues. Communications and social networking are an integral part of the matrix. Any channel (and any services provided by that channel) can make full use of feature-rich social communications on a global scale.
+</p>
+<p>
+We use the full power of the matrix to offer friend suggestions and directory services. You can also perform other things which would typically only be possibly on a centralised provider - such as "wall to wall" posts and private/multiple profiles and web content which can be tailored to the viewer. You won't find these features at all on other decentralised communication services. The difference is that Zot also provides decentralised <strong>identity services</strong>. This is what separates the men from the boys, and what makes life in the matrix so awesome.
+</p>
+</div>
+
+<div class="section-text">
+<p>
+Zot's identity layer is unique. It's like OpenID on steroids. It provides invisible single sign-on across all sites in the matrix; as well as nomadic identity so that your communications with friends, family, and business partners won't be affected by the loss of your primary communication node - either temporarily or permanently. The important bits of your identity and relationships can be backed up to a thumb drive and may appear at any node in the matrix at any time - with all your friends and preferences intact. These nomadic instances are kept in sync so any instance can take over if another one is compromised or damaged. This protects you against not only major system failure, but also temporary site overloads and governmental manipulation. You cannot be silenced. You cannot be removed from the matrix.
+</p>
+<p>
+As you browse the matrix viewing channels and their unique content, you are seamlessly authenticated as you go, even across completely different server hubs. No password dialogues. Nothing to type. You're just greeted by name on every new site you visit. How does Zot do that? We call it "magic-auth" because it really is technology that is so advanced as to be indistinguishable from magic. You login only once on your home hub (or any nomadic backup hub you have chosen). This allows you to access any authenticated services provided anywhere in the matrix - such as shopping and access to private information. This is just like the services offered by large corporate providers with huge user databases; however you can be a member of this community and a server on this network using a "plug computer" like a Rasberry Pi. Your password isn't stored on a thousand different sites where it can be stolen and used to clean out your bank accounts.
+</p>
+</div>
+</section>
+<section id="control">
+
+<div class="section-heading">You control your data. Red Matrix enforces your permissions.</div>
+<div class="section-text">
+
+<p>
+Zot's identity layer allows you to provide fine-grained permissions to any content you wish to publish - and these permissions extend across the Red Matrix. This is like having one super huge website made up of an army of small individual websites - and where each channel in the matrix can completely control their privacy and sharing preferences for any web resources they create.
+</p>
+<p>
+Example: you want a photo to be visible to your family and three select friends, but not your work colleagues. In the matrix this is easy. <strong>Even if your family members, work colleagues, and friends all have accounts on different hubs.</strong>
+</p>
+<p>
+Currently the matrix supports communications, photo albums, events, and files. This will be extended in the future to provide content management services (web pages) and cloud storage facilities such as WebDAV and multi-media libraries. Every object and how it is shared and with whom is completely <strong>under your control</strong>.
+</p>
+<p>
+Again, this type of control is available on large corporate providers, because they own the user database. Within the matrix, there is no need for a huge user database on your machine - because <strong>the matrix is your user database</strong> and for all intents and purposes has infinite capacity and is spread amongst hundreds, and potentially millions of computers. Access can be granted or denied for any resource, to any channel or any group of channels; anywhere within the matrix. They do not need to have an account on your hub.
+</p>
+</div>
+</section>
+<div class="clear"></div>
+
+<section id="privacy">
+
+<div class="section-heading">Reclaim your privacy. Red Matrix is built for <i>you</i>, not governments and corporations.</div>
+<div class="section-text">
+<p>
+Your communications may be public or private - and we allow your private communications to be as private as you wish them to be. Private communications comprise not only fully encrypted transport, but also encrypted storage to help protect against accidental snooping and disclosure by rogue system administrators and internet service providers.
+</p>
+<p>
+Want more? You can fully encrypt your messages "end to end" using your choice of encryption ciphers and using a passphrase that only you and the recipient(s) know - <strong>in addition to</strong> our standard multi-layer encryption.
+</p>
+<p>
+Want more? Our end to end encryption is pluggable. You can define your own chain of multiple encryption steps with multiple keys, and include algorithms known only to you and the recipient. At some point even the US National Security Agency will have to throw up their hands. There won't be enough computational power available in the universe to decode your private message.
+</p>
+<p>
+We also provide optional message expiration as a standard feature. When the expiration date/time passes, your message is removed from the network.
+</p>
+</div>
+</section>
+<div class="clear"></div>
+
+
+
+<section id="freedom">
+<a href="https://github.com/friendica/red"><img style="float:center;width:125px;" src="assets/logo_antiprism.png"></a>
+</section>
+
+<br>
+<br>
+</div>
+
+
+ <div id="footer" align="center"> <a href="http://redmatrix.me">redmatrix.me</a> &#149; <a href="https://github.com/friendica/red"><b>Get Zot now!</b></a> &#149; <a href="https://github.com/friendica/red/wiki">Wiki</a> &#149; <a href="http://zothub.com/pubsites">Public Server Directory</a> </div>
+
+
diff --git a/assets/logo_antiprism.png b/assets/logo_antiprism.png
new file mode 100644
index 000000000..b72e2a211
--- /dev/null
+++ b/assets/logo_antiprism.png
Binary files differ
diff --git a/assets/narrow.css b/assets/narrow.css
new file mode 100644
index 000000000..dc47c6984
--- /dev/null
+++ b/assets/narrow.css
@@ -0,0 +1,218 @@
+body {
+ font-family: 'Ubuntu',Tahoma,Helvetica,Arial,sans-serif;
+ color: #111111;
+ text-align: center;
+ padding:0 0 22px 0;
+}
+
+ div#header{
+ position:absolute;
+ z-index: 100;
+ top:0;
+ left:0;
+ width:100%;
+ height: 55px;
+ background: rgba(100, 0, 0, 0.8);
+ background-size:3000px 55px;
+ color: #fff;
+ display:none;
+ }
+
+ @media screen{
+ body>div#header{
+ position: fixed;
+ }
+ body>div#footer{
+ position:fixed;
+ }
+
+ }
+
+
+ div#footer{
+ position:absolute;
+ bottom:0;
+ left:0;
+ width:100%;
+ height:22px;
+ background: #AD002C;
+ color: #fff;
+}
+
+#intro-text {
+color:#c60032;font-size:1.2em;width:70%;margin-right:auto;margin-left:auto;text-align:justify;
+}
+div.section-text {
+color:#c60032;font-size:1.2em;width:80%;margin-right:auto;margin-left:auto;text-align:justify;
+}
+
+#tagline {
+ color: #c60032;
+ width:80%;
+ margin-top:0px;
+ margin-bottom:20px;
+ margin-left: auto;
+ margin-right: auto;
+}
+
+div.red-button {
+ width:150px;
+ margin-left: auto;
+ margin-right: auto;
+ font-weight: 500;
+ font-size: larger;
+ background-color: #c60032;
+ border: 2px solid lightgray;
+ border-radius: 5px;
+ padding: 12px;
+}
+div.red-button a {
+ text-decoration: none;
+ color:#FFFFFF;
+}
+div.red-button a:hover {
+ text-decoration: none;
+ font-weight:600;
+
+}
+
+#footer {
+ font-size: 12px;
+ color:#fff;
+ padding-top: 4px;
+}
+
+#footer a {
+ text-decoration: none;
+ color:#fff;
+}
+.bg {
+ display:none;
+}
+.bg2 {
+ display:none;
+}
+.bg-mask {
+ display:none;
+}
+
+#bg-narrow {
+ background: url('diamondlattice.png') center center no-repeat ;
+ opacity: 0.05;
+ position:absolute;
+ top:0;
+ left:0;
+ z-index: -1;
+ width:100%;
+ height:300%;
+ display:none;
+}
+
+div.summary-nodes-container {
+ display:none;
+}
+div.summary-menu-container {
+ display:block;
+}
+a.summary-menu-item {
+ display: block;
+ width:70%;
+ margin-left:auto;margin-right:auto;
+ border-radius:10px;
+ color:#FFFFFF;
+ font-size:1.2em;
+ text-align:center;
+ background:#c60032;
+ margin-bottom:5px;
+}
+a.summary-menu-item:hover{
+ color:#FFFFFF;
+ text-decoration:none;
+ background:#550000
+}
+
+
+div#menubutton1 {
+ position: fixed;
+ top:10px;
+ left:200px;
+ width:150px;
+ height:30px;
+ border-radius:10px;
+ color:#FFFFFF;
+ /* line-height:100px; */
+ text-align:center;
+ background:#c60032;
+ display: none;
+ z-index:200;
+}
+div#menubutton1:hover {
+ color:#FFFFFF;
+ text-decoration:none;
+ background:#550000
+}
+div#menubutton2 {
+ position: fixed;
+ top:10px;
+ left:350px;
+ width:150px;
+ height:30px;
+ border-radius:10px;
+ color:#FFFFFF;
+ /* line-height:100px; */
+ text-align:center;
+ background:#c60032;
+ display: none;
+ z-index:200;
+}
+div#menubutton2:hover {
+ color:#FFFFFF;
+ text-decoration:none;
+ background:#550000
+}
+div#menubutton3 {
+ position: fixed;
+ top:10px;
+ right:350px;
+ width:150px;
+ height:30px;
+ border-radius:10px;
+ color:#FFFFFF;
+ /* line-height:100px; */
+ text-align:center;
+ background:#c60032;
+ display: none;
+ z-index:200;
+}
+div#menubutton3:hover {
+ color:#FFFFFF;
+ text-decoration:none;
+ background:#550000
+}
+div#menubutton4 {
+ position: fixed;
+ top:10px;
+ right:200px;
+ width:150px;
+ height:30px;
+ border-radius:10px;
+ color:#FFFFFF;
+ /* line-height:100px; */
+ text-align:center;
+ background:#c60032;
+ display: none;
+ z-index:200;
+}
+div#menubutton4:hover {
+ color:#FFFFFF;
+ text-decoration:none;
+ background:#550000
+}
+div.section-heading {
+ font-size:2.0em;
+ color:#c60032;
+}
+div.section-subtitle {
+ font-size:1.5em;
+ color:#c60032;
+} \ No newline at end of file
diff --git a/assets/redmatrixlogo.png b/assets/redmatrixlogo.png
new file mode 100644
index 000000000..6929ae14f
--- /dev/null
+++ b/assets/redmatrixlogo.png
Binary files differ
diff --git a/assets/wide.css b/assets/wide.css
new file mode 100644
index 000000000..84dbc47a2
--- /dev/null
+++ b/assets/wide.css
@@ -0,0 +1,396 @@
+body {
+ font-family: 'Ubuntu',Tahoma,Helvetica,Arial,sans-serif;
+ color: #111111;
+ /*color: rgba(0,0,0,0.0); */
+ text-align: center;
+ /* background-image: url("redmatrixbkgd.jpg"); */
+ /*background: #ececec;*/
+ padding:0 0 22px 0;
+ /* background: url(redmatrixbkgd.jpg) no-repeat center center scroll; */
+ /*
+ -webkit-background-size: cover;
+ -moz-background-size: cover;
+ -o-background-size: cover;
+ background-size: cover;
+ */
+}
+
+#intro-text {
+color:#C60032;font-size:1.2em;width:700px;margin-right:auto;margin-left:auto;text-align:justify;
+}
+div.section-text {
+color:#C60032;font-size:1.2em;width:700px;margin-right:auto;margin-left:auto;text-align:justify;
+}
+
+
+ div#header{
+ display:none;
+ position:absolute;
+ z-index: 100;
+ top:0;
+ left:0;
+ width:100%;
+ height: 55px;
+ /* background-image: url("redmatrixbkgd.jpg"); */
+ background: rgba(198, 0, 50, 0.8);
+ background-size:3000px 55px;
+ /* background: #afafaf;*/
+ color: #fff;
+ }
+ @media screen{
+ body>div#header{
+ position: fixed;
+ }
+ body>div#footer{
+ position:fixed;
+ }
+
+ }
+
+ div#footer{
+ position:absolute;
+ bottom:0;
+ left:0;
+ width:100%;
+ height:22px;
+ background: #AD002C;
+ color: #fff;
+ }
+
+
+
+#tagline {
+ color: #880000;
+ width:600px;
+ margin-top:0px;
+ margin-bottom:20px;
+ margin-left: auto;
+ margin-right: auto;
+}
+
+
+.clear {
+ clear: both;
+}
+
+div.red-button {
+ width:150px;
+ margin-left: auto;
+ margin-right: auto;
+ font-weight: 500;
+ font-size: larger;
+ background-color: #C60032;
+ border: 2px solid lightgray;
+ border-radius: 5px;
+ padding: 12px;
+}
+div.red-button a {
+ text-decoration: none;
+ color:#FFFFFF;
+}
+div.red-button a:hover {
+ text-decoration: none;
+ font-weight:600;
+}
+
+#footer {
+ font-size: 12px;
+ color:#fff;
+ padding-top: 4px;
+}
+
+#footer a {
+ text-decoration: none;
+ color:#fff;
+}
+
+.bg {
+ background: url('diamondlattice.png') center center no-repeat ;
+ position: fixed;
+ width: 100%;
+ height: 1350px;
+
+ top:0px;
+ left:0px;
+ opacity: 1.0;
+ z-index: -1;
+}
+.bg2 {
+ background: url('diamondlattice.png') center center no-repeat;
+ position: fixed;
+
+ width: 100%;
+ height: 1350px;
+ top:0px;
+ left:0px;
+ opacity: 1.0;
+ z-index: -1;
+}
+.bg-mask {
+ background: rgba(255, 255, 255, 0.95) center center no-repeat;
+ position: fixed;
+ width: 100%;
+ height: 1350px;
+ top:0;
+ left:0px;
+ z-index: -1;
+
+}
+.bg-narrow {
+ display:none;
+}
+div.summary-menu-container {
+ display:none;
+}
+div.summary-node {
+ position: fixed;
+ width: 50px;
+ text-align: center ;
+ font-size:1.2em;
+
+
+}
+div.summary-node-header {
+ font-size: 1.2em;
+ color:#FFFFFF;
+ font-weight:bold;
+}
+div.summary-node-1 {
+ position: absolute;
+ top:0px;
+ left:0px;
+ width:200px;
+ height:200px;
+ border-radius:100px;
+ color:#CCCCCC;
+ /* line-height:100px; */
+ text-align:center;
+ background:#C60032;
+}
+div.summary-node-1:hover{
+ color:#FFFFFF;
+ text-decoration:none;
+ background:#550000
+}
+div.summary-node-1-text {
+ margin-top:25%;
+ width: 150px;
+ margin-left:auto;
+ margin-right:auto;
+}
+div.summary-node-2 {
+ position: absolute;
+ top:50px;
+ left:170px;
+ width:220px;
+ height:220px;
+ border-radius:200px;
+ color:#CCCCCC;
+ /* line-height:100px; */
+ text-align:center;
+ background:#C60032;
+}
+div.summary-node-2:hover{
+ color:#FFFFFF;
+ text-decoration:none;
+ background:#550000
+}
+div.summary-node-2-text {
+ margin-top:30%;
+ width: 150px;
+ margin-left:auto;
+ margin-right:auto;
+}
+div.summary-node-3 {
+ position: absolute;
+ top:0px;
+ right:20px;
+ width:250px;
+ height:250px;
+ border-radius:200px;
+ color:#FFFFFF;
+ /* line-height:100px; */
+ text-align:center;
+ background:#C60032;
+}
+div.summary-node-3:hover{
+ color:#FFFFFF;
+ text-decoration:none;
+ background:#550000
+}
+div.summary-node-3-text {
+ margin-top:25%;
+ width: 200px;
+ margin-left:auto;
+ margin-right:auto;
+}
+
+div.summary-node-4 {
+ position: absolute;
+ top:200px;
+ right:180px;
+ width:200px;
+ height:200px;
+ border-radius:200px;
+ color:#FFFFFF;
+ /* line-height:100px; */
+ text-align:center;
+ background:#C60032;
+}
+div.summary-node-4:hover{
+ color:#FFFFFF;
+ text-decoration:none;
+ background:#550000
+}
+div.summary-node-4-text {
+ margin-top:25%;
+ width: 150px;
+ margin-left:auto;
+ margin-right:auto;
+}
+div.summary-node-5 {
+ position: absolute;
+ top:250px;
+ left:120px;
+ width:150px;
+ height:150px;
+ border-radius:150px;
+ color:#FFFFFF;
+ /* line-height:100px; */
+ text-align:center;
+ background:#C60032;
+}
+div.summary-node-5:hover{
+ color:#FFFFFF;
+ text-decoration:none;
+ background:#550000
+}
+div.summary-node-5-text {
+ margin-top:55px;
+ width: 150px;
+ margin-left:auto;
+ margin-right:auto;
+ font-size:2.0em;
+
+}
+div.summary-node-6 {
+ position: absolute;
+ top:20px;
+ right:270px;
+ width:150px;
+ height:150px;
+ border-radius:150px;
+ color:#FFFFFF;
+ /* line-height:100px; */
+ text-align:center;
+ background:#C60032;
+}
+div.summary-node-6:hover{
+ color:#FFFFFF;
+ text-decoration:none;
+ background:#550000
+}
+div.summary-node-6-text {
+ margin-top:30px;
+ width: 100px;
+ margin-left:auto;
+ margin-right:auto;
+}
+div.summary-nodes-container {
+ position: relative;
+ margin-left: auto ;
+ margin-right: auto ;
+ margin-top:30px;
+ margin-bottom:30px;
+ width: 800px;
+ height: 400px;
+ text-align: center ;
+}
+div#menubutton1 {
+ position: fixed;
+ top:10px;
+ left:200px;
+ width:150px;
+ height:30px;
+ border-radius:10px;
+ color:#FFFFFF;
+ /* line-height:100px; */
+ text-align:center;
+ background:#C60032;
+ display: none;
+ z-index:200;
+}
+div#menubutton1:hover {
+ color:#FFFFFF;
+ text-decoration:none;
+ background:#550000
+}
+div#menubutton2 {
+ position: fixed;
+ top:10px;
+ left:350px;
+ width:150px;
+ height:30px;
+ border-radius:10px;
+ color:#FFFFFF;
+ /* line-height:100px; */
+ text-align:center;
+ background:#C60032;
+ display: none;
+ z-index:200;
+}
+div#menubutton2:hover {
+ color:#FFFFFF;
+ text-decoration:none;
+ background:#550000
+}
+div#menubutton3 {
+ position: fixed;
+ top:10px;
+ right:350px;
+ width:150px;
+ height:30px;
+ border-radius:10px;
+ color:#FFFFFF;
+ /* line-height:100px; */
+ text-align:center;
+ background:#C60032;
+ display: none;
+ z-index:200;
+}
+div#menubutton3:hover {
+ color:#FFFFFF;
+ text-decoration:none;
+ background:#550000
+}
+div#menubutton4 {
+ position: fixed;
+ top:10px;
+ right:200px;
+ width:150px;
+ height:30px;
+ border-radius:10px;
+ color:#FFFFFF;
+ /* line-height:100px; */
+ text-align:center;
+ background:#C60032;
+ display: none;
+ z-index:200;
+}
+div#menubutton4:hover {
+ color:#FFFFFF;
+ text-decoration:none;
+ background:#550000
+}
+div.section-heading {
+ font-size:2.0em;
+ color:#C60032;
+ width:700px;
+ margin-bottom: 1em;
+ margin-left:auto;
+ margin-right:auto;
+}
+div.section-subtitle {
+ font-size:1.5em;
+ color:#BB0000;
+} \ No newline at end of file
diff --git a/boot.php b/boot.php
index 8d2e7c6e8..2cedb8bd6 100644..100755
--- a/boot.php
+++ b/boot.php
@@ -1,4 +1,30 @@
<?php
+/** @file */
+
+
+/**
+ * Red Matrix.
+ *
+ * The Red Matrix (aka "Red") is an open source decentralised communications
+ * platform combined with a decentralised identity/authentication framework
+ * wrapped in an extensible content management system, providing website designers
+ * the ability to embed fully decentralised communications and social tools
+ * into many traditional website designs (blogs, forums, small business
+ * websites, charitable organisations, etc.). Red also provides DNS mobility
+ * and internet scale privacy/access control.
+ *
+ * This allows any individual website to participate in a matrix of linked
+ * sites and people and media sharing which is far greater than the reach
+ * of an individual site.
+ *
+ * If you are reading the source code and come across a function
+ * or code block which is not documented, but you have a good idea what it
+ * does, please add some descriptive comments and push it to the main project.
+ * Even if your description isn't perfect, it gives us a base which we
+ * can build on and correct - so that eventually everything is fully
+ * documented.
+ */
+
require_once('include/config.php');
require_once('include/network.php');
@@ -12,11 +38,15 @@ require_once('include/permissions.php');
require_once('library/Mobile_Detect/Mobile_Detect.php');
require_once('include/BaseObject.php');
require_once('include/features.php');
+require_once('include/taxonomy.php');
+require_once('include/identity.php');
-define ( 'FRIENDICA_PLATFORM', 'Friendica Red');
-define ( 'FRIENDICA_VERSION', trim(file_get_contents('version.inc')) . 'R');
-define ( 'ZOT_REVISION', 1 );
-define ( 'DB_UPDATE_VERSION', 1031 );
+
+define ( 'RED_PLATFORM', 'Red Matrix' );
+define ( 'RED_VERSION', trim(file_get_contents('version.inc')) . 'R');
+define ( 'ZOT_REVISION', 1 );
+
+define ( 'DB_UPDATE_VERSION', 1091 );
define ( 'EOL', '<br />' . "\r\n" );
define ( 'ATOM_TIME', 'Y-m-d\TH:i:s\Z' );
@@ -62,6 +92,21 @@ define ( 'LANGUAGE_DETECT_MIN_CONFIDENCE', 0.01 );
/**
+ * Default permissions for file-based storage (webDAV, etc.)
+ * These files will be owned by the webserver who will need write
+ * access to the "storage" folder.
+ * Ideally you should make this 700, however some hosted platforms
+ * may not let you change ownership of this directory so we're
+ * defaulting to both owner-write and group-write privilege.
+ * This should work for most cases without modification.
+ * Over-ride this in your .htconfig.php if you need something
+ * either more or less restrictive.
+ */
+
+define ( 'STORAGE_DEFAULT_PERMISSIONS', 0770 );
+
+
+/**
*
* An alternate way of limiting picture upload sizes. Specify the maximum pixel
* length that pictures are allowed to be (for non-square pictures, it will apply
@@ -92,7 +137,7 @@ define ( 'DEFAULT_DB_ENGINE', 'MyISAM' );
define ( 'SSL_POLICY_NONE', 0 );
define ( 'SSL_POLICY_FULL', 1 );
-define ( 'SSL_POLICY_SELFSIGN', 2 );
+define ( 'SSL_POLICY_SELFSIGN', 2 ); // NOT supported in Red
/**
@@ -113,6 +158,16 @@ define ( 'REGISTER_CLOSED', 0 );
define ( 'REGISTER_APPROVE', 1 );
define ( 'REGISTER_OPEN', 2 );
+
+/**
+ * site access policy
+ */
+
+define ( 'ACCESS_PRIVATE', 0 );
+define ( 'ACCESS_PAID', 1 );
+define ( 'ACCESS_FREE', 2 );
+define ( 'ACCESS_TIERED', 3 );
+
/**
* relationship types
*/
@@ -130,15 +185,15 @@ define ( 'UPDATE_SUCCESS', 0);
define ( 'UPDATE_FAILED', 1);
+
+define ( 'CLIENT_MODE_NORMAL', 0x0000);
+define ( 'CLIENT_MODE_LOAD', 0x0001);
+define ( 'CLIENT_MODE_UPDATE', 0x0002);
+
+
/**
*
- * page/profile types
- *
- * PAGE_NORMAL is a typical personal profile account
- * PAGE_SOAPBOX automatically approves all friend requests as CONTACT_IS_SHARING, (readonly)
- * PAGE_COMMUNITY automatically approves all friend requests as CONTACT_IS_SHARING, but with
- * write access to wall and comments (no email and not included in page owner's ACL lists)
- * PAGE_FREELOVE automatically approves all friend requests as full friends (CONTACT_IS_FRIEND).
+ * Channel pageflags
*
*/
@@ -146,12 +201,29 @@ define ( 'PAGE_NORMAL', 0x0000 );
define ( 'PAGE_HIDDEN', 0x0001 );
define ( 'PAGE_AUTOCONNECT', 0x0002 );
define ( 'PAGE_APPLICATION', 0x0004 );
+define ( 'PAGE_DIRECTORY_CHANNEL', 0x0008 ); // system channel used for directory synchronisation
+define ( 'PAGE_PREMIUM', 0x0010 );
+define ( 'PAGE_ADULT', 0x0020 );
+define ( 'PAGE_SYSTEM', 0x1000 );
define ( 'PAGE_REMOVED', 0x8000 );
-//define ( 'PAGE_FREELOVE', 3 );
-//define ( 'PAGE_BLOG', 4 );
-//define ( 'PAGE_PRVGROUP', 5 );
+
+/**
+ * Photo types
+ */
+
+define ( 'PHOTO_NORMAL', 0x0000 );
+define ( 'PHOTO_PROFILE', 0x0001 );
+define ( 'PHOTO_XCHAN', 0x0002 );
+define ( 'PHOTO_THING', 0x0004 );
+
+/**
+ * Menu types
+ */
+
+define ( 'MENU_SYSTEM', 0x0001 );
+define ( 'MENU_BOOKMARK', 0x0002 );
/**
* Network and protocol family types
@@ -178,26 +250,26 @@ define ( 'NETWORK_PHANTOM', 'unkn'); // Place holder
*/
-define ( 'PERMS_R_STREAM', 0x0001);
-define ( 'PERMS_R_PROFILE', 0x0002);
-define ( 'PERMS_R_PHOTOS', 0x0004);
-define ( 'PERMS_R_ABOOK', 0x0008);
+define ( 'PERMS_R_STREAM', 0x00001);
+define ( 'PERMS_R_PROFILE', 0x00002);
+define ( 'PERMS_R_PHOTOS', 0x00004);
+define ( 'PERMS_R_ABOOK', 0x00008);
-define ( 'PERMS_W_STREAM', 0x0010);
-define ( 'PERMS_W_WALL', 0x0020);
-define ( 'PERMS_W_TAGWALL', 0x0040);
-define ( 'PERMS_W_COMMENT', 0x0080);
-define ( 'PERMS_W_MAIL', 0x0100);
-define ( 'PERMS_W_PHOTOS', 0x0200);
-define ( 'PERMS_W_CHAT', 0x0400);
-define ( 'PERMS_A_DELEGATE', 0x0800);
-
-define ( 'PERMS_R_STORAGE', 0x1000);
-define ( 'PERMS_W_STORAGE', 0x2000);
-define ( 'PERMS_R_PAGES', 0x4000);
-define ( 'PERMS_W_PAGES', 0x8000);
+define ( 'PERMS_W_STREAM', 0x00010);
+define ( 'PERMS_W_WALL', 0x00020);
+define ( 'PERMS_W_TAGWALL', 0x00040);
+define ( 'PERMS_W_COMMENT', 0x00080);
+define ( 'PERMS_W_MAIL', 0x00100);
+define ( 'PERMS_W_PHOTOS', 0x00200);
+define ( 'PERMS_W_CHAT', 0x00400);
+define ( 'PERMS_A_DELEGATE', 0x00800);
+define ( 'PERMS_R_STORAGE', 0x01000);
+define ( 'PERMS_W_STORAGE', 0x02000);
+define ( 'PERMS_R_PAGES', 0x04000);
+define ( 'PERMS_W_PAGES', 0x08000);
+define ( 'PERMS_A_REPUBLISH', 0x10000);
// General channel permissions
@@ -223,6 +295,8 @@ define ( 'MAIL_DELETED', 0x0001);
define ( 'MAIL_REPLIED', 0x0002);
define ( 'MAIL_ISREPLY', 0x0004);
define ( 'MAIL_SEEN', 0x0008);
+define ( 'MAIL_RECALLED', 0x0010);
+define ( 'MAIL_OBSCURED', 0x0020);
define ( 'ATTACH_FLAG_DIR', 0x0001);
@@ -230,6 +304,27 @@ define ( 'ATTACH_FLAG_OS', 0x0002);
+define ( 'MENU_ITEM_ZID', 0x0001);
+define ( 'MENU_ITEM_NEWWIN', 0x0002);
+
+
+/**
+ * Poll/Survey types
+ */
+
+define ( 'POLL_SIMPLE_RATING', 0x0001); // 1-5
+define ( 'POLL_TENSCALE', 0x0002); // 1-10
+define ( 'POLL_MULTIPLE_CHOICE', 0x0004);
+define ( 'POLL_OVERWRITE', 0x8000); // If you vote twice remove the prior entry
+
+
+
+define ( 'UPDATE_FLAGS_UPDATED', 0x0001);
+define ( 'UPDATE_FLAGS_DELETED', 0x1000);
+
+
+
+
/**
* Maximum number of "people who like (or don't like) this" that we will list by name
*/
@@ -271,27 +366,45 @@ define ( 'NOTIFY_SYSTEM', 0x8000 );
define ( 'HUBLOC_FLAGS_PRIMARY', 0x0001);
define ( 'HUBLOC_FLAGS_UNVERIFIED', 0x0002);
+define ( 'HUBLOC_FLAGS_DELETED', 0x1000);
-
+define ( 'XCHAN_FLAGS_NORMAL', 0x0000);
define ( 'XCHAN_FLAGS_HIDDEN', 0x0001);
+define ( 'XCHAN_FLAGS_ORPHAN', 0x0002);
+define ( 'XCHAN_FLAGS_CENSORED', 0x0004);
+define ( 'XCHAN_FLAGS_SELFCENSORED', 0x0008);
+define ( 'XCHAN_FLAGS_SYSTEM', 0x0010);
+define ( 'XCHAN_FLAGS_DELETED', 0x1000);
+/*
+ * Traficlights for Administration of HubLoc
+ * to detect problems in inter server communication
+ */
+define ('HUBLOC_NOTUSED', 0x0000);
+define ('HUBLOC_SEND_ERROR', 0x0001);
+define ('HUBLOC_RECEIVE_ERROR', 0x0002);
+define ('HUBLOC_WORKS', 0x0004);
+define ('HUBLOC_OFFLINE', 0x0008);
/**
* Tag/term types
*/
-define ( 'TERM_UNKNOWN', 0 );
-define ( 'TERM_HASHTAG', 1 );
-define ( 'TERM_MENTION', 2 );
-define ( 'TERM_CATEGORY', 3 );
-define ( 'TERM_PCATEGORY', 4 );
-define ( 'TERM_FILE', 5 );
-define ( 'TERM_SAVEDSEARCH', 6 );
-
-
-define ( 'TERM_OBJ_POST', 1 );
-define ( 'TERM_OBJ_PHOTO', 2 );
+define ( 'TERM_UNKNOWN', 0 );
+define ( 'TERM_HASHTAG', 1 );
+define ( 'TERM_MENTION', 2 );
+define ( 'TERM_CATEGORY', 3 );
+define ( 'TERM_PCATEGORY', 4 );
+define ( 'TERM_FILE', 5 );
+define ( 'TERM_SAVEDSEARCH', 6 );
+define ( 'TERM_THING', 7 );
+define ( 'TERM_OBJ_POST', 1 );
+define ( 'TERM_OBJ_PHOTO', 2 );
+define ( 'TERM_OBJ_PROFILE', 3 );
+define ( 'TERM_OBJ_CHANNEL', 4 );
+define ( 'TERM_OBJ_OBJECT', 5 );
+define ( 'TERM_OBJ_THING', 6 );
/**
@@ -346,6 +459,7 @@ define ( 'ACTIVITY_OBJ_EVENT', NAMESPACE_ACTIVITY_SCHEMA . 'event' );
define ( 'ACTIVITY_OBJ_GROUP', NAMESPACE_ACTIVITY_SCHEMA . 'group' );
define ( 'ACTIVITY_OBJ_TAGTERM', NAMESPACE_ZOT . '/activity/tagterm' );
define ( 'ACTIVITY_OBJ_PROFILE', NAMESPACE_ZOT . '/activity/profile' );
+define ( 'ACTIVITY_OBJ_THING', NAMESPACE_ZOT . '/activity/thing' );
/**
* item weight for query ordering
@@ -371,8 +485,10 @@ define ( 'ACCOUNT_PENDING', 0x0010 );
* Account roles
*/
-define ( 'ACCOUNT_ROLE_ADMIN', 0x1000 );
+define ( 'ACCOUNT_ROLE_ALLOWCODE', 0x0001 );
+define ( 'ACCOUNT_ROLE_SYSTEM', 0x0002 );
+define ( 'ACCOUNT_ROLE_ADMIN', 0x1000 );
/**
* Item visibility
@@ -385,8 +501,11 @@ define ( 'ITEM_MODERATED', 0x0004);
define ( 'ITEM_SPAM', 0x0008);
define ( 'ITEM_DELETED', 0x0010);
define ( 'ITEM_UNPUBLISHED', 0x0020);
-define ( 'ITEM_WEBPAGE', 0x0040); // is a static web page, not a conversational item
-
+define ( 'ITEM_WEBPAGE', 0x0040); // is a static web page, not a conversational item
+define ( 'ITEM_DELAYED_PUBLISH', 0x0080);
+define ( 'ITEM_BUILDBLOCK', 0x0100); // Named thusly to make sure nobody confuses this with ITEM_BLOCKED
+define ( 'ITEM_PDL', 0x0200); // Page Description Language - e.g. Comanche
+define ( 'ITEM_BUG', 0x0400); // Is a bug, can be used by the internal bug tracker
/**
* Item Flags
*/
@@ -402,8 +521,9 @@ define ( 'ITEM_NOTSHOWN', 0x0080); // technically visible but not normal
define ( 'ITEM_NSFW', 0x0100);
define ( 'ITEM_RELAY', 0x0200); // used only in the communication layers, not stored
define ( 'ITEM_MENTIONSME', 0x0400);
-
-
+define ( 'ITEM_NOCOMMENT', 0x0800); // commenting/followups are disabled
+define ( 'ITEM_OBSCURED', 0x1000); // bit-mangled to protect from casual browsing by site admin
+define ( 'ITEM_VERIFIED', 0x2000); // Signature verification was successful
/**
*
* Reverse the effect of magic_quotes_gpc if it is enabled.
@@ -453,466 +573,495 @@ function startup() {
*
*/
-if(! class_exists('App')) {
- class App {
+
+class App {
- public $account = null; // account record
- public $channel = null; // channel record
- public $observer = null; // xchan record
-
- private $perms = null; // observer permissions
- private $widgets = array(); // widgets for this page
- private $widgetlist = null; // widget ordering and inclusion directives
-
- public $groups;
- public $language;
- public $module_loaded = false;
- public $query_string;
- public $config; // config cache
- public $page;
- public $profile;
- public $user;
- public $cid;
- public $contact;
- public $contacts;
- public $content;
- public $data = array();
- public $error = false;
- public $cmd;
- public $argv;
- public $argc;
- public $module;
- public $pager;
- public $strings;
- public $hooks;
- public $timezone;
- public $interactive = true;
- public $plugins;
- private $apps = array();
- public $identities;
- public $css_sources = array();
- public $js_sources = array();
- public $theme_info = array();
+ public $account = null; // account record of the logged-in account
+ public $channel = null; // channel record of the current channel of the logged-in account
+ public $observer = null; // xchan record of the page observer
+ public $profile_uid = 0; // If applicable, the channel_id of the "page owner"
+ public $poi = null; // "person of interest", generally a referenced connection
+ public $layout = array(); // Comanche parsed template
+
+
+ private $perms = null; // observer permissions
+ private $widgets = array(); // widgets for this page
+ private $widgetlist = null; // widget ordering and inclusion directives
+
+ public $groups;
+ public $language;
+ public $module_loaded = false;
+ public $query_string;
+ public $config; // config cache
+ public $page;
+ public $profile;
+ public $user;
+ public $cid;
+ public $contact;
+ public $contacts;
+ public $content;
+ public $data = array();
+ public $error = false;
+ public $cmd;
+ public $argv;
+ public $argc;
+ public $module;
+ public $pager;
+ public $strings;
+ public $hooks;
+ public $timezone;
+ public $interactive = true;
+ public $plugins;
+ private $apps = array();
+ public $identities;
+ public $css_sources = array();
+ public $js_sources = array();
+ public $theme_info = array();
- public $nav_sel;
-
- public $category;
-
- // Allow themes to control internal parameters
- // by changing App values in theme.php
-
- public $sourcename = '';
- public $videowidth = 425;
- public $videoheight = 350;
- public $force_max_items = 0;
- public $theme_thread_allow = true;
-
- // An array for all theme-controllable parameters
- // Mostly unimplemented yet. Only options 'template_engine' and
- // beyond are used.
-
- private $theme = array(
- 'sourcename' => '',
- 'videowidth' => 425,
- 'videoheight' => 350,
- 'force_max_items' => 0,
- 'thread_allow' => true,
- 'stylesheet' => '',
- 'template_engine' => 'internal',
- );
-
- private $ldelim = array(
- 'internal' => '',
- 'smarty3' => '{{'
- );
- private $rdelim = array(
- 'internal' => '',
- 'smarty3' => '}}'
- );
-
- private $scheme;
- private $hostname;
- private $baseurl;
- private $path;
-
- private $db;
-
- private $curl_code;
- private $curl_headers;
-
- private $cached_profile_image;
- private $cached_profile_picdate;
-
- function __construct() {
-
- global $default_timezone;
+ public $nav_sel;
+
+ public $category;
+
+ // Allow themes to control internal parameters
+ // by changing App values in theme.php
+
+ public $sourcename = '';
+ public $videowidth = 425;
+ public $videoheight = 350;
+ public $force_max_items = 0;
+ public $theme_thread_allow = true;
+
+ // An array for all theme-controllable parameters
+ // Mostly unimplemented yet. Only options 'template_engine' and
+ // beyond are used.
+
+ private $theme = array(
+ 'sourcename' => '',
+ 'videowidth' => 425,
+ 'videoheight' => 350,
+ 'force_max_items' => 0,
+ 'thread_allow' => true,
+ 'stylesheet' => '',
+ 'template_engine' => 'smarty3',
+ );
- $this->timezone = ((x($default_timezone)) ? $default_timezone : 'UTC');
+ // array of registered template engines ('name'=>'class name')
+ public $template_engines = array();
+ // array of instanced template engines ('name'=>'instance')
+ public $template_engine_instance = array();
+
+ private $ldelim = array(
+ 'internal' => '',
+ 'smarty3' => '{{'
+ );
+ private $rdelim = array(
+ 'internal' => '',
+ 'smarty3' => '}}'
+ );
- date_default_timezone_set($this->timezone);
+ private $scheme;
+ private $hostname;
+ private $baseurl;
+ private $path;
+ private $db;
- $this->config = array();
- $this->page = array();
- $this->pager= array();
+ private $curl_code;
+ private $curl_headers;
- $this->query_string = '';
+ private $cached_profile_image;
+ private $cached_profile_picdate;
- startup();
+
+ function __construct() {
- $this->scheme = 'http';
- if(x($_SERVER,'HTTPS') && $_SERVER['HTTPS'])
- $this->scheme = 'https';
- elseif(x($_SERVER,'SERVER_PORT') && (intval($_SERVER['SERVER_PORT']) == 443))
- $this->scheme = 'https';
+ global $default_timezone;
+ $this->timezone = ((x($default_timezone)) ? $default_timezone : 'UTC');
- if(x($_SERVER,'SERVER_NAME')) {
- $this->hostname = $_SERVER['SERVER_NAME'];
+ date_default_timezone_set($this->timezone);
- if(x($_SERVER,'SERVER_PORT') && $_SERVER['SERVER_PORT'] != 80 && $_SERVER['SERVER_PORT'] != 443)
- $this->hostname .= ':' . $_SERVER['SERVER_PORT'];
- /**
- * Figure out if we are running at the top of a domain
- * or in a sub-directory and adjust accordingly
- */
+ $this->config = array('system'=>array());
+ $this->page = array();
+ $this->pager= array();
- $path = trim(dirname($_SERVER['SCRIPT_NAME']),'/\\');
- if(isset($path) && strlen($path) && ($path != $this->path))
- $this->path = $path;
- }
+ $this->query_string = '';
- set_include_path(
- "include/$this->hostname" . PATH_SEPARATOR
- . 'include' . PATH_SEPARATOR
- . 'library' . PATH_SEPARATOR
- . 'library/phpsec' . PATH_SEPARATOR
- . 'library/langdet' . PATH_SEPARATOR
- . '.' );
-
- if((x($_SERVER,'QUERY_STRING')) && substr($_SERVER['QUERY_STRING'],0,2) === "q=") {
- $this->query_string = substr($_SERVER['QUERY_STRING'],2);
- // removing trailing / - maybe a nginx problem
- if (substr($this->query_string, 0, 1) == "/")
- $this->query_string = substr($this->query_string, 1);
- }
- if(x($_GET,'q'))
- $this->cmd = trim($_GET['q'],'/\\');
+ startup();
- // unix style "homedir"
+ set_include_path(
+ 'include' . PATH_SEPARATOR
+ . 'library' . PATH_SEPARATOR
+ . 'library/phpsec' . PATH_SEPARATOR
+ . 'library/langdet' . PATH_SEPARATOR
+ . '.' );
- if(substr($this->cmd,0,1) === '~')
- $this->cmd = 'channel/' . substr($this->cmd,1);
+ $this->scheme = 'http';
+ if(x($_SERVER,'HTTPS') && $_SERVER['HTTPS'])
+ $this->scheme = 'https';
+ elseif(x($_SERVER,'SERVER_PORT') && (intval($_SERVER['SERVER_PORT']) == 443))
+ $this->scheme = 'https';
+ if(x($_SERVER,'SERVER_NAME')) {
+ $this->hostname = $_SERVER['SERVER_NAME'];
+ if(x($_SERVER,'SERVER_PORT') && $_SERVER['SERVER_PORT'] != 80 && $_SERVER['SERVER_PORT'] != 443)
+ $this->hostname .= ':' . $_SERVER['SERVER_PORT'];
/**
- *
- * Break the URL path into C style argc/argv style arguments for our
- * modules. Given "http://example.com/module/arg1/arg2", $this->argc
- * will be 3 (integer) and $this->argv will contain:
- * [0] => 'module'
- * [1] => 'arg1'
- * [2] => 'arg2'
- *
- *
- * There will always be one argument. If provided a naked domain
- * URL, $this->argv[0] is set to "home".
- *
+ * Figure out if we are running at the top of a domain
+ * or in a sub-directory and adjust accordingly
*/
- $this->argv = explode('/',$this->cmd);
- $this->argc = count($this->argv);
- if((array_key_exists('0',$this->argv)) && strlen($this->argv[0])) {
- $this->module = str_replace(".", "_", $this->argv[0]);
- $this->module = str_replace("-", "_", $this->module);
- }
- else {
- $this->argc = 1;
- $this->argv = array('home');
- $this->module = 'home';
- }
+ $path = trim(dirname($_SERVER['SCRIPT_NAME']),'/\\');
+ if(isset($path) && strlen($path) && ($path != $this->path))
+ $this->path = $path;
+ }
+ set_include_path("include/$this->hostname" . PATH_SEPARATOR . get_include_path());
- /**
- * See if there is any page number information, and initialise
- * pagination
- */
+ if((x($_SERVER,'QUERY_STRING')) && substr($_SERVER['QUERY_STRING'],0,2) === "q=") {
+ $this->query_string = substr($_SERVER['QUERY_STRING'],2);
+ // removing trailing / - maybe a nginx problem
+ if (substr($this->query_string, 0, 1) == "/")
+ $this->query_string = substr($this->query_string, 1);
+ }
+ if(x($_GET,'q'))
+ $this->cmd = trim($_GET['q'],'/\\');
- $this->pager['page'] = ((x($_GET,'page') && intval($_GET['page']) > 0) ? intval($_GET['page']) : 1);
- $this->pager['itemspage'] = 50;
- $this->pager['start'] = ($this->pager['page'] * $this->pager['itemspage']) - $this->pager['itemspage'];
- if($this->pager['start'] < 0)
- $this->pager['start'] = 0;
- $this->pager['total'] = 0;
+ // unix style "homedir"
- /**
- * Detect mobile devices
- */
+ if(substr($this->cmd,0,1) === '~')
+ $this->cmd = 'channel/' . substr($this->cmd,1);
- $mobile_detect = new Mobile_Detect();
- $this->is_mobile = $mobile_detect->isMobile();
- $this->is_tablet = $mobile_detect->isTablet();
- BaseObject::set_app($this);
+
+ /**
+ *
+ * Break the URL path into C style argc/argv style arguments for our
+ * modules. Given "http://example.com/module/arg1/arg2", $this->argc
+ * will be 3 (integer) and $this->argv will contain:
+ * [0] => 'module'
+ * [1] => 'arg1'
+ * [2] => 'arg2'
+ *
+ *
+ * There will always be one argument. If provided a naked domain
+ * URL, $this->argv[0] is set to "home".
+ *
+ */
+
+ $this->argv = explode('/',$this->cmd);
+ $this->argc = count($this->argv);
+ if((array_key_exists('0',$this->argv)) && strlen($this->argv[0])) {
+ $this->module = str_replace(".", "_", $this->argv[0]);
+ $this->module = str_replace("-", "_", $this->module);
+ }
+ else {
+ $this->argc = 1;
+ $this->argv = array('home');
+ $this->module = 'home';
}
- function get_baseurl($ssl = false) {
- $scheme = $this->scheme;
- if((x($this->config,'system')) && (x($this->config['system'],'ssl_policy'))) {
- if(intval($this->config['system']['ssl_policy']) === intval(SSL_POLICY_FULL))
- $scheme = 'https';
+ /**
+ * See if there is any page number information, and initialise
+ * pagination
+ */
- // Basically, we have $ssl = true on any links which can only be seen by a logged in user
- // (and also the login link). Anything seen by an outsider will have it turned off.
+ $this->pager['page'] = ((x($_GET,'page') && intval($_GET['page']) > 0) ? intval($_GET['page']) : 1);
+ $this->pager['itemspage'] = 50;
+ $this->pager['start'] = ($this->pager['page'] * $this->pager['itemspage']) - $this->pager['itemspage'];
+ if($this->pager['start'] < 0)
+ $this->pager['start'] = 0;
+ $this->pager['total'] = 0;
- if($this->config['system']['ssl_policy'] == SSL_POLICY_SELFSIGN) {
- if($ssl)
- $scheme = 'https';
- else
- $scheme = 'http';
- }
- }
-
- $this->baseurl = $scheme . "://" . $this->hostname . ((isset($this->path) && strlen($this->path)) ? '/' . $this->path : '' );
- return $this->baseurl;
- }
+ /**
+ * Detect mobile devices
+ */
- function set_baseurl($url) {
+ $mobile_detect = new Mobile_Detect();
+ $this->is_mobile = $mobile_detect->isMobile();
+ $this->is_tablet = $mobile_detect->isTablet();
- if(is_array($this->config) && array_key_exists('system',$this->config) &&
- array_key_exists('baseurl',$this->config['system']) && strlen($this->config['system']['baseurl'])) {
- $url = $this->config['system']['baseurl'];
+ $this->head_set_icon('/images/rm-32.png');
+
+ BaseObject::set_app($this);
+
+ /**
+ * register template engines
+ */
+ $dc = get_declared_classes();
+ foreach ($dc as $k) {
+ if (in_array("ITemplateEngine", class_implements($k))){
+ $this->register_template_engine($k);
}
+ }
+ }
- $parsed = @parse_url($url);
+ function get_baseurl($ssl = false) {
- $this->baseurl = $url;
- if($parsed) {
- $this->scheme = $parsed['scheme'];
+ if(is_array($this->config)
+ && array_key_exists('system',$this->config)
+ && is_array($this->config['system'])
+ && array_key_exists('baseurl',$this->config['system'])
+ && strlen($this->config['system']['baseurl'])) {
+ $url = $this->config['system']['baseurl'];
+ return $url;
+ }
- $this->hostname = $parsed['host'];
- if(x($parsed,'port'))
- $this->hostname .= ':' . $parsed['port'];
- if(x($parsed,'path'))
- $this->path = trim($parsed['path'],'\\/');
- }
- }
+ $scheme = $this->scheme;
- function get_hostname() {
- return $this->hostname;
- }
+ $this->baseurl = $scheme . "://" . $this->hostname . ((isset($this->path) && strlen($this->path)) ? '/' . $this->path : '' );
+ return $this->baseurl;
+ }
- function set_hostname($h) {
- $this->hostname = $h;
- }
+ function set_baseurl($url) {
- function set_path($p) {
- $this->path = trim(trim($p),'/');
+ if(is_array($this->config)
+ && array_key_exists('system',$this->config)
+ && is_array($this->config['system'])
+ && array_key_exists('baseurl',$this->config['system'])
+ && strlen($this->config['system']['baseurl'])) {
+ $url = $this->config['system']['baseurl'];
}
- function get_path() {
- return $this->path;
- }
+ $parsed = @parse_url($url);
- function set_account($aid) {
- $this->account = $aid;
- }
+ $this->baseurl = $url;
- function get_account() {
- return $this->account;
- }
+ if($parsed) {
+ $this->scheme = $parsed['scheme'];
- function set_channel($channel) {
- $this->channel = $channel;
+ $this->hostname = $parsed['host'];
+ if(x($parsed,'port'))
+ $this->hostname .= ':' . $parsed['port'];
+ if(x($parsed,'path'))
+ $this->path = trim($parsed['path'],'\\/');
}
- function get_channel() {
- return $this->channel;
- }
+ }
+ function get_hostname() {
+ return $this->hostname;
+ }
- function set_observer($xchan) {
- $this->observer = $xchan;
- }
+ function set_hostname($h) {
+ $this->hostname = $h;
+ }
- function get_observer() {
- return $this->observer;
- }
+ function set_path($p) {
+ $this->path = trim(trim($p),'/');
+ }
- function set_perms($perms) {
- $this->perms = $perms;
- }
+ function get_path() {
+ return $this->path;
+ }
- function get_perms() {
- return $this->perms;
- }
+ function set_account($acct) {
+ $this->account = $acct;
+ }
- function get_apps() {
- return $this->apps;
- }
+ function get_account() {
+ return $this->account;
+ }
- function set_apps($arr) {
- $this->apps = $arr;
- }
+ function set_channel($channel) {
+ $this->channel = $channel;
+ }
- function set_groups($g) {
- $this->groups = $g;
- }
+ function get_channel() {
+ return $this->channel;
+ }
- function get_groups() {
- return $this->groups;
- }
- /*
- * Use a theme or app specific widget ordering list to determine what widgets should be included
- * for each module and in what order and optionally what region of the page to place them.
- * For example:
- * view/wgl/mod_connections.wgl:
- * -----------------------------
- * vcard aside
- * follow aside
- * findpeople rightside
- * collections aside
- *
- * If your widgetlist does not include a widget that is destined for the page, it will not be rendered.
- * You can also use this to change the order of presentation, as they will be presented in the order you specify.
- *
- */
+ function set_observer($xchan) {
+ $this->observer = $xchan;
+ }
- function set_widget($title,$html, $location = 'aside') {
- $widgetlist_file = 'mod_' . $this->module . '.wgl';
- if(! $this->widgetlist) {
- if($this->module && (($f = theme_include($widgetlist_file)) !== '')) {
- $s = file($f, FILE_IGNORE_NEW_LINES|FILE_SKIP_EMPTY_LINES);
- if(is_array($s)) {
- foreach($s as $x) {
- $this->widgetlist[] = explode(' ', $x);
- }
- }
- }
- else {
- $this->widgets[] = array('title' => $title, 'html' => $html, 'location' => $location);
- }
- }
- if($this->widgetlist) {
- foreach($this->widgetlist as $k => $v) {
- if($v[0] && $v[0] === $title) {
- $this->widgets[$k] = array('title' => $title, 'html' => $html, 'location' => (($v[1]) ? $v[1] : $location));
- }
- }
- }
- }
+ function get_observer() {
+ return $this->observer;
+ }
- function get_widgets($location = '') {
- if($location && count($this->widgets)) {
- $ret = array();
- foreach($widgets as $w)
- if($w['location'] == $location)
- $ret[] = $w;
- $arr = array('location' => $location, 'widgets' => $ret);
- call_hooks('get_widgets', $arr);
- return $arr['widgets'];
- }
-
- $arr = array('location' => $location, 'widgets' => $this->widgets);
- call_hooks('get_widgets', $arr);
- return $arr['widgets'];
- }
+ function set_perms($perms) {
+ $this->perms = $perms;
+ }
- function set_pager_total($n) {
- $this->pager['total'] = intval($n);
- }
+ function get_perms() {
+ return $this->perms;
+ }
- function set_pager_itemspage($n) {
- $this->pager['itemspage'] = ((intval($n) > 0) ? intval($n) : 0);
- $this->pager['start'] = ($this->pager['page'] * $this->pager['itemspage']) - $this->pager['itemspage'];
+ function get_apps() {
+ return $this->apps;
+ }
- }
+ function set_apps($arr) {
+ $this->apps = $arr;
+ }
- function build_pagehead() {
+ function set_groups($g) {
+ $this->groups = $g;
+ }
- $interval = ((local_user()) ? get_pconfig(local_user(),'system','update_interval') : 40000);
- if($interval < 10000)
- $interval = 40000;
+ function get_groups() {
+ return $this->groups;
+ }
- $this->page['title'] = $this->config['system']['sitename'];
+ function set_widget($title,$html, $location = 'aside') {
+ $this->widgets[] = array('title' => $title, 'html' => $html, 'location' => $location);
+ }
+ function get_widgets($location = '') {
+ if($location && count($this->widgets)) {
+ $ret = array();
+ foreach($widgets as $w)
+ if($w['location'] == $location)
+ $ret[] = $w;
+ $arr = array('location' => $location, 'widgets' => $ret);
+ call_hooks('get_widgets', $arr);
+ return $arr['widgets'];
+ }
+ $arr = array('location' => $location, 'widgets' => $this->widgets);
+ call_hooks('get_widgets', $arr);
+ return $arr['widgets'];
+ }
+
+ function set_pager_total($n) {
+ $this->pager['total'] = intval($n);
+ }
- /* put the head template at the beginning of page['htmlhead']
- * since the code added by the modules frequently depends on it
- * being first
- */
- $tpl = get_markup_template('head.tpl');
- $this->page['htmlhead'] = replace_macros($tpl, array(
- '$baseurl' => $this->get_baseurl(),
- '$local_user' => local_user(),
- '$generator' => FRIENDICA_PLATFORM . ' ' . FRIENDICA_VERSION,
- '$update_interval' => $interval,
- '$head_css' => head_get_css(),
- '$head_js' => head_get_js(),
- '$js_strings' => js_strings()
- )) . $this->page['htmlhead'];
- }
+ function set_pager_itemspage($n) {
+ $this->pager['itemspage'] = ((intval($n) > 0) ? intval($n) : 0);
+ $this->pager['start'] = ($this->pager['page'] * $this->pager['itemspage']) - $this->pager['itemspage'];
+ }
- function set_curl_code($code) {
- $this->curl_code = $code;
- }
+ function build_pagehead() {
- function get_curl_code() {
- return $this->curl_code;
- }
+ $interval = ((local_user()) ? get_pconfig(local_user(),'system','update_interval') : 40000);
+ if($interval < 10000)
+ $interval = 40000;
- function set_curl_headers($headers) {
- $this->curl_headers = $headers;
- }
+ if(! x($this->page,'title'))
+ $this->page['title'] = $this->config['system']['sitename'];
- function get_curl_headers() {
- return $this->curl_headers;
- }
+ /* put the head template at the beginning of page['htmlhead']
+ * since the code added by the modules frequently depends on it
+ * being first
+ */
+ $tpl = get_markup_template('head.tpl');
+ $this->page['htmlhead'] = replace_macros($tpl, array(
+ '$baseurl' => $this->get_baseurl(),
+ '$local_user' => local_user(),
+ '$generator' => RED_PLATFORM . ' ' . RED_VERSION,
+ '$update_interval' => $interval,
+ '$icon' => head_get_icon(),
+ '$head_css' => head_get_css(),
+ '$head_js' => head_get_js(),
+ '$js_strings' => js_strings(),
+ '$zid' => get_my_address(),
+ )) . $this->page['htmlhead'];
+ }
- function get_template_engine() {
- return $this->theme['template_engine'];
- }
+ /**
+ * register template engine class
+ * if $name is "", is used class static property $class::$name
+ * @param string $class
+ * @param string $name
+ */
+ function register_template_engine($class, $name = '') {
+ if ($name===""){
+ $v = get_class_vars( $class );
+ if(x($v,"name")) $name = $v['name'];
+ }
+ if ($name===""){
+ echo "template engine <tt>$class</tt> cannot be registered without a name.\n";
+ killme();
+ }
+ $this->template_engines[$name] = $class;
+ }
- function set_template_engine($engine = 'internal') {
+ /**
+ * return template engine instance. If $name is not defined,
+ * return engine defined by theme, or default
+ *
+ * @param strin $name Template engine name
+ * @return object Template Engine instance
+ */
+ function template_engine($name = ''){
+ if ($name!=="") {
+ $template_engine = $name;
+ } else {
+ $template_engine = 'smarty3';
+ if (x($this->theme, 'template_engine')) {
+ $template_engine = $this->theme['template_engine'];
+ }
+ }
+
+ if (isset($this->template_engines[$template_engine])){
+ if(isset($this->template_engine_instance[$template_engine])){
+ return $this->template_engine_instance[$template_engine];
+ } else {
+ $class = $this->template_engines[$template_engine];
+ $obj = new $class;
+ $this->template_engine_instance[$template_engine] = $obj;
+ return $obj;
+ }
+ }
+
+ echo "template engine <tt>$template_engine</tt> is not registered!\n"; killme();
+ }
+
+ function get_template_engine() {
+ return $this->theme['template_engine'];
+ }
- $this->theme['template_engine'] = 'internal';
+ function set_template_engine($engine = 'smarty3') {
- switch($engine) {
- case 'smarty3':
- if(is_writable('view/tpl/smarty3/'))
- $this->theme['template_engine'] = 'smarty3';
- break;
- default:
- break;
- }
- }
+ $this->theme['template_engine'] = $engine;
- function get_template_ldelim($engine = 'internal') {
- return $this->ldelim[$engine];
- }
+ /*if ($engine) {
+ case 'smarty3':
+ if(!is_writable('view/tpl/smarty3/'))
+ echo "<b>ERROR</b> folder <tt>view/tpl/smarty3/</tt> must be writable by webserver."; killme();
+
+ break;
+ default:
+ break;
+ }*/
+ }
+ function get_template_ldelim($engine = 'smarty3') {
+ return $this->ldelim[$engine];
+ }
- function get_template_rdelim($engine = 'internal') {
- return $this->rdelim[$engine];
- }
+ function get_template_rdelim($engine = 'smarty3') {
+ return $this->rdelim[$engine];
+ }
+ function head_set_icon($icon) {
+ $this->data['pageicon'] = $icon;
+
+ }
+ function head_get_icon() {
+ $icon = $this->data['pageicon'];
+ if(! strpos($icon,'://'))
+ $icon = z_root() . $icon;
+ return $icon;
}
+
}
+
// retrieve the App structure
// useful in functions which require it but don't get it passed to them
-if(! function_exists('get_app')) {
- function get_app() {
- global $a;
- return $a;
- }
-};
+function get_app() {
+ global $a;
+ return $a;
+}
+
// Multi-purpose function to check variable state.
@@ -921,38 +1070,36 @@ if(! function_exists('get_app')) {
// if variable is set, returns 1 if has 'non-zero' value, otherwise returns 0.
// e.g. x('') or x(0) returns 0;
-if(! function_exists('x')) {
- function x($s,$k = NULL) {
- if($k != NULL) {
- if((is_array($s)) && (array_key_exists($k,$s))) {
- if($s[$k])
- return (int) 1;
- return (int) 0;
- }
- return false;
- }
- else {
- if(isset($s)) {
- if($s) {
- return (int) 1;
- }
- return (int) 0;
+
+function x($s,$k = NULL) {
+ if($k != NULL) {
+ if((is_array($s)) && (array_key_exists($k,$s))) {
+ if($s[$k])
+ return (int) 1;
+ return (int) 0;
+ }
+ return false;
+ }
+ else {
+ if(isset($s)) {
+ if($s) {
+ return (int) 1;
}
- return false;
+ return (int) 0;
}
+ return false;
}
}
+
// called from db initialisation if db is dead.
-if(! function_exists('system_unavailable')) {
- function system_unavailable() {
- include('system_unavailable.php');
- system_down();
- killme();
- }
-}
+function system_unavailable() {
+ include('include/system_unavailable.php');
+ system_down();
+ killme();
+}
function clean_urls() {
@@ -991,693 +1138,386 @@ function is_ajax() {
// $_SERVER variables, and synchronising the state of installed plugins.
-if(! function_exists('check_config')) {
function check_config(&$a) {
- $build = get_config('system','db_version');
- if(! x($build))
- $build = set_config('system','db_version',DB_UPDATE_VERSION);
-
-// $url = get_config('system','baseurl');
-
- // if the url isn't set or the stored url is radically different
- // than the currently visited url, store the current value accordingly.
- // "Radically different" ignores common variations such as http vs https
- // and www.example.com vs example.com.
- // We will only change the url to an ip address if there is no existing setting
-
-// if(! x($url))
-// $url = set_config('system','baseurl',$a->get_baseurl());
-// if((! link_compare($url,$a->get_baseurl())) && (! preg_match("/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/",$a->get_hostname)))
-// $url = set_config('system','baseurl',$a->get_baseurl());
-
-
-
- if($build != DB_UPDATE_VERSION) {
- $stored = intval($build);
- $current = intval(DB_UPDATE_VERSION);
- if(($stored < $current) && file_exists('install/update.php')) {
-
- load_config('database');
-
- // We're reporting a different version than what is currently installed.
- // Run any existing update scripts to bring the database up to current.
-
- require_once('install/update.php');
-
- // make sure that boot.php and update.php are the same release, we might be
- // updating right this very second and the correct version of the update.php
- // file may not be here yet. This can happen on a very busy site.
+ $build = get_config('system','db_version');
+ if(! intval($build))
+ $build = set_config('system','db_version',DB_UPDATE_VERSION);
- if(DB_UPDATE_VERSION == UPDATE_VERSION) {
+ $saved = get_config('system','urlverify');
+ if(! $saved)
+ set_config('system','urlverify',bin2hex(z_root()));
+ if(($saved) && ($saved != bin2hex(z_root()))) {
+ // our URL changed. Do something.
- for($x = $stored; $x < $current; $x ++) {
- if(function_exists('update_r' . $x)) {
-
- // There could be a lot of processes running or about to run.
- // We want exactly one process to run the update command.
- // So store the fact that we're taking responsibility
- // after first checking to see if somebody else already has.
-
- // If the update fails or times-out completely you may need to
- // delete the config entry to try again.
-
- if(get_config('database','update_r' . $x))
- break;
- set_config('database','update_r' . $x, '1');
-
- // call the specific update
+ $oldurl = hex2bin($saved);
+ logger('Baseurl changed!');
+
+ $oldhost = substr($oldurl,strpos($oldurl,'//')+2);
+ $host = substr(z_root(),strpos(z_root(),'//')+2);
+
+ $is_ip_addr = ((preg_match("/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/",$host)) ? true : false);
+ $was_ip_addr = ((preg_match("/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/",$oldhost)) ? true : false);
+ // only change the url to an ip address if it was already an ip and not a dns name
+ if((! $is_ip_addr) || ($is_ip_addr && $was_ip_addr)) {
+ fix_system_urls($oldurl,z_root());
+ set_config('system','urlverify',bin2hex(z_root()));
+ }
+ else
+ logger('Attempt to change baseurl from a DNS name to an IP address was refused.');
+ }
- $func = 'update_r' . $x;
- $retval = $func();
- if($retval) {
- //send the administrator an e-mail
+ // This will actually set the url to the one stored in .htconfig, and ignore what
+ // we're passing - unless we are installing and it has never been set.
- $email_tpl = get_intltext_template("update_fail_eml.tpl");
- $email_msg = replace_macros($email_tpl, array(
- '$sitename' => $a->config['sitename'],
- '$siteurl' => $a->get_baseurl(),
- '$update' => $x,
- '$error' => sprintf( t('Update %s failed. See error logs.'), $x)
- ));
+ $a->set_baseurl($a->get_baseurl());
- $subject=sprintf(t('Update Error at %s'), $a->get_baseurl());
+ if($build != DB_UPDATE_VERSION) {
+ $stored = intval($build);
+ if(! $stored) {
+ logger('Critical: check_config unable to determine database schema version');
+ return;
+ }
+ $current = intval(DB_UPDATE_VERSION);
+ if(($stored < $current) && file_exists('install/update.php')) {
+
+ load_config('database');
+
+ // We're reporting a different version than what is currently installed.
+ // Run any existing update scripts to bring the database up to current.
+ require_once('install/update.php');
+
+ // make sure that boot.php and update.php are the same release, we might be
+ // updating right this very second and the correct version of the update.php
+ // file may not be here yet. This can happen on a very busy site.
+
+ if(DB_UPDATE_VERSION == UPDATE_VERSION) {
+ for($x = $stored; $x < $current; $x ++) {
+ if(function_exists('update_r' . $x)) {
+ // There could be a lot of processes running or about to run.
+ // We want exactly one process to run the update command.
+ // So store the fact that we're taking responsibility
+ // after first checking to see if somebody else already has.
+
+ // If the update fails or times-out completely you may need to
+ // delete the config entry to try again.
+
+ if(get_config('database','update_r' . $x))
+ break;
+ set_config('database','update_r' . $x, '1');
+ // call the specific update
+
+ $func = 'update_r' . $x;
+ $retval = $func();
+ if($retval) {
+ // Prevent sending hundreds of thousands of emails by creating
+ // a lockfile. view/tpl/smarty3 is the only place we can
+ // guarantee the server can write to.
+ $lockfile = 'view/tpl/smarty3/mailsent';
+
+ if ((file_exists($lockfile)) && (filemtime($lockfile) > (time() - 86400)))
+ return;
+ @unlink($lockfile);
+ //send the administrator an e-mail
+ file_put_contents($lockfile, $x);
+
+ $email_tpl = get_intltext_template("update_fail_eml.tpl");
+ $email_msg = replace_macros($email_tpl, array(
+ '$sitename' => $a->config['system']['sitename'],
+ '$siteurl' => $a->get_baseurl(),
+ '$update' => $x,
+ '$error' => sprintf( t('Update %s failed. See error logs.'), $x)
+ ));
+
+ $subject = email_header_encode(sprintf(t('Update Error at %s'), $a->get_baseurl()));
- mail($a->config['admin_email'], $subject, $email_msg,
- 'From: ' . t('Administrator') . '@' . $_SERVER['SERVER_NAME'] . "\n"
- . 'Content-type: text/plain; charset=UTF-8' . "\n"
- . 'Content-transfer-encoding: 8bit' );
- //try the logger
- logger('CRITICAL: Update Failed: '. $x);
- }
- else
- set_config('database','update_r' . $x, 'success');
-
+ mail($a->config['system']['admin_email'], $subject, $email_msg,
+ 'From: Administrator' . '@' . $_SERVER['SERVER_NAME'] . "\n"
+ . 'Content-type: text/plain; charset=UTF-8' . "\n"
+ . 'Content-transfer-encoding: 8bit' );
+ //try the logger
+ logger('CRITICAL: Update Failed: ' . $x);
}
+ else
+ set_config('database','update_r' . $x, 'success');
+
}
- set_config('system','db_version', DB_UPDATE_VERSION);
}
+ set_config('system','db_version', DB_UPDATE_VERSION);
}
}
+ }
- /**
- *
- * Synchronise plugins:
- *
- * $a->config['system']['addon'] contains a comma-separated list of names
- * of plugins/addons which are used on this system.
- * Go through the database list of already installed addons, and if we have
- * an entry, but it isn't in the config list, call the uninstall procedure
- * and mark it uninstalled in the database (for now we'll remove it).
- * Then go through the config list and if we have a plugin that isn't installed,
- * call the install procedure and add it to the database.
- *
- */
+ /**
+ *
+ * Synchronise plugins:
+ *
+ * $a->config['system']['addon'] contains a comma-separated list of names
+ * of plugins/addons which are used on this system.
+ * Go through the database list of already installed addons, and if we have
+ * an entry, but it isn't in the config list, call the unload procedure
+ * and mark it uninstalled in the database (for now we'll remove it).
+ * Then go through the config list and if we have a plugin that isn't installed,
+ * call the install procedure and add it to the database.
+ *
+ */
- $r = q("SELECT * FROM `addon` WHERE `installed` = 1");
- if(count($r))
- $installed = $r;
- else
- $installed = array();
+ $r = q("SELECT * FROM `addon` WHERE `installed` = 1");
+ if($r)
+ $installed = $r;
+ else
+ $installed = array();
- $plugins = get_config('system','addon');
- $plugins_arr = array();
+ $plugins = get_config('system','addon');
+ $plugins_arr = array();
- if($plugins)
- $plugins_arr = explode(',',str_replace(' ', '',$plugins));
+ if($plugins)
+ $plugins_arr = explode(',',str_replace(' ', '',$plugins));
- $a->plugins = $plugins_arr;
+ $a->plugins = $plugins_arr;
- $installed_arr = array();
+ $installed_arr = array();
- if(count($installed)) {
- foreach($installed as $i) {
- if(! in_array($i['name'],$plugins_arr)) {
- uninstall_plugin($i['name']);
- }
- else {
- $installed_arr[] = $i['name'];
- }
+ if(count($installed)) {
+ foreach($installed as $i) {
+ if(! in_array($i['name'],$plugins_arr)) {
+ unload_plugin($i['name']);
}
- }
-
- if(count($plugins_arr)) {
- foreach($plugins_arr as $p) {
- if(! in_array($p,$installed_arr)) {
- install_plugin($p);
- }
+ else {
+ $installed_arr[] = $i['name'];
}
}
-
-
- load_hooks();
-
- return;
}
-}
-
-// wrapper for adding a login box. If $register == true provide a registration
-// link. This will most always depend on the value of $a->config['system']['register_policy'].
-// returns the complete html for inserting into the page
-
-if(! function_exists('login')) {
- function login($register = false, $form_id = 'main-login', $hiddens=false) {
- $a = get_app();
- $o = "";
- $reg = false;
- $reglink = get_config('system','register_link');
- if(! strlen($reglink))
- $reglink = 'register';
-
- if ($register) {
- $reg = array(
- 'title' => t('Create a New Account'),
- 'desc' => t('Register'),
- 'link' => $reglink
- );
- }
-
- $dest_url = $a->get_baseurl(true) . '/' . $a->query_string;
-
- if(local_user()) {
- $tpl = get_markup_template("logout.tpl");
- }
- else {
- $a->page['htmlhead'] .= replace_macros(get_markup_template("login_head.tpl"),array(
- '$baseurl' => $a->get_baseurl(true)
- ));
-
- $tpl = get_markup_template("login.tpl");
- if(strlen($a->query_string))
- $_SESSION['login_return_url'] = $a->query_string;
+ if(count($plugins_arr)) {
+ foreach($plugins_arr as $p) {
+ if(! in_array($p,$installed_arr)) {
+ load_plugin($p);
+ }
}
-
-
- $o .= replace_macros($tpl,array(
-
- '$dest_url' => $dest_url,
- '$logout' => t('Logout'),
- '$login' => t('Login'),
- '$form_id' => $form_id,
- '$lname' => array('username', t('Email') , '', ''),
- '$lpassword' => array('password', t('Password'), '', ''),
- '$remember' => array('remember', t('Remember me'), '', ''),
- '$hiddens' => $hiddens,
-
- '$register' => $reg,
-
- '$lostpass' => t('Forgot your password?'),
- '$lostlink' => t('Password Reset'),
- ));
-
- call_hooks('login_hook',$o);
-
- return $o;
}
-}
-// Used to end the current process, after saving session state.
-if(! function_exists('killme')) {
- function killme() {
- session_write_close();
- exit;
- }
+ load_hooks();
+ return;
}
-// redirect to another URL and terminate this process.
-if(! function_exists('goaway')) {
- function goaway($s) {
- header("Location: $s");
- killme();
- }
-}
-
-function get_account_id() {
- if(get_app()->account)
- return intval(get_app()->account['account_id']);
- return false;
-}
+function fix_system_urls($oldurl,$newurl) {
-// Returns the entity id of locally logged in user or false.
+ require_once('include/crypto.php');
-if(! function_exists('local_user')) {
- function local_user() {
- if((x($_SESSION,'authenticated')) && (x($_SESSION,'uid')))
- return intval($_SESSION['uid']);
- return false;
- }
-}
+ logger('fix_system_urls: renaming ' . $oldurl . ' to ' . $newurl);
-// Returns contact id of authenticated site visitor or false
+ // Basically a site rename, but this can happen if you change from http to https for instance - even if the site name didn't change
+ // This should fix URL changes on our site, but other sites will end up with orphan hublocs which they will try to contact and will
+ // cause wasted communications.
+ // What we need to do after fixing this up is to send a revocation of the old URL to every other site that we communicate with so
+ // that they can clean up their hubloc tables (this includes directories).
+ // It's a very expensive operation so you don't want to have to do it often or after your site gets to be large.
-if(! function_exists('remote_user')) {
- function remote_user() {
- if((x($_SESSION,'authenticated')) && (x($_SESSION,'visitor_id')))
- return $_SESSION['visitor_id'];
- return false;
- }
-}
+ $r = q("select xchan.*, channel.* from xchan left join channel on channel_hash = xchan_hash where xchan_url like '%s'",
+ dbesc($oldurl . '%')
+ );
+ if($r) {
+ foreach($r as $rr) {
+ $channel = substr($rr['xchan_addr'],0,strpos($rr['xchan_addr'],'@'));
+
+ $parsed = @parse_url($newurl);
+ if(! $parsed)
+ continue;
+ $newhost = $parsed['host'];
+
+ // sometimes parse_url returns unexpected results.
+
+ if(strpos($newhost,'/') !== false)
+ $newhost = substr($newhost,0,strpos($newhost,'/'));
+
+ $rhs = $newhost . (($parsed['port']) ? ':' . $parsed['port'] : '');
+
+ // paths aren't going to work. You have to be at the (sub)domain root
+ // . (($parsed['path']) ? $parsed['path'] : '');
+
+ $x = q("update xchan set xchan_addr = '%s', xchan_url = '%s', xchan_connurl = '%s', xchan_follow = '%s', xchan_connpage = '%s', xchan_photo_l = '%s', xchan_photo_m = '%s', xchan_photo_s = '%s', xchan_photo_date = '%s' where xchan_hash = '%s' limit 1",
+ dbesc($channel . '@' . $rhs),
+ dbesc(str_replace($oldurl,$newurl,$rr['xchan_url'])),
+ dbesc(str_replace($oldurl,$newurl,$rr['xchan_connurl'])),
+ dbesc(str_replace($oldurl,$newurl,$rr['xchan_follow'])),
+ dbesc(str_replace($oldurl,$newurl,$rr['xchan_connpage'])),
+ dbesc(str_replace($oldurl,$newurl,$rr['xchan_photo_l'])),
+ dbesc(str_replace($oldurl,$newurl,$rr['xchan_photo_m'])),
+ dbesc(str_replace($oldurl,$newurl,$rr['xchan_photo_s'])),
+ dbesc(datetime_convert()),
+ dbesc($rr['xchan_hash'])
+ );
-// contents of $s are displayed prominently on the page the next time
-// a page is loaded. Usually used for errors or alerts.
-if(! function_exists('notice')) {
- function notice($s) {
- $a = get_app();
- if(! x($_SESSION,'sysmsg')) $_SESSION['sysmsg'] = array();
- if($a->interactive)
- $_SESSION['sysmsg'][] = $s;
- }
-}
-if(! function_exists('info')) {
- function info($s) {
- $a = get_app();
- if(! x($_SESSION,'sysmsg_info')) $_SESSION['sysmsg_info'] = array();
- if($a->interactive)
- $_SESSION['sysmsg_info'][] = $s;
- }
-}
+ $y = q("update hubloc set hubloc_addr = '%s', hubloc_url = '%s', hubloc_url_sig = '%s', hubloc_host = '%s', hubloc_callback = '%s' where hubloc_hash = '%s' and hubloc_url = '%s' limit 1",
+ dbesc($channel . '@' . $rhs),
+ dbesc($newurl),
+ dbesc(base64url_encode(rsa_sign($newurl,$rr['channel_prvkey']))),
+ dbesc($newhost),
+ dbesc($newurl . '/post'),
+ dbesc($rr['xchan_hash']),
+ dbesc($oldurl)
+ );
-// wrapper around config to limit the text length of an incoming message
+ $z = q("update profile set photo = '%s', thumb = '%s' where uid = %d",
+ dbesc(str_replace($oldurl,$newurl,$rr['xchan_photo_l'])),
+ dbesc(str_replace($oldurl,$newurl,$rr['xchan_photo_m'])),
+ intval($rr['channel_id'])
+ );
+
+ proc_run('php', 'include/notifier.php', 'refresh_all', $rr['channel_id']);
-if(! function_exists('get_max_import_size')) {
- function get_max_import_size() {
- global $a;
- return ((x($a->config,'max_import_size')) ? $a->config['max_import_size'] : 0 );
+ }
}
}
-/**
- *
- * Function : profile_load
- * @parameter App $a
- * @parameter string $nickname
- * @parameter int $profile
- *
- * Summary: Loads a profile into the page sidebar.
- * The function requires a writeable copy of the main App structure, and the nickname
- * of a registered local account.
- *
- * If the viewer is an authenticated remote viewer, the profile displayed is the
- * one that has been configured for his/her viewing in the Contact manager.
- * Passing a non-zero profile ID can also allow a preview of a selected profile
- * by the owner.
- *
- * Profile information is placed in the App structure for later retrieval.
- * Honours the owner's chosen theme for display.
- *
- */
-if(! function_exists('profile_load')) {
-function profile_load(&$a, $nickname, $profile = 0) {
-
- $user = q("select channel_id from channel where channel_address = '%s' limit 1",
- dbesc($nickname)
- );
-
- if(! $user) {
- logger('profile error: ' . $a->query_string, LOGGER_DEBUG);
- notice( t('Requested channel is not available.') . EOL );
- $a->error = 404;
- return;
- }
-
- // get the current observer
- $observer = $a->get_observer();
+// wrapper for adding a login box. If $register == true provide a registration
+// link. This will most always depend on the value of $a->config['system']['register_policy'].
+// returns the complete html for inserting into the page
- // Can the observer see our profile?
- require_once('include/permissions.php');
- if(! perm_is_allowed($user[0]['channel_id'],$observer['xchan_hash'],'view_profile')) {
- // permission denied
- notice( t(' Sorry, you don\'t have the permission to view this profile. ') . EOL);
- return;
- }
- $r = q("SELECT abook_profile FROM abook WHERE abook_xchan = '%s' limit 1",
- dbesc($observer['xchan_hash'])
+function login($register = false, $form_id = 'main-login', $hiddens=false) {
+ $a = get_app();
+ $o = "";
+ $reg = false;
+ $reglink = get_config('system','register_link');
+ if(! strlen($reglink))
+ $reglink = 'register';
+
+ $reg = array(
+ 'title' => t('Create an account to access services and applications within the Red Matrix'),
+ 'desc' => t('Register'),
+ 'link' => (($register) ? $reglink : 'pubsites')
);
- if($r)
- $profile = $r[0]['abook_profile'];
-
- $r = null;
-
-
- if($profile) {
- $profile_int = intval($profile);
- $r = q("SELECT `profile`.`uid` AS `profile_uid`, `profile`.* , channel.* FROM `profile`
- LEFT JOIN channel ON `profile`.`uid` = channel.channel_id
- WHERE channel.channel_address = '%s' AND `profile`.`id` = %d LIMIT 1",
- dbesc($nickname),
- intval($profile_int)
- );
- }
+ $dest_url = $a->get_baseurl(true) . '/' . $a->query_string;
- if(! ($r && count($r))) {
- $r = q("SELECT `profile`.`uid` AS `profile_uid`, `profile`.* , `channel`.* FROM `profile`
- LEFT JOIN `channel` ON `profile`.`uid` = channel.channel_id
- WHERE channel.channel_address = '%s' AND `profile`.`is_default` = 1 LIMIT 1",
- dbesc($nickname)
- );
+ if(local_user()) {
+ $tpl = get_markup_template("logout.tpl");
}
+ else {
+ $a->page['htmlhead'] .= replace_macros(get_markup_template("login_head.tpl"),array(
+ '$baseurl' => $a->get_baseurl(true)
+ ));
- if(! $r) {
- logger('profile error: ' . $a->query_string, LOGGER_DEBUG);
- notice( t('Requested profile is not available.') . EOL );
- $a->error = 404;
- return;
- }
-
- // fetch user tags if this isn't the default profile
-
- if(! $r[0]['is_default']) {
- $x = q("select `keywords` from `profile` where uid = %d and `is_default` = 1 limit 1",
- intval($profile_uid)
- );
- if($x)
- $r[0]['keywords'] = $x[0]['keywords'];
+ $tpl = get_markup_template("login.tpl");
+ if(strlen($a->query_string))
+ $_SESSION['login_return_url'] = $a->query_string;
}
- $a->profile = $r[0];
+ $o .= replace_macros($tpl,array(
- $a->page['title'] = $a->profile['channel_name'] . " @ " . $a->config['sitename'];
+ '$dest_url' => $dest_url,
+ '$logout' => t('Logout'),
+ '$login' => t('Login'),
+ '$form_id' => $form_id,
+ '$lname' => array('username', t('Email') , '', ''),
+ '$lpassword' => array('password', t('Password'), '', ''),
+ '$remember' => array('remember', t('Remember me'), '', ''),
+ '$hiddens' => $hiddens,
+ '$register' => $reg,
+
+ '$lostpass' => t('Forgot your password?'),
+ '$lostlink' => t('Password Reset'),
+ ));
- $_SESSION['theme'] = $a->profile['channel_theme'];
-
- /**
- * load/reload current theme info
- */
-
- $a->set_template_engine(); // reset the template engine to the default in case the user's theme doesn't specify one
-
- $theme_info_file = "view/theme/".current_theme()."/php/theme.php";
- if (file_exists($theme_info_file)){
- require_once($theme_info_file);
- }
-
- return;
-}}
-
-function profile_create_sidebar(&$a) {
-
- $block = (((get_config('system','block_public')) && (! local_user()) && (! remote_user())) ? true : false);
+ call_hooks('login_hook',$o);
- $a->set_widget('profile',profile_sidebar($a->profile, $block));
- return;
+ return $o;
}
-/**
- *
- * Function: profile_sidebar
- *
- * Formats a profile for display in the sidebar.
- * It is very difficult to templatise the HTML completely
- * because of all the conditional logic.
- *
- * @parameter: array $profile
- *
- * Returns HTML string stuitable for sidebar inclusion
- * Exceptions: Returns empty string if passed $profile is wrong type or not populated
- *
- */
-
-
-if(! function_exists('profile_sidebar')) {
- function profile_sidebar($profile, $block = 0) {
-
- $a = get_app();
-
- $observer = $a->get_observer();
-
- $o = '';
- $location = false;
- $address = false;
- $pdesc = true;
-
- if((! is_array($profile)) && (! count($profile)))
- return $o;
-
-
- $is_owner = (($profile['uid'] == local_user()) ? true : false);
-
- $profile['picdate'] = urlencode($profile['picdate']);
-
- call_hooks('profile_sidebar_enter', $profile);
-
- // don't show connect link to yourself
- $connect = (($profile['uid'] != local_user()) ? t('Connect') : False);
-
- // don't show connect link to authenticated visitors either
+// Used to end the current process, after saving session state.
- if(remote_user() && count($_SESSION['remote'])) {
- foreach($_SESSION['remote'] as $visitor) {
- if($visitor['uid'] == $profile['uid']) {
- $connect = false;
- break;
- }
- }
- }
+function killme() {
+ session_write_close();
+ exit;
+}
- // show edit profile to yourself
- if($is_owner) {
- $profile['menu'] = array(
- 'chg_photo' => t('Change profile photo'),
- 'entries' => array(),
- );
+// redirect to another URL and terminate this process.
- if(feature_enabled(local_user(),'multi_profiles')) {
- $profile['edit'] = array($a->get_baseurl(). '/profiles', t('Profiles'),"", t('Manage/edit profiles'));
- $profile['menu']['cr_new'] = t('Create New Profile');
- }
- else
- $profile['edit'] = array($a->get_baseurl() . '/profiles/' . $profile['id'], t('Edit Profile'),'',t('Edit Profile'));
-
- $r = q("SELECT * FROM `profile` WHERE `uid` = %d",
- local_user());
-
+function goaway($s) {
+ header("Location: $s");
+ killme();
+}
- if($r) {
- foreach($r as $rr) {
- $profile['menu']['entries'][] = array(
- 'photo' => $rr['thumb'],
- 'id' => $rr['id'],
- 'alt' => t('Profile Image'),
- 'profile_name' => $rr['profile_name'],
- 'isdefault' => $rr['is_default'],
- 'visible_to_everybody' => t('visible to everybody'),
- 'edit_visibility' => t('Edit visibility'),
- );
- }
- }
- }
- 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:');
+function get_account_id() {
+ if(get_app()->account)
+ return intval(get_app()->account['account_id']);
+ return false;
+}
- $gender = ((x($profile,'gender') == 1) ? t('Gender:') : False);
- $marital = ((x($profile,'marital') == 1) ? t('Status:') : False);
- $homepage = ((x($profile,'homepage') == 1) ? t('Homepage:') : False);
- if(($profile['hidewall'] || $block) && (! local_user()) && (! remote_user())) {
- $location = $pdesc = $gender = $marital = $homepage = False;
- }
+// Returns the entity id of locally logged in user or false.
- $firstname = ((strpos($profile['name'],' '))
- ? trim(substr($profile['name'],0,strpos($profile['name'],' '))) : $profile['name']);
- $lastname = (($firstname === $profile['name']) ? '' : trim(substr($profile['name'],strlen($firstname))));
- if(is_array($observer)
- && perm_is_allowed($profile['uid'],$observer['xchan_hash'],'view_contacts')) {
- $contact_block = contact_block();
- }
+function local_user() {
+ if((x($_SESSION,'authenticated')) && (x($_SESSION,'uid')))
+ return intval($_SESSION['uid']);
+ return false;
+}
- $tpl = get_markup_template('profile_vcard.tpl');
-
- $o .= replace_macros($tpl, array(
- '$profile' => $profile,
- '$connect' => $connect,
- '$location' => $location,
- '$gender' => $gender,
- '$pdesc' => $pdesc,
- '$marital' => $marital,
- '$homepage' => $homepage,
- '$contact_block' => $contact_block,
- ));
- $arr = array('profile' => &$profile, 'entry' => &$o);
+// Returns contact id of authenticated site visitor or false
- call_hooks('profile_sidebar', $arr);
- return $o;
- }
+function remote_user() {
+ if((x($_SESSION,'authenticated')) && (x($_SESSION,'visitor_id')))
+ return $_SESSION['visitor_id'];
+ return false;
}
-// FIXME
-
-if(! function_exists('get_birthdays')) {
- function get_birthdays() {
-
- $a = get_app();
- $o = '';
- if(! local_user())
- return $o;
-
- $bd_format = t('g A l F d') ; // 8 AM Friday January 18
- $bd_short = t('F d');
+// contents of $s are displayed prominently on the page the next time
+// a page is loaded. Usually used for errors or alerts.
- $r = q("SELECT `event`.*, `event`.`id` AS `eid`, `contact`.* FROM `event`
- LEFT JOIN `contact` ON `contact`.`id` = `event`.`cid`
- WHERE `event`.`uid` = %d AND `type` = 'birthday' AND `start` < '%s' AND `finish` > '%s'
- ORDER BY `start` ASC ",
- intval(local_user()),
- dbesc(datetime_convert('UTC','UTC','now + 6 days')),
- dbesc(datetime_convert('UTC','UTC','now'))
- );
- if($r && count($r)) {
- $total = 0;
- $now = strtotime('now');
- $cids = array();
-
- $istoday = false;
- foreach($r as $rr) {
- if(strlen($rr['name']))
- $total ++;
- if((strtotime($rr['start'] . ' +00:00') < $now) && (strtotime($rr['finish'] . ' +00:00') > $now))
- $istoday = true;
- }
- $classtoday = $istoday ? ' birthday-today ' : '';
- if($total) {
- foreach($r as &$rr) {
- if(! strlen($rr['name']))
- continue;
-
- // avoid duplicates
-
- if(in_array($rr['cid'],$cids))
- continue;
- $cids[] = $rr['cid'];
-
- $today = (((strtotime($rr['start'] . ' +00:00') < $now) && (strtotime($rr['finish'] . ' +00:00') > $now)) ? true : false);
- $sparkle = '';
- $url = $rr['url'];
- if($rr['network'] === NETWORK_DFRN) {
- $sparkle = " sparkle";
- $url = $a->get_baseurl() . '/redir/' . $rr['cid'];
- }
-
- $rr['link'] = $url;
- $rr['title'] = $rr['name'];
- $rr['date'] = day_translate(datetime_convert('UTC', $a->timezone, $rr['start'], $rr['adjust'] ? $bd_format : $bd_short)) . (($today) ? ' ' . t('[today]') : '');
- $rr['startime'] = Null;
- $rr['today'] = $today;
-
- }
- }
+function notice($s) {
+ $a = get_app();
+ if(! x($_SESSION,'sysmsg')) $_SESSION['sysmsg'] = array();
+ if($a->interactive) {
+ // shameless plug, permission is denied and they have no identity.
+ // There's a fairly good chance that they've not got zot.
+ if((stristr($s,t('permission denied'))) && (! get_observer_hash())) {
+ $s .= '<br /><a href="http://getzot.com">' . t('Got Zot?') . '</a>';
}
- $tpl = get_markup_template("birthdays_reminder.tpl");
- return replace_macros($tpl, array(
- '$baseurl' => $a->get_baseurl(),
- '$classtoday' => $classtoday,
- '$count' => $total,
- '$event_reminders' => t('Birthday Reminders'),
- '$event_title' => t('Birthdays this week:'),
- '$events' => $r,
- '$lbr' => '{', // raw brackets mess up if/endif macro processing
- '$rbr' => '}'
-
- ));
- }
+ $_SESSION['sysmsg'][] = $s;
+ }
}
-// FIXME
-if(! function_exists('get_events')) {
- function get_events() {
+function info($s) {
+ $a = get_app();
+ if(! x($_SESSION,'sysmsg_info')) $_SESSION['sysmsg_info'] = array();
+ if($a->interactive)
+ $_SESSION['sysmsg_info'][] = $s;
+}
- require_once('include/bbcode.php');
- $a = get_app();
- if(! local_user())
- return $o;
+// wrapper around config to limit the text length of an incoming message
- $bd_format = t('g A l F d') ; // 8 AM Friday January 18
- $bd_short = t('F d');
- $r = q("SELECT `event`.* FROM `event`
- WHERE `event`.`uid` = %d AND `type` != 'birthday' AND `start` < '%s' AND `start` > '%s'
- ORDER BY `start` ASC ",
- intval(local_user()),
- dbesc(datetime_convert('UTC','UTC','now + 6 days')),
- dbesc(datetime_convert('UTC','UTC','now - 1 days'))
- );
+function get_max_import_size() {
+ return(intval(get_config('system','max_import_size')));
+}
- if($r && count($r)) {
- $now = strtotime('now');
- $istoday = false;
- foreach($r as $rr) {
- if(strlen($rr['name']))
- $total ++;
- $strt = datetime_convert('UTC',$rr['convert'] ? $a->timezone : 'UTC',$rr['start'],'Y-m-d');
- if($strt === datetime_convert('UTC',$a->timezone,'now','Y-m-d'))
- $istoday = true;
- }
- $classtoday = (($istoday) ? 'event-today' : '');
-
-
- foreach($r as &$rr) {
- if($rr['adjust'])
- $md = datetime_convert('UTC',$a->timezone,$rr['start'],'Y/m');
- else
- $md = datetime_convert('UTC','UTC',$rr['start'],'Y/m');
- $md .= "/#link-".$rr['id'];
-
- $title = substr(strip_tags(bbcode($rr['desc'])),0,32) . '... ';
- if(! $title)
- $title = t('[No description]');
-
- $strt = datetime_convert('UTC',$rr['convert'] ? $a->timezone : 'UTC',$rr['start']);
- $today = ((substr($strt,0,10) === datetime_convert('UTC',$a->timezone,'now','Y-m-d')) ? true : false);
-
- $rr['link'] = $md;
- $rr['title'] = $title;
- $rr['date'] = day_translate(datetime_convert('UTC', $rr['adjust'] ? $a->timezone : 'UTC', $rr['start'], $bd_format)) . (($today) ? ' ' . t('[today]') : '');
- $rr['startime'] = $strt;
- $rr['today'] = $today;
- }
- }
- $tpl = get_markup_template("events_reminder.tpl");
- return replace_macros($tpl, array(
- '$baseurl' => $a->get_baseurl(),
- '$classtoday' => $classtoday,
- '$count' => count($r),
- '$event_reminders' => t('Event Reminders'),
- '$event_title' => t('Events this week:'),
- '$events' => $r,
- ));
- }
-}
/**
@@ -1694,178 +1534,143 @@ if(! function_exists('get_events')) {
* $cmd and string args are surrounded with ""
*/
-if(! function_exists('proc_run')) {
- function proc_run($cmd){
- $a = get_app();
+function proc_run($cmd){
- $args = func_get_args();
+ $a = get_app();
- $newargs = array();
- if(! count($args))
- return;
+ $args = func_get_args();
- // expand any arrays
+ $newargs = array();
+ if(! count($args))
+ return;
- foreach($args as $arg) {
- if(is_array($arg)) {
- foreach($arg as $n) {
- $newargs[] = $n;
- }
+ // expand any arrays
+
+ foreach($args as $arg) {
+ if(is_array($arg)) {
+ foreach($arg as $n) {
+ $newargs[] = $n;
}
- else
- $newargs[] = $arg;
}
+ else
+ $newargs[] = $arg;
+ }
- $args = $newargs;
+ $args = $newargs;
- $arr = array('args' => $args, 'run_cmd' => true);
+ $arr = array('args' => $args, 'run_cmd' => true);
- call_hooks("proc_run", $arr);
- if(! $arr['run_cmd'])
- return;
+ call_hooks("proc_run", $arr);
+ if(! $arr['run_cmd'])
+ return;
- if(count($args) && $args[0] === 'php')
- $args[0] = ((x($a->config,'system')) && (x($a->config['system'],'php_path')) && (strlen($a->config['system']['php_path'])) ? $a->config['system']['php_path'] : 'php');
- for($x = 0; $x < count($args); $x ++)
- $args[$x] = escapeshellarg($args[$x]);
+ if(count($args) && $args[0] === 'php')
+ $args[0] = ((x($a->config,'system')) && (x($a->config['system'],'php_path')) && (strlen($a->config['system']['php_path'])) ? $a->config['system']['php_path'] : 'php');
+ for($x = 0; $x < count($args); $x ++)
+ $args[$x] = escapeshellarg($args[$x]);
- $cmdline = implode($args," ");
- if(get_config('system','proc_windows'))
- proc_close(proc_open('cmd /c start /b ' . $cmdline,array(),$foo));
- else
- proc_close(proc_open($cmdline." &",array(),$foo));
- }
+ $cmdline = implode($args," ");
+ if(get_config('system','proc_windows'))
+ proc_close(proc_open('cmd /c start /b ' . $cmdline,array(),$foo));
+ else
+ proc_close(proc_open($cmdline." &",array(),$foo));
}
-if(! function_exists('current_theme')) {
- function current_theme(){
- $app_base_themes = array('redbasic');
-
- $a = get_app();
-
-// $mobile_detect = new Mobile_Detect();
-// $is_mobile = $mobile_detect->isMobile() || $mobile_detect->isTablet();
- $is_mobile = $a->is_mobile || $a->is_tablet;
-
- if($is_mobile) {
- $system_theme = ((isset($a->config['system']['mobile-theme'])) ? $a->config['system']['mobile-theme'] : '');
- $theme_name = ((isset($_SESSION) && x($_SESSION,'mobile-theme')) ? $_SESSION['mobile-theme'] : $system_theme);
- if($theme_name === '---') {
- // user has selected to have the mobile theme be the same as the normal one
- $system_theme = '';
- $theme_name = '';
- }
- }
- else {
- $system_theme = ((isset($a->config['system']['theme'])) ? $a->config['system']['theme'] : '');
- $theme_name = ((isset($_SESSION) && x($_SESSION,'theme')) ? $_SESSION['theme'] : $system_theme);
- }
-
- if($theme_name &&
- (file_exists('view/theme/' . $theme_name . '/css/style.css') ||
- file_exists('view/theme/' . $theme_name . '/php/style.php')))
- return($theme_name);
-
- foreach($app_base_themes as $t) {
- if(file_exists('view/theme/' . $t . '/css/style.css')||
- file_exists('view/theme/' . $t . '/php/style.php'))
- return($t);
- }
-
- $fallback = array_merge(glob('view/theme/*/css/style.css'),glob('view/theme/*/php/style.php'));
- if(count($fallback))
- return (str_replace('view/theme/','', substr($fallback[0],0,-10)));
+
+function current_theme(){
+ $app_base_themes = array('redbasic');
- }
-}
+ $a = get_app();
+ $page_theme = null;
-/*
- * Return full URL to theme which is currently in effect.
-* Provide a sane default if nothing is chosen or the specified theme does not exist.
-*/
-if(! function_exists('current_theme_url')) {
- function current_theme_url() {
- global $a;
- $t = current_theme();
- if (file_exists('view/theme/' . $t . '/php/style.php'))
- return('view/theme/' . $t . '/php/style.pcss');
- return('view/theme/' . $t . '/css/style.css');
+ // Find the theme that belongs to the channel whose stuff we are looking at
+
+ if($a->profile_uid && $a->profile_uid != local_user()) {
+ $r = q("select channel_theme from channel where channel_id = %d limit 1",
+ intval($a->profile_uid)
+ );
+ if($r)
+ $page_theme = $r[0]['channel_theme'];
}
-}
-function z_birthday($dob,$tz,$format="Y-m-d H:i:s") {
+ if(array_key_exists('theme', $a->layout) && $a->layout['theme'])
+ $page_theme = $a->layout['theme'];
- if(! strlen($tz))
- $tz = 'UTC';
+ // Allow folks to over-rule channel themes and always use their own on their own site.
+ // The default is for channel themes to take precedence over your own on pages belonging
+ // to that channel.
- $tmp_dob = substr($dob,5);
- if(intval($tmp_dob)) {
- $y = datetime_convert($tz,$tz,'now','Y');
- $bd = $y . '-' . $tmp_dob . ' 00:00';
- $t_dob = strtotime($bd);
- $now = strtotime(datetime_convert($tz,$tz,'now'));
- if($t_dob < $now)
- $bd = $y + 1 . '-' . $tmp_dob . ' 00:00';
- $birthday = datetime_convert($tz,'UTC',$bd,$format);
+ if($page_theme && local_user() && local_user() != $a->profile_url) {
+ if(get_pconfig(local_user(),'system','always_my_theme'))
+ $page_theme = null;
}
- return $birthday;
-
-}
-
+
+ $is_mobile = $a->is_mobile || $a->is_tablet;
+
+ $standard_system_theme = ((isset($a->config['system']['theme'])) ? $a->config['system']['theme'] : '');
+ $standard_theme_name = ((isset($_SESSION) && x($_SESSION,'theme')) ? $_SESSION['theme'] : $standard_system_theme);
+
+ if($is_mobile) {
+ if(isset($_SESSION['show_mobile']) && !$_SESSION['show_mobile']) {
+ $system_theme = $standard_system_theme;
+ $theme_name = $standard_theme_name;
+ }
+ else {
+ $system_theme = ((isset($a->config['system']['mobile_theme'])) ? $a->config['system']['mobile_theme'] : '');
+ $theme_name = ((isset($_SESSION) && x($_SESSION,'mobile_theme')) ? $_SESSION['mobile_theme'] : $system_theme);
-if(! function_exists('feed_birthday')) {
- function feed_birthday($uid,$tz) {
+ if($theme_name === '' || $theme_name === '---' ) {
+ // user has selected to have the mobile theme be the same as the normal one
+ $system_theme = $standard_system_theme;
+ $theme_name = $standard_theme_name;
+ }
+ }
+ }
+ else {
+ $system_theme = $standard_system_theme;
+ $theme_name = $standard_theme_name;
- /**
- *
- * Determine the next birthday, but only if the birthday is published
- * in the default profile. We _could_ also look for a private profile that the
- * recipient can see, but somebody could get mad at us if they start getting
- * public birthday greetings when they haven't made this info public.
- *
- * Assuming we are able to publish this info, we are then going to convert
- * the start time from the owner's timezone to UTC.
- *
- * This will potentially solve the problem found with some social networks
- * where birthdays are converted to the viewer's timezone and salutations from
- * elsewhere in the world show up on the wrong day. We will convert it to the
- * viewer's timezone also, but first we are going to convert it from the birthday
- * person's timezone to GMT - so the viewer may find the birthday starting at
- * 6:00PM the day before, but that will correspond to midnight to the birthday person.
- *
- */
+ if($page_theme)
+ $theme_name = $page_theme;
+ }
- $birthday = '';
-
- if(! strlen($tz))
- $tz = 'UTC';
+ if($theme_name &&
+ (file_exists('view/theme/' . $theme_name . '/css/style.css') ||
+ file_exists('view/theme/' . $theme_name . '/php/style.php')))
+ return($theme_name);
+
+ foreach($app_base_themes as $t) {
+ if(file_exists('view/theme/' . $t . '/css/style.css')||
+ file_exists('view/theme/' . $t . '/php/style.php'))
+ return($t);
+ }
+
+ $fallback = array_merge(glob('view/theme/*/css/style.css'),glob('view/theme/*/php/style.php'));
+ if(count($fallback))
+ return (str_replace('view/theme/','', substr($fallback[0],0,-10)));
+
+}
- $p = q("SELECT `dob` FROM `profile` WHERE `is_default` = 1 AND `uid` = %d LIMIT 1",
- intval($uid)
- );
- if($p && count($p)) {
- $tmp_dob = substr($p[0]['dob'],5);
- if(intval($tmp_dob)) {
- $y = datetime_convert($tz,$tz,'now','Y');
- $bd = $y . '-' . $tmp_dob . ' 00:00';
- $t_dob = strtotime($bd);
- $now = strtotime(datetime_convert($tz,$tz,'now'));
- if($t_dob < $now)
- $bd = $y + 1 . '-' . $tmp_dob . ' 00:00';
- $birthday = datetime_convert($tz,'UTC',$bd,$format);
- }
- }
+/**
+ * Return full URL to theme which is currently in effect.
+ * Provide a sane default if nothing is chosen or the specified theme does not exist.
+ */
- return $birthday;
- }
+function current_theme_url($installing = false) {
+ global $a;
+ $t = current_theme();
+ $uid = '';
+ $uid = (($a->profile_uid) ? '?f=&puid=' . $a->profile_uid : '');
+ if(file_exists('view/theme/' . $t . '/php/style.php'))
+ return('view/theme/' . $t . '/php/style.pcss' . $uid);
+ return('view/theme/' . $t . '/css/style.css');
}
-if(! function_exists('is_site_admin')) {
function is_site_admin() {
$a = get_app();
if((intval($_SESSION['authenticated']))
@@ -1873,149 +1678,44 @@ function is_site_admin() {
&& ($a->account['account_roles'] & ACCOUNT_ROLE_ADMIN))
return true;
return false;
-}}
-
-
-if(! function_exists('load_contact_links')) {
- function load_contact_links($uid) {
-
- $a = get_app();
-
- $ret = array();
-
- if(! $uid || x($a->contacts,'empty'))
- return;
-
- logger('load_contact_links');
-
- $r = q("SELECT abook_id, abook_flags, abook_my_perms, abook_their_perms, xchan_hash, xchan_photo_m, xchan_name, xchan_url from abook left join xchan on abook_xchan = xchan_hash where abook_channel = %d and not (abook_flags & %d) ",
- intval($uid),
- intval(ABOOK_FLAG_SELF)
- );
- if($r) {
- foreach($r as $rr){
- $ret[$rr['xchan_hash']] = $rr;
- }
- }
- else
- $ret['empty'] = true;
- $a->contacts = $ret;
- return;
- }
}
-if(! function_exists('profile_tabs')){
- function profile_tabs($a, $is_owner=False, $nickname=Null){
- //echo "<pre>"; var_dump($a->user); killme();
-
- $channel = $a->get_channel();
- if (is_null($nickname))
- $nickname = $channel['channel_address'];
-
- if(x($_GET,'tab'))
- $tab = notags(trim($_GET['tab']));
-
- $url = $a->get_baseurl() . '/channel/' . $nickname;
- $pr = $a->get_baseurl() . '/profile/' . $nickname;
-
- $tabs = array(
- array(
- 'label'=>t('Status'),
- 'url' => $url,
- 'sel' => ((argv(0)=='channel')?'active':''),
- 'title' => t('Status Messages and Posts'),
- 'id' => 'status-tab',
- ),
- array(
- 'label' => t('Profile'),
- 'url' => $pr,
- 'sel' => ((argv(0)=='profile')?'active':''),
- 'title' => t('Profile Details'),
- 'id' => 'profile-tab',
- ),
- array(
- 'label' => t('Photos'),
- 'url' => $a->get_baseurl() . '/photos/' . $nickname,
- 'sel' => ((argv(0)=='photos')?'active':''),
- 'title' => t('Photo Albums'),
- 'id' => 'photo-tab',
- ),
- );
-
- if ($is_owner){
- $tabs[] = array(
- 'label' => t('Events'),
- 'url' => $a->get_baseurl() . '/events',
- 'sel' =>((argv(0)=='events')?'active':''),
- 'title' => t('Events and Calendar'),
- 'id' => 'events-tab',
- );
- }
+function load_contact_links($uid) {
- $arr = array('is_owner' => $is_owner, 'nickname' => $nickname, 'tab' => (($tab) ? $tab : false), 'tabs' => $tabs);
- call_hooks('profile_tabs', $arr);
-
- $tpl = get_markup_template('common_tabs.tpl');
+ $a = get_app();
- return replace_macros($tpl,array('$tabs' => $arr['tabs']));
- }
-}
+ $ret = array();
-function get_my_url() {
- if(x($_SESSION,'my_url'))
- return $_SESSION['my_url'];
- return false;
-}
+ if(! $uid || x($a->contacts,'empty'))
+ return;
-function get_my_address() {
- if(x($_SESSION,'my_address'))
- return $_SESSION['my_address'];
- return false;
-}
+// logger('load_contact_links');
-function zid_init(&$a) {
- $tmp_str = get_my_address();
- if(validate_email($tmp_str)) {
- proc_run('php','include/gprobe.php',$tmp_str);
- $arr = array('zid' => $tmp_str, 'url' => $a->cmd);
- call_hooks('zid_init',$arr);
- if((! local_user()) && (! remote_user())) {
- $r = q("select * from hubloc where hubloc_addr = '%s' limit 1",
- dbesc($tmp_str)
- );
- // try to avoid recursion - but send them home to do a proper magic auth
- $dest = '/' . $a->query_string;
- $dest = str_replace(array('?zid=','&zid='),array('?rzid=','&rzid='),$dest);
- if($r && ($r[0]['hubloc_url'] != z_root()) && (! strstr($dest,'/magic')) && (! strstr($dest,'/rmagic'))) {
- goaway($r[0]['hubloc_url'] . '/magic' . '?f=&dest=' . z_root() . $dest);
- }
+ $r = q("SELECT abook_id, abook_flags, abook_my_perms, abook_their_perms, xchan_hash, xchan_photo_m, xchan_name, xchan_url from abook left join xchan on abook_xchan = xchan_hash where abook_channel = %d and not (abook_flags & %d) ",
+ intval($uid),
+ intval(ABOOK_FLAG_SELF)
+ );
+ if($r) {
+ foreach($r as $rr){
+ $ret[$rr['xchan_hash']] = $rr;
}
}
+ else
+ $ret['empty'] = true;
+ $a->contacts = $ret;
+ return;
}
-function zid($s,$force = false) {
- if(! strlen($s))
- return $s;
- $has_params = ((strpos($s,'?')) ? true : false);
- if(! $has_params)
- $has_params = ((strpos($s,'&')) ? true : false);
- $achar = strpos($s,'?') ? '&' : '?';
-
- $mine = get_my_url();
- $myaddr = get_my_address();
- if($mine and ! link_compare($mine,$s))
- return $s . (($has_params) ? '' : '/') . $achar . 'zid=' . urlencode($myaddr);
- return $s;
-}
/**
-* returns querystring as string from a mapped array
-*
-* @param params Array
-* @return string
-*/
+ * returns querystring as string from a mapped array
+ *
+ * @param params Array
+ * @return string
+ */
+
function build_querystring($params, $name=null) {
$ret = "";
foreach($params as $key=>$val) {
@@ -2045,7 +1745,9 @@ function argc() {
}
function argv($x) {
- return get_app()->argv[$x];
+ if(array_key_exists($x,get_app()->argv))
+ return get_app()->argv[$x];
+ return '';
}
function dba_timer() {
@@ -2077,19 +1779,42 @@ function curPageURL() {
return $pageURL;
}
+function get_custom_nav(&$a,$navname) {
+ if(! $navname)
+ return $a->page['nav'];
+ // load custom nav menu by name here
+
+}
+
function construct_page(&$a) {
+ require_once('include/comanche.php');
+
+ if(($p = theme_include('mod_' . $a->module . '.pdl')) != '')
+ comanche_parser($a,@file_get_contents($p));
+ $comanche = ((count($a->layout)) ? true : false);
+
/**
* Build the page - now that we have all the components
*/
+ require_once(theme_include('theme_init.php'));
+
+ $installing = false;
- if($a->module != 'install') {
+ if($a->module == 'setup')
+ $installing = true;
+ else {
nav($a);
+ }
+
+ if($comanche) {
+ if($a->layout['nav']) {
+ $a->page['nav'] = get_custom_nav($a->layout['nav']);
+ }
}
- require_once(theme_include('theme_init.php'));
if(($p = theme_include(current_theme() . '.js')) != '')
head_add_js($p);
@@ -2101,7 +1826,7 @@ function construct_page(&$a) {
head_add_css(((x($a->page,'template')) ? $a->page['template'] : 'default' ) . '.css');
head_add_css('mod_' . $a->module . '.css');
- head_add_css(current_theme_url());
+ head_add_css(current_theme_url($installing));
head_add_js('mod_' . $a->module . '.js');
@@ -2117,17 +1842,56 @@ function construct_page(&$a) {
}
}
+ // Let's say we have a comanche declaration '[region=nav][/region][region=content]$nav $content[/region]'.
+ // The text 'region=' identifies a section of the layout by that name. So what we want to do here is leave
+ // $a->page['nav'] empty and put the default content from $a->page['nav'] and $a->page['section']
+ // into a new region called $a->data['content']. It is presumed that the chosen layout file for this comanche page
+ // has a '<content>' element instead of a '<section>'.
+
+ // This way the Comanche layout can include any existing content, alter the layout by adding stuff around it or changing the
+ // layout completely with a new layout definition, or replace/remove existing content.
+
+ if($comanche) {
+ $arr = array('module' => $a->module, 'layout' => $a->layout);
+ call_hooks('construct_page',$arr);
+ $a->layout = $arr['layout'];
+
+ foreach($a->layout as $k => $v) {
+ if((strpos($k,'region_') === 0) && strlen($v)) {
+ if(strpos($v,'$region_') !== false) {
+ $v = preg_replace_callback('/\$region_([a-zA-Z0-9]+)/ism','comanche_replace_region',$v);
+ }
+
+ // And a couple of convenience macros
+
+ if(strpos($v,'$nav') !== false) {
+ $v = str_replace('$nav',$a->page['nav'],$v);
+ }
+ if(strpos($v,'$content') !== false) {
+
+ $v = str_replace('$content',$a->page['content'],$v);
+ }
+
+ $a->page[substr($k,7)] = $v;
+
+ }
+ }
+ }
+
if($a->is_mobile || $a->is_tablet) {
- if(isset($_SESSION['show-mobile']) && !$_SESSION['show-mobile']) {
+ if(isset($_SESSION['show_mobile']) && !$_SESSION['show_mobile']) {
$link = $a->get_baseurl() . '/toggle_mobile?f=&address=' . curPageURL();
}
else {
$link = $a->get_baseurl() . '/toggle_mobile?f=&off=1&address=' . curPageURL();
}
- $a->page['footer'] .= replace_macros(get_markup_template("toggle_mobile_footer.tpl"), array(
- '$toggle_link' => $link,
- '$toggle_text' => t('toggle mobile')
- ));
+ if ((isset($_SESSION) && $_SESSION['mobile_theme'] !='' && $_SESSION['mobile_theme'] !='---' ) ||
+ (isset($a->config['system']['mobile_theme']) && !isset($_SESSION['mobile_theme']))) {
+ $a->page['footer'] .= replace_macros(get_markup_template("toggle_mobile_footer.tpl"), array(
+ '$toggle_link' => $link,
+ '$toggle_text' => t('toggle mobile')
+ ));
+ }
}
$page = $a->page;
@@ -2149,3 +1913,19 @@ function construct_page(&$a) {
function appdirpath() {
return dirname(__FILE__);
}
+
+
+function head_set_icon($icon) {
+ global $a;
+ $a->data['pageicon'] = $icon;
+ logger('head_set_icon: ' . $icon);
+}
+
+function head_get_icon() {
+ global $a;
+ $icon = $a->data['pageicon'];
+ if(! strpos($icon,'://'))
+ $icon = z_root() . $icon;
+ return $icon;
+}
+
diff --git a/doc/Account-Basics.md b/doc/Account-Basics.md
index 522b0db38..5d937cb1c 100644
--- a/doc/Account-Basics.md
+++ b/doc/Account-Basics.md
@@ -6,67 +6,36 @@ Account Basics
**Registration**
-Not all Friendica sites allow open registration. If registration is allowed, you will see a "Register" link immediately below the login prompts on the site home page. Following this link will take you to the site registration page. The strength of our network is that lots of different sites are all completely compatible with each other. If the site you're visting doesn't allow registration, or you think you might prefer another one, you can find a <a href="http://dir.friendica.com/siteinfo">list of public servers here</a>, and find one that meets your needs.
+Not all Red Matrix sites allow open registration. If registration is allowed, you will see a "Register" link immediately below the login prompts on the site home page. Following this link will take you to the site Registration page. On some sites it may redirect you to another site which allow registrations. As all Red Matrix sites are linked, it does not matter where your account resides.
-If you'd like to have your own server, you can do that too. Visit <a href="http://friendica.com/download">the Friendica website</a> to download the code with setup instructions. It's a very simple install process that anybody experienced in hosting websites, or with basic Linux experience can handle easily.
+*Your Email Address*
+Please provide a valid email address. Your email address is **never** published. This address will be used to (optionally) send email notifications for incoming messages or items, and used to recover lost passwords.
-*OpenID*
+*Password*
-The first field on the Registration page is for an OpenID address. If you do not have an OpenID address or do not wish to use OpenID, leave this field blank. If you have an OpenID account elsewhere and wish to use it, enter the address into this field and click 'Register'. Friendica will attempt to extract as much information as possible from your OpenID provider and return to this page with those items already filled in.
+Enter a password of your choice, and repeat it in the second box to ensure it was typed correctly. As the Red Matrix offers a decentralised identity, your account can log you in to many other websites.
+*Terms Of Service*
-*Your Full Name*
-
-Please provide your full name **as you would like it to be displayed on this system**. Most people use their real name for this, but you're under no obligation to do so yourself.
-
-
-*Email Address*
-
-Please provide a valid email address. Your email address is **never** published. We need this to send you account information and your login details. You may also occasionally receive notifications of incoming messages or items requiring your attention, but you have the ability to completely disable these from your Settings page once you have logged in. This doesn't have to be your primary email address, but it does need to be a real email address. You can't get your initial password, or reset a lost password later without it. This is the only bit of personal information that has to be accurate.
-
-
-*Nickname*
-
-A nickname is used to generate web addresses for many of your personal pages, and is also treated like an email address when establishing communications with others. Due to the way that the nickname is used, it has some limitations. It must contain only US-ASCII text characters and numbers, and must also start with a text character. It also must be unique on this system. This is used in many places to identify your account, and once set - cannot be changed.
-
-
-*Directory Publishing*
-
-The Registration form also allows you to choose whether or not to list your account in the online directory. This is like a "phone book" and you may choose to be unlisted. We recommend that you select 'Yes' so that other people (friends, family, etc.) will be able to find you. If you choose 'No', you will essentially be invisible and have few opportunities for interaction. Whichever you choose, this can be changed any time from your Settings page after you login.
-
+Click the link to read the site's terms of service. This will open in a new tab. Once you've read them, tick the box to confirm.
*Register*
-Once you have provided the necessary details, click the 'Register' button. An email will be sent to you providing your account login details. Please watch your email (including spam folders) for your registration details and initial password.
-
+Once you have provided the necessary details, click the 'Register' button. Some sites may require administrator approval before the registration is processed, and you will be alerted if this is the case. Please watch your email (including spam folders) for your registration approval.
-**Login Page**
+*Create a Channel*
-On the 'Login' page, please enter your login information that was provided during registration. You may use either your nickname or email address as a Login Name.
-
-If you use your account to manage multiple '[Pages](help/Pages)' and these all have the same email address, please enter the nickname for the account you wish to manage.
-
-*If* your account has been OpenID enabled, you may use your OpenID address as a login name and leave the password blank. You will be redirected to your OpenID provider to complete your authorisation.
-
-Otherwise, enter your password. This will have been initially provided in your registration email message. Your password is case-sensitive, so please check your 'Caps Lock' key if you are having difficulty logging in.
-
-
-**Changing Your Password**
-
-After your first login, please visit the 'Settings' page from the top menu bar and change your password to something that you will remember.
-
-
-**Retrieving Personal Data**
-
-You can export a copy of your personal data in XML format from the "Export personal data" link at the top of your settings page.
+Next, you will be presented with the "Add a channel" screen. Normally, your first channel will be one that represents you - so using your own name (or psuedonym) as the channel name is a good idea. The channel name should be thought of as a title, or brief description of your channel. The "choose a short nickname" box is similar to a "username" field. We will use whatever you enter here to create a channel address, which other people will use to connect to you, and you will use to log in to other sites. This looks like an email address, and takes the form nickname@siteyouregisteredat.xyz
+When your channel is created you will be taken straight to your settings page where you can define permissions, enable features, etc. All these things are covered in the appropriate section of the helpfiles.
**See Also**
-* [Profiles](help/Profiles)
+* [Permissions](help/Permissions)
-* [Groups and Privacy](help/Groups-and-Privacy)
+* [Profiles](help/Profiles)
* [Remove Account](help/Remove-Account)
+ \ No newline at end of file
diff --git a/doc/Bugs-and-Issues.md b/doc/Bugs-and-Issues.md
deleted file mode 100644
index 251f91e93..000000000
--- a/doc/Bugs-and-Issues.md
+++ /dev/null
@@ -1,31 +0,0 @@
-Bugs and Issues
-===============
-
-* [Home](help)
-
-
-If your server has a support page, you should report any bugs/issues you encounter there first. Reporting to your support page before reporting to the developers makes their job easier, as they don't have to deal with bug reports that might not have anything to do with them, and that helps us get new features faster.
-
-If you're a technical user, or your site doesn't have a support page, you'll need to use the <a href="http://bugs.friendica.com/">Bug Tracker</a>. Please perform a search to see if there's already an open bug that matches yours before submitting anything.
-
-Try to provide as much information as you can about the bug, including the **full** text of any error messages or notices, and any steps required to replicate the problem in as much detail as possible. It's generally better to provide too much information than not enough.
-
-<a href="http://www.chiark.greenend.org.uk/~sgtatham/bugs.html">See this article</a> to learn more about submitting **good** bug reports.
-
-
-**Bug Sponsorship**
-
-If you find a bug, and it is caused by a problem in main branch (ie, is not specific to our site), you may sponsor it.
-
-The bug/issue database allows you to sponsor issues. This provides an incentive for developers to work on your issue. This isn't necessary - we don't like bugs and will try to fix them. This has more importance for future development projects and feature requests.
-
-Bug sponsorship works on the honour system. If you agree to pay $10 to fix a bug, when the fix has been checked in and verified you should send a paypal payment to the developer assigned to the bug. Don't ever think you can get away with not paying a developer for work performed. Some of these guys could hack into your credit card account if you make them mad.
-
-At the present time, one has to be approved as a "developer" to be able to assign themselves to a sponsored bug. This requires the developer to have some history fixing Friendica bugs. This is for everybody's assurance that the bug fix will work well with Friendica. If you wish to become approved as a developer, work on and check in some non-sponsored issues or your own projects and we will move you up the ladder.
-
-If you truly feel you have the solution to a sponsored bug but aren't an approved developer, you risk a sponsored developer assigning the bug to themselves before you check it in, but if they haven't done so - include a short note with your pull request. Assuming that it meets our code standards, we'll see that you get credit.
-
-If you sponsor a project at greater than a $50 level, you may be requested by the developer for payment up front before work has begun (typically half). Again this is on the honour system - and is mostly to avoid payment issues and disagreements later. You should also expect to see some progress updates or demonstrations if the work takes more than a week or two. If the work is not completed within a reasonable time (as decided by those involved), you are entitled to get your money back.
-
-Friendica is not involved in these transactions. It is purely a personal agreement between sponsors and developers. If there are any issues, the parties will need to work it out between themselves. We're just providing some guidelines to help avoid potential problems.
-
diff --git a/doc/Channels.md b/doc/Channels.md
new file mode 100644
index 000000000..152e6aba1
--- /dev/null
+++ b/doc/Channels.md
@@ -0,0 +1,27 @@
+**Channels**
+
+Channels are simply collections of content stored in one place. A channel can represent anything. It could represent you, a website, a forum, photo albums, anything. For most people, their first channel with be "Me".
+
+The most important features for a channel that represents "me" are:
+
+- Secure and private "spam free" communications
+
+- Identity and "single-signon" across the entire network
+
+- Privacy controls and permissions which extend to the entire network
+
+- Directory services (like a phone book)
+
+In short, a channel that represents yourself is "me, on the internet".
+
+You will be required to create your first channel as part of the sign up process. You can also create additonal channels from the "Select channel" link.
+
+You will be asked to provide a channel name, and a short nick name. For a channel that represents yourself, it is a good idea to use your real name here to ensure your friends can find you, and connect to your channel. The short nickname will be used to generate a "webbie". This is a bit like a username, and will look like an email address, taking the form nickname@domain. You should put a little thought into what you want to use here. Imagine somebody asking for your webbie and having to tell them it is "llamas-are_kewl.123". "llamasarecool" would be a much better choice.
+
+Once you have created your channel, you will be taken to the settings page, where you can configure your channel, and set your default permissions.
+
+Once you have done this, your channel is ready to use. At https://yourdomain/channel/username you will find your channel "stream". This is where your recent activity will appear, in reverse chronological order. If you post in the box marked "share", the entry will appear at the top of your stream. You will also find links to all the other communication areas for this channel here. The "About" tab contains your "profile", the photos page contain photo albums, and the events page contains events share by both yourself and your contacts.
+
+The "Matrix" page contains all recent posts from across the matrix, again in reverse chronologial order. The exact posts that appear here depend largely on your permissions. At their most permissive, you will receive posts from complete strangers. At the other end of the scale, you may see posts from only your friends - or if you're feeling really anti-social, only your own posts.
+
+As mentioned at the start, many other kinds of channel are possible, however, the creation procedure is the same. The difference between channels lies primarily in the permissions assigned. For example, a channel for sharing documents with colleagues at work would probably want more permissive settings for "Can write to my "public" file storage" than a personal account. For more information, see the permissions section. \ No newline at end of file
diff --git a/doc/Cloud.md b/doc/Cloud.md
new file mode 100644
index 000000000..c696b292e
--- /dev/null
+++ b/doc/Cloud.md
@@ -0,0 +1,36 @@
+Personal Cloud Storage
+======================
+
+
+The Red Matrix provides an ability to store privately and/or share arbitrary files with friends.
+
+You may either upload files from your computer into your storage area, or copy them directly from the operating system using the WebDAV protocol.
+
+On many public servers there may be limits on disk usage.
+
+
+**File Attachments**
+
+The quickest and easiest way to share files is through file attachments. In the row of icons below the status post editor is a tool to upload attachments. Click the tool, select a file and submit. After the file is uploaded, you will see an attachment code placed inside the text region. Do not edit this line or it may break the ability for your friends to see the attachment. You can use the post permissions dialogue box or privacy hashtags to restrict the visibility of the file - which will be set to match the permissions of the post your are sending.
+
+To delete attachments or change the permissions on the stored files, visit "filestorage/$channel_nickname" replacing $channel_nickname with the nickname you provided during channel creation.
+
+**Web Access**
+
+Your files are visible on the web at the location "cloud/$channel_nickname" to anybody who is allowed to view them. If the viewer has sufficient privileges, they may also have the ability to create new files and folders/directories.
+
+
+**WebDAV access**
+
+This varies by operating system. In Windows, open the Windows Explorer (file manager) and type "$yoursite\cloud\$channel_nickname" into the address bar. Replace $yoursite with the URL to your Red Matrix hub and $channel_nickname with the nickname for your channel.
+
+You will be prompted for a username and password. For the username, you may supply either your account email address (which will select the default channel), or a channel nickname for the channel you wish to authenticate as. In either case use your account password for the password field. You will then be able to copy, drag/drop, edit, delete and otherwise work with files as if they were an attached disk drive.
+
+
+**Permissions**
+
+When using WebDAV, the file is created with your channel's default file permissions and this cannot be changed from within the operating system. It also may not be as restrictive as you would like. What we've found is that the preferred method of making files private is to first create folders or directories; then visit "filestorage/$channel_nickname"; select the directory and change the permissions. Do this before you put anything into the directory. The directory permissions take precedence so you can then put files or other folders into that container and they will be protected from unwanted viewers by the directory permissions. It is common for folks to create a "personal" or "private" folder which is restricted to themselves. You can use this as a personal cloud to store anything from anywhere on the web or any computer and it is protected from others. You might also create folders for "family" and "friends" with permission granted to appropriate collections of channels.
+
+
+
+ \ No newline at end of file
diff --git a/doc/Comanche.md b/doc/Comanche.md
new file mode 100644
index 000000000..8874e839a
--- /dev/null
+++ b/doc/Comanche.md
@@ -0,0 +1,143 @@
+Comanche Page Description Language
+==================================
+
+
+Comanche is a markup language similar to bbcode with which to create elaborate and complex web pages by assembling them from a series of components - some of which are pre-built and others which can be defined on the fly. Comanche uses a Page Decription Language to create these pages.
+
+Comanche primarily chooses what content will appear in various regions of the page. The various regions have names and these names can change depending on what layout template you choose.
+
+Currently there are two layout templates, unless your site provides additional layouts (TODO list all templates)
+
+ default
+
+ The default template defines a "nav" region across the top, "aside" as a fixed width sidebar,
+ "content" for the main content region, and "footer" for a page footer.
+
+
+ full
+
+ The full template defines the same as the default template with the exception that there is no "aside" region.
+
+
+To choose a layout template, use the 'layout' tag.
+
+ [layout]full[/layout]
+
+
+The default template will be used if no other template is specified. The template can use any names it desires for content regions. You will be using 'region' tags to decide what content to place in the respective regions.
+
+
+Two "macros" have been defined for your use.
+
+ $nav - replaced with the site navigation bar content.
+ $content - replaced with the main page content.
+
+
+By default, $nav is placed in the "nav" page region and $content is placed in the "content" region. You only need to use these macros if you wish to re-arrange where these items appear, either to change the order or to move them to other regions.
+
+
+To select a theme for your page, use the 'theme' tag.
+
+ [theme]apw[/theme]
+
+This will select the theme named "apw". By default your channel's preferred theme will be used.
+
+
+**Regions**
+
+Each region has a name, as noted above. You will specify the region of interest using a 'region' tag, which includes the name. Any content you wish placed in this region should be placed between the opening region tag and the closing tag.
+
+ [region=aside]....content goes here....[/region]
+ [region=nav]....content goes here....[/region]
+
+
+
+**Menus and Blocks**
+
+Your webpage creation tools allow you to create menus and blocks, in addition to page content. These provide a chunk of existing content to be placed in whatever regions and whatever order you specify. Each of these has a name which you define when the menu or block is created.
+
+ [menu]mymenu[/menu]
+
+This places the menu called "mymenu" at this location on the page, which must be inside a region.
+
+ [block]contributors[/block]
+
+This places a block named "contributors" in this region.
+
+
+**Widgets**
+
+Widgets are executable apps provided by the system which you can place on your page. Some widgets take arguments which allows you to tailor the widget to your purpose. (TODO: list available widgets and arguments). The base system provides
+
+ profile - widget which duplicates the profile sidebar of your channel page. This widget takes no arguments
+ tagcloud - provides a tag cloud of categories
+ count - maximum number of category tags to list
+
+
+
+Widgets and arguments are specified with the 'widget' and 'arg' tags.
+
+ [widget=recent_visitors][arg=count]24[/arg][/widget]
+
+This loads the "recent_visitors" widget and supplies it with the argument "count" set to "24".
+
+
+**Comments**
+
+The 'comment' tag is used to delimit comments. These comments will not appear on the rendered page.
+
+ [comment]This is a comment[/comment]
+
+
+
+**Complex Example**
+
+ [comment]use an existing page template which provides a banner region plus 3 columns beneath it[/comment]
+
+ [layout]3-column-with-header[/layout]
+
+ [comment]Use the "darknight" theme[/comment]
+
+ [theme]darkknight[/theme]
+
+ [comment]Use the existing site navigation menu[/comment]
+
+ [region=nav]$nav[/region]
+
+ [region=side]
+
+ [comment]Use my chosen menu and a couple of widgets[/comment]
+
+ [menu]myfavouritemenu[/menu]
+
+ [widget=recent_visitors]
+ [arg=count]24[/arg]
+ [arg=names_only]1[/arg]
+ [/widget]
+
+ [widget=tagcloud][/widget]
+ [block]donate[/block]
+
+ [/region]
+
+
+
+ [region=middle]
+
+ [comment]Show the normal page content[/comment]
+
+ $content
+
+ [/region]
+
+
+
+ [region=right]
+
+ [comment]Show my condensed channel "wall" feed and allow interaction if the observer is allowed to interact[/comment]
+
+ [widget]channel[/widget]
+
+ [/region]
+
+
diff --git a/doc/Connecting-to-Channels.md b/doc/Connecting-to-Channels.md
new file mode 100644
index 000000000..4fe2a0789
--- /dev/null
+++ b/doc/Connecting-to-Channels.md
@@ -0,0 +1,20 @@
+Connecting To Channels
+======================
+
+Connections in the Red Matrix can take on a great many different meanings. But let's keep it simple, you want to be friends with somebody like you are familiar with from social networking. How do you do it?
+
+First, you need to find some channels to connect to. There are two primary ways of doing this. Firstly, setting the "Can send me their channel stream and posts" permission to "Anybody in this network" will bring posts from complete strangers to your matrix. This will give you a lot of public content and should hopefully help you find interesting, entertaing people, forums, and channels.
+
+The next thing you can do is look at the Directory. The directory is available on every Red Matrix website which means searching from your own site will bring in results from the entire network. You can search by name, interest, location and keyword. This is incomplete, so we'll improve this paragraph later.
+
+To connect with other Red Matrix channels:
+
+Visit their profile by clicking their photograph in the directory, matrix, or comments, and it will open their channel home page in the channel viewer. At the left hand side of the screen, you will usually see a link called "connect". Click it, and you're done. Depending on the settings of the channel you are connecting to, you may need to wait for them to approve your connection, but no further action is needed on your part. Once you've initiated the connection, you will be taken to the connection editor. This allows you to assign specific permissions for this channel. If you don't allow any permissions, communication will be very limited. There are some quick links which you can use to avoid setting individual permissions. To provide a social network environment, "Full Sharing" is recommended. You may review the settings that are applied with the quick links to ensure they are suitable for the channel you are connecting with and adjust if necessary. Then scroll to the bottom of the page and click "Submit".
+
+You may also connect with any channel by visiting the "Connections" page of your site or the Directory and typing their "webbie" into the "Add New Connection" field. Use this method if somebody tells you their webbie and you wish to connect with them. A webbie looks like an email address; for example "bob@example.com". The process is the same as connecting via the "Connect" button - you will then be taken to the connection editor to set permissions.
+
+**Premium Channels**
+
+Some channels are designated "Premium Channels" and **may** require some action on your part before a connection can be established. The Connect button will for these channels will take you to a page which lists in detail what terms the channel owner has set. If the terms are accepted, the connection will then proceed normally. In some cases, such as with celebrities and world-reknowned publishers, this **may** involve payment. If you do not agree to the terms, the connection will not proceed, or it may proceed but with reduced permissions allowed on your interactions with that channel.
+
+ \ No newline at end of file
diff --git a/doc/Connectors.md b/doc/Connectors.md
deleted file mode 100644
index 08b4c135e..000000000
--- a/doc/Connectors.md
+++ /dev/null
@@ -1,67 +0,0 @@
-Connectors
-==========
-
-* [Home](help)
-
-Connectors allow you to connect with external social networks and services. Connectors are only required for posting to existing accounts on Facebook, Twitter, and StatusNet. There is also a connector for accessing your email INBOX.
-
-If the following network connectors are installed on your system, select the following links to visit the appropriate settings page and configure them for your account:
-
-* [Facebook](/settings/addon)
-* [Twitter](/settings/addon)
-* [StatusNet](/settings/addon)
-* [Email](/settings)
-
-Instructions For Connecting To People On Specific Services
-==========================================================
-
-**Friendica**
-
-
-You may connect by providing your Identity Address on the 'Connect' page of any Friendica member. You may also put their Identity Address into the Connect box on your [Contacts](contacts) page.
-
-
-**Diaspora**
-
-Add the Diaspora 'handle' to the 'Connect/Follow' text box on your [Contacts](contacts) page.
-
-
-**Identi.ca/StatusNet/GNU-Social**
-
-These are described as the "federated social web" or OStatus contacts.
-
-Please note that there are **no** privacy provisions on the OStatus network. Any message which is delivered to **any** OStatus member is visible to anybody in the world and will negate any privacy settings that you have in effect. These messages will also turn up in public searches.
-
-Since OStatus communications do not use authentication, if you select the profile privacy option to hide your profile and messages from unknown viewers, OStatus members will **not** be able to receive your communications.
-
-To connect with an OStatus member insert their profile URL or Identity address into the Connect box on your [Contacts](contacts) page.
-
-The StatusNet connector may be used if you wish posts to appear on an OStatus site using an existing OStatus account.
-
-It is not necessary to do this, as you may 'follow' OStatus members from Friendica and they may follow you (by placing their own Identity Address into your 'Connect' page).
-
-**Blogger, Wordpress, RSS feeds, arbitrary web pages**
-
-Put the URL into the Connect box on your [Contacts](contacts) page. You will not be able to reply to these contacts.
-
-This will allow you to _connect_ with millions of pages on the internet. All that we require to do this is that the page use a discoverable feed using either the RSS or Atom syndication format, and which provides an author name and a site image in a form which we can extract.
-
-
-**Twitter**
-
-To follow a Twitter member, put the URL of the Twitter member's main page into the Connect box on your [Contacts](contacts) page. To reply, you must have the Twitter connector installed, and reply using your own status editor. Begin the message with @twitterperson replacing with the Twitter username.
-
-**Email**
-
-Configure the email connector from your [Settings](settings) page. Once this has been done, you may enter an email addres to connect with using the Connect box on your [Contacts](contacts) page. They must be the sender of a message which is currently in your INBOX for the connect to succeed. You may include email contacts in private conversations.
-
-**Facebook**
-
-The Facebook connector is a plugin/addon which allows you to interact with friends on Facebook from within Friendica. If enabled, your Facebook friend list will be imported, and you will see and be able to respond to Facebook posts. Facebook members may also be added to private conversation groups. You will not be able to connect with individual Facebook accounts - but will have your entire friend list imported and updated if new friends are added.
-
-Assuming the Facebook plugin/addon has been installed on your system, it can be enabled by going to your [Plugin Settings](settings/addon) page, and then select "Facebook Connector Settings" on that page. This will only appear if the Facebook plugin/addon has been installed. Follow the instruction to install or remove the Facebook connector.
-
-You may also choose whether your public postings are posted to Facebook by default. You may toggle this setting at any time from the Permissions settings of the status post editor (click the lock icon). This setting has no effect on private conversations - which will always be delivered to Facebook friends who are included in the permissions.
-
-(Note: At this time, Facebook contacts will not be able to view any private photos. This will be resolved in a future release. Facebook contacts may however see any public photos you have uploaded.)
-
diff --git a/doc/Developers.md b/doc/Developers.md
index 17aff3869..baadd1a2e 100644
--- a/doc/Developers.md
+++ b/doc/Developers.md
@@ -1,13 +1,14 @@
-Friendica Developer Guide
+Red Developer Guide
+===================
-Here is how you can join us.
+**Here is how you can join us.**
First, get yourself a working git package on the system where you will be
doing development.
Create your own github account.
-You may fork/clone the Friendica repository from [https://github.com/friendica/friendica.git](https://github.com/friendica/friendica.git).
+You may fork/clone the Red repository from [https://github.com/friendica/red.git](https://github.com/friendica/red.git).
Follow the instructions provided here: [http://help.github.com/fork-a-repo/](http://help.github.com/fork-a-repo/)
to create and use your own tracking fork on github
@@ -15,8 +16,40 @@ to create and use your own tracking fork on github
Then go to your github page and create a "Pull request" when you are ready
to notify us to merge your work.
+**Translations**
+
+Our translations are managed through Transifex. If you wish to help out translating the Red Matrix to another language, sign up on transifex.com, visit [https://www.transifex.com/projects/p/red-matrix/](https://www.transifex.com/projects/p/red-matrix/) and request to join one of the existing language teams or create a new one. Notify one of the core developers when you have a translation update which requires merging, or ask about merging it yourself if you're comfortable with git and PHP. We have a string file called 'messages.po' which is gettext compliant and a handful of email templates, and from there we automatically generate the application's language files.
+
+[Translations - More Info](help/Translations)
+
**Important**
Please pull in any changes from the project repository and merge them with your work **before** issuing a pull request. We reserve the right to reject any patch which results in a large number of merge conflicts. This is especially true in the case of language translations - where we may not be able to understand the subtle differences between conflicting versions.
-Also - **test your changes**. Don't assume that a simple fix won't break something else. If possible get an experienced Friendica developer to review the code. \ No newline at end of file
+Also - **test your changes**. Don't assume that a simple fix won't break something else. If possible get an experienced Red developer to review the code.
+
+Further documentation can be found at the Github wiki pages at: [https://github.com/friendica/red/wiki](https://github.com/friendica/red/wiki).
+
+**Licensing**
+
+All code contributed to the project falls under the MIT license, unless otherwise specified. We will accept third-party code which falls under MIT, BSD and LGPL, but copyleft licensing (GPL, and AGPL) is only permitted in addons. It must be possible to completely remove the GPL (copyleft) code from the main project without breaking anything.
+
+**Coding Style**
+
+In the interests of consistency we adopt the following code styling. We may accept patches using other styles, but where possible please try to provide a consistent code style. We aren't going to argue or debate the merits of this style, and it is irrelevant what project 'xyz' uses. This is not project 'xyz'. This is a baseline to try and keep the code readable now and in the future.
+
+* All comments should be in English.
+
+* We use doxygen to generate documentation. This hasn't been consistently applied, but learning it and using it are highly encouraged.
+
+* Indentation is accomplished primarily with tabs using a tab-width of 4.
+
+* String concatenation and operators should be separated by whitespace. e.g. "$foo = $bar . 'abc';" instead of "$foo=$bar.'abc';"
+
+* Generally speaking, we use single quotes for string variables and double quotes for SQL statements. "Here documents" should be avoided. Sometimes using double quoted strings with variable replacement is the most efficient means of creating the string. In most cases, you should be using single quotes.
+
+* Use whitespace liberally to enhance readability. When creating arrays with many elements, we will often set one key/value pair per line, indented from the parent line appropriately. Lining up the assignment operators takes a bit more work, but also increases readability.
+
+* Generally speaking, opening braces go on the same line as the thing which opens the brace. They are the last character on the line. Closing braces are on a line by themselves.
+
+
diff --git a/doc/Features.md b/doc/Features.md
new file mode 100644
index 000000000..184652742
--- /dev/null
+++ b/doc/Features.md
@@ -0,0 +1,107 @@
+Extra Features
+==============
+
+The default interface of the Red Matrix was designed to be uncluttered. There are a huge number of extra features (some of which are extremely useful) which you can turn on and get the most of the application. These are found under the [Extra Features](settings/features) link of your [Settings](settings) page.
+
+**Content Expiration**
+
+Remove posts/comments and/or private messages at a future time. An extra button is added to the post editor which asks you for an expiration. Typically this in "yyyy-mm-dd hh:mm" format, but in the English language you have a bit more freedom and can use most any recognisable date reference such as "next Thursday" or "+1 day". At the specified time (give or take approximately ten minutes based on the remote system's checking frequency) the post is removed.
+
+**Multiple Profiles**
+
+The ability to create multiple profiles which are visible only to specific persons or groups. Your default profile may be visible to anybody, but secondary profiles can all contain different or additional information and can only be seen by those to whom that profile is assigned.
+
+**Web Pages**
+
+Provides the ability to use web page design feaures and create custom webpages from your own content and also to design the pages with page layouts, custom menus, and content blocks.
+
+**Private Notes**
+
+On pages where it is available (your matrix page and personal web pages) provide a "widget" to create and store personal reminders and notes.
+
+**Enhanced Photo Albums**
+
+Provides a photo album viewer that is a bit prettier than the normal interface.
+
+**Extended Identity Sharing**
+
+By default your identity travels with you as you browse the matrix to remote sites - and they know who you are and can show you content that only you can see. With Extended Identity Sharing you can provide this information to any website you visit from within the matrix.
+
+**Expert Mode**
+
+This allows you to see some advanced configuration options that would confuse some people or cause support issues. In particular this can give you full control over theme features and colours - so that you can tweak a large number of settings of the display theme to your liking.
+
+**Premium Channel**
+
+This allows you to set restrictions and terms on those that connect with your channel. This may be used by celebrities or anybody else who wishes to describe their channel to people who wish to connect with it. In certain cases you may be asked for payment in order to connect.
+
+
+**Richtext Editor**
+
+The status post editor is plaintext, but the matrix allows a wide range of markup using BBcode. The visual editor provides "what you see is what you get" for many of the most frequently used markup tags.
+
+**Post Preview**
+
+Allows previewing posts and comments exactly as they would look on the page before publishing them.
+
+**Channel Sources**
+
+Automatically import and re-publish channel content from other channels or feeds. This allows you to create sub-channels and super-channels from content provided elsewhere. The rules are that the content must be public, and the channel owner must give you permission to source their channel.
+
+**Even More Encryption**
+
+Private messages are encrypted during transport and storage. In this day and age, this encyption may not be enough if your communications are extremely sensitive. This options lets you provide optional encryption of content "end-to-end" with a shared secret key. How the recipient learns the secret key is completely up to you. You can provide a hint such as "the name of aunt Claire's first dog".
+
+
+**Search by Date**
+
+This provides the ability to select posts by date ranges
+
+**Collections Filter**
+
+Enable widget to display stream posts only from selected collections. This also toggles the outbound permissions while you are viewing a collection. This is analogous to Google "circles" or Disapora "aspects".
+
+**Saved Searches**
+
+Provides a search widget on your matrix page which can save selected search terms for re-use.
+
+**Personal Tab**
+
+Enable tab to display only matrix posts that you've interacted with in some way, as an author or a contributor to the conversation.
+
+**New Tab**
+
+Enables a tab to display all new matrix activity as a firehose or timeline.
+
+**Affinity Tool**
+
+Filter matrix stream activity by the depth of your relationships
+
+**Edit Sent Posts**
+
+Edit and correct posts and comments after sending
+
+**Tagging**
+
+Ability to tag existing posts, including those written by others.
+
+**Post Categories**
+
+Add categories to your channel posts
+
+**Saved Folders**
+
+Ability to file posts under folders or tags for later recall
+
+**Dislike Posts**
+
+Ability to dislike posts/comments
+
+**Star Posts**
+
+Ability to mark special posts with a star indicator
+
+**Tag Cloud**
+
+Provide a personal tag cloud on your channel page
+
diff --git a/doc/Groups-and-Privacy.md b/doc/Groups-and-Privacy.md
deleted file mode 100644
index 09c6a7349..000000000
--- a/doc/Groups-and-Privacy.md
+++ /dev/null
@@ -1,53 +0,0 @@
-Groups and Privacy
-==================
-
-* [Home](help)
-
-
-Groups are merely collections of friends. But Friendica uses these to unlock some very powerful features.
-
-To create a group, visit your Friendica "Contacts" page and select "Create a new group". Give the group a name.
-
-This brings you to a page where you can select the group members.
-
-You will have two boxes on this page. The top box is the roster of current group members. Below that is another box containing all of your friends who are *not* members of the group.
-
-If you click on a photo of a person who isn't in the group, they will be put into the group. If you click on a photo of a person who is in the group, they will be removed from it.
-
-Once you have created a group, you may use it in any access control list. This is the little lock icon beneath the status update box on your home page. If you click this you can select who can see and who can *not* see the post you are about to make. These can be individual people or groups.
-
-On your "Network" page you will find posts and conversation from everybody in your network. You may select an individual group on this page to show conversations pertaining only to members of that group.
-
-But wait, there's more...
-
-If you look carefully when visiting a group from your Network page, the lock icon under the status update box has an exclamation mark next to it. This is meant to draw attention to that lock. Click the lock. You will see that since you are only viewing a certain group of people, your status updates while on that screen default to only being seen by that same group of people. This is how you keep your future employers from seeing what you write to your drinking buddies. You can over-ride this setting, but this makes it easy to separate your conversations into different friend circles.
-
-These private conversations work best when your friends are Friendica members. We know who else can see the conversations - nobody, *unless* your friends cut and paste the messages and send them to others.
-
-This is a trust issue you need to be aware of. No software in the world can prevent your friends from leaking your confidential and trusted communications. Only a wise choice of friends.
-
-But it isn't as clear cut when dealing with status.net, identi.ca and other network providers. You are encouraged to be **very** cautious when other network members are in a group because it's entirely possible for your private messages to end up in a public newsfeed. If you look at the Contact Edit page for any person, we will tell you whether or not they are members of an insecure network where you should exercise caution.
-
-On your "Settings" page, you may create a set of default permissions which apply to every post that you create.
-
-Once you have created a post, you can not change the permissions assigned. Within seconds it has been delivered to lots of people - and perhaps everybody it was addressed to. If you mistakenly created a message and wish you could take it back, the best you can do is to delete it. We will send out a delete notification to everybody who received the message - and this should wipe out the message with the same speed it was initially propagated. In most cases it will be completely wiped from the Internet - in under a minute. Again, this applies to Friendica networks. Once a message spreads to other networks, it may not be removed quickly and in some cases it may not be removed at all.
-
-In case you haven't yet figured this out, we are encouraging you to encourage your friends to use Friendica - because all these privacy features work much better within a privacy-aware network. Many of the other social networks Friendica can connect to have no privacy controls.
-
-
-Profiles, Privacy, and Photos
-=============================
-
-The decentralised nature of Friendica (many websites exchanging information rather than one website which controls everything) has some implications with privacy as it relates to people on other sites. There are things you should be aware of, so you can decide best how to interact privately.
-
-Sharing photos privately is a problem. We can only share them __privately__ with Friendica members. In order to share with other people, we need to prove who they are. We can prove the identity of Friendica members, as we have a mechanism to do so. Your friends on other networks will be blocked from viewing these private photos because we cannot prove that they should be allowed to see them.
-
-Our developers are working on solutions to allow access to your friends - no matter what network they are on. However we take privacy seriously and don't behave like some networks that __pretend__ your photos are private, but make them available to others without proof of identity.
-
-Your profile and "wall" may also be visited by your friends from other networks, and you can block access to these by web visitors that Friendica doesn't know. Be aware that this could include some of your friends on other networks.
-
-This may produce undesired results when posting a long status message to (for instance) Twitter and even Facebook. When Friendica sends a post to these networks which exceeds the service length limit, we truncate it and provide a link to the original. The original is a link back to your Friendica profile. As Friendica cannot prove who they are, it may not be possible for these people to view your post in full.
-
-For people in this situation we would recommend providing a "Twitter-length" summary, with more detail for friends that can see the post in full.
-
-Blocking your profile or entire Friendica site from unknown web visitors also has serious implications for communicating with StatusNet/identi.ca members. These networks communicate with others via public protocols that are not authenticated. In order to view your posts, these networks have to access them as an "unknown web visitor". If we allowed this, it would mean anybody could in fact see your posts, and you've instructed Friendica not to allow this. So be aware that the act of blocking your profile to unknown visitors also has the effect of blocking outbound communication with public networks (such as identi.ca) and feed readers such as Google Reader. \ No newline at end of file
diff --git a/doc/Home.md b/doc/Home.md
index 30efc93f7..bdb169691 100644
--- a/doc/Home.md
+++ b/doc/Home.md
@@ -1,37 +1,43 @@
-Friendica Documentation and Resources
-=====================================
+Red Matrix Documentation and Resources
+======================================
**Contents**
* [Account Basics](help/Account-Basics)
-* [New User Quick Start](help/guide)
* [Profiles](help/Profiles)
-* [Connectors](help/Connectors)
-* [Making Friends](help/Making-Friends)
-* [Groups and Privacy](help/Groups-and-Privacy)
+* [Channels](help/Channels)
+* [Connecting to Channels](help/Connecting-to-Channels)
+* [Permissions](help/Permissions)
+* [Cloud Storage](help/Cloud)
+* [But Wait - There's More. MUCH More...](help/Features)
* [Tags and Mentions](help/Tags-and-Mentions)
-* [Pages](help/Pages)
+* [Web Pages](help/Webpages)
* [Remove Account](help/Remove-Account)
-* [Bugs and Issues](help/Bugs-and-Issues)
+* [BBcode reference for posts and comments](help/bbcode)
**Technical Documentation**
* [Install](help/Install)
-* [Settings](help/Settings)
+* [Comanche Page Descriptions](help/Comanche)
* [Plugins](help/Plugins)
-* [Installing Connectors (Facebook/Twitter/StatusNet)](help/Installing-Connectors)
-* [Message Flow](help/Message-Flow)
+* [Schemas](help/Schema-development)
* [Developers](help/Developers)
-
+* [Intro for Developers](help/Intro-for-Developers)
+* [API functions](help/api_functions)
+* [Red Functions 101](help/dev-function-overview)
+* [Code Reference (doxygen generated)](doc/html)
+* [To-Do list for the Red Documentation Project](help/To-Do)
+* [To-Do list for Developers](help/To-Do-Code)
**External Resources**
-* [Main Website](http://friendica.com)
-* [Forums](http://groups.google.com/group/friendica)
-* [Developer Forums](http://groups.google.com/group/friendica-dev)
+* [Main Website](https://github.com/friendica/red)
+* [Plugin/Addon Website](https://github.com/friendica/red-addons)
+* [Assets Website](https://github.com/friendica/red-assets)
-**About**
+* [Development Channel](http://zothub.com/channel/one)
-* [Site/Version Info](friendica)
+**About**
+* [Site/Version Info](siteinfo)
diff --git a/doc/Hooks.md b/doc/Hooks.md
new file mode 100644
index 000000000..350068314
--- /dev/null
+++ b/doc/Hooks.md
@@ -0,0 +1,135 @@
+Hooks - Complete List
+=====================
+
+
+* 'about_hook'
+* 'account_settings'
+* 'app_menu'
+* 'atom_author'
+* 'atom_entry'
+* 'atom_feed'
+* 'atom_feed_end'
+* 'authenticate'
+* 'avatar_lookup'
+* 'bb2diaspora'
+* 'bbcode'
+* 'channel_remove'
+* 'check_account_email'
+* 'check_account_invite'
+* 'check_account_password'
+* 'connect_premium'
+* 'connector_settings'
+* 'contact_block_end'
+* 'contact_edit'
+* 'contact_edit_post'
+* 'contact_photo_menu'
+* 'contact_select_options'
+* 'conversation_start'
+* 'cron'
+* 'directory_item'
+* 'display_item'
+* 'display_item'
+* 'display_settings'
+* 'display_settings_post'
+* 'enotify'
+* 'enotify_mail'
+* 'enotify_store'
+* 'event_created'
+* 'event_updated'
+* 'feature_enabled'
+* 'feature_settings'
+* 'feature_settings_post'
+* 'follow'
+* 'gender_selector'
+* 'get_all_perms'
+* 'get_features'
+* 'get_widgets'
+* 'global_permissions'
+* 'home_content'
+* 'home_init'
+* 'html2bbcode'
+* 'import_directory_profile'
+* 'init_1'
+* 'item_photo_menu'
+* 'item_translate'
+* 'jot_networks'
+* 'jot_tool'
+* 'logged_in'
+* 'login_hook'
+* 'logging_out'
+* 'magic_auth'
+* 'magic_auth_success'
+* 'main_slider'
+* 'marital_selector'
+* 'mood_verbs'
+* 'network_content_init'
+* 'network_ping'
+* 'network_tabs'
+* 'network_to_name'
+* 'notifier_end'
+* 'notifier_normal'
+* 'obj_verbs'
+* 'oembed_probe'
+* 'page_content_top'
+* 'page_end'
+* 'page_header'
+* 'parse_atom'
+* 'parse_link'
+* 'pdl_selector'
+* 'perm_is_allowed'
+* 'personal_xrd'
+* 'photo_post_end'
+* 'photo_post_end'
+* 'photo_upload_begin'
+* 'photo_upload_end'
+* 'photo_upload_file'
+* 'photo_upload_form'
+* 'poke_verbs'
+* 'post_local'
+* 'post_local_end'
+* 'post_local_start'
+* 'post_mail'
+* 'post_mail_end'
+* 'post_remote'
+* 'post_remote_end'
+* 'post_remote_update'
+* 'post_remote_update_end'
+* 'prepare_body'
+* 'prepare_body_final'
+* 'prepare_body_init'
+* 'proc_run'
+* 'profile_advanced'
+* 'profile_edit'
+* 'profile_post'
+* 'profile_sidebar'
+* 'profile_sidebar_enter'
+* 'profile_tabs'
+* 'register_account'
+* 'render_location'
+* 'settings_account'
+* 'settings_form'
+* 'settings_post'
+* 'sexpref_selector'
+* 'smilie'
+* 'validate_channelname'
+* 'webfinger'
+* 'zid'
+* 'zid_init'
+
+***General Module Hooks***
+
+* $a->module . '_mod_aftercontent'
+* $a->module . '_mod_aside'
+* $a->module . '_mod_content'
+* $a->module . '_mod_init'
+* $a->module . '_mod_post'
+
+***General Selector Hooks***
+
+* $a->module . '_post_' . $selname
+* $a->module . '_post_' . $selname
+* $a->module . '_post_' . $selname
+* $a->module . '_pre_' . $selname
+* $a->module . '_pre_' . $selname
+* $a->module . '_pre_' . $selname
+
diff --git a/doc/Install.md b/doc/Install.md
index 9455c62ba..389c9d632 100644
--- a/doc/Install.md
+++ b/doc/Install.md
@@ -1,17 +1,18 @@
-Friendica Installation
+
+Red Installation
+===============
-We've tried very hard to ensure that Friendica will run on commodity hosting platforms - such as those used to host Wordpress blogs and Drupal websites. But be aware that Friendica is more than a simple web application. It is a complex communications system which more closely resembles an email server than a web server. For reliability and performance, messages are delivered in the background and are queued for later delivery when sites are down. This kind of functionality requires a bit more of the host system than the typical blog. Not every PHP/MySQL hosting provider will be able to support Friendica. Many will. But **please** review the requirements and confirm these with your hosting provider prior to installation.
+Red should run on commodity hosting platforms - such as those used to host Wordpress blogs and Drupal websites. But be aware that Red is more than a simple web application. The kind of functionality offered by Red requires a bit more of the host system than the typical blog. Not every PHP/MySQL hosting provider will be able to support Red. Many will. But **please** review the requirements and confirm these with your hosting provider prior to installation.
-Also if you encounter installation issues, please let us know via the forums at http://groups.google.com/group/friendica or file an issue at http://bugs.friendica.com . Please be as clear as you can about your operating environment and provide as much detail as possible about any error messages you may see, so that we can prevent it from happening in the future. Due to the large variety of operating systems and PHP platforms in existence we may have only limited ability to debug your PHP installation or acquire any missing modules - but we will do our best to solve any general code issues.
-
-Before you begin: Choose a domain name or subdomain name for your server. Put some thought into this - because changing it after installation is currently not-supported. Things will break, and some of your friends may have difficulty communicating with you. We plan to address this limitation in a future release.
+Also if you encounter installation issues, please let us know via the Github issue tracker (https://github.com/friendica/red/issues). Please be as clear as you can about your operating environment and provide as much detail as possible about any error messages you may see, so that we can prevent it from happening in the future. Due to the large variety of operating systems and PHP platforms in existence we may have only limited ability to debug your PHP installation or acquire any missing modules - but we will do our best to solve any general code issues.
+Before you begin: Choose a domain name or subdomain name for your server.
1. Requirements
- Apache with mod-rewrite enabled and "Options All" so you can use a
local .htaccess file
- - PHP 5.2+. The later the better. You'll need 5.3 for encryption of key exchange conversations. On a Windows environment, 5.2+ might not work as the function dns_get_record() is only available with version 5.3.
+ - PHP 5.3 or later
- PHP *command line* access with register_argc_argv set to true in the
php.ini file
- curl, gd, mysql, and openssl extensions
@@ -32,15 +33,21 @@ not be as convenient to use and have not been thoroughly tested.
reasonable price. If your hosting provider doesn't allow Unix shell access,
you might have trouble getting everything to work.]
-2. Unpack the Friendica files into the root of your web server document area.
+2. Unpack the Red files into the root of your web server document area.
- If you are able to do so, we recommend using git to clone the source repository rather than to use a packaged tar or zip file. This makes the software much easier to update. The Linux command to clone the repository into a directory "mywebsite" would be
- `git clone https://github.com/friendica/friendica.git mywebsite`
+ `git clone https://github.com/friendica/red.git mywebsite`
- and then you can pick up the latest changes at any time with
`git pull`
+
+ - make sure folder *view/tpl/smarty3* exists and is writable by webserver
+
+ `mkdir view/tpl/smarty3`
+
+ `chown 777 view/smarty3`
- For installing addons
@@ -50,7 +57,7 @@ you might have trouble getting everything to work.]
- Then you should clone the addon repository (separtely)
- `git clone https://github.com/friendica/friendica-addons.git addon`
+ `git clone https://github.com/friendica/red-addons.git addon`
- For keeping the addon tree updated, you should be on you addon tree and issue a git pull
@@ -81,7 +88,7 @@ database was not installed correctly. You might wish to move/rename
.htconfig.php to another name and empty (called 'dropping') the database
tables, so that you can start fresh.
-7. Set up a cron job or scheduled task to run the poller once every 5-10
+7. Set up a cron job or scheduled task to run the poller once every 15
minutes in order to perform background processing. Example:
`cd /base/directory; /path/to/php include/poller.php`
@@ -91,21 +98,8 @@ Change "/base/directory", and "/path/to/php" as appropriate for your situation.
If you are using a Linux server, run "crontab -e" and add a line like the
one shown, substituting for your unique paths and settings:
-`*/10 * * * * cd /home/myname/mywebsite; /usr/bin/php include/poller.php`
+`*/15 * * * * cd /home/myname/mywebsite; /usr/bin/php include/poller.php`
You can generally find the location of PHP by executing "which php". If you
have troubles with this section please contact your hosting provider for
-assistance. Friendica will not work correctly if you cannot perform this step.
-
-Alternative: You may be able to use the 'poormancron' plugin to perform this step
-if you are using a recent Friendica release. To do this, edit the file ".htconfig.php"
-and look for a line describing your plugins. On a fresh installation, it will look like
-
-`$a->config['system']['addon'] = 'js_upload';`
-
-This indicates the "js_upload" addon module is enabled. You may add additional
-addons/plugins using this same line in the configuration file. Change it to read
-
-`$a->config['system']['addon'] = 'js_upload,poormancron';`
-
-and save your changes.
+assistance. Red will not work correctly if you cannot perform this step. \ No newline at end of file
diff --git a/doc/Installing-Connectors.md b/doc/Installing-Connectors.md
deleted file mode 100644
index 328e3b6c4..000000000
--- a/doc/Installing-Connectors.md
+++ /dev/null
@@ -1,135 +0,0 @@
-Installing Connectors (Facebook/Twitter/StatusNet)
-==================================================
-
-* [Home](help)
-
-
-Friendica uses plugins to provide connectivity to some networks, such as Facebook and Twitter.
-
-There is also a plugin to post through to an existing account on a Status.Net service. You do not require this to communicate with Status.Net members from Friendica - only if you wish to post to an existing account.
-
-All three of these plugins require an account on the target network. In addition you (or typically the server administrator) will need to obtain an API key to provide authenticated access to your Friendica server.
-
-**Site Configuration**
-
-Plugins must be installed by the site administrator before they can be used. This is accomplished through the site administration panel.
-
-
-Each of the connectors also requires an "API key" from the service you wish to connect with. Some plugins allow you to enter this information in the site administration pages, while others may require you to edit your configuration file (.htconfig.php). The method for obtaining these keys varies greatly - but almost always requires an existing account on the target service. Once installed, these API keys can usually be shared by all site members.
-
-
-The details of configuring each service follows (much of this information comes directly from the plugin source files):
-
-**Twitter Plugin for Friendica**
-
-* Author: Tobias Diekershoff
-* tobias.diekershoff@gmx.net
-
-* License:3-clause BSD license
-
-Configuration:
-To use this plugin 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.
-We do not need "Twitter as login". When you've registered the app you get the
-OAuth Consumer key and secret pair for your application/site.
-
-Add this key pair to your global .htconfig.php
-
-```
-$a->config['twitter']['consumerkey'] = 'your consumer_key here';
-$a->config['twitter']['consumersecret'] = 'your consumer_secret here';
-```
-
-After this, your user can configure their Twitter account settings
-from "Settings -> Connector Settings".
-
-Documentation: http://diekershoff.homeunix.net/redmine/wiki/friendikaplugin/Twitter_Plugin
-
-
-**StatusNet Plugin for Friendica**
-
-* Author: Tobias Diekershoff
-* tobias.diekershoff@gmx.net
-
-* License:3-clause BSD license
-
-Configuration
-
-When the addon is activated the user has to aquire the following in order to connect to the StatusNet account of choice.
-
-* The base URL for the StatusNet API, for identi.ca this is https://identi.ca/api/
-* OAuth Consumer key & secret
-
-To get the OAuth Consumer key pair the user has to
-
-(a) ask her Friendica admin if a pair already exists or
-(b) has to register the Friendica server as a client application on the StatusNet server.
-
-This can be done from the account settings under "Settings -> Connections -> Register an OAuth client application -> Register a new application" on the StatusNet server.
-
-During the registration of the OAuth client remember the following:
-
-* Application names must be unique on the StatusNet site, so we recommend a Name of 'friendica-nnnn', replace 'nnnn' with a random number or your website name.
-* there is no callback url
-* register a desktop client
-* with read & write access
-* the Source URL should be the URL of your Friendica server
-
-After the required credentials for the application are stored in the configuration you have to actually connect your Friendica account with StatusNet. This is done from the Settings -> Connector Settings page. Follow the Sign in with StatusNet button, allow access and then copy the security code into the box provided. Friendica will then try to acquire the final OAuth credentials from the API.
-
-If successful the addon settings will allow you to select to post your public messages to your StatusNet account (have a look behind the little lock symbol beneath the status "editor" on your Home or Network pages).
-
-Documentation: http://diekershoff.homeunix.net/redmine/wiki/friendikaplugin/StatusNet_Plugin
-
-
-
-**Installing the Friendica/Facebook connector**
-
-* register an API key for your site from developer.facebook.com
-
-This requires a Facebook account, and may require additional authentication in the form of credit card or mobile phone verification.
-
-a. We'd be very happy if you include "Friendica" in the application name
-to increase name recognition. The Friendica icons are also present
-in the images directory and may be uploaded as a Facebook app icon.
-Use images/friendica-16.jpg for the Icon and images/friendica-128.jpg for the Logo.
-
-b. The url should be your site URL with a trailing slash.
-
-You **may** be required to provide a privacy and/or terms of service URL.
-
-c. Set the following values in your .htconfig.php file
-
-```
-$a->config['facebook']['appid'] = 'xxxxxxxxxxx';
-$a->config['facebook']['appsecret'] = 'xxxxxxxxxxxxxxx';
-```
-
-Replace with the settings Facebook gives you.
-
-d. Navigate to Set Web->Site URL & Domain -> Website Settings. Set Site URL
-to yoursubdomain.yourdomain.com. Set Site Domain to your yourdomain.com.
-
-
-On Friendica, visit the Facebook Settings section of the "Settings->Connector Settings" page. And click 'Install Facebook Connector'.
-
-This will ask you to login to Facebook and grant permission to the
-plugin to do its stuff. Allow it to do so.
-
-You're done. To turn it off visit the Connector Settings page again and
-'Remove Facebook posting'.
-
-Videos and embeds will not be posted if there is no other content. Links
-and images will be converted to a format suitable for the Facebook API and
-long posts truncated - with a link to view the full post.
-
-Facebook contacts will also not be able to view "private" photos, as they are not able to authenticate to your site to establish identity. We will address this in a future release.
-
-
-
-
-
-
-
diff --git a/doc/Intro-for-Developers.md b/doc/Intro-for-Developers.md
new file mode 100644
index 000000000..bf74cb7c1
--- /dev/null
+++ b/doc/Intro-for-Developers.md
@@ -0,0 +1,105 @@
+File system layout:
+===================
+
+[addon] optional addons/plugins
+
+[boot.php] Every process uses this to bootstrap the application structure
+
+[doc] Help Files
+
+[images] core required images
+
+[include] The "model" in MVC - (back-end functions), also contains PHP "executables" for background processing
+
+[index.php] The front-end controller for web access
+
+[install] Installation and upgrade files and DB schema
+
+[js] core required javascript
+
+[library] Third party modules (must be license compatible)
+
+[mod] Controller modules based on URL pathname (e.g. http://sitename/foo loads mod/foo.php)
+
+[spec] protocol specifications
+
+[util] translation tools, main English string database and other miscellaneous utilities
+
+[version.inc] contains current version (auto-updated via cron for the master repository and distributed via git)
+
+[view] theming and language files
+
+
+[view/(css,js,img,php,tpl)] default theme files
+
+[view/(en,it,es ...)] language strings and resources
+
+[view/theme/] individual named themes containing (css,js,img,php,tpl) over-rides
+
+
+The Database:
+=============
+
+* abook - contact table, replaces Friendica 'contact'
+* account - service provider account
+* addon - registered plugins
+* attach - file attachments
+* auth_codes - OAuth usage
+* cache - TBD
+* challenge - old DFRN structure, may re-use or may deprecate
+* channel - replaces Friendica 'user'
+* clients - OAuth usage
+* config - main configuration storage
+* event - Events
+* fcontact - friend suggestion stuff
+* ffinder - friend suggestion stuff
+* fserver - obsolete
+* fsuggest - friend suggestion stuff
+* gcign - ignored friend suggestions
+* gcontact - social graph storage, obsolete
+* glink - social graph storage - obsolete
+* group - privacy groups
+* group_member - privacy groups
+* hook - plugin hook registry
+* hubloc - Red location storage, ties a location to an xchan
+* intro - DFRN introductions, may be obsolete
+* item - posts
+* item_id - other identifiers on other services for posts
+* mail - private messages
+* manage - may be unused in Red, table of accounts that can "su" each other
+* notify - notifications
+* notify-threads - need to factor this out and use item thread info on notifications
+* outq - Red output queue
+* pconfig - personal (per channel) configuration storage
+* photo - photo storage
+* profile - channel profiles
+* profile_check - DFRN remote auth use, may be obsolete
+* queue - old Friendica queue, obsolete
+* register - registrations requiring admin approval
+* session - web session storage
+* site - site table to find directory peers
+* spam - unfinished
+* term - item taxonomy (categories, tags, etc.) table
+* tokens - OAuth usage
+* verify - general purpose verification structure
+* xchan - replaces 'gcontact', list of known channels in the universe
+* xlink - "friends of friends" linkages derived from poco
+* xprof - if this hub is a directory server, contains basic public profile info of everybody in the network
+* xtag - if this hub is a directory server, contains tags or interests of everybody in the network
+
+
+How to theme Red - by Olivier Migeot
+====================================
+
+This is a short documentation on what I found while trying to modify Red's appearance.
+
+First, you'll need to create a new theme. This is in /view/theme, and I chose to copy 'redbasic' since it's the only available for now. Let's assume I named it <theme>.
+
+Oh, and don't forget to rename the _init function in <theme>/php/theme.php to be <theme>_init() instead of redbasic_init().
+
+At that point, if you need to add javascript or css files, add them to <theme>/js or <theme>/css, and then "register" them in <theme>_init() through head_add_js('file.js') and head_add_css('file.css').
+
+Now you'll probably want to alter a template. These can be found in in /view/tpl OR view/<theme>/tpl. All you should have to do is copy whatever you want to tweak from the first place to your theme's own tpl directory.
+
+
+
diff --git a/doc/Making-Friends.md b/doc/Making-Friends.md
deleted file mode 100644
index 70b87abbc..000000000
--- a/doc/Making-Friends.md
+++ /dev/null
@@ -1,59 +0,0 @@
-Making Friends
-==============
-
-* [Home](help)
-
-Friendship in Friendica can take on a great many different meanings. But let's keep it simple, you want to be friends with somebody. How do you do it?
-
-The easiest thing to do is to join the <a href="http://kakste.com/profile/newhere">New Here</a> group. This group is especially for people new to the Friendica network. Simply connect to the group, post to the wall, and make new friends. You don't even have to like us - comment on a few of our posts, and other people will start to add you too.
-
-The next thing you can do is look at the Directory. The directory is split up into two parts. If you click the directory button, you will be presented with a list of all members (who chose to be listed) on your server. You'll also see a link to the Global Directory. If you click through to the global directory, you will be presented with a list of everybody who chose to be listed across all instances of Friendica. You will also see a "Show Community Forums" link, which will direct you to Groups, Forums and Fanpages. You connect to people, groups and forums in the same way, except groups and forums will automatically accept your introduction request, whereas a human will approve you manually.
-
-To connect with other Friendica users:
-
-Visit their profile. Just beneath their profile picture will be the word 'Connect' (we're assuming this is an English language profile).
-
-Click that. It will take you to a "Connect" form.
-
-This is going to ask you for your Identity Address. This is necessary so that this person's website can find yours.
-
-What do you put in the box?
-
-If your Friendica site is called "demo.friendica.com" and your username/nickname on that site is "bob", you would put in "bob@demo.friendica.com".
-
-Notice this looks just like an email address. It was meant to be that way. It's easy for people to remember.
-
-You *could* also put in the URL of your "home" page, such as "http://demo.friendica.com/profile/bob", but the email-style address is certainly easier.
-
-When you've submitted the connection page, it will take you back to your own site where you must then login (if necessary) and verify the connection request on *your* site. Once you've done this, the two websites can communicate with each other to complete the process (after your new friend has approved the request).
-
-If you already know somebody's Identity Address, you can enter it in the "connect" box on your "Contacts" page. This will take you through a similar process.
-
-
-**Alternate Networks**
-
-You can also use your Identity Address or other people's Identity Addresses to become friends across networks. The list of possible networks is growing all the time. If you know (for instance) "bob" on identi.ca (a Status.Net site) you could put bob@identi.ca into your Contact page and become friends across networks. (Or you can put in the URL to Bob's identi.ca page if you wish). You can also be "partial" friends with somebody on Google Buzz by putting in their gmail address. Google Buzz does not yet support all the protocols we need for direct messaging, but you should be able to follow status updates from within Friendica. You can do the same for Twitter accounts and Diaspora accounts. In fact you can "follow" most anybody or any website that produces a syndication feed (RSS/Atom,etc.). If we can find an information stream and a name to attach to the contact, we'll try to connect with them.
-
-If you have supplied your mailbox connection information on your Settings page, you can enter the email address of anybody that has sent you a message recently and have their email messages show up in your social stream. You can also reply to them from within Friendica.
-
-People can also become friends with you from other networks. If a friend of yours has an identi.ca account, they can become friends with you by putting your Friendica Identity Address into their identi.ca subscription dialog box. A similar mechanism is available for Diaspora members, by putting your iendtity address into their search bar.
-
-Note: Some versions of StatusNet software may require the full URL to your profile and may not work with the identity address.
-
-When somebody requests friendship you will receive a notification. You will need to approve this before the friendship is complete.
-
-Some networks allow people to send you messages without being friends and without your approval. Friendica does not allow this by default, as it would open a gateway for spam.
-
-When you receive a friendship notification from another Friendica member, you will have the option of allowing them as a "fan" or as a "friend". If they are a fan, they can see what you have to say, including private communications that you send to them, but not vice versa. As a friend, you can both communicate with each other.
-
-Diaspora uses a different terminology, and you are given the option of allowing them to "share with you", or being full friends.
-
-Once you have become friends, if you find the person constantly sends you spam or worthless information, you can "Ignore" them - without breaking off the friendship or even alerting them to the fact that you aren't interested in anything they are saying. In many ways they are like a "fan" - but they don't know this. They think they are a friend.
-
-You can also "block" a person. This completely blocks communications with that person. They may still be able to see your public posts, as can anybody in the world, but they cannot communicate with you directly.
-
-You can also delete a friend no matter what the friendship status - which complete removes everything relating to that person from your website.
-
-
-
-
diff --git a/doc/Message-Flow.md b/doc/Message-Flow.md
deleted file mode 100644
index bb1c063d3..000000000
--- a/doc/Message-Flow.md
+++ /dev/null
@@ -1,54 +0,0 @@
-Friendica Message Flow
-
-This page attempts to document some of the details of how messages get from one person to another in the Friendica network. There are multiple paths, using multiple protocols and message formats.
-
-Those attempting to understand these message flows should become familiar with (at the minimum) the DFRN protocol document (http://dfrn.org/dfrn.pdf) and the message passing elements of the OStatus stack (salmon and Pubsubhubbub).
-
-
-Most message passing involves the file include/items.php, which has functions for several feed-related import/export activities.
-
-When a message is posted, all immediate deliveries to all networks are made using include/notifier.php, which chooses how (and to whom) to deliver the message. This file also invokes the local side of all deliveries including DFRN-notify.
-
-mod/dfrn_notify.php handles the remote side of DFRN-notify.
-
-Local feeds are generated by mod/dfrn_poll.php - which also handles the remote side of DFRN-poll protocol.
-
-Salmon notifications arrive via mod/salmon.php.
-
-Push (pubsubhubbub) feeds arrive via mod/pubsub.php
-
-DFRN-poll feed imports arrive via include/poller.php as a scheduled task, this implements the local side of the DFRN-poll protocol.
-
-
-
-
-Scenario #1. Bob posts a public status message
-
-This is a public message with no conversation members so no private transport is used. There are two paths it can take - as a bbcode path to DFRN clients, and converted to HTML with the server's PuSH (pubsubhubbub) hubs notified. When a PuSH hub is operational, dfrn-poll clients prefer to receive their information through the PuSH channel. They will fall back on a daily poll in case the hub has delivery issues (this is quite common when using the default Google reference hub). If there is no specified hub or hubs, DFRN clients will poll at a configurable (per-contact) rate at up to 5-minute intervals. Feeds retrieved via dfrn-poll are bbcode and may also contain private conversations which the poller has permissions to see.
-
-Scenario #2. Jack replies to Bob's public message. Jack is on the Friendica/DFRN network.
-
-Jack uses dfrn-notify to send a direct reply to Bob. Bob then creates a feed of the conversation and sends it to everybody involved in the conversation using dfrn-notify. PuSH hubs are notified that new content is available. The hub or hubs will then retrieve the latest feed and transmit it to all hub subscribers (which may be on different networks).
-
-Scenario #3. Mary replies to Bob's public message. Mary is on the Friendica/DFRN network.
-
-Mary uses dfrn-notify to send a direct reply to Bob. Bob then creates a feed of the conversation and sends it to everybody involved in the conversation (excluding himself, the conversation is now sent to both Jack and Mary). Messages are sent using dfrn-notify. Push hubs are also notified that new content is available. The hub or hubs will then retrieve the latest feed and transmit it to all hub subscribers (which may be on different networks).
-
-Scenario #4. William replies to Bob's public message. William is on the OStatus network.
-
-William uses salmon to notify Bob of the reply. Content is html embedded in salmon magic envelope. Bob then creates a feed of the conversation and sends it to all Friendica participants involved in the conversation using dfrn-notify (excluding himself, the conversation is sent to both Jack and Mary). Push hubs are notified that new content is available. The hub or hubs will then retrieve the latest feed and transmit it to all hub subscribers (which may be on different networks).
-
-Scenario #5. Bob posts a private message to Mary and Jack.
-
-Message is delivered immediately to Mary and Jack using dfrn_notify. Public hubs are not notified. Requeueing is attempted in case of timeout. Replies follow the same flow as the public replies except that hubs are not notified and message is never made available in the public feed. The entire conversation is also made available to Mary and Jack (and nobody else) through their dfrn-poll personalised feed.
-
-
-
-
-
-
-
-
-
-
-
diff --git a/doc/Pages.md b/doc/Pages.md
deleted file mode 100644
index d0e6776a4..000000000
--- a/doc/Pages.md
+++ /dev/null
@@ -1,36 +0,0 @@
-Pages
-=====
-
-* [Home](help)
-
-
-Friendica also lets you create forum and/or celebrity pages.
-
-Every page in Friendica has a nickname and these must all be unique. This applies to all pages, whether they are normal profiles or forum pages.
-
-Therefore the first thing you need to do to create a new page is to register a new account for the page. Please note that the site administrator can restrict and/or regulate the registration of new accounts.
-
-If you create a second account on a system and use the same email address or OpenID account as an existing account, you will no longer be able to use the email address (or OpenID) to login to the account. You should login using the account nickname instead.
-
-On the new account, visit the 'Settings' page. Towards the end of the page are "Advanced Page Settings". Typically you would use "Normal Account" for a normal personal account. This is the default selection. Group pages provide the ability for people to become friends/fans of the page without requiring approval.
-
-The exact setting you would use depends on how you wish to interact with people who join the page. The "Soapbox" setting let's the page owner control all communications. Everything you post will go out to the page members, but there will be no opportunity for interaction. This setting would typically be used for announcements or corporate communications.
-
-The most common setting is the "Community Account". This creates a group page where all members can freely interact.
-
-The "Automatic Friend Account" is typically used for personal profile pages where you wish to automatically approve any friendship/connection requests.
-
-**Managing Multiple Pages**
-
-We recommend that you create group pages with the same email address and password as your normal account. If you do this, you will find a new "Manage" tab on the menu bar which lets you toggle identities easily and manage your pages. You are not required to do this, but the alternative is to logout and log back into the other account to manage alternate pages - and this could get cumbersome if you manage several different pages/identities.
-
-You may also appoint a delegate to manage your page. Do this by visiting the [Delegation Setup Page](delegate). This will provide you with a list of contacts on this system under "Potential Delegates". Selecting one or more persons will give them access to manage your page. They will be able to edit contacts, profiles, and all content for this account/page. Please use this facility wisely. Delegated managers will not be able to alter basic account settings such as passwords or page types and/or remove the account.
-
-
-**Posting to Community Pages**
-
-If you are a member of a community page/forum, you may post to the page by including an @-tag in the post mentioning the forum. For example @bicycle would send my post to all members of the group "bicycle" in addition to the normal recipients. If your post is private you must also explicitly include the group in the post permissions (to allow the forum "contact" to see the post) **and** mention it in a tag (which redistributes the post to the forum members).
-
-You may also post to a community page/forum by posting a "wall-to-wall" post using secure cross-site authentication.
-
-Comments which are relayed to community pages will be relayed back to the original post creator. Mentioning the forum/group with an @-tag in a comment does not relay the message, as distribution is controlled entirely by the original post creator. \ No newline at end of file
diff --git a/doc/Permissions.md b/doc/Permissions.md
new file mode 100644
index 000000000..25a4ac130
--- /dev/null
+++ b/doc/Permissions.md
@@ -0,0 +1,45 @@
+**Permissions**
+
+Permissions in the Red Matrix are more complete than you may be used to. This allows us to define more fine graded relationships than the black and white "this person is my friend, so they can do everything" or "this person is not my friend, so they can't do anything" permissions you may find elsewhere.
+
+**Default Permissions**
+
+On your settings page, you will find a list of default permissions. These permissions are automatically applied to everybody unless you specify otherwise. The scope of these permissions varies from "Only me" to "Everybody" - though some scopes may not be available for some permissions. For example, you can't allow "anybody on the internet" to send you private messages, because we'd have no way to identify the sender, therefore no way to reply to them.
+
+The scopes of permissions are:
+
+- _Nobody Except Yourself_. This is self explanatory. Only you will be allowed to use this permission.
+- _Only those you specifically allow_. By default, people you are not connected to, and all new contacts will have this permission denied. You will be able to make exceptions for individual channels on their contact edit screen.
+- _Anybody in your address book_. Anybody you do not know will have this permission denied, but anybody you accept as a contact will have this permission approved. This is the way most legacy platforms handle permissions.
+- _Anybody On This Website_. Anybody using the same website as you will have permission approved. Anybody who registered at a different site will have this permission denied.
+- _Anybody in this network_. Anybody in the Red Matrix will have this permission approved. Even complete strangers. However, anybody not logged in/authenticated will have this permission denied.
+- _Anybody on the internet_. Completely public. This permission will be approved for anybody at all.
+
+The individual permissions are:
+
+- _Can view my "public" stream and posts_. This permision determines who can view your channel "stream" that is, the non-private posts that appear on the "home" tab when you're logged in.
+- _Can view my "public" channel profile_. This permission determines who can view your channel's profile. This refers to the "about" tab
+- _Can view my "public" photo albums_. This permission determines who can view your photo albums. Individual photographs may still be posted to a more private audience.
+- _Can view my "public" address book_. This permission determines who can view your contacts. These are the connections displayed in the "View connections" section.
+- _Can view my "public" file storage_. This permission determines who can view your public files. This isn't done yet, so this is placeholder text.
+- _Can view my "public" pages_. This permission determines who can view your public web pages. This isn't done yet, so this is placeholder text.
+- _Can send me their channel stream and posts_. This permission determines whose posts you will view. If your channel is a personal channel (ie, you as a person), you would probably want to set this to "anyone in my address book" at a minimum. A forum page would probably want to choose "nobody except myself". Setting this to "Anybody in the network" will show you posts from complete strangers, which is a good form of discovery.
+- _Can post on my channel page ("wall")_. This permission determines who can write to your wall when clicking through to your channel.
+- _Can comment on my posts_. This permission determines who can comment on posts you create. Normally, you would want this to match your "can view my public pages" permission
+- _Can send me private mail messages_. This determines who can send you private messages (zotmail).
+- _Can post photos to my photo albums_. This determines who can post photographs in your albums. This is very useful for forum-like channels where connections may not be connected to each other.
+- _Can forward to all my channel contacts via post tags_. Using @- mentions will reproduce a copy of your post on the profile specified, as though you posted on the channel wall. This determines if people can post to your channel in this way.
+- _Can chat with me (when available)_. This determines who can (start?) a chat with you. This isn't done yet, so is placeholder text.
+- _Can write to my "public" file storage_. This determines who can upload files to your public file storage. This isn't done yet, so this is placeholder text.
+- _Can edit my "public" pages_. This determines who can edit your webpages. This is useful for wikis or sites with multiple editors, but this isn't done yet, so this is placeholder text.
+- _Can administer my channel resources_. This determines who can have full control of your channel. This should normally be set to "nobody except myself".
+
+Plugins/addons may provide special permission settings, so you may be offered additional permission settings beyond what is described here.
+
+If you have set any of these permissions to "only those I specifically allow", you may specify indivudal permissions on the connnection edit screen.
+
+**Affinity**
+
+The connection edit screen offers a slider to select a degree of friendship with the connnection (this tool is enabled through the "Extra Features" tab of your Settings page). Think of this as a measure of how much you like or dislike them. 1 is for people you like, whose posts you want to see all the time. 99 is for people you don't care for, and whose posts you might only wish to look at occasionally. Once you've assigned a value here, you can use the affinity tool on the matrix page to filter content based on this number.
+
+The slider on the matrix page has both a minimum and maximum value. Posts will only be shown from people who fall between this range. Affinity has no relation to permissions, and is only useful in conjunction with the affinity tool feature.
diff --git a/doc/Plugins.md b/doc/Plugins.md
index df6004450..c3eaea348 100644
--- a/doc/Plugins.md
+++ b/doc/Plugins.md
@@ -1,357 +1,260 @@
-**Friendica Addon/Plugin development**
+Creating Plugins/Addons for the Red Matrix
+==========================================
-Please see the sample addon 'randplace' for a working example of using some of these features. The facebook addon provides an example of integrating both "addon" and "module" functionality. Addons work by intercepting event hooks - which must be registered. Modules work by intercepting specific page requests (by URL path).
+So you want to make the Red Matrix do something it doesn't already do. There are lots of ways. But let's learn how to write a plugin or addon.
-Plugin names cannot contain spaces or other punctuation and are used as filenames and function names. You may supply a "friendly" name within the comment block. Each addon must contain both an install and an uninstall function based on the addon/plugin name. For instance "plugin1name_install()". These two functions take no arguments and are usually responsible for registering (and unregistering) event hooks that your plugin will require. The install and uninstall functions will also be called (i.e. re-installed) if the plugin changes after installation - therefore your uninstall should not destroy data and install should consider that data may already exist. Future extensions may provide for "setup" amd "remove".
-Plugins should contain a comment block with the four following parameters:
+In your Red Matrix folder/directory, you will probably see a sub-directory called 'addon'. If you don't have one already, go ahead and create it.
- /*
- * Name: My Great Plugin
- * Description: This is what my plugin does. It's really cool
- * Version: 1.0
- * Author: John Q. Public <john@myfriendicasite.com>
- */
+ mkdir addon
+Then figure out a name for your addon. You probably have at least a vague idea of what you want it to do. For our example I'm going to create a plugin called 'randplace' that provides a somewhat random location for each of your posts. The name of your plugin is used to find the functions we need to access and is part of the function names, so to be safe, use only simple text characters.
+Once you've chosen a name, create a directory beneath 'addon' to hold your working file or files.
+ mkdir addon/randplace
-Register your plugin hooks during installation.
+Now create your plugin file. It needs to have the same name, and it's a PHP script, so using your favourite editor, create the file
- register_hook($hookname, $file, $function);
+ addon/randplace/randplace.php
-$hookname is a string and corresponds to a known Friendica hook.
+The very first line of this file needs to be
-$file is a pathname relative to the top-level Friendica directory. This *should* be 'addon/plugin_name/plugin_name.php' in most cases.
+ <?php
-$function is a string and is the name of the function which will be executed when the hook is called.
+Then we're going to create a comment block to describe the plugin. There's a special format for this. We use /* ... */ comment-style and some tagged lines consisting of
+ /**
+ *
+ * Name: Random Place (here you can use better descriptions than you could in the filename)
+ * Description: Sample Red Matrix plugin, Sets a random place when posting.
+ * Version: 1.0
+ * Author: Mike Macgirvin <mike@zothub.com>
+ *
+ */
-Your hook callback functions will be called with at least one and possibly two arguments
+These tags will be seen by the site administrator when he/she installs or manages plugins from the admin panel. There can be more than one author. Just add another line starting with 'Author:'.
+The typical plugin will have at least the following functions:
- function myhook_function(&$a, &$b) {
+* pluginname_load()
+* pluginname_unload()
+In our case, we'll call them randplace_load() and randplace_unload(), as that is the name of our plugin. These functions are called whenever we wish to either initialise the plugin or remove it from the current webpage. Also if your plugin requires things like altering the database schema before it can run for the very first time, you would likely place these instructions in the functions named
- }
+* pluginname_install()
+* pluginname_uninstall()
-If you wish to make changes to the calling data, you must declare them as
-reference variables (with '&') during function declaration.
+Next we'll talk about **hooks**. Hooks are places in the Red Matrix code where we allow plugins to do stuff. There are a [lot of these](help/Hooks), and they each have a name. What we normally do is use the pluginname_load() function to register a "handler function" for any hooks you are interested in. Then when any of these hooks are triggered, your code will be called.
-$a is the Friendica 'App' class - which contains a wealth of information
-about the current state of Friendica, such as which module has been called,
-configuration info, the page contents at the point the hook was invoked, profile
-and user information, etc. It is recommeded you call this '$a' to match its usage
-elsewhere.
+We register hook handlers with the 'register_hook()' function. It takes 3 arguments. The first is the hook we wish to catch, the second is the filename of the file to find our handler function (relative to the base of your Red Matrix installation), and the third is the function name of your handler function. So let's create our randplace_load() function right now.
-$b can be called anything you like. This is information which is specific to the hook
-currently being processed, and generally contains information that is being immediately
-processed or acted on that you can use, display, or alter. Remember to declare it with
-'&' if you wish to alter it.
-**Modules**
+ function randplace_load() {
+ register_hook('post_local', 'addon/randplace/randplace.php', 'randplace_post_hook');
-Plugins/addons may also act as "modules" and intercept all page requests for a given URL path. In order for a plugin to act as a module it needs to define a function "plugin_name_module()" which takes no arguments and need not do anything.
+ register_hook('feature_settings', 'addon/randplace/randplace.php', 'randplace_settings');
+ register_hook('feature_settings_post', 'addon/randplace/randplace.php', 'randplace_settings_post');
-If this function exists, you will now receive all page requests for "http://my.web.site/plugin_name" - with any number of URL components as additional arguments. These are parsed into an array $a->argv, with a corresponding $a->argc indicating the number of URL components. So http://my.web.site/plugin/arg1/arg2 would look for a module named "plugin" and pass its module functions the $a App structure (which is available to many components). This will include:
- $a->argc = 3
- $a->argv = array(0 => 'plugin', 1 => 'arg1', 2 => 'arg2');
+ }
-Your module functions will often contain the function plugin_name_content(&$a), which defines and returns the page body content. They may also contain plugin_name_post(&$a) which is called before the _content function and typically handles the results of POST forms. You may also have plugin_name_init(&$a) which is called very early on and often does module initialisation.
+So we're going to catch three events, 'post_local' which is triggered when a post is made on the local system, 'feature_settings' to set some preferences for our plugin, and 'feature_settings_post' to store those settings.
+Next we'll create an unload function. This is easy, as it just unregisters our hooks. It takes exactly the same arguments.
-**Current hooks:**
+ function randplace_unload() {
+ unregister_hook('post_local', 'addon/randplace/randplace.php', 'randplace_post_hook');
-**'authenticate'** - called when a user attempts to login.
- $b is an array
- 'username' => the supplied username
- 'password' => the supplied password
- 'authenticated' => set this to non-zero to authenticate the user.
- 'user_record' => successful authentication must also return a valid user record from the database
+ unregister_hook('feature_settings', 'addon/randplace/randplace.php', 'randplace_settings');
+ unregister_hook('feature_settings_post', 'addon/randplace/randplace.php', 'randplace_settings_post');
-**'logged_in'** - called after a user has successfully logged in.
- $b contains the $a->user array
+ }
-**'display_item'** - called when formatting a post for display.
- $b is an array
- 'item' => The item (array) details pulled from the database
- 'output' => the (string) HTML representation of this item prior to adding it to the page
+Hooks are called with two arguments. The first is always $a, which is our global App structure and contains a huge amount of information about the state of the web request we are processing; as well as who the viewer is, and what our login state is, and the current contents of the web page we're probably constructing.
-**'post_local'** - called when a status post or comment is entered on the local system
- $b is the item array of the information to be stored in the database
- {Please note: body contents are bbcode - not HTML)
+The second argument is specific to the hook you're calling. It contains information relevant to that particular place in the program, and often allows you to look at, and even change it. In order to change it, you need to add '&' to the variable name so it is passed to your function by reference. Otherwise it will create a copy and any changes you make will be lost when the hook process returns. Usually (but not always) the second argument is a named array of data structures. Please see the "hook reference" (not yet written as of this date) for details on any specific hook. Occasionally you may need to view the program source to see precisely how a given hook is called and how the results are processed.
-**'post_local_end'** - called when a local status post or comment has been stored on the local system
- $b is the item array of the information which has just been stored in the database
- {Please note: body contents are bbcode - not HTML)
+Let's go ahead and add some code to implement our post_local hook handler.
-**'post_remote'** - called when receiving a post from another source. This may also be used to post local activity or system generated messages.
- $b is the item array of information to be stored in the database and the item
- body is bbcode.
+ function randplace_post_hook($a, &$item) {
-**'settings_form'** - called when generating the HTML for the user Settings page
- $b is the (string) HTML of the settings page before the final '</form>' tag.
+ /**
+ *
+ * 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
+ *
+ */
-**'settings_post'** - called when the Settings pages are submitted.
- $b is the $_POST array
+ logger('randplace invoked');
-**'plugin_settings'** - called when generating the HTML for the addon settings page
- $b is the (string) HTML of the addon settings page before the final '</form>' tag.
+ if(! local_user()) /* non-zero if this is a logged in user of this system */
+ return;
-**'plugin_settings_post'** - called when the Addon Settings pages are submitted.
- $b is the $_POST array
+ if(local_user() != $item['uid']) /* Does this person own the post? */
+ return;
-**'profile_post'** - called when posting a profile page.
- $b is the $_POST array
+ if(($item['parent']) || ($item['item_restrict'])) {
+ /* If the item has a parent, or item_restrict is non-zero, this is a comment or something else, not a status post. */
+ return;
+ }
-**'profile_edit'** - called prior to output of profile edit page
- $b is array
- 'profile' => profile (array) record from the database
- 'entry' => the (string) HTML of the generated entry
+ /* Retrieve our personal config setting */
+ $active = get_pconfig(local_user(), 'randplace', 'enable');
-**'profile_advanced'** - called when the HTML is generated for the 'Advanced profile', corresponding to the 'Profile' tab within a person's profile page.
- $b is the (string) HTML representation of the generated profile
- (The profile array details are in $a->profile)
+ if(! $active)
+ return;
+ /**
+ *
+ * OK, we're allowed to do our stuff.
+ * Here's what we are going to do:
+ * load the list of timezone names, and use that to generate a list of world cities.
+ * Then we'll pick one of those at random and put it in the "location" field for the post.
+ *
+ */
-**'directory_item'** - called from the Directory page when formatting an item for display
- $b is an array
- 'contact' => contact (array) record for the person from the database
- 'entry' => the (string) HTML of the generated entry
+ $cities = array();
+ $zones = timezone_identifiers_list();
+ foreach($zones as $zone) {
+ if((strpos($zone,'/')) && (! stristr($zone,'US/')) && (! stristr($zone,'Etc/')))
+ $cities[] = str_replace('_', ' ',substr($zone,strpos($zone,'/') + 1));
+ }
-**'profile_sidebar_enter'** - called prior to generating the sidebar "short" profile for a page
- $b is (array) the person's profile array
+ if(! count($cities))
+ return;
+ $city = array_rand($cities,1);
+ $item['location'] = $cities[$city];
-**'profile_sidebar'** - called when generating the sidebar "short" profile for a page
- $b is an array
- 'profile' => profile (array) record for the person from the database
- 'entry' => the (string) HTML of the generated entry
+ return;
+ }
-**'contact_block_end'** - called when formatting the block of contacts/friends on a profile sidebar has completed
- $b is an array
- 'contacts' => array of contacts
- 'output' => the (string) generated HTML of the contact block
-**'bbcode'** - called during conversion of bbcode to html
- $b is (string) converted text
+Now let's add our functions to create and store preference settings.
-**'html2bbcode'** - called during conversion of html to bbcode (e.g. remote message posting)
- $b is (string) converted text
+ /**
+ *
+ * Callback from the settings post function.
+ * $post contains the global $_POST array.
+ * We will make sure we've got a valid user account
+ * and that only our own submit button was clicked
+ * and if so set our configuration setting for this person.
+ *
+ */
-**'page_header'** - called after building the page navigation section
- $b is (string) HTML of nav region
+ function randplace_settings_post($a,$post) {
+ if(! local_user())
+ return;
+ if($_POST['randplace-submit'])
+ set_pconfig(local_user(),'randplace','enable',intval($_POST['randplace']));
+ }
-**'personal_xrd'** - called prior to output of personal XRD file.
- $b is an array
- 'user' => the user record for the person
- 'xml' => the complete XML to be output
-**'home_content'** - called prior to output home page content, shown to unlogged users
- $b is (string) HTML of section region
-**'contact_edit'** - called when editing contact details on an individual from the Contacts page
- $b is (array)
- 'contact' => contact record (array) of target contact
- 'output' => the (string) generated HTML of the contact edit page
+ /**
+ *
+ * Called from the Feature Setting form.
+ * The second argument is a string in this case, the HTML content region of the page.
+ * Add our own settings info to the string.
+ *
+ * For uniformity of settings pages, we use the following convention
+ * <div class="settings-block">
+ * <h3>title</h3>
+ * .... settings html - many elements will be floated...
+ * <div class="clear"></div> <!-- generic class which clears all floats -->
+ * <input type="submit" name="pluginnname-submit" class="settings-submit" ..... />
+ * </div>
+ */
-**'contact_edit_post'** - called when posting the contact edit page
- $b is the $_POST array
-**'init_1'** - called just after DB has been opened and before session start
- $b is not used or passed
-**'page_end'** - called after HTML content functions have completed
- $b is (string) HTML of content div
+ function randplace_settings(&$a,&$s) {
-**'avatar_lookup'** - called when looking up the avatar
- $b is (array)
- 'size' => the size of the avatar that will be looked up
- 'email' => email to look up the avatar for
- 'url' => the (string) generated URL of the avatar
+ if(! local_user())
+ return;
+ /* Add our stylesheet to the page so we can make our settings look nice */
-A complete list of all hook callbacks with file locations (generated 14-Feb-2012): Please see the source for details of any hooks not documented above.
+ head_add_css(/addon/randplace/randplace.css');
+ /* Get the current state of our config variable */
-boot.php: call_hooks('login_hook',$o);
+ $enabled = get_pconfig(local_user(),'randplace','enable');
-boot.php: call_hooks('profile_sidebar_enter', $profile);
+ $checked = (($enabled) ? ' checked="checked" ' : '');
-boot.php: call_hooks('profile_sidebar', $arr);
+ /* Add some HTML to the existing form */
-boot.php: call_hooks("proc_run", $arr);
+ $s .= '<div class="settings-block">';
+ $s .= '<h3>' . 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 .= '<input id="randplace-checkbox" type="checkbox" name="randplace" value="1" ' . $checked . '/>';
+ $s .= '</div><div class="clear"></div>';
-include/contact_selectors.php: call_hooks('network_to_name', $nets);
+ /* provide a submit button */
-include/api.php: call_hooks('logged_in', $a->user);
+ $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="randplace-submit" class="settings-submit" value="' . t('Submit') . '" /></div></div>';
-include/api.php: call_hooks('logged_in', $a->user);
+ }
-include/queue.php: call_hooks('queue_predeliver', $a, $r);
-include/queue.php: call_hooks('queue_deliver', $a, $params);
+
-include/text.php: call_hooks('contact_block_end', $arr);
-include/text.php: call_hooks('smilie', $s);
+***Advanced Plugins***
-include/text.php: call_hooks('prepare_body_init', $item);
+Sometimes your plugins want to provide a range of new functionality which isn't provided at all or is clumsy to provide using hooks. In this case your plugin can also act as a 'module'. A module in our case refers to a structured webpage handler which responds to a given URL. Then anything which accesses that URL will be handled completely by your plugin.
-include/text.php: call_hooks('prepare_body', $prep_arr);
+The key to this is to create a simple function named pluginname_module() which does nothing.
-include/text.php: call_hooks('prepare_body_final', $prep_arr);
+ function randplace_module() { return; }
-include/nav.php: call_hooks('page_header', $a->page['nav']);
+Once this function exists, the URL https://yoursite/randplace will access your plugin as a module. Then you can define functions which are called at various points to build a webpage just like the modules in the mod/ directory. The typical functions and the order which they are called is
-include/auth.php: call_hooks('authenticate', $addon_auth);
+ modulename_init($a) // (e.g. randplace_init($a);) called first - if you wish to emit json or xml,
+ // you should do it here, followed by killme() which will avoid the default action of building a webpage
+ modulename_aside($a) // Often used to create sidebar content
+ modulename_post($a) // Called whenever the page is accessed via the "post" method
+ modulename_content($a) // called to generate the central page content. This function should return a string
+ // consisting of the central page content.
-include/bbcode.php: call_hooks('bbcode',$Text);
+Your module functions have access to the URL path as if they were standalone programs in the Unix operating system. For instance if you visit the page
+
+ https://yoursite/randplace/something/somewhere/whatever
-include/oauth.php: call_hooks('logged_in', $a->user);
+we will create an argc/argv list for use by your module functions
-include/acl_selectors.php: call_hooks($a->module . '_pre_' . $selname, $arr);
+ $x = argc(); $x will be 4, the number of path arguments after the sitename
-include/acl_selectors.php: call_hooks($a->module . '_post_' . $selname, $o);
+ for($x = 0; $x < argc(); $x ++)
+ echo $x . ' ' . argv($x);
-include/acl_selectors.php: call_hooks('contact_select_options', $x);
-include/acl_selectors.php: call_hooks($a->module . '_pre_' . $selname, $arr);
+ 0 randplace
+ 1 something
+ 2 somewhere
+ 3 whatever
-include/acl_selectors.php: call_hooks($a->module . '_post_' . $selname, $o);
-include/acl_selectors.php: call_hooks($a->module . '_pre_' . $selname, $arr);
+***Porting Friendica Plugins***
-include/acl_selectors.php: call_hooks($a->module . '_post_' . $selname, $o);
+The Red Matrix uses a similar plugin architecture to the Friendica project. The authentication, identity, and permissions systems are completely different. Many Friendica can be ported reasonably easily by renaming a few functions - and then ensuring that the permissions model is adhered to. The functions which need to be renamed are:
-include/notifier.php: call_hooks('notifier_normal',$target_item);
+* Friendica's pluginname_install() is pluginname_load()
-include/notifier.php: call_hooks('notifier_end',$target_item);
+* Friendica's pluginname_uninstall() is pluginname_unload()
-include/items.php: call_hooks('atom_feed', $atom);
+The Red Matrix has _install and _uninstall functions but these are used differently.
-include/items.php: call_hooks('atom_feed_end', $atom);
+* Friendica's "plugin_settings" hook is called "feature_settings"
-include/items.php: call_hooks('atom_feed_end', $atom);
+* Friendica's "plugin_settings_post" hook is called "feature_settings_post"
-include/items.php: call_hooks('parse_atom', $arr);
-
-include/items.php: call_hooks('post_remote',$arr);
-
-include/items.php: call_hooks('atom_author', $o);
-
-include/items.php: call_hooks('atom_entry', $o);
-
-include/bb2diaspora.php: call_hooks('bb2diaspora',$Text);
-
-include/cronhooks.php: call_hooks('cron', $d);
-
-include/security.php: call_hooks('logged_in', $a->user);
-
-include/html2bbcode.php: call_hooks('html2bbcode', $text);
-
-include/Contact.php: call_hooks('remove_user',$r[0]);
-
-include/Contact.php: call_hooks('contact_photo_menu', $args);
-
-include/conversation.php: call_hooks('conversation_start',$cb);
-
-include/conversation.php: call_hooks('render_location',$locate);
-
-include/conversation.php: call_hooks('display_item', $arr);
-
-include/conversation.php: call_hooks('render_location',$locate);
-
-include/conversation.php: call_hooks('display_item', $arr);
-
-include/conversation.php: call_hooks('item_photo_menu', $args);
-
-include/conversation.php: call_hooks('jot_tool', $jotplugins);
-
-include/conversation.php: call_hooks('jot_networks', $jotnets);
-
-include/plugin.php:if(! function_exists('call_hooks')) {
-
-include/plugin.php:function call_hooks($name, &$data = null) {
-
-index.php: call_hooks('init_1');
-
-index.php:call_hooks('app_menu', $arr);
-
-index.php:call_hooks('page_end', $a->page['content']);
-
-mod/photos.php: call_hooks('photo_post_init', $_POST);
-
-mod/photos.php: call_hooks('photo_post_file',$ret);
-
-mod/photos.php: call_hooks('photo_post_end',$foo);
-
-mod/photos.php: call_hooks('photo_post_end',$foo);
-
-mod/photos.php: call_hooks('photo_post_end',$foo);
-
-mod/photos.php: call_hooks('photo_post_end',intval($item_id));
-
-mod/photos.php: call_hooks('photo_upload_form',$ret);
-
-mod/friendica.php: call_hooks('about_hook', $o);
-
-mod/editpost.php: call_hooks('jot_tool', $jotplugins);
-
-mod/editpost.php: call_hooks('jot_networks', $jotnets);
-
-mod/parse_url.php: call_hooks('parse_link', $arr);
-
-mod/home.php: call_hooks('home_init',$ret);
-
-mod/home.php: call_hooks("home_content",$o);
-
-mod/contacts.php: call_hooks('contact_edit_post', $_POST);
-
-mod/contacts.php: call_hooks('contact_edit', $arr);
-
-mod/settings.php: call_hooks('plugin_settings_post', $_POST);
-
-mod/settings.php: call_hooks('connector_settings_post', $_POST);
-
-mod/settings.php: call_hooks('settings_post', $_POST);
-
-mod/settings.php: call_hooks('plugin_settings', $settings_addons);
-
-mod/settings.php: call_hooks('connector_settings', $settings_connectors);
-
-mod/settings.php: call_hooks('settings_form',$o);
-
-mod/register.php: call_hooks('register_account', $newuid);
-
-mod/like.php: call_hooks('post_local_end', $arr);
-
-mod/xrd.php: call_hooks('personal_xrd', $arr);
-
-mod/item.php: call_hooks('post_local_start', $_REQUEST);
-
-mod/item.php: call_hooks('post_local',$datarray);
-
-mod/item.php: call_hooks('post_local_end', $datarray);
-
-mod/profile.php: call_hooks('profile_advanced',$o);
-
-mod/profiles.php: call_hooks('profile_post', $_POST);
-
-mod/profiles.php: call_hooks('profile_edit', $arr);
-
-mod/tagger.php: call_hooks('post_local_end', $arr);
-
-mod/cb.php: call_hooks('cb_init');
-
-mod/cb.php: call_hooks('cb_post', $_POST);
-
-mod/cb.php: call_hooks('cb_afterpost');
-
-mod/cb.php: call_hooks('cb_content', $o);
-
-mod/directory.php: call_hooks('directory_item', $arr);
+Changing these will often allow your plugin to function, but please double check all your permission and identity code because the concepts behind it are completely different in the Red Matrix. Many structured data names (especially DB schema columns) are also quite different.
diff --git a/doc/Profiles.md b/doc/Profiles.md
index 716db908e..249ea4f29 100644
--- a/doc/Profiles.md
+++ b/doc/Profiles.md
@@ -3,7 +3,7 @@ Profiles
* [Home](help)
-Friendica has unlimited profiles. You may use different profiles to show different "sides of yourself" to different audiences.
+Red has unlimited profiles. You may use different profiles to show different "sides of yourself" to different audiences. This is different to having different _channels_. Different channels allow for completely sets of information. You may have a channel for yourself, a channel for your sports team, a channel for your website, or whatever else. A profile allows for finely graded "sides" of each channel. For example, your default public profile might say "Hello, I'm Fred, and I like laughing". You may show your close friends a profile that adds "and I also enjoy dwarf tossing".
You always have a profile known as your "default" or "public" profile. This profile is always available to the general public and cannot be hidden (there may be rare exceptions on privately run or disconnected sites). You may, and probably should restrict the information you make available on your public profile.
@@ -17,21 +17,18 @@ Without this basic information, you could get very lonely here. Most people (eve
In addition, if you'd like to meet people that share some general interests with you, please take a moment and add some "Public Keywords" to your profile. Such as "music, linux, photography" or whatever. You can add as many keywords as you like.
-
Your default or public profile is also shown to contacts on other networks, since they do not have the ability to view your private profiles. Only members of the Friendica network can see alternate/private profiles.
To create an alternate profile, select "Profiles" from the menu of your Friendica site. You may edit an existing profile, change the profile photo, or create a new profile. You may also create a "clone" of an existing profile if you only wish to change a few items but don't wish to enter all the information again.
-To assign a profile to specific persons, select the person from your "Contacts" page and click the pencil "Edit" icon. You will find a dropdown box listing the various profiles available. If this box is not selectable, the person is not in a supported network and cannot be assigned a specific profile.
-
-Once a profile has been selected, when the person views your profile from one of the "magic profile links" on their site, they will see the private profile you have assigned. If they are not logged into their site or view your profile from elsewhere, they will see your public profile.
+To assign a profile to specific persons, select the person from your "Connections" page and click the pencil "Edit" icon. You will find a dropdown box listing the various profiles available. If this box is not selectable, the person is not in a supported network and cannot be assigned a specific profile.
-A magic profile link is indicated by a special cursor when hovering over a contact's name or photo. Currently this cursor is a hand next to a small padlock. These magic cursors indicate that by following the link, you are able to access special areas of the other person's pages which are only available to friends and may not be available to the general public.
+Once a profile has been selected, when the person views your profile, they will see the private profile you have assigned. If they are not authenticated, they will see your public profile.
-You may also discover that (assuming you have the proper permissions) you may be able to post directly on the other person's profile (often called a "wall-to-wall" post). You may also be able to comment directly on posts from while visiting the other person's profile page.
+You may also discover that (assuming you have the proper permissions) you may be able to post directly on the other person's channel (often called a "wall-to-wall" post). You may also be able to comment directly on posts from while visiting the other person's profile page.
-There are two settings which allow you to publish your profile to a directory and ensure that it can be found by others. You can change these through settings on the "Settings" page. One setting allows you to publish your profile in the site directory of this Friendica server. Another option (this may have been disabled by the site creator) allows you to publish your profile in the "Global Directory". This is a mega directory which contains people from many other Friendica installations world-wide.
+There is a setting which allow you to publish your profile to a directory and ensure that it can be found by others. You can change this setting on the "Settings" page.
If you do not wish to be visible to any of these sites, you may leave your profile unpublished.
@@ -41,11 +38,11 @@ Although you may have multiple profiles, you only have one profile photo. This i
**Keywords and Directory Search**
-On the site Directory page, you may search for people with published profiles who are on this site. The search is typically for your nickname or part of your full name. However this search will also match against other profile fields - such as gender, location, "about", work, and education. You may also include "Keywords" in your default profile - which may be used to search for common interests with other members. You have two sets of keywords available - public and private. Private keywords are *not* visible to anybody. You could use these keywords to locate people who share membership in secret societies, or that share a love of fishing (for example) - without making this information visible on your public profile. Public keywords are used in the friend suggestion tool and although they aren't readily visible, they may be seen by viewing the HTML of your profile page.
+On the site Directory page, you may search for people with published profiles. The search is typically for your nickname or part of your full name. However this search will also match against other profile fields - such as gender, location, "about", work, and education. You may also include "Keywords" in your default profile - which may be used to search for common interests with other members. You have two sets of keywords available - public and private. Private keywords are *not* visible to anybody. You could use these keywords to locate people who share membership in secret societies, or that share a love of fishing (for example) - without making this information visible on your public profile. Public keywords are used in the friend suggestion tool and although they aren't readily visible, they may be seen by viewing the HTML of your profile page.
Directory searches are also able to use "boolean" logic so that you can search for "+lesbian +Florida" and find those who's sexual preference (or keywords) contain the world "lesbian" and that live in Florida. See the section on "Topical Tags" on the [Tags-and-Mentions](help/Tags-and-Mentions) page for more information on performing boolean searches.
-On your Contacts page is a link to "Find People with Shared Interests" (unless your site administrator has disabled the global directory). This will combine both your public and private keywords, and find people in the global directory who have matching and/or similar keywords. (Your private keywords are not identified or stored on the global directory). The more keywords you provide, the more relevant the search results that are returned. These are sorted by relevance. You may discover that you are the first person on the list - because you are very likely the most relevant match for your keywords in the directory.
+On your Contacts page is a link to "Find People with Shared Interests". This will combine both your public and private keywords, and find people who have matching and/or similar keywords. The more keywords you provide, the more relevant the search results that are returned. These are sorted by relevance. You may discover that you are the first person on the list - because you are very likely the most relevant match for your keywords in the directory.
\ No newline at end of file
diff --git a/doc/README.md b/doc/README.md
new file mode 100644
index 000000000..3fbfedae7
--- /dev/null
+++ b/doc/README.md
@@ -0,0 +1,38 @@
+The Red Matrix
+==============
+
+***"Connected Websites"***
+
+The modern web is "missing" a few important pieces which would make it much more useful. Many corporations have stepped in with products to supply these missing pieces, but with a loss of freedom and privacy and increased **centralisation**.
+
+Centralisation is generally considered a bad thing in network design as the loss of one critical node or centralised service could seriously impact the entire network - possibly taking a long time to recover. Recognising this, the original web was based on decentralised services. Over the years, this fundamental design strength has been largely overlooked, as people congregate into centralised services which provide the missing pieces.
+
+These missing pieces are (in no particular order):
+
+- Secure and private "spam free" communications
+
+- Identity and "single-signon" across the entire network
+
+- Privacy controls and permissions which extend to the entire network
+
+- Directory services (like a phone book)
+
+
+
+The Red Matrix (sometimes referred to as just "Red") is a collection of web servers and services which provides these missing pieces, but within a decentralised identity and messaging framework (known as "Zot"). Red operates as an independent network within the larger internet where all the nodes or servers (we call them "hubs") are able to fully interact with each other in ways that are simply not possible using other services. Additionally the owners of each network hub have the ability to set their own rules with regard to communications privacy and data ownership, because each operates with complete independence. These hubs require only slightly more resources than a blog or content management system, and the software is being designed with the ability to natively incorporate both kinds of functionality, as well as cloud storage.
+
+![The Red Matrix model](images/red_antiprism.png)
+
+
+Whilst other decentralised communications networks exist, an additional weakness we've found in the implementation of these systems is the binding of network identity with the physical server where it resides; for example if you are "eric@example.website", your identity is often tied permanently to "example.website". We see this as a problem. Many hubs on the Indie Web are run by enthusiasts with varying skill levels and financial resources - and the technology is changing quite rapidly. Often the cost or workload involved in maintaining these services becomes a burden (or hardware fails) and people or entire social communities are left stranded when their server goes offline. Their identity no longer exists. They may have to "start over" building their social circle from scratch when this happens. In some cases communities are unable to recover from this kind of disruption and the entire community dissolves.
+
+We've been working on decentralisation for several years and have seen this happen time and time again.
+Within the Red Matrix, identity is nomadic. It defines you and it belongs to you - and is not locked to a particular network address. You can take your identity, and all your friends and associates with you - to any other hub in the network, at any time. If your hub goes offline for any reason, you have the ability to relocate to any other hub and carry on as if nothing happened. You still have all your friends and associations.
+
+
+The Red Matrix is free and open source distributed under the MIT license.
+
+
+Currently the project is in "Developer Preview". A lot of work remains, but many important bits are functioning. Please connect with one of the developer channels ("Channel One" would be a good choice) if you are interested in helping us out.
+
+[Please help us change the world by providing a small donation.](http://pledgie.com/campaigns/18417) (Large donations are also graciously accepted). \ No newline at end of file
diff --git a/doc/Remove-Account.md b/doc/Remove-Account.md
index ae5de2cb6..bc1301b16 100644
--- a/doc/Remove-Account.md
+++ b/doc/Remove-Account.md
@@ -1,24 +1,23 @@
Remove Account
==============
-* [Home](help)
+It is presently not possible to remove an account without asking your site administrator for assistance.
+We'll have better doco when somebody finishes that bit.
-We don't like to see people leave Friendica, but if you need to remove your account, you should visit the URL
-http://sitename/removeme
-
-with your web browser. You will need to be logged in at the time.
+Remove Channel
+==============
-You will be asked for your password to confirm the request. If this matches your stored password, your account will immediately be removed. Unlike some social networks we do **not** hold onto it for a grace period in case you change your mind. Your user details, your conversations, your photos, your friends - everything; will be removed immediately and you will be logged out.
+Visit the URL
-When we expire posts we send notifications out to Friendica to remove the posts. Diaspora doesn't have a bulk delete so this step is skipped on that network - and hopefully it will be obvious that deletion doesn't work on any other networks. If you manually delete a post or a range of posts we send individual delete notifications to Friendica and Diaspora for each deleted post.
+ https://yoursite/removeme
-Diaspora often loses these.
+(replace 'yoursite' with the domain name of your Red Matrix site).
+You will need to confirm your password and the channel you are currently logged into will be removed.
-If you delete a post but somebody else has starred it, it is still removed. Your wishes take priority.
+This is irreversible.
-When you remove your account we physically remove all your posts and your profile and user data, etc. immediately.
+If you have identity clones on other sites this only removes the channel instance which exists
+on this site.
-In order to send out a bulk remove we would need to keep your account around to do this, as we would need to prove to your friends who it is that is submitting the request. We can't do this if you don't have an account.
-Your friends may still see your posts if your account is gone, but there is no public place within Friendica where they can be viewed. If you had friends on Diaspora, your public posts may stick around and be visible to others from that network.
diff --git a/doc/Schema-development.md b/doc/Schema-development.md
new file mode 100644
index 000000000..481792fcc
--- /dev/null
+++ b/doc/Schema-development.md
@@ -0,0 +1,76 @@
+Red development - a guide to the schema system
+==============================================
+
+
+A schema, in a nutshell, is a collection of settings for a bunch of variables to define
+certain elements of a theme. A schema is loaded as though it were part of config.php
+and has access to all the same information. Importantly, this means it is identity aware,
+and can be used to do some interesting things. One could, for example, restrict options
+by service class, or present different options to different members.
+
+By default, we filter only by whether or not expert mode is enabled. If expert mode is
+enabled, all options are presented to the member. If it is not, only scheme, background
+image, font face, and iconset are available as choices.
+
+A schema is loaded *after* the member's personal settings. Therefore, to allow a member
+to overwrite a particular aspect of a schema you would use the following syntax:
+
+ if (! $foo)
+ $foo = 'bar';
+
+However, there are circumstances - particularly with positional elements - where it
+may be desirable (or necessary) to override a member's settings. In this case, the syntax
+is even simpler:
+
+ $foo = 'bar';
+
+Members will not thank you for this, however, so only use it when it is required.
+
+If no personal options are set, and no schema is selected, we will first try to load a schema
+with the file name "default.php". This file should never be included with a theme. If it
+is, merge conflicts will occur as people update their code. Rather, this should be defined
+by administrators on a site by site basis.
+
+You schema does not need to - and should not - contain all of these values. Only the values
+that differ from the defaults should be listed. This gives you some very powerful options
+with very few lines of code.
+
+Note the options available differ with each theme. The options available with the Redbasic
+theme are as follows:
+
+* nav_colour
+ The colour of the navigation bar. Options are red, black and silver. Alternatively,
+ one can set $nav_bg_1, $nav_bg_2, $nav_bg_3 and $nav_bg_4 to provide gradient and
+ hover effects.
+* banner_colour
+ The font colour of the banner element. Accepts an RGB or Hex value.
+* bgcolour
+ Set the body background colour. Accepts an RGB or Hex value.
+* background_image
+ Sets a background image. Accepts a URL or path.
+* item_colour
+ Set the background colour of items. Accepts an RGB or Hex value.
+* item_opacity
+ Set the opacity of items. Accepts a value from 0.01 to 1
+* toolicon_colour
+ Set the colour of tool icons. Accepts an RGB or Hex value.
+* toolicon_activecolour
+ Set the colour of active or hovered icon tools.
+* font_size
+ Set the size of fonts in items and posts. Accepts px or em.
+* body_font_size
+ Sets the size of fonts at the body level. Accepts px or em.
+* font_colour
+ Sets the font colour. Accepts an RGB or Hex value.
+* radius
+ Set the radius of corners. Accepts a numeral, and is always in px.
+* shadow
+ Set the size of shadows shown with inline images. Accepts a numerical
+ value. Note shadows are not applied to smileys.
+* converse_width
+ Set the maximum width of conversations. Accepts px, or %.
+* nav_min_opacity
+* top_photo
+* reply_photo
+* sloppy_photos
+ Determins whether photos are "sloppy" or aligned. Set or unset (1 or '')
diff --git a/doc/Settings.md b/doc/Settings.md
deleted file mode 100644
index 574ce8dcc..000000000
--- a/doc/Settings.md
+++ /dev/null
@@ -1,227 +0,0 @@
-Here are some of the built-in features which don't have an exposed interface or are otherwise undocumented. Configuration settings are stored in the file ".htconfig.php". Edit this file with a text editor to make the desired changes. Several system settings are already documented in that file and will not be covered here.
-
-**Hot Keys**
-
-Friendica traps the following keyboard events:
-
-* [Pause] - Pauses "Ajax" update activity. This is the process that provides updates without reloading the page. You may wish to pause it to reduce network usage and/or as a debugging aid for javascript developers. A pause indicator will appear at the lower right hand corner of the page. Hit the [pause] key once again to resume.
-
-* [F8] - Displays a language selector
-
-
-**Birthday Notifications**
-
-Birthday events are published on your Home page for any friends having a birthday in the coming 6 days. In order for your birthday to be discoverable by all of your friends, you must set your birthday (at least the month and day) in your default profile. You are not required to provide the year.
-
-**Configuration settings**
-
-
-**Language**
-
-System Setting
-
-Please see util/README for information on creating language translations.
-
-Config:
-```
-$a->config['system']['language'] = 'name';
-```
-
-
-**System Theme**
-
-System Setting
-
-Choose a named theme to be the default system theme (which may be over-ridden by user profiles). Default theme is "default".
-
-Config:
-```
-$a->config['system']['theme'] = 'theme-name';
-```
-
-
-**Verify SSL Certitificates**
-
-Security setting
-
-By default Friendica allows SSL communication between websites that have "self-signed" SSL certificates. For the widest compatibility with browsers and other networks we do not recommend using self-signed certificates, but we will not prevent you from using them. SSL encrypts all the data transmitted between sites (and to your browser) and this allows you to have completely encrypted communications, and also protect your login session from hijacking. Self-signed certificates can be generated for free, without paying top-dollar for a website SSL certificate - however these aren't looked upon favourably in the security community because they can be subject to so-called "man-in-the-middle" attacks. If you wish, you can turn on strict certificate checking. This will mean you cannot connect (at all) to self-signed SSL sites.
-
-Config:
-```
-$a->config['system']['verifyssl'] = true;
-```
-
-
-**Allowed Friend Domains**
-
-Corporate/Edu enhancement
-
-Comma separated list of domains which are allowed to establish friendships with this site. Wildcards are accepted. (Wildcard support on Windows platforms requires PHP5.3). By default, any (valid) domain may establish friendships with this site.
-
-Config:
-```
-$a->config['system']['allowed_sites'] = "sitea.com, *siteb.com";
-```
-
-
-**Allowed Email Domains**
-
-Corporate/Edu enhancement
-
-Comma separated list of domains which are allowed in email addresses for registrations to this site. This can lockout those who are not part of this organisation from registering here. Wildcards are accepted. (Wildcard support on Windows platforms requires PHP5.3). By default, any (valid) email address is allowed in registrations.
-
-Config:
-```
-$a->config['system']['allowed_email'] = "sitea.com, *siteb.com";
-```
-
-**Block Public**
-
-Corporate/Edu enhancement
-
-Set to true to block public access to all otherwise public personal pages on this site unless you are currently logged in. This blocks the viewing of profiles, friends, photos, the site directory and search pages to unauthorised persons. A side effect is that entries from this site will not appear in the global directory. We recommend specifically disabling that also (setting is described elsewhere on this page). Note: this is specifically for sites that desire to be "standalone" and do not wish to be connected to any other Friendica sites. Unauthorised persons will also not be able to request friendship with site members. Default is false. Available in version 2.2 or greater.
-
-Config:
-```
-$a->config['system']['block_public'] = true;
-```
-
-
-**Force Publish**
-
-Corporate/Edu enhancement
-
-By default, each user can choose on their Settings page whether or not to have their profile published in the site directory. This setting forces all
-profiles on this site to be listed in the site directory and there is no option provided to the user to change it. Default is false.
-
-Config:
-```
-$a->config['system']['publish_all'] = true;
-```
-
-
-**Global Directory**
-
-Corporate/Edu enhancement
-
-This configures the URL to update the global directory, and is supplied in the default configuration. The undocumented part is that if this is not set, the global directory is completely unavailable to the application. This allows a private community to be completely isolated from the global mistpark network.
-
-```
-$a->config['system']['directory_submit_url'] = 'http://dir.friendica.com/submit';
-```
-
-
-**Proxy Configuration Settings**
-
-If your site uses a proxy to connect to the internet, you may use these settings to communicate with the outside world (the outside world still needs to be able to see your website, or this will not be very useful).
-
-Config:
-```
-$a->config['system']['proxy'] = "http://proxyserver.domain:port";
-$a->config['system']['proxyuser'] = "username:password";
-```
-
-
-**Network Timeout**
-
-How long to wait on a network communication before timing out. Value is in seconds. Default is 60 seconds. Set to 0 for unlimited (not recommended).
-
-Config:
-```
-$a->config['system']['curl_timeout'] = 60;
-```
-
-
-**Banner/Logo**
-
-Set the content for the site banner. Default is the Friendica logo and name. You may wish to provide HTML/CSS to style and/or position this content, as it may not be themed by default.
-
-Config:
-```
-$a->config['system']['banner'] = '<span id="logo-text">My Great Website</span>';
-```
-
-
-**Maximum Image Size**
-
-Maximum size in bytes of uploaded images. Default is 0, which means no limits.
-
-Config:
-```
-$a->config['system']['maximagesize'] = 1000000;
-```
-
-
-**UTF-8 Regular Expressions**
-
-During registrations, full names are checked using UTF-8 regular expressions. This requires PHP to have been compiled with a special setting to allow UTF-8 expressions. If you are completely unable to register accounts, set no_utf to true. Default is false (meaning UTF8 regular expressions are supported and working).
-
-Config:
-```
-$a->config['system']['no_utf'] = true;
-```
-
-
-**Check Full Names**
-
-You may find a lot of spammers trying to register on your site. During testing we discovered that since these registrations were automatic, the "Full Name" field was often set to just an account name with no space between first and last name. If you would like to support people with only one name as their full name, you may change this setting to true. Default is false.
-
-Config:
-```
-$a->config['system']['no_regfullname'] = true;
-```
-
-
-**OpenID**
-
-By default, OpenID may be used for both registration and logins. If you do not wish to make OpenID facilities available on your system (at all), set 'no_openid' to true. Default is false.
-
-Config:
-```
-$a->config['system']['no_openid'] = true;
-```
-
-
-**Multiple Registrations**
-
-The ability to create "Pages" requires a person to register more than once. Your site configuration can block registration (or require approval to register). By default logged in users can register additional accounts for use as pages. These will still require approval if REGISTER_APPROVE is selected. You may prohibit logged in users from creating additional accounts by setting 'block_extended_register' to true. Default is false.
-
-Config:
-```
-$a->config['system']['block_extended_register'] = true;
-```
-
-
-**Developer Settings**
-
-Most useful when debugging protocol exchanges and tracking down other communications issues.
-
-Config:
-
-```
-$a->config['system']['debugging'] = true;
-$a->config['system']['logfile'] = 'logfile.out';
-$a->config['system']['loglevel'] = LOGGER_DEBUG;
-```
-Turns on detailed debugging logs which will be stored in 'logfile.out' (which must be writeable by the webserver). LOGGER_DEBUG will show a good deal of information about system activity but will not include detailed data. You may also select LOGGER_ALL but due to the volume of information we recommend only enabling this when you are tracking down a specific problem. Other log levels are possible but are not being used at the present time.
-
-
-**PHP error logging**
-
-Use the following settings to redirect PHP errors to a file.
-
-Config:
-
-```
-error_reporting(E_ERROR | E_WARNING | E_PARSE );
-ini_set('error_log','php.out');
-ini_set('log_errors','1');
-ini_set('display_errors', '0');
-```
-
-This will put all PHP errors in the file php.out (which must be writeable by the webserver). Undeclared variables are occasionally referenced in the program and therefore we do not recommend using E_NOTICE or E_ALL. The vast majority of issues reported at these levels are completely harmless. Please report to the developers any errors you encounter in the logs using the recommended settings above. They generally indicate issues which need to be resolved.
-
-If you encounter a blank (white) page when using the application, view the PHP logs - as this almost always indicates an error has occurred.
-
-
-
diff --git a/doc/Tags-and-Mentions.md b/doc/Tags-and-Mentions.md
index ce4e45f42..cdee73167 100644
--- a/doc/Tags-and-Mentions.md
+++ b/doc/Tags-and-Mentions.md
@@ -1,36 +1,24 @@
Tags and Mentions
=================
-
-* [Home](help)
-
-
-Like many other modern social networks, Friendica uses a special notation inside messages to indicate "tags" or contextual links to other entities.
+Like many other platforms, Red uses a special notation inside messages to indicate "tags" or contextual links to other entities.
**Mentions**
-People are tagged by preceding their name with the @ character.
+Channels are tagged by simply preceding their name with the @ character. Unless their system blocks unsolicited "mentions", the person tagged will likely receive a "Mention" post/activity or become a direct participant in the conversation in the case of public posts.
-The following are various ways of indicating a person:
+When you start to mention somebody, it will create an auto-complete box to select from your immediate connections. Select one as appropriate. Some connections will be displayed in different colours. A light blue entry (using the default theme) indicates a channel which will redeliver to others if tagged. This is generally a conversation group or forum. But be aware that when tagged, the message will also go to anybody they choose, in addition to anybody you choose.
-* @mike - indicates a known contact in your social circle whose nickname is "mike"
-* @mike_macgirvin - indicates a known contact in your social circle whose full name is "Mike Macgirvin". Note that spaces cannot be used inside tags.
-* @mike+151 - this form is used by the drop-down tag completion tool. It indicates the contact whose nickname is mike and whose contact identifier number is 151. The drop-down tool may be used to resolve people with duplicate nicknames.
-* @mike@macgirvin.com - indicates the Identity Address of a person on a different network, or one that is *not* in your social circle. This is called a "remote mention" and can only be an email-style locator, not a web URL.
+**Private Mentions**
-Unless their system blocks unsolicited "mentions", the person tagged will likely receive a "Mention" post/activity or become a direct participant in the conversation in the case of public posts. Please note that Friendica blocks incoming "mentions" from people with no relationship to you. This is a spam prevention measure.
+If you wish to restrict a post to a single person or a number of people, you can do this by selecting channels or collections from the privacy tool. You can also just tag them with a privacy tag. A privacy tag is a name preceded by the two characters @! - and in addition to tagging these channels, will also change the privacy permissions of the post to include them (and perhaps restrict the post from "everybody" if this was the default). You can have more than one privacy tag, for instance @!bob and @!linda will send the post only to Bob and Linda (in addition to any recipients you selected with the privacy selector - if any).
-Remote mentions are delivered using the OStatus protocol. This protocol is used by Friendica and StatusNet and several other systems, but is not currently implemented in Diaspora.
+You may also tag public collections. When you create or edit a collection, there is a checkbox to allow the group members to be seen by others. If this box is checked for a collection and you tag (for instance) @!Friends - the post will be restricted to the Friends collection. Check that the collection is public before doing this - as there is no way to take back a post except to delete it. The collection name will appear in the post and will alert members of that collection that they are members of it.
-Friendica makes no distinction between people and groups for the purpose of tagging. (Some other networks use !group to indicate a group.)
-**Topical Tags**
-
-Topical tags are indicated by preceding the tag name with the # character. This will create a link in the post to a generalised site search for the term provided. For example, #cars will provide a search link for all posts mentioning 'cars' on your site. Topical tags are generally a minimum of three characters in length. Shorter search terms are not likely to yield any search results, although this depends on the database configuration. The same rules apply as with names that spaces within tags are represented by the underscore character. It is therefore not possible to create a tag whose target contains an underscore.
-
-Topical tags are also not linked if they are purely numeric, e.g. #1. If you wish to use a numerica hashtag, please add some descriptive text such as #2012-elections.
-
+**Topical Tags**
-
+Topical tags are indicated by preceding the tag name with the # character. This will create a link in the post to a generalised site search for the term provided. For example, #cars will provide a search link for all posts mentioning 'cars' on your site. Topical tags are generally a minimum of three characters in length. Shorter search terms are not likely to yield any search results, although this depends on the database configuration. The same rules apply as with names that spaces within tags are represented by the underscore character. It is therefore not possible to create a tag whose target contains an underscore.
+Topical tags are also not linked if they are purely numeric, e.g. #1. If you wish to use a numerica hashtag, please add some descriptive text such as #2012-elections. \ No newline at end of file
diff --git a/doc/TermsOfService.md b/doc/TermsOfService.md
new file mode 100644
index 000000000..3586b5d82
--- /dev/null
+++ b/doc/TermsOfService.md
@@ -0,0 +1,4 @@
+Terms of Service
+================
+
+#include SiteTOS;
diff --git a/doc/To-Do-Code.md b/doc/To-Do-Code.md
new file mode 100644
index 000000000..3baf08d40
--- /dev/null
+++ b/doc/To-Do-Code.md
@@ -0,0 +1,55 @@
+Project Code To-Do List
+=======================
+
+We need much more than this, but here are areas where developers can help. Please edit this page when items are finished. Another place for developers to start is with the issues list.
+
+* Turn top-level Apps menu into an Apps page - which will probably require App plugins to have icons. Add documentation specifically to the plugin/addon documentation for creating apps. Add links to the App Store (which doesn't currently exist).
+
+* Documentation - see [Red Documentation Project To-Do List](help/To-Do)
+
+* Finish the anti-spam bayesian engine
+
+* Integrate the "open site" list with the register page
+
+* Write more webpage layouts
+
+* Write more webpage widgets
+
+* (Advanced) create a UI for building Comanche pages
+
+* Help with WebDAV and file storage implementation, especially replacing the fugly Sabre web UI.
+
+* Extend WebDAV to provide desktop access to photo albums
+
+* service classes - provide a pluggable subscription payment gateway for premium accounts
+
+* service classes - account overview page showing resources consumed by channel. With special consideration this page can also be accessed at a meta level by the site admin to drill down on problematic accounts/channels.
+
+* Events module - bring back birthday reminders for friends, fix permissions on events, and provide JS translation support for the calendar overview
+
+* Events module - event followups and RSVP
+
+
+* Uploads - integrate https://github.com/blueimp/jQuery-File-Upload
+
+
+* replace the tinymce visual editor and/or make the visual editor pluggable and responsive to different output formats. We probably want library/bbedit for bbcode. This needs a fair bit of work to catch up with our "enhanced bbcode", but start with images, links, bold and highlight and work from there.
+
+* Photos module - turn photos into normal conversations and fix tagging
+
+* Provide RSS feed support which look like channels (in matrix only - copyright issues)
+
+* Create mobile clients for the top platforms - which involves extending the API so that we can do stuff far beyond the current crop of Twitter/Statusnet clients. Ditto for mobile themes. We can probably use something like the Friendica Android app as a base to start from.
+
+* Activity Stream generation for liking things, liking channels and other combinations.
+
+* Implement owned and exchangeable "things".
+
+* Family Account creation - using service classes (an account holder can create a certain number of sub-accounts which are all tied to their subscription - if the subscription lapses they all go away).
+
+* Put mod_admin under Comanche
+
+In many cases some of the work has already been started and code exists so that you needn't start from scratch. Please contact one of the developer channels like Channel One (one@zothub.com) before embarking and we can tell you what we already have and provide some insights on how we envision these features fitting together.
+
+
+ \ No newline at end of file
diff --git a/doc/To-Do.md b/doc/To-Do.md
new file mode 100644
index 000000000..76b78b6ac
--- /dev/null
+++ b/doc/To-Do.md
@@ -0,0 +1,23 @@
+Documentation we need to write
+==============================
+
+
+* Database schema detailed descriptions
+
+* Complete plugin hook documentation
+
+* API documentation
+
+* Function and code documentation (doxygen)
+
+* New Member guide
+
+* "Extra Feature" reference, description of each
+
+* Detailed Personal Settings Documentation
+
+* Administration Guide (post-install)
+
+* Administration Guide (pre-install)
+
+
diff --git a/doc/Translations.md b/doc/Translations.md
new file mode 100644
index 000000000..1ebdfb67d
--- /dev/null
+++ b/doc/Translations.md
@@ -0,0 +1,91 @@
+Translating the Red Matrix
+==========================
+
+Translation Process
+-------------------
+
+The strings used in the UI of Red is translated at [Transifex][1] and then
+included in the git repository at github. If you want to help with translation
+for any language, be it correcting terms or translating Red to a
+currently not supported language, please register an account at transifex.com
+and contact the Red translation team there.
+
+Translating Red is simple. Just use the online tool at transifex. If you
+don't want to deal with git & co. that is fine, we check the status of the
+translations regularly and import them into the source tree at github so that
+others can use them.
+
+We do not include every translation from transifex in the source tree to avoid
+a scattered and disturbed overall experience. As an uneducated guess we have a
+lower limit of 50% translated strings before we include the language. This
+limit is judging only by the amount of translated strings under the assumption
+that the most prominent strings for the UI will be translated first by a
+translation team. If you feel your translation useable before this limit,
+please contact us and we will probably include your teams work in the source
+tree.
+
+If you want to get your work into the source tree yourself, feel free to do so
+and contact us with and question that arises. The process is simple and
+Red ships with all the tools necessary.
+
+The location of the translated files in the source tree is
+ /view/LNG-CODE/
+where LNG-CODE is the language code used, e.g. de for German or fr for French.
+For the email templates (the *.tpl files) just place them into the directory
+and you are done. The translated strings come as a "message.po" file from
+transifex which needs to be translated into the PHP file Red uses. To do
+so, place the file in the directory mentioned above and use the "po2php"
+utility from the util directory of your Red installation.
+
+Assuming you want to convert the German localization which is placed in
+view/de/message.po you would do the following.
+
+1. Navigate at the command prompt to the base directory of your
+ Red installation
+
+2. Execute the po2php script, which will place the translation
+ in the strings.php file that is used by Red.
+
+ $> php util/po2php.php view/de/message.po
+
+ The output of the script will be placed at view/de/strings.php where
+ froemdoca os expecting it, so you can test your translation mmediately.
+
+3. Visit your Red page to check if it still works in the language you
+ just translated. If not try to find the error, most likely PHP will give
+ you a hint in the log/warnings.about the error.
+
+ For debugging you can also try to "run" the file with PHP. This should
+ not give any output if the file is ok but might give a hint for
+ searching the bug in the file.
+
+ $> php view/de/strings.php
+
+4. commit the two files with a meaningful commit message to your git
+ repository, push it to your fork of the Red repository at github and
+ issue a pull request for that commit.
+
+Utilities
+---------
+
+Additional to the po2php script there are some more utilities for translation
+in the "util" directory of the Red source tree. If you only want to
+translate Red into another language you wont need any of these tools most
+likely but it gives you an idea how the translation process of Red
+works.
+
+For further information see the utils/README file.
+
+Known Problems
+--------------
+
+* Red uses the language setting of the visitors browser to determain the
+ language for the UI. Most of the time this works, but there are some known
+ quirks.
+* the early translations are based on the friendica translations, if you
+ some rough translations please let us know or fix them at Transifex.
+
+Links
+------
+[1]: http://www.transifex.com/projects/p/red-matrix/
+
diff --git a/doc/Webpages.md b/doc/Webpages.md
new file mode 100644
index 000000000..e9943fda8
--- /dev/null
+++ b/doc/Webpages.md
@@ -0,0 +1,14 @@
+Creating Webpages
+=================
+
+Red enables users to create static webpages. To activate this feature, enable the web pages feature in your Additional Features section.
+
+Once enabled, a new tab will appear on your channel page labelled "Webpages". Clicking this link will take you to the webpage editor. Here you can create a post using either BBCode or the rich text editor.
+
+Pages will be accessible at mydomain/page/username/pagelinktitle
+
+The "page link title" box allows a user to specify the "pagelinktitle" of this URL. If no page link title is set, we will set one for you automatically, using the message ID of the item.
+
+Beneath the page creation box, a list of existing pages will appear with an "edit" link. Clicking this will take you to an editor, similar to that of the post editor, where you can make changes to your webpages.
+
+If you are the admin of a site, you can specify a channel whose webpages we will use at key points around the site. Presently, the only place this is implemented is the home page. If you specify the channel "admin" and then the channel called "admin" creates a webpage called "home", we will display it's content on your websites home page. We expect this functionality to be extended to other areas in future. \ No newline at end of file
diff --git a/doc/andfinally.md b/doc/andfinally.md
deleted file mode 100644
index c4e8cb948..000000000
--- a/doc/andfinally.md
+++ /dev/null
@@ -1,26 +0,0 @@
-[[!meta title="And Finally..."]]
-
-And that brings the Quick Start to an end.
-
-Here are some more things to help get you started:
-
-**Groups**
-
-
-- <a href="https://kakste.com/profile/newhere">New Here</a> - a group for people new to Friendica
-
-- <a href="http://helpers.pyxis.uberspace.de/profile/helpers">Friendica Support</a> - problems? This is the place to ask.
-
-- <a href="https://kakste.com/profile/public_stream">Public Stream</a> - a place to talk about anything to anyone.
-
-- <a href="https://letstalk.pyxis.uberspace.de/profile/letstalk">Let's Talk</a> a group for finding people and groups who share similar interests.
-
-- <a href="http://newzot.hydra.uberspace.de/profile/newzot">Local Friendica</a> a page for local Friendica groups</a>
-
-
-**Documentation**
-
-- <a href="help/Connectors">Connecting to more networks</a>
-- <a href="help">Help Index</a>
-
-
diff --git a/doc/api_functions.md b/doc/api_functions.md
new file mode 100644
index 000000000..8c63770e6
--- /dev/null
+++ b/doc/api_functions.md
@@ -0,0 +1,138 @@
+Red Twitter API
+===============
+
+The "basic" Red web API is based on the Twitter API, as this provides instant compatibility with a huge number of third-party clients and applications without requiring any code changes on their part. It is also a super-set of the StatusNet version of the Twitter API, as this also has existing wide support.
+
+Red has a lot more capability that isn't exposed in the Twitter interfaces or where we are forced to "dumb-down" the API functions to work with the primitive Twitter/StatusNet communications and privacy model. So we plan to extend the Twitter API in ways that will allow Red-specific clients to make full use of Red features without being crippled.
+
+A dedicated Red API is also being developed to work with native data structures and permissions and which do not require translating to different privacy and permission models and storage formats. This will be described in other documents. The prefix for all of the native endpoints is 'api/red'.
+
+Red provides multiple channels accesible via the same login account. With Red, any API function which requires authentication will accept a parameter &channel={channel_nickname} - and will select that channel and make it current before executing the API command. By default, the default channel associated with an account is selected.
+
+Red also provides an extended permission model. In the absence of any Red specific API calls to set permissions, they will be set to the default permissions settings which are associated with the current channel.
+
+Red will probably never be able to support the Twitter 'api/friendships' functions fully because Red is not a social network and has no concept of "friendships" - it only recognises permissions to do stuff (or not do stuff as the case may be).
+
+Legend: T= Twitter, S= StatusNet, F= Friendica, R= Red, ()=Not yet working, J= JSON only (XML formats deprecated)
+
+
+
+Twitter API compatible functions:
+
+* api/account/verify_credentials T,S,F,R
+* api/statuses/update T,S,F,R
+* api/users/show T,S,F,R
+* api/statuses/home_timeline T,S,F,R
+* api/statuses/friends_timeline T,S,F,R
+* api/statuses/public_timeline T,S,F,R
+* api/statuses/show T,S,F,R
+* api/statuses/retweet T,S,F,R
+* api/statuses/destroy T,S,F,(R)
+* api/statuses/mentions T,S,F,(R)
+* api/statuses/replies T,S,F,(R)
+* api/statuses/user_timeline T,S,F,(R)
+* api/favorites T,S,F,(R)
+* api/account/rate_limit_status T,S,F,R
+* api/help/test T,S,F,R
+* api/statuses/friends T,S,F,R
+* api/statuses/followers T,S,F,R
+* api/friends/ids T,S,F,R
+* api/followers/ids T,S,F,R
+* api/direct_messages/new T,S,F,(R)
+* api/direct_messages/conversation T,S,F,(R)
+* api/direct_messages/all T,S,F,(R)
+* api/direct_messages/sent T,S,F,(R)
+* api/direct_messages T,S,F,(R)
+* api/oauth/request_token T,S,F,R
+* api/oauth/access_token T,S,F,R
+
+
+Twitter API functions supported by StatusNet but not currently by Friendica or Red
+
+* api/favorites T,S
+* api/favorites/create T,S
+* api/favorites/destroy T,S
+* api/statuses/retweets_of_me T,S
+* api/friendships/create T,S
+* api/friendships/destroy T,S
+* api/friendships/exists T,S
+* api/friendships/show T,S
+* api/account/update_location T,S
+* api/account/update_profile_background_image T,S
+* api/account/update_profile_image T,S
+* api/blocks/create T,S
+* api/blocks/destroy T,S
+
+Twitter API functions not currently supported by StatusNet
+
+* api/statuses/retweeted_to_me T
+* api/statuses/retweeted_by_me T
+* api/direct_messages/destroy T
+* api/account/end_session T,(R)
+* api/account/update_delivery_device T
+* api/notifications/follow T
+* api/notifications/leave T
+* api/blocks/exists T
+* api/blocks/blocking T
+* api/lists T
+
+
+Statusnet compatible extensions to the Twitter API supported in both Friendica and Red
+
+* api/statusnet/version S,F,R
+* api/statusnet/config S,F,R
+
+Friendica API extensions to the Twitter API supported in both Friendica and Red
+
+* api/statuses/mediap F,R
+
+
+Red specific API extensions to the Twitter API not supported in Friendica
+
+* api/account/logout R
+* api/export/basic R,J
+* api/friendica/config R
+* api/red/config R
+* api/friendica/version R
+* api/red/version R
+
+* api/red/channel/export/basic R,J
+* api/red/channel/stream R,J (currently post only)
+* api/red/albums R,J
+* api/red/photos R,J (option album=xxxx)
+
+
+Red proposed API extensions to the Twitter API
+
+* api/statuses/edit (R),J
+* api/statuses/permissions (R),J
+* api/statuses/permissions/update (R),J
+* api/statuses/ids (R),J # search for existing message_id before importing a foreign post
+* api/files/show (R),J
+* api/files/destroy (R),J
+* api/files/update (R),J
+* api/files/permissions (R),J
+* api/files/permissions/update (R),J
+* api/pages/show (R),J
+* api/pages/destroy (R),J
+* api/pages/update (R),J
+* api/pages/permissions (R),J
+* api/pages/permissions/update (R),J
+* api/events/show (R),J
+* api/events/update (R),J
+* api/events/permissions (R),J
+* api/events/permissions/update (R),J
+* api/events/destroy (R),J
+* api/photos/show (R),J
+* api/photos/update (R),J
+* api/photos/permissions (R),J
+* api/photos/permissions/update (R),J
+* api/albums/destroy (R),J
+* api/albums/show (R),J
+* api/albums/update (R),J
+* api/albums/permissions (R),J
+* api/albums/permissions/update (R),J
+* api/albums/destroy (R),J
+* api/friends/permissions (R),J
+
+
diff --git a/doc/bbcode.html b/doc/bbcode.html
new file mode 100644
index 000000000..a24dd8b5d
--- /dev/null
+++ b/doc/bbcode.html
@@ -0,0 +1,68 @@
+<h3>BBcode reference</h3>
+<div style="font-size: 14px;">
+<br /><br />
+<ul class="listdecimal" style="list-style-type: decimal;">
+<li>[b]bold[/b] - <strong>bold</strong><br />
+<li>[i]italic[/i] - <em>italic</em><br />
+<li>[u]underlined[/u] - <u>underlined</u><br />
+<li>[s]strike[/s] - <strike>strike</strike><br />
+<li>[color=red]red[/color] - <span style="color: red;">red</span><br />
+<li>[url=https://redmatrix.me]Red Matrix[/url] <a href="https://redmatrix.me">Red Matrix</a><br />
+<li>[img]https://redmatrix.me/images/default_profile_photos/rainbow_man/48.jpg[/img] <img src="https://redmatrix.me/images/default_profile_photos/rainbow_man/48.jpg" alt="Image/photo" /><br />
+<li>[code]code[/code] <code>code</code><br />
+<li>[quote]quote[/quote] <blockquote>quote</blockquote><br />
+<li>[quote=Author]Author? Me? No, no, no...[/quote] <br /><strong class="author">Author wrote:</strong><blockquote>Author? Me? No, no, no...</blockquote><br />
+<li> [nobb] may be used to escape bbcode.</ul><br />
+
+<br />You can make lists with:<br />
+<ul class="listbullet" style="list-style-type: circle;">
+<li>[list]<br />
+<li>[list=1]<br />
+<li>[list=i]<br />
+<li>[list=I] <br />
+<li>[list=a]<br />
+<li>[list=A] <br />
+<li>[ul]<br />
+<li>[ol]
+
+</ul>For example:<br />[ul]<br />[*] First list element<br />[*] Second list element<br />[/ul]<br /><br />Will render something like: <br />
+<ul class="listbullet" style="list-style-type: circle;">
+<li> First list element<br />
+<li> Second list element</ul><br />
+<br />There's also:<br />
+<ul class="listloweralpha" style="list-style-type: lower-alpha;">
+<li>[hr]<br />
+<li>[video]video URL[/video]<br />
+<li>[audio]audio URL[/audio]<br />
+<li>[table]<br />
+<li>[th] <br />
+<li>[td]<br />
+<li>[tr]<br />
+<li>[center]<br />
+<li>[font=courier]some text[/font] <span style="font-family: courier;">some text</span><br />
+</ul><br />
+<br />Tables? Yes!<br /><br />[table border=1]<br /> [tr]<br /> [th]Tables now[/th]<br /> [/tr]<br /> [tr]<br /> [td]Have headers[/td]<br /> [/tr]<br />[/table]<br /><br /><table border="1" ><tr><th>Tables now</th></tr><tr><td>Have headers</td></tr></table><br />All sizes, <br />From the [size=xx-small] - <span style="font-size: xx-small;">xx-small</span>.<br />To the [size=xx-large] - <span style="font-size: xx-large;">xx-large</span>.<br />To fit exactly <span style="font-size: 20px;">20px</span> use [size=20].<br /><br />
+
+<p>Red Matrix specific codes</p>
+<ul class="listbullet" style="list-style-type: circle;">
+<li>[&amp;copy;] &copy; This works for many HTML entities<br />
+<li>[zrl]https://redmatrix.me[/zrl] Magic-auth version of [url] tag<br />
+<li>[zmg]https://redmatrix.me/some/photo.jpg[/zmg] Magic-auth version of [img] tag<br />
+<br />
+<li>[observer=1]Text to display if observer is authenticated in the matrix[/observer]
+<li>[observer=0]Text to display if observer is <strong>not</strong> authenticated in the matrix[/observer]<br />
+<li>[observer.baseurl] website of observer <br />
+<li>[observer.url] channel URL of observer <br />
+<li>[observer.name] name of observer <br />
+<li>[observer.address] address (zot-id) of observer <br />
+<li>[observer.photo] profile photo of observer <br />
+<br />
+
+<li>[rpost=title]Text to post[/rpost] The observer will be returned to their home hub to enter a post with the specified title and body. Both are optional <br />
+
+
+
+</div>
+
+
+
diff --git a/doc/dev-function-overview.md b/doc/dev-function-overview.md
new file mode 100644
index 000000000..445b4823b
--- /dev/null
+++ b/doc/dev-function-overview.md
@@ -0,0 +1,52 @@
+Red development - some useful basic functions
+=============================================
+
+
+
+* get_account_id()
+
+Returns numeric account_id if authenticated or 0. It is possible to be authenticated and not connected to a channel.
+
+* local_user()
+
+Returns authenticated numeric channel_id if authenticated and connected to a channel or 0. Sometimes referred to as $uid in the code.
+
+* remote_user()
+
+Returns authenticated string hash of Red global identifier, if authenticated via remote auth, or an empty string.
+
+* get_app()
+
+Returns the global app structure ($a).
+
+* App::get_observer()
+
+(App:: is usually assigned to the global $a), so $a->get_observer() or get_app()->get_observer() - returns an xchan structure representing the current viewer if authenticated (locally or remotely).
+
+* get_config($family,$key), get_pconfig($uid,$family,$key)
+
+Returns the config setting for $family and $key or false if unset.
+
+* set_config($family,$key,$value), set_pconfig($uid,$family,$key,$value)
+
+Sets the value of config setting for $family and $key to $value. Returns $value. The config versions operate on system-wide settings. The pconfig versions get/set the values for a specific integer uid (channel_id).
+
+* dbesc()
+
+Always escape strings being used in DB queries. This function returns the escaped string. Integer DB parameters should all be proven integers by wrapping with intval()
+
+* q($sql,$var1...)
+
+Perform a DB query with the SQL statement $sql. printf style arguments %s and %d are replaced with variable arguments, which should each be appropriately dbesc() or intval(). SELECT queries return an array of results or false if SQL or DB error. Other queries return true if the command was successful or false if it wasn't.
+
+* t($string)
+
+Returns the translated variant of $string for the current language or $string (default 'en' language) if the language is unrecognised or a translated version of the string does not exist.
+
+* x($var), $x($array,$key)
+
+Shorthand test to see if variable $var is set and is not empty. Tests vary by type. Returns false if $var or $key is not set.
+If variable is set, returns 1 if has 'non-zero' value, otherwise returns 0. -- e.g. x('') or x(0) returns 0;
+
+
+
diff --git a/doc/groupsandpages.md b/doc/groupsandpages.md
deleted file mode 100644
index 5cfbc653c..000000000
--- a/doc/groupsandpages.md
+++ /dev/null
@@ -1,11 +0,0 @@
-This is the global directory. If you get lost, you can <a href = "help/groupsandpages">click this link</a> to bring yourself back here.
-
-On this page, you'll find a collection of groups, forums and celebrity pages. Groups are not real people. Connecting to them is similar to "liking" something on Facebook, or signing up for a new forum. You don't have to feel awkward about introducing yourself to a new person, because they're not people!
-
-When you connect to a group, all messages to that group will start appearing in your network tab. You can comment on these posts, or post to the group yourself without ever having to add any of the groups members. This is a great way to make friends dynamically - you'll find people you like and add each other naturally instead of adding random strangers. Simply find a group you're interested in, and connect to it the same way you did with people in the last section. There are a lot of groups, and you're likely to get lost. Remember the link at the top of this page will bring you back here.
-
-Once you've added some groups, <a href="help/andfinally">move on to the next section</a>.
-
-<iframe src="http://dir.friendica.com/directory/forum" width="950" height="600"></iframe>
-
-
diff --git a/doc/guide.md b/doc/guide.md
deleted file mode 100644
index d76af92e2..000000000
--- a/doc/guide.md
+++ /dev/null
@@ -1,13 +0,0 @@
-First things first, let's make sure you're logged in to your account. If you're not already logged in, do so in the frame below.
-
-Once you've logged in (or if you are already logged in), you'll now be looking at your profile page.
-
-This is a bit like your Facebook wall. It's where all your status messgages are kept, and where your friends come to post on your wall. To write your status, simply click in the box that says "share". When you do this, the box will expand. You can see some formatting options at the top such as Bold, Italics and Underline, as well as ways to add links and pictures. At the bottom you'll find some more links. You can use these to upload pictures and files from your computer, share websites with a bit of preview text, or embed video and audio files from elsewhere on the web. You can also set your post location here.
-
-Once you've finished writing your post, click on the padlock icon to select who can see it. If you do not use the padlock icon, your post will be public. This means it will appear to anybody who views your profile, and in the community tab if your site has it enabled, as well as in the network tab of any of your contacts.
-
-Play around with this a bit, then when you're ready to move on, we'll take a look at the <a href="help/network">Network Tab</a>
-
-<iframe src="login" width="950" height="600"></iframe>
-
-
diff --git a/doc/html/BaseObject_8php.html b/doc/html/BaseObject_8php.html
new file mode 100644
index 000000000..b399ff36f
--- /dev/null
+++ b/doc/html/BaseObject_8php.html
@@ -0,0 +1,120 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/BaseObject.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('BaseObject_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Classes</a> </div>
+ <div class="headertitle">
+<div class="title">BaseObject.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classBaseObject.html">BaseObject</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/Contact_8php.html b/doc/html/Contact_8php.html
new file mode 100644
index 000000000..e6e4270df
--- /dev/null
+++ b/doc/html/Contact_8php.html
@@ -0,0 +1,513 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/Contact.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('Contact_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">Contact.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a2f4f495d53f2a334ab75292af79d3c91"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="Contact_8php.html#a2f4f495d53f2a334ab75292af79d3c91">rconnect_url</a> ($channel_id, $xchan)</td></tr>
+<tr class="separator:a2f4f495d53f2a334ab75292af79d3c91"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae8803c330352cbf1e828eb7490edf47e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="Contact_8php.html#ae8803c330352cbf1e828eb7490edf47e">abook_connections</a> ($channel_id, $sql_conditions= '')</td></tr>
+<tr class="separator:ae8803c330352cbf1e828eb7490edf47e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad5b02c2a962ee55b1b7ca6c159d6e4c5"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="Contact_8php.html#ad5b02c2a962ee55b1b7ca6c159d6e4c5">abook_self</a> ($channel_id)</td></tr>
+<tr class="separator:ad5b02c2a962ee55b1b7ca6c159d6e4c5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a87e699f74a1102b25e8aa0432d86a91e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="Contact_8php.html#a87e699f74a1102b25e8aa0432d86a91e">channelx_by_nick</a> ($nick)</td></tr>
+<tr class="separator:a87e699f74a1102b25e8aa0432d86a91e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a483cda56f9e37c3a4a8773dcdfeb0258"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="Contact_8php.html#a483cda56f9e37c3a4a8773dcdfeb0258">channelx_by_hash</a> ($hash)</td></tr>
+<tr class="separator:a483cda56f9e37c3a4a8773dcdfeb0258"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3a0844dac1e86d523de5d2f432cfeebc"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="Contact_8php.html#a3a0844dac1e86d523de5d2f432cfeebc">channelx_by_n</a> ($id)</td></tr>
+<tr class="separator:a3a0844dac1e86d523de5d2f432cfeebc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6348a532c9d26cd1c9afbc9aa6aa8960"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="Contact_8php.html#a6348a532c9d26cd1c9afbc9aa6aa8960">vcard_from_xchan</a> ($xchan, $observer=null, $mode= '')</td></tr>
+<tr class="separator:a6348a532c9d26cd1c9afbc9aa6aa8960"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a024919623a830e8703ac4f23496dd66c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="Contact_8php.html#a024919623a830e8703ac4f23496dd66c">abook_toggle_flag</a> ($abook, $flag)</td></tr>
+<tr class="separator:a024919623a830e8703ac4f23496dd66c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2fc191067dd571a79603c66b04b1ca15"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="Contact_8php.html#a2fc191067dd571a79603c66b04b1ca15">user_remove</a> ($uid)</td></tr>
+<tr class="separator:a2fc191067dd571a79603c66b04b1ca15"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6e64de7db60b7243dce45fb6347636ff"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="Contact_8php.html#a6e64de7db60b7243dce45fb6347636ff">account_remove</a> ($account_id, $local=true)</td></tr>
+<tr class="separator:a6e64de7db60b7243dce45fb6347636ff"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a186162051a5127069cc851d78740f205"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="Contact_8php.html#a186162051a5127069cc851d78740f205">channel_remove</a> ($channel_id, $local=true)</td></tr>
+<tr class="separator:a186162051a5127069cc851d78740f205"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acc12cda999c88c4d6185cca967c15125"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="Contact_8php.html#acc12cda999c88c4d6185cca967c15125">remove_all_xchan_resources</a> ($xchan, $channel_id=0)</td></tr>
+<tr class="separator:acc12cda999c88c4d6185cca967c15125"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a28e062c884331dbb5dfa713228c25ad6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="Contact_8php.html#a28e062c884331dbb5dfa713228c25ad6">contact_remove</a> ($channel_id, $abook_id)</td></tr>
+<tr class="separator:a28e062c884331dbb5dfa713228c25ad6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a38daa1c210b78385307123450ca9a1fc"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="Contact_8php.html#a38daa1c210b78385307123450ca9a1fc">terminate_friendship</a> ($user, $self, $contact)</td></tr>
+<tr class="separator:a38daa1c210b78385307123450ca9a1fc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a852fa476f0c70bde10a4f2533aec5f71"><td class="memItemLeft" align="right" valign="top"><a class="el" href="redbasic_2php_2style_8php.html#a883f9f14e205f7aa7de02c14df67b40a">if</a>(!function_exists('mark_for_death')) <br class="typebreak"/>
+<a class="el" href="redbasic_2php_2style_8php.html#a883f9f14e205f7aa7de02c14df67b40a">if</a>(!function_exists('unmark_for_death'))&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="Contact_8php.html#a852fa476f0c70bde10a4f2533aec5f71">random_profile</a> ()</td></tr>
+<tr class="separator:a852fa476f0c70bde10a4f2533aec5f71"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="ae8803c330352cbf1e828eb7490edf47e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">abook_connections </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel_id</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$sql_conditions</em> = <code>''</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ad5b02c2a962ee55b1b7ca6c159d6e4c5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">abook_self </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel_id</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a024919623a830e8703ac4f23496dd66c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">abook_toggle_flag </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$abook</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$flag</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="connedit_8php.html#a795acb3d9d841f55c255d7611681ab67">connedit_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a6e64de7db60b7243dce45fb6347636ff"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">account_remove </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$account_id</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$local</em> = <code>true</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="admin_8php.html#a62f10f90c47686c9c3c37c4c03a108d2">admin_page_users()</a>, <a class="el" href="admin_8php.html#a5a696706a3869800e65fb365214241b7">admin_page_users_post()</a>, and <a class="el" href="include_2chanman_8php.html#a21ba9a5c961e866ff27aee3ee67bf99b">chanman_remove_everything_from_network()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a186162051a5127069cc851d78740f205"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">channel_remove </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel_id</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$local</em> = <code>true</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="Contact_8php.html#a6e64de7db60b7243dce45fb6347636ff">account_remove()</a>, and <a class="el" href="removeme_8php.html#a7be08738beca44bb98a79e01cdb2ee88">removeme_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a483cda56f9e37c3a4a8773dcdfeb0258"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">channelx_by_hash </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$hash</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a3a0844dac1e86d523de5d2f432cfeebc"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">channelx_by_n </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$id</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="widgets_8php.html#a702e2fc0adc9b615999eca18b7311b5e">widget_photo_albums()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a87e699f74a1102b25e8aa0432d86a91e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">channelx_by_nick </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$nick</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="mod_2photos_8php.html#ab950295cd77626f5fe65331a87693014">photos_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a28e062c884331dbb5dfa713228c25ad6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">contact_remove </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel_id</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$abook_id</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="connedit_8php.html#a795acb3d9d841f55c255d7611681ab67">connedit_content()</a>, and <a class="el" href="post_8php.html#af59e6a1dc22d19d9257b01cd7ccedb75">post_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a852fa476f0c70bde10a4f2533aec5f71"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="redbasic_2php_2style_8php.html#a883f9f14e205f7aa7de02c14df67b40a">if</a> (!function_exists('mark_for_death')) <a class="el" href="redbasic_2php_2style_8php.html#a883f9f14e205f7aa7de02c14df67b40a">if</a> (!function_exists('unmark_for_death')) random_profile </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="randprof_8php.html#abf5dba3c608b9304cbf68327cd31b090">randprof_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a2f4f495d53f2a334ab75292af79d3c91"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">rconnect_url </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel_id</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$xchan</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="identity_8php.html#a432259b2cf5b6f59be53e71db9f2c7dc">profile_sidebar()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="acc12cda999c88c4d6185cca967c15125"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">remove_all_xchan_resources </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$xchan</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel_id</em> = <code>0</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="post_8php.html#af59e6a1dc22d19d9257b01cd7ccedb75">post_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a38daa1c210b78385307123450ca9a1fc"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">terminate_friendship </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$user</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$self</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$contact</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a2fc191067dd571a79603c66b04b1ca15"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">user_remove </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a6348a532c9d26cd1c9afbc9aa6aa8960"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">vcard_from_xchan </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$xchan</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$observer</em> = <code>null</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$mode</em> = <code>''</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="widgets_8php.html#abe03366fd22fd27d683518fa0765da50">widget_vcard()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/Contact_8php.js b/doc/html/Contact_8php.js
new file mode 100644
index 000000000..1de72ccc5
--- /dev/null
+++ b/doc/html/Contact_8php.js
@@ -0,0 +1,18 @@
+var Contact_8php =
+[
+ [ "abook_connections", "Contact_8php.html#ae8803c330352cbf1e828eb7490edf47e", null ],
+ [ "abook_self", "Contact_8php.html#ad5b02c2a962ee55b1b7ca6c159d6e4c5", null ],
+ [ "abook_toggle_flag", "Contact_8php.html#a024919623a830e8703ac4f23496dd66c", null ],
+ [ "account_remove", "Contact_8php.html#a6e64de7db60b7243dce45fb6347636ff", null ],
+ [ "channel_remove", "Contact_8php.html#a186162051a5127069cc851d78740f205", null ],
+ [ "channelx_by_hash", "Contact_8php.html#a483cda56f9e37c3a4a8773dcdfeb0258", null ],
+ [ "channelx_by_n", "Contact_8php.html#a3a0844dac1e86d523de5d2f432cfeebc", null ],
+ [ "channelx_by_nick", "Contact_8php.html#a87e699f74a1102b25e8aa0432d86a91e", null ],
+ [ "contact_remove", "Contact_8php.html#a28e062c884331dbb5dfa713228c25ad6", null ],
+ [ "random_profile", "Contact_8php.html#a852fa476f0c70bde10a4f2533aec5f71", null ],
+ [ "rconnect_url", "Contact_8php.html#a2f4f495d53f2a334ab75292af79d3c91", null ],
+ [ "remove_all_xchan_resources", "Contact_8php.html#acc12cda999c88c4d6185cca967c15125", null ],
+ [ "terminate_friendship", "Contact_8php.html#a38daa1c210b78385307123450ca9a1fc", null ],
+ [ "user_remove", "Contact_8php.html#a2fc191067dd571a79603c66b04b1ca15", null ],
+ [ "vcard_from_xchan", "Contact_8php.html#a6348a532c9d26cd1c9afbc9aa6aa8960", null ]
+]; \ No newline at end of file
diff --git a/doc/html/ConversationObject_8php.html b/doc/html/ConversationObject_8php.html
new file mode 100644
index 000000000..02a09213b
--- /dev/null
+++ b/doc/html/ConversationObject_8php.html
@@ -0,0 +1,120 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/ConversationObject.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('ConversationObject_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Classes</a> </div>
+ <div class="headertitle">
+<div class="title">ConversationObject.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classConversation.html">Conversation</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/ITemplateEngine_8php.html b/doc/html/ITemplateEngine_8php.html
new file mode 100644
index 000000000..a2e4e9a43
--- /dev/null
+++ b/doc/html/ITemplateEngine_8php.html
@@ -0,0 +1,120 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/ITemplateEngine.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('ITemplateEngine_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Classes</a> </div>
+ <div class="headertitle">
+<div class="title">ITemplateEngine.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">interface &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="interfaceITemplateEngine.html">ITemplateEngine</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/ItemObject_8php.html b/doc/html/ItemObject_8php.html
new file mode 100644
index 000000000..08b61619c
--- /dev/null
+++ b/doc/html/ItemObject_8php.html
@@ -0,0 +1,120 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/ItemObject.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('ItemObject_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Classes</a> </div>
+ <div class="headertitle">
+<div class="title">ItemObject.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html">Item</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/ProtoDriver_8php.html b/doc/html/ProtoDriver_8php.html
new file mode 100644
index 000000000..6d918344a
--- /dev/null
+++ b/doc/html/ProtoDriver_8php.html
@@ -0,0 +1,122 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/ProtoDriver.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('ProtoDriver_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Classes</a> </div>
+ <div class="headertitle">
+<div class="title">ProtoDriver.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classProtoDriver.html">ProtoDriver</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classZotDriver.html">ZotDriver</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/README_8md.html b/doc/html/README_8md.html
new file mode 100644
index 000000000..ec5f607aa
--- /dev/null
+++ b/doc/html/README_8md.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/apw/README.md File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rhash-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('README_8md.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">view/theme/apw/README.md File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/Scrape_8php.html b/doc/html/Scrape_8php.html
new file mode 100644
index 000000000..59c15f35b
--- /dev/null
+++ b/doc/html/Scrape_8php.html
@@ -0,0 +1,171 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Project: include/Scrape.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="r!-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Project
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('Scrape_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> &#124;
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle">
+<div class="title">Scrape.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a32883beb7dbf311fc9bfa99200a7402c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="Scrape_8php.html#a32883beb7dbf311fc9bfa99200a7402c">probe_url</a> ($url, $mode=<a class="el" href="Scrape_8php.html#aa6b0bdcf6e8f9d44e699fd94d2207c98">PROBE_NORMAL</a>)</td></tr>
+<tr class="separator:a32883beb7dbf311fc9bfa99200a7402c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:aa6b0bdcf6e8f9d44e699fd94d2207c98"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="Scrape_8php.html#aa6b0bdcf6e8f9d44e699fd94d2207c98">PROBE_NORMAL</a> (!function_exists('scrape_feed')) 0</td></tr>
+<tr class="separator:aa6b0bdcf6e8f9d44e699fd94d2207c98"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a32883beb7dbf311fc9bfa99200a7402c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">probe_url </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$url</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$mode</em> = <code><a class="el" href="Scrape_8php.html#aa6b0bdcf6e8f9d44e699fd94d2207c98">PROBE_NORMAL</a></code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Variable Documentation</h2>
+<a class="anchor" id="aa6b0bdcf6e8f9d44e699fd94d2207c98"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const PROBE_NORMAL(!function_exists('scrape_feed')) 0</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Probe a network address to discover what kind of protocols we need to communicate with it.</p>
+<p>Warning: this function is a bit touchy and there are some subtle dependencies within the logic flow. Edit with care.</p>
+<p>PROBE_DIASPORA has a bias towards returning Diaspora information while PROBE_NORMAL has a bias towards dfrn/zot - in the case where an address (such as a <a class="el" href="namespaceFriendica.html">Friendica</a> address) supports more than one type of network. </p>
+
+<p>Referenced by <a class="el" href="Scrape_8php.html#a32883beb7dbf311fc9bfa99200a7402c">probe_url()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/Scrape_8php.js b/doc/html/Scrape_8php.js
new file mode 100644
index 000000000..6bdfb178d
--- /dev/null
+++ b/doc/html/Scrape_8php.js
@@ -0,0 +1,5 @@
+var Scrape_8php =
+[
+ [ "probe_url", "Scrape_8php.html#a32883beb7dbf311fc9bfa99200a7402c", null ],
+ [ "PROBE_NORMAL", "Scrape_8php.html#aa6b0bdcf6e8f9d44e699fd94d2207c98", null ]
+]; \ No newline at end of file
diff --git a/doc/html/__well__known_8php.html b/doc/html/__well__known_8php.html
new file mode 100644
index 000000000..96032186d
--- /dev/null
+++ b/doc/html/__well__known_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/_well_known.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('__well__known_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">_well_known.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a6ebfa937a2024f0b5dab53f0ac90fed0"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="__well__known_8php.html#a6ebfa937a2024f0b5dab53f0ac90fed0">_well_known_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a6ebfa937a2024f0b5dab53f0ac90fed0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a6ebfa937a2024f0b5dab53f0ac90fed0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">_well_known_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/__well__known_8php.js b/doc/html/__well__known_8php.js
new file mode 100644
index 000000000..47e6777dd
--- /dev/null
+++ b/doc/html/__well__known_8php.js
@@ -0,0 +1,4 @@
+var __well__known_8php =
+[
+ [ "_well_known_init", "__well__known_8php.html#a6ebfa937a2024f0b5dab53f0ac90fed0", null ]
+]; \ No newline at end of file
diff --git a/doc/html/account_8php.html b/doc/html/account_8php.html
new file mode 100644
index 000000000..547c7016e
--- /dev/null
+++ b/doc/html/account_8php.html
@@ -0,0 +1,328 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/account.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('account_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">account.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ae052bd5558847bd38e89c213561a9771"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="account_8php.html#ae052bd5558847bd38e89c213561a9771">check_account_email</a> ($email)</td></tr>
+<tr class="separator:ae052bd5558847bd38e89c213561a9771"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a144b4891022567668375b58ea61cfff0"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="account_8php.html#a144b4891022567668375b58ea61cfff0">check_account_password</a> ($password)</td></tr>
+<tr class="separator:a144b4891022567668375b58ea61cfff0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aaff7720423417a4333697894ffd9ddeb"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="account_8php.html#aaff7720423417a4333697894ffd9ddeb">check_account_invite</a> ($invite_code)</td></tr>
+<tr class="separator:aaff7720423417a4333697894ffd9ddeb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a917d74aad0baf3e0c4b51cf1051e654f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="account_8php.html#a917d74aad0baf3e0c4b51cf1051e654f">check_account_admin</a> ($arr)</td></tr>
+<tr class="separator:a917d74aad0baf3e0c4b51cf1051e654f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a43e3042b2723d76915a030bac3c668b6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="account_8php.html#a43e3042b2723d76915a030bac3c668b6">account_total</a> ()</td></tr>
+<tr class="separator:a43e3042b2723d76915a030bac3c668b6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a141fe579c351c78209d425473f978eb5"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="account_8php.html#a141fe579c351c78209d425473f978eb5">create_account</a> ($arr)</td></tr>
+<tr class="separator:a141fe579c351c78209d425473f978eb5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a014de2d5d5c9785de5bf547a485822fa"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="account_8php.html#a014de2d5d5c9785de5bf547a485822fa">send_reg_approval_email</a> ($arr)</td></tr>
+<tr class="separator:a014de2d5d5c9785de5bf547a485822fa"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa9c29c497c17d8f9344dce8631ad8761"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="account_8php.html#aa9c29c497c17d8f9344dce8631ad8761">send_verification_email</a> ($email, $password)</td></tr>
+<tr class="separator:aa9c29c497c17d8f9344dce8631ad8761"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac5c570a2d46446bad4dd2501e9c5a4b1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="account_8php.html#ac5c570a2d46446bad4dd2501e9c5a4b1">user_allow</a> ($hash)</td></tr>
+<tr class="separator:ac5c570a2d46446bad4dd2501e9c5a4b1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac1653efba62493b9d87513e1b6c04c83"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="account_8php.html#ac1653efba62493b9d87513e1b6c04c83">user_deny</a> ($hash)</td></tr>
+<tr class="separator:ac1653efba62493b9d87513e1b6c04c83"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a43e3042b2723d76915a030bac3c668b6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">account_total </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="account_8php.html#a141fe579c351c78209d425473f978eb5">create_account()</a>, and <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a917d74aad0baf3e0c4b51cf1051e654f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">check_account_admin </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="account_8php.html#a141fe579c351c78209d425473f978eb5">create_account()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ae052bd5558847bd38e89c213561a9771"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">check_account_email </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$email</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="account_8php.html#a141fe579c351c78209d425473f978eb5">create_account()</a>, and <a class="el" href="register_8php.html#ae20c0cd40f738d6295de58b9202c83d5">register_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aaff7720423417a4333697894ffd9ddeb"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">check_account_invite </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$invite_code</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="account_8php.html#a141fe579c351c78209d425473f978eb5">create_account()</a>, and <a class="el" href="register_8php.html#ae20c0cd40f738d6295de58b9202c83d5">register_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a144b4891022567668375b58ea61cfff0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">check_account_password </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$password</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="account_8php.html#a141fe579c351c78209d425473f978eb5">create_account()</a>, and <a class="el" href="register_8php.html#ae20c0cd40f738d6295de58b9202c83d5">register_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a141fe579c351c78209d425473f978eb5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">create_account </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="register_8php.html#a51731dcc1917c58a790eb1c0f6132271">register_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a014de2d5d5c9785de5bf547a485822fa"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">send_reg_approval_email </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="register_8php.html#a51731dcc1917c58a790eb1c0f6132271">register_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa9c29c497c17d8f9344dce8631ad8761"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">send_verification_email </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$email</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$password</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="register_8php.html#a51731dcc1917c58a790eb1c0f6132271">register_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ac5c570a2d46446bad4dd2501e9c5a4b1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">user_allow </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$hash</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="admin_8php.html#a5a696706a3869800e65fb365214241b7">admin_page_users_post()</a>, and <a class="el" href="regmod_8php.html#a7953df4e32e63946565e90cdd5d50409">regmod_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ac1653efba62493b9d87513e1b6c04c83"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">user_deny </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$hash</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="admin_8php.html#a5a696706a3869800e65fb365214241b7">admin_page_users_post()</a>, and <a class="el" href="regmod_8php.html#a7953df4e32e63946565e90cdd5d50409">regmod_content()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/account_8php.js b/doc/html/account_8php.js
new file mode 100644
index 000000000..2e43e4b46
--- /dev/null
+++ b/doc/html/account_8php.js
@@ -0,0 +1,13 @@
+var account_8php =
+[
+ [ "account_total", "account_8php.html#a43e3042b2723d76915a030bac3c668b6", null ],
+ [ "check_account_admin", "account_8php.html#a917d74aad0baf3e0c4b51cf1051e654f", null ],
+ [ "check_account_email", "account_8php.html#ae052bd5558847bd38e89c213561a9771", null ],
+ [ "check_account_invite", "account_8php.html#aaff7720423417a4333697894ffd9ddeb", null ],
+ [ "check_account_password", "account_8php.html#a144b4891022567668375b58ea61cfff0", null ],
+ [ "create_account", "account_8php.html#a141fe579c351c78209d425473f978eb5", null ],
+ [ "send_reg_approval_email", "account_8php.html#a014de2d5d5c9785de5bf547a485822fa", null ],
+ [ "send_verification_email", "account_8php.html#aa9c29c497c17d8f9344dce8631ad8761", null ],
+ [ "user_allow", "account_8php.html#ac5c570a2d46446bad4dd2501e9c5a4b1", null ],
+ [ "user_deny", "account_8php.html#ac1653efba62493b9d87513e1b6c04c83", null ]
+]; \ No newline at end of file
diff --git a/doc/html/achievements_8php.html b/doc/html/achievements_8php.html
new file mode 100644
index 000000000..894abb4a4
--- /dev/null
+++ b/doc/html/achievements_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/achievements.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('achievements_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">achievements.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a35ae04ada0e227d19671f289a32fb30e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="achievements_8php.html#a35ae04ada0e227d19671f289a32fb30e">achievements_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a35ae04ada0e227d19671f289a32fb30e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a35ae04ada0e227d19671f289a32fb30e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">achievements_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/achievements_8php.js b/doc/html/achievements_8php.js
new file mode 100644
index 000000000..319ac33da
--- /dev/null
+++ b/doc/html/achievements_8php.js
@@ -0,0 +1,4 @@
+var achievements_8php =
+[
+ [ "achievements_content", "achievements_8php.html#a35ae04ada0e227d19671f289a32fb30e", null ]
+]; \ No newline at end of file
diff --git a/doc/html/acl_8php.html b/doc/html/acl_8php.html
new file mode 100644
index 000000000..fa0fe0018
--- /dev/null
+++ b/doc/html/acl_8php.html
@@ -0,0 +1,157 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/acl.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('acl_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">acl.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ac6776dba871806ecdb5d1659bc2eb07a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="acl_8php.html#ac6776dba871806ecdb5d1659bc2eb07a">acl_init</a> (&amp;$a)</td></tr>
+<tr class="separator:ac6776dba871806ecdb5d1659bc2eb07a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a57dceff370d4a0e7ae673d50fbfda61f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="acl_8php.html#a57dceff370d4a0e7ae673d50fbfda61f">navbar_complete</a> (&amp;$a)</td></tr>
+<tr class="separator:a57dceff370d4a0e7ae673d50fbfda61f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="ac6776dba871806ecdb5d1659bc2eb07a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">acl_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a57dceff370d4a0e7ae673d50fbfda61f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">navbar_complete </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="acl_8php.html#ac6776dba871806ecdb5d1659bc2eb07a">acl_init()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/acl_8php.js b/doc/html/acl_8php.js
new file mode 100644
index 000000000..f4e646edd
--- /dev/null
+++ b/doc/html/acl_8php.js
@@ -0,0 +1,5 @@
+var acl_8php =
+[
+ [ "acl_init", "acl_8php.html#ac6776dba871806ecdb5d1659bc2eb07a", null ],
+ [ "navbar_complete", "acl_8php.html#a57dceff370d4a0e7ae673d50fbfda61f", null ]
+]; \ No newline at end of file
diff --git a/doc/html/acl__selectors_8php.html b/doc/html/acl__selectors_8php.html
new file mode 100644
index 000000000..d0d283649
--- /dev/null
+++ b/doc/html/acl__selectors_8php.html
@@ -0,0 +1,279 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/acl_selectors.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('acl__selectors_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#namespaces">Namespaces</a> &#124;
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">acl_selectors.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="namespaces"></a>
+Namespaces</h2></td></tr>
+<tr class="memitem:namespaceacl__selectors"><td class="memItemLeft" align="right" valign="top">namespace &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespaceacl__selectors.html">acl_selectors</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:aa1e3bc344ca2b29f97eb9860216d21a0"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="acl__selectors_8php.html#aa1e3bc344ca2b29f97eb9860216d21a0">group_select</a> ($selname, $selclass, $preselected=false, $size=4)</td></tr>
+<tr class="separator:aa1e3bc344ca2b29f97eb9860216d21a0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9476997d2968a5794f3723878ed89c91"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="acl__selectors_8php.html#a9476997d2968a5794f3723878ed89c91">contact_select</a> ($selname, $selclass, $preselected=false, $size=4, $privmail=false, $celeb=false, $privatenet=false, $tabindex=null)</td></tr>
+<tr class="separator:a9476997d2968a5794f3723878ed89c91"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad6664fb8330308e23f2645cd6624727e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="acl__selectors_8php.html#ad6664fb8330308e23f2645cd6624727e">fixacl</a> (&amp;$item)</td></tr>
+<tr class="separator:ad6664fb8330308e23f2645cd6624727e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7b5446e999636ceceea65c154d865a31"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="acl__selectors_8php.html#a7b5446e999636ceceea65c154d865a31">populate_acl</a> ($defaults=null, $unused=false)</td></tr>
+<tr class="separator:a7b5446e999636ceceea65c154d865a31"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a9476997d2968a5794f3723878ed89c91"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">contact_select </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$selname</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$selclass</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$preselected</em> = <code>false</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$size</em> = <code>4</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$privmail</em> = <code>false</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$celeb</em> = <code>false</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$privatenet</em> = <code>false</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$tabindex</em> = <code>null</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="mail_8php.html#a3c7c485fc69f92371e8b20936040eca1">mail_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ad6664fb8330308e23f2645cd6624727e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">fixacl </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$item</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aa1e3bc344ca2b29f97eb9860216d21a0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">group_select </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$selname</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$selclass</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$preselected</em> = <code>false</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$size</em> = <code>4</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a7b5446e999636ceceea65c154d865a31"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">populate_acl </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$defaults</em> = <code>null</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$unused</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>, <a class="el" href="display_8php.html#a37137c98d47bf3306f4c2bb9f5b60de0">display_content()</a>, <a class="el" href="editwebpage_8php.html#a375e945255fad79a71036528f7480650">editwebpage_content()</a>, <a class="el" href="events_8php.html#a1d293fb217ae6bc9e3858c4b32e363ec">events_content()</a>, <a class="el" href="filestorage_8php.html#a61bb1be78472555df4ce619f51014040">filestorage_content()</a>, <a class="el" href="mitem_8php.html#a7a31b702ecad18eeb6a38b243ff0037e">mitem_content()</a>, <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>, <a class="el" href="mod_2photos_8php.html#aa87382611a66ec5effdb2d78f13f5812">photos_content()</a>, <a class="el" href="rpost_8php.html#a8190354d789000806d9879aea276728f">rpost_content()</a>, and <a class="el" href="webpages_8php.html#af3b7397d4abc153e3d2147740ee1a41d">webpages_content()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/acl__selectors_8php.js b/doc/html/acl__selectors_8php.js
new file mode 100644
index 000000000..e236669d3
--- /dev/null
+++ b/doc/html/acl__selectors_8php.js
@@ -0,0 +1,7 @@
+var acl__selectors_8php =
+[
+ [ "contact_select", "acl__selectors_8php.html#a9476997d2968a5794f3723878ed89c91", null ],
+ [ "fixacl", "acl__selectors_8php.html#ad6664fb8330308e23f2645cd6624727e", null ],
+ [ "group_select", "acl__selectors_8php.html#aa1e3bc344ca2b29f97eb9860216d21a0", null ],
+ [ "populate_acl", "acl__selectors_8php.html#a7b5446e999636ceceea65c154d865a31", null ]
+]; \ No newline at end of file
diff --git a/doc/html/activities_8php.html b/doc/html/activities_8php.html
new file mode 100644
index 000000000..86428ecc8
--- /dev/null
+++ b/doc/html/activities_8php.html
@@ -0,0 +1,149 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/activities.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('activities_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">activities.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a80134e807719b3c54aba971958d2e132"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="activities_8php.html#a80134e807719b3c54aba971958d2e132">profile_activity</a> ($changed, $value)</td></tr>
+<tr class="separator:a80134e807719b3c54aba971958d2e132"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a80134e807719b3c54aba971958d2e132"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">profile_activity </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$changed</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$value</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="profiles_8php.html#ab0362c81b1d3b0b12a772b9fac446e04">profiles_post()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/activities_8php.js b/doc/html/activities_8php.js
new file mode 100644
index 000000000..73188de88
--- /dev/null
+++ b/doc/html/activities_8php.js
@@ -0,0 +1,4 @@
+var activities_8php =
+[
+ [ "profile_activity", "activities_8php.html#a80134e807719b3c54aba971958d2e132", null ]
+]; \ No newline at end of file
diff --git a/doc/html/admin_8php.html b/doc/html/admin_8php.html
new file mode 100644
index 000000000..ff835ad08
--- /dev/null
+++ b/doc/html/admin_8php.html
@@ -0,0 +1,590 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/admin.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('admin_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">admin.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:acf51f5837a7427832144c2bf7308ada3"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="admin_8php.html#acf51f5837a7427832144c2bf7308ada3">admin_post</a> (&amp;$a)</td></tr>
+<tr class="separator:acf51f5837a7427832144c2bf7308ada3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afef415e4011607fbb665610441595015"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="admin_8php.html#afef415e4011607fbb665610441595015">admin_content</a> (&amp;$a)</td></tr>
+<tr class="separator:afef415e4011607fbb665610441595015"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac6e95b920b5abd030cc522964987087a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="admin_8php.html#ac6e95b920b5abd030cc522964987087a">admin_page_summary</a> (&amp;$a)</td></tr>
+<tr class="separator:ac6e95b920b5abd030cc522964987087a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:add865f4ae806ecbf716f423fc3e50e4f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="admin_8php.html#add865f4ae806ecbf716f423fc3e50e4f">admin_page_site_post</a> (&amp;$a)</td></tr>
+<tr class="separator:add865f4ae806ecbf716f423fc3e50e4f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac0f3bd12431c056aad77bac9d09fa30e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="admin_8php.html#ac0f3bd12431c056aad77bac9d09fa30e">admin_page_site</a> (&amp;$a)</td></tr>
+<tr class="separator:ac0f3bd12431c056aad77bac9d09fa30e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a60ba9783ad14545814919970bc3fb725"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="admin_8php.html#a60ba9783ad14545814919970bc3fb725">admin_page_hubloc_post</a> (&amp;$a)</td></tr>
+<tr class="separator:a60ba9783ad14545814919970bc3fb725"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6943543f3138f6ee182cb701f415d1cc"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="admin_8php.html#a6943543f3138f6ee182cb701f415d1cc">admin_page_hubloc</a> (&amp;$a)</td></tr>
+<tr class="separator:a6943543f3138f6ee182cb701f415d1cc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aaa6addf2dbc3f3fcf99244a56b41eade"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="admin_8php.html#aaa6addf2dbc3f3fcf99244a56b41eade">admin_page_dbsync</a> (&amp;$a)</td></tr>
+<tr class="separator:aaa6addf2dbc3f3fcf99244a56b41eade"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5a696706a3869800e65fb365214241b7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="admin_8php.html#a5a696706a3869800e65fb365214241b7">admin_page_users_post</a> (&amp;$a)</td></tr>
+<tr class="separator:a5a696706a3869800e65fb365214241b7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a62f10f90c47686c9c3c37c4c03a108d2"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="admin_8php.html#a62f10f90c47686c9c3c37c4c03a108d2">admin_page_users</a> (&amp;$a)</td></tr>
+<tr class="separator:a62f10f90c47686c9c3c37c4c03a108d2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a54128076986ba80c4a103de3fc3e19a8"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="admin_8php.html#a54128076986ba80c4a103de3fc3e19a8">admin_page_plugins</a> (&amp;$a)</td></tr>
+<tr class="separator:a54128076986ba80c4a103de3fc3e19a8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af81f081851791cd15e49e8ff6722dc27"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="admin_8php.html#af81f081851791cd15e49e8ff6722dc27">toggle_theme</a> (&amp;$themes, $th, &amp;$result)</td></tr>
+<tr class="separator:af81f081851791cd15e49e8ff6722dc27"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad4f74f33944a98b56d2c8c7601f124a4"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="admin_8php.html#ad4f74f33944a98b56d2c8c7601f124a4">theme_status</a> ($themes, $th)</td></tr>
+<tr class="separator:ad4f74f33944a98b56d2c8c7601f124a4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae46311a3fefc21abc838a26e91789de6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="admin_8php.html#ae46311a3fefc21abc838a26e91789de6">rebuild_theme_table</a> ($themes)</td></tr>
+<tr class="separator:ae46311a3fefc21abc838a26e91789de6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af124619fdc278fe2bf14c45ddaa260fb"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="admin_8php.html#af124619fdc278fe2bf14c45ddaa260fb">admin_page_themes</a> (&amp;$a)</td></tr>
+<tr class="separator:af124619fdc278fe2bf14c45ddaa260fb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a233b7c8c31776b7020532003c6e44e1c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="admin_8php.html#a233b7c8c31776b7020532003c6e44e1c">admin_page_logs_post</a> (&amp;$a)</td></tr>
+<tr class="separator:a233b7c8c31776b7020532003c6e44e1c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1d1362698af14d209aa3a0fb655551dd"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="admin_8php.html#a1d1362698af14d209aa3a0fb655551dd">admin_page_logs</a> (&amp;$a)</td></tr>
+<tr class="separator:a1d1362698af14d209aa3a0fb655551dd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="afef415e4011607fbb665610441595015"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">admin_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype"><a class="el" href="classApp.html">App</a></td><td class="paramname">$a</td><td></td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>string </dd></dl>
+<p>Side bar links</p>
+<p>Page content</p>
+
+</div>
+</div>
+<a class="anchor" id="aaa6addf2dbc3f3fcf99244a56b41eade"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">admin_page_dbsync </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="admin_8php.html#afef415e4011607fbb665610441595015">admin_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a6943543f3138f6ee182cb701f415d1cc"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">admin_page_hubloc </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="admin_8php.html#afef415e4011607fbb665610441595015">admin_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a60ba9783ad14545814919970bc3fb725"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">admin_page_hubloc_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="admin_8php.html#acf51f5837a7427832144c2bf7308ada3">admin_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a1d1362698af14d209aa3a0fb655551dd"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">admin_page_logs </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype"><a class="el" href="classApp.html">App</a></td><td class="paramname">$a</td><td></td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>string </dd></dl>
+
+<p>Referenced by <a class="el" href="admin_8php.html#afef415e4011607fbb665610441595015">admin_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a233b7c8c31776b7020532003c6e44e1c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">admin_page_logs_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Logs admin page</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype"><a class="el" href="classApp.html">App</a></td><td class="paramname">$a</td><td></td></tr>
+ </table>
+ </dd>
+</dl>
+
+<p>Referenced by <a class="el" href="admin_8php.html#acf51f5837a7427832144c2bf7308ada3">admin_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a54128076986ba80c4a103de3fc3e19a8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">admin_page_plugins </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Plugins admin page</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype"><a class="el" href="classApp.html">App</a></td><td class="paramname">$a</td><td></td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>string </dd></dl>
+<p>Single plugin</p>
+<p>List plugins</p>
+
+<p>Referenced by <a class="el" href="admin_8php.html#afef415e4011607fbb665610441595015">admin_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ac0f3bd12431c056aad77bac9d09fa30e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">admin_page_site </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype"><a class="el" href="classApp.html">App</a></td><td class="paramname">$a</td><td></td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>string </dd></dl>
+
+<p>Referenced by <a class="el" href="admin_8php.html#afef415e4011607fbb665610441595015">admin_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="add865f4ae806ecbf716f423fc3e50e4f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">admin_page_site_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Admin Site Page </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype"><a class="el" href="classApp.html">App</a></td><td class="paramname">$a</td><td></td></tr>
+ </table>
+ </dd>
+</dl>
+
+<p>Referenced by <a class="el" href="admin_8php.html#acf51f5837a7427832144c2bf7308ada3">admin_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ac6e95b920b5abd030cc522964987087a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">admin_page_summary </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Admin Summary Page </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype"><a class="el" href="classApp.html">App</a></td><td class="paramname">$a</td><td></td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>string </dd></dl>
+
+<p>Referenced by <a class="el" href="admin_8php.html#afef415e4011607fbb665610441595015">admin_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="af124619fdc278fe2bf14c45ddaa260fb"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">admin_page_themes </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Themes admin page</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype"><a class="el" href="classApp.html">App</a></td><td class="paramname">$a</td><td></td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>string </dd></dl>
+<p>Single theme</p>
+<p>List themes</p>
+
+<p>Referenced by <a class="el" href="admin_8php.html#afef415e4011607fbb665610441595015">admin_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a62f10f90c47686c9c3c37c4c03a108d2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">admin_page_users </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype"><a class="el" href="classApp.html">App</a></td><td class="paramname">$a</td><td></td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>string </dd></dl>
+
+<p>Referenced by <a class="el" href="admin_8php.html#afef415e4011607fbb665610441595015">admin_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a5a696706a3869800e65fb365214241b7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">admin_page_users_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Users admin page</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype"><a class="el" href="classApp.html">App</a></td><td class="paramname">$a</td><td></td></tr>
+ </table>
+ </dd>
+</dl>
+
+<p>Referenced by <a class="el" href="admin_8php.html#acf51f5837a7427832144c2bf7308ada3">admin_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="acf51f5837a7427832144c2bf7308ada3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">admin_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Red admin </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype"><a class="el" href="classApp.html">App</a></td><td class="paramname">$a</td><td></td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a class="anchor" id="ae46311a3fefc21abc838a26e91789de6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">rebuild_theme_table </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$themes</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype">array</td><td class="paramname">$themes</td><td></td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>string </dd></dl>
+
+<p>Referenced by <a class="el" href="admin_8php.html#af124619fdc278fe2bf14c45ddaa260fb">admin_page_themes()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ad4f74f33944a98b56d2c8c7601f124a4"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">theme_status </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$themes</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$th</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype">array</td><td class="paramname">$themes</td><td></td></tr>
+ <tr><td class="paramtype">string</td><td class="paramname">$th</td><td></td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>int </dd></dl>
+
+<p>Referenced by <a class="el" href="admin_8php.html#af124619fdc278fe2bf14c45ddaa260fb">admin_page_themes()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="af81f081851791cd15e49e8ff6722dc27"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">toggle_theme </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$themes</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$th</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$result</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype">array</td><td class="paramname">$themes</td><td></td></tr>
+ <tr><td class="paramtype">string</td><td class="paramname">$th</td><td></td></tr>
+ <tr><td class="paramtype">int</td><td class="paramname">$result</td><td></td></tr>
+ </table>
+ </dd>
+</dl>
+
+<p>Referenced by <a class="el" href="admin_8php.html#af124619fdc278fe2bf14c45ddaa260fb">admin_page_themes()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/admin_8php.js b/doc/html/admin_8php.js
new file mode 100644
index 000000000..973a7a9aa
--- /dev/null
+++ b/doc/html/admin_8php.js
@@ -0,0 +1,20 @@
+var admin_8php =
+[
+ [ "admin_content", "admin_8php.html#afef415e4011607fbb665610441595015", null ],
+ [ "admin_page_dbsync", "admin_8php.html#aaa6addf2dbc3f3fcf99244a56b41eade", null ],
+ [ "admin_page_hubloc", "admin_8php.html#a6943543f3138f6ee182cb701f415d1cc", null ],
+ [ "admin_page_hubloc_post", "admin_8php.html#a60ba9783ad14545814919970bc3fb725", null ],
+ [ "admin_page_logs", "admin_8php.html#a1d1362698af14d209aa3a0fb655551dd", null ],
+ [ "admin_page_logs_post", "admin_8php.html#a233b7c8c31776b7020532003c6e44e1c", null ],
+ [ "admin_page_plugins", "admin_8php.html#a54128076986ba80c4a103de3fc3e19a8", null ],
+ [ "admin_page_site", "admin_8php.html#ac0f3bd12431c056aad77bac9d09fa30e", null ],
+ [ "admin_page_site_post", "admin_8php.html#add865f4ae806ecbf716f423fc3e50e4f", null ],
+ [ "admin_page_summary", "admin_8php.html#ac6e95b920b5abd030cc522964987087a", null ],
+ [ "admin_page_themes", "admin_8php.html#af124619fdc278fe2bf14c45ddaa260fb", null ],
+ [ "admin_page_users", "admin_8php.html#a62f10f90c47686c9c3c37c4c03a108d2", null ],
+ [ "admin_page_users_post", "admin_8php.html#a5a696706a3869800e65fb365214241b7", null ],
+ [ "admin_post", "admin_8php.html#acf51f5837a7427832144c2bf7308ada3", null ],
+ [ "rebuild_theme_table", "admin_8php.html#ae46311a3fefc21abc838a26e91789de6", null ],
+ [ "theme_status", "admin_8php.html#ad4f74f33944a98b56d2c8c7601f124a4", null ],
+ [ "toggle_theme", "admin_8php.html#af81f081851791cd15e49e8ff6722dc27", null ]
+]; \ No newline at end of file
diff --git a/doc/html/allfriends_8php.html b/doc/html/allfriends_8php.html
new file mode 100644
index 000000000..eb1568786
--- /dev/null
+++ b/doc/html/allfriends_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/allfriends.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('allfriends_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">allfriends.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:aad992ddbb5f20e81c5cf2259718aec83"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="allfriends_8php.html#aad992ddbb5f20e81c5cf2259718aec83">allfriends_content</a> (&amp;$a)</td></tr>
+<tr class="separator:aad992ddbb5f20e81c5cf2259718aec83"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="aad992ddbb5f20e81c5cf2259718aec83"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">allfriends_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/allfriends_8php.js b/doc/html/allfriends_8php.js
new file mode 100644
index 000000000..906fc42b8
--- /dev/null
+++ b/doc/html/allfriends_8php.js
@@ -0,0 +1,4 @@
+var allfriends_8php =
+[
+ [ "allfriends_content", "allfriends_8php.html#aad992ddbb5f20e81c5cf2259718aec83", null ]
+]; \ No newline at end of file
diff --git a/doc/html/annotated.html b/doc/html/annotated.html
new file mode 100644
index 000000000..63c8fe26e
--- /dev/null
+++ b/doc/html/annotated.html
@@ -0,0 +1,147 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('annotated.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">Class List</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock">Here are the classes, structs, unions and interfaces with brief descriptions:</div><div class="directory">
+<table class="directory">
+<tr id="row_0_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2ns.png" alt="N" width="24" height="22" /><a class="el" href="namespaceacl__selectors.html" target="_self">acl_selectors</a></td><td class="desc"></td></tr>
+<tr id="row_1_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2ns.png" alt="N" width="24" height="22" /><a class="el" href="namespaceFriendica.html" target="_self">Friendica</a></td><td class="desc"></td></tr>
+<tr id="row_2_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2ns.png" alt="N" width="24" height="22" /><a class="el" href="namespacefriendica-to-smarty-tpl.html" target="_self">friendica-to-smarty-tpl</a></td><td class="desc"></td></tr>
+<tr id="row_3_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2ns.png" alt="N" width="24" height="22" /><a class="el" href="namespaceupdatetpl.html" target="_self">updatetpl</a></td><td class="desc"></td></tr>
+<tr id="row_4_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2ns.png" alt="N" width="24" height="22" /><a class="el" href="namespaceutil.html" target="_self">util</a></td><td class="desc"></td></tr>
+<tr id="row_5_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classApp.html" target="_self">App</a></td><td class="desc"></td></tr>
+<tr id="row_6_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classBaseObject.html" target="_self">BaseObject</a></td><td class="desc"></td></tr>
+<tr id="row_7_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classCache.html" target="_self">Cache</a></td><td class="desc"></td></tr>
+<tr id="row_8_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classConversation.html" target="_self">Conversation</a></td><td class="desc"></td></tr>
+<tr id="row_9_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classdba__driver.html" target="_self">dba_driver</a></td><td class="desc"></td></tr>
+<tr id="row_10_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classdba__mysql.html" target="_self">dba_mysql</a></td><td class="desc"></td></tr>
+<tr id="row_11_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classdba__mysqli.html" target="_self">dba_mysqli</a></td><td class="desc"></td></tr>
+<tr id="row_12_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classenotify.html" target="_self">enotify</a></td><td class="desc"></td></tr>
+<tr id="row_13_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classFKOAuth1.html" target="_self">FKOAuth1</a></td><td class="desc"></td></tr>
+<tr id="row_14_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classFKOAuthDataStore.html" target="_self">FKOAuthDataStore</a></td><td class="desc"></td></tr>
+<tr id="row_15_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classFriendicaSmarty.html" target="_self">FriendicaSmarty</a></td><td class="desc"></td></tr>
+<tr id="row_16_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classFriendicaSmartyEngine.html" target="_self">FriendicaSmartyEngine</a></td><td class="desc"></td></tr>
+<tr id="row_17_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classItem.html" target="_self">Item</a></td><td class="desc"></td></tr>
+<tr id="row_18_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="interfaceITemplateEngine.html" target="_self">ITemplateEngine</a></td><td class="desc"></td></tr>
+<tr id="row_19_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classphoto__driver.html" target="_self">photo_driver</a></td><td class="desc"></td></tr>
+<tr id="row_20_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classphoto__gd.html" target="_self">photo_gd</a></td><td class="desc"></td></tr>
+<tr id="row_21_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classphoto__imagick.html" target="_self">photo_imagick</a></td><td class="desc"></td></tr>
+<tr id="row_22_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classProtoDriver.html" target="_self">ProtoDriver</a></td><td class="desc"></td></tr>
+<tr id="row_23_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classRedBasicAuth.html" target="_self">RedBasicAuth</a></td><td class="desc"></td></tr>
+<tr id="row_24_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classRedBrowser.html" target="_self">RedBrowser</a></td><td class="desc"></td></tr>
+<tr id="row_25_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classRedDirectory.html" target="_self">RedDirectory</a></td><td class="desc"></td></tr>
+<tr id="row_26_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classRedFile.html" target="_self">RedFile</a></td><td class="desc"></td></tr>
+<tr id="row_27_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classTemplate.html" target="_self">Template</a></td><td class="desc"></td></tr>
+<tr id="row_28_" class="even"><td class="entry"><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classZotDriver.html" target="_self">ZotDriver</a></td><td class="desc"></td></tr>
+</table>
+</div><!-- directory -->
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/annotated.js b/doc/html/annotated.js
new file mode 100644
index 000000000..c6ab45689
--- /dev/null
+++ b/doc/html/annotated.js
@@ -0,0 +1,32 @@
+var annotated =
+[
+ [ "acl_selectors", "namespaceacl__selectors.html", null ],
+ [ "Friendica", "namespaceFriendica.html", null ],
+ [ "friendica-to-smarty-tpl", "namespacefriendica-to-smarty-tpl.html", null ],
+ [ "updatetpl", "namespaceupdatetpl.html", null ],
+ [ "util", "namespaceutil.html", null ],
+ [ "App", "classApp.html", "classApp" ],
+ [ "BaseObject", "classBaseObject.html", "classBaseObject" ],
+ [ "Cache", "classCache.html", null ],
+ [ "Conversation", "classConversation.html", "classConversation" ],
+ [ "dba_driver", "classdba__driver.html", "classdba__driver" ],
+ [ "dba_mysql", "classdba__mysql.html", "classdba__mysql" ],
+ [ "dba_mysqli", "classdba__mysqli.html", "classdba__mysqli" ],
+ [ "enotify", "classenotify.html", null ],
+ [ "FKOAuth1", "classFKOAuth1.html", "classFKOAuth1" ],
+ [ "FKOAuthDataStore", "classFKOAuthDataStore.html", "classFKOAuthDataStore" ],
+ [ "FriendicaSmarty", "classFriendicaSmarty.html", "classFriendicaSmarty" ],
+ [ "FriendicaSmartyEngine", "classFriendicaSmartyEngine.html", "classFriendicaSmartyEngine" ],
+ [ "Item", "classItem.html", "classItem" ],
+ [ "ITemplateEngine", "interfaceITemplateEngine.html", "interfaceITemplateEngine" ],
+ [ "photo_driver", "classphoto__driver.html", "classphoto__driver" ],
+ [ "photo_gd", "classphoto__gd.html", "classphoto__gd" ],
+ [ "photo_imagick", "classphoto__imagick.html", "classphoto__imagick" ],
+ [ "ProtoDriver", "classProtoDriver.html", "classProtoDriver" ],
+ [ "RedBasicAuth", "classRedBasicAuth.html", "classRedBasicAuth" ],
+ [ "RedBrowser", "classRedBrowser.html", "classRedBrowser" ],
+ [ "RedDirectory", "classRedDirectory.html", "classRedDirectory" ],
+ [ "RedFile", "classRedFile.html", "classRedFile" ],
+ [ "Template", "classTemplate.html", "classTemplate" ],
+ [ "ZotDriver", "classZotDriver.html", "classZotDriver" ]
+]; \ No newline at end of file
diff --git a/doc/html/apps_8php.html b/doc/html/apps_8php.html
new file mode 100644
index 000000000..47a49270a
--- /dev/null
+++ b/doc/html/apps_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/apps.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('apps_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">apps.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a546016cb960d0b110ee8e489dfa6c27c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="apps_8php.html#a546016cb960d0b110ee8e489dfa6c27c">apps_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a546016cb960d0b110ee8e489dfa6c27c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a546016cb960d0b110ee8e489dfa6c27c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">apps_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/apps_8php.js b/doc/html/apps_8php.js
new file mode 100644
index 000000000..a2ca0a3d7
--- /dev/null
+++ b/doc/html/apps_8php.js
@@ -0,0 +1,4 @@
+var apps_8php =
+[
+ [ "apps_content", "apps_8php.html#a546016cb960d0b110ee8e489dfa6c27c", null ]
+]; \ No newline at end of file
diff --git a/doc/html/apw_2README_8md.html b/doc/html/apw_2README_8md.html
new file mode 100644
index 000000000..815c86f05
--- /dev/null
+++ b/doc/html/apw_2README_8md.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/apw/README.md File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('apw_2README_8md.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">view/theme/apw/README.md File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/apw_2php_2style_8php.html b/doc/html/apw_2php_2style_8php.html
new file mode 100644
index 000000000..e27362462
--- /dev/null
+++ b/doc/html/apw_2php_2style_8php.html
@@ -0,0 +1,149 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/apw/php/style.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('apw_2php_2style_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle">
+<div class="title">style.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:a109bbd7f4add27541707b191b73ef84a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="apw_2php_2style_8php.html#a109bbd7f4add27541707b191b73ef84a">$uid</a> = <a class="el" href="identity_8php.html#aaeb666872995e3ab8da8f7bc5f3b2bd3">get_theme_uid</a>()</td></tr>
+<tr class="separator:a109bbd7f4add27541707b191b73ef84a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a883f9f14e205f7aa7de02c14df67b40a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="apw_2php_2style_8php.html#a883f9f14e205f7aa7de02c14df67b40a">if</a> ($uid) <a class="el" href="include_2config_8php.html#ac543813a980b3841cc5a277fcd4a24a6">load_pconfig</a>($uid</td></tr>
+<tr class="separator:a883f9f14e205f7aa7de02c14df67b40a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Variable Documentation</h2>
+<a class="anchor" id="a109bbd7f4add27541707b191b73ef84a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$uid = <a class="el" href="identity_8php.html#aaeb666872995e3ab8da8f7bc5f3b2bd3">get_theme_uid</a>()</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="admin_8php.html#a62f10f90c47686c9c3c37c4c03a108d2">admin_page_users()</a>, <a class="el" href="admin_8php.html#a5a696706a3869800e65fb365214241b7">admin_page_users_post()</a>, <a class="el" href="socgraph_8php.html#a16ac51c505d72987ed8d6d6aed0e8586">all_friends()</a>, <a class="el" href="zot_8php.html#ac34e479d27f32b82dd6b33542f81a6a7">build_sync_packet()</a>, <a class="el" href="items_8php.html#a87ac9e359591721a824ecd23bbb56296">check_item_source()</a>, <a class="el" href="permissions_8php.html#a0f5bd9f7f4c8fb7ba4b2c1ed048b4dc7">check_list_permissions()</a>, <a class="el" href="socgraph_8php.html#a7d34cd58025bcd9e575282f44db75918">common_friends()</a>, <a class="el" href="socgraph_8php.html#ac343a846241d36cdf046b08f3396cfe9">common_friends_zcid()</a>, <a class="el" href="socgraph_8php.html#af29d056beec10b4e38e5209c92452894">count_all_friends()</a>, <a class="el" href="socgraph_8php.html#a887d576f21fd708132a06d0f72f90f84">count_common_friends()</a>, <a class="el" href="socgraph_8php.html#af175807406d94407a5e11742a3287746">count_common_friends_zcid()</a>, <a class="el" href="boot_8php.html#a926cad0b3d8b9d9ee5da1898fc063ba3">current_theme_url()</a>, <a class="el" href="include_2config_8php.html#a7ad2081c5f812ac4387fd76f3762d941">del_pconfig()</a>, <a class="el" href="zot_8php.html#adfeb9400ae6b726beec89f8f1e8fde72">delete_imported_item()</a>, <a class="el" href="items_8php.html#a668ece2c37f05cc3abe538eb0dabfe55">drop_items()</a>, <a class="el" href="events_8php.html#ab3e8a8f901175f8e40a8089eea45c075">events_post()</a>, <a class="el" href="features_8php.html#a52b5bdfb61b256713efecf7a7b20b0c0">feature_enabled()</a>, <a class="el" href="items_8php.html#a0cf98bb619f07dd18f602683a55a5f59">first_post_date()</a>, <a class="el" href="item_8php.html#a7b63a9d0cd02096e17dcf11f4afa7c10">fix_attached_photo_permissions()</a>, <a class="el" href="items_8php.html#aba98fcbbcd7044a7e9ea34edabc14c87">fix_private_photos()</a>, <a class="el" href="mod_2follow_8php.html#a171f5b19f50d7738adc3b2e96ec6018a">follow_init()</a>, <a class="el" href="permissions_8php.html#aeca9b280f3dc3358c89976d81d690008">get_all_perms()</a>, <a class="el" href="include_2config_8php.html#ad58a4913937179adb13201c2ee3261ad">get_pconfig()</a>, <a class="el" href="identity_8php.html#aaeb666872995e3ab8da8f7bc5f3b2bd3">get_theme_uid()</a>, <a class="el" href="taxonomy_8php.html#a7747fa859ac56fbffd4f9782d85505de">get_things()</a>, <a class="el" href="include_2group_8php.html#a06ec565d2b64e79044e7c1bf91a2a4ce">group_add()</a>, <a class="el" href="include_2group_8php.html#a0122ef312df2c5546b1a46b3e6c7b31b">group_add_member()</a>, <a class="el" href="include_2group_8php.html#abd66a5ea34a07a3422dc2dde6c7b3ecb">group_byname()</a>, <a class="el" href="include_2group_8php.html#a90e157b3e1b99c981809cb5a2abd3245">group_rec_byhash()</a>, <a class="el" href="include_2group_8php.html#a4118f498bbd1530c1d0136d016d197a5">group_rmv()</a>, <a class="el" href="include_2group_8php.html#a540e3ef36f47d47532646be4241f6518">group_rmv_member()</a>, <a class="el" href="include_2group_8php.html#afb802ae2ce73aae4bc36d157f7b6a92f">groups_containing()</a>, <a class="el" href="photo__driver_8php.html#a1d0bc7161dec0d177b7d3bbe4421af9a">import_channel_photo()</a>, <a class="el" href="items_8php.html#a6f7e1334af5d684a987fa6a3eb37f4cc">item_expire()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="items_8php.html#acf0bf7c9d21ac84f32effb754f7ad484">item_store_update()</a>, <a class="el" href="items_8php.html#a756738301f2ed96be50232500677d58a">items_fetch()</a>, <a class="el" href="boot_8php.html#a719c7f3972d5f9268f37a41c76cd4ef6">load_contact_links()</a>, <a class="el" href="include_2config_8php.html#ac543813a980b3841cc5a277fcd4a24a6">load_pconfig()</a>, <a class="el" href="classFKOAuth1.html#a2b1dac2ed31fc6ef84668afdda8b263f">FKOAuth1\loginUser()</a>, <a class="el" href="include_2menu_8php.html#add35fae5e9695031b3d46e30ac409eb8">menu_add_item()</a>, <a class="el" href="include_2menu_8php.html#a9aa8e0052dd47c1a93f53a983bd4620a">menu_del_item()</a>, <a class="el" href="include_2menu_8php.html#a3884bda4d85d84ec99447db9403a68d8">menu_delete()</a>, <a class="el" href="include_2menu_8php.html#ad87f51ce85172bcc3f931aa0cd96a804">menu_delete_id()</a>, <a class="el" href="include_2menu_8php.html#acb66f80ca895a6ccd562b3d9ae7b41aa">menu_edit_item()</a>, <a class="el" href="include_2menu_8php.html#a68ebbf492470c930f652013656f9071d">menu_fetch()</a>, <a class="el" href="include_2group_8php.html#ab0e422a0f31c0c64fd9084ca03d85f32">mini_group_select()</a>, <a class="el" href="mood_8php.html#a7ae136dd7476865b4828136175db5022">mood_init()</a>, <a class="el" href="include_2follow_8php.html#ae387d4ae097c23d69f3247e7f08140c7">new_contact()</a>, <a class="el" href="notifier_8php.html#a568c502f626cff95e344c0748938b85d">notifier_run()</a>, <a class="el" href="comanche_8php.html#af7150df735e5ff9d467994cd6f769c6e">pdl_selector()</a>, <a class="el" href="permissions_8php.html#a67ada9ed51e77885b6b0f6a28cee1835">perm_is_allowed()</a>, <a class="el" href="photo_8php.html#a582779d24882b0d31ee909a91d70a448">photo_init()</a>, <a class="el" href="poke_8php.html#a9725aab97b3983e6a98bd81c4efe7d3b">poke_init()</a>, <a class="el" href="items_8php.html#abe695dd89e1e10ed042c26b80114f0ed">posted_date_widget()</a>, <a class="el" href="items_8php.html#ad2abb4644ff1f20fefbc80326fe01cf0">posted_dates()</a>, <a class="el" href="include_2message_8php.html#a652973ce47a262f2d238c2fd6233d97e">private_messages_list()</a>, <a class="el" href="zot_8php.html#aad25a3fe0e1566121d6fb8222979bc10">remove_community_tag()</a>, <a class="el" href="include_2message_8php.html#a751ffd6635022b2190f56154ee745752">send_message()</a>, <a class="el" href="plugin_8php.html#a030cec6793b909c439c0336ba39b1571">service_class_allows()</a>, <a class="el" href="plugin_8php.html#a905b54e10704b283ac64680a8abc0971">service_class_fetch()</a>, <a class="el" href="include_2config_8php.html#a61591371cb18764138655d67dc817ab2">set_pconfig()</a>, <a class="el" href="classConversation.html#a8898bddc1e8990e81dab9a13a532cc93">Conversation\set_profile_owner()</a>, <a class="el" href="classphoto__driver.html#a642a8d0c4ad5f887c99c6af77cee287b">photo_driver\store()</a>, <a class="el" href="taxonomy_8php.html#a4ba1339b2a7054971178ce194e4440fd">store_item_tag()</a>, <a class="el" href="socgraph_8php.html#a76e6fca3d2bc842dcd9e710bb87c8329">suggestion_query()</a>, <a class="el" href="dir__fns_8php.html#a6cae22cfdd6edda5ddf09e07abb3242a">syncdirs()</a>, <a class="el" href="items_8php.html#ab1bce4261bcf75ad62753b498a144d17">tag_deliver()</a>, <a class="el" href="taxonomy_8php.html#aaf90ba8b839d6459065f39a4f1109b8a">tagadelic()</a>, <a class="el" href="taxonomy_8php.html#ac21d1dff16d569e7d110167aea4e63c2">tagblock()</a>, <a class="el" href="items_8php.html#a88c6cf7649ac836fbbed82a7a0315110">tgroup_check()</a>, <a class="el" href="widgets_8php.html#a7b1e357b5a2027718470b77ec921fc65">widget_archive()</a>, <a class="el" href="widgets_8php.html#ad1bf7aa69e8d100d95faba17c7bc91cd">widget_follow()</a>, <a class="el" href="widgets_8php.html#a6dbc227aac750774284ee39c45f0a200">widget_tagcloud()</a>, and <a class="el" href="items_8php.html#a004e89d86b0f29b2c4da20108ecc4091">zot_feed()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a883f9f14e205f7aa7de02c14df67b40a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">if($uid) <a class="el" href="include_2config_8php.html#ac543813a980b3841cc5a277fcd4a24a6">load_pconfig</a>($uid</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/apw_2php_2style_8php.js b/doc/html/apw_2php_2style_8php.js
new file mode 100644
index 000000000..d92beec54
--- /dev/null
+++ b/doc/html/apw_2php_2style_8php.js
@@ -0,0 +1,5 @@
+var apw_2php_2style_8php =
+[
+ [ "$uid", "apw_2php_2style_8php.html#a109bbd7f4add27541707b191b73ef84a", null ],
+ [ "if", "apw_2php_2style_8php.html#a883f9f14e205f7aa7de02c14df67b40a", null ]
+]; \ No newline at end of file
diff --git a/doc/html/apw_2php_2theme_8php.html b/doc/html/apw_2php_2theme_8php.html
new file mode 100644
index 000000000..10f7b089c
--- /dev/null
+++ b/doc/html/apw_2php_2theme_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/apw/php/theme.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('apw_2php_2theme_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">theme.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a42167c539043a39a6b83c252d05f1e89"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="apw_2php_2theme_8php.html#a42167c539043a39a6b83c252d05f1e89">apw_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a42167c539043a39a6b83c252d05f1e89"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a42167c539043a39a6b83c252d05f1e89"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">apw_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/apw_2php_2theme_8php.js b/doc/html/apw_2php_2theme_8php.js
new file mode 100644
index 000000000..1cf9ba117
--- /dev/null
+++ b/doc/html/apw_2php_2theme_8php.js
@@ -0,0 +1,4 @@
+var apw_2php_2theme_8php =
+[
+ [ "apw_init", "apw_2php_2theme_8php.html#a42167c539043a39a6b83c252d05f1e89", null ]
+]; \ No newline at end of file
diff --git a/doc/html/auth_8php.html b/doc/html/auth_8php.html
new file mode 100644
index 000000000..79e1ce375
--- /dev/null
+++ b/doc/html/auth_8php.html
@@ -0,0 +1,199 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/auth.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('auth_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> &#124;
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle">
+<div class="title">auth.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a2add3a1129ffa4d5515442a9d52a9b1a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="auth_8php.html#a2add3a1129ffa4d5515442a9d52a9b1a">nuke_session</a> ()</td></tr>
+<tr class="separator:a2add3a1129ffa4d5515442a9d52a9b1a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a07bae0e623e2daa9ee2cd5a8aa294dee"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="auth_8php.html#a07bae0e623e2daa9ee2cd5a8aa294dee">account_verify_password</a> ($email, $pass)</td></tr>
+<tr class="separator:a07bae0e623e2daa9ee2cd5a8aa294dee"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:a0950af7c2888ca1d4743fe5d0bff9ae5"><td class="memItemLeft" align="right" valign="top"><a class="el" href="redbasic_2php_2style_8php.html#a883f9f14e205f7aa7de02c14df67b40a">if</a>((isset($_SESSION))&amp;&amp;(<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>($_SESSION,'authenticated'))&amp;&amp;((!(<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>($_POST,'auth-params')))||($_POST['auth-params']!== <br class="typebreak"/>
+'<a class="el" href="boot_8php.html#aefecf8599036df7f1b95d6820e0e2fa4">login</a>')))&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="auth_8php.html#a0950af7c2888ca1d4743fe5d0bff9ae5">else</a></td></tr>
+<tr class="separator:a0950af7c2888ca1d4743fe5d0bff9ae5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a07bae0e623e2daa9ee2cd5a8aa294dee"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">account_verify_password </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$email</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$pass</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Verify login credentials</p>
+<p>Returns account record on success, null on failure </p>
+<p>A plugin indicates successful login by setting 'authenticated' to non-zero value and returning a user record Plugins should never set 'authenticated' except to indicate success - as hooks may be chained and later plugins should not interfere with an earlier one that succeeded.</p>
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#afe534f826e4282b72d66e8cadca7bb73">api_login()</a>, <a class="el" href="removeme_8php.html#a7be08738beca44bb98a79e01cdb2ee88">removeme_post()</a>, and <a class="el" href="classRedBasicAuth.html#a8dfd9a0953f8884723b421b7c1acf79b">RedBasicAuth\validateUserPass()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a2add3a1129ffa4d5515442a9d52a9b1a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">nuke_session </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#a2e94eab9d6c164bfef7a1b2ab87b339b">api_account_logout()</a>.</p>
+
+</div>
+</div>
+<h2 class="groupheader">Variable Documentation</h2>
+<a class="anchor" id="a0950af7c2888ca1d4743fe5d0bff9ae5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="redbasic_2php_2style_8php.html#a883f9f14e205f7aa7de02c14df67b40a">if</a> ((isset($_SESSION))&amp;&amp;(<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>($_SESSION,'authenticated'))&amp;&amp;((!(<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>($_POST,'auth-params')))||($_POST['auth-params']!== '<a class="el" href="boot_8php.html#aefecf8599036df7f1b95d6820e0e2fa4">login</a>'))) else</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<b>Initial value:</b><div class="fragment"><div class="line">{</div>
+<div class="line"></div>
+<div class="line"> <span class="keywordflow">if</span>(isset($_SESSION)) {</div>
+<div class="line"> <a class="code" href="auth_8php.html#a2add3a1129ffa4d5515442a9d52a9b1a">nuke_session</a>();</div>
+<div class="line"> }</div>
+<div class="line"></div>
+<div class="line"> <span class="keywordflow">if</span>((<a class="code" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>($_POST,<span class="stringliteral">&#39;password&#39;</span>)) &amp;&amp; strlen($_POST[<span class="stringliteral">&#39;password&#39;</span>]))</div>
+<div class="line"> $encrypted = hash(<span class="stringliteral">&#39;whirlpool&#39;</span>,trim($_POST[<span class="stringliteral">&#39;password&#39;</span>]))</div>
+</div><!-- fragment -->
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/auth_8php.js b/doc/html/auth_8php.js
new file mode 100644
index 000000000..88b106675
--- /dev/null
+++ b/doc/html/auth_8php.js
@@ -0,0 +1,6 @@
+var auth_8php =
+[
+ [ "account_verify_password", "auth_8php.html#a07bae0e623e2daa9ee2cd5a8aa294dee", null ],
+ [ "nuke_session", "auth_8php.html#a2add3a1129ffa4d5515442a9d52a9b1a", null ],
+ [ "else", "auth_8php.html#a0950af7c2888ca1d4743fe5d0bff9ae5", null ]
+]; \ No newline at end of file
diff --git a/doc/html/bb2diaspora_8php.html b/doc/html/bb2diaspora_8php.html
new file mode 100644
index 000000000..a10d17d51
--- /dev/null
+++ b/doc/html/bb2diaspora_8php.html
@@ -0,0 +1,342 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/bb2diaspora.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('bb2diaspora_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">bb2diaspora.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a4c2f8f11b29a06809d9b07782215b1b2"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="bb2diaspora_8php.html#a4c2f8f11b29a06809d9b07782215b1b2">get_bb_tag_pos</a> ($s, $name, $occurance=1)</td></tr>
+<tr class="separator:a4c2f8f11b29a06809d9b07782215b1b2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad0abe1a7ee50aa0736a233df0a422eba"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="bb2diaspora_8php.html#ad0abe1a7ee50aa0736a233df0a422eba">bb_tag_preg_replace</a> ($pattern, $replace, $name, $s)</td></tr>
+<tr class="separator:ad0abe1a7ee50aa0736a233df0a422eba"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a26c09c218413610e62e60754c579f6c6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="bb2diaspora_8php.html#a26c09c218413610e62e60754c579f6c6">diaspora2bb</a> ($s)</td></tr>
+<tr class="separator:a26c09c218413610e62e60754c579f6c6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a180b0e3a7d702998be19e3c3b44b0e93"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="bb2diaspora_8php.html#a180b0e3a7d702998be19e3c3b44b0e93">stripdcode_br_cb</a> ($s)</td></tr>
+<tr class="separator:a180b0e3a7d702998be19e3c3b44b0e93"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:adc92ccda5f85ed27e64fcc17712c89cc"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="bb2diaspora_8php.html#adc92ccda5f85ed27e64fcc17712c89cc">diaspora_ul</a> ($s)</td></tr>
+<tr class="separator:adc92ccda5f85ed27e64fcc17712c89cc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8b96bd45884fa1c40b942939354197d4"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="bb2diaspora_8php.html#a8b96bd45884fa1c40b942939354197d4">diaspora_ol</a> ($s)</td></tr>
+<tr class="separator:a8b96bd45884fa1c40b942939354197d4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4f10e0876b27373c762bc1abbe745f5c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="bb2diaspora_8php.html#a4f10e0876b27373c762bc1abbe745f5c">bb2diaspora</a> ($Text, $preserve_nl=false, $fordiaspora=true)</td></tr>
+<tr class="separator:a4f10e0876b27373c762bc1abbe745f5c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a599428bceb6f6d82a6a78cb66811f747"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="bb2diaspora_8php.html#a599428bceb6f6d82a6a78cb66811f747">unescape_underscores_in_links</a> ($m)</td></tr>
+<tr class="separator:a599428bceb6f6d82a6a78cb66811f747"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a29a2ad41f5826f3975fa9a49934ff863"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="bb2diaspora_8php.html#a29a2ad41f5826f3975fa9a49934ff863">format_event_diaspora</a> ($ev)</td></tr>
+<tr class="separator:a29a2ad41f5826f3975fa9a49934ff863"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a4f10e0876b27373c762bc1abbe745f5c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">bb2diaspora </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$Text</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$preserve_nl</em> = <code>false</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$fordiaspora</em> = <code>true</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Transform #tags, strip off the [url] and replace spaces with underscore</p>
+
+<p>Referenced by <a class="el" href="bb2diaspora_8php.html#a29a2ad41f5826f3975fa9a49934ff863">format_event_diaspora()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ad0abe1a7ee50aa0736a233df0a422eba"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">bb_tag_preg_replace </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$pattern</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$replace</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$name</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="bb2diaspora_8php.html#a26c09c218413610e62e60754c579f6c6">diaspora2bb()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a26c09c218413610e62e60754c579f6c6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">diaspora2bb </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a8b96bd45884fa1c40b942939354197d4"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">diaspora_ol </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="adc92ccda5f85ed27e64fcc17712c89cc"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">diaspora_ul </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a29a2ad41f5826f3975fa9a49934ff863"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">format_event_diaspora </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$ev</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a4c2f8f11b29a06809d9b07782215b1b2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_bb_tag_pos </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$name</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$occurance</em> = <code>1</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="bb2diaspora_8php.html#ad0abe1a7ee50aa0736a233df0a422eba">bb_tag_preg_replace()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a180b0e3a7d702998be19e3c3b44b0e93"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">stripdcode_br_cb </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a599428bceb6f6d82a6a78cb66811f747"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">unescape_underscores_in_links </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$m</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/bb2diaspora_8php.js b/doc/html/bb2diaspora_8php.js
new file mode 100644
index 000000000..4b7e4db0f
--- /dev/null
+++ b/doc/html/bb2diaspora_8php.js
@@ -0,0 +1,12 @@
+var bb2diaspora_8php =
+[
+ [ "bb2diaspora", "bb2diaspora_8php.html#a4f10e0876b27373c762bc1abbe745f5c", null ],
+ [ "bb_tag_preg_replace", "bb2diaspora_8php.html#ad0abe1a7ee50aa0736a233df0a422eba", null ],
+ [ "diaspora2bb", "bb2diaspora_8php.html#a26c09c218413610e62e60754c579f6c6", null ],
+ [ "diaspora_ol", "bb2diaspora_8php.html#a8b96bd45884fa1c40b942939354197d4", null ],
+ [ "diaspora_ul", "bb2diaspora_8php.html#adc92ccda5f85ed27e64fcc17712c89cc", null ],
+ [ "format_event_diaspora", "bb2diaspora_8php.html#a29a2ad41f5826f3975fa9a49934ff863", null ],
+ [ "get_bb_tag_pos", "bb2diaspora_8php.html#a4c2f8f11b29a06809d9b07782215b1b2", null ],
+ [ "stripdcode_br_cb", "bb2diaspora_8php.html#a180b0e3a7d702998be19e3c3b44b0e93", null ],
+ [ "unescape_underscores_in_links", "bb2diaspora_8php.html#a599428bceb6f6d82a6a78cb66811f747", null ]
+]; \ No newline at end of file
diff --git a/doc/html/bbcode_8php.html b/doc/html/bbcode_8php.html
new file mode 100644
index 000000000..017512ee6
--- /dev/null
+++ b/doc/html/bbcode_8php.html
@@ -0,0 +1,300 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/bbcode.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('bbcode_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">bbcode.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a55b0cb6973f1ec731de0e726bcc0efa7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="bbcode_8php.html#a55b0cb6973f1ec731de0e726bcc0efa7">tryoembed</a> ($match)</td></tr>
+<tr class="separator:a55b0cb6973f1ec731de0e726bcc0efa7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8911e027907820df3db03b4f76724b50"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="bbcode_8php.html#a8911e027907820df3db03b4f76724b50">bb_spacefy</a> ($st)</td></tr>
+<tr class="separator:a8911e027907820df3db03b4f76724b50"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a064dcfd9767df6f53be1a0e11ceeb15d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="bbcode_8php.html#a064dcfd9767df6f53be1a0e11ceeb15d">bb_unspacefy_and_trim</a> ($st)</td></tr>
+<tr class="separator:a064dcfd9767df6f53be1a0e11ceeb15d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a851f5aafefe52474201b83f9fd65931f"><td class="memItemLeft" align="right" valign="top"><a class="el" href="redbasic_2php_2style_8php.html#a883f9f14e205f7aa7de02c14df67b40a">if</a>(!function_exists('bb_extract_images')) <br class="typebreak"/>
+<a class="el" href="redbasic_2php_2style_8php.html#a883f9f14e205f7aa7de02c14df67b40a">if</a>(!function_exists('bb_replace_images'))&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="bbcode_8php.html#a851f5aafefe52474201b83f9fd65931f">bb_parse_crypt</a> ($match)</td></tr>
+<tr class="separator:a851f5aafefe52474201b83f9fd65931f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a98d0eecc620c19561639f06cfbe8e74c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="bbcode_8php.html#a98d0eecc620c19561639f06cfbe8e74c">bb_qr</a> ($match)</td></tr>
+<tr class="separator:a98d0eecc620c19561639f06cfbe8e74c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1c69e021d5e0aef97d6966bf3169c86a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="bbcode_8php.html#a1c69e021d5e0aef97d6966bf3169c86a">bb_ShareAttributes</a> ($match)</td></tr>
+<tr class="separator:a1c69e021d5e0aef97d6966bf3169c86a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2be26414a367118143cc89e2d58e7377"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="bbcode_8php.html#a2be26414a367118143cc89e2d58e7377">bb_ShareAttributesSimple</a> ($match)</td></tr>
+<tr class="separator:a2be26414a367118143cc89e2d58e7377"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5165a5221a52cf1bc1d7812ebd2069c7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="bbcode_8php.html#a5165a5221a52cf1bc1d7812ebd2069c7">rpost_callback</a> ($match)</td></tr>
+<tr class="separator:a5165a5221a52cf1bc1d7812ebd2069c7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a009f61aaf78771737ed0765c8463911b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="bbcode_8php.html#a009f61aaf78771737ed0765c8463911b">bbcode</a> ($Text, $preserve_nl=false, $<a class="el" href="bbcode_8php.html#a55b0cb6973f1ec731de0e726bcc0efa7">tryoembed</a>=true)</td></tr>
+<tr class="separator:a009f61aaf78771737ed0765c8463911b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a851f5aafefe52474201b83f9fd65931f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="redbasic_2php_2style_8php.html#a883f9f14e205f7aa7de02c14df67b40a">if</a> (!function_exists('bb_extract_images')) <a class="el" href="redbasic_2php_2style_8php.html#a883f9f14e205f7aa7de02c14df67b40a">if</a> (!function_exists('bb_replace_images')) bb_parse_crypt </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$match</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a98d0eecc620c19561639f06cfbe8e74c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">bb_qr </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$match</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a1c69e021d5e0aef97d6966bf3169c86a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">bb_ShareAttributes </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$match</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a2be26414a367118143cc89e2d58e7377"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">bb_ShareAttributesSimple </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$match</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a8911e027907820df3db03b4f76724b50"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">bb_spacefy </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$st</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a064dcfd9767df6f53be1a0e11ceeb15d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">bb_unspacefy_and_trim </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$st</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a009f61aaf78771737ed0765c8463911b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">bbcode </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$Text</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$preserve_nl</em> = <code>false</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$tryoembed</em> = <code>true</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="bb2diaspora_8php.html#a4f10e0876b27373c762bc1abbe745f5c">bb2diaspora()</a>, <a class="el" href="items_8php.html#aa9e99613d38a97b39c8cf5449699c2ee">construct_activity_object()</a>, <a class="el" href="items_8php.html#aa579bc4445d60098b1410961ca8e96b7">construct_activity_target()</a>, <a class="el" href="dirprofile_8php.html#a3e1d30d3d93863ff5615f2df4ac7f052">dirprofile_init()</a>, <a class="el" href="events_8php.html#a1d293fb217ae6bc9e3858c4b32e363ec">events_content()</a>, <a class="el" href="event_8php.html#a2ac9f1b08de03250ecd794f705781d17">format_event_html()</a>, <a class="el" href="include_2notify_8php.html#a0e61728e487df50c72e6434f911a57d3">format_notification()</a>, <a class="el" href="identity_8php.html#ae381db3d43f8e7c1da8b15d14ecf5312">get_events()</a>, <a class="el" href="help_8php.html#af055e15f600ffa6fbca9386fdf715224">help_content()</a>, <a class="el" href="mail_8php.html#a3c7c485fc69f92371e8b20936040eca1">mail_content()</a>, <a class="el" href="mod_2message_8php.html#ac72dfed3ce08fcb331d66b37edc6e15f">message_content()</a>, <a class="el" href="enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc">notification()</a>, <a class="el" href="notifications_8php.html#aadd0b5525bd8c283a5d8a37982bbfe62">notifications_content()</a>, <a class="el" href="mod_2notify_8php.html#acdf3851688ebd6d6a575eb84ef9febe3">notify_content()</a>, <a class="el" href="ping_8php.html#a77217b1b190b4c5d8770867b45f0c0a1">ping_init()</a>, and <a class="el" href="tagrm_8php.html#adfd4ea5b4d7fc6d9c9e042af5cd7d49a">tagrm_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a5165a5221a52cf1bc1d7812ebd2069c7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">rpost_callback </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$match</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a55b0cb6973f1ec731de0e726bcc0efa7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">tryoembed </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$match</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/bbcode_8php.js b/doc/html/bbcode_8php.js
new file mode 100644
index 000000000..3f6137594
--- /dev/null
+++ b/doc/html/bbcode_8php.js
@@ -0,0 +1,12 @@
+var bbcode_8php =
+[
+ [ "bb_parse_crypt", "bbcode_8php.html#a851f5aafefe52474201b83f9fd65931f", null ],
+ [ "bb_qr", "bbcode_8php.html#a98d0eecc620c19561639f06cfbe8e74c", null ],
+ [ "bb_ShareAttributes", "bbcode_8php.html#a1c69e021d5e0aef97d6966bf3169c86a", null ],
+ [ "bb_ShareAttributesSimple", "bbcode_8php.html#a2be26414a367118143cc89e2d58e7377", null ],
+ [ "bb_spacefy", "bbcode_8php.html#a8911e027907820df3db03b4f76724b50", null ],
+ [ "bb_unspacefy_and_trim", "bbcode_8php.html#a064dcfd9767df6f53be1a0e11ceeb15d", null ],
+ [ "bbcode", "bbcode_8php.html#a009f61aaf78771737ed0765c8463911b", null ],
+ [ "rpost_callback", "bbcode_8php.html#a5165a5221a52cf1bc1d7812ebd2069c7", null ],
+ [ "tryoembed", "bbcode_8php.html#a55b0cb6973f1ec731de0e726bcc0efa7", null ]
+]; \ No newline at end of file
diff --git a/doc/html/bc_s.png b/doc/html/bc_s.png
new file mode 100644
index 000000000..224b29aa9
--- /dev/null
+++ b/doc/html/bc_s.png
Binary files differ
diff --git a/doc/html/bdwn.png b/doc/html/bdwn.png
new file mode 100644
index 000000000..940a0b950
--- /dev/null
+++ b/doc/html/bdwn.png
Binary files differ
diff --git a/doc/html/blocks_8php.html b/doc/html/blocks_8php.html
new file mode 100644
index 000000000..8993de9ed
--- /dev/null
+++ b/doc/html/blocks_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/blocks.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('blocks_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">blocks.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a2531a8fd51db3cecb2eb20c002c66e12"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="blocks_8php.html#a2531a8fd51db3cecb2eb20c002c66e12">blocks_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a2531a8fd51db3cecb2eb20c002c66e12"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a2531a8fd51db3cecb2eb20c002c66e12"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">blocks_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/blocks_8php.js b/doc/html/blocks_8php.js
new file mode 100644
index 000000000..b2123aa00
--- /dev/null
+++ b/doc/html/blocks_8php.js
@@ -0,0 +1,4 @@
+var blocks_8php =
+[
+ [ "blocks_content", "blocks_8php.html#a2531a8fd51db3cecb2eb20c002c66e12", null ]
+]; \ No newline at end of file
diff --git a/doc/html/blogga_2php_2README_8md.html b/doc/html/blogga_2php_2README_8md.html
new file mode 100644
index 000000000..77e6ad489
--- /dev/null
+++ b/doc/html/blogga_2php_2README_8md.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/blogga/php/README.md File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('blogga_2php_2README_8md.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">view/theme/blogga/php/README.md File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/blogga_2php_2theme_8php.html b/doc/html/blogga_2php_2theme_8php.html
new file mode 100644
index 000000000..7dec443c3
--- /dev/null
+++ b/doc/html/blogga_2php_2theme_8php.html
@@ -0,0 +1,138 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/blogga/php/theme.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('blogga_2php_2theme_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">theme.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:aa55c1cb1f05087b5002ecb633b550b1b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="blogga_2php_2theme_8php.html#aa55c1cb1f05087b5002ecb633b550b1b">blog_init</a> (&amp;$a)</td></tr>
+<tr class="separator:aa55c1cb1f05087b5002ecb633b550b1b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="aa55c1cb1f05087b5002ecb633b550b1b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">blog_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Name: Blogga Version: 0.6 Description: Blog theme ported from <a href="http://wordpress.org/extend/themes/twentyeleven">Twenty Eleven wordpress theme</a>, Licensed under <a href="http://www.gnu.org/licenses/gpl-2.0.html">GNU General Public License v2 or later</a> Author: Fabio <a href="http://kirgroup.com/profile/fabrixxm">http://kirgroup.com/profile/fabrixxm</a> Maintainer: Mike &lt;zot:<a href="#" onclick="location.href='mai'+'lto:'+'mik'+'e@'+'zot'+'hu'+'b.c'+'om'; return false;">mike@<span style="display: none;">.nosp@m.</span>zoth<span style="display: none;">.nosp@m.</span>ub.co<span style="display: none;">.nosp@m.</span>m</a>&gt; </p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/blogga_2php_2theme_8php.js b/doc/html/blogga_2php_2theme_8php.js
new file mode 100644
index 000000000..6564e93f7
--- /dev/null
+++ b/doc/html/blogga_2php_2theme_8php.js
@@ -0,0 +1,4 @@
+var blogga_2php_2theme_8php =
+[
+ [ "blog_init", "blogga_2php_2theme_8php.html#aa55c1cb1f05087b5002ecb633b550b1b", null ]
+]; \ No newline at end of file
diff --git a/doc/html/blogga_2view_2theme_2blog_2theme_8php.html b/doc/html/blogga_2view_2theme_2blog_2theme_8php.html
new file mode 100644
index 000000000..db3d2371d
--- /dev/null
+++ b/doc/html/blogga_2view_2theme_2blog_2theme_8php.html
@@ -0,0 +1,220 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/blogga/view/theme/blog/theme.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('blogga_2view_2theme_2blog_2theme_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">theme.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:aa55c1cb1f05087b5002ecb633b550b1b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="blogga_2view_2theme_2blog_2theme_8php.html#aa55c1cb1f05087b5002ecb633b550b1b">blog_init</a> (&amp;$a)</td></tr>
+<tr class="separator:aa55c1cb1f05087b5002ecb633b550b1b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aae58cc837fe56473d9f3370abfe533ae"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="blogga_2view_2theme_2blog_2theme_8php.html#aae58cc837fe56473d9f3370abfe533ae">blog_install</a> (&amp;$a)</td></tr>
+<tr class="separator:aae58cc837fe56473d9f3370abfe533ae"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3e77dbe111f330c64a1ff6c741cd515c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="blogga_2view_2theme_2blog_2theme_8php.html#a3e77dbe111f330c64a1ff6c741cd515c">blog_uninstall</a> (&amp;$a)</td></tr>
+<tr class="separator:a3e77dbe111f330c64a1ff6c741cd515c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af634a3f721c5e238530d0636d33230ec"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="blogga_2view_2theme_2blog_2theme_8php.html#af634a3f721c5e238530d0636d33230ec">blogtheme_imgurl</a> ($headimg)</td></tr>
+<tr class="separator:af634a3f721c5e238530d0636d33230ec"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a028ae8e9f2824670dfa76a6651d817e5"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="blogga_2view_2theme_2blog_2theme_8php.html#a028ae8e9f2824670dfa76a6651d817e5">blogtheme_display_item</a> (&amp;$a, &amp;$data)</td></tr>
+<tr class="separator:a028ae8e9f2824670dfa76a6651d817e5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="aa55c1cb1f05087b5002ecb633b550b1b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">blog_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Name: Blog Version: 0.6 Description: Blog theme ported from <a href="http://wordpress.org/extend/themes/twentyeleven">Twenty Eleven wordpress theme</a>, Licensed under <a href="http://www.gnu.org/licenses/gpl-2.0.html">GNU General Public License v2 or later</a> Author: Fabio <a href="http://kirgroup.com/profile/fabrixxm">http://kirgroup.com/profile/fabrixxm</a> Maintainer: Fabio <a href="http://kirgroup.com/profile/fabrixxm">http://kirgroup.com/profile/fabrixxm</a> </p>
+
+</div>
+</div>
+<a class="anchor" id="aae58cc837fe56473d9f3370abfe533ae"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">blog_install </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a3e77dbe111f330c64a1ff6c741cd515c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">blog_uninstall </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a028ae8e9f2824670dfa76a6651d817e5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">blogtheme_display_item </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$data</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="af634a3f721c5e238530d0636d33230ec"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">blogtheme_imgurl </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$headimg</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/blogga_2view_2theme_2blog_2theme_8php.js b/doc/html/blogga_2view_2theme_2blog_2theme_8php.js
new file mode 100644
index 000000000..2098cac8b
--- /dev/null
+++ b/doc/html/blogga_2view_2theme_2blog_2theme_8php.js
@@ -0,0 +1,8 @@
+var blogga_2view_2theme_2blog_2theme_8php =
+[
+ [ "blog_init", "blogga_2view_2theme_2blog_2theme_8php.html#aa55c1cb1f05087b5002ecb633b550b1b", null ],
+ [ "blog_install", "blogga_2view_2theme_2blog_2theme_8php.html#aae58cc837fe56473d9f3370abfe533ae", null ],
+ [ "blog_uninstall", "blogga_2view_2theme_2blog_2theme_8php.html#a3e77dbe111f330c64a1ff6c741cd515c", null ],
+ [ "blogtheme_display_item", "blogga_2view_2theme_2blog_2theme_8php.html#a028ae8e9f2824670dfa76a6651d817e5", null ],
+ [ "blogtheme_imgurl", "blogga_2view_2theme_2blog_2theme_8php.html#af634a3f721c5e238530d0636d33230ec", null ]
+]; \ No newline at end of file
diff --git a/doc/html/boot_8php.html b/doc/html/boot_8php.html
new file mode 100644
index 000000000..10681fc76
--- /dev/null
+++ b/doc/html/boot_8php.html
@@ -0,0 +1,4556 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: boot.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('boot_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Classes</a> &#124;
+<a href="#func-members">Functions</a> &#124;
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle">
+<div class="title">boot.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html">App</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:aca47505b8732177f52bb2d647eb2741c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#aca47505b8732177f52bb2d647eb2741c">startup</a> ()</td></tr>
+<tr class="separator:aca47505b8732177f52bb2d647eb2741c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0e6db7e365f2b041a828b93786f694bc"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a0e6db7e365f2b041a828b93786f694bc">get_app</a> ()</td></tr>
+<tr class="separator:a0e6db7e365f2b041a828b93786f694bc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a01353c9abebc3544ea080ac161729632"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a> ($s, $k=NULL)</td></tr>
+<tr class="separator:a01353c9abebc3544ea080ac161729632"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac608a34f3bc180e7724192e0fd31f9b0"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#ac608a34f3bc180e7724192e0fd31f9b0">system_unavailable</a> ()</td></tr>
+<tr class="separator:ac608a34f3bc180e7724192e0fd31f9b0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab79b8b4555cae20d03f8200666d89d63"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#ab79b8b4555cae20d03f8200666d89d63">clean_urls</a> ()</td></tr>
+<tr class="separator:ab79b8b4555cae20d03f8200666d89d63"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aba208673515cbb8a55e5fa4a1da99fda"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#aba208673515cbb8a55e5fa4a1da99fda">z_path</a> ()</td></tr>
+<tr class="separator:aba208673515cbb8a55e5fa4a1da99fda"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:add517a0958ac684792c62142a3877f81"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#add517a0958ac684792c62142a3877f81">z_root</a> ()</td></tr>
+<tr class="separator:add517a0958ac684792c62142a3877f81"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a081307d681d7d04f17b9ced2076e7c85"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a081307d681d7d04f17b9ced2076e7c85">absurl</a> ($path)</td></tr>
+<tr class="separator:a081307d681d7d04f17b9ced2076e7c85"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac17fc8a416ea79e9d5cb4dc9a8ff8c5c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#ac17fc8a416ea79e9d5cb4dc9a8ff8c5c">is_ajax</a> ()</td></tr>
+<tr class="separator:ac17fc8a416ea79e9d5cb4dc9a8ff8c5c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4c02d88e66852a01bd5a1feecb7c3ce3"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a4c02d88e66852a01bd5a1feecb7c3ce3">check_config</a> (&amp;$a)</td></tr>
+<tr class="separator:a4c02d88e66852a01bd5a1feecb7c3ce3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aca5e42678e178c6b9034610d66666fd7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#aca5e42678e178c6b9034610d66666fd7">fix_system_urls</a> ($oldurl, $newurl)</td></tr>
+<tr class="separator:aca5e42678e178c6b9034610d66666fd7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aefecf8599036df7f1b95d6820e0e2fa4"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#aefecf8599036df7f1b95d6820e0e2fa4">login</a> ($register=false, $form_id= 'main-login', $hiddens=false)</td></tr>
+<tr class="separator:aefecf8599036df7f1b95d6820e0e2fa4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aea7fc57a4d8e9dcb42f2601b0b9b761c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#aea7fc57a4d8e9dcb42f2601b0b9b761c">killme</a> ()</td></tr>
+<tr class="separator:aea7fc57a4d8e9dcb42f2601b0b9b761c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5ab6181607a090bcdbaa13b15b85aba1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a5ab6181607a090bcdbaa13b15b85aba1">goaway</a> ($s)</td></tr>
+<tr class="separator:a5ab6181607a090bcdbaa13b15b85aba1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afe88b920aa285982edb817a0dd44eb37"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#afe88b920aa285982edb817a0dd44eb37">get_account_id</a> ()</td></tr>
+<tr class="separator:afe88b920aa285982edb817a0dd44eb37"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad4c9dc2c8a82e8f52b7404c1655eab44"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#ad4c9dc2c8a82e8f52b7404c1655eab44">local_user</a> ()</td></tr>
+<tr class="separator:ad4c9dc2c8a82e8f52b7404c1655eab44"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5542c5c2806ab8bca04bad53d47b5209"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a5542c5c2806ab8bca04bad53d47b5209">remote_user</a> ()</td></tr>
+<tr class="separator:a5542c5c2806ab8bca04bad53d47b5209"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9255af5ae9c887520091ea04763c1a88"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a9255af5ae9c887520091ea04763c1a88">notice</a> ($s)</td></tr>
+<tr class="separator:a9255af5ae9c887520091ea04763c1a88"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:adfb2fc7be5a4226c0a8e24131da9d498"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#adfb2fc7be5a4226c0a8e24131da9d498">info</a> ($s)</td></tr>
+<tr class="separator:adfb2fc7be5a4226c0a8e24131da9d498"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a97769915c9f14adc4f8ab1ea2cecfd90"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a97769915c9f14adc4f8ab1ea2cecfd90">get_max_import_size</a> ()</td></tr>
+<tr class="separator:a97769915c9f14adc4f8ab1ea2cecfd90"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab346a2ece14993861f3e4206befa94f0"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#ab346a2ece14993861f3e4206befa94f0">proc_run</a> ($cmd)</td></tr>
+<tr class="separator:ab346a2ece14993861f3e4206befa94f0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad206598b909e8eb67eb0e0bb5ef69c13"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#ad206598b909e8eb67eb0e0bb5ef69c13">current_theme</a> ()</td></tr>
+<tr class="separator:ad206598b909e8eb67eb0e0bb5ef69c13"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a926cad0b3d8b9d9ee5da1898fc063ba3"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a926cad0b3d8b9d9ee5da1898fc063ba3">current_theme_url</a> ($installing=false)</td></tr>
+<tr class="separator:a926cad0b3d8b9d9ee5da1898fc063ba3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa1e828bbbcba170265eb2668d8daf42e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#aa1e828bbbcba170265eb2668d8daf42e">is_site_admin</a> ()</td></tr>
+<tr class="separator:aa1e828bbbcba170265eb2668d8daf42e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a719c7f3972d5f9268f37a41c76cd4ef6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a719c7f3972d5f9268f37a41c76cd4ef6">load_contact_links</a> ($uid)</td></tr>
+<tr class="separator:a719c7f3972d5f9268f37a41c76cd4ef6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9cbab4ee728e9a8b4ce952bae643044e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a9cbab4ee728e9a8b4ce952bae643044e">build_querystring</a> ($params, $name=null)</td></tr>
+<tr class="separator:a9cbab4ee728e9a8b4ce952bae643044e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abc0a90a1a77f5b668aa7e4b57d1776a7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#abc0a90a1a77f5b668aa7e4b57d1776a7">argc</a> ()</td></tr>
+<tr class="separator:abc0a90a1a77f5b668aa7e4b57d1776a7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a768f00b7d66be0daf7ef4eea2e862006"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a768f00b7d66be0daf7ef4eea2e862006">argv</a> ($<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>)</td></tr>
+<tr class="separator:a768f00b7d66be0daf7ef4eea2e862006"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3e0930933fb2c0bf8211cc7ab4e1c3b4"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a3e0930933fb2c0bf8211cc7ab4e1c3b4">dba_timer</a> ()</td></tr>
+<tr class="separator:a3e0930933fb2c0bf8211cc7ab4e1c3b4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a623e49c79943f3e7bdb770d021683cf7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a623e49c79943f3e7bdb770d021683cf7">get_observer_hash</a> ()</td></tr>
+<tr class="separator:a623e49c79943f3e7bdb770d021683cf7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa4221641e5c21db69fa52c426b9017f5"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#aa4221641e5c21db69fa52c426b9017f5">curPageURL</a> ()</td></tr>
+<tr class="separator:aa4221641e5c21db69fa52c426b9017f5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a899d24fd074594ceebbf72e1feff335f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a899d24fd074594ceebbf72e1feff335f">get_custom_nav</a> (&amp;$a, $navname)</td></tr>
+<tr class="separator:a899d24fd074594ceebbf72e1feff335f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acc4e0c910af066148b810e5fde55fff1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#acc4e0c910af066148b810e5fde55fff1">construct_page</a> (&amp;$a)</td></tr>
+<tr class="separator:acc4e0c910af066148b810e5fde55fff1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a75a90b0eadd0df510f7e63210733634d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a75a90b0eadd0df510f7e63210733634d">appdirpath</a> ()</td></tr>
+<tr class="separator:a75a90b0eadd0df510f7e63210733634d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0e4701c9742c3ef88f02ac450a042a84"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a0e4701c9742c3ef88f02ac450a042a84">head_set_icon</a> ($icon)</td></tr>
+<tr class="separator:a0e4701c9742c3ef88f02ac450a042a84"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a24a7a70afedd5d85fe0eadc85afa9f77"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a24a7a70afedd5d85fe0eadc85afa9f77">head_get_icon</a> ()</td></tr>
+<tr class="separator:a24a7a70afedd5d85fe0eadc85afa9f77"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:a96ad56755a21e1361dbd7bf93c9e7ff4"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a96ad56755a21e1361dbd7bf93c9e7ff4">RED_PLATFORM</a> 'Red Matrix'</td></tr>
+<tr class="separator:a96ad56755a21e1361dbd7bf93c9e7ff4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a21cc29e0025943e7c28ff58cb4856ac3"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a21cc29e0025943e7c28ff58cb4856ac3">RED_VERSION</a> trim(file_get_contents('version.inc')) . 'R'</td></tr>
+<tr class="separator:a21cc29e0025943e7c28ff58cb4856ac3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a36b31575f992a10b5927b76efba9362e"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a36b31575f992a10b5927b76efba9362e">ZOT_REVISION</a> 1</td></tr>
+<tr class="separator:a36b31575f992a10b5927b76efba9362e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac59a18a4838710d6c2de37aed6b21f03"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#ac59a18a4838710d6c2de37aed6b21f03">DB_UPDATE_VERSION</a> 1090</td></tr>
+<tr class="separator:ac59a18a4838710d6c2de37aed6b21f03"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0603d6ece8c5d37b4b7db697db053a4b"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a0603d6ece8c5d37b4b7db697db053a4b">EOL</a> '&lt;br /&gt;' . &quot;\r\n&quot;</td></tr>
+<tr class="separator:a0603d6ece8c5d37b4b7db697db053a4b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad34c1547020a305915bcc39707744690"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#ad34c1547020a305915bcc39707744690">ATOM_TIME</a> 'Y-m-d\TH:i:s\Z'</td></tr>
+<tr class="separator:ad34c1547020a305915bcc39707744690"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab7d65a7e7417825a4db62906bb600729"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#ab7d65a7e7417825a4db62906bb600729">DIRECTORY_MODE_NORMAL</a> 0x0000</td></tr>
+<tr class="separator:ab7d65a7e7417825a4db62906bb600729"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8a60cc38bb567765fd926fef70205f16"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a8a60cc38bb567765fd926fef70205f16">DIRECTORY_MODE_PRIMARY</a> 0x0001</td></tr>
+<tr class="separator:a8a60cc38bb567765fd926fef70205f16"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aedfb9501ed408278667995524e0d15cf"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#aedfb9501ed408278667995524e0d15cf">DIRECTORY_MODE_SECONDARY</a> 0x0002</td></tr>
+<tr class="separator:aedfb9501ed408278667995524e0d15cf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a25476eec71fceda237f7dc1d78b0adb8"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a25476eec71fceda237f7dc1d78b0adb8">DIRECTORY_MODE_STANDALONE</a> 0x0100</td></tr>
+<tr class="separator:a25476eec71fceda237f7dc1d78b0adb8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6b9909db6a7ec80ec6fdd40ba74014dd"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a6b9909db6a7ec80ec6fdd40ba74014dd">DIRECTORY_REALM</a> 'RED_GLOBAL'</td></tr>
+<tr class="separator:a6b9909db6a7ec80ec6fdd40ba74014dd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abedd940e664017c61b48c6efa31d0cb8"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#abedd940e664017c61b48c6efa31d0cb8">DIRECTORY_FALLBACK_MASTER</a> 'https://zothub.com'</td></tr>
+<tr class="separator:abedd940e664017c61b48c6efa31d0cb8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3475ff6c2e575f946ea0ee377e944173"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a3475ff6c2e575f946ea0ee377e944173">JPEG_QUALITY</a> 100</td></tr>
+<tr class="separator:a3475ff6c2e575f946ea0ee377e944173"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8df201788c9dd0ca91384e3a14c08bce"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a8df201788c9dd0ca91384e3a14c08bce">PNG_QUALITY</a> 8</td></tr>
+<tr class="separator:a8df201788c9dd0ca91384e3a14c08bce"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a17cf72338b040891781a4bcbdd9a8595"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a17cf72338b040891781a4bcbdd9a8595">LANGUAGE_DETECT_MIN_LENGTH</a> 128</td></tr>
+<tr class="separator:a17cf72338b040891781a4bcbdd9a8595"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a68d1d5bc9c7ccb663dc671b48c66df11"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a68d1d5bc9c7ccb663dc671b48c66df11">LANGUAGE_DETECT_MIN_CONFIDENCE</a> 0.01</td></tr>
+<tr class="separator:a68d1d5bc9c7ccb663dc671b48c66df11"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aecaa1b6945b317ba8f1daf4af2aed8e6"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#aecaa1b6945b317ba8f1daf4af2aed8e6">STORAGE_DEFAULT_PERMISSIONS</a> 0770</td></tr>
+<tr class="separator:aecaa1b6945b317ba8f1daf4af2aed8e6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a525ca93ff35d3535d1a2b8ba57876afa"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a525ca93ff35d3535d1a2b8ba57876afa">MAX_IMAGE_LENGTH</a> -1</td></tr>
+<tr class="separator:a525ca93ff35d3535d1a2b8ba57876afa"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa8a2b61e70900139d1ca28e46f1da49d"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#aa8a2b61e70900139d1ca28e46f1da49d">DEFAULT_DB_ENGINE</a> 'MyISAM'</td></tr>
+<tr class="separator:aa8a2b61e70900139d1ca28e46f1da49d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af86c651547aa8f9e549ee40a09455549"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#af86c651547aa8f9e549ee40a09455549">SSL_POLICY_NONE</a> 0</td></tr>
+<tr class="separator:af86c651547aa8f9e549ee40a09455549"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a02566ac9d891369a1d3ebb81a15722fc"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a02566ac9d891369a1d3ebb81a15722fc">SSL_POLICY_FULL</a> 1</td></tr>
+<tr class="separator:a02566ac9d891369a1d3ebb81a15722fc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:adca48aee78465ae3064ca4432c0d87b5"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#adca48aee78465ae3064ca4432c0d87b5">SSL_POLICY_SELFSIGN</a> 2</td></tr>
+<tr class="separator:adca48aee78465ae3064ca4432c0d87b5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a17b4ea23d9ecf628d9c8f53b7abcb805"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a17b4ea23d9ecf628d9c8f53b7abcb805">LOGGER_NORMAL</a> 0</td></tr>
+<tr class="separator:a17b4ea23d9ecf628d9c8f53b7abcb805"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a022cea669f9f13ef7c6268b63884c57f"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a022cea669f9f13ef7c6268b63884c57f">LOGGER_TRACE</a> 1</td></tr>
+<tr class="separator:a022cea669f9f13ef7c6268b63884c57f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a93823d15ae07548a4c49de88d325cd26"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a93823d15ae07548a4c49de88d325cd26">LOGGER_DEBUG</a> 2</td></tr>
+<tr class="separator:a93823d15ae07548a4c49de88d325cd26"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6969947145a139ec374ce098224d8e81"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a6969947145a139ec374ce098224d8e81">LOGGER_DATA</a> 3</td></tr>
+<tr class="separator:a6969947145a139ec374ce098224d8e81"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afe63ae69ba55299f813766e54df06ede"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#afe63ae69ba55299f813766e54df06ede">LOGGER_ALL</a> 4</td></tr>
+<tr class="separator:afe63ae69ba55299f813766e54df06ede"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a69aac276ed82e010dc382b16ab4d59e1"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a69aac276ed82e010dc382b16ab4d59e1">REGISTER_CLOSED</a> 0</td></tr>
+<tr class="separator:a69aac276ed82e010dc382b16ab4d59e1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7176c0f9f1c98421b97735d892cf6252"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a7176c0f9f1c98421b97735d892cf6252">REGISTER_APPROVE</a> 1</td></tr>
+<tr class="separator:a7176c0f9f1c98421b97735d892cf6252"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad8887b49bbb02dd30b4eb9f6c7773c63"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#ad8887b49bbb02dd30b4eb9f6c7773c63">REGISTER_OPEN</a> 2</td></tr>
+<tr class="separator:ad8887b49bbb02dd30b4eb9f6c7773c63"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7f3474fec541e261fc8dff47313c4017"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a7f3474fec541e261fc8dff47313c4017">ACCESS_PRIVATE</a> 0</td></tr>
+<tr class="separator:a7f3474fec541e261fc8dff47313c4017"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9c80420e5a063a4a87ce4831f086134d"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a9c80420e5a063a4a87ce4831f086134d">ACCESS_PAID</a> 1</td></tr>
+<tr class="separator:a9c80420e5a063a4a87ce4831f086134d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afbb1fe1b2c8c730ec8e08da93b6512c4"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#afbb1fe1b2c8c730ec8e08da93b6512c4">ACCESS_FREE</a> 2</td></tr>
+<tr class="separator:afbb1fe1b2c8c730ec8e08da93b6512c4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aeb1039302affcbe7e8872c01c08c88f8"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#aeb1039302affcbe7e8872c01c08c88f8">ACCESS_TIERED</a> 3</td></tr>
+<tr class="separator:aeb1039302affcbe7e8872c01c08c88f8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ada72d88ae39a7e3b45baea201cb49a29"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#ada72d88ae39a7e3b45baea201cb49a29">CONTACT_IS_FOLLOWER</a> 1</td></tr>
+<tr class="separator:ada72d88ae39a7e3b45baea201cb49a29"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6c5e9e293c8242dcb9bc2c3ea2fee2c9"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a6c5e9e293c8242dcb9bc2c3ea2fee2c9">CONTACT_IS_SHARING</a> 2</td></tr>
+<tr class="separator:a6c5e9e293c8242dcb9bc2c3ea2fee2c9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a27299ecfb9e9a99826f17a1c14c6995f"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a27299ecfb9e9a99826f17a1c14c6995f">CONTACT_IS_FRIEND</a> 3</td></tr>
+<tr class="separator:a27299ecfb9e9a99826f17a1c14c6995f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac86615ddc0763a00f5311c90e991730c"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#ac86615ddc0763a00f5311c90e991730c">UPDATE_SUCCESS</a> 0</td></tr>
+<tr class="separator:ac86615ddc0763a00f5311c90e991730c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a75fc600186b13c3b25e661afefb5eac8"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a75fc600186b13c3b25e661afefb5eac8">UPDATE_FAILED</a> 1</td></tr>
+<tr class="separator:a75fc600186b13c3b25e661afefb5eac8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a43c6c7d84d880e9500bd4f8f8ecc5731"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a43c6c7d84d880e9500bd4f8f8ecc5731">CLIENT_MODE_NORMAL</a> 0x0000</td></tr>
+<tr class="separator:a43c6c7d84d880e9500bd4f8f8ecc5731"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af6f6f6f40139f12fc09ec47373b30919"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#af6f6f6f40139f12fc09ec47373b30919">CLIENT_MODE_LOAD</a> 0x0001</td></tr>
+<tr class="separator:af6f6f6f40139f12fc09ec47373b30919"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3f40aa5bafff8c4eebdc62e5121daf77"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a3f40aa5bafff8c4eebdc62e5121daf77">CLIENT_MODE_UPDATE</a> 0x0002</td></tr>
+<tr class="separator:a3f40aa5bafff8c4eebdc62e5121daf77"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a09532c3f750ae8c4527e63b2b790cbf3"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a09532c3f750ae8c4527e63b2b790cbf3">PAGE_NORMAL</a> 0x0000</td></tr>
+<tr class="separator:a09532c3f750ae8c4527e63b2b790cbf3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5e322a2a2d0f51924c0b2e874988e640"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a5e322a2a2d0f51924c0b2e874988e640">PAGE_HIDDEN</a> 0x0001</td></tr>
+<tr class="separator:a5e322a2a2d0f51924c0b2e874988e640"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa275653b9c87abc7391bb8040c1c2de9"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#aa275653b9c87abc7391bb8040c1c2de9">PAGE_AUTOCONNECT</a> 0x0002</td></tr>
+<tr class="separator:aa275653b9c87abc7391bb8040c1c2de9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8231d115060d41a9c2a677f2c86f10ed"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a8231d115060d41a9c2a677f2c86f10ed">PAGE_APPLICATION</a> 0x0004</td></tr>
+<tr class="separator:a8231d115060d41a9c2a677f2c86f10ed"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5b8484922918946d041e5e0515dbe718"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a5b8484922918946d041e5e0515dbe718">PAGE_DIRECTORY_CHANNEL</a> 0x0008</td></tr>
+<tr class="separator:a5b8484922918946d041e5e0515dbe718"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab3920c2f3cd64802c0b7ff625c3b2ea8"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#ab3920c2f3cd64802c0b7ff625c3b2ea8">PAGE_PREMIUM</a> 0x0010</td></tr>
+<tr class="separator:ab3920c2f3cd64802c0b7ff625c3b2ea8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ace83842dbeb84f7ed9ac59a9f57a7c32"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#ace83842dbeb84f7ed9ac59a9f57a7c32">PAGE_ADULT</a> 0x0020</td></tr>
+<tr class="separator:ace83842dbeb84f7ed9ac59a9f57a7c32"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6ee7a72d558d1851bbb9e3cdde377932"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a6ee7a72d558d1851bbb9e3cdde377932">PAGE_SYSTEM</a> 0x1000</td></tr>
+<tr class="separator:a6ee7a72d558d1851bbb9e3cdde377932"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4edce16cb7f21cdafa1e85bf63d713e6"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a4edce16cb7f21cdafa1e85bf63d713e6">PAGE_REMOVED</a> 0x8000</td></tr>
+<tr class="separator:a4edce16cb7f21cdafa1e85bf63d713e6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4a49b29838ef2c45ab3556b52baec6a4"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a4a49b29838ef2c45ab3556b52baec6a4">PHOTO_NORMAL</a> 0x0000</td></tr>
+<tr class="separator:a4a49b29838ef2c45ab3556b52baec6a4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab4bc9c50ecc927b92d519e36562b0df0"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#ab4bc9c50ecc927b92d519e36562b0df0">PHOTO_PROFILE</a> 0x0001</td></tr>
+<tr class="separator:ab4bc9c50ecc927b92d519e36562b0df0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac43182e0d8bae7576a30b603774974f8"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#ac43182e0d8bae7576a30b603774974f8">PHOTO_XCHAN</a> 0x0002</td></tr>
+<tr class="separator:ac43182e0d8bae7576a30b603774974f8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a78849a1bf8ce8d9804b4cbb502e8f383"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a78849a1bf8ce8d9804b4cbb502e8f383">PHOTO_THING</a> 0x0004</td></tr>
+<tr class="separator:a78849a1bf8ce8d9804b4cbb502e8f383"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae3cef7b63e25e7bafea3fcf6b99fad0e"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#ae3cef7b63e25e7bafea3fcf6b99fad0e">NETWORK_DFRN</a> 'dfrn'</td></tr>
+<tr class="separator:ae3cef7b63e25e7bafea3fcf6b99fad0e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2c65e925994566a63e6c03c381f1b4a0"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a2c65e925994566a63e6c03c381f1b4a0">NETWORK_ZOT</a> 'zot!'</td></tr>
+<tr class="separator:a2c65e925994566a63e6c03c381f1b4a0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aef4b6c558c68c88c10f13c5a00c20e3d"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#aef4b6c558c68c88c10f13c5a00c20e3d">NETWORK_OSTATUS</a> 'stat'</td></tr>
+<tr class="separator:aef4b6c558c68c88c10f13c5a00c20e3d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab4bddb41a0cf407178ec5278b950c393"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#ab4bddb41a0cf407178ec5278b950c393">NETWORK_FEED</a> 'feed'</td></tr>
+<tr class="separator:ab4bddb41a0cf407178ec5278b950c393"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a38f6c7fe33b5434a24b4314567753dfa"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a38f6c7fe33b5434a24b4314567753dfa">NETWORK_DIASPORA</a> 'dspr'</td></tr>
+<tr class="separator:a38f6c7fe33b5434a24b4314567753dfa"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7236b2cdcf59f02a42302e893a99013b"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a7236b2cdcf59f02a42302e893a99013b">NETWORK_MAIL</a> 'mail'</td></tr>
+<tr class="separator:a7236b2cdcf59f02a42302e893a99013b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa17a4f9c63f5cbc5c06f1066b6aebc42"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#aa17a4f9c63f5cbc5c06f1066b6aebc42">NETWORK_MAIL2</a> 'mai2'</td></tr>
+<tr class="separator:aa17a4f9c63f5cbc5c06f1066b6aebc42"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af3905ea8f8568d0236db13fca40514e3"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#af3905ea8f8568d0236db13fca40514e3">NETWORK_FACEBOOK</a> 'face'</td></tr>
+<tr class="separator:af3905ea8f8568d0236db13fca40514e3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5b043b7fdcfd4e8c9c3747574afc6caa"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a5b043b7fdcfd4e8c9c3747574afc6caa">NETWORK_LINKEDIN</a> 'lnkd'</td></tr>
+<tr class="separator:a5b043b7fdcfd4e8c9c3747574afc6caa"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a43296b1b4398aacbf92a4b2d56bab91e"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a43296b1b4398aacbf92a4b2d56bab91e">NETWORK_XMPP</a> 'xmpp'</td></tr>
+<tr class="separator:a43296b1b4398aacbf92a4b2d56bab91e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae94f7c7c0909629a75aed1c41f10bc95"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#ae94f7c7c0909629a75aed1c41f10bc95">NETWORK_MYSPACE</a> 'mysp'</td></tr>
+<tr class="separator:ae94f7c7c0909629a75aed1c41f10bc95"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8905fde0a5b7882bdc083b20d9b34701"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a8905fde0a5b7882bdc083b20d9b34701">NETWORK_GPLUS</a> 'goog'</td></tr>
+<tr class="separator:a8905fde0a5b7882bdc083b20d9b34701"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab21fb0f3e6b962419955c6fc7f26734f"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#ab21fb0f3e6b962419955c6fc7f26734f">NETWORK_PHANTOM</a> 'unkn'</td></tr>
+<tr class="separator:ab21fb0f3e6b962419955c6fc7f26734f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aec36f8fcd4cb14a52934590b3d6666b4"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#aec36f8fcd4cb14a52934590b3d6666b4">PERMS_R_STREAM</a> 0x00001</td></tr>
+<tr class="separator:aec36f8fcd4cb14a52934590b3d6666b4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad789aef3cb95fc1eb36be7c4283d0137"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#ad789aef3cb95fc1eb36be7c4283d0137">PERMS_R_PROFILE</a> 0x00002</td></tr>
+<tr class="separator:ad789aef3cb95fc1eb36be7c4283d0137"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a29e921c0c72412cc738e44cca6ca1f62"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a29e921c0c72412cc738e44cca6ca1f62">PERMS_R_PHOTOS</a> 0x00004</td></tr>
+<tr class="separator:a29e921c0c72412cc738e44cca6ca1f62"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3d6d4fc5fafcc9156811669158541caf"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a3d6d4fc5fafcc9156811669158541caf">PERMS_R_ABOOK</a> 0x00008</td></tr>
+<tr class="separator:a3d6d4fc5fafcc9156811669158541caf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8bb0395933b5e886f086f6a2fb0bfa55"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a8bb0395933b5e886f086f6a2fb0bfa55">PERMS_W_STREAM</a> 0x00010</td></tr>
+<tr class="separator:a8bb0395933b5e886f086f6a2fb0bfa55"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6b14a31a8aa9f3452a13383f413bffa2"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a6b14a31a8aa9f3452a13383f413bffa2">PERMS_W_WALL</a> 0x00020</td></tr>
+<tr class="separator:a6b14a31a8aa9f3452a13383f413bffa2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a99a4a17cb644e7e6826ea07ecaf09777"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a99a4a17cb644e7e6826ea07ecaf09777">PERMS_W_TAGWALL</a> 0x00040</td></tr>
+<tr class="separator:a99a4a17cb644e7e6826ea07ecaf09777"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a32df13fec0e43281da5979e1f5579aa8"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a32df13fec0e43281da5979e1f5579aa8">PERMS_W_COMMENT</a> 0x00080</td></tr>
+<tr class="separator:a32df13fec0e43281da5979e1f5579aa8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6b31dd451bc6c37fe7c9c766ff385aaf"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a6b31dd451bc6c37fe7c9c766ff385aaf">PERMS_W_MAIL</a> 0x00100</td></tr>
+<tr class="separator:a6b31dd451bc6c37fe7c9c766ff385aaf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a57eee7352714c004d36c26dda74af73e"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a57eee7352714c004d36c26dda74af73e">PERMS_W_PHOTOS</a> 0x00200</td></tr>
+<tr class="separator:a57eee7352714c004d36c26dda74af73e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acd877c405b06b348b37b6f7e62a211e9"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#acd877c405b06b348b37b6f7e62a211e9">PERMS_W_CHAT</a> 0x00400</td></tr>
+<tr class="separator:acd877c405b06b348b37b6f7e62a211e9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a423505ab8dbd8e39d04ae3fe1374102b"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a423505ab8dbd8e39d04ae3fe1374102b">PERMS_A_DELEGATE</a> 0x00800</td></tr>
+<tr class="separator:a423505ab8dbd8e39d04ae3fe1374102b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1db4f0009c9cb4e107eab0f914a3c8dc"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a1db4f0009c9cb4e107eab0f914a3c8dc">PERMS_R_STORAGE</a> 0x01000</td></tr>
+<tr class="separator:a1db4f0009c9cb4e107eab0f914a3c8dc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4fefd7486d3b888a05cfd3dc9575f115"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a4fefd7486d3b888a05cfd3dc9575f115">PERMS_W_STORAGE</a> 0x02000</td></tr>
+<tr class="separator:a4fefd7486d3b888a05cfd3dc9575f115"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab51965fabe54dc031e9a0ce1142ee83e"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#ab51965fabe54dc031e9a0ce1142ee83e">PERMS_R_PAGES</a> 0x04000</td></tr>
+<tr class="separator:ab51965fabe54dc031e9a0ce1142ee83e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa9244fc9cc221980c07a20cc534111be"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#aa9244fc9cc221980c07a20cc534111be">PERMS_W_PAGES</a> 0x08000</td></tr>
+<tr class="separator:aa9244fc9cc221980c07a20cc534111be"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aae6c941bde5fd6fce07e51dba7326ead"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#aae6c941bde5fd6fce07e51dba7326ead">PERMS_A_REPUBLISH</a> 0x10000</td></tr>
+<tr class="separator:aae6c941bde5fd6fce07e51dba7326ead"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aff210e8403dd72368522b17fb6e5d4e7"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#aff210e8403dd72368522b17fb6e5d4e7">PERMS_PUBLIC</a> 0x0001</td></tr>
+<tr class="separator:aff210e8403dd72368522b17fb6e5d4e7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6df1102664f64b274810db85197c2755"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a6df1102664f64b274810db85197c2755">PERMS_NETWORK</a> 0x0002</td></tr>
+<tr class="separator:a6df1102664f64b274810db85197c2755"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9ff652e5cb83cd11cbb0350844e7b28f"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a9ff652e5cb83cd11cbb0350844e7b28f">PERMS_SITE</a> 0x0004</td></tr>
+<tr class="separator:a9ff652e5cb83cd11cbb0350844e7b28f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab2d0e8a9b81ee548ef2ce8e4560da2f6"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#ab2d0e8a9b81ee548ef2ce8e4560da2f6">PERMS_CONTACTS</a> 0x0008</td></tr>
+<tr class="separator:ab2d0e8a9b81ee548ef2ce8e4560da2f6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9cc986b4f9dd6558cbb2e25aadbfd964"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a9cc986b4f9dd6558cbb2e25aadbfd964">PERMS_SPECIFIC</a> 0x0080</td></tr>
+<tr class="separator:a9cc986b4f9dd6558cbb2e25aadbfd964"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a52b599cd13e152ebc80d7e4413683195"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a52b599cd13e152ebc80d7e4413683195">ABOOK_FLAG_BLOCKED</a> 0x0001</td></tr>
+<tr class="separator:a52b599cd13e152ebc80d7e4413683195"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa3425e2de85b08f7041656d3a8502cb6"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#aa3425e2de85b08f7041656d3a8502cb6">ABOOK_FLAG_IGNORED</a> 0x0002</td></tr>
+<tr class="separator:aa3425e2de85b08f7041656d3a8502cb6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a34c756469ebed32e2fc987bcde62d382"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a34c756469ebed32e2fc987bcde62d382">ABOOK_FLAG_HIDDEN</a> 0x0004</td></tr>
+<tr class="separator:a34c756469ebed32e2fc987bcde62d382"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a222395aa223cfbff6166fab0b4e2e1d5"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a222395aa223cfbff6166fab0b4e2e1d5">ABOOK_FLAG_ARCHIVED</a> 0x0008</td></tr>
+<tr class="separator:a222395aa223cfbff6166fab0b4e2e1d5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a68eebe493e6f729ffd1aeda7a4b11155"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a68eebe493e6f729ffd1aeda7a4b11155">ABOOK_FLAG_PENDING</a> 0x0010</td></tr>
+<tr class="separator:a68eebe493e6f729ffd1aeda7a4b11155"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0450389f24c632906fbc24347700a543"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a0450389f24c632906fbc24347700a543">ABOOK_FLAG_SELF</a> 0x0080</td></tr>
+<tr class="separator:a0450389f24c632906fbc24347700a543"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad0876e837cf3fad8a26417e315f6e2c8"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#ad0876e837cf3fad8a26417e315f6e2c8">MAIL_DELETED</a> 0x0001</td></tr>
+<tr class="separator:ad0876e837cf3fad8a26417e315f6e2c8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa3679df31c8dad1b71816b0322d5baff"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#aa3679df31c8dad1b71816b0322d5baff">MAIL_REPLIED</a> 0x0002</td></tr>
+<tr class="separator:aa3679df31c8dad1b71816b0322d5baff"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa544a6c078130d0967a1f4ed8ce0a2d2"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#aa544a6c078130d0967a1f4ed8ce0a2d2">MAIL_ISREPLY</a> 0x0004</td></tr>
+<tr class="separator:aa544a6c078130d0967a1f4ed8ce0a2d2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1fbb93cf030f07391f22cc2948744869"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a1fbb93cf030f07391f22cc2948744869">MAIL_SEEN</a> 0x0008</td></tr>
+<tr class="separator:a1fbb93cf030f07391f22cc2948744869"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae4861de36017fe399c1839f778bad9f5"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#ae4861de36017fe399c1839f778bad9f5">MAIL_RECALLED</a> 0x0010</td></tr>
+<tr class="separator:ae4861de36017fe399c1839f778bad9f5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a44ae1542a805ffd7f826fb511db07374"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a44ae1542a805ffd7f826fb511db07374">MAIL_OBSCURED</a> 0x0020</td></tr>
+<tr class="separator:a44ae1542a805ffd7f826fb511db07374"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa74438cf71e48e37bf7b440b94243985"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#aa74438cf71e48e37bf7b440b94243985">ATTACH_FLAG_DIR</a> 0x0001</td></tr>
+<tr class="separator:aa74438cf71e48e37bf7b440b94243985"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a781916f83fcc8ff1035649afa45f0292"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a781916f83fcc8ff1035649afa45f0292">ATTACH_FLAG_OS</a> 0x0002</td></tr>
+<tr class="separator:a781916f83fcc8ff1035649afa45f0292"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aed0dfb35f7dd00dc9e4f868ea7f7ff53"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#aed0dfb35f7dd00dc9e4f868ea7f7ff53">MENU_ITEM_ZID</a> 0x0001</td></tr>
+<tr class="separator:aed0dfb35f7dd00dc9e4f868ea7f7ff53"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad11f30a6590d3d77f0c5e1e3909af8f5"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#ad11f30a6590d3d77f0c5e1e3909af8f5">MENU_ITEM_NEWWIN</a> 0x0002</td></tr>
+<tr class="separator:ad11f30a6590d3d77f0c5e1e3909af8f5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad88a70ec62e08d590123d3697dfe64d5"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#ad88a70ec62e08d590123d3697dfe64d5">POLL_SIMPLE_RATING</a> 0x0001</td></tr>
+<tr class="separator:ad88a70ec62e08d590123d3697dfe64d5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1ba00027b718db732f30fc0e2c3e0abc"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a1ba00027b718db732f30fc0e2c3e0abc">POLL_TENSCALE</a> 0x0002</td></tr>
+<tr class="separator:a1ba00027b718db732f30fc0e2c3e0abc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abbf5ac24eb8aeedb862f618ee0d21e86"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#abbf5ac24eb8aeedb862f618ee0d21e86">POLL_MULTIPLE_CHOICE</a> 0x0004</td></tr>
+<tr class="separator:abbf5ac24eb8aeedb862f618ee0d21e86"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2b525996e4426bdddbcec277778bde08"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a2b525996e4426bdddbcec277778bde08">POLL_OVERWRITE</a> 0x8000</td></tr>
+<tr class="separator:a2b525996e4426bdddbcec277778bde08"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9690d73434125ce594a1f5e7c2a4f7c0"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a9690d73434125ce594a1f5e7c2a4f7c0">UPDATE_FLAGS_UPDATED</a> 0x0001</td></tr>
+<tr class="separator:a9690d73434125ce594a1f5e7c2a4f7c0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aea392cb26ed617f3a8cde648385b5df0"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#aea392cb26ed617f3a8cde648385b5df0">UPDATE_FLAGS_DELETED</a> 0x1000</td></tr>
+<tr class="separator:aea392cb26ed617f3a8cde648385b5df0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a35625dacd2158b9f1f1a8e77f9f081fd"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a35625dacd2158b9f1f1a8e77f9f081fd">MAX_LIKERS</a> 75</td></tr>
+<tr class="separator:a35625dacd2158b9f1f1a8e77f9f081fd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3cd42a70c6b3999590e4fd7a1a9096af"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a3cd42a70c6b3999590e4fd7a1a9096af">ZCURL_TIMEOUT</a> (-1)</td></tr>
+<tr class="separator:a3cd42a70c6b3999590e4fd7a1a9096af"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a56fd673eaa7014150297ce1162502db5"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a56fd673eaa7014150297ce1162502db5">NOTIFY_INTRO</a> 0x0001</td></tr>
+<tr class="separator:a56fd673eaa7014150297ce1162502db5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af8c0cb0744c9a6b5d6d3baafb1f1e71d"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#af8c0cb0744c9a6b5d6d3baafb1f1e71d">NOTIFY_CONFIRM</a> 0x0002</td></tr>
+<tr class="separator:af8c0cb0744c9a6b5d6d3baafb1f1e71d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a505410c7edc5f5bb5fa227b98359793e"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a505410c7edc5f5bb5fa227b98359793e">NOTIFY_WALL</a> 0x0004</td></tr>
+<tr class="separator:a505410c7edc5f5bb5fa227b98359793e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a20f0eed431d25870b624b8937a07a59f"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a20f0eed431d25870b624b8937a07a59f">NOTIFY_COMMENT</a> 0x0008</td></tr>
+<tr class="separator:a20f0eed431d25870b624b8937a07a59f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a285732e7889fa7f333cbe431111e1029"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a285732e7889fa7f333cbe431111e1029">NOTIFY_MAIL</a> 0x0010</td></tr>
+<tr class="separator:a285732e7889fa7f333cbe431111e1029"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9d01ef178b72b145016cca1393415bc4"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a9d01ef178b72b145016cca1393415bc4">NOTIFY_SUGGEST</a> 0x0020</td></tr>
+<tr class="separator:a9d01ef178b72b145016cca1393415bc4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a981d46380f9f23c308bac1f9cb00dc5b"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a981d46380f9f23c308bac1f9cb00dc5b">NOTIFY_PROFILE</a> 0x0040</td></tr>
+<tr class="separator:a981d46380f9f23c308bac1f9cb00dc5b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab724491497ab2618b23a01d5da60aec0"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#ab724491497ab2618b23a01d5da60aec0">NOTIFY_TAGSELF</a> 0x0080</td></tr>
+<tr class="separator:ab724491497ab2618b23a01d5da60aec0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af6937db5f581d006bf4a5c3d9c7e0461"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#af6937db5f581d006bf4a5c3d9c7e0461">NOTIFY_TAGSHARE</a> 0x0100</td></tr>
+<tr class="separator:af6937db5f581d006bf4a5c3d9c7e0461"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aca08bc4f1554ba877500f6abcc99e1e8"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#aca08bc4f1554ba877500f6abcc99e1e8">NOTIFY_POKE</a> 0x0200</td></tr>
+<tr class="separator:aca08bc4f1554ba877500f6abcc99e1e8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a14d44d4a00223dc3db4ea962325db192"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a14d44d4a00223dc3db4ea962325db192">NOTIFY_SYSTEM</a> 0x8000</td></tr>
+<tr class="separator:a14d44d4a00223dc3db4ea962325db192"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3ad9cc5d4354be741fa1de12b96e9955"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a3ad9cc5d4354be741fa1de12b96e9955">HUBLOC_FLAGS_PRIMARY</a> 0x0001</td></tr>
+<tr class="separator:a3ad9cc5d4354be741fa1de12b96e9955"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab54b24cc302e1a42a67a49d788b6b764"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#ab54b24cc302e1a42a67a49d788b6b764">HUBLOC_FLAGS_UNVERIFIED</a> 0x0002</td></tr>
+<tr class="separator:ab54b24cc302e1a42a67a49d788b6b764"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7c286add8961fd2d79216314cd4aadd8"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a7c286add8961fd2d79216314cd4aadd8">HUBLOC_FLAGS_DELETED</a> 0x1000</td></tr>
+<tr class="separator:a7c286add8961fd2d79216314cd4aadd8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8fdcc4ffb365a3267bd02ce8a8d466d6"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a8fdcc4ffb365a3267bd02ce8a8d466d6">XCHAN_FLAGS_NORMAL</a> 0x0000</td></tr>
+<tr class="separator:a8fdcc4ffb365a3267bd02ce8a8d466d6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1af3ed96de14aa0d7891b39cc75b60f2"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a1af3ed96de14aa0d7891b39cc75b60f2">XCHAN_FLAGS_HIDDEN</a> 0x0001</td></tr>
+<tr class="separator:a1af3ed96de14aa0d7891b39cc75b60f2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1c923b99bf77e4203ae94e5684b6ad0f"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a1c923b99bf77e4203ae94e5684b6ad0f">XCHAN_FLAGS_ORPHAN</a> 0x0002</td></tr>
+<tr class="separator:a1c923b99bf77e4203ae94e5684b6ad0f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:accd6f36cc9f40225cbd720e4d12a7c6e"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#accd6f36cc9f40225cbd720e4d12a7c6e">XCHAN_FLAGS_CENSORED</a> 0x0004</td></tr>
+<tr class="separator:accd6f36cc9f40225cbd720e4d12a7c6e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5a681a672e007cdc22b43345d71f07c6"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a5a681a672e007cdc22b43345d71f07c6">XCHAN_FLAGS_SELFCENSORED</a> 0x0008</td></tr>
+<tr class="separator:a5a681a672e007cdc22b43345d71f07c6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afef254290febac854c85fc698d9483a6"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#afef254290febac854c85fc698d9483a6">XCHAN_FLAGS_SYSTEM</a> 0x0010</td></tr>
+<tr class="separator:afef254290febac854c85fc698d9483a6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9ea1290e00c6d40684892047f2c778a9"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a9ea1290e00c6d40684892047f2c778a9">XCHAN_FLAGS_DELETED</a> 0x1000</td></tr>
+<tr class="separator:a9ea1290e00c6d40684892047f2c778a9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa589421267f0c2f0d643f727792cce35"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#aa589421267f0c2f0d643f727792cce35">HUBLOC_NOTUSED</a> 0x0000</td></tr>
+<tr class="separator:aa589421267f0c2f0d643f727792cce35"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3b56bfc6a0dd159070e316ddac3b7456"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a3b56bfc6a0dd159070e316ddac3b7456">HUBLOC_SEND_ERROR</a> 0x0001</td></tr>
+<tr class="separator:a3b56bfc6a0dd159070e316ddac3b7456"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abeb4d86e17cefa8584f1244e2183b0e1"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#abeb4d86e17cefa8584f1244e2183b0e1">HUBLOC_RECEIVE_ERROR</a> 0x0002</td></tr>
+<tr class="separator:abeb4d86e17cefa8584f1244e2183b0e1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7a8ba64d089cc0412c59a2eefc6d655c"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a7a8ba64d089cc0412c59a2eefc6d655c">HUBLOC_WORKS</a> 0x0004</td></tr>
+<tr class="separator:a7a8ba64d089cc0412c59a2eefc6d655c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a845891f82bf6edd7fa2d578b66703112"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a845891f82bf6edd7fa2d578b66703112">HUBLOC_OFFLINE</a> 0x0008</td></tr>
+<tr class="separator:a845891f82bf6edd7fa2d578b66703112"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0c59dde058efebbc66520d136cbd1631"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a0c59dde058efebbc66520d136cbd1631">TERM_UNKNOWN</a> 0</td></tr>
+<tr class="separator:a0c59dde058efebbc66520d136cbd1631"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2750985ec445617d7e82ae3098c91e3f"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a2750985ec445617d7e82ae3098c91e3f">TERM_HASHTAG</a> 1</td></tr>
+<tr class="separator:a2750985ec445617d7e82ae3098c91e3f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae37444eaa42705185080ccf3e670cbc2"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#ae37444eaa42705185080ccf3e670cbc2">TERM_MENTION</a> 2</td></tr>
+<tr class="separator:ae37444eaa42705185080ccf3e670cbc2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af33d1b2e98a1e21af672005525d46dfe"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#af33d1b2e98a1e21af672005525d46dfe">TERM_CATEGORY</a> 3</td></tr>
+<tr class="separator:af33d1b2e98a1e21af672005525d46dfe"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a45b12aefab9675baffc7a07a09486db8"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a45b12aefab9675baffc7a07a09486db8">TERM_PCATEGORY</a> 4</td></tr>
+<tr class="separator:a45b12aefab9675baffc7a07a09486db8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afb97615e985a013799839b68b99018d7"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#afb97615e985a013799839b68b99018d7">TERM_FILE</a> 5</td></tr>
+<tr class="separator:afb97615e985a013799839b68b99018d7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abd7bb40da9cc073297e49736b338ca07"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#abd7bb40da9cc073297e49736b338ca07">TERM_SAVEDSEARCH</a> 6</td></tr>
+<tr class="separator:abd7bb40da9cc073297e49736b338ca07"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0d877df1e20bae765e1708be50f6b503"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a0d877df1e20bae765e1708be50f6b503">TERM_THING</a> 7</td></tr>
+<tr class="separator:a0d877df1e20bae765e1708be50f6b503"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9eeb8989272d5ff804a616898bb13659"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a9eeb8989272d5ff804a616898bb13659">TERM_OBJ_POST</a> 1</td></tr>
+<tr class="separator:a9eeb8989272d5ff804a616898bb13659"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a64617d4655804de2a3c86501ab4fdbfd"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a64617d4655804de2a3c86501ab4fdbfd">TERM_OBJ_PHOTO</a> 2</td></tr>
+<tr class="separator:a64617d4655804de2a3c86501ab4fdbfd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aead84fa27d7516b855220fe004964a45"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#aead84fa27d7516b855220fe004964a45">TERM_OBJ_PROFILE</a> 3</td></tr>
+<tr class="separator:aead84fa27d7516b855220fe004964a45"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8892374789fd261eb32a7969d934a14a"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a8892374789fd261eb32a7969d934a14a">TERM_OBJ_CHANNEL</a> 4</td></tr>
+<tr class="separator:a8892374789fd261eb32a7969d934a14a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a882b666adfe21f035a0f8c02806066d6"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a882b666adfe21f035a0f8c02806066d6">TERM_OBJ_OBJECT</a> 5</td></tr>
+<tr class="separator:a882b666adfe21f035a0f8c02806066d6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0cc8dc76bd10ac0ec81bac08a46f82fe"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a0cc8dc76bd10ac0ec81bac08a46f82fe">TERM_OBJ_THING</a> 6</td></tr>
+<tr class="separator:a0cc8dc76bd10ac0ec81bac08a46f82fe"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a49f2a70b3b43aa904223a8d19e986a47"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a49f2a70b3b43aa904223a8d19e986a47">NAMESPACE_ZOT</a> 'http://purl.org/zot'</td></tr>
+<tr class="separator:a49f2a70b3b43aa904223a8d19e986a47"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7ed4581ab66ebcde97f6b3730856b028"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a7ed4581ab66ebcde97f6b3730856b028">NAMESPACE_DFRN</a> 'http://purl.org/macgirvin/dfrn/1.0'</td></tr>
+<tr class="separator:a7ed4581ab66ebcde97f6b3730856b028"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1d6e7f4c08bb68e4a424326a811bdd86"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a1d6e7f4c08bb68e4a424326a811bdd86">NAMESPACE_THREAD</a> 'http://purl.org/syndication/thread/1.0'</td></tr>
+<tr class="separator:a1d6e7f4c08bb68e4a424326a811bdd86"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4bfe22e163657690dfb6d5b1d04cb47e"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a4bfe22e163657690dfb6d5b1d04cb47e">NAMESPACE_TOMB</a> 'http://purl.org/atompub/tombstones/1.0'</td></tr>
+<tr class="separator:a4bfe22e163657690dfb6d5b1d04cb47e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5df5359090d1f8e898c36d7cf8878ad2"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a5df5359090d1f8e898c36d7cf8878ad2">NAMESPACE_ACTIVITY</a> 'http://activitystrea.ms/spec/1.0/'</td></tr>
+<tr class="separator:a5df5359090d1f8e898c36d7cf8878ad2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7b8f8ad9dbe82711257d23891ef6b133"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133">NAMESPACE_ACTIVITY_SCHEMA</a> 'http://activitystrea.ms/schema/1.0/'</td></tr>
+<tr class="separator:a7b8f8ad9dbe82711257d23891ef6b133"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6626f383c3d2d459f731ab8b4f237d16"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a6626f383c3d2d459f731ab8b4f237d16">NAMESPACE_MEDIA</a> 'http://purl.org/syndication/atommedia'</td></tr>
+<tr class="separator:a6626f383c3d2d459f731ab8b4f237d16"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aee324eca9de4e0fedf01ab5f92e27c67"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#aee324eca9de4e0fedf01ab5f92e27c67">NAMESPACE_SALMON_ME</a> 'http://salmon-protocol.org/ns/magic-env'</td></tr>
+<tr class="separator:aee324eca9de4e0fedf01ab5f92e27c67"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a181c111f4b6c14d091dfd3bf0d0a22cd"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a181c111f4b6c14d091dfd3bf0d0a22cd">NAMESPACE_OSTATUSSUB</a> 'http://ostatus.org/schema/1.0/subscribe'</td></tr>
+<tr class="separator:a181c111f4b6c14d091dfd3bf0d0a22cd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a03d19251c245587de7ed959300b87bdf"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a03d19251c245587de7ed959300b87bdf">NAMESPACE_GEORSS</a> 'http://www.georss.org/georss'</td></tr>
+<tr class="separator:a03d19251c245587de7ed959300b87bdf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0b73e2548d6f9beb9c93211f488e336a"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a0b73e2548d6f9beb9c93211f488e336a">NAMESPACE_POCO</a> 'http://portablecontacts.net/spec/1.0'</td></tr>
+<tr class="separator:a0b73e2548d6f9beb9c93211f488e336a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac195fc9003298923ea81f144388e24b1"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#ac195fc9003298923ea81f144388e24b1">NAMESPACE_FEED</a> 'http://schemas.google.com/g/2010#updates-from'</td></tr>
+<tr class="separator:ac195fc9003298923ea81f144388e24b1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acca19aae62e1a6951a856b945de20d67"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#acca19aae62e1a6951a856b945de20d67">NAMESPACE_OSTATUS</a> 'http://ostatus.org/schema/1.0'</td></tr>
+<tr class="separator:acca19aae62e1a6951a856b945de20d67"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afaf93b7026f784b113b4f8921745891e"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#afaf93b7026f784b113b4f8921745891e">NAMESPACE_STATUSNET</a> 'http://status.net/schema/api/1/'</td></tr>
+<tr class="separator:afaf93b7026f784b113b4f8921745891e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a444ce608ce34efb82ee11852f36e825f"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a444ce608ce34efb82ee11852f36e825f">NAMESPACE_ATOM1</a> 'http://www.w3.org/2005/Atom'</td></tr>
+<tr class="separator:a444ce608ce34efb82ee11852f36e825f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abdcdfc873ace4e0902177bad934de0c0"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#abdcdfc873ace4e0902177bad934de0c0">ACTIVITY_LIKE</a> <a class="el" href="boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133">NAMESPACE_ACTIVITY_SCHEMA</a> . 'like'</td></tr>
+<tr class="separator:abdcdfc873ace4e0902177bad934de0c0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0e57f846e6d47a308feced0f7274f178"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a0e57f846e6d47a308feced0f7274f178">ACTIVITY_DISLIKE</a> <a class="el" href="boot_8php.html#a49f2a70b3b43aa904223a8d19e986a47">NAMESPACE_ZOT</a> . '/activity/dislike'</td></tr>
+<tr class="separator:a0e57f846e6d47a308feced0f7274f178"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad302cb26b838898d475f57f61b0fcc9f"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#ad302cb26b838898d475f57f61b0fcc9f">ACTIVITY_OBJ_HEART</a> <a class="el" href="boot_8php.html#a49f2a70b3b43aa904223a8d19e986a47">NAMESPACE_ZOT</a> . '/activity/heart'</td></tr>
+<tr class="separator:ad302cb26b838898d475f57f61b0fcc9f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a176664e78dcb9132e16be69418223eb2"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a176664e78dcb9132e16be69418223eb2">ACTIVITY_FRIEND</a> <a class="el" href="boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133">NAMESPACE_ACTIVITY_SCHEMA</a> . 'make-friend'</td></tr>
+<tr class="separator:a176664e78dcb9132e16be69418223eb2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afe084c30a1810c10442edb4fbcbc0086"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#afe084c30a1810c10442edb4fbcbc0086">ACTIVITY_REQ_FRIEND</a> <a class="el" href="boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133">NAMESPACE_ACTIVITY_SCHEMA</a> . 'request-friend'</td></tr>
+<tr class="separator:afe084c30a1810c10442edb4fbcbc0086"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a29528a2544373cc19a378f350040c6a1"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a29528a2544373cc19a378f350040c6a1">ACTIVITY_UNFRIEND</a> <a class="el" href="boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133">NAMESPACE_ACTIVITY_SCHEMA</a> . 'remove-friend'</td></tr>
+<tr class="separator:a29528a2544373cc19a378f350040c6a1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5ae728ac966ea1d3525a19e7fec59434"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a5ae728ac966ea1d3525a19e7fec59434">ACTIVITY_FOLLOW</a> <a class="el" href="boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133">NAMESPACE_ACTIVITY_SCHEMA</a> . 'follow'</td></tr>
+<tr class="separator:a5ae728ac966ea1d3525a19e7fec59434"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a53e4bdb6f225da55115acb9277f75e53"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a53e4bdb6f225da55115acb9277f75e53">ACTIVITY_UNFOLLOW</a> <a class="el" href="boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133">NAMESPACE_ACTIVITY_SCHEMA</a> . 'stop-following'</td></tr>
+<tr class="separator:a53e4bdb6f225da55115acb9277f75e53"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aced60c7285192e80b7c4757e45a7f1e3"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#aced60c7285192e80b7c4757e45a7f1e3">ACTIVITY_JOIN</a> <a class="el" href="boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133">NAMESPACE_ACTIVITY_SCHEMA</a> . 'join'</td></tr>
+<tr class="separator:aced60c7285192e80b7c4757e45a7f1e3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5c3747e0f505f0d5271dc4c54e3feaf4"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a5c3747e0f505f0d5271dc4c54e3feaf4">ACTIVITY_POST</a> <a class="el" href="boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133">NAMESPACE_ACTIVITY_SCHEMA</a> . 'post'</td></tr>
+<tr class="separator:a5c3747e0f505f0d5271dc4c54e3feaf4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7f4264232dbb6c3b41f2617deecb1866"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a7f4264232dbb6c3b41f2617deecb1866">ACTIVITY_UPDATE</a> <a class="el" href="boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133">NAMESPACE_ACTIVITY_SCHEMA</a> . 'update'</td></tr>
+<tr class="separator:a7f4264232dbb6c3b41f2617deecb1866"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a12c781cefc20167231e2e3fd5866b1b5"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a12c781cefc20167231e2e3fd5866b1b5">ACTIVITY_TAG</a> <a class="el" href="boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133">NAMESPACE_ACTIVITY_SCHEMA</a> . 'tag'</td></tr>
+<tr class="separator:a12c781cefc20167231e2e3fd5866b1b5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3e2ea123d29a72012db1241f96280b0e"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a3e2ea123d29a72012db1241f96280b0e">ACTIVITY_FAVORITE</a> <a class="el" href="boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133">NAMESPACE_ACTIVITY_SCHEMA</a> . 'favorite'</td></tr>
+<tr class="separator:a3e2ea123d29a72012db1241f96280b0e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a14ba8f9e162f2559831ee3bf98e0c3bd"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a14ba8f9e162f2559831ee3bf98e0c3bd">ACTIVITY_POKE</a> <a class="el" href="boot_8php.html#a49f2a70b3b43aa904223a8d19e986a47">NAMESPACE_ZOT</a> . '/activity/poke'</td></tr>
+<tr class="separator:a14ba8f9e162f2559831ee3bf98e0c3bd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7aa57438db03834aaa0b468bdce773a6"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a7aa57438db03834aaa0b468bdce773a6">ACTIVITY_MOOD</a> <a class="el" href="boot_8php.html#a49f2a70b3b43aa904223a8d19e986a47">NAMESPACE_ZOT</a> . '/activity/mood'</td></tr>
+<tr class="separator:a7aa57438db03834aaa0b468bdce773a6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0a98dd0110dc6c8e24cefc8ae74d5562"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a0a98dd0110dc6c8e24cefc8ae74d5562">ACTIVITY_OBJ_COMMENT</a> <a class="el" href="boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133">NAMESPACE_ACTIVITY_SCHEMA</a> . 'comment'</td></tr>
+<tr class="separator:a0a98dd0110dc6c8e24cefc8ae74d5562"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a44d069c8a1cfcc6d2007c506a17ff28f"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a44d069c8a1cfcc6d2007c506a17ff28f">ACTIVITY_OBJ_NOTE</a> <a class="el" href="boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133">NAMESPACE_ACTIVITY_SCHEMA</a> . 'note'</td></tr>
+<tr class="separator:a44d069c8a1cfcc6d2007c506a17ff28f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2f8f25b13480c37a5f22511f53da8bab"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a2f8f25b13480c37a5f22511f53da8bab">ACTIVITY_OBJ_PERSON</a> <a class="el" href="boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133">NAMESPACE_ACTIVITY_SCHEMA</a> . 'person'</td></tr>
+<tr class="separator:a2f8f25b13480c37a5f22511f53da8bab"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a774f0f792ebfec1e774c5a17bb9d5966"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a774f0f792ebfec1e774c5a17bb9d5966">ACTIVITY_OBJ_PHOTO</a> <a class="el" href="boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133">NAMESPACE_ACTIVITY_SCHEMA</a> . 'photo'</td></tr>
+<tr class="separator:a774f0f792ebfec1e774c5a17bb9d5966"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a74bf27f7564c9a37975e7b37d973dcab"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a74bf27f7564c9a37975e7b37d973dcab">ACTIVITY_OBJ_P_PHOTO</a> <a class="el" href="boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133">NAMESPACE_ACTIVITY_SCHEMA</a> . 'profile-photo'</td></tr>
+<tr class="separator:a74bf27f7564c9a37975e7b37d973dcab"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aaf9b76832ee5f85e56466af162ba8a14"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#aaf9b76832ee5f85e56466af162ba8a14">ACTIVITY_OBJ_ALBUM</a> <a class="el" href="boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133">NAMESPACE_ACTIVITY_SCHEMA</a> . 'photo-album'</td></tr>
+<tr class="separator:aaf9b76832ee5f85e56466af162ba8a14"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2e90096fede6acce16abf0da8cb2febe"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a2e90096fede6acce16abf0da8cb2febe">ACTIVITY_OBJ_EVENT</a> <a class="el" href="boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133">NAMESPACE_ACTIVITY_SCHEMA</a> . 'event'</td></tr>
+<tr class="separator:a2e90096fede6acce16abf0da8cb2febe"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7bff2278e68a71e524afd1c7c951e1e3"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a7bff2278e68a71e524afd1c7c951e1e3">ACTIVITY_OBJ_GROUP</a> <a class="el" href="boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133">NAMESPACE_ACTIVITY_SCHEMA</a> . 'group'</td></tr>
+<tr class="separator:a7bff2278e68a71e524afd1c7c951e1e3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1da180f961f49a11573cac4ff6c62c05"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a1da180f961f49a11573cac4ff6c62c05">ACTIVITY_OBJ_TAGTERM</a> <a class="el" href="boot_8php.html#a49f2a70b3b43aa904223a8d19e986a47">NAMESPACE_ZOT</a> . '/activity/tagterm'</td></tr>
+<tr class="separator:a1da180f961f49a11573cac4ff6c62c05"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a62c832a95e38b1fa23e6cef39521b7d5"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a62c832a95e38b1fa23e6cef39521b7d5">ACTIVITY_OBJ_PROFILE</a> <a class="el" href="boot_8php.html#a49f2a70b3b43aa904223a8d19e986a47">NAMESPACE_ZOT</a> . '/activity/profile'</td></tr>
+<tr class="separator:a62c832a95e38b1fa23e6cef39521b7d5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0fb63e51c2a9814941842ae8f2f4dff8"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a0fb63e51c2a9814941842ae8f2f4dff8">ACTIVITY_OBJ_THING</a> <a class="el" href="boot_8php.html#a49f2a70b3b43aa904223a8d19e986a47">NAMESPACE_ZOT</a> . '/activity/thing'</td></tr>
+<tr class="separator:a0fb63e51c2a9814941842ae8f2f4dff8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2af173e4e9836ee7c90757b4793a2be3"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a2af173e4e9836ee7c90757b4793a2be3">GRAVITY_PARENT</a> 0</td></tr>
+<tr class="separator:a2af173e4e9836ee7c90757b4793a2be3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1f5906598e90b5ea2b4245f682be4348"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a1f5906598e90b5ea2b4245f682be4348">GRAVITY_LIKE</a> 3</td></tr>
+<tr class="separator:a1f5906598e90b5ea2b4245f682be4348"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4a12ce5de39789b0361e308d89925a20"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a4a12ce5de39789b0361e308d89925a20">GRAVITY_COMMENT</a> 6</td></tr>
+<tr class="separator:a4a12ce5de39789b0361e308d89925a20"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a84057c5bfa1bca5fba8497fe005ee4d8"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a84057c5bfa1bca5fba8497fe005ee4d8">ACCOUNT_OK</a> 0x0000</td></tr>
+<tr class="separator:a84057c5bfa1bca5fba8497fe005ee4d8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af3a4271630aabd8be592213f925d6a36"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#af3a4271630aabd8be592213f925d6a36">ACCOUNT_UNVERIFIED</a> 0x0001</td></tr>
+<tr class="separator:af3a4271630aabd8be592213f925d6a36"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af3bdfc20979c16f15bb9c60446a480f9"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#af3bdfc20979c16f15bb9c60446a480f9">ACCOUNT_BLOCKED</a> 0x0002</td></tr>
+<tr class="separator:af3bdfc20979c16f15bb9c60446a480f9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a400519fa181591cd6fdbb8f25fbcba0a"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a400519fa181591cd6fdbb8f25fbcba0a">ACCOUNT_EXPIRED</a> 0x0004</td></tr>
+<tr class="separator:a400519fa181591cd6fdbb8f25fbcba0a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab5ddbe69d3d03acd06e1fb281488cb78"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#ab5ddbe69d3d03acd06e1fb281488cb78">ACCOUNT_REMOVED</a> 0x0008</td></tr>
+<tr class="separator:ab5ddbe69d3d03acd06e1fb281488cb78"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a032bbd6d0321e99e9117332c9ed2b1b8"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a032bbd6d0321e99e9117332c9ed2b1b8">ACCOUNT_PENDING</a> 0x0010</td></tr>
+<tr class="separator:a032bbd6d0321e99e9117332c9ed2b1b8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a84f48897059bbd4a8738d7ee4cec6688"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a84f48897059bbd4a8738d7ee4cec6688">ACCOUNT_ROLE_ALLOWCODE</a> 0x0001</td></tr>
+<tr class="separator:a84f48897059bbd4a8738d7ee4cec6688"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7c2eb822d50e1554bf5c32861f36342b"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a7c2eb822d50e1554bf5c32861f36342b">ACCOUNT_ROLE_SYSTEM</a> 0x0002</td></tr>
+<tr class="separator:a7c2eb822d50e1554bf5c32861f36342b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac8400313df2c831653f9036f71ebd86d"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#ac8400313df2c831653f9036f71ebd86d">ACCOUNT_ROLE_ADMIN</a> 0x1000</td></tr>
+<tr class="separator:ac8400313df2c831653f9036f71ebd86d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab55b16ae7fc19fafe5afaedd49163bbf"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#ab55b16ae7fc19fafe5afaedd49163bbf">ITEM_VISIBLE</a> 0x0000</td></tr>
+<tr class="separator:ab55b16ae7fc19fafe5afaedd49163bbf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac99fc4d040764eac1736bec6973556fe"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#ac99fc4d040764eac1736bec6973556fe">ITEM_HIDDEN</a> 0x0001</td></tr>
+<tr class="separator:ac99fc4d040764eac1736bec6973556fe"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab28dc518fa90b6f617dd8c564eb4f35f"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#ab28dc518fa90b6f617dd8c564eb4f35f">ITEM_BLOCKED</a> 0x0002</td></tr>
+<tr class="separator:ab28dc518fa90b6f617dd8c564eb4f35f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac01230c7655e0705b2e99c9bc03c4450"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#ac01230c7655e0705b2e99c9bc03c4450">ITEM_MODERATED</a> 0x0004</td></tr>
+<tr class="separator:ac01230c7655e0705b2e99c9bc03c4450"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a40d885b2cfd736aab4234ae641ca4dfb"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a40d885b2cfd736aab4234ae641ca4dfb">ITEM_SPAM</a> 0x0008</td></tr>
+<tr class="separator:a40d885b2cfd736aab4234ae641ca4dfb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3515ea6bf77495de89b93e9ccd881c49"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a3515ea6bf77495de89b93e9ccd881c49">ITEM_DELETED</a> 0x0010</td></tr>
+<tr class="separator:a3515ea6bf77495de89b93e9ccd881c49"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:adaeb4f590c56326b2dca3b19f31b6272"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#adaeb4f590c56326b2dca3b19f31b6272">ITEM_UNPUBLISHED</a> 0x0020</td></tr>
+<tr class="separator:adaeb4f590c56326b2dca3b19f31b6272"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af489d0c3166551b93e63a79ff2c9be35"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#af489d0c3166551b93e63a79ff2c9be35">ITEM_WEBPAGE</a> 0x0040</td></tr>
+<tr class="separator:af489d0c3166551b93e63a79ff2c9be35"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac890557fedc5b5a3b1d996249b1e1a20"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#ac890557fedc5b5a3b1d996249b1e1a20">ITEM_DELAYED_PUBLISH</a> 0x0080</td></tr>
+<tr class="separator:ac890557fedc5b5a3b1d996249b1e1a20"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7fc4b291a7cdaa48b38e27344ea183cf"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a7fc4b291a7cdaa48b38e27344ea183cf">ITEM_BUILDBLOCK</a> 0x0100</td></tr>
+<tr class="separator:a7fc4b291a7cdaa48b38e27344ea183cf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6e57d913634d033b4d5ad72d99fd3e9d"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a6e57d913634d033b4d5ad72d99fd3e9d">ITEM_PDL</a> 0x0200</td></tr>
+<tr class="separator:a6e57d913634d033b4d5ad72d99fd3e9d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a87b0f279f8413c7e4d805c5d85f20d34"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a87b0f279f8413c7e4d805c5d85f20d34">ITEM_BUG</a> 0x0400</td></tr>
+<tr class="separator:a87b0f279f8413c7e4d805c5d85f20d34"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8c9dce0ef27b35397e29298eb966f7f7"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a8c9dce0ef27b35397e29298eb966f7f7">ITEM_ORIGIN</a> 0x0001</td></tr>
+<tr class="separator:a8c9dce0ef27b35397e29298eb966f7f7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a009e6a0637cb65804ea8094ecc4450b0"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a009e6a0637cb65804ea8094ecc4450b0">ITEM_UNSEEN</a> 0x0002</td></tr>
+<tr class="separator:a009e6a0637cb65804ea8094ecc4450b0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7af107fab8d62b9a73801713b774ed30"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a7af107fab8d62b9a73801713b774ed30">ITEM_STARRED</a> 0x0004</td></tr>
+<tr class="separator:a7af107fab8d62b9a73801713b774ed30"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aefba06f1c0842036329033e7567ecf6d"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#aefba06f1c0842036329033e7567ecf6d">ITEM_UPLINK</a> 0x0008</td></tr>
+<tr class="separator:aefba06f1c0842036329033e7567ecf6d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aad33b494084f729b6ee3b0bc457718a1"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#aad33b494084f729b6ee3b0bc457718a1">ITEM_UPLINK_PRV</a> 0x0010</td></tr>
+<tr class="separator:aad33b494084f729b6ee3b0bc457718a1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6788e99021ec8ffb0fa94d651f22a322"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a6788e99021ec8ffb0fa94d651f22a322">ITEM_WALL</a> 0x0020</td></tr>
+<tr class="separator:a6788e99021ec8ffb0fa94d651f22a322"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a749144d8dd9c1366596a0213c277d050"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a749144d8dd9c1366596a0213c277d050">ITEM_THREAD_TOP</a> 0x0040</td></tr>
+<tr class="separator:a749144d8dd9c1366596a0213c277d050"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8663f32171568489dbb2a01dd00371f8"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a8663f32171568489dbb2a01dd00371f8">ITEM_NOTSHOWN</a> 0x0080</td></tr>
+<tr class="separator:a8663f32171568489dbb2a01dd00371f8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a939de9a99278f4fd7dcd0ee67f243f08"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a939de9a99278f4fd7dcd0ee67f243f08">ITEM_NSFW</a> 0x0100</td></tr>
+<tr class="separator:a939de9a99278f4fd7dcd0ee67f243f08"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2958a2bd5422b85329d7c36c06dbc221"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a2958a2bd5422b85329d7c36c06dbc221">ITEM_RELAY</a> 0x0200</td></tr>
+<tr class="separator:a2958a2bd5422b85329d7c36c06dbc221"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8da836617174eed9fc2ac8054125354b"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a8da836617174eed9fc2ac8054125354b">ITEM_MENTIONSME</a> 0x0400</td></tr>
+<tr class="separator:a8da836617174eed9fc2ac8054125354b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a949116d9a295b214293006c060ca4848"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a949116d9a295b214293006c060ca4848">ITEM_NOCOMMENT</a> 0x0800</td></tr>
+<tr class="separator:a949116d9a295b214293006c060ca4848"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2c8906f1af94a3559a5b4661067bb79d"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a2c8906f1af94a3559a5b4661067bb79d">ITEM_OBSCURED</a> 0x1000</td></tr>
+<tr class="separator:a2c8906f1af94a3559a5b4661067bb79d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a18a400fa45e5632811b33041d8c048bf"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a18a400fa45e5632811b33041d8c048bf">ITEM_VERIFIED</a> 0x2000</td></tr>
+<tr class="separator:a18a400fa45e5632811b33041d8c048bf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a081307d681d7d04f17b9ced2076e7c85"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">absurl </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$path</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a75a90b0eadd0df510f7e63210733634d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">appdirpath </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2network_8php.html#a78e89557b2fbd344ad790846d761b0c7">get_capath()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="abc0a90a1a77f5b668aa7e4b57d1776a7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">argc </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classApp.html#af6d39f63fb7116bbeb04e51696f99474">App\__construct()</a>, <a class="el" href="__well__known_8php.html#a6ebfa937a2024f0b5dab53f0ac90fed0">_well_known_init()</a>, <a class="el" href="achievements_8php.html#a35ae04ada0e227d19671f289a32fb30e">achievements_content()</a>, <a class="el" href="admin_8php.html#afef415e4011607fbb665610441595015">admin_content()</a>, <a class="el" href="admin_8php.html#aaa6addf2dbc3f3fcf99244a56b41eade">admin_page_dbsync()</a>, <a class="el" href="admin_8php.html#a62f10f90c47686c9c3c37c4c03a108d2">admin_page_users()</a>, <a class="el" href="admin_8php.html#acf51f5837a7427832144c2bf7308ada3">admin_post()</a>, <a class="el" href="include_2api_8php.html#aa40bae797bcd9ccacffdce5a3b5a1afa">api_get_user()</a>, <a class="el" href="mod_2attach_8php.html#aa88eb5ad87aa1036a30e70339cc6c1b1">attach_init()</a>, <a class="el" href="blocks_8php.html#a2531a8fd51db3cecb2eb20c002c66e12">blocks_content()</a>, <a class="el" href="channel_8php.html#ac7c8c7845741baadf87fae6bc279f3dc">channel_init()</a>, <a class="el" href="cloud_8php.html#a1b79a6fe0454bc76673ad9aef55bf02d">cloud_init()</a>, <a class="el" href="common_8php.html#aca62f113655809f41f49042ce9b123c2">common_init()</a>, <a class="el" href="connect_8php.html#ad46a38f32fd7a3d324b1fa26373efa36">connect_init()</a>, <a class="el" href="connections_8php.html#aec2e457420fce3e3bf6a9f48e36df25c">connections_content()</a>, <a class="el" href="connedit_8php.html#a795acb3d9d841f55c255d7611681ab67">connedit_content()</a>, <a class="el" href="connedit_8php.html#a4da871e075597a09a8b374b9171dd92e">connedit_init()</a>, <a class="el" href="contactgroup_8php.html#a18c7391b1b25debaf98c9dba639caab3">contactgroup_content()</a>, <a class="el" href="dirsearch_8php.html#aa1fb04e1de4f25b63349ac78f94ceb4c">dirsearch_content()</a>, <a class="el" href="display_8php.html#a37137c98d47bf3306f4c2bb9f5b60de0">display_content()</a>, <a class="el" href="editblock_8php.html#abbe8f55de06967bc8d79d620509a49e6">editblock_content()</a>, <a class="el" href="editlayout_8php.html#aa877e4157a26b099de904164181dd386">editlayout_content()</a>, <a class="el" href="editpost_8php.html#a34011690864d122680c802e9e748ccfb">editpost_content()</a>, <a class="el" href="editwebpage_8php.html#a375e945255fad79a71036528f7480650">editwebpage_content()</a>, <a class="el" href="events_8php.html#a1d293fb217ae6bc9e3858c4b32e363ec">events_content()</a>, <a class="el" href="feed_8php.html#af86137700b56f33d1d5f25c8dec22c04">feed_init()</a>, <a class="el" href="filestorage_8php.html#a61bb1be78472555df4ce619f51014040">filestorage_content()</a>, <a class="el" href="mod_2group_8php.html#a07a64f6c65b0080d8190b3d9728a7a83">group_content()</a>, <a class="el" href="mod_2group_8php.html#aed1f009b1221348021bb34761160ef35">group_post()</a>, <a class="el" href="help_8php.html#af055e15f600ffa6fbca9386fdf715224">help_content()</a>, <a class="el" href="layouts_8php.html#a6e0193759ad9eef76d3df2db24237b50">layouts_content()</a>, <a class="el" href="like_8php.html#a9d7dd268f21c21e9d29dd2aca2dd9538">like_content()</a>, <a class="el" href="lockview_8php.html#a851e26ab9a1008df5c5ebebea31e9b44">lockview_content()</a>, <a class="el" href="mail_8php.html#a3c7c485fc69f92371e8b20936040eca1">mail_content()</a>, <a class="el" href="manage_8php.html#a2bca247b5296827638959138367db4f5">manage_content()</a>, <a class="el" href="mod_2menu_8php.html#a6fed23af14d71a78a4153c8363a685cf">menu_content()</a>, <a class="el" href="mod_2menu_8php.html#aaa491ef173868fe002aece4632bcf393">menu_post()</a>, <a class="el" href="mod_2message_8php.html#ac72dfed3ce08fcb331d66b37edc6e15f">message_content()</a>, <a class="el" href="mitem_8php.html#a7a31b702ecad18eeb6a38b243ff0037e">mitem_content()</a>, <a class="el" href="mitem_8php.html#a9627cd857cafdf04e4fc0ae48c8e8518">mitem_init()</a>, <a class="el" href="mitem_8php.html#a6ee694cca4b551a20d7c7a94b5243ec1">mitem_post()</a>, <a class="el" href="new__channel_8php.html#a1ad7f99e4366a32942c6b954aba3a164">new_channel_init()</a>, <a class="el" href="mod_2notify_8php.html#a94f9a6a9d4b5fd704baafff0c34f41ae">notify_init()</a>, <a class="el" href="mod_2oembed_8php.html#a9145025aaf057fb5d3f9f7011e5e1014">oembed_init()</a>, <a class="el" href="oexchange_8php.html#a2d8b785cd7d041a4e6274f5af370cf26">oexchange_content()</a>, <a class="el" href="oexchange_8php.html#ac8e2e469ddc3db984b0c1b44558aca59">oexchange_init()</a>, <a class="el" href="page_8php.html#a91a5f649f68406149108bded1dc90b22">page_content()</a>, <a class="el" href="photo_8php.html#a582779d24882b0d31ee909a91d70a448">photo_init()</a>, <a class="el" href="mod_2photos_8php.html#aa87382611a66ec5effdb2d78f13f5812">photos_content()</a>, <a class="el" href="mod_2photos_8php.html#ab950295cd77626f5fe65331a87693014">photos_init()</a>, <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>, <a class="el" href="ping_8php.html#a77217b1b190b4c5d8770867b45f0c0a1">ping_init()</a>, <a class="el" href="poco_8php.html#a53def16f75e3d41f1d2bb7cfa4905498">poco_init()</a>, <a class="el" href="profile_8php.html#ab5d0246be0552e2182a585c1206d22a5">profile_init()</a>, <a class="el" href="profile__photo_8php.html#a4b80234074bd603221aa5364f330e479">profile_photo_post()</a>, <a class="el" href="profiles_8php.html#a46975783b8b8d70402d51487eb1f0b00">profiles_content()</a>, <a class="el" href="profiles_8php.html#a36f71405ad536228f8bb84a551b23f7e">profiles_init()</a>, <a class="el" href="profiles_8php.html#ab0362c81b1d3b0b12a772b9fac446e04">profiles_post()</a>, <a class="el" href="queue_8php.html#af8c93de86d866c3200174c8450a0f341">queue_run()</a>, <a class="el" href="register_8php.html#ae20c0cd40f738d6295de58b9202c83d5">register_init()</a>, <a class="el" href="regmod_8php.html#a7953df4e32e63946565e90cdd5d50409">regmod_content()</a>, <a class="el" href="rpost_8php.html#a8190354d789000806d9879aea276728f">rpost_content()</a>, <a class="el" href="settings_8php.html#a3a4cde287482fced008583f54ba2a722">settings_init()</a>, <a class="el" href="settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586">settings_post()</a>, <a class="el" href="setup_8php.html#a267555abd17290e659b4bf44b885e4e0">setup_init()</a>, <a class="el" href="share_8php.html#afeb26046bdd02567ecd29ab5f188b249">share_init()</a>, <a class="el" href="sources_8php.html#ac442ccef080ab95772d8929fcafcb4b7">sources_content()</a>, <a class="el" href="starred_8php.html#a63024fb418c678e49fd535e3752d349a">starred_init()</a>, <a class="el" href="subthread_8php.html#a50368f3d825b77996030528e7fbfa3d3">subthread_content()</a>, <a class="el" href="tagger_8php.html#a0e4a3eb177d1684553c547503d67161c">tagger_content()</a>, <a class="el" href="thing_8php.html#a24a35f1e64029a67fdbea94a776ae04b">thing_content()</a>, <a class="el" href="uexport_8php.html#a118920137dedebe0581623a2e57e7b0d">uexport_init()</a>, <a class="el" href="update__channel_8php.html#aca52a9da500f0db2f0a8666af5bc06ba">update_channel_content()</a>, <a class="el" href="update__display_8php.html#aa36ac524059e209d5d75a03c16206246">update_display_content()</a>, <a class="el" href="update__network_8php.html#a8abf5b9f65af6a27ee2f9d7207ed1b41">update_network_content()</a>, <a class="el" href="update__search_8php.html#ace4c3a23fa7d6922399e27c297a6ba52">update_search_content()</a>, <a class="el" href="viewconnections_8php.html#a00163d50b17568f7b0e48b1ca9ab7330">viewconnections_init()</a>, <a class="el" href="viewsrc_8php.html#a6eff3d0c1d7d14b335c4edb785cd60a4">viewsrc_content()</a>, <a class="el" href="wall__attach_8php.html#a7385e970e93228d082f0fd7254f6e653">wall_attach_post()</a>, <a class="el" href="wall__upload_8php.html#a7cbe204244cf9e0380ee932263a74d8f">wall_upload_post()</a>, <a class="el" href="webpages_8php.html#af3b7397d4abc153e3d2147740ee1a41d">webpages_content()</a>, <a class="el" href="xref_8php.html#a9bee399213b8de8226b0d60834307473">xref_init()</a>, and <a class="el" href="zotfeed_8php.html#a24dfc23d366e7f840cf2847d0c1c8eac">zotfeed_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a768f00b7d66be0daf7ef4eea2e862006"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">argv </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$x</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classApp.html#af6d39f63fb7116bbeb04e51696f99474">App\__construct()</a>, <a class="el" href="__well__known_8php.html#a6ebfa937a2024f0b5dab53f0ac90fed0">_well_known_init()</a>, <a class="el" href="achievements_8php.html#a35ae04ada0e227d19671f289a32fb30e">achievements_content()</a>, <a class="el" href="admin_8php.html#afef415e4011607fbb665610441595015">admin_content()</a>, <a class="el" href="admin_8php.html#aaa6addf2dbc3f3fcf99244a56b41eade">admin_page_dbsync()</a>, <a class="el" href="admin_8php.html#a62f10f90c47686c9c3c37c4c03a108d2">admin_page_users()</a>, <a class="el" href="admin_8php.html#acf51f5837a7427832144c2bf7308ada3">admin_post()</a>, <a class="el" href="include_2api_8php.html#aa40bae797bcd9ccacffdce5a3b5a1afa">api_get_user()</a>, <a class="el" href="include_2api_8php.html#ad4c29f43418f6110f85a6b3998239ab4">api_statuses_destroy()</a>, <a class="el" href="include_2api_8php.html#ae0fa388479cace9c5a7a45b571ab42f8">api_statuses_repeat()</a>, <a class="el" href="include_2api_8php.html#af6f1d89cdb0a0621025efbec1597bc63">api_statuses_show()</a>, <a class="el" href="mod_2attach_8php.html#aa88eb5ad87aa1036a30e70339cc6c1b1">attach_init()</a>, <a class="el" href="blocks_8php.html#a2531a8fd51db3cecb2eb20c002c66e12">blocks_content()</a>, <a class="el" href="channel_8php.html#ac7c8c7845741baadf87fae6bc279f3dc">channel_init()</a>, <a class="el" href="cloud_8php.html#a1b79a6fe0454bc76673ad9aef55bf02d">cloud_init()</a>, <a class="el" href="common_8php.html#aca62f113655809f41f49042ce9b123c2">common_init()</a>, <a class="el" href="connect_8php.html#ad46a38f32fd7a3d324b1fa26373efa36">connect_init()</a>, <a class="el" href="connections_8php.html#aec2e457420fce3e3bf6a9f48e36df25c">connections_content()</a>, <a class="el" href="connections_8php.html#a1224058db8e3fb56463eb312f98e561d">connections_post()</a>, <a class="el" href="connedit_8php.html#a795acb3d9d841f55c255d7611681ab67">connedit_content()</a>, <a class="el" href="connedit_8php.html#a4da871e075597a09a8b374b9171dd92e">connedit_init()</a>, <a class="el" href="connedit_8php.html#a234c48426b652bf4d37053f2af329ac5">connedit_post()</a>, <a class="el" href="contactgroup_8php.html#a18c7391b1b25debaf98c9dba639caab3">contactgroup_content()</a>, <a class="el" href="dirsearch_8php.html#aa1fb04e1de4f25b63349ac78f94ceb4c">dirsearch_content()</a>, <a class="el" href="display_8php.html#a37137c98d47bf3306f4c2bb9f5b60de0">display_content()</a>, <a class="el" href="editblock_8php.html#abbe8f55de06967bc8d79d620509a49e6">editblock_content()</a>, <a class="el" href="editlayout_8php.html#aa877e4157a26b099de904164181dd386">editlayout_content()</a>, <a class="el" href="editpost_8php.html#a34011690864d122680c802e9e748ccfb">editpost_content()</a>, <a class="el" href="editwebpage_8php.html#a375e945255fad79a71036528f7480650">editwebpage_content()</a>, <a class="el" href="events_8php.html#a1d293fb217ae6bc9e3858c4b32e363ec">events_content()</a>, <a class="el" href="feed_8php.html#af86137700b56f33d1d5f25c8dec22c04">feed_init()</a>, <a class="el" href="filestorage_8php.html#a61bb1be78472555df4ce619f51014040">filestorage_content()</a>, <a class="el" href="mod_2group_8php.html#a07a64f6c65b0080d8190b3d9728a7a83">group_content()</a>, <a class="el" href="mod_2group_8php.html#aed1f009b1221348021bb34761160ef35">group_post()</a>, <a class="el" href="help_8php.html#af055e15f600ffa6fbca9386fdf715224">help_content()</a>, <a class="el" href="layouts_8php.html#a6e0193759ad9eef76d3df2db24237b50">layouts_content()</a>, <a class="el" href="like_8php.html#a9d7dd268f21c21e9d29dd2aca2dd9538">like_content()</a>, <a class="el" href="lockview_8php.html#a851e26ab9a1008df5c5ebebea31e9b44">lockview_content()</a>, <a class="el" href="mail_8php.html#a3c7c485fc69f92371e8b20936040eca1">mail_content()</a>, <a class="el" href="manage_8php.html#a2bca247b5296827638959138367db4f5">manage_content()</a>, <a class="el" href="mod_2menu_8php.html#a6fed23af14d71a78a4153c8363a685cf">menu_content()</a>, <a class="el" href="mod_2menu_8php.html#aaa491ef173868fe002aece4632bcf393">menu_post()</a>, <a class="el" href="mod_2message_8php.html#ac72dfed3ce08fcb331d66b37edc6e15f">message_content()</a>, <a class="el" href="mitem_8php.html#a7a31b702ecad18eeb6a38b243ff0037e">mitem_content()</a>, <a class="el" href="mitem_8php.html#a9627cd857cafdf04e4fc0ae48c8e8518">mitem_init()</a>, <a class="el" href="mitem_8php.html#a6ee694cca4b551a20d7c7a94b5243ec1">mitem_post()</a>, <a class="el" href="new__channel_8php.html#a1ad7f99e4366a32942c6b954aba3a164">new_channel_init()</a>, <a class="el" href="mod_2notify_8php.html#a94f9a6a9d4b5fd704baafff0c34f41ae">notify_init()</a>, <a class="el" href="mod_2oembed_8php.html#a9145025aaf057fb5d3f9f7011e5e1014">oembed_init()</a>, <a class="el" href="oexchange_8php.html#a2d8b785cd7d041a4e6274f5af370cf26">oexchange_content()</a>, <a class="el" href="oexchange_8php.html#ac8e2e469ddc3db984b0c1b44558aca59">oexchange_init()</a>, <a class="el" href="page_8php.html#a91a5f649f68406149108bded1dc90b22">page_content()</a>, <a class="el" href="page_8php.html#a4d89800c0366a239191b1692c09635cf">page_init()</a>, <a class="el" href="photo_8php.html#a582779d24882b0d31ee909a91d70a448">photo_init()</a>, <a class="el" href="mod_2photos_8php.html#aa87382611a66ec5effdb2d78f13f5812">photos_content()</a>, <a class="el" href="mod_2photos_8php.html#ab950295cd77626f5fe65331a87693014">photos_init()</a>, <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>, <a class="el" href="ping_8php.html#a77217b1b190b4c5d8770867b45f0c0a1">ping_init()</a>, <a class="el" href="poco_8php.html#a53def16f75e3d41f1d2bb7cfa4905498">poco_init()</a>, <a class="el" href="profile_8php.html#ab5d0246be0552e2182a585c1206d22a5">profile_init()</a>, <a class="el" href="profile__photo_8php.html#a4b80234074bd603221aa5364f330e479">profile_photo_post()</a>, <a class="el" href="profiles_8php.html#a46975783b8b8d70402d51487eb1f0b00">profiles_content()</a>, <a class="el" href="profiles_8php.html#a36f71405ad536228f8bb84a551b23f7e">profiles_init()</a>, <a class="el" href="profiles_8php.html#ab0362c81b1d3b0b12a772b9fac446e04">profiles_post()</a>, <a class="el" href="queue_8php.html#af8c93de86d866c3200174c8450a0f341">queue_run()</a>, <a class="el" href="register_8php.html#ae20c0cd40f738d6295de58b9202c83d5">register_init()</a>, <a class="el" href="regmod_8php.html#a7953df4e32e63946565e90cdd5d50409">regmod_content()</a>, <a class="el" href="rpost_8php.html#a8190354d789000806d9879aea276728f">rpost_content()</a>, <a class="el" href="settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586">settings_post()</a>, <a class="el" href="setup_8php.html#a267555abd17290e659b4bf44b885e4e0">setup_init()</a>, <a class="el" href="share_8php.html#afeb26046bdd02567ecd29ab5f188b249">share_init()</a>, <a class="el" href="sources_8php.html#ac442ccef080ab95772d8929fcafcb4b7">sources_content()</a>, <a class="el" href="starred_8php.html#a63024fb418c678e49fd535e3752d349a">starred_init()</a>, <a class="el" href="subthread_8php.html#a50368f3d825b77996030528e7fbfa3d3">subthread_content()</a>, <a class="el" href="tagger_8php.html#a0e4a3eb177d1684553c547503d67161c">tagger_content()</a>, <a class="el" href="thing_8php.html#a24a35f1e64029a67fdbea94a776ae04b">thing_content()</a>, <a class="el" href="uexport_8php.html#a118920137dedebe0581623a2e57e7b0d">uexport_init()</a>, <a class="el" href="update__channel_8php.html#aca52a9da500f0db2f0a8666af5bc06ba">update_channel_content()</a>, <a class="el" href="update__display_8php.html#aa36ac524059e209d5d75a03c16206246">update_display_content()</a>, <a class="el" href="update__network_8php.html#a8abf5b9f65af6a27ee2f9d7207ed1b41">update_network_content()</a>, <a class="el" href="update__search_8php.html#ace4c3a23fa7d6922399e27c297a6ba52">update_search_content()</a>, <a class="el" href="view_8php.html#ac168f6c61a91ba2063f13b441c0ae96e">view_init()</a>, <a class="el" href="viewconnections_8php.html#a00163d50b17568f7b0e48b1ca9ab7330">viewconnections_init()</a>, <a class="el" href="viewsrc_8php.html#a6eff3d0c1d7d14b335c4edb785cd60a4">viewsrc_content()</a>, <a class="el" href="wall__attach_8php.html#a7385e970e93228d082f0fd7254f6e653">wall_attach_post()</a>, <a class="el" href="wall__upload_8php.html#a7cbe204244cf9e0380ee932263a74d8f">wall_upload_post()</a>, <a class="el" href="webpages_8php.html#af3b7397d4abc153e3d2147740ee1a41d">webpages_content()</a>, <a class="el" href="widgets_8php.html#aa189a07241246d97efbee29f1c6a6f7f">widget_collections()</a>, <a class="el" href="widgets_8php.html#afa2e55a78f95667a6da082efac7fec74">widget_mailmenu()</a>, <a class="el" href="widgets_8php.html#aaa73bcf1702eaadd9dcd253502f55e01">widget_settings_menu()</a>, <a class="el" href="xref_8php.html#a9bee399213b8de8226b0d60834307473">xref_init()</a>, and <a class="el" href="zotfeed_8php.html#a24dfc23d366e7f840cf2847d0c1c8eac">zotfeed_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a9cbab4ee728e9a8b4ce952bae643044e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">build_querystring </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$params</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$name</em> = <code>null</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>returns querystring as string from a mapped array</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">params</td><td>Array </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>string </dd></dl>
+
+</div>
+</div>
+<a class="anchor" id="a4c02d88e66852a01bd5a1feecb7c3ce3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">check_config </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Synchronise plugins:</p>
+<p>$a-&gt;config['system']['addon'] contains a comma-separated list of names of plugins/addons which are used on this system. Go through the database list of already installed addons, and if we have an entry, but it isn't in the config list, call the unload procedure and mark it uninstalled in the database (for now we'll remove it). Then go through the config list and if we have a plugin that isn't installed, call the install procedure and add it to the database.</p>
+
+</div>
+</div>
+<a class="anchor" id="ab79b8b4555cae20d03f8200666d89d63"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">clean_urls </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="boot_8php.html#aba208673515cbb8a55e5fa4a1da99fda">z_path()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="acc4e0c910af066148b810e5fde55fff1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">construct_page </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Build the page - now that we have all the components</p>
+
+<p>Referenced by <a class="el" href="classRedBrowser.html#a1f7daf50bb9bfcde7345b3b1908dbd7e">RedBrowser\generateDirectoryIndex()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa4221641e5c21db69fa52c426b9017f5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">curPageURL </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Returns the complete URL of the current page, e.g.: http(s)://something.com/network</p>
+<p>Taken from <a href="http://webcheatsheet.com/php/get_current_page_url.php">http://webcheatsheet.com/php/get_current_page_url.php</a> </p>
+
+<p>Referenced by <a class="el" href="boot_8php.html#acc4e0c910af066148b810e5fde55fff1">construct_page()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ad206598b909e8eb67eb0e0bb5ef69c13"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">current_theme </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classFriendicaSmarty.html#af12091b920b95eeef1218cbc48066ca6">FriendicaSmarty\__construct()</a>, <a class="el" href="boot_8php.html#acc4e0c910af066148b810e5fde55fff1">construct_page()</a>, <a class="el" href="boot_8php.html#a926cad0b3d8b9d9ee5da1898fc063ba3">current_theme_url()</a>, and <a class="el" href="plugin_8php.html#a65fedcffbe03562ef844cabee37d34e2">theme_include()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a926cad0b3d8b9d9ee5da1898fc063ba3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">current_theme_url </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$installing</em> = <code>false</code></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Return full URL to theme which is currently in effect. Provide a sane default if nothing is chosen or the specified theme does not exist. </p>
+
+<p>Referenced by <a class="el" href="boot_8php.html#acc4e0c910af066148b810e5fde55fff1">construct_page()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a3e0930933fb2c0bf8211cc7ab4e1c3b4"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">dba_timer </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation()</a>, <a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">Item\get_template_data()</a>, <a class="el" href="items_8php.html#a756738301f2ed96be50232500677d58a">items_fetch()</a>, <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>, <a class="el" href="ping_8php.html#a77217b1b190b4c5d8770867b45f0c0a1">ping_init()</a>, and <a class="el" href="classTemplate.html#a07737733f6949bdedea1e3d301b2ab7b">Template\replace_macros()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aca5e42678e178c6b9034610d66666fd7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">fix_system_urls </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$oldurl</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$newurl</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="boot_8php.html#a4c02d88e66852a01bd5a1feecb7c3ce3">check_config()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="afe88b920aa285982edb817a0dd44eb37"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_account_id </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#afb99daa6b731bf497b81f2128084852c">api_user()</a>, <a class="el" href="security_8php.html#a8d23d2597aae380a3341872fe9513380">change_channel()</a>, <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>, <a class="el" href="events_8php.html#ab3e8a8f901175f8e40a8089eea45c075">events_post()</a>, <a class="el" href="feed_8php.html#af86137700b56f33d1d5f25c8dec22c04">feed_init()</a>, <a class="el" href="home_8php.html#ac4642c38b6f23a8d065dd4a75c620bde">home_init()</a>, <a class="el" href="import_8php.html#afdf25ed70096d5dbf4f6d0ca79fea184">import_content()</a>, <a class="el" href="import_8php.html#af17fef0410518f7eac205d0ea416eaa2">import_post()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="manage_8php.html#a2bca247b5296827638959138367db4f5">manage_content()</a>, <a class="el" href="text_8php.html#a1633412120f52bdce5f43e0a127d9293">mimetype_select()</a>, <a class="el" href="mood_8php.html#a7ae136dd7476865b4828136175db5022">mood_init()</a>, <a class="el" href="nav_8php.html#a43be0df73b90647ea70947ce004e231e">nav()</a>, <a class="el" href="new__channel_8php.html#ae585191610f79da129492482ce8e2fee">new_channel_content()</a>, <a class="el" href="new__channel_8php.html#a180b0646957db8290482f02454ad7f23">new_channel_post()</a>, <a class="el" href="include_2follow_8php.html#ae387d4ae097c23d69f3247e7f08140c7">new_contact()</a>, <a class="el" href="profile_8php.html#a3775cf6eef6587e5143133356a7b76c0">profile_content()</a>, <a class="el" href="profile__photo_8php.html#a4b80234074bd603221aa5364f330e479">profile_photo_post()</a>, <a class="el" href="profiles_8php.html#a36f71405ad536228f8bb84a551b23f7e">profiles_init()</a>, <a class="el" href="settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586">settings_post()</a>, <a class="el" href="text_8php.html#a324c58f37f6acdf9cd1922aa76077d9f">z_input_filter()</a>, and <a class="el" href="zotfeed_8php.html#a24dfc23d366e7f840cf2847d0c1c8eac">zotfeed_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a0e6db7e365f2b041a828b93786f694bc"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_app </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classFriendicaSmarty.html#af12091b920b95eeef1218cbc48066ca6">FriendicaSmarty\__construct()</a>, <a class="el" href="classFriendicaSmartyEngine.html#ab7c305bd8c386c2944e4dc9136cea5b6">FriendicaSmartyEngine\__construct()</a>, <a class="el" href="Contact_8php.html#a024919623a830e8703ac4f23496dd66c">abook_toggle_flag()</a>, <a class="el" href="zot_8php.html#a703f528ade8382cf374e4119bd6f7859">allowed_public_recips()</a>, <a class="el" href="include_2api_8php.html#a5990101034e7abf6404feba3cd273629">api_apply_template()</a>, <a class="el" href="include_2api_8php.html#a4c6fb9fb5203aa60f4b3afd4521db8ea">api_format_items()</a>, <a class="el" href="include_2api_8php.html#aa40bae797bcd9ccacffdce5a3b5a1afa">api_get_user()</a>, <a class="el" href="include_2api_8php.html#a528d8070ee74ea800102936ce73cf366">api_statuses_home_timeline()</a>, <a class="el" href="include_2api_8php.html#ae0fa388479cace9c5a7a45b571ab42f8">api_statuses_repeat()</a>, <a class="el" href="include_2api_8php.html#afb99daa6b731bf497b81f2128084852c">api_user()</a>, <a class="el" href="boot_8php.html#abc0a90a1a77f5b668aa7e4b57d1776a7">argc()</a>, <a class="el" href="boot_8php.html#a768f00b7d66be0daf7ef4eea2e862006">argv()</a>, <a class="el" href="items_8php.html#a275108c050f7eb18bcbb5018e6b81cf6">atom_entry()</a>, <a class="el" href="security_8php.html#adc7bf51e3b8d67bd80e9348f9ab03733">authenticate_success()</a>, <a class="el" href="include_2network_8php.html#ab07ce9d75eae559865ed90aad2154bd7">avatar_img()</a>, <a class="el" href="bbcode_8php.html#a009f61aaf78771737ed0765c8463911b">bbcode()</a>, <a class="el" href="conversation_8php.html#ad470fc7766f0db66d138fa1916c7a8b7">best_link_url()</a>, <a class="el" href="blogga_2view_2theme_2blog_2theme_8php.html#af634a3f721c5e238530d0636d33230ec">blogtheme_imgurl()</a>, <a class="el" href="zot_8php.html#ac34e479d27f32b82dd6b33542f81a6a7">build_sync_packet()</a>, <a class="el" href="plugin_8php.html#a7f05de16c0a32602853b09b99dd85e7c">call_hooks()</a>, <a class="el" href="items_8php.html#a1e75047cf175aaee8dd16aa761913ff9">can_comment_on_post()</a>, <a class="el" href="contact__widgets_8php.html#a165eb021e61c4dcab2a552f28628d353">categories_widget()</a>, <a class="el" href="security_8php.html#a8d23d2597aae380a3341872fe9513380">change_channel()</a>, <a class="el" href="Contact_8php.html#a186162051a5127069cc851d78740f205">channel_remove()</a>, <a class="el" href="security_8php.html#a9c6180e82150a5a9af91a1255d096b5c">check_form_security_token()</a>, <a class="el" href="security_8php.html#a444ac867dfa8c37cf0a7a226412bee28">check_form_security_token_ForbiddenOnErr()</a>, <a class="el" href="security_8php.html#a77ba0d1889a39cf32434c5ce96fe1433">check_form_security_token_redirectOnErr()</a>, <a class="el" href="setup_8php.html#a0c3f3b671381f6dccd924b8ecdfc56c4">check_htaccess()</a>, <a class="el" href="cli__suggest_8php.html#a8f3a60fc96f4bec7d3837c4efc7725f2">cli_suggest_run()</a>, <a class="el" href="comanche_8php.html#a5a7ab801717d38e91ac910b933973887">comanche_block()</a>, <a class="el" href="comanche_8php.html#a1fe339e1454803aa502ac89379c17f5b">comanche_menu()</a>, <a class="el" href="comanche_8php.html#a028f004d5b8c23d6367816d899e17cfe">comanche_replace_region()</a>, <a class="el" href="comanche_8php.html#a6b0191c1a63db1696a2eb139d90d9e7f">comanche_widget()</a>, <a class="el" href="contact__widgets_8php.html#a552f8544528cec0c995cea7287ea9d65">common_friends_visitor_widget()</a>, <a class="el" href="connedit_8php.html#a795acb3d9d841f55c255d7611681ab67">connedit_content()</a>, <a class="el" href="text_8php.html#ad6432621d0fafcbcf3d3b9b49bef7784">contact_block()</a>, <a class="el" href="acl__selectors_8php.html#a9476997d2968a5794f3723878ed89c91">contact_select()</a>, <a class="el" href="identity_8php.html#a345f4c943d84de502ec6e72d2c813945">create_identity()</a>, <a class="el" href="boot_8php.html#ad206598b909e8eb67eb0e0bb5ef69c13">current_theme()</a>, <a class="el" href="deliver_8php.html#a397afcb9afecf0c1816b0951189dd346">deliver_run()</a>, <a class="el" href="text_8php.html#a87a3cefc603302c78982f1d8e1245265">design_tools()</a>, <a class="el" href="taxonomy_8php.html#a599ee71dd3194c8127b00dabec77abc1">dir_tagblock()</a>, <a class="el" href="items_8php.html#afa1db13c2a8b73b5b17b97f17e5a19d1">drop_item()</a>, <a class="el" href="event_8php.html#a89ef533faf345db8d64a58d4856bde3a">event_store()</a>, <a class="el" href="contact__widgets_8php.html#a1eda66319d170f60a8d07c7ece95533b">fileas_widget()</a>, <a class="el" href="contact__widgets_8php.html#a57e73ebcfd62bb5d8c7a7b9e663726d6">findpeople_widget()</a>, <a class="el" href="item_8php.html#a7b63a9d0cd02096e17dcf11f4afa7c10">fix_attached_photo_permissions()</a>, <a class="el" href="items_8php.html#aba98fcbbcd7044a7e9ea34edabc14c87">fix_private_photos()</a>, <a class="el" href="bb2diaspora_8php.html#a29a2ad41f5826f3975fa9a49934ff863">format_event_diaspora()</a>, <a class="el" href="classRedBrowser.html#a1f7daf50bb9bfcde7345b3b1908dbd7e">RedBrowser\generateDirectoryIndex()</a>, <a class="el" href="boot_8php.html#afe88b920aa285982edb817a0dd44eb37">get_account_id()</a>, <a class="el" href="language_8php.html#a980dee1d8715a98ab02e36b59facf8ed">get_best_language()</a>, <a class="el" href="identity_8php.html#ad2c97627a313d53df1a1c7b4215ddb51">get_birthdays()</a>, <a class="el" href="identity_8php.html#ae381db3d43f8e7c1da8b15d14ecf5312">get_events()</a>, <a class="el" href="items_8php.html#a04a35b610acfe54434df08adec39c0c7">get_feed_for()</a>, <a class="el" href="security_8php.html#acd06ef411116115c2f0a92633700db8a">get_form_security_token()</a>, <a class="el" href="classFriendicaSmartyEngine.html#a35ec0ee828c36640ea25296bcb84a118">FriendicaSmartyEngine\get_intltext_template()</a>, <a class="el" href="plugin_8php.html#acb63c27d07f6d7dffe95f98a6cef1295">get_intltext_template()</a>, <a class="el" href="plugin_8php.html#a75f7dfed291fd7add7fc85b5c022a1f4">get_markup_template()</a>, <a class="el" href="boot_8php.html#a623e49c79943f3e7bdb770d021683cf7">get_observer_hash()</a>, <a class="el" href="text_8php.html#aac0969ae09853205992ba06ab9f9f61a">get_plink()</a>, <a class="el" href="settings_8php.html#a39abc76ff5459c57e3b957664f273f18">get_theme_config_file()</a>, <a class="el" href="plugin_8php.html#a48047edfbef770125a5508dcc2f9282f">get_theme_screenshot()</a>, <a class="el" href="gprobe_8php.html#adf72cb0a70b5b9d99fdec1cc60e18ed1">gprobe_run()</a>, <a class="el" href="acl__selectors_8php.html#aa1e3bc344ca2b29f97eb9860216d21a0">group_select()</a>, <a class="el" href="photo__driver_8php.html#a243cee492ce443afb6a7d77d54b6c4aa">guess_image_type()</a>, <a class="el" href="item_8php.html#aa22feef4de326e1d7078dedd892e615c">handle_tag()</a>, <a class="el" href="plugin_8php.html#a23c4fccf1eb5fcd63b24783ba1f05f7a">head_add_css()</a>, <a class="el" href="plugin_8php.html#a516591850f4fd49fd1425cfa54089db8">head_add_js()</a>, <a class="el" href="plugin_8php.html#af92789f559b89a380e49d303218aeeca">head_get_css()</a>, <a class="el" href="plugin_8php.html#a65ab52cb1a7030d5190e247211bef2a1">head_get_js()</a>, <a class="el" href="plugin_8php.html#a9ab6caae31935f6cf781ce7872db7cdf">head_remove_css()</a>, <a class="el" href="plugin_8php.html#a4a0ae7b881e7c8af99a69e3b03f898b4">head_remove_js()</a>, <a class="el" href="classRedBrowser.html#a7f6bf0bda07833f4c647557bd172e349">RedBrowser\htmlActionsPanel()</a>, <a class="el" href="photo__driver_8php.html#a1d0bc7161dec0d177b7d3bbe4421af9a">import_channel_photo()</a>, <a class="el" href="zot_8php.html#aeec89da5b6ff090c63a79de4de884a35">import_directory_profile()</a>, <a class="el" href="import_8php.html#af17fef0410518f7eac205d0ea416eaa2">import_post()</a>, <a class="el" href="photo__driver_8php.html#a78f5a10c568d2a9bbbb129dc96548887">import_profile_photo()</a>, <a class="el" href="zot_8php.html#a56f3f65514e4e7f0cd117d01735aebd1">import_xchan()</a>, <a class="el" href="boot_8php.html#adfb2fc7be5a4226c0a8e24131da9d498">info()</a>, <a class="el" href="plugin_8php.html#aeaebe63dcf6fa2794f363ba2bc0b2c6b">insert_hook()</a>, <a class="el" href="boot_8php.html#aa1e828bbbcba170265eb2668d8daf42e">is_site_admin()</a>, <a class="el" href="text_8php.html#aa6b0aa8afbeab50d1a3058ad21acb74e">item_message_id()</a>, <a class="el" href="conversation_8php.html#aacbb12d372d5e9c3ab0735b4aea48fb3">item_photo_menu()</a>, <a class="el" href="conversation_8php.html#adda79b75bf1ccf6ce9503aa310953533">item_redir_and_replace_images()</a>, <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">item_store()</a>, <a class="el" href="items_8php.html#acf0bf7c9d21ac84f32effb754f7ad484">item_store_update()</a>, <a class="el" href="items_8php.html#a756738301f2ed96be50232500677d58a">items_fetch()</a>, <a class="el" href="boot_8php.html#a719c7f3972d5f9268f37a41c76cd4ef6">load_contact_links()</a>, <a class="el" href="plugin_8php.html#a326365e48ef94f0b9a0a771b8d75e813">load_hooks()</a>, <a class="el" href="boot_8php.html#aefecf8599036df7f1b95d6820e0e2fa4">login()</a>, <a class="el" href="classFKOAuth1.html#a2b1dac2ed31fc6ef84668afdda8b263f">FKOAuth1\loginUser()</a>, <a class="el" href="manage_8php.html#a2bca247b5296827638959138367db4f5">manage_content()</a>, <a class="el" href="items_8php.html#ac1fcf621dce7370515b420a7753f4726">map_scope()</a>, <a class="el" href="include_2menu_8php.html#add35fae5e9695031b3d46e30ac409eb8">menu_add_item()</a>, <a class="el" href="include_2menu_8php.html#acb66f80ca895a6ccd562b3d9ae7b41aa">menu_edit_item()</a>, <a class="el" href="nav_8php.html#ac3c920ce3ea5b0d9e0678ee37155f06a">nav_set_selected()</a>, <a class="el" href="include_2follow_8php.html#ae387d4ae097c23d69f3247e7f08140c7">new_contact()</a>, <a class="el" href="boot_8php.html#a9255af5ae9c887520091ea04763c1a88">notice()</a>, <a class="el" href="enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc">notification()</a>, <a class="el" href="notifier_8php.html#a568c502f626cff95e344c0748938b85d">notifier_run()</a>, <a class="el" href="include_2oembed_8php.html#a98549b9af8140eda3eceaeedcaabc2c2">oembed_fetch_url()</a>, <a class="el" href="include_2oembed_8php.html#a26bb4c1e330d2f94ea7b6ce2fe970cf3">oembed_format_object()</a>, <a class="el" href="include_2oembed_8php.html#a9e57f3e36a0a0a47e6db79544b701d9a">oembed_iframe()</a>, <a class="el" href="onedirsync_8php.html#a411aedd47c57476099647961e6a86691">onedirsync_run()</a>, <a class="el" href="onepoll_8php.html#a72753b2fdec79b37c7f432035c91fb6d">onepoll_run()</a>, <a class="el" href="page_8php.html#a91a5f649f68406149108bded1dc90b22">page_content()</a>, <a class="el" href="include_2photos_8php.html#af24c6aeed28ecc31ec39e7d9a1804979">photos_album_widget()</a>, <a class="el" href="mod_2photos_8php.html#aa87382611a66ec5effdb2d78f13f5812">photos_content()</a>, <a class="el" href="ping_8php.html#a77217b1b190b4c5d8770867b45f0c0a1">ping_init()</a>, <a class="el" href="socgraph_8php.html#a5ef8bef37161df53718a21e93d02fbd6">poco_load()</a>, <a class="el" href="poller_8php.html#a5f12df3a4738124b6c039971e87e76da">poller_run()</a>, <a class="el" href="items_8php.html#a410f9c743877c125ca06312373346903">post_activity_item()</a>, <a class="el" href="text_8php.html#ac19d2b33a58372a357a43d51eed19162">preg_heart()</a>, <a class="el" href="text_8php.html#ae4df74296fbe55051ed3c035e55205e5">prepare_body()</a>, <a class="el" href="boot_8php.html#ab346a2ece14993861f3e4206befa94f0">proc_run()</a>, <a class="el" href="zot_8php.html#a37ec13b18057634eadb071f05297f5e1">process_delivery()</a>, <a class="el" href="activities_8php.html#a80134e807719b3c54aba971958d2e132">profile_activity()</a>, <a class="el" href="identity_8php.html#a432259b2cf5b6f59be53e71db9f2c7dc">profile_sidebar()</a>, <a class="el" href="security_8php.html#ab3bdd30dc60d9ee72370b866aa4a2d01">public_permissions_sql()</a>, <a class="el" href="text_8php.html#a9c6ce4e12a4ac883c5e3f36fed6e1e09">replace_macros()</a>, <a class="el" href="rmagic_8php.html#a95455edd43f1bff39446a57388cdde16">rmagic_init()</a>, <a class="el" href="bbcode_8php.html#a5165a5221a52cf1bc1d7812ebd2069c7">rpost_callback()</a>, <a class="el" href="include_2network_8php.html#ae8d9c41a11000fb8667039fc71b4f73f">scale_external_images()</a>, <a class="el" href="text_8php.html#a876e94892867019935b348b573299352">search()</a>, <a class="el" href="text_8php.html#aae91e4d2a2c6f7a9daccd2c186ae3447">searchbox()</a>, <a class="el" href="include_2message_8php.html#a751ffd6635022b2190f56154ee745752">send_message()</a>, <a class="el" href="account_8php.html#a014de2d5d5c9785de5bf547a485822fa">send_reg_approval_email()</a>, <a class="el" href="items_8php.html#aab9e0c58247427126de0699c729c3b6c">send_status_notifications()</a>, <a class="el" href="account_8php.html#aa9c29c497c17d8f9344dce8631ad8761">send_verification_email()</a>, <a class="el" href="plugin_8php.html#a030cec6793b909c439c0336ba39b1571">service_class_allows()</a>, <a class="el" href="plugin_8php.html#a905b54e10704b283ac64680a8abc0971">service_class_fetch()</a>, <a class="el" href="text_8php.html#a3d225b253bb9e0f2498c11647d927b0b">smilies()</a>, <a class="el" href="dir__fns_8php.html#a6cae22cfdd6edda5ddf09e07abb3242a">syncdirs()</a>, <a class="el" href="items_8php.html#ab1bce4261bcf75ad62753b498a144d17">tag_deliver()</a>, <a class="el" href="Contact_8php.html#a38daa1c210b78385307123450ca9a1fc">terminate_friendship()</a>, <a class="el" href="items_8php.html#a88c6cf7649ac836fbbed82a7a0315110">tgroup_check()</a>, <a class="el" href="plugin_8php.html#a65fedcffbe03562ef844cabee37d34e2">theme_include()</a>, <a class="el" href="language_8php.html#ae310fb3880484ee1cc4faefe0c63c06d">tt()</a>, <a class="el" href="socgraph_8php.html#a790690bb1a1d02483fe31632a160144d">update_suggestions()</a>, <a class="el" href="account_8php.html#ac5c570a2d46446bad4dd2501e9c5a4b1">user_allow()</a>, <a class="el" href="Contact_8php.html#a6348a532c9d26cd1c9afbc9aa6aa8960">vcard_from_xchan()</a>, <a class="el" href="setup_8php.html#aea1ebdda58ec938f4e7b31aa5c5f6b58">what_next()</a>, <a class="el" href="widgets_8php.html#a7b1e357b5a2027718470b77ec921fc65">widget_archive()</a>, <a class="el" href="widgets_8php.html#af37fdad3b2e861d860a4a8c4d8a76c0b">widget_categories()</a>, <a class="el" href="widgets_8php.html#aa189a07241246d97efbee29f1c6a6f7f">widget_collections()</a>, <a class="el" href="widgets_8php.html#a145ff35319cfa47a9cc07f9425bd674b">widget_design_tools()</a>, <a class="el" href="widgets_8php.html#a5ab3b64496e02cab56429978ad55f1c0">widget_filer()</a>, <a class="el" href="widgets_8php.html#ad1bf7aa69e8d100d95faba17c7bc91cd">widget_follow()</a>, <a class="el" href="widgets_8php.html#a70442dfa079312d9d5e5ee01be51a165">widget_fullprofile()</a>, <a class="el" href="widgets_8php.html#afa2e55a78f95667a6da082efac7fec74">widget_mailmenu()</a>, <a class="el" href="widgets_8php.html#a3bdfb81bf9a8ddf219924fa7eaf22013">widget_menu_preview()</a>, <a class="el" href="widgets_8php.html#a702e2fc0adc9b615999eca18b7311b5e">widget_photo_albums()</a>, <a class="el" href="widgets_8php.html#abd2e508a2a0b911c4a838e3cb7599923">widget_profile()</a>, <a class="el" href="widgets_8php.html#a94203eb9bcd63cbdecbbcb15163598d8">widget_savedsearch()</a>, <a class="el" href="widgets_8php.html#aaa73bcf1702eaadd9dcd253502f55e01">widget_settings_menu()</a>, <a class="el" href="widgets_8php.html#a6dbc227aac750774284ee39c45f0a200">widget_tagcloud()</a>, <a class="el" href="widgets_8php.html#ae4ced69d83dbdd9e6b51660d9eba8653">widget_tagcloud_wall()</a>, <a class="el" href="widgets_8php.html#abe03366fd22fd27d683518fa0765da50">widget_vcard()</a>, <a class="el" href="include_2network_8php.html#aafd06c0a75402aefb06cfb9f9740fa37">z_fetch_url()</a>, and <a class="el" href="zot_8php.html#a95528377d7303131958c9f0b7158fdce">zot_finger()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a899d24fd074594ceebbf72e1feff335f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_custom_nav </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$navname</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="boot_8php.html#acc4e0c910af066148b810e5fde55fff1">construct_page()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a97769915c9f14adc4f8ab1ea2cecfd90"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_max_import_size </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#af94c281016c6c912d06e064113336c5c">limit_body_size()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a623e49c79943f3e7bdb770d021683cf7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_observer_hash </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="identity_8php.html#aa870d2c1f558cfd52bef05bc124e8fa4">advanced_profile()</a>, <a class="el" href="include_2attach_8php.html#a0d07c5b83d3d54e186f752e571847b36">attach_by_hash()</a>, <a class="el" href="include_2attach_8php.html#ad991208ce939387e2f93a3bce7d09932">attach_by_hash_nodata()</a>, <a class="el" href="include_2attach_8php.html#ab6830b3ab74a5d284876141ac80f6cbc">attach_mkdir()</a>, <a class="el" href="include_2attach_8php.html#a84a8a64c4805e1525b42d4add464833f">attach_store()</a>, <a class="el" href="cloud_8php.html#a1b79a6fe0454bc76673ad9aef55bf02d">cloud_init()</a>, <a class="el" href="comanche_8php.html#a1fe339e1454803aa502ac89379c17f5b">comanche_menu()</a>, <a class="el" href="common_8php.html#ab63408f39abef7a6915186e8dabc5a96">common_content()</a>, <a class="el" href="contact__widgets_8php.html#a552f8544528cec0c995cea7287ea9d65">common_friends_visitor_widget()</a>, <a class="el" href="dir__fns_8php.html#acf621621e929d49441da30aad76a58cf">dir_safe_mode()</a>, <a class="el" href="mod_2directory_8php.html#aac79396570d759da2efac24fcedf5b44">directory_content()</a>, <a class="el" href="display_8php.html#a37137c98d47bf3306f4c2bb9f5b60de0">display_content()</a>, <a class="el" href="editblock_8php.html#abbe8f55de06967bc8d79d620509a49e6">editblock_content()</a>, <a class="el" href="editlayout_8php.html#aa877e4157a26b099de904164181dd386">editlayout_content()</a>, <a class="el" href="editpost_8php.html#a34011690864d122680c802e9e748ccfb">editpost_content()</a>, <a class="el" href="editwebpage_8php.html#a375e945255fad79a71036528f7480650">editwebpage_content()</a>, <a class="el" href="events_8php.html#ab3e8a8f901175f8e40a8089eea45c075">events_post()</a>, <a class="el" href="items_8php.html#a079e099e15d88d47aeb6ca6d60da7107">get_public_feed()</a>, <a class="el" href="security_8php.html#a9355488460ab11d6058656ff919e5cf9">item_permissions_sql()</a>, <a class="el" href="magic_8php.html#acea2cc792849ca2d71d4b689f66518bf">magic_init()</a>, <a class="el" href="mitem_8php.html#a7a31b702ecad18eeb6a38b243ff0037e">mitem_content()</a>, <a class="el" href="include_2follow_8php.html#ae387d4ae097c23d69f3247e7f08140c7">new_contact()</a>, <a class="el" href="boot_8php.html#a9255af5ae9c887520091ea04763c1a88">notice()</a>, <a class="el" href="security_8php.html#afa683bc025a1d2fe9065e2f6cd71a22f">permissions_sql()</a>, <a class="el" href="photo_8php.html#a582779d24882b0d31ee909a91d70a448">photo_init()</a>, <a class="el" href="mod_2photos_8php.html#aa87382611a66ec5effdb2d78f13f5812">photos_content()</a>, <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>, <a class="el" href="text_8php.html#ae4df74296fbe55051ed3c035e55205e5">prepare_body()</a>, <a class="el" href="profile_8php.html#a3775cf6eef6587e5143133356a7b76c0">profile_content()</a>, <a class="el" href="identity_8php.html#a432259b2cf5b6f59be53e71db9f2c7dc">profile_sidebar()</a>, <a class="el" href="search_8php.html#ab2568591359edde5b483a6cd9a24b2cc">search_content()</a>, <a class="el" href="classRedBrowser.html#a40fdbb9d9fe6c1243bbf135dd5b0a06f">RedBrowser\set_writeable()</a>, <a class="el" href="security_8php.html#a15e0f8f511cc06192db63387f97238b3">stream_perms_xchans()</a>, <a class="el" href="suggest_8php.html#a58748a8235d4523f8333847f3e42dd91">suggest_content()</a>, <a class="el" href="tagger_8php.html#a0e4a3eb177d1684553c547503d67161c">tagger_content()</a>, <a class="el" href="thing_8php.html#a8be23b1d475ec3d9291999221c674c80">thing_init()</a>, <a class="el" href="toggle__safesearch_8php.html#a23d5cfb2727a266e44993ffbf5595a79">toggle_safesearch_init()</a>, <a class="el" href="viewconnections_8php.html#ab6c4d983e97b3a8a879567ff76507776">viewconnections_content()</a>, <a class="el" href="vote_8php.html#a6aa67489bf458ca5e3206e46dac68596">vote_content()</a>, <a class="el" href="vote_8php.html#a57a9516ee1b923b224e66dcc47377fb2">vote_post()</a>, <a class="el" href="wall__attach_8php.html#a7385e970e93228d082f0fd7254f6e653">wall_attach_post()</a>, <a class="el" href="widgets_8php.html#a702e2fc0adc9b615999eca18b7311b5e">widget_photo_albums()</a>, <a class="el" href="widgets_8php.html#a0d404276fedc59f5038cf5c085028326">widget_suggestions()</a>, and <a class="el" href="include_2attach_8php.html#aeb07968990e66a88c95483ca09a7f909">z_readdir()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a5ab6181607a090bcdbaa13b15b85aba1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">goaway </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="admin_8php.html#aaa6addf2dbc3f3fcf99244a56b41eade">admin_page_dbsync()</a>, <a class="el" href="admin_8php.html#a6943543f3138f6ee182cb701f415d1cc">admin_page_hubloc()</a>, <a class="el" href="admin_8php.html#a233b7c8c31776b7020532003c6e44e1c">admin_page_logs_post()</a>, <a class="el" href="admin_8php.html#a54128076986ba80c4a103de3fc3e19a8">admin_page_plugins()</a>, <a class="el" href="admin_8php.html#add865f4ae806ecbf716f423fc3e50e4f">admin_page_site_post()</a>, <a class="el" href="admin_8php.html#af124619fdc278fe2bf14c45ddaa260fb">admin_page_themes()</a>, <a class="el" href="admin_8php.html#a62f10f90c47686c9c3c37c4c03a108d2">admin_page_users()</a>, <a class="el" href="admin_8php.html#a5a696706a3869800e65fb365214241b7">admin_page_users_post()</a>, <a class="el" href="admin_8php.html#acf51f5837a7427832144c2bf7308ada3">admin_post()</a>, <a class="el" href="mod_2api_8php.html#a33315b5bbf5418f6850b2038107b526d">api_content()</a>, <a class="el" href="security_8php.html#adc7bf51e3b8d67bd80e9348f9ab03733">authenticate_success()</a>, <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>, <a class="el" href="Contact_8php.html#a186162051a5127069cc851d78740f205">channel_remove()</a>, <a class="el" href="chanview_8php.html#a4192c6da888c8c1165851acf9ad4cb8b">chanview_content()</a>, <a class="el" href="security_8php.html#a77ba0d1889a39cf32434c5ce96fe1433">check_form_security_token_redirectOnErr()</a>, <a class="el" href="connect_8php.html#a417ec27afe33f21a929667a665e32ee2">connect_post()</a>, <a class="el" href="connections_8php.html#a1224058db8e3fb56463eb312f98e561d">connections_post()</a>, <a class="el" href="connedit_8php.html#a795acb3d9d841f55c255d7611681ab67">connedit_content()</a>, <a class="el" href="connedit_8php.html#a234c48426b652bf4d37053f2af329ac5">connedit_post()</a>, <a class="el" href="delegate_8php.html#a943eea8996ef348eb845c498f9f354dd">delegate_content()</a>, <a class="el" href="mod_2directory_8php.html#aac79396570d759da2efac24fcedf5b44">directory_content()</a>, <a class="el" href="display_8php.html#a37137c98d47bf3306f4c2bb9f5b60de0">display_content()</a>, <a class="el" href="items_8php.html#afa1db13c2a8b73b5b17b97f17e5a19d1">drop_item()</a>, <a class="el" href="events_8php.html#ab3e8a8f901175f8e40a8089eea45c075">events_post()</a>, <a class="el" href="filerm_8php.html#ae2eb28d2054fa2c37e38689882172208">filerm_content()</a>, <a class="el" href="filestorage_8php.html#a61bb1be78472555df4ce619f51014040">filestorage_content()</a>, <a class="el" href="mod_2follow_8php.html#a171f5b19f50d7738adc3b2e96ec6018a">follow_init()</a>, <a class="el" href="mod_2group_8php.html#a07a64f6c65b0080d8190b3d9728a7a83">group_content()</a>, <a class="el" href="mod_2group_8php.html#aed1f009b1221348021bb34761160ef35">group_post()</a>, <a class="el" href="home_8php.html#ac4642c38b6f23a8d065dd4a75c620bde">home_init()</a>, <a class="el" href="import_8php.html#af17fef0410518f7eac205d0ea416eaa2">import_post()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="login_8php.html#a1d69ca88eb9005a7026e128b9a645904">login_content()</a>, <a class="el" href="lostpass_8php.html#a0314d94e48c789b1b3a201d740c9eab3">lostpass_content()</a>, <a class="el" href="lostpass_8php.html#a8ed35ba71a4404eaf4903da61d0321cc">lostpass_post()</a>, <a class="el" href="magic_8php.html#acea2cc792849ca2d71d4b689f66518bf">magic_init()</a>, <a class="el" href="mail_8php.html#a3c7c485fc69f92371e8b20936040eca1">mail_content()</a>, <a class="el" href="mail_8php.html#acfc2cc0bf4e0b178207758384977f25a">mail_post()</a>, <a class="el" href="manage_8php.html#a2bca247b5296827638959138367db4f5">manage_content()</a>, <a class="el" href="mod_2menu_8php.html#a6fed23af14d71a78a4153c8363a685cf">menu_content()</a>, <a class="el" href="mod_2menu_8php.html#aaa491ef173868fe002aece4632bcf393">menu_post()</a>, <a class="el" href="mod_2message_8php.html#ac72dfed3ce08fcb331d66b37edc6e15f">message_content()</a>, <a class="el" href="mitem_8php.html#a7a31b702ecad18eeb6a38b243ff0037e">mitem_content()</a>, <a class="el" href="mitem_8php.html#a6ee694cca4b551a20d7c7a94b5243ec1">mitem_post()</a>, <a class="el" href="mood_8php.html#a7ae136dd7476865b4828136175db5022">mood_init()</a>, <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>, <a class="el" href="new__channel_8php.html#a180b0646957db8290482f02454ad7f23">new_channel_post()</a>, <a class="el" href="include_2follow_8php.html#ae387d4ae097c23d69f3247e7f08140c7">new_contact()</a>, <a class="el" href="notifications_8php.html#a5baffec7b2e625c9f9cefbc097550d33">notifications_post()</a>, <a class="el" href="mod_2notify_8php.html#a94f9a6a9d4b5fd704baafff0c34f41ae">notify_init()</a>, <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>, <a class="el" href="post_8php.html#af4b48181ce773ef0cdfc972441445c34">post_init()</a>, <a class="el" href="profile__photo_8php.html#a4b80234074bd603221aa5364f330e479">profile_photo_post()</a>, <a class="el" href="profiles_8php.html#a36f71405ad536228f8bb84a551b23f7e">profiles_init()</a>, <a class="el" href="randprof_8php.html#abf5dba3c608b9304cbf68327cd31b090">randprof_init()</a>, <a class="el" href="register_8php.html#a51731dcc1917c58a790eb1c0f6132271">register_post()</a>, <a class="el" href="removeme_8php.html#a065a589caa2aa84c60f7073a28f0ad9c">removeme_content()</a>, <a class="el" href="rmagic_8php.html#a95455edd43f1bff39446a57388cdde16">rmagic_init()</a>, <a class="el" href="rmagic_8php.html#a869de069d081b3c4e98b957d06bbf08f">rmagic_post()</a>, <a class="el" href="rpost_8php.html#a8190354d789000806d9879aea276728f">rpost_content()</a>, <a class="el" href="search_8php.html#ab2568591359edde5b483a6cd9a24b2cc">search_content()</a>, <a class="el" href="settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586">settings_post()</a>, <a class="el" href="sources_8php.html#ac442ccef080ab95772d8929fcafcb4b7">sources_content()</a>, <a class="el" href="sources_8php.html#ac73298ff162ce7b2de8dcaf3d3305b1e">sources_post()</a>, <a class="el" href="sslify_8php.html#a75b11e54a3d1fc83e7d4c0e8b4dab316">sslify_init()</a>, <a class="el" href="tagrm_8php.html#adfd4ea5b4d7fc6d9c9e042af5cd7d49a">tagrm_content()</a>, <a class="el" href="tagrm_8php.html#a1702f40aa53a2fa93deade1f609abe78">tagrm_post()</a>, <a class="el" href="toggle__mobile_8php.html#aca53ade8971802b45c31e722b22c6254">toggle_mobile_init()</a>, <a class="el" href="toggle__safesearch_8php.html#a23d5cfb2727a266e44993ffbf5595a79">toggle_safesearch_init()</a>, <a class="el" href="xref_8php.html#a9bee399213b8de8226b0d60834307473">xref_init()</a>, and <a class="el" href="identity_8php.html#a680fbafc2db023c5b1309e0180e81315">zid_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a24a7a70afedd5d85fe0eadc85afa9f77"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">head_get_icon </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a0e4701c9742c3ef88f02ac450a042a84"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">head_set_icon </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$icon</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="connections_8php.html#a1f23623f802af7bd35e95b0e94e5d558">connections_init()</a>, <a class="el" href="connedit_8php.html#a4da871e075597a09a8b374b9171dd92e">connedit_init()</a>, <a class="el" href="mail_8php.html#a3c7c485fc69f92371e8b20936040eca1">mail_content()</a>, <a class="el" href="mod_2message_8php.html#ac72dfed3ce08fcb331d66b37edc6e15f">message_content()</a>, <a class="el" href="mod_2network_8php.html#a180fce90ad11d7e0e45be094da7149ec">network_init()</a>, <a class="el" href="page_8php.html#a4d89800c0366a239191b1692c09635cf">page_init()</a>, <a class="el" href="mod_2photos_8php.html#ab950295cd77626f5fe65331a87693014">photos_init()</a>, and <a class="el" href="identity_8php.html#a432259b2cf5b6f59be53e71db9f2c7dc">profile_sidebar()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="adfb2fc7be5a4226c0a8e24131da9d498"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">info </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="admin_8php.html#aaa6addf2dbc3f3fcf99244a56b41eade">admin_page_dbsync()</a>, <a class="el" href="admin_8php.html#a233b7c8c31776b7020532003c6e44e1c">admin_page_logs_post()</a>, <a class="el" href="admin_8php.html#a54128076986ba80c4a103de3fc3e19a8">admin_page_plugins()</a>, <a class="el" href="admin_8php.html#add865f4ae806ecbf716f423fc3e50e4f">admin_page_site_post()</a>, <a class="el" href="admin_8php.html#af124619fdc278fe2bf14c45ddaa260fb">admin_page_themes()</a>, <a class="el" href="admin_8php.html#acf51f5837a7427832144c2bf7308ada3">admin_post()</a>, <a class="el" href="security_8php.html#adc7bf51e3b8d67bd80e9348f9ab03733">authenticate_success()</a>, <a class="el" href="community_8php.html#a1197aafd6a6b540dbb4a0c04ade3a25a">community_content()</a>, <a class="el" href="connections_8php.html#a1224058db8e3fb56463eb312f98e561d">connections_post()</a>, <a class="el" href="connedit_8php.html#a795acb3d9d841f55c255d7611681ab67">connedit_content()</a>, <a class="el" href="connedit_8php.html#a234c48426b652bf4d37053f2af329ac5">connedit_post()</a>, <a class="el" href="mod_2directory_8php.html#aac79396570d759da2efac24fcedf5b44">directory_content()</a>, <a class="el" href="dirprofile_8php.html#a3e1d30d3d93863ff5615f2df4ac7f052">dirprofile_init()</a>, <a class="el" href="filestorage_8php.html#a61bb1be78472555df4ce619f51014040">filestorage_content()</a>, <a class="el" href="mod_2follow_8php.html#a171f5b19f50d7738adc3b2e96ec6018a">follow_init()</a>, <a class="el" href="fsuggest_8php.html#a61ecfe10ce937ed526614f8fd3de3c7d">fsuggest_post()</a>, <a class="el" href="mod_2group_8php.html#a07a64f6c65b0080d8190b3d9728a7a83">group_content()</a>, <a class="el" href="mod_2group_8php.html#aed1f009b1221348021bb34761160ef35">group_post()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="lostpass_8php.html#a0314d94e48c789b1b3a201d740c9eab3">lostpass_content()</a>, <a class="el" href="lostpass_8php.html#a8ed35ba71a4404eaf4903da61d0321cc">lostpass_post()</a>, <a class="el" href="mail_8php.html#a3c7c485fc69f92371e8b20936040eca1">mail_content()</a>, <a class="el" href="match_8php.html#a1dd853e959b9e70c1911bb2fb5f5130d">match_content()</a>, <a class="el" href="mod_2menu_8php.html#a6fed23af14d71a78a4153c8363a685cf">menu_content()</a>, <a class="el" href="mod_2menu_8php.html#aaa491ef173868fe002aece4632bcf393">menu_post()</a>, <a class="el" href="mod_2message_8php.html#ac72dfed3ce08fcb331d66b37edc6e15f">message_content()</a>, <a class="el" href="mitem_8php.html#a7a31b702ecad18eeb6a38b243ff0037e">mitem_content()</a>, <a class="el" href="mitem_8php.html#a6ee694cca4b551a20d7c7a94b5243ec1">mitem_post()</a>, <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>, <a class="el" href="oexchange_8php.html#a2d8b785cd7d041a4e6274f5af370cf26">oexchange_content()</a>, <a class="el" href="post_8php.html#af4b48181ce773ef0cdfc972441445c34">post_init()</a>, <a class="el" href="profile__photo_8php.html#a4b80234074bd603221aa5364f330e479">profile_photo_post()</a>, <a class="el" href="profiles_8php.html#a36f71405ad536228f8bb84a551b23f7e">profiles_init()</a>, <a class="el" href="profiles_8php.html#ab0362c81b1d3b0b12a772b9fac446e04">profiles_post()</a>, <a class="el" href="register_8php.html#a51731dcc1917c58a790eb1c0f6132271">register_post()</a>, <a class="el" href="regmod_8php.html#a7953df4e32e63946565e90cdd5d50409">regmod_content()</a>, <a class="el" href="settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586">settings_post()</a>, <a class="el" href="sources_8php.html#ac442ccef080ab95772d8929fcafcb4b7">sources_content()</a>, <a class="el" href="sources_8php.html#ac73298ff162ce7b2de8dcaf3d3305b1e">sources_post()</a>, <a class="el" href="suggest_8php.html#a58748a8235d4523f8333847f3e42dd91">suggest_content()</a>, <a class="el" href="tagrm_8php.html#a1702f40aa53a2fa93deade1f609abe78">tagrm_post()</a>, <a class="el" href="thing_8php.html#a8be23b1d475ec3d9291999221c674c80">thing_init()</a>, <a class="el" href="account_8php.html#ac5c570a2d46446bad4dd2501e9c5a4b1">user_allow()</a>, and <a class="el" href="viewconnections_8php.html#ab6c4d983e97b3a8a879567ff76507776">viewconnections_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ac17fc8a416ea79e9d5cb4dc9a8ff8c5c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">is_ajax </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="admin_8php.html#afef415e4011607fbb665610441595015">admin_content()</a>, <a class="el" href="admin_8php.html#acf51f5837a7427832144c2bf7308ada3">admin_post()</a>, <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>, and <a class="el" href="viewsrc_8php.html#a6eff3d0c1d7d14b335c4edb785cd60a4">viewsrc_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa1e828bbbcba170265eb2668d8daf42e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">is_site_admin </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="admin_8php.html#afef415e4011607fbb665610441595015">admin_content()</a>, <a class="el" href="admin_8php.html#acf51f5837a7427832144c2bf7308ada3">admin_post()</a>, <a class="el" href="account_8php.html#a917d74aad0baf3e0c4b51cf1051e654f">check_account_admin()</a>, <a class="el" href="contact__widgets_8php.html#a57e73ebcfd62bb5d8c7a7b9e663726d6">findpeople_widget()</a>, <a class="el" href="invite_8php.html#a244385b28cfd021d308715f01158bfd9">invite_content()</a>, <a class="el" href="invite_8php.html#aeb0881c0f93c8e8552e5ed756ce6e5a5">invite_post()</a>, <a class="el" href="nav_8php.html#a43be0df73b90647ea70947ce004e231e">nav()</a>, <a class="el" href="ping_8php.html#a77217b1b190b4c5d8770867b45f0c0a1">ping_init()</a>, <a class="el" href="register_8php.html#a51731dcc1917c58a790eb1c0f6132271">register_post()</a>, <a class="el" href="regmod_8php.html#a7953df4e32e63946565e90cdd5d50409">regmod_content()</a>, and <a class="el" href="thing_8php.html#a8be23b1d475ec3d9291999221c674c80">thing_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aea7fc57a4d8e9dcb42f2601b0b9b761c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">killme </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classFriendicaSmartyEngine.html#ab7c305bd8c386c2944e4dc9136cea5b6">FriendicaSmartyEngine\__construct()</a>, <a class="el" href="acl_8php.html#ac6776dba871806ecdb5d1659bc2eb07a">acl_init()</a>, <a class="el" href="admin_8php.html#afef415e4011607fbb665610441595015">admin_content()</a>, <a class="el" href="mod_2api_8php.html#a33315b5bbf5418f6850b2038107b526d">api_content()</a>, <a class="el" href="include_2api_8php.html#a36344c80b8e9755da2f2dd3a0e28cce8">api_ff_ids()</a>, <a class="el" href="include_2api_8php.html#a53b0680b682ae6078f2e1ed18cfb3f74">api_friendica_version()</a>, <a class="el" href="include_2api_8php.html#aff322705cc6084b329003fc8eab0aad0">api_oauth_access_token()</a>, <a class="el" href="include_2api_8php.html#aa1bddb580510e70cc1a7b7381667f1a3">api_oauth_request_token()</a>, <a class="el" href="include_2api_8php.html#a8969e8d9c683f12ba17dcd4b059e020d">api_statusnet_version()</a>, <a class="el" href="mod_2attach_8php.html#aa88eb5ad87aa1036a30e70339cc6c1b1">attach_init()</a>, <a class="el" href="security_8php.html#a444ac867dfa8c37cf0a7a226412bee28">check_form_security_token_ForbiddenOnErr()</a>, <a class="el" href="cloud_8php.html#a1b79a6fe0454bc76673ad9aef55bf02d">cloud_init()</a>, <a class="el" href="contactgroup_8php.html#a18c7391b1b25debaf98c9dba639caab3">contactgroup_content()</a>, <a class="el" href="dirprofile_8php.html#a3e1d30d3d93863ff5615f2df4ac7f052">dirprofile_init()</a>, <a class="el" href="events_8php.html#a1d293fb217ae6bc9e3858c4b32e363ec">events_content()</a>, <a class="el" href="fbrowser_8php.html#aee476addcf7a3e0fe9454f7dfd5a56c4">fbrowser_content()</a>, <a class="el" href="feed_8php.html#af86137700b56f33d1d5f25c8dec22c04">feed_init()</a>, <a class="el" href="filer_8php.html#a5fd5d7e61b2f9c43cb5f110c89dc4274">filer_content()</a>, <a class="el" href="filerm_8php.html#ae2eb28d2054fa2c37e38689882172208">filerm_content()</a>, <a class="el" href="boot_8php.html#a5ab6181607a090bcdbaa13b15b85aba1">goaway()</a>, <a class="el" href="include_2network_8php.html#a4cfb2c05a1c295317283d762440ce0b2">http_status_exit()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="include_2network_8php.html#a4c5d50079e089168d9248427018fffd4">json_return_and_die()</a>, <a class="el" href="like_8php.html#a9d7dd268f21c21e9d29dd2aca2dd9538">like_content()</a>, <a class="el" href="lockview_8php.html#a851e26ab9a1008df5c5ebebea31e9b44">lockview_content()</a>, <a class="el" href="msearch_8php.html#ac80d2a6c0a92e79eec7efbbccd74d9a8">msearch_post()</a>, <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>, <a class="el" href="mod_2oembed_8php.html#a9145025aaf057fb5d3f9f7011e5e1014">oembed_init()</a>, <a class="el" href="oexchange_8php.html#ac8e2e469ddc3db984b0c1b44558aca59">oexchange_init()</a>, <a class="el" href="opensearch_8php.html#ad13034877a496565ac7d99e9fc6f55e9">opensearch_init()</a>, <a class="el" href="parse__url_8php.html#a05a9e8944380ba3cf6bbf5893dd4b74b">parse_url_content()</a>, <a class="el" href="photo_8php.html#a582779d24882b0d31ee909a91d70a448">photo_init()</a>, <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>, <a class="el" href="php_8php.html#adb7164dfed9a4ecbe2e168e1e78f12f6">php_init()</a>, <a class="el" href="ping_8php.html#a77217b1b190b4c5d8770867b45f0c0a1">ping_init()</a>, <a class="el" href="poco_8php.html#a53def16f75e3d41f1d2bb7cfa4905498">poco_init()</a>, <a class="el" href="poller_8php.html#a5f12df3a4738124b6c039971e87e76da">poller_run()</a>, <a class="el" href="pretheme_8php.html#af5660943ee99db5fd75182316522eafe">pretheme_init()</a>, <a class="el" href="classApp.html#abf46a653d8499e7c253cc1be894a6d83">App\register_template_engine()</a>, <a class="el" href="regmod_8php.html#a7953df4e32e63946565e90cdd5d50409">regmod_content()</a>, <a class="el" href="search__ac_8php.html#a14f90c83a3f2be095e9e2992a8d66138">search_ac_init()</a>, <a class="el" href="setup_8php.html#a267555abd17290e659b4bf44b885e4e0">setup_init()</a>, <a class="el" href="setup_8php.html#a13cf286774149a0a7bd8adb8179cec75">setup_post()</a>, <a class="el" href="share_8php.html#afeb26046bdd02567ecd29ab5f188b249">share_init()</a>, <a class="el" href="siteinfo_8php.html#a3efbd0bd6564af19ec0a9ce0294e59d0">siteinfo_init()</a>, <a class="el" href="sitelist_8php.html#a665a59bf60f780b40f32c909f4a473b1">sitelist_init()</a>, <a class="el" href="sslify_8php.html#a75b11e54a3d1fc83e7d4c0e8b4dab316">sslify_init()</a>, <a class="el" href="starred_8php.html#a63024fb418c678e49fd535e3752d349a">starred_init()</a>, <a class="el" href="subthread_8php.html#a50368f3d825b77996030528e7fbfa3d3">subthread_content()</a>, <a class="el" href="boot_8php.html#ac608a34f3bc180e7724192e0fd31f9b0">system_unavailable()</a>, <a class="el" href="tagger_8php.html#a0e4a3eb177d1684553c547503d67161c">tagger_content()</a>, <a class="el" href="classApp.html#a94a1ed2dc493c58612d17035b74ae736">App\template_engine()</a>, <a class="el" href="uexport_8php.html#a118920137dedebe0581623a2e57e7b0d">uexport_init()</a>, <a class="el" href="update__channel_8php.html#aca52a9da500f0db2f0a8666af5bc06ba">update_channel_content()</a>, <a class="el" href="update__community_8php.html#abdcc5c4ecebbe0b5fcba2755c69cb3b1">update_community_content()</a>, <a class="el" href="update__display_8php.html#aa36ac524059e209d5d75a03c16206246">update_display_content()</a>, <a class="el" href="update__network_8php.html#a8abf5b9f65af6a27ee2f9d7207ed1b41">update_network_content()</a>, <a class="el" href="update__search_8php.html#ace4c3a23fa7d6922399e27c297a6ba52">update_search_content()</a>, <a class="el" href="view_8php.html#ac168f6c61a91ba2063f13b441c0ae96e">view_init()</a>, <a class="el" href="viewsrc_8php.html#a6eff3d0c1d7d14b335c4edb785cd60a4">viewsrc_content()</a>, <a class="el" href="wall__attach_8php.html#a7385e970e93228d082f0fd7254f6e653">wall_attach_post()</a>, <a class="el" href="wall__upload_8php.html#a7cbe204244cf9e0380ee932263a74d8f">wall_upload_post()</a>, <a class="el" href="wfinger_8php.html#ae21e50c8d0a5f3c9be9f43a4e519acd3">wfinger_init()</a>, <a class="el" href="include_2network_8php.html#a9e9da2aafb806c98ecdc318604e60dc6">xml_status()</a>, and <a class="el" href="xrd_8php.html#aee3cf087968e4a0ff3a87de16eb23270">xrd_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a719c7f3972d5f9268f37a41c76cd4ef6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">load_contact_links </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#a176c448d79c211ad41c2bbe3124658f5">api_call()</a>, <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation()</a>, and <a class="el" href="conversation_8php.html#aacbb12d372d5e9c3ab0735b4aea48fb3">item_photo_menu()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ad4c9dc2c8a82e8f52b7404c1655eab44"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">local_user </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classConversation.html#af84ea6ccd72214c9bb4c504461cc8b09">Conversation\__construct()</a>, <a class="el" href="acl_8php.html#ac6776dba871806ecdb5d1659bc2eb07a">acl_init()</a>, <a class="el" href="mod_2api_8php.html#a33315b5bbf5418f6850b2038107b526d">api_content()</a>, <a class="el" href="include_2api_8php.html#aa40bae797bcd9ccacffdce5a3b5a1afa">api_get_user()</a>, <a class="el" href="mod_2api_8php.html#a6fe77f05c07cb51048df0d557b4b9bd2">api_post()</a>, <a class="el" href="include_2api_8php.html#afb99daa6b731bf497b81f2128084852c">api_user()</a>, <a class="el" href="view_2theme_2apw_2php_2config_8php.html#a8b51951a70e1c1324be71345a61d70ec">apw_form()</a>, <a class="el" href="conversation_8php.html#ad470fc7766f0db66d138fa1916c7a8b7">best_link_url()</a>, <a class="el" href="blocks_8php.html#a2531a8fd51db3cecb2eb20c002c66e12">blocks_content()</a>, <a class="el" href="classApp.html#a08f0537964d98958d218066364cff785">App\build_pagehead()</a>, <a class="el" href="zot_8php.html#ac34e479d27f32b82dd6b33542f81a6a7">build_sync_packet()</a>, <a class="el" href="security_8php.html#a8d23d2597aae380a3341872fe9513380">change_channel()</a>, <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>, <a class="el" href="channel_8php.html#ac7c8c7845741baadf87fae6bc279f3dc">channel_init()</a>, <a class="el" href="Contact_8php.html#a186162051a5127069cc851d78740f205">channel_remove()</a>, <a class="el" href="chanview_8php.html#a4192c6da888c8c1165851acf9ad4cb8b">chanview_content()</a>, <a class="el" href="cloud_8php.html#a1b79a6fe0454bc76673ad9aef55bf02d">cloud_init()</a>, <a class="el" href="contact__widgets_8php.html#a552f8544528cec0c995cea7287ea9d65">common_friends_visitor_widget()</a>, <a class="el" href="community_8php.html#a1197aafd6a6b540dbb4a0c04ade3a25a">community_content()</a>, <a class="el" href="community_8php.html#a56c94ec978a38633c5628fa6f8e386d9">community_init()</a>, <a class="el" href="connect_8php.html#a489f0a66c660de6ec4d6917b27674f07">connect_content()</a>, <a class="el" href="connect_8php.html#a417ec27afe33f21a929667a665e32ee2">connect_post()</a>, <a class="el" href="connections_8php.html#aec2e457420fce3e3bf6a9f48e36df25c">connections_content()</a>, <a class="el" href="connections_8php.html#a1f23623f802af7bd35e95b0e94e5d558">connections_init()</a>, <a class="el" href="connections_8php.html#a1224058db8e3fb56463eb312f98e561d">connections_post()</a>, <a class="el" href="connedit_8php.html#a795acb3d9d841f55c255d7611681ab67">connedit_content()</a>, <a class="el" href="connedit_8php.html#a4da871e075597a09a8b374b9171dd92e">connedit_init()</a>, <a class="el" href="connedit_8php.html#a234c48426b652bf4d37053f2af329ac5">connedit_post()</a>, <a class="el" href="acl__selectors_8php.html#a9476997d2968a5794f3723878ed89c91">contact_select()</a>, <a class="el" href="contactgroup_8php.html#a18c7391b1b25debaf98c9dba639caab3">contactgroup_content()</a>, <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation()</a>, <a class="el" href="boot_8php.html#ad206598b909e8eb67eb0e0bb5ef69c13">current_theme()</a>, <a class="el" href="delegate_8php.html#a943eea8996ef348eb845c498f9f354dd">delegate_content()</a>, <a class="el" href="mod_2directory_8php.html#aac79396570d759da2efac24fcedf5b44">directory_content()</a>, <a class="el" href="dirprofile_8php.html#a3e1d30d3d93863ff5615f2df4ac7f052">dirprofile_init()</a>, <a class="el" href="display_8php.html#a37137c98d47bf3306f4c2bb9f5b60de0">display_content()</a>, <a class="el" href="items_8php.html#afa1db13c2a8b73b5b17b97f17e5a19d1">drop_item()</a>, <a class="el" href="items_8php.html#a668ece2c37f05cc3abe538eb0dabfe55">drop_items()</a>, <a class="el" href="editblock_8php.html#abbe8f55de06967bc8d79d620509a49e6">editblock_content()</a>, <a class="el" href="editlayout_8php.html#aa877e4157a26b099de904164181dd386">editlayout_content()</a>, <a class="el" href="editpost_8php.html#a34011690864d122680c802e9e748ccfb">editpost_content()</a>, <a class="el" href="editwebpage_8php.html#a375e945255fad79a71036528f7480650">editwebpage_content()</a>, <a class="el" href="events_8php.html#a1d293fb217ae6bc9e3858c4b32e363ec">events_content()</a>, <a class="el" href="events_8php.html#ab3e8a8f901175f8e40a8089eea45c075">events_post()</a>, <a class="el" href="fbrowser_8php.html#aee476addcf7a3e0fe9454f7dfd5a56c4">fbrowser_content()</a>, <a class="el" href="contact__widgets_8php.html#a1eda66319d170f60a8d07c7ece95533b">fileas_widget()</a>, <a class="el" href="filer_8php.html#a5fd5d7e61b2f9c43cb5f110c89dc4274">filer_content()</a>, <a class="el" href="filerm_8php.html#ae2eb28d2054fa2c37e38689882172208">filerm_content()</a>, <a class="el" href="filestorage_8php.html#a61bb1be78472555df4ce619f51014040">filestorage_content()</a>, <a class="el" href="filestorage_8php.html#ad3b64e3ece9831f9d3a9f00c0ae983cd">filestorage_post()</a>, <a class="el" href="contact__widgets_8php.html#a57e73ebcfd62bb5d8c7a7b9e663726d6">findpeople_widget()</a>, <a class="el" href="mod_2follow_8php.html#a4c540ea4e9f5c581c1a53516ac585592">follow_content()</a>, <a class="el" href="mod_2follow_8php.html#a171f5b19f50d7738adc3b2e96ec6018a">follow_init()</a>, <a class="el" href="fsuggest_8php.html#aa6c49ed4b50a387f1845f36844dd7998">fsuggest_content()</a>, <a class="el" href="fsuggest_8php.html#a61ecfe10ce937ed526614f8fd3de3c7d">fsuggest_post()</a>, <a class="el" href="identity_8php.html#ad2c97627a313d53df1a1c7b4215ddb51">get_birthdays()</a>, <a class="el" href="classItem.html#a3ee7667c2ec6cd7657328e27848c0bdf">Item\get_comment_box()</a>, <a class="el" href="identity_8php.html#ae381db3d43f8e7c1da8b15d14ecf5312">get_events()</a>, <a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">Item\get_template_data()</a>, <a class="el" href="identity_8php.html#aaeb666872995e3ab8da8f7bc5f3b2bd3">get_theme_uid()</a>, <a class="el" href="mod_2group_8php.html#a07a64f6c65b0080d8190b3d9728a7a83">group_content()</a>, <a class="el" href="include_2group_8php.html#a5bd191d9692e6c34d48c0ede10810f09">group_get_members()</a>, <a class="el" href="mod_2group_8php.html#aed1f009b1221348021bb34761160ef35">group_post()</a>, <a class="el" href="acl__selectors_8php.html#aa1e3bc344ca2b29f97eb9860216d21a0">group_select()</a>, <a class="el" href="include_2group_8php.html#a6a69bd7be032fa8ce4e49c43a42cc6e9">group_side()</a>, <a class="el" href="item_8php.html#aa22feef4de326e1d7078dedd892e615c">handle_tag()</a>, <a class="el" href="home_8php.html#ac4642c38b6f23a8d065dd4a75c620bde">home_init()</a>, <a class="el" href="invite_8php.html#a244385b28cfd021d308715f01158bfd9">invite_content()</a>, <a class="el" href="invite_8php.html#aeb0881c0f93c8e8552e5ed756ce6e5a5">invite_post()</a>, <a class="el" href="item_8php.html#a764bbb2e9a885a86fb23d0b5e4a09221">item_content()</a>, <a class="el" href="security_8php.html#a9355488460ab11d6058656ff919e5cf9">item_permissions_sql()</a>, <a class="el" href="conversation_8php.html#aacbb12d372d5e9c3ab0735b4aea48fb3">item_photo_menu()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">item_store()</a>, <a class="el" href="items_8php.html#acf0bf7c9d21ac84f32effb754f7ad484">item_store_update()</a>, <a class="el" href="items_8php.html#a756738301f2ed96be50232500677d58a">items_fetch()</a>, <a class="el" href="layouts_8php.html#a6e0193759ad9eef76d3df2db24237b50">layouts_content()</a>, <a class="el" href="conversation_8php.html#afe5b2f38d8b803edb0d7ec5fa2868db0">like_puller()</a>, <a class="el" href="lockview_8php.html#a851e26ab9a1008df5c5ebebea31e9b44">lockview_content()</a>, <a class="el" href="boot_8php.html#aefecf8599036df7f1b95d6820e0e2fa4">login()</a>, <a class="el" href="login_8php.html#a1d69ca88eb9005a7026e128b9a645904">login_content()</a>, <a class="el" href="magic_8php.html#acea2cc792849ca2d71d4b689f66518bf">magic_init()</a>, <a class="el" href="mail_8php.html#a3c7c485fc69f92371e8b20936040eca1">mail_content()</a>, <a class="el" href="mail_8php.html#acfc2cc0bf4e0b178207758384977f25a">mail_post()</a>, <a class="el" href="manage_8php.html#a2bca247b5296827638959138367db4f5">manage_content()</a>, <a class="el" href="match_8php.html#a1dd853e959b9e70c1911bb2fb5f5130d">match_content()</a>, <a class="el" href="include_2menu_8php.html#add35fae5e9695031b3d46e30ac409eb8">menu_add_item()</a>, <a class="el" href="mod_2menu_8php.html#a6fed23af14d71a78a4153c8363a685cf">menu_content()</a>, <a class="el" href="include_2menu_8php.html#acb66f80ca895a6ccd562b3d9ae7b41aa">menu_edit_item()</a>, <a class="el" href="mod_2menu_8php.html#aaa491ef173868fe002aece4632bcf393">menu_post()</a>, <a class="el" href="mod_2message_8php.html#ac72dfed3ce08fcb331d66b37edc6e15f">message_content()</a>, <a class="el" href="text_8php.html#a1633412120f52bdce5f43e0a127d9293">mimetype_select()</a>, <a class="el" href="mitem_8php.html#a7a31b702ecad18eeb6a38b243ff0037e">mitem_content()</a>, <a class="el" href="mitem_8php.html#a9627cd857cafdf04e4fc0ae48c8e8518">mitem_init()</a>, <a class="el" href="mitem_8php.html#a6ee694cca4b551a20d7c7a94b5243ec1">mitem_post()</a>, <a class="el" href="mood_8php.html#a721b9b6703b3234a005641c92d409b8f">mood_content()</a>, <a class="el" href="mood_8php.html#a7ae136dd7476865b4828136175db5022">mood_init()</a>, <a class="el" href="nav_8php.html#a43be0df73b90647ea70947ce004e231e">nav()</a>, <a class="el" href="acl_8php.html#a57dceff370d4a0e7ae673d50fbfda61f">navbar_complete()</a>, <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>, <a class="el" href="mod_2network_8php.html#a180fce90ad11d7e0e45be094da7149ec">network_init()</a>, <a class="el" href="include_2follow_8php.html#ae387d4ae097c23d69f3247e7f08140c7">new_contact()</a>, <a class="el" href="notes_8php.html#a4dbd7b1f906440746af48b484d66535a">notes_init()</a>, <a class="el" href="notifications_8php.html#aadd0b5525bd8c283a5d8a37982bbfe62">notifications_content()</a>, <a class="el" href="notifications_8php.html#a5baffec7b2e625c9f9cefbc097550d33">notifications_post()</a>, <a class="el" href="mod_2notify_8php.html#acdf3851688ebd6d6a575eb84ef9febe3">notify_content()</a>, <a class="el" href="mod_2notify_8php.html#a94f9a6a9d4b5fd704baafff0c34f41ae">notify_init()</a>, <a class="el" href="oexchange_8php.html#a2d8b785cd7d041a4e6274f5af370cf26">oexchange_content()</a>, <a class="el" href="security_8php.html#afa683bc025a1d2fe9065e2f6cd71a22f">permissions_sql()</a>, <a class="el" href="mod_2photos_8php.html#aa87382611a66ec5effdb2d78f13f5812">photos_content()</a>, <a class="el" href="mod_2photos_8php.html#ab950295cd77626f5fe65331a87693014">photos_init()</a>, <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>, <a class="el" href="ping_8php.html#a77217b1b190b4c5d8770867b45f0c0a1">ping_init()</a>, <a class="el" href="poco_8php.html#a53def16f75e3d41f1d2bb7cfa4905498">poco_init()</a>, <a class="el" href="poke_8php.html#ac9190563a8da9c07a16f9dcd71cf6993">poke_content()</a>, <a class="el" href="poke_8php.html#a9725aab97b3983e6a98bd81c4efe7d3b">poke_init()</a>, <a class="el" href="post_8php.html#af4b48181ce773ef0cdfc972441445c34">post_init()</a>, <a class="el" href="text_8php.html#ae4df74296fbe55051ed3c035e55205e5">prepare_body()</a>, <a class="el" href="include_2message_8php.html#a652973ce47a262f2d238c2fd6233d97e">private_messages_list()</a>, <a class="el" href="activities_8php.html#a80134e807719b3c54aba971958d2e132">profile_activity()</a>, <a class="el" href="profile_8php.html#a3775cf6eef6587e5143133356a7b76c0">profile_content()</a>, <a class="el" href="identity_8php.html#ad4a2c8caca8f6ae93633ebeca0ed6620">profile_create_sidebar()</a>, <a class="el" href="profile_8php.html#ab5d0246be0552e2182a585c1206d22a5">profile_init()</a>, <a class="el" href="identity_8php.html#a4751b522ea913d0e7ed43e03d22e9e68">profile_load()</a>, <a class="el" href="profile__photo_8php.html#a140631c56438fbfacb61a1eb43067d02">profile_photo_init()</a>, <a class="el" href="profile__photo_8php.html#a4b80234074bd603221aa5364f330e479">profile_photo_post()</a>, <a class="el" href="identity_8php.html#a432259b2cf5b6f59be53e71db9f2c7dc">profile_sidebar()</a>, <a class="el" href="profiles_8php.html#a46975783b8b8d70402d51487eb1f0b00">profiles_content()</a>, <a class="el" href="profiles_8php.html#a36f71405ad536228f8bb84a551b23f7e">profiles_init()</a>, <a class="el" href="profiles_8php.html#ab0362c81b1d3b0b12a772b9fac446e04">profiles_post()</a>, <a class="el" href="profperm_8php.html#aef015787de2373d9fb3fe3f814fb5023">profperm_content()</a>, <a class="el" href="profperm_8php.html#a17fb64ec05edee1dc94d95438807d6c6">profperm_init()</a>, <a class="el" href="view_2theme_2redbasic_2php_2config_8php.html#a8574a41fa9735ee391ba57ab24b93793">redbasic_form()</a>, <a class="el" href="regmod_8php.html#a7953df4e32e63946565e90cdd5d50409">regmod_content()</a>, <a class="el" href="removeme_8php.html#a065a589caa2aa84c60f7073a28f0ad9c">removeme_content()</a>, <a class="el" href="removeme_8php.html#a7be08738beca44bb98a79e01cdb2ee88">removeme_post()</a>, <a class="el" href="rmagic_8php.html#a95455edd43f1bff39446a57388cdde16">rmagic_init()</a>, <a class="el" href="rpost_8php.html#a8190354d789000806d9879aea276728f">rpost_content()</a>, <a class="el" href="text_8php.html#a876e94892867019935b348b573299352">search()</a>, <a class="el" href="search__ac_8php.html#a14f90c83a3f2be095e9e2992a8d66138">search_ac_init()</a>, <a class="el" href="search_8php.html#ab2568591359edde5b483a6cd9a24b2cc">search_content()</a>, <a class="el" href="text_8php.html#aae91e4d2a2c6f7a9daccd2c186ae3447">searchbox()</a>, <a class="el" href="plugin_8php.html#a030cec6793b909c439c0336ba39b1571">service_class_allows()</a>, <a class="el" href="plugin_8php.html#a905b54e10704b283ac64680a8abc0971">service_class_fetch()</a>, <a class="el" href="classConversation.html#a66f121ca4026246f86a732e5faa0682c">Conversation\set_mode()</a>, <a class="el" href="settings_8php.html#a3a4cde287482fced008583f54ba2a722">settings_init()</a>, <a class="el" href="settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586">settings_post()</a>, <a class="el" href="share_8php.html#afeb26046bdd02567ecd29ab5f188b249">share_init()</a>, <a class="el" href="text_8php.html#a3d225b253bb9e0f2498c11647d927b0b">smilies()</a>, <a class="el" href="sources_8php.html#ac442ccef080ab95772d8929fcafcb4b7">sources_content()</a>, <a class="el" href="sources_8php.html#ac73298ff162ce7b2de8dcaf3d3305b1e">sources_post()</a>, <a class="el" href="starred_8php.html#a63024fb418c678e49fd535e3752d349a">starred_init()</a>, <a class="el" href="security_8php.html#ae92c5c1a1cbbc49ddbb8b3265d2db809">stream_perms_api_uids()</a>, <a class="el" href="security_8php.html#a15e0f8f511cc06192db63387f97238b3">stream_perms_xchans()</a>, <a class="el" href="subthread_8php.html#a50368f3d825b77996030528e7fbfa3d3">subthread_content()</a>, <a class="el" href="suggest_8php.html#a58748a8235d4523f8333847f3e42dd91">suggest_content()</a>, <a class="el" href="suggest_8php.html#a696acf1dd8070e479adcc80c63c6718c">suggest_init()</a>, <a class="el" href="tagger_8php.html#a0e4a3eb177d1684553c547503d67161c">tagger_content()</a>, <a class="el" href="tagrm_8php.html#adfd4ea5b4d7fc6d9c9e042af5cd7d49a">tagrm_content()</a>, <a class="el" href="tagrm_8php.html#a1702f40aa53a2fa93deade1f609abe78">tagrm_post()</a>, <a class="el" href="view_2theme_2apw_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d">theme_content()</a>, <a class="el" href="view_2theme_2apw_2php_2config_8php.html#ad29461920cf03b9ce1428e21eb1f4ba6">theme_post()</a>, <a class="el" href="thing_8php.html#a24a35f1e64029a67fdbea94a776ae04b">thing_content()</a>, <a class="el" href="thing_8php.html#a8be23b1d475ec3d9291999221c674c80">thing_init()</a>, <a class="el" href="uexport_8php.html#a118920137dedebe0581623a2e57e7b0d">uexport_init()</a>, <a class="el" href="Contact_8php.html#a6348a532c9d26cd1c9afbc9aa6aa8960">vcard_from_xchan()</a>, <a class="el" href="viewconnections_8php.html#ab6c4d983e97b3a8a879567ff76507776">viewconnections_content()</a>, <a class="el" href="viewconnections_8php.html#a00163d50b17568f7b0e48b1ca9ab7330">viewconnections_init()</a>, <a class="el" href="viewsrc_8php.html#a6eff3d0c1d7d14b335c4edb785cd60a4">viewsrc_content()</a>, <a class="el" href="webpages_8php.html#af3b7397d4abc153e3d2147740ee1a41d">webpages_content()</a>, <a class="el" href="widgets_8php.html#add9b24d3304e529a7975e96122315554">widget_affinity()</a>, <a class="el" href="widgets_8php.html#a145ff35319cfa47a9cc07f9425bd674b">widget_design_tools()</a>, <a class="el" href="widgets_8php.html#a5ab3b64496e02cab56429978ad55f1c0">widget_filer()</a>, <a class="el" href="widgets_8php.html#ad1bf7aa69e8d100d95faba17c7bc91cd">widget_follow()</a>, <a class="el" href="widgets_8php.html#a70442dfa079312d9d5e5ee01be51a165">widget_fullprofile()</a>, <a class="el" href="widgets_8php.html#afa2e55a78f95667a6da082efac7fec74">widget_mailmenu()</a>, <a class="el" href="widgets_8php.html#a45ea061dabe9a8372e4ca3b9e5714256">widget_notes()</a>, <a class="el" href="widgets_8php.html#abd2e508a2a0b911c4a838e3cb7599923">widget_profile()</a>, <a class="el" href="widgets_8php.html#a94203eb9bcd63cbdecbbcb15163598d8">widget_savedsearch()</a>, <a class="el" href="widgets_8php.html#aaa73bcf1702eaadd9dcd253502f55e01">widget_settings_menu()</a>, <a class="el" href="widgets_8php.html#a0d404276fedc59f5038cf5c085028326">widget_suggestions()</a>, <a class="el" href="text_8php.html#a324c58f37f6acdf9cd1922aa76077d9f">z_input_filter()</a>, <a class="el" href="identity_8php.html#a680fbafc2db023c5b1309e0180e81315">zid_init()</a>, and <a class="el" href="zping_8php.html#a4d3a6b0b8b04ed6469015823e615ee75">zping_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aefecf8599036df7f1b95d6820e0e2fa4"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">login </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$register</em> = <code>false</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$form_id</em> = <code>'main-login'</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$hiddens</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="admin_8php.html#afef415e4011607fbb665610441595015">admin_content()</a>, <a class="el" href="mod_2api_8php.html#a33315b5bbf5418f6850b2038107b526d">api_content()</a>, <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>, <a class="el" href="connections_8php.html#aec2e457420fce3e3bf6a9f48e36df25c">connections_content()</a>, <a class="el" href="connedit_8php.html#a795acb3d9d841f55c255d7611681ab67">connedit_content()</a>, <a class="el" href="mod_2follow_8php.html#a4c540ea4e9f5c581c1a53516ac585592">follow_content()</a>, <a class="el" href="home_8php.html#aa1cf697851a646755baf537f75334c46">home_content()</a>, <a class="el" href="login_8php.html#a1d69ca88eb9005a7026e128b9a645904">login_content()</a>, <a class="el" href="mail_8php.html#a3c7c485fc69f92371e8b20936040eca1">mail_content()</a>, <a class="el" href="mod_2message_8php.html#ac72dfed3ce08fcb331d66b37edc6e15f">message_content()</a>, <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>, <a class="el" href="mod_2notify_8php.html#acdf3851688ebd6d6a575eb84ef9febe3">notify_content()</a>, <a class="el" href="oexchange_8php.html#a2d8b785cd7d041a4e6274f5af370cf26">oexchange_content()</a>, <a class="el" href="post__to__red_8php.html#a75db5d87226a0287a0ac0fa315f2bcfd">post_to_red_displayAdminContent()</a>, <a class="el" href="profile_8php.html#a3775cf6eef6587e5143133356a7b76c0">profile_content()</a>, <a class="el" href="regmod_8php.html#a7953df4e32e63946565e90cdd5d50409">regmod_content()</a>, and <a class="el" href="rpost_8php.html#a8190354d789000806d9879aea276728f">rpost_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a9255af5ae9c887520091ea04763c1a88"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">notice </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="achievements_8php.html#a35ae04ada0e227d19671f289a32fb30e">achievements_content()</a>, <a class="el" href="admin_8php.html#afef415e4011607fbb665610441595015">admin_content()</a>, <a class="el" href="admin_8php.html#a6943543f3138f6ee182cb701f415d1cc">admin_page_hubloc()</a>, <a class="el" href="admin_8php.html#a54128076986ba80c4a103de3fc3e19a8">admin_page_plugins()</a>, <a class="el" href="admin_8php.html#af124619fdc278fe2bf14c45ddaa260fb">admin_page_themes()</a>, <a class="el" href="admin_8php.html#a62f10f90c47686c9c3c37c4c03a108d2">admin_page_users()</a>, <a class="el" href="admin_8php.html#a5a696706a3869800e65fb365214241b7">admin_page_users_post()</a>, <a class="el" href="mod_2api_8php.html#a33315b5bbf5418f6850b2038107b526d">api_content()</a>, <a class="el" href="mod_2api_8php.html#a6fe77f05c07cb51048df0d557b4b9bd2">api_post()</a>, <a class="el" href="apps_8php.html#a546016cb960d0b110ee8e489dfa6c27c">apps_content()</a>, <a class="el" href="mod_2attach_8php.html#aa88eb5ad87aa1036a30e70339cc6c1b1">attach_init()</a>, <a class="el" href="blocks_8php.html#a2531a8fd51db3cecb2eb20c002c66e12">blocks_content()</a>, <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>, <a class="el" href="channel_8php.html#ac7c8c7845741baadf87fae6bc279f3dc">channel_init()</a>, <a class="el" href="chanview_8php.html#a4192c6da888c8c1165851acf9ad4cb8b">chanview_content()</a>, <a class="el" href="security_8php.html#a77ba0d1889a39cf32434c5ce96fe1433">check_form_security_token_redirectOnErr()</a>, <a class="el" href="common_8php.html#ab63408f39abef7a6915186e8dabc5a96">common_content()</a>, <a class="el" href="common_8php.html#aca62f113655809f41f49042ce9b123c2">common_init()</a>, <a class="el" href="community_8php.html#a1197aafd6a6b540dbb4a0c04ade3a25a">community_content()</a>, <a class="el" href="connect_8php.html#ad46a38f32fd7a3d324b1fa26373efa36">connect_init()</a>, <a class="el" href="connect_8php.html#a417ec27afe33f21a929667a665e32ee2">connect_post()</a>, <a class="el" href="connections_8php.html#aec2e457420fce3e3bf6a9f48e36df25c">connections_content()</a>, <a class="el" href="connections_8php.html#a1224058db8e3fb56463eb312f98e561d">connections_post()</a>, <a class="el" href="connedit_8php.html#a795acb3d9d841f55c255d7611681ab67">connedit_content()</a>, <a class="el" href="connedit_8php.html#a234c48426b652bf4d37053f2af329ac5">connedit_post()</a>, <a class="el" href="delegate_8php.html#a943eea8996ef348eb845c498f9f354dd">delegate_content()</a>, <a class="el" href="mod_2directory_8php.html#aac79396570d759da2efac24fcedf5b44">directory_content()</a>, <a class="el" href="dirprofile_8php.html#a3e1d30d3d93863ff5615f2df4ac7f052">dirprofile_init()</a>, <a class="el" href="display_8php.html#a37137c98d47bf3306f4c2bb9f5b60de0">display_content()</a>, <a class="el" href="items_8php.html#afa1db13c2a8b73b5b17b97f17e5a19d1">drop_item()</a>, <a class="el" href="editblock_8php.html#abbe8f55de06967bc8d79d620509a49e6">editblock_content()</a>, <a class="el" href="editlayout_8php.html#aa877e4157a26b099de904164181dd386">editlayout_content()</a>, <a class="el" href="editpost_8php.html#a34011690864d122680c802e9e748ccfb">editpost_content()</a>, <a class="el" href="editwebpage_8php.html#a375e945255fad79a71036528f7480650">editwebpage_content()</a>, <a class="el" href="events_8php.html#a1d293fb217ae6bc9e3858c4b32e363ec">events_content()</a>, <a class="el" href="events_8php.html#ab3e8a8f901175f8e40a8089eea45c075">events_post()</a>, <a class="el" href="filestorage_8php.html#a61bb1be78472555df4ce619f51014040">filestorage_content()</a>, <a class="el" href="filestorage_8php.html#ad3b64e3ece9831f9d3a9f00c0ae983cd">filestorage_post()</a>, <a class="el" href="mod_2follow_8php.html#a171f5b19f50d7738adc3b2e96ec6018a">follow_init()</a>, <a class="el" href="fsuggest_8php.html#aa6c49ed4b50a387f1845f36844dd7998">fsuggest_content()</a>, <a class="el" href="fsuggest_8php.html#a61ecfe10ce937ed526614f8fd3de3c7d">fsuggest_post()</a>, <a class="el" href="include_2group_8php.html#a06ec565d2b64e79044e7c1bf91a2a4ce">group_add()</a>, <a class="el" href="mod_2group_8php.html#a07a64f6c65b0080d8190b3d9728a7a83">group_content()</a>, <a class="el" href="mod_2group_8php.html#aed1f009b1221348021bb34761160ef35">group_post()</a>, <a class="el" href="home_8php.html#aa1cf697851a646755baf537f75334c46">home_content()</a>, <a class="el" href="import_8php.html#afdf25ed70096d5dbf4f6d0ca79fea184">import_content()</a>, <a class="el" href="import_8php.html#af17fef0410518f7eac205d0ea416eaa2">import_post()</a>, <a class="el" href="invite_8php.html#a244385b28cfd021d308715f01158bfd9">invite_content()</a>, <a class="el" href="invite_8php.html#aeb0881c0f93c8e8552e5ed756ce6e5a5">invite_post()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="layouts_8php.html#a6e0193759ad9eef76d3df2db24237b50">layouts_content()</a>, <a class="el" href="like_8php.html#a9d7dd268f21c21e9d29dd2aca2dd9538">like_content()</a>, <a class="el" href="lostpass_8php.html#a0314d94e48c789b1b3a201d740c9eab3">lostpass_content()</a>, <a class="el" href="lostpass_8php.html#a8ed35ba71a4404eaf4903da61d0321cc">lostpass_post()</a>, <a class="el" href="magic_8php.html#acea2cc792849ca2d71d4b689f66518bf">magic_init()</a>, <a class="el" href="mail_8php.html#a3c7c485fc69f92371e8b20936040eca1">mail_content()</a>, <a class="el" href="mail_8php.html#acfc2cc0bf4e0b178207758384977f25a">mail_post()</a>, <a class="el" href="manage_8php.html#a2bca247b5296827638959138367db4f5">manage_content()</a>, <a class="el" href="match_8php.html#a1dd853e959b9e70c1911bb2fb5f5130d">match_content()</a>, <a class="el" href="mod_2menu_8php.html#a6fed23af14d71a78a4153c8363a685cf">menu_content()</a>, <a class="el" href="mod_2menu_8php.html#aaa491ef173868fe002aece4632bcf393">menu_post()</a>, <a class="el" href="mod_2message_8php.html#ac72dfed3ce08fcb331d66b37edc6e15f">message_content()</a>, <a class="el" href="mitem_8php.html#a7a31b702ecad18eeb6a38b243ff0037e">mitem_content()</a>, <a class="el" href="mitem_8php.html#a9627cd857cafdf04e4fc0ae48c8e8518">mitem_init()</a>, <a class="el" href="mitem_8php.html#a6ee694cca4b551a20d7c7a94b5243ec1">mitem_post()</a>, <a class="el" href="mood_8php.html#a721b9b6703b3234a005641c92d409b8f">mood_content()</a>, <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>, <a class="el" href="mod_2network_8php.html#a180fce90ad11d7e0e45be094da7149ec">network_init()</a>, <a class="el" href="new__channel_8php.html#ae585191610f79da129492482ce8e2fee">new_channel_content()</a>, <a class="el" href="new__channel_8php.html#a180b0646957db8290482f02454ad7f23">new_channel_post()</a>, <a class="el" href="notifications_8php.html#aadd0b5525bd8c283a5d8a37982bbfe62">notifications_content()</a>, <a class="el" href="notifications_8php.html#a5baffec7b2e625c9f9cefbc097550d33">notifications_post()</a>, <a class="el" href="oexchange_8php.html#a2d8b785cd7d041a4e6274f5af370cf26">oexchange_content()</a>, <a class="el" href="page_8php.html#a91a5f649f68406149108bded1dc90b22">page_content()</a>, <a class="el" href="mod_2photos_8php.html#aa87382611a66ec5effdb2d78f13f5812">photos_content()</a>, <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>, <a class="el" href="poke_8php.html#ac9190563a8da9c07a16f9dcd71cf6993">poke_content()</a>, <a class="el" href="post_8php.html#af4b48181ce773ef0cdfc972441445c34">post_init()</a>, <a class="el" href="profile_8php.html#a3775cf6eef6587e5143133356a7b76c0">profile_content()</a>, <a class="el" href="profile_8php.html#ab5d0246be0552e2182a585c1206d22a5">profile_init()</a>, <a class="el" href="identity_8php.html#a4751b522ea913d0e7ed43e03d22e9e68">profile_load()</a>, <a class="el" href="profile__photo_8php.html#a4b80234074bd603221aa5364f330e479">profile_photo_post()</a>, <a class="el" href="profiles_8php.html#a46975783b8b8d70402d51487eb1f0b00">profiles_content()</a>, <a class="el" href="profiles_8php.html#a36f71405ad536228f8bb84a551b23f7e">profiles_init()</a>, <a class="el" href="profiles_8php.html#ab0362c81b1d3b0b12a772b9fac446e04">profiles_post()</a>, <a class="el" href="profperm_8php.html#aef015787de2373d9fb3fe3f814fb5023">profperm_content()</a>, <a class="el" href="register_8php.html#a0e91f57f111407ea8d3223a05022bb2a">register_content()</a>, <a class="el" href="register_8php.html#a51731dcc1917c58a790eb1c0f6132271">register_post()</a>, <a class="el" href="regmod_8php.html#a7953df4e32e63946565e90cdd5d50409">regmod_content()</a>, <a class="el" href="rmagic_8php.html#a869de069d081b3c4e98b957d06bbf08f">rmagic_post()</a>, <a class="el" href="search_8php.html#ab2568591359edde5b483a6cd9a24b2cc">search_content()</a>, <a class="el" href="settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586">settings_post()</a>, <a class="el" href="sources_8php.html#ac442ccef080ab95772d8929fcafcb4b7">sources_content()</a>, <a class="el" href="sources_8php.html#ac73298ff162ce7b2de8dcaf3d3305b1e">sources_post()</a>, <a class="el" href="suggest_8php.html#a58748a8235d4523f8333847f3e42dd91">suggest_content()</a>, <a class="el" href="thing_8php.html#a24a35f1e64029a67fdbea94a776ae04b">thing_content()</a>, <a class="el" href="thing_8php.html#a8be23b1d475ec3d9291999221c674c80">thing_init()</a>, <a class="el" href="account_8php.html#ac1653efba62493b9d87513e1b6c04c83">user_deny()</a>, <a class="el" href="viewconnections_8php.html#ab6c4d983e97b3a8a879567ff76507776">viewconnections_content()</a>, <a class="el" href="viewsrc_8php.html#a6eff3d0c1d7d14b335c4edb785cd60a4">viewsrc_content()</a>, <a class="el" href="wall__attach_8php.html#a7385e970e93228d082f0fd7254f6e653">wall_attach_post()</a>, <a class="el" href="wall__upload_8php.html#a7cbe204244cf9e0380ee932263a74d8f">wall_upload_post()</a>, <a class="el" href="webpages_8php.html#af3b7397d4abc153e3d2147740ee1a41d">webpages_content()</a>, and <a class="el" href="xchan_8php.html#a9853348bf1a35c644460221ba75edc2d">xchan_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ab346a2ece14993861f3e4206befa94f0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">proc_run </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$cmd</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Wrap calls to proc_close(proc_open()) and call hook so plugins can take part in process :)</p>
+<p>args: $cmd program to run next args are passed as $cmd command line</p>
+<p>e.g.: proc_run("ls","-la","/tmp");</p>
+<p>$cmd and string args are surrounded with "" </p>
+
+<p>Referenced by <a class="el" href="zot_8php.html#ac34e479d27f32b82dd6b33542f81a6a7">build_sync_packet()</a>, <a class="el" href="Contact_8php.html#a186162051a5127069cc851d78740f205">channel_remove()</a>, <a class="el" href="connect_8php.html#a417ec27afe33f21a929667a665e32ee2">connect_post()</a>, <a class="el" href="connections_8php.html#a1224058db8e3fb56463eb312f98e561d">connections_post()</a>, <a class="el" href="connedit_8php.html#a795acb3d9d841f55c255d7611681ab67">connedit_content()</a>, <a class="el" href="connedit_8php.html#a234c48426b652bf4d37053f2af329ac5">connedit_post()</a>, <a class="el" href="identity_8php.html#a345f4c943d84de502ec6e72d2c813945">create_identity()</a>, <a class="el" href="include_2directory_8php.html#aa75d3b0697ca1456aaabdb37a74aa0f0">directory_run()</a>, <a class="el" href="items_8php.html#afa1db13c2a8b73b5b17b97f17e5a19d1">drop_item()</a>, <a class="el" href="items_8php.html#a668ece2c37f05cc3abe538eb0dabfe55">drop_items()</a>, <a class="el" href="events_8php.html#ab3e8a8f901175f8e40a8089eea45c075">events_post()</a>, <a class="el" href="boot_8php.html#aca5e42678e178c6b9034610d66666fd7">fix_system_urls()</a>, <a class="el" href="mod_2follow_8php.html#a171f5b19f50d7738adc3b2e96ec6018a">follow_init()</a>, <a class="el" href="fsuggest_8php.html#a61ecfe10ce937ed526614f8fd3de3c7d">fsuggest_post()</a>, <a class="el" href="import_8php.html#af17fef0410518f7eac205d0ea416eaa2">import_post()</a>, <a class="el" href="items_8php.html#a6f7e1334af5d684a987fa6a3eb37f4cc">item_expire()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="like_8php.html#a9d7dd268f21c21e9d29dd2aca2dd9538">like_content()</a>, <a class="el" href="mail_8php.html#a3c7c485fc69f92371e8b20936040eca1">mail_content()</a>, <a class="el" href="mood_8php.html#a7ae136dd7476865b4828136175db5022">mood_init()</a>, <a class="el" href="include_2follow_8php.html#ae387d4ae097c23d69f3247e7f08140c7">new_contact()</a>, <a class="el" href="notifier_8php.html#a568c502f626cff95e344c0748938b85d">notifier_run()</a>, <a class="el" href="include_2photos_8php.html#a6c40ef58aefef705a5adc84a40e97109">photo_upload()</a>, <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>, <a class="el" href="poller_8php.html#a5f12df3a4738124b6c039971e87e76da">poller_run()</a>, <a class="el" href="items_8php.html#a410f9c743877c125ca06312373346903">post_activity_item()</a>, <a class="el" href="zot_8php.html#a37ec13b18057634eadb071f05297f5e1">process_delivery()</a>, <a class="el" href="activities_8php.html#a80134e807719b3c54aba971958d2e132">profile_activity()</a>, <a class="el" href="profile__photo_8php.html#a4b80234074bd603221aa5364f330e479">profile_photo_post()</a>, <a class="el" href="profiles_8php.html#ab0362c81b1d3b0b12a772b9fac446e04">profiles_post()</a>, <a class="el" href="include_2message_8php.html#a751ffd6635022b2190f56154ee745752">send_message()</a>, <a class="el" href="settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586">settings_post()</a>, <a class="el" href="items_8php.html#ab1bce4261bcf75ad62753b498a144d17">tag_deliver()</a>, <a class="el" href="tagger_8php.html#a0e4a3eb177d1684553c547503d67161c">tagger_content()</a>, <a class="el" href="identity_8php.html#a680fbafc2db023c5b1309e0180e81315">zid_init()</a>, and <a class="el" href="zot_8php.html#a7b23bfb31d4491231e1e73bdc077240d">zot_refresh()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a5542c5c2806ab8bca04bad53d47b5209"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">remote_user </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>, <a class="el" href="community_8php.html#a1197aafd6a6b540dbb4a0c04ade3a25a">community_content()</a>, <a class="el" href="mod_2directory_8php.html#aac79396570d759da2efac24fcedf5b44">directory_content()</a>, <a class="el" href="dirprofile_8php.html#a3e1d30d3d93863ff5615f2df4ac7f052">dirprofile_init()</a>, <a class="el" href="display_8php.html#a37137c98d47bf3306f4c2bb9f5b60de0">display_content()</a>, <a class="el" href="items_8php.html#a668ece2c37f05cc3abe538eb0dabfe55">drop_items()</a>, <a class="el" href="item_8php.html#a764bbb2e9a885a86fb23d0b5e4a09221">item_content()</a>, <a class="el" href="security_8php.html#a9355488460ab11d6058656ff919e5cf9">item_permissions_sql()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="nav_8php.html#a43be0df73b90647ea70947ce004e231e">nav()</a>, <a class="el" href="acl_8php.html#a57dceff370d4a0e7ae673d50fbfda61f">navbar_complete()</a>, <a class="el" href="oexchange_8php.html#a2d8b785cd7d041a4e6274f5af370cf26">oexchange_content()</a>, <a class="el" href="security_8php.html#afa683bc025a1d2fe9065e2f6cd71a22f">permissions_sql()</a>, <a class="el" href="mod_2photos_8php.html#aa87382611a66ec5effdb2d78f13f5812">photos_content()</a>, <a class="el" href="mod_2photos_8php.html#ab950295cd77626f5fe65331a87693014">photos_init()</a>, <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>, <a class="el" href="poco_8php.html#a53def16f75e3d41f1d2bb7cfa4905498">poco_init()</a>, <a class="el" href="post_8php.html#af4b48181ce773ef0cdfc972441445c34">post_init()</a>, <a class="el" href="profile_8php.html#a3775cf6eef6587e5143133356a7b76c0">profile_content()</a>, <a class="el" href="identity_8php.html#ad4a2c8caca8f6ae93633ebeca0ed6620">profile_create_sidebar()</a>, <a class="el" href="identity_8php.html#a432259b2cf5b6f59be53e71db9f2c7dc">profile_sidebar()</a>, <a class="el" href="rpost_8php.html#a8190354d789000806d9879aea276728f">rpost_content()</a>, <a class="el" href="search_8php.html#ab2568591359edde5b483a6cd9a24b2cc">search_content()</a>, <a class="el" href="share_8php.html#afeb26046bdd02567ecd29ab5f188b249">share_init()</a>, <a class="el" href="subthread_8php.html#a50368f3d825b77996030528e7fbfa3d3">subthread_content()</a>, <a class="el" href="tagger_8php.html#a0e4a3eb177d1684553c547503d67161c">tagger_content()</a>, <a class="el" href="viewconnections_8php.html#ab6c4d983e97b3a8a879567ff76507776">viewconnections_content()</a>, <a class="el" href="viewconnections_8php.html#a00163d50b17568f7b0e48b1ca9ab7330">viewconnections_init()</a>, <a class="el" href="widgets_8php.html#a70442dfa079312d9d5e5ee01be51a165">widget_fullprofile()</a>, <a class="el" href="widgets_8php.html#abd2e508a2a0b911c4a838e3cb7599923">widget_profile()</a>, <a class="el" href="identity_8php.html#a680fbafc2db023c5b1309e0180e81315">zid_init()</a>, and <a class="el" href="zotfeed_8php.html#a24dfc23d366e7f840cf2847d0c1c8eac">zotfeed_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aca47505b8732177f52bb2d647eb2741c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">startup </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Reverse the effect of magic_quotes_gpc if it is enabled. Please disable magic_quotes_gpc so we don't have to do this. See <a href="http://php.net/manual/en/security.magicquotes.disabling.php">http://php.net/manual/en/security.magicquotes.disabling.php</a> </p>
+
+<p>Referenced by <a class="el" href="classApp.html#af6d39f63fb7116bbeb04e51696f99474">App\__construct()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ac608a34f3bc180e7724192e0fd31f9b0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">system_unavailable </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a01353c9abebc3544ea080ac161729632"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">x </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$k</em> = <code>NULL</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classFriendicaSmarty.html#af12091b920b95eeef1218cbc48066ca6">FriendicaSmarty\__construct()</a>, <a class="el" href="classApp.html#af6d39f63fb7116bbeb04e51696f99474">App\__construct()</a>, <a class="el" href="acl_8php.html#ac6776dba871806ecdb5d1659bc2eb07a">acl_init()</a>, <a class="el" href="admin_8php.html#a233b7c8c31776b7020532003c6e44e1c">admin_page_logs_post()</a>, <a class="el" href="admin_8php.html#a54128076986ba80c4a103de3fc3e19a8">admin_page_plugins()</a>, <a class="el" href="admin_8php.html#ac0f3bd12431c056aad77bac9d09fa30e">admin_page_site()</a>, <a class="el" href="admin_8php.html#add865f4ae806ecbf716f423fc3e50e4f">admin_page_site_post()</a>, <a class="el" href="admin_8php.html#af124619fdc278fe2bf14c45ddaa260fb">admin_page_themes()</a>, <a class="el" href="admin_8php.html#a5a696706a3869800e65fb365214241b7">admin_page_users_post()</a>, <a class="el" href="mod_2api_8php.html#a33315b5bbf5418f6850b2038107b526d">api_content()</a>, <a class="el" href="include_2api_8php.html#a7759ccddc8dff012ad168e511ffe5af5">api_direct_messages_box()</a>, <a class="el" href="include_2api_8php.html#a0991f72554f821255397d615e76f3203">api_direct_messages_new()</a>, <a class="el" href="include_2api_8php.html#a2c71b1226ef1283b5370bd1c200fee5f">api_favorites()</a>, <a class="el" href="include_2api_8php.html#ae82608c317421f27446465aa6724733d">api_format_messages()</a>, <a class="el" href="include_2api_8php.html#aa40bae797bcd9ccacffdce5a3b5a1afa">api_get_user()</a>, <a class="el" href="include_2api_8php.html#afe534f826e4282b72d66e8cadca7bb73">api_login()</a>, <a class="el" href="mod_2api_8php.html#a6fe77f05c07cb51048df0d557b4b9bd2">api_post()</a>, <a class="el" href="include_2api_8php.html#aa0d6b29fff0344a8e67f3507a6d01410">api_statuses_f()</a>, <a class="el" href="include_2api_8php.html#a528d8070ee74ea800102936ce73cf366">api_statuses_home_timeline()</a>, <a class="el" href="include_2api_8php.html#a8b25a186bd0893f51aa72a62f655735e">api_statuses_mentions()</a>, <a class="el" href="include_2api_8php.html#ad24ce1bf20867add4c9211a8eaf93f22">api_statuses_public_timeline()</a>, <a class="el" href="include_2api_8php.html#af6f1d89cdb0a0621025efbec1597bc63">api_statuses_show()</a>, <a class="el" href="include_2api_8php.html#ad4d1634df6b35126552324683caaffa2">api_statuses_update()</a>, <a class="el" href="include_2api_8php.html#a32f0dda848d0c11c727fe1c3e741c283">api_statuses_user_timeline()</a>, <a class="el" href="include_2api_8php.html#afb99daa6b731bf497b81f2128084852c">api_user()</a>, <a class="el" href="include_2attach_8php.html#a84a8a64c4805e1525b42d4add464833f">attach_store()</a>, <a class="el" href="security_8php.html#adc7bf51e3b8d67bd80e9348f9ab03733">authenticate_success()</a>, <a class="el" href="bbcode_8php.html#a009f61aaf78771737ed0765c8463911b">bbcode()</a>, <a class="el" href="event_8php.html#a180cccd63c2a2f00ff432b03113531f3">bbtoevent()</a>, <a class="el" href="conversation_8php.html#ad470fc7766f0db66d138fa1916c7a8b7">best_link_url()</a>, <a class="el" href="classApp.html#a08f0537964d98958d218066364cff785">App\build_pagehead()</a>, <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>, <a class="el" href="security_8php.html#a9c6180e82150a5a9af91a1255d096b5c">check_form_security_token()</a>, <a class="el" href="community_8php.html#a1197aafd6a6b540dbb4a0c04ade3a25a">community_content()</a>, <a class="el" href="connections_8php.html#aec2e457420fce3e3bf6a9f48e36df25c">connections_content()</a>, <a class="el" href="connections_8php.html#a1224058db8e3fb56463eb312f98e561d">connections_post()</a>, <a class="el" href="connedit_8php.html#a795acb3d9d841f55c255d7611681ab67">connedit_content()</a>, <a class="el" href="boot_8php.html#acc4e0c910af066148b810e5fde55fff1">construct_page()</a>, <a class="el" href="items_8php.html#a8794863cdf8ce1333040933d3a3f66bd">consume_feed()</a>, <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation()</a>, <a class="el" href="account_8php.html#a141fe579c351c78209d425473f978eb5">create_account()</a>, <a class="el" href="identity_8php.html#a345f4c943d84de502ec6e72d2c813945">create_identity()</a>, <a class="el" href="boot_8php.html#ad206598b909e8eb67eb0e0bb5ef69c13">current_theme()</a>, <a class="el" href="include_2config_8php.html#a7ad2081c5f812ac4387fd76f3762d941">del_pconfig()</a>, <a class="el" href="include_2config_8php.html#a9c171def547deee16738dc58fdeb4b72">del_xconfig()</a>, <a class="el" href="delegate_8php.html#a943eea8996ef348eb845c498f9f354dd">delegate_content()</a>, <a class="el" href="language_8php.html#a632da17c7ac0d2dc1a00a4706870194b">detect_language()</a>, <a class="el" href="mod_2directory_8php.html#aac79396570d759da2efac24fcedf5b44">directory_content()</a>, <a class="el" href="dirprofile_8php.html#a3e1d30d3d93863ff5615f2df4ac7f052">dirprofile_init()</a>, <a class="el" href="dirsearch_8php.html#aa1fb04e1de4f25b63349ac78f94ceb4c">dirsearch_content()</a>, <a class="el" href="display_8php.html#a37137c98d47bf3306f4c2bb9f5b60de0">display_content()</a>, <a class="el" href="items_8php.html#aa723c0571e314a1853a24c5854b4f54f">encode_rel_links()</a>, <a class="el" href="events_8php.html#a1d293fb217ae6bc9e3858c4b32e363ec">events_content()</a>, <a class="el" href="events_8php.html#ab3e8a8f901175f8e40a8089eea45c075">events_post()</a>, <a class="el" href="feed_8php.html#af86137700b56f33d1d5f25c8dec22c04">feed_init()</a>, <a class="el" href="filerm_8php.html#ae2eb28d2054fa2c37e38689882172208">filerm_content()</a>, <a class="el" href="filestorage_8php.html#ad3b64e3ece9831f9d3a9f00c0ae983cd">filestorage_post()</a>, <a class="el" href="items_8php.html#a896c1809d58f2d7a42cfe14577958ddf">get_atom_elements()</a>, <a class="el" href="language_8php.html#ace67d6cad57da08d030ad9dc9b8c836e">get_browser_language()</a>, <a class="el" href="items_8php.html#a536d0313b6ffe33b9d2490c4e25c5361">get_item_elements()</a>, <a class="el" href="identity_8php.html#a490972c02fdb638c52ec0e012a30bfd2">get_my_address()</a>, <a class="el" href="identity_8php.html#aa46321e1cd6a3b8dfde8bf9510112fec">get_my_url()</a>, <a class="el" href="text_8php.html#aac0969ae09853205992ba06ab9f9f61a">get_plink()</a>, <a class="el" href="items_8php.html#a079e099e15d88d47aeb6ca6d60da7107">get_public_feed()</a>, <a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">Item\get_template_data()</a>, <a class="el" href="include_2group_8php.html#a06ec565d2b64e79044e7c1bf91a2a4ce">group_add()</a>, <a class="el" href="include_2group_8php.html#a4118f498bbd1530c1d0136d016d197a5">group_rmv()</a>, <a class="el" href="home_8php.html#aa1cf697851a646755baf537f75334c46">home_content()</a>, <a class="el" href="import_8php.html#af17fef0410518f7eac205d0ea416eaa2">import_post()</a>, <a class="el" href="zot_8php.html#a56f3f65514e4e7f0cd117d01735aebd1">import_xchan()</a>, <a class="el" href="boot_8php.html#adfb2fc7be5a4226c0a8e24131da9d498">info()</a>, <a class="el" href="invite_8php.html#aeb0881c0f93c8e8552e5ed756ce6e5a5">invite_post()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">item_store()</a>, <a class="el" href="items_8php.html#acf0bf7c9d21ac84f32effb754f7ad484">item_store_update()</a>, <a class="el" href="text_8php.html#a71f6952243d3fe1c5a8154f78027e29c">lang_selector()</a>, <a class="el" href="boot_8php.html#a719c7f3972d5f9268f37a41c76cd4ef6">load_contact_links()</a>, <a class="el" href="boot_8php.html#ad4c9dc2c8a82e8f52b7404c1655eab44">local_user()</a>, <a class="el" href="lostpass_8php.html#a0314d94e48c789b1b3a201d740c9eab3">lostpass_content()</a>, <a class="el" href="magic_8php.html#acea2cc792849ca2d71d4b689f66518bf">magic_init()</a>, <a class="el" href="mail_8php.html#a3c7c485fc69f92371e8b20936040eca1">mail_content()</a>, <a class="el" href="mail_8php.html#acfc2cc0bf4e0b178207758384977f25a">mail_post()</a>, <a class="el" href="items_8php.html#a77da7ce9a117601d49ac4a67c71b514f">mail_store()</a>, <a class="el" href="mood_8php.html#a721b9b6703b3234a005641c92d409b8f">mood_content()</a>, <a class="el" href="mood_8php.html#a7ae136dd7476865b4828136175db5022">mood_init()</a>, <a class="el" href="nav_8php.html#a43be0df73b90647ea70947ce004e231e">nav()</a>, <a class="el" href="acl_8php.html#a57dceff370d4a0e7ae673d50fbfda61f">navbar_complete()</a>, <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>, <a class="el" href="new__channel_8php.html#ae585191610f79da129492482ce8e2fee">new_channel_content()</a>, <a class="el" href="boot_8php.html#a9255af5ae9c887520091ea04763c1a88">notice()</a>, <a class="el" href="oexchange_8php.html#a2d8b785cd7d041a4e6274f5af370cf26">oexchange_content()</a>, <a class="el" href="parse__url_8php.html#a05a9e8944380ba3cf6bbf5893dd4b74b">parse_url_content()</a>, <a class="el" href="include_2photos_8php.html#a6c40ef58aefef705a5adc84a40e97109">photo_upload()</a>, <a class="el" href="mod_2photos_8php.html#aa87382611a66ec5effdb2d78f13f5812">photos_content()</a>, <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>, <a class="el" href="ping_8php.html#a77217b1b190b4c5d8770867b45f0c0a1">ping_init()</a>, <a class="el" href="poco_8php.html#a53def16f75e3d41f1d2bb7cfa4905498">poco_init()</a>, <a class="el" href="socgraph_8php.html#a5ef8bef37161df53718a21e93d02fbd6">poco_load()</a>, <a class="el" href="poke_8php.html#ac9190563a8da9c07a16f9dcd71cf6993">poke_content()</a>, <a class="el" href="poke_8php.html#a9725aab97b3983e6a98bd81c4efe7d3b">poke_init()</a>, <a class="el" href="items_8php.html#a410f9c743877c125ca06312373346903">post_activity_item()</a>, <a class="el" href="post_8php.html#af4b48181ce773ef0cdfc972441445c34">post_init()</a>, <a class="el" href="dba__driver_8php.html#a55bf30d8176967e682656b5be4ad9249">printable()</a>, <a class="el" href="probe_8php.html#a1f1db3fa6038e451e737964c94bf5e99">probe_content()</a>, <a class="el" href="boot_8php.html#ab346a2ece14993861f3e4206befa94f0">proc_run()</a>, <a class="el" href="zot_8php.html#a37ec13b18057634eadb071f05297f5e1">process_delivery()</a>, <a class="el" href="profile__photo_8php.html#a4b80234074bd603221aa5364f330e479">profile_photo_post()</a>, <a class="el" href="identity_8php.html#a432259b2cf5b6f59be53e71db9f2c7dc">profile_sidebar()</a>, <a class="el" href="profiles_8php.html#ab0362c81b1d3b0b12a772b9fac446e04">profiles_post()</a>, <a class="el" href="session_8php.html#a7f0f50576360d9ba52d29364e0b83a8e">ref_session_read()</a>, <a class="el" href="register_8php.html#a0e91f57f111407ea8d3223a05022bb2a">register_content()</a>, <a class="el" href="register_8php.html#a51731dcc1917c58a790eb1c0f6132271">register_post()</a>, <a class="el" href="classApp.html#abf46a653d8499e7c253cc1be894a6d83">App\register_template_engine()</a>, <a class="el" href="regmod_8php.html#a7953df4e32e63946565e90cdd5d50409">regmod_content()</a>, <a class="el" href="boot_8php.html#a5542c5c2806ab8bca04bad53d47b5209">remote_user()</a>, <a class="el" href="removeme_8php.html#a7be08738beca44bb98a79e01cdb2ee88">removeme_post()</a>, <a class="el" href="rpost_8php.html#a8190354d789000806d9879aea276728f">rpost_content()</a>, <a class="el" href="plugin_8php.html#a0e8c2ea50bfdbc39e17ccccaea21ddc3">script_path()</a>, <a class="el" href="search__ac_8php.html#a14f90c83a3f2be095e9e2992a8d66138">search_ac_init()</a>, <a class="el" href="search_8php.html#ab2568591359edde5b483a6cd9a24b2cc">search_content()</a>, <a class="el" href="search_8php.html#acf19fd30f07f495781ca0d7a0a08b435">search_init()</a>, <a class="el" href="plugin_8php.html#a030cec6793b909c439c0336ba39b1571">service_class_allows()</a>, <a class="el" href="plugin_8php.html#a905b54e10704b283ac64680a8abc0971">service_class_fetch()</a>, <a class="el" href="classApp.html#a78788f6e9d8b713b138f81e457c5cd08">App\set_baseurl()</a>, <a class="el" href="settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586">settings_post()</a>, <a class="el" href="setup_8php.html#a88247384a96e14516f474d7af6a465c1">setup_content()</a>, <a class="el" href="setup_8php.html#a267555abd17290e659b4bf44b885e4e0">setup_init()</a>, <a class="el" href="siteinfo_8php.html#a3efbd0bd6564af19ec0a9ce0294e59d0">siteinfo_init()</a>, <a class="el" href="suggest_8php.html#a696acf1dd8070e479adcc80c63c6718c">suggest_init()</a>, <a class="el" href="language_8php.html#aae0c3638fb476ae1e31f8d242f5dac04">t()</a>, <a class="el" href="tagrm_8php.html#a1702f40aa53a2fa93deade1f609abe78">tagrm_post()</a>, <a class="el" href="classApp.html#a94a1ed2dc493c58612d17035b74ae736">App\template_engine()</a>, <a class="el" href="language_8php.html#ae310fb3880484ee1cc4faefe0c63c06d">tt()</a>, <a class="el" href="identity_8php.html#af2802bc13a00a17b867bba7978ba8f58">validate_channelname()</a>, <a class="el" href="wall__upload_8php.html#a7cbe204244cf9e0380ee932263a74d8f">wall_upload_post()</a>, <a class="el" href="webfinger_8php.html#a17dd28db6d390194bf9ecb809739d1d3">webfinger_content()</a>, <a class="el" href="wfinger_8php.html#ae21e50c8d0a5f3c9be9f43a4e519acd3">wfinger_init()</a>, <a class="el" href="widgets_8php.html#add9b24d3304e529a7975e96122315554">widget_affinity()</a>, <a class="el" href="widgets_8php.html#af37fdad3b2e861d860a4a8c4d8a76c0b">widget_categories()</a>, <a class="el" href="widgets_8php.html#a5ab3b64496e02cab56429978ad55f1c0">widget_filer()</a>, <a class="el" href="widgets_8php.html#a94203eb9bcd63cbdecbbcb15163598d8">widget_savedsearch()</a>, <a class="el" href="widgets_8php.html#a6dbc227aac750774284ee39c45f0a200">widget_tagcloud()</a>, <a class="el" href="xchan_8php.html#a9853348bf1a35c644460221ba75edc2d">xchan_content()</a>, <a class="el" href="include_2network_8php.html#aafd06c0a75402aefb06cfb9f9740fa37">z_fetch_url()</a>, <a class="el" href="include_2network_8php.html#a9129fd55e7fc175b4ea9a195cccc16bc">z_post_url()</a>, and <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aba208673515cbb8a55e5fa4a1da99fda"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">z_path </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="boot_8php.html#a081307d681d7d04f17b9ced2076e7c85">absurl()</a>, and <a class="el" href="hostxrd_8php.html#aa37ffc8e7900bc76c4828bd25916db92">hostxrd_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="add517a0958ac684792c62142a3877f81"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">z_root </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="zot_8php.html#a703f528ade8382cf374e4119bd6f7859">allowed_public_recips()</a>, <a class="el" href="bbcode_8php.html#a851f5aafefe52474201b83f9fd65931f">bb_parse_crypt()</a>, <a class="el" href="bbcode_8php.html#a009f61aaf78771737ed0765c8463911b">bbcode()</a>, <a class="el" href="blocks_8php.html#a2531a8fd51db3cecb2eb20c002c66e12">blocks_content()</a>, <a class="el" href="text_8php.html#a85e3a4851c16674834010d8419a5d7ca">chanlink_cid()</a>, <a class="el" href="text_8php.html#a55ab893be57feda59c2a7ba1e58ff2d0">chanlink_hash()</a>, <a class="el" href="text_8php.html#a2e8d6c402603be3a1256a16605e09c2a">chanlink_url()</a>, <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>, <a class="el" href="Contact_8php.html#a186162051a5127069cc851d78740f205">channel_remove()</a>, <a class="el" href="chanview_8php.html#a4192c6da888c8c1165851acf9ad4cb8b">chanview_content()</a>, <a class="el" href="boot_8php.html#a4c02d88e66852a01bd5a1feecb7c3ce3">check_config()</a>, <a class="el" href="connect_8php.html#a417ec27afe33f21a929667a665e32ee2">connect_post()</a>, <a class="el" href="connections_8php.html#aec2e457420fce3e3bf6a9f48e36df25c">connections_content()</a>, <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation()</a>, <a class="el" href="identity_8php.html#a345f4c943d84de502ec6e72d2c813945">create_identity()</a>, <a class="el" href="deliver_8php.html#a397afcb9afecf0c1816b0951189dd346">deliver_run()</a>, <a class="el" href="mod_2directory_8php.html#aac79396570d759da2efac24fcedf5b44">directory_content()</a>, <a class="el" href="dirprofile_8php.html#a3e1d30d3d93863ff5615f2df4ac7f052">dirprofile_init()</a>, <a class="el" href="display_8php.html#a37137c98d47bf3306f4c2bb9f5b60de0">display_content()</a>, <a class="el" href="event_8php.html#a89ef533faf345db8d64a58d4856bde3a">event_store()</a>, <a class="el" href="filestorage_8php.html#a61bb1be78472555df4ce619f51014040">filestorage_content()</a>, <a class="el" href="mod_2follow_8php.html#a171f5b19f50d7738adc3b2e96ec6018a">follow_init()</a>, <a class="el" href="text_8php.html#a3054189cff173977f4216c9a3dd29e1b">format_categories()</a>, <a class="el" href="text_8php.html#a4e4d42b0a805148d9f9a92bcac89bf91">format_filer()</a>, <a class="el" href="mod_2group_8php.html#aed1f009b1221348021bb34761160ef35">group_post()</a>, <a class="el" href="item_8php.html#aa22feef4de326e1d7078dedd892e615c">handle_tag()</a>, <a class="el" href="classApp.html#af17df107f2216ddf5ad2a7e0f2ba2166">App\head_get_icon()</a>, <a class="el" href="boot_8php.html#a24a7a70afedd5d85fe0eadc85afa9f77">head_get_icon()</a>, <a class="el" href="home_8php.html#ac4642c38b6f23a8d065dd4a75c620bde">home_init()</a>, <a class="el" href="hostxrd_8php.html#aa37ffc8e7900bc76c4828bd25916db92">hostxrd_init()</a>, <a class="el" href="import_8php.html#af17fef0410518f7eac205d0ea416eaa2">import_post()</a>, <a class="el" href="zot_8php.html#a56f3f65514e4e7f0cd117d01735aebd1">import_xchan()</a>, <a class="el" href="invite_8php.html#a244385b28cfd021d308715f01158bfd9">invite_content()</a>, <a class="el" href="conversation_8php.html#aacbb12d372d5e9c3ab0735b4aea48fb3">item_photo_menu()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">item_store()</a>, <a class="el" href="layouts_8php.html#a6e0193759ad9eef76d3df2db24237b50">layouts_content()</a>, <a class="el" href="login_8php.html#a1d69ca88eb9005a7026e128b9a645904">login_content()</a>, <a class="el" href="lostpass_8php.html#a0314d94e48c789b1b3a201d740c9eab3">lostpass_content()</a>, <a class="el" href="lostpass_8php.html#a8ed35ba71a4404eaf4903da61d0321cc">lostpass_post()</a>, <a class="el" href="magic_8php.html#acea2cc792849ca2d71d4b689f66518bf">magic_init()</a>, <a class="el" href="text_8php.html#a24d441d30df4b8e6bf6780bf62a5e2c6">magiclink_url()</a>, <a class="el" href="mail_8php.html#acfc2cc0bf4e0b178207758384977f25a">mail_post()</a>, <a class="el" href="manage_8php.html#a2bca247b5296827638959138367db4f5">manage_content()</a>, <a class="el" href="mod_2menu_8php.html#a6fed23af14d71a78a4153c8363a685cf">menu_content()</a>, <a class="el" href="mod_2menu_8php.html#aaa491ef173868fe002aece4632bcf393">menu_post()</a>, <a class="el" href="mitem_8php.html#a7a31b702ecad18eeb6a38b243ff0037e">mitem_content()</a>, <a class="el" href="mitem_8php.html#a6ee694cca4b551a20d7c7a94b5243ec1">mitem_post()</a>, <a class="el" href="mood_8php.html#a7ae136dd7476865b4828136175db5022">mood_init()</a>, <a class="el" href="acl_8php.html#a57dceff370d4a0e7ae673d50fbfda61f">navbar_complete()</a>, <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>, <a class="el" href="new__channel_8php.html#a180b0646957db8290482f02454ad7f23">new_channel_post()</a>, <a class="el" href="enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc">notification()</a>, <a class="el" href="notifications_8php.html#a5baffec7b2e625c9f9cefbc097550d33">notifications_post()</a>, <a class="el" href="notifier_8php.html#a568c502f626cff95e344c0748938b85d">notifier_run()</a>, <a class="el" href="include_2photos_8php.html#a6c40ef58aefef705a5adc84a40e97109">photo_upload()</a>, <a class="el" href="include_2photos_8php.html#af24c6aeed28ecc31ec39e7d9a1804979">photos_album_widget()</a>, <a class="el" href="include_2photos_8php.html#ad648c0c5544fe9263409b6f6e57c6274">photos_create_item()</a>, <a class="el" href="include_2photos_8php.html#aa27b9e435dcc34e1009f56dc02c7ca51">photos_list_photos()</a>, <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>, <a class="el" href="items_8php.html#a410f9c743877c125ca06312373346903">post_activity_item()</a>, <a class="el" href="post_8php.html#af4b48181ce773ef0cdfc972441445c34">post_init()</a>, <a class="el" href="post_8php.html#af59e6a1dc22d19d9257b01cd7ccedb75">post_post()</a>, <a class="el" href="activities_8php.html#a80134e807719b3c54aba971958d2e132">profile_activity()</a>, <a class="el" href="identity_8php.html#a432259b2cf5b6f59be53e71db9f2c7dc">profile_sidebar()</a>, <a class="el" href="zot_8php.html#a083aec6c900d244e1bfc1406f9461465">public_recips()</a>, <a class="el" href="pubsites_8php.html#af614e279aab54065345bda6b03eafdf0">pubsites_content()</a>, <a class="el" href="register_8php.html#a51731dcc1917c58a790eb1c0f6132271">register_post()</a>, <a class="el" href="removeme_8php.html#a065a589caa2aa84c60f7073a28f0ad9c">removeme_content()</a>, <a class="el" href="rmagic_8php.html#a95455edd43f1bff39446a57388cdde16">rmagic_init()</a>, <a class="el" href="rmagic_8php.html#a869de069d081b3c4e98b957d06bbf08f">rmagic_post()</a>, <a class="el" href="plugin_8php.html#a0e8c2ea50bfdbc39e17ccccaea21ddc3">script_path()</a>, <a class="el" href="search_8php.html#ab2568591359edde5b483a6cd9a24b2cc">search_content()</a>, <a class="el" href="text_8php.html#aae91e4d2a2c6f7a9daccd2c186ae3447">searchbox()</a>, <a class="el" href="account_8php.html#a014de2d5d5c9785de5bf547a485822fa">send_reg_approval_email()</a>, <a class="el" href="account_8php.html#aa9c29c497c17d8f9344dce8631ad8761">send_verification_email()</a>, <a class="el" href="setup_8php.html#a88247384a96e14516f474d7af6a465c1">setup_content()</a>, <a class="el" href="setup_8php.html#a13cf286774149a0a7bd8adb8179cec75">setup_post()</a>, <a class="el" href="siteinfo_8php.html#a70c09bfb6dd1c86a125a35f62ed53656">siteinfo_content()</a>, <a class="el" href="siteinfo_8php.html#a3efbd0bd6564af19ec0a9ce0294e59d0">siteinfo_init()</a>, <a class="el" href="sources_8php.html#ac442ccef080ab95772d8929fcafcb4b7">sources_content()</a>, <a class="el" href="sources_8php.html#ac73298ff162ce7b2de8dcaf3d3305b1e">sources_post()</a>, <a class="el" href="text_8php.html#a33bdb5d4bfff2ede7caf61a98ac0a2e9">sslify()</a>, <a class="el" href="dir__fns_8php.html#aa666e7df6ca8c332f4081c9b66b4bdf6">sync_directories()</a>, <a class="el" href="tagger_8php.html#a0e4a3eb177d1684553c547503d67161c">tagger_content()</a>, <a class="el" href="text_8php.html#af9c9ac3f74c82dc60acfa404d0e9dc53">theme_attachments()</a>, <a class="el" href="thing_8php.html#a8be23b1d475ec3d9291999221c674c80">thing_init()</a>, <a class="el" href="toggle__safesearch_8php.html#a23d5cfb2727a266e44993ffbf5595a79">toggle_safesearch_init()</a>, <a class="el" href="socgraph_8php.html#a790690bb1a1d02483fe31632a160144d">update_suggestions()</a>, <a class="el" href="account_8php.html#ac5c570a2d46446bad4dd2501e9c5a4b1">user_allow()</a>, <a class="el" href="Contact_8php.html#a6348a532c9d26cd1c9afbc9aa6aa8960">vcard_from_xchan()</a>, <a class="el" href="webpages_8php.html#af3b7397d4abc153e3d2147740ee1a41d">webpages_content()</a>, <a class="el" href="wfinger_8php.html#ae21e50c8d0a5f3c9be9f43a4e519acd3">wfinger_init()</a>, <a class="el" href="widgets_8php.html#a7b1e357b5a2027718470b77ec921fc65">widget_archive()</a>, <a class="el" href="widgets_8php.html#a08035db02ff6a23260146b4c64153422">widget_dirtags()</a>, <a class="el" href="widgets_8php.html#a5ab3b64496e02cab56429978ad55f1c0">widget_filer()</a>, <a class="el" href="widgets_8php.html#a94203eb9bcd63cbdecbbcb15163598d8">widget_savedsearch()</a>, <a class="el" href="widgets_8php.html#a0d404276fedc59f5038cf5c085028326">widget_suggestions()</a>, <a class="el" href="xref_8php.html#a9bee399213b8de8226b0d60834307473">xref_init()</a>, <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>, <a class="el" href="identity_8php.html#a680fbafc2db023c5b1309e0180e81315">zid_init()</a>, <a class="el" href="zot_8php.html#a3862b3161b2c8557dc1a95020179bd81">zot_build_packet()</a>, <a class="el" href="zot_8php.html#a61cdc1ec843663c423ed2d8160ae5aea">zot_fetch()</a>, and <a class="el" href="zot_8php.html#ab22d67660702056bf3f4696dcebf5ce7">zot_new_uid()</a>.</p>
+
+</div>
+</div>
+<h2 class="groupheader">Variable Documentation</h2>
+<a class="anchor" id="a222395aa223cfbff6166fab0b4e2e1d5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ABOOK_FLAG_ARCHIVED 0x0008</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="acl_8php.html#ac6776dba871806ecdb5d1659bc2eb07a">acl_init()</a>, <a class="el" href="items_8php.html#a01e3cf44e082fa9bd06dcde5bf713d70">collect_recipients()</a>, <a class="el" href="connections_8php.html#aec2e457420fce3e3bf6a9f48e36df25c">connections_content()</a>, <a class="el" href="connedit_8php.html#a795acb3d9d841f55c255d7611681ab67">connedit_content()</a>, <a class="el" href="Contact_8php.html#a28e062c884331dbb5dfa713228c25ad6">contact_remove()</a>, and <a class="el" href="poller_8php.html#a5f12df3a4738124b6c039971e87e76da">poller_run()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a52b599cd13e152ebc80d7e4413683195"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ABOOK_FLAG_BLOCKED 0x0001</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="acl_8php.html#ac6776dba871806ecdb5d1659bc2eb07a">acl_init()</a>, <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>, <a class="el" href="connections_8php.html#aec2e457420fce3e3bf6a9f48e36df25c">connections_content()</a>, <a class="el" href="connedit_8php.html#a795acb3d9d841f55c255d7611681ab67">connedit_content()</a>, <a class="el" href="permissions_8php.html#aeca9b280f3dc3358c89976d81d690008">get_all_perms()</a>, <a class="el" href="mod_2group_8php.html#a07a64f6c65b0080d8190b3d9728a7a83">group_content()</a>, <a class="el" href="include_2group_8php.html#a5bd191d9692e6c34d48c0ede10810f09">group_get_members()</a>, <a class="el" href="items_8php.html#a756738301f2ed96be50232500677d58a">items_fetch()</a>, <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>, <a class="el" href="permissions_8php.html#a67ada9ed51e77885b6b0f6a28cee1835">perm_is_allowed()</a>, and <a class="el" href="search_8php.html#ab2568591359edde5b483a6cd9a24b2cc">search_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a34c756469ebed32e2fc987bcde62d382"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ABOOK_FLAG_HIDDEN 0x0004</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="connections_8php.html#aec2e457420fce3e3bf6a9f48e36df25c">connections_content()</a>, <a class="el" href="connedit_8php.html#a795acb3d9d841f55c255d7611681ab67">connedit_content()</a>, <a class="el" href="onepoll_8php.html#a72753b2fdec79b37c7f432035c91fb6d">onepoll_run()</a>, and <a class="el" href="poller_8php.html#a5f12df3a4738124b6c039971e87e76da">poller_run()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa3425e2de85b08f7041656d3a8502cb6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ABOOK_FLAG_IGNORED 0x0002</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="connections_8php.html#aec2e457420fce3e3bf6a9f48e36df25c">connections_content()</a>, <a class="el" href="connedit_8php.html#a795acb3d9d841f55c255d7611681ab67">connedit_content()</a>, <a class="el" href="permissions_8php.html#aeca9b280f3dc3358c89976d81d690008">get_all_perms()</a>, and <a class="el" href="permissions_8php.html#a67ada9ed51e77885b6b0f6a28cee1835">perm_is_allowed()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a68eebe493e6f729ffd1aeda7a4b11155"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ABOOK_FLAG_PENDING 0x0010</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="acl_8php.html#ac6776dba871806ecdb5d1659bc2eb07a">acl_init()</a>, <a class="el" href="items_8php.html#a01e3cf44e082fa9bd06dcde5bf713d70">collect_recipients()</a>, <a class="el" href="connections_8php.html#aec2e457420fce3e3bf6a9f48e36df25c">connections_content()</a>, <a class="el" href="connections_8php.html#a1224058db8e3fb56463eb312f98e561d">connections_post()</a>, <a class="el" href="connedit_8php.html#a795acb3d9d841f55c255d7611681ab67">connedit_content()</a>, <a class="el" href="connedit_8php.html#a234c48426b652bf4d37053f2af329ac5">connedit_post()</a>, <a class="el" href="permissions_8php.html#aeca9b280f3dc3358c89976d81d690008">get_all_perms()</a>, <a class="el" href="mod_2group_8php.html#a07a64f6c65b0080d8190b3d9728a7a83">group_content()</a>, <a class="el" href="include_2group_8php.html#a5bd191d9692e6c34d48c0ede10810f09">group_get_members()</a>, <a class="el" href="onepoll_8php.html#a72753b2fdec79b37c7f432035c91fb6d">onepoll_run()</a>, <a class="el" href="permissions_8php.html#a67ada9ed51e77885b6b0f6a28cee1835">perm_is_allowed()</a>, <a class="el" href="ping_8php.html#a77217b1b190b4c5d8770867b45f0c0a1">ping_init()</a>, and <a class="el" href="zot_8php.html#a7b23bfb31d4491231e1e73bdc077240d">zot_refresh()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a0450389f24c632906fbc24347700a543"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ABOOK_FLAG_SELF 0x0080</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="Contact_8php.html#ae8803c330352cbf1e828eb7490edf47e">abook_connections()</a>, <a class="el" href="Contact_8php.html#ad5b02c2a962ee55b1b7ca6c159d6e4c5">abook_self()</a>, <a class="el" href="acl_8php.html#ac6776dba871806ecdb5d1659bc2eb07a">acl_init()</a>, <a class="el" href="classConversation.html#a8335cdd43f1836e3c255638e61a09e16">Conversation\add_thread()</a>, <a class="el" href="include_2api_8php.html#aa40bae797bcd9ccacffdce5a3b5a1afa">api_get_user()</a>, <a class="el" href="Contact_8php.html#a186162051a5127069cc851d78740f205">channel_remove()</a>, <a class="el" href="items_8php.html#a01e3cf44e082fa9bd06dcde5bf713d70">collect_recipients()</a>, <a class="el" href="connections_8php.html#aec2e457420fce3e3bf6a9f48e36df25c">connections_content()</a>, <a class="el" href="connections_8php.html#a1224058db8e3fb56463eb312f98e561d">connections_post()</a>, <a class="el" href="connedit_8php.html#a795acb3d9d841f55c255d7611681ab67">connedit_content()</a>, <a class="el" href="connedit_8php.html#a234c48426b652bf4d37053f2af329ac5">connedit_post()</a>, <a class="el" href="Contact_8php.html#a28e062c884331dbb5dfa713228c25ad6">contact_remove()</a>, <a class="el" href="acl__selectors_8php.html#a9476997d2968a5794f3723878ed89c91">contact_select()</a>, <a class="el" href="contactgroup_8php.html#a18c7391b1b25debaf98c9dba639caab3">contactgroup_content()</a>, <a class="el" href="identity_8php.html#a345f4c943d84de502ec6e72d2c813945">create_identity()</a>, <a class="el" href="permissions_8php.html#aeca9b280f3dc3358c89976d81d690008">get_all_perms()</a>, <a class="el" href="mod_2group_8php.html#a07a64f6c65b0080d8190b3d9728a7a83">group_content()</a>, <a class="el" href="include_2group_8php.html#a5bd191d9692e6c34d48c0ede10810f09">group_get_members()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="boot_8php.html#a719c7f3972d5f9268f37a41c76cd4ef6">load_contact_links()</a>, <a class="el" href="include_2follow_8php.html#ae387d4ae097c23d69f3247e7f08140c7">new_contact()</a>, <a class="el" href="notifier_8php.html#a568c502f626cff95e344c0748938b85d">notifier_run()</a>, <a class="el" href="permissions_8php.html#a67ada9ed51e77885b6b0f6a28cee1835">perm_is_allowed()</a>, <a class="el" href="ping_8php.html#a77217b1b190b4c5d8770867b45f0c0a1">ping_init()</a>, <a class="el" href="poco_8php.html#a53def16f75e3d41f1d2bb7cfa4905498">poco_init()</a>, <a class="el" href="widgets_8php.html#ad1bf7aa69e8d100d95faba17c7bc91cd">widget_follow()</a>, <a class="el" href="widgets_8php.html#aaa73bcf1702eaadd9dcd253502f55e01">widget_settings_menu()</a>, and <a class="el" href="zot_8php.html#a7b23bfb31d4491231e1e73bdc077240d">zot_refresh()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="afbb1fe1b2c8c730ec8e08da93b6512c4"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ACCESS_FREE 2</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="admin_8php.html#ac0f3bd12431c056aad77bac9d09fa30e">admin_page_site()</a>, <a class="el" href="zot_8php.html#a2657e141d62d5f67ad3c87651b585299">import_site()</a>, <a class="el" href="dirsearch_8php.html#a985d410a170549429857af6ff2673149">list_public_sites()</a>, and <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a9c80420e5a063a4a87ce4831f086134d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ACCESS_PAID 1</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="admin_8php.html#ac0f3bd12431c056aad77bac9d09fa30e">admin_page_site()</a>, <a class="el" href="zot_8php.html#a2657e141d62d5f67ad3c87651b585299">import_site()</a>, <a class="el" href="dirsearch_8php.html#a985d410a170549429857af6ff2673149">list_public_sites()</a>, and <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a7f3474fec541e261fc8dff47313c4017"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ACCESS_PRIVATE 0</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>site access policy </p>
+
+<p>Referenced by <a class="el" href="admin_8php.html#ac0f3bd12431c056aad77bac9d09fa30e">admin_page_site()</a>, <a class="el" href="zot_8php.html#a2657e141d62d5f67ad3c87651b585299">import_site()</a>, and <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aeb1039302affcbe7e8872c01c08c88f8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ACCESS_TIERED 3</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="admin_8php.html#ac0f3bd12431c056aad77bac9d09fa30e">admin_page_site()</a>, <a class="el" href="zot_8php.html#a2657e141d62d5f67ad3c87651b585299">import_site()</a>, <a class="el" href="dirsearch_8php.html#a985d410a170549429857af6ff2673149">list_public_sites()</a>, and <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="af3bdfc20979c16f15bb9c60446a480f9"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ACCOUNT_BLOCKED 0x0002</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="admin_8php.html#a62f10f90c47686c9c3c37c4c03a108d2">admin_page_users()</a>, <a class="el" href="admin_8php.html#a5a696706a3869800e65fb365214241b7">admin_page_users_post()</a>, <a class="el" href="register_8php.html#a51731dcc1917c58a790eb1c0f6132271">register_post()</a>, and <a class="el" href="account_8php.html#ac5c570a2d46446bad4dd2501e9c5a4b1">user_allow()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a400519fa181591cd6fdbb8f25fbcba0a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ACCOUNT_EXPIRED 0x0004</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="poller_8php.html#a5f12df3a4738124b6c039971e87e76da">poller_run()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a84057c5bfa1bca5fba8497fe005ee4d8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ACCOUNT_OK 0x0000</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Account Flags </p>
+
+<p>Referenced by <a class="el" href="auth_8php.html#a07bae0e623e2daa9ee2cd5a8aa294dee">account_verify_password()</a>, <a class="el" href="account_8php.html#a141fe579c351c78209d425473f978eb5">create_account()</a>, <a class="el" href="onepoll_8php.html#a72753b2fdec79b37c7f432035c91fb6d">onepoll_run()</a>, <a class="el" href="poller_8php.html#a5f12df3a4738124b6c039971e87e76da">poller_run()</a>, and <a class="el" href="classRedBasicAuth.html#a8dfd9a0953f8884723b421b7c1acf79b">RedBasicAuth\validateUserPass()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a032bbd6d0321e99e9117332c9ed2b1b8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ACCOUNT_PENDING 0x0010</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="admin_8php.html#a62f10f90c47686c9c3c37c4c03a108d2">admin_page_users()</a>, <a class="el" href="ping_8php.html#a77217b1b190b4c5d8770867b45f0c0a1">ping_init()</a>, <a class="el" href="register_8php.html#a51731dcc1917c58a790eb1c0f6132271">register_post()</a>, and <a class="el" href="account_8php.html#ac5c570a2d46446bad4dd2501e9c5a4b1">user_allow()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ab5ddbe69d3d03acd06e1fb281488cb78"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ACCOUNT_REMOVED 0x0008</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ac8400313df2c831653f9036f71ebd86d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ACCOUNT_ROLE_ADMIN 0x1000</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="Contact_8php.html#a6e64de7db60b7243dce45fb6347636ff">account_remove()</a>, <a class="el" href="account_8php.html#a141fe579c351c78209d425473f978eb5">create_account()</a>, <a class="el" href="boot_8php.html#aa1e828bbbcba170265eb2668d8daf42e">is_site_admin()</a>, and <a class="el" href="account_8php.html#a014de2d5d5c9785de5bf547a485822fa">send_reg_approval_email()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a84f48897059bbd4a8738d7ee4cec6688"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ACCOUNT_ROLE_ALLOWCODE 0x0001</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Account roles </p>
+
+<p>Referenced by <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="text_8php.html#a1633412120f52bdce5f43e0a127d9293">mimetype_select()</a>, and <a class="el" href="text_8php.html#a324c58f37f6acdf9cd1922aa76077d9f">z_input_filter()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a7c2eb822d50e1554bf5c32861f36342b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ACCOUNT_ROLE_SYSTEM 0x0002</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="af3a4271630aabd8be592213f925d6a36"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ACCOUNT_UNVERIFIED 0x0001</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="auth_8php.html#a07bae0e623e2daa9ee2cd5a8aa294dee">account_verify_password()</a>, <a class="el" href="onepoll_8php.html#a72753b2fdec79b37c7f432035c91fb6d">onepoll_run()</a>, <a class="el" href="poller_8php.html#a5f12df3a4738124b6c039971e87e76da">poller_run()</a>, <a class="el" href="register_8php.html#a51731dcc1917c58a790eb1c0f6132271">register_post()</a>, and <a class="el" href="classRedBasicAuth.html#a8dfd9a0953f8884723b421b7c1acf79b">RedBasicAuth\validateUserPass()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a0e57f846e6d47a308feced0f7274f178"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ACTIVITY_DISLIKE <a class="el" href="boot_8php.html#a49f2a70b3b43aa904223a8d19e986a47">NAMESPACE_ZOT</a> . '/activity/dislike'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classItem.html#a80dcd9d0f548c3ad550abe7e6981fb51">Item\add_child()</a>, <a class="el" href="classConversation.html#a8335cdd43f1836e3c255638e61a09e16">Conversation\add_thread()</a>, <a class="el" href="items_8php.html#a8794863cdf8ce1333040933d3a3f66bd">consume_feed()</a>, <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation()</a>, <a class="el" href="like_8php.html#a9d7dd268f21c21e9d29dd2aca2dd9538">like_content()</a>, <a class="el" href="conversation_8php.html#afe5b2f38d8b803edb0d7ec5fa2868db0">like_puller()</a>, <a class="el" href="conversation_8php.html#a9bd7f9fb6678736c581bcba3b17f471c">localize_item()</a>, and <a class="el" href="conversation_8php.html#a7eeaaf44506815576f3bd80053ef52c3">visible_activity()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a3e2ea123d29a72012db1241f96280b0e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ACTIVITY_FAVORITE <a class="el" href="boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133">NAMESPACE_ACTIVITY_SCHEMA</a> . 'favorite'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a5ae728ac966ea1d3525a19e7fec59434"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ACTIVITY_FOLLOW <a class="el" href="boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133">NAMESPACE_ACTIVITY_SCHEMA</a> . 'follow'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a8794863cdf8ce1333040933d3a3f66bd">consume_feed()</a>, and <a class="el" href="subthread_8php.html#a50368f3d825b77996030528e7fbfa3d3">subthread_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a176664e78dcb9132e16be69418223eb2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ACTIVITY_FRIEND <a class="el" href="boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133">NAMESPACE_ACTIVITY_SCHEMA</a> . 'make-friend'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="conversation_8php.html#a9bd7f9fb6678736c581bcba3b17f471c">localize_item()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aced60c7285192e80b7c4757e45a7f1e3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ACTIVITY_JOIN <a class="el" href="boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133">NAMESPACE_ACTIVITY_SCHEMA</a> . 'join'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="abdcdfc873ace4e0902177bad934de0c0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ACTIVITY_LIKE <a class="el" href="boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133">NAMESPACE_ACTIVITY_SCHEMA</a> . 'like'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>activity stream defines </p>
+
+<p>Referenced by <a class="el" href="classItem.html#a80dcd9d0f548c3ad550abe7e6981fb51">Item\add_child()</a>, <a class="el" href="classConversation.html#a8335cdd43f1836e3c255638e61a09e16">Conversation\add_thread()</a>, <a class="el" href="items_8php.html#a8794863cdf8ce1333040933d3a3f66bd">consume_feed()</a>, <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation()</a>, <a class="el" href="like_8php.html#a9d7dd268f21c21e9d29dd2aca2dd9538">like_content()</a>, <a class="el" href="conversation_8php.html#afe5b2f38d8b803edb0d7ec5fa2868db0">like_puller()</a>, <a class="el" href="conversation_8php.html#a9bd7f9fb6678736c581bcba3b17f471c">localize_item()</a>, and <a class="el" href="conversation_8php.html#a7eeaaf44506815576f3bd80053ef52c3">visible_activity()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a7aa57438db03834aaa0b468bdce773a6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ACTIVITY_MOOD <a class="el" href="boot_8php.html#a49f2a70b3b43aa904223a8d19e986a47">NAMESPACE_ZOT</a> . '/activity/mood'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="conversation_8php.html#a9bd7f9fb6678736c581bcba3b17f471c">localize_item()</a>, and <a class="el" href="mood_8php.html#a7ae136dd7476865b4828136175db5022">mood_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aaf9b76832ee5f85e56466af162ba8a14"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ACTIVITY_OBJ_ALBUM <a class="el" href="boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133">NAMESPACE_ACTIVITY_SCHEMA</a> . 'photo-album'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a0a98dd0110dc6c8e24cefc8ae74d5562"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ACTIVITY_OBJ_COMMENT <a class="el" href="boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133">NAMESPACE_ACTIVITY_SCHEMA</a> . 'comment'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a2e90096fede6acce16abf0da8cb2febe"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ACTIVITY_OBJ_EVENT <a class="el" href="boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133">NAMESPACE_ACTIVITY_SCHEMA</a> . 'event'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a8794863cdf8ce1333040933d3a3f66bd">consume_feed()</a>, <a class="el" href="event_8php.html#a89ef533faf345db8d64a58d4856bde3a">event_store()</a>, <a class="el" href="conversation_8php.html#a9bd7f9fb6678736c581bcba3b17f471c">localize_item()</a>, <a class="el" href="zot_8php.html#a37ec13b18057634eadb071f05297f5e1">process_delivery()</a>, and <a class="el" href="tagger_8php.html#a0e4a3eb177d1684553c547503d67161c">tagger_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a7bff2278e68a71e524afd1c7c951e1e3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ACTIVITY_OBJ_GROUP <a class="el" href="boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133">NAMESPACE_ACTIVITY_SCHEMA</a> . 'group'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ad302cb26b838898d475f57f61b0fcc9f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ACTIVITY_OBJ_HEART <a class="el" href="boot_8php.html#a49f2a70b3b43aa904223a8d19e986a47">NAMESPACE_ZOT</a> . '/activity/heart'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a44d069c8a1cfcc6d2007c506a17ff28f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ACTIVITY_OBJ_NOTE <a class="el" href="boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133">NAMESPACE_ACTIVITY_SCHEMA</a> . 'note'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#a4c6fb9fb5203aa60f4b3afd4521db8ea">api_format_items()</a>, <a class="el" href="items_8php.html#a8794863cdf8ce1333040933d3a3f66bd">consume_feed()</a>, <a class="el" href="like_8php.html#a9d7dd268f21c21e9d29dd2aca2dd9538">like_content()</a>, <a class="el" href="conversation_8php.html#a9bd7f9fb6678736c581bcba3b17f471c">localize_item()</a>, <a class="el" href="items_8php.html#a410f9c743877c125ca06312373346903">post_activity_item()</a>, <a class="el" href="subthread_8php.html#a50368f3d825b77996030528e7fbfa3d3">subthread_content()</a>, and <a class="el" href="tagger_8php.html#a0e4a3eb177d1684553c547503d67161c">tagger_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a74bf27f7564c9a37975e7b37d973dcab"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ACTIVITY_OBJ_P_PHOTO <a class="el" href="boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133">NAMESPACE_ACTIVITY_SCHEMA</a> . 'profile-photo'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a2f8f25b13480c37a5f22511f53da8bab"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ACTIVITY_OBJ_PERSON <a class="el" href="boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133">NAMESPACE_ACTIVITY_SCHEMA</a> . 'person'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a896c1809d58f2d7a42cfe14577958ddf">get_atom_elements()</a>, <a class="el" href="conversation_8php.html#a9bd7f9fb6678736c581bcba3b17f471c">localize_item()</a>, <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>, and <a class="el" href="poke_8php.html#a9725aab97b3983e6a98bd81c4efe7d3b">poke_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a774f0f792ebfec1e774c5a17bb9d5966"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ACTIVITY_OBJ_PHOTO <a class="el" href="boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133">NAMESPACE_ACTIVITY_SCHEMA</a> . 'photo'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="like_8php.html#a9d7dd268f21c21e9d29dd2aca2dd9538">like_content()</a>, <a class="el" href="conversation_8php.html#a9bd7f9fb6678736c581bcba3b17f471c">localize_item()</a>, <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>, <a class="el" href="subthread_8php.html#a50368f3d825b77996030528e7fbfa3d3">subthread_content()</a>, and <a class="el" href="tagger_8php.html#a0e4a3eb177d1684553c547503d67161c">tagger_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a62c832a95e38b1fa23e6cef39521b7d5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ACTIVITY_OBJ_PROFILE <a class="el" href="boot_8php.html#a49f2a70b3b43aa904223a8d19e986a47">NAMESPACE_ZOT</a> . '/activity/profile'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="activities_8php.html#a80134e807719b3c54aba971958d2e132">profile_activity()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a1da180f961f49a11573cac4ff6c62c05"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ACTIVITY_OBJ_TAGTERM <a class="el" href="boot_8php.html#a49f2a70b3b43aa904223a8d19e986a47">NAMESPACE_ZOT</a> . '/activity/tagterm'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a8794863cdf8ce1333040933d3a3f66bd">consume_feed()</a>, <a class="el" href="zot_8php.html#aad25a3fe0e1566121d6fb8222979bc10">remove_community_tag()</a>, <a class="el" href="items_8php.html#ab1bce4261bcf75ad62753b498a144d17">tag_deliver()</a>, and <a class="el" href="tagger_8php.html#a0e4a3eb177d1684553c547503d67161c">tagger_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a0fb63e51c2a9814941842ae8f2f4dff8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ACTIVITY_OBJ_THING <a class="el" href="boot_8php.html#a49f2a70b3b43aa904223a8d19e986a47">NAMESPACE_ZOT</a> . '/activity/thing'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="conversation_8php.html#a9bd7f9fb6678736c581bcba3b17f471c">localize_item()</a>, and <a class="el" href="thing_8php.html#a8be23b1d475ec3d9291999221c674c80">thing_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a14ba8f9e162f2559831ee3bf98e0c3bd"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ACTIVITY_POKE <a class="el" href="boot_8php.html#a49f2a70b3b43aa904223a8d19e986a47">NAMESPACE_ZOT</a> . '/activity/poke'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="conversation_8php.html#a9bd7f9fb6678736c581bcba3b17f471c">localize_item()</a>, and <a class="el" href="poke_8php.html#a9725aab97b3983e6a98bd81c4efe7d3b">poke_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a5c3747e0f505f0d5271dc4c54e3feaf4"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ACTIVITY_POST <a class="el" href="boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133">NAMESPACE_ACTIVITY_SCHEMA</a> . 'post'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#a4c6fb9fb5203aa60f4b3afd4521db8ea">api_format_items()</a>, <a class="el" href="include_2api_8php.html#a645397787618b5c548a31e8686e8cca4">api_status_show()</a>, <a class="el" href="include_2api_8php.html#abe8e929e93f7ab134b1cb1fb30f19a76">api_users_show()</a>, <a class="el" href="items_8php.html#a8f3c85c584ccd2b98c3ca440e45b40f8">construct_verb()</a>, <a class="el" href="event_8php.html#a89ef533faf345db8d64a58d4856bde3a">event_store()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="text_8php.html#ac1dbf2e37e8069bea2c0f557fdbf203e">item_post_type()</a>, <a class="el" href="items_8php.html#a77da7ce9a117601d49ac4a67c71b514f">mail_store()</a>, <a class="el" href="include_2photos_8php.html#a6c40ef58aefef705a5adc84a40e97109">photo_upload()</a>, <a class="el" href="items_8php.html#a410f9c743877c125ca06312373346903">post_activity_item()</a>, and <a class="el" href="items_8php.html#aab9e0c58247427126de0699c729c3b6c">send_status_notifications()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="afe084c30a1810c10442edb4fbcbc0086"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ACTIVITY_REQ_FRIEND <a class="el" href="boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133">NAMESPACE_ACTIVITY_SCHEMA</a> . 'request-friend'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a8794863cdf8ce1333040933d3a3f66bd">consume_feed()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a12c781cefc20167231e2e3fd5866b1b5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ACTIVITY_TAG <a class="el" href="boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133">NAMESPACE_ACTIVITY_SCHEMA</a> . 'tag'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a8794863cdf8ce1333040933d3a3f66bd">consume_feed()</a>, <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>, <a class="el" href="zot_8php.html#aad25a3fe0e1566121d6fb8222979bc10">remove_community_tag()</a>, <a class="el" href="items_8php.html#ab1bce4261bcf75ad62753b498a144d17">tag_deliver()</a>, and <a class="el" href="tagger_8php.html#a0e4a3eb177d1684553c547503d67161c">tagger_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a53e4bdb6f225da55115acb9277f75e53"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ACTIVITY_UNFOLLOW <a class="el" href="boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133">NAMESPACE_ACTIVITY_SCHEMA</a> . 'stop-following'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a8794863cdf8ce1333040933d3a3f66bd">consume_feed()</a>, and <a class="el" href="items_8php.html#a896c1809d58f2d7a42cfe14577958ddf">get_atom_elements()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a29528a2544373cc19a378f350040c6a1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ACTIVITY_UNFRIEND <a class="el" href="boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133">NAMESPACE_ACTIVITY_SCHEMA</a> . 'remove-friend'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a8794863cdf8ce1333040933d3a3f66bd">consume_feed()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a7f4264232dbb6c3b41f2617deecb1866"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ACTIVITY_UPDATE <a class="el" href="boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133">NAMESPACE_ACTIVITY_SCHEMA</a> . 'update'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="activities_8php.html#a80134e807719b3c54aba971958d2e132">profile_activity()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ad34c1547020a305915bcc39707744690"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ATOM_TIME 'Y-m-d\TH:i:s\Z'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#ae8f5863e18d69421005c71441c9d99a5">api_account_rate_limit_status()</a>, <a class="el" href="include_2api_8php.html#a6a04b48168ba1d9dd2de3081a630611f">api_rss_extra()</a>, <a class="el" href="items_8php.html#a275108c050f7eb18bcbb5018e6b81cf6">atom_entry()</a>, <a class="el" href="event_8php.html#a2ac9f1b08de03250ecd794f705781d17">format_event_html()</a>, and <a class="el" href="items_8php.html#a04a35b610acfe54434df08adec39c0c7">get_feed_for()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa74438cf71e48e37bf7b440b94243985"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ATTACH_FLAG_DIR 0x0001</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2attach_8php.html#a5c0875eafb8c0f8a0620ff7a875a2221">attach_change_permissions()</a>, <a class="el" href="include_2attach_8php.html#a70bd666e080c2af5a91f5d14c297b8cd">attach_delete()</a>, <a class="el" href="include_2attach_8php.html#ab6830b3ab74a5d284876141ac80f6cbc">attach_mkdir()</a>, <a class="el" href="classRedFile.html#aef71c9eaac7052be7dc8602eb12171e7">RedFile\delete()</a>, <a class="el" href="filestorage_8php.html#a61bb1be78472555df4ce619f51014040">filestorage_content()</a>, <a class="el" href="include_2attach_8php.html#a6aa00ea010ea030110faefb75eafc1ce">get_cloudpath()</a>, <a class="el" href="classRedDirectory.html#a70173d4458572d95e586b2037d2fd2f4">RedDirectory\getDir()</a>, <a class="el" href="reddav_8php.html#a5df0d09893f2e65dc5cf6bbab6cfb266">RedCollectionData()</a>, <a class="el" href="reddav_8php.html#a9f531641dfb4e43cd88ac1a9ae7e2088">RedFileData()</a>, and <a class="el" href="include_2attach_8php.html#aeb07968990e66a88c95483ca09a7f909">z_readdir()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a781916f83fcc8ff1035649afa45f0292"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ATTACH_FLAG_OS 0x0002</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2attach_8php.html#a70bd666e080c2af5a91f5d14c297b8cd">attach_delete()</a>, <a class="el" href="mod_2attach_8php.html#aa88eb5ad87aa1036a30e70339cc6c1b1">attach_init()</a>, <a class="el" href="include_2attach_8php.html#ab6830b3ab74a5d284876141ac80f6cbc">attach_mkdir()</a>, <a class="el" href="classRedDirectory.html#a2d12d99d38a6a75fc9a830b2f7fc0bf0">RedDirectory\createFile()</a>, <a class="el" href="classRedFile.html#a7c868dfcef6c70cd0e24cf3caa2c3535">RedFile\get()</a>, and <a class="el" href="classRedFile.html#a41a49a583eb276b75626fcf97f4a699c">RedFile\put()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="af6f6f6f40139f12fc09ec47373b30919"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const CLIENT_MODE_LOAD 0x0001</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a756738301f2ed96be50232500677d58a">items_fetch()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a43c6c7d84d880e9500bd4f8f8ecc5731"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const CLIENT_MODE_NORMAL 0x0000</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a04a35b610acfe54434df08adec39c0c7">get_feed_for()</a>, and <a class="el" href="items_8php.html#a756738301f2ed96be50232500677d58a">items_fetch()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a3f40aa5bafff8c4eebdc62e5121daf77"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const CLIENT_MODE_UPDATE 0x0002</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a756738301f2ed96be50232500677d58a">items_fetch()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ada72d88ae39a7e3b45baea201cb49a29"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const CONTACT_IS_FOLLOWER 1</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>relationship types </p>
+
+<p>Referenced by <a class="el" href="items_8php.html#a8794863cdf8ce1333040933d3a3f66bd">consume_feed()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a27299ecfb9e9a99826f17a1c14c6995f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const CONTACT_IS_FRIEND 3</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a6c5e9e293c8242dcb9bc2c3ea2fee2c9"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const CONTACT_IS_SHARING 2</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ac59a18a4838710d6c2de37aed6b21f03"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const DB_UPDATE_VERSION 1090</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#a623793229a7256dd31bcfd5ab90eef08">api_statusnet_config()</a>, <a class="el" href="boot_8php.html#a4c02d88e66852a01bd5a1feecb7c3ce3">check_config()</a>, <a class="el" href="identity_8php.html#a3570a4eb77332b292d394c4132cb8f03">identity_basic_export()</a>, and <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa8a2b61e70900139d1ca28e46f1da49d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const DEFAULT_DB_ENGINE 'MyISAM'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Not yet used </p>
+
+</div>
+</div>
+<a class="anchor" id="abedd940e664017c61b48c6efa31d0cb8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const DIRECTORY_FALLBACK_MASTER 'https://zothub.com'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="mod_2directory_8php.html#aac79396570d759da2efac24fcedf5b44">directory_content()</a>, <a class="el" href="include_2directory_8php.html#aa75d3b0697ca1456aaabdb37a74aa0f0">directory_run()</a>, <a class="el" href="dirprofile_8php.html#a3e1d30d3d93863ff5615f2df4ac7f052">dirprofile_init()</a>, <a class="el" href="acl_8php.html#a57dceff370d4a0e7ae673d50fbfda61f">navbar_complete()</a>, <a class="el" href="pubsites_8php.html#af614e279aab54065345bda6b03eafdf0">pubsites_content()</a>, <a class="el" href="dir__fns_8php.html#aa666e7df6ca8c332f4081c9b66b4bdf6">sync_directories()</a>, and <a class="el" href="socgraph_8php.html#a790690bb1a1d02483fe31632a160144d">update_suggestions()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ab7d65a7e7417825a4db62906bb600729"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const DIRECTORY_MODE_NORMAL 0x0000</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2directory_8php.html#aa75d3b0697ca1456aaabdb37a74aa0f0">directory_run()</a>, <a class="el" href="dirsearch_8php.html#aa1fb04e1de4f25b63349ac78f94ceb4c">dirsearch_content()</a>, <a class="el" href="zot_8php.html#a2657e141d62d5f67ad3c87651b585299">import_site()</a>, <a class="el" href="zot_8php.html#a56f3f65514e4e7f0cd117d01735aebd1">import_xchan()</a>, <a class="el" href="Contact_8php.html#acc12cda999c88c4d6185cca967c15125">remove_all_xchan_resources()</a>, <a class="el" href="dir__fns_8php.html#aa666e7df6ca8c332f4081c9b66b4bdf6">sync_directories()</a>, <a class="el" href="zot_8php.html#ab319d1d9fff9c7775d9daef42d1f33dd">update_modtime()</a>, <a class="el" href="socgraph_8php.html#a790690bb1a1d02483fe31632a160144d">update_suggestions()</a>, and <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a8a60cc38bb567765fd926fef70205f16"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const DIRECTORY_MODE_PRIMARY 0x0001</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="mod_2directory_8php.html#aac79396570d759da2efac24fcedf5b44">directory_content()</a>, <a class="el" href="include_2directory_8php.html#aa75d3b0697ca1456aaabdb37a74aa0f0">directory_run()</a>, <a class="el" href="dirprofile_8php.html#a3e1d30d3d93863ff5615f2df4ac7f052">dirprofile_init()</a>, <a class="el" href="zot_8php.html#a2657e141d62d5f67ad3c87651b585299">import_site()</a>, <a class="el" href="acl_8php.html#a57dceff370d4a0e7ae673d50fbfda61f">navbar_complete()</a>, <a class="el" href="poller_8php.html#a5f12df3a4738124b6c039971e87e76da">poller_run()</a>, <a class="el" href="pubsites_8php.html#af614e279aab54065345bda6b03eafdf0">pubsites_content()</a>, <a class="el" href="dir__fns_8php.html#aa666e7df6ca8c332f4081c9b66b4bdf6">sync_directories()</a>, <a class="el" href="socgraph_8php.html#a790690bb1a1d02483fe31632a160144d">update_suggestions()</a>, and <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aedfb9501ed408278667995524e0d15cf"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const DIRECTORY_MODE_SECONDARY 0x0002</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="zot_8php.html#a2657e141d62d5f67ad3c87651b585299">import_site()</a>, <a class="el" href="poller_8php.html#a5f12df3a4738124b6c039971e87e76da">poller_run()</a>, <a class="el" href="dir__fns_8php.html#aa666e7df6ca8c332f4081c9b66b4bdf6">sync_directories()</a>, and <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a25476eec71fceda237f7dc1d78b0adb8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const DIRECTORY_MODE_STANDALONE 0x0100</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="mod_2directory_8php.html#aac79396570d759da2efac24fcedf5b44">directory_content()</a>, <a class="el" href="include_2directory_8php.html#aa75d3b0697ca1456aaabdb37a74aa0f0">directory_run()</a>, <a class="el" href="dirprofile_8php.html#a3e1d30d3d93863ff5615f2df4ac7f052">dirprofile_init()</a>, <a class="el" href="zot_8php.html#a2657e141d62d5f67ad3c87651b585299">import_site()</a>, <a class="el" href="zot_8php.html#a56f3f65514e4e7f0cd117d01735aebd1">import_xchan()</a>, <a class="el" href="acl_8php.html#a57dceff370d4a0e7ae673d50fbfda61f">navbar_complete()</a>, <a class="el" href="pubsites_8php.html#af614e279aab54065345bda6b03eafdf0">pubsites_content()</a>, <a class="el" href="dir__fns_8php.html#aa666e7df6ca8c332f4081c9b66b4bdf6">sync_directories()</a>, <a class="el" href="socgraph_8php.html#a790690bb1a1d02483fe31632a160144d">update_suggestions()</a>, and <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a6b9909db6a7ec80ec6fdd40ba74014dd"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const DIRECTORY_REALM 'RED_GLOBAL'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a0603d6ece8c5d37b4b7db697db053a4b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const EOL '&lt;br /&gt;' . &quot;\r\n&quot;</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="achievements_8php.html#a35ae04ada0e227d19671f289a32fb30e">achievements_content()</a>, <a class="el" href="admin_8php.html#aaa6addf2dbc3f3fcf99244a56b41eade">admin_page_dbsync()</a>, <a class="el" href="admin_8php.html#a6943543f3138f6ee182cb701f415d1cc">admin_page_hubloc()</a>, <a class="el" href="admin_8php.html#add865f4ae806ecbf716f423fc3e50e4f">admin_page_site_post()</a>, <a class="el" href="admin_8php.html#a62f10f90c47686c9c3c37c4c03a108d2">admin_page_users()</a>, <a class="el" href="mod_2api_8php.html#a33315b5bbf5418f6850b2038107b526d">api_content()</a>, <a class="el" href="mod_2api_8php.html#a6fe77f05c07cb51048df0d557b4b9bd2">api_post()</a>, <a class="el" href="apps_8php.html#a546016cb960d0b110ee8e489dfa6c27c">apps_content()</a>, <a class="el" href="mod_2attach_8php.html#aa88eb5ad87aa1036a30e70339cc6c1b1">attach_init()</a>, <a class="el" href="security_8php.html#adc7bf51e3b8d67bd80e9348f9ab03733">authenticate_success()</a>, <a class="el" href="blocks_8php.html#a2531a8fd51db3cecb2eb20c002c66e12">blocks_content()</a>, <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>, <a class="el" href="channel_8php.html#ac7c8c7845741baadf87fae6bc279f3dc">channel_init()</a>, <a class="el" href="chanview_8php.html#a4192c6da888c8c1165851acf9ad4cb8b">chanview_content()</a>, <a class="el" href="account_8php.html#ae052bd5558847bd38e89c213561a9771">check_account_email()</a>, <a class="el" href="account_8php.html#aaff7720423417a4333697894ffd9ddeb">check_account_invite()</a>, <a class="el" href="security_8php.html#a20f8b9851f23ee8894b8925584ef6821">check_form_security_std_err_msg()</a>, <a class="el" href="setup_8php.html#aa3bbb111780da70ba35cc23a306f2c76">check_keys()</a>, <a class="el" href="setup_8php.html#a14d208682a88632290c895d20da6e7d6">check_php()</a>, <a class="el" href="setup_8php.html#ab4b71369a25021d59247c917e98d8246">check_store()</a>, <a class="el" href="common_8php.html#ab63408f39abef7a6915186e8dabc5a96">common_content()</a>, <a class="el" href="common_8php.html#aca62f113655809f41f49042ce9b123c2">common_init()</a>, <a class="el" href="community_8php.html#a1197aafd6a6b540dbb4a0c04ade3a25a">community_content()</a>, <a class="el" href="connect_8php.html#ad46a38f32fd7a3d324b1fa26373efa36">connect_init()</a>, <a class="el" href="connections_8php.html#aec2e457420fce3e3bf6a9f48e36df25c">connections_content()</a>, <a class="el" href="connections_8php.html#a1224058db8e3fb56463eb312f98e561d">connections_post()</a>, <a class="el" href="connedit_8php.html#a795acb3d9d841f55c255d7611681ab67">connedit_content()</a>, <a class="el" href="connedit_8php.html#a234c48426b652bf4d37053f2af329ac5">connedit_post()</a>, <a class="el" href="delegate_8php.html#a943eea8996ef348eb845c498f9f354dd">delegate_content()</a>, <a class="el" href="mod_2directory_8php.html#aac79396570d759da2efac24fcedf5b44">directory_content()</a>, <a class="el" href="dirprofile_8php.html#a3e1d30d3d93863ff5615f2df4ac7f052">dirprofile_init()</a>, <a class="el" href="display_8php.html#a37137c98d47bf3306f4c2bb9f5b60de0">display_content()</a>, <a class="el" href="items_8php.html#afa1db13c2a8b73b5b17b97f17e5a19d1">drop_item()</a>, <a class="el" href="editblock_8php.html#abbe8f55de06967bc8d79d620509a49e6">editblock_content()</a>, <a class="el" href="editlayout_8php.html#aa877e4157a26b099de904164181dd386">editlayout_content()</a>, <a class="el" href="editpost_8php.html#a34011690864d122680c802e9e748ccfb">editpost_content()</a>, <a class="el" href="editwebpage_8php.html#a375e945255fad79a71036528f7480650">editwebpage_content()</a>, <a class="el" href="events_8php.html#a1d293fb217ae6bc9e3858c4b32e363ec">events_content()</a>, <a class="el" href="events_8php.html#ab3e8a8f901175f8e40a8089eea45c075">events_post()</a>, <a class="el" href="filestorage_8php.html#a61bb1be78472555df4ce619f51014040">filestorage_content()</a>, <a class="el" href="filestorage_8php.html#ad3b64e3ece9831f9d3a9f00c0ae983cd">filestorage_post()</a>, <a class="el" href="mod_2follow_8php.html#a171f5b19f50d7738adc3b2e96ec6018a">follow_init()</a>, <a class="el" href="conversation_8php.html#a3d8e30cc94f9a175054c021305d3aca3">format_like()</a>, <a class="el" href="fsuggest_8php.html#aa6c49ed4b50a387f1845f36844dd7998">fsuggest_content()</a>, <a class="el" href="fsuggest_8php.html#a61ecfe10ce937ed526614f8fd3de3c7d">fsuggest_post()</a>, <a class="el" href="include_2group_8php.html#a06ec565d2b64e79044e7c1bf91a2a4ce">group_add()</a>, <a class="el" href="mod_2group_8php.html#a07a64f6c65b0080d8190b3d9728a7a83">group_content()</a>, <a class="el" href="mod_2group_8php.html#aed1f009b1221348021bb34761160ef35">group_post()</a>, <a class="el" href="home_8php.html#aa1cf697851a646755baf537f75334c46">home_content()</a>, <a class="el" href="import_8php.html#af17fef0410518f7eac205d0ea416eaa2">import_post()</a>, <a class="el" href="zot_8php.html#a56f3f65514e4e7f0cd117d01735aebd1">import_xchan()</a>, <a class="el" href="invite_8php.html#a244385b28cfd021d308715f01158bfd9">invite_content()</a>, <a class="el" href="invite_8php.html#aeb0881c0f93c8e8552e5ed756ce6e5a5">invite_post()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="layouts_8php.html#a6e0193759ad9eef76d3df2db24237b50">layouts_content()</a>, <a class="el" href="like_8php.html#a9d7dd268f21c21e9d29dd2aca2dd9538">like_content()</a>, <a class="el" href="setup_8php.html#ad2e0375a9ab87ebe6e78124ee125054a">load_database()</a>, <a class="el" href="lostpass_8php.html#a0314d94e48c789b1b3a201d740c9eab3">lostpass_content()</a>, <a class="el" href="lostpass_8php.html#a8ed35ba71a4404eaf4903da61d0321cc">lostpass_post()</a>, <a class="el" href="magic_8php.html#acea2cc792849ca2d71d4b689f66518bf">magic_init()</a>, <a class="el" href="mail_8php.html#a3c7c485fc69f92371e8b20936040eca1">mail_content()</a>, <a class="el" href="mail_8php.html#acfc2cc0bf4e0b178207758384977f25a">mail_post()</a>, <a class="el" href="manage_8php.html#a2bca247b5296827638959138367db4f5">manage_content()</a>, <a class="el" href="match_8php.html#a1dd853e959b9e70c1911bb2fb5f5130d">match_content()</a>, <a class="el" href="mod_2menu_8php.html#a6fed23af14d71a78a4153c8363a685cf">menu_content()</a>, <a class="el" href="mod_2menu_8php.html#aaa491ef173868fe002aece4632bcf393">menu_post()</a>, <a class="el" href="mod_2message_8php.html#ac72dfed3ce08fcb331d66b37edc6e15f">message_content()</a>, <a class="el" href="mitem_8php.html#a7a31b702ecad18eeb6a38b243ff0037e">mitem_content()</a>, <a class="el" href="mitem_8php.html#a9627cd857cafdf04e4fc0ae48c8e8518">mitem_init()</a>, <a class="el" href="mitem_8php.html#a6ee694cca4b551a20d7c7a94b5243ec1">mitem_post()</a>, <a class="el" href="mood_8php.html#a721b9b6703b3234a005641c92d409b8f">mood_content()</a>, <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>, <a class="el" href="mod_2network_8php.html#a180fce90ad11d7e0e45be094da7149ec">network_init()</a>, <a class="el" href="new__channel_8php.html#ae585191610f79da129492482ce8e2fee">new_channel_content()</a>, <a class="el" href="new__channel_8php.html#a180b0646957db8290482f02454ad7f23">new_channel_post()</a>, <a class="el" href="notifications_8php.html#aadd0b5525bd8c283a5d8a37982bbfe62">notifications_content()</a>, <a class="el" href="notifications_8php.html#a5baffec7b2e625c9f9cefbc097550d33">notifications_post()</a>, <a class="el" href="oexchange_8php.html#a2d8b785cd7d041a4e6274f5af370cf26">oexchange_content()</a>, <a class="el" href="page_8php.html#a91a5f649f68406149108bded1dc90b22">page_content()</a>, <a class="el" href="mod_2photos_8php.html#aa87382611a66ec5effdb2d78f13f5812">photos_content()</a>, <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>, <a class="el" href="poke_8php.html#ac9190563a8da9c07a16f9dcd71cf6993">poke_content()</a>, <a class="el" href="post_8php.html#af4b48181ce773ef0cdfc972441445c34">post_init()</a>, <a class="el" href="post_8php.html#af59e6a1dc22d19d9257b01cd7ccedb75">post_post()</a>, <a class="el" href="profile_8php.html#a3775cf6eef6587e5143133356a7b76c0">profile_content()</a>, <a class="el" href="profile_8php.html#ab5d0246be0552e2182a585c1206d22a5">profile_init()</a>, <a class="el" href="identity_8php.html#a4751b522ea913d0e7ed43e03d22e9e68">profile_load()</a>, <a class="el" href="profile__photo_8php.html#a4b80234074bd603221aa5364f330e479">profile_photo_post()</a>, <a class="el" href="profiles_8php.html#a46975783b8b8d70402d51487eb1f0b00">profiles_content()</a>, <a class="el" href="profiles_8php.html#a36f71405ad536228f8bb84a551b23f7e">profiles_init()</a>, <a class="el" href="profiles_8php.html#ab0362c81b1d3b0b12a772b9fac446e04">profiles_post()</a>, <a class="el" href="profperm_8php.html#aef015787de2373d9fb3fe3f814fb5023">profperm_content()</a>, <a class="el" href="pubsites_8php.html#af614e279aab54065345bda6b03eafdf0">pubsites_content()</a>, <a class="el" href="register_8php.html#a0e91f57f111407ea8d3223a05022bb2a">register_content()</a>, <a class="el" href="register_8php.html#a51731dcc1917c58a790eb1c0f6132271">register_post()</a>, <a class="el" href="regmod_8php.html#a7953df4e32e63946565e90cdd5d50409">regmod_content()</a>, <a class="el" href="search_8php.html#ab2568591359edde5b483a6cd9a24b2cc">search_content()</a>, <a class="el" href="settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586">settings_post()</a>, <a class="el" href="setup_8php.html#a88247384a96e14516f474d7af6a465c1">setup_content()</a>, <a class="el" href="sources_8php.html#ac442ccef080ab95772d8929fcafcb4b7">sources_content()</a>, <a class="el" href="sources_8php.html#ac73298ff162ce7b2de8dcaf3d3305b1e">sources_post()</a>, <a class="el" href="suggest_8php.html#a58748a8235d4523f8333847f3e42dd91">suggest_content()</a>, <a class="el" href="tagrm_8php.html#a1702f40aa53a2fa93deade1f609abe78">tagrm_post()</a>, <a class="el" href="thing_8php.html#a24a35f1e64029a67fdbea94a776ae04b">thing_content()</a>, <a class="el" href="thing_8php.html#a8be23b1d475ec3d9291999221c674c80">thing_init()</a>, <a class="el" href="account_8php.html#ac5c570a2d46446bad4dd2501e9c5a4b1">user_allow()</a>, <a class="el" href="account_8php.html#ac1653efba62493b9d87513e1b6c04c83">user_deny()</a>, <a class="el" href="viewconnections_8php.html#ab6c4d983e97b3a8a879567ff76507776">viewconnections_content()</a>, <a class="el" href="viewsrc_8php.html#a6eff3d0c1d7d14b335c4edb785cd60a4">viewsrc_content()</a>, <a class="el" href="wall__attach_8php.html#a7385e970e93228d082f0fd7254f6e653">wall_attach_post()</a>, <a class="el" href="wall__upload_8php.html#a7cbe204244cf9e0380ee932263a74d8f">wall_upload_post()</a>, <a class="el" href="webpages_8php.html#af3b7397d4abc153e3d2147740ee1a41d">webpages_content()</a>, and <a class="el" href="xchan_8php.html#a9853348bf1a35c644460221ba75edc2d">xchan_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a4a12ce5de39789b0361e308d89925a20"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const GRAVITY_COMMENT 6</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a1f5906598e90b5ea2b4245f682be4348"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const GRAVITY_LIKE 3</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a8794863cdf8ce1333040933d3a3f66bd">consume_feed()</a>, and <a class="el" href="subthread_8php.html#a50368f3d825b77996030528e7fbfa3d3">subthread_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a2af173e4e9836ee7c90757b4793a2be3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const GRAVITY_PARENT 0</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>item weight for query ordering </p>
+
+</div>
+</div>
+<a class="anchor" id="a7c286add8961fd2d79216314cd4aadd8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const HUBLOC_FLAGS_DELETED 0x1000</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="Contact_8php.html#a186162051a5127069cc851d78740f205">channel_remove()</a>, <a class="el" href="zot_8php.html#a56f3f65514e4e7f0cd117d01735aebd1">import_xchan()</a>, <a class="el" href="notifier_8php.html#a568c502f626cff95e344c0748938b85d">notifier_run()</a>, <a class="el" href="post_8php.html#af59e6a1dc22d19d9257b01cd7ccedb75">post_post()</a>, <a class="el" href="Contact_8php.html#acc12cda999c88c4d6185cca967c15125">remove_all_xchan_resources()</a>, <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>, and <a class="el" href="zot_8php.html#ae7cec2b417b5858fd4a41070f843d1d7">zot_get_hublocs()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a3ad9cc5d4354be741fa1de12b96e9955"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const HUBLOC_FLAGS_PRIMARY 0x0001</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="identity_8php.html#a345f4c943d84de502ec6e72d2c813945">create_identity()</a>, <a class="el" href="zot_8php.html#ad149f1e98c0c5b88ff9147e6ee3f330d">import_author_zot()</a>, <a class="el" href="import_8php.html#af17fef0410518f7eac205d0ea416eaa2">import_post()</a>, <a class="el" href="zot_8php.html#a56f3f65514e4e7f0cd117d01735aebd1">import_xchan()</a>, <a class="el" href="Contact_8php.html#a2f4f495d53f2a334ab75292af79d3c91">rconnect_url()</a>, <a class="el" href="text_8php.html#a543447c5ed766535221e2d9636b379ee">xchan_mail_query()</a>, <a class="el" href="text_8php.html#a36a2e5d418ee81140f25c4233cfecd1f">xchan_query()</a>, <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>, <a class="el" href="zot_8php.html#a95528377d7303131958c9f0b7158fdce">zot_finger()</a>, and <a class="el" href="zot_8php.html#a7b23bfb31d4491231e1e73bdc077240d">zot_refresh()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ab54b24cc302e1a42a67a49d788b6b764"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const HUBLOC_FLAGS_UNVERIFIED 0x0002</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa589421267f0c2f0d643f727792cce35"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const HUBLOC_NOTUSED 0x0000</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a845891f82bf6edd7fa2d578b66703112"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const HUBLOC_OFFLINE 0x0008</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="abeb4d86e17cefa8584f1244e2183b0e1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const HUBLOC_RECEIVE_ERROR 0x0002</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="post_8php.html#af4b48181ce773ef0cdfc972441445c34">post_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a3b56bfc6a0dd159070e316ddac3b7456"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const HUBLOC_SEND_ERROR 0x0001</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a7a8ba64d089cc0412c59a2eefc6d655c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const HUBLOC_WORKS 0x0004</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ab28dc518fa90b6f617dd8c564eb4f35f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ITEM_BLOCKED 0x0002</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a87b0f279f8413c7e4d805c5d85f20d34"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ITEM_BUG 0x0400</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a7fc4b291a7cdaa48b38e27344ea183cf"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ITEM_BUILDBLOCK 0x0100</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="blocks_8php.html#a2531a8fd51db3cecb2eb20c002c66e12">blocks_content()</a>, <a class="el" href="editblock_8php.html#abbe8f55de06967bc8d79d620509a49e6">editblock_content()</a>, <a class="el" href="items_8php.html#a6f7e1334af5d684a987fa6a3eb37f4cc">item_expire()</a>, <a class="el" href="notifier_8php.html#a568c502f626cff95e344c0748938b85d">notifier_run()</a>, and <a class="el" href="items_8php.html#a2baa9e05f1e8aa3dd61c85803ae39bd6">update_remote_id()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ac890557fedc5b5a3b1d996249b1e1a20"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ITEM_DELAYED_PUBLISH 0x0080</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">item_store()</a>, <a class="el" href="notifier_8php.html#a568c502f626cff95e344c0748938b85d">notifier_run()</a>, and <a class="el" href="poller_8php.html#a5f12df3a4738124b6c039971e87e76da">poller_run()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a3515ea6bf77495de89b93e9ccd881c49"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ITEM_DELETED 0x0010</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a8794863cdf8ce1333040933d3a3f66bd">consume_feed()</a>, <a class="el" href="items_8php.html#a2b56a4c01bd22a648d52ec9af1a04259">delete_item_lowlevel()</a>, <a class="el" href="items_8php.html#afa1db13c2a8b73b5b17b97f17e5a19d1">drop_item()</a>, <a class="el" href="items_8php.html#a82955cc578f0fa600acec84475026194">encode_item()</a>, <a class="el" href="expire_8php.html#a444e45c9b67727b27db4c779fd51a298">expire_run()</a>, <a class="el" href="items_8php.html#a536d0313b6ffe33b9d2490c4e25c5361">get_item_elements()</a>, <a class="el" href="item_8php.html#a5b1b36cb301a94b38150074f0d424e74">item_check_service_class()</a>, <a class="el" href="items_8php.html#a6f7e1334af5d684a987fa6a3eb37f4cc">item_expire()</a>, <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">item_store()</a>, <a class="el" href="like_8php.html#a9d7dd268f21c21e9d29dd2aca2dd9538">like_content()</a>, <a class="el" href="notifier_8php.html#a568c502f626cff95e344c0748938b85d">notifier_run()</a>, <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>, <a class="el" href="poller_8php.html#a5f12df3a4738124b6c039971e87e76da">poller_run()</a>, and <a class="el" href="zot_8php.html#a37ec13b18057634eadb071f05297f5e1">process_delivery()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ac99fc4d040764eac1736bec6973556fe"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ITEM_HIDDEN 0x0001</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="include_2photos_8php.html#a6c40ef58aefef705a5adc84a40e97109">photo_upload()</a>, and <a class="el" href="include_2photos_8php.html#ad648c0c5544fe9263409b6f6e57c6274">photos_create_item()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a8da836617174eed9fc2ac8054125354b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ITEM_MENTIONSME 0x0400</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a756738301f2ed96be50232500677d58a">items_fetch()</a>, <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>, and <a class="el" href="items_8php.html#ab1bce4261bcf75ad62753b498a144d17">tag_deliver()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ac01230c7655e0705b2e99c9bc03c4450"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ITEM_MODERATED 0x0004</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a949116d9a295b214293006c060ca4848"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ITEM_NOCOMMENT 0x0800</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classConversation.html#a8335cdd43f1836e3c255638e61a09e16">Conversation\add_thread()</a>, <a class="el" href="items_8php.html#a82955cc578f0fa600acec84475026194">encode_item()</a>, and <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">item_store()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a8663f32171568489dbb2a01dd00371f8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ITEM_NOTSHOWN 0x0080</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="like_8php.html#a9d7dd268f21c21e9d29dd2aca2dd9538">like_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a939de9a99278f4fd7dcd0ee67f243f08"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ITEM_NSFW 0x0100</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a5f690fc2484abec07840b4f9dd525bd9">encode_item_flags()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a2c8906f1af94a3559a5b4661067bb79d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ITEM_OBSCURED 0x1000</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="editpost_8php.html#a34011690864d122680c802e9e748ccfb">editpost_content()</a>, <a class="el" href="editwebpage_8php.html#a375e945255fad79a71036528f7480650">editwebpage_content()</a>, <a class="el" href="items_8php.html#a82955cc578f0fa600acec84475026194">encode_item()</a>, <a class="el" href="items_8php.html#a536d0313b6ffe33b9d2490c4e25c5361">get_item_elements()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">item_store()</a>, <a class="el" href="items_8php.html#acf0bf7c9d21ac84f32effb754f7ad484">item_store_update()</a>, <a class="el" href="items_8php.html#a410f9c743877c125ca06312373346903">post_activity_item()</a>, <a class="el" href="items_8php.html#ab1bce4261bcf75ad62753b498a144d17">tag_deliver()</a>, and <a class="el" href="text_8php.html#a8264348059abd1d4d5bb521323d3b19a">unobscure()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a8c9dce0ef27b35397e29298eb966f7f7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ITEM_ORIGIN 0x0001</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p><a class="el" href="classItem.html">Item</a> Flags </p>
+
+<p>Referenced by <a class="el" href="event_8php.html#a89ef533faf345db8d64a58d4856bde3a">event_store()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="like_8php.html#a9d7dd268f21c21e9d29dd2aca2dd9538">like_content()</a>, <a class="el" href="mood_8php.html#a7ae136dd7476865b4828136175db5022">mood_init()</a>, <a class="el" href="notifier_8php.html#a568c502f626cff95e344c0748938b85d">notifier_run()</a>, <a class="el" href="include_2photos_8php.html#a6c40ef58aefef705a5adc84a40e97109">photo_upload()</a>, <a class="el" href="include_2photos_8php.html#ad648c0c5544fe9263409b6f6e57c6274">photos_create_item()</a>, <a class="el" href="poke_8php.html#a9725aab97b3983e6a98bd81c4efe7d3b">poke_init()</a>, <a class="el" href="items_8php.html#a410f9c743877c125ca06312373346903">post_activity_item()</a>, <a class="el" href="activities_8php.html#a80134e807719b3c54aba971958d2e132">profile_activity()</a>, <a class="el" href="items_8php.html#ab1bce4261bcf75ad62753b498a144d17">tag_deliver()</a>, <a class="el" href="tagger_8php.html#a0e4a3eb177d1684553c547503d67161c">tagger_content()</a>, and <a class="el" href="thing_8php.html#a8be23b1d475ec3d9291999221c674c80">thing_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a6e57d913634d033b4d5ad72d99fd3e9d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ITEM_PDL 0x0200</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="editlayout_8php.html#aa877e4157a26b099de904164181dd386">editlayout_content()</a>, <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">item_store()</a>, <a class="el" href="text_8php.html#a3999a0b3e22e440f280ee791ce34d384">layout_select()</a>, <a class="el" href="layouts_8php.html#a6e0193759ad9eef76d3df2db24237b50">layouts_content()</a>, <a class="el" href="notifier_8php.html#a568c502f626cff95e344c0748938b85d">notifier_run()</a>, and <a class="el" href="items_8php.html#a2baa9e05f1e8aa3dd61c85803ae39bd6">update_remote_id()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a2958a2bd5422b85329d7c36c06dbc221"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ITEM_RELAY 0x0200</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a40d885b2cfd736aab4234ae641ca4dfb"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ITEM_SPAM 0x0008</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a7af107fab8d62b9a73801713b774ed30"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ITEM_STARRED 0x0004</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#a4c6fb9fb5203aa60f4b3afd4521db8ea">api_format_items()</a>, <a class="el" href="include_2api_8php.html#aa40bae797bcd9ccacffdce5a3b5a1afa">api_get_user()</a>, <a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">Item\get_template_data()</a>, <a class="el" href="items_8php.html#a6f7e1334af5d684a987fa6a3eb37f4cc">item_expire()</a>, <a class="el" href="items_8php.html#a756738301f2ed96be50232500677d58a">items_fetch()</a>, <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>, and <a class="el" href="starred_8php.html#a63024fb418c678e49fd535e3752d349a">starred_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a749144d8dd9c1366596a0213c277d050"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ITEM_THREAD_TOP 0x0040</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>, <a class="el" href="items_8php.html#a5f690fc2484abec07840b4f9dd525bd9">encode_item_flags()</a>, <a class="el" href="event_8php.html#a89ef533faf345db8d64a58d4856bde3a">event_store()</a>, <a class="el" href="include_2notify_8php.html#a0e61728e487df50c72e6434f911a57d3">format_notification()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">item_store()</a>, <a class="el" href="items_8php.html#a756738301f2ed96be50232500677d58a">items_fetch()</a>, <a class="el" href="like_8php.html#a9d7dd268f21c21e9d29dd2aca2dd9538">like_content()</a>, <a class="el" href="mood_8php.html#a7ae136dd7476865b4828136175db5022">mood_init()</a>, <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>, <a class="el" href="include_2photos_8php.html#a6c40ef58aefef705a5adc84a40e97109">photo_upload()</a>, <a class="el" href="include_2photos_8php.html#ad648c0c5544fe9263409b6f6e57c6274">photos_create_item()</a>, <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>, <a class="el" href="poke_8php.html#a9725aab97b3983e6a98bd81c4efe7d3b">poke_init()</a>, <a class="el" href="items_8php.html#a410f9c743877c125ca06312373346903">post_activity_item()</a>, <a class="el" href="activities_8php.html#a80134e807719b3c54aba971958d2e132">profile_activity()</a>, <a class="el" href="items_8php.html#ab1bce4261bcf75ad62753b498a144d17">tag_deliver()</a>, and <a class="el" href="thing_8php.html#a8be23b1d475ec3d9291999221c674c80">thing_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="adaeb4f590c56326b2dca3b19f31b6272"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ITEM_UNPUBLISHED 0x0020</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a009e6a0637cb65804ea8094ecc4450b0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ITEM_UNSEEN 0x0002</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#a528d8070ee74ea800102936ce73cf366">api_statuses_home_timeline()</a>, <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>, <a class="el" href="display_8php.html#a37137c98d47bf3306f4c2bb9f5b60de0">display_content()</a>, <a class="el" href="include_2notify_8php.html#a0e61728e487df50c72e6434f911a57d3">format_notification()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">item_store()</a>, <a class="el" href="items_8php.html#acf0bf7c9d21ac84f32effb754f7ad484">item_store_update()</a>, <a class="el" href="items_8php.html#a756738301f2ed96be50232500677d58a">items_fetch()</a>, <a class="el" href="mood_8php.html#a7ae136dd7476865b4828136175db5022">mood_init()</a>, <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>, and <a class="el" href="ping_8php.html#a77217b1b190b4c5d8770867b45f0c0a1">ping_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aefba06f1c0842036329033e7567ecf6d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ITEM_UPLINK 0x0008</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">item_store()</a>, <a class="el" href="notifier_8php.html#a568c502f626cff95e344c0748938b85d">notifier_run()</a>, <a class="el" href="items_8php.html#ab1bce4261bcf75ad62753b498a144d17">tag_deliver()</a>, and <a class="el" href="items_8php.html#a88c6cf7649ac836fbbed82a7a0315110">tgroup_check()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aad33b494084f729b6ee3b0bc457718a1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ITEM_UPLINK_PRV 0x0010</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a18a400fa45e5632811b33041d8c048bf"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ITEM_VERIFIED 0x2000</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation()</a>, <a class="el" href="items_8php.html#a536d0313b6ffe33b9d2490c4e25c5361">get_item_elements()</a>, <a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">Item\get_template_data()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">item_store()</a>, <a class="el" href="items_8php.html#acf0bf7c9d21ac84f32effb754f7ad484">item_store_update()</a>, and <a class="el" href="items_8php.html#a410f9c743877c125ca06312373346903">post_activity_item()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ab55b16ae7fc19fafe5afaedd49163bbf"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ITEM_VISIBLE 0x0000</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p><a class="el" href="classItem.html">Item</a> visibility </p>
+
+<p>Referenced by <a class="el" href="items_8php.html#a0cf98bb619f07dd18f602683a55a5f59">first_post_date()</a>, <a class="el" href="include_2photos_8php.html#a6c40ef58aefef705a5adc84a40e97109">photo_upload()</a>, <a class="el" href="include_2photos_8php.html#ad648c0c5544fe9263409b6f6e57c6274">photos_create_item()</a>, and <a class="el" href="ping_8php.html#a77217b1b190b4c5d8770867b45f0c0a1">ping_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a6788e99021ec8ffb0fa94d651f22a322"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ITEM_WALL 0x0020</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#aa40bae797bcd9ccacffdce5a3b5a1afa">api_get_user()</a>, <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>, <a class="el" href="items_8php.html#afa1db13c2a8b73b5b17b97f17e5a19d1">drop_item()</a>, <a class="el" href="event_8php.html#a89ef533faf345db8d64a58d4856bde3a">event_store()</a>, <a class="el" href="events_8php.html#a1d293fb217ae6bc9e3858c4b32e363ec">events_content()</a>, <a class="el" href="items_8php.html#a0cf98bb619f07dd18f602683a55a5f59">first_post_date()</a>, <a class="el" href="items_8php.html#a6f7e1334af5d684a987fa6a3eb37f4cc">item_expire()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">item_store()</a>, <a class="el" href="items_8php.html#a756738301f2ed96be50232500677d58a">items_fetch()</a>, <a class="el" href="like_8php.html#a9d7dd268f21c21e9d29dd2aca2dd9538">like_content()</a>, <a class="el" href="mood_8php.html#a7ae136dd7476865b4828136175db5022">mood_init()</a>, <a class="el" href="enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc">notification()</a>, <a class="el" href="notifier_8php.html#a568c502f626cff95e344c0748938b85d">notifier_run()</a>, <a class="el" href="include_2photos_8php.html#a6c40ef58aefef705a5adc84a40e97109">photo_upload()</a>, <a class="el" href="include_2photos_8php.html#ad648c0c5544fe9263409b6f6e57c6274">photos_create_item()</a>, <a class="el" href="ping_8php.html#a77217b1b190b4c5d8770867b45f0c0a1">ping_init()</a>, <a class="el" href="poke_8php.html#a9725aab97b3983e6a98bd81c4efe7d3b">poke_init()</a>, <a class="el" href="items_8php.html#a410f9c743877c125ca06312373346903">post_activity_item()</a>, <a class="el" href="zot_8php.html#a37ec13b18057634eadb071f05297f5e1">process_delivery()</a>, <a class="el" href="activities_8php.html#a80134e807719b3c54aba971958d2e132">profile_activity()</a>, <a class="el" href="items_8php.html#ab1bce4261bcf75ad62753b498a144d17">tag_deliver()</a>, <a class="el" href="tagger_8php.html#a0e4a3eb177d1684553c547503d67161c">tagger_content()</a>, <a class="el" href="thing_8php.html#a8be23b1d475ec3d9291999221c674c80">thing_init()</a>, <a class="el" href="widgets_8php.html#ae4ced69d83dbdd9e6b51660d9eba8653">widget_tagcloud_wall()</a>, and <a class="el" href="items_8php.html#a004e89d86b0f29b2c4da20108ecc4091">zot_feed()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="af489d0c3166551b93e63a79ff2c9be35"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ITEM_WEBPAGE 0x0040</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="display_8php.html#a37137c98d47bf3306f4c2bb9f5b60de0">display_content()</a>, <a class="el" href="editwebpage_8php.html#a375e945255fad79a71036528f7480650">editwebpage_content()</a>, <a class="el" href="home_8php.html#aa1cf697851a646755baf537f75334c46">home_content()</a>, <a class="el" href="item_8php.html#a5b1b36cb301a94b38150074f0d424e74">item_check_service_class()</a>, <a class="el" href="items_8php.html#a6f7e1334af5d684a987fa6a3eb37f4cc">item_expire()</a>, <a class="el" href="items_8php.html#a756738301f2ed96be50232500677d58a">items_fetch()</a>, <a class="el" href="notifier_8php.html#a568c502f626cff95e344c0748938b85d">notifier_run()</a>, <a class="el" href="page_8php.html#a91a5f649f68406149108bded1dc90b22">page_content()</a>, <a class="el" href="items_8php.html#a2baa9e05f1e8aa3dd61c85803ae39bd6">update_remote_id()</a>, <a class="el" href="webpages_8php.html#af3b7397d4abc153e3d2147740ee1a41d">webpages_content()</a>, and <a class="el" href="widgets_8php.html#a6dbc227aac750774284ee39c45f0a200">widget_tagcloud()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a3475ff6c2e575f946ea0ee377e944173"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const JPEG_QUALITY 100</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Image storage quality. Lower numbers save space at cost of image detail. For ease of upgrade, please do not change here. Change jpeg quality with $a-&gt;config['system']['jpeg_quality'] = n; in .htconfig.php, where n is netween 1 and 100, and with very poor results below about 50 </p>
+
+<p>Referenced by <a class="el" href="classphoto__gd.html#a0795fc029be382557ae3f6e285f40e00">photo_gd\imageString()</a>, and <a class="el" href="classphoto__imagick.html#a2c9168f110ccd6c264095d766615dfa8">photo_imagick\load()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a68d1d5bc9c7ccb663dc671b48c66df11"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const LANGUAGE_DETECT_MIN_CONFIDENCE 0.01</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="language_8php.html#a632da17c7ac0d2dc1a00a4706870194b">detect_language()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a17cf72338b040891781a4bcbdd9a8595"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const LANGUAGE_DETECT_MIN_LENGTH 128</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Language detection parameters </p>
+
+<p>Referenced by <a class="el" href="language_8php.html#a632da17c7ac0d2dc1a00a4706870194b">detect_language()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="afe63ae69ba55299f813766e54df06ede"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const LOGGER_ALL 4</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="admin_8php.html#a1d1362698af14d209aa3a0fb655551dd">admin_page_logs()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a6969947145a139ec374ce098224d8e81"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const LOGGER_DATA 3</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classRedFile.html#a9a67bdb34c9db6ce144b3f371148b183">RedFile\__construct()</a>, <a class="el" href="admin_8php.html#a1d1362698af14d209aa3a0fb655551dd">admin_page_logs()</a>, <a class="el" href="identity_8php.html#aa870d2c1f558cfd52bef05bc124e8fa4">advanced_profile()</a>, <a class="el" href="zot_8php.html#ac34e479d27f32b82dd6b33542f81a6a7">build_sync_packet()</a>, <a class="el" href="security_8php.html#a444ac867dfa8c37cf0a7a226412bee28">check_form_security_token_ForbiddenOnErr()</a>, <a class="el" href="security_8php.html#a77ba0d1889a39cf32434c5ce96fe1433">check_form_security_token_redirectOnErr()</a>, <a class="el" href="classRedDirectory.html#a5e3fc08b2bf9f61cea4d2ccae0495bec">RedDirectory\childExists()</a>, <a class="el" href="language_8php.html#a632da17c7ac0d2dc1a00a4706870194b">detect_language()</a>, <a class="el" href="mod_2directory_8php.html#aac79396570d759da2efac24fcedf5b44">directory_content()</a>, <a class="el" href="dirprofile_8php.html#a3e1d30d3d93863ff5615f2df4ac7f052">dirprofile_init()</a>, <a class="el" href="items_8php.html#aba98fcbbcd7044a7e9ea34edabc14c87">fix_private_photos()</a>, <a class="el" href="classRedDirectory.html#aaa20f0f44da23781917af8170c0a2569">RedDirectory\getChild()</a>, <a class="el" href="classRedDirectory.html#af6e4475dbd5abcdede00d20b8d388583">RedDirectory\getName()</a>, <a class="el" href="zot_8php.html#a56f3f65514e4e7f0cd117d01735aebd1">import_xchan()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">item_store()</a>, <a class="el" href="items_8php.html#acf0bf7c9d21ac84f32effb754f7ad484">item_store_update()</a>, <a class="el" href="magic_8php.html#acea2cc792849ca2d71d4b689f66518bf">magic_init()</a>, <a class="el" href="mail_8php.html#acfc2cc0bf4e0b178207758384977f25a">mail_post()</a>, <a class="el" href="items_8php.html#a77da7ce9a117601d49ac4a67c71b514f">mail_store()</a>, <a class="el" href="include_2group_8php.html#ab0e422a0f31c0c64fd9084ca03d85f32">mini_group_select()</a>, <a class="el" href="include_2follow_8php.html#ae387d4ae097c23d69f3247e7f08140c7">new_contact()</a>, <a class="el" href="notifier_8php.html#a568c502f626cff95e344c0748938b85d">notifier_run()</a>, <a class="el" href="onepoll_8php.html#a72753b2fdec79b37c7f432035c91fb6d">onepoll_run()</a>, <a class="el" href="include_2network_8php.html#a27a951b59d8d622c0b3e7b0673ba74c6">parse_xml_string()</a>, <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>, <a class="el" href="socgraph_8php.html#a5ef8bef37161df53718a21e93d02fbd6">poco_load()</a>, <a class="el" href="post_8php.html#af59e6a1dc22d19d9257b01cd7ccedb75">post_post()</a>, <a class="el" href="zot_8php.html#a083aec6c900d244e1bfc1406f9461465">public_recips()</a>, <a class="el" href="dir__fns_8php.html#aa666e7df6ca8c332f4081c9b66b4bdf6">sync_directories()</a>, <a class="el" href="items_8php.html#ab1bce4261bcf75ad62753b498a144d17">tag_deliver()</a>, <a class="el" href="items_8php.html#a88c6cf7649ac836fbbed82a7a0315110">tgroup_check()</a>, <a class="el" href="dir__fns_8php.html#a44062d4b471d1e83f92f6c184585aa13">update_directory_entry()</a>, <a class="el" href="include_2network_8php.html#adf6008b38c555e98e7ed10da9ede2335">webfinger_dfrn()</a>, <a class="el" href="include_2network_8php.html#a99353baabbc3e0584b85eb79ee802cff">xml2array()</a>, <a class="el" href="include_2network_8php.html#aafd06c0a75402aefb06cfb9f9740fa37">z_fetch_url()</a>, <a class="el" href="include_2network_8php.html#a9129fd55e7fc175b4ea9a195cccc16bc">z_post_url()</a>, <a class="el" href="zot_8php.html#a3862b3161b2c8557dc1a95020179bd81">zot_build_packet()</a>, <a class="el" href="zot_8php.html#a61cdc1ec843663c423ed2d8160ae5aea">zot_fetch()</a>, <a class="el" href="zot_8php.html#aeea071f17e306fe3d0c488551906bfab">zot_import()</a>, <a class="el" href="zot_8php.html#a928f5643ca66ae9635d85aeb2be62e03">zot_process_response()</a>, <a class="el" href="zot_8php.html#a7b23bfb31d4491231e1e73bdc077240d">zot_refresh()</a>, and <a class="el" href="zot_8php.html#a5bcdfef419b16075a0eca990956223dc">zot_register_hub()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a93823d15ae07548a4c49de88d325cd26"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const LOGGER_DEBUG 2</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classRedDirectory.html#a1e35e3cd31d2a15250655e4cafdea180">RedDirectory\__construct()</a>, <a class="el" href="classItem.html#a80dcd9d0f548c3ad550abe7e6981fb51">Item\add_child()</a>, <a class="el" href="classConversation.html#a8335cdd43f1836e3c255638e61a09e16">Conversation\add_thread()</a>, <a class="el" href="admin_8php.html#a1d1362698af14d209aa3a0fb655551dd">admin_page_logs()</a>, <a class="el" href="include_2api_8php.html#afe534f826e4282b72d66e8cadca7bb73">api_login()</a>, <a class="el" href="include_2api_8php.html#a32f0dda848d0c11c727fe1c3e741c283">api_statuses_user_timeline()</a>, <a class="el" href="security_8php.html#adc7bf51e3b8d67bd80e9348f9ab03733">authenticate_success()</a>, <a class="el" href="include_2network_8php.html#ab07ce9d75eae559865ed90aad2154bd7">avatar_img()</a>, <a class="el" href="items_8php.html#a8794863cdf8ce1333040933d3a3f66bd">consume_feed()</a>, <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation()</a>, <a class="el" href="classRedDirectory.html#a986936910f0216887a25e28916c166c7">RedDirectory\createDirectory()</a>, <a class="el" href="classRedDirectory.html#a2d12d99d38a6a75fc9a830b2f7fc0bf0">RedDirectory\createFile()</a>, <a class="el" href="zot_8php.html#adfeb9400ae6b726beec89f8f1e8fde72">delete_imported_item()</a>, <a class="el" href="deliver_8php.html#a397afcb9afecf0c1816b0951189dd346">deliver_run()</a>, <a class="el" href="mod_2directory_8php.html#aac79396570d759da2efac24fcedf5b44">directory_content()</a>, <a class="el" href="include_2directory_8php.html#aa75d3b0697ca1456aaabdb37a74aa0f0">directory_run()</a>, <a class="el" href="dirprofile_8php.html#a3e1d30d3d93863ff5615f2df4ac7f052">dirprofile_init()</a>, <a class="el" href="expire_8php.html#a444e45c9b67727b27db4c779fd51a298">expire_run()</a>, <a class="el" href="items_8php.html#aba98fcbbcd7044a7e9ea34edabc14c87">fix_private_photos()</a>, <a class="el" href="classRedFile.html#a7c868dfcef6c70cd0e24cf3caa2c3535">RedFile\get()</a>, <a class="el" href="classConversation.html#a2a96b7a6573ae53db861624659e831cb">Conversation\get_template_data()</a>, <a class="el" href="classRedDirectory.html#a70173d4458572d95e586b2037d2fd2f4">RedDirectory\getDir()</a>, <a class="el" href="classRedFile.html#a0c961c5f49544d2502420361fa526437">RedFile\getName()</a>, <a class="el" href="mod_2group_8php.html#a07a64f6c65b0080d8190b3d9728a7a83">group_content()</a>, <a class="el" href="photo__driver_8php.html#a243cee492ce443afb6a7d77d54b6c4aa">guess_image_type()</a>, <a class="el" href="zot_8php.html#ad149f1e98c0c5b88ff9147e6ee3f330d">import_author_zot()</a>, <a class="el" href="photo__driver_8php.html#a1d0bc7161dec0d177b7d3bbe4421af9a">import_channel_photo()</a>, <a class="el" href="zot_8php.html#aeec89da5b6ff090c63a79de4de884a35">import_directory_profile()</a>, <a class="el" href="photo__driver_8php.html#a78f5a10c568d2a9bbbb129dc96548887">import_profile_photo()</a>, <a class="el" href="zot_8php.html#a56f3f65514e4e7f0cd117d01735aebd1">import_xchan()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">item_store()</a>, <a class="el" href="items_8php.html#acf0bf7c9d21ac84f32effb754f7ad484">item_store_update()</a>, <a class="el" href="like_8php.html#a9d7dd268f21c21e9d29dd2aca2dd9538">like_content()</a>, <a class="el" href="items_8php.html#af94c281016c6c912d06e064113336c5c">limit_body_size()</a>, <a class="el" href="classFKOAuth1.html#a2b1dac2ed31fc6ef84668afdda8b263f">FKOAuth1\loginUser()</a>, <a class="el" href="magic_8php.html#acea2cc792849ca2d71d4b689f66518bf">magic_init()</a>, <a class="el" href="items_8php.html#a77da7ce9a117601d49ac4a67c71b514f">mail_store()</a>, <a class="el" href="mood_8php.html#a7ae136dd7476865b4828136175db5022">mood_init()</a>, <a class="el" href="enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc">notification()</a>, <a class="el" href="notifier_8php.html#a568c502f626cff95e344c0748938b85d">notifier_run()</a>, <a class="el" href="parse__url_8php.html#a05a9e8944380ba3cf6bbf5893dd4b74b">parse_url_content()</a>, <a class="el" href="include_2photos_8php.html#a6c40ef58aefef705a5adc84a40e97109">photo_upload()</a>, <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>, <a class="el" href="poco_8php.html#a53def16f75e3d41f1d2bb7cfa4905498">poco_init()</a>, <a class="el" href="socgraph_8php.html#a5ef8bef37161df53718a21e93d02fbd6">poco_load()</a>, <a class="el" href="poke_8php.html#a9725aab97b3983e6a98bd81c4efe7d3b">poke_init()</a>, <a class="el" href="post_8php.html#af59e6a1dc22d19d9257b01cd7ccedb75">post_post()</a>, <a class="el" href="zot_8php.html#a37ec13b18057634eadb071f05297f5e1">process_delivery()</a>, <a class="el" href="zot_8php.html#a9a57b40669351c9791126b925cb7ef3b">process_profile_delivery()</a>, <a class="el" href="identity_8php.html#a4751b522ea913d0e7ed43e03d22e9e68">profile_load()</a>, <a class="el" href="classRedFile.html#a41a49a583eb276b75626fcf97f4a699c">RedFile\put()</a>, <a class="el" href="reddav_8php.html#a9f531641dfb4e43cd88ac1a9ae7e2088">RedFileData()</a>, <a class="el" href="classItem.html#a2ce70ef63f9f4d86a09c351678806925">Item\remove_child()</a>, <a class="el" href="include_2network_8php.html#ae8d9c41a11000fb8667039fc71b4f73f">scale_external_images()</a>, <a class="el" href="classenotify.html#afbc088860f534c6c05788b48cfc262c6">enotify\send()</a>, <a class="el" href="classConversation.html#a66f121ca4026246f86a732e5faa0682c">Conversation\set_mode()</a>, <a class="el" href="classRedFile.html#a38a82bfc1b30028ea6ac75923e90fa25">RedFile\setName()</a>, <a class="el" href="dir__fns_8php.html#a6cae22cfdd6edda5ddf09e07abb3242a">syncdirs()</a>, <a class="el" href="plugin_8php.html#a90538627db68605aeb6db17a8ead6523">unload_plugin()</a>, <a class="el" href="zot_8php.html#a95528377d7303131958c9f0b7158fdce">zot_finger()</a>, <a class="el" href="zot_8php.html#a55056e863a7860bc0cf922e78fcce073">zot_gethub()</a>, <a class="el" href="zot_8php.html#a5bcdfef419b16075a0eca990956223dc">zot_register_hub()</a>, and <a class="el" href="zotfeed_8php.html#a24dfc23d366e7f840cf2847d0c1c8eac">zotfeed_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a17b4ea23d9ecf628d9c8f53b7abcb805"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const LOGGER_NORMAL 0</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>log levels </p>
+
+<p>Referenced by <a class="el" href="admin_8php.html#a1d1362698af14d209aa3a0fb655551dd">admin_page_logs()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a022cea669f9f13ef7c6268b63884c57f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const LOGGER_TRACE 1</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="admin_8php.html#a1d1362698af14d209aa3a0fb655551dd">admin_page_logs()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ad0876e837cf3fad8a26417e315f6e2c8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const MAIL_DELETED 0x0001</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="ping_8php.html#a77217b1b190b4c5d8770867b45f0c0a1">ping_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa544a6c078130d0967a1f4ed8ce0a2d2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const MAIL_ISREPLY 0x0004</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a44ae1542a805ffd7f826fb511db07374"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const MAIL_OBSCURED 0x0020</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a2d840c74ed23d1b6c7daee05cf89dda7">encode_mail()</a>, <a class="el" href="items_8php.html#a94ddb1d6c8fa21dd7433677e85168037">get_mail_elements()</a>, <a class="el" href="include_2message_8php.html#a5f8de9847e203329e317ac38dc646898">private_messages_fetch_conversation()</a>, <a class="el" href="include_2message_8php.html#a254a756031e4d5e94f85e2939bdb5091">private_messages_fetch_message()</a>, <a class="el" href="include_2message_8php.html#a652973ce47a262f2d238c2fd6233d97e">private_messages_list()</a>, and <a class="el" href="include_2message_8php.html#a751ffd6635022b2190f56154ee745752">send_message()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ae4861de36017fe399c1839f778bad9f5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const MAIL_RECALLED 0x0010</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a2d840c74ed23d1b6c7daee05cf89dda7">encode_mail()</a>, <a class="el" href="items_8php.html#a94ddb1d6c8fa21dd7433677e85168037">get_mail_elements()</a>, <a class="el" href="mail_8php.html#a3c7c485fc69f92371e8b20936040eca1">mail_content()</a>, and <a class="el" href="zot_8php.html#aa6ae96db8cbbdbb10e6876d206bbf7cc">process_mail_delivery()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa3679df31c8dad1b71816b0322d5baff"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const MAIL_REPLIED 0x0002</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a1fbb93cf030f07391f22cc2948744869"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const MAIL_SEEN 0x0008</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="ping_8php.html#a77217b1b190b4c5d8770867b45f0c0a1">ping_init()</a>, <a class="el" href="include_2message_8php.html#a5f8de9847e203329e317ac38dc646898">private_messages_fetch_conversation()</a>, <a class="el" href="include_2message_8php.html#a254a756031e4d5e94f85e2939bdb5091">private_messages_fetch_message()</a>, and <a class="el" href="include_2message_8php.html#a652973ce47a262f2d238c2fd6233d97e">private_messages_list()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a525ca93ff35d3535d1a2b8ba57876afa"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const MAX_IMAGE_LENGTH -1</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>An alternate way of limiting picture upload sizes. Specify the maximum pixel length that pictures are allowed to be (for non-square pictures, it will apply to the longest side). Pictures longer than this length will be resized to be this length (on the longest side, the other side will be scaled appropriately). Modify this value using</p>
+<p>$a-&gt;config['system']['max_image_length'] = n;</p>
+<p>in .htconfig.php</p>
+<p>If you don't want to set a maximum length, set to -1. The default value is defined by 'MAX_IMAGE_LENGTH' below. </p>
+
+<p>Referenced by <a class="el" href="include_2photos_8php.html#a6c40ef58aefef705a5adc84a40e97109">photo_upload()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a35625dacd2158b9f1f1a8e77f9f081fd"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const MAX_LIKERS 75</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Maximum number of "people who like (or don't like) this" that we will list by name </p>
+
+</div>
+</div>
+<a class="anchor" id="ad11f30a6590d3d77f0c5e1e3909af8f5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const MENU_ITEM_NEWWIN 0x0002</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2menu_8php.html#a890cc6237971e15f15702e6b2e88502e">menu_render()</a>, <a class="el" href="mitem_8php.html#a7a31b702ecad18eeb6a38b243ff0037e">mitem_content()</a>, and <a class="el" href="mitem_8php.html#a6ee694cca4b551a20d7c7a94b5243ec1">mitem_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aed0dfb35f7dd00dc9e4f868ea7f7ff53"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const MENU_ITEM_ZID 0x0001</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2menu_8php.html#a890cc6237971e15f15702e6b2e88502e">menu_render()</a>, <a class="el" href="mitem_8php.html#a7a31b702ecad18eeb6a38b243ff0037e">mitem_content()</a>, and <a class="el" href="mitem_8php.html#a6ee694cca4b551a20d7c7a94b5243ec1">mitem_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a5df5359090d1f8e898c36d7cf8878ad2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const NAMESPACE_ACTIVITY 'http://activitystrea.ms/spec/1.0/'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a896c1809d58f2d7a42cfe14577958ddf">get_atom_elements()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a7b8f8ad9dbe82711257d23891ef6b133"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const NAMESPACE_ACTIVITY_SCHEMA 'http://activitystrea.ms/schema/1.0/'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="text_8php.html#af8a3e3a66a7b862d4510f145d2e13186">activity_match()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a444ce608ce34efb82ee11852f36e825f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const NAMESPACE_ATOM1 'http://www.w3.org/2005/Atom'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a7ed4581ab66ebcde97f6b3730856b028"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const NAMESPACE_DFRN 'http://purl.org/macgirvin/dfrn/1.0'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a896c1809d58f2d7a42cfe14577958ddf">get_atom_elements()</a>, and <a class="el" href="include_2network_8php.html#adf6008b38c555e98e7ed10da9ede2335">webfinger_dfrn()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ac195fc9003298923ea81f144388e24b1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const NAMESPACE_FEED 'http://schemas.google.com/g/2010#updates-from'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a03d19251c245587de7ed959300b87bdf"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const NAMESPACE_GEORSS 'http://www.georss.org/georss'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a896c1809d58f2d7a42cfe14577958ddf">get_atom_elements()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a6626f383c3d2d459f731ab8b4f237d16"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const NAMESPACE_MEDIA 'http://purl.org/syndication/atommedia'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#aa723c0571e314a1853a24c5854b4f54f">encode_rel_links()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="acca19aae62e1a6951a856b945de20d67"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const NAMESPACE_OSTATUS 'http://ostatus.org/schema/1.0'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a181c111f4b6c14d091dfd3bf0d0a22cd"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const NAMESPACE_OSTATUSSUB 'http://ostatus.org/schema/1.0/subscribe'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2network_8php.html#adf6008b38c555e98e7ed10da9ede2335">webfinger_dfrn()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a0b73e2548d6f9beb9c93211f488e336a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const NAMESPACE_POCO 'http://portablecontacts.net/spec/1.0'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aee324eca9de4e0fedf01ab5f92e27c67"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const NAMESPACE_SALMON_ME 'http://salmon-protocol.org/ns/magic-env'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="afaf93b7026f784b113b4f8921745891e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const NAMESPACE_STATUSNET 'http://status.net/schema/api/1/'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a896c1809d58f2d7a42cfe14577958ddf">get_atom_elements()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a1d6e7f4c08bb68e4a424326a811bdd86"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const NAMESPACE_THREAD 'http://purl.org/syndication/thread/1.0'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a8794863cdf8ce1333040933d3a3f66bd">consume_feed()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a4bfe22e163657690dfb6d5b1d04cb47e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const NAMESPACE_TOMB 'http://purl.org/atompub/tombstones/1.0'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a8794863cdf8ce1333040933d3a3f66bd">consume_feed()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a49f2a70b3b43aa904223a8d19e986a47"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const NAMESPACE_ZOT 'http://purl.org/zot'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>various namespaces we may need to parse </p>
+
+</div>
+</div>
+<a class="anchor" id="ae3cef7b63e25e7bafea3fcf6b99fad0e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const NETWORK_DFRN 'dfrn'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Network and protocol family types </p>
+
+<p>Referenced by <a class="el" href="conversation_8php.html#ad470fc7766f0db66d138fa1916c7a8b7">best_link_url()</a>, <a class="el" href="items_8php.html#a8794863cdf8ce1333040933d3a3f66bd">consume_feed()</a>, <a class="el" href="delegate_8php.html#a943eea8996ef348eb845c498f9f354dd">delegate_content()</a>, <a class="el" href="identity_8php.html#ad2c97627a313d53df1a1c7b4215ddb51">get_birthdays()</a>, <a class="el" href="contact__selectors_8php.html#ad472e4716426dd1a9dd77b62962454be">network_to_name()</a>, and <a class="el" href="Contact_8php.html#a38daa1c210b78385307123450ca9a1fc">terminate_friendship()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a38f6c7fe33b5434a24b4314567753dfa"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const NETWORK_DIASPORA 'dspr'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="contact__selectors_8php.html#ad472e4716426dd1a9dd77b62962454be">network_to_name()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="af3905ea8f8568d0236db13fca40514e3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const NETWORK_FACEBOOK 'face'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="contact__selectors_8php.html#ad472e4716426dd1a9dd77b62962454be">network_to_name()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ab4bddb41a0cf407178ec5278b950c393"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const NETWORK_FEED 'feed'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="contact__selectors_8php.html#ad472e4716426dd1a9dd77b62962454be">network_to_name()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a8905fde0a5b7882bdc083b20d9b34701"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const NETWORK_GPLUS 'goog'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a5b043b7fdcfd4e8c9c3747574afc6caa"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const NETWORK_LINKEDIN 'lnkd'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="contact__selectors_8php.html#ad472e4716426dd1a9dd77b62962454be">network_to_name()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a7236b2cdcf59f02a42302e893a99013b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const NETWORK_MAIL 'mail'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="contact__selectors_8php.html#ad472e4716426dd1a9dd77b62962454be">network_to_name()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa17a4f9c63f5cbc5c06f1066b6aebc42"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const NETWORK_MAIL2 'mai2'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ae94f7c7c0909629a75aed1c41f10bc95"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const NETWORK_MYSPACE 'mysp'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="contact__selectors_8php.html#ad472e4716426dd1a9dd77b62962454be">network_to_name()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aef4b6c558c68c88c10f13c5a00c20e3d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const NETWORK_OSTATUS 'stat'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="contact__selectors_8php.html#ad472e4716426dd1a9dd77b62962454be">network_to_name()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ab21fb0f3e6b962419955c6fc7f26734f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const NETWORK_PHANTOM 'unkn'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a43296b1b4398aacbf92a4b2d56bab91e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const NETWORK_XMPP 'xmpp'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="contact__selectors_8php.html#ad472e4716426dd1a9dd77b62962454be">network_to_name()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a2c65e925994566a63e6c03c381f1b4a0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const NETWORK_ZOT 'zot!'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="contact__selectors_8php.html#ad472e4716426dd1a9dd77b62962454be">network_to_name()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a20f0eed431d25870b624b8937a07a59f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const NOTIFY_COMMENT 0x0008</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc">notification()</a>, and <a class="el" href="items_8php.html#aab9e0c58247427126de0699c729c3b6c">send_status_notifications()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="af8c0cb0744c9a6b5d6d3baafb1f1e71d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const NOTIFY_CONFIRM 0x0002</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc">notification()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a56fd673eaa7014150297ce1162502db5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const NOTIFY_INTRO 0x0001</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>email notification options </p>
+
+<p>Referenced by <a class="el" href="enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc">notification()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a285732e7889fa7f333cbe431111e1029"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const NOTIFY_MAIL 0x0010</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a77da7ce9a117601d49ac4a67c71b514f">mail_store()</a>, and <a class="el" href="enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc">notification()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aca08bc4f1554ba877500f6abcc99e1e8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const NOTIFY_POKE 0x0200</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc">notification()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a981d46380f9f23c308bac1f9cb00dc5b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const NOTIFY_PROFILE 0x0040</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a9d01ef178b72b145016cca1393415bc4"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const NOTIFY_SUGGEST 0x0020</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc">notification()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a14d44d4a00223dc3db4ea962325db192"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const NOTIFY_SYSTEM 0x8000</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc">notification()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ab724491497ab2618b23a01d5da60aec0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const NOTIFY_TAGSELF 0x0080</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc">notification()</a>, and <a class="el" href="items_8php.html#ab1bce4261bcf75ad62753b498a144d17">tag_deliver()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="af6937db5f581d006bf4a5c3d9c7e0461"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const NOTIFY_TAGSHARE 0x0100</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc">notification()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a505410c7edc5f5bb5fa227b98359793e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const NOTIFY_WALL 0x0004</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, and <a class="el" href="enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc">notification()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ace83842dbeb84f7ed9ac59a9f57a7c32"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const PAGE_ADULT 0x0020</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586">settings_post()</a>, and <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a8231d115060d41a9c2a677f2c86f10ed"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const PAGE_APPLICATION 0x0004</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aa275653b9c87abc7391bb8040c1c2de9"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const PAGE_AUTOCONNECT 0x0002</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a5b8484922918946d041e5e0515dbe718"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const PAGE_DIRECTORY_CHANNEL 0x0008</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a5e322a2a2d0f51924c0b2e874988e640"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const PAGE_HIDDEN 0x0001</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a09532c3f750ae8c4527e63b2b790cbf3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const PAGE_NORMAL 0x0000</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Channel pageflags </p>
+
+<p>Referenced by <a class="el" href="identity_8php.html#a345f4c943d84de502ec6e72d2c813945">create_identity()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ab3920c2f3cd64802c0b7ff625c3b2ea8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const PAGE_PREMIUM 0x0010</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="connect_8php.html#a489f0a66c660de6ec4d6917b27674f07">connect_content()</a>, <a class="el" href="connect_8php.html#a417ec27afe33f21a929667a665e32ee2">connect_post()</a>, <a class="el" href="identity_8php.html#a432259b2cf5b6f59be53e71db9f2c7dc">profile_sidebar()</a>, and <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a4edce16cb7f21cdafa1e85bf63d713e6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const PAGE_REMOVED 0x8000</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="security_8php.html#a8d23d2597aae380a3341872fe9513380">change_channel()</a>, <a class="el" href="Contact_8php.html#a186162051a5127069cc851d78740f205">channel_remove()</a>, <a class="el" href="Contact_8php.html#a483cda56f9e37c3a4a8773dcdfeb0258">channelx_by_hash()</a>, <a class="el" href="Contact_8php.html#a3a0844dac1e86d523de5d2f432cfeebc">channelx_by_n()</a>, <a class="el" href="Contact_8php.html#a87e699f74a1102b25e8aa0432d86a91e">channelx_by_nick()</a>, <a class="el" href="manage_8php.html#a2bca247b5296827638959138367db4f5">manage_content()</a>, <a class="el" href="post_8php.html#af4b48181ce773ef0cdfc972441445c34">post_init()</a>, <a class="el" href="identity_8php.html#a4751b522ea913d0e7ed43e03d22e9e68">profile_load()</a>, <a class="el" href="reddav_8php.html#ae92ea0df1993f6a7bcd1b6efa6c1fb66">RedChannelList()</a>, and <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a6ee7a72d558d1851bbb9e3cdde377932"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const PAGE_SYSTEM 0x1000</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="identity_8php.html#a1cf83ac2b645de12868edaa3a5718f05">create_sys_channel()</a>, <a class="el" href="identity_8php.html#aaff86ee3b5984821e7a256c2da5f1a51">get_sys_channel()</a>, and <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a423505ab8dbd8e39d04ae3fe1374102b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const PERMS_A_DELEGATE 0x00800</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="permissions_8php.html#a040fd3d3b8517658b1668ae0cd093972">get_perms()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aae6c941bde5fd6fce07e51dba7326ead"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const PERMS_A_REPUBLISH 0x10000</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a87ac9e359591721a824ecd23bbb56296">check_item_source()</a>, and <a class="el" href="permissions_8php.html#a040fd3d3b8517658b1668ae0cd093972">get_perms()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ab2d0e8a9b81ee548ef2ce8e4560da2f6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const PERMS_CONTACTS 0x0008</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="permissions_8php.html#aeca9b280f3dc3358c89976d81d690008">get_all_perms()</a>, <a class="el" href="items_8php.html#ac1fcf621dce7370515b420a7753f4726">map_scope()</a>, <a class="el" href="permissions_8php.html#a67ada9ed51e77885b6b0f6a28cee1835">perm_is_allowed()</a>, and <a class="el" href="zot_8php.html#a083aec6c900d244e1bfc1406f9461465">public_recips()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a6df1102664f64b274810db85197c2755"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const PERMS_NETWORK 0x0002</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="display_8php.html#a37137c98d47bf3306f4c2bb9f5b60de0">display_content()</a>, <a class="el" href="permissions_8php.html#aeca9b280f3dc3358c89976d81d690008">get_all_perms()</a>, <a class="el" href="items_8php.html#ac1fcf621dce7370515b420a7753f4726">map_scope()</a>, <a class="el" href="permissions_8php.html#a67ada9ed51e77885b6b0f6a28cee1835">perm_is_allowed()</a>, <a class="el" href="zot_8php.html#a083aec6c900d244e1bfc1406f9461465">public_recips()</a>, and <a class="el" href="search_8php.html#ab2568591359edde5b483a6cd9a24b2cc">search_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aff210e8403dd72368522b17fb6e5d4e7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const PERMS_PUBLIC 0x0001</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="display_8php.html#a37137c98d47bf3306f4c2bb9f5b60de0">display_content()</a>, <a class="el" href="permissions_8php.html#aeca9b280f3dc3358c89976d81d690008">get_all_perms()</a>, <a class="el" href="items_8php.html#ac1fcf621dce7370515b420a7753f4726">map_scope()</a>, <a class="el" href="permissions_8php.html#a67ada9ed51e77885b6b0f6a28cee1835">perm_is_allowed()</a>, <a class="el" href="zot_8php.html#a083aec6c900d244e1bfc1406f9461465">public_recips()</a>, <a class="el" href="search_8php.html#ab2568591359edde5b483a6cd9a24b2cc">search_content()</a>, and <a class="el" href="permissions_8php.html#aa8b7b102c653649d7a71b5a1c044d90d">site_default_perms()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a3d6d4fc5fafcc9156811669158541caf"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const PERMS_R_ABOOK 0x00008</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="permissions_8php.html#a040fd3d3b8517658b1668ae0cd093972">get_perms()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ab51965fabe54dc031e9a0ce1142ee83e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const PERMS_R_PAGES 0x04000</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="permissions_8php.html#a040fd3d3b8517658b1668ae0cd093972">get_perms()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a29e921c0c72412cc738e44cca6ca1f62"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const PERMS_R_PHOTOS 0x00004</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="permissions_8php.html#a040fd3d3b8517658b1668ae0cd093972">get_perms()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ad789aef3cb95fc1eb36be7c4283d0137"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const PERMS_R_PROFILE 0x00002</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="permissions_8php.html#a040fd3d3b8517658b1668ae0cd093972">get_perms()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a1db4f0009c9cb4e107eab0f914a3c8dc"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const PERMS_R_STORAGE 0x01000</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="permissions_8php.html#a040fd3d3b8517658b1668ae0cd093972">get_perms()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aec36f8fcd4cb14a52934590b3d6666b4"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const PERMS_R_STREAM 0x00001</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Permissions </p>
+
+<p>Referenced by <a class="el" href="mod_2follow_8php.html#a171f5b19f50d7738adc3b2e96ec6018a">follow_init()</a>, <a class="el" href="permissions_8php.html#a040fd3d3b8517658b1668ae0cd093972">get_perms()</a>, <a class="el" href="onepoll_8php.html#a72753b2fdec79b37c7f432035c91fb6d">onepoll_run()</a>, and <a class="el" href="zot_8php.html#a7b23bfb31d4491231e1e73bdc077240d">zot_refresh()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a9ff652e5cb83cd11cbb0350844e7b28f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const PERMS_SITE 0x0004</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="permissions_8php.html#aeca9b280f3dc3358c89976d81d690008">get_all_perms()</a>, <a class="el" href="items_8php.html#ac1fcf621dce7370515b420a7753f4726">map_scope()</a>, <a class="el" href="permissions_8php.html#a67ada9ed51e77885b6b0f6a28cee1835">perm_is_allowed()</a>, and <a class="el" href="zot_8php.html#a083aec6c900d244e1bfc1406f9461465">public_recips()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a9cc986b4f9dd6558cbb2e25aadbfd964"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const PERMS_SPECIFIC 0x0080</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="connedit_8php.html#a795acb3d9d841f55c255d7611681ab67">connedit_content()</a>, <a class="el" href="permissions_8php.html#aeca9b280f3dc3358c89976d81d690008">get_all_perms()</a>, <a class="el" href="permissions_8php.html#a67ada9ed51e77885b6b0f6a28cee1835">perm_is_allowed()</a>, <a class="el" href="zot_8php.html#a083aec6c900d244e1bfc1406f9461465">public_recips()</a>, and <a class="el" href="permissions_8php.html#aa8b7b102c653649d7a71b5a1c044d90d">site_default_perms()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="acd877c405b06b348b37b6f7e62a211e9"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const PERMS_W_CHAT 0x00400</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="permissions_8php.html#a040fd3d3b8517658b1668ae0cd093972">get_perms()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a32df13fec0e43281da5979e1f5579aa8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const PERMS_W_COMMENT 0x00080</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a1e75047cf175aaee8dd16aa761913ff9">can_comment_on_post()</a>, <a class="el" href="permissions_8php.html#a040fd3d3b8517658b1668ae0cd093972">get_perms()</a>, and <a class="el" href="zot_8php.html#a083aec6c900d244e1bfc1406f9461465">public_recips()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a6b31dd451bc6c37fe7c9c766ff385aaf"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const PERMS_W_MAIL 0x00100</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="acl_8php.html#ac6776dba871806ecdb5d1659bc2eb07a">acl_init()</a>, <a class="el" href="permissions_8php.html#a040fd3d3b8517658b1668ae0cd093972">get_perms()</a>, <a class="el" href="mail_8php.html#acfc2cc0bf4e0b178207758384977f25a">mail_post()</a>, <a class="el" href="include_2follow_8php.html#ae387d4ae097c23d69f3247e7f08140c7">new_contact()</a>, and <a class="el" href="zot_8php.html#a083aec6c900d244e1bfc1406f9461465">public_recips()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa9244fc9cc221980c07a20cc534111be"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const PERMS_W_PAGES 0x08000</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="permissions_8php.html#a040fd3d3b8517658b1668ae0cd093972">get_perms()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a57eee7352714c004d36c26dda74af73e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const PERMS_W_PHOTOS 0x00200</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="permissions_8php.html#a040fd3d3b8517658b1668ae0cd093972">get_perms()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a4fefd7486d3b888a05cfd3dc9575f115"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const PERMS_W_STORAGE 0x02000</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="permissions_8php.html#a040fd3d3b8517658b1668ae0cd093972">get_perms()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a8bb0395933b5e886f086f6a2fb0bfa55"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const PERMS_W_STREAM 0x00010</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#a36344c80b8e9755da2f2dd3a0e28cce8">api_ff_ids()</a>, <a class="el" href="include_2api_8php.html#aa0d6b29fff0344a8e67f3507a6d01410">api_statuses_f()</a>, <a class="el" href="permissions_8php.html#a040fd3d3b8517658b1668ae0cd093972">get_perms()</a>, <a class="el" href="include_2follow_8php.html#ae387d4ae097c23d69f3247e7f08140c7">new_contact()</a>, and <a class="el" href="zot_8php.html#a083aec6c900d244e1bfc1406f9461465">public_recips()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a99a4a17cb644e7e6826ea07ecaf09777"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const PERMS_W_TAGWALL 0x00040</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="acl_8php.html#ac6776dba871806ecdb5d1659bc2eb07a">acl_init()</a>, <a class="el" href="permissions_8php.html#a040fd3d3b8517658b1668ae0cd093972">get_perms()</a>, and <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a6b14a31a8aa9f3452a13383f413bffa2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const PERMS_W_WALL 0x00020</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="permissions_8php.html#a040fd3d3b8517658b1668ae0cd093972">get_perms()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a4a49b29838ef2c45ab3556b52baec6a4"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const PHOTO_NORMAL 0x0000</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Photo types </p>
+
+<p>Referenced by <a class="el" href="include_2photos_8php.html#a6c40ef58aefef705a5adc84a40e97109">photo_upload()</a>, <a class="el" href="include_2photos_8php.html#aedccaf18282b26899d9549c29bd9d1b9">photos_albums_list()</a>, <a class="el" href="mod_2photos_8php.html#aa87382611a66ec5effdb2d78f13f5812">photos_content()</a>, <a class="el" href="include_2photos_8php.html#aa27b9e435dcc34e1009f56dc02c7ca51">photos_list_photos()</a>, <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>, and <a class="el" href="profile__photo_8php.html#a4b80234074bd603221aa5364f330e479">profile_photo_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ab4bc9c50ecc927b92d519e36562b0df0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const PHOTO_PROFILE 0x0001</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="photo__driver_8php.html#a1d0bc7161dec0d177b7d3bbe4421af9a">import_channel_photo()</a>, <a class="el" href="include_2photos_8php.html#aedccaf18282b26899d9549c29bd9d1b9">photos_albums_list()</a>, <a class="el" href="mod_2photos_8php.html#aa87382611a66ec5effdb2d78f13f5812">photos_content()</a>, <a class="el" href="include_2photos_8php.html#aa27b9e435dcc34e1009f56dc02c7ca51">photos_list_photos()</a>, <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>, <a class="el" href="profile__photo_8php.html#a4b80234074bd603221aa5364f330e479">profile_photo_post()</a>, and <a class="el" href="classphoto__driver.html#a5864fae7d8389372955a8e78cec527ac">photo_driver\save()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a78849a1bf8ce8d9804b4cbb502e8f383"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const PHOTO_THING 0x0004</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="photo__driver_8php.html#a78f5a10c568d2a9bbbb129dc96548887">import_profile_photo()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ac43182e0d8bae7576a30b603774974f8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const PHOTO_XCHAN 0x0002</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="photo__driver_8php.html#a78f5a10c568d2a9bbbb129dc96548887">import_profile_photo()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a8df201788c9dd0ca91384e3a14c08bce"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const PNG_QUALITY 8</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>$a-&gt;config['system']['png_quality'] from 0 (uncompressed) to 9 </p>
+
+<p>Referenced by <a class="el" href="classphoto__gd.html#a0795fc029be382557ae3f6e285f40e00">photo_gd\imageString()</a>, and <a class="el" href="classphoto__imagick.html#a2c9168f110ccd6c264095d766615dfa8">photo_imagick\load()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="abbf5ac24eb8aeedb862f618ee0d21e86"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const POLL_MULTIPLE_CHOICE 0x0004</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a2b525996e4426bdddbcec277778bde08"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const POLL_OVERWRITE 0x8000</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="vote_8php.html#a57a9516ee1b923b224e66dcc47377fb2">vote_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ad88a70ec62e08d590123d3697dfe64d5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const POLL_SIMPLE_RATING 0x0001</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Poll/Survey types </p>
+
+<p>Referenced by <a class="el" href="vote_8php.html#a6aa67489bf458ca5e3206e46dac68596">vote_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a1ba00027b718db732f30fc0e2c3e0abc"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const POLL_TENSCALE 0x0002</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a96ad56755a21e1361dbd7bf93c9e7ff4"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const RED_PLATFORM 'Red Matrix'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Red Matrix.</p>
+<p>The Red Matrix (aka "Red") is an open source decentralised communications platform combined with a decentralised identity/authentication framework wrapped in an extensible content management system, providing website designers the ability to embed fully decentralised communications and social tools into many traditional website designs (blogs, forums, small business websites, charitable organisations, etc.). Red also provides DNS mobility and internet scale privacy/access control.</p>
+<p>This allows any individual website to participate in a matrix of linked sites and people and media sharing which is far greater than the reach of an individual site.</p>
+<p>If you are reading the source code and come across a function or code block which is not documented, but you have a good idea what it does, please add some descriptive comments and push it to the main project. Even if your description isn't perfect, it gives us a base which we can build on and correct - so that eventually everything is fully documented. </p>
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#a623793229a7256dd31bcfd5ab90eef08">api_statusnet_config()</a>, <a class="el" href="classApp.html#a08f0537964d98958d218066364cff785">App\build_pagehead()</a>, <a class="el" href="items_8php.html#a04a35b610acfe54434df08adec39c0c7">get_feed_for()</a>, <a class="el" href="identity_8php.html#a3570a4eb77332b292d394c4132cb8f03">identity_basic_export()</a>, <a class="el" href="parse__url_8php.html#a05a9e8944380ba3cf6bbf5893dd4b74b">parse_url_content()</a>, <a class="el" href="siteinfo_8php.html#a3efbd0bd6564af19ec0a9ce0294e59d0">siteinfo_init()</a>, and <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a21cc29e0025943e7c28ff58cb4856ac3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const RED_VERSION trim(file_get_contents('version.inc')) . 'R'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="admin_8php.html#ac6e95b920b5abd030cc522964987087a">admin_page_summary()</a>, <a class="el" href="include_2api_8php.html#a53b0680b682ae6078f2e1ed18cfb3f74">api_friendica_version()</a>, <a class="el" href="include_2api_8php.html#a623793229a7256dd31bcfd5ab90eef08">api_statusnet_config()</a>, <a class="el" href="classApp.html#a08f0537964d98958d218066364cff785">App\build_pagehead()</a>, <a class="el" href="items_8php.html#a04a35b610acfe54434df08adec39c0c7">get_feed_for()</a>, <a class="el" href="identity_8php.html#a3570a4eb77332b292d394c4132cb8f03">identity_basic_export()</a>, <a class="el" href="siteinfo_8php.html#a70c09bfb6dd1c86a125a35f62ed53656">siteinfo_content()</a>, <a class="el" href="siteinfo_8php.html#a3efbd0bd6564af19ec0a9ce0294e59d0">siteinfo_init()</a>, and <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a7176c0f9f1c98421b97735d892cf6252"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const REGISTER_APPROVE 1</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="admin_8php.html#ac0f3bd12431c056aad77bac9d09fa30e">admin_page_site()</a>, <a class="el" href="zot_8php.html#a2657e141d62d5f67ad3c87651b585299">import_site()</a>, <a class="el" href="dirsearch_8php.html#a985d410a170549429857af6ff2673149">list_public_sites()</a>, <a class="el" href="ping_8php.html#a77217b1b190b4c5d8770867b45f0c0a1">ping_init()</a>, <a class="el" href="register_8php.html#a0e91f57f111407ea8d3223a05022bb2a">register_content()</a>, <a class="el" href="register_8php.html#a51731dcc1917c58a790eb1c0f6132271">register_post()</a>, and <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a69aac276ed82e010dc382b16ab4d59e1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const REGISTER_CLOSED 0</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>registration policies </p>
+
+<p>Referenced by <a class="el" href="admin_8php.html#ac0f3bd12431c056aad77bac9d09fa30e">admin_page_site()</a>, <a class="el" href="include_2api_8php.html#a623793229a7256dd31bcfd5ab90eef08">api_statusnet_config()</a>, <a class="el" href="home_8php.html#aa1cf697851a646755baf537f75334c46">home_content()</a>, <a class="el" href="zot_8php.html#a2657e141d62d5f67ad3c87651b585299">import_site()</a>, <a class="el" href="login_8php.html#a1d69ca88eb9005a7026e128b9a645904">login_content()</a>, <a class="el" href="register_8php.html#a0e91f57f111407ea8d3223a05022bb2a">register_content()</a>, <a class="el" href="register_8php.html#a51731dcc1917c58a790eb1c0f6132271">register_post()</a>, <a class="el" href="regmod_8php.html#a7953df4e32e63946565e90cdd5d50409">regmod_content()</a>, and <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ad8887b49bbb02dd30b4eb9f6c7773c63"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const REGISTER_OPEN 2</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="admin_8php.html#ac0f3bd12431c056aad77bac9d09fa30e">admin_page_site()</a>, <a class="el" href="zot_8php.html#a2657e141d62d5f67ad3c87651b585299">import_site()</a>, <a class="el" href="dirsearch_8php.html#a985d410a170549429857af6ff2673149">list_public_sites()</a>, <a class="el" href="nav_8php.html#a43be0df73b90647ea70947ce004e231e">nav()</a>, <a class="el" href="register_8php.html#a51731dcc1917c58a790eb1c0f6132271">register_post()</a>, <a class="el" href="sitelist_8php.html#a665a59bf60f780b40f32c909f4a473b1">sitelist_init()</a>, and <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a02566ac9d891369a1d3ebb81a15722fc"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const SSL_POLICY_FULL 1</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="af86c651547aa8f9e549ee40a09455549"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const SSL_POLICY_NONE 0</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>SSL redirection policies </p>
+
+</div>
+</div>
+<a class="anchor" id="adca48aee78465ae3064ca4432c0d87b5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const SSL_POLICY_SELFSIGN 2</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aecaa1b6945b317ba8f1daf4af2aed8e6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const STORAGE_DEFAULT_PERMISSIONS 0770</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Default permissions for file-based storage (webDAV, etc.) These files will be owned by the webserver who will need write access to the "storage" folder. Ideally you should make this 700, however some hosted platforms may not let you change ownership of this directory so we're defaulting to both owner-write and group-write privilege. This should work for most cases without modification. Over-ride this in your .htconfig.php if you need something either more or less restrictive. </p>
+
+<p>Referenced by <a class="el" href="include_2attach_8php.html#ab6830b3ab74a5d284876141ac80f6cbc">attach_mkdir()</a>, and <a class="el" href="setup_8php.html#ab4b71369a25021d59247c917e98d8246">check_store()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="af33d1b2e98a1e21af672005525d46dfe"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const TERM_CATEGORY 3</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="contact__widgets_8php.html#a165eb021e61c4dcab2a552f28628d353">categories_widget()</a>, <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>, <a class="el" href="items_8php.html#a56b2a4abcadfac71175cd50555528cc3">decode_tags()</a>, <a class="el" href="editpost_8php.html#a34011690864d122680c802e9e748ccfb">editpost_content()</a>, <a class="el" href="items_8php.html#ac6673627d289ee4f547de0fe3b7acd0a">encode_item_terms()</a>, <a class="el" href="taxonomy_8php.html#a163b5131f388080b0fc82398d3a32fe1">file_tag_file_query()</a>, <a class="el" href="filerm_8php.html#ae2eb28d2054fa2c37e38689882172208">filerm_content()</a>, <a class="el" href="text_8php.html#a3054189cff173977f4216c9a3dd29e1b">format_categories()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, and <a class="el" href="widgets_8php.html#a6dbc227aac750774284ee39c45f0a200">widget_tagcloud()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="afb97615e985a013799839b68b99018d7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const TERM_FILE 5</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a56b2a4abcadfac71175cd50555528cc3">decode_tags()</a>, <a class="el" href="taxonomy_8php.html#a163b5131f388080b0fc82398d3a32fe1">file_tag_file_query()</a>, <a class="el" href="contact__widgets_8php.html#a1eda66319d170f60a8d07c7ece95533b">fileas_widget()</a>, <a class="el" href="filer_8php.html#a5fd5d7e61b2f9c43cb5f110c89dc4274">filer_content()</a>, <a class="el" href="filerm_8php.html#ae2eb28d2054fa2c37e38689882172208">filerm_content()</a>, <a class="el" href="text_8php.html#a4e4d42b0a805148d9f9a92bcac89bf91">format_filer()</a>, <a class="el" href="items_8php.html#a6f7e1334af5d684a987fa6a3eb37f4cc">item_expire()</a>, <a class="el" href="items_8php.html#a756738301f2ed96be50232500677d58a">items_fetch()</a>, <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>, and <a class="el" href="widgets_8php.html#a5ab3b64496e02cab56429978ad55f1c0">widget_filer()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a2750985ec445617d7e82ae3098c91e3f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const TERM_HASHTAG 1</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a87ac9e359591721a824ecd23bbb56296">check_item_source()</a>, <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation()</a>, <a class="el" href="items_8php.html#a56b2a4abcadfac71175cd50555528cc3">decode_tags()</a>, <a class="el" href="items_8php.html#ac6673627d289ee4f547de0fe3b7acd0a">encode_item_terms()</a>, <a class="el" href="taxonomy_8php.html#adfead45e3b8a3dfb2b4a4b9281d0dbe1">format_term_for_display()</a>, <a class="el" href="items_8php.html#a896c1809d58f2d7a42cfe14577958ddf">get_atom_elements()</a>, <a class="el" href="item_8php.html#aa22feef4de326e1d7078dedd892e615c">handle_tag()</a>, <a class="el" href="items_8php.html#a649dc3e53ed794d0ead4b5d037f8d8d7">item_getfeedtags()</a>, <a class="el" href="items_8php.html#a756738301f2ed96be50232500677d58a">items_fetch()</a>, <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>, <a class="el" href="zot_8php.html#aad25a3fe0e1566121d6fb8222979bc10">remove_community_tag()</a>, <a class="el" href="search__ac_8php.html#a14f90c83a3f2be095e9e2992a8d66138">search_ac_init()</a>, <a class="el" href="search_8php.html#ab2568591359edde5b483a6cd9a24b2cc">search_content()</a>, <a class="el" href="items_8php.html#ab1bce4261bcf75ad62753b498a144d17">tag_deliver()</a>, and <a class="el" href="tagger_8php.html#a0e4a3eb177d1684553c547503d67161c">tagger_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ae37444eaa42705185080ccf3e670cbc2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const TERM_MENTION 2</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation()</a>, <a class="el" href="items_8php.html#a56b2a4abcadfac71175cd50555528cc3">decode_tags()</a>, <a class="el" href="items_8php.html#ac6673627d289ee4f547de0fe3b7acd0a">encode_item_terms()</a>, <a class="el" href="items_8php.html#adf980098b6de9c3993bc3ff26a8dd6f9">fetch_post_tags()</a>, <a class="el" href="taxonomy_8php.html#adfead45e3b8a3dfb2b4a4b9281d0dbe1">format_term_for_display()</a>, <a class="el" href="items_8php.html#a896c1809d58f2d7a42cfe14577958ddf">get_atom_elements()</a>, <a class="el" href="text_8php.html#a76d1b3435c067978d7b484c45f56472b">get_mentions()</a>, <a class="el" href="item_8php.html#aa22feef4de326e1d7078dedd892e615c">handle_tag()</a>, <a class="el" href="items_8php.html#a649dc3e53ed794d0ead4b5d037f8d8d7">item_getfeedtags()</a>, <a class="el" href="items_8php.html#ab1bce4261bcf75ad62753b498a144d17">tag_deliver()</a>, and <a class="el" href="items_8php.html#a88c6cf7649ac836fbbed82a7a0315110">tgroup_check()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a8892374789fd261eb32a7969d934a14a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const TERM_OBJ_CHANNEL 4</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a882b666adfe21f035a0f8c02806066d6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const TERM_OBJ_OBJECT 5</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a64617d4655804de2a3c86501ab4fdbfd"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const TERM_OBJ_PHOTO 2</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a9eeb8989272d5ff804a616898bb13659"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const TERM_OBJ_POST 1</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a2b56a4c01bd22a648d52ec9af1a04259">delete_item_lowlevel()</a>, <a class="el" href="items_8php.html#adf980098b6de9c3993bc3ff26a8dd6f9">fetch_post_tags()</a>, <a class="el" href="filer_8php.html#a5fd5d7e61b2f9c43cb5f110c89dc4274">filer_content()</a>, <a class="el" href="items_8php.html#a896c1809d58f2d7a42cfe14577958ddf">get_atom_elements()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">item_store()</a>, <a class="el" href="items_8php.html#acf0bf7c9d21ac84f32effb754f7ad484">item_store_update()</a>, <a class="el" href="zot_8php.html#aad25a3fe0e1566121d6fb8222979bc10">remove_community_tag()</a>, <a class="el" href="search_8php.html#ab2568591359edde5b483a6cd9a24b2cc">search_content()</a>, <a class="el" href="items_8php.html#ab1bce4261bcf75ad62753b498a144d17">tag_deliver()</a>, <a class="el" href="taxonomy_8php.html#aaf90ba8b839d6459065f39a4f1109b8a">tagadelic()</a>, and <a class="el" href="tagger_8php.html#a0e4a3eb177d1684553c547503d67161c">tagger_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aead84fa27d7516b855220fe004964a45"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const TERM_OBJ_PROFILE 3</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a0cc8dc76bd10ac0ec81bac08a46f82fe"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const TERM_OBJ_THING 6</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="taxonomy_8php.html#a7747fa859ac56fbffd4f9782d85505de">get_things()</a>, <a class="el" href="thing_8php.html#a24a35f1e64029a67fdbea94a776ae04b">thing_content()</a>, and <a class="el" href="thing_8php.html#a8be23b1d475ec3d9291999221c674c80">thing_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a45b12aefab9675baffc7a07a09486db8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const TERM_PCATEGORY 4</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a56b2a4abcadfac71175cd50555528cc3">decode_tags()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="abd7bb40da9cc073297e49736b338ca07"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const TERM_SAVEDSEARCH 6</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="widgets_8php.html#a94203eb9bcd63cbdecbbcb15163598d8">widget_savedsearch()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a0d877df1e20bae765e1708be50f6b503"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const TERM_THING 7</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="thing_8php.html#a8be23b1d475ec3d9291999221c674c80">thing_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a0c59dde058efebbc66520d136cbd1631"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const TERM_UNKNOWN 0</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Tag/term types </p>
+
+<p>Referenced by <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation()</a>, <a class="el" href="items_8php.html#a56b2a4abcadfac71175cd50555528cc3">decode_tags()</a>, <a class="el" href="items_8php.html#ac6673627d289ee4f547de0fe3b7acd0a">encode_item_terms()</a>, <a class="el" href="items_8php.html#a896c1809d58f2d7a42cfe14577958ddf">get_atom_elements()</a>, and <a class="el" href="item_8php.html#aa22feef4de326e1d7078dedd892e615c">handle_tag()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a75fc600186b13c3b25e661afefb5eac8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const UPDATE_FAILED 1</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="admin_8php.html#aaa6addf2dbc3f3fcf99244a56b41eade">admin_page_dbsync()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aea392cb26ed617f3a8cde648385b5df0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const UPDATE_FLAGS_DELETED 0x1000</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="dirsearch_8php.html#aa1fb04e1de4f25b63349ac78f94ceb4c">dirsearch_content()</a>, <a class="el" href="dir__fns_8php.html#aa666e7df6ca8c332f4081c9b66b4bdf6">sync_directories()</a>, and <a class="el" href="dir__fns_8php.html#a44062d4b471d1e83f92f6c184585aa13">update_directory_entry()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a9690d73434125ce594a1f5e7c2a4f7c0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const UPDATE_FLAGS_UPDATED 0x0001</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="zot_8php.html#a56f3f65514e4e7f0cd117d01735aebd1">import_xchan()</a>, <a class="el" href="onedirsync_8php.html#a411aedd47c57476099647961e6a86691">onedirsync_run()</a>, <a class="el" href="poller_8php.html#a5f12df3a4738124b6c039971e87e76da">poller_run()</a>, and <a class="el" href="zot_8php.html#ab319d1d9fff9c7775d9daef42d1f33dd">update_modtime()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ac86615ddc0763a00f5311c90e991730c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const UPDATE_SUCCESS 0</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>DB update return values </p>
+
+<p>Referenced by <a class="el" href="admin_8php.html#aaa6addf2dbc3f3fcf99244a56b41eade">admin_page_dbsync()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="accd6f36cc9f40225cbd720e4d12a7c6e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const XCHAN_FLAGS_CENSORED 0x0004</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="dirsearch_8php.html#aa1fb04e1de4f25b63349ac78f94ceb4c">dirsearch_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a9ea1290e00c6d40684892047f2c778a9"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const XCHAN_FLAGS_DELETED 0x1000</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="acl_8php.html#ac6776dba871806ecdb5d1659bc2eb07a">acl_init()</a>, <a class="el" href="Contact_8php.html#a186162051a5127069cc851d78740f205">channel_remove()</a>, <a class="el" href="connections_8php.html#aec2e457420fce3e3bf6a9f48e36df25c">connections_content()</a>, <a class="el" href="dirsearch_8php.html#aa1fb04e1de4f25b63349ac78f94ceb4c">dirsearch_content()</a>, <a class="el" href="Contact_8php.html#acc12cda999c88c4d6185cca967c15125">remove_all_xchan_resources()</a>, <a class="el" href="socgraph_8php.html#a76e6fca3d2bc842dcd9e710bb87c8329">suggestion_query()</a>, and <a class="el" href="viewconnections_8php.html#ab6c4d983e97b3a8a879567ff76507776">viewconnections_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a1af3ed96de14aa0d7891b39cc75b60f2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const XCHAN_FLAGS_HIDDEN 0x0001</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="dirsearch_8php.html#aa1fb04e1de4f25b63349ac78f94ceb4c">dirsearch_content()</a>, <a class="el" href="zot_8php.html#a56f3f65514e4e7f0cd117d01735aebd1">import_xchan()</a>, <a class="el" href="socgraph_8php.html#a76e6fca3d2bc842dcd9e710bb87c8329">suggestion_query()</a>, <a class="el" href="dir__fns_8php.html#a6cae22cfdd6edda5ddf09e07abb3242a">syncdirs()</a>, <a class="el" href="viewconnections_8php.html#ab6c4d983e97b3a8a879567ff76507776">viewconnections_content()</a>, and <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a8fdcc4ffb365a3267bd02ce8a8d466d6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const XCHAN_FLAGS_NORMAL 0x0000</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="identity_8php.html#a345f4c943d84de502ec6e72d2c813945">create_identity()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a1c923b99bf77e4203ae94e5684b6ad0f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const XCHAN_FLAGS_ORPHAN 0x0002</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="dirsearch_8php.html#aa1fb04e1de4f25b63349ac78f94ceb4c">dirsearch_content()</a>, and <a class="el" href="viewconnections_8php.html#ab6c4d983e97b3a8a879567ff76507776">viewconnections_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a5a681a672e007cdc22b43345d71f07c6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const XCHAN_FLAGS_SELFCENSORED 0x0008</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="dirsearch_8php.html#aa1fb04e1de4f25b63349ac78f94ceb4c">dirsearch_content()</a>, <a class="el" href="zot_8php.html#aeec89da5b6ff090c63a79de4de884a35">import_directory_profile()</a>, and <a class="el" href="zot_8php.html#a56f3f65514e4e7f0cd117d01735aebd1">import_xchan()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="afef254290febac854c85fc698d9483a6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const XCHAN_FLAGS_SYSTEM 0x0010</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="identity_8php.html#a1cf83ac2b645de12868edaa3a5718f05">create_sys_channel()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a3cd42a70c6b3999590e4fd7a1a9096af"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ZCURL_TIMEOUT (-1)</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Communication timeout </p>
+
+</div>
+</div>
+<a class="anchor" id="a36b31575f992a10b5927b76efba9362e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ZOT_REVISION 1</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#a623793229a7256dd31bcfd5ab90eef08">api_statusnet_config()</a>, <a class="el" href="magic_8php.html#acea2cc792849ca2d71d4b689f66518bf">magic_init()</a>, and <a class="el" href="zot_8php.html#a3862b3161b2c8557dc1a95020179bd81">zot_build_packet()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/boot_8php.js b/doc/html/boot_8php.js
new file mode 100644
index 000000000..29722c7b7
--- /dev/null
+++ b/doc/html/boot_8php.js
@@ -0,0 +1,273 @@
+var boot_8php =
+[
+ [ "App", "classApp.html", "classApp" ],
+ [ "absurl", "boot_8php.html#a081307d681d7d04f17b9ced2076e7c85", null ],
+ [ "appdirpath", "boot_8php.html#a75a90b0eadd0df510f7e63210733634d", null ],
+ [ "argc", "boot_8php.html#abc0a90a1a77f5b668aa7e4b57d1776a7", null ],
+ [ "argv", "boot_8php.html#a768f00b7d66be0daf7ef4eea2e862006", null ],
+ [ "build_querystring", "boot_8php.html#a9cbab4ee728e9a8b4ce952bae643044e", null ],
+ [ "check_config", "boot_8php.html#a4c02d88e66852a01bd5a1feecb7c3ce3", null ],
+ [ "clean_urls", "boot_8php.html#ab79b8b4555cae20d03f8200666d89d63", null ],
+ [ "construct_page", "boot_8php.html#acc4e0c910af066148b810e5fde55fff1", null ],
+ [ "curPageURL", "boot_8php.html#aa4221641e5c21db69fa52c426b9017f5", null ],
+ [ "current_theme", "boot_8php.html#ad206598b909e8eb67eb0e0bb5ef69c13", null ],
+ [ "current_theme_url", "boot_8php.html#a926cad0b3d8b9d9ee5da1898fc063ba3", null ],
+ [ "dba_timer", "boot_8php.html#a3e0930933fb2c0bf8211cc7ab4e1c3b4", null ],
+ [ "fix_system_urls", "boot_8php.html#aca5e42678e178c6b9034610d66666fd7", null ],
+ [ "get_account_id", "boot_8php.html#afe88b920aa285982edb817a0dd44eb37", null ],
+ [ "get_app", "boot_8php.html#a0e6db7e365f2b041a828b93786f694bc", null ],
+ [ "get_custom_nav", "boot_8php.html#a899d24fd074594ceebbf72e1feff335f", null ],
+ [ "get_max_import_size", "boot_8php.html#a97769915c9f14adc4f8ab1ea2cecfd90", null ],
+ [ "get_observer_hash", "boot_8php.html#a623e49c79943f3e7bdb770d021683cf7", null ],
+ [ "goaway", "boot_8php.html#a5ab6181607a090bcdbaa13b15b85aba1", null ],
+ [ "head_get_icon", "boot_8php.html#a24a7a70afedd5d85fe0eadc85afa9f77", null ],
+ [ "head_set_icon", "boot_8php.html#a0e4701c9742c3ef88f02ac450a042a84", null ],
+ [ "info", "boot_8php.html#adfb2fc7be5a4226c0a8e24131da9d498", null ],
+ [ "is_ajax", "boot_8php.html#ac17fc8a416ea79e9d5cb4dc9a8ff8c5c", null ],
+ [ "is_site_admin", "boot_8php.html#aa1e828bbbcba170265eb2668d8daf42e", null ],
+ [ "killme", "boot_8php.html#aea7fc57a4d8e9dcb42f2601b0b9b761c", null ],
+ [ "load_contact_links", "boot_8php.html#a719c7f3972d5f9268f37a41c76cd4ef6", null ],
+ [ "local_user", "boot_8php.html#ad4c9dc2c8a82e8f52b7404c1655eab44", null ],
+ [ "login", "boot_8php.html#aefecf8599036df7f1b95d6820e0e2fa4", null ],
+ [ "notice", "boot_8php.html#a9255af5ae9c887520091ea04763c1a88", null ],
+ [ "proc_run", "boot_8php.html#ab346a2ece14993861f3e4206befa94f0", null ],
+ [ "remote_user", "boot_8php.html#a5542c5c2806ab8bca04bad53d47b5209", null ],
+ [ "startup", "boot_8php.html#aca47505b8732177f52bb2d647eb2741c", null ],
+ [ "system_unavailable", "boot_8php.html#ac608a34f3bc180e7724192e0fd31f9b0", null ],
+ [ "x", "boot_8php.html#a01353c9abebc3544ea080ac161729632", null ],
+ [ "z_path", "boot_8php.html#aba208673515cbb8a55e5fa4a1da99fda", null ],
+ [ "z_root", "boot_8php.html#add517a0958ac684792c62142a3877f81", null ],
+ [ "ABOOK_FLAG_ARCHIVED", "boot_8php.html#a222395aa223cfbff6166fab0b4e2e1d5", null ],
+ [ "ABOOK_FLAG_BLOCKED", "boot_8php.html#a52b599cd13e152ebc80d7e4413683195", null ],
+ [ "ABOOK_FLAG_HIDDEN", "boot_8php.html#a34c756469ebed32e2fc987bcde62d382", null ],
+ [ "ABOOK_FLAG_IGNORED", "boot_8php.html#aa3425e2de85b08f7041656d3a8502cb6", null ],
+ [ "ABOOK_FLAG_PENDING", "boot_8php.html#a68eebe493e6f729ffd1aeda7a4b11155", null ],
+ [ "ABOOK_FLAG_SELF", "boot_8php.html#a0450389f24c632906fbc24347700a543", null ],
+ [ "ACCESS_FREE", "boot_8php.html#afbb1fe1b2c8c730ec8e08da93b6512c4", null ],
+ [ "ACCESS_PAID", "boot_8php.html#a9c80420e5a063a4a87ce4831f086134d", null ],
+ [ "ACCESS_PRIVATE", "boot_8php.html#a7f3474fec541e261fc8dff47313c4017", null ],
+ [ "ACCESS_TIERED", "boot_8php.html#aeb1039302affcbe7e8872c01c08c88f8", null ],
+ [ "ACCOUNT_BLOCKED", "boot_8php.html#af3bdfc20979c16f15bb9c60446a480f9", null ],
+ [ "ACCOUNT_EXPIRED", "boot_8php.html#a400519fa181591cd6fdbb8f25fbcba0a", null ],
+ [ "ACCOUNT_OK", "boot_8php.html#a84057c5bfa1bca5fba8497fe005ee4d8", null ],
+ [ "ACCOUNT_PENDING", "boot_8php.html#a032bbd6d0321e99e9117332c9ed2b1b8", null ],
+ [ "ACCOUNT_REMOVED", "boot_8php.html#ab5ddbe69d3d03acd06e1fb281488cb78", null ],
+ [ "ACCOUNT_ROLE_ADMIN", "boot_8php.html#ac8400313df2c831653f9036f71ebd86d", null ],
+ [ "ACCOUNT_ROLE_ALLOWCODE", "boot_8php.html#a84f48897059bbd4a8738d7ee4cec6688", null ],
+ [ "ACCOUNT_ROLE_SYSTEM", "boot_8php.html#a7c2eb822d50e1554bf5c32861f36342b", null ],
+ [ "ACCOUNT_UNVERIFIED", "boot_8php.html#af3a4271630aabd8be592213f925d6a36", null ],
+ [ "ACTIVITY_DISLIKE", "boot_8php.html#a0e57f846e6d47a308feced0f7274f178", null ],
+ [ "ACTIVITY_FAVORITE", "boot_8php.html#a3e2ea123d29a72012db1241f96280b0e", null ],
+ [ "ACTIVITY_FOLLOW", "boot_8php.html#a5ae728ac966ea1d3525a19e7fec59434", null ],
+ [ "ACTIVITY_FRIEND", "boot_8php.html#a176664e78dcb9132e16be69418223eb2", null ],
+ [ "ACTIVITY_JOIN", "boot_8php.html#aced60c7285192e80b7c4757e45a7f1e3", null ],
+ [ "ACTIVITY_LIKE", "boot_8php.html#abdcdfc873ace4e0902177bad934de0c0", null ],
+ [ "ACTIVITY_MOOD", "boot_8php.html#a7aa57438db03834aaa0b468bdce773a6", null ],
+ [ "ACTIVITY_OBJ_ALBUM", "boot_8php.html#aaf9b76832ee5f85e56466af162ba8a14", null ],
+ [ "ACTIVITY_OBJ_COMMENT", "boot_8php.html#a0a98dd0110dc6c8e24cefc8ae74d5562", null ],
+ [ "ACTIVITY_OBJ_EVENT", "boot_8php.html#a2e90096fede6acce16abf0da8cb2febe", null ],
+ [ "ACTIVITY_OBJ_GROUP", "boot_8php.html#a7bff2278e68a71e524afd1c7c951e1e3", null ],
+ [ "ACTIVITY_OBJ_HEART", "boot_8php.html#ad302cb26b838898d475f57f61b0fcc9f", null ],
+ [ "ACTIVITY_OBJ_NOTE", "boot_8php.html#a44d069c8a1cfcc6d2007c506a17ff28f", null ],
+ [ "ACTIVITY_OBJ_P_PHOTO", "boot_8php.html#a74bf27f7564c9a37975e7b37d973dcab", null ],
+ [ "ACTIVITY_OBJ_PERSON", "boot_8php.html#a2f8f25b13480c37a5f22511f53da8bab", null ],
+ [ "ACTIVITY_OBJ_PHOTO", "boot_8php.html#a774f0f792ebfec1e774c5a17bb9d5966", null ],
+ [ "ACTIVITY_OBJ_PROFILE", "boot_8php.html#a62c832a95e38b1fa23e6cef39521b7d5", null ],
+ [ "ACTIVITY_OBJ_TAGTERM", "boot_8php.html#a1da180f961f49a11573cac4ff6c62c05", null ],
+ [ "ACTIVITY_OBJ_THING", "boot_8php.html#a0fb63e51c2a9814941842ae8f2f4dff8", null ],
+ [ "ACTIVITY_POKE", "boot_8php.html#a14ba8f9e162f2559831ee3bf98e0c3bd", null ],
+ [ "ACTIVITY_POST", "boot_8php.html#a5c3747e0f505f0d5271dc4c54e3feaf4", null ],
+ [ "ACTIVITY_REQ_FRIEND", "boot_8php.html#afe084c30a1810c10442edb4fbcbc0086", null ],
+ [ "ACTIVITY_TAG", "boot_8php.html#a12c781cefc20167231e2e3fd5866b1b5", null ],
+ [ "ACTIVITY_UNFOLLOW", "boot_8php.html#a53e4bdb6f225da55115acb9277f75e53", null ],
+ [ "ACTIVITY_UNFRIEND", "boot_8php.html#a29528a2544373cc19a378f350040c6a1", null ],
+ [ "ACTIVITY_UPDATE", "boot_8php.html#a7f4264232dbb6c3b41f2617deecb1866", null ],
+ [ "ATOM_TIME", "boot_8php.html#ad34c1547020a305915bcc39707744690", null ],
+ [ "ATTACH_FLAG_DIR", "boot_8php.html#aa74438cf71e48e37bf7b440b94243985", null ],
+ [ "ATTACH_FLAG_OS", "boot_8php.html#a781916f83fcc8ff1035649afa45f0292", null ],
+ [ "CLIENT_MODE_LOAD", "boot_8php.html#af6f6f6f40139f12fc09ec47373b30919", null ],
+ [ "CLIENT_MODE_NORMAL", "boot_8php.html#a43c6c7d84d880e9500bd4f8f8ecc5731", null ],
+ [ "CLIENT_MODE_UPDATE", "boot_8php.html#a3f40aa5bafff8c4eebdc62e5121daf77", null ],
+ [ "CONTACT_IS_FOLLOWER", "boot_8php.html#ada72d88ae39a7e3b45baea201cb49a29", null ],
+ [ "CONTACT_IS_FRIEND", "boot_8php.html#a27299ecfb9e9a99826f17a1c14c6995f", null ],
+ [ "CONTACT_IS_SHARING", "boot_8php.html#a6c5e9e293c8242dcb9bc2c3ea2fee2c9", null ],
+ [ "DB_UPDATE_VERSION", "boot_8php.html#ac59a18a4838710d6c2de37aed6b21f03", null ],
+ [ "DEFAULT_DB_ENGINE", "boot_8php.html#aa8a2b61e70900139d1ca28e46f1da49d", null ],
+ [ "DIRECTORY_FALLBACK_MASTER", "boot_8php.html#abedd940e664017c61b48c6efa31d0cb8", null ],
+ [ "DIRECTORY_MODE_NORMAL", "boot_8php.html#ab7d65a7e7417825a4db62906bb600729", null ],
+ [ "DIRECTORY_MODE_PRIMARY", "boot_8php.html#a8a60cc38bb567765fd926fef70205f16", null ],
+ [ "DIRECTORY_MODE_SECONDARY", "boot_8php.html#aedfb9501ed408278667995524e0d15cf", null ],
+ [ "DIRECTORY_MODE_STANDALONE", "boot_8php.html#a25476eec71fceda237f7dc1d78b0adb8", null ],
+ [ "DIRECTORY_REALM", "boot_8php.html#a6b9909db6a7ec80ec6fdd40ba74014dd", null ],
+ [ "EOL", "boot_8php.html#a0603d6ece8c5d37b4b7db697db053a4b", null ],
+ [ "GRAVITY_COMMENT", "boot_8php.html#a4a12ce5de39789b0361e308d89925a20", null ],
+ [ "GRAVITY_LIKE", "boot_8php.html#a1f5906598e90b5ea2b4245f682be4348", null ],
+ [ "GRAVITY_PARENT", "boot_8php.html#a2af173e4e9836ee7c90757b4793a2be3", null ],
+ [ "HUBLOC_FLAGS_DELETED", "boot_8php.html#a7c286add8961fd2d79216314cd4aadd8", null ],
+ [ "HUBLOC_FLAGS_PRIMARY", "boot_8php.html#a3ad9cc5d4354be741fa1de12b96e9955", null ],
+ [ "HUBLOC_FLAGS_UNVERIFIED", "boot_8php.html#ab54b24cc302e1a42a67a49d788b6b764", null ],
+ [ "HUBLOC_NOTUSED", "boot_8php.html#aa589421267f0c2f0d643f727792cce35", null ],
+ [ "HUBLOC_OFFLINE", "boot_8php.html#a845891f82bf6edd7fa2d578b66703112", null ],
+ [ "HUBLOC_RECEIVE_ERROR", "boot_8php.html#abeb4d86e17cefa8584f1244e2183b0e1", null ],
+ [ "HUBLOC_SEND_ERROR", "boot_8php.html#a3b56bfc6a0dd159070e316ddac3b7456", null ],
+ [ "HUBLOC_WORKS", "boot_8php.html#a7a8ba64d089cc0412c59a2eefc6d655c", null ],
+ [ "ITEM_BLOCKED", "boot_8php.html#ab28dc518fa90b6f617dd8c564eb4f35f", null ],
+ [ "ITEM_BUG", "boot_8php.html#a87b0f279f8413c7e4d805c5d85f20d34", null ],
+ [ "ITEM_BUILDBLOCK", "boot_8php.html#a7fc4b291a7cdaa48b38e27344ea183cf", null ],
+ [ "ITEM_DELAYED_PUBLISH", "boot_8php.html#ac890557fedc5b5a3b1d996249b1e1a20", null ],
+ [ "ITEM_DELETED", "boot_8php.html#a3515ea6bf77495de89b93e9ccd881c49", null ],
+ [ "ITEM_HIDDEN", "boot_8php.html#ac99fc4d040764eac1736bec6973556fe", null ],
+ [ "ITEM_MENTIONSME", "boot_8php.html#a8da836617174eed9fc2ac8054125354b", null ],
+ [ "ITEM_MODERATED", "boot_8php.html#ac01230c7655e0705b2e99c9bc03c4450", null ],
+ [ "ITEM_NOCOMMENT", "boot_8php.html#a949116d9a295b214293006c060ca4848", null ],
+ [ "ITEM_NOTSHOWN", "boot_8php.html#a8663f32171568489dbb2a01dd00371f8", null ],
+ [ "ITEM_NSFW", "boot_8php.html#a939de9a99278f4fd7dcd0ee67f243f08", null ],
+ [ "ITEM_OBSCURED", "boot_8php.html#a2c8906f1af94a3559a5b4661067bb79d", null ],
+ [ "ITEM_ORIGIN", "boot_8php.html#a8c9dce0ef27b35397e29298eb966f7f7", null ],
+ [ "ITEM_PDL", "boot_8php.html#a6e57d913634d033b4d5ad72d99fd3e9d", null ],
+ [ "ITEM_RELAY", "boot_8php.html#a2958a2bd5422b85329d7c36c06dbc221", null ],
+ [ "ITEM_SPAM", "boot_8php.html#a40d885b2cfd736aab4234ae641ca4dfb", null ],
+ [ "ITEM_STARRED", "boot_8php.html#a7af107fab8d62b9a73801713b774ed30", null ],
+ [ "ITEM_THREAD_TOP", "boot_8php.html#a749144d8dd9c1366596a0213c277d050", null ],
+ [ "ITEM_UNPUBLISHED", "boot_8php.html#adaeb4f590c56326b2dca3b19f31b6272", null ],
+ [ "ITEM_UNSEEN", "boot_8php.html#a009e6a0637cb65804ea8094ecc4450b0", null ],
+ [ "ITEM_UPLINK", "boot_8php.html#aefba06f1c0842036329033e7567ecf6d", null ],
+ [ "ITEM_UPLINK_PRV", "boot_8php.html#aad33b494084f729b6ee3b0bc457718a1", null ],
+ [ "ITEM_VERIFIED", "boot_8php.html#a18a400fa45e5632811b33041d8c048bf", null ],
+ [ "ITEM_VISIBLE", "boot_8php.html#ab55b16ae7fc19fafe5afaedd49163bbf", null ],
+ [ "ITEM_WALL", "boot_8php.html#a6788e99021ec8ffb0fa94d651f22a322", null ],
+ [ "ITEM_WEBPAGE", "boot_8php.html#af489d0c3166551b93e63a79ff2c9be35", null ],
+ [ "JPEG_QUALITY", "boot_8php.html#a3475ff6c2e575f946ea0ee377e944173", null ],
+ [ "LANGUAGE_DETECT_MIN_CONFIDENCE", "boot_8php.html#a68d1d5bc9c7ccb663dc671b48c66df11", null ],
+ [ "LANGUAGE_DETECT_MIN_LENGTH", "boot_8php.html#a17cf72338b040891781a4bcbdd9a8595", null ],
+ [ "LOGGER_ALL", "boot_8php.html#afe63ae69ba55299f813766e54df06ede", null ],
+ [ "LOGGER_DATA", "boot_8php.html#a6969947145a139ec374ce098224d8e81", null ],
+ [ "LOGGER_DEBUG", "boot_8php.html#a93823d15ae07548a4c49de88d325cd26", null ],
+ [ "LOGGER_NORMAL", "boot_8php.html#a17b4ea23d9ecf628d9c8f53b7abcb805", null ],
+ [ "LOGGER_TRACE", "boot_8php.html#a022cea669f9f13ef7c6268b63884c57f", null ],
+ [ "MAIL_DELETED", "boot_8php.html#ad0876e837cf3fad8a26417e315f6e2c8", null ],
+ [ "MAIL_ISREPLY", "boot_8php.html#aa544a6c078130d0967a1f4ed8ce0a2d2", null ],
+ [ "MAIL_OBSCURED", "boot_8php.html#a44ae1542a805ffd7f826fb511db07374", null ],
+ [ "MAIL_RECALLED", "boot_8php.html#ae4861de36017fe399c1839f778bad9f5", null ],
+ [ "MAIL_REPLIED", "boot_8php.html#aa3679df31c8dad1b71816b0322d5baff", null ],
+ [ "MAIL_SEEN", "boot_8php.html#a1fbb93cf030f07391f22cc2948744869", null ],
+ [ "MAX_IMAGE_LENGTH", "boot_8php.html#a525ca93ff35d3535d1a2b8ba57876afa", null ],
+ [ "MAX_LIKERS", "boot_8php.html#a35625dacd2158b9f1f1a8e77f9f081fd", null ],
+ [ "MENU_ITEM_NEWWIN", "boot_8php.html#ad11f30a6590d3d77f0c5e1e3909af8f5", null ],
+ [ "MENU_ITEM_ZID", "boot_8php.html#aed0dfb35f7dd00dc9e4f868ea7f7ff53", null ],
+ [ "NAMESPACE_ACTIVITY", "boot_8php.html#a5df5359090d1f8e898c36d7cf8878ad2", null ],
+ [ "NAMESPACE_ACTIVITY_SCHEMA", "boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133", null ],
+ [ "NAMESPACE_ATOM1", "boot_8php.html#a444ce608ce34efb82ee11852f36e825f", null ],
+ [ "NAMESPACE_DFRN", "boot_8php.html#a7ed4581ab66ebcde97f6b3730856b028", null ],
+ [ "NAMESPACE_FEED", "boot_8php.html#ac195fc9003298923ea81f144388e24b1", null ],
+ [ "NAMESPACE_GEORSS", "boot_8php.html#a03d19251c245587de7ed959300b87bdf", null ],
+ [ "NAMESPACE_MEDIA", "boot_8php.html#a6626f383c3d2d459f731ab8b4f237d16", null ],
+ [ "NAMESPACE_OSTATUS", "boot_8php.html#acca19aae62e1a6951a856b945de20d67", null ],
+ [ "NAMESPACE_OSTATUSSUB", "boot_8php.html#a181c111f4b6c14d091dfd3bf0d0a22cd", null ],
+ [ "NAMESPACE_POCO", "boot_8php.html#a0b73e2548d6f9beb9c93211f488e336a", null ],
+ [ "NAMESPACE_SALMON_ME", "boot_8php.html#aee324eca9de4e0fedf01ab5f92e27c67", null ],
+ [ "NAMESPACE_STATUSNET", "boot_8php.html#afaf93b7026f784b113b4f8921745891e", null ],
+ [ "NAMESPACE_THREAD", "boot_8php.html#a1d6e7f4c08bb68e4a424326a811bdd86", null ],
+ [ "NAMESPACE_TOMB", "boot_8php.html#a4bfe22e163657690dfb6d5b1d04cb47e", null ],
+ [ "NAMESPACE_ZOT", "boot_8php.html#a49f2a70b3b43aa904223a8d19e986a47", null ],
+ [ "NETWORK_DFRN", "boot_8php.html#ae3cef7b63e25e7bafea3fcf6b99fad0e", null ],
+ [ "NETWORK_DIASPORA", "boot_8php.html#a38f6c7fe33b5434a24b4314567753dfa", null ],
+ [ "NETWORK_FACEBOOK", "boot_8php.html#af3905ea8f8568d0236db13fca40514e3", null ],
+ [ "NETWORK_FEED", "boot_8php.html#ab4bddb41a0cf407178ec5278b950c393", null ],
+ [ "NETWORK_GPLUS", "boot_8php.html#a8905fde0a5b7882bdc083b20d9b34701", null ],
+ [ "NETWORK_LINKEDIN", "boot_8php.html#a5b043b7fdcfd4e8c9c3747574afc6caa", null ],
+ [ "NETWORK_MAIL", "boot_8php.html#a7236b2cdcf59f02a42302e893a99013b", null ],
+ [ "NETWORK_MAIL2", "boot_8php.html#aa17a4f9c63f5cbc5c06f1066b6aebc42", null ],
+ [ "NETWORK_MYSPACE", "boot_8php.html#ae94f7c7c0909629a75aed1c41f10bc95", null ],
+ [ "NETWORK_OSTATUS", "boot_8php.html#aef4b6c558c68c88c10f13c5a00c20e3d", null ],
+ [ "NETWORK_PHANTOM", "boot_8php.html#ab21fb0f3e6b962419955c6fc7f26734f", null ],
+ [ "NETWORK_XMPP", "boot_8php.html#a43296b1b4398aacbf92a4b2d56bab91e", null ],
+ [ "NETWORK_ZOT", "boot_8php.html#a2c65e925994566a63e6c03c381f1b4a0", null ],
+ [ "NOTIFY_COMMENT", "boot_8php.html#a20f0eed431d25870b624b8937a07a59f", null ],
+ [ "NOTIFY_CONFIRM", "boot_8php.html#af8c0cb0744c9a6b5d6d3baafb1f1e71d", null ],
+ [ "NOTIFY_INTRO", "boot_8php.html#a56fd673eaa7014150297ce1162502db5", null ],
+ [ "NOTIFY_MAIL", "boot_8php.html#a285732e7889fa7f333cbe431111e1029", null ],
+ [ "NOTIFY_POKE", "boot_8php.html#aca08bc4f1554ba877500f6abcc99e1e8", null ],
+ [ "NOTIFY_PROFILE", "boot_8php.html#a981d46380f9f23c308bac1f9cb00dc5b", null ],
+ [ "NOTIFY_SUGGEST", "boot_8php.html#a9d01ef178b72b145016cca1393415bc4", null ],
+ [ "NOTIFY_SYSTEM", "boot_8php.html#a14d44d4a00223dc3db4ea962325db192", null ],
+ [ "NOTIFY_TAGSELF", "boot_8php.html#ab724491497ab2618b23a01d5da60aec0", null ],
+ [ "NOTIFY_TAGSHARE", "boot_8php.html#af6937db5f581d006bf4a5c3d9c7e0461", null ],
+ [ "NOTIFY_WALL", "boot_8php.html#a505410c7edc5f5bb5fa227b98359793e", null ],
+ [ "PAGE_ADULT", "boot_8php.html#ace83842dbeb84f7ed9ac59a9f57a7c32", null ],
+ [ "PAGE_APPLICATION", "boot_8php.html#a8231d115060d41a9c2a677f2c86f10ed", null ],
+ [ "PAGE_AUTOCONNECT", "boot_8php.html#aa275653b9c87abc7391bb8040c1c2de9", null ],
+ [ "PAGE_DIRECTORY_CHANNEL", "boot_8php.html#a5b8484922918946d041e5e0515dbe718", null ],
+ [ "PAGE_HIDDEN", "boot_8php.html#a5e322a2a2d0f51924c0b2e874988e640", null ],
+ [ "PAGE_NORMAL", "boot_8php.html#a09532c3f750ae8c4527e63b2b790cbf3", null ],
+ [ "PAGE_PREMIUM", "boot_8php.html#ab3920c2f3cd64802c0b7ff625c3b2ea8", null ],
+ [ "PAGE_REMOVED", "boot_8php.html#a4edce16cb7f21cdafa1e85bf63d713e6", null ],
+ [ "PAGE_SYSTEM", "boot_8php.html#a6ee7a72d558d1851bbb9e3cdde377932", null ],
+ [ "PERMS_A_DELEGATE", "boot_8php.html#a423505ab8dbd8e39d04ae3fe1374102b", null ],
+ [ "PERMS_A_REPUBLISH", "boot_8php.html#aae6c941bde5fd6fce07e51dba7326ead", null ],
+ [ "PERMS_CONTACTS", "boot_8php.html#ab2d0e8a9b81ee548ef2ce8e4560da2f6", null ],
+ [ "PERMS_NETWORK", "boot_8php.html#a6df1102664f64b274810db85197c2755", null ],
+ [ "PERMS_PUBLIC", "boot_8php.html#aff210e8403dd72368522b17fb6e5d4e7", null ],
+ [ "PERMS_R_ABOOK", "boot_8php.html#a3d6d4fc5fafcc9156811669158541caf", null ],
+ [ "PERMS_R_PAGES", "boot_8php.html#ab51965fabe54dc031e9a0ce1142ee83e", null ],
+ [ "PERMS_R_PHOTOS", "boot_8php.html#a29e921c0c72412cc738e44cca6ca1f62", null ],
+ [ "PERMS_R_PROFILE", "boot_8php.html#ad789aef3cb95fc1eb36be7c4283d0137", null ],
+ [ "PERMS_R_STORAGE", "boot_8php.html#a1db4f0009c9cb4e107eab0f914a3c8dc", null ],
+ [ "PERMS_R_STREAM", "boot_8php.html#aec36f8fcd4cb14a52934590b3d6666b4", null ],
+ [ "PERMS_SITE", "boot_8php.html#a9ff652e5cb83cd11cbb0350844e7b28f", null ],
+ [ "PERMS_SPECIFIC", "boot_8php.html#a9cc986b4f9dd6558cbb2e25aadbfd964", null ],
+ [ "PERMS_W_CHAT", "boot_8php.html#acd877c405b06b348b37b6f7e62a211e9", null ],
+ [ "PERMS_W_COMMENT", "boot_8php.html#a32df13fec0e43281da5979e1f5579aa8", null ],
+ [ "PERMS_W_MAIL", "boot_8php.html#a6b31dd451bc6c37fe7c9c766ff385aaf", null ],
+ [ "PERMS_W_PAGES", "boot_8php.html#aa9244fc9cc221980c07a20cc534111be", null ],
+ [ "PERMS_W_PHOTOS", "boot_8php.html#a57eee7352714c004d36c26dda74af73e", null ],
+ [ "PERMS_W_STORAGE", "boot_8php.html#a4fefd7486d3b888a05cfd3dc9575f115", null ],
+ [ "PERMS_W_STREAM", "boot_8php.html#a8bb0395933b5e886f086f6a2fb0bfa55", null ],
+ [ "PERMS_W_TAGWALL", "boot_8php.html#a99a4a17cb644e7e6826ea07ecaf09777", null ],
+ [ "PERMS_W_WALL", "boot_8php.html#a6b14a31a8aa9f3452a13383f413bffa2", null ],
+ [ "PHOTO_NORMAL", "boot_8php.html#a4a49b29838ef2c45ab3556b52baec6a4", null ],
+ [ "PHOTO_PROFILE", "boot_8php.html#ab4bc9c50ecc927b92d519e36562b0df0", null ],
+ [ "PHOTO_THING", "boot_8php.html#a78849a1bf8ce8d9804b4cbb502e8f383", null ],
+ [ "PHOTO_XCHAN", "boot_8php.html#ac43182e0d8bae7576a30b603774974f8", null ],
+ [ "PNG_QUALITY", "boot_8php.html#a8df201788c9dd0ca91384e3a14c08bce", null ],
+ [ "POLL_MULTIPLE_CHOICE", "boot_8php.html#abbf5ac24eb8aeedb862f618ee0d21e86", null ],
+ [ "POLL_OVERWRITE", "boot_8php.html#a2b525996e4426bdddbcec277778bde08", null ],
+ [ "POLL_SIMPLE_RATING", "boot_8php.html#ad88a70ec62e08d590123d3697dfe64d5", null ],
+ [ "POLL_TENSCALE", "boot_8php.html#a1ba00027b718db732f30fc0e2c3e0abc", null ],
+ [ "RED_PLATFORM", "boot_8php.html#a96ad56755a21e1361dbd7bf93c9e7ff4", null ],
+ [ "RED_VERSION", "boot_8php.html#a21cc29e0025943e7c28ff58cb4856ac3", null ],
+ [ "REGISTER_APPROVE", "boot_8php.html#a7176c0f9f1c98421b97735d892cf6252", null ],
+ [ "REGISTER_CLOSED", "boot_8php.html#a69aac276ed82e010dc382b16ab4d59e1", null ],
+ [ "REGISTER_OPEN", "boot_8php.html#ad8887b49bbb02dd30b4eb9f6c7773c63", null ],
+ [ "SSL_POLICY_FULL", "boot_8php.html#a02566ac9d891369a1d3ebb81a15722fc", null ],
+ [ "SSL_POLICY_NONE", "boot_8php.html#af86c651547aa8f9e549ee40a09455549", null ],
+ [ "SSL_POLICY_SELFSIGN", "boot_8php.html#adca48aee78465ae3064ca4432c0d87b5", null ],
+ [ "STORAGE_DEFAULT_PERMISSIONS", "boot_8php.html#aecaa1b6945b317ba8f1daf4af2aed8e6", null ],
+ [ "TERM_CATEGORY", "boot_8php.html#af33d1b2e98a1e21af672005525d46dfe", null ],
+ [ "TERM_FILE", "boot_8php.html#afb97615e985a013799839b68b99018d7", null ],
+ [ "TERM_HASHTAG", "boot_8php.html#a2750985ec445617d7e82ae3098c91e3f", null ],
+ [ "TERM_MENTION", "boot_8php.html#ae37444eaa42705185080ccf3e670cbc2", null ],
+ [ "TERM_OBJ_CHANNEL", "boot_8php.html#a8892374789fd261eb32a7969d934a14a", null ],
+ [ "TERM_OBJ_OBJECT", "boot_8php.html#a882b666adfe21f035a0f8c02806066d6", null ],
+ [ "TERM_OBJ_PHOTO", "boot_8php.html#a64617d4655804de2a3c86501ab4fdbfd", null ],
+ [ "TERM_OBJ_POST", "boot_8php.html#a9eeb8989272d5ff804a616898bb13659", null ],
+ [ "TERM_OBJ_PROFILE", "boot_8php.html#aead84fa27d7516b855220fe004964a45", null ],
+ [ "TERM_OBJ_THING", "boot_8php.html#a0cc8dc76bd10ac0ec81bac08a46f82fe", null ],
+ [ "TERM_PCATEGORY", "boot_8php.html#a45b12aefab9675baffc7a07a09486db8", null ],
+ [ "TERM_SAVEDSEARCH", "boot_8php.html#abd7bb40da9cc073297e49736b338ca07", null ],
+ [ "TERM_THING", "boot_8php.html#a0d877df1e20bae765e1708be50f6b503", null ],
+ [ "TERM_UNKNOWN", "boot_8php.html#a0c59dde058efebbc66520d136cbd1631", null ],
+ [ "UPDATE_FAILED", "boot_8php.html#a75fc600186b13c3b25e661afefb5eac8", null ],
+ [ "UPDATE_FLAGS_DELETED", "boot_8php.html#aea392cb26ed617f3a8cde648385b5df0", null ],
+ [ "UPDATE_FLAGS_UPDATED", "boot_8php.html#a9690d73434125ce594a1f5e7c2a4f7c0", null ],
+ [ "UPDATE_SUCCESS", "boot_8php.html#ac86615ddc0763a00f5311c90e991730c", null ],
+ [ "XCHAN_FLAGS_CENSORED", "boot_8php.html#accd6f36cc9f40225cbd720e4d12a7c6e", null ],
+ [ "XCHAN_FLAGS_DELETED", "boot_8php.html#a9ea1290e00c6d40684892047f2c778a9", null ],
+ [ "XCHAN_FLAGS_HIDDEN", "boot_8php.html#a1af3ed96de14aa0d7891b39cc75b60f2", null ],
+ [ "XCHAN_FLAGS_NORMAL", "boot_8php.html#a8fdcc4ffb365a3267bd02ce8a8d466d6", null ],
+ [ "XCHAN_FLAGS_ORPHAN", "boot_8php.html#a1c923b99bf77e4203ae94e5684b6ad0f", null ],
+ [ "XCHAN_FLAGS_SELFCENSORED", "boot_8php.html#a5a681a672e007cdc22b43345d71f07c6", null ],
+ [ "XCHAN_FLAGS_SYSTEM", "boot_8php.html#afef254290febac854c85fc698d9483a6", null ],
+ [ "ZCURL_TIMEOUT", "boot_8php.html#a3cd42a70c6b3999590e4fd7a1a9096af", null ],
+ [ "ZOT_REVISION", "boot_8php.html#a36b31575f992a10b5927b76efba9362e", null ]
+]; \ No newline at end of file
diff --git a/doc/html/cache_8php.html b/doc/html/cache_8php.html
new file mode 100644
index 000000000..b7cbd6a1f
--- /dev/null
+++ b/doc/html/cache_8php.html
@@ -0,0 +1,120 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/cache.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('cache_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Classes</a> </div>
+ <div class="headertitle">
+<div class="title">cache.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCache.html">Cache</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/chanman_8php.html b/doc/html/chanman_8php.html
new file mode 100644
index 000000000..4d829d819
--- /dev/null
+++ b/doc/html/chanman_8php.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/chanman.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rhash-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('chanman_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">chanman.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/channel_8php.html b/doc/html/channel_8php.html
new file mode 100644
index 000000000..61550f610
--- /dev/null
+++ b/doc/html/channel_8php.html
@@ -0,0 +1,174 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/channel.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('channel_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">channel.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ac7c8c7845741baadf87fae6bc279f3dc"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="channel_8php.html#ac7c8c7845741baadf87fae6bc279f3dc">channel_init</a> (&amp;$a)</td></tr>
+<tr class="separator:ac7c8c7845741baadf87fae6bc279f3dc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9c6a6179e0e626398ebecc6151905ef1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content</a> (&amp;$a, $update=0, $load=false)</td></tr>
+<tr class="separator:a9c6a6179e0e626398ebecc6151905ef1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a9c6a6179e0e626398ebecc6151905ef1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">channel_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$update</em> = <code>0</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$load</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Get permissions SQL - if $remote_contact is true, our remote user has been pre-verified and we already have fetched his/her groups</p>
+
+<p>Referenced by <a class="el" href="update__channel_8php.html#aca52a9da500f0db2f0a8666af5bc06ba">update_channel_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ac7c8c7845741baadf87fae6bc279f3dc"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">channel_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/channel_8php.js b/doc/html/channel_8php.js
new file mode 100644
index 000000000..b76a435de
--- /dev/null
+++ b/doc/html/channel_8php.js
@@ -0,0 +1,5 @@
+var channel_8php =
+[
+ [ "channel_content", "channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1", null ],
+ [ "channel_init", "channel_8php.html#ac7c8c7845741baadf87fae6bc279f3dc", null ]
+]; \ No newline at end of file
diff --git a/doc/html/chanview_8php.html b/doc/html/chanview_8php.html
new file mode 100644
index 000000000..362affb17
--- /dev/null
+++ b/doc/html/chanview_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/chanview.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('chanview_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">chanview.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a4192c6da888c8c1165851acf9ad4cb8b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="chanview_8php.html#a4192c6da888c8c1165851acf9ad4cb8b">chanview_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a4192c6da888c8c1165851acf9ad4cb8b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a4192c6da888c8c1165851acf9ad4cb8b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">chanview_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/chanview_8php.js b/doc/html/chanview_8php.js
new file mode 100644
index 000000000..cbf2b353b
--- /dev/null
+++ b/doc/html/chanview_8php.js
@@ -0,0 +1,4 @@
+var chanview_8php =
+[
+ [ "chanview_content", "chanview_8php.html#a4192c6da888c8c1165851acf9ad4cb8b", null ]
+]; \ No newline at end of file
diff --git a/doc/html/classApp-members.html b/doc/html/classApp-members.html
new file mode 100644
index 000000000..4661adc60
--- /dev/null
+++ b/doc/html/classApp-members.html
@@ -0,0 +1,208 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classApp.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">App Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classApp.html">App</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#a14bd4b1c29f3aff371fe5d4cb11aeea3">$account</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#a230e975296cf164da2fee35ef720964f">$apps</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#af58db526040829b1c8bd95561b329262">$argc</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#ab3da757abe5cb45bf88f07cc51a73b58">$argv</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#ad5175536561021548ae8188e24c7b80c">$baseurl</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#abe0e4fa91097f7a6588e1213a834121c">$cached_profile_image</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#aab4a685d15a363bb1d7edbbc20bfb94e">$cached_profile_picdate</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#a5cfc098c061b7d765add58fd2ca97445">$category</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#a050b0696118da47e8b30859ad1a2c149">$channel</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#ad1c8eb91a6fd470b94f34b7fdad3a2d0">$cid</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#a495ec082c2719314e536070ca1ce073d">$cmd</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#ac73dc90e4764497e2f1b7e6612c8fb88">$config</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#a98ef4cfd36693a3457c879b76bc6d694">$contact</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#a61ca6e3af82071ea25ff2fd5dbcddae2">$contacts</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#ac1d80a14492acc932715d54567d8a589">$content</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#a6f55d087e1ff4710132c1b0863faa2ee">$css_sources</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#a256360c9184fed6d7556e0bc0a835d7f">$curl_code</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#af5007c42a693afd9c4899c243b2e1363">$curl_headers</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#a0ce85be198e46570366cb3344f3c55b8">$data</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#a330410a288f3393d53772f5e98f857ea">$db</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#ac1a8b2cd40609b231a560201a08852ba">$error</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#ae3f47830543d0d902f66913def8db66b">$force_max_items</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#ac6e6b1c7d6df408580ff79977fcfa656">$groups</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#a3694aa1907aa103a2adbc71f926f0fa0">$hooks</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#a037049cba88dfc6ff94f4b5b779e3fd3">$hostname</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#a7954862f44f606b0ff83d4c74d15e792">$identities</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#a4c7cfc62d39508086cf300dc2e39c4df">$interactive</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#a11e24b3ed9b33ffee7dd41d110b4366d">$js_sources</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#a1a297e70b3667b83f4460aa7ed9f5d6f">$language</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#a58ac598544892ff7c32890291b72635e">$layout</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#a59dd4b665c70e7dbd80682c014ff7145">$ldelim</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#a9bf62f8e39585c0aa48fcffc3bf3484d">$module</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#a6e4f0fbfa3cf6c11baebe22a03db6165">$module_loaded</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#a33a8e90b60ec4438f6fbf299d0f6839c">$nav_sel</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#a4ffe529fb14389f7fedf5fdc5f722e7f">$observer</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#a4b67935096f66d1f14b657399a8461ac">$page</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#a6bcb19cdc4907077da72864686d5a780">$pager</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#acad5896b7a79ae31433ad8f89606c728">$path</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#ab47de68fa39806d1fb0976407e188b77">$perms</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#ae9f96338f32187d308b67b980eea0008">$plugins</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#a1936f2afce0dc0d1bbed15ae1f2ee81a">$poi</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#a57d041fcc003d08c127dfa99a02bc192">$profile</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#a08c24d6a6fc52fcc784b0f765f13b820">$profile_uid</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#a2e82da4aecfc2017a8d1d332ca501f9f">$query_string</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#a244b2d53b21be269aad2269d23192f95">$rdelim</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#ad082d63acc078e5bf23825a03bdd6a76">$scheme</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#a13710907ef62554a0b4dd8a5eaa2eb11">$sourcename</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#a5f64620473a9727a48ebe9cf6f335a98">$strings</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#a6844aedad10e201b8c3d80cfc9e876d3">$template_engine_instance</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#a6859a4848a5c0049b4134cc4b34228b6">$template_engines</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#a764cc6cd7578132c21d2b4545de9301c">$theme</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#aeca29fd4f7192ca07369b3c598c36e67">$theme_info</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#a487332f8de40414ca1a54a4265570b70">$theme_thread_allow</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#ab35b01a366a2ea95725e97af278f87ab">$timezone</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#a91fd3c8b89016113b05f3be24805ccff">$user</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#a56b1a432c96aef8b1971f779c9d93c8c">$videoheight</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#adf2aaf95b062736a6fd5fc70fadf80e8">$videowidth</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#a4833bee2eae4ad1691a04fa19e11a766">$widgetlist</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#aa5a87c46ab3fee21362c466bf78042ef">$widgets</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#af6d39f63fb7116bbeb04e51696f99474">__construct</a>()</td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#a08f0537964d98958d218066364cff785">build_pagehead</a>()</td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#a08bc87aff64f39fbc084e9d6545cee4d">get_account</a>()</td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#a5c63eabdc7fdd8b6e3348980ec16a3ad">get_apps</a>()</td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#a604d659d6977a99de42a160343e5289a">get_baseurl</a>($ssl=false)</td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#a084e03c77686d8c13390fef3f7428a2b">get_channel</a>()</td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#a4659785d13e4bac0bed50dbb1b0d4299">get_groups</a>()</td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#a622eace13f8fc9f4b5672a68e2bc4396">get_hostname</a>()</td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#a1ad3bb1b68439b3b7cbe630918e618d2">get_observer</a>()</td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#a5293a8543ba338dcf38cd4ff3bc5d4be">get_path</a>()</td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#adb5a4bb657881e553978ff390babd01f">get_perms</a>()</td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#acb27e607fe4c82603444676e25c36b70">get_template_engine</a>()</td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#a2eb832a8577dee7d40b93abdf6d1d35a">get_template_ldelim</a>($engine= 'smarty3')</td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#aab23c59172310fd30f2d60dc039d3eea">get_template_rdelim</a>($engine= 'smarty3')</td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#a871898becd0697d778f36d9336253ae8">get_widgets</a>($location= '')</td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#af17df107f2216ddf5ad2a7e0f2ba2166">head_get_icon</a>()</td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#a8863703a0305eaa45eb970dbd2046291">head_set_icon</a>($icon)</td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#abf46a653d8499e7c253cc1be894a6d83">register_template_engine</a>($class, $name= '')</td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#aeb1fe1c8ad9aa639909bd183ce578536">set_account</a>($acct)</td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#abea5a4f77dcd53c928dc4eed86616637">set_apps</a>($arr)</td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#a78788f6e9d8b713b138f81e457c5cd08">set_baseurl</a>($url)</td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#a89e9feb2bfb5253883a9720beaffe876">set_channel</a>($channel)</td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#a3d84af5e42082098672531cd1a618853">set_groups</a>($g)</td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#a344d2b7dc2f276648d521aee4da1731c">set_hostname</a>($h)</td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#a4776d9322edea17fae56afa5d01a323e">set_observer</a>($xchan)</td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#a4bdd7bfed62f50515fce652127bf481b">set_pager_itemspage</a>($n)</td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#a560189f048d3db2f526841963cc43e97">set_pager_total</a>($n)</td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#adb060d5c7f35a521ec7ec0effbe08097">set_path</a>($p)</td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#a557d7b779d8259027f4724ebf7b248dc">set_perms</a>($perms)</td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#a20d1890cc16b22ba79eeb0cbf2f719f7">set_template_engine</a>($engine= 'smarty3')</td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#a123b903dfe5d3488cc68db3471d36fd2">set_widget</a>($title, $html, $location= 'aside')</td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#a94a1ed2dc493c58612d17035b74ae736">template_engine</a>($name= '')</td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+</table></div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classApp.html b/doc/html/classApp.html
new file mode 100644
index 000000000..3c6d0655e
--- /dev/null
+++ b/doc/html/classApp.html
@@ -0,0 +1,1751 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: App Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classApp.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="#pub-attribs">Public Attributes</a> &#124;
+<a href="#pri-attribs">Private Attributes</a> &#124;
+<a href="classApp-members.html">List of all members</a> </div>
+ <div class="headertitle">
+<div class="title">App Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:af6d39f63fb7116bbeb04e51696f99474"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#af6d39f63fb7116bbeb04e51696f99474">__construct</a> ()</td></tr>
+<tr class="separator:af6d39f63fb7116bbeb04e51696f99474"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a604d659d6977a99de42a160343e5289a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a604d659d6977a99de42a160343e5289a">get_baseurl</a> ($ssl=false)</td></tr>
+<tr class="separator:a604d659d6977a99de42a160343e5289a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a78788f6e9d8b713b138f81e457c5cd08"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a78788f6e9d8b713b138f81e457c5cd08">set_baseurl</a> ($url)</td></tr>
+<tr class="separator:a78788f6e9d8b713b138f81e457c5cd08"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a622eace13f8fc9f4b5672a68e2bc4396"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a622eace13f8fc9f4b5672a68e2bc4396">get_hostname</a> ()</td></tr>
+<tr class="separator:a622eace13f8fc9f4b5672a68e2bc4396"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a344d2b7dc2f276648d521aee4da1731c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a344d2b7dc2f276648d521aee4da1731c">set_hostname</a> ($h)</td></tr>
+<tr class="separator:a344d2b7dc2f276648d521aee4da1731c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:adb060d5c7f35a521ec7ec0effbe08097"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#adb060d5c7f35a521ec7ec0effbe08097">set_path</a> ($p)</td></tr>
+<tr class="separator:adb060d5c7f35a521ec7ec0effbe08097"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5293a8543ba338dcf38cd4ff3bc5d4be"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a5293a8543ba338dcf38cd4ff3bc5d4be">get_path</a> ()</td></tr>
+<tr class="separator:a5293a8543ba338dcf38cd4ff3bc5d4be"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aeb1fe1c8ad9aa639909bd183ce578536"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#aeb1fe1c8ad9aa639909bd183ce578536">set_account</a> ($acct)</td></tr>
+<tr class="separator:aeb1fe1c8ad9aa639909bd183ce578536"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a08bc87aff64f39fbc084e9d6545cee4d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a08bc87aff64f39fbc084e9d6545cee4d">get_account</a> ()</td></tr>
+<tr class="separator:a08bc87aff64f39fbc084e9d6545cee4d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a89e9feb2bfb5253883a9720beaffe876"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a89e9feb2bfb5253883a9720beaffe876">set_channel</a> ($channel)</td></tr>
+<tr class="separator:a89e9feb2bfb5253883a9720beaffe876"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a084e03c77686d8c13390fef3f7428a2b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a084e03c77686d8c13390fef3f7428a2b">get_channel</a> ()</td></tr>
+<tr class="separator:a084e03c77686d8c13390fef3f7428a2b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4776d9322edea17fae56afa5d01a323e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a4776d9322edea17fae56afa5d01a323e">set_observer</a> ($xchan)</td></tr>
+<tr class="separator:a4776d9322edea17fae56afa5d01a323e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1ad3bb1b68439b3b7cbe630918e618d2"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a1ad3bb1b68439b3b7cbe630918e618d2">get_observer</a> ()</td></tr>
+<tr class="separator:a1ad3bb1b68439b3b7cbe630918e618d2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a557d7b779d8259027f4724ebf7b248dc"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a557d7b779d8259027f4724ebf7b248dc">set_perms</a> ($perms)</td></tr>
+<tr class="separator:a557d7b779d8259027f4724ebf7b248dc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:adb5a4bb657881e553978ff390babd01f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#adb5a4bb657881e553978ff390babd01f">get_perms</a> ()</td></tr>
+<tr class="separator:adb5a4bb657881e553978ff390babd01f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5c63eabdc7fdd8b6e3348980ec16a3ad"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a5c63eabdc7fdd8b6e3348980ec16a3ad">get_apps</a> ()</td></tr>
+<tr class="separator:a5c63eabdc7fdd8b6e3348980ec16a3ad"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abea5a4f77dcd53c928dc4eed86616637"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#abea5a4f77dcd53c928dc4eed86616637">set_apps</a> ($arr)</td></tr>
+<tr class="separator:abea5a4f77dcd53c928dc4eed86616637"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3d84af5e42082098672531cd1a618853"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a3d84af5e42082098672531cd1a618853">set_groups</a> ($g)</td></tr>
+<tr class="separator:a3d84af5e42082098672531cd1a618853"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4659785d13e4bac0bed50dbb1b0d4299"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a4659785d13e4bac0bed50dbb1b0d4299">get_groups</a> ()</td></tr>
+<tr class="separator:a4659785d13e4bac0bed50dbb1b0d4299"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a123b903dfe5d3488cc68db3471d36fd2"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a123b903dfe5d3488cc68db3471d36fd2">set_widget</a> ($title, $html, $location= 'aside')</td></tr>
+<tr class="separator:a123b903dfe5d3488cc68db3471d36fd2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a871898becd0697d778f36d9336253ae8"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a871898becd0697d778f36d9336253ae8">get_widgets</a> ($location= '')</td></tr>
+<tr class="separator:a871898becd0697d778f36d9336253ae8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a560189f048d3db2f526841963cc43e97"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a560189f048d3db2f526841963cc43e97">set_pager_total</a> ($<a class="el" href="php2po_8php.html#a1594a11499d06cc8a789ee7ca0c7a12b">n</a>)</td></tr>
+<tr class="separator:a560189f048d3db2f526841963cc43e97"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4bdd7bfed62f50515fce652127bf481b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a4bdd7bfed62f50515fce652127bf481b">set_pager_itemspage</a> ($<a class="el" href="php2po_8php.html#a1594a11499d06cc8a789ee7ca0c7a12b">n</a>)</td></tr>
+<tr class="separator:a4bdd7bfed62f50515fce652127bf481b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a08f0537964d98958d218066364cff785"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a08f0537964d98958d218066364cff785">build_pagehead</a> ()</td></tr>
+<tr class="separator:a08f0537964d98958d218066364cff785"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abf46a653d8499e7c253cc1be894a6d83"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#abf46a653d8499e7c253cc1be894a6d83">register_template_engine</a> ($class, $name= '')</td></tr>
+<tr class="separator:abf46a653d8499e7c253cc1be894a6d83"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a94a1ed2dc493c58612d17035b74ae736"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a94a1ed2dc493c58612d17035b74ae736">template_engine</a> ($name= '')</td></tr>
+<tr class="separator:a94a1ed2dc493c58612d17035b74ae736"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acb27e607fe4c82603444676e25c36b70"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#acb27e607fe4c82603444676e25c36b70">get_template_engine</a> ()</td></tr>
+<tr class="separator:acb27e607fe4c82603444676e25c36b70"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a20d1890cc16b22ba79eeb0cbf2f719f7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a20d1890cc16b22ba79eeb0cbf2f719f7">set_template_engine</a> ($engine= 'smarty3')</td></tr>
+<tr class="separator:a20d1890cc16b22ba79eeb0cbf2f719f7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2eb832a8577dee7d40b93abdf6d1d35a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a2eb832a8577dee7d40b93abdf6d1d35a">get_template_ldelim</a> ($engine= 'smarty3')</td></tr>
+<tr class="separator:a2eb832a8577dee7d40b93abdf6d1d35a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aab23c59172310fd30f2d60dc039d3eea"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#aab23c59172310fd30f2d60dc039d3eea">get_template_rdelim</a> ($engine= 'smarty3')</td></tr>
+<tr class="separator:aab23c59172310fd30f2d60dc039d3eea"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8863703a0305eaa45eb970dbd2046291"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a8863703a0305eaa45eb970dbd2046291">head_set_icon</a> ($icon)</td></tr>
+<tr class="separator:a8863703a0305eaa45eb970dbd2046291"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af17df107f2216ddf5ad2a7e0f2ba2166"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#af17df107f2216ddf5ad2a7e0f2ba2166">head_get_icon</a> ()</td></tr>
+<tr class="separator:af17df107f2216ddf5ad2a7e0f2ba2166"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Public Attributes</h2></td></tr>
+<tr class="memitem:a14bd4b1c29f3aff371fe5d4cb11aeea3"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a14bd4b1c29f3aff371fe5d4cb11aeea3">$account</a> = null</td></tr>
+<tr class="separator:a14bd4b1c29f3aff371fe5d4cb11aeea3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a050b0696118da47e8b30859ad1a2c149"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a050b0696118da47e8b30859ad1a2c149">$channel</a> = null</td></tr>
+<tr class="separator:a050b0696118da47e8b30859ad1a2c149"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4ffe529fb14389f7fedf5fdc5f722e7f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a4ffe529fb14389f7fedf5fdc5f722e7f">$observer</a> = null</td></tr>
+<tr class="separator:a4ffe529fb14389f7fedf5fdc5f722e7f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a08c24d6a6fc52fcc784b0f765f13b820"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a08c24d6a6fc52fcc784b0f765f13b820">$profile_uid</a> = 0</td></tr>
+<tr class="separator:a08c24d6a6fc52fcc784b0f765f13b820"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1936f2afce0dc0d1bbed15ae1f2ee81a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a1936f2afce0dc0d1bbed15ae1f2ee81a">$poi</a> = null</td></tr>
+<tr class="separator:a1936f2afce0dc0d1bbed15ae1f2ee81a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a58ac598544892ff7c32890291b72635e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a58ac598544892ff7c32890291b72635e">$layout</a> = array()</td></tr>
+<tr class="separator:a58ac598544892ff7c32890291b72635e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac6e6b1c7d6df408580ff79977fcfa656"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#ac6e6b1c7d6df408580ff79977fcfa656">$groups</a></td></tr>
+<tr class="separator:ac6e6b1c7d6df408580ff79977fcfa656"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1a297e70b3667b83f4460aa7ed9f5d6f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a1a297e70b3667b83f4460aa7ed9f5d6f">$language</a></td></tr>
+<tr class="separator:a1a297e70b3667b83f4460aa7ed9f5d6f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6e4f0fbfa3cf6c11baebe22a03db6165"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a6e4f0fbfa3cf6c11baebe22a03db6165">$module_loaded</a> = false</td></tr>
+<tr class="separator:a6e4f0fbfa3cf6c11baebe22a03db6165"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2e82da4aecfc2017a8d1d332ca501f9f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a2e82da4aecfc2017a8d1d332ca501f9f">$query_string</a></td></tr>
+<tr class="separator:a2e82da4aecfc2017a8d1d332ca501f9f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac73dc90e4764497e2f1b7e6612c8fb88"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#ac73dc90e4764497e2f1b7e6612c8fb88">$config</a></td></tr>
+<tr class="separator:ac73dc90e4764497e2f1b7e6612c8fb88"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4b67935096f66d1f14b657399a8461ac"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a4b67935096f66d1f14b657399a8461ac">$page</a></td></tr>
+<tr class="separator:a4b67935096f66d1f14b657399a8461ac"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a57d041fcc003d08c127dfa99a02bc192"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a57d041fcc003d08c127dfa99a02bc192">$profile</a></td></tr>
+<tr class="separator:a57d041fcc003d08c127dfa99a02bc192"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a91fd3c8b89016113b05f3be24805ccff"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a91fd3c8b89016113b05f3be24805ccff">$user</a></td></tr>
+<tr class="separator:a91fd3c8b89016113b05f3be24805ccff"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad1c8eb91a6fd470b94f34b7fdad3a2d0"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#ad1c8eb91a6fd470b94f34b7fdad3a2d0">$cid</a></td></tr>
+<tr class="separator:ad1c8eb91a6fd470b94f34b7fdad3a2d0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a98ef4cfd36693a3457c879b76bc6d694"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a98ef4cfd36693a3457c879b76bc6d694">$contact</a></td></tr>
+<tr class="separator:a98ef4cfd36693a3457c879b76bc6d694"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a61ca6e3af82071ea25ff2fd5dbcddae2"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a61ca6e3af82071ea25ff2fd5dbcddae2">$contacts</a></td></tr>
+<tr class="separator:a61ca6e3af82071ea25ff2fd5dbcddae2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac1d80a14492acc932715d54567d8a589"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#ac1d80a14492acc932715d54567d8a589">$content</a></td></tr>
+<tr class="separator:ac1d80a14492acc932715d54567d8a589"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0ce85be198e46570366cb3344f3c55b8"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a0ce85be198e46570366cb3344f3c55b8">$data</a> = array()</td></tr>
+<tr class="separator:a0ce85be198e46570366cb3344f3c55b8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac1a8b2cd40609b231a560201a08852ba"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#ac1a8b2cd40609b231a560201a08852ba">$error</a> = false</td></tr>
+<tr class="separator:ac1a8b2cd40609b231a560201a08852ba"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a495ec082c2719314e536070ca1ce073d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a495ec082c2719314e536070ca1ce073d">$cmd</a></td></tr>
+<tr class="separator:a495ec082c2719314e536070ca1ce073d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab3da757abe5cb45bf88f07cc51a73b58"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#ab3da757abe5cb45bf88f07cc51a73b58">$argv</a></td></tr>
+<tr class="separator:ab3da757abe5cb45bf88f07cc51a73b58"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af58db526040829b1c8bd95561b329262"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#af58db526040829b1c8bd95561b329262">$argc</a></td></tr>
+<tr class="separator:af58db526040829b1c8bd95561b329262"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9bf62f8e39585c0aa48fcffc3bf3484d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a9bf62f8e39585c0aa48fcffc3bf3484d">$module</a></td></tr>
+<tr class="separator:a9bf62f8e39585c0aa48fcffc3bf3484d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6bcb19cdc4907077da72864686d5a780"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a6bcb19cdc4907077da72864686d5a780">$pager</a></td></tr>
+<tr class="separator:a6bcb19cdc4907077da72864686d5a780"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5f64620473a9727a48ebe9cf6f335a98"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a5f64620473a9727a48ebe9cf6f335a98">$strings</a></td></tr>
+<tr class="separator:a5f64620473a9727a48ebe9cf6f335a98"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3694aa1907aa103a2adbc71f926f0fa0"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a3694aa1907aa103a2adbc71f926f0fa0">$hooks</a></td></tr>
+<tr class="separator:a3694aa1907aa103a2adbc71f926f0fa0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab35b01a366a2ea95725e97af278f87ab"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#ab35b01a366a2ea95725e97af278f87ab">$timezone</a></td></tr>
+<tr class="separator:ab35b01a366a2ea95725e97af278f87ab"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4c7cfc62d39508086cf300dc2e39c4df"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a4c7cfc62d39508086cf300dc2e39c4df">$interactive</a> = true</td></tr>
+<tr class="separator:a4c7cfc62d39508086cf300dc2e39c4df"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae9f96338f32187d308b67b980eea0008"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#ae9f96338f32187d308b67b980eea0008">$plugins</a></td></tr>
+<tr class="separator:ae9f96338f32187d308b67b980eea0008"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7954862f44f606b0ff83d4c74d15e792"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a7954862f44f606b0ff83d4c74d15e792">$identities</a></td></tr>
+<tr class="separator:a7954862f44f606b0ff83d4c74d15e792"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6f55d087e1ff4710132c1b0863faa2ee"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a6f55d087e1ff4710132c1b0863faa2ee">$css_sources</a> = array()</td></tr>
+<tr class="separator:a6f55d087e1ff4710132c1b0863faa2ee"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a11e24b3ed9b33ffee7dd41d110b4366d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a11e24b3ed9b33ffee7dd41d110b4366d">$js_sources</a> = array()</td></tr>
+<tr class="separator:a11e24b3ed9b33ffee7dd41d110b4366d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aeca29fd4f7192ca07369b3c598c36e67"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#aeca29fd4f7192ca07369b3c598c36e67">$theme_info</a> = array()</td></tr>
+<tr class="separator:aeca29fd4f7192ca07369b3c598c36e67"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a33a8e90b60ec4438f6fbf299d0f6839c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a33a8e90b60ec4438f6fbf299d0f6839c">$nav_sel</a></td></tr>
+<tr class="separator:a33a8e90b60ec4438f6fbf299d0f6839c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5cfc098c061b7d765add58fd2ca97445"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a5cfc098c061b7d765add58fd2ca97445">$category</a></td></tr>
+<tr class="separator:a5cfc098c061b7d765add58fd2ca97445"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a13710907ef62554a0b4dd8a5eaa2eb11"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a13710907ef62554a0b4dd8a5eaa2eb11">$sourcename</a> = ''</td></tr>
+<tr class="separator:a13710907ef62554a0b4dd8a5eaa2eb11"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:adf2aaf95b062736a6fd5fc70fadf80e8"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#adf2aaf95b062736a6fd5fc70fadf80e8">$videowidth</a> = 425</td></tr>
+<tr class="separator:adf2aaf95b062736a6fd5fc70fadf80e8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a56b1a432c96aef8b1971f779c9d93c8c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a56b1a432c96aef8b1971f779c9d93c8c">$videoheight</a> = 350</td></tr>
+<tr class="separator:a56b1a432c96aef8b1971f779c9d93c8c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae3f47830543d0d902f66913def8db66b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#ae3f47830543d0d902f66913def8db66b">$force_max_items</a> = 0</td></tr>
+<tr class="separator:ae3f47830543d0d902f66913def8db66b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a487332f8de40414ca1a54a4265570b70"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a487332f8de40414ca1a54a4265570b70">$theme_thread_allow</a> = true</td></tr>
+<tr class="separator:a487332f8de40414ca1a54a4265570b70"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6859a4848a5c0049b4134cc4b34228b6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a6859a4848a5c0049b4134cc4b34228b6">$template_engines</a> = array()</td></tr>
+<tr class="separator:a6859a4848a5c0049b4134cc4b34228b6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6844aedad10e201b8c3d80cfc9e876d3"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a6844aedad10e201b8c3d80cfc9e876d3">$template_engine_instance</a> = array()</td></tr>
+<tr class="separator:a6844aedad10e201b8c3d80cfc9e876d3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pri-attribs"></a>
+Private Attributes</h2></td></tr>
+<tr class="memitem:ab47de68fa39806d1fb0976407e188b77"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#ab47de68fa39806d1fb0976407e188b77">$perms</a> = null</td></tr>
+<tr class="separator:ab47de68fa39806d1fb0976407e188b77"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa5a87c46ab3fee21362c466bf78042ef"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#aa5a87c46ab3fee21362c466bf78042ef">$widgets</a> = array()</td></tr>
+<tr class="separator:aa5a87c46ab3fee21362c466bf78042ef"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4833bee2eae4ad1691a04fa19e11a766"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a4833bee2eae4ad1691a04fa19e11a766">$widgetlist</a> = null</td></tr>
+<tr class="separator:a4833bee2eae4ad1691a04fa19e11a766"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a230e975296cf164da2fee35ef720964f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a230e975296cf164da2fee35ef720964f">$apps</a> = array()</td></tr>
+<tr class="separator:a230e975296cf164da2fee35ef720964f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a764cc6cd7578132c21d2b4545de9301c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a764cc6cd7578132c21d2b4545de9301c">$theme</a></td></tr>
+<tr class="separator:a764cc6cd7578132c21d2b4545de9301c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a59dd4b665c70e7dbd80682c014ff7145"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a59dd4b665c70e7dbd80682c014ff7145">$ldelim</a></td></tr>
+<tr class="separator:a59dd4b665c70e7dbd80682c014ff7145"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a244b2d53b21be269aad2269d23192f95"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a244b2d53b21be269aad2269d23192f95">$rdelim</a></td></tr>
+<tr class="separator:a244b2d53b21be269aad2269d23192f95"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad082d63acc078e5bf23825a03bdd6a76"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#ad082d63acc078e5bf23825a03bdd6a76">$scheme</a></td></tr>
+<tr class="separator:ad082d63acc078e5bf23825a03bdd6a76"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a037049cba88dfc6ff94f4b5b779e3fd3"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a037049cba88dfc6ff94f4b5b779e3fd3">$hostname</a></td></tr>
+<tr class="separator:a037049cba88dfc6ff94f4b5b779e3fd3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad5175536561021548ae8188e24c7b80c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#ad5175536561021548ae8188e24c7b80c">$baseurl</a></td></tr>
+<tr class="separator:ad5175536561021548ae8188e24c7b80c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acad5896b7a79ae31433ad8f89606c728"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#acad5896b7a79ae31433ad8f89606c728">$path</a></td></tr>
+<tr class="separator:acad5896b7a79ae31433ad8f89606c728"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a330410a288f3393d53772f5e98f857ea"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a330410a288f3393d53772f5e98f857ea">$db</a></td></tr>
+<tr class="separator:a330410a288f3393d53772f5e98f857ea"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a256360c9184fed6d7556e0bc0a835d7f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a256360c9184fed6d7556e0bc0a835d7f">$curl_code</a></td></tr>
+<tr class="separator:a256360c9184fed6d7556e0bc0a835d7f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af5007c42a693afd9c4899c243b2e1363"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#af5007c42a693afd9c4899c243b2e1363">$curl_headers</a></td></tr>
+<tr class="separator:af5007c42a693afd9c4899c243b2e1363"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abe0e4fa91097f7a6588e1213a834121c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#abe0e4fa91097f7a6588e1213a834121c">$cached_profile_image</a></td></tr>
+<tr class="separator:abe0e4fa91097f7a6588e1213a834121c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aab4a685d15a363bb1d7edbbc20bfb94e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#aab4a685d15a363bb1d7edbbc20bfb94e">$cached_profile_picdate</a></td></tr>
+<tr class="separator:aab4a685d15a363bb1d7edbbc20bfb94e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>class: <a class="el" href="classApp.html">App</a></p>
+<p>Our main application structure for the life of this page Primarily deals with the URL that got us here and tries to make some sense of it, and stores our page contents and config storage and anything else that might need to be passed around before we spit the page out. </p>
+</div><h2 class="groupheader">Constructor &amp; Destructor Documentation</h2>
+<a class="anchor" id="af6d39f63fb7116bbeb04e51696f99474"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::__construct </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Figure out if we are running at the top of a domain or in a sub-directory and adjust accordingly</p>
+<p>Break the URL path into C style argc/argv style arguments for our modules. Given "http://example.com/module/arg1/arg2", $this-&gt;argc will be 3 (integer) and $this-&gt;argv will contain: [0] =&gt; 'module' [1] =&gt; 'arg1' [2] =&gt; 'arg2'</p>
+<p>There will always be one argument. If provided a naked domain URL, $this-&gt;argv[0] is set to "home".</p>
+<p>See if there is any page number information, and initialise pagination</p>
+<p>Detect mobile devices</p>
+<p>register template engines</p>
+
+</div>
+</div>
+<h2 class="groupheader">Member Function Documentation</h2>
+<a class="anchor" id="a08f0537964d98958d218066364cff785"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::build_pagehead </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a08bc87aff64f39fbc084e9d6545cee4d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::get_account </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a5c63eabdc7fdd8b6e3348980ec16a3ad"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::get_apps </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a604d659d6977a99de42a160343e5289a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::get_baseurl </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$ssl</em> = <code>false</code></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classApp.html#a08f0537964d98958d218066364cff785">build_pagehead()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a084e03c77686d8c13390fef3f7428a2b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::get_channel </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a4659785d13e4bac0bed50dbb1b0d4299"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::get_groups </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a622eace13f8fc9f4b5672a68e2bc4396"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::get_hostname </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a1ad3bb1b68439b3b7cbe630918e618d2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::get_observer </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a5293a8543ba338dcf38cd4ff3bc5d4be"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::get_path </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="adb5a4bb657881e553978ff390babd01f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::get_perms </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="acb27e607fe4c82603444676e25c36b70"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::get_template_engine </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a2eb832a8577dee7d40b93abdf6d1d35a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::get_template_ldelim </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$engine</em> = <code>'smarty3'</code></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aab23c59172310fd30f2d60dc039d3eea"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::get_template_rdelim </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$engine</em> = <code>'smarty3'</code></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a871898becd0697d778f36d9336253ae8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::get_widgets </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$location</em> = <code>''</code></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="af17df107f2216ddf5ad2a7e0f2ba2166"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::head_get_icon </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classApp.html#a08f0537964d98958d218066364cff785">build_pagehead()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a8863703a0305eaa45eb970dbd2046291"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::head_set_icon </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$icon</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classApp.html#af6d39f63fb7116bbeb04e51696f99474">__construct()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="abf46a653d8499e7c253cc1be894a6d83"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::register_template_engine </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$class</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$name</em> = <code>''</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>register template engine class if $name is "", is used class static property $class::$name </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype">string</td><td class="paramname">$class</td><td></td></tr>
+ <tr><td class="paramtype">string</td><td class="paramname">$name</td><td></td></tr>
+ </table>
+ </dd>
+</dl>
+
+<p>Referenced by <a class="el" href="classApp.html#af6d39f63fb7116bbeb04e51696f99474">__construct()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aeb1fe1c8ad9aa639909bd183ce578536"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::set_account </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$acct</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="abea5a4f77dcd53c928dc4eed86616637"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::set_apps </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a78788f6e9d8b713b138f81e457c5cd08"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::set_baseurl </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$url</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a89e9feb2bfb5253883a9720beaffe876"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::set_channel </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a3d84af5e42082098672531cd1a618853"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::set_groups </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$g</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a344d2b7dc2f276648d521aee4da1731c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::set_hostname </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$h</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a4776d9322edea17fae56afa5d01a323e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::set_observer </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$xchan</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a4bdd7bfed62f50515fce652127bf481b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::set_pager_itemspage </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$n</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a560189f048d3db2f526841963cc43e97"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::set_pager_total </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$n</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="adb060d5c7f35a521ec7ec0effbe08097"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::set_path </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$p</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a557d7b779d8259027f4724ebf7b248dc"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::set_perms </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$perms</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a20d1890cc16b22ba79eeb0cbf2f719f7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::set_template_engine </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$engine</em> = <code>'smarty3'</code></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a123b903dfe5d3488cc68db3471d36fd2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::set_widget </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$title</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$html</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$location</em> = <code>'aside'</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a94a1ed2dc493c58612d17035b74ae736"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::template_engine </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$name</em> = <code>''</code></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>return template engine instance. If $name is not defined, return engine defined by theme, or default</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype">strin</td><td class="paramname">$name</td><td><a class="el" href="classTemplate.html">Template</a> engine name </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>object <a class="el" href="classTemplate.html">Template</a> Engine instance </dd></dl>
+
+</div>
+</div>
+<h2 class="groupheader">Member Data Documentation</h2>
+<a class="anchor" id="a14bd4b1c29f3aff371fe5d4cb11aeea3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$account = null</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classApp.html#a08bc87aff64f39fbc084e9d6545cee4d">get_account()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a230e975296cf164da2fee35ef720964f"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$apps = array()</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classApp.html#a5c63eabdc7fdd8b6e3348980ec16a3ad">get_apps()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="af58db526040829b1c8bd95561b329262"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$argc</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ab3da757abe5cb45bf88f07cc51a73b58"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$argv</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ad5175536561021548ae8188e24c7b80c"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$baseurl</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classApp.html#a604d659d6977a99de42a160343e5289a">get_baseurl()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="abe0e4fa91097f7a6588e1213a834121c"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$cached_profile_image</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aab4a685d15a363bb1d7edbbc20bfb94e"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$cached_profile_picdate</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a5cfc098c061b7d765add58fd2ca97445"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$category</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a050b0696118da47e8b30859ad1a2c149"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$channel = null</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classApp.html#a084e03c77686d8c13390fef3f7428a2b">get_channel()</a>, and <a class="el" href="classApp.html#a89e9feb2bfb5253883a9720beaffe876">set_channel()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ad1c8eb91a6fd470b94f34b7fdad3a2d0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$cid</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a495ec082c2719314e536070ca1ce073d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$cmd</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ac73dc90e4764497e2f1b7e6612c8fb88"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$config</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a98ef4cfd36693a3457c879b76bc6d694"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$contact</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a61ca6e3af82071ea25ff2fd5dbcddae2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$contacts</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ac1d80a14492acc932715d54567d8a589"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$content</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a6f55d087e1ff4710132c1b0863faa2ee"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$css_sources = array()</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a256360c9184fed6d7556e0bc0a835d7f"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$curl_code</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="af5007c42a693afd9c4899c243b2e1363"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$curl_headers</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a0ce85be198e46570366cb3344f3c55b8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$data = array()</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a330410a288f3393d53772f5e98f857ea"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$db</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ac1a8b2cd40609b231a560201a08852ba"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$error = false</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ae3f47830543d0d902f66913def8db66b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$force_max_items = 0</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ac6e6b1c7d6df408580ff79977fcfa656"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$groups</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classApp.html#a4659785d13e4bac0bed50dbb1b0d4299">get_groups()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a3694aa1907aa103a2adbc71f926f0fa0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$hooks</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a037049cba88dfc6ff94f4b5b779e3fd3"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$hostname</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classApp.html#a622eace13f8fc9f4b5672a68e2bc4396">get_hostname()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a7954862f44f606b0ff83d4c74d15e792"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$identities</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a4c7cfc62d39508086cf300dc2e39c4df"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$interactive = true</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a11e24b3ed9b33ffee7dd41d110b4366d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$js_sources = array()</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a1a297e70b3667b83f4460aa7ed9f5d6f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$language</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a58ac598544892ff7c32890291b72635e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$layout = array()</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a59dd4b665c70e7dbd80682c014ff7145"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$ldelim</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+<b>Initial value:</b><div class="fragment"><div class="line">= array(</div>
+<div class="line"> <span class="stringliteral">&#39;internal&#39;</span> =&gt; <span class="stringliteral">&#39;&#39;</span>,</div>
+<div class="line"> <span class="stringliteral">&#39;smarty3&#39;</span> =&gt; <span class="stringliteral">&#39;{{&#39;</span></div>
+<div class="line"> )</div>
+</div><!-- fragment -->
+</div>
+</div>
+<a class="anchor" id="a9bf62f8e39585c0aa48fcffc3bf3484d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$module</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a6e4f0fbfa3cf6c11baebe22a03db6165"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$module_loaded = false</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a33a8e90b60ec4438f6fbf299d0f6839c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$nav_sel</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a4ffe529fb14389f7fedf5fdc5f722e7f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$observer = null</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classApp.html#a1ad3bb1b68439b3b7cbe630918e618d2">get_observer()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a4b67935096f66d1f14b657399a8461ac"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$page</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a6bcb19cdc4907077da72864686d5a780"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$pager</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="acad5896b7a79ae31433ad8f89606c728"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$path</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classApp.html#af6d39f63fb7116bbeb04e51696f99474">__construct()</a>, and <a class="el" href="classApp.html#a5293a8543ba338dcf38cd4ff3bc5d4be">get_path()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ab47de68fa39806d1fb0976407e188b77"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$perms = null</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classApp.html#adb5a4bb657881e553978ff390babd01f">get_perms()</a>, and <a class="el" href="classApp.html#a557d7b779d8259027f4724ebf7b248dc">set_perms()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ae9f96338f32187d308b67b980eea0008"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$plugins</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a1936f2afce0dc0d1bbed15ae1f2ee81a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$poi = null</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a57d041fcc003d08c127dfa99a02bc192"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$profile</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a08c24d6a6fc52fcc784b0f765f13b820"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$profile_uid = 0</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a2e82da4aecfc2017a8d1d332ca501f9f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$query_string</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a244b2d53b21be269aad2269d23192f95"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$rdelim</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+<b>Initial value:</b><div class="fragment"><div class="line">= array(</div>
+<div class="line"> <span class="stringliteral">&#39;internal&#39;</span> =&gt; <span class="stringliteral">&#39;&#39;</span>,</div>
+<div class="line"> <span class="stringliteral">&#39;smarty3&#39;</span> =&gt; <span class="stringliteral">&#39;}}&#39;</span></div>
+<div class="line"> )</div>
+</div><!-- fragment -->
+</div>
+</div>
+<a class="anchor" id="ad082d63acc078e5bf23825a03bdd6a76"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$scheme</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classApp.html#a604d659d6977a99de42a160343e5289a">get_baseurl()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a13710907ef62554a0b4dd8a5eaa2eb11"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$sourcename = ''</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a5f64620473a9727a48ebe9cf6f335a98"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$strings</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a6844aedad10e201b8c3d80cfc9e876d3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$template_engine_instance = array()</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a6859a4848a5c0049b4134cc4b34228b6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$template_engines = array()</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a764cc6cd7578132c21d2b4545de9301c"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$theme</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+<b>Initial value:</b><div class="fragment"><div class="line">= array(</div>
+<div class="line"> <span class="stringliteral">&#39;sourcename&#39;</span> =&gt; <span class="stringliteral">&#39;&#39;</span>,</div>
+<div class="line"> <span class="stringliteral">&#39;videowidth&#39;</span> =&gt; 425,</div>
+<div class="line"> <span class="stringliteral">&#39;videoheight&#39;</span> =&gt; 350,</div>
+<div class="line"> <span class="stringliteral">&#39;force_max_items&#39;</span> =&gt; 0,</div>
+<div class="line"> <span class="stringliteral">&#39;thread_allow&#39;</span> =&gt; <span class="keyword">true</span>,</div>
+<div class="line"> <span class="stringliteral">&#39;stylesheet&#39;</span> =&gt; <span class="stringliteral">&#39;&#39;</span>,</div>
+<div class="line"> <span class="stringliteral">&#39;template_engine&#39;</span> =&gt; <span class="stringliteral">&#39;smarty3&#39;</span>,</div>
+<div class="line"> )</div>
+</div><!-- fragment -->
+</div>
+</div>
+<a class="anchor" id="aeca29fd4f7192ca07369b3c598c36e67"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$theme_info = array()</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a487332f8de40414ca1a54a4265570b70"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$theme_thread_allow = true</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ab35b01a366a2ea95725e97af278f87ab"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$timezone</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a91fd3c8b89016113b05f3be24805ccff"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$user</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a56b1a432c96aef8b1971f779c9d93c8c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$videoheight = 350</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="adf2aaf95b062736a6fd5fc70fadf80e8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$videowidth = 425</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a4833bee2eae4ad1691a04fa19e11a766"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$widgetlist = null</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aa5a87c46ab3fee21362c466bf78042ef"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$widgets = array()</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classApp.html#a871898becd0697d778f36d9336253ae8">get_widgets()</a>.</p>
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li><a class="el" href="boot_8php.html">boot.php</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classApp.js b/doc/html/classApp.js
new file mode 100644
index 000000000..52808c33c
--- /dev/null
+++ b/doc/html/classApp.js
@@ -0,0 +1,94 @@
+var classApp =
+[
+ [ "__construct", "classApp.html#af6d39f63fb7116bbeb04e51696f99474", null ],
+ [ "build_pagehead", "classApp.html#a08f0537964d98958d218066364cff785", null ],
+ [ "get_account", "classApp.html#a08bc87aff64f39fbc084e9d6545cee4d", null ],
+ [ "get_apps", "classApp.html#a5c63eabdc7fdd8b6e3348980ec16a3ad", null ],
+ [ "get_baseurl", "classApp.html#a604d659d6977a99de42a160343e5289a", null ],
+ [ "get_channel", "classApp.html#a084e03c77686d8c13390fef3f7428a2b", null ],
+ [ "get_groups", "classApp.html#a4659785d13e4bac0bed50dbb1b0d4299", null ],
+ [ "get_hostname", "classApp.html#a622eace13f8fc9f4b5672a68e2bc4396", null ],
+ [ "get_observer", "classApp.html#a1ad3bb1b68439b3b7cbe630918e618d2", null ],
+ [ "get_path", "classApp.html#a5293a8543ba338dcf38cd4ff3bc5d4be", null ],
+ [ "get_perms", "classApp.html#adb5a4bb657881e553978ff390babd01f", null ],
+ [ "get_template_engine", "classApp.html#acb27e607fe4c82603444676e25c36b70", null ],
+ [ "get_template_ldelim", "classApp.html#a2eb832a8577dee7d40b93abdf6d1d35a", null ],
+ [ "get_template_rdelim", "classApp.html#aab23c59172310fd30f2d60dc039d3eea", null ],
+ [ "get_widgets", "classApp.html#a871898becd0697d778f36d9336253ae8", null ],
+ [ "head_get_icon", "classApp.html#af17df107f2216ddf5ad2a7e0f2ba2166", null ],
+ [ "head_set_icon", "classApp.html#a8863703a0305eaa45eb970dbd2046291", null ],
+ [ "register_template_engine", "classApp.html#abf46a653d8499e7c253cc1be894a6d83", null ],
+ [ "set_account", "classApp.html#aeb1fe1c8ad9aa639909bd183ce578536", null ],
+ [ "set_apps", "classApp.html#abea5a4f77dcd53c928dc4eed86616637", null ],
+ [ "set_baseurl", "classApp.html#a78788f6e9d8b713b138f81e457c5cd08", null ],
+ [ "set_channel", "classApp.html#a89e9feb2bfb5253883a9720beaffe876", null ],
+ [ "set_groups", "classApp.html#a3d84af5e42082098672531cd1a618853", null ],
+ [ "set_hostname", "classApp.html#a344d2b7dc2f276648d521aee4da1731c", null ],
+ [ "set_observer", "classApp.html#a4776d9322edea17fae56afa5d01a323e", null ],
+ [ "set_pager_itemspage", "classApp.html#a4bdd7bfed62f50515fce652127bf481b", null ],
+ [ "set_pager_total", "classApp.html#a560189f048d3db2f526841963cc43e97", null ],
+ [ "set_path", "classApp.html#adb060d5c7f35a521ec7ec0effbe08097", null ],
+ [ "set_perms", "classApp.html#a557d7b779d8259027f4724ebf7b248dc", null ],
+ [ "set_template_engine", "classApp.html#a20d1890cc16b22ba79eeb0cbf2f719f7", null ],
+ [ "set_widget", "classApp.html#a123b903dfe5d3488cc68db3471d36fd2", null ],
+ [ "template_engine", "classApp.html#a94a1ed2dc493c58612d17035b74ae736", null ],
+ [ "$account", "classApp.html#a14bd4b1c29f3aff371fe5d4cb11aeea3", null ],
+ [ "$apps", "classApp.html#a230e975296cf164da2fee35ef720964f", null ],
+ [ "$argc", "classApp.html#af58db526040829b1c8bd95561b329262", null ],
+ [ "$argv", "classApp.html#ab3da757abe5cb45bf88f07cc51a73b58", null ],
+ [ "$baseurl", "classApp.html#ad5175536561021548ae8188e24c7b80c", null ],
+ [ "$cached_profile_image", "classApp.html#abe0e4fa91097f7a6588e1213a834121c", null ],
+ [ "$cached_profile_picdate", "classApp.html#aab4a685d15a363bb1d7edbbc20bfb94e", null ],
+ [ "$category", "classApp.html#a5cfc098c061b7d765add58fd2ca97445", null ],
+ [ "$channel", "classApp.html#a050b0696118da47e8b30859ad1a2c149", null ],
+ [ "$cid", "classApp.html#ad1c8eb91a6fd470b94f34b7fdad3a2d0", null ],
+ [ "$cmd", "classApp.html#a495ec082c2719314e536070ca1ce073d", null ],
+ [ "$config", "classApp.html#ac73dc90e4764497e2f1b7e6612c8fb88", null ],
+ [ "$contact", "classApp.html#a98ef4cfd36693a3457c879b76bc6d694", null ],
+ [ "$contacts", "classApp.html#a61ca6e3af82071ea25ff2fd5dbcddae2", null ],
+ [ "$content", "classApp.html#ac1d80a14492acc932715d54567d8a589", null ],
+ [ "$css_sources", "classApp.html#a6f55d087e1ff4710132c1b0863faa2ee", null ],
+ [ "$curl_code", "classApp.html#a256360c9184fed6d7556e0bc0a835d7f", null ],
+ [ "$curl_headers", "classApp.html#af5007c42a693afd9c4899c243b2e1363", null ],
+ [ "$data", "classApp.html#a0ce85be198e46570366cb3344f3c55b8", null ],
+ [ "$db", "classApp.html#a330410a288f3393d53772f5e98f857ea", null ],
+ [ "$error", "classApp.html#ac1a8b2cd40609b231a560201a08852ba", null ],
+ [ "$force_max_items", "classApp.html#ae3f47830543d0d902f66913def8db66b", null ],
+ [ "$groups", "classApp.html#ac6e6b1c7d6df408580ff79977fcfa656", null ],
+ [ "$hooks", "classApp.html#a3694aa1907aa103a2adbc71f926f0fa0", null ],
+ [ "$hostname", "classApp.html#a037049cba88dfc6ff94f4b5b779e3fd3", null ],
+ [ "$identities", "classApp.html#a7954862f44f606b0ff83d4c74d15e792", null ],
+ [ "$interactive", "classApp.html#a4c7cfc62d39508086cf300dc2e39c4df", null ],
+ [ "$js_sources", "classApp.html#a11e24b3ed9b33ffee7dd41d110b4366d", null ],
+ [ "$language", "classApp.html#a1a297e70b3667b83f4460aa7ed9f5d6f", null ],
+ [ "$layout", "classApp.html#a58ac598544892ff7c32890291b72635e", null ],
+ [ "$ldelim", "classApp.html#a59dd4b665c70e7dbd80682c014ff7145", null ],
+ [ "$module", "classApp.html#a9bf62f8e39585c0aa48fcffc3bf3484d", null ],
+ [ "$module_loaded", "classApp.html#a6e4f0fbfa3cf6c11baebe22a03db6165", null ],
+ [ "$nav_sel", "classApp.html#a33a8e90b60ec4438f6fbf299d0f6839c", null ],
+ [ "$observer", "classApp.html#a4ffe529fb14389f7fedf5fdc5f722e7f", null ],
+ [ "$page", "classApp.html#a4b67935096f66d1f14b657399a8461ac", null ],
+ [ "$pager", "classApp.html#a6bcb19cdc4907077da72864686d5a780", null ],
+ [ "$path", "classApp.html#acad5896b7a79ae31433ad8f89606c728", null ],
+ [ "$perms", "classApp.html#ab47de68fa39806d1fb0976407e188b77", null ],
+ [ "$plugins", "classApp.html#ae9f96338f32187d308b67b980eea0008", null ],
+ [ "$poi", "classApp.html#a1936f2afce0dc0d1bbed15ae1f2ee81a", null ],
+ [ "$profile", "classApp.html#a57d041fcc003d08c127dfa99a02bc192", null ],
+ [ "$profile_uid", "classApp.html#a08c24d6a6fc52fcc784b0f765f13b820", null ],
+ [ "$query_string", "classApp.html#a2e82da4aecfc2017a8d1d332ca501f9f", null ],
+ [ "$rdelim", "classApp.html#a244b2d53b21be269aad2269d23192f95", null ],
+ [ "$scheme", "classApp.html#ad082d63acc078e5bf23825a03bdd6a76", null ],
+ [ "$sourcename", "classApp.html#a13710907ef62554a0b4dd8a5eaa2eb11", null ],
+ [ "$strings", "classApp.html#a5f64620473a9727a48ebe9cf6f335a98", null ],
+ [ "$template_engine_instance", "classApp.html#a6844aedad10e201b8c3d80cfc9e876d3", null ],
+ [ "$template_engines", "classApp.html#a6859a4848a5c0049b4134cc4b34228b6", null ],
+ [ "$theme", "classApp.html#a764cc6cd7578132c21d2b4545de9301c", null ],
+ [ "$theme_info", "classApp.html#aeca29fd4f7192ca07369b3c598c36e67", null ],
+ [ "$theme_thread_allow", "classApp.html#a487332f8de40414ca1a54a4265570b70", null ],
+ [ "$timezone", "classApp.html#ab35b01a366a2ea95725e97af278f87ab", null ],
+ [ "$user", "classApp.html#a91fd3c8b89016113b05f3be24805ccff", null ],
+ [ "$videoheight", "classApp.html#a56b1a432c96aef8b1971f779c9d93c8c", null ],
+ [ "$videowidth", "classApp.html#adf2aaf95b062736a6fd5fc70fadf80e8", null ],
+ [ "$widgetlist", "classApp.html#a4833bee2eae4ad1691a04fa19e11a766", null ],
+ [ "$widgets", "classApp.html#aa5a87c46ab3fee21362c466bf78042ef", null ]
+]; \ No newline at end of file
diff --git a/doc/html/classBaseObject-members.html b/doc/html/classBaseObject-members.html
new file mode 100644
index 000000000..6ea953349
--- /dev/null
+++ b/doc/html/classBaseObject-members.html
@@ -0,0 +1,120 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classBaseObject.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">BaseObject Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classBaseObject.html">BaseObject</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="classBaseObject.html#a02cc4cd8fa26b6fc76d92fde54b4e4b1">$app</a></td><td class="entry"><a class="el" href="classBaseObject.html">BaseObject</a></td><td class="entry"><span class="mlabel">private</span><span class="mlabel">static</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classBaseObject.html#ac43f10e69ce80c78e4870636250fc8a2">get_app</a>()</td><td class="entry"><a class="el" href="classBaseObject.html">BaseObject</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classBaseObject.html#a0a9acda12d751692834cf6999f889223">set_app</a>($app)</td><td class="entry"><a class="el" href="classBaseObject.html">BaseObject</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+</table></div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classBaseObject.html b/doc/html/classBaseObject.html
new file mode 100644
index 000000000..6aa26d5ba
--- /dev/null
+++ b/doc/html/classBaseObject.html
@@ -0,0 +1,221 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: BaseObject Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classBaseObject.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="#pub-static-methods">Static Public Member Functions</a> &#124;
+<a href="#pri-static-attribs">Static Private Attributes</a> &#124;
+<a href="classBaseObject-members.html">List of all members</a> </div>
+ <div class="headertitle">
+<div class="title">BaseObject Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="dynheader">
+Inheritance diagram for BaseObject:</div>
+<div class="dyncontent">
+ <div class="center">
+ <img src="classBaseObject.png" usemap="#BaseObject_map" alt=""/>
+ <map id="BaseObject_map" name="BaseObject_map">
+<area href="classConversation.html" alt="Conversation" shape="rect" coords="0,56,87,80"/>
+<area href="classItem.html" alt="Item" shape="rect" coords="97,56,184,80"/>
+</map>
+ </div></div>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:ac43f10e69ce80c78e4870636250fc8a2"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classBaseObject.html#ac43f10e69ce80c78e4870636250fc8a2">get_app</a> ()</td></tr>
+<tr class="separator:ac43f10e69ce80c78e4870636250fc8a2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-static-methods"></a>
+Static Public Member Functions</h2></td></tr>
+<tr class="memitem:a0a9acda12d751692834cf6999f889223"><td class="memItemLeft" align="right" valign="top">static&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classBaseObject.html#a0a9acda12d751692834cf6999f889223">set_app</a> ($app)</td></tr>
+<tr class="separator:a0a9acda12d751692834cf6999f889223"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pri-static-attribs"></a>
+Static Private Attributes</h2></td></tr>
+<tr class="memitem:a02cc4cd8fa26b6fc76d92fde54b4e4b1"><td class="memItemLeft" align="right" valign="top">static&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classBaseObject.html#a02cc4cd8fa26b6fc76d92fde54b4e4b1">$app</a> = null</td></tr>
+<tr class="separator:a02cc4cd8fa26b6fc76d92fde54b4e4b1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Basic object</p>
+<p>Contains what is usefull to any object </p>
+</div><h2 class="groupheader">Member Function Documentation</h2>
+<a class="anchor" id="ac43f10e69ce80c78e4870636250fc8a2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">BaseObject::get_app </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Get the app</p>
+<p>Same as get_app from <a class="el" href="boot_8php.html">boot.php</a> </p>
+
+<p>Referenced by <a class="el" href="classItem.html#a248f45871ecfe82a08d1d4c0769b2eb2">Item\__construct()</a>, <a class="el" href="classItem.html#a3ee7667c2ec6cd7657328e27848c0bdf">Item\get_comment_box()</a>, <a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">Item\get_template_data()</a>, and <a class="el" href="classConversation.html#a66f121ca4026246f86a732e5faa0682c">Conversation\set_mode()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a0a9acda12d751692834cf6999f889223"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">static BaseObject::set_app </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$app</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+<p>Set the app </p>
+
+<p>Referenced by <a class="el" href="classApp.html#af6d39f63fb7116bbeb04e51696f99474">App\__construct()</a>.</p>
+
+</div>
+</div>
+<h2 class="groupheader">Member Data Documentation</h2>
+<a class="anchor" id="a02cc4cd8fa26b6fc76d92fde54b4e4b1"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">BaseObject::$app = null</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classBaseObject.html#a0a9acda12d751692834cf6999f889223">set_app()</a>.</p>
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>include/<a class="el" href="BaseObject_8php.html">BaseObject.php</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classBaseObject.js b/doc/html/classBaseObject.js
new file mode 100644
index 000000000..ba0c42902
--- /dev/null
+++ b/doc/html/classBaseObject.js
@@ -0,0 +1,4 @@
+var classBaseObject =
+[
+ [ "get_app", "classBaseObject.html#ac43f10e69ce80c78e4870636250fc8a2", null ]
+]; \ No newline at end of file
diff --git a/doc/html/classBaseObject.png b/doc/html/classBaseObject.png
new file mode 100644
index 000000000..8cbd659ec
--- /dev/null
+++ b/doc/html/classBaseObject.png
Binary files differ
diff --git a/doc/html/classCache-members.html b/doc/html/classCache-members.html
new file mode 100644
index 000000000..3244cad73
--- /dev/null
+++ b/doc/html/classCache-members.html
@@ -0,0 +1,120 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classCache.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">Cache Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classCache.html">Cache</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="classCache.html#ab14d0f4bdf7116a94d545c574b38f568">clear</a>()</td><td class="entry"><a class="el" href="classCache.html">Cache</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classCache.html#a70392b109331897bf9fdd7f1960e21de">get</a>($key)</td><td class="entry"><a class="el" href="classCache.html">Cache</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classCache.html#ae622b82adc1c2fb1f3e2cc4fd9688fce">set</a>($key, $value)</td><td class="entry"><a class="el" href="classCache.html">Cache</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+</table></div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classCache.html b/doc/html/classCache.html
new file mode 100644
index 000000000..f2c1f7991
--- /dev/null
+++ b/doc/html/classCache.html
@@ -0,0 +1,218 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Cache Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classCache.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#pub-static-methods">Static Public Member Functions</a> &#124;
+<a href="classCache-members.html">List of all members</a> </div>
+ <div class="headertitle">
+<div class="title">Cache Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-static-methods"></a>
+Static Public Member Functions</h2></td></tr>
+<tr class="memitem:a70392b109331897bf9fdd7f1960e21de"><td class="memItemLeft" align="right" valign="top">static&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCache.html#a70392b109331897bf9fdd7f1960e21de">get</a> ($key)</td></tr>
+<tr class="separator:a70392b109331897bf9fdd7f1960e21de"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae622b82adc1c2fb1f3e2cc4fd9688fce"><td class="memItemLeft" align="right" valign="top">static&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCache.html#ae622b82adc1c2fb1f3e2cc4fd9688fce">set</a> ($key, $value)</td></tr>
+<tr class="separator:ae622b82adc1c2fb1f3e2cc4fd9688fce"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab14d0f4bdf7116a94d545c574b38f568"><td class="memItemLeft" align="right" valign="top">static&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCache.html#ab14d0f4bdf7116a94d545c574b38f568">clear</a> ()</td></tr>
+<tr class="separator:ab14d0f4bdf7116a94d545c574b38f568"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>cache api </p>
+</div><h2 class="groupheader">Member Function Documentation</h2>
+<a class="anchor" id="ab14d0f4bdf7116a94d545c574b38f568"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">static Cache::clear </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a70392b109331897bf9fdd7f1960e21de"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">static Cache::get </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$key</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2oembed_8php.html#a98549b9af8140eda3eceaeedcaabc2c2">oembed_fetch_url()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ae622b82adc1c2fb1f3e2cc4fd9688fce"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">static Cache::set </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$key</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$value</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2oembed_8php.html#a98549b9af8140eda3eceaeedcaabc2c2">oembed_fetch_url()</a>.</p>
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>include/<a class="el" href="cache_8php.html">cache.php</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classConversation-members.html b/doc/html/classConversation-members.html
new file mode 100644
index 000000000..b8df9ac33
--- /dev/null
+++ b/doc/html/classConversation-members.html
@@ -0,0 +1,141 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classConversation.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">Conversation Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classConversation.html">Conversation</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="classConversation.html#aa95c1a62af38bdfba7add9549bec083b">$cipher</a></td><td class="entry"><a class="el" href="classConversation.html">Conversation</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classConversation.html#afd4965d22a6e4bfea2f35e931b3273c6">$commentable</a></td><td class="entry"><a class="el" href="classConversation.html">Conversation</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classConversation.html#afb03d1648dbfafe62caa1e30f32f2b1a">$mode</a></td><td class="entry"><a class="el" href="classConversation.html">Conversation</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classConversation.html#a8748445aa26047ebed5141f3c3cbc244">$observer</a></td><td class="entry"><a class="el" href="classConversation.html">Conversation</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classConversation.html#a5b6adbb2fe24f0f53d6c22660dff91b2">$prepared_item</a></td><td class="entry"><a class="el" href="classConversation.html">Conversation</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classConversation.html#ae9937f9e0f3d927acc2bed46cc72e9ae">$preview</a></td><td class="entry"><a class="el" href="classConversation.html">Conversation</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classConversation.html#a2f12724ef0244e9049fe1bb9641b516d">$profile_owner</a></td><td class="entry"><a class="el" href="classConversation.html">Conversation</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classConversation.html#a41f4a549e6a99f98935c4742addd22c8">$threads</a></td><td class="entry"><a class="el" href="classConversation.html">Conversation</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classConversation.html#ae81221251307e315f566a11f921ce0a9">$writable</a></td><td class="entry"><a class="el" href="classConversation.html">Conversation</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classConversation.html#af84ea6ccd72214c9bb4c504461cc8b09">__construct</a>($mode, $preview, $prepared_item= '')</td><td class="entry"><a class="el" href="classConversation.html">Conversation</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classConversation.html#a8335cdd43f1836e3c255638e61a09e16">add_thread</a>($item)</td><td class="entry"><a class="el" href="classConversation.html">Conversation</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classBaseObject.html#ac43f10e69ce80c78e4870636250fc8a2">get_app</a>()</td><td class="entry"><a class="el" href="classBaseObject.html">BaseObject</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classConversation.html#a4aab60bb39fa6761b6cacdc8d9da2901">get_cipher</a>()</td><td class="entry"><a class="el" href="classConversation.html">Conversation</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classConversation.html#a87a0d704d5f2b1a008cc2e9ce06a1bcd">get_mode</a>()</td><td class="entry"><a class="el" href="classConversation.html">Conversation</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classConversation.html#ae3d4190142e12b57051f11f2911f77a0">get_observer</a>()</td><td class="entry"><a class="el" href="classConversation.html">Conversation</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classConversation.html#a5effe8ad3007e01333df44b81432b813">get_profile_owner</a>()</td><td class="entry"><a class="el" href="classConversation.html">Conversation</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classConversation.html#a2a96b7a6573ae53db861624659e831cb">get_template_data</a>($alike, $dlike)</td><td class="entry"><a class="el" href="classConversation.html">Conversation</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classConversation.html#a4cff75d8c46b517e7133e4d0da6fc1c8">get_thread</a>($id)</td><td class="entry"><a class="el" href="classConversation.html">Conversation</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classConversation.html#a8b47c92b69459d461ea3cc9aae9597a3">is_commentable</a>()</td><td class="entry"><a class="el" href="classConversation.html">Conversation</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classConversation.html#adf25ce023b69a166c63c6e84e02c136a">is_preview</a>()</td><td class="entry"><a class="el" href="classConversation.html">Conversation</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classConversation.html#a5879199008b96bee7550b576d614e1c1">is_writable</a>()</td><td class="entry"><a class="el" href="classConversation.html">Conversation</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classBaseObject.html#a0a9acda12d751692834cf6999f889223">set_app</a>($app)</td><td class="entry"><a class="el" href="classBaseObject.html">BaseObject</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classConversation.html#a66f121ca4026246f86a732e5faa0682c">set_mode</a>($mode)</td><td class="entry"><a class="el" href="classConversation.html">Conversation</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classConversation.html#a8898bddc1e8990e81dab9a13a532cc93">set_profile_owner</a>($uid)</td><td class="entry"><a class="el" href="classConversation.html">Conversation</a></td><td class="entry"></td></tr>
+</table></div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classConversation.html b/doc/html/classConversation.html
new file mode 100644
index 000000000..cb5760686
--- /dev/null
+++ b/doc/html/classConversation.html
@@ -0,0 +1,656 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Conversation Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classConversation.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="#pri-methods">Private Member Functions</a> &#124;
+<a href="#pri-attribs">Private Attributes</a> &#124;
+<a href="classConversation-members.html">List of all members</a> </div>
+ <div class="headertitle">
+<div class="title">Conversation Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="dynheader">
+Inheritance diagram for Conversation:</div>
+<div class="dyncontent">
+ <div class="center">
+ <img src="classConversation.png" usemap="#Conversation_map" alt=""/>
+ <map id="Conversation_map" name="Conversation_map">
+<area href="classBaseObject.html" alt="BaseObject" shape="rect" coords="0,0,87,24"/>
+</map>
+ </div></div>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:af84ea6ccd72214c9bb4c504461cc8b09"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classConversation.html#af84ea6ccd72214c9bb4c504461cc8b09">__construct</a> ($mode, $preview, $prepared_item= '')</td></tr>
+<tr class="separator:af84ea6ccd72214c9bb4c504461cc8b09"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a87a0d704d5f2b1a008cc2e9ce06a1bcd"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classConversation.html#a87a0d704d5f2b1a008cc2e9ce06a1bcd">get_mode</a> ()</td></tr>
+<tr class="separator:a87a0d704d5f2b1a008cc2e9ce06a1bcd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5879199008b96bee7550b576d614e1c1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classConversation.html#a5879199008b96bee7550b576d614e1c1">is_writable</a> ()</td></tr>
+<tr class="separator:a5879199008b96bee7550b576d614e1c1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8b47c92b69459d461ea3cc9aae9597a3"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classConversation.html#a8b47c92b69459d461ea3cc9aae9597a3">is_commentable</a> ()</td></tr>
+<tr class="separator:a8b47c92b69459d461ea3cc9aae9597a3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:adf25ce023b69a166c63c6e84e02c136a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classConversation.html#adf25ce023b69a166c63c6e84e02c136a">is_preview</a> ()</td></tr>
+<tr class="separator:adf25ce023b69a166c63c6e84e02c136a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5effe8ad3007e01333df44b81432b813"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classConversation.html#a5effe8ad3007e01333df44b81432b813">get_profile_owner</a> ()</td></tr>
+<tr class="separator:a5effe8ad3007e01333df44b81432b813"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8898bddc1e8990e81dab9a13a532cc93"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classConversation.html#a8898bddc1e8990e81dab9a13a532cc93">set_profile_owner</a> ($uid)</td></tr>
+<tr class="separator:a8898bddc1e8990e81dab9a13a532cc93"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae3d4190142e12b57051f11f2911f77a0"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classConversation.html#ae3d4190142e12b57051f11f2911f77a0">get_observer</a> ()</td></tr>
+<tr class="separator:ae3d4190142e12b57051f11f2911f77a0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4aab60bb39fa6761b6cacdc8d9da2901"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classConversation.html#a4aab60bb39fa6761b6cacdc8d9da2901">get_cipher</a> ()</td></tr>
+<tr class="separator:a4aab60bb39fa6761b6cacdc8d9da2901"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8335cdd43f1836e3c255638e61a09e16"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classConversation.html#a8335cdd43f1836e3c255638e61a09e16">add_thread</a> ($item)</td></tr>
+<tr class="separator:a8335cdd43f1836e3c255638e61a09e16"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2a96b7a6573ae53db861624659e831cb"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classConversation.html#a2a96b7a6573ae53db861624659e831cb">get_template_data</a> ($alike, $dlike)</td></tr>
+<tr class="separator:a2a96b7a6573ae53db861624659e831cb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="inherit_header pub_methods_classBaseObject"><td colspan="2" onclick="javascript:toggleInherit('pub_methods_classBaseObject')"><img src="closed.png" alt="-"/>&#160;Public Member Functions inherited from <a class="el" href="classBaseObject.html">BaseObject</a></td></tr>
+<tr class="memitem:ac43f10e69ce80c78e4870636250fc8a2 inherit pub_methods_classBaseObject"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classBaseObject.html#ac43f10e69ce80c78e4870636250fc8a2">get_app</a> ()</td></tr>
+<tr class="separator:ac43f10e69ce80c78e4870636250fc8a2 inherit pub_methods_classBaseObject"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pri-methods"></a>
+Private Member Functions</h2></td></tr>
+<tr class="memitem:a66f121ca4026246f86a732e5faa0682c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classConversation.html#a66f121ca4026246f86a732e5faa0682c">set_mode</a> ($mode)</td></tr>
+<tr class="separator:a66f121ca4026246f86a732e5faa0682c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4cff75d8c46b517e7133e4d0da6fc1c8"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classConversation.html#a4cff75d8c46b517e7133e4d0da6fc1c8">get_thread</a> ($id)</td></tr>
+<tr class="separator:a4cff75d8c46b517e7133e4d0da6fc1c8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pri-attribs"></a>
+Private Attributes</h2></td></tr>
+<tr class="memitem:a41f4a549e6a99f98935c4742addd22c8"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classConversation.html#a41f4a549e6a99f98935c4742addd22c8">$threads</a> = array()</td></tr>
+<tr class="separator:a41f4a549e6a99f98935c4742addd22c8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afb03d1648dbfafe62caa1e30f32f2b1a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classConversation.html#afb03d1648dbfafe62caa1e30f32f2b1a">$mode</a> = null</td></tr>
+<tr class="separator:afb03d1648dbfafe62caa1e30f32f2b1a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8748445aa26047ebed5141f3c3cbc244"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classConversation.html#a8748445aa26047ebed5141f3c3cbc244">$observer</a> = null</td></tr>
+<tr class="separator:a8748445aa26047ebed5141f3c3cbc244"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae81221251307e315f566a11f921ce0a9"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classConversation.html#ae81221251307e315f566a11f921ce0a9">$writable</a> = false</td></tr>
+<tr class="separator:ae81221251307e315f566a11f921ce0a9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afd4965d22a6e4bfea2f35e931b3273c6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classConversation.html#afd4965d22a6e4bfea2f35e931b3273c6">$commentable</a> = false</td></tr>
+<tr class="separator:afd4965d22a6e4bfea2f35e931b3273c6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2f12724ef0244e9049fe1bb9641b516d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classConversation.html#a2f12724ef0244e9049fe1bb9641b516d">$profile_owner</a> = 0</td></tr>
+<tr class="separator:a2f12724ef0244e9049fe1bb9641b516d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae9937f9e0f3d927acc2bed46cc72e9ae"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classConversation.html#ae9937f9e0f3d927acc2bed46cc72e9ae">$preview</a> = false</td></tr>
+<tr class="separator:ae9937f9e0f3d927acc2bed46cc72e9ae"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5b6adbb2fe24f0f53d6c22660dff91b2"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classConversation.html#a5b6adbb2fe24f0f53d6c22660dff91b2">$prepared_item</a> = ''</td></tr>
+<tr class="separator:a5b6adbb2fe24f0f53d6c22660dff91b2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa95c1a62af38bdfba7add9549bec083b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classConversation.html#aa95c1a62af38bdfba7add9549bec083b">$cipher</a> = 'aes256'</td></tr>
+<tr class="separator:aa95c1a62af38bdfba7add9549bec083b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="inherited"></a>
+Additional Inherited Members</h2></td></tr>
+<tr class="inherit_header pub_static_methods_classBaseObject"><td colspan="2" onclick="javascript:toggleInherit('pub_static_methods_classBaseObject')"><img src="closed.png" alt="-"/>&#160;Static Public Member Functions inherited from <a class="el" href="classBaseObject.html">BaseObject</a></td></tr>
+<tr class="memitem:a0a9acda12d751692834cf6999f889223 inherit pub_static_methods_classBaseObject"><td class="memItemLeft" align="right" valign="top">static&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classBaseObject.html#a0a9acda12d751692834cf6999f889223">set_app</a> ($app)</td></tr>
+<tr class="separator:a0a9acda12d751692834cf6999f889223 inherit pub_static_methods_classBaseObject"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>A list of threads </p>
+</div><h2 class="groupheader">Constructor &amp; Destructor Documentation</h2>
+<a class="anchor" id="af84ea6ccd72214c9bb4c504461cc8b09"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Conversation::__construct </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$mode</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$preview</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$prepared_item</em> = <code>''</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Member Function Documentation</h2>
+<a class="anchor" id="a8335cdd43f1836e3c255638e61a09e16"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Conversation::add_thread </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Add a thread to the conversation</p>
+<p>Returns: _ The inserted item on success _ false on failure </p>
+
+</div>
+</div>
+<a class="anchor" id="a4aab60bb39fa6761b6cacdc8d9da2901"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Conversation::get_cipher </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a87a0d704d5f2b1a008cc2e9ce06a1bcd"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Conversation::get_mode </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Get mode </p>
+
+<p>Referenced by <a class="el" href="classConversation.html#a66f121ca4026246f86a732e5faa0682c">set_mode()</a>, and <a class="el" href="classConversation.html#a8898bddc1e8990e81dab9a13a532cc93">set_profile_owner()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ae3d4190142e12b57051f11f2911f77a0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Conversation::get_observer </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a5effe8ad3007e01333df44b81432b813"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Conversation::get_profile_owner </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Get profile owner </p>
+
+</div>
+</div>
+<a class="anchor" id="a2a96b7a6573ae53db861624659e831cb"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Conversation::get_template_data </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$alike</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$dlike</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Get data in a form usable by a conversation template</p>
+<p>We should find a way to avoid using those arguments (at least most of them)</p>
+<p>Returns: _ The data requested on success _ false on failure </p>
+
+</div>
+</div>
+<a class="anchor" id="a4cff75d8c46b517e7133e4d0da6fc1c8"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Conversation::get_thread </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$id</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+<p>Get a thread based on its item id</p>
+<p>Returns: _ The found item on success _ false on failure </p>
+
+<p>Referenced by <a class="el" href="classConversation.html#a8335cdd43f1836e3c255638e61a09e16">add_thread()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a8b47c92b69459d461ea3cc9aae9597a3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Conversation::is_commentable </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="adf25ce023b69a166c63c6e84e02c136a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Conversation::is_preview </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Check if page is a preview </p>
+
+</div>
+</div>
+<a class="anchor" id="a5879199008b96bee7550b576d614e1c1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Conversation::is_writable </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Check if page is writable </p>
+
+</div>
+</div>
+<a class="anchor" id="a66f121ca4026246f86a732e5faa0682c"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Conversation::set_mode </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$mode</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+<p>Set the mode we'll be displayed on </p>
+
+<p>Referenced by <a class="el" href="classConversation.html#af84ea6ccd72214c9bb4c504461cc8b09">__construct()</a>, and <a class="el" href="classConversation.html#a8898bddc1e8990e81dab9a13a532cc93">set_profile_owner()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a8898bddc1e8990e81dab9a13a532cc93"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Conversation::set_profile_owner </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Member Data Documentation</h2>
+<a class="anchor" id="aa95c1a62af38bdfba7add9549bec083b"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Conversation::$cipher = 'aes256'</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classConversation.html#a4aab60bb39fa6761b6cacdc8d9da2901">get_cipher()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="afd4965d22a6e4bfea2f35e931b3273c6"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Conversation::$commentable = false</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classConversation.html#a8b47c92b69459d461ea3cc9aae9597a3">is_commentable()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="afb03d1648dbfafe62caa1e30f32f2b1a"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Conversation::$mode = null</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classConversation.html#af84ea6ccd72214c9bb4c504461cc8b09">__construct()</a>, <a class="el" href="classConversation.html#a87a0d704d5f2b1a008cc2e9ce06a1bcd">get_mode()</a>, <a class="el" href="classConversation.html#a66f121ca4026246f86a732e5faa0682c">set_mode()</a>, and <a class="el" href="classConversation.html#a8898bddc1e8990e81dab9a13a532cc93">set_profile_owner()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a8748445aa26047ebed5141f3c3cbc244"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Conversation::$observer = null</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classConversation.html#a8335cdd43f1836e3c255638e61a09e16">add_thread()</a>, <a class="el" href="classConversation.html#ae3d4190142e12b57051f11f2911f77a0">get_observer()</a>, and <a class="el" href="classConversation.html#a66f121ca4026246f86a732e5faa0682c">set_mode()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a5b6adbb2fe24f0f53d6c22660dff91b2"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Conversation::$prepared_item = ''</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classConversation.html#af84ea6ccd72214c9bb4c504461cc8b09">__construct()</a>, and <a class="el" href="classConversation.html#a2a96b7a6573ae53db861624659e831cb">get_template_data()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ae9937f9e0f3d927acc2bed46cc72e9ae"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Conversation::$preview = false</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classConversation.html#af84ea6ccd72214c9bb4c504461cc8b09">__construct()</a>, and <a class="el" href="classConversation.html#adf25ce023b69a166c63c6e84e02c136a">is_preview()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a2f12724ef0244e9049fe1bb9641b516d"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Conversation::$profile_owner = 0</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classConversation.html#a5effe8ad3007e01333df44b81432b813">get_profile_owner()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a41f4a549e6a99f98935c4742addd22c8"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Conversation::$threads = array()</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ae81221251307e315f566a11f921ce0a9"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Conversation::$writable = false</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classConversation.html#a5879199008b96bee7550b576d614e1c1">is_writable()</a>.</p>
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>include/<a class="el" href="ConversationObject_8php.html">ConversationObject.php</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classConversation.js b/doc/html/classConversation.js
new file mode 100644
index 000000000..cb7416068
--- /dev/null
+++ b/doc/html/classConversation.js
@@ -0,0 +1,25 @@
+var classConversation =
+[
+ [ "__construct", "classConversation.html#af84ea6ccd72214c9bb4c504461cc8b09", null ],
+ [ "add_thread", "classConversation.html#a8335cdd43f1836e3c255638e61a09e16", null ],
+ [ "get_cipher", "classConversation.html#a4aab60bb39fa6761b6cacdc8d9da2901", null ],
+ [ "get_mode", "classConversation.html#a87a0d704d5f2b1a008cc2e9ce06a1bcd", null ],
+ [ "get_observer", "classConversation.html#ae3d4190142e12b57051f11f2911f77a0", null ],
+ [ "get_profile_owner", "classConversation.html#a5effe8ad3007e01333df44b81432b813", null ],
+ [ "get_template_data", "classConversation.html#a2a96b7a6573ae53db861624659e831cb", null ],
+ [ "get_thread", "classConversation.html#a4cff75d8c46b517e7133e4d0da6fc1c8", null ],
+ [ "is_commentable", "classConversation.html#a8b47c92b69459d461ea3cc9aae9597a3", null ],
+ [ "is_preview", "classConversation.html#adf25ce023b69a166c63c6e84e02c136a", null ],
+ [ "is_writable", "classConversation.html#a5879199008b96bee7550b576d614e1c1", null ],
+ [ "set_mode", "classConversation.html#a66f121ca4026246f86a732e5faa0682c", null ],
+ [ "set_profile_owner", "classConversation.html#a8898bddc1e8990e81dab9a13a532cc93", null ],
+ [ "$cipher", "classConversation.html#aa95c1a62af38bdfba7add9549bec083b", null ],
+ [ "$commentable", "classConversation.html#afd4965d22a6e4bfea2f35e931b3273c6", null ],
+ [ "$mode", "classConversation.html#afb03d1648dbfafe62caa1e30f32f2b1a", null ],
+ [ "$observer", "classConversation.html#a8748445aa26047ebed5141f3c3cbc244", null ],
+ [ "$prepared_item", "classConversation.html#a5b6adbb2fe24f0f53d6c22660dff91b2", null ],
+ [ "$preview", "classConversation.html#ae9937f9e0f3d927acc2bed46cc72e9ae", null ],
+ [ "$profile_owner", "classConversation.html#a2f12724ef0244e9049fe1bb9641b516d", null ],
+ [ "$threads", "classConversation.html#a41f4a549e6a99f98935c4742addd22c8", null ],
+ [ "$writable", "classConversation.html#ae81221251307e315f566a11f921ce0a9", null ]
+]; \ No newline at end of file
diff --git a/doc/html/classConversation.png b/doc/html/classConversation.png
new file mode 100644
index 000000000..c4ab9b0ed
--- /dev/null
+++ b/doc/html/classConversation.png
Binary files differ
diff --git a/doc/html/classFKOAuth1-members.html b/doc/html/classFKOAuth1-members.html
new file mode 100644
index 000000000..a04cf959f
--- /dev/null
+++ b/doc/html/classFKOAuth1-members.html
@@ -0,0 +1,119 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classFKOAuth1.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">FKOAuth1 Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classFKOAuth1.html">FKOAuth1</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="classFKOAuth1.html#a2f1276872329a6f0b704ccda1a4b9fa6">__construct</a>()</td><td class="entry"><a class="el" href="classFKOAuth1.html">FKOAuth1</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classFKOAuth1.html#a2b1dac2ed31fc6ef84668afdda8b263f">loginUser</a>($uid)</td><td class="entry"><a class="el" href="classFKOAuth1.html">FKOAuth1</a></td><td class="entry"></td></tr>
+</table></div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classFKOAuth1.html b/doc/html/classFKOAuth1.html
new file mode 100644
index 000000000..60db51336
--- /dev/null
+++ b/doc/html/classFKOAuth1.html
@@ -0,0 +1,169 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: FKOAuth1 Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classFKOAuth1.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="classFKOAuth1-members.html">List of all members</a> </div>
+ <div class="headertitle">
+<div class="title">FKOAuth1 Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="dynheader">
+Inheritance diagram for FKOAuth1:</div>
+<div class="dyncontent">
+ <div class="center">
+ <img src="classFKOAuth1.png" usemap="#FKOAuth1_map" alt=""/>
+ <map id="FKOAuth1_map" name="FKOAuth1_map">
+</map>
+ </div></div>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:a2f1276872329a6f0b704ccda1a4b9fa6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classFKOAuth1.html#a2f1276872329a6f0b704ccda1a4b9fa6">__construct</a> ()</td></tr>
+<tr class="separator:a2f1276872329a6f0b704ccda1a4b9fa6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2b1dac2ed31fc6ef84668afdda8b263f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classFKOAuth1.html#a2b1dac2ed31fc6ef84668afdda8b263f">loginUser</a> ($uid)</td></tr>
+<tr class="separator:a2b1dac2ed31fc6ef84668afdda8b263f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Constructor &amp; Destructor Documentation</h2>
+<a class="anchor" id="a2f1276872329a6f0b704ccda1a4b9fa6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">FKOAuth1::__construct </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Member Function Documentation</h2>
+<a class="anchor" id="a2b1dac2ed31fc6ef84668afdda8b263f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">FKOAuth1::loginUser </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>include/<a class="el" href="oauth_8php.html">oauth.php</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classFKOAuth1.js b/doc/html/classFKOAuth1.js
new file mode 100644
index 000000000..dbaf2c2d5
--- /dev/null
+++ b/doc/html/classFKOAuth1.js
@@ -0,0 +1,5 @@
+var classFKOAuth1 =
+[
+ [ "__construct", "classFKOAuth1.html#a2f1276872329a6f0b704ccda1a4b9fa6", null ],
+ [ "loginUser", "classFKOAuth1.html#a2b1dac2ed31fc6ef84668afdda8b263f", null ]
+]; \ No newline at end of file
diff --git a/doc/html/classFKOAuth1.png b/doc/html/classFKOAuth1.png
new file mode 100644
index 000000000..740172c10
--- /dev/null
+++ b/doc/html/classFKOAuth1.png
Binary files differ
diff --git a/doc/html/classFKOAuthDataStore-members.html b/doc/html/classFKOAuthDataStore-members.html
new file mode 100644
index 000000000..92f47bd79
--- /dev/null
+++ b/doc/html/classFKOAuthDataStore-members.html
@@ -0,0 +1,123 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classFKOAuthDataStore.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">FKOAuthDataStore Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classFKOAuthDataStore.html">FKOAuthDataStore</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="classFKOAuthDataStore.html#aa1a268be88ad3979bb4cc35bbb4dc819">gen_token</a>()</td><td class="entry"><a class="el" href="classFKOAuthDataStore.html">FKOAuthDataStore</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classFKOAuthDataStore.html#a1148d47b546350bf440bdd92792c5df1">lookup_consumer</a>($consumer_key)</td><td class="entry"><a class="el" href="classFKOAuthDataStore.html">FKOAuthDataStore</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classFKOAuthDataStore.html#a4edfe2e77ecd2e16ff6b5eb516ed3599">lookup_nonce</a>($consumer, $token, $nonce, $timestamp)</td><td class="entry"><a class="el" href="classFKOAuthDataStore.html">FKOAuthDataStore</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classFKOAuthDataStore.html#a96f76387c3a93b0abe27a98013804bab">lookup_token</a>($consumer, $token_type, $token)</td><td class="entry"><a class="el" href="classFKOAuthDataStore.html">FKOAuthDataStore</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classFKOAuthDataStore.html#a434882f03e3cdb171ed89e09e337e934">new_access_token</a>($token, $consumer, $verifier=null)</td><td class="entry"><a class="el" href="classFKOAuthDataStore.html">FKOAuthDataStore</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classFKOAuthDataStore.html#a431b44d70e3da6a8256ab38f710e3050">new_request_token</a>($consumer, $callback=null)</td><td class="entry"><a class="el" href="classFKOAuthDataStore.html">FKOAuthDataStore</a></td><td class="entry"></td></tr>
+</table></div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classFKOAuthDataStore.html b/doc/html/classFKOAuthDataStore.html
new file mode 100644
index 000000000..1abca9ae5
--- /dev/null
+++ b/doc/html/classFKOAuthDataStore.html
@@ -0,0 +1,306 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: FKOAuthDataStore Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classFKOAuthDataStore.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="classFKOAuthDataStore-members.html">List of all members</a> </div>
+ <div class="headertitle">
+<div class="title">FKOAuthDataStore Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="dynheader">
+Inheritance diagram for FKOAuthDataStore:</div>
+<div class="dyncontent">
+ <div class="center">
+ <img src="classFKOAuthDataStore.png" usemap="#FKOAuthDataStore_map" alt=""/>
+ <map id="FKOAuthDataStore_map" name="FKOAuthDataStore_map">
+</map>
+ </div></div>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:aa1a268be88ad3979bb4cc35bbb4dc819"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classFKOAuthDataStore.html#aa1a268be88ad3979bb4cc35bbb4dc819">gen_token</a> ()</td></tr>
+<tr class="separator:aa1a268be88ad3979bb4cc35bbb4dc819"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1148d47b546350bf440bdd92792c5df1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classFKOAuthDataStore.html#a1148d47b546350bf440bdd92792c5df1">lookup_consumer</a> ($consumer_key)</td></tr>
+<tr class="separator:a1148d47b546350bf440bdd92792c5df1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a96f76387c3a93b0abe27a98013804bab"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classFKOAuthDataStore.html#a96f76387c3a93b0abe27a98013804bab">lookup_token</a> ($consumer, $token_type, $token)</td></tr>
+<tr class="separator:a96f76387c3a93b0abe27a98013804bab"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4edfe2e77ecd2e16ff6b5eb516ed3599"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classFKOAuthDataStore.html#a4edfe2e77ecd2e16ff6b5eb516ed3599">lookup_nonce</a> ($consumer, $token, $nonce, $timestamp)</td></tr>
+<tr class="separator:a4edfe2e77ecd2e16ff6b5eb516ed3599"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a431b44d70e3da6a8256ab38f710e3050"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classFKOAuthDataStore.html#a431b44d70e3da6a8256ab38f710e3050">new_request_token</a> ($consumer, $callback=null)</td></tr>
+<tr class="separator:a431b44d70e3da6a8256ab38f710e3050"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a434882f03e3cdb171ed89e09e337e934"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classFKOAuthDataStore.html#a434882f03e3cdb171ed89e09e337e934">new_access_token</a> ($token, $consumer, $verifier=null)</td></tr>
+<tr class="separator:a434882f03e3cdb171ed89e09e337e934"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Member Function Documentation</h2>
+<a class="anchor" id="aa1a268be88ad3979bb4cc35bbb4dc819"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">FKOAuthDataStore::gen_token </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classFKOAuthDataStore.html#a434882f03e3cdb171ed89e09e337e934">new_access_token()</a>, and <a class="el" href="classFKOAuthDataStore.html#a431b44d70e3da6a8256ab38f710e3050">new_request_token()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a1148d47b546350bf440bdd92792c5df1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">FKOAuthDataStore::lookup_consumer </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$consumer_key</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a4edfe2e77ecd2e16ff6b5eb516ed3599"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">FKOAuthDataStore::lookup_nonce </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$consumer</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$token</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$nonce</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$timestamp</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a96f76387c3a93b0abe27a98013804bab"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">FKOAuthDataStore::lookup_token </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$consumer</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$token_type</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$token</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a434882f03e3cdb171ed89e09e337e934"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">FKOAuthDataStore::new_access_token </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$token</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$consumer</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$verifier</em> = <code>null</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a431b44d70e3da6a8256ab38f710e3050"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">FKOAuthDataStore::new_request_token </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$consumer</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$callback</em> = <code>null</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>include/<a class="el" href="oauth_8php.html">oauth.php</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classFKOAuthDataStore.js b/doc/html/classFKOAuthDataStore.js
new file mode 100644
index 000000000..29825cdac
--- /dev/null
+++ b/doc/html/classFKOAuthDataStore.js
@@ -0,0 +1,9 @@
+var classFKOAuthDataStore =
+[
+ [ "gen_token", "classFKOAuthDataStore.html#aa1a268be88ad3979bb4cc35bbb4dc819", null ],
+ [ "lookup_consumer", "classFKOAuthDataStore.html#a1148d47b546350bf440bdd92792c5df1", null ],
+ [ "lookup_nonce", "classFKOAuthDataStore.html#a4edfe2e77ecd2e16ff6b5eb516ed3599", null ],
+ [ "lookup_token", "classFKOAuthDataStore.html#a96f76387c3a93b0abe27a98013804bab", null ],
+ [ "new_access_token", "classFKOAuthDataStore.html#a434882f03e3cdb171ed89e09e337e934", null ],
+ [ "new_request_token", "classFKOAuthDataStore.html#a431b44d70e3da6a8256ab38f710e3050", null ]
+]; \ No newline at end of file
diff --git a/doc/html/classFKOAuthDataStore.png b/doc/html/classFKOAuthDataStore.png
new file mode 100644
index 000000000..1d61bd0de
--- /dev/null
+++ b/doc/html/classFKOAuthDataStore.png
Binary files differ
diff --git a/doc/html/classFriendicaSmarty-members.html b/doc/html/classFriendicaSmarty-members.html
new file mode 100644
index 000000000..e4f7ff597
--- /dev/null
+++ b/doc/html/classFriendicaSmarty-members.html
@@ -0,0 +1,120 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classFriendicaSmarty.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">FriendicaSmarty Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classFriendicaSmarty.html">FriendicaSmarty</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="classFriendicaSmarty.html#a33fabbd4d6eef869df496adf357ae690">$filename</a></td><td class="entry"><a class="el" href="classFriendicaSmarty.html">FriendicaSmarty</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classFriendicaSmarty.html#af12091b920b95eeef1218cbc48066ca6">__construct</a>()</td><td class="entry"><a class="el" href="classFriendicaSmarty.html">FriendicaSmarty</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classFriendicaSmarty.html#a6a4d4281d6fa9be1d37a97b188ffe8c9">parsed</a>($template= '')</td><td class="entry"><a class="el" href="classFriendicaSmarty.html">FriendicaSmarty</a></td><td class="entry"></td></tr>
+</table></div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classFriendicaSmarty.html b/doc/html/classFriendicaSmarty.html
new file mode 100644
index 000000000..e0edc33b3
--- /dev/null
+++ b/doc/html/classFriendicaSmarty.html
@@ -0,0 +1,188 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: FriendicaSmarty Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classFriendicaSmarty.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="#pub-attribs">Public Attributes</a> &#124;
+<a href="classFriendicaSmarty-members.html">List of all members</a> </div>
+ <div class="headertitle">
+<div class="title">FriendicaSmarty Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="dynheader">
+Inheritance diagram for FriendicaSmarty:</div>
+<div class="dyncontent">
+ <div class="center">
+ <img src="classFriendicaSmarty.png" usemap="#FriendicaSmarty_map" alt=""/>
+ <map id="FriendicaSmarty_map" name="FriendicaSmarty_map">
+</map>
+ </div></div>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:af12091b920b95eeef1218cbc48066ca6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classFriendicaSmarty.html#af12091b920b95eeef1218cbc48066ca6">__construct</a> ()</td></tr>
+<tr class="separator:af12091b920b95eeef1218cbc48066ca6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6a4d4281d6fa9be1d37a97b188ffe8c9"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classFriendicaSmarty.html#a6a4d4281d6fa9be1d37a97b188ffe8c9">parsed</a> ($template= '')</td></tr>
+<tr class="separator:a6a4d4281d6fa9be1d37a97b188ffe8c9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Public Attributes</h2></td></tr>
+<tr class="memitem:a33fabbd4d6eef869df496adf357ae690"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classFriendicaSmarty.html#a33fabbd4d6eef869df496adf357ae690">$filename</a></td></tr>
+<tr class="separator:a33fabbd4d6eef869df496adf357ae690"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Constructor &amp; Destructor Documentation</h2>
+<a class="anchor" id="af12091b920b95eeef1218cbc48066ca6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">FriendicaSmarty::__construct </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Member Function Documentation</h2>
+<a class="anchor" id="a6a4d4281d6fa9be1d37a97b188ffe8c9"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">FriendicaSmarty::parsed </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$template</em> = <code>''</code></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Member Data Documentation</h2>
+<a class="anchor" id="a33fabbd4d6eef869df496adf357ae690"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">FriendicaSmarty::$filename</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>include/<a class="el" href="friendica__smarty_8php.html">friendica_smarty.php</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classFriendicaSmarty.js b/doc/html/classFriendicaSmarty.js
new file mode 100644
index 000000000..eded144b6
--- /dev/null
+++ b/doc/html/classFriendicaSmarty.js
@@ -0,0 +1,6 @@
+var classFriendicaSmarty =
+[
+ [ "__construct", "classFriendicaSmarty.html#af12091b920b95eeef1218cbc48066ca6", null ],
+ [ "parsed", "classFriendicaSmarty.html#a6a4d4281d6fa9be1d37a97b188ffe8c9", null ],
+ [ "$filename", "classFriendicaSmarty.html#a33fabbd4d6eef869df496adf357ae690", null ]
+]; \ No newline at end of file
diff --git a/doc/html/classFriendicaSmarty.png b/doc/html/classFriendicaSmarty.png
new file mode 100644
index 000000000..a2fffb758
--- /dev/null
+++ b/doc/html/classFriendicaSmarty.png
Binary files differ
diff --git a/doc/html/classFriendicaSmartyEngine-members.html b/doc/html/classFriendicaSmartyEngine-members.html
new file mode 100644
index 000000000..b63f0e70a
--- /dev/null
+++ b/doc/html/classFriendicaSmartyEngine-members.html
@@ -0,0 +1,122 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classFriendicaSmartyEngine.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">FriendicaSmartyEngine Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classFriendicaSmartyEngine.html">FriendicaSmartyEngine</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="classFriendicaSmartyEngine.html#aaba6a42101bc9ae32e36b7fa2e243f02">$name</a></td><td class="entry"><a class="el" href="classFriendicaSmartyEngine.html">FriendicaSmartyEngine</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classFriendicaSmartyEngine.html#ab7c305bd8c386c2944e4dc9136cea5b6">__construct</a>()</td><td class="entry"><a class="el" href="classFriendicaSmartyEngine.html">FriendicaSmartyEngine</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classFriendicaSmartyEngine.html#a35ec0ee828c36640ea25296bcb84a118">get_intltext_template</a>($file, $root='')</td><td class="entry"><a class="el" href="classFriendicaSmartyEngine.html">FriendicaSmartyEngine</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classFriendicaSmartyEngine.html#aab5994077fc3a64222e41b28e2bd8d88">get_markup_template</a>($file, $root='')</td><td class="entry"><a class="el" href="classFriendicaSmartyEngine.html">FriendicaSmartyEngine</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classFriendicaSmartyEngine.html#ad62f1181d2f02b54b46731ad2bd46db2">replace_macros</a>($s, $r)</td><td class="entry"><a class="el" href="classFriendicaSmartyEngine.html">FriendicaSmartyEngine</a></td><td class="entry"></td></tr>
+</table></div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classFriendicaSmartyEngine.html b/doc/html/classFriendicaSmartyEngine.html
new file mode 100644
index 000000000..756258847
--- /dev/null
+++ b/doc/html/classFriendicaSmartyEngine.html
@@ -0,0 +1,267 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: FriendicaSmartyEngine Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classFriendicaSmartyEngine.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="#pub-static-attribs">Static Public Attributes</a> &#124;
+<a href="classFriendicaSmartyEngine-members.html">List of all members</a> </div>
+ <div class="headertitle">
+<div class="title">FriendicaSmartyEngine Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="dynheader">
+Inheritance diagram for FriendicaSmartyEngine:</div>
+<div class="dyncontent">
+ <div class="center">
+ <img src="classFriendicaSmartyEngine.png" usemap="#FriendicaSmartyEngine_map" alt=""/>
+ <map id="FriendicaSmartyEngine_map" name="FriendicaSmartyEngine_map">
+<area href="interfaceITemplateEngine.html" alt="ITemplateEngine" shape="rect" coords="0,0,144,24"/>
+</map>
+ </div></div>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:ab7c305bd8c386c2944e4dc9136cea5b6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classFriendicaSmartyEngine.html#ab7c305bd8c386c2944e4dc9136cea5b6">__construct</a> ()</td></tr>
+<tr class="separator:ab7c305bd8c386c2944e4dc9136cea5b6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad62f1181d2f02b54b46731ad2bd46db2"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classFriendicaSmartyEngine.html#ad62f1181d2f02b54b46731ad2bd46db2">replace_macros</a> ($s, $r)</td></tr>
+<tr class="separator:ad62f1181d2f02b54b46731ad2bd46db2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aab5994077fc3a64222e41b28e2bd8d88"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classFriendicaSmartyEngine.html#aab5994077fc3a64222e41b28e2bd8d88">get_markup_template</a> ($file, $root='')</td></tr>
+<tr class="separator:aab5994077fc3a64222e41b28e2bd8d88"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a35ec0ee828c36640ea25296bcb84a118"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classFriendicaSmartyEngine.html#a35ec0ee828c36640ea25296bcb84a118">get_intltext_template</a> ($file, $root='')</td></tr>
+<tr class="separator:a35ec0ee828c36640ea25296bcb84a118"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-static-attribs"></a>
+Static Public Attributes</h2></td></tr>
+<tr class="memitem:aaba6a42101bc9ae32e36b7fa2e243f02"><td class="memItemLeft" align="right" valign="top">static&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classFriendicaSmartyEngine.html#aaba6a42101bc9ae32e36b7fa2e243f02">$name</a> =&quot;smarty3&quot;</td></tr>
+<tr class="separator:aaba6a42101bc9ae32e36b7fa2e243f02"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Constructor &amp; Destructor Documentation</h2>
+<a class="anchor" id="ab7c305bd8c386c2944e4dc9136cea5b6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">FriendicaSmartyEngine::__construct </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Member Function Documentation</h2>
+<a class="anchor" id="a35ec0ee828c36640ea25296bcb84a118"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">FriendicaSmartyEngine::get_intltext_template </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$file</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$root</em> = <code>''</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aab5994077fc3a64222e41b28e2bd8d88"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">FriendicaSmartyEngine::get_markup_template </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$file</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$root</em> = <code>''</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Implements <a class="el" href="interfaceITemplateEngine.html#aaf2698adbf46c073c24b162fe1b1c442">ITemplateEngine</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ad62f1181d2f02b54b46731ad2bd46db2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">FriendicaSmartyEngine::replace_macros </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$r</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Implements <a class="el" href="interfaceITemplateEngine.html#aaa7381c8becc3d1c1790b53988a0f243">ITemplateEngine</a>.</p>
+
+</div>
+</div>
+<h2 class="groupheader">Member Data Documentation</h2>
+<a class="anchor" id="aaba6a42101bc9ae32e36b7fa2e243f02"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">FriendicaSmartyEngine::$name =&quot;smarty3&quot;</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>include/<a class="el" href="friendica__smarty_8php.html">friendica_smarty.php</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classFriendicaSmartyEngine.js b/doc/html/classFriendicaSmartyEngine.js
new file mode 100644
index 000000000..cabd197d1
--- /dev/null
+++ b/doc/html/classFriendicaSmartyEngine.js
@@ -0,0 +1,7 @@
+var classFriendicaSmartyEngine =
+[
+ [ "__construct", "classFriendicaSmartyEngine.html#ab7c305bd8c386c2944e4dc9136cea5b6", null ],
+ [ "get_intltext_template", "classFriendicaSmartyEngine.html#a35ec0ee828c36640ea25296bcb84a118", null ],
+ [ "get_markup_template", "classFriendicaSmartyEngine.html#aab5994077fc3a64222e41b28e2bd8d88", null ],
+ [ "replace_macros", "classFriendicaSmartyEngine.html#ad62f1181d2f02b54b46731ad2bd46db2", null ]
+]; \ No newline at end of file
diff --git a/doc/html/classFriendicaSmartyEngine.png b/doc/html/classFriendicaSmartyEngine.png
new file mode 100644
index 000000000..afe04a5fc
--- /dev/null
+++ b/doc/html/classFriendicaSmartyEngine.png
Binary files differ
diff --git a/doc/html/classItem-members.html b/doc/html/classItem-members.html
new file mode 100644
index 000000000..3da704b93
--- /dev/null
+++ b/doc/html/classItem-members.html
@@ -0,0 +1,165 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classItem.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">Item Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classItem.html">Item</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="classItem.html#acc32426c0f465391be8a99ad810c7b8e">$channel</a></td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classItem.html#a80dcd0fb7673776c0967839d429c2a0f">$children</a></td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classItem.html#a90743c8348b13213275c223bb9333aa0">$comment_box_template</a></td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classItem.html#aa2c221231ad0fc3720ccc1f00f0c6304">$commentable</a></td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classItem.html#a007424e3e3171dcfb4312a02161da6cd">$conversation</a></td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classItem.html#aec24e233f9098f902b1e57e60dcb2019">$data</a></td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classItem.html#a9594df6014b0b6f45364ea7a34510130">$owner_name</a></td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classItem.html#a078f95b4134ce3a1df344cf8d386f986">$owner_photo</a></td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classItem.html#afa54851df82962c7c42dea3cc9f5c92c">$owner_url</a></td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classItem.html#a1a1e42877e6ac7af50286142ceb483d2">$parent</a></td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classItem.html#a5b561415861f5b89b0733aacfe0428d1">$redirect_url</a></td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classItem.html#a7f7bc059de377319282cb4ef4a828480">$template</a></td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classItem.html#a1cb6aa8abdf7ea7daca647e40c8ea3a2">$threaded</a></td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classItem.html#a5cfa6cf964f433a917a81cab079ff9d8">$toplevel</a></td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classItem.html#a4a123ae98987c1e30ecb15c4edf5a3b8">$visiting</a></td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classItem.html#a5d29ddecc073151a65a8e2ea2f6e4189">$wall_to_wall</a></td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classItem.html#a248f45871ecfe82a08d1d4c0769b2eb2">__construct</a>($data)</td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classItem.html#a80dcd9d0f548c3ad550abe7e6981fb51">add_child</a>($item)</td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classItem.html#abcdb0ea9bcd1576bc99bba9b8f700bb8">check_wall_to_wall</a>()</td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classItem.html#aca1e66988ed00cd627b2a359b72cd0ae">count_descendants</a>()</td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classBaseObject.html#ac43f10e69ce80c78e4870636250fc8a2">get_app</a>()</td><td class="entry"><a class="el" href="classBaseObject.html">BaseObject</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classItem.html#a632185dd25c5caf277067c76230a4320">get_child</a>($id)</td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classItem.html#aa0ee775ec94abccec6c798428835d001">get_children</a>()</td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classItem.html#a3ee7667c2ec6cd7657328e27848c0bdf">get_comment_box</a>($indent)</td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classItem.html#a904421c7a427411bb2ab473bca872f63">get_comment_box_template</a>()</td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classItem.html#a0c301aaed2b7d682728d18db3a22afa3">get_conversation</a>()</td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classItem.html#ad3638f93065693c1f69eb349feb1b7aa">get_data</a>()</td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classItem.html#ac6f1c96cc82a0dfb7e881fc70309ea3c">get_data_value</a>($name)</td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classItem.html#ac0f27e58532612f6e7a54c8a621b9b92">get_id</a>()</td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classItem.html#a67892aa23d19f4431bb2e5f43c74000e">get_owner_name</a>()</td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classItem.html#aa541bc4290e51bfd688d6921bebabc73">get_owner_photo</a>()</td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classItem.html#a9f2d219da712390f59012fc32a342074">get_owner_url</a>()</td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classItem.html#a4b92e3a9d6212c553aa2661489bd95d8">get_parent</a>()</td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classItem.html#a428f448f89a8629055ea3294eb942aea">get_redirect_url</a>()</td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classItem.html#aba23a0a9d89e316d2b343cc46d695d91">get_template</a>()</td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">get_template_data</a>($alike, $dlike, $thread_level=1)</td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classItem.html#ac04525a8be24c12b0a2ae4ca1ba4b967">is_commentable</a>()</td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classItem.html#a5b2fafdca55aefeaa08993a5a60529f0">is_threaded</a>()</td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classItem.html#aa49e40f961dff66da32c5ae110e32993">is_toplevel</a>()</td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classItem.html#a97c7feeea7f26a73176cb19faa455e12">is_visiting</a>()</td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classItem.html#aabf87ded59c25b5fe2b2296678e70509">is_wall_to_wall</a>()</td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classItem.html#a2ce70ef63f9f4d86a09c351678806925">remove_child</a>($item)</td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classItem.html#aa452b5bcd8dea12119b09212c615cb41">remove_parent</a>()</td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classBaseObject.html#a0a9acda12d751692834cf6999f889223">set_app</a>($app)</td><td class="entry"><a class="el" href="classBaseObject.html">BaseObject</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classItem.html#aa1bd19fc8b5577078530265a7bf64123">set_commentable</a>($val)</td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classItem.html#aa8b1bbc4236890694635295e46d7fd72">set_conversation</a>($conv)</td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classItem.html#a9890ff72662d5bba301d1f2dd8aec9d7">set_parent</a>($item)</td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classItem.html#af1b73df9b7c4b927e26b7e243b491f42">set_template</a>($t)</td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+</table></div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classItem.html b/doc/html/classItem.html
new file mode 100644
index 000000000..2fccecd96
--- /dev/null
+++ b/doc/html/classItem.html
@@ -0,0 +1,1264 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Item Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classItem.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="#pub-attribs">Public Attributes</a> &#124;
+<a href="#pro-methods">Protected Member Functions</a> &#124;
+<a href="#pri-methods">Private Member Functions</a> &#124;
+<a href="#pri-attribs">Private Attributes</a> &#124;
+<a href="classItem-members.html">List of all members</a> </div>
+ <div class="headertitle">
+<div class="title">Item Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="dynheader">
+Inheritance diagram for Item:</div>
+<div class="dyncontent">
+ <div class="center">
+ <img src="classItem.png" usemap="#Item_map" alt=""/>
+ <map id="Item_map" name="Item_map">
+<area href="classBaseObject.html" alt="BaseObject" shape="rect" coords="0,0,77,24"/>
+</map>
+ </div></div>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:a248f45871ecfe82a08d1d4c0769b2eb2"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#a248f45871ecfe82a08d1d4c0769b2eb2">__construct</a> ($data)</td></tr>
+<tr class="separator:a248f45871ecfe82a08d1d4c0769b2eb2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad5dcbe0b94cb2d5719bc5b6bd8ad60c8"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">get_template_data</a> ($alike, $dlike, $thread_level=1)</td></tr>
+<tr class="separator:ad5dcbe0b94cb2d5719bc5b6bd8ad60c8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac0f27e58532612f6e7a54c8a621b9b92"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#ac0f27e58532612f6e7a54c8a621b9b92">get_id</a> ()</td></tr>
+<tr class="separator:ac0f27e58532612f6e7a54c8a621b9b92"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5b2fafdca55aefeaa08993a5a60529f0"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#a5b2fafdca55aefeaa08993a5a60529f0">is_threaded</a> ()</td></tr>
+<tr class="separator:a5b2fafdca55aefeaa08993a5a60529f0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa1bd19fc8b5577078530265a7bf64123"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#aa1bd19fc8b5577078530265a7bf64123">set_commentable</a> ($val)</td></tr>
+<tr class="separator:aa1bd19fc8b5577078530265a7bf64123"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac04525a8be24c12b0a2ae4ca1ba4b967"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#ac04525a8be24c12b0a2ae4ca1ba4b967">is_commentable</a> ()</td></tr>
+<tr class="separator:ac04525a8be24c12b0a2ae4ca1ba4b967"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a80dcd9d0f548c3ad550abe7e6981fb51"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#a80dcd9d0f548c3ad550abe7e6981fb51">add_child</a> ($item)</td></tr>
+<tr class="separator:a80dcd9d0f548c3ad550abe7e6981fb51"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a632185dd25c5caf277067c76230a4320"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#a632185dd25c5caf277067c76230a4320">get_child</a> ($id)</td></tr>
+<tr class="separator:a632185dd25c5caf277067c76230a4320"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa0ee775ec94abccec6c798428835d001"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#aa0ee775ec94abccec6c798428835d001">get_children</a> ()</td></tr>
+<tr class="separator:aa0ee775ec94abccec6c798428835d001"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2ce70ef63f9f4d86a09c351678806925"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#a2ce70ef63f9f4d86a09c351678806925">remove_child</a> ($item)</td></tr>
+<tr class="separator:a2ce70ef63f9f4d86a09c351678806925"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa8b1bbc4236890694635295e46d7fd72"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#aa8b1bbc4236890694635295e46d7fd72">set_conversation</a> ($conv)</td></tr>
+<tr class="separator:aa8b1bbc4236890694635295e46d7fd72"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0c301aaed2b7d682728d18db3a22afa3"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#a0c301aaed2b7d682728d18db3a22afa3">get_conversation</a> ()</td></tr>
+<tr class="separator:a0c301aaed2b7d682728d18db3a22afa3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad3638f93065693c1f69eb349feb1b7aa"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#ad3638f93065693c1f69eb349feb1b7aa">get_data</a> ()</td></tr>
+<tr class="separator:ad3638f93065693c1f69eb349feb1b7aa"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac6f1c96cc82a0dfb7e881fc70309ea3c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#ac6f1c96cc82a0dfb7e881fc70309ea3c">get_data_value</a> ($name)</td></tr>
+<tr class="separator:ac6f1c96cc82a0dfb7e881fc70309ea3c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="inherit_header pub_methods_classBaseObject"><td colspan="2" onclick="javascript:toggleInherit('pub_methods_classBaseObject')"><img src="closed.png" alt="-"/>&#160;Public Member Functions inherited from <a class="el" href="classBaseObject.html">BaseObject</a></td></tr>
+<tr class="memitem:ac43f10e69ce80c78e4870636250fc8a2 inherit pub_methods_classBaseObject"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classBaseObject.html#ac43f10e69ce80c78e4870636250fc8a2">get_app</a> ()</td></tr>
+<tr class="separator:ac43f10e69ce80c78e4870636250fc8a2 inherit pub_methods_classBaseObject"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Public Attributes</h2></td></tr>
+<tr class="memitem:aec24e233f9098f902b1e57e60dcb2019"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#aec24e233f9098f902b1e57e60dcb2019">$data</a> = array()</td></tr>
+<tr class="separator:aec24e233f9098f902b1e57e60dcb2019"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pro-methods"></a>
+Protected Member Functions</h2></td></tr>
+<tr class="memitem:a9890ff72662d5bba301d1f2dd8aec9d7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#a9890ff72662d5bba301d1f2dd8aec9d7">set_parent</a> ($item)</td></tr>
+<tr class="separator:a9890ff72662d5bba301d1f2dd8aec9d7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa452b5bcd8dea12119b09212c615cb41"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#aa452b5bcd8dea12119b09212c615cb41">remove_parent</a> ()</td></tr>
+<tr class="separator:aa452b5bcd8dea12119b09212c615cb41"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4b92e3a9d6212c553aa2661489bd95d8"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#a4b92e3a9d6212c553aa2661489bd95d8">get_parent</a> ()</td></tr>
+<tr class="separator:a4b92e3a9d6212c553aa2661489bd95d8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abcdb0ea9bcd1576bc99bba9b8f700bb8"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#abcdb0ea9bcd1576bc99bba9b8f700bb8">check_wall_to_wall</a> ()</td></tr>
+<tr class="separator:abcdb0ea9bcd1576bc99bba9b8f700bb8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pri-methods"></a>
+Private Member Functions</h2></td></tr>
+<tr class="memitem:aba23a0a9d89e316d2b343cc46d695d91"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#aba23a0a9d89e316d2b343cc46d695d91">get_template</a> ()</td></tr>
+<tr class="separator:aba23a0a9d89e316d2b343cc46d695d91"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af1b73df9b7c4b927e26b7e243b491f42"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#af1b73df9b7c4b927e26b7e243b491f42">set_template</a> ($<a class="el" href="language_8php.html#aae0c3638fb476ae1e31f8d242f5dac04">t</a>)</td></tr>
+<tr class="separator:af1b73df9b7c4b927e26b7e243b491f42"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa49e40f961dff66da32c5ae110e32993"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#aa49e40f961dff66da32c5ae110e32993">is_toplevel</a> ()</td></tr>
+<tr class="separator:aa49e40f961dff66da32c5ae110e32993"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aca1e66988ed00cd627b2a359b72cd0ae"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#aca1e66988ed00cd627b2a359b72cd0ae">count_descendants</a> ()</td></tr>
+<tr class="separator:aca1e66988ed00cd627b2a359b72cd0ae"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a904421c7a427411bb2ab473bca872f63"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#a904421c7a427411bb2ab473bca872f63">get_comment_box_template</a> ()</td></tr>
+<tr class="separator:a904421c7a427411bb2ab473bca872f63"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3ee7667c2ec6cd7657328e27848c0bdf"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#a3ee7667c2ec6cd7657328e27848c0bdf">get_comment_box</a> ($indent)</td></tr>
+<tr class="separator:a3ee7667c2ec6cd7657328e27848c0bdf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a428f448f89a8629055ea3294eb942aea"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#a428f448f89a8629055ea3294eb942aea">get_redirect_url</a> ()</td></tr>
+<tr class="separator:a428f448f89a8629055ea3294eb942aea"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aabf87ded59c25b5fe2b2296678e70509"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#aabf87ded59c25b5fe2b2296678e70509">is_wall_to_wall</a> ()</td></tr>
+<tr class="separator:aabf87ded59c25b5fe2b2296678e70509"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9f2d219da712390f59012fc32a342074"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#a9f2d219da712390f59012fc32a342074">get_owner_url</a> ()</td></tr>
+<tr class="separator:a9f2d219da712390f59012fc32a342074"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa541bc4290e51bfd688d6921bebabc73"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#aa541bc4290e51bfd688d6921bebabc73">get_owner_photo</a> ()</td></tr>
+<tr class="separator:aa541bc4290e51bfd688d6921bebabc73"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a67892aa23d19f4431bb2e5f43c74000e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#a67892aa23d19f4431bb2e5f43c74000e">get_owner_name</a> ()</td></tr>
+<tr class="separator:a67892aa23d19f4431bb2e5f43c74000e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a97c7feeea7f26a73176cb19faa455e12"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#a97c7feeea7f26a73176cb19faa455e12">is_visiting</a> ()</td></tr>
+<tr class="separator:a97c7feeea7f26a73176cb19faa455e12"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pri-attribs"></a>
+Private Attributes</h2></td></tr>
+<tr class="memitem:a7f7bc059de377319282cb4ef4a828480"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#a7f7bc059de377319282cb4ef4a828480">$template</a> = 'conv_item.tpl'</td></tr>
+<tr class="separator:a7f7bc059de377319282cb4ef4a828480"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a90743c8348b13213275c223bb9333aa0"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#a90743c8348b13213275c223bb9333aa0">$comment_box_template</a> = 'comment_item.tpl'</td></tr>
+<tr class="separator:a90743c8348b13213275c223bb9333aa0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa2c221231ad0fc3720ccc1f00f0c6304"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#aa2c221231ad0fc3720ccc1f00f0c6304">$commentable</a> = false</td></tr>
+<tr class="separator:aa2c221231ad0fc3720ccc1f00f0c6304"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5cfa6cf964f433a917a81cab079ff9d8"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#a5cfa6cf964f433a917a81cab079ff9d8">$toplevel</a> = false</td></tr>
+<tr class="separator:a5cfa6cf964f433a917a81cab079ff9d8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a80dcd0fb7673776c0967839d429c2a0f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#a80dcd0fb7673776c0967839d429c2a0f">$children</a> = array()</td></tr>
+<tr class="separator:a80dcd0fb7673776c0967839d429c2a0f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1a1e42877e6ac7af50286142ceb483d2"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#a1a1e42877e6ac7af50286142ceb483d2">$parent</a> = null</td></tr>
+<tr class="separator:a1a1e42877e6ac7af50286142ceb483d2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a007424e3e3171dcfb4312a02161da6cd"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#a007424e3e3171dcfb4312a02161da6cd">$conversation</a> = null</td></tr>
+<tr class="separator:a007424e3e3171dcfb4312a02161da6cd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5b561415861f5b89b0733aacfe0428d1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#a5b561415861f5b89b0733aacfe0428d1">$redirect_url</a> = null</td></tr>
+<tr class="separator:a5b561415861f5b89b0733aacfe0428d1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afa54851df82962c7c42dea3cc9f5c92c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#afa54851df82962c7c42dea3cc9f5c92c">$owner_url</a> = ''</td></tr>
+<tr class="separator:afa54851df82962c7c42dea3cc9f5c92c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a078f95b4134ce3a1df344cf8d386f986"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#a078f95b4134ce3a1df344cf8d386f986">$owner_photo</a> = ''</td></tr>
+<tr class="separator:a078f95b4134ce3a1df344cf8d386f986"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9594df6014b0b6f45364ea7a34510130"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#a9594df6014b0b6f45364ea7a34510130">$owner_name</a> = ''</td></tr>
+<tr class="separator:a9594df6014b0b6f45364ea7a34510130"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5d29ddecc073151a65a8e2ea2f6e4189"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#a5d29ddecc073151a65a8e2ea2f6e4189">$wall_to_wall</a> = false</td></tr>
+<tr class="separator:a5d29ddecc073151a65a8e2ea2f6e4189"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1cb6aa8abdf7ea7daca647e40c8ea3a2"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#a1cb6aa8abdf7ea7daca647e40c8ea3a2">$threaded</a> = false</td></tr>
+<tr class="separator:a1cb6aa8abdf7ea7daca647e40c8ea3a2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4a123ae98987c1e30ecb15c4edf5a3b8"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#a4a123ae98987c1e30ecb15c4edf5a3b8">$visiting</a> = false</td></tr>
+<tr class="separator:a4a123ae98987c1e30ecb15c4edf5a3b8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acc32426c0f465391be8a99ad810c7b8e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#acc32426c0f465391be8a99ad810c7b8e">$channel</a> = null</td></tr>
+<tr class="separator:acc32426c0f465391be8a99ad810c7b8e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="inherited"></a>
+Additional Inherited Members</h2></td></tr>
+<tr class="inherit_header pub_static_methods_classBaseObject"><td colspan="2" onclick="javascript:toggleInherit('pub_static_methods_classBaseObject')"><img src="closed.png" alt="-"/>&#160;Static Public Member Functions inherited from <a class="el" href="classBaseObject.html">BaseObject</a></td></tr>
+<tr class="memitem:a0a9acda12d751692834cf6999f889223 inherit pub_static_methods_classBaseObject"><td class="memItemLeft" align="right" valign="top">static&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classBaseObject.html#a0a9acda12d751692834cf6999f889223">set_app</a> ($app)</td></tr>
+<tr class="separator:a0a9acda12d751692834cf6999f889223 inherit pub_static_methods_classBaseObject"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>An item </p>
+</div><h2 class="groupheader">Constructor &amp; Destructor Documentation</h2>
+<a class="anchor" id="a248f45871ecfe82a08d1d4c0769b2eb2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::__construct </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$data</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Member Function Documentation</h2>
+<a class="anchor" id="a80dcd9d0f548c3ad550abe7e6981fb51"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::add_child </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Add a child item </p>
+
+<p>Referenced by <a class="el" href="classItem.html#a248f45871ecfe82a08d1d4c0769b2eb2">__construct()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="abcdb0ea9bcd1576bc99bba9b8f700bb8"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::check_wall_to_wall </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+<p>Check if we are a wall to wall item and set the relevant properties </p>
+
+<p>Referenced by <a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">get_template_data()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aca1e66988ed00cd627b2a359b72cd0ae"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::count_descendants </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+<p>Count the total of our descendants </p>
+
+<p>Referenced by <a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">get_template_data()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a632185dd25c5caf277067c76230a4320"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::get_child </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$id</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Get a child by its ID </p>
+
+<p>Referenced by <a class="el" href="classItem.html#a80dcd9d0f548c3ad550abe7e6981fb51">add_child()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa0ee775ec94abccec6c798428835d001"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::get_children </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Get all our children </p>
+
+<p>Referenced by <a class="el" href="classItem.html#aca1e66988ed00cd627b2a359b72cd0ae">count_descendants()</a>, <a class="el" href="classItem.html#a632185dd25c5caf277067c76230a4320">get_child()</a>, <a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">get_template_data()</a>, <a class="el" href="classItem.html#a2ce70ef63f9f4d86a09c351678806925">remove_child()</a>, <a class="el" href="classItem.html#aa1bd19fc8b5577078530265a7bf64123">set_commentable()</a>, and <a class="el" href="classItem.html#aa8b1bbc4236890694635295e46d7fd72">set_conversation()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a3ee7667c2ec6cd7657328e27848c0bdf"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::get_comment_box </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$indent</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+<p>Get the comment box</p>
+<p>Returns: _ The comment box string (empty if no comment box) _ false on failure </p>
+
+<p>Referenced by <a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">get_template_data()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a904421c7a427411bb2ab473bca872f63"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::get_comment_box_template </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+<p>Get the template for the comment box </p>
+
+<p>Referenced by <a class="el" href="classItem.html#a3ee7667c2ec6cd7657328e27848c0bdf">get_comment_box()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a0c301aaed2b7d682728d18db3a22afa3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::get_conversation </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>get conversation </p>
+
+<p>Referenced by <a class="el" href="classItem.html#abcdb0ea9bcd1576bc99bba9b8f700bb8">check_wall_to_wall()</a>, <a class="el" href="classItem.html#a3ee7667c2ec6cd7657328e27848c0bdf">get_comment_box()</a>, and <a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">get_template_data()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ad3638f93065693c1f69eb349feb1b7aa"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::get_data </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Get raw data</p>
+<p>We shouldn't need this </p>
+
+<p>Referenced by <a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">get_template_data()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ac6f1c96cc82a0dfb7e881fc70309ea3c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::get_data_value </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$name</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Get a data value</p>
+<p>Returns: _ value on success _ false on failure </p>
+
+<p>Referenced by <a class="el" href="classItem.html#a248f45871ecfe82a08d1d4c0769b2eb2">__construct()</a>, <a class="el" href="classItem.html#abcdb0ea9bcd1576bc99bba9b8f700bb8">check_wall_to_wall()</a>, <a class="el" href="classItem.html#ac0f27e58532612f6e7a54c8a621b9b92">get_id()</a>, and <a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">get_template_data()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ac0f27e58532612f6e7a54c8a621b9b92"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::get_id </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classItem.html#a248f45871ecfe82a08d1d4c0769b2eb2">__construct()</a>, <a class="el" href="classItem.html#a3ee7667c2ec6cd7657328e27848c0bdf">get_comment_box()</a>, and <a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">get_template_data()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a67892aa23d19f4431bb2e5f43c74000e"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::get_owner_name </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">get_template_data()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa541bc4290e51bfd688d6921bebabc73"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::get_owner_photo </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">get_template_data()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a9f2d219da712390f59012fc32a342074"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::get_owner_url </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">get_template_data()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a4b92e3a9d6212c553aa2661489bd95d8"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::get_parent </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+<p>Get parent item </p>
+
+<p>Referenced by <a class="el" href="classItem.html#a9890ff72662d5bba301d1f2dd8aec9d7">set_parent()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a428f448f89a8629055ea3294eb942aea"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::get_redirect_url </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aba23a0a9d89e316d2b343cc46d695d91"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::get_template </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+<p>Get template </p>
+
+<p>Referenced by <a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">get_template_data()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ad5dcbe0b94cb2d5719bc5b6bd8ad60c8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::get_template_data </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$alike</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$dlike</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$thread_level</em> = <code>1</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Get data in a form usable by a conversation template</p>
+<p>Returns: _ The data requested on success _ false on failure </p>
+
+</div>
+</div>
+<a class="anchor" id="ac04525a8be24c12b0a2ae4ca1ba4b967"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::is_commentable </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classItem.html#a3ee7667c2ec6cd7657328e27848c0bdf">get_comment_box()</a>, and <a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">get_template_data()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a5b2fafdca55aefeaa08993a5a60529f0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::is_threaded </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classItem.html#a3ee7667c2ec6cd7657328e27848c0bdf">get_comment_box()</a>, and <a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">get_template_data()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa49e40f961dff66da32c5ae110e32993"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::is_toplevel </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+<p>Check if this is a toplevel post </p>
+
+<p>Referenced by <a class="el" href="classItem.html#abcdb0ea9bcd1576bc99bba9b8f700bb8">check_wall_to_wall()</a>, <a class="el" href="classItem.html#a3ee7667c2ec6cd7657328e27848c0bdf">get_comment_box()</a>, and <a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">get_template_data()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a97c7feeea7f26a73176cb19faa455e12"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::is_visiting </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aabf87ded59c25b5fe2b2296678e70509"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::is_wall_to_wall </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a2ce70ef63f9f4d86a09c351678806925"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::remove_child </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Remove a child </p>
+
+</div>
+</div>
+<a class="anchor" id="aa452b5bcd8dea12119b09212c615cb41"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::remove_parent </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+<p>Remove our parent </p>
+
+</div>
+</div>
+<a class="anchor" id="aa1bd19fc8b5577078530265a7bf64123"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::set_commentable </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$val</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aa8b1bbc4236890694635295e46d7fd72"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::set_conversation </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$conv</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>set conversation </p>
+
+<p>Referenced by <a class="el" href="classItem.html#a9890ff72662d5bba301d1f2dd8aec9d7">set_parent()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a9890ff72662d5bba301d1f2dd8aec9d7"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::set_parent </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+<p>Set our parent </p>
+
+</div>
+</div>
+<a class="anchor" id="af1b73df9b7c4b927e26b7e243b491f42"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::set_template </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$t</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Member Data Documentation</h2>
+<a class="anchor" id="acc32426c0f465391be8a99ad810c7b8e"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::$channel = null</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a80dcd0fb7673776c0967839d429c2a0f"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::$children = array()</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classItem.html#aca1e66988ed00cd627b2a359b72cd0ae">count_descendants()</a>, <a class="el" href="classItem.html#aa0ee775ec94abccec6c798428835d001">get_children()</a>, and <a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">get_template_data()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a90743c8348b13213275c223bb9333aa0"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::$comment_box_template = 'comment_item.tpl'</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classItem.html#a904421c7a427411bb2ab473bca872f63">get_comment_box_template()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa2c221231ad0fc3720ccc1f00f0c6304"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::$commentable = false</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classItem.html#ac04525a8be24c12b0a2ae4ca1ba4b967">is_commentable()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a007424e3e3171dcfb4312a02161da6cd"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::$conversation = null</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classItem.html#a0c301aaed2b7d682728d18db3a22afa3">get_conversation()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aec24e233f9098f902b1e57e60dcb2019"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::$data = array()</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classItem.html#a248f45871ecfe82a08d1d4c0769b2eb2">__construct()</a>, and <a class="el" href="classItem.html#ad3638f93065693c1f69eb349feb1b7aa">get_data()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a9594df6014b0b6f45364ea7a34510130"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::$owner_name = ''</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classItem.html#a67892aa23d19f4431bb2e5f43c74000e">get_owner_name()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a078f95b4134ce3a1df344cf8d386f986"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::$owner_photo = ''</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classItem.html#aa541bc4290e51bfd688d6921bebabc73">get_owner_photo()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="afa54851df82962c7c42dea3cc9f5c92c"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::$owner_url = ''</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classItem.html#a9f2d219da712390f59012fc32a342074">get_owner_url()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a1a1e42877e6ac7af50286142ceb483d2"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::$parent = null</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classItem.html#a4b92e3a9d6212c553aa2661489bd95d8">get_parent()</a>, and <a class="el" href="classItem.html#a9890ff72662d5bba301d1f2dd8aec9d7">set_parent()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a5b561415861f5b89b0733aacfe0428d1"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::$redirect_url = null</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classItem.html#a428f448f89a8629055ea3294eb942aea">get_redirect_url()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a7f7bc059de377319282cb4ef4a828480"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::$template = 'conv_item.tpl'</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classItem.html#a3ee7667c2ec6cd7657328e27848c0bdf">get_comment_box()</a>, and <a class="el" href="classItem.html#aba23a0a9d89e316d2b343cc46d695d91">get_template()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a1cb6aa8abdf7ea7daca647e40c8ea3a2"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::$threaded = false</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classItem.html#a5b2fafdca55aefeaa08993a5a60529f0">is_threaded()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a5cfa6cf964f433a917a81cab079ff9d8"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::$toplevel = false</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classItem.html#aa49e40f961dff66da32c5ae110e32993">is_toplevel()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a4a123ae98987c1e30ecb15c4edf5a3b8"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::$visiting = false</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classItem.html#a97c7feeea7f26a73176cb19faa455e12">is_visiting()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a5d29ddecc073151a65a8e2ea2f6e4189"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::$wall_to_wall = false</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classItem.html#aabf87ded59c25b5fe2b2296678e70509">is_wall_to_wall()</a>.</p>
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>include/<a class="el" href="ItemObject_8php.html">ItemObject.php</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classItem.js b/doc/html/classItem.js
new file mode 100644
index 000000000..afdf7677d
--- /dev/null
+++ b/doc/html/classItem.js
@@ -0,0 +1,49 @@
+var classItem =
+[
+ [ "__construct", "classItem.html#a248f45871ecfe82a08d1d4c0769b2eb2", null ],
+ [ "add_child", "classItem.html#a80dcd9d0f548c3ad550abe7e6981fb51", null ],
+ [ "check_wall_to_wall", "classItem.html#abcdb0ea9bcd1576bc99bba9b8f700bb8", null ],
+ [ "count_descendants", "classItem.html#aca1e66988ed00cd627b2a359b72cd0ae", null ],
+ [ "get_child", "classItem.html#a632185dd25c5caf277067c76230a4320", null ],
+ [ "get_children", "classItem.html#aa0ee775ec94abccec6c798428835d001", null ],
+ [ "get_comment_box", "classItem.html#a3ee7667c2ec6cd7657328e27848c0bdf", null ],
+ [ "get_comment_box_template", "classItem.html#a904421c7a427411bb2ab473bca872f63", null ],
+ [ "get_conversation", "classItem.html#a0c301aaed2b7d682728d18db3a22afa3", null ],
+ [ "get_data", "classItem.html#ad3638f93065693c1f69eb349feb1b7aa", null ],
+ [ "get_data_value", "classItem.html#ac6f1c96cc82a0dfb7e881fc70309ea3c", null ],
+ [ "get_id", "classItem.html#ac0f27e58532612f6e7a54c8a621b9b92", null ],
+ [ "get_owner_name", "classItem.html#a67892aa23d19f4431bb2e5f43c74000e", null ],
+ [ "get_owner_photo", "classItem.html#aa541bc4290e51bfd688d6921bebabc73", null ],
+ [ "get_owner_url", "classItem.html#a9f2d219da712390f59012fc32a342074", null ],
+ [ "get_parent", "classItem.html#a4b92e3a9d6212c553aa2661489bd95d8", null ],
+ [ "get_redirect_url", "classItem.html#a428f448f89a8629055ea3294eb942aea", null ],
+ [ "get_template", "classItem.html#aba23a0a9d89e316d2b343cc46d695d91", null ],
+ [ "get_template_data", "classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8", null ],
+ [ "is_commentable", "classItem.html#ac04525a8be24c12b0a2ae4ca1ba4b967", null ],
+ [ "is_threaded", "classItem.html#a5b2fafdca55aefeaa08993a5a60529f0", null ],
+ [ "is_toplevel", "classItem.html#aa49e40f961dff66da32c5ae110e32993", null ],
+ [ "is_visiting", "classItem.html#a97c7feeea7f26a73176cb19faa455e12", null ],
+ [ "is_wall_to_wall", "classItem.html#aabf87ded59c25b5fe2b2296678e70509", null ],
+ [ "remove_child", "classItem.html#a2ce70ef63f9f4d86a09c351678806925", null ],
+ [ "remove_parent", "classItem.html#aa452b5bcd8dea12119b09212c615cb41", null ],
+ [ "set_commentable", "classItem.html#aa1bd19fc8b5577078530265a7bf64123", null ],
+ [ "set_conversation", "classItem.html#aa8b1bbc4236890694635295e46d7fd72", null ],
+ [ "set_parent", "classItem.html#a9890ff72662d5bba301d1f2dd8aec9d7", null ],
+ [ "set_template", "classItem.html#af1b73df9b7c4b927e26b7e243b491f42", null ],
+ [ "$channel", "classItem.html#acc32426c0f465391be8a99ad810c7b8e", null ],
+ [ "$children", "classItem.html#a80dcd0fb7673776c0967839d429c2a0f", null ],
+ [ "$comment_box_template", "classItem.html#a90743c8348b13213275c223bb9333aa0", null ],
+ [ "$commentable", "classItem.html#aa2c221231ad0fc3720ccc1f00f0c6304", null ],
+ [ "$conversation", "classItem.html#a007424e3e3171dcfb4312a02161da6cd", null ],
+ [ "$data", "classItem.html#aec24e233f9098f902b1e57e60dcb2019", null ],
+ [ "$owner_name", "classItem.html#a9594df6014b0b6f45364ea7a34510130", null ],
+ [ "$owner_photo", "classItem.html#a078f95b4134ce3a1df344cf8d386f986", null ],
+ [ "$owner_url", "classItem.html#afa54851df82962c7c42dea3cc9f5c92c", null ],
+ [ "$parent", "classItem.html#a1a1e42877e6ac7af50286142ceb483d2", null ],
+ [ "$redirect_url", "classItem.html#a5b561415861f5b89b0733aacfe0428d1", null ],
+ [ "$template", "classItem.html#a7f7bc059de377319282cb4ef4a828480", null ],
+ [ "$threaded", "classItem.html#a1cb6aa8abdf7ea7daca647e40c8ea3a2", null ],
+ [ "$toplevel", "classItem.html#a5cfa6cf964f433a917a81cab079ff9d8", null ],
+ [ "$visiting", "classItem.html#a4a123ae98987c1e30ecb15c4edf5a3b8", null ],
+ [ "$wall_to_wall", "classItem.html#a5d29ddecc073151a65a8e2ea2f6e4189", null ]
+]; \ No newline at end of file
diff --git a/doc/html/classItem.png b/doc/html/classItem.png
new file mode 100644
index 000000000..d1000fab9
--- /dev/null
+++ b/doc/html/classItem.png
Binary files differ
diff --git a/doc/html/classPhoto-members.html b/doc/html/classPhoto-members.html
new file mode 100644
index 000000000..02914e5d0
--- /dev/null
+++ b/doc/html/classPhoto-members.html
@@ -0,0 +1,145 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Project: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="r!-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Project
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classPhoto.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">Photo Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classPhoto.html">Photo</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="classPhoto.html#a2b05906daa294e0c904aff0ba24b5bd3">$height</a></td><td class="entry"><a class="el" href="classPhoto.html">Photo</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classPhoto.html#aa09af89979e3e46c0c58989ee063d69d">$image</a></td><td class="entry"><a class="el" href="classPhoto.html">Photo</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classPhoto.html#a040b23beaab0c0db4311b31cae6b8106">$imagick</a></td><td class="entry"><a class="el" href="classPhoto.html">Photo</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classPhoto.html#af87e8ec7587bbcb28f91e7548f560695">$type</a></td><td class="entry"><a class="el" href="classPhoto.html">Photo</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classPhoto.html#a338d80512bdfeb6a6a00a9381d76de5f">$types</a></td><td class="entry"><a class="el" href="classPhoto.html">Photo</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classPhoto.html#a50e0b85ea8a3f724dd74366756669e61">$valid</a></td><td class="entry"><a class="el" href="classPhoto.html">Photo</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classPhoto.html#af18778643b1f6c637d9d7f5abd561f11">$width</a></td><td class="entry"><a class="el" href="classPhoto.html">Photo</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classPhoto.html#ad06199e7c1222350ef8c1cdcfade265c">__construct</a>($data, $type=null)</td><td class="entry"><a class="el" href="classPhoto.html">Photo</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classPhoto.html#a0906cba2a2a895cc22179de27449cbd2">__destruct</a>()</td><td class="entry"><a class="el" href="classPhoto.html">Photo</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classPhoto.html#a4ace266825f6b2bbc3c7f990f5d92500">cropImage</a>($max, $x, $y, $w, $h)</td><td class="entry"><a class="el" href="classPhoto.html">Photo</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classPhoto.html#a7acd95a0380f95999dd069fbb5629ea5">flip</a>($horiz=true, $vert=false)</td><td class="entry"><a class="el" href="classPhoto.html">Photo</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classPhoto.html#a1f00f0e1b6d90c5d83d8d3febb703075">get_FormatsMap</a>()</td><td class="entry"><a class="el" href="classPhoto.html">Photo</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classPhoto.html#ade61db6eb69c065e4df66feaa1942d29">getExt</a>()</td><td class="entry"><a class="el" href="classPhoto.html">Photo</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classPhoto.html#ab83e29500828ead47ac0a8cb9439082c">getHeight</a>()</td><td class="entry"><a class="el" href="classPhoto.html">Photo</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classPhoto.html#a29213571e2688f17240cd2b3892d7a62">getImage</a>()</td><td class="entry"><a class="el" href="classPhoto.html">Photo</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classPhoto.html#ad17537abe440ac133c3b2d951f92677b">getType</a>()</td><td class="entry"><a class="el" href="classPhoto.html">Photo</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classPhoto.html#a74a04f56215cee00533b85b24daecfb1">getWidth</a>()</td><td class="entry"><a class="el" href="classPhoto.html">Photo</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classPhoto.html#a7c4be19101d5a289a491428c2f8d747c">imageString</a>()</td><td class="entry"><a class="el" href="classPhoto.html">Photo</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classPhoto.html#abad44c9fc7a1853920555398bf905433">is_imagick</a>()</td><td class="entry"><a class="el" href="classPhoto.html">Photo</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classPhoto.html#a66705cd7db1f8dce59ceac57dbf14476">is_valid</a>()</td><td class="entry"><a class="el" href="classPhoto.html">Photo</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classPhoto.html#a32ff09cd464a48bc8e510a1403410753">orient</a>($filename)</td><td class="entry"><a class="el" href="classPhoto.html">Photo</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classPhoto.html#a8b2b0a7f949a566c21e0160fbf047666">rotate</a>($degrees)</td><td class="entry"><a class="el" href="classPhoto.html">Photo</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classPhoto.html#af522871c8ab451155b9745fa7f057943">saveImage</a>($path)</td><td class="entry"><a class="el" href="classPhoto.html">Photo</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classPhoto.html#a4ff11117ada771637a61a668d2af6636">scaleImage</a>($max)</td><td class="entry"><a class="el" href="classPhoto.html">Photo</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classPhoto.html#a080a5219eb09c2621dabeae153ce6a03">scaleImageSquare</a>($dim)</td><td class="entry"><a class="el" href="classPhoto.html">Photo</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classPhoto.html#a735eb657277e7a46cebe7f6fde0af80a">scaleImageUp</a>($min)</td><td class="entry"><a class="el" href="classPhoto.html">Photo</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classPhoto.html#a15e21237805d5f1019b4e40322389194">store</a>($aid, $uid, $xchan, $rid, $filename, $album, $scale, $profile=0, $allow_cid= '', $allow_gid= '', $deny_cid= '', $deny_gid= '')</td><td class="entry"><a class="el" href="classPhoto.html">Photo</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classPhoto.html#af46fdc365916728deb59adf5c99f528d">supportedTypes</a>()</td><td class="entry"><a class="el" href="classPhoto.html">Photo</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+</table></div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classPhoto.html b/doc/html/classPhoto.html
new file mode 100644
index 000000000..8c86285e3
--- /dev/null
+++ b/doc/html/classPhoto.html
@@ -0,0 +1,826 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Project: Photo Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="r!-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Project
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classPhoto.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="#pub-static-methods">Static Public Member Functions</a> &#124;
+<a href="#pri-attribs">Private Attributes</a> &#124;
+<a href="classPhoto-members.html">List of all members</a> </div>
+ <div class="headertitle">
+<div class="title">Photo Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:ad06199e7c1222350ef8c1cdcfade265c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classPhoto.html#ad06199e7c1222350ef8c1cdcfade265c">__construct</a> ($data, $type=null)</td></tr>
+<tr class="separator:ad06199e7c1222350ef8c1cdcfade265c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0906cba2a2a895cc22179de27449cbd2"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classPhoto.html#a0906cba2a2a895cc22179de27449cbd2">__destruct</a> ()</td></tr>
+<tr class="separator:a0906cba2a2a895cc22179de27449cbd2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abad44c9fc7a1853920555398bf905433"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classPhoto.html#abad44c9fc7a1853920555398bf905433">is_imagick</a> ()</td></tr>
+<tr class="separator:abad44c9fc7a1853920555398bf905433"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1f00f0e1b6d90c5d83d8d3febb703075"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classPhoto.html#a1f00f0e1b6d90c5d83d8d3febb703075">get_FormatsMap</a> ()</td></tr>
+<tr class="separator:a1f00f0e1b6d90c5d83d8d3febb703075"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a66705cd7db1f8dce59ceac57dbf14476"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classPhoto.html#a66705cd7db1f8dce59ceac57dbf14476">is_valid</a> ()</td></tr>
+<tr class="separator:a66705cd7db1f8dce59ceac57dbf14476"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a74a04f56215cee00533b85b24daecfb1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classPhoto.html#a74a04f56215cee00533b85b24daecfb1">getWidth</a> ()</td></tr>
+<tr class="separator:a74a04f56215cee00533b85b24daecfb1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab83e29500828ead47ac0a8cb9439082c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classPhoto.html#ab83e29500828ead47ac0a8cb9439082c">getHeight</a> ()</td></tr>
+<tr class="separator:ab83e29500828ead47ac0a8cb9439082c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a29213571e2688f17240cd2b3892d7a62"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classPhoto.html#a29213571e2688f17240cd2b3892d7a62">getImage</a> ()</td></tr>
+<tr class="separator:a29213571e2688f17240cd2b3892d7a62"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad17537abe440ac133c3b2d951f92677b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classPhoto.html#ad17537abe440ac133c3b2d951f92677b">getType</a> ()</td></tr>
+<tr class="separator:ad17537abe440ac133c3b2d951f92677b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ade61db6eb69c065e4df66feaa1942d29"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classPhoto.html#ade61db6eb69c065e4df66feaa1942d29">getExt</a> ()</td></tr>
+<tr class="separator:ade61db6eb69c065e4df66feaa1942d29"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4ff11117ada771637a61a668d2af6636"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classPhoto.html#a4ff11117ada771637a61a668d2af6636">scaleImage</a> ($max)</td></tr>
+<tr class="separator:a4ff11117ada771637a61a668d2af6636"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8b2b0a7f949a566c21e0160fbf047666"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classPhoto.html#a8b2b0a7f949a566c21e0160fbf047666">rotate</a> ($degrees)</td></tr>
+<tr class="separator:a8b2b0a7f949a566c21e0160fbf047666"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7acd95a0380f95999dd069fbb5629ea5"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classPhoto.html#a7acd95a0380f95999dd069fbb5629ea5">flip</a> ($horiz=true, $vert=false)</td></tr>
+<tr class="separator:a7acd95a0380f95999dd069fbb5629ea5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a32ff09cd464a48bc8e510a1403410753"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classPhoto.html#a32ff09cd464a48bc8e510a1403410753">orient</a> ($filename)</td></tr>
+<tr class="separator:a32ff09cd464a48bc8e510a1403410753"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a735eb657277e7a46cebe7f6fde0af80a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classPhoto.html#a735eb657277e7a46cebe7f6fde0af80a">scaleImageUp</a> ($min)</td></tr>
+<tr class="separator:a735eb657277e7a46cebe7f6fde0af80a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a080a5219eb09c2621dabeae153ce6a03"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classPhoto.html#a080a5219eb09c2621dabeae153ce6a03">scaleImageSquare</a> ($dim)</td></tr>
+<tr class="separator:a080a5219eb09c2621dabeae153ce6a03"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4ace266825f6b2bbc3c7f990f5d92500"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classPhoto.html#a4ace266825f6b2bbc3c7f990f5d92500">cropImage</a> ($max, $<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>, $y, $w, $h)</td></tr>
+<tr class="separator:a4ace266825f6b2bbc3c7f990f5d92500"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af522871c8ab451155b9745fa7f057943"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classPhoto.html#af522871c8ab451155b9745fa7f057943">saveImage</a> ($path)</td></tr>
+<tr class="separator:af522871c8ab451155b9745fa7f057943"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7c4be19101d5a289a491428c2f8d747c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classPhoto.html#a7c4be19101d5a289a491428c2f8d747c">imageString</a> ()</td></tr>
+<tr class="separator:a7c4be19101d5a289a491428c2f8d747c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a15e21237805d5f1019b4e40322389194"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classPhoto.html#a15e21237805d5f1019b4e40322389194">store</a> ($aid, $uid, $xchan, $rid, $filename, $album, $scale, $profile=0, $allow_cid= '', $allow_gid= '', $deny_cid= '', $deny_gid= '')</td></tr>
+<tr class="separator:a15e21237805d5f1019b4e40322389194"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-static-methods"></a>
+Static Public Member Functions</h2></td></tr>
+<tr class="memitem:af46fdc365916728deb59adf5c99f528d"><td class="memItemLeft" align="right" valign="top">static&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classPhoto.html#af46fdc365916728deb59adf5c99f528d">supportedTypes</a> ()</td></tr>
+<tr class="separator:af46fdc365916728deb59adf5c99f528d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pri-attribs"></a>
+Private Attributes</h2></td></tr>
+<tr class="memitem:aa09af89979e3e46c0c58989ee063d69d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classPhoto.html#aa09af89979e3e46c0c58989ee063d69d">$image</a></td></tr>
+<tr class="separator:aa09af89979e3e46c0c58989ee063d69d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a040b23beaab0c0db4311b31cae6b8106"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classPhoto.html#a040b23beaab0c0db4311b31cae6b8106">$imagick</a></td></tr>
+<tr class="separator:a040b23beaab0c0db4311b31cae6b8106"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af18778643b1f6c637d9d7f5abd561f11"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classPhoto.html#af18778643b1f6c637d9d7f5abd561f11">$width</a></td></tr>
+<tr class="separator:af18778643b1f6c637d9d7f5abd561f11"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2b05906daa294e0c904aff0ba24b5bd3"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classPhoto.html#a2b05906daa294e0c904aff0ba24b5bd3">$height</a></td></tr>
+<tr class="separator:a2b05906daa294e0c904aff0ba24b5bd3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a50e0b85ea8a3f724dd74366756669e61"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classPhoto.html#a50e0b85ea8a3f724dd74366756669e61">$valid</a></td></tr>
+<tr class="separator:a50e0b85ea8a3f724dd74366756669e61"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af87e8ec7587bbcb28f91e7548f560695"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classPhoto.html#af87e8ec7587bbcb28f91e7548f560695">$type</a></td></tr>
+<tr class="separator:af87e8ec7587bbcb28f91e7548f560695"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a338d80512bdfeb6a6a00a9381d76de5f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classPhoto.html#a338d80512bdfeb6a6a00a9381d76de5f">$types</a></td></tr>
+<tr class="separator:a338d80512bdfeb6a6a00a9381d76de5f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Constructor &amp; Destructor Documentation</h2>
+<a class="anchor" id="ad06199e7c1222350ef8c1cdcfade265c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Photo::__construct </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$data</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em> = <code>null</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Setup the image to the format it will be saved to</p>
+<p>setup the compression here, so we'll do it only once</p>
+<p>From <a href="http://www.imagemagick.org/script/command-line-options.php#quality:">http://www.imagemagick.org/script/command-line-options.php#quality:</a></p>
+<p>'For the MNG and PNG image formats, the quality value sets the zlib compression level (quality / 10) and filter-type (quality % 10). The default PNG "quality" is 75, which means compression level 7 with adaptive PNG filtering, unless the image has a color map, in which case it means compression level 7 with no PNG filtering'</p>
+
+</div>
+</div>
+<a class="anchor" id="a0906cba2a2a895cc22179de27449cbd2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Photo::__destruct </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Member Function Documentation</h2>
+<a class="anchor" id="a4ace266825f6b2bbc3c7f990f5d92500"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Photo::cropImage </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$max</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$x</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$y</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$w</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$h</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>We need to remove the canva, or the image is not resized to the crop: <a href="http://php.net/manual/en/imagick.cropimage.php#97232">http://php.net/manual/en/imagick.cropimage.php#97232</a></p>
+
+</div>
+</div>
+<a class="anchor" id="a7acd95a0380f95999dd069fbb5629ea5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Photo::flip </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$horiz</em> = <code>true</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$vert</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classPhoto.html#a32ff09cd464a48bc8e510a1403410753">orient()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a1f00f0e1b6d90c5d83d8d3febb703075"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Photo::get_FormatsMap </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Maps Mime types to Imagick formats </p>
+
+<p>Referenced by <a class="el" href="classPhoto.html#ad06199e7c1222350ef8c1cdcfade265c">__construct()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ade61db6eb69c065e4df66feaa1942d29"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Photo::getExt </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ab83e29500828ead47ac0a8cb9439082c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Photo::getHeight </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classPhoto.html#a15e21237805d5f1019b4e40322389194">store()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a29213571e2688f17240cd2b3892d7a62"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Photo::getImage </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ad17537abe440ac133c3b2d951f92677b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Photo::getType </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classPhoto.html#ad06199e7c1222350ef8c1cdcfade265c">__construct()</a>, <a class="el" href="classPhoto.html#ade61db6eb69c065e4df66feaa1942d29">getExt()</a>, <a class="el" href="classPhoto.html#a7c4be19101d5a289a491428c2f8d747c">imageString()</a>, <a class="el" href="classPhoto.html#a32ff09cd464a48bc8e510a1403410753">orient()</a>, and <a class="el" href="classPhoto.html#a15e21237805d5f1019b4e40322389194">store()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a74a04f56215cee00533b85b24daecfb1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Photo::getWidth </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classPhoto.html#a15e21237805d5f1019b4e40322389194">store()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a7c4be19101d5a289a491428c2f8d747c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Photo::imageString </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classPhoto.html#af522871c8ab451155b9745fa7f057943">saveImage()</a>, and <a class="el" href="classPhoto.html#a15e21237805d5f1019b4e40322389194">store()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="abad44c9fc7a1853920555398bf905433"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Photo::is_imagick </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classPhoto.html#ad06199e7c1222350ef8c1cdcfade265c">__construct()</a>, <a class="el" href="classPhoto.html#a0906cba2a2a895cc22179de27449cbd2">__destruct()</a>, <a class="el" href="classPhoto.html#a4ace266825f6b2bbc3c7f990f5d92500">cropImage()</a>, <a class="el" href="classPhoto.html#a7acd95a0380f95999dd069fbb5629ea5">flip()</a>, <a class="el" href="classPhoto.html#ab83e29500828ead47ac0a8cb9439082c">getHeight()</a>, <a class="el" href="classPhoto.html#a29213571e2688f17240cd2b3892d7a62">getImage()</a>, <a class="el" href="classPhoto.html#a74a04f56215cee00533b85b24daecfb1">getWidth()</a>, <a class="el" href="classPhoto.html#a7c4be19101d5a289a491428c2f8d747c">imageString()</a>, <a class="el" href="classPhoto.html#a66705cd7db1f8dce59ceac57dbf14476">is_valid()</a>, <a class="el" href="classPhoto.html#a8b2b0a7f949a566c21e0160fbf047666">rotate()</a>, <a class="el" href="classPhoto.html#a4ff11117ada771637a61a668d2af6636">scaleImage()</a>, <a class="el" href="classPhoto.html#a080a5219eb09c2621dabeae153ce6a03">scaleImageSquare()</a>, and <a class="el" href="classPhoto.html#a735eb657277e7a46cebe7f6fde0af80a">scaleImageUp()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a66705cd7db1f8dce59ceac57dbf14476"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Photo::is_valid </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classPhoto.html#a4ace266825f6b2bbc3c7f990f5d92500">cropImage()</a>, <a class="el" href="classPhoto.html#a7acd95a0380f95999dd069fbb5629ea5">flip()</a>, <a class="el" href="classPhoto.html#ade61db6eb69c065e4df66feaa1942d29">getExt()</a>, <a class="el" href="classPhoto.html#ab83e29500828ead47ac0a8cb9439082c">getHeight()</a>, <a class="el" href="classPhoto.html#a29213571e2688f17240cd2b3892d7a62">getImage()</a>, <a class="el" href="classPhoto.html#ad17537abe440ac133c3b2d951f92677b">getType()</a>, <a class="el" href="classPhoto.html#a74a04f56215cee00533b85b24daecfb1">getWidth()</a>, <a class="el" href="classPhoto.html#a7c4be19101d5a289a491428c2f8d747c">imageString()</a>, <a class="el" href="classPhoto.html#a32ff09cd464a48bc8e510a1403410753">orient()</a>, <a class="el" href="classPhoto.html#a8b2b0a7f949a566c21e0160fbf047666">rotate()</a>, <a class="el" href="classPhoto.html#af522871c8ab451155b9745fa7f057943">saveImage()</a>, <a class="el" href="classPhoto.html#a4ff11117ada771637a61a668d2af6636">scaleImage()</a>, <a class="el" href="classPhoto.html#a080a5219eb09c2621dabeae153ce6a03">scaleImageSquare()</a>, and <a class="el" href="classPhoto.html#a735eb657277e7a46cebe7f6fde0af80a">scaleImageUp()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a32ff09cd464a48bc8e510a1403410753"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Photo::orient </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$filename</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a8b2b0a7f949a566c21e0160fbf047666"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Photo::rotate </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$degrees</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classPhoto.html#a32ff09cd464a48bc8e510a1403410753">orient()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="af522871c8ab451155b9745fa7f057943"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Photo::saveImage </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$path</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a4ff11117ada771637a61a668d2af6636"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Photo::scaleImage </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$max</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>If it is not animated, there will be only one iteration here, so don't bother checking</p>
+
+<p>Referenced by <a class="el" href="classPhoto.html#a4ace266825f6b2bbc3c7f990f5d92500">cropImage()</a>, and <a class="el" href="classPhoto.html#a735eb657277e7a46cebe7f6fde0af80a">scaleImageUp()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a080a5219eb09c2621dabeae153ce6a03"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Photo::scaleImageSquare </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$dim</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a735eb657277e7a46cebe7f6fde0af80a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Photo::scaleImageUp </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$min</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a15e21237805d5f1019b4e40322389194"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Photo::store </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$aid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$xchan</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$rid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$filename</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$album</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$scale</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$profile</em> = <code>0</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$allow_cid</em> = <code>''</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$allow_gid</em> = <code>''</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$deny_cid</em> = <code>''</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$deny_gid</em> = <code>''</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="af46fdc365916728deb59adf5c99f528d"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">static Photo::supportedTypes </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+<p>supported mimetypes and corresponding file extensions </p>
+<p>Imagick::queryFormats won't help us a lot there... At least, not yet, other parts of friendica uses this array</p>
+
+<p>Referenced by <a class="el" href="classPhoto.html#ad06199e7c1222350ef8c1cdcfade265c">__construct()</a>, <a class="el" href="fbrowser_8php.html#aee476addcf7a3e0fe9454f7dfd5a56c4">fbrowser_content()</a>, <a class="el" href="Photo_8php.html#a7273b82b017fd96d29b2c57bab03aea6">guess_image_type()</a>, <a class="el" href="mod_2photos_8php.html#aa87382611a66ec5effdb2d78f13f5812">photos_content()</a>, and <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>.</p>
+
+</div>
+</div>
+<h2 class="groupheader">Member Data Documentation</h2>
+<a class="anchor" id="a2b05906daa294e0c904aff0ba24b5bd3"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Photo::$height</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classPhoto.html#ab83e29500828ead47ac0a8cb9439082c">getHeight()</a>, <a class="el" href="classPhoto.html#a4ff11117ada771637a61a668d2af6636">scaleImage()</a>, and <a class="el" href="classPhoto.html#a735eb657277e7a46cebe7f6fde0af80a">scaleImageUp()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa09af89979e3e46c0c58989ee063d69d"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Photo::$image</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classPhoto.html#a29213571e2688f17240cd2b3892d7a62">getImage()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a040b23beaab0c0db4311b31cae6b8106"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Photo::$imagick</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+<p>Put back gd stuff, not everybody have Imagick </p>
+
+<p>Referenced by <a class="el" href="classPhoto.html#abad44c9fc7a1853920555398bf905433">is_imagick()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="af87e8ec7587bbcb28f91e7548f560695"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Photo::$type</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classPhoto.html#ad06199e7c1222350ef8c1cdcfade265c">__construct()</a>, and <a class="el" href="classPhoto.html#ad17537abe440ac133c3b2d951f92677b">getType()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a338d80512bdfeb6a6a00a9381d76de5f"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Photo::$types</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a50e0b85ea8a3f724dd74366756669e61"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Photo::$valid</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classPhoto.html#a66705cd7db1f8dce59ceac57dbf14476">is_valid()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="af18778643b1f6c637d9d7f5abd561f11"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Photo::$width</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classPhoto.html#a74a04f56215cee00533b85b24daecfb1">getWidth()</a>, <a class="el" href="classPhoto.html#a4ff11117ada771637a61a668d2af6636">scaleImage()</a>, and <a class="el" href="classPhoto.html#a735eb657277e7a46cebe7f6fde0af80a">scaleImageUp()</a>.</p>
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>include/<a class="el" href="Photo_8php.html">Photo.php</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classPhoto.js b/doc/html/classPhoto.js
new file mode 100644
index 000000000..dd688af4b
--- /dev/null
+++ b/doc/html/classPhoto.js
@@ -0,0 +1,30 @@
+var classPhoto =
+[
+ [ "__construct", "classPhoto.html#ad06199e7c1222350ef8c1cdcfade265c", null ],
+ [ "__destruct", "classPhoto.html#a0906cba2a2a895cc22179de27449cbd2", null ],
+ [ "cropImage", "classPhoto.html#a4ace266825f6b2bbc3c7f990f5d92500", null ],
+ [ "flip", "classPhoto.html#a7acd95a0380f95999dd069fbb5629ea5", null ],
+ [ "get_FormatsMap", "classPhoto.html#a1f00f0e1b6d90c5d83d8d3febb703075", null ],
+ [ "getExt", "classPhoto.html#ade61db6eb69c065e4df66feaa1942d29", null ],
+ [ "getHeight", "classPhoto.html#ab83e29500828ead47ac0a8cb9439082c", null ],
+ [ "getImage", "classPhoto.html#a29213571e2688f17240cd2b3892d7a62", null ],
+ [ "getType", "classPhoto.html#ad17537abe440ac133c3b2d951f92677b", null ],
+ [ "getWidth", "classPhoto.html#a74a04f56215cee00533b85b24daecfb1", null ],
+ [ "imageString", "classPhoto.html#a7c4be19101d5a289a491428c2f8d747c", null ],
+ [ "is_imagick", "classPhoto.html#abad44c9fc7a1853920555398bf905433", null ],
+ [ "is_valid", "classPhoto.html#a66705cd7db1f8dce59ceac57dbf14476", null ],
+ [ "orient", "classPhoto.html#a32ff09cd464a48bc8e510a1403410753", null ],
+ [ "rotate", "classPhoto.html#a8b2b0a7f949a566c21e0160fbf047666", null ],
+ [ "saveImage", "classPhoto.html#af522871c8ab451155b9745fa7f057943", null ],
+ [ "scaleImage", "classPhoto.html#a4ff11117ada771637a61a668d2af6636", null ],
+ [ "scaleImageSquare", "classPhoto.html#a080a5219eb09c2621dabeae153ce6a03", null ],
+ [ "scaleImageUp", "classPhoto.html#a735eb657277e7a46cebe7f6fde0af80a", null ],
+ [ "store", "classPhoto.html#a15e21237805d5f1019b4e40322389194", null ],
+ [ "$height", "classPhoto.html#a2b05906daa294e0c904aff0ba24b5bd3", null ],
+ [ "$image", "classPhoto.html#aa09af89979e3e46c0c58989ee063d69d", null ],
+ [ "$imagick", "classPhoto.html#a040b23beaab0c0db4311b31cae6b8106", null ],
+ [ "$type", "classPhoto.html#af87e8ec7587bbcb28f91e7548f560695", null ],
+ [ "$types", "classPhoto.html#a338d80512bdfeb6a6a00a9381d76de5f", null ],
+ [ "$valid", "classPhoto.html#a50e0b85ea8a3f724dd74366756669e61", null ],
+ [ "$width", "classPhoto.html#af18778643b1f6c637d9d7f5abd561f11", null ]
+]; \ No newline at end of file
diff --git a/doc/html/classProtoDriver-members.html b/doc/html/classProtoDriver-members.html
new file mode 100644
index 000000000..671b893d9
--- /dev/null
+++ b/doc/html/classProtoDriver-members.html
@@ -0,0 +1,124 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classProtoDriver.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">ProtoDriver Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classProtoDriver.html">ProtoDriver</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="classProtoDriver.html#a1593f3abae050edbd9304f4f8bc4894a">acknowledge_permissions</a>($permissions, $channel, $recipient)</td><td class="entry"><a class="el" href="classProtoDriver.html">ProtoDriver</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classProtoDriver.html#a34b97ca5ef2165f2e16eb2fe59ff6c67">change_permissions</a>($permissions, $channel, $recipient)</td><td class="entry"><a class="el" href="classProtoDriver.html">ProtoDriver</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classProtoDriver.html#a2ba1758f0f9e3564580b6ff85292804d">collect</a>($channel, $connection)</td><td class="entry"><a class="el" href="classProtoDriver.html">ProtoDriver</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classProtoDriver.html#af66171aa7dab9b62cee915cb4f1abe1b">collect_private</a>($channel, $connection)</td><td class="entry"><a class="el" href="classProtoDriver.html">ProtoDriver</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classProtoDriver.html#a85e9063f6d0c304410cd246f7900ea1b">deliver</a>($item, $channel, $recipients)</td><td class="entry"><a class="el" href="classProtoDriver.html">ProtoDriver</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classProtoDriver.html#ae5b44739f84c10d00a9b65adf3785181">deliver_private</a>($item, $channel, $recipients)</td><td class="entry"><a class="el" href="classProtoDriver.html">ProtoDriver</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classProtoDriver.html#a64a3868cffe27d601d55f69a2ecc4337">discover</a>($channel, $location)</td><td class="entry"><a class="el" href="classProtoDriver.html">ProtoDriver</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+</table></div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classProtoDriver.html b/doc/html/classProtoDriver.html
new file mode 100644
index 000000000..4e95667dd
--- /dev/null
+++ b/doc/html/classProtoDriver.html
@@ -0,0 +1,410 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: ProtoDriver Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classProtoDriver.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#pro-methods">Protected Member Functions</a> &#124;
+<a href="classProtoDriver-members.html">List of all members</a> </div>
+ <div class="headertitle">
+<div class="title">ProtoDriver Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="dynheader">
+Inheritance diagram for ProtoDriver:</div>
+<div class="dyncontent">
+ <div class="center">
+ <img src="classProtoDriver.png" usemap="#ProtoDriver_map" alt=""/>
+ <map id="ProtoDriver_map" name="ProtoDriver_map">
+<area href="classZotDriver.html" alt="ZotDriver" shape="rect" coords="0,56,78,80"/>
+</map>
+ </div></div>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pro-methods"></a>
+Protected Member Functions</h2></td></tr>
+<tr class="memitem:a64a3868cffe27d601d55f69a2ecc4337"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classProtoDriver.html#a64a3868cffe27d601d55f69a2ecc4337">discover</a> ($channel, $location)</td></tr>
+<tr class="separator:a64a3868cffe27d601d55f69a2ecc4337"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a85e9063f6d0c304410cd246f7900ea1b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classProtoDriver.html#a85e9063f6d0c304410cd246f7900ea1b">deliver</a> ($item, $channel, $recipients)</td></tr>
+<tr class="separator:a85e9063f6d0c304410cd246f7900ea1b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2ba1758f0f9e3564580b6ff85292804d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classProtoDriver.html#a2ba1758f0f9e3564580b6ff85292804d">collect</a> ($channel, $connection)</td></tr>
+<tr class="separator:a2ba1758f0f9e3564580b6ff85292804d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a34b97ca5ef2165f2e16eb2fe59ff6c67"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classProtoDriver.html#a34b97ca5ef2165f2e16eb2fe59ff6c67">change_permissions</a> ($permissions, $channel, $recipient)</td></tr>
+<tr class="separator:a34b97ca5ef2165f2e16eb2fe59ff6c67"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1593f3abae050edbd9304f4f8bc4894a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classProtoDriver.html#a1593f3abae050edbd9304f4f8bc4894a">acknowledge_permissions</a> ($permissions, $channel, $recipient)</td></tr>
+<tr class="separator:a1593f3abae050edbd9304f4f8bc4894a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae5b44739f84c10d00a9b65adf3785181"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classProtoDriver.html#ae5b44739f84c10d00a9b65adf3785181">deliver_private</a> ($item, $channel, $recipients)</td></tr>
+<tr class="separator:ae5b44739f84c10d00a9b65adf3785181"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af66171aa7dab9b62cee915cb4f1abe1b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classProtoDriver.html#af66171aa7dab9b62cee915cb4f1abe1b">collect_private</a> ($channel, $connection)</td></tr>
+<tr class="separator:af66171aa7dab9b62cee915cb4f1abe1b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Member Function Documentation</h2>
+<a class="anchor" id="a1593f3abae050edbd9304f4f8bc4894a"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">ProtoDriver::acknowledge_permissions </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$permissions</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$recipient</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">abstract</span><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a34b97ca5ef2165f2e16eb2fe59ff6c67"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">ProtoDriver::change_permissions </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$permissions</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$recipient</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">abstract</span><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a2ba1758f0f9e3564580b6ff85292804d"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">ProtoDriver::collect </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$connection</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">abstract</span><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="af66171aa7dab9b62cee915cb4f1abe1b"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">ProtoDriver::collect_private </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$connection</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">abstract</span><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a85e9063f6d0c304410cd246f7900ea1b"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">ProtoDriver::deliver </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$recipients</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">abstract</span><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ae5b44739f84c10d00a9b65adf3785181"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">ProtoDriver::deliver_private </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$recipients</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">abstract</span><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a64a3868cffe27d601d55f69a2ecc4337"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">ProtoDriver::discover </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$location</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">abstract</span><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>include/<a class="el" href="ProtoDriver_8php.html">ProtoDriver.php</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classProtoDriver.js b/doc/html/classProtoDriver.js
new file mode 100644
index 000000000..f5b39cecb
--- /dev/null
+++ b/doc/html/classProtoDriver.js
@@ -0,0 +1,10 @@
+var classProtoDriver =
+[
+ [ "acknowledge_permissions", "classProtoDriver.html#a1593f3abae050edbd9304f4f8bc4894a", null ],
+ [ "change_permissions", "classProtoDriver.html#a34b97ca5ef2165f2e16eb2fe59ff6c67", null ],
+ [ "collect", "classProtoDriver.html#a2ba1758f0f9e3564580b6ff85292804d", null ],
+ [ "collect_private", "classProtoDriver.html#af66171aa7dab9b62cee915cb4f1abe1b", null ],
+ [ "deliver", "classProtoDriver.html#a85e9063f6d0c304410cd246f7900ea1b", null ],
+ [ "deliver_private", "classProtoDriver.html#ae5b44739f84c10d00a9b65adf3785181", null ],
+ [ "discover", "classProtoDriver.html#a64a3868cffe27d601d55f69a2ecc4337", null ]
+]; \ No newline at end of file
diff --git a/doc/html/classProtoDriver.png b/doc/html/classProtoDriver.png
new file mode 100644
index 000000000..08fe5d4c4
--- /dev/null
+++ b/doc/html/classProtoDriver.png
Binary files differ
diff --git a/doc/html/classRedBasicAuth-members.html b/doc/html/classRedBasicAuth-members.html
new file mode 100644
index 000000000..a132490f7
--- /dev/null
+++ b/doc/html/classRedBasicAuth-members.html
@@ -0,0 +1,127 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classRedBasicAuth.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">RedBasicAuth Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classRedBasicAuth.html">RedBasicAuth</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="classRedBasicAuth.html#af14337f1baad407f8a85d48205c0f30e">$browser</a></td><td class="entry"><a class="el" href="classRedBasicAuth.html">RedBasicAuth</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classRedBasicAuth.html#ad5a3ea4dc4783b242d9dc6e76478b6ef">$channel_hash</a></td><td class="entry"><a class="el" href="classRedBasicAuth.html">RedBasicAuth</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classRedBasicAuth.html#a2dab393650d1573e3515969a153e8354">$channel_id</a></td><td class="entry"><a class="el" href="classRedBasicAuth.html">RedBasicAuth</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classRedBasicAuth.html#a438ab125b6ef46581947e35d49cdebac">$channel_name</a></td><td class="entry"><a class="el" href="classRedBasicAuth.html">RedBasicAuth</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classRedBasicAuth.html#aa75dc43b59adc98e38a98517d3fd35d1">$observer</a></td><td class="entry"><a class="el" href="classRedBasicAuth.html">RedBasicAuth</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classRedBasicAuth.html#a09c1488a0b290f5a54dc15180c5690d7">$owner_id</a></td><td class="entry"><a class="el" href="classRedBasicAuth.html">RedBasicAuth</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classRedBasicAuth.html#a8d09b8d784cc810a0b3be580d05106a7">$owner_nick</a></td><td class="entry"><a class="el" href="classRedBasicAuth.html">RedBasicAuth</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classRedBasicAuth.html#a358ddad4abb5aa8c1382cf49a907adbc">setBrowserPlugin</a>($browser)</td><td class="entry"><a class="el" href="classRedBasicAuth.html">RedBasicAuth</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classRedBasicAuth.html#a072e8244a9a7f191b32d3db5ac94f857">setCurrentUser</a>($name)</td><td class="entry"><a class="el" href="classRedBasicAuth.html">RedBasicAuth</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classRedBasicAuth.html#a8dfd9a0953f8884723b421b7c1acf79b">validateUserPass</a>($username, $password)</td><td class="entry"><a class="el" href="classRedBasicAuth.html">RedBasicAuth</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+</table></div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classRedBasicAuth.html b/doc/html/classRedBasicAuth.html
new file mode 100644
index 000000000..79d641940
--- /dev/null
+++ b/doc/html/classRedBasicAuth.html
@@ -0,0 +1,314 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: RedBasicAuth Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classRedBasicAuth.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="#pub-attribs">Public Attributes</a> &#124;
+<a href="#pro-methods">Protected Member Functions</a> &#124;
+<a href="classRedBasicAuth-members.html">List of all members</a> </div>
+ <div class="headertitle">
+<div class="title">RedBasicAuth Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="dynheader">
+Inheritance diagram for RedBasicAuth:</div>
+<div class="dyncontent">
+ <div class="center">
+ <img src="classRedBasicAuth.png" usemap="#RedBasicAuth_map" alt=""/>
+ <map id="RedBasicAuth_map" name="RedBasicAuth_map">
+</map>
+ </div></div>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:a072e8244a9a7f191b32d3db5ac94f857"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedBasicAuth.html#a072e8244a9a7f191b32d3db5ac94f857">setCurrentUser</a> ($name)</td></tr>
+<tr class="separator:a072e8244a9a7f191b32d3db5ac94f857"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a358ddad4abb5aa8c1382cf49a907adbc"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedBasicAuth.html#a358ddad4abb5aa8c1382cf49a907adbc">setBrowserPlugin</a> ($browser)</td></tr>
+<tr class="separator:a358ddad4abb5aa8c1382cf49a907adbc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Public Attributes</h2></td></tr>
+<tr class="memitem:a438ab125b6ef46581947e35d49cdebac"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedBasicAuth.html#a438ab125b6ef46581947e35d49cdebac">$channel_name</a> = ''</td></tr>
+<tr class="separator:a438ab125b6ef46581947e35d49cdebac"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2dab393650d1573e3515969a153e8354"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedBasicAuth.html#a2dab393650d1573e3515969a153e8354">$channel_id</a> = 0</td></tr>
+<tr class="separator:a2dab393650d1573e3515969a153e8354"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad5a3ea4dc4783b242d9dc6e76478b6ef"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedBasicAuth.html#ad5a3ea4dc4783b242d9dc6e76478b6ef">$channel_hash</a> = ''</td></tr>
+<tr class="separator:ad5a3ea4dc4783b242d9dc6e76478b6ef"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa75dc43b59adc98e38a98517d3fd35d1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedBasicAuth.html#aa75dc43b59adc98e38a98517d3fd35d1">$observer</a> = ''</td></tr>
+<tr class="separator:aa75dc43b59adc98e38a98517d3fd35d1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af14337f1baad407f8a85d48205c0f30e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedBasicAuth.html#af14337f1baad407f8a85d48205c0f30e">$browser</a></td></tr>
+<tr class="separator:af14337f1baad407f8a85d48205c0f30e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a09c1488a0b290f5a54dc15180c5690d7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedBasicAuth.html#a09c1488a0b290f5a54dc15180c5690d7">$owner_id</a></td></tr>
+<tr class="separator:a09c1488a0b290f5a54dc15180c5690d7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8d09b8d784cc810a0b3be580d05106a7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedBasicAuth.html#a8d09b8d784cc810a0b3be580d05106a7">$owner_nick</a> = ''</td></tr>
+<tr class="separator:a8d09b8d784cc810a0b3be580d05106a7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pro-methods"></a>
+Protected Member Functions</h2></td></tr>
+<tr class="memitem:a8dfd9a0953f8884723b421b7c1acf79b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedBasicAuth.html#a8dfd9a0953f8884723b421b7c1acf79b">validateUserPass</a> ($username, $password)</td></tr>
+<tr class="separator:a8dfd9a0953f8884723b421b7c1acf79b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Member Function Documentation</h2>
+<a class="anchor" id="a358ddad4abb5aa8c1382cf49a907adbc"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedBasicAuth::setBrowserPlugin </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$browser</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a072e8244a9a7f191b32d3db5ac94f857"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedBasicAuth::setCurrentUser </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$name</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a8dfd9a0953f8884723b421b7c1acf79b"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedBasicAuth::validateUserPass </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$username</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$password</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Member Data Documentation</h2>
+<a class="anchor" id="af14337f1baad407f8a85d48205c0f30e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedBasicAuth::$browser</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classRedBasicAuth.html#a358ddad4abb5aa8c1382cf49a907adbc">setBrowserPlugin()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ad5a3ea4dc4783b242d9dc6e76478b6ef"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedBasicAuth::$channel_hash = ''</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a2dab393650d1573e3515969a153e8354"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedBasicAuth::$channel_id = 0</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a438ab125b6ef46581947e35d49cdebac"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedBasicAuth::$channel_name = ''</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aa75dc43b59adc98e38a98517d3fd35d1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedBasicAuth::$observer = ''</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a09c1488a0b290f5a54dc15180c5690d7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedBasicAuth::$owner_id</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a8d09b8d784cc810a0b3be580d05106a7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedBasicAuth::$owner_nick = ''</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>include/<a class="el" href="reddav_8php.html">reddav.php</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classRedBasicAuth.js b/doc/html/classRedBasicAuth.js
new file mode 100644
index 000000000..6834ec7e4
--- /dev/null
+++ b/doc/html/classRedBasicAuth.js
@@ -0,0 +1,13 @@
+var classRedBasicAuth =
+[
+ [ "setBrowserPlugin", "classRedBasicAuth.html#a358ddad4abb5aa8c1382cf49a907adbc", null ],
+ [ "setCurrentUser", "classRedBasicAuth.html#a072e8244a9a7f191b32d3db5ac94f857", null ],
+ [ "validateUserPass", "classRedBasicAuth.html#a8dfd9a0953f8884723b421b7c1acf79b", null ],
+ [ "$browser", "classRedBasicAuth.html#af14337f1baad407f8a85d48205c0f30e", null ],
+ [ "$channel_hash", "classRedBasicAuth.html#ad5a3ea4dc4783b242d9dc6e76478b6ef", null ],
+ [ "$channel_id", "classRedBasicAuth.html#a2dab393650d1573e3515969a153e8354", null ],
+ [ "$channel_name", "classRedBasicAuth.html#a438ab125b6ef46581947e35d49cdebac", null ],
+ [ "$observer", "classRedBasicAuth.html#aa75dc43b59adc98e38a98517d3fd35d1", null ],
+ [ "$owner_id", "classRedBasicAuth.html#a09c1488a0b290f5a54dc15180c5690d7", null ],
+ [ "$owner_nick", "classRedBasicAuth.html#a8d09b8d784cc810a0b3be580d05106a7", null ]
+]; \ No newline at end of file
diff --git a/doc/html/classRedBasicAuth.png b/doc/html/classRedBasicAuth.png
new file mode 100644
index 000000000..01abbef69
--- /dev/null
+++ b/doc/html/classRedBasicAuth.png
Binary files differ
diff --git a/doc/html/classRedBrowser-members.html b/doc/html/classRedBrowser-members.html
new file mode 100644
index 000000000..fd659eec4
--- /dev/null
+++ b/doc/html/classRedBrowser-members.html
@@ -0,0 +1,122 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classRedBrowser.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">RedBrowser Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classRedBrowser.html">RedBrowser</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="classRedBrowser.html#ab6d6d1e2a67e06b344a4cede1bd00b35">$auth</a></td><td class="entry"><a class="el" href="classRedBrowser.html">RedBrowser</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classRedBrowser.html#a4b76be9ccef0262cf78fffb4129eda93">__construct</a>(&amp;$auth)</td><td class="entry"><a class="el" href="classRedBrowser.html">RedBrowser</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classRedBrowser.html#a1f7daf50bb9bfcde7345b3b1908dbd7e">generateDirectoryIndex</a>($path)</td><td class="entry"><a class="el" href="classRedBrowser.html">RedBrowser</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classRedBrowser.html#a7f6bf0bda07833f4c647557bd172e349">htmlActionsPanel</a>(DAV\INode $node, &amp;$output)</td><td class="entry"><a class="el" href="classRedBrowser.html">RedBrowser</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classRedBrowser.html#a40fdbb9d9fe6c1243bbf135dd5b0a06f">set_writeable</a>()</td><td class="entry"><a class="el" href="classRedBrowser.html">RedBrowser</a></td><td class="entry"></td></tr>
+</table></div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classRedBrowser.html b/doc/html/classRedBrowser.html
new file mode 100644
index 000000000..19a02f9e4
--- /dev/null
+++ b/doc/html/classRedBrowser.html
@@ -0,0 +1,244 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: RedBrowser Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classRedBrowser.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="#pri-attribs">Private Attributes</a> &#124;
+<a href="classRedBrowser-members.html">List of all members</a> </div>
+ <div class="headertitle">
+<div class="title">RedBrowser Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="dynheader">
+Inheritance diagram for RedBrowser:</div>
+<div class="dyncontent">
+ <div class="center">
+ <img src="classRedBrowser.png" usemap="#RedBrowser_map" alt=""/>
+ <map id="RedBrowser_map" name="RedBrowser_map">
+</map>
+ </div></div>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:a4b76be9ccef0262cf78fffb4129eda93"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedBrowser.html#a4b76be9ccef0262cf78fffb4129eda93">__construct</a> (&amp;$auth)</td></tr>
+<tr class="separator:a4b76be9ccef0262cf78fffb4129eda93"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a40fdbb9d9fe6c1243bbf135dd5b0a06f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedBrowser.html#a40fdbb9d9fe6c1243bbf135dd5b0a06f">set_writeable</a> ()</td></tr>
+<tr class="separator:a40fdbb9d9fe6c1243bbf135dd5b0a06f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1f7daf50bb9bfcde7345b3b1908dbd7e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedBrowser.html#a1f7daf50bb9bfcde7345b3b1908dbd7e">generateDirectoryIndex</a> ($path)</td></tr>
+<tr class="separator:a1f7daf50bb9bfcde7345b3b1908dbd7e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7f6bf0bda07833f4c647557bd172e349"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedBrowser.html#a7f6bf0bda07833f4c647557bd172e349">htmlActionsPanel</a> (DAV\INode $node, &amp;$output)</td></tr>
+<tr class="separator:a7f6bf0bda07833f4c647557bd172e349"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pri-attribs"></a>
+Private Attributes</h2></td></tr>
+<tr class="memitem:ab6d6d1e2a67e06b344a4cede1bd00b35"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedBrowser.html#ab6d6d1e2a67e06b344a4cede1bd00b35">$auth</a></td></tr>
+<tr class="separator:ab6d6d1e2a67e06b344a4cede1bd00b35"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Constructor &amp; Destructor Documentation</h2>
+<a class="anchor" id="a4b76be9ccef0262cf78fffb4129eda93"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedBrowser::__construct </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$auth</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Member Function Documentation</h2>
+<a class="anchor" id="a1f7daf50bb9bfcde7345b3b1908dbd7e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedBrowser::generateDirectoryIndex </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$path</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a7f6bf0bda07833f4c647557bd172e349"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedBrowser::htmlActionsPanel </td>
+ <td>(</td>
+ <td class="paramtype">DAV\INode&#160;</td>
+ <td class="paramname"><em>$node</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$output</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a40fdbb9d9fe6c1243bbf135dd5b0a06f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedBrowser::set_writeable </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Member Data Documentation</h2>
+<a class="anchor" id="ab6d6d1e2a67e06b344a4cede1bd00b35"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedBrowser::$auth</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classRedBrowser.html#a4b76be9ccef0262cf78fffb4129eda93">__construct()</a>.</p>
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>include/<a class="el" href="reddav_8php.html">reddav.php</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classRedBrowser.js b/doc/html/classRedBrowser.js
new file mode 100644
index 000000000..c0222b8f9
--- /dev/null
+++ b/doc/html/classRedBrowser.js
@@ -0,0 +1,8 @@
+var classRedBrowser =
+[
+ [ "__construct", "classRedBrowser.html#a4b76be9ccef0262cf78fffb4129eda93", null ],
+ [ "generateDirectoryIndex", "classRedBrowser.html#a1f7daf50bb9bfcde7345b3b1908dbd7e", null ],
+ [ "htmlActionsPanel", "classRedBrowser.html#a7f6bf0bda07833f4c647557bd172e349", null ],
+ [ "set_writeable", "classRedBrowser.html#a40fdbb9d9fe6c1243bbf135dd5b0a06f", null ],
+ [ "$auth", "classRedBrowser.html#ab6d6d1e2a67e06b344a4cede1bd00b35", null ]
+]; \ No newline at end of file
diff --git a/doc/html/classRedBrowser.png b/doc/html/classRedBrowser.png
new file mode 100644
index 000000000..df14b3aa8
--- /dev/null
+++ b/doc/html/classRedBrowser.png
Binary files differ
diff --git a/doc/html/classRedDirectory-members.html b/doc/html/classRedDirectory-members.html
new file mode 100644
index 000000000..7f5ff11b7
--- /dev/null
+++ b/doc/html/classRedDirectory-members.html
@@ -0,0 +1,131 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classRedDirectory.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">RedDirectory Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classRedDirectory.html">RedDirectory</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="classRedDirectory.html#a9616af16cd19a18a6afebebcc2881c44">$auth</a></td><td class="entry"><a class="el" href="classRedDirectory.html">RedDirectory</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classRedDirectory.html#a0f113244cd85c17848df991001d024f4">$ext_path</a></td><td class="entry"><a class="el" href="classRedDirectory.html">RedDirectory</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classRedDirectory.html#aa10254abf177bb2a0e4a88495725e09b">$folder_hash</a></td><td class="entry"><a class="el" href="classRedDirectory.html">RedDirectory</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classRedDirectory.html#a3c148c07ad909985125aa4926d8d0021">$os_path</a></td><td class="entry"><a class="el" href="classRedDirectory.html">RedDirectory</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classRedDirectory.html#acb32b8df27538c57772824a745e751d7">$red_path</a></td><td class="entry"><a class="el" href="classRedDirectory.html">RedDirectory</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classRedDirectory.html#ad87c514a307ec97ba0f1372e9bcfa6a4">$root_dir</a></td><td class="entry"><a class="el" href="classRedDirectory.html">RedDirectory</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classRedDirectory.html#a1e35e3cd31d2a15250655e4cafdea180">__construct</a>($ext_path, &amp;$auth_plugin)</td><td class="entry"><a class="el" href="classRedDirectory.html">RedDirectory</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classRedDirectory.html#a5e3fc08b2bf9f61cea4d2ccae0495bec">childExists</a>($name)</td><td class="entry"><a class="el" href="classRedDirectory.html">RedDirectory</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classRedDirectory.html#a986936910f0216887a25e28916c166c7">createDirectory</a>($name)</td><td class="entry"><a class="el" href="classRedDirectory.html">RedDirectory</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classRedDirectory.html#a2d12d99d38a6a75fc9a830b2f7fc0bf0">createFile</a>($name, $data=null)</td><td class="entry"><a class="el" href="classRedDirectory.html">RedDirectory</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classRedDirectory.html#aaa20f0f44da23781917af8170c0a2569">getChild</a>($name)</td><td class="entry"><a class="el" href="classRedDirectory.html">RedDirectory</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classRedDirectory.html#aa42d3065f6f065b17db87146a7cb031a">getChildren</a>()</td><td class="entry"><a class="el" href="classRedDirectory.html">RedDirectory</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classRedDirectory.html#a70173d4458572d95e586b2037d2fd2f4">getDir</a>()</td><td class="entry"><a class="el" href="classRedDirectory.html">RedDirectory</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classRedDirectory.html#af6e4475dbd5abcdede00d20b8d388583">getName</a>()</td><td class="entry"><a class="el" href="classRedDirectory.html">RedDirectory</a></td><td class="entry"></td></tr>
+</table></div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classRedDirectory.html b/doc/html/classRedDirectory.html
new file mode 100644
index 000000000..d962a13d0
--- /dev/null
+++ b/doc/html/classRedDirectory.html
@@ -0,0 +1,438 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: RedDirectory Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classRedDirectory.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="#pri-attribs">Private Attributes</a> &#124;
+<a href="classRedDirectory-members.html">List of all members</a> </div>
+ <div class="headertitle">
+<div class="title">RedDirectory Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="dynheader">
+Inheritance diagram for RedDirectory:</div>
+<div class="dyncontent">
+ <div class="center">
+ <img src="classRedDirectory.png" usemap="#RedDirectory_map" alt=""/>
+ <map id="RedDirectory_map" name="RedDirectory_map">
+</map>
+ </div></div>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:a1e35e3cd31d2a15250655e4cafdea180"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedDirectory.html#a1e35e3cd31d2a15250655e4cafdea180">__construct</a> ($ext_path, &amp;$auth_plugin)</td></tr>
+<tr class="separator:a1e35e3cd31d2a15250655e4cafdea180"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa42d3065f6f065b17db87146a7cb031a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedDirectory.html#aa42d3065f6f065b17db87146a7cb031a">getChildren</a> ()</td></tr>
+<tr class="separator:aa42d3065f6f065b17db87146a7cb031a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aaa20f0f44da23781917af8170c0a2569"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedDirectory.html#aaa20f0f44da23781917af8170c0a2569">getChild</a> ($name)</td></tr>
+<tr class="separator:aaa20f0f44da23781917af8170c0a2569"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af6e4475dbd5abcdede00d20b8d388583"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedDirectory.html#af6e4475dbd5abcdede00d20b8d388583">getName</a> ()</td></tr>
+<tr class="separator:af6e4475dbd5abcdede00d20b8d388583"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2d12d99d38a6a75fc9a830b2f7fc0bf0"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedDirectory.html#a2d12d99d38a6a75fc9a830b2f7fc0bf0">createFile</a> ($name, $data=null)</td></tr>
+<tr class="separator:a2d12d99d38a6a75fc9a830b2f7fc0bf0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a986936910f0216887a25e28916c166c7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedDirectory.html#a986936910f0216887a25e28916c166c7">createDirectory</a> ($name)</td></tr>
+<tr class="separator:a986936910f0216887a25e28916c166c7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5e3fc08b2bf9f61cea4d2ccae0495bec"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedDirectory.html#a5e3fc08b2bf9f61cea4d2ccae0495bec">childExists</a> ($name)</td></tr>
+<tr class="separator:a5e3fc08b2bf9f61cea4d2ccae0495bec"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a70173d4458572d95e586b2037d2fd2f4"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedDirectory.html#a70173d4458572d95e586b2037d2fd2f4">getDir</a> ()</td></tr>
+<tr class="separator:a70173d4458572d95e586b2037d2fd2f4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pri-attribs"></a>
+Private Attributes</h2></td></tr>
+<tr class="memitem:acb32b8df27538c57772824a745e751d7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedDirectory.html#acb32b8df27538c57772824a745e751d7">$red_path</a></td></tr>
+<tr class="separator:acb32b8df27538c57772824a745e751d7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa10254abf177bb2a0e4a88495725e09b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedDirectory.html#aa10254abf177bb2a0e4a88495725e09b">$folder_hash</a></td></tr>
+<tr class="separator:aa10254abf177bb2a0e4a88495725e09b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0f113244cd85c17848df991001d024f4"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedDirectory.html#a0f113244cd85c17848df991001d024f4">$ext_path</a></td></tr>
+<tr class="separator:a0f113244cd85c17848df991001d024f4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad87c514a307ec97ba0f1372e9bcfa6a4"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedDirectory.html#ad87c514a307ec97ba0f1372e9bcfa6a4">$root_dir</a> = ''</td></tr>
+<tr class="separator:ad87c514a307ec97ba0f1372e9bcfa6a4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9616af16cd19a18a6afebebcc2881c44"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedDirectory.html#a9616af16cd19a18a6afebebcc2881c44">$auth</a></td></tr>
+<tr class="separator:a9616af16cd19a18a6afebebcc2881c44"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3c148c07ad909985125aa4926d8d0021"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedDirectory.html#a3c148c07ad909985125aa4926d8d0021">$os_path</a> = ''</td></tr>
+<tr class="separator:a3c148c07ad909985125aa4926d8d0021"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Constructor &amp; Destructor Documentation</h2>
+<a class="anchor" id="a1e35e3cd31d2a15250655e4cafdea180"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedDirectory::__construct </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$ext_path</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$auth_plugin</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Member Function Documentation</h2>
+<a class="anchor" id="a5e3fc08b2bf9f61cea4d2ccae0495bec"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedDirectory::childExists </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$name</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a986936910f0216887a25e28916c166c7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedDirectory::createDirectory </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$name</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a2d12d99d38a6a75fc9a830b2f7fc0bf0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedDirectory::createFile </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$name</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$data</em> = <code>null</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aaa20f0f44da23781917af8170c0a2569"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedDirectory::getChild </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$name</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aa42d3065f6f065b17db87146a7cb031a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedDirectory::getChildren </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a70173d4458572d95e586b2037d2fd2f4"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedDirectory::getDir </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classRedDirectory.html#a1e35e3cd31d2a15250655e4cafdea180">__construct()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="af6e4475dbd5abcdede00d20b8d388583"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedDirectory::getName </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Member Data Documentation</h2>
+<a class="anchor" id="a9616af16cd19a18a6afebebcc2881c44"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedDirectory::$auth</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a0f113244cd85c17848df991001d024f4"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedDirectory::$ext_path</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classRedDirectory.html#a1e35e3cd31d2a15250655e4cafdea180">__construct()</a>, and <a class="el" href="classRedDirectory.html#a70173d4458572d95e586b2037d2fd2f4">getDir()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa10254abf177bb2a0e4a88495725e09b"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedDirectory::$folder_hash</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a3c148c07ad909985125aa4926d8d0021"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedDirectory::$os_path = ''</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classRedDirectory.html#a2d12d99d38a6a75fc9a830b2f7fc0bf0">createFile()</a>, and <a class="el" href="classRedDirectory.html#a70173d4458572d95e586b2037d2fd2f4">getDir()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="acb32b8df27538c57772824a745e751d7"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedDirectory::$red_path</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ad87c514a307ec97ba0f1372e9bcfa6a4"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedDirectory::$root_dir = ''</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>include/<a class="el" href="reddav_8php.html">reddav.php</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classRedDirectory.js b/doc/html/classRedDirectory.js
new file mode 100644
index 000000000..e7313b822
--- /dev/null
+++ b/doc/html/classRedDirectory.js
@@ -0,0 +1,17 @@
+var classRedDirectory =
+[
+ [ "__construct", "classRedDirectory.html#a1e35e3cd31d2a15250655e4cafdea180", null ],
+ [ "childExists", "classRedDirectory.html#a5e3fc08b2bf9f61cea4d2ccae0495bec", null ],
+ [ "createDirectory", "classRedDirectory.html#a986936910f0216887a25e28916c166c7", null ],
+ [ "createFile", "classRedDirectory.html#a2d12d99d38a6a75fc9a830b2f7fc0bf0", null ],
+ [ "getChild", "classRedDirectory.html#aaa20f0f44da23781917af8170c0a2569", null ],
+ [ "getChildren", "classRedDirectory.html#aa42d3065f6f065b17db87146a7cb031a", null ],
+ [ "getDir", "classRedDirectory.html#a70173d4458572d95e586b2037d2fd2f4", null ],
+ [ "getName", "classRedDirectory.html#af6e4475dbd5abcdede00d20b8d388583", null ],
+ [ "$auth", "classRedDirectory.html#a9616af16cd19a18a6afebebcc2881c44", null ],
+ [ "$ext_path", "classRedDirectory.html#a0f113244cd85c17848df991001d024f4", null ],
+ [ "$folder_hash", "classRedDirectory.html#aa10254abf177bb2a0e4a88495725e09b", null ],
+ [ "$os_path", "classRedDirectory.html#a3c148c07ad909985125aa4926d8d0021", null ],
+ [ "$red_path", "classRedDirectory.html#acb32b8df27538c57772824a745e751d7", null ],
+ [ "$root_dir", "classRedDirectory.html#ad87c514a307ec97ba0f1372e9bcfa6a4", null ]
+]; \ No newline at end of file
diff --git a/doc/html/classRedDirectory.png b/doc/html/classRedDirectory.png
new file mode 100644
index 000000000..192133f6a
--- /dev/null
+++ b/doc/html/classRedDirectory.png
Binary files differ
diff --git a/doc/html/classRedFile-members.html b/doc/html/classRedFile-members.html
new file mode 100644
index 000000000..343fe2a82
--- /dev/null
+++ b/doc/html/classRedFile-members.html
@@ -0,0 +1,130 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classRedFile.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">RedFile Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classRedFile.html">RedFile</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="classRedFile.html#a4b5d0e33f919c6c175b30a55de6263f2">$auth</a></td><td class="entry"><a class="el" href="classRedFile.html">RedFile</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classRedFile.html#a2ff12032b45538353eded9809d3b7550">$data</a></td><td class="entry"><a class="el" href="classRedFile.html">RedFile</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classRedFile.html#acc48c05cd5a70951cb3c615ad84f03ba">$name</a></td><td class="entry"><a class="el" href="classRedFile.html">RedFile</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classRedFile.html#a9a67bdb34c9db6ce144b3f371148b183">__construct</a>($name, $data, &amp;$auth)</td><td class="entry"><a class="el" href="classRedFile.html">RedFile</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classRedFile.html#aef71c9eaac7052be7dc8602eb12171e7">delete</a>()</td><td class="entry"><a class="el" href="classRedFile.html">RedFile</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classRedFile.html#a7c868dfcef6c70cd0e24cf3caa2c3535">get</a>()</td><td class="entry"><a class="el" href="classRedFile.html">RedFile</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classRedFile.html#a26416827eb68554d033d1e2e5cc6dd3b">getContentType</a>()</td><td class="entry"><a class="el" href="classRedFile.html">RedFile</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classRedFile.html#ae96d5caa2db7a461c57b24380fa87e28">getETag</a>()</td><td class="entry"><a class="el" href="classRedFile.html">RedFile</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classRedFile.html#a41562a28007789bbe7fe06d6a20eef47">getLastModified</a>()</td><td class="entry"><a class="el" href="classRedFile.html">RedFile</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classRedFile.html#a0c961c5f49544d2502420361fa526437">getName</a>()</td><td class="entry"><a class="el" href="classRedFile.html">RedFile</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classRedFile.html#acb1edbe1848fab05347746fa1ea09d8f">getSize</a>()</td><td class="entry"><a class="el" href="classRedFile.html">RedFile</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classRedFile.html#a41a49a583eb276b75626fcf97f4a699c">put</a>($data)</td><td class="entry"><a class="el" href="classRedFile.html">RedFile</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classRedFile.html#a38a82bfc1b30028ea6ac75923e90fa25">setName</a>($newName)</td><td class="entry"><a class="el" href="classRedFile.html">RedFile</a></td><td class="entry"></td></tr>
+</table></div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classRedFile.html b/doc/html/classRedFile.html
new file mode 100644
index 000000000..c45b36c39
--- /dev/null
+++ b/doc/html/classRedFile.html
@@ -0,0 +1,400 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: RedFile Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classRedFile.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="#pri-attribs">Private Attributes</a> &#124;
+<a href="classRedFile-members.html">List of all members</a> </div>
+ <div class="headertitle">
+<div class="title">RedFile Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="dynheader">
+Inheritance diagram for RedFile:</div>
+<div class="dyncontent">
+ <div class="center">
+ <img src="classRedFile.png" usemap="#RedFile_map" alt=""/>
+ <map id="RedFile_map" name="RedFile_map">
+</map>
+ </div></div>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:a9a67bdb34c9db6ce144b3f371148b183"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedFile.html#a9a67bdb34c9db6ce144b3f371148b183">__construct</a> ($name, $data, &amp;$auth)</td></tr>
+<tr class="separator:a9a67bdb34c9db6ce144b3f371148b183"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0c961c5f49544d2502420361fa526437"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedFile.html#a0c961c5f49544d2502420361fa526437">getName</a> ()</td></tr>
+<tr class="separator:a0c961c5f49544d2502420361fa526437"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a38a82bfc1b30028ea6ac75923e90fa25"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedFile.html#a38a82bfc1b30028ea6ac75923e90fa25">setName</a> ($newName)</td></tr>
+<tr class="separator:a38a82bfc1b30028ea6ac75923e90fa25"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a41a49a583eb276b75626fcf97f4a699c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedFile.html#a41a49a583eb276b75626fcf97f4a699c">put</a> ($data)</td></tr>
+<tr class="separator:a41a49a583eb276b75626fcf97f4a699c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7c868dfcef6c70cd0e24cf3caa2c3535"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedFile.html#a7c868dfcef6c70cd0e24cf3caa2c3535">get</a> ()</td></tr>
+<tr class="separator:a7c868dfcef6c70cd0e24cf3caa2c3535"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae96d5caa2db7a461c57b24380fa87e28"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedFile.html#ae96d5caa2db7a461c57b24380fa87e28">getETag</a> ()</td></tr>
+<tr class="separator:ae96d5caa2db7a461c57b24380fa87e28"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a26416827eb68554d033d1e2e5cc6dd3b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedFile.html#a26416827eb68554d033d1e2e5cc6dd3b">getContentType</a> ()</td></tr>
+<tr class="separator:a26416827eb68554d033d1e2e5cc6dd3b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acb1edbe1848fab05347746fa1ea09d8f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedFile.html#acb1edbe1848fab05347746fa1ea09d8f">getSize</a> ()</td></tr>
+<tr class="separator:acb1edbe1848fab05347746fa1ea09d8f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a41562a28007789bbe7fe06d6a20eef47"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedFile.html#a41562a28007789bbe7fe06d6a20eef47">getLastModified</a> ()</td></tr>
+<tr class="separator:a41562a28007789bbe7fe06d6a20eef47"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aef71c9eaac7052be7dc8602eb12171e7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedFile.html#aef71c9eaac7052be7dc8602eb12171e7">delete</a> ()</td></tr>
+<tr class="separator:aef71c9eaac7052be7dc8602eb12171e7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pri-attribs"></a>
+Private Attributes</h2></td></tr>
+<tr class="memitem:a2ff12032b45538353eded9809d3b7550"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedFile.html#a2ff12032b45538353eded9809d3b7550">$data</a></td></tr>
+<tr class="separator:a2ff12032b45538353eded9809d3b7550"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4b5d0e33f919c6c175b30a55de6263f2"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedFile.html#a4b5d0e33f919c6c175b30a55de6263f2">$auth</a></td></tr>
+<tr class="separator:a4b5d0e33f919c6c175b30a55de6263f2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acc48c05cd5a70951cb3c615ad84f03ba"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedFile.html#acc48c05cd5a70951cb3c615ad84f03ba">$name</a></td></tr>
+<tr class="separator:acc48c05cd5a70951cb3c615ad84f03ba"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Constructor &amp; Destructor Documentation</h2>
+<a class="anchor" id="a9a67bdb34c9db6ce144b3f371148b183"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedFile::__construct </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$name</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$data</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$auth</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Member Function Documentation</h2>
+<a class="anchor" id="aef71c9eaac7052be7dc8602eb12171e7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedFile::delete </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a7c868dfcef6c70cd0e24cf3caa2c3535"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedFile::get </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a26416827eb68554d033d1e2e5cc6dd3b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedFile::getContentType </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ae96d5caa2db7a461c57b24380fa87e28"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedFile::getETag </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a41562a28007789bbe7fe06d6a20eef47"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedFile::getLastModified </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a0c961c5f49544d2502420361fa526437"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedFile::getName </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="acb1edbe1848fab05347746fa1ea09d8f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedFile::getSize </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a41a49a583eb276b75626fcf97f4a699c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedFile::put </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$data</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a38a82bfc1b30028ea6ac75923e90fa25"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedFile::setName </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$newName</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Member Data Documentation</h2>
+<a class="anchor" id="a4b5d0e33f919c6c175b30a55de6263f2"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedFile::$auth</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classRedFile.html#a9a67bdb34c9db6ce144b3f371148b183">__construct()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a2ff12032b45538353eded9809d3b7550"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedFile::$data</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classRedFile.html#a9a67bdb34c9db6ce144b3f371148b183">__construct()</a>, and <a class="el" href="classRedFile.html#a41a49a583eb276b75626fcf97f4a699c">put()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="acc48c05cd5a70951cb3c615ad84f03ba"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedFile::$name</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classRedFile.html#a9a67bdb34c9db6ce144b3f371148b183">__construct()</a>.</p>
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>include/<a class="el" href="reddav_8php.html">reddav.php</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classRedFile.js b/doc/html/classRedFile.js
new file mode 100644
index 000000000..4f03440ad
--- /dev/null
+++ b/doc/html/classRedFile.js
@@ -0,0 +1,16 @@
+var classRedFile =
+[
+ [ "__construct", "classRedFile.html#a9a67bdb34c9db6ce144b3f371148b183", null ],
+ [ "delete", "classRedFile.html#aef71c9eaac7052be7dc8602eb12171e7", null ],
+ [ "get", "classRedFile.html#a7c868dfcef6c70cd0e24cf3caa2c3535", null ],
+ [ "getContentType", "classRedFile.html#a26416827eb68554d033d1e2e5cc6dd3b", null ],
+ [ "getETag", "classRedFile.html#ae96d5caa2db7a461c57b24380fa87e28", null ],
+ [ "getLastModified", "classRedFile.html#a41562a28007789bbe7fe06d6a20eef47", null ],
+ [ "getName", "classRedFile.html#a0c961c5f49544d2502420361fa526437", null ],
+ [ "getSize", "classRedFile.html#acb1edbe1848fab05347746fa1ea09d8f", null ],
+ [ "put", "classRedFile.html#a41a49a583eb276b75626fcf97f4a699c", null ],
+ [ "setName", "classRedFile.html#a38a82bfc1b30028ea6ac75923e90fa25", null ],
+ [ "$auth", "classRedFile.html#a4b5d0e33f919c6c175b30a55de6263f2", null ],
+ [ "$data", "classRedFile.html#a2ff12032b45538353eded9809d3b7550", null ],
+ [ "$name", "classRedFile.html#acc48c05cd5a70951cb3c615ad84f03ba", null ]
+]; \ No newline at end of file
diff --git a/doc/html/classRedFile.png b/doc/html/classRedFile.png
new file mode 100644
index 000000000..81ce66310
--- /dev/null
+++ b/doc/html/classRedFile.png
Binary files differ
diff --git a/doc/html/classRedInode-members.html b/doc/html/classRedInode-members.html
new file mode 100644
index 000000000..3d8504822
--- /dev/null
+++ b/doc/html/classRedInode-members.html
@@ -0,0 +1,123 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classRedInode.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">RedInode Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classRedInode.html">RedInode</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="classRedInode.html#a7b317eb1230930154107ed51e54193f5">$attach</a></td><td class="entry"><a class="el" href="classRedInode.html">RedInode</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classRedInode.html#a21a6f92921c037c868e6fae30c7c51bb">__construct</a>($attach)</td><td class="entry"><a class="el" href="classRedInode.html">RedInode</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classRedInode.html#a5e8f09bc887725c3c448f8d72fe3edfc">delete</a>()</td><td class="entry"><a class="el" href="classRedInode.html">RedInode</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classRedInode.html#a8503d4f247186e9e55bc42b37e067fb6">getLastModified</a>()</td><td class="entry"><a class="el" href="classRedInode.html">RedInode</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classRedInode.html#aec5706105400764124db39d4bc68d458">getName</a>()</td><td class="entry"><a class="el" href="classRedInode.html">RedInode</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classRedInode.html#a3d76322f25d847b123b3df37a26dd04e">setName</a>($newName)</td><td class="entry"><a class="el" href="classRedInode.html">RedInode</a></td><td class="entry"></td></tr>
+</table></div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classRedInode.html b/doc/html/classRedInode.html
new file mode 100644
index 000000000..3f19069a6
--- /dev/null
+++ b/doc/html/classRedInode.html
@@ -0,0 +1,251 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: RedInode Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classRedInode.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="#pri-attribs">Private Attributes</a> &#124;
+<a href="classRedInode-members.html">List of all members</a> </div>
+ <div class="headertitle">
+<div class="title">RedInode Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="dynheader">
+Inheritance diagram for RedInode:</div>
+<div class="dyncontent">
+ <div class="center">
+ <img src="classRedInode.png" usemap="#RedInode_map" alt=""/>
+ <map id="RedInode_map" name="RedInode_map">
+</map>
+ </div></div>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:a21a6f92921c037c868e6fae30c7c51bb"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedInode.html#a21a6f92921c037c868e6fae30c7c51bb">__construct</a> ($attach)</td></tr>
+<tr class="separator:a21a6f92921c037c868e6fae30c7c51bb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5e8f09bc887725c3c448f8d72fe3edfc"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedInode.html#a5e8f09bc887725c3c448f8d72fe3edfc">delete</a> ()</td></tr>
+<tr class="separator:a5e8f09bc887725c3c448f8d72fe3edfc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aec5706105400764124db39d4bc68d458"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedInode.html#aec5706105400764124db39d4bc68d458">getName</a> ()</td></tr>
+<tr class="separator:aec5706105400764124db39d4bc68d458"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3d76322f25d847b123b3df37a26dd04e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedInode.html#a3d76322f25d847b123b3df37a26dd04e">setName</a> ($newName)</td></tr>
+<tr class="separator:a3d76322f25d847b123b3df37a26dd04e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8503d4f247186e9e55bc42b37e067fb6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedInode.html#a8503d4f247186e9e55bc42b37e067fb6">getLastModified</a> ()</td></tr>
+<tr class="separator:a8503d4f247186e9e55bc42b37e067fb6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pri-attribs"></a>
+Private Attributes</h2></td></tr>
+<tr class="memitem:a7b317eb1230930154107ed51e54193f5"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedInode.html#a7b317eb1230930154107ed51e54193f5">$attach</a></td></tr>
+<tr class="separator:a7b317eb1230930154107ed51e54193f5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Constructor &amp; Destructor Documentation</h2>
+<a class="anchor" id="a21a6f92921c037c868e6fae30c7c51bb"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedInode::__construct </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$attach</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Member Function Documentation</h2>
+<a class="anchor" id="a5e8f09bc887725c3c448f8d72fe3edfc"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedInode::delete </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Since I don't believe this is documented elsewhere - ATTACH_FLAG_OS means that the file contents are stored in the OS rather than in the DB - as is the case for attachments. Exactly how they are stored (what path and filename) are still TBD. We will probably not be using the original filename but instead the attachment 'hash' as this will prevent folks from uploading PHP code onto misconfigured servers and executing it. It's easy to misconfigure servers because we can provide a rule for Apache, but folks using nginx will then be susceptible. Then there are those who don't understand these kinds of exploits and don't have any idea allowing uploaded PHP files to be executed by the server could be a problem. We also don't have any idea what executable types are served on their system - like .py, .pyc, .pl, .sh .cgi, .exe, .bat, .net, whatever.</p>
+
+</div>
+</div>
+<a class="anchor" id="a8503d4f247186e9e55bc42b37e067fb6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedInode::getLastModified </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aec5706105400764124db39d4bc68d458"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedInode::getName </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a3d76322f25d847b123b3df37a26dd04e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedInode::setName </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$newName</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Member Data Documentation</h2>
+<a class="anchor" id="a7b317eb1230930154107ed51e54193f5"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedInode::$attach</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classRedInode.html#a21a6f92921c037c868e6fae30c7c51bb">__construct()</a>.</p>
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>include/<a class="el" href="reddav_8php.html">reddav.php</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classRedInode.js b/doc/html/classRedInode.js
new file mode 100644
index 000000000..6bf4d5840
--- /dev/null
+++ b/doc/html/classRedInode.js
@@ -0,0 +1,9 @@
+var classRedInode =
+[
+ [ "__construct", "classRedInode.html#a21a6f92921c037c868e6fae30c7c51bb", null ],
+ [ "delete", "classRedInode.html#a5e8f09bc887725c3c448f8d72fe3edfc", null ],
+ [ "getLastModified", "classRedInode.html#a8503d4f247186e9e55bc42b37e067fb6", null ],
+ [ "getName", "classRedInode.html#aec5706105400764124db39d4bc68d458", null ],
+ [ "setName", "classRedInode.html#a3d76322f25d847b123b3df37a26dd04e", null ],
+ [ "$attach", "classRedInode.html#a7b317eb1230930154107ed51e54193f5", null ]
+]; \ No newline at end of file
diff --git a/doc/html/classRedInode.png b/doc/html/classRedInode.png
new file mode 100644
index 000000000..77027544c
--- /dev/null
+++ b/doc/html/classRedInode.png
Binary files differ
diff --git a/doc/html/classTemplate-members.html b/doc/html/classTemplate-members.html
new file mode 100644
index 000000000..c3620c316
--- /dev/null
+++ b/doc/html/classTemplate-members.html
@@ -0,0 +1,142 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classTemplate.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">Template Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classTemplate.html">Template</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="classTemplate.html#a8469ab2988b6be2681516dc4b4e07d38">$d</a></td><td class="entry"><a class="el" href="classTemplate.html">Template</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classTemplate.html#afc4afb6f89bebcd5480022312a56cb4a">$debug</a></td><td class="entry"><a class="el" href="classTemplate.html">Template</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classTemplate.html#abda4c8d049f70553338eae7c905e9d5c">$done</a></td><td class="entry"><a class="el" href="classTemplate.html">Template</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classTemplate.html#ace26b8a4252fbc1c385d2b5e1e93e5c8">$lang</a></td><td class="entry"><a class="el" href="classTemplate.html">Template</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classTemplate.html#a6eb301a51cc94d8b94f4548fbad85eae">$name</a></td><td class="entry"><a class="el" href="classTemplate.html">Template</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classTemplate.html#a8f4d17e49f42b876a97364c13fb572d1">$nodes</a></td><td class="entry"><a class="el" href="classTemplate.html">Template</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classTemplate.html#aac9a4638f11271e1b1dcc9f247242718">$r</a></td><td class="entry"><a class="el" href="classTemplate.html">Template</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classTemplate.html#a4e86b566c3f728e95ce5db1b33665c10">$replace</a></td><td class="entry"><a class="el" href="classTemplate.html">Template</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classTemplate.html#a317d535946dc065c35dd5cd38380e6c6">$search</a></td><td class="entry"><a class="el" href="classTemplate.html">Template</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classTemplate.html#a6f0efc256688c36110180b501067ff11">$stack</a></td><td class="entry"><a class="el" href="classTemplate.html">Template</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classTemplate.html#ac41c96e1f407b1a910029e5f4b7de8e4">_build_nodes</a>($s)</td><td class="entry"><a class="el" href="classTemplate.html">Template</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classTemplate.html#aae9c4d761ea1298e745e8052d7910194">_get_var</a>($name, $retNoKey=false)</td><td class="entry"><a class="el" href="classTemplate.html">Template</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classTemplate.html#a35d599c9b53a02e2fe2232e5b7ed5da7">_pop_stack</a>()</td><td class="entry"><a class="el" href="classTemplate.html">Template</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classTemplate.html#a37c15f6d1ade500943629f27a62808b7">_preg_error</a>()</td><td class="entry"><a class="el" href="classTemplate.html">Template</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classTemplate.html#aa6a087e0b7b887dd1c98c9e0ecbd3b29">_push_stack</a>()</td><td class="entry"><a class="el" href="classTemplate.html">Template</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classTemplate.html#ae791766c3d055f7f1ba5a5e60d647934">_replcb</a>($m)</td><td class="entry"><a class="el" href="classTemplate.html">Template</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classTemplate.html#a4b933954086d9e01a1804b0b1c6ee93e">_replcb_debug</a>($args)</td><td class="entry"><a class="el" href="classTemplate.html">Template</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classTemplate.html#abf71098c80fd1f218a59452b3408309e">_replcb_for</a>($args)</td><td class="entry"><a class="el" href="classTemplate.html">Template</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classTemplate.html#ae0836e7d5bd5afceb04f50fd635f1228">_replcb_if</a>($args)</td><td class="entry"><a class="el" href="classTemplate.html">Template</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classTemplate.html#a86e8fd27955ef10cadfd86f3fca70677">_replcb_inc</a>($args)</td><td class="entry"><a class="el" href="classTemplate.html">Template</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classTemplate.html#aa6f9bd7a8f7512efcf90e8d376fe05ee">_replcb_node</a>($m)</td><td class="entry"><a class="el" href="classTemplate.html">Template</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classTemplate.html#afd97b4b1e7754a550e67c0ea79159059">get_markup_template</a>($file, $root='')</td><td class="entry"><a class="el" href="classTemplate.html">Template</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classTemplate.html#a285b5b2007dbbf733476273df3fed4ef">replace</a>($s, $r)</td><td class="entry"><a class="el" href="classTemplate.html">Template</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classTemplate.html#a07737733f6949bdedea1e3d301b2ab7b">replace_macros</a>($s, $r)</td><td class="entry"><a class="el" href="classTemplate.html">Template</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classTemplate.html#abbc484016ddf5d818f55b823cae6feb0">var_replace</a>($s)</td><td class="entry"><a class="el" href="classTemplate.html">Template</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+</table></div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classTemplate.html b/doc/html/classTemplate.html
new file mode 100644
index 000000000..9ea7d2643
--- /dev/null
+++ b/doc/html/classTemplate.html
@@ -0,0 +1,742 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Template Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classTemplate.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="#pub-attribs">Public Attributes</a> &#124;
+<a href="#pub-static-attribs">Static Public Attributes</a> &#124;
+<a href="#pri-methods">Private Member Functions</a> &#124;
+<a href="classTemplate-members.html">List of all members</a> </div>
+ <div class="headertitle">
+<div class="title">Template Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="dynheader">
+Inheritance diagram for Template:</div>
+<div class="dyncontent">
+ <div class="center">
+ <img src="classTemplate.png" usemap="#Template_map" alt=""/>
+ <map id="Template_map" name="Template_map">
+<area href="interfaceITemplateEngine.html" alt="ITemplateEngine" shape="rect" coords="0,0,104,24"/>
+</map>
+ </div></div>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:a07737733f6949bdedea1e3d301b2ab7b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTemplate.html#a07737733f6949bdedea1e3d301b2ab7b">replace_macros</a> ($s, $r)</td></tr>
+<tr class="separator:a07737733f6949bdedea1e3d301b2ab7b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afd97b4b1e7754a550e67c0ea79159059"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTemplate.html#afd97b4b1e7754a550e67c0ea79159059">get_markup_template</a> ($file, $root='')</td></tr>
+<tr class="separator:afd97b4b1e7754a550e67c0ea79159059"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Public Attributes</h2></td></tr>
+<tr class="memitem:aac9a4638f11271e1b1dcc9f247242718"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTemplate.html#aac9a4638f11271e1b1dcc9f247242718">$r</a></td></tr>
+<tr class="separator:aac9a4638f11271e1b1dcc9f247242718"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a317d535946dc065c35dd5cd38380e6c6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTemplate.html#a317d535946dc065c35dd5cd38380e6c6">$search</a></td></tr>
+<tr class="separator:a317d535946dc065c35dd5cd38380e6c6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4e86b566c3f728e95ce5db1b33665c10"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTemplate.html#a4e86b566c3f728e95ce5db1b33665c10">$replace</a></td></tr>
+<tr class="separator:a4e86b566c3f728e95ce5db1b33665c10"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6f0efc256688c36110180b501067ff11"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTemplate.html#a6f0efc256688c36110180b501067ff11">$stack</a> = array()</td></tr>
+<tr class="separator:a6f0efc256688c36110180b501067ff11"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8f4d17e49f42b876a97364c13fb572d1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTemplate.html#a8f4d17e49f42b876a97364c13fb572d1">$nodes</a> = array()</td></tr>
+<tr class="separator:a8f4d17e49f42b876a97364c13fb572d1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abda4c8d049f70553338eae7c905e9d5c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTemplate.html#abda4c8d049f70553338eae7c905e9d5c">$done</a> = false</td></tr>
+<tr class="separator:abda4c8d049f70553338eae7c905e9d5c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8469ab2988b6be2681516dc4b4e07d38"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTemplate.html#a8469ab2988b6be2681516dc4b4e07d38">$d</a> = false</td></tr>
+<tr class="separator:a8469ab2988b6be2681516dc4b4e07d38"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ace26b8a4252fbc1c385d2b5e1e93e5c8"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTemplate.html#ace26b8a4252fbc1c385d2b5e1e93e5c8">$lang</a> = null</td></tr>
+<tr class="separator:ace26b8a4252fbc1c385d2b5e1e93e5c8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afc4afb6f89bebcd5480022312a56cb4a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTemplate.html#afc4afb6f89bebcd5480022312a56cb4a">$debug</a> =false</td></tr>
+<tr class="separator:afc4afb6f89bebcd5480022312a56cb4a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-static-attribs"></a>
+Static Public Attributes</h2></td></tr>
+<tr class="memitem:a6eb301a51cc94d8b94f4548fbad85eae"><td class="memItemLeft" align="right" valign="top">static&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTemplate.html#a6eb301a51cc94d8b94f4548fbad85eae">$name</a> =&quot;internal&quot;</td></tr>
+<tr class="separator:a6eb301a51cc94d8b94f4548fbad85eae"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pri-methods"></a>
+Private Member Functions</h2></td></tr>
+<tr class="memitem:a37c15f6d1ade500943629f27a62808b7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTemplate.html#a37c15f6d1ade500943629f27a62808b7">_preg_error</a> ()</td></tr>
+<tr class="separator:a37c15f6d1ade500943629f27a62808b7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa6a087e0b7b887dd1c98c9e0ecbd3b29"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTemplate.html#aa6a087e0b7b887dd1c98c9e0ecbd3b29">_push_stack</a> ()</td></tr>
+<tr class="separator:aa6a087e0b7b887dd1c98c9e0ecbd3b29"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a35d599c9b53a02e2fe2232e5b7ed5da7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTemplate.html#a35d599c9b53a02e2fe2232e5b7ed5da7">_pop_stack</a> ()</td></tr>
+<tr class="separator:a35d599c9b53a02e2fe2232e5b7ed5da7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aae9c4d761ea1298e745e8052d7910194"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTemplate.html#aae9c4d761ea1298e745e8052d7910194">_get_var</a> ($name, $retNoKey=false)</td></tr>
+<tr class="separator:aae9c4d761ea1298e745e8052d7910194"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae0836e7d5bd5afceb04f50fd635f1228"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTemplate.html#ae0836e7d5bd5afceb04f50fd635f1228">_replcb_if</a> ($args)</td></tr>
+<tr class="separator:ae0836e7d5bd5afceb04f50fd635f1228"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abf71098c80fd1f218a59452b3408309e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTemplate.html#abf71098c80fd1f218a59452b3408309e">_replcb_for</a> ($args)</td></tr>
+<tr class="separator:abf71098c80fd1f218a59452b3408309e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a86e8fd27955ef10cadfd86f3fca70677"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTemplate.html#a86e8fd27955ef10cadfd86f3fca70677">_replcb_inc</a> ($args)</td></tr>
+<tr class="separator:a86e8fd27955ef10cadfd86f3fca70677"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4b933954086d9e01a1804b0b1c6ee93e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTemplate.html#a4b933954086d9e01a1804b0b1c6ee93e">_replcb_debug</a> ($args)</td></tr>
+<tr class="separator:a4b933954086d9e01a1804b0b1c6ee93e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa6f9bd7a8f7512efcf90e8d376fe05ee"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTemplate.html#aa6f9bd7a8f7512efcf90e8d376fe05ee">_replcb_node</a> ($m)</td></tr>
+<tr class="separator:aa6f9bd7a8f7512efcf90e8d376fe05ee"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae791766c3d055f7f1ba5a5e60d647934"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTemplate.html#ae791766c3d055f7f1ba5a5e60d647934">_replcb</a> ($m)</td></tr>
+<tr class="separator:ae791766c3d055f7f1ba5a5e60d647934"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac41c96e1f407b1a910029e5f4b7de8e4"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTemplate.html#ac41c96e1f407b1a910029e5f4b7de8e4">_build_nodes</a> ($s)</td></tr>
+<tr class="separator:ac41c96e1f407b1a910029e5f4b7de8e4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abbc484016ddf5d818f55b823cae6feb0"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTemplate.html#abbc484016ddf5d818f55b823cae6feb0">var_replace</a> ($s)</td></tr>
+<tr class="separator:abbc484016ddf5d818f55b823cae6feb0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a285b5b2007dbbf733476273df3fed4ef"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTemplate.html#a285b5b2007dbbf733476273df3fed4ef">replace</a> ($s, $r)</td></tr>
+<tr class="separator:a285b5b2007dbbf733476273df3fed4ef"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Member Function Documentation</h2>
+<a class="anchor" id="ac41c96e1f407b1a910029e5f4b7de8e4"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Template::_build_nodes </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classTemplate.html#a07737733f6949bdedea1e3d301b2ab7b">replace_macros()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aae9c4d761ea1298e745e8052d7910194"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Template::_get_var </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$name</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$retNoKey</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classTemplate.html#a4b933954086d9e01a1804b0b1c6ee93e">_replcb_debug()</a>, <a class="el" href="classTemplate.html#abf71098c80fd1f218a59452b3408309e">_replcb_for()</a>, <a class="el" href="classTemplate.html#ae0836e7d5bd5afceb04f50fd635f1228">_replcb_if()</a>, <a class="el" href="classTemplate.html#a86e8fd27955ef10cadfd86f3fca70677">_replcb_inc()</a>, and <a class="el" href="classTemplate.html#abbc484016ddf5d818f55b823cae6feb0">var_replace()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a35d599c9b53a02e2fe2232e5b7ed5da7"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Template::_pop_stack </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classTemplate.html#abf71098c80fd1f218a59452b3408309e">_replcb_for()</a>, and <a class="el" href="classTemplate.html#a86e8fd27955ef10cadfd86f3fca70677">_replcb_inc()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a37c15f6d1ade500943629f27a62808b7"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Template::_preg_error </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classTemplate.html#ac41c96e1f407b1a910029e5f4b7de8e4">_build_nodes()</a>, and <a class="el" href="classTemplate.html#a07737733f6949bdedea1e3d301b2ab7b">replace_macros()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa6a087e0b7b887dd1c98c9e0ecbd3b29"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Template::_push_stack </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classTemplate.html#abf71098c80fd1f218a59452b3408309e">_replcb_for()</a>, and <a class="el" href="classTemplate.html#a86e8fd27955ef10cadfd86f3fca70677">_replcb_inc()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ae791766c3d055f7f1ba5a5e60d647934"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Template::_replcb </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$m</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a4b933954086d9e01a1804b0b1c6ee93e"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Template::_replcb_debug </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$args</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+<p>DEBUG node</p>
+<p>{{ debug $var [$var [$var [...]]] }}{{ enddebug }}</p>
+<p>replace node with </p>
+<pre>var_dump($var, $var, ...);</pre>
+</div>
+</div>
+<a class="anchor" id="abf71098c80fd1f218a59452b3408309e"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Template::_replcb_for </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$args</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+<p>FOR node</p>
+<p>{{ for &lt; $var&gt;=""&gt; as $name }}...{{ endfor }} {{ for &lt; $var&gt;=""&gt; as $key=&gt;$name }}...{{ endfor }} </p>
+
+</div>
+</div>
+<a class="anchor" id="ae0836e7d5bd5afceb04f50fd635f1228"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Template::_replcb_if </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$args</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+<p>IF node</p>
+<p>{{ if &lt; $var&gt;=""&gt; }}...[{{ else }} ...] {{ endif }} {{ if &lt; $var&gt;=""&gt;==&lt;val|$var&gt; }}...[{{ else }} ...]{{ endif }} {{ if &lt; $var&gt;=""&gt;!=&lt;val|$var&gt; }}...[{{ else }} ...]{{ endif }} </p>
+
+</div>
+</div>
+<a class="anchor" id="a86e8fd27955ef10cadfd86f3fca70677"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Template::_replcb_inc </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$args</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+<p>INC node</p>
+<p>{{ inc &lt;templatefile&gt; [with $var1=$var2] }}{{ endinc }} </p>
+
+</div>
+</div>
+<a class="anchor" id="aa6f9bd7a8f7512efcf90e8d376fe05ee"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Template::_replcb_node </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$m</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="afd97b4b1e7754a550e67c0ea79159059"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Template::get_markup_template </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$file</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$root</em> = <code>''</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Implements <a class="el" href="interfaceITemplateEngine.html#aaf2698adbf46c073c24b162fe1b1c442">ITemplateEngine</a>.</p>
+
+<p>Referenced by <a class="el" href="classTemplate.html#a86e8fd27955ef10cadfd86f3fca70677">_replcb_inc()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a285b5b2007dbbf733476273df3fed4ef"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Template::replace </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$r</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classTemplate.html#abf71098c80fd1f218a59452b3408309e">_replcb_for()</a>, and <a class="el" href="classTemplate.html#a86e8fd27955ef10cadfd86f3fca70677">_replcb_inc()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a07737733f6949bdedea1e3d301b2ab7b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Template::replace_macros </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$r</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Implements <a class="el" href="interfaceITemplateEngine.html#aaa7381c8becc3d1c1790b53988a0f243">ITemplateEngine</a>.</p>
+
+<p>Referenced by <a class="el" href="classTemplate.html#a285b5b2007dbbf733476273df3fed4ef">replace()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="abbc484016ddf5d818f55b823cae6feb0"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Template::var_replace </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+<p>regexp: $ literal $ ([)? optional open square bracket ([a-zA-Z0-9-_]+.?)+ var name, followed by optional dot, repeated at least 1 time (?(1)]) if there was opened square bracket (subgrup 1), match close bracket</p>
+
+<p>Referenced by <a class="el" href="classTemplate.html#a07737733f6949bdedea1e3d301b2ab7b">replace_macros()</a>.</p>
+
+</div>
+</div>
+<h2 class="groupheader">Member Data Documentation</h2>
+<a class="anchor" id="a8469ab2988b6be2681516dc4b4e07d38"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Template::$d = false</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="afc4afb6f89bebcd5480022312a56cb4a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Template::$debug =false</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="abda4c8d049f70553338eae7c905e9d5c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Template::$done = false</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ace26b8a4252fbc1c385d2b5e1e93e5c8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Template::$lang = null</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a6eb301a51cc94d8b94f4548fbad85eae"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Template::$name =&quot;internal&quot;</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classTemplate.html#aae9c4d761ea1298e745e8052d7910194">_get_var()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a8f4d17e49f42b876a97364c13fb572d1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Template::$nodes = array()</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aac9a4638f11271e1b1dcc9f247242718"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Template::$r</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classTemplate.html#aae9c4d761ea1298e745e8052d7910194">_get_var()</a>, <a class="el" href="classTemplate.html#abf71098c80fd1f218a59452b3408309e">_replcb_for()</a>, <a class="el" href="classTemplate.html#a86e8fd27955ef10cadfd86f3fca70677">_replcb_inc()</a>, <a class="el" href="classTemplate.html#a285b5b2007dbbf733476273df3fed4ef">replace()</a>, and <a class="el" href="classTemplate.html#a07737733f6949bdedea1e3d301b2ab7b">replace_macros()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a4e86b566c3f728e95ce5db1b33665c10"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Template::$replace</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a317d535946dc065c35dd5cd38380e6c6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Template::$search</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a6f0efc256688c36110180b501067ff11"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Template::$stack = array()</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>include/<a class="el" href="template__processor_8php.html">template_processor.php</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classTemplate.js b/doc/html/classTemplate.js
new file mode 100644
index 000000000..9b5a06744
--- /dev/null
+++ b/doc/html/classTemplate.js
@@ -0,0 +1,27 @@
+var classTemplate =
+[
+ [ "_build_nodes", "classTemplate.html#ac41c96e1f407b1a910029e5f4b7de8e4", null ],
+ [ "_get_var", "classTemplate.html#aae9c4d761ea1298e745e8052d7910194", null ],
+ [ "_pop_stack", "classTemplate.html#a35d599c9b53a02e2fe2232e5b7ed5da7", null ],
+ [ "_preg_error", "classTemplate.html#a37c15f6d1ade500943629f27a62808b7", null ],
+ [ "_push_stack", "classTemplate.html#aa6a087e0b7b887dd1c98c9e0ecbd3b29", null ],
+ [ "_replcb", "classTemplate.html#ae791766c3d055f7f1ba5a5e60d647934", null ],
+ [ "_replcb_debug", "classTemplate.html#a4b933954086d9e01a1804b0b1c6ee93e", null ],
+ [ "_replcb_for", "classTemplate.html#abf71098c80fd1f218a59452b3408309e", null ],
+ [ "_replcb_if", "classTemplate.html#ae0836e7d5bd5afceb04f50fd635f1228", null ],
+ [ "_replcb_inc", "classTemplate.html#a86e8fd27955ef10cadfd86f3fca70677", null ],
+ [ "_replcb_node", "classTemplate.html#aa6f9bd7a8f7512efcf90e8d376fe05ee", null ],
+ [ "get_markup_template", "classTemplate.html#afd97b4b1e7754a550e67c0ea79159059", null ],
+ [ "replace", "classTemplate.html#a285b5b2007dbbf733476273df3fed4ef", null ],
+ [ "replace_macros", "classTemplate.html#a07737733f6949bdedea1e3d301b2ab7b", null ],
+ [ "var_replace", "classTemplate.html#abbc484016ddf5d818f55b823cae6feb0", null ],
+ [ "$d", "classTemplate.html#a8469ab2988b6be2681516dc4b4e07d38", null ],
+ [ "$debug", "classTemplate.html#afc4afb6f89bebcd5480022312a56cb4a", null ],
+ [ "$done", "classTemplate.html#abda4c8d049f70553338eae7c905e9d5c", null ],
+ [ "$lang", "classTemplate.html#ace26b8a4252fbc1c385d2b5e1e93e5c8", null ],
+ [ "$nodes", "classTemplate.html#a8f4d17e49f42b876a97364c13fb572d1", null ],
+ [ "$r", "classTemplate.html#aac9a4638f11271e1b1dcc9f247242718", null ],
+ [ "$replace", "classTemplate.html#a4e86b566c3f728e95ce5db1b33665c10", null ],
+ [ "$search", "classTemplate.html#a317d535946dc065c35dd5cd38380e6c6", null ],
+ [ "$stack", "classTemplate.html#a6f0efc256688c36110180b501067ff11", null ]
+]; \ No newline at end of file
diff --git a/doc/html/classTemplate.png b/doc/html/classTemplate.png
new file mode 100644
index 000000000..3c073c726
--- /dev/null
+++ b/doc/html/classTemplate.png
Binary files differ
diff --git a/doc/html/classZotDriver-members.html b/doc/html/classZotDriver-members.html
new file mode 100644
index 000000000..eb4c0a6b2
--- /dev/null
+++ b/doc/html/classZotDriver-members.html
@@ -0,0 +1,124 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classZotDriver.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">ZotDriver Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classZotDriver.html">ZotDriver</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="classZotDriver.html#a3cfdf443da4e5326e205855d7c0054f2">acknowledge_permissions</a>($permissions, $channel, $recipient)</td><td class="entry"><a class="el" href="classZotDriver.html">ZotDriver</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classZotDriver.html#a6776935156accb0f170e2e24577133db">change_permissions</a>($permissions, $channel, $recipient)</td><td class="entry"><a class="el" href="classZotDriver.html">ZotDriver</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classZotDriver.html#af65febb26031eb7f39871b9e2a539797">collect</a>($channel, $connection)</td><td class="entry"><a class="el" href="classZotDriver.html">ZotDriver</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classZotDriver.html#a2e15ff09772f0608203dad1c98299394">collect_private</a>($channel, $connection)</td><td class="entry"><a class="el" href="classZotDriver.html">ZotDriver</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classZotDriver.html#a876e3e0e4cad83c0b58c8696b344be6f">deliver</a>($item, $channel, $recipients)</td><td class="entry"><a class="el" href="classZotDriver.html">ZotDriver</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classZotDriver.html#afaaf9941169fc966e43e25b25e6daea6">deliver_private</a>($item, $channel, $recipients)</td><td class="entry"><a class="el" href="classZotDriver.html">ZotDriver</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classZotDriver.html#a40d328ff9f6b0a238afe286dddee1514">discover</a>($channel, $location)</td><td class="entry"><a class="el" href="classZotDriver.html">ZotDriver</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+</table></div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classZotDriver.html b/doc/html/classZotDriver.html
new file mode 100644
index 000000000..4e12e318e
--- /dev/null
+++ b/doc/html/classZotDriver.html
@@ -0,0 +1,425 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: ZotDriver Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classZotDriver.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#pro-methods">Protected Member Functions</a> &#124;
+<a href="classZotDriver-members.html">List of all members</a> </div>
+ <div class="headertitle">
+<div class="title">ZotDriver Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="dynheader">
+Inheritance diagram for ZotDriver:</div>
+<div class="dyncontent">
+ <div class="center">
+ <img src="classZotDriver.png" usemap="#ZotDriver_map" alt=""/>
+ <map id="ZotDriver_map" name="ZotDriver_map">
+<area href="classProtoDriver.html" alt="ProtoDriver" shape="rect" coords="0,0,78,24"/>
+</map>
+ </div></div>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pro-methods"></a>
+Protected Member Functions</h2></td></tr>
+<tr class="memitem:a40d328ff9f6b0a238afe286dddee1514"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classZotDriver.html#a40d328ff9f6b0a238afe286dddee1514">discover</a> ($channel, $location)</td></tr>
+<tr class="separator:a40d328ff9f6b0a238afe286dddee1514"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a876e3e0e4cad83c0b58c8696b344be6f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classZotDriver.html#a876e3e0e4cad83c0b58c8696b344be6f">deliver</a> ($item, $channel, $recipients)</td></tr>
+<tr class="separator:a876e3e0e4cad83c0b58c8696b344be6f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af65febb26031eb7f39871b9e2a539797"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classZotDriver.html#af65febb26031eb7f39871b9e2a539797">collect</a> ($channel, $connection)</td></tr>
+<tr class="separator:af65febb26031eb7f39871b9e2a539797"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6776935156accb0f170e2e24577133db"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classZotDriver.html#a6776935156accb0f170e2e24577133db">change_permissions</a> ($permissions, $channel, $recipient)</td></tr>
+<tr class="separator:a6776935156accb0f170e2e24577133db"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3cfdf443da4e5326e205855d7c0054f2"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classZotDriver.html#a3cfdf443da4e5326e205855d7c0054f2">acknowledge_permissions</a> ($permissions, $channel, $recipient)</td></tr>
+<tr class="separator:a3cfdf443da4e5326e205855d7c0054f2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afaaf9941169fc966e43e25b25e6daea6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classZotDriver.html#afaaf9941169fc966e43e25b25e6daea6">deliver_private</a> ($item, $channel, $recipients)</td></tr>
+<tr class="separator:afaaf9941169fc966e43e25b25e6daea6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2e15ff09772f0608203dad1c98299394"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classZotDriver.html#a2e15ff09772f0608203dad1c98299394">collect_private</a> ($channel, $connection)</td></tr>
+<tr class="separator:a2e15ff09772f0608203dad1c98299394"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="inherit_header pro_methods_classProtoDriver"><td colspan="2" onclick="javascript:toggleInherit('pro_methods_classProtoDriver')"><img src="closed.png" alt="-"/>&#160;Protected Member Functions inherited from <a class="el" href="classProtoDriver.html">ProtoDriver</a></td></tr>
+<tr class="memitem:a64a3868cffe27d601d55f69a2ecc4337 inherit pro_methods_classProtoDriver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classProtoDriver.html#a64a3868cffe27d601d55f69a2ecc4337">discover</a> ($channel, $location)</td></tr>
+<tr class="separator:a64a3868cffe27d601d55f69a2ecc4337 inherit pro_methods_classProtoDriver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a85e9063f6d0c304410cd246f7900ea1b inherit pro_methods_classProtoDriver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classProtoDriver.html#a85e9063f6d0c304410cd246f7900ea1b">deliver</a> ($item, $channel, $recipients)</td></tr>
+<tr class="separator:a85e9063f6d0c304410cd246f7900ea1b inherit pro_methods_classProtoDriver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2ba1758f0f9e3564580b6ff85292804d inherit pro_methods_classProtoDriver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classProtoDriver.html#a2ba1758f0f9e3564580b6ff85292804d">collect</a> ($channel, $connection)</td></tr>
+<tr class="separator:a2ba1758f0f9e3564580b6ff85292804d inherit pro_methods_classProtoDriver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a34b97ca5ef2165f2e16eb2fe59ff6c67 inherit pro_methods_classProtoDriver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classProtoDriver.html#a34b97ca5ef2165f2e16eb2fe59ff6c67">change_permissions</a> ($permissions, $channel, $recipient)</td></tr>
+<tr class="separator:a34b97ca5ef2165f2e16eb2fe59ff6c67 inherit pro_methods_classProtoDriver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1593f3abae050edbd9304f4f8bc4894a inherit pro_methods_classProtoDriver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classProtoDriver.html#a1593f3abae050edbd9304f4f8bc4894a">acknowledge_permissions</a> ($permissions, $channel, $recipient)</td></tr>
+<tr class="separator:a1593f3abae050edbd9304f4f8bc4894a inherit pro_methods_classProtoDriver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae5b44739f84c10d00a9b65adf3785181 inherit pro_methods_classProtoDriver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classProtoDriver.html#ae5b44739f84c10d00a9b65adf3785181">deliver_private</a> ($item, $channel, $recipients)</td></tr>
+<tr class="separator:ae5b44739f84c10d00a9b65adf3785181 inherit pro_methods_classProtoDriver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af66171aa7dab9b62cee915cb4f1abe1b inherit pro_methods_classProtoDriver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classProtoDriver.html#af66171aa7dab9b62cee915cb4f1abe1b">collect_private</a> ($channel, $connection)</td></tr>
+<tr class="separator:af66171aa7dab9b62cee915cb4f1abe1b inherit pro_methods_classProtoDriver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Member Function Documentation</h2>
+<a class="anchor" id="a3cfdf443da4e5326e205855d7c0054f2"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">ZotDriver::acknowledge_permissions </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$permissions</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$recipient</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a6776935156accb0f170e2e24577133db"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">ZotDriver::change_permissions </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$permissions</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$recipient</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="af65febb26031eb7f39871b9e2a539797"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">ZotDriver::collect </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$connection</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a2e15ff09772f0608203dad1c98299394"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">ZotDriver::collect_private </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$connection</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a876e3e0e4cad83c0b58c8696b344be6f"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">ZotDriver::deliver </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$recipients</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="afaaf9941169fc966e43e25b25e6daea6"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">ZotDriver::deliver_private </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$recipients</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a40d328ff9f6b0a238afe286dddee1514"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">ZotDriver::discover </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$location</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>include/<a class="el" href="ProtoDriver_8php.html">ProtoDriver.php</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classZotDriver.js b/doc/html/classZotDriver.js
new file mode 100644
index 000000000..b5cdf4719
--- /dev/null
+++ b/doc/html/classZotDriver.js
@@ -0,0 +1,10 @@
+var classZotDriver =
+[
+ [ "acknowledge_permissions", "classZotDriver.html#a3cfdf443da4e5326e205855d7c0054f2", null ],
+ [ "change_permissions", "classZotDriver.html#a6776935156accb0f170e2e24577133db", null ],
+ [ "collect", "classZotDriver.html#af65febb26031eb7f39871b9e2a539797", null ],
+ [ "collect_private", "classZotDriver.html#a2e15ff09772f0608203dad1c98299394", null ],
+ [ "deliver", "classZotDriver.html#a876e3e0e4cad83c0b58c8696b344be6f", null ],
+ [ "deliver_private", "classZotDriver.html#afaaf9941169fc966e43e25b25e6daea6", null ],
+ [ "discover", "classZotDriver.html#a40d328ff9f6b0a238afe286dddee1514", null ]
+]; \ No newline at end of file
diff --git a/doc/html/classZotDriver.png b/doc/html/classZotDriver.png
new file mode 100644
index 000000000..38e96d6af
--- /dev/null
+++ b/doc/html/classZotDriver.png
Binary files differ
diff --git a/doc/html/classdba-members.html b/doc/html/classdba-members.html
new file mode 100644
index 000000000..a01572437
--- /dev/null
+++ b/doc/html/classdba-members.html
@@ -0,0 +1,128 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Project: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="r!-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Project
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classdba.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">dba Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classdba.html">dba</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="classdba.html#a986eb5c3bbd4c70801a9ddd2f8e5c561">$connected</a></td><td class="entry"><a class="el" href="classdba.html">dba</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classdba.html#ab57b3a4399f22ce5cdafbd3cd542a414">$db</a></td><td class="entry"><a class="el" href="classdba.html">dba</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classdba.html#a4da56b3eb82ad26ba49ca5f97e1490cb">$debug</a></td><td class="entry"><a class="el" href="classdba.html">dba</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classdba.html#a6a1471c18c6530044d20db5d3532958b">$error</a></td><td class="entry"><a class="el" href="classdba.html">dba</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classdba.html#ab5dcbd758d3f8fb84702c323cd85067e">$mysqli</a></td><td class="entry"><a class="el" href="classdba.html">dba</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classdba.html#aa36df91d776eedd1b90b9518a610d9fb">__construct</a>($server, $user, $pass, $db, $install=false)</td><td class="entry"><a class="el" href="classdba.html">dba</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classdba.html#ac25853e4d454aec9cfead4814429550d">__destruct</a>()</td><td class="entry"><a class="el" href="classdba.html">dba</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classdba.html#a2c6fecf396c66e07f00276fc18d31ca7">dbg</a>($dbg)</td><td class="entry"><a class="el" href="classdba.html">dba</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classdba.html#a522329687ff042074c1cbc8bd3226d2f">escape</a>($str)</td><td class="entry"><a class="el" href="classdba.html">dba</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classdba.html#a066ce6eab1282c9220ac4652ac2dbd27">getdb</a>()</td><td class="entry"><a class="el" href="classdba.html">dba</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classdba.html#a0060c8611e3c3ee71049904ad028a695">q</a>($sql)</td><td class="entry"><a class="el" href="classdba.html">dba</a></td><td class="entry"></td></tr>
+</table></div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classdba.html b/doc/html/classdba.html
new file mode 100644
index 000000000..dcb6e4b3c
--- /dev/null
+++ b/doc/html/classdba.html
@@ -0,0 +1,363 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Project: dba Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="r!-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Project
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classdba.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="#pub-attribs">Public Attributes</a> &#124;
+<a href="#pri-attribs">Private Attributes</a> &#124;
+<a href="classdba-members.html">List of all members</a> </div>
+ <div class="headertitle">
+<div class="title">dba Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:aa36df91d776eedd1b90b9518a610d9fb"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba.html#aa36df91d776eedd1b90b9518a610d9fb">__construct</a> ($server, $user, $pass, $db, $install=false)</td></tr>
+<tr class="separator:aa36df91d776eedd1b90b9518a610d9fb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a066ce6eab1282c9220ac4652ac2dbd27"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba.html#a066ce6eab1282c9220ac4652ac2dbd27">getdb</a> ()</td></tr>
+<tr class="separator:a066ce6eab1282c9220ac4652ac2dbd27"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0060c8611e3c3ee71049904ad028a695"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba.html#a0060c8611e3c3ee71049904ad028a695">q</a> ($sql)</td></tr>
+<tr class="separator:a0060c8611e3c3ee71049904ad028a695"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2c6fecf396c66e07f00276fc18d31ca7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba.html#a2c6fecf396c66e07f00276fc18d31ca7">dbg</a> ($dbg)</td></tr>
+<tr class="separator:a2c6fecf396c66e07f00276fc18d31ca7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a522329687ff042074c1cbc8bd3226d2f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba.html#a522329687ff042074c1cbc8bd3226d2f">escape</a> ($str)</td></tr>
+<tr class="separator:a522329687ff042074c1cbc8bd3226d2f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac25853e4d454aec9cfead4814429550d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba.html#ac25853e4d454aec9cfead4814429550d">__destruct</a> ()</td></tr>
+<tr class="separator:ac25853e4d454aec9cfead4814429550d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Public Attributes</h2></td></tr>
+<tr class="memitem:ab5dcbd758d3f8fb84702c323cd85067e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba.html#ab5dcbd758d3f8fb84702c323cd85067e">$mysqli</a> = true</td></tr>
+<tr class="separator:ab5dcbd758d3f8fb84702c323cd85067e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a986eb5c3bbd4c70801a9ddd2f8e5c561"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba.html#a986eb5c3bbd4c70801a9ddd2f8e5c561">$connected</a> = false</td></tr>
+<tr class="separator:a986eb5c3bbd4c70801a9ddd2f8e5c561"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6a1471c18c6530044d20db5d3532958b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba.html#a6a1471c18c6530044d20db5d3532958b">$error</a> = false</td></tr>
+<tr class="separator:a6a1471c18c6530044d20db5d3532958b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pri-attribs"></a>
+Private Attributes</h2></td></tr>
+<tr class="memitem:a4da56b3eb82ad26ba49ca5f97e1490cb"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba.html#a4da56b3eb82ad26ba49ca5f97e1490cb">$debug</a> = 0</td></tr>
+<tr class="separator:a4da56b3eb82ad26ba49ca5f97e1490cb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab57b3a4399f22ce5cdafbd3cd542a414"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba.html#ab57b3a4399f22ce5cdafbd3cd542a414">$db</a></td></tr>
+<tr class="separator:ab57b3a4399f22ce5cdafbd3cd542a414"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>MySQL database class</p>
+<p>For debugging, insert 'dbg(1);' anywhere in the program flow. dbg(0); will turn it off. Logging is performed at LOGGER_DATA level. When logging, all binary info is converted to text and html entities are escaped so that the debugging stream is safe to view within both terminals and web pages. </p>
+</div><h2 class="groupheader">Constructor &amp; Destructor Documentation</h2>
+<a class="anchor" id="aa36df91d776eedd1b90b9518a610d9fb"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">dba::__construct </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$server</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$user</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$pass</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$db</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$install</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ac25853e4d454aec9cfead4814429550d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">dba::__destruct </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Member Function Documentation</h2>
+<a class="anchor" id="a2c6fecf396c66e07f00276fc18d31ca7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">dba::dbg </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$dbg</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a522329687ff042074c1cbc8bd3226d2f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">dba::escape </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$str</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a066ce6eab1282c9220ac4652ac2dbd27"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">dba::getdb </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a0060c8611e3c3ee71049904ad028a695"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">dba::q </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$sql</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>If dbfail.out exists, we will write any failed calls directly to it, regardless of any logging that may or may nor be in effect. These usually indicate SQL syntax errors that need to be resolved.</p>
+
+</div>
+</div>
+<h2 class="groupheader">Member Data Documentation</h2>
+<a class="anchor" id="a986eb5c3bbd4c70801a9ddd2f8e5c561"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">dba::$connected = false</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ab57b3a4399f22ce5cdafbd3cd542a414"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">dba::$db</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classdba.html#aa36df91d776eedd1b90b9518a610d9fb">__construct()</a>, and <a class="el" href="classdba.html#a066ce6eab1282c9220ac4652ac2dbd27">getdb()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a4da56b3eb82ad26ba49ca5f97e1490cb"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">dba::$debug = 0</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a6a1471c18c6530044d20db5d3532958b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">dba::$error = false</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classdba.html#a0060c8611e3c3ee71049904ad028a695">q()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ab5dcbd758d3f8fb84702c323cd85067e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">dba::$mysqli = true</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>include/<a class="el" href="dba_8php.html">dba.php</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classdba.js b/doc/html/classdba.js
new file mode 100644
index 000000000..2b97b91eb
--- /dev/null
+++ b/doc/html/classdba.js
@@ -0,0 +1,14 @@
+var classdba =
+[
+ [ "__construct", "classdba.html#aa36df91d776eedd1b90b9518a610d9fb", null ],
+ [ "__destruct", "classdba.html#ac25853e4d454aec9cfead4814429550d", null ],
+ [ "dbg", "classdba.html#a2c6fecf396c66e07f00276fc18d31ca7", null ],
+ [ "escape", "classdba.html#a522329687ff042074c1cbc8bd3226d2f", null ],
+ [ "getdb", "classdba.html#a066ce6eab1282c9220ac4652ac2dbd27", null ],
+ [ "q", "classdba.html#a0060c8611e3c3ee71049904ad028a695", null ],
+ [ "$connected", "classdba.html#a986eb5c3bbd4c70801a9ddd2f8e5c561", null ],
+ [ "$db", "classdba.html#ab57b3a4399f22ce5cdafbd3cd542a414", null ],
+ [ "$debug", "classdba.html#a4da56b3eb82ad26ba49ca5f97e1490cb", null ],
+ [ "$error", "classdba.html#a6a1471c18c6530044d20db5d3532958b", null ],
+ [ "$mysqli", "classdba.html#ab5dcbd758d3f8fb84702c323cd85067e", null ]
+]; \ No newline at end of file
diff --git a/doc/html/classdba__driver-members.html b/doc/html/classdba__driver-members.html
new file mode 100644
index 000000000..cf4075c93
--- /dev/null
+++ b/doc/html/classdba__driver-members.html
@@ -0,0 +1,129 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classdba__driver.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">dba_driver Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classdba__driver.html">dba_driver</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="classdba__driver.html#a205f6535e399700b6fca2492f96f2229">$connected</a></td><td class="entry"><a class="el" href="classdba__driver.html">dba_driver</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classdba__driver.html#a3033b5f1c2716b52202faeaae2592fe6">$db</a></td><td class="entry"><a class="el" href="classdba__driver.html">dba_driver</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classdba__driver.html#af48e2afeded5285766bf92e22123ed03">$debug</a></td><td class="entry"><a class="el" href="classdba__driver.html">dba_driver</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classdba__driver.html#a84675d28c7bd9b7290dd37e66dbd216c">$error</a></td><td class="entry"><a class="el" href="classdba__driver.html">dba_driver</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classdba__driver.html#af3541d13ccb7a3eddfc03e253c746186">__construct</a>($server, $port, $user, $pass, $db, $install=false)</td><td class="entry"><a class="el" href="classdba__driver.html">dba_driver</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classdba__driver.html#a1a8bc9dc839a6320a0e07d8047a6b721">__destruct</a>()</td><td class="entry"><a class="el" href="classdba__driver.html">dba_driver</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classdba__driver.html#a5afa54172f3c837df61643f8f5b2c975">close</a>()</td><td class="entry"><a class="el" href="classdba__driver.html">dba_driver</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classdba__driver.html#ae533e62a240a793f17aef5ab4ef10edc">connect</a>($server, $port, $user, $pass, $db)</td><td class="entry"><a class="el" href="classdba__driver.html">dba_driver</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classdba__driver.html#adcc1f8955120fec0708bce39202d0422">dbg</a>($dbg)</td><td class="entry"><a class="el" href="classdba__driver.html">dba_driver</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classdba__driver.html#afc95ffa103a3290581b537670cde5311">escape</a>($str)</td><td class="entry"><a class="el" href="classdba__driver.html">dba_driver</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classdba__driver.html#a4ccb27243e62a8ca30dd8e1b8cc67746">install</a>($server, $user, $pass, $db)</td><td class="entry"><a class="el" href="classdba__driver.html">dba_driver</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classdba__driver.html#a558e738b88ae893cc5d79ffa3793d555">q</a>($sql)</td><td class="entry"><a class="el" href="classdba__driver.html">dba_driver</a></td><td class="entry"></td></tr>
+</table></div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classdba__driver.html b/doc/html/classdba__driver.html
new file mode 100644
index 000000000..e70d8bf1f
--- /dev/null
+++ b/doc/html/classdba__driver.html
@@ -0,0 +1,483 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: dba_driver Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classdba__driver.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="#pub-attribs">Public Attributes</a> &#124;
+<a href="#pro-attribs">Protected Attributes</a> &#124;
+<a href="classdba__driver-members.html">List of all members</a> </div>
+ <div class="headertitle">
+<div class="title">dba_driver Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="dynheader">
+Inheritance diagram for dba_driver:</div>
+<div class="dyncontent">
+ <div class="center">
+ <img src="classdba__driver.png" usemap="#dba_driver_map" alt=""/>
+ <map id="dba_driver_map" name="dba_driver_map">
+<area href="classdba__mysql.html" alt="dba_mysql" shape="rect" coords="0,56,74,80"/>
+<area href="classdba__mysqli.html" alt="dba_mysqli" shape="rect" coords="84,56,158,80"/>
+</map>
+ </div></div>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:ae533e62a240a793f17aef5ab4ef10edc"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__driver.html#ae533e62a240a793f17aef5ab4ef10edc">connect</a> ($server, $port, $user, $pass, $db)</td></tr>
+<tr class="separator:ae533e62a240a793f17aef5ab4ef10edc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a558e738b88ae893cc5d79ffa3793d555"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__driver.html#a558e738b88ae893cc5d79ffa3793d555">q</a> ($sql)</td></tr>
+<tr class="separator:a558e738b88ae893cc5d79ffa3793d555"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afc95ffa103a3290581b537670cde5311"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__driver.html#afc95ffa103a3290581b537670cde5311">escape</a> ($str)</td></tr>
+<tr class="separator:afc95ffa103a3290581b537670cde5311"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5afa54172f3c837df61643f8f5b2c975"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__driver.html#a5afa54172f3c837df61643f8f5b2c975">close</a> ()</td></tr>
+<tr class="separator:a5afa54172f3c837df61643f8f5b2c975"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af3541d13ccb7a3eddfc03e253c746186"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__driver.html#af3541d13ccb7a3eddfc03e253c746186">__construct</a> ($server, $port, $user, $pass, $db, $<a class="el" href="classdba__driver.html#a4ccb27243e62a8ca30dd8e1b8cc67746">install</a>=false)</td></tr>
+<tr class="separator:af3541d13ccb7a3eddfc03e253c746186"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4ccb27243e62a8ca30dd8e1b8cc67746"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__driver.html#a4ccb27243e62a8ca30dd8e1b8cc67746">install</a> ($server, $user, $pass, $db)</td></tr>
+<tr class="separator:a4ccb27243e62a8ca30dd8e1b8cc67746"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:adcc1f8955120fec0708bce39202d0422"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__driver.html#adcc1f8955120fec0708bce39202d0422">dbg</a> ($dbg)</td></tr>
+<tr class="separator:adcc1f8955120fec0708bce39202d0422"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1a8bc9dc839a6320a0e07d8047a6b721"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__driver.html#a1a8bc9dc839a6320a0e07d8047a6b721">__destruct</a> ()</td></tr>
+<tr class="separator:a1a8bc9dc839a6320a0e07d8047a6b721"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Public Attributes</h2></td></tr>
+<tr class="memitem:a205f6535e399700b6fca2492f96f2229"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__driver.html#a205f6535e399700b6fca2492f96f2229">$connected</a> = false</td></tr>
+<tr class="separator:a205f6535e399700b6fca2492f96f2229"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a84675d28c7bd9b7290dd37e66dbd216c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__driver.html#a84675d28c7bd9b7290dd37e66dbd216c">$error</a> = false</td></tr>
+<tr class="separator:a84675d28c7bd9b7290dd37e66dbd216c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pro-attribs"></a>
+Protected Attributes</h2></td></tr>
+<tr class="memitem:af48e2afeded5285766bf92e22123ed03"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__driver.html#af48e2afeded5285766bf92e22123ed03">$debug</a> = 0</td></tr>
+<tr class="separator:af48e2afeded5285766bf92e22123ed03"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3033b5f1c2716b52202faeaae2592fe6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__driver.html#a3033b5f1c2716b52202faeaae2592fe6">$db</a></td></tr>
+<tr class="separator:a3033b5f1c2716b52202faeaae2592fe6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Constructor &amp; Destructor Documentation</h2>
+<a class="anchor" id="af3541d13ccb7a3eddfc03e253c746186"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">dba_driver::__construct </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$server</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$port</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$user</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$pass</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$db</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$install</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a1a8bc9dc839a6320a0e07d8047a6b721"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">dba_driver::__destruct </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Member Function Documentation</h2>
+<a class="anchor" id="a5afa54172f3c837df61643f8f5b2c975"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">dba_driver::close </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">abstract</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classdba__driver.html#a1a8bc9dc839a6320a0e07d8047a6b721">__destruct()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ae533e62a240a793f17aef5ab4ef10edc"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">dba_driver::connect </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$server</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$port</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$user</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$pass</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$db</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">abstract</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classdba__driver.html#af3541d13ccb7a3eddfc03e253c746186">__construct()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="adcc1f8955120fec0708bce39202d0422"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">dba_driver::dbg </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$dbg</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="afc95ffa103a3290581b537670cde5311"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">dba_driver::escape </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$str</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">abstract</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a4ccb27243e62a8ca30dd8e1b8cc67746"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">dba_driver::install </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$server</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$user</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$pass</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$db</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classdba__driver.html#af3541d13ccb7a3eddfc03e253c746186">__construct()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a558e738b88ae893cc5d79ffa3793d555"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">dba_driver::q </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$sql</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">abstract</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Member Data Documentation</h2>
+<a class="anchor" id="a205f6535e399700b6fca2492f96f2229"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">dba_driver::$connected = false</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a3033b5f1c2716b52202faeaae2592fe6"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">dba_driver::$db</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classdba__driver.html#af3541d13ccb7a3eddfc03e253c746186">__construct()</a>, <a class="el" href="classdba__mysqli.html#add062bd93961e5f0194d94820e9a51b1">dba_mysqli\connect()</a>, and <a class="el" href="classdba__mysql.html#a1887338627ce0e28786839363014bd0b">dba_mysql\connect()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="af48e2afeded5285766bf92e22123ed03"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">dba_driver::$debug = 0</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a84675d28c7bd9b7290dd37e66dbd216c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">dba_driver::$error = false</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>include/dba/<a class="el" href="dba__driver_8php.html">dba_driver.php</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classdba__driver.js b/doc/html/classdba__driver.js
new file mode 100644
index 000000000..14c656ca8
--- /dev/null
+++ b/doc/html/classdba__driver.js
@@ -0,0 +1,15 @@
+var classdba__driver =
+[
+ [ "__construct", "classdba__driver.html#af3541d13ccb7a3eddfc03e253c746186", null ],
+ [ "__destruct", "classdba__driver.html#a1a8bc9dc839a6320a0e07d8047a6b721", null ],
+ [ "close", "classdba__driver.html#a5afa54172f3c837df61643f8f5b2c975", null ],
+ [ "connect", "classdba__driver.html#ae533e62a240a793f17aef5ab4ef10edc", null ],
+ [ "dbg", "classdba__driver.html#adcc1f8955120fec0708bce39202d0422", null ],
+ [ "escape", "classdba__driver.html#afc95ffa103a3290581b537670cde5311", null ],
+ [ "install", "classdba__driver.html#a4ccb27243e62a8ca30dd8e1b8cc67746", null ],
+ [ "q", "classdba__driver.html#a558e738b88ae893cc5d79ffa3793d555", null ],
+ [ "$connected", "classdba__driver.html#a205f6535e399700b6fca2492f96f2229", null ],
+ [ "$db", "classdba__driver.html#a3033b5f1c2716b52202faeaae2592fe6", null ],
+ [ "$debug", "classdba__driver.html#af48e2afeded5285766bf92e22123ed03", null ],
+ [ "$error", "classdba__driver.html#a84675d28c7bd9b7290dd37e66dbd216c", null ]
+]; \ No newline at end of file
diff --git a/doc/html/classdba__driver.png b/doc/html/classdba__driver.png
new file mode 100644
index 000000000..7c5b7cf41
--- /dev/null
+++ b/doc/html/classdba__driver.png
Binary files differ
diff --git a/doc/html/classdba__mysql-members.html b/doc/html/classdba__mysql-members.html
new file mode 100644
index 000000000..15a22064f
--- /dev/null
+++ b/doc/html/classdba__mysql-members.html
@@ -0,0 +1,129 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classdba__mysql.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">dba_mysql Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classdba__mysql.html">dba_mysql</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="classdba__driver.html#a205f6535e399700b6fca2492f96f2229">$connected</a></td><td class="entry"><a class="el" href="classdba__driver.html">dba_driver</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classdba__driver.html#a3033b5f1c2716b52202faeaae2592fe6">$db</a></td><td class="entry"><a class="el" href="classdba__driver.html">dba_driver</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classdba__driver.html#af48e2afeded5285766bf92e22123ed03">$debug</a></td><td class="entry"><a class="el" href="classdba__driver.html">dba_driver</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classdba__driver.html#a84675d28c7bd9b7290dd37e66dbd216c">$error</a></td><td class="entry"><a class="el" href="classdba__driver.html">dba_driver</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classdba__driver.html#af3541d13ccb7a3eddfc03e253c746186">__construct</a>($server, $port, $user, $pass, $db, $install=false)</td><td class="entry"><a class="el" href="classdba__driver.html">dba_driver</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classdba__driver.html#a1a8bc9dc839a6320a0e07d8047a6b721">__destruct</a>()</td><td class="entry"><a class="el" href="classdba__driver.html">dba_driver</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classdba__mysql.html#a850586714ef897bd25f643c89b4ef76e">close</a>()</td><td class="entry"><a class="el" href="classdba__mysql.html">dba_mysql</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classdba__mysql.html#a1887338627ce0e28786839363014bd0b">connect</a>($server, $port, $user, $pass, $db)</td><td class="entry"><a class="el" href="classdba__mysql.html">dba_mysql</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classdba__driver.html#adcc1f8955120fec0708bce39202d0422">dbg</a>($dbg)</td><td class="entry"><a class="el" href="classdba__driver.html">dba_driver</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classdba__mysql.html#a99a7691ea6cb1300031fb6549379066e">escape</a>($str)</td><td class="entry"><a class="el" href="classdba__mysql.html">dba_mysql</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classdba__driver.html#a4ccb27243e62a8ca30dd8e1b8cc67746">install</a>($server, $user, $pass, $db)</td><td class="entry"><a class="el" href="classdba__driver.html">dba_driver</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classdba__mysql.html#ac3fd60c278f400907322dac578754a99">q</a>($sql)</td><td class="entry"><a class="el" href="classdba__mysql.html">dba_mysql</a></td><td class="entry"></td></tr>
+</table></div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classdba__mysql.html b/doc/html/classdba__mysql.html
new file mode 100644
index 000000000..df61678d5
--- /dev/null
+++ b/doc/html/classdba__mysql.html
@@ -0,0 +1,263 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: dba_mysql Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classdba__mysql.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="classdba__mysql-members.html">List of all members</a> </div>
+ <div class="headertitle">
+<div class="title">dba_mysql Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="dynheader">
+Inheritance diagram for dba_mysql:</div>
+<div class="dyncontent">
+ <div class="center">
+ <img src="classdba__mysql.png" usemap="#dba_mysql_map" alt=""/>
+ <map id="dba_mysql_map" name="dba_mysql_map">
+<area href="classdba__driver.html" alt="dba_driver" shape="rect" coords="0,0,74,24"/>
+</map>
+ </div></div>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:a1887338627ce0e28786839363014bd0b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__mysql.html#a1887338627ce0e28786839363014bd0b">connect</a> ($server, $port, $user, $pass, $db)</td></tr>
+<tr class="separator:a1887338627ce0e28786839363014bd0b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac3fd60c278f400907322dac578754a99"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__mysql.html#ac3fd60c278f400907322dac578754a99">q</a> ($sql)</td></tr>
+<tr class="separator:ac3fd60c278f400907322dac578754a99"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a99a7691ea6cb1300031fb6549379066e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__mysql.html#a99a7691ea6cb1300031fb6549379066e">escape</a> ($str)</td></tr>
+<tr class="separator:a99a7691ea6cb1300031fb6549379066e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a850586714ef897bd25f643c89b4ef76e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__mysql.html#a850586714ef897bd25f643c89b4ef76e">close</a> ()</td></tr>
+<tr class="separator:a850586714ef897bd25f643c89b4ef76e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="inherit_header pub_methods_classdba__driver"><td colspan="2" onclick="javascript:toggleInherit('pub_methods_classdba__driver')"><img src="closed.png" alt="-"/>&#160;Public Member Functions inherited from <a class="el" href="classdba__driver.html">dba_driver</a></td></tr>
+<tr class="memitem:ae533e62a240a793f17aef5ab4ef10edc inherit pub_methods_classdba__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__driver.html#ae533e62a240a793f17aef5ab4ef10edc">connect</a> ($server, $port, $user, $pass, $db)</td></tr>
+<tr class="separator:ae533e62a240a793f17aef5ab4ef10edc inherit pub_methods_classdba__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a558e738b88ae893cc5d79ffa3793d555 inherit pub_methods_classdba__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__driver.html#a558e738b88ae893cc5d79ffa3793d555">q</a> ($sql)</td></tr>
+<tr class="separator:a558e738b88ae893cc5d79ffa3793d555 inherit pub_methods_classdba__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afc95ffa103a3290581b537670cde5311 inherit pub_methods_classdba__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__driver.html#afc95ffa103a3290581b537670cde5311">escape</a> ($str)</td></tr>
+<tr class="separator:afc95ffa103a3290581b537670cde5311 inherit pub_methods_classdba__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5afa54172f3c837df61643f8f5b2c975 inherit pub_methods_classdba__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__driver.html#a5afa54172f3c837df61643f8f5b2c975">close</a> ()</td></tr>
+<tr class="separator:a5afa54172f3c837df61643f8f5b2c975 inherit pub_methods_classdba__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af3541d13ccb7a3eddfc03e253c746186 inherit pub_methods_classdba__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__driver.html#af3541d13ccb7a3eddfc03e253c746186">__construct</a> ($server, $port, $user, $pass, $db, $<a class="el" href="classdba__driver.html#a4ccb27243e62a8ca30dd8e1b8cc67746">install</a>=false)</td></tr>
+<tr class="separator:af3541d13ccb7a3eddfc03e253c746186 inherit pub_methods_classdba__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4ccb27243e62a8ca30dd8e1b8cc67746 inherit pub_methods_classdba__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__driver.html#a4ccb27243e62a8ca30dd8e1b8cc67746">install</a> ($server, $user, $pass, $db)</td></tr>
+<tr class="separator:a4ccb27243e62a8ca30dd8e1b8cc67746 inherit pub_methods_classdba__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:adcc1f8955120fec0708bce39202d0422 inherit pub_methods_classdba__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__driver.html#adcc1f8955120fec0708bce39202d0422">dbg</a> ($dbg)</td></tr>
+<tr class="separator:adcc1f8955120fec0708bce39202d0422 inherit pub_methods_classdba__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1a8bc9dc839a6320a0e07d8047a6b721 inherit pub_methods_classdba__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__driver.html#a1a8bc9dc839a6320a0e07d8047a6b721">__destruct</a> ()</td></tr>
+<tr class="separator:a1a8bc9dc839a6320a0e07d8047a6b721 inherit pub_methods_classdba__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="inherited"></a>
+Additional Inherited Members</h2></td></tr>
+<tr class="inherit_header pub_attribs_classdba__driver"><td colspan="2" onclick="javascript:toggleInherit('pub_attribs_classdba__driver')"><img src="closed.png" alt="-"/>&#160;Public Attributes inherited from <a class="el" href="classdba__driver.html">dba_driver</a></td></tr>
+<tr class="memitem:a205f6535e399700b6fca2492f96f2229 inherit pub_attribs_classdba__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__driver.html#a205f6535e399700b6fca2492f96f2229">$connected</a> = false</td></tr>
+<tr class="separator:a205f6535e399700b6fca2492f96f2229 inherit pub_attribs_classdba__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a84675d28c7bd9b7290dd37e66dbd216c inherit pub_attribs_classdba__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__driver.html#a84675d28c7bd9b7290dd37e66dbd216c">$error</a> = false</td></tr>
+<tr class="separator:a84675d28c7bd9b7290dd37e66dbd216c inherit pub_attribs_classdba__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="inherit_header pro_attribs_classdba__driver"><td colspan="2" onclick="javascript:toggleInherit('pro_attribs_classdba__driver')"><img src="closed.png" alt="-"/>&#160;Protected Attributes inherited from <a class="el" href="classdba__driver.html">dba_driver</a></td></tr>
+<tr class="memitem:af48e2afeded5285766bf92e22123ed03 inherit pro_attribs_classdba__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__driver.html#af48e2afeded5285766bf92e22123ed03">$debug</a> = 0</td></tr>
+<tr class="separator:af48e2afeded5285766bf92e22123ed03 inherit pro_attribs_classdba__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3033b5f1c2716b52202faeaae2592fe6 inherit pro_attribs_classdba__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__driver.html#a3033b5f1c2716b52202faeaae2592fe6">$db</a></td></tr>
+<tr class="separator:a3033b5f1c2716b52202faeaae2592fe6 inherit pro_attribs_classdba__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Member Function Documentation</h2>
+<a class="anchor" id="a850586714ef897bd25f643c89b4ef76e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">dba_mysql::close </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a1887338627ce0e28786839363014bd0b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">dba_mysql::connect </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$server</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$port</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$user</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$pass</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$db</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a99a7691ea6cb1300031fb6549379066e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">dba_mysql::escape </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$str</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ac3fd60c278f400907322dac578754a99"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">dba_mysql::q </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$sql</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>include/dba/<a class="el" href="dba__mysql_8php.html">dba_mysql.php</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classdba__mysql.js b/doc/html/classdba__mysql.js
new file mode 100644
index 000000000..9e5452f55
--- /dev/null
+++ b/doc/html/classdba__mysql.js
@@ -0,0 +1,7 @@
+var classdba__mysql =
+[
+ [ "close", "classdba__mysql.html#a850586714ef897bd25f643c89b4ef76e", null ],
+ [ "connect", "classdba__mysql.html#a1887338627ce0e28786839363014bd0b", null ],
+ [ "escape", "classdba__mysql.html#a99a7691ea6cb1300031fb6549379066e", null ],
+ [ "q", "classdba__mysql.html#ac3fd60c278f400907322dac578754a99", null ]
+]; \ No newline at end of file
diff --git a/doc/html/classdba__mysql.png b/doc/html/classdba__mysql.png
new file mode 100644
index 000000000..38ea168b7
--- /dev/null
+++ b/doc/html/classdba__mysql.png
Binary files differ
diff --git a/doc/html/classdba__mysqli-members.html b/doc/html/classdba__mysqli-members.html
new file mode 100644
index 000000000..cdfcb2dc4
--- /dev/null
+++ b/doc/html/classdba__mysqli-members.html
@@ -0,0 +1,129 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classdba__mysqli.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">dba_mysqli Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classdba__mysqli.html">dba_mysqli</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="classdba__driver.html#a205f6535e399700b6fca2492f96f2229">$connected</a></td><td class="entry"><a class="el" href="classdba__driver.html">dba_driver</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classdba__driver.html#a3033b5f1c2716b52202faeaae2592fe6">$db</a></td><td class="entry"><a class="el" href="classdba__driver.html">dba_driver</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classdba__driver.html#af48e2afeded5285766bf92e22123ed03">$debug</a></td><td class="entry"><a class="el" href="classdba__driver.html">dba_driver</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classdba__driver.html#a84675d28c7bd9b7290dd37e66dbd216c">$error</a></td><td class="entry"><a class="el" href="classdba__driver.html">dba_driver</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classdba__driver.html#af3541d13ccb7a3eddfc03e253c746186">__construct</a>($server, $port, $user, $pass, $db, $install=false)</td><td class="entry"><a class="el" href="classdba__driver.html">dba_driver</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classdba__driver.html#a1a8bc9dc839a6320a0e07d8047a6b721">__destruct</a>()</td><td class="entry"><a class="el" href="classdba__driver.html">dba_driver</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classdba__mysqli.html#acb38f2c851187ad632ecfab30fdfab55">close</a>()</td><td class="entry"><a class="el" href="classdba__mysqli.html">dba_mysqli</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classdba__mysqli.html#add062bd93961e5f0194d94820e9a51b1">connect</a>($server, $port, $user, $pass, $db)</td><td class="entry"><a class="el" href="classdba__mysqli.html">dba_mysqli</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classdba__driver.html#adcc1f8955120fec0708bce39202d0422">dbg</a>($dbg)</td><td class="entry"><a class="el" href="classdba__driver.html">dba_driver</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classdba__mysqli.html#a27d6a748af7f80028801306e7ea33f64">escape</a>($str)</td><td class="entry"><a class="el" href="classdba__mysqli.html">dba_mysqli</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classdba__driver.html#a4ccb27243e62a8ca30dd8e1b8cc67746">install</a>($server, $user, $pass, $db)</td><td class="entry"><a class="el" href="classdba__driver.html">dba_driver</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classdba__mysqli.html#a611c4de8d6d7512dffb83a38bb6701ec">q</a>($sql)</td><td class="entry"><a class="el" href="classdba__mysqli.html">dba_mysqli</a></td><td class="entry"></td></tr>
+</table></div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classdba__mysqli.html b/doc/html/classdba__mysqli.html
new file mode 100644
index 000000000..985a7216b
--- /dev/null
+++ b/doc/html/classdba__mysqli.html
@@ -0,0 +1,263 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: dba_mysqli Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classdba__mysqli.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="classdba__mysqli-members.html">List of all members</a> </div>
+ <div class="headertitle">
+<div class="title">dba_mysqli Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="dynheader">
+Inheritance diagram for dba_mysqli:</div>
+<div class="dyncontent">
+ <div class="center">
+ <img src="classdba__mysqli.png" usemap="#dba_mysqli_map" alt=""/>
+ <map id="dba_mysqli_map" name="dba_mysqli_map">
+<area href="classdba__driver.html" alt="dba_driver" shape="rect" coords="0,0,74,24"/>
+</map>
+ </div></div>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:add062bd93961e5f0194d94820e9a51b1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__mysqli.html#add062bd93961e5f0194d94820e9a51b1">connect</a> ($server, $port, $user, $pass, $db)</td></tr>
+<tr class="separator:add062bd93961e5f0194d94820e9a51b1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a611c4de8d6d7512dffb83a38bb6701ec"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__mysqli.html#a611c4de8d6d7512dffb83a38bb6701ec">q</a> ($sql)</td></tr>
+<tr class="separator:a611c4de8d6d7512dffb83a38bb6701ec"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a27d6a748af7f80028801306e7ea33f64"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__mysqli.html#a27d6a748af7f80028801306e7ea33f64">escape</a> ($str)</td></tr>
+<tr class="separator:a27d6a748af7f80028801306e7ea33f64"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acb38f2c851187ad632ecfab30fdfab55"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__mysqli.html#acb38f2c851187ad632ecfab30fdfab55">close</a> ()</td></tr>
+<tr class="separator:acb38f2c851187ad632ecfab30fdfab55"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="inherit_header pub_methods_classdba__driver"><td colspan="2" onclick="javascript:toggleInherit('pub_methods_classdba__driver')"><img src="closed.png" alt="-"/>&#160;Public Member Functions inherited from <a class="el" href="classdba__driver.html">dba_driver</a></td></tr>
+<tr class="memitem:ae533e62a240a793f17aef5ab4ef10edc inherit pub_methods_classdba__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__driver.html#ae533e62a240a793f17aef5ab4ef10edc">connect</a> ($server, $port, $user, $pass, $db)</td></tr>
+<tr class="separator:ae533e62a240a793f17aef5ab4ef10edc inherit pub_methods_classdba__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a558e738b88ae893cc5d79ffa3793d555 inherit pub_methods_classdba__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__driver.html#a558e738b88ae893cc5d79ffa3793d555">q</a> ($sql)</td></tr>
+<tr class="separator:a558e738b88ae893cc5d79ffa3793d555 inherit pub_methods_classdba__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afc95ffa103a3290581b537670cde5311 inherit pub_methods_classdba__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__driver.html#afc95ffa103a3290581b537670cde5311">escape</a> ($str)</td></tr>
+<tr class="separator:afc95ffa103a3290581b537670cde5311 inherit pub_methods_classdba__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5afa54172f3c837df61643f8f5b2c975 inherit pub_methods_classdba__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__driver.html#a5afa54172f3c837df61643f8f5b2c975">close</a> ()</td></tr>
+<tr class="separator:a5afa54172f3c837df61643f8f5b2c975 inherit pub_methods_classdba__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af3541d13ccb7a3eddfc03e253c746186 inherit pub_methods_classdba__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__driver.html#af3541d13ccb7a3eddfc03e253c746186">__construct</a> ($server, $port, $user, $pass, $db, $<a class="el" href="classdba__driver.html#a4ccb27243e62a8ca30dd8e1b8cc67746">install</a>=false)</td></tr>
+<tr class="separator:af3541d13ccb7a3eddfc03e253c746186 inherit pub_methods_classdba__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4ccb27243e62a8ca30dd8e1b8cc67746 inherit pub_methods_classdba__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__driver.html#a4ccb27243e62a8ca30dd8e1b8cc67746">install</a> ($server, $user, $pass, $db)</td></tr>
+<tr class="separator:a4ccb27243e62a8ca30dd8e1b8cc67746 inherit pub_methods_classdba__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:adcc1f8955120fec0708bce39202d0422 inherit pub_methods_classdba__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__driver.html#adcc1f8955120fec0708bce39202d0422">dbg</a> ($dbg)</td></tr>
+<tr class="separator:adcc1f8955120fec0708bce39202d0422 inherit pub_methods_classdba__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1a8bc9dc839a6320a0e07d8047a6b721 inherit pub_methods_classdba__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__driver.html#a1a8bc9dc839a6320a0e07d8047a6b721">__destruct</a> ()</td></tr>
+<tr class="separator:a1a8bc9dc839a6320a0e07d8047a6b721 inherit pub_methods_classdba__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="inherited"></a>
+Additional Inherited Members</h2></td></tr>
+<tr class="inherit_header pub_attribs_classdba__driver"><td colspan="2" onclick="javascript:toggleInherit('pub_attribs_classdba__driver')"><img src="closed.png" alt="-"/>&#160;Public Attributes inherited from <a class="el" href="classdba__driver.html">dba_driver</a></td></tr>
+<tr class="memitem:a205f6535e399700b6fca2492f96f2229 inherit pub_attribs_classdba__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__driver.html#a205f6535e399700b6fca2492f96f2229">$connected</a> = false</td></tr>
+<tr class="separator:a205f6535e399700b6fca2492f96f2229 inherit pub_attribs_classdba__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a84675d28c7bd9b7290dd37e66dbd216c inherit pub_attribs_classdba__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__driver.html#a84675d28c7bd9b7290dd37e66dbd216c">$error</a> = false</td></tr>
+<tr class="separator:a84675d28c7bd9b7290dd37e66dbd216c inherit pub_attribs_classdba__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="inherit_header pro_attribs_classdba__driver"><td colspan="2" onclick="javascript:toggleInherit('pro_attribs_classdba__driver')"><img src="closed.png" alt="-"/>&#160;Protected Attributes inherited from <a class="el" href="classdba__driver.html">dba_driver</a></td></tr>
+<tr class="memitem:af48e2afeded5285766bf92e22123ed03 inherit pro_attribs_classdba__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__driver.html#af48e2afeded5285766bf92e22123ed03">$debug</a> = 0</td></tr>
+<tr class="separator:af48e2afeded5285766bf92e22123ed03 inherit pro_attribs_classdba__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3033b5f1c2716b52202faeaae2592fe6 inherit pro_attribs_classdba__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__driver.html#a3033b5f1c2716b52202faeaae2592fe6">$db</a></td></tr>
+<tr class="separator:a3033b5f1c2716b52202faeaae2592fe6 inherit pro_attribs_classdba__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Member Function Documentation</h2>
+<a class="anchor" id="acb38f2c851187ad632ecfab30fdfab55"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">dba_mysqli::close </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="add062bd93961e5f0194d94820e9a51b1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">dba_mysqli::connect </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$server</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$port</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$user</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$pass</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$db</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a27d6a748af7f80028801306e7ea33f64"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">dba_mysqli::escape </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$str</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a611c4de8d6d7512dffb83a38bb6701ec"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">dba_mysqli::q </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$sql</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>include/dba/<a class="el" href="dba__mysqli_8php.html">dba_mysqli.php</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classdba__mysqli.js b/doc/html/classdba__mysqli.js
new file mode 100644
index 000000000..a5f54698e
--- /dev/null
+++ b/doc/html/classdba__mysqli.js
@@ -0,0 +1,7 @@
+var classdba__mysqli =
+[
+ [ "close", "classdba__mysqli.html#acb38f2c851187ad632ecfab30fdfab55", null ],
+ [ "connect", "classdba__mysqli.html#add062bd93961e5f0194d94820e9a51b1", null ],
+ [ "escape", "classdba__mysqli.html#a27d6a748af7f80028801306e7ea33f64", null ],
+ [ "q", "classdba__mysqli.html#a611c4de8d6d7512dffb83a38bb6701ec", null ]
+]; \ No newline at end of file
diff --git a/doc/html/classdba__mysqli.png b/doc/html/classdba__mysqli.png
new file mode 100644
index 000000000..1667829fc
--- /dev/null
+++ b/doc/html/classdba__mysqli.png
Binary files differ
diff --git a/doc/html/classenotify-members.html b/doc/html/classenotify-members.html
new file mode 100644
index 000000000..65681ca44
--- /dev/null
+++ b/doc/html/classenotify-members.html
@@ -0,0 +1,118 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classenotify.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">enotify Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classenotify.html">enotify</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="classenotify.html#afbc088860f534c6c05788b48cfc262c6">send</a>($params)</td><td class="entry"><a class="el" href="classenotify.html">enotify</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+</table></div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classenotify.html b/doc/html/classenotify.html
new file mode 100644
index 000000000..2dc2d8640
--- /dev/null
+++ b/doc/html/classenotify.html
@@ -0,0 +1,167 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: enotify Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classenotify.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#pub-static-methods">Static Public Member Functions</a> &#124;
+<a href="classenotify-members.html">List of all members</a> </div>
+ <div class="headertitle">
+<div class="title">enotify Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-static-methods"></a>
+Static Public Member Functions</h2></td></tr>
+<tr class="memitem:afbc088860f534c6c05788b48cfc262c6"><td class="memItemLeft" align="right" valign="top">static&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classenotify.html#afbc088860f534c6c05788b48cfc262c6">send</a> ($params)</td></tr>
+<tr class="separator:afbc088860f534c6c05788b48cfc262c6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Member Function Documentation</h2>
+<a class="anchor" id="afbc088860f534c6c05788b48cfc262c6"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">static enotify::send </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$params</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+<p>Send a multipart/alternative message with Text and HTML versions</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">fromName</td><td>name of the sender </td></tr>
+ <tr><td class="paramname">fromEmail</td><td>email fo the sender </td></tr>
+ <tr><td class="paramname">replyTo</td><td>replyTo address to direct responses </td></tr>
+ <tr><td class="paramname">toEmail</td><td>destination email address </td></tr>
+ <tr><td class="paramname">messageSubject</td><td>subject of the message </td></tr>
+ <tr><td class="paramname">htmlVersion</td><td>html version of the message </td></tr>
+ <tr><td class="paramname">textVersion</td><td>text only version of the message </td></tr>
+ <tr><td class="paramname">additionalMailHeader</td><td>additions to the smtp mail header </td></tr>
+ </table>
+ </dd>
+</dl>
+
+<p>Referenced by <a class="el" href="enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc">notification()</a>.</p>
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>include/<a class="el" href="enotify_8php.html">enotify.php</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classes.html b/doc/html/classes.html
new file mode 100644
index 000000000..4125fa1dd
--- /dev/null
+++ b/doc/html/classes.html
@@ -0,0 +1,142 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class Index</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li class="current"><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classes.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">Class Index</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="qindex"><a class="qindex" href="#letter_A">A</a>&#160;|&#160;<a class="qindex" href="#letter_B">B</a>&#160;|&#160;<a class="qindex" href="#letter_C">C</a>&#160;|&#160;<a class="qindex" href="#letter_D">D</a>&#160;|&#160;<a class="qindex" href="#letter_E">E</a>&#160;|&#160;<a class="qindex" href="#letter_F">F</a>&#160;|&#160;<a class="qindex" href="#letter_I">I</a>&#160;|&#160;<a class="qindex" href="#letter_P">P</a>&#160;|&#160;<a class="qindex" href="#letter_R">R</a>&#160;|&#160;<a class="qindex" href="#letter_T">T</a>&#160;|&#160;<a class="qindex" href="#letter_Z">Z</a></div>
+<table style="margin: 10px; white-space: nowrap;" align="center" width="95%" border="0" cellspacing="0" cellpadding="0">
+<tr><td rowspan="2" valign="bottom"><a name="letter_A"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;A&#160;&#160;</div></td></tr></table>
+</td><td rowspan="2" valign="bottom"><a name="letter_D"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;D&#160;&#160;</div></td></tr></table>
+</td><td valign="top"><a class="el" href="classFKOAuthDataStore.html">FKOAuthDataStore</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="classphoto__gd.html">photo_gd</a>&#160;&#160;&#160;</td><td rowspan="2" valign="bottom"><a name="letter_Z"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;Z&#160;&#160;</div></td></tr></table>
+</td></tr>
+<tr><td valign="top"><a class="el" href="classFriendicaSmarty.html">FriendicaSmarty</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="classphoto__imagick.html">photo_imagick</a>&#160;&#160;&#160;</td></tr>
+<tr><td valign="top"><a class="el" href="classApp.html">App</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="classdba__driver.html">dba_driver</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="classFriendicaSmartyEngine.html">FriendicaSmartyEngine</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="classProtoDriver.html">ProtoDriver</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="classZotDriver.html">ZotDriver</a>&#160;&#160;&#160;</td></tr>
+<tr><td rowspan="2" valign="bottom"><a name="letter_B"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;B&#160;&#160;</div></td></tr></table>
+</td><td valign="top"><a class="el" href="classdba__mysql.html">dba_mysql</a>&#160;&#160;&#160;</td><td rowspan="2" valign="bottom"><a name="letter_I"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;I&#160;&#160;</div></td></tr></table>
+</td><td rowspan="2" valign="bottom"><a name="letter_R"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;R&#160;&#160;</div></td></tr></table>
+</td><td></td></tr>
+<tr><td valign="top"><a class="el" href="classdba__mysqli.html">dba_mysqli</a>&#160;&#160;&#160;</td><td></td></tr>
+<tr><td valign="top"><a class="el" href="classBaseObject.html">BaseObject</a>&#160;&#160;&#160;</td><td rowspan="2" valign="bottom"><a name="letter_E"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;E&#160;&#160;</div></td></tr></table>
+</td><td valign="top"><a class="el" href="classItem.html">Item</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="classRedBasicAuth.html">RedBasicAuth</a>&#160;&#160;&#160;</td><td></td></tr>
+<tr><td rowspan="2" valign="bottom"><a name="letter_C"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;C&#160;&#160;</div></td></tr></table>
+</td><td valign="top"><a class="el" href="interfaceITemplateEngine.html">ITemplateEngine</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="classRedBrowser.html">RedBrowser</a>&#160;&#160;&#160;</td><td></td></tr>
+<tr><td valign="top"><a class="el" href="classenotify.html">enotify</a>&#160;&#160;&#160;</td><td rowspan="2" valign="bottom"><a name="letter_P"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;P&#160;&#160;</div></td></tr></table>
+</td><td valign="top"><a class="el" href="classRedDirectory.html">RedDirectory</a>&#160;&#160;&#160;</td><td></td></tr>
+<tr><td valign="top"><a class="el" href="classCache.html">Cache</a>&#160;&#160;&#160;</td><td rowspan="2" valign="bottom"><a name="letter_F"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;F&#160;&#160;</div></td></tr></table>
+</td><td valign="top"><a class="el" href="classRedFile.html">RedFile</a>&#160;&#160;&#160;</td><td></td></tr>
+<tr><td valign="top"><a class="el" href="classConversation.html">Conversation</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="classphoto__driver.html">photo_driver</a>&#160;&#160;&#160;</td><td rowspan="2" valign="bottom"><a name="letter_T"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;T&#160;&#160;</div></td></tr></table>
+</td><td></td></tr>
+<tr><td></td><td valign="top"><a class="el" href="classFKOAuth1.html">FKOAuth1</a>&#160;&#160;&#160;</td><td></td><td></td></tr>
+<tr><td></td><td></td><td></td><td valign="top"><a class="el" href="classTemplate.html">Template</a>&#160;&#160;&#160;</td><td></td></tr>
+<tr><td></td><td></td><td></td><td></td><td></td></tr>
+</table>
+<div class="qindex"><a class="qindex" href="#letter_A">A</a>&#160;|&#160;<a class="qindex" href="#letter_B">B</a>&#160;|&#160;<a class="qindex" href="#letter_C">C</a>&#160;|&#160;<a class="qindex" href="#letter_D">D</a>&#160;|&#160;<a class="qindex" href="#letter_E">E</a>&#160;|&#160;<a class="qindex" href="#letter_F">F</a>&#160;|&#160;<a class="qindex" href="#letter_I">I</a>&#160;|&#160;<a class="qindex" href="#letter_P">P</a>&#160;|&#160;<a class="qindex" href="#letter_R">R</a>&#160;|&#160;<a class="qindex" href="#letter_T">T</a>&#160;|&#160;<a class="qindex" href="#letter_Z">Z</a></div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classphoto__driver-members.html b/doc/html/classphoto__driver-members.html
new file mode 100644
index 000000000..f22362fb4
--- /dev/null
+++ b/doc/html/classphoto__driver-members.html
@@ -0,0 +1,147 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classphoto__driver.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">photo_driver Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classphoto__driver.html">photo_driver</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__driver.html#aea560be5dfba09117d36c12bacbf3b80">$height</a></td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__driver.html#a7c78b5a01afe61ba3895ac07f4869b55">$image</a></td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__driver.html#a4920ed7cbb1ac735ac84153067537f03">$type</a></td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__driver.html#a00cb166c00b7502dbc456c94330e5b03">$types</a></td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__driver.html#a01d28d43b404d6f6de219dc9c5069dc9">$valid</a></td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__driver.html#a3e4215890f4a4894bf3799a7d2e0c0b1">$width</a></td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__driver.html#ac6e85f8e507cab4e755ed7acdec401ae">__construct</a>($data, $type='')</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__driver.html#ae4501abdc9651359f81d036b63625686">__destruct</a>()</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__driver.html#a2e6e61f1e356a90bc978f4404a77137e">cropImage</a>($max, $x, $y, $w, $h)</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__driver.html#ae1a9edaf846983780dc65ea77d99e813">destroy</a>()</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__driver.html#ae18716018afcf362c7c24586b53e9e2f">doScaleImage</a>($new_width, $new_height)</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__driver.html#a2b2a99021fc63ed6465d703ddddcb832">flip</a>($horiz=true, $vert=false)</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__driver.html#aa2efb5b2a6af3fd67e3f1c2b9852a5ba">getExt</a>()</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__driver.html#af769e9abb144e57002c59aa2aa8f3468">getHeight</a>()</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__driver.html#ab98da263bd7341fc132c4fb6fc76e8d5">getImage</a>()</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__driver.html#a6c6c16dbc4f517ce799f9143ed61f0e3">getType</a>()</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__driver.html#acc30486acee9e89e32701f44a1738117">getWidth</a>()</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__driver.html#abc9f73ad90923772d52b9fcc4eb117dd">imageString</a>()</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__driver.html#a97289aef3be43d9435ca3717ef10b8ab">is_valid</a>()</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__driver.html#a19e1af2b6af4c63aa6230abe69f83712">load</a>($data, $type)</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__driver.html#a4de5bac8daea8f291a33c80788019d0d">orient</a>($filename)</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__driver.html#a2f2b6337cf9aa0688d10b422123f0eec">rotate</a>($degrees)</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__driver.html#a5864fae7d8389372955a8e78cec527ac">save</a>($arr)</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__driver.html#a22ecb8c696de65a5a10bd185be9d90c3">saveImage</a>($path)</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__driver.html#af0f7ec48a31ae9b557b6e3f8bd5b4af0">scaleImage</a>($max)</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__driver.html#a56634842b071b96502716e9843ea5361">scaleImageSquare</a>($dim)</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__driver.html#a1a63c4ae17e892a115ab9cf6efb960ce">scaleImageUp</a>($min)</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__driver.html#ae663867d2c4eaa2fae50d60670920143">setDimensions</a>()</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__driver.html#a642a8d0c4ad5f887c99c6af77cee287b">store</a>($aid, $uid, $xchan, $rid, $filename, $album, $scale, $profile=0, $allow_cid= '', $allow_gid= '', $deny_cid= '', $deny_gid= '')</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__driver.html#a6eee8e36eaf9339f4faf80ddd43162da">supportedTypes</a>()</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+</table></div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classphoto__driver.html b/doc/html/classphoto__driver.html
new file mode 100644
index 000000000..8a8ed59ff
--- /dev/null
+++ b/doc/html/classphoto__driver.html
@@ -0,0 +1,945 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: photo_driver Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classphoto__driver.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="#pro-attribs">Protected Attributes</a> &#124;
+<a href="classphoto__driver-members.html">List of all members</a> </div>
+ <div class="headertitle">
+<div class="title">photo_driver Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="dynheader">
+Inheritance diagram for photo_driver:</div>
+<div class="dyncontent">
+ <div class="center">
+ <img src="classphoto__driver.png" usemap="#photo_driver_map" alt=""/>
+ <map id="photo_driver_map" name="photo_driver_map">
+<area href="classphoto__gd.html" alt="photo_gd" shape="rect" coords="0,56,92,80"/>
+<area href="classphoto__imagick.html" alt="photo_imagick" shape="rect" coords="102,56,194,80"/>
+</map>
+ </div></div>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:a6eee8e36eaf9339f4faf80ddd43162da"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a6eee8e36eaf9339f4faf80ddd43162da">supportedTypes</a> ()</td></tr>
+<tr class="separator:a6eee8e36eaf9339f4faf80ddd43162da"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a19e1af2b6af4c63aa6230abe69f83712"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a19e1af2b6af4c63aa6230abe69f83712">load</a> ($data, $type)</td></tr>
+<tr class="separator:a19e1af2b6af4c63aa6230abe69f83712"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae1a9edaf846983780dc65ea77d99e813"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#ae1a9edaf846983780dc65ea77d99e813">destroy</a> ()</td></tr>
+<tr class="separator:ae1a9edaf846983780dc65ea77d99e813"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae663867d2c4eaa2fae50d60670920143"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#ae663867d2c4eaa2fae50d60670920143">setDimensions</a> ()</td></tr>
+<tr class="separator:ae663867d2c4eaa2fae50d60670920143"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab98da263bd7341fc132c4fb6fc76e8d5"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#ab98da263bd7341fc132c4fb6fc76e8d5">getImage</a> ()</td></tr>
+<tr class="separator:ab98da263bd7341fc132c4fb6fc76e8d5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae18716018afcf362c7c24586b53e9e2f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#ae18716018afcf362c7c24586b53e9e2f">doScaleImage</a> ($new_width, $new_height)</td></tr>
+<tr class="separator:ae18716018afcf362c7c24586b53e9e2f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2f2b6337cf9aa0688d10b422123f0eec"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a2f2b6337cf9aa0688d10b422123f0eec">rotate</a> ($degrees)</td></tr>
+<tr class="separator:a2f2b6337cf9aa0688d10b422123f0eec"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2b2a99021fc63ed6465d703ddddcb832"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a2b2a99021fc63ed6465d703ddddcb832">flip</a> ($horiz=true, $vert=false)</td></tr>
+<tr class="separator:a2b2a99021fc63ed6465d703ddddcb832"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2e6e61f1e356a90bc978f4404a77137e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a2e6e61f1e356a90bc978f4404a77137e">cropImage</a> ($max, $<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>, $y, $w, $h)</td></tr>
+<tr class="separator:a2e6e61f1e356a90bc978f4404a77137e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abc9f73ad90923772d52b9fcc4eb117dd"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#abc9f73ad90923772d52b9fcc4eb117dd">imageString</a> ()</td></tr>
+<tr class="separator:abc9f73ad90923772d52b9fcc4eb117dd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac6e85f8e507cab4e755ed7acdec401ae"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#ac6e85f8e507cab4e755ed7acdec401ae">__construct</a> ($data, $type='')</td></tr>
+<tr class="separator:ac6e85f8e507cab4e755ed7acdec401ae"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae4501abdc9651359f81d036b63625686"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#ae4501abdc9651359f81d036b63625686">__destruct</a> ()</td></tr>
+<tr class="separator:ae4501abdc9651359f81d036b63625686"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a97289aef3be43d9435ca3717ef10b8ab"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a97289aef3be43d9435ca3717ef10b8ab">is_valid</a> ()</td></tr>
+<tr class="separator:a97289aef3be43d9435ca3717ef10b8ab"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acc30486acee9e89e32701f44a1738117"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#acc30486acee9e89e32701f44a1738117">getWidth</a> ()</td></tr>
+<tr class="separator:acc30486acee9e89e32701f44a1738117"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af769e9abb144e57002c59aa2aa8f3468"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#af769e9abb144e57002c59aa2aa8f3468">getHeight</a> ()</td></tr>
+<tr class="separator:af769e9abb144e57002c59aa2aa8f3468"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a22ecb8c696de65a5a10bd185be9d90c3"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a22ecb8c696de65a5a10bd185be9d90c3">saveImage</a> ($path)</td></tr>
+<tr class="separator:a22ecb8c696de65a5a10bd185be9d90c3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6c6c16dbc4f517ce799f9143ed61f0e3"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a6c6c16dbc4f517ce799f9143ed61f0e3">getType</a> ()</td></tr>
+<tr class="separator:a6c6c16dbc4f517ce799f9143ed61f0e3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa2efb5b2a6af3fd67e3f1c2b9852a5ba"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#aa2efb5b2a6af3fd67e3f1c2b9852a5ba">getExt</a> ()</td></tr>
+<tr class="separator:aa2efb5b2a6af3fd67e3f1c2b9852a5ba"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af0f7ec48a31ae9b557b6e3f8bd5b4af0"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#af0f7ec48a31ae9b557b6e3f8bd5b4af0">scaleImage</a> ($max)</td></tr>
+<tr class="separator:af0f7ec48a31ae9b557b6e3f8bd5b4af0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1a63c4ae17e892a115ab9cf6efb960ce"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a1a63c4ae17e892a115ab9cf6efb960ce">scaleImageUp</a> ($min)</td></tr>
+<tr class="separator:a1a63c4ae17e892a115ab9cf6efb960ce"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a56634842b071b96502716e9843ea5361"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a56634842b071b96502716e9843ea5361">scaleImageSquare</a> ($dim)</td></tr>
+<tr class="separator:a56634842b071b96502716e9843ea5361"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4de5bac8daea8f291a33c80788019d0d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a4de5bac8daea8f291a33c80788019d0d">orient</a> ($filename)</td></tr>
+<tr class="separator:a4de5bac8daea8f291a33c80788019d0d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5864fae7d8389372955a8e78cec527ac"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a5864fae7d8389372955a8e78cec527ac">save</a> ($arr)</td></tr>
+<tr class="separator:a5864fae7d8389372955a8e78cec527ac"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a642a8d0c4ad5f887c99c6af77cee287b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a642a8d0c4ad5f887c99c6af77cee287b">store</a> ($aid, $uid, $xchan, $rid, $filename, $album, $scale, $profile=0, $allow_cid= '', $allow_gid= '', $deny_cid= '', $deny_gid= '')</td></tr>
+<tr class="separator:a642a8d0c4ad5f887c99c6af77cee287b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pro-attribs"></a>
+Protected Attributes</h2></td></tr>
+<tr class="memitem:a7c78b5a01afe61ba3895ac07f4869b55"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a7c78b5a01afe61ba3895ac07f4869b55">$image</a></td></tr>
+<tr class="separator:a7c78b5a01afe61ba3895ac07f4869b55"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3e4215890f4a4894bf3799a7d2e0c0b1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a3e4215890f4a4894bf3799a7d2e0c0b1">$width</a></td></tr>
+<tr class="separator:a3e4215890f4a4894bf3799a7d2e0c0b1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aea560be5dfba09117d36c12bacbf3b80"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#aea560be5dfba09117d36c12bacbf3b80">$height</a></td></tr>
+<tr class="separator:aea560be5dfba09117d36c12bacbf3b80"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a01d28d43b404d6f6de219dc9c5069dc9"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a01d28d43b404d6f6de219dc9c5069dc9">$valid</a></td></tr>
+<tr class="separator:a01d28d43b404d6f6de219dc9c5069dc9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4920ed7cbb1ac735ac84153067537f03"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a4920ed7cbb1ac735ac84153067537f03">$type</a></td></tr>
+<tr class="separator:a4920ed7cbb1ac735ac84153067537f03"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a00cb166c00b7502dbc456c94330e5b03"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a00cb166c00b7502dbc456c94330e5b03">$types</a></td></tr>
+<tr class="separator:a00cb166c00b7502dbc456c94330e5b03"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Constructor &amp; Destructor Documentation</h2>
+<a class="anchor" id="ac6e85f8e507cab4e755ed7acdec401ae"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_driver::__construct </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$data</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em> = <code>''</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ae4501abdc9651359f81d036b63625686"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_driver::__destruct </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Member Function Documentation</h2>
+<a class="anchor" id="a2e6e61f1e356a90bc978f4404a77137e"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_driver::cropImage </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$max</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$x</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$y</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$w</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$h</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">abstract</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ae1a9edaf846983780dc65ea77d99e813"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_driver::destroy </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">abstract</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classphoto__driver.html#ae4501abdc9651359f81d036b63625686">__destruct()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ae18716018afcf362c7c24586b53e9e2f"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_driver::doScaleImage </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$new_width</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$new_height</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">abstract</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classphoto__driver.html#af0f7ec48a31ae9b557b6e3f8bd5b4af0">scaleImage()</a>, <a class="el" href="classphoto__driver.html#a56634842b071b96502716e9843ea5361">scaleImageSquare()</a>, and <a class="el" href="classphoto__driver.html#a1a63c4ae17e892a115ab9cf6efb960ce">scaleImageUp()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a2b2a99021fc63ed6465d703ddddcb832"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_driver::flip </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$horiz</em> = <code>true</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$vert</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">abstract</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classphoto__driver.html#a4de5bac8daea8f291a33c80788019d0d">orient()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa2efb5b2a6af3fd67e3f1c2b9852a5ba"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_driver::getExt </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="af769e9abb144e57002c59aa2aa8f3468"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_driver::getHeight </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classphoto__driver.html#a5864fae7d8389372955a8e78cec527ac">save()</a>, and <a class="el" href="classphoto__driver.html#a642a8d0c4ad5f887c99c6af77cee287b">store()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ab98da263bd7341fc132c4fb6fc76e8d5"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_driver::getImage </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">abstract</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a6c6c16dbc4f517ce799f9143ed61f0e3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_driver::getType </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classphoto__driver.html#aa2efb5b2a6af3fd67e3f1c2b9852a5ba">getExt()</a>, <a class="el" href="classphoto__gd.html#a0795fc029be382557ae3f6e285f40e00">photo_gd\imageString()</a>, <a class="el" href="classphoto__imagick.html#a2c9168f110ccd6c264095d766615dfa8">photo_imagick\load()</a>, <a class="el" href="classphoto__driver.html#a4de5bac8daea8f291a33c80788019d0d">orient()</a>, <a class="el" href="classphoto__driver.html#a5864fae7d8389372955a8e78cec527ac">save()</a>, and <a class="el" href="classphoto__driver.html#a642a8d0c4ad5f887c99c6af77cee287b">store()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="acc30486acee9e89e32701f44a1738117"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_driver::getWidth </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classphoto__driver.html#a5864fae7d8389372955a8e78cec527ac">save()</a>, and <a class="el" href="classphoto__driver.html#a642a8d0c4ad5f887c99c6af77cee287b">store()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="abc9f73ad90923772d52b9fcc4eb117dd"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_driver::imageString </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">abstract</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classphoto__driver.html#a5864fae7d8389372955a8e78cec527ac">save()</a>, <a class="el" href="classphoto__driver.html#a22ecb8c696de65a5a10bd185be9d90c3">saveImage()</a>, and <a class="el" href="classphoto__driver.html#a642a8d0c4ad5f887c99c6af77cee287b">store()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a97289aef3be43d9435ca3717ef10b8ab"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_driver::is_valid </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classphoto__driver.html#ae4501abdc9651359f81d036b63625686">__destruct()</a>, <a class="el" href="classphoto__gd.html#ab2232d775c8bacf66773a03308105f0c">photo_gd\cropImage()</a>, <a class="el" href="classphoto__imagick.html#a2f33a03a89497a2b2768e29736d4a8a4">photo_imagick\cropImage()</a>, <a class="el" href="classphoto__gd.html#a724703ecf71b1f1d04a80e86c76db6b1">photo_gd\destroy()</a>, <a class="el" href="classphoto__imagick.html#afd49d64751ee3a298eac0c0ce0ba0207">photo_imagick\destroy()</a>, <a class="el" href="classphoto__gd.html#a44cedef376044018702d9355ddc813ce">photo_gd\flip()</a>, <a class="el" href="classphoto__imagick.html#aff6bcdbab18593a3fc5a480db8509393">photo_imagick\flip()</a>, <a class="el" href="classphoto__driver.html#aa2efb5b2a6af3fd67e3f1c2b9852a5ba">getExt()</a>, <a class="el" href="classphoto__driver.html#af769e9abb144e57002c59aa2aa8f3468">getHeight()</a>, <a class="el" href="classphoto__gd.html#a86757ba021fd80d1a5cf8c2f766a8484">photo_gd\getImage()</a>, <a class="el" href="classphoto__imagick.html#ad07288e0eb3922cb08cc9d33a163decc">photo_imagick\getImage()</a>, <a class="el" href="classphoto__driver.html#a6c6c16dbc4f517ce799f9143ed61f0e3">getType()</a>, <a class="el" href="classphoto__driver.html#acc30486acee9e89e32701f44a1738117">getWidth()</a>, <a class="el" href="classphoto__gd.html#a0795fc029be382557ae3f6e285f40e00">photo_gd\imageString()</a>, <a class="el" href="classphoto__imagick.html#a70adbef31128c0ac8cbc5dcf34cdb019">photo_imagick\imageString()</a>, <a class="el" href="classphoto__driver.html#a4de5bac8daea8f291a33c80788019d0d">orient()</a>, <a class="el" href="classphoto__gd.html#a77f87730b11093b76980c541159df37d">photo_gd\rotate()</a>, <a class="el" href="classphoto__imagick.html#a9df5738a4a18e76dd304c440e96f045f">photo_imagick\rotate()</a>, <a class="el" href="classphoto__driver.html#a22ecb8c696de65a5a10bd185be9d90c3">saveImage()</a>, <a class="el" href="classphoto__driver.html#af0f7ec48a31ae9b557b6e3f8bd5b4af0">scaleImage()</a>, <a class="el" href="classphoto__driver.html#a56634842b071b96502716e9843ea5361">scaleImageSquare()</a>, and <a class="el" href="classphoto__driver.html#a1a63c4ae17e892a115ab9cf6efb960ce">scaleImageUp()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a19e1af2b6af4c63aa6230abe69f83712"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_driver::load </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$data</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">abstract</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classphoto__driver.html#ac6e85f8e507cab4e755ed7acdec401ae">__construct()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a4de5bac8daea8f291a33c80788019d0d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_driver::orient </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$filename</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>This function is a bit unusual, because it is operating on a file, but you must first create an image from that file to initialise the type and check validity of the image.</p>
+
+</div>
+</div>
+<a class="anchor" id="a2f2b6337cf9aa0688d10b422123f0eec"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_driver::rotate </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$degrees</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">abstract</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classphoto__driver.html#a4de5bac8daea8f291a33c80788019d0d">orient()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a5864fae7d8389372955a8e78cec527ac"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_driver::save </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a22ecb8c696de65a5a10bd185be9d90c3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_driver::saveImage </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$path</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="af0f7ec48a31ae9b557b6e3f8bd5b4af0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_driver::scaleImage </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$max</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a56634842b071b96502716e9843ea5361"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_driver::scaleImageSquare </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$dim</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a1a63c4ae17e892a115ab9cf6efb960ce"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_driver::scaleImageUp </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$min</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ae663867d2c4eaa2fae50d60670920143"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_driver::setDimensions </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">abstract</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a642a8d0c4ad5f887c99c6af77cee287b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_driver::store </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$aid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$xchan</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$rid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$filename</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$album</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$scale</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$profile</em> = <code>0</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$allow_cid</em> = <code>''</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$allow_gid</em> = <code>''</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$deny_cid</em> = <code>''</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$deny_gid</em> = <code>''</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a6eee8e36eaf9339f4faf80ddd43162da"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_driver::supportedTypes </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">abstract</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classphoto__driver.html#ac6e85f8e507cab4e755ed7acdec401ae">__construct()</a>.</p>
+
+</div>
+</div>
+<h2 class="groupheader">Member Data Documentation</h2>
+<a class="anchor" id="aea560be5dfba09117d36c12bacbf3b80"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_driver::$height</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classphoto__gd.html#a2f2e5900e6d8b1667892ac631b1d4754">photo_gd\doScaleImage()</a>, <a class="el" href="classphoto__driver.html#af769e9abb144e57002c59aa2aa8f3468">getHeight()</a>, <a class="el" href="classphoto__driver.html#af0f7ec48a31ae9b557b6e3f8bd5b4af0">scaleImage()</a>, and <a class="el" href="classphoto__driver.html#a1a63c4ae17e892a115ab9cf6efb960ce">scaleImageUp()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a7c78b5a01afe61ba3895ac07f4869b55"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_driver::$image</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classphoto__gd.html#a86757ba021fd80d1a5cf8c2f766a8484">photo_gd\getImage()</a>, and <a class="el" href="classphoto__imagick.html#ad07288e0eb3922cb08cc9d33a163decc">photo_imagick\getImage()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a4920ed7cbb1ac735ac84153067537f03"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_driver::$type</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classphoto__driver.html#ac6e85f8e507cab4e755ed7acdec401ae">__construct()</a>, <a class="el" href="classphoto__driver.html#a6c6c16dbc4f517ce799f9143ed61f0e3">getType()</a>, and <a class="el" href="classphoto__imagick.html#a2c9168f110ccd6c264095d766615dfa8">photo_imagick\load()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a00cb166c00b7502dbc456c94330e5b03"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_driver::$types</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a01d28d43b404d6f6de219dc9c5069dc9"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_driver::$valid</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classphoto__driver.html#a97289aef3be43d9435ca3717ef10b8ab">is_valid()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a3e4215890f4a4894bf3799a7d2e0c0b1"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_driver::$width</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classphoto__gd.html#a2f2e5900e6d8b1667892ac631b1d4754">photo_gd\doScaleImage()</a>, <a class="el" href="classphoto__driver.html#acc30486acee9e89e32701f44a1738117">getWidth()</a>, <a class="el" href="classphoto__driver.html#af0f7ec48a31ae9b557b6e3f8bd5b4af0">scaleImage()</a>, and <a class="el" href="classphoto__driver.html#a1a63c4ae17e892a115ab9cf6efb960ce">scaleImageUp()</a>.</p>
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>include/photo/<a class="el" href="photo__driver_8php.html">photo_driver.php</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classphoto__driver.js b/doc/html/classphoto__driver.js
new file mode 100644
index 000000000..258b2eb60
--- /dev/null
+++ b/doc/html/classphoto__driver.js
@@ -0,0 +1,33 @@
+var classphoto__driver =
+[
+ [ "__construct", "classphoto__driver.html#ac6e85f8e507cab4e755ed7acdec401ae", null ],
+ [ "__destruct", "classphoto__driver.html#ae4501abdc9651359f81d036b63625686", null ],
+ [ "cropImage", "classphoto__driver.html#a2e6e61f1e356a90bc978f4404a77137e", null ],
+ [ "destroy", "classphoto__driver.html#ae1a9edaf846983780dc65ea77d99e813", null ],
+ [ "doScaleImage", "classphoto__driver.html#ae18716018afcf362c7c24586b53e9e2f", null ],
+ [ "flip", "classphoto__driver.html#a2b2a99021fc63ed6465d703ddddcb832", null ],
+ [ "getExt", "classphoto__driver.html#aa2efb5b2a6af3fd67e3f1c2b9852a5ba", null ],
+ [ "getHeight", "classphoto__driver.html#af769e9abb144e57002c59aa2aa8f3468", null ],
+ [ "getImage", "classphoto__driver.html#ab98da263bd7341fc132c4fb6fc76e8d5", null ],
+ [ "getType", "classphoto__driver.html#a6c6c16dbc4f517ce799f9143ed61f0e3", null ],
+ [ "getWidth", "classphoto__driver.html#acc30486acee9e89e32701f44a1738117", null ],
+ [ "imageString", "classphoto__driver.html#abc9f73ad90923772d52b9fcc4eb117dd", null ],
+ [ "is_valid", "classphoto__driver.html#a97289aef3be43d9435ca3717ef10b8ab", null ],
+ [ "load", "classphoto__driver.html#a19e1af2b6af4c63aa6230abe69f83712", null ],
+ [ "orient", "classphoto__driver.html#a4de5bac8daea8f291a33c80788019d0d", null ],
+ [ "rotate", "classphoto__driver.html#a2f2b6337cf9aa0688d10b422123f0eec", null ],
+ [ "save", "classphoto__driver.html#a5864fae7d8389372955a8e78cec527ac", null ],
+ [ "saveImage", "classphoto__driver.html#a22ecb8c696de65a5a10bd185be9d90c3", null ],
+ [ "scaleImage", "classphoto__driver.html#af0f7ec48a31ae9b557b6e3f8bd5b4af0", null ],
+ [ "scaleImageSquare", "classphoto__driver.html#a56634842b071b96502716e9843ea5361", null ],
+ [ "scaleImageUp", "classphoto__driver.html#a1a63c4ae17e892a115ab9cf6efb960ce", null ],
+ [ "setDimensions", "classphoto__driver.html#ae663867d2c4eaa2fae50d60670920143", null ],
+ [ "store", "classphoto__driver.html#a642a8d0c4ad5f887c99c6af77cee287b", null ],
+ [ "supportedTypes", "classphoto__driver.html#a6eee8e36eaf9339f4faf80ddd43162da", null ],
+ [ "$height", "classphoto__driver.html#aea560be5dfba09117d36c12bacbf3b80", null ],
+ [ "$image", "classphoto__driver.html#a7c78b5a01afe61ba3895ac07f4869b55", null ],
+ [ "$type", "classphoto__driver.html#a4920ed7cbb1ac735ac84153067537f03", null ],
+ [ "$types", "classphoto__driver.html#a00cb166c00b7502dbc456c94330e5b03", null ],
+ [ "$valid", "classphoto__driver.html#a01d28d43b404d6f6de219dc9c5069dc9", null ],
+ [ "$width", "classphoto__driver.html#a3e4215890f4a4894bf3799a7d2e0c0b1", null ]
+]; \ No newline at end of file
diff --git a/doc/html/classphoto__driver.png b/doc/html/classphoto__driver.png
new file mode 100644
index 000000000..5ce112bd2
--- /dev/null
+++ b/doc/html/classphoto__driver.png
Binary files differ
diff --git a/doc/html/classphoto__gd-members.html b/doc/html/classphoto__gd-members.html
new file mode 100644
index 000000000..cd85d4020
--- /dev/null
+++ b/doc/html/classphoto__gd-members.html
@@ -0,0 +1,147 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classphoto__gd.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">photo_gd Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classphoto__gd.html">photo_gd</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__driver.html#aea560be5dfba09117d36c12bacbf3b80">$height</a></td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__driver.html#a7c78b5a01afe61ba3895ac07f4869b55">$image</a></td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__driver.html#a4920ed7cbb1ac735ac84153067537f03">$type</a></td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__driver.html#a00cb166c00b7502dbc456c94330e5b03">$types</a></td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__driver.html#a01d28d43b404d6f6de219dc9c5069dc9">$valid</a></td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__driver.html#a3e4215890f4a4894bf3799a7d2e0c0b1">$width</a></td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__driver.html#ac6e85f8e507cab4e755ed7acdec401ae">__construct</a>($data, $type='')</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__driver.html#ae4501abdc9651359f81d036b63625686">__destruct</a>()</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__gd.html#ab2232d775c8bacf66773a03308105f0c">cropImage</a>($max, $x, $y, $w, $h)</td><td class="entry"><a class="el" href="classphoto__gd.html">photo_gd</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__gd.html#a724703ecf71b1f1d04a80e86c76db6b1">destroy</a>()</td><td class="entry"><a class="el" href="classphoto__gd.html">photo_gd</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__gd.html#a2f2e5900e6d8b1667892ac631b1d4754">doScaleImage</a>($dest_width, $dest_height)</td><td class="entry"><a class="el" href="classphoto__gd.html">photo_gd</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__gd.html#a44cedef376044018702d9355ddc813ce">flip</a>($horiz=true, $vert=false)</td><td class="entry"><a class="el" href="classphoto__gd.html">photo_gd</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__driver.html#aa2efb5b2a6af3fd67e3f1c2b9852a5ba">getExt</a>()</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__driver.html#af769e9abb144e57002c59aa2aa8f3468">getHeight</a>()</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__gd.html#a86757ba021fd80d1a5cf8c2f766a8484">getImage</a>()</td><td class="entry"><a class="el" href="classphoto__gd.html">photo_gd</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__driver.html#a6c6c16dbc4f517ce799f9143ed61f0e3">getType</a>()</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__driver.html#acc30486acee9e89e32701f44a1738117">getWidth</a>()</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__gd.html#a0795fc029be382557ae3f6e285f40e00">imageString</a>()</td><td class="entry"><a class="el" href="classphoto__gd.html">photo_gd</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__driver.html#a97289aef3be43d9435ca3717ef10b8ab">is_valid</a>()</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__gd.html#a33092b889875b68bfb1c97ff123012d9">load</a>($data, $type)</td><td class="entry"><a class="el" href="classphoto__gd.html">photo_gd</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__driver.html#a4de5bac8daea8f291a33c80788019d0d">orient</a>($filename)</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__gd.html#a77f87730b11093b76980c541159df37d">rotate</a>($degrees)</td><td class="entry"><a class="el" href="classphoto__gd.html">photo_gd</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__driver.html#a5864fae7d8389372955a8e78cec527ac">save</a>($arr)</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__driver.html#a22ecb8c696de65a5a10bd185be9d90c3">saveImage</a>($path)</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__driver.html#af0f7ec48a31ae9b557b6e3f8bd5b4af0">scaleImage</a>($max)</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__driver.html#a56634842b071b96502716e9843ea5361">scaleImageSquare</a>($dim)</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__driver.html#a1a63c4ae17e892a115ab9cf6efb960ce">scaleImageUp</a>($min)</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__gd.html#a1c75304bd15f3b9986f0b315fb59271e">setDimensions</a>()</td><td class="entry"><a class="el" href="classphoto__gd.html">photo_gd</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__driver.html#a642a8d0c4ad5f887c99c6af77cee287b">store</a>($aid, $uid, $xchan, $rid, $filename, $album, $scale, $profile=0, $allow_cid= '', $allow_gid= '', $deny_cid= '', $deny_gid= '')</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__gd.html#a16f3dd7d3559f715aa2fe3f7880836dd">supportedTypes</a>()</td><td class="entry"><a class="el" href="classphoto__gd.html">photo_gd</a></td><td class="entry"></td></tr>
+</table></div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classphoto__gd.html b/doc/html/classphoto__gd.html
new file mode 100644
index 000000000..f6d76b31c
--- /dev/null
+++ b/doc/html/classphoto__gd.html
@@ -0,0 +1,434 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: photo_gd Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classphoto__gd.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="classphoto__gd-members.html">List of all members</a> </div>
+ <div class="headertitle">
+<div class="title">photo_gd Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="dynheader">
+Inheritance diagram for photo_gd:</div>
+<div class="dyncontent">
+ <div class="center">
+ <img src="classphoto__gd.png" usemap="#photo_gd_map" alt=""/>
+ <map id="photo_gd_map" name="photo_gd_map">
+<area href="classphoto__driver.html" alt="photo_driver" shape="rect" coords="0,0,84,24"/>
+</map>
+ </div></div>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:a16f3dd7d3559f715aa2fe3f7880836dd"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__gd.html#a16f3dd7d3559f715aa2fe3f7880836dd">supportedTypes</a> ()</td></tr>
+<tr class="separator:a16f3dd7d3559f715aa2fe3f7880836dd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a33092b889875b68bfb1c97ff123012d9"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__gd.html#a33092b889875b68bfb1c97ff123012d9">load</a> ($data, $type)</td></tr>
+<tr class="separator:a33092b889875b68bfb1c97ff123012d9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1c75304bd15f3b9986f0b315fb59271e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__gd.html#a1c75304bd15f3b9986f0b315fb59271e">setDimensions</a> ()</td></tr>
+<tr class="separator:a1c75304bd15f3b9986f0b315fb59271e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a724703ecf71b1f1d04a80e86c76db6b1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__gd.html#a724703ecf71b1f1d04a80e86c76db6b1">destroy</a> ()</td></tr>
+<tr class="separator:a724703ecf71b1f1d04a80e86c76db6b1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a86757ba021fd80d1a5cf8c2f766a8484"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__gd.html#a86757ba021fd80d1a5cf8c2f766a8484">getImage</a> ()</td></tr>
+<tr class="separator:a86757ba021fd80d1a5cf8c2f766a8484"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2f2e5900e6d8b1667892ac631b1d4754"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__gd.html#a2f2e5900e6d8b1667892ac631b1d4754">doScaleImage</a> ($dest_width, $dest_height)</td></tr>
+<tr class="separator:a2f2e5900e6d8b1667892ac631b1d4754"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a77f87730b11093b76980c541159df37d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__gd.html#a77f87730b11093b76980c541159df37d">rotate</a> ($degrees)</td></tr>
+<tr class="separator:a77f87730b11093b76980c541159df37d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a44cedef376044018702d9355ddc813ce"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__gd.html#a44cedef376044018702d9355ddc813ce">flip</a> ($horiz=true, $vert=false)</td></tr>
+<tr class="separator:a44cedef376044018702d9355ddc813ce"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab2232d775c8bacf66773a03308105f0c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__gd.html#ab2232d775c8bacf66773a03308105f0c">cropImage</a> ($max, $<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>, $y, $w, $h)</td></tr>
+<tr class="separator:ab2232d775c8bacf66773a03308105f0c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0795fc029be382557ae3f6e285f40e00"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__gd.html#a0795fc029be382557ae3f6e285f40e00">imageString</a> ()</td></tr>
+<tr class="separator:a0795fc029be382557ae3f6e285f40e00"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="inherit_header pub_methods_classphoto__driver"><td colspan="2" onclick="javascript:toggleInherit('pub_methods_classphoto__driver')"><img src="closed.png" alt="-"/>&#160;Public Member Functions inherited from <a class="el" href="classphoto__driver.html">photo_driver</a></td></tr>
+<tr class="memitem:a6eee8e36eaf9339f4faf80ddd43162da inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a6eee8e36eaf9339f4faf80ddd43162da">supportedTypes</a> ()</td></tr>
+<tr class="separator:a6eee8e36eaf9339f4faf80ddd43162da inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a19e1af2b6af4c63aa6230abe69f83712 inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a19e1af2b6af4c63aa6230abe69f83712">load</a> ($data, $type)</td></tr>
+<tr class="separator:a19e1af2b6af4c63aa6230abe69f83712 inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae1a9edaf846983780dc65ea77d99e813 inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#ae1a9edaf846983780dc65ea77d99e813">destroy</a> ()</td></tr>
+<tr class="separator:ae1a9edaf846983780dc65ea77d99e813 inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae663867d2c4eaa2fae50d60670920143 inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#ae663867d2c4eaa2fae50d60670920143">setDimensions</a> ()</td></tr>
+<tr class="separator:ae663867d2c4eaa2fae50d60670920143 inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab98da263bd7341fc132c4fb6fc76e8d5 inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#ab98da263bd7341fc132c4fb6fc76e8d5">getImage</a> ()</td></tr>
+<tr class="separator:ab98da263bd7341fc132c4fb6fc76e8d5 inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae18716018afcf362c7c24586b53e9e2f inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#ae18716018afcf362c7c24586b53e9e2f">doScaleImage</a> ($new_width, $new_height)</td></tr>
+<tr class="separator:ae18716018afcf362c7c24586b53e9e2f inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2f2b6337cf9aa0688d10b422123f0eec inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a2f2b6337cf9aa0688d10b422123f0eec">rotate</a> ($degrees)</td></tr>
+<tr class="separator:a2f2b6337cf9aa0688d10b422123f0eec inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2b2a99021fc63ed6465d703ddddcb832 inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a2b2a99021fc63ed6465d703ddddcb832">flip</a> ($horiz=true, $vert=false)</td></tr>
+<tr class="separator:a2b2a99021fc63ed6465d703ddddcb832 inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2e6e61f1e356a90bc978f4404a77137e inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a2e6e61f1e356a90bc978f4404a77137e">cropImage</a> ($max, $<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>, $y, $w, $h)</td></tr>
+<tr class="separator:a2e6e61f1e356a90bc978f4404a77137e inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abc9f73ad90923772d52b9fcc4eb117dd inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#abc9f73ad90923772d52b9fcc4eb117dd">imageString</a> ()</td></tr>
+<tr class="separator:abc9f73ad90923772d52b9fcc4eb117dd inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac6e85f8e507cab4e755ed7acdec401ae inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#ac6e85f8e507cab4e755ed7acdec401ae">__construct</a> ($data, $type='')</td></tr>
+<tr class="separator:ac6e85f8e507cab4e755ed7acdec401ae inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae4501abdc9651359f81d036b63625686 inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#ae4501abdc9651359f81d036b63625686">__destruct</a> ()</td></tr>
+<tr class="separator:ae4501abdc9651359f81d036b63625686 inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a97289aef3be43d9435ca3717ef10b8ab inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a97289aef3be43d9435ca3717ef10b8ab">is_valid</a> ()</td></tr>
+<tr class="separator:a97289aef3be43d9435ca3717ef10b8ab inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acc30486acee9e89e32701f44a1738117 inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#acc30486acee9e89e32701f44a1738117">getWidth</a> ()</td></tr>
+<tr class="separator:acc30486acee9e89e32701f44a1738117 inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af769e9abb144e57002c59aa2aa8f3468 inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#af769e9abb144e57002c59aa2aa8f3468">getHeight</a> ()</td></tr>
+<tr class="separator:af769e9abb144e57002c59aa2aa8f3468 inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a22ecb8c696de65a5a10bd185be9d90c3 inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a22ecb8c696de65a5a10bd185be9d90c3">saveImage</a> ($path)</td></tr>
+<tr class="separator:a22ecb8c696de65a5a10bd185be9d90c3 inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6c6c16dbc4f517ce799f9143ed61f0e3 inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a6c6c16dbc4f517ce799f9143ed61f0e3">getType</a> ()</td></tr>
+<tr class="separator:a6c6c16dbc4f517ce799f9143ed61f0e3 inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa2efb5b2a6af3fd67e3f1c2b9852a5ba inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#aa2efb5b2a6af3fd67e3f1c2b9852a5ba">getExt</a> ()</td></tr>
+<tr class="separator:aa2efb5b2a6af3fd67e3f1c2b9852a5ba inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af0f7ec48a31ae9b557b6e3f8bd5b4af0 inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#af0f7ec48a31ae9b557b6e3f8bd5b4af0">scaleImage</a> ($max)</td></tr>
+<tr class="separator:af0f7ec48a31ae9b557b6e3f8bd5b4af0 inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1a63c4ae17e892a115ab9cf6efb960ce inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a1a63c4ae17e892a115ab9cf6efb960ce">scaleImageUp</a> ($min)</td></tr>
+<tr class="separator:a1a63c4ae17e892a115ab9cf6efb960ce inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a56634842b071b96502716e9843ea5361 inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a56634842b071b96502716e9843ea5361">scaleImageSquare</a> ($dim)</td></tr>
+<tr class="separator:a56634842b071b96502716e9843ea5361 inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4de5bac8daea8f291a33c80788019d0d inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a4de5bac8daea8f291a33c80788019d0d">orient</a> ($filename)</td></tr>
+<tr class="separator:a4de5bac8daea8f291a33c80788019d0d inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5864fae7d8389372955a8e78cec527ac inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a5864fae7d8389372955a8e78cec527ac">save</a> ($arr)</td></tr>
+<tr class="separator:a5864fae7d8389372955a8e78cec527ac inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a642a8d0c4ad5f887c99c6af77cee287b inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a642a8d0c4ad5f887c99c6af77cee287b">store</a> ($aid, $uid, $xchan, $rid, $filename, $album, $scale, $profile=0, $allow_cid= '', $allow_gid= '', $deny_cid= '', $deny_gid= '')</td></tr>
+<tr class="separator:a642a8d0c4ad5f887c99c6af77cee287b inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="inherited"></a>
+Additional Inherited Members</h2></td></tr>
+<tr class="inherit_header pro_attribs_classphoto__driver"><td colspan="2" onclick="javascript:toggleInherit('pro_attribs_classphoto__driver')"><img src="closed.png" alt="-"/>&#160;Protected Attributes inherited from <a class="el" href="classphoto__driver.html">photo_driver</a></td></tr>
+<tr class="memitem:a7c78b5a01afe61ba3895ac07f4869b55 inherit pro_attribs_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a7c78b5a01afe61ba3895ac07f4869b55">$image</a></td></tr>
+<tr class="separator:a7c78b5a01afe61ba3895ac07f4869b55 inherit pro_attribs_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3e4215890f4a4894bf3799a7d2e0c0b1 inherit pro_attribs_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a3e4215890f4a4894bf3799a7d2e0c0b1">$width</a></td></tr>
+<tr class="separator:a3e4215890f4a4894bf3799a7d2e0c0b1 inherit pro_attribs_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aea560be5dfba09117d36c12bacbf3b80 inherit pro_attribs_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#aea560be5dfba09117d36c12bacbf3b80">$height</a></td></tr>
+<tr class="separator:aea560be5dfba09117d36c12bacbf3b80 inherit pro_attribs_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a01d28d43b404d6f6de219dc9c5069dc9 inherit pro_attribs_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a01d28d43b404d6f6de219dc9c5069dc9">$valid</a></td></tr>
+<tr class="separator:a01d28d43b404d6f6de219dc9c5069dc9 inherit pro_attribs_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4920ed7cbb1ac735ac84153067537f03 inherit pro_attribs_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a4920ed7cbb1ac735ac84153067537f03">$type</a></td></tr>
+<tr class="separator:a4920ed7cbb1ac735ac84153067537f03 inherit pro_attribs_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a00cb166c00b7502dbc456c94330e5b03 inherit pro_attribs_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a00cb166c00b7502dbc456c94330e5b03">$types</a></td></tr>
+<tr class="separator:a00cb166c00b7502dbc456c94330e5b03 inherit pro_attribs_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Member Function Documentation</h2>
+<a class="anchor" id="ab2232d775c8bacf66773a03308105f0c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_gd::cropImage </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$max</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$x</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$y</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$w</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$h</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a724703ecf71b1f1d04a80e86c76db6b1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_gd::destroy </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a2f2e5900e6d8b1667892ac631b1d4754"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_gd::doScaleImage </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$dest_width</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$dest_height</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a44cedef376044018702d9355ddc813ce"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_gd::flip </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$horiz</em> = <code>true</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$vert</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a86757ba021fd80d1a5cf8c2f766a8484"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_gd::getImage </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a0795fc029be382557ae3f6e285f40e00"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_gd::imageString </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a33092b889875b68bfb1c97ff123012d9"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_gd::load </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$data</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a77f87730b11093b76980c541159df37d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_gd::rotate </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$degrees</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a1c75304bd15f3b9986f0b315fb59271e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_gd::setDimensions </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classphoto__gd.html#ab2232d775c8bacf66773a03308105f0c">cropImage()</a>, <a class="el" href="classphoto__gd.html#a2f2e5900e6d8b1667892ac631b1d4754">doScaleImage()</a>, <a class="el" href="classphoto__gd.html#a44cedef376044018702d9355ddc813ce">flip()</a>, <a class="el" href="classphoto__gd.html#a33092b889875b68bfb1c97ff123012d9">load()</a>, and <a class="el" href="classphoto__gd.html#a77f87730b11093b76980c541159df37d">rotate()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a16f3dd7d3559f715aa2fe3f7880836dd"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_gd::supportedTypes </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>include/photo/<a class="el" href="photo__gd_8php.html">photo_gd.php</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classphoto__gd.js b/doc/html/classphoto__gd.js
new file mode 100644
index 000000000..c9992ce63
--- /dev/null
+++ b/doc/html/classphoto__gd.js
@@ -0,0 +1,13 @@
+var classphoto__gd =
+[
+ [ "cropImage", "classphoto__gd.html#ab2232d775c8bacf66773a03308105f0c", null ],
+ [ "destroy", "classphoto__gd.html#a724703ecf71b1f1d04a80e86c76db6b1", null ],
+ [ "doScaleImage", "classphoto__gd.html#a2f2e5900e6d8b1667892ac631b1d4754", null ],
+ [ "flip", "classphoto__gd.html#a44cedef376044018702d9355ddc813ce", null ],
+ [ "getImage", "classphoto__gd.html#a86757ba021fd80d1a5cf8c2f766a8484", null ],
+ [ "imageString", "classphoto__gd.html#a0795fc029be382557ae3f6e285f40e00", null ],
+ [ "load", "classphoto__gd.html#a33092b889875b68bfb1c97ff123012d9", null ],
+ [ "rotate", "classphoto__gd.html#a77f87730b11093b76980c541159df37d", null ],
+ [ "setDimensions", "classphoto__gd.html#a1c75304bd15f3b9986f0b315fb59271e", null ],
+ [ "supportedTypes", "classphoto__gd.html#a16f3dd7d3559f715aa2fe3f7880836dd", null ]
+]; \ No newline at end of file
diff --git a/doc/html/classphoto__gd.png b/doc/html/classphoto__gd.png
new file mode 100644
index 000000000..405dcaccd
--- /dev/null
+++ b/doc/html/classphoto__gd.png
Binary files differ
diff --git a/doc/html/classphoto__imagick-members.html b/doc/html/classphoto__imagick-members.html
new file mode 100644
index 000000000..6e8be9219
--- /dev/null
+++ b/doc/html/classphoto__imagick-members.html
@@ -0,0 +1,148 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classphoto__imagick.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">photo_imagick Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classphoto__imagick.html">photo_imagick</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__driver.html#aea560be5dfba09117d36c12bacbf3b80">$height</a></td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__driver.html#a7c78b5a01afe61ba3895ac07f4869b55">$image</a></td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__driver.html#a4920ed7cbb1ac735ac84153067537f03">$type</a></td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__driver.html#a00cb166c00b7502dbc456c94330e5b03">$types</a></td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__driver.html#a01d28d43b404d6f6de219dc9c5069dc9">$valid</a></td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__driver.html#a3e4215890f4a4894bf3799a7d2e0c0b1">$width</a></td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__driver.html#ac6e85f8e507cab4e755ed7acdec401ae">__construct</a>($data, $type='')</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__driver.html#ae4501abdc9651359f81d036b63625686">__destruct</a>()</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__imagick.html#a2f33a03a89497a2b2768e29736d4a8a4">cropImage</a>($max, $x, $y, $w, $h)</td><td class="entry"><a class="el" href="classphoto__imagick.html">photo_imagick</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__imagick.html#afd49d64751ee3a298eac0c0ce0ba0207">destroy</a>()</td><td class="entry"><a class="el" href="classphoto__imagick.html">photo_imagick</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__imagick.html#a3047c68bb4de7f66c2893fe451db2b66">doScaleImage</a>($dest_width, $dest_height)</td><td class="entry"><a class="el" href="classphoto__imagick.html">photo_imagick</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__imagick.html#aff6bcdbab18593a3fc5a480db8509393">flip</a>($horiz=true, $vert=false)</td><td class="entry"><a class="el" href="classphoto__imagick.html">photo_imagick</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__imagick.html#aef020d929f66f4370e33fc158c8eebd4">get_FormatsMap</a>()</td><td class="entry"><a class="el" href="classphoto__imagick.html">photo_imagick</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__driver.html#aa2efb5b2a6af3fd67e3f1c2b9852a5ba">getExt</a>()</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__driver.html#af769e9abb144e57002c59aa2aa8f3468">getHeight</a>()</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__imagick.html#ad07288e0eb3922cb08cc9d33a163decc">getImage</a>()</td><td class="entry"><a class="el" href="classphoto__imagick.html">photo_imagick</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__driver.html#a6c6c16dbc4f517ce799f9143ed61f0e3">getType</a>()</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__driver.html#acc30486acee9e89e32701f44a1738117">getWidth</a>()</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__imagick.html#a70adbef31128c0ac8cbc5dcf34cdb019">imageString</a>()</td><td class="entry"><a class="el" href="classphoto__imagick.html">photo_imagick</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__driver.html#a97289aef3be43d9435ca3717ef10b8ab">is_valid</a>()</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__imagick.html#a2c9168f110ccd6c264095d766615dfa8">load</a>($data, $type)</td><td class="entry"><a class="el" href="classphoto__imagick.html">photo_imagick</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__driver.html#a4de5bac8daea8f291a33c80788019d0d">orient</a>($filename)</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__imagick.html#a9df5738a4a18e76dd304c440e96f045f">rotate</a>($degrees)</td><td class="entry"><a class="el" href="classphoto__imagick.html">photo_imagick</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__driver.html#a5864fae7d8389372955a8e78cec527ac">save</a>($arr)</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__driver.html#a22ecb8c696de65a5a10bd185be9d90c3">saveImage</a>($path)</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__driver.html#af0f7ec48a31ae9b557b6e3f8bd5b4af0">scaleImage</a>($max)</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__driver.html#a56634842b071b96502716e9843ea5361">scaleImageSquare</a>($dim)</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__driver.html#a1a63c4ae17e892a115ab9cf6efb960ce">scaleImageUp</a>($min)</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__imagick.html#af92901d252c1e6ab5b54eebedbed23bb">setDimensions</a>()</td><td class="entry"><a class="el" href="classphoto__imagick.html">photo_imagick</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__driver.html#a642a8d0c4ad5f887c99c6af77cee287b">store</a>($aid, $uid, $xchan, $rid, $filename, $album, $scale, $profile=0, $allow_cid= '', $allow_gid= '', $deny_cid= '', $deny_gid= '')</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__imagick.html#a27596faca6108d9d563674d1b654a0b7">supportedTypes</a>()</td><td class="entry"><a class="el" href="classphoto__imagick.html">photo_imagick</a></td><td class="entry"></td></tr>
+</table></div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classphoto__imagick.html b/doc/html/classphoto__imagick.html
new file mode 100644
index 000000000..8b6f1c630
--- /dev/null
+++ b/doc/html/classphoto__imagick.html
@@ -0,0 +1,461 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: photo_imagick Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classphoto__imagick.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="classphoto__imagick-members.html">List of all members</a> </div>
+ <div class="headertitle">
+<div class="title">photo_imagick Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="dynheader">
+Inheritance diagram for photo_imagick:</div>
+<div class="dyncontent">
+ <div class="center">
+ <img src="classphoto__imagick.png" usemap="#photo_imagick_map" alt=""/>
+ <map id="photo_imagick_map" name="photo_imagick_map">
+<area href="classphoto__driver.html" alt="photo_driver" shape="rect" coords="0,0,92,24"/>
+</map>
+ </div></div>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:a27596faca6108d9d563674d1b654a0b7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__imagick.html#a27596faca6108d9d563674d1b654a0b7">supportedTypes</a> ()</td></tr>
+<tr class="separator:a27596faca6108d9d563674d1b654a0b7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aef020d929f66f4370e33fc158c8eebd4"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__imagick.html#aef020d929f66f4370e33fc158c8eebd4">get_FormatsMap</a> ()</td></tr>
+<tr class="separator:aef020d929f66f4370e33fc158c8eebd4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2c9168f110ccd6c264095d766615dfa8"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__imagick.html#a2c9168f110ccd6c264095d766615dfa8">load</a> ($data, $type)</td></tr>
+<tr class="separator:a2c9168f110ccd6c264095d766615dfa8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afd49d64751ee3a298eac0c0ce0ba0207"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__imagick.html#afd49d64751ee3a298eac0c0ce0ba0207">destroy</a> ()</td></tr>
+<tr class="separator:afd49d64751ee3a298eac0c0ce0ba0207"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af92901d252c1e6ab5b54eebedbed23bb"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__imagick.html#af92901d252c1e6ab5b54eebedbed23bb">setDimensions</a> ()</td></tr>
+<tr class="separator:af92901d252c1e6ab5b54eebedbed23bb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad07288e0eb3922cb08cc9d33a163decc"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__imagick.html#ad07288e0eb3922cb08cc9d33a163decc">getImage</a> ()</td></tr>
+<tr class="separator:ad07288e0eb3922cb08cc9d33a163decc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3047c68bb4de7f66c2893fe451db2b66"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__imagick.html#a3047c68bb4de7f66c2893fe451db2b66">doScaleImage</a> ($dest_width, $dest_height)</td></tr>
+<tr class="separator:a3047c68bb4de7f66c2893fe451db2b66"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9df5738a4a18e76dd304c440e96f045f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__imagick.html#a9df5738a4a18e76dd304c440e96f045f">rotate</a> ($degrees)</td></tr>
+<tr class="separator:a9df5738a4a18e76dd304c440e96f045f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aff6bcdbab18593a3fc5a480db8509393"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__imagick.html#aff6bcdbab18593a3fc5a480db8509393">flip</a> ($horiz=true, $vert=false)</td></tr>
+<tr class="separator:aff6bcdbab18593a3fc5a480db8509393"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2f33a03a89497a2b2768e29736d4a8a4"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__imagick.html#a2f33a03a89497a2b2768e29736d4a8a4">cropImage</a> ($max, $<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>, $y, $w, $h)</td></tr>
+<tr class="separator:a2f33a03a89497a2b2768e29736d4a8a4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a70adbef31128c0ac8cbc5dcf34cdb019"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__imagick.html#a70adbef31128c0ac8cbc5dcf34cdb019">imageString</a> ()</td></tr>
+<tr class="separator:a70adbef31128c0ac8cbc5dcf34cdb019"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="inherit_header pub_methods_classphoto__driver"><td colspan="2" onclick="javascript:toggleInherit('pub_methods_classphoto__driver')"><img src="closed.png" alt="-"/>&#160;Public Member Functions inherited from <a class="el" href="classphoto__driver.html">photo_driver</a></td></tr>
+<tr class="memitem:a6eee8e36eaf9339f4faf80ddd43162da inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a6eee8e36eaf9339f4faf80ddd43162da">supportedTypes</a> ()</td></tr>
+<tr class="separator:a6eee8e36eaf9339f4faf80ddd43162da inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a19e1af2b6af4c63aa6230abe69f83712 inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a19e1af2b6af4c63aa6230abe69f83712">load</a> ($data, $type)</td></tr>
+<tr class="separator:a19e1af2b6af4c63aa6230abe69f83712 inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae1a9edaf846983780dc65ea77d99e813 inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#ae1a9edaf846983780dc65ea77d99e813">destroy</a> ()</td></tr>
+<tr class="separator:ae1a9edaf846983780dc65ea77d99e813 inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae663867d2c4eaa2fae50d60670920143 inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#ae663867d2c4eaa2fae50d60670920143">setDimensions</a> ()</td></tr>
+<tr class="separator:ae663867d2c4eaa2fae50d60670920143 inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab98da263bd7341fc132c4fb6fc76e8d5 inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#ab98da263bd7341fc132c4fb6fc76e8d5">getImage</a> ()</td></tr>
+<tr class="separator:ab98da263bd7341fc132c4fb6fc76e8d5 inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae18716018afcf362c7c24586b53e9e2f inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#ae18716018afcf362c7c24586b53e9e2f">doScaleImage</a> ($new_width, $new_height)</td></tr>
+<tr class="separator:ae18716018afcf362c7c24586b53e9e2f inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2f2b6337cf9aa0688d10b422123f0eec inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a2f2b6337cf9aa0688d10b422123f0eec">rotate</a> ($degrees)</td></tr>
+<tr class="separator:a2f2b6337cf9aa0688d10b422123f0eec inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2b2a99021fc63ed6465d703ddddcb832 inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a2b2a99021fc63ed6465d703ddddcb832">flip</a> ($horiz=true, $vert=false)</td></tr>
+<tr class="separator:a2b2a99021fc63ed6465d703ddddcb832 inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2e6e61f1e356a90bc978f4404a77137e inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a2e6e61f1e356a90bc978f4404a77137e">cropImage</a> ($max, $<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>, $y, $w, $h)</td></tr>
+<tr class="separator:a2e6e61f1e356a90bc978f4404a77137e inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abc9f73ad90923772d52b9fcc4eb117dd inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#abc9f73ad90923772d52b9fcc4eb117dd">imageString</a> ()</td></tr>
+<tr class="separator:abc9f73ad90923772d52b9fcc4eb117dd inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac6e85f8e507cab4e755ed7acdec401ae inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#ac6e85f8e507cab4e755ed7acdec401ae">__construct</a> ($data, $type='')</td></tr>
+<tr class="separator:ac6e85f8e507cab4e755ed7acdec401ae inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae4501abdc9651359f81d036b63625686 inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#ae4501abdc9651359f81d036b63625686">__destruct</a> ()</td></tr>
+<tr class="separator:ae4501abdc9651359f81d036b63625686 inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a97289aef3be43d9435ca3717ef10b8ab inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a97289aef3be43d9435ca3717ef10b8ab">is_valid</a> ()</td></tr>
+<tr class="separator:a97289aef3be43d9435ca3717ef10b8ab inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acc30486acee9e89e32701f44a1738117 inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#acc30486acee9e89e32701f44a1738117">getWidth</a> ()</td></tr>
+<tr class="separator:acc30486acee9e89e32701f44a1738117 inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af769e9abb144e57002c59aa2aa8f3468 inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#af769e9abb144e57002c59aa2aa8f3468">getHeight</a> ()</td></tr>
+<tr class="separator:af769e9abb144e57002c59aa2aa8f3468 inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a22ecb8c696de65a5a10bd185be9d90c3 inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a22ecb8c696de65a5a10bd185be9d90c3">saveImage</a> ($path)</td></tr>
+<tr class="separator:a22ecb8c696de65a5a10bd185be9d90c3 inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6c6c16dbc4f517ce799f9143ed61f0e3 inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a6c6c16dbc4f517ce799f9143ed61f0e3">getType</a> ()</td></tr>
+<tr class="separator:a6c6c16dbc4f517ce799f9143ed61f0e3 inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa2efb5b2a6af3fd67e3f1c2b9852a5ba inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#aa2efb5b2a6af3fd67e3f1c2b9852a5ba">getExt</a> ()</td></tr>
+<tr class="separator:aa2efb5b2a6af3fd67e3f1c2b9852a5ba inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af0f7ec48a31ae9b557b6e3f8bd5b4af0 inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#af0f7ec48a31ae9b557b6e3f8bd5b4af0">scaleImage</a> ($max)</td></tr>
+<tr class="separator:af0f7ec48a31ae9b557b6e3f8bd5b4af0 inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1a63c4ae17e892a115ab9cf6efb960ce inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a1a63c4ae17e892a115ab9cf6efb960ce">scaleImageUp</a> ($min)</td></tr>
+<tr class="separator:a1a63c4ae17e892a115ab9cf6efb960ce inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a56634842b071b96502716e9843ea5361 inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a56634842b071b96502716e9843ea5361">scaleImageSquare</a> ($dim)</td></tr>
+<tr class="separator:a56634842b071b96502716e9843ea5361 inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4de5bac8daea8f291a33c80788019d0d inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a4de5bac8daea8f291a33c80788019d0d">orient</a> ($filename)</td></tr>
+<tr class="separator:a4de5bac8daea8f291a33c80788019d0d inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5864fae7d8389372955a8e78cec527ac inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a5864fae7d8389372955a8e78cec527ac">save</a> ($arr)</td></tr>
+<tr class="separator:a5864fae7d8389372955a8e78cec527ac inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a642a8d0c4ad5f887c99c6af77cee287b inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a642a8d0c4ad5f887c99c6af77cee287b">store</a> ($aid, $uid, $xchan, $rid, $filename, $album, $scale, $profile=0, $allow_cid= '', $allow_gid= '', $deny_cid= '', $deny_gid= '')</td></tr>
+<tr class="separator:a642a8d0c4ad5f887c99c6af77cee287b inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="inherited"></a>
+Additional Inherited Members</h2></td></tr>
+<tr class="inherit_header pro_attribs_classphoto__driver"><td colspan="2" onclick="javascript:toggleInherit('pro_attribs_classphoto__driver')"><img src="closed.png" alt="-"/>&#160;Protected Attributes inherited from <a class="el" href="classphoto__driver.html">photo_driver</a></td></tr>
+<tr class="memitem:a7c78b5a01afe61ba3895ac07f4869b55 inherit pro_attribs_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a7c78b5a01afe61ba3895ac07f4869b55">$image</a></td></tr>
+<tr class="separator:a7c78b5a01afe61ba3895ac07f4869b55 inherit pro_attribs_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3e4215890f4a4894bf3799a7d2e0c0b1 inherit pro_attribs_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a3e4215890f4a4894bf3799a7d2e0c0b1">$width</a></td></tr>
+<tr class="separator:a3e4215890f4a4894bf3799a7d2e0c0b1 inherit pro_attribs_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aea560be5dfba09117d36c12bacbf3b80 inherit pro_attribs_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#aea560be5dfba09117d36c12bacbf3b80">$height</a></td></tr>
+<tr class="separator:aea560be5dfba09117d36c12bacbf3b80 inherit pro_attribs_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a01d28d43b404d6f6de219dc9c5069dc9 inherit pro_attribs_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a01d28d43b404d6f6de219dc9c5069dc9">$valid</a></td></tr>
+<tr class="separator:a01d28d43b404d6f6de219dc9c5069dc9 inherit pro_attribs_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4920ed7cbb1ac735ac84153067537f03 inherit pro_attribs_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a4920ed7cbb1ac735ac84153067537f03">$type</a></td></tr>
+<tr class="separator:a4920ed7cbb1ac735ac84153067537f03 inherit pro_attribs_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a00cb166c00b7502dbc456c94330e5b03 inherit pro_attribs_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a00cb166c00b7502dbc456c94330e5b03">$types</a></td></tr>
+<tr class="separator:a00cb166c00b7502dbc456c94330e5b03 inherit pro_attribs_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Member Function Documentation</h2>
+<a class="anchor" id="a2f33a03a89497a2b2768e29736d4a8a4"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_imagick::cropImage </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$max</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$x</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$y</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$w</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$h</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>We need to remove the canvas, or the image is not resized to the crop: <a href="http://php.net/manual/en/imagick.cropimage.php#97232">http://php.net/manual/en/imagick.cropimage.php#97232</a></p>
+
+</div>
+</div>
+<a class="anchor" id="afd49d64751ee3a298eac0c0ce0ba0207"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_imagick::destroy </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a3047c68bb4de7f66c2893fe451db2b66"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_imagick::doScaleImage </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$dest_width</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$dest_height</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>If it is not animated, there will be only one iteration here, so don't bother checking</p>
+
+<p>Referenced by <a class="el" href="classphoto__imagick.html#a2f33a03a89497a2b2768e29736d4a8a4">cropImage()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aff6bcdbab18593a3fc5a480db8509393"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_imagick::flip </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$horiz</em> = <code>true</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$vert</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aef020d929f66f4370e33fc158c8eebd4"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_imagick::get_FormatsMap </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classphoto__imagick.html#a2c9168f110ccd6c264095d766615dfa8">load()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ad07288e0eb3922cb08cc9d33a163decc"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_imagick::getImage </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a70adbef31128c0ac8cbc5dcf34cdb019"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_imagick::imageString </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a2c9168f110ccd6c264095d766615dfa8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_imagick::load </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$data</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Setup the image to the format it will be saved to</p>
+<p>setup the compression here, so we'll do it only once</p>
+<p>From <a href="http://www.imagemagick.org/script/command-line-options.php#quality:">http://www.imagemagick.org/script/command-line-options.php#quality:</a></p>
+<p>'For the MNG and PNG image formats, the quality value sets the zlib compression level (quality / 10) and filter-type (quality % 10). The default PNG "quality" is 75, which means compression level 7 with adaptive PNG filtering, unless the image has a color map, in which case it means compression level 7 with no PNG filtering'</p>
+
+</div>
+</div>
+<a class="anchor" id="a9df5738a4a18e76dd304c440e96f045f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_imagick::rotate </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$degrees</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="af92901d252c1e6ab5b54eebedbed23bb"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_imagick::setDimensions </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classphoto__imagick.html#a3047c68bb4de7f66c2893fe451db2b66">doScaleImage()</a>, <a class="el" href="classphoto__imagick.html#aff6bcdbab18593a3fc5a480db8509393">flip()</a>, <a class="el" href="classphoto__imagick.html#a2c9168f110ccd6c264095d766615dfa8">load()</a>, and <a class="el" href="classphoto__imagick.html#a9df5738a4a18e76dd304c440e96f045f">rotate()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a27596faca6108d9d563674d1b654a0b7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_imagick::supportedTypes </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>include/photo/<a class="el" href="photo__imagick_8php.html">photo_imagick.php</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classphoto__imagick.js b/doc/html/classphoto__imagick.js
new file mode 100644
index 000000000..b43d1e9e5
--- /dev/null
+++ b/doc/html/classphoto__imagick.js
@@ -0,0 +1,14 @@
+var classphoto__imagick =
+[
+ [ "cropImage", "classphoto__imagick.html#a2f33a03a89497a2b2768e29736d4a8a4", null ],
+ [ "destroy", "classphoto__imagick.html#afd49d64751ee3a298eac0c0ce0ba0207", null ],
+ [ "doScaleImage", "classphoto__imagick.html#a3047c68bb4de7f66c2893fe451db2b66", null ],
+ [ "flip", "classphoto__imagick.html#aff6bcdbab18593a3fc5a480db8509393", null ],
+ [ "get_FormatsMap", "classphoto__imagick.html#aef020d929f66f4370e33fc158c8eebd4", null ],
+ [ "getImage", "classphoto__imagick.html#ad07288e0eb3922cb08cc9d33a163decc", null ],
+ [ "imageString", "classphoto__imagick.html#a70adbef31128c0ac8cbc5dcf34cdb019", null ],
+ [ "load", "classphoto__imagick.html#a2c9168f110ccd6c264095d766615dfa8", null ],
+ [ "rotate", "classphoto__imagick.html#a9df5738a4a18e76dd304c440e96f045f", null ],
+ [ "setDimensions", "classphoto__imagick.html#af92901d252c1e6ab5b54eebedbed23bb", null ],
+ [ "supportedTypes", "classphoto__imagick.html#a27596faca6108d9d563674d1b654a0b7", null ]
+]; \ No newline at end of file
diff --git a/doc/html/classphoto__imagick.png b/doc/html/classphoto__imagick.png
new file mode 100644
index 000000000..c39b45b2e
--- /dev/null
+++ b/doc/html/classphoto__imagick.png
Binary files differ
diff --git a/doc/html/cli__startup_8php.html b/doc/html/cli__startup_8php.html
new file mode 100644
index 000000000..44e103312
--- /dev/null
+++ b/doc/html/cli__startup_8php.html
@@ -0,0 +1,138 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/cli_startup.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('cli__startup_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">cli_startup.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:adfdde63686e33ccd4851fa5edc4fc70b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="cli__startup_8php.html#adfdde63686e33ccd4851fa5edc4fc70b">cli_startup</a> ()</td></tr>
+<tr class="separator:adfdde63686e33ccd4851fa5edc4fc70b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="adfdde63686e33ccd4851fa5edc4fc70b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">cli_startup </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="cli__suggest_8php.html#a8f3a60fc96f4bec7d3837c4efc7725f2">cli_suggest_run()</a>, <a class="el" href="cronhooks_8php.html#a4c4c1bbec4ecc9a0efa00dd6afd2c0ca">cronhooks_run()</a>, <a class="el" href="deliver_8php.html#a397afcb9afecf0c1816b0951189dd346">deliver_run()</a>, <a class="el" href="include_2directory_8php.html#aa75d3b0697ca1456aaabdb37a74aa0f0">directory_run()</a>, <a class="el" href="expire_8php.html#a444e45c9b67727b27db4c779fd51a298">expire_run()</a>, <a class="el" href="gprobe_8php.html#adf72cb0a70b5b9d99fdec1cc60e18ed1">gprobe_run()</a>, <a class="el" href="notifier_8php.html#a568c502f626cff95e344c0748938b85d">notifier_run()</a>, <a class="el" href="onedirsync_8php.html#a411aedd47c57476099647961e6a86691">onedirsync_run()</a>, <a class="el" href="onepoll_8php.html#a72753b2fdec79b37c7f432035c91fb6d">onepoll_run()</a>, <a class="el" href="poller_8php.html#a5f12df3a4738124b6c039971e87e76da">poller_run()</a>, and <a class="el" href="queue_8php.html#af8c93de86d866c3200174c8450a0f341">queue_run()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/cli__startup_8php.js b/doc/html/cli__startup_8php.js
new file mode 100644
index 000000000..3f941b222
--- /dev/null
+++ b/doc/html/cli__startup_8php.js
@@ -0,0 +1,4 @@
+var cli__startup_8php =
+[
+ [ "cli_startup", "cli__startup_8php.html#adfdde63686e33ccd4851fa5edc4fc70b", null ]
+]; \ No newline at end of file
diff --git a/doc/html/cli__suggest_8php.html b/doc/html/cli__suggest_8php.html
new file mode 100644
index 000000000..7a57f4baa
--- /dev/null
+++ b/doc/html/cli__suggest_8php.html
@@ -0,0 +1,147 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/cli_suggest.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('cli__suggest_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">cli_suggest.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a8f3a60fc96f4bec7d3837c4efc7725f2"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="cli__suggest_8php.html#a8f3a60fc96f4bec7d3837c4efc7725f2">cli_suggest_run</a> ($<a class="el" href="boot_8php.html#a768f00b7d66be0daf7ef4eea2e862006">argv</a>, $<a class="el" href="boot_8php.html#abc0a90a1a77f5b668aa7e4b57d1776a7">argc</a>)</td></tr>
+<tr class="separator:a8f3a60fc96f4bec7d3837c4efc7725f2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a8f3a60fc96f4bec7d3837c4efc7725f2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">cli_suggest_run </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$argv</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$argc</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/cli__suggest_8php.js b/doc/html/cli__suggest_8php.js
new file mode 100644
index 000000000..3389a1ddb
--- /dev/null
+++ b/doc/html/cli__suggest_8php.js
@@ -0,0 +1,4 @@
+var cli__suggest_8php =
+[
+ [ "cli_suggest_run", "cli__suggest_8php.html#a8f3a60fc96f4bec7d3837c4efc7725f2", null ]
+]; \ No newline at end of file
diff --git a/doc/html/closed.png b/doc/html/closed.png
new file mode 100644
index 000000000..98cc2c909
--- /dev/null
+++ b/doc/html/closed.png
Binary files differ
diff --git a/doc/html/cloud_8php.html b/doc/html/cloud_8php.html
new file mode 100644
index 000000000..8fd8cf18f
--- /dev/null
+++ b/doc/html/cloud_8php.html
@@ -0,0 +1,138 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/cloud.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('cloud_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">cloud.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a1b79a6fe0454bc76673ad9aef55bf02d"><td class="memItemLeft" align="right" valign="top"><a class="el" href="redbasic_2php_2style_8php.html#a883f9f14e205f7aa7de02c14df67b40a">if</a>(<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>($_SERVER,'REDIRECT_REMOTE_USER')) <br class="typebreak"/>
+<a class="el" href="redbasic_2php_2style_8php.html#a883f9f14e205f7aa7de02c14df67b40a">if</a>(<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>($_SERVER,'HTTP_AUTHORIZATION'))&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="cloud_8php.html#a1b79a6fe0454bc76673ad9aef55bf02d">cloud_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a1b79a6fe0454bc76673ad9aef55bf02d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a1b79a6fe0454bc76673ad9aef55bf02d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="redbasic_2php_2style_8php.html#a883f9f14e205f7aa7de02c14df67b40a">if</a> (<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>($_SERVER,'REDIRECT_REMOTE_USER')) <a class="el" href="redbasic_2php_2style_8php.html#a883f9f14e205f7aa7de02c14df67b40a">if</a> (<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>($_SERVER,'HTTP_AUTHORIZATION')) cloud_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/cloud_8php.js b/doc/html/cloud_8php.js
new file mode 100644
index 000000000..6b3de1272
--- /dev/null
+++ b/doc/html/cloud_8php.js
@@ -0,0 +1,4 @@
+var cloud_8php =
+[
+ [ "cloud_init", "cloud_8php.html#a1b79a6fe0454bc76673ad9aef55bf02d", null ]
+]; \ No newline at end of file
diff --git a/doc/html/comanche_8php.html b/doc/html/comanche_8php.html
new file mode 100644
index 000000000..57572239d
--- /dev/null
+++ b/doc/html/comanche_8php.html
@@ -0,0 +1,325 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/comanche.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('comanche_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">comanche.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:af7150df735e5ff9d467994cd6f769c6e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="comanche_8php.html#af7150df735e5ff9d467994cd6f769c6e">pdl_selector</a> ($uid, $current=&quot;&quot;)</td></tr>
+<tr class="separator:af7150df735e5ff9d467994cd6f769c6e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1a208fdb40dd83d6298caec4290ee922"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="comanche_8php.html#a1a208fdb40dd83d6298caec4290ee922">comanche_parser</a> (&amp;$a, $s)</td></tr>
+<tr class="separator:a1a208fdb40dd83d6298caec4290ee922"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1fe339e1454803aa502ac89379c17f5b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="comanche_8php.html#a1fe339e1454803aa502ac89379c17f5b">comanche_menu</a> ($name)</td></tr>
+<tr class="separator:a1fe339e1454803aa502ac89379c17f5b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a028f004d5b8c23d6367816d899e17cfe"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="comanche_8php.html#a028f004d5b8c23d6367816d899e17cfe">comanche_replace_region</a> ($match)</td></tr>
+<tr class="separator:a028f004d5b8c23d6367816d899e17cfe"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5a7ab801717d38e91ac910b933973887"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="comanche_8php.html#a5a7ab801717d38e91ac910b933973887">comanche_block</a> ($name)</td></tr>
+<tr class="separator:a5a7ab801717d38e91ac910b933973887"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae9fe1ce574db3dd0931eada80234f82a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="comanche_8php.html#ae9fe1ce574db3dd0931eada80234f82a">comanche_webpage</a> (&amp;$a, $s)</td></tr>
+<tr class="separator:ae9fe1ce574db3dd0931eada80234f82a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6b0191c1a63db1696a2eb139d90d9e7f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="comanche_8php.html#a6b0191c1a63db1696a2eb139d90d9e7f">comanche_widget</a> ($name, $text)</td></tr>
+<tr class="separator:a6b0191c1a63db1696a2eb139d90d9e7f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5718daeda40bf835345fe061e8808cdf"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="comanche_8php.html#a5718daeda40bf835345fe061e8808cdf">comanche_region</a> (&amp;$a, $s)</td></tr>
+<tr class="separator:a5718daeda40bf835345fe061e8808cdf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a5a7ab801717d38e91ac910b933973887"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">comanche_block </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$name</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="comanche_8php.html#a5718daeda40bf835345fe061e8808cdf">comanche_region()</a>, and <a class="el" href="identity_8php.html#a432259b2cf5b6f59be53e71db9f2c7dc">profile_sidebar()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a1fe339e1454803aa502ac89379c17f5b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">comanche_menu </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$name</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="comanche_8php.html#a5718daeda40bf835345fe061e8808cdf">comanche_region()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a1a208fdb40dd83d6298caec4290ee922"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">comanche_parser </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="boot_8php.html#acc4e0c910af066148b810e5fde55fff1">construct_page()</a>, and <a class="el" href="page_8php.html#a91a5f649f68406149108bded1dc90b22">page_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a5718daeda40bf835345fe061e8808cdf"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">comanche_region </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="comanche_8php.html#a1a208fdb40dd83d6298caec4290ee922">comanche_parser()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a028f004d5b8c23d6367816d899e17cfe"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">comanche_replace_region </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$match</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ae9fe1ce574db3dd0931eada80234f82a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">comanche_webpage </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="comanche_8php.html#a1a208fdb40dd83d6298caec4290ee922">comanche_parser()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a6b0191c1a63db1696a2eb139d90d9e7f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">comanche_widget </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$name</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$text</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="comanche_8php.html#a5718daeda40bf835345fe061e8808cdf">comanche_region()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="af7150df735e5ff9d467994cd6f769c6e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">pdl_selector </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$current</em> = <code>&quot;&quot;</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/comanche_8php.js b/doc/html/comanche_8php.js
new file mode 100644
index 000000000..f3c4d5ff3
--- /dev/null
+++ b/doc/html/comanche_8php.js
@@ -0,0 +1,11 @@
+var comanche_8php =
+[
+ [ "comanche_block", "comanche_8php.html#a5a7ab801717d38e91ac910b933973887", null ],
+ [ "comanche_menu", "comanche_8php.html#a1fe339e1454803aa502ac89379c17f5b", null ],
+ [ "comanche_parser", "comanche_8php.html#a1a208fdb40dd83d6298caec4290ee922", null ],
+ [ "comanche_region", "comanche_8php.html#a5718daeda40bf835345fe061e8808cdf", null ],
+ [ "comanche_replace_region", "comanche_8php.html#a028f004d5b8c23d6367816d899e17cfe", null ],
+ [ "comanche_webpage", "comanche_8php.html#ae9fe1ce574db3dd0931eada80234f82a", null ],
+ [ "comanche_widget", "comanche_8php.html#a6b0191c1a63db1696a2eb139d90d9e7f", null ],
+ [ "pdl_selector", "comanche_8php.html#af7150df735e5ff9d467994cd6f769c6e", null ]
+]; \ No newline at end of file
diff --git a/doc/html/common_8php.html b/doc/html/common_8php.html
new file mode 100644
index 000000000..e70c1adb9
--- /dev/null
+++ b/doc/html/common_8php.html
@@ -0,0 +1,155 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/common.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('common_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">common.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:aca62f113655809f41f49042ce9b123c2"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="common_8php.html#aca62f113655809f41f49042ce9b123c2">common_init</a> (&amp;$a)</td></tr>
+<tr class="separator:aca62f113655809f41f49042ce9b123c2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab63408f39abef7a6915186e8dabc5a96"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="common_8php.html#ab63408f39abef7a6915186e8dabc5a96">common_content</a> (&amp;$a)</td></tr>
+<tr class="separator:ab63408f39abef7a6915186e8dabc5a96"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="ab63408f39abef7a6915186e8dabc5a96"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">common_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aca62f113655809f41f49042ce9b123c2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">common_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/common_8php.js b/doc/html/common_8php.js
new file mode 100644
index 000000000..85ca9299c
--- /dev/null
+++ b/doc/html/common_8php.js
@@ -0,0 +1,5 @@
+var common_8php =
+[
+ [ "common_content", "common_8php.html#ab63408f39abef7a6915186e8dabc5a96", null ],
+ [ "common_init", "common_8php.html#aca62f113655809f41f49042ce9b123c2", null ]
+]; \ No newline at end of file
diff --git a/doc/html/community_8php.html b/doc/html/community_8php.html
new file mode 100644
index 000000000..71e1deaa5
--- /dev/null
+++ b/doc/html/community_8php.html
@@ -0,0 +1,167 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/community.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('community_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">community.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a56c94ec978a38633c5628fa6f8e386d9"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="community_8php.html#a56c94ec978a38633c5628fa6f8e386d9">community_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a56c94ec978a38633c5628fa6f8e386d9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1197aafd6a6b540dbb4a0c04ade3a25a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="community_8php.html#a1197aafd6a6b540dbb4a0c04ade3a25a">community_content</a> (&amp;$a, $update=0)</td></tr>
+<tr class="separator:a1197aafd6a6b540dbb4a0c04ade3a25a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a1197aafd6a6b540dbb4a0c04ade3a25a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">community_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$update</em> = <code>0</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="update__community_8php.html#abdcc5c4ecebbe0b5fcba2755c69cb3b1">update_community_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a56c94ec978a38633c5628fa6f8e386d9"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">community_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/community_8php.js b/doc/html/community_8php.js
new file mode 100644
index 000000000..06ba1c3b4
--- /dev/null
+++ b/doc/html/community_8php.js
@@ -0,0 +1,5 @@
+var community_8php =
+[
+ [ "community_content", "community_8php.html#a1197aafd6a6b540dbb4a0c04ade3a25a", null ],
+ [ "community_init", "community_8php.html#a56c94ec978a38633c5628fa6f8e386d9", null ]
+]; \ No newline at end of file
diff --git a/doc/html/config_8md.html b/doc/html/config_8md.html
new file mode 100644
index 000000000..03a435c31
--- /dev/null
+++ b/doc/html/config_8md.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: util/config.md File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('config_8md.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">util/config.md File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/connect_8php.html b/doc/html/connect_8php.html
new file mode 100644
index 000000000..feb2c7cb2
--- /dev/null
+++ b/doc/html/connect_8php.html
@@ -0,0 +1,173 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/connect.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('connect_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">connect.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ad46a38f32fd7a3d324b1fa26373efa36"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="connect_8php.html#ad46a38f32fd7a3d324b1fa26373efa36">connect_init</a> (&amp;$a)</td></tr>
+<tr class="separator:ad46a38f32fd7a3d324b1fa26373efa36"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a417ec27afe33f21a929667a665e32ee2"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="connect_8php.html#a417ec27afe33f21a929667a665e32ee2">connect_post</a> (&amp;$a)</td></tr>
+<tr class="separator:a417ec27afe33f21a929667a665e32ee2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a489f0a66c660de6ec4d6917b27674f07"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="connect_8php.html#a489f0a66c660de6ec4d6917b27674f07">connect_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a489f0a66c660de6ec4d6917b27674f07"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a489f0a66c660de6ec4d6917b27674f07"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">connect_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ad46a38f32fd7a3d324b1fa26373efa36"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">connect_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a417ec27afe33f21a929667a665e32ee2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">connect_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/connect_8php.js b/doc/html/connect_8php.js
new file mode 100644
index 000000000..208ea22b3
--- /dev/null
+++ b/doc/html/connect_8php.js
@@ -0,0 +1,6 @@
+var connect_8php =
+[
+ [ "connect_content", "connect_8php.html#a489f0a66c660de6ec4d6917b27674f07", null ],
+ [ "connect_init", "connect_8php.html#ad46a38f32fd7a3d324b1fa26373efa36", null ],
+ [ "connect_post", "connect_8php.html#a417ec27afe33f21a929667a665e32ee2", null ]
+]; \ No newline at end of file
diff --git a/doc/html/connections_8php.html b/doc/html/connections_8php.html
new file mode 100644
index 000000000..cd24a6a61
--- /dev/null
+++ b/doc/html/connections_8php.html
@@ -0,0 +1,193 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/connections.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('connections_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">connections.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a1f23623f802af7bd35e95b0e94e5d558"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="connections_8php.html#a1f23623f802af7bd35e95b0e94e5d558">connections_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a1f23623f802af7bd35e95b0e94e5d558"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1224058db8e3fb56463eb312f98e561d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="connections_8php.html#a1224058db8e3fb56463eb312f98e561d">connections_post</a> (&amp;$a)</td></tr>
+<tr class="separator:a1224058db8e3fb56463eb312f98e561d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a15af118efee9c948b6f8294e54a73bb2"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="connections_8php.html#a15af118efee9c948b6f8294e54a73bb2">connections_clone</a> (&amp;$a)</td></tr>
+<tr class="separator:a15af118efee9c948b6f8294e54a73bb2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aec2e457420fce3e3bf6a9f48e36df25c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="connections_8php.html#aec2e457420fce3e3bf6a9f48e36df25c">connections_content</a> (&amp;$a)</td></tr>
+<tr class="separator:aec2e457420fce3e3bf6a9f48e36df25c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a15af118efee9c948b6f8294e54a73bb2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">connections_clone </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="connections_8php.html#a1224058db8e3fb56463eb312f98e561d">connections_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aec2e457420fce3e3bf6a9f48e36df25c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">connections_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a1f23623f802af7bd35e95b0e94e5d558"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">connections_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a1224058db8e3fb56463eb312f98e561d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">connections_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/connections_8php.js b/doc/html/connections_8php.js
new file mode 100644
index 000000000..962b1f866
--- /dev/null
+++ b/doc/html/connections_8php.js
@@ -0,0 +1,7 @@
+var connections_8php =
+[
+ [ "connections_clone", "connections_8php.html#a15af118efee9c948b6f8294e54a73bb2", null ],
+ [ "connections_content", "connections_8php.html#aec2e457420fce3e3bf6a9f48e36df25c", null ],
+ [ "connections_init", "connections_8php.html#a1f23623f802af7bd35e95b0e94e5d558", null ],
+ [ "connections_post", "connections_8php.html#a1224058db8e3fb56463eb312f98e561d", null ]
+]; \ No newline at end of file
diff --git a/doc/html/connedit_8php.html b/doc/html/connedit_8php.html
new file mode 100644
index 000000000..53c6eeda6
--- /dev/null
+++ b/doc/html/connedit_8php.html
@@ -0,0 +1,193 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/connedit.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('connedit_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">connedit.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a4da871e075597a09a8b374b9171dd92e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="connedit_8php.html#a4da871e075597a09a8b374b9171dd92e">connedit_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a4da871e075597a09a8b374b9171dd92e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a234c48426b652bf4d37053f2af329ac5"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="connedit_8php.html#a234c48426b652bf4d37053f2af329ac5">connedit_post</a> (&amp;$a)</td></tr>
+<tr class="separator:a234c48426b652bf4d37053f2af329ac5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a707ea7e63cf9674025b1d6b081ae74f5"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="connedit_8php.html#a707ea7e63cf9674025b1d6b081ae74f5">connedit_clone</a> (&amp;$a)</td></tr>
+<tr class="separator:a707ea7e63cf9674025b1d6b081ae74f5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a795acb3d9d841f55c255d7611681ab67"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="connedit_8php.html#a795acb3d9d841f55c255d7611681ab67">connedit_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a795acb3d9d841f55c255d7611681ab67"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a707ea7e63cf9674025b1d6b081ae74f5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">connedit_clone </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="connedit_8php.html#a795acb3d9d841f55c255d7611681ab67">connedit_content()</a>, and <a class="el" href="connedit_8php.html#a234c48426b652bf4d37053f2af329ac5">connedit_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a795acb3d9d841f55c255d7611681ab67"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">connedit_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a4da871e075597a09a8b374b9171dd92e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">connedit_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a234c48426b652bf4d37053f2af329ac5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">connedit_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/connedit_8php.js b/doc/html/connedit_8php.js
new file mode 100644
index 000000000..0492ead35
--- /dev/null
+++ b/doc/html/connedit_8php.js
@@ -0,0 +1,7 @@
+var connedit_8php =
+[
+ [ "connedit_clone", "connedit_8php.html#a707ea7e63cf9674025b1d6b081ae74f5", null ],
+ [ "connedit_content", "connedit_8php.html#a795acb3d9d841f55c255d7611681ab67", null ],
+ [ "connedit_init", "connedit_8php.html#a4da871e075597a09a8b374b9171dd92e", null ],
+ [ "connedit_post", "connedit_8php.html#a234c48426b652bf4d37053f2af329ac5", null ]
+]; \ No newline at end of file
diff --git a/doc/html/contact__selectors_8php.html b/doc/html/contact__selectors_8php.html
new file mode 100644
index 000000000..ca9945e46
--- /dev/null
+++ b/doc/html/contact__selectors_8php.html
@@ -0,0 +1,207 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/contact_selectors.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('contact__selectors_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">contact_selectors.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a2c743d2eb526eb758d943a1490162d75"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="contact__selectors_8php.html#a2c743d2eb526eb758d943a1490162d75">contact_profile_assign</a> ($current)</td></tr>
+<tr class="separator:a2c743d2eb526eb758d943a1490162d75"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae499960d6467bd30c78607b1018baf53"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="contact__selectors_8php.html#ae499960d6467bd30c78607b1018baf53">contact_reputation</a> ($current)</td></tr>
+<tr class="separator:ae499960d6467bd30c78607b1018baf53"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9839e8fdaac7ffb37bf1420493f5c28f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="contact__selectors_8php.html#a9839e8fdaac7ffb37bf1420493f5c28f">contact_poll_interval</a> ($current, $disabled=false)</td></tr>
+<tr class="separator:a9839e8fdaac7ffb37bf1420493f5c28f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad472e4716426dd1a9dd77b62962454be"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="contact__selectors_8php.html#ad472e4716426dd1a9dd77b62962454be">network_to_name</a> ($s)</td></tr>
+<tr class="separator:ad472e4716426dd1a9dd77b62962454be"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a9839e8fdaac7ffb37bf1420493f5c28f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">contact_poll_interval </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$current</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$disabled</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="connedit_8php.html#a795acb3d9d841f55c255d7611681ab67">connedit_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a2c743d2eb526eb758d943a1490162d75"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">contact_profile_assign </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$current</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="connedit_8php.html#a795acb3d9d841f55c255d7611681ab67">connedit_content()</a>, and <a class="el" href="thing_8php.html#a24a35f1e64029a67fdbea94a776ae04b">thing_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ae499960d6467bd30c78607b1018baf53"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">contact_reputation </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$current</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ad472e4716426dd1a9dd77b62962454be"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">network_to_name </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="connections_8php.html#aec2e457420fce3e3bf6a9f48e36df25c">connections_content()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/contact__selectors_8php.js b/doc/html/contact__selectors_8php.js
new file mode 100644
index 000000000..dcf8466e2
--- /dev/null
+++ b/doc/html/contact__selectors_8php.js
@@ -0,0 +1,7 @@
+var contact__selectors_8php =
+[
+ [ "contact_poll_interval", "contact__selectors_8php.html#a9839e8fdaac7ffb37bf1420493f5c28f", null ],
+ [ "contact_profile_assign", "contact__selectors_8php.html#a2c743d2eb526eb758d943a1490162d75", null ],
+ [ "contact_reputation", "contact__selectors_8php.html#ae499960d6467bd30c78607b1018baf53", null ],
+ [ "network_to_name", "contact__selectors_8php.html#ad472e4716426dd1a9dd77b62962454be", null ]
+]; \ No newline at end of file
diff --git a/doc/html/contact__widgets_8php.html b/doc/html/contact__widgets_8php.html
new file mode 100644
index 000000000..a9febe165
--- /dev/null
+++ b/doc/html/contact__widgets_8php.html
@@ -0,0 +1,216 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/contact_widgets.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('contact__widgets_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">contact_widgets.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a57e73ebcfd62bb5d8c7a7b9e663726d6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="contact__widgets_8php.html#a57e73ebcfd62bb5d8c7a7b9e663726d6">findpeople_widget</a> ()</td></tr>
+<tr class="separator:a57e73ebcfd62bb5d8c7a7b9e663726d6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1eda66319d170f60a8d07c7ece95533b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="contact__widgets_8php.html#a1eda66319d170f60a8d07c7ece95533b">fileas_widget</a> ($baseurl, $selected= '')</td></tr>
+<tr class="separator:a1eda66319d170f60a8d07c7ece95533b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a165eb021e61c4dcab2a552f28628d353"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="contact__widgets_8php.html#a165eb021e61c4dcab2a552f28628d353">categories_widget</a> ($baseurl, $selected= '')</td></tr>
+<tr class="separator:a165eb021e61c4dcab2a552f28628d353"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a552f8544528cec0c995cea7287ea9d65"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="contact__widgets_8php.html#a552f8544528cec0c995cea7287ea9d65">common_friends_visitor_widget</a> ($profile_uid)</td></tr>
+<tr class="separator:a552f8544528cec0c995cea7287ea9d65"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a165eb021e61c4dcab2a552f28628d353"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">categories_widget </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$baseurl</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$selected</em> = <code>''</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="widgets_8php.html#af37fdad3b2e861d860a4a8c4d8a76c0b">widget_categories()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a552f8544528cec0c995cea7287ea9d65"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">common_friends_visitor_widget </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$profile_uid</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a1eda66319d170f60a8d07c7ece95533b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">fileas_widget </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$baseurl</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$selected</em> = <code>''</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a57e73ebcfd62bb5d8c7a7b9e663726d6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">findpeople_widget </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="widgets_8php.html#ade630b19fb4c622b7b2f6f8ef89eefa2">widget_findpeople()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/contact__widgets_8php.js b/doc/html/contact__widgets_8php.js
new file mode 100644
index 000000000..2963a1227
--- /dev/null
+++ b/doc/html/contact__widgets_8php.js
@@ -0,0 +1,7 @@
+var contact__widgets_8php =
+[
+ [ "categories_widget", "contact__widgets_8php.html#a165eb021e61c4dcab2a552f28628d353", null ],
+ [ "common_friends_visitor_widget", "contact__widgets_8php.html#a552f8544528cec0c995cea7287ea9d65", null ],
+ [ "fileas_widget", "contact__widgets_8php.html#a1eda66319d170f60a8d07c7ece95533b", null ],
+ [ "findpeople_widget", "contact__widgets_8php.html#a57e73ebcfd62bb5d8c7a7b9e663726d6", null ]
+]; \ No newline at end of file
diff --git a/doc/html/contactgroup_8php.html b/doc/html/contactgroup_8php.html
new file mode 100644
index 000000000..140b4ad12
--- /dev/null
+++ b/doc/html/contactgroup_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/contactgroup.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('contactgroup_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">contactgroup.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a18c7391b1b25debaf98c9dba639caab3"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="contactgroup_8php.html#a18c7391b1b25debaf98c9dba639caab3">contactgroup_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a18c7391b1b25debaf98c9dba639caab3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a18c7391b1b25debaf98c9dba639caab3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">contactgroup_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/contactgroup_8php.js b/doc/html/contactgroup_8php.js
new file mode 100644
index 000000000..bb51dd652
--- /dev/null
+++ b/doc/html/contactgroup_8php.js
@@ -0,0 +1,4 @@
+var contactgroup_8php =
+[
+ [ "contactgroup_content", "contactgroup_8php.html#a18c7391b1b25debaf98c9dba639caab3", null ]
+]; \ No newline at end of file
diff --git a/doc/html/conversation_8php.html b/doc/html/conversation_8php.html
new file mode 100644
index 000000000..c2b005065
--- /dev/null
+++ b/doc/html/conversation_8php.html
@@ -0,0 +1,779 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/conversation.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('conversation_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">conversation.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a0ee05f15255fb1cc3d89f30bc378a654"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="conversation_8php.html#a0ee05f15255fb1cc3d89f30bc378a654">item_extract_images</a> ($body)</td></tr>
+<tr class="separator:a0ee05f15255fb1cc3d89f30bc378a654"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:adda79b75bf1ccf6ce9503aa310953533"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="conversation_8php.html#adda79b75bf1ccf6ce9503aa310953533">item_redir_and_replace_images</a> ($body, $images, $cid)</td></tr>
+<tr class="separator:adda79b75bf1ccf6ce9503aa310953533"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9bd7f9fb6678736c581bcba3b17f471c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="conversation_8php.html#a9bd7f9fb6678736c581bcba3b17f471c">localize_item</a> (&amp;$item)</td></tr>
+<tr class="separator:a9bd7f9fb6678736c581bcba3b17f471c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab2383dff4f823e580399ff469d90ab19"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="conversation_8php.html#ab2383dff4f823e580399ff469d90ab19">count_descendants</a> ($item)</td></tr>
+<tr class="separator:ab2383dff4f823e580399ff469d90ab19"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7eeaaf44506815576f3bd80053ef52c3"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="conversation_8php.html#a7eeaaf44506815576f3bd80053ef52c3">visible_activity</a> ($item)</td></tr>
+<tr class="separator:a7eeaaf44506815576f3bd80053ef52c3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:affea1afb3f32ca41e966c8ddb4204d81"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation</a> (&amp;$a, $items, $mode, $update, $page_mode= 'traditional', $prepared_item= '')</td></tr>
+<tr class="separator:affea1afb3f32ca41e966c8ddb4204d81"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad470fc7766f0db66d138fa1916c7a8b7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="conversation_8php.html#ad470fc7766f0db66d138fa1916c7a8b7">best_link_url</a> ($item)</td></tr>
+<tr class="separator:ad470fc7766f0db66d138fa1916c7a8b7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aacbb12d372d5e9c3ab0735b4aea48fb3"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="conversation_8php.html#aacbb12d372d5e9c3ab0735b4aea48fb3">item_photo_menu</a> ($item)</td></tr>
+<tr class="separator:aacbb12d372d5e9c3ab0735b4aea48fb3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afe5b2f38d8b803edb0d7ec5fa2868db0"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="conversation_8php.html#afe5b2f38d8b803edb0d7ec5fa2868db0">like_puller</a> ($a, $item, &amp;$arr, $mode)</td></tr>
+<tr class="separator:afe5b2f38d8b803edb0d7ec5fa2868db0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3d8e30cc94f9a175054c021305d3aca3"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="conversation_8php.html#a3d8e30cc94f9a175054c021305d3aca3">format_like</a> ($cnt, $arr, $type, $id)</td></tr>
+<tr class="separator:a3d8e30cc94f9a175054c021305d3aca3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2a7d541854bba755eb8ada59af7dcb1a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="conversation_8php.html#a2a7d541854bba755eb8ada59af7dcb1a">status_editor</a> ($a, $<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>, $popup=false)</td></tr>
+<tr class="separator:a2a7d541854bba755eb8ada59af7dcb1a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7f6ef0dfa554bacf620e84c18d386e67"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="conversation_8php.html#a7f6ef0dfa554bacf620e84c18d386e67">get_item_children</a> ($arr, $parent)</td></tr>
+<tr class="separator:a7f6ef0dfa554bacf620e84c18d386e67"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae996eb116d397a2c6396c312d7b98664"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="conversation_8php.html#ae996eb116d397a2c6396c312d7b98664">sort_item_children</a> ($items)</td></tr>
+<tr class="separator:ae996eb116d397a2c6396c312d7b98664"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad3e1d4b15e7d6d026ee182edd58f692b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="conversation_8php.html#ad3e1d4b15e7d6d026ee182edd58f692b">add_children_to_list</a> ($children, &amp;$arr)</td></tr>
+<tr class="separator:ad3e1d4b15e7d6d026ee182edd58f692b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abed85a41f1160598de880b84021c9cf7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="conversation_8php.html#abed85a41f1160598de880b84021c9cf7">conv_sort</a> ($arr, $order)</td></tr>
+<tr class="separator:abed85a41f1160598de880b84021c9cf7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac55e070f65f46fcc8e269f7896be4c7d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="conversation_8php.html#ac55e070f65f46fcc8e269f7896be4c7d">sort_thr_created</a> ($a, $b)</td></tr>
+<tr class="separator:ac55e070f65f46fcc8e269f7896be4c7d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9cc2a679606da9e535a06433f9f553a0"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="conversation_8php.html#a9cc2a679606da9e535a06433f9f553a0">sort_thr_created_rev</a> ($a, $b)</td></tr>
+<tr class="separator:a9cc2a679606da9e535a06433f9f553a0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9f909b8885259b79c6ac8da93afd8f11"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="conversation_8php.html#a9f909b8885259b79c6ac8da93afd8f11">sort_thr_commented</a> ($a, $b)</td></tr>
+<tr class="separator:a9f909b8885259b79c6ac8da93afd8f11"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae59703b07ce2ddf627b4172ff26058b6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="conversation_8php.html#ae59703b07ce2ddf627b4172ff26058b6">find_thread_parent_index</a> ($arr, $<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>)</td></tr>
+<tr class="separator:ae59703b07ce2ddf627b4172ff26058b6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0891aaa4492cba2b51eda12fe01957f3"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="conversation_8php.html#a0891aaa4492cba2b51eda12fe01957f3">format_location</a> ($item)</td></tr>
+<tr class="separator:a0891aaa4492cba2b51eda12fe01957f3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a40b9b5e7825bc73932a32e667f05e6f2"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="conversation_8php.html#a40b9b5e7825bc73932a32e667f05e6f2">render_location_default</a> ($item)</td></tr>
+<tr class="separator:a40b9b5e7825bc73932a32e667f05e6f2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4b0888b0f26e1c284a4341fe5fd04f0c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="conversation_8php.html#a4b0888b0f26e1c284a4341fe5fd04f0c">prepare_page</a> ($item)</td></tr>
+<tr class="separator:a4b0888b0f26e1c284a4341fe5fd04f0c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a96b34b9d64d13c543e8163e52f5ce8c4"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="conversation_8php.html#a96b34b9d64d13c543e8163e52f5ce8c4">network_tabs</a> ()</td></tr>
+<tr class="separator:a96b34b9d64d13c543e8163e52f5ce8c4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1dfcb5146e9d1eca4528bc580ad5d273"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="conversation_8php.html#a1dfcb5146e9d1eca4528bc580ad5d273">profile_tabs</a> ($a, $is_owner=False, $nickname=Null)</td></tr>
+<tr class="separator:a1dfcb5146e9d1eca4528bc580ad5d273"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="ad3e1d4b15e7d6d026ee182edd58f692b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">add_children_to_list </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$children</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$arr</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ad470fc7766f0db66d138fa1916c7a8b7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">best_link_url </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="abed85a41f1160598de880b84021c9cf7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">conv_sort </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$order</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>, <a class="el" href="display_8php.html#a37137c98d47bf3306f4c2bb9f5b60de0">display_content()</a>, <a class="el" href="items_8php.html#a756738301f2ed96be50232500677d58a">items_fetch()</a>, <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>, and <a class="el" href="items_8php.html#a004e89d86b0f29b2c4da20108ecc4091">zot_feed()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="affea1afb3f32ca41e966c8ddb4204d81"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">conversation </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$items</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$mode</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$update</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$page_mode</em> = <code>'traditional'</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$prepared_item</em> = <code>''</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>"Render" a conversation or list of items for HTML display. There are two major forms of display:</p>
+<ul>
+<li>Sequential or unthreaded ("New Item View" or search results)</li>
+<li>conversation view The $mode parameter decides between the various renderings and also figures out how to determine page owner and other contextual items that are based on unique features of the calling module. </li>
+</ul>
+
+<p>Referenced by <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>, <a class="el" href="community_8php.html#a1197aafd6a6b540dbb4a0c04ade3a25a">community_content()</a>, <a class="el" href="display_8php.html#a37137c98d47bf3306f4c2bb9f5b60de0">display_content()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>, <a class="el" href="classItem.html#aa452b5bcd8dea12119b09212c615cb41">Item\remove_parent()</a>, <a class="el" href="search_8php.html#ab2568591359edde5b483a6cd9a24b2cc">search_content()</a>, and <a class="el" href="classItem.html#aa8b1bbc4236890694635295e46d7fd72">Item\set_conversation()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ab2383dff4f823e580399ff469d90ab19"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">count_descendants </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Count the total of comments on this item and its desendants </p>
+
+</div>
+</div>
+<a class="anchor" id="ae59703b07ce2ddf627b4172ff26058b6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">find_thread_parent_index </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$x</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a3d8e30cc94f9a175054c021305d3aca3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">format_like </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$cnt</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$id</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">Item\get_template_data()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a0891aaa4492cba2b51eda12fe01957f3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">format_location </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation()</a>, and <a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">Item\get_template_data()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a7f6ef0dfa554bacf620e84c18d386e67"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_item_children </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$parent</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a0ee05f15255fb1cc3d89f30bc378a654"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">item_extract_images </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$body</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aacbb12d372d5e9c3ab0735b4aea48fb3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">item_photo_menu </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation()</a>, and <a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">Item\get_template_data()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="adda79b75bf1ccf6ce9503aa310953533"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">item_redir_and_replace_images </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$body</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$images</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$cid</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="afe5b2f38d8b803edb0d7ec5fa2868db0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">like_puller </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$arr</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$mode</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a9bd7f9fb6678736c581bcba3b17f471c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">localize_item </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$item</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Render actions localized </p>
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#a4c6fb9fb5203aa60f4b3afd4521db8ea">api_format_items()</a>, <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation()</a>, <a class="el" href="include_2notify_8php.html#a0e61728e487df50c72e6434f911a57d3">format_notification()</a>, <a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">Item\get_template_data()</a>, and <a class="el" href="enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc">notification()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a96b34b9d64d13c543e8163e52f5ce8c4"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">network_tabs </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a4b0888b0f26e1c284a4341fe5fd04f0c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">prepare_page </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="home_8php.html#aa1cf697851a646755baf537f75334c46">home_content()</a>, and <a class="el" href="page_8php.html#a91a5f649f68406149108bded1dc90b22">page_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a1dfcb5146e9d1eca4528bc580ad5d273"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">profile_tabs </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$is_owner</em> = <code>False</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$nickname</em> = <code>Null</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>, <a class="el" href="events_8php.html#a1d293fb217ae6bc9e3858c4b32e363ec">events_content()</a>, <a class="el" href="mod_2photos_8php.html#aa87382611a66ec5effdb2d78f13f5812">photos_content()</a>, and <a class="el" href="profile_8php.html#a3775cf6eef6587e5143133356a7b76c0">profile_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a40b9b5e7825bc73932a32e667f05e6f2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">render_location_default </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ae996eb116d397a2c6396c312d7b98664"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">sort_item_children </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$items</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a9f909b8885259b79c6ac8da93afd8f11"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">sort_thr_commented </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$b</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ac55e070f65f46fcc8e269f7896be4c7d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">sort_thr_created </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$b</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a9cc2a679606da9e535a06433f9f553a0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">sort_thr_created_rev </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$b</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a2a7d541854bba755eb8ada59af7dcb1a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">status_editor </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$x</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$popup</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="blocks_8php.html#a2531a8fd51db3cecb2eb20c002c66e12">blocks_content()</a>, <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>, <a class="el" href="display_8php.html#a37137c98d47bf3306f4c2bb9f5b60de0">display_content()</a>, <a class="el" href="layouts_8php.html#a6e0193759ad9eef76d3df2db24237b50">layouts_content()</a>, <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>, <a class="el" href="rpost_8php.html#a8190354d789000806d9879aea276728f">rpost_content()</a>, and <a class="el" href="webpages_8php.html#af3b7397d4abc153e3d2147740ee1a41d">webpages_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a7eeaaf44506815576f3bd80053ef52c3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">visible_activity </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classItem.html#a248f45871ecfe82a08d1d4c0769b2eb2">Item\__construct()</a>, <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation()</a>, <a class="el" href="conversation_8php.html#ab2383dff4f823e580399ff469d90ab19">count_descendants()</a>, and <a class="el" href="enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc">notification()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/conversation_8php.js b/doc/html/conversation_8php.js
new file mode 100644
index 000000000..589c73bda
--- /dev/null
+++ b/doc/html/conversation_8php.js
@@ -0,0 +1,27 @@
+var conversation_8php =
+[
+ [ "add_children_to_list", "conversation_8php.html#ad3e1d4b15e7d6d026ee182edd58f692b", null ],
+ [ "best_link_url", "conversation_8php.html#ad470fc7766f0db66d138fa1916c7a8b7", null ],
+ [ "conv_sort", "conversation_8php.html#abed85a41f1160598de880b84021c9cf7", null ],
+ [ "conversation", "conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81", null ],
+ [ "count_descendants", "conversation_8php.html#ab2383dff4f823e580399ff469d90ab19", null ],
+ [ "find_thread_parent_index", "conversation_8php.html#ae59703b07ce2ddf627b4172ff26058b6", null ],
+ [ "format_like", "conversation_8php.html#a3d8e30cc94f9a175054c021305d3aca3", null ],
+ [ "format_location", "conversation_8php.html#a0891aaa4492cba2b51eda12fe01957f3", null ],
+ [ "get_item_children", "conversation_8php.html#a7f6ef0dfa554bacf620e84c18d386e67", null ],
+ [ "item_extract_images", "conversation_8php.html#a0ee05f15255fb1cc3d89f30bc378a654", null ],
+ [ "item_photo_menu", "conversation_8php.html#aacbb12d372d5e9c3ab0735b4aea48fb3", null ],
+ [ "item_redir_and_replace_images", "conversation_8php.html#adda79b75bf1ccf6ce9503aa310953533", null ],
+ [ "like_puller", "conversation_8php.html#afe5b2f38d8b803edb0d7ec5fa2868db0", null ],
+ [ "localize_item", "conversation_8php.html#a9bd7f9fb6678736c581bcba3b17f471c", null ],
+ [ "network_tabs", "conversation_8php.html#a96b34b9d64d13c543e8163e52f5ce8c4", null ],
+ [ "prepare_page", "conversation_8php.html#a4b0888b0f26e1c284a4341fe5fd04f0c", null ],
+ [ "profile_tabs", "conversation_8php.html#a1dfcb5146e9d1eca4528bc580ad5d273", null ],
+ [ "render_location_default", "conversation_8php.html#a40b9b5e7825bc73932a32e667f05e6f2", null ],
+ [ "sort_item_children", "conversation_8php.html#ae996eb116d397a2c6396c312d7b98664", null ],
+ [ "sort_thr_commented", "conversation_8php.html#a9f909b8885259b79c6ac8da93afd8f11", null ],
+ [ "sort_thr_created", "conversation_8php.html#ac55e070f65f46fcc8e269f7896be4c7d", null ],
+ [ "sort_thr_created_rev", "conversation_8php.html#a9cc2a679606da9e535a06433f9f553a0", null ],
+ [ "status_editor", "conversation_8php.html#a2a7d541854bba755eb8ada59af7dcb1a", null ],
+ [ "visible_activity", "conversation_8php.html#a7eeaaf44506815576f3bd80053ef52c3", null ]
+]; \ No newline at end of file
diff --git a/doc/html/crepair_8php.html b/doc/html/crepair_8php.html
new file mode 100644
index 000000000..c9e347b75
--- /dev/null
+++ b/doc/html/crepair_8php.html
@@ -0,0 +1,173 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/crepair.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('crepair_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">crepair.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ab089978e50df156bbfabf9f8f5ccd198"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="crepair_8php.html#ab089978e50df156bbfabf9f8f5ccd198">crepair_init</a> (&amp;$a)</td></tr>
+<tr class="separator:ab089978e50df156bbfabf9f8f5ccd198"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acc4493e1ffd1462a605dd9b870034513"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="crepair_8php.html#acc4493e1ffd1462a605dd9b870034513">crepair_post</a> (&amp;$a)</td></tr>
+<tr class="separator:acc4493e1ffd1462a605dd9b870034513"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a29464c01838e209c8059cfcd2d195caa"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="crepair_8php.html#a29464c01838e209c8059cfcd2d195caa">crepair_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a29464c01838e209c8059cfcd2d195caa"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a29464c01838e209c8059cfcd2d195caa"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">crepair_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ab089978e50df156bbfabf9f8f5ccd198"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">crepair_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="acc4493e1ffd1462a605dd9b870034513"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">crepair_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/crepair_8php.js b/doc/html/crepair_8php.js
new file mode 100644
index 000000000..4e4181a10
--- /dev/null
+++ b/doc/html/crepair_8php.js
@@ -0,0 +1,6 @@
+var crepair_8php =
+[
+ [ "crepair_content", "crepair_8php.html#a29464c01838e209c8059cfcd2d195caa", null ],
+ [ "crepair_init", "crepair_8php.html#ab089978e50df156bbfabf9f8f5ccd198", null ],
+ [ "crepair_post", "crepair_8php.html#acc4493e1ffd1462a605dd9b870034513", null ]
+]; \ No newline at end of file
diff --git a/doc/html/cronhooks_8php.html b/doc/html/cronhooks_8php.html
new file mode 100644
index 000000000..c8941d1d1
--- /dev/null
+++ b/doc/html/cronhooks_8php.html
@@ -0,0 +1,147 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/cronhooks.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('cronhooks_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">cronhooks.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a4c4c1bbec4ecc9a0efa00dd6afd2c0ca"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="cronhooks_8php.html#a4c4c1bbec4ecc9a0efa00dd6afd2c0ca">cronhooks_run</a> ($<a class="el" href="boot_8php.html#a768f00b7d66be0daf7ef4eea2e862006">argv</a>, $<a class="el" href="boot_8php.html#abc0a90a1a77f5b668aa7e4b57d1776a7">argc</a>)</td></tr>
+<tr class="separator:a4c4c1bbec4ecc9a0efa00dd6afd2c0ca"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a4c4c1bbec4ecc9a0efa00dd6afd2c0ca"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">cronhooks_run </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$argv</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$argc</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/cronhooks_8php.js b/doc/html/cronhooks_8php.js
new file mode 100644
index 000000000..e2b6234e2
--- /dev/null
+++ b/doc/html/cronhooks_8php.js
@@ -0,0 +1,4 @@
+var cronhooks_8php =
+[
+ [ "cronhooks_run", "cronhooks_8php.html#a4c4c1bbec4ecc9a0efa00dd6afd2c0ca", null ]
+]; \ No newline at end of file
diff --git a/doc/html/crypto_8php.html b/doc/html/crypto_8php.html
new file mode 100644
index 000000000..981ec06dd
--- /dev/null
+++ b/doc/html/crypto_8php.html
@@ -0,0 +1,465 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/crypto.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('crypto_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">crypto.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a920e5f222d0020f47556033d8b2b6552"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="crypto_8php.html#a920e5f222d0020f47556033d8b2b6552">rsa_sign</a> ($data, $key, $alg= 'sha256')</td></tr>
+<tr class="separator:a920e5f222d0020f47556033d8b2b6552"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab4f21d8f6b8ece0915e7c8bb73379f96"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="crypto_8php.html#ab4f21d8f6b8ece0915e7c8bb73379f96">rsa_verify</a> ($data, $sig, $key, $alg= 'sha256')</td></tr>
+<tr class="separator:ab4f21d8f6b8ece0915e7c8bb73379f96"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad5e51fd44cff93cfaa07a37e24a5edec"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="crypto_8php.html#ad5e51fd44cff93cfaa07a37e24a5edec">pkcs5_pad</a> ($text, $blocksize)</td></tr>
+<tr class="separator:ad5e51fd44cff93cfaa07a37e24a5edec"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac95ac3b1b23b65b04a86613d4206ae85"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="crypto_8php.html#ac95ac3b1b23b65b04a86613d4206ae85">pkcs5_unpad</a> ($text)</td></tr>
+<tr class="separator:ac95ac3b1b23b65b04a86613d4206ae85"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5c61821d205f95f127114159cbffa764"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="crypto_8php.html#a5c61821d205f95f127114159cbffa764">AES256CBC_encrypt</a> ($data, $key, $iv)</td></tr>
+<tr class="separator:a5c61821d205f95f127114159cbffa764"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac852ee41392d1358c3a54d54935e0bf9"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="crypto_8php.html#ac852ee41392d1358c3a54d54935e0bf9">AES256CBC_decrypt</a> ($data, $key, $iv)</td></tr>
+<tr class="separator:ac852ee41392d1358c3a54d54935e0bf9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a32fc08d57a5694f94d8543ecbb03323c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="crypto_8php.html#a32fc08d57a5694f94d8543ecbb03323c">crypto_encapsulate</a> ($data, $pubkey, $alg='aes256cbc')</td></tr>
+<tr class="separator:a32fc08d57a5694f94d8543ecbb03323c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2148d7aac7b30c720f7ebda7e9790286"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="crypto_8php.html#a2148d7aac7b30c720f7ebda7e9790286">aes_encapsulate</a> ($data, $pubkey)</td></tr>
+<tr class="separator:a2148d7aac7b30c720f7ebda7e9790286"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0781202b0a43b82426929cc87c2fa2b5"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="crypto_8php.html#a0781202b0a43b82426929cc87c2fa2b5">crypto_unencapsulate</a> ($data, $prvkey)</td></tr>
+<tr class="separator:a0781202b0a43b82426929cc87c2fa2b5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aca7c3a574bfb6c6ef1f2403a56823914"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="crypto_8php.html#aca7c3a574bfb6c6ef1f2403a56823914">aes_unencapsulate</a> ($data, $prvkey)</td></tr>
+<tr class="separator:aca7c3a574bfb6c6ef1f2403a56823914"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aae0ab70d6a199b29555b1ac3cf250d6a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="crypto_8php.html#aae0ab70d6a199b29555b1ac3cf250d6a">new_keypair</a> ($bits)</td></tr>
+<tr class="separator:aae0ab70d6a199b29555b1ac3cf250d6a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="ac852ee41392d1358c3a54d54935e0bf9"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">AES256CBC_decrypt </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$data</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$key</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$iv</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="crypto_8php.html#aca7c3a574bfb6c6ef1f2403a56823914">aes_unencapsulate()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a5c61821d205f95f127114159cbffa764"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">AES256CBC_encrypt </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$data</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$key</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$iv</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="crypto_8php.html#a2148d7aac7b30c720f7ebda7e9790286">aes_encapsulate()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a2148d7aac7b30c720f7ebda7e9790286"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">aes_encapsulate </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$data</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$pubkey</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="crypto_8php.html#a32fc08d57a5694f94d8543ecbb03323c">crypto_encapsulate()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="items_8php.html#a410f9c743877c125ca06312373346903">post_activity_item()</a>, and <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aca7c3a574bfb6c6ef1f2403a56823914"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">aes_unencapsulate </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$data</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$prvkey</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="crypto_8php.html#a0781202b0a43b82426929cc87c2fa2b5">crypto_unencapsulate()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a32fc08d57a5694f94d8543ecbb03323c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">crypto_encapsulate </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$data</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$pubkey</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$alg</em> = <code>'aes256cbc'</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a536d0313b6ffe33b9d2490c4e25c5361">get_item_elements()</a>, <a class="el" href="items_8php.html#a94ddb1d6c8fa21dd7433677e85168037">get_mail_elements()</a>, <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">item_store()</a>, <a class="el" href="items_8php.html#acf0bf7c9d21ac84f32effb754f7ad484">item_store_update()</a>, <a class="el" href="post_8php.html#af59e6a1dc22d19d9257b01cd7ccedb75">post_post()</a>, <a class="el" href="include_2message_8php.html#a751ffd6635022b2190f56154ee745752">send_message()</a>, <a class="el" href="zot_8php.html#a3862b3161b2c8557dc1a95020179bd81">zot_build_packet()</a>, and <a class="el" href="zot_8php.html#a61cdc1ec843663c423ed2d8160ae5aea">zot_fetch()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a0781202b0a43b82426929cc87c2fa2b5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">crypto_unencapsulate </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$data</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$prvkey</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="editpost_8php.html#a34011690864d122680c802e9e748ccfb">editpost_content()</a>, <a class="el" href="editwebpage_8php.html#a375e945255fad79a71036528f7480650">editwebpage_content()</a>, <a class="el" href="items_8php.html#a82955cc578f0fa600acec84475026194">encode_item()</a>, <a class="el" href="items_8php.html#a2d840c74ed23d1b6c7daee05cf89dda7">encode_mail()</a>, <a class="el" href="mail_8php.html#acfc2cc0bf4e0b178207758384977f25a">mail_post()</a>, <a class="el" href="include_2follow_8php.html#ae387d4ae097c23d69f3247e7f08140c7">new_contact()</a>, <a class="el" href="post_8php.html#af59e6a1dc22d19d9257b01cd7ccedb75">post_post()</a>, <a class="el" href="include_2message_8php.html#a5f8de9847e203329e317ac38dc646898">private_messages_fetch_conversation()</a>, <a class="el" href="include_2message_8php.html#a254a756031e4d5e94f85e2939bdb5091">private_messages_fetch_message()</a>, <a class="el" href="include_2message_8php.html#a652973ce47a262f2d238c2fd6233d97e">private_messages_list()</a>, <a class="el" href="probe_8php.html#a1f1db3fa6038e451e737964c94bf5e99">probe_content()</a>, <a class="el" href="items_8php.html#ab1bce4261bcf75ad62753b498a144d17">tag_deliver()</a>, <a class="el" href="text_8php.html#a8264348059abd1d4d5bb521323d3b19a">unobscure()</a>, <a class="el" href="zot_8php.html#aeea071f17e306fe3d0c488551906bfab">zot_import()</a>, and <a class="el" href="zot_8php.html#a7b23bfb31d4491231e1e73bdc077240d">zot_refresh()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aae0ab70d6a199b29555b1ac3cf250d6a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">new_keypair </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$bits</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="account_8php.html#a141fe579c351c78209d425473f978eb5">create_account()</a>, <a class="el" href="identity_8php.html#a345f4c943d84de502ec6e72d2c813945">create_identity()</a>, and <a class="el" href="hostxrd_8php.html#aa37ffc8e7900bc76c4828bd25916db92">hostxrd_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ad5e51fd44cff93cfaa07a37e24a5edec"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">pkcs5_pad </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$text</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$blocksize</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="crypto_8php.html#a5c61821d205f95f127114159cbffa764">AES256CBC_encrypt()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ac95ac3b1b23b65b04a86613d4206ae85"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">pkcs5_unpad </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$text</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="crypto_8php.html#ac852ee41392d1358c3a54d54935e0bf9">AES256CBC_decrypt()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a920e5f222d0020f47556033d8b2b6552"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">rsa_sign </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$data</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$key</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$alg</em> = <code>'sha256'</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="identity_8php.html#a345f4c943d84de502ec6e72d2c813945">create_identity()</a>, <a class="el" href="boot_8php.html#aca5e42678e178c6b9034610d66666fd7">fix_system_urls()</a>, <a class="el" href="import_8php.html#af17fef0410518f7eac205d0ea416eaa2">import_post()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">item_store()</a>, <a class="el" href="items_8php.html#acf0bf7c9d21ac84f32effb754f7ad484">item_store_update()</a>, <a class="el" href="magic_8php.html#acea2cc792849ca2d71d4b689f66518bf">magic_init()</a>, <a class="el" href="items_8php.html#a410f9c743877c125ca06312373346903">post_activity_item()</a>, <a class="el" href="post_8php.html#af59e6a1dc22d19d9257b01cd7ccedb75">post_post()</a>, <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>, <a class="el" href="zot_8php.html#a3862b3161b2c8557dc1a95020179bd81">zot_build_packet()</a>, and <a class="el" href="zot_8php.html#a61cdc1ec843663c423ed2d8160ae5aea">zot_fetch()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ab4f21d8f6b8ece0915e7c8bb73379f96"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">rsa_verify </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$data</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$sig</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$key</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$alg</em> = <code>'sha256'</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a536d0313b6ffe33b9d2490c4e25c5361">get_item_elements()</a>, <a class="el" href="zot_8php.html#a2657e141d62d5f67ad3c87651b585299">import_site()</a>, <a class="el" href="zot_8php.html#a56f3f65514e4e7f0cd117d01735aebd1">import_xchan()</a>, <a class="el" href="post_8php.html#af4b48181ce773ef0cdfc972441445c34">post_init()</a>, <a class="el" href="post_8php.html#af59e6a1dc22d19d9257b01cd7ccedb75">post_post()</a>, <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>, and <a class="el" href="zot_8php.html#a5bcdfef419b16075a0eca990956223dc">zot_register_hub()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/crypto_8php.js b/doc/html/crypto_8php.js
new file mode 100644
index 000000000..8894f46c6
--- /dev/null
+++ b/doc/html/crypto_8php.js
@@ -0,0 +1,14 @@
+var crypto_8php =
+[
+ [ "AES256CBC_decrypt", "crypto_8php.html#ac852ee41392d1358c3a54d54935e0bf9", null ],
+ [ "AES256CBC_encrypt", "crypto_8php.html#a5c61821d205f95f127114159cbffa764", null ],
+ [ "aes_encapsulate", "crypto_8php.html#a2148d7aac7b30c720f7ebda7e9790286", null ],
+ [ "aes_unencapsulate", "crypto_8php.html#aca7c3a574bfb6c6ef1f2403a56823914", null ],
+ [ "crypto_encapsulate", "crypto_8php.html#a32fc08d57a5694f94d8543ecbb03323c", null ],
+ [ "crypto_unencapsulate", "crypto_8php.html#a0781202b0a43b82426929cc87c2fa2b5", null ],
+ [ "new_keypair", "crypto_8php.html#aae0ab70d6a199b29555b1ac3cf250d6a", null ],
+ [ "pkcs5_pad", "crypto_8php.html#ad5e51fd44cff93cfaa07a37e24a5edec", null ],
+ [ "pkcs5_unpad", "crypto_8php.html#ac95ac3b1b23b65b04a86613d4206ae85", null ],
+ [ "rsa_sign", "crypto_8php.html#a920e5f222d0020f47556033d8b2b6552", null ],
+ [ "rsa_verify", "crypto_8php.html#ab4f21d8f6b8ece0915e7c8bb73379f96", null ]
+]; \ No newline at end of file
diff --git a/doc/html/dark_8php.html b/doc/html/dark_8php.html
new file mode 100644
index 000000000..df29c3249
--- /dev/null
+++ b/doc/html/dark_8php.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/redbasic/schema/dark.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('dark_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">dark.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/darkness_8php.html b/doc/html/darkness_8php.html
new file mode 100644
index 000000000..d5ea426d6
--- /dev/null
+++ b/doc/html/darkness_8php.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/apw/schema/darkness.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('darkness_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">darkness.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/darknessleftaside_8php.html b/doc/html/darknessleftaside_8php.html
new file mode 100644
index 000000000..033a7ce47
--- /dev/null
+++ b/doc/html/darknessleftaside_8php.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/apw/schema/darknessleftaside.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('darknessleftaside_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">darknessleftaside.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/darknessrightaside_8php.html b/doc/html/darknessrightaside_8php.html
new file mode 100644
index 000000000..9cc59d968
--- /dev/null
+++ b/doc/html/darknessrightaside_8php.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/apw/schema/darknessrightaside.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('darknessrightaside_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">darknessrightaside.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/datetime_8php.html b/doc/html/datetime_8php.html
new file mode 100644
index 000000000..e6930feea
--- /dev/null
+++ b/doc/html/datetime_8php.html
@@ -0,0 +1,597 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/datetime.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('datetime_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">datetime.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:aa51b5a7ea4f931b23acbdfcea46e9865"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="datetime_8php.html#aa51b5a7ea4f931b23acbdfcea46e9865">timezone_cmp</a> ($a, $b)</td></tr>
+<tr class="separator:aa51b5a7ea4f931b23acbdfcea46e9865"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a633dadba426fa2f60b25fabdb19ebc1f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="datetime_8php.html#a633dadba426fa2f60b25fabdb19ebc1f">select_timezone</a> ($current= 'America/Los_Angeles')</td></tr>
+<tr class="separator:a633dadba426fa2f60b25fabdb19ebc1f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a03900dcf0f9e3c58793a031673a70326"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="datetime_8php.html#a03900dcf0f9e3c58793a031673a70326">field_timezone</a> ($name='timezone', $label='', $current= 'America/Los_Angeles', $help)</td></tr>
+<tr class="separator:a03900dcf0f9e3c58793a031673a70326"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad6301e74b0f9267d52f8d432b5beb226"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="datetime_8php.html#ad6301e74b0f9267d52f8d432b5beb226">datetime_convert</a> ($from= 'UTC', $to= 'UTC', $s= 'now', $fmt=&quot;Y-m-d H:i:s&quot;)</td></tr>
+<tr class="separator:ad6301e74b0f9267d52f8d432b5beb226"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3f2897db32e745fe2f3e70a6b46578f8"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="datetime_8php.html#a3f2897db32e745fe2f3e70a6b46578f8">dob</a> ($dob)</td></tr>
+<tr class="separator:a3f2897db32e745fe2f3e70a6b46578f8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5f29553799005b1fd4e9ce9d98ce05aa"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="datetime_8php.html#a5f29553799005b1fd4e9ce9d98ce05aa">datesel_format</a> ($f)</td></tr>
+<tr class="separator:a5f29553799005b1fd4e9ce9d98ce05aa"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac265b86f384ee094ed5479aae02aa5c8"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="datetime_8php.html#ac265b86f384ee094ed5479aae02aa5c8">datesel</a> ($f, $pre, $ymin, $ymax, $allow_blank, $y, $m, $d)</td></tr>
+<tr class="separator:ac265b86f384ee094ed5479aae02aa5c8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a36d3d6dff8d76b5f295bb3d9c535a5b1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="datetime_8php.html#a36d3d6dff8d76b5f295bb3d9c535a5b1">timesel</a> ($pre, $h, $m)</td></tr>
+<tr class="separator:a36d3d6dff8d76b5f295bb3d9c535a5b1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8ae8dc95ace7ac27fa5a1ecf42b78c82"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="datetime_8php.html#a8ae8dc95ace7ac27fa5a1ecf42b78c82">relative_date</a> ($posted_date, $format=null)</td></tr>
+<tr class="separator:a8ae8dc95ace7ac27fa5a1ecf42b78c82"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abc1652f96799cec6fce8797ba2ebc2df"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="datetime_8php.html#abc1652f96799cec6fce8797ba2ebc2df">age</a> ($<a class="el" href="datetime_8php.html#a3f2897db32e745fe2f3e70a6b46578f8">dob</a>, $owner_tz= '', $viewer_tz= '')</td></tr>
+<tr class="separator:abc1652f96799cec6fce8797ba2ebc2df"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7df24d72ea05922d3127363e2295174c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="datetime_8php.html#a7df24d72ea05922d3127363e2295174c">get_dim</a> ($y, $m)</td></tr>
+<tr class="separator:a7df24d72ea05922d3127363e2295174c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aba971b67f17fecf050813f1eba72367f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="datetime_8php.html#aba971b67f17fecf050813f1eba72367f">get_first_dim</a> ($y, $m)</td></tr>
+<tr class="separator:aba971b67f17fecf050813f1eba72367f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aea356409ba69f9de412298c998595dd2"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="datetime_8php.html#aea356409ba69f9de412298c998595dd2">cal</a> ($y=0, $m=0, $links=false, $class='')</td></tr>
+<tr class="separator:aea356409ba69f9de412298c998595dd2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab55e545b72ec8c097e052ea7d373491f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="datetime_8php.html#ab55e545b72ec8c097e052ea7d373491f">z_birthday</a> ($<a class="el" href="datetime_8php.html#a3f2897db32e745fe2f3e70a6b46578f8">dob</a>, $tz, $format=&quot;Y-m-d H:i:s&quot;)</td></tr>
+<tr class="separator:ab55e545b72ec8c097e052ea7d373491f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="abc1652f96799cec6fce8797ba2ebc2df"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">age </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$dob</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$owner_tz</em> = <code>''</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$viewer_tz</em> = <code>''</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="identity_8php.html#aa870d2c1f558cfd52bef05bc124e8fa4">advanced_profile()</a>, <a class="el" href="mod_2directory_8php.html#aac79396570d759da2efac24fcedf5b44">directory_content()</a>, <a class="el" href="dirprofile_8php.html#a3e1d30d3d93863ff5615f2df4ac7f052">dirprofile_init()</a>, <a class="el" href="profiles_8php.html#a46975783b8b8d70402d51487eb1f0b00">profiles_content()</a>, <a class="el" href="dir__fns_8php.html#a6cae22cfdd6edda5ddf09e07abb3242a">syncdirs()</a>, and <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aea356409ba69f9de412298c998595dd2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">cal </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$y</em> = <code>0</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$m</em> = <code>0</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$links</em> = <code>false</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$class</em> = <code>''</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="events_8php.html#a1d293fb217ae6bc9e3858c4b32e363ec">events_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ac265b86f384ee094ed5479aae02aa5c8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">datesel </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$f</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$pre</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$ymin</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$ymax</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$allow_blank</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$y</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$m</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$d</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="datetime_8php.html#a3f2897db32e745fe2f3e70a6b46578f8">dob()</a>, and <a class="el" href="events_8php.html#a1d293fb217ae6bc9e3858c4b32e363ec">events_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a5f29553799005b1fd4e9ce9d98ce05aa"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">datesel_format </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$f</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="events_8php.html#a1d293fb217ae6bc9e3858c4b32e363ec">events_content()</a>, and <a class="el" href="profiles_8php.html#a46975783b8b8d70402d51487eb1f0b00">profiles_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ad6301e74b0f9267d52f8d432b5beb226"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">datetime_convert </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$from</em> = <code>'UTC'</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$to</em> = <code>'UTC'</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em> = <code>'now'</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$fmt</em> = <code>&quot;Y-m-d&#160;H:i:s&quot;</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="identity_8php.html#aa870d2c1f558cfd52bef05bc124e8fa4">advanced_profile()</a>, <a class="el" href="datetime_8php.html#abc1652f96799cec6fce8797ba2ebc2df">age()</a>, <a class="el" href="include_2api_8php.html#ae8f5863e18d69421005c71441c9d99a5">api_account_rate_limit_status()</a>, <a class="el" href="include_2api_8php.html#aea2dda92a155f2843a0ca188d8dfdf25">api_date()</a>, <a class="el" href="include_2api_8php.html#a6a04b48168ba1d9dd2de3081a630611f">api_rss_extra()</a>, <a class="el" href="items_8php.html#a275108c050f7eb18bcbb5018e6b81cf6">atom_entry()</a>, <a class="el" href="include_2attach_8php.html#ab6830b3ab74a5d284876141ac80f6cbc">attach_mkdir()</a>, <a class="el" href="include_2attach_8php.html#a84a8a64c4805e1525b42d4add464833f">attach_store()</a>, <a class="el" href="security_8php.html#adc7bf51e3b8d67bd80e9348f9ab03733">authenticate_success()</a>, <a class="el" href="zot_8php.html#ac34e479d27f32b82dd6b33542f81a6a7">build_sync_packet()</a>, <a class="el" href="datetime_8php.html#aea356409ba69f9de412298c998595dd2">cal()</a>, <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>, <a class="el" href="Contact_8php.html#a186162051a5127069cc851d78740f205">channel_remove()</a>, <a class="el" href="classCache.html#ab14d0f4bdf7116a94d545c574b38f568">Cache\clear()</a>, <a class="el" href="items_8php.html#a8794863cdf8ce1333040933d3a3f66bd">consume_feed()</a>, <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation()</a>, <a class="el" href="account_8php.html#a141fe579c351c78209d425473f978eb5">create_account()</a>, <a class="el" href="identity_8php.html#a345f4c943d84de502ec6e72d2c813945">create_identity()</a>, <a class="el" href="classRedDirectory.html#a2d12d99d38a6a75fc9a830b2f7fc0bf0">RedDirectory\createFile()</a>, <a class="el" href="cronhooks_8php.html#a4c4c1bbec4ecc9a0efa00dd6afd2c0ca">cronhooks_run()</a>, <a class="el" href="items_8php.html#a2b56a4c01bd22a648d52ec9af1a04259">delete_item_lowlevel()</a>, <a class="el" href="deliver_8php.html#a397afcb9afecf0c1816b0951189dd346">deliver_run()</a>, <a class="el" href="include_2directory_8php.html#aa75d3b0697ca1456aaabdb37a74aa0f0">directory_run()</a>, <a class="el" href="dirsearch_8php.html#aa1fb04e1de4f25b63349ac78f94ceb4c">dirsearch_content()</a>, <a class="el" href="text_8php.html#a0a1f7c0e97f9ecbebf3e5834582b014c">dlogger()</a>, <a class="el" href="datetime_8php.html#a3f2897db32e745fe2f3e70a6b46578f8">dob()</a>, <a class="el" href="event_8php.html#a32ba1b9ddf7a744a9a1512b052e5f850">ev_compare()</a>, <a class="el" href="event_8php.html#a89ef533faf345db8d64a58d4856bde3a">event_store()</a>, <a class="el" href="events_8php.html#a1d293fb217ae6bc9e3858c4b32e363ec">events_content()</a>, <a class="el" href="events_8php.html#ab3e8a8f901175f8e40a8089eea45c075">events_post()</a>, <a class="el" href="items_8php.html#a0cf98bb619f07dd18f602683a55a5f59">first_post_date()</a>, <a class="el" href="boot_8php.html#aca5e42678e178c6b9034610d66666fd7">fix_system_urls()</a>, <a class="el" href="bb2diaspora_8php.html#a29a2ad41f5826f3975fa9a49934ff863">format_event_diaspora()</a>, <a class="el" href="event_8php.html#a2ac9f1b08de03250ecd794f705781d17">format_event_html()</a>, <a class="el" href="fsuggest_8php.html#a61ecfe10ce937ed526614f8fd3de3c7d">fsuggest_post()</a>, <a class="el" href="classRedBrowser.html#a1f7daf50bb9bfcde7345b3b1908dbd7e">RedBrowser\generateDirectoryIndex()</a>, <a class="el" href="items_8php.html#a896c1809d58f2d7a42cfe14577958ddf">get_atom_elements()</a>, <a class="el" href="identity_8php.html#ad2c97627a313d53df1a1c7b4215ddb51">get_birthdays()</a>, <a class="el" href="identity_8php.html#ae381db3d43f8e7c1da8b15d14ecf5312">get_events()</a>, <a class="el" href="items_8php.html#a04a35b610acfe54434df08adec39c0c7">get_feed_for()</a>, <a class="el" href="datetime_8php.html#aba971b67f17fecf050813f1eba72367f">get_first_dim()</a>, <a class="el" href="items_8php.html#a536d0313b6ffe33b9d2490c4e25c5361">get_item_elements()</a>, <a class="el" href="items_8php.html#a94ddb1d6c8fa21dd7433677e85168037">get_mail_elements()</a>, <a class="el" href="items_8php.html#a251343637ff40a50cca93452cd530c26">get_profile_elements()</a>, <a class="el" href="items_8php.html#a079e099e15d88d47aeb6ca6d60da7107">get_public_feed()</a>, <a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">Item\get_template_data()</a>, <a class="el" href="zot_8php.html#aeec89da5b6ff090c63a79de4de884a35">import_directory_profile()</a>, <a class="el" href="import_8php.html#af17fef0410518f7eac205d0ea416eaa2">import_post()</a>, <a class="el" href="zot_8php.html#a2657e141d62d5f67ad3c87651b585299">import_site()</a>, <a class="el" href="zot_8php.html#a56f3f65514e4e7f0cd117d01735aebd1">import_xchan()</a>, <a class="el" href="invite_8php.html#aeb0881c0f93c8e8552e5ed756ce6e5a5">invite_post()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">item_store()</a>, <a class="el" href="items_8php.html#acf0bf7c9d21ac84f32effb754f7ad484">item_store_update()</a>, <a class="el" href="items_8php.html#a756738301f2ed96be50232500677d58a">items_fetch()</a>, <a class="el" href="like_8php.html#a9d7dd268f21c21e9d29dd2aca2dd9538">like_content()</a>, <a class="el" href="text_8php.html#a030fa5ecc64168af0c4f44897a9bce63">logger()</a>, <a class="el" href="magic_8php.html#acea2cc792849ca2d71d4b689f66518bf">magic_init()</a>, <a class="el" href="mail_8php.html#a3c7c485fc69f92371e8b20936040eca1">mail_content()</a>, <a class="el" href="mail_8php.html#acfc2cc0bf4e0b178207758384977f25a">mail_post()</a>, <a class="el" href="items_8php.html#a77da7ce9a117601d49ac4a67c71b514f">mail_store()</a>, <a class="el" href="mod_2message_8php.html#ac72dfed3ce08fcb331d66b37edc6e15f">message_content()</a>, <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>, <a class="el" href="include_2follow_8php.html#ae387d4ae097c23d69f3247e7f08140c7">new_contact()</a>, <a class="el" href="enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc">notification()</a>, <a class="el" href="notifier_8php.html#a568c502f626cff95e344c0748938b85d">notifier_run()</a>, <a class="el" href="onepoll_8php.html#a72753b2fdec79b37c7f432035c91fb6d">onepoll_run()</a>, <a class="el" href="include_2photos_8php.html#a6c40ef58aefef705a5adc84a40e97109">photo_upload()</a>, <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>, <a class="el" href="ping_8php.html#a77217b1b190b4c5d8770867b45f0c0a1">ping_init()</a>, <a class="el" href="socgraph_8php.html#a5ef8bef37161df53718a21e93d02fbd6">poco_load()</a>, <a class="el" href="poller_8php.html#a5f12df3a4738124b6c039971e87e76da">poller_run()</a>, <a class="el" href="post_8php.html#af59e6a1dc22d19d9257b01cd7ccedb75">post_post()</a>, <a class="el" href="items_8php.html#ad2abb4644ff1f20fefbc80326fe01cf0">posted_dates()</a>, <a class="el" href="profile__photo_8php.html#a4b80234074bd603221aa5364f330e479">profile_photo_post()</a>, <a class="el" href="profiles_8php.html#a46975783b8b8d70402d51487eb1f0b00">profiles_content()</a>, <a class="el" href="profiles_8php.html#ab0362c81b1d3b0b12a772b9fac446e04">profiles_post()</a>, <a class="el" href="classdba__mysql.html#ac3fd60c278f400907322dac578754a99">dba_mysql\q()</a>, <a class="el" href="classdba__mysqli.html#a611c4de8d6d7512dffb83a38bb6701ec">dba_mysqli\q()</a>, <a class="el" href="queue_8php.html#af8c93de86d866c3200174c8450a0f341">queue_run()</a>, <a class="el" href="datetime_8php.html#a8ae8dc95ace7ac27fa5a1ecf42b78c82">relative_date()</a>, <a class="el" href="classphoto__driver.html#a5864fae7d8389372955a8e78cec527ac">photo_driver\save()</a>, <a class="el" href="include_2message_8php.html#a751ffd6635022b2190f56154ee745752">send_message()</a>, <a class="el" href="account_8php.html#a014de2d5d5c9785de5bf547a485822fa">send_reg_approval_email()</a>, <a class="el" href="classCache.html#ae622b82adc1c2fb1f3e2cc4fd9688fce">Cache\set()</a>, <a class="el" href="settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586">settings_post()</a>, <a class="el" href="classphoto__driver.html#a642a8d0c4ad5f887c99c6af77cee287b">photo_driver\store()</a>, <a class="el" href="dir__fns_8php.html#aa666e7df6ca8c332f4081c9b66b4bdf6">sync_directories()</a>, <a class="el" href="dir__fns_8php.html#a44062d4b471d1e83f92f6c184585aa13">update_directory_entry()</a>, <a class="el" href="zot_8php.html#ab319d1d9fff9c7775d9daef42d1f33dd">update_modtime()</a>, <a class="el" href="queue__fn_8php.html#a4c2876181f75a4a61e85b7f00dfdbba1">update_queue_time()</a>, <a class="el" href="datetime_8php.html#ab55e545b72ec8c097e052ea7d373491f">z_birthday()</a>, <a class="el" href="items_8php.html#a004e89d86b0f29b2c4da20108ecc4091">zot_feed()</a>, <a class="el" href="zot_8php.html#a928f5643ca66ae9635d85aeb2be62e03">zot_process_response()</a>, <a class="el" href="zot_8php.html#a7b23bfb31d4491231e1e73bdc077240d">zot_refresh()</a>, and <a class="el" href="zotfeed_8php.html#a24dfc23d366e7f840cf2847d0c1c8eac">zotfeed_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a3f2897db32e745fe2f3e70a6b46578f8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">dob </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$dob</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="profiles_8php.html#a46975783b8b8d70402d51487eb1f0b00">profiles_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a03900dcf0f9e3c58793a031673a70326"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">field_timezone </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$name</em> = <code>'timezone'</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$label</em> = <code>''</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$current</em> = <code>'America/Los_Angeles'</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$help</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="setup_8php.html#a88247384a96e14516f474d7af6a465c1">setup_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a7df24d72ea05922d3127363e2295174c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_dim </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$y</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$m</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="datetime_8php.html#aea356409ba69f9de412298c998595dd2">cal()</a>, <a class="el" href="events_8php.html#a1d293fb217ae6bc9e3858c4b32e363ec">events_content()</a>, and <a class="el" href="items_8php.html#ad2abb4644ff1f20fefbc80326fe01cf0">posted_dates()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aba971b67f17fecf050813f1eba72367f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_first_dim </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$y</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$m</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="datetime_8php.html#aea356409ba69f9de412298c998595dd2">cal()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a8ae8dc95ace7ac27fa5a1ecf42b78c82"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">relative_date </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$posted_date</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$format</em> = <code>null</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="identity_8php.html#aa870d2c1f558cfd52bef05bc124e8fa4">advanced_profile()</a>, <a class="el" href="connedit_8php.html#a795acb3d9d841f55c255d7611681ab67">connedit_content()</a>, <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation()</a>, <a class="el" href="include_2notify_8php.html#a0e61728e487df50c72e6434f911a57d3">format_notification()</a>, <a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">Item\get_template_data()</a>, <a class="el" href="notifications_8php.html#aadd0b5525bd8c283a5d8a37982bbfe62">notifications_content()</a>, <a class="el" href="mod_2notify_8php.html#acdf3851688ebd6d6a575eb84ef9febe3">notify_content()</a>, and <a class="el" href="ping_8php.html#a77217b1b190b4c5d8770867b45f0c0a1">ping_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a633dadba426fa2f60b25fabdb19ebc1f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">select_timezone </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$current</em> = <code>'America/Los_Angeles'</code></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="datetime_8php.html#a03900dcf0f9e3c58793a031673a70326">field_timezone()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a36d3d6dff8d76b5f295bb3d9c535a5b1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">timesel </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$pre</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$h</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$m</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="events_8php.html#a1d293fb217ae6bc9e3858c4b32e363ec">events_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa51b5a7ea4f931b23acbdfcea46e9865"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">timezone_cmp </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$b</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ab55e545b72ec8c097e052ea7d373491f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">z_birthday </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$dob</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$tz</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$format</em> = <code>&quot;Y-m-d&#160;H:i:s&quot;</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/datetime_8php.js b/doc/html/datetime_8php.js
new file mode 100644
index 000000000..004a03a3e
--- /dev/null
+++ b/doc/html/datetime_8php.js
@@ -0,0 +1,17 @@
+var datetime_8php =
+[
+ [ "age", "datetime_8php.html#abc1652f96799cec6fce8797ba2ebc2df", null ],
+ [ "cal", "datetime_8php.html#aea356409ba69f9de412298c998595dd2", null ],
+ [ "datesel", "datetime_8php.html#ac265b86f384ee094ed5479aae02aa5c8", null ],
+ [ "datesel_format", "datetime_8php.html#a5f29553799005b1fd4e9ce9d98ce05aa", null ],
+ [ "datetime_convert", "datetime_8php.html#ad6301e74b0f9267d52f8d432b5beb226", null ],
+ [ "dob", "datetime_8php.html#a3f2897db32e745fe2f3e70a6b46578f8", null ],
+ [ "field_timezone", "datetime_8php.html#a03900dcf0f9e3c58793a031673a70326", null ],
+ [ "get_dim", "datetime_8php.html#a7df24d72ea05922d3127363e2295174c", null ],
+ [ "get_first_dim", "datetime_8php.html#aba971b67f17fecf050813f1eba72367f", null ],
+ [ "relative_date", "datetime_8php.html#a8ae8dc95ace7ac27fa5a1ecf42b78c82", null ],
+ [ "select_timezone", "datetime_8php.html#a633dadba426fa2f60b25fabdb19ebc1f", null ],
+ [ "timesel", "datetime_8php.html#a36d3d6dff8d76b5f295bb3d9c535a5b1", null ],
+ [ "timezone_cmp", "datetime_8php.html#aa51b5a7ea4f931b23acbdfcea46e9865", null ],
+ [ "z_birthday", "datetime_8php.html#ab55e545b72ec8c097e052ea7d373491f", null ]
+]; \ No newline at end of file
diff --git a/doc/html/db__update_8php.html b/doc/html/db__update_8php.html
new file mode 100644
index 000000000..070216b38
--- /dev/null
+++ b/doc/html/db__update_8php.html
@@ -0,0 +1,120 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: util/db_update.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('db__update_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#namespaces">Namespaces</a> </div>
+ <div class="headertitle">
+<div class="title">db_update.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="namespaces"></a>
+Namespaces</h2></td></tr>
+<tr class="memitem:namespaceutil"><td class="memItemLeft" align="right" valign="top">namespace &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespaceutil.html">util</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/db__update_8php.js b/doc/html/db__update_8php.js
new file mode 100644
index 000000000..a94d2d63d
--- /dev/null
+++ b/doc/html/db__update_8php.js
@@ -0,0 +1,7 @@
+var db__update_8php =
+[
+ [ "$a", "db__update_8php.html#acebf83966ef6d7e5645a6b62ba368f9f", null ],
+ [ "$build", "db__update_8php.html#a502b15db084ae270b52e03c8075916de", null ],
+ [ "$db", "db__update_8php.html#a1fa3127fc82f96b1436d871ef02be319", null ],
+ [ "$lang", "db__update_8php.html#a7714b111b644017933931ec69a154102", null ]
+]; \ No newline at end of file
diff --git a/doc/html/dba_8php.html b/doc/html/dba_8php.html
new file mode 100644
index 000000000..027f9d105
--- /dev/null
+++ b/doc/html/dba_8php.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Project: include/dba.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="r!-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Project
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('dba_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">dba.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/dba_8php.js b/doc/html/dba_8php.js
new file mode 100644
index 000000000..92ae4c2e4
--- /dev/null
+++ b/doc/html/dba_8php.js
@@ -0,0 +1,11 @@
+var dba_8php =
+[
+ [ "dba", "classdba.html", "classdba" ],
+ [ "dbesc", "dba_8php.html#ab222aa1dbf9ea93b320f82028739127e", null ],
+ [ "dbesc_array", "dba_8php.html#a65b83462bd26968106aebd43f16540e4", null ],
+ [ "dbesc_array_cb", "dba_8php.html#af531546fac5f0836a8557a4f6dfee930", null ],
+ [ "dbg", "dba_8php.html#aa6607893d8f60ade9122bcfbd1a53ffb", null ],
+ [ "dbq", "dba_8php.html#aa377074e70981e8c4e82ca0accd068ee", null ],
+ [ "printable", "dba_8php.html#a55bf30d8176967e682656b5be4ad9249", null ],
+ [ "q", "dba_8php.html#a2c09a731d3b4fef41fed0e83db01be1f", null ]
+]; \ No newline at end of file
diff --git a/doc/html/dba__driver_8php.html b/doc/html/dba__driver_8php.html
new file mode 100644
index 000000000..e725ffb7c
--- /dev/null
+++ b/doc/html/dba__driver_8php.html
@@ -0,0 +1,327 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/dba/dba_driver.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('dba__driver_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Classes</a> &#124;
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">dba_driver.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__driver.html">dba_driver</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ac10e60f6e5b95bcf67bd82cb88f37947"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dba__driver_8php.html#ac10e60f6e5b95bcf67bd82cb88f37947">dba_factory</a> ($server, $port, $user, $pass, $db, $install=false)</td></tr>
+<tr class="separator:ac10e60f6e5b95bcf67bd82cb88f37947"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a55bf30d8176967e682656b5be4ad9249"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dba__driver_8php.html#a55bf30d8176967e682656b5be4ad9249">printable</a> ($s)</td></tr>
+<tr class="separator:a55bf30d8176967e682656b5be4ad9249"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa6607893d8f60ade9122bcfbd1a53ffb"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dba__driver_8php.html#aa6607893d8f60ade9122bcfbd1a53ffb">dbg</a> ($state)</td></tr>
+<tr class="separator:aa6607893d8f60ade9122bcfbd1a53ffb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab222aa1dbf9ea93b320f82028739127e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dba__driver_8php.html#ab222aa1dbf9ea93b320f82028739127e">dbesc</a> ($str)</td></tr>
+<tr class="separator:ab222aa1dbf9ea93b320f82028739127e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2c09a731d3b4fef41fed0e83db01be1f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dba__driver_8php.html#a2c09a731d3b4fef41fed0e83db01be1f">q</a> ($sql)</td></tr>
+<tr class="separator:a2c09a731d3b4fef41fed0e83db01be1f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa377074e70981e8c4e82ca0accd068ee"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dba__driver_8php.html#aa377074e70981e8c4e82ca0accd068ee">dbq</a> ($sql)</td></tr>
+<tr class="separator:aa377074e70981e8c4e82ca0accd068ee"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af531546fac5f0836a8557a4f6dfee930"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dba__driver_8php.html#af531546fac5f0836a8557a4f6dfee930">dbesc_array_cb</a> (&amp;$item, $key)</td></tr>
+<tr class="separator:af531546fac5f0836a8557a4f6dfee930"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a65b83462bd26968106aebd43f16540e4"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dba__driver_8php.html#a65b83462bd26968106aebd43f16540e4">dbesc_array</a> (&amp;$arr)</td></tr>
+<tr class="separator:a65b83462bd26968106aebd43f16540e4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="ac10e60f6e5b95bcf67bd82cb88f37947"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">dba_factory </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$server</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$port</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$user</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$pass</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$db</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$install</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="cli__startup_8php.html#adfdde63686e33ccd4851fa5edc4fc70b">cli_startup()</a>, and <a class="el" href="setup_8php.html#a13cf286774149a0a7bd8adb8179cec75">setup_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ab222aa1dbf9ea93b320f82028739127e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">dbesc </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$str</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="auth_8php.html#a07bae0e623e2daa9ee2cd5a8aa294dee">account_verify_password()</a>, <a class="el" href="achievements_8php.html#a35ae04ada0e227d19671f289a32fb30e">achievements_content()</a>, <a class="el" href="acl_8php.html#ac6776dba871806ecdb5d1659bc2eb07a">acl_init()</a>, <a class="el" href="admin_8php.html#a62f10f90c47686c9c3c37c4c03a108d2">admin_page_users()</a>, <a class="el" href="zot_8php.html#a703f528ade8382cf374e4119bd6f7859">allowed_public_recips()</a>, <a class="el" href="include_2api_8php.html#a0991f72554f821255397d615e76f3203">api_direct_messages_new()</a>, <a class="el" href="include_2api_8php.html#aa40bae797bcd9ccacffdce5a3b5a1afa">api_get_user()</a>, <a class="el" href="include_2api_8php.html#a645397787618b5c548a31e8686e8cca4">api_status_show()</a>, <a class="el" href="include_2api_8php.html#ad4c29f43418f6110f85a6b3998239ab4">api_statuses_destroy()</a>, <a class="el" href="include_2api_8php.html#a8b25a186bd0893f51aa72a62f655735e">api_statuses_mentions()</a>, <a class="el" href="include_2api_8php.html#afb99daa6b731bf497b81f2128084852c">api_user()</a>, <a class="el" href="include_2api_8php.html#abe8e929e93f7ab134b1cb1fb30f19a76">api_users_show()</a>, <a class="el" href="include_2attach_8php.html#a0d07c5b83d3d54e186f752e571847b36">attach_by_hash()</a>, <a class="el" href="include_2attach_8php.html#ad991208ce939387e2f93a3bce7d09932">attach_by_hash_nodata()</a>, <a class="el" href="include_2attach_8php.html#a5c0875eafb8c0f8a0620ff7a875a2221">attach_change_permissions()</a>, <a class="el" href="include_2attach_8php.html#a887d2d44a3ef18dcb6624e7fb58dc8e3">attach_count_files()</a>, <a class="el" href="include_2attach_8php.html#a70bd666e080c2af5a91f5d14c297b8cd">attach_delete()</a>, <a class="el" href="include_2attach_8php.html#a3634af95f11a023dd8e882c3c7a3600d">attach_list_files()</a>, <a class="el" href="include_2attach_8php.html#ab6830b3ab74a5d284876141ac80f6cbc">attach_mkdir()</a>, <a class="el" href="include_2attach_8php.html#a84a8a64c4805e1525b42d4add464833f">attach_store()</a>, <a class="el" href="security_8php.html#adc7bf51e3b8d67bd80e9348f9ab03733">authenticate_success()</a>, <a class="el" href="blocks_8php.html#a2531a8fd51db3cecb2eb20c002c66e12">blocks_content()</a>, <a class="el" href="zot_8php.html#ac34e479d27f32b82dd6b33542f81a6a7">build_sync_packet()</a>, <a class="el" href="plugin_8php.html#a7f05de16c0a32602853b09b99dd85e7c">call_hooks()</a>, <a class="el" href="contact__widgets_8php.html#a165eb021e61c4dcab2a552f28628d353">categories_widget()</a>, <a class="el" href="security_8php.html#a8d23d2597aae380a3341872fe9513380">change_channel()</a>, <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>, <a class="el" href="Contact_8php.html#a186162051a5127069cc851d78740f205">channel_remove()</a>, <a class="el" href="Contact_8php.html#a483cda56f9e37c3a4a8773dcdfeb0258">channelx_by_hash()</a>, <a class="el" href="Contact_8php.html#a3a0844dac1e86d523de5d2f432cfeebc">channelx_by_n()</a>, <a class="el" href="Contact_8php.html#a87e699f74a1102b25e8aa0432d86a91e">channelx_by_nick()</a>, <a class="el" href="chanview_8php.html#a4192c6da888c8c1165851acf9ad4cb8b">chanview_content()</a>, <a class="el" href="account_8php.html#ae052bd5558847bd38e89c213561a9771">check_account_email()</a>, <a class="el" href="account_8php.html#aaff7720423417a4333697894ffd9ddeb">check_account_invite()</a>, <a class="el" href="items_8php.html#a87ac9e359591721a824ecd23bbb56296">check_item_source()</a>, <a class="el" href="text_8php.html#a0c65597bb4aed3a039eb795ff540e5e3">check_webbie()</a>, <a class="el" href="classCache.html#ab14d0f4bdf7116a94d545c574b38f568">Cache\clear()</a>, <a class="el" href="comanche_8php.html#a5a7ab801717d38e91ac910b933973887">comanche_block()</a>, <a class="el" href="socgraph_8php.html#a7d34cd58025bcd9e575282f44db75918">common_friends()</a>, <a class="el" href="connect_8php.html#ad46a38f32fd7a3d324b1fa26373efa36">connect_init()</a>, <a class="el" href="connect_8php.html#a417ec27afe33f21a929667a665e32ee2">connect_post()</a>, <a class="el" href="connections_8php.html#aec2e457420fce3e3bf6a9f48e36df25c">connections_content()</a>, <a class="el" href="connections_8php.html#a1224058db8e3fb56463eb312f98e561d">connections_post()</a>, <a class="el" href="connedit_8php.html#a234c48426b652bf4d37053f2af329ac5">connedit_post()</a>, <a class="el" href="items_8php.html#a8794863cdf8ce1333040933d3a3f66bd">consume_feed()</a>, <a class="el" href="Contact_8php.html#a28e062c884331dbb5dfa713228c25ad6">contact_remove()</a>, <a class="el" href="contactgroup_8php.html#a18c7391b1b25debaf98c9dba639caab3">contactgroup_content()</a>, <a class="el" href="socgraph_8php.html#a887d576f21fd708132a06d0f72f90f84">count_common_friends()</a>, <a class="el" href="account_8php.html#a141fe579c351c78209d425473f978eb5">create_account()</a>, <a class="el" href="identity_8php.html#a345f4c943d84de502ec6e72d2c813945">create_identity()</a>, <a class="el" href="classRedDirectory.html#a986936910f0216887a25e28916c166c7">RedDirectory\createDirectory()</a>, <a class="el" href="classRedDirectory.html#a2d12d99d38a6a75fc9a830b2f7fc0bf0">RedDirectory\createFile()</a>, <a class="el" href="dba__driver_8php.html#af531546fac5f0836a8557a4f6dfee930">dbesc_array_cb()</a>, <a class="el" href="include_2config_8php.html#a549910227348003efc3c05c9105c42da">del_config()</a>, <a class="el" href="include_2config_8php.html#a7ad2081c5f812ac4387fd76f3762d941">del_pconfig()</a>, <a class="el" href="include_2config_8php.html#a9c171def547deee16738dc58fdeb4b72">del_xconfig()</a>, <a class="el" href="delegate_8php.html#a943eea8996ef348eb845c498f9f354dd">delegate_content()</a>, <a class="el" href="zot_8php.html#adfeb9400ae6b726beec89f8f1e8fde72">delete_imported_item()</a>, <a class="el" href="items_8php.html#a2b56a4c01bd22a648d52ec9af1a04259">delete_item_lowlevel()</a>, <a class="el" href="deliver_8php.html#a397afcb9afecf0c1816b0951189dd346">deliver_run()</a>, <a class="el" href="include_2directory_8php.html#aa75d3b0697ca1456aaabdb37a74aa0f0">directory_run()</a>, <a class="el" href="dirsearch_8php.html#aa1fb04e1de4f25b63349ac78f94ceb4c">dirsearch_content()</a>, <a class="el" href="display_8php.html#a37137c98d47bf3306f4c2bb9f5b60de0">display_content()</a>, <a class="el" href="editblock_8php.html#abbe8f55de06967bc8d79d620509a49e6">editblock_content()</a>, <a class="el" href="editlayout_8php.html#aa877e4157a26b099de904164181dd386">editlayout_content()</a>, <a class="el" href="editpost_8php.html#a34011690864d122680c802e9e748ccfb">editpost_content()</a>, <a class="el" href="editwebpage_8php.html#a375e945255fad79a71036528f7480650">editwebpage_content()</a>, <a class="el" href="event_8php.html#a89ef533faf345db8d64a58d4856bde3a">event_store()</a>, <a class="el" href="events_8php.html#a1d293fb217ae6bc9e3858c4b32e363ec">events_content()</a>, <a class="el" href="events_8php.html#ab3e8a8f901175f8e40a8089eea45c075">events_post()</a>, <a class="el" href="fbrowser_8php.html#aee476addcf7a3e0fe9454f7dfd5a56c4">fbrowser_content()</a>, <a class="el" href="feed_8php.html#af86137700b56f33d1d5f25c8dec22c04">feed_init()</a>, <a class="el" href="items_8php.html#adf980098b6de9c3993bc3ff26a8dd6f9">fetch_post_tags()</a>, <a class="el" href="taxonomy_8php.html#a163b5131f388080b0fc82398d3a32fe1">file_tag_file_query()</a>, <a class="el" href="filerm_8php.html#ae2eb28d2054fa2c37e38689882172208">filerm_content()</a>, <a class="el" href="filestorage_8php.html#a61bb1be78472555df4ce619f51014040">filestorage_content()</a>, <a class="el" href="item_8php.html#a7b63a9d0cd02096e17dcf11f4afa7c10">fix_attached_photo_permissions()</a>, <a class="el" href="items_8php.html#aba98fcbbcd7044a7e9ea34edabc14c87">fix_private_photos()</a>, <a class="el" href="boot_8php.html#aca5e42678e178c6b9034610d66666fd7">fix_system_urls()</a>, <a class="el" href="fsuggest_8php.html#a61ecfe10ce937ed526614f8fd3de3c7d">fsuggest_post()</a>, <a class="el" href="text_8php.html#ae4f6881d7e13623f8eded6277595112a">generate_user_guid()</a>, <a class="el" href="classCache.html#a70392b109331897bf9fdd7f1960e21de">Cache\get()</a>, <a class="el" href="classRedFile.html#a7c868dfcef6c70cd0e24cf3caa2c3535">RedFile\get()</a>, <a class="el" href="permissions_8php.html#aeca9b280f3dc3358c89976d81d690008">get_all_perms()</a>, <a class="el" href="identity_8php.html#ad2c97627a313d53df1a1c7b4215ddb51">get_birthdays()</a>, <a class="el" href="include_2attach_8php.html#a6aa00ea010ea030110faefb75eafc1ce">get_cloudpath()</a>, <a class="el" href="include_2config_8php.html#af08b7adb63adfb2eda7c466fba0cce74">get_config_from_storage()</a>, <a class="el" href="identity_8php.html#ae381db3d43f8e7c1da8b15d14ecf5312">get_events()</a>, <a class="el" href="items_8php.html#a536d0313b6ffe33b9d2490c4e25c5361">get_item_elements()</a>, <a class="el" href="classRedDirectory.html#a70173d4458572d95e586b2037d2fd2f4">RedDirectory\getDir()</a>, <a class="el" href="gprobe_8php.html#adf72cb0a70b5b9d99fdec1cc60e18ed1">gprobe_run()</a>, <a class="el" href="include_2group_8php.html#a06ec565d2b64e79044e7c1bf91a2a4ce">group_add()</a>, <a class="el" href="include_2group_8php.html#a0122ef312df2c5546b1a46b3e6c7b31b">group_add_member()</a>, <a class="el" href="include_2group_8php.html#abd66a5ea34a07a3422dc2dde6c7b3ecb">group_byname()</a>, <a class="el" href="mod_2group_8php.html#a07a64f6c65b0080d8190b3d9728a7a83">group_content()</a>, <a class="el" href="mod_2group_8php.html#aed1f009b1221348021bb34761160ef35">group_post()</a>, <a class="el" href="include_2group_8php.html#a90e157b3e1b99c981809cb5a2abd3245">group_rec_byhash()</a>, <a class="el" href="include_2group_8php.html#a4118f498bbd1530c1d0136d016d197a5">group_rmv()</a>, <a class="el" href="include_2group_8php.html#a540e3ef36f47d47532646be4241f6518">group_rmv_member()</a>, <a class="el" href="include_2group_8php.html#afb802ae2ce73aae4bc36d157f7b6a92f">groups_containing()</a>, <a class="el" href="item_8php.html#aa22feef4de326e1d7078dedd892e615c">handle_tag()</a>, <a class="el" href="home_8php.html#aa1cf697851a646755baf537f75334c46">home_content()</a>, <a class="el" href="zot_8php.html#ad149f1e98c0c5b88ff9147e6ee3f330d">import_author_zot()</a>, <a class="el" href="zot_8php.html#a3bf11286c2619b4ca28e49d5b5ab374a">import_directory_keywords()</a>, <a class="el" href="zot_8php.html#aeec89da5b6ff090c63a79de4de884a35">import_directory_profile()</a>, <a class="el" href="import_8php.html#af17fef0410518f7eac205d0ea416eaa2">import_post()</a>, <a class="el" href="photo__driver_8php.html#a78f5a10c568d2a9bbbb129dc96548887">import_profile_photo()</a>, <a class="el" href="zot_8php.html#a2657e141d62d5f67ad3c87651b585299">import_site()</a>, <a class="el" href="zot_8php.html#a56f3f65514e4e7f0cd117d01735aebd1">import_xchan()</a>, <a class="el" href="plugin_8php.html#a482131013272a1d5d5c1b1469c6c55d5">install_plugin()</a>, <a class="el" href="invite_8php.html#aeb0881c0f93c8e8552e5ed756ce6e5a5">invite_post()</a>, <a class="el" href="text_8php.html#aa6b0aa8afbeab50d1a3058ad21acb74e">item_message_id()</a>, <a class="el" href="security_8php.html#a9355488460ab11d6058656ff919e5cf9">item_permissions_sql()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">item_store()</a>, <a class="el" href="items_8php.html#acf0bf7c9d21ac84f32effb754f7ad484">item_store_update()</a>, <a class="el" href="items_8php.html#a756738301f2ed96be50232500677d58a">items_fetch()</a>, <a class="el" href="layouts_8php.html#a6e0193759ad9eef76d3df2db24237b50">layouts_content()</a>, <a class="el" href="like_8php.html#a9d7dd268f21c21e9d29dd2aca2dd9538">like_content()</a>, <a class="el" href="include_2config_8php.html#a27559f388c9b9af81c94e48d6889d1d1">load_config()</a>, <a class="el" href="plugin_8php.html#a9ca9632b7309a65b05c03a3e2f473a3d">load_plugin()</a>, <a class="el" href="include_2config_8php.html#a55bbed9a014c9109c767486834f3ca33">load_xconfig()</a>, <a class="el" href="lockview_8php.html#a851e26ab9a1008df5c5ebebea31e9b44">lockview_content()</a>, <a class="el" href="classFKOAuthDataStore.html#a1148d47b546350bf440bdd92792c5df1">FKOAuthDataStore\lookup_consumer()</a>, <a class="el" href="classFKOAuthDataStore.html#a4edfe2e77ecd2e16ff6b5eb516ed3599">FKOAuthDataStore\lookup_nonce()</a>, <a class="el" href="classFKOAuthDataStore.html#a96f76387c3a93b0abe27a98013804bab">FKOAuthDataStore\lookup_token()</a>, <a class="el" href="lostpass_8php.html#a0314d94e48c789b1b3a201d740c9eab3">lostpass_content()</a>, <a class="el" href="lostpass_8php.html#a8ed35ba71a4404eaf4903da61d0321cc">lostpass_post()</a>, <a class="el" href="magic_8php.html#acea2cc792849ca2d71d4b689f66518bf">magic_init()</a>, <a class="el" href="items_8php.html#a77da7ce9a117601d49ac4a67c71b514f">mail_store()</a>, <a class="el" href="include_2group_8php.html#a048f6892bfd28852de1b76470df411de">member_of()</a>, <a class="el" href="include_2menu_8php.html#add35fae5e9695031b3d46e30ac409eb8">menu_add_item()</a>, <a class="el" href="include_2menu_8php.html#a08a800821721781a8dfffbe31481ff98">menu_create()</a>, <a class="el" href="include_2menu_8php.html#a3884bda4d85d84ec99447db9403a68d8">menu_delete()</a>, <a class="el" href="include_2menu_8php.html#a6a33c6a3db2a7510b16cc656edaec571">menu_edit()</a>, <a class="el" href="include_2menu_8php.html#acb66f80ca895a6ccd562b3d9ae7b41aa">menu_edit_item()</a>, <a class="el" href="include_2menu_8php.html#a68ebbf492470c930f652013656f9071d">menu_fetch()</a>, <a class="el" href="msearch_8php.html#ac80d2a6c0a92e79eec7efbbccd74d9a8">msearch_post()</a>, <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>, <a class="el" href="classFKOAuthDataStore.html#a434882f03e3cdb171ed89e09e337e934">FKOAuthDataStore\new_access_token()</a>, <a class="el" href="include_2follow_8php.html#ae387d4ae097c23d69f3247e7f08140c7">new_contact()</a>, <a class="el" href="session_8php.html#a4c0ead624f95483e386bc80abf570a8f">new_cookie()</a>, <a class="el" href="classFKOAuthDataStore.html#a431b44d70e3da6a8256ab38f710e3050">FKOAuthDataStore\new_request_token()</a>, <a class="el" href="enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc">notification()</a>, <a class="el" href="notifier_8php.html#a568c502f626cff95e344c0748938b85d">notifier_run()</a>, <a class="el" href="mod_2notify_8php.html#a94f9a6a9d4b5fd704baafff0c34f41ae">notify_init()</a>, <a class="el" href="mod_2api_8php.html#a02ae0f60e240dc806b860edb7d582117">oauth_get_client()</a>, <a class="el" href="onedirsync_8php.html#a411aedd47c57476099647961e6a86691">onedirsync_run()</a>, <a class="el" href="onepoll_8php.html#a72753b2fdec79b37c7f432035c91fb6d">onepoll_run()</a>, <a class="el" href="page_8php.html#a91a5f649f68406149108bded1dc90b22">page_content()</a>, <a class="el" href="permissions_8php.html#a67ada9ed51e77885b6b0f6a28cee1835">perm_is_allowed()</a>, <a class="el" href="security_8php.html#afa683bc025a1d2fe9065e2f6cd71a22f">permissions_sql()</a>, <a class="el" href="photo_8php.html#a582779d24882b0d31ee909a91d70a448">photo_init()</a>, <a class="el" href="text_8php.html#aa5528f41533927e1bd2da3618a74a6d7">photo_new_resource()</a>, <a class="el" href="include_2photos_8php.html#a6c40ef58aefef705a5adc84a40e97109">photo_upload()</a>, <a class="el" href="include_2photos_8php.html#a8e8b7be99e24c2497bc2cb3339280c35">photos_album_exists()</a>, <a class="el" href="include_2photos_8php.html#a7e7abc69872180697c5471dc69349afe">photos_album_get_db_idstr()</a>, <a class="el" href="include_2photos_8php.html#ab0365f25b22ccea5f085fe7c49e1f4ab">photos_album_rename()</a>, <a class="el" href="mod_2photos_8php.html#aa87382611a66ec5effdb2d78f13f5812">photos_content()</a>, <a class="el" href="include_2photos_8php.html#aa27b9e435dcc34e1009f56dc02c7ca51">photos_list_photos()</a>, <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>, <a class="el" href="ping_8php.html#a77217b1b190b4c5d8770867b45f0c0a1">ping_init()</a>, <a class="el" href="poco_8php.html#a53def16f75e3d41f1d2bb7cfa4905498">poco_init()</a>, <a class="el" href="socgraph_8php.html#a5ef8bef37161df53718a21e93d02fbd6">poco_load()</a>, <a class="el" href="poller_8php.html#a5f12df3a4738124b6c039971e87e76da">poller_run()</a>, <a class="el" href="post_8php.html#af4b48181ce773ef0cdfc972441445c34">post_init()</a>, <a class="el" href="post_8php.html#af59e6a1dc22d19d9257b01cd7ccedb75">post_post()</a>, <a class="el" href="include_2message_8php.html#aed272d77c06a309e2836ac79e75613f1">private_messages_drop()</a>, <a class="el" href="include_2message_8php.html#a5f8de9847e203329e317ac38dc646898">private_messages_fetch_conversation()</a>, <a class="el" href="include_2message_8php.html#a254a756031e4d5e94f85e2939bdb5091">private_messages_fetch_message()</a>, <a class="el" href="include_2message_8php.html#a652973ce47a262f2d238c2fd6233d97e">private_messages_list()</a>, <a class="el" href="zot_8php.html#ac301c67864917c35922257950ae0f95c">process_channel_sync_delivery()</a>, <a class="el" href="zot_8php.html#a37ec13b18057634eadb071f05297f5e1">process_delivery()</a>, <a class="el" href="zot_8php.html#aa6ae96db8cbbdbb10e6876d206bbf7cc">process_mail_delivery()</a>, <a class="el" href="zot_8php.html#a9a57b40669351c9791126b925cb7ef3b">process_profile_delivery()</a>, <a class="el" href="profile_8php.html#ab5d0246be0552e2182a585c1206d22a5">profile_init()</a>, <a class="el" href="identity_8php.html#a4751b522ea913d0e7ed43e03d22e9e68">profile_load()</a>, <a class="el" href="profile__photo_8php.html#a4b80234074bd603221aa5364f330e479">profile_photo_post()</a>, <a class="el" href="profiles_8php.html#a36f71405ad536228f8bb84a551b23f7e">profiles_init()</a>, <a class="el" href="profiles_8php.html#ab0362c81b1d3b0b12a772b9fac446e04">profiles_post()</a>, <a class="el" href="security_8php.html#ab3bdd30dc60d9ee72370b866aa4a2d01">public_permissions_sql()</a>, <a class="el" href="zot_8php.html#a083aec6c900d244e1bfc1406f9461465">public_recips()</a>, <a class="el" href="classRedFile.html#a41a49a583eb276b75626fcf97f4a699c">RedFile\put()</a>, <a class="el" href="queue_8php.html#af8c93de86d866c3200174c8450a0f341">queue_run()</a>, <a class="el" href="Contact_8php.html#a2f4f495d53f2a334ab75292af79d3c91">rconnect_url()</a>, <a class="el" href="items_8php.html#a4e6d7639431e0dd8e9f4dba8e1ac408b">red_zrl_callback()</a>, <a class="el" href="reddav_8php.html#a5df0d09893f2e65dc5cf6bbab6cfb266">RedCollectionData()</a>, <a class="el" href="reddav_8php.html#a9f531641dfb4e43cd88ac1a9ae7e2088">RedFileData()</a>, <a class="el" href="session_8php.html#af230b86bfff7db66c3bdd7e0bbc24052">ref_session_destroy()</a>, <a class="el" href="session_8php.html#ac95373f4966862a028033dd2f94d4da1">ref_session_gc()</a>, <a class="el" href="session_8php.html#a7f0f50576360d9ba52d29364e0b83a8e">ref_session_read()</a>, <a class="el" href="session_8php.html#ac4461c1984543d3553e73dba2771568f">ref_session_write()</a>, <a class="el" href="plugin_8php.html#a425472c5f3afc137268b2ad45652b209">register_hook()</a>, <a class="el" href="register_8php.html#a51731dcc1917c58a790eb1c0f6132271">register_post()</a>, <a class="el" href="Contact_8php.html#acc12cda999c88c4d6185cca967c15125">remove_all_xchan_resources()</a>, <a class="el" href="zot_8php.html#aad25a3fe0e1566121d6fb8222979bc10">remove_community_tag()</a>, <a class="el" href="queue__fn_8php.html#a8fe71e981399bbf5d000a6ca42f57b24">remove_queue_item()</a>, <a class="el" href="rmagic_8php.html#a95455edd43f1bff39446a57388cdde16">rmagic_init()</a>, <a class="el" href="rmagic_8php.html#a869de069d081b3c4e98b957d06bbf08f">rmagic_post()</a>, <a class="el" href="classphoto__driver.html#a5864fae7d8389372955a8e78cec527ac">photo_driver\save()</a>, <a class="el" href="search__ac_8php.html#a14f90c83a3f2be095e9e2992a8d66138">search_ac_init()</a>, <a class="el" href="search_8php.html#ab2568591359edde5b483a6cd9a24b2cc">search_content()</a>, <a class="el" href="include_2message_8php.html#a751ffd6635022b2190f56154ee745752">send_message()</a>, <a class="el" href="account_8php.html#a014de2d5d5c9785de5bf547a485822fa">send_reg_approval_email()</a>, <a class="el" href="items_8php.html#aab9e0c58247427126de0699c729c3b6c">send_status_notifications()</a>, <a class="el" href="classCache.html#ae622b82adc1c2fb1f3e2cc4fd9688fce">Cache\set()</a>, <a class="el" href="include_2config_8php.html#ad6da879e4fb5b37d1e161d4e9be5c32a">set_config()</a>, <a class="el" href="include_2config_8php.html#a61591371cb18764138655d67dc817ab2">set_pconfig()</a>, <a class="el" href="include_2config_8php.html#afe117b70f1bba2f6348d9300b601f86e">set_xconfig()</a>, <a class="el" href="classRedFile.html#a38a82bfc1b30028ea6ac75923e90fa25">RedFile\setName()</a>, <a class="el" href="settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586">settings_post()</a>, <a class="el" href="siteinfo_8php.html#a3efbd0bd6564af19ec0a9ce0294e59d0">siteinfo_init()</a>, <a class="el" href="sources_8php.html#ac442ccef080ab95772d8929fcafcb4b7">sources_content()</a>, <a class="el" href="sources_8php.html#ac73298ff162ce7b2de8dcaf3d3305b1e">sources_post()</a>, <a class="el" href="classphoto__driver.html#a642a8d0c4ad5f887c99c6af77cee287b">photo_driver\store()</a>, <a class="el" href="taxonomy_8php.html#a4ba1339b2a7054971178ce194e4440fd">store_item_tag()</a>, <a class="el" href="security_8php.html#a15e0f8f511cc06192db63387f97238b3">stream_perms_xchans()</a>, <a class="el" href="text_8php.html#a8796f6a9ca592ecdce7b3afc3462aa13">stringify_array_elms()</a>, <a class="el" href="subthread_8php.html#a50368f3d825b77996030528e7fbfa3d3">subthread_content()</a>, <a class="el" href="suggest_8php.html#a696acf1dd8070e479adcc80c63c6718c">suggest_init()</a>, <a class="el" href="dir__fns_8php.html#aa666e7df6ca8c332f4081c9b66b4bdf6">sync_directories()</a>, <a class="el" href="dir__fns_8php.html#a6cae22cfdd6edda5ddf09e07abb3242a">syncdirs()</a>, <a class="el" href="items_8php.html#ab1bce4261bcf75ad62753b498a144d17">tag_deliver()</a>, <a class="el" href="tagger_8php.html#a0e4a3eb177d1684553c547503d67161c">tagger_content()</a>, <a class="el" href="tagrm_8php.html#a1702f40aa53a2fa93deade1f609abe78">tagrm_post()</a>, <a class="el" href="taxonomy_8php.html#a7a913d19c77610da689be48fbbf6734c">term_query()</a>, <a class="el" href="items_8php.html#a88c6cf7649ac836fbbed82a7a0315110">tgroup_check()</a>, <a class="el" href="thing_8php.html#a24a35f1e64029a67fdbea94a776ae04b">thing_content()</a>, <a class="el" href="thing_8php.html#a8be23b1d475ec3d9291999221c674c80">thing_init()</a>, <a class="el" href="plugin_8php.html#a093a9cb98f51e3643634bd8bc6ed6e76">uninstall_plugin()</a>, <a class="el" href="plugin_8php.html#a56f71fe5adf9586ce950523d8180443e">unregister_hook()</a>, <a class="el" href="dir__fns_8php.html#a44062d4b471d1e83f92f6c184585aa13">update_directory_entry()</a>, <a class="el" href="zot_8php.html#ab319d1d9fff9c7775d9daef42d1f33dd">update_modtime()</a>, <a class="el" href="queue__fn_8php.html#a4c2876181f75a4a61e85b7f00dfdbba1">update_queue_time()</a>, <a class="el" href="items_8php.html#a2baa9e05f1e8aa3dd61c85803ae39bd6">update_remote_id()</a>, <a class="el" href="account_8php.html#ac5c570a2d46446bad4dd2501e9c5a4b1">user_allow()</a>, <a class="el" href="account_8php.html#ac1653efba62493b9d87513e1b6c04c83">user_deny()</a>, <a class="el" href="classRedBasicAuth.html#a8dfd9a0953f8884723b421b7c1acf79b">RedBasicAuth\validateUserPass()</a>, <a class="el" href="Contact_8php.html#a6348a532c9d26cd1c9afbc9aa6aa8960">vcard_from_xchan()</a>, <a class="el" href="vote_8php.html#a57a9516ee1b923b224e66dcc47377fb2">vote_post()</a>, <a class="el" href="wall__attach_8php.html#a7385e970e93228d082f0fd7254f6e653">wall_attach_post()</a>, <a class="el" href="wall__upload_8php.html#a7cbe204244cf9e0380ee932263a74d8f">wall_upload_post()</a>, <a class="el" href="webpages_8php.html#af3b7397d4abc153e3d2147740ee1a41d">webpages_content()</a>, <a class="el" href="wfinger_8php.html#ae21e50c8d0a5f3c9be9f43a4e519acd3">wfinger_init()</a>, <a class="el" href="widgets_8php.html#a94203eb9bcd63cbdecbbcb15163598d8">widget_savedsearch()</a>, <a class="el" href="xchan_8php.html#a9853348bf1a35c644460221ba75edc2d">xchan_content()</a>, <a class="el" href="text_8php.html#a543447c5ed766535221e2d9636b379ee">xchan_mail_query()</a>, <a class="el" href="text_8php.html#a36a2e5d418ee81140f25c4233cfecd1f">xchan_query()</a>, <a class="el" href="xrd_8php.html#aee3cf087968e4a0ff3a87de16eb23270">xrd_init()</a>, <a class="el" href="include_2attach_8php.html#aeb07968990e66a88c95483ca09a7f909">z_readdir()</a>, <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>, <a class="el" href="identity_8php.html#a680fbafc2db023c5b1309e0180e81315">zid_init()</a>, <a class="el" href="items_8php.html#a004e89d86b0f29b2c4da20108ecc4091">zot_feed()</a>, <a class="el" href="zot_8php.html#a95528377d7303131958c9f0b7158fdce">zot_finger()</a>, <a class="el" href="zot_8php.html#ae7cec2b417b5858fd4a41070f843d1d7">zot_get_hublocs()</a>, <a class="el" href="zot_8php.html#a55056e863a7860bc0cf922e78fcce073">zot_gethub()</a>, <a class="el" href="zot_8php.html#a928f5643ca66ae9635d85aeb2be62e03">zot_process_response()</a>, <a class="el" href="zot_8php.html#a7b23bfb31d4491231e1e73bdc077240d">zot_refresh()</a>, and <a class="el" href="zotfeed_8php.html#a24dfc23d366e7f840cf2847d0c1c8eac">zotfeed_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a65b83462bd26968106aebd43f16540e4"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">dbesc_array </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="import_8php.html#af17fef0410518f7eac205d0ea416eaa2">import_post()</a>, <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">item_store()</a>, <a class="el" href="items_8php.html#acf0bf7c9d21ac84f32effb754f7ad484">item_store_update()</a>, <a class="el" href="items_8php.html#a77da7ce9a117601d49ac4a67c71b514f">mail_store()</a>, and <a class="el" href="profiles_8php.html#a36f71405ad536228f8bb84a551b23f7e">profiles_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="af531546fac5f0836a8557a4f6dfee930"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">dbesc_array_cb </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$item</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$key</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aa6607893d8f60ade9122bcfbd1a53ffb"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">dbg </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$state</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aa377074e70981e8c4e82ca0accd068ee"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">dbq </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$sql</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Raw db query, no arguments </p>
+
+<p>Referenced by <a class="el" href="import_8php.html#af17fef0410518f7eac205d0ea416eaa2">import_post()</a>, <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">item_store()</a>, <a class="el" href="items_8php.html#acf0bf7c9d21ac84f32effb754f7ad484">item_store_update()</a>, <a class="el" href="items_8php.html#a77da7ce9a117601d49ac4a67c71b514f">mail_store()</a>, <a class="el" href="zot_8php.html#ac301c67864917c35922257950ae0f95c">process_channel_sync_delivery()</a>, and <a class="el" href="profiles_8php.html#a36f71405ad536228f8bb84a551b23f7e">profiles_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a55bf30d8176967e682656b5be4ad9249"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">printable </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classdba__mysql.html#ac3fd60c278f400907322dac578754a99">dba_mysql\q()</a>, and <a class="el" href="classdba__mysqli.html#a611c4de8d6d7512dffb83a38bb6701ec">dba_mysqli\q()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a2c09a731d3b4fef41fed0e83db01be1f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">q </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$sql</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>This will happen occasionally trying to store the session data after abnormal program termination</p>
+
+<p>Referenced by <a class="el" href="Contact_8php.html#ae8803c330352cbf1e828eb7490edf47e">abook_connections()</a>, <a class="el" href="Contact_8php.html#ad5b02c2a962ee55b1b7ca6c159d6e4c5">abook_self()</a>, <a class="el" href="Contact_8php.html#a024919623a830e8703ac4f23496dd66c">abook_toggle_flag()</a>, <a class="el" href="Contact_8php.html#a6e64de7db60b7243dce45fb6347636ff">account_remove()</a>, <a class="el" href="account_8php.html#a43e3042b2723d76915a030bac3c668b6">account_total()</a>, <a class="el" href="auth_8php.html#a07bae0e623e2daa9ee2cd5a8aa294dee">account_verify_password()</a>, <a class="el" href="achievements_8php.html#a35ae04ada0e227d19671f289a32fb30e">achievements_content()</a>, <a class="el" href="acl_8php.html#ac6776dba871806ecdb5d1659bc2eb07a">acl_init()</a>, <a class="el" href="admin_8php.html#afef415e4011607fbb665610441595015">admin_content()</a>, <a class="el" href="admin_8php.html#aaa6addf2dbc3f3fcf99244a56b41eade">admin_page_dbsync()</a>, <a class="el" href="admin_8php.html#a6943543f3138f6ee182cb701f415d1cc">admin_page_hubloc()</a>, <a class="el" href="admin_8php.html#ac6e95b920b5abd030cc522964987087a">admin_page_summary()</a>, <a class="el" href="admin_8php.html#a62f10f90c47686c9c3c37c4c03a108d2">admin_page_users()</a>, <a class="el" href="admin_8php.html#a5a696706a3869800e65fb365214241b7">admin_page_users_post()</a>, <a class="el" href="socgraph_8php.html#a16ac51c505d72987ed8d6d6aed0e8586">all_friends()</a>, <a class="el" href="zot_8php.html#a703f528ade8382cf374e4119bd6f7859">allowed_public_recips()</a>, <a class="el" href="include_2api_8php.html#a7759ccddc8dff012ad168e511ffe5af5">api_direct_messages_box()</a>, <a class="el" href="include_2api_8php.html#a0991f72554f821255397d615e76f3203">api_direct_messages_new()</a>, <a class="el" href="include_2api_8php.html#a2c71b1226ef1283b5370bd1c200fee5f">api_favorites()</a>, <a class="el" href="include_2api_8php.html#a36344c80b8e9755da2f2dd3a0e28cce8">api_ff_ids()</a>, <a class="el" href="include_2api_8php.html#a4c6fb9fb5203aa60f4b3afd4521db8ea">api_format_items()</a>, <a class="el" href="include_2api_8php.html#aa40bae797bcd9ccacffdce5a3b5a1afa">api_get_user()</a>, <a class="el" href="include_2api_8php.html#a645397787618b5c548a31e8686e8cca4">api_status_show()</a>, <a class="el" href="include_2api_8php.html#ad4c29f43418f6110f85a6b3998239ab4">api_statuses_destroy()</a>, <a class="el" href="include_2api_8php.html#aa0d6b29fff0344a8e67f3507a6d01410">api_statuses_f()</a>, <a class="el" href="include_2api_8php.html#a528d8070ee74ea800102936ce73cf366">api_statuses_home_timeline()</a>, <a class="el" href="include_2api_8php.html#a8b25a186bd0893f51aa72a62f655735e">api_statuses_mentions()</a>, <a class="el" href="include_2api_8php.html#ad24ce1bf20867add4c9211a8eaf93f22">api_statuses_public_timeline()</a>, <a class="el" href="include_2api_8php.html#ae0fa388479cace9c5a7a45b571ab42f8">api_statuses_repeat()</a>, <a class="el" href="include_2api_8php.html#af6f1d89cdb0a0621025efbec1597bc63">api_statuses_show()</a>, <a class="el" href="include_2api_8php.html#a32f0dda848d0c11c727fe1c3e741c283">api_statuses_user_timeline()</a>, <a class="el" href="include_2api_8php.html#afb99daa6b731bf497b81f2128084852c">api_user()</a>, <a class="el" href="include_2api_8php.html#abe8e929e93f7ab134b1cb1fb30f19a76">api_users_show()</a>, <a class="el" href="include_2attach_8php.html#a0d07c5b83d3d54e186f752e571847b36">attach_by_hash()</a>, <a class="el" href="include_2attach_8php.html#ad991208ce939387e2f93a3bce7d09932">attach_by_hash_nodata()</a>, <a class="el" href="include_2attach_8php.html#a5c0875eafb8c0f8a0620ff7a875a2221">attach_change_permissions()</a>, <a class="el" href="include_2attach_8php.html#a887d2d44a3ef18dcb6624e7fb58dc8e3">attach_count_files()</a>, <a class="el" href="include_2attach_8php.html#a70bd666e080c2af5a91f5d14c297b8cd">attach_delete()</a>, <a class="el" href="mod_2attach_8php.html#aa88eb5ad87aa1036a30e70339cc6c1b1">attach_init()</a>, <a class="el" href="include_2attach_8php.html#a3634af95f11a023dd8e882c3c7a3600d">attach_list_files()</a>, <a class="el" href="include_2attach_8php.html#ab6830b3ab74a5d284876141ac80f6cbc">attach_mkdir()</a>, <a class="el" href="include_2attach_8php.html#a84a8a64c4805e1525b42d4add464833f">attach_store()</a>, <a class="el" href="security_8php.html#adc7bf51e3b8d67bd80e9348f9ab03733">authenticate_success()</a>, <a class="el" href="blocks_8php.html#a2531a8fd51db3cecb2eb20c002c66e12">blocks_content()</a>, <a class="el" href="zot_8php.html#ac34e479d27f32b82dd6b33542f81a6a7">build_sync_packet()</a>, <a class="el" href="plugin_8php.html#a7f05de16c0a32602853b09b99dd85e7c">call_hooks()</a>, <a class="el" href="contact__widgets_8php.html#a165eb021e61c4dcab2a552f28628d353">categories_widget()</a>, <a class="el" href="security_8php.html#a8d23d2597aae380a3341872fe9513380">change_channel()</a>, <a class="el" href="include_2chanman_8php.html#a21ba9a5c961e866ff27aee3ee67bf99b">chanman_remove_everything_from_network()</a>, <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>, <a class="el" href="Contact_8php.html#a186162051a5127069cc851d78740f205">channel_remove()</a>, <a class="el" href="identity_8php.html#a77d2237f1846964634b1c99089c27c7d">channel_total()</a>, <a class="el" href="Contact_8php.html#a483cda56f9e37c3a4a8773dcdfeb0258">channelx_by_hash()</a>, <a class="el" href="Contact_8php.html#a3a0844dac1e86d523de5d2f432cfeebc">channelx_by_n()</a>, <a class="el" href="Contact_8php.html#a87e699f74a1102b25e8aa0432d86a91e">channelx_by_nick()</a>, <a class="el" href="chanview_8php.html#a4192c6da888c8c1165851acf9ad4cb8b">chanview_content()</a>, <a class="el" href="account_8php.html#ae052bd5558847bd38e89c213561a9771">check_account_email()</a>, <a class="el" href="account_8php.html#aaff7720423417a4333697894ffd9ddeb">check_account_invite()</a>, <a class="el" href="boot_8php.html#a4c02d88e66852a01bd5a1feecb7c3ce3">check_config()</a>, <a class="el" href="items_8php.html#a87ac9e359591721a824ecd23bbb56296">check_item_source()</a>, <a class="el" href="text_8php.html#a0c65597bb4aed3a039eb795ff540e5e3">check_webbie()</a>, <a class="el" href="classCache.html#ab14d0f4bdf7116a94d545c574b38f568">Cache\clear()</a>, <a class="el" href="items_8php.html#a01e3cf44e082fa9bd06dcde5bf713d70">collect_recipients()</a>, <a class="el" href="comanche_8php.html#a5a7ab801717d38e91ac910b933973887">comanche_block()</a>, <a class="el" href="socgraph_8php.html#a7d34cd58025bcd9e575282f44db75918">common_friends()</a>, <a class="el" href="socgraph_8php.html#ac343a846241d36cdf046b08f3396cfe9">common_friends_zcid()</a>, <a class="el" href="common_8php.html#aca62f113655809f41f49042ce9b123c2">common_init()</a>, <a class="el" href="community_8php.html#a1197aafd6a6b540dbb4a0c04ade3a25a">community_content()</a>, <a class="el" href="connect_8php.html#ad46a38f32fd7a3d324b1fa26373efa36">connect_init()</a>, <a class="el" href="connect_8php.html#a417ec27afe33f21a929667a665e32ee2">connect_post()</a>, <a class="el" href="connections_8php.html#aec2e457420fce3e3bf6a9f48e36df25c">connections_content()</a>, <a class="el" href="connections_8php.html#a1224058db8e3fb56463eb312f98e561d">connections_post()</a>, <a class="el" href="connedit_8php.html#a795acb3d9d841f55c255d7611681ab67">connedit_content()</a>, <a class="el" href="connedit_8php.html#a4da871e075597a09a8b374b9171dd92e">connedit_init()</a>, <a class="el" href="connedit_8php.html#a234c48426b652bf4d37053f2af329ac5">connedit_post()</a>, <a class="el" href="items_8php.html#a8794863cdf8ce1333040933d3a3f66bd">consume_feed()</a>, <a class="el" href="text_8php.html#ad6432621d0fafcbcf3d3b9b49bef7784">contact_block()</a>, <a class="el" href="contact__selectors_8php.html#a2c743d2eb526eb758d943a1490162d75">contact_profile_assign()</a>, <a class="el" href="Contact_8php.html#a28e062c884331dbb5dfa713228c25ad6">contact_remove()</a>, <a class="el" href="acl__selectors_8php.html#a9476997d2968a5794f3723878ed89c91">contact_select()</a>, <a class="el" href="contactgroup_8php.html#a18c7391b1b25debaf98c9dba639caab3">contactgroup_content()</a>, <a class="el" href="socgraph_8php.html#af29d056beec10b4e38e5209c92452894">count_all_friends()</a>, <a class="el" href="socgraph_8php.html#a887d576f21fd708132a06d0f72f90f84">count_common_friends()</a>, <a class="el" href="socgraph_8php.html#af175807406d94407a5e11742a3287746">count_common_friends_zcid()</a>, <a class="el" href="account_8php.html#a141fe579c351c78209d425473f978eb5">create_account()</a>, <a class="el" href="identity_8php.html#a345f4c943d84de502ec6e72d2c813945">create_identity()</a>, <a class="el" href="classRedDirectory.html#a986936910f0216887a25e28916c166c7">RedDirectory\createDirectory()</a>, <a class="el" href="classRedDirectory.html#a2d12d99d38a6a75fc9a830b2f7fc0bf0">RedDirectory\createFile()</a>, <a class="el" href="boot_8php.html#ad206598b909e8eb67eb0e0bb5ef69c13">current_theme()</a>, <a class="el" href="include_2config_8php.html#a549910227348003efc3c05c9105c42da">del_config()</a>, <a class="el" href="include_2config_8php.html#a7ad2081c5f812ac4387fd76f3762d941">del_pconfig()</a>, <a class="el" href="include_2config_8php.html#a9c171def547deee16738dc58fdeb4b72">del_xconfig()</a>, <a class="el" href="delegate_8php.html#a943eea8996ef348eb845c498f9f354dd">delegate_content()</a>, <a class="el" href="zot_8php.html#adfeb9400ae6b726beec89f8f1e8fde72">delete_imported_item()</a>, <a class="el" href="items_8php.html#a2b56a4c01bd22a648d52ec9af1a04259">delete_item_lowlevel()</a>, <a class="el" href="deliver_8php.html#a397afcb9afecf0c1816b0951189dd346">deliver_run()</a>, <a class="el" href="taxonomy_8php.html#a088371f4bc19155b2291508f5cd63332">dir_tagadelic()</a>, <a class="el" href="mod_2directory_8php.html#aac79396570d759da2efac24fcedf5b44">directory_content()</a>, <a class="el" href="include_2directory_8php.html#aa75d3b0697ca1456aaabdb37a74aa0f0">directory_run()</a>, <a class="el" href="dirprofile_8php.html#a3e1d30d3d93863ff5615f2df4ac7f052">dirprofile_init()</a>, <a class="el" href="dirsearch_8php.html#aa1fb04e1de4f25b63349ac78f94ceb4c">dirsearch_content()</a>, <a class="el" href="display_8php.html#a37137c98d47bf3306f4c2bb9f5b60de0">display_content()</a>, <a class="el" href="items_8php.html#afa1db13c2a8b73b5b17b97f17e5a19d1">drop_item()</a>, <a class="el" href="editblock_8php.html#abbe8f55de06967bc8d79d620509a49e6">editblock_content()</a>, <a class="el" href="editlayout_8php.html#aa877e4157a26b099de904164181dd386">editlayout_content()</a>, <a class="el" href="editpost_8php.html#a34011690864d122680c802e9e748ccfb">editpost_content()</a>, <a class="el" href="editwebpage_8php.html#a375e945255fad79a71036528f7480650">editwebpage_content()</a>, <a class="el" href="items_8php.html#a82955cc578f0fa600acec84475026194">encode_item()</a>, <a class="el" href="event_8php.html#a89ef533faf345db8d64a58d4856bde3a">event_store()</a>, <a class="el" href="events_8php.html#a1d293fb217ae6bc9e3858c4b32e363ec">events_content()</a>, <a class="el" href="include_2group_8php.html#a22a81875259c7d3d64d4848afea6b345">expand_groups()</a>, <a class="el" href="expire_8php.html#a444e45c9b67727b27db4c779fd51a298">expire_run()</a>, <a class="el" href="fbrowser_8php.html#aee476addcf7a3e0fe9454f7dfd5a56c4">fbrowser_content()</a>, <a class="el" href="feed_8php.html#af86137700b56f33d1d5f25c8dec22c04">feed_init()</a>, <a class="el" href="items_8php.html#adf980098b6de9c3993bc3ff26a8dd6f9">fetch_post_tags()</a>, <a class="el" href="contact__widgets_8php.html#a1eda66319d170f60a8d07c7ece95533b">fileas_widget()</a>, <a class="el" href="filer_8php.html#a5fd5d7e61b2f9c43cb5f110c89dc4274">filer_content()</a>, <a class="el" href="filerm_8php.html#ae2eb28d2054fa2c37e38689882172208">filerm_content()</a>, <a class="el" href="filestorage_8php.html#a61bb1be78472555df4ce619f51014040">filestorage_content()</a>, <a class="el" href="items_8php.html#a0cf98bb619f07dd18f602683a55a5f59">first_post_date()</a>, <a class="el" href="item_8php.html#a7b63a9d0cd02096e17dcf11f4afa7c10">fix_attached_photo_permissions()</a>, <a class="el" href="items_8php.html#aba98fcbbcd7044a7e9ea34edabc14c87">fix_private_photos()</a>, <a class="el" href="boot_8php.html#aca5e42678e178c6b9034610d66666fd7">fix_system_urls()</a>, <a class="el" href="fsuggest_8php.html#aa6c49ed4b50a387f1845f36844dd7998">fsuggest_content()</a>, <a class="el" href="fsuggest_8php.html#a61ecfe10ce937ed526614f8fd3de3c7d">fsuggest_post()</a>, <a class="el" href="text_8php.html#ae4f6881d7e13623f8eded6277595112a">generate_user_guid()</a>, <a class="el" href="classCache.html#a70392b109331897bf9fdd7f1960e21de">Cache\get()</a>, <a class="el" href="classRedFile.html#a7c868dfcef6c70cd0e24cf3caa2c3535">RedFile\get()</a>, <a class="el" href="permissions_8php.html#aeca9b280f3dc3358c89976d81d690008">get_all_perms()</a>, <a class="el" href="identity_8php.html#ad2c97627a313d53df1a1c7b4215ddb51">get_birthdays()</a>, <a class="el" href="include_2attach_8php.html#a6aa00ea010ea030110faefb75eafc1ce">get_cloudpath()</a>, <a class="el" href="include_2config_8php.html#af08b7adb63adfb2eda7c466fba0cce74">get_config_from_storage()</a>, <a class="el" href="identity_8php.html#ae381db3d43f8e7c1da8b15d14ecf5312">get_events()</a>, <a class="el" href="items_8php.html#a536d0313b6ffe33b9d2490c4e25c5361">get_item_elements()</a>, <a class="el" href="identity_8php.html#aaff86ee3b5984821e7a256c2da5f1a51">get_sys_channel()</a>, <a class="el" href="taxonomy_8php.html#a7747fa859ac56fbffd4f9782d85505de">get_things()</a>, <a class="el" href="classRedDirectory.html#a70173d4458572d95e586b2037d2fd2f4">RedDirectory\getDir()</a>, <a class="el" href="gprobe_8php.html#adf72cb0a70b5b9d99fdec1cc60e18ed1">gprobe_run()</a>, <a class="el" href="include_2group_8php.html#a06ec565d2b64e79044e7c1bf91a2a4ce">group_add()</a>, <a class="el" href="include_2group_8php.html#a0122ef312df2c5546b1a46b3e6c7b31b">group_add_member()</a>, <a class="el" href="include_2group_8php.html#abd66a5ea34a07a3422dc2dde6c7b3ecb">group_byname()</a>, <a class="el" href="mod_2group_8php.html#a07a64f6c65b0080d8190b3d9728a7a83">group_content()</a>, <a class="el" href="include_2group_8php.html#a5bd191d9692e6c34d48c0ede10810f09">group_get_members()</a>, <a class="el" href="mod_2group_8php.html#aed1f009b1221348021bb34761160ef35">group_post()</a>, <a class="el" href="include_2group_8php.html#a90e157b3e1b99c981809cb5a2abd3245">group_rec_byhash()</a>, <a class="el" href="include_2group_8php.html#a4118f498bbd1530c1d0136d016d197a5">group_rmv()</a>, <a class="el" href="include_2group_8php.html#a540e3ef36f47d47532646be4241f6518">group_rmv_member()</a>, <a class="el" href="acl__selectors_8php.html#aa1e3bc344ca2b29f97eb9860216d21a0">group_select()</a>, <a class="el" href="include_2group_8php.html#a6a69bd7be032fa8ce4e49c43a42cc6e9">group_side()</a>, <a class="el" href="include_2group_8php.html#afb802ae2ce73aae4bc36d157f7b6a92f">groups_containing()</a>, <a class="el" href="item_8php.html#aa22feef4de326e1d7078dedd892e615c">handle_tag()</a>, <a class="el" href="home_8php.html#aa1cf697851a646755baf537f75334c46">home_content()</a>, <a class="el" href="identity_8php.html#a3570a4eb77332b292d394c4132cb8f03">identity_basic_export()</a>, <a class="el" href="identity_8php.html#ac9fcd5c4c371998790b5c55c3d0f4633">identity_check_service_class()</a>, <a class="el" href="zot_8php.html#ad149f1e98c0c5b88ff9147e6ee3f330d">import_author_zot()</a>, <a class="el" href="zot_8php.html#a3bf11286c2619b4ca28e49d5b5ab374a">import_directory_keywords()</a>, <a class="el" href="zot_8php.html#aeec89da5b6ff090c63a79de4de884a35">import_directory_profile()</a>, <a class="el" href="import_8php.html#af17fef0410518f7eac205d0ea416eaa2">import_post()</a>, <a class="el" href="photo__driver_8php.html#a78f5a10c568d2a9bbbb129dc96548887">import_profile_photo()</a>, <a class="el" href="zot_8php.html#a2657e141d62d5f67ad3c87651b585299">import_site()</a>, <a class="el" href="zot_8php.html#a56f3f65514e4e7f0cd117d01735aebd1">import_xchan()</a>, <a class="el" href="plugin_8php.html#a482131013272a1d5d5c1b1469c6c55d5">install_plugin()</a>, <a class="el" href="invite_8php.html#aeb0881c0f93c8e8552e5ed756ce6e5a5">invite_post()</a>, <a class="el" href="item_8php.html#a5b1b36cb301a94b38150074f0d424e74">item_check_service_class()</a>, <a class="el" href="items_8php.html#a6f7e1334af5d684a987fa6a3eb37f4cc">item_expire()</a>, <a class="el" href="text_8php.html#aa6b0aa8afbeab50d1a3058ad21acb74e">item_message_id()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">item_store()</a>, <a class="el" href="items_8php.html#acf0bf7c9d21ac84f32effb754f7ad484">item_store_update()</a>, <a class="el" href="items_8php.html#a756738301f2ed96be50232500677d58a">items_fetch()</a>, <a class="el" href="text_8php.html#a3999a0b3e22e440f280ee791ce34d384">layout_select()</a>, <a class="el" href="layouts_8php.html#a6e0193759ad9eef76d3df2db24237b50">layouts_content()</a>, <a class="el" href="like_8php.html#a9d7dd268f21c21e9d29dd2aca2dd9538">like_content()</a>, <a class="el" href="dirsearch_8php.html#a985d410a170549429857af6ff2673149">list_public_sites()</a>, <a class="el" href="include_2config_8php.html#a27559f388c9b9af81c94e48d6889d1d1">load_config()</a>, <a class="el" href="boot_8php.html#a719c7f3972d5f9268f37a41c76cd4ef6">load_contact_links()</a>, <a class="el" href="plugin_8php.html#a326365e48ef94f0b9a0a771b8d75e813">load_hooks()</a>, <a class="el" href="include_2config_8php.html#ac543813a980b3841cc5a277fcd4a24a6">load_pconfig()</a>, <a class="el" href="plugin_8php.html#a9ca9632b7309a65b05c03a3e2f473a3d">load_plugin()</a>, <a class="el" href="language_8php.html#a7e9904c730bb24ddcb0ff50fc96f6b05">load_translation_table()</a>, <a class="el" href="include_2config_8php.html#a55bbed9a014c9109c767486834f3ca33">load_xconfig()</a>, <a class="el" href="lockview_8php.html#a851e26ab9a1008df5c5ebebea31e9b44">lockview_content()</a>, <a class="el" href="classFKOAuth1.html#a2b1dac2ed31fc6ef84668afdda8b263f">FKOAuth1\loginUser()</a>, <a class="el" href="classFKOAuthDataStore.html#a1148d47b546350bf440bdd92792c5df1">FKOAuthDataStore\lookup_consumer()</a>, <a class="el" href="classFKOAuthDataStore.html#a4edfe2e77ecd2e16ff6b5eb516ed3599">FKOAuthDataStore\lookup_nonce()</a>, <a class="el" href="classFKOAuthDataStore.html#a96f76387c3a93b0abe27a98013804bab">FKOAuthDataStore\lookup_token()</a>, <a class="el" href="lostpass_8php.html#a0314d94e48c789b1b3a201d740c9eab3">lostpass_content()</a>, <a class="el" href="lostpass_8php.html#a8ed35ba71a4404eaf4903da61d0321cc">lostpass_post()</a>, <a class="el" href="magic_8php.html#acea2cc792849ca2d71d4b689f66518bf">magic_init()</a>, <a class="el" href="mail_8php.html#a3c7c485fc69f92371e8b20936040eca1">mail_content()</a>, <a class="el" href="items_8php.html#a77da7ce9a117601d49ac4a67c71b514f">mail_store()</a>, <a class="el" href="manage_8php.html#a2bca247b5296827638959138367db4f5">manage_content()</a>, <a class="el" href="match_8php.html#a1dd853e959b9e70c1911bb2fb5f5130d">match_content()</a>, <a class="el" href="include_2group_8php.html#a048f6892bfd28852de1b76470df411de">member_of()</a>, <a class="el" href="include_2menu_8php.html#add35fae5e9695031b3d46e30ac409eb8">menu_add_item()</a>, <a class="el" href="include_2menu_8php.html#a08a800821721781a8dfffbe31481ff98">menu_create()</a>, <a class="el" href="include_2menu_8php.html#a9aa8e0052dd47c1a93f53a983bd4620a">menu_del_item()</a>, <a class="el" href="include_2menu_8php.html#a3884bda4d85d84ec99447db9403a68d8">menu_delete()</a>, <a class="el" href="include_2menu_8php.html#ad87f51ce85172bcc3f931aa0cd96a804">menu_delete_id()</a>, <a class="el" href="include_2menu_8php.html#a6a33c6a3db2a7510b16cc656edaec571">menu_edit()</a>, <a class="el" href="include_2menu_8php.html#acb66f80ca895a6ccd562b3d9ae7b41aa">menu_edit_item()</a>, <a class="el" href="include_2menu_8php.html#a68ebbf492470c930f652013656f9071d">menu_fetch()</a>, <a class="el" href="include_2menu_8php.html#a47447c01ba8ea04cd74af1d4c5b68fc7">menu_fetch_id()</a>, <a class="el" href="include_2menu_8php.html#acef15a498d52666b1c7e5c12765c689b">menu_list()</a>, <a class="el" href="text_8php.html#a1633412120f52bdce5f43e0a127d9293">mimetype_select()</a>, <a class="el" href="include_2group_8php.html#ab0e422a0f31c0c64fd9084ca03d85f32">mini_group_select()</a>, <a class="el" href="mitem_8php.html#a7a31b702ecad18eeb6a38b243ff0037e">mitem_content()</a>, <a class="el" href="mood_8php.html#a7ae136dd7476865b4828136175db5022">mood_init()</a>, <a class="el" href="msearch_8php.html#ac80d2a6c0a92e79eec7efbbccd74d9a8">msearch_post()</a>, <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>, <a class="el" href="classFKOAuthDataStore.html#a434882f03e3cdb171ed89e09e337e934">FKOAuthDataStore\new_access_token()</a>, <a class="el" href="include_2follow_8php.html#ae387d4ae097c23d69f3247e7f08140c7">new_contact()</a>, <a class="el" href="session_8php.html#a4c0ead624f95483e386bc80abf570a8f">new_cookie()</a>, <a class="el" href="classFKOAuthDataStore.html#a431b44d70e3da6a8256ab38f710e3050">FKOAuthDataStore\new_request_token()</a>, <a class="el" href="enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc">notification()</a>, <a class="el" href="notifications_8php.html#aadd0b5525bd8c283a5d8a37982bbfe62">notifications_content()</a>, <a class="el" href="notifications_8php.html#a5baffec7b2e625c9f9cefbc097550d33">notifications_post()</a>, <a class="el" href="notifier_8php.html#a568c502f626cff95e344c0748938b85d">notifier_run()</a>, <a class="el" href="mod_2notify_8php.html#acdf3851688ebd6d6a575eb84ef9febe3">notify_content()</a>, <a class="el" href="mod_2notify_8php.html#a94f9a6a9d4b5fd704baafff0c34f41ae">notify_init()</a>, <a class="el" href="mod_2api_8php.html#a02ae0f60e240dc806b860edb7d582117">oauth_get_client()</a>, <a class="el" href="onedirsync_8php.html#a411aedd47c57476099647961e6a86691">onedirsync_run()</a>, <a class="el" href="onepoll_8php.html#a72753b2fdec79b37c7f432035c91fb6d">onepoll_run()</a>, <a class="el" href="page_8php.html#a91a5f649f68406149108bded1dc90b22">page_content()</a>, <a class="el" href="page__widgets_8php.html#ad82011c1ed90d9de8b9f34c12af5c6f0">pagelist_widget()</a>, <a class="el" href="comanche_8php.html#af7150df735e5ff9d467994cd6f769c6e">pdl_selector()</a>, <a class="el" href="permissions_8php.html#a67ada9ed51e77885b6b0f6a28cee1835">perm_is_allowed()</a>, <a class="el" href="photo_8php.html#a582779d24882b0d31ee909a91d70a448">photo_init()</a>, <a class="el" href="text_8php.html#aa5528f41533927e1bd2da3618a74a6d7">photo_new_resource()</a>, <a class="el" href="include_2photos_8php.html#a6c40ef58aefef705a5adc84a40e97109">photo_upload()</a>, <a class="el" href="include_2photos_8php.html#a8e8b7be99e24c2497bc2cb3339280c35">photos_album_exists()</a>, <a class="el" href="include_2photos_8php.html#a7e7abc69872180697c5471dc69349afe">photos_album_get_db_idstr()</a>, <a class="el" href="include_2photos_8php.html#ab0365f25b22ccea5f085fe7c49e1f4ab">photos_album_rename()</a>, <a class="el" href="include_2photos_8php.html#aedccaf18282b26899d9549c29bd9d1b9">photos_albums_list()</a>, <a class="el" href="mod_2photos_8php.html#aa87382611a66ec5effdb2d78f13f5812">photos_content()</a>, <a class="el" href="include_2photos_8php.html#aa27b9e435dcc34e1009f56dc02c7ca51">photos_list_photos()</a>, <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>, <a class="el" href="ping_8php.html#a77217b1b190b4c5d8770867b45f0c0a1">ping_init()</a>, <a class="el" href="poco_8php.html#a53def16f75e3d41f1d2bb7cfa4905498">poco_init()</a>, <a class="el" href="socgraph_8php.html#a5ef8bef37161df53718a21e93d02fbd6">poco_load()</a>, <a class="el" href="poke_8php.html#ac9190563a8da9c07a16f9dcd71cf6993">poke_content()</a>, <a class="el" href="poke_8php.html#a9725aab97b3983e6a98bd81c4efe7d3b">poke_init()</a>, <a class="el" href="poller_8php.html#a5f12df3a4738124b6c039971e87e76da">poller_run()</a>, <a class="el" href="items_8php.html#a410f9c743877c125ca06312373346903">post_activity_item()</a>, <a class="el" href="post_8php.html#af4b48181ce773ef0cdfc972441445c34">post_init()</a>, <a class="el" href="post_8php.html#af59e6a1dc22d19d9257b01cd7ccedb75">post_post()</a>, <a class="el" href="include_2message_8php.html#aed272d77c06a309e2836ac79e75613f1">private_messages_drop()</a>, <a class="el" href="include_2message_8php.html#a5f8de9847e203329e317ac38dc646898">private_messages_fetch_conversation()</a>, <a class="el" href="include_2message_8php.html#a254a756031e4d5e94f85e2939bdb5091">private_messages_fetch_message()</a>, <a class="el" href="include_2message_8php.html#a652973ce47a262f2d238c2fd6233d97e">private_messages_list()</a>, <a class="el" href="zot_8php.html#ac301c67864917c35922257950ae0f95c">process_channel_sync_delivery()</a>, <a class="el" href="zot_8php.html#a37ec13b18057634eadb071f05297f5e1">process_delivery()</a>, <a class="el" href="zot_8php.html#aa6ae96db8cbbdbb10e6876d206bbf7cc">process_mail_delivery()</a>, <a class="el" href="zot_8php.html#a9a57b40669351c9791126b925cb7ef3b">process_profile_delivery()</a>, <a class="el" href="profile_8php.html#ab5d0246be0552e2182a585c1206d22a5">profile_init()</a>, <a class="el" href="identity_8php.html#a4751b522ea913d0e7ed43e03d22e9e68">profile_load()</a>, <a class="el" href="profile__photo_8php.html#a4b80234074bd603221aa5364f330e479">profile_photo_post()</a>, <a class="el" href="identity_8php.html#a432259b2cf5b6f59be53e71db9f2c7dc">profile_sidebar()</a>, <a class="el" href="profiles_8php.html#a46975783b8b8d70402d51487eb1f0b00">profiles_content()</a>, <a class="el" href="profiles_8php.html#a36f71405ad536228f8bb84a551b23f7e">profiles_init()</a>, <a class="el" href="profiles_8php.html#ab0362c81b1d3b0b12a772b9fac446e04">profiles_post()</a>, <a class="el" href="profperm_8php.html#aef015787de2373d9fb3fe3f814fb5023">profperm_content()</a>, <a class="el" href="zot_8php.html#a083aec6c900d244e1bfc1406f9461465">public_recips()</a>, <a class="el" href="classRedFile.html#a41a49a583eb276b75626fcf97f4a699c">RedFile\put()</a>, <a class="el" href="queue_8php.html#af8c93de86d866c3200174c8450a0f341">queue_run()</a>, <a class="el" href="Contact_8php.html#a852fa476f0c70bde10a4f2533aec5f71">random_profile()</a>, <a class="el" href="Contact_8php.html#a2f4f495d53f2a334ab75292af79d3c91">rconnect_url()</a>, <a class="el" href="items_8php.html#a4e6d7639431e0dd8e9f4dba8e1ac408b">red_zrl_callback()</a>, <a class="el" href="reddav_8php.html#ae92ea0df1993f6a7bcd1b6efa6c1fb66">RedChannelList()</a>, <a class="el" href="reddav_8php.html#a5df0d09893f2e65dc5cf6bbab6cfb266">RedCollectionData()</a>, <a class="el" href="reddav_8php.html#a9f531641dfb4e43cd88ac1a9ae7e2088">RedFileData()</a>, <a class="el" href="session_8php.html#af230b86bfff7db66c3bdd7e0bbc24052">ref_session_destroy()</a>, <a class="el" href="session_8php.html#ac95373f4966862a028033dd2f94d4da1">ref_session_gc()</a>, <a class="el" href="session_8php.html#a7f0f50576360d9ba52d29364e0b83a8e">ref_session_read()</a>, <a class="el" href="session_8php.html#ac4461c1984543d3553e73dba2771568f">ref_session_write()</a>, <a class="el" href="register_8php.html#a0e91f57f111407ea8d3223a05022bb2a">register_content()</a>, <a class="el" href="plugin_8php.html#a425472c5f3afc137268b2ad45652b209">register_hook()</a>, <a class="el" href="register_8php.html#a51731dcc1917c58a790eb1c0f6132271">register_post()</a>, <a class="el" href="plugin_8php.html#af9ac19004dca49adae1ac7a0d9f3b025">reload_plugins()</a>, <a class="el" href="Contact_8php.html#acc12cda999c88c4d6185cca967c15125">remove_all_xchan_resources()</a>, <a class="el" href="zot_8php.html#aad25a3fe0e1566121d6fb8222979bc10">remove_community_tag()</a>, <a class="el" href="queue__fn_8php.html#a8fe71e981399bbf5d000a6ca42f57b24">remove_queue_item()</a>, <a class="el" href="rmagic_8php.html#a95455edd43f1bff39446a57388cdde16">rmagic_init()</a>, <a class="el" href="rmagic_8php.html#a869de069d081b3c4e98b957d06bbf08f">rmagic_post()</a>, <a class="el" href="classphoto__driver.html#a5864fae7d8389372955a8e78cec527ac">photo_driver\save()</a>, <a class="el" href="search__ac_8php.html#a14f90c83a3f2be095e9e2992a8d66138">search_ac_init()</a>, <a class="el" href="search_8php.html#ab2568591359edde5b483a6cd9a24b2cc">search_content()</a>, <a class="el" href="include_2message_8php.html#a751ffd6635022b2190f56154ee745752">send_message()</a>, <a class="el" href="account_8php.html#a014de2d5d5c9785de5bf547a485822fa">send_reg_approval_email()</a>, <a class="el" href="items_8php.html#aab9e0c58247427126de0699c729c3b6c">send_status_notifications()</a>, <a class="el" href="plugin_8php.html#a030cec6793b909c439c0336ba39b1571">service_class_allows()</a>, <a class="el" href="plugin_8php.html#a905b54e10704b283ac64680a8abc0971">service_class_fetch()</a>, <a class="el" href="classCache.html#ae622b82adc1c2fb1f3e2cc4fd9688fce">Cache\set()</a>, <a class="el" href="include_2config_8php.html#ad6da879e4fb5b37d1e161d4e9be5c32a">set_config()</a>, <a class="el" href="identity_8php.html#a78151baf4407a8482d2681a91a9c486b">set_default_login_identity()</a>, <a class="el" href="include_2config_8php.html#a61591371cb18764138655d67dc817ab2">set_pconfig()</a>, <a class="el" href="include_2config_8php.html#afe117b70f1bba2f6348d9300b601f86e">set_xconfig()</a>, <a class="el" href="classRedFile.html#a38a82bfc1b30028ea6ac75923e90fa25">RedFile\setName()</a>, <a class="el" href="settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586">settings_post()</a>, <a class="el" href="setup_8php.html#a88247384a96e14516f474d7af6a465c1">setup_content()</a>, <a class="el" href="share_8php.html#afeb26046bdd02567ecd29ab5f188b249">share_init()</a>, <a class="el" href="siteinfo_8php.html#a70c09bfb6dd1c86a125a35f62ed53656">siteinfo_content()</a>, <a class="el" href="siteinfo_8php.html#a3efbd0bd6564af19ec0a9ce0294e59d0">siteinfo_init()</a>, <a class="el" href="sitelist_8php.html#a665a59bf60f780b40f32c909f4a473b1">sitelist_init()</a>, <a class="el" href="sources_8php.html#ac442ccef080ab95772d8929fcafcb4b7">sources_content()</a>, <a class="el" href="sources_8php.html#ac73298ff162ce7b2de8dcaf3d3305b1e">sources_post()</a>, <a class="el" href="starred_8php.html#a63024fb418c678e49fd535e3752d349a">starred_init()</a>, <a class="el" href="classphoto__driver.html#a642a8d0c4ad5f887c99c6af77cee287b">photo_driver\store()</a>, <a class="el" href="taxonomy_8php.html#a4ba1339b2a7054971178ce194e4440fd">store_item_tag()</a>, <a class="el" href="security_8php.html#ae92c5c1a1cbbc49ddbb8b3265d2db809">stream_perms_api_uids()</a>, <a class="el" href="security_8php.html#a15e0f8f511cc06192db63387f97238b3">stream_perms_xchans()</a>, <a class="el" href="subthread_8php.html#a50368f3d825b77996030528e7fbfa3d3">subthread_content()</a>, <a class="el" href="suggest_8php.html#a696acf1dd8070e479adcc80c63c6718c">suggest_init()</a>, <a class="el" href="socgraph_8php.html#a76e6fca3d2bc842dcd9e710bb87c8329">suggestion_query()</a>, <a class="el" href="dir__fns_8php.html#aa666e7df6ca8c332f4081c9b66b4bdf6">sync_directories()</a>, <a class="el" href="dir__fns_8php.html#a6cae22cfdd6edda5ddf09e07abb3242a">syncdirs()</a>, <a class="el" href="items_8php.html#ab1bce4261bcf75ad62753b498a144d17">tag_deliver()</a>, <a class="el" href="taxonomy_8php.html#aaf90ba8b839d6459065f39a4f1109b8a">tagadelic()</a>, <a class="el" href="tagger_8php.html#a0e4a3eb177d1684553c547503d67161c">tagger_content()</a>, <a class="el" href="tagrm_8php.html#adfd4ea5b4d7fc6d9c9e042af5cd7d49a">tagrm_content()</a>, <a class="el" href="tagrm_8php.html#a1702f40aa53a2fa93deade1f609abe78">tagrm_post()</a>, <a class="el" href="items_8php.html#a88c6cf7649ac836fbbed82a7a0315110">tgroup_check()</a>, <a class="el" href="thing_8php.html#a24a35f1e64029a67fdbea94a776ae04b">thing_content()</a>, <a class="el" href="thing_8php.html#a8be23b1d475ec3d9291999221c674c80">thing_init()</a>, <a class="el" href="plugin_8php.html#a093a9cb98f51e3643634bd8bc6ed6e76">uninstall_plugin()</a>, <a class="el" href="plugin_8php.html#a56f71fe5adf9586ce950523d8180443e">unregister_hook()</a>, <a class="el" href="dir__fns_8php.html#a44062d4b471d1e83f92f6c184585aa13">update_directory_entry()</a>, <a class="el" href="zot_8php.html#ab319d1d9fff9c7775d9daef42d1f33dd">update_modtime()</a>, <a class="el" href="queue__fn_8php.html#a4c2876181f75a4a61e85b7f00dfdbba1">update_queue_time()</a>, <a class="el" href="items_8php.html#a2baa9e05f1e8aa3dd61c85803ae39bd6">update_remote_id()</a>, <a class="el" href="socgraph_8php.html#a790690bb1a1d02483fe31632a160144d">update_suggestions()</a>, <a class="el" href="account_8php.html#ac5c570a2d46446bad4dd2501e9c5a4b1">user_allow()</a>, <a class="el" href="account_8php.html#ac1653efba62493b9d87513e1b6c04c83">user_deny()</a>, <a class="el" href="classRedBasicAuth.html#a8dfd9a0953f8884723b421b7c1acf79b">RedBasicAuth\validateUserPass()</a>, <a class="el" href="Contact_8php.html#a6348a532c9d26cd1c9afbc9aa6aa8960">vcard_from_xchan()</a>, <a class="el" href="viewconnections_8php.html#ab6c4d983e97b3a8a879567ff76507776">viewconnections_content()</a>, <a class="el" href="viewsrc_8php.html#a6eff3d0c1d7d14b335c4edb785cd60a4">viewsrc_content()</a>, <a class="el" href="vote_8php.html#a6aa67489bf458ca5e3206e46dac68596">vote_content()</a>, <a class="el" href="vote_8php.html#ae0c6610f40afbbc1f4fe6494c51fbab2">vote_init()</a>, <a class="el" href="vote_8php.html#a57a9516ee1b923b224e66dcc47377fb2">vote_post()</a>, <a class="el" href="wall__attach_8php.html#a7385e970e93228d082f0fd7254f6e653">wall_attach_post()</a>, <a class="el" href="wall__upload_8php.html#a7cbe204244cf9e0380ee932263a74d8f">wall_upload_post()</a>, <a class="el" href="webpages_8php.html#af3b7397d4abc153e3d2147740ee1a41d">webpages_content()</a>, <a class="el" href="wfinger_8php.html#ae21e50c8d0a5f3c9be9f43a4e519acd3">wfinger_init()</a>, <a class="el" href="widgets_8php.html#a5ab3b64496e02cab56429978ad55f1c0">widget_filer()</a>, <a class="el" href="widgets_8php.html#ad1bf7aa69e8d100d95faba17c7bc91cd">widget_follow()</a>, <a class="el" href="widgets_8php.html#a94203eb9bcd63cbdecbbcb15163598d8">widget_savedsearch()</a>, <a class="el" href="widgets_8php.html#aaa73bcf1702eaadd9dcd253502f55e01">widget_settings_menu()</a>, <a class="el" href="xchan_8php.html#a9853348bf1a35c644460221ba75edc2d">xchan_content()</a>, <a class="el" href="text_8php.html#a543447c5ed766535221e2d9636b379ee">xchan_mail_query()</a>, <a class="el" href="text_8php.html#a36a2e5d418ee81140f25c4233cfecd1f">xchan_query()</a>, <a class="el" href="xrd_8php.html#aee3cf087968e4a0ff3a87de16eb23270">xrd_init()</a>, <a class="el" href="text_8php.html#a324c58f37f6acdf9cd1922aa76077d9f">z_input_filter()</a>, <a class="el" href="include_2attach_8php.html#aeb07968990e66a88c95483ca09a7f909">z_readdir()</a>, <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>, <a class="el" href="identity_8php.html#a680fbafc2db023c5b1309e0180e81315">zid_init()</a>, <a class="el" href="items_8php.html#a004e89d86b0f29b2c4da20108ecc4091">zot_feed()</a>, <a class="el" href="zot_8php.html#a95528377d7303131958c9f0b7158fdce">zot_finger()</a>, <a class="el" href="zot_8php.html#ae7cec2b417b5858fd4a41070f843d1d7">zot_get_hublocs()</a>, <a class="el" href="zot_8php.html#a55056e863a7860bc0cf922e78fcce073">zot_gethub()</a>, <a class="el" href="zot_8php.html#aeea071f17e306fe3d0c488551906bfab">zot_import()</a>, <a class="el" href="zot_8php.html#a928f5643ca66ae9635d85aeb2be62e03">zot_process_response()</a>, <a class="el" href="zot_8php.html#a7b23bfb31d4491231e1e73bdc077240d">zot_refresh()</a>, and <a class="el" href="zotfeed_8php.html#a24dfc23d366e7f840cf2847d0c1c8eac">zotfeed_init()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/dba__driver_8php.js b/doc/html/dba__driver_8php.js
new file mode 100644
index 000000000..425133552
--- /dev/null
+++ b/doc/html/dba__driver_8php.js
@@ -0,0 +1,12 @@
+var dba__driver_8php =
+[
+ [ "dba_driver", "classdba__driver.html", "classdba__driver" ],
+ [ "dba_factory", "dba__driver_8php.html#ac10e60f6e5b95bcf67bd82cb88f37947", null ],
+ [ "dbesc", "dba__driver_8php.html#ab222aa1dbf9ea93b320f82028739127e", null ],
+ [ "dbesc_array", "dba__driver_8php.html#a65b83462bd26968106aebd43f16540e4", null ],
+ [ "dbesc_array_cb", "dba__driver_8php.html#af531546fac5f0836a8557a4f6dfee930", null ],
+ [ "dbg", "dba__driver_8php.html#aa6607893d8f60ade9122bcfbd1a53ffb", null ],
+ [ "dbq", "dba__driver_8php.html#aa377074e70981e8c4e82ca0accd068ee", null ],
+ [ "printable", "dba__driver_8php.html#a55bf30d8176967e682656b5be4ad9249", null ],
+ [ "q", "dba__driver_8php.html#a2c09a731d3b4fef41fed0e83db01be1f", null ]
+]; \ No newline at end of file
diff --git a/doc/html/dba__mysql_8php.html b/doc/html/dba__mysql_8php.html
new file mode 100644
index 000000000..da4db27d7
--- /dev/null
+++ b/doc/html/dba__mysql_8php.html
@@ -0,0 +1,120 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/dba/dba_mysql.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('dba__mysql_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Classes</a> </div>
+ <div class="headertitle">
+<div class="title">dba_mysql.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__mysql.html">dba_mysql</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/dba__mysqli_8php.html b/doc/html/dba__mysqli_8php.html
new file mode 100644
index 000000000..9f580d4e9
--- /dev/null
+++ b/doc/html/dba__mysqli_8php.html
@@ -0,0 +1,120 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/dba/dba_mysqli.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('dba__mysqli_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Classes</a> </div>
+ <div class="headertitle">
+<div class="title">dba_mysqli.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__mysqli.html">dba_mysqli</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/default_8php.html b/doc/html/default_8php.html
new file mode 100644
index 000000000..dbec1176a
--- /dev/null
+++ b/doc/html/default_8php.html
@@ -0,0 +1,133 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/php/default.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rhash-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('default_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle">
+<div class="title">default.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:a23bc1996b18e69c1a3ab44536613a762"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="default_8php.html#a23bc1996b18e69c1a3ab44536613a762">if</a> (<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>($<a class="el" href="mod__register_8php.html#a8db1899eeeb44dabd0904065b63627bb">page</a>,'htmlhead')) echo $<a class="el" href="mod__register_8php.html#a8db1899eeeb44dabd0904065b63627bb">page</a>['htmlhead']?&gt;&lt;/head &gt;&lt; body &gt;&lt;?php if(<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>($<a class="el" href="mod__register_8php.html#a8db1899eeeb44dabd0904065b63627bb">page</a></td></tr>
+<tr class="separator:a23bc1996b18e69c1a3ab44536613a762"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Variable Documentation</h2>
+<a class="anchor" id="a23bc1996b18e69c1a3ab44536613a762"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">if(<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>($<a class="el" href="mod__register_8php.html#a8db1899eeeb44dabd0904065b63627bb">page</a>,'htmlhead')) echo $<a class="el" href="mod__register_8php.html#a8db1899eeeb44dabd0904065b63627bb">page</a>['htmlhead']?&gt;&lt;/head &gt;&lt; body &gt;&lt;?php if(<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>($<a class="el" href="mod__register_8php.html#a8db1899eeeb44dabd0904065b63627bb">page</a></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/default_8php.js b/doc/html/default_8php.js
new file mode 100644
index 000000000..164421dc5
--- /dev/null
+++ b/doc/html/default_8php.js
@@ -0,0 +1,4 @@
+var default_8php =
+[
+ [ "if", "default_8php.html#a23bc1996b18e69c1a3ab44536613a762", null ]
+]; \ No newline at end of file
diff --git a/doc/html/delegate_8php.html b/doc/html/delegate_8php.html
new file mode 100644
index 000000000..3793b633e
--- /dev/null
+++ b/doc/html/delegate_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/delegate.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('delegate_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">delegate.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a943eea8996ef348eb845c498f9f354dd"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="delegate_8php.html#a943eea8996ef348eb845c498f9f354dd">delegate_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a943eea8996ef348eb845c498f9f354dd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a943eea8996ef348eb845c498f9f354dd"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">delegate_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/delegate_8php.js b/doc/html/delegate_8php.js
new file mode 100644
index 000000000..0c96c49de
--- /dev/null
+++ b/doc/html/delegate_8php.js
@@ -0,0 +1,4 @@
+var delegate_8php =
+[
+ [ "delegate_content", "delegate_8php.html#a943eea8996ef348eb845c498f9f354dd", null ]
+]; \ No newline at end of file
diff --git a/doc/html/deliver_8php.html b/doc/html/deliver_8php.html
new file mode 100644
index 000000000..4d1770429
--- /dev/null
+++ b/doc/html/deliver_8php.html
@@ -0,0 +1,147 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/deliver.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('deliver_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">deliver.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a397afcb9afecf0c1816b0951189dd346"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="deliver_8php.html#a397afcb9afecf0c1816b0951189dd346">deliver_run</a> ($<a class="el" href="boot_8php.html#a768f00b7d66be0daf7ef4eea2e862006">argv</a>, $<a class="el" href="boot_8php.html#abc0a90a1a77f5b668aa7e4b57d1776a7">argc</a>)</td></tr>
+<tr class="separator:a397afcb9afecf0c1816b0951189dd346"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a397afcb9afecf0c1816b0951189dd346"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">deliver_run </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$argv</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$argc</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/deliver_8php.js b/doc/html/deliver_8php.js
new file mode 100644
index 000000000..7e8a08223
--- /dev/null
+++ b/doc/html/deliver_8php.js
@@ -0,0 +1,4 @@
+var deliver_8php =
+[
+ [ "deliver_run", "deliver_8php.html#a397afcb9afecf0c1816b0951189dd346", null ]
+]; \ No newline at end of file
diff --git a/doc/html/dir_032dd9e2cfe278a2cfa5eb9547448eb9.html b/doc/html/dir_032dd9e2cfe278a2cfa5eb9547448eb9.html
new file mode 100644
index 000000000..be89737ea
--- /dev/null
+++ b/doc/html/dir_032dd9e2cfe278a2cfa5eb9547448eb9.html
@@ -0,0 +1,118 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/redbasic/php Directory Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('dir_032dd9e2cfe278a2cfa5eb9547448eb9.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">php Directory Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
+Files</h2></td></tr>
+<tr class="memitem:view_2theme_2redbasic_2php_2config_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="view_2theme_2redbasic_2php_2config_8php.html">config.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:redbasic_2php_2style_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="redbasic_2php_2style_8php.html">style.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:redbasic_2php_2theme_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="redbasic_2php_2theme_8php.html">theme.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:theme_2redbasic_2php_2theme__init_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="theme_2redbasic_2php_2theme__init_8php.html">theme_init.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/dir_032dd9e2cfe278a2cfa5eb9547448eb9.js b/doc/html/dir_032dd9e2cfe278a2cfa5eb9547448eb9.js
new file mode 100644
index 000000000..7633187b3
--- /dev/null
+++ b/doc/html/dir_032dd9e2cfe278a2cfa5eb9547448eb9.js
@@ -0,0 +1,7 @@
+var dir_032dd9e2cfe278a2cfa5eb9547448eb9 =
+[
+ [ "config.php", "view_2theme_2redbasic_2php_2config_8php.html", "view_2theme_2redbasic_2php_2config_8php" ],
+ [ "style.php", "redbasic_2php_2style_8php.html", "redbasic_2php_2style_8php" ],
+ [ "theme.php", "redbasic_2php_2theme_8php.html", "redbasic_2php_2theme_8php" ],
+ [ "theme_init.php", "theme_2redbasic_2php_2theme__init_8php.html", null ]
+]; \ No newline at end of file
diff --git a/doc/html/dir_05f4fba29266e8fd7869afcd6cefb5cb.html b/doc/html/dir_05f4fba29266e8fd7869afcd6cefb5cb.html
new file mode 100644
index 000000000..733c56cef
--- /dev/null
+++ b/doc/html/dir_05f4fba29266e8fd7869afcd6cefb5cb.html
@@ -0,0 +1,132 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/apw/schema Directory Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('dir_05f4fba29266e8fd7869afcd6cefb5cb.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">schema Directory Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
+Files</h2></td></tr>
+<tr class="memitem:darkness_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="darkness_8php.html">darkness.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:darknessleftaside_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="darknessleftaside_8php.html">darknessleftaside.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:darknessrightaside_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="darknessrightaside_8php.html">darknessrightaside.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:greenthumbnails_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="greenthumbnails_8php.html">greenthumbnails.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:minimalisticdarkness_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="minimalisticdarkness_8php.html">minimalisticdarkness.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:olddefault_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="olddefault_8php.html">olddefault.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:passion_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="passion_8php.html">passion.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:passionwide_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="passionwide_8php.html">passionwide.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:pine_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="pine_8php.html">pine.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:redbasic_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="redbasic_8php.html">redbasic.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:widedarkness_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="widedarkness_8php.html">widedarkness.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/dir_05f4fba29266e8fd7869afcd6cefb5cb.js b/doc/html/dir_05f4fba29266e8fd7869afcd6cefb5cb.js
new file mode 100644
index 000000000..c0f751065
--- /dev/null
+++ b/doc/html/dir_05f4fba29266e8fd7869afcd6cefb5cb.js
@@ -0,0 +1,14 @@
+var dir_05f4fba29266e8fd7869afcd6cefb5cb =
+[
+ [ "darkness.php", "darkness_8php.html", null ],
+ [ "darknessleftaside.php", "darknessleftaside_8php.html", null ],
+ [ "darknessrightaside.php", "darknessrightaside_8php.html", null ],
+ [ "greenthumbnails.php", "greenthumbnails_8php.html", null ],
+ [ "minimalisticdarkness.php", "minimalisticdarkness_8php.html", "minimalisticdarkness_8php" ],
+ [ "olddefault.php", "olddefault_8php.html", null ],
+ [ "passion.php", "passion_8php.html", null ],
+ [ "passionwide.php", "passionwide_8php.html", null ],
+ [ "pine.php", "pine_8php.html", null ],
+ [ "redbasic.php", "redbasic_8php.html", null ],
+ [ "widedarkness.php", "widedarkness_8php.html", null ]
+]; \ No newline at end of file
diff --git a/doc/html/dir_0eaa4a0adae8ba4811e133c6e594aeee.html b/doc/html/dir_0eaa4a0adae8ba4811e133c6e594aeee.html
new file mode 100644
index 000000000..7a5f77a99
--- /dev/null
+++ b/doc/html/dir_0eaa4a0adae8ba4811e133c6e594aeee.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: util/fpostit Directory Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('dir_0eaa4a0adae8ba4811e133c6e594aeee.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">fpostit Directory Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
+Files</h2></td></tr>
+<tr class="memitem:fpostit_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fpostit_8php.html">fpostit.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/dir_0eaa4a0adae8ba4811e133c6e594aeee.js b/doc/html/dir_0eaa4a0adae8ba4811e133c6e594aeee.js
new file mode 100644
index 000000000..b73b33dda
--- /dev/null
+++ b/doc/html/dir_0eaa4a0adae8ba4811e133c6e594aeee.js
@@ -0,0 +1,4 @@
+var dir_0eaa4a0adae8ba4811e133c6e594aeee =
+[
+ [ "fpostit.php", "fpostit_8php.html", "fpostit_8php" ]
+]; \ No newline at end of file
diff --git a/doc/html/dir_21bc5169ff11430004758be31dcfc6c4.html b/doc/html/dir_21bc5169ff11430004758be31dcfc6c4.html
new file mode 100644
index 000000000..51284f865
--- /dev/null
+++ b/doc/html/dir_21bc5169ff11430004758be31dcfc6c4.html
@@ -0,0 +1,116 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/dba Directory Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('dir_21bc5169ff11430004758be31dcfc6c4.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">dba Directory Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
+Files</h2></td></tr>
+<tr class="memitem:dba__driver_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dba__driver_8php.html">dba_driver.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:dba__mysql_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dba__mysql_8php.html">dba_mysql.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:dba__mysqli_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dba__mysqli_8php.html">dba_mysqli.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/dir_21bc5169ff11430004758be31dcfc6c4.js b/doc/html/dir_21bc5169ff11430004758be31dcfc6c4.js
new file mode 100644
index 000000000..7b0143847
--- /dev/null
+++ b/doc/html/dir_21bc5169ff11430004758be31dcfc6c4.js
@@ -0,0 +1,10 @@
+var dir_21bc5169ff11430004758be31dcfc6c4 =
+[
+ [ "dba_driver.php", "dba__driver_8php.html", "dba__driver_8php" ],
+ [ "dba_mysql.php", "dba__mysql_8php.html", [
+ [ "dba_mysql", "classdba__mysql.html", "classdba__mysql" ]
+ ] ],
+ [ "dba_mysqli.php", "dba__mysqli_8php.html", [
+ [ "dba_mysqli", "classdba__mysqli.html", "classdba__mysqli" ]
+ ] ]
+]; \ No newline at end of file
diff --git a/doc/html/dir_23ec12649285f9fabf3a6b7380226c28.html b/doc/html/dir_23ec12649285f9fabf3a6b7380226c28.html
new file mode 100644
index 000000000..44036cc73
--- /dev/null
+++ b/doc/html/dir_23ec12649285f9fabf3a6b7380226c28.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: util Directory Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('dir_23ec12649285f9fabf3a6b7380226c28.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">util Directory Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="subdirs"></a>
+Directories</h2></td></tr>
+<tr class="memitem:dir_0eaa4a0adae8ba4811e133c6e594aeee"><td class="memItemLeft" align="right" valign="top">directory &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir_0eaa4a0adae8ba4811e133c6e594aeee.html">fpostit</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:dir_720432dea4a717197ae070dbc42b8f20"><td class="memItemLeft" align="right" valign="top">directory &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir_720432dea4a717197ae070dbc42b8f20.html">wp</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
+Files</h2></td></tr>
+<tr class="memitem:db__update_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="db__update_8php.html">db_update.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:docblox__errorchecker_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="docblox__errorchecker_8php.html">docblox_errorchecker.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:extract_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="extract_8php.html">extract.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:friendica-to-smarty-tpl_8py"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="friendica-to-smarty-tpl_8py.html">friendica-to-smarty-tpl.py</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:php2po_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="php2po_8php.html">php2po.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:po2php_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="po2php_8php.html">po2php.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:tpldebug_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tpldebug_8php.html">tpldebug.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:typo_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="typo_8php.html">typo.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:typohelper_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="typohelper_8php.html">typohelper.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:updatetpl_8py"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="updatetpl_8py.html">updatetpl.py</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/dir_23ec12649285f9fabf3a6b7380226c28.js b/doc/html/dir_23ec12649285f9fabf3a6b7380226c28.js
new file mode 100644
index 000000000..e59a2a7c4
--- /dev/null
+++ b/doc/html/dir_23ec12649285f9fabf3a6b7380226c28.js
@@ -0,0 +1,15 @@
+var dir_23ec12649285f9fabf3a6b7380226c28 =
+[
+ [ "fpostit", "dir_0eaa4a0adae8ba4811e133c6e594aeee.html", "dir_0eaa4a0adae8ba4811e133c6e594aeee" ],
+ [ "wp", "dir_720432dea4a717197ae070dbc42b8f20.html", "dir_720432dea4a717197ae070dbc42b8f20" ],
+ [ "db_update.php", "db__update_8php.html", null ],
+ [ "docblox_errorchecker.php", "docblox__errorchecker_8php.html", "docblox__errorchecker_8php" ],
+ [ "extract.php", "extract_8php.html", "extract_8php" ],
+ [ "friendica-to-smarty-tpl.py", "friendica-to-smarty-tpl_8py.html", "friendica-to-smarty-tpl_8py" ],
+ [ "php2po.php", "php2po_8php.html", "php2po_8php" ],
+ [ "po2php.php", "po2php_8php.html", "po2php_8php" ],
+ [ "tpldebug.php", "tpldebug_8php.html", "tpldebug_8php" ],
+ [ "typo.php", "typo_8php.html", "typo_8php" ],
+ [ "typohelper.php", "typohelper_8php.html", "typohelper_8php" ],
+ [ "updatetpl.py", "updatetpl_8py.html", "updatetpl_8py" ]
+]; \ No newline at end of file
diff --git a/doc/html/dir_25f74a9991dbbca1b52a94e358ca73c1.html b/doc/html/dir_25f74a9991dbbca1b52a94e358ca73c1.html
new file mode 100644
index 000000000..c5f57ad6f
--- /dev/null
+++ b/doc/html/dir_25f74a9991dbbca1b52a94e358ca73c1.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: util/wp/post_to_red Directory Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('dir_25f74a9991dbbca1b52a94e358ca73c1.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">post_to_red Directory Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
+Files</h2></td></tr>
+<tr class="memitem:post__to__red_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="post__to__red_8php.html">post_to_red.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/dir_25f74a9991dbbca1b52a94e358ca73c1.js b/doc/html/dir_25f74a9991dbbca1b52a94e358ca73c1.js
new file mode 100644
index 000000000..e521771ca
--- /dev/null
+++ b/doc/html/dir_25f74a9991dbbca1b52a94e358ca73c1.js
@@ -0,0 +1,4 @@
+var dir_25f74a9991dbbca1b52a94e358ca73c1 =
+[
+ [ "post_to_red.php", "post__to__red_8php.html", "post__to__red_8php" ]
+]; \ No newline at end of file
diff --git a/doc/html/dir_3d9c9d0c5e9556dd3eba1e072fa6eaeb.html b/doc/html/dir_3d9c9d0c5e9556dd3eba1e072fa6eaeb.html
new file mode 100644
index 000000000..52e50c910
--- /dev/null
+++ b/doc/html/dir_3d9c9d0c5e9556dd3eba1e072fa6eaeb.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/redbasic/schema Directory Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('dir_3d9c9d0c5e9556dd3eba1e072fa6eaeb.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">schema Directory Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
+Files</h2></td></tr>
+<tr class="memitem:dark_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dark_8php.html">dark.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/dir_3d9c9d0c5e9556dd3eba1e072fa6eaeb.js b/doc/html/dir_3d9c9d0c5e9556dd3eba1e072fa6eaeb.js
new file mode 100644
index 000000000..7889bb4f4
--- /dev/null
+++ b/doc/html/dir_3d9c9d0c5e9556dd3eba1e072fa6eaeb.js
@@ -0,0 +1,4 @@
+var dir_3d9c9d0c5e9556dd3eba1e072fa6eaeb =
+[
+ [ "dark.php", "dark_8php.html", null ]
+]; \ No newline at end of file
diff --git a/doc/html/dir_55dbaf9b7b53c4fc605c9011743a7353.html b/doc/html/dir_55dbaf9b7b53c4fc605c9011743a7353.html
new file mode 100644
index 000000000..382655c52
--- /dev/null
+++ b/doc/html/dir_55dbaf9b7b53c4fc605c9011743a7353.html
@@ -0,0 +1,114 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/redbasic Directory Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('dir_55dbaf9b7b53c4fc605c9011743a7353.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">redbasic Directory Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="subdirs"></a>
+Directories</h2></td></tr>
+<tr class="memitem:dir_032dd9e2cfe278a2cfa5eb9547448eb9"><td class="memItemLeft" align="right" valign="top">directory &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir_032dd9e2cfe278a2cfa5eb9547448eb9.html">php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:dir_3d9c9d0c5e9556dd3eba1e072fa6eaeb"><td class="memItemLeft" align="right" valign="top">directory &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir_3d9c9d0c5e9556dd3eba1e072fa6eaeb.html">schema</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/dir_55dbaf9b7b53c4fc605c9011743a7353.js b/doc/html/dir_55dbaf9b7b53c4fc605c9011743a7353.js
new file mode 100644
index 000000000..b48a368d3
--- /dev/null
+++ b/doc/html/dir_55dbaf9b7b53c4fc605c9011743a7353.js
@@ -0,0 +1,5 @@
+var dir_55dbaf9b7b53c4fc605c9011743a7353 =
+[
+ [ "php", "dir_032dd9e2cfe278a2cfa5eb9547448eb9.html", "dir_032dd9e2cfe278a2cfa5eb9547448eb9" ],
+ [ "schema", "dir_3d9c9d0c5e9556dd3eba1e072fa6eaeb.html", "dir_3d9c9d0c5e9556dd3eba1e072fa6eaeb" ]
+]; \ No newline at end of file
diff --git a/doc/html/dir_6b44a0e797e2f12381093380e3e54763.html b/doc/html/dir_6b44a0e797e2f12381093380e3e54763.html
new file mode 100644
index 000000000..2492bfb49
--- /dev/null
+++ b/doc/html/dir_6b44a0e797e2f12381093380e3e54763.html
@@ -0,0 +1,120 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/redstrap/php Directory Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rhash-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('dir_6b44a0e797e2f12381093380e3e54763.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">php Directory Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
+Files</h2></td></tr>
+<tr class="memitem:view_2theme_2redstrap_2php_2config_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="view_2theme_2redstrap_2php_2config_8php.html">config.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:theme_2redstrap_2php_2default_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="theme_2redstrap_2php_2default_8php.html">default.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:redstrap_2php_2style_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="redstrap_2php_2style_8php.html">style.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:redstrap_2php_2theme_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="redstrap_2php_2theme_8php.html">theme.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:theme_2redstrap_2php_2theme__init_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="theme_2redstrap_2php_2theme__init_8php.html">theme_init.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/dir_6b44a0e797e2f12381093380e3e54763.js b/doc/html/dir_6b44a0e797e2f12381093380e3e54763.js
new file mode 100644
index 000000000..04783bb16
--- /dev/null
+++ b/doc/html/dir_6b44a0e797e2f12381093380e3e54763.js
@@ -0,0 +1,8 @@
+var dir_6b44a0e797e2f12381093380e3e54763 =
+[
+ [ "config.php", "view_2theme_2redstrap_2php_2config_8php.html", "view_2theme_2redstrap_2php_2config_8php" ],
+ [ "default.php", "theme_2redstrap_2php_2default_8php.html", "theme_2redstrap_2php_2default_8php" ],
+ [ "style.php", "redstrap_2php_2style_8php.html", "redstrap_2php_2style_8php" ],
+ [ "theme.php", "redstrap_2php_2theme_8php.html", "redstrap_2php_2theme_8php" ],
+ [ "theme_init.php", "theme_2redstrap_2php_2theme__init_8php.html", null ]
+]; \ No newline at end of file
diff --git a/doc/html/dir_6cee3bb9ace89cc4e2f065aa2ca7bc5b.html b/doc/html/dir_6cee3bb9ace89cc4e2f065aa2ca7bc5b.html
new file mode 100644
index 000000000..60379cb00
--- /dev/null
+++ b/doc/html/dir_6cee3bb9ace89cc4e2f065aa2ca7bc5b.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/blogga/view/theme Directory Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('dir_6cee3bb9ace89cc4e2f065aa2ca7bc5b.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">theme Directory Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="subdirs"></a>
+Directories</h2></td></tr>
+<tr class="memitem:dir_a8a0005c2b8590c535262d232c22afab"><td class="memItemLeft" align="right" valign="top">directory &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir_a8a0005c2b8590c535262d232c22afab.html">blog</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/dir_6cee3bb9ace89cc4e2f065aa2ca7bc5b.js b/doc/html/dir_6cee3bb9ace89cc4e2f065aa2ca7bc5b.js
new file mode 100644
index 000000000..ae90f9671
--- /dev/null
+++ b/doc/html/dir_6cee3bb9ace89cc4e2f065aa2ca7bc5b.js
@@ -0,0 +1,4 @@
+var dir_6cee3bb9ace89cc4e2f065aa2ca7bc5b =
+[
+ [ "blog", "dir_a8a0005c2b8590c535262d232c22afab.html", "dir_a8a0005c2b8590c535262d232c22afab" ]
+]; \ No newline at end of file
diff --git a/doc/html/dir_720432dea4a717197ae070dbc42b8f20.html b/doc/html/dir_720432dea4a717197ae070dbc42b8f20.html
new file mode 100644
index 000000000..1fe66c5e2
--- /dev/null
+++ b/doc/html/dir_720432dea4a717197ae070dbc42b8f20.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: util/wp Directory Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('dir_720432dea4a717197ae070dbc42b8f20.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">wp Directory Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="subdirs"></a>
+Directories</h2></td></tr>
+<tr class="memitem:dir_25f74a9991dbbca1b52a94e358ca73c1"><td class="memItemLeft" align="right" valign="top">directory &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir_25f74a9991dbbca1b52a94e358ca73c1.html">post_to_red</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/dir_720432dea4a717197ae070dbc42b8f20.js b/doc/html/dir_720432dea4a717197ae070dbc42b8f20.js
new file mode 100644
index 000000000..b394ccd3f
--- /dev/null
+++ b/doc/html/dir_720432dea4a717197ae070dbc42b8f20.js
@@ -0,0 +1,4 @@
+var dir_720432dea4a717197ae070dbc42b8f20 =
+[
+ [ "post_to_red", "dir_25f74a9991dbbca1b52a94e358ca73c1.html", "dir_25f74a9991dbbca1b52a94e358ca73c1" ]
+]; \ No newline at end of file
diff --git a/doc/html/dir_817f6d302394b98e59575acdb59998bc.html b/doc/html/dir_817f6d302394b98e59575acdb59998bc.html
new file mode 100644
index 000000000..d3e4273ec
--- /dev/null
+++ b/doc/html/dir_817f6d302394b98e59575acdb59998bc.html
@@ -0,0 +1,122 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/php Directory Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('dir_817f6d302394b98e59575acdb59998bc.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">php Directory Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
+Files</h2></td></tr>
+<tr class="memitem:php_2default_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="php_2default_8php.html">default.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:full_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="full_8php.html">full.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:minimal_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="minimal_8php.html">minimal.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:mod__import_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod__import_8php.html">mod_import.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:none_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="none_8php.html">none.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:php_2theme__init_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="php_2theme__init_8php.html">theme_init.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/dir_817f6d302394b98e59575acdb59998bc.js b/doc/html/dir_817f6d302394b98e59575acdb59998bc.js
new file mode 100644
index 000000000..5aad4b24b
--- /dev/null
+++ b/doc/html/dir_817f6d302394b98e59575acdb59998bc.js
@@ -0,0 +1,9 @@
+var dir_817f6d302394b98e59575acdb59998bc =
+[
+ [ "default.php", "php_2default_8php.html", "php_2default_8php" ],
+ [ "full.php", "full_8php.html", "full_8php" ],
+ [ "minimal.php", "minimal_8php.html", null ],
+ [ "mod_import.php", "mod__import_8php.html", "mod__import_8php" ],
+ [ "none.php", "none_8php.html", null ],
+ [ "theme_init.php", "php_2theme__init_8php.html", "php_2theme__init_8php" ]
+]; \ No newline at end of file
diff --git a/doc/html/dir_8543001e5d25368a6edede3e63efb554.html b/doc/html/dir_8543001e5d25368a6edede3e63efb554.html
new file mode 100644
index 000000000..c0ee68826
--- /dev/null
+++ b/doc/html/dir_8543001e5d25368a6edede3e63efb554.html
@@ -0,0 +1,116 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme Directory Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('dir_8543001e5d25368a6edede3e63efb554.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">theme Directory Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="subdirs"></a>
+Directories</h2></td></tr>
+<tr class="memitem:dir_d520c5cf583201d9437764f209363c22"><td class="memItemLeft" align="right" valign="top">directory &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir_d520c5cf583201d9437764f209363c22.html">apw</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:dir_922c77e958c99a98db92d38a3a349bf2"><td class="memItemLeft" align="right" valign="top">directory &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir_922c77e958c99a98db92d38a3a349bf2.html">blogga</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:dir_55dbaf9b7b53c4fc605c9011743a7353"><td class="memItemLeft" align="right" valign="top">directory &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir_55dbaf9b7b53c4fc605c9011743a7353.html">redbasic</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/dir_8543001e5d25368a6edede3e63efb554.js b/doc/html/dir_8543001e5d25368a6edede3e63efb554.js
new file mode 100644
index 000000000..29cbaeeef
--- /dev/null
+++ b/doc/html/dir_8543001e5d25368a6edede3e63efb554.js
@@ -0,0 +1,6 @@
+var dir_8543001e5d25368a6edede3e63efb554 =
+[
+ [ "apw", "dir_d520c5cf583201d9437764f209363c22.html", "dir_d520c5cf583201d9437764f209363c22" ],
+ [ "blogga", "dir_922c77e958c99a98db92d38a3a349bf2.html", "dir_922c77e958c99a98db92d38a3a349bf2" ],
+ [ "redbasic", "dir_55dbaf9b7b53c4fc605c9011743a7353.html", "dir_55dbaf9b7b53c4fc605c9011743a7353" ]
+]; \ No newline at end of file
diff --git a/doc/html/dir_8e4ceba158be32034f698ffd6810bb05.html b/doc/html/dir_8e4ceba158be32034f698ffd6810bb05.html
new file mode 100644
index 000000000..67c9c30f6
--- /dev/null
+++ b/doc/html/dir_8e4ceba158be32034f698ffd6810bb05.html
@@ -0,0 +1,122 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Project: view/theme/test Directory Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="r!-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Project
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('dir_8e4ceba158be32034f698ffd6810bb05.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">test Directory Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="subdirs"></a>
+Directories</h2></td></tr>
+<tr class="memitem:dir_955ae6074e6c84afe72925e364242b14"><td class="memItemLeft" align="right" valign="top">directory &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir_955ae6074e6c84afe72925e364242b14.html">php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="dir_b2f003339c516cc00c8cadcafbe82f13.html">view</a></li><li class="navelem"><a class="el" href="dir_8543001e5d25368a6edede3e63efb554.html">theme</a></li><li class="navelem"><a class="el" href="dir_8e4ceba158be32034f698ffd6810bb05.html">test</a></li>
+ <li class="footer">Generated on Tue Feb 26 2013 15:43:22 for The Red Project by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.3.1 </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/dir_8e4ceba158be32034f698ffd6810bb05.js b/doc/html/dir_8e4ceba158be32034f698ffd6810bb05.js
new file mode 100644
index 000000000..0b8eea955
--- /dev/null
+++ b/doc/html/dir_8e4ceba158be32034f698ffd6810bb05.js
@@ -0,0 +1,4 @@
+var dir_8e4ceba158be32034f698ffd6810bb05 =
+[
+ [ "php", "dir_955ae6074e6c84afe72925e364242b14.html", "dir_955ae6074e6c84afe72925e364242b14" ]
+]; \ No newline at end of file
diff --git a/doc/html/dir_922c77e958c99a98db92d38a3a349bf2.html b/doc/html/dir_922c77e958c99a98db92d38a3a349bf2.html
new file mode 100644
index 000000000..a8fed5c16
--- /dev/null
+++ b/doc/html/dir_922c77e958c99a98db92d38a3a349bf2.html
@@ -0,0 +1,114 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/blogga Directory Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('dir_922c77e958c99a98db92d38a3a349bf2.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">blogga Directory Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="subdirs"></a>
+Directories</h2></td></tr>
+<tr class="memitem:dir_c02447ad39a5307c81c64e880ec9e8d3"><td class="memItemLeft" align="right" valign="top">directory &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir_c02447ad39a5307c81c64e880ec9e8d3.html">php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:dir_92d6b429199666aa3765c8a934db5e14"><td class="memItemLeft" align="right" valign="top">directory &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir_92d6b429199666aa3765c8a934db5e14.html">view</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/dir_922c77e958c99a98db92d38a3a349bf2.js b/doc/html/dir_922c77e958c99a98db92d38a3a349bf2.js
new file mode 100644
index 000000000..d5e65e0d6
--- /dev/null
+++ b/doc/html/dir_922c77e958c99a98db92d38a3a349bf2.js
@@ -0,0 +1,5 @@
+var dir_922c77e958c99a98db92d38a3a349bf2 =
+[
+ [ "php", "dir_c02447ad39a5307c81c64e880ec9e8d3.html", "dir_c02447ad39a5307c81c64e880ec9e8d3" ],
+ [ "view", "dir_92d6b429199666aa3765c8a934db5e14.html", "dir_92d6b429199666aa3765c8a934db5e14" ]
+]; \ No newline at end of file
diff --git a/doc/html/dir_92d6b429199666aa3765c8a934db5e14.html b/doc/html/dir_92d6b429199666aa3765c8a934db5e14.html
new file mode 100644
index 000000000..fbd8bf9e8
--- /dev/null
+++ b/doc/html/dir_92d6b429199666aa3765c8a934db5e14.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/blogga/view Directory Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('dir_92d6b429199666aa3765c8a934db5e14.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">view Directory Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="subdirs"></a>
+Directories</h2></td></tr>
+<tr class="memitem:dir_6cee3bb9ace89cc4e2f065aa2ca7bc5b"><td class="memItemLeft" align="right" valign="top">directory &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir_6cee3bb9ace89cc4e2f065aa2ca7bc5b.html">theme</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/dir_92d6b429199666aa3765c8a934db5e14.js b/doc/html/dir_92d6b429199666aa3765c8a934db5e14.js
new file mode 100644
index 000000000..2a2dd8dc9
--- /dev/null
+++ b/doc/html/dir_92d6b429199666aa3765c8a934db5e14.js
@@ -0,0 +1,4 @@
+var dir_92d6b429199666aa3765c8a934db5e14 =
+[
+ [ "theme", "dir_6cee3bb9ace89cc4e2f065aa2ca7bc5b.html", "dir_6cee3bb9ace89cc4e2f065aa2ca7bc5b" ]
+]; \ No newline at end of file
diff --git a/doc/html/dir_955ae6074e6c84afe72925e364242b14.html b/doc/html/dir_955ae6074e6c84afe72925e364242b14.html
new file mode 100644
index 000000000..d031ec14f
--- /dev/null
+++ b/doc/html/dir_955ae6074e6c84afe72925e364242b14.html
@@ -0,0 +1,122 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Project: view/theme/test/php Directory Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="r!-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Project
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('dir_955ae6074e6c84afe72925e364242b14.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">php Directory Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
+Files</h2></td></tr>
+<tr class="memitem:test_2php_2theme_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="test_2php_2theme_8php.html">theme.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="dir_b2f003339c516cc00c8cadcafbe82f13.html">view</a></li><li class="navelem"><a class="el" href="dir_8543001e5d25368a6edede3e63efb554.html">theme</a></li><li class="navelem"><a class="el" href="dir_8e4ceba158be32034f698ffd6810bb05.html">test</a></li><li class="navelem"><a class="el" href="dir_955ae6074e6c84afe72925e364242b14.html">php</a></li>
+ <li class="footer">Generated on Tue Feb 26 2013 15:43:22 for The Red Project by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.3.1 </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/dir_955ae6074e6c84afe72925e364242b14.js b/doc/html/dir_955ae6074e6c84afe72925e364242b14.js
new file mode 100644
index 000000000..427747272
--- /dev/null
+++ b/doc/html/dir_955ae6074e6c84afe72925e364242b14.js
@@ -0,0 +1,4 @@
+var dir_955ae6074e6c84afe72925e364242b14 =
+[
+ [ "theme.php", "test_2php_2theme_8php.html", "test_2php_2theme_8php" ]
+]; \ No newline at end of file
diff --git a/doc/html/dir__fns_8php.html b/doc/html/dir__fns_8php.html
new file mode 100644
index 000000000..a5b8f1cee
--- /dev/null
+++ b/doc/html/dir__fns_8php.html
@@ -0,0 +1,237 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/dir_fns.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('dir__fns_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">dir_fns.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a8c15aa69da12f2d3476b9e93b82b337d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir__fns_8php.html#a8c15aa69da12f2d3476b9e93b82b337d">find_upstream_directory</a> ($dirmode)</td></tr>
+<tr class="separator:a8c15aa69da12f2d3476b9e93b82b337d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae56881d69bb6f8e828c9e35454386774"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir__fns_8php.html#ae56881d69bb6f8e828c9e35454386774">dir_sort_links</a> ()</td></tr>
+<tr class="separator:ae56881d69bb6f8e828c9e35454386774"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acf621621e929d49441da30aad76a58cf"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir__fns_8php.html#acf621621e929d49441da30aad76a58cf">dir_safe_mode</a> ()</td></tr>
+<tr class="separator:acf621621e929d49441da30aad76a58cf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa666e7df6ca8c332f4081c9b66b4bdf6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir__fns_8php.html#aa666e7df6ca8c332f4081c9b66b4bdf6">sync_directories</a> ($dirmode)</td></tr>
+<tr class="separator:aa666e7df6ca8c332f4081c9b66b4bdf6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a44062d4b471d1e83f92f6c184585aa13"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir__fns_8php.html#a44062d4b471d1e83f92f6c184585aa13">update_directory_entry</a> ($ud)</td></tr>
+<tr class="separator:a44062d4b471d1e83f92f6c184585aa13"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6cae22cfdd6edda5ddf09e07abb3242a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir__fns_8php.html#a6cae22cfdd6edda5ddf09e07abb3242a">syncdirs</a> ($uid)</td></tr>
+<tr class="separator:a6cae22cfdd6edda5ddf09e07abb3242a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="acf621621e929d49441da30aad76a58cf"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">dir_safe_mode </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="widgets_8php.html#a268b01ce1ab8fe2cb346cb769b9d1091">widget_dirsafemode()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ae56881d69bb6f8e828c9e35454386774"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">dir_sort_links </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="widgets_8php.html#a95c06bc9be133e89768746302d2ac395">widget_dirsort()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a8c15aa69da12f2d3476b9e93b82b337d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">find_upstream_directory </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$dirmode</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="mod_2directory_8php.html#aac79396570d759da2efac24fcedf5b44">directory_content()</a>, <a class="el" href="include_2directory_8php.html#aa75d3b0697ca1456aaabdb37a74aa0f0">directory_run()</a>, <a class="el" href="dirprofile_8php.html#a3e1d30d3d93863ff5615f2df4ac7f052">dirprofile_init()</a>, <a class="el" href="acl_8php.html#a57dceff370d4a0e7ae673d50fbfda61f">navbar_complete()</a>, <a class="el" href="pubsites_8php.html#af614e279aab54065345bda6b03eafdf0">pubsites_content()</a>, and <a class="el" href="socgraph_8php.html#a790690bb1a1d02483fe31632a160144d">update_suggestions()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa666e7df6ca8c332f4081c9b66b4bdf6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">sync_directories </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$dirmode</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="poller_8php.html#a5f12df3a4738124b6c039971e87e76da">poller_run()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a6cae22cfdd6edda5ddf09e07abb3242a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">syncdirs </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2directory_8php.html#aa75d3b0697ca1456aaabdb37a74aa0f0">directory_run()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a44062d4b471d1e83f92f6c184585aa13"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">update_directory_entry </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$ud</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="onedirsync_8php.html#a411aedd47c57476099647961e6a86691">onedirsync_run()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/dir__fns_8php.js b/doc/html/dir__fns_8php.js
new file mode 100644
index 000000000..5531700f4
--- /dev/null
+++ b/doc/html/dir__fns_8php.js
@@ -0,0 +1,9 @@
+var dir__fns_8php =
+[
+ [ "dir_safe_mode", "dir__fns_8php.html#acf621621e929d49441da30aad76a58cf", null ],
+ [ "dir_sort_links", "dir__fns_8php.html#ae56881d69bb6f8e828c9e35454386774", null ],
+ [ "find_upstream_directory", "dir__fns_8php.html#a8c15aa69da12f2d3476b9e93b82b337d", null ],
+ [ "sync_directories", "dir__fns_8php.html#aa666e7df6ca8c332f4081c9b66b4bdf6", null ],
+ [ "syncdirs", "dir__fns_8php.html#a6cae22cfdd6edda5ddf09e07abb3242a", null ],
+ [ "update_directory_entry", "dir__fns_8php.html#a44062d4b471d1e83f92f6c184585aa13", null ]
+]; \ No newline at end of file
diff --git a/doc/html/dir_a8a0005c2b8590c535262d232c22afab.html b/doc/html/dir_a8a0005c2b8590c535262d232c22afab.html
new file mode 100644
index 000000000..dc599f8bb
--- /dev/null
+++ b/doc/html/dir_a8a0005c2b8590c535262d232c22afab.html
@@ -0,0 +1,116 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/blogga/view/theme/blog Directory Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('dir_a8a0005c2b8590c535262d232c22afab.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">blog Directory Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
+Files</h2></td></tr>
+<tr class="memitem:view_2theme_2blogga_2view_2theme_2blog_2config_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="view_2theme_2blogga_2view_2theme_2blog_2config_8php.html">config.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:theme_2blogga_2view_2theme_2blog_2default_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="theme_2blogga_2view_2theme_2blog_2default_8php.html">default.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:blogga_2view_2theme_2blog_2theme_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="blogga_2view_2theme_2blog_2theme_8php.html">theme.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/dir_a8a0005c2b8590c535262d232c22afab.js b/doc/html/dir_a8a0005c2b8590c535262d232c22afab.js
new file mode 100644
index 000000000..9311d8a78
--- /dev/null
+++ b/doc/html/dir_a8a0005c2b8590c535262d232c22afab.js
@@ -0,0 +1,6 @@
+var dir_a8a0005c2b8590c535262d232c22afab =
+[
+ [ "config.php", "view_2theme_2blogga_2view_2theme_2blog_2config_8php.html", "view_2theme_2blogga_2view_2theme_2blog_2config_8php" ],
+ [ "default.php", "theme_2blogga_2view_2theme_2blog_2default_8php.html", "theme_2blogga_2view_2theme_2blog_2default_8php" ],
+ [ "theme.php", "blogga_2view_2theme_2blog_2theme_8php.html", "blogga_2view_2theme_2blog_2theme_8php" ]
+]; \ No newline at end of file
diff --git a/doc/html/dir_aae29906d7bfc07d076125f669c8352e.html b/doc/html/dir_aae29906d7bfc07d076125f669c8352e.html
new file mode 100644
index 000000000..a12af8c64
--- /dev/null
+++ b/doc/html/dir_aae29906d7bfc07d076125f669c8352e.html
@@ -0,0 +1,116 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/photo Directory Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('dir_aae29906d7bfc07d076125f669c8352e.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">photo Directory Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
+Files</h2></td></tr>
+<tr class="memitem:photo__driver_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="photo__driver_8php.html">photo_driver.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:photo__gd_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="photo__gd_8php.html">photo_gd.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:photo__imagick_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="photo__imagick_8php.html">photo_imagick.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/dir_aae29906d7bfc07d076125f669c8352e.js b/doc/html/dir_aae29906d7bfc07d076125f669c8352e.js
new file mode 100644
index 000000000..c8fe31dc4
--- /dev/null
+++ b/doc/html/dir_aae29906d7bfc07d076125f669c8352e.js
@@ -0,0 +1,10 @@
+var dir_aae29906d7bfc07d076125f669c8352e =
+[
+ [ "photo_driver.php", "photo__driver_8php.html", "photo__driver_8php" ],
+ [ "photo_gd.php", "photo__gd_8php.html", [
+ [ "photo_gd", "classphoto__gd.html", "classphoto__gd" ]
+ ] ],
+ [ "photo_imagick.php", "photo__imagick_8php.html", [
+ [ "photo_imagick", "classphoto__imagick.html", "classphoto__imagick" ]
+ ] ]
+]; \ No newline at end of file
diff --git a/doc/html/dir_b2f003339c516cc00c8cadcafbe82f13.html b/doc/html/dir_b2f003339c516cc00c8cadcafbe82f13.html
new file mode 100644
index 000000000..4aa042ef0
--- /dev/null
+++ b/doc/html/dir_b2f003339c516cc00c8cadcafbe82f13.html
@@ -0,0 +1,114 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view Directory Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('dir_b2f003339c516cc00c8cadcafbe82f13.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">view Directory Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="subdirs"></a>
+Directories</h2></td></tr>
+<tr class="memitem:dir_817f6d302394b98e59575acdb59998bc"><td class="memItemLeft" align="right" valign="top">directory &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir_817f6d302394b98e59575acdb59998bc.html">php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:dir_8543001e5d25368a6edede3e63efb554"><td class="memItemLeft" align="right" valign="top">directory &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir_8543001e5d25368a6edede3e63efb554.html">theme</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/dir_b2f003339c516cc00c8cadcafbe82f13.js b/doc/html/dir_b2f003339c516cc00c8cadcafbe82f13.js
new file mode 100644
index 000000000..991623ea4
--- /dev/null
+++ b/doc/html/dir_b2f003339c516cc00c8cadcafbe82f13.js
@@ -0,0 +1,5 @@
+var dir_b2f003339c516cc00c8cadcafbe82f13 =
+[
+ [ "php", "dir_817f6d302394b98e59575acdb59998bc.html", "dir_817f6d302394b98e59575acdb59998bc" ],
+ [ "theme", "dir_8543001e5d25368a6edede3e63efb554.html", "dir_8543001e5d25368a6edede3e63efb554" ]
+]; \ No newline at end of file
diff --git a/doc/html/dir_c02447ad39a5307c81c64e880ec9e8d3.html b/doc/html/dir_c02447ad39a5307c81c64e880ec9e8d3.html
new file mode 100644
index 000000000..af53f8b58
--- /dev/null
+++ b/doc/html/dir_c02447ad39a5307c81c64e880ec9e8d3.html
@@ -0,0 +1,118 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/blogga/php Directory Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('dir_c02447ad39a5307c81c64e880ec9e8d3.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">php Directory Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
+Files</h2></td></tr>
+<tr class="memitem:view_2theme_2blogga_2php_2config_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="view_2theme_2blogga_2php_2config_8php.html">config.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:theme_2blogga_2php_2default_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="theme_2blogga_2php_2default_8php.html">default.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:blogga_2php_2theme_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="blogga_2php_2theme_8php.html">theme.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:theme_2blogga_2php_2theme__init_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="theme_2blogga_2php_2theme__init_8php.html">theme_init.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/dir_c02447ad39a5307c81c64e880ec9e8d3.js b/doc/html/dir_c02447ad39a5307c81c64e880ec9e8d3.js
new file mode 100644
index 000000000..9013b22b6
--- /dev/null
+++ b/doc/html/dir_c02447ad39a5307c81c64e880ec9e8d3.js
@@ -0,0 +1,7 @@
+var dir_c02447ad39a5307c81c64e880ec9e8d3 =
+[
+ [ "config.php", "view_2theme_2blogga_2php_2config_8php.html", "view_2theme_2blogga_2php_2config_8php" ],
+ [ "default.php", "theme_2blogga_2php_2default_8php.html", "theme_2blogga_2php_2default_8php" ],
+ [ "theme.php", "blogga_2php_2theme_8php.html", "blogga_2php_2theme_8php" ],
+ [ "theme_init.php", "theme_2blogga_2php_2theme__init_8php.html", null ]
+]; \ No newline at end of file
diff --git a/doc/html/dir_cb8a8f75dcdd0b3fbfcc82e9eda410c5.html b/doc/html/dir_cb8a8f75dcdd0b3fbfcc82e9eda410c5.html
new file mode 100644
index 000000000..d5d596a86
--- /dev/null
+++ b/doc/html/dir_cb8a8f75dcdd0b3fbfcc82e9eda410c5.html
@@ -0,0 +1,116 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/apw/php Directory Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('dir_cb8a8f75dcdd0b3fbfcc82e9eda410c5.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">php Directory Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
+Files</h2></td></tr>
+<tr class="memitem:view_2theme_2apw_2php_2config_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="view_2theme_2apw_2php_2config_8php.html">config.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:apw_2php_2style_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="apw_2php_2style_8php.html">style.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:apw_2php_2theme_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="apw_2php_2theme_8php.html">theme.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/dir_cb8a8f75dcdd0b3fbfcc82e9eda410c5.js b/doc/html/dir_cb8a8f75dcdd0b3fbfcc82e9eda410c5.js
new file mode 100644
index 000000000..749793501
--- /dev/null
+++ b/doc/html/dir_cb8a8f75dcdd0b3fbfcc82e9eda410c5.js
@@ -0,0 +1,6 @@
+var dir_cb8a8f75dcdd0b3fbfcc82e9eda410c5 =
+[
+ [ "config.php", "view_2theme_2apw_2php_2config_8php.html", "view_2theme_2apw_2php_2config_8php" ],
+ [ "style.php", "apw_2php_2style_8php.html", "apw_2php_2style_8php" ],
+ [ "theme.php", "apw_2php_2theme_8php.html", "apw_2php_2theme_8php" ]
+]; \ No newline at end of file
diff --git a/doc/html/dir_d41ce877eb409a4791b288730010abe2.html b/doc/html/dir_d41ce877eb409a4791b288730010abe2.html
new file mode 100644
index 000000000..a4780b265
--- /dev/null
+++ b/doc/html/dir_d41ce877eb409a4791b288730010abe2.html
@@ -0,0 +1,362 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod Directory Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('dir_d41ce877eb409a4791b288730010abe2.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">mod Directory Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
+Files</h2></td></tr>
+<tr class="memitem:__well__known_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="__well__known_8php.html">_well_known.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:achievements_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="achievements_8php.html">achievements.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acl_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="acl_8php.html">acl.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:admin_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="admin_8php.html">admin.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:mod_2api_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2api_8php.html">api.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:apps_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="apps_8php.html">apps.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:mod_2attach_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2attach_8php.html">attach.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:blocks_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="blocks_8php.html">blocks.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:mod_2chanman_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2chanman_8php.html">chanman.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:channel_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="channel_8php.html">channel.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:chanview_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="chanview_8php.html">chanview.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:cloud_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="cloud_8php.html">cloud.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:common_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="common_8php.html">common.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:community_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="community_8php.html">community.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:connect_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="connect_8php.html">connect.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:connections_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="connections_8php.html">connections.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:connedit_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="connedit_8php.html">connedit.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:contactgroup_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="contactgroup_8php.html">contactgroup.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:delegate_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="delegate_8php.html">delegate.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:mod_2directory_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2directory_8php.html">directory.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:dirprofile_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dirprofile_8php.html">dirprofile.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:dirsearch_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dirsearch_8php.html">dirsearch.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:display_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="display_8php.html">display.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:editblock_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="editblock_8php.html">editblock.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:editlayout_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="editlayout_8php.html">editlayout.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:editpost_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="editpost_8php.html">editpost.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:editwebpage_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="editwebpage_8php.html">editwebpage.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:events_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="events_8php.html">events.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:fbrowser_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fbrowser_8php.html">fbrowser.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:feed_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="feed_8php.html">feed.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:filer_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="filer_8php.html">filer.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:filerm_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="filerm_8php.html">filerm.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:filestorage_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="filestorage_8php.html">filestorage.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:mod_2follow_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2follow_8php.html">follow.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:fsuggest_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fsuggest_8php.html">fsuggest.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:mod_2group_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2group_8php.html">group.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:help_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="help_8php.html">help.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:home_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="home_8php.html">home.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:hostxrd_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="hostxrd_8php.html">hostxrd.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:import_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="import_8php.html">import.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:invite_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="invite_8php.html">invite.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:item_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="item_8php.html">item.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:layouts_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="layouts_8php.html">layouts.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:like_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="like_8php.html">like.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:lockview_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="lockview_8php.html">lockview.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:login_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="login_8php.html">login.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:lostpass_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="lostpass_8php.html">lostpass.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:magic_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="magic_8php.html">magic.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:mail_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mail_8php.html">mail.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:manage_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="manage_8php.html">manage.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:match_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="match_8php.html">match.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:mod_2menu_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2menu_8php.html">menu.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:mod_2message_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2message_8php.html">message.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:mitem_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mitem_8php.html">mitem.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:mood_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mood_8php.html">mood.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:msearch_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="msearch_8php.html">msearch.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:mod_2network_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2network_8php.html">network.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:new__channel_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="new__channel_8php.html">new_channel.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:notes_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="notes_8php.html">notes.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:notifications_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="notifications_8php.html">notifications.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:mod_2notify_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2notify_8php.html">notify.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:mod_2oembed_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2oembed_8php.html">oembed.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:oexchange_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="oexchange_8php.html">oexchange.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:opensearch_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="opensearch_8php.html">opensearch.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:page_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="page_8php.html">page.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:parse__url_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="parse__url_8php.html">parse_url.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:photo_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="photo_8php.html">photo.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:mod_2photos_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2photos_8php.html">photos.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:php_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="php_8php.html">php.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ping_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ping_8php.html">ping.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:poco_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="poco_8php.html">poco.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:poke_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="poke_8php.html">poke.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:post_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="post_8php.html">post.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:pretheme_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="pretheme_8php.html">pretheme.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:probe_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="probe_8php.html">probe.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:profile_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="profile_8php.html">profile.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:profile__photo_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="profile__photo_8php.html">profile_photo.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:profiles_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="profiles_8php.html">profiles.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:profperm_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="profperm_8php.html">profperm.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:pubsites_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="pubsites_8php.html">pubsites.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:randprof_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="randprof_8php.html">randprof.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:register_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="register_8php.html">register.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:regmod_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="regmod_8php.html">regmod.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:removeme_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="removeme_8php.html">removeme.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:rmagic_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="rmagic_8php.html">rmagic.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:rpost_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="rpost_8php.html">rpost.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:rsd__xml_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="rsd__xml_8php.html">rsd_xml.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:search_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="search_8php.html">search.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:search__ac_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="search__ac_8php.html">search_ac.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:settings_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="settings_8php.html">settings.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:setup_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="setup_8php.html">setup.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:share_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="share_8php.html">share.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:siteinfo_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="siteinfo_8php.html">siteinfo.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:sitelist_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="sitelist_8php.html">sitelist.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:smilies_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="smilies_8php.html">smilies.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:sources_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="sources_8php.html">sources.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:sslify_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="sslify_8php.html">sslify.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:starred_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="starred_8php.html">starred.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:subthread_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="subthread_8php.html">subthread.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:suggest_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="suggest_8php.html">suggest.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:tagger_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tagger_8php.html">tagger.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:tagrm_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tagrm_8php.html">tagrm.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:thing_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="thing_8php.html">thing.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:toggle__mobile_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="toggle__mobile_8php.html">toggle_mobile.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:toggle__safesearch_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="toggle__safesearch_8php.html">toggle_safesearch.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:uexport_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="uexport_8php.html">uexport.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:update__channel_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="update__channel_8php.html">update_channel.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:update__community_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="update__community_8php.html">update_community.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:update__display_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="update__display_8php.html">update_display.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:update__network_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="update__network_8php.html">update_network.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:update__search_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="update__search_8php.html">update_search.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:view_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="view_8php.html">view.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:viewconnections_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="viewconnections_8php.html">viewconnections.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:viewsrc_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="viewsrc_8php.html">viewsrc.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:vote_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vote_8php.html">vote.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:wall__attach_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="wall__attach_8php.html">wall_attach.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:wall__upload_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="wall__upload_8php.html">wall_upload.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:webfinger_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="webfinger_8php.html">webfinger.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:webpages_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="webpages_8php.html">webpages.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:wfinger_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="wfinger_8php.html">wfinger.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:xchan_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xchan_8php.html">xchan.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:xrd_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xrd_8php.html">xrd.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:xref_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xref_8php.html">xref.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:zfinger_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="zfinger_8php.html">zfinger.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:zotfeed_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="zotfeed_8php.html">zotfeed.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:zping_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="zping_8php.html">zping.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/dir_d41ce877eb409a4791b288730010abe2.js b/doc/html/dir_d41ce877eb409a4791b288730010abe2.js
new file mode 100644
index 000000000..17ed67b37
--- /dev/null
+++ b/doc/html/dir_d41ce877eb409a4791b288730010abe2.js
@@ -0,0 +1,129 @@
+var dir_d41ce877eb409a4791b288730010abe2 =
+[
+ [ "_well_known.php", "__well__known_8php.html", "__well__known_8php" ],
+ [ "achievements.php", "achievements_8php.html", "achievements_8php" ],
+ [ "acl.php", "acl_8php.html", "acl_8php" ],
+ [ "admin.php", "admin_8php.html", "admin_8php" ],
+ [ "api.php", "mod_2api_8php.html", "mod_2api_8php" ],
+ [ "apps.php", "apps_8php.html", "apps_8php" ],
+ [ "attach.php", "mod_2attach_8php.html", "mod_2attach_8php" ],
+ [ "blocks.php", "blocks_8php.html", "blocks_8php" ],
+ [ "chanman.php", "mod_2chanman_8php.html", null ],
+ [ "channel.php", "channel_8php.html", "channel_8php" ],
+ [ "chanview.php", "chanview_8php.html", "chanview_8php" ],
+ [ "cloud.php", "cloud_8php.html", "cloud_8php" ],
+ [ "common.php", "common_8php.html", "common_8php" ],
+ [ "community.php", "community_8php.html", "community_8php" ],
+ [ "connect.php", "connect_8php.html", "connect_8php" ],
+ [ "connections.php", "connections_8php.html", "connections_8php" ],
+ [ "connedit.php", "connedit_8php.html", "connedit_8php" ],
+ [ "contactgroup.php", "contactgroup_8php.html", "contactgroup_8php" ],
+ [ "delegate.php", "delegate_8php.html", "delegate_8php" ],
+ [ "directory.php", "mod_2directory_8php.html", "mod_2directory_8php" ],
+ [ "dirprofile.php", "dirprofile_8php.html", "dirprofile_8php" ],
+ [ "dirsearch.php", "dirsearch_8php.html", "dirsearch_8php" ],
+ [ "display.php", "display_8php.html", "display_8php" ],
+ [ "editblock.php", "editblock_8php.html", "editblock_8php" ],
+ [ "editlayout.php", "editlayout_8php.html", "editlayout_8php" ],
+ [ "editpost.php", "editpost_8php.html", "editpost_8php" ],
+ [ "editwebpage.php", "editwebpage_8php.html", "editwebpage_8php" ],
+ [ "events.php", "events_8php.html", "events_8php" ],
+ [ "fbrowser.php", "fbrowser_8php.html", "fbrowser_8php" ],
+ [ "feed.php", "feed_8php.html", "feed_8php" ],
+ [ "filer.php", "filer_8php.html", "filer_8php" ],
+ [ "filerm.php", "filerm_8php.html", "filerm_8php" ],
+ [ "filestorage.php", "filestorage_8php.html", "filestorage_8php" ],
+ [ "follow.php", "mod_2follow_8php.html", "mod_2follow_8php" ],
+ [ "fsuggest.php", "fsuggest_8php.html", "fsuggest_8php" ],
+ [ "group.php", "mod_2group_8php.html", "mod_2group_8php" ],
+ [ "help.php", "help_8php.html", "help_8php" ],
+ [ "home.php", "home_8php.html", "home_8php" ],
+ [ "hostxrd.php", "hostxrd_8php.html", "hostxrd_8php" ],
+ [ "import.php", "import_8php.html", "import_8php" ],
+ [ "invite.php", "invite_8php.html", "invite_8php" ],
+ [ "item.php", "item_8php.html", "item_8php" ],
+ [ "layouts.php", "layouts_8php.html", "layouts_8php" ],
+ [ "like.php", "like_8php.html", "like_8php" ],
+ [ "lockview.php", "lockview_8php.html", "lockview_8php" ],
+ [ "login.php", "login_8php.html", "login_8php" ],
+ [ "lostpass.php", "lostpass_8php.html", "lostpass_8php" ],
+ [ "magic.php", "magic_8php.html", "magic_8php" ],
+ [ "mail.php", "mail_8php.html", "mail_8php" ],
+ [ "manage.php", "manage_8php.html", "manage_8php" ],
+ [ "match.php", "match_8php.html", "match_8php" ],
+ [ "menu.php", "mod_2menu_8php.html", "mod_2menu_8php" ],
+ [ "message.php", "mod_2message_8php.html", "mod_2message_8php" ],
+ [ "mitem.php", "mitem_8php.html", "mitem_8php" ],
+ [ "mood.php", "mood_8php.html", "mood_8php" ],
+ [ "msearch.php", "msearch_8php.html", "msearch_8php" ],
+ [ "network.php", "mod_2network_8php.html", "mod_2network_8php" ],
+ [ "new_channel.php", "new__channel_8php.html", "new__channel_8php" ],
+ [ "notes.php", "notes_8php.html", "notes_8php" ],
+ [ "notifications.php", "notifications_8php.html", "notifications_8php" ],
+ [ "notify.php", "mod_2notify_8php.html", "mod_2notify_8php" ],
+ [ "oembed.php", "mod_2oembed_8php.html", "mod_2oembed_8php" ],
+ [ "oexchange.php", "oexchange_8php.html", "oexchange_8php" ],
+ [ "opensearch.php", "opensearch_8php.html", "opensearch_8php" ],
+ [ "page.php", "page_8php.html", "page_8php" ],
+ [ "parse_url.php", "parse__url_8php.html", "parse__url_8php" ],
+ [ "photo.php", "photo_8php.html", "photo_8php" ],
+ [ "photos.php", "mod_2photos_8php.html", "mod_2photos_8php" ],
+ [ "php.php", "php_8php.html", "php_8php" ],
+ [ "ping.php", "ping_8php.html", "ping_8php" ],
+ [ "poco.php", "poco_8php.html", "poco_8php" ],
+ [ "poke.php", "poke_8php.html", "poke_8php" ],
+ [ "post.php", "post_8php.html", "post_8php" ],
+ [ "pretheme.php", "pretheme_8php.html", "pretheme_8php" ],
+ [ "probe.php", "probe_8php.html", "probe_8php" ],
+ [ "profile.php", "profile_8php.html", "profile_8php" ],
+ [ "profile_photo.php", "profile__photo_8php.html", "profile__photo_8php" ],
+ [ "profiles.php", "profiles_8php.html", "profiles_8php" ],
+ [ "profperm.php", "profperm_8php.html", "profperm_8php" ],
+ [ "pubsites.php", "pubsites_8php.html", "pubsites_8php" ],
+ [ "randprof.php", "randprof_8php.html", "randprof_8php" ],
+ [ "register.php", "register_8php.html", "register_8php" ],
+ [ "regmod.php", "regmod_8php.html", "regmod_8php" ],
+ [ "removeme.php", "removeme_8php.html", "removeme_8php" ],
+ [ "rmagic.php", "rmagic_8php.html", "rmagic_8php" ],
+ [ "rpost.php", "rpost_8php.html", "rpost_8php" ],
+ [ "rsd_xml.php", "rsd__xml_8php.html", "rsd__xml_8php" ],
+ [ "search.php", "search_8php.html", "search_8php" ],
+ [ "search_ac.php", "search__ac_8php.html", "search__ac_8php" ],
+ [ "settings.php", "settings_8php.html", "settings_8php" ],
+ [ "setup.php", "setup_8php.html", "setup_8php" ],
+ [ "share.php", "share_8php.html", "share_8php" ],
+ [ "siteinfo.php", "siteinfo_8php.html", "siteinfo_8php" ],
+ [ "sitelist.php", "sitelist_8php.html", "sitelist_8php" ],
+ [ "smilies.php", "smilies_8php.html", "smilies_8php" ],
+ [ "sources.php", "sources_8php.html", "sources_8php" ],
+ [ "sslify.php", "sslify_8php.html", "sslify_8php" ],
+ [ "starred.php", "starred_8php.html", "starred_8php" ],
+ [ "subthread.php", "subthread_8php.html", "subthread_8php" ],
+ [ "suggest.php", "suggest_8php.html", "suggest_8php" ],
+ [ "tagger.php", "tagger_8php.html", "tagger_8php" ],
+ [ "tagrm.php", "tagrm_8php.html", "tagrm_8php" ],
+ [ "thing.php", "thing_8php.html", "thing_8php" ],
+ [ "toggle_mobile.php", "toggle__mobile_8php.html", "toggle__mobile_8php" ],
+ [ "toggle_safesearch.php", "toggle__safesearch_8php.html", "toggle__safesearch_8php" ],
+ [ "uexport.php", "uexport_8php.html", "uexport_8php" ],
+ [ "update_channel.php", "update__channel_8php.html", "update__channel_8php" ],
+ [ "update_community.php", "update__community_8php.html", "update__community_8php" ],
+ [ "update_display.php", "update__display_8php.html", "update__display_8php" ],
+ [ "update_network.php", "update__network_8php.html", "update__network_8php" ],
+ [ "update_search.php", "update__search_8php.html", "update__search_8php" ],
+ [ "view.php", "view_8php.html", "view_8php" ],
+ [ "viewconnections.php", "viewconnections_8php.html", "viewconnections_8php" ],
+ [ "viewsrc.php", "viewsrc_8php.html", "viewsrc_8php" ],
+ [ "vote.php", "vote_8php.html", "vote_8php" ],
+ [ "wall_attach.php", "wall__attach_8php.html", "wall__attach_8php" ],
+ [ "wall_upload.php", "wall__upload_8php.html", "wall__upload_8php" ],
+ [ "webfinger.php", "webfinger_8php.html", "webfinger_8php" ],
+ [ "webpages.php", "webpages_8php.html", "webpages_8php" ],
+ [ "wfinger.php", "wfinger_8php.html", "wfinger_8php" ],
+ [ "xchan.php", "xchan_8php.html", "xchan_8php" ],
+ [ "xrd.php", "xrd_8php.html", "xrd_8php" ],
+ [ "xref.php", "xref_8php.html", "xref_8php" ],
+ [ "zfinger.php", "zfinger_8php.html", "zfinger_8php" ],
+ [ "zotfeed.php", "zotfeed_8php.html", "zotfeed_8php" ],
+ [ "zping.php", "zping_8php.html", "zping_8php" ]
+]; \ No newline at end of file
diff --git a/doc/html/dir_d44c64559bbebec7f509842c48db8b23.html b/doc/html/dir_d44c64559bbebec7f509842c48db8b23.html
new file mode 100644
index 000000000..1f931673f
--- /dev/null
+++ b/doc/html/dir_d44c64559bbebec7f509842c48db8b23.html
@@ -0,0 +1,257 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include Directory Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('dir_d44c64559bbebec7f509842c48db8b23.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">include Directory Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="subdirs"></a>
+Directories</h2></td></tr>
+<tr class="memitem:dir_21bc5169ff11430004758be31dcfc6c4"><td class="memItemLeft" align="right" valign="top">directory &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir_21bc5169ff11430004758be31dcfc6c4.html">dba</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:dir_aae29906d7bfc07d076125f669c8352e"><td class="memItemLeft" align="right" valign="top">directory &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir_aae29906d7bfc07d076125f669c8352e.html">photo</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
+Files</h2></td></tr>
+<tr class="memitem:account_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="account_8php.html">account.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acl__selectors_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="acl__selectors_8php.html">acl_selectors.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:activities_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="activities_8php.html">activities.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:include_2api_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html">api.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:include_2attach_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2attach_8php.html">attach.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:auth_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="auth_8php.html">auth.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:BaseObject_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="BaseObject_8php.html">BaseObject.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:bb2diaspora_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="bb2diaspora_8php.html">bb2diaspora.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:bbcode_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="bbcode_8php.html">bbcode.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:cache_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="cache_8php.html">cache.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:include_2chanman_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2chanman_8php.html">chanman.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:cli__startup_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="cli__startup_8php.html">cli_startup.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:cli__suggest_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="cli__suggest_8php.html">cli_suggest.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:comanche_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="comanche_8php.html">comanche.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:include_2config_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2config_8php.html">config.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:Contact_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="Contact_8php.html">Contact.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:contact__selectors_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="contact__selectors_8php.html">contact_selectors.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:contact__widgets_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="contact__widgets_8php.html">contact_widgets.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:conversation_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="conversation_8php.html">conversation.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ConversationObject_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ConversationObject_8php.html">ConversationObject.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:cronhooks_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="cronhooks_8php.html">cronhooks.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:crypto_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="crypto_8php.html">crypto.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:datetime_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="datetime_8php.html">datetime.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:deliver_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="deliver_8php.html">deliver.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:dir__fns_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir__fns_8php.html">dir_fns.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:include_2directory_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2directory_8php.html">directory.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:enotify_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="enotify_8php.html">enotify.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:event_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="event_8php.html">event.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:expire_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="expire_8php.html">expire.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:features_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="features_8php.html">features.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:include_2follow_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2follow_8php.html">follow.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:friendica__smarty_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="friendica__smarty_8php.html">friendica_smarty.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gprobe_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="gprobe_8php.html">gprobe.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:include_2group_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2group_8php.html">group.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:html2bbcode_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="html2bbcode_8php.html">html2bbcode.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:html2plain_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="html2plain_8php.html">html2plain.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:identity_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="identity_8php.html">identity.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ItemObject_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ItemObject_8php.html">ItemObject.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ITemplateEngine_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ITemplateEngine_8php.html">ITemplateEngine.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:items_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html">items.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:language_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="language_8php.html">language.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:include_2menu_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2menu_8php.html">menu.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:include_2message_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2message_8php.html">message.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:nav_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="nav_8php.html">nav.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:include_2network_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2network_8php.html">network.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:notifier_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="notifier_8php.html">notifier.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:include_2notify_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2notify_8php.html">notify.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:oauth_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="oauth_8php.html">oauth.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:include_2oembed_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2oembed_8php.html">oembed.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:onedirsync_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="onedirsync_8php.html">onedirsync.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:onepoll_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="onepoll_8php.html">onepoll.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:page__widgets_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="page__widgets_8php.html">page_widgets.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:permissions_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="permissions_8php.html">permissions.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:include_2photos_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2photos_8php.html">photos.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:plugin_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="plugin_8php.html">plugin.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:poller_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="poller_8php.html">poller.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:profile__selectors_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="profile__selectors_8php.html">profile_selectors.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ProtoDriver_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ProtoDriver_8php.html">ProtoDriver.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:queue_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="queue_8php.html">queue.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:queue__fn_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="queue__fn_8php.html">queue_fn.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:reddav_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="reddav_8php.html">reddav.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:security_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="security_8php.html">security.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:session_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="session_8php.html">session.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:socgraph_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="socgraph_8php.html">socgraph.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:system__unavailable_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="system__unavailable_8php.html">system_unavailable.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:taxonomy_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="taxonomy_8php.html">taxonomy.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:template__processor_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="template__processor_8php.html">template_processor.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:text_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html">text.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:widgets_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="widgets_8php.html">widgets.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:zot_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="zot_8php.html">zot.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/dir_d44c64559bbebec7f509842c48db8b23.js b/doc/html/dir_d44c64559bbebec7f509842c48db8b23.js
new file mode 100644
index 000000000..3681158ec
--- /dev/null
+++ b/doc/html/dir_d44c64559bbebec7f509842c48db8b23.js
@@ -0,0 +1,91 @@
+var dir_d44c64559bbebec7f509842c48db8b23 =
+[
+ [ "dba", "dir_21bc5169ff11430004758be31dcfc6c4.html", "dir_21bc5169ff11430004758be31dcfc6c4" ],
+ [ "photo", "dir_aae29906d7bfc07d076125f669c8352e.html", "dir_aae29906d7bfc07d076125f669c8352e" ],
+ [ "account.php", "account_8php.html", "account_8php" ],
+ [ "acl_selectors.php", "acl__selectors_8php.html", "acl__selectors_8php" ],
+ [ "activities.php", "activities_8php.html", "activities_8php" ],
+ [ "api.php", "include_2api_8php.html", "include_2api_8php" ],
+ [ "attach.php", "include_2attach_8php.html", "include_2attach_8php" ],
+ [ "auth.php", "auth_8php.html", "auth_8php" ],
+ [ "BaseObject.php", "BaseObject_8php.html", [
+ [ "BaseObject", "classBaseObject.html", "classBaseObject" ]
+ ] ],
+ [ "bb2diaspora.php", "bb2diaspora_8php.html", "bb2diaspora_8php" ],
+ [ "bbcode.php", "bbcode_8php.html", "bbcode_8php" ],
+ [ "cache.php", "cache_8php.html", [
+ [ "Cache", "classCache.html", null ]
+ ] ],
+ [ "chanman.php", "include_2chanman_8php.html", "include_2chanman_8php" ],
+ [ "cli_startup.php", "cli__startup_8php.html", "cli__startup_8php" ],
+ [ "cli_suggest.php", "cli__suggest_8php.html", "cli__suggest_8php" ],
+ [ "comanche.php", "comanche_8php.html", "comanche_8php" ],
+ [ "config.php", "include_2config_8php.html", "include_2config_8php" ],
+ [ "Contact.php", "Contact_8php.html", "Contact_8php" ],
+ [ "contact_selectors.php", "contact__selectors_8php.html", "contact__selectors_8php" ],
+ [ "contact_widgets.php", "contact__widgets_8php.html", "contact__widgets_8php" ],
+ [ "conversation.php", "conversation_8php.html", "conversation_8php" ],
+ [ "ConversationObject.php", "ConversationObject_8php.html", [
+ [ "Conversation", "classConversation.html", "classConversation" ]
+ ] ],
+ [ "cronhooks.php", "cronhooks_8php.html", "cronhooks_8php" ],
+ [ "crypto.php", "crypto_8php.html", "crypto_8php" ],
+ [ "datetime.php", "datetime_8php.html", "datetime_8php" ],
+ [ "deliver.php", "deliver_8php.html", "deliver_8php" ],
+ [ "dir_fns.php", "dir__fns_8php.html", "dir__fns_8php" ],
+ [ "directory.php", "include_2directory_8php.html", "include_2directory_8php" ],
+ [ "enotify.php", "enotify_8php.html", "enotify_8php" ],
+ [ "event.php", "event_8php.html", "event_8php" ],
+ [ "expire.php", "expire_8php.html", "expire_8php" ],
+ [ "features.php", "features_8php.html", "features_8php" ],
+ [ "follow.php", "include_2follow_8php.html", "include_2follow_8php" ],
+ [ "friendica_smarty.php", "friendica__smarty_8php.html", [
+ [ "FriendicaSmarty", "classFriendicaSmarty.html", "classFriendicaSmarty" ],
+ [ "FriendicaSmartyEngine", "classFriendicaSmartyEngine.html", "classFriendicaSmartyEngine" ]
+ ] ],
+ [ "gprobe.php", "gprobe_8php.html", "gprobe_8php" ],
+ [ "group.php", "include_2group_8php.html", "include_2group_8php" ],
+ [ "html2bbcode.php", "html2bbcode_8php.html", "html2bbcode_8php" ],
+ [ "html2plain.php", "html2plain_8php.html", "html2plain_8php" ],
+ [ "identity.php", "identity_8php.html", "identity_8php" ],
+ [ "ItemObject.php", "ItemObject_8php.html", [
+ [ "Item", "classItem.html", "classItem" ]
+ ] ],
+ [ "ITemplateEngine.php", "ITemplateEngine_8php.html", [
+ [ "ITemplateEngine", "interfaceITemplateEngine.html", "interfaceITemplateEngine" ]
+ ] ],
+ [ "items.php", "items_8php.html", "items_8php" ],
+ [ "language.php", "language_8php.html", "language_8php" ],
+ [ "menu.php", "include_2menu_8php.html", "include_2menu_8php" ],
+ [ "message.php", "include_2message_8php.html", "include_2message_8php" ],
+ [ "nav.php", "nav_8php.html", "nav_8php" ],
+ [ "network.php", "include_2network_8php.html", "include_2network_8php" ],
+ [ "notifier.php", "notifier_8php.html", "notifier_8php" ],
+ [ "notify.php", "include_2notify_8php.html", "include_2notify_8php" ],
+ [ "oauth.php", "oauth_8php.html", "oauth_8php" ],
+ [ "oembed.php", "include_2oembed_8php.html", "include_2oembed_8php" ],
+ [ "onedirsync.php", "onedirsync_8php.html", "onedirsync_8php" ],
+ [ "onepoll.php", "onepoll_8php.html", "onepoll_8php" ],
+ [ "page_widgets.php", "page__widgets_8php.html", "page__widgets_8php" ],
+ [ "permissions.php", "permissions_8php.html", "permissions_8php" ],
+ [ "photos.php", "include_2photos_8php.html", "include_2photos_8php" ],
+ [ "plugin.php", "plugin_8php.html", "plugin_8php" ],
+ [ "poller.php", "poller_8php.html", "poller_8php" ],
+ [ "profile_selectors.php", "profile__selectors_8php.html", "profile__selectors_8php" ],
+ [ "ProtoDriver.php", "ProtoDriver_8php.html", [
+ [ "ProtoDriver", "classProtoDriver.html", "classProtoDriver" ],
+ [ "ZotDriver", "classZotDriver.html", "classZotDriver" ]
+ ] ],
+ [ "queue.php", "queue_8php.html", "queue_8php" ],
+ [ "queue_fn.php", "queue__fn_8php.html", "queue__fn_8php" ],
+ [ "reddav.php", "reddav_8php.html", "reddav_8php" ],
+ [ "security.php", "security_8php.html", "security_8php" ],
+ [ "session.php", "session_8php.html", "session_8php" ],
+ [ "socgraph.php", "socgraph_8php.html", "socgraph_8php" ],
+ [ "system_unavailable.php", "system__unavailable_8php.html", "system__unavailable_8php" ],
+ [ "taxonomy.php", "taxonomy_8php.html", "taxonomy_8php" ],
+ [ "template_processor.php", "template__processor_8php.html", "template__processor_8php" ],
+ [ "text.php", "text_8php.html", "text_8php" ],
+ [ "widgets.php", "widgets_8php.html", "widgets_8php" ],
+ [ "zot.php", "zot_8php.html", "zot_8php" ]
+]; \ No newline at end of file
diff --git a/doc/html/dir_d520c5cf583201d9437764f209363c22.html b/doc/html/dir_d520c5cf583201d9437764f209363c22.html
new file mode 100644
index 000000000..5d99e87f7
--- /dev/null
+++ b/doc/html/dir_d520c5cf583201d9437764f209363c22.html
@@ -0,0 +1,114 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/apw Directory Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('dir_d520c5cf583201d9437764f209363c22.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">apw Directory Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="subdirs"></a>
+Directories</h2></td></tr>
+<tr class="memitem:dir_cb8a8f75dcdd0b3fbfcc82e9eda410c5"><td class="memItemLeft" align="right" valign="top">directory &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir_cb8a8f75dcdd0b3fbfcc82e9eda410c5.html">php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:dir_05f4fba29266e8fd7869afcd6cefb5cb"><td class="memItemLeft" align="right" valign="top">directory &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir_05f4fba29266e8fd7869afcd6cefb5cb.html">schema</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/dir_d520c5cf583201d9437764f209363c22.js b/doc/html/dir_d520c5cf583201d9437764f209363c22.js
new file mode 100644
index 000000000..d5e01c25e
--- /dev/null
+++ b/doc/html/dir_d520c5cf583201d9437764f209363c22.js
@@ -0,0 +1,5 @@
+var dir_d520c5cf583201d9437764f209363c22 =
+[
+ [ "php", "dir_cb8a8f75dcdd0b3fbfcc82e9eda410c5.html", "dir_cb8a8f75dcdd0b3fbfcc82e9eda410c5" ],
+ [ "schema", "dir_05f4fba29266e8fd7869afcd6cefb5cb.html", "dir_05f4fba29266e8fd7869afcd6cefb5cb" ]
+]; \ No newline at end of file
diff --git a/doc/html/dir_d795dfe8933002397556cc7aa16eca15.html b/doc/html/dir_d795dfe8933002397556cc7aa16eca15.html
new file mode 100644
index 000000000..119fb7927
--- /dev/null
+++ b/doc/html/dir_d795dfe8933002397556cc7aa16eca15.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/redstrap Directory Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rhash-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('dir_d795dfe8933002397556cc7aa16eca15.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">redstrap Directory Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="subdirs"></a>
+Directories</h2></td></tr>
+<tr class="memitem:dir_6b44a0e797e2f12381093380e3e54763"><td class="memItemLeft" align="right" valign="top">directory &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir_6b44a0e797e2f12381093380e3e54763.html">php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/dir_d795dfe8933002397556cc7aa16eca15.js b/doc/html/dir_d795dfe8933002397556cc7aa16eca15.js
new file mode 100644
index 000000000..2b02828b8
--- /dev/null
+++ b/doc/html/dir_d795dfe8933002397556cc7aa16eca15.js
@@ -0,0 +1,4 @@
+var dir_d795dfe8933002397556cc7aa16eca15 =
+[
+ [ "php", "dir_6b44a0e797e2f12381093380e3e54763.html", "dir_6b44a0e797e2f12381093380e3e54763" ]
+]; \ No newline at end of file
diff --git a/doc/html/dirfind_8php.html b/doc/html/dirfind_8php.html
new file mode 100644
index 000000000..93241d1a4
--- /dev/null
+++ b/doc/html/dirfind_8php.html
@@ -0,0 +1,155 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/dirfind.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rhash-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('dirfind_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">dirfind.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ac689a812c84f161b3a0d42349f83981c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dirfind_8php.html#ac689a812c84f161b3a0d42349f83981c">dirfind_init</a> (&amp;$a)</td></tr>
+<tr class="separator:ac689a812c84f161b3a0d42349f83981c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af22b0283f928c4c32e62248a5ae67cee"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dirfind_8php.html#af22b0283f928c4c32e62248a5ae67cee">dirfind_content</a> (&amp;$a)</td></tr>
+<tr class="separator:af22b0283f928c4c32e62248a5ae67cee"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="af22b0283f928c4c32e62248a5ae67cee"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">dirfind_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ac689a812c84f161b3a0d42349f83981c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">dirfind_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/dirfind_8php.js b/doc/html/dirfind_8php.js
new file mode 100644
index 000000000..133a7bcb3
--- /dev/null
+++ b/doc/html/dirfind_8php.js
@@ -0,0 +1,5 @@
+var dirfind_8php =
+[
+ [ "dirfind_content", "dirfind_8php.html#af22b0283f928c4c32e62248a5ae67cee", null ],
+ [ "dirfind_init", "dirfind_8php.html#ac689a812c84f161b3a0d42349f83981c", null ]
+]; \ No newline at end of file
diff --git a/doc/html/dirprofile_8php.html b/doc/html/dirprofile_8php.html
new file mode 100644
index 000000000..94bcb7aad
--- /dev/null
+++ b/doc/html/dirprofile_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/dirprofile.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('dirprofile_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">dirprofile.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a3e1d30d3d93863ff5615f2df4ac7f052"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dirprofile_8php.html#a3e1d30d3d93863ff5615f2df4ac7f052">dirprofile_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a3e1d30d3d93863ff5615f2df4ac7f052"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a3e1d30d3d93863ff5615f2df4ac7f052"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">dirprofile_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/dirprofile_8php.js b/doc/html/dirprofile_8php.js
new file mode 100644
index 000000000..45cc06441
--- /dev/null
+++ b/doc/html/dirprofile_8php.js
@@ -0,0 +1,4 @@
+var dirprofile_8php =
+[
+ [ "dirprofile_init", "dirprofile_8php.html#a3e1d30d3d93863ff5615f2df4ac7f052", null ]
+]; \ No newline at end of file
diff --git a/doc/html/dirsearch_8php.html b/doc/html/dirsearch_8php.html
new file mode 100644
index 000000000..806a32354
--- /dev/null
+++ b/doc/html/dirsearch_8php.html
@@ -0,0 +1,174 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/dirsearch.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('dirsearch_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">dirsearch.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a3e51964ae3f5ff147403407b65324752"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dirsearch_8php.html#a3e51964ae3f5ff147403407b65324752">dirsearch_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a3e51964ae3f5ff147403407b65324752"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa1fb04e1de4f25b63349ac78f94ceb4c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dirsearch_8php.html#aa1fb04e1de4f25b63349ac78f94ceb4c">dirsearch_content</a> (&amp;$a)</td></tr>
+<tr class="separator:aa1fb04e1de4f25b63349ac78f94ceb4c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a985d410a170549429857af6ff2673149"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dirsearch_8php.html#a985d410a170549429857af6ff2673149">list_public_sites</a> ()</td></tr>
+<tr class="separator:a985d410a170549429857af6ff2673149"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="aa1fb04e1de4f25b63349ac78f94ceb4c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">dirsearch_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a3e51964ae3f5ff147403407b65324752"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">dirsearch_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a985d410a170549429857af6ff2673149"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">list_public_sites </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="dirsearch_8php.html#aa1fb04e1de4f25b63349ac78f94ceb4c">dirsearch_content()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/dirsearch_8php.js b/doc/html/dirsearch_8php.js
new file mode 100644
index 000000000..45753b123
--- /dev/null
+++ b/doc/html/dirsearch_8php.js
@@ -0,0 +1,6 @@
+var dirsearch_8php =
+[
+ [ "dirsearch_content", "dirsearch_8php.html#aa1fb04e1de4f25b63349ac78f94ceb4c", null ],
+ [ "dirsearch_init", "dirsearch_8php.html#a3e51964ae3f5ff147403407b65324752", null ],
+ [ "list_public_sites", "dirsearch_8php.html#a985d410a170549429857af6ff2673149", null ]
+]; \ No newline at end of file
diff --git a/doc/html/display_8php.html b/doc/html/display_8php.html
new file mode 100644
index 000000000..c2f2d8664
--- /dev/null
+++ b/doc/html/display_8php.html
@@ -0,0 +1,155 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/display.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('display_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">display.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a37137c98d47bf3306f4c2bb9f5b60de0"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="display_8php.html#a37137c98d47bf3306f4c2bb9f5b60de0">display_content</a> (&amp;$a, $update=0, $load=false)</td></tr>
+<tr class="separator:a37137c98d47bf3306f4c2bb9f5b60de0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a37137c98d47bf3306f4c2bb9f5b60de0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">display_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$update</em> = <code>0</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$load</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="update__display_8php.html#aa36ac524059e209d5d75a03c16206246">update_display_content()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/display_8php.js b/doc/html/display_8php.js
new file mode 100644
index 000000000..3fb3beffb
--- /dev/null
+++ b/doc/html/display_8php.js
@@ -0,0 +1,4 @@
+var display_8php =
+[
+ [ "display_content", "display_8php.html#a37137c98d47bf3306f4c2bb9f5b60de0", null ]
+]; \ No newline at end of file
diff --git a/doc/html/docblox__errorchecker_8php.html b/doc/html/docblox__errorchecker_8php.html
new file mode 100644
index 000000000..b17226b25
--- /dev/null
+++ b/doc/html/docblox__errorchecker_8php.html
@@ -0,0 +1,314 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: util/docblox_errorchecker.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('docblox__errorchecker_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#namespaces">Namespaces</a> &#124;
+<a href="#func-members">Functions</a> &#124;
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle">
+<div class="title">docblox_errorchecker.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="namespaces"></a>
+Namespaces</h2></td></tr>
+<tr class="memitem:namespaceutil"><td class="memItemLeft" align="right" valign="top">namespace &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespaceutil.html">util</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a2b767cfc461fdd5061fffc9e4a806d5b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="docblox__errorchecker_8php.html#a2b767cfc461fdd5061fffc9e4a806d5b">namesList</a> ($fileset)</td></tr>
+<tr class="separator:a2b767cfc461fdd5061fffc9e4a806d5b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a21b4bbe5aae2d85db33affc7126a67ec"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="docblox__errorchecker_8php.html#a21b4bbe5aae2d85db33affc7126a67ec">runs</a> ($fileset)</td></tr>
+<tr class="separator:a21b4bbe5aae2d85db33affc7126a67ec"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae9562cf60aa693114603d27b55d2185f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="docblox__errorchecker_8php.html#ae9562cf60aa693114603d27b55d2185f">reduce</a> ($fileset, $ps)</td></tr>
+<tr class="separator:ae9562cf60aa693114603d27b55d2185f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:a1659f0a629d408e0f849dbe4ee061e62"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="docblox__errorchecker_8php.html#a1659f0a629d408e0f849dbe4ee061e62">$dir</a> ='..'</td></tr>
+<tr class="separator:a1659f0a629d408e0f849dbe4ee061e62"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab66bc0493d25f39bf8b4dcbb429f04e6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="docblox__errorchecker_8php.html#ab66bc0493d25f39bf8b4dcbb429f04e6">$dirstack</a> =array()</td></tr>
+<tr class="separator:ab66bc0493d25f39bf8b4dcbb429f04e6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a648a570b0f9f6e0e51b7267647c4b09b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="docblox__errorchecker_8php.html#a648a570b0f9f6e0e51b7267647c4b09b">$filelist</a> =array()</td></tr>
+<tr class="separator:a648a570b0f9f6e0e51b7267647c4b09b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a49a8a4009b02e49717caa88b128affc5"><td class="memItemLeft" align="right" valign="top"><a class="el" href="docblox__errorchecker_8php.html#af4ca738a05beffe9c8c23e1f7aea3c2d">while</a>($dh=opendir($dir)) <a class="el" href="redbasic_2php_2style_8php.html#a883f9f14e205f7aa7de02c14df67b40a">if</a>(<a class="el" href="docblox__errorchecker_8php.html#a21b4bbe5aae2d85db33affc7126a67ec">runs</a>($filelist))&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="docblox__errorchecker_8php.html#a49a8a4009b02e49717caa88b128affc5">$res</a> =$filelist</td></tr>
+<tr class="separator:a49a8a4009b02e49717caa88b128affc5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a83018d9153d17d91fbcf3bc10158d34f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="docblox__errorchecker_8php.html#a83018d9153d17d91fbcf3bc10158d34f">$i</a> =0</td></tr>
+<tr class="separator:a83018d9153d17d91fbcf3bc10158d34f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a721c6ff80a6d3e4ad4ffa52a04c60085"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="docblox__errorchecker_8php.html#a721c6ff80a6d3e4ad4ffa52a04c60085">do</a></td></tr>
+<tr class="separator:a721c6ff80a6d3e4ad4ffa52a04c60085"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a852004caba0a34390297a079f4aaac73"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="docblox__errorchecker_8php.html#a852004caba0a34390297a079f4aaac73">$needed</a> =array()</td></tr>
+<tr class="separator:a852004caba0a34390297a079f4aaac73"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af4ca738a05beffe9c8c23e1f7aea3c2d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="docblox__errorchecker_8php.html#af4ca738a05beffe9c8c23e1f7aea3c2d">while</a> (count($res)!=0)</td></tr>
+<tr class="separator:af4ca738a05beffe9c8c23e1f7aea3c2d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a2b767cfc461fdd5061fffc9e4a806d5b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">namesList </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$fileset</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="docblox__errorchecker_8php.html#a21b4bbe5aae2d85db33affc7126a67ec">runs()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ae9562cf60aa693114603d27b55d2185f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">reduce </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$fileset</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$ps</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a21b4bbe5aae2d85db33affc7126a67ec"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">runs </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$fileset</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Variable Documentation</h2>
+<a class="anchor" id="a1659f0a629d408e0f849dbe4ee061e62"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$dir ='..'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ab66bc0493d25f39bf8b4dcbb429f04e6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$dirstack =array()</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a648a570b0f9f6e0e51b7267647c4b09b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$filelist =array()</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a83018d9153d17d91fbcf3bc10158d34f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$i =0</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="crypto_8php.html#a2148d7aac7b30c720f7ebda7e9790286">aes_encapsulate()</a>, <a class="el" href="crypto_8php.html#aca7c3a574bfb6c6ef1f2403a56823914">aes_unencapsulate()</a>, <a class="el" href="text_8php.html#a75c243e06341ec16bd5a44b9b1cacd85">alt_pager()</a>, <a class="el" href="boot_8php.html#a4c02d88e66852a01bd5a1feecb7c3ce3">check_config()</a>, <a class="el" href="items_8php.html#afa1db13c2a8b73b5b17b97f17e5a19d1">drop_item()</a>, <a class="el" href="items_8php.html#aba98fcbbcd7044a7e9ea34edabc14c87">fix_private_photos()</a>, <a class="el" href="bb2diaspora_8php.html#a4c2f8f11b29a06809d9b07782215b1b2">get_bb_tag_pos()</a>, <a class="el" href="text_8php.html#a1557112a774ec00fa06ed6b6f6495506">is_a_date_arg()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="conversation_8php.html#adda79b75bf1ccf6ce9503aa310953533">item_redir_and_replace_images()</a>, <a class="el" href="text_8php.html#ae17b39d5e321debd3ad16dcbbde842b8">jindent()</a>, <a class="el" href="setup_8php.html#a2b375ddc555140236fc500135de99371">load_database_rem()</a>, <a class="el" href="html2bbcode_8php.html#a39c662b19d318990fee2ba795a55d7a7">node2bbcodesub()</a>, <a class="el" href="enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc">notification()</a>, <a class="el" href="text_8php.html#afe9f178d264d44a94dc1292aaf0fd585">paginate()</a>, <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>, <a class="el" href="activities_8php.html#a80134e807719b3c54aba971958d2e132">profile_activity()</a>, <a class="el" href="plugin_8php.html#af9ac19004dca49adae1ac7a0d9f3b025">reload_plugins()</a>, <a class="el" href="zot_8php.html#aad25a3fe0e1566121d6fb8222979bc10">remove_community_tag()</a>, <a class="el" href="include_2network_8php.html#ae8d9c41a11000fb8667039fc71b4f73f">scale_external_images()</a>, <a class="el" href="items_8php.html#ab1bce4261bcf75ad62753b498a144d17">tag_deliver()</a>, and <a class="el" href="zot_8php.html#aeea071f17e306fe3d0c488551906bfab">zot_import()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a852004caba0a34390297a079f4aaac73"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$needed =array()</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a49a8a4009b02e49717caa88b128affc5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$res =$filelist</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="setup_8php.html#aa3bbb111780da70ba35cc23a306f2c76">check_keys()</a>, <a class="el" href="event_8php.html#a89ef533faf345db8d64a58d4856bde3a">event_store()</a>, <a class="el" href="items_8php.html#aba98fcbbcd7044a7e9ea34edabc14c87">fix_private_photos()</a>, <a class="el" href="items_8php.html#a896c1809d58f2d7a42cfe14577958ddf">get_atom_elements()</a>, <a class="el" href="bb2diaspora_8php.html#a4c2f8f11b29a06809d9b07782215b1b2">get_bb_tag_pos()</a>, <a class="el" href="hostxrd_8php.html#aa37ffc8e7900bc76c4828bd25916db92">hostxrd_init()</a>, <a class="el" href="invite_8php.html#aeb0881c0f93c8e8552e5ed756ce6e5a5">invite_post()</a>, <a class="el" href="lostpass_8php.html#a0314d94e48c789b1b3a201d740c9eab3">lostpass_content()</a>, <a class="el" href="lostpass_8php.html#a8ed35ba71a4404eaf4903da61d0321cc">lostpass_post()</a>, <a class="el" href="photo_8php.html#a582779d24882b0d31ee909a91d70a448">photo_init()</a>, <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>, <a class="el" href="probe_8php.html#a1f1db3fa6038e451e737964c94bf5e99">probe_content()</a>, <a class="el" href="activities_8php.html#a80134e807719b3c54aba971958d2e132">profile_activity()</a>, <a class="el" href="register_8php.html#a51731dcc1917c58a790eb1c0f6132271">register_post()</a>, <a class="el" href="classenotify.html#afbc088860f534c6c05788b48cfc262c6">enotify\send()</a>, <a class="el" href="account_8php.html#a014de2d5d5c9785de5bf547a485822fa">send_reg_approval_email()</a>, <a class="el" href="account_8php.html#aa9c29c497c17d8f9344dce8631ad8761">send_verification_email()</a>, <a class="el" href="account_8php.html#ac5c570a2d46446bad4dd2501e9c5a4b1">user_allow()</a>, and <a class="el" href="webfinger_8php.html#a17dd28db6d390194bf9ecb809739d1d3">webfinger_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a721c6ff80a6d3e4ad4ffa52a04c60085"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">do</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<b>Initial value:</b><div class="fragment"><div class="line">{</div>
+<div class="line"> <a class="code" href="docblox__errorchecker_8php.html#a83018d9153d17d91fbcf3bc10158d34f">$i</a>=count(<a class="code" href="docblox__errorchecker_8php.html#a49a8a4009b02e49717caa88b128affc5">$res</a>)</div>
+</div><!-- fragment -->
+</div>
+</div>
+<a class="anchor" id="af4ca738a05beffe9c8c23e1f7aea3c2d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">while(count($res)!=0)</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/docblox__errorchecker_8php.js b/doc/html/docblox__errorchecker_8php.js
new file mode 100644
index 000000000..17707e7c6
--- /dev/null
+++ b/doc/html/docblox__errorchecker_8php.js
@@ -0,0 +1,14 @@
+var docblox__errorchecker_8php =
+[
+ [ "namesList", "docblox__errorchecker_8php.html#a2b767cfc461fdd5061fffc9e4a806d5b", null ],
+ [ "reduce", "docblox__errorchecker_8php.html#ae9562cf60aa693114603d27b55d2185f", null ],
+ [ "runs", "docblox__errorchecker_8php.html#a21b4bbe5aae2d85db33affc7126a67ec", null ],
+ [ "$dir", "docblox__errorchecker_8php.html#a1659f0a629d408e0f849dbe4ee061e62", null ],
+ [ "$dirstack", "docblox__errorchecker_8php.html#ab66bc0493d25f39bf8b4dcbb429f04e6", null ],
+ [ "$filelist", "docblox__errorchecker_8php.html#a648a570b0f9f6e0e51b7267647c4b09b", null ],
+ [ "$i", "docblox__errorchecker_8php.html#a83018d9153d17d91fbcf3bc10158d34f", null ],
+ [ "$needed", "docblox__errorchecker_8php.html#a852004caba0a34390297a079f4aaac73", null ],
+ [ "$res", "docblox__errorchecker_8php.html#a49a8a4009b02e49717caa88b128affc5", null ],
+ [ "do", "docblox__errorchecker_8php.html#a721c6ff80a6d3e4ad4ffa52a04c60085", null ],
+ [ "while", "docblox__errorchecker_8php.html#af4ca738a05beffe9c8c23e1f7aea3c2d", null ]
+]; \ No newline at end of file
diff --git a/doc/html/doxygen.css b/doc/html/doxygen.css
new file mode 100644
index 000000000..dabaff2fd
--- /dev/null
+++ b/doc/html/doxygen.css
@@ -0,0 +1,1184 @@
+/* The standard CSS for doxygen 1.8.3.1 */
+
+body, table, div, p, dl {
+ font: 400 14px/19px Roboto,sans-serif;
+}
+
+/* @group Heading Levels */
+
+h1.groupheader {
+ font-size: 150%;
+}
+
+.title {
+ font-size: 150%;
+ font-weight: bold;
+ margin: 10px 2px;
+}
+
+h2.groupheader {
+ border-bottom: 1px solid #879ECB;
+ color: #354C7B;
+ font-size: 150%;
+ font-weight: normal;
+ margin-top: 1.75em;
+ padding-top: 8px;
+ padding-bottom: 4px;
+ width: 100%;
+}
+
+h3.groupheader {
+ font-size: 100%;
+}
+
+h1, h2, h3, h4, h5, h6 {
+ -webkit-transition: text-shadow 0.5s linear;
+ -moz-transition: text-shadow 0.5s linear;
+ -ms-transition: text-shadow 0.5s linear;
+ -o-transition: text-shadow 0.5s linear;
+ transition: text-shadow 0.5s linear;
+ margin-right: 15px;
+}
+
+h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow {
+ text-shadow: 0 0 15px cyan;
+}
+
+dt {
+ font-weight: bold;
+}
+
+div.multicol {
+ -moz-column-gap: 1em;
+ -webkit-column-gap: 1em;
+ -moz-column-count: 3;
+ -webkit-column-count: 3;
+}
+
+p.startli, p.startdd, p.starttd {
+ margin-top: 2px;
+}
+
+p.endli {
+ margin-bottom: 0px;
+}
+
+p.enddd {
+ margin-bottom: 4px;
+}
+
+p.endtd {
+ margin-bottom: 2px;
+}
+
+/* @end */
+
+caption {
+ font-weight: bold;
+}
+
+span.legend {
+ font-size: 70%;
+ text-align: center;
+}
+
+h3.version {
+ font-size: 90%;
+ text-align: center;
+}
+
+div.qindex, div.navtab{
+ background-color: #EBEFF6;
+ border: 1px solid #A3B4D7;
+ text-align: center;
+}
+
+div.qindex, div.navpath {
+ width: 100%;
+ line-height: 140%;
+}
+
+div.navtab {
+ margin-right: 15px;
+}
+
+/* @group Link Styling */
+
+a {
+ color: #3D578C;
+ font-weight: normal;
+ text-decoration: none;
+}
+
+.contents a:visited {
+ color: #4665A2;
+}
+
+a:hover {
+ text-decoration: underline;
+}
+
+a.qindex {
+ font-weight: bold;
+}
+
+a.qindexHL {
+ font-weight: bold;
+ background-color: #9CAFD4;
+ color: #ffffff;
+ border: 1px double #869DCA;
+}
+
+.contents a.qindexHL:visited {
+ color: #ffffff;
+}
+
+a.el {
+ font-weight: bold;
+}
+
+a.elRef {
+}
+
+a.code, a.code:visited {
+ color: #4665A2;
+}
+
+a.codeRef, a.codeRef:visited {
+ color: #4665A2;
+}
+
+/* @end */
+
+dl.el {
+ margin-left: -1cm;
+}
+
+pre.fragment {
+ border: 1px solid #C4CFE5;
+ background-color: #FBFCFD;
+ padding: 4px 6px;
+ margin: 4px 8px 4px 2px;
+ overflow: auto;
+ word-wrap: break-word;
+ font-size: 9pt;
+ line-height: 125%;
+ font-family: monospace, fixed;
+ font-size: 105%;
+}
+
+div.fragment {
+ padding: 4px;
+ margin: 4px;
+ background-color: #FBFCFD;
+ border: 1px solid #C4CFE5;
+}
+
+div.line {
+ font-family: monospace, fixed;
+ font-size: 13px;
+ min-height: 13px;
+ line-height: 1.0;
+ text-wrap: unrestricted;
+ white-space: -moz-pre-wrap; /* Moz */
+ white-space: -pre-wrap; /* Opera 4-6 */
+ white-space: -o-pre-wrap; /* Opera 7 */
+ white-space: pre-wrap; /* CSS3 */
+ word-wrap: break-word; /* IE 5.5+ */
+ text-indent: -53px;
+ padding-left: 53px;
+ padding-bottom: 0px;
+ margin: 0px;
+ -webkit-transition-property: background-color, box-shadow;
+ -webkit-transition-duration: 0.5s;
+ -moz-transition-property: background-color, box-shadow;
+ -moz-transition-duration: 0.5s;
+ -ms-transition-property: background-color, box-shadow;
+ -ms-transition-duration: 0.5s;
+ -o-transition-property: background-color, box-shadow;
+ -o-transition-duration: 0.5s;
+ transition-property: background-color, box-shadow;
+ transition-duration: 0.5s;
+}
+
+div.line.glow {
+ background-color: cyan;
+ box-shadow: 0 0 10px cyan;
+}
+
+
+span.lineno {
+ padding-right: 4px;
+ text-align: right;
+ border-right: 2px solid #0F0;
+ background-color: #E8E8E8;
+ white-space: pre;
+}
+span.lineno a {
+ background-color: #D8D8D8;
+}
+
+span.lineno a:hover {
+ background-color: #C8C8C8;
+}
+
+div.ah {
+ background-color: black;
+ font-weight: bold;
+ color: #ffffff;
+ margin-bottom: 3px;
+ margin-top: 3px;
+ padding: 0.2em;
+ border: solid thin #333;
+ border-radius: 0.5em;
+ -webkit-border-radius: .5em;
+ -moz-border-radius: .5em;
+ box-shadow: 2px 2px 3px #999;
+ -webkit-box-shadow: 2px 2px 3px #999;
+ -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px;
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444));
+ background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000);
+}
+
+div.groupHeader {
+ margin-left: 16px;
+ margin-top: 12px;
+ font-weight: bold;
+}
+
+div.groupText {
+ margin-left: 16px;
+ font-style: italic;
+}
+
+body {
+ background-color: white;
+ color: black;
+ margin: 0;
+}
+
+div.contents {
+ margin-top: 10px;
+ margin-left: 12px;
+ margin-right: 8px;
+}
+
+td.indexkey {
+ background-color: #EBEFF6;
+ font-weight: bold;
+ border: 1px solid #C4CFE5;
+ margin: 2px 0px 2px 0;
+ padding: 2px 10px;
+ white-space: nowrap;
+ vertical-align: top;
+}
+
+td.indexvalue {
+ background-color: #EBEFF6;
+ border: 1px solid #C4CFE5;
+ padding: 2px 10px;
+ margin: 2px 0px;
+}
+
+tr.memlist {
+ background-color: #EEF1F7;
+}
+
+p.formulaDsp {
+ text-align: center;
+}
+
+img.formulaDsp {
+
+}
+
+img.formulaInl {
+ vertical-align: middle;
+}
+
+div.center {
+ text-align: center;
+ margin-top: 0px;
+ margin-bottom: 0px;
+ padding: 0px;
+}
+
+div.center img {
+ border: 0px;
+}
+
+address.footer {
+ text-align: right;
+ padding-right: 12px;
+}
+
+img.footer {
+ border: 0px;
+ vertical-align: middle;
+}
+
+/* @group Code Colorization */
+
+span.keyword {
+ color: #008000
+}
+
+span.keywordtype {
+ color: #604020
+}
+
+span.keywordflow {
+ color: #e08000
+}
+
+span.comment {
+ color: #800000
+}
+
+span.preprocessor {
+ color: #806020
+}
+
+span.stringliteral {
+ color: #002080
+}
+
+span.charliteral {
+ color: #008080
+}
+
+span.vhdldigit {
+ color: #ff00ff
+}
+
+span.vhdlchar {
+ color: #000000
+}
+
+span.vhdlkeyword {
+ color: #700070
+}
+
+span.vhdllogic {
+ color: #ff0000
+}
+
+blockquote {
+ background-color: #F7F8FB;
+ border-left: 2px solid #9CAFD4;
+ margin: 0 24px 0 4px;
+ padding: 0 12px 0 16px;
+}
+
+/* @end */
+
+/*
+.search {
+ color: #003399;
+ font-weight: bold;
+}
+
+form.search {
+ margin-bottom: 0px;
+ margin-top: 0px;
+}
+
+input.search {
+ font-size: 75%;
+ color: #000080;
+ font-weight: normal;
+ background-color: #e8eef2;
+}
+*/
+
+td.tiny {
+ font-size: 75%;
+}
+
+.dirtab {
+ padding: 4px;
+ border-collapse: collapse;
+ border: 1px solid #A3B4D7;
+}
+
+th.dirtab {
+ background: #EBEFF6;
+ font-weight: bold;
+}
+
+hr {
+ height: 0px;
+ border: none;
+ border-top: 1px solid #4A6AAA;
+}
+
+hr.footer {
+ height: 1px;
+}
+
+/* @group Member Descriptions */
+
+table.memberdecls {
+ border-spacing: 0px;
+ padding: 0px;
+}
+
+.memberdecls td, .fieldtable tr {
+ -webkit-transition-property: background-color, box-shadow;
+ -webkit-transition-duration: 0.5s;
+ -moz-transition-property: background-color, box-shadow;
+ -moz-transition-duration: 0.5s;
+ -ms-transition-property: background-color, box-shadow;
+ -ms-transition-duration: 0.5s;
+ -o-transition-property: background-color, box-shadow;
+ -o-transition-duration: 0.5s;
+ transition-property: background-color, box-shadow;
+ transition-duration: 0.5s;
+}
+
+.memberdecls td.glow, .fieldtable tr.glow {
+ background-color: cyan;
+ box-shadow: 0 0 15px cyan;
+}
+
+.mdescLeft, .mdescRight,
+.memItemLeft, .memItemRight,
+.memTemplItemLeft, .memTemplItemRight, .memTemplParams {
+ background-color: #F9FAFC;
+ border: none;
+ margin: 4px;
+ padding: 1px 0 0 8px;
+}
+
+.mdescLeft, .mdescRight {
+ padding: 0px 8px 4px 8px;
+ color: #555;
+}
+
+.memSeparator {
+ border-bottom: 1px solid #DEE4F0;
+ line-height: 1px;
+ margin: 0px;
+ padding: 0px;
+}
+
+.memItemLeft, .memTemplItemLeft {
+ white-space: nowrap;
+}
+
+.memItemRight {
+ width: 100%;
+}
+
+.memTemplParams {
+ color: #4665A2;
+ white-space: nowrap;
+ font-size: 80%;
+}
+
+/* @end */
+
+/* @group Member Details */
+
+/* Styles for detailed member documentation */
+
+.memtemplate {
+ font-size: 80%;
+ color: #4665A2;
+ font-weight: normal;
+ margin-left: 9px;
+}
+
+.memnav {
+ background-color: #EBEFF6;
+ border: 1px solid #A3B4D7;
+ text-align: center;
+ margin: 2px;
+ margin-right: 15px;
+ padding: 2px;
+}
+
+.mempage {
+ width: 100%;
+}
+
+.memitem {
+ padding: 0;
+ margin-bottom: 10px;
+ margin-right: 5px;
+ -webkit-transition: box-shadow 0.5s linear;
+ -moz-transition: box-shadow 0.5s linear;
+ -ms-transition: box-shadow 0.5s linear;
+ -o-transition: box-shadow 0.5s linear;
+ transition: box-shadow 0.5s linear;
+ display: table !important;
+ width: 100%;
+}
+
+.memitem.glow {
+ box-shadow: 0 0 15px cyan;
+}
+
+.memname {
+ font-weight: bold;
+ margin-left: 6px;
+}
+
+.memname td {
+ vertical-align: bottom;
+}
+
+.memproto, dl.reflist dt {
+ border-top: 1px solid #A8B8D9;
+ border-left: 1px solid #A8B8D9;
+ border-right: 1px solid #A8B8D9;
+ padding: 6px 0px 6px 0px;
+ color: #253555;
+ font-weight: bold;
+ text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);
+ background-image:url('nav_f.png');
+ background-repeat:repeat-x;
+ background-color: #E2E8F2;
+ /* opera specific markup */
+ box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+ border-top-right-radius: 4px;
+ border-top-left-radius: 4px;
+ /* firefox specific markup */
+ -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px;
+ -moz-border-radius-topright: 4px;
+ -moz-border-radius-topleft: 4px;
+ /* webkit specific markup */
+ -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+ -webkit-border-top-right-radius: 4px;
+ -webkit-border-top-left-radius: 4px;
+
+}
+
+.memdoc, dl.reflist dd {
+ border-bottom: 1px solid #A8B8D9;
+ border-left: 1px solid #A8B8D9;
+ border-right: 1px solid #A8B8D9;
+ padding: 6px 10px 2px 10px;
+ background-color: #FBFCFD;
+ border-top-width: 0;
+ background-image:url('nav_g.png');
+ background-repeat:repeat-x;
+ background-color: #FFFFFF;
+ /* opera specific markup */
+ border-bottom-left-radius: 4px;
+ border-bottom-right-radius: 4px;
+ box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+ /* firefox specific markup */
+ -moz-border-radius-bottomleft: 4px;
+ -moz-border-radius-bottomright: 4px;
+ -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px;
+ /* webkit specific markup */
+ -webkit-border-bottom-left-radius: 4px;
+ -webkit-border-bottom-right-radius: 4px;
+ -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+}
+
+dl.reflist dt {
+ padding: 5px;
+}
+
+dl.reflist dd {
+ margin: 0px 0px 10px 0px;
+ padding: 5px;
+}
+
+.paramkey {
+ text-align: right;
+}
+
+.paramtype {
+ white-space: nowrap;
+}
+
+.paramname {
+ color: #602020;
+ white-space: nowrap;
+}
+.paramname em {
+ font-style: normal;
+}
+.paramname code {
+ line-height: 14px;
+}
+
+.params, .retval, .exception, .tparams {
+ margin-left: 0px;
+ padding-left: 0px;
+}
+
+.params .paramname, .retval .paramname {
+ font-weight: bold;
+ vertical-align: top;
+}
+
+.params .paramtype {
+ font-style: italic;
+ vertical-align: top;
+}
+
+.params .paramdir {
+ font-family: "courier new",courier,monospace;
+ vertical-align: top;
+}
+
+table.mlabels {
+ border-spacing: 0px;
+}
+
+td.mlabels-left {
+ width: 100%;
+ padding: 0px;
+}
+
+td.mlabels-right {
+ vertical-align: bottom;
+ padding: 0px;
+ white-space: nowrap;
+}
+
+span.mlabels {
+ margin-left: 8px;
+}
+
+span.mlabel {
+ background-color: #728DC1;
+ border-top:1px solid #5373B4;
+ border-left:1px solid #5373B4;
+ border-right:1px solid #C4CFE5;
+ border-bottom:1px solid #C4CFE5;
+ text-shadow: none;
+ color: white;
+ margin-right: 4px;
+ padding: 2px 3px;
+ border-radius: 3px;
+ font-size: 7pt;
+ white-space: nowrap;
+ vertical-align: middle;
+}
+
+
+
+/* @end */
+
+/* these are for tree view when not used as main index */
+
+div.directory {
+ margin: 10px 0px;
+ border-top: 1px solid #A8B8D9;
+ border-bottom: 1px solid #A8B8D9;
+ width: 100%;
+}
+
+.directory table {
+ border-collapse:collapse;
+}
+
+.directory td {
+ margin: 0px;
+ padding: 0px;
+ vertical-align: top;
+}
+
+.directory td.entry {
+ white-space: nowrap;
+ padding-right: 6px;
+}
+
+.directory td.entry a {
+ outline:none;
+}
+
+.directory td.entry a img {
+ border: none;
+}
+
+.directory td.desc {
+ width: 100%;
+ padding-left: 6px;
+ padding-right: 6px;
+ padding-top: 3px;
+ border-left: 1px solid rgba(0,0,0,0.05);
+}
+
+.directory tr.even {
+ padding-left: 6px;
+ background-color: #F7F8FB;
+}
+
+.directory img {
+ vertical-align: -30%;
+}
+
+.directory .levels {
+ white-space: nowrap;
+ width: 100%;
+ text-align: right;
+ font-size: 9pt;
+}
+
+.directory .levels span {
+ cursor: pointer;
+ padding-left: 2px;
+ padding-right: 2px;
+ color: #3D578C;
+}
+
+div.dynheader {
+ margin-top: 8px;
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -khtml-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+
+address {
+ font-style: normal;
+ color: #2A3D61;
+}
+
+table.doxtable {
+ border-collapse:collapse;
+ margin-top: 4px;
+ margin-bottom: 4px;
+}
+
+table.doxtable td, table.doxtable th {
+ border: 1px solid #2D4068;
+ padding: 3px 7px 2px;
+}
+
+table.doxtable th {
+ background-color: #374F7F;
+ color: #FFFFFF;
+ font-size: 110%;
+ padding-bottom: 4px;
+ padding-top: 5px;
+}
+
+table.fieldtable {
+ /*width: 100%;*/
+ margin-bottom: 10px;
+ border: 1px solid #A8B8D9;
+ border-spacing: 0px;
+ -moz-border-radius: 4px;
+ -webkit-border-radius: 4px;
+ border-radius: 4px;
+ -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px;
+ -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15);
+ box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15);
+}
+
+.fieldtable td, .fieldtable th {
+ padding: 3px 7px 2px;
+}
+
+.fieldtable td.fieldtype, .fieldtable td.fieldname {
+ white-space: nowrap;
+ border-right: 1px solid #A8B8D9;
+ border-bottom: 1px solid #A8B8D9;
+ vertical-align: top;
+}
+
+.fieldtable td.fieldname {
+ padding-top: 5px;
+}
+
+.fieldtable td.fielddoc {
+ border-bottom: 1px solid #A8B8D9;
+ /*width: 100%;*/
+}
+
+.fieldtable td.fielddoc p:first-child {
+ margin-top: 2px;
+}
+
+.fieldtable td.fielddoc p:last-child {
+ margin-bottom: 2px;
+}
+
+.fieldtable tr:last-child td {
+ border-bottom: none;
+}
+
+.fieldtable th {
+ background-image:url('nav_f.png');
+ background-repeat:repeat-x;
+ background-color: #E2E8F2;
+ font-size: 90%;
+ color: #253555;
+ padding-bottom: 4px;
+ padding-top: 5px;
+ text-align:left;
+ -moz-border-radius-topleft: 4px;
+ -moz-border-radius-topright: 4px;
+ -webkit-border-top-left-radius: 4px;
+ -webkit-border-top-right-radius: 4px;
+ border-top-left-radius: 4px;
+ border-top-right-radius: 4px;
+ border-bottom: 1px solid #A8B8D9;
+}
+
+
+.tabsearch {
+ top: 0px;
+ left: 10px;
+ height: 36px;
+ background-image: url('tab_b.png');
+ z-index: 101;
+ overflow: hidden;
+ font-size: 13px;
+}
+
+.navpath ul
+{
+ font-size: 11px;
+ background-image:url('tab_b.png');
+ background-repeat:repeat-x;
+ background-position: 0 -5px;
+ height:30px;
+ line-height:30px;
+ color:#8AA0CC;
+ border:solid 1px #C2CDE4;
+ overflow:hidden;
+ margin:0px;
+ padding:0px;
+}
+
+.navpath li
+{
+ list-style-type:none;
+ float:left;
+ padding-left:10px;
+ padding-right:15px;
+ background-image:url('bc_s.png');
+ background-repeat:no-repeat;
+ background-position:right;
+ color:#364D7C;
+}
+
+.navpath li.navelem a
+{
+ height:32px;
+ display:block;
+ text-decoration: none;
+ outline: none;
+ color: #283A5D;
+ font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif;
+ text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);
+ text-decoration: none;
+}
+
+.navpath li.navelem a:hover
+{
+ color:#6884BD;
+}
+
+.navpath li.footer
+{
+ list-style-type:none;
+ float:right;
+ padding-left:10px;
+ padding-right:15px;
+ background-image:none;
+ background-repeat:no-repeat;
+ background-position:right;
+ color:#364D7C;
+ font-size: 8pt;
+}
+
+
+div.summary
+{
+ float: right;
+ font-size: 8pt;
+ padding-right: 5px;
+ width: 50%;
+ text-align: right;
+}
+
+div.summary a
+{
+ white-space: nowrap;
+}
+
+div.ingroups
+{
+ font-size: 8pt;
+ width: 50%;
+ text-align: left;
+}
+
+div.ingroups a
+{
+ white-space: nowrap;
+}
+
+div.header
+{
+ background-image:url('nav_h.png');
+ background-repeat:repeat-x;
+ background-color: #F9FAFC;
+ margin: 0px;
+ border-bottom: 1px solid #C4CFE5;
+}
+
+div.headertitle
+{
+ padding: 5px 5px 5px 10px;
+}
+
+dl
+{
+ padding: 0 0 0 10px;
+}
+
+/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug */
+dl.section
+{
+ margin-left: 0px;
+ padding-left: 0px;
+}
+
+dl.note
+{
+ margin-left:-7px;
+ padding-left: 3px;
+ border-left:4px solid;
+ border-color: #D0C000;
+}
+
+dl.warning, dl.attention
+{
+ margin-left:-7px;
+ padding-left: 3px;
+ border-left:4px solid;
+ border-color: #FF0000;
+}
+
+dl.pre, dl.post, dl.invariant
+{
+ margin-left:-7px;
+ padding-left: 3px;
+ border-left:4px solid;
+ border-color: #00D000;
+}
+
+dl.deprecated
+{
+ margin-left:-7px;
+ padding-left: 3px;
+ border-left:4px solid;
+ border-color: #505050;
+}
+
+dl.todo
+{
+ margin-left:-7px;
+ padding-left: 3px;
+ border-left:4px solid;
+ border-color: #00C0E0;
+}
+
+dl.test
+{
+ margin-left:-7px;
+ padding-left: 3px;
+ border-left:4px solid;
+ border-color: #3030E0;
+}
+
+dl.bug
+{
+ margin-left:-7px;
+ padding-left: 3px;
+ border-left:4px solid;
+ border-color: #C08050;
+}
+
+dl.section dd {
+ margin-bottom: 6px;
+}
+
+
+#projectlogo
+{
+ text-align: center;
+ vertical-align: bottom;
+ border-collapse: separate;
+}
+
+#projectlogo img
+{
+ border: 0px none;
+}
+
+#projectname
+{
+ font: 300% Tahoma, Arial,sans-serif;
+ margin: 0px;
+ padding: 2px 0px;
+}
+
+#projectbrief
+{
+ font: 120% Tahoma, Arial,sans-serif;
+ margin: 0px;
+ padding: 0px;
+}
+
+#projectnumber
+{
+ font: 50% Tahoma, Arial,sans-serif;
+ margin: 0px;
+ padding: 0px;
+}
+
+#titlearea
+{
+ padding: 0px;
+ margin: 0px;
+ width: 100%;
+ border-bottom: 1px solid #5373B4;
+}
+
+.image
+{
+ text-align: center;
+}
+
+.dotgraph
+{
+ text-align: center;
+}
+
+.mscgraph
+{
+ text-align: center;
+}
+
+.caption
+{
+ font-weight: bold;
+}
+
+div.zoom
+{
+ border: 1px solid #90A5CE;
+}
+
+dl.citelist {
+ margin-bottom:50px;
+}
+
+dl.citelist dt {
+ color:#334975;
+ float:left;
+ font-weight:bold;
+ margin-right:10px;
+ padding:5px;
+}
+
+dl.citelist dd {
+ margin:2px 0;
+ padding:5px 0;
+}
+
+div.toc {
+ padding: 14px 25px;
+ background-color: #F4F6FA;
+ border: 1px solid #D8DFEE;
+ border-radius: 7px 7px 7px 7px;
+ float: right;
+ height: auto;
+ margin: 0 20px 10px 10px;
+ width: 200px;
+}
+
+div.toc li {
+ background: url("bdwn.png") no-repeat scroll 0 5px transparent;
+ font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif;
+ margin-top: 5px;
+ padding-left: 10px;
+ padding-top: 2px;
+}
+
+div.toc h3 {
+ font: bold 12px/1.2 Arial,FreeSans,sans-serif;
+ color: #4665A2;
+ border-bottom: 0 none;
+ margin: 0;
+}
+
+div.toc ul {
+ list-style: none outside none;
+ border: medium none;
+ padding: 0px;
+}
+
+div.toc li.level1 {
+ margin-left: 0px;
+}
+
+div.toc li.level2 {
+ margin-left: 15px;
+}
+
+div.toc li.level3 {
+ margin-left: 30px;
+}
+
+div.toc li.level4 {
+ margin-left: 45px;
+}
+
+.inherit_header {
+ font-weight: bold;
+ color: gray;
+ cursor: pointer;
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -khtml-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+
+.inherit_header td {
+ padding: 6px 0px 2px 5px;
+}
+
+.inherit {
+ display: none;
+}
+
+tr.heading h2 {
+ margin-top: 12px;
+ margin-bottom: 4px;
+}
+
+@media print
+{
+ #top { display: none; }
+ #side-nav { display: none; }
+ #nav-path { display: none; }
+ body { overflow:visible; }
+ h1, h2, h3, h4, h5, h6 { page-break-after: avoid; }
+ .summary { display: none; }
+ .memitem { page-break-inside: avoid; }
+ #doc-content
+ {
+ margin-left:0 !important;
+ height:auto !important;
+ width:auto !important;
+ overflow:inherit;
+ display:inline;
+ }
+}
+
diff --git a/doc/html/doxygen.png b/doc/html/doxygen.png
new file mode 100644
index 000000000..3ff17d807
--- /dev/null
+++ b/doc/html/doxygen.png
Binary files differ
diff --git a/doc/html/dynsections.js b/doc/html/dynsections.js
new file mode 100644
index 000000000..ed092c7f6
--- /dev/null
+++ b/doc/html/dynsections.js
@@ -0,0 +1,97 @@
+function toggleVisibility(linkObj)
+{
+ var base = $(linkObj).attr('id');
+ var summary = $('#'+base+'-summary');
+ var content = $('#'+base+'-content');
+ var trigger = $('#'+base+'-trigger');
+ var src=$(trigger).attr('src');
+ if (content.is(':visible')===true) {
+ content.hide();
+ summary.show();
+ $(linkObj).addClass('closed').removeClass('opened');
+ $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png');
+ } else {
+ content.show();
+ summary.hide();
+ $(linkObj).removeClass('closed').addClass('opened');
+ $(trigger).attr('src',src.substring(0,src.length-10)+'open.png');
+ }
+ return false;
+}
+
+function updateStripes()
+{
+ $('table.directory tr').
+ removeClass('even').filter(':visible:even').addClass('even');
+}
+function toggleLevel(level)
+{
+ $('table.directory tr').each(function(){
+ var l = this.id.split('_').length-1;
+ var i = $('#img'+this.id.substring(3));
+ var a = $('#arr'+this.id.substring(3));
+ if (l<level+1) {
+ i.attr('src','ftv2folderopen.png');
+ a.attr('src','ftv2mnode.png');
+ $(this).show();
+ } else if (l==level+1) {
+ i.attr('src','ftv2folderclosed.png');
+ a.attr('src','ftv2pnode.png');
+ $(this).show();
+ } else {
+ $(this).hide();
+ }
+ });
+ updateStripes();
+}
+
+function toggleFolder(id)
+{
+ //The clicked row
+ var currentRow = $('#row_'+id);
+ var currentRowImages = currentRow.find("img");
+
+ //All rows after the clicked row
+ var rows = currentRow.nextAll("tr");
+
+ //Only match elements AFTER this one (can't hide elements before)
+ var childRows = rows.filter(function() {
+ var re = new RegExp('^row_'+id+'\\d+_$', "i"); //only one sub
+ return this.id.match(re);
+ });
+
+ //First row is visible we are HIDING
+ if (childRows.filter(':first').is(':visible')===true) {
+ currentRowImages.filter("[id^=arr]").attr('src', 'ftv2pnode.png');
+ currentRowImages.filter("[id^=img]").attr('src', 'ftv2folderclosed.png');
+ rows.filter("[id^=row_"+id+"]").hide();
+ } else { //We are SHOWING
+ //All sub images
+ var childImages = childRows.find("img");
+ var childImg = childImages.filter("[id^=img]");
+ var childArr = childImages.filter("[id^=arr]");
+
+ currentRow.find("[id^=arr]").attr('src', 'ftv2mnode.png'); //open row
+ currentRow.find("[id^=img]").attr('src', 'ftv2folderopen.png'); //open row
+ childImg.attr('src','ftv2folderclosed.png'); //children closed
+ childArr.attr('src','ftv2pnode.png'); //children closed
+ childRows.show(); //show all children
+ }
+ updateStripes();
+}
+
+
+function toggleInherit(id)
+{
+ var rows = $('tr.inherit.'+id);
+ var img = $('tr.inherit_header.'+id+' img');
+ var src = $(img).attr('src');
+ if (rows.filter(':first').is(':visible')===true) {
+ rows.css('display','none');
+ $(img).attr('src',src.substring(0,src.length-8)+'closed.png');
+ } else {
+ rows.css('display','table-row'); // using show() causes jump in firefox
+ $(img).attr('src',src.substring(0,src.length-10)+'open.png');
+ }
+}
+
diff --git a/doc/html/editblock_8php.html b/doc/html/editblock_8php.html
new file mode 100644
index 000000000..f33d0956e
--- /dev/null
+++ b/doc/html/editblock_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/editblock.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('editblock_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">editblock.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:abbe8f55de06967bc8d79d620509a49e6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="editblock_8php.html#abbe8f55de06967bc8d79d620509a49e6">editblock_content</a> (&amp;$a)</td></tr>
+<tr class="separator:abbe8f55de06967bc8d79d620509a49e6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="abbe8f55de06967bc8d79d620509a49e6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">editblock_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/editblock_8php.js b/doc/html/editblock_8php.js
new file mode 100644
index 000000000..dae23cf05
--- /dev/null
+++ b/doc/html/editblock_8php.js
@@ -0,0 +1,4 @@
+var editblock_8php =
+[
+ [ "editblock_content", "editblock_8php.html#abbe8f55de06967bc8d79d620509a49e6", null ]
+]; \ No newline at end of file
diff --git a/doc/html/editlayout_8php.html b/doc/html/editlayout_8php.html
new file mode 100644
index 000000000..e59994c3e
--- /dev/null
+++ b/doc/html/editlayout_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/editlayout.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('editlayout_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">editlayout.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:aa877e4157a26b099de904164181dd386"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="editlayout_8php.html#aa877e4157a26b099de904164181dd386">editlayout_content</a> (&amp;$a)</td></tr>
+<tr class="separator:aa877e4157a26b099de904164181dd386"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="aa877e4157a26b099de904164181dd386"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">editlayout_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/editlayout_8php.js b/doc/html/editlayout_8php.js
new file mode 100644
index 000000000..a41acddd1
--- /dev/null
+++ b/doc/html/editlayout_8php.js
@@ -0,0 +1,4 @@
+var editlayout_8php =
+[
+ [ "editlayout_content", "editlayout_8php.html#aa877e4157a26b099de904164181dd386", null ]
+]; \ No newline at end of file
diff --git a/doc/html/editpost_8php.html b/doc/html/editpost_8php.html
new file mode 100644
index 000000000..a86d5d3c6
--- /dev/null
+++ b/doc/html/editpost_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/editpost.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('editpost_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">editpost.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a34011690864d122680c802e9e748ccfb"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="editpost_8php.html#a34011690864d122680c802e9e748ccfb">editpost_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a34011690864d122680c802e9e748ccfb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a34011690864d122680c802e9e748ccfb"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">editpost_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/editpost_8php.js b/doc/html/editpost_8php.js
new file mode 100644
index 000000000..5012045da
--- /dev/null
+++ b/doc/html/editpost_8php.js
@@ -0,0 +1,4 @@
+var editpost_8php =
+[
+ [ "editpost_content", "editpost_8php.html#a34011690864d122680c802e9e748ccfb", null ]
+]; \ No newline at end of file
diff --git a/doc/html/editwebpage_8php.html b/doc/html/editwebpage_8php.html
new file mode 100644
index 000000000..e8f689b67
--- /dev/null
+++ b/doc/html/editwebpage_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/editwebpage.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('editwebpage_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">editwebpage.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a375e945255fad79a71036528f7480650"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="editwebpage_8php.html#a375e945255fad79a71036528f7480650">editwebpage_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a375e945255fad79a71036528f7480650"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a375e945255fad79a71036528f7480650"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">editwebpage_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/editwebpage_8php.js b/doc/html/editwebpage_8php.js
new file mode 100644
index 000000000..c9e825bb8
--- /dev/null
+++ b/doc/html/editwebpage_8php.js
@@ -0,0 +1,4 @@
+var editwebpage_8php =
+[
+ [ "editwebpage_content", "editwebpage_8php.html#a375e945255fad79a71036528f7480650", null ]
+]; \ No newline at end of file
diff --git a/doc/html/enotify_8php.html b/doc/html/enotify_8php.html
new file mode 100644
index 000000000..9c468a042
--- /dev/null
+++ b/doc/html/enotify_8php.html
@@ -0,0 +1,145 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/enotify.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('enotify_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Classes</a> &#124;
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">enotify.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classenotify.html">enotify</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a3e9a9355b243777c488d2a9883908dfc"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc">notification</a> ($params)</td></tr>
+<tr class="separator:a3e9a9355b243777c488d2a9883908dfc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a3e9a9355b243777c488d2a9883908dfc"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">notification </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$params</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="items_8php.html#a77da7ce9a117601d49ac4a67c71b514f">mail_store()</a>, <a class="el" href="items_8php.html#aab9e0c58247427126de0699c729c3b6c">send_status_notifications()</a>, and <a class="el" href="items_8php.html#ab1bce4261bcf75ad62753b498a144d17">tag_deliver()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/enotify_8php.js b/doc/html/enotify_8php.js
new file mode 100644
index 000000000..2dd8c6299
--- /dev/null
+++ b/doc/html/enotify_8php.js
@@ -0,0 +1,5 @@
+var enotify_8php =
+[
+ [ "enotify", "classenotify.html", null ],
+ [ "notification", "enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc", null ]
+]; \ No newline at end of file
diff --git a/doc/html/event_8php.html b/doc/html/event_8php.html
new file mode 100644
index 000000000..bef857f32
--- /dev/null
+++ b/doc/html/event_8php.html
@@ -0,0 +1,265 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/event.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('event_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">event.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a2ac9f1b08de03250ecd794f705781d17"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="event_8php.html#a2ac9f1b08de03250ecd794f705781d17">format_event_html</a> ($ev)</td></tr>
+<tr class="separator:a2ac9f1b08de03250ecd794f705781d17"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abb74206cf42d694307c3d7abb7af9869"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="event_8php.html#abb74206cf42d694307c3d7abb7af9869">format_event_bbcode</a> ($ev)</td></tr>
+<tr class="separator:abb74206cf42d694307c3d7abb7af9869"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a184d6b9690e5b6dee35a0aa9edd47279"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="event_8php.html#a184d6b9690e5b6dee35a0aa9edd47279">bbtovcal</a> ($s)</td></tr>
+<tr class="separator:a184d6b9690e5b6dee35a0aa9edd47279"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a180cccd63c2a2f00ff432b03113531f3"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="event_8php.html#a180cccd63c2a2f00ff432b03113531f3">bbtoevent</a> ($s)</td></tr>
+<tr class="separator:a180cccd63c2a2f00ff432b03113531f3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a018ea4484910a873a7c1eaa126de9b1a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="event_8php.html#a018ea4484910a873a7c1eaa126de9b1a">sort_by_date</a> ($arr)</td></tr>
+<tr class="separator:a018ea4484910a873a7c1eaa126de9b1a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a32ba1b9ddf7a744a9a1512b052e5f850"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="event_8php.html#a32ba1b9ddf7a744a9a1512b052e5f850">ev_compare</a> ($a, $b)</td></tr>
+<tr class="separator:a32ba1b9ddf7a744a9a1512b052e5f850"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a89ef533faf345db8d64a58d4856bde3a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="event_8php.html#a89ef533faf345db8d64a58d4856bde3a">event_store</a> ($arr)</td></tr>
+<tr class="separator:a89ef533faf345db8d64a58d4856bde3a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a180cccd63c2a2f00ff432b03113531f3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">bbtoevent </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="bbcode_8php.html#a009f61aaf78771737ed0765c8463911b">bbcode()</a>, <a class="el" href="event_8php.html#a184d6b9690e5b6dee35a0aa9edd47279">bbtovcal()</a>, <a class="el" href="items_8php.html#a8794863cdf8ce1333040933d3a3f66bd">consume_feed()</a>, and <a class="el" href="zot_8php.html#a37ec13b18057634eadb071f05297f5e1">process_delivery()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a184d6b9690e5b6dee35a0aa9edd47279"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">bbtovcal </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a32ba1b9ddf7a744a9a1512b052e5f850"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">ev_compare </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$b</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a89ef533faf345db8d64a58d4856bde3a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">event_store </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="events_8php.html#ab3e8a8f901175f8e40a8089eea45c075">events_post()</a>, and <a class="el" href="zot_8php.html#a37ec13b18057634eadb071f05297f5e1">process_delivery()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="abb74206cf42d694307c3d7abb7af9869"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">format_event_bbcode </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$ev</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="event_8php.html#a89ef533faf345db8d64a58d4856bde3a">event_store()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a2ac9f1b08de03250ecd794f705781d17"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">format_event_html </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$ev</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="bbcode_8php.html#a009f61aaf78771737ed0765c8463911b">bbcode()</a>, <a class="el" href="event_8php.html#a184d6b9690e5b6dee35a0aa9edd47279">bbtovcal()</a>, and <a class="el" href="events_8php.html#a1d293fb217ae6bc9e3858c4b32e363ec">events_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a018ea4484910a873a7c1eaa126de9b1a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">sort_by_date </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="events_8php.html#a1d293fb217ae6bc9e3858c4b32e363ec">events_content()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/event_8php.js b/doc/html/event_8php.js
new file mode 100644
index 000000000..3d6ce5806
--- /dev/null
+++ b/doc/html/event_8php.js
@@ -0,0 +1,10 @@
+var event_8php =
+[
+ [ "bbtoevent", "event_8php.html#a180cccd63c2a2f00ff432b03113531f3", null ],
+ [ "bbtovcal", "event_8php.html#a184d6b9690e5b6dee35a0aa9edd47279", null ],
+ [ "ev_compare", "event_8php.html#a32ba1b9ddf7a744a9a1512b052e5f850", null ],
+ [ "event_store", "event_8php.html#a89ef533faf345db8d64a58d4856bde3a", null ],
+ [ "format_event_bbcode", "event_8php.html#abb74206cf42d694307c3d7abb7af9869", null ],
+ [ "format_event_html", "event_8php.html#a2ac9f1b08de03250ecd794f705781d17", null ],
+ [ "sort_by_date", "event_8php.html#a018ea4484910a873a7c1eaa126de9b1a", null ]
+]; \ No newline at end of file
diff --git a/doc/html/events_8php.html b/doc/html/events_8php.html
new file mode 100644
index 000000000..ecd63f5a1
--- /dev/null
+++ b/doc/html/events_8php.html
@@ -0,0 +1,155 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/events.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('events_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">events.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ab3e8a8f901175f8e40a8089eea45c075"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="events_8php.html#ab3e8a8f901175f8e40a8089eea45c075">events_post</a> (&amp;$a)</td></tr>
+<tr class="separator:ab3e8a8f901175f8e40a8089eea45c075"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1d293fb217ae6bc9e3858c4b32e363ec"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="events_8php.html#a1d293fb217ae6bc9e3858c4b32e363ec">events_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a1d293fb217ae6bc9e3858c4b32e363ec"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a1d293fb217ae6bc9e3858c4b32e363ec"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">events_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ab3e8a8f901175f8e40a8089eea45c075"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">events_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/events_8php.js b/doc/html/events_8php.js
new file mode 100644
index 000000000..d53a51cbd
--- /dev/null
+++ b/doc/html/events_8php.js
@@ -0,0 +1,5 @@
+var events_8php =
+[
+ [ "events_content", "events_8php.html#a1d293fb217ae6bc9e3858c4b32e363ec", null ],
+ [ "events_post", "events_8php.html#ab3e8a8f901175f8e40a8089eea45c075", null ]
+]; \ No newline at end of file
diff --git a/doc/html/expire_8php.html b/doc/html/expire_8php.html
new file mode 100644
index 000000000..61e0731b5
--- /dev/null
+++ b/doc/html/expire_8php.html
@@ -0,0 +1,147 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/expire.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('expire_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">expire.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a444e45c9b67727b27db4c779fd51a298"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="expire_8php.html#a444e45c9b67727b27db4c779fd51a298">expire_run</a> ($<a class="el" href="boot_8php.html#a768f00b7d66be0daf7ef4eea2e862006">argv</a>, $<a class="el" href="boot_8php.html#abc0a90a1a77f5b668aa7e4b57d1776a7">argc</a>)</td></tr>
+<tr class="separator:a444e45c9b67727b27db4c779fd51a298"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a444e45c9b67727b27db4c779fd51a298"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">expire_run </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$argv</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$argc</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/expire_8php.js b/doc/html/expire_8php.js
new file mode 100644
index 000000000..6ecd16ffe
--- /dev/null
+++ b/doc/html/expire_8php.js
@@ -0,0 +1,4 @@
+var expire_8php =
+[
+ [ "expire_run", "expire_8php.html#a444e45c9b67727b27db4c779fd51a298", null ]
+]; \ No newline at end of file
diff --git a/doc/html/extract_8php.html b/doc/html/extract_8php.html
new file mode 100644
index 000000000..ae2617c3b
--- /dev/null
+++ b/doc/html/extract_8php.html
@@ -0,0 +1,181 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: util/extract.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('extract_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle">
+<div class="title">extract.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:a63bb4c41bc532baacf6a4976cfaa0feb"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="extract_8php.html#a63bb4c41bc532baacf6a4976cfaa0feb">$arr</a> = array()</td></tr>
+<tr class="separator:a63bb4c41bc532baacf6a4976cfaa0feb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9590b15215a21e9b42eb546aeef79704"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="extract_8php.html#a9590b15215a21e9b42eb546aeef79704">$files</a> = array('index.php','boot.php')</td></tr>
+<tr class="separator:a9590b15215a21e9b42eb546aeef79704"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a50b05cf2e02ef0b67fcad97106dd7634"><td class="memItemLeft" align="right" valign="top"><a class="el" href="typo_8php.html#a329c9c12217d2c8660c47bbc7c8df4c5">foreach</a>($files as $file)&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="extract_8php.html#a50b05cf2e02ef0b67fcad97106dd7634">$s</a> = '&lt;?php' . &quot;\n&quot;</td></tr>
+<tr class="separator:a50b05cf2e02ef0b67fcad97106dd7634"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0cbe524ffc9a496114fd7ba9f423ef44"><td class="memItemLeft" align="right" valign="top"><a class="el" href="typo_8php.html#a329c9c12217d2c8660c47bbc7c8df4c5">foreach</a>($arr as $a)&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="extract_8php.html#a0cbe524ffc9a496114fd7ba9f423ef44">$zones</a> = timezone_identifiers_list()</td></tr>
+<tr class="separator:a0cbe524ffc9a496114fd7ba9f423ef44"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Variable Documentation</h2>
+<a class="anchor" id="a63bb4c41bc532baacf6a4976cfaa0feb"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$arr = array()</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a36e656667193c83aa2cc03a024fc131b">activity_sanitise()</a>, <a class="el" href="include_2api_8php.html#a6a04b48168ba1d9dd2de3081a630611f">api_rss_extra()</a>, <a class="el" href="items_8php.html#abf7a1b73eb352d79acd36309b0dababd">array_sanitise()</a>, <a class="el" href="include_2attach_8php.html#ab6830b3ab74a5d284876141ac80f6cbc">attach_mkdir()</a>, <a class="el" href="include_2attach_8php.html#a84a8a64c4805e1525b42d4add464833f">attach_store()</a>, <a class="el" href="account_8php.html#a917d74aad0baf3e0c4b51cf1051e654f">check_account_admin()</a>, <a class="el" href="account_8php.html#ae052bd5558847bd38e89c213561a9771">check_account_email()</a>, <a class="el" href="account_8php.html#aaff7720423417a4333697894ffd9ddeb">check_account_invite()</a>, <a class="el" href="account_8php.html#a144b4891022567668375b58ea61cfff0">check_account_password()</a>, <a class="el" href="permissions_8php.html#a0f5bd9f7f4c8fb7ba4b2c1ed048b4dc7">check_list_permissions()</a>, <a class="el" href="text_8php.html#a0c65597bb4aed3a039eb795ff540e5e3">check_webbie()</a>, <a class="el" href="connect_8php.html#a489f0a66c660de6ec4d6917b27674f07">connect_content()</a>, <a class="el" href="connections_8php.html#a1224058db8e3fb56463eb312f98e561d">connections_post()</a>, <a class="el" href="connedit_8php.html#a795acb3d9d841f55c255d7611681ab67">connedit_content()</a>, <a class="el" href="connedit_8php.html#a234c48426b652bf4d37053f2af329ac5">connedit_post()</a>, <a class="el" href="boot_8php.html#acc4e0c910af066148b810e5fde55fff1">construct_page()</a>, <a class="el" href="text_8php.html#ad6432621d0fafcbcf3d3b9b49bef7784">contact_block()</a>, <a class="el" href="acl__selectors_8php.html#a9476997d2968a5794f3723878ed89c91">contact_select()</a>, <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation()</a>, <a class="el" href="account_8php.html#a141fe579c351c78209d425473f978eb5">create_account()</a>, <a class="el" href="identity_8php.html#a345f4c943d84de502ec6e72d2c813945">create_identity()</a>, <a class="el" href="dba__driver_8php.html#a65b83462bd26968106aebd43f16540e4">dbesc_array()</a>, <a class="el" href="mod_2directory_8php.html#aac79396570d759da2efac24fcedf5b44">directory_content()</a>, <a class="el" href="items_8php.html#afa1db13c2a8b73b5b17b97f17e5a19d1">drop_item()</a>, <a class="el" href="event_8php.html#a89ef533faf345db8d64a58d4856bde3a">event_store()</a>, <a class="el" href="features_8php.html#a52b5bdfb61b256713efecf7a7b20b0c0">feature_enabled()</a>, <a class="el" href="text_8php.html#ace3c98538c63e09b70a363210b414112">find_xchan_in_array()</a>, <a class="el" href="conversation_8php.html#a3d8e30cc94f9a175054c021305d3aca3">format_like()</a>, <a class="el" href="permissions_8php.html#aeca9b280f3dc3358c89976d81d690008">get_all_perms()</a>, <a class="el" href="items_8php.html#a896c1809d58f2d7a42cfe14577958ddf">get_atom_elements()</a>, <a class="el" href="include_2attach_8php.html#a6aa00ea010ea030110faefb75eafc1ce">get_cloudpath()</a>, <a class="el" href="features_8php.html#ae73c5b03b01c7284ed7e7e0e774e975c">get_features()</a>, <a class="el" href="items_8php.html#a536d0313b6ffe33b9d2490c4e25c5361">get_item_elements()</a>, <a class="el" href="items_8php.html#a94ddb1d6c8fa21dd7433677e85168037">get_mail_elements()</a>, <a class="el" href="text_8php.html#a736db13a966b8abaf8c9198faa35911a">get_mood_verbs()</a>, <a class="el" href="text_8php.html#aa46f941155c2ac1155f2f17ffb0adb66">get_poke_verbs()</a>, <a class="el" href="items_8php.html#a251343637ff40a50cca93452cd530c26">get_profile_elements()</a>, <a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">Item\get_template_data()</a>, <a class="el" href="taxonomy_8php.html#a0fb8cf0ac7bcbc8b27d856fe9bf69cd1">get_terms_oftype()</a>, <a class="el" href="classApp.html#a871898becd0697d778f36d9336253ae8">App\get_widgets()</a>, <a class="el" href="acl__selectors_8php.html#aa1e3bc344ca2b29f97eb9860216d21a0">group_select()</a>, <a class="el" href="text_8php.html#a436a8de00c942364c2d0fcfc7e1f4b5a">ids_to_querystr()</a>, <a class="el" href="items_8php.html#ae73794179b62d39bb597ff670ab1c1e5">import_author_xchan()</a>, <a class="el" href="zot_8php.html#aeec89da5b6ff090c63a79de4de884a35">import_directory_profile()</a>, <a class="el" href="import_8php.html#af17fef0410518f7eac205d0ea416eaa2">import_post()</a>, <a class="el" href="zot_8php.html#a2657e141d62d5f67ad3c87651b585299">import_site()</a>, <a class="el" href="zot_8php.html#a56f3f65514e4e7f0cd117d01735aebd1">import_xchan()</a>, <a class="el" href="items_8php.html#a09d425596b9f8663472cf7474ad36d96">item_getfeedattach()</a>, <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">item_store()</a>, <a class="el" href="items_8php.html#acf0bf7c9d21ac84f32effb754f7ad484">item_store_update()</a>, <a class="el" href="items_8php.html#a756738301f2ed96be50232500677d58a">items_fetch()</a>, <a class="el" href="like_8php.html#a9d7dd268f21c21e9d29dd2aca2dd9538">like_content()</a>, <a class="el" href="conversation_8php.html#afe5b2f38d8b803edb0d7ec5fa2868db0">like_puller()</a>, <a class="el" href="setup_8php.html#ad2e0375a9ab87ebe6e78124ee125054a">load_database()</a>, <a class="el" href="magic_8php.html#acea2cc792849ca2d71d4b689f66518bf">magic_init()</a>, <a class="el" href="items_8php.html#a77da7ce9a117601d49ac4a67c71b514f">mail_store()</a>, <a class="el" href="include_2menu_8php.html#add35fae5e9695031b3d46e30ac409eb8">menu_add_item()</a>, <a class="el" href="include_2menu_8php.html#a08a800821721781a8dfffbe31481ff98">menu_create()</a>, <a class="el" href="include_2menu_8php.html#a6a33c6a3db2a7510b16cc656edaec571">menu_edit()</a>, <a class="el" href="include_2menu_8php.html#acb66f80ca895a6ccd562b3d9ae7b41aa">menu_edit_item()</a>, <a class="el" href="mood_8php.html#a7ae136dd7476865b4828136175db5022">mood_init()</a>, <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>, <a class="el" href="new__channel_8php.html#a180b0646957db8290482f02454ad7f23">new_channel_post()</a>, <a class="el" href="include_2follow_8php.html#ae387d4ae097c23d69f3247e7f08140c7">new_contact()</a>, <a class="el" href="taxonomy_8php.html#a03f55ee46c5f496e42f3d29db8d09cce">obj_verbs()</a>, <a class="el" href="parse__url_8php.html#a05a9e8944380ba3cf6bbf5893dd4b74b">parse_url_content()</a>, <a class="el" href="comanche_8php.html#af7150df735e5ff9d467994cd6f769c6e">pdl_selector()</a>, <a class="el" href="permissions_8php.html#a67ada9ed51e77885b6b0f6a28cee1835">perm_is_allowed()</a>, <a class="el" href="include_2photos_8php.html#a6c40ef58aefef705a5adc84a40e97109">photo_upload()</a>, <a class="el" href="include_2photos_8php.html#a7e7abc69872180697c5471dc69349afe">photos_album_get_db_idstr()</a>, <a class="el" href="include_2photos_8php.html#ad648c0c5544fe9263409b6f6e57c6274">photos_create_item()</a>, <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>, <a class="el" href="ping_8php.html#a77217b1b190b4c5d8770867b45f0c0a1">ping_init()</a>, <a class="el" href="po2php_8php.html#a3b75e36f913198299e99559b175cd8b4">po2php_run()</a>, <a class="el" href="poke_8php.html#a9725aab97b3983e6a98bd81c4efe7d3b">poke_init()</a>, <a class="el" href="items_8php.html#a410f9c743877c125ca06312373346903">post_activity_item()</a>, <a class="el" href="post_8php.html#af4b48181ce773ef0cdfc972441445c34">post_init()</a>, <a class="el" href="post_8php.html#af59e6a1dc22d19d9257b01cd7ccedb75">post_post()</a>, <a class="el" href="boot_8php.html#ab346a2ece14993861f3e4206befa94f0">proc_run()</a>, <a class="el" href="zot_8php.html#ac301c67864917c35922257950ae0f95c">process_channel_sync_delivery()</a>, <a class="el" href="zot_8php.html#a37ec13b18057634eadb071f05297f5e1">process_delivery()</a>, <a class="el" href="zot_8php.html#aa6ae96db8cbbdbb10e6876d206bbf7cc">process_mail_delivery()</a>, <a class="el" href="zot_8php.html#a9a57b40669351c9791126b925cb7ef3b">process_profile_delivery()</a>, <a class="el" href="activities_8php.html#a80134e807719b3c54aba971958d2e132">profile_activity()</a>, <a class="el" href="identity_8php.html#a432259b2cf5b6f59be53e71db9f2c7dc">profile_sidebar()</a>, <a class="el" href="profiles_8php.html#a46975783b8b8d70402d51487eb1f0b00">profiles_content()</a>, <a class="el" href="view_2theme_2redbasic_2php_2config_8php.html#a8574a41fa9735ee391ba57ab24b93793">redbasic_form()</a>, <a class="el" href="register_8php.html#a51731dcc1917c58a790eb1c0f6132271">register_post()</a>, <a class="el" href="zot_8php.html#aad25a3fe0e1566121d6fb8222979bc10">remove_community_tag()</a>, <a class="el" href="text_8php.html#a9c6ce4e12a4ac883c5e3f36fed6e1e09">replace_macros()</a>, <a class="el" href="classphoto__driver.html#a5864fae7d8389372955a8e78cec527ac">photo_driver\save()</a>, <a class="el" href="account_8php.html#a014de2d5d5c9785de5bf547a485822fa">send_reg_approval_email()</a>, <a class="el" href="plugin_8php.html#a030cec6793b909c439c0336ba39b1571">service_class_allows()</a>, <a class="el" href="plugin_8php.html#a905b54e10704b283ac64680a8abc0971">service_class_fetch()</a>, <a class="el" href="classApp.html#abea5a4f77dcd53c928dc4eed86616637">App\set_apps()</a>, <a class="el" href="settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586">settings_post()</a>, <a class="el" href="event_8php.html#a018ea4484910a873a7c1eaa126de9b1a">sort_by_date()</a>, <a class="el" href="text_8php.html#a8796f6a9ca592ecdce7b3afc3462aa13">stringify_array_elms()</a>, <a class="el" href="subthread_8php.html#a50368f3d825b77996030528e7fbfa3d3">subthread_content()</a>, <a class="el" href="suggest_8php.html#a58748a8235d4523f8333847f3e42dd91">suggest_content()</a>, <a class="el" href="tagger_8php.html#a0e4a3eb177d1684553c547503d67161c">tagger_content()</a>, <a class="el" href="tagrm_8php.html#adfd4ea5b4d7fc6d9c9e042af5cd7d49a">tagrm_content()</a>, <a class="el" href="tagrm_8php.html#a1702f40aa53a2fa93deade1f609abe78">tagrm_post()</a>, <a class="el" href="text_8php.html#af9c9ac3f74c82dc60acfa404d0e9dc53">theme_attachments()</a>, <a class="el" href="view_2theme_2redbasic_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d">theme_content()</a>, <a class="el" href="thing_8php.html#a8be23b1d475ec3d9291999221c674c80">thing_init()</a>, <a class="el" href="identity_8php.html#af2802bc13a00a17b867bba7978ba8f58">validate_channelname()</a>, <a class="el" href="wfinger_8php.html#ae21e50c8d0a5f3c9be9f43a4e519acd3">wfinger_init()</a>, <a class="el" href="widgets_8php.html#add9b24d3304e529a7975e96122315554">widget_affinity()</a>, <a class="el" href="widgets_8php.html#a7b1e357b5a2027718470b77ec921fc65">widget_archive()</a>, <a class="el" href="widgets_8php.html#a0d404276fedc59f5038cf5c085028326">widget_suggestions()</a>, <a class="el" href="widgets_8php.html#ae4ced69d83dbdd9e6b51660d9eba8653">widget_tagcloud_wall()</a>, <a class="el" href="text_8php.html#a543447c5ed766535221e2d9636b379ee">xchan_mail_query()</a>, <a class="el" href="text_8php.html#a36a2e5d418ee81140f25c4233cfecd1f">xchan_query()</a>, <a class="el" href="include_2network_8php.html#a99353baabbc3e0584b85eb79ee802cff">xml2array()</a>, <a class="el" href="xrd_8php.html#aee3cf087968e4a0ff3a87de16eb23270">xrd_init()</a>, <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>, <a class="el" href="identity_8php.html#a5b815330f3d177ab383af37a6c12e532">zid()</a>, <a class="el" href="identity_8php.html#a680fbafc2db023c5b1309e0180e81315">zid_init()</a>, <a class="el" href="zot_8php.html#a61cdc1ec843663c423ed2d8160ae5aea">zot_fetch()</a>, <a class="el" href="zot_8php.html#a55056e863a7860bc0cf922e78fcce073">zot_gethub()</a>, <a class="el" href="zot_8php.html#aeea071f17e306fe3d0c488551906bfab">zot_import()</a>, <a class="el" href="zot_8php.html#a928f5643ca66ae9635d85aeb2be62e03">zot_process_response()</a>, and <a class="el" href="zot_8php.html#a5bcdfef419b16075a0eca990956223dc">zot_register_hub()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a9590b15215a21e9b42eb546aeef79704"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$files = array('index.php','boot.php')</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="admin_8php.html#a54128076986ba80c4a103de3fc3e19a8">admin_page_plugins()</a>, <a class="el" href="admin_8php.html#ac0f3bd12431c056aad77bac9d09fa30e">admin_page_site()</a>, <a class="el" href="admin_8php.html#af124619fdc278fe2bf14c45ddaa260fb">admin_page_themes()</a>, <a class="el" href="view_2theme_2apw_2php_2config_8php.html#a8b51951a70e1c1324be71345a61d70ec">apw_form()</a>, <a class="el" href="fbrowser_8php.html#aee476addcf7a3e0fe9454f7dfd5a56c4">fbrowser_content()</a>, <a class="el" href="filestorage_8php.html#a61bb1be78472555df4ce619f51014040">filestorage_content()</a>, <a class="el" href="classRedBrowser.html#a1f7daf50bb9bfcde7345b3b1908dbd7e">RedBrowser\generateDirectoryIndex()</a>, and <a class="el" href="view_2theme_2redbasic_2php_2config_8php.html#a8574a41fa9735ee391ba57ab24b93793">redbasic_form()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a50b05cf2e02ef0b67fcad97106dd7634"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$s = '&lt;?php' . &quot;\n&quot;</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classTemplate.html#ac41c96e1f407b1a910029e5f4b7de8e4">Template\_build_nodes()</a>, <a class="el" href="classTemplate.html#aa6f9bd7a8f7512efcf90e8d376fe05ee">Template\_replcb_node()</a>, <a class="el" href="admin_8php.html#af124619fdc278fe2bf14c45ddaa260fb">admin_page_themes()</a>, <a class="el" href="text_8php.html#a95fd2f8f23a1948414a03ebc963bac57">attribute_contains()</a>, <a class="el" href="text_8php.html#a13286f8a95d2de6b102966ecc270c8d6">base64url_decode()</a>, <a class="el" href="text_8php.html#a070384ec000fd65043fce11d5392d241">base64url_encode()</a>, <a class="el" href="bb2diaspora_8php.html#ad0abe1a7ee50aa0736a233df0a422eba">bb_tag_preg_replace()</a>, <a class="el" href="text_8php.html#a3d2793d66db3345fd290b71e2eadf98e">bb_translate_video()</a>, <a class="el" href="event_8php.html#a180cccd63c2a2f00ff432b03113531f3">bbtoevent()</a>, <a class="el" href="event_8php.html#a184d6b9690e5b6dee35a0aa9edd47279">bbtovcal()</a>, <a class="el" href="text_8php.html#a55ab893be57feda59c2a7ba1e58ff2d0">chanlink_hash()</a>, <a class="el" href="text_8php.html#a2e8d6c402603be3a1256a16605e09c2a">chanlink_url()</a>, <a class="el" href="comanche_8php.html#a1a208fdb40dd83d6298caec4290ee922">comanche_parser()</a>, <a class="el" href="comanche_8php.html#a5718daeda40bf835345fe061e8808cdf">comanche_region()</a>, <a class="el" href="comanche_8php.html#ae9fe1ce574db3dd0931eada80234f82a">comanche_webpage()</a>, <a class="el" href="datetime_8php.html#ad6301e74b0f9267d52f8d432b5beb226">datetime_convert()</a>, <a class="el" href="text_8php.html#a63fb21c0bed2fc72eef2c1471ac42b63">day_translate()</a>, <a class="el" href="language_8php.html#a632da17c7ac0d2dc1a00a4706870194b">detect_language()</a>, <a class="el" href="bb2diaspora_8php.html#a26c09c218413610e62e60754c579f6c6">diaspora2bb()</a>, <a class="el" href="bb2diaspora_8php.html#a8b96bd45884fa1c40b942939354197d4">diaspora_ol()</a>, <a class="el" href="bb2diaspora_8php.html#adc92ccda5f85ed27e64fcc17712c89cc">diaspora_ul()</a>, <a class="el" href="text_8php.html#ae4282a39492caa23ccbc2ce98e54f110">expand_acl()</a>, <a class="el" href="taxonomy_8php.html#a08df5164926d2b31b8e9fcfe919de2b6">file_tag_decode()</a>, <a class="el" href="taxonomy_8php.html#a3299482ac20e9d79453048dd52881d37">file_tag_encode()</a>, <a class="el" href="taxonomy_8php.html#a163b5131f388080b0fc82398d3a32fe1">file_tag_file_query()</a>, <a class="el" href="text_8php.html#afdc69fe3f6c09e35e46304dcea63ae28">fix_mce_lf()</a>, <a class="el" href="items_8php.html#aba98fcbbcd7044a7e9ea34edabc14c87">fix_private_photos()</a>, <a class="el" href="text_8php.html#a3054189cff173977f4216c9a3dd29e1b">format_categories()</a>, <a class="el" href="text_8php.html#a4e4d42b0a805148d9f9a92bcac89bf91">format_filer()</a>, <a class="el" href="taxonomy_8php.html#adfead45e3b8a3dfb2b4a4b9281d0dbe1">format_term_for_display()</a>, <a class="el" href="bb2diaspora_8php.html#a4c2f8f11b29a06809d9b07782215b1b2">get_bb_tag_pos()</a>, <a class="el" href="plugin_8php.html#acb63c27d07f6d7dffe95f98a6cef1295">get_intltext_template()</a>, <a class="el" href="plugin_8php.html#a75f7dfed291fd7add7fc85b5c022a1f4">get_markup_template()</a>, <a class="el" href="text_8php.html#a4659fbc4e54ddc700c3aa66b9092c623">get_tags()</a>, <a class="el" href="text_8php.html#a138a3a611fa7f4f3630674145fc826bf">html2bb_video()</a>, <a class="el" href="boot_8php.html#adfb2fc7be5a4226c0a8e24131da9d498">info()</a>, <a class="el" href="text_8php.html#a1557112a774ec00fa06ed6b6f6495506">is_a_date_arg()</a>, <a class="el" href="identity_8php.html#ae2b140df652a55ca11bb6a99005fce35">is_foreigner()</a>, <a class="el" href="identity_8php.html#a9637c557e13d9671f3eeb124ab98212a">is_member()</a>, <a class="el" href="text_8php.html#a0271381208acfa2d4cff36da281e3e23">json_decode_plus()</a>, <a class="el" href="text_8php.html#a2690ad67bb6fb97ef69de3e8d23f2728">legal_webbie()</a>, <a class="el" href="text_8php.html#a11255c8c4e5245b6c24f97684826aa54">linkify()</a>, <a class="el" href="text_8php.html#a1e510c53624933ce9b7d6715784894db">magic_link()</a>, <a class="el" href="mail_8php.html#a3c7c485fc69f92371e8b20936040eca1">mail_content()</a>, <a class="el" href="contact__selectors_8php.html#ad472e4716426dd1a9dd77b62962454be">network_to_name()</a>, <a class="el" href="text_8php.html#adba17ec946f4285285dc100f7860bf51">normalise_openid()</a>, <a class="el" href="boot_8php.html#a9255af5ae9c887520091ea04763c1a88">notice()</a>, <a class="el" href="notifier_8php.html#a568c502f626cff95e344c0748938b85d">notifier_run()</a>, <a class="el" href="include_2oembed_8php.html#a9e57f3e36a0a0a47e6db79544b701d9a">oembed_iframe()</a>, <a class="el" href="include_2oembed_8php.html#a00c4c80deffd9daf8dc97b58d4c64ed0">oembed_replacecb()</a>, <a class="el" href="oexchange_8php.html#a2d8b785cd7d041a4e6274f5af370cf26">oexchange_content()</a>, <a class="el" href="include_2network_8php.html#a27a951b59d8d622c0b3e7b0673ba74c6">parse_xml_string()</a>, <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>, <a class="el" href="socgraph_8php.html#a5ef8bef37161df53718a21e93d02fbd6">poco_load()</a>, <a class="el" href="text_8php.html#ae4df74296fbe55051ed3c035e55205e5">prepare_body()</a>, <a class="el" href="tpldebug_8php.html#a44778457a6c02554812fbfad19d32ba3">print_template()</a>, <a class="el" href="dba__driver_8php.html#a55bf30d8176967e682656b5be4ad9249">printable()</a>, <a class="el" href="include_2message_8php.html#a5f8de9847e203329e317ac38dc646898">private_messages_fetch_conversation()</a>, <a class="el" href="include_2message_8php.html#a254a756031e4d5e94f85e2939bdb5091">private_messages_fetch_message()</a>, <a class="el" href="include_2message_8php.html#a652973ce47a262f2d238c2fd6233d97e">private_messages_list()</a>, <a class="el" href="text_8php.html#a4e7698aca48982512594b274543c3b9b">protect_sprintf()</a>, <a class="el" href="text_8php.html#a4841df5beabdd1bdd1ed56781a915d61">purify_html()</a>, <a class="el" href="text_8php.html#afc998d2796a6b2a08e96f7cc061e7221">qp()</a>, <a class="el" href="text_8php.html#a9d6a5ee1290de7a8b483fe78585daade">random_string()</a>, <a class="el" href="classTemplate.html#a285b5b2007dbbf733476273df3fed4ef">Template\replace()</a>, <a class="el" href="text_8php.html#a9c6ce4e12a4ac883c5e3f36fed6e1e09">replace_macros()</a>, <a class="el" href="classFriendicaSmartyEngine.html#ad62f1181d2f02b54b46731ad2bd46db2">FriendicaSmartyEngine\replace_macros()</a>, <a class="el" href="classTemplate.html#a07737733f6949bdedea1e3d301b2ab7b">Template\replace_macros()</a>, <a class="el" href="include_2network_8php.html#ae8d9c41a11000fb8667039fc71b4f73f">scale_external_images()</a>, <a class="el" href="text_8php.html#a876e94892867019935b348b573299352">search()</a>, <a class="el" href="text_8php.html#aae91e4d2a2c6f7a9daccd2c186ae3447">searchbox()</a>, <a class="el" href="siteinfo_8php.html#a70c09bfb6dd1c86a125a35f62ed53656">siteinfo_content()</a>, <a class="el" href="text_8php.html#a3d225b253bb9e0f2498c11647d927b0b">smilies()</a>, <a class="el" href="text_8php.html#a33bdb5d4bfff2ede7caf61a98ac0a2e9">sslify()</a>, <a class="el" href="bb2diaspora_8php.html#a180b0e3a7d702998be19e3c3b44b0e93">stripdcode_br_cb()</a>, <a class="el" href="language_8php.html#aae0c3638fb476ae1e31f8d242f5dac04">t()</a>, <a class="el" href="template__processor_8php.html#ab2bcd8738f20f293636a6ae8e1099db5">template_escape()</a>, <a class="el" href="template__processor_8php.html#ac635bb19a5f6eadd6b0cddefdd537c1e">template_unescape()</a>, <a class="el" href="taxonomy_8php.html#a7a913d19c77610da689be48fbbf6734c">term_query()</a>, <a class="el" href="text_8php.html#af9c9ac3f74c82dc60acfa404d0e9dc53">theme_attachments()</a>, <a class="el" href="text_8php.html#a29d6b804e368d3ef359ee295e96ed4c7">unamp()</a>, <a class="el" href="text_8php.html#a740ad03e00459039a2c0992246c4e727">undo_post_tagging()</a>, <a class="el" href="text_8php.html#a1360fed7f918d859daaca1c9f384f9af">unxmlify()</a>, <a class="el" href="classTemplate.html#abbc484016ddf5d818f55b823cae6feb0">Template\var_replace()</a>, <a class="el" href="include_2network_8php.html#a8122356933bcd6b0a8567e8e15ae5cc5">webfinger()</a>, <a class="el" href="include_2network_8php.html#adf6008b38c555e98e7ed10da9ede2335">webfinger_dfrn()</a>, <a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x()</a>, <a class="el" href="include_2network_8php.html#aafd06c0a75402aefb06cfb9f9740fa37">z_fetch_url()</a>, <a class="el" href="text_8php.html#a324c58f37f6acdf9cd1922aa76077d9f">z_input_filter()</a>, <a class="el" href="include_2network_8php.html#a9129fd55e7fc175b4ea9a195cccc16bc">z_post_url()</a>, <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>, and <a class="el" href="identity_8php.html#a5b815330f3d177ab383af37a6c12e532">zid()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a0cbe524ffc9a496114fd7ba9f423ef44"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="typo_8php.html#a329c9c12217d2c8660c47bbc7c8df4c5">foreach</a> ($arr as $a) $zones = timezone_identifiers_list()</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/extract_8php.js b/doc/html/extract_8php.js
new file mode 100644
index 000000000..af6949603
--- /dev/null
+++ b/doc/html/extract_8php.js
@@ -0,0 +1,7 @@
+var extract_8php =
+[
+ [ "$arr", "extract_8php.html#a63bb4c41bc532baacf6a4976cfaa0feb", null ],
+ [ "$files", "extract_8php.html#a9590b15215a21e9b42eb546aeef79704", null ],
+ [ "$s", "extract_8php.html#a50b05cf2e02ef0b67fcad97106dd7634", null ],
+ [ "$zones", "extract_8php.html#a0cbe524ffc9a496114fd7ba9f423ef44", null ]
+]; \ No newline at end of file
diff --git a/doc/html/fbrowser_8php.html b/doc/html/fbrowser_8php.html
new file mode 100644
index 000000000..0ccc72963
--- /dev/null
+++ b/doc/html/fbrowser_8php.html
@@ -0,0 +1,149 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/fbrowser.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('fbrowser_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#namespaces">Namespaces</a> &#124;
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">fbrowser.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="namespaces"></a>
+Namespaces</h2></td></tr>
+<tr class="memitem:namespaceFriendica"><td class="memItemLeft" align="right" valign="top">namespace &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespaceFriendica.html">Friendica</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:aee476addcf7a3e0fe9454f7dfd5a56c4"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fbrowser_8php.html#aee476addcf7a3e0fe9454f7dfd5a56c4">fbrowser_content</a> ($a)</td></tr>
+<tr class="separator:aee476addcf7a3e0fe9454f7dfd5a56c4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="aee476addcf7a3e0fe9454f7dfd5a56c4"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">fbrowser_content </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype"><a class="el" href="classApp.html">App</a></td><td class="paramname">$a</td><td></td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/fbrowser_8php.js b/doc/html/fbrowser_8php.js
new file mode 100644
index 000000000..5dbc20d7b
--- /dev/null
+++ b/doc/html/fbrowser_8php.js
@@ -0,0 +1,4 @@
+var fbrowser_8php =
+[
+ [ "fbrowser_content", "fbrowser_8php.html#aee476addcf7a3e0fe9454f7dfd5a56c4", null ]
+]; \ No newline at end of file
diff --git a/doc/html/fcontact_8php.html b/doc/html/fcontact_8php.html
new file mode 100644
index 000000000..a41905176
--- /dev/null
+++ b/doc/html/fcontact_8php.html
@@ -0,0 +1,187 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Project: include/fcontact.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="r!-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Project
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('fcontact_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">fcontact.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a4ce1d8d444c938790e0d50e003d04a15"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fcontact_8php.html#a4ce1d8d444c938790e0d50e003d04a15">fcontact_store</a> ($url, $name, $photo)</td></tr>
+<tr class="separator:a4ce1d8d444c938790e0d50e003d04a15"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4512592814dc7883b57bf01ac33353f6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fcontact_8php.html#a4512592814dc7883b57bf01ac33353f6">ffinder_store</a> ($uid, $cid, $fid)</td></tr>
+<tr class="separator:a4512592814dc7883b57bf01ac33353f6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a4ce1d8d444c938790e0d50e003d04a15"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">fcontact_store </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$url</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$name</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$photo</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a4512592814dc7883b57bf01ac33353f6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">ffinder_store </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$cid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$fid</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/fcontact_8php.js b/doc/html/fcontact_8php.js
new file mode 100644
index 000000000..de48747b1
--- /dev/null
+++ b/doc/html/fcontact_8php.js
@@ -0,0 +1,5 @@
+var fcontact_8php =
+[
+ [ "fcontact_store", "fcontact_8php.html#a4ce1d8d444c938790e0d50e003d04a15", null ],
+ [ "ffinder_store", "fcontact_8php.html#a4512592814dc7883b57bf01ac33353f6", null ]
+]; \ No newline at end of file
diff --git a/doc/html/features_8php.html b/doc/html/features_8php.html
new file mode 100644
index 000000000..b158711f7
--- /dev/null
+++ b/doc/html/features_8php.html
@@ -0,0 +1,166 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/features.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('features_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">features.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a52b5bdfb61b256713efecf7a7b20b0c0"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="features_8php.html#a52b5bdfb61b256713efecf7a7b20b0c0">feature_enabled</a> ($uid, $feature)</td></tr>
+<tr class="separator:a52b5bdfb61b256713efecf7a7b20b0c0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae73c5b03b01c7284ed7e7e0e774e975c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="features_8php.html#ae73c5b03b01c7284ed7e7e0e774e975c">get_features</a> ()</td></tr>
+<tr class="separator:ae73c5b03b01c7284ed7e7e0e774e975c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a52b5bdfb61b256713efecf7a7b20b0c0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">feature_enabled </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$feature</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="view_2theme_2apw_2php_2config_8php.html#a8b51951a70e1c1324be71345a61d70ec">apw_form()</a>, <a class="el" href="contact__widgets_8php.html#a165eb021e61c4dcab2a552f28628d353">categories_widget()</a>, <a class="el" href="connedit_8php.html#a795acb3d9d841f55c255d7611681ab67">connedit_content()</a>, <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation()</a>, <a class="el" href="editblock_8php.html#abbe8f55de06967bc8d79d620509a49e6">editblock_content()</a>, <a class="el" href="editlayout_8php.html#aa877e4157a26b099de904164181dd386">editlayout_content()</a>, <a class="el" href="editpost_8php.html#a34011690864d122680c802e9e748ccfb">editpost_content()</a>, <a class="el" href="editwebpage_8php.html#a375e945255fad79a71036528f7480650">editwebpage_content()</a>, <a class="el" href="classItem.html#a3ee7667c2ec6cd7657328e27848c0bdf">Item\get_comment_box()</a>, <a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">Item\get_template_data()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="mail_8php.html#a3c7c485fc69f92371e8b20936040eca1">mail_content()</a>, <a class="el" href="mail_8php.html#acfc2cc0bf4e0b178207758384977f25a">mail_post()</a>, <a class="el" href="nav_8php.html#a43be0df73b90647ea70947ce004e231e">nav()</a>, <a class="el" href="items_8php.html#abe695dd89e1e10ed042c26b80114f0ed">posted_date_widget()</a>, <a class="el" href="identity_8php.html#a432259b2cf5b6f59be53e71db9f2c7dc">profile_sidebar()</a>, <a class="el" href="profiles_8php.html#a46975783b8b8d70402d51487eb1f0b00">profiles_content()</a>, <a class="el" href="view_2theme_2redbasic_2php_2config_8php.html#a8574a41fa9735ee391ba57ab24b93793">redbasic_form()</a>, <a class="el" href="rpost_8php.html#a8190354d789000806d9879aea276728f">rpost_content()</a>, <a class="el" href="text_8php.html#a876e94892867019935b348b573299352">search()</a>, <a class="el" href="text_8php.html#aae91e4d2a2c6f7a9daccd2c186ae3447">searchbox()</a>, <a class="el" href="sources_8php.html#ac442ccef080ab95772d8929fcafcb4b7">sources_content()</a>, <a class="el" href="sources_8php.html#ac73298ff162ce7b2de8dcaf3d3305b1e">sources_post()</a>, <a class="el" href="thing_8php.html#a24a35f1e64029a67fdbea94a776ae04b">thing_content()</a>, <a class="el" href="widgets_8php.html#add9b24d3304e529a7975e96122315554">widget_affinity()</a>, <a class="el" href="widgets_8php.html#a7b1e357b5a2027718470b77ec921fc65">widget_archive()</a>, <a class="el" href="widgets_8php.html#a45ea061dabe9a8372e4ca3b9e5714256">widget_notes()</a>, <a class="el" href="widgets_8php.html#a94203eb9bcd63cbdecbbcb15163598d8">widget_savedsearch()</a>, <a class="el" href="widgets_8php.html#aaa73bcf1702eaadd9dcd253502f55e01">widget_settings_menu()</a>, <a class="el" href="widgets_8php.html#a0d404276fedc59f5038cf5c085028326">widget_suggestions()</a>, and <a class="el" href="widgets_8php.html#ae4ced69d83dbdd9e6b51660d9eba8653">widget_tagcloud_wall()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ae73c5b03b01c7284ed7e7e0e774e975c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_features </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/features_8php.js b/doc/html/features_8php.js
new file mode 100644
index 000000000..d5f51e5f7
--- /dev/null
+++ b/doc/html/features_8php.js
@@ -0,0 +1,5 @@
+var features_8php =
+[
+ [ "feature_enabled", "features_8php.html#a52b5bdfb61b256713efecf7a7b20b0c0", null ],
+ [ "get_features", "features_8php.html#ae73c5b03b01c7284ed7e7e0e774e975c", null ]
+]; \ No newline at end of file
diff --git a/doc/html/feed_8php.html b/doc/html/feed_8php.html
new file mode 100644
index 000000000..8b44eacb2
--- /dev/null
+++ b/doc/html/feed_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/feed.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('feed_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">feed.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:af86137700b56f33d1d5f25c8dec22c04"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="feed_8php.html#af86137700b56f33d1d5f25c8dec22c04">feed_init</a> (&amp;$a)</td></tr>
+<tr class="separator:af86137700b56f33d1d5f25c8dec22c04"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="af86137700b56f33d1d5f25c8dec22c04"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">feed_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/feed_8php.js b/doc/html/feed_8php.js
new file mode 100644
index 000000000..b218d275b
--- /dev/null
+++ b/doc/html/feed_8php.js
@@ -0,0 +1,4 @@
+var feed_8php =
+[
+ [ "feed_init", "feed_8php.html#af86137700b56f33d1d5f25c8dec22c04", null ]
+]; \ No newline at end of file
diff --git a/doc/html/filer_8php.html b/doc/html/filer_8php.html
new file mode 100644
index 000000000..1c74122fd
--- /dev/null
+++ b/doc/html/filer_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/filer.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('filer_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">filer.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a5fd5d7e61b2f9c43cb5f110c89dc4274"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="filer_8php.html#a5fd5d7e61b2f9c43cb5f110c89dc4274">filer_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a5fd5d7e61b2f9c43cb5f110c89dc4274"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a5fd5d7e61b2f9c43cb5f110c89dc4274"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">filer_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/filer_8php.js b/doc/html/filer_8php.js
new file mode 100644
index 000000000..be0098bdc
--- /dev/null
+++ b/doc/html/filer_8php.js
@@ -0,0 +1,4 @@
+var filer_8php =
+[
+ [ "filer_content", "filer_8php.html#a5fd5d7e61b2f9c43cb5f110c89dc4274", null ]
+]; \ No newline at end of file
diff --git a/doc/html/filerm_8php.html b/doc/html/filerm_8php.html
new file mode 100644
index 000000000..ce948f3b1
--- /dev/null
+++ b/doc/html/filerm_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/filerm.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('filerm_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">filerm.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ae2eb28d2054fa2c37e38689882172208"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="filerm_8php.html#ae2eb28d2054fa2c37e38689882172208">filerm_content</a> (&amp;$a)</td></tr>
+<tr class="separator:ae2eb28d2054fa2c37e38689882172208"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="ae2eb28d2054fa2c37e38689882172208"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">filerm_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/filerm_8php.js b/doc/html/filerm_8php.js
new file mode 100644
index 000000000..bc36f3054
--- /dev/null
+++ b/doc/html/filerm_8php.js
@@ -0,0 +1,4 @@
+var filerm_8php =
+[
+ [ "filerm_content", "filerm_8php.html#ae2eb28d2054fa2c37e38689882172208", null ]
+]; \ No newline at end of file
diff --git a/doc/html/files.html b/doc/html/files.html
new file mode 100644
index 000000000..e9784846e
--- /dev/null
+++ b/doc/html/files.html
@@ -0,0 +1,385 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('files.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">File List</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock">Here is a list of all files with brief descriptions:</div><div class="directory">
+<div class="levels">[detail level <span onclick="javascript:toggleLevel(1);">1</span><span onclick="javascript:toggleLevel(2);">2</span><span onclick="javascript:toggleLevel(3);">3</span><span onclick="javascript:toggleLevel(4);">4</span><span onclick="javascript:toggleLevel(5);">5</span><span onclick="javascript:toggleLevel(6);">6</span><span onclick="javascript:toggleLevel(7);">7</span>]</div><table class="directory">
+<tr id="row_0_" class="even"><td class="entry"><img id="arr_0_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('0_')"/><img id="img_0_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('0_')"/><a class="el" href="dir_d44c64559bbebec7f509842c48db8b23.html" target="_self">include</a></td><td class="desc"></td></tr>
+<tr id="row_0_0_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_0_0_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('0_0_')"/><img id="img_0_0_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('0_0_')"/><a class="el" href="dir_21bc5169ff11430004758be31dcfc6c4.html" target="_self">dba</a></td><td class="desc"></td></tr>
+<tr id="row_0_0_0_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="dba__driver_8php.html" target="_self">dba_driver.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_0_1_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="dba__mysql_8php.html" target="_self">dba_mysql.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_0_2_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="dba__mysqli_8php.html" target="_self">dba_mysqli.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_1_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_0_1_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('0_1_')"/><img id="img_0_1_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('0_1_')"/><a class="el" href="dir_aae29906d7bfc07d076125f669c8352e.html" target="_self">photo</a></td><td class="desc"></td></tr>
+<tr id="row_0_1_0_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="photo__driver_8php.html" target="_self">photo_driver.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_1_1_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="photo__gd_8php.html" target="_self">photo_gd.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_1_2_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="photo__imagick_8php.html" target="_self">photo_imagick.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_2_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="account_8php.html" target="_self">account.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="acl__selectors_8php.html" target="_self">acl_selectors.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_4_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="activities_8php.html" target="_self">activities.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_5_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="include_2api_8php.html" target="_self">api.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_6_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="include_2attach_8php.html" target="_self">attach.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_7_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="auth_8php.html" target="_self">auth.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_8_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="BaseObject_8php.html" target="_self">BaseObject.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_9_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="bb2diaspora_8php.html" target="_self">bb2diaspora.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_10_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="bbcode_8php.html" target="_self">bbcode.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_11_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="cache_8php.html" target="_self">cache.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_12_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="include_2chanman_8php.html" target="_self">chanman.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_13_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="cli__startup_8php.html" target="_self">cli_startup.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_14_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="cli__suggest_8php.html" target="_self">cli_suggest.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_15_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="comanche_8php.html" target="_self">comanche.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_16_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="include_2config_8php.html" target="_self">config.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_17_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="Contact_8php.html" target="_self">Contact.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_18_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="contact__selectors_8php.html" target="_self">contact_selectors.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_19_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="contact__widgets_8php.html" target="_self">contact_widgets.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_20_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="conversation_8php.html" target="_self">conversation.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_21_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="ConversationObject_8php.html" target="_self">ConversationObject.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_22_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="cronhooks_8php.html" target="_self">cronhooks.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_23_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="crypto_8php.html" target="_self">crypto.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_24_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="datetime_8php.html" target="_self">datetime.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_25_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="deliver_8php.html" target="_self">deliver.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_26_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="dir__fns_8php.html" target="_self">dir_fns.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_27_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="include_2directory_8php.html" target="_self">directory.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_28_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="enotify_8php.html" target="_self">enotify.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_29_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="event_8php.html" target="_self">event.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_30_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="expire_8php.html" target="_self">expire.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_31_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="features_8php.html" target="_self">features.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_32_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="include_2follow_8php.html" target="_self">follow.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_33_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="friendica__smarty_8php.html" target="_self">friendica_smarty.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_34_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="gprobe_8php.html" target="_self">gprobe.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_35_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="include_2group_8php.html" target="_self">group.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_36_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="html2bbcode_8php.html" target="_self">html2bbcode.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_37_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="html2plain_8php.html" target="_self">html2plain.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_38_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="identity_8php.html" target="_self">identity.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_39_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="ItemObject_8php.html" target="_self">ItemObject.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_40_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="ITemplateEngine_8php.html" target="_self">ITemplateEngine.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_41_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="items_8php.html" target="_self">items.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_42_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="language_8php.html" target="_self">language.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_43_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="include_2menu_8php.html" target="_self">menu.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_44_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="include_2message_8php.html" target="_self">message.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_45_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="nav_8php.html" target="_self">nav.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_46_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="include_2network_8php.html" target="_self">network.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_47_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="notifier_8php.html" target="_self">notifier.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_48_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="include_2notify_8php.html" target="_self">notify.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_49_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="oauth_8php.html" target="_self">oauth.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_50_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="include_2oembed_8php.html" target="_self">oembed.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_51_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="onedirsync_8php.html" target="_self">onedirsync.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_52_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="onepoll_8php.html" target="_self">onepoll.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_53_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="page__widgets_8php.html" target="_self">page_widgets.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_54_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="permissions_8php.html" target="_self">permissions.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_55_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="include_2photos_8php.html" target="_self">photos.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_56_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="plugin_8php.html" target="_self">plugin.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_57_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="poller_8php.html" target="_self">poller.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_58_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="profile__selectors_8php.html" target="_self">profile_selectors.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_59_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="ProtoDriver_8php.html" target="_self">ProtoDriver.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_60_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="queue_8php.html" target="_self">queue.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_61_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="queue__fn_8php.html" target="_self">queue_fn.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_62_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="reddav_8php.html" target="_self">reddav.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_63_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="security_8php.html" target="_self">security.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_64_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="session_8php.html" target="_self">session.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_65_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="socgraph_8php.html" target="_self">socgraph.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_66_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="system__unavailable_8php.html" target="_self">system_unavailable.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_67_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="taxonomy_8php.html" target="_self">taxonomy.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_68_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="template__processor_8php.html" target="_self">template_processor.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_69_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="text_8php.html" target="_self">text.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_70_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="widgets_8php.html" target="_self">widgets.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_71_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="zot_8php.html" target="_self">zot.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_"><td class="entry"><img id="arr_1_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('1_')"/><img id="img_1_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('1_')"/><a class="el" href="dir_d41ce877eb409a4791b288730010abe2.html" target="_self">mod</a></td><td class="desc"></td></tr>
+<tr id="row_1_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="__well__known_8php.html" target="_self">_well_known.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_1_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="achievements_8php.html" target="_self">achievements.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_2_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="acl_8php.html" target="_self">acl.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_3_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="admin_8php.html" target="_self">admin.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_4_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="mod_2api_8php.html" target="_self">api.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_5_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="apps_8php.html" target="_self">apps.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_6_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="mod_2attach_8php.html" target="_self">attach.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_7_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="blocks_8php.html" target="_self">blocks.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_8_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="mod_2chanman_8php.html" target="_self">chanman.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_9_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="channel_8php.html" target="_self">channel.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_10_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="chanview_8php.html" target="_self">chanview.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_11_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="cloud_8php.html" target="_self">cloud.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_12_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="common_8php.html" target="_self">common.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_13_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="community_8php.html" target="_self">community.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_14_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="connect_8php.html" target="_self">connect.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_15_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="connections_8php.html" target="_self">connections.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_16_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="connedit_8php.html" target="_self">connedit.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_17_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="contactgroup_8php.html" target="_self">contactgroup.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_18_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="delegate_8php.html" target="_self">delegate.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_19_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="mod_2directory_8php.html" target="_self">directory.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_20_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="dirprofile_8php.html" target="_self">dirprofile.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_21_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="dirsearch_8php.html" target="_self">dirsearch.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_22_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="display_8php.html" target="_self">display.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_23_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="editblock_8php.html" target="_self">editblock.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_24_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="editlayout_8php.html" target="_self">editlayout.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_25_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="editpost_8php.html" target="_self">editpost.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_26_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="editwebpage_8php.html" target="_self">editwebpage.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_27_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="events_8php.html" target="_self">events.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_28_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="fbrowser_8php.html" target="_self">fbrowser.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_29_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="feed_8php.html" target="_self">feed.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_30_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="filer_8php.html" target="_self">filer.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_31_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="filerm_8php.html" target="_self">filerm.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_32_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="filestorage_8php.html" target="_self">filestorage.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_33_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="mod_2follow_8php.html" target="_self">follow.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_34_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="fsuggest_8php.html" target="_self">fsuggest.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_35_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="mod_2group_8php.html" target="_self">group.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_36_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="help_8php.html" target="_self">help.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_37_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="home_8php.html" target="_self">home.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_38_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="hostxrd_8php.html" target="_self">hostxrd.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_39_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="import_8php.html" target="_self">import.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_40_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="invite_8php.html" target="_self">invite.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_41_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="item_8php.html" target="_self">item.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_42_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="layouts_8php.html" target="_self">layouts.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_43_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="like_8php.html" target="_self">like.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_44_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="lockview_8php.html" target="_self">lockview.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_45_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="login_8php.html" target="_self">login.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_46_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="lostpass_8php.html" target="_self">lostpass.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_47_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="magic_8php.html" target="_self">magic.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_48_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="mail_8php.html" target="_self">mail.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_49_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="manage_8php.html" target="_self">manage.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_50_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="match_8php.html" target="_self">match.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_51_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="mod_2menu_8php.html" target="_self">menu.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_52_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="mod_2message_8php.html" target="_self">message.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_53_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="mitem_8php.html" target="_self">mitem.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_54_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="mood_8php.html" target="_self">mood.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_55_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="msearch_8php.html" target="_self">msearch.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_56_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="mod_2network_8php.html" target="_self">network.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_57_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="new__channel_8php.html" target="_self">new_channel.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_58_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="notes_8php.html" target="_self">notes.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_59_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="notifications_8php.html" target="_self">notifications.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_60_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="mod_2notify_8php.html" target="_self">notify.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_61_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="mod_2oembed_8php.html" target="_self">oembed.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_62_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="oexchange_8php.html" target="_self">oexchange.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_63_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="opensearch_8php.html" target="_self">opensearch.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_64_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="page_8php.html" target="_self">page.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_65_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="parse__url_8php.html" target="_self">parse_url.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_66_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="photo_8php.html" target="_self">photo.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_67_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="mod_2photos_8php.html" target="_self">photos.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_68_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="php_8php.html" target="_self">php.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_69_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="ping_8php.html" target="_self">ping.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_70_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="poco_8php.html" target="_self">poco.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_71_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="poke_8php.html" target="_self">poke.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_72_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="post_8php.html" target="_self">post.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_73_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="pretheme_8php.html" target="_self">pretheme.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_74_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="probe_8php.html" target="_self">probe.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_75_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="profile_8php.html" target="_self">profile.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_76_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="profile__photo_8php.html" target="_self">profile_photo.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_77_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="profiles_8php.html" target="_self">profiles.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_78_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="profperm_8php.html" target="_self">profperm.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_79_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="pubsites_8php.html" target="_self">pubsites.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_80_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="randprof_8php.html" target="_self">randprof.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_81_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="register_8php.html" target="_self">register.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_82_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="regmod_8php.html" target="_self">regmod.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_83_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="removeme_8php.html" target="_self">removeme.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_84_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="rmagic_8php.html" target="_self">rmagic.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_85_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="rpost_8php.html" target="_self">rpost.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_86_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="rsd__xml_8php.html" target="_self">rsd_xml.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_87_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="search_8php.html" target="_self">search.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_88_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="search__ac_8php.html" target="_self">search_ac.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_89_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="settings_8php.html" target="_self">settings.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_90_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="setup_8php.html" target="_self">setup.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_91_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="share_8php.html" target="_self">share.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_92_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="siteinfo_8php.html" target="_self">siteinfo.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_93_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="sitelist_8php.html" target="_self">sitelist.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_94_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="smilies_8php.html" target="_self">smilies.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_95_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="sources_8php.html" target="_self">sources.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_96_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="sslify_8php.html" target="_self">sslify.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_97_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="starred_8php.html" target="_self">starred.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_98_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="subthread_8php.html" target="_self">subthread.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_99_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="suggest_8php.html" target="_self">suggest.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_100_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="tagger_8php.html" target="_self">tagger.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_101_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="tagrm_8php.html" target="_self">tagrm.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_102_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="thing_8php.html" target="_self">thing.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_103_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="toggle__mobile_8php.html" target="_self">toggle_mobile.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_104_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="toggle__safesearch_8php.html" target="_self">toggle_safesearch.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_105_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="uexport_8php.html" target="_self">uexport.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_106_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="update__channel_8php.html" target="_self">update_channel.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_107_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="update__community_8php.html" target="_self">update_community.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_108_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="update__display_8php.html" target="_self">update_display.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_109_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="update__network_8php.html" target="_self">update_network.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_110_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="update__search_8php.html" target="_self">update_search.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_111_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="view_8php.html" target="_self">view.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_112_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="viewconnections_8php.html" target="_self">viewconnections.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_113_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="viewsrc_8php.html" target="_self">viewsrc.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_114_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="vote_8php.html" target="_self">vote.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_115_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="wall__attach_8php.html" target="_self">wall_attach.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_116_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="wall__upload_8php.html" target="_self">wall_upload.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_117_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="webfinger_8php.html" target="_self">webfinger.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_118_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="webpages_8php.html" target="_self">webpages.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_119_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="wfinger_8php.html" target="_self">wfinger.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_120_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="xchan_8php.html" target="_self">xchan.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_121_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="xrd_8php.html" target="_self">xrd.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_122_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="xref_8php.html" target="_self">xref.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_123_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="zfinger_8php.html" target="_self">zfinger.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_124_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="zotfeed_8php.html" target="_self">zotfeed.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_125_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="zping_8php.html" target="_self">zping.php</a></td><td class="desc"></td></tr>
+<tr id="row_2_" class="even"><td class="entry"><img id="arr_2_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('2_')"/><img id="img_2_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('2_')"/><a class="el" href="dir_23ec12649285f9fabf3a6b7380226c28.html" target="_self">util</a></td><td class="desc"></td></tr>
+<tr id="row_2_0_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_2_0_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('2_0_')"/><img id="img_2_0_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('2_0_')"/><a class="el" href="dir_0eaa4a0adae8ba4811e133c6e594aeee.html" target="_self">fpostit</a></td><td class="desc"></td></tr>
+<tr id="row_2_0_0_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="fpostit_8php.html" target="_self">fpostit.php</a></td><td class="desc"></td></tr>
+<tr id="row_2_1_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_2_1_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('2_1_')"/><img id="img_2_1_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('2_1_')"/><a class="el" href="dir_720432dea4a717197ae070dbc42b8f20.html" target="_self">wp</a></td><td class="desc"></td></tr>
+<tr id="row_2_1_0_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_2_1_0_" src="ftv2plastnode.png" alt="\" width="16" height="22" onclick="toggleFolder('2_1_0_')"/><img id="img_2_1_0_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('2_1_0_')"/><a class="el" href="dir_25f74a9991dbbca1b52a94e358ca73c1.html" target="_self">post_to_red</a></td><td class="desc"></td></tr>
+<tr id="row_2_1_0_0_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="post__to__red_8php.html" target="_self">post_to_red.php</a></td><td class="desc"></td></tr>
+<tr id="row_2_2_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="db__update_8php.html" target="_self">db_update.php</a></td><td class="desc"></td></tr>
+<tr id="row_2_3_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="docblox__errorchecker_8php.html" target="_self">docblox_errorchecker.php</a></td><td class="desc"></td></tr>
+<tr id="row_2_4_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="extract_8php.html" target="_self">extract.php</a></td><td class="desc"></td></tr>
+<tr id="row_2_5_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="friendica-to-smarty-tpl_8py.html" target="_self">friendica-to-smarty-tpl.py</a></td><td class="desc"></td></tr>
+<tr id="row_2_6_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="php2po_8php.html" target="_self">php2po.php</a></td><td class="desc"></td></tr>
+<tr id="row_2_7_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="po2php_8php.html" target="_self">po2php.php</a></td><td class="desc"></td></tr>
+<tr id="row_2_8_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="tpldebug_8php.html" target="_self">tpldebug.php</a></td><td class="desc"></td></tr>
+<tr id="row_2_9_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="typo_8php.html" target="_self">typo.php</a></td><td class="desc"></td></tr>
+<tr id="row_2_10_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="typohelper_8php.html" target="_self">typohelper.php</a></td><td class="desc"></td></tr>
+<tr id="row_2_11_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="updatetpl_8py.html" target="_self">updatetpl.py</a></td><td class="desc"></td></tr>
+<tr id="row_3_"><td class="entry"><img id="arr_3_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('3_')"/><img id="img_3_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('3_')"/><a class="el" href="dir_b2f003339c516cc00c8cadcafbe82f13.html" target="_self">view</a></td><td class="desc"></td></tr>
+<tr id="row_3_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_3_0_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('3_0_')"/><img id="img_3_0_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('3_0_')"/><a class="el" href="dir_817f6d302394b98e59575acdb59998bc.html" target="_self">php</a></td><td class="desc"></td></tr>
+<tr id="row_3_0_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="php_2default_8php.html" target="_self">default.php</a></td><td class="desc"></td></tr>
+<tr id="row_3_0_1_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="full_8php.html" target="_self">full.php</a></td><td class="desc"></td></tr>
+<tr id="row_3_0_2_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="minimal_8php.html" target="_self">minimal.php</a></td><td class="desc"></td></tr>
+<tr id="row_3_0_3_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="mod__import_8php.html" target="_self">mod_import.php</a></td><td class="desc"></td></tr>
+<tr id="row_3_0_4_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="none_8php.html" target="_self">none.php</a></td><td class="desc"></td></tr>
+<tr id="row_3_0_5_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="php_2theme__init_8php.html" target="_self">theme_init.php</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_3_1_" src="ftv2plastnode.png" alt="\" width="16" height="22" onclick="toggleFolder('3_1_')"/><img id="img_3_1_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('3_1_')"/><a class="el" href="dir_8543001e5d25368a6edede3e63efb554.html" target="_self">theme</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img id="arr_3_1_0_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('3_1_0_')"/><img id="img_3_1_0_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('3_1_0_')"/><a class="el" href="dir_d520c5cf583201d9437764f209363c22.html" target="_self">apw</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_0_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_3_1_0_0_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('3_1_0_0_')"/><img id="img_3_1_0_0_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('3_1_0_0_')"/><a class="el" href="dir_cb8a8f75dcdd0b3fbfcc82e9eda410c5.html" target="_self">php</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_0_0_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="view_2theme_2apw_2php_2config_8php.html" target="_self">config.php</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_0_0_1_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="apw_2php_2style_8php.html" target="_self">style.php</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_0_0_2_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="apw_2php_2theme_8php.html" target="_self">theme.php</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_0_1_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_3_1_0_1_" src="ftv2plastnode.png" alt="\" width="16" height="22" onclick="toggleFolder('3_1_0_1_')"/><img id="img_3_1_0_1_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('3_1_0_1_')"/><a class="el" href="dir_05f4fba29266e8fd7869afcd6cefb5cb.html" target="_self">schema</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_0_1_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="darkness_8php.html" target="_self">darkness.php</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_0_1_1_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="darknessleftaside_8php.html" target="_self">darknessleftaside.php</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_0_1_2_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="darknessrightaside_8php.html" target="_self">darknessrightaside.php</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_0_1_3_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="greenthumbnails_8php.html" target="_self">greenthumbnails.php</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_0_1_4_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="minimalisticdarkness_8php.html" target="_self">minimalisticdarkness.php</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_0_1_5_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="olddefault_8php.html" target="_self">olddefault.php</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_0_1_6_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="passion_8php.html" target="_self">passion.php</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_0_1_7_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="passionwide_8php.html" target="_self">passionwide.php</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_0_1_8_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="pine_8php.html" target="_self">pine.php</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_0_1_9_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="redbasic_8php.html" target="_self">redbasic.php</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_0_1_10_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="widedarkness_8php.html" target="_self">widedarkness.php</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_1_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img id="arr_3_1_1_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('3_1_1_')"/><img id="img_3_1_1_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('3_1_1_')"/><a class="el" href="dir_922c77e958c99a98db92d38a3a349bf2.html" target="_self">blogga</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_1_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_3_1_1_0_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('3_1_1_0_')"/><img id="img_3_1_1_0_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('3_1_1_0_')"/><a class="el" href="dir_c02447ad39a5307c81c64e880ec9e8d3.html" target="_self">php</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_1_0_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="view_2theme_2blogga_2php_2config_8php.html" target="_self">config.php</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_1_0_1_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="theme_2blogga_2php_2default_8php.html" target="_self">default.php</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_1_0_2_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="blogga_2php_2theme_8php.html" target="_self">theme.php</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_1_0_3_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="theme_2blogga_2php_2theme__init_8php.html" target="_self">theme_init.php</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_1_1_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_3_1_1_1_" src="ftv2plastnode.png" alt="\" width="16" height="22" onclick="toggleFolder('3_1_1_1_')"/><img id="img_3_1_1_1_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('3_1_1_1_')"/><a class="el" href="dir_92d6b429199666aa3765c8a934db5e14.html" target="_self">view</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_1_1_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img id="arr_3_1_1_1_0_" src="ftv2plastnode.png" alt="\" width="16" height="22" onclick="toggleFolder('3_1_1_1_0_')"/><img id="img_3_1_1_1_0_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('3_1_1_1_0_')"/><a class="el" href="dir_6cee3bb9ace89cc4e2f065aa2ca7bc5b.html" target="_self">theme</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_1_1_0_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img id="arr_3_1_1_1_0_0_" src="ftv2plastnode.png" alt="\" width="16" height="22" onclick="toggleFolder('3_1_1_1_0_0_')"/><img id="img_3_1_1_1_0_0_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('3_1_1_1_0_0_')"/><a class="el" href="dir_a8a0005c2b8590c535262d232c22afab.html" target="_self">blog</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_1_1_0_0_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="view_2theme_2blogga_2view_2theme_2blog_2config_8php.html" target="_self">config.php</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_1_1_0_0_1_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="theme_2blogga_2view_2theme_2blog_2default_8php.html" target="_self">default.php</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_1_1_0_0_2_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="blogga_2view_2theme_2blog_2theme_8php.html" target="_self">theme.php</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_2_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img id="arr_3_1_2_" src="ftv2plastnode.png" alt="\" width="16" height="22" onclick="toggleFolder('3_1_2_')"/><img id="img_3_1_2_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('3_1_2_')"/><a class="el" href="dir_55dbaf9b7b53c4fc605c9011743a7353.html" target="_self">redbasic</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_2_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img id="arr_3_1_2_0_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('3_1_2_0_')"/><img id="img_3_1_2_0_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('3_1_2_0_')"/><a class="el" href="dir_032dd9e2cfe278a2cfa5eb9547448eb9.html" target="_self">php</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_2_0_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="view_2theme_2redbasic_2php_2config_8php.html" target="_self">config.php</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_2_0_1_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="redbasic_2php_2style_8php.html" target="_self">style.php</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_2_0_2_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="redbasic_2php_2theme_8php.html" target="_self">theme.php</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_2_0_3_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="theme_2redbasic_2php_2theme__init_8php.html" target="_self">theme_init.php</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_2_1_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img id="arr_3_1_2_1_" src="ftv2plastnode.png" alt="\" width="16" height="22" onclick="toggleFolder('3_1_2_1_')"/><img id="img_3_1_2_1_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('3_1_2_1_')"/><a class="el" href="dir_3d9c9d0c5e9556dd3eba1e072fa6eaeb.html" target="_self">schema</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_2_1_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="dark_8php.html" target="_self">dark.php</a></td><td class="desc"></td></tr>
+<tr id="row_4_" class="even"><td class="entry"><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="boot_8php.html" target="_self">boot.php</a></td><td class="desc"></td></tr>
+</table>
+</div><!-- directory -->
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/files.js b/doc/html/files.js
new file mode 100644
index 000000000..705395136
--- /dev/null
+++ b/doc/html/files.js
@@ -0,0 +1,8 @@
+var files =
+[
+ [ "include", "dir_d44c64559bbebec7f509842c48db8b23.html", "dir_d44c64559bbebec7f509842c48db8b23" ],
+ [ "mod", "dir_d41ce877eb409a4791b288730010abe2.html", "dir_d41ce877eb409a4791b288730010abe2" ],
+ [ "util", "dir_23ec12649285f9fabf3a6b7380226c28.html", "dir_23ec12649285f9fabf3a6b7380226c28" ],
+ [ "view", "dir_b2f003339c516cc00c8cadcafbe82f13.html", "dir_b2f003339c516cc00c8cadcafbe82f13" ],
+ [ "boot.php", "boot_8php.html", "boot_8php" ]
+]; \ No newline at end of file
diff --git a/doc/html/filestorage_8php.html b/doc/html/filestorage_8php.html
new file mode 100644
index 000000000..91508e06f
--- /dev/null
+++ b/doc/html/filestorage_8php.html
@@ -0,0 +1,155 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/filestorage.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('filestorage_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">filestorage.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ad3b64e3ece9831f9d3a9f00c0ae983cd"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="filestorage_8php.html#ad3b64e3ece9831f9d3a9f00c0ae983cd">filestorage_post</a> (&amp;$a)</td></tr>
+<tr class="separator:ad3b64e3ece9831f9d3a9f00c0ae983cd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a61bb1be78472555df4ce619f51014040"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="filestorage_8php.html#a61bb1be78472555df4ce619f51014040">filestorage_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a61bb1be78472555df4ce619f51014040"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a61bb1be78472555df4ce619f51014040"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">filestorage_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ad3b64e3ece9831f9d3a9f00c0ae983cd"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">filestorage_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/filestorage_8php.js b/doc/html/filestorage_8php.js
new file mode 100644
index 000000000..86f35b70c
--- /dev/null
+++ b/doc/html/filestorage_8php.js
@@ -0,0 +1,5 @@
+var filestorage_8php =
+[
+ [ "filestorage_content", "filestorage_8php.html#a61bb1be78472555df4ce619f51014040", null ],
+ [ "filestorage_post", "filestorage_8php.html#ad3b64e3ece9831f9d3a9f00c0ae983cd", null ]
+]; \ No newline at end of file
diff --git a/doc/html/fpostit_8php.html b/doc/html/fpostit_8php.html
new file mode 100644
index 000000000..c0007a22e
--- /dev/null
+++ b/doc/html/fpostit_8php.html
@@ -0,0 +1,172 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: util/fpostit/fpostit.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('fpostit_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> &#124;
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle">
+<div class="title">fpostit.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a3f3ae3ae61578b5671673914fd894443"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fpostit_8php.html#a3f3ae3ae61578b5671673914fd894443">showForm</a> ($error, $content)</td></tr>
+<tr class="separator:a3f3ae3ae61578b5671673914fd894443"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:a501b5ca82f287509fc691c88524064c1"><td class="memItemLeft" align="right" valign="top"><a class="el" href="redbasic_2php_2style_8php.html#a883f9f14e205f7aa7de02c14df67b40a">if</a>(($_POST[&quot;friendika_acct_name&quot;]!= <br class="typebreak"/>
+'')&amp;&amp;($_POST[&quot;friendika_password&quot;]!= <br class="typebreak"/>
+'')) if(isset($_GET['title'])) <br class="typebreak"/>
+<a class="el" href="redbasic_2php_2style_8php.html#a883f9f14e205f7aa7de02c14df67b40a">if</a>(isset($_GET['text'])) <a class="el" href="redbasic_2php_2style_8php.html#a883f9f14e205f7aa7de02c14df67b40a">if</a>(isset($_GET['url'])) <br class="typebreak"/>
+<a class="el" href="redbasic_2php_2style_8php.html#a883f9f14e205f7aa7de02c14df67b40a">if</a>((isset($title))&amp;&amp;(isset($text))&amp;&amp;(isset($url)))&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fpostit_8php.html#a501b5ca82f287509fc691c88524064c1">else</a></td></tr>
+<tr class="separator:a501b5ca82f287509fc691c88524064c1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a3f3ae3ae61578b5671673914fd894443"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">showForm </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$error</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$content</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Variable Documentation</h2>
+<a class="anchor" id="a501b5ca82f287509fc691c88524064c1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="redbasic_2php_2style_8php.html#a883f9f14e205f7aa7de02c14df67b40a">if</a> (isset($_POST['submit'])) else</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<b>Initial value:</b><div class="fragment"><div class="line">{</div>
+<div class="line"> $content = $_POST[<span class="stringliteral">&#39;content&#39;</span>]</div>
+</div><!-- fragment -->
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/fpostit_8php.js b/doc/html/fpostit_8php.js
new file mode 100644
index 000000000..f1da198d9
--- /dev/null
+++ b/doc/html/fpostit_8php.js
@@ -0,0 +1,5 @@
+var fpostit_8php =
+[
+ [ "showForm", "fpostit_8php.html#a3f3ae3ae61578b5671673914fd894443", null ],
+ [ "else", "fpostit_8php.html#a501b5ca82f287509fc691c88524064c1", null ]
+]; \ No newline at end of file
diff --git a/doc/html/fred-48.png b/doc/html/fred-48.png
new file mode 100644
index 000000000..7cee38ef6
--- /dev/null
+++ b/doc/html/fred-48.png
Binary files differ
diff --git a/doc/html/fresh_8md.html b/doc/html/fresh_8md.html
new file mode 100644
index 000000000..91f73cfed
--- /dev/null
+++ b/doc/html/fresh_8md.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: util/fresh.md File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('fresh_8md.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">util/fresh.md File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/friendica-to-smarty-tpl_8py.html b/doc/html/friendica-to-smarty-tpl_8py.html
new file mode 100644
index 000000000..dc7ba225d
--- /dev/null
+++ b/doc/html/friendica-to-smarty-tpl_8py.html
@@ -0,0 +1,158 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: util/friendica-to-smarty-tpl.py File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('friendica-to-smarty-tpl_8py.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#namespaces">Namespaces</a> &#124;
+<a href="#func-members">Functions</a> &#124;
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle">
+<div class="title">friendica-to-smarty-tpl.py File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="namespaces"></a>
+Namespaces</h2></td></tr>
+<tr class="memitem:namespacefriendica-to-smarty-tpl"><td class="memItemLeft" align="right" valign="top">namespace &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacefriendica-to-smarty-tpl.html">friendica-to-smarty-tpl</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a89388ea9b2826e8218ed480e917d8105"><td class="memItemLeft" align="right" valign="top">def&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacefriendica-to-smarty-tpl.html#a89388ea9b2826e8218ed480e917d8105">friendica-to-smarty-tpl.fToSmarty</a></td></tr>
+<tr class="separator:a89388ea9b2826e8218ed480e917d8105"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3719dd46e286a57d315e6adae1845854"><td class="memItemLeft" align="right" valign="top">def&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacefriendica-to-smarty-tpl.html#a3719dd46e286a57d315e6adae1845854">friendica-to-smarty-tpl.fix_element</a></td></tr>
+<tr class="separator:a3719dd46e286a57d315e6adae1845854"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a38503e37fe68ac27c88cce91a9ac9efa"><td class="memItemLeft" align="right" valign="top">def&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacefriendica-to-smarty-tpl.html#a38503e37fe68ac27c88cce91a9ac9efa">friendica-to-smarty-tpl.convert</a></td></tr>
+<tr class="separator:a38503e37fe68ac27c88cce91a9ac9efa"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af6b2c793958aae2aadc294577431f749"><td class="memItemLeft" align="right" valign="top">def&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacefriendica-to-smarty-tpl.html#af6b2c793958aae2aadc294577431f749">friendica-to-smarty-tpl.help</a></td></tr>
+<tr class="separator:af6b2c793958aae2aadc294577431f749"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:a0b4cf73d1a8d201a28d269eeb62a5d5c"><td class="memItemLeft" align="right" valign="top">string&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacefriendica-to-smarty-tpl.html#a0b4cf73d1a8d201a28d269eeb62a5d5c">friendica-to-smarty-tpl.ldelim</a> = '{{'</td></tr>
+<tr class="separator:a0b4cf73d1a8d201a28d269eeb62a5d5c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8540514fb7c4aa18ad2dffa2a975036b"><td class="memItemLeft" align="right" valign="top">string&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacefriendica-to-smarty-tpl.html#a8540514fb7c4aa18ad2dffa2a975036b">friendica-to-smarty-tpl.rdelim</a> = '}}'</td></tr>
+<tr class="separator:a8540514fb7c4aa18ad2dffa2a975036b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a68d15934660cd1f4301ce251b1646f09"><td class="memItemLeft" align="right" valign="top">string&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacefriendica-to-smarty-tpl.html#a68d15934660cd1f4301ce251b1646f09">friendica-to-smarty-tpl.path</a> = ''</td></tr>
+<tr class="separator:a68d15934660cd1f4301ce251b1646f09"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a005c1b7a69cac31fad72a941974ba7bb"><td class="memItemLeft" align="right" valign="top">string&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacefriendica-to-smarty-tpl.html#a005c1b7a69cac31fad72a941974ba7bb">friendica-to-smarty-tpl.outpath</a> = path+'smarty3/'</td></tr>
+<tr class="separator:a005c1b7a69cac31fad72a941974ba7bb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae74419b16516956c66f7db714a93a6ac"><td class="memItemLeft" align="right" valign="top">tuple&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacefriendica-to-smarty-tpl.html#ae74419b16516956c66f7db714a93a6ac">friendica-to-smarty-tpl.files</a> = os.listdir(path)</td></tr>
+<tr class="separator:ae74419b16516956c66f7db714a93a6ac"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5dfc21ab8282dda8e3a7dff43cd0e283"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacefriendica-to-smarty-tpl.html#a5dfc21ab8282dda8e3a7dff43cd0e283">friendica-to-smarty-tpl.php_tpl</a> = True</td></tr>
+<tr class="separator:a5dfc21ab8282dda8e3a7dff43cd0e283"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5f9bf7a67d955c0d6be70a82097611c5"><td class="memItemLeft" align="right" valign="top">tuple&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacefriendica-to-smarty-tpl.html#a5f9bf7a67d955c0d6be70a82097611c5">friendica-to-smarty-tpl.filename</a> = os.path.join(path,a_file)</td></tr>
+<tr class="separator:a5f9bf7a67d955c0d6be70a82097611c5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aecf730e0884bb4ddc6c0deb1ef85f8eb"><td class="memItemLeft" align="right" valign="top">tuple&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacefriendica-to-smarty-tpl.html#aecf730e0884bb4ddc6c0deb1ef85f8eb">friendica-to-smarty-tpl.ext</a> = a_file.split('.')</td></tr>
+<tr class="separator:aecf730e0884bb4ddc6c0deb1ef85f8eb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a965e1d6d6293654a56e029a7e454dec7"><td class="memItemLeft" align="right" valign="top">tuple&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacefriendica-to-smarty-tpl.html#a965e1d6d6293654a56e029a7e454dec7">friendica-to-smarty-tpl.f</a> = open(filename, 'r')</td></tr>
+<tr class="separator:a965e1d6d6293654a56e029a7e454dec7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad9ef87ccb2c9960501f5e02424a22d80"><td class="memItemLeft" align="right" valign="top">tuple&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacefriendica-to-smarty-tpl.html#ad9ef87ccb2c9960501f5e02424a22d80">friendica-to-smarty-tpl.newfilename</a> = os.path.join(outpath,a_file)</td></tr>
+<tr class="separator:ad9ef87ccb2c9960501f5e02424a22d80"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a87182a9bab47640428bd0b2b9946bef9"><td class="memItemLeft" align="right" valign="top">tuple&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacefriendica-to-smarty-tpl.html#a87182a9bab47640428bd0b2b9946bef9">friendica-to-smarty-tpl.outf</a> = open(newfilename, 'w')</td></tr>
+<tr class="separator:a87182a9bab47640428bd0b2b9946bef9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/friendica-to-smarty-tpl_8py.js b/doc/html/friendica-to-smarty-tpl_8py.js
new file mode 100644
index 000000000..41fc17aef
--- /dev/null
+++ b/doc/html/friendica-to-smarty-tpl_8py.js
@@ -0,0 +1,18 @@
+var friendica_to_smarty_tpl_8py =
+[
+ [ "convert", "friendica-to-smarty-tpl_8py.html#a38503e37fe68ac27c88cce91a9ac9efa", null ],
+ [ "fix_element", "friendica-to-smarty-tpl_8py.html#a3719dd46e286a57d315e6adae1845854", null ],
+ [ "fToSmarty", "friendica-to-smarty-tpl_8py.html#a89388ea9b2826e8218ed480e917d8105", null ],
+ [ "help", "friendica-to-smarty-tpl_8py.html#af6b2c793958aae2aadc294577431f749", null ],
+ [ "ext", "friendica-to-smarty-tpl_8py.html#aecf730e0884bb4ddc6c0deb1ef85f8eb", null ],
+ [ "f", "friendica-to-smarty-tpl_8py.html#a965e1d6d6293654a56e029a7e454dec7", null ],
+ [ "filename", "friendica-to-smarty-tpl_8py.html#a5f9bf7a67d955c0d6be70a82097611c5", null ],
+ [ "files", "friendica-to-smarty-tpl_8py.html#ae74419b16516956c66f7db714a93a6ac", null ],
+ [ "ldelim", "friendica-to-smarty-tpl_8py.html#a0b4cf73d1a8d201a28d269eeb62a5d5c", null ],
+ [ "newfilename", "friendica-to-smarty-tpl_8py.html#ad9ef87ccb2c9960501f5e02424a22d80", null ],
+ [ "outf", "friendica-to-smarty-tpl_8py.html#a87182a9bab47640428bd0b2b9946bef9", null ],
+ [ "outpath", "friendica-to-smarty-tpl_8py.html#a005c1b7a69cac31fad72a941974ba7bb", null ],
+ [ "path", "friendica-to-smarty-tpl_8py.html#a68d15934660cd1f4301ce251b1646f09", null ],
+ [ "php_tpl", "friendica-to-smarty-tpl_8py.html#a5dfc21ab8282dda8e3a7dff43cd0e283", null ],
+ [ "rdelim", "friendica-to-smarty-tpl_8py.html#a8540514fb7c4aa18ad2dffa2a975036b", null ]
+]; \ No newline at end of file
diff --git a/doc/html/friendica__smarty_8php.html b/doc/html/friendica__smarty_8php.html
new file mode 100644
index 000000000..eef7ff752
--- /dev/null
+++ b/doc/html/friendica__smarty_8php.html
@@ -0,0 +1,122 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/friendica_smarty.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('friendica__smarty_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Classes</a> </div>
+ <div class="headertitle">
+<div class="title">friendica_smarty.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classFriendicaSmarty.html">FriendicaSmarty</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classFriendicaSmartyEngine.html">FriendicaSmartyEngine</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/fsuggest_8php.html b/doc/html/fsuggest_8php.html
new file mode 100644
index 000000000..07d2127ab
--- /dev/null
+++ b/doc/html/fsuggest_8php.html
@@ -0,0 +1,155 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/fsuggest.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('fsuggest_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">fsuggest.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a61ecfe10ce937ed526614f8fd3de3c7d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fsuggest_8php.html#a61ecfe10ce937ed526614f8fd3de3c7d">fsuggest_post</a> (&amp;$a)</td></tr>
+<tr class="separator:a61ecfe10ce937ed526614f8fd3de3c7d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa6c49ed4b50a387f1845f36844dd7998"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fsuggest_8php.html#aa6c49ed4b50a387f1845f36844dd7998">fsuggest_content</a> (&amp;$a)</td></tr>
+<tr class="separator:aa6c49ed4b50a387f1845f36844dd7998"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="aa6c49ed4b50a387f1845f36844dd7998"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">fsuggest_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a61ecfe10ce937ed526614f8fd3de3c7d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">fsuggest_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/fsuggest_8php.js b/doc/html/fsuggest_8php.js
new file mode 100644
index 000000000..e2c0f9a50
--- /dev/null
+++ b/doc/html/fsuggest_8php.js
@@ -0,0 +1,5 @@
+var fsuggest_8php =
+[
+ [ "fsuggest_content", "fsuggest_8php.html#aa6c49ed4b50a387f1845f36844dd7998", null ],
+ [ "fsuggest_post", "fsuggest_8php.html#a61ecfe10ce937ed526614f8fd3de3c7d", null ]
+]; \ No newline at end of file
diff --git a/doc/html/ftv2blank.png b/doc/html/ftv2blank.png
new file mode 100644
index 000000000..63c605bb4
--- /dev/null
+++ b/doc/html/ftv2blank.png
Binary files differ
diff --git a/doc/html/ftv2cl.png b/doc/html/ftv2cl.png
new file mode 100644
index 000000000..132f6577b
--- /dev/null
+++ b/doc/html/ftv2cl.png
Binary files differ
diff --git a/doc/html/ftv2doc.png b/doc/html/ftv2doc.png
new file mode 100644
index 000000000..17edabff9
--- /dev/null
+++ b/doc/html/ftv2doc.png
Binary files differ
diff --git a/doc/html/ftv2folderclosed.png b/doc/html/ftv2folderclosed.png
new file mode 100644
index 000000000..bb8ab35ed
--- /dev/null
+++ b/doc/html/ftv2folderclosed.png
Binary files differ
diff --git a/doc/html/ftv2folderopen.png b/doc/html/ftv2folderopen.png
new file mode 100644
index 000000000..d6c7f676a
--- /dev/null
+++ b/doc/html/ftv2folderopen.png
Binary files differ
diff --git a/doc/html/ftv2lastnode.png b/doc/html/ftv2lastnode.png
new file mode 100644
index 000000000..63c605bb4
--- /dev/null
+++ b/doc/html/ftv2lastnode.png
Binary files differ
diff --git a/doc/html/ftv2link.png b/doc/html/ftv2link.png
new file mode 100644
index 000000000..17edabff9
--- /dev/null
+++ b/doc/html/ftv2link.png
Binary files differ
diff --git a/doc/html/ftv2mlastnode.png b/doc/html/ftv2mlastnode.png
new file mode 100644
index 000000000..0b63f6d38
--- /dev/null
+++ b/doc/html/ftv2mlastnode.png
Binary files differ
diff --git a/doc/html/ftv2mnode.png b/doc/html/ftv2mnode.png
new file mode 100644
index 000000000..0b63f6d38
--- /dev/null
+++ b/doc/html/ftv2mnode.png
Binary files differ
diff --git a/doc/html/ftv2mo.png b/doc/html/ftv2mo.png
new file mode 100644
index 000000000..4bfb80f76
--- /dev/null
+++ b/doc/html/ftv2mo.png
Binary files differ
diff --git a/doc/html/ftv2node.png b/doc/html/ftv2node.png
new file mode 100644
index 000000000..63c605bb4
--- /dev/null
+++ b/doc/html/ftv2node.png
Binary files differ
diff --git a/doc/html/ftv2ns.png b/doc/html/ftv2ns.png
new file mode 100644
index 000000000..72e3d71c2
--- /dev/null
+++ b/doc/html/ftv2ns.png
Binary files differ
diff --git a/doc/html/ftv2plastnode.png b/doc/html/ftv2plastnode.png
new file mode 100644
index 000000000..c6ee22f93
--- /dev/null
+++ b/doc/html/ftv2plastnode.png
Binary files differ
diff --git a/doc/html/ftv2pnode.png b/doc/html/ftv2pnode.png
new file mode 100644
index 000000000..c6ee22f93
--- /dev/null
+++ b/doc/html/ftv2pnode.png
Binary files differ
diff --git a/doc/html/ftv2splitbar.png b/doc/html/ftv2splitbar.png
new file mode 100644
index 000000000..fe895f2c5
--- /dev/null
+++ b/doc/html/ftv2splitbar.png
Binary files differ
diff --git a/doc/html/ftv2vertline.png b/doc/html/ftv2vertline.png
new file mode 100644
index 000000000..63c605bb4
--- /dev/null
+++ b/doc/html/ftv2vertline.png
Binary files differ
diff --git a/doc/html/full_8php.html b/doc/html/full_8php.html
new file mode 100644
index 000000000..acfbf2149
--- /dev/null
+++ b/doc/html/full_8php.html
@@ -0,0 +1,133 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/php/full.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('full_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle">
+<div class="title">full.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:a6fac1b4b8cdfde06ea1b7713479e92db"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="full_8php.html#a6fac1b4b8cdfde06ea1b7713479e92db">if</a> (<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>($<a class="el" href="mod__import_8php.html#a8db1899eeeb44dabd0904065b63627bb">page</a>,'htmlhead')) echo $<a class="el" href="mod__import_8php.html#a8db1899eeeb44dabd0904065b63627bb">page</a>['htmlhead']?&gt;&lt;/head &gt;&lt; body &gt;&lt; <a class="el" href="nav_8php.html#a43be0df73b90647ea70947ce004e231e">nav</a> &gt;&lt;?php if(<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>($<a class="el" href="mod__import_8php.html#a8db1899eeeb44dabd0904065b63627bb">page</a></td></tr>
+<tr class="separator:a6fac1b4b8cdfde06ea1b7713479e92db"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Variable Documentation</h2>
+<a class="anchor" id="a6fac1b4b8cdfde06ea1b7713479e92db"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">if(<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>($<a class="el" href="mod__import_8php.html#a8db1899eeeb44dabd0904065b63627bb">page</a>,'htmlhead')) echo $<a class="el" href="mod__import_8php.html#a8db1899eeeb44dabd0904065b63627bb">page</a>['htmlhead']?&gt;&lt;/head &gt;&lt; body &gt;&lt; <a class="el" href="nav_8php.html#a43be0df73b90647ea70947ce004e231e">nav</a> &gt;&lt;?php if(<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>($<a class="el" href="mod__import_8php.html#a8db1899eeeb44dabd0904065b63627bb">page</a></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/full_8php.js b/doc/html/full_8php.js
new file mode 100644
index 000000000..c63a31b79
--- /dev/null
+++ b/doc/html/full_8php.js
@@ -0,0 +1,4 @@
+var full_8php =
+[
+ [ "if", "full_8php.html#a6fac1b4b8cdfde06ea1b7713479e92db", null ]
+]; \ No newline at end of file
diff --git a/doc/html/functions.html b/doc/html/functions.html
new file mode 100644
index 000000000..3ffcd98ad
--- /dev/null
+++ b/doc/html/functions.html
@@ -0,0 +1,491 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="functions.html"><span>All</span></a></li>
+ <li><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li class="current"><a href="functions.html#index_0x24"><span>$</span></a></li>
+ <li><a href="functions_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="functions_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="functions_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="functions_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="functions_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="functions_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="functions_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="functions_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="functions_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="functions_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="functions_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="functions_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="functions_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="functions_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="functions_0x76.html#index_v"><span>v</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('functions.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all class members with links to the classes they belong to:</div>
+
+<h3><a class="anchor" id="index_0x24"></a>- $ -</h3><ul>
+<li>$account
+: <a class="el" href="classApp.html#a14bd4b1c29f3aff371fe5d4cb11aeea3">App</a>
+</li>
+<li>$app
+: <a class="el" href="classBaseObject.html#a02cc4cd8fa26b6fc76d92fde54b4e4b1">BaseObject</a>
+</li>
+<li>$apps
+: <a class="el" href="classApp.html#a230e975296cf164da2fee35ef720964f">App</a>
+</li>
+<li>$argc
+: <a class="el" href="classApp.html#af58db526040829b1c8bd95561b329262">App</a>
+</li>
+<li>$argv
+: <a class="el" href="classApp.html#ab3da757abe5cb45bf88f07cc51a73b58">App</a>
+</li>
+<li>$auth
+: <a class="el" href="classRedBrowser.html#ab6d6d1e2a67e06b344a4cede1bd00b35">RedBrowser</a>
+, <a class="el" href="classRedDirectory.html#a9616af16cd19a18a6afebebcc2881c44">RedDirectory</a>
+, <a class="el" href="classRedFile.html#a4b5d0e33f919c6c175b30a55de6263f2">RedFile</a>
+</li>
+<li>$baseurl
+: <a class="el" href="classApp.html#ad5175536561021548ae8188e24c7b80c">App</a>
+</li>
+<li>$browser
+: <a class="el" href="classRedBasicAuth.html#af14337f1baad407f8a85d48205c0f30e">RedBasicAuth</a>
+</li>
+<li>$cached_profile_image
+: <a class="el" href="classApp.html#abe0e4fa91097f7a6588e1213a834121c">App</a>
+</li>
+<li>$cached_profile_picdate
+: <a class="el" href="classApp.html#aab4a685d15a363bb1d7edbbc20bfb94e">App</a>
+</li>
+<li>$category
+: <a class="el" href="classApp.html#a5cfc098c061b7d765add58fd2ca97445">App</a>
+</li>
+<li>$channel
+: <a class="el" href="classApp.html#a050b0696118da47e8b30859ad1a2c149">App</a>
+, <a class="el" href="classItem.html#acc32426c0f465391be8a99ad810c7b8e">Item</a>
+</li>
+<li>$channel_hash
+: <a class="el" href="classRedBasicAuth.html#ad5a3ea4dc4783b242d9dc6e76478b6ef">RedBasicAuth</a>
+</li>
+<li>$channel_id
+: <a class="el" href="classRedBasicAuth.html#a2dab393650d1573e3515969a153e8354">RedBasicAuth</a>
+</li>
+<li>$channel_name
+: <a class="el" href="classRedBasicAuth.html#a438ab125b6ef46581947e35d49cdebac">RedBasicAuth</a>
+</li>
+<li>$children
+: <a class="el" href="classItem.html#a80dcd0fb7673776c0967839d429c2a0f">Item</a>
+</li>
+<li>$cid
+: <a class="el" href="classApp.html#ad1c8eb91a6fd470b94f34b7fdad3a2d0">App</a>
+</li>
+<li>$cipher
+: <a class="el" href="classConversation.html#aa95c1a62af38bdfba7add9549bec083b">Conversation</a>
+</li>
+<li>$cmd
+: <a class="el" href="classApp.html#a495ec082c2719314e536070ca1ce073d">App</a>
+</li>
+<li>$comment_box_template
+: <a class="el" href="classItem.html#a90743c8348b13213275c223bb9333aa0">Item</a>
+</li>
+<li>$commentable
+: <a class="el" href="classConversation.html#afd4965d22a6e4bfea2f35e931b3273c6">Conversation</a>
+, <a class="el" href="classItem.html#aa2c221231ad0fc3720ccc1f00f0c6304">Item</a>
+</li>
+<li>$config
+: <a class="el" href="classApp.html#ac73dc90e4764497e2f1b7e6612c8fb88">App</a>
+</li>
+<li>$connected
+: <a class="el" href="classdba__driver.html#a205f6535e399700b6fca2492f96f2229">dba_driver</a>
+</li>
+<li>$contact
+: <a class="el" href="classApp.html#a98ef4cfd36693a3457c879b76bc6d694">App</a>
+</li>
+<li>$contacts
+: <a class="el" href="classApp.html#a61ca6e3af82071ea25ff2fd5dbcddae2">App</a>
+</li>
+<li>$content
+: <a class="el" href="classApp.html#ac1d80a14492acc932715d54567d8a589">App</a>
+</li>
+<li>$conversation
+: <a class="el" href="classItem.html#a007424e3e3171dcfb4312a02161da6cd">Item</a>
+</li>
+<li>$css_sources
+: <a class="el" href="classApp.html#a6f55d087e1ff4710132c1b0863faa2ee">App</a>
+</li>
+<li>$curl_code
+: <a class="el" href="classApp.html#a256360c9184fed6d7556e0bc0a835d7f">App</a>
+</li>
+<li>$curl_headers
+: <a class="el" href="classApp.html#af5007c42a693afd9c4899c243b2e1363">App</a>
+</li>
+<li>$d
+: <a class="el" href="classTemplate.html#a8469ab2988b6be2681516dc4b4e07d38">Template</a>
+</li>
+<li>$data
+: <a class="el" href="classApp.html#a0ce85be198e46570366cb3344f3c55b8">App</a>
+, <a class="el" href="classItem.html#aec24e233f9098f902b1e57e60dcb2019">Item</a>
+, <a class="el" href="classRedFile.html#a2ff12032b45538353eded9809d3b7550">RedFile</a>
+</li>
+<li>$db
+: <a class="el" href="classApp.html#a330410a288f3393d53772f5e98f857ea">App</a>
+, <a class="el" href="classdba__driver.html#a3033b5f1c2716b52202faeaae2592fe6">dba_driver</a>
+</li>
+<li>$debug
+: <a class="el" href="classdba__driver.html#af48e2afeded5285766bf92e22123ed03">dba_driver</a>
+, <a class="el" href="classTemplate.html#afc4afb6f89bebcd5480022312a56cb4a">Template</a>
+</li>
+<li>$done
+: <a class="el" href="classTemplate.html#abda4c8d049f70553338eae7c905e9d5c">Template</a>
+</li>
+<li>$error
+: <a class="el" href="classApp.html#ac1a8b2cd40609b231a560201a08852ba">App</a>
+, <a class="el" href="classdba__driver.html#a84675d28c7bd9b7290dd37e66dbd216c">dba_driver</a>
+</li>
+<li>$ext_path
+: <a class="el" href="classRedDirectory.html#a0f113244cd85c17848df991001d024f4">RedDirectory</a>
+</li>
+<li>$filename
+: <a class="el" href="classFriendicaSmarty.html#a33fabbd4d6eef869df496adf357ae690">FriendicaSmarty</a>
+</li>
+<li>$folder_hash
+: <a class="el" href="classRedDirectory.html#aa10254abf177bb2a0e4a88495725e09b">RedDirectory</a>
+</li>
+<li>$force_max_items
+: <a class="el" href="classApp.html#ae3f47830543d0d902f66913def8db66b">App</a>
+</li>
+<li>$groups
+: <a class="el" href="classApp.html#ac6e6b1c7d6df408580ff79977fcfa656">App</a>
+</li>
+<li>$height
+: <a class="el" href="classphoto__driver.html#aea560be5dfba09117d36c12bacbf3b80">photo_driver</a>
+</li>
+<li>$hooks
+: <a class="el" href="classApp.html#a3694aa1907aa103a2adbc71f926f0fa0">App</a>
+</li>
+<li>$hostname
+: <a class="el" href="classApp.html#a037049cba88dfc6ff94f4b5b779e3fd3">App</a>
+</li>
+<li>$identities
+: <a class="el" href="classApp.html#a7954862f44f606b0ff83d4c74d15e792">App</a>
+</li>
+<li>$image
+: <a class="el" href="classphoto__driver.html#a7c78b5a01afe61ba3895ac07f4869b55">photo_driver</a>
+</li>
+<li>$interactive
+: <a class="el" href="classApp.html#a4c7cfc62d39508086cf300dc2e39c4df">App</a>
+</li>
+<li>$js_sources
+: <a class="el" href="classApp.html#a11e24b3ed9b33ffee7dd41d110b4366d">App</a>
+</li>
+<li>$lang
+: <a class="el" href="classTemplate.html#ace26b8a4252fbc1c385d2b5e1e93e5c8">Template</a>
+</li>
+<li>$language
+: <a class="el" href="classApp.html#a1a297e70b3667b83f4460aa7ed9f5d6f">App</a>
+</li>
+<li>$layout
+: <a class="el" href="classApp.html#a58ac598544892ff7c32890291b72635e">App</a>
+</li>
+<li>$ldelim
+: <a class="el" href="classApp.html#a59dd4b665c70e7dbd80682c014ff7145">App</a>
+</li>
+<li>$mode
+: <a class="el" href="classConversation.html#afb03d1648dbfafe62caa1e30f32f2b1a">Conversation</a>
+</li>
+<li>$module
+: <a class="el" href="classApp.html#a9bf62f8e39585c0aa48fcffc3bf3484d">App</a>
+</li>
+<li>$module_loaded
+: <a class="el" href="classApp.html#a6e4f0fbfa3cf6c11baebe22a03db6165">App</a>
+</li>
+<li>$name
+: <a class="el" href="classFriendicaSmartyEngine.html#aaba6a42101bc9ae32e36b7fa2e243f02">FriendicaSmartyEngine</a>
+, <a class="el" href="classRedFile.html#acc48c05cd5a70951cb3c615ad84f03ba">RedFile</a>
+, <a class="el" href="classTemplate.html#a6eb301a51cc94d8b94f4548fbad85eae">Template</a>
+</li>
+<li>$nav_sel
+: <a class="el" href="classApp.html#a33a8e90b60ec4438f6fbf299d0f6839c">App</a>
+</li>
+<li>$nodes
+: <a class="el" href="classTemplate.html#a8f4d17e49f42b876a97364c13fb572d1">Template</a>
+</li>
+<li>$observer
+: <a class="el" href="classApp.html#a4ffe529fb14389f7fedf5fdc5f722e7f">App</a>
+, <a class="el" href="classRedBasicAuth.html#aa75dc43b59adc98e38a98517d3fd35d1">RedBasicAuth</a>
+, <a class="el" href="classConversation.html#a8748445aa26047ebed5141f3c3cbc244">Conversation</a>
+</li>
+<li>$os_path
+: <a class="el" href="classRedDirectory.html#a3c148c07ad909985125aa4926d8d0021">RedDirectory</a>
+</li>
+<li>$owner_id
+: <a class="el" href="classRedBasicAuth.html#a09c1488a0b290f5a54dc15180c5690d7">RedBasicAuth</a>
+</li>
+<li>$owner_name
+: <a class="el" href="classItem.html#a9594df6014b0b6f45364ea7a34510130">Item</a>
+</li>
+<li>$owner_nick
+: <a class="el" href="classRedBasicAuth.html#a8d09b8d784cc810a0b3be580d05106a7">RedBasicAuth</a>
+</li>
+<li>$owner_photo
+: <a class="el" href="classItem.html#a078f95b4134ce3a1df344cf8d386f986">Item</a>
+</li>
+<li>$owner_url
+: <a class="el" href="classItem.html#afa54851df82962c7c42dea3cc9f5c92c">Item</a>
+</li>
+<li>$page
+: <a class="el" href="classApp.html#a4b67935096f66d1f14b657399a8461ac">App</a>
+</li>
+<li>$pager
+: <a class="el" href="classApp.html#a6bcb19cdc4907077da72864686d5a780">App</a>
+</li>
+<li>$parent
+: <a class="el" href="classItem.html#a1a1e42877e6ac7af50286142ceb483d2">Item</a>
+</li>
+<li>$path
+: <a class="el" href="classApp.html#acad5896b7a79ae31433ad8f89606c728">App</a>
+</li>
+<li>$perms
+: <a class="el" href="classApp.html#ab47de68fa39806d1fb0976407e188b77">App</a>
+</li>
+<li>$plugins
+: <a class="el" href="classApp.html#ae9f96338f32187d308b67b980eea0008">App</a>
+</li>
+<li>$poi
+: <a class="el" href="classApp.html#a1936f2afce0dc0d1bbed15ae1f2ee81a">App</a>
+</li>
+<li>$prepared_item
+: <a class="el" href="classConversation.html#a5b6adbb2fe24f0f53d6c22660dff91b2">Conversation</a>
+</li>
+<li>$preview
+: <a class="el" href="classConversation.html#ae9937f9e0f3d927acc2bed46cc72e9ae">Conversation</a>
+</li>
+<li>$profile
+: <a class="el" href="classApp.html#a57d041fcc003d08c127dfa99a02bc192">App</a>
+</li>
+<li>$profile_owner
+: <a class="el" href="classConversation.html#a2f12724ef0244e9049fe1bb9641b516d">Conversation</a>
+</li>
+<li>$profile_uid
+: <a class="el" href="classApp.html#a08c24d6a6fc52fcc784b0f765f13b820">App</a>
+</li>
+<li>$query_string
+: <a class="el" href="classApp.html#a2e82da4aecfc2017a8d1d332ca501f9f">App</a>
+</li>
+<li>$r
+: <a class="el" href="classTemplate.html#aac9a4638f11271e1b1dcc9f247242718">Template</a>
+</li>
+<li>$rdelim
+: <a class="el" href="classApp.html#a244b2d53b21be269aad2269d23192f95">App</a>
+</li>
+<li>$red_path
+: <a class="el" href="classRedDirectory.html#acb32b8df27538c57772824a745e751d7">RedDirectory</a>
+</li>
+<li>$redirect_url
+: <a class="el" href="classItem.html#a5b561415861f5b89b0733aacfe0428d1">Item</a>
+</li>
+<li>$replace
+: <a class="el" href="classTemplate.html#a4e86b566c3f728e95ce5db1b33665c10">Template</a>
+</li>
+<li>$root_dir
+: <a class="el" href="classRedDirectory.html#ad87c514a307ec97ba0f1372e9bcfa6a4">RedDirectory</a>
+</li>
+<li>$scheme
+: <a class="el" href="classApp.html#ad082d63acc078e5bf23825a03bdd6a76">App</a>
+</li>
+<li>$search
+: <a class="el" href="classTemplate.html#a317d535946dc065c35dd5cd38380e6c6">Template</a>
+</li>
+<li>$sourcename
+: <a class="el" href="classApp.html#a13710907ef62554a0b4dd8a5eaa2eb11">App</a>
+</li>
+<li>$stack
+: <a class="el" href="classTemplate.html#a6f0efc256688c36110180b501067ff11">Template</a>
+</li>
+<li>$strings
+: <a class="el" href="classApp.html#a5f64620473a9727a48ebe9cf6f335a98">App</a>
+</li>
+<li>$template
+: <a class="el" href="classItem.html#a7f7bc059de377319282cb4ef4a828480">Item</a>
+</li>
+<li>$template_engine_instance
+: <a class="el" href="classApp.html#a6844aedad10e201b8c3d80cfc9e876d3">App</a>
+</li>
+<li>$template_engines
+: <a class="el" href="classApp.html#a6859a4848a5c0049b4134cc4b34228b6">App</a>
+</li>
+<li>$theme
+: <a class="el" href="classApp.html#a764cc6cd7578132c21d2b4545de9301c">App</a>
+</li>
+<li>$theme_info
+: <a class="el" href="classApp.html#aeca29fd4f7192ca07369b3c598c36e67">App</a>
+</li>
+<li>$theme_thread_allow
+: <a class="el" href="classApp.html#a487332f8de40414ca1a54a4265570b70">App</a>
+</li>
+<li>$threaded
+: <a class="el" href="classItem.html#a1cb6aa8abdf7ea7daca647e40c8ea3a2">Item</a>
+</li>
+<li>$threads
+: <a class="el" href="classConversation.html#a41f4a549e6a99f98935c4742addd22c8">Conversation</a>
+</li>
+<li>$timezone
+: <a class="el" href="classApp.html#ab35b01a366a2ea95725e97af278f87ab">App</a>
+</li>
+<li>$toplevel
+: <a class="el" href="classItem.html#a5cfa6cf964f433a917a81cab079ff9d8">Item</a>
+</li>
+<li>$type
+: <a class="el" href="classphoto__driver.html#a4920ed7cbb1ac735ac84153067537f03">photo_driver</a>
+</li>
+<li>$types
+: <a class="el" href="classphoto__driver.html#a00cb166c00b7502dbc456c94330e5b03">photo_driver</a>
+</li>
+<li>$user
+: <a class="el" href="classApp.html#a91fd3c8b89016113b05f3be24805ccff">App</a>
+</li>
+<li>$valid
+: <a class="el" href="classphoto__driver.html#a01d28d43b404d6f6de219dc9c5069dc9">photo_driver</a>
+</li>
+<li>$videoheight
+: <a class="el" href="classApp.html#a56b1a432c96aef8b1971f779c9d93c8c">App</a>
+</li>
+<li>$videowidth
+: <a class="el" href="classApp.html#adf2aaf95b062736a6fd5fc70fadf80e8">App</a>
+</li>
+<li>$visiting
+: <a class="el" href="classItem.html#a4a123ae98987c1e30ecb15c4edf5a3b8">Item</a>
+</li>
+<li>$wall_to_wall
+: <a class="el" href="classItem.html#a5d29ddecc073151a65a8e2ea2f6e4189">Item</a>
+</li>
+<li>$widgetlist
+: <a class="el" href="classApp.html#a4833bee2eae4ad1691a04fa19e11a766">App</a>
+</li>
+<li>$widgets
+: <a class="el" href="classApp.html#aa5a87c46ab3fee21362c466bf78042ef">App</a>
+</li>
+<li>$width
+: <a class="el" href="classphoto__driver.html#a3e4215890f4a4894bf3799a7d2e0c0b1">photo_driver</a>
+</li>
+<li>$writable
+: <a class="el" href="classConversation.html#ae81221251307e315f566a11f921ce0a9">Conversation</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/functions_0x5f.html b/doc/html/functions_0x5f.html
new file mode 100644
index 000000000..7caef9ab3
--- /dev/null
+++ b/doc/html/functions_0x5f.html
@@ -0,0 +1,195 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="functions.html"><span>All</span></a></li>
+ <li><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="functions.html#index_0x24"><span>$</span></a></li>
+ <li class="current"><a href="functions_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="functions_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="functions_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="functions_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="functions_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="functions_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="functions_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="functions_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="functions_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="functions_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="functions_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="functions_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="functions_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="functions_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="functions_0x76.html#index_v"><span>v</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('functions_0x5f.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all class members with links to the classes they belong to:</div>
+
+<h3><a class="anchor" id="index__"></a>- _ -</h3><ul>
+<li>__construct()
+: <a class="el" href="classApp.html#af6d39f63fb7116bbeb04e51696f99474">App</a>
+, <a class="el" href="classConversation.html#af84ea6ccd72214c9bb4c504461cc8b09">Conversation</a>
+, <a class="el" href="classFriendicaSmarty.html#af12091b920b95eeef1218cbc48066ca6">FriendicaSmarty</a>
+, <a class="el" href="classphoto__driver.html#ac6e85f8e507cab4e755ed7acdec401ae">photo_driver</a>
+, <a class="el" href="classRedDirectory.html#a1e35e3cd31d2a15250655e4cafdea180">RedDirectory</a>
+, <a class="el" href="classFriendicaSmartyEngine.html#ab7c305bd8c386c2944e4dc9136cea5b6">FriendicaSmartyEngine</a>
+, <a class="el" href="classRedFile.html#a9a67bdb34c9db6ce144b3f371148b183">RedFile</a>
+, <a class="el" href="classRedBrowser.html#a4b76be9ccef0262cf78fffb4129eda93">RedBrowser</a>
+, <a class="el" href="classdba__driver.html#af3541d13ccb7a3eddfc03e253c746186">dba_driver</a>
+, <a class="el" href="classItem.html#a248f45871ecfe82a08d1d4c0769b2eb2">Item</a>
+, <a class="el" href="classFKOAuth1.html#a2f1276872329a6f0b704ccda1a4b9fa6">FKOAuth1</a>
+</li>
+<li>__destruct()
+: <a class="el" href="classdba__driver.html#a1a8bc9dc839a6320a0e07d8047a6b721">dba_driver</a>
+, <a class="el" href="classphoto__driver.html#ae4501abdc9651359f81d036b63625686">photo_driver</a>
+</li>
+<li>_build_nodes()
+: <a class="el" href="classTemplate.html#ac41c96e1f407b1a910029e5f4b7de8e4">Template</a>
+</li>
+<li>_get_var()
+: <a class="el" href="classTemplate.html#aae9c4d761ea1298e745e8052d7910194">Template</a>
+</li>
+<li>_pop_stack()
+: <a class="el" href="classTemplate.html#a35d599c9b53a02e2fe2232e5b7ed5da7">Template</a>
+</li>
+<li>_preg_error()
+: <a class="el" href="classTemplate.html#a37c15f6d1ade500943629f27a62808b7">Template</a>
+</li>
+<li>_push_stack()
+: <a class="el" href="classTemplate.html#aa6a087e0b7b887dd1c98c9e0ecbd3b29">Template</a>
+</li>
+<li>_replcb()
+: <a class="el" href="classTemplate.html#ae791766c3d055f7f1ba5a5e60d647934">Template</a>
+</li>
+<li>_replcb_debug()
+: <a class="el" href="classTemplate.html#a4b933954086d9e01a1804b0b1c6ee93e">Template</a>
+</li>
+<li>_replcb_for()
+: <a class="el" href="classTemplate.html#abf71098c80fd1f218a59452b3408309e">Template</a>
+</li>
+<li>_replcb_if()
+: <a class="el" href="classTemplate.html#ae0836e7d5bd5afceb04f50fd635f1228">Template</a>
+</li>
+<li>_replcb_inc()
+: <a class="el" href="classTemplate.html#a86e8fd27955ef10cadfd86f3fca70677">Template</a>
+</li>
+<li>_replcb_node()
+: <a class="el" href="classTemplate.html#aa6f9bd7a8f7512efcf90e8d376fe05ee">Template</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/functions_0x61.html b/doc/html/functions_0x61.html
new file mode 100644
index 000000000..d5a0d01c9
--- /dev/null
+++ b/doc/html/functions_0x61.html
@@ -0,0 +1,155 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="functions.html"><span>All</span></a></li>
+ <li><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="functions.html#index_0x24"><span>$</span></a></li>
+ <li><a href="functions_0x5f.html#index__"><span>_</span></a></li>
+ <li class="current"><a href="functions_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="functions_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="functions_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="functions_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="functions_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="functions_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="functions_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="functions_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="functions_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="functions_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="functions_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="functions_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="functions_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="functions_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="functions_0x76.html#index_v"><span>v</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('functions_0x61.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all class members with links to the classes they belong to:</div>
+
+<h3><a class="anchor" id="index_a"></a>- a -</h3><ul>
+<li>acknowledge_permissions()
+: <a class="el" href="classProtoDriver.html#a1593f3abae050edbd9304f4f8bc4894a">ProtoDriver</a>
+, <a class="el" href="classZotDriver.html#a3cfdf443da4e5326e205855d7c0054f2">ZotDriver</a>
+</li>
+<li>add_child()
+: <a class="el" href="classItem.html#a80dcd9d0f548c3ad550abe7e6981fb51">Item</a>
+</li>
+<li>add_thread()
+: <a class="el" href="classConversation.html#a8335cdd43f1836e3c255638e61a09e16">Conversation</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/functions_0x62.html b/doc/html/functions_0x62.html
new file mode 100644
index 000000000..a7a7a884c
--- /dev/null
+++ b/doc/html/functions_0x62.html
@@ -0,0 +1,148 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="functions.html"><span>All</span></a></li>
+ <li><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="functions.html#index_0x24"><span>$</span></a></li>
+ <li><a href="functions_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
+ <li class="current"><a href="functions_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="functions_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="functions_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="functions_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="functions_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="functions_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="functions_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="functions_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="functions_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="functions_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="functions_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="functions_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="functions_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="functions_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="functions_0x76.html#index_v"><span>v</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('functions_0x62.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all class members with links to the classes they belong to:</div>
+
+<h3><a class="anchor" id="index_b"></a>- b -</h3><ul>
+<li>build_pagehead()
+: <a class="el" href="classApp.html#a08f0537964d98958d218066364cff785">App</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/functions_0x63.html b/doc/html/functions_0x63.html
new file mode 100644
index 000000000..94f4ffba9
--- /dev/null
+++ b/doc/html/functions_0x63.html
@@ -0,0 +1,190 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="functions.html"><span>All</span></a></li>
+ <li><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="functions.html#index_0x24"><span>$</span></a></li>
+ <li><a href="functions_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
+ <li class="current"><a href="functions_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="functions_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="functions_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="functions_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="functions_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="functions_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="functions_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="functions_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="functions_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="functions_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="functions_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="functions_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="functions_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="functions_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="functions_0x76.html#index_v"><span>v</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('functions_0x63.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all class members with links to the classes they belong to:</div>
+
+<h3><a class="anchor" id="index_c"></a>- c -</h3><ul>
+<li>change_permissions()
+: <a class="el" href="classProtoDriver.html#a34b97ca5ef2165f2e16eb2fe59ff6c67">ProtoDriver</a>
+, <a class="el" href="classZotDriver.html#a6776935156accb0f170e2e24577133db">ZotDriver</a>
+</li>
+<li>check_wall_to_wall()
+: <a class="el" href="classItem.html#abcdb0ea9bcd1576bc99bba9b8f700bb8">Item</a>
+</li>
+<li>childExists()
+: <a class="el" href="classRedDirectory.html#a5e3fc08b2bf9f61cea4d2ccae0495bec">RedDirectory</a>
+</li>
+<li>clear()
+: <a class="el" href="classCache.html#ab14d0f4bdf7116a94d545c574b38f568">Cache</a>
+</li>
+<li>close()
+: <a class="el" href="classdba__mysqli.html#acb38f2c851187ad632ecfab30fdfab55">dba_mysqli</a>
+, <a class="el" href="classdba__driver.html#a5afa54172f3c837df61643f8f5b2c975">dba_driver</a>
+, <a class="el" href="classdba__mysql.html#a850586714ef897bd25f643c89b4ef76e">dba_mysql</a>
+</li>
+<li>collect()
+: <a class="el" href="classProtoDriver.html#a2ba1758f0f9e3564580b6ff85292804d">ProtoDriver</a>
+, <a class="el" href="classZotDriver.html#af65febb26031eb7f39871b9e2a539797">ZotDriver</a>
+</li>
+<li>collect_private()
+: <a class="el" href="classProtoDriver.html#af66171aa7dab9b62cee915cb4f1abe1b">ProtoDriver</a>
+, <a class="el" href="classZotDriver.html#a2e15ff09772f0608203dad1c98299394">ZotDriver</a>
+</li>
+<li>connect()
+: <a class="el" href="classdba__driver.html#ae533e62a240a793f17aef5ab4ef10edc">dba_driver</a>
+, <a class="el" href="classdba__mysqli.html#add062bd93961e5f0194d94820e9a51b1">dba_mysqli</a>
+, <a class="el" href="classdba__mysql.html#a1887338627ce0e28786839363014bd0b">dba_mysql</a>
+</li>
+<li>count_descendants()
+: <a class="el" href="classItem.html#aca1e66988ed00cd627b2a359b72cd0ae">Item</a>
+</li>
+<li>createDirectory()
+: <a class="el" href="classRedDirectory.html#a986936910f0216887a25e28916c166c7">RedDirectory</a>
+</li>
+<li>createFile()
+: <a class="el" href="classRedDirectory.html#a2d12d99d38a6a75fc9a830b2f7fc0bf0">RedDirectory</a>
+</li>
+<li>cropImage()
+: <a class="el" href="classphoto__driver.html#a2e6e61f1e356a90bc978f4404a77137e">photo_driver</a>
+, <a class="el" href="classphoto__gd.html#ab2232d775c8bacf66773a03308105f0c">photo_gd</a>
+, <a class="el" href="classphoto__imagick.html#a2f33a03a89497a2b2768e29736d4a8a4">photo_imagick</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/functions_0x64.html b/doc/html/functions_0x64.html
new file mode 100644
index 000000000..1fd41d048
--- /dev/null
+++ b/doc/html/functions_0x64.html
@@ -0,0 +1,173 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="functions.html"><span>All</span></a></li>
+ <li><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="functions.html#index_0x24"><span>$</span></a></li>
+ <li><a href="functions_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
+ <li class="current"><a href="functions_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="functions_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="functions_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="functions_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="functions_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="functions_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="functions_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="functions_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="functions_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="functions_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="functions_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="functions_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="functions_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="functions_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="functions_0x76.html#index_v"><span>v</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('functions_0x64.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all class members with links to the classes they belong to:</div>
+
+<h3><a class="anchor" id="index_d"></a>- d -</h3><ul>
+<li>dbg()
+: <a class="el" href="classdba__driver.html#adcc1f8955120fec0708bce39202d0422">dba_driver</a>
+</li>
+<li>delete()
+: <a class="el" href="classRedFile.html#aef71c9eaac7052be7dc8602eb12171e7">RedFile</a>
+</li>
+<li>deliver()
+: <a class="el" href="classZotDriver.html#a876e3e0e4cad83c0b58c8696b344be6f">ZotDriver</a>
+, <a class="el" href="classProtoDriver.html#a85e9063f6d0c304410cd246f7900ea1b">ProtoDriver</a>
+</li>
+<li>deliver_private()
+: <a class="el" href="classProtoDriver.html#ae5b44739f84c10d00a9b65adf3785181">ProtoDriver</a>
+, <a class="el" href="classZotDriver.html#afaaf9941169fc966e43e25b25e6daea6">ZotDriver</a>
+</li>
+<li>destroy()
+: <a class="el" href="classphoto__gd.html#a724703ecf71b1f1d04a80e86c76db6b1">photo_gd</a>
+, <a class="el" href="classphoto__imagick.html#afd49d64751ee3a298eac0c0ce0ba0207">photo_imagick</a>
+, <a class="el" href="classphoto__driver.html#ae1a9edaf846983780dc65ea77d99e813">photo_driver</a>
+</li>
+<li>discover()
+: <a class="el" href="classZotDriver.html#a40d328ff9f6b0a238afe286dddee1514">ZotDriver</a>
+, <a class="el" href="classProtoDriver.html#a64a3868cffe27d601d55f69a2ecc4337">ProtoDriver</a>
+</li>
+<li>doScaleImage()
+: <a class="el" href="classphoto__imagick.html#a3047c68bb4de7f66c2893fe451db2b66">photo_imagick</a>
+, <a class="el" href="classphoto__gd.html#a2f2e5900e6d8b1667892ac631b1d4754">photo_gd</a>
+, <a class="el" href="classphoto__driver.html#ae18716018afcf362c7c24586b53e9e2f">photo_driver</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/functions_0x65.html b/doc/html/functions_0x65.html
new file mode 100644
index 000000000..74e2892f6
--- /dev/null
+++ b/doc/html/functions_0x65.html
@@ -0,0 +1,150 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="functions.html"><span>All</span></a></li>
+ <li><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="functions.html#index_0x24"><span>$</span></a></li>
+ <li><a href="functions_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
+ <li class="current"><a href="functions_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="functions_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="functions_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="functions_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="functions_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="functions_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="functions_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="functions_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="functions_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="functions_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="functions_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="functions_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="functions_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="functions_0x76.html#index_v"><span>v</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('functions_0x65.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all class members with links to the classes they belong to:</div>
+
+<h3><a class="anchor" id="index_e"></a>- e -</h3><ul>
+<li>escape()
+: <a class="el" href="classdba__driver.html#afc95ffa103a3290581b537670cde5311">dba_driver</a>
+, <a class="el" href="classdba__mysqli.html#a27d6a748af7f80028801306e7ea33f64">dba_mysqli</a>
+, <a class="el" href="classdba__mysql.html#a99a7691ea6cb1300031fb6549379066e">dba_mysql</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/functions_0x66.html b/doc/html/functions_0x66.html
new file mode 100644
index 000000000..377f92696
--- /dev/null
+++ b/doc/html/functions_0x66.html
@@ -0,0 +1,150 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="functions.html"><span>All</span></a></li>
+ <li><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="functions.html#index_0x24"><span>$</span></a></li>
+ <li><a href="functions_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="functions_0x65.html#index_e"><span>e</span></a></li>
+ <li class="current"><a href="functions_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="functions_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="functions_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="functions_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="functions_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="functions_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="functions_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="functions_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="functions_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="functions_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="functions_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="functions_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="functions_0x76.html#index_v"><span>v</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('functions_0x66.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all class members with links to the classes they belong to:</div>
+
+<h3><a class="anchor" id="index_f"></a>- f -</h3><ul>
+<li>flip()
+: <a class="el" href="classphoto__driver.html#a2b2a99021fc63ed6465d703ddddcb832">photo_driver</a>
+, <a class="el" href="classphoto__imagick.html#aff6bcdbab18593a3fc5a480db8509393">photo_imagick</a>
+, <a class="el" href="classphoto__gd.html#a44cedef376044018702d9355ddc813ce">photo_gd</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/functions_0x67.html b/doc/html/functions_0x67.html
new file mode 100644
index 000000000..6bad44f01
--- /dev/null
+++ b/doc/html/functions_0x67.html
@@ -0,0 +1,309 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="functions.html"><span>All</span></a></li>
+ <li><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="functions.html#index_0x24"><span>$</span></a></li>
+ <li><a href="functions_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="functions_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="functions_0x66.html#index_f"><span>f</span></a></li>
+ <li class="current"><a href="functions_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="functions_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="functions_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="functions_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="functions_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="functions_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="functions_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="functions_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="functions_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="functions_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="functions_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="functions_0x76.html#index_v"><span>v</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('functions_0x67.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all class members with links to the classes they belong to:</div>
+
+<h3><a class="anchor" id="index_g"></a>- g -</h3><ul>
+<li>gen_token()
+: <a class="el" href="classFKOAuthDataStore.html#aa1a268be88ad3979bb4cc35bbb4dc819">FKOAuthDataStore</a>
+</li>
+<li>generateDirectoryIndex()
+: <a class="el" href="classRedBrowser.html#a1f7daf50bb9bfcde7345b3b1908dbd7e">RedBrowser</a>
+</li>
+<li>get()
+: <a class="el" href="classRedFile.html#a7c868dfcef6c70cd0e24cf3caa2c3535">RedFile</a>
+, <a class="el" href="classCache.html#a70392b109331897bf9fdd7f1960e21de">Cache</a>
+</li>
+<li>get_account()
+: <a class="el" href="classApp.html#a08bc87aff64f39fbc084e9d6545cee4d">App</a>
+</li>
+<li>get_app()
+: <a class="el" href="classBaseObject.html#ac43f10e69ce80c78e4870636250fc8a2">BaseObject</a>
+</li>
+<li>get_apps()
+: <a class="el" href="classApp.html#a5c63eabdc7fdd8b6e3348980ec16a3ad">App</a>
+</li>
+<li>get_baseurl()
+: <a class="el" href="classApp.html#a604d659d6977a99de42a160343e5289a">App</a>
+</li>
+<li>get_channel()
+: <a class="el" href="classApp.html#a084e03c77686d8c13390fef3f7428a2b">App</a>
+</li>
+<li>get_child()
+: <a class="el" href="classItem.html#a632185dd25c5caf277067c76230a4320">Item</a>
+</li>
+<li>get_children()
+: <a class="el" href="classItem.html#aa0ee775ec94abccec6c798428835d001">Item</a>
+</li>
+<li>get_cipher()
+: <a class="el" href="classConversation.html#a4aab60bb39fa6761b6cacdc8d9da2901">Conversation</a>
+</li>
+<li>get_comment_box()
+: <a class="el" href="classItem.html#a3ee7667c2ec6cd7657328e27848c0bdf">Item</a>
+</li>
+<li>get_comment_box_template()
+: <a class="el" href="classItem.html#a904421c7a427411bb2ab473bca872f63">Item</a>
+</li>
+<li>get_conversation()
+: <a class="el" href="classItem.html#a0c301aaed2b7d682728d18db3a22afa3">Item</a>
+</li>
+<li>get_data()
+: <a class="el" href="classItem.html#ad3638f93065693c1f69eb349feb1b7aa">Item</a>
+</li>
+<li>get_data_value()
+: <a class="el" href="classItem.html#ac6f1c96cc82a0dfb7e881fc70309ea3c">Item</a>
+</li>
+<li>get_FormatsMap()
+: <a class="el" href="classphoto__imagick.html#aef020d929f66f4370e33fc158c8eebd4">photo_imagick</a>
+</li>
+<li>get_groups()
+: <a class="el" href="classApp.html#a4659785d13e4bac0bed50dbb1b0d4299">App</a>
+</li>
+<li>get_hostname()
+: <a class="el" href="classApp.html#a622eace13f8fc9f4b5672a68e2bc4396">App</a>
+</li>
+<li>get_id()
+: <a class="el" href="classItem.html#ac0f27e58532612f6e7a54c8a621b9b92">Item</a>
+</li>
+<li>get_intltext_template()
+: <a class="el" href="classFriendicaSmartyEngine.html#a35ec0ee828c36640ea25296bcb84a118">FriendicaSmartyEngine</a>
+</li>
+<li>get_markup_template()
+: <a class="el" href="classFriendicaSmartyEngine.html#aab5994077fc3a64222e41b28e2bd8d88">FriendicaSmartyEngine</a>
+, <a class="el" href="interfaceITemplateEngine.html#aaf2698adbf46c073c24b162fe1b1c442">ITemplateEngine</a>
+, <a class="el" href="classTemplate.html#afd97b4b1e7754a550e67c0ea79159059">Template</a>
+</li>
+<li>get_mode()
+: <a class="el" href="classConversation.html#a87a0d704d5f2b1a008cc2e9ce06a1bcd">Conversation</a>
+</li>
+<li>get_observer()
+: <a class="el" href="classApp.html#a1ad3bb1b68439b3b7cbe630918e618d2">App</a>
+, <a class="el" href="classConversation.html#ae3d4190142e12b57051f11f2911f77a0">Conversation</a>
+</li>
+<li>get_owner_name()
+: <a class="el" href="classItem.html#a67892aa23d19f4431bb2e5f43c74000e">Item</a>
+</li>
+<li>get_owner_photo()
+: <a class="el" href="classItem.html#aa541bc4290e51bfd688d6921bebabc73">Item</a>
+</li>
+<li>get_owner_url()
+: <a class="el" href="classItem.html#a9f2d219da712390f59012fc32a342074">Item</a>
+</li>
+<li>get_parent()
+: <a class="el" href="classItem.html#a4b92e3a9d6212c553aa2661489bd95d8">Item</a>
+</li>
+<li>get_path()
+: <a class="el" href="classApp.html#a5293a8543ba338dcf38cd4ff3bc5d4be">App</a>
+</li>
+<li>get_perms()
+: <a class="el" href="classApp.html#adb5a4bb657881e553978ff390babd01f">App</a>
+</li>
+<li>get_profile_owner()
+: <a class="el" href="classConversation.html#a5effe8ad3007e01333df44b81432b813">Conversation</a>
+</li>
+<li>get_redirect_url()
+: <a class="el" href="classItem.html#a428f448f89a8629055ea3294eb942aea">Item</a>
+</li>
+<li>get_template()
+: <a class="el" href="classItem.html#aba23a0a9d89e316d2b343cc46d695d91">Item</a>
+</li>
+<li>get_template_data()
+: <a class="el" href="classConversation.html#a2a96b7a6573ae53db861624659e831cb">Conversation</a>
+, <a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">Item</a>
+</li>
+<li>get_template_engine()
+: <a class="el" href="classApp.html#acb27e607fe4c82603444676e25c36b70">App</a>
+</li>
+<li>get_template_ldelim()
+: <a class="el" href="classApp.html#a2eb832a8577dee7d40b93abdf6d1d35a">App</a>
+</li>
+<li>get_template_rdelim()
+: <a class="el" href="classApp.html#aab23c59172310fd30f2d60dc039d3eea">App</a>
+</li>
+<li>get_thread()
+: <a class="el" href="classConversation.html#a4cff75d8c46b517e7133e4d0da6fc1c8">Conversation</a>
+</li>
+<li>get_widgets()
+: <a class="el" href="classApp.html#a871898becd0697d778f36d9336253ae8">App</a>
+</li>
+<li>getChild()
+: <a class="el" href="classRedDirectory.html#aaa20f0f44da23781917af8170c0a2569">RedDirectory</a>
+</li>
+<li>getChildren()
+: <a class="el" href="classRedDirectory.html#aa42d3065f6f065b17db87146a7cb031a">RedDirectory</a>
+</li>
+<li>getContentType()
+: <a class="el" href="classRedFile.html#a26416827eb68554d033d1e2e5cc6dd3b">RedFile</a>
+</li>
+<li>getDir()
+: <a class="el" href="classRedDirectory.html#a70173d4458572d95e586b2037d2fd2f4">RedDirectory</a>
+</li>
+<li>getETag()
+: <a class="el" href="classRedFile.html#ae96d5caa2db7a461c57b24380fa87e28">RedFile</a>
+</li>
+<li>getExt()
+: <a class="el" href="classphoto__driver.html#aa2efb5b2a6af3fd67e3f1c2b9852a5ba">photo_driver</a>
+</li>
+<li>getHeight()
+: <a class="el" href="classphoto__driver.html#af769e9abb144e57002c59aa2aa8f3468">photo_driver</a>
+</li>
+<li>getImage()
+: <a class="el" href="classphoto__driver.html#ab98da263bd7341fc132c4fb6fc76e8d5">photo_driver</a>
+, <a class="el" href="classphoto__gd.html#a86757ba021fd80d1a5cf8c2f766a8484">photo_gd</a>
+, <a class="el" href="classphoto__imagick.html#ad07288e0eb3922cb08cc9d33a163decc">photo_imagick</a>
+</li>
+<li>getLastModified()
+: <a class="el" href="classRedFile.html#a41562a28007789bbe7fe06d6a20eef47">RedFile</a>
+</li>
+<li>getName()
+: <a class="el" href="classRedDirectory.html#af6e4475dbd5abcdede00d20b8d388583">RedDirectory</a>
+, <a class="el" href="classRedFile.html#a0c961c5f49544d2502420361fa526437">RedFile</a>
+</li>
+<li>getSize()
+: <a class="el" href="classRedFile.html#acb1edbe1848fab05347746fa1ea09d8f">RedFile</a>
+</li>
+<li>getType()
+: <a class="el" href="classphoto__driver.html#a6c6c16dbc4f517ce799f9143ed61f0e3">photo_driver</a>
+</li>
+<li>getWidth()
+: <a class="el" href="classphoto__driver.html#acc30486acee9e89e32701f44a1738117">photo_driver</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/functions_0x68.html b/doc/html/functions_0x68.html
new file mode 100644
index 000000000..016fe2e28
--- /dev/null
+++ b/doc/html/functions_0x68.html
@@ -0,0 +1,154 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="functions.html"><span>All</span></a></li>
+ <li><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="functions.html#index_0x24"><span>$</span></a></li>
+ <li><a href="functions_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="functions_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="functions_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="functions_0x67.html#index_g"><span>g</span></a></li>
+ <li class="current"><a href="functions_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="functions_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="functions_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="functions_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="functions_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="functions_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="functions_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="functions_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="functions_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="functions_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="functions_0x76.html#index_v"><span>v</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('functions_0x68.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all class members with links to the classes they belong to:</div>
+
+<h3><a class="anchor" id="index_h"></a>- h -</h3><ul>
+<li>head_get_icon()
+: <a class="el" href="classApp.html#af17df107f2216ddf5ad2a7e0f2ba2166">App</a>
+</li>
+<li>head_set_icon()
+: <a class="el" href="classApp.html#a8863703a0305eaa45eb970dbd2046291">App</a>
+</li>
+<li>htmlActionsPanel()
+: <a class="el" href="classRedBrowser.html#a7f6bf0bda07833f4c647557bd172e349">RedBrowser</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/functions_0x69.html b/doc/html/functions_0x69.html
new file mode 100644
index 000000000..d503230a3
--- /dev/null
+++ b/doc/html/functions_0x69.html
@@ -0,0 +1,178 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="functions.html"><span>All</span></a></li>
+ <li><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="functions.html#index_0x24"><span>$</span></a></li>
+ <li><a href="functions_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="functions_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="functions_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="functions_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="functions_0x68.html#index_h"><span>h</span></a></li>
+ <li class="current"><a href="functions_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="functions_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="functions_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="functions_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="functions_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="functions_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="functions_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="functions_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="functions_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="functions_0x76.html#index_v"><span>v</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('functions_0x69.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all class members with links to the classes they belong to:</div>
+
+<h3><a class="anchor" id="index_i"></a>- i -</h3><ul>
+<li>imageString()
+: <a class="el" href="classphoto__driver.html#abc9f73ad90923772d52b9fcc4eb117dd">photo_driver</a>
+, <a class="el" href="classphoto__gd.html#a0795fc029be382557ae3f6e285f40e00">photo_gd</a>
+, <a class="el" href="classphoto__imagick.html#a70adbef31128c0ac8cbc5dcf34cdb019">photo_imagick</a>
+</li>
+<li>install()
+: <a class="el" href="classdba__driver.html#a4ccb27243e62a8ca30dd8e1b8cc67746">dba_driver</a>
+</li>
+<li>is_commentable()
+: <a class="el" href="classConversation.html#a8b47c92b69459d461ea3cc9aae9597a3">Conversation</a>
+, <a class="el" href="classItem.html#ac04525a8be24c12b0a2ae4ca1ba4b967">Item</a>
+</li>
+<li>is_preview()
+: <a class="el" href="classConversation.html#adf25ce023b69a166c63c6e84e02c136a">Conversation</a>
+</li>
+<li>is_threaded()
+: <a class="el" href="classItem.html#a5b2fafdca55aefeaa08993a5a60529f0">Item</a>
+</li>
+<li>is_toplevel()
+: <a class="el" href="classItem.html#aa49e40f961dff66da32c5ae110e32993">Item</a>
+</li>
+<li>is_valid()
+: <a class="el" href="classphoto__driver.html#a97289aef3be43d9435ca3717ef10b8ab">photo_driver</a>
+</li>
+<li>is_visiting()
+: <a class="el" href="classItem.html#a97c7feeea7f26a73176cb19faa455e12">Item</a>
+</li>
+<li>is_wall_to_wall()
+: <a class="el" href="classItem.html#aabf87ded59c25b5fe2b2296678e70509">Item</a>
+</li>
+<li>is_writable()
+: <a class="el" href="classConversation.html#a5879199008b96bee7550b576d614e1c1">Conversation</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/functions_0x6c.html b/doc/html/functions_0x6c.html
new file mode 100644
index 000000000..4f3e0deb8
--- /dev/null
+++ b/doc/html/functions_0x6c.html
@@ -0,0 +1,162 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="functions.html"><span>All</span></a></li>
+ <li><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="functions.html#index_0x24"><span>$</span></a></li>
+ <li><a href="functions_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="functions_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="functions_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="functions_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="functions_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="functions_0x69.html#index_i"><span>i</span></a></li>
+ <li class="current"><a href="functions_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="functions_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="functions_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="functions_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="functions_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="functions_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="functions_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="functions_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="functions_0x76.html#index_v"><span>v</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('functions_0x6c.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all class members with links to the classes they belong to:</div>
+
+<h3><a class="anchor" id="index_l"></a>- l -</h3><ul>
+<li>load()
+: <a class="el" href="classphoto__driver.html#a19e1af2b6af4c63aa6230abe69f83712">photo_driver</a>
+, <a class="el" href="classphoto__gd.html#a33092b889875b68bfb1c97ff123012d9">photo_gd</a>
+, <a class="el" href="classphoto__imagick.html#a2c9168f110ccd6c264095d766615dfa8">photo_imagick</a>
+</li>
+<li>loginUser()
+: <a class="el" href="classFKOAuth1.html#a2b1dac2ed31fc6ef84668afdda8b263f">FKOAuth1</a>
+</li>
+<li>lookup_consumer()
+: <a class="el" href="classFKOAuthDataStore.html#a1148d47b546350bf440bdd92792c5df1">FKOAuthDataStore</a>
+</li>
+<li>lookup_nonce()
+: <a class="el" href="classFKOAuthDataStore.html#a4edfe2e77ecd2e16ff6b5eb516ed3599">FKOAuthDataStore</a>
+</li>
+<li>lookup_token()
+: <a class="el" href="classFKOAuthDataStore.html#a96f76387c3a93b0abe27a98013804bab">FKOAuthDataStore</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/functions_0x6e.html b/doc/html/functions_0x6e.html
new file mode 100644
index 000000000..06ee4dee8
--- /dev/null
+++ b/doc/html/functions_0x6e.html
@@ -0,0 +1,151 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="functions.html"><span>All</span></a></li>
+ <li><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="functions.html#index_0x24"><span>$</span></a></li>
+ <li><a href="functions_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="functions_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="functions_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="functions_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="functions_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="functions_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="functions_0x6c.html#index_l"><span>l</span></a></li>
+ <li class="current"><a href="functions_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="functions_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="functions_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="functions_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="functions_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="functions_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="functions_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="functions_0x76.html#index_v"><span>v</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('functions_0x6e.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all class members with links to the classes they belong to:</div>
+
+<h3><a class="anchor" id="index_n"></a>- n -</h3><ul>
+<li>new_access_token()
+: <a class="el" href="classFKOAuthDataStore.html#a434882f03e3cdb171ed89e09e337e934">FKOAuthDataStore</a>
+</li>
+<li>new_request_token()
+: <a class="el" href="classFKOAuthDataStore.html#a431b44d70e3da6a8256ab38f710e3050">FKOAuthDataStore</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/functions_0x6f.html b/doc/html/functions_0x6f.html
new file mode 100644
index 000000000..9d147d3cf
--- /dev/null
+++ b/doc/html/functions_0x6f.html
@@ -0,0 +1,148 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="functions.html"><span>All</span></a></li>
+ <li><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="functions.html#index_0x24"><span>$</span></a></li>
+ <li><a href="functions_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="functions_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="functions_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="functions_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="functions_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="functions_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="functions_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="functions_0x6e.html#index_n"><span>n</span></a></li>
+ <li class="current"><a href="functions_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="functions_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="functions_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="functions_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="functions_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="functions_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="functions_0x76.html#index_v"><span>v</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('functions_0x6f.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all class members with links to the classes they belong to:</div>
+
+<h3><a class="anchor" id="index_o"></a>- o -</h3><ul>
+<li>orient()
+: <a class="el" href="classphoto__driver.html#a4de5bac8daea8f291a33c80788019d0d">photo_driver</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/functions_0x70.html b/doc/html/functions_0x70.html
new file mode 100644
index 000000000..d9c25ebde
--- /dev/null
+++ b/doc/html/functions_0x70.html
@@ -0,0 +1,151 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="functions.html"><span>All</span></a></li>
+ <li><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="functions.html#index_0x24"><span>$</span></a></li>
+ <li><a href="functions_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="functions_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="functions_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="functions_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="functions_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="functions_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="functions_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="functions_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="functions_0x6f.html#index_o"><span>o</span></a></li>
+ <li class="current"><a href="functions_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="functions_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="functions_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="functions_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="functions_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="functions_0x76.html#index_v"><span>v</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('functions_0x70.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all class members with links to the classes they belong to:</div>
+
+<h3><a class="anchor" id="index_p"></a>- p -</h3><ul>
+<li>parsed()
+: <a class="el" href="classFriendicaSmarty.html#a6a4d4281d6fa9be1d37a97b188ffe8c9">FriendicaSmarty</a>
+</li>
+<li>put()
+: <a class="el" href="classRedFile.html#a41a49a583eb276b75626fcf97f4a699c">RedFile</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/functions_0x71.html b/doc/html/functions_0x71.html
new file mode 100644
index 000000000..50b8df7f7
--- /dev/null
+++ b/doc/html/functions_0x71.html
@@ -0,0 +1,150 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="functions.html"><span>All</span></a></li>
+ <li><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="functions.html#index_0x24"><span>$</span></a></li>
+ <li><a href="functions_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="functions_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="functions_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="functions_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="functions_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="functions_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="functions_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="functions_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="functions_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="functions_0x70.html#index_p"><span>p</span></a></li>
+ <li class="current"><a href="functions_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="functions_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="functions_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="functions_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="functions_0x76.html#index_v"><span>v</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('functions_0x71.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all class members with links to the classes they belong to:</div>
+
+<h3><a class="anchor" id="index_q"></a>- q -</h3><ul>
+<li>q()
+: <a class="el" href="classdba__driver.html#a558e738b88ae893cc5d79ffa3793d555">dba_driver</a>
+, <a class="el" href="classdba__mysqli.html#a611c4de8d6d7512dffb83a38bb6701ec">dba_mysqli</a>
+, <a class="el" href="classdba__mysql.html#ac3fd60c278f400907322dac578754a99">dba_mysql</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/functions_0x72.html b/doc/html/functions_0x72.html
new file mode 100644
index 000000000..1b6db3f69
--- /dev/null
+++ b/doc/html/functions_0x72.html
@@ -0,0 +1,167 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="functions.html"><span>All</span></a></li>
+ <li><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="functions.html#index_0x24"><span>$</span></a></li>
+ <li><a href="functions_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="functions_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="functions_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="functions_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="functions_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="functions_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="functions_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="functions_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="functions_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="functions_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="functions_0x71.html#index_q"><span>q</span></a></li>
+ <li class="current"><a href="functions_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="functions_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="functions_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="functions_0x76.html#index_v"><span>v</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('functions_0x72.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all class members with links to the classes they belong to:</div>
+
+<h3><a class="anchor" id="index_r"></a>- r -</h3><ul>
+<li>register_template_engine()
+: <a class="el" href="classApp.html#abf46a653d8499e7c253cc1be894a6d83">App</a>
+</li>
+<li>remove_child()
+: <a class="el" href="classItem.html#a2ce70ef63f9f4d86a09c351678806925">Item</a>
+</li>
+<li>remove_parent()
+: <a class="el" href="classItem.html#aa452b5bcd8dea12119b09212c615cb41">Item</a>
+</li>
+<li>replace()
+: <a class="el" href="classTemplate.html#a285b5b2007dbbf733476273df3fed4ef">Template</a>
+</li>
+<li>replace_macros()
+: <a class="el" href="classTemplate.html#a07737733f6949bdedea1e3d301b2ab7b">Template</a>
+, <a class="el" href="classFriendicaSmartyEngine.html#ad62f1181d2f02b54b46731ad2bd46db2">FriendicaSmartyEngine</a>
+, <a class="el" href="interfaceITemplateEngine.html#aaa7381c8becc3d1c1790b53988a0f243">ITemplateEngine</a>
+</li>
+<li>rotate()
+: <a class="el" href="classphoto__imagick.html#a9df5738a4a18e76dd304c440e96f045f">photo_imagick</a>
+, <a class="el" href="classphoto__driver.html#a2f2b6337cf9aa0688d10b422123f0eec">photo_driver</a>
+, <a class="el" href="classphoto__gd.html#a77f87730b11093b76980c541159df37d">photo_gd</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/functions_0x73.html b/doc/html/functions_0x73.html
new file mode 100644
index 000000000..b737a6e41
--- /dev/null
+++ b/doc/html/functions_0x73.html
@@ -0,0 +1,251 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="functions.html"><span>All</span></a></li>
+ <li><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="functions.html#index_0x24"><span>$</span></a></li>
+ <li><a href="functions_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="functions_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="functions_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="functions_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="functions_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="functions_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="functions_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="functions_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="functions_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="functions_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="functions_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="functions_0x72.html#index_r"><span>r</span></a></li>
+ <li class="current"><a href="functions_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="functions_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="functions_0x76.html#index_v"><span>v</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('functions_0x73.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all class members with links to the classes they belong to:</div>
+
+<h3><a class="anchor" id="index_s"></a>- s -</h3><ul>
+<li>save()
+: <a class="el" href="classphoto__driver.html#a5864fae7d8389372955a8e78cec527ac">photo_driver</a>
+</li>
+<li>saveImage()
+: <a class="el" href="classphoto__driver.html#a22ecb8c696de65a5a10bd185be9d90c3">photo_driver</a>
+</li>
+<li>scaleImage()
+: <a class="el" href="classphoto__driver.html#af0f7ec48a31ae9b557b6e3f8bd5b4af0">photo_driver</a>
+</li>
+<li>scaleImageSquare()
+: <a class="el" href="classphoto__driver.html#a56634842b071b96502716e9843ea5361">photo_driver</a>
+</li>
+<li>scaleImageUp()
+: <a class="el" href="classphoto__driver.html#a1a63c4ae17e892a115ab9cf6efb960ce">photo_driver</a>
+</li>
+<li>send()
+: <a class="el" href="classenotify.html#afbc088860f534c6c05788b48cfc262c6">enotify</a>
+</li>
+<li>set()
+: <a class="el" href="classCache.html#ae622b82adc1c2fb1f3e2cc4fd9688fce">Cache</a>
+</li>
+<li>set_account()
+: <a class="el" href="classApp.html#aeb1fe1c8ad9aa639909bd183ce578536">App</a>
+</li>
+<li>set_app()
+: <a class="el" href="classBaseObject.html#a0a9acda12d751692834cf6999f889223">BaseObject</a>
+</li>
+<li>set_apps()
+: <a class="el" href="classApp.html#abea5a4f77dcd53c928dc4eed86616637">App</a>
+</li>
+<li>set_baseurl()
+: <a class="el" href="classApp.html#a78788f6e9d8b713b138f81e457c5cd08">App</a>
+</li>
+<li>set_channel()
+: <a class="el" href="classApp.html#a89e9feb2bfb5253883a9720beaffe876">App</a>
+</li>
+<li>set_commentable()
+: <a class="el" href="classItem.html#aa1bd19fc8b5577078530265a7bf64123">Item</a>
+</li>
+<li>set_conversation()
+: <a class="el" href="classItem.html#aa8b1bbc4236890694635295e46d7fd72">Item</a>
+</li>
+<li>set_groups()
+: <a class="el" href="classApp.html#a3d84af5e42082098672531cd1a618853">App</a>
+</li>
+<li>set_hostname()
+: <a class="el" href="classApp.html#a344d2b7dc2f276648d521aee4da1731c">App</a>
+</li>
+<li>set_mode()
+: <a class="el" href="classConversation.html#a66f121ca4026246f86a732e5faa0682c">Conversation</a>
+</li>
+<li>set_observer()
+: <a class="el" href="classApp.html#a4776d9322edea17fae56afa5d01a323e">App</a>
+</li>
+<li>set_pager_itemspage()
+: <a class="el" href="classApp.html#a4bdd7bfed62f50515fce652127bf481b">App</a>
+</li>
+<li>set_pager_total()
+: <a class="el" href="classApp.html#a560189f048d3db2f526841963cc43e97">App</a>
+</li>
+<li>set_parent()
+: <a class="el" href="classItem.html#a9890ff72662d5bba301d1f2dd8aec9d7">Item</a>
+</li>
+<li>set_path()
+: <a class="el" href="classApp.html#adb060d5c7f35a521ec7ec0effbe08097">App</a>
+</li>
+<li>set_perms()
+: <a class="el" href="classApp.html#a557d7b779d8259027f4724ebf7b248dc">App</a>
+</li>
+<li>set_profile_owner()
+: <a class="el" href="classConversation.html#a8898bddc1e8990e81dab9a13a532cc93">Conversation</a>
+</li>
+<li>set_template()
+: <a class="el" href="classItem.html#af1b73df9b7c4b927e26b7e243b491f42">Item</a>
+</li>
+<li>set_template_engine()
+: <a class="el" href="classApp.html#a20d1890cc16b22ba79eeb0cbf2f719f7">App</a>
+</li>
+<li>set_widget()
+: <a class="el" href="classApp.html#a123b903dfe5d3488cc68db3471d36fd2">App</a>
+</li>
+<li>set_writeable()
+: <a class="el" href="classRedBrowser.html#a40fdbb9d9fe6c1243bbf135dd5b0a06f">RedBrowser</a>
+</li>
+<li>setBrowserPlugin()
+: <a class="el" href="classRedBasicAuth.html#a358ddad4abb5aa8c1382cf49a907adbc">RedBasicAuth</a>
+</li>
+<li>setCurrentUser()
+: <a class="el" href="classRedBasicAuth.html#a072e8244a9a7f191b32d3db5ac94f857">RedBasicAuth</a>
+</li>
+<li>setDimensions()
+: <a class="el" href="classphoto__gd.html#a1c75304bd15f3b9986f0b315fb59271e">photo_gd</a>
+, <a class="el" href="classphoto__driver.html#ae663867d2c4eaa2fae50d60670920143">photo_driver</a>
+, <a class="el" href="classphoto__imagick.html#af92901d252c1e6ab5b54eebedbed23bb">photo_imagick</a>
+</li>
+<li>setName()
+: <a class="el" href="classRedFile.html#a38a82bfc1b30028ea6ac75923e90fa25">RedFile</a>
+</li>
+<li>store()
+: <a class="el" href="classphoto__driver.html#a642a8d0c4ad5f887c99c6af77cee287b">photo_driver</a>
+</li>
+<li>supportedTypes()
+: <a class="el" href="classphoto__gd.html#a16f3dd7d3559f715aa2fe3f7880836dd">photo_gd</a>
+, <a class="el" href="classphoto__imagick.html#a27596faca6108d9d563674d1b654a0b7">photo_imagick</a>
+, <a class="el" href="classphoto__driver.html#a6eee8e36eaf9339f4faf80ddd43162da">photo_driver</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/functions_0x74.html b/doc/html/functions_0x74.html
new file mode 100644
index 000000000..a56945cc0
--- /dev/null
+++ b/doc/html/functions_0x74.html
@@ -0,0 +1,148 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="functions.html"><span>All</span></a></li>
+ <li><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="functions.html#index_0x24"><span>$</span></a></li>
+ <li><a href="functions_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="functions_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="functions_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="functions_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="functions_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="functions_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="functions_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="functions_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="functions_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="functions_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="functions_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="functions_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="functions_0x73.html#index_s"><span>s</span></a></li>
+ <li class="current"><a href="functions_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="functions_0x76.html#index_v"><span>v</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('functions_0x74.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all class members with links to the classes they belong to:</div>
+
+<h3><a class="anchor" id="index_t"></a>- t -</h3><ul>
+<li>template_engine()
+: <a class="el" href="classApp.html#a94a1ed2dc493c58612d17035b74ae736">App</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/functions_0x76.html b/doc/html/functions_0x76.html
new file mode 100644
index 000000000..35645c2c6
--- /dev/null
+++ b/doc/html/functions_0x76.html
@@ -0,0 +1,151 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="functions.html"><span>All</span></a></li>
+ <li><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="functions.html#index_0x24"><span>$</span></a></li>
+ <li><a href="functions_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="functions_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="functions_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="functions_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="functions_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="functions_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="functions_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="functions_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="functions_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="functions_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="functions_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="functions_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="functions_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="functions_0x74.html#index_t"><span>t</span></a></li>
+ <li class="current"><a href="functions_0x76.html#index_v"><span>v</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('functions_0x76.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all class members with links to the classes they belong to:</div>
+
+<h3><a class="anchor" id="index_v"></a>- v -</h3><ul>
+<li>validateUserPass()
+: <a class="el" href="classRedBasicAuth.html#a8dfd9a0953f8884723b421b7c1acf79b">RedBasicAuth</a>
+</li>
+<li>var_replace()
+: <a class="el" href="classTemplate.html#abbc484016ddf5d818f55b823cae6feb0">Template</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/functions_dup.js b/doc/html/functions_dup.js
new file mode 100644
index 000000000..97db7c0bf
--- /dev/null
+++ b/doc/html/functions_dup.js
@@ -0,0 +1,23 @@
+var functions_dup =
+[
+ [ "$", "functions.html", null ],
+ [ "_", "functions_0x5f.html", null ],
+ [ "a", "functions_0x61.html", null ],
+ [ "b", "functions_0x62.html", null ],
+ [ "c", "functions_0x63.html", null ],
+ [ "d", "functions_0x64.html", null ],
+ [ "e", "functions_0x65.html", null ],
+ [ "f", "functions_0x66.html", null ],
+ [ "g", "functions_0x67.html", null ],
+ [ "h", "functions_0x68.html", null ],
+ [ "i", "functions_0x69.html", null ],
+ [ "l", "functions_0x6c.html", null ],
+ [ "n", "functions_0x6e.html", null ],
+ [ "o", "functions_0x6f.html", null ],
+ [ "p", "functions_0x70.html", null ],
+ [ "q", "functions_0x71.html", null ],
+ [ "r", "functions_0x72.html", null ],
+ [ "s", "functions_0x73.html", null ],
+ [ "t", "functions_0x74.html", null ],
+ [ "v", "functions_0x76.html", null ]
+]; \ No newline at end of file
diff --git a/doc/html/functions_func.html b/doc/html/functions_func.html
new file mode 100644
index 000000000..701cc4693
--- /dev/null
+++ b/doc/html/functions_func.html
@@ -0,0 +1,194 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="functions.html"><span>All</span></a></li>
+ <li class="current"><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li class="current"><a href="functions_func.html#index__"><span>_</span></a></li>
+ <li><a href="functions_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="functions_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="functions_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="functions_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="functions_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="functions_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="functions_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="functions_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="functions_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="functions_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="functions_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="functions_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="functions_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="functions_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="functions_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="functions_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="functions_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="functions_func_0x76.html#index_v"><span>v</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('functions_func.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index__"></a>- _ -</h3><ul>
+<li>__construct()
+: <a class="el" href="classApp.html#af6d39f63fb7116bbeb04e51696f99474">App</a>
+, <a class="el" href="classConversation.html#af84ea6ccd72214c9bb4c504461cc8b09">Conversation</a>
+, <a class="el" href="classFriendicaSmarty.html#af12091b920b95eeef1218cbc48066ca6">FriendicaSmarty</a>
+, <a class="el" href="classphoto__driver.html#ac6e85f8e507cab4e755ed7acdec401ae">photo_driver</a>
+, <a class="el" href="classRedDirectory.html#a1e35e3cd31d2a15250655e4cafdea180">RedDirectory</a>
+, <a class="el" href="classFriendicaSmartyEngine.html#ab7c305bd8c386c2944e4dc9136cea5b6">FriendicaSmartyEngine</a>
+, <a class="el" href="classRedFile.html#a9a67bdb34c9db6ce144b3f371148b183">RedFile</a>
+, <a class="el" href="classRedBrowser.html#a4b76be9ccef0262cf78fffb4129eda93">RedBrowser</a>
+, <a class="el" href="classdba__driver.html#af3541d13ccb7a3eddfc03e253c746186">dba_driver</a>
+, <a class="el" href="classItem.html#a248f45871ecfe82a08d1d4c0769b2eb2">Item</a>
+, <a class="el" href="classFKOAuth1.html#a2f1276872329a6f0b704ccda1a4b9fa6">FKOAuth1</a>
+</li>
+<li>__destruct()
+: <a class="el" href="classdba__driver.html#a1a8bc9dc839a6320a0e07d8047a6b721">dba_driver</a>
+, <a class="el" href="classphoto__driver.html#ae4501abdc9651359f81d036b63625686">photo_driver</a>
+</li>
+<li>_build_nodes()
+: <a class="el" href="classTemplate.html#ac41c96e1f407b1a910029e5f4b7de8e4">Template</a>
+</li>
+<li>_get_var()
+: <a class="el" href="classTemplate.html#aae9c4d761ea1298e745e8052d7910194">Template</a>
+</li>
+<li>_pop_stack()
+: <a class="el" href="classTemplate.html#a35d599c9b53a02e2fe2232e5b7ed5da7">Template</a>
+</li>
+<li>_preg_error()
+: <a class="el" href="classTemplate.html#a37c15f6d1ade500943629f27a62808b7">Template</a>
+</li>
+<li>_push_stack()
+: <a class="el" href="classTemplate.html#aa6a087e0b7b887dd1c98c9e0ecbd3b29">Template</a>
+</li>
+<li>_replcb()
+: <a class="el" href="classTemplate.html#ae791766c3d055f7f1ba5a5e60d647934">Template</a>
+</li>
+<li>_replcb_debug()
+: <a class="el" href="classTemplate.html#a4b933954086d9e01a1804b0b1c6ee93e">Template</a>
+</li>
+<li>_replcb_for()
+: <a class="el" href="classTemplate.html#abf71098c80fd1f218a59452b3408309e">Template</a>
+</li>
+<li>_replcb_if()
+: <a class="el" href="classTemplate.html#ae0836e7d5bd5afceb04f50fd635f1228">Template</a>
+</li>
+<li>_replcb_inc()
+: <a class="el" href="classTemplate.html#a86e8fd27955ef10cadfd86f3fca70677">Template</a>
+</li>
+<li>_replcb_node()
+: <a class="el" href="classTemplate.html#aa6f9bd7a8f7512efcf90e8d376fe05ee">Template</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/functions_func.js b/doc/html/functions_func.js
new file mode 100644
index 000000000..0df3edefe
--- /dev/null
+++ b/doc/html/functions_func.js
@@ -0,0 +1,22 @@
+var functions_func =
+[
+ [ "_", "functions_func.html", null ],
+ [ "a", "functions_func_0x61.html", null ],
+ [ "b", "functions_func_0x62.html", null ],
+ [ "c", "functions_func_0x63.html", null ],
+ [ "d", "functions_func_0x64.html", null ],
+ [ "e", "functions_func_0x65.html", null ],
+ [ "f", "functions_func_0x66.html", null ],
+ [ "g", "functions_func_0x67.html", null ],
+ [ "h", "functions_func_0x68.html", null ],
+ [ "i", "functions_func_0x69.html", null ],
+ [ "l", "functions_func_0x6c.html", null ],
+ [ "n", "functions_func_0x6e.html", null ],
+ [ "o", "functions_func_0x6f.html", null ],
+ [ "p", "functions_func_0x70.html", null ],
+ [ "q", "functions_func_0x71.html", null ],
+ [ "r", "functions_func_0x72.html", null ],
+ [ "s", "functions_func_0x73.html", null ],
+ [ "t", "functions_func_0x74.html", null ],
+ [ "v", "functions_func_0x76.html", null ]
+]; \ No newline at end of file
diff --git a/doc/html/functions_func_0x61.html b/doc/html/functions_func_0x61.html
new file mode 100644
index 000000000..b0646c0f3
--- /dev/null
+++ b/doc/html/functions_func_0x61.html
@@ -0,0 +1,154 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="functions.html"><span>All</span></a></li>
+ <li class="current"><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="functions_func.html#index__"><span>_</span></a></li>
+ <li class="current"><a href="functions_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="functions_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="functions_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="functions_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="functions_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="functions_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="functions_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="functions_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="functions_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="functions_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="functions_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="functions_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="functions_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="functions_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="functions_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="functions_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="functions_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="functions_func_0x76.html#index_v"><span>v</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('functions_func_0x61.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_a"></a>- a -</h3><ul>
+<li>acknowledge_permissions()
+: <a class="el" href="classProtoDriver.html#a1593f3abae050edbd9304f4f8bc4894a">ProtoDriver</a>
+, <a class="el" href="classZotDriver.html#a3cfdf443da4e5326e205855d7c0054f2">ZotDriver</a>
+</li>
+<li>add_child()
+: <a class="el" href="classItem.html#a80dcd9d0f548c3ad550abe7e6981fb51">Item</a>
+</li>
+<li>add_thread()
+: <a class="el" href="classConversation.html#a8335cdd43f1836e3c255638e61a09e16">Conversation</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/functions_func_0x62.html b/doc/html/functions_func_0x62.html
new file mode 100644
index 000000000..27bd27bf9
--- /dev/null
+++ b/doc/html/functions_func_0x62.html
@@ -0,0 +1,147 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="functions.html"><span>All</span></a></li>
+ <li class="current"><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="functions_func.html#index__"><span>_</span></a></li>
+ <li><a href="functions_func_0x61.html#index_a"><span>a</span></a></li>
+ <li class="current"><a href="functions_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="functions_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="functions_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="functions_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="functions_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="functions_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="functions_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="functions_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="functions_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="functions_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="functions_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="functions_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="functions_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="functions_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="functions_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="functions_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="functions_func_0x76.html#index_v"><span>v</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('functions_func_0x62.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_b"></a>- b -</h3><ul>
+<li>build_pagehead()
+: <a class="el" href="classApp.html#a08f0537964d98958d218066364cff785">App</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/functions_func_0x63.html b/doc/html/functions_func_0x63.html
new file mode 100644
index 000000000..db2571d28
--- /dev/null
+++ b/doc/html/functions_func_0x63.html
@@ -0,0 +1,189 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="functions.html"><span>All</span></a></li>
+ <li class="current"><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="functions_func.html#index__"><span>_</span></a></li>
+ <li><a href="functions_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="functions_func_0x62.html#index_b"><span>b</span></a></li>
+ <li class="current"><a href="functions_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="functions_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="functions_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="functions_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="functions_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="functions_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="functions_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="functions_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="functions_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="functions_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="functions_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="functions_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="functions_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="functions_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="functions_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="functions_func_0x76.html#index_v"><span>v</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('functions_func_0x63.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_c"></a>- c -</h3><ul>
+<li>change_permissions()
+: <a class="el" href="classProtoDriver.html#a34b97ca5ef2165f2e16eb2fe59ff6c67">ProtoDriver</a>
+, <a class="el" href="classZotDriver.html#a6776935156accb0f170e2e24577133db">ZotDriver</a>
+</li>
+<li>check_wall_to_wall()
+: <a class="el" href="classItem.html#abcdb0ea9bcd1576bc99bba9b8f700bb8">Item</a>
+</li>
+<li>childExists()
+: <a class="el" href="classRedDirectory.html#a5e3fc08b2bf9f61cea4d2ccae0495bec">RedDirectory</a>
+</li>
+<li>clear()
+: <a class="el" href="classCache.html#ab14d0f4bdf7116a94d545c574b38f568">Cache</a>
+</li>
+<li>close()
+: <a class="el" href="classdba__mysqli.html#acb38f2c851187ad632ecfab30fdfab55">dba_mysqli</a>
+, <a class="el" href="classdba__driver.html#a5afa54172f3c837df61643f8f5b2c975">dba_driver</a>
+, <a class="el" href="classdba__mysql.html#a850586714ef897bd25f643c89b4ef76e">dba_mysql</a>
+</li>
+<li>collect()
+: <a class="el" href="classProtoDriver.html#a2ba1758f0f9e3564580b6ff85292804d">ProtoDriver</a>
+, <a class="el" href="classZotDriver.html#af65febb26031eb7f39871b9e2a539797">ZotDriver</a>
+</li>
+<li>collect_private()
+: <a class="el" href="classProtoDriver.html#af66171aa7dab9b62cee915cb4f1abe1b">ProtoDriver</a>
+, <a class="el" href="classZotDriver.html#a2e15ff09772f0608203dad1c98299394">ZotDriver</a>
+</li>
+<li>connect()
+: <a class="el" href="classdba__driver.html#ae533e62a240a793f17aef5ab4ef10edc">dba_driver</a>
+, <a class="el" href="classdba__mysqli.html#add062bd93961e5f0194d94820e9a51b1">dba_mysqli</a>
+, <a class="el" href="classdba__mysql.html#a1887338627ce0e28786839363014bd0b">dba_mysql</a>
+</li>
+<li>count_descendants()
+: <a class="el" href="classItem.html#aca1e66988ed00cd627b2a359b72cd0ae">Item</a>
+</li>
+<li>createDirectory()
+: <a class="el" href="classRedDirectory.html#a986936910f0216887a25e28916c166c7">RedDirectory</a>
+</li>
+<li>createFile()
+: <a class="el" href="classRedDirectory.html#a2d12d99d38a6a75fc9a830b2f7fc0bf0">RedDirectory</a>
+</li>
+<li>cropImage()
+: <a class="el" href="classphoto__driver.html#a2e6e61f1e356a90bc978f4404a77137e">photo_driver</a>
+, <a class="el" href="classphoto__gd.html#ab2232d775c8bacf66773a03308105f0c">photo_gd</a>
+, <a class="el" href="classphoto__imagick.html#a2f33a03a89497a2b2768e29736d4a8a4">photo_imagick</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/functions_func_0x64.html b/doc/html/functions_func_0x64.html
new file mode 100644
index 000000000..05999bb82
--- /dev/null
+++ b/doc/html/functions_func_0x64.html
@@ -0,0 +1,172 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="functions.html"><span>All</span></a></li>
+ <li class="current"><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="functions_func.html#index__"><span>_</span></a></li>
+ <li><a href="functions_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="functions_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="functions_func_0x63.html#index_c"><span>c</span></a></li>
+ <li class="current"><a href="functions_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="functions_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="functions_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="functions_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="functions_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="functions_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="functions_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="functions_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="functions_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="functions_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="functions_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="functions_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="functions_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="functions_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="functions_func_0x76.html#index_v"><span>v</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('functions_func_0x64.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_d"></a>- d -</h3><ul>
+<li>dbg()
+: <a class="el" href="classdba__driver.html#adcc1f8955120fec0708bce39202d0422">dba_driver</a>
+</li>
+<li>delete()
+: <a class="el" href="classRedFile.html#aef71c9eaac7052be7dc8602eb12171e7">RedFile</a>
+</li>
+<li>deliver()
+: <a class="el" href="classZotDriver.html#a876e3e0e4cad83c0b58c8696b344be6f">ZotDriver</a>
+, <a class="el" href="classProtoDriver.html#a85e9063f6d0c304410cd246f7900ea1b">ProtoDriver</a>
+</li>
+<li>deliver_private()
+: <a class="el" href="classProtoDriver.html#ae5b44739f84c10d00a9b65adf3785181">ProtoDriver</a>
+, <a class="el" href="classZotDriver.html#afaaf9941169fc966e43e25b25e6daea6">ZotDriver</a>
+</li>
+<li>destroy()
+: <a class="el" href="classphoto__gd.html#a724703ecf71b1f1d04a80e86c76db6b1">photo_gd</a>
+, <a class="el" href="classphoto__imagick.html#afd49d64751ee3a298eac0c0ce0ba0207">photo_imagick</a>
+, <a class="el" href="classphoto__driver.html#ae1a9edaf846983780dc65ea77d99e813">photo_driver</a>
+</li>
+<li>discover()
+: <a class="el" href="classZotDriver.html#a40d328ff9f6b0a238afe286dddee1514">ZotDriver</a>
+, <a class="el" href="classProtoDriver.html#a64a3868cffe27d601d55f69a2ecc4337">ProtoDriver</a>
+</li>
+<li>doScaleImage()
+: <a class="el" href="classphoto__imagick.html#a3047c68bb4de7f66c2893fe451db2b66">photo_imagick</a>
+, <a class="el" href="classphoto__gd.html#a2f2e5900e6d8b1667892ac631b1d4754">photo_gd</a>
+, <a class="el" href="classphoto__driver.html#ae18716018afcf362c7c24586b53e9e2f">photo_driver</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/functions_func_0x65.html b/doc/html/functions_func_0x65.html
new file mode 100644
index 000000000..26b61b5c1
--- /dev/null
+++ b/doc/html/functions_func_0x65.html
@@ -0,0 +1,149 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="functions.html"><span>All</span></a></li>
+ <li class="current"><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="functions_func.html#index__"><span>_</span></a></li>
+ <li><a href="functions_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="functions_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="functions_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="functions_func_0x64.html#index_d"><span>d</span></a></li>
+ <li class="current"><a href="functions_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="functions_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="functions_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="functions_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="functions_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="functions_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="functions_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="functions_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="functions_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="functions_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="functions_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="functions_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="functions_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="functions_func_0x76.html#index_v"><span>v</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('functions_func_0x65.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_e"></a>- e -</h3><ul>
+<li>escape()
+: <a class="el" href="classdba__driver.html#afc95ffa103a3290581b537670cde5311">dba_driver</a>
+, <a class="el" href="classdba__mysqli.html#a27d6a748af7f80028801306e7ea33f64">dba_mysqli</a>
+, <a class="el" href="classdba__mysql.html#a99a7691ea6cb1300031fb6549379066e">dba_mysql</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/functions_func_0x66.html b/doc/html/functions_func_0x66.html
new file mode 100644
index 000000000..08eb65b1e
--- /dev/null
+++ b/doc/html/functions_func_0x66.html
@@ -0,0 +1,149 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="functions.html"><span>All</span></a></li>
+ <li class="current"><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="functions_func.html#index__"><span>_</span></a></li>
+ <li><a href="functions_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="functions_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="functions_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="functions_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="functions_func_0x65.html#index_e"><span>e</span></a></li>
+ <li class="current"><a href="functions_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="functions_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="functions_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="functions_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="functions_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="functions_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="functions_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="functions_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="functions_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="functions_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="functions_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="functions_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="functions_func_0x76.html#index_v"><span>v</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('functions_func_0x66.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_f"></a>- f -</h3><ul>
+<li>flip()
+: <a class="el" href="classphoto__driver.html#a2b2a99021fc63ed6465d703ddddcb832">photo_driver</a>
+, <a class="el" href="classphoto__imagick.html#aff6bcdbab18593a3fc5a480db8509393">photo_imagick</a>
+, <a class="el" href="classphoto__gd.html#a44cedef376044018702d9355ddc813ce">photo_gd</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/functions_func_0x67.html b/doc/html/functions_func_0x67.html
new file mode 100644
index 000000000..9b1e20fba
--- /dev/null
+++ b/doc/html/functions_func_0x67.html
@@ -0,0 +1,308 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="functions.html"><span>All</span></a></li>
+ <li class="current"><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="functions_func.html#index__"><span>_</span></a></li>
+ <li><a href="functions_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="functions_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="functions_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="functions_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="functions_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="functions_func_0x66.html#index_f"><span>f</span></a></li>
+ <li class="current"><a href="functions_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="functions_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="functions_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="functions_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="functions_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="functions_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="functions_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="functions_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="functions_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="functions_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="functions_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="functions_func_0x76.html#index_v"><span>v</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('functions_func_0x67.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_g"></a>- g -</h3><ul>
+<li>gen_token()
+: <a class="el" href="classFKOAuthDataStore.html#aa1a268be88ad3979bb4cc35bbb4dc819">FKOAuthDataStore</a>
+</li>
+<li>generateDirectoryIndex()
+: <a class="el" href="classRedBrowser.html#a1f7daf50bb9bfcde7345b3b1908dbd7e">RedBrowser</a>
+</li>
+<li>get()
+: <a class="el" href="classRedFile.html#a7c868dfcef6c70cd0e24cf3caa2c3535">RedFile</a>
+, <a class="el" href="classCache.html#a70392b109331897bf9fdd7f1960e21de">Cache</a>
+</li>
+<li>get_account()
+: <a class="el" href="classApp.html#a08bc87aff64f39fbc084e9d6545cee4d">App</a>
+</li>
+<li>get_app()
+: <a class="el" href="classBaseObject.html#ac43f10e69ce80c78e4870636250fc8a2">BaseObject</a>
+</li>
+<li>get_apps()
+: <a class="el" href="classApp.html#a5c63eabdc7fdd8b6e3348980ec16a3ad">App</a>
+</li>
+<li>get_baseurl()
+: <a class="el" href="classApp.html#a604d659d6977a99de42a160343e5289a">App</a>
+</li>
+<li>get_channel()
+: <a class="el" href="classApp.html#a084e03c77686d8c13390fef3f7428a2b">App</a>
+</li>
+<li>get_child()
+: <a class="el" href="classItem.html#a632185dd25c5caf277067c76230a4320">Item</a>
+</li>
+<li>get_children()
+: <a class="el" href="classItem.html#aa0ee775ec94abccec6c798428835d001">Item</a>
+</li>
+<li>get_cipher()
+: <a class="el" href="classConversation.html#a4aab60bb39fa6761b6cacdc8d9da2901">Conversation</a>
+</li>
+<li>get_comment_box()
+: <a class="el" href="classItem.html#a3ee7667c2ec6cd7657328e27848c0bdf">Item</a>
+</li>
+<li>get_comment_box_template()
+: <a class="el" href="classItem.html#a904421c7a427411bb2ab473bca872f63">Item</a>
+</li>
+<li>get_conversation()
+: <a class="el" href="classItem.html#a0c301aaed2b7d682728d18db3a22afa3">Item</a>
+</li>
+<li>get_data()
+: <a class="el" href="classItem.html#ad3638f93065693c1f69eb349feb1b7aa">Item</a>
+</li>
+<li>get_data_value()
+: <a class="el" href="classItem.html#ac6f1c96cc82a0dfb7e881fc70309ea3c">Item</a>
+</li>
+<li>get_FormatsMap()
+: <a class="el" href="classphoto__imagick.html#aef020d929f66f4370e33fc158c8eebd4">photo_imagick</a>
+</li>
+<li>get_groups()
+: <a class="el" href="classApp.html#a4659785d13e4bac0bed50dbb1b0d4299">App</a>
+</li>
+<li>get_hostname()
+: <a class="el" href="classApp.html#a622eace13f8fc9f4b5672a68e2bc4396">App</a>
+</li>
+<li>get_id()
+: <a class="el" href="classItem.html#ac0f27e58532612f6e7a54c8a621b9b92">Item</a>
+</li>
+<li>get_intltext_template()
+: <a class="el" href="classFriendicaSmartyEngine.html#a35ec0ee828c36640ea25296bcb84a118">FriendicaSmartyEngine</a>
+</li>
+<li>get_markup_template()
+: <a class="el" href="classFriendicaSmartyEngine.html#aab5994077fc3a64222e41b28e2bd8d88">FriendicaSmartyEngine</a>
+, <a class="el" href="interfaceITemplateEngine.html#aaf2698adbf46c073c24b162fe1b1c442">ITemplateEngine</a>
+, <a class="el" href="classTemplate.html#afd97b4b1e7754a550e67c0ea79159059">Template</a>
+</li>
+<li>get_mode()
+: <a class="el" href="classConversation.html#a87a0d704d5f2b1a008cc2e9ce06a1bcd">Conversation</a>
+</li>
+<li>get_observer()
+: <a class="el" href="classApp.html#a1ad3bb1b68439b3b7cbe630918e618d2">App</a>
+, <a class="el" href="classConversation.html#ae3d4190142e12b57051f11f2911f77a0">Conversation</a>
+</li>
+<li>get_owner_name()
+: <a class="el" href="classItem.html#a67892aa23d19f4431bb2e5f43c74000e">Item</a>
+</li>
+<li>get_owner_photo()
+: <a class="el" href="classItem.html#aa541bc4290e51bfd688d6921bebabc73">Item</a>
+</li>
+<li>get_owner_url()
+: <a class="el" href="classItem.html#a9f2d219da712390f59012fc32a342074">Item</a>
+</li>
+<li>get_parent()
+: <a class="el" href="classItem.html#a4b92e3a9d6212c553aa2661489bd95d8">Item</a>
+</li>
+<li>get_path()
+: <a class="el" href="classApp.html#a5293a8543ba338dcf38cd4ff3bc5d4be">App</a>
+</li>
+<li>get_perms()
+: <a class="el" href="classApp.html#adb5a4bb657881e553978ff390babd01f">App</a>
+</li>
+<li>get_profile_owner()
+: <a class="el" href="classConversation.html#a5effe8ad3007e01333df44b81432b813">Conversation</a>
+</li>
+<li>get_redirect_url()
+: <a class="el" href="classItem.html#a428f448f89a8629055ea3294eb942aea">Item</a>
+</li>
+<li>get_template()
+: <a class="el" href="classItem.html#aba23a0a9d89e316d2b343cc46d695d91">Item</a>
+</li>
+<li>get_template_data()
+: <a class="el" href="classConversation.html#a2a96b7a6573ae53db861624659e831cb">Conversation</a>
+, <a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">Item</a>
+</li>
+<li>get_template_engine()
+: <a class="el" href="classApp.html#acb27e607fe4c82603444676e25c36b70">App</a>
+</li>
+<li>get_template_ldelim()
+: <a class="el" href="classApp.html#a2eb832a8577dee7d40b93abdf6d1d35a">App</a>
+</li>
+<li>get_template_rdelim()
+: <a class="el" href="classApp.html#aab23c59172310fd30f2d60dc039d3eea">App</a>
+</li>
+<li>get_thread()
+: <a class="el" href="classConversation.html#a4cff75d8c46b517e7133e4d0da6fc1c8">Conversation</a>
+</li>
+<li>get_widgets()
+: <a class="el" href="classApp.html#a871898becd0697d778f36d9336253ae8">App</a>
+</li>
+<li>getChild()
+: <a class="el" href="classRedDirectory.html#aaa20f0f44da23781917af8170c0a2569">RedDirectory</a>
+</li>
+<li>getChildren()
+: <a class="el" href="classRedDirectory.html#aa42d3065f6f065b17db87146a7cb031a">RedDirectory</a>
+</li>
+<li>getContentType()
+: <a class="el" href="classRedFile.html#a26416827eb68554d033d1e2e5cc6dd3b">RedFile</a>
+</li>
+<li>getDir()
+: <a class="el" href="classRedDirectory.html#a70173d4458572d95e586b2037d2fd2f4">RedDirectory</a>
+</li>
+<li>getETag()
+: <a class="el" href="classRedFile.html#ae96d5caa2db7a461c57b24380fa87e28">RedFile</a>
+</li>
+<li>getExt()
+: <a class="el" href="classphoto__driver.html#aa2efb5b2a6af3fd67e3f1c2b9852a5ba">photo_driver</a>
+</li>
+<li>getHeight()
+: <a class="el" href="classphoto__driver.html#af769e9abb144e57002c59aa2aa8f3468">photo_driver</a>
+</li>
+<li>getImage()
+: <a class="el" href="classphoto__driver.html#ab98da263bd7341fc132c4fb6fc76e8d5">photo_driver</a>
+, <a class="el" href="classphoto__gd.html#a86757ba021fd80d1a5cf8c2f766a8484">photo_gd</a>
+, <a class="el" href="classphoto__imagick.html#ad07288e0eb3922cb08cc9d33a163decc">photo_imagick</a>
+</li>
+<li>getLastModified()
+: <a class="el" href="classRedFile.html#a41562a28007789bbe7fe06d6a20eef47">RedFile</a>
+</li>
+<li>getName()
+: <a class="el" href="classRedDirectory.html#af6e4475dbd5abcdede00d20b8d388583">RedDirectory</a>
+, <a class="el" href="classRedFile.html#a0c961c5f49544d2502420361fa526437">RedFile</a>
+</li>
+<li>getSize()
+: <a class="el" href="classRedFile.html#acb1edbe1848fab05347746fa1ea09d8f">RedFile</a>
+</li>
+<li>getType()
+: <a class="el" href="classphoto__driver.html#a6c6c16dbc4f517ce799f9143ed61f0e3">photo_driver</a>
+</li>
+<li>getWidth()
+: <a class="el" href="classphoto__driver.html#acc30486acee9e89e32701f44a1738117">photo_driver</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/functions_func_0x68.html b/doc/html/functions_func_0x68.html
new file mode 100644
index 000000000..355e603d1
--- /dev/null
+++ b/doc/html/functions_func_0x68.html
@@ -0,0 +1,153 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="functions.html"><span>All</span></a></li>
+ <li class="current"><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="functions_func.html#index__"><span>_</span></a></li>
+ <li><a href="functions_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="functions_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="functions_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="functions_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="functions_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="functions_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="functions_func_0x67.html#index_g"><span>g</span></a></li>
+ <li class="current"><a href="functions_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="functions_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="functions_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="functions_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="functions_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="functions_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="functions_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="functions_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="functions_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="functions_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="functions_func_0x76.html#index_v"><span>v</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('functions_func_0x68.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_h"></a>- h -</h3><ul>
+<li>head_get_icon()
+: <a class="el" href="classApp.html#af17df107f2216ddf5ad2a7e0f2ba2166">App</a>
+</li>
+<li>head_set_icon()
+: <a class="el" href="classApp.html#a8863703a0305eaa45eb970dbd2046291">App</a>
+</li>
+<li>htmlActionsPanel()
+: <a class="el" href="classRedBrowser.html#a7f6bf0bda07833f4c647557bd172e349">RedBrowser</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/functions_func_0x69.html b/doc/html/functions_func_0x69.html
new file mode 100644
index 000000000..478fdab39
--- /dev/null
+++ b/doc/html/functions_func_0x69.html
@@ -0,0 +1,177 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="functions.html"><span>All</span></a></li>
+ <li class="current"><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="functions_func.html#index__"><span>_</span></a></li>
+ <li><a href="functions_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="functions_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="functions_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="functions_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="functions_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="functions_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="functions_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="functions_func_0x68.html#index_h"><span>h</span></a></li>
+ <li class="current"><a href="functions_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="functions_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="functions_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="functions_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="functions_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="functions_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="functions_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="functions_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="functions_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="functions_func_0x76.html#index_v"><span>v</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('functions_func_0x69.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_i"></a>- i -</h3><ul>
+<li>imageString()
+: <a class="el" href="classphoto__driver.html#abc9f73ad90923772d52b9fcc4eb117dd">photo_driver</a>
+, <a class="el" href="classphoto__gd.html#a0795fc029be382557ae3f6e285f40e00">photo_gd</a>
+, <a class="el" href="classphoto__imagick.html#a70adbef31128c0ac8cbc5dcf34cdb019">photo_imagick</a>
+</li>
+<li>install()
+: <a class="el" href="classdba__driver.html#a4ccb27243e62a8ca30dd8e1b8cc67746">dba_driver</a>
+</li>
+<li>is_commentable()
+: <a class="el" href="classConversation.html#a8b47c92b69459d461ea3cc9aae9597a3">Conversation</a>
+, <a class="el" href="classItem.html#ac04525a8be24c12b0a2ae4ca1ba4b967">Item</a>
+</li>
+<li>is_preview()
+: <a class="el" href="classConversation.html#adf25ce023b69a166c63c6e84e02c136a">Conversation</a>
+</li>
+<li>is_threaded()
+: <a class="el" href="classItem.html#a5b2fafdca55aefeaa08993a5a60529f0">Item</a>
+</li>
+<li>is_toplevel()
+: <a class="el" href="classItem.html#aa49e40f961dff66da32c5ae110e32993">Item</a>
+</li>
+<li>is_valid()
+: <a class="el" href="classphoto__driver.html#a97289aef3be43d9435ca3717ef10b8ab">photo_driver</a>
+</li>
+<li>is_visiting()
+: <a class="el" href="classItem.html#a97c7feeea7f26a73176cb19faa455e12">Item</a>
+</li>
+<li>is_wall_to_wall()
+: <a class="el" href="classItem.html#aabf87ded59c25b5fe2b2296678e70509">Item</a>
+</li>
+<li>is_writable()
+: <a class="el" href="classConversation.html#a5879199008b96bee7550b576d614e1c1">Conversation</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/functions_func_0x6c.html b/doc/html/functions_func_0x6c.html
new file mode 100644
index 000000000..7eade1b08
--- /dev/null
+++ b/doc/html/functions_func_0x6c.html
@@ -0,0 +1,161 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="functions.html"><span>All</span></a></li>
+ <li class="current"><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="functions_func.html#index__"><span>_</span></a></li>
+ <li><a href="functions_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="functions_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="functions_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="functions_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="functions_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="functions_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="functions_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="functions_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="functions_func_0x69.html#index_i"><span>i</span></a></li>
+ <li class="current"><a href="functions_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="functions_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="functions_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="functions_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="functions_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="functions_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="functions_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="functions_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="functions_func_0x76.html#index_v"><span>v</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('functions_func_0x6c.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_l"></a>- l -</h3><ul>
+<li>load()
+: <a class="el" href="classphoto__driver.html#a19e1af2b6af4c63aa6230abe69f83712">photo_driver</a>
+, <a class="el" href="classphoto__gd.html#a33092b889875b68bfb1c97ff123012d9">photo_gd</a>
+, <a class="el" href="classphoto__imagick.html#a2c9168f110ccd6c264095d766615dfa8">photo_imagick</a>
+</li>
+<li>loginUser()
+: <a class="el" href="classFKOAuth1.html#a2b1dac2ed31fc6ef84668afdda8b263f">FKOAuth1</a>
+</li>
+<li>lookup_consumer()
+: <a class="el" href="classFKOAuthDataStore.html#a1148d47b546350bf440bdd92792c5df1">FKOAuthDataStore</a>
+</li>
+<li>lookup_nonce()
+: <a class="el" href="classFKOAuthDataStore.html#a4edfe2e77ecd2e16ff6b5eb516ed3599">FKOAuthDataStore</a>
+</li>
+<li>lookup_token()
+: <a class="el" href="classFKOAuthDataStore.html#a96f76387c3a93b0abe27a98013804bab">FKOAuthDataStore</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/functions_func_0x6e.html b/doc/html/functions_func_0x6e.html
new file mode 100644
index 000000000..99ffb26f6
--- /dev/null
+++ b/doc/html/functions_func_0x6e.html
@@ -0,0 +1,150 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="functions.html"><span>All</span></a></li>
+ <li class="current"><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="functions_func.html#index__"><span>_</span></a></li>
+ <li><a href="functions_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="functions_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="functions_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="functions_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="functions_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="functions_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="functions_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="functions_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="functions_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="functions_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li class="current"><a href="functions_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="functions_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="functions_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="functions_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="functions_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="functions_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="functions_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="functions_func_0x76.html#index_v"><span>v</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('functions_func_0x6e.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_n"></a>- n -</h3><ul>
+<li>new_access_token()
+: <a class="el" href="classFKOAuthDataStore.html#a434882f03e3cdb171ed89e09e337e934">FKOAuthDataStore</a>
+</li>
+<li>new_request_token()
+: <a class="el" href="classFKOAuthDataStore.html#a431b44d70e3da6a8256ab38f710e3050">FKOAuthDataStore</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/functions_func_0x6f.html b/doc/html/functions_func_0x6f.html
new file mode 100644
index 000000000..c0d02523c
--- /dev/null
+++ b/doc/html/functions_func_0x6f.html
@@ -0,0 +1,147 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="functions.html"><span>All</span></a></li>
+ <li class="current"><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="functions_func.html#index__"><span>_</span></a></li>
+ <li><a href="functions_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="functions_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="functions_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="functions_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="functions_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="functions_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="functions_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="functions_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="functions_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="functions_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="functions_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li class="current"><a href="functions_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="functions_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="functions_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="functions_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="functions_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="functions_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="functions_func_0x76.html#index_v"><span>v</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('functions_func_0x6f.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_o"></a>- o -</h3><ul>
+<li>orient()
+: <a class="el" href="classphoto__driver.html#a4de5bac8daea8f291a33c80788019d0d">photo_driver</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/functions_func_0x70.html b/doc/html/functions_func_0x70.html
new file mode 100644
index 000000000..b036e941f
--- /dev/null
+++ b/doc/html/functions_func_0x70.html
@@ -0,0 +1,150 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="functions.html"><span>All</span></a></li>
+ <li class="current"><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="functions_func.html#index__"><span>_</span></a></li>
+ <li><a href="functions_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="functions_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="functions_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="functions_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="functions_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="functions_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="functions_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="functions_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="functions_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="functions_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="functions_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="functions_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li class="current"><a href="functions_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="functions_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="functions_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="functions_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="functions_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="functions_func_0x76.html#index_v"><span>v</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('functions_func_0x70.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_p"></a>- p -</h3><ul>
+<li>parsed()
+: <a class="el" href="classFriendicaSmarty.html#a6a4d4281d6fa9be1d37a97b188ffe8c9">FriendicaSmarty</a>
+</li>
+<li>put()
+: <a class="el" href="classRedFile.html#a41a49a583eb276b75626fcf97f4a699c">RedFile</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/functions_func_0x71.html b/doc/html/functions_func_0x71.html
new file mode 100644
index 000000000..fb02d6f5e
--- /dev/null
+++ b/doc/html/functions_func_0x71.html
@@ -0,0 +1,149 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="functions.html"><span>All</span></a></li>
+ <li class="current"><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="functions_func.html#index__"><span>_</span></a></li>
+ <li><a href="functions_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="functions_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="functions_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="functions_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="functions_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="functions_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="functions_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="functions_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="functions_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="functions_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="functions_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="functions_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="functions_func_0x70.html#index_p"><span>p</span></a></li>
+ <li class="current"><a href="functions_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="functions_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="functions_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="functions_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="functions_func_0x76.html#index_v"><span>v</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('functions_func_0x71.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_q"></a>- q -</h3><ul>
+<li>q()
+: <a class="el" href="classdba__driver.html#a558e738b88ae893cc5d79ffa3793d555">dba_driver</a>
+, <a class="el" href="classdba__mysqli.html#a611c4de8d6d7512dffb83a38bb6701ec">dba_mysqli</a>
+, <a class="el" href="classdba__mysql.html#ac3fd60c278f400907322dac578754a99">dba_mysql</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/functions_func_0x72.html b/doc/html/functions_func_0x72.html
new file mode 100644
index 000000000..6c9e9ab8e
--- /dev/null
+++ b/doc/html/functions_func_0x72.html
@@ -0,0 +1,166 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="functions.html"><span>All</span></a></li>
+ <li class="current"><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="functions_func.html#index__"><span>_</span></a></li>
+ <li><a href="functions_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="functions_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="functions_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="functions_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="functions_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="functions_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="functions_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="functions_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="functions_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="functions_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="functions_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="functions_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="functions_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="functions_func_0x71.html#index_q"><span>q</span></a></li>
+ <li class="current"><a href="functions_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="functions_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="functions_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="functions_func_0x76.html#index_v"><span>v</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('functions_func_0x72.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_r"></a>- r -</h3><ul>
+<li>register_template_engine()
+: <a class="el" href="classApp.html#abf46a653d8499e7c253cc1be894a6d83">App</a>
+</li>
+<li>remove_child()
+: <a class="el" href="classItem.html#a2ce70ef63f9f4d86a09c351678806925">Item</a>
+</li>
+<li>remove_parent()
+: <a class="el" href="classItem.html#aa452b5bcd8dea12119b09212c615cb41">Item</a>
+</li>
+<li>replace()
+: <a class="el" href="classTemplate.html#a285b5b2007dbbf733476273df3fed4ef">Template</a>
+</li>
+<li>replace_macros()
+: <a class="el" href="classTemplate.html#a07737733f6949bdedea1e3d301b2ab7b">Template</a>
+, <a class="el" href="classFriendicaSmartyEngine.html#ad62f1181d2f02b54b46731ad2bd46db2">FriendicaSmartyEngine</a>
+, <a class="el" href="interfaceITemplateEngine.html#aaa7381c8becc3d1c1790b53988a0f243">ITemplateEngine</a>
+</li>
+<li>rotate()
+: <a class="el" href="classphoto__imagick.html#a9df5738a4a18e76dd304c440e96f045f">photo_imagick</a>
+, <a class="el" href="classphoto__driver.html#a2f2b6337cf9aa0688d10b422123f0eec">photo_driver</a>
+, <a class="el" href="classphoto__gd.html#a77f87730b11093b76980c541159df37d">photo_gd</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/functions_func_0x73.html b/doc/html/functions_func_0x73.html
new file mode 100644
index 000000000..d055a1ca6
--- /dev/null
+++ b/doc/html/functions_func_0x73.html
@@ -0,0 +1,250 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="functions.html"><span>All</span></a></li>
+ <li class="current"><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="functions_func.html#index__"><span>_</span></a></li>
+ <li><a href="functions_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="functions_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="functions_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="functions_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="functions_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="functions_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="functions_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="functions_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="functions_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="functions_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="functions_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="functions_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="functions_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="functions_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="functions_func_0x72.html#index_r"><span>r</span></a></li>
+ <li class="current"><a href="functions_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="functions_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="functions_func_0x76.html#index_v"><span>v</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('functions_func_0x73.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_s"></a>- s -</h3><ul>
+<li>save()
+: <a class="el" href="classphoto__driver.html#a5864fae7d8389372955a8e78cec527ac">photo_driver</a>
+</li>
+<li>saveImage()
+: <a class="el" href="classphoto__driver.html#a22ecb8c696de65a5a10bd185be9d90c3">photo_driver</a>
+</li>
+<li>scaleImage()
+: <a class="el" href="classphoto__driver.html#af0f7ec48a31ae9b557b6e3f8bd5b4af0">photo_driver</a>
+</li>
+<li>scaleImageSquare()
+: <a class="el" href="classphoto__driver.html#a56634842b071b96502716e9843ea5361">photo_driver</a>
+</li>
+<li>scaleImageUp()
+: <a class="el" href="classphoto__driver.html#a1a63c4ae17e892a115ab9cf6efb960ce">photo_driver</a>
+</li>
+<li>send()
+: <a class="el" href="classenotify.html#afbc088860f534c6c05788b48cfc262c6">enotify</a>
+</li>
+<li>set()
+: <a class="el" href="classCache.html#ae622b82adc1c2fb1f3e2cc4fd9688fce">Cache</a>
+</li>
+<li>set_account()
+: <a class="el" href="classApp.html#aeb1fe1c8ad9aa639909bd183ce578536">App</a>
+</li>
+<li>set_app()
+: <a class="el" href="classBaseObject.html#a0a9acda12d751692834cf6999f889223">BaseObject</a>
+</li>
+<li>set_apps()
+: <a class="el" href="classApp.html#abea5a4f77dcd53c928dc4eed86616637">App</a>
+</li>
+<li>set_baseurl()
+: <a class="el" href="classApp.html#a78788f6e9d8b713b138f81e457c5cd08">App</a>
+</li>
+<li>set_channel()
+: <a class="el" href="classApp.html#a89e9feb2bfb5253883a9720beaffe876">App</a>
+</li>
+<li>set_commentable()
+: <a class="el" href="classItem.html#aa1bd19fc8b5577078530265a7bf64123">Item</a>
+</li>
+<li>set_conversation()
+: <a class="el" href="classItem.html#aa8b1bbc4236890694635295e46d7fd72">Item</a>
+</li>
+<li>set_groups()
+: <a class="el" href="classApp.html#a3d84af5e42082098672531cd1a618853">App</a>
+</li>
+<li>set_hostname()
+: <a class="el" href="classApp.html#a344d2b7dc2f276648d521aee4da1731c">App</a>
+</li>
+<li>set_mode()
+: <a class="el" href="classConversation.html#a66f121ca4026246f86a732e5faa0682c">Conversation</a>
+</li>
+<li>set_observer()
+: <a class="el" href="classApp.html#a4776d9322edea17fae56afa5d01a323e">App</a>
+</li>
+<li>set_pager_itemspage()
+: <a class="el" href="classApp.html#a4bdd7bfed62f50515fce652127bf481b">App</a>
+</li>
+<li>set_pager_total()
+: <a class="el" href="classApp.html#a560189f048d3db2f526841963cc43e97">App</a>
+</li>
+<li>set_parent()
+: <a class="el" href="classItem.html#a9890ff72662d5bba301d1f2dd8aec9d7">Item</a>
+</li>
+<li>set_path()
+: <a class="el" href="classApp.html#adb060d5c7f35a521ec7ec0effbe08097">App</a>
+</li>
+<li>set_perms()
+: <a class="el" href="classApp.html#a557d7b779d8259027f4724ebf7b248dc">App</a>
+</li>
+<li>set_profile_owner()
+: <a class="el" href="classConversation.html#a8898bddc1e8990e81dab9a13a532cc93">Conversation</a>
+</li>
+<li>set_template()
+: <a class="el" href="classItem.html#af1b73df9b7c4b927e26b7e243b491f42">Item</a>
+</li>
+<li>set_template_engine()
+: <a class="el" href="classApp.html#a20d1890cc16b22ba79eeb0cbf2f719f7">App</a>
+</li>
+<li>set_widget()
+: <a class="el" href="classApp.html#a123b903dfe5d3488cc68db3471d36fd2">App</a>
+</li>
+<li>set_writeable()
+: <a class="el" href="classRedBrowser.html#a40fdbb9d9fe6c1243bbf135dd5b0a06f">RedBrowser</a>
+</li>
+<li>setBrowserPlugin()
+: <a class="el" href="classRedBasicAuth.html#a358ddad4abb5aa8c1382cf49a907adbc">RedBasicAuth</a>
+</li>
+<li>setCurrentUser()
+: <a class="el" href="classRedBasicAuth.html#a072e8244a9a7f191b32d3db5ac94f857">RedBasicAuth</a>
+</li>
+<li>setDimensions()
+: <a class="el" href="classphoto__gd.html#a1c75304bd15f3b9986f0b315fb59271e">photo_gd</a>
+, <a class="el" href="classphoto__driver.html#ae663867d2c4eaa2fae50d60670920143">photo_driver</a>
+, <a class="el" href="classphoto__imagick.html#af92901d252c1e6ab5b54eebedbed23bb">photo_imagick</a>
+</li>
+<li>setName()
+: <a class="el" href="classRedFile.html#a38a82bfc1b30028ea6ac75923e90fa25">RedFile</a>
+</li>
+<li>store()
+: <a class="el" href="classphoto__driver.html#a642a8d0c4ad5f887c99c6af77cee287b">photo_driver</a>
+</li>
+<li>supportedTypes()
+: <a class="el" href="classphoto__gd.html#a16f3dd7d3559f715aa2fe3f7880836dd">photo_gd</a>
+, <a class="el" href="classphoto__imagick.html#a27596faca6108d9d563674d1b654a0b7">photo_imagick</a>
+, <a class="el" href="classphoto__driver.html#a6eee8e36eaf9339f4faf80ddd43162da">photo_driver</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/functions_func_0x74.html b/doc/html/functions_func_0x74.html
new file mode 100644
index 000000000..8b2d47dca
--- /dev/null
+++ b/doc/html/functions_func_0x74.html
@@ -0,0 +1,147 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="functions.html"><span>All</span></a></li>
+ <li class="current"><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="functions_func.html#index__"><span>_</span></a></li>
+ <li><a href="functions_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="functions_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="functions_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="functions_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="functions_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="functions_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="functions_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="functions_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="functions_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="functions_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="functions_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="functions_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="functions_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="functions_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="functions_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="functions_func_0x73.html#index_s"><span>s</span></a></li>
+ <li class="current"><a href="functions_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="functions_func_0x76.html#index_v"><span>v</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('functions_func_0x74.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_t"></a>- t -</h3><ul>
+<li>template_engine()
+: <a class="el" href="classApp.html#a94a1ed2dc493c58612d17035b74ae736">App</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/functions_func_0x76.html b/doc/html/functions_func_0x76.html
new file mode 100644
index 000000000..be21dc444
--- /dev/null
+++ b/doc/html/functions_func_0x76.html
@@ -0,0 +1,150 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="functions.html"><span>All</span></a></li>
+ <li class="current"><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="functions_func.html#index__"><span>_</span></a></li>
+ <li><a href="functions_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="functions_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="functions_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="functions_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="functions_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="functions_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="functions_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="functions_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="functions_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="functions_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="functions_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="functions_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="functions_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="functions_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="functions_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="functions_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="functions_func_0x74.html#index_t"><span>t</span></a></li>
+ <li class="current"><a href="functions_func_0x76.html#index_v"><span>v</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('functions_func_0x76.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_v"></a>- v -</h3><ul>
+<li>validateUserPass()
+: <a class="el" href="classRedBasicAuth.html#a8dfd9a0953f8884723b421b7c1acf79b">RedBasicAuth</a>
+</li>
+<li>var_replace()
+: <a class="el" href="classTemplate.html#abbc484016ddf5d818f55b823cae6feb0">Template</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/functions_vars.html b/doc/html/functions_vars.html
new file mode 100644
index 000000000..4c6d04092
--- /dev/null
+++ b/doc/html/functions_vars.html
@@ -0,0 +1,472 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class Members - Variables</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="functions.html"><span>All</span></a></li>
+ <li><a href="functions_func.html"><span>Functions</span></a></li>
+ <li class="current"><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="#index_0x24"><span>$</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('functions_vars.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_0x24"></a>- $ -</h3><ul>
+<li>$account
+: <a class="el" href="classApp.html#a14bd4b1c29f3aff371fe5d4cb11aeea3">App</a>
+</li>
+<li>$app
+: <a class="el" href="classBaseObject.html#a02cc4cd8fa26b6fc76d92fde54b4e4b1">BaseObject</a>
+</li>
+<li>$apps
+: <a class="el" href="classApp.html#a230e975296cf164da2fee35ef720964f">App</a>
+</li>
+<li>$argc
+: <a class="el" href="classApp.html#af58db526040829b1c8bd95561b329262">App</a>
+</li>
+<li>$argv
+: <a class="el" href="classApp.html#ab3da757abe5cb45bf88f07cc51a73b58">App</a>
+</li>
+<li>$auth
+: <a class="el" href="classRedBrowser.html#ab6d6d1e2a67e06b344a4cede1bd00b35">RedBrowser</a>
+, <a class="el" href="classRedDirectory.html#a9616af16cd19a18a6afebebcc2881c44">RedDirectory</a>
+, <a class="el" href="classRedFile.html#a4b5d0e33f919c6c175b30a55de6263f2">RedFile</a>
+</li>
+<li>$baseurl
+: <a class="el" href="classApp.html#ad5175536561021548ae8188e24c7b80c">App</a>
+</li>
+<li>$browser
+: <a class="el" href="classRedBasicAuth.html#af14337f1baad407f8a85d48205c0f30e">RedBasicAuth</a>
+</li>
+<li>$cached_profile_image
+: <a class="el" href="classApp.html#abe0e4fa91097f7a6588e1213a834121c">App</a>
+</li>
+<li>$cached_profile_picdate
+: <a class="el" href="classApp.html#aab4a685d15a363bb1d7edbbc20bfb94e">App</a>
+</li>
+<li>$category
+: <a class="el" href="classApp.html#a5cfc098c061b7d765add58fd2ca97445">App</a>
+</li>
+<li>$channel
+: <a class="el" href="classApp.html#a050b0696118da47e8b30859ad1a2c149">App</a>
+, <a class="el" href="classItem.html#acc32426c0f465391be8a99ad810c7b8e">Item</a>
+</li>
+<li>$channel_hash
+: <a class="el" href="classRedBasicAuth.html#ad5a3ea4dc4783b242d9dc6e76478b6ef">RedBasicAuth</a>
+</li>
+<li>$channel_id
+: <a class="el" href="classRedBasicAuth.html#a2dab393650d1573e3515969a153e8354">RedBasicAuth</a>
+</li>
+<li>$channel_name
+: <a class="el" href="classRedBasicAuth.html#a438ab125b6ef46581947e35d49cdebac">RedBasicAuth</a>
+</li>
+<li>$children
+: <a class="el" href="classItem.html#a80dcd0fb7673776c0967839d429c2a0f">Item</a>
+</li>
+<li>$cid
+: <a class="el" href="classApp.html#ad1c8eb91a6fd470b94f34b7fdad3a2d0">App</a>
+</li>
+<li>$cipher
+: <a class="el" href="classConversation.html#aa95c1a62af38bdfba7add9549bec083b">Conversation</a>
+</li>
+<li>$cmd
+: <a class="el" href="classApp.html#a495ec082c2719314e536070ca1ce073d">App</a>
+</li>
+<li>$comment_box_template
+: <a class="el" href="classItem.html#a90743c8348b13213275c223bb9333aa0">Item</a>
+</li>
+<li>$commentable
+: <a class="el" href="classConversation.html#afd4965d22a6e4bfea2f35e931b3273c6">Conversation</a>
+, <a class="el" href="classItem.html#aa2c221231ad0fc3720ccc1f00f0c6304">Item</a>
+</li>
+<li>$config
+: <a class="el" href="classApp.html#ac73dc90e4764497e2f1b7e6612c8fb88">App</a>
+</li>
+<li>$connected
+: <a class="el" href="classdba__driver.html#a205f6535e399700b6fca2492f96f2229">dba_driver</a>
+</li>
+<li>$contact
+: <a class="el" href="classApp.html#a98ef4cfd36693a3457c879b76bc6d694">App</a>
+</li>
+<li>$contacts
+: <a class="el" href="classApp.html#a61ca6e3af82071ea25ff2fd5dbcddae2">App</a>
+</li>
+<li>$content
+: <a class="el" href="classApp.html#ac1d80a14492acc932715d54567d8a589">App</a>
+</li>
+<li>$conversation
+: <a class="el" href="classItem.html#a007424e3e3171dcfb4312a02161da6cd">Item</a>
+</li>
+<li>$css_sources
+: <a class="el" href="classApp.html#a6f55d087e1ff4710132c1b0863faa2ee">App</a>
+</li>
+<li>$curl_code
+: <a class="el" href="classApp.html#a256360c9184fed6d7556e0bc0a835d7f">App</a>
+</li>
+<li>$curl_headers
+: <a class="el" href="classApp.html#af5007c42a693afd9c4899c243b2e1363">App</a>
+</li>
+<li>$d
+: <a class="el" href="classTemplate.html#a8469ab2988b6be2681516dc4b4e07d38">Template</a>
+</li>
+<li>$data
+: <a class="el" href="classApp.html#a0ce85be198e46570366cb3344f3c55b8">App</a>
+, <a class="el" href="classItem.html#aec24e233f9098f902b1e57e60dcb2019">Item</a>
+, <a class="el" href="classRedFile.html#a2ff12032b45538353eded9809d3b7550">RedFile</a>
+</li>
+<li>$db
+: <a class="el" href="classApp.html#a330410a288f3393d53772f5e98f857ea">App</a>
+, <a class="el" href="classdba__driver.html#a3033b5f1c2716b52202faeaae2592fe6">dba_driver</a>
+</li>
+<li>$debug
+: <a class="el" href="classdba__driver.html#af48e2afeded5285766bf92e22123ed03">dba_driver</a>
+, <a class="el" href="classTemplate.html#afc4afb6f89bebcd5480022312a56cb4a">Template</a>
+</li>
+<li>$done
+: <a class="el" href="classTemplate.html#abda4c8d049f70553338eae7c905e9d5c">Template</a>
+</li>
+<li>$error
+: <a class="el" href="classApp.html#ac1a8b2cd40609b231a560201a08852ba">App</a>
+, <a class="el" href="classdba__driver.html#a84675d28c7bd9b7290dd37e66dbd216c">dba_driver</a>
+</li>
+<li>$ext_path
+: <a class="el" href="classRedDirectory.html#a0f113244cd85c17848df991001d024f4">RedDirectory</a>
+</li>
+<li>$filename
+: <a class="el" href="classFriendicaSmarty.html#a33fabbd4d6eef869df496adf357ae690">FriendicaSmarty</a>
+</li>
+<li>$folder_hash
+: <a class="el" href="classRedDirectory.html#aa10254abf177bb2a0e4a88495725e09b">RedDirectory</a>
+</li>
+<li>$force_max_items
+: <a class="el" href="classApp.html#ae3f47830543d0d902f66913def8db66b">App</a>
+</li>
+<li>$groups
+: <a class="el" href="classApp.html#ac6e6b1c7d6df408580ff79977fcfa656">App</a>
+</li>
+<li>$height
+: <a class="el" href="classphoto__driver.html#aea560be5dfba09117d36c12bacbf3b80">photo_driver</a>
+</li>
+<li>$hooks
+: <a class="el" href="classApp.html#a3694aa1907aa103a2adbc71f926f0fa0">App</a>
+</li>
+<li>$hostname
+: <a class="el" href="classApp.html#a037049cba88dfc6ff94f4b5b779e3fd3">App</a>
+</li>
+<li>$identities
+: <a class="el" href="classApp.html#a7954862f44f606b0ff83d4c74d15e792">App</a>
+</li>
+<li>$image
+: <a class="el" href="classphoto__driver.html#a7c78b5a01afe61ba3895ac07f4869b55">photo_driver</a>
+</li>
+<li>$interactive
+: <a class="el" href="classApp.html#a4c7cfc62d39508086cf300dc2e39c4df">App</a>
+</li>
+<li>$js_sources
+: <a class="el" href="classApp.html#a11e24b3ed9b33ffee7dd41d110b4366d">App</a>
+</li>
+<li>$lang
+: <a class="el" href="classTemplate.html#ace26b8a4252fbc1c385d2b5e1e93e5c8">Template</a>
+</li>
+<li>$language
+: <a class="el" href="classApp.html#a1a297e70b3667b83f4460aa7ed9f5d6f">App</a>
+</li>
+<li>$layout
+: <a class="el" href="classApp.html#a58ac598544892ff7c32890291b72635e">App</a>
+</li>
+<li>$ldelim
+: <a class="el" href="classApp.html#a59dd4b665c70e7dbd80682c014ff7145">App</a>
+</li>
+<li>$mode
+: <a class="el" href="classConversation.html#afb03d1648dbfafe62caa1e30f32f2b1a">Conversation</a>
+</li>
+<li>$module
+: <a class="el" href="classApp.html#a9bf62f8e39585c0aa48fcffc3bf3484d">App</a>
+</li>
+<li>$module_loaded
+: <a class="el" href="classApp.html#a6e4f0fbfa3cf6c11baebe22a03db6165">App</a>
+</li>
+<li>$name
+: <a class="el" href="classFriendicaSmartyEngine.html#aaba6a42101bc9ae32e36b7fa2e243f02">FriendicaSmartyEngine</a>
+, <a class="el" href="classRedFile.html#acc48c05cd5a70951cb3c615ad84f03ba">RedFile</a>
+, <a class="el" href="classTemplate.html#a6eb301a51cc94d8b94f4548fbad85eae">Template</a>
+</li>
+<li>$nav_sel
+: <a class="el" href="classApp.html#a33a8e90b60ec4438f6fbf299d0f6839c">App</a>
+</li>
+<li>$nodes
+: <a class="el" href="classTemplate.html#a8f4d17e49f42b876a97364c13fb572d1">Template</a>
+</li>
+<li>$observer
+: <a class="el" href="classApp.html#a4ffe529fb14389f7fedf5fdc5f722e7f">App</a>
+, <a class="el" href="classRedBasicAuth.html#aa75dc43b59adc98e38a98517d3fd35d1">RedBasicAuth</a>
+, <a class="el" href="classConversation.html#a8748445aa26047ebed5141f3c3cbc244">Conversation</a>
+</li>
+<li>$os_path
+: <a class="el" href="classRedDirectory.html#a3c148c07ad909985125aa4926d8d0021">RedDirectory</a>
+</li>
+<li>$owner_id
+: <a class="el" href="classRedBasicAuth.html#a09c1488a0b290f5a54dc15180c5690d7">RedBasicAuth</a>
+</li>
+<li>$owner_name
+: <a class="el" href="classItem.html#a9594df6014b0b6f45364ea7a34510130">Item</a>
+</li>
+<li>$owner_nick
+: <a class="el" href="classRedBasicAuth.html#a8d09b8d784cc810a0b3be580d05106a7">RedBasicAuth</a>
+</li>
+<li>$owner_photo
+: <a class="el" href="classItem.html#a078f95b4134ce3a1df344cf8d386f986">Item</a>
+</li>
+<li>$owner_url
+: <a class="el" href="classItem.html#afa54851df82962c7c42dea3cc9f5c92c">Item</a>
+</li>
+<li>$page
+: <a class="el" href="classApp.html#a4b67935096f66d1f14b657399a8461ac">App</a>
+</li>
+<li>$pager
+: <a class="el" href="classApp.html#a6bcb19cdc4907077da72864686d5a780">App</a>
+</li>
+<li>$parent
+: <a class="el" href="classItem.html#a1a1e42877e6ac7af50286142ceb483d2">Item</a>
+</li>
+<li>$path
+: <a class="el" href="classApp.html#acad5896b7a79ae31433ad8f89606c728">App</a>
+</li>
+<li>$perms
+: <a class="el" href="classApp.html#ab47de68fa39806d1fb0976407e188b77">App</a>
+</li>
+<li>$plugins
+: <a class="el" href="classApp.html#ae9f96338f32187d308b67b980eea0008">App</a>
+</li>
+<li>$poi
+: <a class="el" href="classApp.html#a1936f2afce0dc0d1bbed15ae1f2ee81a">App</a>
+</li>
+<li>$prepared_item
+: <a class="el" href="classConversation.html#a5b6adbb2fe24f0f53d6c22660dff91b2">Conversation</a>
+</li>
+<li>$preview
+: <a class="el" href="classConversation.html#ae9937f9e0f3d927acc2bed46cc72e9ae">Conversation</a>
+</li>
+<li>$profile
+: <a class="el" href="classApp.html#a57d041fcc003d08c127dfa99a02bc192">App</a>
+</li>
+<li>$profile_owner
+: <a class="el" href="classConversation.html#a2f12724ef0244e9049fe1bb9641b516d">Conversation</a>
+</li>
+<li>$profile_uid
+: <a class="el" href="classApp.html#a08c24d6a6fc52fcc784b0f765f13b820">App</a>
+</li>
+<li>$query_string
+: <a class="el" href="classApp.html#a2e82da4aecfc2017a8d1d332ca501f9f">App</a>
+</li>
+<li>$r
+: <a class="el" href="classTemplate.html#aac9a4638f11271e1b1dcc9f247242718">Template</a>
+</li>
+<li>$rdelim
+: <a class="el" href="classApp.html#a244b2d53b21be269aad2269d23192f95">App</a>
+</li>
+<li>$red_path
+: <a class="el" href="classRedDirectory.html#acb32b8df27538c57772824a745e751d7">RedDirectory</a>
+</li>
+<li>$redirect_url
+: <a class="el" href="classItem.html#a5b561415861f5b89b0733aacfe0428d1">Item</a>
+</li>
+<li>$replace
+: <a class="el" href="classTemplate.html#a4e86b566c3f728e95ce5db1b33665c10">Template</a>
+</li>
+<li>$root_dir
+: <a class="el" href="classRedDirectory.html#ad87c514a307ec97ba0f1372e9bcfa6a4">RedDirectory</a>
+</li>
+<li>$scheme
+: <a class="el" href="classApp.html#ad082d63acc078e5bf23825a03bdd6a76">App</a>
+</li>
+<li>$search
+: <a class="el" href="classTemplate.html#a317d535946dc065c35dd5cd38380e6c6">Template</a>
+</li>
+<li>$sourcename
+: <a class="el" href="classApp.html#a13710907ef62554a0b4dd8a5eaa2eb11">App</a>
+</li>
+<li>$stack
+: <a class="el" href="classTemplate.html#a6f0efc256688c36110180b501067ff11">Template</a>
+</li>
+<li>$strings
+: <a class="el" href="classApp.html#a5f64620473a9727a48ebe9cf6f335a98">App</a>
+</li>
+<li>$template
+: <a class="el" href="classItem.html#a7f7bc059de377319282cb4ef4a828480">Item</a>
+</li>
+<li>$template_engine_instance
+: <a class="el" href="classApp.html#a6844aedad10e201b8c3d80cfc9e876d3">App</a>
+</li>
+<li>$template_engines
+: <a class="el" href="classApp.html#a6859a4848a5c0049b4134cc4b34228b6">App</a>
+</li>
+<li>$theme
+: <a class="el" href="classApp.html#a764cc6cd7578132c21d2b4545de9301c">App</a>
+</li>
+<li>$theme_info
+: <a class="el" href="classApp.html#aeca29fd4f7192ca07369b3c598c36e67">App</a>
+</li>
+<li>$theme_thread_allow
+: <a class="el" href="classApp.html#a487332f8de40414ca1a54a4265570b70">App</a>
+</li>
+<li>$threaded
+: <a class="el" href="classItem.html#a1cb6aa8abdf7ea7daca647e40c8ea3a2">Item</a>
+</li>
+<li>$threads
+: <a class="el" href="classConversation.html#a41f4a549e6a99f98935c4742addd22c8">Conversation</a>
+</li>
+<li>$timezone
+: <a class="el" href="classApp.html#ab35b01a366a2ea95725e97af278f87ab">App</a>
+</li>
+<li>$toplevel
+: <a class="el" href="classItem.html#a5cfa6cf964f433a917a81cab079ff9d8">Item</a>
+</li>
+<li>$type
+: <a class="el" href="classphoto__driver.html#a4920ed7cbb1ac735ac84153067537f03">photo_driver</a>
+</li>
+<li>$types
+: <a class="el" href="classphoto__driver.html#a00cb166c00b7502dbc456c94330e5b03">photo_driver</a>
+</li>
+<li>$user
+: <a class="el" href="classApp.html#a91fd3c8b89016113b05f3be24805ccff">App</a>
+</li>
+<li>$valid
+: <a class="el" href="classphoto__driver.html#a01d28d43b404d6f6de219dc9c5069dc9">photo_driver</a>
+</li>
+<li>$videoheight
+: <a class="el" href="classApp.html#a56b1a432c96aef8b1971f779c9d93c8c">App</a>
+</li>
+<li>$videowidth
+: <a class="el" href="classApp.html#adf2aaf95b062736a6fd5fc70fadf80e8">App</a>
+</li>
+<li>$visiting
+: <a class="el" href="classItem.html#a4a123ae98987c1e30ecb15c4edf5a3b8">Item</a>
+</li>
+<li>$wall_to_wall
+: <a class="el" href="classItem.html#a5d29ddecc073151a65a8e2ea2f6e4189">Item</a>
+</li>
+<li>$widgetlist
+: <a class="el" href="classApp.html#a4833bee2eae4ad1691a04fa19e11a766">App</a>
+</li>
+<li>$widgets
+: <a class="el" href="classApp.html#aa5a87c46ab3fee21362c466bf78042ef">App</a>
+</li>
+<li>$width
+: <a class="el" href="classphoto__driver.html#a3e4215890f4a4894bf3799a7d2e0c0b1">photo_driver</a>
+</li>
+<li>$writable
+: <a class="el" href="classConversation.html#ae81221251307e315f566a11f921ce0a9">Conversation</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals.html b/doc/html/globals.html
new file mode 100644
index 000000000..85e38e7d5
--- /dev/null
+++ b/doc/html/globals.html
@@ -0,0 +1,341 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li class="current"><a href="globals.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="globals_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all file members with links to the files they belong to:</div>
+
+<h3><a class="anchor" id="index_0x24"></a>- $ -</h3><ul>
+<li>$a
+: <a class="el" href="typo_8php.html#acebf83966ef6d7e5645a6b62ba368f9f">typo.php</a>
+</li>
+<li>$API
+: <a class="el" href="include_2api_8php.html#aeb2e7ad00ea666b4b6dfcf82008194f8">api.php</a>
+</li>
+<li>$arr
+: <a class="el" href="extract_8php.html#a63bb4c41bc532baacf6a4976cfaa0feb">extract.php</a>
+</li>
+<li>$aside
+: <a class="el" href="minimalisticdarkness_8php.html#a6e5d97615c6faef5dbffe04b8024ceaf">minimalisticdarkness.php</a>
+</li>
+<li>$background_image
+: <a class="el" href="redbasic_2php_2style_8php.html#a339624aeef6604a2f00209a3962c6e1c">style.php</a>
+</li>
+<li>$banner_colour
+: <a class="el" href="redbasic_2php_2style_8php.html#ae587aa6949ab6e4aa77a591e60f67ee0">style.php</a>
+</li>
+<li>$bgcolour
+: <a class="el" href="redbasic_2php_2style_8php.html#a0bdce350cf14bac44976e786d1be6574">style.php</a>
+</li>
+<li>$body_font_size
+: <a class="el" href="redbasic_2php_2style_8php.html#ad78cb8a1793834626d73aca22a1501f8">style.php</a>
+</li>
+<li>$bodyclass
+: <a class="el" href="theme_2blogga_2php_2default_8php.html#a720581ae288aa09511670563e4205a4a">default.php</a>
+</li>
+<li>$called_api
+: <a class="el" href="include_2api_8php.html#aa62b15a6bbb280e86b98132eb214013d">api.php</a>
+</li>
+<li>$channel
+: <a class="el" href="php_2theme__init_8php.html#a54f32c086fe209c99769a4c4047dd864">theme_init.php</a>
+</li>
+<li>$comment_indent
+: <a class="el" href="redbasic_2php_2style_8php.html#a5bff5012c56e34da6b3b2ed475726b27">style.php</a>
+</li>
+<li>$converse_width
+: <a class="el" href="redbasic_2php_2style_8php.html#a0cb037986e32302685d4f580dedd6473">style.php</a>
+</li>
+<li>$dir
+: <a class="el" href="docblox__errorchecker_8php.html#a1659f0a629d408e0f849dbe4ee061e62">docblox_errorchecker.php</a>
+</li>
+<li>$dirs
+: <a class="el" href="typo_8php.html#a1b709c1d79631ebc8320b41bda028b54">typo.php</a>
+</li>
+<li>$dirstack
+: <a class="el" href="docblox__errorchecker_8php.html#ab66bc0493d25f39bf8b4dcbb429f04e6">docblox_errorchecker.php</a>
+</li>
+<li>$filelist
+: <a class="el" href="docblox__errorchecker_8php.html#a648a570b0f9f6e0e51b7267647c4b09b">docblox_errorchecker.php</a>
+</li>
+<li>$files
+: <a class="el" href="extract_8php.html#a9590b15215a21e9b42eb546aeef79704">extract.php</a>
+, <a class="el" href="tpldebug_8php.html#a5358407d65f2ca826f96356a6642d149">tpldebug.php</a>
+, <a class="el" href="typo_8php.html#a9590b15215a21e9b42eb546aeef79704">typo.php</a>
+</li>
+<li>$font_colour
+: <a class="el" href="redbasic_2php_2style_8php.html#a68e3ff836ec87ae1370c9f4a12c21c6b">style.php</a>
+</li>
+<li>$font_size
+: <a class="el" href="redbasic_2php_2style_8php.html#afcbcf57d0b90d2e4226c2e8a1171befc">style.php</a>
+</li>
+<li>$gc_probability
+: <a class="el" href="session_8php.html#a96b09cc763572f45280786a7b33feb7e">session.php</a>
+</li>
+<li>$headimg
+: <a class="el" href="theme_2blogga_2php_2default_8php.html#ac7062908d1eb80c0735270f7997c4527">default.php</a>
+</li>
+<li>$headimghome
+: <a class="el" href="theme_2blogga_2php_2default_8php.html#a1230ab83d4ec9785d8f3a966f33dc5f3">default.php</a>
+</li>
+<li>$i
+: <a class="el" href="docblox__errorchecker_8php.html#a83018d9153d17d91fbcf3bc10158d34f">docblox_errorchecker.php</a>
+</li>
+<li>$infile
+: <a class="el" href="php2po_8php.html#a61f8ddeb5557d46ebc546cc355bda214">php2po.php</a>
+</li>
+<li>$ink
+: <a class="el" href="php2po_8php.html#a6b0b8ebd9ce811d1325ef2c129443bc0">php2po.php</a>
+</li>
+<li>$install_wizard_pass
+: <a class="el" href="setup_8php.html#addb24714bc2542aa4f4215e98fe48432">setup.php</a>
+</li>
+<li>$item_colour
+: <a class="el" href="redbasic_2php_2style_8php.html#a27cb59bbc750341f448cd0c298a7ea16">style.php</a>
+</li>
+<li>$item_opacity
+: <a class="el" href="redbasic_2php_2style_8php.html#a136b0a2cdeb37f3fa506d28f82dcdbf8">style.php</a>
+</li>
+<li>$itemfloat
+: <a class="el" href="minimalisticdarkness_8php.html#a7e6c3d4efde4e9a2de32308081372c6b">minimalisticdarkness.php</a>
+</li>
+<li>$k
+: <a class="el" href="php2po_8php.html#ad6726cfaa85d4b8299d2b0f034cbf178">php2po.php</a>
+</li>
+<li>$minwidth
+: <a class="el" href="minimalisticdarkness_8php.html#a70bb13be8f23ec47839da81e0796f1cb">minimalisticdarkness.php</a>
+</li>
+<li>$nav_colour
+: <a class="el" href="redbasic_2php_2style_8php.html#a8fdd5874587a9ad86fb05ed0be265649">style.php</a>
+</li>
+<li>$nav_min_opacity
+: <a class="el" href="redbasic_2php_2style_8php.html#ab5ec5703848e0132f8a8f3d3a53a58e1">style.php</a>
+</li>
+<li>$nav_percent_min_opacity
+: <a class="el" href="redbasic_2php_2style_8php.html#a01c151bf47f7da2b979aaa4cb868da4c">style.php</a>
+</li>
+<li>$needed
+: <a class="el" href="docblox__errorchecker_8php.html#a852004caba0a34390297a079f4aaac73">docblox_errorchecker.php</a>
+</li>
+<li>$out
+: <a class="el" href="php2po_8php.html#a48cb304902320d173a4eaa41543327b9">php2po.php</a>
+</li>
+<li>$phpath
+: <a class="el" href="typo_8php.html#a3ecd17ac846be1b35f3662f5c12ab6bd">typo.php</a>
+</li>
+<li>$phpfile
+: <a class="el" href="php2po_8php.html#abbb0e5fd8fbc1f13a9bf68f86eb3d2a4">php2po.php</a>
+</li>
+<li>$plugin
+: <a class="el" href="post__to__red_8php.html#ada8a7130088351710bb02ed622d6bf65">post_to_red.php</a>
+</li>
+<li>$plugin_dir
+: <a class="el" href="post__to__red_8php.html#a99811555b30bde504a863e44015f2f19">post_to_red.php</a>
+</li>
+<li>$pmenu_reply
+: <a class="el" href="redbasic_2php_2style_8php.html#a9b489f1c595b867212d30eca0c85b38c">style.php</a>
+</li>
+<li>$pmenu_top
+: <a class="el" href="redbasic_2php_2style_8php.html#ac98bd8264411bd207a5740d08e81a158">style.php</a>
+</li>
+<li>$pofile
+: <a class="el" href="php2po_8php.html#a401d84ce156e49e8168bd0c4781e1be1">php2po.php</a>
+</li>
+<li>$radius
+: <a class="el" href="redbasic_2php_2style_8php.html#a6502bedd57105ad1fb2dee2be9cf6351">style.php</a>
+</li>
+<li>$reply_photo
+: <a class="el" href="redbasic_2php_2style_8php.html#a0b070f2c9140a7a12a0b1f88601a29e4">style.php</a>
+</li>
+<li>$res
+: <a class="el" href="docblox__errorchecker_8php.html#a49a8a4009b02e49717caa88b128affc5">docblox_errorchecker.php</a>
+</li>
+<li>$s
+: <a class="el" href="extract_8php.html#a50b05cf2e02ef0b67fcad97106dd7634">extract.php</a>
+</li>
+<li>$schema
+: <a class="el" href="redbasic_2php_2style_8php.html#a83022b1d70799d2bde3d64dca9cb40ee">style.php</a>
+</li>
+<li>$sectionleft
+: <a class="el" href="minimalisticdarkness_8php.html#a0ac3f5b52212b0af87d513273da03ead">minimalisticdarkness.php</a>
+</li>
+<li>$sectionwidth
+: <a class="el" href="minimalisticdarkness_8php.html#a04de7b747e4f0a353e0e38cf77c3404f">minimalisticdarkness.php</a>
+</li>
+<li>$session_exists
+: <a class="el" href="session_8php.html#a62e4a6cb26b4bb1b8ddd8277b26090eb">session.php</a>
+</li>
+<li>$session_expire
+: <a class="el" href="session_8php.html#af0100a2642a5268594bbd5742a03d885">session.php</a>
+</li>
+<li>$shadow
+: <a class="el" href="redbasic_2php_2style_8php.html#ab00dfc29448b183055d2ae61a0e1874a">style.php</a>
+</li>
+<li>$sloppy_photos
+: <a class="el" href="redbasic_2php_2style_8php.html#a6ffadaf926b41ad84c30da319011e9ad">style.php</a>
+</li>
+<li>$str
+: <a class="el" href="typohelper_8php.html#a7542d95618011800c61773127fa625cf">typohelper.php</a>
+</li>
+<li>$toolicon_activecolour
+: <a class="el" href="redbasic_2php_2style_8php.html#acfd00ec469ca3c5e8bfac787573093f3">style.php</a>
+</li>
+<li>$toolicon_colour
+: <a class="el" href="redbasic_2php_2style_8php.html#a4161f6b8aa923f67e53f54dfb6554cdb">style.php</a>
+</li>
+<li>$top_photo
+: <a class="el" href="redbasic_2php_2style_8php.html#a810142b4bdd35a1d377ab279b02b47eb">style.php</a>
+</li>
+<li>$uid
+: <a class="el" href="redbasic_2php_2style_8php.html#a109bbd7f4add27541707b191b73ef84a">style.php</a>
+</li>
+<li>$width
+: <a class="el" href="minimalisticdarkness_8php.html#a5795120b4b324bc4ca83f1e6fdce7d57">minimalisticdarkness.php</a>
+</li>
+<li>$wwtop
+: <a class="el" href="redbasic_2php_2style_8php.html#a61891d0d3e6894f52410d507b04e565d">style.php</a>
+</li>
+<li>$zones
+: <a class="el" href="extract_8php.html#a0cbe524ffc9a496114fd7ba9f423ef44">extract.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_0x5f.html b/doc/html/globals_0x5f.html
new file mode 100644
index 000000000..ab0af6a66
--- /dev/null
+++ b/doc/html/globals_0x5f.html
@@ -0,0 +1,153 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals.html#index_0x24"><span>$</span></a></li>
+ <li class="current"><a href="globals_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="globals_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_0x5f.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all file members with links to the files they belong to:</div>
+
+<h3><a class="anchor" id="index__"></a>- _ -</h3><ul>
+<li>_well_known_init()
+: <a class="el" href="__well__known_8php.html#a6ebfa937a2024f0b5dab53f0ac90fed0">_well_known.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_0x61.html b/doc/html/globals_0x61.html
new file mode 100644
index 000000000..41dce38c8
--- /dev/null
+++ b/doc/html/globals_0x61.html
@@ -0,0 +1,633 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_0x5f.html#index__"><span>_</span></a></li>
+ <li class="current"><a href="globals_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_0x61.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all file members with links to the files they belong to:</div>
+
+<h3><a class="anchor" id="index_a"></a>- a -</h3><ul>
+<li>abook_connections()
+: <a class="el" href="Contact_8php.html#ae8803c330352cbf1e828eb7490edf47e">Contact.php</a>
+</li>
+<li>ABOOK_FLAG_ARCHIVED
+: <a class="el" href="boot_8php.html#a222395aa223cfbff6166fab0b4e2e1d5">boot.php</a>
+</li>
+<li>ABOOK_FLAG_BLOCKED
+: <a class="el" href="boot_8php.html#a52b599cd13e152ebc80d7e4413683195">boot.php</a>
+</li>
+<li>ABOOK_FLAG_HIDDEN
+: <a class="el" href="boot_8php.html#a34c756469ebed32e2fc987bcde62d382">boot.php</a>
+</li>
+<li>ABOOK_FLAG_IGNORED
+: <a class="el" href="boot_8php.html#aa3425e2de85b08f7041656d3a8502cb6">boot.php</a>
+</li>
+<li>ABOOK_FLAG_PENDING
+: <a class="el" href="boot_8php.html#a68eebe493e6f729ffd1aeda7a4b11155">boot.php</a>
+</li>
+<li>ABOOK_FLAG_SELF
+: <a class="el" href="boot_8php.html#a0450389f24c632906fbc24347700a543">boot.php</a>
+</li>
+<li>abook_self()
+: <a class="el" href="Contact_8php.html#ad5b02c2a962ee55b1b7ca6c159d6e4c5">Contact.php</a>
+</li>
+<li>abook_toggle_flag()
+: <a class="el" href="Contact_8php.html#a024919623a830e8703ac4f23496dd66c">Contact.php</a>
+</li>
+<li>absurl()
+: <a class="el" href="boot_8php.html#a081307d681d7d04f17b9ced2076e7c85">boot.php</a>
+</li>
+<li>ACCESS_FREE
+: <a class="el" href="boot_8php.html#afbb1fe1b2c8c730ec8e08da93b6512c4">boot.php</a>
+</li>
+<li>ACCESS_PAID
+: <a class="el" href="boot_8php.html#a9c80420e5a063a4a87ce4831f086134d">boot.php</a>
+</li>
+<li>ACCESS_PRIVATE
+: <a class="el" href="boot_8php.html#a7f3474fec541e261fc8dff47313c4017">boot.php</a>
+</li>
+<li>ACCESS_TIERED
+: <a class="el" href="boot_8php.html#aeb1039302affcbe7e8872c01c08c88f8">boot.php</a>
+</li>
+<li>ACCESS_TOKEN_DURATION
+: <a class="el" href="oauth_8php.html#ad343cab37aa860d2d14dc86b7f5ca0c6">oauth.php</a>
+</li>
+<li>ACCOUNT_BLOCKED
+: <a class="el" href="boot_8php.html#af3bdfc20979c16f15bb9c60446a480f9">boot.php</a>
+</li>
+<li>ACCOUNT_EXPIRED
+: <a class="el" href="boot_8php.html#a400519fa181591cd6fdbb8f25fbcba0a">boot.php</a>
+</li>
+<li>ACCOUNT_OK
+: <a class="el" href="boot_8php.html#a84057c5bfa1bca5fba8497fe005ee4d8">boot.php</a>
+</li>
+<li>ACCOUNT_PENDING
+: <a class="el" href="boot_8php.html#a032bbd6d0321e99e9117332c9ed2b1b8">boot.php</a>
+</li>
+<li>account_remove()
+: <a class="el" href="Contact_8php.html#a6e64de7db60b7243dce45fb6347636ff">Contact.php</a>
+</li>
+<li>ACCOUNT_REMOVED
+: <a class="el" href="boot_8php.html#ab5ddbe69d3d03acd06e1fb281488cb78">boot.php</a>
+</li>
+<li>ACCOUNT_ROLE_ADMIN
+: <a class="el" href="boot_8php.html#ac8400313df2c831653f9036f71ebd86d">boot.php</a>
+</li>
+<li>ACCOUNT_ROLE_ALLOWCODE
+: <a class="el" href="boot_8php.html#a84f48897059bbd4a8738d7ee4cec6688">boot.php</a>
+</li>
+<li>ACCOUNT_ROLE_SYSTEM
+: <a class="el" href="boot_8php.html#a7c2eb822d50e1554bf5c32861f36342b">boot.php</a>
+</li>
+<li>account_total()
+: <a class="el" href="account_8php.html#a43e3042b2723d76915a030bac3c668b6">account.php</a>
+</li>
+<li>ACCOUNT_UNVERIFIED
+: <a class="el" href="boot_8php.html#af3a4271630aabd8be592213f925d6a36">boot.php</a>
+</li>
+<li>account_verify_password()
+: <a class="el" href="auth_8php.html#a07bae0e623e2daa9ee2cd5a8aa294dee">auth.php</a>
+</li>
+<li>achievements_content()
+: <a class="el" href="achievements_8php.html#a35ae04ada0e227d19671f289a32fb30e">achievements.php</a>
+</li>
+<li>acl_init()
+: <a class="el" href="acl_8php.html#ac6776dba871806ecdb5d1659bc2eb07a">acl.php</a>
+</li>
+<li>ACTIVITY_DISLIKE
+: <a class="el" href="boot_8php.html#a0e57f846e6d47a308feced0f7274f178">boot.php</a>
+</li>
+<li>ACTIVITY_FAVORITE
+: <a class="el" href="boot_8php.html#a3e2ea123d29a72012db1241f96280b0e">boot.php</a>
+</li>
+<li>ACTIVITY_FOLLOW
+: <a class="el" href="boot_8php.html#a5ae728ac966ea1d3525a19e7fec59434">boot.php</a>
+</li>
+<li>ACTIVITY_FRIEND
+: <a class="el" href="boot_8php.html#a176664e78dcb9132e16be69418223eb2">boot.php</a>
+</li>
+<li>ACTIVITY_JOIN
+: <a class="el" href="boot_8php.html#aced60c7285192e80b7c4757e45a7f1e3">boot.php</a>
+</li>
+<li>ACTIVITY_LIKE
+: <a class="el" href="boot_8php.html#abdcdfc873ace4e0902177bad934de0c0">boot.php</a>
+</li>
+<li>activity_match()
+: <a class="el" href="text_8php.html#af8a3e3a66a7b862d4510f145d2e13186">text.php</a>
+</li>
+<li>ACTIVITY_MOOD
+: <a class="el" href="boot_8php.html#a7aa57438db03834aaa0b468bdce773a6">boot.php</a>
+</li>
+<li>ACTIVITY_OBJ_ALBUM
+: <a class="el" href="boot_8php.html#aaf9b76832ee5f85e56466af162ba8a14">boot.php</a>
+</li>
+<li>ACTIVITY_OBJ_COMMENT
+: <a class="el" href="boot_8php.html#a0a98dd0110dc6c8e24cefc8ae74d5562">boot.php</a>
+</li>
+<li>ACTIVITY_OBJ_EVENT
+: <a class="el" href="boot_8php.html#a2e90096fede6acce16abf0da8cb2febe">boot.php</a>
+</li>
+<li>ACTIVITY_OBJ_GROUP
+: <a class="el" href="boot_8php.html#a7bff2278e68a71e524afd1c7c951e1e3">boot.php</a>
+</li>
+<li>ACTIVITY_OBJ_HEART
+: <a class="el" href="boot_8php.html#ad302cb26b838898d475f57f61b0fcc9f">boot.php</a>
+</li>
+<li>ACTIVITY_OBJ_NOTE
+: <a class="el" href="boot_8php.html#a44d069c8a1cfcc6d2007c506a17ff28f">boot.php</a>
+</li>
+<li>ACTIVITY_OBJ_P_PHOTO
+: <a class="el" href="boot_8php.html#a74bf27f7564c9a37975e7b37d973dcab">boot.php</a>
+</li>
+<li>ACTIVITY_OBJ_PERSON
+: <a class="el" href="boot_8php.html#a2f8f25b13480c37a5f22511f53da8bab">boot.php</a>
+</li>
+<li>ACTIVITY_OBJ_PHOTO
+: <a class="el" href="boot_8php.html#a774f0f792ebfec1e774c5a17bb9d5966">boot.php</a>
+</li>
+<li>ACTIVITY_OBJ_PROFILE
+: <a class="el" href="boot_8php.html#a62c832a95e38b1fa23e6cef39521b7d5">boot.php</a>
+</li>
+<li>ACTIVITY_OBJ_TAGTERM
+: <a class="el" href="boot_8php.html#a1da180f961f49a11573cac4ff6c62c05">boot.php</a>
+</li>
+<li>ACTIVITY_OBJ_THING
+: <a class="el" href="boot_8php.html#a0fb63e51c2a9814941842ae8f2f4dff8">boot.php</a>
+</li>
+<li>ACTIVITY_POKE
+: <a class="el" href="boot_8php.html#a14ba8f9e162f2559831ee3bf98e0c3bd">boot.php</a>
+</li>
+<li>ACTIVITY_POST
+: <a class="el" href="boot_8php.html#a5c3747e0f505f0d5271dc4c54e3feaf4">boot.php</a>
+</li>
+<li>ACTIVITY_REQ_FRIEND
+: <a class="el" href="boot_8php.html#afe084c30a1810c10442edb4fbcbc0086">boot.php</a>
+</li>
+<li>activity_sanitise()
+: <a class="el" href="items_8php.html#a36e656667193c83aa2cc03a024fc131b">items.php</a>
+</li>
+<li>ACTIVITY_TAG
+: <a class="el" href="boot_8php.html#a12c781cefc20167231e2e3fd5866b1b5">boot.php</a>
+</li>
+<li>ACTIVITY_UNFOLLOW
+: <a class="el" href="boot_8php.html#a53e4bdb6f225da55115acb9277f75e53">boot.php</a>
+</li>
+<li>ACTIVITY_UNFRIEND
+: <a class="el" href="boot_8php.html#a29528a2544373cc19a378f350040c6a1">boot.php</a>
+</li>
+<li>ACTIVITY_UPDATE
+: <a class="el" href="boot_8php.html#a7f4264232dbb6c3b41f2617deecb1866">boot.php</a>
+</li>
+<li>add_children_to_list()
+: <a class="el" href="conversation_8php.html#ad3e1d4b15e7d6d026ee182edd58f692b">conversation.php</a>
+</li>
+<li>admin_content()
+: <a class="el" href="admin_8php.html#afef415e4011607fbb665610441595015">admin.php</a>
+</li>
+<li>admin_page_dbsync()
+: <a class="el" href="admin_8php.html#aaa6addf2dbc3f3fcf99244a56b41eade">admin.php</a>
+</li>
+<li>admin_page_hubloc()
+: <a class="el" href="admin_8php.html#a6943543f3138f6ee182cb701f415d1cc">admin.php</a>
+</li>
+<li>admin_page_hubloc_post()
+: <a class="el" href="admin_8php.html#a60ba9783ad14545814919970bc3fb725">admin.php</a>
+</li>
+<li>admin_page_logs()
+: <a class="el" href="admin_8php.html#a1d1362698af14d209aa3a0fb655551dd">admin.php</a>
+</li>
+<li>admin_page_logs_post()
+: <a class="el" href="admin_8php.html#a233b7c8c31776b7020532003c6e44e1c">admin.php</a>
+</li>
+<li>admin_page_plugins()
+: <a class="el" href="admin_8php.html#a54128076986ba80c4a103de3fc3e19a8">admin.php</a>
+</li>
+<li>admin_page_site()
+: <a class="el" href="admin_8php.html#ac0f3bd12431c056aad77bac9d09fa30e">admin.php</a>
+</li>
+<li>admin_page_site_post()
+: <a class="el" href="admin_8php.html#add865f4ae806ecbf716f423fc3e50e4f">admin.php</a>
+</li>
+<li>admin_page_summary()
+: <a class="el" href="admin_8php.html#ac6e95b920b5abd030cc522964987087a">admin.php</a>
+</li>
+<li>admin_page_themes()
+: <a class="el" href="admin_8php.html#af124619fdc278fe2bf14c45ddaa260fb">admin.php</a>
+</li>
+<li>admin_page_users()
+: <a class="el" href="admin_8php.html#a62f10f90c47686c9c3c37c4c03a108d2">admin.php</a>
+</li>
+<li>admin_page_users_post()
+: <a class="el" href="admin_8php.html#a5a696706a3869800e65fb365214241b7">admin.php</a>
+</li>
+<li>admin_post()
+: <a class="el" href="admin_8php.html#acf51f5837a7427832144c2bf7308ada3">admin.php</a>
+</li>
+<li>advanced_profile()
+: <a class="el" href="identity_8php.html#aa870d2c1f558cfd52bef05bc124e8fa4">identity.php</a>
+</li>
+<li>AES256CBC_decrypt()
+: <a class="el" href="crypto_8php.html#ac852ee41392d1358c3a54d54935e0bf9">crypto.php</a>
+</li>
+<li>AES256CBC_encrypt()
+: <a class="el" href="crypto_8php.html#a5c61821d205f95f127114159cbffa764">crypto.php</a>
+</li>
+<li>aes_encapsulate()
+: <a class="el" href="crypto_8php.html#a2148d7aac7b30c720f7ebda7e9790286">crypto.php</a>
+</li>
+<li>aes_unencapsulate()
+: <a class="el" href="crypto_8php.html#aca7c3a574bfb6c6ef1f2403a56823914">crypto.php</a>
+</li>
+<li>age()
+: <a class="el" href="datetime_8php.html#abc1652f96799cec6fce8797ba2ebc2df">datetime.php</a>
+</li>
+<li>all_friends()
+: <a class="el" href="socgraph_8php.html#a16ac51c505d72987ed8d6d6aed0e8586">socgraph.php</a>
+</li>
+<li>allowed_email()
+: <a class="el" href="include_2network_8php.html#aba38458a2ff2d92d3536488dbb119694">network.php</a>
+</li>
+<li>allowed_public_recips()
+: <a class="el" href="zot_8php.html#a703f528ade8382cf374e4119bd6f7859">zot.php</a>
+</li>
+<li>allowed_url()
+: <a class="el" href="include_2network_8php.html#aee35d9ad6b3f872bfb39ba3598936aa7">network.php</a>
+</li>
+<li>alt_pager()
+: <a class="el" href="text_8php.html#a75c243e06341ec16bd5a44b9b1cacd85">text.php</a>
+</li>
+<li>api_account_logout()
+: <a class="el" href="include_2api_8php.html#a2e94eab9d6c164bfef7a1b2ab87b339b">api.php</a>
+</li>
+<li>api_account_rate_limit_status()
+: <a class="el" href="include_2api_8php.html#ae8f5863e18d69421005c71441c9d99a5">api.php</a>
+</li>
+<li>api_account_verify_credentials()
+: <a class="el" href="include_2api_8php.html#a864191bb876a515ed71b17e260ef35ad">api.php</a>
+</li>
+<li>api_albums()
+: <a class="el" href="include_2api_8php.html#aa9dc5350b26d6c7727d6c4b641ecba18">api.php</a>
+</li>
+<li>api_apply_template()
+: <a class="el" href="include_2api_8php.html#a5990101034e7abf6404feba3cd273629">api.php</a>
+</li>
+<li>api_call()
+: <a class="el" href="include_2api_8php.html#a176c448d79c211ad41c2bbe3124658f5">api.php</a>
+</li>
+<li>api_channel_stream()
+: <a class="el" href="include_2api_8php.html#a72bfecac1970bc29b853073e816388ff">api.php</a>
+</li>
+<li>api_content()
+: <a class="el" href="mod_2api_8php.html#a33315b5bbf5418f6850b2038107b526d">api.php</a>
+</li>
+<li>api_date()
+: <a class="el" href="include_2api_8php.html#aea2dda92a155f2843a0ca188d8dfdf25">api.php</a>
+</li>
+<li>api_direct_messages_all()
+: <a class="el" href="include_2api_8php.html#a970b02c06dea8b229aa3d5fff9cf4705">api.php</a>
+</li>
+<li>api_direct_messages_box()
+: <a class="el" href="include_2api_8php.html#a7759ccddc8dff012ad168e511ffe5af5">api.php</a>
+</li>
+<li>api_direct_messages_conversation()
+: <a class="el" href="include_2api_8php.html#a9160288b7ac220635942d8dc209b78c3">api.php</a>
+</li>
+<li>api_direct_messages_inbox()
+: <a class="el" href="include_2api_8php.html#ad2b0192f3006918bea895de8074bf8d2">api.php</a>
+</li>
+<li>api_direct_messages_new()
+: <a class="el" href="include_2api_8php.html#a0991f72554f821255397d615e76f3203">api.php</a>
+</li>
+<li>api_direct_messages_sentbox()
+: <a class="el" href="include_2api_8php.html#a58cf4c02ef435996f5c3bc4283d3968d">api.php</a>
+</li>
+<li>api_export_basic()
+: <a class="el" href="include_2api_8php.html#adfc035ee6303c1d8ba5336a4ead2bd53">api.php</a>
+</li>
+<li>api_favorites()
+: <a class="el" href="include_2api_8php.html#a2c71b1226ef1283b5370bd1c200fee5f">api.php</a>
+</li>
+<li>api_ff_ids()
+: <a class="el" href="include_2api_8php.html#a36344c80b8e9755da2f2dd3a0e28cce8">api.php</a>
+</li>
+<li>api_followers_ids()
+: <a class="el" href="include_2api_8php.html#ab1ecb58954f722444bfe03233345cb1b">api.php</a>
+</li>
+<li>api_format_as()
+: <a class="el" href="include_2api_8php.html#a18cab7c6391df5c421753463f5d2a879">api.php</a>
+</li>
+<li>api_format_items()
+: <a class="el" href="include_2api_8php.html#a4c6fb9fb5203aa60f4b3afd4521db8ea">api.php</a>
+</li>
+<li>api_format_messages()
+: <a class="el" href="include_2api_8php.html#ae82608c317421f27446465aa6724733d">api.php</a>
+</li>
+<li>api_friendica_version()
+: <a class="el" href="include_2api_8php.html#a53b0680b682ae6078f2e1ed18cfb3f74">api.php</a>
+</li>
+<li>api_friends_ids()
+: <a class="el" href="include_2api_8php.html#acafd2899309a005fcb725289173dc7fe">api.php</a>
+</li>
+<li>api_get_user()
+: <a class="el" href="include_2api_8php.html#aa40bae797bcd9ccacffdce5a3b5a1afa">api.php</a>
+</li>
+<li>api_help_test()
+: <a class="el" href="include_2api_8php.html#ac5a64cc81d70ff3cf866093ea9721d23">api.php</a>
+</li>
+<li>api_item_get_user()
+: <a class="el" href="include_2api_8php.html#aa49741342ad8ba285737eea1209a37e1">api.php</a>
+</li>
+<li>api_login()
+: <a class="el" href="include_2api_8php.html#afe534f826e4282b72d66e8cadca7bb73">api.php</a>
+</li>
+<li>api_oauth_access_token()
+: <a class="el" href="include_2api_8php.html#aff322705cc6084b329003fc8eab0aad0">api.php</a>
+</li>
+<li>api_oauth_request_token()
+: <a class="el" href="include_2api_8php.html#aa1bddb580510e70cc1a7b7381667f1a3">api.php</a>
+</li>
+<li>api_photos()
+: <a class="el" href="include_2api_8php.html#aa6fc3bc8c0fad1d081db0dcc456dd77f">api.php</a>
+</li>
+<li>api_post()
+: <a class="el" href="mod_2api_8php.html#a6fe77f05c07cb51048df0d557b4b9bd2">api.php</a>
+</li>
+<li>api_register_func()
+: <a class="el" href="include_2api_8php.html#ac2c2b18c426d697d11a830bca146be8a">api.php</a>
+</li>
+<li>api_rss_extra()
+: <a class="el" href="include_2api_8php.html#a6a04b48168ba1d9dd2de3081a630611f">api.php</a>
+</li>
+<li>api_status_show()
+: <a class="el" href="include_2api_8php.html#a645397787618b5c548a31e8686e8cca4">api.php</a>
+</li>
+<li>api_statuses_destroy()
+: <a class="el" href="include_2api_8php.html#ad4c29f43418f6110f85a6b3998239ab4">api.php</a>
+</li>
+<li>api_statuses_f()
+: <a class="el" href="include_2api_8php.html#aa0d6b29fff0344a8e67f3507a6d01410">api.php</a>
+</li>
+<li>api_statuses_followers()
+: <a class="el" href="include_2api_8php.html#a6951c690d87775eb37e569c66011988e">api.php</a>
+</li>
+<li>api_statuses_friends()
+: <a class="el" href="include_2api_8php.html#ade742525b2e41c82b090799ef3c51d5e">api.php</a>
+</li>
+<li>api_statuses_home_timeline()
+: <a class="el" href="include_2api_8php.html#a528d8070ee74ea800102936ce73cf366">api.php</a>
+</li>
+<li>api_statuses_mediap()
+: <a class="el" href="include_2api_8php.html#a450d8732b7b608f7ac929aee61572b95">api.php</a>
+</li>
+<li>api_statuses_mentions()
+: <a class="el" href="include_2api_8php.html#a8b25a186bd0893f51aa72a62f655735e">api.php</a>
+</li>
+<li>api_statuses_public_timeline()
+: <a class="el" href="include_2api_8php.html#ad24ce1bf20867add4c9211a8eaf93f22">api.php</a>
+</li>
+<li>api_statuses_repeat()
+: <a class="el" href="include_2api_8php.html#ae0fa388479cace9c5a7a45b571ab42f8">api.php</a>
+</li>
+<li>api_statuses_show()
+: <a class="el" href="include_2api_8php.html#af6f1d89cdb0a0621025efbec1597bc63">api.php</a>
+</li>
+<li>api_statuses_update()
+: <a class="el" href="include_2api_8php.html#ad4d1634df6b35126552324683caaffa2">api.php</a>
+</li>
+<li>api_statuses_user_timeline()
+: <a class="el" href="include_2api_8php.html#a32f0dda848d0c11c727fe1c3e741c283">api.php</a>
+</li>
+<li>api_statusnet_config()
+: <a class="el" href="include_2api_8php.html#a623793229a7256dd31bcfd5ab90eef08">api.php</a>
+</li>
+<li>api_statusnet_version()
+: <a class="el" href="include_2api_8php.html#a8969e8d9c683f12ba17dcd4b059e020d">api.php</a>
+</li>
+<li>api_user()
+: <a class="el" href="include_2api_8php.html#afb99daa6b731bf497b81f2128084852c">api.php</a>
+</li>
+<li>api_users_show()
+: <a class="el" href="include_2api_8php.html#abe8e929e93f7ab134b1cb1fb30f19a76">api.php</a>
+</li>
+<li>appdirpath()
+: <a class="el" href="boot_8php.html#a75a90b0eadd0df510f7e63210733634d">boot.php</a>
+</li>
+<li>apps_content()
+: <a class="el" href="apps_8php.html#a546016cb960d0b110ee8e489dfa6c27c">apps.php</a>
+</li>
+<li>apw_form()
+: <a class="el" href="view_2theme_2apw_2php_2config_8php.html#a8b51951a70e1c1324be71345a61d70ec">config.php</a>
+</li>
+<li>apw_init()
+: <a class="el" href="apw_2php_2theme_8php.html#a42167c539043a39a6b83c252d05f1e89">theme.php</a>
+</li>
+<li>argc()
+: <a class="el" href="boot_8php.html#abc0a90a1a77f5b668aa7e4b57d1776a7">boot.php</a>
+</li>
+<li>argv()
+: <a class="el" href="boot_8php.html#a768f00b7d66be0daf7ef4eea2e862006">boot.php</a>
+</li>
+<li>arr_add_hashes()
+: <a class="el" href="parse__url_8php.html#aa7dd8f961bea042d62726ed909e4a868">parse_url.php</a>
+</li>
+<li>array_sanitise()
+: <a class="el" href="items_8php.html#abf7a1b73eb352d79acd36309b0dababd">items.php</a>
+</li>
+<li>array_xmlify()
+: <a class="el" href="text_8php.html#acedb584f65114a33f389efb796172a91">text.php</a>
+</li>
+<li>atom_author()
+: <a class="el" href="items_8php.html#a016dd86c827d08db89061ea81d15c6cb">items.php</a>
+</li>
+<li>atom_entry()
+: <a class="el" href="items_8php.html#a275108c050f7eb18bcbb5018e6b81cf6">items.php</a>
+</li>
+<li>ATOM_TIME
+: <a class="el" href="boot_8php.html#ad34c1547020a305915bcc39707744690">boot.php</a>
+</li>
+<li>attach_by_hash()
+: <a class="el" href="include_2attach_8php.html#a0d07c5b83d3d54e186f752e571847b36">attach.php</a>
+</li>
+<li>attach_by_hash_nodata()
+: <a class="el" href="include_2attach_8php.html#ad991208ce939387e2f93a3bce7d09932">attach.php</a>
+</li>
+<li>attach_change_permissions()
+: <a class="el" href="include_2attach_8php.html#a5c0875eafb8c0f8a0620ff7a875a2221">attach.php</a>
+</li>
+<li>attach_count_files()
+: <a class="el" href="include_2attach_8php.html#a887d2d44a3ef18dcb6624e7fb58dc8e3">attach.php</a>
+</li>
+<li>attach_delete()
+: <a class="el" href="include_2attach_8php.html#a70bd666e080c2af5a91f5d14c297b8cd">attach.php</a>
+</li>
+<li>ATTACH_FLAG_DIR
+: <a class="el" href="boot_8php.html#aa74438cf71e48e37bf7b440b94243985">boot.php</a>
+</li>
+<li>ATTACH_FLAG_OS
+: <a class="el" href="boot_8php.html#a781916f83fcc8ff1035649afa45f0292">boot.php</a>
+</li>
+<li>attach_init()
+: <a class="el" href="mod_2attach_8php.html#aa88eb5ad87aa1036a30e70339cc6c1b1">attach.php</a>
+</li>
+<li>attach_list_files()
+: <a class="el" href="include_2attach_8php.html#a3634af95f11a023dd8e882c3c7a3600d">attach.php</a>
+</li>
+<li>attach_mkdir()
+: <a class="el" href="include_2attach_8php.html#ab6830b3ab74a5d284876141ac80f6cbc">attach.php</a>
+</li>
+<li>attach_store()
+: <a class="el" href="include_2attach_8php.html#a84a8a64c4805e1525b42d4add464833f">attach.php</a>
+</li>
+<li>attribute_contains()
+: <a class="el" href="text_8php.html#a95fd2f8f23a1948414a03ebc963bac57">text.php</a>
+</li>
+<li>authenticate_success()
+: <a class="el" href="security_8php.html#adc7bf51e3b8d67bd80e9348f9ab03733">security.php</a>
+</li>
+<li>autoname()
+: <a class="el" href="text_8php.html#a27cd2c1b3bcb49a0cfb7249e851725ca">text.php</a>
+</li>
+<li>avatar_img()
+: <a class="el" href="include_2network_8php.html#ab07ce9d75eae559865ed90aad2154bd7">network.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_0x62.html b/doc/html/globals_0x62.html
new file mode 100644
index 000000000..6676a53b5
--- /dev/null
+++ b/doc/html/globals_0x62.html
@@ -0,0 +1,225 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="globals_0x61.html#index_a"><span>a</span></a></li>
+ <li class="current"><a href="globals_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_0x62.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all file members with links to the files they belong to:</div>
+
+<h3><a class="anchor" id="index_b"></a>- b -</h3><ul>
+<li>base64url_decode()
+: <a class="el" href="text_8php.html#a13286f8a95d2de6b102966ecc270c8d6">text.php</a>
+</li>
+<li>base64url_encode()
+: <a class="el" href="text_8php.html#a070384ec000fd65043fce11d5392d241">text.php</a>
+</li>
+<li>bb2diaspora()
+: <a class="el" href="bb2diaspora_8php.html#a4f10e0876b27373c762bc1abbe745f5c">bb2diaspora.php</a>
+</li>
+<li>bb_parse_crypt()
+: <a class="el" href="bbcode_8php.html#a851f5aafefe52474201b83f9fd65931f">bbcode.php</a>
+</li>
+<li>bb_qr()
+: <a class="el" href="bbcode_8php.html#a98d0eecc620c19561639f06cfbe8e74c">bbcode.php</a>
+</li>
+<li>bb_ShareAttributes()
+: <a class="el" href="bbcode_8php.html#a1c69e021d5e0aef97d6966bf3169c86a">bbcode.php</a>
+</li>
+<li>bb_ShareAttributesSimple()
+: <a class="el" href="bbcode_8php.html#a2be26414a367118143cc89e2d58e7377">bbcode.php</a>
+</li>
+<li>bb_spacefy()
+: <a class="el" href="bbcode_8php.html#a8911e027907820df3db03b4f76724b50">bbcode.php</a>
+</li>
+<li>bb_tag_preg_replace()
+: <a class="el" href="bb2diaspora_8php.html#ad0abe1a7ee50aa0736a233df0a422eba">bb2diaspora.php</a>
+</li>
+<li>bb_translate_video()
+: <a class="el" href="text_8php.html#a3d2793d66db3345fd290b71e2eadf98e">text.php</a>
+</li>
+<li>bb_unspacefy_and_trim()
+: <a class="el" href="bbcode_8php.html#a064dcfd9767df6f53be1a0e11ceeb15d">bbcode.php</a>
+</li>
+<li>bbcode()
+: <a class="el" href="bbcode_8php.html#a009f61aaf78771737ed0765c8463911b">bbcode.php</a>
+</li>
+<li>bbtoevent()
+: <a class="el" href="event_8php.html#a180cccd63c2a2f00ff432b03113531f3">event.php</a>
+</li>
+<li>bbtovcal()
+: <a class="el" href="event_8php.html#a184d6b9690e5b6dee35a0aa9edd47279">event.php</a>
+</li>
+<li>best_link_url()
+: <a class="el" href="conversation_8php.html#ad470fc7766f0db66d138fa1916c7a8b7">conversation.php</a>
+</li>
+<li>blocks_content()
+: <a class="el" href="blocks_8php.html#a2531a8fd51db3cecb2eb20c002c66e12">blocks.php</a>
+</li>
+<li>blog_init()
+: <a class="el" href="blogga_2php_2theme_8php.html#aa55c1cb1f05087b5002ecb633b550b1b">theme.php</a>
+</li>
+<li>blog_install()
+: <a class="el" href="blogga_2view_2theme_2blog_2theme_8php.html#aae58cc837fe56473d9f3370abfe533ae">theme.php</a>
+</li>
+<li>blog_uninstall()
+: <a class="el" href="blogga_2view_2theme_2blog_2theme_8php.html#a3e77dbe111f330c64a1ff6c741cd515c">theme.php</a>
+</li>
+<li>blogtheme_display_item()
+: <a class="el" href="blogga_2view_2theme_2blog_2theme_8php.html#a028ae8e9f2824670dfa76a6651d817e5">theme.php</a>
+</li>
+<li>blogtheme_form()
+: <a class="el" href="view_2theme_2blogga_2view_2theme_2blog_2config_8php.html#a8a311a402d3e746ce53fadc38e4b2d27">config.php</a>
+</li>
+<li>blogtheme_imgurl()
+: <a class="el" href="blogga_2view_2theme_2blog_2theme_8php.html#af634a3f721c5e238530d0636d33230ec">theme.php</a>
+</li>
+<li>breaklines()
+: <a class="el" href="html2plain_8php.html#a3214912e3d00cf0a948072daccf16740">html2plain.php</a>
+</li>
+<li>build_querystring()
+: <a class="el" href="boot_8php.html#a9cbab4ee728e9a8b4ce952bae643044e">boot.php</a>
+</li>
+<li>build_sync_packet()
+: <a class="el" href="zot_8php.html#ac34e479d27f32b82dd6b33542f81a6a7">zot.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_0x63.html b/doc/html/globals_0x63.html
new file mode 100644
index 000000000..eaefb6b94
--- /dev/null
+++ b/doc/html/globals_0x63.html
@@ -0,0 +1,465 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="globals_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_0x62.html#index_b"><span>b</span></a></li>
+ <li class="current"><a href="globals_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_0x63.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all file members with links to the files they belong to:</div>
+
+<h3><a class="anchor" id="index_c"></a>- c -</h3><ul>
+<li>cal()
+: <a class="el" href="datetime_8php.html#aea356409ba69f9de412298c998595dd2">datetime.php</a>
+</li>
+<li>call_hooks()
+: <a class="el" href="plugin_8php.html#a7f05de16c0a32602853b09b99dd85e7c">plugin.php</a>
+</li>
+<li>can_comment_on_post()
+: <a class="el" href="items_8php.html#a1e75047cf175aaee8dd16aa761913ff9">items.php</a>
+</li>
+<li>categories_widget()
+: <a class="el" href="contact__widgets_8php.html#a165eb021e61c4dcab2a552f28628d353">contact_widgets.php</a>
+</li>
+<li>change_channel()
+: <a class="el" href="security_8php.html#a8d23d2597aae380a3341872fe9513380">security.php</a>
+</li>
+<li>chanlink_cid()
+: <a class="el" href="text_8php.html#a85e3a4851c16674834010d8419a5d7ca">text.php</a>
+</li>
+<li>chanlink_hash()
+: <a class="el" href="text_8php.html#a55ab893be57feda59c2a7ba1e58ff2d0">text.php</a>
+</li>
+<li>chanlink_url()
+: <a class="el" href="text_8php.html#a2e8d6c402603be3a1256a16605e09c2a">text.php</a>
+</li>
+<li>chanman_remove_everything_from_network()
+: <a class="el" href="include_2chanman_8php.html#a21ba9a5c961e866ff27aee3ee67bf99b">chanman.php</a>
+</li>
+<li>channel_content()
+: <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel.php</a>
+</li>
+<li>channel_init()
+: <a class="el" href="channel_8php.html#ac7c8c7845741baadf87fae6bc279f3dc">channel.php</a>
+</li>
+<li>channel_remove()
+: <a class="el" href="Contact_8php.html#a186162051a5127069cc851d78740f205">Contact.php</a>
+</li>
+<li>channel_total()
+: <a class="el" href="identity_8php.html#a77d2237f1846964634b1c99089c27c7d">identity.php</a>
+</li>
+<li>channelx_by_hash()
+: <a class="el" href="Contact_8php.html#a483cda56f9e37c3a4a8773dcdfeb0258">Contact.php</a>
+</li>
+<li>channelx_by_n()
+: <a class="el" href="Contact_8php.html#a3a0844dac1e86d523de5d2f432cfeebc">Contact.php</a>
+</li>
+<li>channelx_by_nick()
+: <a class="el" href="Contact_8php.html#a87e699f74a1102b25e8aa0432d86a91e">Contact.php</a>
+</li>
+<li>chanview_content()
+: <a class="el" href="chanview_8php.html#a4192c6da888c8c1165851acf9ad4cb8b">chanview.php</a>
+</li>
+<li>check_account_admin()
+: <a class="el" href="account_8php.html#a917d74aad0baf3e0c4b51cf1051e654f">account.php</a>
+</li>
+<li>check_account_email()
+: <a class="el" href="account_8php.html#ae052bd5558847bd38e89c213561a9771">account.php</a>
+</li>
+<li>check_account_invite()
+: <a class="el" href="account_8php.html#aaff7720423417a4333697894ffd9ddeb">account.php</a>
+</li>
+<li>check_account_password()
+: <a class="el" href="account_8php.html#a144b4891022567668375b58ea61cfff0">account.php</a>
+</li>
+<li>check_add()
+: <a class="el" href="setup_8php.html#ae8e4d9279a61de74d5f39962cb7b6ca1">setup.php</a>
+</li>
+<li>check_config()
+: <a class="el" href="boot_8php.html#a4c02d88e66852a01bd5a1feecb7c3ce3">boot.php</a>
+</li>
+<li>check_form_security_std_err_msg()
+: <a class="el" href="security_8php.html#a20f8b9851f23ee8894b8925584ef6821">security.php</a>
+</li>
+<li>check_form_security_token()
+: <a class="el" href="security_8php.html#a9c6180e82150a5a9af91a1255d096b5c">security.php</a>
+</li>
+<li>check_form_security_token_ForbiddenOnErr()
+: <a class="el" href="security_8php.html#a444ac867dfa8c37cf0a7a226412bee28">security.php</a>
+</li>
+<li>check_form_security_token_redirectOnErr()
+: <a class="el" href="security_8php.html#a77ba0d1889a39cf32434c5ce96fe1433">security.php</a>
+</li>
+<li>check_funcs()
+: <a class="el" href="setup_8php.html#a69a450e06dd3771fb51d3e4b0266a35e">setup.php</a>
+</li>
+<li>check_htaccess()
+: <a class="el" href="setup_8php.html#a0c3f3b671381f6dccd924b8ecdfc56c4">setup.php</a>
+</li>
+<li>check_htconfig()
+: <a class="el" href="setup_8php.html#a5ad92c0857d1dadd6b60a9a557159c9f">setup.php</a>
+</li>
+<li>check_item_source()
+: <a class="el" href="items_8php.html#a87ac9e359591721a824ecd23bbb56296">items.php</a>
+</li>
+<li>check_keys()
+: <a class="el" href="setup_8php.html#aa3bbb111780da70ba35cc23a306f2c76">setup.php</a>
+</li>
+<li>check_list_permissions()
+: <a class="el" href="permissions_8php.html#a0f5bd9f7f4c8fb7ba4b2c1ed048b4dc7">permissions.php</a>
+</li>
+<li>check_php()
+: <a class="el" href="setup_8php.html#a14d208682a88632290c895d20da6e7d6">setup.php</a>
+</li>
+<li>check_smarty3()
+: <a class="el" href="setup_8php.html#afd8b0b3ade1507c45325caf377bf459d">setup.php</a>
+</li>
+<li>check_store()
+: <a class="el" href="setup_8php.html#ab4b71369a25021d59247c917e98d8246">setup.php</a>
+</li>
+<li>check_webbie()
+: <a class="el" href="text_8php.html#a0c65597bb4aed3a039eb795ff540e5e3">text.php</a>
+</li>
+<li>clean_urls()
+: <a class="el" href="boot_8php.html#ab79b8b4555cae20d03f8200666d89d63">boot.php</a>
+</li>
+<li>cleardiv()
+: <a class="el" href="text_8php.html#afe18627c4983ee5f7c940a0992818cd5">text.php</a>
+</li>
+<li>cli_startup()
+: <a class="el" href="cli__startup_8php.html#adfdde63686e33ccd4851fa5edc4fc70b">cli_startup.php</a>
+</li>
+<li>cli_suggest_run()
+: <a class="el" href="cli__suggest_8php.html#a8f3a60fc96f4bec7d3837c4efc7725f2">cli_suggest.php</a>
+</li>
+<li>CLIENT_MODE_LOAD
+: <a class="el" href="boot_8php.html#af6f6f6f40139f12fc09ec47373b30919">boot.php</a>
+</li>
+<li>CLIENT_MODE_NORMAL
+: <a class="el" href="boot_8php.html#a43c6c7d84d880e9500bd4f8f8ecc5731">boot.php</a>
+</li>
+<li>CLIENT_MODE_UPDATE
+: <a class="el" href="boot_8php.html#a3f40aa5bafff8c4eebdc62e5121daf77">boot.php</a>
+</li>
+<li>cloud_init()
+: <a class="el" href="cloud_8php.html#a1b79a6fe0454bc76673ad9aef55bf02d">cloud.php</a>
+</li>
+<li>collect_recipients()
+: <a class="el" href="items_8php.html#a01e3cf44e082fa9bd06dcde5bf713d70">items.php</a>
+</li>
+<li>collecturls()
+: <a class="el" href="html2plain_8php.html#ae1c203d0f089d5678d73a6c64a395201">html2plain.php</a>
+</li>
+<li>comanche_block()
+: <a class="el" href="comanche_8php.html#a5a7ab801717d38e91ac910b933973887">comanche.php</a>
+</li>
+<li>comanche_menu()
+: <a class="el" href="comanche_8php.html#a1fe339e1454803aa502ac89379c17f5b">comanche.php</a>
+</li>
+<li>comanche_parser()
+: <a class="el" href="comanche_8php.html#a1a208fdb40dd83d6298caec4290ee922">comanche.php</a>
+</li>
+<li>comanche_region()
+: <a class="el" href="comanche_8php.html#a5718daeda40bf835345fe061e8808cdf">comanche.php</a>
+</li>
+<li>comanche_replace_region()
+: <a class="el" href="comanche_8php.html#a028f004d5b8c23d6367816d899e17cfe">comanche.php</a>
+</li>
+<li>comanche_webpage()
+: <a class="el" href="comanche_8php.html#ae9fe1ce574db3dd0931eada80234f82a">comanche.php</a>
+</li>
+<li>comanche_widget()
+: <a class="el" href="comanche_8php.html#a6b0191c1a63db1696a2eb139d90d9e7f">comanche.php</a>
+</li>
+<li>common_content()
+: <a class="el" href="common_8php.html#ab63408f39abef7a6915186e8dabc5a96">common.php</a>
+</li>
+<li>common_friends()
+: <a class="el" href="socgraph_8php.html#a7d34cd58025bcd9e575282f44db75918">socgraph.php</a>
+</li>
+<li>common_friends_visitor_widget()
+: <a class="el" href="contact__widgets_8php.html#a552f8544528cec0c995cea7287ea9d65">contact_widgets.php</a>
+</li>
+<li>common_friends_zcid()
+: <a class="el" href="socgraph_8php.html#ac343a846241d36cdf046b08f3396cfe9">socgraph.php</a>
+</li>
+<li>common_init()
+: <a class="el" href="common_8php.html#aca62f113655809f41f49042ce9b123c2">common.php</a>
+</li>
+<li>community_content()
+: <a class="el" href="community_8php.html#a1197aafd6a6b540dbb4a0c04ade3a25a">community.php</a>
+</li>
+<li>community_init()
+: <a class="el" href="community_8php.html#a56c94ec978a38633c5628fa6f8e386d9">community.php</a>
+</li>
+<li>compare_permissions()
+: <a class="el" href="items_8php.html#a0790a4550b829e85504af548623002ca">items.php</a>
+</li>
+<li>completeurl()
+: <a class="el" href="parse__url_8php.html#a496f4e3836154f6f32b8e805a7160d3a">parse_url.php</a>
+</li>
+<li>connect_content()
+: <a class="el" href="connect_8php.html#a489f0a66c660de6ec4d6917b27674f07">connect.php</a>
+</li>
+<li>connect_init()
+: <a class="el" href="connect_8php.html#ad46a38f32fd7a3d324b1fa26373efa36">connect.php</a>
+</li>
+<li>connect_post()
+: <a class="el" href="connect_8php.html#a417ec27afe33f21a929667a665e32ee2">connect.php</a>
+</li>
+<li>connections_clone()
+: <a class="el" href="connections_8php.html#a15af118efee9c948b6f8294e54a73bb2">connections.php</a>
+</li>
+<li>connections_content()
+: <a class="el" href="connections_8php.html#aec2e457420fce3e3bf6a9f48e36df25c">connections.php</a>
+</li>
+<li>connections_init()
+: <a class="el" href="connections_8php.html#a1f23623f802af7bd35e95b0e94e5d558">connections.php</a>
+</li>
+<li>connections_post()
+: <a class="el" href="connections_8php.html#a1224058db8e3fb56463eb312f98e561d">connections.php</a>
+</li>
+<li>connedit_clone()
+: <a class="el" href="connedit_8php.html#a707ea7e63cf9674025b1d6b081ae74f5">connedit.php</a>
+</li>
+<li>connedit_content()
+: <a class="el" href="connedit_8php.html#a795acb3d9d841f55c255d7611681ab67">connedit.php</a>
+</li>
+<li>connedit_init()
+: <a class="el" href="connedit_8php.html#a4da871e075597a09a8b374b9171dd92e">connedit.php</a>
+</li>
+<li>connedit_post()
+: <a class="el" href="connedit_8php.html#a234c48426b652bf4d37053f2af329ac5">connedit.php</a>
+</li>
+<li>construct_activity_object()
+: <a class="el" href="items_8php.html#aa9e99613d38a97b39c8cf5449699c2ee">items.php</a>
+</li>
+<li>construct_activity_target()
+: <a class="el" href="items_8php.html#aa579bc4445d60098b1410961ca8e96b7">items.php</a>
+</li>
+<li>construct_page()
+: <a class="el" href="boot_8php.html#acc4e0c910af066148b810e5fde55fff1">boot.php</a>
+</li>
+<li>construct_verb()
+: <a class="el" href="items_8php.html#a8f3c85c584ccd2b98c3ca440e45b40f8">items.php</a>
+</li>
+<li>consume_feed()
+: <a class="el" href="items_8php.html#a8794863cdf8ce1333040933d3a3f66bd">items.php</a>
+</li>
+<li>contact_block()
+: <a class="el" href="text_8php.html#ad6432621d0fafcbcf3d3b9b49bef7784">text.php</a>
+</li>
+<li>CONTACT_IS_FOLLOWER
+: <a class="el" href="boot_8php.html#ada72d88ae39a7e3b45baea201cb49a29">boot.php</a>
+</li>
+<li>CONTACT_IS_FRIEND
+: <a class="el" href="boot_8php.html#a27299ecfb9e9a99826f17a1c14c6995f">boot.php</a>
+</li>
+<li>CONTACT_IS_SHARING
+: <a class="el" href="boot_8php.html#a6c5e9e293c8242dcb9bc2c3ea2fee2c9">boot.php</a>
+</li>
+<li>contact_poll_interval()
+: <a class="el" href="contact__selectors_8php.html#a9839e8fdaac7ffb37bf1420493f5c28f">contact_selectors.php</a>
+</li>
+<li>contact_profile_assign()
+: <a class="el" href="contact__selectors_8php.html#a2c743d2eb526eb758d943a1490162d75">contact_selectors.php</a>
+</li>
+<li>contact_remove()
+: <a class="el" href="Contact_8php.html#a28e062c884331dbb5dfa713228c25ad6">Contact.php</a>
+</li>
+<li>contact_reputation()
+: <a class="el" href="contact__selectors_8php.html#ae499960d6467bd30c78607b1018baf53">contact_selectors.php</a>
+</li>
+<li>contact_select()
+: <a class="el" href="acl__selectors_8php.html#a9476997d2968a5794f3723878ed89c91">acl_selectors.php</a>
+</li>
+<li>contactgroup_content()
+: <a class="el" href="contactgroup_8php.html#a18c7391b1b25debaf98c9dba639caab3">contactgroup.php</a>
+</li>
+<li>conv_sort()
+: <a class="el" href="conversation_8php.html#abed85a41f1160598de880b84021c9cf7">conversation.php</a>
+</li>
+<li>conversation()
+: <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation.php</a>
+</li>
+<li>convert_xml_element_to_array()
+: <a class="el" href="include_2network_8php.html#ad4056d3ce69988f5c1a997a79f503246">network.php</a>
+</li>
+<li>count_all_friends()
+: <a class="el" href="socgraph_8php.html#af29d056beec10b4e38e5209c92452894">socgraph.php</a>
+</li>
+<li>count_common_friends()
+: <a class="el" href="socgraph_8php.html#a887d576f21fd708132a06d0f72f90f84">socgraph.php</a>
+</li>
+<li>count_common_friends_zcid()
+: <a class="el" href="socgraph_8php.html#af175807406d94407a5e11742a3287746">socgraph.php</a>
+</li>
+<li>count_descendants()
+: <a class="el" href="conversation_8php.html#ab2383dff4f823e580399ff469d90ab19">conversation.php</a>
+</li>
+<li>create_account()
+: <a class="el" href="account_8php.html#a141fe579c351c78209d425473f978eb5">account.php</a>
+</li>
+<li>create_identity()
+: <a class="el" href="identity_8php.html#a345f4c943d84de502ec6e72d2c813945">identity.php</a>
+</li>
+<li>create_sys_channel()
+: <a class="el" href="identity_8php.html#a1cf83ac2b645de12868edaa3a5718f05">identity.php</a>
+</li>
+<li>cronhooks_run()
+: <a class="el" href="cronhooks_8php.html#a4c4c1bbec4ecc9a0efa00dd6afd2c0ca">cronhooks.php</a>
+</li>
+<li>crypto_encapsulate()
+: <a class="el" href="crypto_8php.html#a32fc08d57a5694f94d8543ecbb03323c">crypto.php</a>
+</li>
+<li>crypto_unencapsulate()
+: <a class="el" href="crypto_8php.html#a0781202b0a43b82426929cc87c2fa2b5">crypto.php</a>
+</li>
+<li>curPageURL()
+: <a class="el" href="boot_8php.html#aa4221641e5c21db69fa52c426b9017f5">boot.php</a>
+</li>
+<li>current_theme()
+: <a class="el" href="boot_8php.html#ad206598b909e8eb67eb0e0bb5ef69c13">boot.php</a>
+</li>
+<li>current_theme_url()
+: <a class="el" href="boot_8php.html#a926cad0b3d8b9d9ee5da1898fc063ba3">boot.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_0x64.html b/doc/html/globals_0x64.html
new file mode 100644
index 000000000..b8730af37
--- /dev/null
+++ b/doc/html/globals_0x64.html
@@ -0,0 +1,297 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="globals_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_0x63.html#index_c"><span>c</span></a></li>
+ <li class="current"><a href="globals_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_0x64.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all file members with links to the files they belong to:</div>
+
+<h3><a class="anchor" id="index_d"></a>- d -</h3><ul>
+<li>datesel()
+: <a class="el" href="datetime_8php.html#ac265b86f384ee094ed5479aae02aa5c8">datetime.php</a>
+</li>
+<li>datesel_format()
+: <a class="el" href="datetime_8php.html#a5f29553799005b1fd4e9ce9d98ce05aa">datetime.php</a>
+</li>
+<li>datetime_convert()
+: <a class="el" href="datetime_8php.html#ad6301e74b0f9267d52f8d432b5beb226">datetime.php</a>
+</li>
+<li>day_translate()
+: <a class="el" href="text_8php.html#a63fb21c0bed2fc72eef2c1471ac42b63">text.php</a>
+</li>
+<li>DB_UPDATE_VERSION
+: <a class="el" href="boot_8php.html#ac59a18a4838710d6c2de37aed6b21f03">boot.php</a>
+</li>
+<li>dba_factory()
+: <a class="el" href="dba__driver_8php.html#ac10e60f6e5b95bcf67bd82cb88f37947">dba_driver.php</a>
+</li>
+<li>dba_timer()
+: <a class="el" href="boot_8php.html#a3e0930933fb2c0bf8211cc7ab4e1c3b4">boot.php</a>
+</li>
+<li>dbesc()
+: <a class="el" href="dba__driver_8php.html#ab222aa1dbf9ea93b320f82028739127e">dba_driver.php</a>
+</li>
+<li>dbesc_array()
+: <a class="el" href="dba__driver_8php.html#a65b83462bd26968106aebd43f16540e4">dba_driver.php</a>
+</li>
+<li>dbesc_array_cb()
+: <a class="el" href="dba__driver_8php.html#af531546fac5f0836a8557a4f6dfee930">dba_driver.php</a>
+</li>
+<li>dbg()
+: <a class="el" href="dba__driver_8php.html#aa6607893d8f60ade9122bcfbd1a53ffb">dba_driver.php</a>
+</li>
+<li>dbq()
+: <a class="el" href="dba__driver_8php.html#aa377074e70981e8c4e82ca0accd068ee">dba_driver.php</a>
+</li>
+<li>decode_tags()
+: <a class="el" href="items_8php.html#a56b2a4abcadfac71175cd50555528cc3">items.php</a>
+</li>
+<li>DEFAULT_DB_ENGINE
+: <a class="el" href="boot_8php.html#aa8a2b61e70900139d1ca28e46f1da49d">boot.php</a>
+</li>
+<li>del_config()
+: <a class="el" href="include_2config_8php.html#a549910227348003efc3c05c9105c42da">config.php</a>
+</li>
+<li>del_pconfig()
+: <a class="el" href="include_2config_8php.html#a7ad2081c5f812ac4387fd76f3762d941">config.php</a>
+</li>
+<li>del_xconfig()
+: <a class="el" href="include_2config_8php.html#a9c171def547deee16738dc58fdeb4b72">config.php</a>
+</li>
+<li>delegate_content()
+: <a class="el" href="delegate_8php.html#a943eea8996ef348eb845c498f9f354dd">delegate.php</a>
+</li>
+<li>delete_imported_item()
+: <a class="el" href="zot_8php.html#adfeb9400ae6b726beec89f8f1e8fde72">zot.php</a>
+</li>
+<li>delete_item_lowlevel()
+: <a class="el" href="items_8php.html#a2b56a4c01bd22a648d52ec9af1a04259">items.php</a>
+</li>
+<li>deletenode()
+: <a class="el" href="html2bbcode_8php.html#a71a07f135d196ec5943b13f7b2e6a9b2">html2bbcode.php</a>
+</li>
+<li>deliver_run()
+: <a class="el" href="deliver_8php.html#a397afcb9afecf0c1816b0951189dd346">deliver.php</a>
+</li>
+<li>design_tools()
+: <a class="el" href="text_8php.html#a87a3cefc603302c78982f1d8e1245265">text.php</a>
+</li>
+<li>detect_language()
+: <a class="el" href="language_8php.html#a632da17c7ac0d2dc1a00a4706870194b">language.php</a>
+</li>
+<li>diaspora2bb()
+: <a class="el" href="bb2diaspora_8php.html#a26c09c218413610e62e60754c579f6c6">bb2diaspora.php</a>
+</li>
+<li>diaspora_ol()
+: <a class="el" href="bb2diaspora_8php.html#a8b96bd45884fa1c40b942939354197d4">bb2diaspora.php</a>
+</li>
+<li>diaspora_ul()
+: <a class="el" href="bb2diaspora_8php.html#adc92ccda5f85ed27e64fcc17712c89cc">bb2diaspora.php</a>
+</li>
+<li>dir_safe_mode()
+: <a class="el" href="dir__fns_8php.html#acf621621e929d49441da30aad76a58cf">dir_fns.php</a>
+</li>
+<li>dir_sort_links()
+: <a class="el" href="dir__fns_8php.html#ae56881d69bb6f8e828c9e35454386774">dir_fns.php</a>
+</li>
+<li>dir_tagadelic()
+: <a class="el" href="taxonomy_8php.html#a088371f4bc19155b2291508f5cd63332">taxonomy.php</a>
+</li>
+<li>dir_tagblock()
+: <a class="el" href="taxonomy_8php.html#a599ee71dd3194c8127b00dabec77abc1">taxonomy.php</a>
+</li>
+<li>directory_content()
+: <a class="el" href="mod_2directory_8php.html#aac79396570d759da2efac24fcedf5b44">directory.php</a>
+</li>
+<li>DIRECTORY_FALLBACK_MASTER
+: <a class="el" href="boot_8php.html#abedd940e664017c61b48c6efa31d0cb8">boot.php</a>
+</li>
+<li>directory_init()
+: <a class="el" href="mod_2directory_8php.html#a5ee59c213508b6b9787612a8219cb5bf">directory.php</a>
+</li>
+<li>DIRECTORY_MODE_NORMAL
+: <a class="el" href="boot_8php.html#ab7d65a7e7417825a4db62906bb600729">boot.php</a>
+</li>
+<li>DIRECTORY_MODE_PRIMARY
+: <a class="el" href="boot_8php.html#a8a60cc38bb567765fd926fef70205f16">boot.php</a>
+</li>
+<li>DIRECTORY_MODE_SECONDARY
+: <a class="el" href="boot_8php.html#aedfb9501ed408278667995524e0d15cf">boot.php</a>
+</li>
+<li>DIRECTORY_MODE_STANDALONE
+: <a class="el" href="boot_8php.html#a25476eec71fceda237f7dc1d78b0adb8">boot.php</a>
+</li>
+<li>DIRECTORY_REALM
+: <a class="el" href="boot_8php.html#a6b9909db6a7ec80ec6fdd40ba74014dd">boot.php</a>
+</li>
+<li>directory_run()
+: <a class="el" href="include_2directory_8php.html#aa75d3b0697ca1456aaabdb37a74aa0f0">directory.php</a>
+</li>
+<li>dirprofile_init()
+: <a class="el" href="dirprofile_8php.html#a3e1d30d3d93863ff5615f2df4ac7f052">dirprofile.php</a>
+</li>
+<li>dirsearch_content()
+: <a class="el" href="dirsearch_8php.html#aa1fb04e1de4f25b63349ac78f94ceb4c">dirsearch.php</a>
+</li>
+<li>dirsearch_init()
+: <a class="el" href="dirsearch_8php.html#a3e51964ae3f5ff147403407b65324752">dirsearch.php</a>
+</li>
+<li>display_content()
+: <a class="el" href="display_8php.html#a37137c98d47bf3306f4c2bb9f5b60de0">display.php</a>
+</li>
+<li>dlogger()
+: <a class="el" href="text_8php.html#a0a1f7c0e97f9ecbebf3e5834582b014c">text.php</a>
+</li>
+<li>do
+: <a class="el" href="docblox__errorchecker_8php.html#a721c6ff80a6d3e4ad4ffa52a04c60085">docblox_errorchecker.php</a>
+</li>
+<li>dob()
+: <a class="el" href="datetime_8php.html#a3f2897db32e745fe2f3e70a6b46578f8">datetime.php</a>
+</li>
+<li>drop_item()
+: <a class="el" href="items_8php.html#afa1db13c2a8b73b5b17b97f17e5a19d1">items.php</a>
+</li>
+<li>drop_items()
+: <a class="el" href="items_8php.html#a668ece2c37f05cc3abe538eb0dabfe55">items.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_0x65.html b/doc/html/globals_0x65.html
new file mode 100644
index 000000000..952cadff7
--- /dev/null
+++ b/doc/html/globals_0x65.html
@@ -0,0 +1,225 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="globals_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_0x64.html#index_d"><span>d</span></a></li>
+ <li class="current"><a href="globals_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_0x65.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all file members with links to the files they belong to:</div>
+
+<h3><a class="anchor" id="index_e"></a>- e -</h3><ul>
+<li>editblock_content()
+: <a class="el" href="editblock_8php.html#abbe8f55de06967bc8d79d620509a49e6">editblock.php</a>
+</li>
+<li>editlayout_content()
+: <a class="el" href="editlayout_8php.html#aa877e4157a26b099de904164181dd386">editlayout.php</a>
+</li>
+<li>editpost_content()
+: <a class="el" href="editpost_8php.html#a34011690864d122680c802e9e748ccfb">editpost.php</a>
+</li>
+<li>editwebpage_content()
+: <a class="el" href="editwebpage_8php.html#a375e945255fad79a71036528f7480650">editwebpage.php</a>
+</li>
+<li>else
+: <a class="el" href="redbasic_2php_2style_8php.html#ab3afb90d611eca90819f597a2c0bb459">style.php</a>
+, <a class="el" href="auth_8php.html#a0950af7c2888ca1d4743fe5d0bff9ae5">auth.php</a>
+, <a class="el" href="fpostit_8php.html#a501b5ca82f287509fc691c88524064c1">fpostit.php</a>
+, <a class="el" href="tpldebug_8php.html#afbc7aadb3f7ff1edf0aaaa326a42179c">tpldebug.php</a>
+</li>
+<li>email_header_encode()
+: <a class="el" href="include_2network_8php.html#a469b9bd700269cd07d954f1a16c5899b">network.php</a>
+</li>
+<li>email_send()
+: <a class="el" href="include_2network_8php.html#a1ff07d9fad93b713b93da0ab77aab7f0">network.php</a>
+</li>
+<li>encode_item()
+: <a class="el" href="items_8php.html#a82955cc578f0fa600acec84475026194">items.php</a>
+</li>
+<li>encode_item_flags()
+: <a class="el" href="items_8php.html#a5f690fc2484abec07840b4f9dd525bd9">items.php</a>
+</li>
+<li>encode_item_terms()
+: <a class="el" href="items_8php.html#ac6673627d289ee4f547de0fe3b7acd0a">items.php</a>
+</li>
+<li>encode_item_xchan()
+: <a class="el" href="items_8php.html#a566c601726697e044e75284af7fb6f17">items.php</a>
+</li>
+<li>encode_mail()
+: <a class="el" href="items_8php.html#a2d840c74ed23d1b6c7daee05cf89dda7">items.php</a>
+</li>
+<li>encode_rel_links()
+: <a class="el" href="items_8php.html#aa723c0571e314a1853a24c5854b4f54f">items.php</a>
+</li>
+<li>enumerate_permissions()
+: <a class="el" href="items_8php.html#afbcf26dfcf8a83fff952aa858c1b7b67">items.php</a>
+</li>
+<li>EOL
+: <a class="el" href="boot_8php.html#a0603d6ece8c5d37b4b7db697db053a4b">boot.php</a>
+</li>
+<li>EOT
+: <a class="el" href="typohelper_8php.html#ab6fd357fb5b2a3ba8aab9e8b98c6a805">typohelper.php</a>
+</li>
+<li>escape_tags()
+: <a class="el" href="text_8php.html#aa5148a0dfea2a1ca64c3d52f10aa2d64">text.php</a>
+</li>
+<li>ev_compare()
+: <a class="el" href="event_8php.html#a32ba1b9ddf7a744a9a1512b052e5f850">event.php</a>
+</li>
+<li>event_store()
+: <a class="el" href="event_8php.html#a89ef533faf345db8d64a58d4856bde3a">event.php</a>
+</li>
+<li>events_content()
+: <a class="el" href="events_8php.html#a1d293fb217ae6bc9e3858c4b32e363ec">events.php</a>
+</li>
+<li>events_post()
+: <a class="el" href="events_8php.html#ab3e8a8f901175f8e40a8089eea45c075">events.php</a>
+</li>
+<li>expand_acl()
+: <a class="el" href="text_8php.html#ae4282a39492caa23ccbc2ce98e54f110">text.php</a>
+</li>
+<li>expand_groups()
+: <a class="el" href="include_2group_8php.html#a22a81875259c7d3d64d4848afea6b345">group.php</a>
+</li>
+<li>expire_run()
+: <a class="el" href="expire_8php.html#a444e45c9b67727b27db4c779fd51a298">expire.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_0x66.html b/doc/html/globals_0x66.html
new file mode 100644
index 000000000..4fac5f32f
--- /dev/null
+++ b/doc/html/globals_0x66.html
@@ -0,0 +1,279 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="globals_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_0x65.html#index_e"><span>e</span></a></li>
+ <li class="current"><a href="globals_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_0x66.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all file members with links to the files they belong to:</div>
+
+<h3><a class="anchor" id="index_f"></a>- f -</h3><ul>
+<li>fbrowser_content()
+: <a class="el" href="fbrowser_8php.html#aee476addcf7a3e0fe9454f7dfd5a56c4">fbrowser.php</a>
+</li>
+<li>feature_enabled()
+: <a class="el" href="features_8php.html#a52b5bdfb61b256713efecf7a7b20b0c0">features.php</a>
+</li>
+<li>feed_hublinks()
+: <a class="el" href="text_8php.html#a8d8c4a11e53461caca21181ebd72daca">text.php</a>
+</li>
+<li>feed_init()
+: <a class="el" href="feed_8php.html#af86137700b56f33d1d5f25c8dec22c04">feed.php</a>
+</li>
+<li>feed_salmonlinks()
+: <a class="el" href="text_8php.html#a89929fa6f70a8ba54d5273fcf622b665">text.php</a>
+</li>
+<li>fetch_lrdd_template()
+: <a class="el" href="include_2network_8php.html#a8d5a3afb51cc932032b5dcc159efaae0">network.php</a>
+</li>
+<li>fetch_post_tags()
+: <a class="el" href="items_8php.html#adf980098b6de9c3993bc3ff26a8dd6f9">items.php</a>
+</li>
+<li>field_timezone()
+: <a class="el" href="datetime_8php.html#a03900dcf0f9e3c58793a031673a70326">datetime.php</a>
+</li>
+<li>file_tag_decode()
+: <a class="el" href="taxonomy_8php.html#a08df5164926d2b31b8e9fcfe919de2b6">taxonomy.php</a>
+</li>
+<li>file_tag_encode()
+: <a class="el" href="taxonomy_8php.html#a3299482ac20e9d79453048dd52881d37">taxonomy.php</a>
+</li>
+<li>file_tag_file_query()
+: <a class="el" href="taxonomy_8php.html#a163b5131f388080b0fc82398d3a32fe1">taxonomy.php</a>
+</li>
+<li>fileas_widget()
+: <a class="el" href="contact__widgets_8php.html#a1eda66319d170f60a8d07c7ece95533b">contact_widgets.php</a>
+</li>
+<li>filer_content()
+: <a class="el" href="filer_8php.html#a5fd5d7e61b2f9c43cb5f110c89dc4274">filer.php</a>
+</li>
+<li>filerm_content()
+: <a class="el" href="filerm_8php.html#ae2eb28d2054fa2c37e38689882172208">filerm.php</a>
+</li>
+<li>filestorage_content()
+: <a class="el" href="filestorage_8php.html#a61bb1be78472555df4ce619f51014040">filestorage.php</a>
+</li>
+<li>filestorage_post()
+: <a class="el" href="filestorage_8php.html#ad3b64e3ece9831f9d3a9f00c0ae983cd">filestorage.php</a>
+</li>
+<li>find_thread_parent_index()
+: <a class="el" href="conversation_8php.html#ae59703b07ce2ddf627b4172ff26058b6">conversation.php</a>
+</li>
+<li>find_upstream_directory()
+: <a class="el" href="dir__fns_8php.html#a8c15aa69da12f2d3476b9e93b82b337d">dir_fns.php</a>
+</li>
+<li>find_xchan_in_array()
+: <a class="el" href="text_8php.html#ace3c98538c63e09b70a363210b414112">text.php</a>
+</li>
+<li>findpeople_widget()
+: <a class="el" href="contact__widgets_8php.html#a57e73ebcfd62bb5d8c7a7b9e663726d6">contact_widgets.php</a>
+</li>
+<li>first_post_date()
+: <a class="el" href="items_8php.html#a0cf98bb619f07dd18f602683a55a5f59">items.php</a>
+</li>
+<li>fix_attached_file_permissions()
+: <a class="el" href="item_8php.html#a3daae7944f737bd30412a0d042207c0f">item.php</a>
+</li>
+<li>fix_attached_photo_permissions()
+: <a class="el" href="item_8php.html#a7b63a9d0cd02096e17dcf11f4afa7c10">item.php</a>
+</li>
+<li>fix_mce_lf()
+: <a class="el" href="text_8php.html#afdc69fe3f6c09e35e46304dcea63ae28">text.php</a>
+</li>
+<li>fix_private_photos()
+: <a class="el" href="items_8php.html#aba98fcbbcd7044a7e9ea34edabc14c87">items.php</a>
+</li>
+<li>fix_system_urls()
+: <a class="el" href="boot_8php.html#aca5e42678e178c6b9034610d66666fd7">boot.php</a>
+</li>
+<li>fixacl()
+: <a class="el" href="acl__selectors_8php.html#ad6664fb8330308e23f2645cd6624727e">acl_selectors.php</a>
+</li>
+<li>follow_content()
+: <a class="el" href="mod_2follow_8php.html#a4c540ea4e9f5c581c1a53516ac585592">follow.php</a>
+</li>
+<li>follow_init()
+: <a class="el" href="mod_2follow_8php.html#a171f5b19f50d7738adc3b2e96ec6018a">follow.php</a>
+</li>
+<li>foreach
+: <a class="el" href="typo_8php.html#a329c9c12217d2c8660c47bbc7c8df4c5">typo.php</a>
+</li>
+<li>format_categories()
+: <a class="el" href="text_8php.html#a3054189cff173977f4216c9a3dd29e1b">text.php</a>
+</li>
+<li>format_css_if_exists()
+: <a class="el" href="plugin_8php.html#a9039e15aae27676af7777dcbee5a11d6">plugin.php</a>
+</li>
+<li>format_event_bbcode()
+: <a class="el" href="event_8php.html#abb74206cf42d694307c3d7abb7af9869">event.php</a>
+</li>
+<li>format_event_diaspora()
+: <a class="el" href="bb2diaspora_8php.html#a29a2ad41f5826f3975fa9a49934ff863">bb2diaspora.php</a>
+</li>
+<li>format_event_html()
+: <a class="el" href="event_8php.html#a2ac9f1b08de03250ecd794f705781d17">event.php</a>
+</li>
+<li>format_filer()
+: <a class="el" href="text_8php.html#a4e4d42b0a805148d9f9a92bcac89bf91">text.php</a>
+</li>
+<li>format_js_if_exists()
+: <a class="el" href="plugin_8php.html#ad9ff8ba554576383c5911a4bce068c1f">plugin.php</a>
+</li>
+<li>format_like()
+: <a class="el" href="conversation_8php.html#a3d8e30cc94f9a175054c021305d3aca3">conversation.php</a>
+</li>
+<li>format_location()
+: <a class="el" href="conversation_8php.html#a0891aaa4492cba2b51eda12fe01957f3">conversation.php</a>
+</li>
+<li>format_notification()
+: <a class="el" href="include_2notify_8php.html#a0e61728e487df50c72e6434f911a57d3">notify.php</a>
+</li>
+<li>format_term_for_display()
+: <a class="el" href="taxonomy_8php.html#adfead45e3b8a3dfb2b4a4b9281d0dbe1">taxonomy.php</a>
+</li>
+<li>fsuggest_content()
+: <a class="el" href="fsuggest_8php.html#aa6c49ed4b50a387f1845f36844dd7998">fsuggest.php</a>
+</li>
+<li>fsuggest_post()
+: <a class="el" href="fsuggest_8php.html#a61ecfe10ce937ed526614f8fd3de3c7d">fsuggest.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_0x67.html b/doc/html/globals_0x67.html
new file mode 100644
index 000000000..128e4ff68
--- /dev/null
+++ b/doc/html/globals_0x67.html
@@ -0,0 +1,363 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="globals_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_0x66.html#index_f"><span>f</span></a></li>
+ <li class="current"><a href="globals_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_0x67.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all file members with links to the files they belong to:</div>
+
+<h3><a class="anchor" id="index_g"></a>- g -</h3><ul>
+<li>gender_selector()
+: <a class="el" href="profile__selectors_8php.html#ae2b2c087e6530c61c0b256fd26d52355">profile_selectors.php</a>
+</li>
+<li>generate_user_guid()
+: <a class="el" href="text_8php.html#ae4f6881d7e13623f8eded6277595112a">text.php</a>
+</li>
+<li>get_account_id()
+: <a class="el" href="boot_8php.html#afe88b920aa285982edb817a0dd44eb37">boot.php</a>
+</li>
+<li>get_all_perms()
+: <a class="el" href="permissions_8php.html#aeca9b280f3dc3358c89976d81d690008">permissions.php</a>
+</li>
+<li>get_app()
+: <a class="el" href="boot_8php.html#a0e6db7e365f2b041a828b93786f694bc">boot.php</a>
+</li>
+<li>get_atom_elements()
+: <a class="el" href="items_8php.html#a896c1809d58f2d7a42cfe14577958ddf">items.php</a>
+</li>
+<li>get_bb_tag_pos()
+: <a class="el" href="bb2diaspora_8php.html#a4c2f8f11b29a06809d9b07782215b1b2">bb2diaspora.php</a>
+</li>
+<li>get_best_language()
+: <a class="el" href="language_8php.html#a980dee1d8715a98ab02e36b59facf8ed">language.php</a>
+</li>
+<li>get_birthdays()
+: <a class="el" href="identity_8php.html#ad2c97627a313d53df1a1c7b4215ddb51">identity.php</a>
+</li>
+<li>get_browser_language()
+: <a class="el" href="language_8php.html#ace67d6cad57da08d030ad9dc9b8c836e">language.php</a>
+</li>
+<li>get_capath()
+: <a class="el" href="include_2network_8php.html#a78e89557b2fbd344ad790846d761b0c7">network.php</a>
+</li>
+<li>get_cloudpath()
+: <a class="el" href="include_2attach_8php.html#a6aa00ea010ea030110faefb75eafc1ce">attach.php</a>
+</li>
+<li>get_config()
+: <a class="el" href="include_2config_8php.html#af02c96e6b37335774b548914ede1d22e">config.php</a>
+</li>
+<li>get_config_from_storage()
+: <a class="el" href="include_2config_8php.html#af08b7adb63adfb2eda7c466fba0cce74">config.php</a>
+</li>
+<li>get_custom_nav()
+: <a class="el" href="boot_8php.html#a899d24fd074594ceebbf72e1feff335f">boot.php</a>
+</li>
+<li>get_db_errno()
+: <a class="el" href="setup_8php.html#a8652788e8589778c5f81634a9d5b9429">setup.php</a>
+</li>
+<li>get_default_profile_photo()
+: <a class="el" href="identity_8php.html#ab1485a26b032956e1496fc08c58b83ed">identity.php</a>
+</li>
+<li>get_dim()
+: <a class="el" href="datetime_8php.html#a7df24d72ea05922d3127363e2295174c">datetime.php</a>
+</li>
+<li>get_events()
+: <a class="el" href="identity_8php.html#ae381db3d43f8e7c1da8b15d14ecf5312">identity.php</a>
+</li>
+<li>get_features()
+: <a class="el" href="features_8php.html#ae73c5b03b01c7284ed7e7e0e774e975c">features.php</a>
+</li>
+<li>get_feed_for()
+: <a class="el" href="items_8php.html#a04a35b610acfe54434df08adec39c0c7">items.php</a>
+</li>
+<li>get_first_dim()
+: <a class="el" href="datetime_8php.html#aba971b67f17fecf050813f1eba72367f">datetime.php</a>
+</li>
+<li>get_form_security_token()
+: <a class="el" href="security_8php.html#acd06ef411116115c2f0a92633700db8a">security.php</a>
+</li>
+<li>get_intltext_template()
+: <a class="el" href="plugin_8php.html#acb63c27d07f6d7dffe95f98a6cef1295">plugin.php</a>
+</li>
+<li>get_item_children()
+: <a class="el" href="conversation_8php.html#a7f6ef0dfa554bacf620e84c18d386e67">conversation.php</a>
+</li>
+<li>get_item_contact()
+: <a class="el" href="items_8php.html#aab9c6bae4c40799867596bdaae9829fd">items.php</a>
+</li>
+<li>get_item_elements()
+: <a class="el" href="items_8php.html#a536d0313b6ffe33b9d2490c4e25c5361">items.php</a>
+</li>
+<li>get_mail_elements()
+: <a class="el" href="items_8php.html#a94ddb1d6c8fa21dd7433677e85168037">items.php</a>
+</li>
+<li>get_markup_template()
+: <a class="el" href="plugin_8php.html#a75f7dfed291fd7add7fc85b5c022a1f4">plugin.php</a>
+</li>
+<li>get_max_import_size()
+: <a class="el" href="boot_8php.html#a97769915c9f14adc4f8ab1ea2cecfd90">boot.php</a>
+</li>
+<li>get_mentions()
+: <a class="el" href="text_8php.html#a76d1b3435c067978d7b484c45f56472b">text.php</a>
+</li>
+<li>get_mood_verbs()
+: <a class="el" href="text_8php.html#a736db13a966b8abaf8c9198faa35911a">text.php</a>
+</li>
+<li>get_my_address()
+: <a class="el" href="identity_8php.html#a490972c02fdb638c52ec0e012a30bfd2">identity.php</a>
+</li>
+<li>get_my_url()
+: <a class="el" href="identity_8php.html#aa46321e1cd6a3b8dfde8bf9510112fec">identity.php</a>
+</li>
+<li>get_observer_hash()
+: <a class="el" href="boot_8php.html#a623e49c79943f3e7bdb770d021683cf7">boot.php</a>
+</li>
+<li>get_pconfig()
+: <a class="el" href="include_2config_8php.html#ad58a4913937179adb13201c2ee3261ad">config.php</a>
+</li>
+<li>get_perms()
+: <a class="el" href="permissions_8php.html#a040fd3d3b8517658b1668ae0cd093972">permissions.php</a>
+</li>
+<li>get_plink()
+: <a class="el" href="text_8php.html#aac0969ae09853205992ba06ab9f9f61a">text.php</a>
+</li>
+<li>get_plugin_info()
+: <a class="el" href="plugin_8php.html#aff0178bd8d0b34a94d5efddc883edd35">plugin.php</a>
+</li>
+<li>get_poke_verbs()
+: <a class="el" href="text_8php.html#aa46f941155c2ac1155f2f17ffb0adb66">text.php</a>
+</li>
+<li>get_profile_elements()
+: <a class="el" href="items_8php.html#a251343637ff40a50cca93452cd530c26">items.php</a>
+</li>
+<li>get_public_feed()
+: <a class="el" href="items_8php.html#a079e099e15d88d47aeb6ca6d60da7107">items.php</a>
+</li>
+<li>get_rel_link()
+: <a class="el" href="text_8php.html#a3972701c5c83624ec4e2d06242f614e7">text.php</a>
+</li>
+<li>get_rpost_path()
+: <a class="el" href="zot_8php.html#a8e22dbc6f884be3644a892a876cbd972">zot.php</a>
+</li>
+<li>get_sys_channel()
+: <a class="el" href="identity_8php.html#aaff86ee3b5984821e7a256c2da5f1a51">identity.php</a>
+</li>
+<li>get_tags()
+: <a class="el" href="text_8php.html#a4659fbc4e54ddc700c3aa66b9092c623">text.php</a>
+</li>
+<li>get_terms_oftype()
+: <a class="el" href="taxonomy_8php.html#a0fb8cf0ac7bcbc8b27d856fe9bf69cd1">taxonomy.php</a>
+</li>
+<li>get_theme_config_file()
+: <a class="el" href="settings_8php.html#a39abc76ff5459c57e3b957664f273f18">settings.php</a>
+</li>
+<li>get_theme_info()
+: <a class="el" href="plugin_8php.html#ad48de9c0fb7f19413a2aa49250d00405">plugin.php</a>
+</li>
+<li>get_theme_screenshot()
+: <a class="el" href="plugin_8php.html#a48047edfbef770125a5508dcc2f9282f">plugin.php</a>
+</li>
+<li>get_theme_uid()
+: <a class="el" href="identity_8php.html#aaeb666872995e3ab8da8f7bc5f3b2bd3">identity.php</a>
+</li>
+<li>get_things()
+: <a class="el" href="taxonomy_8php.html#a7747fa859ac56fbffd4f9782d85505de">taxonomy.php</a>
+</li>
+<li>get_xconfig()
+: <a class="el" href="include_2config_8php.html#aa3dc1d3de2d091ac702e675acd3a085e">config.php</a>
+</li>
+<li>goaway()
+: <a class="el" href="boot_8php.html#a5ab6181607a090bcdbaa13b15b85aba1">boot.php</a>
+</li>
+<li>gprobe_run()
+: <a class="el" href="gprobe_8php.html#adf72cb0a70b5b9d99fdec1cc60e18ed1">gprobe.php</a>
+</li>
+<li>GRAVITY_COMMENT
+: <a class="el" href="boot_8php.html#a4a12ce5de39789b0361e308d89925a20">boot.php</a>
+</li>
+<li>GRAVITY_LIKE
+: <a class="el" href="boot_8php.html#a1f5906598e90b5ea2b4245f682be4348">boot.php</a>
+</li>
+<li>GRAVITY_PARENT
+: <a class="el" href="boot_8php.html#a2af173e4e9836ee7c90757b4793a2be3">boot.php</a>
+</li>
+<li>group_add()
+: <a class="el" href="include_2group_8php.html#a06ec565d2b64e79044e7c1bf91a2a4ce">group.php</a>
+</li>
+<li>group_add_member()
+: <a class="el" href="include_2group_8php.html#a0122ef312df2c5546b1a46b3e6c7b31b">group.php</a>
+</li>
+<li>group_byname()
+: <a class="el" href="include_2group_8php.html#abd66a5ea34a07a3422dc2dde6c7b3ecb">group.php</a>
+</li>
+<li>group_content()
+: <a class="el" href="mod_2group_8php.html#a07a64f6c65b0080d8190b3d9728a7a83">group.php</a>
+</li>
+<li>group_get_members()
+: <a class="el" href="include_2group_8php.html#a5bd191d9692e6c34d48c0ede10810f09">group.php</a>
+</li>
+<li>group_post()
+: <a class="el" href="mod_2group_8php.html#aed1f009b1221348021bb34761160ef35">group.php</a>
+</li>
+<li>group_rec_byhash()
+: <a class="el" href="include_2group_8php.html#a90e157b3e1b99c981809cb5a2abd3245">group.php</a>
+</li>
+<li>group_rmv()
+: <a class="el" href="include_2group_8php.html#a4118f498bbd1530c1d0136d016d197a5">group.php</a>
+</li>
+<li>group_rmv_member()
+: <a class="el" href="include_2group_8php.html#a540e3ef36f47d47532646be4241f6518">group.php</a>
+</li>
+<li>group_select()
+: <a class="el" href="acl__selectors_8php.html#aa1e3bc344ca2b29f97eb9860216d21a0">acl_selectors.php</a>
+</li>
+<li>group_side()
+: <a class="el" href="include_2group_8php.html#a6a69bd7be032fa8ce4e49c43a42cc6e9">group.php</a>
+</li>
+<li>groups_containing()
+: <a class="el" href="include_2group_8php.html#afb802ae2ce73aae4bc36d157f7b6a92f">group.php</a>
+</li>
+<li>guess_image_type()
+: <a class="el" href="photo__driver_8php.html#a243cee492ce443afb6a7d77d54b6c4aa">photo_driver.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_0x68.html b/doc/html/globals_0x68.html
new file mode 100644
index 000000000..9d9ea946c
--- /dev/null
+++ b/doc/html/globals_0x68.html
@@ -0,0 +1,228 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="globals_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_0x67.html#index_g"><span>g</span></a></li>
+ <li class="current"><a href="globals_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_0x68.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all file members with links to the files they belong to:</div>
+
+<h3><a class="anchor" id="index_h"></a>- h -</h3><ul>
+<li>handle_tag()
+: <a class="el" href="item_8php.html#aa22feef4de326e1d7078dedd892e615c">item.php</a>
+</li>
+<li>has_permissions()
+: <a class="el" href="items_8php.html#a77051724d1784074ff187e73a4db93fe">items.php</a>
+</li>
+<li>head_add_css()
+: <a class="el" href="plugin_8php.html#a23c4fccf1eb5fcd63b24783ba1f05f7a">plugin.php</a>
+</li>
+<li>head_add_js()
+: <a class="el" href="plugin_8php.html#a516591850f4fd49fd1425cfa54089db8">plugin.php</a>
+</li>
+<li>head_get_css()
+: <a class="el" href="plugin_8php.html#af92789f559b89a380e49d303218aeeca">plugin.php</a>
+</li>
+<li>head_get_icon()
+: <a class="el" href="boot_8php.html#a24a7a70afedd5d85fe0eadc85afa9f77">boot.php</a>
+</li>
+<li>head_get_js()
+: <a class="el" href="plugin_8php.html#a65ab52cb1a7030d5190e247211bef2a1">plugin.php</a>
+</li>
+<li>head_remove_css()
+: <a class="el" href="plugin_8php.html#a9ab6caae31935f6cf781ce7872db7cdf">plugin.php</a>
+</li>
+<li>head_remove_js()
+: <a class="el" href="plugin_8php.html#a4a0ae7b881e7c8af99a69e3b03f898b4">plugin.php</a>
+</li>
+<li>head_set_icon()
+: <a class="el" href="boot_8php.html#a0e4701c9742c3ef88f02ac450a042a84">boot.php</a>
+</li>
+<li>help_content()
+: <a class="el" href="help_8php.html#af055e15f600ffa6fbca9386fdf715224">help.php</a>
+</li>
+<li>home_content()
+: <a class="el" href="home_8php.html#aa1cf697851a646755baf537f75334c46">home.php</a>
+</li>
+<li>home_init()
+: <a class="el" href="home_8php.html#ac4642c38b6f23a8d065dd4a75c620bde">home.php</a>
+</li>
+<li>hostxrd_init()
+: <a class="el" href="hostxrd_8php.html#aa37ffc8e7900bc76c4828bd25916db92">hostxrd.php</a>
+</li>
+<li>html2bb_video()
+: <a class="el" href="text_8php.html#a138a3a611fa7f4f3630674145fc826bf">text.php</a>
+</li>
+<li>html2bbcode()
+: <a class="el" href="html2bbcode_8php.html#a5ad726995ac4070213abdb3bd09f4837">html2bbcode.php</a>
+</li>
+<li>html2plain()
+: <a class="el" href="html2plain_8php.html#ab3e121fa9f3feb16f9f942e705bc6c04">html2plain.php</a>
+</li>
+<li>http_status_exit()
+: <a class="el" href="include_2network_8php.html#a4cfb2c05a1c295317283d762440ce0b2">network.php</a>
+</li>
+<li>HUBLOC_FLAGS_DELETED
+: <a class="el" href="boot_8php.html#a7c286add8961fd2d79216314cd4aadd8">boot.php</a>
+</li>
+<li>HUBLOC_FLAGS_PRIMARY
+: <a class="el" href="boot_8php.html#a3ad9cc5d4354be741fa1de12b96e9955">boot.php</a>
+</li>
+<li>HUBLOC_FLAGS_UNVERIFIED
+: <a class="el" href="boot_8php.html#ab54b24cc302e1a42a67a49d788b6b764">boot.php</a>
+</li>
+<li>HUBLOC_NOTUSED
+: <a class="el" href="boot_8php.html#aa589421267f0c2f0d643f727792cce35">boot.php</a>
+</li>
+<li>HUBLOC_OFFLINE
+: <a class="el" href="boot_8php.html#a845891f82bf6edd7fa2d578b66703112">boot.php</a>
+</li>
+<li>HUBLOC_RECEIVE_ERROR
+: <a class="el" href="boot_8php.html#abeb4d86e17cefa8584f1244e2183b0e1">boot.php</a>
+</li>
+<li>HUBLOC_SEND_ERROR
+: <a class="el" href="boot_8php.html#a3b56bfc6a0dd159070e316ddac3b7456">boot.php</a>
+</li>
+<li>HUBLOC_WORKS
+: <a class="el" href="boot_8php.html#a7a8ba64d089cc0412c59a2eefc6d655c">boot.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_0x69.html b/doc/html/globals_0x69.html
new file mode 100644
index 000000000..14705638b
--- /dev/null
+++ b/doc/html/globals_0x69.html
@@ -0,0 +1,352 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="globals_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_0x68.html#index_h"><span>h</span></a></li>
+ <li class="current"><a href="globals_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_0x69.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all file members with links to the files they belong to:</div>
+
+<h3><a class="anchor" id="index_i"></a>- i -</h3><ul>
+<li>identity_basic_export()
+: <a class="el" href="identity_8php.html#a3570a4eb77332b292d394c4132cb8f03">identity.php</a>
+</li>
+<li>identity_check_service_class()
+: <a class="el" href="identity_8php.html#ac9fcd5c4c371998790b5c55c3d0f4633">identity.php</a>
+</li>
+<li>ids_to_querystr()
+: <a class="el" href="text_8php.html#a436a8de00c942364c2d0fcfc7e1f4b5a">text.php</a>
+</li>
+<li>if
+: <a class="el" href="php2po_8php.html#a45b05625748f412ec97afcd61cf7980b">php2po.php</a>
+, <a class="el" href="redbasic_2php_2style_8php.html#a883f9f14e205f7aa7de02c14df67b40a">style.php</a>
+, <a class="el" href="php_2default_8php.html#a23bc1996b18e69c1a3ab44536613a762">default.php</a>
+, <a class="el" href="full_8php.html#a6fac1b4b8cdfde06ea1b7713479e92db">full.php</a>
+, <a class="el" href="apw_2php_2style_8php.html#a883f9f14e205f7aa7de02c14df67b40a">style.php</a>
+</li>
+<li>import_author_xchan()
+: <a class="el" href="items_8php.html#ae73794179b62d39bb597ff670ab1c1e5">items.php</a>
+</li>
+<li>import_author_zot()
+: <a class="el" href="zot_8php.html#ad149f1e98c0c5b88ff9147e6ee3f330d">zot.php</a>
+</li>
+<li>import_channel_photo()
+: <a class="el" href="photo__driver_8php.html#a1d0bc7161dec0d177b7d3bbe4421af9a">photo_driver.php</a>
+</li>
+<li>import_content()
+: <a class="el" href="import_8php.html#afdf25ed70096d5dbf4f6d0ca79fea184">import.php</a>
+</li>
+<li>import_directory_keywords()
+: <a class="el" href="zot_8php.html#a3bf11286c2619b4ca28e49d5b5ab374a">zot.php</a>
+</li>
+<li>import_directory_profile()
+: <a class="el" href="zot_8php.html#aeec89da5b6ff090c63a79de4de884a35">zot.php</a>
+</li>
+<li>import_post()
+: <a class="el" href="import_8php.html#af17fef0410518f7eac205d0ea416eaa2">import.php</a>
+</li>
+<li>import_profile_photo()
+: <a class="el" href="photo__driver_8php.html#a78f5a10c568d2a9bbbb129dc96548887">photo_driver.php</a>
+</li>
+<li>import_site()
+: <a class="el" href="zot_8php.html#a2657e141d62d5f67ad3c87651b585299">zot.php</a>
+</li>
+<li>import_xchan()
+: <a class="el" href="zot_8php.html#a56f3f65514e4e7f0cd117d01735aebd1">zot.php</a>
+</li>
+<li>in_arrayi()
+: <a class="el" href="text_8php.html#a75c326298519ed14ebe762194c8a3f2a">text.php</a>
+</li>
+<li>info()
+: <a class="el" href="boot_8php.html#adfb2fc7be5a4226c0a8e24131da9d498">boot.php</a>
+</li>
+<li>insert_hook()
+: <a class="el" href="plugin_8php.html#aeaebe63dcf6fa2794f363ba2bc0b2c6b">plugin.php</a>
+</li>
+<li>install_plugin()
+: <a class="el" href="plugin_8php.html#a482131013272a1d5d5c1b1469c6c55d5">plugin.php</a>
+</li>
+<li>invite_content()
+: <a class="el" href="invite_8php.html#a244385b28cfd021d308715f01158bfd9">invite.php</a>
+</li>
+<li>invite_post()
+: <a class="el" href="invite_8php.html#aeb0881c0f93c8e8552e5ed756ce6e5a5">invite.php</a>
+</li>
+<li>is_a_date_arg()
+: <a class="el" href="text_8php.html#a1557112a774ec00fa06ed6b6f6495506">text.php</a>
+</li>
+<li>is_ajax()
+: <a class="el" href="boot_8php.html#ac17fc8a416ea79e9d5cb4dc9a8ff8c5c">boot.php</a>
+</li>
+<li>is_foreigner()
+: <a class="el" href="identity_8php.html#ae2b140df652a55ca11bb6a99005fce35">identity.php</a>
+</li>
+<li>is_member()
+: <a class="el" href="identity_8php.html#a9637c557e13d9671f3eeb124ab98212a">identity.php</a>
+</li>
+<li>is_site_admin()
+: <a class="el" href="boot_8php.html#aa1e828bbbcba170265eb2668d8daf42e">boot.php</a>
+</li>
+<li>ITEM_BLOCKED
+: <a class="el" href="boot_8php.html#ab28dc518fa90b6f617dd8c564eb4f35f">boot.php</a>
+</li>
+<li>ITEM_BUG
+: <a class="el" href="boot_8php.html#a87b0f279f8413c7e4d805c5d85f20d34">boot.php</a>
+</li>
+<li>ITEM_BUILDBLOCK
+: <a class="el" href="boot_8php.html#a7fc4b291a7cdaa48b38e27344ea183cf">boot.php</a>
+</li>
+<li>item_check_service_class()
+: <a class="el" href="item_8php.html#a5b1b36cb301a94b38150074f0d424e74">item.php</a>
+</li>
+<li>item_content()
+: <a class="el" href="item_8php.html#a764bbb2e9a885a86fb23d0b5e4a09221">item.php</a>
+</li>
+<li>ITEM_DELAYED_PUBLISH
+: <a class="el" href="boot_8php.html#ac890557fedc5b5a3b1d996249b1e1a20">boot.php</a>
+</li>
+<li>ITEM_DELETED
+: <a class="el" href="boot_8php.html#a3515ea6bf77495de89b93e9ccd881c49">boot.php</a>
+</li>
+<li>item_expire()
+: <a class="el" href="items_8php.html#a6f7e1334af5d684a987fa6a3eb37f4cc">items.php</a>
+</li>
+<li>item_extract_images()
+: <a class="el" href="conversation_8php.html#a0ee05f15255fb1cc3d89f30bc378a654">conversation.php</a>
+</li>
+<li>item_getfeedattach()
+: <a class="el" href="items_8php.html#a09d425596b9f8663472cf7474ad36d96">items.php</a>
+</li>
+<li>item_getfeedtags()
+: <a class="el" href="items_8php.html#a649dc3e53ed794d0ead4b5d037f8d8d7">items.php</a>
+</li>
+<li>ITEM_HIDDEN
+: <a class="el" href="boot_8php.html#ac99fc4d040764eac1736bec6973556fe">boot.php</a>
+</li>
+<li>ITEM_MENTIONSME
+: <a class="el" href="boot_8php.html#a8da836617174eed9fc2ac8054125354b">boot.php</a>
+</li>
+<li>item_message_id()
+: <a class="el" href="text_8php.html#aa6b0aa8afbeab50d1a3058ad21acb74e">text.php</a>
+</li>
+<li>ITEM_MODERATED
+: <a class="el" href="boot_8php.html#ac01230c7655e0705b2e99c9bc03c4450">boot.php</a>
+</li>
+<li>ITEM_NOCOMMENT
+: <a class="el" href="boot_8php.html#a949116d9a295b214293006c060ca4848">boot.php</a>
+</li>
+<li>ITEM_NOTSHOWN
+: <a class="el" href="boot_8php.html#a8663f32171568489dbb2a01dd00371f8">boot.php</a>
+</li>
+<li>ITEM_NSFW
+: <a class="el" href="boot_8php.html#a939de9a99278f4fd7dcd0ee67f243f08">boot.php</a>
+</li>
+<li>ITEM_OBSCURED
+: <a class="el" href="boot_8php.html#a2c8906f1af94a3559a5b4661067bb79d">boot.php</a>
+</li>
+<li>ITEM_ORIGIN
+: <a class="el" href="boot_8php.html#a8c9dce0ef27b35397e29298eb966f7f7">boot.php</a>
+</li>
+<li>ITEM_PDL
+: <a class="el" href="boot_8php.html#a6e57d913634d033b4d5ad72d99fd3e9d">boot.php</a>
+</li>
+<li>item_permissions_sql()
+: <a class="el" href="security_8php.html#a9355488460ab11d6058656ff919e5cf9">security.php</a>
+</li>
+<li>item_photo_menu()
+: <a class="el" href="conversation_8php.html#aacbb12d372d5e9c3ab0735b4aea48fb3">conversation.php</a>
+</li>
+<li>item_post()
+: <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item.php</a>
+</li>
+<li>item_post_type()
+: <a class="el" href="text_8php.html#ac1dbf2e37e8069bea2c0f557fdbf203e">text.php</a>
+</li>
+<li>item_redir_and_replace_images()
+: <a class="el" href="conversation_8php.html#adda79b75bf1ccf6ce9503aa310953533">conversation.php</a>
+</li>
+<li>ITEM_RELAY
+: <a class="el" href="boot_8php.html#a2958a2bd5422b85329d7c36c06dbc221">boot.php</a>
+</li>
+<li>ITEM_SPAM
+: <a class="el" href="boot_8php.html#a40d885b2cfd736aab4234ae641ca4dfb">boot.php</a>
+</li>
+<li>ITEM_STARRED
+: <a class="el" href="boot_8php.html#a7af107fab8d62b9a73801713b774ed30">boot.php</a>
+</li>
+<li>item_store()
+: <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">items.php</a>
+</li>
+<li>item_store_update()
+: <a class="el" href="items_8php.html#acf0bf7c9d21ac84f32effb754f7ad484">items.php</a>
+</li>
+<li>ITEM_THREAD_TOP
+: <a class="el" href="boot_8php.html#a749144d8dd9c1366596a0213c277d050">boot.php</a>
+</li>
+<li>ITEM_UNPUBLISHED
+: <a class="el" href="boot_8php.html#adaeb4f590c56326b2dca3b19f31b6272">boot.php</a>
+</li>
+<li>ITEM_UNSEEN
+: <a class="el" href="boot_8php.html#a009e6a0637cb65804ea8094ecc4450b0">boot.php</a>
+</li>
+<li>ITEM_UPLINK
+: <a class="el" href="boot_8php.html#aefba06f1c0842036329033e7567ecf6d">boot.php</a>
+</li>
+<li>ITEM_UPLINK_PRV
+: <a class="el" href="boot_8php.html#aad33b494084f729b6ee3b0bc457718a1">boot.php</a>
+</li>
+<li>ITEM_VERIFIED
+: <a class="el" href="boot_8php.html#a18a400fa45e5632811b33041d8c048bf">boot.php</a>
+</li>
+<li>ITEM_VISIBLE
+: <a class="el" href="boot_8php.html#ab55b16ae7fc19fafe5afaedd49163bbf">boot.php</a>
+</li>
+<li>ITEM_WALL
+: <a class="el" href="boot_8php.html#a6788e99021ec8ffb0fa94d651f22a322">boot.php</a>
+</li>
+<li>ITEM_WEBPAGE
+: <a class="el" href="boot_8php.html#af489d0c3166551b93e63a79ff2c9be35">boot.php</a>
+</li>
+<li>items_fetch()
+: <a class="el" href="items_8php.html#a756738301f2ed96be50232500677d58a">items.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_0x6a.html b/doc/html/globals_0x6a.html
new file mode 100644
index 000000000..6d66a0bd4
--- /dev/null
+++ b/doc/html/globals_0x6a.html
@@ -0,0 +1,162 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="globals_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_0x69.html#index_i"><span>i</span></a></li>
+ <li class="current"><a href="globals_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_0x6a.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all file members with links to the files they belong to:</div>
+
+<h3><a class="anchor" id="index_j"></a>- j -</h3><ul>
+<li>jindent()
+: <a class="el" href="text_8php.html#ae17b39d5e321debd3ad16dcbbde842b8">text.php</a>
+</li>
+<li>JPEG_QUALITY
+: <a class="el" href="boot_8php.html#a3475ff6c2e575f946ea0ee377e944173">boot.php</a>
+</li>
+<li>json_decode_plus()
+: <a class="el" href="text_8php.html#a0271381208acfa2d4cff36da281e3e23">text.php</a>
+</li>
+<li>json_return_and_die()
+: <a class="el" href="include_2network_8php.html#a4c5d50079e089168d9248427018fffd4">network.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_0x6b.html b/doc/html/globals_0x6b.html
new file mode 100644
index 000000000..54bff469b
--- /dev/null
+++ b/doc/html/globals_0x6b.html
@@ -0,0 +1,156 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="globals_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_0x6a.html#index_j"><span>j</span></a></li>
+ <li class="current"><a href="globals_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_0x6b.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all file members with links to the files they belong to:</div>
+
+<h3><a class="anchor" id="index_k"></a>- k -</h3><ul>
+<li>KEY_NOT_EXISTS
+: <a class="el" href="template__processor_8php.html#a797745996c7839a93b2ab1af456631ab">template_processor.php</a>
+</li>
+<li>killme()
+: <a class="el" href="boot_8php.html#aea7fc57a4d8e9dcb42f2601b0b9b761c">boot.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_0x6c.html b/doc/html/globals_0x6c.html
new file mode 100644
index 000000000..08820eb43
--- /dev/null
+++ b/doc/html/globals_0x6c.html
@@ -0,0 +1,252 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="globals_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_0x6b.html#index_k"><span>k</span></a></li>
+ <li class="current"><a href="globals_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_0x6c.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all file members with links to the files they belong to:</div>
+
+<h3><a class="anchor" id="index_l"></a>- l -</h3><ul>
+<li>lang_selector()
+: <a class="el" href="text_8php.html#a71f6952243d3fe1c5a8154f78027e29c">text.php</a>
+</li>
+<li>LANGUAGE_DETECT_MIN_CONFIDENCE
+: <a class="el" href="boot_8php.html#a68d1d5bc9c7ccb663dc671b48c66df11">boot.php</a>
+</li>
+<li>LANGUAGE_DETECT_MIN_LENGTH
+: <a class="el" href="boot_8php.html#a17cf72338b040891781a4bcbdd9a8595">boot.php</a>
+</li>
+<li>layout_select()
+: <a class="el" href="text_8php.html#a3999a0b3e22e440f280ee791ce34d384">text.php</a>
+</li>
+<li>layouts_content()
+: <a class="el" href="layouts_8php.html#a6e0193759ad9eef76d3df2db24237b50">layouts.php</a>
+</li>
+<li>legal_webbie()
+: <a class="el" href="text_8php.html#a2690ad67bb6fb97ef69de3e8d23f2728">text.php</a>
+</li>
+<li>like_content()
+: <a class="el" href="like_8php.html#a9d7dd268f21c21e9d29dd2aca2dd9538">like.php</a>
+</li>
+<li>like_puller()
+: <a class="el" href="conversation_8php.html#afe5b2f38d8b803edb0d7ec5fa2868db0">conversation.php</a>
+</li>
+<li>limit_body_size()
+: <a class="el" href="items_8php.html#af94c281016c6c912d06e064113336c5c">items.php</a>
+</li>
+<li>link_compare()
+: <a class="el" href="text_8php.html#a47c1e4a5f3f53027daacd8a9db24f285">text.php</a>
+</li>
+<li>linkify()
+: <a class="el" href="text_8php.html#a11255c8c4e5245b6c24f97684826aa54">text.php</a>
+</li>
+<li>list_public_sites()
+: <a class="el" href="dirsearch_8php.html#a985d410a170549429857af6ff2673149">dirsearch.php</a>
+</li>
+<li>load_config()
+: <a class="el" href="include_2config_8php.html#a27559f388c9b9af81c94e48d6889d1d1">config.php</a>
+</li>
+<li>load_contact_links()
+: <a class="el" href="boot_8php.html#a719c7f3972d5f9268f37a41c76cd4ef6">boot.php</a>
+</li>
+<li>load_database()
+: <a class="el" href="setup_8php.html#ad2e0375a9ab87ebe6e78124ee125054a">setup.php</a>
+</li>
+<li>load_database_rem()
+: <a class="el" href="setup_8php.html#a2b375ddc555140236fc500135de99371">setup.php</a>
+</li>
+<li>load_hooks()
+: <a class="el" href="plugin_8php.html#a326365e48ef94f0b9a0a771b8d75e813">plugin.php</a>
+</li>
+<li>load_pconfig()
+: <a class="el" href="include_2config_8php.html#ac543813a980b3841cc5a277fcd4a24a6">config.php</a>
+</li>
+<li>load_plugin()
+: <a class="el" href="plugin_8php.html#a9ca9632b7309a65b05c03a3e2f473a3d">plugin.php</a>
+</li>
+<li>load_translation_table()
+: <a class="el" href="language_8php.html#a7e9904c730bb24ddcb0ff50fc96f6b05">language.php</a>
+</li>
+<li>load_xconfig()
+: <a class="el" href="include_2config_8php.html#a55bbed9a014c9109c767486834f3ca33">config.php</a>
+</li>
+<li>local_user()
+: <a class="el" href="boot_8php.html#ad4c9dc2c8a82e8f52b7404c1655eab44">boot.php</a>
+</li>
+<li>localize_item()
+: <a class="el" href="conversation_8php.html#a9bd7f9fb6678736c581bcba3b17f471c">conversation.php</a>
+</li>
+<li>lockview_content()
+: <a class="el" href="lockview_8php.html#a851e26ab9a1008df5c5ebebea31e9b44">lockview.php</a>
+</li>
+<li>logger()
+: <a class="el" href="text_8php.html#a030fa5ecc64168af0c4f44897a9bce63">text.php</a>
+</li>
+<li>LOGGER_ALL
+: <a class="el" href="boot_8php.html#afe63ae69ba55299f813766e54df06ede">boot.php</a>
+</li>
+<li>LOGGER_DATA
+: <a class="el" href="boot_8php.html#a6969947145a139ec374ce098224d8e81">boot.php</a>
+</li>
+<li>LOGGER_DEBUG
+: <a class="el" href="boot_8php.html#a93823d15ae07548a4c49de88d325cd26">boot.php</a>
+</li>
+<li>LOGGER_NORMAL
+: <a class="el" href="boot_8php.html#a17b4ea23d9ecf628d9c8f53b7abcb805">boot.php</a>
+</li>
+<li>LOGGER_TRACE
+: <a class="el" href="boot_8php.html#a022cea669f9f13ef7c6268b63884c57f">boot.php</a>
+</li>
+<li>login()
+: <a class="el" href="boot_8php.html#aefecf8599036df7f1b95d6820e0e2fa4">boot.php</a>
+</li>
+<li>login_content()
+: <a class="el" href="login_8php.html#a1d69ca88eb9005a7026e128b9a645904">login.php</a>
+</li>
+<li>lostpass_content()
+: <a class="el" href="lostpass_8php.html#a0314d94e48c789b1b3a201d740c9eab3">lostpass.php</a>
+</li>
+<li>lostpass_post()
+: <a class="el" href="lostpass_8php.html#a8ed35ba71a4404eaf4903da61d0321cc">lostpass.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_0x6d.html b/doc/html/globals_0x6d.html
new file mode 100644
index 000000000..2b20745d9
--- /dev/null
+++ b/doc/html/globals_0x6d.html
@@ -0,0 +1,285 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="globals_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_0x6c.html#index_l"><span>l</span></a></li>
+ <li class="current"><a href="globals_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_0x6d.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all file members with links to the files they belong to:</div>
+
+<h3><a class="anchor" id="index_m"></a>- m -</h3><ul>
+<li>magic_init()
+: <a class="el" href="magic_8php.html#acea2cc792849ca2d71d4b689f66518bf">magic.php</a>
+</li>
+<li>magic_link()
+: <a class="el" href="text_8php.html#a1e510c53624933ce9b7d6715784894db">text.php</a>
+</li>
+<li>magiclink_url()
+: <a class="el" href="text_8php.html#a24d441d30df4b8e6bf6780bf62a5e2c6">text.php</a>
+</li>
+<li>mail_content()
+: <a class="el" href="mail_8php.html#a3c7c485fc69f92371e8b20936040eca1">mail.php</a>
+</li>
+<li>MAIL_DELETED
+: <a class="el" href="boot_8php.html#ad0876e837cf3fad8a26417e315f6e2c8">boot.php</a>
+</li>
+<li>MAIL_ISREPLY
+: <a class="el" href="boot_8php.html#aa544a6c078130d0967a1f4ed8ce0a2d2">boot.php</a>
+</li>
+<li>MAIL_OBSCURED
+: <a class="el" href="boot_8php.html#a44ae1542a805ffd7f826fb511db07374">boot.php</a>
+</li>
+<li>mail_post()
+: <a class="el" href="mail_8php.html#acfc2cc0bf4e0b178207758384977f25a">mail.php</a>
+</li>
+<li>MAIL_RECALLED
+: <a class="el" href="boot_8php.html#ae4861de36017fe399c1839f778bad9f5">boot.php</a>
+</li>
+<li>MAIL_REPLIED
+: <a class="el" href="boot_8php.html#aa3679df31c8dad1b71816b0322d5baff">boot.php</a>
+</li>
+<li>MAIL_SEEN
+: <a class="el" href="boot_8php.html#a1fbb93cf030f07391f22cc2948744869">boot.php</a>
+</li>
+<li>mail_store()
+: <a class="el" href="items_8php.html#a77da7ce9a117601d49ac4a67c71b514f">items.php</a>
+</li>
+<li>manage_content()
+: <a class="el" href="manage_8php.html#a2bca247b5296827638959138367db4f5">manage.php</a>
+</li>
+<li>manual_config()
+: <a class="el" href="setup_8php.html#abe405d227ba7232971964a706d4f3bce">setup.php</a>
+</li>
+<li>map_scope()
+: <a class="el" href="items_8php.html#ac1fcf621dce7370515b420a7753f4726">items.php</a>
+</li>
+<li>marital_selector()
+: <a class="el" href="profile__selectors_8php.html#a7473dd095987e1cdcc79d4f0bb5e6798">profile_selectors.php</a>
+</li>
+<li>match_content()
+: <a class="el" href="match_8php.html#a1dd853e959b9e70c1911bb2fb5f5130d">match.php</a>
+</li>
+<li>MAX_IMAGE_LENGTH
+: <a class="el" href="boot_8php.html#a525ca93ff35d3535d1a2b8ba57876afa">boot.php</a>
+</li>
+<li>MAX_LIKERS
+: <a class="el" href="boot_8php.html#a35625dacd2158b9f1f1a8e77f9f081fd">boot.php</a>
+</li>
+<li>member_of()
+: <a class="el" href="include_2group_8php.html#a048f6892bfd28852de1b76470df411de">group.php</a>
+</li>
+<li>menu_add_item()
+: <a class="el" href="include_2menu_8php.html#add35fae5e9695031b3d46e30ac409eb8">menu.php</a>
+</li>
+<li>menu_content()
+: <a class="el" href="mod_2menu_8php.html#a6fed23af14d71a78a4153c8363a685cf">menu.php</a>
+</li>
+<li>menu_create()
+: <a class="el" href="include_2menu_8php.html#a08a800821721781a8dfffbe31481ff98">menu.php</a>
+</li>
+<li>menu_del_item()
+: <a class="el" href="include_2menu_8php.html#a9aa8e0052dd47c1a93f53a983bd4620a">menu.php</a>
+</li>
+<li>menu_delete()
+: <a class="el" href="include_2menu_8php.html#a3884bda4d85d84ec99447db9403a68d8">menu.php</a>
+</li>
+<li>menu_delete_id()
+: <a class="el" href="include_2menu_8php.html#ad87f51ce85172bcc3f931aa0cd96a804">menu.php</a>
+</li>
+<li>menu_edit()
+: <a class="el" href="include_2menu_8php.html#a6a33c6a3db2a7510b16cc656edaec571">menu.php</a>
+</li>
+<li>menu_edit_item()
+: <a class="el" href="include_2menu_8php.html#acb66f80ca895a6ccd562b3d9ae7b41aa">menu.php</a>
+</li>
+<li>menu_fetch()
+: <a class="el" href="include_2menu_8php.html#a68ebbf492470c930f652013656f9071d">menu.php</a>
+</li>
+<li>menu_fetch_id()
+: <a class="el" href="include_2menu_8php.html#a47447c01ba8ea04cd74af1d4c5b68fc7">menu.php</a>
+</li>
+<li>MENU_ITEM_NEWWIN
+: <a class="el" href="boot_8php.html#ad11f30a6590d3d77f0c5e1e3909af8f5">boot.php</a>
+</li>
+<li>MENU_ITEM_ZID
+: <a class="el" href="boot_8php.html#aed0dfb35f7dd00dc9e4f868ea7f7ff53">boot.php</a>
+</li>
+<li>menu_list()
+: <a class="el" href="include_2menu_8php.html#acef15a498d52666b1c7e5c12765c689b">menu.php</a>
+</li>
+<li>menu_post()
+: <a class="el" href="mod_2menu_8php.html#aaa491ef173868fe002aece4632bcf393">menu.php</a>
+</li>
+<li>menu_render()
+: <a class="el" href="include_2menu_8php.html#a890cc6237971e15f15702e6b2e88502e">menu.php</a>
+</li>
+<li>message_content()
+: <a class="el" href="mod_2message_8php.html#ac72dfed3ce08fcb331d66b37edc6e15f">message.php</a>
+</li>
+<li>micropro()
+: <a class="el" href="text_8php.html#a2a902f5fdba8646333e997898ac45ea3">text.php</a>
+</li>
+<li>mimetype_select()
+: <a class="el" href="text_8php.html#a1633412120f52bdce5f43e0a127d9293">text.php</a>
+</li>
+<li>mini_group_select()
+: <a class="el" href="include_2group_8php.html#ab0e422a0f31c0c64fd9084ca03d85f32">group.php</a>
+</li>
+<li>mitem_content()
+: <a class="el" href="mitem_8php.html#a7a31b702ecad18eeb6a38b243ff0037e">mitem.php</a>
+</li>
+<li>mitem_init()
+: <a class="el" href="mitem_8php.html#a9627cd857cafdf04e4fc0ae48c8e8518">mitem.php</a>
+</li>
+<li>mitem_post()
+: <a class="el" href="mitem_8php.html#a6ee694cca4b551a20d7c7a94b5243ec1">mitem.php</a>
+</li>
+<li>mood_content()
+: <a class="el" href="mood_8php.html#a721b9b6703b3234a005641c92d409b8f">mood.php</a>
+</li>
+<li>mood_init()
+: <a class="el" href="mood_8php.html#a7ae136dd7476865b4828136175db5022">mood.php</a>
+</li>
+<li>msearch_post()
+: <a class="el" href="msearch_8php.html#ac80d2a6c0a92e79eec7efbbccd74d9a8">msearch.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_0x6e.html b/doc/html/globals_0x6e.html
new file mode 100644
index 000000000..8444dcae5
--- /dev/null
+++ b/doc/html/globals_0x6e.html
@@ -0,0 +1,354 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="globals_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_0x6d.html#index_m"><span>m</span></a></li>
+ <li class="current"><a href="globals_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_0x6e.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all file members with links to the files they belong to:</div>
+
+<h3><a class="anchor" id="index_n"></a>- n -</h3><ul>
+<li>n
+: <a class="el" href="php2po_8php.html#a1594a11499d06cc8a789ee7ca0c7a12b">php2po.php</a>
+</li>
+<li>namesList()
+: <a class="el" href="docblox__errorchecker_8php.html#a2b767cfc461fdd5061fffc9e4a806d5b">docblox_errorchecker.php</a>
+</li>
+<li>NAMESPACE_ACTIVITY
+: <a class="el" href="boot_8php.html#a5df5359090d1f8e898c36d7cf8878ad2">boot.php</a>
+</li>
+<li>NAMESPACE_ACTIVITY_SCHEMA
+: <a class="el" href="boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133">boot.php</a>
+</li>
+<li>NAMESPACE_ATOM1
+: <a class="el" href="boot_8php.html#a444ce608ce34efb82ee11852f36e825f">boot.php</a>
+</li>
+<li>NAMESPACE_DFRN
+: <a class="el" href="boot_8php.html#a7ed4581ab66ebcde97f6b3730856b028">boot.php</a>
+</li>
+<li>NAMESPACE_FEED
+: <a class="el" href="boot_8php.html#ac195fc9003298923ea81f144388e24b1">boot.php</a>
+</li>
+<li>NAMESPACE_GEORSS
+: <a class="el" href="boot_8php.html#a03d19251c245587de7ed959300b87bdf">boot.php</a>
+</li>
+<li>NAMESPACE_MEDIA
+: <a class="el" href="boot_8php.html#a6626f383c3d2d459f731ab8b4f237d16">boot.php</a>
+</li>
+<li>NAMESPACE_OSTATUS
+: <a class="el" href="boot_8php.html#acca19aae62e1a6951a856b945de20d67">boot.php</a>
+</li>
+<li>NAMESPACE_OSTATUSSUB
+: <a class="el" href="boot_8php.html#a181c111f4b6c14d091dfd3bf0d0a22cd">boot.php</a>
+</li>
+<li>NAMESPACE_POCO
+: <a class="el" href="boot_8php.html#a0b73e2548d6f9beb9c93211f488e336a">boot.php</a>
+</li>
+<li>NAMESPACE_SALMON_ME
+: <a class="el" href="boot_8php.html#aee324eca9de4e0fedf01ab5f92e27c67">boot.php</a>
+</li>
+<li>NAMESPACE_STATUSNET
+: <a class="el" href="boot_8php.html#afaf93b7026f784b113b4f8921745891e">boot.php</a>
+</li>
+<li>NAMESPACE_THREAD
+: <a class="el" href="boot_8php.html#a1d6e7f4c08bb68e4a424326a811bdd86">boot.php</a>
+</li>
+<li>NAMESPACE_TOMB
+: <a class="el" href="boot_8php.html#a4bfe22e163657690dfb6d5b1d04cb47e">boot.php</a>
+</li>
+<li>NAMESPACE_ZOT
+: <a class="el" href="boot_8php.html#a49f2a70b3b43aa904223a8d19e986a47">boot.php</a>
+</li>
+<li>nav()
+: <a class="el" href="nav_8php.html#a43be0df73b90647ea70947ce004e231e">nav.php</a>
+</li>
+<li>nav_set_selected()
+: <a class="el" href="nav_8php.html#ac3c920ce3ea5b0d9e0678ee37155f06a">nav.php</a>
+</li>
+<li>navbar_complete()
+: <a class="el" href="acl_8php.html#a57dceff370d4a0e7ae673d50fbfda61f">acl.php</a>
+</li>
+<li>network_content()
+: <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network.php</a>
+</li>
+<li>NETWORK_DFRN
+: <a class="el" href="boot_8php.html#ae3cef7b63e25e7bafea3fcf6b99fad0e">boot.php</a>
+</li>
+<li>NETWORK_DIASPORA
+: <a class="el" href="boot_8php.html#a38f6c7fe33b5434a24b4314567753dfa">boot.php</a>
+</li>
+<li>NETWORK_FACEBOOK
+: <a class="el" href="boot_8php.html#af3905ea8f8568d0236db13fca40514e3">boot.php</a>
+</li>
+<li>NETWORK_FEED
+: <a class="el" href="boot_8php.html#ab4bddb41a0cf407178ec5278b950c393">boot.php</a>
+</li>
+<li>NETWORK_GPLUS
+: <a class="el" href="boot_8php.html#a8905fde0a5b7882bdc083b20d9b34701">boot.php</a>
+</li>
+<li>network_init()
+: <a class="el" href="mod_2network_8php.html#a180fce90ad11d7e0e45be094da7149ec">network.php</a>
+</li>
+<li>NETWORK_LINKEDIN
+: <a class="el" href="boot_8php.html#a5b043b7fdcfd4e8c9c3747574afc6caa">boot.php</a>
+</li>
+<li>NETWORK_MAIL
+: <a class="el" href="boot_8php.html#a7236b2cdcf59f02a42302e893a99013b">boot.php</a>
+</li>
+<li>NETWORK_MAIL2
+: <a class="el" href="boot_8php.html#aa17a4f9c63f5cbc5c06f1066b6aebc42">boot.php</a>
+</li>
+<li>NETWORK_MYSPACE
+: <a class="el" href="boot_8php.html#ae94f7c7c0909629a75aed1c41f10bc95">boot.php</a>
+</li>
+<li>NETWORK_OSTATUS
+: <a class="el" href="boot_8php.html#aef4b6c558c68c88c10f13c5a00c20e3d">boot.php</a>
+</li>
+<li>NETWORK_PHANTOM
+: <a class="el" href="boot_8php.html#ab21fb0f3e6b962419955c6fc7f26734f">boot.php</a>
+</li>
+<li>network_tabs()
+: <a class="el" href="conversation_8php.html#a96b34b9d64d13c543e8163e52f5ce8c4">conversation.php</a>
+</li>
+<li>network_to_name()
+: <a class="el" href="contact__selectors_8php.html#ad472e4716426dd1a9dd77b62962454be">contact_selectors.php</a>
+</li>
+<li>NETWORK_XMPP
+: <a class="el" href="boot_8php.html#a43296b1b4398aacbf92a4b2d56bab91e">boot.php</a>
+</li>
+<li>NETWORK_ZOT
+: <a class="el" href="boot_8php.html#a2c65e925994566a63e6c03c381f1b4a0">boot.php</a>
+</li>
+<li>new_channel_content()
+: <a class="el" href="new__channel_8php.html#ae585191610f79da129492482ce8e2fee">new_channel.php</a>
+</li>
+<li>new_channel_init()
+: <a class="el" href="new__channel_8php.html#a1ad7f99e4366a32942c6b954aba3a164">new_channel.php</a>
+</li>
+<li>new_channel_post()
+: <a class="el" href="new__channel_8php.html#a180b0646957db8290482f02454ad7f23">new_channel.php</a>
+</li>
+<li>new_contact()
+: <a class="el" href="include_2follow_8php.html#ae387d4ae097c23d69f3247e7f08140c7">follow.php</a>
+</li>
+<li>new_cookie()
+: <a class="el" href="session_8php.html#a4c0ead624f95483e386bc80abf570a8f">session.php</a>
+</li>
+<li>new_keypair()
+: <a class="el" href="crypto_8php.html#aae0ab70d6a199b29555b1ac3cf250d6a">crypto.php</a>
+</li>
+<li>node2bbcode()
+: <a class="el" href="html2bbcode_8php.html#ad174afe0ccbd8c475e48f8a6ee2f27d8">html2bbcode.php</a>
+</li>
+<li>node2bbcodesub()
+: <a class="el" href="html2bbcode_8php.html#a39c662b19d318990fee2ba795a55d7a7">html2bbcode.php</a>
+</li>
+<li>normalise_link()
+: <a class="el" href="text_8php.html#a4bbb7d00c05cd20b4e043424f322388f">text.php</a>
+</li>
+<li>normalise_openid()
+: <a class="el" href="text_8php.html#adba17ec946f4285285dc100f7860bf51">text.php</a>
+</li>
+<li>notags()
+: <a class="el" href="text_8php.html#a1af49756c8c71902a66c7e329c462beb">text.php</a>
+</li>
+<li>notes_init()
+: <a class="el" href="notes_8php.html#a4dbd7b1f906440746af48b484d66535a">notes.php</a>
+</li>
+<li>notice()
+: <a class="el" href="boot_8php.html#a9255af5ae9c887520091ea04763c1a88">boot.php</a>
+</li>
+<li>notification()
+: <a class="el" href="enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc">enotify.php</a>
+</li>
+<li>notifications_content()
+: <a class="el" href="notifications_8php.html#aadd0b5525bd8c283a5d8a37982bbfe62">notifications.php</a>
+</li>
+<li>notifications_post()
+: <a class="el" href="notifications_8php.html#a5baffec7b2e625c9f9cefbc097550d33">notifications.php</a>
+</li>
+<li>notifier_run()
+: <a class="el" href="notifier_8php.html#a568c502f626cff95e344c0748938b85d">notifier.php</a>
+</li>
+<li>NOTIFY_COMMENT
+: <a class="el" href="boot_8php.html#a20f0eed431d25870b624b8937a07a59f">boot.php</a>
+</li>
+<li>NOTIFY_CONFIRM
+: <a class="el" href="boot_8php.html#af8c0cb0744c9a6b5d6d3baafb1f1e71d">boot.php</a>
+</li>
+<li>notify_content()
+: <a class="el" href="mod_2notify_8php.html#acdf3851688ebd6d6a575eb84ef9febe3">notify.php</a>
+</li>
+<li>notify_init()
+: <a class="el" href="mod_2notify_8php.html#a94f9a6a9d4b5fd704baafff0c34f41ae">notify.php</a>
+</li>
+<li>NOTIFY_INTRO
+: <a class="el" href="boot_8php.html#a56fd673eaa7014150297ce1162502db5">boot.php</a>
+</li>
+<li>NOTIFY_MAIL
+: <a class="el" href="boot_8php.html#a285732e7889fa7f333cbe431111e1029">boot.php</a>
+</li>
+<li>NOTIFY_POKE
+: <a class="el" href="boot_8php.html#aca08bc4f1554ba877500f6abcc99e1e8">boot.php</a>
+</li>
+<li>NOTIFY_PROFILE
+: <a class="el" href="boot_8php.html#a981d46380f9f23c308bac1f9cb00dc5b">boot.php</a>
+</li>
+<li>NOTIFY_SUGGEST
+: <a class="el" href="boot_8php.html#a9d01ef178b72b145016cca1393415bc4">boot.php</a>
+</li>
+<li>NOTIFY_SYSTEM
+: <a class="el" href="boot_8php.html#a14d44d4a00223dc3db4ea962325db192">boot.php</a>
+</li>
+<li>NOTIFY_TAGSELF
+: <a class="el" href="boot_8php.html#ab724491497ab2618b23a01d5da60aec0">boot.php</a>
+</li>
+<li>NOTIFY_TAGSHARE
+: <a class="el" href="boot_8php.html#af6937db5f581d006bf4a5c3d9c7e0461">boot.php</a>
+</li>
+<li>NOTIFY_WALL
+: <a class="el" href="boot_8php.html#a505410c7edc5f5bb5fa227b98359793e">boot.php</a>
+</li>
+<li>nuke_session()
+: <a class="el" href="auth_8php.html#a2add3a1129ffa4d5515442a9d52a9b1a">auth.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_0x6f.html b/doc/html/globals_0x6f.html
new file mode 100644
index 000000000..b2ee6bc3a
--- /dev/null
+++ b/doc/html/globals_0x6f.html
@@ -0,0 +1,201 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="globals_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_0x6e.html#index_n"><span>n</span></a></li>
+ <li class="current"><a href="globals_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_0x6f.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all file members with links to the files they belong to:</div>
+
+<h3><a class="anchor" id="index_o"></a>- o -</h3><ul>
+<li>oauth_get_client()
+: <a class="el" href="mod_2api_8php.html#a02ae0f60e240dc806b860edb7d582117">api.php</a>
+</li>
+<li>obj_verb_selector()
+: <a class="el" href="taxonomy_8php.html#af387463d42ffdf7d2ab3d5b22e40a0c7">taxonomy.php</a>
+</li>
+<li>obj_verbs()
+: <a class="el" href="taxonomy_8php.html#a03f55ee46c5f496e42f3d29db8d09cce">taxonomy.php</a>
+</li>
+<li>oe_build_xpath()
+: <a class="el" href="include_2oembed_8php.html#ab953a6e7c11bc6498ce01ed73e2ba319">oembed.php</a>
+</li>
+<li>oe_get_inner_html()
+: <a class="el" href="include_2oembed_8php.html#a03fa3b7832c98a3d0b4630afeb73d487">oembed.php</a>
+</li>
+<li>oembed_bbcode2html()
+: <a class="el" href="include_2oembed_8php.html#aba89ae64b355efcb4f706553d3edb6a2">oembed.php</a>
+</li>
+<li>oembed_fetch_url()
+: <a class="el" href="include_2oembed_8php.html#a98549b9af8140eda3eceaeedcaabc2c2">oembed.php</a>
+</li>
+<li>oembed_format_object()
+: <a class="el" href="include_2oembed_8php.html#a26bb4c1e330d2f94ea7b6ce2fe970cf3">oembed.php</a>
+</li>
+<li>oembed_html2bbcode()
+: <a class="el" href="include_2oembed_8php.html#a000a62b97113cf95b0e9e00412168172">oembed.php</a>
+</li>
+<li>oembed_iframe()
+: <a class="el" href="include_2oembed_8php.html#a9e57f3e36a0a0a47e6db79544b701d9a">oembed.php</a>
+</li>
+<li>oembed_init()
+: <a class="el" href="mod_2oembed_8php.html#a9145025aaf057fb5d3f9f7011e5e1014">oembed.php</a>
+</li>
+<li>oembed_replacecb()
+: <a class="el" href="include_2oembed_8php.html#a00c4c80deffd9daf8dc97b58d4c64ed0">oembed.php</a>
+</li>
+<li>oexchange_content()
+: <a class="el" href="oexchange_8php.html#a2d8b785cd7d041a4e6274f5af370cf26">oexchange.php</a>
+</li>
+<li>oexchange_init()
+: <a class="el" href="oexchange_8php.html#ac8e2e469ddc3db984b0c1b44558aca59">oexchange.php</a>
+</li>
+<li>onedirsync_run()
+: <a class="el" href="onedirsync_8php.html#a411aedd47c57476099647961e6a86691">onedirsync.php</a>
+</li>
+<li>onepoll_run()
+: <a class="el" href="onepoll_8php.html#a72753b2fdec79b37c7f432035c91fb6d">onepoll.php</a>
+</li>
+<li>opensearch_init()
+: <a class="el" href="opensearch_8php.html#ad13034877a496565ac7d99e9fc6f55e9">opensearch.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_0x70.html b/doc/html/globals_0x70.html
new file mode 100644
index 000000000..ff17f32c6
--- /dev/null
+++ b/doc/html/globals_0x70.html
@@ -0,0 +1,576 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="globals_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_0x6f.html#index_o"><span>o</span></a></li>
+ <li class="current"><a href="globals_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_0x70.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all file members with links to the files they belong to:</div>
+
+<h3><a class="anchor" id="index_p"></a>- p -</h3><ul>
+<li>page
+: <a class="el" href="mod__import_8php.html#a8db1899eeeb44dabd0904065b63627bb">mod_import.php</a>
+</li>
+<li>PAGE_ADULT
+: <a class="el" href="boot_8php.html#ace83842dbeb84f7ed9ac59a9f57a7c32">boot.php</a>
+</li>
+<li>PAGE_APPLICATION
+: <a class="el" href="boot_8php.html#a8231d115060d41a9c2a677f2c86f10ed">boot.php</a>
+</li>
+<li>PAGE_AUTOCONNECT
+: <a class="el" href="boot_8php.html#aa275653b9c87abc7391bb8040c1c2de9">boot.php</a>
+</li>
+<li>page_content()
+: <a class="el" href="page_8php.html#a91a5f649f68406149108bded1dc90b22">page.php</a>
+</li>
+<li>PAGE_DIRECTORY_CHANNEL
+: <a class="el" href="boot_8php.html#a5b8484922918946d041e5e0515dbe718">boot.php</a>
+</li>
+<li>PAGE_HIDDEN
+: <a class="el" href="boot_8php.html#a5e322a2a2d0f51924c0b2e874988e640">boot.php</a>
+</li>
+<li>page_init()
+: <a class="el" href="page_8php.html#a4d89800c0366a239191b1692c09635cf">page.php</a>
+</li>
+<li>PAGE_NORMAL
+: <a class="el" href="boot_8php.html#a09532c3f750ae8c4527e63b2b790cbf3">boot.php</a>
+</li>
+<li>PAGE_PREMIUM
+: <a class="el" href="boot_8php.html#ab3920c2f3cd64802c0b7ff625c3b2ea8">boot.php</a>
+</li>
+<li>PAGE_REMOVED
+: <a class="el" href="boot_8php.html#a4edce16cb7f21cdafa1e85bf63d713e6">boot.php</a>
+</li>
+<li>PAGE_SYSTEM
+: <a class="el" href="boot_8php.html#a6ee7a72d558d1851bbb9e3cdde377932">boot.php</a>
+</li>
+<li>pagelist_widget()
+: <a class="el" href="page__widgets_8php.html#ad82011c1ed90d9de8b9f34c12af5c6f0">page_widgets.php</a>
+</li>
+<li>paginate()
+: <a class="el" href="text_8php.html#afe9f178d264d44a94dc1292aaf0fd585">text.php</a>
+</li>
+<li>parse_url_content()
+: <a class="el" href="parse__url_8php.html#a05a9e8944380ba3cf6bbf5893dd4b74b">parse_url.php</a>
+</li>
+<li>parse_xml_string()
+: <a class="el" href="include_2network_8php.html#a27a951b59d8d622c0b3e7b0673ba74c6">network.php</a>
+</li>
+<li>parseurl_getsiteinfo()
+: <a class="el" href="parse__url_8php.html#a25635549f2c22955d72465f4d2e58993">parse_url.php</a>
+</li>
+<li>pdl_selector()
+: <a class="el" href="comanche_8php.html#af7150df735e5ff9d467994cd6f769c6e">comanche.php</a>
+</li>
+<li>perm_is_allowed()
+: <a class="el" href="permissions_8php.html#a67ada9ed51e77885b6b0f6a28cee1835">permissions.php</a>
+</li>
+<li>permissions_sql()
+: <a class="el" href="security_8php.html#afa683bc025a1d2fe9065e2f6cd71a22f">security.php</a>
+</li>
+<li>perms2str()
+: <a class="el" href="text_8php.html#a98fd99dee3da8cf4c148dc04efe782ee">text.php</a>
+</li>
+<li>PERMS_A_DELEGATE
+: <a class="el" href="boot_8php.html#a423505ab8dbd8e39d04ae3fe1374102b">boot.php</a>
+</li>
+<li>PERMS_A_REPUBLISH
+: <a class="el" href="boot_8php.html#aae6c941bde5fd6fce07e51dba7326ead">boot.php</a>
+</li>
+<li>PERMS_CONTACTS
+: <a class="el" href="boot_8php.html#ab2d0e8a9b81ee548ef2ce8e4560da2f6">boot.php</a>
+</li>
+<li>PERMS_NETWORK
+: <a class="el" href="boot_8php.html#a6df1102664f64b274810db85197c2755">boot.php</a>
+</li>
+<li>PERMS_PUBLIC
+: <a class="el" href="boot_8php.html#aff210e8403dd72368522b17fb6e5d4e7">boot.php</a>
+</li>
+<li>PERMS_R_ABOOK
+: <a class="el" href="boot_8php.html#a3d6d4fc5fafcc9156811669158541caf">boot.php</a>
+</li>
+<li>PERMS_R_PAGES
+: <a class="el" href="boot_8php.html#ab51965fabe54dc031e9a0ce1142ee83e">boot.php</a>
+</li>
+<li>PERMS_R_PHOTOS
+: <a class="el" href="boot_8php.html#a29e921c0c72412cc738e44cca6ca1f62">boot.php</a>
+</li>
+<li>PERMS_R_PROFILE
+: <a class="el" href="boot_8php.html#ad789aef3cb95fc1eb36be7c4283d0137">boot.php</a>
+</li>
+<li>PERMS_R_STORAGE
+: <a class="el" href="boot_8php.html#a1db4f0009c9cb4e107eab0f914a3c8dc">boot.php</a>
+</li>
+<li>PERMS_R_STREAM
+: <a class="el" href="boot_8php.html#aec36f8fcd4cb14a52934590b3d6666b4">boot.php</a>
+</li>
+<li>PERMS_SITE
+: <a class="el" href="boot_8php.html#a9ff652e5cb83cd11cbb0350844e7b28f">boot.php</a>
+</li>
+<li>PERMS_SPECIFIC
+: <a class="el" href="boot_8php.html#a9cc986b4f9dd6558cbb2e25aadbfd964">boot.php</a>
+</li>
+<li>PERMS_W_CHAT
+: <a class="el" href="boot_8php.html#acd877c405b06b348b37b6f7e62a211e9">boot.php</a>
+</li>
+<li>PERMS_W_COMMENT
+: <a class="el" href="boot_8php.html#a32df13fec0e43281da5979e1f5579aa8">boot.php</a>
+</li>
+<li>PERMS_W_MAIL
+: <a class="el" href="boot_8php.html#a6b31dd451bc6c37fe7c9c766ff385aaf">boot.php</a>
+</li>
+<li>PERMS_W_PAGES
+: <a class="el" href="boot_8php.html#aa9244fc9cc221980c07a20cc534111be">boot.php</a>
+</li>
+<li>PERMS_W_PHOTOS
+: <a class="el" href="boot_8php.html#a57eee7352714c004d36c26dda74af73e">boot.php</a>
+</li>
+<li>PERMS_W_STORAGE
+: <a class="el" href="boot_8php.html#a4fefd7486d3b888a05cfd3dc9575f115">boot.php</a>
+</li>
+<li>PERMS_W_STREAM
+: <a class="el" href="boot_8php.html#a8bb0395933b5e886f086f6a2fb0bfa55">boot.php</a>
+</li>
+<li>PERMS_W_TAGWALL
+: <a class="el" href="boot_8php.html#a99a4a17cb644e7e6826ea07ecaf09777">boot.php</a>
+</li>
+<li>PERMS_W_WALL
+: <a class="el" href="boot_8php.html#a6b14a31a8aa9f3452a13383f413bffa2">boot.php</a>
+</li>
+<li>photo_factory()
+: <a class="el" href="photo__driver_8php.html#a32e2817faa25d7f11f60a8abff565035">photo_driver.php</a>
+</li>
+<li>photo_init()
+: <a class="el" href="photo_8php.html#a582779d24882b0d31ee909a91d70a448">photo.php</a>
+</li>
+<li>photo_new_resource()
+: <a class="el" href="text_8php.html#aa5528f41533927e1bd2da3618a74a6d7">text.php</a>
+</li>
+<li>PHOTO_NORMAL
+: <a class="el" href="boot_8php.html#a4a49b29838ef2c45ab3556b52baec6a4">boot.php</a>
+</li>
+<li>PHOTO_PROFILE
+: <a class="el" href="boot_8php.html#ab4bc9c50ecc927b92d519e36562b0df0">boot.php</a>
+</li>
+<li>PHOTO_THING
+: <a class="el" href="boot_8php.html#a78849a1bf8ce8d9804b4cbb502e8f383">boot.php</a>
+</li>
+<li>photo_upload()
+: <a class="el" href="include_2photos_8php.html#a6c40ef58aefef705a5adc84a40e97109">photos.php</a>
+</li>
+<li>PHOTO_XCHAN
+: <a class="el" href="boot_8php.html#ac43182e0d8bae7576a30b603774974f8">boot.php</a>
+</li>
+<li>photos_album_exists()
+: <a class="el" href="include_2photos_8php.html#a8e8b7be99e24c2497bc2cb3339280c35">photos.php</a>
+</li>
+<li>photos_album_get_db_idstr()
+: <a class="el" href="include_2photos_8php.html#a7e7abc69872180697c5471dc69349afe">photos.php</a>
+</li>
+<li>photos_album_rename()
+: <a class="el" href="include_2photos_8php.html#ab0365f25b22ccea5f085fe7c49e1f4ab">photos.php</a>
+</li>
+<li>photos_album_widget()
+: <a class="el" href="include_2photos_8php.html#af24c6aeed28ecc31ec39e7d9a1804979">photos.php</a>
+</li>
+<li>photos_albums_list()
+: <a class="el" href="include_2photos_8php.html#aedccaf18282b26899d9549c29bd9d1b9">photos.php</a>
+</li>
+<li>photos_content()
+: <a class="el" href="mod_2photos_8php.html#aa87382611a66ec5effdb2d78f13f5812">photos.php</a>
+</li>
+<li>photos_create_item()
+: <a class="el" href="include_2photos_8php.html#ad648c0c5544fe9263409b6f6e57c6274">photos.php</a>
+</li>
+<li>photos_init()
+: <a class="el" href="mod_2photos_8php.html#ab950295cd77626f5fe65331a87693014">photos.php</a>
+</li>
+<li>photos_list_photos()
+: <a class="el" href="include_2photos_8php.html#aa27b9e435dcc34e1009f56dc02c7ca51">photos.php</a>
+</li>
+<li>photos_post()
+: <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos.php</a>
+</li>
+<li>php_init()
+: <a class="el" href="php_8php.html#adb7164dfed9a4ecbe2e168e1e78f12f6">php.php</a>
+</li>
+<li>ping_init()
+: <a class="el" href="ping_8php.html#a77217b1b190b4c5d8770867b45f0c0a1">ping.php</a>
+</li>
+<li>pipe_streams()
+: <a class="el" href="include_2attach_8php.html#a5d484de2d19a93071571d6499a50ae34">attach.php</a>
+</li>
+<li>pkcs5_pad()
+: <a class="el" href="crypto_8php.html#ad5e51fd44cff93cfaa07a37e24a5edec">crypto.php</a>
+</li>
+<li>pkcs5_unpad()
+: <a class="el" href="crypto_8php.html#ac95ac3b1b23b65b04a86613d4206ae85">crypto.php</a>
+</li>
+<li>PNG_QUALITY
+: <a class="el" href="boot_8php.html#a8df201788c9dd0ca91384e3a14c08bce">boot.php</a>
+</li>
+<li>po2php_run()
+: <a class="el" href="po2php_8php.html#a3b75e36f913198299e99559b175cd8b4">po2php.php</a>
+</li>
+<li>poco_init()
+: <a class="el" href="poco_8php.html#a53def16f75e3d41f1d2bb7cfa4905498">poco.php</a>
+</li>
+<li>poco_load()
+: <a class="el" href="socgraph_8php.html#a5ef8bef37161df53718a21e93d02fbd6">socgraph.php</a>
+</li>
+<li>poke_content()
+: <a class="el" href="poke_8php.html#ac9190563a8da9c07a16f9dcd71cf6993">poke.php</a>
+</li>
+<li>poke_init()
+: <a class="el" href="poke_8php.html#a9725aab97b3983e6a98bd81c4efe7d3b">poke.php</a>
+</li>
+<li>POLL_MULTIPLE_CHOICE
+: <a class="el" href="boot_8php.html#abbf5ac24eb8aeedb862f618ee0d21e86">boot.php</a>
+</li>
+<li>POLL_OVERWRITE
+: <a class="el" href="boot_8php.html#a2b525996e4426bdddbcec277778bde08">boot.php</a>
+</li>
+<li>POLL_SIMPLE_RATING
+: <a class="el" href="boot_8php.html#ad88a70ec62e08d590123d3697dfe64d5">boot.php</a>
+</li>
+<li>POLL_TENSCALE
+: <a class="el" href="boot_8php.html#a1ba00027b718db732f30fc0e2c3e0abc">boot.php</a>
+</li>
+<li>poller_run()
+: <a class="el" href="poller_8php.html#a5f12df3a4738124b6c039971e87e76da">poller.php</a>
+</li>
+<li>pop_lang()
+: <a class="el" href="language_8php.html#a78bd204955ec4cc3a9ac651285a1689d">language.php</a>
+</li>
+<li>populate_acl()
+: <a class="el" href="acl__selectors_8php.html#a7b5446e999636ceceea65c154d865a31">acl_selectors.php</a>
+</li>
+<li>post_activity_item()
+: <a class="el" href="items_8php.html#a410f9c743877c125ca06312373346903">items.php</a>
+</li>
+<li>post_init()
+: <a class="el" href="post_8php.html#af4b48181ce773ef0cdfc972441445c34">post.php</a>
+</li>
+<li>post_post()
+: <a class="el" href="post_8php.html#af59e6a1dc22d19d9257b01cd7ccedb75">post.php</a>
+</li>
+<li>post_to_red_acct_name
+: <a class="el" href="post__to__red_8php.html#a588cea66afe0b32f27f2713d44940119">post_to_red.php</a>
+</li>
+<li>post_to_red_admin()
+: <a class="el" href="post__to__red_8php.html#aeec4125719184e7b097b3b9fba3101b5">post_to_red.php</a>
+</li>
+<li>post_to_red_deactivate()
+: <a class="el" href="post__to__red_8php.html#a49fd35f7b1cdddfe6e26ddfcf8d3c4ec">post_to_red.php</a>
+</li>
+<li>post_to_red_delete_comment()
+: <a class="el" href="post__to__red_8php.html#a5cc2a89a6d33cdb8e2ca557a69bef42d">post_to_red.php</a>
+</li>
+<li>post_to_red_delete_post()
+: <a class="el" href="post__to__red_8php.html#a4674bb5ce2baa32c559607460c39a2c5">post_to_red.php</a>
+</li>
+<li>post_to_red_display_admin_page()
+: <a class="el" href="post__to__red_8php.html#a8ec8f8809e3c5d1b2c9598c8185d63aa">post_to_red.php</a>
+</li>
+<li>post_to_red_displayAdminContent()
+: <a class="el" href="post__to__red_8php.html#a75db5d87226a0287a0ac0fa315f2bcfd">post_to_red.php</a>
+</li>
+<li>post_to_red_get_acct_name()
+: <a class="el" href="post__to__red_8php.html#ae6f3a2c0561cbeacda5be565b06de8a7">post_to_red.php</a>
+</li>
+<li>post_to_red_get_avatar()
+: <a class="el" href="post__to__red_8php.html#ae0b881461afbdba93d9329068ea52136">post_to_red.php</a>
+</li>
+<li>post_to_red_get_channel_name()
+: <a class="el" href="post__to__red_8php.html#aacba7a0646fc00ae6ac4f5dc383fccab">post_to_red.php</a>
+</li>
+<li>post_to_red_get_password()
+: <a class="el" href="post__to__red_8php.html#a4d90ac085c14f53ff4d8ab4c23477ea6">post_to_red.php</a>
+</li>
+<li>post_to_red_get_seed_location()
+: <a class="el" href="post__to__red_8php.html#a96d0ccecb96600ef1bfd50ab3f77315f">post_to_red.php</a>
+</li>
+<li>post_to_red_path
+: <a class="el" href="post__to__red_8php.html#a6210f39392a5f0fa0255cc7d3760493a">post_to_red.php</a>
+</li>
+<li>post_to_red_post()
+: <a class="el" href="post__to__red_8php.html#af5fd50e2c42ede85f8a9e8d9ee3cf540">post_to_red.php</a>
+</li>
+<li>post_to_red_post_checkbox()
+: <a class="el" href="post__to__red_8php.html#a0f139dea77a94c98f26007963eea639c">post_to_red.php</a>
+</li>
+<li>post_to_red_post_field_data()
+: <a class="el" href="post__to__red_8php.html#a7e68a8d9c83cb28d032aad3ea85ce0a6">post_to_red.php</a>
+</li>
+<li>post_to_red_post_meta_content()
+: <a class="el" href="post__to__red_8php.html#aa97aeda12ef080665f16311a4e1eb901">post_to_red.php</a>
+</li>
+<li>post_to_red_settings_link()
+: <a class="el" href="post__to__red_8php.html#a906be8f72cf1aa2e199c0683ea6a4017">post_to_red.php</a>
+</li>
+<li>post_to_red_version
+: <a class="el" href="post__to__red_8php.html#af3e7ebd361d4ed7cb6d43209970cd94a">post_to_red.php</a>
+</li>
+<li>posted_date_widget()
+: <a class="el" href="items_8php.html#abe695dd89e1e10ed042c26b80114f0ed">items.php</a>
+</li>
+<li>posted_dates()
+: <a class="el" href="items_8php.html#ad2abb4644ff1f20fefbc80326fe01cf0">items.php</a>
+</li>
+<li>preg_callback_help_include()
+: <a class="el" href="help_8php.html#a06b2a51aaabed99e53a9b639047c4ce4">help.php</a>
+</li>
+<li>preg_heart()
+: <a class="el" href="text_8php.html#ac19d2b33a58372a357a43d51eed19162">text.php</a>
+</li>
+<li>prepare_body()
+: <a class="el" href="text_8php.html#ae4df74296fbe55051ed3c035e55205e5">text.php</a>
+</li>
+<li>prepare_page()
+: <a class="el" href="conversation_8php.html#a4b0888b0f26e1c284a4341fe5fd04f0c">conversation.php</a>
+</li>
+<li>prepare_text()
+: <a class="el" href="text_8php.html#afe54312607d92f7ce9593f5760831f80">text.php</a>
+</li>
+<li>pretheme_init()
+: <a class="el" href="pretheme_8php.html#af5660943ee99db5fd75182316522eafe">pretheme.php</a>
+</li>
+<li>print_template()
+: <a class="el" href="tpldebug_8php.html#a44778457a6c02554812fbfad19d32ba3">tpldebug.php</a>
+</li>
+<li>printable()
+: <a class="el" href="dba__driver_8php.html#a55bf30d8176967e682656b5be4ad9249">dba_driver.php</a>
+</li>
+<li>private_messages_drop()
+: <a class="el" href="include_2message_8php.html#aed272d77c06a309e2836ac79e75613f1">message.php</a>
+</li>
+<li>private_messages_fetch_conversation()
+: <a class="el" href="include_2message_8php.html#a5f8de9847e203329e317ac38dc646898">message.php</a>
+</li>
+<li>private_messages_fetch_message()
+: <a class="el" href="include_2message_8php.html#a254a756031e4d5e94f85e2939bdb5091">message.php</a>
+</li>
+<li>private_messages_list()
+: <a class="el" href="include_2message_8php.html#a652973ce47a262f2d238c2fd6233d97e">message.php</a>
+</li>
+<li>probe_content()
+: <a class="el" href="probe_8php.html#a1f1db3fa6038e451e737964c94bf5e99">probe.php</a>
+</li>
+<li>proc_run()
+: <a class="el" href="boot_8php.html#ab346a2ece14993861f3e4206befa94f0">boot.php</a>
+</li>
+<li>process_channel_sync_delivery()
+: <a class="el" href="zot_8php.html#ac301c67864917c35922257950ae0f95c">zot.php</a>
+</li>
+<li>process_delivery()
+: <a class="el" href="zot_8php.html#a37ec13b18057634eadb071f05297f5e1">zot.php</a>
+</li>
+<li>process_mail_delivery()
+: <a class="el" href="zot_8php.html#aa6ae96db8cbbdbb10e6876d206bbf7cc">zot.php</a>
+</li>
+<li>process_profile_delivery()
+: <a class="el" href="zot_8php.html#a9a57b40669351c9791126b925cb7ef3b">zot.php</a>
+</li>
+<li>profile_activity()
+: <a class="el" href="activities_8php.html#a80134e807719b3c54aba971958d2e132">activities.php</a>
+</li>
+<li>profile_content()
+: <a class="el" href="profile_8php.html#a3775cf6eef6587e5143133356a7b76c0">profile.php</a>
+</li>
+<li>profile_create_sidebar()
+: <a class="el" href="identity_8php.html#ad4a2c8caca8f6ae93633ebeca0ed6620">identity.php</a>
+</li>
+<li>profile_init()
+: <a class="el" href="profile_8php.html#ab5d0246be0552e2182a585c1206d22a5">profile.php</a>
+</li>
+<li>profile_load()
+: <a class="el" href="identity_8php.html#a4751b522ea913d0e7ed43e03d22e9e68">identity.php</a>
+</li>
+<li>profile_photo_init()
+: <a class="el" href="profile__photo_8php.html#a140631c56438fbfacb61a1eb43067d02">profile_photo.php</a>
+</li>
+<li>profile_photo_post()
+: <a class="el" href="profile__photo_8php.html#a4b80234074bd603221aa5364f330e479">profile_photo.php</a>
+</li>
+<li>profile_sidebar()
+: <a class="el" href="identity_8php.html#a432259b2cf5b6f59be53e71db9f2c7dc">identity.php</a>
+</li>
+<li>profile_tabs()
+: <a class="el" href="conversation_8php.html#a1dfcb5146e9d1eca4528bc580ad5d273">conversation.php</a>
+</li>
+<li>profiler()
+: <a class="el" href="text_8php.html#a8b0a799341b1fc4cba2c3ede3e3fc9b6">text.php</a>
+</li>
+<li>profiles_content()
+: <a class="el" href="profiles_8php.html#a46975783b8b8d70402d51487eb1f0b00">profiles.php</a>
+</li>
+<li>profiles_init()
+: <a class="el" href="profiles_8php.html#a36f71405ad536228f8bb84a551b23f7e">profiles.php</a>
+</li>
+<li>profiles_post()
+: <a class="el" href="profiles_8php.html#ab0362c81b1d3b0b12a772b9fac446e04">profiles.php</a>
+</li>
+<li>profperm_content()
+: <a class="el" href="profperm_8php.html#aef015787de2373d9fb3fe3f814fb5023">profperm.php</a>
+</li>
+<li>profperm_init()
+: <a class="el" href="profperm_8php.html#a17fb64ec05edee1dc94d95438807d6c6">profperm.php</a>
+</li>
+<li>protect_sprintf()
+: <a class="el" href="text_8php.html#a4e7698aca48982512594b274543c3b9b">text.php</a>
+</li>
+<li>public_permissions_sql()
+: <a class="el" href="security_8php.html#ab3bdd30dc60d9ee72370b866aa4a2d01">security.php</a>
+</li>
+<li>public_recips()
+: <a class="el" href="zot_8php.html#a083aec6c900d244e1bfc1406f9461465">zot.php</a>
+</li>
+<li>pubsites_content()
+: <a class="el" href="pubsites_8php.html#af614e279aab54065345bda6b03eafdf0">pubsites.php</a>
+</li>
+<li>purify_html()
+: <a class="el" href="text_8php.html#a4841df5beabdd1bdd1ed56781a915d61">text.php</a>
+</li>
+<li>push_lang()
+: <a class="el" href="language_8php.html#ac9142ef1d01a235c760deb0f16643f5a">language.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_0x71.html b/doc/html/globals_0x71.html
new file mode 100644
index 000000000..2ee22f485
--- /dev/null
+++ b/doc/html/globals_0x71.html
@@ -0,0 +1,162 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="globals_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_0x70.html#index_p"><span>p</span></a></li>
+ <li class="current"><a href="globals_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_0x71.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all file members with links to the files they belong to:</div>
+
+<h3><a class="anchor" id="index_q"></a>- q -</h3><ul>
+<li>q()
+: <a class="el" href="dba__driver_8php.html#a2c09a731d3b4fef41fed0e83db01be1f">dba_driver.php</a>
+</li>
+<li>qp()
+: <a class="el" href="text_8php.html#afc998d2796a6b2a08e96f7cc061e7221">text.php</a>
+</li>
+<li>queue_run()
+: <a class="el" href="queue_8php.html#af8c93de86d866c3200174c8450a0f341">queue.php</a>
+</li>
+<li>quotelevel()
+: <a class="el" href="html2plain_8php.html#a56d29b254333d29abb9d96a9a903a4b0">html2plain.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_0x72.html b/doc/html/globals_0x72.html
new file mode 100644
index 000000000..147b9d5a1
--- /dev/null
+++ b/doc/html/globals_0x72.html
@@ -0,0 +1,315 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="globals_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_0x71.html#index_q"><span>q</span></a></li>
+ <li class="current"><a href="globals_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_0x72.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all file members with links to the files they belong to:</div>
+
+<h3><a class="anchor" id="index_r"></a>- r -</h3><ul>
+<li>random_profile()
+: <a class="el" href="Contact_8php.html#a852fa476f0c70bde10a4f2533aec5f71">Contact.php</a>
+</li>
+<li>random_string()
+: <a class="el" href="text_8php.html#a9d6a5ee1290de7a8b483fe78585daade">text.php</a>
+</li>
+<li>RANDOM_STRING_HEX
+: <a class="el" href="text_8php.html#aad557c054cf2ed915633701018fc7e3f">text.php</a>
+</li>
+<li>RANDOM_STRING_TEXT
+: <a class="el" href="text_8php.html#a2ffd79c60cc87cec24ef76447b905187">text.php</a>
+</li>
+<li>randprof_init()
+: <a class="el" href="randprof_8php.html#abf5dba3c608b9304cbf68327cd31b090">randprof.php</a>
+</li>
+<li>rconnect_url()
+: <a class="el" href="Contact_8php.html#a2f4f495d53f2a334ab75292af79d3c91">Contact.php</a>
+</li>
+<li>rebuild_theme_table()
+: <a class="el" href="admin_8php.html#ae46311a3fefc21abc838a26e91789de6">admin.php</a>
+</li>
+<li>red_comment()
+: <a class="el" href="post__to__red_8php.html#a085c250d4ceff5e4f10052f3d2039823">post_to_red.php</a>
+</li>
+<li>RED_PLATFORM
+: <a class="el" href="boot_8php.html#a96ad56755a21e1361dbd7bf93c9e7ff4">boot.php</a>
+</li>
+<li>RED_VERSION
+: <a class="el" href="boot_8php.html#a21cc29e0025943e7c28ff58cb4856ac3">boot.php</a>
+</li>
+<li>red_xmlrpc_methods()
+: <a class="el" href="post__to__red_8php.html#a3a2af6ad845239f26e86fccabf8639e1">post_to_red.php</a>
+</li>
+<li>red_zrl_callback()
+: <a class="el" href="items_8php.html#a4e6d7639431e0dd8e9f4dba8e1ac408b">items.php</a>
+</li>
+<li>redbasic_form()
+: <a class="el" href="view_2theme_2redbasic_2php_2config_8php.html#a8574a41fa9735ee391ba57ab24b93793">config.php</a>
+</li>
+<li>redbasic_init()
+: <a class="el" href="redbasic_2php_2theme_8php.html#af6eb813e9fc7e2d76ac1b82bc5c0ed9b">theme.php</a>
+</li>
+<li>RedChannelList()
+: <a class="el" href="reddav_8php.html#ae92ea0df1993f6a7bcd1b6efa6c1fb66">reddav.php</a>
+</li>
+<li>RedCollectionData()
+: <a class="el" href="reddav_8php.html#a5df0d09893f2e65dc5cf6bbab6cfb266">reddav.php</a>
+</li>
+<li>RedFileData()
+: <a class="el" href="reddav_8php.html#a9f531641dfb4e43cd88ac1a9ae7e2088">reddav.php</a>
+</li>
+<li>reduce()
+: <a class="el" href="docblox__errorchecker_8php.html#ae9562cf60aa693114603d27b55d2185f">docblox_errorchecker.php</a>
+</li>
+<li>ref_session_close()
+: <a class="el" href="session_8php.html#a5e1c616e02b863d5450317d101366bb7">session.php</a>
+</li>
+<li>ref_session_destroy()
+: <a class="el" href="session_8php.html#af230b86bfff7db66c3bdd7e0bbc24052">session.php</a>
+</li>
+<li>ref_session_gc()
+: <a class="el" href="session_8php.html#ac95373f4966862a028033dd2f94d4da1">session.php</a>
+</li>
+<li>ref_session_open()
+: <a class="el" href="session_8php.html#a26fa1042356d555023cbf15ddd4f8507">session.php</a>
+</li>
+<li>ref_session_read()
+: <a class="el" href="session_8php.html#a7f0f50576360d9ba52d29364e0b83a8e">session.php</a>
+</li>
+<li>ref_session_write()
+: <a class="el" href="session_8php.html#ac4461c1984543d3553e73dba2771568f">session.php</a>
+</li>
+<li>REGISTER_APPROVE
+: <a class="el" href="boot_8php.html#a7176c0f9f1c98421b97735d892cf6252">boot.php</a>
+</li>
+<li>REGISTER_CLOSED
+: <a class="el" href="boot_8php.html#a69aac276ed82e010dc382b16ab4d59e1">boot.php</a>
+</li>
+<li>register_content()
+: <a class="el" href="register_8php.html#a0e91f57f111407ea8d3223a05022bb2a">register.php</a>
+</li>
+<li>register_hook()
+: <a class="el" href="plugin_8php.html#a425472c5f3afc137268b2ad45652b209">plugin.php</a>
+</li>
+<li>register_init()
+: <a class="el" href="register_8php.html#ae20c0cd40f738d6295de58b9202c83d5">register.php</a>
+</li>
+<li>REGISTER_OPEN
+: <a class="el" href="boot_8php.html#ad8887b49bbb02dd30b4eb9f6c7773c63">boot.php</a>
+</li>
+<li>register_post()
+: <a class="el" href="register_8php.html#a51731dcc1917c58a790eb1c0f6132271">register.php</a>
+</li>
+<li>regmod_content()
+: <a class="el" href="regmod_8php.html#a7953df4e32e63946565e90cdd5d50409">regmod.php</a>
+</li>
+<li>relative_date()
+: <a class="el" href="datetime_8php.html#a8ae8dc95ace7ac27fa5a1ecf42b78c82">datetime.php</a>
+</li>
+<li>reload_plugins()
+: <a class="el" href="plugin_8php.html#af9ac19004dca49adae1ac7a0d9f3b025">plugin.php</a>
+</li>
+<li>reltoabs()
+: <a class="el" href="text_8php.html#ad855a32bee22c3f3b9734e3a334b96f2">text.php</a>
+</li>
+<li>remote_user()
+: <a class="el" href="boot_8php.html#a5542c5c2806ab8bca04bad53d47b5209">boot.php</a>
+</li>
+<li>remove_all_xchan_resources()
+: <a class="el" href="Contact_8php.html#acc12cda999c88c4d6185cca967c15125">Contact.php</a>
+</li>
+<li>remove_community_tag()
+: <a class="el" href="zot_8php.html#aad25a3fe0e1566121d6fb8222979bc10">zot.php</a>
+</li>
+<li>remove_queue_item()
+: <a class="el" href="queue__fn_8php.html#a8fe71e981399bbf5d000a6ca42f57b24">queue_fn.php</a>
+</li>
+<li>removeme_content()
+: <a class="el" href="removeme_8php.html#a065a589caa2aa84c60f7073a28f0ad9c">removeme.php</a>
+</li>
+<li>removeme_post()
+: <a class="el" href="removeme_8php.html#a7be08738beca44bb98a79e01cdb2ee88">removeme.php</a>
+</li>
+<li>render_location_default()
+: <a class="el" href="conversation_8php.html#a40b9b5e7825bc73932a32e667f05e6f2">conversation.php</a>
+</li>
+<li>replace_macros()
+: <a class="el" href="text_8php.html#a9c6ce4e12a4ac883c5e3f36fed6e1e09">text.php</a>
+</li>
+<li>REQUEST_TOKEN_DURATION
+: <a class="el" href="oauth_8php.html#a7a32a5990f113ac9465b03b29175cf16">oauth.php</a>
+</li>
+<li>requestdata()
+: <a class="el" href="include_2api_8php.html#a43c47de8565cc00c3369cb35c19cc75e">api.php</a>
+</li>
+<li>return_bytes()
+: <a class="el" href="text_8php.html#ae2126da85966da0e79c6bcbac63b0bda">text.php</a>
+</li>
+<li>rmagic_content()
+: <a class="el" href="rmagic_8php.html#a3e28db1e5cfa7e5c2617f90222c1caef">rmagic.php</a>
+</li>
+<li>rmagic_init()
+: <a class="el" href="rmagic_8php.html#a95455edd43f1bff39446a57388cdde16">rmagic.php</a>
+</li>
+<li>rmagic_post()
+: <a class="el" href="rmagic_8php.html#a869de069d081b3c4e98b957d06bbf08f">rmagic.php</a>
+</li>
+<li>rpost_callback()
+: <a class="el" href="bbcode_8php.html#a5165a5221a52cf1bc1d7812ebd2069c7">bbcode.php</a>
+</li>
+<li>rpost_content()
+: <a class="el" href="rpost_8php.html#a8190354d789000806d9879aea276728f">rpost.php</a>
+</li>
+<li>rsa_sign()
+: <a class="el" href="crypto_8php.html#a920e5f222d0020f47556033d8b2b6552">crypto.php</a>
+</li>
+<li>rsa_verify()
+: <a class="el" href="crypto_8php.html#ab4f21d8f6b8ece0915e7c8bb73379f96">crypto.php</a>
+</li>
+<li>rsd_xml_content()
+: <a class="el" href="rsd__xml_8php.html#a740cd02fa15e5a53f8547fac73f0ab82">rsd_xml.php</a>
+</li>
+<li>runs()
+: <a class="el" href="docblox__errorchecker_8php.html#a21b4bbe5aae2d85db33affc7126a67ec">docblox_errorchecker.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_0x73.html b/doc/html/globals_0x73.html
new file mode 100644
index 000000000..25f4a2a3d
--- /dev/null
+++ b/doc/html/globals_0x73.html
@@ -0,0 +1,345 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="globals_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_0x72.html#index_r"><span>r</span></a></li>
+ <li class="current"><a href="globals_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_0x73.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all file members with links to the files they belong to:</div>
+
+<h3><a class="anchor" id="index_s"></a>- s -</h3><ul>
+<li>sanitise_acl()
+: <a class="el" href="text_8php.html#a9fbeae13c9abd6e27cb4d8d1817f969c">text.php</a>
+</li>
+<li>scale_external_images()
+: <a class="el" href="include_2network_8php.html#ae8d9c41a11000fb8667039fc71b4f73f">network.php</a>
+</li>
+<li>script_path()
+: <a class="el" href="plugin_8php.html#a0e8c2ea50bfdbc39e17ccccaea21ddc3">plugin.php</a>
+</li>
+<li>search()
+: <a class="el" href="text_8php.html#a876e94892867019935b348b573299352">text.php</a>
+</li>
+<li>search_ac_init()
+: <a class="el" href="search__ac_8php.html#a14f90c83a3f2be095e9e2992a8d66138">search_ac.php</a>
+</li>
+<li>search_content()
+: <a class="el" href="search_8php.html#ab2568591359edde5b483a6cd9a24b2cc">search.php</a>
+</li>
+<li>search_init()
+: <a class="el" href="search_8php.html#acf19fd30f07f495781ca0d7a0a08b435">search.php</a>
+</li>
+<li>searchbox()
+: <a class="el" href="text_8php.html#aae91e4d2a2c6f7a9daccd2c186ae3447">text.php</a>
+</li>
+<li>select_timezone()
+: <a class="el" href="datetime_8php.html#a633dadba426fa2f60b25fabdb19ebc1f">datetime.php</a>
+</li>
+<li>send_message()
+: <a class="el" href="include_2message_8php.html#a751ffd6635022b2190f56154ee745752">message.php</a>
+</li>
+<li>send_reg_approval_email()
+: <a class="el" href="account_8php.html#a014de2d5d5c9785de5bf547a485822fa">account.php</a>
+</li>
+<li>send_status_notifications()
+: <a class="el" href="items_8php.html#aab9e0c58247427126de0699c729c3b6c">items.php</a>
+</li>
+<li>send_verification_email()
+: <a class="el" href="account_8php.html#aa9c29c497c17d8f9344dce8631ad8761">account.php</a>
+</li>
+<li>service_class_allows()
+: <a class="el" href="plugin_8php.html#a030cec6793b909c439c0336ba39b1571">plugin.php</a>
+</li>
+<li>service_class_fetch()
+: <a class="el" href="plugin_8php.html#a905b54e10704b283ac64680a8abc0971">plugin.php</a>
+</li>
+<li>set_config()
+: <a class="el" href="include_2config_8php.html#ad6da879e4fb5b37d1e161d4e9be5c32a">config.php</a>
+</li>
+<li>set_default_login_identity()
+: <a class="el" href="identity_8php.html#a78151baf4407a8482d2681a91a9c486b">identity.php</a>
+</li>
+<li>set_pconfig()
+: <a class="el" href="include_2config_8php.html#a61591371cb18764138655d67dc817ab2">config.php</a>
+</li>
+<li>set_xconfig()
+: <a class="el" href="include_2config_8php.html#afe117b70f1bba2f6348d9300b601f86e">config.php</a>
+</li>
+<li>settings_init()
+: <a class="el" href="settings_8php.html#a3a4cde287482fced008583f54ba2a722">settings.php</a>
+</li>
+<li>settings_post()
+: <a class="el" href="settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586">settings.php</a>
+</li>
+<li>setup_content()
+: <a class="el" href="setup_8php.html#a88247384a96e14516f474d7af6a465c1">setup.php</a>
+</li>
+<li>setup_init()
+: <a class="el" href="setup_8php.html#a267555abd17290e659b4bf44b885e4e0">setup.php</a>
+</li>
+<li>setup_post()
+: <a class="el" href="setup_8php.html#a13cf286774149a0a7bd8adb8179cec75">setup.php</a>
+</li>
+<li>sexpref_selector()
+: <a class="el" href="profile__selectors_8php.html#a3b50b3ea4ea4bdbebebfffc5d1b157c7">profile_selectors.php</a>
+</li>
+<li>share_init()
+: <a class="el" href="share_8php.html#afeb26046bdd02567ecd29ab5f188b249">share.php</a>
+</li>
+<li>showForm()
+: <a class="el" href="fpostit_8php.html#a3f3ae3ae61578b5671673914fd894443">fpostit.php</a>
+</li>
+<li>site_default_perms()
+: <a class="el" href="permissions_8php.html#aa8b7b102c653649d7a71b5a1c044d90d">permissions.php</a>
+</li>
+<li>siteinfo_content()
+: <a class="el" href="siteinfo_8php.html#a70c09bfb6dd1c86a125a35f62ed53656">siteinfo.php</a>
+</li>
+<li>siteinfo_init()
+: <a class="el" href="siteinfo_8php.html#a3efbd0bd6564af19ec0a9ce0294e59d0">siteinfo.php</a>
+</li>
+<li>sitelist_init()
+: <a class="el" href="sitelist_8php.html#a665a59bf60f780b40f32c909f4a473b1">sitelist.php</a>
+</li>
+<li>smile_decode()
+: <a class="el" href="text_8php.html#aca0f589be74fab1a460c57e88dad9779">text.php</a>
+</li>
+<li>smile_encode()
+: <a class="el" href="text_8php.html#a44d460fcdee6247c67b9bef3ea15f3e6">text.php</a>
+</li>
+<li>smilies()
+: <a class="el" href="text_8php.html#a3d225b253bb9e0f2498c11647d927b0b">text.php</a>
+</li>
+<li>smilies_content()
+: <a class="el" href="smilies_8php.html#ab43b1e9f33a700a830aff14c7b3a617f">smilies.php</a>
+</li>
+<li>sort_by_date()
+: <a class="el" href="event_8php.html#a018ea4484910a873a7c1eaa126de9b1a">event.php</a>
+</li>
+<li>sort_item_children()
+: <a class="el" href="conversation_8php.html#ae996eb116d397a2c6396c312d7b98664">conversation.php</a>
+</li>
+<li>sort_thr_commented()
+: <a class="el" href="conversation_8php.html#a9f909b8885259b79c6ac8da93afd8f11">conversation.php</a>
+</li>
+<li>sort_thr_created()
+: <a class="el" href="conversation_8php.html#ac55e070f65f46fcc8e269f7896be4c7d">conversation.php</a>
+</li>
+<li>sort_thr_created_rev()
+: <a class="el" href="conversation_8php.html#a9cc2a679606da9e535a06433f9f553a0">conversation.php</a>
+</li>
+<li>sources_content()
+: <a class="el" href="sources_8php.html#ac442ccef080ab95772d8929fcafcb4b7">sources.php</a>
+</li>
+<li>sources_post()
+: <a class="el" href="sources_8php.html#ac73298ff162ce7b2de8dcaf3d3305b1e">sources.php</a>
+</li>
+<li>SSL_POLICY_FULL
+: <a class="el" href="boot_8php.html#a02566ac9d891369a1d3ebb81a15722fc">boot.php</a>
+</li>
+<li>SSL_POLICY_NONE
+: <a class="el" href="boot_8php.html#af86c651547aa8f9e549ee40a09455549">boot.php</a>
+</li>
+<li>SSL_POLICY_SELFSIGN
+: <a class="el" href="boot_8php.html#adca48aee78465ae3064ca4432c0d87b5">boot.php</a>
+</li>
+<li>sslify()
+: <a class="el" href="text_8php.html#a33bdb5d4bfff2ede7caf61a98ac0a2e9">text.php</a>
+</li>
+<li>sslify_init()
+: <a class="el" href="sslify_8php.html#a75b11e54a3d1fc83e7d4c0e8b4dab316">sslify.php</a>
+</li>
+<li>starred_init()
+: <a class="el" href="starred_8php.html#a63024fb418c678e49fd535e3752d349a">starred.php</a>
+</li>
+<li>startup()
+: <a class="el" href="boot_8php.html#aca47505b8732177f52bb2d647eb2741c">boot.php</a>
+</li>
+<li>status_editor()
+: <a class="el" href="conversation_8php.html#a2a7d541854bba755eb8ada59af7dcb1a">conversation.php</a>
+</li>
+<li>STORAGE_DEFAULT_PERMISSIONS
+: <a class="el" href="boot_8php.html#aecaa1b6945b317ba8f1daf4af2aed8e6">boot.php</a>
+</li>
+<li>store_item_tag()
+: <a class="el" href="taxonomy_8php.html#a4ba1339b2a7054971178ce194e4440fd">taxonomy.php</a>
+</li>
+<li>stream_perms_api_uids()
+: <a class="el" href="security_8php.html#ae92c5c1a1cbbc49ddbb8b3265d2db809">security.php</a>
+</li>
+<li>stream_perms_xchans()
+: <a class="el" href="security_8php.html#a15e0f8f511cc06192db63387f97238b3">security.php</a>
+</li>
+<li>string_plural_select_default()
+: <a class="el" href="language_8php.html#a151e5b4689aef86a12642cbb7a00bfe0">language.php</a>
+</li>
+<li>stringify_array_elms()
+: <a class="el" href="text_8php.html#a8796f6a9ca592ecdce7b3afc3462aa13">text.php</a>
+</li>
+<li>stripdcode_br_cb()
+: <a class="el" href="bb2diaspora_8php.html#a180b0e3a7d702998be19e3c3b44b0e93">bb2diaspora.php</a>
+</li>
+<li>subthread_content()
+: <a class="el" href="subthread_8php.html#a50368f3d825b77996030528e7fbfa3d3">subthread.php</a>
+</li>
+<li>suggest_content()
+: <a class="el" href="suggest_8php.html#a58748a8235d4523f8333847f3e42dd91">suggest.php</a>
+</li>
+<li>suggest_init()
+: <a class="el" href="suggest_8php.html#a696acf1dd8070e479adcc80c63c6718c">suggest.php</a>
+</li>
+<li>suggestion_query()
+: <a class="el" href="socgraph_8php.html#a76e6fca3d2bc842dcd9e710bb87c8329">socgraph.php</a>
+</li>
+<li>sync_directories()
+: <a class="el" href="dir__fns_8php.html#aa666e7df6ca8c332f4081c9b66b4bdf6">dir_fns.php</a>
+</li>
+<li>syncdirs()
+: <a class="el" href="dir__fns_8php.html#a6cae22cfdd6edda5ddf09e07abb3242a">dir_fns.php</a>
+</li>
+<li>system_down()
+: <a class="el" href="system__unavailable_8php.html#a73751a6bcc17ad3ca503496e2fb020fa">system_unavailable.php</a>
+</li>
+<li>system_unavailable()
+: <a class="el" href="boot_8php.html#ac608a34f3bc180e7724192e0fd31f9b0">boot.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_0x74.html b/doc/html/globals_0x74.html
new file mode 100644
index 000000000..8f69addac
--- /dev/null
+++ b/doc/html/globals_0x74.html
@@ -0,0 +1,285 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="globals_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_0x73.html#index_s"><span>s</span></a></li>
+ <li class="current"><a href="globals_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_0x74.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all file members with links to the files they belong to:</div>
+
+<h3><a class="anchor" id="index_t"></a>- t -</h3><ul>
+<li>t()
+: <a class="el" href="language_8php.html#aae0c3638fb476ae1e31f8d242f5dac04">language.php</a>
+</li>
+<li>tag_deliver()
+: <a class="el" href="items_8php.html#ab1bce4261bcf75ad62753b498a144d17">items.php</a>
+</li>
+<li>tagadelic()
+: <a class="el" href="taxonomy_8php.html#aaf90ba8b839d6459065f39a4f1109b8a">taxonomy.php</a>
+</li>
+<li>tagblock()
+: <a class="el" href="taxonomy_8php.html#ac21d1dff16d569e7d110167aea4e63c2">taxonomy.php</a>
+</li>
+<li>tagger_content()
+: <a class="el" href="tagger_8php.html#a0e4a3eb177d1684553c547503d67161c">tagger.php</a>
+</li>
+<li>tagrm_content()
+: <a class="el" href="tagrm_8php.html#adfd4ea5b4d7fc6d9c9e042af5cd7d49a">tagrm.php</a>
+</li>
+<li>tagrm_post()
+: <a class="el" href="tagrm_8php.html#a1702f40aa53a2fa93deade1f609abe78">tagrm.php</a>
+</li>
+<li>tags_sort()
+: <a class="el" href="taxonomy_8php.html#aaeded36bcc983b35d9205fe5b6c18c43">taxonomy.php</a>
+</li>
+<li>template_escape()
+: <a class="el" href="template__processor_8php.html#ab2bcd8738f20f293636a6ae8e1099db5">template_processor.php</a>
+</li>
+<li>template_unescape()
+: <a class="el" href="template__processor_8php.html#ac635bb19a5f6eadd6b0cddefdd537c1e">template_processor.php</a>
+</li>
+<li>TERM_CATEGORY
+: <a class="el" href="boot_8php.html#af33d1b2e98a1e21af672005525d46dfe">boot.php</a>
+</li>
+<li>TERM_FILE
+: <a class="el" href="boot_8php.html#afb97615e985a013799839b68b99018d7">boot.php</a>
+</li>
+<li>TERM_HASHTAG
+: <a class="el" href="boot_8php.html#a2750985ec445617d7e82ae3098c91e3f">boot.php</a>
+</li>
+<li>TERM_MENTION
+: <a class="el" href="boot_8php.html#ae37444eaa42705185080ccf3e670cbc2">boot.php</a>
+</li>
+<li>TERM_OBJ_CHANNEL
+: <a class="el" href="boot_8php.html#a8892374789fd261eb32a7969d934a14a">boot.php</a>
+</li>
+<li>TERM_OBJ_OBJECT
+: <a class="el" href="boot_8php.html#a882b666adfe21f035a0f8c02806066d6">boot.php</a>
+</li>
+<li>TERM_OBJ_PHOTO
+: <a class="el" href="boot_8php.html#a64617d4655804de2a3c86501ab4fdbfd">boot.php</a>
+</li>
+<li>TERM_OBJ_POST
+: <a class="el" href="boot_8php.html#a9eeb8989272d5ff804a616898bb13659">boot.php</a>
+</li>
+<li>TERM_OBJ_PROFILE
+: <a class="el" href="boot_8php.html#aead84fa27d7516b855220fe004964a45">boot.php</a>
+</li>
+<li>TERM_OBJ_THING
+: <a class="el" href="boot_8php.html#a0cc8dc76bd10ac0ec81bac08a46f82fe">boot.php</a>
+</li>
+<li>TERM_PCATEGORY
+: <a class="el" href="boot_8php.html#a45b12aefab9675baffc7a07a09486db8">boot.php</a>
+</li>
+<li>term_query()
+: <a class="el" href="taxonomy_8php.html#a7a913d19c77610da689be48fbbf6734c">taxonomy.php</a>
+</li>
+<li>TERM_SAVEDSEARCH
+: <a class="el" href="boot_8php.html#abd7bb40da9cc073297e49736b338ca07">boot.php</a>
+</li>
+<li>TERM_THING
+: <a class="el" href="boot_8php.html#a0d877df1e20bae765e1708be50f6b503">boot.php</a>
+</li>
+<li>TERM_UNKNOWN
+: <a class="el" href="boot_8php.html#a0c59dde058efebbc66520d136cbd1631">boot.php</a>
+</li>
+<li>terminate_friendship()
+: <a class="el" href="Contact_8php.html#a38daa1c210b78385307123450ca9a1fc">Contact.php</a>
+</li>
+<li>termtype()
+: <a class="el" href="items_8php.html#ad34827ed330898456783fb14c7b46154">items.php</a>
+</li>
+<li>tgroup_check()
+: <a class="el" href="items_8php.html#a88c6cf7649ac836fbbed82a7a0315110">items.php</a>
+</li>
+<li>theme_admin()
+: <a class="el" href="view_2theme_2blogga_2php_2config_8php.html#a09cd81013505f83aea0771243a1e4e53">config.php</a>
+</li>
+<li>theme_admin_post()
+: <a class="el" href="view_2theme_2blogga_2view_2theme_2blog_2config_8php.html#aef2da5582b7cb6b5f63e5ca5d69fd30b">config.php</a>
+</li>
+<li>theme_attachments()
+: <a class="el" href="text_8php.html#af9c9ac3f74c82dc60acfa404d0e9dc53">text.php</a>
+</li>
+<li>theme_content()
+: <a class="el" href="view_2theme_2apw_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d">config.php</a>
+</li>
+<li>theme_include()
+: <a class="el" href="plugin_8php.html#a65fedcffbe03562ef844cabee37d34e2">plugin.php</a>
+</li>
+<li>theme_post()
+: <a class="el" href="view_2theme_2apw_2php_2config_8php.html#ad29461920cf03b9ce1428e21eb1f4ba6">config.php</a>
+</li>
+<li>theme_status()
+: <a class="el" href="admin_8php.html#ad4f74f33944a98b56d2c8c7601f124a4">admin.php</a>
+</li>
+<li>thing_content()
+: <a class="el" href="thing_8php.html#a24a35f1e64029a67fdbea94a776ae04b">thing.php</a>
+</li>
+<li>thing_init()
+: <a class="el" href="thing_8php.html#a8be23b1d475ec3d9291999221c674c80">thing.php</a>
+</li>
+<li>timesel()
+: <a class="el" href="datetime_8php.html#a36d3d6dff8d76b5f295bb3d9c535a5b1">datetime.php</a>
+</li>
+<li>timezone_cmp()
+: <a class="el" href="datetime_8php.html#aa51b5a7ea4f931b23acbdfcea46e9865">datetime.php</a>
+</li>
+<li>title_is_body()
+: <a class="el" href="items_8php.html#aa371905f0a211b307cb3f7188c6cba04">items.php</a>
+</li>
+<li>toggle_mobile_init()
+: <a class="el" href="toggle__mobile_8php.html#aca53ade8971802b45c31e722b22c6254">toggle_mobile.php</a>
+</li>
+<li>toggle_safesearch_init()
+: <a class="el" href="toggle__safesearch_8php.html#a23d5cfb2727a266e44993ffbf5595a79">toggle_safesearch.php</a>
+</li>
+<li>toggle_theme()
+: <a class="el" href="admin_8php.html#af81f081851791cd15e49e8ff6722dc27">admin.php</a>
+</li>
+<li>tryoembed()
+: <a class="el" href="bbcode_8php.html#a55b0cb6973f1ec731de0e726bcc0efa7">bbcode.php</a>
+</li>
+<li>tt()
+: <a class="el" href="language_8php.html#ae310fb3880484ee1cc4faefe0c63c06d">language.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_0x75.html b/doc/html/globals_0x75.html
new file mode 100644
index 000000000..02a5f5f8a
--- /dev/null
+++ b/doc/html/globals_0x75.html
@@ -0,0 +1,240 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="globals_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_0x74.html#index_t"><span>t</span></a></li>
+ <li class="current"><a href="globals_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_0x75.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all file members with links to the files they belong to:</div>
+
+<h3><a class="anchor" id="index_u"></a>- u -</h3><ul>
+<li>uexport_init()
+: <a class="el" href="uexport_8php.html#a118920137dedebe0581623a2e57e7b0d">uexport.php</a>
+</li>
+<li>unamp()
+: <a class="el" href="text_8php.html#a29d6b804e368d3ef359ee295e96ed4c7">text.php</a>
+</li>
+<li>undo_post_tagging()
+: <a class="el" href="text_8php.html#a740ad03e00459039a2c0992246c4e727">text.php</a>
+</li>
+<li>unescape_underscores_in_links()
+: <a class="el" href="bb2diaspora_8php.html#a599428bceb6f6d82a6a78cb66811f747">bb2diaspora.php</a>
+</li>
+<li>uninstall_plugin()
+: <a class="el" href="plugin_8php.html#a093a9cb98f51e3643634bd8bc6ed6e76">plugin.php</a>
+</li>
+<li>unload_plugin()
+: <a class="el" href="plugin_8php.html#a90538627db68605aeb6db17a8ead6523">plugin.php</a>
+</li>
+<li>unobscure()
+: <a class="el" href="text_8php.html#a8264348059abd1d4d5bb521323d3b19a">text.php</a>
+</li>
+<li>unregister_hook()
+: <a class="el" href="plugin_8php.html#a56f71fe5adf9586ce950523d8180443e">plugin.php</a>
+</li>
+<li>unxmlify()
+: <a class="el" href="text_8php.html#a1360fed7f918d859daaca1c9f384f9af">text.php</a>
+</li>
+<li>update_channel_content()
+: <a class="el" href="update__channel_8php.html#aca52a9da500f0db2f0a8666af5bc06ba">update_channel.php</a>
+</li>
+<li>update_community_content()
+: <a class="el" href="update__community_8php.html#abdcc5c4ecebbe0b5fcba2755c69cb3b1">update_community.php</a>
+</li>
+<li>update_directory_entry()
+: <a class="el" href="dir__fns_8php.html#a44062d4b471d1e83f92f6c184585aa13">dir_fns.php</a>
+</li>
+<li>update_display_content()
+: <a class="el" href="update__display_8php.html#aa36ac524059e209d5d75a03c16206246">update_display.php</a>
+</li>
+<li>UPDATE_FAILED
+: <a class="el" href="boot_8php.html#a75fc600186b13c3b25e661afefb5eac8">boot.php</a>
+</li>
+<li>UPDATE_FLAGS_DELETED
+: <a class="el" href="boot_8php.html#aea392cb26ed617f3a8cde648385b5df0">boot.php</a>
+</li>
+<li>UPDATE_FLAGS_UPDATED
+: <a class="el" href="boot_8php.html#a9690d73434125ce594a1f5e7c2a4f7c0">boot.php</a>
+</li>
+<li>update_imported_item()
+: <a class="el" href="zot_8php.html#a31aad56acf8ff8f2353e6ff8595544df">zot.php</a>
+</li>
+<li>update_modtime()
+: <a class="el" href="zot_8php.html#ab319d1d9fff9c7775d9daef42d1f33dd">zot.php</a>
+</li>
+<li>update_network_content()
+: <a class="el" href="update__network_8php.html#a8abf5b9f65af6a27ee2f9d7207ed1b41">update_network.php</a>
+</li>
+<li>update_queue_time()
+: <a class="el" href="queue__fn_8php.html#a4c2876181f75a4a61e85b7f00dfdbba1">queue_fn.php</a>
+</li>
+<li>update_remote_id()
+: <a class="el" href="items_8php.html#a2baa9e05f1e8aa3dd61c85803ae39bd6">items.php</a>
+</li>
+<li>update_search_content()
+: <a class="el" href="update__search_8php.html#ace4c3a23fa7d6922399e27c297a6ba52">update_search.php</a>
+</li>
+<li>UPDATE_SUCCESS
+: <a class="el" href="boot_8php.html#ac86615ddc0763a00f5311c90e991730c">boot.php</a>
+</li>
+<li>update_suggestions()
+: <a class="el" href="socgraph_8php.html#a790690bb1a1d02483fe31632a160144d">socgraph.php</a>
+</li>
+<li>upgrade_bool_message()
+: <a class="el" href="plugin_8php.html#a754d7f53b3abc557b753c057dc4e021d">plugin.php</a>
+</li>
+<li>upgrade_link()
+: <a class="el" href="plugin_8php.html#a4fc13e528367f510fcb6d8bbfc559040">plugin.php</a>
+</li>
+<li>upgrade_message()
+: <a class="el" href="plugin_8php.html#a901657dd078e070516cf97285e0bada7">plugin.php</a>
+</li>
+<li>user_allow()
+: <a class="el" href="account_8php.html#ac5c570a2d46446bad4dd2501e9c5a4b1">account.php</a>
+</li>
+<li>user_deny()
+: <a class="el" href="account_8php.html#ac1653efba62493b9d87513e1b6c04c83">account.php</a>
+</li>
+<li>user_remove()
+: <a class="el" href="Contact_8php.html#a2fc191067dd571a79603c66b04b1ca15">Contact.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_0x76.html b/doc/html/globals_0x76.html
new file mode 100644
index 000000000..145d34826
--- /dev/null
+++ b/doc/html/globals_0x76.html
@@ -0,0 +1,189 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="globals_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_0x75.html#index_u"><span>u</span></a></li>
+ <li class="current"><a href="globals_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_0x76.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all file members with links to the files they belong to:</div>
+
+<h3><a class="anchor" id="index_v"></a>- v -</h3><ul>
+<li>valid_email()
+: <a class="el" href="text_8php.html#a6a3d80a6c6fb234fd0bac44203b828eb">text.php</a>
+</li>
+<li>validate_channelname()
+: <a class="el" href="identity_8php.html#af2802bc13a00a17b867bba7978ba8f58">identity.php</a>
+</li>
+<li>validate_email()
+: <a class="el" href="include_2network_8php.html#a897e7112d86eb95526cbd0bff9375f02">network.php</a>
+</li>
+<li>validate_url()
+: <a class="el" href="include_2network_8php.html#a5caa264fab6d2b2344e6bd5b298b08f2">network.php</a>
+</li>
+<li>vcard_from_xchan()
+: <a class="el" href="Contact_8php.html#a6348a532c9d26cd1c9afbc9aa6aa8960">Contact.php</a>
+</li>
+<li>view_init()
+: <a class="el" href="view_8php.html#ac168f6c61a91ba2063f13b441c0ae96e">view.php</a>
+</li>
+<li>viewconnections_content()
+: <a class="el" href="viewconnections_8php.html#ab6c4d983e97b3a8a879567ff76507776">viewconnections.php</a>
+</li>
+<li>viewconnections_init()
+: <a class="el" href="viewconnections_8php.html#a00163d50b17568f7b0e48b1ca9ab7330">viewconnections.php</a>
+</li>
+<li>viewsrc_content()
+: <a class="el" href="viewsrc_8php.html#a6eff3d0c1d7d14b335c4edb785cd60a4">viewsrc.php</a>
+</li>
+<li>visible_activity()
+: <a class="el" href="conversation_8php.html#a7eeaaf44506815576f3bd80053ef52c3">conversation.php</a>
+</li>
+<li>vote_content()
+: <a class="el" href="vote_8php.html#a6aa67489bf458ca5e3206e46dac68596">vote.php</a>
+</li>
+<li>vote_init()
+: <a class="el" href="vote_8php.html#ae0c6610f40afbbc1f4fe6494c51fbab2">vote.php</a>
+</li>
+<li>vote_post()
+: <a class="el" href="vote_8php.html#a57a9516ee1b923b224e66dcc47377fb2">vote.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_0x77.html b/doc/html/globals_0x77.html
new file mode 100644
index 000000000..da5be2e74
--- /dev/null
+++ b/doc/html/globals_0x77.html
@@ -0,0 +1,249 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="globals_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_0x76.html#index_v"><span>v</span></a></li>
+ <li class="current"><a href="globals_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_0x77.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all file members with links to the files they belong to:</div>
+
+<h3><a class="anchor" id="index_w"></a>- w -</h3><ul>
+<li>wall_attach_post()
+: <a class="el" href="wall__attach_8php.html#a7385e970e93228d082f0fd7254f6e653">wall_attach.php</a>
+</li>
+<li>wall_upload_post()
+: <a class="el" href="wall__upload_8php.html#a7cbe204244cf9e0380ee932263a74d8f">wall_upload.php</a>
+</li>
+<li>webfinger()
+: <a class="el" href="include_2network_8php.html#a8122356933bcd6b0a8567e8e15ae5cc5">network.php</a>
+</li>
+<li>webfinger_content()
+: <a class="el" href="webfinger_8php.html#a17dd28db6d390194bf9ecb809739d1d3">webfinger.php</a>
+</li>
+<li>webfinger_dfrn()
+: <a class="el" href="include_2network_8php.html#adf6008b38c555e98e7ed10da9ede2335">network.php</a>
+</li>
+<li>webpages_content()
+: <a class="el" href="webpages_8php.html#af3b7397d4abc153e3d2147740ee1a41d">webpages.php</a>
+</li>
+<li>wfinger_init()
+: <a class="el" href="wfinger_8php.html#ae21e50c8d0a5f3c9be9f43a4e519acd3">wfinger.php</a>
+</li>
+<li>what_next()
+: <a class="el" href="setup_8php.html#aea1ebdda58ec938f4e7b31aa5c5f6b58">setup.php</a>
+</li>
+<li>while
+: <a class="el" href="docblox__errorchecker_8php.html#af4ca738a05beffe9c8c23e1f7aea3c2d">docblox_errorchecker.php</a>
+</li>
+<li>widget_affinity()
+: <a class="el" href="widgets_8php.html#add9b24d3304e529a7975e96122315554">widgets.php</a>
+</li>
+<li>widget_archive()
+: <a class="el" href="widgets_8php.html#a7b1e357b5a2027718470b77ec921fc65">widgets.php</a>
+</li>
+<li>widget_categories()
+: <a class="el" href="widgets_8php.html#af37fdad3b2e861d860a4a8c4d8a76c0b">widgets.php</a>
+</li>
+<li>widget_collections()
+: <a class="el" href="widgets_8php.html#aa189a07241246d97efbee29f1c6a6f7f">widgets.php</a>
+</li>
+<li>widget_design_tools()
+: <a class="el" href="widgets_8php.html#a145ff35319cfa47a9cc07f9425bd674b">widgets.php</a>
+</li>
+<li>widget_dirsafemode()
+: <a class="el" href="widgets_8php.html#a268b01ce1ab8fe2cb346cb769b9d1091">widgets.php</a>
+</li>
+<li>widget_dirsort()
+: <a class="el" href="widgets_8php.html#a95c06bc9be133e89768746302d2ac395">widgets.php</a>
+</li>
+<li>widget_dirtags()
+: <a class="el" href="widgets_8php.html#a08035db02ff6a23260146b4c64153422">widgets.php</a>
+</li>
+<li>widget_filer()
+: <a class="el" href="widgets_8php.html#a5ab3b64496e02cab56429978ad55f1c0">widgets.php</a>
+</li>
+<li>widget_findpeople()
+: <a class="el" href="widgets_8php.html#ade630b19fb4c622b7b2f6f8ef89eefa2">widgets.php</a>
+</li>
+<li>widget_follow()
+: <a class="el" href="widgets_8php.html#ad1bf7aa69e8d100d95faba17c7bc91cd">widgets.php</a>
+</li>
+<li>widget_fullprofile()
+: <a class="el" href="widgets_8php.html#a70442dfa079312d9d5e5ee01be51a165">widgets.php</a>
+</li>
+<li>widget_mailmenu()
+: <a class="el" href="widgets_8php.html#afa2e55a78f95667a6da082efac7fec74">widgets.php</a>
+</li>
+<li>widget_menu_preview()
+: <a class="el" href="widgets_8php.html#a3bdfb81bf9a8ddf219924fa7eaf22013">widgets.php</a>
+</li>
+<li>widget_notes()
+: <a class="el" href="widgets_8php.html#a45ea061dabe9a8372e4ca3b9e5714256">widgets.php</a>
+</li>
+<li>widget_photo_albums()
+: <a class="el" href="widgets_8php.html#a702e2fc0adc9b615999eca18b7311b5e">widgets.php</a>
+</li>
+<li>widget_profile()
+: <a class="el" href="widgets_8php.html#abd2e508a2a0b911c4a838e3cb7599923">widgets.php</a>
+</li>
+<li>widget_savedsearch()
+: <a class="el" href="widgets_8php.html#a94203eb9bcd63cbdecbbcb15163598d8">widgets.php</a>
+</li>
+<li>widget_settings_menu()
+: <a class="el" href="widgets_8php.html#aaa73bcf1702eaadd9dcd253502f55e01">widgets.php</a>
+</li>
+<li>widget_suggestions()
+: <a class="el" href="widgets_8php.html#a0d404276fedc59f5038cf5c085028326">widgets.php</a>
+</li>
+<li>widget_tagcloud()
+: <a class="el" href="widgets_8php.html#a6dbc227aac750774284ee39c45f0a200">widgets.php</a>
+</li>
+<li>widget_tagcloud_wall()
+: <a class="el" href="widgets_8php.html#ae4ced69d83dbdd9e6b51660d9eba8653">widgets.php</a>
+</li>
+<li>widget_vcard()
+: <a class="el" href="widgets_8php.html#abe03366fd22fd27d683518fa0765da50">widgets.php</a>
+</li>
+<li>writepages_widget()
+: <a class="el" href="page__widgets_8php.html#a1a1e729da27f252cab6678288a17958f">page_widgets.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_0x78.html b/doc/html/globals_0x78.html
new file mode 100644
index 000000000..f016dce14
--- /dev/null
+++ b/doc/html/globals_0x78.html
@@ -0,0 +1,201 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="globals_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_0x77.html#index_w"><span>w</span></a></li>
+ <li class="current"><a href="globals_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_0x78.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all file members with links to the files they belong to:</div>
+
+<h3><a class="anchor" id="index_x"></a>- x -</h3><ul>
+<li>x()
+: <a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">boot.php</a>
+</li>
+<li>xchan_content()
+: <a class="el" href="xchan_8php.html#a9853348bf1a35c644460221ba75edc2d">xchan.php</a>
+</li>
+<li>XCHAN_FLAGS_CENSORED
+: <a class="el" href="boot_8php.html#accd6f36cc9f40225cbd720e4d12a7c6e">boot.php</a>
+</li>
+<li>XCHAN_FLAGS_DELETED
+: <a class="el" href="boot_8php.html#a9ea1290e00c6d40684892047f2c778a9">boot.php</a>
+</li>
+<li>XCHAN_FLAGS_HIDDEN
+: <a class="el" href="boot_8php.html#a1af3ed96de14aa0d7891b39cc75b60f2">boot.php</a>
+</li>
+<li>XCHAN_FLAGS_NORMAL
+: <a class="el" href="boot_8php.html#a8fdcc4ffb365a3267bd02ce8a8d466d6">boot.php</a>
+</li>
+<li>XCHAN_FLAGS_ORPHAN
+: <a class="el" href="boot_8php.html#a1c923b99bf77e4203ae94e5684b6ad0f">boot.php</a>
+</li>
+<li>XCHAN_FLAGS_SELFCENSORED
+: <a class="el" href="boot_8php.html#a5a681a672e007cdc22b43345d71f07c6">boot.php</a>
+</li>
+<li>XCHAN_FLAGS_SYSTEM
+: <a class="el" href="boot_8php.html#afef254290febac854c85fc698d9483a6">boot.php</a>
+</li>
+<li>xchan_mail_query()
+: <a class="el" href="text_8php.html#a543447c5ed766535221e2d9636b379ee">text.php</a>
+</li>
+<li>xchan_query()
+: <a class="el" href="text_8php.html#a36a2e5d418ee81140f25c4233cfecd1f">text.php</a>
+</li>
+<li>xml2array()
+: <a class="el" href="include_2network_8php.html#a99353baabbc3e0584b85eb79ee802cff">network.php</a>
+</li>
+<li>xml_status()
+: <a class="el" href="include_2network_8php.html#a9e9da2aafb806c98ecdc318604e60dc6">network.php</a>
+</li>
+<li>xmlify()
+: <a class="el" href="text_8php.html#aaed4413ed8918838b517e3b2fafaea0d">text.php</a>
+</li>
+<li>xpost_to_html2bbcode()
+: <a class="el" href="post__to__red_8php.html#af2713018a2dc97e88f121fc6215beb66">post_to_red.php</a>
+</li>
+<li>xrd_init()
+: <a class="el" href="xrd_8php.html#aee3cf087968e4a0ff3a87de16eb23270">xrd.php</a>
+</li>
+<li>xref_init()
+: <a class="el" href="xref_8php.html#a9bee399213b8de8226b0d60834307473">xref.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_0x7a.html b/doc/html/globals_0x7a.html
new file mode 100644
index 000000000..4b52df618
--- /dev/null
+++ b/doc/html/globals_0x7a.html
@@ -0,0 +1,240 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="globals_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_0x78.html#index_x"><span>x</span></a></li>
+ <li class="current"><a href="globals_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_0x7a.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all file members with links to the files they belong to:</div>
+
+<h3><a class="anchor" id="index_z"></a>- z -</h3><ul>
+<li>z_birthday()
+: <a class="el" href="datetime_8php.html#ab55e545b72ec8c097e052ea7d373491f">datetime.php</a>
+</li>
+<li>z_fetch_url()
+: <a class="el" href="include_2network_8php.html#aafd06c0a75402aefb06cfb9f9740fa37">network.php</a>
+</li>
+<li>z_input_filter()
+: <a class="el" href="text_8php.html#a324c58f37f6acdf9cd1922aa76077d9f">text.php</a>
+</li>
+<li>z_mime_content_type()
+: <a class="el" href="include_2attach_8php.html#a6fdd92775f31c07d2863e16e0026018a">attach.php</a>
+</li>
+<li>z_path()
+: <a class="el" href="boot_8php.html#aba208673515cbb8a55e5fa4a1da99fda">boot.php</a>
+</li>
+<li>z_post_url()
+: <a class="el" href="include_2network_8php.html#a9129fd55e7fc175b4ea9a195cccc16bc">network.php</a>
+</li>
+<li>z_readdir()
+: <a class="el" href="include_2attach_8php.html#aeb07968990e66a88c95483ca09a7f909">attach.php</a>
+</li>
+<li>z_root()
+: <a class="el" href="boot_8php.html#add517a0958ac684792c62142a3877f81">boot.php</a>
+</li>
+<li>ZCURL_TIMEOUT
+: <a class="el" href="boot_8php.html#a3cd42a70c6b3999590e4fd7a1a9096af">boot.php</a>
+</li>
+<li>zfinger_init()
+: <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger.php</a>
+</li>
+<li>zid()
+: <a class="el" href="identity_8php.html#a5b815330f3d177ab383af37a6c12e532">identity.php</a>
+</li>
+<li>zid_init()
+: <a class="el" href="identity_8php.html#a680fbafc2db023c5b1309e0180e81315">identity.php</a>
+</li>
+<li>zidify_callback()
+: <a class="el" href="text_8php.html#a405afe814a23f3bd94d826101aa168ab">text.php</a>
+</li>
+<li>zidify_img_callback()
+: <a class="el" href="text_8php.html#ab4a4c3d4700bc219bb84f33b499314f4">text.php</a>
+</li>
+<li>zidify_links()
+: <a class="el" href="text_8php.html#a29988052f3944111def3b6aaf2c7a8f6">text.php</a>
+</li>
+<li>zot_build_packet()
+: <a class="el" href="zot_8php.html#a3862b3161b2c8557dc1a95020179bd81">zot.php</a>
+</li>
+<li>zot_feed()
+: <a class="el" href="items_8php.html#a004e89d86b0f29b2c4da20108ecc4091">items.php</a>
+</li>
+<li>zot_fetch()
+: <a class="el" href="zot_8php.html#a61cdc1ec843663c423ed2d8160ae5aea">zot.php</a>
+</li>
+<li>zot_finger()
+: <a class="el" href="zot_8php.html#a95528377d7303131958c9f0b7158fdce">zot.php</a>
+</li>
+<li>zot_get_hublocs()
+: <a class="el" href="zot_8php.html#ae7cec2b417b5858fd4a41070f843d1d7">zot.php</a>
+</li>
+<li>zot_gethub()
+: <a class="el" href="zot_8php.html#a55056e863a7860bc0cf922e78fcce073">zot.php</a>
+</li>
+<li>zot_import()
+: <a class="el" href="zot_8php.html#aeea071f17e306fe3d0c488551906bfab">zot.php</a>
+</li>
+<li>zot_new_uid()
+: <a class="el" href="zot_8php.html#ab22d67660702056bf3f4696dcebf5ce7">zot.php</a>
+</li>
+<li>zot_process_response()
+: <a class="el" href="zot_8php.html#a928f5643ca66ae9635d85aeb2be62e03">zot.php</a>
+</li>
+<li>zot_refresh()
+: <a class="el" href="zot_8php.html#a7b23bfb31d4491231e1e73bdc077240d">zot.php</a>
+</li>
+<li>zot_register_hub()
+: <a class="el" href="zot_8php.html#a5bcdfef419b16075a0eca990956223dc">zot.php</a>
+</li>
+<li>ZOT_REVISION
+: <a class="el" href="boot_8php.html#a36b31575f992a10b5927b76efba9362e">boot.php</a>
+</li>
+<li>zot_zot()
+: <a class="el" href="zot_8php.html#ab3e9b99ddb11353f37f265a05bb42142">zot.php</a>
+</li>
+<li>zotfeed_init()
+: <a class="el" href="zotfeed_8php.html#a24dfc23d366e7f840cf2847d0c1c8eac">zotfeed.php</a>
+</li>
+<li>zping_content()
+: <a class="el" href="zping_8php.html#a4d3a6b0b8b04ed6469015823e615ee75">zping.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_dup.js b/doc/html/globals_dup.js
new file mode 100644
index 000000000..6f7377056
--- /dev/null
+++ b/doc/html/globals_dup.js
@@ -0,0 +1,30 @@
+var globals_dup =
+[
+ [ "$", "globals.html", null ],
+ [ "_", "globals_0x5f.html", null ],
+ [ "a", "globals_0x61.html", null ],
+ [ "b", "globals_0x62.html", null ],
+ [ "c", "globals_0x63.html", null ],
+ [ "d", "globals_0x64.html", null ],
+ [ "e", "globals_0x65.html", null ],
+ [ "f", "globals_0x66.html", null ],
+ [ "g", "globals_0x67.html", null ],
+ [ "h", "globals_0x68.html", null ],
+ [ "i", "globals_0x69.html", null ],
+ [ "j", "globals_0x6a.html", null ],
+ [ "k", "globals_0x6b.html", null ],
+ [ "l", "globals_0x6c.html", null ],
+ [ "m", "globals_0x6d.html", null ],
+ [ "n", "globals_0x6e.html", null ],
+ [ "o", "globals_0x6f.html", null ],
+ [ "p", "globals_0x70.html", null ],
+ [ "q", "globals_0x71.html", null ],
+ [ "r", "globals_0x72.html", null ],
+ [ "s", "globals_0x73.html", null ],
+ [ "t", "globals_0x74.html", null ],
+ [ "u", "globals_0x75.html", null ],
+ [ "v", "globals_0x76.html", null ],
+ [ "w", "globals_0x77.html", null ],
+ [ "x", "globals_0x78.html", null ],
+ [ "z", "globals_0x7a.html", null ]
+]; \ No newline at end of file
diff --git a/doc/html/globals_func.html b/doc/html/globals_func.html
new file mode 100644
index 000000000..6c305e4c3
--- /dev/null
+++ b/doc/html/globals_func.html
@@ -0,0 +1,152 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li class="current"><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li class="current"><a href="globals_func.html#index__"><span>_</span></a></li>
+ <li><a href="globals_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_func_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_func_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_func_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_func_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_func_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_func_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_func_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_func_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_func.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index__"></a>- _ -</h3><ul>
+<li>_well_known_init()
+: <a class="el" href="__well__known_8php.html#a6ebfa937a2024f0b5dab53f0ac90fed0">_well_known.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_func.js b/doc/html/globals_func.js
new file mode 100644
index 000000000..1a7a97c5f
--- /dev/null
+++ b/doc/html/globals_func.js
@@ -0,0 +1,29 @@
+var globals_func =
+[
+ [ "_", "globals_func.html", null ],
+ [ "a", "globals_func_0x61.html", null ],
+ [ "b", "globals_func_0x62.html", null ],
+ [ "c", "globals_func_0x63.html", null ],
+ [ "d", "globals_func_0x64.html", null ],
+ [ "e", "globals_func_0x65.html", null ],
+ [ "f", "globals_func_0x66.html", null ],
+ [ "g", "globals_func_0x67.html", null ],
+ [ "h", "globals_func_0x68.html", null ],
+ [ "i", "globals_func_0x69.html", null ],
+ [ "j", "globals_func_0x6a.html", null ],
+ [ "k", "globals_func_0x6b.html", null ],
+ [ "l", "globals_func_0x6c.html", null ],
+ [ "m", "globals_func_0x6d.html", null ],
+ [ "n", "globals_func_0x6e.html", null ],
+ [ "o", "globals_func_0x6f.html", null ],
+ [ "p", "globals_func_0x70.html", null ],
+ [ "q", "globals_func_0x71.html", null ],
+ [ "r", "globals_func_0x72.html", null ],
+ [ "s", "globals_func_0x73.html", null ],
+ [ "t", "globals_func_0x74.html", null ],
+ [ "u", "globals_func_0x75.html", null ],
+ [ "v", "globals_func_0x76.html", null ],
+ [ "w", "globals_func_0x77.html", null ],
+ [ "x", "globals_func_0x78.html", null ],
+ [ "z", "globals_func_0x7a.html", null ]
+]; \ No newline at end of file
diff --git a/doc/html/globals_func_0x61.html b/doc/html/globals_func_0x61.html
new file mode 100644
index 000000000..f553207f3
--- /dev/null
+++ b/doc/html/globals_func_0x61.html
@@ -0,0 +1,485 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li class="current"><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_func.html#index__"><span>_</span></a></li>
+ <li class="current"><a href="globals_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_func_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_func_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_func_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_func_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_func_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_func_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_func_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_func_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_func_0x61.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_a"></a>- a -</h3><ul>
+<li>abook_connections()
+: <a class="el" href="Contact_8php.html#ae8803c330352cbf1e828eb7490edf47e">Contact.php</a>
+</li>
+<li>abook_self()
+: <a class="el" href="Contact_8php.html#ad5b02c2a962ee55b1b7ca6c159d6e4c5">Contact.php</a>
+</li>
+<li>abook_toggle_flag()
+: <a class="el" href="Contact_8php.html#a024919623a830e8703ac4f23496dd66c">Contact.php</a>
+</li>
+<li>absurl()
+: <a class="el" href="boot_8php.html#a081307d681d7d04f17b9ced2076e7c85">boot.php</a>
+</li>
+<li>account_remove()
+: <a class="el" href="Contact_8php.html#a6e64de7db60b7243dce45fb6347636ff">Contact.php</a>
+</li>
+<li>account_total()
+: <a class="el" href="account_8php.html#a43e3042b2723d76915a030bac3c668b6">account.php</a>
+</li>
+<li>account_verify_password()
+: <a class="el" href="auth_8php.html#a07bae0e623e2daa9ee2cd5a8aa294dee">auth.php</a>
+</li>
+<li>achievements_content()
+: <a class="el" href="achievements_8php.html#a35ae04ada0e227d19671f289a32fb30e">achievements.php</a>
+</li>
+<li>acl_init()
+: <a class="el" href="acl_8php.html#ac6776dba871806ecdb5d1659bc2eb07a">acl.php</a>
+</li>
+<li>activity_match()
+: <a class="el" href="text_8php.html#af8a3e3a66a7b862d4510f145d2e13186">text.php</a>
+</li>
+<li>activity_sanitise()
+: <a class="el" href="items_8php.html#a36e656667193c83aa2cc03a024fc131b">items.php</a>
+</li>
+<li>add_children_to_list()
+: <a class="el" href="conversation_8php.html#ad3e1d4b15e7d6d026ee182edd58f692b">conversation.php</a>
+</li>
+<li>admin_content()
+: <a class="el" href="admin_8php.html#afef415e4011607fbb665610441595015">admin.php</a>
+</li>
+<li>admin_page_dbsync()
+: <a class="el" href="admin_8php.html#aaa6addf2dbc3f3fcf99244a56b41eade">admin.php</a>
+</li>
+<li>admin_page_hubloc()
+: <a class="el" href="admin_8php.html#a6943543f3138f6ee182cb701f415d1cc">admin.php</a>
+</li>
+<li>admin_page_hubloc_post()
+: <a class="el" href="admin_8php.html#a60ba9783ad14545814919970bc3fb725">admin.php</a>
+</li>
+<li>admin_page_logs()
+: <a class="el" href="admin_8php.html#a1d1362698af14d209aa3a0fb655551dd">admin.php</a>
+</li>
+<li>admin_page_logs_post()
+: <a class="el" href="admin_8php.html#a233b7c8c31776b7020532003c6e44e1c">admin.php</a>
+</li>
+<li>admin_page_plugins()
+: <a class="el" href="admin_8php.html#a54128076986ba80c4a103de3fc3e19a8">admin.php</a>
+</li>
+<li>admin_page_site()
+: <a class="el" href="admin_8php.html#ac0f3bd12431c056aad77bac9d09fa30e">admin.php</a>
+</li>
+<li>admin_page_site_post()
+: <a class="el" href="admin_8php.html#add865f4ae806ecbf716f423fc3e50e4f">admin.php</a>
+</li>
+<li>admin_page_summary()
+: <a class="el" href="admin_8php.html#ac6e95b920b5abd030cc522964987087a">admin.php</a>
+</li>
+<li>admin_page_themes()
+: <a class="el" href="admin_8php.html#af124619fdc278fe2bf14c45ddaa260fb">admin.php</a>
+</li>
+<li>admin_page_users()
+: <a class="el" href="admin_8php.html#a62f10f90c47686c9c3c37c4c03a108d2">admin.php</a>
+</li>
+<li>admin_page_users_post()
+: <a class="el" href="admin_8php.html#a5a696706a3869800e65fb365214241b7">admin.php</a>
+</li>
+<li>admin_post()
+: <a class="el" href="admin_8php.html#acf51f5837a7427832144c2bf7308ada3">admin.php</a>
+</li>
+<li>advanced_profile()
+: <a class="el" href="identity_8php.html#aa870d2c1f558cfd52bef05bc124e8fa4">identity.php</a>
+</li>
+<li>AES256CBC_decrypt()
+: <a class="el" href="crypto_8php.html#ac852ee41392d1358c3a54d54935e0bf9">crypto.php</a>
+</li>
+<li>AES256CBC_encrypt()
+: <a class="el" href="crypto_8php.html#a5c61821d205f95f127114159cbffa764">crypto.php</a>
+</li>
+<li>aes_encapsulate()
+: <a class="el" href="crypto_8php.html#a2148d7aac7b30c720f7ebda7e9790286">crypto.php</a>
+</li>
+<li>aes_unencapsulate()
+: <a class="el" href="crypto_8php.html#aca7c3a574bfb6c6ef1f2403a56823914">crypto.php</a>
+</li>
+<li>age()
+: <a class="el" href="datetime_8php.html#abc1652f96799cec6fce8797ba2ebc2df">datetime.php</a>
+</li>
+<li>all_friends()
+: <a class="el" href="socgraph_8php.html#a16ac51c505d72987ed8d6d6aed0e8586">socgraph.php</a>
+</li>
+<li>allowed_email()
+: <a class="el" href="include_2network_8php.html#aba38458a2ff2d92d3536488dbb119694">network.php</a>
+</li>
+<li>allowed_public_recips()
+: <a class="el" href="zot_8php.html#a703f528ade8382cf374e4119bd6f7859">zot.php</a>
+</li>
+<li>allowed_url()
+: <a class="el" href="include_2network_8php.html#aee35d9ad6b3f872bfb39ba3598936aa7">network.php</a>
+</li>
+<li>alt_pager()
+: <a class="el" href="text_8php.html#a75c243e06341ec16bd5a44b9b1cacd85">text.php</a>
+</li>
+<li>api_account_logout()
+: <a class="el" href="include_2api_8php.html#a2e94eab9d6c164bfef7a1b2ab87b339b">api.php</a>
+</li>
+<li>api_account_rate_limit_status()
+: <a class="el" href="include_2api_8php.html#ae8f5863e18d69421005c71441c9d99a5">api.php</a>
+</li>
+<li>api_account_verify_credentials()
+: <a class="el" href="include_2api_8php.html#a864191bb876a515ed71b17e260ef35ad">api.php</a>
+</li>
+<li>api_albums()
+: <a class="el" href="include_2api_8php.html#aa9dc5350b26d6c7727d6c4b641ecba18">api.php</a>
+</li>
+<li>api_apply_template()
+: <a class="el" href="include_2api_8php.html#a5990101034e7abf6404feba3cd273629">api.php</a>
+</li>
+<li>api_call()
+: <a class="el" href="include_2api_8php.html#a176c448d79c211ad41c2bbe3124658f5">api.php</a>
+</li>
+<li>api_channel_stream()
+: <a class="el" href="include_2api_8php.html#a72bfecac1970bc29b853073e816388ff">api.php</a>
+</li>
+<li>api_content()
+: <a class="el" href="mod_2api_8php.html#a33315b5bbf5418f6850b2038107b526d">api.php</a>
+</li>
+<li>api_date()
+: <a class="el" href="include_2api_8php.html#aea2dda92a155f2843a0ca188d8dfdf25">api.php</a>
+</li>
+<li>api_direct_messages_all()
+: <a class="el" href="include_2api_8php.html#a970b02c06dea8b229aa3d5fff9cf4705">api.php</a>
+</li>
+<li>api_direct_messages_box()
+: <a class="el" href="include_2api_8php.html#a7759ccddc8dff012ad168e511ffe5af5">api.php</a>
+</li>
+<li>api_direct_messages_conversation()
+: <a class="el" href="include_2api_8php.html#a9160288b7ac220635942d8dc209b78c3">api.php</a>
+</li>
+<li>api_direct_messages_inbox()
+: <a class="el" href="include_2api_8php.html#ad2b0192f3006918bea895de8074bf8d2">api.php</a>
+</li>
+<li>api_direct_messages_new()
+: <a class="el" href="include_2api_8php.html#a0991f72554f821255397d615e76f3203">api.php</a>
+</li>
+<li>api_direct_messages_sentbox()
+: <a class="el" href="include_2api_8php.html#a58cf4c02ef435996f5c3bc4283d3968d">api.php</a>
+</li>
+<li>api_export_basic()
+: <a class="el" href="include_2api_8php.html#adfc035ee6303c1d8ba5336a4ead2bd53">api.php</a>
+</li>
+<li>api_favorites()
+: <a class="el" href="include_2api_8php.html#a2c71b1226ef1283b5370bd1c200fee5f">api.php</a>
+</li>
+<li>api_ff_ids()
+: <a class="el" href="include_2api_8php.html#a36344c80b8e9755da2f2dd3a0e28cce8">api.php</a>
+</li>
+<li>api_followers_ids()
+: <a class="el" href="include_2api_8php.html#ab1ecb58954f722444bfe03233345cb1b">api.php</a>
+</li>
+<li>api_format_as()
+: <a class="el" href="include_2api_8php.html#a18cab7c6391df5c421753463f5d2a879">api.php</a>
+</li>
+<li>api_format_items()
+: <a class="el" href="include_2api_8php.html#a4c6fb9fb5203aa60f4b3afd4521db8ea">api.php</a>
+</li>
+<li>api_format_messages()
+: <a class="el" href="include_2api_8php.html#ae82608c317421f27446465aa6724733d">api.php</a>
+</li>
+<li>api_friendica_version()
+: <a class="el" href="include_2api_8php.html#a53b0680b682ae6078f2e1ed18cfb3f74">api.php</a>
+</li>
+<li>api_friends_ids()
+: <a class="el" href="include_2api_8php.html#acafd2899309a005fcb725289173dc7fe">api.php</a>
+</li>
+<li>api_get_user()
+: <a class="el" href="include_2api_8php.html#aa40bae797bcd9ccacffdce5a3b5a1afa">api.php</a>
+</li>
+<li>api_help_test()
+: <a class="el" href="include_2api_8php.html#ac5a64cc81d70ff3cf866093ea9721d23">api.php</a>
+</li>
+<li>api_item_get_user()
+: <a class="el" href="include_2api_8php.html#aa49741342ad8ba285737eea1209a37e1">api.php</a>
+</li>
+<li>api_login()
+: <a class="el" href="include_2api_8php.html#afe534f826e4282b72d66e8cadca7bb73">api.php</a>
+</li>
+<li>api_oauth_access_token()
+: <a class="el" href="include_2api_8php.html#aff322705cc6084b329003fc8eab0aad0">api.php</a>
+</li>
+<li>api_oauth_request_token()
+: <a class="el" href="include_2api_8php.html#aa1bddb580510e70cc1a7b7381667f1a3">api.php</a>
+</li>
+<li>api_photos()
+: <a class="el" href="include_2api_8php.html#aa6fc3bc8c0fad1d081db0dcc456dd77f">api.php</a>
+</li>
+<li>api_post()
+: <a class="el" href="mod_2api_8php.html#a6fe77f05c07cb51048df0d557b4b9bd2">api.php</a>
+</li>
+<li>api_register_func()
+: <a class="el" href="include_2api_8php.html#ac2c2b18c426d697d11a830bca146be8a">api.php</a>
+</li>
+<li>api_rss_extra()
+: <a class="el" href="include_2api_8php.html#a6a04b48168ba1d9dd2de3081a630611f">api.php</a>
+</li>
+<li>api_status_show()
+: <a class="el" href="include_2api_8php.html#a645397787618b5c548a31e8686e8cca4">api.php</a>
+</li>
+<li>api_statuses_destroy()
+: <a class="el" href="include_2api_8php.html#ad4c29f43418f6110f85a6b3998239ab4">api.php</a>
+</li>
+<li>api_statuses_f()
+: <a class="el" href="include_2api_8php.html#aa0d6b29fff0344a8e67f3507a6d01410">api.php</a>
+</li>
+<li>api_statuses_followers()
+: <a class="el" href="include_2api_8php.html#a6951c690d87775eb37e569c66011988e">api.php</a>
+</li>
+<li>api_statuses_friends()
+: <a class="el" href="include_2api_8php.html#ade742525b2e41c82b090799ef3c51d5e">api.php</a>
+</li>
+<li>api_statuses_home_timeline()
+: <a class="el" href="include_2api_8php.html#a528d8070ee74ea800102936ce73cf366">api.php</a>
+</li>
+<li>api_statuses_mediap()
+: <a class="el" href="include_2api_8php.html#a450d8732b7b608f7ac929aee61572b95">api.php</a>
+</li>
+<li>api_statuses_mentions()
+: <a class="el" href="include_2api_8php.html#a8b25a186bd0893f51aa72a62f655735e">api.php</a>
+</li>
+<li>api_statuses_public_timeline()
+: <a class="el" href="include_2api_8php.html#ad24ce1bf20867add4c9211a8eaf93f22">api.php</a>
+</li>
+<li>api_statuses_repeat()
+: <a class="el" href="include_2api_8php.html#ae0fa388479cace9c5a7a45b571ab42f8">api.php</a>
+</li>
+<li>api_statuses_show()
+: <a class="el" href="include_2api_8php.html#af6f1d89cdb0a0621025efbec1597bc63">api.php</a>
+</li>
+<li>api_statuses_update()
+: <a class="el" href="include_2api_8php.html#ad4d1634df6b35126552324683caaffa2">api.php</a>
+</li>
+<li>api_statuses_user_timeline()
+: <a class="el" href="include_2api_8php.html#a32f0dda848d0c11c727fe1c3e741c283">api.php</a>
+</li>
+<li>api_statusnet_config()
+: <a class="el" href="include_2api_8php.html#a623793229a7256dd31bcfd5ab90eef08">api.php</a>
+</li>
+<li>api_statusnet_version()
+: <a class="el" href="include_2api_8php.html#a8969e8d9c683f12ba17dcd4b059e020d">api.php</a>
+</li>
+<li>api_user()
+: <a class="el" href="include_2api_8php.html#afb99daa6b731bf497b81f2128084852c">api.php</a>
+</li>
+<li>api_users_show()
+: <a class="el" href="include_2api_8php.html#abe8e929e93f7ab134b1cb1fb30f19a76">api.php</a>
+</li>
+<li>appdirpath()
+: <a class="el" href="boot_8php.html#a75a90b0eadd0df510f7e63210733634d">boot.php</a>
+</li>
+<li>apps_content()
+: <a class="el" href="apps_8php.html#a546016cb960d0b110ee8e489dfa6c27c">apps.php</a>
+</li>
+<li>apw_form()
+: <a class="el" href="view_2theme_2apw_2php_2config_8php.html#a8b51951a70e1c1324be71345a61d70ec">config.php</a>
+</li>
+<li>apw_init()
+: <a class="el" href="apw_2php_2theme_8php.html#a42167c539043a39a6b83c252d05f1e89">theme.php</a>
+</li>
+<li>argc()
+: <a class="el" href="boot_8php.html#abc0a90a1a77f5b668aa7e4b57d1776a7">boot.php</a>
+</li>
+<li>argv()
+: <a class="el" href="boot_8php.html#a768f00b7d66be0daf7ef4eea2e862006">boot.php</a>
+</li>
+<li>arr_add_hashes()
+: <a class="el" href="parse__url_8php.html#aa7dd8f961bea042d62726ed909e4a868">parse_url.php</a>
+</li>
+<li>array_sanitise()
+: <a class="el" href="items_8php.html#abf7a1b73eb352d79acd36309b0dababd">items.php</a>
+</li>
+<li>array_xmlify()
+: <a class="el" href="text_8php.html#acedb584f65114a33f389efb796172a91">text.php</a>
+</li>
+<li>atom_author()
+: <a class="el" href="items_8php.html#a016dd86c827d08db89061ea81d15c6cb">items.php</a>
+</li>
+<li>atom_entry()
+: <a class="el" href="items_8php.html#a275108c050f7eb18bcbb5018e6b81cf6">items.php</a>
+</li>
+<li>attach_by_hash()
+: <a class="el" href="include_2attach_8php.html#a0d07c5b83d3d54e186f752e571847b36">attach.php</a>
+</li>
+<li>attach_by_hash_nodata()
+: <a class="el" href="include_2attach_8php.html#ad991208ce939387e2f93a3bce7d09932">attach.php</a>
+</li>
+<li>attach_change_permissions()
+: <a class="el" href="include_2attach_8php.html#a5c0875eafb8c0f8a0620ff7a875a2221">attach.php</a>
+</li>
+<li>attach_count_files()
+: <a class="el" href="include_2attach_8php.html#a887d2d44a3ef18dcb6624e7fb58dc8e3">attach.php</a>
+</li>
+<li>attach_delete()
+: <a class="el" href="include_2attach_8php.html#a70bd666e080c2af5a91f5d14c297b8cd">attach.php</a>
+</li>
+<li>attach_init()
+: <a class="el" href="mod_2attach_8php.html#aa88eb5ad87aa1036a30e70339cc6c1b1">attach.php</a>
+</li>
+<li>attach_list_files()
+: <a class="el" href="include_2attach_8php.html#a3634af95f11a023dd8e882c3c7a3600d">attach.php</a>
+</li>
+<li>attach_mkdir()
+: <a class="el" href="include_2attach_8php.html#ab6830b3ab74a5d284876141ac80f6cbc">attach.php</a>
+</li>
+<li>attach_store()
+: <a class="el" href="include_2attach_8php.html#a84a8a64c4805e1525b42d4add464833f">attach.php</a>
+</li>
+<li>attribute_contains()
+: <a class="el" href="text_8php.html#a95fd2f8f23a1948414a03ebc963bac57">text.php</a>
+</li>
+<li>authenticate_success()
+: <a class="el" href="security_8php.html#adc7bf51e3b8d67bd80e9348f9ab03733">security.php</a>
+</li>
+<li>autoname()
+: <a class="el" href="text_8php.html#a27cd2c1b3bcb49a0cfb7249e851725ca">text.php</a>
+</li>
+<li>avatar_img()
+: <a class="el" href="include_2network_8php.html#ab07ce9d75eae559865ed90aad2154bd7">network.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_func_0x62.html b/doc/html/globals_func_0x62.html
new file mode 100644
index 000000000..4474534e3
--- /dev/null
+++ b/doc/html/globals_func_0x62.html
@@ -0,0 +1,224 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li class="current"><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_func.html#index__"><span>_</span></a></li>
+ <li><a href="globals_func_0x61.html#index_a"><span>a</span></a></li>
+ <li class="current"><a href="globals_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_func_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_func_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_func_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_func_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_func_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_func_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_func_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_func_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_func_0x62.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_b"></a>- b -</h3><ul>
+<li>base64url_decode()
+: <a class="el" href="text_8php.html#a13286f8a95d2de6b102966ecc270c8d6">text.php</a>
+</li>
+<li>base64url_encode()
+: <a class="el" href="text_8php.html#a070384ec000fd65043fce11d5392d241">text.php</a>
+</li>
+<li>bb2diaspora()
+: <a class="el" href="bb2diaspora_8php.html#a4f10e0876b27373c762bc1abbe745f5c">bb2diaspora.php</a>
+</li>
+<li>bb_parse_crypt()
+: <a class="el" href="bbcode_8php.html#a851f5aafefe52474201b83f9fd65931f">bbcode.php</a>
+</li>
+<li>bb_qr()
+: <a class="el" href="bbcode_8php.html#a98d0eecc620c19561639f06cfbe8e74c">bbcode.php</a>
+</li>
+<li>bb_ShareAttributes()
+: <a class="el" href="bbcode_8php.html#a1c69e021d5e0aef97d6966bf3169c86a">bbcode.php</a>
+</li>
+<li>bb_ShareAttributesSimple()
+: <a class="el" href="bbcode_8php.html#a2be26414a367118143cc89e2d58e7377">bbcode.php</a>
+</li>
+<li>bb_spacefy()
+: <a class="el" href="bbcode_8php.html#a8911e027907820df3db03b4f76724b50">bbcode.php</a>
+</li>
+<li>bb_tag_preg_replace()
+: <a class="el" href="bb2diaspora_8php.html#ad0abe1a7ee50aa0736a233df0a422eba">bb2diaspora.php</a>
+</li>
+<li>bb_translate_video()
+: <a class="el" href="text_8php.html#a3d2793d66db3345fd290b71e2eadf98e">text.php</a>
+</li>
+<li>bb_unspacefy_and_trim()
+: <a class="el" href="bbcode_8php.html#a064dcfd9767df6f53be1a0e11ceeb15d">bbcode.php</a>
+</li>
+<li>bbcode()
+: <a class="el" href="bbcode_8php.html#a009f61aaf78771737ed0765c8463911b">bbcode.php</a>
+</li>
+<li>bbtoevent()
+: <a class="el" href="event_8php.html#a180cccd63c2a2f00ff432b03113531f3">event.php</a>
+</li>
+<li>bbtovcal()
+: <a class="el" href="event_8php.html#a184d6b9690e5b6dee35a0aa9edd47279">event.php</a>
+</li>
+<li>best_link_url()
+: <a class="el" href="conversation_8php.html#ad470fc7766f0db66d138fa1916c7a8b7">conversation.php</a>
+</li>
+<li>blocks_content()
+: <a class="el" href="blocks_8php.html#a2531a8fd51db3cecb2eb20c002c66e12">blocks.php</a>
+</li>
+<li>blog_init()
+: <a class="el" href="blogga_2php_2theme_8php.html#aa55c1cb1f05087b5002ecb633b550b1b">theme.php</a>
+</li>
+<li>blog_install()
+: <a class="el" href="blogga_2view_2theme_2blog_2theme_8php.html#aae58cc837fe56473d9f3370abfe533ae">theme.php</a>
+</li>
+<li>blog_uninstall()
+: <a class="el" href="blogga_2view_2theme_2blog_2theme_8php.html#a3e77dbe111f330c64a1ff6c741cd515c">theme.php</a>
+</li>
+<li>blogtheme_display_item()
+: <a class="el" href="blogga_2view_2theme_2blog_2theme_8php.html#a028ae8e9f2824670dfa76a6651d817e5">theme.php</a>
+</li>
+<li>blogtheme_form()
+: <a class="el" href="view_2theme_2blogga_2view_2theme_2blog_2config_8php.html#a8a311a402d3e746ce53fadc38e4b2d27">config.php</a>
+</li>
+<li>blogtheme_imgurl()
+: <a class="el" href="blogga_2view_2theme_2blog_2theme_8php.html#af634a3f721c5e238530d0636d33230ec">theme.php</a>
+</li>
+<li>breaklines()
+: <a class="el" href="html2plain_8php.html#a3214912e3d00cf0a948072daccf16740">html2plain.php</a>
+</li>
+<li>build_querystring()
+: <a class="el" href="boot_8php.html#a9cbab4ee728e9a8b4ce952bae643044e">boot.php</a>
+</li>
+<li>build_sync_packet()
+: <a class="el" href="zot_8php.html#ac34e479d27f32b82dd6b33542f81a6a7">zot.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_func_0x63.html b/doc/html/globals_func_0x63.html
new file mode 100644
index 000000000..d0f872eec
--- /dev/null
+++ b/doc/html/globals_func_0x63.html
@@ -0,0 +1,446 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li class="current"><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_func.html#index__"><span>_</span></a></li>
+ <li><a href="globals_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_func_0x62.html#index_b"><span>b</span></a></li>
+ <li class="current"><a href="globals_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_func_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_func_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_func_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_func_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_func_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_func_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_func_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_func_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_func_0x63.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_c"></a>- c -</h3><ul>
+<li>cal()
+: <a class="el" href="datetime_8php.html#aea356409ba69f9de412298c998595dd2">datetime.php</a>
+</li>
+<li>call_hooks()
+: <a class="el" href="plugin_8php.html#a7f05de16c0a32602853b09b99dd85e7c">plugin.php</a>
+</li>
+<li>can_comment_on_post()
+: <a class="el" href="items_8php.html#a1e75047cf175aaee8dd16aa761913ff9">items.php</a>
+</li>
+<li>categories_widget()
+: <a class="el" href="contact__widgets_8php.html#a165eb021e61c4dcab2a552f28628d353">contact_widgets.php</a>
+</li>
+<li>change_channel()
+: <a class="el" href="security_8php.html#a8d23d2597aae380a3341872fe9513380">security.php</a>
+</li>
+<li>chanlink_cid()
+: <a class="el" href="text_8php.html#a85e3a4851c16674834010d8419a5d7ca">text.php</a>
+</li>
+<li>chanlink_hash()
+: <a class="el" href="text_8php.html#a55ab893be57feda59c2a7ba1e58ff2d0">text.php</a>
+</li>
+<li>chanlink_url()
+: <a class="el" href="text_8php.html#a2e8d6c402603be3a1256a16605e09c2a">text.php</a>
+</li>
+<li>chanman_remove_everything_from_network()
+: <a class="el" href="include_2chanman_8php.html#a21ba9a5c961e866ff27aee3ee67bf99b">chanman.php</a>
+</li>
+<li>channel_content()
+: <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel.php</a>
+</li>
+<li>channel_init()
+: <a class="el" href="channel_8php.html#ac7c8c7845741baadf87fae6bc279f3dc">channel.php</a>
+</li>
+<li>channel_remove()
+: <a class="el" href="Contact_8php.html#a186162051a5127069cc851d78740f205">Contact.php</a>
+</li>
+<li>channel_total()
+: <a class="el" href="identity_8php.html#a77d2237f1846964634b1c99089c27c7d">identity.php</a>
+</li>
+<li>channelx_by_hash()
+: <a class="el" href="Contact_8php.html#a483cda56f9e37c3a4a8773dcdfeb0258">Contact.php</a>
+</li>
+<li>channelx_by_n()
+: <a class="el" href="Contact_8php.html#a3a0844dac1e86d523de5d2f432cfeebc">Contact.php</a>
+</li>
+<li>channelx_by_nick()
+: <a class="el" href="Contact_8php.html#a87e699f74a1102b25e8aa0432d86a91e">Contact.php</a>
+</li>
+<li>chanview_content()
+: <a class="el" href="chanview_8php.html#a4192c6da888c8c1165851acf9ad4cb8b">chanview.php</a>
+</li>
+<li>check_account_admin()
+: <a class="el" href="account_8php.html#a917d74aad0baf3e0c4b51cf1051e654f">account.php</a>
+</li>
+<li>check_account_email()
+: <a class="el" href="account_8php.html#ae052bd5558847bd38e89c213561a9771">account.php</a>
+</li>
+<li>check_account_invite()
+: <a class="el" href="account_8php.html#aaff7720423417a4333697894ffd9ddeb">account.php</a>
+</li>
+<li>check_account_password()
+: <a class="el" href="account_8php.html#a144b4891022567668375b58ea61cfff0">account.php</a>
+</li>
+<li>check_add()
+: <a class="el" href="setup_8php.html#ae8e4d9279a61de74d5f39962cb7b6ca1">setup.php</a>
+</li>
+<li>check_config()
+: <a class="el" href="boot_8php.html#a4c02d88e66852a01bd5a1feecb7c3ce3">boot.php</a>
+</li>
+<li>check_form_security_std_err_msg()
+: <a class="el" href="security_8php.html#a20f8b9851f23ee8894b8925584ef6821">security.php</a>
+</li>
+<li>check_form_security_token()
+: <a class="el" href="security_8php.html#a9c6180e82150a5a9af91a1255d096b5c">security.php</a>
+</li>
+<li>check_form_security_token_ForbiddenOnErr()
+: <a class="el" href="security_8php.html#a444ac867dfa8c37cf0a7a226412bee28">security.php</a>
+</li>
+<li>check_form_security_token_redirectOnErr()
+: <a class="el" href="security_8php.html#a77ba0d1889a39cf32434c5ce96fe1433">security.php</a>
+</li>
+<li>check_funcs()
+: <a class="el" href="setup_8php.html#a69a450e06dd3771fb51d3e4b0266a35e">setup.php</a>
+</li>
+<li>check_htaccess()
+: <a class="el" href="setup_8php.html#a0c3f3b671381f6dccd924b8ecdfc56c4">setup.php</a>
+</li>
+<li>check_htconfig()
+: <a class="el" href="setup_8php.html#a5ad92c0857d1dadd6b60a9a557159c9f">setup.php</a>
+</li>
+<li>check_item_source()
+: <a class="el" href="items_8php.html#a87ac9e359591721a824ecd23bbb56296">items.php</a>
+</li>
+<li>check_keys()
+: <a class="el" href="setup_8php.html#aa3bbb111780da70ba35cc23a306f2c76">setup.php</a>
+</li>
+<li>check_list_permissions()
+: <a class="el" href="permissions_8php.html#a0f5bd9f7f4c8fb7ba4b2c1ed048b4dc7">permissions.php</a>
+</li>
+<li>check_php()
+: <a class="el" href="setup_8php.html#a14d208682a88632290c895d20da6e7d6">setup.php</a>
+</li>
+<li>check_smarty3()
+: <a class="el" href="setup_8php.html#afd8b0b3ade1507c45325caf377bf459d">setup.php</a>
+</li>
+<li>check_store()
+: <a class="el" href="setup_8php.html#ab4b71369a25021d59247c917e98d8246">setup.php</a>
+</li>
+<li>check_webbie()
+: <a class="el" href="text_8php.html#a0c65597bb4aed3a039eb795ff540e5e3">text.php</a>
+</li>
+<li>clean_urls()
+: <a class="el" href="boot_8php.html#ab79b8b4555cae20d03f8200666d89d63">boot.php</a>
+</li>
+<li>cleardiv()
+: <a class="el" href="text_8php.html#afe18627c4983ee5f7c940a0992818cd5">text.php</a>
+</li>
+<li>cli_startup()
+: <a class="el" href="cli__startup_8php.html#adfdde63686e33ccd4851fa5edc4fc70b">cli_startup.php</a>
+</li>
+<li>cli_suggest_run()
+: <a class="el" href="cli__suggest_8php.html#a8f3a60fc96f4bec7d3837c4efc7725f2">cli_suggest.php</a>
+</li>
+<li>cloud_init()
+: <a class="el" href="cloud_8php.html#a1b79a6fe0454bc76673ad9aef55bf02d">cloud.php</a>
+</li>
+<li>collect_recipients()
+: <a class="el" href="items_8php.html#a01e3cf44e082fa9bd06dcde5bf713d70">items.php</a>
+</li>
+<li>collecturls()
+: <a class="el" href="html2plain_8php.html#ae1c203d0f089d5678d73a6c64a395201">html2plain.php</a>
+</li>
+<li>comanche_block()
+: <a class="el" href="comanche_8php.html#a5a7ab801717d38e91ac910b933973887">comanche.php</a>
+</li>
+<li>comanche_menu()
+: <a class="el" href="comanche_8php.html#a1fe339e1454803aa502ac89379c17f5b">comanche.php</a>
+</li>
+<li>comanche_parser()
+: <a class="el" href="comanche_8php.html#a1a208fdb40dd83d6298caec4290ee922">comanche.php</a>
+</li>
+<li>comanche_region()
+: <a class="el" href="comanche_8php.html#a5718daeda40bf835345fe061e8808cdf">comanche.php</a>
+</li>
+<li>comanche_replace_region()
+: <a class="el" href="comanche_8php.html#a028f004d5b8c23d6367816d899e17cfe">comanche.php</a>
+</li>
+<li>comanche_webpage()
+: <a class="el" href="comanche_8php.html#ae9fe1ce574db3dd0931eada80234f82a">comanche.php</a>
+</li>
+<li>comanche_widget()
+: <a class="el" href="comanche_8php.html#a6b0191c1a63db1696a2eb139d90d9e7f">comanche.php</a>
+</li>
+<li>common_content()
+: <a class="el" href="common_8php.html#ab63408f39abef7a6915186e8dabc5a96">common.php</a>
+</li>
+<li>common_friends()
+: <a class="el" href="socgraph_8php.html#a7d34cd58025bcd9e575282f44db75918">socgraph.php</a>
+</li>
+<li>common_friends_visitor_widget()
+: <a class="el" href="contact__widgets_8php.html#a552f8544528cec0c995cea7287ea9d65">contact_widgets.php</a>
+</li>
+<li>common_friends_zcid()
+: <a class="el" href="socgraph_8php.html#ac343a846241d36cdf046b08f3396cfe9">socgraph.php</a>
+</li>
+<li>common_init()
+: <a class="el" href="common_8php.html#aca62f113655809f41f49042ce9b123c2">common.php</a>
+</li>
+<li>community_content()
+: <a class="el" href="community_8php.html#a1197aafd6a6b540dbb4a0c04ade3a25a">community.php</a>
+</li>
+<li>community_init()
+: <a class="el" href="community_8php.html#a56c94ec978a38633c5628fa6f8e386d9">community.php</a>
+</li>
+<li>compare_permissions()
+: <a class="el" href="items_8php.html#a0790a4550b829e85504af548623002ca">items.php</a>
+</li>
+<li>completeurl()
+: <a class="el" href="parse__url_8php.html#a496f4e3836154f6f32b8e805a7160d3a">parse_url.php</a>
+</li>
+<li>connect_content()
+: <a class="el" href="connect_8php.html#a489f0a66c660de6ec4d6917b27674f07">connect.php</a>
+</li>
+<li>connect_init()
+: <a class="el" href="connect_8php.html#ad46a38f32fd7a3d324b1fa26373efa36">connect.php</a>
+</li>
+<li>connect_post()
+: <a class="el" href="connect_8php.html#a417ec27afe33f21a929667a665e32ee2">connect.php</a>
+</li>
+<li>connections_clone()
+: <a class="el" href="connections_8php.html#a15af118efee9c948b6f8294e54a73bb2">connections.php</a>
+</li>
+<li>connections_content()
+: <a class="el" href="connections_8php.html#aec2e457420fce3e3bf6a9f48e36df25c">connections.php</a>
+</li>
+<li>connections_init()
+: <a class="el" href="connections_8php.html#a1f23623f802af7bd35e95b0e94e5d558">connections.php</a>
+</li>
+<li>connections_post()
+: <a class="el" href="connections_8php.html#a1224058db8e3fb56463eb312f98e561d">connections.php</a>
+</li>
+<li>connedit_clone()
+: <a class="el" href="connedit_8php.html#a707ea7e63cf9674025b1d6b081ae74f5">connedit.php</a>
+</li>
+<li>connedit_content()
+: <a class="el" href="connedit_8php.html#a795acb3d9d841f55c255d7611681ab67">connedit.php</a>
+</li>
+<li>connedit_init()
+: <a class="el" href="connedit_8php.html#a4da871e075597a09a8b374b9171dd92e">connedit.php</a>
+</li>
+<li>connedit_post()
+: <a class="el" href="connedit_8php.html#a234c48426b652bf4d37053f2af329ac5">connedit.php</a>
+</li>
+<li>construct_activity_object()
+: <a class="el" href="items_8php.html#aa9e99613d38a97b39c8cf5449699c2ee">items.php</a>
+</li>
+<li>construct_activity_target()
+: <a class="el" href="items_8php.html#aa579bc4445d60098b1410961ca8e96b7">items.php</a>
+</li>
+<li>construct_page()
+: <a class="el" href="boot_8php.html#acc4e0c910af066148b810e5fde55fff1">boot.php</a>
+</li>
+<li>construct_verb()
+: <a class="el" href="items_8php.html#a8f3c85c584ccd2b98c3ca440e45b40f8">items.php</a>
+</li>
+<li>consume_feed()
+: <a class="el" href="items_8php.html#a8794863cdf8ce1333040933d3a3f66bd">items.php</a>
+</li>
+<li>contact_block()
+: <a class="el" href="text_8php.html#ad6432621d0fafcbcf3d3b9b49bef7784">text.php</a>
+</li>
+<li>contact_poll_interval()
+: <a class="el" href="contact__selectors_8php.html#a9839e8fdaac7ffb37bf1420493f5c28f">contact_selectors.php</a>
+</li>
+<li>contact_profile_assign()
+: <a class="el" href="contact__selectors_8php.html#a2c743d2eb526eb758d943a1490162d75">contact_selectors.php</a>
+</li>
+<li>contact_remove()
+: <a class="el" href="Contact_8php.html#a28e062c884331dbb5dfa713228c25ad6">Contact.php</a>
+</li>
+<li>contact_reputation()
+: <a class="el" href="contact__selectors_8php.html#ae499960d6467bd30c78607b1018baf53">contact_selectors.php</a>
+</li>
+<li>contact_select()
+: <a class="el" href="acl__selectors_8php.html#a9476997d2968a5794f3723878ed89c91">acl_selectors.php</a>
+</li>
+<li>contactgroup_content()
+: <a class="el" href="contactgroup_8php.html#a18c7391b1b25debaf98c9dba639caab3">contactgroup.php</a>
+</li>
+<li>conv_sort()
+: <a class="el" href="conversation_8php.html#abed85a41f1160598de880b84021c9cf7">conversation.php</a>
+</li>
+<li>conversation()
+: <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation.php</a>
+</li>
+<li>convert_xml_element_to_array()
+: <a class="el" href="include_2network_8php.html#ad4056d3ce69988f5c1a997a79f503246">network.php</a>
+</li>
+<li>count_all_friends()
+: <a class="el" href="socgraph_8php.html#af29d056beec10b4e38e5209c92452894">socgraph.php</a>
+</li>
+<li>count_common_friends()
+: <a class="el" href="socgraph_8php.html#a887d576f21fd708132a06d0f72f90f84">socgraph.php</a>
+</li>
+<li>count_common_friends_zcid()
+: <a class="el" href="socgraph_8php.html#af175807406d94407a5e11742a3287746">socgraph.php</a>
+</li>
+<li>count_descendants()
+: <a class="el" href="conversation_8php.html#ab2383dff4f823e580399ff469d90ab19">conversation.php</a>
+</li>
+<li>create_account()
+: <a class="el" href="account_8php.html#a141fe579c351c78209d425473f978eb5">account.php</a>
+</li>
+<li>create_identity()
+: <a class="el" href="identity_8php.html#a345f4c943d84de502ec6e72d2c813945">identity.php</a>
+</li>
+<li>create_sys_channel()
+: <a class="el" href="identity_8php.html#a1cf83ac2b645de12868edaa3a5718f05">identity.php</a>
+</li>
+<li>cronhooks_run()
+: <a class="el" href="cronhooks_8php.html#a4c4c1bbec4ecc9a0efa00dd6afd2c0ca">cronhooks.php</a>
+</li>
+<li>crypto_encapsulate()
+: <a class="el" href="crypto_8php.html#a32fc08d57a5694f94d8543ecbb03323c">crypto.php</a>
+</li>
+<li>crypto_unencapsulate()
+: <a class="el" href="crypto_8php.html#a0781202b0a43b82426929cc87c2fa2b5">crypto.php</a>
+</li>
+<li>curPageURL()
+: <a class="el" href="boot_8php.html#aa4221641e5c21db69fa52c426b9017f5">boot.php</a>
+</li>
+<li>current_theme()
+: <a class="el" href="boot_8php.html#ad206598b909e8eb67eb0e0bb5ef69c13">boot.php</a>
+</li>
+<li>current_theme_url()
+: <a class="el" href="boot_8php.html#a926cad0b3d8b9d9ee5da1898fc063ba3">boot.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_func_0x64.html b/doc/html/globals_func_0x64.html
new file mode 100644
index 000000000..bfb83e73e
--- /dev/null
+++ b/doc/html/globals_func_0x64.html
@@ -0,0 +1,269 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li class="current"><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_func.html#index__"><span>_</span></a></li>
+ <li><a href="globals_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_func_0x63.html#index_c"><span>c</span></a></li>
+ <li class="current"><a href="globals_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_func_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_func_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_func_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_func_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_func_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_func_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_func_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_func_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_func_0x64.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_d"></a>- d -</h3><ul>
+<li>datesel()
+: <a class="el" href="datetime_8php.html#ac265b86f384ee094ed5479aae02aa5c8">datetime.php</a>
+</li>
+<li>datesel_format()
+: <a class="el" href="datetime_8php.html#a5f29553799005b1fd4e9ce9d98ce05aa">datetime.php</a>
+</li>
+<li>datetime_convert()
+: <a class="el" href="datetime_8php.html#ad6301e74b0f9267d52f8d432b5beb226">datetime.php</a>
+</li>
+<li>day_translate()
+: <a class="el" href="text_8php.html#a63fb21c0bed2fc72eef2c1471ac42b63">text.php</a>
+</li>
+<li>dba_factory()
+: <a class="el" href="dba__driver_8php.html#ac10e60f6e5b95bcf67bd82cb88f37947">dba_driver.php</a>
+</li>
+<li>dba_timer()
+: <a class="el" href="boot_8php.html#a3e0930933fb2c0bf8211cc7ab4e1c3b4">boot.php</a>
+</li>
+<li>dbesc()
+: <a class="el" href="dba__driver_8php.html#ab222aa1dbf9ea93b320f82028739127e">dba_driver.php</a>
+</li>
+<li>dbesc_array()
+: <a class="el" href="dba__driver_8php.html#a65b83462bd26968106aebd43f16540e4">dba_driver.php</a>
+</li>
+<li>dbesc_array_cb()
+: <a class="el" href="dba__driver_8php.html#af531546fac5f0836a8557a4f6dfee930">dba_driver.php</a>
+</li>
+<li>dbg()
+: <a class="el" href="dba__driver_8php.html#aa6607893d8f60ade9122bcfbd1a53ffb">dba_driver.php</a>
+</li>
+<li>dbq()
+: <a class="el" href="dba__driver_8php.html#aa377074e70981e8c4e82ca0accd068ee">dba_driver.php</a>
+</li>
+<li>decode_tags()
+: <a class="el" href="items_8php.html#a56b2a4abcadfac71175cd50555528cc3">items.php</a>
+</li>
+<li>del_config()
+: <a class="el" href="include_2config_8php.html#a549910227348003efc3c05c9105c42da">config.php</a>
+</li>
+<li>del_pconfig()
+: <a class="el" href="include_2config_8php.html#a7ad2081c5f812ac4387fd76f3762d941">config.php</a>
+</li>
+<li>del_xconfig()
+: <a class="el" href="include_2config_8php.html#a9c171def547deee16738dc58fdeb4b72">config.php</a>
+</li>
+<li>delegate_content()
+: <a class="el" href="delegate_8php.html#a943eea8996ef348eb845c498f9f354dd">delegate.php</a>
+</li>
+<li>delete_imported_item()
+: <a class="el" href="zot_8php.html#adfeb9400ae6b726beec89f8f1e8fde72">zot.php</a>
+</li>
+<li>delete_item_lowlevel()
+: <a class="el" href="items_8php.html#a2b56a4c01bd22a648d52ec9af1a04259">items.php</a>
+</li>
+<li>deletenode()
+: <a class="el" href="html2bbcode_8php.html#a71a07f135d196ec5943b13f7b2e6a9b2">html2bbcode.php</a>
+</li>
+<li>deliver_run()
+: <a class="el" href="deliver_8php.html#a397afcb9afecf0c1816b0951189dd346">deliver.php</a>
+</li>
+<li>design_tools()
+: <a class="el" href="text_8php.html#a87a3cefc603302c78982f1d8e1245265">text.php</a>
+</li>
+<li>detect_language()
+: <a class="el" href="language_8php.html#a632da17c7ac0d2dc1a00a4706870194b">language.php</a>
+</li>
+<li>diaspora2bb()
+: <a class="el" href="bb2diaspora_8php.html#a26c09c218413610e62e60754c579f6c6">bb2diaspora.php</a>
+</li>
+<li>diaspora_ol()
+: <a class="el" href="bb2diaspora_8php.html#a8b96bd45884fa1c40b942939354197d4">bb2diaspora.php</a>
+</li>
+<li>diaspora_ul()
+: <a class="el" href="bb2diaspora_8php.html#adc92ccda5f85ed27e64fcc17712c89cc">bb2diaspora.php</a>
+</li>
+<li>dir_safe_mode()
+: <a class="el" href="dir__fns_8php.html#acf621621e929d49441da30aad76a58cf">dir_fns.php</a>
+</li>
+<li>dir_sort_links()
+: <a class="el" href="dir__fns_8php.html#ae56881d69bb6f8e828c9e35454386774">dir_fns.php</a>
+</li>
+<li>dir_tagadelic()
+: <a class="el" href="taxonomy_8php.html#a088371f4bc19155b2291508f5cd63332">taxonomy.php</a>
+</li>
+<li>dir_tagblock()
+: <a class="el" href="taxonomy_8php.html#a599ee71dd3194c8127b00dabec77abc1">taxonomy.php</a>
+</li>
+<li>directory_content()
+: <a class="el" href="mod_2directory_8php.html#aac79396570d759da2efac24fcedf5b44">directory.php</a>
+</li>
+<li>directory_init()
+: <a class="el" href="mod_2directory_8php.html#a5ee59c213508b6b9787612a8219cb5bf">directory.php</a>
+</li>
+<li>directory_run()
+: <a class="el" href="include_2directory_8php.html#aa75d3b0697ca1456aaabdb37a74aa0f0">directory.php</a>
+</li>
+<li>dirprofile_init()
+: <a class="el" href="dirprofile_8php.html#a3e1d30d3d93863ff5615f2df4ac7f052">dirprofile.php</a>
+</li>
+<li>dirsearch_content()
+: <a class="el" href="dirsearch_8php.html#aa1fb04e1de4f25b63349ac78f94ceb4c">dirsearch.php</a>
+</li>
+<li>dirsearch_init()
+: <a class="el" href="dirsearch_8php.html#a3e51964ae3f5ff147403407b65324752">dirsearch.php</a>
+</li>
+<li>display_content()
+: <a class="el" href="display_8php.html#a37137c98d47bf3306f4c2bb9f5b60de0">display.php</a>
+</li>
+<li>dlogger()
+: <a class="el" href="text_8php.html#a0a1f7c0e97f9ecbebf3e5834582b014c">text.php</a>
+</li>
+<li>dob()
+: <a class="el" href="datetime_8php.html#a3f2897db32e745fe2f3e70a6b46578f8">datetime.php</a>
+</li>
+<li>drop_item()
+: <a class="el" href="items_8php.html#afa1db13c2a8b73b5b17b97f17e5a19d1">items.php</a>
+</li>
+<li>drop_items()
+: <a class="el" href="items_8php.html#a668ece2c37f05cc3abe538eb0dabfe55">items.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_func_0x65.html b/doc/html/globals_func_0x65.html
new file mode 100644
index 000000000..1ca8149c3
--- /dev/null
+++ b/doc/html/globals_func_0x65.html
@@ -0,0 +1,212 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li class="current"><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_func.html#index__"><span>_</span></a></li>
+ <li><a href="globals_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_func_0x64.html#index_d"><span>d</span></a></li>
+ <li class="current"><a href="globals_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_func_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_func_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_func_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_func_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_func_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_func_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_func_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_func_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_func_0x65.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_e"></a>- e -</h3><ul>
+<li>editblock_content()
+: <a class="el" href="editblock_8php.html#abbe8f55de06967bc8d79d620509a49e6">editblock.php</a>
+</li>
+<li>editlayout_content()
+: <a class="el" href="editlayout_8php.html#aa877e4157a26b099de904164181dd386">editlayout.php</a>
+</li>
+<li>editpost_content()
+: <a class="el" href="editpost_8php.html#a34011690864d122680c802e9e748ccfb">editpost.php</a>
+</li>
+<li>editwebpage_content()
+: <a class="el" href="editwebpage_8php.html#a375e945255fad79a71036528f7480650">editwebpage.php</a>
+</li>
+<li>email_header_encode()
+: <a class="el" href="include_2network_8php.html#a469b9bd700269cd07d954f1a16c5899b">network.php</a>
+</li>
+<li>email_send()
+: <a class="el" href="include_2network_8php.html#a1ff07d9fad93b713b93da0ab77aab7f0">network.php</a>
+</li>
+<li>encode_item()
+: <a class="el" href="items_8php.html#a82955cc578f0fa600acec84475026194">items.php</a>
+</li>
+<li>encode_item_flags()
+: <a class="el" href="items_8php.html#a5f690fc2484abec07840b4f9dd525bd9">items.php</a>
+</li>
+<li>encode_item_terms()
+: <a class="el" href="items_8php.html#ac6673627d289ee4f547de0fe3b7acd0a">items.php</a>
+</li>
+<li>encode_item_xchan()
+: <a class="el" href="items_8php.html#a566c601726697e044e75284af7fb6f17">items.php</a>
+</li>
+<li>encode_mail()
+: <a class="el" href="items_8php.html#a2d840c74ed23d1b6c7daee05cf89dda7">items.php</a>
+</li>
+<li>encode_rel_links()
+: <a class="el" href="items_8php.html#aa723c0571e314a1853a24c5854b4f54f">items.php</a>
+</li>
+<li>enumerate_permissions()
+: <a class="el" href="items_8php.html#afbcf26dfcf8a83fff952aa858c1b7b67">items.php</a>
+</li>
+<li>escape_tags()
+: <a class="el" href="text_8php.html#aa5148a0dfea2a1ca64c3d52f10aa2d64">text.php</a>
+</li>
+<li>ev_compare()
+: <a class="el" href="event_8php.html#a32ba1b9ddf7a744a9a1512b052e5f850">event.php</a>
+</li>
+<li>event_store()
+: <a class="el" href="event_8php.html#a89ef533faf345db8d64a58d4856bde3a">event.php</a>
+</li>
+<li>events_content()
+: <a class="el" href="events_8php.html#a1d293fb217ae6bc9e3858c4b32e363ec">events.php</a>
+</li>
+<li>events_post()
+: <a class="el" href="events_8php.html#ab3e8a8f901175f8e40a8089eea45c075">events.php</a>
+</li>
+<li>expand_acl()
+: <a class="el" href="text_8php.html#ae4282a39492caa23ccbc2ce98e54f110">text.php</a>
+</li>
+<li>expand_groups()
+: <a class="el" href="include_2group_8php.html#a22a81875259c7d3d64d4848afea6b345">group.php</a>
+</li>
+<li>expire_run()
+: <a class="el" href="expire_8php.html#a444e45c9b67727b27db4c779fd51a298">expire.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_func_0x66.html b/doc/html/globals_func_0x66.html
new file mode 100644
index 000000000..badffe4f9
--- /dev/null
+++ b/doc/html/globals_func_0x66.html
@@ -0,0 +1,275 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li class="current"><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_func.html#index__"><span>_</span></a></li>
+ <li><a href="globals_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_func_0x65.html#index_e"><span>e</span></a></li>
+ <li class="current"><a href="globals_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_func_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_func_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_func_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_func_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_func_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_func_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_func_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_func_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_func_0x66.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_f"></a>- f -</h3><ul>
+<li>fbrowser_content()
+: <a class="el" href="fbrowser_8php.html#aee476addcf7a3e0fe9454f7dfd5a56c4">fbrowser.php</a>
+</li>
+<li>feature_enabled()
+: <a class="el" href="features_8php.html#a52b5bdfb61b256713efecf7a7b20b0c0">features.php</a>
+</li>
+<li>feed_hublinks()
+: <a class="el" href="text_8php.html#a8d8c4a11e53461caca21181ebd72daca">text.php</a>
+</li>
+<li>feed_init()
+: <a class="el" href="feed_8php.html#af86137700b56f33d1d5f25c8dec22c04">feed.php</a>
+</li>
+<li>feed_salmonlinks()
+: <a class="el" href="text_8php.html#a89929fa6f70a8ba54d5273fcf622b665">text.php</a>
+</li>
+<li>fetch_lrdd_template()
+: <a class="el" href="include_2network_8php.html#a8d5a3afb51cc932032b5dcc159efaae0">network.php</a>
+</li>
+<li>fetch_post_tags()
+: <a class="el" href="items_8php.html#adf980098b6de9c3993bc3ff26a8dd6f9">items.php</a>
+</li>
+<li>field_timezone()
+: <a class="el" href="datetime_8php.html#a03900dcf0f9e3c58793a031673a70326">datetime.php</a>
+</li>
+<li>file_tag_decode()
+: <a class="el" href="taxonomy_8php.html#a08df5164926d2b31b8e9fcfe919de2b6">taxonomy.php</a>
+</li>
+<li>file_tag_encode()
+: <a class="el" href="taxonomy_8php.html#a3299482ac20e9d79453048dd52881d37">taxonomy.php</a>
+</li>
+<li>file_tag_file_query()
+: <a class="el" href="taxonomy_8php.html#a163b5131f388080b0fc82398d3a32fe1">taxonomy.php</a>
+</li>
+<li>fileas_widget()
+: <a class="el" href="contact__widgets_8php.html#a1eda66319d170f60a8d07c7ece95533b">contact_widgets.php</a>
+</li>
+<li>filer_content()
+: <a class="el" href="filer_8php.html#a5fd5d7e61b2f9c43cb5f110c89dc4274">filer.php</a>
+</li>
+<li>filerm_content()
+: <a class="el" href="filerm_8php.html#ae2eb28d2054fa2c37e38689882172208">filerm.php</a>
+</li>
+<li>filestorage_content()
+: <a class="el" href="filestorage_8php.html#a61bb1be78472555df4ce619f51014040">filestorage.php</a>
+</li>
+<li>filestorage_post()
+: <a class="el" href="filestorage_8php.html#ad3b64e3ece9831f9d3a9f00c0ae983cd">filestorage.php</a>
+</li>
+<li>find_thread_parent_index()
+: <a class="el" href="conversation_8php.html#ae59703b07ce2ddf627b4172ff26058b6">conversation.php</a>
+</li>
+<li>find_upstream_directory()
+: <a class="el" href="dir__fns_8php.html#a8c15aa69da12f2d3476b9e93b82b337d">dir_fns.php</a>
+</li>
+<li>find_xchan_in_array()
+: <a class="el" href="text_8php.html#ace3c98538c63e09b70a363210b414112">text.php</a>
+</li>
+<li>findpeople_widget()
+: <a class="el" href="contact__widgets_8php.html#a57e73ebcfd62bb5d8c7a7b9e663726d6">contact_widgets.php</a>
+</li>
+<li>first_post_date()
+: <a class="el" href="items_8php.html#a0cf98bb619f07dd18f602683a55a5f59">items.php</a>
+</li>
+<li>fix_attached_file_permissions()
+: <a class="el" href="item_8php.html#a3daae7944f737bd30412a0d042207c0f">item.php</a>
+</li>
+<li>fix_attached_photo_permissions()
+: <a class="el" href="item_8php.html#a7b63a9d0cd02096e17dcf11f4afa7c10">item.php</a>
+</li>
+<li>fix_mce_lf()
+: <a class="el" href="text_8php.html#afdc69fe3f6c09e35e46304dcea63ae28">text.php</a>
+</li>
+<li>fix_private_photos()
+: <a class="el" href="items_8php.html#aba98fcbbcd7044a7e9ea34edabc14c87">items.php</a>
+</li>
+<li>fix_system_urls()
+: <a class="el" href="boot_8php.html#aca5e42678e178c6b9034610d66666fd7">boot.php</a>
+</li>
+<li>fixacl()
+: <a class="el" href="acl__selectors_8php.html#ad6664fb8330308e23f2645cd6624727e">acl_selectors.php</a>
+</li>
+<li>follow_content()
+: <a class="el" href="mod_2follow_8php.html#a4c540ea4e9f5c581c1a53516ac585592">follow.php</a>
+</li>
+<li>follow_init()
+: <a class="el" href="mod_2follow_8php.html#a171f5b19f50d7738adc3b2e96ec6018a">follow.php</a>
+</li>
+<li>format_categories()
+: <a class="el" href="text_8php.html#a3054189cff173977f4216c9a3dd29e1b">text.php</a>
+</li>
+<li>format_css_if_exists()
+: <a class="el" href="plugin_8php.html#a9039e15aae27676af7777dcbee5a11d6">plugin.php</a>
+</li>
+<li>format_event_bbcode()
+: <a class="el" href="event_8php.html#abb74206cf42d694307c3d7abb7af9869">event.php</a>
+</li>
+<li>format_event_diaspora()
+: <a class="el" href="bb2diaspora_8php.html#a29a2ad41f5826f3975fa9a49934ff863">bb2diaspora.php</a>
+</li>
+<li>format_event_html()
+: <a class="el" href="event_8php.html#a2ac9f1b08de03250ecd794f705781d17">event.php</a>
+</li>
+<li>format_filer()
+: <a class="el" href="text_8php.html#a4e4d42b0a805148d9f9a92bcac89bf91">text.php</a>
+</li>
+<li>format_js_if_exists()
+: <a class="el" href="plugin_8php.html#ad9ff8ba554576383c5911a4bce068c1f">plugin.php</a>
+</li>
+<li>format_like()
+: <a class="el" href="conversation_8php.html#a3d8e30cc94f9a175054c021305d3aca3">conversation.php</a>
+</li>
+<li>format_location()
+: <a class="el" href="conversation_8php.html#a0891aaa4492cba2b51eda12fe01957f3">conversation.php</a>
+</li>
+<li>format_notification()
+: <a class="el" href="include_2notify_8php.html#a0e61728e487df50c72e6434f911a57d3">notify.php</a>
+</li>
+<li>format_term_for_display()
+: <a class="el" href="taxonomy_8php.html#adfead45e3b8a3dfb2b4a4b9281d0dbe1">taxonomy.php</a>
+</li>
+<li>fsuggest_content()
+: <a class="el" href="fsuggest_8php.html#aa6c49ed4b50a387f1845f36844dd7998">fsuggest.php</a>
+</li>
+<li>fsuggest_post()
+: <a class="el" href="fsuggest_8php.html#a61ecfe10ce937ed526614f8fd3de3c7d">fsuggest.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_func_0x67.html b/doc/html/globals_func_0x67.html
new file mode 100644
index 000000000..f67e4bb28
--- /dev/null
+++ b/doc/html/globals_func_0x67.html
@@ -0,0 +1,353 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li class="current"><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_func.html#index__"><span>_</span></a></li>
+ <li><a href="globals_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_func_0x66.html#index_f"><span>f</span></a></li>
+ <li class="current"><a href="globals_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_func_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_func_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_func_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_func_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_func_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_func_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_func_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_func_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_func_0x67.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_g"></a>- g -</h3><ul>
+<li>gender_selector()
+: <a class="el" href="profile__selectors_8php.html#ae2b2c087e6530c61c0b256fd26d52355">profile_selectors.php</a>
+</li>
+<li>generate_user_guid()
+: <a class="el" href="text_8php.html#ae4f6881d7e13623f8eded6277595112a">text.php</a>
+</li>
+<li>get_account_id()
+: <a class="el" href="boot_8php.html#afe88b920aa285982edb817a0dd44eb37">boot.php</a>
+</li>
+<li>get_all_perms()
+: <a class="el" href="permissions_8php.html#aeca9b280f3dc3358c89976d81d690008">permissions.php</a>
+</li>
+<li>get_app()
+: <a class="el" href="boot_8php.html#a0e6db7e365f2b041a828b93786f694bc">boot.php</a>
+</li>
+<li>get_atom_elements()
+: <a class="el" href="items_8php.html#a896c1809d58f2d7a42cfe14577958ddf">items.php</a>
+</li>
+<li>get_bb_tag_pos()
+: <a class="el" href="bb2diaspora_8php.html#a4c2f8f11b29a06809d9b07782215b1b2">bb2diaspora.php</a>
+</li>
+<li>get_best_language()
+: <a class="el" href="language_8php.html#a980dee1d8715a98ab02e36b59facf8ed">language.php</a>
+</li>
+<li>get_birthdays()
+: <a class="el" href="identity_8php.html#ad2c97627a313d53df1a1c7b4215ddb51">identity.php</a>
+</li>
+<li>get_browser_language()
+: <a class="el" href="language_8php.html#ace67d6cad57da08d030ad9dc9b8c836e">language.php</a>
+</li>
+<li>get_capath()
+: <a class="el" href="include_2network_8php.html#a78e89557b2fbd344ad790846d761b0c7">network.php</a>
+</li>
+<li>get_cloudpath()
+: <a class="el" href="include_2attach_8php.html#a6aa00ea010ea030110faefb75eafc1ce">attach.php</a>
+</li>
+<li>get_config()
+: <a class="el" href="include_2config_8php.html#af02c96e6b37335774b548914ede1d22e">config.php</a>
+</li>
+<li>get_config_from_storage()
+: <a class="el" href="include_2config_8php.html#af08b7adb63adfb2eda7c466fba0cce74">config.php</a>
+</li>
+<li>get_custom_nav()
+: <a class="el" href="boot_8php.html#a899d24fd074594ceebbf72e1feff335f">boot.php</a>
+</li>
+<li>get_db_errno()
+: <a class="el" href="setup_8php.html#a8652788e8589778c5f81634a9d5b9429">setup.php</a>
+</li>
+<li>get_default_profile_photo()
+: <a class="el" href="identity_8php.html#ab1485a26b032956e1496fc08c58b83ed">identity.php</a>
+</li>
+<li>get_dim()
+: <a class="el" href="datetime_8php.html#a7df24d72ea05922d3127363e2295174c">datetime.php</a>
+</li>
+<li>get_events()
+: <a class="el" href="identity_8php.html#ae381db3d43f8e7c1da8b15d14ecf5312">identity.php</a>
+</li>
+<li>get_features()
+: <a class="el" href="features_8php.html#ae73c5b03b01c7284ed7e7e0e774e975c">features.php</a>
+</li>
+<li>get_feed_for()
+: <a class="el" href="items_8php.html#a04a35b610acfe54434df08adec39c0c7">items.php</a>
+</li>
+<li>get_first_dim()
+: <a class="el" href="datetime_8php.html#aba971b67f17fecf050813f1eba72367f">datetime.php</a>
+</li>
+<li>get_form_security_token()
+: <a class="el" href="security_8php.html#acd06ef411116115c2f0a92633700db8a">security.php</a>
+</li>
+<li>get_intltext_template()
+: <a class="el" href="plugin_8php.html#acb63c27d07f6d7dffe95f98a6cef1295">plugin.php</a>
+</li>
+<li>get_item_children()
+: <a class="el" href="conversation_8php.html#a7f6ef0dfa554bacf620e84c18d386e67">conversation.php</a>
+</li>
+<li>get_item_contact()
+: <a class="el" href="items_8php.html#aab9c6bae4c40799867596bdaae9829fd">items.php</a>
+</li>
+<li>get_item_elements()
+: <a class="el" href="items_8php.html#a536d0313b6ffe33b9d2490c4e25c5361">items.php</a>
+</li>
+<li>get_mail_elements()
+: <a class="el" href="items_8php.html#a94ddb1d6c8fa21dd7433677e85168037">items.php</a>
+</li>
+<li>get_markup_template()
+: <a class="el" href="plugin_8php.html#a75f7dfed291fd7add7fc85b5c022a1f4">plugin.php</a>
+</li>
+<li>get_max_import_size()
+: <a class="el" href="boot_8php.html#a97769915c9f14adc4f8ab1ea2cecfd90">boot.php</a>
+</li>
+<li>get_mentions()
+: <a class="el" href="text_8php.html#a76d1b3435c067978d7b484c45f56472b">text.php</a>
+</li>
+<li>get_mood_verbs()
+: <a class="el" href="text_8php.html#a736db13a966b8abaf8c9198faa35911a">text.php</a>
+</li>
+<li>get_my_address()
+: <a class="el" href="identity_8php.html#a490972c02fdb638c52ec0e012a30bfd2">identity.php</a>
+</li>
+<li>get_my_url()
+: <a class="el" href="identity_8php.html#aa46321e1cd6a3b8dfde8bf9510112fec">identity.php</a>
+</li>
+<li>get_observer_hash()
+: <a class="el" href="boot_8php.html#a623e49c79943f3e7bdb770d021683cf7">boot.php</a>
+</li>
+<li>get_pconfig()
+: <a class="el" href="include_2config_8php.html#ad58a4913937179adb13201c2ee3261ad">config.php</a>
+</li>
+<li>get_perms()
+: <a class="el" href="permissions_8php.html#a040fd3d3b8517658b1668ae0cd093972">permissions.php</a>
+</li>
+<li>get_plink()
+: <a class="el" href="text_8php.html#aac0969ae09853205992ba06ab9f9f61a">text.php</a>
+</li>
+<li>get_plugin_info()
+: <a class="el" href="plugin_8php.html#aff0178bd8d0b34a94d5efddc883edd35">plugin.php</a>
+</li>
+<li>get_poke_verbs()
+: <a class="el" href="text_8php.html#aa46f941155c2ac1155f2f17ffb0adb66">text.php</a>
+</li>
+<li>get_profile_elements()
+: <a class="el" href="items_8php.html#a251343637ff40a50cca93452cd530c26">items.php</a>
+</li>
+<li>get_public_feed()
+: <a class="el" href="items_8php.html#a079e099e15d88d47aeb6ca6d60da7107">items.php</a>
+</li>
+<li>get_rel_link()
+: <a class="el" href="text_8php.html#a3972701c5c83624ec4e2d06242f614e7">text.php</a>
+</li>
+<li>get_rpost_path()
+: <a class="el" href="zot_8php.html#a8e22dbc6f884be3644a892a876cbd972">zot.php</a>
+</li>
+<li>get_sys_channel()
+: <a class="el" href="identity_8php.html#aaff86ee3b5984821e7a256c2da5f1a51">identity.php</a>
+</li>
+<li>get_tags()
+: <a class="el" href="text_8php.html#a4659fbc4e54ddc700c3aa66b9092c623">text.php</a>
+</li>
+<li>get_terms_oftype()
+: <a class="el" href="taxonomy_8php.html#a0fb8cf0ac7bcbc8b27d856fe9bf69cd1">taxonomy.php</a>
+</li>
+<li>get_theme_config_file()
+: <a class="el" href="settings_8php.html#a39abc76ff5459c57e3b957664f273f18">settings.php</a>
+</li>
+<li>get_theme_info()
+: <a class="el" href="plugin_8php.html#ad48de9c0fb7f19413a2aa49250d00405">plugin.php</a>
+</li>
+<li>get_theme_screenshot()
+: <a class="el" href="plugin_8php.html#a48047edfbef770125a5508dcc2f9282f">plugin.php</a>
+</li>
+<li>get_theme_uid()
+: <a class="el" href="identity_8php.html#aaeb666872995e3ab8da8f7bc5f3b2bd3">identity.php</a>
+</li>
+<li>get_things()
+: <a class="el" href="taxonomy_8php.html#a7747fa859ac56fbffd4f9782d85505de">taxonomy.php</a>
+</li>
+<li>get_xconfig()
+: <a class="el" href="include_2config_8php.html#aa3dc1d3de2d091ac702e675acd3a085e">config.php</a>
+</li>
+<li>goaway()
+: <a class="el" href="boot_8php.html#a5ab6181607a090bcdbaa13b15b85aba1">boot.php</a>
+</li>
+<li>gprobe_run()
+: <a class="el" href="gprobe_8php.html#adf72cb0a70b5b9d99fdec1cc60e18ed1">gprobe.php</a>
+</li>
+<li>group_add()
+: <a class="el" href="include_2group_8php.html#a06ec565d2b64e79044e7c1bf91a2a4ce">group.php</a>
+</li>
+<li>group_add_member()
+: <a class="el" href="include_2group_8php.html#a0122ef312df2c5546b1a46b3e6c7b31b">group.php</a>
+</li>
+<li>group_byname()
+: <a class="el" href="include_2group_8php.html#abd66a5ea34a07a3422dc2dde6c7b3ecb">group.php</a>
+</li>
+<li>group_content()
+: <a class="el" href="mod_2group_8php.html#a07a64f6c65b0080d8190b3d9728a7a83">group.php</a>
+</li>
+<li>group_get_members()
+: <a class="el" href="include_2group_8php.html#a5bd191d9692e6c34d48c0ede10810f09">group.php</a>
+</li>
+<li>group_post()
+: <a class="el" href="mod_2group_8php.html#aed1f009b1221348021bb34761160ef35">group.php</a>
+</li>
+<li>group_rec_byhash()
+: <a class="el" href="include_2group_8php.html#a90e157b3e1b99c981809cb5a2abd3245">group.php</a>
+</li>
+<li>group_rmv()
+: <a class="el" href="include_2group_8php.html#a4118f498bbd1530c1d0136d016d197a5">group.php</a>
+</li>
+<li>group_rmv_member()
+: <a class="el" href="include_2group_8php.html#a540e3ef36f47d47532646be4241f6518">group.php</a>
+</li>
+<li>group_select()
+: <a class="el" href="acl__selectors_8php.html#aa1e3bc344ca2b29f97eb9860216d21a0">acl_selectors.php</a>
+</li>
+<li>group_side()
+: <a class="el" href="include_2group_8php.html#a6a69bd7be032fa8ce4e49c43a42cc6e9">group.php</a>
+</li>
+<li>groups_containing()
+: <a class="el" href="include_2group_8php.html#afb802ae2ce73aae4bc36d157f7b6a92f">group.php</a>
+</li>
+<li>guess_image_type()
+: <a class="el" href="photo__driver_8php.html#a243cee492ce443afb6a7d77d54b6c4aa">photo_driver.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_func_0x68.html b/doc/html/globals_func_0x68.html
new file mode 100644
index 000000000..8917d5efa
--- /dev/null
+++ b/doc/html/globals_func_0x68.html
@@ -0,0 +1,203 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li class="current"><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_func.html#index__"><span>_</span></a></li>
+ <li><a href="globals_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_func_0x67.html#index_g"><span>g</span></a></li>
+ <li class="current"><a href="globals_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_func_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_func_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_func_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_func_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_func_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_func_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_func_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_func_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_func_0x68.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_h"></a>- h -</h3><ul>
+<li>handle_tag()
+: <a class="el" href="item_8php.html#aa22feef4de326e1d7078dedd892e615c">item.php</a>
+</li>
+<li>has_permissions()
+: <a class="el" href="items_8php.html#a77051724d1784074ff187e73a4db93fe">items.php</a>
+</li>
+<li>head_add_css()
+: <a class="el" href="plugin_8php.html#a23c4fccf1eb5fcd63b24783ba1f05f7a">plugin.php</a>
+</li>
+<li>head_add_js()
+: <a class="el" href="plugin_8php.html#a516591850f4fd49fd1425cfa54089db8">plugin.php</a>
+</li>
+<li>head_get_css()
+: <a class="el" href="plugin_8php.html#af92789f559b89a380e49d303218aeeca">plugin.php</a>
+</li>
+<li>head_get_icon()
+: <a class="el" href="boot_8php.html#a24a7a70afedd5d85fe0eadc85afa9f77">boot.php</a>
+</li>
+<li>head_get_js()
+: <a class="el" href="plugin_8php.html#a65ab52cb1a7030d5190e247211bef2a1">plugin.php</a>
+</li>
+<li>head_remove_css()
+: <a class="el" href="plugin_8php.html#a9ab6caae31935f6cf781ce7872db7cdf">plugin.php</a>
+</li>
+<li>head_remove_js()
+: <a class="el" href="plugin_8php.html#a4a0ae7b881e7c8af99a69e3b03f898b4">plugin.php</a>
+</li>
+<li>head_set_icon()
+: <a class="el" href="boot_8php.html#a0e4701c9742c3ef88f02ac450a042a84">boot.php</a>
+</li>
+<li>help_content()
+: <a class="el" href="help_8php.html#af055e15f600ffa6fbca9386fdf715224">help.php</a>
+</li>
+<li>home_content()
+: <a class="el" href="home_8php.html#aa1cf697851a646755baf537f75334c46">home.php</a>
+</li>
+<li>home_init()
+: <a class="el" href="home_8php.html#ac4642c38b6f23a8d065dd4a75c620bde">home.php</a>
+</li>
+<li>hostxrd_init()
+: <a class="el" href="hostxrd_8php.html#aa37ffc8e7900bc76c4828bd25916db92">hostxrd.php</a>
+</li>
+<li>html2bb_video()
+: <a class="el" href="text_8php.html#a138a3a611fa7f4f3630674145fc826bf">text.php</a>
+</li>
+<li>html2bbcode()
+: <a class="el" href="html2bbcode_8php.html#a5ad726995ac4070213abdb3bd09f4837">html2bbcode.php</a>
+</li>
+<li>html2plain()
+: <a class="el" href="html2plain_8php.html#ab3e121fa9f3feb16f9f942e705bc6c04">html2plain.php</a>
+</li>
+<li>http_status_exit()
+: <a class="el" href="include_2network_8php.html#a4cfb2c05a1c295317283d762440ce0b2">network.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_func_0x69.html b/doc/html/globals_func_0x69.html
new file mode 100644
index 000000000..dc155ac19
--- /dev/null
+++ b/doc/html/globals_func_0x69.html
@@ -0,0 +1,266 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li class="current"><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_func.html#index__"><span>_</span></a></li>
+ <li><a href="globals_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_func_0x68.html#index_h"><span>h</span></a></li>
+ <li class="current"><a href="globals_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_func_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_func_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_func_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_func_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_func_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_func_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_func_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_func_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_func_0x69.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_i"></a>- i -</h3><ul>
+<li>identity_basic_export()
+: <a class="el" href="identity_8php.html#a3570a4eb77332b292d394c4132cb8f03">identity.php</a>
+</li>
+<li>identity_check_service_class()
+: <a class="el" href="identity_8php.html#ac9fcd5c4c371998790b5c55c3d0f4633">identity.php</a>
+</li>
+<li>ids_to_querystr()
+: <a class="el" href="text_8php.html#a436a8de00c942364c2d0fcfc7e1f4b5a">text.php</a>
+</li>
+<li>import_author_xchan()
+: <a class="el" href="items_8php.html#ae73794179b62d39bb597ff670ab1c1e5">items.php</a>
+</li>
+<li>import_author_zot()
+: <a class="el" href="zot_8php.html#ad149f1e98c0c5b88ff9147e6ee3f330d">zot.php</a>
+</li>
+<li>import_channel_photo()
+: <a class="el" href="photo__driver_8php.html#a1d0bc7161dec0d177b7d3bbe4421af9a">photo_driver.php</a>
+</li>
+<li>import_content()
+: <a class="el" href="import_8php.html#afdf25ed70096d5dbf4f6d0ca79fea184">import.php</a>
+</li>
+<li>import_directory_keywords()
+: <a class="el" href="zot_8php.html#a3bf11286c2619b4ca28e49d5b5ab374a">zot.php</a>
+</li>
+<li>import_directory_profile()
+: <a class="el" href="zot_8php.html#aeec89da5b6ff090c63a79de4de884a35">zot.php</a>
+</li>
+<li>import_post()
+: <a class="el" href="import_8php.html#af17fef0410518f7eac205d0ea416eaa2">import.php</a>
+</li>
+<li>import_profile_photo()
+: <a class="el" href="photo__driver_8php.html#a78f5a10c568d2a9bbbb129dc96548887">photo_driver.php</a>
+</li>
+<li>import_site()
+: <a class="el" href="zot_8php.html#a2657e141d62d5f67ad3c87651b585299">zot.php</a>
+</li>
+<li>import_xchan()
+: <a class="el" href="zot_8php.html#a56f3f65514e4e7f0cd117d01735aebd1">zot.php</a>
+</li>
+<li>in_arrayi()
+: <a class="el" href="text_8php.html#a75c326298519ed14ebe762194c8a3f2a">text.php</a>
+</li>
+<li>info()
+: <a class="el" href="boot_8php.html#adfb2fc7be5a4226c0a8e24131da9d498">boot.php</a>
+</li>
+<li>insert_hook()
+: <a class="el" href="plugin_8php.html#aeaebe63dcf6fa2794f363ba2bc0b2c6b">plugin.php</a>
+</li>
+<li>install_plugin()
+: <a class="el" href="plugin_8php.html#a482131013272a1d5d5c1b1469c6c55d5">plugin.php</a>
+</li>
+<li>invite_content()
+: <a class="el" href="invite_8php.html#a244385b28cfd021d308715f01158bfd9">invite.php</a>
+</li>
+<li>invite_post()
+: <a class="el" href="invite_8php.html#aeb0881c0f93c8e8552e5ed756ce6e5a5">invite.php</a>
+</li>
+<li>is_a_date_arg()
+: <a class="el" href="text_8php.html#a1557112a774ec00fa06ed6b6f6495506">text.php</a>
+</li>
+<li>is_ajax()
+: <a class="el" href="boot_8php.html#ac17fc8a416ea79e9d5cb4dc9a8ff8c5c">boot.php</a>
+</li>
+<li>is_foreigner()
+: <a class="el" href="identity_8php.html#ae2b140df652a55ca11bb6a99005fce35">identity.php</a>
+</li>
+<li>is_member()
+: <a class="el" href="identity_8php.html#a9637c557e13d9671f3eeb124ab98212a">identity.php</a>
+</li>
+<li>is_site_admin()
+: <a class="el" href="boot_8php.html#aa1e828bbbcba170265eb2668d8daf42e">boot.php</a>
+</li>
+<li>item_check_service_class()
+: <a class="el" href="item_8php.html#a5b1b36cb301a94b38150074f0d424e74">item.php</a>
+</li>
+<li>item_content()
+: <a class="el" href="item_8php.html#a764bbb2e9a885a86fb23d0b5e4a09221">item.php</a>
+</li>
+<li>item_expire()
+: <a class="el" href="items_8php.html#a6f7e1334af5d684a987fa6a3eb37f4cc">items.php</a>
+</li>
+<li>item_extract_images()
+: <a class="el" href="conversation_8php.html#a0ee05f15255fb1cc3d89f30bc378a654">conversation.php</a>
+</li>
+<li>item_getfeedattach()
+: <a class="el" href="items_8php.html#a09d425596b9f8663472cf7474ad36d96">items.php</a>
+</li>
+<li>item_getfeedtags()
+: <a class="el" href="items_8php.html#a649dc3e53ed794d0ead4b5d037f8d8d7">items.php</a>
+</li>
+<li>item_message_id()
+: <a class="el" href="text_8php.html#aa6b0aa8afbeab50d1a3058ad21acb74e">text.php</a>
+</li>
+<li>item_permissions_sql()
+: <a class="el" href="security_8php.html#a9355488460ab11d6058656ff919e5cf9">security.php</a>
+</li>
+<li>item_photo_menu()
+: <a class="el" href="conversation_8php.html#aacbb12d372d5e9c3ab0735b4aea48fb3">conversation.php</a>
+</li>
+<li>item_post()
+: <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item.php</a>
+</li>
+<li>item_post_type()
+: <a class="el" href="text_8php.html#ac1dbf2e37e8069bea2c0f557fdbf203e">text.php</a>
+</li>
+<li>item_redir_and_replace_images()
+: <a class="el" href="conversation_8php.html#adda79b75bf1ccf6ce9503aa310953533">conversation.php</a>
+</li>
+<li>item_store()
+: <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">items.php</a>
+</li>
+<li>item_store_update()
+: <a class="el" href="items_8php.html#acf0bf7c9d21ac84f32effb754f7ad484">items.php</a>
+</li>
+<li>items_fetch()
+: <a class="el" href="items_8php.html#a756738301f2ed96be50232500677d58a">items.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_func_0x6a.html b/doc/html/globals_func_0x6a.html
new file mode 100644
index 000000000..dcc3f4af6
--- /dev/null
+++ b/doc/html/globals_func_0x6a.html
@@ -0,0 +1,158 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li class="current"><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_func.html#index__"><span>_</span></a></li>
+ <li><a href="globals_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_func_0x69.html#index_i"><span>i</span></a></li>
+ <li class="current"><a href="globals_func_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_func_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_func_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_func_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_func_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_func_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_func_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_func_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_func_0x6a.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_j"></a>- j -</h3><ul>
+<li>jindent()
+: <a class="el" href="text_8php.html#ae17b39d5e321debd3ad16dcbbde842b8">text.php</a>
+</li>
+<li>json_decode_plus()
+: <a class="el" href="text_8php.html#a0271381208acfa2d4cff36da281e3e23">text.php</a>
+</li>
+<li>json_return_and_die()
+: <a class="el" href="include_2network_8php.html#a4c5d50079e089168d9248427018fffd4">network.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_func_0x6b.html b/doc/html/globals_func_0x6b.html
new file mode 100644
index 000000000..b7adf9d4f
--- /dev/null
+++ b/doc/html/globals_func_0x6b.html
@@ -0,0 +1,152 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li class="current"><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_func.html#index__"><span>_</span></a></li>
+ <li><a href="globals_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_func_0x6a.html#index_j"><span>j</span></a></li>
+ <li class="current"><a href="globals_func_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_func_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_func_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_func_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_func_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_func_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_func_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_func_0x6b.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_k"></a>- k -</h3><ul>
+<li>killme()
+: <a class="el" href="boot_8php.html#aea7fc57a4d8e9dcb42f2601b0b9b761c">boot.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_func_0x6c.html b/doc/html/globals_func_0x6c.html
new file mode 100644
index 000000000..650b6ea8c
--- /dev/null
+++ b/doc/html/globals_func_0x6c.html
@@ -0,0 +1,230 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li class="current"><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_func.html#index__"><span>_</span></a></li>
+ <li><a href="globals_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_func_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_func_0x6b.html#index_k"><span>k</span></a></li>
+ <li class="current"><a href="globals_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_func_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_func_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_func_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_func_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_func_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_func_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_func_0x6c.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_l"></a>- l -</h3><ul>
+<li>lang_selector()
+: <a class="el" href="text_8php.html#a71f6952243d3fe1c5a8154f78027e29c">text.php</a>
+</li>
+<li>layout_select()
+: <a class="el" href="text_8php.html#a3999a0b3e22e440f280ee791ce34d384">text.php</a>
+</li>
+<li>layouts_content()
+: <a class="el" href="layouts_8php.html#a6e0193759ad9eef76d3df2db24237b50">layouts.php</a>
+</li>
+<li>legal_webbie()
+: <a class="el" href="text_8php.html#a2690ad67bb6fb97ef69de3e8d23f2728">text.php</a>
+</li>
+<li>like_content()
+: <a class="el" href="like_8php.html#a9d7dd268f21c21e9d29dd2aca2dd9538">like.php</a>
+</li>
+<li>like_puller()
+: <a class="el" href="conversation_8php.html#afe5b2f38d8b803edb0d7ec5fa2868db0">conversation.php</a>
+</li>
+<li>limit_body_size()
+: <a class="el" href="items_8php.html#af94c281016c6c912d06e064113336c5c">items.php</a>
+</li>
+<li>link_compare()
+: <a class="el" href="text_8php.html#a47c1e4a5f3f53027daacd8a9db24f285">text.php</a>
+</li>
+<li>linkify()
+: <a class="el" href="text_8php.html#a11255c8c4e5245b6c24f97684826aa54">text.php</a>
+</li>
+<li>list_public_sites()
+: <a class="el" href="dirsearch_8php.html#a985d410a170549429857af6ff2673149">dirsearch.php</a>
+</li>
+<li>load_config()
+: <a class="el" href="include_2config_8php.html#a27559f388c9b9af81c94e48d6889d1d1">config.php</a>
+</li>
+<li>load_contact_links()
+: <a class="el" href="boot_8php.html#a719c7f3972d5f9268f37a41c76cd4ef6">boot.php</a>
+</li>
+<li>load_database()
+: <a class="el" href="setup_8php.html#ad2e0375a9ab87ebe6e78124ee125054a">setup.php</a>
+</li>
+<li>load_database_rem()
+: <a class="el" href="setup_8php.html#a2b375ddc555140236fc500135de99371">setup.php</a>
+</li>
+<li>load_hooks()
+: <a class="el" href="plugin_8php.html#a326365e48ef94f0b9a0a771b8d75e813">plugin.php</a>
+</li>
+<li>load_pconfig()
+: <a class="el" href="include_2config_8php.html#ac543813a980b3841cc5a277fcd4a24a6">config.php</a>
+</li>
+<li>load_plugin()
+: <a class="el" href="plugin_8php.html#a9ca9632b7309a65b05c03a3e2f473a3d">plugin.php</a>
+</li>
+<li>load_translation_table()
+: <a class="el" href="language_8php.html#a7e9904c730bb24ddcb0ff50fc96f6b05">language.php</a>
+</li>
+<li>load_xconfig()
+: <a class="el" href="include_2config_8php.html#a55bbed9a014c9109c767486834f3ca33">config.php</a>
+</li>
+<li>local_user()
+: <a class="el" href="boot_8php.html#ad4c9dc2c8a82e8f52b7404c1655eab44">boot.php</a>
+</li>
+<li>localize_item()
+: <a class="el" href="conversation_8php.html#a9bd7f9fb6678736c581bcba3b17f471c">conversation.php</a>
+</li>
+<li>lockview_content()
+: <a class="el" href="lockview_8php.html#a851e26ab9a1008df5c5ebebea31e9b44">lockview.php</a>
+</li>
+<li>logger()
+: <a class="el" href="text_8php.html#a030fa5ecc64168af0c4f44897a9bce63">text.php</a>
+</li>
+<li>login()
+: <a class="el" href="boot_8php.html#aefecf8599036df7f1b95d6820e0e2fa4">boot.php</a>
+</li>
+<li>login_content()
+: <a class="el" href="login_8php.html#a1d69ca88eb9005a7026e128b9a645904">login.php</a>
+</li>
+<li>lostpass_content()
+: <a class="el" href="lostpass_8php.html#a0314d94e48c789b1b3a201d740c9eab3">lostpass.php</a>
+</li>
+<li>lostpass_post()
+: <a class="el" href="lostpass_8php.html#a8ed35ba71a4404eaf4903da61d0321cc">lostpass.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_func_0x6d.html b/doc/html/globals_func_0x6d.html
new file mode 100644
index 000000000..d8cd1849c
--- /dev/null
+++ b/doc/html/globals_func_0x6d.html
@@ -0,0 +1,254 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li class="current"><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_func.html#index__"><span>_</span></a></li>
+ <li><a href="globals_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_func_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_func_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li class="current"><a href="globals_func_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_func_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_func_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_func_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_func_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_func_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_func_0x6d.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_m"></a>- m -</h3><ul>
+<li>magic_init()
+: <a class="el" href="magic_8php.html#acea2cc792849ca2d71d4b689f66518bf">magic.php</a>
+</li>
+<li>magic_link()
+: <a class="el" href="text_8php.html#a1e510c53624933ce9b7d6715784894db">text.php</a>
+</li>
+<li>magiclink_url()
+: <a class="el" href="text_8php.html#a24d441d30df4b8e6bf6780bf62a5e2c6">text.php</a>
+</li>
+<li>mail_content()
+: <a class="el" href="mail_8php.html#a3c7c485fc69f92371e8b20936040eca1">mail.php</a>
+</li>
+<li>mail_post()
+: <a class="el" href="mail_8php.html#acfc2cc0bf4e0b178207758384977f25a">mail.php</a>
+</li>
+<li>mail_store()
+: <a class="el" href="items_8php.html#a77da7ce9a117601d49ac4a67c71b514f">items.php</a>
+</li>
+<li>manage_content()
+: <a class="el" href="manage_8php.html#a2bca247b5296827638959138367db4f5">manage.php</a>
+</li>
+<li>manual_config()
+: <a class="el" href="setup_8php.html#abe405d227ba7232971964a706d4f3bce">setup.php</a>
+</li>
+<li>map_scope()
+: <a class="el" href="items_8php.html#ac1fcf621dce7370515b420a7753f4726">items.php</a>
+</li>
+<li>marital_selector()
+: <a class="el" href="profile__selectors_8php.html#a7473dd095987e1cdcc79d4f0bb5e6798">profile_selectors.php</a>
+</li>
+<li>match_content()
+: <a class="el" href="match_8php.html#a1dd853e959b9e70c1911bb2fb5f5130d">match.php</a>
+</li>
+<li>member_of()
+: <a class="el" href="include_2group_8php.html#a048f6892bfd28852de1b76470df411de">group.php</a>
+</li>
+<li>menu_add_item()
+: <a class="el" href="include_2menu_8php.html#add35fae5e9695031b3d46e30ac409eb8">menu.php</a>
+</li>
+<li>menu_content()
+: <a class="el" href="mod_2menu_8php.html#a6fed23af14d71a78a4153c8363a685cf">menu.php</a>
+</li>
+<li>menu_create()
+: <a class="el" href="include_2menu_8php.html#a08a800821721781a8dfffbe31481ff98">menu.php</a>
+</li>
+<li>menu_del_item()
+: <a class="el" href="include_2menu_8php.html#a9aa8e0052dd47c1a93f53a983bd4620a">menu.php</a>
+</li>
+<li>menu_delete()
+: <a class="el" href="include_2menu_8php.html#a3884bda4d85d84ec99447db9403a68d8">menu.php</a>
+</li>
+<li>menu_delete_id()
+: <a class="el" href="include_2menu_8php.html#ad87f51ce85172bcc3f931aa0cd96a804">menu.php</a>
+</li>
+<li>menu_edit()
+: <a class="el" href="include_2menu_8php.html#a6a33c6a3db2a7510b16cc656edaec571">menu.php</a>
+</li>
+<li>menu_edit_item()
+: <a class="el" href="include_2menu_8php.html#acb66f80ca895a6ccd562b3d9ae7b41aa">menu.php</a>
+</li>
+<li>menu_fetch()
+: <a class="el" href="include_2menu_8php.html#a68ebbf492470c930f652013656f9071d">menu.php</a>
+</li>
+<li>menu_fetch_id()
+: <a class="el" href="include_2menu_8php.html#a47447c01ba8ea04cd74af1d4c5b68fc7">menu.php</a>
+</li>
+<li>menu_list()
+: <a class="el" href="include_2menu_8php.html#acef15a498d52666b1c7e5c12765c689b">menu.php</a>
+</li>
+<li>menu_post()
+: <a class="el" href="mod_2menu_8php.html#aaa491ef173868fe002aece4632bcf393">menu.php</a>
+</li>
+<li>menu_render()
+: <a class="el" href="include_2menu_8php.html#a890cc6237971e15f15702e6b2e88502e">menu.php</a>
+</li>
+<li>message_content()
+: <a class="el" href="mod_2message_8php.html#ac72dfed3ce08fcb331d66b37edc6e15f">message.php</a>
+</li>
+<li>micropro()
+: <a class="el" href="text_8php.html#a2a902f5fdba8646333e997898ac45ea3">text.php</a>
+</li>
+<li>mimetype_select()
+: <a class="el" href="text_8php.html#a1633412120f52bdce5f43e0a127d9293">text.php</a>
+</li>
+<li>mini_group_select()
+: <a class="el" href="include_2group_8php.html#ab0e422a0f31c0c64fd9084ca03d85f32">group.php</a>
+</li>
+<li>mitem_content()
+: <a class="el" href="mitem_8php.html#a7a31b702ecad18eeb6a38b243ff0037e">mitem.php</a>
+</li>
+<li>mitem_init()
+: <a class="el" href="mitem_8php.html#a9627cd857cafdf04e4fc0ae48c8e8518">mitem.php</a>
+</li>
+<li>mitem_post()
+: <a class="el" href="mitem_8php.html#a6ee694cca4b551a20d7c7a94b5243ec1">mitem.php</a>
+</li>
+<li>mood_content()
+: <a class="el" href="mood_8php.html#a721b9b6703b3234a005641c92d409b8f">mood.php</a>
+</li>
+<li>mood_init()
+: <a class="el" href="mood_8php.html#a7ae136dd7476865b4828136175db5022">mood.php</a>
+</li>
+<li>msearch_post()
+: <a class="el" href="msearch_8php.html#ac80d2a6c0a92e79eec7efbbccd74d9a8">msearch.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_func_0x6e.html b/doc/html/globals_func_0x6e.html
new file mode 100644
index 000000000..8af69c3b4
--- /dev/null
+++ b/doc/html/globals_func_0x6e.html
@@ -0,0 +1,233 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li class="current"><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_func.html#index__"><span>_</span></a></li>
+ <li><a href="globals_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_func_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_func_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_func_0x6d.html#index_m"><span>m</span></a></li>
+ <li class="current"><a href="globals_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_func_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_func_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_func_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_func_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_func_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_func_0x6e.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_n"></a>- n -</h3><ul>
+<li>namesList()
+: <a class="el" href="docblox__errorchecker_8php.html#a2b767cfc461fdd5061fffc9e4a806d5b">docblox_errorchecker.php</a>
+</li>
+<li>nav()
+: <a class="el" href="nav_8php.html#a43be0df73b90647ea70947ce004e231e">nav.php</a>
+</li>
+<li>nav_set_selected()
+: <a class="el" href="nav_8php.html#ac3c920ce3ea5b0d9e0678ee37155f06a">nav.php</a>
+</li>
+<li>navbar_complete()
+: <a class="el" href="acl_8php.html#a57dceff370d4a0e7ae673d50fbfda61f">acl.php</a>
+</li>
+<li>network_content()
+: <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network.php</a>
+</li>
+<li>network_init()
+: <a class="el" href="mod_2network_8php.html#a180fce90ad11d7e0e45be094da7149ec">network.php</a>
+</li>
+<li>network_tabs()
+: <a class="el" href="conversation_8php.html#a96b34b9d64d13c543e8163e52f5ce8c4">conversation.php</a>
+</li>
+<li>network_to_name()
+: <a class="el" href="contact__selectors_8php.html#ad472e4716426dd1a9dd77b62962454be">contact_selectors.php</a>
+</li>
+<li>new_channel_content()
+: <a class="el" href="new__channel_8php.html#ae585191610f79da129492482ce8e2fee">new_channel.php</a>
+</li>
+<li>new_channel_init()
+: <a class="el" href="new__channel_8php.html#a1ad7f99e4366a32942c6b954aba3a164">new_channel.php</a>
+</li>
+<li>new_channel_post()
+: <a class="el" href="new__channel_8php.html#a180b0646957db8290482f02454ad7f23">new_channel.php</a>
+</li>
+<li>new_contact()
+: <a class="el" href="include_2follow_8php.html#ae387d4ae097c23d69f3247e7f08140c7">follow.php</a>
+</li>
+<li>new_cookie()
+: <a class="el" href="session_8php.html#a4c0ead624f95483e386bc80abf570a8f">session.php</a>
+</li>
+<li>new_keypair()
+: <a class="el" href="crypto_8php.html#aae0ab70d6a199b29555b1ac3cf250d6a">crypto.php</a>
+</li>
+<li>node2bbcode()
+: <a class="el" href="html2bbcode_8php.html#ad174afe0ccbd8c475e48f8a6ee2f27d8">html2bbcode.php</a>
+</li>
+<li>node2bbcodesub()
+: <a class="el" href="html2bbcode_8php.html#a39c662b19d318990fee2ba795a55d7a7">html2bbcode.php</a>
+</li>
+<li>normalise_link()
+: <a class="el" href="text_8php.html#a4bbb7d00c05cd20b4e043424f322388f">text.php</a>
+</li>
+<li>normalise_openid()
+: <a class="el" href="text_8php.html#adba17ec946f4285285dc100f7860bf51">text.php</a>
+</li>
+<li>notags()
+: <a class="el" href="text_8php.html#a1af49756c8c71902a66c7e329c462beb">text.php</a>
+</li>
+<li>notes_init()
+: <a class="el" href="notes_8php.html#a4dbd7b1f906440746af48b484d66535a">notes.php</a>
+</li>
+<li>notice()
+: <a class="el" href="boot_8php.html#a9255af5ae9c887520091ea04763c1a88">boot.php</a>
+</li>
+<li>notification()
+: <a class="el" href="enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc">enotify.php</a>
+</li>
+<li>notifications_content()
+: <a class="el" href="notifications_8php.html#aadd0b5525bd8c283a5d8a37982bbfe62">notifications.php</a>
+</li>
+<li>notifications_post()
+: <a class="el" href="notifications_8php.html#a5baffec7b2e625c9f9cefbc097550d33">notifications.php</a>
+</li>
+<li>notifier_run()
+: <a class="el" href="notifier_8php.html#a568c502f626cff95e344c0748938b85d">notifier.php</a>
+</li>
+<li>notify_content()
+: <a class="el" href="mod_2notify_8php.html#acdf3851688ebd6d6a575eb84ef9febe3">notify.php</a>
+</li>
+<li>notify_init()
+: <a class="el" href="mod_2notify_8php.html#a94f9a6a9d4b5fd704baafff0c34f41ae">notify.php</a>
+</li>
+<li>nuke_session()
+: <a class="el" href="auth_8php.html#a2add3a1129ffa4d5515442a9d52a9b1a">auth.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_func_0x6f.html b/doc/html/globals_func_0x6f.html
new file mode 100644
index 000000000..002e257c6
--- /dev/null
+++ b/doc/html/globals_func_0x6f.html
@@ -0,0 +1,200 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li class="current"><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_func.html#index__"><span>_</span></a></li>
+ <li><a href="globals_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_func_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_func_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_func_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li class="current"><a href="globals_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_func_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_func_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_func_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_func_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_func_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_func_0x6f.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_o"></a>- o -</h3><ul>
+<li>oauth_get_client()
+: <a class="el" href="mod_2api_8php.html#a02ae0f60e240dc806b860edb7d582117">api.php</a>
+</li>
+<li>obj_verb_selector()
+: <a class="el" href="taxonomy_8php.html#af387463d42ffdf7d2ab3d5b22e40a0c7">taxonomy.php</a>
+</li>
+<li>obj_verbs()
+: <a class="el" href="taxonomy_8php.html#a03f55ee46c5f496e42f3d29db8d09cce">taxonomy.php</a>
+</li>
+<li>oe_build_xpath()
+: <a class="el" href="include_2oembed_8php.html#ab953a6e7c11bc6498ce01ed73e2ba319">oembed.php</a>
+</li>
+<li>oe_get_inner_html()
+: <a class="el" href="include_2oembed_8php.html#a03fa3b7832c98a3d0b4630afeb73d487">oembed.php</a>
+</li>
+<li>oembed_bbcode2html()
+: <a class="el" href="include_2oembed_8php.html#aba89ae64b355efcb4f706553d3edb6a2">oembed.php</a>
+</li>
+<li>oembed_fetch_url()
+: <a class="el" href="include_2oembed_8php.html#a98549b9af8140eda3eceaeedcaabc2c2">oembed.php</a>
+</li>
+<li>oembed_format_object()
+: <a class="el" href="include_2oembed_8php.html#a26bb4c1e330d2f94ea7b6ce2fe970cf3">oembed.php</a>
+</li>
+<li>oembed_html2bbcode()
+: <a class="el" href="include_2oembed_8php.html#a000a62b97113cf95b0e9e00412168172">oembed.php</a>
+</li>
+<li>oembed_iframe()
+: <a class="el" href="include_2oembed_8php.html#a9e57f3e36a0a0a47e6db79544b701d9a">oembed.php</a>
+</li>
+<li>oembed_init()
+: <a class="el" href="mod_2oembed_8php.html#a9145025aaf057fb5d3f9f7011e5e1014">oembed.php</a>
+</li>
+<li>oembed_replacecb()
+: <a class="el" href="include_2oembed_8php.html#a00c4c80deffd9daf8dc97b58d4c64ed0">oembed.php</a>
+</li>
+<li>oexchange_content()
+: <a class="el" href="oexchange_8php.html#a2d8b785cd7d041a4e6274f5af370cf26">oexchange.php</a>
+</li>
+<li>oexchange_init()
+: <a class="el" href="oexchange_8php.html#ac8e2e469ddc3db984b0c1b44558aca59">oexchange.php</a>
+</li>
+<li>onedirsync_run()
+: <a class="el" href="onedirsync_8php.html#a411aedd47c57476099647961e6a86691">onedirsync.php</a>
+</li>
+<li>onepoll_run()
+: <a class="el" href="onepoll_8php.html#a72753b2fdec79b37c7f432035c91fb6d">onepoll.php</a>
+</li>
+<li>opensearch_init()
+: <a class="el" href="opensearch_8php.html#ad13034877a496565ac7d99e9fc6f55e9">opensearch.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_func_0x70.html b/doc/html/globals_func_0x70.html
new file mode 100644
index 000000000..932009ab0
--- /dev/null
+++ b/doc/html/globals_func_0x70.html
@@ -0,0 +1,443 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li class="current"><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_func.html#index__"><span>_</span></a></li>
+ <li><a href="globals_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_func_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_func_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_func_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li class="current"><a href="globals_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_func_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_func_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_func_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_func_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_func_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_func_0x70.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_p"></a>- p -</h3><ul>
+<li>page_content()
+: <a class="el" href="page_8php.html#a91a5f649f68406149108bded1dc90b22">page.php</a>
+</li>
+<li>page_init()
+: <a class="el" href="page_8php.html#a4d89800c0366a239191b1692c09635cf">page.php</a>
+</li>
+<li>pagelist_widget()
+: <a class="el" href="page__widgets_8php.html#ad82011c1ed90d9de8b9f34c12af5c6f0">page_widgets.php</a>
+</li>
+<li>paginate()
+: <a class="el" href="text_8php.html#afe9f178d264d44a94dc1292aaf0fd585">text.php</a>
+</li>
+<li>parse_url_content()
+: <a class="el" href="parse__url_8php.html#a05a9e8944380ba3cf6bbf5893dd4b74b">parse_url.php</a>
+</li>
+<li>parse_xml_string()
+: <a class="el" href="include_2network_8php.html#a27a951b59d8d622c0b3e7b0673ba74c6">network.php</a>
+</li>
+<li>parseurl_getsiteinfo()
+: <a class="el" href="parse__url_8php.html#a25635549f2c22955d72465f4d2e58993">parse_url.php</a>
+</li>
+<li>pdl_selector()
+: <a class="el" href="comanche_8php.html#af7150df735e5ff9d467994cd6f769c6e">comanche.php</a>
+</li>
+<li>perm_is_allowed()
+: <a class="el" href="permissions_8php.html#a67ada9ed51e77885b6b0f6a28cee1835">permissions.php</a>
+</li>
+<li>permissions_sql()
+: <a class="el" href="security_8php.html#afa683bc025a1d2fe9065e2f6cd71a22f">security.php</a>
+</li>
+<li>perms2str()
+: <a class="el" href="text_8php.html#a98fd99dee3da8cf4c148dc04efe782ee">text.php</a>
+</li>
+<li>photo_factory()
+: <a class="el" href="photo__driver_8php.html#a32e2817faa25d7f11f60a8abff565035">photo_driver.php</a>
+</li>
+<li>photo_init()
+: <a class="el" href="photo_8php.html#a582779d24882b0d31ee909a91d70a448">photo.php</a>
+</li>
+<li>photo_new_resource()
+: <a class="el" href="text_8php.html#aa5528f41533927e1bd2da3618a74a6d7">text.php</a>
+</li>
+<li>photo_upload()
+: <a class="el" href="include_2photos_8php.html#a6c40ef58aefef705a5adc84a40e97109">photos.php</a>
+</li>
+<li>photos_album_exists()
+: <a class="el" href="include_2photos_8php.html#a8e8b7be99e24c2497bc2cb3339280c35">photos.php</a>
+</li>
+<li>photos_album_get_db_idstr()
+: <a class="el" href="include_2photos_8php.html#a7e7abc69872180697c5471dc69349afe">photos.php</a>
+</li>
+<li>photos_album_rename()
+: <a class="el" href="include_2photos_8php.html#ab0365f25b22ccea5f085fe7c49e1f4ab">photos.php</a>
+</li>
+<li>photos_album_widget()
+: <a class="el" href="include_2photos_8php.html#af24c6aeed28ecc31ec39e7d9a1804979">photos.php</a>
+</li>
+<li>photos_albums_list()
+: <a class="el" href="include_2photos_8php.html#aedccaf18282b26899d9549c29bd9d1b9">photos.php</a>
+</li>
+<li>photos_content()
+: <a class="el" href="mod_2photos_8php.html#aa87382611a66ec5effdb2d78f13f5812">photos.php</a>
+</li>
+<li>photos_create_item()
+: <a class="el" href="include_2photos_8php.html#ad648c0c5544fe9263409b6f6e57c6274">photos.php</a>
+</li>
+<li>photos_init()
+: <a class="el" href="mod_2photos_8php.html#ab950295cd77626f5fe65331a87693014">photos.php</a>
+</li>
+<li>photos_list_photos()
+: <a class="el" href="include_2photos_8php.html#aa27b9e435dcc34e1009f56dc02c7ca51">photos.php</a>
+</li>
+<li>photos_post()
+: <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos.php</a>
+</li>
+<li>php_init()
+: <a class="el" href="php_8php.html#adb7164dfed9a4ecbe2e168e1e78f12f6">php.php</a>
+</li>
+<li>ping_init()
+: <a class="el" href="ping_8php.html#a77217b1b190b4c5d8770867b45f0c0a1">ping.php</a>
+</li>
+<li>pipe_streams()
+: <a class="el" href="include_2attach_8php.html#a5d484de2d19a93071571d6499a50ae34">attach.php</a>
+</li>
+<li>pkcs5_pad()
+: <a class="el" href="crypto_8php.html#ad5e51fd44cff93cfaa07a37e24a5edec">crypto.php</a>
+</li>
+<li>pkcs5_unpad()
+: <a class="el" href="crypto_8php.html#ac95ac3b1b23b65b04a86613d4206ae85">crypto.php</a>
+</li>
+<li>po2php_run()
+: <a class="el" href="po2php_8php.html#a3b75e36f913198299e99559b175cd8b4">po2php.php</a>
+</li>
+<li>poco_init()
+: <a class="el" href="poco_8php.html#a53def16f75e3d41f1d2bb7cfa4905498">poco.php</a>
+</li>
+<li>poco_load()
+: <a class="el" href="socgraph_8php.html#a5ef8bef37161df53718a21e93d02fbd6">socgraph.php</a>
+</li>
+<li>poke_content()
+: <a class="el" href="poke_8php.html#ac9190563a8da9c07a16f9dcd71cf6993">poke.php</a>
+</li>
+<li>poke_init()
+: <a class="el" href="poke_8php.html#a9725aab97b3983e6a98bd81c4efe7d3b">poke.php</a>
+</li>
+<li>poller_run()
+: <a class="el" href="poller_8php.html#a5f12df3a4738124b6c039971e87e76da">poller.php</a>
+</li>
+<li>pop_lang()
+: <a class="el" href="language_8php.html#a78bd204955ec4cc3a9ac651285a1689d">language.php</a>
+</li>
+<li>populate_acl()
+: <a class="el" href="acl__selectors_8php.html#a7b5446e999636ceceea65c154d865a31">acl_selectors.php</a>
+</li>
+<li>post_activity_item()
+: <a class="el" href="items_8php.html#a410f9c743877c125ca06312373346903">items.php</a>
+</li>
+<li>post_init()
+: <a class="el" href="post_8php.html#af4b48181ce773ef0cdfc972441445c34">post.php</a>
+</li>
+<li>post_post()
+: <a class="el" href="post_8php.html#af59e6a1dc22d19d9257b01cd7ccedb75">post.php</a>
+</li>
+<li>post_to_red_admin()
+: <a class="el" href="post__to__red_8php.html#aeec4125719184e7b097b3b9fba3101b5">post_to_red.php</a>
+</li>
+<li>post_to_red_deactivate()
+: <a class="el" href="post__to__red_8php.html#a49fd35f7b1cdddfe6e26ddfcf8d3c4ec">post_to_red.php</a>
+</li>
+<li>post_to_red_delete_comment()
+: <a class="el" href="post__to__red_8php.html#a5cc2a89a6d33cdb8e2ca557a69bef42d">post_to_red.php</a>
+</li>
+<li>post_to_red_delete_post()
+: <a class="el" href="post__to__red_8php.html#a4674bb5ce2baa32c559607460c39a2c5">post_to_red.php</a>
+</li>
+<li>post_to_red_display_admin_page()
+: <a class="el" href="post__to__red_8php.html#a8ec8f8809e3c5d1b2c9598c8185d63aa">post_to_red.php</a>
+</li>
+<li>post_to_red_displayAdminContent()
+: <a class="el" href="post__to__red_8php.html#a75db5d87226a0287a0ac0fa315f2bcfd">post_to_red.php</a>
+</li>
+<li>post_to_red_get_acct_name()
+: <a class="el" href="post__to__red_8php.html#ae6f3a2c0561cbeacda5be565b06de8a7">post_to_red.php</a>
+</li>
+<li>post_to_red_get_avatar()
+: <a class="el" href="post__to__red_8php.html#ae0b881461afbdba93d9329068ea52136">post_to_red.php</a>
+</li>
+<li>post_to_red_get_channel_name()
+: <a class="el" href="post__to__red_8php.html#aacba7a0646fc00ae6ac4f5dc383fccab">post_to_red.php</a>
+</li>
+<li>post_to_red_get_password()
+: <a class="el" href="post__to__red_8php.html#a4d90ac085c14f53ff4d8ab4c23477ea6">post_to_red.php</a>
+</li>
+<li>post_to_red_get_seed_location()
+: <a class="el" href="post__to__red_8php.html#a96d0ccecb96600ef1bfd50ab3f77315f">post_to_red.php</a>
+</li>
+<li>post_to_red_post()
+: <a class="el" href="post__to__red_8php.html#af5fd50e2c42ede85f8a9e8d9ee3cf540">post_to_red.php</a>
+</li>
+<li>post_to_red_post_checkbox()
+: <a class="el" href="post__to__red_8php.html#a0f139dea77a94c98f26007963eea639c">post_to_red.php</a>
+</li>
+<li>post_to_red_post_field_data()
+: <a class="el" href="post__to__red_8php.html#a7e68a8d9c83cb28d032aad3ea85ce0a6">post_to_red.php</a>
+</li>
+<li>post_to_red_post_meta_content()
+: <a class="el" href="post__to__red_8php.html#aa97aeda12ef080665f16311a4e1eb901">post_to_red.php</a>
+</li>
+<li>post_to_red_settings_link()
+: <a class="el" href="post__to__red_8php.html#a906be8f72cf1aa2e199c0683ea6a4017">post_to_red.php</a>
+</li>
+<li>posted_date_widget()
+: <a class="el" href="items_8php.html#abe695dd89e1e10ed042c26b80114f0ed">items.php</a>
+</li>
+<li>posted_dates()
+: <a class="el" href="items_8php.html#ad2abb4644ff1f20fefbc80326fe01cf0">items.php</a>
+</li>
+<li>preg_callback_help_include()
+: <a class="el" href="help_8php.html#a06b2a51aaabed99e53a9b639047c4ce4">help.php</a>
+</li>
+<li>preg_heart()
+: <a class="el" href="text_8php.html#ac19d2b33a58372a357a43d51eed19162">text.php</a>
+</li>
+<li>prepare_body()
+: <a class="el" href="text_8php.html#ae4df74296fbe55051ed3c035e55205e5">text.php</a>
+</li>
+<li>prepare_page()
+: <a class="el" href="conversation_8php.html#a4b0888b0f26e1c284a4341fe5fd04f0c">conversation.php</a>
+</li>
+<li>prepare_text()
+: <a class="el" href="text_8php.html#afe54312607d92f7ce9593f5760831f80">text.php</a>
+</li>
+<li>pretheme_init()
+: <a class="el" href="pretheme_8php.html#af5660943ee99db5fd75182316522eafe">pretheme.php</a>
+</li>
+<li>print_template()
+: <a class="el" href="tpldebug_8php.html#a44778457a6c02554812fbfad19d32ba3">tpldebug.php</a>
+</li>
+<li>printable()
+: <a class="el" href="dba__driver_8php.html#a55bf30d8176967e682656b5be4ad9249">dba_driver.php</a>
+</li>
+<li>private_messages_drop()
+: <a class="el" href="include_2message_8php.html#aed272d77c06a309e2836ac79e75613f1">message.php</a>
+</li>
+<li>private_messages_fetch_conversation()
+: <a class="el" href="include_2message_8php.html#a5f8de9847e203329e317ac38dc646898">message.php</a>
+</li>
+<li>private_messages_fetch_message()
+: <a class="el" href="include_2message_8php.html#a254a756031e4d5e94f85e2939bdb5091">message.php</a>
+</li>
+<li>private_messages_list()
+: <a class="el" href="include_2message_8php.html#a652973ce47a262f2d238c2fd6233d97e">message.php</a>
+</li>
+<li>probe_content()
+: <a class="el" href="probe_8php.html#a1f1db3fa6038e451e737964c94bf5e99">probe.php</a>
+</li>
+<li>proc_run()
+: <a class="el" href="boot_8php.html#ab346a2ece14993861f3e4206befa94f0">boot.php</a>
+</li>
+<li>process_channel_sync_delivery()
+: <a class="el" href="zot_8php.html#ac301c67864917c35922257950ae0f95c">zot.php</a>
+</li>
+<li>process_delivery()
+: <a class="el" href="zot_8php.html#a37ec13b18057634eadb071f05297f5e1">zot.php</a>
+</li>
+<li>process_mail_delivery()
+: <a class="el" href="zot_8php.html#aa6ae96db8cbbdbb10e6876d206bbf7cc">zot.php</a>
+</li>
+<li>process_profile_delivery()
+: <a class="el" href="zot_8php.html#a9a57b40669351c9791126b925cb7ef3b">zot.php</a>
+</li>
+<li>profile_activity()
+: <a class="el" href="activities_8php.html#a80134e807719b3c54aba971958d2e132">activities.php</a>
+</li>
+<li>profile_content()
+: <a class="el" href="profile_8php.html#a3775cf6eef6587e5143133356a7b76c0">profile.php</a>
+</li>
+<li>profile_create_sidebar()
+: <a class="el" href="identity_8php.html#ad4a2c8caca8f6ae93633ebeca0ed6620">identity.php</a>
+</li>
+<li>profile_init()
+: <a class="el" href="profile_8php.html#ab5d0246be0552e2182a585c1206d22a5">profile.php</a>
+</li>
+<li>profile_load()
+: <a class="el" href="identity_8php.html#a4751b522ea913d0e7ed43e03d22e9e68">identity.php</a>
+</li>
+<li>profile_photo_init()
+: <a class="el" href="profile__photo_8php.html#a140631c56438fbfacb61a1eb43067d02">profile_photo.php</a>
+</li>
+<li>profile_photo_post()
+: <a class="el" href="profile__photo_8php.html#a4b80234074bd603221aa5364f330e479">profile_photo.php</a>
+</li>
+<li>profile_sidebar()
+: <a class="el" href="identity_8php.html#a432259b2cf5b6f59be53e71db9f2c7dc">identity.php</a>
+</li>
+<li>profile_tabs()
+: <a class="el" href="conversation_8php.html#a1dfcb5146e9d1eca4528bc580ad5d273">conversation.php</a>
+</li>
+<li>profiler()
+: <a class="el" href="text_8php.html#a8b0a799341b1fc4cba2c3ede3e3fc9b6">text.php</a>
+</li>
+<li>profiles_content()
+: <a class="el" href="profiles_8php.html#a46975783b8b8d70402d51487eb1f0b00">profiles.php</a>
+</li>
+<li>profiles_init()
+: <a class="el" href="profiles_8php.html#a36f71405ad536228f8bb84a551b23f7e">profiles.php</a>
+</li>
+<li>profiles_post()
+: <a class="el" href="profiles_8php.html#ab0362c81b1d3b0b12a772b9fac446e04">profiles.php</a>
+</li>
+<li>profperm_content()
+: <a class="el" href="profperm_8php.html#aef015787de2373d9fb3fe3f814fb5023">profperm.php</a>
+</li>
+<li>profperm_init()
+: <a class="el" href="profperm_8php.html#a17fb64ec05edee1dc94d95438807d6c6">profperm.php</a>
+</li>
+<li>protect_sprintf()
+: <a class="el" href="text_8php.html#a4e7698aca48982512594b274543c3b9b">text.php</a>
+</li>
+<li>public_permissions_sql()
+: <a class="el" href="security_8php.html#ab3bdd30dc60d9ee72370b866aa4a2d01">security.php</a>
+</li>
+<li>public_recips()
+: <a class="el" href="zot_8php.html#a083aec6c900d244e1bfc1406f9461465">zot.php</a>
+</li>
+<li>pubsites_content()
+: <a class="el" href="pubsites_8php.html#af614e279aab54065345bda6b03eafdf0">pubsites.php</a>
+</li>
+<li>purify_html()
+: <a class="el" href="text_8php.html#a4841df5beabdd1bdd1ed56781a915d61">text.php</a>
+</li>
+<li>push_lang()
+: <a class="el" href="language_8php.html#ac9142ef1d01a235c760deb0f16643f5a">language.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_func_0x71.html b/doc/html/globals_func_0x71.html
new file mode 100644
index 000000000..196c5a89f
--- /dev/null
+++ b/doc/html/globals_func_0x71.html
@@ -0,0 +1,161 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li class="current"><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_func.html#index__"><span>_</span></a></li>
+ <li><a href="globals_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_func_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_func_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_func_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_func_0x70.html#index_p"><span>p</span></a></li>
+ <li class="current"><a href="globals_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_func_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_func_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_func_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_func_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_func_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_func_0x71.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_q"></a>- q -</h3><ul>
+<li>q()
+: <a class="el" href="dba__driver_8php.html#a2c09a731d3b4fef41fed0e83db01be1f">dba_driver.php</a>
+</li>
+<li>qp()
+: <a class="el" href="text_8php.html#afc998d2796a6b2a08e96f7cc061e7221">text.php</a>
+</li>
+<li>queue_run()
+: <a class="el" href="queue_8php.html#af8c93de86d866c3200174c8450a0f341">queue.php</a>
+</li>
+<li>quotelevel()
+: <a class="el" href="html2plain_8php.html#a56d29b254333d29abb9d96a9a903a4b0">html2plain.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_func_0x72.html b/doc/html/globals_func_0x72.html
new file mode 100644
index 000000000..98b284dfa
--- /dev/null
+++ b/doc/html/globals_func_0x72.html
@@ -0,0 +1,290 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li class="current"><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_func.html#index__"><span>_</span></a></li>
+ <li><a href="globals_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_func_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_func_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_func_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_func_0x71.html#index_q"><span>q</span></a></li>
+ <li class="current"><a href="globals_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_func_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_func_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_func_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_func_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_func_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_func_0x72.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_r"></a>- r -</h3><ul>
+<li>random_profile()
+: <a class="el" href="Contact_8php.html#a852fa476f0c70bde10a4f2533aec5f71">Contact.php</a>
+</li>
+<li>random_string()
+: <a class="el" href="text_8php.html#a9d6a5ee1290de7a8b483fe78585daade">text.php</a>
+</li>
+<li>randprof_init()
+: <a class="el" href="randprof_8php.html#abf5dba3c608b9304cbf68327cd31b090">randprof.php</a>
+</li>
+<li>rconnect_url()
+: <a class="el" href="Contact_8php.html#a2f4f495d53f2a334ab75292af79d3c91">Contact.php</a>
+</li>
+<li>rebuild_theme_table()
+: <a class="el" href="admin_8php.html#ae46311a3fefc21abc838a26e91789de6">admin.php</a>
+</li>
+<li>red_comment()
+: <a class="el" href="post__to__red_8php.html#a085c250d4ceff5e4f10052f3d2039823">post_to_red.php</a>
+</li>
+<li>red_xmlrpc_methods()
+: <a class="el" href="post__to__red_8php.html#a3a2af6ad845239f26e86fccabf8639e1">post_to_red.php</a>
+</li>
+<li>red_zrl_callback()
+: <a class="el" href="items_8php.html#a4e6d7639431e0dd8e9f4dba8e1ac408b">items.php</a>
+</li>
+<li>redbasic_form()
+: <a class="el" href="view_2theme_2redbasic_2php_2config_8php.html#a8574a41fa9735ee391ba57ab24b93793">config.php</a>
+</li>
+<li>redbasic_init()
+: <a class="el" href="redbasic_2php_2theme_8php.html#af6eb813e9fc7e2d76ac1b82bc5c0ed9b">theme.php</a>
+</li>
+<li>RedChannelList()
+: <a class="el" href="reddav_8php.html#ae92ea0df1993f6a7bcd1b6efa6c1fb66">reddav.php</a>
+</li>
+<li>RedCollectionData()
+: <a class="el" href="reddav_8php.html#a5df0d09893f2e65dc5cf6bbab6cfb266">reddav.php</a>
+</li>
+<li>RedFileData()
+: <a class="el" href="reddav_8php.html#a9f531641dfb4e43cd88ac1a9ae7e2088">reddav.php</a>
+</li>
+<li>reduce()
+: <a class="el" href="docblox__errorchecker_8php.html#ae9562cf60aa693114603d27b55d2185f">docblox_errorchecker.php</a>
+</li>
+<li>ref_session_close()
+: <a class="el" href="session_8php.html#a5e1c616e02b863d5450317d101366bb7">session.php</a>
+</li>
+<li>ref_session_destroy()
+: <a class="el" href="session_8php.html#af230b86bfff7db66c3bdd7e0bbc24052">session.php</a>
+</li>
+<li>ref_session_gc()
+: <a class="el" href="session_8php.html#ac95373f4966862a028033dd2f94d4da1">session.php</a>
+</li>
+<li>ref_session_open()
+: <a class="el" href="session_8php.html#a26fa1042356d555023cbf15ddd4f8507">session.php</a>
+</li>
+<li>ref_session_read()
+: <a class="el" href="session_8php.html#a7f0f50576360d9ba52d29364e0b83a8e">session.php</a>
+</li>
+<li>ref_session_write()
+: <a class="el" href="session_8php.html#ac4461c1984543d3553e73dba2771568f">session.php</a>
+</li>
+<li>register_content()
+: <a class="el" href="register_8php.html#a0e91f57f111407ea8d3223a05022bb2a">register.php</a>
+</li>
+<li>register_hook()
+: <a class="el" href="plugin_8php.html#a425472c5f3afc137268b2ad45652b209">plugin.php</a>
+</li>
+<li>register_init()
+: <a class="el" href="register_8php.html#ae20c0cd40f738d6295de58b9202c83d5">register.php</a>
+</li>
+<li>register_post()
+: <a class="el" href="register_8php.html#a51731dcc1917c58a790eb1c0f6132271">register.php</a>
+</li>
+<li>regmod_content()
+: <a class="el" href="regmod_8php.html#a7953df4e32e63946565e90cdd5d50409">regmod.php</a>
+</li>
+<li>relative_date()
+: <a class="el" href="datetime_8php.html#a8ae8dc95ace7ac27fa5a1ecf42b78c82">datetime.php</a>
+</li>
+<li>reload_plugins()
+: <a class="el" href="plugin_8php.html#af9ac19004dca49adae1ac7a0d9f3b025">plugin.php</a>
+</li>
+<li>reltoabs()
+: <a class="el" href="text_8php.html#ad855a32bee22c3f3b9734e3a334b96f2">text.php</a>
+</li>
+<li>remote_user()
+: <a class="el" href="boot_8php.html#a5542c5c2806ab8bca04bad53d47b5209">boot.php</a>
+</li>
+<li>remove_all_xchan_resources()
+: <a class="el" href="Contact_8php.html#acc12cda999c88c4d6185cca967c15125">Contact.php</a>
+</li>
+<li>remove_community_tag()
+: <a class="el" href="zot_8php.html#aad25a3fe0e1566121d6fb8222979bc10">zot.php</a>
+</li>
+<li>remove_queue_item()
+: <a class="el" href="queue__fn_8php.html#a8fe71e981399bbf5d000a6ca42f57b24">queue_fn.php</a>
+</li>
+<li>removeme_content()
+: <a class="el" href="removeme_8php.html#a065a589caa2aa84c60f7073a28f0ad9c">removeme.php</a>
+</li>
+<li>removeme_post()
+: <a class="el" href="removeme_8php.html#a7be08738beca44bb98a79e01cdb2ee88">removeme.php</a>
+</li>
+<li>render_location_default()
+: <a class="el" href="conversation_8php.html#a40b9b5e7825bc73932a32e667f05e6f2">conversation.php</a>
+</li>
+<li>replace_macros()
+: <a class="el" href="text_8php.html#a9c6ce4e12a4ac883c5e3f36fed6e1e09">text.php</a>
+</li>
+<li>requestdata()
+: <a class="el" href="include_2api_8php.html#a43c47de8565cc00c3369cb35c19cc75e">api.php</a>
+</li>
+<li>return_bytes()
+: <a class="el" href="text_8php.html#ae2126da85966da0e79c6bcbac63b0bda">text.php</a>
+</li>
+<li>rmagic_content()
+: <a class="el" href="rmagic_8php.html#a3e28db1e5cfa7e5c2617f90222c1caef">rmagic.php</a>
+</li>
+<li>rmagic_init()
+: <a class="el" href="rmagic_8php.html#a95455edd43f1bff39446a57388cdde16">rmagic.php</a>
+</li>
+<li>rmagic_post()
+: <a class="el" href="rmagic_8php.html#a869de069d081b3c4e98b957d06bbf08f">rmagic.php</a>
+</li>
+<li>rpost_callback()
+: <a class="el" href="bbcode_8php.html#a5165a5221a52cf1bc1d7812ebd2069c7">bbcode.php</a>
+</li>
+<li>rpost_content()
+: <a class="el" href="rpost_8php.html#a8190354d789000806d9879aea276728f">rpost.php</a>
+</li>
+<li>rsa_sign()
+: <a class="el" href="crypto_8php.html#a920e5f222d0020f47556033d8b2b6552">crypto.php</a>
+</li>
+<li>rsa_verify()
+: <a class="el" href="crypto_8php.html#ab4f21d8f6b8ece0915e7c8bb73379f96">crypto.php</a>
+</li>
+<li>rsd_xml_content()
+: <a class="el" href="rsd__xml_8php.html#a740cd02fa15e5a53f8547fac73f0ab82">rsd_xml.php</a>
+</li>
+<li>runs()
+: <a class="el" href="docblox__errorchecker_8php.html#a21b4bbe5aae2d85db33affc7126a67ec">docblox_errorchecker.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_func_0x73.html b/doc/html/globals_func_0x73.html
new file mode 100644
index 000000000..1f3aca686
--- /dev/null
+++ b/doc/html/globals_func_0x73.html
@@ -0,0 +1,332 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li class="current"><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_func.html#index__"><span>_</span></a></li>
+ <li><a href="globals_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_func_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_func_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_func_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_func_0x72.html#index_r"><span>r</span></a></li>
+ <li class="current"><a href="globals_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_func_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_func_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_func_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_func_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_func_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_func_0x73.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_s"></a>- s -</h3><ul>
+<li>sanitise_acl()
+: <a class="el" href="text_8php.html#a9fbeae13c9abd6e27cb4d8d1817f969c">text.php</a>
+</li>
+<li>scale_external_images()
+: <a class="el" href="include_2network_8php.html#ae8d9c41a11000fb8667039fc71b4f73f">network.php</a>
+</li>
+<li>script_path()
+: <a class="el" href="plugin_8php.html#a0e8c2ea50bfdbc39e17ccccaea21ddc3">plugin.php</a>
+</li>
+<li>search()
+: <a class="el" href="text_8php.html#a876e94892867019935b348b573299352">text.php</a>
+</li>
+<li>search_ac_init()
+: <a class="el" href="search__ac_8php.html#a14f90c83a3f2be095e9e2992a8d66138">search_ac.php</a>
+</li>
+<li>search_content()
+: <a class="el" href="search_8php.html#ab2568591359edde5b483a6cd9a24b2cc">search.php</a>
+</li>
+<li>search_init()
+: <a class="el" href="search_8php.html#acf19fd30f07f495781ca0d7a0a08b435">search.php</a>
+</li>
+<li>searchbox()
+: <a class="el" href="text_8php.html#aae91e4d2a2c6f7a9daccd2c186ae3447">text.php</a>
+</li>
+<li>select_timezone()
+: <a class="el" href="datetime_8php.html#a633dadba426fa2f60b25fabdb19ebc1f">datetime.php</a>
+</li>
+<li>send_message()
+: <a class="el" href="include_2message_8php.html#a751ffd6635022b2190f56154ee745752">message.php</a>
+</li>
+<li>send_reg_approval_email()
+: <a class="el" href="account_8php.html#a014de2d5d5c9785de5bf547a485822fa">account.php</a>
+</li>
+<li>send_status_notifications()
+: <a class="el" href="items_8php.html#aab9e0c58247427126de0699c729c3b6c">items.php</a>
+</li>
+<li>send_verification_email()
+: <a class="el" href="account_8php.html#aa9c29c497c17d8f9344dce8631ad8761">account.php</a>
+</li>
+<li>service_class_allows()
+: <a class="el" href="plugin_8php.html#a030cec6793b909c439c0336ba39b1571">plugin.php</a>
+</li>
+<li>service_class_fetch()
+: <a class="el" href="plugin_8php.html#a905b54e10704b283ac64680a8abc0971">plugin.php</a>
+</li>
+<li>set_config()
+: <a class="el" href="include_2config_8php.html#ad6da879e4fb5b37d1e161d4e9be5c32a">config.php</a>
+</li>
+<li>set_default_login_identity()
+: <a class="el" href="identity_8php.html#a78151baf4407a8482d2681a91a9c486b">identity.php</a>
+</li>
+<li>set_pconfig()
+: <a class="el" href="include_2config_8php.html#a61591371cb18764138655d67dc817ab2">config.php</a>
+</li>
+<li>set_xconfig()
+: <a class="el" href="include_2config_8php.html#afe117b70f1bba2f6348d9300b601f86e">config.php</a>
+</li>
+<li>settings_init()
+: <a class="el" href="settings_8php.html#a3a4cde287482fced008583f54ba2a722">settings.php</a>
+</li>
+<li>settings_post()
+: <a class="el" href="settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586">settings.php</a>
+</li>
+<li>setup_content()
+: <a class="el" href="setup_8php.html#a88247384a96e14516f474d7af6a465c1">setup.php</a>
+</li>
+<li>setup_init()
+: <a class="el" href="setup_8php.html#a267555abd17290e659b4bf44b885e4e0">setup.php</a>
+</li>
+<li>setup_post()
+: <a class="el" href="setup_8php.html#a13cf286774149a0a7bd8adb8179cec75">setup.php</a>
+</li>
+<li>sexpref_selector()
+: <a class="el" href="profile__selectors_8php.html#a3b50b3ea4ea4bdbebebfffc5d1b157c7">profile_selectors.php</a>
+</li>
+<li>share_init()
+: <a class="el" href="share_8php.html#afeb26046bdd02567ecd29ab5f188b249">share.php</a>
+</li>
+<li>showForm()
+: <a class="el" href="fpostit_8php.html#a3f3ae3ae61578b5671673914fd894443">fpostit.php</a>
+</li>
+<li>site_default_perms()
+: <a class="el" href="permissions_8php.html#aa8b7b102c653649d7a71b5a1c044d90d">permissions.php</a>
+</li>
+<li>siteinfo_content()
+: <a class="el" href="siteinfo_8php.html#a70c09bfb6dd1c86a125a35f62ed53656">siteinfo.php</a>
+</li>
+<li>siteinfo_init()
+: <a class="el" href="siteinfo_8php.html#a3efbd0bd6564af19ec0a9ce0294e59d0">siteinfo.php</a>
+</li>
+<li>sitelist_init()
+: <a class="el" href="sitelist_8php.html#a665a59bf60f780b40f32c909f4a473b1">sitelist.php</a>
+</li>
+<li>smile_decode()
+: <a class="el" href="text_8php.html#aca0f589be74fab1a460c57e88dad9779">text.php</a>
+</li>
+<li>smile_encode()
+: <a class="el" href="text_8php.html#a44d460fcdee6247c67b9bef3ea15f3e6">text.php</a>
+</li>
+<li>smilies()
+: <a class="el" href="text_8php.html#a3d225b253bb9e0f2498c11647d927b0b">text.php</a>
+</li>
+<li>smilies_content()
+: <a class="el" href="smilies_8php.html#ab43b1e9f33a700a830aff14c7b3a617f">smilies.php</a>
+</li>
+<li>sort_by_date()
+: <a class="el" href="event_8php.html#a018ea4484910a873a7c1eaa126de9b1a">event.php</a>
+</li>
+<li>sort_item_children()
+: <a class="el" href="conversation_8php.html#ae996eb116d397a2c6396c312d7b98664">conversation.php</a>
+</li>
+<li>sort_thr_commented()
+: <a class="el" href="conversation_8php.html#a9f909b8885259b79c6ac8da93afd8f11">conversation.php</a>
+</li>
+<li>sort_thr_created()
+: <a class="el" href="conversation_8php.html#ac55e070f65f46fcc8e269f7896be4c7d">conversation.php</a>
+</li>
+<li>sort_thr_created_rev()
+: <a class="el" href="conversation_8php.html#a9cc2a679606da9e535a06433f9f553a0">conversation.php</a>
+</li>
+<li>sources_content()
+: <a class="el" href="sources_8php.html#ac442ccef080ab95772d8929fcafcb4b7">sources.php</a>
+</li>
+<li>sources_post()
+: <a class="el" href="sources_8php.html#ac73298ff162ce7b2de8dcaf3d3305b1e">sources.php</a>
+</li>
+<li>sslify()
+: <a class="el" href="text_8php.html#a33bdb5d4bfff2ede7caf61a98ac0a2e9">text.php</a>
+</li>
+<li>sslify_init()
+: <a class="el" href="sslify_8php.html#a75b11e54a3d1fc83e7d4c0e8b4dab316">sslify.php</a>
+</li>
+<li>starred_init()
+: <a class="el" href="starred_8php.html#a63024fb418c678e49fd535e3752d349a">starred.php</a>
+</li>
+<li>startup()
+: <a class="el" href="boot_8php.html#aca47505b8732177f52bb2d647eb2741c">boot.php</a>
+</li>
+<li>status_editor()
+: <a class="el" href="conversation_8php.html#a2a7d541854bba755eb8ada59af7dcb1a">conversation.php</a>
+</li>
+<li>store_item_tag()
+: <a class="el" href="taxonomy_8php.html#a4ba1339b2a7054971178ce194e4440fd">taxonomy.php</a>
+</li>
+<li>stream_perms_api_uids()
+: <a class="el" href="security_8php.html#ae92c5c1a1cbbc49ddbb8b3265d2db809">security.php</a>
+</li>
+<li>stream_perms_xchans()
+: <a class="el" href="security_8php.html#a15e0f8f511cc06192db63387f97238b3">security.php</a>
+</li>
+<li>string_plural_select_default()
+: <a class="el" href="language_8php.html#a151e5b4689aef86a12642cbb7a00bfe0">language.php</a>
+</li>
+<li>stringify_array_elms()
+: <a class="el" href="text_8php.html#a8796f6a9ca592ecdce7b3afc3462aa13">text.php</a>
+</li>
+<li>stripdcode_br_cb()
+: <a class="el" href="bb2diaspora_8php.html#a180b0e3a7d702998be19e3c3b44b0e93">bb2diaspora.php</a>
+</li>
+<li>subthread_content()
+: <a class="el" href="subthread_8php.html#a50368f3d825b77996030528e7fbfa3d3">subthread.php</a>
+</li>
+<li>suggest_content()
+: <a class="el" href="suggest_8php.html#a58748a8235d4523f8333847f3e42dd91">suggest.php</a>
+</li>
+<li>suggest_init()
+: <a class="el" href="suggest_8php.html#a696acf1dd8070e479adcc80c63c6718c">suggest.php</a>
+</li>
+<li>suggestion_query()
+: <a class="el" href="socgraph_8php.html#a76e6fca3d2bc842dcd9e710bb87c8329">socgraph.php</a>
+</li>
+<li>sync_directories()
+: <a class="el" href="dir__fns_8php.html#aa666e7df6ca8c332f4081c9b66b4bdf6">dir_fns.php</a>
+</li>
+<li>syncdirs()
+: <a class="el" href="dir__fns_8php.html#a6cae22cfdd6edda5ddf09e07abb3242a">dir_fns.php</a>
+</li>
+<li>system_down()
+: <a class="el" href="system__unavailable_8php.html#a73751a6bcc17ad3ca503496e2fb020fa">system_unavailable.php</a>
+</li>
+<li>system_unavailable()
+: <a class="el" href="boot_8php.html#ac608a34f3bc180e7724192e0fd31f9b0">boot.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_func_0x74.html b/doc/html/globals_func_0x74.html
new file mode 100644
index 000000000..f7a827882
--- /dev/null
+++ b/doc/html/globals_func_0x74.html
@@ -0,0 +1,242 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li class="current"><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_func.html#index__"><span>_</span></a></li>
+ <li><a href="globals_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_func_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_func_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_func_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_func_0x73.html#index_s"><span>s</span></a></li>
+ <li class="current"><a href="globals_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_func_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_func_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_func_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_func_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_func_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_func_0x74.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_t"></a>- t -</h3><ul>
+<li>t()
+: <a class="el" href="language_8php.html#aae0c3638fb476ae1e31f8d242f5dac04">language.php</a>
+</li>
+<li>tag_deliver()
+: <a class="el" href="items_8php.html#ab1bce4261bcf75ad62753b498a144d17">items.php</a>
+</li>
+<li>tagadelic()
+: <a class="el" href="taxonomy_8php.html#aaf90ba8b839d6459065f39a4f1109b8a">taxonomy.php</a>
+</li>
+<li>tagblock()
+: <a class="el" href="taxonomy_8php.html#ac21d1dff16d569e7d110167aea4e63c2">taxonomy.php</a>
+</li>
+<li>tagger_content()
+: <a class="el" href="tagger_8php.html#a0e4a3eb177d1684553c547503d67161c">tagger.php</a>
+</li>
+<li>tagrm_content()
+: <a class="el" href="tagrm_8php.html#adfd4ea5b4d7fc6d9c9e042af5cd7d49a">tagrm.php</a>
+</li>
+<li>tagrm_post()
+: <a class="el" href="tagrm_8php.html#a1702f40aa53a2fa93deade1f609abe78">tagrm.php</a>
+</li>
+<li>tags_sort()
+: <a class="el" href="taxonomy_8php.html#aaeded36bcc983b35d9205fe5b6c18c43">taxonomy.php</a>
+</li>
+<li>template_escape()
+: <a class="el" href="template__processor_8php.html#ab2bcd8738f20f293636a6ae8e1099db5">template_processor.php</a>
+</li>
+<li>template_unescape()
+: <a class="el" href="template__processor_8php.html#ac635bb19a5f6eadd6b0cddefdd537c1e">template_processor.php</a>
+</li>
+<li>term_query()
+: <a class="el" href="taxonomy_8php.html#a7a913d19c77610da689be48fbbf6734c">taxonomy.php</a>
+</li>
+<li>terminate_friendship()
+: <a class="el" href="Contact_8php.html#a38daa1c210b78385307123450ca9a1fc">Contact.php</a>
+</li>
+<li>termtype()
+: <a class="el" href="items_8php.html#ad34827ed330898456783fb14c7b46154">items.php</a>
+</li>
+<li>tgroup_check()
+: <a class="el" href="items_8php.html#a88c6cf7649ac836fbbed82a7a0315110">items.php</a>
+</li>
+<li>theme_admin()
+: <a class="el" href="view_2theme_2blogga_2view_2theme_2blog_2config_8php.html#a09cd81013505f83aea0771243a1e4e53">config.php</a>
+</li>
+<li>theme_admin_post()
+: <a class="el" href="view_2theme_2blogga_2php_2config_8php.html#aef2da5582b7cb6b5f63e5ca5d69fd30b">config.php</a>
+</li>
+<li>theme_attachments()
+: <a class="el" href="text_8php.html#af9c9ac3f74c82dc60acfa404d0e9dc53">text.php</a>
+</li>
+<li>theme_content()
+: <a class="el" href="view_2theme_2redbasic_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d">config.php</a>
+</li>
+<li>theme_include()
+: <a class="el" href="plugin_8php.html#a65fedcffbe03562ef844cabee37d34e2">plugin.php</a>
+</li>
+<li>theme_post()
+: <a class="el" href="view_2theme_2apw_2php_2config_8php.html#ad29461920cf03b9ce1428e21eb1f4ba6">config.php</a>
+</li>
+<li>theme_status()
+: <a class="el" href="admin_8php.html#ad4f74f33944a98b56d2c8c7601f124a4">admin.php</a>
+</li>
+<li>thing_content()
+: <a class="el" href="thing_8php.html#a24a35f1e64029a67fdbea94a776ae04b">thing.php</a>
+</li>
+<li>thing_init()
+: <a class="el" href="thing_8php.html#a8be23b1d475ec3d9291999221c674c80">thing.php</a>
+</li>
+<li>timesel()
+: <a class="el" href="datetime_8php.html#a36d3d6dff8d76b5f295bb3d9c535a5b1">datetime.php</a>
+</li>
+<li>timezone_cmp()
+: <a class="el" href="datetime_8php.html#aa51b5a7ea4f931b23acbdfcea46e9865">datetime.php</a>
+</li>
+<li>title_is_body()
+: <a class="el" href="items_8php.html#aa371905f0a211b307cb3f7188c6cba04">items.php</a>
+</li>
+<li>toggle_mobile_init()
+: <a class="el" href="toggle__mobile_8php.html#aca53ade8971802b45c31e722b22c6254">toggle_mobile.php</a>
+</li>
+<li>toggle_safesearch_init()
+: <a class="el" href="toggle__safesearch_8php.html#a23d5cfb2727a266e44993ffbf5595a79">toggle_safesearch.php</a>
+</li>
+<li>toggle_theme()
+: <a class="el" href="admin_8php.html#af81f081851791cd15e49e8ff6722dc27">admin.php</a>
+</li>
+<li>tryoembed()
+: <a class="el" href="bbcode_8php.html#a55b0cb6973f1ec731de0e726bcc0efa7">bbcode.php</a>
+</li>
+<li>tt()
+: <a class="el" href="language_8php.html#ae310fb3880484ee1cc4faefe0c63c06d">language.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_func_0x75.html b/doc/html/globals_func_0x75.html
new file mode 100644
index 000000000..5f9db65d9
--- /dev/null
+++ b/doc/html/globals_func_0x75.html
@@ -0,0 +1,227 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li class="current"><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_func.html#index__"><span>_</span></a></li>
+ <li><a href="globals_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_func_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_func_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_func_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_func_0x74.html#index_t"><span>t</span></a></li>
+ <li class="current"><a href="globals_func_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_func_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_func_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_func_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_func_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_func_0x75.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_u"></a>- u -</h3><ul>
+<li>uexport_init()
+: <a class="el" href="uexport_8php.html#a118920137dedebe0581623a2e57e7b0d">uexport.php</a>
+</li>
+<li>unamp()
+: <a class="el" href="text_8php.html#a29d6b804e368d3ef359ee295e96ed4c7">text.php</a>
+</li>
+<li>undo_post_tagging()
+: <a class="el" href="text_8php.html#a740ad03e00459039a2c0992246c4e727">text.php</a>
+</li>
+<li>unescape_underscores_in_links()
+: <a class="el" href="bb2diaspora_8php.html#a599428bceb6f6d82a6a78cb66811f747">bb2diaspora.php</a>
+</li>
+<li>uninstall_plugin()
+: <a class="el" href="plugin_8php.html#a093a9cb98f51e3643634bd8bc6ed6e76">plugin.php</a>
+</li>
+<li>unload_plugin()
+: <a class="el" href="plugin_8php.html#a90538627db68605aeb6db17a8ead6523">plugin.php</a>
+</li>
+<li>unobscure()
+: <a class="el" href="text_8php.html#a8264348059abd1d4d5bb521323d3b19a">text.php</a>
+</li>
+<li>unregister_hook()
+: <a class="el" href="plugin_8php.html#a56f71fe5adf9586ce950523d8180443e">plugin.php</a>
+</li>
+<li>unxmlify()
+: <a class="el" href="text_8php.html#a1360fed7f918d859daaca1c9f384f9af">text.php</a>
+</li>
+<li>update_channel_content()
+: <a class="el" href="update__channel_8php.html#aca52a9da500f0db2f0a8666af5bc06ba">update_channel.php</a>
+</li>
+<li>update_community_content()
+: <a class="el" href="update__community_8php.html#abdcc5c4ecebbe0b5fcba2755c69cb3b1">update_community.php</a>
+</li>
+<li>update_directory_entry()
+: <a class="el" href="dir__fns_8php.html#a44062d4b471d1e83f92f6c184585aa13">dir_fns.php</a>
+</li>
+<li>update_display_content()
+: <a class="el" href="update__display_8php.html#aa36ac524059e209d5d75a03c16206246">update_display.php</a>
+</li>
+<li>update_imported_item()
+: <a class="el" href="zot_8php.html#a31aad56acf8ff8f2353e6ff8595544df">zot.php</a>
+</li>
+<li>update_modtime()
+: <a class="el" href="zot_8php.html#ab319d1d9fff9c7775d9daef42d1f33dd">zot.php</a>
+</li>
+<li>update_network_content()
+: <a class="el" href="update__network_8php.html#a8abf5b9f65af6a27ee2f9d7207ed1b41">update_network.php</a>
+</li>
+<li>update_queue_time()
+: <a class="el" href="queue__fn_8php.html#a4c2876181f75a4a61e85b7f00dfdbba1">queue_fn.php</a>
+</li>
+<li>update_remote_id()
+: <a class="el" href="items_8php.html#a2baa9e05f1e8aa3dd61c85803ae39bd6">items.php</a>
+</li>
+<li>update_search_content()
+: <a class="el" href="update__search_8php.html#ace4c3a23fa7d6922399e27c297a6ba52">update_search.php</a>
+</li>
+<li>update_suggestions()
+: <a class="el" href="socgraph_8php.html#a790690bb1a1d02483fe31632a160144d">socgraph.php</a>
+</li>
+<li>upgrade_bool_message()
+: <a class="el" href="plugin_8php.html#a754d7f53b3abc557b753c057dc4e021d">plugin.php</a>
+</li>
+<li>upgrade_link()
+: <a class="el" href="plugin_8php.html#a4fc13e528367f510fcb6d8bbfc559040">plugin.php</a>
+</li>
+<li>upgrade_message()
+: <a class="el" href="plugin_8php.html#a901657dd078e070516cf97285e0bada7">plugin.php</a>
+</li>
+<li>user_allow()
+: <a class="el" href="account_8php.html#ac5c570a2d46446bad4dd2501e9c5a4b1">account.php</a>
+</li>
+<li>user_deny()
+: <a class="el" href="account_8php.html#ac1653efba62493b9d87513e1b6c04c83">account.php</a>
+</li>
+<li>user_remove()
+: <a class="el" href="Contact_8php.html#a2fc191067dd571a79603c66b04b1ca15">Contact.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_func_0x76.html b/doc/html/globals_func_0x76.html
new file mode 100644
index 000000000..b8447e3c0
--- /dev/null
+++ b/doc/html/globals_func_0x76.html
@@ -0,0 +1,188 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li class="current"><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_func.html#index__"><span>_</span></a></li>
+ <li><a href="globals_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_func_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_func_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_func_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_func_0x75.html#index_u"><span>u</span></a></li>
+ <li class="current"><a href="globals_func_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_func_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_func_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_func_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_func_0x76.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_v"></a>- v -</h3><ul>
+<li>valid_email()
+: <a class="el" href="text_8php.html#a6a3d80a6c6fb234fd0bac44203b828eb">text.php</a>
+</li>
+<li>validate_channelname()
+: <a class="el" href="identity_8php.html#af2802bc13a00a17b867bba7978ba8f58">identity.php</a>
+</li>
+<li>validate_email()
+: <a class="el" href="include_2network_8php.html#a897e7112d86eb95526cbd0bff9375f02">network.php</a>
+</li>
+<li>validate_url()
+: <a class="el" href="include_2network_8php.html#a5caa264fab6d2b2344e6bd5b298b08f2">network.php</a>
+</li>
+<li>vcard_from_xchan()
+: <a class="el" href="Contact_8php.html#a6348a532c9d26cd1c9afbc9aa6aa8960">Contact.php</a>
+</li>
+<li>view_init()
+: <a class="el" href="view_8php.html#ac168f6c61a91ba2063f13b441c0ae96e">view.php</a>
+</li>
+<li>viewconnections_content()
+: <a class="el" href="viewconnections_8php.html#ab6c4d983e97b3a8a879567ff76507776">viewconnections.php</a>
+</li>
+<li>viewconnections_init()
+: <a class="el" href="viewconnections_8php.html#a00163d50b17568f7b0e48b1ca9ab7330">viewconnections.php</a>
+</li>
+<li>viewsrc_content()
+: <a class="el" href="viewsrc_8php.html#a6eff3d0c1d7d14b335c4edb785cd60a4">viewsrc.php</a>
+</li>
+<li>visible_activity()
+: <a class="el" href="conversation_8php.html#a7eeaaf44506815576f3bd80053ef52c3">conversation.php</a>
+</li>
+<li>vote_content()
+: <a class="el" href="vote_8php.html#a6aa67489bf458ca5e3206e46dac68596">vote.php</a>
+</li>
+<li>vote_init()
+: <a class="el" href="vote_8php.html#ae0c6610f40afbbc1f4fe6494c51fbab2">vote.php</a>
+</li>
+<li>vote_post()
+: <a class="el" href="vote_8php.html#a57a9516ee1b923b224e66dcc47377fb2">vote.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_func_0x77.html b/doc/html/globals_func_0x77.html
new file mode 100644
index 000000000..31af26a40
--- /dev/null
+++ b/doc/html/globals_func_0x77.html
@@ -0,0 +1,245 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li class="current"><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_func.html#index__"><span>_</span></a></li>
+ <li><a href="globals_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_func_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_func_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_func_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_func_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_func_0x76.html#index_v"><span>v</span></a></li>
+ <li class="current"><a href="globals_func_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_func_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_func_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_func_0x77.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_w"></a>- w -</h3><ul>
+<li>wall_attach_post()
+: <a class="el" href="wall__attach_8php.html#a7385e970e93228d082f0fd7254f6e653">wall_attach.php</a>
+</li>
+<li>wall_upload_post()
+: <a class="el" href="wall__upload_8php.html#a7cbe204244cf9e0380ee932263a74d8f">wall_upload.php</a>
+</li>
+<li>webfinger()
+: <a class="el" href="include_2network_8php.html#a8122356933bcd6b0a8567e8e15ae5cc5">network.php</a>
+</li>
+<li>webfinger_content()
+: <a class="el" href="webfinger_8php.html#a17dd28db6d390194bf9ecb809739d1d3">webfinger.php</a>
+</li>
+<li>webfinger_dfrn()
+: <a class="el" href="include_2network_8php.html#adf6008b38c555e98e7ed10da9ede2335">network.php</a>
+</li>
+<li>webpages_content()
+: <a class="el" href="webpages_8php.html#af3b7397d4abc153e3d2147740ee1a41d">webpages.php</a>
+</li>
+<li>wfinger_init()
+: <a class="el" href="wfinger_8php.html#ae21e50c8d0a5f3c9be9f43a4e519acd3">wfinger.php</a>
+</li>
+<li>what_next()
+: <a class="el" href="setup_8php.html#aea1ebdda58ec938f4e7b31aa5c5f6b58">setup.php</a>
+</li>
+<li>widget_affinity()
+: <a class="el" href="widgets_8php.html#add9b24d3304e529a7975e96122315554">widgets.php</a>
+</li>
+<li>widget_archive()
+: <a class="el" href="widgets_8php.html#a7b1e357b5a2027718470b77ec921fc65">widgets.php</a>
+</li>
+<li>widget_categories()
+: <a class="el" href="widgets_8php.html#af37fdad3b2e861d860a4a8c4d8a76c0b">widgets.php</a>
+</li>
+<li>widget_collections()
+: <a class="el" href="widgets_8php.html#aa189a07241246d97efbee29f1c6a6f7f">widgets.php</a>
+</li>
+<li>widget_design_tools()
+: <a class="el" href="widgets_8php.html#a145ff35319cfa47a9cc07f9425bd674b">widgets.php</a>
+</li>
+<li>widget_dirsafemode()
+: <a class="el" href="widgets_8php.html#a268b01ce1ab8fe2cb346cb769b9d1091">widgets.php</a>
+</li>
+<li>widget_dirsort()
+: <a class="el" href="widgets_8php.html#a95c06bc9be133e89768746302d2ac395">widgets.php</a>
+</li>
+<li>widget_dirtags()
+: <a class="el" href="widgets_8php.html#a08035db02ff6a23260146b4c64153422">widgets.php</a>
+</li>
+<li>widget_filer()
+: <a class="el" href="widgets_8php.html#a5ab3b64496e02cab56429978ad55f1c0">widgets.php</a>
+</li>
+<li>widget_findpeople()
+: <a class="el" href="widgets_8php.html#ade630b19fb4c622b7b2f6f8ef89eefa2">widgets.php</a>
+</li>
+<li>widget_follow()
+: <a class="el" href="widgets_8php.html#ad1bf7aa69e8d100d95faba17c7bc91cd">widgets.php</a>
+</li>
+<li>widget_fullprofile()
+: <a class="el" href="widgets_8php.html#a70442dfa079312d9d5e5ee01be51a165">widgets.php</a>
+</li>
+<li>widget_mailmenu()
+: <a class="el" href="widgets_8php.html#afa2e55a78f95667a6da082efac7fec74">widgets.php</a>
+</li>
+<li>widget_menu_preview()
+: <a class="el" href="widgets_8php.html#a3bdfb81bf9a8ddf219924fa7eaf22013">widgets.php</a>
+</li>
+<li>widget_notes()
+: <a class="el" href="widgets_8php.html#a45ea061dabe9a8372e4ca3b9e5714256">widgets.php</a>
+</li>
+<li>widget_photo_albums()
+: <a class="el" href="widgets_8php.html#a702e2fc0adc9b615999eca18b7311b5e">widgets.php</a>
+</li>
+<li>widget_profile()
+: <a class="el" href="widgets_8php.html#abd2e508a2a0b911c4a838e3cb7599923">widgets.php</a>
+</li>
+<li>widget_savedsearch()
+: <a class="el" href="widgets_8php.html#a94203eb9bcd63cbdecbbcb15163598d8">widgets.php</a>
+</li>
+<li>widget_settings_menu()
+: <a class="el" href="widgets_8php.html#aaa73bcf1702eaadd9dcd253502f55e01">widgets.php</a>
+</li>
+<li>widget_suggestions()
+: <a class="el" href="widgets_8php.html#a0d404276fedc59f5038cf5c085028326">widgets.php</a>
+</li>
+<li>widget_tagcloud()
+: <a class="el" href="widgets_8php.html#a6dbc227aac750774284ee39c45f0a200">widgets.php</a>
+</li>
+<li>widget_tagcloud_wall()
+: <a class="el" href="widgets_8php.html#ae4ced69d83dbdd9e6b51660d9eba8653">widgets.php</a>
+</li>
+<li>widget_vcard()
+: <a class="el" href="widgets_8php.html#abe03366fd22fd27d683518fa0765da50">widgets.php</a>
+</li>
+<li>writepages_widget()
+: <a class="el" href="page__widgets_8php.html#a1a1e729da27f252cab6678288a17958f">page_widgets.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_func_0x78.html b/doc/html/globals_func_0x78.html
new file mode 100644
index 000000000..24b97f465
--- /dev/null
+++ b/doc/html/globals_func_0x78.html
@@ -0,0 +1,179 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li class="current"><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_func.html#index__"><span>_</span></a></li>
+ <li><a href="globals_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_func_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_func_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_func_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_func_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_func_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_func_0x77.html#index_w"><span>w</span></a></li>
+ <li class="current"><a href="globals_func_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_func_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_func_0x78.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_x"></a>- x -</h3><ul>
+<li>x()
+: <a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">boot.php</a>
+</li>
+<li>xchan_content()
+: <a class="el" href="xchan_8php.html#a9853348bf1a35c644460221ba75edc2d">xchan.php</a>
+</li>
+<li>xchan_mail_query()
+: <a class="el" href="text_8php.html#a543447c5ed766535221e2d9636b379ee">text.php</a>
+</li>
+<li>xchan_query()
+: <a class="el" href="text_8php.html#a36a2e5d418ee81140f25c4233cfecd1f">text.php</a>
+</li>
+<li>xml2array()
+: <a class="el" href="include_2network_8php.html#a99353baabbc3e0584b85eb79ee802cff">network.php</a>
+</li>
+<li>xml_status()
+: <a class="el" href="include_2network_8php.html#a9e9da2aafb806c98ecdc318604e60dc6">network.php</a>
+</li>
+<li>xmlify()
+: <a class="el" href="text_8php.html#aaed4413ed8918838b517e3b2fafaea0d">text.php</a>
+</li>
+<li>xpost_to_html2bbcode()
+: <a class="el" href="post__to__red_8php.html#af2713018a2dc97e88f121fc6215beb66">post_to_red.php</a>
+</li>
+<li>xrd_init()
+: <a class="el" href="xrd_8php.html#aee3cf087968e4a0ff3a87de16eb23270">xrd.php</a>
+</li>
+<li>xref_init()
+: <a class="el" href="xref_8php.html#a9bee399213b8de8226b0d60834307473">xref.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_func_0x7a.html b/doc/html/globals_func_0x7a.html
new file mode 100644
index 000000000..e64c265ec
--- /dev/null
+++ b/doc/html/globals_func_0x7a.html
@@ -0,0 +1,233 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li class="current"><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_func.html#index__"><span>_</span></a></li>
+ <li><a href="globals_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_func_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_func_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_func_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_func_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_func_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_func_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_func_0x78.html#index_x"><span>x</span></a></li>
+ <li class="current"><a href="globals_func_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_func_0x7a.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_z"></a>- z -</h3><ul>
+<li>z_birthday()
+: <a class="el" href="datetime_8php.html#ab55e545b72ec8c097e052ea7d373491f">datetime.php</a>
+</li>
+<li>z_fetch_url()
+: <a class="el" href="include_2network_8php.html#aafd06c0a75402aefb06cfb9f9740fa37">network.php</a>
+</li>
+<li>z_input_filter()
+: <a class="el" href="text_8php.html#a324c58f37f6acdf9cd1922aa76077d9f">text.php</a>
+</li>
+<li>z_mime_content_type()
+: <a class="el" href="include_2attach_8php.html#a6fdd92775f31c07d2863e16e0026018a">attach.php</a>
+</li>
+<li>z_path()
+: <a class="el" href="boot_8php.html#aba208673515cbb8a55e5fa4a1da99fda">boot.php</a>
+</li>
+<li>z_post_url()
+: <a class="el" href="include_2network_8php.html#a9129fd55e7fc175b4ea9a195cccc16bc">network.php</a>
+</li>
+<li>z_readdir()
+: <a class="el" href="include_2attach_8php.html#aeb07968990e66a88c95483ca09a7f909">attach.php</a>
+</li>
+<li>z_root()
+: <a class="el" href="boot_8php.html#add517a0958ac684792c62142a3877f81">boot.php</a>
+</li>
+<li>zfinger_init()
+: <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger.php</a>
+</li>
+<li>zid()
+: <a class="el" href="identity_8php.html#a5b815330f3d177ab383af37a6c12e532">identity.php</a>
+</li>
+<li>zid_init()
+: <a class="el" href="identity_8php.html#a680fbafc2db023c5b1309e0180e81315">identity.php</a>
+</li>
+<li>zidify_callback()
+: <a class="el" href="text_8php.html#a405afe814a23f3bd94d826101aa168ab">text.php</a>
+</li>
+<li>zidify_img_callback()
+: <a class="el" href="text_8php.html#ab4a4c3d4700bc219bb84f33b499314f4">text.php</a>
+</li>
+<li>zidify_links()
+: <a class="el" href="text_8php.html#a29988052f3944111def3b6aaf2c7a8f6">text.php</a>
+</li>
+<li>zot_build_packet()
+: <a class="el" href="zot_8php.html#a3862b3161b2c8557dc1a95020179bd81">zot.php</a>
+</li>
+<li>zot_feed()
+: <a class="el" href="items_8php.html#a004e89d86b0f29b2c4da20108ecc4091">items.php</a>
+</li>
+<li>zot_fetch()
+: <a class="el" href="zot_8php.html#a61cdc1ec843663c423ed2d8160ae5aea">zot.php</a>
+</li>
+<li>zot_finger()
+: <a class="el" href="zot_8php.html#a95528377d7303131958c9f0b7158fdce">zot.php</a>
+</li>
+<li>zot_get_hublocs()
+: <a class="el" href="zot_8php.html#ae7cec2b417b5858fd4a41070f843d1d7">zot.php</a>
+</li>
+<li>zot_gethub()
+: <a class="el" href="zot_8php.html#a55056e863a7860bc0cf922e78fcce073">zot.php</a>
+</li>
+<li>zot_import()
+: <a class="el" href="zot_8php.html#aeea071f17e306fe3d0c488551906bfab">zot.php</a>
+</li>
+<li>zot_new_uid()
+: <a class="el" href="zot_8php.html#ab22d67660702056bf3f4696dcebf5ce7">zot.php</a>
+</li>
+<li>zot_process_response()
+: <a class="el" href="zot_8php.html#a928f5643ca66ae9635d85aeb2be62e03">zot.php</a>
+</li>
+<li>zot_refresh()
+: <a class="el" href="zot_8php.html#a7b23bfb31d4491231e1e73bdc077240d">zot.php</a>
+</li>
+<li>zot_register_hub()
+: <a class="el" href="zot_8php.html#a5bcdfef419b16075a0eca990956223dc">zot.php</a>
+</li>
+<li>zot_zot()
+: <a class="el" href="zot_8php.html#ab3e9b99ddb11353f37f265a05bb42142">zot.php</a>
+</li>
+<li>zotfeed_init()
+: <a class="el" href="zotfeed_8php.html#a24dfc23d366e7f840cf2847d0c1c8eac">zotfeed.php</a>
+</li>
+<li>zping_content()
+: <a class="el" href="zping_8php.html#a4d3a6b0b8b04ed6469015823e615ee75">zping.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_vars.html b/doc/html/globals_vars.html
new file mode 100644
index 000000000..152e8159d
--- /dev/null
+++ b/doc/html/globals_vars.html
@@ -0,0 +1,336 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li class="current"><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li class="current"><a href="globals_vars.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_vars_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_vars_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_vars_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_vars_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_vars_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_vars_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_vars_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_vars_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_vars_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_vars_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_vars_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_vars_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_vars_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_vars_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_vars_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_vars_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_vars_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_vars_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_vars_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_vars_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_vars_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_vars.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_0x24"></a>- $ -</h3><ul>
+<li>$a
+: <a class="el" href="typo_8php.html#acebf83966ef6d7e5645a6b62ba368f9f">typo.php</a>
+</li>
+<li>$API
+: <a class="el" href="include_2api_8php.html#aeb2e7ad00ea666b4b6dfcf82008194f8">api.php</a>
+</li>
+<li>$arr
+: <a class="el" href="extract_8php.html#a63bb4c41bc532baacf6a4976cfaa0feb">extract.php</a>
+</li>
+<li>$aside
+: <a class="el" href="minimalisticdarkness_8php.html#a6e5d97615c6faef5dbffe04b8024ceaf">minimalisticdarkness.php</a>
+</li>
+<li>$background_image
+: <a class="el" href="redbasic_2php_2style_8php.html#a339624aeef6604a2f00209a3962c6e1c">style.php</a>
+</li>
+<li>$banner_colour
+: <a class="el" href="redbasic_2php_2style_8php.html#ae587aa6949ab6e4aa77a591e60f67ee0">style.php</a>
+</li>
+<li>$bgcolour
+: <a class="el" href="redbasic_2php_2style_8php.html#a0bdce350cf14bac44976e786d1be6574">style.php</a>
+</li>
+<li>$body_font_size
+: <a class="el" href="redbasic_2php_2style_8php.html#ad78cb8a1793834626d73aca22a1501f8">style.php</a>
+</li>
+<li>$bodyclass
+: <a class="el" href="theme_2blogga_2php_2default_8php.html#a720581ae288aa09511670563e4205a4a">default.php</a>
+</li>
+<li>$called_api
+: <a class="el" href="include_2api_8php.html#aa62b15a6bbb280e86b98132eb214013d">api.php</a>
+</li>
+<li>$channel
+: <a class="el" href="php_2theme__init_8php.html#a54f32c086fe209c99769a4c4047dd864">theme_init.php</a>
+</li>
+<li>$comment_indent
+: <a class="el" href="redbasic_2php_2style_8php.html#a5bff5012c56e34da6b3b2ed475726b27">style.php</a>
+</li>
+<li>$converse_width
+: <a class="el" href="redbasic_2php_2style_8php.html#a0cb037986e32302685d4f580dedd6473">style.php</a>
+</li>
+<li>$dir
+: <a class="el" href="docblox__errorchecker_8php.html#a1659f0a629d408e0f849dbe4ee061e62">docblox_errorchecker.php</a>
+</li>
+<li>$dirs
+: <a class="el" href="typo_8php.html#a1b709c1d79631ebc8320b41bda028b54">typo.php</a>
+</li>
+<li>$dirstack
+: <a class="el" href="docblox__errorchecker_8php.html#ab66bc0493d25f39bf8b4dcbb429f04e6">docblox_errorchecker.php</a>
+</li>
+<li>$filelist
+: <a class="el" href="docblox__errorchecker_8php.html#a648a570b0f9f6e0e51b7267647c4b09b">docblox_errorchecker.php</a>
+</li>
+<li>$files
+: <a class="el" href="extract_8php.html#a9590b15215a21e9b42eb546aeef79704">extract.php</a>
+, <a class="el" href="tpldebug_8php.html#a5358407d65f2ca826f96356a6642d149">tpldebug.php</a>
+, <a class="el" href="typo_8php.html#a9590b15215a21e9b42eb546aeef79704">typo.php</a>
+</li>
+<li>$font_colour
+: <a class="el" href="redbasic_2php_2style_8php.html#a68e3ff836ec87ae1370c9f4a12c21c6b">style.php</a>
+</li>
+<li>$font_size
+: <a class="el" href="redbasic_2php_2style_8php.html#afcbcf57d0b90d2e4226c2e8a1171befc">style.php</a>
+</li>
+<li>$gc_probability
+: <a class="el" href="session_8php.html#a96b09cc763572f45280786a7b33feb7e">session.php</a>
+</li>
+<li>$headimg
+: <a class="el" href="theme_2blogga_2php_2default_8php.html#ac7062908d1eb80c0735270f7997c4527">default.php</a>
+</li>
+<li>$headimghome
+: <a class="el" href="theme_2blogga_2php_2default_8php.html#a1230ab83d4ec9785d8f3a966f33dc5f3">default.php</a>
+</li>
+<li>$i
+: <a class="el" href="docblox__errorchecker_8php.html#a83018d9153d17d91fbcf3bc10158d34f">docblox_errorchecker.php</a>
+</li>
+<li>$infile
+: <a class="el" href="php2po_8php.html#a61f8ddeb5557d46ebc546cc355bda214">php2po.php</a>
+</li>
+<li>$ink
+: <a class="el" href="php2po_8php.html#a6b0b8ebd9ce811d1325ef2c129443bc0">php2po.php</a>
+</li>
+<li>$install_wizard_pass
+: <a class="el" href="setup_8php.html#addb24714bc2542aa4f4215e98fe48432">setup.php</a>
+</li>
+<li>$item_colour
+: <a class="el" href="redbasic_2php_2style_8php.html#a27cb59bbc750341f448cd0c298a7ea16">style.php</a>
+</li>
+<li>$item_opacity
+: <a class="el" href="redbasic_2php_2style_8php.html#a136b0a2cdeb37f3fa506d28f82dcdbf8">style.php</a>
+</li>
+<li>$itemfloat
+: <a class="el" href="minimalisticdarkness_8php.html#a7e6c3d4efde4e9a2de32308081372c6b">minimalisticdarkness.php</a>
+</li>
+<li>$k
+: <a class="el" href="php2po_8php.html#ad6726cfaa85d4b8299d2b0f034cbf178">php2po.php</a>
+</li>
+<li>$minwidth
+: <a class="el" href="minimalisticdarkness_8php.html#a70bb13be8f23ec47839da81e0796f1cb">minimalisticdarkness.php</a>
+</li>
+<li>$nav_colour
+: <a class="el" href="redbasic_2php_2style_8php.html#a8fdd5874587a9ad86fb05ed0be265649">style.php</a>
+</li>
+<li>$nav_min_opacity
+: <a class="el" href="redbasic_2php_2style_8php.html#ab5ec5703848e0132f8a8f3d3a53a58e1">style.php</a>
+</li>
+<li>$nav_percent_min_opacity
+: <a class="el" href="redbasic_2php_2style_8php.html#a01c151bf47f7da2b979aaa4cb868da4c">style.php</a>
+</li>
+<li>$needed
+: <a class="el" href="docblox__errorchecker_8php.html#a852004caba0a34390297a079f4aaac73">docblox_errorchecker.php</a>
+</li>
+<li>$out
+: <a class="el" href="php2po_8php.html#a48cb304902320d173a4eaa41543327b9">php2po.php</a>
+</li>
+<li>$phpath
+: <a class="el" href="typo_8php.html#a3ecd17ac846be1b35f3662f5c12ab6bd">typo.php</a>
+</li>
+<li>$phpfile
+: <a class="el" href="php2po_8php.html#abbb0e5fd8fbc1f13a9bf68f86eb3d2a4">php2po.php</a>
+</li>
+<li>$plugin
+: <a class="el" href="post__to__red_8php.html#ada8a7130088351710bb02ed622d6bf65">post_to_red.php</a>
+</li>
+<li>$plugin_dir
+: <a class="el" href="post__to__red_8php.html#a99811555b30bde504a863e44015f2f19">post_to_red.php</a>
+</li>
+<li>$pmenu_reply
+: <a class="el" href="redbasic_2php_2style_8php.html#a9b489f1c595b867212d30eca0c85b38c">style.php</a>
+</li>
+<li>$pmenu_top
+: <a class="el" href="redbasic_2php_2style_8php.html#ac98bd8264411bd207a5740d08e81a158">style.php</a>
+</li>
+<li>$pofile
+: <a class="el" href="php2po_8php.html#a401d84ce156e49e8168bd0c4781e1be1">php2po.php</a>
+</li>
+<li>$radius
+: <a class="el" href="redbasic_2php_2style_8php.html#a6502bedd57105ad1fb2dee2be9cf6351">style.php</a>
+</li>
+<li>$reply_photo
+: <a class="el" href="redbasic_2php_2style_8php.html#a0b070f2c9140a7a12a0b1f88601a29e4">style.php</a>
+</li>
+<li>$res
+: <a class="el" href="docblox__errorchecker_8php.html#a49a8a4009b02e49717caa88b128affc5">docblox_errorchecker.php</a>
+</li>
+<li>$s
+: <a class="el" href="extract_8php.html#a50b05cf2e02ef0b67fcad97106dd7634">extract.php</a>
+</li>
+<li>$schema
+: <a class="el" href="redbasic_2php_2style_8php.html#a83022b1d70799d2bde3d64dca9cb40ee">style.php</a>
+</li>
+<li>$sectionleft
+: <a class="el" href="minimalisticdarkness_8php.html#a0ac3f5b52212b0af87d513273da03ead">minimalisticdarkness.php</a>
+</li>
+<li>$sectionwidth
+: <a class="el" href="minimalisticdarkness_8php.html#a04de7b747e4f0a353e0e38cf77c3404f">minimalisticdarkness.php</a>
+</li>
+<li>$session_exists
+: <a class="el" href="session_8php.html#a62e4a6cb26b4bb1b8ddd8277b26090eb">session.php</a>
+</li>
+<li>$session_expire
+: <a class="el" href="session_8php.html#af0100a2642a5268594bbd5742a03d885">session.php</a>
+</li>
+<li>$shadow
+: <a class="el" href="redbasic_2php_2style_8php.html#ab00dfc29448b183055d2ae61a0e1874a">style.php</a>
+</li>
+<li>$sloppy_photos
+: <a class="el" href="redbasic_2php_2style_8php.html#a6ffadaf926b41ad84c30da319011e9ad">style.php</a>
+</li>
+<li>$str
+: <a class="el" href="typohelper_8php.html#a7542d95618011800c61773127fa625cf">typohelper.php</a>
+</li>
+<li>$toolicon_activecolour
+: <a class="el" href="redbasic_2php_2style_8php.html#acfd00ec469ca3c5e8bfac787573093f3">style.php</a>
+</li>
+<li>$toolicon_colour
+: <a class="el" href="redbasic_2php_2style_8php.html#a4161f6b8aa923f67e53f54dfb6554cdb">style.php</a>
+</li>
+<li>$top_photo
+: <a class="el" href="redbasic_2php_2style_8php.html#a810142b4bdd35a1d377ab279b02b47eb">style.php</a>
+</li>
+<li>$uid
+: <a class="el" href="redbasic_2php_2style_8php.html#a109bbd7f4add27541707b191b73ef84a">style.php</a>
+</li>
+<li>$width
+: <a class="el" href="minimalisticdarkness_8php.html#a5795120b4b324bc4ca83f1e6fdce7d57">minimalisticdarkness.php</a>
+</li>
+<li>$wwtop
+: <a class="el" href="redbasic_2php_2style_8php.html#a61891d0d3e6894f52410d507b04e565d">style.php</a>
+</li>
+<li>$zones
+: <a class="el" href="extract_8php.html#a0cbe524ffc9a496114fd7ba9f423ef44">extract.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_vars.js b/doc/html/globals_vars.js
new file mode 100644
index 000000000..f614b41fa
--- /dev/null
+++ b/doc/html/globals_vars.js
@@ -0,0 +1,25 @@
+var globals_vars =
+[
+ [ "$", "globals_vars.html", null ],
+ [ "a", "globals_vars_0x61.html", null ],
+ [ "c", "globals_vars_0x63.html", null ],
+ [ "d", "globals_vars_0x64.html", null ],
+ [ "e", "globals_vars_0x65.html", null ],
+ [ "f", "globals_vars_0x66.html", null ],
+ [ "g", "globals_vars_0x67.html", null ],
+ [ "h", "globals_vars_0x68.html", null ],
+ [ "i", "globals_vars_0x69.html", null ],
+ [ "j", "globals_vars_0x6a.html", null ],
+ [ "k", "globals_vars_0x6b.html", null ],
+ [ "l", "globals_vars_0x6c.html", null ],
+ [ "m", "globals_vars_0x6d.html", null ],
+ [ "n", "globals_vars_0x6e.html", null ],
+ [ "p", "globals_vars_0x70.html", null ],
+ [ "r", "globals_vars_0x72.html", null ],
+ [ "s", "globals_vars_0x73.html", null ],
+ [ "t", "globals_vars_0x74.html", null ],
+ [ "u", "globals_vars_0x75.html", null ],
+ [ "w", "globals_vars_0x77.html", null ],
+ [ "x", "globals_vars_0x78.html", null ],
+ [ "z", "globals_vars_0x7a.html", null ]
+]; \ No newline at end of file
diff --git a/doc/html/globals_vars_0x61.html b/doc/html/globals_vars_0x61.html
new file mode 100644
index 000000000..4c85f18b6
--- /dev/null
+++ b/doc/html/globals_vars_0x61.html
@@ -0,0 +1,292 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li class="current"><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_vars.html#index_0x24"><span>$</span></a></li>
+ <li class="current"><a href="globals_vars_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_vars_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_vars_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_vars_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_vars_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_vars_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_vars_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_vars_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_vars_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_vars_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_vars_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_vars_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_vars_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_vars_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_vars_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_vars_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_vars_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_vars_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_vars_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_vars_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_vars_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_vars_0x61.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_a"></a>- a -</h3><ul>
+<li>ABOOK_FLAG_ARCHIVED
+: <a class="el" href="boot_8php.html#a222395aa223cfbff6166fab0b4e2e1d5">boot.php</a>
+</li>
+<li>ABOOK_FLAG_BLOCKED
+: <a class="el" href="boot_8php.html#a52b599cd13e152ebc80d7e4413683195">boot.php</a>
+</li>
+<li>ABOOK_FLAG_HIDDEN
+: <a class="el" href="boot_8php.html#a34c756469ebed32e2fc987bcde62d382">boot.php</a>
+</li>
+<li>ABOOK_FLAG_IGNORED
+: <a class="el" href="boot_8php.html#aa3425e2de85b08f7041656d3a8502cb6">boot.php</a>
+</li>
+<li>ABOOK_FLAG_PENDING
+: <a class="el" href="boot_8php.html#a68eebe493e6f729ffd1aeda7a4b11155">boot.php</a>
+</li>
+<li>ABOOK_FLAG_SELF
+: <a class="el" href="boot_8php.html#a0450389f24c632906fbc24347700a543">boot.php</a>
+</li>
+<li>ACCESS_FREE
+: <a class="el" href="boot_8php.html#afbb1fe1b2c8c730ec8e08da93b6512c4">boot.php</a>
+</li>
+<li>ACCESS_PAID
+: <a class="el" href="boot_8php.html#a9c80420e5a063a4a87ce4831f086134d">boot.php</a>
+</li>
+<li>ACCESS_PRIVATE
+: <a class="el" href="boot_8php.html#a7f3474fec541e261fc8dff47313c4017">boot.php</a>
+</li>
+<li>ACCESS_TIERED
+: <a class="el" href="boot_8php.html#aeb1039302affcbe7e8872c01c08c88f8">boot.php</a>
+</li>
+<li>ACCESS_TOKEN_DURATION
+: <a class="el" href="oauth_8php.html#ad343cab37aa860d2d14dc86b7f5ca0c6">oauth.php</a>
+</li>
+<li>ACCOUNT_BLOCKED
+: <a class="el" href="boot_8php.html#af3bdfc20979c16f15bb9c60446a480f9">boot.php</a>
+</li>
+<li>ACCOUNT_EXPIRED
+: <a class="el" href="boot_8php.html#a400519fa181591cd6fdbb8f25fbcba0a">boot.php</a>
+</li>
+<li>ACCOUNT_OK
+: <a class="el" href="boot_8php.html#a84057c5bfa1bca5fba8497fe005ee4d8">boot.php</a>
+</li>
+<li>ACCOUNT_PENDING
+: <a class="el" href="boot_8php.html#a032bbd6d0321e99e9117332c9ed2b1b8">boot.php</a>
+</li>
+<li>ACCOUNT_REMOVED
+: <a class="el" href="boot_8php.html#ab5ddbe69d3d03acd06e1fb281488cb78">boot.php</a>
+</li>
+<li>ACCOUNT_ROLE_ADMIN
+: <a class="el" href="boot_8php.html#ac8400313df2c831653f9036f71ebd86d">boot.php</a>
+</li>
+<li>ACCOUNT_ROLE_ALLOWCODE
+: <a class="el" href="boot_8php.html#a84f48897059bbd4a8738d7ee4cec6688">boot.php</a>
+</li>
+<li>ACCOUNT_ROLE_SYSTEM
+: <a class="el" href="boot_8php.html#a7c2eb822d50e1554bf5c32861f36342b">boot.php</a>
+</li>
+<li>ACCOUNT_UNVERIFIED
+: <a class="el" href="boot_8php.html#af3a4271630aabd8be592213f925d6a36">boot.php</a>
+</li>
+<li>ACTIVITY_DISLIKE
+: <a class="el" href="boot_8php.html#a0e57f846e6d47a308feced0f7274f178">boot.php</a>
+</li>
+<li>ACTIVITY_FAVORITE
+: <a class="el" href="boot_8php.html#a3e2ea123d29a72012db1241f96280b0e">boot.php</a>
+</li>
+<li>ACTIVITY_FOLLOW
+: <a class="el" href="boot_8php.html#a5ae728ac966ea1d3525a19e7fec59434">boot.php</a>
+</li>
+<li>ACTIVITY_FRIEND
+: <a class="el" href="boot_8php.html#a176664e78dcb9132e16be69418223eb2">boot.php</a>
+</li>
+<li>ACTIVITY_JOIN
+: <a class="el" href="boot_8php.html#aced60c7285192e80b7c4757e45a7f1e3">boot.php</a>
+</li>
+<li>ACTIVITY_LIKE
+: <a class="el" href="boot_8php.html#abdcdfc873ace4e0902177bad934de0c0">boot.php</a>
+</li>
+<li>ACTIVITY_MOOD
+: <a class="el" href="boot_8php.html#a7aa57438db03834aaa0b468bdce773a6">boot.php</a>
+</li>
+<li>ACTIVITY_OBJ_ALBUM
+: <a class="el" href="boot_8php.html#aaf9b76832ee5f85e56466af162ba8a14">boot.php</a>
+</li>
+<li>ACTIVITY_OBJ_COMMENT
+: <a class="el" href="boot_8php.html#a0a98dd0110dc6c8e24cefc8ae74d5562">boot.php</a>
+</li>
+<li>ACTIVITY_OBJ_EVENT
+: <a class="el" href="boot_8php.html#a2e90096fede6acce16abf0da8cb2febe">boot.php</a>
+</li>
+<li>ACTIVITY_OBJ_GROUP
+: <a class="el" href="boot_8php.html#a7bff2278e68a71e524afd1c7c951e1e3">boot.php</a>
+</li>
+<li>ACTIVITY_OBJ_HEART
+: <a class="el" href="boot_8php.html#ad302cb26b838898d475f57f61b0fcc9f">boot.php</a>
+</li>
+<li>ACTIVITY_OBJ_NOTE
+: <a class="el" href="boot_8php.html#a44d069c8a1cfcc6d2007c506a17ff28f">boot.php</a>
+</li>
+<li>ACTIVITY_OBJ_P_PHOTO
+: <a class="el" href="boot_8php.html#a74bf27f7564c9a37975e7b37d973dcab">boot.php</a>
+</li>
+<li>ACTIVITY_OBJ_PERSON
+: <a class="el" href="boot_8php.html#a2f8f25b13480c37a5f22511f53da8bab">boot.php</a>
+</li>
+<li>ACTIVITY_OBJ_PHOTO
+: <a class="el" href="boot_8php.html#a774f0f792ebfec1e774c5a17bb9d5966">boot.php</a>
+</li>
+<li>ACTIVITY_OBJ_PROFILE
+: <a class="el" href="boot_8php.html#a62c832a95e38b1fa23e6cef39521b7d5">boot.php</a>
+</li>
+<li>ACTIVITY_OBJ_TAGTERM
+: <a class="el" href="boot_8php.html#a1da180f961f49a11573cac4ff6c62c05">boot.php</a>
+</li>
+<li>ACTIVITY_OBJ_THING
+: <a class="el" href="boot_8php.html#a0fb63e51c2a9814941842ae8f2f4dff8">boot.php</a>
+</li>
+<li>ACTIVITY_POKE
+: <a class="el" href="boot_8php.html#a14ba8f9e162f2559831ee3bf98e0c3bd">boot.php</a>
+</li>
+<li>ACTIVITY_POST
+: <a class="el" href="boot_8php.html#a5c3747e0f505f0d5271dc4c54e3feaf4">boot.php</a>
+</li>
+<li>ACTIVITY_REQ_FRIEND
+: <a class="el" href="boot_8php.html#afe084c30a1810c10442edb4fbcbc0086">boot.php</a>
+</li>
+<li>ACTIVITY_TAG
+: <a class="el" href="boot_8php.html#a12c781cefc20167231e2e3fd5866b1b5">boot.php</a>
+</li>
+<li>ACTIVITY_UNFOLLOW
+: <a class="el" href="boot_8php.html#a53e4bdb6f225da55115acb9277f75e53">boot.php</a>
+</li>
+<li>ACTIVITY_UNFRIEND
+: <a class="el" href="boot_8php.html#a29528a2544373cc19a378f350040c6a1">boot.php</a>
+</li>
+<li>ACTIVITY_UPDATE
+: <a class="el" href="boot_8php.html#a7f4264232dbb6c3b41f2617deecb1866">boot.php</a>
+</li>
+<li>ATOM_TIME
+: <a class="el" href="boot_8php.html#ad34c1547020a305915bcc39707744690">boot.php</a>
+</li>
+<li>ATTACH_FLAG_DIR
+: <a class="el" href="boot_8php.html#aa74438cf71e48e37bf7b440b94243985">boot.php</a>
+</li>
+<li>ATTACH_FLAG_OS
+: <a class="el" href="boot_8php.html#a781916f83fcc8ff1035649afa45f0292">boot.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_vars_0x63.html b/doc/html/globals_vars_0x63.html
new file mode 100644
index 000000000..6899381a8
--- /dev/null
+++ b/doc/html/globals_vars_0x63.html
@@ -0,0 +1,163 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li class="current"><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_vars.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_vars_0x61.html#index_a"><span>a</span></a></li>
+ <li class="current"><a href="globals_vars_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_vars_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_vars_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_vars_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_vars_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_vars_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_vars_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_vars_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_vars_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_vars_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_vars_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_vars_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_vars_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_vars_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_vars_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_vars_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_vars_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_vars_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_vars_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_vars_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_vars_0x63.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_c"></a>- c -</h3><ul>
+<li>CLIENT_MODE_LOAD
+: <a class="el" href="boot_8php.html#af6f6f6f40139f12fc09ec47373b30919">boot.php</a>
+</li>
+<li>CLIENT_MODE_NORMAL
+: <a class="el" href="boot_8php.html#a43c6c7d84d880e9500bd4f8f8ecc5731">boot.php</a>
+</li>
+<li>CLIENT_MODE_UPDATE
+: <a class="el" href="boot_8php.html#a3f40aa5bafff8c4eebdc62e5121daf77">boot.php</a>
+</li>
+<li>CONTACT_IS_FOLLOWER
+: <a class="el" href="boot_8php.html#ada72d88ae39a7e3b45baea201cb49a29">boot.php</a>
+</li>
+<li>CONTACT_IS_FRIEND
+: <a class="el" href="boot_8php.html#a27299ecfb9e9a99826f17a1c14c6995f">boot.php</a>
+</li>
+<li>CONTACT_IS_SHARING
+: <a class="el" href="boot_8php.html#a6c5e9e293c8242dcb9bc2c3ea2fee2c9">boot.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_vars_0x64.html b/doc/html/globals_vars_0x64.html
new file mode 100644
index 000000000..06a3e585a
--- /dev/null
+++ b/doc/html/globals_vars_0x64.html
@@ -0,0 +1,172 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li class="current"><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_vars.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_vars_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_vars_0x63.html#index_c"><span>c</span></a></li>
+ <li class="current"><a href="globals_vars_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_vars_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_vars_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_vars_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_vars_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_vars_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_vars_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_vars_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_vars_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_vars_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_vars_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_vars_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_vars_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_vars_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_vars_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_vars_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_vars_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_vars_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_vars_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_vars_0x64.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_d"></a>- d -</h3><ul>
+<li>DB_UPDATE_VERSION
+: <a class="el" href="boot_8php.html#ac59a18a4838710d6c2de37aed6b21f03">boot.php</a>
+</li>
+<li>DEFAULT_DB_ENGINE
+: <a class="el" href="boot_8php.html#aa8a2b61e70900139d1ca28e46f1da49d">boot.php</a>
+</li>
+<li>DIRECTORY_FALLBACK_MASTER
+: <a class="el" href="boot_8php.html#abedd940e664017c61b48c6efa31d0cb8">boot.php</a>
+</li>
+<li>DIRECTORY_MODE_NORMAL
+: <a class="el" href="boot_8php.html#ab7d65a7e7417825a4db62906bb600729">boot.php</a>
+</li>
+<li>DIRECTORY_MODE_PRIMARY
+: <a class="el" href="boot_8php.html#a8a60cc38bb567765fd926fef70205f16">boot.php</a>
+</li>
+<li>DIRECTORY_MODE_SECONDARY
+: <a class="el" href="boot_8php.html#aedfb9501ed408278667995524e0d15cf">boot.php</a>
+</li>
+<li>DIRECTORY_MODE_STANDALONE
+: <a class="el" href="boot_8php.html#a25476eec71fceda237f7dc1d78b0adb8">boot.php</a>
+</li>
+<li>DIRECTORY_REALM
+: <a class="el" href="boot_8php.html#a6b9909db6a7ec80ec6fdd40ba74014dd">boot.php</a>
+</li>
+<li>do
+: <a class="el" href="docblox__errorchecker_8php.html#a721c6ff80a6d3e4ad4ffa52a04c60085">docblox_errorchecker.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_vars_0x65.html b/doc/html/globals_vars_0x65.html
new file mode 100644
index 000000000..b39b21f8a
--- /dev/null
+++ b/doc/html/globals_vars_0x65.html
@@ -0,0 +1,157 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li class="current"><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_vars.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_vars_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_vars_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_vars_0x64.html#index_d"><span>d</span></a></li>
+ <li class="current"><a href="globals_vars_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_vars_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_vars_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_vars_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_vars_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_vars_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_vars_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_vars_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_vars_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_vars_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_vars_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_vars_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_vars_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_vars_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_vars_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_vars_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_vars_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_vars_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_vars_0x65.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_e"></a>- e -</h3><ul>
+<li>else
+: <a class="el" href="auth_8php.html#a0950af7c2888ca1d4743fe5d0bff9ae5">auth.php</a>
+, <a class="el" href="fpostit_8php.html#a501b5ca82f287509fc691c88524064c1">fpostit.php</a>
+, <a class="el" href="redbasic_2php_2style_8php.html#ab3afb90d611eca90819f597a2c0bb459">style.php</a>
+, <a class="el" href="tpldebug_8php.html#afbc7aadb3f7ff1edf0aaaa326a42179c">tpldebug.php</a>
+</li>
+<li>EOL
+: <a class="el" href="boot_8php.html#a0603d6ece8c5d37b4b7db697db053a4b">boot.php</a>
+</li>
+<li>EOT
+: <a class="el" href="typohelper_8php.html#ab6fd357fb5b2a3ba8aab9e8b98c6a805">typohelper.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_vars_0x66.html b/doc/html/globals_vars_0x66.html
new file mode 100644
index 000000000..ac01ed206
--- /dev/null
+++ b/doc/html/globals_vars_0x66.html
@@ -0,0 +1,148 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li class="current"><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_vars.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_vars_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_vars_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_vars_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_vars_0x65.html#index_e"><span>e</span></a></li>
+ <li class="current"><a href="globals_vars_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_vars_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_vars_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_vars_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_vars_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_vars_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_vars_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_vars_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_vars_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_vars_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_vars_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_vars_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_vars_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_vars_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_vars_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_vars_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_vars_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_vars_0x66.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_f"></a>- f -</h3><ul>
+<li>foreach
+: <a class="el" href="typo_8php.html#a329c9c12217d2c8660c47bbc7c8df4c5">typo.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_vars_0x67.html b/doc/html/globals_vars_0x67.html
new file mode 100644
index 000000000..350a44913
--- /dev/null
+++ b/doc/html/globals_vars_0x67.html
@@ -0,0 +1,154 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li class="current"><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_vars.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_vars_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_vars_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_vars_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_vars_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_vars_0x66.html#index_f"><span>f</span></a></li>
+ <li class="current"><a href="globals_vars_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_vars_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_vars_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_vars_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_vars_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_vars_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_vars_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_vars_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_vars_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_vars_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_vars_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_vars_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_vars_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_vars_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_vars_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_vars_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_vars_0x67.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_g"></a>- g -</h3><ul>
+<li>GRAVITY_COMMENT
+: <a class="el" href="boot_8php.html#a4a12ce5de39789b0361e308d89925a20">boot.php</a>
+</li>
+<li>GRAVITY_LIKE
+: <a class="el" href="boot_8php.html#a1f5906598e90b5ea2b4245f682be4348">boot.php</a>
+</li>
+<li>GRAVITY_PARENT
+: <a class="el" href="boot_8php.html#a2af173e4e9836ee7c90757b4793a2be3">boot.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_vars_0x68.html b/doc/html/globals_vars_0x68.html
new file mode 100644
index 000000000..aaa124015
--- /dev/null
+++ b/doc/html/globals_vars_0x68.html
@@ -0,0 +1,169 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li class="current"><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_vars.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_vars_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_vars_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_vars_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_vars_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_vars_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_vars_0x67.html#index_g"><span>g</span></a></li>
+ <li class="current"><a href="globals_vars_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_vars_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_vars_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_vars_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_vars_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_vars_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_vars_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_vars_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_vars_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_vars_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_vars_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_vars_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_vars_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_vars_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_vars_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_vars_0x68.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_h"></a>- h -</h3><ul>
+<li>HUBLOC_FLAGS_DELETED
+: <a class="el" href="boot_8php.html#a7c286add8961fd2d79216314cd4aadd8">boot.php</a>
+</li>
+<li>HUBLOC_FLAGS_PRIMARY
+: <a class="el" href="boot_8php.html#a3ad9cc5d4354be741fa1de12b96e9955">boot.php</a>
+</li>
+<li>HUBLOC_FLAGS_UNVERIFIED
+: <a class="el" href="boot_8php.html#ab54b24cc302e1a42a67a49d788b6b764">boot.php</a>
+</li>
+<li>HUBLOC_NOTUSED
+: <a class="el" href="boot_8php.html#aa589421267f0c2f0d643f727792cce35">boot.php</a>
+</li>
+<li>HUBLOC_OFFLINE
+: <a class="el" href="boot_8php.html#a845891f82bf6edd7fa2d578b66703112">boot.php</a>
+</li>
+<li>HUBLOC_RECEIVE_ERROR
+: <a class="el" href="boot_8php.html#abeb4d86e17cefa8584f1244e2183b0e1">boot.php</a>
+</li>
+<li>HUBLOC_SEND_ERROR
+: <a class="el" href="boot_8php.html#a3b56bfc6a0dd159070e316ddac3b7456">boot.php</a>
+</li>
+<li>HUBLOC_WORKS
+: <a class="el" href="boot_8php.html#a7a8ba64d089cc0412c59a2eefc6d655c">boot.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_vars_0x69.html b/doc/html/globals_vars_0x69.html
new file mode 100644
index 000000000..2d4e26940
--- /dev/null
+++ b/doc/html/globals_vars_0x69.html
@@ -0,0 +1,229 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li class="current"><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_vars.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_vars_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_vars_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_vars_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_vars_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_vars_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_vars_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_vars_0x68.html#index_h"><span>h</span></a></li>
+ <li class="current"><a href="globals_vars_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_vars_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_vars_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_vars_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_vars_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_vars_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_vars_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_vars_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_vars_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_vars_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_vars_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_vars_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_vars_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_vars_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_vars_0x69.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_i"></a>- i -</h3><ul>
+<li>if
+: <a class="el" href="php2po_8php.html#a45b05625748f412ec97afcd61cf7980b">php2po.php</a>
+, <a class="el" href="php_2default_8php.html#a23bc1996b18e69c1a3ab44536613a762">default.php</a>
+, <a class="el" href="apw_2php_2style_8php.html#a883f9f14e205f7aa7de02c14df67b40a">style.php</a>
+, <a class="el" href="full_8php.html#a6fac1b4b8cdfde06ea1b7713479e92db">full.php</a>
+</li>
+<li>ITEM_BLOCKED
+: <a class="el" href="boot_8php.html#ab28dc518fa90b6f617dd8c564eb4f35f">boot.php</a>
+</li>
+<li>ITEM_BUG
+: <a class="el" href="boot_8php.html#a87b0f279f8413c7e4d805c5d85f20d34">boot.php</a>
+</li>
+<li>ITEM_BUILDBLOCK
+: <a class="el" href="boot_8php.html#a7fc4b291a7cdaa48b38e27344ea183cf">boot.php</a>
+</li>
+<li>ITEM_DELAYED_PUBLISH
+: <a class="el" href="boot_8php.html#ac890557fedc5b5a3b1d996249b1e1a20">boot.php</a>
+</li>
+<li>ITEM_DELETED
+: <a class="el" href="boot_8php.html#a3515ea6bf77495de89b93e9ccd881c49">boot.php</a>
+</li>
+<li>ITEM_HIDDEN
+: <a class="el" href="boot_8php.html#ac99fc4d040764eac1736bec6973556fe">boot.php</a>
+</li>
+<li>ITEM_MENTIONSME
+: <a class="el" href="boot_8php.html#a8da836617174eed9fc2ac8054125354b">boot.php</a>
+</li>
+<li>ITEM_MODERATED
+: <a class="el" href="boot_8php.html#ac01230c7655e0705b2e99c9bc03c4450">boot.php</a>
+</li>
+<li>ITEM_NOCOMMENT
+: <a class="el" href="boot_8php.html#a949116d9a295b214293006c060ca4848">boot.php</a>
+</li>
+<li>ITEM_NOTSHOWN
+: <a class="el" href="boot_8php.html#a8663f32171568489dbb2a01dd00371f8">boot.php</a>
+</li>
+<li>ITEM_NSFW
+: <a class="el" href="boot_8php.html#a939de9a99278f4fd7dcd0ee67f243f08">boot.php</a>
+</li>
+<li>ITEM_OBSCURED
+: <a class="el" href="boot_8php.html#a2c8906f1af94a3559a5b4661067bb79d">boot.php</a>
+</li>
+<li>ITEM_ORIGIN
+: <a class="el" href="boot_8php.html#a8c9dce0ef27b35397e29298eb966f7f7">boot.php</a>
+</li>
+<li>ITEM_PDL
+: <a class="el" href="boot_8php.html#a6e57d913634d033b4d5ad72d99fd3e9d">boot.php</a>
+</li>
+<li>ITEM_RELAY
+: <a class="el" href="boot_8php.html#a2958a2bd5422b85329d7c36c06dbc221">boot.php</a>
+</li>
+<li>ITEM_SPAM
+: <a class="el" href="boot_8php.html#a40d885b2cfd736aab4234ae641ca4dfb">boot.php</a>
+</li>
+<li>ITEM_STARRED
+: <a class="el" href="boot_8php.html#a7af107fab8d62b9a73801713b774ed30">boot.php</a>
+</li>
+<li>ITEM_THREAD_TOP
+: <a class="el" href="boot_8php.html#a749144d8dd9c1366596a0213c277d050">boot.php</a>
+</li>
+<li>ITEM_UNPUBLISHED
+: <a class="el" href="boot_8php.html#adaeb4f590c56326b2dca3b19f31b6272">boot.php</a>
+</li>
+<li>ITEM_UNSEEN
+: <a class="el" href="boot_8php.html#a009e6a0637cb65804ea8094ecc4450b0">boot.php</a>
+</li>
+<li>ITEM_UPLINK
+: <a class="el" href="boot_8php.html#aefba06f1c0842036329033e7567ecf6d">boot.php</a>
+</li>
+<li>ITEM_UPLINK_PRV
+: <a class="el" href="boot_8php.html#aad33b494084f729b6ee3b0bc457718a1">boot.php</a>
+</li>
+<li>ITEM_VERIFIED
+: <a class="el" href="boot_8php.html#a18a400fa45e5632811b33041d8c048bf">boot.php</a>
+</li>
+<li>ITEM_VISIBLE
+: <a class="el" href="boot_8php.html#ab55b16ae7fc19fafe5afaedd49163bbf">boot.php</a>
+</li>
+<li>ITEM_WALL
+: <a class="el" href="boot_8php.html#a6788e99021ec8ffb0fa94d651f22a322">boot.php</a>
+</li>
+<li>ITEM_WEBPAGE
+: <a class="el" href="boot_8php.html#af489d0c3166551b93e63a79ff2c9be35">boot.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_vars_0x6a.html b/doc/html/globals_vars_0x6a.html
new file mode 100644
index 000000000..b2d1d4353
--- /dev/null
+++ b/doc/html/globals_vars_0x6a.html
@@ -0,0 +1,148 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li class="current"><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_vars.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_vars_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_vars_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_vars_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_vars_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_vars_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_vars_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_vars_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_vars_0x69.html#index_i"><span>i</span></a></li>
+ <li class="current"><a href="globals_vars_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_vars_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_vars_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_vars_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_vars_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_vars_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_vars_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_vars_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_vars_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_vars_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_vars_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_vars_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_vars_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_vars_0x6a.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_j"></a>- j -</h3><ul>
+<li>JPEG_QUALITY
+: <a class="el" href="boot_8php.html#a3475ff6c2e575f946ea0ee377e944173">boot.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_vars_0x6b.html b/doc/html/globals_vars_0x6b.html
new file mode 100644
index 000000000..8ebbfc2e3
--- /dev/null
+++ b/doc/html/globals_vars_0x6b.html
@@ -0,0 +1,148 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li class="current"><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_vars.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_vars_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_vars_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_vars_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_vars_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_vars_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_vars_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_vars_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_vars_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_vars_0x6a.html#index_j"><span>j</span></a></li>
+ <li class="current"><a href="globals_vars_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_vars_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_vars_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_vars_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_vars_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_vars_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_vars_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_vars_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_vars_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_vars_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_vars_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_vars_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_vars_0x6b.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_k"></a>- k -</h3><ul>
+<li>KEY_NOT_EXISTS
+: <a class="el" href="template__processor_8php.html#a797745996c7839a93b2ab1af456631ab">template_processor.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_vars_0x6c.html b/doc/html/globals_vars_0x6c.html
new file mode 100644
index 000000000..f771e49cb
--- /dev/null
+++ b/doc/html/globals_vars_0x6c.html
@@ -0,0 +1,166 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li class="current"><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_vars.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_vars_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_vars_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_vars_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_vars_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_vars_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_vars_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_vars_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_vars_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_vars_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_vars_0x6b.html#index_k"><span>k</span></a></li>
+ <li class="current"><a href="globals_vars_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_vars_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_vars_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_vars_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_vars_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_vars_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_vars_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_vars_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_vars_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_vars_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_vars_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_vars_0x6c.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_l"></a>- l -</h3><ul>
+<li>LANGUAGE_DETECT_MIN_CONFIDENCE
+: <a class="el" href="boot_8php.html#a68d1d5bc9c7ccb663dc671b48c66df11">boot.php</a>
+</li>
+<li>LANGUAGE_DETECT_MIN_LENGTH
+: <a class="el" href="boot_8php.html#a17cf72338b040891781a4bcbdd9a8595">boot.php</a>
+</li>
+<li>LOGGER_ALL
+: <a class="el" href="boot_8php.html#afe63ae69ba55299f813766e54df06ede">boot.php</a>
+</li>
+<li>LOGGER_DATA
+: <a class="el" href="boot_8php.html#a6969947145a139ec374ce098224d8e81">boot.php</a>
+</li>
+<li>LOGGER_DEBUG
+: <a class="el" href="boot_8php.html#a93823d15ae07548a4c49de88d325cd26">boot.php</a>
+</li>
+<li>LOGGER_NORMAL
+: <a class="el" href="boot_8php.html#a17b4ea23d9ecf628d9c8f53b7abcb805">boot.php</a>
+</li>
+<li>LOGGER_TRACE
+: <a class="el" href="boot_8php.html#a022cea669f9f13ef7c6268b63884c57f">boot.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_vars_0x6d.html b/doc/html/globals_vars_0x6d.html
new file mode 100644
index 000000000..b05529db2
--- /dev/null
+++ b/doc/html/globals_vars_0x6d.html
@@ -0,0 +1,175 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li class="current"><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_vars.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_vars_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_vars_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_vars_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_vars_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_vars_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_vars_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_vars_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_vars_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_vars_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_vars_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_vars_0x6c.html#index_l"><span>l</span></a></li>
+ <li class="current"><a href="globals_vars_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_vars_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_vars_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_vars_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_vars_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_vars_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_vars_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_vars_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_vars_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_vars_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_vars_0x6d.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_m"></a>- m -</h3><ul>
+<li>MAIL_DELETED
+: <a class="el" href="boot_8php.html#ad0876e837cf3fad8a26417e315f6e2c8">boot.php</a>
+</li>
+<li>MAIL_ISREPLY
+: <a class="el" href="boot_8php.html#aa544a6c078130d0967a1f4ed8ce0a2d2">boot.php</a>
+</li>
+<li>MAIL_OBSCURED
+: <a class="el" href="boot_8php.html#a44ae1542a805ffd7f826fb511db07374">boot.php</a>
+</li>
+<li>MAIL_RECALLED
+: <a class="el" href="boot_8php.html#ae4861de36017fe399c1839f778bad9f5">boot.php</a>
+</li>
+<li>MAIL_REPLIED
+: <a class="el" href="boot_8php.html#aa3679df31c8dad1b71816b0322d5baff">boot.php</a>
+</li>
+<li>MAIL_SEEN
+: <a class="el" href="boot_8php.html#a1fbb93cf030f07391f22cc2948744869">boot.php</a>
+</li>
+<li>MAX_IMAGE_LENGTH
+: <a class="el" href="boot_8php.html#a525ca93ff35d3535d1a2b8ba57876afa">boot.php</a>
+</li>
+<li>MAX_LIKERS
+: <a class="el" href="boot_8php.html#a35625dacd2158b9f1f1a8e77f9f081fd">boot.php</a>
+</li>
+<li>MENU_ITEM_NEWWIN
+: <a class="el" href="boot_8php.html#ad11f30a6590d3d77f0c5e1e3909af8f5">boot.php</a>
+</li>
+<li>MENU_ITEM_ZID
+: <a class="el" href="boot_8php.html#aed0dfb35f7dd00dc9e4f868ea7f7ff53">boot.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_vars_0x6e.html b/doc/html/globals_vars_0x6e.html
new file mode 100644
index 000000000..8fcd642b9
--- /dev/null
+++ b/doc/html/globals_vars_0x6e.html
@@ -0,0 +1,265 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li class="current"><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_vars.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_vars_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_vars_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_vars_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_vars_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_vars_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_vars_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_vars_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_vars_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_vars_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_vars_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_vars_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_vars_0x6d.html#index_m"><span>m</span></a></li>
+ <li class="current"><a href="globals_vars_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_vars_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_vars_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_vars_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_vars_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_vars_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_vars_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_vars_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_vars_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_vars_0x6e.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_n"></a>- n -</h3><ul>
+<li>n
+: <a class="el" href="php2po_8php.html#a1594a11499d06cc8a789ee7ca0c7a12b">php2po.php</a>
+</li>
+<li>NAMESPACE_ACTIVITY
+: <a class="el" href="boot_8php.html#a5df5359090d1f8e898c36d7cf8878ad2">boot.php</a>
+</li>
+<li>NAMESPACE_ACTIVITY_SCHEMA
+: <a class="el" href="boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133">boot.php</a>
+</li>
+<li>NAMESPACE_ATOM1
+: <a class="el" href="boot_8php.html#a444ce608ce34efb82ee11852f36e825f">boot.php</a>
+</li>
+<li>NAMESPACE_DFRN
+: <a class="el" href="boot_8php.html#a7ed4581ab66ebcde97f6b3730856b028">boot.php</a>
+</li>
+<li>NAMESPACE_FEED
+: <a class="el" href="boot_8php.html#ac195fc9003298923ea81f144388e24b1">boot.php</a>
+</li>
+<li>NAMESPACE_GEORSS
+: <a class="el" href="boot_8php.html#a03d19251c245587de7ed959300b87bdf">boot.php</a>
+</li>
+<li>NAMESPACE_MEDIA
+: <a class="el" href="boot_8php.html#a6626f383c3d2d459f731ab8b4f237d16">boot.php</a>
+</li>
+<li>NAMESPACE_OSTATUS
+: <a class="el" href="boot_8php.html#acca19aae62e1a6951a856b945de20d67">boot.php</a>
+</li>
+<li>NAMESPACE_OSTATUSSUB
+: <a class="el" href="boot_8php.html#a181c111f4b6c14d091dfd3bf0d0a22cd">boot.php</a>
+</li>
+<li>NAMESPACE_POCO
+: <a class="el" href="boot_8php.html#a0b73e2548d6f9beb9c93211f488e336a">boot.php</a>
+</li>
+<li>NAMESPACE_SALMON_ME
+: <a class="el" href="boot_8php.html#aee324eca9de4e0fedf01ab5f92e27c67">boot.php</a>
+</li>
+<li>NAMESPACE_STATUSNET
+: <a class="el" href="boot_8php.html#afaf93b7026f784b113b4f8921745891e">boot.php</a>
+</li>
+<li>NAMESPACE_THREAD
+: <a class="el" href="boot_8php.html#a1d6e7f4c08bb68e4a424326a811bdd86">boot.php</a>
+</li>
+<li>NAMESPACE_TOMB
+: <a class="el" href="boot_8php.html#a4bfe22e163657690dfb6d5b1d04cb47e">boot.php</a>
+</li>
+<li>NAMESPACE_ZOT
+: <a class="el" href="boot_8php.html#a49f2a70b3b43aa904223a8d19e986a47">boot.php</a>
+</li>
+<li>NETWORK_DFRN
+: <a class="el" href="boot_8php.html#ae3cef7b63e25e7bafea3fcf6b99fad0e">boot.php</a>
+</li>
+<li>NETWORK_DIASPORA
+: <a class="el" href="boot_8php.html#a38f6c7fe33b5434a24b4314567753dfa">boot.php</a>
+</li>
+<li>NETWORK_FACEBOOK
+: <a class="el" href="boot_8php.html#af3905ea8f8568d0236db13fca40514e3">boot.php</a>
+</li>
+<li>NETWORK_FEED
+: <a class="el" href="boot_8php.html#ab4bddb41a0cf407178ec5278b950c393">boot.php</a>
+</li>
+<li>NETWORK_GPLUS
+: <a class="el" href="boot_8php.html#a8905fde0a5b7882bdc083b20d9b34701">boot.php</a>
+</li>
+<li>NETWORK_LINKEDIN
+: <a class="el" href="boot_8php.html#a5b043b7fdcfd4e8c9c3747574afc6caa">boot.php</a>
+</li>
+<li>NETWORK_MAIL
+: <a class="el" href="boot_8php.html#a7236b2cdcf59f02a42302e893a99013b">boot.php</a>
+</li>
+<li>NETWORK_MAIL2
+: <a class="el" href="boot_8php.html#aa17a4f9c63f5cbc5c06f1066b6aebc42">boot.php</a>
+</li>
+<li>NETWORK_MYSPACE
+: <a class="el" href="boot_8php.html#ae94f7c7c0909629a75aed1c41f10bc95">boot.php</a>
+</li>
+<li>NETWORK_OSTATUS
+: <a class="el" href="boot_8php.html#aef4b6c558c68c88c10f13c5a00c20e3d">boot.php</a>
+</li>
+<li>NETWORK_PHANTOM
+: <a class="el" href="boot_8php.html#ab21fb0f3e6b962419955c6fc7f26734f">boot.php</a>
+</li>
+<li>NETWORK_XMPP
+: <a class="el" href="boot_8php.html#a43296b1b4398aacbf92a4b2d56bab91e">boot.php</a>
+</li>
+<li>NETWORK_ZOT
+: <a class="el" href="boot_8php.html#a2c65e925994566a63e6c03c381f1b4a0">boot.php</a>
+</li>
+<li>NOTIFY_COMMENT
+: <a class="el" href="boot_8php.html#a20f0eed431d25870b624b8937a07a59f">boot.php</a>
+</li>
+<li>NOTIFY_CONFIRM
+: <a class="el" href="boot_8php.html#af8c0cb0744c9a6b5d6d3baafb1f1e71d">boot.php</a>
+</li>
+<li>NOTIFY_INTRO
+: <a class="el" href="boot_8php.html#a56fd673eaa7014150297ce1162502db5">boot.php</a>
+</li>
+<li>NOTIFY_MAIL
+: <a class="el" href="boot_8php.html#a285732e7889fa7f333cbe431111e1029">boot.php</a>
+</li>
+<li>NOTIFY_POKE
+: <a class="el" href="boot_8php.html#aca08bc4f1554ba877500f6abcc99e1e8">boot.php</a>
+</li>
+<li>NOTIFY_PROFILE
+: <a class="el" href="boot_8php.html#a981d46380f9f23c308bac1f9cb00dc5b">boot.php</a>
+</li>
+<li>NOTIFY_SUGGEST
+: <a class="el" href="boot_8php.html#a9d01ef178b72b145016cca1393415bc4">boot.php</a>
+</li>
+<li>NOTIFY_SYSTEM
+: <a class="el" href="boot_8php.html#a14d44d4a00223dc3db4ea962325db192">boot.php</a>
+</li>
+<li>NOTIFY_TAGSELF
+: <a class="el" href="boot_8php.html#ab724491497ab2618b23a01d5da60aec0">boot.php</a>
+</li>
+<li>NOTIFY_TAGSHARE
+: <a class="el" href="boot_8php.html#af6937db5f581d006bf4a5c3d9c7e0461">boot.php</a>
+</li>
+<li>NOTIFY_WALL
+: <a class="el" href="boot_8php.html#a505410c7edc5f5bb5fa227b98359793e">boot.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_vars_0x70.html b/doc/html/globals_vars_0x70.html
new file mode 100644
index 000000000..02c290708
--- /dev/null
+++ b/doc/html/globals_vars_0x70.html
@@ -0,0 +1,277 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li class="current"><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_vars.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_vars_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_vars_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_vars_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_vars_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_vars_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_vars_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_vars_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_vars_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_vars_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_vars_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_vars_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_vars_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_vars_0x6e.html#index_n"><span>n</span></a></li>
+ <li class="current"><a href="globals_vars_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_vars_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_vars_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_vars_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_vars_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_vars_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_vars_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_vars_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_vars_0x70.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_p"></a>- p -</h3><ul>
+<li>page
+: <a class="el" href="mod__import_8php.html#a8db1899eeeb44dabd0904065b63627bb">mod_import.php</a>
+</li>
+<li>PAGE_ADULT
+: <a class="el" href="boot_8php.html#ace83842dbeb84f7ed9ac59a9f57a7c32">boot.php</a>
+</li>
+<li>PAGE_APPLICATION
+: <a class="el" href="boot_8php.html#a8231d115060d41a9c2a677f2c86f10ed">boot.php</a>
+</li>
+<li>PAGE_AUTOCONNECT
+: <a class="el" href="boot_8php.html#aa275653b9c87abc7391bb8040c1c2de9">boot.php</a>
+</li>
+<li>PAGE_DIRECTORY_CHANNEL
+: <a class="el" href="boot_8php.html#a5b8484922918946d041e5e0515dbe718">boot.php</a>
+</li>
+<li>PAGE_HIDDEN
+: <a class="el" href="boot_8php.html#a5e322a2a2d0f51924c0b2e874988e640">boot.php</a>
+</li>
+<li>PAGE_NORMAL
+: <a class="el" href="boot_8php.html#a09532c3f750ae8c4527e63b2b790cbf3">boot.php</a>
+</li>
+<li>PAGE_PREMIUM
+: <a class="el" href="boot_8php.html#ab3920c2f3cd64802c0b7ff625c3b2ea8">boot.php</a>
+</li>
+<li>PAGE_REMOVED
+: <a class="el" href="boot_8php.html#a4edce16cb7f21cdafa1e85bf63d713e6">boot.php</a>
+</li>
+<li>PAGE_SYSTEM
+: <a class="el" href="boot_8php.html#a6ee7a72d558d1851bbb9e3cdde377932">boot.php</a>
+</li>
+<li>PERMS_A_DELEGATE
+: <a class="el" href="boot_8php.html#a423505ab8dbd8e39d04ae3fe1374102b">boot.php</a>
+</li>
+<li>PERMS_A_REPUBLISH
+: <a class="el" href="boot_8php.html#aae6c941bde5fd6fce07e51dba7326ead">boot.php</a>
+</li>
+<li>PERMS_CONTACTS
+: <a class="el" href="boot_8php.html#ab2d0e8a9b81ee548ef2ce8e4560da2f6">boot.php</a>
+</li>
+<li>PERMS_NETWORK
+: <a class="el" href="boot_8php.html#a6df1102664f64b274810db85197c2755">boot.php</a>
+</li>
+<li>PERMS_PUBLIC
+: <a class="el" href="boot_8php.html#aff210e8403dd72368522b17fb6e5d4e7">boot.php</a>
+</li>
+<li>PERMS_R_ABOOK
+: <a class="el" href="boot_8php.html#a3d6d4fc5fafcc9156811669158541caf">boot.php</a>
+</li>
+<li>PERMS_R_PAGES
+: <a class="el" href="boot_8php.html#ab51965fabe54dc031e9a0ce1142ee83e">boot.php</a>
+</li>
+<li>PERMS_R_PHOTOS
+: <a class="el" href="boot_8php.html#a29e921c0c72412cc738e44cca6ca1f62">boot.php</a>
+</li>
+<li>PERMS_R_PROFILE
+: <a class="el" href="boot_8php.html#ad789aef3cb95fc1eb36be7c4283d0137">boot.php</a>
+</li>
+<li>PERMS_R_STORAGE
+: <a class="el" href="boot_8php.html#a1db4f0009c9cb4e107eab0f914a3c8dc">boot.php</a>
+</li>
+<li>PERMS_R_STREAM
+: <a class="el" href="boot_8php.html#aec36f8fcd4cb14a52934590b3d6666b4">boot.php</a>
+</li>
+<li>PERMS_SITE
+: <a class="el" href="boot_8php.html#a9ff652e5cb83cd11cbb0350844e7b28f">boot.php</a>
+</li>
+<li>PERMS_SPECIFIC
+: <a class="el" href="boot_8php.html#a9cc986b4f9dd6558cbb2e25aadbfd964">boot.php</a>
+</li>
+<li>PERMS_W_CHAT
+: <a class="el" href="boot_8php.html#acd877c405b06b348b37b6f7e62a211e9">boot.php</a>
+</li>
+<li>PERMS_W_COMMENT
+: <a class="el" href="boot_8php.html#a32df13fec0e43281da5979e1f5579aa8">boot.php</a>
+</li>
+<li>PERMS_W_MAIL
+: <a class="el" href="boot_8php.html#a6b31dd451bc6c37fe7c9c766ff385aaf">boot.php</a>
+</li>
+<li>PERMS_W_PAGES
+: <a class="el" href="boot_8php.html#aa9244fc9cc221980c07a20cc534111be">boot.php</a>
+</li>
+<li>PERMS_W_PHOTOS
+: <a class="el" href="boot_8php.html#a57eee7352714c004d36c26dda74af73e">boot.php</a>
+</li>
+<li>PERMS_W_STORAGE
+: <a class="el" href="boot_8php.html#a4fefd7486d3b888a05cfd3dc9575f115">boot.php</a>
+</li>
+<li>PERMS_W_STREAM
+: <a class="el" href="boot_8php.html#a8bb0395933b5e886f086f6a2fb0bfa55">boot.php</a>
+</li>
+<li>PERMS_W_TAGWALL
+: <a class="el" href="boot_8php.html#a99a4a17cb644e7e6826ea07ecaf09777">boot.php</a>
+</li>
+<li>PERMS_W_WALL
+: <a class="el" href="boot_8php.html#a6b14a31a8aa9f3452a13383f413bffa2">boot.php</a>
+</li>
+<li>PHOTO_NORMAL
+: <a class="el" href="boot_8php.html#a4a49b29838ef2c45ab3556b52baec6a4">boot.php</a>
+</li>
+<li>PHOTO_PROFILE
+: <a class="el" href="boot_8php.html#ab4bc9c50ecc927b92d519e36562b0df0">boot.php</a>
+</li>
+<li>PHOTO_THING
+: <a class="el" href="boot_8php.html#a78849a1bf8ce8d9804b4cbb502e8f383">boot.php</a>
+</li>
+<li>PHOTO_XCHAN
+: <a class="el" href="boot_8php.html#ac43182e0d8bae7576a30b603774974f8">boot.php</a>
+</li>
+<li>PNG_QUALITY
+: <a class="el" href="boot_8php.html#a8df201788c9dd0ca91384e3a14c08bce">boot.php</a>
+</li>
+<li>POLL_MULTIPLE_CHOICE
+: <a class="el" href="boot_8php.html#abbf5ac24eb8aeedb862f618ee0d21e86">boot.php</a>
+</li>
+<li>POLL_OVERWRITE
+: <a class="el" href="boot_8php.html#a2b525996e4426bdddbcec277778bde08">boot.php</a>
+</li>
+<li>POLL_SIMPLE_RATING
+: <a class="el" href="boot_8php.html#ad88a70ec62e08d590123d3697dfe64d5">boot.php</a>
+</li>
+<li>POLL_TENSCALE
+: <a class="el" href="boot_8php.html#a1ba00027b718db732f30fc0e2c3e0abc">boot.php</a>
+</li>
+<li>post_to_red_acct_name
+: <a class="el" href="post__to__red_8php.html#a588cea66afe0b32f27f2713d44940119">post_to_red.php</a>
+</li>
+<li>post_to_red_path
+: <a class="el" href="post__to__red_8php.html#a6210f39392a5f0fa0255cc7d3760493a">post_to_red.php</a>
+</li>
+<li>post_to_red_version
+: <a class="el" href="post__to__red_8php.html#af3e7ebd361d4ed7cb6d43209970cd94a">post_to_red.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_vars_0x72.html b/doc/html/globals_vars_0x72.html
new file mode 100644
index 000000000..12c800d3f
--- /dev/null
+++ b/doc/html/globals_vars_0x72.html
@@ -0,0 +1,169 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li class="current"><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_vars.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_vars_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_vars_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_vars_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_vars_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_vars_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_vars_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_vars_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_vars_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_vars_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_vars_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_vars_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_vars_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_vars_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_vars_0x70.html#index_p"><span>p</span></a></li>
+ <li class="current"><a href="globals_vars_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_vars_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_vars_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_vars_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_vars_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_vars_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_vars_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_vars_0x72.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_r"></a>- r -</h3><ul>
+<li>RANDOM_STRING_HEX
+: <a class="el" href="text_8php.html#aad557c054cf2ed915633701018fc7e3f">text.php</a>
+</li>
+<li>RANDOM_STRING_TEXT
+: <a class="el" href="text_8php.html#a2ffd79c60cc87cec24ef76447b905187">text.php</a>
+</li>
+<li>RED_PLATFORM
+: <a class="el" href="boot_8php.html#a96ad56755a21e1361dbd7bf93c9e7ff4">boot.php</a>
+</li>
+<li>RED_VERSION
+: <a class="el" href="boot_8php.html#a21cc29e0025943e7c28ff58cb4856ac3">boot.php</a>
+</li>
+<li>REGISTER_APPROVE
+: <a class="el" href="boot_8php.html#a7176c0f9f1c98421b97735d892cf6252">boot.php</a>
+</li>
+<li>REGISTER_CLOSED
+: <a class="el" href="boot_8php.html#a69aac276ed82e010dc382b16ab4d59e1">boot.php</a>
+</li>
+<li>REGISTER_OPEN
+: <a class="el" href="boot_8php.html#ad8887b49bbb02dd30b4eb9f6c7773c63">boot.php</a>
+</li>
+<li>REQUEST_TOKEN_DURATION
+: <a class="el" href="oauth_8php.html#a7a32a5990f113ac9465b03b29175cf16">oauth.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_vars_0x73.html b/doc/html/globals_vars_0x73.html
new file mode 100644
index 000000000..578fb9bd7
--- /dev/null
+++ b/doc/html/globals_vars_0x73.html
@@ -0,0 +1,157 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li class="current"><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_vars.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_vars_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_vars_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_vars_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_vars_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_vars_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_vars_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_vars_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_vars_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_vars_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_vars_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_vars_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_vars_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_vars_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_vars_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_vars_0x72.html#index_r"><span>r</span></a></li>
+ <li class="current"><a href="globals_vars_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_vars_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_vars_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_vars_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_vars_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_vars_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_vars_0x73.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_s"></a>- s -</h3><ul>
+<li>SSL_POLICY_FULL
+: <a class="el" href="boot_8php.html#a02566ac9d891369a1d3ebb81a15722fc">boot.php</a>
+</li>
+<li>SSL_POLICY_NONE
+: <a class="el" href="boot_8php.html#af86c651547aa8f9e549ee40a09455549">boot.php</a>
+</li>
+<li>SSL_POLICY_SELFSIGN
+: <a class="el" href="boot_8php.html#adca48aee78465ae3064ca4432c0d87b5">boot.php</a>
+</li>
+<li>STORAGE_DEFAULT_PERMISSIONS
+: <a class="el" href="boot_8php.html#aecaa1b6945b317ba8f1daf4af2aed8e6">boot.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_vars_0x74.html b/doc/html/globals_vars_0x74.html
new file mode 100644
index 000000000..ea2637f84
--- /dev/null
+++ b/doc/html/globals_vars_0x74.html
@@ -0,0 +1,187 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li class="current"><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_vars.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_vars_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_vars_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_vars_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_vars_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_vars_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_vars_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_vars_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_vars_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_vars_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_vars_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_vars_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_vars_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_vars_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_vars_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_vars_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_vars_0x73.html#index_s"><span>s</span></a></li>
+ <li class="current"><a href="globals_vars_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_vars_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_vars_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_vars_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_vars_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_vars_0x74.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_t"></a>- t -</h3><ul>
+<li>TERM_CATEGORY
+: <a class="el" href="boot_8php.html#af33d1b2e98a1e21af672005525d46dfe">boot.php</a>
+</li>
+<li>TERM_FILE
+: <a class="el" href="boot_8php.html#afb97615e985a013799839b68b99018d7">boot.php</a>
+</li>
+<li>TERM_HASHTAG
+: <a class="el" href="boot_8php.html#a2750985ec445617d7e82ae3098c91e3f">boot.php</a>
+</li>
+<li>TERM_MENTION
+: <a class="el" href="boot_8php.html#ae37444eaa42705185080ccf3e670cbc2">boot.php</a>
+</li>
+<li>TERM_OBJ_CHANNEL
+: <a class="el" href="boot_8php.html#a8892374789fd261eb32a7969d934a14a">boot.php</a>
+</li>
+<li>TERM_OBJ_OBJECT
+: <a class="el" href="boot_8php.html#a882b666adfe21f035a0f8c02806066d6">boot.php</a>
+</li>
+<li>TERM_OBJ_PHOTO
+: <a class="el" href="boot_8php.html#a64617d4655804de2a3c86501ab4fdbfd">boot.php</a>
+</li>
+<li>TERM_OBJ_POST
+: <a class="el" href="boot_8php.html#a9eeb8989272d5ff804a616898bb13659">boot.php</a>
+</li>
+<li>TERM_OBJ_PROFILE
+: <a class="el" href="boot_8php.html#aead84fa27d7516b855220fe004964a45">boot.php</a>
+</li>
+<li>TERM_OBJ_THING
+: <a class="el" href="boot_8php.html#a0cc8dc76bd10ac0ec81bac08a46f82fe">boot.php</a>
+</li>
+<li>TERM_PCATEGORY
+: <a class="el" href="boot_8php.html#a45b12aefab9675baffc7a07a09486db8">boot.php</a>
+</li>
+<li>TERM_SAVEDSEARCH
+: <a class="el" href="boot_8php.html#abd7bb40da9cc073297e49736b338ca07">boot.php</a>
+</li>
+<li>TERM_THING
+: <a class="el" href="boot_8php.html#a0d877df1e20bae765e1708be50f6b503">boot.php</a>
+</li>
+<li>TERM_UNKNOWN
+: <a class="el" href="boot_8php.html#a0c59dde058efebbc66520d136cbd1631">boot.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_vars_0x75.html b/doc/html/globals_vars_0x75.html
new file mode 100644
index 000000000..c8c461099
--- /dev/null
+++ b/doc/html/globals_vars_0x75.html
@@ -0,0 +1,157 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li class="current"><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_vars.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_vars_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_vars_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_vars_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_vars_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_vars_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_vars_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_vars_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_vars_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_vars_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_vars_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_vars_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_vars_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_vars_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_vars_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_vars_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_vars_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_vars_0x74.html#index_t"><span>t</span></a></li>
+ <li class="current"><a href="globals_vars_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_vars_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_vars_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_vars_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_vars_0x75.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_u"></a>- u -</h3><ul>
+<li>UPDATE_FAILED
+: <a class="el" href="boot_8php.html#a75fc600186b13c3b25e661afefb5eac8">boot.php</a>
+</li>
+<li>UPDATE_FLAGS_DELETED
+: <a class="el" href="boot_8php.html#aea392cb26ed617f3a8cde648385b5df0">boot.php</a>
+</li>
+<li>UPDATE_FLAGS_UPDATED
+: <a class="el" href="boot_8php.html#a9690d73434125ce594a1f5e7c2a4f7c0">boot.php</a>
+</li>
+<li>UPDATE_SUCCESS
+: <a class="el" href="boot_8php.html#ac86615ddc0763a00f5311c90e991730c">boot.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_vars_0x77.html b/doc/html/globals_vars_0x77.html
new file mode 100644
index 000000000..c9cdeb78a
--- /dev/null
+++ b/doc/html/globals_vars_0x77.html
@@ -0,0 +1,148 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li class="current"><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_vars.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_vars_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_vars_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_vars_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_vars_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_vars_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_vars_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_vars_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_vars_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_vars_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_vars_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_vars_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_vars_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_vars_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_vars_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_vars_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_vars_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_vars_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_vars_0x75.html#index_u"><span>u</span></a></li>
+ <li class="current"><a href="globals_vars_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_vars_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_vars_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_vars_0x77.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_w"></a>- w -</h3><ul>
+<li>while
+: <a class="el" href="docblox__errorchecker_8php.html#af4ca738a05beffe9c8c23e1f7aea3c2d">docblox_errorchecker.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_vars_0x78.html b/doc/html/globals_vars_0x78.html
new file mode 100644
index 000000000..4278aa8f4
--- /dev/null
+++ b/doc/html/globals_vars_0x78.html
@@ -0,0 +1,166 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li class="current"><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_vars.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_vars_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_vars_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_vars_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_vars_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_vars_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_vars_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_vars_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_vars_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_vars_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_vars_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_vars_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_vars_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_vars_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_vars_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_vars_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_vars_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_vars_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_vars_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_vars_0x77.html#index_w"><span>w</span></a></li>
+ <li class="current"><a href="globals_vars_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_vars_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_vars_0x78.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_x"></a>- x -</h3><ul>
+<li>XCHAN_FLAGS_CENSORED
+: <a class="el" href="boot_8php.html#accd6f36cc9f40225cbd720e4d12a7c6e">boot.php</a>
+</li>
+<li>XCHAN_FLAGS_DELETED
+: <a class="el" href="boot_8php.html#a9ea1290e00c6d40684892047f2c778a9">boot.php</a>
+</li>
+<li>XCHAN_FLAGS_HIDDEN
+: <a class="el" href="boot_8php.html#a1af3ed96de14aa0d7891b39cc75b60f2">boot.php</a>
+</li>
+<li>XCHAN_FLAGS_NORMAL
+: <a class="el" href="boot_8php.html#a8fdcc4ffb365a3267bd02ce8a8d466d6">boot.php</a>
+</li>
+<li>XCHAN_FLAGS_ORPHAN
+: <a class="el" href="boot_8php.html#a1c923b99bf77e4203ae94e5684b6ad0f">boot.php</a>
+</li>
+<li>XCHAN_FLAGS_SELFCENSORED
+: <a class="el" href="boot_8php.html#a5a681a672e007cdc22b43345d71f07c6">boot.php</a>
+</li>
+<li>XCHAN_FLAGS_SYSTEM
+: <a class="el" href="boot_8php.html#afef254290febac854c85fc698d9483a6">boot.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_vars_0x7a.html b/doc/html/globals_vars_0x7a.html
new file mode 100644
index 000000000..1d8482c2c
--- /dev/null
+++ b/doc/html/globals_vars_0x7a.html
@@ -0,0 +1,151 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li class="current"><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_vars.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_vars_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_vars_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_vars_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_vars_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_vars_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_vars_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_vars_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_vars_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_vars_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_vars_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_vars_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_vars_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_vars_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_vars_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_vars_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_vars_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_vars_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_vars_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_vars_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_vars_0x78.html#index_x"><span>x</span></a></li>
+ <li class="current"><a href="globals_vars_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_vars_0x7a.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_z"></a>- z -</h3><ul>
+<li>ZCURL_TIMEOUT
+: <a class="el" href="boot_8php.html#a3cd42a70c6b3999590e4fd7a1a9096af">boot.php</a>
+</li>
+<li>ZOT_REVISION
+: <a class="el" href="boot_8php.html#a36b31575f992a10b5927b76efba9362e">boot.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/gprobe_8php.html b/doc/html/gprobe_8php.html
new file mode 100644
index 000000000..e145841f3
--- /dev/null
+++ b/doc/html/gprobe_8php.html
@@ -0,0 +1,147 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/gprobe.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('gprobe_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">gprobe.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:adf72cb0a70b5b9d99fdec1cc60e18ed1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="gprobe_8php.html#adf72cb0a70b5b9d99fdec1cc60e18ed1">gprobe_run</a> ($<a class="el" href="boot_8php.html#a768f00b7d66be0daf7ef4eea2e862006">argv</a>, $<a class="el" href="boot_8php.html#abc0a90a1a77f5b668aa7e4b57d1776a7">argc</a>)</td></tr>
+<tr class="separator:adf72cb0a70b5b9d99fdec1cc60e18ed1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="adf72cb0a70b5b9d99fdec1cc60e18ed1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">gprobe_run </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$argv</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$argc</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/gprobe_8php.js b/doc/html/gprobe_8php.js
new file mode 100644
index 000000000..1c0c6e44a
--- /dev/null
+++ b/doc/html/gprobe_8php.js
@@ -0,0 +1,4 @@
+var gprobe_8php =
+[
+ [ "gprobe_run", "gprobe_8php.html#adf72cb0a70b5b9d99fdec1cc60e18ed1", null ]
+]; \ No newline at end of file
diff --git a/doc/html/greenthumbnails_8php.html b/doc/html/greenthumbnails_8php.html
new file mode 100644
index 000000000..69c3376e3
--- /dev/null
+++ b/doc/html/greenthumbnails_8php.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/apw/schema/greenthumbnails.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('greenthumbnails_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">greenthumbnails.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/hcard_8php.html b/doc/html/hcard_8php.html
new file mode 100644
index 000000000..581077cb3
--- /dev/null
+++ b/doc/html/hcard_8php.html
@@ -0,0 +1,155 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/hcard.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('hcard_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">hcard.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ac34f26b0e6a37eef44fa49bea135136d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="hcard_8php.html#ac34f26b0e6a37eef44fa49bea135136d">hcard_init</a> (&amp;$a)</td></tr>
+<tr class="separator:ac34f26b0e6a37eef44fa49bea135136d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a956c7cae2009652a37900306e5b7b73d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="hcard_8php.html#a956c7cae2009652a37900306e5b7b73d">hcard_aside</a> (&amp;$a)</td></tr>
+<tr class="separator:a956c7cae2009652a37900306e5b7b73d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a956c7cae2009652a37900306e5b7b73d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">hcard_aside </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ac34f26b0e6a37eef44fa49bea135136d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">hcard_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/hcard_8php.js b/doc/html/hcard_8php.js
new file mode 100644
index 000000000..fe7ffda18
--- /dev/null
+++ b/doc/html/hcard_8php.js
@@ -0,0 +1,5 @@
+var hcard_8php =
+[
+ [ "hcard_aside", "hcard_8php.html#a956c7cae2009652a37900306e5b7b73d", null ],
+ [ "hcard_init", "hcard_8php.html#ac34f26b0e6a37eef44fa49bea135136d", null ]
+]; \ No newline at end of file
diff --git a/doc/html/help_8php.html b/doc/html/help_8php.html
new file mode 100644
index 000000000..4eb654d30
--- /dev/null
+++ b/doc/html/help_8php.html
@@ -0,0 +1,158 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/help.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('help_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">help.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:af055e15f600ffa6fbca9386fdf715224"><td class="memItemLeft" align="right" valign="top"><a class="el" href="redbasic_2php_2style_8php.html#a883f9f14e205f7aa7de02c14df67b40a">if</a>(!function_exists('load_doc_file'))&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="help_8php.html#af055e15f600ffa6fbca9386fdf715224">help_content</a> (&amp;$a)</td></tr>
+<tr class="separator:af055e15f600ffa6fbca9386fdf715224"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a06b2a51aaabed99e53a9b639047c4ce4"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="help_8php.html#a06b2a51aaabed99e53a9b639047c4ce4">preg_callback_help_include</a> ($matches)</td></tr>
+<tr class="separator:a06b2a51aaabed99e53a9b639047c4ce4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="af055e15f600ffa6fbca9386fdf715224"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="redbasic_2php_2style_8php.html#a883f9f14e205f7aa7de02c14df67b40a">if</a> (!function_exists('load_doc_file')) help_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>You can create local site resources in doc/Site.md and either link to doc/Home.md for the standard resources or use our include mechanism to include it on your local page.</p>
+<p>#include doc/Home.md;</p>
+<p>The syntax is somewhat strict. </p>
+
+</div>
+</div>
+<a class="anchor" id="a06b2a51aaabed99e53a9b639047c4ce4"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">preg_callback_help_include </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$matches</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/help_8php.js b/doc/html/help_8php.js
new file mode 100644
index 000000000..bc1247ed4
--- /dev/null
+++ b/doc/html/help_8php.js
@@ -0,0 +1,5 @@
+var help_8php =
+[
+ [ "help_content", "help_8php.html#af055e15f600ffa6fbca9386fdf715224", null ],
+ [ "preg_callback_help_include", "help_8php.html#a06b2a51aaabed99e53a9b639047c4ce4", null ]
+]; \ No newline at end of file
diff --git a/doc/html/hierarchy.html b/doc/html/hierarchy.html
new file mode 100644
index 000000000..ad25b4dd7
--- /dev/null
+++ b/doc/html/hierarchy.html
@@ -0,0 +1,152 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class Hierarchy</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li class="current"><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('hierarchy.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">Class Hierarchy</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock">This inheritance list is sorted roughly, but not completely, alphabetically:</div><div class="directory">
+<div class="levels">[detail level <span onclick="javascript:toggleLevel(1);">1</span><span onclick="javascript:toggleLevel(2);">2</span>]</div><table class="directory">
+<tr id="row_0_" class="even"><td class="entry"><img id="arr_0_" src="ftv2mnode.png" alt="o" width="16" height="22" onclick="toggleFolder('0_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><b>AbstractBasic</b></td><td class="desc"></td></tr>
+<tr id="row_0_0_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classRedBasicAuth.html" target="_self">RedBasicAuth</a></td><td class="desc"></td></tr>
+<tr id="row_1_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classApp.html" target="_self">App</a></td><td class="desc"></td></tr>
+<tr id="row_2_"><td class="entry"><img id="arr_2_" src="ftv2mnode.png" alt="o" width="16" height="22" onclick="toggleFolder('2_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classBaseObject.html" target="_self">BaseObject</a></td><td class="desc"></td></tr>
+<tr id="row_2_0_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classConversation.html" target="_self">Conversation</a></td><td class="desc"></td></tr>
+<tr id="row_2_1_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classItem.html" target="_self">Item</a></td><td class="desc"></td></tr>
+<tr id="row_3_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classCache.html" target="_self">Cache</a></td><td class="desc"></td></tr>
+<tr id="row_4_"><td class="entry"><img id="arr_4_" src="ftv2mnode.png" alt="o" width="16" height="22" onclick="toggleFolder('4_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classdba__driver.html" target="_self">dba_driver</a></td><td class="desc"></td></tr>
+<tr id="row_4_0_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classdba__mysql.html" target="_self">dba_mysql</a></td><td class="desc"></td></tr>
+<tr id="row_4_1_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classdba__mysqli.html" target="_self">dba_mysqli</a></td><td class="desc"></td></tr>
+<tr id="row_5_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classenotify.html" target="_self">enotify</a></td><td class="desc"></td></tr>
+<tr id="row_6_"><td class="entry"><img id="arr_6_" src="ftv2mnode.png" alt="o" width="16" height="22" onclick="toggleFolder('6_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><b>ICollection</b></td><td class="desc"></td></tr>
+<tr id="row_6_0_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classRedDirectory.html" target="_self">RedDirectory</a></td><td class="desc"></td></tr>
+<tr id="row_7_"><td class="entry"><img id="arr_7_" src="ftv2mnode.png" alt="o" width="16" height="22" onclick="toggleFolder('7_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><b>IFile</b></td><td class="desc"></td></tr>
+<tr id="row_7_0_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classRedFile.html" target="_self">RedFile</a></td><td class="desc"></td></tr>
+<tr id="row_8_"><td class="entry"><img id="arr_8_" src="ftv2mnode.png" alt="o" width="16" height="22" onclick="toggleFolder('8_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="interfaceITemplateEngine.html" target="_self">ITemplateEngine</a></td><td class="desc"></td></tr>
+<tr id="row_8_0_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classFriendicaSmartyEngine.html" target="_self">FriendicaSmartyEngine</a></td><td class="desc"></td></tr>
+<tr id="row_8_1_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classTemplate.html" target="_self">Template</a></td><td class="desc"></td></tr>
+<tr id="row_9_" class="even"><td class="entry"><img id="arr_9_" src="ftv2mnode.png" alt="o" width="16" height="22" onclick="toggleFolder('9_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><b>Node</b></td><td class="desc"></td></tr>
+<tr id="row_9_0_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classRedDirectory.html" target="_self">RedDirectory</a></td><td class="desc"></td></tr>
+<tr id="row_9_1_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classRedFile.html" target="_self">RedFile</a></td><td class="desc"></td></tr>
+<tr id="row_10_"><td class="entry"><img id="arr_10_" src="ftv2mnode.png" alt="o" width="16" height="22" onclick="toggleFolder('10_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><b>OAuthDataStore</b></td><td class="desc"></td></tr>
+<tr id="row_10_0_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classFKOAuthDataStore.html" target="_self">FKOAuthDataStore</a></td><td class="desc"></td></tr>
+<tr id="row_11_"><td class="entry"><img id="arr_11_" src="ftv2mnode.png" alt="o" width="16" height="22" onclick="toggleFolder('11_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><b>OAuthServer</b></td><td class="desc"></td></tr>
+<tr id="row_11_0_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classFKOAuth1.html" target="_self">FKOAuth1</a></td><td class="desc"></td></tr>
+<tr id="row_12_"><td class="entry"><img id="arr_12_" src="ftv2mnode.png" alt="o" width="16" height="22" onclick="toggleFolder('12_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classphoto__driver.html" target="_self">photo_driver</a></td><td class="desc"></td></tr>
+<tr id="row_12_0_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classphoto__gd.html" target="_self">photo_gd</a></td><td class="desc"></td></tr>
+<tr id="row_12_1_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classphoto__imagick.html" target="_self">photo_imagick</a></td><td class="desc"></td></tr>
+<tr id="row_13_" class="even"><td class="entry"><img id="arr_13_" src="ftv2mnode.png" alt="o" width="16" height="22" onclick="toggleFolder('13_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><b>Plugin</b></td><td class="desc"></td></tr>
+<tr id="row_13_0_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classRedBrowser.html" target="_self">RedBrowser</a></td><td class="desc"></td></tr>
+<tr id="row_14_" class="even"><td class="entry"><img id="arr_14_" src="ftv2mnode.png" alt="o" width="16" height="22" onclick="toggleFolder('14_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classProtoDriver.html" target="_self">ProtoDriver</a></td><td class="desc"></td></tr>
+<tr id="row_14_0_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classZotDriver.html" target="_self">ZotDriver</a></td><td class="desc"></td></tr>
+<tr id="row_15_" class="even"><td class="entry"><img id="arr_15_" src="ftv2mlastnode.png" alt="\" width="16" height="22" onclick="toggleFolder('15_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><b>Smarty</b></td><td class="desc"></td></tr>
+<tr id="row_15_0_"><td class="entry"><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classFriendicaSmarty.html" target="_self">FriendicaSmarty</a></td><td class="desc"></td></tr>
+</table>
+</div><!-- directory -->
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/hierarchy.js b/doc/html/hierarchy.js
new file mode 100644
index 000000000..1dde32375
--- /dev/null
+++ b/doc/html/hierarchy.js
@@ -0,0 +1,50 @@
+var hierarchy =
+[
+ [ "AbstractBasic", null, [
+ [ "RedBasicAuth", "classRedBasicAuth.html", null ]
+ ] ],
+ [ "App", "classApp.html", null ],
+ [ "BaseObject", "classBaseObject.html", [
+ [ "Conversation", "classConversation.html", null ],
+ [ "Item", "classItem.html", null ]
+ ] ],
+ [ "Cache", "classCache.html", null ],
+ [ "dba_driver", "classdba__driver.html", [
+ [ "dba_mysql", "classdba__mysql.html", null ],
+ [ "dba_mysqli", "classdba__mysqli.html", null ]
+ ] ],
+ [ "enotify", "classenotify.html", null ],
+ [ "ICollection", null, [
+ [ "RedDirectory", "classRedDirectory.html", null ]
+ ] ],
+ [ "IFile", null, [
+ [ "RedFile", "classRedFile.html", null ]
+ ] ],
+ [ "ITemplateEngine", "interfaceITemplateEngine.html", [
+ [ "FriendicaSmartyEngine", "classFriendicaSmartyEngine.html", null ],
+ [ "Template", "classTemplate.html", null ]
+ ] ],
+ [ "Node", null, [
+ [ "RedDirectory", "classRedDirectory.html", null ],
+ [ "RedFile", "classRedFile.html", null ]
+ ] ],
+ [ "OAuthDataStore", null, [
+ [ "FKOAuthDataStore", "classFKOAuthDataStore.html", null ]
+ ] ],
+ [ "OAuthServer", null, [
+ [ "FKOAuth1", "classFKOAuth1.html", null ]
+ ] ],
+ [ "photo_driver", "classphoto__driver.html", [
+ [ "photo_gd", "classphoto__gd.html", null ],
+ [ "photo_imagick", "classphoto__imagick.html", null ]
+ ] ],
+ [ "Plugin", null, [
+ [ "RedBrowser", "classRedBrowser.html", null ]
+ ] ],
+ [ "ProtoDriver", "classProtoDriver.html", [
+ [ "ZotDriver", "classZotDriver.html", null ]
+ ] ],
+ [ "Smarty", null, [
+ [ "FriendicaSmarty", "classFriendicaSmarty.html", null ]
+ ] ]
+]; \ No newline at end of file
diff --git a/doc/html/home_8php.html b/doc/html/home_8php.html
new file mode 100644
index 000000000..ec629b7c2
--- /dev/null
+++ b/doc/html/home_8php.html
@@ -0,0 +1,155 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/home.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('home_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">home.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ac4642c38b6f23a8d065dd4a75c620bde"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="home_8php.html#ac4642c38b6f23a8d065dd4a75c620bde">home_init</a> (&amp;$a)</td></tr>
+<tr class="separator:ac4642c38b6f23a8d065dd4a75c620bde"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa1cf697851a646755baf537f75334c46"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="home_8php.html#aa1cf697851a646755baf537f75334c46">home_content</a> (&amp;$a)</td></tr>
+<tr class="separator:aa1cf697851a646755baf537f75334c46"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="aa1cf697851a646755baf537f75334c46"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">home_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ac4642c38b6f23a8d065dd4a75c620bde"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">home_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/home_8php.js b/doc/html/home_8php.js
new file mode 100644
index 000000000..e4f6d5dc9
--- /dev/null
+++ b/doc/html/home_8php.js
@@ -0,0 +1,5 @@
+var home_8php =
+[
+ [ "home_content", "home_8php.html#aa1cf697851a646755baf537f75334c46", null ],
+ [ "home_init", "home_8php.html#ac4642c38b6f23a8d065dd4a75c620bde", null ]
+]; \ No newline at end of file
diff --git a/doc/html/hostxrd_8php.html b/doc/html/hostxrd_8php.html
new file mode 100644
index 000000000..fd11d46d4
--- /dev/null
+++ b/doc/html/hostxrd_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/hostxrd.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('hostxrd_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">hostxrd.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:aa37ffc8e7900bc76c4828bd25916db92"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="hostxrd_8php.html#aa37ffc8e7900bc76c4828bd25916db92">hostxrd_init</a> (&amp;$a)</td></tr>
+<tr class="separator:aa37ffc8e7900bc76c4828bd25916db92"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="aa37ffc8e7900bc76c4828bd25916db92"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">hostxrd_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/hostxrd_8php.js b/doc/html/hostxrd_8php.js
new file mode 100644
index 000000000..442e3dfac
--- /dev/null
+++ b/doc/html/hostxrd_8php.js
@@ -0,0 +1,4 @@
+var hostxrd_8php =
+[
+ [ "hostxrd_init", "hostxrd_8php.html#aa37ffc8e7900bc76c4828bd25916db92", null ]
+]; \ No newline at end of file
diff --git a/doc/html/html2bbcode_8php.html b/doc/html/html2bbcode_8php.html
new file mode 100644
index 000000000..9c8651b9a
--- /dev/null
+++ b/doc/html/html2bbcode_8php.html
@@ -0,0 +1,265 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/html2bbcode.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('html2bbcode_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">html2bbcode.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ad174afe0ccbd8c475e48f8a6ee2f27d8"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="html2bbcode_8php.html#ad174afe0ccbd8c475e48f8a6ee2f27d8">node2bbcode</a> (&amp;$doc, $oldnode, $attributes, $startbb, $endbb)</td></tr>
+<tr class="separator:ad174afe0ccbd8c475e48f8a6ee2f27d8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a39c662b19d318990fee2ba795a55d7a7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="html2bbcode_8php.html#a39c662b19d318990fee2ba795a55d7a7">node2bbcodesub</a> (&amp;$doc, $oldnode, $attributes, $startbb, $endbb)</td></tr>
+<tr class="separator:a39c662b19d318990fee2ba795a55d7a7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a71a07f135d196ec5943b13f7b2e6a9b2"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="html2bbcode_8php.html#a71a07f135d196ec5943b13f7b2e6a9b2">deletenode</a> (&amp;$doc, $node)</td></tr>
+<tr class="separator:a71a07f135d196ec5943b13f7b2e6a9b2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5ad726995ac4070213abdb3bd09f4837"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="html2bbcode_8php.html#a5ad726995ac4070213abdb3bd09f4837">html2bbcode</a> ($message)</td></tr>
+<tr class="separator:a5ad726995ac4070213abdb3bd09f4837"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a71a07f135d196ec5943b13f7b2e6a9b2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">deletenode </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$doc</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$node</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="html2bbcode_8php.html#a5ad726995ac4070213abdb3bd09f4837">html2bbcode()</a>, and <a class="el" href="parse__url_8php.html#a25635549f2c22955d72465f4d2e58993">parseurl_getsiteinfo()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a5ad726995ac4070213abdb3bd09f4837"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">html2bbcode </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$message</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#a450d8732b7b608f7ac929aee61572b95">api_statuses_mediap()</a>, <a class="el" href="include_2api_8php.html#ad4d1634df6b35126552324683caaffa2">api_statuses_update()</a>, <a class="el" href="bb2diaspora_8php.html#a26c09c218413610e62e60754c579f6c6">diaspora2bb()</a>, <a class="el" href="items_8php.html#a896c1809d58f2d7a42cfe14577958ddf">get_atom_elements()</a>, and <a class="el" href="rpost_8php.html#a8190354d789000806d9879aea276728f">rpost_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ad174afe0ccbd8c475e48f8a6ee2f27d8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">node2bbcode </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$doc</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$oldnode</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$attributes</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$startbb</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$endbb</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="html2bbcode_8php.html#a5ad726995ac4070213abdb3bd09f4837">html2bbcode()</a>, and <a class="el" href="html2plain_8php.html#ab3e121fa9f3feb16f9f942e705bc6c04">html2plain()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a39c662b19d318990fee2ba795a55d7a7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">node2bbcodesub </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$doc</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$oldnode</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$attributes</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$startbb</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$endbb</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="html2bbcode_8php.html#ad174afe0ccbd8c475e48f8a6ee2f27d8">node2bbcode()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/html2bbcode_8php.js b/doc/html/html2bbcode_8php.js
new file mode 100644
index 000000000..18f333bc5
--- /dev/null
+++ b/doc/html/html2bbcode_8php.js
@@ -0,0 +1,7 @@
+var html2bbcode_8php =
+[
+ [ "deletenode", "html2bbcode_8php.html#a71a07f135d196ec5943b13f7b2e6a9b2", null ],
+ [ "html2bbcode", "html2bbcode_8php.html#a5ad726995ac4070213abdb3bd09f4837", null ],
+ [ "node2bbcode", "html2bbcode_8php.html#ad174afe0ccbd8c475e48f8a6ee2f27d8", null ],
+ [ "node2bbcodesub", "html2bbcode_8php.html#a39c662b19d318990fee2ba795a55d7a7", null ]
+]; \ No newline at end of file
diff --git a/doc/html/html2plain_8php.html b/doc/html/html2plain_8php.html
new file mode 100644
index 000000000..bf8dd4f1e
--- /dev/null
+++ b/doc/html/html2plain_8php.html
@@ -0,0 +1,241 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/html2plain.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('html2plain_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">html2plain.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a3214912e3d00cf0a948072daccf16740"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="html2plain_8php.html#a3214912e3d00cf0a948072daccf16740">breaklines</a> ($line, $level, $wraplength=75)</td></tr>
+<tr class="separator:a3214912e3d00cf0a948072daccf16740"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a56d29b254333d29abb9d96a9a903a4b0"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="html2plain_8php.html#a56d29b254333d29abb9d96a9a903a4b0">quotelevel</a> ($message, $wraplength=75)</td></tr>
+<tr class="separator:a56d29b254333d29abb9d96a9a903a4b0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae1c203d0f089d5678d73a6c64a395201"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="html2plain_8php.html#ae1c203d0f089d5678d73a6c64a395201">collecturls</a> ($message)</td></tr>
+<tr class="separator:ae1c203d0f089d5678d73a6c64a395201"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab3e121fa9f3feb16f9f942e705bc6c04"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="html2plain_8php.html#ab3e121fa9f3feb16f9f942e705bc6c04">html2plain</a> ($html, $wraplength=75, $compact=false)</td></tr>
+<tr class="separator:ab3e121fa9f3feb16f9f942e705bc6c04"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a3214912e3d00cf0a948072daccf16740"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">breaklines </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$line</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$level</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$wraplength</em> = <code>75</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="html2plain_8php.html#a56d29b254333d29abb9d96a9a903a4b0">quotelevel()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ae1c203d0f089d5678d73a6c64a395201"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">collecturls </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$message</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="html2plain_8php.html#ab3e121fa9f3feb16f9f942e705bc6c04">html2plain()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ab3e121fa9f3feb16f9f942e705bc6c04"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">html2plain </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$html</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$wraplength</em> = <code>75</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$compact</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#a4c6fb9fb5203aa60f4b3afd4521db8ea">api_format_items()</a>, <a class="el" href="include_2api_8php.html#ae82608c317421f27446465aa6724733d">api_format_messages()</a>, <a class="el" href="include_2api_8php.html#a645397787618b5c548a31e8686e8cca4">api_status_show()</a>, <a class="el" href="include_2api_8php.html#abe8e929e93f7ab134b1cb1fb30f19a76">api_users_show()</a>, <a class="el" href="items_8php.html#a87ac9e359591721a824ecd23bbb56296">check_item_source()</a>, and <a class="el" href="include_2network_8php.html#a1ff07d9fad93b713b93da0ab77aab7f0">email_send()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a56d29b254333d29abb9d96a9a903a4b0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">quotelevel </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$message</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$wraplength</em> = <code>75</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="html2plain_8php.html#ab3e121fa9f3feb16f9f942e705bc6c04">html2plain()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/html2plain_8php.js b/doc/html/html2plain_8php.js
new file mode 100644
index 000000000..377ba004e
--- /dev/null
+++ b/doc/html/html2plain_8php.js
@@ -0,0 +1,7 @@
+var html2plain_8php =
+[
+ [ "breaklines", "html2plain_8php.html#a3214912e3d00cf0a948072daccf16740", null ],
+ [ "collecturls", "html2plain_8php.html#ae1c203d0f089d5678d73a6c64a395201", null ],
+ [ "html2plain", "html2plain_8php.html#ab3e121fa9f3feb16f9f942e705bc6c04", null ],
+ [ "quotelevel", "html2plain_8php.html#a56d29b254333d29abb9d96a9a903a4b0", null ]
+]; \ No newline at end of file
diff --git a/doc/html/identity_8php.html b/doc/html/identity_8php.html
new file mode 100644
index 000000000..c00a3e77b
--- /dev/null
+++ b/doc/html/identity_8php.html
@@ -0,0 +1,704 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/identity.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('identity_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">identity.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ac9fcd5c4c371998790b5c55c3d0f4633"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="identity_8php.html#ac9fcd5c4c371998790b5c55c3d0f4633">identity_check_service_class</a> ($account_id)</td></tr>
+<tr class="separator:ac9fcd5c4c371998790b5c55c3d0f4633"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af2802bc13a00a17b867bba7978ba8f58"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="identity_8php.html#af2802bc13a00a17b867bba7978ba8f58">validate_channelname</a> ($name)</td></tr>
+<tr class="separator:af2802bc13a00a17b867bba7978ba8f58"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1cf83ac2b645de12868edaa3a5718f05"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="identity_8php.html#a1cf83ac2b645de12868edaa3a5718f05">create_sys_channel</a> ()</td></tr>
+<tr class="separator:a1cf83ac2b645de12868edaa3a5718f05"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aaff86ee3b5984821e7a256c2da5f1a51"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="identity_8php.html#aaff86ee3b5984821e7a256c2da5f1a51">get_sys_channel</a> ()</td></tr>
+<tr class="separator:aaff86ee3b5984821e7a256c2da5f1a51"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a77d2237f1846964634b1c99089c27c7d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="identity_8php.html#a77d2237f1846964634b1c99089c27c7d">channel_total</a> ()</td></tr>
+<tr class="separator:a77d2237f1846964634b1c99089c27c7d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a345f4c943d84de502ec6e72d2c813945"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="identity_8php.html#a345f4c943d84de502ec6e72d2c813945">create_identity</a> ($arr)</td></tr>
+<tr class="separator:a345f4c943d84de502ec6e72d2c813945"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a78151baf4407a8482d2681a91a9c486b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="identity_8php.html#a78151baf4407a8482d2681a91a9c486b">set_default_login_identity</a> ($account_id, $channel_id, $force=true)</td></tr>
+<tr class="separator:a78151baf4407a8482d2681a91a9c486b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3570a4eb77332b292d394c4132cb8f03"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="identity_8php.html#a3570a4eb77332b292d394c4132cb8f03">identity_basic_export</a> ($channel_id)</td></tr>
+<tr class="separator:a3570a4eb77332b292d394c4132cb8f03"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4751b522ea913d0e7ed43e03d22e9e68"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="identity_8php.html#a4751b522ea913d0e7ed43e03d22e9e68">profile_load</a> (&amp;$a, $nickname, $profile= '')</td></tr>
+<tr class="separator:a4751b522ea913d0e7ed43e03d22e9e68"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad4a2c8caca8f6ae93633ebeca0ed6620"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="identity_8php.html#ad4a2c8caca8f6ae93633ebeca0ed6620">profile_create_sidebar</a> (&amp;$a, $connect=true)</td></tr>
+<tr class="separator:ad4a2c8caca8f6ae93633ebeca0ed6620"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a432259b2cf5b6f59be53e71db9f2c7dc"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="identity_8php.html#a432259b2cf5b6f59be53e71db9f2c7dc">profile_sidebar</a> ($profile, $block=0, $show_connect=true)</td></tr>
+<tr class="separator:a432259b2cf5b6f59be53e71db9f2c7dc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad2c97627a313d53df1a1c7b4215ddb51"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="identity_8php.html#ad2c97627a313d53df1a1c7b4215ddb51">get_birthdays</a> ()</td></tr>
+<tr class="separator:ad2c97627a313d53df1a1c7b4215ddb51"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae381db3d43f8e7c1da8b15d14ecf5312"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="identity_8php.html#ae381db3d43f8e7c1da8b15d14ecf5312">get_events</a> ()</td></tr>
+<tr class="separator:ae381db3d43f8e7c1da8b15d14ecf5312"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa870d2c1f558cfd52bef05bc124e8fa4"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="identity_8php.html#aa870d2c1f558cfd52bef05bc124e8fa4">advanced_profile</a> (&amp;$a)</td></tr>
+<tr class="separator:aa870d2c1f558cfd52bef05bc124e8fa4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa46321e1cd6a3b8dfde8bf9510112fec"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="identity_8php.html#aa46321e1cd6a3b8dfde8bf9510112fec">get_my_url</a> ()</td></tr>
+<tr class="separator:aa46321e1cd6a3b8dfde8bf9510112fec"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a490972c02fdb638c52ec0e012a30bfd2"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="identity_8php.html#a490972c02fdb638c52ec0e012a30bfd2">get_my_address</a> ()</td></tr>
+<tr class="separator:a490972c02fdb638c52ec0e012a30bfd2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a680fbafc2db023c5b1309e0180e81315"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="identity_8php.html#a680fbafc2db023c5b1309e0180e81315">zid_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a680fbafc2db023c5b1309e0180e81315"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5b815330f3d177ab383af37a6c12e532"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="identity_8php.html#a5b815330f3d177ab383af37a6c12e532">zid</a> ($s, $address= '')</td></tr>
+<tr class="separator:a5b815330f3d177ab383af37a6c12e532"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aaeb666872995e3ab8da8f7bc5f3b2bd3"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="identity_8php.html#aaeb666872995e3ab8da8f7bc5f3b2bd3">get_theme_uid</a> ()</td></tr>
+<tr class="separator:aaeb666872995e3ab8da8f7bc5f3b2bd3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab1485a26b032956e1496fc08c58b83ed"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="identity_8php.html#ab1485a26b032956e1496fc08c58b83ed">get_default_profile_photo</a> ($size=175)</td></tr>
+<tr class="separator:ab1485a26b032956e1496fc08c58b83ed"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae2b140df652a55ca11bb6a99005fce35"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="identity_8php.html#ae2b140df652a55ca11bb6a99005fce35">is_foreigner</a> ($s)</td></tr>
+<tr class="separator:ae2b140df652a55ca11bb6a99005fce35"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9637c557e13d9671f3eeb124ab98212a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="identity_8php.html#a9637c557e13d9671f3eeb124ab98212a">is_member</a> ($s)</td></tr>
+<tr class="separator:a9637c557e13d9671f3eeb124ab98212a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="aa870d2c1f558cfd52bef05bc124e8fa4"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">advanced_profile </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="profile_8php.html#a3775cf6eef6587e5143133356a7b76c0">profile_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a77d2237f1846964634b1c99089c27c7d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">channel_total </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>() Return the total number of channels on this site. No filtering is performed.</p>
+<dl class="section return"><dt>Returns</dt><dd>int on error returns boolean false </dd></dl>
+
+<p>Referenced by <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a345f4c943d84de502ec6e72d2c813945"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">create_identity </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>create_identity($arr) Create a new channel Also creates the related xchan, hubloc, profile, and "self" abook records, and an empty "Friends" group/collection for the new channel</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype">array</td><td class="paramname">$arr</td><td>'name' =&gt; full name of channel 'nickname' =&gt; "email/url-compliant" nickname 'account_id' =&gt; account_id to attach with this channel [other identity fields as desired]</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>array 'success' =&gt; boolean true or false 'message' =&gt; optional error text if success is false 'channel' =&gt; if successful the created channel array </dd></dl>
+
+<p>Referenced by <a class="el" href="identity_8php.html#a1cf83ac2b645de12868edaa3a5718f05">create_sys_channel()</a>, and <a class="el" href="new__channel_8php.html#a180b0646957db8290482f02454ad7f23">new_channel_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a1cf83ac2b645de12868edaa3a5718f05"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">create_sys_channel </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p><a class="el" href="identity_8php.html#a1cf83ac2b645de12868edaa3a5718f05">create_sys_channel()</a> Create a system channel - which has no account attached </p>
+
+</div>
+</div>
+<a class="anchor" id="ad2c97627a313d53df1a1c7b4215ddb51"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_birthdays </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ab1485a26b032956e1496fc08c58b83ed"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_default_profile_photo </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$size</em> = <code>175</code></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>get_default_profile_photo($size = 175) Retrieves the path of the default_profile_photo for this system with the specified size. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype">int</td><td class="paramname">$size</td><td>one of (175, 80, 48) </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>string </dd></dl>
+
+<p>Referenced by <a class="el" href="include_2network_8php.html#ab07ce9d75eae559865ed90aad2154bd7">avatar_img()</a>, <a class="el" href="photo__driver_8php.html#a78f5a10c568d2a9bbbb129dc96548887">import_profile_photo()</a>, and <a class="el" href="photo_8php.html#a582779d24882b0d31ee909a91d70a448">photo_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ae381db3d43f8e7c1da8b15d14ecf5312"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_events </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a490972c02fdb638c52ec0e012a30bfd2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_my_address </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classApp.html#a08f0537964d98958d218066364cff785">App\build_pagehead()</a>, <a class="el" href="rmagic_8php.html#a95455edd43f1bff39446a57388cdde16">rmagic_init()</a>, <a class="el" href="identity_8php.html#a5b815330f3d177ab383af37a6c12e532">zid()</a>, and <a class="el" href="identity_8php.html#a680fbafc2db023c5b1309e0180e81315">zid_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa46321e1cd6a3b8dfde8bf9510112fec"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_my_url </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="nav_8php.html#a43be0df73b90647ea70947ce004e231e">nav()</a>, and <a class="el" href="identity_8php.html#a5b815330f3d177ab383af37a6c12e532">zid()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aaff86ee3b5984821e7a256c2da5f1a51"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_sys_channel </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="identity_8php.html#a1cf83ac2b645de12868edaa3a5718f05">create_sys_channel()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aaeb666872995e3ab8da8f7bc5f3b2bd3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_theme_uid </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a3570a4eb77332b292d394c4132cb8f03"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">identity_basic_export </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel_id</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>identity_basic_export($channel_id) Create an array representing the important channel information which would be necessary to create a nomadic identity clone. This includes most channel resources and connection information with the exception of content.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype">int</td><td class="paramname">$channel_id</td><td>Channel_id to export</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>array See function for details </dd></dl>
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#adfc035ee6303c1d8ba5336a4ead2bd53">api_export_basic()</a>, and <a class="el" href="uexport_8php.html#a118920137dedebe0581623a2e57e7b0d">uexport_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ac9fcd5c4c371998790b5c55c3d0f4633"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">identity_check_service_class </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$account_id</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>identity_check_service_class($account_id) Called when creating a new channel. Checks the account's service class and number of current channels to determine whether creating a new channel is within the current service class constraints.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype">int</td><td class="paramname">$account_id</td><td>Account_id used for this request</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>array 'success' =&gt; boolean true if creating a new channel is allowed for this account 'message' =&gt; if success is false, optional error text </dd></dl>
+
+<p>Referenced by <a class="el" href="identity_8php.html#a345f4c943d84de502ec6e72d2c813945">create_identity()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ae2b140df652a55ca11bb6a99005fce35"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">is_foreigner </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>is_foreigner($s) Test whether a given identity is NOT a member of the Red Matrix </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype">string</td><td class="paramname">$s,;</td><td>xchan_hash of the identity in question</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>boolean true or false </dd></dl>
+
+<p>Referenced by <a class="el" href="chanview_8php.html#a4192c6da888c8c1165851acf9ad4cb8b">chanview_content()</a>, and <a class="el" href="identity_8php.html#a9637c557e13d9671f3eeb124ab98212a">is_member()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a9637c557e13d9671f3eeb124ab98212a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">is_member </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>is_member($s) Test whether a given identity is a member of the Red Matrix </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype">string</td><td class="paramname">$s,;</td><td>xchan_hash of the identity in question</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>boolean true or false </dd></dl>
+
+</div>
+</div>
+<a class="anchor" id="ad4a2c8caca8f6ae93633ebeca0ed6620"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">profile_create_sidebar </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$connect</em> = <code>true</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a4751b522ea913d0e7ed43e03d22e9e68"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">profile_load </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$nickname</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$profile</em> = <code>''</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>: profile_load(&amp;$a, $nickname, $profile) Generate </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype"><a class="el" href="classApp.html">App</a></td><td class="paramname">$a</td><td></td></tr>
+ <tr><td class="paramtype">string</td><td class="paramname">$nickname</td><td></td></tr>
+ <tr><td class="paramtype">string</td><td class="paramname">$profile</td><td>Summary: Loads a profile into the <a class="el" href="classApp.html">App</a> structure. The function requires a writeable copy of the main <a class="el" href="classApp.html">App</a> structure, and the nickname of a valid channel.</td></tr>
+ </table>
+ </dd>
+</dl>
+<p>Permissions of the current observer are checked. If a restricted profile is available to the current observer, that will be loaded instead of the channel default profile.</p>
+<p>The channel owner can set $profile to a valid profile_guid to preview that profile.</p>
+<p>The channel default theme is also selected for use, unless over-riden elsewhere. </p>
+<p>load/reload current theme info</p>
+
+<p>Referenced by <a class="el" href="achievements_8php.html#a35ae04ada0e227d19671f289a32fb30e">achievements_content()</a>, <a class="el" href="blocks_8php.html#a2531a8fd51db3cecb2eb20c002c66e12">blocks_content()</a>, <a class="el" href="channel_8php.html#ac7c8c7845741baadf87fae6bc279f3dc">channel_init()</a>, <a class="el" href="cloud_8php.html#a1b79a6fe0454bc76673ad9aef55bf02d">cloud_init()</a>, <a class="el" href="common_8php.html#aca62f113655809f41f49042ce9b123c2">common_init()</a>, <a class="el" href="connect_8php.html#ad46a38f32fd7a3d324b1fa26373efa36">connect_init()</a>, <a class="el" href="layouts_8php.html#a6e0193759ad9eef76d3df2db24237b50">layouts_content()</a>, <a class="el" href="page_8php.html#a4d89800c0366a239191b1692c09635cf">page_init()</a>, <a class="el" href="mod_2photos_8php.html#ab950295cd77626f5fe65331a87693014">photos_init()</a>, <a class="el" href="profile_8php.html#ab5d0246be0552e2182a585c1206d22a5">profile_init()</a>, <a class="el" href="profile__photo_8php.html#a140631c56438fbfacb61a1eb43067d02">profile_photo_init()</a>, <a class="el" href="profiles_8php.html#a36f71405ad536228f8bb84a551b23f7e">profiles_init()</a>, <a class="el" href="profperm_8php.html#a17fb64ec05edee1dc94d95438807d6c6">profperm_init()</a>, <a class="el" href="viewconnections_8php.html#a00163d50b17568f7b0e48b1ca9ab7330">viewconnections_init()</a>, and <a class="el" href="webpages_8php.html#af3b7397d4abc153e3d2147740ee1a41d">webpages_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a432259b2cf5b6f59be53e71db9f2c7dc"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">profile_sidebar </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$profile</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$block</em> = <code>0</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$show_connect</em> = <code>true</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Function: profile_sidebar</p>
+<p>Formats a profile for display in the sidebar. It is very difficult to templatise the HTML completely because of all the conditional logic.</p>
+<p>: array $profile</p>
+<p>Returns HTML string stuitable for sidebar inclusion Exceptions: Returns empty string if passed $profile is wrong type or not populated </p>
+
+<p>Referenced by <a class="el" href="identity_8php.html#ad4a2c8caca8f6ae93633ebeca0ed6620">profile_create_sidebar()</a>, <a class="el" href="widgets_8php.html#a70442dfa079312d9d5e5ee01be51a165">widget_fullprofile()</a>, and <a class="el" href="widgets_8php.html#abd2e508a2a0b911c4a838e3cb7599923">widget_profile()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a78151baf4407a8482d2681a91a9c486b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">set_default_login_identity </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$account_id</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel_id</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$force</em> = <code>true</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>set_default_login_identity($account_id, $channel_id, $force = true) Set default channel to be used on login</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype">int</td><td class="paramname">$account_id</td><td>login account </td></tr>
+ <tr><td class="paramtype">int</td><td class="paramname">$channel_id</td><td>channel id to set as default for this account </td></tr>
+ <tr><td class="paramtype"></td><td class="paramname">boolean</td><td>force if true, set this default unconditionally if $force is false only do this if there is no existing default</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>nil </dd></dl>
+
+<p>Referenced by <a class="el" href="identity_8php.html#a345f4c943d84de502ec6e72d2c813945">create_identity()</a>, and <a class="el" href="import_8php.html#af17fef0410518f7eac205d0ea416eaa2">import_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="af2802bc13a00a17b867bba7978ba8f58"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">validate_channelname </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$name</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>validate_channelname($name) Determine if the channel name is allowed when creating a new channel. This action is pluggable.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype">string</td><td class="paramname">$name</td><td></td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>nil return if name is valid, or string describing the error state.</dd></dl>
+<p>We're currently only checking for an empty name or one that exceeds our storage limit (255 chars). 255 chars is probably going to create a mess on some pages. Plugins can set additional policies such as full name requirements, character sets, multi-byte length, etc. </p>
+
+<p>Referenced by <a class="el" href="identity_8php.html#a345f4c943d84de502ec6e72d2c813945">create_identity()</a>, and <a class="el" href="settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586">settings_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a5b815330f3d177ab383af37a6c12e532"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">zid </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$address</em> = <code>''</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>zid($s,$address = '') Adds a zid parameter to a url </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype">string</td><td class="paramname">$s</td><td>The url to accept the zid </td></tr>
+ <tr><td class="paramtype">boolean</td><td class="paramname">$address</td><td>$address to use instead of session environment </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>string</dd></dl>
+<p>'zid' string url - url to accept zid string zid - urlencoded zid string result - the return string we calculated, change it if you want to return something else </p>
+
+<p>Referenced by <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation()</a>, <a class="el" href="dirprofile_8php.html#a3e1d30d3d93863ff5615f2df4ac7f052">dirprofile_init()</a>, <a class="el" href="text_8php.html#a3054189cff173977f4216c9a3dd29e1b">format_categories()</a>, <a class="el" href="text_8php.html#aac0969ae09853205992ba06ab9f9f61a">get_plink()</a>, <a class="el" href="conversation_8php.html#afe5b2f38d8b803edb0d7ec5fa2868db0">like_puller()</a>, <a class="el" href="conversation_8php.html#a9bd7f9fb6678736c581bcba3b17f471c">localize_item()</a>, <a class="el" href="match_8php.html#a1dd853e959b9e70c1911bb2fb5f5130d">match_content()</a>, <a class="el" href="include_2menu_8php.html#a890cc6237971e15f15702e6b2e88502e">menu_render()</a>, <a class="el" href="include_2follow_8php.html#ae387d4ae097c23d69f3247e7f08140c7">new_contact()</a>, and <a class="el" href="viewconnections_8php.html#ab6c4d983e97b3a8a879567ff76507776">viewconnections_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a680fbafc2db023c5b1309e0180e81315"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">zid_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>zid_init(&amp;$a) If somebody arrives at our site using a zid, add their xchan to our DB if we don't have it already. And if they aren't already authenticated here, attempt reverse magic auth.</p>
+<p>'zid_init' string 'zid' - their zid string 'url' - the destination url </p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/identity_8php.js b/doc/html/identity_8php.js
new file mode 100644
index 000000000..873f46450
--- /dev/null
+++ b/doc/html/identity_8php.js
@@ -0,0 +1,25 @@
+var identity_8php =
+[
+ [ "advanced_profile", "identity_8php.html#aa870d2c1f558cfd52bef05bc124e8fa4", null ],
+ [ "channel_total", "identity_8php.html#a77d2237f1846964634b1c99089c27c7d", null ],
+ [ "create_identity", "identity_8php.html#a345f4c943d84de502ec6e72d2c813945", null ],
+ [ "create_sys_channel", "identity_8php.html#a1cf83ac2b645de12868edaa3a5718f05", null ],
+ [ "get_birthdays", "identity_8php.html#ad2c97627a313d53df1a1c7b4215ddb51", null ],
+ [ "get_default_profile_photo", "identity_8php.html#ab1485a26b032956e1496fc08c58b83ed", null ],
+ [ "get_events", "identity_8php.html#ae381db3d43f8e7c1da8b15d14ecf5312", null ],
+ [ "get_my_address", "identity_8php.html#a490972c02fdb638c52ec0e012a30bfd2", null ],
+ [ "get_my_url", "identity_8php.html#aa46321e1cd6a3b8dfde8bf9510112fec", null ],
+ [ "get_sys_channel", "identity_8php.html#aaff86ee3b5984821e7a256c2da5f1a51", null ],
+ [ "get_theme_uid", "identity_8php.html#aaeb666872995e3ab8da8f7bc5f3b2bd3", null ],
+ [ "identity_basic_export", "identity_8php.html#a3570a4eb77332b292d394c4132cb8f03", null ],
+ [ "identity_check_service_class", "identity_8php.html#ac9fcd5c4c371998790b5c55c3d0f4633", null ],
+ [ "is_foreigner", "identity_8php.html#ae2b140df652a55ca11bb6a99005fce35", null ],
+ [ "is_member", "identity_8php.html#a9637c557e13d9671f3eeb124ab98212a", null ],
+ [ "profile_create_sidebar", "identity_8php.html#ad4a2c8caca8f6ae93633ebeca0ed6620", null ],
+ [ "profile_load", "identity_8php.html#a4751b522ea913d0e7ed43e03d22e9e68", null ],
+ [ "profile_sidebar", "identity_8php.html#a432259b2cf5b6f59be53e71db9f2c7dc", null ],
+ [ "set_default_login_identity", "identity_8php.html#a78151baf4407a8482d2681a91a9c486b", null ],
+ [ "validate_channelname", "identity_8php.html#af2802bc13a00a17b867bba7978ba8f58", null ],
+ [ "zid", "identity_8php.html#a5b815330f3d177ab383af37a6c12e532", null ],
+ [ "zid_init", "identity_8php.html#a680fbafc2db023c5b1309e0180e81315", null ]
+]; \ No newline at end of file
diff --git a/doc/html/import_8php.html b/doc/html/import_8php.html
new file mode 100644
index 000000000..9d9d05950
--- /dev/null
+++ b/doc/html/import_8php.html
@@ -0,0 +1,155 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/import.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('import_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">import.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:af17fef0410518f7eac205d0ea416eaa2"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="import_8php.html#af17fef0410518f7eac205d0ea416eaa2">import_post</a> (&amp;$a)</td></tr>
+<tr class="separator:af17fef0410518f7eac205d0ea416eaa2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afdf25ed70096d5dbf4f6d0ca79fea184"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="import_8php.html#afdf25ed70096d5dbf4f6d0ca79fea184">import_content</a> (&amp;$a)</td></tr>
+<tr class="separator:afdf25ed70096d5dbf4f6d0ca79fea184"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="afdf25ed70096d5dbf4f6d0ca79fea184"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">import_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="af17fef0410518f7eac205d0ea416eaa2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">import_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/import_8php.js b/doc/html/import_8php.js
new file mode 100644
index 000000000..906bce463
--- /dev/null
+++ b/doc/html/import_8php.js
@@ -0,0 +1,5 @@
+var import_8php =
+[
+ [ "import_content", "import_8php.html#afdf25ed70096d5dbf4f6d0ca79fea184", null ],
+ [ "import_post", "import_8php.html#af17fef0410518f7eac205d0ea416eaa2", null ]
+]; \ No newline at end of file
diff --git a/doc/html/include_2api_8php.html b/doc/html/include_2api_8php.html
new file mode 100644
index 000000000..5a1460ab8
--- /dev/null
+++ b/doc/html/include_2api_8php.html
@@ -0,0 +1,1597 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/api.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('include_2api_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> &#124;
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle">
+<div class="title">api.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:afb99daa6b731bf497b81f2128084852c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#afb99daa6b731bf497b81f2128084852c">api_user</a> ()</td></tr>
+<tr class="separator:afb99daa6b731bf497b81f2128084852c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aea2dda92a155f2843a0ca188d8dfdf25"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#aea2dda92a155f2843a0ca188d8dfdf25">api_date</a> ($str)</td></tr>
+<tr class="separator:aea2dda92a155f2843a0ca188d8dfdf25"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac2c2b18c426d697d11a830bca146be8a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#ac2c2b18c426d697d11a830bca146be8a">api_register_func</a> ($path, $func, $auth=false)</td></tr>
+<tr class="separator:ac2c2b18c426d697d11a830bca146be8a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afe534f826e4282b72d66e8cadca7bb73"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#afe534f826e4282b72d66e8cadca7bb73">api_login</a> (&amp;$a)</td></tr>
+<tr class="separator:afe534f826e4282b72d66e8cadca7bb73"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a176c448d79c211ad41c2bbe3124658f5"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#a176c448d79c211ad41c2bbe3124658f5">api_call</a> (&amp;$a)</td></tr>
+<tr class="separator:a176c448d79c211ad41c2bbe3124658f5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6a04b48168ba1d9dd2de3081a630611f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#a6a04b48168ba1d9dd2de3081a630611f">api_rss_extra</a> (&amp;$a, $arr, $user_info)</td></tr>
+<tr class="separator:a6a04b48168ba1d9dd2de3081a630611f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa40bae797bcd9ccacffdce5a3b5a1afa"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#aa40bae797bcd9ccacffdce5a3b5a1afa">api_get_user</a> (&amp;$a, $contact_id=Null)</td></tr>
+<tr class="separator:aa40bae797bcd9ccacffdce5a3b5a1afa"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa49741342ad8ba285737eea1209a37e1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#aa49741342ad8ba285737eea1209a37e1">api_item_get_user</a> (&amp;$a, $item)</td></tr>
+<tr class="separator:aa49741342ad8ba285737eea1209a37e1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5990101034e7abf6404feba3cd273629"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#a5990101034e7abf6404feba3cd273629">api_apply_template</a> ($templatename, $type, $data)</td></tr>
+<tr class="separator:a5990101034e7abf6404feba3cd273629"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a864191bb876a515ed71b17e260ef35ad"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#a864191bb876a515ed71b17e260ef35ad">api_account_verify_credentials</a> (&amp;$a, $type)</td></tr>
+<tr class="separator:a864191bb876a515ed71b17e260ef35ad"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2e94eab9d6c164bfef7a1b2ab87b339b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#a2e94eab9d6c164bfef7a1b2ab87b339b">api_account_logout</a> (&amp;$a, $type)</td></tr>
+<tr class="separator:a2e94eab9d6c164bfef7a1b2ab87b339b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a43c47de8565cc00c3369cb35c19cc75e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#a43c47de8565cc00c3369cb35c19cc75e">requestdata</a> ($k)</td></tr>
+<tr class="separator:a43c47de8565cc00c3369cb35c19cc75e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:adfc035ee6303c1d8ba5336a4ead2bd53"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#adfc035ee6303c1d8ba5336a4ead2bd53">api_export_basic</a> (&amp;$a, $type)</td></tr>
+<tr class="separator:adfc035ee6303c1d8ba5336a4ead2bd53"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a72bfecac1970bc29b853073e816388ff"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#a72bfecac1970bc29b853073e816388ff">api_channel_stream</a> (&amp;$a, $type)</td></tr>
+<tr class="separator:a72bfecac1970bc29b853073e816388ff"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa9dc5350b26d6c7727d6c4b641ecba18"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#aa9dc5350b26d6c7727d6c4b641ecba18">api_albums</a> (&amp;$a, $type)</td></tr>
+<tr class="separator:aa9dc5350b26d6c7727d6c4b641ecba18"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa6fc3bc8c0fad1d081db0dcc456dd77f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#aa6fc3bc8c0fad1d081db0dcc456dd77f">api_photos</a> (&amp;$a, $type)</td></tr>
+<tr class="separator:aa6fc3bc8c0fad1d081db0dcc456dd77f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a450d8732b7b608f7ac929aee61572b95"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#a450d8732b7b608f7ac929aee61572b95">api_statuses_mediap</a> (&amp;$a, $type)</td></tr>
+<tr class="separator:a450d8732b7b608f7ac929aee61572b95"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad4d1634df6b35126552324683caaffa2"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#ad4d1634df6b35126552324683caaffa2">api_statuses_update</a> (&amp;$a, $type)</td></tr>
+<tr class="separator:ad4d1634df6b35126552324683caaffa2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a645397787618b5c548a31e8686e8cca4"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#a645397787618b5c548a31e8686e8cca4">api_status_show</a> (&amp;$a, $type)</td></tr>
+<tr class="separator:a645397787618b5c548a31e8686e8cca4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abe8e929e93f7ab134b1cb1fb30f19a76"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#abe8e929e93f7ab134b1cb1fb30f19a76">api_users_show</a> (&amp;$a, $type)</td></tr>
+<tr class="separator:abe8e929e93f7ab134b1cb1fb30f19a76"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a528d8070ee74ea800102936ce73cf366"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#a528d8070ee74ea800102936ce73cf366">api_statuses_home_timeline</a> (&amp;$a, $type)</td></tr>
+<tr class="separator:a528d8070ee74ea800102936ce73cf366"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad24ce1bf20867add4c9211a8eaf93f22"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#ad24ce1bf20867add4c9211a8eaf93f22">api_statuses_public_timeline</a> (&amp;$a, $type)</td></tr>
+<tr class="separator:ad24ce1bf20867add4c9211a8eaf93f22"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af6f1d89cdb0a0621025efbec1597bc63"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#af6f1d89cdb0a0621025efbec1597bc63">api_statuses_show</a> (&amp;$a, $type)</td></tr>
+<tr class="separator:af6f1d89cdb0a0621025efbec1597bc63"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae0fa388479cace9c5a7a45b571ab42f8"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#ae0fa388479cace9c5a7a45b571ab42f8">api_statuses_repeat</a> (&amp;$a, $type)</td></tr>
+<tr class="separator:ae0fa388479cace9c5a7a45b571ab42f8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad4c29f43418f6110f85a6b3998239ab4"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#ad4c29f43418f6110f85a6b3998239ab4">api_statuses_destroy</a> (&amp;$a, $type)</td></tr>
+<tr class="separator:ad4c29f43418f6110f85a6b3998239ab4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8b25a186bd0893f51aa72a62f655735e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#a8b25a186bd0893f51aa72a62f655735e">api_statuses_mentions</a> (&amp;$a, $type)</td></tr>
+<tr class="separator:a8b25a186bd0893f51aa72a62f655735e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a32f0dda848d0c11c727fe1c3e741c283"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#a32f0dda848d0c11c727fe1c3e741c283">api_statuses_user_timeline</a> (&amp;$a, $type)</td></tr>
+<tr class="separator:a32f0dda848d0c11c727fe1c3e741c283"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2c71b1226ef1283b5370bd1c200fee5f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#a2c71b1226ef1283b5370bd1c200fee5f">api_favorites</a> (&amp;$a, $type)</td></tr>
+<tr class="separator:a2c71b1226ef1283b5370bd1c200fee5f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a18cab7c6391df5c421753463f5d2a879"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#a18cab7c6391df5c421753463f5d2a879">api_format_as</a> ($a, $ret, $user_info)</td></tr>
+<tr class="separator:a18cab7c6391df5c421753463f5d2a879"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae82608c317421f27446465aa6724733d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#ae82608c317421f27446465aa6724733d">api_format_messages</a> ($item, $recipient, $sender)</td></tr>
+<tr class="separator:ae82608c317421f27446465aa6724733d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4c6fb9fb5203aa60f4b3afd4521db8ea"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#a4c6fb9fb5203aa60f4b3afd4521db8ea">api_format_items</a> ($r, $user_info)</td></tr>
+<tr class="separator:a4c6fb9fb5203aa60f4b3afd4521db8ea"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae8f5863e18d69421005c71441c9d99a5"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#ae8f5863e18d69421005c71441c9d99a5">api_account_rate_limit_status</a> (&amp;$a, $type)</td></tr>
+<tr class="separator:ae8f5863e18d69421005c71441c9d99a5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac5a64cc81d70ff3cf866093ea9721d23"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#ac5a64cc81d70ff3cf866093ea9721d23">api_help_test</a> (&amp;$a, $type)</td></tr>
+<tr class="separator:ac5a64cc81d70ff3cf866093ea9721d23"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa0d6b29fff0344a8e67f3507a6d01410"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#aa0d6b29fff0344a8e67f3507a6d01410">api_statuses_f</a> (&amp;$a, $type, $qtype)</td></tr>
+<tr class="separator:aa0d6b29fff0344a8e67f3507a6d01410"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ade742525b2e41c82b090799ef3c51d5e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#ade742525b2e41c82b090799ef3c51d5e">api_statuses_friends</a> (&amp;$a, $type)</td></tr>
+<tr class="separator:ade742525b2e41c82b090799ef3c51d5e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6951c690d87775eb37e569c66011988e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#a6951c690d87775eb37e569c66011988e">api_statuses_followers</a> (&amp;$a, $type)</td></tr>
+<tr class="separator:a6951c690d87775eb37e569c66011988e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a623793229a7256dd31bcfd5ab90eef08"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#a623793229a7256dd31bcfd5ab90eef08">api_statusnet_config</a> (&amp;$a, $type)</td></tr>
+<tr class="separator:a623793229a7256dd31bcfd5ab90eef08"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8969e8d9c683f12ba17dcd4b059e020d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#a8969e8d9c683f12ba17dcd4b059e020d">api_statusnet_version</a> (&amp;$a, $type)</td></tr>
+<tr class="separator:a8969e8d9c683f12ba17dcd4b059e020d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a53b0680b682ae6078f2e1ed18cfb3f74"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#a53b0680b682ae6078f2e1ed18cfb3f74">api_friendica_version</a> (&amp;$a, $type)</td></tr>
+<tr class="separator:a53b0680b682ae6078f2e1ed18cfb3f74"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a36344c80b8e9755da2f2dd3a0e28cce8"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#a36344c80b8e9755da2f2dd3a0e28cce8">api_ff_ids</a> (&amp;$a, $type, $qtype)</td></tr>
+<tr class="separator:a36344c80b8e9755da2f2dd3a0e28cce8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acafd2899309a005fcb725289173dc7fe"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#acafd2899309a005fcb725289173dc7fe">api_friends_ids</a> (&amp;$a, $type)</td></tr>
+<tr class="separator:acafd2899309a005fcb725289173dc7fe"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab1ecb58954f722444bfe03233345cb1b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#ab1ecb58954f722444bfe03233345cb1b">api_followers_ids</a> (&amp;$a, $type)</td></tr>
+<tr class="separator:ab1ecb58954f722444bfe03233345cb1b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0991f72554f821255397d615e76f3203"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#a0991f72554f821255397d615e76f3203">api_direct_messages_new</a> (&amp;$a, $type)</td></tr>
+<tr class="separator:a0991f72554f821255397d615e76f3203"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7759ccddc8dff012ad168e511ffe5af5"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#a7759ccddc8dff012ad168e511ffe5af5">api_direct_messages_box</a> (&amp;$a, $type, $box)</td></tr>
+<tr class="separator:a7759ccddc8dff012ad168e511ffe5af5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a58cf4c02ef435996f5c3bc4283d3968d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#a58cf4c02ef435996f5c3bc4283d3968d">api_direct_messages_sentbox</a> (&amp;$a, $type)</td></tr>
+<tr class="separator:a58cf4c02ef435996f5c3bc4283d3968d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad2b0192f3006918bea895de8074bf8d2"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#ad2b0192f3006918bea895de8074bf8d2">api_direct_messages_inbox</a> (&amp;$a, $type)</td></tr>
+<tr class="separator:ad2b0192f3006918bea895de8074bf8d2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a970b02c06dea8b229aa3d5fff9cf4705"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#a970b02c06dea8b229aa3d5fff9cf4705">api_direct_messages_all</a> (&amp;$a, $type)</td></tr>
+<tr class="separator:a970b02c06dea8b229aa3d5fff9cf4705"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9160288b7ac220635942d8dc209b78c3"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#a9160288b7ac220635942d8dc209b78c3">api_direct_messages_conversation</a> (&amp;$a, $type)</td></tr>
+<tr class="separator:a9160288b7ac220635942d8dc209b78c3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa1bddb580510e70cc1a7b7381667f1a3"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#aa1bddb580510e70cc1a7b7381667f1a3">api_oauth_request_token</a> (&amp;$a, $type)</td></tr>
+<tr class="separator:aa1bddb580510e70cc1a7b7381667f1a3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aff322705cc6084b329003fc8eab0aad0"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#aff322705cc6084b329003fc8eab0aad0">api_oauth_access_token</a> (&amp;$a, $type)</td></tr>
+<tr class="separator:aff322705cc6084b329003fc8eab0aad0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:aeb2e7ad00ea666b4b6dfcf82008194f8"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#aeb2e7ad00ea666b4b6dfcf82008194f8">$API</a> = array()</td></tr>
+<tr class="separator:aeb2e7ad00ea666b4b6dfcf82008194f8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa62b15a6bbb280e86b98132eb214013d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#aa62b15a6bbb280e86b98132eb214013d">$called_api</a> = Null</td></tr>
+<tr class="separator:aa62b15a6bbb280e86b98132eb214013d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a2e94eab9d6c164bfef7a1b2ab87b339b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_account_logout </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ae8f5863e18d69421005c71441c9d99a5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_account_rate_limit_status </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a864191bb876a515ed71b17e260ef35ad"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_account_verify_credentials </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Returns an HTTP 200 OK response code and a representation of the requesting user if authentication was successful; returns a 401 status code and an error message if not. <a href="http://developer.twitter.com/doc/get/account/verify_credentials">http://developer.twitter.com/doc/get/account/verify_credentials</a> </p>
+
+</div>
+</div>
+<a class="anchor" id="aa9dc5350b26d6c7727d6c4b641ecba18"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_albums </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a5990101034e7abf6404feba3cd273629"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_apply_template </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$templatename</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$data</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>load api $templatename for $type and replace $data array </p>
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#a2e94eab9d6c164bfef7a1b2ab87b339b">api_account_logout()</a>, <a class="el" href="include_2api_8php.html#ae8f5863e18d69421005c71441c9d99a5">api_account_rate_limit_status()</a>, <a class="el" href="include_2api_8php.html#a864191bb876a515ed71b17e260ef35ad">api_account_verify_credentials()</a>, <a class="el" href="include_2api_8php.html#a7759ccddc8dff012ad168e511ffe5af5">api_direct_messages_box()</a>, <a class="el" href="include_2api_8php.html#a0991f72554f821255397d615e76f3203">api_direct_messages_new()</a>, <a class="el" href="include_2api_8php.html#a2c71b1226ef1283b5370bd1c200fee5f">api_favorites()</a>, <a class="el" href="include_2api_8php.html#ac5a64cc81d70ff3cf866093ea9721d23">api_help_test()</a>, <a class="el" href="include_2api_8php.html#a645397787618b5c548a31e8686e8cca4">api_status_show()</a>, <a class="el" href="include_2api_8php.html#ad4c29f43418f6110f85a6b3998239ab4">api_statuses_destroy()</a>, <a class="el" href="include_2api_8php.html#a6951c690d87775eb37e569c66011988e">api_statuses_followers()</a>, <a class="el" href="include_2api_8php.html#ade742525b2e41c82b090799ef3c51d5e">api_statuses_friends()</a>, <a class="el" href="include_2api_8php.html#a528d8070ee74ea800102936ce73cf366">api_statuses_home_timeline()</a>, <a class="el" href="include_2api_8php.html#a8b25a186bd0893f51aa72a62f655735e">api_statuses_mentions()</a>, <a class="el" href="include_2api_8php.html#ad24ce1bf20867add4c9211a8eaf93f22">api_statuses_public_timeline()</a>, <a class="el" href="include_2api_8php.html#ae0fa388479cace9c5a7a45b571ab42f8">api_statuses_repeat()</a>, <a class="el" href="include_2api_8php.html#af6f1d89cdb0a0621025efbec1597bc63">api_statuses_show()</a>, <a class="el" href="include_2api_8php.html#a32f0dda848d0c11c727fe1c3e741c283">api_statuses_user_timeline()</a>, <a class="el" href="include_2api_8php.html#a623793229a7256dd31bcfd5ab90eef08">api_statusnet_config()</a>, and <a class="el" href="include_2api_8php.html#abe8e929e93f7ab134b1cb1fb30f19a76">api_users_show()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a176c448d79c211ad41c2bbe3124658f5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_call </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="mod_2api_8php.html#a33315b5bbf5418f6850b2038107b526d">api_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a72bfecac1970bc29b853073e816388ff"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_channel_stream </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aea2dda92a155f2843a0ca188d8dfdf25"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_date </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$str</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#a4c6fb9fb5203aa60f4b3afd4521db8ea">api_format_items()</a>, <a class="el" href="include_2api_8php.html#ae82608c317421f27446465aa6724733d">api_format_messages()</a>, <a class="el" href="include_2api_8php.html#aa40bae797bcd9ccacffdce5a3b5a1afa">api_get_user()</a>, <a class="el" href="include_2api_8php.html#a6a04b48168ba1d9dd2de3081a630611f">api_rss_extra()</a>, <a class="el" href="include_2api_8php.html#a645397787618b5c548a31e8686e8cca4">api_status_show()</a>, and <a class="el" href="include_2api_8php.html#abe8e929e93f7ab134b1cb1fb30f19a76">api_users_show()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a970b02c06dea8b229aa3d5fff9cf4705"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_direct_messages_all </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a7759ccddc8dff012ad168e511ffe5af5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_direct_messages_box </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$box</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#a970b02c06dea8b229aa3d5fff9cf4705">api_direct_messages_all()</a>, <a class="el" href="include_2api_8php.html#a9160288b7ac220635942d8dc209b78c3">api_direct_messages_conversation()</a>, <a class="el" href="include_2api_8php.html#ad2b0192f3006918bea895de8074bf8d2">api_direct_messages_inbox()</a>, and <a class="el" href="include_2api_8php.html#a58cf4c02ef435996f5c3bc4283d3968d">api_direct_messages_sentbox()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a9160288b7ac220635942d8dc209b78c3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_direct_messages_conversation </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ad2b0192f3006918bea895de8074bf8d2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_direct_messages_inbox </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a0991f72554f821255397d615e76f3203"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_direct_messages_new </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a58cf4c02ef435996f5c3bc4283d3968d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_direct_messages_sentbox </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="adfc035ee6303c1d8ba5336a4ead2bd53"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_export_basic </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a2c71b1226ef1283b5370bd1c200fee5f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_favorites </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a36344c80b8e9755da2f2dd3a0e28cce8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_ff_ids </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$qtype</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#ab1ecb58954f722444bfe03233345cb1b">api_followers_ids()</a>, and <a class="el" href="include_2api_8php.html#acafd2899309a005fcb725289173dc7fe">api_friends_ids()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ab1ecb58954f722444bfe03233345cb1b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_followers_ids </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a18cab7c6391df5c421753463f5d2a879"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_format_as </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$ret</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$user_info</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#a528d8070ee74ea800102936ce73cf366">api_statuses_home_timeline()</a>, <a class="el" href="include_2api_8php.html#a8b25a186bd0893f51aa72a62f655735e">api_statuses_mentions()</a>, and <a class="el" href="include_2api_8php.html#ad24ce1bf20867add4c9211a8eaf93f22">api_statuses_public_timeline()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a4c6fb9fb5203aa60f4b3afd4521db8ea"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_format_items </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$r</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$user_info</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#a2c71b1226ef1283b5370bd1c200fee5f">api_favorites()</a>, <a class="el" href="include_2api_8php.html#a528d8070ee74ea800102936ce73cf366">api_statuses_home_timeline()</a>, <a class="el" href="include_2api_8php.html#a8b25a186bd0893f51aa72a62f655735e">api_statuses_mentions()</a>, <a class="el" href="include_2api_8php.html#ad24ce1bf20867add4c9211a8eaf93f22">api_statuses_public_timeline()</a>, <a class="el" href="include_2api_8php.html#af6f1d89cdb0a0621025efbec1597bc63">api_statuses_show()</a>, and <a class="el" href="include_2api_8php.html#a32f0dda848d0c11c727fe1c3e741c283">api_statuses_user_timeline()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ae82608c317421f27446465aa6724733d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_format_messages </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$recipient</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$sender</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#a7759ccddc8dff012ad168e511ffe5af5">api_direct_messages_box()</a>, and <a class="el" href="include_2api_8php.html#a0991f72554f821255397d615e76f3203">api_direct_messages_new()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a53b0680b682ae6078f2e1ed18cfb3f74"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_friendica_version </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="acafd2899309a005fcb725289173dc7fe"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_friends_ids </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aa40bae797bcd9ccacffdce5a3b5a1afa"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_get_user </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$contact_id</em> = <code>Null</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Returns user info array. </p>
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#a864191bb876a515ed71b17e260ef35ad">api_account_verify_credentials()</a>, <a class="el" href="include_2api_8php.html#a7759ccddc8dff012ad168e511ffe5af5">api_direct_messages_box()</a>, <a class="el" href="include_2api_8php.html#a0991f72554f821255397d615e76f3203">api_direct_messages_new()</a>, <a class="el" href="include_2api_8php.html#a2c71b1226ef1283b5370bd1c200fee5f">api_favorites()</a>, <a class="el" href="include_2api_8php.html#aa49741342ad8ba285737eea1209a37e1">api_item_get_user()</a>, <a class="el" href="include_2api_8php.html#a6a04b48168ba1d9dd2de3081a630611f">api_rss_extra()</a>, <a class="el" href="include_2api_8php.html#a645397787618b5c548a31e8686e8cca4">api_status_show()</a>, <a class="el" href="include_2api_8php.html#ad4c29f43418f6110f85a6b3998239ab4">api_statuses_destroy()</a>, <a class="el" href="include_2api_8php.html#aa0d6b29fff0344a8e67f3507a6d01410">api_statuses_f()</a>, <a class="el" href="include_2api_8php.html#a528d8070ee74ea800102936ce73cf366">api_statuses_home_timeline()</a>, <a class="el" href="include_2api_8php.html#a450d8732b7b608f7ac929aee61572b95">api_statuses_mediap()</a>, <a class="el" href="include_2api_8php.html#a8b25a186bd0893f51aa72a62f655735e">api_statuses_mentions()</a>, <a class="el" href="include_2api_8php.html#ad24ce1bf20867add4c9211a8eaf93f22">api_statuses_public_timeline()</a>, <a class="el" href="include_2api_8php.html#ae0fa388479cace9c5a7a45b571ab42f8">api_statuses_repeat()</a>, <a class="el" href="include_2api_8php.html#af6f1d89cdb0a0621025efbec1597bc63">api_statuses_show()</a>, <a class="el" href="include_2api_8php.html#ad4d1634df6b35126552324683caaffa2">api_statuses_update()</a>, <a class="el" href="include_2api_8php.html#a32f0dda848d0c11c727fe1c3e741c283">api_statuses_user_timeline()</a>, <a class="el" href="include_2api_8php.html#abe8e929e93f7ab134b1cb1fb30f19a76">api_users_show()</a>, and <a class="el" href="wall__upload_8php.html#a7cbe204244cf9e0380ee932263a74d8f">wall_upload_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ac5a64cc81d70ff3cf866093ea9721d23"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_help_test </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aa49741342ad8ba285737eea1209a37e1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_item_get_user </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#a4c6fb9fb5203aa60f4b3afd4521db8ea">api_format_items()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="afe534f826e4282b72d66e8cadca7bb73"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_login </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Simple HTTP Login </p>
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#a176c448d79c211ad41c2bbe3124658f5">api_call()</a>, and <a class="el" href="include_2api_8php.html#aa40bae797bcd9ccacffdce5a3b5a1afa">api_get_user()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aff322705cc6084b329003fc8eab0aad0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_oauth_access_token </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aa1bddb580510e70cc1a7b7381667f1a3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_oauth_request_token </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aa6fc3bc8c0fad1d081db0dcc456dd77f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_photos </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ac2c2b18c426d697d11a830bca146be8a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_register_func </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$path</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$func</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$auth</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a6a04b48168ba1d9dd2de3081a630611f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_rss_extra </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$user_info</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>RSS extra info </p>
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#a7759ccddc8dff012ad168e511ffe5af5">api_direct_messages_box()</a>, <a class="el" href="include_2api_8php.html#a0991f72554f821255397d615e76f3203">api_direct_messages_new()</a>, <a class="el" href="include_2api_8php.html#a2c71b1226ef1283b5370bd1c200fee5f">api_favorites()</a>, <a class="el" href="include_2api_8php.html#a528d8070ee74ea800102936ce73cf366">api_statuses_home_timeline()</a>, <a class="el" href="include_2api_8php.html#a8b25a186bd0893f51aa72a62f655735e">api_statuses_mentions()</a>, <a class="el" href="include_2api_8php.html#ad24ce1bf20867add4c9211a8eaf93f22">api_statuses_public_timeline()</a>, and <a class="el" href="include_2api_8php.html#a32f0dda848d0c11c727fe1c3e741c283">api_statuses_user_timeline()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a645397787618b5c548a31e8686e8cca4"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_status_show </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#a450d8732b7b608f7ac929aee61572b95">api_statuses_mediap()</a>, and <a class="el" href="include_2api_8php.html#ad4d1634df6b35126552324683caaffa2">api_statuses_update()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ad4c29f43418f6110f85a6b3998239ab4"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_statuses_destroy </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aa0d6b29fff0344a8e67f3507a6d01410"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_statuses_f </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$qtype</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p><a href="https://dev.twitter.com/docs/api/1/get/statuses/friends">https://dev.twitter.com/docs/api/1/get/statuses/friends</a> This function is deprecated by Twitter returns: json, xml </p>
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#a6951c690d87775eb37e569c66011988e">api_statuses_followers()</a>, and <a class="el" href="include_2api_8php.html#ade742525b2e41c82b090799ef3c51d5e">api_statuses_friends()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a6951c690d87775eb37e569c66011988e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_statuses_followers </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ade742525b2e41c82b090799ef3c51d5e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_statuses_friends </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a528d8070ee74ea800102936ce73cf366"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_statuses_home_timeline </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p><a href="http://developer.twitter.com/doc/get/statuses/home_timeline">http://developer.twitter.com/doc/get/statuses/home_timeline</a></p>
+<p>TODO: Optional parameters TODO: Add reply info </p>
+
+</div>
+</div>
+<a class="anchor" id="a450d8732b7b608f7ac929aee61572b95"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_statuses_mediap </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a8b25a186bd0893f51aa72a62f655735e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_statuses_mentions </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p><a href="http://developer.twitter.com/doc/get/statuses/mentions">http://developer.twitter.com/doc/get/statuses/mentions</a> </p>
+
+</div>
+</div>
+<a class="anchor" id="ad24ce1bf20867add4c9211a8eaf93f22"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_statuses_public_timeline </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ae0fa388479cace9c5a7a45b571ab42f8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_statuses_repeat </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="af6f1d89cdb0a0621025efbec1597bc63"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_statuses_show </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ad4d1634df6b35126552324683caaffa2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_statuses_update </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a32f0dda848d0c11c727fe1c3e741c283"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_statuses_user_timeline </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a623793229a7256dd31bcfd5ab90eef08"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_statusnet_config </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a8969e8d9c683f12ba17dcd4b059e020d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_statusnet_version </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="afb99daa6b731bf497b81f2128084852c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_user </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#a864191bb876a515ed71b17e260ef35ad">api_account_verify_credentials()</a>, <a class="el" href="include_2api_8php.html#a176c448d79c211ad41c2bbe3124658f5">api_call()</a>, <a class="el" href="include_2api_8php.html#a72bfecac1970bc29b853073e816388ff">api_channel_stream()</a>, <a class="el" href="include_2api_8php.html#a7759ccddc8dff012ad168e511ffe5af5">api_direct_messages_box()</a>, <a class="el" href="include_2api_8php.html#a0991f72554f821255397d615e76f3203">api_direct_messages_new()</a>, <a class="el" href="include_2api_8php.html#adfc035ee6303c1d8ba5336a4ead2bd53">api_export_basic()</a>, <a class="el" href="include_2api_8php.html#a2c71b1226ef1283b5370bd1c200fee5f">api_favorites()</a>, <a class="el" href="include_2api_8php.html#a36344c80b8e9755da2f2dd3a0e28cce8">api_ff_ids()</a>, <a class="el" href="include_2api_8php.html#aa40bae797bcd9ccacffdce5a3b5a1afa">api_get_user()</a>, <a class="el" href="include_2api_8php.html#ad4c29f43418f6110f85a6b3998239ab4">api_statuses_destroy()</a>, <a class="el" href="include_2api_8php.html#aa0d6b29fff0344a8e67f3507a6d01410">api_statuses_f()</a>, <a class="el" href="include_2api_8php.html#a528d8070ee74ea800102936ce73cf366">api_statuses_home_timeline()</a>, <a class="el" href="include_2api_8php.html#a450d8732b7b608f7ac929aee61572b95">api_statuses_mediap()</a>, <a class="el" href="include_2api_8php.html#a8b25a186bd0893f51aa72a62f655735e">api_statuses_mentions()</a>, <a class="el" href="include_2api_8php.html#ad24ce1bf20867add4c9211a8eaf93f22">api_statuses_public_timeline()</a>, <a class="el" href="include_2api_8php.html#ae0fa388479cace9c5a7a45b571ab42f8">api_statuses_repeat()</a>, <a class="el" href="include_2api_8php.html#af6f1d89cdb0a0621025efbec1597bc63">api_statuses_show()</a>, <a class="el" href="include_2api_8php.html#ad4d1634df6b35126552324683caaffa2">api_statuses_update()</a>, and <a class="el" href="include_2api_8php.html#a32f0dda848d0c11c727fe1c3e741c283">api_statuses_user_timeline()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="abe8e929e93f7ab134b1cb1fb30f19a76"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_users_show </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Returns extended information of a given user, specified by ID or screen name as per the required id parameter. The author's most recent status will be returned inline. <a href="http://developer.twitter.com/doc/get/users/show">http://developer.twitter.com/doc/get/users/show</a> </p>
+
+</div>
+</div>
+<a class="anchor" id="a43c47de8565cc00c3369cb35c19cc75e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">requestdata </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$k</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>get data from $_REQUEST ( e.g. $_POST or $_GET ) </p>
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#a450d8732b7b608f7ac929aee61572b95">api_statuses_mediap()</a>, and <a class="el" href="include_2api_8php.html#ad4d1634df6b35126552324683caaffa2">api_statuses_update()</a>.</p>
+
+</div>
+</div>
+<h2 class="groupheader">Variable Documentation</h2>
+<a class="anchor" id="aeb2e7ad00ea666b4b6dfcf82008194f8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$API = array()</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>TWITTER API </p>
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#a176c448d79c211ad41c2bbe3124658f5">api_call()</a>, and <a class="el" href="include_2api_8php.html#ac2c2b18c426d697d11a830bca146be8a">api_register_func()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa62b15a6bbb280e86b98132eb214013d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$called_api = Null</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#a176c448d79c211ad41c2bbe3124658f5">api_call()</a>, and <a class="el" href="include_2api_8php.html#aa40bae797bcd9ccacffdce5a3b5a1afa">api_get_user()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/include_2api_8php.js b/doc/html/include_2api_8php.js
new file mode 100644
index 000000000..5ffbeb070
--- /dev/null
+++ b/doc/html/include_2api_8php.js
@@ -0,0 +1,55 @@
+var include_2api_8php =
+[
+ [ "api_account_logout", "include_2api_8php.html#a2e94eab9d6c164bfef7a1b2ab87b339b", null ],
+ [ "api_account_rate_limit_status", "include_2api_8php.html#ae8f5863e18d69421005c71441c9d99a5", null ],
+ [ "api_account_verify_credentials", "include_2api_8php.html#a864191bb876a515ed71b17e260ef35ad", null ],
+ [ "api_albums", "include_2api_8php.html#aa9dc5350b26d6c7727d6c4b641ecba18", null ],
+ [ "api_apply_template", "include_2api_8php.html#a5990101034e7abf6404feba3cd273629", null ],
+ [ "api_call", "include_2api_8php.html#a176c448d79c211ad41c2bbe3124658f5", null ],
+ [ "api_channel_stream", "include_2api_8php.html#a72bfecac1970bc29b853073e816388ff", null ],
+ [ "api_date", "include_2api_8php.html#aea2dda92a155f2843a0ca188d8dfdf25", null ],
+ [ "api_direct_messages_all", "include_2api_8php.html#a970b02c06dea8b229aa3d5fff9cf4705", null ],
+ [ "api_direct_messages_box", "include_2api_8php.html#a7759ccddc8dff012ad168e511ffe5af5", null ],
+ [ "api_direct_messages_conversation", "include_2api_8php.html#a9160288b7ac220635942d8dc209b78c3", null ],
+ [ "api_direct_messages_inbox", "include_2api_8php.html#ad2b0192f3006918bea895de8074bf8d2", null ],
+ [ "api_direct_messages_new", "include_2api_8php.html#a0991f72554f821255397d615e76f3203", null ],
+ [ "api_direct_messages_sentbox", "include_2api_8php.html#a58cf4c02ef435996f5c3bc4283d3968d", null ],
+ [ "api_export_basic", "include_2api_8php.html#adfc035ee6303c1d8ba5336a4ead2bd53", null ],
+ [ "api_favorites", "include_2api_8php.html#a2c71b1226ef1283b5370bd1c200fee5f", null ],
+ [ "api_ff_ids", "include_2api_8php.html#a36344c80b8e9755da2f2dd3a0e28cce8", null ],
+ [ "api_followers_ids", "include_2api_8php.html#ab1ecb58954f722444bfe03233345cb1b", null ],
+ [ "api_format_as", "include_2api_8php.html#a18cab7c6391df5c421753463f5d2a879", null ],
+ [ "api_format_items", "include_2api_8php.html#a4c6fb9fb5203aa60f4b3afd4521db8ea", null ],
+ [ "api_format_messages", "include_2api_8php.html#ae82608c317421f27446465aa6724733d", null ],
+ [ "api_friendica_version", "include_2api_8php.html#a53b0680b682ae6078f2e1ed18cfb3f74", null ],
+ [ "api_friends_ids", "include_2api_8php.html#acafd2899309a005fcb725289173dc7fe", null ],
+ [ "api_get_user", "include_2api_8php.html#aa40bae797bcd9ccacffdce5a3b5a1afa", null ],
+ [ "api_help_test", "include_2api_8php.html#ac5a64cc81d70ff3cf866093ea9721d23", null ],
+ [ "api_item_get_user", "include_2api_8php.html#aa49741342ad8ba285737eea1209a37e1", null ],
+ [ "api_login", "include_2api_8php.html#afe534f826e4282b72d66e8cadca7bb73", null ],
+ [ "api_oauth_access_token", "include_2api_8php.html#aff322705cc6084b329003fc8eab0aad0", null ],
+ [ "api_oauth_request_token", "include_2api_8php.html#aa1bddb580510e70cc1a7b7381667f1a3", null ],
+ [ "api_photos", "include_2api_8php.html#aa6fc3bc8c0fad1d081db0dcc456dd77f", null ],
+ [ "api_register_func", "include_2api_8php.html#ac2c2b18c426d697d11a830bca146be8a", null ],
+ [ "api_rss_extra", "include_2api_8php.html#a6a04b48168ba1d9dd2de3081a630611f", null ],
+ [ "api_status_show", "include_2api_8php.html#a645397787618b5c548a31e8686e8cca4", null ],
+ [ "api_statuses_destroy", "include_2api_8php.html#ad4c29f43418f6110f85a6b3998239ab4", null ],
+ [ "api_statuses_f", "include_2api_8php.html#aa0d6b29fff0344a8e67f3507a6d01410", null ],
+ [ "api_statuses_followers", "include_2api_8php.html#a6951c690d87775eb37e569c66011988e", null ],
+ [ "api_statuses_friends", "include_2api_8php.html#ade742525b2e41c82b090799ef3c51d5e", null ],
+ [ "api_statuses_home_timeline", "include_2api_8php.html#a528d8070ee74ea800102936ce73cf366", null ],
+ [ "api_statuses_mediap", "include_2api_8php.html#a450d8732b7b608f7ac929aee61572b95", null ],
+ [ "api_statuses_mentions", "include_2api_8php.html#a8b25a186bd0893f51aa72a62f655735e", null ],
+ [ "api_statuses_public_timeline", "include_2api_8php.html#ad24ce1bf20867add4c9211a8eaf93f22", null ],
+ [ "api_statuses_repeat", "include_2api_8php.html#ae0fa388479cace9c5a7a45b571ab42f8", null ],
+ [ "api_statuses_show", "include_2api_8php.html#af6f1d89cdb0a0621025efbec1597bc63", null ],
+ [ "api_statuses_update", "include_2api_8php.html#ad4d1634df6b35126552324683caaffa2", null ],
+ [ "api_statuses_user_timeline", "include_2api_8php.html#a32f0dda848d0c11c727fe1c3e741c283", null ],
+ [ "api_statusnet_config", "include_2api_8php.html#a623793229a7256dd31bcfd5ab90eef08", null ],
+ [ "api_statusnet_version", "include_2api_8php.html#a8969e8d9c683f12ba17dcd4b059e020d", null ],
+ [ "api_user", "include_2api_8php.html#afb99daa6b731bf497b81f2128084852c", null ],
+ [ "api_users_show", "include_2api_8php.html#abe8e929e93f7ab134b1cb1fb30f19a76", null ],
+ [ "requestdata", "include_2api_8php.html#a43c47de8565cc00c3369cb35c19cc75e", null ],
+ [ "$API", "include_2api_8php.html#aeb2e7ad00ea666b4b6dfcf82008194f8", null ],
+ [ "$called_api", "include_2api_8php.html#aa62b15a6bbb280e86b98132eb214013d", null ]
+]; \ No newline at end of file
diff --git a/doc/html/include_2attach_8php.html b/doc/html/include_2attach_8php.html
new file mode 100644
index 000000000..dcc1bd61a
--- /dev/null
+++ b/doc/html/include_2attach_8php.html
@@ -0,0 +1,588 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/attach.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('include_2attach_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">attach.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a6fdd92775f31c07d2863e16e0026018a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2attach_8php.html#a6fdd92775f31c07d2863e16e0026018a">z_mime_content_type</a> ($filename)</td></tr>
+<tr class="separator:a6fdd92775f31c07d2863e16e0026018a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a887d2d44a3ef18dcb6624e7fb58dc8e3"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2attach_8php.html#a887d2d44a3ef18dcb6624e7fb58dc8e3">attach_count_files</a> ($channel_id, $observer, $hash= '', $filename= '', $filetype= '')</td></tr>
+<tr class="separator:a887d2d44a3ef18dcb6624e7fb58dc8e3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3634af95f11a023dd8e882c3c7a3600d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2attach_8php.html#a3634af95f11a023dd8e882c3c7a3600d">attach_list_files</a> ($channel_id, $observer, $hash= '', $filename= '', $filetype= '', $orderby= 'created desc', $start=0, $entries=0)</td></tr>
+<tr class="separator:a3634af95f11a023dd8e882c3c7a3600d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0d07c5b83d3d54e186f752e571847b36"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2attach_8php.html#a0d07c5b83d3d54e186f752e571847b36">attach_by_hash</a> ($hash, $rev=0)</td></tr>
+<tr class="separator:a0d07c5b83d3d54e186f752e571847b36"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad991208ce939387e2f93a3bce7d09932"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2attach_8php.html#ad991208ce939387e2f93a3bce7d09932">attach_by_hash_nodata</a> ($hash, $rev=0)</td></tr>
+<tr class="separator:ad991208ce939387e2f93a3bce7d09932"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a84a8a64c4805e1525b42d4add464833f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2attach_8php.html#a84a8a64c4805e1525b42d4add464833f">attach_store</a> ($channel, $observer_hash, $options= '', $arr=null)</td></tr>
+<tr class="separator:a84a8a64c4805e1525b42d4add464833f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aeb07968990e66a88c95483ca09a7f909"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2attach_8php.html#aeb07968990e66a88c95483ca09a7f909">z_readdir</a> ($channel_id, $observer_hash, $pathname, $parent_hash= '')</td></tr>
+<tr class="separator:aeb07968990e66a88c95483ca09a7f909"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab6830b3ab74a5d284876141ac80f6cbc"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2attach_8php.html#ab6830b3ab74a5d284876141ac80f6cbc">attach_mkdir</a> ($channel, $observer_hash, $arr=null)</td></tr>
+<tr class="separator:ab6830b3ab74a5d284876141ac80f6cbc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5c0875eafb8c0f8a0620ff7a875a2221"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2attach_8php.html#a5c0875eafb8c0f8a0620ff7a875a2221">attach_change_permissions</a> ($channel_id, $resource, $allow_cid, $allow_gid, $deny_cid, $deny_gid, $recurse=false)</td></tr>
+<tr class="separator:a5c0875eafb8c0f8a0620ff7a875a2221"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a70bd666e080c2af5a91f5d14c297b8cd"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2attach_8php.html#a70bd666e080c2af5a91f5d14c297b8cd">attach_delete</a> ($channel_id, $resource)</td></tr>
+<tr class="separator:a70bd666e080c2af5a91f5d14c297b8cd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6aa00ea010ea030110faefb75eafc1ce"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2attach_8php.html#a6aa00ea010ea030110faefb75eafc1ce">get_cloudpath</a> ($arr)</td></tr>
+<tr class="separator:a6aa00ea010ea030110faefb75eafc1ce"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5d484de2d19a93071571d6499a50ae34"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2attach_8php.html#a5d484de2d19a93071571d6499a50ae34">pipe_streams</a> ($in, $out)</td></tr>
+<tr class="separator:a5d484de2d19a93071571d6499a50ae34"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a0d07c5b83d3d54e186f752e571847b36"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">attach_by_hash </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$hash</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$rev</em> = <code>0</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="mod_2attach_8php.html#aa88eb5ad87aa1036a30e70339cc6c1b1">attach_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ad991208ce939387e2f93a3bce7d09932"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">attach_by_hash_nodata </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$hash</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$rev</em> = <code>0</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, and <a class="el" href="include_2message_8php.html#a751ffd6635022b2190f56154ee745752">send_message()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a5c0875eafb8c0f8a0620ff7a875a2221"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">attach_change_permissions </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel_id</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$resource</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$allow_cid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$allow_gid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$deny_cid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$deny_gid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$recurse</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="filestorage_8php.html#ad3b64e3ece9831f9d3a9f00c0ae983cd">filestorage_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a887d2d44a3ef18dcb6624e7fb58dc8e3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">attach_count_files </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel_id</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$observer</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$hash</em> = <code>''</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$filename</em> = <code>''</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$filetype</em> = <code>''</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a70bd666e080c2af5a91f5d14c297b8cd"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">attach_delete </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel_id</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$resource</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classRedDirectory.html#a2d12d99d38a6a75fc9a830b2f7fc0bf0">RedDirectory\createFile()</a>, <a class="el" href="classRedFile.html#aef71c9eaac7052be7dc8602eb12171e7">RedFile\delete()</a>, <a class="el" href="filestorage_8php.html#a61bb1be78472555df4ce619f51014040">filestorage_content()</a>, and <a class="el" href="classRedFile.html#a41a49a583eb276b75626fcf97f4a699c">RedFile\put()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a3634af95f11a023dd8e882c3c7a3600d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">attach_list_files </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel_id</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$observer</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$hash</em> = <code>''</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$filename</em> = <code>''</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$filetype</em> = <code>''</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$orderby</em> = <code>'created&#160;desc'</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$start</em> = <code>0</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$entries</em> = <code>0</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ab6830b3ab74a5d284876141ac80f6cbc"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">attach_mkdir </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$observer_hash</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em> = <code>null</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>attach_mkdir($channel,$observer_hash,$arr);</p>
+<p>Create directory</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">$channel</td><td>channel array of owner </td></tr>
+ <tr><td class="paramname">$observer_hash</td><td>hash of current observer </td></tr>
+ <tr><td class="paramname">$arr</td><td>parameter array to fulfil request</td></tr>
+ </table>
+ </dd>
+</dl>
+<p>Required: $arr['filename'] $arr['folder'] // hash of parent directory, empty string for root directory</p>
+<p>Optional: $arr['hash'] // precumputed hash for this node $arr['allow_cid'] $arr['allow_gid'] $arr['deny_cid'] $arr['deny_gid'] </p>
+
+<p>Referenced by <a class="el" href="classRedDirectory.html#a986936910f0216887a25e28916c166c7">RedDirectory\createDirectory()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a84a8a64c4805e1525b42d4add464833f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">attach_store </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$observer_hash</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$options</em> = <code>''</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em> = <code>null</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="item_8php.html#a3daae7944f737bd30412a0d042207c0f">fix_attached_file_permissions()</a>, <a class="el" href="include_2message_8php.html#a751ffd6635022b2190f56154ee745752">send_message()</a>, and <a class="el" href="wall__attach_8php.html#a7385e970e93228d082f0fd7254f6e653">wall_attach_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a6aa00ea010ea030110faefb75eafc1ce"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_cloudpath </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="filestorage_8php.html#a61bb1be78472555df4ce619f51014040">filestorage_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a5d484de2d19a93071571d6499a50ae34"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">pipe_streams </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$in</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$out</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a6fdd92775f31c07d2863e16e0026018a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">z_mime_content_type </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$filename</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2attach_8php.html#a84a8a64c4805e1525b42d4add464833f">attach_store()</a>, and <a class="el" href="classRedDirectory.html#a2d12d99d38a6a75fc9a830b2f7fc0bf0">RedDirectory\createFile()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aeb07968990e66a88c95483ca09a7f909"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">z_readdir </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel_id</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$observer_hash</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$pathname</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$parent_hash</em> = <code>''</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Read a virtual directory and return contents, checking permissions of all parent components. z_readdir </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype">integer</td><td class="paramname">$channel_id</td><td></td></tr>
+ <tr><td class="paramtype">string</td><td class="paramname">$observer_hash</td><td></td></tr>
+ <tr><td class="paramtype">string</td><td class="paramname">$pathname</td><td></td></tr>
+ <tr><td class="paramtype">string</td><td class="paramname">$parent_hash</td><td>(optional)</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>array $ret $ret['success'] = boolean true or false $ret['message'] = error message if success is false $ret['data'] = array of attach DB entries without data component </dd></dl>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/include_2attach_8php.js b/doc/html/include_2attach_8php.js
new file mode 100644
index 000000000..8f134c5ae
--- /dev/null
+++ b/doc/html/include_2attach_8php.js
@@ -0,0 +1,15 @@
+var include_2attach_8php =
+[
+ [ "attach_by_hash", "include_2attach_8php.html#a0d07c5b83d3d54e186f752e571847b36", null ],
+ [ "attach_by_hash_nodata", "include_2attach_8php.html#ad991208ce939387e2f93a3bce7d09932", null ],
+ [ "attach_change_permissions", "include_2attach_8php.html#a5c0875eafb8c0f8a0620ff7a875a2221", null ],
+ [ "attach_count_files", "include_2attach_8php.html#a887d2d44a3ef18dcb6624e7fb58dc8e3", null ],
+ [ "attach_delete", "include_2attach_8php.html#a70bd666e080c2af5a91f5d14c297b8cd", null ],
+ [ "attach_list_files", "include_2attach_8php.html#a3634af95f11a023dd8e882c3c7a3600d", null ],
+ [ "attach_mkdir", "include_2attach_8php.html#ab6830b3ab74a5d284876141ac80f6cbc", null ],
+ [ "attach_store", "include_2attach_8php.html#a84a8a64c4805e1525b42d4add464833f", null ],
+ [ "get_cloudpath", "include_2attach_8php.html#a6aa00ea010ea030110faefb75eafc1ce", null ],
+ [ "pipe_streams", "include_2attach_8php.html#a5d484de2d19a93071571d6499a50ae34", null ],
+ [ "z_mime_content_type", "include_2attach_8php.html#a6fdd92775f31c07d2863e16e0026018a", null ],
+ [ "z_readdir", "include_2attach_8php.html#aeb07968990e66a88c95483ca09a7f909", null ]
+]; \ No newline at end of file
diff --git a/doc/html/include_2chanman_8php.html b/doc/html/include_2chanman_8php.html
new file mode 100644
index 000000000..b6e21596d
--- /dev/null
+++ b/doc/html/include_2chanman_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/chanman.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('include_2chanman_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">chanman.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a21ba9a5c961e866ff27aee3ee67bf99b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2chanman_8php.html#a21ba9a5c961e866ff27aee3ee67bf99b">chanman_remove_everything_from_network</a> ($channel_id)</td></tr>
+<tr class="separator:a21ba9a5c961e866ff27aee3ee67bf99b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a21ba9a5c961e866ff27aee3ee67bf99b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">chanman_remove_everything_from_network </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel_id</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/include_2chanman_8php.js b/doc/html/include_2chanman_8php.js
new file mode 100644
index 000000000..8d5f2da29
--- /dev/null
+++ b/doc/html/include_2chanman_8php.js
@@ -0,0 +1,4 @@
+var include_2chanman_8php =
+[
+ [ "chanman_remove_everything_from_network", "include_2chanman_8php.html#a21ba9a5c961e866ff27aee3ee67bf99b", null ]
+]; \ No newline at end of file
diff --git a/doc/html/include_2config_8php.html b/doc/html/include_2config_8php.html
new file mode 100644
index 000000000..56ceea6a1
--- /dev/null
+++ b/doc/html/include_2config_8php.html
@@ -0,0 +1,557 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/config.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('include_2config_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">config.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a27559f388c9b9af81c94e48d6889d1d1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2config_8php.html#a27559f388c9b9af81c94e48d6889d1d1">load_config</a> ($family)</td></tr>
+<tr class="separator:a27559f388c9b9af81c94e48d6889d1d1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af02c96e6b37335774b548914ede1d22e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2config_8php.html#af02c96e6b37335774b548914ede1d22e">get_config</a> ($family, $key)</td></tr>
+<tr class="separator:af02c96e6b37335774b548914ede1d22e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af08b7adb63adfb2eda7c466fba0cce74"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2config_8php.html#af08b7adb63adfb2eda7c466fba0cce74">get_config_from_storage</a> ($family, $key)</td></tr>
+<tr class="separator:af08b7adb63adfb2eda7c466fba0cce74"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad6da879e4fb5b37d1e161d4e9be5c32a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2config_8php.html#ad6da879e4fb5b37d1e161d4e9be5c32a">set_config</a> ($family, $key, $value)</td></tr>
+<tr class="separator:ad6da879e4fb5b37d1e161d4e9be5c32a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a549910227348003efc3c05c9105c42da"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2config_8php.html#a549910227348003efc3c05c9105c42da">del_config</a> ($family, $key)</td></tr>
+<tr class="separator:a549910227348003efc3c05c9105c42da"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac543813a980b3841cc5a277fcd4a24a6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2config_8php.html#ac543813a980b3841cc5a277fcd4a24a6">load_pconfig</a> ($uid, $family= '')</td></tr>
+<tr class="separator:ac543813a980b3841cc5a277fcd4a24a6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad58a4913937179adb13201c2ee3261ad"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2config_8php.html#ad58a4913937179adb13201c2ee3261ad">get_pconfig</a> ($uid, $family, $key, $instore=false)</td></tr>
+<tr class="separator:ad58a4913937179adb13201c2ee3261ad"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a61591371cb18764138655d67dc817ab2"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2config_8php.html#a61591371cb18764138655d67dc817ab2">set_pconfig</a> ($uid, $family, $key, $value)</td></tr>
+<tr class="separator:a61591371cb18764138655d67dc817ab2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7ad2081c5f812ac4387fd76f3762d941"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2config_8php.html#a7ad2081c5f812ac4387fd76f3762d941">del_pconfig</a> ($uid, $family, $key)</td></tr>
+<tr class="separator:a7ad2081c5f812ac4387fd76f3762d941"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a55bbed9a014c9109c767486834f3ca33"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2config_8php.html#a55bbed9a014c9109c767486834f3ca33">load_xconfig</a> ($xchan, $family= '')</td></tr>
+<tr class="separator:a55bbed9a014c9109c767486834f3ca33"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa3dc1d3de2d091ac702e675acd3a085e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2config_8php.html#aa3dc1d3de2d091ac702e675acd3a085e">get_xconfig</a> ($xchan, $family, $key)</td></tr>
+<tr class="separator:aa3dc1d3de2d091ac702e675acd3a085e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afe117b70f1bba2f6348d9300b601f86e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2config_8php.html#afe117b70f1bba2f6348d9300b601f86e">set_xconfig</a> ($xchan, $family, $key, $value)</td></tr>
+<tr class="separator:afe117b70f1bba2f6348d9300b601f86e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9c171def547deee16738dc58fdeb4b72"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2config_8php.html#a9c171def547deee16738dc58fdeb4b72">del_xconfig</a> ($xchan, $family, $key)</td></tr>
+<tr class="separator:a9c171def547deee16738dc58fdeb4b72"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a549910227348003efc3c05c9105c42da"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">del_config </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$family</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$key</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="admin_8php.html#add865f4ae806ecbf716f423fc3e50e4f">admin_page_site_post()</a>, and <a class="el" href="classFKOAuthDataStore.html#a434882f03e3cdb171ed89e09e337e934">FKOAuthDataStore\new_access_token()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a7ad2081c5f812ac4387fd76f3762d941"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">del_pconfig </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$family</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$key</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a9c171def547deee16738dc58fdeb4b72"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">del_xconfig </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$xchan</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$family</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$key</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="af02c96e6b37335774b548914ede1d22e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_config </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$family</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$key</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="admin_8php.html#aaa6addf2dbc3f3fcf99244a56b41eade">admin_page_dbsync()</a>, <a class="el" href="admin_8php.html#a1d1362698af14d209aa3a0fb655551dd">admin_page_logs()</a>, <a class="el" href="admin_8php.html#ac0f3bd12431c056aad77bac9d09fa30e">admin_page_site()</a>, <a class="el" href="admin_8php.html#ac6e95b920b5abd030cc522964987087a">admin_page_summary()</a>, <a class="el" href="admin_8php.html#af124619fdc278fe2bf14c45ddaa260fb">admin_page_themes()</a>, <a class="el" href="include_2network_8php.html#aba38458a2ff2d92d3536488dbb119694">allowed_email()</a>, <a class="el" href="include_2network_8php.html#aee35d9ad6b3f872bfb39ba3598936aa7">allowed_url()</a>, <a class="el" href="include_2api_8php.html#a8b25a186bd0893f51aa72a62f655735e">api_statuses_mentions()</a>, <a class="el" href="include_2api_8php.html#a623793229a7256dd31bcfd5ab90eef08">api_statusnet_config()</a>, <a class="el" href="include_2attach_8php.html#a84a8a64c4805e1525b42d4add464833f">attach_store()</a>, <a class="el" href="bbcode_8php.html#a009f61aaf78771737ed0765c8463911b">bbcode()</a>, <a class="el" href="zot_8php.html#ac34e479d27f32b82dd6b33542f81a6a7">build_sync_packet()</a>, <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>, <a class="el" href="account_8php.html#a917d74aad0baf3e0c4b51cf1051e654f">check_account_admin()</a>, <a class="el" href="account_8php.html#aaff7720423417a4333697894ffd9ddeb">check_account_invite()</a>, <a class="el" href="boot_8php.html#a4c02d88e66852a01bd5a1feecb7c3ce3">check_config()</a>, <a class="el" href="cli__startup_8php.html#adfdde63686e33ccd4851fa5edc4fc70b">cli_startup()</a>, <a class="el" href="community_8php.html#a1197aafd6a6b540dbb4a0c04ade3a25a">community_content()</a>, <a class="el" href="account_8php.html#a141fe579c351c78209d425473f978eb5">create_account()</a>, <a class="el" href="identity_8php.html#a345f4c943d84de502ec6e72d2c813945">create_identity()</a>, <a class="el" href="classRedDirectory.html#a2d12d99d38a6a75fc9a830b2f7fc0bf0">RedDirectory\createFile()</a>, <a class="el" href="language_8php.html#a632da17c7ac0d2dc1a00a4706870194b">detect_language()</a>, <a class="el" href="mod_2directory_8php.html#aac79396570d759da2efac24fcedf5b44">directory_content()</a>, <a class="el" href="include_2directory_8php.html#aa75d3b0697ca1456aaabdb37a74aa0f0">directory_run()</a>, <a class="el" href="dirprofile_8php.html#a3e1d30d3d93863ff5615f2df4ac7f052">dirprofile_init()</a>, <a class="el" href="dirsearch_8php.html#aa1fb04e1de4f25b63349ac78f94ceb4c">dirsearch_content()</a>, <a class="el" href="display_8php.html#a37137c98d47bf3306f4c2bb9f5b60de0">display_content()</a>, <a class="el" href="text_8php.html#a0a1f7c0e97f9ecbebf3e5834582b014c">dlogger()</a>, <a class="el" href="datetime_8php.html#a3f2897db32e745fe2f3e70a6b46578f8">dob()</a>, <a class="el" href="editblock_8php.html#abbe8f55de06967bc8d79d620509a49e6">editblock_content()</a>, <a class="el" href="editpost_8php.html#a34011690864d122680c802e9e748ccfb">editpost_content()</a>, <a class="el" href="editwebpage_8php.html#a375e945255fad79a71036528f7480650">editwebpage_content()</a>, <a class="el" href="items_8php.html#a82955cc578f0fa600acec84475026194">encode_item()</a>, <a class="el" href="items_8php.html#a2d840c74ed23d1b6c7daee05cf89dda7">encode_mail()</a>, <a class="el" href="events_8php.html#a1d293fb217ae6bc9e3858c4b32e363ec">events_content()</a>, <a class="el" href="expire_8php.html#a444e45c9b67727b27db4c779fd51a298">expire_run()</a>, <a class="el" href="feed_8php.html#af86137700b56f33d1d5f25c8dec22c04">feed_init()</a>, <a class="el" href="dir__fns_8php.html#a8c15aa69da12f2d3476b9e93b82b337d">find_upstream_directory()</a>, <a class="el" href="contact__widgets_8php.html#a57e73ebcfd62bb5d8c7a7b9e663726d6">findpeople_widget()</a>, <a class="el" href="classItem.html#a3ee7667c2ec6cd7657328e27848c0bdf">Item\get_comment_box()</a>, <a class="el" href="identity_8php.html#ab1485a26b032956e1496fc08c58b83ed">get_default_profile_photo()</a>, <a class="el" href="items_8php.html#a536d0313b6ffe33b9d2490c4e25c5361">get_item_elements()</a>, <a class="el" href="items_8php.html#a94ddb1d6c8fa21dd7433677e85168037">get_mail_elements()</a>, <a class="el" href="boot_8php.html#a97769915c9f14adc4f8ab1ea2cecfd90">get_max_import_size()</a>, <a class="el" href="classRedDirectory.html#aaa20f0f44da23781917af8170c0a2569">RedDirectory\getChild()</a>, <a class="el" href="classRedDirectory.html#aa42d3065f6f065b17db87146a7cb031a">RedDirectory\getChildren()</a>, <a class="el" href="mod_2group_8php.html#a07a64f6c65b0080d8190b3d9728a7a83">group_content()</a>, <a class="el" href="home_8php.html#aa1cf697851a646755baf537f75334c46">home_content()</a>, <a class="el" href="hostxrd_8php.html#aa37ffc8e7900bc76c4828bd25916db92">hostxrd_init()</a>, <a class="el" href="classphoto__gd.html#a0795fc029be382557ae3f6e285f40e00">photo_gd\imageString()</a>, <a class="el" href="import_8php.html#af17fef0410518f7eac205d0ea416eaa2">import_post()</a>, <a class="el" href="zot_8php.html#a56f3f65514e4e7f0cd117d01735aebd1">import_xchan()</a>, <a class="el" href="invite_8php.html#a244385b28cfd021d308715f01158bfd9">invite_content()</a>, <a class="el" href="invite_8php.html#aeb0881c0f93c8e8552e5ed756ce6e5a5">invite_post()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">item_store()</a>, <a class="el" href="items_8php.html#acf0bf7c9d21ac84f32effb754f7ad484">item_store_update()</a>, <a class="el" href="classphoto__imagick.html#a2c9168f110ccd6c264095d766615dfa8">photo_imagick\load()</a>, <a class="el" href="text_8php.html#a030fa5ecc64168af0c4f44897a9bce63">logger()</a>, <a class="el" href="boot_8php.html#aefecf8599036df7f1b95d6820e0e2fa4">login()</a>, <a class="el" href="lostpass_8php.html#a0314d94e48c789b1b3a201d740c9eab3">lostpass_content()</a>, <a class="el" href="lostpass_8php.html#a8ed35ba71a4404eaf4903da61d0321cc">lostpass_post()</a>, <a class="el" href="nav_8php.html#a43be0df73b90647ea70947ce004e231e">nav()</a>, <a class="el" href="acl_8php.html#a57dceff370d4a0e7ae673d50fbfda61f">navbar_complete()</a>, <a class="el" href="classFKOAuthDataStore.html#a434882f03e3cdb171ed89e09e337e934">FKOAuthDataStore\new_access_token()</a>, <a class="el" href="new__channel_8php.html#a180b0646957db8290482f02454ad7f23">new_channel_post()</a>, <a class="el" href="crypto_8php.html#aae0ab70d6a199b29555b1ac3cf250d6a">new_keypair()</a>, <a class="el" href="enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc">notification()</a>, <a class="el" href="notifier_8php.html#a568c502f626cff95e344c0748938b85d">notifier_run()</a>, <a class="el" href="include_2oembed_8php.html#aba89ae64b355efcb4f706553d3edb6a2">oembed_bbcode2html()</a>, <a class="el" href="parse__url_8php.html#a05a9e8944380ba3cf6bbf5893dd4b74b">parse_url_content()</a>, <a class="el" href="include_2photos_8php.html#a6c40ef58aefef705a5adc84a40e97109">photo_upload()</a>, <a class="el" href="mod_2photos_8php.html#aa87382611a66ec5effdb2d78f13f5812">photos_content()</a>, <a class="el" href="mod_2photos_8php.html#ab950295cd77626f5fe65331a87693014">photos_init()</a>, <a class="el" href="poco_8php.html#a53def16f75e3d41f1d2bb7cfa4905498">poco_init()</a>, <a class="el" href="poller_8php.html#a5f12df3a4738124b6c039971e87e76da">poller_run()</a>, <a class="el" href="items_8php.html#a410f9c743877c125ca06312373346903">post_activity_item()</a>, <a class="el" href="post_8php.html#af59e6a1dc22d19d9257b01cd7ccedb75">post_post()</a>, <a class="el" href="include_2message_8php.html#a5f8de9847e203329e317ac38dc646898">private_messages_fetch_conversation()</a>, <a class="el" href="include_2message_8php.html#a254a756031e4d5e94f85e2939bdb5091">private_messages_fetch_message()</a>, <a class="el" href="include_2message_8php.html#a652973ce47a262f2d238c2fd6233d97e">private_messages_list()</a>, <a class="el" href="boot_8php.html#ab346a2ece14993861f3e4206befa94f0">proc_run()</a>, <a class="el" href="profile_8php.html#a3775cf6eef6587e5143133356a7b76c0">profile_content()</a>, <a class="el" href="identity_8php.html#ad4a2c8caca8f6ae93633ebeca0ed6620">profile_create_sidebar()</a>, <a class="el" href="profile__photo_8php.html#a4b80234074bd603221aa5364f330e479">profile_photo_post()</a>, <a class="el" href="profiles_8php.html#a46975783b8b8d70402d51487eb1f0b00">profiles_content()</a>, <a class="el" href="profperm_8php.html#aef015787de2373d9fb3fe3f814fb5023">profperm_content()</a>, <a class="el" href="pubsites_8php.html#af614e279aab54065345bda6b03eafdf0">pubsites_content()</a>, <a class="el" href="classRedFile.html#a41a49a583eb276b75626fcf97f4a699c">RedFile\put()</a>, <a class="el" href="register_8php.html#a0e91f57f111407ea8d3223a05022bb2a">register_content()</a>, <a class="el" href="register_8php.html#a51731dcc1917c58a790eb1c0f6132271">register_post()</a>, <a class="el" href="plugin_8php.html#af9ac19004dca49adae1ac7a0d9f3b025">reload_plugins()</a>, <a class="el" href="Contact_8php.html#acc12cda999c88c4d6185cca967c15125">remove_all_xchan_resources()</a>, <a class="el" href="include_2network_8php.html#ae8d9c41a11000fb8667039fc71b4f73f">scale_external_images()</a>, <a class="el" href="search_8php.html#ab2568591359edde5b483a6cd9a24b2cc">search_content()</a>, <a class="el" href="include_2message_8php.html#a751ffd6635022b2190f56154ee745752">send_message()</a>, <a class="el" href="account_8php.html#a014de2d5d5c9785de5bf547a485822fa">send_reg_approval_email()</a>, <a class="el" href="account_8php.html#aa9c29c497c17d8f9344dce8631ad8761">send_verification_email()</a>, <a class="el" href="plugin_8php.html#a030cec6793b909c439c0336ba39b1571">service_class_allows()</a>, <a class="el" href="plugin_8php.html#a905b54e10704b283ac64680a8abc0971">service_class_fetch()</a>, <a class="el" href="include_2config_8php.html#ad6da879e4fb5b37d1e161d4e9be5c32a">set_config()</a>, <a class="el" href="settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586">settings_post()</a>, <a class="el" href="permissions_8php.html#aa8b7b102c653649d7a71b5a1c044d90d">site_default_perms()</a>, <a class="el" href="siteinfo_8php.html#a70c09bfb6dd1c86a125a35f62ed53656">siteinfo_content()</a>, <a class="el" href="text_8php.html#a3d225b253bb9e0f2498c11647d927b0b">smilies()</a>, <a class="el" href="items_8php.html#ab1bce4261bcf75ad62753b498a144d17">tag_deliver()</a>, <a class="el" href="view_2theme_2blogga_2php_2config_8php.html#a09cd81013505f83aea0771243a1e4e53">theme_admin()</a>, <a class="el" href="text_8php.html#a8264348059abd1d4d5bb521323d3b19a">unobscure()</a>, <a class="el" href="zot_8php.html#ab319d1d9fff9c7775d9daef42d1f33dd">update_modtime()</a>, <a class="el" href="socgraph_8php.html#a790690bb1a1d02483fe31632a160144d">update_suggestions()</a>, <a class="el" href="plugin_8php.html#a4fc13e528367f510fcb6d8bbfc559040">upgrade_link()</a>, <a class="el" href="account_8php.html#ac5c570a2d46446bad4dd2501e9c5a4b1">user_allow()</a>, <a class="el" href="text_8php.html#a6a3d80a6c6fb234fd0bac44203b828eb">valid_email()</a>, <a class="el" href="include_2network_8php.html#a897e7112d86eb95526cbd0bff9375f02">validate_email()</a>, <a class="el" href="viewconnections_8php.html#ab6c4d983e97b3a8a879567ff76507776">viewconnections_content()</a>, <a class="el" href="viewconnections_8php.html#a00163d50b17568f7b0e48b1ca9ab7330">viewconnections_init()</a>, <a class="el" href="webpages_8php.html#af3b7397d4abc153e3d2147740ee1a41d">webpages_content()</a>, <a class="el" href="widgets_8php.html#a70442dfa079312d9d5e5ee01be51a165">widget_fullprofile()</a>, <a class="el" href="widgets_8php.html#abd2e508a2a0b911c4a838e3cb7599923">widget_profile()</a>, <a class="el" href="include_2network_8php.html#aafd06c0a75402aefb06cfb9f9740fa37">z_fetch_url()</a>, <a class="el" href="include_2network_8php.html#a9129fd55e7fc175b4ea9a195cccc16bc">z_post_url()</a>, <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>, <a class="el" href="zot_8php.html#a61cdc1ec843663c423ed2d8160ae5aea">zot_fetch()</a>, <a class="el" href="zot_8php.html#aeea071f17e306fe3d0c488551906bfab">zot_import()</a>, and <a class="el" href="zotfeed_8php.html#a24dfc23d366e7f840cf2847d0c1c8eac">zotfeed_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="af08b7adb63adfb2eda7c466fba0cce74"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_config_from_storage </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$family</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$key</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2config_8php.html#ad6da879e4fb5b37d1e161d4e9be5c32a">set_config()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ad58a4913937179adb13201c2ee3261ad"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_pconfig </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$family</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$key</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$instore</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classConversation.html#af84ea6ccd72214c9bb4c504461cc8b09">Conversation\__construct()</a>, <a class="el" href="security_8php.html#adc7bf51e3b8d67bd80e9348f9ab03733">authenticate_success()</a>, <a class="el" href="classApp.html#a08f0537964d98958d218066364cff785">App\build_pagehead()</a>, <a class="el" href="security_8php.html#a8d23d2597aae380a3341872fe9513380">change_channel()</a>, <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>, <a class="el" href="chanview_8php.html#a4192c6da888c8c1165851acf9ad4cb8b">chanview_content()</a>, <a class="el" href="community_8php.html#a1197aafd6a6b540dbb4a0c04ade3a25a">community_content()</a>, <a class="el" href="connect_8php.html#a489f0a66c660de6ec4d6917b27674f07">connect_content()</a>, <a class="el" href="text_8php.html#ad6432621d0fafcbcf3d3b9b49bef7784">contact_block()</a>, <a class="el" href="Contact_8php.html#a28e062c884331dbb5dfa713228c25ad6">contact_remove()</a>, <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation()</a>, <a class="el" href="boot_8php.html#ad206598b909e8eb67eb0e0bb5ef69c13">current_theme()</a>, <a class="el" href="display_8php.html#a37137c98d47bf3306f4c2bb9f5b60de0">display_content()</a>, <a class="el" href="features_8php.html#a52b5bdfb61b256713efecf7a7b20b0c0">feature_enabled()</a>, <a class="el" href="contact__widgets_8php.html#a57e73ebcfd62bb5d8c7a7b9e663726d6">findpeople_widget()</a>, <a class="el" href="classItem.html#a3ee7667c2ec6cd7657328e27848c0bdf">Item\get_comment_box()</a>, <a class="el" href="identity_8php.html#aaeb666872995e3ab8da8f7bc5f3b2bd3">get_theme_uid()</a>, <a class="el" href="mod_2group_8php.html#a07a64f6c65b0080d8190b3d9728a7a83">group_content()</a>, <a class="el" href="home_8php.html#ac4642c38b6f23a8d065dd4a75c620bde">home_init()</a>, <a class="el" href="invite_8php.html#a244385b28cfd021d308715f01158bfd9">invite_content()</a>, <a class="el" href="invite_8php.html#aeb0881c0f93c8e8552e5ed756ce6e5a5">invite_post()</a>, <a class="el" href="items_8php.html#a6f7e1334af5d684a987fa6a3eb37f4cc">item_expire()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">item_store()</a>, <a class="el" href="items_8php.html#acf0bf7c9d21ac84f32effb754f7ad484">item_store_update()</a>, <a class="el" href="items_8php.html#a756738301f2ed96be50232500677d58a">items_fetch()</a>, <a class="el" href="classFKOAuth1.html#a2b1dac2ed31fc6ef84668afdda8b263f">FKOAuth1\loginUser()</a>, <a class="el" href="mail_8php.html#a3c7c485fc69f92371e8b20936040eca1">mail_content()</a>, <a class="el" href="mod_2message_8php.html#ac72dfed3ce08fcb331d66b37edc6e15f">message_content()</a>, <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>, <a class="el" href="activities_8php.html#a80134e807719b3c54aba971958d2e132">profile_activity()</a>, <a class="el" href="identity_8php.html#a4751b522ea913d0e7ed43e03d22e9e68">profile_load()</a>, <a class="el" href="identity_8php.html#a432259b2cf5b6f59be53e71db9f2c7dc">profile_sidebar()</a>, <a class="el" href="profperm_8php.html#aef015787de2373d9fb3fe3f814fb5023">profperm_content()</a>, <a class="el" href="zot_8php.html#aad25a3fe0e1566121d6fb8222979bc10">remove_community_tag()</a>, <a class="el" href="rpost_8php.html#a8190354d789000806d9879aea276728f">rpost_content()</a>, <a class="el" href="search_8php.html#ab2568591359edde5b483a6cd9a24b2cc">search_content()</a>, <a class="el" href="include_2config_8php.html#a61591371cb18764138655d67dc817ab2">set_pconfig()</a>, <a class="el" href="text_8php.html#a3d225b253bb9e0f2498c11647d927b0b">smilies()</a>, <a class="el" href="items_8php.html#ab1bce4261bcf75ad62753b498a144d17">tag_deliver()</a>, <a class="el" href="view_2theme_2apw_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d">theme_content()</a>, and <a class="el" href="widgets_8php.html#a45ea061dabe9a8372e4ca3b9e5714256">widget_notes()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa3dc1d3de2d091ac702e675acd3a085e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_xconfig </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$xchan</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$family</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$key</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="dir__fns_8php.html#acf621621e929d49441da30aad76a58cf">dir_safe_mode()</a>, <a class="el" href="mod_2directory_8php.html#aac79396570d759da2efac24fcedf5b44">directory_content()</a>, <a class="el" href="include_2config_8php.html#afe117b70f1bba2f6348d9300b601f86e">set_xconfig()</a>, and <a class="el" href="toggle__safesearch_8php.html#a23d5cfb2727a266e44993ffbf5595a79">toggle_safesearch_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a27559f388c9b9af81c94e48d6889d1d1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">load_config </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$family</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Arbitrary configuration storage Note: Please do not store booleans - convert to 0/1 integer values The get_?config() functions return boolean false for keys that are unset, and this could lead to subtle bugs.</p>
+<p>There are a few places in the code (such as the admin panel) where boolean configurations need to be fixed as of 10/08/2011. </p>
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#a623793229a7256dd31bcfd5ab90eef08">api_statusnet_config()</a>, <a class="el" href="boot_8php.html#a4c02d88e66852a01bd5a1feecb7c3ce3">check_config()</a>, <a class="el" href="cli__startup_8php.html#adfdde63686e33ccd4851fa5edc4fc70b">cli_startup()</a>, and <a class="el" href="include_2config_8php.html#af02c96e6b37335774b548914ede1d22e">get_config()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ac543813a980b3841cc5a277fcd4a24a6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">load_pconfig </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$family</em> = <code>''</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation()</a>, and <a class="el" href="include_2config_8php.html#ad58a4913937179adb13201c2ee3261ad">get_pconfig()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a55bbed9a014c9109c767486834f3ca33"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">load_xconfig </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$xchan</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$family</em> = <code>''</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2config_8php.html#aa3dc1d3de2d091ac702e675acd3a085e">get_xconfig()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ad6da879e4fb5b37d1e161d4e9be5c32a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">set_config </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$family</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$key</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$value</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="admin_8php.html#aaa6addf2dbc3f3fcf99244a56b41eade">admin_page_dbsync()</a>, <a class="el" href="admin_8php.html#a233b7c8c31776b7020532003c6e44e1c">admin_page_logs_post()</a>, <a class="el" href="admin_8php.html#a54128076986ba80c4a103de3fc3e19a8">admin_page_plugins()</a>, <a class="el" href="admin_8php.html#add865f4ae806ecbf716f423fc3e50e4f">admin_page_site_post()</a>, <a class="el" href="admin_8php.html#af124619fdc278fe2bf14c45ddaa260fb">admin_page_themes()</a>, <a class="el" href="mod_2api_8php.html#a33315b5bbf5418f6850b2038107b526d">api_content()</a>, <a class="el" href="boot_8php.html#a4c02d88e66852a01bd5a1feecb7c3ce3">check_config()</a>, <a class="el" href="account_8php.html#a141fe579c351c78209d425473f978eb5">create_account()</a>, <a class="el" href="hostxrd_8php.html#aa37ffc8e7900bc76c4828bd25916db92">hostxrd_init()</a>, <a class="el" href="poller_8php.html#a5f12df3a4738124b6c039971e87e76da">poller_run()</a>, <a class="el" href="view_2theme_2blogga_2php_2config_8php.html#aef2da5582b7cb6b5f63e5ca5d69fd30b">theme_admin_post()</a>, and <a class="el" href="setup_8php.html#aea1ebdda58ec938f4e7b31aa5c5f6b58">what_next()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a61591371cb18764138655d67dc817ab2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">set_pconfig </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$family</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$key</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$value</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="connect_8php.html#a417ec27afe33f21a929667a665e32ee2">connect_post()</a>, <a class="el" href="invite_8php.html#aeb0881c0f93c8e8552e5ed756ce6e5a5">invite_post()</a>, <a class="el" href="notes_8php.html#a4dbd7b1f906440746af48b484d66535a">notes_init()</a>, <a class="el" href="zot_8php.html#ac301c67864917c35922257950ae0f95c">process_channel_sync_delivery()</a>, <a class="el" href="register_8php.html#a51731dcc1917c58a790eb1c0f6132271">register_post()</a>, <a class="el" href="settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586">settings_post()</a>, and <a class="el" href="view_2theme_2apw_2php_2config_8php.html#ad29461920cf03b9ce1428e21eb1f4ba6">theme_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="afe117b70f1bba2f6348d9300b601f86e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">set_xconfig </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$xchan</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$family</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$key</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$value</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="toggle__safesearch_8php.html#a23d5cfb2727a266e44993ffbf5595a79">toggle_safesearch_init()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/include_2config_8php.js b/doc/html/include_2config_8php.js
new file mode 100644
index 000000000..a9f05bed3
--- /dev/null
+++ b/doc/html/include_2config_8php.js
@@ -0,0 +1,16 @@
+var include_2config_8php =
+[
+ [ "del_config", "include_2config_8php.html#a549910227348003efc3c05c9105c42da", null ],
+ [ "del_pconfig", "include_2config_8php.html#a7ad2081c5f812ac4387fd76f3762d941", null ],
+ [ "del_xconfig", "include_2config_8php.html#a9c171def547deee16738dc58fdeb4b72", null ],
+ [ "get_config", "include_2config_8php.html#af02c96e6b37335774b548914ede1d22e", null ],
+ [ "get_config_from_storage", "include_2config_8php.html#af08b7adb63adfb2eda7c466fba0cce74", null ],
+ [ "get_pconfig", "include_2config_8php.html#ad58a4913937179adb13201c2ee3261ad", null ],
+ [ "get_xconfig", "include_2config_8php.html#aa3dc1d3de2d091ac702e675acd3a085e", null ],
+ [ "load_config", "include_2config_8php.html#a27559f388c9b9af81c94e48d6889d1d1", null ],
+ [ "load_pconfig", "include_2config_8php.html#ac543813a980b3841cc5a277fcd4a24a6", null ],
+ [ "load_xconfig", "include_2config_8php.html#a55bbed9a014c9109c767486834f3ca33", null ],
+ [ "set_config", "include_2config_8php.html#ad6da879e4fb5b37d1e161d4e9be5c32a", null ],
+ [ "set_pconfig", "include_2config_8php.html#a61591371cb18764138655d67dc817ab2", null ],
+ [ "set_xconfig", "include_2config_8php.html#afe117b70f1bba2f6348d9300b601f86e", null ]
+]; \ No newline at end of file
diff --git a/doc/html/include_2directory_8php.html b/doc/html/include_2directory_8php.html
new file mode 100644
index 000000000..eaa201077
--- /dev/null
+++ b/doc/html/include_2directory_8php.html
@@ -0,0 +1,147 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/directory.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('include_2directory_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">directory.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:aa75d3b0697ca1456aaabdb37a74aa0f0"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2directory_8php.html#aa75d3b0697ca1456aaabdb37a74aa0f0">directory_run</a> ($<a class="el" href="boot_8php.html#a768f00b7d66be0daf7ef4eea2e862006">argv</a>, $<a class="el" href="boot_8php.html#abc0a90a1a77f5b668aa7e4b57d1776a7">argc</a>)</td></tr>
+<tr class="separator:aa75d3b0697ca1456aaabdb37a74aa0f0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="aa75d3b0697ca1456aaabdb37a74aa0f0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">directory_run </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$argv</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$argc</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/include_2directory_8php.js b/doc/html/include_2directory_8php.js
new file mode 100644
index 000000000..d5acd0735
--- /dev/null
+++ b/doc/html/include_2directory_8php.js
@@ -0,0 +1,4 @@
+var include_2directory_8php =
+[
+ [ "directory_run", "include_2directory_8php.html#aa75d3b0697ca1456aaabdb37a74aa0f0", null ]
+]; \ No newline at end of file
diff --git a/doc/html/include_2follow_8php.html b/doc/html/include_2follow_8php.html
new file mode 100644
index 000000000..64e43db27
--- /dev/null
+++ b/doc/html/include_2follow_8php.html
@@ -0,0 +1,168 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/follow.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('include_2follow_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">follow.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ae387d4ae097c23d69f3247e7f08140c7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2follow_8php.html#ae387d4ae097c23d69f3247e7f08140c7">new_contact</a> ($uid, $url, $channel, $interactive=false, $confirm=false)</td></tr>
+<tr class="separator:ae387d4ae097c23d69f3247e7f08140c7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="ae387d4ae097c23d69f3247e7f08140c7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">new_contact </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$url</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$interactive</em> = <code>false</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$confirm</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>If there is a default group for this channel, add this member to it </p>
+
+<p>Referenced by <a class="el" href="mod_2follow_8php.html#a171f5b19f50d7738adc3b2e96ec6018a">follow_init()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/include_2follow_8php.js b/doc/html/include_2follow_8php.js
new file mode 100644
index 000000000..7d72af074
--- /dev/null
+++ b/doc/html/include_2follow_8php.js
@@ -0,0 +1,4 @@
+var include_2follow_8php =
+[
+ [ "new_contact", "include_2follow_8php.html#ae387d4ae097c23d69f3247e7f08140c7", null ]
+]; \ No newline at end of file
diff --git a/doc/html/include_2group_8php.html b/doc/html/include_2group_8php.html
new file mode 100644
index 000000000..84fc3442a
--- /dev/null
+++ b/doc/html/include_2group_8php.html
@@ -0,0 +1,493 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/group.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('include_2group_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">group.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a06ec565d2b64e79044e7c1bf91a2a4ce"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2group_8php.html#a06ec565d2b64e79044e7c1bf91a2a4ce">group_add</a> ($uid, $name, $public=0)</td></tr>
+<tr class="separator:a06ec565d2b64e79044e7c1bf91a2a4ce"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4118f498bbd1530c1d0136d016d197a5"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2group_8php.html#a4118f498bbd1530c1d0136d016d197a5">group_rmv</a> ($uid, $name)</td></tr>
+<tr class="separator:a4118f498bbd1530c1d0136d016d197a5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abd66a5ea34a07a3422dc2dde6c7b3ecb"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2group_8php.html#abd66a5ea34a07a3422dc2dde6c7b3ecb">group_byname</a> ($uid, $name)</td></tr>
+<tr class="separator:abd66a5ea34a07a3422dc2dde6c7b3ecb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a90e157b3e1b99c981809cb5a2abd3245"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2group_8php.html#a90e157b3e1b99c981809cb5a2abd3245">group_rec_byhash</a> ($uid, $hash)</td></tr>
+<tr class="separator:a90e157b3e1b99c981809cb5a2abd3245"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a540e3ef36f47d47532646be4241f6518"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2group_8php.html#a540e3ef36f47d47532646be4241f6518">group_rmv_member</a> ($uid, $name, $member)</td></tr>
+<tr class="separator:a540e3ef36f47d47532646be4241f6518"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0122ef312df2c5546b1a46b3e6c7b31b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2group_8php.html#a0122ef312df2c5546b1a46b3e6c7b31b">group_add_member</a> ($uid, $name, $member, $gid=0)</td></tr>
+<tr class="separator:a0122ef312df2c5546b1a46b3e6c7b31b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5bd191d9692e6c34d48c0ede10810f09"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2group_8php.html#a5bd191d9692e6c34d48c0ede10810f09">group_get_members</a> ($gid)</td></tr>
+<tr class="separator:a5bd191d9692e6c34d48c0ede10810f09"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab0e422a0f31c0c64fd9084ca03d85f32"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2group_8php.html#ab0e422a0f31c0c64fd9084ca03d85f32">mini_group_select</a> ($uid, $group= '')</td></tr>
+<tr class="separator:ab0e422a0f31c0c64fd9084ca03d85f32"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6a69bd7be032fa8ce4e49c43a42cc6e9"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2group_8php.html#a6a69bd7be032fa8ce4e49c43a42cc6e9">group_side</a> ($every=&quot;connections&quot;, $each=&quot;group&quot;, $edit=false, $group_id=0, $cid= '', $mode=1)</td></tr>
+<tr class="separator:a6a69bd7be032fa8ce4e49c43a42cc6e9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a22a81875259c7d3d64d4848afea6b345"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2group_8php.html#a22a81875259c7d3d64d4848afea6b345">expand_groups</a> ($a)</td></tr>
+<tr class="separator:a22a81875259c7d3d64d4848afea6b345"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a048f6892bfd28852de1b76470df411de"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2group_8php.html#a048f6892bfd28852de1b76470df411de">member_of</a> ($c)</td></tr>
+<tr class="separator:a048f6892bfd28852de1b76470df411de"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afb802ae2ce73aae4bc36d157f7b6a92f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2group_8php.html#afb802ae2ce73aae4bc36d157f7b6a92f">groups_containing</a> ($uid, $c)</td></tr>
+<tr class="separator:afb802ae2ce73aae4bc36d157f7b6a92f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a22a81875259c7d3d64d4848afea6b345"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">expand_groups </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a01e3cf44e082fa9bd06dcde5bf713d70">collect_recipients()</a>, and <a class="el" href="items_8php.html#afbcf26dfcf8a83fff952aa858c1b7b67">enumerate_permissions()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a06ec565d2b64e79044e7c1bf91a2a4ce"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">group_add </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$name</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$public</em> = <code>0</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="identity_8php.html#a345f4c943d84de502ec6e72d2c813945">create_identity()</a>, and <a class="el" href="mod_2group_8php.html#aed1f009b1221348021bb34761160ef35">group_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a0122ef312df2c5546b1a46b3e6c7b31b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">group_add_member </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$name</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$member</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$gid</em> = <code>0</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="connections_8php.html#a1224058db8e3fb56463eb312f98e561d">connections_post()</a>, <a class="el" href="connedit_8php.html#a234c48426b652bf4d37053f2af329ac5">connedit_post()</a>, <a class="el" href="contactgroup_8php.html#a18c7391b1b25debaf98c9dba639caab3">contactgroup_content()</a>, <a class="el" href="mod_2group_8php.html#a07a64f6c65b0080d8190b3d9728a7a83">group_content()</a>, and <a class="el" href="include_2follow_8php.html#ae387d4ae097c23d69f3247e7f08140c7">new_contact()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="abd66a5ea34a07a3422dc2dde6c7b3ecb"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">group_byname </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$name</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2group_8php.html#a06ec565d2b64e79044e7c1bf91a2a4ce">group_add()</a>, <a class="el" href="include_2group_8php.html#a0122ef312df2c5546b1a46b3e6c7b31b">group_add_member()</a>, <a class="el" href="mod_2group_8php.html#aed1f009b1221348021bb34761160ef35">group_post()</a>, <a class="el" href="include_2group_8php.html#a540e3ef36f47d47532646be4241f6518">group_rmv_member()</a>, and <a class="el" href="item_8php.html#aa22feef4de326e1d7078dedd892e615c">handle_tag()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a5bd191d9692e6c34d48c0ede10810f09"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">group_get_members </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$gid</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="contactgroup_8php.html#a18c7391b1b25debaf98c9dba639caab3">contactgroup_content()</a>, <a class="el" href="mod_2group_8php.html#a07a64f6c65b0080d8190b3d9728a7a83">group_content()</a>, <a class="el" href="items_8php.html#a756738301f2ed96be50232500677d58a">items_fetch()</a>, and <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a90e157b3e1b99c981809cb5a2abd3245"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">group_rec_byhash </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$hash</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="connections_8php.html#a1224058db8e3fb56463eb312f98e561d">connections_post()</a>, <a class="el" href="connedit_8php.html#a234c48426b652bf4d37053f2af329ac5">connedit_post()</a>, <a class="el" href="items_8php.html#a756738301f2ed96be50232500677d58a">items_fetch()</a>, <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>, and <a class="el" href="include_2follow_8php.html#ae387d4ae097c23d69f3247e7f08140c7">new_contact()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a4118f498bbd1530c1d0136d016d197a5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">group_rmv </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$name</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="mod_2group_8php.html#a07a64f6c65b0080d8190b3d9728a7a83">group_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a540e3ef36f47d47532646be4241f6518"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">group_rmv_member </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$name</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$member</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="contactgroup_8php.html#a18c7391b1b25debaf98c9dba639caab3">contactgroup_content()</a>, and <a class="el" href="mod_2group_8php.html#a07a64f6c65b0080d8190b3d9728a7a83">group_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a6a69bd7be032fa8ce4e49c43a42cc6e9"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">group_side </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$every</em> = <code>&quot;connections&quot;</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$each</em> = <code>&quot;group&quot;</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$edit</em> = <code>false</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$group_id</em> = <code>0</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$cid</em> = <code>''</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$mode</em> = <code>1</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="widgets_8php.html#aa189a07241246d97efbee29f1c6a6f7f">widget_collections()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="afb802ae2ce73aae4bc36d157f7b6a92f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">groups_containing </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$c</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2group_8php.html#a6a69bd7be032fa8ce4e49c43a42cc6e9">group_side()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a048f6892bfd28852de1b76470df411de"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">member_of </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$c</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ab0e422a0f31c0c64fd9084ca03d85f32"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">mini_group_select </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$group</em> = <code>''</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/include_2group_8php.js b/doc/html/include_2group_8php.js
new file mode 100644
index 000000000..d9a775ade
--- /dev/null
+++ b/doc/html/include_2group_8php.js
@@ -0,0 +1,15 @@
+var include_2group_8php =
+[
+ [ "expand_groups", "include_2group_8php.html#a22a81875259c7d3d64d4848afea6b345", null ],
+ [ "group_add", "include_2group_8php.html#a06ec565d2b64e79044e7c1bf91a2a4ce", null ],
+ [ "group_add_member", "include_2group_8php.html#a0122ef312df2c5546b1a46b3e6c7b31b", null ],
+ [ "group_byname", "include_2group_8php.html#abd66a5ea34a07a3422dc2dde6c7b3ecb", null ],
+ [ "group_get_members", "include_2group_8php.html#a5bd191d9692e6c34d48c0ede10810f09", null ],
+ [ "group_rec_byhash", "include_2group_8php.html#a90e157b3e1b99c981809cb5a2abd3245", null ],
+ [ "group_rmv", "include_2group_8php.html#a4118f498bbd1530c1d0136d016d197a5", null ],
+ [ "group_rmv_member", "include_2group_8php.html#a540e3ef36f47d47532646be4241f6518", null ],
+ [ "group_side", "include_2group_8php.html#a6a69bd7be032fa8ce4e49c43a42cc6e9", null ],
+ [ "groups_containing", "include_2group_8php.html#afb802ae2ce73aae4bc36d157f7b6a92f", null ],
+ [ "member_of", "include_2group_8php.html#a048f6892bfd28852de1b76470df411de", null ],
+ [ "mini_group_select", "include_2group_8php.html#ab0e422a0f31c0c64fd9084ca03d85f32", null ]
+]; \ No newline at end of file
diff --git a/doc/html/include_2menu_8php.html b/doc/html/include_2menu_8php.html
new file mode 100644
index 000000000..d8ccbd4ba
--- /dev/null
+++ b/doc/html/include_2menu_8php.html
@@ -0,0 +1,431 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/menu.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('include_2menu_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">menu.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a68ebbf492470c930f652013656f9071d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2menu_8php.html#a68ebbf492470c930f652013656f9071d">menu_fetch</a> ($name, $uid, $observer_xchan)</td></tr>
+<tr class="separator:a68ebbf492470c930f652013656f9071d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a890cc6237971e15f15702e6b2e88502e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2menu_8php.html#a890cc6237971e15f15702e6b2e88502e">menu_render</a> ($menu)</td></tr>
+<tr class="separator:a890cc6237971e15f15702e6b2e88502e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a47447c01ba8ea04cd74af1d4c5b68fc7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2menu_8php.html#a47447c01ba8ea04cd74af1d4c5b68fc7">menu_fetch_id</a> ($menu_id, $channel_id)</td></tr>
+<tr class="separator:a47447c01ba8ea04cd74af1d4c5b68fc7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a08a800821721781a8dfffbe31481ff98"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2menu_8php.html#a08a800821721781a8dfffbe31481ff98">menu_create</a> ($arr)</td></tr>
+<tr class="separator:a08a800821721781a8dfffbe31481ff98"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acef15a498d52666b1c7e5c12765c689b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2menu_8php.html#acef15a498d52666b1c7e5c12765c689b">menu_list</a> ($channel_id)</td></tr>
+<tr class="separator:acef15a498d52666b1c7e5c12765c689b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6a33c6a3db2a7510b16cc656edaec571"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2menu_8php.html#a6a33c6a3db2a7510b16cc656edaec571">menu_edit</a> ($arr)</td></tr>
+<tr class="separator:a6a33c6a3db2a7510b16cc656edaec571"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3884bda4d85d84ec99447db9403a68d8"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2menu_8php.html#a3884bda4d85d84ec99447db9403a68d8">menu_delete</a> ($menu_name, $uid)</td></tr>
+<tr class="separator:a3884bda4d85d84ec99447db9403a68d8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad87f51ce85172bcc3f931aa0cd96a804"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2menu_8php.html#ad87f51ce85172bcc3f931aa0cd96a804">menu_delete_id</a> ($menu_id, $uid)</td></tr>
+<tr class="separator:ad87f51ce85172bcc3f931aa0cd96a804"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:add35fae5e9695031b3d46e30ac409eb8"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2menu_8php.html#add35fae5e9695031b3d46e30ac409eb8">menu_add_item</a> ($menu_id, $uid, $arr)</td></tr>
+<tr class="separator:add35fae5e9695031b3d46e30ac409eb8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acb66f80ca895a6ccd562b3d9ae7b41aa"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2menu_8php.html#acb66f80ca895a6ccd562b3d9ae7b41aa">menu_edit_item</a> ($menu_id, $uid, $arr)</td></tr>
+<tr class="separator:acb66f80ca895a6ccd562b3d9ae7b41aa"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9aa8e0052dd47c1a93f53a983bd4620a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2menu_8php.html#a9aa8e0052dd47c1a93f53a983bd4620a">menu_del_item</a> ($menu_id, $uid, $item_id)</td></tr>
+<tr class="separator:a9aa8e0052dd47c1a93f53a983bd4620a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="add35fae5e9695031b3d46e30ac409eb8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">menu_add_item </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$menu_id</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="mitem_8php.html#a6ee694cca4b551a20d7c7a94b5243ec1">mitem_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a08a800821721781a8dfffbe31481ff98"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">menu_create </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="mod_2menu_8php.html#aaa491ef173868fe002aece4632bcf393">menu_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a9aa8e0052dd47c1a93f53a983bd4620a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">menu_del_item </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$menu_id</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item_id</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="mitem_8php.html#a7a31b702ecad18eeb6a38b243ff0037e">mitem_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a3884bda4d85d84ec99447db9403a68d8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">menu_delete </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$menu_name</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ad87f51ce85172bcc3f931aa0cd96a804"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">menu_delete_id </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$menu_id</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="mod_2menu_8php.html#a6fed23af14d71a78a4153c8363a685cf">menu_content()</a>, and <a class="el" href="include_2menu_8php.html#a3884bda4d85d84ec99447db9403a68d8">menu_delete()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a6a33c6a3db2a7510b16cc656edaec571"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">menu_edit </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="mod_2menu_8php.html#aaa491ef173868fe002aece4632bcf393">menu_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="acb66f80ca895a6ccd562b3d9ae7b41aa"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">menu_edit_item </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$menu_id</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="mitem_8php.html#a6ee694cca4b551a20d7c7a94b5243ec1">mitem_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a68ebbf492470c930f652013656f9071d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">menu_fetch </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$name</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$observer_xchan</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="comanche_8php.html#a1fe339e1454803aa502ac89379c17f5b">comanche_menu()</a>, <a class="el" href="mitem_8php.html#a7a31b702ecad18eeb6a38b243ff0037e">mitem_content()</a>, and <a class="el" href="identity_8php.html#a432259b2cf5b6f59be53e71db9f2c7dc">profile_sidebar()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a47447c01ba8ea04cd74af1d4c5b68fc7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">menu_fetch_id </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$menu_id</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel_id</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="mod_2menu_8php.html#a6fed23af14d71a78a4153c8363a685cf">menu_content()</a>, and <a class="el" href="mitem_8php.html#a9627cd857cafdf04e4fc0ae48c8e8518">mitem_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="acef15a498d52666b1c7e5c12765c689b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">menu_list </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel_id</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="mod_2menu_8php.html#a6fed23af14d71a78a4153c8363a685cf">menu_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a890cc6237971e15f15702e6b2e88502e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">menu_render </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$menu</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="comanche_8php.html#a1fe339e1454803aa502ac89379c17f5b">comanche_menu()</a>, <a class="el" href="identity_8php.html#a432259b2cf5b6f59be53e71db9f2c7dc">profile_sidebar()</a>, and <a class="el" href="widgets_8php.html#a3bdfb81bf9a8ddf219924fa7eaf22013">widget_menu_preview()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/include_2menu_8php.js b/doc/html/include_2menu_8php.js
new file mode 100644
index 000000000..b5ace532a
--- /dev/null
+++ b/doc/html/include_2menu_8php.js
@@ -0,0 +1,14 @@
+var include_2menu_8php =
+[
+ [ "menu_add_item", "include_2menu_8php.html#add35fae5e9695031b3d46e30ac409eb8", null ],
+ [ "menu_create", "include_2menu_8php.html#a08a800821721781a8dfffbe31481ff98", null ],
+ [ "menu_del_item", "include_2menu_8php.html#a9aa8e0052dd47c1a93f53a983bd4620a", null ],
+ [ "menu_delete", "include_2menu_8php.html#a3884bda4d85d84ec99447db9403a68d8", null ],
+ [ "menu_delete_id", "include_2menu_8php.html#ad87f51ce85172bcc3f931aa0cd96a804", null ],
+ [ "menu_edit", "include_2menu_8php.html#a6a33c6a3db2a7510b16cc656edaec571", null ],
+ [ "menu_edit_item", "include_2menu_8php.html#acb66f80ca895a6ccd562b3d9ae7b41aa", null ],
+ [ "menu_fetch", "include_2menu_8php.html#a68ebbf492470c930f652013656f9071d", null ],
+ [ "menu_fetch_id", "include_2menu_8php.html#a47447c01ba8ea04cd74af1d4c5b68fc7", null ],
+ [ "menu_list", "include_2menu_8php.html#acef15a498d52666b1c7e5c12765c689b", null ],
+ [ "menu_render", "include_2menu_8php.html#a890cc6237971e15f15702e6b2e88502e", null ]
+]; \ No newline at end of file
diff --git a/doc/html/include_2message_8php.html b/doc/html/include_2message_8php.html
new file mode 100644
index 000000000..feacd5b3a
--- /dev/null
+++ b/doc/html/include_2message_8php.html
@@ -0,0 +1,322 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/message.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('include_2message_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">message.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a751ffd6635022b2190f56154ee745752"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2message_8php.html#a751ffd6635022b2190f56154ee745752">send_message</a> ($uid=0, $recipient='', $body='', $subject='', $replyto='', $expires= '')</td></tr>
+<tr class="separator:a751ffd6635022b2190f56154ee745752"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a652973ce47a262f2d238c2fd6233d97e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2message_8php.html#a652973ce47a262f2d238c2fd6233d97e">private_messages_list</a> ($uid, $mailbox= '', $start=0, $numitems=0)</td></tr>
+<tr class="separator:a652973ce47a262f2d238c2fd6233d97e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a254a756031e4d5e94f85e2939bdb5091"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2message_8php.html#a254a756031e4d5e94f85e2939bdb5091">private_messages_fetch_message</a> ($channel_id, $messageitem_id, $updateseen=false)</td></tr>
+<tr class="separator:a254a756031e4d5e94f85e2939bdb5091"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aed272d77c06a309e2836ac79e75613f1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2message_8php.html#aed272d77c06a309e2836ac79e75613f1">private_messages_drop</a> ($channel_id, $messageitem_id, $drop_conversation=false)</td></tr>
+<tr class="separator:aed272d77c06a309e2836ac79e75613f1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5f8de9847e203329e317ac38dc646898"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2message_8php.html#a5f8de9847e203329e317ac38dc646898">private_messages_fetch_conversation</a> ($channel_id, $messageitem_id, $updateseen=false)</td></tr>
+<tr class="separator:a5f8de9847e203329e317ac38dc646898"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="aed272d77c06a309e2836ac79e75613f1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">private_messages_drop </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel_id</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$messageitem_id</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$drop_conversation</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="mail_8php.html#a3c7c485fc69f92371e8b20936040eca1">mail_content()</a>, and <a class="el" href="mod_2message_8php.html#ac72dfed3ce08fcb331d66b37edc6e15f">message_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a5f8de9847e203329e317ac38dc646898"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">private_messages_fetch_conversation </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel_id</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$messageitem_id</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$updateseen</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="mail_8php.html#a3c7c485fc69f92371e8b20936040eca1">mail_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a254a756031e4d5e94f85e2939bdb5091"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">private_messages_fetch_message </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel_id</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$messageitem_id</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$updateseen</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a652973ce47a262f2d238c2fd6233d97e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">private_messages_list </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$mailbox</em> = <code>''</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$start</em> = <code>0</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$numitems</em> = <code>0</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="mod_2message_8php.html#ac72dfed3ce08fcb331d66b37edc6e15f">message_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a751ffd6635022b2190f56154ee745752"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">send_message </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em> = <code>0</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$recipient</em> = <code>''</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$body</em> = <code>''</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$subject</em> = <code>''</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$replyto</em> = <code>''</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$expires</em> = <code>''</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>When a photo was uploaded into the message using the (profile wall) ajax uploader, The permissions are initially set to disallow anybody but the owner from seeing it. This is because the permissions may not yet have been set for the post. If it's private, the photo permissions should be set appropriately. But we didn't know the final permissions on the post until now. So now we'll look for links of uploaded messages that are in the post and set them to the same permissions as the post itself.</p>
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#a0991f72554f821255397d615e76f3203">api_direct_messages_new()</a>, and <a class="el" href="mail_8php.html#acfc2cc0bf4e0b178207758384977f25a">mail_post()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/include_2message_8php.js b/doc/html/include_2message_8php.js
new file mode 100644
index 000000000..01478930f
--- /dev/null
+++ b/doc/html/include_2message_8php.js
@@ -0,0 +1,8 @@
+var include_2message_8php =
+[
+ [ "private_messages_drop", "include_2message_8php.html#aed272d77c06a309e2836ac79e75613f1", null ],
+ [ "private_messages_fetch_conversation", "include_2message_8php.html#a5f8de9847e203329e317ac38dc646898", null ],
+ [ "private_messages_fetch_message", "include_2message_8php.html#a254a756031e4d5e94f85e2939bdb5091", null ],
+ [ "private_messages_list", "include_2message_8php.html#a652973ce47a262f2d238c2fd6233d97e", null ],
+ [ "send_message", "include_2message_8php.html#a751ffd6635022b2190f56154ee745752", null ]
+]; \ No newline at end of file
diff --git a/doc/html/include_2network_8php.html b/doc/html/include_2network_8php.html
new file mode 100644
index 000000000..c21a30846
--- /dev/null
+++ b/doc/html/include_2network_8php.html
@@ -0,0 +1,700 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/network.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('include_2network_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">network.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a78e89557b2fbd344ad790846d761b0c7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2network_8php.html#a78e89557b2fbd344ad790846d761b0c7">get_capath</a> ()</td></tr>
+<tr class="separator:a78e89557b2fbd344ad790846d761b0c7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aafd06c0a75402aefb06cfb9f9740fa37"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2network_8php.html#aafd06c0a75402aefb06cfb9f9740fa37">z_fetch_url</a> ($url, $binary=false, $redirects=0, $opts=array())</td></tr>
+<tr class="separator:aafd06c0a75402aefb06cfb9f9740fa37"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9129fd55e7fc175b4ea9a195cccc16bc"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2network_8php.html#a9129fd55e7fc175b4ea9a195cccc16bc">z_post_url</a> ($url, $params, $redirects=0, $opts=array())</td></tr>
+<tr class="separator:a9129fd55e7fc175b4ea9a195cccc16bc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4c5d50079e089168d9248427018fffd4"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2network_8php.html#a4c5d50079e089168d9248427018fffd4">json_return_and_die</a> ($<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>)</td></tr>
+<tr class="separator:a4c5d50079e089168d9248427018fffd4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9e9da2aafb806c98ecdc318604e60dc6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2network_8php.html#a9e9da2aafb806c98ecdc318604e60dc6">xml_status</a> ($st, $message= '')</td></tr>
+<tr class="separator:a9e9da2aafb806c98ecdc318604e60dc6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4cfb2c05a1c295317283d762440ce0b2"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2network_8php.html#a4cfb2c05a1c295317283d762440ce0b2">http_status_exit</a> ($val, $msg= '')</td></tr>
+<tr class="separator:a4cfb2c05a1c295317283d762440ce0b2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad4056d3ce69988f5c1a997a79f503246"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2network_8php.html#ad4056d3ce69988f5c1a997a79f503246">convert_xml_element_to_array</a> ($xml_element, &amp;$recursion_depth=0)</td></tr>
+<tr class="separator:ad4056d3ce69988f5c1a997a79f503246"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:adf6008b38c555e98e7ed10da9ede2335"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2network_8php.html#adf6008b38c555e98e7ed10da9ede2335">webfinger_dfrn</a> ($s, &amp;$hcard)</td></tr>
+<tr class="separator:adf6008b38c555e98e7ed10da9ede2335"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8122356933bcd6b0a8567e8e15ae5cc5"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2network_8php.html#a8122356933bcd6b0a8567e8e15ae5cc5">webfinger</a> ($s, $debug=false)</td></tr>
+<tr class="separator:a8122356933bcd6b0a8567e8e15ae5cc5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8d5a3afb51cc932032b5dcc159efaae0"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2network_8php.html#a8d5a3afb51cc932032b5dcc159efaae0">fetch_lrdd_template</a> ($host)</td></tr>
+<tr class="separator:a8d5a3afb51cc932032b5dcc159efaae0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5caa264fab6d2b2344e6bd5b298b08f2"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2network_8php.html#a5caa264fab6d2b2344e6bd5b298b08f2">validate_url</a> (&amp;$url)</td></tr>
+<tr class="separator:a5caa264fab6d2b2344e6bd5b298b08f2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a897e7112d86eb95526cbd0bff9375f02"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2network_8php.html#a897e7112d86eb95526cbd0bff9375f02">validate_email</a> ($addr)</td></tr>
+<tr class="separator:a897e7112d86eb95526cbd0bff9375f02"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aee35d9ad6b3f872bfb39ba3598936aa7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2network_8php.html#aee35d9ad6b3f872bfb39ba3598936aa7">allowed_url</a> ($url)</td></tr>
+<tr class="separator:aee35d9ad6b3f872bfb39ba3598936aa7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aba38458a2ff2d92d3536488dbb119694"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2network_8php.html#aba38458a2ff2d92d3536488dbb119694">allowed_email</a> ($email)</td></tr>
+<tr class="separator:aba38458a2ff2d92d3536488dbb119694"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab07ce9d75eae559865ed90aad2154bd7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2network_8php.html#ab07ce9d75eae559865ed90aad2154bd7">avatar_img</a> ($email)</td></tr>
+<tr class="separator:ab07ce9d75eae559865ed90aad2154bd7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a27a951b59d8d622c0b3e7b0673ba74c6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2network_8php.html#a27a951b59d8d622c0b3e7b0673ba74c6">parse_xml_string</a> ($s, $strict=true)</td></tr>
+<tr class="separator:a27a951b59d8d622c0b3e7b0673ba74c6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae8d9c41a11000fb8667039fc71b4f73f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2network_8php.html#ae8d9c41a11000fb8667039fc71b4f73f">scale_external_images</a> ($s, $include_link=true, $scale_replace=false)</td></tr>
+<tr class="separator:ae8d9c41a11000fb8667039fc71b4f73f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a99353baabbc3e0584b85eb79ee802cff"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2network_8php.html#a99353baabbc3e0584b85eb79ee802cff">xml2array</a> ($contents, $namespaces=true, $get_attributes=1, $priority= 'attribute')</td></tr>
+<tr class="separator:a99353baabbc3e0584b85eb79ee802cff"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a469b9bd700269cd07d954f1a16c5899b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2network_8php.html#a469b9bd700269cd07d954f1a16c5899b">email_header_encode</a> ($in_str, $charset= 'UTF-8')</td></tr>
+<tr class="separator:a469b9bd700269cd07d954f1a16c5899b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1ff07d9fad93b713b93da0ab77aab7f0"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2network_8php.html#a1ff07d9fad93b713b93da0ab77aab7f0">email_send</a> ($addr, $subject, $headers, $item)</td></tr>
+<tr class="separator:a1ff07d9fad93b713b93da0ab77aab7f0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="aba38458a2ff2d92d3536488dbb119694"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">allowed_email </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$email</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="account_8php.html#ae052bd5558847bd38e89c213561a9771">check_account_email()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aee35d9ad6b3f872bfb39ba3598936aa7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">allowed_url </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$url</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2follow_8php.html#ae387d4ae097c23d69f3247e7f08140c7">new_contact()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ab07ce9d75eae559865ed90aad2154bd7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">avatar_img </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$email</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ad4056d3ce69988f5c1a997a79f503246"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">convert_xml_element_to_array </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$xml_element</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$recursion_depth</em> = <code>0</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a469b9bd700269cd07d954f1a16c5899b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">email_header_encode </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$in_str</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$charset</em> = <code>'UTF-8'</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="boot_8php.html#a4c02d88e66852a01bd5a1feecb7c3ce3">check_config()</a>, <a class="el" href="lostpass_8php.html#a0314d94e48c789b1b3a201d740c9eab3">lostpass_content()</a>, <a class="el" href="lostpass_8php.html#a8ed35ba71a4404eaf4903da61d0321cc">lostpass_post()</a>, and <a class="el" href="classenotify.html#afbc088860f534c6c05788b48cfc262c6">enotify\send()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a1ff07d9fad93b713b93da0ab77aab7f0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">email_send </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$addr</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$subject</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$headers</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a8d5a3afb51cc932032b5dcc159efaae0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">fetch_lrdd_template </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$host</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2network_8php.html#a8122356933bcd6b0a8567e8e15ae5cc5">webfinger()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a78e89557b2fbd344ad790846d761b0c7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_capath </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2network_8php.html#aafd06c0a75402aefb06cfb9f9740fa37">z_fetch_url()</a>, and <a class="el" href="include_2network_8php.html#a9129fd55e7fc175b4ea9a195cccc16bc">z_post_url()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a4cfb2c05a1c295317283d762440ce0b2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">http_status_exit </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$val</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$msg</em> = <code>''</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>http_status_exit</p>
+<p>Send HTTP status header and exit </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype">int</td><td class="paramname">$val</td><td>integer HTTP status result value </td></tr>
+ <tr><td class="paramtype">string</td><td class="paramname">$msg</td><td>optional message </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>(does not return, process is terminated) </dd></dl>
+
+<p>Referenced by <a class="el" href="__well__known_8php.html#a6ebfa937a2024f0b5dab53f0ac90fed0">_well_known_init()</a>, <a class="el" href="items_8php.html#a04a35b610acfe54434df08adec39c0c7">get_feed_for()</a>, and <a class="el" href="poco_8php.html#a53def16f75e3d41f1d2bb7cfa4905498">poco_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a4c5d50079e089168d9248427018fffd4"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">json_return_and_die </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$x</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#aa9dc5350b26d6c7727d6c4b641ecba18">api_albums()</a>, <a class="el" href="include_2api_8php.html#a72bfecac1970bc29b853073e816388ff">api_channel_stream()</a>, <a class="el" href="include_2api_8php.html#adfc035ee6303c1d8ba5336a4ead2bd53">api_export_basic()</a>, <a class="el" href="include_2api_8php.html#aa6fc3bc8c0fad1d081db0dcc456dd77f">api_photos()</a>, <a class="el" href="dirsearch_8php.html#aa1fb04e1de4f25b63349ac78f94ceb4c">dirsearch_content()</a>, <a class="el" href="new__channel_8php.html#a1ad7f99e4366a32942c6b954aba3a164">new_channel_init()</a>, <a class="el" href="notes_8php.html#a4dbd7b1f906440746af48b484d66535a">notes_init()</a>, <a class="el" href="oexchange_8php.html#a2d8b785cd7d041a4e6274f5af370cf26">oexchange_content()</a>, <a class="el" href="post_8php.html#af4b48181ce773ef0cdfc972441445c34">post_init()</a>, <a class="el" href="post_8php.html#af59e6a1dc22d19d9257b01cd7ccedb75">post_post()</a>, <a class="el" href="register_8php.html#ae20c0cd40f738d6295de58b9202c83d5">register_init()</a>, <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>, and <a class="el" href="zotfeed_8php.html#a24dfc23d366e7f840cf2847d0c1c8eac">zotfeed_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a27a951b59d8d622c0b3e7b0673ba74c6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">parse_xml_string </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$strict</em> = <code>true</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a8794863cdf8ce1333040933d3a3f66bd">consume_feed()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ae8d9c41a11000fb8667039fc71b4f73f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">scale_external_images </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$include_link</em> = <code>true</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$scale_replace</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="bb2diaspora_8php.html#a26c09c218413610e62e60754c579f6c6">diaspora2bb()</a>, and <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a897e7112d86eb95526cbd0bff9375f02"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">validate_email </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$addr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="account_8php.html#ae052bd5558847bd38e89c213561a9771">check_account_email()</a>, and <a class="el" href="identity_8php.html#a680fbafc2db023c5b1309e0180e81315">zid_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a5caa264fab6d2b2344e6bd5b298b08f2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">validate_url </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$url</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a8122356933bcd6b0a8567e8e15ae5cc5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">webfinger </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$debug</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="webfinger_8php.html#a17dd28db6d390194bf9ecb809739d1d3">webfinger_content()</a>, and <a class="el" href="include_2network_8php.html#adf6008b38c555e98e7ed10da9ede2335">webfinger_dfrn()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="adf6008b38c555e98e7ed10da9ede2335"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">webfinger_dfrn </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$hcard</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a99353baabbc3e0584b85eb79ee802cff"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xml2array </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$contents</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$namespaces</em> = <code>true</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$get_attributes</em> = <code>1</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$priority</em> = <code>'attribute'</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p><a class="el" href="include_2network_8php.html#a99353baabbc3e0584b85eb79ee802cff">xml2array()</a> will convert the given XML text to an array in the XML structure. Link: <a href="http://www.bin-co.com/php/scripts/xml2array/">http://www.bin-co.com/php/scripts/xml2array/</a> Portions significantly re-written by <a href="#" onclick="location.href='mai'+'lto:'+'mik'+'e@'+'mac'+'gi'+'rvi'+'n.'+'com'; return false;">mike@<span style="display: none;">.nosp@m.</span>macg<span style="display: none;">.nosp@m.</span>irvin<span style="display: none;">.nosp@m.</span>.com</a> for <a class="el" href="namespaceFriendica.html">Friendica</a> (namespaces, lowercase tags, get_attribute default changed, more...) Arguments : $contents - The XML text $namespaces - true or false include namespace information in the returned array as array elements. $get_attributes - 1 or 0. If this is 1 the function will get the attributes as well as the tag values - this results in a different array structure in the return value. $priority - Can be 'tag' or 'attribute'. This will change the way the resulting array sturcture. For 'tag', the tags are given more importance. Return: The parsed XML in an array form. Use print_r() to see the resulting array structure. Examples: $array = xml2array(file_get_contents('feed.xml')); $array = xml2array(file_get_contents('feed.xml', true, 1, 'attribute')); </p>
+
+</div>
+</div>
+<a class="anchor" id="a9e9da2aafb806c98ecdc318604e60dc6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xml_status </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$st</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$message</em> = <code>''</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aafd06c0a75402aefb06cfb9f9740fa37"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">z_fetch_url </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$url</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$binary</em> = <code>false</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$redirects</em> = <code>0</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$opts</em> = <code>array()</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>z_fetch_url </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype">string</td><td class="paramname">$url</td><td>URL to fetch </td></tr>
+ <tr><td class="paramtype">boolean</td><td class="paramname">$binary</td><td>= false TRUE if asked to return binary results (file download) </td></tr>
+ <tr><td class="paramtype">int</td><td class="paramname">$redirects</td><td>= 0 internal use, recursion counter </td></tr>
+ <tr><td class="paramtype">array</td><td class="paramname">$opts</td><td>(optional parameters) 'accept_content' =&gt; supply Accept: header with 'accept_content' as the value 'timeout' =&gt; int seconds, default system config value or 60 seconds 'http_auth' =&gt; username:password 'novalidate' =&gt; do not validate SSL certs, default is to validate using our CA list</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>array 'return_code' =&gt; HTTP return code or 0 if timeout or failure 'success' =&gt; boolean true (if HTTP 2xx result) or false 'header' =&gt; HTTP headers 'body' =&gt; fetched content </dd></dl>
+
+<p>Referenced by <a class="el" href="setup_8php.html#a0c3f3b671381f6dccd924b8ecdfc56c4">check_htaccess()</a>, <a class="el" href="mod_2directory_8php.html#aac79396570d759da2efac24fcedf5b44">directory_content()</a>, <a class="el" href="dirprofile_8php.html#a3e1d30d3d93863ff5615f2df4ac7f052">dirprofile_init()</a>, <a class="el" href="import_8php.html#af17fef0410518f7eac205d0ea416eaa2">import_post()</a>, <a class="el" href="photo__driver_8php.html#a78f5a10c568d2a9bbbb129dc96548887">import_profile_photo()</a>, <a class="el" href="zot_8php.html#a56f3f65514e4e7f0cd117d01735aebd1">import_xchan()</a>, <a class="el" href="acl_8php.html#a57dceff370d4a0e7ae673d50fbfda61f">navbar_complete()</a>, <a class="el" href="include_2oembed_8php.html#a98549b9af8140eda3eceaeedcaabc2c2">oembed_fetch_url()</a>, <a class="el" href="oexchange_8php.html#a2d8b785cd7d041a4e6274f5af370cf26">oexchange_content()</a>, <a class="el" href="onepoll_8php.html#a72753b2fdec79b37c7f432035c91fb6d">onepoll_run()</a>, <a class="el" href="parse__url_8php.html#a25635549f2c22955d72465f4d2e58993">parseurl_getsiteinfo()</a>, <a class="el" href="socgraph_8php.html#a5ef8bef37161df53718a21e93d02fbd6">poco_load()</a>, <a class="el" href="pubsites_8php.html#af614e279aab54065345bda6b03eafdf0">pubsites_content()</a>, <a class="el" href="include_2network_8php.html#ae8d9c41a11000fb8667039fc71b4f73f">scale_external_images()</a>, <a class="el" href="setup_8php.html#a13cf286774149a0a7bd8adb8179cec75">setup_post()</a>, <a class="el" href="sslify_8php.html#a75b11e54a3d1fc83e7d4c0e8b4dab316">sslify_init()</a>, <a class="el" href="dir__fns_8php.html#aa666e7df6ca8c332f4081c9b66b4bdf6">sync_directories()</a>, <a class="el" href="socgraph_8php.html#a790690bb1a1d02483fe31632a160144d">update_suggestions()</a>, <a class="el" href="include_2network_8php.html#a9129fd55e7fc175b4ea9a195cccc16bc">z_post_url()</a>, <a class="el" href="zot_8php.html#a95528377d7303131958c9f0b7158fdce">zot_finger()</a>, and <a class="el" href="zot_8php.html#a5bcdfef419b16075a0eca990956223dc">zot_register_hub()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a9129fd55e7fc175b4ea9a195cccc16bc"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">z_post_url </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$url</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$params</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$redirects</em> = <code>0</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$opts</em> = <code>array()</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="oexchange_8php.html#a2d8b785cd7d041a4e6274f5af370cf26">oexchange_content()</a>, <a class="el" href="share_8php.html#afeb26046bdd02567ecd29ab5f188b249">share_init()</a>, <a class="el" href="zot_8php.html#a95528377d7303131958c9f0b7158fdce">zot_finger()</a>, <a class="el" href="zot_8php.html#a7b23bfb31d4491231e1e73bdc077240d">zot_refresh()</a>, and <a class="el" href="zot_8php.html#ab3e9b99ddb11353f37f265a05bb42142">zot_zot()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/include_2network_8php.js b/doc/html/include_2network_8php.js
new file mode 100644
index 000000000..15e2bab93
--- /dev/null
+++ b/doc/html/include_2network_8php.js
@@ -0,0 +1,23 @@
+var include_2network_8php =
+[
+ [ "allowed_email", "include_2network_8php.html#aba38458a2ff2d92d3536488dbb119694", null ],
+ [ "allowed_url", "include_2network_8php.html#aee35d9ad6b3f872bfb39ba3598936aa7", null ],
+ [ "avatar_img", "include_2network_8php.html#ab07ce9d75eae559865ed90aad2154bd7", null ],
+ [ "convert_xml_element_to_array", "include_2network_8php.html#ad4056d3ce69988f5c1a997a79f503246", null ],
+ [ "email_header_encode", "include_2network_8php.html#a469b9bd700269cd07d954f1a16c5899b", null ],
+ [ "email_send", "include_2network_8php.html#a1ff07d9fad93b713b93da0ab77aab7f0", null ],
+ [ "fetch_lrdd_template", "include_2network_8php.html#a8d5a3afb51cc932032b5dcc159efaae0", null ],
+ [ "get_capath", "include_2network_8php.html#a78e89557b2fbd344ad790846d761b0c7", null ],
+ [ "http_status_exit", "include_2network_8php.html#a4cfb2c05a1c295317283d762440ce0b2", null ],
+ [ "json_return_and_die", "include_2network_8php.html#a4c5d50079e089168d9248427018fffd4", null ],
+ [ "parse_xml_string", "include_2network_8php.html#a27a951b59d8d622c0b3e7b0673ba74c6", null ],
+ [ "scale_external_images", "include_2network_8php.html#ae8d9c41a11000fb8667039fc71b4f73f", null ],
+ [ "validate_email", "include_2network_8php.html#a897e7112d86eb95526cbd0bff9375f02", null ],
+ [ "validate_url", "include_2network_8php.html#a5caa264fab6d2b2344e6bd5b298b08f2", null ],
+ [ "webfinger", "include_2network_8php.html#a8122356933bcd6b0a8567e8e15ae5cc5", null ],
+ [ "webfinger_dfrn", "include_2network_8php.html#adf6008b38c555e98e7ed10da9ede2335", null ],
+ [ "xml2array", "include_2network_8php.html#a99353baabbc3e0584b85eb79ee802cff", null ],
+ [ "xml_status", "include_2network_8php.html#a9e9da2aafb806c98ecdc318604e60dc6", null ],
+ [ "z_fetch_url", "include_2network_8php.html#aafd06c0a75402aefb06cfb9f9740fa37", null ],
+ [ "z_post_url", "include_2network_8php.html#a9129fd55e7fc175b4ea9a195cccc16bc", null ]
+]; \ No newline at end of file
diff --git a/doc/html/include_2notify_8php.html b/doc/html/include_2notify_8php.html
new file mode 100644
index 000000000..1ea576fa0
--- /dev/null
+++ b/doc/html/include_2notify_8php.html
@@ -0,0 +1,139 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/notify.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('include_2notify_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">notify.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a0e61728e487df50c72e6434f911a57d3"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2notify_8php.html#a0e61728e487df50c72e6434f911a57d3">format_notification</a> ($item)</td></tr>
+<tr class="separator:a0e61728e487df50c72e6434f911a57d3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a0e61728e487df50c72e6434f911a57d3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">format_notification </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="ping_8php.html#a77217b1b190b4c5d8770867b45f0c0a1">ping_init()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/include_2notify_8php.js b/doc/html/include_2notify_8php.js
new file mode 100644
index 000000000..7e82eaf72
--- /dev/null
+++ b/doc/html/include_2notify_8php.js
@@ -0,0 +1,4 @@
+var include_2notify_8php =
+[
+ [ "format_notification", "include_2notify_8php.html#a0e61728e487df50c72e6434f911a57d3", null ]
+]; \ No newline at end of file
diff --git a/doc/html/include_2oembed_8php.html b/doc/html/include_2oembed_8php.html
new file mode 100644
index 000000000..b2e1efc44
--- /dev/null
+++ b/doc/html/include_2oembed_8php.html
@@ -0,0 +1,306 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/oembed.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('include_2oembed_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">oembed.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a00c4c80deffd9daf8dc97b58d4c64ed0"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2oembed_8php.html#a00c4c80deffd9daf8dc97b58d4c64ed0">oembed_replacecb</a> ($matches)</td></tr>
+<tr class="separator:a00c4c80deffd9daf8dc97b58d4c64ed0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a98549b9af8140eda3eceaeedcaabc2c2"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2oembed_8php.html#a98549b9af8140eda3eceaeedcaabc2c2">oembed_fetch_url</a> ($embedurl)</td></tr>
+<tr class="separator:a98549b9af8140eda3eceaeedcaabc2c2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a26bb4c1e330d2f94ea7b6ce2fe970cf3"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2oembed_8php.html#a26bb4c1e330d2f94ea7b6ce2fe970cf3">oembed_format_object</a> ($j)</td></tr>
+<tr class="separator:a26bb4c1e330d2f94ea7b6ce2fe970cf3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9e57f3e36a0a0a47e6db79544b701d9a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2oembed_8php.html#a9e57f3e36a0a0a47e6db79544b701d9a">oembed_iframe</a> ($src, $width, $height)</td></tr>
+<tr class="separator:a9e57f3e36a0a0a47e6db79544b701d9a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aba89ae64b355efcb4f706553d3edb6a2"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2oembed_8php.html#aba89ae64b355efcb4f706553d3edb6a2">oembed_bbcode2html</a> ($text)</td></tr>
+<tr class="separator:aba89ae64b355efcb4f706553d3edb6a2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab953a6e7c11bc6498ce01ed73e2ba319"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2oembed_8php.html#ab953a6e7c11bc6498ce01ed73e2ba319">oe_build_xpath</a> ($attr, $value)</td></tr>
+<tr class="separator:ab953a6e7c11bc6498ce01ed73e2ba319"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a03fa3b7832c98a3d0b4630afeb73d487"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2oembed_8php.html#a03fa3b7832c98a3d0b4630afeb73d487">oe_get_inner_html</a> ($node)</td></tr>
+<tr class="separator:a03fa3b7832c98a3d0b4630afeb73d487"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a000a62b97113cf95b0e9e00412168172"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2oembed_8php.html#a000a62b97113cf95b0e9e00412168172">oembed_html2bbcode</a> ($text)</td></tr>
+<tr class="separator:a000a62b97113cf95b0e9e00412168172"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="ab953a6e7c11bc6498ce01ed73e2ba319"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">oe_build_xpath </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$attr</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$value</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2oembed_8php.html#a98549b9af8140eda3eceaeedcaabc2c2">oembed_fetch_url()</a>, and <a class="el" href="include_2oembed_8php.html#a000a62b97113cf95b0e9e00412168172">oembed_html2bbcode()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a03fa3b7832c98a3d0b4630afeb73d487"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">oe_get_inner_html </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$node</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2oembed_8php.html#a000a62b97113cf95b0e9e00412168172">oembed_html2bbcode()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aba89ae64b355efcb4f706553d3edb6a2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">oembed_bbcode2html </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$text</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="bbcode_8php.html#a009f61aaf78771737ed0765c8463911b">bbcode()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a98549b9af8140eda3eceaeedcaabc2c2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">oembed_fetch_url </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$embedurl</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="mod_2oembed_8php.html#a9145025aaf057fb5d3f9f7011e5e1014">oembed_init()</a>, <a class="el" href="include_2oembed_8php.html#a00c4c80deffd9daf8dc97b58d4c64ed0">oembed_replacecb()</a>, and <a class="el" href="bbcode_8php.html#a55b0cb6973f1ec731de0e726bcc0efa7">tryoembed()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a26bb4c1e330d2f94ea7b6ce2fe970cf3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">oembed_format_object </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$j</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2oembed_8php.html#a00c4c80deffd9daf8dc97b58d4c64ed0">oembed_replacecb()</a>, and <a class="el" href="bbcode_8php.html#a55b0cb6973f1ec731de0e726bcc0efa7">tryoembed()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a000a62b97113cf95b0e9e00412168172"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">oembed_html2bbcode </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$text</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Find <span class="oembed">..<a href="url" rel="oembed">..</a></span> and replace it with [embed]url[/embed] </p>
+
+<p>Referenced by <a class="el" href="items_8php.html#a896c1809d58f2d7a42cfe14577958ddf">get_atom_elements()</a>, and <a class="el" href="mod_2oembed_8php.html#a9145025aaf057fb5d3f9f7011e5e1014">oembed_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a9e57f3e36a0a0a47e6db79544b701d9a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">oembed_iframe </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$src</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$width</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$height</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2oembed_8php.html#a26bb4c1e330d2f94ea7b6ce2fe970cf3">oembed_format_object()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a00c4c80deffd9daf8dc97b58d4c64ed0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">oembed_replacecb </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$matches</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="mod_2oembed_8php.html#a9145025aaf057fb5d3f9f7011e5e1014">oembed_init()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/include_2oembed_8php.js b/doc/html/include_2oembed_8php.js
new file mode 100644
index 000000000..5f1e16330
--- /dev/null
+++ b/doc/html/include_2oembed_8php.js
@@ -0,0 +1,11 @@
+var include_2oembed_8php =
+[
+ [ "oe_build_xpath", "include_2oembed_8php.html#ab953a6e7c11bc6498ce01ed73e2ba319", null ],
+ [ "oe_get_inner_html", "include_2oembed_8php.html#a03fa3b7832c98a3d0b4630afeb73d487", null ],
+ [ "oembed_bbcode2html", "include_2oembed_8php.html#aba89ae64b355efcb4f706553d3edb6a2", null ],
+ [ "oembed_fetch_url", "include_2oembed_8php.html#a98549b9af8140eda3eceaeedcaabc2c2", null ],
+ [ "oembed_format_object", "include_2oembed_8php.html#a26bb4c1e330d2f94ea7b6ce2fe970cf3", null ],
+ [ "oembed_html2bbcode", "include_2oembed_8php.html#a000a62b97113cf95b0e9e00412168172", null ],
+ [ "oembed_iframe", "include_2oembed_8php.html#a9e57f3e36a0a0a47e6db79544b701d9a", null ],
+ [ "oembed_replacecb", "include_2oembed_8php.html#a00c4c80deffd9daf8dc97b58d4c64ed0", null ]
+]; \ No newline at end of file
diff --git a/doc/html/include_2photos_8php.html b/doc/html/include_2photos_8php.html
new file mode 100644
index 000000000..2e9d67da2
--- /dev/null
+++ b/doc/html/include_2photos_8php.html
@@ -0,0 +1,403 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/photos.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('include_2photos_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">photos.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a6c40ef58aefef705a5adc84a40e97109"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2photos_8php.html#a6c40ef58aefef705a5adc84a40e97109">photo_upload</a> ($channel, $observer, $args)</td></tr>
+<tr class="separator:a6c40ef58aefef705a5adc84a40e97109"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aedccaf18282b26899d9549c29bd9d1b9"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2photos_8php.html#aedccaf18282b26899d9549c29bd9d1b9">photos_albums_list</a> ($channel, $observer)</td></tr>
+<tr class="separator:aedccaf18282b26899d9549c29bd9d1b9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af24c6aeed28ecc31ec39e7d9a1804979"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2photos_8php.html#af24c6aeed28ecc31ec39e7d9a1804979">photos_album_widget</a> ($channelx, $observer, $albums=null)</td></tr>
+<tr class="separator:af24c6aeed28ecc31ec39e7d9a1804979"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa27b9e435dcc34e1009f56dc02c7ca51"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2photos_8php.html#aa27b9e435dcc34e1009f56dc02c7ca51">photos_list_photos</a> ($channel, $observer, $album= '')</td></tr>
+<tr class="separator:aa27b9e435dcc34e1009f56dc02c7ca51"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8e8b7be99e24c2497bc2cb3339280c35"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2photos_8php.html#a8e8b7be99e24c2497bc2cb3339280c35">photos_album_exists</a> ($channel_id, $album)</td></tr>
+<tr class="separator:a8e8b7be99e24c2497bc2cb3339280c35"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab0365f25b22ccea5f085fe7c49e1f4ab"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2photos_8php.html#ab0365f25b22ccea5f085fe7c49e1f4ab">photos_album_rename</a> ($channel_id, $oldname, $newname)</td></tr>
+<tr class="separator:ab0365f25b22ccea5f085fe7c49e1f4ab"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7e7abc69872180697c5471dc69349afe"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2photos_8php.html#a7e7abc69872180697c5471dc69349afe">photos_album_get_db_idstr</a> ($channel_id, $album, $remote_xchan= '')</td></tr>
+<tr class="separator:a7e7abc69872180697c5471dc69349afe"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad648c0c5544fe9263409b6f6e57c6274"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2photos_8php.html#ad648c0c5544fe9263409b6f6e57c6274">photos_create_item</a> ($channel, $creator_hash, $photo, $visible=false)</td></tr>
+<tr class="separator:ad648c0c5544fe9263409b6f6e57c6274"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a6c40ef58aefef705a5adc84a40e97109"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_upload </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$observer</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$args</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Determine the album to use</p>
+<p>We create a wall item for every photo, but we don't want to overwhelm the data stream with a hundred newly uploaded photos. So we will make the first photo uploaded to this album in the last several hours visible by default, the rest will become visible over time when and if they acquire comments, likes, dislikes, and/or tags</p>
+
+<p>Referenced by <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>, and <a class="el" href="wall__upload_8php.html#a7cbe204244cf9e0380ee932263a74d8f">wall_upload_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a8e8b7be99e24c2497bc2cb3339280c35"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photos_album_exists </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel_id</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$album</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a7e7abc69872180697c5471dc69349afe"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photos_album_get_db_idstr </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel_id</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$album</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$remote_xchan</em> = <code>''</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ab0365f25b22ccea5f085fe7c49e1f4ab"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photos_album_rename </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel_id</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$oldname</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$newname</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="af24c6aeed28ecc31ec39e7d9a1804979"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photos_album_widget </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channelx</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$observer</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$albums</em> = <code>null</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="widgets_8php.html#a702e2fc0adc9b615999eca18b7311b5e">widget_photo_albums()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aedccaf18282b26899d9549c29bd9d1b9"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photos_albums_list </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$observer</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#aa9dc5350b26d6c7727d6c4b641ecba18">api_albums()</a>, <a class="el" href="include_2photos_8php.html#af24c6aeed28ecc31ec39e7d9a1804979">photos_album_widget()</a>, and <a class="el" href="mod_2photos_8php.html#aa87382611a66ec5effdb2d78f13f5812">photos_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ad648c0c5544fe9263409b6f6e57c6274"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photos_create_item </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$creator_hash</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$photo</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$visible</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa27b9e435dcc34e1009f56dc02c7ca51"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photos_list_photos </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$observer</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$album</em> = <code>''</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#aa6fc3bc8c0fad1d081db0dcc456dd77f">api_photos()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/include_2photos_8php.js b/doc/html/include_2photos_8php.js
new file mode 100644
index 000000000..f96bfc915
--- /dev/null
+++ b/doc/html/include_2photos_8php.js
@@ -0,0 +1,11 @@
+var include_2photos_8php =
+[
+ [ "photo_upload", "include_2photos_8php.html#a6c40ef58aefef705a5adc84a40e97109", null ],
+ [ "photos_album_exists", "include_2photos_8php.html#a8e8b7be99e24c2497bc2cb3339280c35", null ],
+ [ "photos_album_get_db_idstr", "include_2photos_8php.html#a7e7abc69872180697c5471dc69349afe", null ],
+ [ "photos_album_rename", "include_2photos_8php.html#ab0365f25b22ccea5f085fe7c49e1f4ab", null ],
+ [ "photos_album_widget", "include_2photos_8php.html#af24c6aeed28ecc31ec39e7d9a1804979", null ],
+ [ "photos_albums_list", "include_2photos_8php.html#aedccaf18282b26899d9549c29bd9d1b9", null ],
+ [ "photos_create_item", "include_2photos_8php.html#ad648c0c5544fe9263409b6f6e57c6274", null ],
+ [ "photos_list_photos", "include_2photos_8php.html#aa27b9e435dcc34e1009f56dc02c7ca51", null ]
+]; \ No newline at end of file
diff --git a/doc/html/include_2settings_8php.html b/doc/html/include_2settings_8php.html
new file mode 100644
index 000000000..c938f95cf
--- /dev/null
+++ b/doc/html/include_2settings_8php.html
@@ -0,0 +1,150 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/settings.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rhash-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('include_2settings_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">settings.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ac34e479d27f32b82dd6b33542f81a6a7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2settings_8php.html#ac34e479d27f32b82dd6b33542f81a6a7">build_sync_packet</a> ($uid=0, $packet=null)</td></tr>
+<tr class="separator:ac34e479d27f32b82dd6b33542f81a6a7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="ac34e479d27f32b82dd6b33542f81a6a7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">build_sync_packet </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em> = <code>0</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$packet</em> = <code>null</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Send a zot packet to all hubs where this channel is duplicated, refreshing such things as personal settings, channel permissions, address book updates, etc. </p>
+
+<p>Referenced by <a class="el" href="connections_8php.html#a15af118efee9c948b6f8294e54a73bb2">connections_clone()</a>, and <a class="el" href="mod_2settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586">settings_post()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/include_2settings_8php.js b/doc/html/include_2settings_8php.js
new file mode 100644
index 000000000..9bca76f88
--- /dev/null
+++ b/doc/html/include_2settings_8php.js
@@ -0,0 +1,4 @@
+var include_2settings_8php =
+[
+ [ "build_sync_packet", "include_2settings_8php.html#ac34e479d27f32b82dd6b33542f81a6a7", null ]
+]; \ No newline at end of file
diff --git a/doc/html/index.html b/doc/html/index.html
new file mode 100644
index 000000000..3d2dc4d76
--- /dev/null
+++ b/doc/html/index.html
@@ -0,0 +1,106 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Main Page</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li class="current"><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('index.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">The Red Matrix Documentation</div> </div>
+</div><!--header-->
+<div class="contents">
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/interfaceITemplateEngine-members.html b/doc/html/interfaceITemplateEngine-members.html
new file mode 100644
index 000000000..d0f6d96cb
--- /dev/null
+++ b/doc/html/interfaceITemplateEngine-members.html
@@ -0,0 +1,119 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('interfaceITemplateEngine.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">ITemplateEngine Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="interfaceITemplateEngine.html">ITemplateEngine</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="interfaceITemplateEngine.html#aaf2698adbf46c073c24b162fe1b1c442">get_markup_template</a>($file, $root='')</td><td class="entry"><a class="el" href="interfaceITemplateEngine.html">ITemplateEngine</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="interfaceITemplateEngine.html#aaa7381c8becc3d1c1790b53988a0f243">replace_macros</a>($s, $v)</td><td class="entry"><a class="el" href="interfaceITemplateEngine.html">ITemplateEngine</a></td><td class="entry"></td></tr>
+</table></div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/interfaceITemplateEngine.html b/doc/html/interfaceITemplateEngine.html
new file mode 100644
index 000000000..ae3452db8
--- /dev/null
+++ b/doc/html/interfaceITemplateEngine.html
@@ -0,0 +1,197 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: ITemplateEngine Interface Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('interfaceITemplateEngine.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="interfaceITemplateEngine-members.html">List of all members</a> </div>
+ <div class="headertitle">
+<div class="title">ITemplateEngine Interface Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="dynheader">
+Inheritance diagram for ITemplateEngine:</div>
+<div class="dyncontent">
+ <div class="center">
+ <img src="interfaceITemplateEngine.png" usemap="#ITemplateEngine_map" alt=""/>
+ <map id="ITemplateEngine_map" name="ITemplateEngine_map">
+<area href="classFriendicaSmartyEngine.html" alt="FriendicaSmartyEngine" shape="rect" coords="0,56,144,80"/>
+<area href="classTemplate.html" alt="Template" shape="rect" coords="154,56,298,80"/>
+</map>
+ </div></div>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:aaa7381c8becc3d1c1790b53988a0f243"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="interfaceITemplateEngine.html#aaa7381c8becc3d1c1790b53988a0f243">replace_macros</a> ($s, $v)</td></tr>
+<tr class="separator:aaa7381c8becc3d1c1790b53988a0f243"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aaf2698adbf46c073c24b162fe1b1c442"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="interfaceITemplateEngine.html#aaf2698adbf46c073c24b162fe1b1c442">get_markup_template</a> ($file, $root='')</td></tr>
+<tr class="separator:aaf2698adbf46c073c24b162fe1b1c442"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Interface for template engines </p>
+</div><h2 class="groupheader">Member Function Documentation</h2>
+<a class="anchor" id="aaf2698adbf46c073c24b162fe1b1c442"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">ITemplateEngine::get_markup_template </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$file</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$root</em> = <code>''</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Implemented in <a class="el" href="classTemplate.html#afd97b4b1e7754a550e67c0ea79159059">Template</a>, and <a class="el" href="classFriendicaSmartyEngine.html#aab5994077fc3a64222e41b28e2bd8d88">FriendicaSmartyEngine</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aaa7381c8becc3d1c1790b53988a0f243"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">ITemplateEngine::replace_macros </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$v</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Implemented in <a class="el" href="classTemplate.html#a07737733f6949bdedea1e3d301b2ab7b">Template</a>, and <a class="el" href="classFriendicaSmartyEngine.html#ad62f1181d2f02b54b46731ad2bd46db2">FriendicaSmartyEngine</a>.</p>
+
+</div>
+</div>
+<hr/>The documentation for this interface was generated from the following file:<ul>
+<li>include/<a class="el" href="ITemplateEngine_8php.html">ITemplateEngine.php</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/interfaceITemplateEngine.js b/doc/html/interfaceITemplateEngine.js
new file mode 100644
index 000000000..b6e108520
--- /dev/null
+++ b/doc/html/interfaceITemplateEngine.js
@@ -0,0 +1,5 @@
+var interfaceITemplateEngine =
+[
+ [ "get_markup_template", "interfaceITemplateEngine.html#aaf2698adbf46c073c24b162fe1b1c442", null ],
+ [ "replace_macros", "interfaceITemplateEngine.html#aaa7381c8becc3d1c1790b53988a0f243", null ]
+]; \ No newline at end of file
diff --git a/doc/html/interfaceITemplateEngine.png b/doc/html/interfaceITemplateEngine.png
new file mode 100644
index 000000000..f61b50d22
--- /dev/null
+++ b/doc/html/interfaceITemplateEngine.png
Binary files differ
diff --git a/doc/html/intro_8php.html b/doc/html/intro_8php.html
new file mode 100644
index 000000000..50850d8f6
--- /dev/null
+++ b/doc/html/intro_8php.html
@@ -0,0 +1,173 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/intro.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('intro_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">intro.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:af3681062183ccbdf065ae2647b07d6f1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="intro_8php.html#af3681062183ccbdf065ae2647b07d6f1">intro_post</a> (&amp;$a)</td></tr>
+<tr class="separator:af3681062183ccbdf065ae2647b07d6f1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abc3abf25da64f98f215126eb08c7936b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="intro_8php.html#abc3abf25da64f98f215126eb08c7936b">intro_aside</a> (&amp;$a)</td></tr>
+<tr class="separator:abc3abf25da64f98f215126eb08c7936b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3e2a523697633ddb4517b9266a515f5b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="intro_8php.html#a3e2a523697633ddb4517b9266a515f5b">intro_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a3e2a523697633ddb4517b9266a515f5b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="abc3abf25da64f98f215126eb08c7936b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">intro_aside </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a3e2a523697633ddb4517b9266a515f5b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">intro_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="af3681062183ccbdf065ae2647b07d6f1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">intro_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/intro_8php.js b/doc/html/intro_8php.js
new file mode 100644
index 000000000..f93a2dcdc
--- /dev/null
+++ b/doc/html/intro_8php.js
@@ -0,0 +1,6 @@
+var intro_8php =
+[
+ [ "intro_aside", "intro_8php.html#abc3abf25da64f98f215126eb08c7936b", null ],
+ [ "intro_content", "intro_8php.html#a3e2a523697633ddb4517b9266a515f5b", null ],
+ [ "intro_post", "intro_8php.html#af3681062183ccbdf065ae2647b07d6f1", null ]
+]; \ No newline at end of file
diff --git a/doc/html/invite_8php.html b/doc/html/invite_8php.html
new file mode 100644
index 000000000..e52b88602
--- /dev/null
+++ b/doc/html/invite_8php.html
@@ -0,0 +1,157 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/invite.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('invite_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">invite.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:aeb0881c0f93c8e8552e5ed756ce6e5a5"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="invite_8php.html#aeb0881c0f93c8e8552e5ed756ce6e5a5">invite_post</a> (&amp;$a)</td></tr>
+<tr class="separator:aeb0881c0f93c8e8552e5ed756ce6e5a5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a244385b28cfd021d308715f01158bfd9"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="invite_8php.html#a244385b28cfd021d308715f01158bfd9">invite_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a244385b28cfd021d308715f01158bfd9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a244385b28cfd021d308715f01158bfd9"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">invite_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aeb0881c0f93c8e8552e5ed756ce6e5a5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">invite_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>module: <a class="el" href="invite_8php.html">invite.php</a></p>
+<p>send email invitations to join social network </p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/invite_8php.js b/doc/html/invite_8php.js
new file mode 100644
index 000000000..35604353d
--- /dev/null
+++ b/doc/html/invite_8php.js
@@ -0,0 +1,5 @@
+var invite_8php =
+[
+ [ "invite_content", "invite_8php.html#a244385b28cfd021d308715f01158bfd9", null ],
+ [ "invite_post", "invite_8php.html#aeb0881c0f93c8e8552e5ed756ce6e5a5", null ]
+]; \ No newline at end of file
diff --git a/doc/html/iquery_8php.html b/doc/html/iquery_8php.html
new file mode 100644
index 000000000..f508cdcf3
--- /dev/null
+++ b/doc/html/iquery_8php.html
@@ -0,0 +1,147 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Project: include/iquery.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="r!-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Project
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('iquery_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">iquery.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:aa41c07bf856eb8b386430cc53d80d4ac"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="iquery_8php.html#aa41c07bf856eb8b386430cc53d80d4ac">network_query</a> ($a, $arr)</td></tr>
+<tr class="separator:aa41c07bf856eb8b386430cc53d80d4ac"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="aa41c07bf856eb8b386430cc53d80d4ac"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">network_query </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/iquery_8php.js b/doc/html/iquery_8php.js
new file mode 100644
index 000000000..d56bfffa6
--- /dev/null
+++ b/doc/html/iquery_8php.js
@@ -0,0 +1,4 @@
+var iquery_8php =
+[
+ [ "network_query", "iquery_8php.html#aa41c07bf856eb8b386430cc53d80d4ac", null ]
+]; \ No newline at end of file
diff --git a/doc/html/item_8php.html b/doc/html/item_8php.html
new file mode 100644
index 000000000..c8709a1eb
--- /dev/null
+++ b/doc/html/item_8php.html
@@ -0,0 +1,380 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/item.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('item_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">item.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a693cd09805755ab85bbb5ecae69a48c3"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post</a> (&amp;$a)</td></tr>
+<tr class="separator:a693cd09805755ab85bbb5ecae69a48c3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a764bbb2e9a885a86fb23d0b5e4a09221"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="item_8php.html#a764bbb2e9a885a86fb23d0b5e4a09221">item_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a764bbb2e9a885a86fb23d0b5e4a09221"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa22feef4de326e1d7078dedd892e615c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="item_8php.html#aa22feef4de326e1d7078dedd892e615c">handle_tag</a> ($a, &amp;$body, &amp;$access_tag, &amp;$str_tags, $profile_uid, $tag)</td></tr>
+<tr class="separator:aa22feef4de326e1d7078dedd892e615c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7b63a9d0cd02096e17dcf11f4afa7c10"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="item_8php.html#a7b63a9d0cd02096e17dcf11f4afa7c10">fix_attached_photo_permissions</a> ($uid, $xchan_hash, $body, $str_contact_allow, $str_group_allow, $str_contact_deny, $str_group_deny)</td></tr>
+<tr class="separator:a7b63a9d0cd02096e17dcf11f4afa7c10"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3daae7944f737bd30412a0d042207c0f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="item_8php.html#a3daae7944f737bd30412a0d042207c0f">fix_attached_file_permissions</a> ($channel, $observer_hash, $body, $str_contact_allow, $str_group_allow, $str_contact_deny, $str_group_deny)</td></tr>
+<tr class="separator:a3daae7944f737bd30412a0d042207c0f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5b1b36cb301a94b38150074f0d424e74"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="item_8php.html#a5b1b36cb301a94b38150074f0d424e74">item_check_service_class</a> ($channel_id, $iswebpage)</td></tr>
+<tr class="separator:a5b1b36cb301a94b38150074f0d424e74"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a3daae7944f737bd30412a0d042207c0f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">fix_attached_file_permissions </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$observer_hash</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$body</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$str_contact_allow</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$str_group_allow</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$str_contact_deny</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$str_group_deny</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a7b63a9d0cd02096e17dcf11f4afa7c10"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">fix_attached_photo_permissions </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$xchan_hash</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$body</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$str_contact_allow</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$str_group_allow</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$str_contact_deny</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$str_group_deny</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa22feef4de326e1d7078dedd892e615c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">handle_tag </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$body</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$access_tag</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$str_tags</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$profile_uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$tag</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>This function removes the tag $tag from the text $body and replaces it with the appropiate link.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype">unknown_type</td><td class="paramname">$body</td><td>the text to replace the tag in </td></tr>
+ <tr><td class="paramtype">unknown_type</td><td class="paramname">$access_tag</td><td>- used to return tag ACL exclusions e.g. @!foo </td></tr>
+ <tr><td class="paramtype">unknown_type</td><td class="paramname">$str_tags</td><td>string to add the tag to </td></tr>
+ <tr><td class="paramtype">unknown_type</td><td class="paramname">$profile_uid</td><td></td></tr>
+ <tr><td class="paramtype">unknown_type</td><td class="paramname">$tag</td><td>the tag to replace</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>boolean true if replaced, false if not replaced </dd></dl>
+
+<p>Referenced by <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a5b1b36cb301a94b38150074f0d424e74"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">item_check_service_class </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel_id</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$iswebpage</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a764bbb2e9a885a86fb23d0b5e4a09221"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">item_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a693cd09805755ab85bbb5ecae69a48c3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">item_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>This is the POST destination for most all locally posted text stuff. This function handles status, wall-to-wall status, local comments, and remote coments that are posted on this site (as opposed to being delivered in a feed). Also processed here are posts and comments coming through the statusnet/twitter API. All of these become an "item" which is our basic unit of information. Posts that originate externally or do not fall into the above posting categories go through <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">item_store()</a> instead of this function. </p>
+<p>Is this a reply to something?</p>
+<p>fix naked links by passing through a callback to see if this is a red site (already known to us) which will get a zrl, otherwise link with url</p>
+<p>When a photo was uploaded into the message using the (profile wall) ajax uploader, The permissions are initially set to disallow anybody but the owner from seeing it. This is because the permissions may not yet have been set for the post. If it's private, the photo permissions should be set appropriately. But we didn't know the final permissions on the post until now. So now we'll look for links of uploaded photos and attachments that are in the post and set them to the same permissions as the post itself.</p>
+<p>If the post was end-to-end encrypted we can't find images and attachments in the body, use our media_str input instead which only contains these elements - but only do this when encrypted content exists because the photo/attachment may have been removed from the post and we should keep it private. If it's encrypted we have no way of knowing so we'll set the permissions regardless and realise that the media may not be referenced in the post.</p>
+<p>Fold multi-line [code] sequences</p>
+<p>Look for any tags and linkify them</p>
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#a450d8732b7b608f7ac929aee61572b95">api_statuses_mediap()</a>, <a class="el" href="include_2api_8php.html#ae0fa388479cace9c5a7a45b571ab42f8">api_statuses_repeat()</a>, <a class="el" href="include_2api_8php.html#ad4d1634df6b35126552324683caaffa2">api_statuses_update()</a>, and <a class="el" href="oexchange_8php.html#a2d8b785cd7d041a4e6274f5af370cf26">oexchange_content()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/item_8php.js b/doc/html/item_8php.js
new file mode 100644
index 000000000..6fe342a64
--- /dev/null
+++ b/doc/html/item_8php.js
@@ -0,0 +1,9 @@
+var item_8php =
+[
+ [ "fix_attached_file_permissions", "item_8php.html#a3daae7944f737bd30412a0d042207c0f", null ],
+ [ "fix_attached_photo_permissions", "item_8php.html#a7b63a9d0cd02096e17dcf11f4afa7c10", null ],
+ [ "handle_tag", "item_8php.html#aa22feef4de326e1d7078dedd892e615c", null ],
+ [ "item_check_service_class", "item_8php.html#a5b1b36cb301a94b38150074f0d424e74", null ],
+ [ "item_content", "item_8php.html#a764bbb2e9a885a86fb23d0b5e4a09221", null ],
+ [ "item_post", "item_8php.html#a693cd09805755ab85bbb5ecae69a48c3", null ]
+]; \ No newline at end of file
diff --git a/doc/html/items_8php.html b/doc/html/items_8php.html
new file mode 100644
index 000000000..14c34b581
--- /dev/null
+++ b/doc/html/items_8php.html
@@ -0,0 +1,1658 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/items.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('items_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">items.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a01e3cf44e082fa9bd06dcde5bf713d70"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#a01e3cf44e082fa9bd06dcde5bf713d70">collect_recipients</a> ($item, &amp;$private)</td></tr>
+<tr class="separator:a01e3cf44e082fa9bd06dcde5bf713d70"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1e75047cf175aaee8dd16aa761913ff9"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#a1e75047cf175aaee8dd16aa761913ff9">can_comment_on_post</a> ($observer_xchan, $item)</td></tr>
+<tr class="separator:a1e75047cf175aaee8dd16aa761913ff9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4e6d7639431e0dd8e9f4dba8e1ac408b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#a4e6d7639431e0dd8e9f4dba8e1ac408b">red_zrl_callback</a> ($matches)</td></tr>
+<tr class="separator:a4e6d7639431e0dd8e9f4dba8e1ac408b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a410f9c743877c125ca06312373346903"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#a410f9c743877c125ca06312373346903">post_activity_item</a> ($arr)</td></tr>
+<tr class="separator:a410f9c743877c125ca06312373346903"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a079e099e15d88d47aeb6ca6d60da7107"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#a079e099e15d88d47aeb6ca6d60da7107">get_public_feed</a> ($channel, $params)</td></tr>
+<tr class="separator:a079e099e15d88d47aeb6ca6d60da7107"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a04a35b610acfe54434df08adec39c0c7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#a04a35b610acfe54434df08adec39c0c7">get_feed_for</a> ($channel, $observer_hash, $params)</td></tr>
+<tr class="separator:a04a35b610acfe54434df08adec39c0c7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8f3c85c584ccd2b98c3ca440e45b40f8"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#a8f3c85c584ccd2b98c3ca440e45b40f8">construct_verb</a> ($item)</td></tr>
+<tr class="separator:a8f3c85c584ccd2b98c3ca440e45b40f8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa9e99613d38a97b39c8cf5449699c2ee"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#aa9e99613d38a97b39c8cf5449699c2ee">construct_activity_object</a> ($item)</td></tr>
+<tr class="separator:aa9e99613d38a97b39c8cf5449699c2ee"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa579bc4445d60098b1410961ca8e96b7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#aa579bc4445d60098b1410961ca8e96b7">construct_activity_target</a> ($item)</td></tr>
+<tr class="separator:aa579bc4445d60098b1410961ca8e96b7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af94c281016c6c912d06e064113336c5c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#af94c281016c6c912d06e064113336c5c">limit_body_size</a> ($body)</td></tr>
+<tr class="separator:af94c281016c6c912d06e064113336c5c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa371905f0a211b307cb3f7188c6cba04"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#aa371905f0a211b307cb3f7188c6cba04">title_is_body</a> ($title, $body)</td></tr>
+<tr class="separator:aa371905f0a211b307cb3f7188c6cba04"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a536d0313b6ffe33b9d2490c4e25c5361"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#a536d0313b6ffe33b9d2490c4e25c5361">get_item_elements</a> ($<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>)</td></tr>
+<tr class="separator:a536d0313b6ffe33b9d2490c4e25c5361"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae73794179b62d39bb597ff670ab1c1e5"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#ae73794179b62d39bb597ff670ab1c1e5">import_author_xchan</a> ($<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>)</td></tr>
+<tr class="separator:ae73794179b62d39bb597ff670ab1c1e5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a82955cc578f0fa600acec84475026194"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#a82955cc578f0fa600acec84475026194">encode_item</a> ($item)</td></tr>
+<tr class="separator:a82955cc578f0fa600acec84475026194"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac1fcf621dce7370515b420a7753f4726"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#ac1fcf621dce7370515b420a7753f4726">map_scope</a> ($scope)</td></tr>
+<tr class="separator:ac1fcf621dce7370515b420a7753f4726"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a566c601726697e044e75284af7fb6f17"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#a566c601726697e044e75284af7fb6f17">encode_item_xchan</a> ($xchan)</td></tr>
+<tr class="separator:a566c601726697e044e75284af7fb6f17"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac6673627d289ee4f547de0fe3b7acd0a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#ac6673627d289ee4f547de0fe3b7acd0a">encode_item_terms</a> ($terms)</td></tr>
+<tr class="separator:ac6673627d289ee4f547de0fe3b7acd0a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad34827ed330898456783fb14c7b46154"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#ad34827ed330898456783fb14c7b46154">termtype</a> ($<a class="el" href="language_8php.html#aae0c3638fb476ae1e31f8d242f5dac04">t</a>)</td></tr>
+<tr class="separator:ad34827ed330898456783fb14c7b46154"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a56b2a4abcadfac71175cd50555528cc3"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#a56b2a4abcadfac71175cd50555528cc3">decode_tags</a> ($<a class="el" href="language_8php.html#aae0c3638fb476ae1e31f8d242f5dac04">t</a>)</td></tr>
+<tr class="separator:a56b2a4abcadfac71175cd50555528cc3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a36e656667193c83aa2cc03a024fc131b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#a36e656667193c83aa2cc03a024fc131b">activity_sanitise</a> ($arr)</td></tr>
+<tr class="separator:a36e656667193c83aa2cc03a024fc131b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abf7a1b73eb352d79acd36309b0dababd"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#abf7a1b73eb352d79acd36309b0dababd">array_sanitise</a> ($arr)</td></tr>
+<tr class="separator:abf7a1b73eb352d79acd36309b0dababd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5f690fc2484abec07840b4f9dd525bd9"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#a5f690fc2484abec07840b4f9dd525bd9">encode_item_flags</a> ($item)</td></tr>
+<tr class="separator:a5f690fc2484abec07840b4f9dd525bd9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2d840c74ed23d1b6c7daee05cf89dda7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#a2d840c74ed23d1b6c7daee05cf89dda7">encode_mail</a> ($item)</td></tr>
+<tr class="separator:a2d840c74ed23d1b6c7daee05cf89dda7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a94ddb1d6c8fa21dd7433677e85168037"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#a94ddb1d6c8fa21dd7433677e85168037">get_mail_elements</a> ($<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>)</td></tr>
+<tr class="separator:a94ddb1d6c8fa21dd7433677e85168037"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a251343637ff40a50cca93452cd530c26"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#a251343637ff40a50cca93452cd530c26">get_profile_elements</a> ($<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>)</td></tr>
+<tr class="separator:a251343637ff40a50cca93452cd530c26"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a896c1809d58f2d7a42cfe14577958ddf"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#a896c1809d58f2d7a42cfe14577958ddf">get_atom_elements</a> ($feed, $item)</td></tr>
+<tr class="separator:a896c1809d58f2d7a42cfe14577958ddf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa723c0571e314a1853a24c5854b4f54f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#aa723c0571e314a1853a24c5854b4f54f">encode_rel_links</a> ($links)</td></tr>
+<tr class="separator:aa723c0571e314a1853a24c5854b4f54f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2541e6861a56d145c9281877cc501615"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">item_store</a> ($arr, $allow_exec=false)</td></tr>
+<tr class="separator:a2541e6861a56d145c9281877cc501615"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acf0bf7c9d21ac84f32effb754f7ad484"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#acf0bf7c9d21ac84f32effb754f7ad484">item_store_update</a> ($arr, $allow_exec=false)</td></tr>
+<tr class="separator:acf0bf7c9d21ac84f32effb754f7ad484"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aab9e0c58247427126de0699c729c3b6c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#aab9e0c58247427126de0699c729c3b6c">send_status_notifications</a> ($post_id, $item)</td></tr>
+<tr class="separator:aab9e0c58247427126de0699c729c3b6c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aab9c6bae4c40799867596bdaae9829fd"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#aab9c6bae4c40799867596bdaae9829fd">get_item_contact</a> ($item, $contacts)</td></tr>
+<tr class="separator:aab9c6bae4c40799867596bdaae9829fd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab1bce4261bcf75ad62753b498a144d17"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#ab1bce4261bcf75ad62753b498a144d17">tag_deliver</a> ($uid, $item_id)</td></tr>
+<tr class="separator:ab1bce4261bcf75ad62753b498a144d17"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a88c6cf7649ac836fbbed82a7a0315110"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#a88c6cf7649ac836fbbed82a7a0315110">tgroup_check</a> ($uid, $item)</td></tr>
+<tr class="separator:a88c6cf7649ac836fbbed82a7a0315110"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a87ac9e359591721a824ecd23bbb56296"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#a87ac9e359591721a824ecd23bbb56296">check_item_source</a> ($uid, $item)</td></tr>
+<tr class="separator:a87ac9e359591721a824ecd23bbb56296"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a77da7ce9a117601d49ac4a67c71b514f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#a77da7ce9a117601d49ac4a67c71b514f">mail_store</a> ($arr)</td></tr>
+<tr class="separator:a77da7ce9a117601d49ac4a67c71b514f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8794863cdf8ce1333040933d3a3f66bd"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#a8794863cdf8ce1333040933d3a3f66bd">consume_feed</a> ($xml, $importer, &amp;$contact, &amp;$hub, $datedir=0, $pass=0)</td></tr>
+<tr class="separator:a8794863cdf8ce1333040933d3a3f66bd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a016dd86c827d08db89061ea81d15c6cb"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#a016dd86c827d08db89061ea81d15c6cb">atom_author</a> ($tag, $name, $uri, $h, $w, $type, $photo)</td></tr>
+<tr class="separator:a016dd86c827d08db89061ea81d15c6cb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a275108c050f7eb18bcbb5018e6b81cf6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#a275108c050f7eb18bcbb5018e6b81cf6">atom_entry</a> ($item, $type, $author, $owner, $comment=false, $cid=0)</td></tr>
+<tr class="separator:a275108c050f7eb18bcbb5018e6b81cf6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aba98fcbbcd7044a7e9ea34edabc14c87"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#aba98fcbbcd7044a7e9ea34edabc14c87">fix_private_photos</a> ($s, $uid, $item=null, $cid=0)</td></tr>
+<tr class="separator:aba98fcbbcd7044a7e9ea34edabc14c87"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a77051724d1784074ff187e73a4db93fe"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#a77051724d1784074ff187e73a4db93fe">has_permissions</a> ($obj)</td></tr>
+<tr class="separator:a77051724d1784074ff187e73a4db93fe"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0790a4550b829e85504af548623002ca"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#a0790a4550b829e85504af548623002ca">compare_permissions</a> ($obj1, $obj2)</td></tr>
+<tr class="separator:a0790a4550b829e85504af548623002ca"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afbcf26dfcf8a83fff952aa858c1b7b67"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#afbcf26dfcf8a83fff952aa858c1b7b67">enumerate_permissions</a> ($obj)</td></tr>
+<tr class="separator:afbcf26dfcf8a83fff952aa858c1b7b67"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a649dc3e53ed794d0ead4b5d037f8d8d7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#a649dc3e53ed794d0ead4b5d037f8d8d7">item_getfeedtags</a> ($item)</td></tr>
+<tr class="separator:a649dc3e53ed794d0ead4b5d037f8d8d7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a09d425596b9f8663472cf7474ad36d96"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#a09d425596b9f8663472cf7474ad36d96">item_getfeedattach</a> ($item)</td></tr>
+<tr class="separator:a09d425596b9f8663472cf7474ad36d96"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6f7e1334af5d684a987fa6a3eb37f4cc"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#a6f7e1334af5d684a987fa6a3eb37f4cc">item_expire</a> ($uid, $days)</td></tr>
+<tr class="separator:a6f7e1334af5d684a987fa6a3eb37f4cc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a668ece2c37f05cc3abe538eb0dabfe55"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#a668ece2c37f05cc3abe538eb0dabfe55">drop_items</a> ($items)</td></tr>
+<tr class="separator:a668ece2c37f05cc3abe538eb0dabfe55"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afa1db13c2a8b73b5b17b97f17e5a19d1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#afa1db13c2a8b73b5b17b97f17e5a19d1">drop_item</a> ($id, $interactive=true)</td></tr>
+<tr class="separator:afa1db13c2a8b73b5b17b97f17e5a19d1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2b56a4c01bd22a648d52ec9af1a04259"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#a2b56a4c01bd22a648d52ec9af1a04259">delete_item_lowlevel</a> ($item)</td></tr>
+<tr class="separator:a2b56a4c01bd22a648d52ec9af1a04259"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0cf98bb619f07dd18f602683a55a5f59"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#a0cf98bb619f07dd18f602683a55a5f59">first_post_date</a> ($uid, $wall=false)</td></tr>
+<tr class="separator:a0cf98bb619f07dd18f602683a55a5f59"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad2abb4644ff1f20fefbc80326fe01cf0"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#ad2abb4644ff1f20fefbc80326fe01cf0">posted_dates</a> ($uid, $wall)</td></tr>
+<tr class="separator:ad2abb4644ff1f20fefbc80326fe01cf0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abe695dd89e1e10ed042c26b80114f0ed"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#abe695dd89e1e10ed042c26b80114f0ed">posted_date_widget</a> ($url, $uid, $wall)</td></tr>
+<tr class="separator:abe695dd89e1e10ed042c26b80114f0ed"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:adf980098b6de9c3993bc3ff26a8dd6f9"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#adf980098b6de9c3993bc3ff26a8dd6f9">fetch_post_tags</a> ($items, $link=false)</td></tr>
+<tr class="separator:adf980098b6de9c3993bc3ff26a8dd6f9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a004e89d86b0f29b2c4da20108ecc4091"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#a004e89d86b0f29b2c4da20108ecc4091">zot_feed</a> ($uid, $observer_xchan, $mindate)</td></tr>
+<tr class="separator:a004e89d86b0f29b2c4da20108ecc4091"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a756738301f2ed96be50232500677d58a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#a756738301f2ed96be50232500677d58a">items_fetch</a> ($arr, $channel=null, $observer_hash=null, $client_mode=<a class="el" href="boot_8php.html#a43c6c7d84d880e9500bd4f8f8ecc5731">CLIENT_MODE_NORMAL</a>, $module= 'network')</td></tr>
+<tr class="separator:a756738301f2ed96be50232500677d58a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2baa9e05f1e8aa3dd61c85803ae39bd6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#a2baa9e05f1e8aa3dd61c85803ae39bd6">update_remote_id</a> ($channel, $post_id, $webpage, $pagetitle, $namespace, $remote_id, $mid)</td></tr>
+<tr class="separator:a2baa9e05f1e8aa3dd61c85803ae39bd6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a36e656667193c83aa2cc03a024fc131b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">activity_sanitise </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a536d0313b6ffe33b9d2490c4e25c5361">get_item_elements()</a>, <a class="el" href="items_8php.html#a94ddb1d6c8fa21dd7433677e85168037">get_mail_elements()</a>, <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">item_store()</a>, and <a class="el" href="items_8php.html#acf0bf7c9d21ac84f32effb754f7ad484">item_store_update()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="abf7a1b73eb352d79acd36309b0dababd"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">array_sanitise </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a251343637ff40a50cca93452cd530c26">get_profile_elements()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a016dd86c827d08db89061ea81d15c6cb"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">atom_author </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$tag</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$name</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uri</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$h</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$w</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$photo</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a275108c050f7eb18bcbb5018e6b81cf6">atom_entry()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a275108c050f7eb18bcbb5018e6b81cf6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">atom_entry </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$author</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$owner</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$comment</em> = <code>false</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$cid</em> = <code>0</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a04a35b610acfe54434df08adec39c0c7">get_feed_for()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a1e75047cf175aaee8dd16aa761913ff9"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">can_comment_on_post </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$observer_xchan</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>can_comment_on_post($observer_xchan,$item);</p>
+<p>This function examines the comment_policy attached to an item and decides if the current observer has sufficient privileges to comment. This will normally be called on a remote site where <a class="el" href="permissions_8php.html#a67ada9ed51e77885b6b0f6a28cee1835">perm_is_allowed()</a> will not be suitable because the post owner does not have a local channel_id. Generally we should look at the item - in particular the author['book_flags'] and see if ABOOK_FLAG_SELF is set. If it is, you should be able to use perm_is_allowed( ... 'post_comments'), and if it isn't you need to call <a class="el" href="items_8php.html#a1e75047cf175aaee8dd16aa761913ff9">can_comment_on_post()</a> </p>
+
+<p>Referenced by <a class="el" href="classConversation.html#a8335cdd43f1836e3c255638e61a09e16">Conversation\add_thread()</a>, and <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a87ac9e359591721a824ecd23bbb56296"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">check_item_source </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>check_item_source($uid,$item) </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">$uid</td><td></td></tr>
+ <tr><td class="paramname">$item</td><td>Checks to see if this item owner is referenced as a source for this channel and if the post matches the rules for inclusion in this channel. Returns true if we should create a second delivery chain and false if none of the rules apply, or if the item is private. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+<p>Referenced by <a class="el" href="items_8php.html#ab1bce4261bcf75ad62753b498a144d17">tag_deliver()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a01e3cf44e082fa9bd06dcde5bf713d70"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">collect_recipients </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$private</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="notifier_8php.html#a568c502f626cff95e344c0748938b85d">notifier_run()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a0790a4550b829e85504af548623002ca"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">compare_permissions </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$obj1</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$obj2</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#aba98fcbbcd7044a7e9ea34edabc14c87">fix_private_photos()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa9e99613d38a97b39c8cf5449699c2ee"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">construct_activity_object </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a275108c050f7eb18bcbb5018e6b81cf6">atom_entry()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa579bc4445d60098b1410961ca8e96b7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">construct_activity_target </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a275108c050f7eb18bcbb5018e6b81cf6">atom_entry()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a8f3c85c584ccd2b98c3ca440e45b40f8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">construct_verb </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a275108c050f7eb18bcbb5018e6b81cf6">atom_entry()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a8794863cdf8ce1333040933d3a3f66bd"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">consume_feed </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$xml</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$importer</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$contact</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$hub</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$datedir</em> = <code>0</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$pass</em> = <code>0</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>consume_feed - process atom feed and update anything/everything we might need to update</p>
+<p>$xml = the (atom) feed to consume - RSS isn't as fully supported but may work for simple feeds.</p>
+<p>$importer = the contact_record (joined to user_record) of the local user who owns this relationship. It is this person's stuff that is going to be updated. $contact = the person who is sending us stuff. If not set, we MAY be processing a "follow" activity from an external network and MAY create an appropriate contact record. Otherwise, we MUST have a contact record. $hub = should we find a hub declation in the feed, pass it back to our calling process, who might (or might not) try and subscribe to it. $datedir sorts in reverse order $pass - by default ($pass = 0) we cannot guarantee that a parent item has been imported prior to its children being seen in the stream unless we are certain of how the feed is arranged/ordered. With $pass = 1, we only pull parent items out of the stream. With $pass = 2, we only pull children (comments/likes).</p>
+<p>So running this twice, first with pass 1 and then with pass 2 will do the right thing regardless of feed ordering. This won't be adequate in a fully-threaded model where comments can have sub-threads. That would require some massive sorting to get all the feed items into a mostly linear ordering, and might still require recursion. </p>
+
+</div>
+</div>
+<a class="anchor" id="a56b2a4abcadfac71175cd50555528cc3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">decode_tags </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$t</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a536d0313b6ffe33b9d2490c4e25c5361">get_item_elements()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a2b56a4c01bd22a648d52ec9af1a04259"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">delete_item_lowlevel </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#afa1db13c2a8b73b5b17b97f17e5a19d1">drop_item()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="afa1db13c2a8b73b5b17b97f17e5a19d1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">drop_item </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$id</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$interactive</em> = <code>true</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#ad4c29f43418f6110f85a6b3998239ab4">api_statuses_destroy()</a>, <a class="el" href="Contact_8php.html#a28e062c884331dbb5dfa713228c25ad6">contact_remove()</a>, <a class="el" href="zot_8php.html#adfeb9400ae6b726beec89f8f1e8fde72">delete_imported_item()</a>, <a class="el" href="items_8php.html#a668ece2c37f05cc3abe538eb0dabfe55">drop_items()</a>, <a class="el" href="item_8php.html#a764bbb2e9a885a86fb23d0b5e4a09221">item_content()</a>, <a class="el" href="items_8php.html#a6f7e1334af5d684a987fa6a3eb37f4cc">item_expire()</a>, <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>, <a class="el" href="poller_8php.html#a5f12df3a4738124b6c039971e87e76da">poller_run()</a>, and <a class="el" href="Contact_8php.html#acc12cda999c88c4d6185cca967c15125">remove_all_xchan_resources()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a668ece2c37f05cc3abe538eb0dabfe55"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">drop_items </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$items</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a82955cc578f0fa600acec84475026194"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">encode_item </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="notifier_8php.html#a568c502f626cff95e344c0748938b85d">notifier_run()</a>, and <a class="el" href="items_8php.html#a004e89d86b0f29b2c4da20108ecc4091">zot_feed()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a5f690fc2484abec07840b4f9dd525bd9"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">encode_item_flags </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a82955cc578f0fa600acec84475026194">encode_item()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ac6673627d289ee4f547de0fe3b7acd0a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">encode_item_terms </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$terms</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a82955cc578f0fa600acec84475026194">encode_item()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a566c601726697e044e75284af7fb6f17"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">encode_item_xchan </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$xchan</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a82955cc578f0fa600acec84475026194">encode_item()</a>, and <a class="el" href="items_8php.html#a2d840c74ed23d1b6c7daee05cf89dda7">encode_mail()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a2d840c74ed23d1b6c7daee05cf89dda7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">encode_mail </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="notifier_8php.html#a568c502f626cff95e344c0748938b85d">notifier_run()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa723c0571e314a1853a24c5854b4f54f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">encode_rel_links </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$links</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a896c1809d58f2d7a42cfe14577958ddf">get_atom_elements()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="afbcf26dfcf8a83fff952aa858c1b7b67"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">enumerate_permissions </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$obj</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a0790a4550b829e85504af548623002ca">compare_permissions()</a>, and <a class="el" href="items_8php.html#aba98fcbbcd7044a7e9ea34edabc14c87">fix_private_photos()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="adf980098b6de9c3993bc3ff26a8dd6f9"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">fetch_post_tags </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$items</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$link</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>, <a class="el" href="display_8php.html#a37137c98d47bf3306f4c2bb9f5b60de0">display_content()</a>, <a class="el" href="editpost_8php.html#a34011690864d122680c802e9e748ccfb">editpost_content()</a>, <a class="el" href="events_8php.html#a1d293fb217ae6bc9e3858c4b32e363ec">events_content()</a>, <a class="el" href="home_8php.html#aa1cf697851a646755baf537f75334c46">home_content()</a>, <a class="el" href="items_8php.html#a6f7e1334af5d684a987fa6a3eb37f4cc">item_expire()</a>, <a class="el" href="items_8php.html#a756738301f2ed96be50232500677d58a">items_fetch()</a>, <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>, <a class="el" href="notifier_8php.html#a568c502f626cff95e344c0748938b85d">notifier_run()</a>, <a class="el" href="page_8php.html#a91a5f649f68406149108bded1dc90b22">page_content()</a>, <a class="el" href="search_8php.html#ab2568591359edde5b483a6cd9a24b2cc">search_content()</a>, <a class="el" href="items_8php.html#ab1bce4261bcf75ad62753b498a144d17">tag_deliver()</a>, and <a class="el" href="items_8php.html#a004e89d86b0f29b2c4da20108ecc4091">zot_feed()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a0cf98bb619f07dd18f602683a55a5f59"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">first_post_date </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$wall</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#ad2abb4644ff1f20fefbc80326fe01cf0">posted_dates()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aba98fcbbcd7044a7e9ea34edabc14c87"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">fix_private_photos </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em> = <code>null</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$cid</em> = <code>0</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a275108c050f7eb18bcbb5018e6b81cf6">atom_entry()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a896c1809d58f2d7a42cfe14577958ddf"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_atom_elements </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$feed</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>If there's a copy of the body content which is guaranteed to have survived mangling in transit, use it.</p>
+
+<p>Referenced by <a class="el" href="items_8php.html#a8794863cdf8ce1333040933d3a3f66bd">consume_feed()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a04a35b610acfe54434df08adec39c0c7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_feed_for </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$observer_hash</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$params</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a079e099e15d88d47aeb6ca6d60da7107">get_public_feed()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aab9c6bae4c40799867596bdaae9829fd"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_item_contact </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$contacts</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a536d0313b6ffe33b9d2490c4e25c5361"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_item_elements </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$x</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="onepoll_8php.html#a72753b2fdec79b37c7f432035c91fb6d">onepoll_run()</a>, and <a class="el" href="zot_8php.html#aeea071f17e306fe3d0c488551906bfab">zot_import()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a94ddb1d6c8fa21dd7433677e85168037"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_mail_elements </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$x</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="zot_8php.html#aeea071f17e306fe3d0c488551906bfab">zot_import()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a251343637ff40a50cca93452cd530c26"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_profile_elements </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$x</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="zot_8php.html#aeea071f17e306fe3d0c488551906bfab">zot_import()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a079e099e15d88d47aeb6ca6d60da7107"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_public_feed </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$params</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="feed_8php.html#af86137700b56f33d1d5f25c8dec22c04">feed_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a77051724d1784074ff187e73a4db93fe"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">has_permissions </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$obj</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#aba98fcbbcd7044a7e9ea34edabc14c87">fix_private_photos()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ae73794179b62d39bb597ff670ab1c1e5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">import_author_xchan </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$x</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a536d0313b6ffe33b9d2490c4e25c5361">get_item_elements()</a>, <a class="el" href="items_8php.html#a94ddb1d6c8fa21dd7433677e85168037">get_mail_elements()</a>, and <a class="el" href="items_8php.html#a251343637ff40a50cca93452cd530c26">get_profile_elements()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a6f7e1334af5d684a987fa6a3eb37f4cc"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">item_expire </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$days</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="expire_8php.html#a444e45c9b67727b27db4c779fd51a298">expire_run()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a09d425596b9f8663472cf7474ad36d96"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">item_getfeedattach </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a649dc3e53ed794d0ead4b5d037f8d8d7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">item_getfeedtags </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a2541e6861a56d145c9281877cc501615"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">item_store </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$allow_exec</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="event_8php.html#a89ef533faf345db8d64a58d4856bde3a">event_store()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="like_8php.html#a9d7dd268f21c21e9d29dd2aca2dd9538">like_content()</a>, <a class="el" href="mood_8php.html#a7ae136dd7476865b4828136175db5022">mood_init()</a>, <a class="el" href="include_2photos_8php.html#a6c40ef58aefef705a5adc84a40e97109">photo_upload()</a>, <a class="el" href="include_2photos_8php.html#ad648c0c5544fe9263409b6f6e57c6274">photos_create_item()</a>, <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>, <a class="el" href="items_8php.html#a410f9c743877c125ca06312373346903">post_activity_item()</a>, <a class="el" href="zot_8php.html#a37ec13b18057634eadb071f05297f5e1">process_delivery()</a>, <a class="el" href="activities_8php.html#a80134e807719b3c54aba971958d2e132">profile_activity()</a>, and <a class="el" href="subthread_8php.html#a50368f3d825b77996030528e7fbfa3d3">subthread_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="acf0bf7c9d21ac84f32effb754f7ad484"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">item_store_update </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$allow_exec</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, and <a class="el" href="zot_8php.html#a31aad56acf8ff8f2353e6ff8595544df">update_imported_item()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a756738301f2ed96be50232500677d58a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">items_fetch </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel</em> = <code>null</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$observer_hash</em> = <code>null</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$client_mode</em> = <code><a class="el" href="boot_8php.html#a43c6c7d84d880e9500bd4f8f8ecc5731">CLIENT_MODE_NORMAL</a></code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$module</em> = <code>'network'</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a04a35b610acfe54434df08adec39c0c7">get_feed_for()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="af94c281016c6c912d06e064113336c5c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">limit_body_size </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$body</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a896c1809d58f2d7a42cfe14577958ddf">get_atom_elements()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a77da7ce9a117601d49ac4a67c71b514f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">mail_store </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="zot_8php.html#aa6ae96db8cbbdbb10e6876d206bbf7cc">process_mail_delivery()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ac1fcf621dce7370515b420a7753f4726"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">map_scope </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$scope</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a82955cc578f0fa600acec84475026194">encode_item()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, and <a class="el" href="items_8php.html#a410f9c743877c125ca06312373346903">post_activity_item()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a410f9c743877c125ca06312373346903"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">post_activity_item </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>post_activity_item($arr) </p>
+<pre class="fragment">post an activity
+</pre><dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype">array</td><td class="paramname">$arr</td><td>In its simplest form one needs only to set $arr['body'] to post a note to the logged in channel's wall. Much more complex activities can be created. Permissions are checked. No filtering, tag expansion or other processing is performed.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>array 'success' =&gt; true or false 'activity' =&gt; the resulting activity if successful </dd></dl>
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#a72bfecac1970bc29b853073e816388ff">api_channel_stream()</a>, <a class="el" href="poke_8php.html#a9725aab97b3983e6a98bd81c4efe7d3b">poke_init()</a>, <a class="el" href="tagger_8php.html#a0e4a3eb177d1684553c547503d67161c">tagger_content()</a>, and <a class="el" href="thing_8php.html#a8be23b1d475ec3d9291999221c674c80">thing_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="abe695dd89e1e10ed042c26b80114f0ed"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">posted_date_widget </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$url</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$wall</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ad2abb4644ff1f20fefbc80326fe01cf0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">posted_dates </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$wall</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#abe695dd89e1e10ed042c26b80114f0ed">posted_date_widget()</a>, and <a class="el" href="widgets_8php.html#a7b1e357b5a2027718470b77ec921fc65">widget_archive()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a4e6d7639431e0dd8e9f4dba8e1ac408b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">red_zrl_callback </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$matches</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>red_zrl_callback preg_match function when fixing 'naked' links in mod <a class="el" href="item_8php.html">item.php</a> Check if we've got a hubloc for the site and use a zrl if we do, a url if we don't. </p>
+
+</div>
+</div>
+<a class="anchor" id="aab9e0c58247427126de0699c729c3b6c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">send_status_notifications </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$post_id</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">item_store()</a>, and <a class="el" href="items_8php.html#acf0bf7c9d21ac84f32effb754f7ad484">item_store_update()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ab1bce4261bcf75ad62753b498a144d17"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">tag_deliver </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item_id</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="zot_8php.html#adfeb9400ae6b726beec89f8f1e8fde72">delete_imported_item()</a>, <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">item_store()</a>, and <a class="el" href="items_8php.html#acf0bf7c9d21ac84f32effb754f7ad484">item_store_update()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ad34827ed330898456783fb14c7b46154"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">termtype </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$t</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#ac6673627d289ee4f547de0fe3b7acd0a">encode_item_terms()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a88c6cf7649ac836fbbed82a7a0315110"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">tgroup_check </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a8794863cdf8ce1333040933d3a3f66bd">consume_feed()</a>, and <a class="el" href="zot_8php.html#a37ec13b18057634eadb071f05297f5e1">process_delivery()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa371905f0a211b307cb3f7188c6cba04"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">title_is_body </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$title</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$body</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a896c1809d58f2d7a42cfe14577958ddf">get_atom_elements()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a2baa9e05f1e8aa3dd61c85803ae39bd6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">update_remote_id </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$post_id</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$webpage</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$pagetitle</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$namespace</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$remote_id</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$mid</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a004e89d86b0f29b2c4da20108ecc4091"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">zot_feed </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$observer_xchan</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$mindate</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="zotfeed_8php.html#a24dfc23d366e7f840cf2847d0c1c8eac">zotfeed_init()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/items_8php.js b/doc/html/items_8php.js
new file mode 100644
index 000000000..1ea725f92
--- /dev/null
+++ b/doc/html/items_8php.js
@@ -0,0 +1,58 @@
+var items_8php =
+[
+ [ "activity_sanitise", "items_8php.html#a36e656667193c83aa2cc03a024fc131b", null ],
+ [ "array_sanitise", "items_8php.html#abf7a1b73eb352d79acd36309b0dababd", null ],
+ [ "atom_author", "items_8php.html#a016dd86c827d08db89061ea81d15c6cb", null ],
+ [ "atom_entry", "items_8php.html#a275108c050f7eb18bcbb5018e6b81cf6", null ],
+ [ "can_comment_on_post", "items_8php.html#a1e75047cf175aaee8dd16aa761913ff9", null ],
+ [ "check_item_source", "items_8php.html#a87ac9e359591721a824ecd23bbb56296", null ],
+ [ "collect_recipients", "items_8php.html#a01e3cf44e082fa9bd06dcde5bf713d70", null ],
+ [ "compare_permissions", "items_8php.html#a0790a4550b829e85504af548623002ca", null ],
+ [ "construct_activity_object", "items_8php.html#aa9e99613d38a97b39c8cf5449699c2ee", null ],
+ [ "construct_activity_target", "items_8php.html#aa579bc4445d60098b1410961ca8e96b7", null ],
+ [ "construct_verb", "items_8php.html#a8f3c85c584ccd2b98c3ca440e45b40f8", null ],
+ [ "consume_feed", "items_8php.html#a8794863cdf8ce1333040933d3a3f66bd", null ],
+ [ "decode_tags", "items_8php.html#a56b2a4abcadfac71175cd50555528cc3", null ],
+ [ "delete_item_lowlevel", "items_8php.html#a2b56a4c01bd22a648d52ec9af1a04259", null ],
+ [ "drop_item", "items_8php.html#afa1db13c2a8b73b5b17b97f17e5a19d1", null ],
+ [ "drop_items", "items_8php.html#a668ece2c37f05cc3abe538eb0dabfe55", null ],
+ [ "encode_item", "items_8php.html#a82955cc578f0fa600acec84475026194", null ],
+ [ "encode_item_flags", "items_8php.html#a5f690fc2484abec07840b4f9dd525bd9", null ],
+ [ "encode_item_terms", "items_8php.html#ac6673627d289ee4f547de0fe3b7acd0a", null ],
+ [ "encode_item_xchan", "items_8php.html#a566c601726697e044e75284af7fb6f17", null ],
+ [ "encode_mail", "items_8php.html#a2d840c74ed23d1b6c7daee05cf89dda7", null ],
+ [ "encode_rel_links", "items_8php.html#aa723c0571e314a1853a24c5854b4f54f", null ],
+ [ "enumerate_permissions", "items_8php.html#afbcf26dfcf8a83fff952aa858c1b7b67", null ],
+ [ "fetch_post_tags", "items_8php.html#adf980098b6de9c3993bc3ff26a8dd6f9", null ],
+ [ "first_post_date", "items_8php.html#a0cf98bb619f07dd18f602683a55a5f59", null ],
+ [ "fix_private_photos", "items_8php.html#aba98fcbbcd7044a7e9ea34edabc14c87", null ],
+ [ "get_atom_elements", "items_8php.html#a896c1809d58f2d7a42cfe14577958ddf", null ],
+ [ "get_feed_for", "items_8php.html#a04a35b610acfe54434df08adec39c0c7", null ],
+ [ "get_item_contact", "items_8php.html#aab9c6bae4c40799867596bdaae9829fd", null ],
+ [ "get_item_elements", "items_8php.html#a536d0313b6ffe33b9d2490c4e25c5361", null ],
+ [ "get_mail_elements", "items_8php.html#a94ddb1d6c8fa21dd7433677e85168037", null ],
+ [ "get_profile_elements", "items_8php.html#a251343637ff40a50cca93452cd530c26", null ],
+ [ "get_public_feed", "items_8php.html#a079e099e15d88d47aeb6ca6d60da7107", null ],
+ [ "has_permissions", "items_8php.html#a77051724d1784074ff187e73a4db93fe", null ],
+ [ "import_author_xchan", "items_8php.html#ae73794179b62d39bb597ff670ab1c1e5", null ],
+ [ "item_expire", "items_8php.html#a6f7e1334af5d684a987fa6a3eb37f4cc", null ],
+ [ "item_getfeedattach", "items_8php.html#a09d425596b9f8663472cf7474ad36d96", null ],
+ [ "item_getfeedtags", "items_8php.html#a649dc3e53ed794d0ead4b5d037f8d8d7", null ],
+ [ "item_store", "items_8php.html#a2541e6861a56d145c9281877cc501615", null ],
+ [ "item_store_update", "items_8php.html#acf0bf7c9d21ac84f32effb754f7ad484", null ],
+ [ "items_fetch", "items_8php.html#a756738301f2ed96be50232500677d58a", null ],
+ [ "limit_body_size", "items_8php.html#af94c281016c6c912d06e064113336c5c", null ],
+ [ "mail_store", "items_8php.html#a77da7ce9a117601d49ac4a67c71b514f", null ],
+ [ "map_scope", "items_8php.html#ac1fcf621dce7370515b420a7753f4726", null ],
+ [ "post_activity_item", "items_8php.html#a410f9c743877c125ca06312373346903", null ],
+ [ "posted_date_widget", "items_8php.html#abe695dd89e1e10ed042c26b80114f0ed", null ],
+ [ "posted_dates", "items_8php.html#ad2abb4644ff1f20fefbc80326fe01cf0", null ],
+ [ "red_zrl_callback", "items_8php.html#a4e6d7639431e0dd8e9f4dba8e1ac408b", null ],
+ [ "send_status_notifications", "items_8php.html#aab9e0c58247427126de0699c729c3b6c", null ],
+ [ "tag_deliver", "items_8php.html#ab1bce4261bcf75ad62753b498a144d17", null ],
+ [ "termtype", "items_8php.html#ad34827ed330898456783fb14c7b46154", null ],
+ [ "tgroup_check", "items_8php.html#a88c6cf7649ac836fbbed82a7a0315110", null ],
+ [ "title_is_body", "items_8php.html#aa371905f0a211b307cb3f7188c6cba04", null ],
+ [ "update_remote_id", "items_8php.html#a2baa9e05f1e8aa3dd61c85803ae39bd6", null ],
+ [ "zot_feed", "items_8php.html#a004e89d86b0f29b2c4da20108ecc4091", null ]
+]; \ No newline at end of file
diff --git a/doc/html/jquery.js b/doc/html/jquery.js
new file mode 100644
index 000000000..78ad0bdff
--- /dev/null
+++ b/doc/html/jquery.js
@@ -0,0 +1,77 @@
+/*! jQuery v1.7.1 jquery.com | jquery.org/license */
+(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cv(a){if(!ck[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){cl||(cl=c.createElement("iframe"),cl.frameBorder=cl.width=cl.height=0),b.appendChild(cl);if(!cm||!cl.createElement)cm=(cl.contentWindow||cl.contentDocument).document,cm.write((c.compatMode==="CSS1Compat"?"<!doctype html>":"")+"<html><body>"),cm.close();d=cm.createElement(a),cm.body.appendChild(d),e=f.css(d,"display"),b.removeChild(cl)}ck[a]=e}return ck[a]}function cu(a,b){var c={};f.each(cq.concat.apply([],cq.slice(0,b)),function(){c[this]=a});return c}function ct(){cr=b}function cs(){setTimeout(ct,0);return cr=f.now()}function cj(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ci(){try{return new a.XMLHttpRequest}catch(b){}}function cc(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g<i;g++){if(g===1)for(h in a.converters)typeof h=="string"&&(e[h.toLowerCase()]=a.converters[h]);l=k,k=d[g];if(k==="*")k=l;else if(l!=="*"&&l!==k){m=l+" "+k,n=e[m]||e["* "+k];if(!n){p=b;for(o in e){j=o.split(" ");if(j[0]===l||j[0]==="*"){p=e[j[1]+" "+k];if(p){o=e[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&f.error("No conversion from "+m.replace(" "," to ")),n!==!0&&(c=n?n(c):p(o(c)))}}return c}function cb(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]==="*")f.shift(),h===b&&(h=a.mimeType||c.getResponseHeader("content-type"));if(h)for(i in e)if(e[i]&&e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+" "+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j);return d[j]}}function ca(a,b,c,d){if(f.isArray(b))f.each(b,function(b,e){c||bE.test(a)?d(a,e):ca(a+"["+(typeof e=="object"||f.isArray(e)?b:"")+"]",e,c,d)});else if(!c&&b!=null&&typeof b=="object")for(var e in b)ca(a+"["+e+"]",b[e],c,d);else d(a,b)}function b_(a,c){var d,e,g=f.ajaxSettings.flatOptions||{};for(d in c)c[d]!==b&&((g[d]?a:e||(e={}))[d]=c[d]);e&&f.extend(!0,a,e)}function b$(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bT,l;for(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l=="string"&&(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=b$(a,c,d,e,l,g)));(k||!l)&&!g["*"]&&(l=b$(a,c,d,e,"*",g));return l}function bZ(a){return function(b,c){typeof b!="string"&&(c=b,b="*");if(f.isFunction(c)){var d=b.toLowerCase().split(bP),e=0,g=d.length,h,i,j;for(;e<g;e++)h=d[e],j=/^\+/.test(h),j&&(h=h.substr(1)||"*"),i=a[h]=a[h]||[],i[j?"unshift":"push"](c)}}}function bC(a,b,c){var d=b==="width"?a.offsetWidth:a.offsetHeight,e=b==="width"?bx:by,g=0,h=e.length;if(d>0){if(c!=="border")for(;g<h;g++)c||(d-=parseFloat(f.css(a,"padding"+e[g]))||0),c==="margin"?d+=parseFloat(f.css(a,c+e[g]))||0:d-=parseFloat(f.css(a,"border"+e[g]+"Width"))||0;return d+"px"}d=bz(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0;if(c)for(;g<h;g++)d+=parseFloat(f.css(a,"padding"+e[g]))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+e[g]+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+e[g]))||0);return d+"px"}function bp(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(bf,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bo(a){var b=c.createElement("div");bh.appendChild(b),b.innerHTML=a.outerHTML;return b.firstChild}function bn(a){var b=(a.nodeName||"").toLowerCase();b==="input"?bm(a):b!=="script"&&typeof a.getElementsByTagName!="undefined"&&f.grep(a.getElementsByTagName("input"),bm)}function bm(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bl(a){return typeof a.getElementsByTagName!="undefined"?a.getElementsByTagName("*"):typeof a.querySelectorAll!="undefined"?a.querySelectorAll("*"):[]}function bk(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bj(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c,d,e,g=f._data(a),h=f._data(b,g),i=g.events;if(i){delete h.handle,h.events={};for(c in i)for(d=0,e=i[c].length;d<e;d++)f.event.add(b,c+(i[c][d].namespace?".":"")+i[c][d].namespace,i[c][d],i[c][d].data)}h.data&&(h.data=f.extend({},h.data))}}function bi(a,b){return f.nodeName(a,"table")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function U(a){var b=V.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}function T(a,b,c){b=b||0;if(f.isFunction(b))return f.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return f.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=f.grep(a,function(a){return a.nodeType===1});if(O.test(b))return f.filter(b,d,!c);b=f.filter(b,d)}return f.grep(a,function(a,d){return f.inArray(a,b)>=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?parseFloat(d):j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c<d;c++)b[a[c]]=!0;return b}var c=a.document,d=a.navigator,e=a.location,f=function(){function J(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(J,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.1",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j<k;j++)if((a=arguments[j])!=null)for(c in a){d=i[c],f=a[c];if(i===f)continue;l&&f&&(e.isPlainObject(f)||(g=e.isArray(f)))?(g?(g=!1,h=d&&e.isArray(d)?d:[]):h=d&&e.isPlainObject(d)?d:{},i[c]=e.extend(l,h,f)):f!==b&&(i[c]=f)}return i},e.extend({noConflict:function(b){a.$===e&&(a.$=g),b&&a.jQuery===e&&(a.jQuery=f);return e},isReady:!1,readyWait:1,holdReady:function(a){a?e.readyWait++:e.ready(!0)},ready:function(a){if(a===!0&&!--e.readyWait||a!==!0&&!e.isReady){if(!c.body)return setTimeout(e.ready,1);e.isReady=!0;if(a!==!0&&--e.readyWait>0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g<h;)if(c.apply(a[g++],d)===!1)break}else if(i){for(f in a)if(c.call(a[f],f,a[f])===!1)break}else for(;g<h;)if(c.call(a[g],g,a[g++])===!1)break;return a},trim:G?function(a){return a==null?"":G.call(a)}:function(a){return a==null?"":(a+"").replace(k,"").replace(l,"")},makeArray:function(a,b){var c=b||[];if(a!=null){var d=e.type(a);a.length==null||d==="string"||d==="function"||d==="regexp"||e.isWindow(a)?E.call(c,a):e.merge(c,a)}return c},inArray:function(a,b,c){var d;if(b){if(H)return H.call(b,a,c);d=b.length,c=c?c<0?Math.max(0,d+c):c:0;for(;c<d;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,c){var d=a.length,e=0;if(typeof c.length=="number")for(var f=c.length;e<f;e++)a[d++]=c[e];else while(c[e]!==b)a[d++]=c[e++];a.length=d;return a},grep:function(a,b,c){var d=[],e;c=!!c;for(var f=0,g=a.length;f<g;f++)e=!!b(a[f],f),c!==e&&d.push(a[f]);return d},map:function(a,c,d){var f,g,h=[],i=0,j=a.length,k=a instanceof e||j!==b&&typeof j=="number"&&(j>0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i<j;i++)f=c(a[i],i,d),f!=null&&(h[h.length]=f);else for(g in a)f=c(a[g],g,d),f!=null&&(h[h.length]=f);return h.concat.apply([],h)},guid:1,proxy:function(a,c){if(typeof c=="string"){var d=a[c];c=a,a=d}if(!e.isFunction(a))return b;var f=F.call(arguments,2),g=function(){return a.apply(c,f.concat(F.call(arguments)))};g.guid=a.guid=a.guid||g.guid||e.guid++;return g},access:function(a,c,d,f,g,h){var i=a.length;if(typeof c=="object"){for(var j in c)e.access(a,j,c[j],f,g,d);return a}if(d!==b){f=!h&&f&&e.isFunction(d);for(var k=0;k<i;k++)g(a[k],c,f?d.call(a[k],k,g(a[k],c)):d,h);return a}return i?g(a[0],c):b},now:function(){return(new Date).getTime()},uaMatch:function(a){a=a.toLowerCase();var b=r.exec(a)||s.exec(a)||t.exec(a)||a.indexOf("compatible")<0&&u.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},sub:function(){function a(b,c){return new a.fn.init(b,c)}e.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function(d,f){f&&f instanceof e&&!(f instanceof a)&&(f=a(f));return e.fn.init.call(this,d,f,b)},a.fn.init.prototype=a.fn;var b=a(c);return a},browser:{}}),e.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){I["[object "+b+"]"]=b.toLowerCase()}),z=e.uaMatch(y),z.browser&&(e.browser[z.browser]=!0,e.browser.version=z.version),e.browser.webkit&&(e.browser.safari=!0),j.test(" ")&&(k=/^[\s\xA0]+/,l=/[\s\xA0]+$/),h=e(c),c.addEventListener?B=function(){c.removeEventListener("DOMContentLoaded",B,!1),e.ready()}:c.attachEvent&&(B=function(){c.readyState==="complete"&&(c.detachEvent("onreadystatechange",B),e.ready())});return e}(),g={};f.Callbacks=function(a){a=a?g[a]||h(a):{};var c=[],d=[],e,i,j,k,l,m=function(b){var d,e,g,h,i;for(d=0,e=b.length;d<e;d++)g=b[d],h=f.type(g),h==="array"?m(g):h==="function"&&(!a.unique||!o.has(g))&&c.push(g)},n=function(b,f){f=f||[],e=!a.memory||[b,f],i=!0,l=j||0,j=0,k=c.length;for(;c&&l<k;l++)if(c[l].apply(b,f)===!1&&a.stopOnFalse){e=!0;break}i=!1,c&&(a.once?e===!0?o.disable():c=[]:d&&d.length&&(e=d.shift(),o.fireWith(e[0],e[1])))},o={add:function(){if(c){var a=c.length;m(arguments),i?k=c.length:e&&e!==!0&&(j=a,n(e[0],e[1]))}return this},remove:function(){if(c){var b=arguments,d=0,e=b.length;for(;d<e;d++)for(var f=0;f<c.length;f++)if(b[d]===c[f]){i&&f<=k&&(k--,f<=l&&l--),c.splice(f--,1);if(a.unique)break}}return this},has:function(a){if(c){var b=0,d=c.length;for(;b<d;b++)if(a===c[b])return!0}return!1},empty:function(){c=[];return this},disable:function(){c=d=e=b;return this},disabled:function(){return!c},lock:function(){d=b,(!e||e===!0)&&o.disable();return this},locked:function(){return!d},fireWith:function(b,c){d&&(i?a.once||d.push([b,c]):(!a.once||!e)&&n(b,c));return this},fire:function(){o.fireWith(this,arguments);return this},fired:function(){return!!e}};return o};var i=[].slice;f.extend({Deferred:function(a){var b=f.Callbacks("once memory"),c=f.Callbacks("once memory"),d=f.Callbacks("memory"),e="pending",g={resolve:b,reject:c,notify:d},h={done:b.add,fail:c.add,progress:d.add,state:function(){return e},isResolved:b.fired,isRejected:c.fired,then:function(a,b,c){i.done(a).fail(b).progress(c);return this},always:function(){i.done.apply(i,arguments).fail.apply(i,arguments);return this},pipe:function(a,b,c){return f.Deferred(function(d){f.each({done:[a,"resolve"],fail:[b,"reject"],progress:[c,"notify"]},function(a,b){var c=b[0],e=b[1],g;f.isFunction(c)?i[a](function()
+{g=c.apply(this,arguments),g&&f.isFunction(g.promise)?g.promise().then(d.resolve,d.reject,d.notify):d[e+"With"](this===i?d:this,[g])}):i[a](d[e])})}).promise()},promise:function(a){if(a==null)a=h;else for(var b in h)a[b]=h[b];return a}},i=h.promise({}),j;for(j in g)i[j]=g[j].fire,i[j+"With"]=g[j].fireWith;i.done(function(){e="resolved"},c.disable,d.lock).fail(function(){e="rejected"},b.disable,d.lock),a&&a.call(i,i);return i},when:function(a){function m(a){return function(b){e[a]=arguments.length>1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c<d;c++)b[c]&&b[c].promise&&f.isFunction(b[c].promise)?b[c].promise().then(l(c),j.reject,m(c)):--g;g||j.resolveWith(j,b)}else j!==a&&j.resolveWith(j,d?[a]:[]);return k}}),f.support=function(){var b,d,e,g,h,i,j,k,l,m,n,o,p,q=c.createElement("div"),r=c.documentElement;q.setAttribute("className","t"),q.innerHTML=" <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>",d=q.getElementsByTagName("*"),e=q.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=q.getElementsByTagName("input")[0],b={leadingWhitespace:q.firstChild.nodeType===3,tbody:!q.getElementsByTagName("tbody").length,htmlSerialize:!!q.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:q.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav></:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete q.test}catch(s){b.deleteExpando=!1}!q.addEventListener&&q.attachEvent&&q.fireEvent&&(q.attachEvent("onclick",function(){b.noCloneEvent=!1}),q.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),q.appendChild(i),k=c.createDocumentFragment(),k.appendChild(q.lastChild),b.checkClone=k.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,k.removeChild(i),k.appendChild(q),q.innerHTML="",a.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",q.style.width="2px",q.appendChild(j),b.reliableMarginRight=(parseInt((a.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0);if(q.attachEvent)for(o in{submit:1,change:1,focusin:1})n="on"+o,p=n in q,p||(q.setAttribute(n,"return;"),p=typeof q[n]=="function"),b[o+"Bubbles"]=p;k.removeChild(q),k=g=h=j=q=i=null,f(function(){var a,d,e,g,h,i,j,k,m,n,o,r=c.getElementsByTagName("body")[0];!r||(j=1,k="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;",m="visibility:hidden;border:0;",n="style='"+k+"border:5px solid #000;padding:0;'",o="<div "+n+"><div></div></div>"+"<table "+n+" cellpadding='0' cellspacing='0'>"+"<tr><td></td></tr></table>",a=c.createElement("div"),a.style.cssText=m+"width:0;height:0;position:static;top:0;margin-top:"+j+"px",r.insertBefore(a,r.firstChild),q=c.createElement("div"),a.appendChild(q),q.innerHTML="<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>",l=q.getElementsByTagName("td"),p=l[0].offsetHeight===0,l[0].style.display="",l[1].style.display="none",b.reliableHiddenOffsets=p&&l[0].offsetHeight===0,q.innerHTML="",q.style.width=q.style.paddingLeft="1px",f.boxModel=b.boxModel=q.offsetWidth===2,typeof q.style.zoom!="undefined"&&(q.style.display="inline",q.style.zoom=1,b.inlineBlockNeedsLayout=q.offsetWidth===2,q.style.display="",q.innerHTML="<div style='width:4px;'></div>",b.shrinkWrapBlocks=q.offsetWidth!==2),q.style.cssText=k+m,q.innerHTML=o,d=q.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,i={doesNotAddBorder:e.offsetTop!==5,doesAddBorderForTableAndCells:h.offsetTop===5},e.style.position="fixed",e.style.top="20px",i.fixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",i.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,i.doesNotIncludeMarginInBodyOffset=r.offsetTop!==j,r.removeChild(a),q=a=null,f.extend(b,i))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e<g;e++)delete d[b[e]];if(!(c?m:f.isEmptyObject)(d))return}}if(!c){delete j[k].data;if(!m(j[k]))return}f.support.deleteExpando||!j.setInterval?delete j[k]:j[k]=null,i&&(f.support.deleteExpando?delete a[h]:a.removeAttribute?a.removeAttribute(h):a[h]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d,e,g,h=null;if(typeof a=="undefined"){if(this.length){h=f.data(this[0]);if(this[0].nodeType===1&&!f._data(this[0],"parsedAttrs")){e=this[0].attributes;for(var i=0,j=e.length;i<j;i++)g=e[i].name,g.indexOf("data-")===0&&(g=f.camelCase(g.substring(5)),l(this[0],g,h[g]));f._data(this[0],"parsedAttrs",!0)}}return h}if(typeof a=="object")return this.each(function(){f.data(this,a)});d=a.split("."),d[1]=d[1]?"."+d[1]:"";if(c===b){h=this.triggerHandler("getData"+d[1]+"!",[d[0]]),h===b&&this.length&&(h=f.data(this[0],a),h=l(this[0],a,h));return h===b&&d[1]?this.data(d[0]):h}return this.each(function(){var b=f(this),e=[d[0],c];b.triggerHandler("setData"+d[1]+"!",e),f.data(this,a,c),b.triggerHandler("changeData"+d[1]+"!",e)})},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,b){a&&(b=(b||"fx")+"mark",f._data(a,b,(f._data(a,b)||0)+1))},_unmark:function(a,b,c){a!==!0&&(c=b,b=a,a=!1);if(b){c=c||"fx";var d=c+"mark",e=a?0:(f._data(b,d)||1)-1;e?f._data(b,d,e):(f.removeData(b,d,!0),n(b,c,"mark"))}},queue:function(a,b,c){var d;if(a){b=(b||"fx")+"queue",d=f._data(a,b),c&&(!d||f.isArray(c)?d=f._data(a,b,f.makeArray(c)):d.push(c));return d||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e={};d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),f._data(a,b+".run",e),d.call(a,function(){f.dequeue(a,b)},e)),c.length||(f.removeData(a,b+"queue "+b+".run",!0),n(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){typeof a!="string"&&(c=a,a="fx");if(c===b)return f.queue(this[0],a);return this.each(function(){var b=f.queue(this,a,c);a==="fx"&&b[0]!=="inprogress"&&f.dequeue(this,a)})},dequeue:function(a){return this.each(function(){f.dequeue(this,a)})},delay:function(a,b){a=f.fx?f.fx.speeds[a]||a:a,b=b||"fx";return this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,c){function m(){--h||d.resolveWith(e,[e])}typeof a!="string"&&(c=a,a=b),a=a||"fx";var d=f.Deferred(),e=this,g=e.length,h=1,i=a+"defer",j=a+"queue",k=a+"mark",l;while(g--)if(l=f.data(e[g],i,b,!0)||(f.data(e[g],j,b,!0)||f.data(e[g],k,b,!0))&&f.data(e[g],i,f.Callbacks("once memory"),!0))h++,l.add(m);m();return d.promise()}});var o=/[\n\t\r]/g,p=/\s+/,q=/\r/g,r=/^(?:button|input)$/i,s=/^(?:button|input|object|select|textarea)$/i,t=/^a(?:rea)?$/i,u=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,v=f.support.getSetAttribute,w,x,y;f.fn.extend({attr:function(a,b){return f.access(this,a,b,!0,f.attr)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,a,b,!0,f.prop)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(p);for(c=0,d=this.length;c<d;c++){e=this[c];if(e.nodeType===1)if(!e.className&&b.length===1)e.className=a;else{g=" "+e.className+" ";for(h=0,i=b.length;h<i;h++)~g.indexOf(" "+b[h]+" ")||(g+=b[h]+" ");e.className=f.trim(g)}}}return this},removeClass:function(a){var c,d,e,g,h,i,j;if(f.isFunction(a))return this.each(function(b){f(this).removeClass(a.call(this,b,this.className))});if(a&&typeof a=="string"||a===b){c=(a||"").split(p);for(d=0,e=this.length;d<e;d++){g=this[d];if(g.nodeType===1&&g.className)if(a){h=(" "+g.className+" ").replace(o," ");for(i=0,j=c.length;i<j;i++)h=h.replace(" "+c[i]+" "," ");g.className=f.trim(h)}else g.className=""}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b=="boolean";if(f.isFunction(a))return this.each(function(c){f(this).toggleClass(a.call(this,c,this.className,b),b)});return this.each(function(){if(c==="string"){var e,g=0,h=f(this),i=b,j=a.split(p);while(e=j[g++])i=d?i:!h.hasClass(e),h[i?"addClass":"removeClass"](e)}else if(c==="undefined"||c==="boolean")this.className&&f._data(this,"__className__",this.className),this.className=this.className||a===!1?"":f._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ",c=0,d=this.length;for(;c<d;c++)if(this[c].nodeType===1&&(" "+this[c].className+" ").replace(o," ").indexOf(b)>-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.nodeName.toLowerCase()]||f.valHooks[g.type];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c<d;c++){e=i[c];if(e.selected&&(f.support.optDisabled?!e.disabled:e.getAttribute("disabled")===null)&&(!e.parentNode.disabled||!f.nodeName(e.parentNode,"optgroup"))){b=f(e).val();if(j)return b;h.push(b)}}if(j&&!h.length&&i.length)return f(i[g]).val();return h},set:function(a,b){var c=f.makeArray(b);f(a).find("option").each(function(){this.selected=f.inArray(f(this).val(),c)>=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;h<g;h++)e=d[h],e&&(c=f.propFix[e]||e,f.attr(a,e,""),a.removeAttribute(v?e:c),u.test(e)&&c in a&&(a[c]=!1))}},attrHooks:{type:{set:function(a,b){if(r.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},value:{get:function(a,b){if(w&&f.nodeName(a,"button"))return w.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(w&&f.nodeName(a,"button"))return w.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e,g,h,i=a.nodeType;if(!!a&&i!==3&&i!==8&&i!==2){h=i!==1||!f.isXMLDoc(a),h&&(c=f.propFix[c]||c,g=f.propHooks[c]);return d!==b?g&&"set"in g&&(e=g.set(a,d,c))!==b?e:a[c]=d:g&&"get"in g&&(e=g.get(a,c))!==null?e:a[c]}},propHooks:{tabIndex:{get:function(a){var c=a.getAttributeNode("tabindex");return c&&c.specified?parseInt(c.value,10):s.test(a.nodeName)||t.test(a.nodeName)&&a.href?0:b}}}}),f.attrHooks.tabindex=f.propHooks.tabIndex,x={get:function(a,c){var d,e=f.prop(a,c);return e===!0||typeof e!="boolean"&&(d=a.getAttributeNode(c))&&d.nodeValue!==!1?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},v||(y={name:!0,id:!0},w=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&(y[c]?d.nodeValue!=="":d.specified)?d.nodeValue:b},set:function(a,b,d){var e=a.getAttributeNode(d);e||(e=c.createAttribute(d),a.setAttributeNode(e));return e.nodeValue=b+""}},f.attrHooks.tabindex.set=w.set,f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})}),f.attrHooks.contenteditable={get:w.get,set:function(a,b,c){b===""&&(b="false"),w.set(a,b,c)}}),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex);return null}})),f.support.enctype||(f.propFix.enctype="encoding"),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/\bhover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function(a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")};
+f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k<c.length;k++){l=A.exec(c[k])||[],m=l[1],n=(l[2]||"").split(".").sort(),s=f.event.special[m]||{},m=(g?s.delegateType:s.bindType)||m,s=f.event.special[m]||{},o=f.extend({type:m,origType:l[1],data:e,handler:d,guid:d.guid,selector:g,quick:G(g),namespace:n.join(".")},p),r=j[m];if(!r){r=j[m]=[],r.delegateCount=0;if(!s.setup||s.setup.call(a,e,n,i)===!1)a.addEventListener?a.addEventListener(m,i,!1):a.attachEvent&&a.attachEvent("on"+m,i)}s.add&&(s.add.call(a,o),o.handler.guid||(o.handler.guid=d.guid)),g?r.splice(r.delegateCount++,0,o):r.push(o),f.event.global[m]=!0}a=null}},global:{},remove:function(a,b,c,d,e){var g=f.hasData(a)&&f._data(a),h,i,j,k,l,m,n,o,p,q,r,s;if(!!g&&!!(o=g.events)){b=f.trim(I(b||"")).split(" ");for(h=0;h<b.length;h++){i=A.exec(b[h])||[],j=k=i[1],l=i[2];if(!j){for(j in o)f.event.remove(a,j+b[h],c,d,!0);continue}p=f.event.special[j]||{},j=(d?p.delegateType:p.bindType)||j,r=o[j]||[],m=r.length,l=l?new RegExp("(^|\\.)"+l.split(".").sort().join("\\.(?:.*\\.)?")+"(\\.|$)"):null;for(n=0;n<r.length;n++)s=r[n],(e||k===s.origType)&&(!c||c.guid===s.guid)&&(!l||l.test(s.namespace))&&(!d||d===s.selector||d==="**"&&s.selector)&&(r.splice(n--,1),s.selector&&r.delegateCount--,p.remove&&p.remove.call(a,s));r.length===0&&m!==r.length&&((!p.teardown||p.teardown.call(a,l)===!1)&&f.removeEvent(a,j,g.handle),delete o[j])}f.isEmptyObject(o)&&(q=g.handle,q&&(q.elem=null),f.removeData(a,["events","handle"],!0))}},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(c,d,e,g){if(!e||e.nodeType!==3&&e.nodeType!==8){var h=c.type||c,i=[],j,k,l,m,n,o,p,q,r,s;if(E.test(h+f.event.triggered))return;h.indexOf("!")>=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;l<r.length&&!c.isPropagationStopped();l++)m=r[l][0],c.type=r[l][1],q=(f._data(m,"events")||{})[c.type]&&f._data(m,"handle"),q&&q.apply(m,d),q=o&&m[o],q&&f.acceptData(m)&&q.apply(m,d)===!1&&c.preventDefault();c.type=h,!g&&!c.isDefaultPrevented()&&(!p._default||p._default.apply(e.ownerDocument,d)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)&&o&&e[h]&&(h!=="focus"&&h!=="blur"||c.target.offsetWidth!==0)&&!f.isWindow(e)&&(n=e[o],n&&(e[o]=null),f.event.triggered=h,e[h](),f.event.triggered=b,n&&(e[o]=n));return c.result}},dispatch:function(c){c=f.event.fix(c||a.event);var d=(f._data(this,"events")||{})[c.type]||[],e=d.delegateCount,g=[].slice.call(arguments,0),h=!c.exclusive&&!c.namespace,i=[],j,k,l,m,n,o,p,q,r,s,t;g[0]=c,c.delegateTarget=this;if(e&&!c.target.disabled&&(!c.button||c.type!=="click")){m=f(this),m.context=this.ownerDocument||this;for(l=c.target;l!=this;l=l.parentNode||this){o={},q=[],m[0]=l;for(j=0;j<e;j++)r=d[j],s=r.selector,o[s]===b&&(o[s]=r.quick?H(l,r.quick):m.is(s)),o[s]&&q.push(r);q.length&&i.push({elem:l,matches:q})}}d.length>e&&i.push({elem:this,matches:d.slice(e)});for(j=0;j<i.length&&!c.isPropagationStopped();j++){p=i[j],c.currentTarget=p.elem;for(k=0;k<p.matches.length&&!c.isImmediatePropagationStopped();k++){r=p.matches[k];if(h||!c.namespace&&!r.namespace||c.namespace_re&&c.namespace_re.test(r.namespace))c.data=r.data,c.handleObj=r,n=((f.event.special[r.origType]||{}).handle||r.handler).apply(p.elem,g),n!==b&&(c.result=n,n===!1&&(c.preventDefault(),c.stopPropagation()))}}return c.result},props:"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){a.which==null&&(a.which=b.charCode!=null?b.charCode:b.keyCode);return a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,d){var e,f,g,h=d.button,i=d.fromElement;a.pageX==null&&d.clientX!=null&&(e=a.target.ownerDocument||c,f=e.documentElement,g=e.body,a.pageX=d.clientX+(f&&f.scrollLeft||g&&g.scrollLeft||0)-(f&&f.clientLeft||g&&g.clientLeft||0),a.pageY=d.clientY+(f&&f.scrollTop||g&&g.scrollTop||0)-(f&&f.clientTop||g&&g.clientTop||0)),!a.relatedTarget&&i&&(a.relatedTarget=i===a.target?d.toElement:i),!a.which&&h!==b&&(a.which=h&1?1:h&2?3:h&4?2:0);return a}},fix:function(a){if(a[f.expando])return a;var d,e,g=a,h=f.event.fixHooks[a.type]||{},i=h.props?this.props.concat(h.props):this.props;a=f.Event(g);for(d=i.length;d;)e=i[--d],a[e]=g[e];a.target||(a.target=g.srcElement||c),a.target.nodeType===3&&(a.target=a.target.parentNode),a.metaKey===b&&(a.metaKey=a.ctrlKey);return h.filter?h.filter(a,g):a},special:{ready:{setup:f.bindReady},load:{noBubble:!0},focus:{delegateType:"focusin"},blur:{delegateType:"focusout"},beforeunload:{setup:function(a,b,c){f.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}},simulate:function(a,b,c,d){var e=f.extend(new f.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?f.event.trigger(e,null,b):f.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},f.event.handle=f.event.dispatch,f.removeEvent=c.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){a.detachEvent&&a.detachEvent("on"+b,c)},f.Event=function(a,b){if(!(this instanceof f.Event))return new f.Event(a,b);a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?K:J):this.type=a,b&&f.extend(this,b),this.timeStamp=a&&a.timeStamp||f.now(),this[f.expando]=!0},f.Event.prototype={preventDefault:function(){this.isDefaultPrevented=K;var a=this.originalEvent;!a||(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){this.isPropagationStopped=K;var a=this.originalEvent;!a||(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=K,this.stopPropagation()},isDefaultPrevented:J,isPropagationStopped:J,isImmediatePropagationStopped:J},f.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){f.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c=this,d=a.relatedTarget,e=a.handleObj,g=e.selector,h;if(!d||d!==c&&!f.contains(c,d))a.type=e.origType,h=e.handler.apply(this,arguments),a.type=b;return h}}}),f.support.submitBubbles||(f.event.special.submit={setup:function(){if(f.nodeName(this,"form"))return!1;f.event.add(this,"click._submit keypress._submit",function(a){var c=a.target,d=f.nodeName(c,"input")||f.nodeName(c,"button")?c.form:b;d&&!d._submit_attached&&(f.event.add(d,"submit._submit",function(a){this.parentNode&&!a.isTrigger&&f.event.simulate("submit",this.parentNode,a,!0)}),d._submit_attached=!0)})},teardown:function(){if(f.nodeName(this,"form"))return!1;f.event.remove(this,"._submit")}}),f.support.changeBubbles||(f.event.special.change={setup:function(){if(z.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio")f.event.add(this,"propertychange._change",function(a){a.originalEvent.propertyName==="checked"&&(this._just_changed=!0)}),f.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1,f.event.simulate("change",this,a,!0))});return!1}f.event.add(this,"beforeactivate._change",function(a){var b=a.target;z.test(b.nodeName)&&!b._change_attached&&(f.event.add(b,"change._change",function(a){this.parentNode&&!a.isSimulated&&!a.isTrigger&&f.event.simulate("change",this.parentNode,a,!0)}),b._change_attached=!0)})},handle:function(a){var b=a.target;if(this!==b||a.isSimulated||a.isTrigger||b.type!=="radio"&&b.type!=="checkbox")return a.handleObj.handler.apply(this,arguments)},teardown:function(){f.event.remove(this,"._change");return z.test(this.nodeName)}}),f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){var d=0,e=function(a){f.event.simulate(b,a.target,f.event.fix(a),!0)};f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.fn.extend({on:function(a,c,d,e,g){var h,i;if(typeof a=="object"){typeof c!="string"&&(d=c,c=b);for(i in a)this.on(i,c,d,a[i],g);return this}d==null&&e==null?(e=c,d=c=b):e==null&&(typeof c=="string"?(e=d,d=b):(e=d,d=c,c=b));if(e===!1)e=J;else if(!e)return this;g===1&&(h=e,e=function(a){f().off(a);return h.apply(this,arguments)},e.guid=h.guid||(h.guid=f.guid++));return this.each(function(){f.event.add(this,a,e,d,c)})},one:function(a,b,c,d){return this.on.call(this,a,b,c,d,1)},off:function(a,c,d){if(a&&a.preventDefault&&a.handleObj){var e=a.handleObj;f(a.delegateTarget).off(e.namespace?e.type+"."+e.namespace:e.type,e.selector,e.handler);return this}if(typeof a=="object"){for(var g in a)this.off(g,c,a[g]);return this}if(c===!1||typeof c=="function")d=c,c=b;d===!1&&(d=J);return this.each(function(){f.event.remove(this,a,d,c)})},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},live:function(a,b,c){f(this.context).on(a,this.selector,b,c);return this},die:function(a,b){f(this.context).off(a,this.selector||"**",b);return this},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return arguments.length==1?this.off(a,"**"):this.off(b,a,c)},trigger:function(a,b){return this.each(function(){f.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0])return f.event.trigger(a,b,this[0],!0)},toggle:function(a){var b=arguments,c=a.guid||f.guid++,d=0,e=function(c){var e=(f._data(this,"lastToggle"+a.guid)||0)%d;f._data(this,"lastToggle"+a.guid,e+1),c.preventDefault();return b[e].apply(this,arguments)||!1};e.guid=c;while(d<b.length)b[d++].guid=c;return this.click(e)},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),f.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(a,b){f.fn[b]=function(a,c){c==null&&(c=a,a=null);return arguments.length>0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}if(j.nodeType===1){g||(j[d]=c,j.sizset=h);if(typeof b!="string"){if(j===b){k=!0;break}}else if(m.filter(b,[j]).length>0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}j.nodeType===1&&!g&&(j[d]=c,j.sizset=h);if(j.nodeName.toLowerCase()===b){k=j;break}j=j[a]}e[h]=k}}}var a=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b<a.length;b++)a[b]===a[b-1]&&a.splice(b--,1)}return a},m.matches=function(a,b){return m(a,null,null,b)},m.matchesSelector=function(a,b){return m(b,null,null,[a]).length>0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e<f;e++){h=o.order[e];if(g=o.leftMatch[h].exec(a)){i=g[1],g.splice(1,1);if(i.substr(i.length-1)!=="\\"){g[1]=(g[1]||"").replace(j,""),d=o.find[h](g,b,c);if(d!=null){a=a.replace(o.match[h],"");break}}}}d||(d=typeof b.getElementsByTagName!="undefined"?b.getElementsByTagName("*"):[]);return{set:d,expr:a}},m.filter=function(a,c,d,e){var f,g,h,i,j,k,l,n,p,q=a,r=[],s=c,t=c&&c[0]&&m.isXML(c[0]);while(a&&c.length){for(h in o.filter)if((f=o.leftMatch[h].exec(a))!=null&&f[2]){k=o.filter[h],l=f[1],g=!1,f.splice(1,1);if(l.substr(l.length-1)==="\\")continue;s===r&&(r=[]);if(o.preFilter[h]){f=o.preFilter[h](f,s,d,r,e,t);if(!f)g=i=!0;else if(f===!0)continue}if(f)for(n=0;(j=s[n])!=null;n++)j&&(i=k(j,f,n,s),p=e^i,d&&i!=null?p?g=!0:s[n]=!1:p&&(r.push(j),g=!0));if(i!==b){d||(s=r),a=a.replace(o.match[h],"");if(!g)return[];break}}if(a===q)if(g==null)m.error(a);else break;q=a}return s},m.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)};var n=m.getText=function(a){var b,c,d=a.nodeType,e="";if(d){if(d===1||d===9){if(typeof a.textContent=="string")return a.textContent;if(typeof a.innerText=="string")return a.innerText.replace(k,"");for(a=a.firstChild;a;a=a.nextSibling)e+=n(a)}else if(d===3||d===4)return a.nodeValue}else for(b=0;c=a[b];b++)c.nodeType!==8&&(e+=n(c));return e},o=m.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(a){return a.getAttribute("href")},type:function(a){return a.getAttribute("type")}},relative:{"+":function(a,b){var c=typeof b=="string",d=c&&!l.test(b),e=c&&!d;d&&(b=b.toLowerCase());for(var f=0,g=a.length,h;f<g;f++)if(h=a[f]){while((h=h.previousSibling)&&h.nodeType!==1);a[f]=e||h&&h.nodeName.toLowerCase()===b?h||!1:h===b}e&&m.filter(b,a,!0)},">":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e<f;e++){c=a[e];if(c){var g=c.parentNode;a[e]=g.nodeName.toLowerCase()===b?g:!1}}}else{for(;e<f;e++)c=a[e],c&&(a[e]=d?c.parentNode:c.parentNode===b);d
+&&m.filter(b,a,!0)}},"":function(a,b,c){var d,f=e++,g=x;typeof b=="string"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g("parentNode",b,f,a,d,c)},"~":function(a,b,c){var d,f=e++,g=x;typeof b=="string"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g("previousSibling",b,f,a,d,c)}},find:{ID:function(a,b,c){if(typeof b.getElementById!="undefined"&&!c){var d=b.getElementById(a[1]);return d&&d.parentNode?[d]:[]}},NAME:function(a,b){if(typeof b.getElementsByName!="undefined"){var c=[],d=b.getElementsByName(a[1]);for(var e=0,f=d.length;e<f;e++)d[e].getAttribute("name")===a[1]&&c.push(d[e]);return c.length===0?null:c}},TAG:function(a,b){if(typeof b.getElementsByTagName!="undefined")return b.getElementsByTagName(a[1])}},preFilter:{CLASS:function(a,b,c,d,e,f){a=" "+a[1].replace(j,"")+" ";if(f)return a;for(var g=0,h;(h=b[g])!=null;g++)h&&(e^(h.className&&(" "+h.className+" ").replace(/[\t\n\r]/g," ").indexOf(a)>=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return b<c[3]-0},gt:function(a,b,c){return b>c[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h<i;h++)if(g[h]===a)return!1;return!0}m.error(e)},CHILD:function(a,b){var c,e,f,g,h,i,j,k=b[1],l=a;switch(k){case"only":case"first":while(l=l.previousSibling)if(l.nodeType===1)return!1;if(k==="first")return!0;l=a;case"last":while(l=l.nextSibling)if(l.nodeType===1)return!1;return!0;case"nth":c=b[2],e=b[3];if(c===1&&e===0)return!0;f=b[0],g=a.parentNode;if(g&&(g[d]!==f||!a.nodeIndex)){i=0;for(l=g.firstChild;l;l=l.nextSibling)l.nodeType===1&&(l.nodeIndex=++i);g[d]=f}j=a.nodeIndex-e;return c===0?j===0:j%c===0&&j/c>=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c<e;c++)d.push(a[c]);else for(;a[c];c++)d.push(a[c]);return d}}var u,v;c.documentElement.compareDocumentPosition?u=function(a,b){if(a===b){h=!0;return 0}if(!a.compareDocumentPosition||!b.compareDocumentPosition)return a.compareDocumentPosition?-1:1;return a.compareDocumentPosition(b)&4?-1:1}:(u=function(a,b){if(a===b){h=!0;return 0}if(a.sourceIndex&&b.sourceIndex)return a.sourceIndex-b.sourceIndex;var c,d,e=[],f=[],g=a.parentNode,i=b.parentNode,j=g;if(g===i)return v(a,b);if(!g)return-1;if(!i)return 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)f.unshift(j),j=j.parentNode;c=e.length,d=f.length;for(var k=0;k<c&&k<d;k++)if(e[k]!==f[k])return v(e[k],f[k]);return k===c?v(a,f[k],-1):v(e[k],b,1)},v=function(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),function(){var a=c.createElement("div"),d="script"+(new Date).getTime(),e=c.documentElement;a.innerHTML="<a name='"+d+"'/>",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="<p class='TEST'></p>";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="<div class='test e'></div><div class='test'></div>";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h<i;h++)m(a,g[h],e,c);return m.filter(f,e)};m.attr=f.attr,m.selectors.attrMap={},f.find=m,f.expr=m.selectors,f.expr[":"]=f.expr.filters,f.unique=m.uniqueSort,f.text=m.getText,f.isXMLDoc=m.isXML,f.contains=m.contains}();var L=/Until$/,M=/^(?:parents|prevUntil|prevAll)/,N=/,/,O=/^.[^:#\[\.,]*$/,P=Array.prototype.slice,Q=f.expr.match.POS,R={children:!0,contents:!0,next:!0,prev:!0};f.fn.extend({find:function(a){var b=this,c,d;if(typeof a!="string")return f(a).filter(function(){for(c=0,d=b.length;c<d;c++)if(f.contains(b[c],this))return!0});var e=this.pushStack("","find",a),g,h,i;for(c=0,d=this.length;c<d;c++){g=e.length,f.find(a,this[c],e);if(c>0)for(h=g;h<e.length;h++)for(i=0;i<g;i++)if(e[i]===e[h]){e.splice(h--,1);break}}return e},has:function(a){var b=f(a);return this.filter(function(){for(var a=0,c=b.length;a<c;a++)if(f.contains(this,b[a]))return!0})},not:function(a){return this.pushStack(T(this,a,!1),"not",a)},filter:function(a){return this.pushStack(T(this,a,!0),"filter",a)},is:function(a){return!!a&&(typeof a=="string"?Q.test(a)?f(a,this.context).index(this[0])>=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d<a.length;d++)f(g).is(a[d])&&c.push({selector:a[d],elem:g,level:h});g=g.parentNode,h++}return c}var i=Q.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d<e;d++){g=this[d];while(g){if(i?i.index(g)>-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/<tbody/i,_=/<|&#?\w+;/,ba=/<(?:script|style)/i,bb=/<(?:script|object|embed|option|style)/i,bc=new RegExp("<(?:"+V+")","i"),bd=/checked\s*(?:[^=]|=\s*.checked.)/i,be=/\/(java|ecma)script/i,bf=/^\s*<!(?:\[CDATA\[|\-\-)/,bg={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div<div>","</div>"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),
+f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function()
+{for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1></$2>");try{for(var c=0,d=this.length;c<d;c++)this[c].nodeType===1&&(f.cleanData(this[c].getElementsByTagName("*")),this[c].innerHTML=a)}catch(e){this.empty().append(a)}}else f.isFunction(a)?this.each(function(b){var c=f(this);c.html(a.call(this,b,c.html()))}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(f.isFunction(a))return this.each(function(b){var c=f(this),d=c.html();c.replaceWith(a.call(this,b,d))});typeof a!="string"&&(a=f(a).detach());return this.each(function(){var b=this.nextSibling,c=this.parentNode;f(this).remove(),b?f(b).before(a):f(c).append(a)})}return this.length?this.pushStack(f(f.isFunction(a)?a():a),"replaceWith",a):this},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,d){var e,g,h,i,j=a[0],k=[];if(!f.support.checkClone&&arguments.length===3&&typeof j=="string"&&bd.test(j))return this.each(function(){f(this).domManip(a,c,d,!0)});if(f.isFunction(j))return this.each(function(e){var g=f(this);a[0]=j.call(this,e,c?g.html():b),g.domManip(a,c,d)});if(this[0]){i=j&&j.parentNode,f.support.parentNode&&i&&i.nodeType===11&&i.childNodes.length===this.length?e={fragment:i}:e=f.buildFragment(a,this,k),h=e.fragment,h.childNodes.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&&f.nodeName(g,"tr");for(var l=0,m=this.length,n=m-1;l<m;l++)d.call(c?bi(this[l],g):this[l],e.cacheable||m>1&&l<n?f.clone(h,!0,!0):h)}k.length&&f.each(k,bp)}return this}}),f.buildFragment=function(a,b,d){var e,g,h,i,j=a[0];b&&b[0]&&(i=b[0].ownerDocument||b[0]),i.createDocumentFragment||(i=c),a.length===1&&typeof j=="string"&&j.length<512&&i===c&&j.charAt(0)==="<"&&!bb.test(j)&&(f.support.checkClone||!bd.test(j))&&(f.support.html5Clone||!bc.test(j))&&(g=!0,h=f.fragments[j],h&&h!==1&&(e=h)),e||(e=i.createDocumentFragment(),f.clean(a,i,e,d)),g&&(f.fragments[j]=h?e:1);return{fragment:e,cacheable:g}},f.fragments={},f.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){f.fn[a]=function(c){var d=[],e=f(c),g=this.length===1&&this[0].parentNode;if(g&&g.nodeType===11&&g.childNodes.length===1&&e.length===1){e[b](this[0]);return this}for(var h=0,i=e.length;h<i;h++){var j=(h>0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||!bc.test("<"+a.nodeName)?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!_.test(k))k=b.createTextNode(k);else{k=k.replace(Y,"<$1></$2>");var l=(Z.exec(k)||["",""])[1].toLowerCase(),m=bg[l]||bg._default,n=m[0],o=b.createElement("div");b===c?bh.appendChild(o):U(b).appendChild(o),o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=$.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]==="<table>"&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&X.test(k)&&o.insertBefore(b.createTextNode(X.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i<r;i++)bn(k[i]);else bn(k);k.nodeType?h.push(k):h=f.merge(h,k)}if(d){g=function(a){return!a.type||be.test(a.type)};for(j=0;h[j];j++)if(e&&f.nodeName(h[j],"script")&&(!h[j].type||h[j].type.toLowerCase()==="text/javascript"))e.push(h[j].parentNode?h[j].parentNode.removeChild(h[j]):h[j]);else{if(h[j].nodeType===1){var s=f.grep(h[j].getElementsByTagName("script"),g);h.splice.apply(h,[j+1,0].concat(s))}d.appendChild(h[j])}}return h},cleanData:function(a){var b,c,d=f.cache,e=f.event.special,g=f.support.deleteExpando;for(var h=0,i;(i=a[h])!=null;h++){if(i.nodeName&&f.noData[i.nodeName.toLowerCase()])continue;c=i[f.expando];if(c){b=d[c];if(b&&b.events){for(var j in b.events)e[j]?f.event.remove(i,j):f.removeEvent(i,j,b.handle);b.handle&&(b.handle.elem=null)}g?delete i[f.expando]:i.removeAttribute&&i.removeAttribute(f.expando),delete d[c]}}}});var bq=/alpha\([^)]*\)/i,br=/opacity=([^)]*)/,bs=/([A-Z]|^ms)/g,bt=/^-?\d+(?:px)?$/i,bu=/^-?\d/,bv=/^([\-+])=([\-+.\de]+)/,bw={position:"absolute",visibility:"hidden",display:"block"},bx=["Left","Right"],by=["Top","Bottom"],bz,bA,bB;f.fn.css=function(a,c){if(arguments.length===2&&c===b)return this;return f.access(this,a,c,!0,function(a,c,d){return d!==b?f.style(a,c,d):f.css(a,c)})},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bz(a,"opacity","opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h==="string"&&(g=bv.exec(d))&&(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h="number");if(d==null||h==="number"&&isNaN(d))return;h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(bz)return bz(a,c)},swap:function(a,b,c){var d={};for(var e in b)d[e]=a.style[e],a.style[e]=b[e];c.call(a);for(e in b)a.style[e]=d[e]}}),f.curCSS=f.css,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){var e;if(c){if(a.offsetWidth!==0)return bC(a,b,d);f.swap(a,bw,function(){e=bC(a,b,d)});return e}},set:function(a,b){if(!bt.test(b))return b;b=parseFloat(b);if(b>=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return br.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bq,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bq.test(g)?g.replace(bq,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bz(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bA=function(a,b){var c,d,e;b=b.replace(bs,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b)));return c}),c.documentElement.currentStyle&&(bB=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f===null&&g&&(e=g[b])&&(f=e),!bt.test(f)&&bu.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f||0,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),bz=bA||bB,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bD=/%20/g,bE=/\[\]$/,bF=/\r?\n/g,bG=/#.*$/,bH=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bI=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bJ=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bK=/^(?:GET|HEAD)$/,bL=/^\/\//,bM=/\?/,bN=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bO=/^(?:select|textarea)/i,bP=/\s+/,bQ=/([?&])_=[^&]*/,bR=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bS=f.fn.load,bT={},bU={},bV,bW,bX=["*/"]+["*"];try{bV=e.href}catch(bY){bV=c.createElement("a"),bV.href="",bV=bV.href}bW=bR.exec(bV.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bS)return bS.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("<div>").append(c.replace(bN,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bO.test(this.nodeName)||bI.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bF,"\r\n")}}):{name:b.name,value:c.replace(bF,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b_(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b_(a,b);return a},ajaxSettings:{url:bV,isLocal:bJ.test(bW[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bX},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bZ(bT),ajaxTransport:bZ(bU),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?cb(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cc(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bH.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bG,"").replace(bL,bW[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bP),d.crossDomain==null&&(r=bR.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bW[1]&&r[2]==bW[2]&&(r[3]||(r[1]==="http:"?80:443))==(bW[3]||(bW[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),b$(bT,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bK.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bM.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bQ,"$1_="+x);d.url=y+(y===d.url?(bM.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bX+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=b$(bU,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)ca(g,a[g],c,e);return d.join("&").replace(bD,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cd=f.now(),ce=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cd++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ce.test(b.url)||e&&ce.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ce,l),b.url===j&&(e&&(k=k.replace(ce,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cf=a.ActiveXObject?function(){for(var a in ch)ch[a](0,1)}:!1,cg=0,ch;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ci()||cj()}:ci,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c)
+{if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cf&&delete ch[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cg,cf&&(ch||(ch={},f(a).unload(cf)),ch[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var ck={},cl,cm,cn=/^(?:toggle|show|hide)$/,co=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cp,cq=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cr;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cu("show",3),a,b,c);for(var g=0,h=this.length;g<h;g++)d=this[g],d.style&&(e=d.style.display,!f._data(d,"olddisplay")&&e==="none"&&(e=d.style.display=""),e===""&&f.css(d,"display")==="none"&&f._data(d,"olddisplay",cv(d.nodeName)));for(g=0;g<h;g++){d=this[g];if(d.style){e=d.style.display;if(e===""||e==="none")d.style.display=f._data(d,"olddisplay")||""}}return this},hide:function(a,b,c){if(a||a===0)return this.animate(cu("hide",3),a,b,c);var d,e,g=0,h=this.length;for(;g<h;g++)d=this[g],d.style&&(e=f.css(d,"display"),e!=="none"&&!f._data(d,"olddisplay")&&f._data(d,"olddisplay",e));for(g=0;g<h;g++)this[g].style&&(this[g].style.display="none");return this},_toggle:f.fn.toggle,toggle:function(a,b,c){var d=typeof a=="boolean";f.isFunction(a)&&f.isFunction(b)?this._toggle.apply(this,arguments):a==null||d?this.each(function(){var b=d?a:f(this).is(":hidden");f(this)[b?"show":"hide"]()}):this.animate(cu("toggle",3),a,b,c);return this},fadeTo:function(a,b,c,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){function g(){e.queue===!1&&f._mark(this);var b=f.extend({},e),c=this.nodeType===1,d=c&&f(this).is(":hidden"),g,h,i,j,k,l,m,n,o;b.animatedProperties={};for(i in a){g=f.camelCase(i),i!==g&&(a[g]=a[i],delete a[i]),h=a[g],f.isArray(h)?(b.animatedProperties[g]=h[1],h=a[g]=h[0]):b.animatedProperties[g]=b.specialEasing&&b.specialEasing[g]||b.easing||"swing";if(h==="hide"&&d||h==="show"&&!d)return b.complete.call(this);c&&(g==="height"||g==="width")&&(b.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY],f.css(this,"display")==="inline"&&f.css(this,"float")==="none"&&(!f.support.inlineBlockNeedsLayout||cv(this.nodeName)==="inline"?this.style.display="inline-block":this.style.zoom=1))}b.overflow!=null&&(this.style.overflow="hidden");for(i in a)j=new f.fx(this,b,i),h=a[i],cn.test(h)?(o=f._data(this,"toggle"+i)||(h==="toggle"?d?"show":"hide":0),o?(f._data(this,"toggle"+i,o==="show"?"hide":"show"),j[o]()):j[h]()):(k=co.exec(h),l=j.cur(),k?(m=parseFloat(k[2]),n=k[3]||(f.cssNumber[i]?"":"px"),n!=="px"&&(f.style(this,i,(m||1)+n),l=(m||1)/j.cur()*l,f.style(this,i,l+n)),k[1]&&(m=(k[1]==="-="?-1:1)*m+l),j.custom(l,m,n)):j.custom(l,h,""));return!0}var e=f.speed(b,c,d);if(f.isEmptyObject(a))return this.each(e.complete,[!1]);a=f.extend({},a);return e.queue===!1?this.each(g):this.queue(e.queue,g)},stop:function(a,c,d){typeof a!="string"&&(d=c,c=a,a=b),c&&a!==!1&&this.queue(a||"fx",[]);return this.each(function(){function h(a,b,c){var e=b[c];f.removeData(a,c,!0),e.stop(d)}var b,c=!1,e=f.timers,g=f._data(this);d||f._unmark(!0,this);if(a==null)for(b in g)g[b]&&g[b].stop&&b.indexOf(".run")===b.length-4&&h(this,g,b);else g[b=a+".run"]&&g[b].stop&&h(this,g,b);for(b=e.length;b--;)e[b].elem===this&&(a==null||e[b].queue===a)&&(d?e[b](!0):e[b].saveState(),c=!0,e.splice(b,1));(!d||!c)&&f.dequeue(this,a)})}}),f.each({slideDown:cu("show",1),slideUp:cu("hide",1),slideToggle:cu("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){f.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),f.extend({speed:function(a,b,c){var d=a&&typeof a=="object"?f.extend({},a):{complete:c||!c&&b||f.isFunction(a)&&a,duration:a,easing:c&&b||b&&!f.isFunction(b)&&b};d.duration=f.fx.off?0:typeof d.duration=="number"?d.duration:d.duration in f.fx.speeds?f.fx.speeds[d.duration]:f.fx.speeds._default;if(d.queue==null||d.queue===!0)d.queue="fx";d.old=d.complete,d.complete=function(a){f.isFunction(d.old)&&d.old.call(this),d.queue?f.dequeue(this,d.queue):a!==!1&&f._unmark(this)};return d},easing:{linear:function(a,b,c,d){return c+d*a},swing:function(a,b,c,d){return(-Math.cos(a*Math.PI)/2+.5)*d+c}},timers:[],fx:function(a,b,c){this.options=b,this.elem=a,this.prop=c,b.orig=b.orig||{}}}),f.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this),(f.fx.step[this.prop]||f.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a,b=f.css(this.elem,this.prop);return isNaN(a=parseFloat(b))?!b||b==="auto"?0:b:a},custom:function(a,c,d){function h(a){return e.step(a)}var e=this,g=f.fx;this.startTime=cr||cs(),this.end=c,this.now=this.start=a,this.pos=this.state=0,this.unit=d||this.unit||(f.cssNumber[this.prop]?"":"px"),h.queue=this.options.queue,h.elem=this.elem,h.saveState=function(){e.options.hide&&f._data(e.elem,"fxshow"+e.prop)===b&&f._data(e.elem,"fxshow"+e.prop,e.start)},h()&&f.timers.push(h)&&!cp&&(cp=setInterval(g.tick,g.interval))},show:function(){var a=f._data(this.elem,"fxshow"+this.prop);this.options.orig[this.prop]=a||f.style(this.elem,this.prop),this.options.show=!0,a!==b?this.custom(this.cur(),a):this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur()),f(this.elem).show()},hide:function(){this.options.orig[this.prop]=f._data(this.elem,"fxshow"+this.prop)||f.style(this.elem,this.prop),this.options.hide=!0,this.custom(this.cur(),0)},step:function(a){var b,c,d,e=cr||cs(),g=!0,h=this.elem,i=this.options;if(a||e>=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c<b.length;c++)a=b[c],!a()&&b[c]===a&&b.splice(c--,1);b.length||f.fx.stop()},interval:13,stop:function(){clearInterval(cp),cp=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){f.style(a.elem,"opacity",a.now)},_default:function(a){a.elem.style&&a.elem.style[a.prop]!=null?a.elem.style[a.prop]=a.now+a.unit:a.elem[a.prop]=a.now}}}),f.each(["width","height"],function(a,b){f.fx.step[b]=function(a){f.style(a.elem,b,Math.max(0,a.now)+a.unit)}}),f.expr&&f.expr.filters&&(f.expr.filters.animated=function(a){return f.grep(f.timers,function(b){return a===b.elem}).length});var cw=/^t(?:able|d|h)$/i,cx=/^(?:body|html)$/i;"getBoundingClientRect"in c.documentElement?f.fn.offset=function(a){var b=this[0],c;if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);try{c=b.getBoundingClientRect()}catch(d){}var e=b.ownerDocument,g=e.documentElement;if(!c||!f.contains(g,b))return c?{top:c.top,left:c.left}:{top:0,left:0};var h=e.body,i=cy(e),j=g.clientTop||h.clientTop||0,k=g.clientLeft||h.clientLeft||0,l=i.pageYOffset||f.support.boxModel&&g.scrollTop||h.scrollTop,m=i.pageXOffset||f.support.boxModel&&g.scrollLeft||h.scrollLeft,n=c.top+l-j,o=c.left+m-k;return{top:n,left:o}}:f.fn.offset=function(a){var b=this[0];if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);var c,d=b.offsetParent,e=b,g=b.ownerDocument,h=g.documentElement,i=g.body,j=g.defaultView,k=j?j.getComputedStyle(b,null):b.currentStyle,l=b.offsetTop,m=b.offsetLeft;while((b=b.parentNode)&&b!==i&&b!==h){if(f.support.fixedPosition&&k.position==="fixed")break;c=j?j.getComputedStyle(b,null):b.currentStyle,l-=b.scrollTop,m-=b.scrollLeft,b===d&&(l+=b.offsetTop,m+=b.offsetLeft,f.support.doesNotAddBorder&&(!f.support.doesAddBorderForTableAndCells||!cw.test(b.nodeName))&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),e=d,d=b.offsetParent),f.support.subtractsBorderForOverflowNotVisible&&c.overflow!=="visible"&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),k=c}if(k.position==="relative"||k.position==="static")l+=i.offsetTop,m+=i.offsetLeft;f.support.fixedPosition&&k.position==="fixed"&&(l+=Math.max(h.scrollTop,i.scrollTop),m+=Math.max(h.scrollLeft,i.scrollLeft));return{top:l,left:m}},f.offset={bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.support.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cy(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cy(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,d,"padding")):this[d]():null},f.fn["outer"+c]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,d,a?"margin":"border")):this[d]():null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c],h=e.document.body;return e.document.compatMode==="CSS1Compat"&&g||h&&h["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var i=f.css(e,d),j=parseFloat(i);return f.isNumeric(j)?j:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window);
+/*!
+ * jQuery UI 1.8.18
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI
+ */
+(function(a,b){function d(b){return!a(b).parents().andSelf().filter(function(){return a.curCSS(this,"visibility")==="hidden"||a.expr.filters.hidden(this)}).length}function c(b,c){var e=b.nodeName.toLowerCase();if("area"===e){var f=b.parentNode,g=f.name,h;if(!b.href||!g||f.nodeName.toLowerCase()!=="map")return!1;h=a("img[usemap=#"+g+"]")[0];return!!h&&d(h)}return(/input|select|textarea|button|object/.test(e)?!b.disabled:"a"==e?b.href||c:c)&&d(b)}a.ui=a.ui||{};a.ui.version||(a.extend(a.ui,{version:"1.8.18",keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}}),a.fn.extend({propAttr:a.fn.prop||a.fn.attr,_focus:a.fn.focus,focus:function(b,c){return typeof b=="number"?this.each(function(){var d=this;setTimeout(function(){a(d).focus(),c&&c.call(d)},b)}):this._focus.apply(this,arguments)},scrollParent:function(){var b;a.browser.msie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?b=this.parents().filter(function(){return/(relative|absolute|fixed)/.test(a.curCSS(this,"position",1))&&/(auto|scroll)/.test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0):b=this.parents().filter(function(){return/(auto|scroll)/.test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0);return/fixed/.test(this.css("position"))||!b.length?a(document):b},zIndex:function(c){if(c!==b)return this.css("zIndex",c);if(this.length){var d=a(this[0]),e,f;while(d.length&&d[0]!==document){e=d.css("position");if(e==="absolute"||e==="relative"||e==="fixed"){f=parseInt(d.css("zIndex"),10);if(!isNaN(f)&&f!==0)return f}d=d.parent()}}return 0},disableSelection:function(){return this.bind((a.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(a){a.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}}),a.each(["Width","Height"],function(c,d){function h(b,c,d,f){a.each(e,function(){c-=parseFloat(a.curCSS(b,"padding"+this,!0))||0,d&&(c-=parseFloat(a.curCSS(b,"border"+this+"Width",!0))||0),f&&(c-=parseFloat(a.curCSS(b,"margin"+this,!0))||0)});return c}var e=d==="Width"?["Left","Right"]:["Top","Bottom"],f=d.toLowerCase(),g={innerWidth:a.fn.innerWidth,innerHeight:a.fn.innerHeight,outerWidth:a.fn.outerWidth,outerHeight:a.fn.outerHeight};a.fn["inner"+d]=function(c){if(c===b)return g["inner"+d].call(this);return this.each(function(){a(this).css(f,h(this,c)+"px")})},a.fn["outer"+d]=function(b,c){if(typeof b!="number")return g["outer"+d].call(this,b);return this.each(function(){a(this).css(f,h(this,b,!0,c)+"px")})}}),a.extend(a.expr[":"],{data:function(b,c,d){return!!a.data(b,d[3])},focusable:function(b){return c(b,!isNaN(a.attr(b,"tabindex")))},tabbable:function(b){var d=a.attr(b,"tabindex"),e=isNaN(d);return(e||d>=0)&&c(b,!e)}}),a(function(){var b=document.body,c=b.appendChild(c=document.createElement("div"));c.offsetHeight,a.extend(c.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0}),a.support.minHeight=c.offsetHeight===100,a.support.selectstart="onselectstart"in c,b.removeChild(c).style.display="none"}),a.extend(a.ui,{plugin:{add:function(b,c,d){var e=a.ui[b].prototype;for(var f in d)e.plugins[f]=e.plugins[f]||[],e.plugins[f].push([c,d[f]])},call:function(a,b,c){var d=a.plugins[b];if(!!d&&!!a.element[0].parentNode)for(var e=0;e<d.length;e++)a.options[d[e][0]]&&d[e][1].apply(a.element,c)}},contains:function(a,b){return document.compareDocumentPosition?a.compareDocumentPosition(b)&16:a!==b&&a.contains(b)},hasScroll:function(b,c){if(a(b).css("overflow")==="hidden")return!1;var d=c&&c==="left"?"scrollLeft":"scrollTop",e=!1;if(b[d]>0)return!0;b[d]=1,e=b[d]>0,b[d]=0;return e},isOverAxis:function(a,b,c){return a>b&&a<b+c},isOver:function(b,c,d,e,f,g){return a.ui.isOverAxis(b,d,f)&&a.ui.isOverAxis(c,e,g)}}))})(jQuery);
+/*!
+ * jQuery UI Widget 1.8.18
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Widget
+ */
+(function(a,b){if(a.cleanData){var c=a.cleanData;a.cleanData=function(b){for(var d=0,e;(e=b[d])!=null;d++)try{a(e).triggerHandler("remove")}catch(f){}c(b)}}else{var d=a.fn.remove;a.fn.remove=function(b,c){return this.each(function(){c||(!b||a.filter(b,[this]).length)&&a("*",this).add([this]).each(function(){try{a(this).triggerHandler("remove")}catch(b){}});return d.call(a(this),b,c)})}}a.widget=function(b,c,d){var e=b.split(".")[0],f;b=b.split(".")[1],f=e+"-"+b,d||(d=c,c=a.Widget),a.expr[":"][f]=function(c){return!!a.data(c,b)},a[e]=a[e]||{},a[e][b]=function(a,b){arguments.length&&this._createWidget(a,b)};var g=new c;g.options=a.extend(!0,{},g.options),a[e][b].prototype=a.extend(!0,g,{namespace:e,widgetName:b,widgetEventPrefix:a[e][b].prototype.widgetEventPrefix||b,widgetBaseClass:f},d),a.widget.bridge(b,a[e][b])},a.widget.bridge=function(c,d){a.fn[c]=function(e){var f=typeof e=="string",g=Array.prototype.slice.call(arguments,1),h=this;e=!f&&g.length?a.extend.apply(null,[!0,e].concat(g)):e;if(f&&e.charAt(0)==="_")return h;f?this.each(function(){var d=a.data(this,c),f=d&&a.isFunction(d[e])?d[e].apply(d,g):d;if(f!==d&&f!==b){h=f;return!1}}):this.each(function(){var b=a.data(this,c);b?b.option(e||{})._init():a.data(this,c,new d(e,this))});return h}},a.Widget=function(a,b){arguments.length&&this._createWidget(a,b)},a.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",options:{disabled:!1},_createWidget:function(b,c){a.data(c,this.widgetName,this),this.element=a(c),this.options=a.extend(!0,{},this.options,this._getCreateOptions(),b);var d=this;this.element.bind("remove."+this.widgetName,function(){d.destroy()}),this._create(),this._trigger("create"),this._init()},_getCreateOptions:function(){return a.metadata&&a.metadata.get(this.element[0])[this.widgetName]},_create:function(){},_init:function(){},destroy:function(){this.element.unbind("."+this.widgetName).removeData(this.widgetName),this.widget().unbind("."+this.widgetName).removeAttr("aria-disabled").removeClass(this.widgetBaseClass+"-disabled "+"ui-state-disabled")},widget:function(){return this.element},option:function(c,d){var e=c;if(arguments.length===0)return a.extend({},this.options);if(typeof c=="string"){if(d===b)return this.options[c];e={},e[c]=d}this._setOptions(e);return this},_setOptions:function(b){var c=this;a.each(b,function(a,b){c._setOption(a,b)});return this},_setOption:function(a,b){this.options[a]=b,a==="disabled"&&this.widget()[b?"addClass":"removeClass"](this.widgetBaseClass+"-disabled"+" "+"ui-state-disabled").attr("aria-disabled",b);return this},enable:function(){return this._setOption("disabled",!1)},disable:function(){return this._setOption("disabled",!0)},_trigger:function(b,c,d){var e,f,g=this.options[b];d=d||{},c=a.Event(c),c.type=(b===this.widgetEventPrefix?b:this.widgetEventPrefix+b).toLowerCase(),c.target=this.element[0],f=c.originalEvent;if(f)for(e in f)e in c||(c[e]=f[e]);this.element.trigger(c,d);return!(a.isFunction(g)&&g.call(this.element[0],c,d)===!1||c.isDefaultPrevented())}}})(jQuery);
+/*!
+ * jQuery UI Mouse 1.8.18
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Mouse
+ *
+ * Depends:
+ * jquery.ui.widget.js
+ */
+(function(a,b){var c=!1;a(document).mouseup(function(a){c=!1}),a.widget("ui.mouse",{options:{cancel:":input,option",distance:1,delay:0},_mouseInit:function(){var b=this;this.element.bind("mousedown."+this.widgetName,function(a){return b._mouseDown(a)}).bind("click."+this.widgetName,function(c){if(!0===a.data(c.target,b.widgetName+".preventClickEvent")){a.removeData(c.target,b.widgetName+".preventClickEvent"),c.stopImmediatePropagation();return!1}}),this.started=!1},_mouseDestroy:function(){this.element.unbind("."+this.widgetName)},_mouseDown:function(b){if(!c){this._mouseStarted&&this._mouseUp(b),this._mouseDownEvent=b;var d=this,e=b.which==1,f=typeof this.options.cancel=="string"&&b.target.nodeName?a(b.target).closest(this.options.cancel).length:!1;if(!e||f||!this._mouseCapture(b))return!0;this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){d.mouseDelayMet=!0},this.options.delay));if(this._mouseDistanceMet(b)&&this._mouseDelayMet(b)){this._mouseStarted=this._mouseStart(b)!==!1;if(!this._mouseStarted){b.preventDefault();return!0}}!0===a.data(b.target,this.widgetName+".preventClickEvent")&&a.removeData(b.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(a){return d._mouseMove(a)},this._mouseUpDelegate=function(a){return d._mouseUp(a)},a(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate),b.preventDefault(),c=!0;return!0}},_mouseMove:function(b){if(a.browser.msie&&!(document.documentMode>=9)&&!b.button)return this._mouseUp(b);if(this._mouseStarted){this._mouseDrag(b);return b.preventDefault()}this._mouseDistanceMet(b)&&this._mouseDelayMet(b)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,b)!==!1,this._mouseStarted?this._mouseDrag(b):this._mouseUp(b));return!this._mouseStarted},_mouseUp:function(b){a(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,b.target==this._mouseDownEvent.target&&a.data(b.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(b));return!1},_mouseDistanceMet:function(a){return Math.max(Math.abs(this._mouseDownEvent.pageX-a.pageX),Math.abs(this._mouseDownEvent.pageY-a.pageY))>=this.options.distance},_mouseDelayMet:function(a){return this.mouseDelayMet},_mouseStart:function(a){},_mouseDrag:function(a){},_mouseStop:function(a){},_mouseCapture:function(a){return!0}})})(jQuery);
+/*
+ * jQuery UI Resizable 1.8.18
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Resizables
+ *
+ * Depends:
+ * jquery.ui.core.js
+ * jquery.ui.mouse.js
+ * jquery.ui.widget.js
+ */
+(function(a,b){a.widget("ui.resizable",a.ui.mouse,{widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:1e3},_create:function(){var b=this,c=this.options;this.element.addClass("ui-resizable"),a.extend(this,{_aspectRatio:!!c.aspectRatio,aspectRatio:c.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:c.helper||c.ghost||c.animate?c.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)&&(this.element.wrap(a('<div class="ui-wrapper" style="overflow: hidden;"></div>').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("resizable",this.element.data("resizable")),this.elementIsWrapper=!0,this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")}),this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0}),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css({margin:this.originalElement.css("margin")}),this._proportionallyResize()),this.handles=c.handles||(a(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se");if(this.handles.constructor==String){this.handles=="all"&&(this.handles="n,e,s,w,se,sw,ne,nw");var d=this.handles.split(",");this.handles={};for(var e=0;e<d.length;e++){var f=a.trim(d[e]),g="ui-resizable-"+f,h=a('<div class="ui-resizable-handle '+g+'"></div>');/sw|se|ne|nw/.test(f)&&h.css({zIndex:++c.zIndex}),"se"==f&&h.addClass("ui-icon ui-icon-gripsmall-diagonal-se"),this.handles[f]=".ui-resizable-"+f,this.element.append(h)}}this._renderAxis=function(b){b=b||this.element;for(var c in this.handles){this.handles[c].constructor==String&&(this.handles[c]=a(this.handles[c],this.element).show());if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var d=a(this.handles[c],this.element),e=0;e=/sw|ne|nw|se|n|s/.test(c)?d.outerHeight():d.outerWidth();var f=["padding",/ne|nw|n/.test(c)?"Top":/se|sw|s/.test(c)?"Bottom":/^e$/.test(c)?"Right":"Left"].join("");b.css(f,e),this._proportionallyResize()}if(!a(this.handles[c]).length)continue}},this._renderAxis(this.element),this._handles=a(".ui-resizable-handle",this.element).disableSelection(),this._handles.mouseover(function(){if(!b.resizing){if(this.className)var a=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);b.axis=a&&a[1]?a[1]:"se"}}),c.autoHide&&(this._handles.hide(),a(this.element).addClass("ui-resizable-autohide").hover(function(){c.disabled||(a(this).removeClass("ui-resizable-autohide"),b._handles.show())},function(){c.disabled||b.resizing||(a(this).addClass("ui-resizable-autohide"),b._handles.hide())})),this._mouseInit()},destroy:function(){this._mouseDestroy();var b=function(b){a(b).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};if(this.elementIsWrapper){b(this.element);var c=this.element;c.after(this.originalElement.css({position:c.css("position"),width:c.outerWidth(),height:c.outerHeight(),top:c.css("top"),left:c.css("left")})).remove()}this.originalElement.css("resize",this.originalResizeStyle),b(this.originalElement);return this},_mouseCapture:function(b){var c=!1;for(var d in this.handles)a(this.handles[d])[0]==b.target&&(c=!0);return!this.options.disabled&&c},_mouseStart:function(b){var d=this.options,e=this.element.position(),f=this.element;this.resizing=!0,this.documentScroll={top:a(document).scrollTop(),left:a(document).scrollLeft()},(f.is(".ui-draggable")||/absolute/.test(f.css("position")))&&f.css({position:"absolute",top:e.top,left:e.left}),this._renderProxy();var g=c(this.helper.css("left")),h=c(this.helper.css("top"));d.containment&&(g+=a(d.containment).scrollLeft()||0,h+=a(d.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:g,top:h},this.size=this._helper?{width:f.outerWidth(),height:f.outerHeight()}:{width:f.width(),height:f.height()},this.originalSize=this._helper?{width:f.outerWidth(),height:f.outerHeight()}:{width:f.width(),height:f.height()},this.originalPosition={left:g,top:h},this.sizeDiff={width:f.outerWidth()-f.width(),height:f.outerHeight()-f.height()},this.originalMousePosition={left:b.pageX,top:b.pageY},this.aspectRatio=typeof d.aspectRatio=="number"?d.aspectRatio:this.originalSize.width/this.originalSize.height||1;var i=a(".ui-resizable-"+this.axis).css("cursor");a("body").css("cursor",i=="auto"?this.axis+"-resize":i),f.addClass("ui-resizable-resizing"),this._propagate("start",b);return!0},_mouseDrag:function(b){var c=this.helper,d=this.options,e={},f=this,g=this.originalMousePosition,h=this.axis,i=b.pageX-g.left||0,j=b.pageY-g.top||0,k=this._change[h];if(!k)return!1;var l=k.apply(this,[b,i,j]),m=a.browser.msie&&a.browser.version<7,n=this.sizeDiff;this._updateVirtualBoundaries(b.shiftKey);if(this._aspectRatio||b.shiftKey)l=this._updateRatio(l,b);l=this._respectSize(l,b),this._propagate("resize",b),c.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"}),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),this._updateCache(l),this._trigger("resize",b,this.ui());return!1},_mouseStop:function(b){this.resizing=!1;var c=this.options,d=this;if(this._helper){var e=this._proportionallyResizeElements,f=e.length&&/textarea/i.test(e[0].nodeName),g=f&&a.ui.hasScroll(e[0],"left")?0:d.sizeDiff.height,h=f?0:d.sizeDiff.width,i={width:d.helper.width()-h,height:d.helper.height()-g},j=parseInt(d.element.css("left"),10)+(d.position.left-d.originalPosition.left)||null,k=parseInt(d.element.css("top"),10)+(d.position.top-d.originalPosition.top)||null;c.animate||this.element.css(a.extend(i,{top:k,left:j})),d.helper.height(d.size.height),d.helper.width(d.size.width),this._helper&&!c.animate&&this._proportionallyResize()}a("body").css("cursor","auto"),this.element.removeClass("ui-resizable-resizing"),this._propagate("stop",b),this._helper&&this.helper.remove();return!1},_updateVirtualBoundaries:function(a){var b=this.options,c,e,f,g,h;h={minWidth:d(b.minWidth)?b.minWidth:0,maxWidth:d(b.maxWidth)?b.maxWidth:Infinity,minHeight:d(b.minHeight)?b.minHeight:0,maxHeight:d(b.maxHeight)?b.maxHeight:Infinity};if(this._aspectRatio||a)c=h.minHeight*this.aspectRatio,f=h.minWidth/this.aspectRatio,e=h.maxHeight*this.aspectRatio,g=h.maxWidth/this.aspectRatio,c>h.minWidth&&(h.minWidth=c),f>h.minHeight&&(h.minHeight=f),e<h.maxWidth&&(h.maxWidth=e),g<h.maxHeight&&(h.maxHeight=g);this._vBoundaries=h},_updateCache:function(a){var b=this.options;this.offset=this.helper.offset(),d(a.left)&&(this.position.left=a.left),d(a.top)&&(this.position.top=a.top),d(a.height)&&(this.size.height=a.height),d(a.width)&&(this.size.width=a.width)},_updateRatio:function(a,b){var c=this.options,e=this.position,f=this.size,g=this.axis;d(a.height)?a.width=a.height*this.aspectRatio:d(a.width)&&(a.height=a.width/this.aspectRatio),g=="sw"&&(a.left=e.left+(f.width-a.width),a.top=null),g=="nw"&&(a.top=e.top+(f.height-a.height),a.left=e.left+(f.width-a.width));return a},_respectSize:function(a,b){var c=this.helper,e=this._vBoundaries,f=this._aspectRatio||b.shiftKey,g=this.axis,h=d(a.width)&&e.maxWidth&&e.maxWidth<a.width,i=d(a.height)&&e.maxHeight&&e.maxHeight<a.height,j=d(a.width)&&e.minWidth&&e.minWidth>a.width,k=d(a.height)&&e.minHeight&&e.minHeight>a.height;j&&(a.width=e.minWidth),k&&(a.height=e.minHeight),h&&(a.width=e.maxWidth),i&&(a.height=e.maxHeight);var l=this.originalPosition.left+this.originalSize.width,m=this.position.top+this.size.height,n=/sw|nw|w/.test(g),o=/nw|ne|n/.test(g);j&&n&&(a.left=l-e.minWidth),h&&n&&(a.left=l-e.maxWidth),k&&o&&(a.top=m-e.minHeight),i&&o&&(a.top=m-e.maxHeight);var p=!a.width&&!a.height;p&&!a.left&&a.top?a.top=null:p&&!a.top&&a.left&&(a.left=null);return a},_proportionallyResize:function(){var b=this.options;if(!!this._proportionallyResizeElements.length){var c=this.helper||this.element;for(var d=0;d<this._proportionallyResizeElements.length;d++){var e=this._proportionallyResizeElements[d];if(!this.borderDif){var f=[e.css("borderTopWidth"),e.css("borderRightWidth"),e.css("borderBottomWidth"),e.css("borderLeftWidth")],g=[e.css("paddingTop"),e.css("paddingRight"),e.css("paddingBottom"),e.css("paddingLeft")];this.borderDif=a.map(f,function(a,b){var c=parseInt(a,10)||0,d=parseInt(g[b],10)||0;return c+d})}if(a.browser.msie&&(!!a(c).is(":hidden")||!!a(c).parents(":hidden").length))continue;e.css({height:c.height()-this.borderDif[0]-this.borderDif[2]||0,width:c.width()-this.borderDif[1]-this.borderDif[3]||0})}}},_renderProxy:function(){var b=this.element,c=this.options;this.elementOffset=b.offset();if(this._helper){this.helper=this.helper||a('<div style="overflow:hidden;"></div>');var d=a.browser.msie&&a.browser.version<7,e=d?1:0,f=d?2:-1;this.helper.addClass(this._helper).css({width:this.element.outerWidth()+f,height:this.element.outerHeight()+f,position:"absolute",left:this.elementOffset.left-e+"px",top:this.elementOffset.top-e+"px",zIndex:++c.zIndex}),this.helper.appendTo("body").disableSelection()}else this.helper=this.element},_change:{e:function(a,b,c){return{width:this.originalSize.width+b}},w:function(a,b,c){var d=this.options,e=this.originalSize,f=this.originalPosition;return{left:f.left+b,width:e.width-b}},n:function(a,b,c){var d=this.options,e=this.originalSize,f=this.originalPosition;return{top:f.top+c,height:e.height-c}},s:function(a,b,c){return{height:this.originalSize.height+c}},se:function(b,c,d){return a.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[b,c,d]))},sw:function(b,c,d){return a.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[b,c,d]))},ne:function(b,c,d){return a.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[b,c,d]))},nw:function(b,c,d){return a.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[b,c,d]))}},_propagate:function(b,c){a.ui.plugin.call(this,b,[c,this.ui()]),b!="resize"&&this._trigger(b,c,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),a.extend(a.ui.resizable,{version:"1.8.18"}),a.ui.plugin.add("resizable","alsoResize",{start:function(b,c){var d=a(this).data("resizable"),e=d.options,f=function(b){a(b).each(function(){var b=a(this);b.data("resizable-alsoresize",{width:parseInt(b.width(),10),height:parseInt(b.height(),10),left:parseInt(b.css("left"),10),top:parseInt(b.css("top"),10)})})};typeof e.alsoResize=="object"&&!e.alsoResize.parentNode?e.alsoResize.length?(e.alsoResize=e.alsoResize[0],f(e.alsoResize)):a.each(e.alsoResize,function(a){f(a)}):f(e.alsoResize)},resize:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.originalSize,g=d.originalPosition,h={height:d.size.height-f.height||0,width:d.size.width-f.width||0,top:d.position.top-g.top||0,left:d.position.left-g.left||0},i=function(b,d){a(b).each(function(){var b=a(this),e=a(this).data("resizable-alsoresize"),f={},g=d&&d.length?d:b.parents(c.originalElement[0]).length?["width","height"]:["width","height","top","left"];a.each(g,function(a,b){var c=(e[b]||0)+(h[b]||0);c&&c>=0&&(f[b]=c||null)}),b.css(f)})};typeof e.alsoResize=="object"&&!e.alsoResize.nodeType?a.each(e.alsoResize,function(a,b){i(a,b)}):i(e.alsoResize)},stop:function(b,c){a(this).removeData("resizable-alsoresize")}}),a.ui.plugin.add("resizable","animate",{stop:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d._proportionallyResizeElements,g=f.length&&/textarea/i.test(f[0].nodeName),h=g&&a.ui.hasScroll(f[0],"left")?0:d.sizeDiff.height,i=g?0:d.sizeDiff.width,j={width:d.size.width-i,height:d.size.height-h},k=parseInt(d.element.css("left"),10)+(d.position.left-d.originalPosition.left)||null,l=parseInt(d.element.css("top"),10)+(d.position.top-d.originalPosition.top)||null;d.element.animate(a.extend(j,l&&k?{top:l,left:k}:{}),{duration:e.animateDuration,easing:e.animateEasing,step:function(){var c={width:parseInt(d.element.css("width"),10),height:parseInt(d.element.css("height"),10),top:parseInt(d.element.css("top"),10),left:parseInt(d.element.css("left"),10)};f&&f.length&&a(f[0]).css({width:c.width,height:c.height}),d._updateCache(c),d._propagate("resize",b)}})}}),a.ui.plugin.add("resizable","containment",{start:function(b,d){var e=a(this).data("resizable"),f=e.options,g=e.element,h=f.containment,i=h instanceof a?h.get(0):/parent/.test(h)?g.parent().get(0):h;if(!!i){e.containerElement=a(i);if(/document/.test(h)||h==document)e.containerOffset={left:0,top:0},e.containerPosition={left:0,top:0},e.parentData={element:a(document),left:0,top:0,width:a(document).width(),height:a(document).height()||document.body.parentNode.scrollHeight};else{var j=a(i),k=[];a(["Top","Right","Left","Bottom"]).each(function(a,b){k[a]=c(j.css("padding"+b))}),e.containerOffset=j.offset(),e.containerPosition=j.position(),e.containerSize={height:j.innerHeight()-k[3],width:j.innerWidth()-k[1]};var l=e.containerOffset,m=e.containerSize.height,n=e.containerSize.width,o=a.ui.hasScroll(i,"left")?i.scrollWidth:n,p=a.ui.hasScroll(i)?i.scrollHeight:m;e.parentData={element:i,left:l.left,top:l.top,width:o,height:p}}}},resize:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.containerSize,g=d.containerOffset,h=d.size,i=d.position,j=d._aspectRatio||b.shiftKey,k={top:0,left:0},l=d.containerElement;l[0]!=document&&/static/.test(l.css("position"))&&(k=g),i.left<(d._helper?g.left:0)&&(d.size.width=d.size.width+(d._helper?d.position.left-g.left:d.position.left-k.left),j&&(d.size.height=d.size.width/e.aspectRatio),d.position.left=e.helper?g.left:0),i.top<(d._helper?g.top:0)&&(d.size.height=d.size.height+(d._helper?d.position.top-g.top:d.position.top),j&&(d.size.width=d.size.height*e.aspectRatio),d.position.top=d._helper?g.top:0),d.offset.left=d.parentData.left+d.position.left,d.offset.top=d.parentData.top+d.position.top;var m=Math.abs((d._helper?d.offset.left-k.left:d.offset.left-k.left)+d.sizeDiff.width),n=Math.abs((d._helper?d.offset.top-k.top:d.offset.top-g.top)+d.sizeDiff.height),o=d.containerElement.get(0)==d.element.parent().get(0),p=/relative|absolute/.test(d.containerElement.css("position"));o&&p
+&&(m-=d.parentData.left),m+d.size.width>=d.parentData.width&&(d.size.width=d.parentData.width-m,j&&(d.size.height=d.size.width/d.aspectRatio)),n+d.size.height>=d.parentData.height&&(d.size.height=d.parentData.height-n,j&&(d.size.width=d.size.height*d.aspectRatio))},stop:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.position,g=d.containerOffset,h=d.containerPosition,i=d.containerElement,j=a(d.helper),k=j.offset(),l=j.outerWidth()-d.sizeDiff.width,m=j.outerHeight()-d.sizeDiff.height;d._helper&&!e.animate&&/relative/.test(i.css("position"))&&a(this).css({left:k.left-h.left-g.left,width:l,height:m}),d._helper&&!e.animate&&/static/.test(i.css("position"))&&a(this).css({left:k.left-h.left-g.left,width:l,height:m})}}),a.ui.plugin.add("resizable","ghost",{start:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.size;d.ghost=d.originalElement.clone(),d.ghost.css({opacity:.25,display:"block",position:"relative",height:f.height,width:f.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof e.ghost=="string"?e.ghost:""),d.ghost.appendTo(d.helper)},resize:function(b,c){var d=a(this).data("resizable"),e=d.options;d.ghost&&d.ghost.css({position:"relative",height:d.size.height,width:d.size.width})},stop:function(b,c){var d=a(this).data("resizable"),e=d.options;d.ghost&&d.helper&&d.helper.get(0).removeChild(d.ghost.get(0))}}),a.ui.plugin.add("resizable","grid",{resize:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.size,g=d.originalSize,h=d.originalPosition,i=d.axis,j=e._aspectRatio||b.shiftKey;e.grid=typeof e.grid=="number"?[e.grid,e.grid]:e.grid;var k=Math.round((f.width-g.width)/(e.grid[0]||1))*(e.grid[0]||1),l=Math.round((f.height-g.height)/(e.grid[1]||1))*(e.grid[1]||1);/^(se|s|e)$/.test(i)?(d.size.width=g.width+k,d.size.height=g.height+l):/^(ne)$/.test(i)?(d.size.width=g.width+k,d.size.height=g.height+l,d.position.top=h.top-l):/^(sw)$/.test(i)?(d.size.width=g.width+k,d.size.height=g.height+l,d.position.left=h.left-k):(d.size.width=g.width+k,d.size.height=g.height+l,d.position.top=h.top-l,d.position.left=h.left-k)}});var c=function(a){return parseInt(a,10)||0},d=function(a){return!isNaN(parseInt(a,10))}})(jQuery);
+/*
+ * jQuery hashchange event - v1.3 - 7/21/2010
+ * http://benalman.com/projects/jquery-hashchange-plugin/
+ *
+ * Copyright (c) 2010 "Cowboy" Ben Alman
+ * Dual licensed under the MIT and GPL licenses.
+ * http://benalman.com/about/license/
+ */
+(function($,e,b){var c="hashchange",h=document,f,g=$.event.special,i=h.documentMode,d="on"+c in e&&(i===b||i>7);function a(j){j=j||location.href;return"#"+j.replace(/^[^#]*#?(.*)$/,"$1")}$.fn[c]=function(j){return j?this.bind(c,j):this.trigger(c)};$.fn[c].delay=50;g[c]=$.extend(g[c],{setup:function(){if(d){return false}$(f.start)},teardown:function(){if(d){return false}$(f.stop)}});f=(function(){var j={},p,m=a(),k=function(q){return q},l=k,o=k;j.start=function(){p||n()};j.stop=function(){p&&clearTimeout(p);p=b};function n(){var r=a(),q=o(m);if(r!==m){l(m=r,q);$(e).trigger(c)}else{if(q!==m){location.href=location.href.replace(/#.*/,"")+q}}p=setTimeout(n,$.fn[c].delay)}$.browser.msie&&!d&&(function(){var q,r;j.start=function(){if(!q){r=$.fn[c].src;r=r&&r+a();q=$('<iframe tabindex="-1" title="empty"/>').hide().one("load",function(){r||l(a());n()}).attr("src",r||"javascript:0").insertAfter("body")[0].contentWindow;h.onpropertychange=function(){try{if(event.propertyName==="title"){q.document.title=h.title}}catch(s){}}}};j.stop=k;o=function(){return a(q.location.href)};l=function(v,s){var u=q.document,t=$.fn[c].domain;if(v!==s){u.title=h.title;u.open();t&&u.write('<script>document.domain="'+t+'"<\/script>');u.close();q.location.hash=v}}})();return j})()})(jQuery,this);
+/**
+ * jQuery.ScrollTo - Easy element scrolling using jQuery.
+ * Copyright (c) 2007-2009 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com
+ * Dual licensed under MIT and GPL.
+ * Date: 5/25/2009
+ * @author Ariel Flesler
+ * @version 1.4.2
+ *
+ * http://flesler.blogspot.com/2007/10/jqueryscrollto.html
+ */
+;(function(d){var k=d.scrollTo=function(a,i,e){d(window).scrollTo(a,i,e)};k.defaults={axis:'xy',duration:parseFloat(d.fn.jquery)>=1.3?0:1};k.window=function(a){return d(window)._scrollable()};d.fn._scrollable=function(){return this.map(function(){var a=this,i=!a.nodeName||d.inArray(a.nodeName.toLowerCase(),['iframe','#document','html','body'])!=-1;if(!i)return a;var e=(a.contentWindow||a).document||a.ownerDocument||a;return d.browser.safari||e.compatMode=='BackCompat'?e.body:e.documentElement})};d.fn.scrollTo=function(n,j,b){if(typeof j=='object'){b=j;j=0}if(typeof b=='function')b={onAfter:b};if(n=='max')n=9e9;b=d.extend({},k.defaults,b);j=j||b.speed||b.duration;b.queue=b.queue&&b.axis.length>1;if(b.queue)j/=2;b.offset=p(b.offset);b.over=p(b.over);return this._scrollable().each(function(){var q=this,r=d(q),f=n,s,g={},u=r.is('html,body');switch(typeof f){case'number':case'string':if(/^([+-]=)?\d+(\.\d+)?(px|%)?$/.test(f)){f=p(f);break}f=d(f,this);case'object':if(f.is||f.style)s=(f=d(f)).offset()}d.each(b.axis.split(''),function(a,i){var e=i=='x'?'Left':'Top',h=e.toLowerCase(),c='scroll'+e,l=q[c],m=k.max(q,i);if(s){g[c]=s[h]+(u?0:l-r.offset()[h]);if(b.margin){g[c]-=parseInt(f.css('margin'+e))||0;g[c]-=parseInt(f.css('border'+e+'Width'))||0}g[c]+=b.offset[h]||0;if(b.over[h])g[c]+=f[i=='x'?'width':'height']()*b.over[h]}else{var o=f[h];g[c]=o.slice&&o.slice(-1)=='%'?parseFloat(o)/100*m:o}if(/^\d+$/.test(g[c]))g[c]=g[c]<=0?0:Math.min(g[c],m);if(!a&&b.queue){if(l!=g[c])t(b.onAfterFirst);delete g[c]}});t(b.onAfter);function t(a){r.animate(g,j,b.easing,a&&function(){a.call(this,n,b)})}}).end()};k.max=function(a,i){var e=i=='x'?'Width':'Height',h='scroll'+e;if(!d(a).is('html,body'))return a[h]-d(a)[e.toLowerCase()]();var c='client'+e,l=a.ownerDocument.documentElement,m=a.ownerDocument.body;return Math.max(l[h],m[h])-Math.min(l[c],m[c])};function p(a){return typeof a=='object'?a:{top:a,left:a}}})(jQuery);
diff --git a/doc/html/language_8php.html b/doc/html/language_8php.html
new file mode 100644
index 000000000..d9339f2be
--- /dev/null
+++ b/doc/html/language_8php.html
@@ -0,0 +1,323 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/language.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('language_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">language.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ace67d6cad57da08d030ad9dc9b8c836e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="language_8php.html#ace67d6cad57da08d030ad9dc9b8c836e">get_browser_language</a> ()</td></tr>
+<tr class="separator:ace67d6cad57da08d030ad9dc9b8c836e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a980dee1d8715a98ab02e36b59facf8ed"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="language_8php.html#a980dee1d8715a98ab02e36b59facf8ed">get_best_language</a> ()</td></tr>
+<tr class="separator:a980dee1d8715a98ab02e36b59facf8ed"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac9142ef1d01a235c760deb0f16643f5a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="language_8php.html#ac9142ef1d01a235c760deb0f16643f5a">push_lang</a> ($language)</td></tr>
+<tr class="separator:ac9142ef1d01a235c760deb0f16643f5a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a78bd204955ec4cc3a9ac651285a1689d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="language_8php.html#a78bd204955ec4cc3a9ac651285a1689d">pop_lang</a> ()</td></tr>
+<tr class="separator:a78bd204955ec4cc3a9ac651285a1689d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7e9904c730bb24ddcb0ff50fc96f6b05"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="language_8php.html#a7e9904c730bb24ddcb0ff50fc96f6b05">load_translation_table</a> ($lang, $install=false)</td></tr>
+<tr class="separator:a7e9904c730bb24ddcb0ff50fc96f6b05"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aae0c3638fb476ae1e31f8d242f5dac04"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="language_8php.html#aae0c3638fb476ae1e31f8d242f5dac04">t</a> ($s)</td></tr>
+<tr class="separator:aae0c3638fb476ae1e31f8d242f5dac04"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae310fb3880484ee1cc4faefe0c63c06d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="language_8php.html#ae310fb3880484ee1cc4faefe0c63c06d">tt</a> ($singular, $plural, $count)</td></tr>
+<tr class="separator:ae310fb3880484ee1cc4faefe0c63c06d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a151e5b4689aef86a12642cbb7a00bfe0"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="language_8php.html#a151e5b4689aef86a12642cbb7a00bfe0">string_plural_select_default</a> ($<a class="el" href="php2po_8php.html#a1594a11499d06cc8a789ee7ca0c7a12b">n</a>)</td></tr>
+<tr class="separator:a151e5b4689aef86a12642cbb7a00bfe0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a632da17c7ac0d2dc1a00a4706870194b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="language_8php.html#a632da17c7ac0d2dc1a00a4706870194b">detect_language</a> ($s)</td></tr>
+<tr class="separator:a632da17c7ac0d2dc1a00a4706870194b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a632da17c7ac0d2dc1a00a4706870194b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">detect_language </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">item_store()</a>, and <a class="el" href="items_8php.html#acf0bf7c9d21ac84f32effb754f7ad484">item_store_update()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a980dee1d8715a98ab02e36b59facf8ed"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_best_language </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="account_8php.html#a141fe579c351c78209d425473f978eb5">create_account()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ace67d6cad57da08d030ad9dc9b8c836e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_browser_language </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>translation support</p>
+<p>Get the language setting directly from system variables, bypassing <a class="el" href="include_2config_8php.html#af02c96e6b37335774b548914ede1d22e">get_config()</a> as database may not yet be configured.</p>
+<p>If possible, we use the value from the browser. </p>
+
+<p>Referenced by <a class="el" href="security_8php.html#adc7bf51e3b8d67bd80e9348f9ab03733">authenticate_success()</a>, and <a class="el" href="language_8php.html#a980dee1d8715a98ab02e36b59facf8ed">get_best_language()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a7e9904c730bb24ddcb0ff50fc96f6b05"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">load_translation_table </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$lang</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$install</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="language_8php.html#ac9142ef1d01a235c760deb0f16643f5a">push_lang()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a78bd204955ec4cc3a9ac651285a1689d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">pop_lang </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc">notification()</a>, <a class="el" href="account_8php.html#a014de2d5d5c9785de5bf547a485822fa">send_reg_approval_email()</a>, and <a class="el" href="account_8php.html#ac5c570a2d46446bad4dd2501e9c5a4b1">user_allow()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ac9142ef1d01a235c760deb0f16643f5a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">push_lang </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$language</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc">notification()</a>, <a class="el" href="account_8php.html#a014de2d5d5c9785de5bf547a485822fa">send_reg_approval_email()</a>, and <a class="el" href="account_8php.html#ac5c570a2d46446bad4dd2501e9c5a4b1">user_allow()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a151e5b4689aef86a12642cbb7a00bfe0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">string_plural_select_default </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$n</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aae0c3638fb476ae1e31f8d242f5dac04"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">t </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="achievements_8php.html#a35ae04ada0e227d19671f289a32fb30e">achievements_content()</a>, <a class="el" href="admin_8php.html#afef415e4011607fbb665610441595015">admin_content()</a>, <a class="el" href="admin_8php.html#aaa6addf2dbc3f3fcf99244a56b41eade">admin_page_dbsync()</a>, <a class="el" href="admin_8php.html#a6943543f3138f6ee182cb701f415d1cc">admin_page_hubloc()</a>, <a class="el" href="admin_8php.html#a1d1362698af14d209aa3a0fb655551dd">admin_page_logs()</a>, <a class="el" href="admin_8php.html#a233b7c8c31776b7020532003c6e44e1c">admin_page_logs_post()</a>, <a class="el" href="admin_8php.html#a54128076986ba80c4a103de3fc3e19a8">admin_page_plugins()</a>, <a class="el" href="admin_8php.html#ac0f3bd12431c056aad77bac9d09fa30e">admin_page_site()</a>, <a class="el" href="admin_8php.html#add865f4ae806ecbf716f423fc3e50e4f">admin_page_site_post()</a>, <a class="el" href="admin_8php.html#ac6e95b920b5abd030cc522964987087a">admin_page_summary()</a>, <a class="el" href="admin_8php.html#af124619fdc278fe2bf14c45ddaa260fb">admin_page_themes()</a>, <a class="el" href="admin_8php.html#a62f10f90c47686c9c3c37c4c03a108d2">admin_page_users()</a>, <a class="el" href="admin_8php.html#acf51f5837a7427832144c2bf7308ada3">admin_post()</a>, <a class="el" href="identity_8php.html#aa870d2c1f558cfd52bef05bc124e8fa4">advanced_profile()</a>, <a class="el" href="text_8php.html#a75c243e06341ec16bd5a44b9b1cacd85">alt_pager()</a>, <a class="el" href="mod_2api_8php.html#a33315b5bbf5418f6850b2038107b526d">api_content()</a>, <a class="el" href="mod_2api_8php.html#a6fe77f05c07cb51048df0d557b4b9bd2">api_post()</a>, <a class="el" href="include_2api_8php.html#ad24ce1bf20867add4c9211a8eaf93f22">api_statuses_public_timeline()</a>, <a class="el" href="apps_8php.html#a546016cb960d0b110ee8e489dfa6c27c">apps_content()</a>, <a class="el" href="view_2theme_2apw_2php_2config_8php.html#a8b51951a70e1c1324be71345a61d70ec">apw_form()</a>, <a class="el" href="include_2attach_8php.html#a0d07c5b83d3d54e186f752e571847b36">attach_by_hash()</a>, <a class="el" href="include_2attach_8php.html#ad991208ce939387e2f93a3bce7d09932">attach_by_hash_nodata()</a>, <a class="el" href="include_2attach_8php.html#a887d2d44a3ef18dcb6624e7fb58dc8e3">attach_count_files()</a>, <a class="el" href="mod_2attach_8php.html#aa88eb5ad87aa1036a30e70339cc6c1b1">attach_init()</a>, <a class="el" href="include_2attach_8php.html#a3634af95f11a023dd8e882c3c7a3600d">attach_list_files()</a>, <a class="el" href="include_2attach_8php.html#ab6830b3ab74a5d284876141ac80f6cbc">attach_mkdir()</a>, <a class="el" href="include_2attach_8php.html#a84a8a64c4805e1525b42d4add464833f">attach_store()</a>, <a class="el" href="security_8php.html#adc7bf51e3b8d67bd80e9348f9ab03733">authenticate_success()</a>, <a class="el" href="bbcode_8php.html#a009f61aaf78771737ed0765c8463911b">bbcode()</a>, <a class="el" href="blocks_8php.html#a2531a8fd51db3cecb2eb20c002c66e12">blocks_content()</a>, <a class="el" href="view_2theme_2blogga_2php_2config_8php.html#a8a311a402d3e746ce53fadc38e4b2d27">blogtheme_form()</a>, <a class="el" href="contact__widgets_8php.html#a165eb021e61c4dcab2a552f28628d353">categories_widget()</a>, <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>, <a class="el" href="channel_8php.html#ac7c8c7845741baadf87fae6bc279f3dc">channel_init()</a>, <a class="el" href="chanview_8php.html#a4192c6da888c8c1165851acf9ad4cb8b">chanview_content()</a>, <a class="el" href="account_8php.html#ae052bd5558847bd38e89c213561a9771">check_account_email()</a>, <a class="el" href="account_8php.html#aaff7720423417a4333697894ffd9ddeb">check_account_invite()</a>, <a class="el" href="boot_8php.html#a4c02d88e66852a01bd5a1feecb7c3ce3">check_config()</a>, <a class="el" href="security_8php.html#a20f8b9851f23ee8894b8925584ef6821">check_form_security_std_err_msg()</a>, <a class="el" href="setup_8php.html#a69a450e06dd3771fb51d3e4b0266a35e">check_funcs()</a>, <a class="el" href="setup_8php.html#a0c3f3b671381f6dccd924b8ecdfc56c4">check_htaccess()</a>, <a class="el" href="setup_8php.html#a5ad92c0857d1dadd6b60a9a557159c9f">check_htconfig()</a>, <a class="el" href="setup_8php.html#aa3bbb111780da70ba35cc23a306f2c76">check_keys()</a>, <a class="el" href="setup_8php.html#a14d208682a88632290c895d20da6e7d6">check_php()</a>, <a class="el" href="setup_8php.html#afd8b0b3ade1507c45325caf377bf459d">check_smarty3()</a>, <a class="el" href="setup_8php.html#ab4b71369a25021d59247c917e98d8246">check_store()</a>, <a class="el" href="common_8php.html#ab63408f39abef7a6915186e8dabc5a96">common_content()</a>, <a class="el" href="contact__widgets_8php.html#a552f8544528cec0c995cea7287ea9d65">common_friends_visitor_widget()</a>, <a class="el" href="common_8php.html#aca62f113655809f41f49042ce9b123c2">common_init()</a>, <a class="el" href="community_8php.html#a1197aafd6a6b540dbb4a0c04ade3a25a">community_content()</a>, <a class="el" href="connect_8php.html#a489f0a66c660de6ec4d6917b27674f07">connect_content()</a>, <a class="el" href="connect_8php.html#ad46a38f32fd7a3d324b1fa26373efa36">connect_init()</a>, <a class="el" href="connect_8php.html#a417ec27afe33f21a929667a665e32ee2">connect_post()</a>, <a class="el" href="connections_8php.html#aec2e457420fce3e3bf6a9f48e36df25c">connections_content()</a>, <a class="el" href="connections_8php.html#a1224058db8e3fb56463eb312f98e561d">connections_post()</a>, <a class="el" href="connedit_8php.html#a795acb3d9d841f55c255d7611681ab67">connedit_content()</a>, <a class="el" href="connedit_8php.html#a234c48426b652bf4d37053f2af329ac5">connedit_post()</a>, <a class="el" href="boot_8php.html#acc4e0c910af066148b810e5fde55fff1">construct_page()</a>, <a class="el" href="text_8php.html#ad6432621d0fafcbcf3d3b9b49bef7784">contact_block()</a>, <a class="el" href="contact__selectors_8php.html#a9839e8fdaac7ffb37bf1420493f5c28f">contact_poll_interval()</a>, <a class="el" href="contact__selectors_8php.html#ae499960d6467bd30c78607b1018baf53">contact_reputation()</a>, <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation()</a>, <a class="el" href="account_8php.html#a141fe579c351c78209d425473f978eb5">create_account()</a>, <a class="el" href="identity_8php.html#a345f4c943d84de502ec6e72d2c813945">create_identity()</a>, <a class="el" href="datetime_8php.html#a5f29553799005b1fd4e9ce9d98ce05aa">datesel_format()</a>, <a class="el" href="text_8php.html#a63fb21c0bed2fc72eef2c1471ac42b63">day_translate()</a>, <a class="el" href="delegate_8php.html#a943eea8996ef348eb845c498f9f354dd">delegate_content()</a>, <a class="el" href="text_8php.html#a87a3cefc603302c78982f1d8e1245265">design_tools()</a>, <a class="el" href="dir__fns_8php.html#acf621621e929d49441da30aad76a58cf">dir_safe_mode()</a>, <a class="el" href="dir__fns_8php.html#ae56881d69bb6f8e828c9e35454386774">dir_sort_links()</a>, <a class="el" href="taxonomy_8php.html#a599ee71dd3194c8127b00dabec77abc1">dir_tagblock()</a>, <a class="el" href="mod_2directory_8php.html#aac79396570d759da2efac24fcedf5b44">directory_content()</a>, <a class="el" href="dirprofile_8php.html#a3e1d30d3d93863ff5615f2df4ac7f052">dirprofile_init()</a>, <a class="el" href="dirsearch_8php.html#aa1fb04e1de4f25b63349ac78f94ceb4c">dirsearch_content()</a>, <a class="el" href="display_8php.html#a37137c98d47bf3306f4c2bb9f5b60de0">display_content()</a>, <a class="el" href="items_8php.html#afa1db13c2a8b73b5b17b97f17e5a19d1">drop_item()</a>, <a class="el" href="editblock_8php.html#abbe8f55de06967bc8d79d620509a49e6">editblock_content()</a>, <a class="el" href="editlayout_8php.html#aa877e4157a26b099de904164181dd386">editlayout_content()</a>, <a class="el" href="editpost_8php.html#a34011690864d122680c802e9e748ccfb">editpost_content()</a>, <a class="el" href="editwebpage_8php.html#a375e945255fad79a71036528f7480650">editwebpage_content()</a>, <a class="el" href="events_8php.html#a1d293fb217ae6bc9e3858c4b32e363ec">events_content()</a>, <a class="el" href="events_8php.html#ab3e8a8f901175f8e40a8089eea45c075">events_post()</a>, <a class="el" href="fbrowser_8php.html#aee476addcf7a3e0fe9454f7dfd5a56c4">fbrowser_content()</a>, <a class="el" href="contact__widgets_8php.html#a1eda66319d170f60a8d07c7ece95533b">fileas_widget()</a>, <a class="el" href="filer_8php.html#a5fd5d7e61b2f9c43cb5f110c89dc4274">filer_content()</a>, <a class="el" href="filestorage_8php.html#a61bb1be78472555df4ce619f51014040">filestorage_content()</a>, <a class="el" href="filestorage_8php.html#ad3b64e3ece9831f9d3a9f00c0ae983cd">filestorage_post()</a>, <a class="el" href="contact__widgets_8php.html#a57e73ebcfd62bb5d8c7a7b9e663726d6">findpeople_widget()</a>, <a class="el" href="item_8php.html#a7b63a9d0cd02096e17dcf11f4afa7c10">fix_attached_photo_permissions()</a>, <a class="el" href="mod_2follow_8php.html#a171f5b19f50d7738adc3b2e96ec6018a">follow_init()</a>, <a class="el" href="text_8php.html#a3054189cff173977f4216c9a3dd29e1b">format_categories()</a>, <a class="el" href="bb2diaspora_8php.html#a29a2ad41f5826f3975fa9a49934ff863">format_event_diaspora()</a>, <a class="el" href="event_8php.html#a2ac9f1b08de03250ecd794f705781d17">format_event_html()</a>, <a class="el" href="text_8php.html#a4e4d42b0a805148d9f9a92bcac89bf91">format_filer()</a>, <a class="el" href="conversation_8php.html#a3d8e30cc94f9a175054c021305d3aca3">format_like()</a>, <a class="el" href="include_2notify_8php.html#a0e61728e487df50c72e6434f911a57d3">format_notification()</a>, <a class="el" href="fsuggest_8php.html#aa6c49ed4b50a387f1845f36844dd7998">fsuggest_content()</a>, <a class="el" href="fsuggest_8php.html#a61ecfe10ce937ed526614f8fd3de3c7d">fsuggest_post()</a>, <a class="el" href="profile__selectors_8php.html#ae2b2c087e6530c61c0b256fd26d52355">gender_selector()</a>, <a class="el" href="identity_8php.html#ad2c97627a313d53df1a1c7b4215ddb51">get_birthdays()</a>, <a class="el" href="classItem.html#a3ee7667c2ec6cd7657328e27848c0bdf">Item\get_comment_box()</a>, <a class="el" href="identity_8php.html#ae381db3d43f8e7c1da8b15d14ecf5312">get_events()</a>, <a class="el" href="features_8php.html#ae73c5b03b01c7284ed7e7e0e774e975c">get_features()</a>, <a class="el" href="text_8php.html#a736db13a966b8abaf8c9198faa35911a">get_mood_verbs()</a>, <a class="el" href="permissions_8php.html#a040fd3d3b8517658b1668ae0cd093972">get_perms()</a>, <a class="el" href="text_8php.html#aac0969ae09853205992ba06ab9f9f61a">get_plink()</a>, <a class="el" href="text_8php.html#aa46f941155c2ac1155f2f17ffb0adb66">get_poke_verbs()</a>, <a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">Item\get_template_data()</a>, <a class="el" href="include_2group_8php.html#a06ec565d2b64e79044e7c1bf91a2a4ce">group_add()</a>, <a class="el" href="mod_2group_8php.html#a07a64f6c65b0080d8190b3d9728a7a83">group_content()</a>, <a class="el" href="mod_2group_8php.html#aed1f009b1221348021bb34761160ef35">group_post()</a>, <a class="el" href="include_2group_8php.html#a6a69bd7be032fa8ce4e49c43a42cc6e9">group_side()</a>, <a class="el" href="help_8php.html#af055e15f600ffa6fbca9386fdf715224">help_content()</a>, <a class="el" href="home_8php.html#aa1cf697851a646755baf537f75334c46">home_content()</a>, <a class="el" href="classRedBrowser.html#a7f6bf0bda07833f4c647557bd172e349">RedBrowser\htmlActionsPanel()</a>, <a class="el" href="identity_8php.html#ac9fcd5c4c371998790b5c55c3d0f4633">identity_check_service_class()</a>, <a class="el" href="photo__driver_8php.html#a1d0bc7161dec0d177b7d3bbe4421af9a">import_channel_photo()</a>, <a class="el" href="import_8php.html#afdf25ed70096d5dbf4f6d0ca79fea184">import_content()</a>, <a class="el" href="import_8php.html#af17fef0410518f7eac205d0ea416eaa2">import_post()</a>, <a class="el" href="zot_8php.html#a56f3f65514e4e7f0cd117d01735aebd1">import_xchan()</a>, <a class="el" href="classdba__driver.html#a4ccb27243e62a8ca30dd8e1b8cc67746">dba_driver\install()</a>, <a class="el" href="invite_8php.html#a244385b28cfd021d308715f01158bfd9">invite_content()</a>, <a class="el" href="invite_8php.html#aeb0881c0f93c8e8552e5ed756ce6e5a5">invite_post()</a>, <a class="el" href="item_8php.html#a5b1b36cb301a94b38150074f0d424e74">item_check_service_class()</a>, <a class="el" href="conversation_8php.html#aacbb12d372d5e9c3ab0735b4aea48fb3">item_photo_menu()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="text_8php.html#ac1dbf2e37e8069bea2c0f557fdbf203e">item_post_type()</a>, <a class="el" href="items_8php.html#a756738301f2ed96be50232500677d58a">items_fetch()</a>, <a class="el" href="text_8php.html#a71f6952243d3fe1c5a8154f78027e29c">lang_selector()</a>, <a class="el" href="text_8php.html#a3999a0b3e22e440f280ee791ce34d384">layout_select()</a>, <a class="el" href="layouts_8php.html#a6e0193759ad9eef76d3df2db24237b50">layouts_content()</a>, <a class="el" href="like_8php.html#a9d7dd268f21c21e9d29dd2aca2dd9538">like_content()</a>, <a class="el" href="setup_8php.html#ad2e0375a9ab87ebe6e78124ee125054a">load_database()</a>, <a class="el" href="conversation_8php.html#a9bd7f9fb6678736c581bcba3b17f471c">localize_item()</a>, <a class="el" href="lockview_8php.html#a851e26ab9a1008df5c5ebebea31e9b44">lockview_content()</a>, <a class="el" href="boot_8php.html#aefecf8599036df7f1b95d6820e0e2fa4">login()</a>, <a class="el" href="lostpass_8php.html#a0314d94e48c789b1b3a201d740c9eab3">lostpass_content()</a>, <a class="el" href="lostpass_8php.html#a8ed35ba71a4404eaf4903da61d0321cc">lostpass_post()</a>, <a class="el" href="magic_8php.html#acea2cc792849ca2d71d4b689f66518bf">magic_init()</a>, <a class="el" href="mail_8php.html#a3c7c485fc69f92371e8b20936040eca1">mail_content()</a>, <a class="el" href="mail_8php.html#acfc2cc0bf4e0b178207758384977f25a">mail_post()</a>, <a class="el" href="manage_8php.html#a2bca247b5296827638959138367db4f5">manage_content()</a>, <a class="el" href="setup_8php.html#abe405d227ba7232971964a706d4f3bce">manual_config()</a>, <a class="el" href="profile__selectors_8php.html#a7473dd095987e1cdcc79d4f0bb5e6798">marital_selector()</a>, <a class="el" href="match_8php.html#a1dd853e959b9e70c1911bb2fb5f5130d">match_content()</a>, <a class="el" href="mod_2menu_8php.html#a6fed23af14d71a78a4153c8363a685cf">menu_content()</a>, <a class="el" href="mod_2menu_8php.html#aaa491ef173868fe002aece4632bcf393">menu_post()</a>, <a class="el" href="mod_2message_8php.html#ac72dfed3ce08fcb331d66b37edc6e15f">message_content()</a>, <a class="el" href="text_8php.html#a1633412120f52bdce5f43e0a127d9293">mimetype_select()</a>, <a class="el" href="include_2group_8php.html#ab0e422a0f31c0c64fd9084ca03d85f32">mini_group_select()</a>, <a class="el" href="mitem_8php.html#a7a31b702ecad18eeb6a38b243ff0037e">mitem_content()</a>, <a class="el" href="mitem_8php.html#a9627cd857cafdf04e4fc0ae48c8e8518">mitem_init()</a>, <a class="el" href="mitem_8php.html#a6ee694cca4b551a20d7c7a94b5243ec1">mitem_post()</a>, <a class="el" href="mood_8php.html#a721b9b6703b3234a005641c92d409b8f">mood_content()</a>, <a class="el" href="mood_8php.html#a7ae136dd7476865b4828136175db5022">mood_init()</a>, <a class="el" href="nav_8php.html#a43be0df73b90647ea70947ce004e231e">nav()</a>, <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>, <a class="el" href="mod_2network_8php.html#a180fce90ad11d7e0e45be094da7149ec">network_init()</a>, <a class="el" href="contact__selectors_8php.html#ad472e4716426dd1a9dd77b62962454be">network_to_name()</a>, <a class="el" href="new__channel_8php.html#ae585191610f79da129492482ce8e2fee">new_channel_content()</a>, <a class="el" href="new__channel_8php.html#a180b0646957db8290482f02454ad7f23">new_channel_post()</a>, <a class="el" href="include_2follow_8php.html#ae387d4ae097c23d69f3247e7f08140c7">new_contact()</a>, <a class="el" href="boot_8php.html#a9255af5ae9c887520091ea04763c1a88">notice()</a>, <a class="el" href="enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc">notification()</a>, <a class="el" href="notifications_8php.html#aadd0b5525bd8c283a5d8a37982bbfe62">notifications_content()</a>, <a class="el" href="notifications_8php.html#a5baffec7b2e625c9f9cefbc097550d33">notifications_post()</a>, <a class="el" href="mod_2notify_8php.html#acdf3851688ebd6d6a575eb84ef9febe3">notify_content()</a>, <a class="el" href="taxonomy_8php.html#a03f55ee46c5f496e42f3d29db8d09cce">obj_verbs()</a>, <a class="el" href="include_2oembed_8php.html#aba89ae64b355efcb4f706553d3edb6a2">oembed_bbcode2html()</a>, <a class="el" href="include_2oembed_8php.html#a9e57f3e36a0a0a47e6db79544b701d9a">oembed_iframe()</a>, <a class="el" href="oexchange_8php.html#a2d8b785cd7d041a4e6274f5af370cf26">oexchange_content()</a>, <a class="el" href="page_8php.html#a91a5f649f68406149108bded1dc90b22">page_content()</a>, <a class="el" href="text_8php.html#afe9f178d264d44a94dc1292aaf0fd585">paginate()</a>, <a class="el" href="comanche_8php.html#af7150df735e5ff9d467994cd6f769c6e">pdl_selector()</a>, <a class="el" href="include_2photos_8php.html#a6c40ef58aefef705a5adc84a40e97109">photo_upload()</a>, <a class="el" href="include_2photos_8php.html#af24c6aeed28ecc31ec39e7d9a1804979">photos_album_widget()</a>, <a class="el" href="mod_2photos_8php.html#aa87382611a66ec5effdb2d78f13f5812">photos_content()</a>, <a class="el" href="mod_2photos_8php.html#ab950295cd77626f5fe65331a87693014">photos_init()</a>, <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>, <a class="el" href="ping_8php.html#a77217b1b190b4c5d8770867b45f0c0a1">ping_init()</a>, <a class="el" href="poke_8php.html#ac9190563a8da9c07a16f9dcd71cf6993">poke_content()</a>, <a class="el" href="poke_8php.html#a9725aab97b3983e6a98bd81c4efe7d3b">poke_init()</a>, <a class="el" href="acl__selectors_8php.html#a7b5446e999636ceceea65c154d865a31">populate_acl()</a>, <a class="el" href="items_8php.html#a410f9c743877c125ca06312373346903">post_activity_item()</a>, <a class="el" href="post_8php.html#af4b48181ce773ef0cdfc972441445c34">post_init()</a>, <a class="el" href="items_8php.html#abe695dd89e1e10ed042c26b80114f0ed">posted_date_widget()</a>, <a class="el" href="activities_8php.html#a80134e807719b3c54aba971958d2e132">profile_activity()</a>, <a class="el" href="profile_8php.html#a3775cf6eef6587e5143133356a7b76c0">profile_content()</a>, <a class="el" href="profile_8php.html#ab5d0246be0552e2182a585c1206d22a5">profile_init()</a>, <a class="el" href="identity_8php.html#a4751b522ea913d0e7ed43e03d22e9e68">profile_load()</a>, <a class="el" href="profile__photo_8php.html#a4b80234074bd603221aa5364f330e479">profile_photo_post()</a>, <a class="el" href="identity_8php.html#a432259b2cf5b6f59be53e71db9f2c7dc">profile_sidebar()</a>, <a class="el" href="profiles_8php.html#a46975783b8b8d70402d51487eb1f0b00">profiles_content()</a>, <a class="el" href="profiles_8php.html#a36f71405ad536228f8bb84a551b23f7e">profiles_init()</a>, <a class="el" href="profiles_8php.html#ab0362c81b1d3b0b12a772b9fac446e04">profiles_post()</a>, <a class="el" href="profperm_8php.html#aef015787de2373d9fb3fe3f814fb5023">profperm_content()</a>, <a class="el" href="pubsites_8php.html#af614e279aab54065345bda6b03eafdf0">pubsites_content()</a>, <a class="el" href="view_2theme_2redbasic_2php_2config_8php.html#a8574a41fa9735ee391ba57ab24b93793">redbasic_form()</a>, <a class="el" href="register_8php.html#a0e91f57f111407ea8d3223a05022bb2a">register_content()</a>, <a class="el" href="register_8php.html#a51731dcc1917c58a790eb1c0f6132271">register_post()</a>, <a class="el" href="regmod_8php.html#a7953df4e32e63946565e90cdd5d50409">regmod_content()</a>, <a class="el" href="datetime_8php.html#a8ae8dc95ace7ac27fa5a1ecf42b78c82">relative_date()</a>, <a class="el" href="removeme_8php.html#a065a589caa2aa84c60f7073a28f0ad9c">removeme_content()</a>, <a class="el" href="rmagic_8php.html#a3e28db1e5cfa7e5c2617f90222c1caef">rmagic_content()</a>, <a class="el" href="rpost_8php.html#a8190354d789000806d9879aea276728f">rpost_content()</a>, <a class="el" href="include_2network_8php.html#ae8d9c41a11000fb8667039fc71b4f73f">scale_external_images()</a>, <a class="el" href="text_8php.html#a876e94892867019935b348b573299352">search()</a>, <a class="el" href="search_8php.html#ab2568591359edde5b483a6cd9a24b2cc">search_content()</a>, <a class="el" href="text_8php.html#aae91e4d2a2c6f7a9daccd2c186ae3447">searchbox()</a>, <a class="el" href="datetime_8php.html#a633dadba426fa2f60b25fabdb19ebc1f">select_timezone()</a>, <a class="el" href="include_2message_8php.html#a751ffd6635022b2190f56154ee745752">send_message()</a>, <a class="el" href="account_8php.html#a014de2d5d5c9785de5bf547a485822fa">send_reg_approval_email()</a>, <a class="el" href="account_8php.html#aa9c29c497c17d8f9344dce8631ad8761">send_verification_email()</a>, <a class="el" href="settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586">settings_post()</a>, <a class="el" href="setup_8php.html#a88247384a96e14516f474d7af6a465c1">setup_content()</a>, <a class="el" href="profile__selectors_8php.html#a3b50b3ea4ea4bdbebebfffc5d1b157c7">sexpref_selector()</a>, <a class="el" href="siteinfo_8php.html#a70c09bfb6dd1c86a125a35f62ed53656">siteinfo_content()</a>, <a class="el" href="sources_8php.html#ac442ccef080ab95772d8929fcafcb4b7">sources_content()</a>, <a class="el" href="sources_8php.html#ac73298ff162ce7b2de8dcaf3d3305b1e">sources_post()</a>, <a class="el" href="subthread_8php.html#a50368f3d825b77996030528e7fbfa3d3">subthread_content()</a>, <a class="el" href="suggest_8php.html#a58748a8235d4523f8333847f3e42dd91">suggest_content()</a>, <a class="el" href="taxonomy_8php.html#ac21d1dff16d569e7d110167aea4e63c2">tagblock()</a>, <a class="el" href="tagger_8php.html#a0e4a3eb177d1684553c547503d67161c">tagger_content()</a>, <a class="el" href="tagrm_8php.html#adfd4ea5b4d7fc6d9c9e042af5cd7d49a">tagrm_content()</a>, <a class="el" href="tagrm_8php.html#a1702f40aa53a2fa93deade1f609abe78">tagrm_post()</a>, <a class="el" href="text_8php.html#af9c9ac3f74c82dc60acfa404d0e9dc53">theme_attachments()</a>, <a class="el" href="thing_8php.html#a24a35f1e64029a67fdbea94a776ae04b">thing_content()</a>, <a class="el" href="thing_8php.html#a8be23b1d475ec3d9291999221c674c80">thing_init()</a>, <a class="el" href="datetime_8php.html#aa51b5a7ea4f931b23acbdfcea46e9865">timezone_cmp()</a>, <a class="el" href="update__channel_8php.html#aca52a9da500f0db2f0a8666af5bc06ba">update_channel_content()</a>, <a class="el" href="update__community_8php.html#abdcc5c4ecebbe0b5fcba2755c69cb3b1">update_community_content()</a>, <a class="el" href="update__display_8php.html#aa36ac524059e209d5d75a03c16206246">update_display_content()</a>, <a class="el" href="update__network_8php.html#a8abf5b9f65af6a27ee2f9d7207ed1b41">update_network_content()</a>, <a class="el" href="update__search_8php.html#ace4c3a23fa7d6922399e27c297a6ba52">update_search_content()</a>, <a class="el" href="plugin_8php.html#a754d7f53b3abc557b753c057dc4e021d">upgrade_bool_message()</a>, <a class="el" href="plugin_8php.html#a4fc13e528367f510fcb6d8bbfc559040">upgrade_link()</a>, <a class="el" href="plugin_8php.html#a901657dd078e070516cf97285e0bada7">upgrade_message()</a>, <a class="el" href="account_8php.html#ac5c570a2d46446bad4dd2501e9c5a4b1">user_allow()</a>, <a class="el" href="account_8php.html#ac1653efba62493b9d87513e1b6c04c83">user_deny()</a>, <a class="el" href="identity_8php.html#af2802bc13a00a17b867bba7978ba8f58">validate_channelname()</a>, <a class="el" href="Contact_8php.html#a6348a532c9d26cd1c9afbc9aa6aa8960">vcard_from_xchan()</a>, <a class="el" href="viewconnections_8php.html#ab6c4d983e97b3a8a879567ff76507776">viewconnections_content()</a>, <a class="el" href="viewsrc_8php.html#a6eff3d0c1d7d14b335c4edb785cd60a4">viewsrc_content()</a>, <a class="el" href="vote_8php.html#a6aa67489bf458ca5e3206e46dac68596">vote_content()</a>, <a class="el" href="wall__upload_8php.html#a7cbe204244cf9e0380ee932263a74d8f">wall_upload_post()</a>, <a class="el" href="webpages_8php.html#af3b7397d4abc153e3d2147740ee1a41d">webpages_content()</a>, <a class="el" href="setup_8php.html#aea1ebdda58ec938f4e7b31aa5c5f6b58">what_next()</a>, <a class="el" href="widgets_8php.html#add9b24d3304e529a7975e96122315554">widget_affinity()</a>, <a class="el" href="widgets_8php.html#a7b1e357b5a2027718470b77ec921fc65">widget_archive()</a>, <a class="el" href="widgets_8php.html#a5ab3b64496e02cab56429978ad55f1c0">widget_filer()</a>, <a class="el" href="widgets_8php.html#ad1bf7aa69e8d100d95faba17c7bc91cd">widget_follow()</a>, <a class="el" href="widgets_8php.html#afa2e55a78f95667a6da082efac7fec74">widget_mailmenu()</a>, <a class="el" href="widgets_8php.html#a45ea061dabe9a8372e4ca3b9e5714256">widget_notes()</a>, <a class="el" href="widgets_8php.html#a94203eb9bcd63cbdecbbcb15163598d8">widget_savedsearch()</a>, <a class="el" href="widgets_8php.html#aaa73bcf1702eaadd9dcd253502f55e01">widget_settings_menu()</a>, <a class="el" href="widgets_8php.html#a0d404276fedc59f5038cf5c085028326">widget_suggestions()</a>, <a class="el" href="widgets_8php.html#a6dbc227aac750774284ee39c45f0a200">widget_tagcloud()</a>, <a class="el" href="page__widgets_8php.html#a1a1e729da27f252cab6678288a17958f">writepages_widget()</a>, <a class="el" href="xchan_8php.html#a9853348bf1a35c644460221ba75edc2d">xchan_content()</a>, <a class="el" href="include_2attach_8php.html#aeb07968990e66a88c95483ca09a7f909">z_readdir()</a>, and <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ae310fb3880484ee1cc4faefe0c63c06d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">tt </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$singular</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$plural</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$count</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="admin_8php.html#a5a696706a3869800e65fb365214241b7">admin_page_users_post()</a>, <a class="el" href="contact__widgets_8php.html#a552f8544528cec0c995cea7287ea9d65">common_friends_visitor_widget()</a>, <a class="el" href="text_8php.html#ad6432621d0fafcbcf3d3b9b49bef7784">contact_block()</a>, <a class="el" href="contact__widgets_8php.html#a57e73ebcfd62bb5d8c7a7b9e663726d6">findpeople_widget()</a>, <a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">Item\get_template_data()</a>, and <a class="el" href="invite_8php.html#aeb0881c0f93c8e8552e5ed756ce6e5a5">invite_post()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/language_8php.js b/doc/html/language_8php.js
new file mode 100644
index 000000000..ed2266957
--- /dev/null
+++ b/doc/html/language_8php.js
@@ -0,0 +1,12 @@
+var language_8php =
+[
+ [ "detect_language", "language_8php.html#a632da17c7ac0d2dc1a00a4706870194b", null ],
+ [ "get_best_language", "language_8php.html#a980dee1d8715a98ab02e36b59facf8ed", null ],
+ [ "get_browser_language", "language_8php.html#ace67d6cad57da08d030ad9dc9b8c836e", null ],
+ [ "load_translation_table", "language_8php.html#a7e9904c730bb24ddcb0ff50fc96f6b05", null ],
+ [ "pop_lang", "language_8php.html#a78bd204955ec4cc3a9ac651285a1689d", null ],
+ [ "push_lang", "language_8php.html#ac9142ef1d01a235c760deb0f16643f5a", null ],
+ [ "string_plural_select_default", "language_8php.html#a151e5b4689aef86a12642cbb7a00bfe0", null ],
+ [ "t", "language_8php.html#aae0c3638fb476ae1e31f8d242f5dac04", null ],
+ [ "tt", "language_8php.html#ae310fb3880484ee1cc4faefe0c63c06d", null ]
+]; \ No newline at end of file
diff --git a/doc/html/lastpost_8php.html b/doc/html/lastpost_8php.html
new file mode 100644
index 000000000..36b01df45
--- /dev/null
+++ b/doc/html/lastpost_8php.html
@@ -0,0 +1,190 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/lastpost.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('lastpost_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">lastpost.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ab4c6ebd25736af678e64d55ce508ce8c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="lastpost_8php.html#ab4c6ebd25736af678e64d55ce508ce8c">lastpost_init</a> (&amp;$a)</td></tr>
+<tr class="separator:ab4c6ebd25736af678e64d55ce508ce8c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6108289ef2a767495c7c85a24f364983"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="lastpost_8php.html#a6108289ef2a767495c7c85a24f364983">lastpost_aside</a> (&amp;$a)</td></tr>
+<tr class="separator:a6108289ef2a767495c7c85a24f364983"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a82f14cce5d3cfe27f40bdbd2c679d493"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="lastpost_8php.html#a82f14cce5d3cfe27f40bdbd2c679d493">lastpost_content</a> (&amp;$a, $update=0, $load=false)</td></tr>
+<tr class="separator:a82f14cce5d3cfe27f40bdbd2c679d493"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a6108289ef2a767495c7c85a24f364983"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">lastpost_aside </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a82f14cce5d3cfe27f40bdbd2c679d493"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">lastpost_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$update</em> = <code>0</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$load</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Get permissions SQL - if $remote_contact is true, our remote user has been pre-verified and we already have fetched his/her groups</p>
+
+</div>
+</div>
+<a class="anchor" id="ab4c6ebd25736af678e64d55ce508ce8c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">lastpost_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/lastpost_8php.js b/doc/html/lastpost_8php.js
new file mode 100644
index 000000000..aed5ab589
--- /dev/null
+++ b/doc/html/lastpost_8php.js
@@ -0,0 +1,6 @@
+var lastpost_8php =
+[
+ [ "lastpost_aside", "lastpost_8php.html#a6108289ef2a767495c7c85a24f364983", null ],
+ [ "lastpost_content", "lastpost_8php.html#a82f14cce5d3cfe27f40bdbd2c679d493", null ],
+ [ "lastpost_init", "lastpost_8php.html#ab4c6ebd25736af678e64d55ce508ce8c", null ]
+]; \ No newline at end of file
diff --git a/doc/html/layouts_8php.html b/doc/html/layouts_8php.html
new file mode 100644
index 000000000..01db274f4
--- /dev/null
+++ b/doc/html/layouts_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/layouts.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('layouts_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">layouts.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a6e0193759ad9eef76d3df2db24237b50"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="layouts_8php.html#a6e0193759ad9eef76d3df2db24237b50">layouts_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a6e0193759ad9eef76d3df2db24237b50"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a6e0193759ad9eef76d3df2db24237b50"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">layouts_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/layouts_8php.js b/doc/html/layouts_8php.js
new file mode 100644
index 000000000..ee929d2fc
--- /dev/null
+++ b/doc/html/layouts_8php.js
@@ -0,0 +1,4 @@
+var layouts_8php =
+[
+ [ "layouts_content", "layouts_8php.html#a6e0193759ad9eef76d3df2db24237b50", null ]
+]; \ No newline at end of file
diff --git a/doc/html/like_8php.html b/doc/html/like_8php.html
new file mode 100644
index 000000000..7e6a1db83
--- /dev/null
+++ b/doc/html/like_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/like.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('like_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">like.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a9d7dd268f21c21e9d29dd2aca2dd9538"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="like_8php.html#a9d7dd268f21c21e9d29dd2aca2dd9538">like_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a9d7dd268f21c21e9d29dd2aca2dd9538"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a9d7dd268f21c21e9d29dd2aca2dd9538"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">like_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/like_8php.js b/doc/html/like_8php.js
new file mode 100644
index 000000000..9706955e1
--- /dev/null
+++ b/doc/html/like_8php.js
@@ -0,0 +1,4 @@
+var like_8php =
+[
+ [ "like_content", "like_8php.html#a9d7dd268f21c21e9d29dd2aca2dd9538", null ]
+]; \ No newline at end of file
diff --git a/doc/html/lockview_8php.html b/doc/html/lockview_8php.html
new file mode 100644
index 000000000..9db692f74
--- /dev/null
+++ b/doc/html/lockview_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/lockview.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('lockview_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">lockview.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a851e26ab9a1008df5c5ebebea31e9b44"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="lockview_8php.html#a851e26ab9a1008df5c5ebebea31e9b44">lockview_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a851e26ab9a1008df5c5ebebea31e9b44"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a851e26ab9a1008df5c5ebebea31e9b44"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">lockview_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/lockview_8php.js b/doc/html/lockview_8php.js
new file mode 100644
index 000000000..7a5d6a5a8
--- /dev/null
+++ b/doc/html/lockview_8php.js
@@ -0,0 +1,4 @@
+var lockview_8php =
+[
+ [ "lockview_content", "lockview_8php.html#a851e26ab9a1008df5c5ebebea31e9b44", null ]
+]; \ No newline at end of file
diff --git a/doc/html/login_8php.html b/doc/html/login_8php.html
new file mode 100644
index 000000000..361ce22f6
--- /dev/null
+++ b/doc/html/login_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/login.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('login_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">login.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a1d69ca88eb9005a7026e128b9a645904"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="login_8php.html#a1d69ca88eb9005a7026e128b9a645904">login_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a1d69ca88eb9005a7026e128b9a645904"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a1d69ca88eb9005a7026e128b9a645904"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">login_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/login_8php.js b/doc/html/login_8php.js
new file mode 100644
index 000000000..7acaf7886
--- /dev/null
+++ b/doc/html/login_8php.js
@@ -0,0 +1,4 @@
+var login_8php =
+[
+ [ "login_content", "login_8php.html#a1d69ca88eb9005a7026e128b9a645904", null ]
+]; \ No newline at end of file
diff --git a/doc/html/lostpass_8php.html b/doc/html/lostpass_8php.html
new file mode 100644
index 000000000..1df357a61
--- /dev/null
+++ b/doc/html/lostpass_8php.html
@@ -0,0 +1,155 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/lostpass.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('lostpass_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">lostpass.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a8ed35ba71a4404eaf4903da61d0321cc"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="lostpass_8php.html#a8ed35ba71a4404eaf4903da61d0321cc">lostpass_post</a> (&amp;$a)</td></tr>
+<tr class="separator:a8ed35ba71a4404eaf4903da61d0321cc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0314d94e48c789b1b3a201d740c9eab3"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="lostpass_8php.html#a0314d94e48c789b1b3a201d740c9eab3">lostpass_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a0314d94e48c789b1b3a201d740c9eab3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a0314d94e48c789b1b3a201d740c9eab3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">lostpass_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a8ed35ba71a4404eaf4903da61d0321cc"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">lostpass_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/lostpass_8php.js b/doc/html/lostpass_8php.js
new file mode 100644
index 000000000..a6f1eb8ff
--- /dev/null
+++ b/doc/html/lostpass_8php.js
@@ -0,0 +1,5 @@
+var lostpass_8php =
+[
+ [ "lostpass_content", "lostpass_8php.html#a0314d94e48c789b1b3a201d740c9eab3", null ],
+ [ "lostpass_post", "lostpass_8php.html#a8ed35ba71a4404eaf4903da61d0321cc", null ]
+]; \ No newline at end of file
diff --git a/doc/html/magic_8php.html b/doc/html/magic_8php.html
new file mode 100644
index 000000000..7fc8c7597
--- /dev/null
+++ b/doc/html/magic_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/magic.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('magic_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">magic.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:acea2cc792849ca2d71d4b689f66518bf"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="magic_8php.html#acea2cc792849ca2d71d4b689f66518bf">magic_init</a> (&amp;$a)</td></tr>
+<tr class="separator:acea2cc792849ca2d71d4b689f66518bf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="acea2cc792849ca2d71d4b689f66518bf"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">magic_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/magic_8php.js b/doc/html/magic_8php.js
new file mode 100644
index 000000000..331687144
--- /dev/null
+++ b/doc/html/magic_8php.js
@@ -0,0 +1,4 @@
+var magic_8php =
+[
+ [ "magic_init", "magic_8php.html#acea2cc792849ca2d71d4b689f66518bf", null ]
+]; \ No newline at end of file
diff --git a/doc/html/mail_8php.html b/doc/html/mail_8php.html
new file mode 100644
index 000000000..830975bf1
--- /dev/null
+++ b/doc/html/mail_8php.html
@@ -0,0 +1,155 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/mail.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('mail_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">mail.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:acfc2cc0bf4e0b178207758384977f25a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mail_8php.html#acfc2cc0bf4e0b178207758384977f25a">mail_post</a> (&amp;$a)</td></tr>
+<tr class="separator:acfc2cc0bf4e0b178207758384977f25a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3c7c485fc69f92371e8b20936040eca1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mail_8php.html#a3c7c485fc69f92371e8b20936040eca1">mail_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a3c7c485fc69f92371e8b20936040eca1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a3c7c485fc69f92371e8b20936040eca1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">mail_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="acfc2cc0bf4e0b178207758384977f25a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">mail_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/mail_8php.js b/doc/html/mail_8php.js
new file mode 100644
index 000000000..8c79edcb0
--- /dev/null
+++ b/doc/html/mail_8php.js
@@ -0,0 +1,5 @@
+var mail_8php =
+[
+ [ "mail_content", "mail_8php.html#a3c7c485fc69f92371e8b20936040eca1", null ],
+ [ "mail_post", "mail_8php.html#acfc2cc0bf4e0b178207758384977f25a", null ]
+]; \ No newline at end of file
diff --git a/doc/html/manage_8php.html b/doc/html/manage_8php.html
new file mode 100644
index 000000000..b7bb732e7
--- /dev/null
+++ b/doc/html/manage_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/manage.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('manage_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">manage.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a2bca247b5296827638959138367db4f5"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="manage_8php.html#a2bca247b5296827638959138367db4f5">manage_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a2bca247b5296827638959138367db4f5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a2bca247b5296827638959138367db4f5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">manage_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/manage_8php.js b/doc/html/manage_8php.js
new file mode 100644
index 000000000..222f22c2a
--- /dev/null
+++ b/doc/html/manage_8php.js
@@ -0,0 +1,4 @@
+var manage_8php =
+[
+ [ "manage_content", "manage_8php.html#a2bca247b5296827638959138367db4f5", null ]
+]; \ No newline at end of file
diff --git a/doc/html/match_8php.html b/doc/html/match_8php.html
new file mode 100644
index 000000000..6e5794287
--- /dev/null
+++ b/doc/html/match_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/match.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('match_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">match.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a1dd853e959b9e70c1911bb2fb5f5130d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="match_8php.html#a1dd853e959b9e70c1911bb2fb5f5130d">match_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a1dd853e959b9e70c1911bb2fb5f5130d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a1dd853e959b9e70c1911bb2fb5f5130d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">match_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/match_8php.js b/doc/html/match_8php.js
new file mode 100644
index 000000000..2634e9eaa
--- /dev/null
+++ b/doc/html/match_8php.js
@@ -0,0 +1,4 @@
+var match_8php =
+[
+ [ "match_content", "match_8php.html#a1dd853e959b9e70c1911bb2fb5f5130d", null ]
+]; \ No newline at end of file
diff --git a/doc/html/md_README.html b/doc/html/md_README.html
new file mode 100644
index 000000000..0b2875d59
--- /dev/null
+++ b/doc/html/md_README.html
@@ -0,0 +1,110 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: apw</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('md_README.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">apw </div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><p>A Polymorphic Wapentake theme for the Red Matrix.</p>
+<div class="image">
+<img src="https://github.com/beardy-unixer/apw/raw/master/img/screenshot.jpg?raw=true" alt="Image"/>
+</div>
+ </div></div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/md_config.html b/doc/html/md_config.html
new file mode 100644
index 000000000..db80ea68c
--- /dev/null
+++ b/doc/html/md_config.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: CLI config utility</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('md_config.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">CLI config utility </div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><p>Usage:</p>
+<p>config displays all config entries</p>
+<p>config family displays all config entries for family (system, database, etc)</p>
+<p>config family key displays single config entry for specified family and key</p>
+<p>config family key value set config entry for specified family and key to value and display result</p>
+<p>Notes: Setting config entries which are manually set in .htconfig.php may result in conflict between database settings and the manual startup settings. </p>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/md_fresh.html b/doc/html/md_fresh.html
new file mode 100644
index 000000000..636f58b97
--- /dev/null
+++ b/doc/html/md_fresh.html
@@ -0,0 +1,124 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Fresh - The Freaking REd Shell</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('md_fresh.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">Fresh - The Freaking REd Shell </div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><p>This will only work on Unix/Linux. If the readline module is installed, we will use that for input, otherwise we will just read from stdin and write to stdout.</p>
+<p>Commands are processed sequentially until the command "exit", "quit", or end of file is reached.</p>
+<p>Commands:</p>
+<ul>
+<li>version Report current fresh version</li>
+</ul>
+<ul>
+<li>login email_address Prompts for a password, and authenticates email_address as the current user.</li>
+</ul>
+<ul>
+<li>finger channel_address performs a lookup of channel_address and reports the result.</li>
+</ul>
+<ul>
+<li>channel channel_nickname switches the current channel to the channel with nickname specified.</li>
+</ul>
+<ul>
+<li>conn [id1 id2 ...] With no arguments lists all connections of the current channel, with an id. If IDs are provided the connections details of each will be displayed. </li>
+</ul>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/minimal_8php.html b/doc/html/minimal_8php.html
new file mode 100644
index 000000000..6b37d2cc0
--- /dev/null
+++ b/doc/html/minimal_8php.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/php/minimal.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('minimal_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">minimal.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/minimalisticdarkness_8php.html b/doc/html/minimalisticdarkness_8php.html
new file mode 100644
index 000000000..392bf74a8
--- /dev/null
+++ b/doc/html/minimalisticdarkness_8php.html
@@ -0,0 +1,215 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/apw/schema/minimalisticdarkness.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('minimalisticdarkness_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle">
+<div class="title">minimalisticdarkness.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:a5795120b4b324bc4ca83f1e6fdce7d57"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="minimalisticdarkness_8php.html#a5795120b4b324bc4ca83f1e6fdce7d57">$width</a> = '90%'</td></tr>
+<tr class="separator:a5795120b4b324bc4ca83f1e6fdce7d57"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a70bb13be8f23ec47839da81e0796f1cb"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="minimalisticdarkness_8php.html#a70bb13be8f23ec47839da81e0796f1cb">$minwidth</a> = '90%'</td></tr>
+<tr class="separator:a70bb13be8f23ec47839da81e0796f1cb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7e6c3d4efde4e9a2de32308081372c6b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="minimalisticdarkness_8php.html#a7e6c3d4efde4e9a2de32308081372c6b">$itemfloat</a> = 'none'</td></tr>
+<tr class="separator:a7e6c3d4efde4e9a2de32308081372c6b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6e5d97615c6faef5dbffe04b8024ceaf"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="minimalisticdarkness_8php.html#a6e5d97615c6faef5dbffe04b8024ceaf">$aside</a> = 'off'</td></tr>
+<tr class="separator:a6e5d97615c6faef5dbffe04b8024ceaf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a04de7b747e4f0a353e0e38cf77c3404f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="minimalisticdarkness_8php.html#a04de7b747e4f0a353e0e38cf77c3404f">$sectionwidth</a> = '80%'</td></tr>
+<tr class="separator:a04de7b747e4f0a353e0e38cf77c3404f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0ac3f5b52212b0af87d513273da03ead"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="minimalisticdarkness_8php.html#a0ac3f5b52212b0af87d513273da03ead">$sectionleft</a> = '10px'</td></tr>
+<tr class="separator:a0ac3f5b52212b0af87d513273da03ead"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Variable Documentation</h2>
+<a class="anchor" id="a6e5d97615c6faef5dbffe04b8024ceaf"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$aside = 'off'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="admin_8php.html#afef415e4011607fbb665610441595015">admin_content()</a>, <a class="el" href="view_2theme_2apw_2php_2config_8php.html#a8b51951a70e1c1324be71345a61d70ec">apw_form()</a>, and <a class="el" href="view_2theme_2apw_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d">theme_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a7e6c3d4efde4e9a2de32308081372c6b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$itemfloat = 'none'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="view_2theme_2apw_2php_2config_8php.html#a8b51951a70e1c1324be71345a61d70ec">apw_form()</a>, and <a class="el" href="view_2theme_2apw_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d">theme_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a70bb13be8f23ec47839da81e0796f1cb"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$minwidth = '90%'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="view_2theme_2apw_2php_2config_8php.html#a8b51951a70e1c1324be71345a61d70ec">apw_form()</a>, and <a class="el" href="view_2theme_2apw_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d">theme_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a0ac3f5b52212b0af87d513273da03ead"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$sectionleft = '10px'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="view_2theme_2apw_2php_2config_8php.html#a8b51951a70e1c1324be71345a61d70ec">apw_form()</a>, and <a class="el" href="view_2theme_2apw_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d">theme_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a04de7b747e4f0a353e0e38cf77c3404f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$sectionwidth = '80%'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="view_2theme_2apw_2php_2config_8php.html#a8b51951a70e1c1324be71345a61d70ec">apw_form()</a>, and <a class="el" href="view_2theme_2apw_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d">theme_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a5795120b4b324bc4ca83f1e6fdce7d57"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$width = '90%'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="view_2theme_2apw_2php_2config_8php.html#a8b51951a70e1c1324be71345a61d70ec">apw_form()</a>, <a class="el" href="items_8php.html#aba98fcbbcd7044a7e9ea34edabc14c87">fix_private_photos()</a>, <a class="el" href="photo__driver_8php.html#a78f5a10c568d2a9bbbb129dc96548887">import_profile_photo()</a>, <a class="el" href="include_2oembed_8php.html#a9e57f3e36a0a0a47e6db79544b701d9a">oembed_iframe()</a>, <a class="el" href="include_2photos_8php.html#a6c40ef58aefef705a5adc84a40e97109">photo_upload()</a>, <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>, and <a class="el" href="view_2theme_2apw_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d">theme_content()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/minimalisticdarkness_8php.js b/doc/html/minimalisticdarkness_8php.js
new file mode 100644
index 000000000..ec5ce866d
--- /dev/null
+++ b/doc/html/minimalisticdarkness_8php.js
@@ -0,0 +1,9 @@
+var minimalisticdarkness_8php =
+[
+ [ "$aside", "minimalisticdarkness_8php.html#a6e5d97615c6faef5dbffe04b8024ceaf", null ],
+ [ "$itemfloat", "minimalisticdarkness_8php.html#a7e6c3d4efde4e9a2de32308081372c6b", null ],
+ [ "$minwidth", "minimalisticdarkness_8php.html#a70bb13be8f23ec47839da81e0796f1cb", null ],
+ [ "$sectionleft", "minimalisticdarkness_8php.html#a0ac3f5b52212b0af87d513273da03ead", null ],
+ [ "$sectionwidth", "minimalisticdarkness_8php.html#a04de7b747e4f0a353e0e38cf77c3404f", null ],
+ [ "$width", "minimalisticdarkness_8php.html#a5795120b4b324bc4ca83f1e6fdce7d57", null ]
+]; \ No newline at end of file
diff --git a/doc/html/mitem_8php.html b/doc/html/mitem_8php.html
new file mode 100644
index 000000000..83570dc4b
--- /dev/null
+++ b/doc/html/mitem_8php.html
@@ -0,0 +1,173 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/mitem.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('mitem_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">mitem.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a9627cd857cafdf04e4fc0ae48c8e8518"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mitem_8php.html#a9627cd857cafdf04e4fc0ae48c8e8518">mitem_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a9627cd857cafdf04e4fc0ae48c8e8518"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6ee694cca4b551a20d7c7a94b5243ec1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mitem_8php.html#a6ee694cca4b551a20d7c7a94b5243ec1">mitem_post</a> (&amp;$a)</td></tr>
+<tr class="separator:a6ee694cca4b551a20d7c7a94b5243ec1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7a31b702ecad18eeb6a38b243ff0037e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mitem_8php.html#a7a31b702ecad18eeb6a38b243ff0037e">mitem_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a7a31b702ecad18eeb6a38b243ff0037e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a7a31b702ecad18eeb6a38b243ff0037e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">mitem_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a9627cd857cafdf04e4fc0ae48c8e8518"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">mitem_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a6ee694cca4b551a20d7c7a94b5243ec1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">mitem_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/mitem_8php.js b/doc/html/mitem_8php.js
new file mode 100644
index 000000000..35bca9217
--- /dev/null
+++ b/doc/html/mitem_8php.js
@@ -0,0 +1,6 @@
+var mitem_8php =
+[
+ [ "mitem_content", "mitem_8php.html#a7a31b702ecad18eeb6a38b243ff0037e", null ],
+ [ "mitem_init", "mitem_8php.html#a9627cd857cafdf04e4fc0ae48c8e8518", null ],
+ [ "mitem_post", "mitem_8php.html#a6ee694cca4b551a20d7c7a94b5243ec1", null ]
+]; \ No newline at end of file
diff --git a/doc/html/mod_2api_8php.html b/doc/html/mod_2api_8php.html
new file mode 100644
index 000000000..d9d6febdd
--- /dev/null
+++ b/doc/html/mod_2api_8php.html
@@ -0,0 +1,175 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/api.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('mod_2api_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">api.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a02ae0f60e240dc806b860edb7d582117"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2api_8php.html#a02ae0f60e240dc806b860edb7d582117">oauth_get_client</a> ($request)</td></tr>
+<tr class="separator:a02ae0f60e240dc806b860edb7d582117"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6fe77f05c07cb51048df0d557b4b9bd2"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2api_8php.html#a6fe77f05c07cb51048df0d557b4b9bd2">api_post</a> (&amp;$a)</td></tr>
+<tr class="separator:a6fe77f05c07cb51048df0d557b4b9bd2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a33315b5bbf5418f6850b2038107b526d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2api_8php.html#a33315b5bbf5418f6850b2038107b526d">api_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a33315b5bbf5418f6850b2038107b526d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a33315b5bbf5418f6850b2038107b526d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a6fe77f05c07cb51048df0d557b4b9bd2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a02ae0f60e240dc806b860edb7d582117"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">oauth_get_client </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$request</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="mod_2api_8php.html#a33315b5bbf5418f6850b2038107b526d">api_content()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/mod_2api_8php.js b/doc/html/mod_2api_8php.js
new file mode 100644
index 000000000..61f9c7f58
--- /dev/null
+++ b/doc/html/mod_2api_8php.js
@@ -0,0 +1,6 @@
+var mod_2api_8php =
+[
+ [ "api_content", "mod_2api_8php.html#a33315b5bbf5418f6850b2038107b526d", null ],
+ [ "api_post", "mod_2api_8php.html#a6fe77f05c07cb51048df0d557b4b9bd2", null ],
+ [ "oauth_get_client", "mod_2api_8php.html#a02ae0f60e240dc806b860edb7d582117", null ]
+]; \ No newline at end of file
diff --git a/doc/html/mod_2attach_8php.html b/doc/html/mod_2attach_8php.html
new file mode 100644
index 000000000..575cd97e1
--- /dev/null
+++ b/doc/html/mod_2attach_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/attach.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('mod_2attach_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">attach.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:aa88eb5ad87aa1036a30e70339cc6c1b1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2attach_8php.html#aa88eb5ad87aa1036a30e70339cc6c1b1">attach_init</a> (&amp;$a)</td></tr>
+<tr class="separator:aa88eb5ad87aa1036a30e70339cc6c1b1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="aa88eb5ad87aa1036a30e70339cc6c1b1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">attach_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/mod_2attach_8php.js b/doc/html/mod_2attach_8php.js
new file mode 100644
index 000000000..19c8c722e
--- /dev/null
+++ b/doc/html/mod_2attach_8php.js
@@ -0,0 +1,4 @@
+var mod_2attach_8php =
+[
+ [ "attach_init", "mod_2attach_8php.html#aa88eb5ad87aa1036a30e70339cc6c1b1", null ]
+]; \ No newline at end of file
diff --git a/doc/html/mod_2chanman_8php.html b/doc/html/mod_2chanman_8php.html
new file mode 100644
index 000000000..1e9aa9a48
--- /dev/null
+++ b/doc/html/mod_2chanman_8php.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/chanman.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('mod_2chanman_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">chanman.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/mod_2directory_8php.html b/doc/html/mod_2directory_8php.html
new file mode 100644
index 000000000..cca2ed279
--- /dev/null
+++ b/doc/html/mod_2directory_8php.html
@@ -0,0 +1,155 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/directory.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('mod_2directory_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">directory.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a5ee59c213508b6b9787612a8219cb5bf"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2directory_8php.html#a5ee59c213508b6b9787612a8219cb5bf">directory_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a5ee59c213508b6b9787612a8219cb5bf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aac79396570d759da2efac24fcedf5b44"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2directory_8php.html#aac79396570d759da2efac24fcedf5b44">directory_content</a> (&amp;$a)</td></tr>
+<tr class="separator:aac79396570d759da2efac24fcedf5b44"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="aac79396570d759da2efac24fcedf5b44"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">directory_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a5ee59c213508b6b9787612a8219cb5bf"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">directory_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/mod_2directory_8php.js b/doc/html/mod_2directory_8php.js
new file mode 100644
index 000000000..783c03a81
--- /dev/null
+++ b/doc/html/mod_2directory_8php.js
@@ -0,0 +1,5 @@
+var mod_2directory_8php =
+[
+ [ "directory_content", "mod_2directory_8php.html#aac79396570d759da2efac24fcedf5b44", null ],
+ [ "directory_init", "mod_2directory_8php.html#a5ee59c213508b6b9787612a8219cb5bf", null ]
+]; \ No newline at end of file
diff --git a/doc/html/mod_2follow_8php.html b/doc/html/mod_2follow_8php.html
new file mode 100644
index 000000000..8ec4d4051
--- /dev/null
+++ b/doc/html/mod_2follow_8php.html
@@ -0,0 +1,155 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/follow.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('mod_2follow_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">follow.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a171f5b19f50d7738adc3b2e96ec6018a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2follow_8php.html#a171f5b19f50d7738adc3b2e96ec6018a">follow_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a171f5b19f50d7738adc3b2e96ec6018a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4c540ea4e9f5c581c1a53516ac585592"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2follow_8php.html#a4c540ea4e9f5c581c1a53516ac585592">follow_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a4c540ea4e9f5c581c1a53516ac585592"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a4c540ea4e9f5c581c1a53516ac585592"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">follow_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a171f5b19f50d7738adc3b2e96ec6018a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">follow_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/mod_2follow_8php.js b/doc/html/mod_2follow_8php.js
new file mode 100644
index 000000000..8ca687406
--- /dev/null
+++ b/doc/html/mod_2follow_8php.js
@@ -0,0 +1,5 @@
+var mod_2follow_8php =
+[
+ [ "follow_content", "mod_2follow_8php.html#a4c540ea4e9f5c581c1a53516ac585592", null ],
+ [ "follow_init", "mod_2follow_8php.html#a171f5b19f50d7738adc3b2e96ec6018a", null ]
+]; \ No newline at end of file
diff --git a/doc/html/mod_2group_8php.html b/doc/html/mod_2group_8php.html
new file mode 100644
index 000000000..e2e9f1fe1
--- /dev/null
+++ b/doc/html/mod_2group_8php.html
@@ -0,0 +1,155 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/group.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('mod_2group_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">group.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:aed1f009b1221348021bb34761160ef35"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2group_8php.html#aed1f009b1221348021bb34761160ef35">group_post</a> (&amp;$a)</td></tr>
+<tr class="separator:aed1f009b1221348021bb34761160ef35"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a07a64f6c65b0080d8190b3d9728a7a83"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2group_8php.html#a07a64f6c65b0080d8190b3d9728a7a83">group_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a07a64f6c65b0080d8190b3d9728a7a83"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a07a64f6c65b0080d8190b3d9728a7a83"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">group_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aed1f009b1221348021bb34761160ef35"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">group_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/mod_2group_8php.js b/doc/html/mod_2group_8php.js
new file mode 100644
index 000000000..4484dd52d
--- /dev/null
+++ b/doc/html/mod_2group_8php.js
@@ -0,0 +1,5 @@
+var mod_2group_8php =
+[
+ [ "group_content", "mod_2group_8php.html#a07a64f6c65b0080d8190b3d9728a7a83", null ],
+ [ "group_post", "mod_2group_8php.html#aed1f009b1221348021bb34761160ef35", null ]
+]; \ No newline at end of file
diff --git a/doc/html/mod_2menu_8php.html b/doc/html/mod_2menu_8php.html
new file mode 100644
index 000000000..4e6574c40
--- /dev/null
+++ b/doc/html/mod_2menu_8php.html
@@ -0,0 +1,155 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/menu.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('mod_2menu_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">menu.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:aaa491ef173868fe002aece4632bcf393"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2menu_8php.html#aaa491ef173868fe002aece4632bcf393">menu_post</a> (&amp;$a)</td></tr>
+<tr class="separator:aaa491ef173868fe002aece4632bcf393"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6fed23af14d71a78a4153c8363a685cf"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2menu_8php.html#a6fed23af14d71a78a4153c8363a685cf">menu_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a6fed23af14d71a78a4153c8363a685cf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a6fed23af14d71a78a4153c8363a685cf"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">menu_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aaa491ef173868fe002aece4632bcf393"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">menu_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/mod_2menu_8php.js b/doc/html/mod_2menu_8php.js
new file mode 100644
index 000000000..a1f6e1d9f
--- /dev/null
+++ b/doc/html/mod_2menu_8php.js
@@ -0,0 +1,5 @@
+var mod_2menu_8php =
+[
+ [ "menu_content", "mod_2menu_8php.html#a6fed23af14d71a78a4153c8363a685cf", null ],
+ [ "menu_post", "mod_2menu_8php.html#aaa491ef173868fe002aece4632bcf393", null ]
+]; \ No newline at end of file
diff --git a/doc/html/mod_2message_8php.html b/doc/html/mod_2message_8php.html
new file mode 100644
index 000000000..459ddb125
--- /dev/null
+++ b/doc/html/mod_2message_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/message.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('mod_2message_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">message.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ac72dfed3ce08fcb331d66b37edc6e15f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2message_8php.html#ac72dfed3ce08fcb331d66b37edc6e15f">message_content</a> (&amp;$a)</td></tr>
+<tr class="separator:ac72dfed3ce08fcb331d66b37edc6e15f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="ac72dfed3ce08fcb331d66b37edc6e15f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">message_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/mod_2message_8php.js b/doc/html/mod_2message_8php.js
new file mode 100644
index 000000000..4be200bf0
--- /dev/null
+++ b/doc/html/mod_2message_8php.js
@@ -0,0 +1,4 @@
+var mod_2message_8php =
+[
+ [ "message_content", "mod_2message_8php.html#ac72dfed3ce08fcb331d66b37edc6e15f", null ]
+]; \ No newline at end of file
diff --git a/doc/html/mod_2network_8php.html b/doc/html/mod_2network_8php.html
new file mode 100644
index 000000000..16de4ad96
--- /dev/null
+++ b/doc/html/mod_2network_8php.html
@@ -0,0 +1,173 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/network.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('mod_2network_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">network.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a180fce90ad11d7e0e45be094da7149ec"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2network_8php.html#a180fce90ad11d7e0e45be094da7149ec">network_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a180fce90ad11d7e0e45be094da7149ec"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a43f2f29b90c5e29072c561934bc8f8b4"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content</a> (&amp;$a, $update=0, $load=false)</td></tr>
+<tr class="separator:a43f2f29b90c5e29072c561934bc8f8b4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a43f2f29b90c5e29072c561934bc8f8b4"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">network_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$update</em> = <code>0</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$load</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="update__network_8php.html#a8abf5b9f65af6a27ee2f9d7207ed1b41">update_network_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a180fce90ad11d7e0e45be094da7149ec"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">network_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/mod_2network_8php.js b/doc/html/mod_2network_8php.js
new file mode 100644
index 000000000..651e6f6bd
--- /dev/null
+++ b/doc/html/mod_2network_8php.js
@@ -0,0 +1,5 @@
+var mod_2network_8php =
+[
+ [ "network_content", "mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4", null ],
+ [ "network_init", "mod_2network_8php.html#a180fce90ad11d7e0e45be094da7149ec", null ]
+]; \ No newline at end of file
diff --git a/doc/html/mod_2notify_8php.html b/doc/html/mod_2notify_8php.html
new file mode 100644
index 000000000..dae4949c1
--- /dev/null
+++ b/doc/html/mod_2notify_8php.html
@@ -0,0 +1,155 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/notify.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('mod_2notify_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">notify.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a94f9a6a9d4b5fd704baafff0c34f41ae"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2notify_8php.html#a94f9a6a9d4b5fd704baafff0c34f41ae">notify_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a94f9a6a9d4b5fd704baafff0c34f41ae"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acdf3851688ebd6d6a575eb84ef9febe3"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2notify_8php.html#acdf3851688ebd6d6a575eb84ef9febe3">notify_content</a> (&amp;$a)</td></tr>
+<tr class="separator:acdf3851688ebd6d6a575eb84ef9febe3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="acdf3851688ebd6d6a575eb84ef9febe3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">notify_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a94f9a6a9d4b5fd704baafff0c34f41ae"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">notify_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/mod_2notify_8php.js b/doc/html/mod_2notify_8php.js
new file mode 100644
index 000000000..cb5e5e71e
--- /dev/null
+++ b/doc/html/mod_2notify_8php.js
@@ -0,0 +1,5 @@
+var mod_2notify_8php =
+[
+ [ "notify_content", "mod_2notify_8php.html#acdf3851688ebd6d6a575eb84ef9febe3", null ],
+ [ "notify_init", "mod_2notify_8php.html#a94f9a6a9d4b5fd704baafff0c34f41ae", null ]
+]; \ No newline at end of file
diff --git a/doc/html/mod_2oembed_8php.html b/doc/html/mod_2oembed_8php.html
new file mode 100644
index 000000000..539616a76
--- /dev/null
+++ b/doc/html/mod_2oembed_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/oembed.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('mod_2oembed_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">oembed.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a9145025aaf057fb5d3f9f7011e5e1014"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2oembed_8php.html#a9145025aaf057fb5d3f9f7011e5e1014">oembed_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a9145025aaf057fb5d3f9f7011e5e1014"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a9145025aaf057fb5d3f9f7011e5e1014"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">oembed_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/mod_2oembed_8php.js b/doc/html/mod_2oembed_8php.js
new file mode 100644
index 000000000..fa9f10f16
--- /dev/null
+++ b/doc/html/mod_2oembed_8php.js
@@ -0,0 +1,4 @@
+var mod_2oembed_8php =
+[
+ [ "oembed_init", "mod_2oembed_8php.html#a9145025aaf057fb5d3f9f7011e5e1014", null ]
+]; \ No newline at end of file
diff --git a/doc/html/mod_2photos_8php.html b/doc/html/mod_2photos_8php.html
new file mode 100644
index 000000000..f81b628f5
--- /dev/null
+++ b/doc/html/mod_2photos_8php.html
@@ -0,0 +1,176 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/photos.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('mod_2photos_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">photos.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ab950295cd77626f5fe65331a87693014"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2photos_8php.html#ab950295cd77626f5fe65331a87693014">photos_init</a> (&amp;$a)</td></tr>
+<tr class="separator:ab950295cd77626f5fe65331a87693014"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a062bed4d04d14fee8a53f4c9be673080"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post</a> (&amp;$a)</td></tr>
+<tr class="separator:a062bed4d04d14fee8a53f4c9be673080"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa87382611a66ec5effdb2d78f13f5812"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2photos_8php.html#aa87382611a66ec5effdb2d78f13f5812">photos_content</a> (&amp;$a)</td></tr>
+<tr class="separator:aa87382611a66ec5effdb2d78f13f5812"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="aa87382611a66ec5effdb2d78f13f5812"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photos_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Display upload form</p>
+<p>Display one photo</p>
+
+</div>
+</div>
+<a class="anchor" id="ab950295cd77626f5fe65331a87693014"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photos_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a062bed4d04d14fee8a53f4c9be673080"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photos_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>default post action - upload a photo</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/mod_2photos_8php.js b/doc/html/mod_2photos_8php.js
new file mode 100644
index 000000000..5048ba9c1
--- /dev/null
+++ b/doc/html/mod_2photos_8php.js
@@ -0,0 +1,6 @@
+var mod_2photos_8php =
+[
+ [ "photos_content", "mod_2photos_8php.html#aa87382611a66ec5effdb2d78f13f5812", null ],
+ [ "photos_init", "mod_2photos_8php.html#ab950295cd77626f5fe65331a87693014", null ],
+ [ "photos_post", "mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080", null ]
+]; \ No newline at end of file
diff --git a/doc/html/mod_2settings_8php.html b/doc/html/mod_2settings_8php.html
new file mode 100644
index 000000000..4e3633c56
--- /dev/null
+++ b/doc/html/mod_2settings_8php.html
@@ -0,0 +1,193 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/settings.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rhash-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('mod_2settings_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">settings.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a39abc76ff5459c57e3b957664f273f18"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2settings_8php.html#a39abc76ff5459c57e3b957664f273f18">get_theme_config_file</a> ($theme)</td></tr>
+<tr class="separator:a39abc76ff5459c57e3b957664f273f18"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3a4cde287482fced008583f54ba2a722"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2settings_8php.html#a3a4cde287482fced008583f54ba2a722">settings_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a3a4cde287482fced008583f54ba2a722"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae5aebccb006bee1300078576baaf5582"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2settings_8php.html#ae5aebccb006bee1300078576baaf5582">settings_aside</a> (&amp;$a)</td></tr>
+<tr class="separator:ae5aebccb006bee1300078576baaf5582"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa7ee94d88ac088edb04ccf3a26de3586"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586">settings_post</a> (&amp;$a)</td></tr>
+<tr class="separator:aa7ee94d88ac088edb04ccf3a26de3586"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a39abc76ff5459c57e3b957664f273f18"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_theme_config_file </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$theme</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="mod_2settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586">settings_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ae5aebccb006bee1300078576baaf5582"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">settings_aside </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a3a4cde287482fced008583f54ba2a722"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">settings_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aa7ee94d88ac088edb04ccf3a26de3586"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">settings_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/mod_2settings_8php.js b/doc/html/mod_2settings_8php.js
new file mode 100644
index 000000000..272bdc623
--- /dev/null
+++ b/doc/html/mod_2settings_8php.js
@@ -0,0 +1,7 @@
+var mod_2settings_8php =
+[
+ [ "get_theme_config_file", "mod_2settings_8php.html#a39abc76ff5459c57e3b957664f273f18", null ],
+ [ "settings_aside", "mod_2settings_8php.html#ae5aebccb006bee1300078576baaf5582", null ],
+ [ "settings_init", "mod_2settings_8php.html#a3a4cde287482fced008583f54ba2a722", null ],
+ [ "settings_post", "mod_2settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586", null ]
+]; \ No newline at end of file
diff --git a/doc/html/mod__import_8php.html b/doc/html/mod__import_8php.html
new file mode 100644
index 000000000..6f1e15632
--- /dev/null
+++ b/doc/html/mod__import_8php.html
@@ -0,0 +1,135 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/php/mod_import.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('mod__import_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle">
+<div class="title">mod_import.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:a8db1899eeeb44dabd0904065b63627bb"><td class="memItemLeft" align="right" valign="top">$a&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod__import_8php.html#a8db1899eeeb44dabd0904065b63627bb">page</a> ['template'] = 'full'</td></tr>
+<tr class="separator:a8db1899eeeb44dabd0904065b63627bb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Variable Documentation</h2>
+<a class="anchor" id="a8db1899eeeb44dabd0904065b63627bb"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$a page['template'] = 'full'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classApp.html#af6d39f63fb7116bbeb04e51696f99474">App\__construct()</a>, and <a class="el" href="classApp.html#a08f0537964d98958d218066364cff785">App\build_pagehead()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/mod__import_8php.js b/doc/html/mod__import_8php.js
new file mode 100644
index 000000000..906263adf
--- /dev/null
+++ b/doc/html/mod__import_8php.js
@@ -0,0 +1,4 @@
+var mod__import_8php =
+[
+ [ "page", "mod__import_8php.html#a8db1899eeeb44dabd0904065b63627bb", null ]
+]; \ No newline at end of file
diff --git a/doc/html/mod__new__channel_8php.html b/doc/html/mod__new__channel_8php.html
new file mode 100644
index 000000000..82bfb3f1e
--- /dev/null
+++ b/doc/html/mod__new__channel_8php.html
@@ -0,0 +1,133 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/php/mod_new_channel.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('mod__new__channel_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle">
+<div class="title">mod_new_channel.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:a8db1899eeeb44dabd0904065b63627bb"><td class="memItemLeft" align="right" valign="top">$a&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod__new__channel_8php.html#a8db1899eeeb44dabd0904065b63627bb">page</a> ['template'] = 'full'</td></tr>
+<tr class="separator:a8db1899eeeb44dabd0904065b63627bb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Variable Documentation</h2>
+<a class="anchor" id="a8db1899eeeb44dabd0904065b63627bb"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$a page['template'] = 'full'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/mod__new__channel_8php.js b/doc/html/mod__new__channel_8php.js
new file mode 100644
index 000000000..81be48cb5
--- /dev/null
+++ b/doc/html/mod__new__channel_8php.js
@@ -0,0 +1,4 @@
+var mod__new__channel_8php =
+[
+ [ "page", "mod__new__channel_8php.html#a8db1899eeeb44dabd0904065b63627bb", null ]
+]; \ No newline at end of file
diff --git a/doc/html/mod__register_8php.html b/doc/html/mod__register_8php.html
new file mode 100644
index 000000000..e42a107a2
--- /dev/null
+++ b/doc/html/mod__register_8php.html
@@ -0,0 +1,133 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/php/mod_register.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('mod__register_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle">
+<div class="title">mod_register.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:a8db1899eeeb44dabd0904065b63627bb"><td class="memItemLeft" align="right" valign="top">$a&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod__register_8php.html#a8db1899eeeb44dabd0904065b63627bb">page</a> ['template'] = 'full'</td></tr>
+<tr class="separator:a8db1899eeeb44dabd0904065b63627bb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Variable Documentation</h2>
+<a class="anchor" id="a8db1899eeeb44dabd0904065b63627bb"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$a page['template'] = 'full'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/mod__register_8php.js b/doc/html/mod__register_8php.js
new file mode 100644
index 000000000..ac5d5ab70
--- /dev/null
+++ b/doc/html/mod__register_8php.js
@@ -0,0 +1,4 @@
+var mod__register_8php =
+[
+ [ "page", "mod__register_8php.html#a8db1899eeeb44dabd0904065b63627bb", null ]
+]; \ No newline at end of file
diff --git a/doc/html/mood_8php.html b/doc/html/mood_8php.html
new file mode 100644
index 000000000..2a4ba4f5b
--- /dev/null
+++ b/doc/html/mood_8php.html
@@ -0,0 +1,155 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/mood.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('mood_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">mood.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a7ae136dd7476865b4828136175db5022"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mood_8php.html#a7ae136dd7476865b4828136175db5022">mood_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a7ae136dd7476865b4828136175db5022"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a721b9b6703b3234a005641c92d409b8f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mood_8php.html#a721b9b6703b3234a005641c92d409b8f">mood_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a721b9b6703b3234a005641c92d409b8f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a721b9b6703b3234a005641c92d409b8f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">mood_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a7ae136dd7476865b4828136175db5022"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">mood_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/mood_8php.js b/doc/html/mood_8php.js
new file mode 100644
index 000000000..48b12ef8f
--- /dev/null
+++ b/doc/html/mood_8php.js
@@ -0,0 +1,5 @@
+var mood_8php =
+[
+ [ "mood_content", "mood_8php.html#a721b9b6703b3234a005641c92d409b8f", null ],
+ [ "mood_init", "mood_8php.html#a7ae136dd7476865b4828136175db5022", null ]
+]; \ No newline at end of file
diff --git a/doc/html/msearch_8php.html b/doc/html/msearch_8php.html
new file mode 100644
index 000000000..be2a16b75
--- /dev/null
+++ b/doc/html/msearch_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/msearch.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('msearch_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">msearch.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ac80d2a6c0a92e79eec7efbbccd74d9a8"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="msearch_8php.html#ac80d2a6c0a92e79eec7efbbccd74d9a8">msearch_post</a> (&amp;$a)</td></tr>
+<tr class="separator:ac80d2a6c0a92e79eec7efbbccd74d9a8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="ac80d2a6c0a92e79eec7efbbccd74d9a8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">msearch_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/msearch_8php.js b/doc/html/msearch_8php.js
new file mode 100644
index 000000000..16b349389
--- /dev/null
+++ b/doc/html/msearch_8php.js
@@ -0,0 +1,4 @@
+var msearch_8php =
+[
+ [ "msearch_post", "msearch_8php.html#ac80d2a6c0a92e79eec7efbbccd74d9a8", null ]
+]; \ No newline at end of file
diff --git a/doc/html/namespaceFriendica.html b/doc/html/namespaceFriendica.html
new file mode 100644
index 000000000..6d350cbbf
--- /dev/null
+++ b/doc/html/namespaceFriendica.html
@@ -0,0 +1,115 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Friendica Namespace Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li class="current"><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="namespaces.html"><span>Namespace&#160;List</span></a></li>
+ <li><a href="namespacemembers.html"><span>Namespace&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('namespaceFriendica.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">Friendica Namespace Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>FileBrowser </p>
+<dl class="section author"><dt>Author</dt><dd>Fabio Comuni <a href="#" onclick="location.href='mai'+'lto:'+'fab'+'ri'+'xxm'+'@k'+'irg'+'ro'+'up.'+'co'+'m'; return false;">fabri<span style="display: none;">.nosp@m.</span>xxm@<span style="display: none;">.nosp@m.</span>kirgr<span style="display: none;">.nosp@m.</span>oup.<span style="display: none;">.nosp@m.</span>com</a> </dd></dl>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/namespaceacl__selectors.html b/doc/html/namespaceacl__selectors.html
new file mode 100644
index 000000000..72ecab5ed
--- /dev/null
+++ b/doc/html/namespaceacl__selectors.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: acl_selectors Namespace Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li class="current"><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="namespaces.html"><span>Namespace&#160;List</span></a></li>
+ <li><a href="namespacemembers.html"><span>Namespace&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('namespaceacl__selectors.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">acl_selectors Namespace Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/namespacefriendica-to-smarty-tpl.html b/doc/html/namespacefriendica-to-smarty-tpl.html
new file mode 100644
index 000000000..dc2d9796a
--- /dev/null
+++ b/doc/html/namespacefriendica-to-smarty-tpl.html
@@ -0,0 +1,376 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: friendica-to-smarty-tpl Namespace Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li class="current"><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="namespaces.html"><span>Namespace&#160;List</span></a></li>
+ <li><a href="namespacemembers.html"><span>Namespace&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('namespacefriendica-to-smarty-tpl.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> &#124;
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle">
+<div class="title">friendica-to-smarty-tpl Namespace Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a89388ea9b2826e8218ed480e917d8105"><td class="memItemLeft" align="right" valign="top">def&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacefriendica-to-smarty-tpl.html#a89388ea9b2826e8218ed480e917d8105">fToSmarty</a></td></tr>
+<tr class="separator:a89388ea9b2826e8218ed480e917d8105"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3719dd46e286a57d315e6adae1845854"><td class="memItemLeft" align="right" valign="top">def&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacefriendica-to-smarty-tpl.html#a3719dd46e286a57d315e6adae1845854">fix_element</a></td></tr>
+<tr class="separator:a3719dd46e286a57d315e6adae1845854"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a38503e37fe68ac27c88cce91a9ac9efa"><td class="memItemLeft" align="right" valign="top">def&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacefriendica-to-smarty-tpl.html#a38503e37fe68ac27c88cce91a9ac9efa">convert</a></td></tr>
+<tr class="separator:a38503e37fe68ac27c88cce91a9ac9efa"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af6b2c793958aae2aadc294577431f749"><td class="memItemLeft" align="right" valign="top">def&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacefriendica-to-smarty-tpl.html#af6b2c793958aae2aadc294577431f749">help</a></td></tr>
+<tr class="separator:af6b2c793958aae2aadc294577431f749"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:a0b4cf73d1a8d201a28d269eeb62a5d5c"><td class="memItemLeft" align="right" valign="top">string&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacefriendica-to-smarty-tpl.html#a0b4cf73d1a8d201a28d269eeb62a5d5c">ldelim</a> = '{{'</td></tr>
+<tr class="separator:a0b4cf73d1a8d201a28d269eeb62a5d5c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8540514fb7c4aa18ad2dffa2a975036b"><td class="memItemLeft" align="right" valign="top">string&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacefriendica-to-smarty-tpl.html#a8540514fb7c4aa18ad2dffa2a975036b">rdelim</a> = '}}'</td></tr>
+<tr class="separator:a8540514fb7c4aa18ad2dffa2a975036b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a68d15934660cd1f4301ce251b1646f09"><td class="memItemLeft" align="right" valign="top">string&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacefriendica-to-smarty-tpl.html#a68d15934660cd1f4301ce251b1646f09">path</a> = ''</td></tr>
+<tr class="separator:a68d15934660cd1f4301ce251b1646f09"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a005c1b7a69cac31fad72a941974ba7bb"><td class="memItemLeft" align="right" valign="top">string&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacefriendica-to-smarty-tpl.html#a005c1b7a69cac31fad72a941974ba7bb">outpath</a> = <a class="el" href="namespacefriendica-to-smarty-tpl.html#a68d15934660cd1f4301ce251b1646f09">path</a>+'smarty3/'</td></tr>
+<tr class="separator:a005c1b7a69cac31fad72a941974ba7bb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae74419b16516956c66f7db714a93a6ac"><td class="memItemLeft" align="right" valign="top">tuple&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacefriendica-to-smarty-tpl.html#ae74419b16516956c66f7db714a93a6ac">files</a> = os.listdir(<a class="el" href="namespacefriendica-to-smarty-tpl.html#a68d15934660cd1f4301ce251b1646f09">path</a>)</td></tr>
+<tr class="separator:ae74419b16516956c66f7db714a93a6ac"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5dfc21ab8282dda8e3a7dff43cd0e283"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacefriendica-to-smarty-tpl.html#a5dfc21ab8282dda8e3a7dff43cd0e283">php_tpl</a> = True</td></tr>
+<tr class="separator:a5dfc21ab8282dda8e3a7dff43cd0e283"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5f9bf7a67d955c0d6be70a82097611c5"><td class="memItemLeft" align="right" valign="top">tuple&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacefriendica-to-smarty-tpl.html#a5f9bf7a67d955c0d6be70a82097611c5">filename</a> = os.path.join(<a class="el" href="namespacefriendica-to-smarty-tpl.html#a68d15934660cd1f4301ce251b1646f09">path</a>,a_file)</td></tr>
+<tr class="separator:a5f9bf7a67d955c0d6be70a82097611c5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aecf730e0884bb4ddc6c0deb1ef85f8eb"><td class="memItemLeft" align="right" valign="top">tuple&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacefriendica-to-smarty-tpl.html#aecf730e0884bb4ddc6c0deb1ef85f8eb">ext</a> = a_file.split('.')</td></tr>
+<tr class="separator:aecf730e0884bb4ddc6c0deb1ef85f8eb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a965e1d6d6293654a56e029a7e454dec7"><td class="memItemLeft" align="right" valign="top">tuple&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacefriendica-to-smarty-tpl.html#a965e1d6d6293654a56e029a7e454dec7">f</a> = open(<a class="el" href="namespacefriendica-to-smarty-tpl.html#a5f9bf7a67d955c0d6be70a82097611c5">filename</a>, 'r')</td></tr>
+<tr class="separator:a965e1d6d6293654a56e029a7e454dec7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad9ef87ccb2c9960501f5e02424a22d80"><td class="memItemLeft" align="right" valign="top">tuple&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacefriendica-to-smarty-tpl.html#ad9ef87ccb2c9960501f5e02424a22d80">newfilename</a> = os.path.join(<a class="el" href="namespacefriendica-to-smarty-tpl.html#a005c1b7a69cac31fad72a941974ba7bb">outpath</a>,a_file)</td></tr>
+<tr class="separator:ad9ef87ccb2c9960501f5e02424a22d80"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a87182a9bab47640428bd0b2b9946bef9"><td class="memItemLeft" align="right" valign="top">tuple&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacefriendica-to-smarty-tpl.html#a87182a9bab47640428bd0b2b9946bef9">outf</a> = open(<a class="el" href="namespacefriendica-to-smarty-tpl.html#ad9ef87ccb2c9960501f5e02424a22d80">newfilename</a>, 'w')</td></tr>
+<tr class="separator:a87182a9bab47640428bd0b2b9946bef9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a38503e37fe68ac27c88cce91a9ac9efa"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">def friendica-to-smarty-tpl.convert </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>filename</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>tofilename</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>php_tpl</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a3719dd46e286a57d315e6adae1845854"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">def friendica-to-smarty-tpl.fix_element </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>element</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="namespacefriendica-to-smarty-tpl.html#a38503e37fe68ac27c88cce91a9ac9efa">convert()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a89388ea9b2826e8218ed480e917d8105"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">def friendica-to-smarty-tpl.fToSmarty </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>matches</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="af6b2c793958aae2aadc294577431f749"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">def friendica-to-smarty-tpl.help </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>pname</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Variable Documentation</h2>
+<a class="anchor" id="aecf730e0884bb4ddc6c0deb1ef85f8eb"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">tuple friendica-to-smarty-tpl.ext = a_file.split('.')</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a965e1d6d6293654a56e029a7e454dec7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">tuple friendica-to-smarty-tpl.f = open(<a class="el" href="namespacefriendica-to-smarty-tpl.html#a5f9bf7a67d955c0d6be70a82097611c5">filename</a>, 'r')</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a5f9bf7a67d955c0d6be70a82097611c5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">tuple friendica-to-smarty-tpl.filename = os.path.join(<a class="el" href="namespacefriendica-to-smarty-tpl.html#a68d15934660cd1f4301ce251b1646f09">path</a>,a_file)</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classFriendicaSmarty.html#a6a4d4281d6fa9be1d37a97b188ffe8c9">FriendicaSmarty.parsed()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ae74419b16516956c66f7db714a93a6ac"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">tuple friendica-to-smarty-tpl.files = os.listdir(<a class="el" href="namespacefriendica-to-smarty-tpl.html#a68d15934660cd1f4301ce251b1646f09">path</a>)</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a0b4cf73d1a8d201a28d269eeb62a5d5c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">string friendica-to-smarty-tpl.ldelim = '{{'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classApp.html#a2eb832a8577dee7d40b93abdf6d1d35a">App.get_template_ldelim()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ad9ef87ccb2c9960501f5e02424a22d80"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">tuple friendica-to-smarty-tpl.newfilename = os.path.join(<a class="el" href="namespacefriendica-to-smarty-tpl.html#a005c1b7a69cac31fad72a941974ba7bb">outpath</a>,a_file)</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a87182a9bab47640428bd0b2b9946bef9"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">tuple friendica-to-smarty-tpl.outf = open(<a class="el" href="namespacefriendica-to-smarty-tpl.html#ad9ef87ccb2c9960501f5e02424a22d80">newfilename</a>, 'w')</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a005c1b7a69cac31fad72a941974ba7bb"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">string friendica-to-smarty-tpl.outpath = <a class="el" href="namespacefriendica-to-smarty-tpl.html#a68d15934660cd1f4301ce251b1646f09">path</a>+'smarty3/'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a68d15934660cd1f4301ce251b1646f09"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">string friendica-to-smarty-tpl.path = ''</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classApp.html#af6d39f63fb7116bbeb04e51696f99474">App.__construct()</a>, <a class="el" href="classApp.html#a604d659d6977a99de42a160343e5289a">App.get_baseurl()</a>, <a class="el" href="classApp.html#a78788f6e9d8b713b138f81e457c5cd08">App.set_baseurl()</a>, and <a class="el" href="classApp.html#adb060d5c7f35a521ec7ec0effbe08097">App.set_path()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a5dfc21ab8282dda8e3a7dff43cd0e283"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">friendica-to-smarty-tpl.php_tpl = True</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a8540514fb7c4aa18ad2dffa2a975036b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">string friendica-to-smarty-tpl.rdelim = '}}'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classApp.html#aab23c59172310fd30f2d60dc039d3eea">App.get_template_rdelim()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/namespacemembers.html b/doc/html/namespacemembers.html
new file mode 100644
index 000000000..1d3f9ea06
--- /dev/null
+++ b/doc/html/namespacemembers.html
@@ -0,0 +1,176 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Namespace Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li class="current"><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="namespaces.html"><span>Namespace&#160;List</span></a></li>
+ <li class="current"><a href="namespacemembers.html"><span>Namespace&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="namespacemembers.html"><span>All</span></a></li>
+ <li><a href="namespacemembers_func.html"><span>Functions</span></a></li>
+ <li><a href="namespacemembers_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('namespacemembers.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all namespace members with links to the namespace documentation for each member:</div><ul>
+<li>convert()
+: <a class="el" href="namespacefriendica-to-smarty-tpl.html#a38503e37fe68ac27c88cce91a9ac9efa">friendica-to-smarty-tpl</a>
+</li>
+<li>excludepaths
+: <a class="el" href="namespaceupdatetpl.html#a988d937ed5d5c2b592b763036af5cf94">updatetpl</a>
+</li>
+<li>ext
+: <a class="el" href="namespacefriendica-to-smarty-tpl.html#aecf730e0884bb4ddc6c0deb1ef85f8eb">friendica-to-smarty-tpl</a>
+</li>
+<li>f
+: <a class="el" href="namespacefriendica-to-smarty-tpl.html#a965e1d6d6293654a56e029a7e454dec7">friendica-to-smarty-tpl</a>
+</li>
+<li>filename
+: <a class="el" href="namespacefriendica-to-smarty-tpl.html#a5f9bf7a67d955c0d6be70a82097611c5">friendica-to-smarty-tpl</a>
+</li>
+<li>files
+: <a class="el" href="namespacefriendica-to-smarty-tpl.html#ae74419b16516956c66f7db714a93a6ac">friendica-to-smarty-tpl</a>
+</li>
+<li>fix_element()
+: <a class="el" href="namespacefriendica-to-smarty-tpl.html#a3719dd46e286a57d315e6adae1845854">friendica-to-smarty-tpl</a>
+</li>
+<li>fnull
+: <a class="el" href="namespaceupdatetpl.html#a79c20eb62d568c999b56eb08530355d3">updatetpl</a>
+</li>
+<li>fToSmarty()
+: <a class="el" href="namespacefriendica-to-smarty-tpl.html#a89388ea9b2826e8218ed480e917d8105">friendica-to-smarty-tpl</a>
+</li>
+<li>help()
+: <a class="el" href="namespacefriendica-to-smarty-tpl.html#af6b2c793958aae2aadc294577431f749">friendica-to-smarty-tpl</a>
+, <a class="el" href="namespaceupdatetpl.html#ac9d11279fed403a329a719298feafc4f">updatetpl</a>
+</li>
+<li>ldelim
+: <a class="el" href="namespacefriendica-to-smarty-tpl.html#a0b4cf73d1a8d201a28d269eeb62a5d5c">friendica-to-smarty-tpl</a>
+</li>
+<li>names
+: <a class="el" href="namespaceupdatetpl.html#ab42dd79af65ee82201fd6f04715f62f6">updatetpl</a>
+</li>
+<li>newfilename
+: <a class="el" href="namespacefriendica-to-smarty-tpl.html#ad9ef87ccb2c9960501f5e02424a22d80">friendica-to-smarty-tpl</a>
+</li>
+<li>outf
+: <a class="el" href="namespacefriendica-to-smarty-tpl.html#a87182a9bab47640428bd0b2b9946bef9">friendica-to-smarty-tpl</a>
+</li>
+<li>outpath
+: <a class="el" href="namespacefriendica-to-smarty-tpl.html#a005c1b7a69cac31fad72a941974ba7bb">friendica-to-smarty-tpl</a>
+</li>
+<li>path
+: <a class="el" href="namespacefriendica-to-smarty-tpl.html#a68d15934660cd1f4301ce251b1646f09">friendica-to-smarty-tpl</a>
+, <a class="el" href="namespaceupdatetpl.html#ae694f5e1f25f8a92a945eb90c432dfe6">updatetpl</a>
+</li>
+<li>php_tpl
+: <a class="el" href="namespacefriendica-to-smarty-tpl.html#a5dfc21ab8282dda8e3a7dff43cd0e283">friendica-to-smarty-tpl</a>
+</li>
+<li>rdelim
+: <a class="el" href="namespacefriendica-to-smarty-tpl.html#a8540514fb7c4aa18ad2dffa2a975036b">friendica-to-smarty-tpl</a>
+</li>
+<li>tplpaths
+: <a class="el" href="namespaceupdatetpl.html#a52a85ffa6b6d63d840b185a133478c12">updatetpl</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/namespacemembers_func.html b/doc/html/namespacemembers_func.html
new file mode 100644
index 000000000..1e4f0fcaa
--- /dev/null
+++ b/doc/html/namespacemembers_func.html
@@ -0,0 +1,130 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Namespace Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li class="current"><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="namespaces.html"><span>Namespace&#160;List</span></a></li>
+ <li class="current"><a href="namespacemembers.html"><span>Namespace&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="namespacemembers.html"><span>All</span></a></li>
+ <li class="current"><a href="namespacemembers_func.html"><span>Functions</span></a></li>
+ <li><a href="namespacemembers_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('namespacemembers_func.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;<ul>
+<li>convert()
+: <a class="el" href="namespacefriendica-to-smarty-tpl.html#a38503e37fe68ac27c88cce91a9ac9efa">friendica-to-smarty-tpl</a>
+</li>
+<li>fix_element()
+: <a class="el" href="namespacefriendica-to-smarty-tpl.html#a3719dd46e286a57d315e6adae1845854">friendica-to-smarty-tpl</a>
+</li>
+<li>fToSmarty()
+: <a class="el" href="namespacefriendica-to-smarty-tpl.html#a89388ea9b2826e8218ed480e917d8105">friendica-to-smarty-tpl</a>
+</li>
+<li>help()
+: <a class="el" href="namespacefriendica-to-smarty-tpl.html#af6b2c793958aae2aadc294577431f749">friendica-to-smarty-tpl</a>
+, <a class="el" href="namespaceupdatetpl.html#ac9d11279fed403a329a719298feafc4f">updatetpl</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/namespacemembers_vars.html b/doc/html/namespacemembers_vars.html
new file mode 100644
index 000000000..55cdd0ee1
--- /dev/null
+++ b/doc/html/namespacemembers_vars.html
@@ -0,0 +1,163 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Namespace Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li class="current"><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="namespaces.html"><span>Namespace&#160;List</span></a></li>
+ <li class="current"><a href="namespacemembers.html"><span>Namespace&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="namespacemembers.html"><span>All</span></a></li>
+ <li><a href="namespacemembers_func.html"><span>Functions</span></a></li>
+ <li class="current"><a href="namespacemembers_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('namespacemembers_vars.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;<ul>
+<li>excludepaths
+: <a class="el" href="namespaceupdatetpl.html#a988d937ed5d5c2b592b763036af5cf94">updatetpl</a>
+</li>
+<li>ext
+: <a class="el" href="namespacefriendica-to-smarty-tpl.html#aecf730e0884bb4ddc6c0deb1ef85f8eb">friendica-to-smarty-tpl</a>
+</li>
+<li>f
+: <a class="el" href="namespacefriendica-to-smarty-tpl.html#a965e1d6d6293654a56e029a7e454dec7">friendica-to-smarty-tpl</a>
+</li>
+<li>filename
+: <a class="el" href="namespacefriendica-to-smarty-tpl.html#a5f9bf7a67d955c0d6be70a82097611c5">friendica-to-smarty-tpl</a>
+</li>
+<li>files
+: <a class="el" href="namespacefriendica-to-smarty-tpl.html#ae74419b16516956c66f7db714a93a6ac">friendica-to-smarty-tpl</a>
+</li>
+<li>fnull
+: <a class="el" href="namespaceupdatetpl.html#a79c20eb62d568c999b56eb08530355d3">updatetpl</a>
+</li>
+<li>ldelim
+: <a class="el" href="namespacefriendica-to-smarty-tpl.html#a0b4cf73d1a8d201a28d269eeb62a5d5c">friendica-to-smarty-tpl</a>
+</li>
+<li>names
+: <a class="el" href="namespaceupdatetpl.html#ab42dd79af65ee82201fd6f04715f62f6">updatetpl</a>
+</li>
+<li>newfilename
+: <a class="el" href="namespacefriendica-to-smarty-tpl.html#ad9ef87ccb2c9960501f5e02424a22d80">friendica-to-smarty-tpl</a>
+</li>
+<li>outf
+: <a class="el" href="namespacefriendica-to-smarty-tpl.html#a87182a9bab47640428bd0b2b9946bef9">friendica-to-smarty-tpl</a>
+</li>
+<li>outpath
+: <a class="el" href="namespacefriendica-to-smarty-tpl.html#a005c1b7a69cac31fad72a941974ba7bb">friendica-to-smarty-tpl</a>
+</li>
+<li>path
+: <a class="el" href="namespacefriendica-to-smarty-tpl.html#a68d15934660cd1f4301ce251b1646f09">friendica-to-smarty-tpl</a>
+, <a class="el" href="namespaceupdatetpl.html#ae694f5e1f25f8a92a945eb90c432dfe6">updatetpl</a>
+</li>
+<li>php_tpl
+: <a class="el" href="namespacefriendica-to-smarty-tpl.html#a5dfc21ab8282dda8e3a7dff43cd0e283">friendica-to-smarty-tpl</a>
+</li>
+<li>rdelim
+: <a class="el" href="namespacefriendica-to-smarty-tpl.html#a8540514fb7c4aa18ad2dffa2a975036b">friendica-to-smarty-tpl</a>
+</li>
+<li>tplpaths
+: <a class="el" href="namespaceupdatetpl.html#a52a85ffa6b6d63d840b185a133478c12">updatetpl</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/namespaces.html b/doc/html/namespaces.html
new file mode 100644
index 000000000..8ff7eddf2
--- /dev/null
+++ b/doc/html/namespaces.html
@@ -0,0 +1,121 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Namespace List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li class="current"><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="namespaces.html"><span>Namespace&#160;List</span></a></li>
+ <li><a href="namespacemembers.html"><span>Namespace&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('namespaces.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">Namespace List</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock">Here is a list of all namespaces with brief descriptions:</div><div class="directory">
+<table class="directory">
+<tr id="row_0_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2ns.png" alt="N" width="24" height="22" /><a class="el" href="namespaceacl__selectors.html" target="_self">acl_selectors</a></td><td class="desc"></td></tr>
+<tr id="row_1_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2ns.png" alt="N" width="24" height="22" /><a class="el" href="namespaceFriendica.html" target="_self">Friendica</a></td><td class="desc"></td></tr>
+<tr id="row_2_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2ns.png" alt="N" width="24" height="22" /><a class="el" href="namespacefriendica-to-smarty-tpl.html" target="_self">friendica-to-smarty-tpl</a></td><td class="desc"></td></tr>
+<tr id="row_3_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2ns.png" alt="N" width="24" height="22" /><a class="el" href="namespaceupdatetpl.html" target="_self">updatetpl</a></td><td class="desc"></td></tr>
+<tr id="row_4_" class="even"><td class="entry"><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2ns.png" alt="N" width="24" height="22" /><a class="el" href="namespaceutil.html" target="_self">util</a></td><td class="desc"></td></tr>
+</table>
+</div><!-- directory -->
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/namespaces.js b/doc/html/namespaces.js
new file mode 100644
index 000000000..681592f37
--- /dev/null
+++ b/doc/html/namespaces.js
@@ -0,0 +1,8 @@
+var namespaces =
+[
+ [ "acl_selectors", "namespaceacl__selectors.html", null ],
+ [ "Friendica", "namespaceFriendica.html", null ],
+ [ "friendica-to-smarty-tpl", "namespacefriendica-to-smarty-tpl.html", null ],
+ [ "updatetpl", "namespaceupdatetpl.html", null ],
+ [ "util", "namespaceutil.html", null ]
+]; \ No newline at end of file
diff --git a/doc/html/namespaceupdatetpl.html b/doc/html/namespaceupdatetpl.html
new file mode 100644
index 000000000..4dd30a85c
--- /dev/null
+++ b/doc/html/namespaceupdatetpl.html
@@ -0,0 +1,212 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: updatetpl Namespace Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li class="current"><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="namespaces.html"><span>Namespace&#160;List</span></a></li>
+ <li><a href="namespacemembers.html"><span>Namespace&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('namespaceupdatetpl.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> &#124;
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle">
+<div class="title">updatetpl Namespace Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ac9d11279fed403a329a719298feafc4f"><td class="memItemLeft" align="right" valign="top">def&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespaceupdatetpl.html#ac9d11279fed403a329a719298feafc4f">help</a></td></tr>
+<tr class="separator:ac9d11279fed403a329a719298feafc4f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:ae694f5e1f25f8a92a945eb90c432dfe6"><td class="memItemLeft" align="right" valign="top">string&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespaceupdatetpl.html#ae694f5e1f25f8a92a945eb90c432dfe6">path</a> = ''</td></tr>
+<tr class="separator:ae694f5e1f25f8a92a945eb90c432dfe6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a988d937ed5d5c2b592b763036af5cf94"><td class="memItemLeft" align="right" valign="top">list&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespaceupdatetpl.html#a988d937ed5d5c2b592b763036af5cf94">excludepaths</a> = ['css', 'img', 'js', 'php', 'theme']</td></tr>
+<tr class="separator:a988d937ed5d5c2b592b763036af5cf94"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a52a85ffa6b6d63d840b185a133478c12"><td class="memItemLeft" align="right" valign="top">list&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespaceupdatetpl.html#a52a85ffa6b6d63d840b185a133478c12">tplpaths</a> = []</td></tr>
+<tr class="separator:a52a85ffa6b6d63d840b185a133478c12"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab42dd79af65ee82201fd6f04715f62f6"><td class="memItemLeft" align="right" valign="top">tuple&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespaceupdatetpl.html#ab42dd79af65ee82201fd6f04715f62f6">names</a> = os.listdir(<a class="el" href="namespaceupdatetpl.html#ae694f5e1f25f8a92a945eb90c432dfe6">path</a> + 'view/')</td></tr>
+<tr class="separator:ab42dd79af65ee82201fd6f04715f62f6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a79c20eb62d568c999b56eb08530355d3"><td class="memItemLeft" align="right" valign="top">tuple&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespaceupdatetpl.html#a79c20eb62d568c999b56eb08530355d3">fnull</a> = open(os.devnull, &quot;w&quot;)</td></tr>
+<tr class="separator:a79c20eb62d568c999b56eb08530355d3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="ac9d11279fed403a329a719298feafc4f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">def updatetpl.help </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>pname</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Variable Documentation</h2>
+<a class="anchor" id="a988d937ed5d5c2b592b763036af5cf94"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">list updatetpl.excludepaths = ['css', 'img', 'js', 'php', 'theme']</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a79c20eb62d568c999b56eb08530355d3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">tuple updatetpl.fnull = open(os.devnull, &quot;w&quot;)</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ab42dd79af65ee82201fd6f04715f62f6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">tuple updatetpl.names = os.listdir(<a class="el" href="namespaceupdatetpl.html#ae694f5e1f25f8a92a945eb90c432dfe6">path</a> + 'view/')</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ae694f5e1f25f8a92a945eb90c432dfe6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">string updatetpl.path = ''</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a52a85ffa6b6d63d840b185a133478c12"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">list updatetpl.tplpaths = []</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/namespaceutil.html b/doc/html/namespaceutil.html
new file mode 100644
index 000000000..9991102cd
--- /dev/null
+++ b/doc/html/namespaceutil.html
@@ -0,0 +1,144 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: util Namespace Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li class="current"><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="namespaces.html"><span>Namespace&#160;List</span></a></li>
+ <li><a href="namespacemembers.html"><span>Namespace&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('namespaceutil.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">util Namespace Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>When I installed docblox, I had the experience that it does not generate any output at all. This script may be used to find that kind of problems with the documentation build process. If docblox generates output, use another approach for debugging.</p>
+<p>Basically, docblox takes a list of files to build documentation from. This script assumes there is a file or set of files breaking the build when it is included in that list. It tries to calculate the smallest list containing these files. Unfortunatly, the original problem is NP-complete, so what the script does is a best guess only.</p>
+<p>So it starts with a list of all files in the project. If that list can't be build, it cuts it in two parts and tries both parts independently. If only one of them breaks, it takes that one and tries the same independently. If both break, it assumes this is the smallest set. This assumption is not necessarily true. Maybe the smallest set consists of two files and both of them were in different parts when the list was divided, but by now it is my best guess. To make this assumption better, the list is shuffled after every step.</p>
+<p>After that, the script tries to remove a file from the list. It tests if the list breaks and if so, it assumes that the file it removed belongs to the set of errorneous files. This is done for all files, so, in the end removing one file leads to a working doc build.</p>
+<dl class="section author"><dt>Author</dt><dd>Alexander Kampmann</dd></dl>
+<p>This function generates a comma seperated list of file names.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype">array</td><td class="paramname">$fileset</td><td>Set of file names</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>string comma-seperated list of the file names</dd></dl>
+<p>This functions runs phpdoc on the provided list of files</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype">array</td><td class="paramname">$fileset</td><td>Set of filenames</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>bool true, if that set can be built</dd></dl>
+<p>This functions cuts down a fileset by removing files until it finally works. it was meant to be recursive, but php's maximum stack size is to small. So it just simulates recursion.</p>
+<p>In that version, it does not necessarily generate the smallest set, because it may not alter the elements order enough.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype">array</td><td class="paramname">$fileset</td><td>set of filenames </td></tr>
+ <tr><td class="paramtype">int</td><td class="paramname">$ps</td><td>number of files in subsets</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>array a part of $fileset, that crashes </dd></dl>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/nav_8php.html b/doc/html/nav_8php.html
new file mode 100644
index 000000000..c00d5ce4c
--- /dev/null
+++ b/doc/html/nav_8php.html
@@ -0,0 +1,167 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/nav.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('nav_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">nav.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a43be0df73b90647ea70947ce004e231e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="nav_8php.html#a43be0df73b90647ea70947ce004e231e">nav</a> (&amp;$a)</td></tr>
+<tr class="separator:a43be0df73b90647ea70947ce004e231e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac3c920ce3ea5b0d9e0678ee37155f06a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="nav_8php.html#ac3c920ce3ea5b0d9e0678ee37155f06a">nav_set_selected</a> ($item)</td></tr>
+<tr class="separator:ac3c920ce3ea5b0d9e0678ee37155f06a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a43be0df73b90647ea70947ce004e231e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">nav </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Build page header and site navigation bars</p>
+<p>Placeholder div for popup panel</p>
+<p>Our network is distributed, and as you visit friends some of the sites look exactly the same - it isn't always easy to know where you are. Display the current site location as a navigation aid.</p>
+<p>Display login or logout</p>
+<p>"Home" should also take you home from an authenticated remote profile connection</p>
+<p>The following nav links are only show to logged in users</p>
+<p>Admin page</p>
+<p>Provide a banner/logo/whatever</p>
+
+<p>Referenced by <a class="el" href="boot_8php.html#acc4e0c910af066148b810e5fde55fff1">construct_page()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ac3c920ce3ea5b0d9e0678ee37155f06a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">nav_set_selected </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>, <a class="el" href="community_8php.html#a1197aafd6a6b540dbb4a0c04ade3a25a">community_content()</a>, <a class="el" href="connections_8php.html#aec2e457420fce3e3bf6a9f48e36df25c">connections_content()</a>, <a class="el" href="mod_2directory_8php.html#aac79396570d759da2efac24fcedf5b44">directory_content()</a>, <a class="el" href="events_8php.html#a1d293fb217ae6bc9e3858c4b32e363ec">events_content()</a>, <a class="el" href="help_8php.html#af055e15f600ffa6fbca9386fdf715224">help_content()</a>, <a class="el" href="mail_8php.html#a3c7c485fc69f92371e8b20936040eca1">mail_content()</a>, <a class="el" href="mod_2message_8php.html#ac72dfed3ce08fcb331d66b37edc6e15f">message_content()</a>, <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>, <a class="el" href="notifications_8php.html#aadd0b5525bd8c283a5d8a37982bbfe62">notifications_content()</a>, <a class="el" href="profiles_8php.html#a36f71405ad536228f8bb84a551b23f7e">profiles_init()</a>, and <a class="el" href="search_8php.html#ab2568591359edde5b483a6cd9a24b2cc">search_content()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/nav_8php.js b/doc/html/nav_8php.js
new file mode 100644
index 000000000..09cec55d1
--- /dev/null
+++ b/doc/html/nav_8php.js
@@ -0,0 +1,5 @@
+var nav_8php =
+[
+ [ "nav", "nav_8php.html#a43be0df73b90647ea70947ce004e231e", null ],
+ [ "nav_set_selected", "nav_8php.html#ac3c920ce3ea5b0d9e0678ee37155f06a", null ]
+]; \ No newline at end of file
diff --git a/doc/html/nav_f.png b/doc/html/nav_f.png
new file mode 100644
index 000000000..72a58a529
--- /dev/null
+++ b/doc/html/nav_f.png
Binary files differ
diff --git a/doc/html/nav_g.png b/doc/html/nav_g.png
new file mode 100644
index 000000000..2093a237a
--- /dev/null
+++ b/doc/html/nav_g.png
Binary files differ
diff --git a/doc/html/nav_h.png b/doc/html/nav_h.png
new file mode 100644
index 000000000..33389b101
--- /dev/null
+++ b/doc/html/nav_h.png
Binary files differ
diff --git a/doc/html/navtree.css b/doc/html/navtree.css
new file mode 100644
index 000000000..41a9cb969
--- /dev/null
+++ b/doc/html/navtree.css
@@ -0,0 +1,143 @@
+#nav-tree .children_ul {
+ margin:0;
+ padding:4px;
+}
+
+#nav-tree ul {
+ list-style:none outside none;
+ margin:0px;
+ padding:0px;
+}
+
+#nav-tree li {
+ white-space:nowrap;
+ margin:0px;
+ padding:0px;
+}
+
+#nav-tree .plus {
+ margin:0px;
+}
+
+#nav-tree .selected {
+ background-image: url('tab_a.png');
+ background-repeat:repeat-x;
+ color: #fff;
+ text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0);
+}
+
+#nav-tree img {
+ margin:0px;
+ padding:0px;
+ border:0px;
+ vertical-align: middle;
+}
+
+#nav-tree a {
+ text-decoration:none;
+ padding:0px;
+ margin:0px;
+ outline:none;
+}
+
+#nav-tree .label {
+ margin:0px;
+ padding:0px;
+ font: 12px 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif;
+}
+
+#nav-tree .label a {
+ padding:2px;
+}
+
+#nav-tree .selected a {
+ text-decoration:none;
+ color:#fff;
+}
+
+#nav-tree .children_ul {
+ margin:0px;
+ padding:0px;
+}
+
+#nav-tree .item {
+ margin:0px;
+ padding:0px;
+}
+
+#nav-tree {
+ padding: 0px 0px;
+ background-color: #FAFAFF;
+ font-size:14px;
+ overflow:auto;
+}
+
+#doc-content {
+ overflow:auto;
+ display:block;
+ padding:0px;
+ margin:0px;
+ -webkit-overflow-scrolling : touch; /* iOS 5+ */
+}
+
+#side-nav {
+ padding:0 6px 0 0;
+ margin: 0px;
+ display:block;
+ position: absolute;
+ left: 0px;
+ width: 250px;
+}
+
+.ui-resizable .ui-resizable-handle {
+ display:block;
+}
+
+.ui-resizable-e {
+ background:url("ftv2splitbar.png") repeat scroll right center transparent;
+ cursor:e-resize;
+ height:100%;
+ right:0;
+ top:0;
+ width:6px;
+}
+
+.ui-resizable-handle {
+ display:none;
+ font-size:0.1px;
+ position:absolute;
+ z-index:1;
+}
+
+#nav-tree-contents {
+ margin: 6px 0px 0px 0px;
+}
+
+#nav-tree {
+ background-image:url('nav_h.png');
+ background-repeat:repeat-x;
+ background-color: #F9FAFC;
+ -webkit-overflow-scrolling : touch; /* iOS 5+ */
+}
+
+#nav-sync {
+ position:absolute;
+ top:5px;
+ right:24px;
+ z-index:0;
+}
+
+#nav-sync img {
+ opacity:0.3;
+}
+
+#nav-sync img:hover {
+ opacity:0.9;
+}
+
+@media print
+{
+ #nav-tree { display: none; }
+ div.ui-resizable-handle { display: none; position: relative; }
+}
+
diff --git a/doc/html/navtree.js b/doc/html/navtree.js
new file mode 100644
index 000000000..77279cc7a
--- /dev/null
+++ b/doc/html/navtree.js
@@ -0,0 +1,543 @@
+var NAVTREE =
+[
+ [ "The Red Matrix", "index.html", [
+ [ "CLI config utility", "md_config.html", null ],
+ [ "Fresh - The Freaking REd Shell", "md_fresh.html", null ],
+ [ "apw", "md_README.html", null ],
+ [ "Namespaces", null, [
+ [ "Namespace List", "namespaces.html", "namespaces" ],
+ [ "Namespace Members", "namespacemembers.html", [
+ [ "All", "namespacemembers.html", null ],
+ [ "Functions", "namespacemembers_func.html", null ],
+ [ "Variables", "namespacemembers_vars.html", null ]
+ ] ]
+ ] ],
+ [ "Classes", null, [
+ [ "Class List", "annotated.html", "annotated" ],
+ [ "Class Index", "classes.html", null ],
+ [ "Class Hierarchy", "hierarchy.html", "hierarchy" ],
+ [ "Class Members", "functions.html", [
+ [ "All", "functions.html", "functions_dup" ],
+ [ "Functions", "functions_func.html", "functions_func" ],
+ [ "Variables", "functions_vars.html", null ]
+ ] ]
+ ] ],
+ [ "Files", null, [
+ [ "File List", "files.html", "files" ],
+ [ "File Members", "globals.html", [
+ [ "All", "globals.html", "globals_dup" ],
+ [ "Functions", "globals_func.html", "globals_func" ],
+ [ "Variables", "globals_vars.html", "globals_vars" ]
+ ] ]
+ ] ]
+ ] ]
+];
+
+var NAVTREEINDEX =
+[
+"BaseObject_8php.html",
+"boot_8php.html#a8905fde0a5b7882bdc083b20d9b34701",
+"classFKOAuth1.html",
+"community_8php.html",
+"functions_func_0x68.html",
+"include_2message_8php.html#a254a756031e4d5e94f85e2939bdb5091",
+"parse__url_8php.html",
+"socgraph_8php.html",
+"widgets_8php.html#add9b24d3304e529a7975e96122315554"
+];
+
+var SYNCONMSG = 'click to disable panel synchronisation';
+var SYNCOFFMSG = 'click to enable panel synchronisation';
+var navTreeSubIndices = new Array();
+
+function getData(varName)
+{
+ var i = varName.lastIndexOf('/');
+ var n = i>=0 ? varName.substring(i+1) : varName;
+ return eval(n.replace(/\-/g,'_'));
+}
+
+function stripPath(uri)
+{
+ return uri.substring(uri.lastIndexOf('/')+1);
+}
+
+function stripPath2(uri)
+{
+ var i = uri.lastIndexOf('/');
+ var s = uri.substring(i+1);
+ var m = uri.substring(0,i+1).match(/\/d\w\/d\w\w\/$/);
+ return m ? uri.substring(i-6) : s;
+}
+
+function localStorageSupported()
+{
+ try {
+ return 'localStorage' in window && window['localStorage'] !== null && window.localStorage.getItem;
+ }
+ catch(e) {
+ return false;
+ }
+}
+
+
+function storeLink(link)
+{
+ if (!$("#nav-sync").hasClass('sync') && localStorageSupported()) {
+ window.localStorage.setItem('navpath',link);
+ }
+}
+
+function deleteLink()
+{
+ if (localStorageSupported()) {
+ window.localStorage.setItem('navpath','');
+ }
+}
+
+function cachedLink()
+{
+ if (localStorageSupported()) {
+ return window.localStorage.getItem('navpath');
+ } else {
+ return '';
+ }
+}
+
+function getScript(scriptName,func,show)
+{
+ var head = document.getElementsByTagName("head")[0];
+ var script = document.createElement('script');
+ script.id = scriptName;
+ script.type = 'text/javascript';
+ script.onload = func;
+ script.src = scriptName+'.js';
+ if ($.browser.msie && $.browser.version<=8) {
+ // script.onload does not work with older versions of IE
+ script.onreadystatechange = function() {
+ if (script.readyState=='complete' || script.readyState=='loaded') {
+ func(); if (show) showRoot();
+ }
+ }
+ }
+ head.appendChild(script);
+}
+
+function createIndent(o,domNode,node,level)
+{
+ var level=-1;
+ var n = node;
+ while (n.parentNode) { level++; n=n.parentNode; }
+ var imgNode = document.createElement("img");
+ imgNode.style.paddingLeft=(16*level).toString()+'px';
+ imgNode.width = 16;
+ imgNode.height = 22;
+ imgNode.border = 0;
+ if (node.childrenData) {
+ node.plus_img = imgNode;
+ node.expandToggle = document.createElement("a");
+ node.expandToggle.href = "javascript:void(0)";
+ node.expandToggle.onclick = function() {
+ if (node.expanded) {
+ $(node.getChildrenUL()).slideUp("fast");
+ node.plus_img.src = node.relpath+"ftv2pnode.png";
+ node.expanded = false;
+ } else {
+ expandNode(o, node, false, false);
+ }
+ }
+ node.expandToggle.appendChild(imgNode);
+ domNode.appendChild(node.expandToggle);
+ imgNode.src = node.relpath+"ftv2pnode.png";
+ } else {
+ imgNode.src = node.relpath+"ftv2node.png";
+ domNode.appendChild(imgNode);
+ }
+}
+
+var animationInProgress = false;
+
+function gotoAnchor(anchor,aname,updateLocation)
+{
+ var pos, docContent = $('#doc-content');
+ if (anchor.parent().attr('class')=='memItemLeft' ||
+ anchor.parent().attr('class')=='fieldtype' ||
+ anchor.parent().is(':header'))
+ {
+ pos = anchor.parent().position().top;
+ } else if (anchor.position()) {
+ pos = anchor.position().top;
+ }
+ if (pos) {
+ var dist = Math.abs(Math.min(
+ pos-docContent.offset().top,
+ docContent[0].scrollHeight-
+ docContent.height()-docContent.scrollTop()));
+ animationInProgress=true;
+ docContent.animate({
+ scrollTop: pos + docContent.scrollTop() - docContent.offset().top
+ },Math.max(50,Math.min(500,dist)),function(){
+ if (updateLocation) window.location.href=aname;
+ animationInProgress=false;
+ });
+ }
+}
+
+function newNode(o, po, text, link, childrenData, lastNode)
+{
+ var node = new Object();
+ node.children = Array();
+ node.childrenData = childrenData;
+ node.depth = po.depth + 1;
+ node.relpath = po.relpath;
+ node.isLast = lastNode;
+
+ node.li = document.createElement("li");
+ po.getChildrenUL().appendChild(node.li);
+ node.parentNode = po;
+
+ node.itemDiv = document.createElement("div");
+ node.itemDiv.className = "item";
+
+ node.labelSpan = document.createElement("span");
+ node.labelSpan.className = "label";
+
+ createIndent(o,node.itemDiv,node,0);
+ node.itemDiv.appendChild(node.labelSpan);
+ node.li.appendChild(node.itemDiv);
+
+ var a = document.createElement("a");
+ node.labelSpan.appendChild(a);
+ node.label = document.createTextNode(text);
+ node.expanded = false;
+ a.appendChild(node.label);
+ if (link) {
+ var url;
+ if (link.substring(0,1)=='^') {
+ url = link.substring(1);
+ link = url;
+ } else {
+ url = node.relpath+link;
+ }
+ a.className = stripPath(link.replace('#',':'));
+ if (link.indexOf('#')!=-1) {
+ var aname = '#'+link.split('#')[1];
+ var srcPage = stripPath($(location).attr('pathname'));
+ var targetPage = stripPath(link.split('#')[0]);
+ a.href = srcPage!=targetPage ? url : "javascript:void(0)";
+ a.onclick = function(){
+ storeLink(link);
+ if (!$(a).parent().parent().hasClass('selected'))
+ {
+ $('.item').removeClass('selected');
+ $('.item').removeAttr('id');
+ $(a).parent().parent().addClass('selected');
+ $(a).parent().parent().attr('id','selected');
+ }
+ var anchor = $(aname);
+ gotoAnchor(anchor,aname,true);
+ };
+ } else {
+ a.href = url;
+ a.onclick = function() { storeLink(link); }
+ }
+ } else {
+ if (childrenData != null)
+ {
+ a.className = "nolink";
+ a.href = "javascript:void(0)";
+ a.onclick = node.expandToggle.onclick;
+ }
+ }
+
+ node.childrenUL = null;
+ node.getChildrenUL = function() {
+ if (!node.childrenUL) {
+ node.childrenUL = document.createElement("ul");
+ node.childrenUL.className = "children_ul";
+ node.childrenUL.style.display = "none";
+ node.li.appendChild(node.childrenUL);
+ }
+ return node.childrenUL;
+ };
+
+ return node;
+}
+
+function showRoot()
+{
+ var headerHeight = $("#top").height();
+ var footerHeight = $("#nav-path").height();
+ var windowHeight = $(window).height() - headerHeight - footerHeight;
+ (function (){ // retry until we can scroll to the selected item
+ try {
+ var navtree=$('#nav-tree');
+ navtree.scrollTo('#selected',0,{offset:-windowHeight/2});
+ } catch (err) {
+ setTimeout(arguments.callee, 0);
+ }
+ })();
+}
+
+function expandNode(o, node, imm, showRoot)
+{
+ if (node.childrenData && !node.expanded) {
+ if (typeof(node.childrenData)==='string') {
+ var varName = node.childrenData;
+ getScript(node.relpath+varName,function(){
+ node.childrenData = getData(varName);
+ expandNode(o, node, imm, showRoot);
+ }, showRoot);
+ } else {
+ if (!node.childrenVisited) {
+ getNode(o, node);
+ } if (imm || ($.browser.msie && $.browser.version>8)) {
+ // somehow slideDown jumps to the start of tree for IE9 :-(
+ $(node.getChildrenUL()).show();
+ } else {
+ $(node.getChildrenUL()).slideDown("fast");
+ }
+ if (node.isLast) {
+ node.plus_img.src = node.relpath+"ftv2mlastnode.png";
+ } else {
+ node.plus_img.src = node.relpath+"ftv2mnode.png";
+ }
+ node.expanded = true;
+ }
+ }
+}
+
+function glowEffect(n,duration)
+{
+ n.addClass('glow').delay(duration).queue(function(next){
+ $(this).removeClass('glow');next();
+ });
+}
+
+function highlightAnchor()
+{
+ var aname = $(location).attr('hash');
+ var anchor = $(aname);
+ if (anchor.parent().attr('class')=='memItemLeft'){
+ var rows = $('.memberdecls tr[class$="'+
+ window.location.hash.substring(1)+'"]');
+ glowEffect(rows.children(),300); // member without details
+ } else if (anchor.parents().slice(2).prop('tagName')=='TR') {
+ glowEffect(anchor.parents('div.memitem'),1000); // enum value
+ } else if (anchor.parent().attr('class')=='fieldtype'){
+ glowEffect(anchor.parent().parent(),1000); // struct field
+ } else if (anchor.parent().is(":header")) {
+ glowEffect(anchor.parent(),1000); // section header
+ } else {
+ glowEffect(anchor.next(),1000); // normal member
+ }
+ gotoAnchor(anchor,aname,false);
+}
+
+function selectAndHighlight(hash,n)
+{
+ var a;
+ if (hash) {
+ var link=stripPath($(location).attr('pathname'))+':'+hash.substring(1);
+ a=$('.item a[class$="'+link+'"]');
+ }
+ if (a && a.length) {
+ a.parent().parent().addClass('selected');
+ a.parent().parent().attr('id','selected');
+ highlightAnchor();
+ } else if (n) {
+ $(n.itemDiv).addClass('selected');
+ $(n.itemDiv).attr('id','selected');
+ }
+ if ($('#nav-tree-contents .item:first').hasClass('selected')) {
+ $('#nav-sync').css('top','30px');
+ } else {
+ $('#nav-sync').css('top','5px');
+ }
+ showRoot();
+}
+
+function showNode(o, node, index, hash)
+{
+ if (node && node.childrenData) {
+ if (typeof(node.childrenData)==='string') {
+ var varName = node.childrenData;
+ getScript(node.relpath+varName,function(){
+ node.childrenData = getData(varName);
+ showNode(o,node,index,hash);
+ },true);
+ } else {
+ if (!node.childrenVisited) {
+ getNode(o, node);
+ }
+ $(node.getChildrenUL()).show();
+ if (node.isLast) {
+ node.plus_img.src = node.relpath+"ftv2mlastnode.png";
+ } else {
+ node.plus_img.src = node.relpath+"ftv2mnode.png";
+ }
+ node.expanded = true;
+ var n = node.children[o.breadcrumbs[index]];
+ if (index+1<o.breadcrumbs.length) {
+ showNode(o,n,index+1,hash);
+ } else {
+ if (typeof(n.childrenData)==='string') {
+ var varName = n.childrenData;
+ getScript(n.relpath+varName,function(){
+ n.childrenData = getData(varName);
+ node.expanded=false;
+ showNode(o,node,index,hash); // retry with child node expanded
+ },true);
+ } else {
+ var rootBase = stripPath(o.toroot.replace(/\..+$/, ''));
+ if (rootBase=="index" || rootBase=="pages" || rootBase=="search") {
+ expandNode(o, n, true, true);
+ }
+ selectAndHighlight(hash,n);
+ }
+ }
+ }
+ } else {
+ selectAndHighlight(hash);
+ }
+}
+
+function getNode(o, po)
+{
+ po.childrenVisited = true;
+ var l = po.childrenData.length-1;
+ for (var i in po.childrenData) {
+ var nodeData = po.childrenData[i];
+ po.children[i] = newNode(o, po, nodeData[0], nodeData[1], nodeData[2],
+ i==l);
+ }
+}
+
+function gotoNode(o,subIndex,root,hash,relpath)
+{
+ var nti = navTreeSubIndices[subIndex][root+hash];
+ o.breadcrumbs = $.extend(true, [], nti ? nti : navTreeSubIndices[subIndex][root]);
+ if (!o.breadcrumbs && root!=NAVTREE[0][1]) { // fallback: show index
+ navTo(o,NAVTREE[0][1],"",relpath);
+ $('.item').removeClass('selected');
+ $('.item').removeAttr('id');
+ }
+ if (o.breadcrumbs) {
+ o.breadcrumbs.unshift(0); // add 0 for root node
+ showNode(o, o.node, 0, hash);
+ }
+}
+
+function navTo(o,root,hash,relpath)
+{
+ var link = cachedLink();
+ if (link) {
+ var parts = link.split('#');
+ root = parts[0];
+ if (parts.length>1) hash = '#'+parts[1];
+ else hash='';
+ }
+ if (hash.match(/^#l\d+$/)) {
+ var anchor=$('a[name='+hash.substring(1)+']');
+ glowEffect(anchor.parent(),1000); // line number
+ hash=''; // strip line number anchors
+ //root=root.replace(/_source\./,'.'); // source link to doc link
+ }
+ var url=root+hash;
+ var i=-1;
+ while (NAVTREEINDEX[i+1]<=url) i++;
+ if (i==-1) { i=0; root=NAVTREE[0][1]; } // fallback: show index
+ if (navTreeSubIndices[i]) {
+ gotoNode(o,i,root,hash,relpath)
+ } else {
+ getScript(relpath+'navtreeindex'+i,function(){
+ navTreeSubIndices[i] = eval('NAVTREEINDEX'+i);
+ if (navTreeSubIndices[i]) {
+ gotoNode(o,i,root,hash,relpath);
+ }
+ },true);
+ }
+}
+
+function showSyncOff(n,relpath)
+{
+ n.html('<img src="'+relpath+'sync_off.png" title="'+SYNCOFFMSG+'"/>');
+}
+
+function showSyncOn(n,relpath)
+{
+ n.html('<img src="'+relpath+'sync_on.png" title="'+SYNCONMSG+'"/>');
+}
+
+function toggleSyncButton(relpath)
+{
+ var navSync = $('#nav-sync');
+ if (navSync.hasClass('sync')) {
+ navSync.removeClass('sync');
+ showSyncOff(navSync,relpath);
+ storeLink(stripPath2($(location).attr('pathname'))+$(location).attr('hash'));
+ } else {
+ navSync.addClass('sync');
+ showSyncOn(navSync,relpath);
+ deleteLink();
+ }
+}
+
+function initNavTree(toroot,relpath)
+{
+ var o = new Object();
+ o.toroot = toroot;
+ o.node = new Object();
+ o.node.li = document.getElementById("nav-tree-contents");
+ o.node.childrenData = NAVTREE;
+ o.node.children = new Array();
+ o.node.childrenUL = document.createElement("ul");
+ o.node.getChildrenUL = function() { return o.node.childrenUL; };
+ o.node.li.appendChild(o.node.childrenUL);
+ o.node.depth = 0;
+ o.node.relpath = relpath;
+ o.node.expanded = false;
+ o.node.isLast = true;
+ o.node.plus_img = document.createElement("img");
+ o.node.plus_img.src = relpath+"ftv2pnode.png";
+ o.node.plus_img.width = 16;
+ o.node.plus_img.height = 22;
+
+ if (localStorageSupported()) {
+ var navSync = $('#nav-sync');
+ if (cachedLink()) {
+ showSyncOff(navSync,relpath);
+ navSync.removeClass('sync');
+ } else {
+ showSyncOn(navSync,relpath);
+ }
+ navSync.click(function(){ toggleSyncButton(relpath); });
+ }
+
+ navTo(o,toroot,window.location.hash,relpath);
+
+ $(window).bind('hashchange', function(){
+ if (window.location.hash && window.location.hash.length>1){
+ var a;
+ if ($(location).attr('hash')){
+ var clslink=stripPath($(location).attr('pathname'))+':'+
+ $(location).attr('hash').substring(1);
+ a=$('.item a[class$="'+clslink+'"]');
+ }
+ if (a==null || !$(a).parent().parent().hasClass('selected')){
+ $('.item').removeClass('selected');
+ $('.item').removeAttr('id');
+ }
+ var link=stripPath2($(location).attr('pathname'));
+ navTo(o,link,$(location).attr('hash'),relpath);
+ } else if (!animationInProgress) {
+ $('#doc-content').scrollTop(0);
+ $('.item').removeClass('selected');
+ $('.item').removeAttr('id');
+ navTo(o,toroot,window.location.hash,relpath);
+ }
+ })
+
+ $(window).load(showRoot);
+}
+
diff --git a/doc/html/navtreeindex0.js b/doc/html/navtreeindex0.js
new file mode 100644
index 000000000..e34df5c36
--- /dev/null
+++ b/doc/html/navtreeindex0.js
@@ -0,0 +1,253 @@
+var NAVTREEINDEX0 =
+{
+"BaseObject_8php.html":[5,0,0,8],
+"Contact_8php.html":[5,0,0,17],
+"Contact_8php.html#a024919623a830e8703ac4f23496dd66c":[5,0,0,17,2],
+"Contact_8php.html#a186162051a5127069cc851d78740f205":[5,0,0,17,4],
+"Contact_8php.html#a28e062c884331dbb5dfa713228c25ad6":[5,0,0,17,8],
+"Contact_8php.html#a2f4f495d53f2a334ab75292af79d3c91":[5,0,0,17,10],
+"Contact_8php.html#a2fc191067dd571a79603c66b04b1ca15":[5,0,0,17,13],
+"Contact_8php.html#a38daa1c210b78385307123450ca9a1fc":[5,0,0,17,12],
+"Contact_8php.html#a3a0844dac1e86d523de5d2f432cfeebc":[5,0,0,17,6],
+"Contact_8php.html#a483cda56f9e37c3a4a8773dcdfeb0258":[5,0,0,17,5],
+"Contact_8php.html#a6348a532c9d26cd1c9afbc9aa6aa8960":[5,0,0,17,14],
+"Contact_8php.html#a6e64de7db60b7243dce45fb6347636ff":[5,0,0,17,3],
+"Contact_8php.html#a852fa476f0c70bde10a4f2533aec5f71":[5,0,0,17,9],
+"Contact_8php.html#a87e699f74a1102b25e8aa0432d86a91e":[5,0,0,17,7],
+"Contact_8php.html#acc12cda999c88c4d6185cca967c15125":[5,0,0,17,11],
+"Contact_8php.html#ad5b02c2a962ee55b1b7ca6c159d6e4c5":[5,0,0,17,1],
+"Contact_8php.html#ae8803c330352cbf1e828eb7490edf47e":[5,0,0,17,0],
+"ConversationObject_8php.html":[5,0,0,21],
+"ITemplateEngine_8php.html":[5,0,0,40],
+"ItemObject_8php.html":[5,0,0,39],
+"ProtoDriver_8php.html":[5,0,0,59],
+"__well__known_8php.html":[5,0,1,0],
+"__well__known_8php.html#a6ebfa937a2024f0b5dab53f0ac90fed0":[5,0,1,0,0],
+"account_8php.html":[5,0,0,2],
+"account_8php.html#a014de2d5d5c9785de5bf547a485822fa":[5,0,0,2,6],
+"account_8php.html#a141fe579c351c78209d425473f978eb5":[5,0,0,2,5],
+"account_8php.html#a144b4891022567668375b58ea61cfff0":[5,0,0,2,4],
+"account_8php.html#a43e3042b2723d76915a030bac3c668b6":[5,0,0,2,0],
+"account_8php.html#a917d74aad0baf3e0c4b51cf1051e654f":[5,0,0,2,1],
+"account_8php.html#aa9c29c497c17d8f9344dce8631ad8761":[5,0,0,2,7],
+"account_8php.html#aaff7720423417a4333697894ffd9ddeb":[5,0,0,2,3],
+"account_8php.html#ac1653efba62493b9d87513e1b6c04c83":[5,0,0,2,9],
+"account_8php.html#ac5c570a2d46446bad4dd2501e9c5a4b1":[5,0,0,2,8],
+"account_8php.html#ae052bd5558847bd38e89c213561a9771":[5,0,0,2,2],
+"achievements_8php.html":[5,0,1,1],
+"achievements_8php.html#a35ae04ada0e227d19671f289a32fb30e":[5,0,1,1,0],
+"acl_8php.html":[5,0,1,2],
+"acl_8php.html#a57dceff370d4a0e7ae673d50fbfda61f":[5,0,1,2,1],
+"acl_8php.html#ac6776dba871806ecdb5d1659bc2eb07a":[5,0,1,2,0],
+"acl__selectors_8php.html":[5,0,0,3],
+"acl__selectors_8php.html#a7b5446e999636ceceea65c154d865a31":[5,0,0,3,3],
+"acl__selectors_8php.html#a9476997d2968a5794f3723878ed89c91":[5,0,0,3,0],
+"acl__selectors_8php.html#aa1e3bc344ca2b29f97eb9860216d21a0":[5,0,0,3,2],
+"acl__selectors_8php.html#ad6664fb8330308e23f2645cd6624727e":[5,0,0,3,1],
+"activities_8php.html":[5,0,0,4],
+"activities_8php.html#a80134e807719b3c54aba971958d2e132":[5,0,0,4,0],
+"admin_8php.html":[5,0,1,3],
+"admin_8php.html#a1d1362698af14d209aa3a0fb655551dd":[5,0,1,3,4],
+"admin_8php.html#a233b7c8c31776b7020532003c6e44e1c":[5,0,1,3,5],
+"admin_8php.html#a54128076986ba80c4a103de3fc3e19a8":[5,0,1,3,6],
+"admin_8php.html#a5a696706a3869800e65fb365214241b7":[5,0,1,3,12],
+"admin_8php.html#a60ba9783ad14545814919970bc3fb725":[5,0,1,3,3],
+"admin_8php.html#a62f10f90c47686c9c3c37c4c03a108d2":[5,0,1,3,11],
+"admin_8php.html#a6943543f3138f6ee182cb701f415d1cc":[5,0,1,3,2],
+"admin_8php.html#aaa6addf2dbc3f3fcf99244a56b41eade":[5,0,1,3,1],
+"admin_8php.html#ac0f3bd12431c056aad77bac9d09fa30e":[5,0,1,3,7],
+"admin_8php.html#ac6e95b920b5abd030cc522964987087a":[5,0,1,3,9],
+"admin_8php.html#acf51f5837a7427832144c2bf7308ada3":[5,0,1,3,13],
+"admin_8php.html#ad4f74f33944a98b56d2c8c7601f124a4":[5,0,1,3,15],
+"admin_8php.html#add865f4ae806ecbf716f423fc3e50e4f":[5,0,1,3,8],
+"admin_8php.html#ae46311a3fefc21abc838a26e91789de6":[5,0,1,3,14],
+"admin_8php.html#af124619fdc278fe2bf14c45ddaa260fb":[5,0,1,3,10],
+"admin_8php.html#af81f081851791cd15e49e8ff6722dc27":[5,0,1,3,16],
+"admin_8php.html#afef415e4011607fbb665610441595015":[5,0,1,3,0],
+"annotated.html":[4,0],
+"apps_8php.html":[5,0,1,5],
+"apps_8php.html#a546016cb960d0b110ee8e489dfa6c27c":[5,0,1,5,0],
+"apw_2php_2style_8php.html":[5,0,3,1,0,0,1],
+"apw_2php_2style_8php.html#a109bbd7f4add27541707b191b73ef84a":[5,0,3,1,0,0,1,0],
+"apw_2php_2style_8php.html#a883f9f14e205f7aa7de02c14df67b40a":[5,0,3,1,0,0,1,1],
+"apw_2php_2theme_8php.html":[5,0,3,1,0,0,2],
+"apw_2php_2theme_8php.html#a42167c539043a39a6b83c252d05f1e89":[5,0,3,1,0,0,2,0],
+"auth_8php.html":[5,0,0,7],
+"auth_8php.html#a07bae0e623e2daa9ee2cd5a8aa294dee":[5,0,0,7,0],
+"auth_8php.html#a0950af7c2888ca1d4743fe5d0bff9ae5":[5,0,0,7,2],
+"auth_8php.html#a2add3a1129ffa4d5515442a9d52a9b1a":[5,0,0,7,1],
+"bb2diaspora_8php.html":[5,0,0,9],
+"bb2diaspora_8php.html#a180b0e3a7d702998be19e3c3b44b0e93":[5,0,0,9,7],
+"bb2diaspora_8php.html#a26c09c218413610e62e60754c579f6c6":[5,0,0,9,2],
+"bb2diaspora_8php.html#a29a2ad41f5826f3975fa9a49934ff863":[5,0,0,9,5],
+"bb2diaspora_8php.html#a4c2f8f11b29a06809d9b07782215b1b2":[5,0,0,9,6],
+"bb2diaspora_8php.html#a4f10e0876b27373c762bc1abbe745f5c":[5,0,0,9,0],
+"bb2diaspora_8php.html#a599428bceb6f6d82a6a78cb66811f747":[5,0,0,9,8],
+"bb2diaspora_8php.html#a8b96bd45884fa1c40b942939354197d4":[5,0,0,9,3],
+"bb2diaspora_8php.html#ad0abe1a7ee50aa0736a233df0a422eba":[5,0,0,9,1],
+"bb2diaspora_8php.html#adc92ccda5f85ed27e64fcc17712c89cc":[5,0,0,9,4],
+"bbcode_8php.html":[5,0,0,10],
+"bbcode_8php.html#a009f61aaf78771737ed0765c8463911b":[5,0,0,10,6],
+"bbcode_8php.html#a064dcfd9767df6f53be1a0e11ceeb15d":[5,0,0,10,5],
+"bbcode_8php.html#a1c69e021d5e0aef97d6966bf3169c86a":[5,0,0,10,2],
+"bbcode_8php.html#a2be26414a367118143cc89e2d58e7377":[5,0,0,10,3],
+"bbcode_8php.html#a5165a5221a52cf1bc1d7812ebd2069c7":[5,0,0,10,7],
+"bbcode_8php.html#a55b0cb6973f1ec731de0e726bcc0efa7":[5,0,0,10,8],
+"bbcode_8php.html#a851f5aafefe52474201b83f9fd65931f":[5,0,0,10,0],
+"bbcode_8php.html#a8911e027907820df3db03b4f76724b50":[5,0,0,10,4],
+"bbcode_8php.html#a98d0eecc620c19561639f06cfbe8e74c":[5,0,0,10,1],
+"blocks_8php.html":[5,0,1,7],
+"blocks_8php.html#a2531a8fd51db3cecb2eb20c002c66e12":[5,0,1,7,0],
+"blogga_2php_2theme_8php.html":[5,0,3,1,1,0,2],
+"blogga_2php_2theme_8php.html#aa55c1cb1f05087b5002ecb633b550b1b":[5,0,3,1,1,0,2,0],
+"blogga_2view_2theme_2blog_2theme_8php.html":[5,0,3,1,1,1,0,0,2],
+"blogga_2view_2theme_2blog_2theme_8php.html#a028ae8e9f2824670dfa76a6651d817e5":[5,0,3,1,1,1,0,0,2,3],
+"blogga_2view_2theme_2blog_2theme_8php.html#a3e77dbe111f330c64a1ff6c741cd515c":[5,0,3,1,1,1,0,0,2,2],
+"blogga_2view_2theme_2blog_2theme_8php.html#aa55c1cb1f05087b5002ecb633b550b1b":[5,0,3,1,1,1,0,0,2,0],
+"blogga_2view_2theme_2blog_2theme_8php.html#aae58cc837fe56473d9f3370abfe533ae":[5,0,3,1,1,1,0,0,2,1],
+"blogga_2view_2theme_2blog_2theme_8php.html#af634a3f721c5e238530d0636d33230ec":[5,0,3,1,1,1,0,0,2,4],
+"boot_8php.html":[5,0,4],
+"boot_8php.html#a009e6a0637cb65804ea8094ecc4450b0":[5,0,4,130],
+"boot_8php.html#a01353c9abebc3544ea080ac161729632":[5,0,4,34],
+"boot_8php.html#a022cea669f9f13ef7c6268b63884c57f":[5,0,4,144],
+"boot_8php.html#a02566ac9d891369a1d3ebb81a15722fc":[5,0,4,239],
+"boot_8php.html#a032bbd6d0321e99e9117332c9ed2b1b8":[5,0,4,50],
+"boot_8php.html#a03d19251c245587de7ed959300b87bdf":[5,0,4,160],
+"boot_8php.html#a0450389f24c632906fbc24347700a543":[5,0,4,42],
+"boot_8php.html#a0603d6ece8c5d37b4b7db697db053a4b":[5,0,4,99],
+"boot_8php.html#a081307d681d7d04f17b9ced2076e7c85":[5,0,4,1],
+"boot_8php.html#a09532c3f750ae8c4527e63b2b790cbf3":[5,0,4,199],
+"boot_8php.html#a0a98dd0110dc6c8e24cefc8ae74d5562":[5,0,4,64],
+"boot_8php.html#a0b73e2548d6f9beb9c93211f488e336a":[5,0,4,164],
+"boot_8php.html#a0c59dde058efebbc66520d136cbd1631":[5,0,4,256],
+"boot_8php.html#a0cc8dc76bd10ac0ec81bac08a46f82fe":[5,0,4,252],
+"boot_8php.html#a0d877df1e20bae765e1708be50f6b503":[5,0,4,255],
+"boot_8php.html#a0e4701c9742c3ef88f02ac450a042a84":[5,0,4,21],
+"boot_8php.html#a0e57f846e6d47a308feced0f7274f178":[5,0,4,56],
+"boot_8php.html#a0e6db7e365f2b041a828b93786f694bc":[5,0,4,15],
+"boot_8php.html#a0fb63e51c2a9814941842ae8f2f4dff8":[5,0,4,74],
+"boot_8php.html#a12c781cefc20167231e2e3fd5866b1b5":[5,0,4,78],
+"boot_8php.html#a14ba8f9e162f2559831ee3bf98e0c3bd":[5,0,4,75],
+"boot_8php.html#a14d44d4a00223dc3db4ea962325db192":[5,0,4,190],
+"boot_8php.html#a176664e78dcb9132e16be69418223eb2":[5,0,4,59],
+"boot_8php.html#a17b4ea23d9ecf628d9c8f53b7abcb805":[5,0,4,143],
+"boot_8php.html#a17cf72338b040891781a4bcbdd9a8595":[5,0,4,139],
+"boot_8php.html#a181c111f4b6c14d091dfd3bf0d0a22cd":[5,0,4,163],
+"boot_8php.html#a18a400fa45e5632811b33041d8c048bf":[5,0,4,133],
+"boot_8php.html#a1af3ed96de14aa0d7891b39cc75b60f2":[5,0,4,263],
+"boot_8php.html#a1ba00027b718db732f30fc0e2c3e0abc":[5,0,4,233],
+"boot_8php.html#a1c923b99bf77e4203ae94e5684b6ad0f":[5,0,4,265],
+"boot_8php.html#a1d6e7f4c08bb68e4a424326a811bdd86":[5,0,4,167],
+"boot_8php.html#a1da180f961f49a11573cac4ff6c62c05":[5,0,4,73],
+"boot_8php.html#a1db4f0009c9cb4e107eab0f914a3c8dc":[5,0,4,212],
+"boot_8php.html#a1f5906598e90b5ea2b4245f682be4348":[5,0,4,101],
+"boot_8php.html#a1fbb93cf030f07391f22cc2948744869":[5,0,4,150],
+"boot_8php.html#a20f0eed431d25870b624b8937a07a59f":[5,0,4,183],
+"boot_8php.html#a21cc29e0025943e7c28ff58cb4856ac3":[5,0,4,235],
+"boot_8php.html#a222395aa223cfbff6166fab0b4e2e1d5":[5,0,4,37],
+"boot_8php.html#a24a7a70afedd5d85fe0eadc85afa9f77":[5,0,4,20],
+"boot_8php.html#a25476eec71fceda237f7dc1d78b0adb8":[5,0,4,97],
+"boot_8php.html#a27299ecfb9e9a99826f17a1c14c6995f":[5,0,4,89],
+"boot_8php.html#a2750985ec445617d7e82ae3098c91e3f":[5,0,4,245],
+"boot_8php.html#a285732e7889fa7f333cbe431111e1029":[5,0,4,186],
+"boot_8php.html#a29528a2544373cc19a378f350040c6a1":[5,0,4,80],
+"boot_8php.html#a2958a2bd5422b85329d7c36c06dbc221":[5,0,4,125],
+"boot_8php.html#a29e921c0c72412cc738e44cca6ca1f62":[5,0,4,210],
+"boot_8php.html#a2af173e4e9836ee7c90757b4793a2be3":[5,0,4,102],
+"boot_8php.html#a2b525996e4426bdddbcec277778bde08":[5,0,4,231],
+"boot_8php.html#a2c65e925994566a63e6c03c381f1b4a0":[5,0,4,182],
+"boot_8php.html#a2c8906f1af94a3559a5b4661067bb79d":[5,0,4,122],
+"boot_8php.html#a2e90096fede6acce16abf0da8cb2febe":[5,0,4,65],
+"boot_8php.html#a2f8f25b13480c37a5f22511f53da8bab":[5,0,4,70],
+"boot_8php.html#a32df13fec0e43281da5979e1f5579aa8":[5,0,4,217],
+"boot_8php.html#a3475ff6c2e575f946ea0ee377e944173":[5,0,4,137],
+"boot_8php.html#a34c756469ebed32e2fc987bcde62d382":[5,0,4,39],
+"boot_8php.html#a3515ea6bf77495de89b93e9ccd881c49":[5,0,4,115],
+"boot_8php.html#a35625dacd2158b9f1f1a8e77f9f081fd":[5,0,4,152],
+"boot_8php.html#a36b31575f992a10b5927b76efba9362e":[5,0,4,269],
+"boot_8php.html#a38f6c7fe33b5434a24b4314567753dfa":[5,0,4,171],
+"boot_8php.html#a3ad9cc5d4354be741fa1de12b96e9955":[5,0,4,104],
+"boot_8php.html#a3b56bfc6a0dd159070e316ddac3b7456":[5,0,4,109],
+"boot_8php.html#a3cd42a70c6b3999590e4fd7a1a9096af":[5,0,4,268],
+"boot_8php.html#a3d6d4fc5fafcc9156811669158541caf":[5,0,4,208],
+"boot_8php.html#a3e0930933fb2c0bf8211cc7ab4e1c3b4":[5,0,4,12],
+"boot_8php.html#a3e2ea123d29a72012db1241f96280b0e":[5,0,4,57],
+"boot_8php.html#a3f40aa5bafff8c4eebdc62e5121daf77":[5,0,4,87],
+"boot_8php.html#a400519fa181591cd6fdbb8f25fbcba0a":[5,0,4,48],
+"boot_8php.html#a40d885b2cfd736aab4234ae641ca4dfb":[5,0,4,126],
+"boot_8php.html#a423505ab8dbd8e39d04ae3fe1374102b":[5,0,4,203],
+"boot_8php.html#a43296b1b4398aacbf92a4b2d56bab91e":[5,0,4,181],
+"boot_8php.html#a43c6c7d84d880e9500bd4f8f8ecc5731":[5,0,4,86],
+"boot_8php.html#a444ce608ce34efb82ee11852f36e825f":[5,0,4,157],
+"boot_8php.html#a44ae1542a805ffd7f826fb511db07374":[5,0,4,147],
+"boot_8php.html#a44d069c8a1cfcc6d2007c506a17ff28f":[5,0,4,68],
+"boot_8php.html#a45b12aefab9675baffc7a07a09486db8":[5,0,4,253],
+"boot_8php.html#a49f2a70b3b43aa904223a8d19e986a47":[5,0,4,169],
+"boot_8php.html#a4a12ce5de39789b0361e308d89925a20":[5,0,4,100],
+"boot_8php.html#a4a49b29838ef2c45ab3556b52baec6a4":[5,0,4,225],
+"boot_8php.html#a4bfe22e163657690dfb6d5b1d04cb47e":[5,0,4,168],
+"boot_8php.html#a4c02d88e66852a01bd5a1feecb7c3ce3":[5,0,4,6],
+"boot_8php.html#a4edce16cb7f21cdafa1e85bf63d713e6":[5,0,4,201],
+"boot_8php.html#a4fefd7486d3b888a05cfd3dc9575f115":[5,0,4,221],
+"boot_8php.html#a505410c7edc5f5bb5fa227b98359793e":[5,0,4,193],
+"boot_8php.html#a525ca93ff35d3535d1a2b8ba57876afa":[5,0,4,151],
+"boot_8php.html#a52b599cd13e152ebc80d7e4413683195":[5,0,4,38],
+"boot_8php.html#a53e4bdb6f225da55115acb9277f75e53":[5,0,4,79],
+"boot_8php.html#a5542c5c2806ab8bca04bad53d47b5209":[5,0,4,31],
+"boot_8php.html#a56fd673eaa7014150297ce1162502db5":[5,0,4,185],
+"boot_8php.html#a57eee7352714c004d36c26dda74af73e":[5,0,4,220],
+"boot_8php.html#a5a681a672e007cdc22b43345d71f07c6":[5,0,4,266],
+"boot_8php.html#a5ab6181607a090bcdbaa13b15b85aba1":[5,0,4,19],
+"boot_8php.html#a5ae728ac966ea1d3525a19e7fec59434":[5,0,4,58],
+"boot_8php.html#a5b043b7fdcfd4e8c9c3747574afc6caa":[5,0,4,175],
+"boot_8php.html#a5b8484922918946d041e5e0515dbe718":[5,0,4,197],
+"boot_8php.html#a5c3747e0f505f0d5271dc4c54e3feaf4":[5,0,4,76],
+"boot_8php.html#a5df5359090d1f8e898c36d7cf8878ad2":[5,0,4,155],
+"boot_8php.html#a5e322a2a2d0f51924c0b2e874988e640":[5,0,4,198],
+"boot_8php.html#a623e49c79943f3e7bdb770d021683cf7":[5,0,4,18],
+"boot_8php.html#a62c832a95e38b1fa23e6cef39521b7d5":[5,0,4,72],
+"boot_8php.html#a64617d4655804de2a3c86501ab4fdbfd":[5,0,4,249],
+"boot_8php.html#a6626f383c3d2d459f731ab8b4f237d16":[5,0,4,161],
+"boot_8php.html#a6788e99021ec8ffb0fa94d651f22a322":[5,0,4,135],
+"boot_8php.html#a68d1d5bc9c7ccb663dc671b48c66df11":[5,0,4,138],
+"boot_8php.html#a68eebe493e6f729ffd1aeda7a4b11155":[5,0,4,41],
+"boot_8php.html#a6969947145a139ec374ce098224d8e81":[5,0,4,141],
+"boot_8php.html#a69aac276ed82e010dc382b16ab4d59e1":[5,0,4,237],
+"boot_8php.html#a6b14a31a8aa9f3452a13383f413bffa2":[5,0,4,224],
+"boot_8php.html#a6b31dd451bc6c37fe7c9c766ff385aaf":[5,0,4,218],
+"boot_8php.html#a6b9909db6a7ec80ec6fdd40ba74014dd":[5,0,4,98],
+"boot_8php.html#a6c5e9e293c8242dcb9bc2c3ea2fee2c9":[5,0,4,90],
+"boot_8php.html#a6df1102664f64b274810db85197c2755":[5,0,4,206],
+"boot_8php.html#a6e57d913634d033b4d5ad72d99fd3e9d":[5,0,4,124],
+"boot_8php.html#a6ee7a72d558d1851bbb9e3cdde377932":[5,0,4,202],
+"boot_8php.html#a7176c0f9f1c98421b97735d892cf6252":[5,0,4,236],
+"boot_8php.html#a719c7f3972d5f9268f37a41c76cd4ef6":[5,0,4,26],
+"boot_8php.html#a7236b2cdcf59f02a42302e893a99013b":[5,0,4,176],
+"boot_8php.html#a749144d8dd9c1366596a0213c277d050":[5,0,4,128],
+"boot_8php.html#a74bf27f7564c9a37975e7b37d973dcab":[5,0,4,69],
+"boot_8php.html#a75a90b0eadd0df510f7e63210733634d":[5,0,4,2],
+"boot_8php.html#a75fc600186b13c3b25e661afefb5eac8":[5,0,4,257],
+"boot_8php.html#a768f00b7d66be0daf7ef4eea2e862006":[5,0,4,4],
+"boot_8php.html#a774f0f792ebfec1e774c5a17bb9d5966":[5,0,4,71],
+"boot_8php.html#a781916f83fcc8ff1035649afa45f0292":[5,0,4,84],
+"boot_8php.html#a78849a1bf8ce8d9804b4cbb502e8f383":[5,0,4,227],
+"boot_8php.html#a7a8ba64d089cc0412c59a2eefc6d655c":[5,0,4,110],
+"boot_8php.html#a7aa57438db03834aaa0b468bdce773a6":[5,0,4,62],
+"boot_8php.html#a7af107fab8d62b9a73801713b774ed30":[5,0,4,127],
+"boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133":[5,0,4,156],
+"boot_8php.html#a7bff2278e68a71e524afd1c7c951e1e3":[5,0,4,66],
+"boot_8php.html#a7c286add8961fd2d79216314cd4aadd8":[5,0,4,103],
+"boot_8php.html#a7c2eb822d50e1554bf5c32861f36342b":[5,0,4,54],
+"boot_8php.html#a7ed4581ab66ebcde97f6b3730856b028":[5,0,4,158],
+"boot_8php.html#a7f3474fec541e261fc8dff47313c4017":[5,0,4,45],
+"boot_8php.html#a7f4264232dbb6c3b41f2617deecb1866":[5,0,4,81],
+"boot_8php.html#a7fc4b291a7cdaa48b38e27344ea183cf":[5,0,4,113],
+"boot_8php.html#a8231d115060d41a9c2a677f2c86f10ed":[5,0,4,195],
+"boot_8php.html#a84057c5bfa1bca5fba8497fe005ee4d8":[5,0,4,49],
+"boot_8php.html#a845891f82bf6edd7fa2d578b66703112":[5,0,4,107],
+"boot_8php.html#a84f48897059bbd4a8738d7ee4cec6688":[5,0,4,53],
+"boot_8php.html#a8663f32171568489dbb2a01dd00371f8":[5,0,4,120],
+"boot_8php.html#a87b0f279f8413c7e4d805c5d85f20d34":[5,0,4,112],
+"boot_8php.html#a882b666adfe21f035a0f8c02806066d6":[5,0,4,248],
+"boot_8php.html#a8892374789fd261eb32a7969d934a14a":[5,0,4,247]
+};
diff --git a/doc/html/navtreeindex1.js b/doc/html/navtreeindex1.js
new file mode 100644
index 000000000..bcf2bacaf
--- /dev/null
+++ b/doc/html/navtreeindex1.js
@@ -0,0 +1,253 @@
+var NAVTREEINDEX1 =
+{
+"boot_8php.html#a8905fde0a5b7882bdc083b20d9b34701":[5,0,4,174],
+"boot_8php.html#a899d24fd074594ceebbf72e1feff335f":[5,0,4,16],
+"boot_8php.html#a8a60cc38bb567765fd926fef70205f16":[5,0,4,95],
+"boot_8php.html#a8bb0395933b5e886f086f6a2fb0bfa55":[5,0,4,222],
+"boot_8php.html#a8c9dce0ef27b35397e29298eb966f7f7":[5,0,4,123],
+"boot_8php.html#a8da836617174eed9fc2ac8054125354b":[5,0,4,117],
+"boot_8php.html#a8df201788c9dd0ca91384e3a14c08bce":[5,0,4,229],
+"boot_8php.html#a8fdcc4ffb365a3267bd02ce8a8d466d6":[5,0,4,264],
+"boot_8php.html#a9255af5ae9c887520091ea04763c1a88":[5,0,4,29],
+"boot_8php.html#a926cad0b3d8b9d9ee5da1898fc063ba3":[5,0,4,11],
+"boot_8php.html#a93823d15ae07548a4c49de88d325cd26":[5,0,4,142],
+"boot_8php.html#a939de9a99278f4fd7dcd0ee67f243f08":[5,0,4,121],
+"boot_8php.html#a949116d9a295b214293006c060ca4848":[5,0,4,119],
+"boot_8php.html#a9690d73434125ce594a1f5e7c2a4f7c0":[5,0,4,259],
+"boot_8php.html#a96ad56755a21e1361dbd7bf93c9e7ff4":[5,0,4,234],
+"boot_8php.html#a97769915c9f14adc4f8ab1ea2cecfd90":[5,0,4,17],
+"boot_8php.html#a981d46380f9f23c308bac1f9cb00dc5b":[5,0,4,188],
+"boot_8php.html#a99a4a17cb644e7e6826ea07ecaf09777":[5,0,4,223],
+"boot_8php.html#a9c80420e5a063a4a87ce4831f086134d":[5,0,4,44],
+"boot_8php.html#a9cbab4ee728e9a8b4ce952bae643044e":[5,0,4,5],
+"boot_8php.html#a9cc986b4f9dd6558cbb2e25aadbfd964":[5,0,4,215],
+"boot_8php.html#a9d01ef178b72b145016cca1393415bc4":[5,0,4,189],
+"boot_8php.html#a9ea1290e00c6d40684892047f2c778a9":[5,0,4,262],
+"boot_8php.html#a9eeb8989272d5ff804a616898bb13659":[5,0,4,250],
+"boot_8php.html#a9ff652e5cb83cd11cbb0350844e7b28f":[5,0,4,214],
+"boot_8php.html#aa17a4f9c63f5cbc5c06f1066b6aebc42":[5,0,4,177],
+"boot_8php.html#aa1e828bbbcba170265eb2668d8daf42e":[5,0,4,24],
+"boot_8php.html#aa275653b9c87abc7391bb8040c1c2de9":[5,0,4,196],
+"boot_8php.html#aa3425e2de85b08f7041656d3a8502cb6":[5,0,4,40],
+"boot_8php.html#aa3679df31c8dad1b71816b0322d5baff":[5,0,4,149],
+"boot_8php.html#aa4221641e5c21db69fa52c426b9017f5":[5,0,4,9],
+"boot_8php.html#aa544a6c078130d0967a1f4ed8ce0a2d2":[5,0,4,146],
+"boot_8php.html#aa589421267f0c2f0d643f727792cce35":[5,0,4,106],
+"boot_8php.html#aa74438cf71e48e37bf7b440b94243985":[5,0,4,83],
+"boot_8php.html#aa8a2b61e70900139d1ca28e46f1da49d":[5,0,4,92],
+"boot_8php.html#aa9244fc9cc221980c07a20cc534111be":[5,0,4,219],
+"boot_8php.html#aad33b494084f729b6ee3b0bc457718a1":[5,0,4,132],
+"boot_8php.html#aae6c941bde5fd6fce07e51dba7326ead":[5,0,4,204],
+"boot_8php.html#aaf9b76832ee5f85e56466af162ba8a14":[5,0,4,63],
+"boot_8php.html#ab21fb0f3e6b962419955c6fc7f26734f":[5,0,4,180],
+"boot_8php.html#ab28dc518fa90b6f617dd8c564eb4f35f":[5,0,4,111],
+"boot_8php.html#ab2d0e8a9b81ee548ef2ce8e4560da2f6":[5,0,4,205],
+"boot_8php.html#ab346a2ece14993861f3e4206befa94f0":[5,0,4,30],
+"boot_8php.html#ab3920c2f3cd64802c0b7ff625c3b2ea8":[5,0,4,200],
+"boot_8php.html#ab4bc9c50ecc927b92d519e36562b0df0":[5,0,4,226],
+"boot_8php.html#ab4bddb41a0cf407178ec5278b950c393":[5,0,4,173],
+"boot_8php.html#ab51965fabe54dc031e9a0ce1142ee83e":[5,0,4,209],
+"boot_8php.html#ab54b24cc302e1a42a67a49d788b6b764":[5,0,4,105],
+"boot_8php.html#ab55b16ae7fc19fafe5afaedd49163bbf":[5,0,4,134],
+"boot_8php.html#ab5ddbe69d3d03acd06e1fb281488cb78":[5,0,4,51],
+"boot_8php.html#ab724491497ab2618b23a01d5da60aec0":[5,0,4,191],
+"boot_8php.html#ab79b8b4555cae20d03f8200666d89d63":[5,0,4,7],
+"boot_8php.html#ab7d65a7e7417825a4db62906bb600729":[5,0,4,94],
+"boot_8php.html#aba208673515cbb8a55e5fa4a1da99fda":[5,0,4,35],
+"boot_8php.html#abbf5ac24eb8aeedb862f618ee0d21e86":[5,0,4,230],
+"boot_8php.html#abc0a90a1a77f5b668aa7e4b57d1776a7":[5,0,4,3],
+"boot_8php.html#abd7bb40da9cc073297e49736b338ca07":[5,0,4,254],
+"boot_8php.html#abdcdfc873ace4e0902177bad934de0c0":[5,0,4,61],
+"boot_8php.html#abeb4d86e17cefa8584f1244e2183b0e1":[5,0,4,108],
+"boot_8php.html#abedd940e664017c61b48c6efa31d0cb8":[5,0,4,93],
+"boot_8php.html#ac01230c7655e0705b2e99c9bc03c4450":[5,0,4,118],
+"boot_8php.html#ac17fc8a416ea79e9d5cb4dc9a8ff8c5c":[5,0,4,23],
+"boot_8php.html#ac195fc9003298923ea81f144388e24b1":[5,0,4,159],
+"boot_8php.html#ac43182e0d8bae7576a30b603774974f8":[5,0,4,228],
+"boot_8php.html#ac59a18a4838710d6c2de37aed6b21f03":[5,0,4,91],
+"boot_8php.html#ac608a34f3bc180e7724192e0fd31f9b0":[5,0,4,33],
+"boot_8php.html#ac8400313df2c831653f9036f71ebd86d":[5,0,4,52],
+"boot_8php.html#ac86615ddc0763a00f5311c90e991730c":[5,0,4,260],
+"boot_8php.html#ac890557fedc5b5a3b1d996249b1e1a20":[5,0,4,114],
+"boot_8php.html#ac99fc4d040764eac1736bec6973556fe":[5,0,4,116],
+"boot_8php.html#aca08bc4f1554ba877500f6abcc99e1e8":[5,0,4,187],
+"boot_8php.html#aca47505b8732177f52bb2d647eb2741c":[5,0,4,32],
+"boot_8php.html#aca5e42678e178c6b9034610d66666fd7":[5,0,4,13],
+"boot_8php.html#acc4e0c910af066148b810e5fde55fff1":[5,0,4,8],
+"boot_8php.html#acca19aae62e1a6951a856b945de20d67":[5,0,4,162],
+"boot_8php.html#accd6f36cc9f40225cbd720e4d12a7c6e":[5,0,4,261],
+"boot_8php.html#acd877c405b06b348b37b6f7e62a211e9":[5,0,4,216],
+"boot_8php.html#ace83842dbeb84f7ed9ac59a9f57a7c32":[5,0,4,194],
+"boot_8php.html#aced60c7285192e80b7c4757e45a7f1e3":[5,0,4,60],
+"boot_8php.html#ad0876e837cf3fad8a26417e315f6e2c8":[5,0,4,145],
+"boot_8php.html#ad11f30a6590d3d77f0c5e1e3909af8f5":[5,0,4,153],
+"boot_8php.html#ad206598b909e8eb67eb0e0bb5ef69c13":[5,0,4,10],
+"boot_8php.html#ad302cb26b838898d475f57f61b0fcc9f":[5,0,4,67],
+"boot_8php.html#ad34c1547020a305915bcc39707744690":[5,0,4,82],
+"boot_8php.html#ad4c9dc2c8a82e8f52b7404c1655eab44":[5,0,4,27],
+"boot_8php.html#ad789aef3cb95fc1eb36be7c4283d0137":[5,0,4,211],
+"boot_8php.html#ad8887b49bbb02dd30b4eb9f6c7773c63":[5,0,4,238],
+"boot_8php.html#ad88a70ec62e08d590123d3697dfe64d5":[5,0,4,232],
+"boot_8php.html#ada72d88ae39a7e3b45baea201cb49a29":[5,0,4,88],
+"boot_8php.html#adaeb4f590c56326b2dca3b19f31b6272":[5,0,4,129],
+"boot_8php.html#adca48aee78465ae3064ca4432c0d87b5":[5,0,4,241],
+"boot_8php.html#add517a0958ac684792c62142a3877f81":[5,0,4,36],
+"boot_8php.html#adfb2fc7be5a4226c0a8e24131da9d498":[5,0,4,22],
+"boot_8php.html#ae37444eaa42705185080ccf3e670cbc2":[5,0,4,246],
+"boot_8php.html#ae3cef7b63e25e7bafea3fcf6b99fad0e":[5,0,4,170],
+"boot_8php.html#ae4861de36017fe399c1839f778bad9f5":[5,0,4,148],
+"boot_8php.html#ae94f7c7c0909629a75aed1c41f10bc95":[5,0,4,178],
+"boot_8php.html#aea392cb26ed617f3a8cde648385b5df0":[5,0,4,258],
+"boot_8php.html#aea7fc57a4d8e9dcb42f2601b0b9b761c":[5,0,4,25],
+"boot_8php.html#aead84fa27d7516b855220fe004964a45":[5,0,4,251],
+"boot_8php.html#aeb1039302affcbe7e8872c01c08c88f8":[5,0,4,46],
+"boot_8php.html#aec36f8fcd4cb14a52934590b3d6666b4":[5,0,4,213],
+"boot_8php.html#aecaa1b6945b317ba8f1daf4af2aed8e6":[5,0,4,242],
+"boot_8php.html#aed0dfb35f7dd00dc9e4f868ea7f7ff53":[5,0,4,154],
+"boot_8php.html#aedfb9501ed408278667995524e0d15cf":[5,0,4,96],
+"boot_8php.html#aee324eca9de4e0fedf01ab5f92e27c67":[5,0,4,165],
+"boot_8php.html#aef4b6c558c68c88c10f13c5a00c20e3d":[5,0,4,179],
+"boot_8php.html#aefba06f1c0842036329033e7567ecf6d":[5,0,4,131],
+"boot_8php.html#aefecf8599036df7f1b95d6820e0e2fa4":[5,0,4,28],
+"boot_8php.html#af33d1b2e98a1e21af672005525d46dfe":[5,0,4,243],
+"boot_8php.html#af3905ea8f8568d0236db13fca40514e3":[5,0,4,172],
+"boot_8php.html#af3a4271630aabd8be592213f925d6a36":[5,0,4,55],
+"boot_8php.html#af3bdfc20979c16f15bb9c60446a480f9":[5,0,4,47],
+"boot_8php.html#af489d0c3166551b93e63a79ff2c9be35":[5,0,4,136],
+"boot_8php.html#af6937db5f581d006bf4a5c3d9c7e0461":[5,0,4,192],
+"boot_8php.html#af6f6f6f40139f12fc09ec47373b30919":[5,0,4,85],
+"boot_8php.html#af86c651547aa8f9e549ee40a09455549":[5,0,4,240],
+"boot_8php.html#af8c0cb0744c9a6b5d6d3baafb1f1e71d":[5,0,4,184],
+"boot_8php.html#afaf93b7026f784b113b4f8921745891e":[5,0,4,166],
+"boot_8php.html#afb97615e985a013799839b68b99018d7":[5,0,4,244],
+"boot_8php.html#afbb1fe1b2c8c730ec8e08da93b6512c4":[5,0,4,43],
+"boot_8php.html#afe084c30a1810c10442edb4fbcbc0086":[5,0,4,77],
+"boot_8php.html#afe63ae69ba55299f813766e54df06ede":[5,0,4,140],
+"boot_8php.html#afe88b920aa285982edb817a0dd44eb37":[5,0,4,14],
+"boot_8php.html#afef254290febac854c85fc698d9483a6":[5,0,4,267],
+"boot_8php.html#aff210e8403dd72368522b17fb6e5d4e7":[5,0,4,207],
+"cache_8php.html":[5,0,0,11],
+"channel_8php.html":[5,0,1,9],
+"channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1":[5,0,1,9,0],
+"channel_8php.html#ac7c8c7845741baadf87fae6bc279f3dc":[5,0,1,9,1],
+"chanview_8php.html":[5,0,1,10],
+"chanview_8php.html#a4192c6da888c8c1165851acf9ad4cb8b":[5,0,1,10,0],
+"classApp.html":[4,0,5],
+"classApp.html#a037049cba88dfc6ff94f4b5b779e3fd3":[4,0,5,56],
+"classApp.html#a050b0696118da47e8b30859ad1a2c149":[4,0,5,40],
+"classApp.html#a084e03c77686d8c13390fef3f7428a2b":[4,0,5,5],
+"classApp.html#a08bc87aff64f39fbc084e9d6545cee4d":[4,0,5,2],
+"classApp.html#a08c24d6a6fc52fcc784b0f765f13b820":[4,0,5,74],
+"classApp.html#a08f0537964d98958d218066364cff785":[4,0,5,1],
+"classApp.html#a0ce85be198e46570366cb3344f3c55b8":[4,0,5,50],
+"classApp.html#a11e24b3ed9b33ffee7dd41d110b4366d":[4,0,5,59],
+"classApp.html#a123b903dfe5d3488cc68db3471d36fd2":[4,0,5,30],
+"classApp.html#a13710907ef62554a0b4dd8a5eaa2eb11":[4,0,5,78],
+"classApp.html#a14bd4b1c29f3aff371fe5d4cb11aeea3":[4,0,5,32],
+"classApp.html#a1936f2afce0dc0d1bbed15ae1f2ee81a":[4,0,5,72],
+"classApp.html#a1a297e70b3667b83f4460aa7ed9f5d6f":[4,0,5,60],
+"classApp.html#a1ad3bb1b68439b3b7cbe630918e618d2":[4,0,5,8],
+"classApp.html#a20d1890cc16b22ba79eeb0cbf2f719f7":[4,0,5,29],
+"classApp.html#a230e975296cf164da2fee35ef720964f":[4,0,5,33],
+"classApp.html#a244b2d53b21be269aad2269d23192f95":[4,0,5,76],
+"classApp.html#a256360c9184fed6d7556e0bc0a835d7f":[4,0,5,48],
+"classApp.html#a2e82da4aecfc2017a8d1d332ca501f9f":[4,0,5,75],
+"classApp.html#a2eb832a8577dee7d40b93abdf6d1d35a":[4,0,5,12],
+"classApp.html#a330410a288f3393d53772f5e98f857ea":[4,0,5,51],
+"classApp.html#a33a8e90b60ec4438f6fbf299d0f6839c":[4,0,5,65],
+"classApp.html#a344d2b7dc2f276648d521aee4da1731c":[4,0,5,23],
+"classApp.html#a3694aa1907aa103a2adbc71f926f0fa0":[4,0,5,55],
+"classApp.html#a3d84af5e42082098672531cd1a618853":[4,0,5,22],
+"classApp.html#a4659785d13e4bac0bed50dbb1b0d4299":[4,0,5,6],
+"classApp.html#a4776d9322edea17fae56afa5d01a323e":[4,0,5,24],
+"classApp.html#a4833bee2eae4ad1691a04fa19e11a766":[4,0,5,89],
+"classApp.html#a487332f8de40414ca1a54a4265570b70":[4,0,5,84],
+"classApp.html#a495ec082c2719314e536070ca1ce073d":[4,0,5,42],
+"classApp.html#a4b67935096f66d1f14b657399a8461ac":[4,0,5,67],
+"classApp.html#a4bdd7bfed62f50515fce652127bf481b":[4,0,5,25],
+"classApp.html#a4c7cfc62d39508086cf300dc2e39c4df":[4,0,5,58],
+"classApp.html#a4ffe529fb14389f7fedf5fdc5f722e7f":[4,0,5,66],
+"classApp.html#a5293a8543ba338dcf38cd4ff3bc5d4be":[4,0,5,9],
+"classApp.html#a557d7b779d8259027f4724ebf7b248dc":[4,0,5,28],
+"classApp.html#a560189f048d3db2f526841963cc43e97":[4,0,5,26],
+"classApp.html#a56b1a432c96aef8b1971f779c9d93c8c":[4,0,5,87],
+"classApp.html#a57d041fcc003d08c127dfa99a02bc192":[4,0,5,73],
+"classApp.html#a58ac598544892ff7c32890291b72635e":[4,0,5,61],
+"classApp.html#a59dd4b665c70e7dbd80682c014ff7145":[4,0,5,62],
+"classApp.html#a5c63eabdc7fdd8b6e3348980ec16a3ad":[4,0,5,3],
+"classApp.html#a5cfc098c061b7d765add58fd2ca97445":[4,0,5,39],
+"classApp.html#a5f64620473a9727a48ebe9cf6f335a98":[4,0,5,79],
+"classApp.html#a604d659d6977a99de42a160343e5289a":[4,0,5,4],
+"classApp.html#a61ca6e3af82071ea25ff2fd5dbcddae2":[4,0,5,45],
+"classApp.html#a622eace13f8fc9f4b5672a68e2bc4396":[4,0,5,7],
+"classApp.html#a6844aedad10e201b8c3d80cfc9e876d3":[4,0,5,80],
+"classApp.html#a6859a4848a5c0049b4134cc4b34228b6":[4,0,5,81],
+"classApp.html#a6bcb19cdc4907077da72864686d5a780":[4,0,5,68],
+"classApp.html#a6e4f0fbfa3cf6c11baebe22a03db6165":[4,0,5,64],
+"classApp.html#a6f55d087e1ff4710132c1b0863faa2ee":[4,0,5,47],
+"classApp.html#a764cc6cd7578132c21d2b4545de9301c":[4,0,5,82],
+"classApp.html#a78788f6e9d8b713b138f81e457c5cd08":[4,0,5,20],
+"classApp.html#a7954862f44f606b0ff83d4c74d15e792":[4,0,5,57],
+"classApp.html#a871898becd0697d778f36d9336253ae8":[4,0,5,14],
+"classApp.html#a8863703a0305eaa45eb970dbd2046291":[4,0,5,16],
+"classApp.html#a89e9feb2bfb5253883a9720beaffe876":[4,0,5,21],
+"classApp.html#a91fd3c8b89016113b05f3be24805ccff":[4,0,5,86],
+"classApp.html#a94a1ed2dc493c58612d17035b74ae736":[4,0,5,31],
+"classApp.html#a98ef4cfd36693a3457c879b76bc6d694":[4,0,5,44],
+"classApp.html#a9bf62f8e39585c0aa48fcffc3bf3484d":[4,0,5,63],
+"classApp.html#aa5a87c46ab3fee21362c466bf78042ef":[4,0,5,90],
+"classApp.html#aab23c59172310fd30f2d60dc039d3eea":[4,0,5,13],
+"classApp.html#aab4a685d15a363bb1d7edbbc20bfb94e":[4,0,5,38],
+"classApp.html#ab35b01a366a2ea95725e97af278f87ab":[4,0,5,85],
+"classApp.html#ab3da757abe5cb45bf88f07cc51a73b58":[4,0,5,35],
+"classApp.html#ab47de68fa39806d1fb0976407e188b77":[4,0,5,70],
+"classApp.html#abe0e4fa91097f7a6588e1213a834121c":[4,0,5,37],
+"classApp.html#abea5a4f77dcd53c928dc4eed86616637":[4,0,5,19],
+"classApp.html#abf46a653d8499e7c253cc1be894a6d83":[4,0,5,17],
+"classApp.html#ac1a8b2cd40609b231a560201a08852ba":[4,0,5,52],
+"classApp.html#ac1d80a14492acc932715d54567d8a589":[4,0,5,46],
+"classApp.html#ac6e6b1c7d6df408580ff79977fcfa656":[4,0,5,54],
+"classApp.html#ac73dc90e4764497e2f1b7e6612c8fb88":[4,0,5,43],
+"classApp.html#acad5896b7a79ae31433ad8f89606c728":[4,0,5,69],
+"classApp.html#acb27e607fe4c82603444676e25c36b70":[4,0,5,11],
+"classApp.html#ad082d63acc078e5bf23825a03bdd6a76":[4,0,5,77],
+"classApp.html#ad1c8eb91a6fd470b94f34b7fdad3a2d0":[4,0,5,41],
+"classApp.html#ad5175536561021548ae8188e24c7b80c":[4,0,5,36],
+"classApp.html#adb060d5c7f35a521ec7ec0effbe08097":[4,0,5,27],
+"classApp.html#adb5a4bb657881e553978ff390babd01f":[4,0,5,10],
+"classApp.html#adf2aaf95b062736a6fd5fc70fadf80e8":[4,0,5,88],
+"classApp.html#ae3f47830543d0d902f66913def8db66b":[4,0,5,53],
+"classApp.html#ae9f96338f32187d308b67b980eea0008":[4,0,5,71],
+"classApp.html#aeb1fe1c8ad9aa639909bd183ce578536":[4,0,5,18],
+"classApp.html#aeca29fd4f7192ca07369b3c598c36e67":[4,0,5,83],
+"classApp.html#af17df107f2216ddf5ad2a7e0f2ba2166":[4,0,5,15],
+"classApp.html#af5007c42a693afd9c4899c243b2e1363":[4,0,5,49],
+"classApp.html#af58db526040829b1c8bd95561b329262":[4,0,5,34],
+"classApp.html#af6d39f63fb7116bbeb04e51696f99474":[4,0,5,0],
+"classBaseObject.html":[4,0,6],
+"classBaseObject.html#ac43f10e69ce80c78e4870636250fc8a2":[4,0,6,0],
+"classCache.html":[4,0,7],
+"classConversation.html":[4,0,8],
+"classConversation.html#a2a96b7a6573ae53db861624659e831cb":[4,0,8,6],
+"classConversation.html#a2f12724ef0244e9049fe1bb9641b516d":[4,0,8,19],
+"classConversation.html#a41f4a549e6a99f98935c4742addd22c8":[4,0,8,20],
+"classConversation.html#a4aab60bb39fa6761b6cacdc8d9da2901":[4,0,8,2],
+"classConversation.html#a4cff75d8c46b517e7133e4d0da6fc1c8":[4,0,8,7],
+"classConversation.html#a5879199008b96bee7550b576d614e1c1":[4,0,8,10],
+"classConversation.html#a5b6adbb2fe24f0f53d6c22660dff91b2":[4,0,8,17],
+"classConversation.html#a5effe8ad3007e01333df44b81432b813":[4,0,8,5],
+"classConversation.html#a66f121ca4026246f86a732e5faa0682c":[4,0,8,11],
+"classConversation.html#a8335cdd43f1836e3c255638e61a09e16":[4,0,8,1],
+"classConversation.html#a8748445aa26047ebed5141f3c3cbc244":[4,0,8,16],
+"classConversation.html#a87a0d704d5f2b1a008cc2e9ce06a1bcd":[4,0,8,3],
+"classConversation.html#a8898bddc1e8990e81dab9a13a532cc93":[4,0,8,12],
+"classConversation.html#a8b47c92b69459d461ea3cc9aae9597a3":[4,0,8,8],
+"classConversation.html#aa95c1a62af38bdfba7add9549bec083b":[4,0,8,13],
+"classConversation.html#adf25ce023b69a166c63c6e84e02c136a":[4,0,8,9],
+"classConversation.html#ae3d4190142e12b57051f11f2911f77a0":[4,0,8,4],
+"classConversation.html#ae81221251307e315f566a11f921ce0a9":[4,0,8,21],
+"classConversation.html#ae9937f9e0f3d927acc2bed46cc72e9ae":[4,0,8,18],
+"classConversation.html#af84ea6ccd72214c9bb4c504461cc8b09":[4,0,8,0],
+"classConversation.html#afb03d1648dbfafe62caa1e30f32f2b1a":[4,0,8,15],
+"classConversation.html#afd4965d22a6e4bfea2f35e931b3273c6":[4,0,8,14]
+};
diff --git a/doc/html/navtreeindex2.js b/doc/html/navtreeindex2.js
new file mode 100644
index 000000000..ffca67220
--- /dev/null
+++ b/doc/html/navtreeindex2.js
@@ -0,0 +1,253 @@
+var NAVTREEINDEX2 =
+{
+"classFKOAuth1.html":[4,0,13],
+"classFKOAuth1.html#a2b1dac2ed31fc6ef84668afdda8b263f":[4,0,13,1],
+"classFKOAuth1.html#a2f1276872329a6f0b704ccda1a4b9fa6":[4,0,13,0],
+"classFKOAuthDataStore.html":[4,0,14],
+"classFKOAuthDataStore.html#a1148d47b546350bf440bdd92792c5df1":[4,0,14,1],
+"classFKOAuthDataStore.html#a431b44d70e3da6a8256ab38f710e3050":[4,0,14,5],
+"classFKOAuthDataStore.html#a434882f03e3cdb171ed89e09e337e934":[4,0,14,4],
+"classFKOAuthDataStore.html#a4edfe2e77ecd2e16ff6b5eb516ed3599":[4,0,14,2],
+"classFKOAuthDataStore.html#a96f76387c3a93b0abe27a98013804bab":[4,0,14,3],
+"classFKOAuthDataStore.html#aa1a268be88ad3979bb4cc35bbb4dc819":[4,0,14,0],
+"classFriendicaSmarty.html":[4,0,15],
+"classFriendicaSmarty.html#a33fabbd4d6eef869df496adf357ae690":[4,0,15,2],
+"classFriendicaSmarty.html#a6a4d4281d6fa9be1d37a97b188ffe8c9":[4,0,15,1],
+"classFriendicaSmarty.html#af12091b920b95eeef1218cbc48066ca6":[4,0,15,0],
+"classFriendicaSmartyEngine.html":[4,0,16],
+"classFriendicaSmartyEngine.html#a35ec0ee828c36640ea25296bcb84a118":[4,0,16,1],
+"classFriendicaSmartyEngine.html#aab5994077fc3a64222e41b28e2bd8d88":[4,0,16,2],
+"classFriendicaSmartyEngine.html#ab7c305bd8c386c2944e4dc9136cea5b6":[4,0,16,0],
+"classFriendicaSmartyEngine.html#ad62f1181d2f02b54b46731ad2bd46db2":[4,0,16,3],
+"classItem.html":[4,0,17],
+"classItem.html#a007424e3e3171dcfb4312a02161da6cd":[4,0,17,34],
+"classItem.html#a078f95b4134ce3a1df344cf8d386f986":[4,0,17,37],
+"classItem.html#a0c301aaed2b7d682728d18db3a22afa3":[4,0,17,8],
+"classItem.html#a1a1e42877e6ac7af50286142ceb483d2":[4,0,17,39],
+"classItem.html#a1cb6aa8abdf7ea7daca647e40c8ea3a2":[4,0,17,42],
+"classItem.html#a248f45871ecfe82a08d1d4c0769b2eb2":[4,0,17,0],
+"classItem.html#a2ce70ef63f9f4d86a09c351678806925":[4,0,17,24],
+"classItem.html#a3ee7667c2ec6cd7657328e27848c0bdf":[4,0,17,6],
+"classItem.html#a428f448f89a8629055ea3294eb942aea":[4,0,17,16],
+"classItem.html#a4a123ae98987c1e30ecb15c4edf5a3b8":[4,0,17,44],
+"classItem.html#a4b92e3a9d6212c553aa2661489bd95d8":[4,0,17,15],
+"classItem.html#a5b2fafdca55aefeaa08993a5a60529f0":[4,0,17,20],
+"classItem.html#a5b561415861f5b89b0733aacfe0428d1":[4,0,17,40],
+"classItem.html#a5cfa6cf964f433a917a81cab079ff9d8":[4,0,17,43],
+"classItem.html#a5d29ddecc073151a65a8e2ea2f6e4189":[4,0,17,45],
+"classItem.html#a632185dd25c5caf277067c76230a4320":[4,0,17,4],
+"classItem.html#a67892aa23d19f4431bb2e5f43c74000e":[4,0,17,12],
+"classItem.html#a7f7bc059de377319282cb4ef4a828480":[4,0,17,41],
+"classItem.html#a80dcd0fb7673776c0967839d429c2a0f":[4,0,17,31],
+"classItem.html#a80dcd9d0f548c3ad550abe7e6981fb51":[4,0,17,1],
+"classItem.html#a904421c7a427411bb2ab473bca872f63":[4,0,17,7],
+"classItem.html#a90743c8348b13213275c223bb9333aa0":[4,0,17,32],
+"classItem.html#a9594df6014b0b6f45364ea7a34510130":[4,0,17,36],
+"classItem.html#a97c7feeea7f26a73176cb19faa455e12":[4,0,17,22],
+"classItem.html#a9890ff72662d5bba301d1f2dd8aec9d7":[4,0,17,28],
+"classItem.html#a9f2d219da712390f59012fc32a342074":[4,0,17,14],
+"classItem.html#aa0ee775ec94abccec6c798428835d001":[4,0,17,5],
+"classItem.html#aa1bd19fc8b5577078530265a7bf64123":[4,0,17,26],
+"classItem.html#aa2c221231ad0fc3720ccc1f00f0c6304":[4,0,17,33],
+"classItem.html#aa452b5bcd8dea12119b09212c615cb41":[4,0,17,25],
+"classItem.html#aa49e40f961dff66da32c5ae110e32993":[4,0,17,21],
+"classItem.html#aa541bc4290e51bfd688d6921bebabc73":[4,0,17,13],
+"classItem.html#aa8b1bbc4236890694635295e46d7fd72":[4,0,17,27],
+"classItem.html#aabf87ded59c25b5fe2b2296678e70509":[4,0,17,23],
+"classItem.html#aba23a0a9d89e316d2b343cc46d695d91":[4,0,17,17],
+"classItem.html#abcdb0ea9bcd1576bc99bba9b8f700bb8":[4,0,17,2],
+"classItem.html#ac04525a8be24c12b0a2ae4ca1ba4b967":[4,0,17,19],
+"classItem.html#ac0f27e58532612f6e7a54c8a621b9b92":[4,0,17,11],
+"classItem.html#ac6f1c96cc82a0dfb7e881fc70309ea3c":[4,0,17,10],
+"classItem.html#aca1e66988ed00cd627b2a359b72cd0ae":[4,0,17,3],
+"classItem.html#acc32426c0f465391be8a99ad810c7b8e":[4,0,17,30],
+"classItem.html#ad3638f93065693c1f69eb349feb1b7aa":[4,0,17,9],
+"classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8":[4,0,17,18],
+"classItem.html#aec24e233f9098f902b1e57e60dcb2019":[4,0,17,35],
+"classItem.html#af1b73df9b7c4b927e26b7e243b491f42":[4,0,17,29],
+"classItem.html#afa54851df82962c7c42dea3cc9f5c92c":[4,0,17,38],
+"classProtoDriver.html":[4,0,22],
+"classProtoDriver.html#a1593f3abae050edbd9304f4f8bc4894a":[4,0,22,0],
+"classProtoDriver.html#a2ba1758f0f9e3564580b6ff85292804d":[4,0,22,2],
+"classProtoDriver.html#a34b97ca5ef2165f2e16eb2fe59ff6c67":[4,0,22,1],
+"classProtoDriver.html#a64a3868cffe27d601d55f69a2ecc4337":[4,0,22,6],
+"classProtoDriver.html#a85e9063f6d0c304410cd246f7900ea1b":[4,0,22,4],
+"classProtoDriver.html#ae5b44739f84c10d00a9b65adf3785181":[4,0,22,5],
+"classProtoDriver.html#af66171aa7dab9b62cee915cb4f1abe1b":[4,0,22,3],
+"classRedBasicAuth.html":[4,0,23],
+"classRedBasicAuth.html#a072e8244a9a7f191b32d3db5ac94f857":[4,0,23,1],
+"classRedBasicAuth.html#a09c1488a0b290f5a54dc15180c5690d7":[4,0,23,8],
+"classRedBasicAuth.html#a2dab393650d1573e3515969a153e8354":[4,0,23,5],
+"classRedBasicAuth.html#a358ddad4abb5aa8c1382cf49a907adbc":[4,0,23,0],
+"classRedBasicAuth.html#a438ab125b6ef46581947e35d49cdebac":[4,0,23,6],
+"classRedBasicAuth.html#a8d09b8d784cc810a0b3be580d05106a7":[4,0,23,9],
+"classRedBasicAuth.html#a8dfd9a0953f8884723b421b7c1acf79b":[4,0,23,2],
+"classRedBasicAuth.html#aa75dc43b59adc98e38a98517d3fd35d1":[4,0,23,7],
+"classRedBasicAuth.html#ad5a3ea4dc4783b242d9dc6e76478b6ef":[4,0,23,4],
+"classRedBasicAuth.html#af14337f1baad407f8a85d48205c0f30e":[4,0,23,3],
+"classRedBrowser.html":[4,0,24],
+"classRedBrowser.html#a1f7daf50bb9bfcde7345b3b1908dbd7e":[4,0,24,1],
+"classRedBrowser.html#a40fdbb9d9fe6c1243bbf135dd5b0a06f":[4,0,24,3],
+"classRedBrowser.html#a4b76be9ccef0262cf78fffb4129eda93":[4,0,24,0],
+"classRedBrowser.html#a7f6bf0bda07833f4c647557bd172e349":[4,0,24,2],
+"classRedBrowser.html#ab6d6d1e2a67e06b344a4cede1bd00b35":[4,0,24,4],
+"classRedDirectory.html":[4,0,25],
+"classRedDirectory.html#a0f113244cd85c17848df991001d024f4":[4,0,25,9],
+"classRedDirectory.html#a1e35e3cd31d2a15250655e4cafdea180":[4,0,25,0],
+"classRedDirectory.html#a2d12d99d38a6a75fc9a830b2f7fc0bf0":[4,0,25,3],
+"classRedDirectory.html#a3c148c07ad909985125aa4926d8d0021":[4,0,25,11],
+"classRedDirectory.html#a5e3fc08b2bf9f61cea4d2ccae0495bec":[4,0,25,1],
+"classRedDirectory.html#a70173d4458572d95e586b2037d2fd2f4":[4,0,25,6],
+"classRedDirectory.html#a9616af16cd19a18a6afebebcc2881c44":[4,0,25,8],
+"classRedDirectory.html#a986936910f0216887a25e28916c166c7":[4,0,25,2],
+"classRedDirectory.html#aa10254abf177bb2a0e4a88495725e09b":[4,0,25,10],
+"classRedDirectory.html#aa42d3065f6f065b17db87146a7cb031a":[4,0,25,5],
+"classRedDirectory.html#aaa20f0f44da23781917af8170c0a2569":[4,0,25,4],
+"classRedDirectory.html#acb32b8df27538c57772824a745e751d7":[4,0,25,12],
+"classRedDirectory.html#ad87c514a307ec97ba0f1372e9bcfa6a4":[4,0,25,13],
+"classRedDirectory.html#af6e4475dbd5abcdede00d20b8d388583":[4,0,25,7],
+"classRedFile.html":[4,0,26],
+"classRedFile.html#a0c961c5f49544d2502420361fa526437":[4,0,26,6],
+"classRedFile.html#a26416827eb68554d033d1e2e5cc6dd3b":[4,0,26,3],
+"classRedFile.html#a2ff12032b45538353eded9809d3b7550":[4,0,26,11],
+"classRedFile.html#a38a82bfc1b30028ea6ac75923e90fa25":[4,0,26,9],
+"classRedFile.html#a41562a28007789bbe7fe06d6a20eef47":[4,0,26,5],
+"classRedFile.html#a41a49a583eb276b75626fcf97f4a699c":[4,0,26,8],
+"classRedFile.html#a4b5d0e33f919c6c175b30a55de6263f2":[4,0,26,10],
+"classRedFile.html#a7c868dfcef6c70cd0e24cf3caa2c3535":[4,0,26,2],
+"classRedFile.html#a9a67bdb34c9db6ce144b3f371148b183":[4,0,26,0],
+"classRedFile.html#acb1edbe1848fab05347746fa1ea09d8f":[4,0,26,7],
+"classRedFile.html#acc48c05cd5a70951cb3c615ad84f03ba":[4,0,26,12],
+"classRedFile.html#ae96d5caa2db7a461c57b24380fa87e28":[4,0,26,4],
+"classRedFile.html#aef71c9eaac7052be7dc8602eb12171e7":[4,0,26,1],
+"classTemplate.html":[4,0,27],
+"classTemplate.html#a07737733f6949bdedea1e3d301b2ab7b":[4,0,27,13],
+"classTemplate.html#a285b5b2007dbbf733476273df3fed4ef":[4,0,27,12],
+"classTemplate.html#a317d535946dc065c35dd5cd38380e6c6":[4,0,27,22],
+"classTemplate.html#a35d599c9b53a02e2fe2232e5b7ed5da7":[4,0,27,2],
+"classTemplate.html#a37c15f6d1ade500943629f27a62808b7":[4,0,27,3],
+"classTemplate.html#a4b933954086d9e01a1804b0b1c6ee93e":[4,0,27,6],
+"classTemplate.html#a4e86b566c3f728e95ce5db1b33665c10":[4,0,27,21],
+"classTemplate.html#a6f0efc256688c36110180b501067ff11":[4,0,27,23],
+"classTemplate.html#a8469ab2988b6be2681516dc4b4e07d38":[4,0,27,15],
+"classTemplate.html#a86e8fd27955ef10cadfd86f3fca70677":[4,0,27,9],
+"classTemplate.html#a8f4d17e49f42b876a97364c13fb572d1":[4,0,27,19],
+"classTemplate.html#aa6a087e0b7b887dd1c98c9e0ecbd3b29":[4,0,27,4],
+"classTemplate.html#aa6f9bd7a8f7512efcf90e8d376fe05ee":[4,0,27,10],
+"classTemplate.html#aac9a4638f11271e1b1dcc9f247242718":[4,0,27,20],
+"classTemplate.html#aae9c4d761ea1298e745e8052d7910194":[4,0,27,1],
+"classTemplate.html#abbc484016ddf5d818f55b823cae6feb0":[4,0,27,14],
+"classTemplate.html#abda4c8d049f70553338eae7c905e9d5c":[4,0,27,17],
+"classTemplate.html#abf71098c80fd1f218a59452b3408309e":[4,0,27,7],
+"classTemplate.html#ac41c96e1f407b1a910029e5f4b7de8e4":[4,0,27,0],
+"classTemplate.html#ace26b8a4252fbc1c385d2b5e1e93e5c8":[4,0,27,18],
+"classTemplate.html#ae0836e7d5bd5afceb04f50fd635f1228":[4,0,27,8],
+"classTemplate.html#ae791766c3d055f7f1ba5a5e60d647934":[4,0,27,5],
+"classTemplate.html#afc4afb6f89bebcd5480022312a56cb4a":[4,0,27,16],
+"classTemplate.html#afd97b4b1e7754a550e67c0ea79159059":[4,0,27,11],
+"classZotDriver.html":[4,0,28],
+"classZotDriver.html#a2e15ff09772f0608203dad1c98299394":[4,0,28,3],
+"classZotDriver.html#a3cfdf443da4e5326e205855d7c0054f2":[4,0,28,0],
+"classZotDriver.html#a40d328ff9f6b0a238afe286dddee1514":[4,0,28,6],
+"classZotDriver.html#a6776935156accb0f170e2e24577133db":[4,0,28,1],
+"classZotDriver.html#a876e3e0e4cad83c0b58c8696b344be6f":[4,0,28,4],
+"classZotDriver.html#af65febb26031eb7f39871b9e2a539797":[4,0,28,2],
+"classZotDriver.html#afaaf9941169fc966e43e25b25e6daea6":[4,0,28,5],
+"classdba__driver.html":[4,0,9],
+"classdba__driver.html#a1a8bc9dc839a6320a0e07d8047a6b721":[4,0,9,1],
+"classdba__driver.html#a205f6535e399700b6fca2492f96f2229":[4,0,9,8],
+"classdba__driver.html#a3033b5f1c2716b52202faeaae2592fe6":[4,0,9,9],
+"classdba__driver.html#a4ccb27243e62a8ca30dd8e1b8cc67746":[4,0,9,6],
+"classdba__driver.html#a558e738b88ae893cc5d79ffa3793d555":[4,0,9,7],
+"classdba__driver.html#a5afa54172f3c837df61643f8f5b2c975":[4,0,9,2],
+"classdba__driver.html#a84675d28c7bd9b7290dd37e66dbd216c":[4,0,9,11],
+"classdba__driver.html#adcc1f8955120fec0708bce39202d0422":[4,0,9,4],
+"classdba__driver.html#ae533e62a240a793f17aef5ab4ef10edc":[4,0,9,3],
+"classdba__driver.html#af3541d13ccb7a3eddfc03e253c746186":[4,0,9,0],
+"classdba__driver.html#af48e2afeded5285766bf92e22123ed03":[4,0,9,10],
+"classdba__driver.html#afc95ffa103a3290581b537670cde5311":[4,0,9,5],
+"classdba__mysql.html":[4,0,10],
+"classdba__mysql.html#a1887338627ce0e28786839363014bd0b":[4,0,10,1],
+"classdba__mysql.html#a850586714ef897bd25f643c89b4ef76e":[4,0,10,0],
+"classdba__mysql.html#a99a7691ea6cb1300031fb6549379066e":[4,0,10,2],
+"classdba__mysql.html#ac3fd60c278f400907322dac578754a99":[4,0,10,3],
+"classdba__mysqli.html":[4,0,11],
+"classdba__mysqli.html#a27d6a748af7f80028801306e7ea33f64":[4,0,11,2],
+"classdba__mysqli.html#a611c4de8d6d7512dffb83a38bb6701ec":[4,0,11,3],
+"classdba__mysqli.html#acb38f2c851187ad632ecfab30fdfab55":[4,0,11,0],
+"classdba__mysqli.html#add062bd93961e5f0194d94820e9a51b1":[4,0,11,1],
+"classenotify.html":[4,0,12],
+"classes.html":[4,1],
+"classphoto__driver.html":[4,0,19],
+"classphoto__driver.html#a00cb166c00b7502dbc456c94330e5b03":[4,0,19,27],
+"classphoto__driver.html#a01d28d43b404d6f6de219dc9c5069dc9":[4,0,19,28],
+"classphoto__driver.html#a19e1af2b6af4c63aa6230abe69f83712":[4,0,19,13],
+"classphoto__driver.html#a1a63c4ae17e892a115ab9cf6efb960ce":[4,0,19,20],
+"classphoto__driver.html#a22ecb8c696de65a5a10bd185be9d90c3":[4,0,19,17],
+"classphoto__driver.html#a2b2a99021fc63ed6465d703ddddcb832":[4,0,19,5],
+"classphoto__driver.html#a2e6e61f1e356a90bc978f4404a77137e":[4,0,19,2],
+"classphoto__driver.html#a2f2b6337cf9aa0688d10b422123f0eec":[4,0,19,15],
+"classphoto__driver.html#a3e4215890f4a4894bf3799a7d2e0c0b1":[4,0,19,29],
+"classphoto__driver.html#a4920ed7cbb1ac735ac84153067537f03":[4,0,19,26],
+"classphoto__driver.html#a4de5bac8daea8f291a33c80788019d0d":[4,0,19,14],
+"classphoto__driver.html#a56634842b071b96502716e9843ea5361":[4,0,19,19],
+"classphoto__driver.html#a5864fae7d8389372955a8e78cec527ac":[4,0,19,16],
+"classphoto__driver.html#a642a8d0c4ad5f887c99c6af77cee287b":[4,0,19,22],
+"classphoto__driver.html#a6c6c16dbc4f517ce799f9143ed61f0e3":[4,0,19,9],
+"classphoto__driver.html#a6eee8e36eaf9339f4faf80ddd43162da":[4,0,19,23],
+"classphoto__driver.html#a7c78b5a01afe61ba3895ac07f4869b55":[4,0,19,25],
+"classphoto__driver.html#a97289aef3be43d9435ca3717ef10b8ab":[4,0,19,12],
+"classphoto__driver.html#aa2efb5b2a6af3fd67e3f1c2b9852a5ba":[4,0,19,6],
+"classphoto__driver.html#ab98da263bd7341fc132c4fb6fc76e8d5":[4,0,19,8],
+"classphoto__driver.html#abc9f73ad90923772d52b9fcc4eb117dd":[4,0,19,11],
+"classphoto__driver.html#ac6e85f8e507cab4e755ed7acdec401ae":[4,0,19,0],
+"classphoto__driver.html#acc30486acee9e89e32701f44a1738117":[4,0,19,10],
+"classphoto__driver.html#ae18716018afcf362c7c24586b53e9e2f":[4,0,19,4],
+"classphoto__driver.html#ae1a9edaf846983780dc65ea77d99e813":[4,0,19,3],
+"classphoto__driver.html#ae4501abdc9651359f81d036b63625686":[4,0,19,1],
+"classphoto__driver.html#ae663867d2c4eaa2fae50d60670920143":[4,0,19,21],
+"classphoto__driver.html#aea560be5dfba09117d36c12bacbf3b80":[4,0,19,24],
+"classphoto__driver.html#af0f7ec48a31ae9b557b6e3f8bd5b4af0":[4,0,19,18],
+"classphoto__driver.html#af769e9abb144e57002c59aa2aa8f3468":[4,0,19,7],
+"classphoto__gd.html":[4,0,20],
+"classphoto__gd.html#a0795fc029be382557ae3f6e285f40e00":[4,0,20,5],
+"classphoto__gd.html#a16f3dd7d3559f715aa2fe3f7880836dd":[4,0,20,9],
+"classphoto__gd.html#a1c75304bd15f3b9986f0b315fb59271e":[4,0,20,8],
+"classphoto__gd.html#a2f2e5900e6d8b1667892ac631b1d4754":[4,0,20,2],
+"classphoto__gd.html#a33092b889875b68bfb1c97ff123012d9":[4,0,20,6],
+"classphoto__gd.html#a44cedef376044018702d9355ddc813ce":[4,0,20,3],
+"classphoto__gd.html#a724703ecf71b1f1d04a80e86c76db6b1":[4,0,20,1],
+"classphoto__gd.html#a77f87730b11093b76980c541159df37d":[4,0,20,7],
+"classphoto__gd.html#a86757ba021fd80d1a5cf8c2f766a8484":[4,0,20,4],
+"classphoto__gd.html#ab2232d775c8bacf66773a03308105f0c":[4,0,20,0],
+"classphoto__imagick.html":[4,0,21],
+"classphoto__imagick.html#a27596faca6108d9d563674d1b654a0b7":[4,0,21,10],
+"classphoto__imagick.html#a2c9168f110ccd6c264095d766615dfa8":[4,0,21,7],
+"classphoto__imagick.html#a2f33a03a89497a2b2768e29736d4a8a4":[4,0,21,0],
+"classphoto__imagick.html#a3047c68bb4de7f66c2893fe451db2b66":[4,0,21,2],
+"classphoto__imagick.html#a70adbef31128c0ac8cbc5dcf34cdb019":[4,0,21,6],
+"classphoto__imagick.html#a9df5738a4a18e76dd304c440e96f045f":[4,0,21,8],
+"classphoto__imagick.html#ad07288e0eb3922cb08cc9d33a163decc":[4,0,21,5],
+"classphoto__imagick.html#aef020d929f66f4370e33fc158c8eebd4":[4,0,21,4],
+"classphoto__imagick.html#af92901d252c1e6ab5b54eebedbed23bb":[4,0,21,9],
+"classphoto__imagick.html#afd49d64751ee3a298eac0c0ce0ba0207":[4,0,21,1],
+"classphoto__imagick.html#aff6bcdbab18593a3fc5a480db8509393":[4,0,21,3],
+"cli__startup_8php.html":[5,0,0,13],
+"cli__startup_8php.html#adfdde63686e33ccd4851fa5edc4fc70b":[5,0,0,13,0],
+"cli__suggest_8php.html":[5,0,0,14],
+"cli__suggest_8php.html#a8f3a60fc96f4bec7d3837c4efc7725f2":[5,0,0,14,0],
+"cloud_8php.html":[5,0,1,11],
+"cloud_8php.html#a1b79a6fe0454bc76673ad9aef55bf02d":[5,0,1,11,0],
+"comanche_8php.html":[5,0,0,15],
+"comanche_8php.html#a028f004d5b8c23d6367816d899e17cfe":[5,0,0,15,4],
+"comanche_8php.html#a1a208fdb40dd83d6298caec4290ee922":[5,0,0,15,2],
+"comanche_8php.html#a1fe339e1454803aa502ac89379c17f5b":[5,0,0,15,1],
+"comanche_8php.html#a5718daeda40bf835345fe061e8808cdf":[5,0,0,15,3],
+"comanche_8php.html#a5a7ab801717d38e91ac910b933973887":[5,0,0,15,0],
+"comanche_8php.html#a6b0191c1a63db1696a2eb139d90d9e7f":[5,0,0,15,6],
+"comanche_8php.html#ae9fe1ce574db3dd0931eada80234f82a":[5,0,0,15,5],
+"comanche_8php.html#af7150df735e5ff9d467994cd6f769c6e":[5,0,0,15,7],
+"common_8php.html":[5,0,1,12],
+"common_8php.html#ab63408f39abef7a6915186e8dabc5a96":[5,0,1,12,0],
+"common_8php.html#aca62f113655809f41f49042ce9b123c2":[5,0,1,12,1]
+};
diff --git a/doc/html/navtreeindex3.js b/doc/html/navtreeindex3.js
new file mode 100644
index 000000000..9e1962943
--- /dev/null
+++ b/doc/html/navtreeindex3.js
@@ -0,0 +1,253 @@
+var NAVTREEINDEX3 =
+{
+"community_8php.html":[5,0,1,13],
+"community_8php.html#a1197aafd6a6b540dbb4a0c04ade3a25a":[5,0,1,13,0],
+"community_8php.html#a56c94ec978a38633c5628fa6f8e386d9":[5,0,1,13,1],
+"connect_8php.html":[5,0,1,14],
+"connect_8php.html#a417ec27afe33f21a929667a665e32ee2":[5,0,1,14,2],
+"connect_8php.html#a489f0a66c660de6ec4d6917b27674f07":[5,0,1,14,0],
+"connect_8php.html#ad46a38f32fd7a3d324b1fa26373efa36":[5,0,1,14,1],
+"connections_8php.html":[5,0,1,15],
+"connections_8php.html#a1224058db8e3fb56463eb312f98e561d":[5,0,1,15,3],
+"connections_8php.html#a15af118efee9c948b6f8294e54a73bb2":[5,0,1,15,0],
+"connections_8php.html#a1f23623f802af7bd35e95b0e94e5d558":[5,0,1,15,2],
+"connections_8php.html#aec2e457420fce3e3bf6a9f48e36df25c":[5,0,1,15,1],
+"connedit_8php.html":[5,0,1,16],
+"connedit_8php.html#a234c48426b652bf4d37053f2af329ac5":[5,0,1,16,3],
+"connedit_8php.html#a4da871e075597a09a8b374b9171dd92e":[5,0,1,16,2],
+"connedit_8php.html#a707ea7e63cf9674025b1d6b081ae74f5":[5,0,1,16,0],
+"connedit_8php.html#a795acb3d9d841f55c255d7611681ab67":[5,0,1,16,1],
+"contact__selectors_8php.html":[5,0,0,18],
+"contact__selectors_8php.html#a2c743d2eb526eb758d943a1490162d75":[5,0,0,18,1],
+"contact__selectors_8php.html#a9839e8fdaac7ffb37bf1420493f5c28f":[5,0,0,18,0],
+"contact__selectors_8php.html#ad472e4716426dd1a9dd77b62962454be":[5,0,0,18,3],
+"contact__selectors_8php.html#ae499960d6467bd30c78607b1018baf53":[5,0,0,18,2],
+"contact__widgets_8php.html":[5,0,0,19],
+"contact__widgets_8php.html#a165eb021e61c4dcab2a552f28628d353":[5,0,0,19,0],
+"contact__widgets_8php.html#a1eda66319d170f60a8d07c7ece95533b":[5,0,0,19,2],
+"contact__widgets_8php.html#a552f8544528cec0c995cea7287ea9d65":[5,0,0,19,1],
+"contact__widgets_8php.html#a57e73ebcfd62bb5d8c7a7b9e663726d6":[5,0,0,19,3],
+"contactgroup_8php.html":[5,0,1,17],
+"contactgroup_8php.html#a18c7391b1b25debaf98c9dba639caab3":[5,0,1,17,0],
+"conversation_8php.html":[5,0,0,20],
+"conversation_8php.html#a0891aaa4492cba2b51eda12fe01957f3":[5,0,0,20,7],
+"conversation_8php.html#a0ee05f15255fb1cc3d89f30bc378a654":[5,0,0,20,9],
+"conversation_8php.html#a1dfcb5146e9d1eca4528bc580ad5d273":[5,0,0,20,16],
+"conversation_8php.html#a2a7d541854bba755eb8ada59af7dcb1a":[5,0,0,20,22],
+"conversation_8php.html#a3d8e30cc94f9a175054c021305d3aca3":[5,0,0,20,6],
+"conversation_8php.html#a40b9b5e7825bc73932a32e667f05e6f2":[5,0,0,20,17],
+"conversation_8php.html#a4b0888b0f26e1c284a4341fe5fd04f0c":[5,0,0,20,15],
+"conversation_8php.html#a7eeaaf44506815576f3bd80053ef52c3":[5,0,0,20,23],
+"conversation_8php.html#a7f6ef0dfa554bacf620e84c18d386e67":[5,0,0,20,8],
+"conversation_8php.html#a96b34b9d64d13c543e8163e52f5ce8c4":[5,0,0,20,14],
+"conversation_8php.html#a9bd7f9fb6678736c581bcba3b17f471c":[5,0,0,20,13],
+"conversation_8php.html#a9cc2a679606da9e535a06433f9f553a0":[5,0,0,20,21],
+"conversation_8php.html#a9f909b8885259b79c6ac8da93afd8f11":[5,0,0,20,19],
+"conversation_8php.html#aacbb12d372d5e9c3ab0735b4aea48fb3":[5,0,0,20,10],
+"conversation_8php.html#ab2383dff4f823e580399ff469d90ab19":[5,0,0,20,4],
+"conversation_8php.html#abed85a41f1160598de880b84021c9cf7":[5,0,0,20,2],
+"conversation_8php.html#ac55e070f65f46fcc8e269f7896be4c7d":[5,0,0,20,20],
+"conversation_8php.html#ad3e1d4b15e7d6d026ee182edd58f692b":[5,0,0,20,0],
+"conversation_8php.html#ad470fc7766f0db66d138fa1916c7a8b7":[5,0,0,20,1],
+"conversation_8php.html#adda79b75bf1ccf6ce9503aa310953533":[5,0,0,20,11],
+"conversation_8php.html#ae59703b07ce2ddf627b4172ff26058b6":[5,0,0,20,5],
+"conversation_8php.html#ae996eb116d397a2c6396c312d7b98664":[5,0,0,20,18],
+"conversation_8php.html#afe5b2f38d8b803edb0d7ec5fa2868db0":[5,0,0,20,12],
+"conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81":[5,0,0,20,3],
+"cronhooks_8php.html":[5,0,0,22],
+"cronhooks_8php.html#a4c4c1bbec4ecc9a0efa00dd6afd2c0ca":[5,0,0,22,0],
+"crypto_8php.html":[5,0,0,23],
+"crypto_8php.html#a0781202b0a43b82426929cc87c2fa2b5":[5,0,0,23,5],
+"crypto_8php.html#a2148d7aac7b30c720f7ebda7e9790286":[5,0,0,23,2],
+"crypto_8php.html#a32fc08d57a5694f94d8543ecbb03323c":[5,0,0,23,4],
+"crypto_8php.html#a5c61821d205f95f127114159cbffa764":[5,0,0,23,1],
+"crypto_8php.html#a920e5f222d0020f47556033d8b2b6552":[5,0,0,23,9],
+"crypto_8php.html#aae0ab70d6a199b29555b1ac3cf250d6a":[5,0,0,23,6],
+"crypto_8php.html#ab4f21d8f6b8ece0915e7c8bb73379f96":[5,0,0,23,10],
+"crypto_8php.html#ac852ee41392d1358c3a54d54935e0bf9":[5,0,0,23,0],
+"crypto_8php.html#ac95ac3b1b23b65b04a86613d4206ae85":[5,0,0,23,8],
+"crypto_8php.html#aca7c3a574bfb6c6ef1f2403a56823914":[5,0,0,23,3],
+"crypto_8php.html#ad5e51fd44cff93cfaa07a37e24a5edec":[5,0,0,23,7],
+"dark_8php.html":[5,0,3,1,2,1,0],
+"darkness_8php.html":[5,0,3,1,0,1,0],
+"darknessleftaside_8php.html":[5,0,3,1,0,1,1],
+"darknessrightaside_8php.html":[5,0,3,1,0,1,2],
+"datetime_8php.html":[5,0,0,24],
+"datetime_8php.html#a03900dcf0f9e3c58793a031673a70326":[5,0,0,24,6],
+"datetime_8php.html#a36d3d6dff8d76b5f295bb3d9c535a5b1":[5,0,0,24,11],
+"datetime_8php.html#a3f2897db32e745fe2f3e70a6b46578f8":[5,0,0,24,5],
+"datetime_8php.html#a5f29553799005b1fd4e9ce9d98ce05aa":[5,0,0,24,3],
+"datetime_8php.html#a633dadba426fa2f60b25fabdb19ebc1f":[5,0,0,24,10],
+"datetime_8php.html#a7df24d72ea05922d3127363e2295174c":[5,0,0,24,7],
+"datetime_8php.html#a8ae8dc95ace7ac27fa5a1ecf42b78c82":[5,0,0,24,9],
+"datetime_8php.html#aa51b5a7ea4f931b23acbdfcea46e9865":[5,0,0,24,12],
+"datetime_8php.html#ab55e545b72ec8c097e052ea7d373491f":[5,0,0,24,13],
+"datetime_8php.html#aba971b67f17fecf050813f1eba72367f":[5,0,0,24,8],
+"datetime_8php.html#abc1652f96799cec6fce8797ba2ebc2df":[5,0,0,24,0],
+"datetime_8php.html#ac265b86f384ee094ed5479aae02aa5c8":[5,0,0,24,2],
+"datetime_8php.html#ad6301e74b0f9267d52f8d432b5beb226":[5,0,0,24,4],
+"datetime_8php.html#aea356409ba69f9de412298c998595dd2":[5,0,0,24,1],
+"db__update_8php.html":[5,0,2,2],
+"dba__driver_8php.html":[5,0,0,0,0],
+"dba__driver_8php.html#a2c09a731d3b4fef41fed0e83db01be1f":[5,0,0,0,0,8],
+"dba__driver_8php.html#a55bf30d8176967e682656b5be4ad9249":[5,0,0,0,0,7],
+"dba__driver_8php.html#a65b83462bd26968106aebd43f16540e4":[5,0,0,0,0,3],
+"dba__driver_8php.html#aa377074e70981e8c4e82ca0accd068ee":[5,0,0,0,0,6],
+"dba__driver_8php.html#aa6607893d8f60ade9122bcfbd1a53ffb":[5,0,0,0,0,5],
+"dba__driver_8php.html#ab222aa1dbf9ea93b320f82028739127e":[5,0,0,0,0,2],
+"dba__driver_8php.html#ac10e60f6e5b95bcf67bd82cb88f37947":[5,0,0,0,0,1],
+"dba__driver_8php.html#af531546fac5f0836a8557a4f6dfee930":[5,0,0,0,0,4],
+"dba__mysql_8php.html":[5,0,0,0,1],
+"dba__mysqli_8php.html":[5,0,0,0,2],
+"delegate_8php.html":[5,0,1,18],
+"delegate_8php.html#a943eea8996ef348eb845c498f9f354dd":[5,0,1,18,0],
+"deliver_8php.html":[5,0,0,25],
+"deliver_8php.html#a397afcb9afecf0c1816b0951189dd346":[5,0,0,25,0],
+"dir_032dd9e2cfe278a2cfa5eb9547448eb9.html":[5,0,3,1,2,0],
+"dir_05f4fba29266e8fd7869afcd6cefb5cb.html":[5,0,3,1,0,1],
+"dir_0eaa4a0adae8ba4811e133c6e594aeee.html":[5,0,2,0],
+"dir_21bc5169ff11430004758be31dcfc6c4.html":[5,0,0,0],
+"dir_23ec12649285f9fabf3a6b7380226c28.html":[5,0,2],
+"dir_25f74a9991dbbca1b52a94e358ca73c1.html":[5,0,2,1,0],
+"dir_3d9c9d0c5e9556dd3eba1e072fa6eaeb.html":[5,0,3,1,2,1],
+"dir_55dbaf9b7b53c4fc605c9011743a7353.html":[5,0,3,1,2],
+"dir_6cee3bb9ace89cc4e2f065aa2ca7bc5b.html":[5,0,3,1,1,1,0],
+"dir_720432dea4a717197ae070dbc42b8f20.html":[5,0,2,1],
+"dir_817f6d302394b98e59575acdb59998bc.html":[5,0,3,0],
+"dir_8543001e5d25368a6edede3e63efb554.html":[5,0,3,1],
+"dir_922c77e958c99a98db92d38a3a349bf2.html":[5,0,3,1,1],
+"dir_92d6b429199666aa3765c8a934db5e14.html":[5,0,3,1,1,1],
+"dir__fns_8php.html":[5,0,0,26],
+"dir__fns_8php.html#a44062d4b471d1e83f92f6c184585aa13":[5,0,0,26,5],
+"dir__fns_8php.html#a6cae22cfdd6edda5ddf09e07abb3242a":[5,0,0,26,4],
+"dir__fns_8php.html#a8c15aa69da12f2d3476b9e93b82b337d":[5,0,0,26,2],
+"dir__fns_8php.html#aa666e7df6ca8c332f4081c9b66b4bdf6":[5,0,0,26,3],
+"dir__fns_8php.html#acf621621e929d49441da30aad76a58cf":[5,0,0,26,0],
+"dir__fns_8php.html#ae56881d69bb6f8e828c9e35454386774":[5,0,0,26,1],
+"dir_a8a0005c2b8590c535262d232c22afab.html":[5,0,3,1,1,1,0,0],
+"dir_aae29906d7bfc07d076125f669c8352e.html":[5,0,0,1],
+"dir_b2f003339c516cc00c8cadcafbe82f13.html":[5,0,3],
+"dir_c02447ad39a5307c81c64e880ec9e8d3.html":[5,0,3,1,1,0],
+"dir_cb8a8f75dcdd0b3fbfcc82e9eda410c5.html":[5,0,3,1,0,0],
+"dir_d41ce877eb409a4791b288730010abe2.html":[5,0,1],
+"dir_d44c64559bbebec7f509842c48db8b23.html":[5,0,0],
+"dir_d520c5cf583201d9437764f209363c22.html":[5,0,3,1,0],
+"dirprofile_8php.html":[5,0,1,20],
+"dirprofile_8php.html#a3e1d30d3d93863ff5615f2df4ac7f052":[5,0,1,20,0],
+"dirsearch_8php.html":[5,0,1,21],
+"dirsearch_8php.html#a3e51964ae3f5ff147403407b65324752":[5,0,1,21,1],
+"dirsearch_8php.html#a985d410a170549429857af6ff2673149":[5,0,1,21,2],
+"dirsearch_8php.html#aa1fb04e1de4f25b63349ac78f94ceb4c":[5,0,1,21,0],
+"display_8php.html":[5,0,1,22],
+"display_8php.html#a37137c98d47bf3306f4c2bb9f5b60de0":[5,0,1,22,0],
+"docblox__errorchecker_8php.html":[5,0,2,3],
+"docblox__errorchecker_8php.html#a1659f0a629d408e0f849dbe4ee061e62":[5,0,2,3,3],
+"docblox__errorchecker_8php.html#a21b4bbe5aae2d85db33affc7126a67ec":[5,0,2,3,2],
+"docblox__errorchecker_8php.html#a2b767cfc461fdd5061fffc9e4a806d5b":[5,0,2,3,0],
+"docblox__errorchecker_8php.html#a49a8a4009b02e49717caa88b128affc5":[5,0,2,3,8],
+"docblox__errorchecker_8php.html#a648a570b0f9f6e0e51b7267647c4b09b":[5,0,2,3,5],
+"docblox__errorchecker_8php.html#a721c6ff80a6d3e4ad4ffa52a04c60085":[5,0,2,3,9],
+"docblox__errorchecker_8php.html#a83018d9153d17d91fbcf3bc10158d34f":[5,0,2,3,6],
+"docblox__errorchecker_8php.html#a852004caba0a34390297a079f4aaac73":[5,0,2,3,7],
+"docblox__errorchecker_8php.html#ab66bc0493d25f39bf8b4dcbb429f04e6":[5,0,2,3,4],
+"docblox__errorchecker_8php.html#ae9562cf60aa693114603d27b55d2185f":[5,0,2,3,1],
+"docblox__errorchecker_8php.html#af4ca738a05beffe9c8c23e1f7aea3c2d":[5,0,2,3,10],
+"editblock_8php.html":[5,0,1,23],
+"editblock_8php.html#abbe8f55de06967bc8d79d620509a49e6":[5,0,1,23,0],
+"editlayout_8php.html":[5,0,1,24],
+"editlayout_8php.html#aa877e4157a26b099de904164181dd386":[5,0,1,24,0],
+"editpost_8php.html":[5,0,1,25],
+"editpost_8php.html#a34011690864d122680c802e9e748ccfb":[5,0,1,25,0],
+"editwebpage_8php.html":[5,0,1,26],
+"editwebpage_8php.html#a375e945255fad79a71036528f7480650":[5,0,1,26,0],
+"enotify_8php.html":[5,0,0,28],
+"enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc":[5,0,0,28,1],
+"event_8php.html":[5,0,0,29],
+"event_8php.html#a018ea4484910a873a7c1eaa126de9b1a":[5,0,0,29,6],
+"event_8php.html#a180cccd63c2a2f00ff432b03113531f3":[5,0,0,29,0],
+"event_8php.html#a184d6b9690e5b6dee35a0aa9edd47279":[5,0,0,29,1],
+"event_8php.html#a2ac9f1b08de03250ecd794f705781d17":[5,0,0,29,5],
+"event_8php.html#a32ba1b9ddf7a744a9a1512b052e5f850":[5,0,0,29,2],
+"event_8php.html#a89ef533faf345db8d64a58d4856bde3a":[5,0,0,29,3],
+"event_8php.html#abb74206cf42d694307c3d7abb7af9869":[5,0,0,29,4],
+"events_8php.html":[5,0,1,27],
+"events_8php.html#a1d293fb217ae6bc9e3858c4b32e363ec":[5,0,1,27,0],
+"events_8php.html#ab3e8a8f901175f8e40a8089eea45c075":[5,0,1,27,1],
+"expire_8php.html":[5,0,0,30],
+"expire_8php.html#a444e45c9b67727b27db4c779fd51a298":[5,0,0,30,0],
+"extract_8php.html":[5,0,2,4],
+"extract_8php.html#a0cbe524ffc9a496114fd7ba9f423ef44":[5,0,2,4,3],
+"extract_8php.html#a50b05cf2e02ef0b67fcad97106dd7634":[5,0,2,4,2],
+"extract_8php.html#a63bb4c41bc532baacf6a4976cfaa0feb":[5,0,2,4,0],
+"extract_8php.html#a9590b15215a21e9b42eb546aeef79704":[5,0,2,4,1],
+"fbrowser_8php.html":[5,0,1,28],
+"fbrowser_8php.html#aee476addcf7a3e0fe9454f7dfd5a56c4":[5,0,1,28,0],
+"features_8php.html":[5,0,0,31],
+"features_8php.html#a52b5bdfb61b256713efecf7a7b20b0c0":[5,0,0,31,0],
+"features_8php.html#ae73c5b03b01c7284ed7e7e0e774e975c":[5,0,0,31,1],
+"feed_8php.html":[5,0,1,29],
+"feed_8php.html#af86137700b56f33d1d5f25c8dec22c04":[5,0,1,29,0],
+"filer_8php.html":[5,0,1,30],
+"filer_8php.html#a5fd5d7e61b2f9c43cb5f110c89dc4274":[5,0,1,30,0],
+"filerm_8php.html":[5,0,1,31],
+"filerm_8php.html#ae2eb28d2054fa2c37e38689882172208":[5,0,1,31,0],
+"files.html":[5,0],
+"filestorage_8php.html":[5,0,1,32],
+"filestorage_8php.html#a61bb1be78472555df4ce619f51014040":[5,0,1,32,0],
+"filestorage_8php.html#ad3b64e3ece9831f9d3a9f00c0ae983cd":[5,0,1,32,1],
+"fpostit_8php.html":[5,0,2,0,0],
+"fpostit_8php.html#a3f3ae3ae61578b5671673914fd894443":[5,0,2,0,0,0],
+"fpostit_8php.html#a501b5ca82f287509fc691c88524064c1":[5,0,2,0,0,1],
+"friendica-to-smarty-tpl_8py.html":[5,0,2,5],
+"friendica-to-smarty-tpl_8py.html#a005c1b7a69cac31fad72a941974ba7bb":[5,0,2,5,11],
+"friendica-to-smarty-tpl_8py.html#a0b4cf73d1a8d201a28d269eeb62a5d5c":[5,0,2,5,8],
+"friendica-to-smarty-tpl_8py.html#a3719dd46e286a57d315e6adae1845854":[5,0,2,5,1],
+"friendica-to-smarty-tpl_8py.html#a38503e37fe68ac27c88cce91a9ac9efa":[5,0,2,5,0],
+"friendica-to-smarty-tpl_8py.html#a5dfc21ab8282dda8e3a7dff43cd0e283":[5,0,2,5,13],
+"friendica-to-smarty-tpl_8py.html#a5f9bf7a67d955c0d6be70a82097611c5":[5,0,2,5,6],
+"friendica-to-smarty-tpl_8py.html#a68d15934660cd1f4301ce251b1646f09":[5,0,2,5,12],
+"friendica-to-smarty-tpl_8py.html#a8540514fb7c4aa18ad2dffa2a975036b":[5,0,2,5,14],
+"friendica-to-smarty-tpl_8py.html#a87182a9bab47640428bd0b2b9946bef9":[5,0,2,5,10],
+"friendica-to-smarty-tpl_8py.html#a89388ea9b2826e8218ed480e917d8105":[5,0,2,5,2],
+"friendica-to-smarty-tpl_8py.html#a965e1d6d6293654a56e029a7e454dec7":[5,0,2,5,5],
+"friendica-to-smarty-tpl_8py.html#ad9ef87ccb2c9960501f5e02424a22d80":[5,0,2,5,9],
+"friendica-to-smarty-tpl_8py.html#ae74419b16516956c66f7db714a93a6ac":[5,0,2,5,7],
+"friendica-to-smarty-tpl_8py.html#aecf730e0884bb4ddc6c0deb1ef85f8eb":[5,0,2,5,4],
+"friendica-to-smarty-tpl_8py.html#af6b2c793958aae2aadc294577431f749":[5,0,2,5,3],
+"friendica__smarty_8php.html":[5,0,0,33],
+"fsuggest_8php.html":[5,0,1,34],
+"fsuggest_8php.html#a61ecfe10ce937ed526614f8fd3de3c7d":[5,0,1,34,1],
+"fsuggest_8php.html#aa6c49ed4b50a387f1845f36844dd7998":[5,0,1,34,0],
+"full_8php.html":[5,0,3,0,1],
+"full_8php.html#a6fac1b4b8cdfde06ea1b7713479e92db":[5,0,3,0,1,0],
+"functions.html":[4,3,0],
+"functions.html":[4,3,0,0],
+"functions_0x5f.html":[4,3,0,1],
+"functions_0x61.html":[4,3,0,2],
+"functions_0x62.html":[4,3,0,3],
+"functions_0x63.html":[4,3,0,4],
+"functions_0x64.html":[4,3,0,5],
+"functions_0x65.html":[4,3,0,6],
+"functions_0x66.html":[4,3,0,7],
+"functions_0x67.html":[4,3,0,8],
+"functions_0x68.html":[4,3,0,9],
+"functions_0x69.html":[4,3,0,10],
+"functions_0x6c.html":[4,3,0,11],
+"functions_0x6e.html":[4,3,0,12],
+"functions_0x6f.html":[4,3,0,13],
+"functions_0x70.html":[4,3,0,14],
+"functions_0x71.html":[4,3,0,15],
+"functions_0x72.html":[4,3,0,16],
+"functions_0x73.html":[4,3,0,17],
+"functions_0x74.html":[4,3,0,18],
+"functions_0x76.html":[4,3,0,19],
+"functions_func.html":[4,3,1,0],
+"functions_func.html":[4,3,1],
+"functions_func_0x61.html":[4,3,1,1],
+"functions_func_0x62.html":[4,3,1,2],
+"functions_func_0x63.html":[4,3,1,3],
+"functions_func_0x64.html":[4,3,1,4],
+"functions_func_0x65.html":[4,3,1,5],
+"functions_func_0x66.html":[4,3,1,6],
+"functions_func_0x67.html":[4,3,1,7]
+};
diff --git a/doc/html/navtreeindex4.js b/doc/html/navtreeindex4.js
new file mode 100644
index 000000000..7bf2984cc
--- /dev/null
+++ b/doc/html/navtreeindex4.js
@@ -0,0 +1,253 @@
+var NAVTREEINDEX4 =
+{
+"functions_func_0x68.html":[4,3,1,8],
+"functions_func_0x69.html":[4,3,1,9],
+"functions_func_0x6c.html":[4,3,1,10],
+"functions_func_0x6e.html":[4,3,1,11],
+"functions_func_0x6f.html":[4,3,1,12],
+"functions_func_0x70.html":[4,3,1,13],
+"functions_func_0x71.html":[4,3,1,14],
+"functions_func_0x72.html":[4,3,1,15],
+"functions_func_0x73.html":[4,3,1,16],
+"functions_func_0x74.html":[4,3,1,17],
+"functions_func_0x76.html":[4,3,1,18],
+"functions_vars.html":[4,3,2],
+"globals.html":[5,1,0],
+"globals.html":[5,1,0,0],
+"globals_0x5f.html":[5,1,0,1],
+"globals_0x61.html":[5,1,0,2],
+"globals_0x62.html":[5,1,0,3],
+"globals_0x63.html":[5,1,0,4],
+"globals_0x64.html":[5,1,0,5],
+"globals_0x65.html":[5,1,0,6],
+"globals_0x66.html":[5,1,0,7],
+"globals_0x67.html":[5,1,0,8],
+"globals_0x68.html":[5,1,0,9],
+"globals_0x69.html":[5,1,0,10],
+"globals_0x6a.html":[5,1,0,11],
+"globals_0x6b.html":[5,1,0,12],
+"globals_0x6c.html":[5,1,0,13],
+"globals_0x6d.html":[5,1,0,14],
+"globals_0x6e.html":[5,1,0,15],
+"globals_0x6f.html":[5,1,0,16],
+"globals_0x70.html":[5,1,0,17],
+"globals_0x71.html":[5,1,0,18],
+"globals_0x72.html":[5,1,0,19],
+"globals_0x73.html":[5,1,0,20],
+"globals_0x74.html":[5,1,0,21],
+"globals_0x75.html":[5,1,0,22],
+"globals_0x76.html":[5,1,0,23],
+"globals_0x77.html":[5,1,0,24],
+"globals_0x78.html":[5,1,0,25],
+"globals_0x7a.html":[5,1,0,26],
+"globals_func.html":[5,1,1],
+"globals_func.html":[5,1,1,0],
+"globals_func_0x61.html":[5,1,1,1],
+"globals_func_0x62.html":[5,1,1,2],
+"globals_func_0x63.html":[5,1,1,3],
+"globals_func_0x64.html":[5,1,1,4],
+"globals_func_0x65.html":[5,1,1,5],
+"globals_func_0x66.html":[5,1,1,6],
+"globals_func_0x67.html":[5,1,1,7],
+"globals_func_0x68.html":[5,1,1,8],
+"globals_func_0x69.html":[5,1,1,9],
+"globals_func_0x6a.html":[5,1,1,10],
+"globals_func_0x6b.html":[5,1,1,11],
+"globals_func_0x6c.html":[5,1,1,12],
+"globals_func_0x6d.html":[5,1,1,13],
+"globals_func_0x6e.html":[5,1,1,14],
+"globals_func_0x6f.html":[5,1,1,15],
+"globals_func_0x70.html":[5,1,1,16],
+"globals_func_0x71.html":[5,1,1,17],
+"globals_func_0x72.html":[5,1,1,18],
+"globals_func_0x73.html":[5,1,1,19],
+"globals_func_0x74.html":[5,1,1,20],
+"globals_func_0x75.html":[5,1,1,21],
+"globals_func_0x76.html":[5,1,1,22],
+"globals_func_0x77.html":[5,1,1,23],
+"globals_func_0x78.html":[5,1,1,24],
+"globals_func_0x7a.html":[5,1,1,25],
+"globals_vars.html":[5,1,2],
+"globals_vars.html":[5,1,2,0],
+"globals_vars_0x61.html":[5,1,2,1],
+"globals_vars_0x63.html":[5,1,2,2],
+"globals_vars_0x64.html":[5,1,2,3],
+"globals_vars_0x65.html":[5,1,2,4],
+"globals_vars_0x66.html":[5,1,2,5],
+"globals_vars_0x67.html":[5,1,2,6],
+"globals_vars_0x68.html":[5,1,2,7],
+"globals_vars_0x69.html":[5,1,2,8],
+"globals_vars_0x6a.html":[5,1,2,9],
+"globals_vars_0x6b.html":[5,1,2,10],
+"globals_vars_0x6c.html":[5,1,2,11],
+"globals_vars_0x6d.html":[5,1,2,12],
+"globals_vars_0x6e.html":[5,1,2,13],
+"globals_vars_0x70.html":[5,1,2,14],
+"globals_vars_0x72.html":[5,1,2,15],
+"globals_vars_0x73.html":[5,1,2,16],
+"globals_vars_0x74.html":[5,1,2,17],
+"globals_vars_0x75.html":[5,1,2,18],
+"globals_vars_0x77.html":[5,1,2,19],
+"globals_vars_0x78.html":[5,1,2,20],
+"globals_vars_0x7a.html":[5,1,2,21],
+"gprobe_8php.html":[5,0,0,34],
+"gprobe_8php.html#adf72cb0a70b5b9d99fdec1cc60e18ed1":[5,0,0,34,0],
+"greenthumbnails_8php.html":[5,0,3,1,0,1,3],
+"help_8php.html":[5,0,1,36],
+"help_8php.html#a06b2a51aaabed99e53a9b639047c4ce4":[5,0,1,36,1],
+"help_8php.html#af055e15f600ffa6fbca9386fdf715224":[5,0,1,36,0],
+"hierarchy.html":[4,2],
+"home_8php.html":[5,0,1,37],
+"home_8php.html#aa1cf697851a646755baf537f75334c46":[5,0,1,37,0],
+"home_8php.html#ac4642c38b6f23a8d065dd4a75c620bde":[5,0,1,37,1],
+"hostxrd_8php.html":[5,0,1,38],
+"hostxrd_8php.html#aa37ffc8e7900bc76c4828bd25916db92":[5,0,1,38,0],
+"html2bbcode_8php.html":[5,0,0,36],
+"html2bbcode_8php.html#a39c662b19d318990fee2ba795a55d7a7":[5,0,0,36,3],
+"html2bbcode_8php.html#a5ad726995ac4070213abdb3bd09f4837":[5,0,0,36,1],
+"html2bbcode_8php.html#a71a07f135d196ec5943b13f7b2e6a9b2":[5,0,0,36,0],
+"html2bbcode_8php.html#ad174afe0ccbd8c475e48f8a6ee2f27d8":[5,0,0,36,2],
+"html2plain_8php.html":[5,0,0,37],
+"html2plain_8php.html#a3214912e3d00cf0a948072daccf16740":[5,0,0,37,0],
+"html2plain_8php.html#a56d29b254333d29abb9d96a9a903a4b0":[5,0,0,37,3],
+"html2plain_8php.html#ab3e121fa9f3feb16f9f942e705bc6c04":[5,0,0,37,2],
+"html2plain_8php.html#ae1c203d0f089d5678d73a6c64a395201":[5,0,0,37,1],
+"identity_8php.html":[5,0,0,38],
+"identity_8php.html#a1cf83ac2b645de12868edaa3a5718f05":[5,0,0,38,3],
+"identity_8php.html#a345f4c943d84de502ec6e72d2c813945":[5,0,0,38,2],
+"identity_8php.html#a3570a4eb77332b292d394c4132cb8f03":[5,0,0,38,11],
+"identity_8php.html#a432259b2cf5b6f59be53e71db9f2c7dc":[5,0,0,38,17],
+"identity_8php.html#a4751b522ea913d0e7ed43e03d22e9e68":[5,0,0,38,16],
+"identity_8php.html#a490972c02fdb638c52ec0e012a30bfd2":[5,0,0,38,7],
+"identity_8php.html#a5b815330f3d177ab383af37a6c12e532":[5,0,0,38,20],
+"identity_8php.html#a680fbafc2db023c5b1309e0180e81315":[5,0,0,38,21],
+"identity_8php.html#a77d2237f1846964634b1c99089c27c7d":[5,0,0,38,1],
+"identity_8php.html#a78151baf4407a8482d2681a91a9c486b":[5,0,0,38,18],
+"identity_8php.html#a9637c557e13d9671f3eeb124ab98212a":[5,0,0,38,14],
+"identity_8php.html#aa46321e1cd6a3b8dfde8bf9510112fec":[5,0,0,38,8],
+"identity_8php.html#aa870d2c1f558cfd52bef05bc124e8fa4":[5,0,0,38,0],
+"identity_8php.html#aaeb666872995e3ab8da8f7bc5f3b2bd3":[5,0,0,38,10],
+"identity_8php.html#aaff86ee3b5984821e7a256c2da5f1a51":[5,0,0,38,9],
+"identity_8php.html#ab1485a26b032956e1496fc08c58b83ed":[5,0,0,38,5],
+"identity_8php.html#ac9fcd5c4c371998790b5c55c3d0f4633":[5,0,0,38,12],
+"identity_8php.html#ad2c97627a313d53df1a1c7b4215ddb51":[5,0,0,38,4],
+"identity_8php.html#ad4a2c8caca8f6ae93633ebeca0ed6620":[5,0,0,38,15],
+"identity_8php.html#ae2b140df652a55ca11bb6a99005fce35":[5,0,0,38,13],
+"identity_8php.html#ae381db3d43f8e7c1da8b15d14ecf5312":[5,0,0,38,6],
+"identity_8php.html#af2802bc13a00a17b867bba7978ba8f58":[5,0,0,38,19],
+"import_8php.html":[5,0,1,39],
+"import_8php.html#af17fef0410518f7eac205d0ea416eaa2":[5,0,1,39,1],
+"import_8php.html#afdf25ed70096d5dbf4f6d0ca79fea184":[5,0,1,39,0],
+"include_2api_8php.html":[5,0,0,5],
+"include_2api_8php.html#a0991f72554f821255397d615e76f3203":[5,0,0,5,12],
+"include_2api_8php.html#a176c448d79c211ad41c2bbe3124658f5":[5,0,0,5,5],
+"include_2api_8php.html#a18cab7c6391df5c421753463f5d2a879":[5,0,0,5,18],
+"include_2api_8php.html#a2c71b1226ef1283b5370bd1c200fee5f":[5,0,0,5,15],
+"include_2api_8php.html#a2e94eab9d6c164bfef7a1b2ab87b339b":[5,0,0,5,0],
+"include_2api_8php.html#a32f0dda848d0c11c727fe1c3e741c283":[5,0,0,5,44],
+"include_2api_8php.html#a36344c80b8e9755da2f2dd3a0e28cce8":[5,0,0,5,16],
+"include_2api_8php.html#a43c47de8565cc00c3369cb35c19cc75e":[5,0,0,5,49],
+"include_2api_8php.html#a450d8732b7b608f7ac929aee61572b95":[5,0,0,5,38],
+"include_2api_8php.html#a4c6fb9fb5203aa60f4b3afd4521db8ea":[5,0,0,5,19],
+"include_2api_8php.html#a528d8070ee74ea800102936ce73cf366":[5,0,0,5,37],
+"include_2api_8php.html#a53b0680b682ae6078f2e1ed18cfb3f74":[5,0,0,5,21],
+"include_2api_8php.html#a58cf4c02ef435996f5c3bc4283d3968d":[5,0,0,5,13],
+"include_2api_8php.html#a5990101034e7abf6404feba3cd273629":[5,0,0,5,4],
+"include_2api_8php.html#a623793229a7256dd31bcfd5ab90eef08":[5,0,0,5,45],
+"include_2api_8php.html#a645397787618b5c548a31e8686e8cca4":[5,0,0,5,32],
+"include_2api_8php.html#a6951c690d87775eb37e569c66011988e":[5,0,0,5,35],
+"include_2api_8php.html#a6a04b48168ba1d9dd2de3081a630611f":[5,0,0,5,31],
+"include_2api_8php.html#a72bfecac1970bc29b853073e816388ff":[5,0,0,5,6],
+"include_2api_8php.html#a7759ccddc8dff012ad168e511ffe5af5":[5,0,0,5,9],
+"include_2api_8php.html#a864191bb876a515ed71b17e260ef35ad":[5,0,0,5,2],
+"include_2api_8php.html#a8969e8d9c683f12ba17dcd4b059e020d":[5,0,0,5,46],
+"include_2api_8php.html#a8b25a186bd0893f51aa72a62f655735e":[5,0,0,5,39],
+"include_2api_8php.html#a9160288b7ac220635942d8dc209b78c3":[5,0,0,5,10],
+"include_2api_8php.html#a970b02c06dea8b229aa3d5fff9cf4705":[5,0,0,5,8],
+"include_2api_8php.html#aa0d6b29fff0344a8e67f3507a6d01410":[5,0,0,5,34],
+"include_2api_8php.html#aa1bddb580510e70cc1a7b7381667f1a3":[5,0,0,5,28],
+"include_2api_8php.html#aa40bae797bcd9ccacffdce5a3b5a1afa":[5,0,0,5,23],
+"include_2api_8php.html#aa49741342ad8ba285737eea1209a37e1":[5,0,0,5,25],
+"include_2api_8php.html#aa62b15a6bbb280e86b98132eb214013d":[5,0,0,5,51],
+"include_2api_8php.html#aa6fc3bc8c0fad1d081db0dcc456dd77f":[5,0,0,5,29],
+"include_2api_8php.html#aa9dc5350b26d6c7727d6c4b641ecba18":[5,0,0,5,3],
+"include_2api_8php.html#ab1ecb58954f722444bfe03233345cb1b":[5,0,0,5,17],
+"include_2api_8php.html#abe8e929e93f7ab134b1cb1fb30f19a76":[5,0,0,5,48],
+"include_2api_8php.html#ac2c2b18c426d697d11a830bca146be8a":[5,0,0,5,30],
+"include_2api_8php.html#ac5a64cc81d70ff3cf866093ea9721d23":[5,0,0,5,24],
+"include_2api_8php.html#acafd2899309a005fcb725289173dc7fe":[5,0,0,5,22],
+"include_2api_8php.html#ad24ce1bf20867add4c9211a8eaf93f22":[5,0,0,5,40],
+"include_2api_8php.html#ad2b0192f3006918bea895de8074bf8d2":[5,0,0,5,11],
+"include_2api_8php.html#ad4c29f43418f6110f85a6b3998239ab4":[5,0,0,5,33],
+"include_2api_8php.html#ad4d1634df6b35126552324683caaffa2":[5,0,0,5,43],
+"include_2api_8php.html#ade742525b2e41c82b090799ef3c51d5e":[5,0,0,5,36],
+"include_2api_8php.html#adfc035ee6303c1d8ba5336a4ead2bd53":[5,0,0,5,14],
+"include_2api_8php.html#ae0fa388479cace9c5a7a45b571ab42f8":[5,0,0,5,41],
+"include_2api_8php.html#ae82608c317421f27446465aa6724733d":[5,0,0,5,20],
+"include_2api_8php.html#ae8f5863e18d69421005c71441c9d99a5":[5,0,0,5,1],
+"include_2api_8php.html#aea2dda92a155f2843a0ca188d8dfdf25":[5,0,0,5,7],
+"include_2api_8php.html#aeb2e7ad00ea666b4b6dfcf82008194f8":[5,0,0,5,50],
+"include_2api_8php.html#af6f1d89cdb0a0621025efbec1597bc63":[5,0,0,5,42],
+"include_2api_8php.html#afb99daa6b731bf497b81f2128084852c":[5,0,0,5,47],
+"include_2api_8php.html#afe534f826e4282b72d66e8cadca7bb73":[5,0,0,5,26],
+"include_2api_8php.html#aff322705cc6084b329003fc8eab0aad0":[5,0,0,5,27],
+"include_2attach_8php.html":[5,0,0,6],
+"include_2attach_8php.html#a0d07c5b83d3d54e186f752e571847b36":[5,0,0,6,0],
+"include_2attach_8php.html#a3634af95f11a023dd8e882c3c7a3600d":[5,0,0,6,5],
+"include_2attach_8php.html#a5c0875eafb8c0f8a0620ff7a875a2221":[5,0,0,6,2],
+"include_2attach_8php.html#a5d484de2d19a93071571d6499a50ae34":[5,0,0,6,9],
+"include_2attach_8php.html#a6aa00ea010ea030110faefb75eafc1ce":[5,0,0,6,8],
+"include_2attach_8php.html#a6fdd92775f31c07d2863e16e0026018a":[5,0,0,6,10],
+"include_2attach_8php.html#a70bd666e080c2af5a91f5d14c297b8cd":[5,0,0,6,4],
+"include_2attach_8php.html#a84a8a64c4805e1525b42d4add464833f":[5,0,0,6,7],
+"include_2attach_8php.html#a887d2d44a3ef18dcb6624e7fb58dc8e3":[5,0,0,6,3],
+"include_2attach_8php.html#ab6830b3ab74a5d284876141ac80f6cbc":[5,0,0,6,6],
+"include_2attach_8php.html#ad991208ce939387e2f93a3bce7d09932":[5,0,0,6,1],
+"include_2attach_8php.html#aeb07968990e66a88c95483ca09a7f909":[5,0,0,6,11],
+"include_2chanman_8php.html":[5,0,0,12],
+"include_2chanman_8php.html#a21ba9a5c961e866ff27aee3ee67bf99b":[5,0,0,12,0],
+"include_2config_8php.html":[5,0,0,16],
+"include_2config_8php.html#a27559f388c9b9af81c94e48d6889d1d1":[5,0,0,16,7],
+"include_2config_8php.html#a549910227348003efc3c05c9105c42da":[5,0,0,16,0],
+"include_2config_8php.html#a55bbed9a014c9109c767486834f3ca33":[5,0,0,16,9],
+"include_2config_8php.html#a61591371cb18764138655d67dc817ab2":[5,0,0,16,11],
+"include_2config_8php.html#a7ad2081c5f812ac4387fd76f3762d941":[5,0,0,16,1],
+"include_2config_8php.html#a9c171def547deee16738dc58fdeb4b72":[5,0,0,16,2],
+"include_2config_8php.html#aa3dc1d3de2d091ac702e675acd3a085e":[5,0,0,16,6],
+"include_2config_8php.html#ac543813a980b3841cc5a277fcd4a24a6":[5,0,0,16,8],
+"include_2config_8php.html#ad58a4913937179adb13201c2ee3261ad":[5,0,0,16,5],
+"include_2config_8php.html#ad6da879e4fb5b37d1e161d4e9be5c32a":[5,0,0,16,10],
+"include_2config_8php.html#af02c96e6b37335774b548914ede1d22e":[5,0,0,16,3],
+"include_2config_8php.html#af08b7adb63adfb2eda7c466fba0cce74":[5,0,0,16,4],
+"include_2config_8php.html#afe117b70f1bba2f6348d9300b601f86e":[5,0,0,16,12],
+"include_2directory_8php.html":[5,0,0,27],
+"include_2directory_8php.html#aa75d3b0697ca1456aaabdb37a74aa0f0":[5,0,0,27,0],
+"include_2follow_8php.html":[5,0,0,32],
+"include_2follow_8php.html#ae387d4ae097c23d69f3247e7f08140c7":[5,0,0,32,0],
+"include_2group_8php.html":[5,0,0,35],
+"include_2group_8php.html#a0122ef312df2c5546b1a46b3e6c7b31b":[5,0,0,35,2],
+"include_2group_8php.html#a048f6892bfd28852de1b76470df411de":[5,0,0,35,10],
+"include_2group_8php.html#a06ec565d2b64e79044e7c1bf91a2a4ce":[5,0,0,35,1],
+"include_2group_8php.html#a22a81875259c7d3d64d4848afea6b345":[5,0,0,35,0],
+"include_2group_8php.html#a4118f498bbd1530c1d0136d016d197a5":[5,0,0,35,6],
+"include_2group_8php.html#a540e3ef36f47d47532646be4241f6518":[5,0,0,35,7],
+"include_2group_8php.html#a5bd191d9692e6c34d48c0ede10810f09":[5,0,0,35,4],
+"include_2group_8php.html#a6a69bd7be032fa8ce4e49c43a42cc6e9":[5,0,0,35,8],
+"include_2group_8php.html#a90e157b3e1b99c981809cb5a2abd3245":[5,0,0,35,5],
+"include_2group_8php.html#ab0e422a0f31c0c64fd9084ca03d85f32":[5,0,0,35,11],
+"include_2group_8php.html#abd66a5ea34a07a3422dc2dde6c7b3ecb":[5,0,0,35,3],
+"include_2group_8php.html#afb802ae2ce73aae4bc36d157f7b6a92f":[5,0,0,35,9],
+"include_2menu_8php.html":[5,0,0,43],
+"include_2menu_8php.html#a08a800821721781a8dfffbe31481ff98":[5,0,0,43,1],
+"include_2menu_8php.html#a3884bda4d85d84ec99447db9403a68d8":[5,0,0,43,3],
+"include_2menu_8php.html#a47447c01ba8ea04cd74af1d4c5b68fc7":[5,0,0,43,8],
+"include_2menu_8php.html#a68ebbf492470c930f652013656f9071d":[5,0,0,43,7],
+"include_2menu_8php.html#a6a33c6a3db2a7510b16cc656edaec571":[5,0,0,43,5],
+"include_2menu_8php.html#a890cc6237971e15f15702e6b2e88502e":[5,0,0,43,10],
+"include_2menu_8php.html#a9aa8e0052dd47c1a93f53a983bd4620a":[5,0,0,43,2],
+"include_2menu_8php.html#acb66f80ca895a6ccd562b3d9ae7b41aa":[5,0,0,43,6],
+"include_2menu_8php.html#acef15a498d52666b1c7e5c12765c689b":[5,0,0,43,9],
+"include_2menu_8php.html#ad87f51ce85172bcc3f931aa0cd96a804":[5,0,0,43,4],
+"include_2menu_8php.html#add35fae5e9695031b3d46e30ac409eb8":[5,0,0,43,0],
+"include_2message_8php.html":[5,0,0,44]
+};
diff --git a/doc/html/navtreeindex5.js b/doc/html/navtreeindex5.js
new file mode 100644
index 000000000..86c59b429
--- /dev/null
+++ b/doc/html/navtreeindex5.js
@@ -0,0 +1,253 @@
+var NAVTREEINDEX5 =
+{
+"include_2message_8php.html#a254a756031e4d5e94f85e2939bdb5091":[5,0,0,44,2],
+"include_2message_8php.html#a5f8de9847e203329e317ac38dc646898":[5,0,0,44,1],
+"include_2message_8php.html#a652973ce47a262f2d238c2fd6233d97e":[5,0,0,44,3],
+"include_2message_8php.html#a751ffd6635022b2190f56154ee745752":[5,0,0,44,4],
+"include_2message_8php.html#aed272d77c06a309e2836ac79e75613f1":[5,0,0,44,0],
+"include_2network_8php.html":[5,0,0,46],
+"include_2network_8php.html#a1ff07d9fad93b713b93da0ab77aab7f0":[5,0,0,46,5],
+"include_2network_8php.html#a27a951b59d8d622c0b3e7b0673ba74c6":[5,0,0,46,10],
+"include_2network_8php.html#a469b9bd700269cd07d954f1a16c5899b":[5,0,0,46,4],
+"include_2network_8php.html#a4c5d50079e089168d9248427018fffd4":[5,0,0,46,9],
+"include_2network_8php.html#a4cfb2c05a1c295317283d762440ce0b2":[5,0,0,46,8],
+"include_2network_8php.html#a5caa264fab6d2b2344e6bd5b298b08f2":[5,0,0,46,13],
+"include_2network_8php.html#a78e89557b2fbd344ad790846d761b0c7":[5,0,0,46,7],
+"include_2network_8php.html#a8122356933bcd6b0a8567e8e15ae5cc5":[5,0,0,46,14],
+"include_2network_8php.html#a897e7112d86eb95526cbd0bff9375f02":[5,0,0,46,12],
+"include_2network_8php.html#a8d5a3afb51cc932032b5dcc159efaae0":[5,0,0,46,6],
+"include_2network_8php.html#a9129fd55e7fc175b4ea9a195cccc16bc":[5,0,0,46,19],
+"include_2network_8php.html#a99353baabbc3e0584b85eb79ee802cff":[5,0,0,46,16],
+"include_2network_8php.html#a9e9da2aafb806c98ecdc318604e60dc6":[5,0,0,46,17],
+"include_2network_8php.html#aafd06c0a75402aefb06cfb9f9740fa37":[5,0,0,46,18],
+"include_2network_8php.html#ab07ce9d75eae559865ed90aad2154bd7":[5,0,0,46,2],
+"include_2network_8php.html#aba38458a2ff2d92d3536488dbb119694":[5,0,0,46,0],
+"include_2network_8php.html#ad4056d3ce69988f5c1a997a79f503246":[5,0,0,46,3],
+"include_2network_8php.html#adf6008b38c555e98e7ed10da9ede2335":[5,0,0,46,15],
+"include_2network_8php.html#ae8d9c41a11000fb8667039fc71b4f73f":[5,0,0,46,11],
+"include_2network_8php.html#aee35d9ad6b3f872bfb39ba3598936aa7":[5,0,0,46,1],
+"include_2notify_8php.html":[5,0,0,48],
+"include_2notify_8php.html#a0e61728e487df50c72e6434f911a57d3":[5,0,0,48,0],
+"include_2oembed_8php.html":[5,0,0,50],
+"include_2oembed_8php.html#a000a62b97113cf95b0e9e00412168172":[5,0,0,50,5],
+"include_2oembed_8php.html#a00c4c80deffd9daf8dc97b58d4c64ed0":[5,0,0,50,7],
+"include_2oembed_8php.html#a03fa3b7832c98a3d0b4630afeb73d487":[5,0,0,50,1],
+"include_2oembed_8php.html#a26bb4c1e330d2f94ea7b6ce2fe970cf3":[5,0,0,50,4],
+"include_2oembed_8php.html#a98549b9af8140eda3eceaeedcaabc2c2":[5,0,0,50,3],
+"include_2oembed_8php.html#a9e57f3e36a0a0a47e6db79544b701d9a":[5,0,0,50,6],
+"include_2oembed_8php.html#ab953a6e7c11bc6498ce01ed73e2ba319":[5,0,0,50,0],
+"include_2oembed_8php.html#aba89ae64b355efcb4f706553d3edb6a2":[5,0,0,50,2],
+"include_2photos_8php.html":[5,0,0,55],
+"include_2photos_8php.html#a6c40ef58aefef705a5adc84a40e97109":[5,0,0,55,0],
+"include_2photos_8php.html#a7e7abc69872180697c5471dc69349afe":[5,0,0,55,2],
+"include_2photos_8php.html#a8e8b7be99e24c2497bc2cb3339280c35":[5,0,0,55,1],
+"include_2photos_8php.html#aa27b9e435dcc34e1009f56dc02c7ca51":[5,0,0,55,7],
+"include_2photos_8php.html#ab0365f25b22ccea5f085fe7c49e1f4ab":[5,0,0,55,3],
+"include_2photos_8php.html#ad648c0c5544fe9263409b6f6e57c6274":[5,0,0,55,6],
+"include_2photos_8php.html#aedccaf18282b26899d9549c29bd9d1b9":[5,0,0,55,5],
+"include_2photos_8php.html#af24c6aeed28ecc31ec39e7d9a1804979":[5,0,0,55,4],
+"index.html":[],
+"interfaceITemplateEngine.html":[4,0,18],
+"interfaceITemplateEngine.html#aaa7381c8becc3d1c1790b53988a0f243":[4,0,18,1],
+"interfaceITemplateEngine.html#aaf2698adbf46c073c24b162fe1b1c442":[4,0,18,0],
+"invite_8php.html":[5,0,1,40],
+"invite_8php.html#a244385b28cfd021d308715f01158bfd9":[5,0,1,40,0],
+"invite_8php.html#aeb0881c0f93c8e8552e5ed756ce6e5a5":[5,0,1,40,1],
+"item_8php.html":[5,0,1,41],
+"item_8php.html#a3daae7944f737bd30412a0d042207c0f":[5,0,1,41,0],
+"item_8php.html#a5b1b36cb301a94b38150074f0d424e74":[5,0,1,41,3],
+"item_8php.html#a693cd09805755ab85bbb5ecae69a48c3":[5,0,1,41,5],
+"item_8php.html#a764bbb2e9a885a86fb23d0b5e4a09221":[5,0,1,41,4],
+"item_8php.html#a7b63a9d0cd02096e17dcf11f4afa7c10":[5,0,1,41,1],
+"item_8php.html#aa22feef4de326e1d7078dedd892e615c":[5,0,1,41,2],
+"items_8php.html":[5,0,0,41],
+"items_8php.html#a004e89d86b0f29b2c4da20108ecc4091":[5,0,0,41,54],
+"items_8php.html#a016dd86c827d08db89061ea81d15c6cb":[5,0,0,41,2],
+"items_8php.html#a01e3cf44e082fa9bd06dcde5bf713d70":[5,0,0,41,6],
+"items_8php.html#a04a35b610acfe54434df08adec39c0c7":[5,0,0,41,27],
+"items_8php.html#a0790a4550b829e85504af548623002ca":[5,0,0,41,7],
+"items_8php.html#a079e099e15d88d47aeb6ca6d60da7107":[5,0,0,41,32],
+"items_8php.html#a09d425596b9f8663472cf7474ad36d96":[5,0,0,41,36],
+"items_8php.html#a0cf98bb619f07dd18f602683a55a5f59":[5,0,0,41,24],
+"items_8php.html#a1e75047cf175aaee8dd16aa761913ff9":[5,0,0,41,4],
+"items_8php.html#a251343637ff40a50cca93452cd530c26":[5,0,0,41,31],
+"items_8php.html#a2541e6861a56d145c9281877cc501615":[5,0,0,41,38],
+"items_8php.html#a275108c050f7eb18bcbb5018e6b81cf6":[5,0,0,41,3],
+"items_8php.html#a2b56a4c01bd22a648d52ec9af1a04259":[5,0,0,41,13],
+"items_8php.html#a2baa9e05f1e8aa3dd61c85803ae39bd6":[5,0,0,41,53],
+"items_8php.html#a2d840c74ed23d1b6c7daee05cf89dda7":[5,0,0,41,20],
+"items_8php.html#a36e656667193c83aa2cc03a024fc131b":[5,0,0,41,0],
+"items_8php.html#a410f9c743877c125ca06312373346903":[5,0,0,41,44],
+"items_8php.html#a4e6d7639431e0dd8e9f4dba8e1ac408b":[5,0,0,41,47],
+"items_8php.html#a536d0313b6ffe33b9d2490c4e25c5361":[5,0,0,41,29],
+"items_8php.html#a566c601726697e044e75284af7fb6f17":[5,0,0,41,19],
+"items_8php.html#a56b2a4abcadfac71175cd50555528cc3":[5,0,0,41,12],
+"items_8php.html#a5f690fc2484abec07840b4f9dd525bd9":[5,0,0,41,17],
+"items_8php.html#a649dc3e53ed794d0ead4b5d037f8d8d7":[5,0,0,41,37],
+"items_8php.html#a668ece2c37f05cc3abe538eb0dabfe55":[5,0,0,41,15],
+"items_8php.html#a6f7e1334af5d684a987fa6a3eb37f4cc":[5,0,0,41,35],
+"items_8php.html#a756738301f2ed96be50232500677d58a":[5,0,0,41,40],
+"items_8php.html#a77051724d1784074ff187e73a4db93fe":[5,0,0,41,33],
+"items_8php.html#a77da7ce9a117601d49ac4a67c71b514f":[5,0,0,41,42],
+"items_8php.html#a82955cc578f0fa600acec84475026194":[5,0,0,41,16],
+"items_8php.html#a8794863cdf8ce1333040933d3a3f66bd":[5,0,0,41,11],
+"items_8php.html#a87ac9e359591721a824ecd23bbb56296":[5,0,0,41,5],
+"items_8php.html#a88c6cf7649ac836fbbed82a7a0315110":[5,0,0,41,51],
+"items_8php.html#a896c1809d58f2d7a42cfe14577958ddf":[5,0,0,41,26],
+"items_8php.html#a8f3c85c584ccd2b98c3ca440e45b40f8":[5,0,0,41,10],
+"items_8php.html#a94ddb1d6c8fa21dd7433677e85168037":[5,0,0,41,30],
+"items_8php.html#aa371905f0a211b307cb3f7188c6cba04":[5,0,0,41,52],
+"items_8php.html#aa579bc4445d60098b1410961ca8e96b7":[5,0,0,41,9],
+"items_8php.html#aa723c0571e314a1853a24c5854b4f54f":[5,0,0,41,21],
+"items_8php.html#aa9e99613d38a97b39c8cf5449699c2ee":[5,0,0,41,8],
+"items_8php.html#aab9c6bae4c40799867596bdaae9829fd":[5,0,0,41,28],
+"items_8php.html#aab9e0c58247427126de0699c729c3b6c":[5,0,0,41,48],
+"items_8php.html#ab1bce4261bcf75ad62753b498a144d17":[5,0,0,41,49],
+"items_8php.html#aba98fcbbcd7044a7e9ea34edabc14c87":[5,0,0,41,25],
+"items_8php.html#abe695dd89e1e10ed042c26b80114f0ed":[5,0,0,41,45],
+"items_8php.html#abf7a1b73eb352d79acd36309b0dababd":[5,0,0,41,1],
+"items_8php.html#ac1fcf621dce7370515b420a7753f4726":[5,0,0,41,43],
+"items_8php.html#ac6673627d289ee4f547de0fe3b7acd0a":[5,0,0,41,18],
+"items_8php.html#acf0bf7c9d21ac84f32effb754f7ad484":[5,0,0,41,39],
+"items_8php.html#ad2abb4644ff1f20fefbc80326fe01cf0":[5,0,0,41,46],
+"items_8php.html#ad34827ed330898456783fb14c7b46154":[5,0,0,41,50],
+"items_8php.html#adf980098b6de9c3993bc3ff26a8dd6f9":[5,0,0,41,23],
+"items_8php.html#ae73794179b62d39bb597ff670ab1c1e5":[5,0,0,41,34],
+"items_8php.html#af94c281016c6c912d06e064113336c5c":[5,0,0,41,41],
+"items_8php.html#afa1db13c2a8b73b5b17b97f17e5a19d1":[5,0,0,41,14],
+"items_8php.html#afbcf26dfcf8a83fff952aa858c1b7b67":[5,0,0,41,22],
+"language_8php.html":[5,0,0,42],
+"language_8php.html#a151e5b4689aef86a12642cbb7a00bfe0":[5,0,0,42,6],
+"language_8php.html#a632da17c7ac0d2dc1a00a4706870194b":[5,0,0,42,0],
+"language_8php.html#a78bd204955ec4cc3a9ac651285a1689d":[5,0,0,42,4],
+"language_8php.html#a7e9904c730bb24ddcb0ff50fc96f6b05":[5,0,0,42,3],
+"language_8php.html#a980dee1d8715a98ab02e36b59facf8ed":[5,0,0,42,1],
+"language_8php.html#aae0c3638fb476ae1e31f8d242f5dac04":[5,0,0,42,7],
+"language_8php.html#ac9142ef1d01a235c760deb0f16643f5a":[5,0,0,42,5],
+"language_8php.html#ace67d6cad57da08d030ad9dc9b8c836e":[5,0,0,42,2],
+"language_8php.html#ae310fb3880484ee1cc4faefe0c63c06d":[5,0,0,42,8],
+"layouts_8php.html":[5,0,1,42],
+"layouts_8php.html#a6e0193759ad9eef76d3df2db24237b50":[5,0,1,42,0],
+"like_8php.html":[5,0,1,43],
+"like_8php.html#a9d7dd268f21c21e9d29dd2aca2dd9538":[5,0,1,43,0],
+"lockview_8php.html":[5,0,1,44],
+"lockview_8php.html#a851e26ab9a1008df5c5ebebea31e9b44":[5,0,1,44,0],
+"login_8php.html":[5,0,1,45],
+"login_8php.html#a1d69ca88eb9005a7026e128b9a645904":[5,0,1,45,0],
+"lostpass_8php.html":[5,0,1,46],
+"lostpass_8php.html#a0314d94e48c789b1b3a201d740c9eab3":[5,0,1,46,0],
+"lostpass_8php.html#a8ed35ba71a4404eaf4903da61d0321cc":[5,0,1,46,1],
+"magic_8php.html":[5,0,1,47],
+"magic_8php.html#acea2cc792849ca2d71d4b689f66518bf":[5,0,1,47,0],
+"mail_8php.html":[5,0,1,48],
+"mail_8php.html#a3c7c485fc69f92371e8b20936040eca1":[5,0,1,48,0],
+"mail_8php.html#acfc2cc0bf4e0b178207758384977f25a":[5,0,1,48,1],
+"manage_8php.html":[5,0,1,49],
+"manage_8php.html#a2bca247b5296827638959138367db4f5":[5,0,1,49,0],
+"match_8php.html":[5,0,1,50],
+"match_8php.html#a1dd853e959b9e70c1911bb2fb5f5130d":[5,0,1,50,0],
+"md_README.html":[2],
+"md_config.html":[0],
+"md_fresh.html":[1],
+"minimal_8php.html":[5,0,3,0,2],
+"minimalisticdarkness_8php.html":[5,0,3,1,0,1,4],
+"minimalisticdarkness_8php.html#a04de7b747e4f0a353e0e38cf77c3404f":[5,0,3,1,0,1,4,4],
+"minimalisticdarkness_8php.html#a0ac3f5b52212b0af87d513273da03ead":[5,0,3,1,0,1,4,3],
+"minimalisticdarkness_8php.html#a5795120b4b324bc4ca83f1e6fdce7d57":[5,0,3,1,0,1,4,5],
+"minimalisticdarkness_8php.html#a6e5d97615c6faef5dbffe04b8024ceaf":[5,0,3,1,0,1,4,0],
+"minimalisticdarkness_8php.html#a70bb13be8f23ec47839da81e0796f1cb":[5,0,3,1,0,1,4,2],
+"minimalisticdarkness_8php.html#a7e6c3d4efde4e9a2de32308081372c6b":[5,0,3,1,0,1,4,1],
+"mitem_8php.html":[5,0,1,53],
+"mitem_8php.html#a6ee694cca4b551a20d7c7a94b5243ec1":[5,0,1,53,2],
+"mitem_8php.html#a7a31b702ecad18eeb6a38b243ff0037e":[5,0,1,53,0],
+"mitem_8php.html#a9627cd857cafdf04e4fc0ae48c8e8518":[5,0,1,53,1],
+"mod_2api_8php.html":[5,0,1,4],
+"mod_2api_8php.html#a02ae0f60e240dc806b860edb7d582117":[5,0,1,4,2],
+"mod_2api_8php.html#a33315b5bbf5418f6850b2038107b526d":[5,0,1,4,0],
+"mod_2api_8php.html#a6fe77f05c07cb51048df0d557b4b9bd2":[5,0,1,4,1],
+"mod_2attach_8php.html":[5,0,1,6],
+"mod_2attach_8php.html#aa88eb5ad87aa1036a30e70339cc6c1b1":[5,0,1,6,0],
+"mod_2chanman_8php.html":[5,0,1,8],
+"mod_2directory_8php.html":[5,0,1,19],
+"mod_2directory_8php.html#a5ee59c213508b6b9787612a8219cb5bf":[5,0,1,19,1],
+"mod_2directory_8php.html#aac79396570d759da2efac24fcedf5b44":[5,0,1,19,0],
+"mod_2follow_8php.html":[5,0,1,33],
+"mod_2follow_8php.html#a171f5b19f50d7738adc3b2e96ec6018a":[5,0,1,33,1],
+"mod_2follow_8php.html#a4c540ea4e9f5c581c1a53516ac585592":[5,0,1,33,0],
+"mod_2group_8php.html":[5,0,1,35],
+"mod_2group_8php.html#a07a64f6c65b0080d8190b3d9728a7a83":[5,0,1,35,0],
+"mod_2group_8php.html#aed1f009b1221348021bb34761160ef35":[5,0,1,35,1],
+"mod_2menu_8php.html":[5,0,1,51],
+"mod_2menu_8php.html#a6fed23af14d71a78a4153c8363a685cf":[5,0,1,51,0],
+"mod_2menu_8php.html#aaa491ef173868fe002aece4632bcf393":[5,0,1,51,1],
+"mod_2message_8php.html":[5,0,1,52],
+"mod_2message_8php.html#ac72dfed3ce08fcb331d66b37edc6e15f":[5,0,1,52,0],
+"mod_2network_8php.html":[5,0,1,56],
+"mod_2network_8php.html#a180fce90ad11d7e0e45be094da7149ec":[5,0,1,56,1],
+"mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4":[5,0,1,56,0],
+"mod_2notify_8php.html":[5,0,1,60],
+"mod_2notify_8php.html#a94f9a6a9d4b5fd704baafff0c34f41ae":[5,0,1,60,1],
+"mod_2notify_8php.html#acdf3851688ebd6d6a575eb84ef9febe3":[5,0,1,60,0],
+"mod_2oembed_8php.html":[5,0,1,61],
+"mod_2oembed_8php.html#a9145025aaf057fb5d3f9f7011e5e1014":[5,0,1,61,0],
+"mod_2photos_8php.html":[5,0,1,67],
+"mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080":[5,0,1,67,2],
+"mod_2photos_8php.html#aa87382611a66ec5effdb2d78f13f5812":[5,0,1,67,0],
+"mod_2photos_8php.html#ab950295cd77626f5fe65331a87693014":[5,0,1,67,1],
+"mod__import_8php.html":[5,0,3,0,3],
+"mod__import_8php.html#a8db1899eeeb44dabd0904065b63627bb":[5,0,3,0,3,0],
+"mood_8php.html":[5,0,1,54],
+"mood_8php.html#a721b9b6703b3234a005641c92d409b8f":[5,0,1,54,0],
+"mood_8php.html#a7ae136dd7476865b4828136175db5022":[5,0,1,54,1],
+"msearch_8php.html":[5,0,1,55],
+"msearch_8php.html#ac80d2a6c0a92e79eec7efbbccd74d9a8":[5,0,1,55,0],
+"namespaceFriendica.html":[3,0,1],
+"namespaceFriendica.html":[4,0,1],
+"namespaceacl__selectors.html":[4,0,0],
+"namespaceacl__selectors.html":[3,0,0],
+"namespacefriendica-to-smarty-tpl.html":[4,0,2],
+"namespacefriendica-to-smarty-tpl.html":[3,0,2],
+"namespacemembers.html":[3,1,0],
+"namespacemembers_func.html":[3,1,1],
+"namespacemembers_vars.html":[3,1,2],
+"namespaces.html":[3,0],
+"namespaceupdatetpl.html":[4,0,3],
+"namespaceupdatetpl.html":[3,0,3],
+"namespaceutil.html":[4,0,4],
+"namespaceutil.html":[3,0,4],
+"nav_8php.html":[5,0,0,45],
+"nav_8php.html#a43be0df73b90647ea70947ce004e231e":[5,0,0,45,0],
+"nav_8php.html#ac3c920ce3ea5b0d9e0678ee37155f06a":[5,0,0,45,1],
+"new__channel_8php.html":[5,0,1,57],
+"new__channel_8php.html#a180b0646957db8290482f02454ad7f23":[5,0,1,57,2],
+"new__channel_8php.html#a1ad7f99e4366a32942c6b954aba3a164":[5,0,1,57,1],
+"new__channel_8php.html#ae585191610f79da129492482ce8e2fee":[5,0,1,57,0],
+"none_8php.html":[5,0,3,0,4],
+"notes_8php.html":[5,0,1,58],
+"notes_8php.html#a4dbd7b1f906440746af48b484d66535a":[5,0,1,58,0],
+"notifications_8php.html":[5,0,1,59],
+"notifications_8php.html#a5baffec7b2e625c9f9cefbc097550d33":[5,0,1,59,1],
+"notifications_8php.html#aadd0b5525bd8c283a5d8a37982bbfe62":[5,0,1,59,0],
+"notifier_8php.html":[5,0,0,47],
+"notifier_8php.html#a568c502f626cff95e344c0748938b85d":[5,0,0,47,0],
+"oauth_8php.html":[5,0,0,49],
+"oauth_8php.html#a7a32a5990f113ac9465b03b29175cf16":[5,0,0,49,3],
+"oauth_8php.html#ad343cab37aa860d2d14dc86b7f5ca0c6":[5,0,0,49,2],
+"oexchange_8php.html":[5,0,1,62],
+"oexchange_8php.html#a2d8b785cd7d041a4e6274f5af370cf26":[5,0,1,62,0],
+"oexchange_8php.html#ac8e2e469ddc3db984b0c1b44558aca59":[5,0,1,62,1],
+"olddefault_8php.html":[5,0,3,1,0,1,5],
+"onedirsync_8php.html":[5,0,0,51],
+"onedirsync_8php.html#a411aedd47c57476099647961e6a86691":[5,0,0,51,0],
+"onepoll_8php.html":[5,0,0,52],
+"onepoll_8php.html#a72753b2fdec79b37c7f432035c91fb6d":[5,0,0,52,0],
+"opensearch_8php.html":[5,0,1,63],
+"opensearch_8php.html#ad13034877a496565ac7d99e9fc6f55e9":[5,0,1,63,0],
+"page_8php.html":[5,0,1,64],
+"page_8php.html#a4d89800c0366a239191b1692c09635cf":[5,0,1,64,1],
+"page_8php.html#a91a5f649f68406149108bded1dc90b22":[5,0,1,64,0],
+"page__widgets_8php.html":[5,0,0,53],
+"page__widgets_8php.html#a1a1e729da27f252cab6678288a17958f":[5,0,0,53,1],
+"page__widgets_8php.html#ad82011c1ed90d9de8b9f34c12af5c6f0":[5,0,0,53,0],
+"pages.html":[]
+};
diff --git a/doc/html/navtreeindex6.js b/doc/html/navtreeindex6.js
new file mode 100644
index 000000000..95d37d8c5
--- /dev/null
+++ b/doc/html/navtreeindex6.js
@@ -0,0 +1,253 @@
+var NAVTREEINDEX6 =
+{
+"parse__url_8php.html":[5,0,1,65],
+"parse__url_8php.html#a05a9e8944380ba3cf6bbf5893dd4b74b":[5,0,1,65,2],
+"parse__url_8php.html#a25635549f2c22955d72465f4d2e58993":[5,0,1,65,3],
+"parse__url_8php.html#a496f4e3836154f6f32b8e805a7160d3a":[5,0,1,65,1],
+"parse__url_8php.html#aa7dd8f961bea042d62726ed909e4a868":[5,0,1,65,0],
+"passion_8php.html":[5,0,3,1,0,1,6],
+"passionwide_8php.html":[5,0,3,1,0,1,7],
+"permissions_8php.html":[5,0,0,54],
+"permissions_8php.html#a040fd3d3b8517658b1668ae0cd093972":[5,0,0,54,2],
+"permissions_8php.html#a0f5bd9f7f4c8fb7ba4b2c1ed048b4dc7":[5,0,0,54,0],
+"permissions_8php.html#a67ada9ed51e77885b6b0f6a28cee1835":[5,0,0,54,3],
+"permissions_8php.html#aa8b7b102c653649d7a71b5a1c044d90d":[5,0,0,54,4],
+"permissions_8php.html#aeca9b280f3dc3358c89976d81d690008":[5,0,0,54,1],
+"photo_8php.html":[5,0,1,66],
+"photo_8php.html#a582779d24882b0d31ee909a91d70a448":[5,0,1,66,0],
+"photo__driver_8php.html":[5,0,0,1,0],
+"photo__driver_8php.html#a1d0bc7161dec0d177b7d3bbe4421af9a":[5,0,0,1,0,2],
+"photo__driver_8php.html#a243cee492ce443afb6a7d77d54b6c4aa":[5,0,0,1,0,1],
+"photo__driver_8php.html#a32e2817faa25d7f11f60a8abff565035":[5,0,0,1,0,4],
+"photo__driver_8php.html#a78f5a10c568d2a9bbbb129dc96548887":[5,0,0,1,0,3],
+"photo__gd_8php.html":[5,0,0,1,1],
+"photo__imagick_8php.html":[5,0,0,1,2],
+"php2po_8php.html":[5,0,2,6],
+"php2po_8php.html#a1594a11499d06cc8a789ee7ca0c7a12b":[5,0,2,6,7],
+"php2po_8php.html#a401d84ce156e49e8168bd0c4781e1be1":[5,0,2,6,5],
+"php2po_8php.html#a45b05625748f412ec97afcd61cf7980b":[5,0,2,6,6],
+"php2po_8php.html#a48cb304902320d173a4eaa41543327b9":[5,0,2,6,3],
+"php2po_8php.html#a61f8ddeb5557d46ebc546cc355bda214":[5,0,2,6,0],
+"php2po_8php.html#a6b0b8ebd9ce811d1325ef2c129443bc0":[5,0,2,6,1],
+"php2po_8php.html#abbb0e5fd8fbc1f13a9bf68f86eb3d2a4":[5,0,2,6,4],
+"php2po_8php.html#ad6726cfaa85d4b8299d2b0f034cbf178":[5,0,2,6,2],
+"php_2default_8php.html":[5,0,3,0,0],
+"php_2default_8php.html#a23bc1996b18e69c1a3ab44536613a762":[5,0,3,0,0,0],
+"php_2theme__init_8php.html":[5,0,3,0,5],
+"php_2theme__init_8php.html#a54f32c086fe209c99769a4c4047dd864":[5,0,3,0,5,0],
+"php_8php.html":[5,0,1,68],
+"php_8php.html#adb7164dfed9a4ecbe2e168e1e78f12f6":[5,0,1,68,0],
+"pine_8php.html":[5,0,3,1,0,1,8],
+"ping_8php.html":[5,0,1,69],
+"ping_8php.html#a77217b1b190b4c5d8770867b45f0c0a1":[5,0,1,69,0],
+"plugin_8php.html":[5,0,0,56],
+"plugin_8php.html#a030cec6793b909c439c0336ba39b1571":[5,0,0,56,21],
+"plugin_8php.html#a093a9cb98f51e3643634bd8bc6ed6e76":[5,0,0,56,24],
+"plugin_8php.html#a0e8c2ea50bfdbc39e17ccccaea21ddc3":[5,0,0,56,20],
+"plugin_8php.html#a23c4fccf1eb5fcd63b24783ba1f05f7a":[5,0,0,56,8],
+"plugin_8php.html#a326365e48ef94f0b9a0a771b8d75e813":[5,0,0,56,16],
+"plugin_8php.html#a425472c5f3afc137268b2ad45652b209":[5,0,0,56,18],
+"plugin_8php.html#a48047edfbef770125a5508dcc2f9282f":[5,0,0,56,7],
+"plugin_8php.html#a482131013272a1d5d5c1b1469c6c55d5":[5,0,0,56,15],
+"plugin_8php.html#a4a0ae7b881e7c8af99a69e3b03f898b4":[5,0,0,56,13],
+"plugin_8php.html#a4fc13e528367f510fcb6d8bbfc559040":[5,0,0,56,28],
+"plugin_8php.html#a516591850f4fd49fd1425cfa54089db8":[5,0,0,56,9],
+"plugin_8php.html#a56f71fe5adf9586ce950523d8180443e":[5,0,0,56,26],
+"plugin_8php.html#a65ab52cb1a7030d5190e247211bef2a1":[5,0,0,56,11],
+"plugin_8php.html#a65fedcffbe03562ef844cabee37d34e2":[5,0,0,56,23],
+"plugin_8php.html#a754d7f53b3abc557b753c057dc4e021d":[5,0,0,56,27],
+"plugin_8php.html#a75f7dfed291fd7add7fc85b5c022a1f4":[5,0,0,56,4],
+"plugin_8php.html#a7f05de16c0a32602853b09b99dd85e7c":[5,0,0,56,0],
+"plugin_8php.html#a901657dd078e070516cf97285e0bada7":[5,0,0,56,29],
+"plugin_8php.html#a9039e15aae27676af7777dcbee5a11d6":[5,0,0,56,1],
+"plugin_8php.html#a90538627db68605aeb6db17a8ead6523":[5,0,0,56,25],
+"plugin_8php.html#a905b54e10704b283ac64680a8abc0971":[5,0,0,56,22],
+"plugin_8php.html#a9ab6caae31935f6cf781ce7872db7cdf":[5,0,0,56,12],
+"plugin_8php.html#a9ca9632b7309a65b05c03a3e2f473a3d":[5,0,0,56,17],
+"plugin_8php.html#acb63c27d07f6d7dffe95f98a6cef1295":[5,0,0,56,3],
+"plugin_8php.html#ad48de9c0fb7f19413a2aa49250d00405":[5,0,0,56,6],
+"plugin_8php.html#ad9ff8ba554576383c5911a4bce068c1f":[5,0,0,56,2],
+"plugin_8php.html#aeaebe63dcf6fa2794f363ba2bc0b2c6b":[5,0,0,56,14],
+"plugin_8php.html#af92789f559b89a380e49d303218aeeca":[5,0,0,56,10],
+"plugin_8php.html#af9ac19004dca49adae1ac7a0d9f3b025":[5,0,0,56,19],
+"plugin_8php.html#aff0178bd8d0b34a94d5efddc883edd35":[5,0,0,56,5],
+"po2php_8php.html":[5,0,2,7],
+"po2php_8php.html#a3b75e36f913198299e99559b175cd8b4":[5,0,2,7,0],
+"poco_8php.html":[5,0,1,70],
+"poco_8php.html#a53def16f75e3d41f1d2bb7cfa4905498":[5,0,1,70,0],
+"poke_8php.html":[5,0,1,71],
+"poke_8php.html#a9725aab97b3983e6a98bd81c4efe7d3b":[5,0,1,71,1],
+"poke_8php.html#ac9190563a8da9c07a16f9dcd71cf6993":[5,0,1,71,0],
+"poller_8php.html":[5,0,0,57],
+"poller_8php.html#a5f12df3a4738124b6c039971e87e76da":[5,0,0,57,0],
+"post_8php.html":[5,0,1,72],
+"post_8php.html#af4b48181ce773ef0cdfc972441445c34":[5,0,1,72,0],
+"post_8php.html#af59e6a1dc22d19d9257b01cd7ccedb75":[5,0,1,72,1],
+"post__to__red_8php.html":[5,0,2,1,0,0],
+"post__to__red_8php.html#a085c250d4ceff5e4f10052f3d2039823":[5,0,2,1,0,0,16],
+"post__to__red_8php.html#a0f139dea77a94c98f26007963eea639c":[5,0,2,1,0,0,12],
+"post__to__red_8php.html#a3a2af6ad845239f26e86fccabf8639e1":[5,0,2,1,0,0,17],
+"post__to__red_8php.html#a4674bb5ce2baa32c559607460c39a2c5":[5,0,2,1,0,0,3],
+"post__to__red_8php.html#a49fd35f7b1cdddfe6e26ddfcf8d3c4ec":[5,0,2,1,0,0,1],
+"post__to__red_8php.html#a4d90ac085c14f53ff4d8ab4c23477ea6":[5,0,2,1,0,0,9],
+"post__to__red_8php.html#a588cea66afe0b32f27f2713d44940119":[5,0,2,1,0,0,21],
+"post__to__red_8php.html#a5cc2a89a6d33cdb8e2ca557a69bef42d":[5,0,2,1,0,0,2],
+"post__to__red_8php.html#a6210f39392a5f0fa0255cc7d3760493a":[5,0,2,1,0,0,22],
+"post__to__red_8php.html#a75db5d87226a0287a0ac0fa315f2bcfd":[5,0,2,1,0,0,5],
+"post__to__red_8php.html#a7e68a8d9c83cb28d032aad3ea85ce0a6":[5,0,2,1,0,0,13],
+"post__to__red_8php.html#a8ec8f8809e3c5d1b2c9598c8185d63aa":[5,0,2,1,0,0,4],
+"post__to__red_8php.html#a906be8f72cf1aa2e199c0683ea6a4017":[5,0,2,1,0,0,15],
+"post__to__red_8php.html#a96d0ccecb96600ef1bfd50ab3f77315f":[5,0,2,1,0,0,10],
+"post__to__red_8php.html#a99811555b30bde504a863e44015f2f19":[5,0,2,1,0,0,20],
+"post__to__red_8php.html#aa97aeda12ef080665f16311a4e1eb901":[5,0,2,1,0,0,14],
+"post__to__red_8php.html#aacba7a0646fc00ae6ac4f5dc383fccab":[5,0,2,1,0,0,8],
+"post__to__red_8php.html#ada8a7130088351710bb02ed622d6bf65":[5,0,2,1,0,0,19],
+"post__to__red_8php.html#ae0b881461afbdba93d9329068ea52136":[5,0,2,1,0,0,7],
+"post__to__red_8php.html#ae6f3a2c0561cbeacda5be565b06de8a7":[5,0,2,1,0,0,6],
+"post__to__red_8php.html#aeec4125719184e7b097b3b9fba3101b5":[5,0,2,1,0,0,0],
+"post__to__red_8php.html#af2713018a2dc97e88f121fc6215beb66":[5,0,2,1,0,0,18],
+"post__to__red_8php.html#af3e7ebd361d4ed7cb6d43209970cd94a":[5,0,2,1,0,0,23],
+"post__to__red_8php.html#af5fd50e2c42ede85f8a9e8d9ee3cf540":[5,0,2,1,0,0,11],
+"pretheme_8php.html":[5,0,1,73],
+"pretheme_8php.html#af5660943ee99db5fd75182316522eafe":[5,0,1,73,0],
+"probe_8php.html":[5,0,1,74],
+"probe_8php.html#a1f1db3fa6038e451e737964c94bf5e99":[5,0,1,74,0],
+"profile_8php.html":[5,0,1,75],
+"profile_8php.html#a3775cf6eef6587e5143133356a7b76c0":[5,0,1,75,0],
+"profile_8php.html#ab5d0246be0552e2182a585c1206d22a5":[5,0,1,75,1],
+"profile__photo_8php.html":[5,0,1,76],
+"profile__photo_8php.html#a140631c56438fbfacb61a1eb43067d02":[5,0,1,76,0],
+"profile__photo_8php.html#a4b80234074bd603221aa5364f330e479":[5,0,1,76,1],
+"profile__selectors_8php.html":[5,0,0,58],
+"profile__selectors_8php.html#a3b50b3ea4ea4bdbebebfffc5d1b157c7":[5,0,0,58,2],
+"profile__selectors_8php.html#a7473dd095987e1cdcc79d4f0bb5e6798":[5,0,0,58,1],
+"profile__selectors_8php.html#ae2b2c087e6530c61c0b256fd26d52355":[5,0,0,58,0],
+"profiles_8php.html":[5,0,1,77],
+"profiles_8php.html#a36f71405ad536228f8bb84a551b23f7e":[5,0,1,77,1],
+"profiles_8php.html#a46975783b8b8d70402d51487eb1f0b00":[5,0,1,77,0],
+"profiles_8php.html#ab0362c81b1d3b0b12a772b9fac446e04":[5,0,1,77,2],
+"profperm_8php.html":[5,0,1,78],
+"profperm_8php.html#a17fb64ec05edee1dc94d95438807d6c6":[5,0,1,78,1],
+"profperm_8php.html#aef015787de2373d9fb3fe3f814fb5023":[5,0,1,78,0],
+"pubsites_8php.html":[5,0,1,79],
+"pubsites_8php.html#af614e279aab54065345bda6b03eafdf0":[5,0,1,79,0],
+"queue_8php.html":[5,0,0,60],
+"queue_8php.html#af8c93de86d866c3200174c8450a0f341":[5,0,0,60,0],
+"queue__fn_8php.html":[5,0,0,61],
+"queue__fn_8php.html#a4c2876181f75a4a61e85b7f00dfdbba1":[5,0,0,61,1],
+"queue__fn_8php.html#a8fe71e981399bbf5d000a6ca42f57b24":[5,0,0,61,0],
+"randprof_8php.html":[5,0,1,80],
+"randprof_8php.html#abf5dba3c608b9304cbf68327cd31b090":[5,0,1,80,0],
+"redbasic_2php_2style_8php.html":[5,0,3,1,2,0,1],
+"redbasic_2php_2style_8php.html#a01c151bf47f7da2b979aaa4cb868da4c":[5,0,3,1,2,0,1,12],
+"redbasic_2php_2style_8php.html#a0b070f2c9140a7a12a0b1f88601a29e4":[5,0,3,1,2,0,1,16],
+"redbasic_2php_2style_8php.html#a0bdce350cf14bac44976e786d1be6574":[5,0,3,1,2,0,1,2],
+"redbasic_2php_2style_8php.html#a0cb037986e32302685d4f580dedd6473":[5,0,3,1,2,0,1,5],
+"redbasic_2php_2style_8php.html#a109bbd7f4add27541707b191b73ef84a":[5,0,3,1,2,0,1,23],
+"redbasic_2php_2style_8php.html#a136b0a2cdeb37f3fa506d28f82dcdbf8":[5,0,3,1,2,0,1,9],
+"redbasic_2php_2style_8php.html#a27cb59bbc750341f448cd0c298a7ea16":[5,0,3,1,2,0,1,8],
+"redbasic_2php_2style_8php.html#a339624aeef6604a2f00209a3962c6e1c":[5,0,3,1,2,0,1,0],
+"redbasic_2php_2style_8php.html#a4161f6b8aa923f67e53f54dfb6554cdb":[5,0,3,1,2,0,1,21],
+"redbasic_2php_2style_8php.html#a5bff5012c56e34da6b3b2ed475726b27":[5,0,3,1,2,0,1,4],
+"redbasic_2php_2style_8php.html#a61891d0d3e6894f52410d507b04e565d":[5,0,3,1,2,0,1,24],
+"redbasic_2php_2style_8php.html#a6502bedd57105ad1fb2dee2be9cf6351":[5,0,3,1,2,0,1,15],
+"redbasic_2php_2style_8php.html#a68e3ff836ec87ae1370c9f4a12c21c6b":[5,0,3,1,2,0,1,6],
+"redbasic_2php_2style_8php.html#a6ffadaf926b41ad84c30da319011e9ad":[5,0,3,1,2,0,1,19],
+"redbasic_2php_2style_8php.html#a810142b4bdd35a1d377ab279b02b47eb":[5,0,3,1,2,0,1,22],
+"redbasic_2php_2style_8php.html#a83022b1d70799d2bde3d64dca9cb40ee":[5,0,3,1,2,0,1,17],
+"redbasic_2php_2style_8php.html#a883f9f14e205f7aa7de02c14df67b40a":[5,0,3,1,2,0,1,26],
+"redbasic_2php_2style_8php.html#a8fdd5874587a9ad86fb05ed0be265649":[5,0,3,1,2,0,1,10],
+"redbasic_2php_2style_8php.html#a9b489f1c595b867212d30eca0c85b38c":[5,0,3,1,2,0,1,13],
+"redbasic_2php_2style_8php.html#ab00dfc29448b183055d2ae61a0e1874a":[5,0,3,1,2,0,1,18],
+"redbasic_2php_2style_8php.html#ab3afb90d611eca90819f597a2c0bb459":[5,0,3,1,2,0,1,25],
+"redbasic_2php_2style_8php.html#ab5ec5703848e0132f8a8f3d3a53a58e1":[5,0,3,1,2,0,1,11],
+"redbasic_2php_2style_8php.html#ac98bd8264411bd207a5740d08e81a158":[5,0,3,1,2,0,1,14],
+"redbasic_2php_2style_8php.html#acfd00ec469ca3c5e8bfac787573093f3":[5,0,3,1,2,0,1,20],
+"redbasic_2php_2style_8php.html#ad78cb8a1793834626d73aca22a1501f8":[5,0,3,1,2,0,1,3],
+"redbasic_2php_2style_8php.html#ae587aa6949ab6e4aa77a591e60f67ee0":[5,0,3,1,2,0,1,1],
+"redbasic_2php_2style_8php.html#afcbcf57d0b90d2e4226c2e8a1171befc":[5,0,3,1,2,0,1,7],
+"redbasic_2php_2theme_8php.html":[5,0,3,1,2,0,2],
+"redbasic_2php_2theme_8php.html#af6eb813e9fc7e2d76ac1b82bc5c0ed9b":[5,0,3,1,2,0,2,0],
+"redbasic_8php.html":[5,0,3,1,0,1,9],
+"reddav_8php.html":[5,0,0,62],
+"reddav_8php.html#a5df0d09893f2e65dc5cf6bbab6cfb266":[5,0,0,62,5],
+"reddav_8php.html#a9f531641dfb4e43cd88ac1a9ae7e2088":[5,0,0,62,6],
+"reddav_8php.html#ae92ea0df1993f6a7bcd1b6efa6c1fb66":[5,0,0,62,4],
+"register_8php.html":[5,0,1,81],
+"register_8php.html#a0e91f57f111407ea8d3223a05022bb2a":[5,0,1,81,0],
+"register_8php.html#a51731dcc1917c58a790eb1c0f6132271":[5,0,1,81,2],
+"register_8php.html#ae20c0cd40f738d6295de58b9202c83d5":[5,0,1,81,1],
+"regmod_8php.html":[5,0,1,82],
+"regmod_8php.html#a7953df4e32e63946565e90cdd5d50409":[5,0,1,82,0],
+"removeme_8php.html":[5,0,1,83],
+"removeme_8php.html#a065a589caa2aa84c60f7073a28f0ad9c":[5,0,1,83,0],
+"removeme_8php.html#a7be08738beca44bb98a79e01cdb2ee88":[5,0,1,83,1],
+"rmagic_8php.html":[5,0,1,84],
+"rmagic_8php.html#a3e28db1e5cfa7e5c2617f90222c1caef":[5,0,1,84,0],
+"rmagic_8php.html#a869de069d081b3c4e98b957d06bbf08f":[5,0,1,84,2],
+"rmagic_8php.html#a95455edd43f1bff39446a57388cdde16":[5,0,1,84,1],
+"rpost_8php.html":[5,0,1,85],
+"rpost_8php.html#a8190354d789000806d9879aea276728f":[5,0,1,85,0],
+"rsd__xml_8php.html":[5,0,1,86],
+"rsd__xml_8php.html#a740cd02fa15e5a53f8547fac73f0ab82":[5,0,1,86,0],
+"search_8php.html":[5,0,1,87],
+"search_8php.html#ab2568591359edde5b483a6cd9a24b2cc":[5,0,1,87,0],
+"search_8php.html#acf19fd30f07f495781ca0d7a0a08b435":[5,0,1,87,1],
+"search__ac_8php.html":[5,0,1,88],
+"search__ac_8php.html#a14f90c83a3f2be095e9e2992a8d66138":[5,0,1,88,0],
+"security_8php.html":[5,0,0,63],
+"security_8php.html#a15e0f8f511cc06192db63387f97238b3":[5,0,0,63,11],
+"security_8php.html#a20f8b9851f23ee8894b8925584ef6821":[5,0,0,63,2],
+"security_8php.html#a444ac867dfa8c37cf0a7a226412bee28":[5,0,0,63,4],
+"security_8php.html#a77ba0d1889a39cf32434c5ce96fe1433":[5,0,0,63,5],
+"security_8php.html#a8d23d2597aae380a3341872fe9513380":[5,0,0,63,1],
+"security_8php.html#a9355488460ab11d6058656ff919e5cf9":[5,0,0,63,7],
+"security_8php.html#a9c6180e82150a5a9af91a1255d096b5c":[5,0,0,63,3],
+"security_8php.html#ab3bdd30dc60d9ee72370b866aa4a2d01":[5,0,0,63,9],
+"security_8php.html#acd06ef411116115c2f0a92633700db8a":[5,0,0,63,6],
+"security_8php.html#adc7bf51e3b8d67bd80e9348f9ab03733":[5,0,0,63,0],
+"security_8php.html#ae92c5c1a1cbbc49ddbb8b3265d2db809":[5,0,0,63,10],
+"security_8php.html#afa683bc025a1d2fe9065e2f6cd71a22f":[5,0,0,63,8],
+"session_8php.html":[5,0,0,64],
+"session_8php.html#a26fa1042356d555023cbf15ddd4f8507":[5,0,0,64,4],
+"session_8php.html#a4c0ead624f95483e386bc80abf570a8f":[5,0,0,64,0],
+"session_8php.html#a5e1c616e02b863d5450317d101366bb7":[5,0,0,64,1],
+"session_8php.html#a62e4a6cb26b4bb1b8ddd8277b26090eb":[5,0,0,64,8],
+"session_8php.html#a7f0f50576360d9ba52d29364e0b83a8e":[5,0,0,64,5],
+"session_8php.html#a96b09cc763572f45280786a7b33feb7e":[5,0,0,64,7],
+"session_8php.html#ac4461c1984543d3553e73dba2771568f":[5,0,0,64,6],
+"session_8php.html#ac95373f4966862a028033dd2f94d4da1":[5,0,0,64,3],
+"session_8php.html#af0100a2642a5268594bbd5742a03d885":[5,0,0,64,9],
+"session_8php.html#af230b86bfff7db66c3bdd7e0bbc24052":[5,0,0,64,2],
+"settings_8php.html":[5,0,1,89],
+"settings_8php.html#a39abc76ff5459c57e3b957664f273f18":[5,0,1,89,0],
+"settings_8php.html#a3a4cde287482fced008583f54ba2a722":[5,0,1,89,1],
+"settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586":[5,0,1,89,2],
+"setup_8php.html":[5,0,1,90],
+"setup_8php.html#a0c3f3b671381f6dccd924b8ecdfc56c4":[5,0,1,90,2],
+"setup_8php.html#a13cf286774149a0a7bd8adb8179cec75":[5,0,1,90,14],
+"setup_8php.html#a14d208682a88632290c895d20da6e7d6":[5,0,1,90,5],
+"setup_8php.html#a267555abd17290e659b4bf44b885e4e0":[5,0,1,90,13],
+"setup_8php.html#a2b375ddc555140236fc500135de99371":[5,0,1,90,10],
+"setup_8php.html#a5ad92c0857d1dadd6b60a9a557159c9f":[5,0,1,90,3],
+"setup_8php.html#a69a450e06dd3771fb51d3e4b0266a35e":[5,0,1,90,1],
+"setup_8php.html#a8652788e8589778c5f81634a9d5b9429":[5,0,1,90,8],
+"setup_8php.html#a88247384a96e14516f474d7af6a465c1":[5,0,1,90,12],
+"setup_8php.html#aa3bbb111780da70ba35cc23a306f2c76":[5,0,1,90,4],
+"setup_8php.html#ab4b71369a25021d59247c917e98d8246":[5,0,1,90,7],
+"setup_8php.html#abe405d227ba7232971964a706d4f3bce":[5,0,1,90,11],
+"setup_8php.html#ad2e0375a9ab87ebe6e78124ee125054a":[5,0,1,90,9],
+"setup_8php.html#addb24714bc2542aa4f4215e98fe48432":[5,0,1,90,16],
+"setup_8php.html#ae8e4d9279a61de74d5f39962cb7b6ca1":[5,0,1,90,0],
+"setup_8php.html#aea1ebdda58ec938f4e7b31aa5c5f6b58":[5,0,1,90,15],
+"setup_8php.html#afd8b0b3ade1507c45325caf377bf459d":[5,0,1,90,6],
+"share_8php.html":[5,0,1,91],
+"share_8php.html#afeb26046bdd02567ecd29ab5f188b249":[5,0,1,91,0],
+"siteinfo_8php.html":[5,0,1,92],
+"siteinfo_8php.html#a3efbd0bd6564af19ec0a9ce0294e59d0":[5,0,1,92,1],
+"siteinfo_8php.html#a70c09bfb6dd1c86a125a35f62ed53656":[5,0,1,92,0],
+"sitelist_8php.html":[5,0,1,93],
+"sitelist_8php.html#a665a59bf60f780b40f32c909f4a473b1":[5,0,1,93,0],
+"smilies_8php.html":[5,0,1,94],
+"smilies_8php.html#ab43b1e9f33a700a830aff14c7b3a617f":[5,0,1,94,0]
+};
diff --git a/doc/html/navtreeindex7.js b/doc/html/navtreeindex7.js
new file mode 100644
index 000000000..ae2f2a01b
--- /dev/null
+++ b/doc/html/navtreeindex7.js
@@ -0,0 +1,253 @@
+var NAVTREEINDEX7 =
+{
+"socgraph_8php.html":[5,0,0,65],
+"socgraph_8php.html#a16ac51c505d72987ed8d6d6aed0e8586":[5,0,0,65,0],
+"socgraph_8php.html#a5ef8bef37161df53718a21e93d02fbd6":[5,0,0,65,6],
+"socgraph_8php.html#a76e6fca3d2bc842dcd9e710bb87c8329":[5,0,0,65,7],
+"socgraph_8php.html#a790690bb1a1d02483fe31632a160144d":[5,0,0,65,8],
+"socgraph_8php.html#a7d34cd58025bcd9e575282f44db75918":[5,0,0,65,1],
+"socgraph_8php.html#a887d576f21fd708132a06d0f72f90f84":[5,0,0,65,4],
+"socgraph_8php.html#ac343a846241d36cdf046b08f3396cfe9":[5,0,0,65,2],
+"socgraph_8php.html#af175807406d94407a5e11742a3287746":[5,0,0,65,5],
+"socgraph_8php.html#af29d056beec10b4e38e5209c92452894":[5,0,0,65,3],
+"sources_8php.html":[5,0,1,95],
+"sources_8php.html#ac442ccef080ab95772d8929fcafcb4b7":[5,0,1,95,0],
+"sources_8php.html#ac73298ff162ce7b2de8dcaf3d3305b1e":[5,0,1,95,1],
+"sslify_8php.html":[5,0,1,96],
+"sslify_8php.html#a75b11e54a3d1fc83e7d4c0e8b4dab316":[5,0,1,96,0],
+"starred_8php.html":[5,0,1,97],
+"starred_8php.html#a63024fb418c678e49fd535e3752d349a":[5,0,1,97,0],
+"subthread_8php.html":[5,0,1,98],
+"subthread_8php.html#a50368f3d825b77996030528e7fbfa3d3":[5,0,1,98,0],
+"suggest_8php.html":[5,0,1,99],
+"suggest_8php.html#a58748a8235d4523f8333847f3e42dd91":[5,0,1,99,0],
+"suggest_8php.html#a696acf1dd8070e479adcc80c63c6718c":[5,0,1,99,1],
+"system__unavailable_8php.html":[5,0,0,66],
+"system__unavailable_8php.html#a73751a6bcc17ad3ca503496e2fb020fa":[5,0,0,66,0],
+"tagger_8php.html":[5,0,1,100],
+"tagger_8php.html#a0e4a3eb177d1684553c547503d67161c":[5,0,1,100,0],
+"tagrm_8php.html":[5,0,1,101],
+"tagrm_8php.html#a1702f40aa53a2fa93deade1f609abe78":[5,0,1,101,1],
+"tagrm_8php.html#adfd4ea5b4d7fc6d9c9e042af5cd7d49a":[5,0,1,101,0],
+"taxonomy_8php.html":[5,0,0,67],
+"taxonomy_8php.html#a03f55ee46c5f496e42f3d29db8d09cce":[5,0,0,67,9],
+"taxonomy_8php.html#a088371f4bc19155b2291508f5cd63332":[5,0,0,67,0],
+"taxonomy_8php.html#a08df5164926d2b31b8e9fcfe919de2b6":[5,0,0,67,2],
+"taxonomy_8php.html#a0fb8cf0ac7bcbc8b27d856fe9bf69cd1":[5,0,0,67,6],
+"taxonomy_8php.html#a163b5131f388080b0fc82398d3a32fe1":[5,0,0,67,4],
+"taxonomy_8php.html#a3299482ac20e9d79453048dd52881d37":[5,0,0,67,3],
+"taxonomy_8php.html#a4ba1339b2a7054971178ce194e4440fd":[5,0,0,67,10],
+"taxonomy_8php.html#a599ee71dd3194c8127b00dabec77abc1":[5,0,0,67,1],
+"taxonomy_8php.html#a7747fa859ac56fbffd4f9782d85505de":[5,0,0,67,7],
+"taxonomy_8php.html#a7a913d19c77610da689be48fbbf6734c":[5,0,0,67,14],
+"taxonomy_8php.html#aaeded36bcc983b35d9205fe5b6c18c43":[5,0,0,67,13],
+"taxonomy_8php.html#aaf90ba8b839d6459065f39a4f1109b8a":[5,0,0,67,11],
+"taxonomy_8php.html#ac21d1dff16d569e7d110167aea4e63c2":[5,0,0,67,12],
+"taxonomy_8php.html#adfead45e3b8a3dfb2b4a4b9281d0dbe1":[5,0,0,67,5],
+"taxonomy_8php.html#af387463d42ffdf7d2ab3d5b22e40a0c7":[5,0,0,67,8],
+"template__processor_8php.html":[5,0,0,68],
+"template__processor_8php.html#a797745996c7839a93b2ab1af456631ab":[5,0,0,68,3],
+"template__processor_8php.html#ab2bcd8738f20f293636a6ae8e1099db5":[5,0,0,68,1],
+"template__processor_8php.html#ac635bb19a5f6eadd6b0cddefdd537c1e":[5,0,0,68,2],
+"text_8php.html":[5,0,0,69],
+"text_8php.html#a0271381208acfa2d4cff36da281e3e23":[5,0,0,69,39],
+"text_8php.html#a030fa5ecc64168af0c4f44897a9bce63":[5,0,0,69,45],
+"text_8php.html#a070384ec000fd65043fce11d5392d241":[5,0,0,69,6],
+"text_8php.html#a0a1f7c0e97f9ecbebf3e5834582b014c":[5,0,0,69,16],
+"text_8php.html#a0c65597bb4aed3a039eb795ff540e5e3":[5,0,0,69,11],
+"text_8php.html#a11255c8c4e5245b6c24f97684826aa54":[5,0,0,69,44],
+"text_8php.html#a13286f8a95d2de6b102966ecc270c8d6":[5,0,0,69,5],
+"text_8php.html#a1360fed7f918d859daaca1c9f384f9af":[5,0,0,69,79],
+"text_8php.html#a138a3a611fa7f4f3630674145fc826bf":[5,0,0,69,32],
+"text_8php.html#a1557112a774ec00fa06ed6b6f6495506":[5,0,0,69,35],
+"text_8php.html#a1633412120f52bdce5f43e0a127d9293":[5,0,0,69,49],
+"text_8php.html#a1af49756c8c71902a66c7e329c462beb":[5,0,0,69,52],
+"text_8php.html#a1e510c53624933ce9b7d6715784894db":[5,0,0,69,46],
+"text_8php.html#a24d441d30df4b8e6bf6780bf62a5e2c6":[5,0,0,69,47],
+"text_8php.html#a2690ad67bb6fb97ef69de3e8d23f2728":[5,0,0,69,42],
+"text_8php.html#a27cd2c1b3bcb49a0cfb7249e851725ca":[5,0,0,69,4],
+"text_8php.html#a29988052f3944111def3b6aaf2c7a8f6":[5,0,0,69,87],
+"text_8php.html#a29d6b804e368d3ef359ee295e96ed4c7":[5,0,0,69,76],
+"text_8php.html#a2a902f5fdba8646333e997898ac45ea3":[5,0,0,69,48],
+"text_8php.html#a2e8d6c402603be3a1256a16605e09c2a":[5,0,0,69,10],
+"text_8php.html#a2ffd79c60cc87cec24ef76447b905187":[5,0,0,69,89],
+"text_8php.html#a3054189cff173977f4216c9a3dd29e1b":[5,0,0,69,23],
+"text_8php.html#a324c58f37f6acdf9cd1922aa76077d9f":[5,0,0,69,84],
+"text_8php.html#a33bdb5d4bfff2ede7caf61a98ac0a2e9":[5,0,0,69,73],
+"text_8php.html#a36a2e5d418ee81140f25c4233cfecd1f":[5,0,0,69,82],
+"text_8php.html#a3972701c5c83624ec4e2d06242f614e7":[5,0,0,69,30],
+"text_8php.html#a3999a0b3e22e440f280ee791ce34d384":[5,0,0,69,41],
+"text_8php.html#a3d225b253bb9e0f2498c11647d927b0b":[5,0,0,69,72],
+"text_8php.html#a3d2793d66db3345fd290b71e2eadf98e":[5,0,0,69,7],
+"text_8php.html#a405afe814a23f3bd94d826101aa168ab":[5,0,0,69,85],
+"text_8php.html#a436a8de00c942364c2d0fcfc7e1f4b5a":[5,0,0,69,33],
+"text_8php.html#a44d460fcdee6247c67b9bef3ea15f3e6":[5,0,0,69,71],
+"text_8php.html#a4659fbc4e54ddc700c3aa66b9092c623":[5,0,0,69,31],
+"text_8php.html#a47c1e4a5f3f53027daacd8a9db24f285":[5,0,0,69,43],
+"text_8php.html#a4841df5beabdd1bdd1ed56781a915d61":[5,0,0,69,61],
+"text_8php.html#a4bbb7d00c05cd20b4e043424f322388f":[5,0,0,69,50],
+"text_8php.html#a4e4d42b0a805148d9f9a92bcac89bf91":[5,0,0,69,24],
+"text_8php.html#a4e7698aca48982512594b274543c3b9b":[5,0,0,69,60],
+"text_8php.html#a543447c5ed766535221e2d9636b379ee":[5,0,0,69,81],
+"text_8php.html#a55ab893be57feda59c2a7ba1e58ff2d0":[5,0,0,69,9],
+"text_8php.html#a63fb21c0bed2fc72eef2c1471ac42b63":[5,0,0,69,14],
+"text_8php.html#a6a3d80a6c6fb234fd0bac44203b828eb":[5,0,0,69,80],
+"text_8php.html#a71f6952243d3fe1c5a8154f78027e29c":[5,0,0,69,40],
+"text_8php.html#a736db13a966b8abaf8c9198faa35911a":[5,0,0,69,27],
+"text_8php.html#a740ad03e00459039a2c0992246c4e727":[5,0,0,69,77],
+"text_8php.html#a75c243e06341ec16bd5a44b9b1cacd85":[5,0,0,69,1],
+"text_8php.html#a75c326298519ed14ebe762194c8a3f2a":[5,0,0,69,34],
+"text_8php.html#a76d1b3435c067978d7b484c45f56472b":[5,0,0,69,26],
+"text_8php.html#a8264348059abd1d4d5bb521323d3b19a":[5,0,0,69,78],
+"text_8php.html#a85e3a4851c16674834010d8419a5d7ca":[5,0,0,69,8],
+"text_8php.html#a876e94892867019935b348b573299352":[5,0,0,69,68],
+"text_8php.html#a8796f6a9ca592ecdce7b3afc3462aa13":[5,0,0,69,74],
+"text_8php.html#a87a3cefc603302c78982f1d8e1245265":[5,0,0,69,15],
+"text_8php.html#a89929fa6f70a8ba54d5273fcf622b665":[5,0,0,69,20],
+"text_8php.html#a8b0a799341b1fc4cba2c3ede3e3fc9b6":[5,0,0,69,59],
+"text_8php.html#a8d8c4a11e53461caca21181ebd72daca":[5,0,0,69,19],
+"text_8php.html#a95fd2f8f23a1948414a03ebc963bac57":[5,0,0,69,3],
+"text_8php.html#a98fd99dee3da8cf4c148dc04efe782ee":[5,0,0,69,54],
+"text_8php.html#a9c6ce4e12a4ac883c5e3f36fed6e1e09":[5,0,0,69,65],
+"text_8php.html#a9d6a5ee1290de7a8b483fe78585daade":[5,0,0,69,63],
+"text_8php.html#a9fbeae13c9abd6e27cb4d8d1817f969c":[5,0,0,69,67],
+"text_8php.html#aa46f941155c2ac1155f2f17ffb0adb66":[5,0,0,69,29],
+"text_8php.html#aa5148a0dfea2a1ca64c3d52f10aa2d64":[5,0,0,69,17],
+"text_8php.html#aa5528f41533927e1bd2da3618a74a6d7":[5,0,0,69,55],
+"text_8php.html#aa6b0aa8afbeab50d1a3058ad21acb74e":[5,0,0,69,36],
+"text_8php.html#aac0969ae09853205992ba06ab9f9f61a":[5,0,0,69,28],
+"text_8php.html#aad557c054cf2ed915633701018fc7e3f":[5,0,0,69,88],
+"text_8php.html#aae91e4d2a2c6f7a9daccd2c186ae3447":[5,0,0,69,69],
+"text_8php.html#aaed4413ed8918838b517e3b2fafaea0d":[5,0,0,69,83],
+"text_8php.html#ab4a4c3d4700bc219bb84f33b499314f4":[5,0,0,69,86],
+"text_8php.html#ac19d2b33a58372a357a43d51eed19162":[5,0,0,69,56],
+"text_8php.html#ac1dbf2e37e8069bea2c0f557fdbf203e":[5,0,0,69,37],
+"text_8php.html#aca0f589be74fab1a460c57e88dad9779":[5,0,0,69,70],
+"text_8php.html#ace3c98538c63e09b70a363210b414112":[5,0,0,69,21],
+"text_8php.html#acedb584f65114a33f389efb796172a91":[5,0,0,69,2],
+"text_8php.html#ad6432621d0fafcbcf3d3b9b49bef7784":[5,0,0,69,13],
+"text_8php.html#ad855a32bee22c3f3b9734e3a334b96f2":[5,0,0,69,64],
+"text_8php.html#adba17ec946f4285285dc100f7860bf51":[5,0,0,69,51],
+"text_8php.html#ae17b39d5e321debd3ad16dcbbde842b8":[5,0,0,69,38],
+"text_8php.html#ae2126da85966da0e79c6bcbac63b0bda":[5,0,0,69,66],
+"text_8php.html#ae4282a39492caa23ccbc2ce98e54f110":[5,0,0,69,18],
+"text_8php.html#ae4df74296fbe55051ed3c035e55205e5":[5,0,0,69,57],
+"text_8php.html#ae4f6881d7e13623f8eded6277595112a":[5,0,0,69,25],
+"text_8php.html#af8a3e3a66a7b862d4510f145d2e13186":[5,0,0,69,0],
+"text_8php.html#af9c9ac3f74c82dc60acfa404d0e9dc53":[5,0,0,69,75],
+"text_8php.html#afc998d2796a6b2a08e96f7cc061e7221":[5,0,0,69,62],
+"text_8php.html#afdc69fe3f6c09e35e46304dcea63ae28":[5,0,0,69,22],
+"text_8php.html#afe18627c4983ee5f7c940a0992818cd5":[5,0,0,69,12],
+"text_8php.html#afe54312607d92f7ce9593f5760831f80":[5,0,0,69,58],
+"text_8php.html#afe9f178d264d44a94dc1292aaf0fd585":[5,0,0,69,53],
+"theme_2blogga_2php_2default_8php.html":[5,0,3,1,1,0,1],
+"theme_2blogga_2php_2default_8php.html#a1230ab83d4ec9785d8f3a966f33dc5f3":[5,0,3,1,1,0,1,2],
+"theme_2blogga_2php_2default_8php.html#a720581ae288aa09511670563e4205a4a":[5,0,3,1,1,0,1,0],
+"theme_2blogga_2php_2default_8php.html#ac7062908d1eb80c0735270f7997c4527":[5,0,3,1,1,0,1,1],
+"theme_2blogga_2php_2theme__init_8php.html":[5,0,3,1,1,0,3],
+"theme_2blogga_2view_2theme_2blog_2default_8php.html":[5,0,3,1,1,1,0,0,1],
+"theme_2blogga_2view_2theme_2blog_2default_8php.html#a1230ab83d4ec9785d8f3a966f33dc5f3":[5,0,3,1,1,1,0,0,1,2],
+"theme_2blogga_2view_2theme_2blog_2default_8php.html#a52d9dd070ed541729088395c22502539":[5,0,3,1,1,1,0,0,1,1],
+"theme_2blogga_2view_2theme_2blog_2default_8php.html#a720581ae288aa09511670563e4205a4a":[5,0,3,1,1,1,0,0,1,0],
+"theme_2redbasic_2php_2theme__init_8php.html":[5,0,3,1,2,0,3],
+"thing_8php.html":[5,0,1,102],
+"thing_8php.html#a24a35f1e64029a67fdbea94a776ae04b":[5,0,1,102,0],
+"thing_8php.html#a8be23b1d475ec3d9291999221c674c80":[5,0,1,102,1],
+"toggle__mobile_8php.html":[5,0,1,103],
+"toggle__mobile_8php.html#aca53ade8971802b45c31e722b22c6254":[5,0,1,103,0],
+"toggle__safesearch_8php.html":[5,0,1,104],
+"toggle__safesearch_8php.html#a23d5cfb2727a266e44993ffbf5595a79":[5,0,1,104,0],
+"tpldebug_8php.html":[5,0,2,8],
+"tpldebug_8php.html#a44778457a6c02554812fbfad19d32ba3":[5,0,2,8,0],
+"tpldebug_8php.html#a5358407d65f2ca826f96356a6642d149":[5,0,2,8,1],
+"tpldebug_8php.html#afbc7aadb3f7ff1edf0aaaa326a42179c":[5,0,2,8,2],
+"typo_8php.html":[5,0,2,9],
+"typo_8php.html#a1b709c1d79631ebc8320b41bda028b54":[5,0,2,9,1],
+"typo_8php.html#a329c9c12217d2c8660c47bbc7c8df4c5":[5,0,2,9,4],
+"typo_8php.html#a3ecd17ac846be1b35f3662f5c12ab6bd":[5,0,2,9,3],
+"typo_8php.html#a9590b15215a21e9b42eb546aeef79704":[5,0,2,9,2],
+"typo_8php.html#acebf83966ef6d7e5645a6b62ba368f9f":[5,0,2,9,0],
+"typohelper_8php.html":[5,0,2,10],
+"typohelper_8php.html#a7542d95618011800c61773127fa625cf":[5,0,2,10,0],
+"typohelper_8php.html#ab6fd357fb5b2a3ba8aab9e8b98c6a805":[5,0,2,10,1],
+"uexport_8php.html":[5,0,1,105],
+"uexport_8php.html#a118920137dedebe0581623a2e57e7b0d":[5,0,1,105,0],
+"update__channel_8php.html":[5,0,1,106],
+"update__channel_8php.html#aca52a9da500f0db2f0a8666af5bc06ba":[5,0,1,106,0],
+"update__community_8php.html":[5,0,1,107],
+"update__community_8php.html#abdcc5c4ecebbe0b5fcba2755c69cb3b1":[5,0,1,107,0],
+"update__display_8php.html":[5,0,1,108],
+"update__display_8php.html#aa36ac524059e209d5d75a03c16206246":[5,0,1,108,0],
+"update__network_8php.html":[5,0,1,109],
+"update__network_8php.html#a8abf5b9f65af6a27ee2f9d7207ed1b41":[5,0,1,109,0],
+"update__search_8php.html":[5,0,1,110],
+"update__search_8php.html#ace4c3a23fa7d6922399e27c297a6ba52":[5,0,1,110,0],
+"updatetpl_8py.html":[5,0,2,11],
+"updatetpl_8py.html#a52a85ffa6b6d63d840b185a133478c12":[5,0,2,11,5],
+"updatetpl_8py.html#a79c20eb62d568c999b56eb08530355d3":[5,0,2,11,2],
+"updatetpl_8py.html#a988d937ed5d5c2b592b763036af5cf94":[5,0,2,11,1],
+"updatetpl_8py.html#ab42dd79af65ee82201fd6f04715f62f6":[5,0,2,11,3],
+"updatetpl_8py.html#ac9d11279fed403a329a719298feafc4f":[5,0,2,11,0],
+"updatetpl_8py.html#ae694f5e1f25f8a92a945eb90c432dfe6":[5,0,2,11,4],
+"view_2theme_2apw_2php_2config_8php.html":[5,0,3,1,0,0,0],
+"view_2theme_2apw_2php_2config_8php.html#a8b51951a70e1c1324be71345a61d70ec":[5,0,3,1,0,0,0,0],
+"view_2theme_2apw_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d":[5,0,3,1,0,0,0,1],
+"view_2theme_2apw_2php_2config_8php.html#ad29461920cf03b9ce1428e21eb1f4ba6":[5,0,3,1,0,0,0,2],
+"view_2theme_2blogga_2php_2config_8php.html":[5,0,3,1,1,0,0],
+"view_2theme_2blogga_2php_2config_8php.html#a09cd81013505f83aea0771243a1e4e53":[5,0,3,1,1,0,0,1],
+"view_2theme_2blogga_2php_2config_8php.html#a8a311a402d3e746ce53fadc38e4b2d27":[5,0,3,1,1,0,0,0],
+"view_2theme_2blogga_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d":[5,0,3,1,1,0,0,3],
+"view_2theme_2blogga_2php_2config_8php.html#ad29461920cf03b9ce1428e21eb1f4ba6":[5,0,3,1,1,0,0,4],
+"view_2theme_2blogga_2php_2config_8php.html#aef2da5582b7cb6b5f63e5ca5d69fd30b":[5,0,3,1,1,0,0,2],
+"view_2theme_2blogga_2view_2theme_2blog_2config_8php.html":[5,0,3,1,1,1,0,0,0],
+"view_2theme_2blogga_2view_2theme_2blog_2config_8php.html#a09cd81013505f83aea0771243a1e4e53":[5,0,3,1,1,1,0,0,0,1],
+"view_2theme_2blogga_2view_2theme_2blog_2config_8php.html#a8a311a402d3e746ce53fadc38e4b2d27":[5,0,3,1,1,1,0,0,0,0],
+"view_2theme_2blogga_2view_2theme_2blog_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d":[5,0,3,1,1,1,0,0,0,3],
+"view_2theme_2blogga_2view_2theme_2blog_2config_8php.html#ad29461920cf03b9ce1428e21eb1f4ba6":[5,0,3,1,1,1,0,0,0,4],
+"view_2theme_2blogga_2view_2theme_2blog_2config_8php.html#aef2da5582b7cb6b5f63e5ca5d69fd30b":[5,0,3,1,1,1,0,0,0,2],
+"view_2theme_2redbasic_2php_2config_8php.html":[5,0,3,1,2,0,0],
+"view_2theme_2redbasic_2php_2config_8php.html#a8574a41fa9735ee391ba57ab24b93793":[5,0,3,1,2,0,0,0],
+"view_2theme_2redbasic_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d":[5,0,3,1,2,0,0,1],
+"view_2theme_2redbasic_2php_2config_8php.html#ad29461920cf03b9ce1428e21eb1f4ba6":[5,0,3,1,2,0,0,2],
+"view_8php.html":[5,0,1,111],
+"view_8php.html#ac168f6c61a91ba2063f13b441c0ae96e":[5,0,1,111,0],
+"viewconnections_8php.html":[5,0,1,112],
+"viewconnections_8php.html#a00163d50b17568f7b0e48b1ca9ab7330":[5,0,1,112,1],
+"viewconnections_8php.html#ab6c4d983e97b3a8a879567ff76507776":[5,0,1,112,0],
+"viewsrc_8php.html":[5,0,1,113],
+"viewsrc_8php.html#a6eff3d0c1d7d14b335c4edb785cd60a4":[5,0,1,113,0],
+"vote_8php.html":[5,0,1,114],
+"vote_8php.html#a57a9516ee1b923b224e66dcc47377fb2":[5,0,1,114,2],
+"vote_8php.html#a6aa67489bf458ca5e3206e46dac68596":[5,0,1,114,0],
+"vote_8php.html#ae0c6610f40afbbc1f4fe6494c51fbab2":[5,0,1,114,1],
+"wall__attach_8php.html":[5,0,1,115],
+"wall__attach_8php.html#a7385e970e93228d082f0fd7254f6e653":[5,0,1,115,0],
+"wall__upload_8php.html":[5,0,1,116],
+"wall__upload_8php.html#a7cbe204244cf9e0380ee932263a74d8f":[5,0,1,116,0],
+"webfinger_8php.html":[5,0,1,117],
+"webfinger_8php.html#a17dd28db6d390194bf9ecb809739d1d3":[5,0,1,117,0],
+"webpages_8php.html":[5,0,1,118],
+"webpages_8php.html#af3b7397d4abc153e3d2147740ee1a41d":[5,0,1,118,0],
+"wfinger_8php.html":[5,0,1,119],
+"wfinger_8php.html#ae21e50c8d0a5f3c9be9f43a4e519acd3":[5,0,1,119,0],
+"widedarkness_8php.html":[5,0,3,1,0,1,10],
+"widgets_8php.html":[5,0,0,70],
+"widgets_8php.html#a08035db02ff6a23260146b4c64153422":[5,0,0,70,7],
+"widgets_8php.html#a0d404276fedc59f5038cf5c085028326":[5,0,0,70,19],
+"widgets_8php.html#a145ff35319cfa47a9cc07f9425bd674b":[5,0,0,70,4],
+"widgets_8php.html#a268b01ce1ab8fe2cb346cb769b9d1091":[5,0,0,70,5],
+"widgets_8php.html#a3bdfb81bf9a8ddf219924fa7eaf22013":[5,0,0,70,13],
+"widgets_8php.html#a45ea061dabe9a8372e4ca3b9e5714256":[5,0,0,70,14],
+"widgets_8php.html#a5ab3b64496e02cab56429978ad55f1c0":[5,0,0,70,8],
+"widgets_8php.html#a6dbc227aac750774284ee39c45f0a200":[5,0,0,70,20],
+"widgets_8php.html#a702e2fc0adc9b615999eca18b7311b5e":[5,0,0,70,15],
+"widgets_8php.html#a70442dfa079312d9d5e5ee01be51a165":[5,0,0,70,11],
+"widgets_8php.html#a7b1e357b5a2027718470b77ec921fc65":[5,0,0,70,1],
+"widgets_8php.html#a94203eb9bcd63cbdecbbcb15163598d8":[5,0,0,70,17],
+"widgets_8php.html#a95c06bc9be133e89768746302d2ac395":[5,0,0,70,6],
+"widgets_8php.html#aa189a07241246d97efbee29f1c6a6f7f":[5,0,0,70,3],
+"widgets_8php.html#aaa73bcf1702eaadd9dcd253502f55e01":[5,0,0,70,18],
+"widgets_8php.html#abd2e508a2a0b911c4a838e3cb7599923":[5,0,0,70,16],
+"widgets_8php.html#abe03366fd22fd27d683518fa0765da50":[5,0,0,70,22],
+"widgets_8php.html#ad1bf7aa69e8d100d95faba17c7bc91cd":[5,0,0,70,10]
+};
diff --git a/doc/html/navtreeindex8.js b/doc/html/navtreeindex8.js
new file mode 100644
index 000000000..a3e1a251e
--- /dev/null
+++ b/doc/html/navtreeindex8.js
@@ -0,0 +1,49 @@
+var NAVTREEINDEX8 =
+{
+"widgets_8php.html#add9b24d3304e529a7975e96122315554":[5,0,0,70,0],
+"widgets_8php.html#ade630b19fb4c622b7b2f6f8ef89eefa2":[5,0,0,70,9],
+"widgets_8php.html#ae4ced69d83dbdd9e6b51660d9eba8653":[5,0,0,70,21],
+"widgets_8php.html#af37fdad3b2e861d860a4a8c4d8a76c0b":[5,0,0,70,2],
+"widgets_8php.html#afa2e55a78f95667a6da082efac7fec74":[5,0,0,70,12],
+"xchan_8php.html":[5,0,1,120],
+"xchan_8php.html#a9853348bf1a35c644460221ba75edc2d":[5,0,1,120,0],
+"xrd_8php.html":[5,0,1,121],
+"xrd_8php.html#aee3cf087968e4a0ff3a87de16eb23270":[5,0,1,121,0],
+"xref_8php.html":[5,0,1,122],
+"xref_8php.html#a9bee399213b8de8226b0d60834307473":[5,0,1,122,0],
+"zfinger_8php.html":[5,0,1,123],
+"zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0":[5,0,1,123,0],
+"zot_8php.html":[5,0,0,71],
+"zot_8php.html#a083aec6c900d244e1bfc1406f9461465":[5,0,0,71,13],
+"zot_8php.html#a2657e141d62d5f67ad3c87651b585299":[5,0,0,71,7],
+"zot_8php.html#a31aad56acf8ff8f2353e6ff8595544df":[5,0,0,71,15],
+"zot_8php.html#a37ec13b18057634eadb071f05297f5e1":[5,0,0,71,10],
+"zot_8php.html#a3862b3161b2c8557dc1a95020179bd81":[5,0,0,71,17],
+"zot_8php.html#a3bf11286c2619b4ca28e49d5b5ab374a":[5,0,0,71,5],
+"zot_8php.html#a55056e863a7860bc0cf922e78fcce073":[5,0,0,71,21],
+"zot_8php.html#a56f3f65514e4e7f0cd117d01735aebd1":[5,0,0,71,8],
+"zot_8php.html#a5bcdfef419b16075a0eca990956223dc":[5,0,0,71,26],
+"zot_8php.html#a61cdc1ec843663c423ed2d8160ae5aea":[5,0,0,71,18],
+"zot_8php.html#a703f528ade8382cf374e4119bd6f7859":[5,0,0,71,0],
+"zot_8php.html#a7b23bfb31d4491231e1e73bdc077240d":[5,0,0,71,25],
+"zot_8php.html#a8e22dbc6f884be3644a892a876cbd972":[5,0,0,71,3],
+"zot_8php.html#a928f5643ca66ae9635d85aeb2be62e03":[5,0,0,71,24],
+"zot_8php.html#a95528377d7303131958c9f0b7158fdce":[5,0,0,71,19],
+"zot_8php.html#a9a57b40669351c9791126b925cb7ef3b":[5,0,0,71,12],
+"zot_8php.html#aa6ae96db8cbbdbb10e6876d206bbf7cc":[5,0,0,71,11],
+"zot_8php.html#aad25a3fe0e1566121d6fb8222979bc10":[5,0,0,71,14],
+"zot_8php.html#ab22d67660702056bf3f4696dcebf5ce7":[5,0,0,71,23],
+"zot_8php.html#ab319d1d9fff9c7775d9daef42d1f33dd":[5,0,0,71,16],
+"zot_8php.html#ab3e9b99ddb11353f37f265a05bb42142":[5,0,0,71,27],
+"zot_8php.html#ac301c67864917c35922257950ae0f95c":[5,0,0,71,9],
+"zot_8php.html#ac34e479d27f32b82dd6b33542f81a6a7":[5,0,0,71,1],
+"zot_8php.html#ad149f1e98c0c5b88ff9147e6ee3f330d":[5,0,0,71,4],
+"zot_8php.html#adfeb9400ae6b726beec89f8f1e8fde72":[5,0,0,71,2],
+"zot_8php.html#ae7cec2b417b5858fd4a41070f843d1d7":[5,0,0,71,20],
+"zot_8php.html#aeea071f17e306fe3d0c488551906bfab":[5,0,0,71,22],
+"zot_8php.html#aeec89da5b6ff090c63a79de4de884a35":[5,0,0,71,6],
+"zotfeed_8php.html":[5,0,1,124],
+"zotfeed_8php.html#a24dfc23d366e7f840cf2847d0c1c8eac":[5,0,1,124,0],
+"zping_8php.html":[5,0,1,125],
+"zping_8php.html#a4d3a6b0b8b04ed6469015823e615ee75":[5,0,1,125,0]
+};
diff --git a/doc/html/new__channel_8php.html b/doc/html/new__channel_8php.html
new file mode 100644
index 000000000..90ff4a197
--- /dev/null
+++ b/doc/html/new__channel_8php.html
@@ -0,0 +1,173 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/new_channel.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('new__channel_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">new_channel.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a1ad7f99e4366a32942c6b954aba3a164"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="new__channel_8php.html#a1ad7f99e4366a32942c6b954aba3a164">new_channel_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a1ad7f99e4366a32942c6b954aba3a164"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a180b0646957db8290482f02454ad7f23"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="new__channel_8php.html#a180b0646957db8290482f02454ad7f23">new_channel_post</a> (&amp;$a)</td></tr>
+<tr class="separator:a180b0646957db8290482f02454ad7f23"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae585191610f79da129492482ce8e2fee"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="new__channel_8php.html#ae585191610f79da129492482ce8e2fee">new_channel_content</a> (&amp;$a)</td></tr>
+<tr class="separator:ae585191610f79da129492482ce8e2fee"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="ae585191610f79da129492482ce8e2fee"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">new_channel_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a1ad7f99e4366a32942c6b954aba3a164"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">new_channel_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a180b0646957db8290482f02454ad7f23"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">new_channel_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/new__channel_8php.js b/doc/html/new__channel_8php.js
new file mode 100644
index 000000000..b087d0df8
--- /dev/null
+++ b/doc/html/new__channel_8php.js
@@ -0,0 +1,6 @@
+var new__channel_8php =
+[
+ [ "new_channel_content", "new__channel_8php.html#ae585191610f79da129492482ce8e2fee", null ],
+ [ "new_channel_init", "new__channel_8php.html#a1ad7f99e4366a32942c6b954aba3a164", null ],
+ [ "new_channel_post", "new__channel_8php.html#a180b0646957db8290482f02454ad7f23", null ]
+]; \ No newline at end of file
diff --git a/doc/html/nogroup_8php.html b/doc/html/nogroup_8php.html
new file mode 100644
index 000000000..313b10074
--- /dev/null
+++ b/doc/html/nogroup_8php.html
@@ -0,0 +1,155 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/nogroup.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('nogroup_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">nogroup.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a099cb353bf62e8453069ce107b763212"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="nogroup_8php.html#a099cb353bf62e8453069ce107b763212">nogroup_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a099cb353bf62e8453069ce107b763212"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a52085b183f97c552f1db5c4926e8ec30"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="nogroup_8php.html#a52085b183f97c552f1db5c4926e8ec30">nogroup_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a52085b183f97c552f1db5c4926e8ec30"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a52085b183f97c552f1db5c4926e8ec30"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">nogroup_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a099cb353bf62e8453069ce107b763212"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">nogroup_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/nogroup_8php.js b/doc/html/nogroup_8php.js
new file mode 100644
index 000000000..73cbeccad
--- /dev/null
+++ b/doc/html/nogroup_8php.js
@@ -0,0 +1,5 @@
+var nogroup_8php =
+[
+ [ "nogroup_content", "nogroup_8php.html#a52085b183f97c552f1db5c4926e8ec30", null ],
+ [ "nogroup_init", "nogroup_8php.html#a099cb353bf62e8453069ce107b763212", null ]
+]; \ No newline at end of file
diff --git a/doc/html/none_8php.html b/doc/html/none_8php.html
new file mode 100644
index 000000000..b844d9f92
--- /dev/null
+++ b/doc/html/none_8php.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/php/none.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('none_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">none.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/notes_8php.html b/doc/html/notes_8php.html
new file mode 100644
index 000000000..55c8c2cae
--- /dev/null
+++ b/doc/html/notes_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/notes.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('notes_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">notes.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a4dbd7b1f906440746af48b484d66535a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="notes_8php.html#a4dbd7b1f906440746af48b484d66535a">notes_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a4dbd7b1f906440746af48b484d66535a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a4dbd7b1f906440746af48b484d66535a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">notes_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/notes_8php.js b/doc/html/notes_8php.js
new file mode 100644
index 000000000..d0433afa8
--- /dev/null
+++ b/doc/html/notes_8php.js
@@ -0,0 +1,4 @@
+var notes_8php =
+[
+ [ "notes_init", "notes_8php.html#a4dbd7b1f906440746af48b484d66535a", null ]
+]; \ No newline at end of file
diff --git a/doc/html/notifications_8php.html b/doc/html/notifications_8php.html
new file mode 100644
index 000000000..92995ca3d
--- /dev/null
+++ b/doc/html/notifications_8php.html
@@ -0,0 +1,155 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/notifications.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('notifications_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">notifications.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a5baffec7b2e625c9f9cefbc097550d33"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="notifications_8php.html#a5baffec7b2e625c9f9cefbc097550d33">notifications_post</a> (&amp;$a)</td></tr>
+<tr class="separator:a5baffec7b2e625c9f9cefbc097550d33"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aadd0b5525bd8c283a5d8a37982bbfe62"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="notifications_8php.html#aadd0b5525bd8c283a5d8a37982bbfe62">notifications_content</a> (&amp;$a)</td></tr>
+<tr class="separator:aadd0b5525bd8c283a5d8a37982bbfe62"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="aadd0b5525bd8c283a5d8a37982bbfe62"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">notifications_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a5baffec7b2e625c9f9cefbc097550d33"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">notifications_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/notifications_8php.js b/doc/html/notifications_8php.js
new file mode 100644
index 000000000..f4360984e
--- /dev/null
+++ b/doc/html/notifications_8php.js
@@ -0,0 +1,5 @@
+var notifications_8php =
+[
+ [ "notifications_content", "notifications_8php.html#aadd0b5525bd8c283a5d8a37982bbfe62", null ],
+ [ "notifications_post", "notifications_8php.html#a5baffec7b2e625c9f9cefbc097550d33", null ]
+]; \ No newline at end of file
diff --git a/doc/html/notifier_8php.html b/doc/html/notifier_8php.html
new file mode 100644
index 000000000..9cccb089c
--- /dev/null
+++ b/doc/html/notifier_8php.html
@@ -0,0 +1,147 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/notifier.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('notifier_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">notifier.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a568c502f626cff95e344c0748938b85d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="notifier_8php.html#a568c502f626cff95e344c0748938b85d">notifier_run</a> ($<a class="el" href="boot_8php.html#a768f00b7d66be0daf7ef4eea2e862006">argv</a>, $<a class="el" href="boot_8php.html#abc0a90a1a77f5b668aa7e4b57d1776a7">argc</a>)</td></tr>
+<tr class="separator:a568c502f626cff95e344c0748938b85d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a568c502f626cff95e344c0748938b85d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">notifier_run </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$argv</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$argc</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/notifier_8php.js b/doc/html/notifier_8php.js
new file mode 100644
index 000000000..a06169542
--- /dev/null
+++ b/doc/html/notifier_8php.js
@@ -0,0 +1,4 @@
+var notifier_8php =
+[
+ [ "notifier_run", "notifier_8php.html#a568c502f626cff95e344c0748938b85d", null ]
+]; \ No newline at end of file
diff --git a/doc/html/oauth_8php.html b/doc/html/oauth_8php.html
new file mode 100644
index 000000000..a9e782687
--- /dev/null
+++ b/doc/html/oauth_8php.html
@@ -0,0 +1,160 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/oauth.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('oauth_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Classes</a> &#124;
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle">
+<div class="title">oauth.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classFKOAuthDataStore.html">FKOAuthDataStore</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classFKOAuth1.html">FKOAuth1</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:a7a32a5990f113ac9465b03b29175cf16"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="oauth_8php.html#a7a32a5990f113ac9465b03b29175cf16">REQUEST_TOKEN_DURATION</a> 300</td></tr>
+<tr class="separator:a7a32a5990f113ac9465b03b29175cf16"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad343cab37aa860d2d14dc86b7f5ca0c6"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="oauth_8php.html#ad343cab37aa860d2d14dc86b7f5ca0c6">ACCESS_TOKEN_DURATION</a> 31536000</td></tr>
+<tr class="separator:ad343cab37aa860d2d14dc86b7f5ca0c6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Variable Documentation</h2>
+<a class="anchor" id="ad343cab37aa860d2d14dc86b7f5ca0c6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ACCESS_TOKEN_DURATION 31536000</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classFKOAuthDataStore.html#a434882f03e3cdb171ed89e09e337e934">FKOAuthDataStore\new_access_token()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a7a32a5990f113ac9465b03b29175cf16"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const REQUEST_TOKEN_DURATION 300</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>OAuth server Based on oauth2-php <a href="http://code.google.com/p/oauth2-php/">http://code.google.com/p/oauth2-php/</a> </p>
+
+<p>Referenced by <a class="el" href="classFKOAuthDataStore.html#a431b44d70e3da6a8256ab38f710e3050">FKOAuthDataStore\new_request_token()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/oauth_8php.js b/doc/html/oauth_8php.js
new file mode 100644
index 000000000..da8061a29
--- /dev/null
+++ b/doc/html/oauth_8php.js
@@ -0,0 +1,7 @@
+var oauth_8php =
+[
+ [ "FKOAuthDataStore", "classFKOAuthDataStore.html", "classFKOAuthDataStore" ],
+ [ "FKOAuth1", "classFKOAuth1.html", "classFKOAuth1" ],
+ [ "ACCESS_TOKEN_DURATION", "oauth_8php.html#ad343cab37aa860d2d14dc86b7f5ca0c6", null ],
+ [ "REQUEST_TOKEN_DURATION", "oauth_8php.html#a7a32a5990f113ac9465b03b29175cf16", null ]
+]; \ No newline at end of file
diff --git a/doc/html/oexchange_8php.html b/doc/html/oexchange_8php.html
new file mode 100644
index 000000000..7207c36be
--- /dev/null
+++ b/doc/html/oexchange_8php.html
@@ -0,0 +1,155 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/oexchange.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('oexchange_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">oexchange.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ac8e2e469ddc3db984b0c1b44558aca59"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="oexchange_8php.html#ac8e2e469ddc3db984b0c1b44558aca59">oexchange_init</a> (&amp;$a)</td></tr>
+<tr class="separator:ac8e2e469ddc3db984b0c1b44558aca59"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2d8b785cd7d041a4e6274f5af370cf26"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="oexchange_8php.html#a2d8b785cd7d041a4e6274f5af370cf26">oexchange_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a2d8b785cd7d041a4e6274f5af370cf26"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a2d8b785cd7d041a4e6274f5af370cf26"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">oexchange_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ac8e2e469ddc3db984b0c1b44558aca59"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">oexchange_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/oexchange_8php.js b/doc/html/oexchange_8php.js
new file mode 100644
index 000000000..1bf271058
--- /dev/null
+++ b/doc/html/oexchange_8php.js
@@ -0,0 +1,5 @@
+var oexchange_8php =
+[
+ [ "oexchange_content", "oexchange_8php.html#a2d8b785cd7d041a4e6274f5af370cf26", null ],
+ [ "oexchange_init", "oexchange_8php.html#ac8e2e469ddc3db984b0c1b44558aca59", null ]
+]; \ No newline at end of file
diff --git a/doc/html/olddefault_8php.html b/doc/html/olddefault_8php.html
new file mode 100644
index 000000000..d7a533f92
--- /dev/null
+++ b/doc/html/olddefault_8php.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/apw/schema/olddefault.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('olddefault_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">olddefault.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/onedirsync_8php.html b/doc/html/onedirsync_8php.html
new file mode 100644
index 000000000..21915dc38
--- /dev/null
+++ b/doc/html/onedirsync_8php.html
@@ -0,0 +1,147 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/onedirsync.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('onedirsync_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">onedirsync.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a411aedd47c57476099647961e6a86691"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="onedirsync_8php.html#a411aedd47c57476099647961e6a86691">onedirsync_run</a> ($<a class="el" href="boot_8php.html#a768f00b7d66be0daf7ef4eea2e862006">argv</a>, $<a class="el" href="boot_8php.html#abc0a90a1a77f5b668aa7e4b57d1776a7">argc</a>)</td></tr>
+<tr class="separator:a411aedd47c57476099647961e6a86691"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a411aedd47c57476099647961e6a86691"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">onedirsync_run </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$argv</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$argc</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/onedirsync_8php.js b/doc/html/onedirsync_8php.js
new file mode 100644
index 000000000..06f15a3c2
--- /dev/null
+++ b/doc/html/onedirsync_8php.js
@@ -0,0 +1,4 @@
+var onedirsync_8php =
+[
+ [ "onedirsync_run", "onedirsync_8php.html#a411aedd47c57476099647961e6a86691", null ]
+]; \ No newline at end of file
diff --git a/doc/html/onepoll_8php.html b/doc/html/onepoll_8php.html
new file mode 100644
index 000000000..812fd6fbd
--- /dev/null
+++ b/doc/html/onepoll_8php.html
@@ -0,0 +1,147 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/onepoll.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('onepoll_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">onepoll.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a72753b2fdec79b37c7f432035c91fb6d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="onepoll_8php.html#a72753b2fdec79b37c7f432035c91fb6d">onepoll_run</a> ($<a class="el" href="boot_8php.html#a768f00b7d66be0daf7ef4eea2e862006">argv</a>, $<a class="el" href="boot_8php.html#abc0a90a1a77f5b668aa7e4b57d1776a7">argc</a>)</td></tr>
+<tr class="separator:a72753b2fdec79b37c7f432035c91fb6d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a72753b2fdec79b37c7f432035c91fb6d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">onepoll_run </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$argv</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$argc</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/onepoll_8php.js b/doc/html/onepoll_8php.js
new file mode 100644
index 000000000..7624f85df
--- /dev/null
+++ b/doc/html/onepoll_8php.js
@@ -0,0 +1,4 @@
+var onepoll_8php =
+[
+ [ "onepoll_run", "onepoll_8php.html#a72753b2fdec79b37c7f432035c91fb6d", null ]
+]; \ No newline at end of file
diff --git a/doc/html/open.png b/doc/html/open.png
new file mode 100644
index 000000000..30f75c7ef
--- /dev/null
+++ b/doc/html/open.png
Binary files differ
diff --git a/doc/html/opensearch_8php.html b/doc/html/opensearch_8php.html
new file mode 100644
index 000000000..6cba2519b
--- /dev/null
+++ b/doc/html/opensearch_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/opensearch.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('opensearch_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">opensearch.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ad13034877a496565ac7d99e9fc6f55e9"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="opensearch_8php.html#ad13034877a496565ac7d99e9fc6f55e9">opensearch_init</a> (&amp;$a)</td></tr>
+<tr class="separator:ad13034877a496565ac7d99e9fc6f55e9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="ad13034877a496565ac7d99e9fc6f55e9"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">opensearch_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/opensearch_8php.js b/doc/html/opensearch_8php.js
new file mode 100644
index 000000000..e9492cfcb
--- /dev/null
+++ b/doc/html/opensearch_8php.js
@@ -0,0 +1,4 @@
+var opensearch_8php =
+[
+ [ "opensearch_init", "opensearch_8php.html#ad13034877a496565ac7d99e9fc6f55e9", null ]
+]; \ No newline at end of file
diff --git a/doc/html/page_8php.html b/doc/html/page_8php.html
new file mode 100644
index 000000000..462d8a853
--- /dev/null
+++ b/doc/html/page_8php.html
@@ -0,0 +1,155 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/page.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('page_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">page.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a4d89800c0366a239191b1692c09635cf"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="page_8php.html#a4d89800c0366a239191b1692c09635cf">page_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a4d89800c0366a239191b1692c09635cf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a91a5f649f68406149108bded1dc90b22"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="page_8php.html#a91a5f649f68406149108bded1dc90b22">page_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a91a5f649f68406149108bded1dc90b22"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a91a5f649f68406149108bded1dc90b22"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">page_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a4d89800c0366a239191b1692c09635cf"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">page_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/page_8php.js b/doc/html/page_8php.js
new file mode 100644
index 000000000..de145d448
--- /dev/null
+++ b/doc/html/page_8php.js
@@ -0,0 +1,5 @@
+var page_8php =
+[
+ [ "page_content", "page_8php.html#a91a5f649f68406149108bded1dc90b22", null ],
+ [ "page_init", "page_8php.html#a4d89800c0366a239191b1692c09635cf", null ]
+]; \ No newline at end of file
diff --git a/doc/html/page__widgets_8php.html b/doc/html/page__widgets_8php.html
new file mode 100644
index 000000000..b40ab3c50
--- /dev/null
+++ b/doc/html/page__widgets_8php.html
@@ -0,0 +1,177 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/page_widgets.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('page__widgets_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">page_widgets.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a1a1e729da27f252cab6678288a17958f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="page__widgets_8php.html#a1a1e729da27f252cab6678288a17958f">writepages_widget</a> ($who, $which)</td></tr>
+<tr class="separator:a1a1e729da27f252cab6678288a17958f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad82011c1ed90d9de8b9f34c12af5c6f0"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="page__widgets_8php.html#ad82011c1ed90d9de8b9f34c12af5c6f0">pagelist_widget</a> ($chan, $who)</td></tr>
+<tr class="separator:ad82011c1ed90d9de8b9f34c12af5c6f0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="ad82011c1ed90d9de8b9f34c12af5c6f0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">pagelist_widget </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$chan</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$who</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a1a1e729da27f252cab6678288a17958f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">writepages_widget </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$who</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$which</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="page_8php.html#a91a5f649f68406149108bded1dc90b22">page_content()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/page__widgets_8php.js b/doc/html/page__widgets_8php.js
new file mode 100644
index 000000000..c6b011186
--- /dev/null
+++ b/doc/html/page__widgets_8php.js
@@ -0,0 +1,5 @@
+var page__widgets_8php =
+[
+ [ "pagelist_widget", "page__widgets_8php.html#ad82011c1ed90d9de8b9f34c12af5c6f0", null ],
+ [ "writepages_widget", "page__widgets_8php.html#a1a1e729da27f252cab6678288a17958f", null ]
+]; \ No newline at end of file
diff --git a/doc/html/pages.html b/doc/html/pages.html
new file mode 100644
index 000000000..c120de869
--- /dev/null
+++ b/doc/html/pages.html
@@ -0,0 +1,113 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Related Pages</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('pages.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">Related Pages</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock">Here is a list of all related documentation pages:</div><div class="directory">
+<table class="directory">
+<tr id="row_0_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_config.html" target="_self">CLI config utility</a></td><td class="desc"></td></tr>
+<tr id="row_1_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_fresh.html" target="_self">Fresh - The Freaking REd Shell</a></td><td class="desc"></td></tr>
+<tr id="row_2_" class="even"><td class="entry"><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><a class="el" href="md_README.html" target="_self">apw</a></td><td class="desc"></td></tr>
+</table>
+</div><!-- directory -->
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/parse__url_8php.html b/doc/html/parse__url_8php.html
new file mode 100644
index 000000000..7dc41c44c
--- /dev/null
+++ b/doc/html/parse__url_8php.html
@@ -0,0 +1,215 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/parse_url.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('parse__url_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">parse_url.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a496f4e3836154f6f32b8e805a7160d3a"><td class="memItemLeft" align="right" valign="top"><a class="el" href="redbasic_2php_2style_8php.html#a883f9f14e205f7aa7de02c14df67b40a">if</a>(!function_exists('<a class="el" href="html2bbcode_8php.html#a71a07f135d196ec5943b13f7b2e6a9b2">deletenode</a>'))&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="parse__url_8php.html#a496f4e3836154f6f32b8e805a7160d3a">completeurl</a> ($url, $scheme)</td></tr>
+<tr class="separator:a496f4e3836154f6f32b8e805a7160d3a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a25635549f2c22955d72465f4d2e58993"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="parse__url_8php.html#a25635549f2c22955d72465f4d2e58993">parseurl_getsiteinfo</a> ($url)</td></tr>
+<tr class="separator:a25635549f2c22955d72465f4d2e58993"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa7dd8f961bea042d62726ed909e4a868"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="parse__url_8php.html#aa7dd8f961bea042d62726ed909e4a868">arr_add_hashes</a> (&amp;$item, $k)</td></tr>
+<tr class="separator:aa7dd8f961bea042d62726ed909e4a868"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a05a9e8944380ba3cf6bbf5893dd4b74b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="parse__url_8php.html#a05a9e8944380ba3cf6bbf5893dd4b74b">parse_url_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a05a9e8944380ba3cf6bbf5893dd4b74b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="aa7dd8f961bea042d62726ed909e4a868"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">arr_add_hashes </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$item</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$k</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a496f4e3836154f6f32b8e805a7160d3a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="redbasic_2php_2style_8php.html#a883f9f14e205f7aa7de02c14df67b40a">if</a> (!function_exists('<a class="el" href="html2bbcode_8php.html#a71a07f135d196ec5943b13f7b2e6a9b2">deletenode</a>')) completeurl </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$url</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$scheme</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="parse__url_8php.html#a25635549f2c22955d72465f4d2e58993">parseurl_getsiteinfo()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a05a9e8944380ba3cf6bbf5893dd4b74b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">parse_url_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a25635549f2c22955d72465f4d2e58993"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">parseurl_getsiteinfo </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$url</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="parse__url_8php.html#a05a9e8944380ba3cf6bbf5893dd4b74b">parse_url_content()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/parse__url_8php.js b/doc/html/parse__url_8php.js
new file mode 100644
index 000000000..a30c00e5b
--- /dev/null
+++ b/doc/html/parse__url_8php.js
@@ -0,0 +1,7 @@
+var parse__url_8php =
+[
+ [ "arr_add_hashes", "parse__url_8php.html#aa7dd8f961bea042d62726ed909e4a868", null ],
+ [ "completeurl", "parse__url_8php.html#a496f4e3836154f6f32b8e805a7160d3a", null ],
+ [ "parse_url_content", "parse__url_8php.html#a05a9e8944380ba3cf6bbf5893dd4b74b", null ],
+ [ "parseurl_getsiteinfo", "parse__url_8php.html#a25635549f2c22955d72465f4d2e58993", null ]
+]; \ No newline at end of file
diff --git a/doc/html/passion_8php.html b/doc/html/passion_8php.html
new file mode 100644
index 000000000..18df80d20
--- /dev/null
+++ b/doc/html/passion_8php.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/apw/schema/passion.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('passion_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">passion.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/passionwide_8php.html b/doc/html/passionwide_8php.html
new file mode 100644
index 000000000..d7e908cb2
--- /dev/null
+++ b/doc/html/passionwide_8php.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/apw/schema/passionwide.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('passionwide_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">passionwide.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/permissions_8php.html b/doc/html/permissions_8php.html
new file mode 100644
index 000000000..2d4740310
--- /dev/null
+++ b/doc/html/permissions_8php.html
@@ -0,0 +1,274 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/permissions.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('permissions_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">permissions.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a040fd3d3b8517658b1668ae0cd093972"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="permissions_8php.html#a040fd3d3b8517658b1668ae0cd093972">get_perms</a> ()</td></tr>
+<tr class="separator:a040fd3d3b8517658b1668ae0cd093972"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aeca9b280f3dc3358c89976d81d690008"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="permissions_8php.html#aeca9b280f3dc3358c89976d81d690008">get_all_perms</a> ($uid, $observer_xchan, $internal_use=true)</td></tr>
+<tr class="separator:aeca9b280f3dc3358c89976d81d690008"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a67ada9ed51e77885b6b0f6a28cee1835"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="permissions_8php.html#a67ada9ed51e77885b6b0f6a28cee1835">perm_is_allowed</a> ($uid, $observer_xchan, $permission)</td></tr>
+<tr class="separator:a67ada9ed51e77885b6b0f6a28cee1835"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0f5bd9f7f4c8fb7ba4b2c1ed048b4dc7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="permissions_8php.html#a0f5bd9f7f4c8fb7ba4b2c1ed048b4dc7">check_list_permissions</a> ($uid, $arr, $perm)</td></tr>
+<tr class="separator:a0f5bd9f7f4c8fb7ba4b2c1ed048b4dc7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa8b7b102c653649d7a71b5a1c044d90d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="permissions_8php.html#aa8b7b102c653649d7a71b5a1c044d90d">site_default_perms</a> ()</td></tr>
+<tr class="separator:aa8b7b102c653649d7a71b5a1c044d90d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a0f5bd9f7f4c8fb7ba4b2c1ed048b4dc7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">check_list_permissions </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$perm</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a01e3cf44e082fa9bd06dcde5bf713d70">collect_recipients()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aeca9b280f3dc3358c89976d81d690008"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_all_perms </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$observer_xchan</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$internal_use</em> = <code>true</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>get_all_perms($uid,$observer_xchan)</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">$uid</td><td>: The channel_id associated with the resource owner </td></tr>
+ <tr><td class="paramname">$observer_xchan,:</td><td>The xchan_hash representing the observer</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>: array of all permissions, key is permission name, value is true or false </dd></dl>
+
+<p>Referenced by <a class="el" href="achievements_8php.html#a35ae04ada0e227d19671f289a32fb30e">achievements_content()</a>, <a class="el" href="blocks_8php.html#a2531a8fd51db3cecb2eb20c002c66e12">blocks_content()</a>, <a class="el" href="security_8php.html#a8d23d2597aae380a3341872fe9513380">change_channel()</a>, <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>, <a class="el" href="connedit_8php.html#a795acb3d9d841f55c255d7611681ab67">connedit_content()</a>, <a class="el" href="editblock_8php.html#abbe8f55de06967bc8d79d620509a49e6">editblock_content()</a>, <a class="el" href="editlayout_8php.html#aa877e4157a26b099de904164181dd386">editlayout_content()</a>, <a class="el" href="editwebpage_8php.html#a375e945255fad79a71036528f7480650">editwebpage_content()</a>, <a class="el" href="filestorage_8php.html#a61bb1be78472555df4ce619f51014040">filestorage_content()</a>, <a class="el" href="layouts_8php.html#a6e0193759ad9eef76d3df2db24237b50">layouts_content()</a>, <a class="el" href="page_8php.html#a91a5f649f68406149108bded1dc90b22">page_content()</a>, <a class="el" href="webpages_8php.html#af3b7397d4abc153e3d2147740ee1a41d">webpages_content()</a>, and <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a040fd3d3b8517658b1668ae0cd093972"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_perms </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="connedit_8php.html#a795acb3d9d841f55c255d7611681ab67">connedit_content()</a>, <a class="el" href="identity_8php.html#a345f4c943d84de502ec6e72d2c813945">create_identity()</a>, <a class="el" href="permissions_8php.html#aeca9b280f3dc3358c89976d81d690008">get_all_perms()</a>, <a class="el" href="mail_8php.html#acfc2cc0bf4e0b178207758384977f25a">mail_post()</a>, <a class="el" href="include_2follow_8php.html#ae387d4ae097c23d69f3247e7f08140c7">new_contact()</a>, <a class="el" href="permissions_8php.html#a67ada9ed51e77885b6b0f6a28cee1835">perm_is_allowed()</a>, <a class="el" href="permissions_8php.html#aa8b7b102c653649d7a71b5a1c044d90d">site_default_perms()</a>, and <a class="el" href="zot_8php.html#a7b23bfb31d4491231e1e73bdc077240d">zot_refresh()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a67ada9ed51e77885b6b0f6a28cee1835"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">perm_is_allowed </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$observer_xchan</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$permission</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classConversation.html#a8335cdd43f1836e3c255638e61a09e16">Conversation\add_thread()</a>, <a class="el" href="identity_8php.html#aa870d2c1f558cfd52bef05bc124e8fa4">advanced_profile()</a>, <a class="el" href="include_2api_8php.html#a528d8070ee74ea800102936ce73cf366">api_statuses_home_timeline()</a>, <a class="el" href="include_2api_8php.html#ae0fa388479cace9c5a7a45b571ab42f8">api_statuses_repeat()</a>, <a class="el" href="include_2attach_8php.html#a0d07c5b83d3d54e186f752e571847b36">attach_by_hash()</a>, <a class="el" href="include_2attach_8php.html#ad991208ce939387e2f93a3bce7d09932">attach_by_hash_nodata()</a>, <a class="el" href="include_2attach_8php.html#a887d2d44a3ef18dcb6624e7fb58dc8e3">attach_count_files()</a>, <a class="el" href="include_2attach_8php.html#a3634af95f11a023dd8e882c3c7a3600d">attach_list_files()</a>, <a class="el" href="include_2attach_8php.html#ab6830b3ab74a5d284876141ac80f6cbc">attach_mkdir()</a>, <a class="el" href="include_2attach_8php.html#a84a8a64c4805e1525b42d4add464833f">attach_store()</a>, <a class="el" href="permissions_8php.html#a0f5bd9f7f4c8fb7ba4b2c1ed048b4dc7">check_list_permissions()</a>, <a class="el" href="common_8php.html#ab63408f39abef7a6915186e8dabc5a96">common_content()</a>, <a class="el" href="contact__widgets_8php.html#a552f8544528cec0c995cea7287ea9d65">common_friends_visitor_widget()</a>, <a class="el" href="classRedDirectory.html#a986936910f0216887a25e28916c166c7">RedDirectory\createDirectory()</a>, <a class="el" href="classRedDirectory.html#a2d12d99d38a6a75fc9a830b2f7fc0bf0">RedDirectory\createFile()</a>, <a class="el" href="classRedFile.html#aef71c9eaac7052be7dc8602eb12171e7">RedFile\delete()</a>, <a class="el" href="items_8php.html#a04a35b610acfe54434df08adec39c0c7">get_feed_for()</a>, <a class="el" href="classRedDirectory.html#aaa20f0f44da23781917af8170c0a2569">RedDirectory\getChild()</a>, <a class="el" href="classRedDirectory.html#aa42d3065f6f065b17db87146a7cb031a">RedDirectory\getChildren()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="like_8php.html#a9d7dd268f21c21e9d29dd2aca2dd9538">like_content()</a>, <a class="el" href="photo_8php.html#a582779d24882b0d31ee909a91d70a448">photo_init()</a>, <a class="el" href="include_2photos_8php.html#a6c40ef58aefef705a5adc84a40e97109">photo_upload()</a>, <a class="el" href="include_2photos_8php.html#af24c6aeed28ecc31ec39e7d9a1804979">photos_album_widget()</a>, <a class="el" href="include_2photos_8php.html#aedccaf18282b26899d9549c29bd9d1b9">photos_albums_list()</a>, <a class="el" href="mod_2photos_8php.html#aa87382611a66ec5effdb2d78f13f5812">photos_content()</a>, <a class="el" href="include_2photos_8php.html#aa27b9e435dcc34e1009f56dc02c7ca51">photos_list_photos()</a>, <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>, <a class="el" href="poco_8php.html#a53def16f75e3d41f1d2bb7cfa4905498">poco_init()</a>, <a class="el" href="items_8php.html#a410f9c743877c125ca06312373346903">post_activity_item()</a>, <a class="el" href="zot_8php.html#a37ec13b18057634eadb071f05297f5e1">process_delivery()</a>, <a class="el" href="zot_8php.html#aa6ae96db8cbbdbb10e6876d206bbf7cc">process_mail_delivery()</a>, <a class="el" href="profile_8php.html#a3775cf6eef6587e5143133356a7b76c0">profile_content()</a>, <a class="el" href="identity_8php.html#a4751b522ea913d0e7ed43e03d22e9e68">profile_load()</a>, <a class="el" href="identity_8php.html#a432259b2cf5b6f59be53e71db9f2c7dc">profile_sidebar()</a>, <a class="el" href="reddav_8php.html#ae92ea0df1993f6a7bcd1b6efa6c1fb66">RedChannelList()</a>, <a class="el" href="classConversation.html#a66f121ca4026246f86a732e5faa0682c">Conversation\set_mode()</a>, <a class="el" href="classRedBrowser.html#a40fdbb9d9fe6c1243bbf135dd5b0a06f">RedBrowser\set_writeable()</a>, <a class="el" href="classRedFile.html#a38a82bfc1b30028ea6ac75923e90fa25">RedFile\setName()</a>, <a class="el" href="subthread_8php.html#a50368f3d825b77996030528e7fbfa3d3">subthread_content()</a>, <a class="el" href="dir__fns_8php.html#a6cae22cfdd6edda5ddf09e07abb3242a">syncdirs()</a>, <a class="el" href="items_8php.html#ab1bce4261bcf75ad62753b498a144d17">tag_deliver()</a>, <a class="el" href="items_8php.html#a88c6cf7649ac836fbbed82a7a0315110">tgroup_check()</a>, <a class="el" href="viewconnections_8php.html#ab6c4d983e97b3a8a879567ff76507776">viewconnections_content()</a>, <a class="el" href="widgets_8php.html#a702e2fc0adc9b615999eca18b7311b5e">widget_photo_albums()</a>, <a class="el" href="include_2attach_8php.html#aeb07968990e66a88c95483ca09a7f909">z_readdir()</a>, and <a class="el" href="items_8php.html#a004e89d86b0f29b2c4da20108ecc4091">zot_feed()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa8b7b102c653649d7a71b5a1c044d90d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">site_default_perms </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="identity_8php.html#a345f4c943d84de502ec6e72d2c813945">create_identity()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/permissions_8php.js b/doc/html/permissions_8php.js
new file mode 100644
index 000000000..49747cfd8
--- /dev/null
+++ b/doc/html/permissions_8php.js
@@ -0,0 +1,8 @@
+var permissions_8php =
+[
+ [ "check_list_permissions", "permissions_8php.html#a0f5bd9f7f4c8fb7ba4b2c1ed048b4dc7", null ],
+ [ "get_all_perms", "permissions_8php.html#aeca9b280f3dc3358c89976d81d690008", null ],
+ [ "get_perms", "permissions_8php.html#a040fd3d3b8517658b1668ae0cd093972", null ],
+ [ "perm_is_allowed", "permissions_8php.html#a67ada9ed51e77885b6b0f6a28cee1835", null ],
+ [ "site_default_perms", "permissions_8php.html#aa8b7b102c653649d7a71b5a1c044d90d", null ]
+]; \ No newline at end of file
diff --git a/doc/html/photo_8php.html b/doc/html/photo_8php.html
new file mode 100644
index 000000000..18f517a7c
--- /dev/null
+++ b/doc/html/photo_8php.html
@@ -0,0 +1,139 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/photo.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('photo_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">photo.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a582779d24882b0d31ee909a91d70a448"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="photo_8php.html#a582779d24882b0d31ee909a91d70a448">photo_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a582779d24882b0d31ee909a91d70a448"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a582779d24882b0d31ee909a91d70a448"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Profile photos - Access controls on default profile photos are not honoured since they need to be exchanged with remote sites.</p>
+<p>Other photos</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/photo_8php.js b/doc/html/photo_8php.js
new file mode 100644
index 000000000..1c070c3bc
--- /dev/null
+++ b/doc/html/photo_8php.js
@@ -0,0 +1,4 @@
+var photo_8php =
+[
+ [ "photo_init", "photo_8php.html#a582779d24882b0d31ee909a91d70a448", null ]
+]; \ No newline at end of file
diff --git a/doc/html/photo__driver_8php.html b/doc/html/photo__driver_8php.html
new file mode 100644
index 000000000..86bd00f16
--- /dev/null
+++ b/doc/html/photo__driver_8php.html
@@ -0,0 +1,269 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/photo/photo_driver.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('photo__driver_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Classes</a> &#124;
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">photo_driver.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html">photo_driver</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a32e2817faa25d7f11f60a8abff565035"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="photo__driver_8php.html#a32e2817faa25d7f11f60a8abff565035">photo_factory</a> ($data, $type=null)</td></tr>
+<tr class="separator:a32e2817faa25d7f11f60a8abff565035"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a243cee492ce443afb6a7d77d54b6c4aa"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="photo__driver_8php.html#a243cee492ce443afb6a7d77d54b6c4aa">guess_image_type</a> ($filename, $headers= '')</td></tr>
+<tr class="separator:a243cee492ce443afb6a7d77d54b6c4aa"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a78f5a10c568d2a9bbbb129dc96548887"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="photo__driver_8php.html#a78f5a10c568d2a9bbbb129dc96548887">import_profile_photo</a> ($photo, $xchan, $thing=false)</td></tr>
+<tr class="separator:a78f5a10c568d2a9bbbb129dc96548887"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1d0bc7161dec0d177b7d3bbe4421af9a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="photo__driver_8php.html#a1d0bc7161dec0d177b7d3bbe4421af9a">import_channel_photo</a> ($photo, $type, $aid, $uid)</td></tr>
+<tr class="separator:a1d0bc7161dec0d177b7d3bbe4421af9a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a243cee492ce443afb6a7d77d54b6c4aa"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">guess_image_type </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$filename</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$headers</em> = <code>''</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Guess image mimetype from filename or from Content-Type header</p>
+<ul>
+<li>$filename string Image filename </li>
+<li>$fromcurl boolean Check Content-Type header from curl request </li>
+</ul>
+<p>Well, this not much better, but at least it comes from the data inside the image, we won't be tricked by a manipulated extension</p>
+
+<p>Referenced by <a class="el" href="photo__driver_8php.html#a78f5a10c568d2a9bbbb129dc96548887">import_profile_photo()</a>, <a class="el" href="include_2photos_8php.html#a6c40ef58aefef705a5adc84a40e97109">photo_upload()</a>, <a class="el" href="profile__photo_8php.html#a4b80234074bd603221aa5364f330e479">profile_photo_post()</a>, and <a class="el" href="include_2network_8php.html#ae8d9c41a11000fb8667039fc71b4f73f">scale_external_images()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a1d0bc7161dec0d177b7d3bbe4421af9a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">import_channel_photo </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$photo</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$aid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="import_8php.html#af17fef0410518f7eac205d0ea416eaa2">import_post()</a>, and <a class="el" href="zot_8php.html#a56f3f65514e4e7f0cd117d01735aebd1">import_xchan()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a78f5a10c568d2a9bbbb129dc96548887"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">import_profile_photo </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$photo</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$xchan</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$thing</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="import_8php.html#af17fef0410518f7eac205d0ea416eaa2">import_post()</a>, <a class="el" href="zot_8php.html#a56f3f65514e4e7f0cd117d01735aebd1">import_xchan()</a>, <a class="el" href="poller_8php.html#a5f12df3a4738124b6c039971e87e76da">poller_run()</a>, and <a class="el" href="thing_8php.html#a8be23b1d475ec3d9291999221c674c80">thing_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a32e2817faa25d7f11f60a8abff565035"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_factory </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$data</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em> = <code>null</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="fbrowser_8php.html#aee476addcf7a3e0fe9454f7dfd5a56c4">fbrowser_content()</a>, <a class="el" href="items_8php.html#aba98fcbbcd7044a7e9ea34edabc14c87">fix_private_photos()</a>, <a class="el" href="photo__driver_8php.html#a243cee492ce443afb6a7d77d54b6c4aa">guess_image_type()</a>, <a class="el" href="photo__driver_8php.html#a1d0bc7161dec0d177b7d3bbe4421af9a">import_channel_photo()</a>, <a class="el" href="photo__driver_8php.html#a78f5a10c568d2a9bbbb129dc96548887">import_profile_photo()</a>, <a class="el" href="photo_8php.html#a582779d24882b0d31ee909a91d70a448">photo_init()</a>, <a class="el" href="include_2photos_8php.html#a6c40ef58aefef705a5adc84a40e97109">photo_upload()</a>, <a class="el" href="mod_2photos_8php.html#aa87382611a66ec5effdb2d78f13f5812">photos_content()</a>, <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>, <a class="el" href="profile__photo_8php.html#a4b80234074bd603221aa5364f330e479">profile_photo_post()</a>, and <a class="el" href="include_2network_8php.html#ae8d9c41a11000fb8667039fc71b4f73f">scale_external_images()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/photo__driver_8php.js b/doc/html/photo__driver_8php.js
new file mode 100644
index 000000000..cabd3c93b
--- /dev/null
+++ b/doc/html/photo__driver_8php.js
@@ -0,0 +1,8 @@
+var photo__driver_8php =
+[
+ [ "photo_driver", "classphoto__driver.html", "classphoto__driver" ],
+ [ "guess_image_type", "photo__driver_8php.html#a243cee492ce443afb6a7d77d54b6c4aa", null ],
+ [ "import_channel_photo", "photo__driver_8php.html#a1d0bc7161dec0d177b7d3bbe4421af9a", null ],
+ [ "import_profile_photo", "photo__driver_8php.html#a78f5a10c568d2a9bbbb129dc96548887", null ],
+ [ "photo_factory", "photo__driver_8php.html#a32e2817faa25d7f11f60a8abff565035", null ]
+]; \ No newline at end of file
diff --git a/doc/html/photo__gd_8php.html b/doc/html/photo__gd_8php.html
new file mode 100644
index 000000000..1af203cae
--- /dev/null
+++ b/doc/html/photo__gd_8php.html
@@ -0,0 +1,120 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/photo/photo_gd.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('photo__gd_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Classes</a> </div>
+ <div class="headertitle">
+<div class="title">photo_gd.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__gd.html">photo_gd</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/photo__imagick_8php.html b/doc/html/photo__imagick_8php.html
new file mode 100644
index 000000000..608403c36
--- /dev/null
+++ b/doc/html/photo__imagick_8php.html
@@ -0,0 +1,120 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/photo/photo_imagick.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('photo__imagick_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Classes</a> </div>
+ <div class="headertitle">
+<div class="title">photo_imagick.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__imagick.html">photo_imagick</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/php2po_8php.html b/doc/html/php2po_8php.html
new file mode 100644
index 000000000..cc75df8b1
--- /dev/null
+++ b/doc/html/php2po_8php.html
@@ -0,0 +1,245 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: util/php2po.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('php2po_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle">
+<div class="title">php2po.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:abbb0e5fd8fbc1f13a9bf68f86eb3d2a4"><td class="memItemLeft" align="right" valign="top"><a class="el" href="redbasic_2php_2style_8php.html#a883f9f14e205f7aa7de02c14df67b40a">if</a>(!class_exists('<a class="el" href="classApp.html">App</a>')) <a class="el" href="redbasic_2php_2style_8php.html#a883f9f14e205f7aa7de02c14df67b40a">if</a>($argc!=2)&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="php2po_8php.html#abbb0e5fd8fbc1f13a9bf68f86eb3d2a4">$phpfile</a> = $<a class="el" href="boot_8php.html#a768f00b7d66be0daf7ef4eea2e862006">argv</a>[1]</td></tr>
+<tr class="separator:abbb0e5fd8fbc1f13a9bf68f86eb3d2a4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a401d84ce156e49e8168bd0c4781e1be1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="php2po_8php.html#a401d84ce156e49e8168bd0c4781e1be1">$pofile</a> = dirname($phpfile).&quot;/messages.po&quot;</td></tr>
+<tr class="separator:a401d84ce156e49e8168bd0c4781e1be1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a45b05625748f412ec97afcd61cf7980b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="php2po_8php.html#a45b05625748f412ec97afcd61cf7980b">if</a> (!file_exists($phpfile))</td></tr>
+<tr class="separator:a45b05625748f412ec97afcd61cf7980b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1594a11499d06cc8a789ee7ca0c7a12b"><td class="memItemLeft" align="right" valign="top">print Out to&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="php2po_8php.html#a1594a11499d06cc8a789ee7ca0c7a12b">n</a></td></tr>
+<tr class="separator:a1594a11499d06cc8a789ee7ca0c7a12b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a48cb304902320d173a4eaa41543327b9"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="php2po_8php.html#a48cb304902320d173a4eaa41543327b9">$out</a> = &quot;&quot;</td></tr>
+<tr class="separator:a48cb304902320d173a4eaa41543327b9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a61f8ddeb5557d46ebc546cc355bda214"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="php2po_8php.html#a61f8ddeb5557d46ebc546cc355bda214">$infile</a> = file($pofile)</td></tr>
+<tr class="separator:a61f8ddeb5557d46ebc546cc355bda214"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad6726cfaa85d4b8299d2b0f034cbf178"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="php2po_8php.html#ad6726cfaa85d4b8299d2b0f034cbf178">$k</a> =&quot;&quot;</td></tr>
+<tr class="separator:ad6726cfaa85d4b8299d2b0f034cbf178"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6b0b8ebd9ce811d1325ef2c129443bc0"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="php2po_8php.html#a6b0b8ebd9ce811d1325ef2c129443bc0">$ink</a> = False</td></tr>
+<tr class="separator:a6b0b8ebd9ce811d1325ef2c129443bc0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Variable Documentation</h2>
+<a class="anchor" id="a61f8ddeb5557d46ebc546cc355bda214"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$infile = file($pofile)</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="po2php_8php.html#a3b75e36f913198299e99559b175cd8b4">po2php_run()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a6b0b8ebd9ce811d1325ef2c129443bc0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$ink = False</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="po2php_8php.html#a3b75e36f913198299e99559b175cd8b4">po2php_run()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ad6726cfaa85d4b8299d2b0f034cbf178"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$k =&quot;&quot;</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classApp.html#af6d39f63fb7116bbeb04e51696f99474">App\__construct()</a>, <a class="el" href="classTemplate.html#aae9c4d761ea1298e745e8052d7910194">Template\_get_var()</a>, <a class="el" href="classTemplate.html#abf71098c80fd1f218a59452b3408309e">Template\_replcb_for()</a>, <a class="el" href="items_8php.html#a36e656667193c83aa2cc03a024fc131b">activity_sanitise()</a>, <a class="el" href="crypto_8php.html#a2148d7aac7b30c720f7ebda7e9790286">aes_encapsulate()</a>, <a class="el" href="crypto_8php.html#aca7c3a574bfb6c6ef1f2403a56823914">aes_unencapsulate()</a>, <a class="el" href="zot_8php.html#ac34e479d27f32b82dd6b33542f81a6a7">build_sync_packet()</a>, <a class="el" href="connections_8php.html#a1224058db8e3fb56463eb312f98e561d">connections_post()</a>, <a class="el" href="connedit_8php.html#a795acb3d9d841f55c255d7611681ab67">connedit_content()</a>, <a class="el" href="connedit_8php.html#a234c48426b652bf4d37053f2af329ac5">connedit_post()</a>, <a class="el" href="boot_8php.html#acc4e0c910af066148b810e5fde55fff1">construct_page()</a>, <a class="el" href="contact__selectors_8php.html#a9839e8fdaac7ffb37bf1420493f5c28f">contact_poll_interval()</a>, <a class="el" href="contact__selectors_8php.html#ae499960d6467bd30c78607b1018baf53">contact_reputation()</a>, <a class="el" href="dirprofile_8php.html#a3e1d30d3d93863ff5615f2df4ac7f052">dirprofile_init()</a>, <a class="el" href="dirsearch_8php.html#aa1fb04e1de4f25b63349ac78f94ceb4c">dirsearch_content()</a>, <a class="el" href="classRedBrowser.html#a1f7daf50bb9bfcde7345b3b1908dbd7e">RedBrowser\generateDirectoryIndex()</a>, <a class="el" href="plugin_8php.html#aff0178bd8d0b34a94d5efddc883edd35">get_plugin_info()</a>, <a class="el" href="plugin_8php.html#ad48de9c0fb7f19413a2aa49250d00405">get_theme_info()</a>, <a class="el" href="taxonomy_8php.html#a7747fa859ac56fbffd4f9782d85505de">get_things()</a>, <a class="el" href="photo__driver_8php.html#a243cee492ce443afb6a7d77d54b6c4aa">guess_image_type()</a>, <a class="el" href="zot_8php.html#aeec89da5b6ff090c63a79de4de884a35">import_directory_profile()</a>, <a class="el" href="conversation_8php.html#aacbb12d372d5e9c3ab0735b4aea48fb3">item_photo_menu()</a>, <a class="el" href="items_8php.html#acf0bf7c9d21ac84f32effb754f7ad484">item_store_update()</a>, <a class="el" href="include_2config_8php.html#a27559f388c9b9af81c94e48d6889d1d1">load_config()</a>, <a class="el" href="include_2config_8php.html#ac543813a980b3841cc5a277fcd4a24a6">load_pconfig()</a>, <a class="el" href="include_2config_8php.html#a55bbed9a014c9109c767486834f3ca33">load_xconfig()</a>, <a class="el" href="mail_8php.html#acfc2cc0bf4e0b178207758384977f25a">mail_post()</a>, <a class="el" href="mood_8php.html#a721b9b6703b3234a005641c92d409b8f">mood_content()</a>, <a class="el" href="include_2follow_8php.html#ae387d4ae097c23d69f3247e7f08140c7">new_contact()</a>, <a class="el" href="classFKOAuthDataStore.html#a431b44d70e3da6a8256ab38f710e3050">FKOAuthDataStore\new_request_token()</a>, <a class="el" href="taxonomy_8php.html#af387463d42ffdf7d2ab3d5b22e40a0c7">obj_verb_selector()</a>, <a class="el" href="include_2photos_8php.html#aedccaf18282b26899d9549c29bd9d1b9">photos_albums_list()</a>, <a class="el" href="po2php_8php.html#a3b75e36f913198299e99559b175cd8b4">po2php_run()</a>, <a class="el" href="poco_8php.html#a53def16f75e3d41f1d2bb7cfa4905498">poco_init()</a>, <a class="el" href="poke_8php.html#ac9190563a8da9c07a16f9dcd71cf6993">poke_content()</a>, <a class="el" href="include_2message_8php.html#a5f8de9847e203329e317ac38dc646898">private_messages_fetch_conversation()</a>, <a class="el" href="include_2message_8php.html#a254a756031e4d5e94f85e2939bdb5091">private_messages_fetch_message()</a>, <a class="el" href="include_2message_8php.html#a652973ce47a262f2d238c2fd6233d97e">private_messages_list()</a>, <a class="el" href="zot_8php.html#ac301c67864917c35922257950ae0f95c">process_channel_sync_delivery()</a>, <a class="el" href="include_2api_8php.html#a43c47de8565cc00c3369cb35c19cc75e">requestdata()</a>, <a class="el" href="settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586">settings_post()</a>, <a class="el" href="sslify_8php.html#a75b11e54a3d1fc83e7d4c0e8b4dab316">sslify_init()</a>, <a class="el" href="boot_8php.html#aca47505b8732177f52bb2d647eb2741c">startup()</a>, <a class="el" href="dir__fns_8php.html#a6cae22cfdd6edda5ddf09e07abb3242a">syncdirs()</a>, <a class="el" href="language_8php.html#ae310fb3880484ee1cc4faefe0c63c06d">tt()</a>, <a class="el" href="vote_8php.html#a57a9516ee1b923b224e66dcc47377fb2">vote_post()</a>, <a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x()</a>, <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>, and <a class="el" href="zot_8php.html#a7b23bfb31d4491231e1e73bdc077240d">zot_refresh()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a48cb304902320d173a4eaa41543327b9"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$out = &quot;&quot;</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="dirprofile_8php.html#a3e1d30d3d93863ff5615f2df4ac7f052">dirprofile_init()</a>, <a class="el" href="include_2attach_8php.html#a5d484de2d19a93071571d6499a50ae34">pipe_streams()</a>, and <a class="el" href="po2php_8php.html#a3b75e36f913198299e99559b175cd8b4">po2php_run()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="abbb0e5fd8fbc1f13a9bf68f86eb3d2a4"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="redbasic_2php_2style_8php.html#a883f9f14e205f7aa7de02c14df67b40a">if</a> (!class_exists('<a class="el" href="classApp.html">App</a>')) <a class="el" href="redbasic_2php_2style_8php.html#a883f9f14e205f7aa7de02c14df67b40a">if</a> ($argc!=2) $phpfile = $<a class="el" href="boot_8php.html#a768f00b7d66be0daf7ef4eea2e862006">argv</a>[1]</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a401d84ce156e49e8168bd0c4781e1be1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$pofile = dirname($phpfile).&quot;/messages.po&quot;</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="po2php_8php.html#a3b75e36f913198299e99559b175cd8b4">po2php_run()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a45b05625748f412ec97afcd61cf7980b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">if</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<b>Initial value:</b><div class="fragment"><div class="line">{</div>
+<div class="line"> <a class="code" href="fpostit_8php.html#a3f3ae3ae61578b5671673914fd894443">showForm</a>(null, $content)</div>
+</div><!-- fragment -->
+<p>Referenced by <a class="el" href="include_2oembed_8php.html#a26bb4c1e330d2f94ea7b6ce2fe970cf3">oembed_format_object()</a>, and <a class="el" href="post__to__red_8php.html#a085c250d4ceff5e4f10052f3d2039823">red_comment()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a1594a11499d06cc8a789ee7ca0c7a12b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">print Out to n</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/php2po_8php.js b/doc/html/php2po_8php.js
new file mode 100644
index 000000000..679a631af
--- /dev/null
+++ b/doc/html/php2po_8php.js
@@ -0,0 +1,11 @@
+var php2po_8php =
+[
+ [ "$infile", "php2po_8php.html#a61f8ddeb5557d46ebc546cc355bda214", null ],
+ [ "$ink", "php2po_8php.html#a6b0b8ebd9ce811d1325ef2c129443bc0", null ],
+ [ "$k", "php2po_8php.html#ad6726cfaa85d4b8299d2b0f034cbf178", null ],
+ [ "$out", "php2po_8php.html#a48cb304902320d173a4eaa41543327b9", null ],
+ [ "$phpfile", "php2po_8php.html#abbb0e5fd8fbc1f13a9bf68f86eb3d2a4", null ],
+ [ "$pofile", "php2po_8php.html#a401d84ce156e49e8168bd0c4781e1be1", null ],
+ [ "if", "php2po_8php.html#a45b05625748f412ec97afcd61cf7980b", null ],
+ [ "n", "php2po_8php.html#a1594a11499d06cc8a789ee7ca0c7a12b", null ]
+]; \ No newline at end of file
diff --git a/doc/html/php_2default_8php.html b/doc/html/php_2default_8php.html
new file mode 100644
index 000000000..179210e2b
--- /dev/null
+++ b/doc/html/php_2default_8php.html
@@ -0,0 +1,133 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/php/default.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('php_2default_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle">
+<div class="title">default.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:a23bc1996b18e69c1a3ab44536613a762"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="php_2default_8php.html#a23bc1996b18e69c1a3ab44536613a762">if</a> (<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>($<a class="el" href="mod__import_8php.html#a8db1899eeeb44dabd0904065b63627bb">page</a>,'htmlhead')) echo $<a class="el" href="mod__import_8php.html#a8db1899eeeb44dabd0904065b63627bb">page</a>['htmlhead']?&gt;&lt;/head &gt;&lt; body &gt;&lt;?php if(<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>($<a class="el" href="mod__import_8php.html#a8db1899eeeb44dabd0904065b63627bb">page</a></td></tr>
+<tr class="separator:a23bc1996b18e69c1a3ab44536613a762"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Variable Documentation</h2>
+<a class="anchor" id="a23bc1996b18e69c1a3ab44536613a762"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">if(<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>($<a class="el" href="mod__import_8php.html#a8db1899eeeb44dabd0904065b63627bb">page</a>,'htmlhead')) echo $<a class="el" href="mod__import_8php.html#a8db1899eeeb44dabd0904065b63627bb">page</a>['htmlhead']?&gt;&lt;/head &gt;&lt; body &gt;&lt;?php if(<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>($<a class="el" href="mod__import_8php.html#a8db1899eeeb44dabd0904065b63627bb">page</a></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/php_2default_8php.js b/doc/html/php_2default_8php.js
new file mode 100644
index 000000000..2504be66e
--- /dev/null
+++ b/doc/html/php_2default_8php.js
@@ -0,0 +1,4 @@
+var php_2default_8php =
+[
+ [ "if", "php_2default_8php.html#a23bc1996b18e69c1a3ab44536613a762", null ]
+]; \ No newline at end of file
diff --git a/doc/html/php_2theme__init_8php.html b/doc/html/php_2theme__init_8php.html
new file mode 100644
index 000000000..c969bd61e
--- /dev/null
+++ b/doc/html/php_2theme__init_8php.html
@@ -0,0 +1,136 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/php/theme_init.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('php_2theme__init_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle">
+<div class="title">theme_init.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:a54f32c086fe209c99769a4c4047dd864"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="php_2theme__init_8php.html#a54f32c086fe209c99769a4c4047dd864">$channel</a> = <a class="el" href="boot_8php.html#a0e6db7e365f2b041a828b93786f694bc">get_app</a>()-&gt;get_channel()</td></tr>
+<tr class="separator:a54f32c086fe209c99769a4c4047dd864"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Variable Documentation</h2>
+<a class="anchor" id="a54f32c086fe209c99769a4c4047dd864"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$channel = <a class="el" href="boot_8php.html#a0e6db7e365f2b041a828b93786f694bc">get_app</a>()-&gt;get_channel()</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Those who require this feature will know what to do with it. Those who don't, won't. Eventually this functionality needs to be provided by a module such that permissions can be enforced. At the moment it's more of a proof of concept; but sufficient for our immediate needs. </p>
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#a176c448d79c211ad41c2bbe3124658f5">api_call()</a>, <a class="el" href="include_2api_8php.html#afb99daa6b731bf497b81f2128084852c">api_user()</a>, <a class="el" href="include_2attach_8php.html#ab6830b3ab74a5d284876141ac80f6cbc">attach_mkdir()</a>, <a class="el" href="include_2attach_8php.html#a84a8a64c4805e1525b42d4add464833f">attach_store()</a>, <a class="el" href="blocks_8php.html#a2531a8fd51db3cecb2eb20c002c66e12">blocks_content()</a>, <a class="el" href="zot_8php.html#ac34e479d27f32b82dd6b33542f81a6a7">build_sync_packet()</a>, <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>, <a class="el" href="channel_8php.html#ac7c8c7845741baadf87fae6bc279f3dc">channel_init()</a>, <a class="el" href="Contact_8php.html#a186162051a5127069cc851d78740f205">channel_remove()</a>, <a class="el" href="cloud_8php.html#a1b79a6fe0454bc76673ad9aef55bf02d">cloud_init()</a>, <a class="el" href="connections_8php.html#a1f23623f802af7bd35e95b0e94e5d558">connections_init()</a>, <a class="el" href="connections_8php.html#a1224058db8e3fb56463eb312f98e561d">connections_post()</a>, <a class="el" href="connedit_8php.html#a795acb3d9d841f55c255d7611681ab67">connedit_content()</a>, <a class="el" href="connedit_8php.html#a4da871e075597a09a8b374b9171dd92e">connedit_init()</a>, <a class="el" href="connedit_8php.html#a234c48426b652bf4d37053f2af329ac5">connedit_post()</a>, <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation()</a>, <a class="el" href="text_8php.html#a87a3cefc603302c78982f1d8e1245265">design_tools()</a>, <a class="el" href="include_2directory_8php.html#aa75d3b0697ca1456aaabdb37a74aa0f0">directory_run()</a>, <a class="el" href="display_8php.html#a37137c98d47bf3306f4c2bb9f5b60de0">display_content()</a>, <a class="el" href="editblock_8php.html#abbe8f55de06967bc8d79d620509a49e6">editblock_content()</a>, <a class="el" href="editlayout_8php.html#aa877e4157a26b099de904164181dd386">editlayout_content()</a>, <a class="el" href="editpost_8php.html#a34011690864d122680c802e9e748ccfb">editpost_content()</a>, <a class="el" href="editwebpage_8php.html#a375e945255fad79a71036528f7480650">editwebpage_content()</a>, <a class="el" href="events_8php.html#a1d293fb217ae6bc9e3858c4b32e363ec">events_content()</a>, <a class="el" href="events_8php.html#ab3e8a8f901175f8e40a8089eea45c075">events_post()</a>, <a class="el" href="feed_8php.html#af86137700b56f33d1d5f25c8dec22c04">feed_init()</a>, <a class="el" href="filestorage_8php.html#a61bb1be78472555df4ce619f51014040">filestorage_content()</a>, <a class="el" href="item_8php.html#a3daae7944f737bd30412a0d042207c0f">fix_attached_file_permissions()</a>, <a class="el" href="boot_8php.html#aca5e42678e178c6b9034610d66666fd7">fix_system_urls()</a>, <a class="el" href="items_8php.html#a04a35b610acfe54434df08adec39c0c7">get_feed_for()</a>, <a class="el" href="items_8php.html#a079e099e15d88d47aeb6ca6d60da7107">get_public_feed()</a>, <a class="el" href="item_8php.html#aa22feef4de326e1d7078dedd892e615c">handle_tag()</a>, <a class="el" href="home_8php.html#ac4642c38b6f23a8d065dd4a75c620bde">home_init()</a>, <a class="el" href="classRedBrowser.html#a7f6bf0bda07833f4c647557bd172e349">RedBrowser\htmlActionsPanel()</a>, <a class="el" href="import_8php.html#af17fef0410518f7eac205d0ea416eaa2">import_post()</a>, <a class="el" href="invite_8php.html#a244385b28cfd021d308715f01158bfd9">invite_content()</a>, <a class="el" href="conversation_8php.html#aacbb12d372d5e9c3ab0735b4aea48fb3">item_photo_menu()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">item_store()</a>, <a class="el" href="items_8php.html#acf0bf7c9d21ac84f32effb754f7ad484">item_store_update()</a>, <a class="el" href="items_8php.html#a756738301f2ed96be50232500677d58a">items_fetch()</a>, <a class="el" href="layouts_8php.html#a6e0193759ad9eef76d3df2db24237b50">layouts_content()</a>, <a class="el" href="magic_8php.html#acea2cc792849ca2d71d4b689f66518bf">magic_init()</a>, <a class="el" href="mail_8php.html#a3c7c485fc69f92371e8b20936040eca1">mail_content()</a>, <a class="el" href="mail_8php.html#acfc2cc0bf4e0b178207758384977f25a">mail_post()</a>, <a class="el" href="include_2menu_8php.html#add35fae5e9695031b3d46e30ac409eb8">menu_add_item()</a>, <a class="el" href="include_2menu_8php.html#acb66f80ca895a6ccd562b3d9ae7b41aa">menu_edit_item()</a>, <a class="el" href="mod_2message_8php.html#ac72dfed3ce08fcb331d66b37edc6e15f">message_content()</a>, <a class="el" href="mitem_8php.html#a7a31b702ecad18eeb6a38b243ff0037e">mitem_content()</a>, <a class="el" href="mitem_8php.html#a6ee694cca4b551a20d7c7a94b5243ec1">mitem_post()</a>, <a class="el" href="mood_8php.html#a7ae136dd7476865b4828136175db5022">mood_init()</a>, <a class="el" href="nav_8php.html#a43be0df73b90647ea70947ce004e231e">nav()</a>, <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>, <a class="el" href="mod_2network_8php.html#a180fce90ad11d7e0e45be094da7149ec">network_init()</a>, <a class="el" href="include_2follow_8php.html#ae387d4ae097c23d69f3247e7f08140c7">new_contact()</a>, <a class="el" href="notifier_8php.html#a568c502f626cff95e344c0748938b85d">notifier_run()</a>, <a class="el" href="include_2photos_8php.html#a6c40ef58aefef705a5adc84a40e97109">photo_upload()</a>, <a class="el" href="include_2photos_8php.html#aedccaf18282b26899d9549c29bd9d1b9">photos_albums_list()</a>, <a class="el" href="mod_2photos_8php.html#aa87382611a66ec5effdb2d78f13f5812">photos_content()</a>, <a class="el" href="include_2photos_8php.html#ad648c0c5544fe9263409b6f6e57c6274">photos_create_item()</a>, <a class="el" href="include_2photos_8php.html#aa27b9e435dcc34e1009f56dc02c7ca51">photos_list_photos()</a>, <a class="el" href="ping_8php.html#a77217b1b190b4c5d8770867b45f0c0a1">ping_init()</a>, <a class="el" href="poke_8php.html#a9725aab97b3983e6a98bd81c4efe7d3b">poke_init()</a>, <a class="el" href="items_8php.html#a410f9c743877c125ca06312373346903">post_activity_item()</a>, <a class="el" href="post__to__red_8php.html#a5cc2a89a6d33cdb8e2ca557a69bef42d">post_to_red_delete_comment()</a>, <a class="el" href="post__to__red_8php.html#a4674bb5ce2baa32c559607460c39a2c5">post_to_red_delete_post()</a>, <a class="el" href="post__to__red_8php.html#a75db5d87226a0287a0ac0fa315f2bcfd">post_to_red_displayAdminContent()</a>, <a class="el" href="post__to__red_8php.html#af5fd50e2c42ede85f8a9e8d9ee3cf540">post_to_red_post()</a>, <a class="el" href="probe_8php.html#a1f1db3fa6038e451e737964c94bf5e99">probe_content()</a>, <a class="el" href="zot_8php.html#ac301c67864917c35922257950ae0f95c">process_channel_sync_delivery()</a>, <a class="el" href="zot_8php.html#a37ec13b18057634eadb071f05297f5e1">process_delivery()</a>, <a class="el" href="zot_8php.html#aa6ae96db8cbbdbb10e6876d206bbf7cc">process_mail_delivery()</a>, <a class="el" href="profile_8php.html#ab5d0246be0552e2182a585c1206d22a5">profile_init()</a>, <a class="el" href="profile__photo_8php.html#a140631c56438fbfacb61a1eb43067d02">profile_photo_init()</a>, <a class="el" href="profile__photo_8php.html#a4b80234074bd603221aa5364f330e479">profile_photo_post()</a>, <a class="el" href="profiles_8php.html#ab0362c81b1d3b0b12a772b9fac446e04">profiles_post()</a>, <a class="el" href="rpost_8php.html#a8190354d789000806d9879aea276728f">rpost_content()</a>, <a class="el" href="include_2message_8php.html#a751ffd6635022b2190f56154ee745752">send_message()</a>, <a class="el" href="settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586">settings_post()</a>, <a class="el" href="sources_8php.html#ac73298ff162ce7b2de8dcaf3d3305b1e">sources_post()</a>, <a class="el" href="tagger_8php.html#a0e4a3eb177d1684553c547503d67161c">tagger_content()</a>, <a class="el" href="thing_8php.html#a8be23b1d475ec3d9291999221c674c80">thing_init()</a>, <a class="el" href="uexport_8php.html#a118920137dedebe0581623a2e57e7b0d">uexport_init()</a>, <a class="el" href="items_8php.html#a2baa9e05f1e8aa3dd61c85803ae39bd6">update_remote_id()</a>, <a class="el" href="wall__attach_8php.html#a7385e970e93228d082f0fd7254f6e653">wall_attach_post()</a>, <a class="el" href="wall__upload_8php.html#a7cbe204244cf9e0380ee932263a74d8f">wall_upload_post()</a>, <a class="el" href="webpages_8php.html#af3b7397d4abc153e3d2147740ee1a41d">webpages_content()</a>, <a class="el" href="wfinger_8php.html#ae21e50c8d0a5f3c9be9f43a4e519acd3">wfinger_init()</a>, <a class="el" href="widgets_8php.html#aaa73bcf1702eaadd9dcd253502f55e01">widget_settings_menu()</a>, <a class="el" href="zot_8php.html#a3862b3161b2c8557dc1a95020179bd81">zot_build_packet()</a>, <a class="el" href="zot_8php.html#a95528377d7303131958c9f0b7158fdce">zot_finger()</a>, and <a class="el" href="zot_8php.html#a7b23bfb31d4491231e1e73bdc077240d">zot_refresh()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/php_2theme__init_8php.js b/doc/html/php_2theme__init_8php.js
new file mode 100644
index 000000000..e5e495b9f
--- /dev/null
+++ b/doc/html/php_2theme__init_8php.js
@@ -0,0 +1,4 @@
+var php_2theme__init_8php =
+[
+ [ "$channel", "php_2theme__init_8php.html#a54f32c086fe209c99769a4c4047dd864", null ]
+]; \ No newline at end of file
diff --git a/doc/html/php_8php.html b/doc/html/php_8php.html
new file mode 100644
index 000000000..f49bb096f
--- /dev/null
+++ b/doc/html/php_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/php.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('php_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">php.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:adb7164dfed9a4ecbe2e168e1e78f12f6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="php_8php.html#adb7164dfed9a4ecbe2e168e1e78f12f6">php_init</a> (&amp;$a)</td></tr>
+<tr class="separator:adb7164dfed9a4ecbe2e168e1e78f12f6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="adb7164dfed9a4ecbe2e168e1e78f12f6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">php_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/php_8php.js b/doc/html/php_8php.js
new file mode 100644
index 000000000..77a9c0ac8
--- /dev/null
+++ b/doc/html/php_8php.js
@@ -0,0 +1,4 @@
+var php_8php =
+[
+ [ "php_init", "php_8php.html#adb7164dfed9a4ecbe2e168e1e78f12f6", null ]
+]; \ No newline at end of file
diff --git a/doc/html/pine_8php.html b/doc/html/pine_8php.html
new file mode 100644
index 000000000..c4f964c33
--- /dev/null
+++ b/doc/html/pine_8php.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/apw/schema/pine.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('pine_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">pine.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/ping_8php.html b/doc/html/ping_8php.html
new file mode 100644
index 000000000..0e34df51f
--- /dev/null
+++ b/doc/html/ping_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/ping.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('ping_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">ping.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a77217b1b190b4c5d8770867b45f0c0a1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ping_8php.html#a77217b1b190b4c5d8770867b45f0c0a1">ping_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a77217b1b190b4c5d8770867b45f0c0a1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a77217b1b190b4c5d8770867b45f0c0a1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">ping_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/ping_8php.js b/doc/html/ping_8php.js
new file mode 100644
index 000000000..4fe2dcc0c
--- /dev/null
+++ b/doc/html/ping_8php.js
@@ -0,0 +1,4 @@
+var ping_8php =
+[
+ [ "ping_init", "ping_8php.html#a77217b1b190b4c5d8770867b45f0c0a1", null ]
+]; \ No newline at end of file
diff --git a/doc/html/plugin_8php.html b/doc/html/plugin_8php.html
new file mode 100644
index 000000000..1332d5561
--- /dev/null
+++ b/doc/html/plugin_8php.html
@@ -0,0 +1,850 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/plugin.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('plugin_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">plugin.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a90538627db68605aeb6db17a8ead6523"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="plugin_8php.html#a90538627db68605aeb6db17a8ead6523">unload_plugin</a> ($plugin)</td></tr>
+<tr class="separator:a90538627db68605aeb6db17a8ead6523"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a093a9cb98f51e3643634bd8bc6ed6e76"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="plugin_8php.html#a093a9cb98f51e3643634bd8bc6ed6e76">uninstall_plugin</a> ($plugin)</td></tr>
+<tr class="separator:a093a9cb98f51e3643634bd8bc6ed6e76"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a482131013272a1d5d5c1b1469c6c55d5"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="plugin_8php.html#a482131013272a1d5d5c1b1469c6c55d5">install_plugin</a> ($plugin)</td></tr>
+<tr class="separator:a482131013272a1d5d5c1b1469c6c55d5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9ca9632b7309a65b05c03a3e2f473a3d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="plugin_8php.html#a9ca9632b7309a65b05c03a3e2f473a3d">load_plugin</a> ($plugin)</td></tr>
+<tr class="separator:a9ca9632b7309a65b05c03a3e2f473a3d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af9ac19004dca49adae1ac7a0d9f3b025"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="plugin_8php.html#af9ac19004dca49adae1ac7a0d9f3b025">reload_plugins</a> ()</td></tr>
+<tr class="separator:af9ac19004dca49adae1ac7a0d9f3b025"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a425472c5f3afc137268b2ad45652b209"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="plugin_8php.html#a425472c5f3afc137268b2ad45652b209">register_hook</a> ($hook, $file, $function, $priority=0)</td></tr>
+<tr class="separator:a425472c5f3afc137268b2ad45652b209"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a56f71fe5adf9586ce950523d8180443e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="plugin_8php.html#a56f71fe5adf9586ce950523d8180443e">unregister_hook</a> ($hook, $file, $function)</td></tr>
+<tr class="separator:a56f71fe5adf9586ce950523d8180443e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a326365e48ef94f0b9a0a771b8d75e813"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="plugin_8php.html#a326365e48ef94f0b9a0a771b8d75e813">load_hooks</a> ()</td></tr>
+<tr class="separator:a326365e48ef94f0b9a0a771b8d75e813"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aeaebe63dcf6fa2794f363ba2bc0b2c6b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="plugin_8php.html#aeaebe63dcf6fa2794f363ba2bc0b2c6b">insert_hook</a> ($hook, $fn)</td></tr>
+<tr class="separator:aeaebe63dcf6fa2794f363ba2bc0b2c6b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7f05de16c0a32602853b09b99dd85e7c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="plugin_8php.html#a7f05de16c0a32602853b09b99dd85e7c">call_hooks</a> ($name, &amp;$data=null)</td></tr>
+<tr class="separator:a7f05de16c0a32602853b09b99dd85e7c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aff0178bd8d0b34a94d5efddc883edd35"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="plugin_8php.html#aff0178bd8d0b34a94d5efddc883edd35">get_plugin_info</a> ($plugin)</td></tr>
+<tr class="separator:aff0178bd8d0b34a94d5efddc883edd35"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad48de9c0fb7f19413a2aa49250d00405"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="plugin_8php.html#ad48de9c0fb7f19413a2aa49250d00405">get_theme_info</a> ($theme)</td></tr>
+<tr class="separator:ad48de9c0fb7f19413a2aa49250d00405"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a48047edfbef770125a5508dcc2f9282f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="plugin_8php.html#a48047edfbef770125a5508dcc2f9282f">get_theme_screenshot</a> ($theme)</td></tr>
+<tr class="separator:a48047edfbef770125a5508dcc2f9282f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a030cec6793b909c439c0336ba39b1571"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="plugin_8php.html#a030cec6793b909c439c0336ba39b1571">service_class_allows</a> ($uid, $property, $usage=false)</td></tr>
+<tr class="separator:a030cec6793b909c439c0336ba39b1571"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a905b54e10704b283ac64680a8abc0971"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="plugin_8php.html#a905b54e10704b283ac64680a8abc0971">service_class_fetch</a> ($uid, $property)</td></tr>
+<tr class="separator:a905b54e10704b283ac64680a8abc0971"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4fc13e528367f510fcb6d8bbfc559040"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="plugin_8php.html#a4fc13e528367f510fcb6d8bbfc559040">upgrade_link</a> ($<a class="el" href="bbcode_8php.html#a009f61aaf78771737ed0765c8463911b">bbcode</a>=false)</td></tr>
+<tr class="separator:a4fc13e528367f510fcb6d8bbfc559040"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a901657dd078e070516cf97285e0bada7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="plugin_8php.html#a901657dd078e070516cf97285e0bada7">upgrade_message</a> ($<a class="el" href="bbcode_8php.html#a009f61aaf78771737ed0765c8463911b">bbcode</a>=false)</td></tr>
+<tr class="separator:a901657dd078e070516cf97285e0bada7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a754d7f53b3abc557b753c057dc4e021d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="plugin_8php.html#a754d7f53b3abc557b753c057dc4e021d">upgrade_bool_message</a> ($<a class="el" href="bbcode_8php.html#a009f61aaf78771737ed0765c8463911b">bbcode</a>=false)</td></tr>
+<tr class="separator:a754d7f53b3abc557b753c057dc4e021d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a23c4fccf1eb5fcd63b24783ba1f05f7a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="plugin_8php.html#a23c4fccf1eb5fcd63b24783ba1f05f7a">head_add_css</a> ($src, $media= 'screen')</td></tr>
+<tr class="separator:a23c4fccf1eb5fcd63b24783ba1f05f7a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9ab6caae31935f6cf781ce7872db7cdf"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="plugin_8php.html#a9ab6caae31935f6cf781ce7872db7cdf">head_remove_css</a> ($src, $media= 'screen')</td></tr>
+<tr class="separator:a9ab6caae31935f6cf781ce7872db7cdf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af92789f559b89a380e49d303218aeeca"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="plugin_8php.html#af92789f559b89a380e49d303218aeeca">head_get_css</a> ()</td></tr>
+<tr class="separator:af92789f559b89a380e49d303218aeeca"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9039e15aae27676af7777dcbee5a11d6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="plugin_8php.html#a9039e15aae27676af7777dcbee5a11d6">format_css_if_exists</a> ($source)</td></tr>
+<tr class="separator:a9039e15aae27676af7777dcbee5a11d6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0e8c2ea50bfdbc39e17ccccaea21ddc3"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="plugin_8php.html#a0e8c2ea50bfdbc39e17ccccaea21ddc3">script_path</a> ()</td></tr>
+<tr class="separator:a0e8c2ea50bfdbc39e17ccccaea21ddc3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a516591850f4fd49fd1425cfa54089db8"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="plugin_8php.html#a516591850f4fd49fd1425cfa54089db8">head_add_js</a> ($src)</td></tr>
+<tr class="separator:a516591850f4fd49fd1425cfa54089db8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4a0ae7b881e7c8af99a69e3b03f898b4"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="plugin_8php.html#a4a0ae7b881e7c8af99a69e3b03f898b4">head_remove_js</a> ($src)</td></tr>
+<tr class="separator:a4a0ae7b881e7c8af99a69e3b03f898b4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a65ab52cb1a7030d5190e247211bef2a1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="plugin_8php.html#a65ab52cb1a7030d5190e247211bef2a1">head_get_js</a> ()</td></tr>
+<tr class="separator:a65ab52cb1a7030d5190e247211bef2a1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad9ff8ba554576383c5911a4bce068c1f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="plugin_8php.html#ad9ff8ba554576383c5911a4bce068c1f">format_js_if_exists</a> ($source)</td></tr>
+<tr class="separator:ad9ff8ba554576383c5911a4bce068c1f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a65fedcffbe03562ef844cabee37d34e2"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="plugin_8php.html#a65fedcffbe03562ef844cabee37d34e2">theme_include</a> ($file, $root= '')</td></tr>
+<tr class="separator:a65fedcffbe03562ef844cabee37d34e2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acb63c27d07f6d7dffe95f98a6cef1295"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="plugin_8php.html#acb63c27d07f6d7dffe95f98a6cef1295">get_intltext_template</a> ($s, $root= '')</td></tr>
+<tr class="separator:acb63c27d07f6d7dffe95f98a6cef1295"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a75f7dfed291fd7add7fc85b5c022a1f4"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="plugin_8php.html#a75f7dfed291fd7add7fc85b5c022a1f4">get_markup_template</a> ($s, $root= '')</td></tr>
+<tr class="separator:a75f7dfed291fd7add7fc85b5c022a1f4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a7f05de16c0a32602853b09b99dd85e7c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">call_hooks </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$name</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$data</em> = <code>null</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#afe534f826e4282b72d66e8cadca7bb73">api_login()</a>, <a class="el" href="items_8php.html#a016dd86c827d08db89061ea81d15c6cb">atom_author()</a>, <a class="el" href="items_8php.html#a275108c050f7eb18bcbb5018e6b81cf6">atom_entry()</a>, <a class="el" href="security_8php.html#adc7bf51e3b8d67bd80e9348f9ab03733">authenticate_success()</a>, <a class="el" href="include_2network_8php.html#ab07ce9d75eae559865ed90aad2154bd7">avatar_img()</a>, <a class="el" href="bb2diaspora_8php.html#a4f10e0876b27373c762bc1abbe745f5c">bb2diaspora()</a>, <a class="el" href="bbcode_8php.html#a009f61aaf78771737ed0765c8463911b">bbcode()</a>, <a class="el" href="Contact_8php.html#a186162051a5127069cc851d78740f205">channel_remove()</a>, <a class="el" href="account_8php.html#ae052bd5558847bd38e89c213561a9771">check_account_email()</a>, <a class="el" href="account_8php.html#aaff7720423417a4333697894ffd9ddeb">check_account_invite()</a>, <a class="el" href="account_8php.html#a144b4891022567668375b58ea61cfff0">check_account_password()</a>, <a class="el" href="connect_8php.html#a489f0a66c660de6ec4d6917b27674f07">connect_content()</a>, <a class="el" href="connections_8php.html#a1224058db8e3fb56463eb312f98e561d">connections_post()</a>, <a class="el" href="connedit_8php.html#a795acb3d9d841f55c255d7611681ab67">connedit_content()</a>, <a class="el" href="connedit_8php.html#a234c48426b652bf4d37053f2af329ac5">connedit_post()</a>, <a class="el" href="boot_8php.html#acc4e0c910af066148b810e5fde55fff1">construct_page()</a>, <a class="el" href="text_8php.html#ad6432621d0fafcbcf3d3b9b49bef7784">contact_block()</a>, <a class="el" href="acl__selectors_8php.html#a9476997d2968a5794f3723878ed89c91">contact_select()</a>, <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation()</a>, <a class="el" href="identity_8php.html#a345f4c943d84de502ec6e72d2c813945">create_identity()</a>, <a class="el" href="cronhooks_8php.html#a4c4c1bbec4ecc9a0efa00dd6afd2c0ca">cronhooks_run()</a>, <a class="el" href="mod_2directory_8php.html#aac79396570d759da2efac24fcedf5b44">directory_content()</a>, <a class="el" href="items_8php.html#afa1db13c2a8b73b5b17b97f17e5a19d1">drop_item()</a>, <a class="el" href="editblock_8php.html#abbe8f55de06967bc8d79d620509a49e6">editblock_content()</a>, <a class="el" href="editlayout_8php.html#aa877e4157a26b099de904164181dd386">editlayout_content()</a>, <a class="el" href="editpost_8php.html#a34011690864d122680c802e9e748ccfb">editpost_content()</a>, <a class="el" href="editwebpage_8php.html#a375e945255fad79a71036528f7480650">editwebpage_content()</a>, <a class="el" href="event_8php.html#a89ef533faf345db8d64a58d4856bde3a">event_store()</a>, <a class="el" href="features_8php.html#a52b5bdfb61b256713efecf7a7b20b0c0">feature_enabled()</a>, <a class="el" href="profile__selectors_8php.html#ae2b2c087e6530c61c0b256fd26d52355">gender_selector()</a>, <a class="el" href="permissions_8php.html#aeca9b280f3dc3358c89976d81d690008">get_all_perms()</a>, <a class="el" href="items_8php.html#a896c1809d58f2d7a42cfe14577958ddf">get_atom_elements()</a>, <a class="el" href="features_8php.html#ae73c5b03b01c7284ed7e7e0e774e975c">get_features()</a>, <a class="el" href="items_8php.html#a04a35b610acfe54434df08adec39c0c7">get_feed_for()</a>, <a class="el" href="text_8php.html#a736db13a966b8abaf8c9198faa35911a">get_mood_verbs()</a>, <a class="el" href="permissions_8php.html#a040fd3d3b8517658b1668ae0cd093972">get_perms()</a>, <a class="el" href="text_8php.html#aa46f941155c2ac1155f2f17ffb0adb66">get_poke_verbs()</a>, <a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">Item\get_template_data()</a>, <a class="el" href="classApp.html#a871898becd0697d778f36d9336253ae8">App\get_widgets()</a>, <a class="el" href="acl__selectors_8php.html#aa1e3bc344ca2b29f97eb9860216d21a0">group_select()</a>, <a class="el" href="home_8php.html#aa1cf697851a646755baf537f75334c46">home_content()</a>, <a class="el" href="home_8php.html#ac4642c38b6f23a8d065dd4a75c620bde">home_init()</a>, <a class="el" href="html2bbcode_8php.html#a5ad726995ac4070213abdb3bd09f4837">html2bbcode()</a>, <a class="el" href="items_8php.html#ae73794179b62d39bb597ff670ab1c1e5">import_author_xchan()</a>, <a class="el" href="zot_8php.html#aeec89da5b6ff090c63a79de4de884a35">import_directory_profile()</a>, <a class="el" href="zot_8php.html#a56f3f65514e4e7f0cd117d01735aebd1">import_xchan()</a>, <a class="el" href="conversation_8php.html#aacbb12d372d5e9c3ab0735b4aea48fb3">item_photo_menu()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">item_store()</a>, <a class="el" href="items_8php.html#acf0bf7c9d21ac84f32effb754f7ad484">item_store_update()</a>, <a class="el" href="like_8php.html#a9d7dd268f21c21e9d29dd2aca2dd9538">like_content()</a>, <a class="el" href="boot_8php.html#aefecf8599036df7f1b95d6820e0e2fa4">login()</a>, <a class="el" href="magic_8php.html#acea2cc792849ca2d71d4b689f66518bf">magic_init()</a>, <a class="el" href="items_8php.html#a77da7ce9a117601d49ac4a67c71b514f">mail_store()</a>, <a class="el" href="profile__selectors_8php.html#a7473dd095987e1cdcc79d4f0bb5e6798">marital_selector()</a>, <a class="el" href="mood_8php.html#a7ae136dd7476865b4828136175db5022">mood_init()</a>, <a class="el" href="nav_8php.html#a43be0df73b90647ea70947ce004e231e">nav()</a>, <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>, <a class="el" href="contact__selectors_8php.html#ad472e4716426dd1a9dd77b62962454be">network_to_name()</a>, <a class="el" href="include_2follow_8php.html#ae387d4ae097c23d69f3247e7f08140c7">new_contact()</a>, <a class="el" href="enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc">notification()</a>, <a class="el" href="notifier_8php.html#a568c502f626cff95e344c0748938b85d">notifier_run()</a>, <a class="el" href="taxonomy_8php.html#a03f55ee46c5f496e42f3d29db8d09cce">obj_verbs()</a>, <a class="el" href="include_2oembed_8php.html#a98549b9af8140eda3eceaeedcaabc2c2">oembed_fetch_url()</a>, <a class="el" href="parse__url_8php.html#a05a9e8944380ba3cf6bbf5893dd4b74b">parse_url_content()</a>, <a class="el" href="comanche_8php.html#af7150df735e5ff9d467994cd6f769c6e">pdl_selector()</a>, <a class="el" href="permissions_8php.html#a67ada9ed51e77885b6b0f6a28cee1835">perm_is_allowed()</a>, <a class="el" href="include_2photos_8php.html#a6c40ef58aefef705a5adc84a40e97109">photo_upload()</a>, <a class="el" href="mod_2photos_8php.html#aa87382611a66ec5effdb2d78f13f5812">photos_content()</a>, <a class="el" href="ping_8php.html#a77217b1b190b4c5d8770867b45f0c0a1">ping_init()</a>, <a class="el" href="items_8php.html#a410f9c743877c125ca06312373346903">post_activity_item()</a>, <a class="el" href="post_8php.html#af4b48181ce773ef0cdfc972441445c34">post_init()</a>, <a class="el" href="text_8php.html#ae4df74296fbe55051ed3c035e55205e5">prepare_body()</a>, <a class="el" href="boot_8php.html#ab346a2ece14993861f3e4206befa94f0">proc_run()</a>, <a class="el" href="profile_8php.html#a3775cf6eef6587e5143133356a7b76c0">profile_content()</a>, <a class="el" href="identity_8php.html#a432259b2cf5b6f59be53e71db9f2c7dc">profile_sidebar()</a>, <a class="el" href="profiles_8php.html#a46975783b8b8d70402d51487eb1f0b00">profiles_content()</a>, <a class="el" href="profiles_8php.html#ab0362c81b1d3b0b12a772b9fac446e04">profiles_post()</a>, <a class="el" href="text_8php.html#a9c6ce4e12a4ac883c5e3f36fed6e1e09">replace_macros()</a>, <a class="el" href="settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586">settings_post()</a>, <a class="el" href="profile__selectors_8php.html#a3b50b3ea4ea4bdbebebfffc5d1b157c7">sexpref_selector()</a>, <a class="el" href="siteinfo_8php.html#a70c09bfb6dd1c86a125a35f62ed53656">siteinfo_content()</a>, <a class="el" href="text_8php.html#a3d225b253bb9e0f2498c11647d927b0b">smilies()</a>, <a class="el" href="subthread_8php.html#a50368f3d825b77996030528e7fbfa3d3">subthread_content()</a>, <a class="el" href="identity_8php.html#af2802bc13a00a17b867bba7978ba8f58">validate_channelname()</a>, <a class="el" href="wfinger_8php.html#ae21e50c8d0a5f3c9be9f43a4e519acd3">wfinger_init()</a>, <a class="el" href="widgets_8php.html#add9b24d3304e529a7975e96122315554">widget_affinity()</a>, <a class="el" href="xrd_8php.html#aee3cf087968e4a0ff3a87de16eb23270">xrd_init()</a>, <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>, <a class="el" href="identity_8php.html#a5b815330f3d177ab383af37a6c12e532">zid()</a>, and <a class="el" href="identity_8php.html#a680fbafc2db023c5b1309e0180e81315">zid_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a9039e15aae27676af7777dcbee5a11d6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">format_css_if_exists </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$source</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="plugin_8php.html#af92789f559b89a380e49d303218aeeca">head_get_css()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ad9ff8ba554576383c5911a4bce068c1f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">format_js_if_exists </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$source</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="plugin_8php.html#a65ab52cb1a7030d5190e247211bef2a1">head_get_js()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="acb63c27d07f6d7dffe95f98a6cef1295"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_intltext_template </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$root</em> = <code>''</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="boot_8php.html#a4c02d88e66852a01bd5a1feecb7c3ce3">check_config()</a>, <a class="el" href="lostpass_8php.html#a0314d94e48c789b1b3a201d740c9eab3">lostpass_content()</a>, <a class="el" href="lostpass_8php.html#a8ed35ba71a4404eaf4903da61d0321cc">lostpass_post()</a>, <a class="el" href="account_8php.html#a014de2d5d5c9785de5bf547a485822fa">send_reg_approval_email()</a>, <a class="el" href="account_8php.html#aa9c29c497c17d8f9344dce8631ad8761">send_verification_email()</a>, <a class="el" href="setup_8php.html#a13cf286774149a0a7bd8adb8179cec75">setup_post()</a>, and <a class="el" href="account_8php.html#ac5c570a2d46446bad4dd2501e9c5a4b1">user_allow()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a75f7dfed291fd7add7fc85b5c022a1f4"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_markup_template </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$root</em> = <code>''</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="admin_8php.html#afef415e4011607fbb665610441595015">admin_content()</a>, <a class="el" href="admin_8php.html#aaa6addf2dbc3f3fcf99244a56b41eade">admin_page_dbsync()</a>, <a class="el" href="admin_8php.html#a6943543f3138f6ee182cb701f415d1cc">admin_page_hubloc()</a>, <a class="el" href="admin_8php.html#a1d1362698af14d209aa3a0fb655551dd">admin_page_logs()</a>, <a class="el" href="admin_8php.html#a54128076986ba80c4a103de3fc3e19a8">admin_page_plugins()</a>, <a class="el" href="admin_8php.html#ac0f3bd12431c056aad77bac9d09fa30e">admin_page_site()</a>, <a class="el" href="admin_8php.html#ac6e95b920b5abd030cc522964987087a">admin_page_summary()</a>, <a class="el" href="admin_8php.html#af124619fdc278fe2bf14c45ddaa260fb">admin_page_themes()</a>, <a class="el" href="admin_8php.html#a62f10f90c47686c9c3c37c4c03a108d2">admin_page_users()</a>, <a class="el" href="identity_8php.html#aa870d2c1f558cfd52bef05bc124e8fa4">advanced_profile()</a>, <a class="el" href="text_8php.html#a75c243e06341ec16bd5a44b9b1cacd85">alt_pager()</a>, <a class="el" href="include_2api_8php.html#a5990101034e7abf6404feba3cd273629">api_apply_template()</a>, <a class="el" href="mod_2api_8php.html#a33315b5bbf5418f6850b2038107b526d">api_content()</a>, <a class="el" href="apps_8php.html#a546016cb960d0b110ee8e489dfa6c27c">apps_content()</a>, <a class="el" href="view_2theme_2apw_2php_2config_8php.html#a8b51951a70e1c1324be71345a61d70ec">apw_form()</a>, <a class="el" href="blocks_8php.html#a2531a8fd51db3cecb2eb20c002c66e12">blocks_content()</a>, <a class="el" href="view_2theme_2blogga_2php_2config_8php.html#a8a311a402d3e746ce53fadc38e4b2d27">blogtheme_form()</a>, <a class="el" href="classApp.html#a08f0537964d98958d218066364cff785">App\build_pagehead()</a>, <a class="el" href="contact__widgets_8php.html#a165eb021e61c4dcab2a552f28628d353">categories_widget()</a>, <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>, <a class="el" href="chanview_8php.html#a4192c6da888c8c1165851acf9ad4cb8b">chanview_content()</a>, <a class="el" href="setup_8php.html#a14d208682a88632290c895d20da6e7d6">check_php()</a>, <a class="el" href="common_8php.html#ab63408f39abef7a6915186e8dabc5a96">common_content()</a>, <a class="el" href="contact__widgets_8php.html#a552f8544528cec0c995cea7287ea9d65">common_friends_visitor_widget()</a>, <a class="el" href="connect_8php.html#a489f0a66c660de6ec4d6917b27674f07">connect_content()</a>, <a class="el" href="connections_8php.html#aec2e457420fce3e3bf6a9f48e36df25c">connections_content()</a>, <a class="el" href="connedit_8php.html#a795acb3d9d841f55c255d7611681ab67">connedit_content()</a>, <a class="el" href="boot_8php.html#acc4e0c910af066148b810e5fde55fff1">construct_page()</a>, <a class="el" href="text_8php.html#ad6432621d0fafcbcf3d3b9b49bef7784">contact_block()</a>, <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation()</a>, <a class="el" href="delegate_8php.html#a943eea8996ef348eb845c498f9f354dd">delegate_content()</a>, <a class="el" href="text_8php.html#a87a3cefc603302c78982f1d8e1245265">design_tools()</a>, <a class="el" href="dir__fns_8php.html#acf621621e929d49441da30aad76a58cf">dir_safe_mode()</a>, <a class="el" href="dir__fns_8php.html#ae56881d69bb6f8e828c9e35454386774">dir_sort_links()</a>, <a class="el" href="mod_2directory_8php.html#aac79396570d759da2efac24fcedf5b44">directory_content()</a>, <a class="el" href="dirprofile_8php.html#a3e1d30d3d93863ff5615f2df4ac7f052">dirprofile_init()</a>, <a class="el" href="display_8php.html#a37137c98d47bf3306f4c2bb9f5b60de0">display_content()</a>, <a class="el" href="editblock_8php.html#abbe8f55de06967bc8d79d620509a49e6">editblock_content()</a>, <a class="el" href="editlayout_8php.html#aa877e4157a26b099de904164181dd386">editlayout_content()</a>, <a class="el" href="editpost_8php.html#a34011690864d122680c802e9e748ccfb">editpost_content()</a>, <a class="el" href="editwebpage_8php.html#a375e945255fad79a71036528f7480650">editwebpage_content()</a>, <a class="el" href="events_8php.html#a1d293fb217ae6bc9e3858c4b32e363ec">events_content()</a>, <a class="el" href="fbrowser_8php.html#aee476addcf7a3e0fe9454f7dfd5a56c4">fbrowser_content()</a>, <a class="el" href="datetime_8php.html#a03900dcf0f9e3c58793a031673a70326">field_timezone()</a>, <a class="el" href="contact__widgets_8php.html#a1eda66319d170f60a8d07c7ece95533b">fileas_widget()</a>, <a class="el" href="filer_8php.html#a5fd5d7e61b2f9c43cb5f110c89dc4274">filer_content()</a>, <a class="el" href="filestorage_8php.html#a61bb1be78472555df4ce619f51014040">filestorage_content()</a>, <a class="el" href="contact__widgets_8php.html#a57e73ebcfd62bb5d8c7a7b9e663726d6">findpeople_widget()</a>, <a class="el" href="text_8php.html#a3054189cff173977f4216c9a3dd29e1b">format_categories()</a>, <a class="el" href="text_8php.html#a4e4d42b0a805148d9f9a92bcac89bf91">format_filer()</a>, <a class="el" href="identity_8php.html#ad2c97627a313d53df1a1c7b4215ddb51">get_birthdays()</a>, <a class="el" href="classItem.html#a3ee7667c2ec6cd7657328e27848c0bdf">Item\get_comment_box()</a>, <a class="el" href="identity_8php.html#ae381db3d43f8e7c1da8b15d14ecf5312">get_events()</a>, <a class="el" href="items_8php.html#a04a35b610acfe54434df08adec39c0c7">get_feed_for()</a>, <a class="el" href="mod_2group_8php.html#a07a64f6c65b0080d8190b3d9728a7a83">group_content()</a>, <a class="el" href="include_2group_8php.html#a6a69bd7be032fa8ce4e49c43a42cc6e9">group_side()</a>, <a class="el" href="help_8php.html#af055e15f600ffa6fbca9386fdf715224">help_content()</a>, <a class="el" href="hostxrd_8php.html#aa37ffc8e7900bc76c4828bd25916db92">hostxrd_init()</a>, <a class="el" href="import_8php.html#afdf25ed70096d5dbf4f6d0ca79fea184">import_content()</a>, <a class="el" href="invite_8php.html#a244385b28cfd021d308715f01158bfd9">invite_content()</a>, <a class="el" href="text_8php.html#a71f6952243d3fe1c5a8154f78027e29c">lang_selector()</a>, <a class="el" href="layouts_8php.html#a6e0193759ad9eef76d3df2db24237b50">layouts_content()</a>, <a class="el" href="boot_8php.html#aefecf8599036df7f1b95d6820e0e2fa4">login()</a>, <a class="el" href="lostpass_8php.html#a0314d94e48c789b1b3a201d740c9eab3">lostpass_content()</a>, <a class="el" href="mail_8php.html#a3c7c485fc69f92371e8b20936040eca1">mail_content()</a>, <a class="el" href="manage_8php.html#a2bca247b5296827638959138367db4f5">manage_content()</a>, <a class="el" href="match_8php.html#a1dd853e959b9e70c1911bb2fb5f5130d">match_content()</a>, <a class="el" href="mod_2menu_8php.html#a6fed23af14d71a78a4153c8363a685cf">menu_content()</a>, <a class="el" href="include_2menu_8php.html#a890cc6237971e15f15702e6b2e88502e">menu_render()</a>, <a class="el" href="mod_2message_8php.html#ac72dfed3ce08fcb331d66b37edc6e15f">message_content()</a>, <a class="el" href="text_8php.html#a2a902f5fdba8646333e997898ac45ea3">micropro()</a>, <a class="el" href="include_2group_8php.html#ab0e422a0f31c0c64fd9084ca03d85f32">mini_group_select()</a>, <a class="el" href="mitem_8php.html#a7a31b702ecad18eeb6a38b243ff0037e">mitem_content()</a>, <a class="el" href="mood_8php.html#a721b9b6703b3234a005641c92d409b8f">mood_content()</a>, <a class="el" href="nav_8php.html#a43be0df73b90647ea70947ce004e231e">nav()</a>, <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>, <a class="el" href="new__channel_8php.html#ae585191610f79da129492482ce8e2fee">new_channel_content()</a>, <a class="el" href="enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc">notification()</a>, <a class="el" href="notifications_8php.html#aadd0b5525bd8c283a5d8a37982bbfe62">notifications_content()</a>, <a class="el" href="mod_2notify_8php.html#acdf3851688ebd6d6a575eb84ef9febe3">notify_content()</a>, <a class="el" href="include_2oembed_8php.html#a26bb4c1e330d2f94ea7b6ce2fe970cf3">oembed_format_object()</a>, <a class="el" href="oexchange_8php.html#ac8e2e469ddc3db984b0c1b44558aca59">oexchange_init()</a>, <a class="el" href="opensearch_8php.html#ad13034877a496565ac7d99e9fc6f55e9">opensearch_init()</a>, <a class="el" href="page__widgets_8php.html#ad82011c1ed90d9de8b9f34c12af5c6f0">pagelist_widget()</a>, <a class="el" href="include_2photos_8php.html#af24c6aeed28ecc31ec39e7d9a1804979">photos_album_widget()</a>, <a class="el" href="mod_2photos_8php.html#aa87382611a66ec5effdb2d78f13f5812">photos_content()</a>, <a class="el" href="poco_8php.html#a53def16f75e3d41f1d2bb7cfa4905498">poco_init()</a>, <a class="el" href="poke_8php.html#ac9190563a8da9c07a16f9dcd71cf6993">poke_content()</a>, <a class="el" href="acl__selectors_8php.html#a7b5446e999636ceceea65c154d865a31">populate_acl()</a>, <a class="el" href="items_8php.html#abe695dd89e1e10ed042c26b80114f0ed">posted_date_widget()</a>, <a class="el" href="identity_8php.html#a432259b2cf5b6f59be53e71db9f2c7dc">profile_sidebar()</a>, <a class="el" href="profiles_8php.html#a46975783b8b8d70402d51487eb1f0b00">profiles_content()</a>, <a class="el" href="view_2theme_2redbasic_2php_2config_8php.html#a8574a41fa9735ee391ba57ab24b93793">redbasic_form()</a>, <a class="el" href="register_8php.html#a0e91f57f111407ea8d3223a05022bb2a">register_content()</a>, <a class="el" href="removeme_8php.html#a065a589caa2aa84c60f7073a28f0ad9c">removeme_content()</a>, <a class="el" href="rmagic_8php.html#a3e28db1e5cfa7e5c2617f90222c1caef">rmagic_content()</a>, <a class="el" href="rpost_8php.html#a8190354d789000806d9879aea276728f">rpost_content()</a>, <a class="el" href="search_8php.html#ab2568591359edde5b483a6cd9a24b2cc">search_content()</a>, <a class="el" href="setup_8php.html#a88247384a96e14516f474d7af6a465c1">setup_content()</a>, <a class="el" href="siteinfo_8php.html#a70c09bfb6dd1c86a125a35f62ed53656">siteinfo_content()</a>, <a class="el" href="sources_8php.html#ac442ccef080ab95772d8929fcafcb4b7">sources_content()</a>, <a class="el" href="suggest_8php.html#a58748a8235d4523f8333847f3e42dd91">suggest_content()</a>, <a class="el" href="text_8php.html#af9c9ac3f74c82dc60acfa404d0e9dc53">theme_attachments()</a>, <a class="el" href="thing_8php.html#a24a35f1e64029a67fdbea94a776ae04b">thing_content()</a>, <a class="el" href="Contact_8php.html#a6348a532c9d26cd1c9afbc9aa6aa8960">vcard_from_xchan()</a>, <a class="el" href="viewconnections_8php.html#ab6c4d983e97b3a8a879567ff76507776">viewconnections_content()</a>, <a class="el" href="vote_8php.html#a6aa67489bf458ca5e3206e46dac68596">vote_content()</a>, <a class="el" href="webpages_8php.html#af3b7397d4abc153e3d2147740ee1a41d">webpages_content()</a>, <a class="el" href="widgets_8php.html#add9b24d3304e529a7975e96122315554">widget_affinity()</a>, <a class="el" href="widgets_8php.html#a7b1e357b5a2027718470b77ec921fc65">widget_archive()</a>, <a class="el" href="widgets_8php.html#a5ab3b64496e02cab56429978ad55f1c0">widget_filer()</a>, <a class="el" href="widgets_8php.html#ad1bf7aa69e8d100d95faba17c7bc91cd">widget_follow()</a>, <a class="el" href="widgets_8php.html#afa2e55a78f95667a6da082efac7fec74">widget_mailmenu()</a>, <a class="el" href="widgets_8php.html#a45ea061dabe9a8372e4ca3b9e5714256">widget_notes()</a>, <a class="el" href="widgets_8php.html#a94203eb9bcd63cbdecbbcb15163598d8">widget_savedsearch()</a>, <a class="el" href="widgets_8php.html#aaa73bcf1702eaadd9dcd253502f55e01">widget_settings_menu()</a>, <a class="el" href="widgets_8php.html#a0d404276fedc59f5038cf5c085028326">widget_suggestions()</a>, <a class="el" href="page__widgets_8php.html#a1a1e729da27f252cab6678288a17958f">writepages_widget()</a>, and <a class="el" href="xrd_8php.html#aee3cf087968e4a0ff3a87de16eb23270">xrd_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aff0178bd8d0b34a94d5efddc883edd35"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_plugin_info </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$plugin</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="admin_8php.html#a54128076986ba80c4a103de3fc3e19a8">admin_page_plugins()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ad48de9c0fb7f19413a2aa49250d00405"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_theme_info </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$theme</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="admin_8php.html#af124619fdc278fe2bf14c45ddaa260fb">admin_page_themes()</a>, and <a class="el" href="pretheme_8php.html#af5660943ee99db5fd75182316522eafe">pretheme_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a48047edfbef770125a5508dcc2f9282f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_theme_screenshot </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$theme</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="admin_8php.html#af124619fdc278fe2bf14c45ddaa260fb">admin_page_themes()</a>, and <a class="el" href="pretheme_8php.html#af5660943ee99db5fd75182316522eafe">pretheme_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a23c4fccf1eb5fcd63b24783ba1f05f7a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">head_add_css </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$src</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$media</em> = <code>'screen'</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="boot_8php.html#acc4e0c910af066148b810e5fde55fff1">construct_page()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a516591850f4fd49fd1425cfa54089db8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">head_add_js </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$src</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="boot_8php.html#acc4e0c910af066148b810e5fde55fff1">construct_page()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="af92789f559b89a380e49d303218aeeca"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">head_get_css </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classApp.html#a08f0537964d98958d218066364cff785">App\build_pagehead()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a65ab52cb1a7030d5190e247211bef2a1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">head_get_js </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classApp.html#a08f0537964d98958d218066364cff785">App\build_pagehead()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a9ab6caae31935f6cf781ce7872db7cdf"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">head_remove_css </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$src</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$media</em> = <code>'screen'</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a4a0ae7b881e7c8af99a69e3b03f898b4"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">head_remove_js </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$src</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aeaebe63dcf6fa2794f363ba2bc0b2c6b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">insert_hook </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$hook</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$fn</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>insert_hook($hook,$fn)</p>
+<p>Insert a short-lived hook into the running page request. Hooks are normally persistent so that they can be called across asynchronous processes such as delivery and poll processes.</p>
+<p>insert_hook lets you attach a hook callback immediately which will not persist beyond the life of this page request or the current process.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype">string</td><td class="paramname">$hook,;</td><td>name of hook to attach callback </td></tr>
+ <tr><td class="paramtype">string</td><td class="paramname">$fn,;</td><td>function name of callback handler </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a class="anchor" id="a482131013272a1d5d5c1b1469c6c55d5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">install_plugin </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$plugin</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="admin_8php.html#a54128076986ba80c4a103de3fc3e19a8">admin_page_plugins()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a326365e48ef94f0b9a0a771b8d75e813"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">load_hooks </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="boot_8php.html#a4c02d88e66852a01bd5a1feecb7c3ce3">check_config()</a>, and <a class="el" href="cli__startup_8php.html#adfdde63686e33ccd4851fa5edc4fc70b">cli_startup()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a9ca9632b7309a65b05c03a3e2f473a3d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">load_plugin </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$plugin</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="boot_8php.html#a4c02d88e66852a01bd5a1feecb7c3ce3">check_config()</a>, and <a class="el" href="plugin_8php.html#a482131013272a1d5d5c1b1469c6c55d5">install_plugin()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a425472c5f3afc137268b2ad45652b209"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">register_hook </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$hook</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$file</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$function</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$priority</em> = <code>0</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="blogga_2view_2theme_2blog_2theme_8php.html#aae58cc837fe56473d9f3370abfe533ae">blog_install()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="af9ac19004dca49adae1ac7a0d9f3b025"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">reload_plugins </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="poller_8php.html#a5f12df3a4738124b6c039971e87e76da">poller_run()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a0e8c2ea50bfdbc39e17ccccaea21ddc3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">script_path </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="plugin_8php.html#a9039e15aae27676af7777dcbee5a11d6">format_css_if_exists()</a>, and <a class="el" href="plugin_8php.html#ad9ff8ba554576383c5911a4bce068c1f">format_js_if_exists()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a030cec6793b909c439c0336ba39b1571"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">service_class_allows </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$property</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$usage</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="identity_8php.html#ac9fcd5c4c371998790b5c55c3d0f4633">identity_check_service_class()</a>, <a class="el" href="item_8php.html#a5b1b36cb301a94b38150074f0d424e74">item_check_service_class()</a>, and <a class="el" href="include_2follow_8php.html#ae387d4ae097c23d69f3247e7f08140c7">new_contact()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a905b54e10704b283ac64680a8abc0971"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">service_class_fetch </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$property</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2attach_8php.html#a84a8a64c4805e1525b42d4add464833f">attach_store()</a>, <a class="el" href="classRedDirectory.html#a2d12d99d38a6a75fc9a830b2f7fc0bf0">RedDirectory\createFile()</a>, <a class="el" href="filestorage_8php.html#a61bb1be78472555df4ce619f51014040">filestorage_content()</a>, <a class="el" href="manage_8php.html#a2bca247b5296827638959138367db4f5">manage_content()</a>, <a class="el" href="include_2photos_8php.html#a6c40ef58aefef705a5adc84a40e97109">photo_upload()</a>, <a class="el" href="mod_2photos_8php.html#aa87382611a66ec5effdb2d78f13f5812">photos_content()</a>, <a class="el" href="classRedFile.html#a41a49a583eb276b75626fcf97f4a699c">RedFile\put()</a>, and <a class="el" href="widgets_8php.html#ad1bf7aa69e8d100d95faba17c7bc91cd">widget_follow()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a65fedcffbe03562ef844cabee37d34e2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">theme_include </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$file</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$root</em> = <code>''</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="boot_8php.html#acc4e0c910af066148b810e5fde55fff1">construct_page()</a>, <a class="el" href="plugin_8php.html#a9039e15aae27676af7777dcbee5a11d6">format_css_if_exists()</a>, <a class="el" href="plugin_8php.html#ad9ff8ba554576383c5911a4bce068c1f">format_js_if_exists()</a>, <a class="el" href="classFriendicaSmartyEngine.html#a35ec0ee828c36640ea25296bcb84a118">FriendicaSmartyEngine\get_intltext_template()</a>, <a class="el" href="classFriendicaSmartyEngine.html#aab5994077fc3a64222e41b28e2bd8d88">FriendicaSmartyEngine\get_markup_template()</a>, and <a class="el" href="classTemplate.html#afd97b4b1e7754a550e67c0ea79159059">Template\get_markup_template()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a093a9cb98f51e3643634bd8bc6ed6e76"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">uninstall_plugin </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$plugin</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="admin_8php.html#a54128076986ba80c4a103de3fc3e19a8">admin_page_plugins()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a90538627db68605aeb6db17a8ead6523"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">unload_plugin </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$plugin</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="boot_8php.html#a4c02d88e66852a01bd5a1feecb7c3ce3">check_config()</a>, and <a class="el" href="plugin_8php.html#a093a9cb98f51e3643634bd8bc6ed6e76">uninstall_plugin()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a56f71fe5adf9586ce950523d8180443e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">unregister_hook </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$hook</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$file</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$function</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="blogga_2view_2theme_2blog_2theme_8php.html#a3e77dbe111f330c64a1ff6c741cd515c">blog_uninstall()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a754d7f53b3abc557b753c057dc4e021d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">upgrade_bool_message </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$bbcode</em> = <code>false</code></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a4fc13e528367f510fcb6d8bbfc559040"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">upgrade_link </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$bbcode</em> = <code>false</code></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="plugin_8php.html#a754d7f53b3abc557b753c057dc4e021d">upgrade_bool_message()</a>, and <a class="el" href="plugin_8php.html#a901657dd078e070516cf97285e0bada7">upgrade_message()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a901657dd078e070516cf97285e0bada7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">upgrade_message </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$bbcode</em> = <code>false</code></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2attach_8php.html#a84a8a64c4805e1525b42d4add464833f">attach_store()</a>, <a class="el" href="identity_8php.html#ac9fcd5c4c371998790b5c55c3d0f4633">identity_check_service_class()</a>, <a class="el" href="item_8php.html#a5b1b36cb301a94b38150074f0d424e74">item_check_service_class()</a>, <a class="el" href="include_2follow_8php.html#ae387d4ae097c23d69f3247e7f08140c7">new_contact()</a>, and <a class="el" href="include_2photos_8php.html#a6c40ef58aefef705a5adc84a40e97109">photo_upload()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/plugin_8php.js b/doc/html/plugin_8php.js
new file mode 100644
index 000000000..e338c63d6
--- /dev/null
+++ b/doc/html/plugin_8php.js
@@ -0,0 +1,33 @@
+var plugin_8php =
+[
+ [ "call_hooks", "plugin_8php.html#a7f05de16c0a32602853b09b99dd85e7c", null ],
+ [ "format_css_if_exists", "plugin_8php.html#a9039e15aae27676af7777dcbee5a11d6", null ],
+ [ "format_js_if_exists", "plugin_8php.html#ad9ff8ba554576383c5911a4bce068c1f", null ],
+ [ "get_intltext_template", "plugin_8php.html#acb63c27d07f6d7dffe95f98a6cef1295", null ],
+ [ "get_markup_template", "plugin_8php.html#a75f7dfed291fd7add7fc85b5c022a1f4", null ],
+ [ "get_plugin_info", "plugin_8php.html#aff0178bd8d0b34a94d5efddc883edd35", null ],
+ [ "get_theme_info", "plugin_8php.html#ad48de9c0fb7f19413a2aa49250d00405", null ],
+ [ "get_theme_screenshot", "plugin_8php.html#a48047edfbef770125a5508dcc2f9282f", null ],
+ [ "head_add_css", "plugin_8php.html#a23c4fccf1eb5fcd63b24783ba1f05f7a", null ],
+ [ "head_add_js", "plugin_8php.html#a516591850f4fd49fd1425cfa54089db8", null ],
+ [ "head_get_css", "plugin_8php.html#af92789f559b89a380e49d303218aeeca", null ],
+ [ "head_get_js", "plugin_8php.html#a65ab52cb1a7030d5190e247211bef2a1", null ],
+ [ "head_remove_css", "plugin_8php.html#a9ab6caae31935f6cf781ce7872db7cdf", null ],
+ [ "head_remove_js", "plugin_8php.html#a4a0ae7b881e7c8af99a69e3b03f898b4", null ],
+ [ "insert_hook", "plugin_8php.html#aeaebe63dcf6fa2794f363ba2bc0b2c6b", null ],
+ [ "install_plugin", "plugin_8php.html#a482131013272a1d5d5c1b1469c6c55d5", null ],
+ [ "load_hooks", "plugin_8php.html#a326365e48ef94f0b9a0a771b8d75e813", null ],
+ [ "load_plugin", "plugin_8php.html#a9ca9632b7309a65b05c03a3e2f473a3d", null ],
+ [ "register_hook", "plugin_8php.html#a425472c5f3afc137268b2ad45652b209", null ],
+ [ "reload_plugins", "plugin_8php.html#af9ac19004dca49adae1ac7a0d9f3b025", null ],
+ [ "script_path", "plugin_8php.html#a0e8c2ea50bfdbc39e17ccccaea21ddc3", null ],
+ [ "service_class_allows", "plugin_8php.html#a030cec6793b909c439c0336ba39b1571", null ],
+ [ "service_class_fetch", "plugin_8php.html#a905b54e10704b283ac64680a8abc0971", null ],
+ [ "theme_include", "plugin_8php.html#a65fedcffbe03562ef844cabee37d34e2", null ],
+ [ "uninstall_plugin", "plugin_8php.html#a093a9cb98f51e3643634bd8bc6ed6e76", null ],
+ [ "unload_plugin", "plugin_8php.html#a90538627db68605aeb6db17a8ead6523", null ],
+ [ "unregister_hook", "plugin_8php.html#a56f71fe5adf9586ce950523d8180443e", null ],
+ [ "upgrade_bool_message", "plugin_8php.html#a754d7f53b3abc557b753c057dc4e021d", null ],
+ [ "upgrade_link", "plugin_8php.html#a4fc13e528367f510fcb6d8bbfc559040", null ],
+ [ "upgrade_message", "plugin_8php.html#a901657dd078e070516cf97285e0bada7", null ]
+]; \ No newline at end of file
diff --git a/doc/html/po2php_8php.html b/doc/html/po2php_8php.html
new file mode 100644
index 000000000..439411fd6
--- /dev/null
+++ b/doc/html/po2php_8php.html
@@ -0,0 +1,147 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: util/po2php.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('po2php_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">po2php.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a3b75e36f913198299e99559b175cd8b4"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="po2php_8php.html#a3b75e36f913198299e99559b175cd8b4">po2php_run</a> ($<a class="el" href="boot_8php.html#a768f00b7d66be0daf7ef4eea2e862006">argv</a>, $<a class="el" href="boot_8php.html#abc0a90a1a77f5b668aa7e4b57d1776a7">argc</a>)</td></tr>
+<tr class="separator:a3b75e36f913198299e99559b175cd8b4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a3b75e36f913198299e99559b175cd8b4"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">po2php_run </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$argv</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$argc</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/po2php_8php.js b/doc/html/po2php_8php.js
new file mode 100644
index 000000000..e8f3c4f39
--- /dev/null
+++ b/doc/html/po2php_8php.js
@@ -0,0 +1,4 @@
+var po2php_8php =
+[
+ [ "po2php_run", "po2php_8php.html#a3b75e36f913198299e99559b175cd8b4", null ]
+]; \ No newline at end of file
diff --git a/doc/html/poco_8php.html b/doc/html/poco_8php.html
new file mode 100644
index 000000000..c9e29cfcb
--- /dev/null
+++ b/doc/html/poco_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/poco.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('poco_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">poco.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a53def16f75e3d41f1d2bb7cfa4905498"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="poco_8php.html#a53def16f75e3d41f1d2bb7cfa4905498">poco_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a53def16f75e3d41f1d2bb7cfa4905498"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a53def16f75e3d41f1d2bb7cfa4905498"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">poco_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/poco_8php.js b/doc/html/poco_8php.js
new file mode 100644
index 000000000..48ccaafb9
--- /dev/null
+++ b/doc/html/poco_8php.js
@@ -0,0 +1,4 @@
+var poco_8php =
+[
+ [ "poco_init", "poco_8php.html#a53def16f75e3d41f1d2bb7cfa4905498", null ]
+]; \ No newline at end of file
diff --git a/doc/html/poke_8php.html b/doc/html/poke_8php.html
new file mode 100644
index 000000000..b7033bde3
--- /dev/null
+++ b/doc/html/poke_8php.html
@@ -0,0 +1,157 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/poke.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('poke_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">poke.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a9725aab97b3983e6a98bd81c4efe7d3b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="poke_8php.html#a9725aab97b3983e6a98bd81c4efe7d3b">poke_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a9725aab97b3983e6a98bd81c4efe7d3b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac9190563a8da9c07a16f9dcd71cf6993"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="poke_8php.html#ac9190563a8da9c07a16f9dcd71cf6993">poke_content</a> (&amp;$a)</td></tr>
+<tr class="separator:ac9190563a8da9c07a16f9dcd71cf6993"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="ac9190563a8da9c07a16f9dcd71cf6993"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">poke_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a9725aab97b3983e6a98bd81c4efe7d3b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">poke_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Poke, prod, finger, or otherwise do unspeakable things to somebody - who must be a connection in your address book This function can be invoked with the required arguments (verb and cid and private and possibly parent) silently via ajax or other web request. You must be logged in and connected to a channel. If the required arguments aren't present, we'll display a simple form to choose a recipient and a verb. parent is a special argument which let's you attach this activity as a comment to an existing conversation, which may have started with somebody else poking (etc.) somebody, but this isn't necessary. This can be used in the adult plugin version to have entire conversations where Alice poked Bob, Bob fingered Alice, Alice hugged Bob, etc.</p>
+<p>private creates a private conversation with the recipient. Otherwise your channel's default post privacy is used. </p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/poke_8php.js b/doc/html/poke_8php.js
new file mode 100644
index 000000000..3acebd0ae
--- /dev/null
+++ b/doc/html/poke_8php.js
@@ -0,0 +1,5 @@
+var poke_8php =
+[
+ [ "poke_content", "poke_8php.html#ac9190563a8da9c07a16f9dcd71cf6993", null ],
+ [ "poke_init", "poke_8php.html#a9725aab97b3983e6a98bd81c4efe7d3b", null ]
+]; \ No newline at end of file
diff --git a/doc/html/poller_8php.html b/doc/html/poller_8php.html
new file mode 100644
index 000000000..54f854214
--- /dev/null
+++ b/doc/html/poller_8php.html
@@ -0,0 +1,147 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/poller.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('poller_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">poller.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a5f12df3a4738124b6c039971e87e76da"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="poller_8php.html#a5f12df3a4738124b6c039971e87e76da">poller_run</a> ($<a class="el" href="boot_8php.html#a768f00b7d66be0daf7ef4eea2e862006">argv</a>, $<a class="el" href="boot_8php.html#abc0a90a1a77f5b668aa7e4b57d1776a7">argc</a>)</td></tr>
+<tr class="separator:a5f12df3a4738124b6c039971e87e76da"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a5f12df3a4738124b6c039971e87e76da"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">poller_run </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$argv</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$argc</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/poller_8php.js b/doc/html/poller_8php.js
new file mode 100644
index 000000000..94d6e67a4
--- /dev/null
+++ b/doc/html/poller_8php.js
@@ -0,0 +1,4 @@
+var poller_8php =
+[
+ [ "poller_run", "poller_8php.html#a5f12df3a4738124b6c039971e87e76da", null ]
+]; \ No newline at end of file
diff --git a/doc/html/post_8php.html b/doc/html/post_8php.html
new file mode 100644
index 000000000..ca5ac2fb3
--- /dev/null
+++ b/doc/html/post_8php.html
@@ -0,0 +1,200 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/post.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('post_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">post.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:af4b48181ce773ef0cdfc972441445c34"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="post_8php.html#af4b48181ce773ef0cdfc972441445c34">post_init</a> (&amp;$a)</td></tr>
+<tr class="separator:af4b48181ce773ef0cdfc972441445c34"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af59e6a1dc22d19d9257b01cd7ccedb75"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="post_8php.html#af59e6a1dc22d19d9257b01cd7ccedb75">post_post</a> (&amp;$a)</td></tr>
+<tr class="separator:af59e6a1dc22d19d9257b01cd7ccedb75"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="af4b48181ce773ef0cdfc972441445c34"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">post_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Zot endpoint </p>
+<h1>Magic Auth</h1>
+<p>So-called "magic auth" takes place by a special exchange. On the site where the "channel to be authenticated" lives (e.g. $mysite), a redirection is made via $mysite/magic to the zot endpoint of the remote site ($remotesite) with special GET parameters.</p>
+<p>The endpoint is typically <a href="https://$remotesite/post">https://$remotesite/post</a> - or whatever was specified as the callback url in prior communications (we will bootstrap an address and fetch a zot info packet if possible where no prior communications exist)</p>
+<p>Four GET parameters are supplied:</p>
+<p>auth =&gt; the urlencoded webbie (<a href="#" onclick="location.href='mai'+'lto:'+'cha'+'nn'+'el@'+'ho'+'st.'+'do'+'mai'+'n'; return false;">chann<span style="display: none;">.nosp@m.</span>el@h<span style="display: none;">.nosp@m.</span>ost.d<span style="display: none;">.nosp@m.</span>omai<span style="display: none;">.nosp@m.</span>n</a>) of the channel requesting access dest =&gt; the desired destination URL (urlencoded) sec =&gt; a random string which is also stored on $mysite for use during the verification phase. version =&gt; the zot revision</p>
+<p>When this packet is received, an "auth-check" zot message is sent to $mysite. (e.g. if $_GET['auth'] is <a href="#" onclick="location.href='mai'+'lto:'+'foo'+'ba'+'r@p'+'od'+'unk'+'.e'+'du'; return false;">fooba<span style="display: none;">.nosp@m.</span>r@po<span style="display: none;">.nosp@m.</span>dunk.<span style="display: none;">.nosp@m.</span>edu</a>, a zot packet is sent to the podunk.edu zot endpoint, which is typically /post) If no information has been recorded about the requesting identity a zot information packet will be retrieved before continuing.</p>
+<p>The sender of this packet is an arbitrary/random site channel. The recipients will be a single recipient corresponding to the guid and guid_sig we have associated with the requesting auth identity</p>
+<p>{ "type":"auth_check", "sender":{ "guid":"kgVFf_...", "guid_sig":"PT9-TApz...", "url":"http:\/\/podunk.edu", "url_sig":"T8Bp7j..." }, "recipients":{ { "guid":"ZHSqb...", "guid_sig":"JsAAXi..." } } "callback":"\/post", "version":1, "secret":"1eaa661", "secret_sig":"eKV968b1..." }</p>
+<p>auth_check messages MUST use encapsulated encryption. This message is sent to the origination site, which checks the 'secret' to see if it is the same as the 'sec' which it passed originally. It also checks the secret_sig which is the secret signed by the destination channel's private key and base64url encoded. If everything checks out, a json packet is returned:</p>
+<p>{ "success":1, "confirm":"q0Ysovd1u..." "service_class":(optional) "level":(optional) }</p>
+<p>'confirm' in this case is the base64url encoded RSA signature of the concatenation of 'secret' with the base64url encoded whirlpool hash of the requestor's guid and guid_sig; signed with the source channel private key. This prevents a man-in-the-middle from inserting a rogue success packet. Upon receipt and successful verification of this packet, the destination site will redirect to the original destination URL and indicate a successful remote login. Service_class can be used by cooperating sites to provide different access rights based on account rights and subscription plans. It is a string whose contents are not defined by protocol. Example: "basic" or "gold".</p>
+
+</div>
+</div>
+<a class="anchor" id="af59e6a1dc22d19d9257b01cd7ccedb75"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">post_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>post_post(&amp;$a) zot communications and messaging</p>
+<p>Sender HTTP posts to this endpoint ($site/post typically) with 'data' parameter set to json zot message packet. This packet is optionally encrypted, which we will discover if the json has an 'iv' element. $contents =&gt; array( 'alg' =&gt; 'aes256cbc', 'iv' =&gt; initialisation vector, 'key' =&gt; decryption key, 'data' =&gt; encrypted data); $contents-&gt;iv and $contents-&gt;key are random strings encrypted with this site's RSA public key and then base64url encoded. Currently only 'aes256cbc' is used, but this is extensible should that algorithm prove inadequate.</p>
+<p>Once decrypted, one will find the normal json_encoded zot message packet.</p>
+<p>Defined packet types are: notify, purge, refresh, auth_check, ping, and pickup</p>
+<p>Standard packet: (used by notify, purge, refresh, and auth_check)</p>
+<p>{ "type": "notify", "sender":{ "guid":"kgVFf_1...", "guid_sig":"PT9-TApzp...", "url":"http:\/\/podunk.edu", "url_sig":"T8Bp7j5...", }, "recipients": { optional recipient array }, "callback":"\/post", "version":1, "secret":"1eaa...", "secret_sig": "df89025470fac8..." }</p>
+<p>Signature fields are all signed with the sender channel private key and base64url encoded. Recipients are arrays of guid and guid_sig, which were previously signed with the recipients private key and base64url encoded and later obtained via channel discovery. Absence of recipients indicates a public message or visible to all potential listeners on this site.</p>
+<p>"pickup" packet: The pickup packet is sent in response to a notify packet from another site</p>
+<p>{ "type":"pickup", "url":"http:\/\/example.com", "callback":"http:\/\/example.com\/post", "callback_sig":"teE1_fLI...", "secret":"1eaa...", "secret_sig":"O7nB4_..." }</p>
+<p>In the pickup packet, the sig fields correspond to the respective data element signed with this site's system private key and then base64url encoded. The "secret" is the same as the original secret from the notify packet.</p>
+<p>If verification is successful, a json structure is returned containing a success indicator and an array of type 'pickup'. Each pickup element contains the original notify request and a message field whose contents are dependent on the message type</p>
+<p>This JSON array is AES encapsulated using the site public key of the site that sent the initial zot pickup packet. Using the above example, this would be example.com.</p>
+<p>{ "success":1, "pickup":{ "notify":{ "type":"notify", "sender":{ "guid":"kgVFf_...", "guid_sig":"PT9-TApz...", "url":"http:\/\/z.podunk.edu", "url_sig":"T8Bp7j5D..." }, "callback":"\/post", "version":1, "secret":"1eaa661..." }, "message":{ "type":"activity", "message_id":"10b049ce384cbb2da9467319bc98169ab36290b8bbb403aa0c0accd9cb072e76@podunk.edu", "message_top":"10b049ce384cbb2da9467319bc98169ab36290b8bbb403aa0c0accd9cb072e76@podunk.edu", "message_parent":"10b049ce384cbb2da9467319bc98169ab36290b8bbb403aa0c0accd9cb072e76@podunk.edu", "created":"2012-11-20 04:04:16", "edited":"2012-11-20 04:04:16", "title":"", "body":"Hi Nickordo", "app":"", "verb":"post", "object_type":"", "target_type":"", "permalink":"", "location":"", "longlat":"", "owner":{ "name":"Indigo", "address":"indigo@podunk.edu", "url":"http:\/\/podunk.edu", "photo":{ "mimetype":"image\/jpeg", "src":"http:\/\/podunk.edu\/photo\/profile\/m\/5" }, "guid":"kgVFf_...", "guid_sig":"PT9-TAp...", }, "author":{ "name":"Indigo", "address":"indigo@podunk.edu", "url":"http:\/\/podunk.edu", "photo":{ "mimetype":"image\/jpeg", "src":"http:\/\/podunk.edu\/photo\/profile\/m\/5" }, "guid":"kgVFf_...", "guid_sig":"PT9-TAp..." } } } }</p>
+<p>Currently defined message types are 'activity', 'mail', 'profile' and 'channel_sync', which each have different content schemas.</p>
+<p>Ping packet: A ping packet does not require any parameters except the type. It may or may not be encrypted.</p>
+<p>{ "type": "ping" }</p>
+<p>On receipt of a ping packet a ping response will be returned:</p>
+<p>{ "success" : 1, "site" { "url":"http:\/\/podunk.edu", "url_sig":"T8Bp7j5...", "sitekey": "&amp;ndash;&amp;mdash;BEGIN PUBLIC KEY&amp;ndash;&amp;mdash;
+ MIICIjANBgkqhkiG9w0BAQE..." } }</p>
+<p>The ping packet can be used to verify that a site has not been re-installed, and to initiate corrective action if it has. The url_sig is signed with the site private key and base64url encoded - and this should verify with the enclosed sitekey. Failure to verify indicates the site is corrupt or otherwise unable to communicate using zot. This return packet is not otherwise verified, so should be compared with other results obtained from this site which were verified prior to taking action. For instance if you have one verified result with this signature and key, and other records for this url which have different signatures and keys, it indicates that the site was re-installed and corrective action may commence (remove or mark invalid any entries with different signatures). If you have no records which match this url_sig and key - no corrective action should be taken as this packet may have been returned by an imposter. </p>
+<p>Many message packets will arrive encrypted. The existence of an 'iv' element tells us we need to unencapsulate the AES-256-CBC content using the site private key</p>
+<p>The 'pickup' message arrives with a tracking ID which is associated with a particular outq_hash First verify that that the returned signatures verify, then check that we have an outbound queue item with the correct hash. If everything verifies, find any/all outbound messages in the queue for this hubloc and send them back</p>
+<p>If we made it to here, the signatures verify, but we still don't know if the tracking ID is valid. It wouldn't be an error if the tracking ID isn't found, because we may have sent this particular queue item with another pickup (after the tracking ID for the other pickup was verified).</p>
+<p>Everything is good if we made it here, so find all messages that are going to this location and send them all.</p>
+<p>pickup: end</p>
+<p>All other message types require us to verify the sender. This is a generic check, so we will do it once here and bail if anything goes wrong.</p>
+<p>Check if the sender is already verified here</p>
+<p>Have never seen this guid or this guid coming from this location. Check it and register it.</p>
+<p>This hub has now been proven to be valid. Any hub with the same URL and a different sitekey cannot be valid. Get rid of them (mark them deleted). There's a good chance they were re-installs.</p>
+<p>Requestor visits /magic/?dest=somewhere on their own site with a browser magic redirects them to $destsite/post [with auth args....] $destsite sends an auth_check packet to originator site The auth_check packet is handled here by the originator's site</p>
+<ul>
+<li>the browser session is still waiting inside $destsite/post for everything to verify If everything checks out we'll return a token to $destsite and then $destsite will verify the token, authenticate the browser session and then redirect to the original destination. If authentication fails, the redirection to the original destination will still take place but without authentication.</li>
+</ul>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/post_8php.js b/doc/html/post_8php.js
new file mode 100644
index 000000000..9a5f6bcdb
--- /dev/null
+++ b/doc/html/post_8php.js
@@ -0,0 +1,5 @@
+var post_8php =
+[
+ [ "post_init", "post_8php.html#af4b48181ce773ef0cdfc972441445c34", null ],
+ [ "post_post", "post_8php.html#af59e6a1dc22d19d9257b01cd7ccedb75", null ]
+]; \ No newline at end of file
diff --git a/doc/html/post__to__red_8php.html b/doc/html/post__to__red_8php.html
new file mode 100644
index 000000000..0bec890ac
--- /dev/null
+++ b/doc/html/post__to__red_8php.html
@@ -0,0 +1,569 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: util/wp/post_to_red/post_to_red.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('post__to__red_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> &#124;
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle">
+<div class="title">post_to_red.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a49fd35f7b1cdddfe6e26ddfcf8d3c4ec"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="post__to__red_8php.html#a49fd35f7b1cdddfe6e26ddfcf8d3c4ec">post_to_red_deactivate</a> ()</td></tr>
+<tr class="separator:a49fd35f7b1cdddfe6e26ddfcf8d3c4ec"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a96d0ccecb96600ef1bfd50ab3f77315f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="post__to__red_8php.html#a96d0ccecb96600ef1bfd50ab3f77315f">post_to_red_get_seed_location</a> ()</td></tr>
+<tr class="separator:a96d0ccecb96600ef1bfd50ab3f77315f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae6f3a2c0561cbeacda5be565b06de8a7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="post__to__red_8php.html#ae6f3a2c0561cbeacda5be565b06de8a7">post_to_red_get_acct_name</a> ()</td></tr>
+<tr class="separator:ae6f3a2c0561cbeacda5be565b06de8a7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aacba7a0646fc00ae6ac4f5dc383fccab"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="post__to__red_8php.html#aacba7a0646fc00ae6ac4f5dc383fccab">post_to_red_get_channel_name</a> ()</td></tr>
+<tr class="separator:aacba7a0646fc00ae6ac4f5dc383fccab"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4d90ac085c14f53ff4d8ab4c23477ea6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="post__to__red_8php.html#a4d90ac085c14f53ff4d8ab4c23477ea6">post_to_red_get_password</a> ()</td></tr>
+<tr class="separator:a4d90ac085c14f53ff4d8ab4c23477ea6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af5fd50e2c42ede85f8a9e8d9ee3cf540"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="post__to__red_8php.html#af5fd50e2c42ede85f8a9e8d9ee3cf540">post_to_red_post</a> ($post_id)</td></tr>
+<tr class="separator:af5fd50e2c42ede85f8a9e8d9ee3cf540"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4674bb5ce2baa32c559607460c39a2c5"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="post__to__red_8php.html#a4674bb5ce2baa32c559607460c39a2c5">post_to_red_delete_post</a> ($post_id)</td></tr>
+<tr class="separator:a4674bb5ce2baa32c559607460c39a2c5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5cc2a89a6d33cdb8e2ca557a69bef42d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="post__to__red_8php.html#a5cc2a89a6d33cdb8e2ca557a69bef42d">post_to_red_delete_comment</a> ($post_id)</td></tr>
+<tr class="separator:a5cc2a89a6d33cdb8e2ca557a69bef42d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a75db5d87226a0287a0ac0fa315f2bcfd"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="post__to__red_8php.html#a75db5d87226a0287a0ac0fa315f2bcfd">post_to_red_displayAdminContent</a> ()</td></tr>
+<tr class="separator:a75db5d87226a0287a0ac0fa315f2bcfd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0f139dea77a94c98f26007963eea639c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="post__to__red_8php.html#a0f139dea77a94c98f26007963eea639c">post_to_red_post_checkbox</a> ()</td></tr>
+<tr class="separator:a0f139dea77a94c98f26007963eea639c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa97aeda12ef080665f16311a4e1eb901"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="post__to__red_8php.html#aa97aeda12ef080665f16311a4e1eb901">post_to_red_post_meta_content</a> ($post_id)</td></tr>
+<tr class="separator:aa97aeda12ef080665f16311a4e1eb901"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7e68a8d9c83cb28d032aad3ea85ce0a6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="post__to__red_8php.html#a7e68a8d9c83cb28d032aad3ea85ce0a6">post_to_red_post_field_data</a> ($post_id)</td></tr>
+<tr class="separator:a7e68a8d9c83cb28d032aad3ea85ce0a6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8ec8f8809e3c5d1b2c9598c8185d63aa"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="post__to__red_8php.html#a8ec8f8809e3c5d1b2c9598c8185d63aa">post_to_red_display_admin_page</a> ()</td></tr>
+<tr class="separator:a8ec8f8809e3c5d1b2c9598c8185d63aa"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a906be8f72cf1aa2e199c0683ea6a4017"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="post__to__red_8php.html#a906be8f72cf1aa2e199c0683ea6a4017">post_to_red_settings_link</a> ($links)</td></tr>
+<tr class="separator:a906be8f72cf1aa2e199c0683ea6a4017"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aeec4125719184e7b097b3b9fba3101b5"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="post__to__red_8php.html#aeec4125719184e7b097b3b9fba3101b5">post_to_red_admin</a> ()</td></tr>
+<tr class="separator:aeec4125719184e7b097b3b9fba3101b5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3a2af6ad845239f26e86fccabf8639e1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="post__to__red_8php.html#a3a2af6ad845239f26e86fccabf8639e1">red_xmlrpc_methods</a> ($methods)</td></tr>
+<tr class="separator:a3a2af6ad845239f26e86fccabf8639e1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a085c250d4ceff5e4f10052f3d2039823"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="post__to__red_8php.html#a085c250d4ceff5e4f10052f3d2039823">red_comment</a> ($args)</td></tr>
+<tr class="separator:a085c250d4ceff5e4f10052f3d2039823"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae0b881461afbdba93d9329068ea52136"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="post__to__red_8php.html#ae0b881461afbdba93d9329068ea52136">post_to_red_get_avatar</a> ($avatar, $id_or_email, $size, $default, $alt)</td></tr>
+<tr class="separator:ae0b881461afbdba93d9329068ea52136"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af2713018a2dc97e88f121fc6215beb66"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="post__to__red_8php.html#af2713018a2dc97e88f121fc6215beb66">xpost_to_html2bbcode</a> ($text)</td></tr>
+<tr class="separator:af2713018a2dc97e88f121fc6215beb66"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:a6210f39392a5f0fa0255cc7d3760493a"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="post__to__red_8php.html#a6210f39392a5f0fa0255cc7d3760493a">post_to_red_path</a> WP_PLUGIN_URL . &quot;/&quot; . str_replace(basename( __FILE__), &quot;&quot;, plugin_basename(__FILE__))</td></tr>
+<tr class="separator:a6210f39392a5f0fa0255cc7d3760493a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af3e7ebd361d4ed7cb6d43209970cd94a"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="post__to__red_8php.html#af3e7ebd361d4ed7cb6d43209970cd94a">post_to_red_version</a> &quot;1.2&quot;</td></tr>
+<tr class="separator:af3e7ebd361d4ed7cb6d43209970cd94a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a99811555b30bde504a863e44015f2f19"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="post__to__red_8php.html#a99811555b30bde504a863e44015f2f19">$plugin_dir</a> = basename(dirname(__FILE__))</td></tr>
+<tr class="separator:a99811555b30bde504a863e44015f2f19"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ada8a7130088351710bb02ed622d6bf65"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="post__to__red_8php.html#ada8a7130088351710bb02ed622d6bf65">$plugin</a> = plugin_basename(__FILE__)</td></tr>
+<tr class="separator:ada8a7130088351710bb02ed622d6bf65"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a588cea66afe0b32f27f2713d44940119"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="post__to__red_8php.html#a588cea66afe0b32f27f2713d44940119">post_to_red_acct_name</a> &quot;post_to_red_admin_options&quot;</td></tr>
+<tr class="separator:a588cea66afe0b32f27f2713d44940119"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="aeec4125719184e7b097b3b9fba3101b5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">post_to_red_admin </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a49fd35f7b1cdddfe6e26ddfcf8d3c4ec"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">post_to_red_deactivate </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a5cc2a89a6d33cdb8e2ca557a69bef42d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">post_to_red_delete_comment </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$post_id</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a4674bb5ce2baa32c559607460c39a2c5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">post_to_red_delete_post </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$post_id</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a8ec8f8809e3c5d1b2c9598c8185d63aa"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">post_to_red_display_admin_page </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a75db5d87226a0287a0ac0fa315f2bcfd"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">post_to_red_displayAdminContent </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="post__to__red_8php.html#a8ec8f8809e3c5d1b2c9598c8185d63aa">post_to_red_display_admin_page()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ae6f3a2c0561cbeacda5be565b06de8a7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">post_to_red_get_acct_name </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="post__to__red_8php.html#a5cc2a89a6d33cdb8e2ca557a69bef42d">post_to_red_delete_comment()</a>, <a class="el" href="post__to__red_8php.html#a4674bb5ce2baa32c559607460c39a2c5">post_to_red_delete_post()</a>, <a class="el" href="post__to__red_8php.html#a75db5d87226a0287a0ac0fa315f2bcfd">post_to_red_displayAdminContent()</a>, and <a class="el" href="post__to__red_8php.html#af5fd50e2c42ede85f8a9e8d9ee3cf540">post_to_red_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ae0b881461afbdba93d9329068ea52136"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">post_to_red_get_avatar </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$avatar</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$id_or_email</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$size</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$default</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$alt</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aacba7a0646fc00ae6ac4f5dc383fccab"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">post_to_red_get_channel_name </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="post__to__red_8php.html#a5cc2a89a6d33cdb8e2ca557a69bef42d">post_to_red_delete_comment()</a>, <a class="el" href="post__to__red_8php.html#a4674bb5ce2baa32c559607460c39a2c5">post_to_red_delete_post()</a>, <a class="el" href="post__to__red_8php.html#a75db5d87226a0287a0ac0fa315f2bcfd">post_to_red_displayAdminContent()</a>, and <a class="el" href="post__to__red_8php.html#af5fd50e2c42ede85f8a9e8d9ee3cf540">post_to_red_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a4d90ac085c14f53ff4d8ab4c23477ea6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">post_to_red_get_password </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="post__to__red_8php.html#a5cc2a89a6d33cdb8e2ca557a69bef42d">post_to_red_delete_comment()</a>, <a class="el" href="post__to__red_8php.html#a4674bb5ce2baa32c559607460c39a2c5">post_to_red_delete_post()</a>, <a class="el" href="post__to__red_8php.html#a75db5d87226a0287a0ac0fa315f2bcfd">post_to_red_displayAdminContent()</a>, and <a class="el" href="post__to__red_8php.html#af5fd50e2c42ede85f8a9e8d9ee3cf540">post_to_red_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a96d0ccecb96600ef1bfd50ab3f77315f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">post_to_red_get_seed_location </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="post__to__red_8php.html#a5cc2a89a6d33cdb8e2ca557a69bef42d">post_to_red_delete_comment()</a>, <a class="el" href="post__to__red_8php.html#a4674bb5ce2baa32c559607460c39a2c5">post_to_red_delete_post()</a>, <a class="el" href="post__to__red_8php.html#a75db5d87226a0287a0ac0fa315f2bcfd">post_to_red_displayAdminContent()</a>, and <a class="el" href="post__to__red_8php.html#af5fd50e2c42ede85f8a9e8d9ee3cf540">post_to_red_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="af5fd50e2c42ede85f8a9e8d9ee3cf540"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">post_to_red_post </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$post_id</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a0f139dea77a94c98f26007963eea639c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">post_to_red_post_checkbox </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a7e68a8d9c83cb28d032aad3ea85ce0a6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">post_to_red_post_field_data </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$post_id</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aa97aeda12ef080665f16311a4e1eb901"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">post_to_red_post_meta_content </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$post_id</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a906be8f72cf1aa2e199c0683ea6a4017"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">post_to_red_settings_link </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$links</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a085c250d4ceff5e4f10052f3d2039823"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">red_comment </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$args</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a3a2af6ad845239f26e86fccabf8639e1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">red_xmlrpc_methods </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$methods</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="af2713018a2dc97e88f121fc6215beb66"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xpost_to_html2bbcode </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$text</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="post__to__red_8php.html#af5fd50e2c42ede85f8a9e8d9ee3cf540">post_to_red_post()</a>.</p>
+
+</div>
+</div>
+<h2 class="groupheader">Variable Documentation</h2>
+<a class="anchor" id="ada8a7130088351710bb02ed622d6bf65"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$plugin = plugin_basename(__FILE__)</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="admin_8php.html#afef415e4011607fbb665610441595015">admin_content()</a>, <a class="el" href="admin_8php.html#a54128076986ba80c4a103de3fc3e19a8">admin_page_plugins()</a>, <a class="el" href="plugin_8php.html#aff0178bd8d0b34a94d5efddc883edd35">get_plugin_info()</a>, <a class="el" href="plugin_8php.html#a482131013272a1d5d5c1b1469c6c55d5">install_plugin()</a>, <a class="el" href="plugin_8php.html#a9ca9632b7309a65b05c03a3e2f473a3d">load_plugin()</a>, <a class="el" href="plugin_8php.html#a093a9cb98f51e3643634bd8bc6ed6e76">uninstall_plugin()</a>, and <a class="el" href="plugin_8php.html#a90538627db68605aeb6db17a8ead6523">unload_plugin()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a99811555b30bde504a863e44015f2f19"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$plugin_dir = basename(dirname(__FILE__))</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a588cea66afe0b32f27f2713d44940119"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const post_to_red_acct_name &quot;post_to_red_admin_options&quot;</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a6210f39392a5f0fa0255cc7d3760493a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const post_to_red_path WP_PLUGIN_URL . &quot;/&quot; . str_replace(basename( __FILE__), &quot;&quot;, plugin_basename(__FILE__))</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="af3e7ebd361d4ed7cb6d43209970cd94a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const post_to_red_version &quot;1.2&quot;</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/post__to__red_8php.js b/doc/html/post__to__red_8php.js
new file mode 100644
index 000000000..b2a2c31f5
--- /dev/null
+++ b/doc/html/post__to__red_8php.js
@@ -0,0 +1,27 @@
+var post__to__red_8php =
+[
+ [ "post_to_red_admin", "post__to__red_8php.html#aeec4125719184e7b097b3b9fba3101b5", null ],
+ [ "post_to_red_deactivate", "post__to__red_8php.html#a49fd35f7b1cdddfe6e26ddfcf8d3c4ec", null ],
+ [ "post_to_red_delete_comment", "post__to__red_8php.html#a5cc2a89a6d33cdb8e2ca557a69bef42d", null ],
+ [ "post_to_red_delete_post", "post__to__red_8php.html#a4674bb5ce2baa32c559607460c39a2c5", null ],
+ [ "post_to_red_display_admin_page", "post__to__red_8php.html#a8ec8f8809e3c5d1b2c9598c8185d63aa", null ],
+ [ "post_to_red_displayAdminContent", "post__to__red_8php.html#a75db5d87226a0287a0ac0fa315f2bcfd", null ],
+ [ "post_to_red_get_acct_name", "post__to__red_8php.html#ae6f3a2c0561cbeacda5be565b06de8a7", null ],
+ [ "post_to_red_get_avatar", "post__to__red_8php.html#ae0b881461afbdba93d9329068ea52136", null ],
+ [ "post_to_red_get_channel_name", "post__to__red_8php.html#aacba7a0646fc00ae6ac4f5dc383fccab", null ],
+ [ "post_to_red_get_password", "post__to__red_8php.html#a4d90ac085c14f53ff4d8ab4c23477ea6", null ],
+ [ "post_to_red_get_seed_location", "post__to__red_8php.html#a96d0ccecb96600ef1bfd50ab3f77315f", null ],
+ [ "post_to_red_post", "post__to__red_8php.html#af5fd50e2c42ede85f8a9e8d9ee3cf540", null ],
+ [ "post_to_red_post_checkbox", "post__to__red_8php.html#a0f139dea77a94c98f26007963eea639c", null ],
+ [ "post_to_red_post_field_data", "post__to__red_8php.html#a7e68a8d9c83cb28d032aad3ea85ce0a6", null ],
+ [ "post_to_red_post_meta_content", "post__to__red_8php.html#aa97aeda12ef080665f16311a4e1eb901", null ],
+ [ "post_to_red_settings_link", "post__to__red_8php.html#a906be8f72cf1aa2e199c0683ea6a4017", null ],
+ [ "red_comment", "post__to__red_8php.html#a085c250d4ceff5e4f10052f3d2039823", null ],
+ [ "red_xmlrpc_methods", "post__to__red_8php.html#a3a2af6ad845239f26e86fccabf8639e1", null ],
+ [ "xpost_to_html2bbcode", "post__to__red_8php.html#af2713018a2dc97e88f121fc6215beb66", null ],
+ [ "$plugin", "post__to__red_8php.html#ada8a7130088351710bb02ed622d6bf65", null ],
+ [ "$plugin_dir", "post__to__red_8php.html#a99811555b30bde504a863e44015f2f19", null ],
+ [ "post_to_red_acct_name", "post__to__red_8php.html#a588cea66afe0b32f27f2713d44940119", null ],
+ [ "post_to_red_path", "post__to__red_8php.html#a6210f39392a5f0fa0255cc7d3760493a", null ],
+ [ "post_to_red_version", "post__to__red_8php.html#af3e7ebd361d4ed7cb6d43209970cd94a", null ]
+]; \ No newline at end of file
diff --git a/doc/html/pretheme_8php.html b/doc/html/pretheme_8php.html
new file mode 100644
index 000000000..e05e6a253
--- /dev/null
+++ b/doc/html/pretheme_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/pretheme.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('pretheme_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">pretheme.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:af5660943ee99db5fd75182316522eafe"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="pretheme_8php.html#af5660943ee99db5fd75182316522eafe">pretheme_init</a> (&amp;$a)</td></tr>
+<tr class="separator:af5660943ee99db5fd75182316522eafe"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="af5660943ee99db5fd75182316522eafe"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">pretheme_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/pretheme_8php.js b/doc/html/pretheme_8php.js
new file mode 100644
index 000000000..850e68070
--- /dev/null
+++ b/doc/html/pretheme_8php.js
@@ -0,0 +1,4 @@
+var pretheme_8php =
+[
+ [ "pretheme_init", "pretheme_8php.html#af5660943ee99db5fd75182316522eafe", null ]
+]; \ No newline at end of file
diff --git a/doc/html/probe_8php.html b/doc/html/probe_8php.html
new file mode 100644
index 000000000..f0aa7e854
--- /dev/null
+++ b/doc/html/probe_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/probe.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('probe_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">probe.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a1f1db3fa6038e451e737964c94bf5e99"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="probe_8php.html#a1f1db3fa6038e451e737964c94bf5e99">probe_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a1f1db3fa6038e451e737964c94bf5e99"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a1f1db3fa6038e451e737964c94bf5e99"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">probe_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/probe_8php.js b/doc/html/probe_8php.js
new file mode 100644
index 000000000..5c5c60b45
--- /dev/null
+++ b/doc/html/probe_8php.js
@@ -0,0 +1,4 @@
+var probe_8php =
+[
+ [ "probe_content", "probe_8php.html#a1f1db3fa6038e451e737964c94bf5e99", null ]
+]; \ No newline at end of file
diff --git a/doc/html/profile_8php.html b/doc/html/profile_8php.html
new file mode 100644
index 000000000..4e95ad2b8
--- /dev/null
+++ b/doc/html/profile_8php.html
@@ -0,0 +1,165 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/profile.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('profile_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">profile.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ab5d0246be0552e2182a585c1206d22a5"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="profile_8php.html#ab5d0246be0552e2182a585c1206d22a5">profile_init</a> (&amp;$a)</td></tr>
+<tr class="separator:ab5d0246be0552e2182a585c1206d22a5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3775cf6eef6587e5143133356a7b76c0"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="profile_8php.html#a3775cf6eef6587e5143133356a7b76c0">profile_content</a> (&amp;$a, $update=0)</td></tr>
+<tr class="separator:a3775cf6eef6587e5143133356a7b76c0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a3775cf6eef6587e5143133356a7b76c0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">profile_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$update</em> = <code>0</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ab5d0246be0552e2182a585c1206d22a5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">profile_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/profile_8php.js b/doc/html/profile_8php.js
new file mode 100644
index 000000000..249035945
--- /dev/null
+++ b/doc/html/profile_8php.js
@@ -0,0 +1,5 @@
+var profile_8php =
+[
+ [ "profile_content", "profile_8php.html#a3775cf6eef6587e5143133356a7b76c0", null ],
+ [ "profile_init", "profile_8php.html#ab5d0246be0552e2182a585c1206d22a5", null ]
+]; \ No newline at end of file
diff --git a/doc/html/profile__advanced_8php.html b/doc/html/profile__advanced_8php.html
new file mode 100644
index 000000000..d94f42c1b
--- /dev/null
+++ b/doc/html/profile__advanced_8php.html
@@ -0,0 +1,139 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/profile_advanced.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('profile__advanced_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">profile_advanced.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:aa870d2c1f558cfd52bef05bc124e8fa4"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="profile__advanced_8php.html#aa870d2c1f558cfd52bef05bc124e8fa4">advanced_profile</a> (&amp;$a)</td></tr>
+<tr class="separator:aa870d2c1f558cfd52bef05bc124e8fa4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="aa870d2c1f558cfd52bef05bc124e8fa4"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">advanced_profile </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="profile_8php.html#a3775cf6eef6587e5143133356a7b76c0">profile_content()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/profile__advanced_8php.js b/doc/html/profile__advanced_8php.js
new file mode 100644
index 000000000..505cbe36f
--- /dev/null
+++ b/doc/html/profile__advanced_8php.js
@@ -0,0 +1,4 @@
+var profile__advanced_8php =
+[
+ [ "advanced_profile", "profile__advanced_8php.html#aa870d2c1f558cfd52bef05bc124e8fa4", null ]
+]; \ No newline at end of file
diff --git a/doc/html/profile__photo_8php.html b/doc/html/profile__photo_8php.html
new file mode 100644
index 000000000..5d775fc65
--- /dev/null
+++ b/doc/html/profile__photo_8php.html
@@ -0,0 +1,155 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/profile_photo.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('profile__photo_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">profile_photo.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a140631c56438fbfacb61a1eb43067d02"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="profile__photo_8php.html#a140631c56438fbfacb61a1eb43067d02">profile_photo_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a140631c56438fbfacb61a1eb43067d02"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4b80234074bd603221aa5364f330e479"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="profile__photo_8php.html#a4b80234074bd603221aa5364f330e479">profile_photo_post</a> (&amp;$a)</td></tr>
+<tr class="separator:a4b80234074bd603221aa5364f330e479"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a140631c56438fbfacb61a1eb43067d02"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">profile_photo_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a4b80234074bd603221aa5364f330e479"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">profile_photo_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/profile__photo_8php.js b/doc/html/profile__photo_8php.js
new file mode 100644
index 000000000..db2f4e25e
--- /dev/null
+++ b/doc/html/profile__photo_8php.js
@@ -0,0 +1,5 @@
+var profile__photo_8php =
+[
+ [ "profile_photo_init", "profile__photo_8php.html#a140631c56438fbfacb61a1eb43067d02", null ],
+ [ "profile_photo_post", "profile__photo_8php.html#a4b80234074bd603221aa5364f330e479", null ]
+]; \ No newline at end of file
diff --git a/doc/html/profile__selectors_8php.html b/doc/html/profile__selectors_8php.html
new file mode 100644
index 000000000..b118aba11
--- /dev/null
+++ b/doc/html/profile__selectors_8php.html
@@ -0,0 +1,209 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/profile_selectors.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('profile__selectors_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">profile_selectors.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ae2b2c087e6530c61c0b256fd26d52355"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="profile__selectors_8php.html#ae2b2c087e6530c61c0b256fd26d52355">gender_selector</a> ($current=&quot;&quot;, $suffix=&quot;&quot;)</td></tr>
+<tr class="separator:ae2b2c087e6530c61c0b256fd26d52355"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3b50b3ea4ea4bdbebebfffc5d1b157c7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="profile__selectors_8php.html#a3b50b3ea4ea4bdbebebfffc5d1b157c7">sexpref_selector</a> ($current=&quot;&quot;, $suffix=&quot;&quot;)</td></tr>
+<tr class="separator:a3b50b3ea4ea4bdbebebfffc5d1b157c7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7473dd095987e1cdcc79d4f0bb5e6798"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="profile__selectors_8php.html#a7473dd095987e1cdcc79d4f0bb5e6798">marital_selector</a> ($current=&quot;&quot;, $suffix=&quot;&quot;)</td></tr>
+<tr class="separator:a7473dd095987e1cdcc79d4f0bb5e6798"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="ae2b2c087e6530c61c0b256fd26d52355"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">gender_selector </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$current</em> = <code>&quot;&quot;</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$suffix</em> = <code>&quot;&quot;</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="profiles_8php.html#a46975783b8b8d70402d51487eb1f0b00">profiles_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a7473dd095987e1cdcc79d4f0bb5e6798"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">marital_selector </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$current</em> = <code>&quot;&quot;</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$suffix</em> = <code>&quot;&quot;</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="profiles_8php.html#a46975783b8b8d70402d51487eb1f0b00">profiles_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a3b50b3ea4ea4bdbebebfffc5d1b157c7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">sexpref_selector </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$current</em> = <code>&quot;&quot;</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$suffix</em> = <code>&quot;&quot;</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="profiles_8php.html#a46975783b8b8d70402d51487eb1f0b00">profiles_content()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/profile__selectors_8php.js b/doc/html/profile__selectors_8php.js
new file mode 100644
index 000000000..608e0e77e
--- /dev/null
+++ b/doc/html/profile__selectors_8php.js
@@ -0,0 +1,6 @@
+var profile__selectors_8php =
+[
+ [ "gender_selector", "profile__selectors_8php.html#ae2b2c087e6530c61c0b256fd26d52355", null ],
+ [ "marital_selector", "profile__selectors_8php.html#a7473dd095987e1cdcc79d4f0bb5e6798", null ],
+ [ "sexpref_selector", "profile__selectors_8php.html#a3b50b3ea4ea4bdbebebfffc5d1b157c7", null ]
+]; \ No newline at end of file
diff --git a/doc/html/profiles_8php.html b/doc/html/profiles_8php.html
new file mode 100644
index 000000000..1b947e0ed
--- /dev/null
+++ b/doc/html/profiles_8php.html
@@ -0,0 +1,173 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/profiles.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('profiles_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">profiles.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a36f71405ad536228f8bb84a551b23f7e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="profiles_8php.html#a36f71405ad536228f8bb84a551b23f7e">profiles_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a36f71405ad536228f8bb84a551b23f7e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab0362c81b1d3b0b12a772b9fac446e04"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="profiles_8php.html#ab0362c81b1d3b0b12a772b9fac446e04">profiles_post</a> (&amp;$a)</td></tr>
+<tr class="separator:ab0362c81b1d3b0b12a772b9fac446e04"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a46975783b8b8d70402d51487eb1f0b00"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="profiles_8php.html#a46975783b8b8d70402d51487eb1f0b00">profiles_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a46975783b8b8d70402d51487eb1f0b00"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a46975783b8b8d70402d51487eb1f0b00"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">profiles_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a36f71405ad536228f8bb84a551b23f7e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">profiles_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ab0362c81b1d3b0b12a772b9fac446e04"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">profiles_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/profiles_8php.js b/doc/html/profiles_8php.js
new file mode 100644
index 000000000..256ba1080
--- /dev/null
+++ b/doc/html/profiles_8php.js
@@ -0,0 +1,6 @@
+var profiles_8php =
+[
+ [ "profiles_content", "profiles_8php.html#a46975783b8b8d70402d51487eb1f0b00", null ],
+ [ "profiles_init", "profiles_8php.html#a36f71405ad536228f8bb84a551b23f7e", null ],
+ [ "profiles_post", "profiles_8php.html#ab0362c81b1d3b0b12a772b9fac446e04", null ]
+]; \ No newline at end of file
diff --git a/doc/html/profperm_8php.html b/doc/html/profperm_8php.html
new file mode 100644
index 000000000..a99c661fb
--- /dev/null
+++ b/doc/html/profperm_8php.html
@@ -0,0 +1,155 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/profperm.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('profperm_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">profperm.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a17fb64ec05edee1dc94d95438807d6c6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="profperm_8php.html#a17fb64ec05edee1dc94d95438807d6c6">profperm_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a17fb64ec05edee1dc94d95438807d6c6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aef015787de2373d9fb3fe3f814fb5023"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="profperm_8php.html#aef015787de2373d9fb3fe3f814fb5023">profperm_content</a> (&amp;$a)</td></tr>
+<tr class="separator:aef015787de2373d9fb3fe3f814fb5023"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="aef015787de2373d9fb3fe3f814fb5023"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">profperm_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a17fb64ec05edee1dc94d95438807d6c6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">profperm_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/profperm_8php.js b/doc/html/profperm_8php.js
new file mode 100644
index 000000000..95b68003d
--- /dev/null
+++ b/doc/html/profperm_8php.js
@@ -0,0 +1,5 @@
+var profperm_8php =
+[
+ [ "profperm_content", "profperm_8php.html#aef015787de2373d9fb3fe3f814fb5023", null ],
+ [ "profperm_init", "profperm_8php.html#a17fb64ec05edee1dc94d95438807d6c6", null ]
+]; \ No newline at end of file
diff --git a/doc/html/pubsites_8php.html b/doc/html/pubsites_8php.html
new file mode 100644
index 000000000..0972e9cd4
--- /dev/null
+++ b/doc/html/pubsites_8php.html
@@ -0,0 +1,139 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/pubsites.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('pubsites_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">pubsites.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:af614e279aab54065345bda6b03eafdf0"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="pubsites_8php.html#af614e279aab54065345bda6b03eafdf0">pubsites_content</a> (&amp;$a)</td></tr>
+<tr class="separator:af614e279aab54065345bda6b03eafdf0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="af614e279aab54065345bda6b03eafdf0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">pubsites_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="register_8php.html#a0e91f57f111407ea8d3223a05022bb2a">register_content()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/pubsites_8php.js b/doc/html/pubsites_8php.js
new file mode 100644
index 000000000..fe78b19d4
--- /dev/null
+++ b/doc/html/pubsites_8php.js
@@ -0,0 +1,4 @@
+var pubsites_8php =
+[
+ [ "pubsites_content", "pubsites_8php.html#af614e279aab54065345bda6b03eafdf0", null ]
+]; \ No newline at end of file
diff --git a/doc/html/qsearch_8php.html b/doc/html/qsearch_8php.html
new file mode 100644
index 000000000..b8b166904
--- /dev/null
+++ b/doc/html/qsearch_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/qsearch.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('qsearch_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">qsearch.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a0501887b95bd8fa21018b2936a668894"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="qsearch_8php.html#a0501887b95bd8fa21018b2936a668894">qsearch_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a0501887b95bd8fa21018b2936a668894"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a0501887b95bd8fa21018b2936a668894"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">qsearch_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/qsearch_8php.js b/doc/html/qsearch_8php.js
new file mode 100644
index 000000000..a21b280be
--- /dev/null
+++ b/doc/html/qsearch_8php.js
@@ -0,0 +1,4 @@
+var qsearch_8php =
+[
+ [ "qsearch_init", "qsearch_8php.html#a0501887b95bd8fa21018b2936a668894", null ]
+]; \ No newline at end of file
diff --git a/doc/html/queue_8php.html b/doc/html/queue_8php.html
new file mode 100644
index 000000000..86cae6f6c
--- /dev/null
+++ b/doc/html/queue_8php.html
@@ -0,0 +1,147 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/queue.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('queue_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">queue.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:af8c93de86d866c3200174c8450a0f341"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="queue_8php.html#af8c93de86d866c3200174c8450a0f341">queue_run</a> ($<a class="el" href="boot_8php.html#a768f00b7d66be0daf7ef4eea2e862006">argv</a>, $<a class="el" href="boot_8php.html#abc0a90a1a77f5b668aa7e4b57d1776a7">argc</a>)</td></tr>
+<tr class="separator:af8c93de86d866c3200174c8450a0f341"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="af8c93de86d866c3200174c8450a0f341"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">queue_run </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$argv</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$argc</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/queue_8php.js b/doc/html/queue_8php.js
new file mode 100644
index 000000000..e5a7830db
--- /dev/null
+++ b/doc/html/queue_8php.js
@@ -0,0 +1,4 @@
+var queue_8php =
+[
+ [ "queue_run", "queue_8php.html#af8c93de86d866c3200174c8450a0f341", null ]
+]; \ No newline at end of file
diff --git a/doc/html/queue__fn_8php.html b/doc/html/queue__fn_8php.html
new file mode 100644
index 000000000..9bb6a3995
--- /dev/null
+++ b/doc/html/queue__fn_8php.html
@@ -0,0 +1,155 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/queue_fn.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('queue__fn_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">queue_fn.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a4c2876181f75a4a61e85b7f00dfdbba1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="queue__fn_8php.html#a4c2876181f75a4a61e85b7f00dfdbba1">update_queue_time</a> ($id)</td></tr>
+<tr class="separator:a4c2876181f75a4a61e85b7f00dfdbba1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8fe71e981399bbf5d000a6ca42f57b24"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="queue__fn_8php.html#a8fe71e981399bbf5d000a6ca42f57b24">remove_queue_item</a> ($id)</td></tr>
+<tr class="separator:a8fe71e981399bbf5d000a6ca42f57b24"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a8fe71e981399bbf5d000a6ca42f57b24"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">remove_queue_item </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$id</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a4c2876181f75a4a61e85b7f00dfdbba1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">update_queue_time </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$id</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/queue__fn_8php.js b/doc/html/queue__fn_8php.js
new file mode 100644
index 000000000..2a3776960
--- /dev/null
+++ b/doc/html/queue__fn_8php.js
@@ -0,0 +1,5 @@
+var queue__fn_8php =
+[
+ [ "remove_queue_item", "queue__fn_8php.html#a8fe71e981399bbf5d000a6ca42f57b24", null ],
+ [ "update_queue_time", "queue__fn_8php.html#a4c2876181f75a4a61e85b7f00dfdbba1", null ]
+]; \ No newline at end of file
diff --git a/doc/html/r!-64.png b/doc/html/r!-64.png
new file mode 100644
index 000000000..1fd1bc80c
--- /dev/null
+++ b/doc/html/r!-64.png
Binary files differ
diff --git a/doc/html/randprof_8php.html b/doc/html/randprof_8php.html
new file mode 100644
index 000000000..c7d7aacfe
--- /dev/null
+++ b/doc/html/randprof_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/randprof.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('randprof_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">randprof.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:abf5dba3c608b9304cbf68327cd31b090"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="randprof_8php.html#abf5dba3c608b9304cbf68327cd31b090">randprof_init</a> (&amp;$a)</td></tr>
+<tr class="separator:abf5dba3c608b9304cbf68327cd31b090"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="abf5dba3c608b9304cbf68327cd31b090"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">randprof_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/randprof_8php.js b/doc/html/randprof_8php.js
new file mode 100644
index 000000000..8cc765498
--- /dev/null
+++ b/doc/html/randprof_8php.js
@@ -0,0 +1,4 @@
+var randprof_8php =
+[
+ [ "randprof_init", "randprof_8php.html#abf5dba3c608b9304cbf68327cd31b090", null ]
+]; \ No newline at end of file
diff --git a/doc/html/redbasic_2php_2style_8php.html b/doc/html/redbasic_2php_2style_8php.html
new file mode 100644
index 000000000..e816fa304
--- /dev/null
+++ b/doc/html/redbasic_2php_2style_8php.html
@@ -0,0 +1,511 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/redbasic/php/style.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('redbasic_2php_2style_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle">
+<div class="title">style.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:a109bbd7f4add27541707b191b73ef84a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="redbasic_2php_2style_8php.html#a109bbd7f4add27541707b191b73ef84a">$uid</a> = <a class="el" href="identity_8php.html#aaeb666872995e3ab8da8f7bc5f3b2bd3">get_theme_uid</a>()</td></tr>
+<tr class="separator:a109bbd7f4add27541707b191b73ef84a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a883f9f14e205f7aa7de02c14df67b40a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="redbasic_2php_2style_8php.html#a883f9f14e205f7aa7de02c14df67b40a">if</a> ($uid) <a class="el" href="include_2config_8php.html#ac543813a980b3841cc5a277fcd4a24a6">load_pconfig</a>($uid</td></tr>
+<tr class="separator:a883f9f14e205f7aa7de02c14df67b40a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8fdd5874587a9ad86fb05ed0be265649"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="redbasic_2php_2style_8php.html#a8fdd5874587a9ad86fb05ed0be265649">$nav_colour</a> = <a class="el" href="include_2config_8php.html#ad58a4913937179adb13201c2ee3261ad">get_pconfig</a>($uid, &quot;redbasic&quot;, &quot;nav_colour&quot;)</td></tr>
+<tr class="separator:a8fdd5874587a9ad86fb05ed0be265649"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae587aa6949ab6e4aa77a591e60f67ee0"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="redbasic_2php_2style_8php.html#ae587aa6949ab6e4aa77a591e60f67ee0">$banner_colour</a> = <a class="el" href="include_2config_8php.html#ad58a4913937179adb13201c2ee3261ad">get_pconfig</a>($uid,'redbasic','banner_colour')</td></tr>
+<tr class="separator:ae587aa6949ab6e4aa77a591e60f67ee0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a83022b1d70799d2bde3d64dca9cb40ee"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="redbasic_2php_2style_8php.html#a83022b1d70799d2bde3d64dca9cb40ee">$schema</a> = <a class="el" href="include_2config_8php.html#ad58a4913937179adb13201c2ee3261ad">get_pconfig</a>($uid,'redbasic','schema')</td></tr>
+<tr class="separator:a83022b1d70799d2bde3d64dca9cb40ee"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0bdce350cf14bac44976e786d1be6574"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="redbasic_2php_2style_8php.html#a0bdce350cf14bac44976e786d1be6574">$bgcolour</a> = <a class="el" href="include_2config_8php.html#ad58a4913937179adb13201c2ee3261ad">get_pconfig</a>($uid, &quot;redbasic&quot;, &quot;background_colour&quot;)</td></tr>
+<tr class="separator:a0bdce350cf14bac44976e786d1be6574"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a339624aeef6604a2f00209a3962c6e1c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="redbasic_2php_2style_8php.html#a339624aeef6604a2f00209a3962c6e1c">$background_image</a> = <a class="el" href="include_2config_8php.html#ad58a4913937179adb13201c2ee3261ad">get_pconfig</a>($uid, &quot;redbasic&quot;, &quot;background_image&quot;)</td></tr>
+<tr class="separator:a339624aeef6604a2f00209a3962c6e1c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4161f6b8aa923f67e53f54dfb6554cdb"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="redbasic_2php_2style_8php.html#a4161f6b8aa923f67e53f54dfb6554cdb">$toolicon_colour</a> = <a class="el" href="include_2config_8php.html#ad58a4913937179adb13201c2ee3261ad">get_pconfig</a>($uid,'redbasic','toolicon_colour')</td></tr>
+<tr class="separator:a4161f6b8aa923f67e53f54dfb6554cdb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acfd00ec469ca3c5e8bfac787573093f3"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="redbasic_2php_2style_8php.html#acfd00ec469ca3c5e8bfac787573093f3">$toolicon_activecolour</a> = <a class="el" href="include_2config_8php.html#ad58a4913937179adb13201c2ee3261ad">get_pconfig</a>($uid,'redbasic','toolicon_activecolour')</td></tr>
+<tr class="separator:acfd00ec469ca3c5e8bfac787573093f3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a27cb59bbc750341f448cd0c298a7ea16"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="redbasic_2php_2style_8php.html#a27cb59bbc750341f448cd0c298a7ea16">$item_colour</a> = <a class="el" href="include_2config_8php.html#ad58a4913937179adb13201c2ee3261ad">get_pconfig</a>($uid, &quot;redbasic&quot;, &quot;item_colour&quot;)</td></tr>
+<tr class="separator:a27cb59bbc750341f448cd0c298a7ea16"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a136b0a2cdeb37f3fa506d28f82dcdbf8"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="redbasic_2php_2style_8php.html#a136b0a2cdeb37f3fa506d28f82dcdbf8">$item_opacity</a> = <a class="el" href="include_2config_8php.html#ad58a4913937179adb13201c2ee3261ad">get_pconfig</a>($uid, &quot;redbasic&quot;, &quot;item_opacity&quot;)</td></tr>
+<tr class="separator:a136b0a2cdeb37f3fa506d28f82dcdbf8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad78cb8a1793834626d73aca22a1501f8"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="redbasic_2php_2style_8php.html#ad78cb8a1793834626d73aca22a1501f8">$body_font_size</a> = <a class="el" href="include_2config_8php.html#ad58a4913937179adb13201c2ee3261ad">get_pconfig</a>($uid, &quot;redbasic&quot;, &quot;body_font_size&quot;)</td></tr>
+<tr class="separator:ad78cb8a1793834626d73aca22a1501f8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afcbcf57d0b90d2e4226c2e8a1171befc"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="redbasic_2php_2style_8php.html#afcbcf57d0b90d2e4226c2e8a1171befc">$font_size</a> = <a class="el" href="include_2config_8php.html#ad58a4913937179adb13201c2ee3261ad">get_pconfig</a>($uid, &quot;redbasic&quot;, &quot;font_size&quot;)</td></tr>
+<tr class="separator:afcbcf57d0b90d2e4226c2e8a1171befc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a68e3ff836ec87ae1370c9f4a12c21c6b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="redbasic_2php_2style_8php.html#a68e3ff836ec87ae1370c9f4a12c21c6b">$font_colour</a> = <a class="el" href="include_2config_8php.html#ad58a4913937179adb13201c2ee3261ad">get_pconfig</a>($uid, &quot;redbasic&quot;, &quot;font_colour&quot;)</td></tr>
+<tr class="separator:a68e3ff836ec87ae1370c9f4a12c21c6b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6502bedd57105ad1fb2dee2be9cf6351"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="redbasic_2php_2style_8php.html#a6502bedd57105ad1fb2dee2be9cf6351">$radius</a> = <a class="el" href="include_2config_8php.html#ad58a4913937179adb13201c2ee3261ad">get_pconfig</a>($uid, &quot;redbasic&quot;, &quot;radius&quot;)</td></tr>
+<tr class="separator:a6502bedd57105ad1fb2dee2be9cf6351"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab00dfc29448b183055d2ae61a0e1874a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="redbasic_2php_2style_8php.html#ab00dfc29448b183055d2ae61a0e1874a">$shadow</a> = <a class="el" href="include_2config_8php.html#ad58a4913937179adb13201c2ee3261ad">get_pconfig</a>($uid,&quot;redbasic&quot;,&quot;photo_shadow&quot;)</td></tr>
+<tr class="separator:ab00dfc29448b183055d2ae61a0e1874a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0cb037986e32302685d4f580dedd6473"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="redbasic_2php_2style_8php.html#a0cb037986e32302685d4f580dedd6473">$converse_width</a> =<a class="el" href="include_2config_8php.html#ad58a4913937179adb13201c2ee3261ad">get_pconfig</a>($uid,&quot;redbasic&quot;,&quot;converse_width&quot;)</td></tr>
+<tr class="separator:a0cb037986e32302685d4f580dedd6473"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab5ec5703848e0132f8a8f3d3a53a58e1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="redbasic_2php_2style_8php.html#ab5ec5703848e0132f8a8f3d3a53a58e1">$nav_min_opacity</a> =<a class="el" href="include_2config_8php.html#ad58a4913937179adb13201c2ee3261ad">get_pconfig</a>($uid,'redbasic','nav_min_opacity')</td></tr>
+<tr class="separator:ab5ec5703848e0132f8a8f3d3a53a58e1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6ffadaf926b41ad84c30da319011e9ad"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="redbasic_2php_2style_8php.html#a6ffadaf926b41ad84c30da319011e9ad">$sloppy_photos</a> =<a class="el" href="include_2config_8php.html#ad58a4913937179adb13201c2ee3261ad">get_pconfig</a>($uid,'redbasic','sloppy_photos')</td></tr>
+<tr class="separator:a6ffadaf926b41ad84c30da319011e9ad"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a810142b4bdd35a1d377ab279b02b47eb"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="redbasic_2php_2style_8php.html#a810142b4bdd35a1d377ab279b02b47eb">$top_photo</a> =<a class="el" href="include_2config_8php.html#ad58a4913937179adb13201c2ee3261ad">get_pconfig</a>($uid,'redbasic','top_photo')</td></tr>
+<tr class="separator:a810142b4bdd35a1d377ab279b02b47eb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0b070f2c9140a7a12a0b1f88601a29e4"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="redbasic_2php_2style_8php.html#a0b070f2c9140a7a12a0b1f88601a29e4">$reply_photo</a> =<a class="el" href="include_2config_8php.html#ad58a4913937179adb13201c2ee3261ad">get_pconfig</a>($uid,'redbasic','reply_photo')</td></tr>
+<tr class="separator:a0b070f2c9140a7a12a0b1f88601a29e4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac98bd8264411bd207a5740d08e81a158"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="redbasic_2php_2style_8php.html#ac98bd8264411bd207a5740d08e81a158">$pmenu_top</a> = intval($top_photo) - 16 . 'px'</td></tr>
+<tr class="separator:ac98bd8264411bd207a5740d08e81a158"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a61891d0d3e6894f52410d507b04e565d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="redbasic_2php_2style_8php.html#a61891d0d3e6894f52410d507b04e565d">$wwtop</a> = intval($top_photo) - 15 . 'px'</td></tr>
+<tr class="separator:a61891d0d3e6894f52410d507b04e565d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5bff5012c56e34da6b3b2ed475726b27"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="redbasic_2php_2style_8php.html#a5bff5012c56e34da6b3b2ed475726b27">$comment_indent</a> = intval($top_photo) + 10 . 'px'</td></tr>
+<tr class="separator:a5bff5012c56e34da6b3b2ed475726b27"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9b489f1c595b867212d30eca0c85b38c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="redbasic_2php_2style_8php.html#a9b489f1c595b867212d30eca0c85b38c">$pmenu_reply</a> = intval($reply_photo) - 16 . 'px'</td></tr>
+<tr class="separator:a9b489f1c595b867212d30eca0c85b38c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab3afb90d611eca90819f597a2c0bb459"><td class="memItemLeft" align="right" valign="top"><a class="el" href="redbasic_2php_2style_8php.html#a883f9f14e205f7aa7de02c14df67b40a">if</a>($nav_min_opacity===false||$nav_min_opacity=== '')&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="redbasic_2php_2style_8php.html#ab3afb90d611eca90819f597a2c0bb459">else</a></td></tr>
+<tr class="separator:ab3afb90d611eca90819f597a2c0bb459"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a01c151bf47f7da2b979aaa4cb868da4c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="redbasic_2php_2style_8php.html#a01c151bf47f7da2b979aaa4cb868da4c">$nav_percent_min_opacity</a> = (int) 100 * $nav_min_opacity</td></tr>
+<tr class="separator:a01c151bf47f7da2b979aaa4cb868da4c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Variable Documentation</h2>
+<a class="anchor" id="a339624aeef6604a2f00209a3962c6e1c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$background_image = <a class="el" href="include_2config_8php.html#ad58a4913937179adb13201c2ee3261ad">get_pconfig</a>($uid, &quot;redbasic&quot;, &quot;background_image&quot;)</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ae587aa6949ab6e4aa77a591e60f67ee0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$banner_colour = <a class="el" href="include_2config_8php.html#ad58a4913937179adb13201c2ee3261ad">get_pconfig</a>($uid,'redbasic','banner_colour')</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a0bdce350cf14bac44976e786d1be6574"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$bgcolour = <a class="el" href="include_2config_8php.html#ad58a4913937179adb13201c2ee3261ad">get_pconfig</a>($uid, &quot;redbasic&quot;, &quot;background_colour&quot;)</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="view_2theme_2apw_2php_2config_8php.html#a8b51951a70e1c1324be71345a61d70ec">apw_form()</a>, and <a class="el" href="view_2theme_2apw_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d">theme_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ad78cb8a1793834626d73aca22a1501f8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$body_font_size = <a class="el" href="include_2config_8php.html#ad58a4913937179adb13201c2ee3261ad">get_pconfig</a>($uid, &quot;redbasic&quot;, &quot;body_font_size&quot;)</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a5bff5012c56e34da6b3b2ed475726b27"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$comment_indent = intval($top_photo) + 10 . 'px'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a0cb037986e32302685d4f580dedd6473"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$converse_width =<a class="el" href="include_2config_8php.html#ad58a4913937179adb13201c2ee3261ad">get_pconfig</a>($uid,&quot;redbasic&quot;,&quot;converse_width&quot;)</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a68e3ff836ec87ae1370c9f4a12c21c6b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$font_colour = <a class="el" href="include_2config_8php.html#ad58a4913937179adb13201c2ee3261ad">get_pconfig</a>($uid, &quot;redbasic&quot;, &quot;font_colour&quot;)</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="view_2theme_2apw_2php_2config_8php.html#a8b51951a70e1c1324be71345a61d70ec">apw_form()</a>, and <a class="el" href="view_2theme_2apw_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d">theme_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="afcbcf57d0b90d2e4226c2e8a1171befc"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$font_size = <a class="el" href="include_2config_8php.html#ad58a4913937179adb13201c2ee3261ad">get_pconfig</a>($uid, &quot;redbasic&quot;, &quot;font_size&quot;)</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="view_2theme_2apw_2php_2config_8php.html#a8b51951a70e1c1324be71345a61d70ec">apw_form()</a>, and <a class="el" href="view_2theme_2apw_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d">theme_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a27cb59bbc750341f448cd0c298a7ea16"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$item_colour = <a class="el" href="include_2config_8php.html#ad58a4913937179adb13201c2ee3261ad">get_pconfig</a>($uid, &quot;redbasic&quot;, &quot;item_colour&quot;)</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="view_2theme_2apw_2php_2config_8php.html#a8b51951a70e1c1324be71345a61d70ec">apw_form()</a>, and <a class="el" href="view_2theme_2apw_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d">theme_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a136b0a2cdeb37f3fa506d28f82dcdbf8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$item_opacity = <a class="el" href="include_2config_8php.html#ad58a4913937179adb13201c2ee3261ad">get_pconfig</a>($uid, &quot;redbasic&quot;, &quot;item_opacity&quot;)</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a8fdd5874587a9ad86fb05ed0be265649"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$nav_colour = <a class="el" href="include_2config_8php.html#ad58a4913937179adb13201c2ee3261ad">get_pconfig</a>($uid, &quot;redbasic&quot;, &quot;nav_colour&quot;)</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ab5ec5703848e0132f8a8f3d3a53a58e1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$nav_min_opacity =<a class="el" href="include_2config_8php.html#ad58a4913937179adb13201c2ee3261ad">get_pconfig</a>($uid,'redbasic','nav_min_opacity')</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a01c151bf47f7da2b979aaa4cb868da4c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$nav_percent_min_opacity = (int) 100 * $nav_min_opacity</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a9b489f1c595b867212d30eca0c85b38c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$pmenu_reply = intval($reply_photo) - 16 . 'px'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ac98bd8264411bd207a5740d08e81a158"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$pmenu_top = intval($top_photo) - 16 . 'px'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a6502bedd57105ad1fb2dee2be9cf6351"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$radius = <a class="el" href="include_2config_8php.html#ad58a4913937179adb13201c2ee3261ad">get_pconfig</a>($uid, &quot;redbasic&quot;, &quot;radius&quot;)</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="view_2theme_2apw_2php_2config_8php.html#a8b51951a70e1c1324be71345a61d70ec">apw_form()</a>, and <a class="el" href="view_2theme_2apw_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d">theme_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a0b070f2c9140a7a12a0b1f88601a29e4"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$reply_photo =<a class="el" href="include_2config_8php.html#ad58a4913937179adb13201c2ee3261ad">get_pconfig</a>($uid,'redbasic','reply_photo')</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a83022b1d70799d2bde3d64dca9cb40ee"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$schema = <a class="el" href="include_2config_8php.html#ad58a4913937179adb13201c2ee3261ad">get_pconfig</a>($uid,'redbasic','schema')</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="view_2theme_2apw_2php_2config_8php.html#a8b51951a70e1c1324be71345a61d70ec">apw_form()</a>, and <a class="el" href="view_2theme_2apw_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d">theme_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ab00dfc29448b183055d2ae61a0e1874a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$shadow = <a class="el" href="include_2config_8php.html#ad58a4913937179adb13201c2ee3261ad">get_pconfig</a>($uid,&quot;redbasic&quot;,&quot;photo_shadow&quot;)</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a6ffadaf926b41ad84c30da319011e9ad"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$sloppy_photos =<a class="el" href="include_2config_8php.html#ad58a4913937179adb13201c2ee3261ad">get_pconfig</a>($uid,'redbasic','sloppy_photos')</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="acfd00ec469ca3c5e8bfac787573093f3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$toolicon_activecolour = <a class="el" href="include_2config_8php.html#ad58a4913937179adb13201c2ee3261ad">get_pconfig</a>($uid,'redbasic','toolicon_activecolour')</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a4161f6b8aa923f67e53f54dfb6554cdb"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$toolicon_colour = <a class="el" href="include_2config_8php.html#ad58a4913937179adb13201c2ee3261ad">get_pconfig</a>($uid,'redbasic','toolicon_colour')</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a810142b4bdd35a1d377ab279b02b47eb"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$top_photo =<a class="el" href="include_2config_8php.html#ad58a4913937179adb13201c2ee3261ad">get_pconfig</a>($uid,'redbasic','top_photo')</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a109bbd7f4add27541707b191b73ef84a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$uid = <a class="el" href="identity_8php.html#aaeb666872995e3ab8da8f7bc5f3b2bd3">get_theme_uid</a>()</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a61891d0d3e6894f52410d507b04e565d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$wwtop = intval($top_photo) - 15 . 'px'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ab3afb90d611eca90819f597a2c0bb459"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="redbasic_2php_2style_8php.html#a883f9f14e205f7aa7de02c14df67b40a">if</a> ($nav_min_opacity===false||$nav_min_opacity=== '') else</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<b>Initial value:</b><div class="fragment"><div class="line">{</div>
+<div class="line"> $nav_float_min_opacity = (float) <a class="code" href="redbasic_2php_2style_8php.html#ab5ec5703848e0132f8a8f3d3a53a58e1">$nav_min_opacity</a></div>
+</div><!-- fragment -->
+</div>
+</div>
+<a class="anchor" id="a883f9f14e205f7aa7de02c14df67b40a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">if($uid) <a class="el" href="include_2config_8php.html#ac543813a980b3841cc5a277fcd4a24a6">load_pconfig</a>($uid</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/redbasic_2php_2style_8php.js b/doc/html/redbasic_2php_2style_8php.js
new file mode 100644
index 000000000..c5e370461
--- /dev/null
+++ b/doc/html/redbasic_2php_2style_8php.js
@@ -0,0 +1,30 @@
+var redbasic_2php_2style_8php =
+[
+ [ "$background_image", "redbasic_2php_2style_8php.html#a339624aeef6604a2f00209a3962c6e1c", null ],
+ [ "$banner_colour", "redbasic_2php_2style_8php.html#ae587aa6949ab6e4aa77a591e60f67ee0", null ],
+ [ "$bgcolour", "redbasic_2php_2style_8php.html#a0bdce350cf14bac44976e786d1be6574", null ],
+ [ "$body_font_size", "redbasic_2php_2style_8php.html#ad78cb8a1793834626d73aca22a1501f8", null ],
+ [ "$comment_indent", "redbasic_2php_2style_8php.html#a5bff5012c56e34da6b3b2ed475726b27", null ],
+ [ "$converse_width", "redbasic_2php_2style_8php.html#a0cb037986e32302685d4f580dedd6473", null ],
+ [ "$font_colour", "redbasic_2php_2style_8php.html#a68e3ff836ec87ae1370c9f4a12c21c6b", null ],
+ [ "$font_size", "redbasic_2php_2style_8php.html#afcbcf57d0b90d2e4226c2e8a1171befc", null ],
+ [ "$item_colour", "redbasic_2php_2style_8php.html#a27cb59bbc750341f448cd0c298a7ea16", null ],
+ [ "$item_opacity", "redbasic_2php_2style_8php.html#a136b0a2cdeb37f3fa506d28f82dcdbf8", null ],
+ [ "$nav_colour", "redbasic_2php_2style_8php.html#a8fdd5874587a9ad86fb05ed0be265649", null ],
+ [ "$nav_min_opacity", "redbasic_2php_2style_8php.html#ab5ec5703848e0132f8a8f3d3a53a58e1", null ],
+ [ "$nav_percent_min_opacity", "redbasic_2php_2style_8php.html#a01c151bf47f7da2b979aaa4cb868da4c", null ],
+ [ "$pmenu_reply", "redbasic_2php_2style_8php.html#a9b489f1c595b867212d30eca0c85b38c", null ],
+ [ "$pmenu_top", "redbasic_2php_2style_8php.html#ac98bd8264411bd207a5740d08e81a158", null ],
+ [ "$radius", "redbasic_2php_2style_8php.html#a6502bedd57105ad1fb2dee2be9cf6351", null ],
+ [ "$reply_photo", "redbasic_2php_2style_8php.html#a0b070f2c9140a7a12a0b1f88601a29e4", null ],
+ [ "$schema", "redbasic_2php_2style_8php.html#a83022b1d70799d2bde3d64dca9cb40ee", null ],
+ [ "$shadow", "redbasic_2php_2style_8php.html#ab00dfc29448b183055d2ae61a0e1874a", null ],
+ [ "$sloppy_photos", "redbasic_2php_2style_8php.html#a6ffadaf926b41ad84c30da319011e9ad", null ],
+ [ "$toolicon_activecolour", "redbasic_2php_2style_8php.html#acfd00ec469ca3c5e8bfac787573093f3", null ],
+ [ "$toolicon_colour", "redbasic_2php_2style_8php.html#a4161f6b8aa923f67e53f54dfb6554cdb", null ],
+ [ "$top_photo", "redbasic_2php_2style_8php.html#a810142b4bdd35a1d377ab279b02b47eb", null ],
+ [ "$uid", "redbasic_2php_2style_8php.html#a109bbd7f4add27541707b191b73ef84a", null ],
+ [ "$wwtop", "redbasic_2php_2style_8php.html#a61891d0d3e6894f52410d507b04e565d", null ],
+ [ "else", "redbasic_2php_2style_8php.html#ab3afb90d611eca90819f597a2c0bb459", null ],
+ [ "if", "redbasic_2php_2style_8php.html#a883f9f14e205f7aa7de02c14df67b40a", null ]
+]; \ No newline at end of file
diff --git a/doc/html/redbasic_2php_2theme_8php.html b/doc/html/redbasic_2php_2theme_8php.html
new file mode 100644
index 000000000..c71a95829
--- /dev/null
+++ b/doc/html/redbasic_2php_2theme_8php.html
@@ -0,0 +1,145 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/redbasic/php/theme.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('redbasic_2php_2theme_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">theme.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:af6eb813e9fc7e2d76ac1b82bc5c0ed9b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="redbasic_2php_2theme_8php.html#af6eb813e9fc7e2d76ac1b82bc5c0ed9b">redbasic_init</a> (&amp;$a)</td></tr>
+<tr class="separator:af6eb813e9fc7e2d76ac1b82bc5c0ed9b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="af6eb813e9fc7e2d76ac1b82bc5c0ed9b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">redbasic_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<ul>
+<li>Name: Redbasic</li>
+<li>Description: RedMatrix standard theme</li>
+<li>Version: 1.0</li>
+<li>Author: Fabrixxm</li>
+<li>Maintainer: Mike Macgirvin</li>
+<li>Compat: Red [*] </li>
+</ul>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/redbasic_2php_2theme_8php.js b/doc/html/redbasic_2php_2theme_8php.js
new file mode 100644
index 000000000..ad2af9268
--- /dev/null
+++ b/doc/html/redbasic_2php_2theme_8php.js
@@ -0,0 +1,4 @@
+var redbasic_2php_2theme_8php =
+[
+ [ "redbasic_init", "redbasic_2php_2theme_8php.html#af6eb813e9fc7e2d76ac1b82bc5c0ed9b", null ]
+]; \ No newline at end of file
diff --git a/doc/html/redbasic_8php.html b/doc/html/redbasic_8php.html
new file mode 100644
index 000000000..31861ac51
--- /dev/null
+++ b/doc/html/redbasic_8php.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/apw/schema/redbasic.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('redbasic_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">redbasic.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/reddav_8php.html b/doc/html/reddav_8php.html
new file mode 100644
index 000000000..cc869593c
--- /dev/null
+++ b/doc/html/reddav_8php.html
@@ -0,0 +1,217 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/reddav.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('reddav_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Classes</a> &#124;
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">reddav.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedDirectory.html">RedDirectory</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedFile.html">RedFile</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedBasicAuth.html">RedBasicAuth</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedBrowser.html">RedBrowser</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ae92ea0df1993f6a7bcd1b6efa6c1fb66"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="reddav_8php.html#ae92ea0df1993f6a7bcd1b6efa6c1fb66">RedChannelList</a> (&amp;$auth)</td></tr>
+<tr class="separator:ae92ea0df1993f6a7bcd1b6efa6c1fb66"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5df0d09893f2e65dc5cf6bbab6cfb266"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="reddav_8php.html#a5df0d09893f2e65dc5cf6bbab6cfb266">RedCollectionData</a> ($file, &amp;$auth)</td></tr>
+<tr class="separator:a5df0d09893f2e65dc5cf6bbab6cfb266"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9f531641dfb4e43cd88ac1a9ae7e2088"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="reddav_8php.html#a9f531641dfb4e43cd88ac1a9ae7e2088">RedFileData</a> ($file, &amp;$auth, $test=false)</td></tr>
+<tr class="separator:a9f531641dfb4e43cd88ac1a9ae7e2088"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="ae92ea0df1993f6a7bcd1b6efa6c1fb66"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedChannelList </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$auth</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="reddav_8php.html#a5df0d09893f2e65dc5cf6bbab6cfb266">RedCollectionData()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a5df0d09893f2e65dc5cf6bbab6cfb266"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedCollectionData </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$file</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$auth</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classRedDirectory.html#aa42d3065f6f065b17db87146a7cb031a">RedDirectory\getChildren()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a9f531641dfb4e43cd88ac1a9ae7e2088"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedFileData </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$file</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$auth</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$test</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classRedDirectory.html#a5e3fc08b2bf9f61cea4d2ccae0495bec">RedDirectory\childExists()</a>, and <a class="el" href="classRedDirectory.html#aaa20f0f44da23781917af8170c0a2569">RedDirectory\getChild()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/reddav_8php.js b/doc/html/reddav_8php.js
new file mode 100644
index 000000000..3e2dd2ffe
--- /dev/null
+++ b/doc/html/reddav_8php.js
@@ -0,0 +1,10 @@
+var reddav_8php =
+[
+ [ "RedDirectory", "classRedDirectory.html", "classRedDirectory" ],
+ [ "RedFile", "classRedFile.html", "classRedFile" ],
+ [ "RedBasicAuth", "classRedBasicAuth.html", "classRedBasicAuth" ],
+ [ "RedBrowser", "classRedBrowser.html", "classRedBrowser" ],
+ [ "RedChannelList", "reddav_8php.html#ae92ea0df1993f6a7bcd1b6efa6c1fb66", null ],
+ [ "RedCollectionData", "reddav_8php.html#a5df0d09893f2e65dc5cf6bbab6cfb266", null ],
+ [ "RedFileData", "reddav_8php.html#a9f531641dfb4e43cd88ac1a9ae7e2088", null ]
+]; \ No newline at end of file
diff --git a/doc/html/redir_8php.html b/doc/html/redir_8php.html
new file mode 100644
index 000000000..ce368c49b
--- /dev/null
+++ b/doc/html/redir_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/redir.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('redir_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">redir.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a9ac266c3f5cf0d94ef63e6d0f2edf1f5"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="redir_8php.html#a9ac266c3f5cf0d94ef63e6d0f2edf1f5">redir_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a9ac266c3f5cf0d94ef63e6d0f2edf1f5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a9ac266c3f5cf0d94ef63e6d0f2edf1f5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">redir_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/redir_8php.js b/doc/html/redir_8php.js
new file mode 100644
index 000000000..8fb935d75
--- /dev/null
+++ b/doc/html/redir_8php.js
@@ -0,0 +1,4 @@
+var redir_8php =
+[
+ [ "redir_init", "redir_8php.html#a9ac266c3f5cf0d94ef63e6d0f2edf1f5", null ]
+]; \ No newline at end of file
diff --git a/doc/html/redstrap_2php_2style_8php.html b/doc/html/redstrap_2php_2style_8php.html
new file mode 100644
index 000000000..2642f697d
--- /dev/null
+++ b/doc/html/redstrap_2php_2style_8php.html
@@ -0,0 +1,377 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/redstrap/php/style.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rhash-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('redstrap_2php_2style_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle">
+<div class="title">style.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:a4131d1765ee4deb28e83fc4527943ee0"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="redstrap_2php_2style_8php.html#a4131d1765ee4deb28e83fc4527943ee0">$line_height</a> = false</td></tr>
+<tr class="separator:a4131d1765ee4deb28e83fc4527943ee0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:addf42c3d02e53f8e4153f3bb9dabfcda"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="redstrap_2php_2style_8php.html#addf42c3d02e53f8e4153f3bb9dabfcda">$redbasic_font_size</a> = false</td></tr>
+<tr class="separator:addf42c3d02e53f8e4153f3bb9dabfcda"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:adcfa918e05b5a98cbddc84bc3f1c15cc"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="redstrap_2php_2style_8php.html#adcfa918e05b5a98cbddc84bc3f1c15cc">$resolution</a> = false</td></tr>
+<tr class="separator:adcfa918e05b5a98cbddc84bc3f1c15cc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4086b1a341b7c8462a47fb1b25fd49ab"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="redstrap_2php_2style_8php.html#a4086b1a341b7c8462a47fb1b25fd49ab">$colour</a> = false</td></tr>
+<tr class="separator:a4086b1a341b7c8462a47fb1b25fd49ab"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acb3046ad9c01b7d60cde20f58d77c548"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="redstrap_2php_2style_8php.html#acb3046ad9c01b7d60cde20f58d77c548">$shadows</a> = false</td></tr>
+<tr class="separator:acb3046ad9c01b7d60cde20f58d77c548"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a938168352fd3cdaa1c10c16a34f5938a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="redstrap_2php_2style_8php.html#a938168352fd3cdaa1c10c16a34f5938a">$navcolour</a> = false</td></tr>
+<tr class="separator:a938168352fd3cdaa1c10c16a34f5938a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a232513bf4339fe34908c4c63cb93168b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="redstrap_2php_2style_8php.html#a232513bf4339fe34908c4c63cb93168b">$nav_bg_1</a> = &quot;f88&quot;</td></tr>
+<tr class="separator:a232513bf4339fe34908c4c63cb93168b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a03a72942b7428fd9af1224770d20a8ba"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="redstrap_2php_2style_8php.html#a03a72942b7428fd9af1224770d20a8ba">$nav_bg_2</a> = &quot;b00&quot;</td></tr>
+<tr class="separator:a03a72942b7428fd9af1224770d20a8ba"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acc190405dda0a23a80551dee11c74c0c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="redstrap_2php_2style_8php.html#acc190405dda0a23a80551dee11c74c0c">$nav_bg_3</a> = &quot;f00&quot;</td></tr>
+<tr class="separator:acc190405dda0a23a80551dee11c74c0c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aef266cfcb27c6ddb3292584c945bab33"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="redstrap_2php_2style_8php.html#aef266cfcb27c6ddb3292584c945bab33">$nav_bg_4</a> = &quot;b00&quot;</td></tr>
+<tr class="separator:aef266cfcb27c6ddb3292584c945bab33"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa658152b727ea1233f6df6ded6437dad"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="redstrap_2php_2style_8php.html#aa658152b727ea1233f6df6ded6437dad">$displaystyle</a> = false</td></tr>
+<tr class="separator:aa658152b727ea1233f6df6ded6437dad"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6628a80911a6b37b464ef110ac8f6e42"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="redstrap_2php_2style_8php.html#a6628a80911a6b37b464ef110ac8f6e42">$linkcolour</a> = false</td></tr>
+<tr class="separator:a6628a80911a6b37b464ef110ac8f6e42"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0b942d36d8862908864e2ffa4521be70"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="redstrap_2php_2style_8php.html#a0b942d36d8862908864e2ffa4521be70">$shiny</a> = false</td></tr>
+<tr class="separator:a0b942d36d8862908864e2ffa4521be70"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8749837e08dfb3372662af9c33fa2a2e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="redstrap_2php_2style_8php.html#a8749837e08dfb3372662af9c33fa2a2e">$site_line_height</a> = <a class="el" href="include_2config_8php.html#af02c96e6b37335774b548914ede1d22e">get_config</a>(&quot;redbasic&quot;,&quot;line_height&quot;)</td></tr>
+<tr class="separator:a8749837e08dfb3372662af9c33fa2a2e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a45e6fafa363bc4586fa91dce1786be4f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="redstrap_2php_2style_8php.html#a45e6fafa363bc4586fa91dce1786be4f">$site_redbasic_font_size</a> = <a class="el" href="include_2config_8php.html#af02c96e6b37335774b548914ede1d22e">get_config</a>(&quot;redbasic&quot;, &quot;font_size&quot; )</td></tr>
+<tr class="separator:a45e6fafa363bc4586fa91dce1786be4f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a02d39b683a42fffbb27823d3860283bd"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="redstrap_2php_2style_8php.html#a02d39b683a42fffbb27823d3860283bd">$site_colour</a> = <a class="el" href="include_2config_8php.html#af02c96e6b37335774b548914ede1d22e">get_config</a>(&quot;redbasic&quot;, &quot;colour&quot; )</td></tr>
+<tr class="separator:a02d39b683a42fffbb27823d3860283bd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0c4684da834439885ae2285649d1aaea"><td class="memItemLeft" align="right" valign="top">if(<a class="el" href="boot_8php.html#ad4c9dc2c8a82e8f52b7404c1655eab44">local_user</a>()) if($line_height===false) <br class="typebreak"/>
+if($line_height===false) if($redbasic_font_size===false) <br class="typebreak"/>
+if($redbasic_font_size===false) <br class="typebreak"/>
+if($colour===false) if($colour===false) <br class="typebreak"/>
+if($navcolour===&quot;black&quot;)&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="redstrap_2php_2style_8php.html#a0c4684da834439885ae2285649d1aaea">if</a> (file_exists('view/theme/'.<a class="el" href="boot_8php.html#ad206598b909e8eb67eb0e0bb5ef69c13">current_theme</a>(). '/css/style.css'))</td></tr>
+<tr class="separator:a0c4684da834439885ae2285649d1aaea"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Variable Documentation</h2>
+<a class="anchor" id="a4086b1a341b7c8462a47fb1b25fd49ab"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$colour = false</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="view_2theme_2redstrap_2php_2config_8php.html#af58e97b437c1e98a5e434886494cc70e">redbasic_form()</a>, and <a class="el" href="view_2theme_2redstrap_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d">theme_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa658152b727ea1233f6df6ded6437dad"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$displaystyle = false</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="view_2theme_2redstrap_2php_2config_8php.html#af58e97b437c1e98a5e434886494cc70e">redbasic_form()</a>, and <a class="el" href="view_2theme_2redstrap_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d">theme_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a4131d1765ee4deb28e83fc4527943ee0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$line_height = false</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="view_2theme_2redstrap_2php_2config_8php.html#af58e97b437c1e98a5e434886494cc70e">redbasic_form()</a>, and <a class="el" href="view_2theme_2redstrap_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d">theme_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a6628a80911a6b37b464ef110ac8f6e42"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$linkcolour = false</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="view_2theme_2redstrap_2php_2config_8php.html#af58e97b437c1e98a5e434886494cc70e">redbasic_form()</a>, and <a class="el" href="view_2theme_2redstrap_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d">theme_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a232513bf4339fe34908c4c63cb93168b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$nav_bg_1 = &quot;f88&quot;</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a03a72942b7428fd9af1224770d20a8ba"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$nav_bg_2 = &quot;b00&quot;</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="acc190405dda0a23a80551dee11c74c0c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$nav_bg_3 = &quot;f00&quot;</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aef266cfcb27c6ddb3292584c945bab33"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$nav_bg_4 = &quot;b00&quot;</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a938168352fd3cdaa1c10c16a34f5938a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$navcolour = false</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="view_2theme_2redstrap_2php_2config_8php.html#af58e97b437c1e98a5e434886494cc70e">redbasic_form()</a>, and <a class="el" href="view_2theme_2redstrap_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d">theme_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="addf42c3d02e53f8e4153f3bb9dabfcda"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$redbasic_font_size = false</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="adcfa918e05b5a98cbddc84bc3f1c15cc"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$resolution = false</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="photo_8php.html#a582779d24882b0d31ee909a91d70a448">photo_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="acb3046ad9c01b7d60cde20f58d77c548"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$shadows = false</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="view_2theme_2redstrap_2php_2config_8php.html#af58e97b437c1e98a5e434886494cc70e">redbasic_form()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a0b942d36d8862908864e2ffa4521be70"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$shiny = false</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="view_2theme_2redstrap_2php_2config_8php.html#af58e97b437c1e98a5e434886494cc70e">redbasic_form()</a>, and <a class="el" href="view_2theme_2redstrap_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d">theme_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a02d39b683a42fffbb27823d3860283bd"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$site_colour = <a class="el" href="include_2config_8php.html#af02c96e6b37335774b548914ede1d22e">get_config</a>(&quot;redbasic&quot;, &quot;colour&quot; )</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a8749837e08dfb3372662af9c33fa2a2e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$site_line_height = <a class="el" href="include_2config_8php.html#af02c96e6b37335774b548914ede1d22e">get_config</a>(&quot;redbasic&quot;,&quot;line_height&quot;)</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a45e6fafa363bc4586fa91dce1786be4f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$site_redbasic_font_size = <a class="el" href="include_2config_8php.html#af02c96e6b37335774b548914ede1d22e">get_config</a>(&quot;redbasic&quot;, &quot;font_size&quot; )</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a0c4684da834439885ae2285649d1aaea"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">if (<a class="el" href="boot_8php.html#ad4c9dc2c8a82e8f52b7404c1655eab44">local_user</a>()) if ($line_height===false) if ($line_height===false) if ($redbasic_font_size===false) if ($redbasic_font_size===false) if ($colour===false) if ($colour===false) if ($navcolour===&quot;black&quot;) if(file_exists('view/theme/'.<a class="el" href="boot_8php.html#ad206598b909e8eb67eb0e0bb5ef69c13">current_theme</a>(). '/css/style.css'))</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/redstrap_2php_2style_8php.js b/doc/html/redstrap_2php_2style_8php.js
new file mode 100644
index 000000000..b8f1b41e9
--- /dev/null
+++ b/doc/html/redstrap_2php_2style_8php.js
@@ -0,0 +1,20 @@
+var redstrap_2php_2style_8php =
+[
+ [ "$colour", "redstrap_2php_2style_8php.html#a4086b1a341b7c8462a47fb1b25fd49ab", null ],
+ [ "$displaystyle", "redstrap_2php_2style_8php.html#aa658152b727ea1233f6df6ded6437dad", null ],
+ [ "$line_height", "redstrap_2php_2style_8php.html#a4131d1765ee4deb28e83fc4527943ee0", null ],
+ [ "$linkcolour", "redstrap_2php_2style_8php.html#a6628a80911a6b37b464ef110ac8f6e42", null ],
+ [ "$nav_bg_1", "redstrap_2php_2style_8php.html#a232513bf4339fe34908c4c63cb93168b", null ],
+ [ "$nav_bg_2", "redstrap_2php_2style_8php.html#a03a72942b7428fd9af1224770d20a8ba", null ],
+ [ "$nav_bg_3", "redstrap_2php_2style_8php.html#acc190405dda0a23a80551dee11c74c0c", null ],
+ [ "$nav_bg_4", "redstrap_2php_2style_8php.html#aef266cfcb27c6ddb3292584c945bab33", null ],
+ [ "$navcolour", "redstrap_2php_2style_8php.html#a938168352fd3cdaa1c10c16a34f5938a", null ],
+ [ "$redbasic_font_size", "redstrap_2php_2style_8php.html#addf42c3d02e53f8e4153f3bb9dabfcda", null ],
+ [ "$resolution", "redstrap_2php_2style_8php.html#adcfa918e05b5a98cbddc84bc3f1c15cc", null ],
+ [ "$shadows", "redstrap_2php_2style_8php.html#acb3046ad9c01b7d60cde20f58d77c548", null ],
+ [ "$shiny", "redstrap_2php_2style_8php.html#a0b942d36d8862908864e2ffa4521be70", null ],
+ [ "$site_colour", "redstrap_2php_2style_8php.html#a02d39b683a42fffbb27823d3860283bd", null ],
+ [ "$site_line_height", "redstrap_2php_2style_8php.html#a8749837e08dfb3372662af9c33fa2a2e", null ],
+ [ "$site_redbasic_font_size", "redstrap_2php_2style_8php.html#a45e6fafa363bc4586fa91dce1786be4f", null ],
+ [ "if", "redstrap_2php_2style_8php.html#a0c4684da834439885ae2285649d1aaea", null ]
+]; \ No newline at end of file
diff --git a/doc/html/redstrap_2php_2theme_8php.html b/doc/html/redstrap_2php_2theme_8php.html
new file mode 100644
index 000000000..7b6f14cd5
--- /dev/null
+++ b/doc/html/redstrap_2php_2theme_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/redstrap/php/theme.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rhash-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('redstrap_2php_2theme_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">theme.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a4dac61d466b4261deca2846f548e484a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="redstrap_2php_2theme_8php.html#a4dac61d466b4261deca2846f548e484a">redstrap_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a4dac61d466b4261deca2846f548e484a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a4dac61d466b4261deca2846f548e484a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">redstrap_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/redstrap_2php_2theme_8php.js b/doc/html/redstrap_2php_2theme_8php.js
new file mode 100644
index 000000000..7a42ce992
--- /dev/null
+++ b/doc/html/redstrap_2php_2theme_8php.js
@@ -0,0 +1,4 @@
+var redstrap_2php_2theme_8php =
+[
+ [ "redstrap_init", "redstrap_2php_2theme_8php.html#a4dac61d466b4261deca2846f548e484a", null ]
+]; \ No newline at end of file
diff --git a/doc/html/register_8php.html b/doc/html/register_8php.html
new file mode 100644
index 000000000..c60337a73
--- /dev/null
+++ b/doc/html/register_8php.html
@@ -0,0 +1,173 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/register.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('register_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">register.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ae20c0cd40f738d6295de58b9202c83d5"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="register_8php.html#ae20c0cd40f738d6295de58b9202c83d5">register_init</a> (&amp;$a)</td></tr>
+<tr class="separator:ae20c0cd40f738d6295de58b9202c83d5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a51731dcc1917c58a790eb1c0f6132271"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="register_8php.html#a51731dcc1917c58a790eb1c0f6132271">register_post</a> (&amp;$a)</td></tr>
+<tr class="separator:a51731dcc1917c58a790eb1c0f6132271"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0e91f57f111407ea8d3223a05022bb2a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="register_8php.html#a0e91f57f111407ea8d3223a05022bb2a">register_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a0e91f57f111407ea8d3223a05022bb2a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a0e91f57f111407ea8d3223a05022bb2a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">register_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ae20c0cd40f738d6295de58b9202c83d5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">register_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a51731dcc1917c58a790eb1c0f6132271"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">register_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/register_8php.js b/doc/html/register_8php.js
new file mode 100644
index 000000000..7028ce8cc
--- /dev/null
+++ b/doc/html/register_8php.js
@@ -0,0 +1,6 @@
+var register_8php =
+[
+ [ "register_content", "register_8php.html#a0e91f57f111407ea8d3223a05022bb2a", null ],
+ [ "register_init", "register_8php.html#ae20c0cd40f738d6295de58b9202c83d5", null ],
+ [ "register_post", "register_8php.html#a51731dcc1917c58a790eb1c0f6132271", null ]
+]; \ No newline at end of file
diff --git a/doc/html/regmod_8php.html b/doc/html/regmod_8php.html
new file mode 100644
index 000000000..e5ac39365
--- /dev/null
+++ b/doc/html/regmod_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/regmod.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('regmod_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">regmod.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a7953df4e32e63946565e90cdd5d50409"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="regmod_8php.html#a7953df4e32e63946565e90cdd5d50409">regmod_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a7953df4e32e63946565e90cdd5d50409"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a7953df4e32e63946565e90cdd5d50409"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">regmod_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/regmod_8php.js b/doc/html/regmod_8php.js
new file mode 100644
index 000000000..d19c87424
--- /dev/null
+++ b/doc/html/regmod_8php.js
@@ -0,0 +1,4 @@
+var regmod_8php =
+[
+ [ "regmod_content", "regmod_8php.html#a7953df4e32e63946565e90cdd5d50409", null ]
+]; \ No newline at end of file
diff --git a/doc/html/removeme_8php.html b/doc/html/removeme_8php.html
new file mode 100644
index 000000000..f0325ad4d
--- /dev/null
+++ b/doc/html/removeme_8php.html
@@ -0,0 +1,155 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/removeme.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('removeme_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">removeme.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a7be08738beca44bb98a79e01cdb2ee88"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="removeme_8php.html#a7be08738beca44bb98a79e01cdb2ee88">removeme_post</a> (&amp;$a)</td></tr>
+<tr class="separator:a7be08738beca44bb98a79e01cdb2ee88"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a065a589caa2aa84c60f7073a28f0ad9c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="removeme_8php.html#a065a589caa2aa84c60f7073a28f0ad9c">removeme_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a065a589caa2aa84c60f7073a28f0ad9c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a065a589caa2aa84c60f7073a28f0ad9c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">removeme_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a7be08738beca44bb98a79e01cdb2ee88"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">removeme_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/removeme_8php.js b/doc/html/removeme_8php.js
new file mode 100644
index 000000000..ee5cd84d0
--- /dev/null
+++ b/doc/html/removeme_8php.js
@@ -0,0 +1,5 @@
+var removeme_8php =
+[
+ [ "removeme_content", "removeme_8php.html#a065a589caa2aa84c60f7073a28f0ad9c", null ],
+ [ "removeme_post", "removeme_8php.html#a7be08738beca44bb98a79e01cdb2ee88", null ]
+]; \ No newline at end of file
diff --git a/doc/html/resize.js b/doc/html/resize.js
new file mode 100644
index 000000000..8365b253c
--- /dev/null
+++ b/doc/html/resize.js
@@ -0,0 +1,93 @@
+var cookie_namespace = 'doxygen';
+var sidenav,navtree,content,header;
+
+function readCookie(cookie)
+{
+ var myCookie = cookie_namespace+"_"+cookie+"=";
+ if (document.cookie)
+ {
+ var index = document.cookie.indexOf(myCookie);
+ if (index != -1)
+ {
+ var valStart = index + myCookie.length;
+ var valEnd = document.cookie.indexOf(";", valStart);
+ if (valEnd == -1)
+ {
+ valEnd = document.cookie.length;
+ }
+ var val = document.cookie.substring(valStart, valEnd);
+ return val;
+ }
+ }
+ return 0;
+}
+
+function writeCookie(cookie, val, expiration)
+{
+ if (val==undefined) return;
+ if (expiration == null)
+ {
+ var date = new Date();
+ date.setTime(date.getTime()+(10*365*24*60*60*1000)); // default expiration is one week
+ expiration = date.toGMTString();
+ }
+ document.cookie = cookie_namespace + "_" + cookie + "=" + val + "; expires=" + expiration+"; path=/";
+}
+
+function resizeWidth()
+{
+ var windowWidth = $(window).width() + "px";
+ var sidenavWidth = $(sidenav).outerWidth();
+ content.css({marginLeft:parseInt(sidenavWidth)+6+"px"}); //account for 6px-wide handle-bar
+ writeCookie('width',sidenavWidth, null);
+}
+
+function restoreWidth(navWidth)
+{
+ var windowWidth = $(window).width() + "px";
+ content.css({marginLeft:parseInt(navWidth)+6+"px"});
+ sidenav.css({width:navWidth + "px"});
+}
+
+function resizeHeight()
+{
+ var headerHeight = header.outerHeight();
+ var footerHeight = footer.outerHeight();
+ var windowHeight = $(window).height() - headerHeight - footerHeight;
+ content.css({height:windowHeight + "px"});
+ navtree.css({height:windowHeight + "px"});
+ sidenav.css({height:windowHeight + "px",top: headerHeight+"px"});
+}
+
+function initResizable()
+{
+ header = $("#top");
+ sidenav = $("#side-nav");
+ content = $("#doc-content");
+ navtree = $("#nav-tree");
+ footer = $("#nav-path");
+ $(".side-nav-resizable").resizable({resize: function(e, ui) { resizeWidth(); } });
+ $(window).resize(function() { resizeHeight(); });
+ var width = readCookie('width');
+ if (width) { restoreWidth(width); } else { resizeWidth(); }
+ resizeHeight();
+ var url = location.href;
+ var i=url.indexOf("#");
+ if (i>=0) window.location.hash=url.substr(i);
+ var _preventDefault = function(evt) { evt.preventDefault(); };
+ $("#splitbar").bind("dragstart", _preventDefault).bind("selectstart", _preventDefault);
+ $(document).bind('touchmove',function(e){
+ try {
+ var target = e.target;
+ while (target) {
+ if ($(target).css('-webkit-overflow-scrolling')=='touch') return;
+ target = target.parentNode;
+ }
+ e.preventDefault();
+ } catch(err) {
+ e.preventDefault();
+ }
+ });
+}
+
+
diff --git a/doc/html/rhash-64.png b/doc/html/rhash-64.png
new file mode 100644
index 000000000..2e8396760
--- /dev/null
+++ b/doc/html/rhash-64.png
Binary files differ
diff --git a/doc/html/rm-64.png b/doc/html/rm-64.png
new file mode 100644
index 000000000..30341bfa4
--- /dev/null
+++ b/doc/html/rm-64.png
Binary files differ
diff --git a/doc/html/rmagic_8php.html b/doc/html/rmagic_8php.html
new file mode 100644
index 000000000..e98328483
--- /dev/null
+++ b/doc/html/rmagic_8php.html
@@ -0,0 +1,173 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/rmagic.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('rmagic_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">rmagic.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a95455edd43f1bff39446a57388cdde16"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="rmagic_8php.html#a95455edd43f1bff39446a57388cdde16">rmagic_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a95455edd43f1bff39446a57388cdde16"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a869de069d081b3c4e98b957d06bbf08f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="rmagic_8php.html#a869de069d081b3c4e98b957d06bbf08f">rmagic_post</a> (&amp;$a)</td></tr>
+<tr class="separator:a869de069d081b3c4e98b957d06bbf08f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3e28db1e5cfa7e5c2617f90222c1caef"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="rmagic_8php.html#a3e28db1e5cfa7e5c2617f90222c1caef">rmagic_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a3e28db1e5cfa7e5c2617f90222c1caef"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a3e28db1e5cfa7e5c2617f90222c1caef"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">rmagic_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a95455edd43f1bff39446a57388cdde16"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">rmagic_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a869de069d081b3c4e98b957d06bbf08f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">rmagic_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/rmagic_8php.js b/doc/html/rmagic_8php.js
new file mode 100644
index 000000000..ca44412be
--- /dev/null
+++ b/doc/html/rmagic_8php.js
@@ -0,0 +1,6 @@
+var rmagic_8php =
+[
+ [ "rmagic_content", "rmagic_8php.html#a3e28db1e5cfa7e5c2617f90222c1caef", null ],
+ [ "rmagic_init", "rmagic_8php.html#a95455edd43f1bff39446a57388cdde16", null ],
+ [ "rmagic_post", "rmagic_8php.html#a869de069d081b3c4e98b957d06bbf08f", null ]
+]; \ No newline at end of file
diff --git a/doc/html/rpost_8php.html b/doc/html/rpost_8php.html
new file mode 100644
index 000000000..c642a0a93
--- /dev/null
+++ b/doc/html/rpost_8php.html
@@ -0,0 +1,141 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/rpost.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('rpost_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">rpost.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a8190354d789000806d9879aea276728f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="rpost_8php.html#a8190354d789000806d9879aea276728f">rpost_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a8190354d789000806d9879aea276728f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a8190354d789000806d9879aea276728f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">rpost_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>remote post</p>
+<p><a href="https://yoursite/rpost?f=&title=&body=&remote_return=">https://yoursite/rpost?f=&amp;title=&amp;body=&amp;remote_return=</a></p>
+<p>This can be called via either GET or POST, use POST for long body content as suhosin often limits GET parameter length</p>
+<p>f= placeholder, often required title= Title of post body= Body of post source= Source application remote_return= absolute URL to return after posting is finished type= choices are 'html' or 'bbcode', default is 'bbcode' </p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/rpost_8php.js b/doc/html/rpost_8php.js
new file mode 100644
index 000000000..44a898923
--- /dev/null
+++ b/doc/html/rpost_8php.js
@@ -0,0 +1,4 @@
+var rpost_8php =
+[
+ [ "rpost_content", "rpost_8php.html#a8190354d789000806d9879aea276728f", null ]
+]; \ No newline at end of file
diff --git a/doc/html/rsd__xml_8php.html b/doc/html/rsd__xml_8php.html
new file mode 100644
index 000000000..9761872c4
--- /dev/null
+++ b/doc/html/rsd__xml_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/rsd_xml.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('rsd__xml_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">rsd_xml.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a740cd02fa15e5a53f8547fac73f0ab82"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="rsd__xml_8php.html#a740cd02fa15e5a53f8547fac73f0ab82">rsd_xml_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a740cd02fa15e5a53f8547fac73f0ab82"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a740cd02fa15e5a53f8547fac73f0ab82"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">rsd_xml_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/rsd__xml_8php.js b/doc/html/rsd__xml_8php.js
new file mode 100644
index 000000000..36c85f86a
--- /dev/null
+++ b/doc/html/rsd__xml_8php.js
@@ -0,0 +1,4 @@
+var rsd__xml_8php =
+[
+ [ "rsd_xml_content", "rsd__xml_8php.html#a740cd02fa15e5a53f8547fac73f0ab82", null ]
+]; \ No newline at end of file
diff --git a/doc/html/search/all_24.html b/doc/html/search/all_24.html
new file mode 100644
index 000000000..46ab96a5b
--- /dev/null
+++ b/doc/html/search/all_24.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_24.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/all_24.js b/doc/html/search/all_24.js
new file mode 100644
index 000000000..3f840682a
--- /dev/null
+++ b/doc/html/search/all_24.js
@@ -0,0 +1,175 @@
+var searchData=
+[
+ ['_24a',['$a',['../typo_8php.html#acebf83966ef6d7e5645a6b62ba368f9f',1,'typo.php']]],
+ ['_24account',['$account',['../classApp.html#a14bd4b1c29f3aff371fe5d4cb11aeea3',1,'App']]],
+ ['_24api',['$API',['../include_2api_8php.html#aeb2e7ad00ea666b4b6dfcf82008194f8',1,'api.php']]],
+ ['_24app',['$app',['../classBaseObject.html#a02cc4cd8fa26b6fc76d92fde54b4e4b1',1,'BaseObject']]],
+ ['_24apps',['$apps',['../classApp.html#a230e975296cf164da2fee35ef720964f',1,'App']]],
+ ['_24argc',['$argc',['../classApp.html#af58db526040829b1c8bd95561b329262',1,'App']]],
+ ['_24argv',['$argv',['../classApp.html#ab3da757abe5cb45bf88f07cc51a73b58',1,'App']]],
+ ['_24arr',['$arr',['../extract_8php.html#a63bb4c41bc532baacf6a4976cfaa0feb',1,'extract.php']]],
+ ['_24aside',['$aside',['../minimalisticdarkness_8php.html#a6e5d97615c6faef5dbffe04b8024ceaf',1,'minimalisticdarkness.php']]],
+ ['_24auth',['$auth',['../classRedDirectory.html#a9616af16cd19a18a6afebebcc2881c44',1,'RedDirectory\$auth()'],['../classRedFile.html#a4b5d0e33f919c6c175b30a55de6263f2',1,'RedFile\$auth()'],['../classRedBrowser.html#ab6d6d1e2a67e06b344a4cede1bd00b35',1,'RedBrowser\$auth()']]],
+ ['_24background_5fimage',['$background_image',['../redbasic_2php_2style_8php.html#a339624aeef6604a2f00209a3962c6e1c',1,'style.php']]],
+ ['_24banner_5fcolour',['$banner_colour',['../redbasic_2php_2style_8php.html#ae587aa6949ab6e4aa77a591e60f67ee0',1,'style.php']]],
+ ['_24baseurl',['$baseurl',['../classApp.html#ad5175536561021548ae8188e24c7b80c',1,'App']]],
+ ['_24bgcolour',['$bgcolour',['../redbasic_2php_2style_8php.html#a0bdce350cf14bac44976e786d1be6574',1,'style.php']]],
+ ['_24body_5ffont_5fsize',['$body_font_size',['../redbasic_2php_2style_8php.html#ad78cb8a1793834626d73aca22a1501f8',1,'style.php']]],
+ ['_24bodyclass',['$bodyclass',['../theme_2blogga_2php_2default_8php.html#a720581ae288aa09511670563e4205a4a',1,'$bodyclass():&#160;default.php'],['../theme_2blogga_2view_2theme_2blog_2default_8php.html#a720581ae288aa09511670563e4205a4a',1,'$bodyclass():&#160;default.php']]],
+ ['_24browser',['$browser',['../classRedBasicAuth.html#af14337f1baad407f8a85d48205c0f30e',1,'RedBasicAuth']]],
+ ['_24cached_5fprofile_5fimage',['$cached_profile_image',['../classApp.html#abe0e4fa91097f7a6588e1213a834121c',1,'App']]],
+ ['_24cached_5fprofile_5fpicdate',['$cached_profile_picdate',['../classApp.html#aab4a685d15a363bb1d7edbbc20bfb94e',1,'App']]],
+ ['_24called_5fapi',['$called_api',['../include_2api_8php.html#aa62b15a6bbb280e86b98132eb214013d',1,'api.php']]],
+ ['_24category',['$category',['../classApp.html#a5cfc098c061b7d765add58fd2ca97445',1,'App']]],
+ ['_24channel',['$channel',['../classApp.html#a050b0696118da47e8b30859ad1a2c149',1,'App\$channel()'],['../classItem.html#acc32426c0f465391be8a99ad810c7b8e',1,'Item\$channel()'],['../php_2theme__init_8php.html#a54f32c086fe209c99769a4c4047dd864',1,'$channel():&#160;theme_init.php']]],
+ ['_24channel_5fhash',['$channel_hash',['../classRedBasicAuth.html#ad5a3ea4dc4783b242d9dc6e76478b6ef',1,'RedBasicAuth']]],
+ ['_24channel_5fid',['$channel_id',['../classRedBasicAuth.html#a2dab393650d1573e3515969a153e8354',1,'RedBasicAuth']]],
+ ['_24channel_5fname',['$channel_name',['../classRedBasicAuth.html#a438ab125b6ef46581947e35d49cdebac',1,'RedBasicAuth']]],
+ ['_24children',['$children',['../classItem.html#a80dcd0fb7673776c0967839d429c2a0f',1,'Item']]],
+ ['_24cid',['$cid',['../classApp.html#ad1c8eb91a6fd470b94f34b7fdad3a2d0',1,'App']]],
+ ['_24cipher',['$cipher',['../classConversation.html#aa95c1a62af38bdfba7add9549bec083b',1,'Conversation']]],
+ ['_24cmd',['$cmd',['../classApp.html#a495ec082c2719314e536070ca1ce073d',1,'App']]],
+ ['_24comment_5fbox_5ftemplate',['$comment_box_template',['../classItem.html#a90743c8348b13213275c223bb9333aa0',1,'Item']]],
+ ['_24comment_5findent',['$comment_indent',['../redbasic_2php_2style_8php.html#a5bff5012c56e34da6b3b2ed475726b27',1,'style.php']]],
+ ['_24commentable',['$commentable',['../classConversation.html#afd4965d22a6e4bfea2f35e931b3273c6',1,'Conversation\$commentable()'],['../classItem.html#aa2c221231ad0fc3720ccc1f00f0c6304',1,'Item\$commentable()']]],
+ ['_24config',['$config',['../classApp.html#ac73dc90e4764497e2f1b7e6612c8fb88',1,'App']]],
+ ['_24connected',['$connected',['../classdba__driver.html#a205f6535e399700b6fca2492f96f2229',1,'dba_driver']]],
+ ['_24contact',['$contact',['../classApp.html#a98ef4cfd36693a3457c879b76bc6d694',1,'App']]],
+ ['_24contacts',['$contacts',['../classApp.html#a61ca6e3af82071ea25ff2fd5dbcddae2',1,'App']]],
+ ['_24content',['$content',['../classApp.html#ac1d80a14492acc932715d54567d8a589',1,'App']]],
+ ['_24conversation',['$conversation',['../classItem.html#a007424e3e3171dcfb4312a02161da6cd',1,'Item']]],
+ ['_24converse_5fwidth',['$converse_width',['../redbasic_2php_2style_8php.html#a0cb037986e32302685d4f580dedd6473',1,'style.php']]],
+ ['_24css_5fsources',['$css_sources',['../classApp.html#a6f55d087e1ff4710132c1b0863faa2ee',1,'App']]],
+ ['_24curl_5fcode',['$curl_code',['../classApp.html#a256360c9184fed6d7556e0bc0a835d7f',1,'App']]],
+ ['_24curl_5fheaders',['$curl_headers',['../classApp.html#af5007c42a693afd9c4899c243b2e1363',1,'App']]],
+ ['_24d',['$d',['../classTemplate.html#a8469ab2988b6be2681516dc4b4e07d38',1,'Template']]],
+ ['_24data',['$data',['../classApp.html#a0ce85be198e46570366cb3344f3c55b8',1,'App\$data()'],['../classItem.html#aec24e233f9098f902b1e57e60dcb2019',1,'Item\$data()'],['../classRedFile.html#a2ff12032b45538353eded9809d3b7550',1,'RedFile\$data()']]],
+ ['_24db',['$db',['../classApp.html#a330410a288f3393d53772f5e98f857ea',1,'App\$db()'],['../classdba__driver.html#a3033b5f1c2716b52202faeaae2592fe6',1,'dba_driver\$db()']]],
+ ['_24debug',['$debug',['../classdba__driver.html#af48e2afeded5285766bf92e22123ed03',1,'dba_driver\$debug()'],['../classTemplate.html#afc4afb6f89bebcd5480022312a56cb4a',1,'Template\$debug()']]],
+ ['_24dir',['$dir',['../docblox__errorchecker_8php.html#a1659f0a629d408e0f849dbe4ee061e62',1,'docblox_errorchecker.php']]],
+ ['_24dirs',['$dirs',['../typo_8php.html#a1b709c1d79631ebc8320b41bda028b54',1,'typo.php']]],
+ ['_24dirstack',['$dirstack',['../docblox__errorchecker_8php.html#ab66bc0493d25f39bf8b4dcbb429f04e6',1,'docblox_errorchecker.php']]],
+ ['_24done',['$done',['../classTemplate.html#abda4c8d049f70553338eae7c905e9d5c',1,'Template']]],
+ ['_24error',['$error',['../classApp.html#ac1a8b2cd40609b231a560201a08852ba',1,'App\$error()'],['../classdba__driver.html#a84675d28c7bd9b7290dd37e66dbd216c',1,'dba_driver\$error()']]],
+ ['_24ext_5fpath',['$ext_path',['../classRedDirectory.html#a0f113244cd85c17848df991001d024f4',1,'RedDirectory']]],
+ ['_24filelist',['$filelist',['../docblox__errorchecker_8php.html#a648a570b0f9f6e0e51b7267647c4b09b',1,'docblox_errorchecker.php']]],
+ ['_24filename',['$filename',['../classFriendicaSmarty.html#a33fabbd4d6eef869df496adf357ae690',1,'FriendicaSmarty']]],
+ ['_24files',['$files',['../extract_8php.html#a9590b15215a21e9b42eb546aeef79704',1,'$files():&#160;extract.php'],['../tpldebug_8php.html#a5358407d65f2ca826f96356a6642d149',1,'$files():&#160;tpldebug.php'],['../typo_8php.html#a9590b15215a21e9b42eb546aeef79704',1,'$files():&#160;typo.php']]],
+ ['_24folder_5fhash',['$folder_hash',['../classRedDirectory.html#aa10254abf177bb2a0e4a88495725e09b',1,'RedDirectory']]],
+ ['_24font_5fcolour',['$font_colour',['../redbasic_2php_2style_8php.html#a68e3ff836ec87ae1370c9f4a12c21c6b',1,'style.php']]],
+ ['_24font_5fsize',['$font_size',['../redbasic_2php_2style_8php.html#afcbcf57d0b90d2e4226c2e8a1171befc',1,'style.php']]],
+ ['_24force_5fmax_5fitems',['$force_max_items',['../classApp.html#ae3f47830543d0d902f66913def8db66b',1,'App']]],
+ ['_24gc_5fprobability',['$gc_probability',['../session_8php.html#a96b09cc763572f45280786a7b33feb7e',1,'session.php']]],
+ ['_24groups',['$groups',['../classApp.html#ac6e6b1c7d6df408580ff79977fcfa656',1,'App']]],
+ ['_24headimg',['$headimg',['../theme_2blogga_2php_2default_8php.html#ac7062908d1eb80c0735270f7997c4527',1,'$headimg():&#160;default.php'],['../theme_2blogga_2view_2theme_2blog_2default_8php.html#a52d9dd070ed541729088395c22502539',1,'$headimg():&#160;default.php']]],
+ ['_24headimghome',['$headimghome',['../theme_2blogga_2php_2default_8php.html#a1230ab83d4ec9785d8f3a966f33dc5f3',1,'$headimghome():&#160;default.php'],['../theme_2blogga_2view_2theme_2blog_2default_8php.html#a1230ab83d4ec9785d8f3a966f33dc5f3',1,'$headimghome():&#160;default.php']]],
+ ['_24height',['$height',['../classphoto__driver.html#aea560be5dfba09117d36c12bacbf3b80',1,'photo_driver']]],
+ ['_24hooks',['$hooks',['../classApp.html#a3694aa1907aa103a2adbc71f926f0fa0',1,'App']]],
+ ['_24hostname',['$hostname',['../classApp.html#a037049cba88dfc6ff94f4b5b779e3fd3',1,'App']]],
+ ['_24i',['$i',['../docblox__errorchecker_8php.html#a83018d9153d17d91fbcf3bc10158d34f',1,'docblox_errorchecker.php']]],
+ ['_24identities',['$identities',['../classApp.html#a7954862f44f606b0ff83d4c74d15e792',1,'App']]],
+ ['_24image',['$image',['../classphoto__driver.html#a7c78b5a01afe61ba3895ac07f4869b55',1,'photo_driver']]],
+ ['_24infile',['$infile',['../php2po_8php.html#a61f8ddeb5557d46ebc546cc355bda214',1,'php2po.php']]],
+ ['_24ink',['$ink',['../php2po_8php.html#a6b0b8ebd9ce811d1325ef2c129443bc0',1,'php2po.php']]],
+ ['_24install_5fwizard_5fpass',['$install_wizard_pass',['../setup_8php.html#addb24714bc2542aa4f4215e98fe48432',1,'setup.php']]],
+ ['_24interactive',['$interactive',['../classApp.html#a4c7cfc62d39508086cf300dc2e39c4df',1,'App']]],
+ ['_24item_5fcolour',['$item_colour',['../redbasic_2php_2style_8php.html#a27cb59bbc750341f448cd0c298a7ea16',1,'style.php']]],
+ ['_24item_5fopacity',['$item_opacity',['../redbasic_2php_2style_8php.html#a136b0a2cdeb37f3fa506d28f82dcdbf8',1,'style.php']]],
+ ['_24itemfloat',['$itemfloat',['../minimalisticdarkness_8php.html#a7e6c3d4efde4e9a2de32308081372c6b',1,'minimalisticdarkness.php']]],
+ ['_24js_5fsources',['$js_sources',['../classApp.html#a11e24b3ed9b33ffee7dd41d110b4366d',1,'App']]],
+ ['_24k',['$k',['../php2po_8php.html#ad6726cfaa85d4b8299d2b0f034cbf178',1,'php2po.php']]],
+ ['_24lang',['$lang',['../classTemplate.html#ace26b8a4252fbc1c385d2b5e1e93e5c8',1,'Template']]],
+ ['_24language',['$language',['../classApp.html#a1a297e70b3667b83f4460aa7ed9f5d6f',1,'App']]],
+ ['_24layout',['$layout',['../classApp.html#a58ac598544892ff7c32890291b72635e',1,'App']]],
+ ['_24ldelim',['$ldelim',['../classApp.html#a59dd4b665c70e7dbd80682c014ff7145',1,'App']]],
+ ['_24minwidth',['$minwidth',['../minimalisticdarkness_8php.html#a70bb13be8f23ec47839da81e0796f1cb',1,'minimalisticdarkness.php']]],
+ ['_24mode',['$mode',['../classConversation.html#afb03d1648dbfafe62caa1e30f32f2b1a',1,'Conversation']]],
+ ['_24module',['$module',['../classApp.html#a9bf62f8e39585c0aa48fcffc3bf3484d',1,'App']]],
+ ['_24module_5floaded',['$module_loaded',['../classApp.html#a6e4f0fbfa3cf6c11baebe22a03db6165',1,'App']]],
+ ['_24name',['$name',['../classFriendicaSmartyEngine.html#aaba6a42101bc9ae32e36b7fa2e243f02',1,'FriendicaSmartyEngine\$name()'],['../classRedFile.html#acc48c05cd5a70951cb3c615ad84f03ba',1,'RedFile\$name()'],['../classTemplate.html#a6eb301a51cc94d8b94f4548fbad85eae',1,'Template\$name()']]],
+ ['_24nav_5fcolour',['$nav_colour',['../redbasic_2php_2style_8php.html#a8fdd5874587a9ad86fb05ed0be265649',1,'style.php']]],
+ ['_24nav_5fmin_5fopacity',['$nav_min_opacity',['../redbasic_2php_2style_8php.html#ab5ec5703848e0132f8a8f3d3a53a58e1',1,'style.php']]],
+ ['_24nav_5fpercent_5fmin_5fopacity',['$nav_percent_min_opacity',['../redbasic_2php_2style_8php.html#a01c151bf47f7da2b979aaa4cb868da4c',1,'style.php']]],
+ ['_24nav_5fsel',['$nav_sel',['../classApp.html#a33a8e90b60ec4438f6fbf299d0f6839c',1,'App']]],
+ ['_24needed',['$needed',['../docblox__errorchecker_8php.html#a852004caba0a34390297a079f4aaac73',1,'docblox_errorchecker.php']]],
+ ['_24nodes',['$nodes',['../classTemplate.html#a8f4d17e49f42b876a97364c13fb572d1',1,'Template']]],
+ ['_24observer',['$observer',['../classApp.html#a4ffe529fb14389f7fedf5fdc5f722e7f',1,'App\$observer()'],['../classConversation.html#a8748445aa26047ebed5141f3c3cbc244',1,'Conversation\$observer()'],['../classRedBasicAuth.html#aa75dc43b59adc98e38a98517d3fd35d1',1,'RedBasicAuth\$observer()']]],
+ ['_24os_5fpath',['$os_path',['../classRedDirectory.html#a3c148c07ad909985125aa4926d8d0021',1,'RedDirectory']]],
+ ['_24out',['$out',['../php2po_8php.html#a48cb304902320d173a4eaa41543327b9',1,'php2po.php']]],
+ ['_24owner_5fid',['$owner_id',['../classRedBasicAuth.html#a09c1488a0b290f5a54dc15180c5690d7',1,'RedBasicAuth']]],
+ ['_24owner_5fname',['$owner_name',['../classItem.html#a9594df6014b0b6f45364ea7a34510130',1,'Item']]],
+ ['_24owner_5fnick',['$owner_nick',['../classRedBasicAuth.html#a8d09b8d784cc810a0b3be580d05106a7',1,'RedBasicAuth']]],
+ ['_24owner_5fphoto',['$owner_photo',['../classItem.html#a078f95b4134ce3a1df344cf8d386f986',1,'Item']]],
+ ['_24owner_5furl',['$owner_url',['../classItem.html#afa54851df82962c7c42dea3cc9f5c92c',1,'Item']]],
+ ['_24page',['$page',['../classApp.html#a4b67935096f66d1f14b657399a8461ac',1,'App']]],
+ ['_24pager',['$pager',['../classApp.html#a6bcb19cdc4907077da72864686d5a780',1,'App']]],
+ ['_24parent',['$parent',['../classItem.html#a1a1e42877e6ac7af50286142ceb483d2',1,'Item']]],
+ ['_24path',['$path',['../classApp.html#acad5896b7a79ae31433ad8f89606c728',1,'App']]],
+ ['_24perms',['$perms',['../classApp.html#ab47de68fa39806d1fb0976407e188b77',1,'App']]],
+ ['_24phpath',['$phpath',['../typo_8php.html#a3ecd17ac846be1b35f3662f5c12ab6bd',1,'typo.php']]],
+ ['_24phpfile',['$phpfile',['../php2po_8php.html#abbb0e5fd8fbc1f13a9bf68f86eb3d2a4',1,'php2po.php']]],
+ ['_24plugin',['$plugin',['../post__to__red_8php.html#ada8a7130088351710bb02ed622d6bf65',1,'post_to_red.php']]],
+ ['_24plugin_5fdir',['$plugin_dir',['../post__to__red_8php.html#a99811555b30bde504a863e44015f2f19',1,'post_to_red.php']]],
+ ['_24plugins',['$plugins',['../classApp.html#ae9f96338f32187d308b67b980eea0008',1,'App']]],
+ ['_24pmenu_5freply',['$pmenu_reply',['../redbasic_2php_2style_8php.html#a9b489f1c595b867212d30eca0c85b38c',1,'style.php']]],
+ ['_24pmenu_5ftop',['$pmenu_top',['../redbasic_2php_2style_8php.html#ac98bd8264411bd207a5740d08e81a158',1,'style.php']]],
+ ['_24pofile',['$pofile',['../php2po_8php.html#a401d84ce156e49e8168bd0c4781e1be1',1,'php2po.php']]],
+ ['_24poi',['$poi',['../classApp.html#a1936f2afce0dc0d1bbed15ae1f2ee81a',1,'App']]],
+ ['_24prepared_5fitem',['$prepared_item',['../classConversation.html#a5b6adbb2fe24f0f53d6c22660dff91b2',1,'Conversation']]],
+ ['_24preview',['$preview',['../classConversation.html#ae9937f9e0f3d927acc2bed46cc72e9ae',1,'Conversation']]],
+ ['_24profile',['$profile',['../classApp.html#a57d041fcc003d08c127dfa99a02bc192',1,'App']]],
+ ['_24profile_5fowner',['$profile_owner',['../classConversation.html#a2f12724ef0244e9049fe1bb9641b516d',1,'Conversation']]],
+ ['_24profile_5fuid',['$profile_uid',['../classApp.html#a08c24d6a6fc52fcc784b0f765f13b820',1,'App']]],
+ ['_24query_5fstring',['$query_string',['../classApp.html#a2e82da4aecfc2017a8d1d332ca501f9f',1,'App']]],
+ ['_24r',['$r',['../classTemplate.html#aac9a4638f11271e1b1dcc9f247242718',1,'Template']]],
+ ['_24radius',['$radius',['../redbasic_2php_2style_8php.html#a6502bedd57105ad1fb2dee2be9cf6351',1,'style.php']]],
+ ['_24rdelim',['$rdelim',['../classApp.html#a244b2d53b21be269aad2269d23192f95',1,'App']]],
+ ['_24red_5fpath',['$red_path',['../classRedDirectory.html#acb32b8df27538c57772824a745e751d7',1,'RedDirectory']]],
+ ['_24redirect_5furl',['$redirect_url',['../classItem.html#a5b561415861f5b89b0733aacfe0428d1',1,'Item']]],
+ ['_24replace',['$replace',['../classTemplate.html#a4e86b566c3f728e95ce5db1b33665c10',1,'Template']]],
+ ['_24reply_5fphoto',['$reply_photo',['../redbasic_2php_2style_8php.html#a0b070f2c9140a7a12a0b1f88601a29e4',1,'style.php']]],
+ ['_24res',['$res',['../docblox__errorchecker_8php.html#a49a8a4009b02e49717caa88b128affc5',1,'docblox_errorchecker.php']]],
+ ['_24root_5fdir',['$root_dir',['../classRedDirectory.html#ad87c514a307ec97ba0f1372e9bcfa6a4',1,'RedDirectory']]],
+ ['_24s',['$s',['../extract_8php.html#a50b05cf2e02ef0b67fcad97106dd7634',1,'extract.php']]],
+ ['_24schema',['$schema',['../redbasic_2php_2style_8php.html#a83022b1d70799d2bde3d64dca9cb40ee',1,'style.php']]],
+ ['_24scheme',['$scheme',['../classApp.html#ad082d63acc078e5bf23825a03bdd6a76',1,'App']]],
+ ['_24search',['$search',['../classTemplate.html#a317d535946dc065c35dd5cd38380e6c6',1,'Template']]],
+ ['_24sectionleft',['$sectionleft',['../minimalisticdarkness_8php.html#a0ac3f5b52212b0af87d513273da03ead',1,'minimalisticdarkness.php']]],
+ ['_24sectionwidth',['$sectionwidth',['../minimalisticdarkness_8php.html#a04de7b747e4f0a353e0e38cf77c3404f',1,'minimalisticdarkness.php']]],
+ ['_24session_5fexists',['$session_exists',['../session_8php.html#a62e4a6cb26b4bb1b8ddd8277b26090eb',1,'session.php']]],
+ ['_24session_5fexpire',['$session_expire',['../session_8php.html#af0100a2642a5268594bbd5742a03d885',1,'session.php']]],
+ ['_24shadow',['$shadow',['../redbasic_2php_2style_8php.html#ab00dfc29448b183055d2ae61a0e1874a',1,'style.php']]],
+ ['_24sloppy_5fphotos',['$sloppy_photos',['../redbasic_2php_2style_8php.html#a6ffadaf926b41ad84c30da319011e9ad',1,'style.php']]],
+ ['_24sourcename',['$sourcename',['../classApp.html#a13710907ef62554a0b4dd8a5eaa2eb11',1,'App']]],
+ ['_24stack',['$stack',['../classTemplate.html#a6f0efc256688c36110180b501067ff11',1,'Template']]],
+ ['_24str',['$str',['../typohelper_8php.html#a7542d95618011800c61773127fa625cf',1,'typohelper.php']]],
+ ['_24strings',['$strings',['../classApp.html#a5f64620473a9727a48ebe9cf6f335a98',1,'App']]],
+ ['_24template',['$template',['../classItem.html#a7f7bc059de377319282cb4ef4a828480',1,'Item']]],
+ ['_24template_5fengine_5finstance',['$template_engine_instance',['../classApp.html#a6844aedad10e201b8c3d80cfc9e876d3',1,'App']]],
+ ['_24template_5fengines',['$template_engines',['../classApp.html#a6859a4848a5c0049b4134cc4b34228b6',1,'App']]],
+ ['_24theme',['$theme',['../classApp.html#a764cc6cd7578132c21d2b4545de9301c',1,'App']]],
+ ['_24theme_5finfo',['$theme_info',['../classApp.html#aeca29fd4f7192ca07369b3c598c36e67',1,'App']]],
+ ['_24theme_5fthread_5fallow',['$theme_thread_allow',['../classApp.html#a487332f8de40414ca1a54a4265570b70',1,'App']]],
+ ['_24threaded',['$threaded',['../classItem.html#a1cb6aa8abdf7ea7daca647e40c8ea3a2',1,'Item']]],
+ ['_24threads',['$threads',['../classConversation.html#a41f4a549e6a99f98935c4742addd22c8',1,'Conversation']]],
+ ['_24timezone',['$timezone',['../classApp.html#ab35b01a366a2ea95725e97af278f87ab',1,'App']]],
+ ['_24toolicon_5factivecolour',['$toolicon_activecolour',['../redbasic_2php_2style_8php.html#acfd00ec469ca3c5e8bfac787573093f3',1,'style.php']]],
+ ['_24toolicon_5fcolour',['$toolicon_colour',['../redbasic_2php_2style_8php.html#a4161f6b8aa923f67e53f54dfb6554cdb',1,'style.php']]],
+ ['_24top_5fphoto',['$top_photo',['../redbasic_2php_2style_8php.html#a810142b4bdd35a1d377ab279b02b47eb',1,'style.php']]],
+ ['_24toplevel',['$toplevel',['../classItem.html#a5cfa6cf964f433a917a81cab079ff9d8',1,'Item']]],
+ ['_24type',['$type',['../classphoto__driver.html#a4920ed7cbb1ac735ac84153067537f03',1,'photo_driver']]],
+ ['_24types',['$types',['../classphoto__driver.html#a00cb166c00b7502dbc456c94330e5b03',1,'photo_driver']]],
+ ['_24uid',['$uid',['../apw_2php_2style_8php.html#a109bbd7f4add27541707b191b73ef84a',1,'$uid():&#160;style.php'],['../redbasic_2php_2style_8php.html#a109bbd7f4add27541707b191b73ef84a',1,'$uid():&#160;style.php']]],
+ ['_24user',['$user',['../classApp.html#a91fd3c8b89016113b05f3be24805ccff',1,'App']]],
+ ['_24valid',['$valid',['../classphoto__driver.html#a01d28d43b404d6f6de219dc9c5069dc9',1,'photo_driver']]],
+ ['_24videoheight',['$videoheight',['../classApp.html#a56b1a432c96aef8b1971f779c9d93c8c',1,'App']]],
+ ['_24videowidth',['$videowidth',['../classApp.html#adf2aaf95b062736a6fd5fc70fadf80e8',1,'App']]],
+ ['_24visiting',['$visiting',['../classItem.html#a4a123ae98987c1e30ecb15c4edf5a3b8',1,'Item']]],
+ ['_24wall_5fto_5fwall',['$wall_to_wall',['../classItem.html#a5d29ddecc073151a65a8e2ea2f6e4189',1,'Item']]],
+ ['_24widgetlist',['$widgetlist',['../classApp.html#a4833bee2eae4ad1691a04fa19e11a766',1,'App']]],
+ ['_24widgets',['$widgets',['../classApp.html#aa5a87c46ab3fee21362c466bf78042ef',1,'App']]],
+ ['_24width',['$width',['../classphoto__driver.html#a3e4215890f4a4894bf3799a7d2e0c0b1',1,'photo_driver\$width()'],['../minimalisticdarkness_8php.html#a5795120b4b324bc4ca83f1e6fdce7d57',1,'$width():&#160;minimalisticdarkness.php']]],
+ ['_24writable',['$writable',['../classConversation.html#ae81221251307e315f566a11f921ce0a9',1,'Conversation']]],
+ ['_24wwtop',['$wwtop',['../redbasic_2php_2style_8php.html#a61891d0d3e6894f52410d507b04e565d',1,'style.php']]],
+ ['_24zones',['$zones',['../extract_8php.html#a0cbe524ffc9a496114fd7ba9f423ef44',1,'extract.php']]]
+];
diff --git a/doc/html/search/all_5f.html b/doc/html/search/all_5f.html
new file mode 100644
index 000000000..879d79268
--- /dev/null
+++ b/doc/html/search/all_5f.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_5f.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/all_5f.js b/doc/html/search/all_5f.js
new file mode 100644
index 000000000..eb4ffa3bc
--- /dev/null
+++ b/doc/html/search/all_5f.js
@@ -0,0 +1,18 @@
+var searchData=
+[
+ ['_5f_5fconstruct',['__construct',['../classApp.html#af6d39f63fb7116bbeb04e51696f99474',1,'App\__construct()'],['../classConversation.html#af84ea6ccd72214c9bb4c504461cc8b09',1,'Conversation\__construct()'],['../classdba__driver.html#af3541d13ccb7a3eddfc03e253c746186',1,'dba_driver\__construct()'],['../classFriendicaSmarty.html#af12091b920b95eeef1218cbc48066ca6',1,'FriendicaSmarty\__construct()'],['../classFriendicaSmartyEngine.html#ab7c305bd8c386c2944e4dc9136cea5b6',1,'FriendicaSmartyEngine\__construct()'],['../classItem.html#a248f45871ecfe82a08d1d4c0769b2eb2',1,'Item\__construct()'],['../classFKOAuth1.html#a2f1276872329a6f0b704ccda1a4b9fa6',1,'FKOAuth1\__construct()'],['../classphoto__driver.html#ac6e85f8e507cab4e755ed7acdec401ae',1,'photo_driver\__construct()'],['../classRedDirectory.html#a1e35e3cd31d2a15250655e4cafdea180',1,'RedDirectory\__construct()'],['../classRedFile.html#a9a67bdb34c9db6ce144b3f371148b183',1,'RedFile\__construct()'],['../classRedBrowser.html#a4b76be9ccef0262cf78fffb4129eda93',1,'RedBrowser\__construct()']]],
+ ['_5f_5fdestruct',['__destruct',['../classdba__driver.html#a1a8bc9dc839a6320a0e07d8047a6b721',1,'dba_driver\__destruct()'],['../classphoto__driver.html#ae4501abdc9651359f81d036b63625686',1,'photo_driver\__destruct()']]],
+ ['_5fbuild_5fnodes',['_build_nodes',['../classTemplate.html#ac41c96e1f407b1a910029e5f4b7de8e4',1,'Template']]],
+ ['_5fget_5fvar',['_get_var',['../classTemplate.html#aae9c4d761ea1298e745e8052d7910194',1,'Template']]],
+ ['_5fpop_5fstack',['_pop_stack',['../classTemplate.html#a35d599c9b53a02e2fe2232e5b7ed5da7',1,'Template']]],
+ ['_5fpreg_5ferror',['_preg_error',['../classTemplate.html#a37c15f6d1ade500943629f27a62808b7',1,'Template']]],
+ ['_5fpush_5fstack',['_push_stack',['../classTemplate.html#aa6a087e0b7b887dd1c98c9e0ecbd3b29',1,'Template']]],
+ ['_5freplcb',['_replcb',['../classTemplate.html#ae791766c3d055f7f1ba5a5e60d647934',1,'Template']]],
+ ['_5freplcb_5fdebug',['_replcb_debug',['../classTemplate.html#a4b933954086d9e01a1804b0b1c6ee93e',1,'Template']]],
+ ['_5freplcb_5ffor',['_replcb_for',['../classTemplate.html#abf71098c80fd1f218a59452b3408309e',1,'Template']]],
+ ['_5freplcb_5fif',['_replcb_if',['../classTemplate.html#ae0836e7d5bd5afceb04f50fd635f1228',1,'Template']]],
+ ['_5freplcb_5finc',['_replcb_inc',['../classTemplate.html#a86e8fd27955ef10cadfd86f3fca70677',1,'Template']]],
+ ['_5freplcb_5fnode',['_replcb_node',['../classTemplate.html#aa6f9bd7a8f7512efcf90e8d376fe05ee',1,'Template']]],
+ ['_5fwell_5fknown_2ephp',['_well_known.php',['../__well__known_8php.html',1,'']]],
+ ['_5fwell_5fknown_5finit',['_well_known_init',['../__well__known_8php.html#a6ebfa937a2024f0b5dab53f0ac90fed0',1,'_well_known.php']]]
+];
diff --git a/doc/html/search/all_61.html b/doc/html/search/all_61.html
new file mode 100644
index 000000000..f85089b55
--- /dev/null
+++ b/doc/html/search/all_61.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_61.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/all_61.js b/doc/html/search/all_61.js
new file mode 100644
index 000000000..1f4decc58
--- /dev/null
+++ b/doc/html/search/all_61.js
@@ -0,0 +1,182 @@
+var searchData=
+[
+ ['abook_5fconnections',['abook_connections',['../Contact_8php.html#ae8803c330352cbf1e828eb7490edf47e',1,'Contact.php']]],
+ ['abook_5fflag_5farchived',['ABOOK_FLAG_ARCHIVED',['../boot_8php.html#a222395aa223cfbff6166fab0b4e2e1d5',1,'boot.php']]],
+ ['abook_5fflag_5fblocked',['ABOOK_FLAG_BLOCKED',['../boot_8php.html#a52b599cd13e152ebc80d7e4413683195',1,'boot.php']]],
+ ['abook_5fflag_5fhidden',['ABOOK_FLAG_HIDDEN',['../boot_8php.html#a34c756469ebed32e2fc987bcde62d382',1,'boot.php']]],
+ ['abook_5fflag_5fignored',['ABOOK_FLAG_IGNORED',['../boot_8php.html#aa3425e2de85b08f7041656d3a8502cb6',1,'boot.php']]],
+ ['abook_5fflag_5fpending',['ABOOK_FLAG_PENDING',['../boot_8php.html#a68eebe493e6f729ffd1aeda7a4b11155',1,'boot.php']]],
+ ['abook_5fflag_5fself',['ABOOK_FLAG_SELF',['../boot_8php.html#a0450389f24c632906fbc24347700a543',1,'boot.php']]],
+ ['abook_5fself',['abook_self',['../Contact_8php.html#ad5b02c2a962ee55b1b7ca6c159d6e4c5',1,'Contact.php']]],
+ ['abook_5ftoggle_5fflag',['abook_toggle_flag',['../Contact_8php.html#a024919623a830e8703ac4f23496dd66c',1,'Contact.php']]],
+ ['absurl',['absurl',['../boot_8php.html#a081307d681d7d04f17b9ced2076e7c85',1,'boot.php']]],
+ ['access_5ffree',['ACCESS_FREE',['../boot_8php.html#afbb1fe1b2c8c730ec8e08da93b6512c4',1,'boot.php']]],
+ ['access_5fpaid',['ACCESS_PAID',['../boot_8php.html#a9c80420e5a063a4a87ce4831f086134d',1,'boot.php']]],
+ ['access_5fprivate',['ACCESS_PRIVATE',['../boot_8php.html#a7f3474fec541e261fc8dff47313c4017',1,'boot.php']]],
+ ['access_5ftiered',['ACCESS_TIERED',['../boot_8php.html#aeb1039302affcbe7e8872c01c08c88f8',1,'boot.php']]],
+ ['access_5ftoken_5fduration',['ACCESS_TOKEN_DURATION',['../oauth_8php.html#ad343cab37aa860d2d14dc86b7f5ca0c6',1,'oauth.php']]],
+ ['account_2ephp',['account.php',['../account_8php.html',1,'']]],
+ ['account_5fblocked',['ACCOUNT_BLOCKED',['../boot_8php.html#af3bdfc20979c16f15bb9c60446a480f9',1,'boot.php']]],
+ ['account_5fexpired',['ACCOUNT_EXPIRED',['../boot_8php.html#a400519fa181591cd6fdbb8f25fbcba0a',1,'boot.php']]],
+ ['account_5fok',['ACCOUNT_OK',['../boot_8php.html#a84057c5bfa1bca5fba8497fe005ee4d8',1,'boot.php']]],
+ ['account_5fpending',['ACCOUNT_PENDING',['../boot_8php.html#a032bbd6d0321e99e9117332c9ed2b1b8',1,'boot.php']]],
+ ['account_5fremove',['account_remove',['../Contact_8php.html#a6e64de7db60b7243dce45fb6347636ff',1,'Contact.php']]],
+ ['account_5fremoved',['ACCOUNT_REMOVED',['../boot_8php.html#ab5ddbe69d3d03acd06e1fb281488cb78',1,'boot.php']]],
+ ['account_5frole_5fadmin',['ACCOUNT_ROLE_ADMIN',['../boot_8php.html#ac8400313df2c831653f9036f71ebd86d',1,'boot.php']]],
+ ['account_5frole_5fallowcode',['ACCOUNT_ROLE_ALLOWCODE',['../boot_8php.html#a84f48897059bbd4a8738d7ee4cec6688',1,'boot.php']]],
+ ['account_5frole_5fsystem',['ACCOUNT_ROLE_SYSTEM',['../boot_8php.html#a7c2eb822d50e1554bf5c32861f36342b',1,'boot.php']]],
+ ['account_5ftotal',['account_total',['../account_8php.html#a43e3042b2723d76915a030bac3c668b6',1,'account.php']]],
+ ['account_5funverified',['ACCOUNT_UNVERIFIED',['../boot_8php.html#af3a4271630aabd8be592213f925d6a36',1,'boot.php']]],
+ ['account_5fverify_5fpassword',['account_verify_password',['../auth_8php.html#a07bae0e623e2daa9ee2cd5a8aa294dee',1,'auth.php']]],
+ ['achievements_2ephp',['achievements.php',['../achievements_8php.html',1,'']]],
+ ['achievements_5fcontent',['achievements_content',['../achievements_8php.html#a35ae04ada0e227d19671f289a32fb30e',1,'achievements.php']]],
+ ['acknowledge_5fpermissions',['acknowledge_permissions',['../classProtoDriver.html#a1593f3abae050edbd9304f4f8bc4894a',1,'ProtoDriver\acknowledge_permissions()'],['../classZotDriver.html#a3cfdf443da4e5326e205855d7c0054f2',1,'ZotDriver\acknowledge_permissions()']]],
+ ['acl_2ephp',['acl.php',['../acl_8php.html',1,'']]],
+ ['acl_5finit',['acl_init',['../acl_8php.html#ac6776dba871806ecdb5d1659bc2eb07a',1,'acl.php']]],
+ ['acl_5fselectors',['acl_selectors',['../namespaceacl__selectors.html',1,'']]],
+ ['acl_5fselectors_2ephp',['acl_selectors.php',['../acl__selectors_8php.html',1,'']]],
+ ['activities_2ephp',['activities.php',['../activities_8php.html',1,'']]],
+ ['activity_5fdislike',['ACTIVITY_DISLIKE',['../boot_8php.html#a0e57f846e6d47a308feced0f7274f178',1,'boot.php']]],
+ ['activity_5ffavorite',['ACTIVITY_FAVORITE',['../boot_8php.html#a3e2ea123d29a72012db1241f96280b0e',1,'boot.php']]],
+ ['activity_5ffollow',['ACTIVITY_FOLLOW',['../boot_8php.html#a5ae728ac966ea1d3525a19e7fec59434',1,'boot.php']]],
+ ['activity_5ffriend',['ACTIVITY_FRIEND',['../boot_8php.html#a176664e78dcb9132e16be69418223eb2',1,'boot.php']]],
+ ['activity_5fjoin',['ACTIVITY_JOIN',['../boot_8php.html#aced60c7285192e80b7c4757e45a7f1e3',1,'boot.php']]],
+ ['activity_5flike',['ACTIVITY_LIKE',['../boot_8php.html#abdcdfc873ace4e0902177bad934de0c0',1,'boot.php']]],
+ ['activity_5fmatch',['activity_match',['../text_8php.html#af8a3e3a66a7b862d4510f145d2e13186',1,'text.php']]],
+ ['activity_5fmood',['ACTIVITY_MOOD',['../boot_8php.html#a7aa57438db03834aaa0b468bdce773a6',1,'boot.php']]],
+ ['activity_5fobj_5falbum',['ACTIVITY_OBJ_ALBUM',['../boot_8php.html#aaf9b76832ee5f85e56466af162ba8a14',1,'boot.php']]],
+ ['activity_5fobj_5fcomment',['ACTIVITY_OBJ_COMMENT',['../boot_8php.html#a0a98dd0110dc6c8e24cefc8ae74d5562',1,'boot.php']]],
+ ['activity_5fobj_5fevent',['ACTIVITY_OBJ_EVENT',['../boot_8php.html#a2e90096fede6acce16abf0da8cb2febe',1,'boot.php']]],
+ ['activity_5fobj_5fgroup',['ACTIVITY_OBJ_GROUP',['../boot_8php.html#a7bff2278e68a71e524afd1c7c951e1e3',1,'boot.php']]],
+ ['activity_5fobj_5fheart',['ACTIVITY_OBJ_HEART',['../boot_8php.html#ad302cb26b838898d475f57f61b0fcc9f',1,'boot.php']]],
+ ['activity_5fobj_5fnote',['ACTIVITY_OBJ_NOTE',['../boot_8php.html#a44d069c8a1cfcc6d2007c506a17ff28f',1,'boot.php']]],
+ ['activity_5fobj_5fp_5fphoto',['ACTIVITY_OBJ_P_PHOTO',['../boot_8php.html#a74bf27f7564c9a37975e7b37d973dcab',1,'boot.php']]],
+ ['activity_5fobj_5fperson',['ACTIVITY_OBJ_PERSON',['../boot_8php.html#a2f8f25b13480c37a5f22511f53da8bab',1,'boot.php']]],
+ ['activity_5fobj_5fphoto',['ACTIVITY_OBJ_PHOTO',['../boot_8php.html#a774f0f792ebfec1e774c5a17bb9d5966',1,'boot.php']]],
+ ['activity_5fobj_5fprofile',['ACTIVITY_OBJ_PROFILE',['../boot_8php.html#a62c832a95e38b1fa23e6cef39521b7d5',1,'boot.php']]],
+ ['activity_5fobj_5ftagterm',['ACTIVITY_OBJ_TAGTERM',['../boot_8php.html#a1da180f961f49a11573cac4ff6c62c05',1,'boot.php']]],
+ ['activity_5fobj_5fthing',['ACTIVITY_OBJ_THING',['../boot_8php.html#a0fb63e51c2a9814941842ae8f2f4dff8',1,'boot.php']]],
+ ['activity_5fpoke',['ACTIVITY_POKE',['../boot_8php.html#a14ba8f9e162f2559831ee3bf98e0c3bd',1,'boot.php']]],
+ ['activity_5fpost',['ACTIVITY_POST',['../boot_8php.html#a5c3747e0f505f0d5271dc4c54e3feaf4',1,'boot.php']]],
+ ['activity_5freq_5ffriend',['ACTIVITY_REQ_FRIEND',['../boot_8php.html#afe084c30a1810c10442edb4fbcbc0086',1,'boot.php']]],
+ ['activity_5fsanitise',['activity_sanitise',['../items_8php.html#a36e656667193c83aa2cc03a024fc131b',1,'items.php']]],
+ ['activity_5ftag',['ACTIVITY_TAG',['../boot_8php.html#a12c781cefc20167231e2e3fd5866b1b5',1,'boot.php']]],
+ ['activity_5funfollow',['ACTIVITY_UNFOLLOW',['../boot_8php.html#a53e4bdb6f225da55115acb9277f75e53',1,'boot.php']]],
+ ['activity_5funfriend',['ACTIVITY_UNFRIEND',['../boot_8php.html#a29528a2544373cc19a378f350040c6a1',1,'boot.php']]],
+ ['activity_5fupdate',['ACTIVITY_UPDATE',['../boot_8php.html#a7f4264232dbb6c3b41f2617deecb1866',1,'boot.php']]],
+ ['add_5fchild',['add_child',['../classItem.html#a80dcd9d0f548c3ad550abe7e6981fb51',1,'Item']]],
+ ['add_5fchildren_5fto_5flist',['add_children_to_list',['../conversation_8php.html#ad3e1d4b15e7d6d026ee182edd58f692b',1,'conversation.php']]],
+ ['add_5fthread',['add_thread',['../classConversation.html#a8335cdd43f1836e3c255638e61a09e16',1,'Conversation']]],
+ ['admin_2ephp',['admin.php',['../admin_8php.html',1,'']]],
+ ['admin_5fcontent',['admin_content',['../admin_8php.html#afef415e4011607fbb665610441595015',1,'admin.php']]],
+ ['admin_5fpage_5fdbsync',['admin_page_dbsync',['../admin_8php.html#aaa6addf2dbc3f3fcf99244a56b41eade',1,'admin.php']]],
+ ['admin_5fpage_5fhubloc',['admin_page_hubloc',['../admin_8php.html#a6943543f3138f6ee182cb701f415d1cc',1,'admin.php']]],
+ ['admin_5fpage_5fhubloc_5fpost',['admin_page_hubloc_post',['../admin_8php.html#a60ba9783ad14545814919970bc3fb725',1,'admin.php']]],
+ ['admin_5fpage_5flogs',['admin_page_logs',['../admin_8php.html#a1d1362698af14d209aa3a0fb655551dd',1,'admin.php']]],
+ ['admin_5fpage_5flogs_5fpost',['admin_page_logs_post',['../admin_8php.html#a233b7c8c31776b7020532003c6e44e1c',1,'admin.php']]],
+ ['admin_5fpage_5fplugins',['admin_page_plugins',['../admin_8php.html#a54128076986ba80c4a103de3fc3e19a8',1,'admin.php']]],
+ ['admin_5fpage_5fsite',['admin_page_site',['../admin_8php.html#ac0f3bd12431c056aad77bac9d09fa30e',1,'admin.php']]],
+ ['admin_5fpage_5fsite_5fpost',['admin_page_site_post',['../admin_8php.html#add865f4ae806ecbf716f423fc3e50e4f',1,'admin.php']]],
+ ['admin_5fpage_5fsummary',['admin_page_summary',['../admin_8php.html#ac6e95b920b5abd030cc522964987087a',1,'admin.php']]],
+ ['admin_5fpage_5fthemes',['admin_page_themes',['../admin_8php.html#af124619fdc278fe2bf14c45ddaa260fb',1,'admin.php']]],
+ ['admin_5fpage_5fusers',['admin_page_users',['../admin_8php.html#a62f10f90c47686c9c3c37c4c03a108d2',1,'admin.php']]],
+ ['admin_5fpage_5fusers_5fpost',['admin_page_users_post',['../admin_8php.html#a5a696706a3869800e65fb365214241b7',1,'admin.php']]],
+ ['admin_5fpost',['admin_post',['../admin_8php.html#acf51f5837a7427832144c2bf7308ada3',1,'admin.php']]],
+ ['advanced_5fprofile',['advanced_profile',['../identity_8php.html#aa870d2c1f558cfd52bef05bc124e8fa4',1,'identity.php']]],
+ ['aes256cbc_5fdecrypt',['AES256CBC_decrypt',['../crypto_8php.html#ac852ee41392d1358c3a54d54935e0bf9',1,'crypto.php']]],
+ ['aes256cbc_5fencrypt',['AES256CBC_encrypt',['../crypto_8php.html#a5c61821d205f95f127114159cbffa764',1,'crypto.php']]],
+ ['aes_5fencapsulate',['aes_encapsulate',['../crypto_8php.html#a2148d7aac7b30c720f7ebda7e9790286',1,'crypto.php']]],
+ ['aes_5funencapsulate',['aes_unencapsulate',['../crypto_8php.html#aca7c3a574bfb6c6ef1f2403a56823914',1,'crypto.php']]],
+ ['age',['age',['../datetime_8php.html#abc1652f96799cec6fce8797ba2ebc2df',1,'datetime.php']]],
+ ['all_5ffriends',['all_friends',['../socgraph_8php.html#a16ac51c505d72987ed8d6d6aed0e8586',1,'socgraph.php']]],
+ ['allowed_5femail',['allowed_email',['../include_2network_8php.html#aba38458a2ff2d92d3536488dbb119694',1,'network.php']]],
+ ['allowed_5fpublic_5frecips',['allowed_public_recips',['../zot_8php.html#a703f528ade8382cf374e4119bd6f7859',1,'zot.php']]],
+ ['allowed_5furl',['allowed_url',['../include_2network_8php.html#aee35d9ad6b3f872bfb39ba3598936aa7',1,'network.php']]],
+ ['alt_5fpager',['alt_pager',['../text_8php.html#a75c243e06341ec16bd5a44b9b1cacd85',1,'text.php']]],
+ ['api_2ephp',['api.php',['../mod_2api_8php.html',1,'']]],
+ ['api_2ephp',['api.php',['../include_2api_8php.html',1,'']]],
+ ['api_5faccount_5flogout',['api_account_logout',['../include_2api_8php.html#a2e94eab9d6c164bfef7a1b2ab87b339b',1,'api.php']]],
+ ['api_5faccount_5frate_5flimit_5fstatus',['api_account_rate_limit_status',['../include_2api_8php.html#ae8f5863e18d69421005c71441c9d99a5',1,'api.php']]],
+ ['api_5faccount_5fverify_5fcredentials',['api_account_verify_credentials',['../include_2api_8php.html#a864191bb876a515ed71b17e260ef35ad',1,'api.php']]],
+ ['api_5falbums',['api_albums',['../include_2api_8php.html#aa9dc5350b26d6c7727d6c4b641ecba18',1,'api.php']]],
+ ['api_5fapply_5ftemplate',['api_apply_template',['../include_2api_8php.html#a5990101034e7abf6404feba3cd273629',1,'api.php']]],
+ ['api_5fcall',['api_call',['../include_2api_8php.html#a176c448d79c211ad41c2bbe3124658f5',1,'api.php']]],
+ ['api_5fchannel_5fstream',['api_channel_stream',['../include_2api_8php.html#a72bfecac1970bc29b853073e816388ff',1,'api.php']]],
+ ['api_5fcontent',['api_content',['../mod_2api_8php.html#a33315b5bbf5418f6850b2038107b526d',1,'api.php']]],
+ ['api_5fdate',['api_date',['../include_2api_8php.html#aea2dda92a155f2843a0ca188d8dfdf25',1,'api.php']]],
+ ['api_5fdirect_5fmessages_5fall',['api_direct_messages_all',['../include_2api_8php.html#a970b02c06dea8b229aa3d5fff9cf4705',1,'api.php']]],
+ ['api_5fdirect_5fmessages_5fbox',['api_direct_messages_box',['../include_2api_8php.html#a7759ccddc8dff012ad168e511ffe5af5',1,'api.php']]],
+ ['api_5fdirect_5fmessages_5fconversation',['api_direct_messages_conversation',['../include_2api_8php.html#a9160288b7ac220635942d8dc209b78c3',1,'api.php']]],
+ ['api_5fdirect_5fmessages_5finbox',['api_direct_messages_inbox',['../include_2api_8php.html#ad2b0192f3006918bea895de8074bf8d2',1,'api.php']]],
+ ['api_5fdirect_5fmessages_5fnew',['api_direct_messages_new',['../include_2api_8php.html#a0991f72554f821255397d615e76f3203',1,'api.php']]],
+ ['api_5fdirect_5fmessages_5fsentbox',['api_direct_messages_sentbox',['../include_2api_8php.html#a58cf4c02ef435996f5c3bc4283d3968d',1,'api.php']]],
+ ['api_5fexport_5fbasic',['api_export_basic',['../include_2api_8php.html#adfc035ee6303c1d8ba5336a4ead2bd53',1,'api.php']]],
+ ['api_5ffavorites',['api_favorites',['../include_2api_8php.html#a2c71b1226ef1283b5370bd1c200fee5f',1,'api.php']]],
+ ['api_5fff_5fids',['api_ff_ids',['../include_2api_8php.html#a36344c80b8e9755da2f2dd3a0e28cce8',1,'api.php']]],
+ ['api_5ffollowers_5fids',['api_followers_ids',['../include_2api_8php.html#ab1ecb58954f722444bfe03233345cb1b',1,'api.php']]],
+ ['api_5fformat_5fas',['api_format_as',['../include_2api_8php.html#a18cab7c6391df5c421753463f5d2a879',1,'api.php']]],
+ ['api_5fformat_5fitems',['api_format_items',['../include_2api_8php.html#a4c6fb9fb5203aa60f4b3afd4521db8ea',1,'api.php']]],
+ ['api_5fformat_5fmessages',['api_format_messages',['../include_2api_8php.html#ae82608c317421f27446465aa6724733d',1,'api.php']]],
+ ['api_5ffriendica_5fversion',['api_friendica_version',['../include_2api_8php.html#a53b0680b682ae6078f2e1ed18cfb3f74',1,'api.php']]],
+ ['api_5ffriends_5fids',['api_friends_ids',['../include_2api_8php.html#acafd2899309a005fcb725289173dc7fe',1,'api.php']]],
+ ['api_5fget_5fuser',['api_get_user',['../include_2api_8php.html#aa40bae797bcd9ccacffdce5a3b5a1afa',1,'api.php']]],
+ ['api_5fhelp_5ftest',['api_help_test',['../include_2api_8php.html#ac5a64cc81d70ff3cf866093ea9721d23',1,'api.php']]],
+ ['api_5fitem_5fget_5fuser',['api_item_get_user',['../include_2api_8php.html#aa49741342ad8ba285737eea1209a37e1',1,'api.php']]],
+ ['api_5flogin',['api_login',['../include_2api_8php.html#afe534f826e4282b72d66e8cadca7bb73',1,'api.php']]],
+ ['api_5foauth_5faccess_5ftoken',['api_oauth_access_token',['../include_2api_8php.html#aff322705cc6084b329003fc8eab0aad0',1,'api.php']]],
+ ['api_5foauth_5frequest_5ftoken',['api_oauth_request_token',['../include_2api_8php.html#aa1bddb580510e70cc1a7b7381667f1a3',1,'api.php']]],
+ ['api_5fphotos',['api_photos',['../include_2api_8php.html#aa6fc3bc8c0fad1d081db0dcc456dd77f',1,'api.php']]],
+ ['api_5fpost',['api_post',['../mod_2api_8php.html#a6fe77f05c07cb51048df0d557b4b9bd2',1,'api.php']]],
+ ['api_5fregister_5ffunc',['api_register_func',['../include_2api_8php.html#ac2c2b18c426d697d11a830bca146be8a',1,'api.php']]],
+ ['api_5frss_5fextra',['api_rss_extra',['../include_2api_8php.html#a6a04b48168ba1d9dd2de3081a630611f',1,'api.php']]],
+ ['api_5fstatus_5fshow',['api_status_show',['../include_2api_8php.html#a645397787618b5c548a31e8686e8cca4',1,'api.php']]],
+ ['api_5fstatuses_5fdestroy',['api_statuses_destroy',['../include_2api_8php.html#ad4c29f43418f6110f85a6b3998239ab4',1,'api.php']]],
+ ['api_5fstatuses_5ff',['api_statuses_f',['../include_2api_8php.html#aa0d6b29fff0344a8e67f3507a6d01410',1,'api.php']]],
+ ['api_5fstatuses_5ffollowers',['api_statuses_followers',['../include_2api_8php.html#a6951c690d87775eb37e569c66011988e',1,'api.php']]],
+ ['api_5fstatuses_5ffriends',['api_statuses_friends',['../include_2api_8php.html#ade742525b2e41c82b090799ef3c51d5e',1,'api.php']]],
+ ['api_5fstatuses_5fhome_5ftimeline',['api_statuses_home_timeline',['../include_2api_8php.html#a528d8070ee74ea800102936ce73cf366',1,'api.php']]],
+ ['api_5fstatuses_5fmediap',['api_statuses_mediap',['../include_2api_8php.html#a450d8732b7b608f7ac929aee61572b95',1,'api.php']]],
+ ['api_5fstatuses_5fmentions',['api_statuses_mentions',['../include_2api_8php.html#a8b25a186bd0893f51aa72a62f655735e',1,'api.php']]],
+ ['api_5fstatuses_5fpublic_5ftimeline',['api_statuses_public_timeline',['../include_2api_8php.html#ad24ce1bf20867add4c9211a8eaf93f22',1,'api.php']]],
+ ['api_5fstatuses_5frepeat',['api_statuses_repeat',['../include_2api_8php.html#ae0fa388479cace9c5a7a45b571ab42f8',1,'api.php']]],
+ ['api_5fstatuses_5fshow',['api_statuses_show',['../include_2api_8php.html#af6f1d89cdb0a0621025efbec1597bc63',1,'api.php']]],
+ ['api_5fstatuses_5fupdate',['api_statuses_update',['../include_2api_8php.html#ad4d1634df6b35126552324683caaffa2',1,'api.php']]],
+ ['api_5fstatuses_5fuser_5ftimeline',['api_statuses_user_timeline',['../include_2api_8php.html#a32f0dda848d0c11c727fe1c3e741c283',1,'api.php']]],
+ ['api_5fstatusnet_5fconfig',['api_statusnet_config',['../include_2api_8php.html#a623793229a7256dd31bcfd5ab90eef08',1,'api.php']]],
+ ['api_5fstatusnet_5fversion',['api_statusnet_version',['../include_2api_8php.html#a8969e8d9c683f12ba17dcd4b059e020d',1,'api.php']]],
+ ['api_5fuser',['api_user',['../include_2api_8php.html#afb99daa6b731bf497b81f2128084852c',1,'api.php']]],
+ ['api_5fusers_5fshow',['api_users_show',['../include_2api_8php.html#abe8e929e93f7ab134b1cb1fb30f19a76',1,'api.php']]],
+ ['app',['App',['../classApp.html',1,'']]],
+ ['appdirpath',['appdirpath',['../boot_8php.html#a75a90b0eadd0df510f7e63210733634d',1,'boot.php']]],
+ ['apps_2ephp',['apps.php',['../apps_8php.html',1,'']]],
+ ['apps_5fcontent',['apps_content',['../apps_8php.html#a546016cb960d0b110ee8e489dfa6c27c',1,'apps.php']]],
+ ['apw_5fform',['apw_form',['../view_2theme_2apw_2php_2config_8php.html#a8b51951a70e1c1324be71345a61d70ec',1,'config.php']]],
+ ['apw_5finit',['apw_init',['../apw_2php_2theme_8php.html#a42167c539043a39a6b83c252d05f1e89',1,'theme.php']]],
+ ['argc',['argc',['../boot_8php.html#abc0a90a1a77f5b668aa7e4b57d1776a7',1,'boot.php']]],
+ ['argv',['argv',['../boot_8php.html#a768f00b7d66be0daf7ef4eea2e862006',1,'boot.php']]],
+ ['arr_5fadd_5fhashes',['arr_add_hashes',['../parse__url_8php.html#aa7dd8f961bea042d62726ed909e4a868',1,'parse_url.php']]],
+ ['array_5fsanitise',['array_sanitise',['../items_8php.html#abf7a1b73eb352d79acd36309b0dababd',1,'items.php']]],
+ ['array_5fxmlify',['array_xmlify',['../text_8php.html#acedb584f65114a33f389efb796172a91',1,'text.php']]],
+ ['atom_5fauthor',['atom_author',['../items_8php.html#a016dd86c827d08db89061ea81d15c6cb',1,'items.php']]],
+ ['atom_5fentry',['atom_entry',['../items_8php.html#a275108c050f7eb18bcbb5018e6b81cf6',1,'items.php']]],
+ ['atom_5ftime',['ATOM_TIME',['../boot_8php.html#ad34c1547020a305915bcc39707744690',1,'boot.php']]],
+ ['attach_2ephp',['attach.php',['../mod_2attach_8php.html',1,'']]],
+ ['attach_2ephp',['attach.php',['../include_2attach_8php.html',1,'']]],
+ ['attach_5fby_5fhash',['attach_by_hash',['../include_2attach_8php.html#a0d07c5b83d3d54e186f752e571847b36',1,'attach.php']]],
+ ['attach_5fby_5fhash_5fnodata',['attach_by_hash_nodata',['../include_2attach_8php.html#ad991208ce939387e2f93a3bce7d09932',1,'attach.php']]],
+ ['attach_5fchange_5fpermissions',['attach_change_permissions',['../include_2attach_8php.html#a5c0875eafb8c0f8a0620ff7a875a2221',1,'attach.php']]],
+ ['attach_5fcount_5ffiles',['attach_count_files',['../include_2attach_8php.html#a887d2d44a3ef18dcb6624e7fb58dc8e3',1,'attach.php']]],
+ ['attach_5fdelete',['attach_delete',['../include_2attach_8php.html#a70bd666e080c2af5a91f5d14c297b8cd',1,'attach.php']]],
+ ['attach_5fflag_5fdir',['ATTACH_FLAG_DIR',['../boot_8php.html#aa74438cf71e48e37bf7b440b94243985',1,'boot.php']]],
+ ['attach_5fflag_5fos',['ATTACH_FLAG_OS',['../boot_8php.html#a781916f83fcc8ff1035649afa45f0292',1,'boot.php']]],
+ ['attach_5finit',['attach_init',['../mod_2attach_8php.html#aa88eb5ad87aa1036a30e70339cc6c1b1',1,'attach.php']]],
+ ['attach_5flist_5ffiles',['attach_list_files',['../include_2attach_8php.html#a3634af95f11a023dd8e882c3c7a3600d',1,'attach.php']]],
+ ['attach_5fmkdir',['attach_mkdir',['../include_2attach_8php.html#ab6830b3ab74a5d284876141ac80f6cbc',1,'attach.php']]],
+ ['attach_5fstore',['attach_store',['../include_2attach_8php.html#a84a8a64c4805e1525b42d4add464833f',1,'attach.php']]],
+ ['attribute_5fcontains',['attribute_contains',['../text_8php.html#a95fd2f8f23a1948414a03ebc963bac57',1,'text.php']]],
+ ['auth_2ephp',['auth.php',['../auth_8php.html',1,'']]],
+ ['authenticate_5fsuccess',['authenticate_success',['../security_8php.html#adc7bf51e3b8d67bd80e9348f9ab03733',1,'security.php']]],
+ ['autoname',['autoname',['../text_8php.html#a27cd2c1b3bcb49a0cfb7249e851725ca',1,'text.php']]],
+ ['avatar_5fimg',['avatar_img',['../include_2network_8php.html#ab07ce9d75eae559865ed90aad2154bd7',1,'network.php']]],
+ ['apw',['apw',['../md_README.html',1,'']]]
+];
diff --git a/doc/html/search/all_62.html b/doc/html/search/all_62.html
new file mode 100644
index 000000000..f25fa2c88
--- /dev/null
+++ b/doc/html/search/all_62.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_62.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/all_62.js b/doc/html/search/all_62.js
new file mode 100644
index 000000000..2983a3a0b
--- /dev/null
+++ b/doc/html/search/all_62.js
@@ -0,0 +1,35 @@
+var searchData=
+[
+ ['base64url_5fdecode',['base64url_decode',['../text_8php.html#a13286f8a95d2de6b102966ecc270c8d6',1,'text.php']]],
+ ['base64url_5fencode',['base64url_encode',['../text_8php.html#a070384ec000fd65043fce11d5392d241',1,'text.php']]],
+ ['baseobject',['BaseObject',['../classBaseObject.html',1,'']]],
+ ['baseobject_2ephp',['BaseObject.php',['../BaseObject_8php.html',1,'']]],
+ ['bb2diaspora',['bb2diaspora',['../bb2diaspora_8php.html#a4f10e0876b27373c762bc1abbe745f5c',1,'bb2diaspora.php']]],
+ ['bb2diaspora_2ephp',['bb2diaspora.php',['../bb2diaspora_8php.html',1,'']]],
+ ['bb_5fparse_5fcrypt',['bb_parse_crypt',['../bbcode_8php.html#a851f5aafefe52474201b83f9fd65931f',1,'bbcode.php']]],
+ ['bb_5fqr',['bb_qr',['../bbcode_8php.html#a98d0eecc620c19561639f06cfbe8e74c',1,'bbcode.php']]],
+ ['bb_5fshareattributes',['bb_ShareAttributes',['../bbcode_8php.html#a1c69e021d5e0aef97d6966bf3169c86a',1,'bbcode.php']]],
+ ['bb_5fshareattributessimple',['bb_ShareAttributesSimple',['../bbcode_8php.html#a2be26414a367118143cc89e2d58e7377',1,'bbcode.php']]],
+ ['bb_5fspacefy',['bb_spacefy',['../bbcode_8php.html#a8911e027907820df3db03b4f76724b50',1,'bbcode.php']]],
+ ['bb_5ftag_5fpreg_5freplace',['bb_tag_preg_replace',['../bb2diaspora_8php.html#ad0abe1a7ee50aa0736a233df0a422eba',1,'bb2diaspora.php']]],
+ ['bb_5ftranslate_5fvideo',['bb_translate_video',['../text_8php.html#a3d2793d66db3345fd290b71e2eadf98e',1,'text.php']]],
+ ['bb_5funspacefy_5fand_5ftrim',['bb_unspacefy_and_trim',['../bbcode_8php.html#a064dcfd9767df6f53be1a0e11ceeb15d',1,'bbcode.php']]],
+ ['bbcode',['bbcode',['../bbcode_8php.html#a009f61aaf78771737ed0765c8463911b',1,'bbcode.php']]],
+ ['bbcode_2ephp',['bbcode.php',['../bbcode_8php.html',1,'']]],
+ ['bbtoevent',['bbtoevent',['../event_8php.html#a180cccd63c2a2f00ff432b03113531f3',1,'event.php']]],
+ ['bbtovcal',['bbtovcal',['../event_8php.html#a184d6b9690e5b6dee35a0aa9edd47279',1,'event.php']]],
+ ['best_5flink_5furl',['best_link_url',['../conversation_8php.html#ad470fc7766f0db66d138fa1916c7a8b7',1,'conversation.php']]],
+ ['blocks_2ephp',['blocks.php',['../blocks_8php.html',1,'']]],
+ ['blocks_5fcontent',['blocks_content',['../blocks_8php.html#a2531a8fd51db3cecb2eb20c002c66e12',1,'blocks.php']]],
+ ['blog_5finit',['blog_init',['../blogga_2php_2theme_8php.html#aa55c1cb1f05087b5002ecb633b550b1b',1,'blog_init(&amp;$a):&#160;theme.php'],['../blogga_2view_2theme_2blog_2theme_8php.html#aa55c1cb1f05087b5002ecb633b550b1b',1,'blog_init(&amp;$a):&#160;theme.php']]],
+ ['blog_5finstall',['blog_install',['../blogga_2view_2theme_2blog_2theme_8php.html#aae58cc837fe56473d9f3370abfe533ae',1,'theme.php']]],
+ ['blog_5funinstall',['blog_uninstall',['../blogga_2view_2theme_2blog_2theme_8php.html#a3e77dbe111f330c64a1ff6c741cd515c',1,'theme.php']]],
+ ['blogtheme_5fdisplay_5fitem',['blogtheme_display_item',['../blogga_2view_2theme_2blog_2theme_8php.html#a028ae8e9f2824670dfa76a6651d817e5',1,'theme.php']]],
+ ['blogtheme_5fform',['blogtheme_form',['../view_2theme_2blogga_2php_2config_8php.html#a8a311a402d3e746ce53fadc38e4b2d27',1,'blogtheme_form(&amp;$a, $headimg, $headimghome):&#160;config.php'],['../view_2theme_2blogga_2view_2theme_2blog_2config_8php.html#a8a311a402d3e746ce53fadc38e4b2d27',1,'blogtheme_form(&amp;$a, $headimg, $headimghome):&#160;config.php']]],
+ ['blogtheme_5fimgurl',['blogtheme_imgurl',['../blogga_2view_2theme_2blog_2theme_8php.html#af634a3f721c5e238530d0636d33230ec',1,'theme.php']]],
+ ['boot_2ephp',['boot.php',['../boot_8php.html',1,'']]],
+ ['breaklines',['breaklines',['../html2plain_8php.html#a3214912e3d00cf0a948072daccf16740',1,'html2plain.php']]],
+ ['build_5fpagehead',['build_pagehead',['../classApp.html#a08f0537964d98958d218066364cff785',1,'App']]],
+ ['build_5fquerystring',['build_querystring',['../boot_8php.html#a9cbab4ee728e9a8b4ce952bae643044e',1,'boot.php']]],
+ ['build_5fsync_5fpacket',['build_sync_packet',['../zot_8php.html#ac34e479d27f32b82dd6b33542f81a6a7',1,'zot.php']]]
+];
diff --git a/doc/html/search/all_63.html b/doc/html/search/all_63.html
new file mode 100644
index 000000000..e7f34db58
--- /dev/null
+++ b/doc/html/search/all_63.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_63.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/all_63.js b/doc/html/search/all_63.js
new file mode 100644
index 000000000..85352b434
--- /dev/null
+++ b/doc/html/search/all_63.js
@@ -0,0 +1,150 @@
+var searchData=
+[
+ ['cache',['Cache',['../classCache.html',1,'']]],
+ ['cache_2ephp',['cache.php',['../cache_8php.html',1,'']]],
+ ['cal',['cal',['../datetime_8php.html#aea356409ba69f9de412298c998595dd2',1,'datetime.php']]],
+ ['call_5fhooks',['call_hooks',['../plugin_8php.html#a7f05de16c0a32602853b09b99dd85e7c',1,'plugin.php']]],
+ ['can_5fcomment_5fon_5fpost',['can_comment_on_post',['../items_8php.html#a1e75047cf175aaee8dd16aa761913ff9',1,'items.php']]],
+ ['categories_5fwidget',['categories_widget',['../contact__widgets_8php.html#a165eb021e61c4dcab2a552f28628d353',1,'contact_widgets.php']]],
+ ['change_5fchannel',['change_channel',['../security_8php.html#a8d23d2597aae380a3341872fe9513380',1,'security.php']]],
+ ['change_5fpermissions',['change_permissions',['../classProtoDriver.html#a34b97ca5ef2165f2e16eb2fe59ff6c67',1,'ProtoDriver\change_permissions()'],['../classZotDriver.html#a6776935156accb0f170e2e24577133db',1,'ZotDriver\change_permissions()']]],
+ ['chanlink_5fcid',['chanlink_cid',['../text_8php.html#a85e3a4851c16674834010d8419a5d7ca',1,'text.php']]],
+ ['chanlink_5fhash',['chanlink_hash',['../text_8php.html#a55ab893be57feda59c2a7ba1e58ff2d0',1,'text.php']]],
+ ['chanlink_5furl',['chanlink_url',['../text_8php.html#a2e8d6c402603be3a1256a16605e09c2a',1,'text.php']]],
+ ['chanman_2ephp',['chanman.php',['../include_2chanman_8php.html',1,'']]],
+ ['chanman_2ephp',['chanman.php',['../mod_2chanman_8php.html',1,'']]],
+ ['chanman_5fremove_5feverything_5ffrom_5fnetwork',['chanman_remove_everything_from_network',['../include_2chanman_8php.html#a21ba9a5c961e866ff27aee3ee67bf99b',1,'chanman.php']]],
+ ['channel_2ephp',['channel.php',['../channel_8php.html',1,'']]],
+ ['channel_5fcontent',['channel_content',['../channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1',1,'channel.php']]],
+ ['channel_5finit',['channel_init',['../channel_8php.html#ac7c8c7845741baadf87fae6bc279f3dc',1,'channel.php']]],
+ ['channel_5fremove',['channel_remove',['../Contact_8php.html#a186162051a5127069cc851d78740f205',1,'Contact.php']]],
+ ['channel_5ftotal',['channel_total',['../identity_8php.html#a77d2237f1846964634b1c99089c27c7d',1,'identity.php']]],
+ ['channelx_5fby_5fhash',['channelx_by_hash',['../Contact_8php.html#a483cda56f9e37c3a4a8773dcdfeb0258',1,'Contact.php']]],
+ ['channelx_5fby_5fn',['channelx_by_n',['../Contact_8php.html#a3a0844dac1e86d523de5d2f432cfeebc',1,'Contact.php']]],
+ ['channelx_5fby_5fnick',['channelx_by_nick',['../Contact_8php.html#a87e699f74a1102b25e8aa0432d86a91e',1,'Contact.php']]],
+ ['chanview_2ephp',['chanview.php',['../chanview_8php.html',1,'']]],
+ ['chanview_5fcontent',['chanview_content',['../chanview_8php.html#a4192c6da888c8c1165851acf9ad4cb8b',1,'chanview.php']]],
+ ['check_5faccount_5fadmin',['check_account_admin',['../account_8php.html#a917d74aad0baf3e0c4b51cf1051e654f',1,'account.php']]],
+ ['check_5faccount_5femail',['check_account_email',['../account_8php.html#ae052bd5558847bd38e89c213561a9771',1,'account.php']]],
+ ['check_5faccount_5finvite',['check_account_invite',['../account_8php.html#aaff7720423417a4333697894ffd9ddeb',1,'account.php']]],
+ ['check_5faccount_5fpassword',['check_account_password',['../account_8php.html#a144b4891022567668375b58ea61cfff0',1,'account.php']]],
+ ['check_5fadd',['check_add',['../setup_8php.html#ae8e4d9279a61de74d5f39962cb7b6ca1',1,'setup.php']]],
+ ['check_5fconfig',['check_config',['../boot_8php.html#a4c02d88e66852a01bd5a1feecb7c3ce3',1,'boot.php']]],
+ ['check_5fform_5fsecurity_5fstd_5ferr_5fmsg',['check_form_security_std_err_msg',['../security_8php.html#a20f8b9851f23ee8894b8925584ef6821',1,'security.php']]],
+ ['check_5fform_5fsecurity_5ftoken',['check_form_security_token',['../security_8php.html#a9c6180e82150a5a9af91a1255d096b5c',1,'security.php']]],
+ ['check_5fform_5fsecurity_5ftoken_5fforbiddenonerr',['check_form_security_token_ForbiddenOnErr',['../security_8php.html#a444ac867dfa8c37cf0a7a226412bee28',1,'security.php']]],
+ ['check_5fform_5fsecurity_5ftoken_5fredirectonerr',['check_form_security_token_redirectOnErr',['../security_8php.html#a77ba0d1889a39cf32434c5ce96fe1433',1,'security.php']]],
+ ['check_5ffuncs',['check_funcs',['../setup_8php.html#a69a450e06dd3771fb51d3e4b0266a35e',1,'setup.php']]],
+ ['check_5fhtaccess',['check_htaccess',['../setup_8php.html#a0c3f3b671381f6dccd924b8ecdfc56c4',1,'setup.php']]],
+ ['check_5fhtconfig',['check_htconfig',['../setup_8php.html#a5ad92c0857d1dadd6b60a9a557159c9f',1,'setup.php']]],
+ ['check_5fitem_5fsource',['check_item_source',['../items_8php.html#a87ac9e359591721a824ecd23bbb56296',1,'items.php']]],
+ ['check_5fkeys',['check_keys',['../setup_8php.html#aa3bbb111780da70ba35cc23a306f2c76',1,'setup.php']]],
+ ['check_5flist_5fpermissions',['check_list_permissions',['../permissions_8php.html#a0f5bd9f7f4c8fb7ba4b2c1ed048b4dc7',1,'permissions.php']]],
+ ['check_5fphp',['check_php',['../setup_8php.html#a14d208682a88632290c895d20da6e7d6',1,'setup.php']]],
+ ['check_5fsmarty3',['check_smarty3',['../setup_8php.html#afd8b0b3ade1507c45325caf377bf459d',1,'setup.php']]],
+ ['check_5fstore',['check_store',['../setup_8php.html#ab4b71369a25021d59247c917e98d8246',1,'setup.php']]],
+ ['check_5fwall_5fto_5fwall',['check_wall_to_wall',['../classItem.html#abcdb0ea9bcd1576bc99bba9b8f700bb8',1,'Item']]],
+ ['check_5fwebbie',['check_webbie',['../text_8php.html#a0c65597bb4aed3a039eb795ff540e5e3',1,'text.php']]],
+ ['childexists',['childExists',['../classRedDirectory.html#a5e3fc08b2bf9f61cea4d2ccae0495bec',1,'RedDirectory']]],
+ ['clean_5furls',['clean_urls',['../boot_8php.html#ab79b8b4555cae20d03f8200666d89d63',1,'boot.php']]],
+ ['clear',['clear',['../classCache.html#ab14d0f4bdf7116a94d545c574b38f568',1,'Cache']]],
+ ['cleardiv',['cleardiv',['../text_8php.html#afe18627c4983ee5f7c940a0992818cd5',1,'text.php']]],
+ ['cli_5fstartup',['cli_startup',['../cli__startup_8php.html#adfdde63686e33ccd4851fa5edc4fc70b',1,'cli_startup.php']]],
+ ['cli_5fstartup_2ephp',['cli_startup.php',['../cli__startup_8php.html',1,'']]],
+ ['cli_5fsuggest_2ephp',['cli_suggest.php',['../cli__suggest_8php.html',1,'']]],
+ ['cli_5fsuggest_5frun',['cli_suggest_run',['../cli__suggest_8php.html#a8f3a60fc96f4bec7d3837c4efc7725f2',1,'cli_suggest.php']]],
+ ['client_5fmode_5fload',['CLIENT_MODE_LOAD',['../boot_8php.html#af6f6f6f40139f12fc09ec47373b30919',1,'boot.php']]],
+ ['client_5fmode_5fnormal',['CLIENT_MODE_NORMAL',['../boot_8php.html#a43c6c7d84d880e9500bd4f8f8ecc5731',1,'boot.php']]],
+ ['client_5fmode_5fupdate',['CLIENT_MODE_UPDATE',['../boot_8php.html#a3f40aa5bafff8c4eebdc62e5121daf77',1,'boot.php']]],
+ ['close',['close',['../classdba__driver.html#a5afa54172f3c837df61643f8f5b2c975',1,'dba_driver\close()'],['../classdba__mysql.html#a850586714ef897bd25f643c89b4ef76e',1,'dba_mysql\close()'],['../classdba__mysqli.html#acb38f2c851187ad632ecfab30fdfab55',1,'dba_mysqli\close()']]],
+ ['cloud_2ephp',['cloud.php',['../cloud_8php.html',1,'']]],
+ ['cloud_5finit',['cloud_init',['../cloud_8php.html#a1b79a6fe0454bc76673ad9aef55bf02d',1,'cloud.php']]],
+ ['collect',['collect',['../classProtoDriver.html#a2ba1758f0f9e3564580b6ff85292804d',1,'ProtoDriver\collect()'],['../classZotDriver.html#af65febb26031eb7f39871b9e2a539797',1,'ZotDriver\collect()']]],
+ ['collect_5fprivate',['collect_private',['../classProtoDriver.html#af66171aa7dab9b62cee915cb4f1abe1b',1,'ProtoDriver\collect_private()'],['../classZotDriver.html#a2e15ff09772f0608203dad1c98299394',1,'ZotDriver\collect_private()']]],
+ ['collect_5frecipients',['collect_recipients',['../items_8php.html#a01e3cf44e082fa9bd06dcde5bf713d70',1,'items.php']]],
+ ['collecturls',['collecturls',['../html2plain_8php.html#ae1c203d0f089d5678d73a6c64a395201',1,'html2plain.php']]],
+ ['comanche_2ephp',['comanche.php',['../comanche_8php.html',1,'']]],
+ ['comanche_5fblock',['comanche_block',['../comanche_8php.html#a5a7ab801717d38e91ac910b933973887',1,'comanche.php']]],
+ ['comanche_5fmenu',['comanche_menu',['../comanche_8php.html#a1fe339e1454803aa502ac89379c17f5b',1,'comanche.php']]],
+ ['comanche_5fparser',['comanche_parser',['../comanche_8php.html#a1a208fdb40dd83d6298caec4290ee922',1,'comanche.php']]],
+ ['comanche_5fregion',['comanche_region',['../comanche_8php.html#a5718daeda40bf835345fe061e8808cdf',1,'comanche.php']]],
+ ['comanche_5freplace_5fregion',['comanche_replace_region',['../comanche_8php.html#a028f004d5b8c23d6367816d899e17cfe',1,'comanche.php']]],
+ ['comanche_5fwebpage',['comanche_webpage',['../comanche_8php.html#ae9fe1ce574db3dd0931eada80234f82a',1,'comanche.php']]],
+ ['comanche_5fwidget',['comanche_widget',['../comanche_8php.html#a6b0191c1a63db1696a2eb139d90d9e7f',1,'comanche.php']]],
+ ['common_2ephp',['common.php',['../common_8php.html',1,'']]],
+ ['common_5fcontent',['common_content',['../common_8php.html#ab63408f39abef7a6915186e8dabc5a96',1,'common.php']]],
+ ['common_5ffriends',['common_friends',['../socgraph_8php.html#a7d34cd58025bcd9e575282f44db75918',1,'socgraph.php']]],
+ ['common_5ffriends_5fvisitor_5fwidget',['common_friends_visitor_widget',['../contact__widgets_8php.html#a552f8544528cec0c995cea7287ea9d65',1,'contact_widgets.php']]],
+ ['common_5ffriends_5fzcid',['common_friends_zcid',['../socgraph_8php.html#ac343a846241d36cdf046b08f3396cfe9',1,'socgraph.php']]],
+ ['common_5finit',['common_init',['../common_8php.html#aca62f113655809f41f49042ce9b123c2',1,'common.php']]],
+ ['community_2ephp',['community.php',['../community_8php.html',1,'']]],
+ ['community_5fcontent',['community_content',['../community_8php.html#a1197aafd6a6b540dbb4a0c04ade3a25a',1,'community.php']]],
+ ['community_5finit',['community_init',['../community_8php.html#a56c94ec978a38633c5628fa6f8e386d9',1,'community.php']]],
+ ['compare_5fpermissions',['compare_permissions',['../items_8php.html#a0790a4550b829e85504af548623002ca',1,'items.php']]],
+ ['completeurl',['completeurl',['../parse__url_8php.html#a496f4e3836154f6f32b8e805a7160d3a',1,'parse_url.php']]],
+ ['config_2emd',['config.md',['../config_8md.html',1,'']]],
+ ['config_2ephp',['config.php',['../view_2theme_2apw_2php_2config_8php.html',1,'']]],
+ ['config_2ephp',['config.php',['../view_2theme_2blogga_2php_2config_8php.html',1,'']]],
+ ['config_2ephp',['config.php',['../view_2theme_2blogga_2view_2theme_2blog_2config_8php.html',1,'']]],
+ ['config_2ephp',['config.php',['../view_2theme_2redbasic_2php_2config_8php.html',1,'']]],
+ ['config_2ephp',['config.php',['../include_2config_8php.html',1,'']]],
+ ['connect',['connect',['../classdba__driver.html#ae533e62a240a793f17aef5ab4ef10edc',1,'dba_driver\connect()'],['../classdba__mysql.html#a1887338627ce0e28786839363014bd0b',1,'dba_mysql\connect()'],['../classdba__mysqli.html#add062bd93961e5f0194d94820e9a51b1',1,'dba_mysqli\connect()']]],
+ ['connect_2ephp',['connect.php',['../connect_8php.html',1,'']]],
+ ['connect_5fcontent',['connect_content',['../connect_8php.html#a489f0a66c660de6ec4d6917b27674f07',1,'connect.php']]],
+ ['connect_5finit',['connect_init',['../connect_8php.html#ad46a38f32fd7a3d324b1fa26373efa36',1,'connect.php']]],
+ ['connect_5fpost',['connect_post',['../connect_8php.html#a417ec27afe33f21a929667a665e32ee2',1,'connect.php']]],
+ ['connections_2ephp',['connections.php',['../connections_8php.html',1,'']]],
+ ['connections_5fclone',['connections_clone',['../connections_8php.html#a15af118efee9c948b6f8294e54a73bb2',1,'connections.php']]],
+ ['connections_5fcontent',['connections_content',['../connections_8php.html#aec2e457420fce3e3bf6a9f48e36df25c',1,'connections.php']]],
+ ['connections_5finit',['connections_init',['../connections_8php.html#a1f23623f802af7bd35e95b0e94e5d558',1,'connections.php']]],
+ ['connections_5fpost',['connections_post',['../connections_8php.html#a1224058db8e3fb56463eb312f98e561d',1,'connections.php']]],
+ ['connedit_2ephp',['connedit.php',['../connedit_8php.html',1,'']]],
+ ['connedit_5fclone',['connedit_clone',['../connedit_8php.html#a707ea7e63cf9674025b1d6b081ae74f5',1,'connedit.php']]],
+ ['connedit_5fcontent',['connedit_content',['../connedit_8php.html#a795acb3d9d841f55c255d7611681ab67',1,'connedit.php']]],
+ ['connedit_5finit',['connedit_init',['../connedit_8php.html#a4da871e075597a09a8b374b9171dd92e',1,'connedit.php']]],
+ ['connedit_5fpost',['connedit_post',['../connedit_8php.html#a234c48426b652bf4d37053f2af329ac5',1,'connedit.php']]],
+ ['construct_5factivity_5fobject',['construct_activity_object',['../items_8php.html#aa9e99613d38a97b39c8cf5449699c2ee',1,'items.php']]],
+ ['construct_5factivity_5ftarget',['construct_activity_target',['../items_8php.html#aa579bc4445d60098b1410961ca8e96b7',1,'items.php']]],
+ ['construct_5fpage',['construct_page',['../boot_8php.html#acc4e0c910af066148b810e5fde55fff1',1,'boot.php']]],
+ ['construct_5fverb',['construct_verb',['../items_8php.html#a8f3c85c584ccd2b98c3ca440e45b40f8',1,'items.php']]],
+ ['consume_5ffeed',['consume_feed',['../items_8php.html#a8794863cdf8ce1333040933d3a3f66bd',1,'items.php']]],
+ ['contact_2ephp',['Contact.php',['../Contact_8php.html',1,'']]],
+ ['contact_5fblock',['contact_block',['../text_8php.html#ad6432621d0fafcbcf3d3b9b49bef7784',1,'text.php']]],
+ ['contact_5fis_5ffollower',['CONTACT_IS_FOLLOWER',['../boot_8php.html#ada72d88ae39a7e3b45baea201cb49a29',1,'boot.php']]],
+ ['contact_5fis_5ffriend',['CONTACT_IS_FRIEND',['../boot_8php.html#a27299ecfb9e9a99826f17a1c14c6995f',1,'boot.php']]],
+ ['contact_5fis_5fsharing',['CONTACT_IS_SHARING',['../boot_8php.html#a6c5e9e293c8242dcb9bc2c3ea2fee2c9',1,'boot.php']]],
+ ['contact_5fpoll_5finterval',['contact_poll_interval',['../contact__selectors_8php.html#a9839e8fdaac7ffb37bf1420493f5c28f',1,'contact_selectors.php']]],
+ ['contact_5fprofile_5fassign',['contact_profile_assign',['../contact__selectors_8php.html#a2c743d2eb526eb758d943a1490162d75',1,'contact_selectors.php']]],
+ ['contact_5fremove',['contact_remove',['../Contact_8php.html#a28e062c884331dbb5dfa713228c25ad6',1,'Contact.php']]],
+ ['contact_5freputation',['contact_reputation',['../contact__selectors_8php.html#ae499960d6467bd30c78607b1018baf53',1,'contact_selectors.php']]],
+ ['contact_5fselect',['contact_select',['../acl__selectors_8php.html#a9476997d2968a5794f3723878ed89c91',1,'acl_selectors.php']]],
+ ['contact_5fselectors_2ephp',['contact_selectors.php',['../contact__selectors_8php.html',1,'']]],
+ ['contact_5fwidgets_2ephp',['contact_widgets.php',['../contact__widgets_8php.html',1,'']]],
+ ['contactgroup_2ephp',['contactgroup.php',['../contactgroup_8php.html',1,'']]],
+ ['contactgroup_5fcontent',['contactgroup_content',['../contactgroup_8php.html#a18c7391b1b25debaf98c9dba639caab3',1,'contactgroup.php']]],
+ ['conv_5fsort',['conv_sort',['../conversation_8php.html#abed85a41f1160598de880b84021c9cf7',1,'conversation.php']]],
+ ['conversation',['Conversation',['../classConversation.html',1,'Conversation'],['../conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81',1,'conversation(&amp;$a, $items, $mode, $update, $page_mode= &apos;traditional&apos;, $prepared_item= &apos;&apos;):&#160;conversation.php']]],
+ ['conversation_2ephp',['conversation.php',['../conversation_8php.html',1,'']]],
+ ['conversationobject_2ephp',['ConversationObject.php',['../ConversationObject_8php.html',1,'']]],
+ ['convert',['convert',['../namespacefriendica-to-smarty-tpl.html#a38503e37fe68ac27c88cce91a9ac9efa',1,'friendica-to-smarty-tpl']]],
+ ['convert_5fxml_5felement_5fto_5farray',['convert_xml_element_to_array',['../include_2network_8php.html#ad4056d3ce69988f5c1a997a79f503246',1,'network.php']]],
+ ['count_5fall_5ffriends',['count_all_friends',['../socgraph_8php.html#af29d056beec10b4e38e5209c92452894',1,'socgraph.php']]],
+ ['count_5fcommon_5ffriends',['count_common_friends',['../socgraph_8php.html#a887d576f21fd708132a06d0f72f90f84',1,'socgraph.php']]],
+ ['count_5fcommon_5ffriends_5fzcid',['count_common_friends_zcid',['../socgraph_8php.html#af175807406d94407a5e11742a3287746',1,'socgraph.php']]],
+ ['count_5fdescendants',['count_descendants',['../classItem.html#aca1e66988ed00cd627b2a359b72cd0ae',1,'Item\count_descendants()'],['../conversation_8php.html#ab2383dff4f823e580399ff469d90ab19',1,'count_descendants():&#160;conversation.php']]],
+ ['create_5faccount',['create_account',['../account_8php.html#a141fe579c351c78209d425473f978eb5',1,'account.php']]],
+ ['create_5fidentity',['create_identity',['../identity_8php.html#a345f4c943d84de502ec6e72d2c813945',1,'identity.php']]],
+ ['create_5fsys_5fchannel',['create_sys_channel',['../identity_8php.html#a1cf83ac2b645de12868edaa3a5718f05',1,'identity.php']]],
+ ['createdirectory',['createDirectory',['../classRedDirectory.html#a986936910f0216887a25e28916c166c7',1,'RedDirectory']]],
+ ['createfile',['createFile',['../classRedDirectory.html#a2d12d99d38a6a75fc9a830b2f7fc0bf0',1,'RedDirectory']]],
+ ['cronhooks_2ephp',['cronhooks.php',['../cronhooks_8php.html',1,'']]],
+ ['cronhooks_5frun',['cronhooks_run',['../cronhooks_8php.html#a4c4c1bbec4ecc9a0efa00dd6afd2c0ca',1,'cronhooks.php']]],
+ ['cropimage',['cropImage',['../classphoto__driver.html#a2e6e61f1e356a90bc978f4404a77137e',1,'photo_driver\cropImage()'],['../classphoto__gd.html#ab2232d775c8bacf66773a03308105f0c',1,'photo_gd\cropImage()'],['../classphoto__imagick.html#a2f33a03a89497a2b2768e29736d4a8a4',1,'photo_imagick\cropImage()']]],
+ ['crypto_2ephp',['crypto.php',['../crypto_8php.html',1,'']]],
+ ['crypto_5fencapsulate',['crypto_encapsulate',['../crypto_8php.html#a32fc08d57a5694f94d8543ecbb03323c',1,'crypto.php']]],
+ ['crypto_5funencapsulate',['crypto_unencapsulate',['../crypto_8php.html#a0781202b0a43b82426929cc87c2fa2b5',1,'crypto.php']]],
+ ['curpageurl',['curPageURL',['../boot_8php.html#aa4221641e5c21db69fa52c426b9017f5',1,'boot.php']]],
+ ['current_5ftheme',['current_theme',['../boot_8php.html#ad206598b909e8eb67eb0e0bb5ef69c13',1,'boot.php']]],
+ ['current_5ftheme_5furl',['current_theme_url',['../boot_8php.html#a926cad0b3d8b9d9ee5da1898fc063ba3',1,'boot.php']]],
+ ['cli_20config_20utility',['CLI config utility',['../md_config.html',1,'']]]
+];
diff --git a/doc/html/search/all_64.html b/doc/html/search/all_64.html
new file mode 100644
index 000000000..360601fa7
--- /dev/null
+++ b/doc/html/search/all_64.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_64.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/all_64.js b/doc/html/search/all_64.js
new file mode 100644
index 000000000..61fbc8c2e
--- /dev/null
+++ b/doc/html/search/all_64.js
@@ -0,0 +1,82 @@
+var searchData=
+[
+ ['dark_2ephp',['dark.php',['../dark_8php.html',1,'']]],
+ ['darkness_2ephp',['darkness.php',['../darkness_8php.html',1,'']]],
+ ['darknessleftaside_2ephp',['darknessleftaside.php',['../darknessleftaside_8php.html',1,'']]],
+ ['darknessrightaside_2ephp',['darknessrightaside.php',['../darknessrightaside_8php.html',1,'']]],
+ ['datesel',['datesel',['../datetime_8php.html#ac265b86f384ee094ed5479aae02aa5c8',1,'datetime.php']]],
+ ['datesel_5fformat',['datesel_format',['../datetime_8php.html#a5f29553799005b1fd4e9ce9d98ce05aa',1,'datetime.php']]],
+ ['datetime_2ephp',['datetime.php',['../datetime_8php.html',1,'']]],
+ ['datetime_5fconvert',['datetime_convert',['../datetime_8php.html#ad6301e74b0f9267d52f8d432b5beb226',1,'datetime.php']]],
+ ['day_5ftranslate',['day_translate',['../text_8php.html#a63fb21c0bed2fc72eef2c1471ac42b63',1,'text.php']]],
+ ['db_5fupdate_2ephp',['db_update.php',['../db__update_8php.html',1,'']]],
+ ['db_5fupdate_5fversion',['DB_UPDATE_VERSION',['../boot_8php.html#ac59a18a4838710d6c2de37aed6b21f03',1,'boot.php']]],
+ ['dba_5fdriver',['dba_driver',['../classdba__driver.html',1,'']]],
+ ['dba_5fdriver_2ephp',['dba_driver.php',['../dba__driver_8php.html',1,'']]],
+ ['dba_5ffactory',['dba_factory',['../dba__driver_8php.html#ac10e60f6e5b95bcf67bd82cb88f37947',1,'dba_driver.php']]],
+ ['dba_5fmysql',['dba_mysql',['../classdba__mysql.html',1,'']]],
+ ['dba_5fmysql_2ephp',['dba_mysql.php',['../dba__mysql_8php.html',1,'']]],
+ ['dba_5fmysqli',['dba_mysqli',['../classdba__mysqli.html',1,'']]],
+ ['dba_5fmysqli_2ephp',['dba_mysqli.php',['../dba__mysqli_8php.html',1,'']]],
+ ['dba_5ftimer',['dba_timer',['../boot_8php.html#a3e0930933fb2c0bf8211cc7ab4e1c3b4',1,'boot.php']]],
+ ['dbesc',['dbesc',['../dba__driver_8php.html#ab222aa1dbf9ea93b320f82028739127e',1,'dba_driver.php']]],
+ ['dbesc_5farray',['dbesc_array',['../dba__driver_8php.html#a65b83462bd26968106aebd43f16540e4',1,'dba_driver.php']]],
+ ['dbesc_5farray_5fcb',['dbesc_array_cb',['../dba__driver_8php.html#af531546fac5f0836a8557a4f6dfee930',1,'dba_driver.php']]],
+ ['dbg',['dbg',['../classdba__driver.html#adcc1f8955120fec0708bce39202d0422',1,'dba_driver\dbg()'],['../dba__driver_8php.html#aa6607893d8f60ade9122bcfbd1a53ffb',1,'dbg():&#160;dba_driver.php']]],
+ ['dbq',['dbq',['../dba__driver_8php.html#aa377074e70981e8c4e82ca0accd068ee',1,'dba_driver.php']]],
+ ['decode_5ftags',['decode_tags',['../items_8php.html#a56b2a4abcadfac71175cd50555528cc3',1,'items.php']]],
+ ['default_2ephp',['default.php',['../php_2default_8php.html',1,'']]],
+ ['default_2ephp',['default.php',['../theme_2blogga_2php_2default_8php.html',1,'']]],
+ ['default_2ephp',['default.php',['../theme_2blogga_2view_2theme_2blog_2default_8php.html',1,'']]],
+ ['default_5fdb_5fengine',['DEFAULT_DB_ENGINE',['../boot_8php.html#aa8a2b61e70900139d1ca28e46f1da49d',1,'boot.php']]],
+ ['del_5fconfig',['del_config',['../include_2config_8php.html#a549910227348003efc3c05c9105c42da',1,'config.php']]],
+ ['del_5fpconfig',['del_pconfig',['../include_2config_8php.html#a7ad2081c5f812ac4387fd76f3762d941',1,'config.php']]],
+ ['del_5fxconfig',['del_xconfig',['../include_2config_8php.html#a9c171def547deee16738dc58fdeb4b72',1,'config.php']]],
+ ['delegate_2ephp',['delegate.php',['../delegate_8php.html',1,'']]],
+ ['delegate_5fcontent',['delegate_content',['../delegate_8php.html#a943eea8996ef348eb845c498f9f354dd',1,'delegate.php']]],
+ ['delete',['delete',['../classRedFile.html#aef71c9eaac7052be7dc8602eb12171e7',1,'RedFile']]],
+ ['delete_5fimported_5fitem',['delete_imported_item',['../zot_8php.html#adfeb9400ae6b726beec89f8f1e8fde72',1,'zot.php']]],
+ ['delete_5fitem_5flowlevel',['delete_item_lowlevel',['../items_8php.html#a2b56a4c01bd22a648d52ec9af1a04259',1,'items.php']]],
+ ['deletenode',['deletenode',['../html2bbcode_8php.html#a71a07f135d196ec5943b13f7b2e6a9b2',1,'html2bbcode.php']]],
+ ['deliver',['deliver',['../classProtoDriver.html#a85e9063f6d0c304410cd246f7900ea1b',1,'ProtoDriver\deliver()'],['../classZotDriver.html#a876e3e0e4cad83c0b58c8696b344be6f',1,'ZotDriver\deliver()']]],
+ ['deliver_2ephp',['deliver.php',['../deliver_8php.html',1,'']]],
+ ['deliver_5fprivate',['deliver_private',['../classProtoDriver.html#ae5b44739f84c10d00a9b65adf3785181',1,'ProtoDriver\deliver_private()'],['../classZotDriver.html#afaaf9941169fc966e43e25b25e6daea6',1,'ZotDriver\deliver_private()']]],
+ ['deliver_5frun',['deliver_run',['../deliver_8php.html#a397afcb9afecf0c1816b0951189dd346',1,'deliver.php']]],
+ ['design_5ftools',['design_tools',['../text_8php.html#a87a3cefc603302c78982f1d8e1245265',1,'text.php']]],
+ ['destroy',['destroy',['../classphoto__driver.html#ae1a9edaf846983780dc65ea77d99e813',1,'photo_driver\destroy()'],['../classphoto__gd.html#a724703ecf71b1f1d04a80e86c76db6b1',1,'photo_gd\destroy()'],['../classphoto__imagick.html#afd49d64751ee3a298eac0c0ce0ba0207',1,'photo_imagick\destroy()']]],
+ ['detect_5flanguage',['detect_language',['../language_8php.html#a632da17c7ac0d2dc1a00a4706870194b',1,'language.php']]],
+ ['diaspora2bb',['diaspora2bb',['../bb2diaspora_8php.html#a26c09c218413610e62e60754c579f6c6',1,'bb2diaspora.php']]],
+ ['diaspora_5fol',['diaspora_ol',['../bb2diaspora_8php.html#a8b96bd45884fa1c40b942939354197d4',1,'bb2diaspora.php']]],
+ ['diaspora_5ful',['diaspora_ul',['../bb2diaspora_8php.html#adc92ccda5f85ed27e64fcc17712c89cc',1,'bb2diaspora.php']]],
+ ['dir_5ffns_2ephp',['dir_fns.php',['../dir__fns_8php.html',1,'']]],
+ ['dir_5fsafe_5fmode',['dir_safe_mode',['../dir__fns_8php.html#acf621621e929d49441da30aad76a58cf',1,'dir_fns.php']]],
+ ['dir_5fsort_5flinks',['dir_sort_links',['../dir__fns_8php.html#ae56881d69bb6f8e828c9e35454386774',1,'dir_fns.php']]],
+ ['dir_5ftagadelic',['dir_tagadelic',['../taxonomy_8php.html#a088371f4bc19155b2291508f5cd63332',1,'taxonomy.php']]],
+ ['dir_5ftagblock',['dir_tagblock',['../taxonomy_8php.html#a599ee71dd3194c8127b00dabec77abc1',1,'taxonomy.php']]],
+ ['directory_2ephp',['directory.php',['../mod_2directory_8php.html',1,'']]],
+ ['directory_2ephp',['directory.php',['../include_2directory_8php.html',1,'']]],
+ ['directory_5fcontent',['directory_content',['../mod_2directory_8php.html#aac79396570d759da2efac24fcedf5b44',1,'directory.php']]],
+ ['directory_5ffallback_5fmaster',['DIRECTORY_FALLBACK_MASTER',['../boot_8php.html#abedd940e664017c61b48c6efa31d0cb8',1,'boot.php']]],
+ ['directory_5finit',['directory_init',['../mod_2directory_8php.html#a5ee59c213508b6b9787612a8219cb5bf',1,'directory.php']]],
+ ['directory_5fmode_5fnormal',['DIRECTORY_MODE_NORMAL',['../boot_8php.html#ab7d65a7e7417825a4db62906bb600729',1,'boot.php']]],
+ ['directory_5fmode_5fprimary',['DIRECTORY_MODE_PRIMARY',['../boot_8php.html#a8a60cc38bb567765fd926fef70205f16',1,'boot.php']]],
+ ['directory_5fmode_5fsecondary',['DIRECTORY_MODE_SECONDARY',['../boot_8php.html#aedfb9501ed408278667995524e0d15cf',1,'boot.php']]],
+ ['directory_5fmode_5fstandalone',['DIRECTORY_MODE_STANDALONE',['../boot_8php.html#a25476eec71fceda237f7dc1d78b0adb8',1,'boot.php']]],
+ ['directory_5frealm',['DIRECTORY_REALM',['../boot_8php.html#a6b9909db6a7ec80ec6fdd40ba74014dd',1,'boot.php']]],
+ ['directory_5frun',['directory_run',['../include_2directory_8php.html#aa75d3b0697ca1456aaabdb37a74aa0f0',1,'directory.php']]],
+ ['dirprofile_2ephp',['dirprofile.php',['../dirprofile_8php.html',1,'']]],
+ ['dirprofile_5finit',['dirprofile_init',['../dirprofile_8php.html#a3e1d30d3d93863ff5615f2df4ac7f052',1,'dirprofile.php']]],
+ ['dirsearch_2ephp',['dirsearch.php',['../dirsearch_8php.html',1,'']]],
+ ['dirsearch_5fcontent',['dirsearch_content',['../dirsearch_8php.html#aa1fb04e1de4f25b63349ac78f94ceb4c',1,'dirsearch.php']]],
+ ['dirsearch_5finit',['dirsearch_init',['../dirsearch_8php.html#a3e51964ae3f5ff147403407b65324752',1,'dirsearch.php']]],
+ ['discover',['discover',['../classProtoDriver.html#a64a3868cffe27d601d55f69a2ecc4337',1,'ProtoDriver\discover()'],['../classZotDriver.html#a40d328ff9f6b0a238afe286dddee1514',1,'ZotDriver\discover()']]],
+ ['display_2ephp',['display.php',['../display_8php.html',1,'']]],
+ ['display_5fcontent',['display_content',['../display_8php.html#a37137c98d47bf3306f4c2bb9f5b60de0',1,'display.php']]],
+ ['dlogger',['dlogger',['../text_8php.html#a0a1f7c0e97f9ecbebf3e5834582b014c',1,'text.php']]],
+ ['do',['do',['../docblox__errorchecker_8php.html#a721c6ff80a6d3e4ad4ffa52a04c60085',1,'docblox_errorchecker.php']]],
+ ['dob',['dob',['../datetime_8php.html#a3f2897db32e745fe2f3e70a6b46578f8',1,'datetime.php']]],
+ ['docblox_5ferrorchecker_2ephp',['docblox_errorchecker.php',['../docblox__errorchecker_8php.html',1,'']]],
+ ['doscaleimage',['doScaleImage',['../classphoto__driver.html#ae18716018afcf362c7c24586b53e9e2f',1,'photo_driver\doScaleImage()'],['../classphoto__gd.html#a2f2e5900e6d8b1667892ac631b1d4754',1,'photo_gd\doScaleImage()'],['../classphoto__imagick.html#a3047c68bb4de7f66c2893fe451db2b66',1,'photo_imagick\doScaleImage()']]],
+ ['drop_5fitem',['drop_item',['../items_8php.html#afa1db13c2a8b73b5b17b97f17e5a19d1',1,'items.php']]],
+ ['drop_5fitems',['drop_items',['../items_8php.html#a668ece2c37f05cc3abe538eb0dabfe55',1,'items.php']]]
+];
diff --git a/doc/html/search/all_65.html b/doc/html/search/all_65.html
new file mode 100644
index 000000000..c2f4fcd94
--- /dev/null
+++ b/doc/html/search/all_65.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_65.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/all_65.js b/doc/html/search/all_65.js
new file mode 100644
index 000000000..475bb7505
--- /dev/null
+++ b/doc/html/search/all_65.js
@@ -0,0 +1,40 @@
+var searchData=
+[
+ ['editblock_2ephp',['editblock.php',['../editblock_8php.html',1,'']]],
+ ['editblock_5fcontent',['editblock_content',['../editblock_8php.html#abbe8f55de06967bc8d79d620509a49e6',1,'editblock.php']]],
+ ['editlayout_2ephp',['editlayout.php',['../editlayout_8php.html',1,'']]],
+ ['editlayout_5fcontent',['editlayout_content',['../editlayout_8php.html#aa877e4157a26b099de904164181dd386',1,'editlayout.php']]],
+ ['editpost_2ephp',['editpost.php',['../editpost_8php.html',1,'']]],
+ ['editpost_5fcontent',['editpost_content',['../editpost_8php.html#a34011690864d122680c802e9e748ccfb',1,'editpost.php']]],
+ ['editwebpage_2ephp',['editwebpage.php',['../editwebpage_8php.html',1,'']]],
+ ['editwebpage_5fcontent',['editwebpage_content',['../editwebpage_8php.html#a375e945255fad79a71036528f7480650',1,'editwebpage.php']]],
+ ['else',['else',['../auth_8php.html#a0950af7c2888ca1d4743fe5d0bff9ae5',1,'else():&#160;auth.php'],['../fpostit_8php.html#a501b5ca82f287509fc691c88524064c1',1,'else():&#160;fpostit.php'],['../tpldebug_8php.html#afbc7aadb3f7ff1edf0aaaa326a42179c',1,'else():&#160;tpldebug.php'],['../redbasic_2php_2style_8php.html#ab3afb90d611eca90819f597a2c0bb459',1,'else():&#160;style.php']]],
+ ['email_5fheader_5fencode',['email_header_encode',['../include_2network_8php.html#a469b9bd700269cd07d954f1a16c5899b',1,'network.php']]],
+ ['email_5fsend',['email_send',['../include_2network_8php.html#a1ff07d9fad93b713b93da0ab77aab7f0',1,'network.php']]],
+ ['encode_5fitem',['encode_item',['../items_8php.html#a82955cc578f0fa600acec84475026194',1,'items.php']]],
+ ['encode_5fitem_5fflags',['encode_item_flags',['../items_8php.html#a5f690fc2484abec07840b4f9dd525bd9',1,'items.php']]],
+ ['encode_5fitem_5fterms',['encode_item_terms',['../items_8php.html#ac6673627d289ee4f547de0fe3b7acd0a',1,'items.php']]],
+ ['encode_5fitem_5fxchan',['encode_item_xchan',['../items_8php.html#a566c601726697e044e75284af7fb6f17',1,'items.php']]],
+ ['encode_5fmail',['encode_mail',['../items_8php.html#a2d840c74ed23d1b6c7daee05cf89dda7',1,'items.php']]],
+ ['encode_5frel_5flinks',['encode_rel_links',['../items_8php.html#aa723c0571e314a1853a24c5854b4f54f',1,'items.php']]],
+ ['enotify',['enotify',['../classenotify.html',1,'']]],
+ ['enotify_2ephp',['enotify.php',['../enotify_8php.html',1,'']]],
+ ['enumerate_5fpermissions',['enumerate_permissions',['../items_8php.html#afbcf26dfcf8a83fff952aa858c1b7b67',1,'items.php']]],
+ ['eol',['EOL',['../boot_8php.html#a0603d6ece8c5d37b4b7db697db053a4b',1,'boot.php']]],
+ ['eot',['EOT',['../typohelper_8php.html#ab6fd357fb5b2a3ba8aab9e8b98c6a805',1,'typohelper.php']]],
+ ['escape',['escape',['../classdba__driver.html#afc95ffa103a3290581b537670cde5311',1,'dba_driver\escape()'],['../classdba__mysql.html#a99a7691ea6cb1300031fb6549379066e',1,'dba_mysql\escape()'],['../classdba__mysqli.html#a27d6a748af7f80028801306e7ea33f64',1,'dba_mysqli\escape()']]],
+ ['escape_5ftags',['escape_tags',['../text_8php.html#aa5148a0dfea2a1ca64c3d52f10aa2d64',1,'text.php']]],
+ ['ev_5fcompare',['ev_compare',['../event_8php.html#a32ba1b9ddf7a744a9a1512b052e5f850',1,'event.php']]],
+ ['event_2ephp',['event.php',['../event_8php.html',1,'']]],
+ ['event_5fstore',['event_store',['../event_8php.html#a89ef533faf345db8d64a58d4856bde3a',1,'event.php']]],
+ ['events_2ephp',['events.php',['../events_8php.html',1,'']]],
+ ['events_5fcontent',['events_content',['../events_8php.html#a1d293fb217ae6bc9e3858c4b32e363ec',1,'events.php']]],
+ ['events_5fpost',['events_post',['../events_8php.html#ab3e8a8f901175f8e40a8089eea45c075',1,'events.php']]],
+ ['excludepaths',['excludepaths',['../namespaceupdatetpl.html#a988d937ed5d5c2b592b763036af5cf94',1,'updatetpl']]],
+ ['expand_5facl',['expand_acl',['../text_8php.html#ae4282a39492caa23ccbc2ce98e54f110',1,'text.php']]],
+ ['expand_5fgroups',['expand_groups',['../include_2group_8php.html#a22a81875259c7d3d64d4848afea6b345',1,'group.php']]],
+ ['expire_2ephp',['expire.php',['../expire_8php.html',1,'']]],
+ ['expire_5frun',['expire_run',['../expire_8php.html#a444e45c9b67727b27db4c779fd51a298',1,'expire.php']]],
+ ['ext',['ext',['../namespacefriendica-to-smarty-tpl.html#aecf730e0884bb4ddc6c0deb1ef85f8eb',1,'friendica-to-smarty-tpl']]],
+ ['extract_2ephp',['extract.php',['../extract_8php.html',1,'']]]
+];
diff --git a/doc/html/search/all_66.html b/doc/html/search/all_66.html
new file mode 100644
index 000000000..a9ac881c0
--- /dev/null
+++ b/doc/html/search/all_66.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_66.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/all_66.js b/doc/html/search/all_66.js
new file mode 100644
index 000000000..f9ff7aa3a
--- /dev/null
+++ b/doc/html/search/all_66.js
@@ -0,0 +1,74 @@
+var searchData=
+[
+ ['f',['f',['../namespacefriendica-to-smarty-tpl.html#a965e1d6d6293654a56e029a7e454dec7',1,'friendica-to-smarty-tpl']]],
+ ['fbrowser_2ephp',['fbrowser.php',['../fbrowser_8php.html',1,'']]],
+ ['fbrowser_5fcontent',['fbrowser_content',['../fbrowser_8php.html#aee476addcf7a3e0fe9454f7dfd5a56c4',1,'fbrowser.php']]],
+ ['feature_5fenabled',['feature_enabled',['../features_8php.html#a52b5bdfb61b256713efecf7a7b20b0c0',1,'features.php']]],
+ ['features_2ephp',['features.php',['../features_8php.html',1,'']]],
+ ['feed_2ephp',['feed.php',['../feed_8php.html',1,'']]],
+ ['feed_5fhublinks',['feed_hublinks',['../text_8php.html#a8d8c4a11e53461caca21181ebd72daca',1,'text.php']]],
+ ['feed_5finit',['feed_init',['../feed_8php.html#af86137700b56f33d1d5f25c8dec22c04',1,'feed.php']]],
+ ['feed_5fsalmonlinks',['feed_salmonlinks',['../text_8php.html#a89929fa6f70a8ba54d5273fcf622b665',1,'text.php']]],
+ ['fetch_5flrdd_5ftemplate',['fetch_lrdd_template',['../include_2network_8php.html#a8d5a3afb51cc932032b5dcc159efaae0',1,'network.php']]],
+ ['fetch_5fpost_5ftags',['fetch_post_tags',['../items_8php.html#adf980098b6de9c3993bc3ff26a8dd6f9',1,'items.php']]],
+ ['field_5ftimezone',['field_timezone',['../datetime_8php.html#a03900dcf0f9e3c58793a031673a70326',1,'datetime.php']]],
+ ['file_5ftag_5fdecode',['file_tag_decode',['../taxonomy_8php.html#a08df5164926d2b31b8e9fcfe919de2b6',1,'taxonomy.php']]],
+ ['file_5ftag_5fencode',['file_tag_encode',['../taxonomy_8php.html#a3299482ac20e9d79453048dd52881d37',1,'taxonomy.php']]],
+ ['file_5ftag_5ffile_5fquery',['file_tag_file_query',['../taxonomy_8php.html#a163b5131f388080b0fc82398d3a32fe1',1,'taxonomy.php']]],
+ ['fileas_5fwidget',['fileas_widget',['../contact__widgets_8php.html#a1eda66319d170f60a8d07c7ece95533b',1,'contact_widgets.php']]],
+ ['filename',['filename',['../namespacefriendica-to-smarty-tpl.html#a5f9bf7a67d955c0d6be70a82097611c5',1,'friendica-to-smarty-tpl']]],
+ ['filer_2ephp',['filer.php',['../filer_8php.html',1,'']]],
+ ['filer_5fcontent',['filer_content',['../filer_8php.html#a5fd5d7e61b2f9c43cb5f110c89dc4274',1,'filer.php']]],
+ ['filerm_2ephp',['filerm.php',['../filerm_8php.html',1,'']]],
+ ['filerm_5fcontent',['filerm_content',['../filerm_8php.html#ae2eb28d2054fa2c37e38689882172208',1,'filerm.php']]],
+ ['files',['files',['../namespacefriendica-to-smarty-tpl.html#ae74419b16516956c66f7db714a93a6ac',1,'friendica-to-smarty-tpl']]],
+ ['filestorage_2ephp',['filestorage.php',['../filestorage_8php.html',1,'']]],
+ ['filestorage_5fcontent',['filestorage_content',['../filestorage_8php.html#a61bb1be78472555df4ce619f51014040',1,'filestorage.php']]],
+ ['filestorage_5fpost',['filestorage_post',['../filestorage_8php.html#ad3b64e3ece9831f9d3a9f00c0ae983cd',1,'filestorage.php']]],
+ ['find_5fthread_5fparent_5findex',['find_thread_parent_index',['../conversation_8php.html#ae59703b07ce2ddf627b4172ff26058b6',1,'conversation.php']]],
+ ['find_5fupstream_5fdirectory',['find_upstream_directory',['../dir__fns_8php.html#a8c15aa69da12f2d3476b9e93b82b337d',1,'dir_fns.php']]],
+ ['find_5fxchan_5fin_5farray',['find_xchan_in_array',['../text_8php.html#ace3c98538c63e09b70a363210b414112',1,'text.php']]],
+ ['findpeople_5fwidget',['findpeople_widget',['../contact__widgets_8php.html#a57e73ebcfd62bb5d8c7a7b9e663726d6',1,'contact_widgets.php']]],
+ ['first_5fpost_5fdate',['first_post_date',['../items_8php.html#a0cf98bb619f07dd18f602683a55a5f59',1,'items.php']]],
+ ['fix_5fattached_5ffile_5fpermissions',['fix_attached_file_permissions',['../item_8php.html#a3daae7944f737bd30412a0d042207c0f',1,'item.php']]],
+ ['fix_5fattached_5fphoto_5fpermissions',['fix_attached_photo_permissions',['../item_8php.html#a7b63a9d0cd02096e17dcf11f4afa7c10',1,'item.php']]],
+ ['fix_5felement',['fix_element',['../namespacefriendica-to-smarty-tpl.html#a3719dd46e286a57d315e6adae1845854',1,'friendica-to-smarty-tpl']]],
+ ['fix_5fmce_5flf',['fix_mce_lf',['../text_8php.html#afdc69fe3f6c09e35e46304dcea63ae28',1,'text.php']]],
+ ['fix_5fprivate_5fphotos',['fix_private_photos',['../items_8php.html#aba98fcbbcd7044a7e9ea34edabc14c87',1,'items.php']]],
+ ['fix_5fsystem_5furls',['fix_system_urls',['../boot_8php.html#aca5e42678e178c6b9034610d66666fd7',1,'boot.php']]],
+ ['fixacl',['fixacl',['../acl__selectors_8php.html#ad6664fb8330308e23f2645cd6624727e',1,'acl_selectors.php']]],
+ ['fkoauth1',['FKOAuth1',['../classFKOAuth1.html',1,'']]],
+ ['fkoauthdatastore',['FKOAuthDataStore',['../classFKOAuthDataStore.html',1,'']]],
+ ['flip',['flip',['../classphoto__driver.html#a2b2a99021fc63ed6465d703ddddcb832',1,'photo_driver\flip()'],['../classphoto__gd.html#a44cedef376044018702d9355ddc813ce',1,'photo_gd\flip()'],['../classphoto__imagick.html#aff6bcdbab18593a3fc5a480db8509393',1,'photo_imagick\flip()']]],
+ ['fnull',['fnull',['../namespaceupdatetpl.html#a79c20eb62d568c999b56eb08530355d3',1,'updatetpl']]],
+ ['follow_2ephp',['follow.php',['../mod_2follow_8php.html',1,'']]],
+ ['follow_2ephp',['follow.php',['../include_2follow_8php.html',1,'']]],
+ ['follow_5fcontent',['follow_content',['../mod_2follow_8php.html#a4c540ea4e9f5c581c1a53516ac585592',1,'follow.php']]],
+ ['follow_5finit',['follow_init',['../mod_2follow_8php.html#a171f5b19f50d7738adc3b2e96ec6018a',1,'follow.php']]],
+ ['foreach',['foreach',['../typo_8php.html#a329c9c12217d2c8660c47bbc7c8df4c5',1,'typo.php']]],
+ ['format_5fcategories',['format_categories',['../text_8php.html#a3054189cff173977f4216c9a3dd29e1b',1,'text.php']]],
+ ['format_5fcss_5fif_5fexists',['format_css_if_exists',['../plugin_8php.html#a9039e15aae27676af7777dcbee5a11d6',1,'plugin.php']]],
+ ['format_5fevent_5fbbcode',['format_event_bbcode',['../event_8php.html#abb74206cf42d694307c3d7abb7af9869',1,'event.php']]],
+ ['format_5fevent_5fdiaspora',['format_event_diaspora',['../bb2diaspora_8php.html#a29a2ad41f5826f3975fa9a49934ff863',1,'bb2diaspora.php']]],
+ ['format_5fevent_5fhtml',['format_event_html',['../event_8php.html#a2ac9f1b08de03250ecd794f705781d17',1,'event.php']]],
+ ['format_5ffiler',['format_filer',['../text_8php.html#a4e4d42b0a805148d9f9a92bcac89bf91',1,'text.php']]],
+ ['format_5fjs_5fif_5fexists',['format_js_if_exists',['../plugin_8php.html#ad9ff8ba554576383c5911a4bce068c1f',1,'plugin.php']]],
+ ['format_5flike',['format_like',['../conversation_8php.html#a3d8e30cc94f9a175054c021305d3aca3',1,'conversation.php']]],
+ ['format_5flocation',['format_location',['../conversation_8php.html#a0891aaa4492cba2b51eda12fe01957f3',1,'conversation.php']]],
+ ['format_5fnotification',['format_notification',['../include_2notify_8php.html#a0e61728e487df50c72e6434f911a57d3',1,'notify.php']]],
+ ['format_5fterm_5ffor_5fdisplay',['format_term_for_display',['../taxonomy_8php.html#adfead45e3b8a3dfb2b4a4b9281d0dbe1',1,'taxonomy.php']]],
+ ['fpostit_2ephp',['fpostit.php',['../fpostit_8php.html',1,'']]],
+ ['fresh_2emd',['fresh.md',['../fresh_8md.html',1,'']]],
+ ['friendica',['Friendica',['../namespaceFriendica.html',1,'']]],
+ ['friendica_2dto_2dsmarty_2dtpl',['friendica-to-smarty-tpl',['../namespacefriendica-to-smarty-tpl.html',1,'']]],
+ ['friendica_2dto_2dsmarty_2dtpl_2epy',['friendica-to-smarty-tpl.py',['../friendica-to-smarty-tpl_8py.html',1,'']]],
+ ['friendica_5fsmarty_2ephp',['friendica_smarty.php',['../friendica__smarty_8php.html',1,'']]],
+ ['friendicasmarty',['FriendicaSmarty',['../classFriendicaSmarty.html',1,'']]],
+ ['friendicasmartyengine',['FriendicaSmartyEngine',['../classFriendicaSmartyEngine.html',1,'']]],
+ ['fsuggest_2ephp',['fsuggest.php',['../fsuggest_8php.html',1,'']]],
+ ['fsuggest_5fcontent',['fsuggest_content',['../fsuggest_8php.html#aa6c49ed4b50a387f1845f36844dd7998',1,'fsuggest.php']]],
+ ['fsuggest_5fpost',['fsuggest_post',['../fsuggest_8php.html#a61ecfe10ce937ed526614f8fd3de3c7d',1,'fsuggest.php']]],
+ ['ftosmarty',['fToSmarty',['../namespacefriendica-to-smarty-tpl.html#a89388ea9b2826e8218ed480e917d8105',1,'friendica-to-smarty-tpl']]],
+ ['full_2ephp',['full.php',['../full_8php.html',1,'']]],
+ ['fresh_20_2d_20the_20freaking_20red_20shell',['Fresh - The Freaking REd Shell',['../md_fresh.html',1,'']]]
+];
diff --git a/doc/html/search/all_67.html b/doc/html/search/all_67.html
new file mode 100644
index 000000000..747fb512c
--- /dev/null
+++ b/doc/html/search/all_67.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_67.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/all_67.js b/doc/html/search/all_67.js
new file mode 100644
index 000000000..015ed84b7
--- /dev/null
+++ b/doc/html/search/all_67.js
@@ -0,0 +1,126 @@
+var searchData=
+[
+ ['gen_5ftoken',['gen_token',['../classFKOAuthDataStore.html#aa1a268be88ad3979bb4cc35bbb4dc819',1,'FKOAuthDataStore']]],
+ ['gender_5fselector',['gender_selector',['../profile__selectors_8php.html#ae2b2c087e6530c61c0b256fd26d52355',1,'profile_selectors.php']]],
+ ['generate_5fuser_5fguid',['generate_user_guid',['../text_8php.html#ae4f6881d7e13623f8eded6277595112a',1,'text.php']]],
+ ['generatedirectoryindex',['generateDirectoryIndex',['../classRedBrowser.html#a1f7daf50bb9bfcde7345b3b1908dbd7e',1,'RedBrowser']]],
+ ['get',['get',['../classCache.html#a70392b109331897bf9fdd7f1960e21de',1,'Cache\get()'],['../classRedFile.html#a7c868dfcef6c70cd0e24cf3caa2c3535',1,'RedFile\get()']]],
+ ['get_5faccount',['get_account',['../classApp.html#a08bc87aff64f39fbc084e9d6545cee4d',1,'App']]],
+ ['get_5faccount_5fid',['get_account_id',['../boot_8php.html#afe88b920aa285982edb817a0dd44eb37',1,'boot.php']]],
+ ['get_5fall_5fperms',['get_all_perms',['../permissions_8php.html#aeca9b280f3dc3358c89976d81d690008',1,'permissions.php']]],
+ ['get_5fapp',['get_app',['../classBaseObject.html#ac43f10e69ce80c78e4870636250fc8a2',1,'BaseObject\get_app()'],['../boot_8php.html#a0e6db7e365f2b041a828b93786f694bc',1,'get_app():&#160;boot.php']]],
+ ['get_5fapps',['get_apps',['../classApp.html#a5c63eabdc7fdd8b6e3348980ec16a3ad',1,'App']]],
+ ['get_5fatom_5felements',['get_atom_elements',['../items_8php.html#a896c1809d58f2d7a42cfe14577958ddf',1,'items.php']]],
+ ['get_5fbaseurl',['get_baseurl',['../classApp.html#a604d659d6977a99de42a160343e5289a',1,'App']]],
+ ['get_5fbb_5ftag_5fpos',['get_bb_tag_pos',['../bb2diaspora_8php.html#a4c2f8f11b29a06809d9b07782215b1b2',1,'bb2diaspora.php']]],
+ ['get_5fbest_5flanguage',['get_best_language',['../language_8php.html#a980dee1d8715a98ab02e36b59facf8ed',1,'language.php']]],
+ ['get_5fbirthdays',['get_birthdays',['../identity_8php.html#ad2c97627a313d53df1a1c7b4215ddb51',1,'identity.php']]],
+ ['get_5fbrowser_5flanguage',['get_browser_language',['../language_8php.html#ace67d6cad57da08d030ad9dc9b8c836e',1,'language.php']]],
+ ['get_5fcapath',['get_capath',['../include_2network_8php.html#a78e89557b2fbd344ad790846d761b0c7',1,'network.php']]],
+ ['get_5fchannel',['get_channel',['../classApp.html#a084e03c77686d8c13390fef3f7428a2b',1,'App']]],
+ ['get_5fchild',['get_child',['../classItem.html#a632185dd25c5caf277067c76230a4320',1,'Item']]],
+ ['get_5fchildren',['get_children',['../classItem.html#aa0ee775ec94abccec6c798428835d001',1,'Item']]],
+ ['get_5fcipher',['get_cipher',['../classConversation.html#a4aab60bb39fa6761b6cacdc8d9da2901',1,'Conversation']]],
+ ['get_5fcloudpath',['get_cloudpath',['../include_2attach_8php.html#a6aa00ea010ea030110faefb75eafc1ce',1,'attach.php']]],
+ ['get_5fcomment_5fbox',['get_comment_box',['../classItem.html#a3ee7667c2ec6cd7657328e27848c0bdf',1,'Item']]],
+ ['get_5fcomment_5fbox_5ftemplate',['get_comment_box_template',['../classItem.html#a904421c7a427411bb2ab473bca872f63',1,'Item']]],
+ ['get_5fconfig',['get_config',['../include_2config_8php.html#af02c96e6b37335774b548914ede1d22e',1,'config.php']]],
+ ['get_5fconfig_5ffrom_5fstorage',['get_config_from_storage',['../include_2config_8php.html#af08b7adb63adfb2eda7c466fba0cce74',1,'config.php']]],
+ ['get_5fconversation',['get_conversation',['../classItem.html#a0c301aaed2b7d682728d18db3a22afa3',1,'Item']]],
+ ['get_5fcustom_5fnav',['get_custom_nav',['../boot_8php.html#a899d24fd074594ceebbf72e1feff335f',1,'boot.php']]],
+ ['get_5fdata',['get_data',['../classItem.html#ad3638f93065693c1f69eb349feb1b7aa',1,'Item']]],
+ ['get_5fdata_5fvalue',['get_data_value',['../classItem.html#ac6f1c96cc82a0dfb7e881fc70309ea3c',1,'Item']]],
+ ['get_5fdb_5ferrno',['get_db_errno',['../setup_8php.html#a8652788e8589778c5f81634a9d5b9429',1,'setup.php']]],
+ ['get_5fdefault_5fprofile_5fphoto',['get_default_profile_photo',['../identity_8php.html#ab1485a26b032956e1496fc08c58b83ed',1,'identity.php']]],
+ ['get_5fdim',['get_dim',['../datetime_8php.html#a7df24d72ea05922d3127363e2295174c',1,'datetime.php']]],
+ ['get_5fevents',['get_events',['../identity_8php.html#ae381db3d43f8e7c1da8b15d14ecf5312',1,'identity.php']]],
+ ['get_5ffeatures',['get_features',['../features_8php.html#ae73c5b03b01c7284ed7e7e0e774e975c',1,'features.php']]],
+ ['get_5ffeed_5ffor',['get_feed_for',['../items_8php.html#a04a35b610acfe54434df08adec39c0c7',1,'items.php']]],
+ ['get_5ffirst_5fdim',['get_first_dim',['../datetime_8php.html#aba971b67f17fecf050813f1eba72367f',1,'datetime.php']]],
+ ['get_5fform_5fsecurity_5ftoken',['get_form_security_token',['../security_8php.html#acd06ef411116115c2f0a92633700db8a',1,'security.php']]],
+ ['get_5fformatsmap',['get_FormatsMap',['../classphoto__imagick.html#aef020d929f66f4370e33fc158c8eebd4',1,'photo_imagick']]],
+ ['get_5fgroups',['get_groups',['../classApp.html#a4659785d13e4bac0bed50dbb1b0d4299',1,'App']]],
+ ['get_5fhostname',['get_hostname',['../classApp.html#a622eace13f8fc9f4b5672a68e2bc4396',1,'App']]],
+ ['get_5fid',['get_id',['../classItem.html#ac0f27e58532612f6e7a54c8a621b9b92',1,'Item']]],
+ ['get_5fintltext_5ftemplate',['get_intltext_template',['../classFriendicaSmartyEngine.html#a35ec0ee828c36640ea25296bcb84a118',1,'FriendicaSmartyEngine\get_intltext_template()'],['../plugin_8php.html#acb63c27d07f6d7dffe95f98a6cef1295',1,'get_intltext_template():&#160;plugin.php']]],
+ ['get_5fitem_5fchildren',['get_item_children',['../conversation_8php.html#a7f6ef0dfa554bacf620e84c18d386e67',1,'conversation.php']]],
+ ['get_5fitem_5fcontact',['get_item_contact',['../items_8php.html#aab9c6bae4c40799867596bdaae9829fd',1,'items.php']]],
+ ['get_5fitem_5felements',['get_item_elements',['../items_8php.html#a536d0313b6ffe33b9d2490c4e25c5361',1,'items.php']]],
+ ['get_5fmail_5felements',['get_mail_elements',['../items_8php.html#a94ddb1d6c8fa21dd7433677e85168037',1,'items.php']]],
+ ['get_5fmarkup_5ftemplate',['get_markup_template',['../classFriendicaSmartyEngine.html#aab5994077fc3a64222e41b28e2bd8d88',1,'FriendicaSmartyEngine\get_markup_template()'],['../interfaceITemplateEngine.html#aaf2698adbf46c073c24b162fe1b1c442',1,'ITemplateEngine\get_markup_template()'],['../classTemplate.html#afd97b4b1e7754a550e67c0ea79159059',1,'Template\get_markup_template()'],['../plugin_8php.html#a75f7dfed291fd7add7fc85b5c022a1f4',1,'get_markup_template():&#160;plugin.php']]],
+ ['get_5fmax_5fimport_5fsize',['get_max_import_size',['../boot_8php.html#a97769915c9f14adc4f8ab1ea2cecfd90',1,'boot.php']]],
+ ['get_5fmentions',['get_mentions',['../text_8php.html#a76d1b3435c067978d7b484c45f56472b',1,'text.php']]],
+ ['get_5fmode',['get_mode',['../classConversation.html#a87a0d704d5f2b1a008cc2e9ce06a1bcd',1,'Conversation']]],
+ ['get_5fmood_5fverbs',['get_mood_verbs',['../text_8php.html#a736db13a966b8abaf8c9198faa35911a',1,'text.php']]],
+ ['get_5fmy_5faddress',['get_my_address',['../identity_8php.html#a490972c02fdb638c52ec0e012a30bfd2',1,'identity.php']]],
+ ['get_5fmy_5furl',['get_my_url',['../identity_8php.html#aa46321e1cd6a3b8dfde8bf9510112fec',1,'identity.php']]],
+ ['get_5fobserver',['get_observer',['../classApp.html#a1ad3bb1b68439b3b7cbe630918e618d2',1,'App\get_observer()'],['../classConversation.html#ae3d4190142e12b57051f11f2911f77a0',1,'Conversation\get_observer()']]],
+ ['get_5fobserver_5fhash',['get_observer_hash',['../boot_8php.html#a623e49c79943f3e7bdb770d021683cf7',1,'boot.php']]],
+ ['get_5fowner_5fname',['get_owner_name',['../classItem.html#a67892aa23d19f4431bb2e5f43c74000e',1,'Item']]],
+ ['get_5fowner_5fphoto',['get_owner_photo',['../classItem.html#aa541bc4290e51bfd688d6921bebabc73',1,'Item']]],
+ ['get_5fowner_5furl',['get_owner_url',['../classItem.html#a9f2d219da712390f59012fc32a342074',1,'Item']]],
+ ['get_5fparent',['get_parent',['../classItem.html#a4b92e3a9d6212c553aa2661489bd95d8',1,'Item']]],
+ ['get_5fpath',['get_path',['../classApp.html#a5293a8543ba338dcf38cd4ff3bc5d4be',1,'App']]],
+ ['get_5fpconfig',['get_pconfig',['../include_2config_8php.html#ad58a4913937179adb13201c2ee3261ad',1,'config.php']]],
+ ['get_5fperms',['get_perms',['../classApp.html#adb5a4bb657881e553978ff390babd01f',1,'App\get_perms()'],['../permissions_8php.html#a040fd3d3b8517658b1668ae0cd093972',1,'get_perms():&#160;permissions.php']]],
+ ['get_5fplink',['get_plink',['../text_8php.html#aac0969ae09853205992ba06ab9f9f61a',1,'text.php']]],
+ ['get_5fplugin_5finfo',['get_plugin_info',['../plugin_8php.html#aff0178bd8d0b34a94d5efddc883edd35',1,'plugin.php']]],
+ ['get_5fpoke_5fverbs',['get_poke_verbs',['../text_8php.html#aa46f941155c2ac1155f2f17ffb0adb66',1,'text.php']]],
+ ['get_5fprofile_5felements',['get_profile_elements',['../items_8php.html#a251343637ff40a50cca93452cd530c26',1,'items.php']]],
+ ['get_5fprofile_5fowner',['get_profile_owner',['../classConversation.html#a5effe8ad3007e01333df44b81432b813',1,'Conversation']]],
+ ['get_5fpublic_5ffeed',['get_public_feed',['../items_8php.html#a079e099e15d88d47aeb6ca6d60da7107',1,'items.php']]],
+ ['get_5fredirect_5furl',['get_redirect_url',['../classItem.html#a428f448f89a8629055ea3294eb942aea',1,'Item']]],
+ ['get_5frel_5flink',['get_rel_link',['../text_8php.html#a3972701c5c83624ec4e2d06242f614e7',1,'text.php']]],
+ ['get_5frpost_5fpath',['get_rpost_path',['../zot_8php.html#a8e22dbc6f884be3644a892a876cbd972',1,'zot.php']]],
+ ['get_5fsys_5fchannel',['get_sys_channel',['../identity_8php.html#aaff86ee3b5984821e7a256c2da5f1a51',1,'identity.php']]],
+ ['get_5ftags',['get_tags',['../text_8php.html#a4659fbc4e54ddc700c3aa66b9092c623',1,'text.php']]],
+ ['get_5ftemplate',['get_template',['../classItem.html#aba23a0a9d89e316d2b343cc46d695d91',1,'Item']]],
+ ['get_5ftemplate_5fdata',['get_template_data',['../classConversation.html#a2a96b7a6573ae53db861624659e831cb',1,'Conversation\get_template_data()'],['../classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8',1,'Item\get_template_data()']]],
+ ['get_5ftemplate_5fengine',['get_template_engine',['../classApp.html#acb27e607fe4c82603444676e25c36b70',1,'App']]],
+ ['get_5ftemplate_5fldelim',['get_template_ldelim',['../classApp.html#a2eb832a8577dee7d40b93abdf6d1d35a',1,'App']]],
+ ['get_5ftemplate_5frdelim',['get_template_rdelim',['../classApp.html#aab23c59172310fd30f2d60dc039d3eea',1,'App']]],
+ ['get_5fterms_5foftype',['get_terms_oftype',['../taxonomy_8php.html#a0fb8cf0ac7bcbc8b27d856fe9bf69cd1',1,'taxonomy.php']]],
+ ['get_5ftheme_5fconfig_5ffile',['get_theme_config_file',['../settings_8php.html#a39abc76ff5459c57e3b957664f273f18',1,'settings.php']]],
+ ['get_5ftheme_5finfo',['get_theme_info',['../plugin_8php.html#ad48de9c0fb7f19413a2aa49250d00405',1,'plugin.php']]],
+ ['get_5ftheme_5fscreenshot',['get_theme_screenshot',['../plugin_8php.html#a48047edfbef770125a5508dcc2f9282f',1,'plugin.php']]],
+ ['get_5ftheme_5fuid',['get_theme_uid',['../identity_8php.html#aaeb666872995e3ab8da8f7bc5f3b2bd3',1,'identity.php']]],
+ ['get_5fthings',['get_things',['../taxonomy_8php.html#a7747fa859ac56fbffd4f9782d85505de',1,'taxonomy.php']]],
+ ['get_5fthread',['get_thread',['../classConversation.html#a4cff75d8c46b517e7133e4d0da6fc1c8',1,'Conversation']]],
+ ['get_5fwidgets',['get_widgets',['../classApp.html#a871898becd0697d778f36d9336253ae8',1,'App']]],
+ ['get_5fxconfig',['get_xconfig',['../include_2config_8php.html#aa3dc1d3de2d091ac702e675acd3a085e',1,'config.php']]],
+ ['getchild',['getChild',['../classRedDirectory.html#aaa20f0f44da23781917af8170c0a2569',1,'RedDirectory']]],
+ ['getchildren',['getChildren',['../classRedDirectory.html#aa42d3065f6f065b17db87146a7cb031a',1,'RedDirectory']]],
+ ['getcontenttype',['getContentType',['../classRedFile.html#a26416827eb68554d033d1e2e5cc6dd3b',1,'RedFile']]],
+ ['getdir',['getDir',['../classRedDirectory.html#a70173d4458572d95e586b2037d2fd2f4',1,'RedDirectory']]],
+ ['getetag',['getETag',['../classRedFile.html#ae96d5caa2db7a461c57b24380fa87e28',1,'RedFile']]],
+ ['getext',['getExt',['../classphoto__driver.html#aa2efb5b2a6af3fd67e3f1c2b9852a5ba',1,'photo_driver']]],
+ ['getheight',['getHeight',['../classphoto__driver.html#af769e9abb144e57002c59aa2aa8f3468',1,'photo_driver']]],
+ ['getimage',['getImage',['../classphoto__driver.html#ab98da263bd7341fc132c4fb6fc76e8d5',1,'photo_driver\getImage()'],['../classphoto__gd.html#a86757ba021fd80d1a5cf8c2f766a8484',1,'photo_gd\getImage()'],['../classphoto__imagick.html#ad07288e0eb3922cb08cc9d33a163decc',1,'photo_imagick\getImage()']]],
+ ['getlastmodified',['getLastModified',['../classRedFile.html#a41562a28007789bbe7fe06d6a20eef47',1,'RedFile']]],
+ ['getname',['getName',['../classRedDirectory.html#af6e4475dbd5abcdede00d20b8d388583',1,'RedDirectory\getName()'],['../classRedFile.html#a0c961c5f49544d2502420361fa526437',1,'RedFile\getName()']]],
+ ['getsize',['getSize',['../classRedFile.html#acb1edbe1848fab05347746fa1ea09d8f',1,'RedFile']]],
+ ['gettype',['getType',['../classphoto__driver.html#a6c6c16dbc4f517ce799f9143ed61f0e3',1,'photo_driver']]],
+ ['getwidth',['getWidth',['../classphoto__driver.html#acc30486acee9e89e32701f44a1738117',1,'photo_driver']]],
+ ['goaway',['goaway',['../boot_8php.html#a5ab6181607a090bcdbaa13b15b85aba1',1,'boot.php']]],
+ ['gprobe_2ephp',['gprobe.php',['../gprobe_8php.html',1,'']]],
+ ['gprobe_5frun',['gprobe_run',['../gprobe_8php.html#adf72cb0a70b5b9d99fdec1cc60e18ed1',1,'gprobe.php']]],
+ ['gravity_5fcomment',['GRAVITY_COMMENT',['../boot_8php.html#a4a12ce5de39789b0361e308d89925a20',1,'boot.php']]],
+ ['gravity_5flike',['GRAVITY_LIKE',['../boot_8php.html#a1f5906598e90b5ea2b4245f682be4348',1,'boot.php']]],
+ ['gravity_5fparent',['GRAVITY_PARENT',['../boot_8php.html#a2af173e4e9836ee7c90757b4793a2be3',1,'boot.php']]],
+ ['greenthumbnails_2ephp',['greenthumbnails.php',['../greenthumbnails_8php.html',1,'']]],
+ ['group_2ephp',['group.php',['../mod_2group_8php.html',1,'']]],
+ ['group_2ephp',['group.php',['../include_2group_8php.html',1,'']]],
+ ['group_5fadd',['group_add',['../include_2group_8php.html#a06ec565d2b64e79044e7c1bf91a2a4ce',1,'group.php']]],
+ ['group_5fadd_5fmember',['group_add_member',['../include_2group_8php.html#a0122ef312df2c5546b1a46b3e6c7b31b',1,'group.php']]],
+ ['group_5fbyname',['group_byname',['../include_2group_8php.html#abd66a5ea34a07a3422dc2dde6c7b3ecb',1,'group.php']]],
+ ['group_5fcontent',['group_content',['../mod_2group_8php.html#a07a64f6c65b0080d8190b3d9728a7a83',1,'group.php']]],
+ ['group_5fget_5fmembers',['group_get_members',['../include_2group_8php.html#a5bd191d9692e6c34d48c0ede10810f09',1,'group.php']]],
+ ['group_5fpost',['group_post',['../mod_2group_8php.html#aed1f009b1221348021bb34761160ef35',1,'group.php']]],
+ ['group_5frec_5fbyhash',['group_rec_byhash',['../include_2group_8php.html#a90e157b3e1b99c981809cb5a2abd3245',1,'group.php']]],
+ ['group_5frmv',['group_rmv',['../include_2group_8php.html#a4118f498bbd1530c1d0136d016d197a5',1,'group.php']]],
+ ['group_5frmv_5fmember',['group_rmv_member',['../include_2group_8php.html#a540e3ef36f47d47532646be4241f6518',1,'group.php']]],
+ ['group_5fselect',['group_select',['../acl__selectors_8php.html#aa1e3bc344ca2b29f97eb9860216d21a0',1,'acl_selectors.php']]],
+ ['group_5fside',['group_side',['../include_2group_8php.html#a6a69bd7be032fa8ce4e49c43a42cc6e9',1,'group.php']]],
+ ['groups_5fcontaining',['groups_containing',['../include_2group_8php.html#afb802ae2ce73aae4bc36d157f7b6a92f',1,'group.php']]],
+ ['guess_5fimage_5ftype',['guess_image_type',['../photo__driver_8php.html#a243cee492ce443afb6a7d77d54b6c4aa',1,'photo_driver.php']]]
+];
diff --git a/doc/html/search/all_68.html b/doc/html/search/all_68.html
new file mode 100644
index 000000000..dec41d62e
--- /dev/null
+++ b/doc/html/search/all_68.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_68.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/all_68.js b/doc/html/search/all_68.js
new file mode 100644
index 000000000..a3845cfd0
--- /dev/null
+++ b/doc/html/search/all_68.js
@@ -0,0 +1,36 @@
+var searchData=
+[
+ ['handle_5ftag',['handle_tag',['../item_8php.html#aa22feef4de326e1d7078dedd892e615c',1,'item.php']]],
+ ['has_5fpermissions',['has_permissions',['../items_8php.html#a77051724d1784074ff187e73a4db93fe',1,'items.php']]],
+ ['head_5fadd_5fcss',['head_add_css',['../plugin_8php.html#a23c4fccf1eb5fcd63b24783ba1f05f7a',1,'plugin.php']]],
+ ['head_5fadd_5fjs',['head_add_js',['../plugin_8php.html#a516591850f4fd49fd1425cfa54089db8',1,'plugin.php']]],
+ ['head_5fget_5fcss',['head_get_css',['../plugin_8php.html#af92789f559b89a380e49d303218aeeca',1,'plugin.php']]],
+ ['head_5fget_5ficon',['head_get_icon',['../classApp.html#af17df107f2216ddf5ad2a7e0f2ba2166',1,'App\head_get_icon()'],['../boot_8php.html#a24a7a70afedd5d85fe0eadc85afa9f77',1,'head_get_icon():&#160;boot.php']]],
+ ['head_5fget_5fjs',['head_get_js',['../plugin_8php.html#a65ab52cb1a7030d5190e247211bef2a1',1,'plugin.php']]],
+ ['head_5fremove_5fcss',['head_remove_css',['../plugin_8php.html#a9ab6caae31935f6cf781ce7872db7cdf',1,'plugin.php']]],
+ ['head_5fremove_5fjs',['head_remove_js',['../plugin_8php.html#a4a0ae7b881e7c8af99a69e3b03f898b4',1,'plugin.php']]],
+ ['head_5fset_5ficon',['head_set_icon',['../classApp.html#a8863703a0305eaa45eb970dbd2046291',1,'App\head_set_icon()'],['../boot_8php.html#a0e4701c9742c3ef88f02ac450a042a84',1,'head_set_icon():&#160;boot.php']]],
+ ['help',['help',['../namespacefriendica-to-smarty-tpl.html#af6b2c793958aae2aadc294577431f749',1,'friendica-to-smarty-tpl.help()'],['../namespaceupdatetpl.html#ac9d11279fed403a329a719298feafc4f',1,'updatetpl.help()']]],
+ ['help_2ephp',['help.php',['../help_8php.html',1,'']]],
+ ['help_5fcontent',['help_content',['../help_8php.html#af055e15f600ffa6fbca9386fdf715224',1,'help.php']]],
+ ['home_2ephp',['home.php',['../home_8php.html',1,'']]],
+ ['home_5fcontent',['home_content',['../home_8php.html#aa1cf697851a646755baf537f75334c46',1,'home.php']]],
+ ['home_5finit',['home_init',['../home_8php.html#ac4642c38b6f23a8d065dd4a75c620bde',1,'home.php']]],
+ ['hostxrd_2ephp',['hostxrd.php',['../hostxrd_8php.html',1,'']]],
+ ['hostxrd_5finit',['hostxrd_init',['../hostxrd_8php.html#aa37ffc8e7900bc76c4828bd25916db92',1,'hostxrd.php']]],
+ ['html2bb_5fvideo',['html2bb_video',['../text_8php.html#a138a3a611fa7f4f3630674145fc826bf',1,'text.php']]],
+ ['html2bbcode',['html2bbcode',['../html2bbcode_8php.html#a5ad726995ac4070213abdb3bd09f4837',1,'html2bbcode.php']]],
+ ['html2bbcode_2ephp',['html2bbcode.php',['../html2bbcode_8php.html',1,'']]],
+ ['html2plain',['html2plain',['../html2plain_8php.html#ab3e121fa9f3feb16f9f942e705bc6c04',1,'html2plain.php']]],
+ ['html2plain_2ephp',['html2plain.php',['../html2plain_8php.html',1,'']]],
+ ['htmlactionspanel',['htmlActionsPanel',['../classRedBrowser.html#a7f6bf0bda07833f4c647557bd172e349',1,'RedBrowser']]],
+ ['http_5fstatus_5fexit',['http_status_exit',['../include_2network_8php.html#a4cfb2c05a1c295317283d762440ce0b2',1,'network.php']]],
+ ['hubloc_5fflags_5fdeleted',['HUBLOC_FLAGS_DELETED',['../boot_8php.html#a7c286add8961fd2d79216314cd4aadd8',1,'boot.php']]],
+ ['hubloc_5fflags_5fprimary',['HUBLOC_FLAGS_PRIMARY',['../boot_8php.html#a3ad9cc5d4354be741fa1de12b96e9955',1,'boot.php']]],
+ ['hubloc_5fflags_5funverified',['HUBLOC_FLAGS_UNVERIFIED',['../boot_8php.html#ab54b24cc302e1a42a67a49d788b6b764',1,'boot.php']]],
+ ['hubloc_5fnotused',['HUBLOC_NOTUSED',['../boot_8php.html#aa589421267f0c2f0d643f727792cce35',1,'boot.php']]],
+ ['hubloc_5foffline',['HUBLOC_OFFLINE',['../boot_8php.html#a845891f82bf6edd7fa2d578b66703112',1,'boot.php']]],
+ ['hubloc_5freceive_5ferror',['HUBLOC_RECEIVE_ERROR',['../boot_8php.html#abeb4d86e17cefa8584f1244e2183b0e1',1,'boot.php']]],
+ ['hubloc_5fsend_5ferror',['HUBLOC_SEND_ERROR',['../boot_8php.html#a3b56bfc6a0dd159070e316ddac3b7456',1,'boot.php']]],
+ ['hubloc_5fworks',['HUBLOC_WORKS',['../boot_8php.html#a7a8ba64d089cc0412c59a2eefc6d655c',1,'boot.php']]]
+];
diff --git a/doc/html/search/all_69.html b/doc/html/search/all_69.html
new file mode 100644
index 000000000..192e4bab2
--- /dev/null
+++ b/doc/html/search/all_69.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_69.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/all_69.js b/doc/html/search/all_69.js
new file mode 100644
index 000000000..c00bab0c3
--- /dev/null
+++ b/doc/html/search/all_69.js
@@ -0,0 +1,88 @@
+var searchData=
+[
+ ['identity_2ephp',['identity.php',['../identity_8php.html',1,'']]],
+ ['identity_5fbasic_5fexport',['identity_basic_export',['../identity_8php.html#a3570a4eb77332b292d394c4132cb8f03',1,'identity.php']]],
+ ['identity_5fcheck_5fservice_5fclass',['identity_check_service_class',['../identity_8php.html#ac9fcd5c4c371998790b5c55c3d0f4633',1,'identity.php']]],
+ ['ids_5fto_5fquerystr',['ids_to_querystr',['../text_8php.html#a436a8de00c942364c2d0fcfc7e1f4b5a',1,'text.php']]],
+ ['if',['if',['../php2po_8php.html#a45b05625748f412ec97afcd61cf7980b',1,'if():&#160;php2po.php'],['../php_2default_8php.html#a23bc1996b18e69c1a3ab44536613a762',1,'if():&#160;default.php'],['../full_8php.html#a6fac1b4b8cdfde06ea1b7713479e92db',1,'if():&#160;full.php'],['../apw_2php_2style_8php.html#a883f9f14e205f7aa7de02c14df67b40a',1,'if():&#160;style.php'],['../redbasic_2php_2style_8php.html#a883f9f14e205f7aa7de02c14df67b40a',1,'if():&#160;style.php']]],
+ ['imagestring',['imageString',['../classphoto__driver.html#abc9f73ad90923772d52b9fcc4eb117dd',1,'photo_driver\imageString()'],['../classphoto__gd.html#a0795fc029be382557ae3f6e285f40e00',1,'photo_gd\imageString()'],['../classphoto__imagick.html#a70adbef31128c0ac8cbc5dcf34cdb019',1,'photo_imagick\imageString()']]],
+ ['import_2ephp',['import.php',['../import_8php.html',1,'']]],
+ ['import_5fauthor_5fxchan',['import_author_xchan',['../items_8php.html#ae73794179b62d39bb597ff670ab1c1e5',1,'items.php']]],
+ ['import_5fauthor_5fzot',['import_author_zot',['../zot_8php.html#ad149f1e98c0c5b88ff9147e6ee3f330d',1,'zot.php']]],
+ ['import_5fchannel_5fphoto',['import_channel_photo',['../photo__driver_8php.html#a1d0bc7161dec0d177b7d3bbe4421af9a',1,'photo_driver.php']]],
+ ['import_5fcontent',['import_content',['../import_8php.html#afdf25ed70096d5dbf4f6d0ca79fea184',1,'import.php']]],
+ ['import_5fdirectory_5fkeywords',['import_directory_keywords',['../zot_8php.html#a3bf11286c2619b4ca28e49d5b5ab374a',1,'zot.php']]],
+ ['import_5fdirectory_5fprofile',['import_directory_profile',['../zot_8php.html#aeec89da5b6ff090c63a79de4de884a35',1,'zot.php']]],
+ ['import_5fpost',['import_post',['../import_8php.html#af17fef0410518f7eac205d0ea416eaa2',1,'import.php']]],
+ ['import_5fprofile_5fphoto',['import_profile_photo',['../photo__driver_8php.html#a78f5a10c568d2a9bbbb129dc96548887',1,'photo_driver.php']]],
+ ['import_5fsite',['import_site',['../zot_8php.html#a2657e141d62d5f67ad3c87651b585299',1,'zot.php']]],
+ ['import_5fxchan',['import_xchan',['../zot_8php.html#a56f3f65514e4e7f0cd117d01735aebd1',1,'zot.php']]],
+ ['in_5farrayi',['in_arrayi',['../text_8php.html#a75c326298519ed14ebe762194c8a3f2a',1,'text.php']]],
+ ['info',['info',['../boot_8php.html#adfb2fc7be5a4226c0a8e24131da9d498',1,'boot.php']]],
+ ['insert_5fhook',['insert_hook',['../plugin_8php.html#aeaebe63dcf6fa2794f363ba2bc0b2c6b',1,'plugin.php']]],
+ ['install',['install',['../classdba__driver.html#a4ccb27243e62a8ca30dd8e1b8cc67746',1,'dba_driver']]],
+ ['install_5fplugin',['install_plugin',['../plugin_8php.html#a482131013272a1d5d5c1b1469c6c55d5',1,'plugin.php']]],
+ ['invite_2ephp',['invite.php',['../invite_8php.html',1,'']]],
+ ['invite_5fcontent',['invite_content',['../invite_8php.html#a244385b28cfd021d308715f01158bfd9',1,'invite.php']]],
+ ['invite_5fpost',['invite_post',['../invite_8php.html#aeb0881c0f93c8e8552e5ed756ce6e5a5',1,'invite.php']]],
+ ['is_5fa_5fdate_5farg',['is_a_date_arg',['../text_8php.html#a1557112a774ec00fa06ed6b6f6495506',1,'text.php']]],
+ ['is_5fajax',['is_ajax',['../boot_8php.html#ac17fc8a416ea79e9d5cb4dc9a8ff8c5c',1,'boot.php']]],
+ ['is_5fcommentable',['is_commentable',['../classConversation.html#a8b47c92b69459d461ea3cc9aae9597a3',1,'Conversation\is_commentable()'],['../classItem.html#ac04525a8be24c12b0a2ae4ca1ba4b967',1,'Item\is_commentable()']]],
+ ['is_5fforeigner',['is_foreigner',['../identity_8php.html#ae2b140df652a55ca11bb6a99005fce35',1,'identity.php']]],
+ ['is_5fmember',['is_member',['../identity_8php.html#a9637c557e13d9671f3eeb124ab98212a',1,'identity.php']]],
+ ['is_5fpreview',['is_preview',['../classConversation.html#adf25ce023b69a166c63c6e84e02c136a',1,'Conversation']]],
+ ['is_5fsite_5fadmin',['is_site_admin',['../boot_8php.html#aa1e828bbbcba170265eb2668d8daf42e',1,'boot.php']]],
+ ['is_5fthreaded',['is_threaded',['../classItem.html#a5b2fafdca55aefeaa08993a5a60529f0',1,'Item']]],
+ ['is_5ftoplevel',['is_toplevel',['../classItem.html#aa49e40f961dff66da32c5ae110e32993',1,'Item']]],
+ ['is_5fvalid',['is_valid',['../classphoto__driver.html#a97289aef3be43d9435ca3717ef10b8ab',1,'photo_driver']]],
+ ['is_5fvisiting',['is_visiting',['../classItem.html#a97c7feeea7f26a73176cb19faa455e12',1,'Item']]],
+ ['is_5fwall_5fto_5fwall',['is_wall_to_wall',['../classItem.html#aabf87ded59c25b5fe2b2296678e70509',1,'Item']]],
+ ['is_5fwritable',['is_writable',['../classConversation.html#a5879199008b96bee7550b576d614e1c1',1,'Conversation']]],
+ ['item',['Item',['../classItem.html',1,'']]],
+ ['item_2ephp',['item.php',['../item_8php.html',1,'']]],
+ ['item_5fblocked',['ITEM_BLOCKED',['../boot_8php.html#ab28dc518fa90b6f617dd8c564eb4f35f',1,'boot.php']]],
+ ['item_5fbug',['ITEM_BUG',['../boot_8php.html#a87b0f279f8413c7e4d805c5d85f20d34',1,'boot.php']]],
+ ['item_5fbuildblock',['ITEM_BUILDBLOCK',['../boot_8php.html#a7fc4b291a7cdaa48b38e27344ea183cf',1,'boot.php']]],
+ ['item_5fcheck_5fservice_5fclass',['item_check_service_class',['../item_8php.html#a5b1b36cb301a94b38150074f0d424e74',1,'item.php']]],
+ ['item_5fcontent',['item_content',['../item_8php.html#a764bbb2e9a885a86fb23d0b5e4a09221',1,'item.php']]],
+ ['item_5fdelayed_5fpublish',['ITEM_DELAYED_PUBLISH',['../boot_8php.html#ac890557fedc5b5a3b1d996249b1e1a20',1,'boot.php']]],
+ ['item_5fdeleted',['ITEM_DELETED',['../boot_8php.html#a3515ea6bf77495de89b93e9ccd881c49',1,'boot.php']]],
+ ['item_5fexpire',['item_expire',['../items_8php.html#a6f7e1334af5d684a987fa6a3eb37f4cc',1,'items.php']]],
+ ['item_5fextract_5fimages',['item_extract_images',['../conversation_8php.html#a0ee05f15255fb1cc3d89f30bc378a654',1,'conversation.php']]],
+ ['item_5fgetfeedattach',['item_getfeedattach',['../items_8php.html#a09d425596b9f8663472cf7474ad36d96',1,'items.php']]],
+ ['item_5fgetfeedtags',['item_getfeedtags',['../items_8php.html#a649dc3e53ed794d0ead4b5d037f8d8d7',1,'items.php']]],
+ ['item_5fhidden',['ITEM_HIDDEN',['../boot_8php.html#ac99fc4d040764eac1736bec6973556fe',1,'boot.php']]],
+ ['item_5fmentionsme',['ITEM_MENTIONSME',['../boot_8php.html#a8da836617174eed9fc2ac8054125354b',1,'boot.php']]],
+ ['item_5fmessage_5fid',['item_message_id',['../text_8php.html#aa6b0aa8afbeab50d1a3058ad21acb74e',1,'text.php']]],
+ ['item_5fmoderated',['ITEM_MODERATED',['../boot_8php.html#ac01230c7655e0705b2e99c9bc03c4450',1,'boot.php']]],
+ ['item_5fnocomment',['ITEM_NOCOMMENT',['../boot_8php.html#a949116d9a295b214293006c060ca4848',1,'boot.php']]],
+ ['item_5fnotshown',['ITEM_NOTSHOWN',['../boot_8php.html#a8663f32171568489dbb2a01dd00371f8',1,'boot.php']]],
+ ['item_5fnsfw',['ITEM_NSFW',['../boot_8php.html#a939de9a99278f4fd7dcd0ee67f243f08',1,'boot.php']]],
+ ['item_5fobscured',['ITEM_OBSCURED',['../boot_8php.html#a2c8906f1af94a3559a5b4661067bb79d',1,'boot.php']]],
+ ['item_5forigin',['ITEM_ORIGIN',['../boot_8php.html#a8c9dce0ef27b35397e29298eb966f7f7',1,'boot.php']]],
+ ['item_5fpdl',['ITEM_PDL',['../boot_8php.html#a6e57d913634d033b4d5ad72d99fd3e9d',1,'boot.php']]],
+ ['item_5fpermissions_5fsql',['item_permissions_sql',['../security_8php.html#a9355488460ab11d6058656ff919e5cf9',1,'security.php']]],
+ ['item_5fphoto_5fmenu',['item_photo_menu',['../conversation_8php.html#aacbb12d372d5e9c3ab0735b4aea48fb3',1,'conversation.php']]],
+ ['item_5fpost',['item_post',['../item_8php.html#a693cd09805755ab85bbb5ecae69a48c3',1,'item.php']]],
+ ['item_5fpost_5ftype',['item_post_type',['../text_8php.html#ac1dbf2e37e8069bea2c0f557fdbf203e',1,'text.php']]],
+ ['item_5fredir_5fand_5freplace_5fimages',['item_redir_and_replace_images',['../conversation_8php.html#adda79b75bf1ccf6ce9503aa310953533',1,'conversation.php']]],
+ ['item_5frelay',['ITEM_RELAY',['../boot_8php.html#a2958a2bd5422b85329d7c36c06dbc221',1,'boot.php']]],
+ ['item_5fspam',['ITEM_SPAM',['../boot_8php.html#a40d885b2cfd736aab4234ae641ca4dfb',1,'boot.php']]],
+ ['item_5fstarred',['ITEM_STARRED',['../boot_8php.html#a7af107fab8d62b9a73801713b774ed30',1,'boot.php']]],
+ ['item_5fstore',['item_store',['../items_8php.html#a2541e6861a56d145c9281877cc501615',1,'items.php']]],
+ ['item_5fstore_5fupdate',['item_store_update',['../items_8php.html#acf0bf7c9d21ac84f32effb754f7ad484',1,'items.php']]],
+ ['item_5fthread_5ftop',['ITEM_THREAD_TOP',['../boot_8php.html#a749144d8dd9c1366596a0213c277d050',1,'boot.php']]],
+ ['item_5funpublished',['ITEM_UNPUBLISHED',['../boot_8php.html#adaeb4f590c56326b2dca3b19f31b6272',1,'boot.php']]],
+ ['item_5funseen',['ITEM_UNSEEN',['../boot_8php.html#a009e6a0637cb65804ea8094ecc4450b0',1,'boot.php']]],
+ ['item_5fuplink',['ITEM_UPLINK',['../boot_8php.html#aefba06f1c0842036329033e7567ecf6d',1,'boot.php']]],
+ ['item_5fuplink_5fprv',['ITEM_UPLINK_PRV',['../boot_8php.html#aad33b494084f729b6ee3b0bc457718a1',1,'boot.php']]],
+ ['item_5fverified',['ITEM_VERIFIED',['../boot_8php.html#a18a400fa45e5632811b33041d8c048bf',1,'boot.php']]],
+ ['item_5fvisible',['ITEM_VISIBLE',['../boot_8php.html#ab55b16ae7fc19fafe5afaedd49163bbf',1,'boot.php']]],
+ ['item_5fwall',['ITEM_WALL',['../boot_8php.html#a6788e99021ec8ffb0fa94d651f22a322',1,'boot.php']]],
+ ['item_5fwebpage',['ITEM_WEBPAGE',['../boot_8php.html#af489d0c3166551b93e63a79ff2c9be35',1,'boot.php']]],
+ ['itemobject_2ephp',['ItemObject.php',['../ItemObject_8php.html',1,'']]],
+ ['itemplateengine',['ITemplateEngine',['../interfaceITemplateEngine.html',1,'']]],
+ ['itemplateengine_2ephp',['ITemplateEngine.php',['../ITemplateEngine_8php.html',1,'']]],
+ ['items_2ephp',['items.php',['../items_8php.html',1,'']]],
+ ['items_5ffetch',['items_fetch',['../items_8php.html#a756738301f2ed96be50232500677d58a',1,'items.php']]]
+];
diff --git a/doc/html/search/all_6a.html b/doc/html/search/all_6a.html
new file mode 100644
index 000000000..6d8c91cd3
--- /dev/null
+++ b/doc/html/search/all_6a.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_6a.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/all_6a.js b/doc/html/search/all_6a.js
new file mode 100644
index 000000000..4c01dbd84
--- /dev/null
+++ b/doc/html/search/all_6a.js
@@ -0,0 +1,7 @@
+var searchData=
+[
+ ['jindent',['jindent',['../text_8php.html#ae17b39d5e321debd3ad16dcbbde842b8',1,'text.php']]],
+ ['jpeg_5fquality',['JPEG_QUALITY',['../boot_8php.html#a3475ff6c2e575f946ea0ee377e944173',1,'boot.php']]],
+ ['json_5fdecode_5fplus',['json_decode_plus',['../text_8php.html#a0271381208acfa2d4cff36da281e3e23',1,'text.php']]],
+ ['json_5freturn_5fand_5fdie',['json_return_and_die',['../include_2network_8php.html#a4c5d50079e089168d9248427018fffd4',1,'network.php']]]
+];
diff --git a/doc/html/search/all_6b.html b/doc/html/search/all_6b.html
new file mode 100644
index 000000000..d70dca016
--- /dev/null
+++ b/doc/html/search/all_6b.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_6b.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/all_6b.js b/doc/html/search/all_6b.js
new file mode 100644
index 000000000..cb620eeee
--- /dev/null
+++ b/doc/html/search/all_6b.js
@@ -0,0 +1,5 @@
+var searchData=
+[
+ ['key_5fnot_5fexists',['KEY_NOT_EXISTS',['../template__processor_8php.html#a797745996c7839a93b2ab1af456631ab',1,'template_processor.php']]],
+ ['killme',['killme',['../boot_8php.html#aea7fc57a4d8e9dcb42f2601b0b9b761c',1,'boot.php']]]
+];
diff --git a/doc/html/search/all_6c.html b/doc/html/search/all_6c.html
new file mode 100644
index 000000000..ae8bc48da
--- /dev/null
+++ b/doc/html/search/all_6c.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_6c.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/all_6c.js b/doc/html/search/all_6c.js
new file mode 100644
index 000000000..1760a1eca
--- /dev/null
+++ b/doc/html/search/all_6c.js
@@ -0,0 +1,49 @@
+var searchData=
+[
+ ['lang_5fselector',['lang_selector',['../text_8php.html#a71f6952243d3fe1c5a8154f78027e29c',1,'text.php']]],
+ ['language_2ephp',['language.php',['../language_8php.html',1,'']]],
+ ['language_5fdetect_5fmin_5fconfidence',['LANGUAGE_DETECT_MIN_CONFIDENCE',['../boot_8php.html#a68d1d5bc9c7ccb663dc671b48c66df11',1,'boot.php']]],
+ ['language_5fdetect_5fmin_5flength',['LANGUAGE_DETECT_MIN_LENGTH',['../boot_8php.html#a17cf72338b040891781a4bcbdd9a8595',1,'boot.php']]],
+ ['layout_5fselect',['layout_select',['../text_8php.html#a3999a0b3e22e440f280ee791ce34d384',1,'text.php']]],
+ ['layouts_2ephp',['layouts.php',['../layouts_8php.html',1,'']]],
+ ['layouts_5fcontent',['layouts_content',['../layouts_8php.html#a6e0193759ad9eef76d3df2db24237b50',1,'layouts.php']]],
+ ['ldelim',['ldelim',['../namespacefriendica-to-smarty-tpl.html#a0b4cf73d1a8d201a28d269eeb62a5d5c',1,'friendica-to-smarty-tpl']]],
+ ['legal_5fwebbie',['legal_webbie',['../text_8php.html#a2690ad67bb6fb97ef69de3e8d23f2728',1,'text.php']]],
+ ['like_2ephp',['like.php',['../like_8php.html',1,'']]],
+ ['like_5fcontent',['like_content',['../like_8php.html#a9d7dd268f21c21e9d29dd2aca2dd9538',1,'like.php']]],
+ ['like_5fpuller',['like_puller',['../conversation_8php.html#afe5b2f38d8b803edb0d7ec5fa2868db0',1,'conversation.php']]],
+ ['limit_5fbody_5fsize',['limit_body_size',['../items_8php.html#af94c281016c6c912d06e064113336c5c',1,'items.php']]],
+ ['link_5fcompare',['link_compare',['../text_8php.html#a47c1e4a5f3f53027daacd8a9db24f285',1,'text.php']]],
+ ['linkify',['linkify',['../text_8php.html#a11255c8c4e5245b6c24f97684826aa54',1,'text.php']]],
+ ['list_5fpublic_5fsites',['list_public_sites',['../dirsearch_8php.html#a985d410a170549429857af6ff2673149',1,'dirsearch.php']]],
+ ['load',['load',['../classphoto__driver.html#a19e1af2b6af4c63aa6230abe69f83712',1,'photo_driver\load()'],['../classphoto__gd.html#a33092b889875b68bfb1c97ff123012d9',1,'photo_gd\load()'],['../classphoto__imagick.html#a2c9168f110ccd6c264095d766615dfa8',1,'photo_imagick\load()']]],
+ ['load_5fconfig',['load_config',['../include_2config_8php.html#a27559f388c9b9af81c94e48d6889d1d1',1,'config.php']]],
+ ['load_5fcontact_5flinks',['load_contact_links',['../boot_8php.html#a719c7f3972d5f9268f37a41c76cd4ef6',1,'boot.php']]],
+ ['load_5fdatabase',['load_database',['../setup_8php.html#ad2e0375a9ab87ebe6e78124ee125054a',1,'setup.php']]],
+ ['load_5fdatabase_5frem',['load_database_rem',['../setup_8php.html#a2b375ddc555140236fc500135de99371',1,'setup.php']]],
+ ['load_5fhooks',['load_hooks',['../plugin_8php.html#a326365e48ef94f0b9a0a771b8d75e813',1,'plugin.php']]],
+ ['load_5fpconfig',['load_pconfig',['../include_2config_8php.html#ac543813a980b3841cc5a277fcd4a24a6',1,'config.php']]],
+ ['load_5fplugin',['load_plugin',['../plugin_8php.html#a9ca9632b7309a65b05c03a3e2f473a3d',1,'plugin.php']]],
+ ['load_5ftranslation_5ftable',['load_translation_table',['../language_8php.html#a7e9904c730bb24ddcb0ff50fc96f6b05',1,'language.php']]],
+ ['load_5fxconfig',['load_xconfig',['../include_2config_8php.html#a55bbed9a014c9109c767486834f3ca33',1,'config.php']]],
+ ['local_5fuser',['local_user',['../boot_8php.html#ad4c9dc2c8a82e8f52b7404c1655eab44',1,'boot.php']]],
+ ['localize_5fitem',['localize_item',['../conversation_8php.html#a9bd7f9fb6678736c581bcba3b17f471c',1,'conversation.php']]],
+ ['lockview_2ephp',['lockview.php',['../lockview_8php.html',1,'']]],
+ ['lockview_5fcontent',['lockview_content',['../lockview_8php.html#a851e26ab9a1008df5c5ebebea31e9b44',1,'lockview.php']]],
+ ['logger',['logger',['../text_8php.html#a030fa5ecc64168af0c4f44897a9bce63',1,'text.php']]],
+ ['logger_5fall',['LOGGER_ALL',['../boot_8php.html#afe63ae69ba55299f813766e54df06ede',1,'boot.php']]],
+ ['logger_5fdata',['LOGGER_DATA',['../boot_8php.html#a6969947145a139ec374ce098224d8e81',1,'boot.php']]],
+ ['logger_5fdebug',['LOGGER_DEBUG',['../boot_8php.html#a93823d15ae07548a4c49de88d325cd26',1,'boot.php']]],
+ ['logger_5fnormal',['LOGGER_NORMAL',['../boot_8php.html#a17b4ea23d9ecf628d9c8f53b7abcb805',1,'boot.php']]],
+ ['logger_5ftrace',['LOGGER_TRACE',['../boot_8php.html#a022cea669f9f13ef7c6268b63884c57f',1,'boot.php']]],
+ ['login',['login',['../boot_8php.html#aefecf8599036df7f1b95d6820e0e2fa4',1,'boot.php']]],
+ ['login_2ephp',['login.php',['../login_8php.html',1,'']]],
+ ['login_5fcontent',['login_content',['../login_8php.html#a1d69ca88eb9005a7026e128b9a645904',1,'login.php']]],
+ ['loginuser',['loginUser',['../classFKOAuth1.html#a2b1dac2ed31fc6ef84668afdda8b263f',1,'FKOAuth1']]],
+ ['lookup_5fconsumer',['lookup_consumer',['../classFKOAuthDataStore.html#a1148d47b546350bf440bdd92792c5df1',1,'FKOAuthDataStore']]],
+ ['lookup_5fnonce',['lookup_nonce',['../classFKOAuthDataStore.html#a4edfe2e77ecd2e16ff6b5eb516ed3599',1,'FKOAuthDataStore']]],
+ ['lookup_5ftoken',['lookup_token',['../classFKOAuthDataStore.html#a96f76387c3a93b0abe27a98013804bab',1,'FKOAuthDataStore']]],
+ ['lostpass_2ephp',['lostpass.php',['../lostpass_8php.html',1,'']]],
+ ['lostpass_5fcontent',['lostpass_content',['../lostpass_8php.html#a0314d94e48c789b1b3a201d740c9eab3',1,'lostpass.php']]],
+ ['lostpass_5fpost',['lostpass_post',['../lostpass_8php.html#a8ed35ba71a4404eaf4903da61d0321cc',1,'lostpass.php']]]
+];
diff --git a/doc/html/search/all_6d.html b/doc/html/search/all_6d.html
new file mode 100644
index 000000000..ee90718ff
--- /dev/null
+++ b/doc/html/search/all_6d.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_6d.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/all_6d.js b/doc/html/search/all_6d.js
new file mode 100644
index 000000000..5239f1a6f
--- /dev/null
+++ b/doc/html/search/all_6d.js
@@ -0,0 +1,62 @@
+var searchData=
+[
+ ['magic_2ephp',['magic.php',['../magic_8php.html',1,'']]],
+ ['magic_5finit',['magic_init',['../magic_8php.html#acea2cc792849ca2d71d4b689f66518bf',1,'magic.php']]],
+ ['magic_5flink',['magic_link',['../text_8php.html#a1e510c53624933ce9b7d6715784894db',1,'text.php']]],
+ ['magiclink_5furl',['magiclink_url',['../text_8php.html#a24d441d30df4b8e6bf6780bf62a5e2c6',1,'text.php']]],
+ ['mail_2ephp',['mail.php',['../mail_8php.html',1,'']]],
+ ['mail_5fcontent',['mail_content',['../mail_8php.html#a3c7c485fc69f92371e8b20936040eca1',1,'mail.php']]],
+ ['mail_5fdeleted',['MAIL_DELETED',['../boot_8php.html#ad0876e837cf3fad8a26417e315f6e2c8',1,'boot.php']]],
+ ['mail_5fisreply',['MAIL_ISREPLY',['../boot_8php.html#aa544a6c078130d0967a1f4ed8ce0a2d2',1,'boot.php']]],
+ ['mail_5fobscured',['MAIL_OBSCURED',['../boot_8php.html#a44ae1542a805ffd7f826fb511db07374',1,'boot.php']]],
+ ['mail_5fpost',['mail_post',['../mail_8php.html#acfc2cc0bf4e0b178207758384977f25a',1,'mail.php']]],
+ ['mail_5frecalled',['MAIL_RECALLED',['../boot_8php.html#ae4861de36017fe399c1839f778bad9f5',1,'boot.php']]],
+ ['mail_5freplied',['MAIL_REPLIED',['../boot_8php.html#aa3679df31c8dad1b71816b0322d5baff',1,'boot.php']]],
+ ['mail_5fseen',['MAIL_SEEN',['../boot_8php.html#a1fbb93cf030f07391f22cc2948744869',1,'boot.php']]],
+ ['mail_5fstore',['mail_store',['../items_8php.html#a77da7ce9a117601d49ac4a67c71b514f',1,'items.php']]],
+ ['manage_2ephp',['manage.php',['../manage_8php.html',1,'']]],
+ ['manage_5fcontent',['manage_content',['../manage_8php.html#a2bca247b5296827638959138367db4f5',1,'manage.php']]],
+ ['manual_5fconfig',['manual_config',['../setup_8php.html#abe405d227ba7232971964a706d4f3bce',1,'setup.php']]],
+ ['map_5fscope',['map_scope',['../items_8php.html#ac1fcf621dce7370515b420a7753f4726',1,'items.php']]],
+ ['marital_5fselector',['marital_selector',['../profile__selectors_8php.html#a7473dd095987e1cdcc79d4f0bb5e6798',1,'profile_selectors.php']]],
+ ['match_2ephp',['match.php',['../match_8php.html',1,'']]],
+ ['match_5fcontent',['match_content',['../match_8php.html#a1dd853e959b9e70c1911bb2fb5f5130d',1,'match.php']]],
+ ['max_5fimage_5flength',['MAX_IMAGE_LENGTH',['../boot_8php.html#a525ca93ff35d3535d1a2b8ba57876afa',1,'boot.php']]],
+ ['max_5flikers',['MAX_LIKERS',['../boot_8php.html#a35625dacd2158b9f1f1a8e77f9f081fd',1,'boot.php']]],
+ ['member_5fof',['member_of',['../include_2group_8php.html#a048f6892bfd28852de1b76470df411de',1,'group.php']]],
+ ['menu_2ephp',['menu.php',['../mod_2menu_8php.html',1,'']]],
+ ['menu_2ephp',['menu.php',['../include_2menu_8php.html',1,'']]],
+ ['menu_5fadd_5fitem',['menu_add_item',['../include_2menu_8php.html#add35fae5e9695031b3d46e30ac409eb8',1,'menu.php']]],
+ ['menu_5fcontent',['menu_content',['../mod_2menu_8php.html#a6fed23af14d71a78a4153c8363a685cf',1,'menu.php']]],
+ ['menu_5fcreate',['menu_create',['../include_2menu_8php.html#a08a800821721781a8dfffbe31481ff98',1,'menu.php']]],
+ ['menu_5fdel_5fitem',['menu_del_item',['../include_2menu_8php.html#a9aa8e0052dd47c1a93f53a983bd4620a',1,'menu.php']]],
+ ['menu_5fdelete',['menu_delete',['../include_2menu_8php.html#a3884bda4d85d84ec99447db9403a68d8',1,'menu.php']]],
+ ['menu_5fdelete_5fid',['menu_delete_id',['../include_2menu_8php.html#ad87f51ce85172bcc3f931aa0cd96a804',1,'menu.php']]],
+ ['menu_5fedit',['menu_edit',['../include_2menu_8php.html#a6a33c6a3db2a7510b16cc656edaec571',1,'menu.php']]],
+ ['menu_5fedit_5fitem',['menu_edit_item',['../include_2menu_8php.html#acb66f80ca895a6ccd562b3d9ae7b41aa',1,'menu.php']]],
+ ['menu_5ffetch',['menu_fetch',['../include_2menu_8php.html#a68ebbf492470c930f652013656f9071d',1,'menu.php']]],
+ ['menu_5ffetch_5fid',['menu_fetch_id',['../include_2menu_8php.html#a47447c01ba8ea04cd74af1d4c5b68fc7',1,'menu.php']]],
+ ['menu_5fitem_5fnewwin',['MENU_ITEM_NEWWIN',['../boot_8php.html#ad11f30a6590d3d77f0c5e1e3909af8f5',1,'boot.php']]],
+ ['menu_5fitem_5fzid',['MENU_ITEM_ZID',['../boot_8php.html#aed0dfb35f7dd00dc9e4f868ea7f7ff53',1,'boot.php']]],
+ ['menu_5flist',['menu_list',['../include_2menu_8php.html#acef15a498d52666b1c7e5c12765c689b',1,'menu.php']]],
+ ['menu_5fpost',['menu_post',['../mod_2menu_8php.html#aaa491ef173868fe002aece4632bcf393',1,'menu.php']]],
+ ['menu_5frender',['menu_render',['../include_2menu_8php.html#a890cc6237971e15f15702e6b2e88502e',1,'menu.php']]],
+ ['message_2ephp',['message.php',['../include_2message_8php.html',1,'']]],
+ ['message_2ephp',['message.php',['../mod_2message_8php.html',1,'']]],
+ ['message_5fcontent',['message_content',['../mod_2message_8php.html#ac72dfed3ce08fcb331d66b37edc6e15f',1,'message.php']]],
+ ['micropro',['micropro',['../text_8php.html#a2a902f5fdba8646333e997898ac45ea3',1,'text.php']]],
+ ['mimetype_5fselect',['mimetype_select',['../text_8php.html#a1633412120f52bdce5f43e0a127d9293',1,'text.php']]],
+ ['mini_5fgroup_5fselect',['mini_group_select',['../include_2group_8php.html#ab0e422a0f31c0c64fd9084ca03d85f32',1,'group.php']]],
+ ['minimal_2ephp',['minimal.php',['../minimal_8php.html',1,'']]],
+ ['minimalisticdarkness_2ephp',['minimalisticdarkness.php',['../minimalisticdarkness_8php.html',1,'']]],
+ ['mitem_2ephp',['mitem.php',['../mitem_8php.html',1,'']]],
+ ['mitem_5fcontent',['mitem_content',['../mitem_8php.html#a7a31b702ecad18eeb6a38b243ff0037e',1,'mitem.php']]],
+ ['mitem_5finit',['mitem_init',['../mitem_8php.html#a9627cd857cafdf04e4fc0ae48c8e8518',1,'mitem.php']]],
+ ['mitem_5fpost',['mitem_post',['../mitem_8php.html#a6ee694cca4b551a20d7c7a94b5243ec1',1,'mitem.php']]],
+ ['mod_5fimport_2ephp',['mod_import.php',['../mod__import_8php.html',1,'']]],
+ ['mood_2ephp',['mood.php',['../mood_8php.html',1,'']]],
+ ['mood_5fcontent',['mood_content',['../mood_8php.html#a721b9b6703b3234a005641c92d409b8f',1,'mood.php']]],
+ ['mood_5finit',['mood_init',['../mood_8php.html#a7ae136dd7476865b4828136175db5022',1,'mood.php']]],
+ ['msearch_2ephp',['msearch.php',['../msearch_8php.html',1,'']]],
+ ['msearch_5fpost',['msearch_post',['../msearch_8php.html#ac80d2a6c0a92e79eec7efbbccd74d9a8',1,'msearch.php']]]
+];
diff --git a/doc/html/search/all_6e.html b/doc/html/search/all_6e.html
new file mode 100644
index 000000000..e0fd7653a
--- /dev/null
+++ b/doc/html/search/all_6e.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_6e.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/all_6e.js b/doc/html/search/all_6e.js
new file mode 100644
index 000000000..6dfd8d4fc
--- /dev/null
+++ b/doc/html/search/all_6e.js
@@ -0,0 +1,85 @@
+var searchData=
+[
+ ['n',['n',['../php2po_8php.html#a1594a11499d06cc8a789ee7ca0c7a12b',1,'php2po.php']]],
+ ['names',['names',['../namespaceupdatetpl.html#ab42dd79af65ee82201fd6f04715f62f6',1,'updatetpl']]],
+ ['nameslist',['namesList',['../docblox__errorchecker_8php.html#a2b767cfc461fdd5061fffc9e4a806d5b',1,'docblox_errorchecker.php']]],
+ ['namespace_5factivity',['NAMESPACE_ACTIVITY',['../boot_8php.html#a5df5359090d1f8e898c36d7cf8878ad2',1,'boot.php']]],
+ ['namespace_5factivity_5fschema',['NAMESPACE_ACTIVITY_SCHEMA',['../boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133',1,'boot.php']]],
+ ['namespace_5fatom1',['NAMESPACE_ATOM1',['../boot_8php.html#a444ce608ce34efb82ee11852f36e825f',1,'boot.php']]],
+ ['namespace_5fdfrn',['NAMESPACE_DFRN',['../boot_8php.html#a7ed4581ab66ebcde97f6b3730856b028',1,'boot.php']]],
+ ['namespace_5ffeed',['NAMESPACE_FEED',['../boot_8php.html#ac195fc9003298923ea81f144388e24b1',1,'boot.php']]],
+ ['namespace_5fgeorss',['NAMESPACE_GEORSS',['../boot_8php.html#a03d19251c245587de7ed959300b87bdf',1,'boot.php']]],
+ ['namespace_5fmedia',['NAMESPACE_MEDIA',['../boot_8php.html#a6626f383c3d2d459f731ab8b4f237d16',1,'boot.php']]],
+ ['namespace_5fostatus',['NAMESPACE_OSTATUS',['../boot_8php.html#acca19aae62e1a6951a856b945de20d67',1,'boot.php']]],
+ ['namespace_5fostatussub',['NAMESPACE_OSTATUSSUB',['../boot_8php.html#a181c111f4b6c14d091dfd3bf0d0a22cd',1,'boot.php']]],
+ ['namespace_5fpoco',['NAMESPACE_POCO',['../boot_8php.html#a0b73e2548d6f9beb9c93211f488e336a',1,'boot.php']]],
+ ['namespace_5fsalmon_5fme',['NAMESPACE_SALMON_ME',['../boot_8php.html#aee324eca9de4e0fedf01ab5f92e27c67',1,'boot.php']]],
+ ['namespace_5fstatusnet',['NAMESPACE_STATUSNET',['../boot_8php.html#afaf93b7026f784b113b4f8921745891e',1,'boot.php']]],
+ ['namespace_5fthread',['NAMESPACE_THREAD',['../boot_8php.html#a1d6e7f4c08bb68e4a424326a811bdd86',1,'boot.php']]],
+ ['namespace_5ftomb',['NAMESPACE_TOMB',['../boot_8php.html#a4bfe22e163657690dfb6d5b1d04cb47e',1,'boot.php']]],
+ ['namespace_5fzot',['NAMESPACE_ZOT',['../boot_8php.html#a49f2a70b3b43aa904223a8d19e986a47',1,'boot.php']]],
+ ['nav',['nav',['../nav_8php.html#a43be0df73b90647ea70947ce004e231e',1,'nav.php']]],
+ ['nav_2ephp',['nav.php',['../nav_8php.html',1,'']]],
+ ['nav_5fset_5fselected',['nav_set_selected',['../nav_8php.html#ac3c920ce3ea5b0d9e0678ee37155f06a',1,'nav.php']]],
+ ['navbar_5fcomplete',['navbar_complete',['../acl_8php.html#a57dceff370d4a0e7ae673d50fbfda61f',1,'acl.php']]],
+ ['network_2ephp',['network.php',['../include_2network_8php.html',1,'']]],
+ ['network_2ephp',['network.php',['../mod_2network_8php.html',1,'']]],
+ ['network_5fcontent',['network_content',['../mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4',1,'network.php']]],
+ ['network_5fdfrn',['NETWORK_DFRN',['../boot_8php.html#ae3cef7b63e25e7bafea3fcf6b99fad0e',1,'boot.php']]],
+ ['network_5fdiaspora',['NETWORK_DIASPORA',['../boot_8php.html#a38f6c7fe33b5434a24b4314567753dfa',1,'boot.php']]],
+ ['network_5ffacebook',['NETWORK_FACEBOOK',['../boot_8php.html#af3905ea8f8568d0236db13fca40514e3',1,'boot.php']]],
+ ['network_5ffeed',['NETWORK_FEED',['../boot_8php.html#ab4bddb41a0cf407178ec5278b950c393',1,'boot.php']]],
+ ['network_5fgplus',['NETWORK_GPLUS',['../boot_8php.html#a8905fde0a5b7882bdc083b20d9b34701',1,'boot.php']]],
+ ['network_5finit',['network_init',['../mod_2network_8php.html#a180fce90ad11d7e0e45be094da7149ec',1,'network.php']]],
+ ['network_5flinkedin',['NETWORK_LINKEDIN',['../boot_8php.html#a5b043b7fdcfd4e8c9c3747574afc6caa',1,'boot.php']]],
+ ['network_5fmail',['NETWORK_MAIL',['../boot_8php.html#a7236b2cdcf59f02a42302e893a99013b',1,'boot.php']]],
+ ['network_5fmail2',['NETWORK_MAIL2',['../boot_8php.html#aa17a4f9c63f5cbc5c06f1066b6aebc42',1,'boot.php']]],
+ ['network_5fmyspace',['NETWORK_MYSPACE',['../boot_8php.html#ae94f7c7c0909629a75aed1c41f10bc95',1,'boot.php']]],
+ ['network_5fostatus',['NETWORK_OSTATUS',['../boot_8php.html#aef4b6c558c68c88c10f13c5a00c20e3d',1,'boot.php']]],
+ ['network_5fphantom',['NETWORK_PHANTOM',['../boot_8php.html#ab21fb0f3e6b962419955c6fc7f26734f',1,'boot.php']]],
+ ['network_5ftabs',['network_tabs',['../conversation_8php.html#a96b34b9d64d13c543e8163e52f5ce8c4',1,'conversation.php']]],
+ ['network_5fto_5fname',['network_to_name',['../contact__selectors_8php.html#ad472e4716426dd1a9dd77b62962454be',1,'contact_selectors.php']]],
+ ['network_5fxmpp',['NETWORK_XMPP',['../boot_8php.html#a43296b1b4398aacbf92a4b2d56bab91e',1,'boot.php']]],
+ ['network_5fzot',['NETWORK_ZOT',['../boot_8php.html#a2c65e925994566a63e6c03c381f1b4a0',1,'boot.php']]],
+ ['new_5faccess_5ftoken',['new_access_token',['../classFKOAuthDataStore.html#a434882f03e3cdb171ed89e09e337e934',1,'FKOAuthDataStore']]],
+ ['new_5fchannel_2ephp',['new_channel.php',['../new__channel_8php.html',1,'']]],
+ ['new_5fchannel_5fcontent',['new_channel_content',['../new__channel_8php.html#ae585191610f79da129492482ce8e2fee',1,'new_channel.php']]],
+ ['new_5fchannel_5finit',['new_channel_init',['../new__channel_8php.html#a1ad7f99e4366a32942c6b954aba3a164',1,'new_channel.php']]],
+ ['new_5fchannel_5fpost',['new_channel_post',['../new__channel_8php.html#a180b0646957db8290482f02454ad7f23',1,'new_channel.php']]],
+ ['new_5fcontact',['new_contact',['../include_2follow_8php.html#ae387d4ae097c23d69f3247e7f08140c7',1,'follow.php']]],
+ ['new_5fcookie',['new_cookie',['../session_8php.html#a4c0ead624f95483e386bc80abf570a8f',1,'session.php']]],
+ ['new_5fkeypair',['new_keypair',['../crypto_8php.html#aae0ab70d6a199b29555b1ac3cf250d6a',1,'crypto.php']]],
+ ['new_5frequest_5ftoken',['new_request_token',['../classFKOAuthDataStore.html#a431b44d70e3da6a8256ab38f710e3050',1,'FKOAuthDataStore']]],
+ ['newfilename',['newfilename',['../namespacefriendica-to-smarty-tpl.html#ad9ef87ccb2c9960501f5e02424a22d80',1,'friendica-to-smarty-tpl']]],
+ ['node2bbcode',['node2bbcode',['../html2bbcode_8php.html#ad174afe0ccbd8c475e48f8a6ee2f27d8',1,'html2bbcode.php']]],
+ ['node2bbcodesub',['node2bbcodesub',['../html2bbcode_8php.html#a39c662b19d318990fee2ba795a55d7a7',1,'html2bbcode.php']]],
+ ['none_2ephp',['none.php',['../none_8php.html',1,'']]],
+ ['normalise_5flink',['normalise_link',['../text_8php.html#a4bbb7d00c05cd20b4e043424f322388f',1,'text.php']]],
+ ['normalise_5fopenid',['normalise_openid',['../text_8php.html#adba17ec946f4285285dc100f7860bf51',1,'text.php']]],
+ ['notags',['notags',['../text_8php.html#a1af49756c8c71902a66c7e329c462beb',1,'text.php']]],
+ ['notes_2ephp',['notes.php',['../notes_8php.html',1,'']]],
+ ['notes_5finit',['notes_init',['../notes_8php.html#a4dbd7b1f906440746af48b484d66535a',1,'notes.php']]],
+ ['notice',['notice',['../boot_8php.html#a9255af5ae9c887520091ea04763c1a88',1,'boot.php']]],
+ ['notification',['notification',['../enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc',1,'enotify.php']]],
+ ['notifications_2ephp',['notifications.php',['../notifications_8php.html',1,'']]],
+ ['notifications_5fcontent',['notifications_content',['../notifications_8php.html#aadd0b5525bd8c283a5d8a37982bbfe62',1,'notifications.php']]],
+ ['notifications_5fpost',['notifications_post',['../notifications_8php.html#a5baffec7b2e625c9f9cefbc097550d33',1,'notifications.php']]],
+ ['notifier_2ephp',['notifier.php',['../notifier_8php.html',1,'']]],
+ ['notifier_5frun',['notifier_run',['../notifier_8php.html#a568c502f626cff95e344c0748938b85d',1,'notifier.php']]],
+ ['notify_2ephp',['notify.php',['../include_2notify_8php.html',1,'']]],
+ ['notify_2ephp',['notify.php',['../mod_2notify_8php.html',1,'']]],
+ ['notify_5fcomment',['NOTIFY_COMMENT',['../boot_8php.html#a20f0eed431d25870b624b8937a07a59f',1,'boot.php']]],
+ ['notify_5fconfirm',['NOTIFY_CONFIRM',['../boot_8php.html#af8c0cb0744c9a6b5d6d3baafb1f1e71d',1,'boot.php']]],
+ ['notify_5fcontent',['notify_content',['../mod_2notify_8php.html#acdf3851688ebd6d6a575eb84ef9febe3',1,'notify.php']]],
+ ['notify_5finit',['notify_init',['../mod_2notify_8php.html#a94f9a6a9d4b5fd704baafff0c34f41ae',1,'notify.php']]],
+ ['notify_5fintro',['NOTIFY_INTRO',['../boot_8php.html#a56fd673eaa7014150297ce1162502db5',1,'boot.php']]],
+ ['notify_5fmail',['NOTIFY_MAIL',['../boot_8php.html#a285732e7889fa7f333cbe431111e1029',1,'boot.php']]],
+ ['notify_5fpoke',['NOTIFY_POKE',['../boot_8php.html#aca08bc4f1554ba877500f6abcc99e1e8',1,'boot.php']]],
+ ['notify_5fprofile',['NOTIFY_PROFILE',['../boot_8php.html#a981d46380f9f23c308bac1f9cb00dc5b',1,'boot.php']]],
+ ['notify_5fsuggest',['NOTIFY_SUGGEST',['../boot_8php.html#a9d01ef178b72b145016cca1393415bc4',1,'boot.php']]],
+ ['notify_5fsystem',['NOTIFY_SYSTEM',['../boot_8php.html#a14d44d4a00223dc3db4ea962325db192',1,'boot.php']]],
+ ['notify_5ftagself',['NOTIFY_TAGSELF',['../boot_8php.html#ab724491497ab2618b23a01d5da60aec0',1,'boot.php']]],
+ ['notify_5ftagshare',['NOTIFY_TAGSHARE',['../boot_8php.html#af6937db5f581d006bf4a5c3d9c7e0461',1,'boot.php']]],
+ ['notify_5fwall',['NOTIFY_WALL',['../boot_8php.html#a505410c7edc5f5bb5fa227b98359793e',1,'boot.php']]],
+ ['nuke_5fsession',['nuke_session',['../auth_8php.html#a2add3a1129ffa4d5515442a9d52a9b1a',1,'auth.php']]]
+];
diff --git a/doc/html/search/all_6f.html b/doc/html/search/all_6f.html
new file mode 100644
index 000000000..5e86b030d
--- /dev/null
+++ b/doc/html/search/all_6f.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_6f.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/all_6f.js b/doc/html/search/all_6f.js
new file mode 100644
index 000000000..a87eb552b
--- /dev/null
+++ b/doc/html/search/all_6f.js
@@ -0,0 +1,31 @@
+var searchData=
+[
+ ['oauth_2ephp',['oauth.php',['../oauth_8php.html',1,'']]],
+ ['oauth_5fget_5fclient',['oauth_get_client',['../mod_2api_8php.html#a02ae0f60e240dc806b860edb7d582117',1,'api.php']]],
+ ['obj_5fverb_5fselector',['obj_verb_selector',['../taxonomy_8php.html#af387463d42ffdf7d2ab3d5b22e40a0c7',1,'taxonomy.php']]],
+ ['obj_5fverbs',['obj_verbs',['../taxonomy_8php.html#a03f55ee46c5f496e42f3d29db8d09cce',1,'taxonomy.php']]],
+ ['oe_5fbuild_5fxpath',['oe_build_xpath',['../include_2oembed_8php.html#ab953a6e7c11bc6498ce01ed73e2ba319',1,'oembed.php']]],
+ ['oe_5fget_5finner_5fhtml',['oe_get_inner_html',['../include_2oembed_8php.html#a03fa3b7832c98a3d0b4630afeb73d487',1,'oembed.php']]],
+ ['oembed_2ephp',['oembed.php',['../include_2oembed_8php.html',1,'']]],
+ ['oembed_2ephp',['oembed.php',['../mod_2oembed_8php.html',1,'']]],
+ ['oembed_5fbbcode2html',['oembed_bbcode2html',['../include_2oembed_8php.html#aba89ae64b355efcb4f706553d3edb6a2',1,'oembed.php']]],
+ ['oembed_5ffetch_5furl',['oembed_fetch_url',['../include_2oembed_8php.html#a98549b9af8140eda3eceaeedcaabc2c2',1,'oembed.php']]],
+ ['oembed_5fformat_5fobject',['oembed_format_object',['../include_2oembed_8php.html#a26bb4c1e330d2f94ea7b6ce2fe970cf3',1,'oembed.php']]],
+ ['oembed_5fhtml2bbcode',['oembed_html2bbcode',['../include_2oembed_8php.html#a000a62b97113cf95b0e9e00412168172',1,'oembed.php']]],
+ ['oembed_5fiframe',['oembed_iframe',['../include_2oembed_8php.html#a9e57f3e36a0a0a47e6db79544b701d9a',1,'oembed.php']]],
+ ['oembed_5finit',['oembed_init',['../mod_2oembed_8php.html#a9145025aaf057fb5d3f9f7011e5e1014',1,'oembed.php']]],
+ ['oembed_5freplacecb',['oembed_replacecb',['../include_2oembed_8php.html#a00c4c80deffd9daf8dc97b58d4c64ed0',1,'oembed.php']]],
+ ['oexchange_2ephp',['oexchange.php',['../oexchange_8php.html',1,'']]],
+ ['oexchange_5fcontent',['oexchange_content',['../oexchange_8php.html#a2d8b785cd7d041a4e6274f5af370cf26',1,'oexchange.php']]],
+ ['oexchange_5finit',['oexchange_init',['../oexchange_8php.html#ac8e2e469ddc3db984b0c1b44558aca59',1,'oexchange.php']]],
+ ['olddefault_2ephp',['olddefault.php',['../olddefault_8php.html',1,'']]],
+ ['onedirsync_2ephp',['onedirsync.php',['../onedirsync_8php.html',1,'']]],
+ ['onedirsync_5frun',['onedirsync_run',['../onedirsync_8php.html#a411aedd47c57476099647961e6a86691',1,'onedirsync.php']]],
+ ['onepoll_2ephp',['onepoll.php',['../onepoll_8php.html',1,'']]],
+ ['onepoll_5frun',['onepoll_run',['../onepoll_8php.html#a72753b2fdec79b37c7f432035c91fb6d',1,'onepoll.php']]],
+ ['opensearch_2ephp',['opensearch.php',['../opensearch_8php.html',1,'']]],
+ ['opensearch_5finit',['opensearch_init',['../opensearch_8php.html#ad13034877a496565ac7d99e9fc6f55e9',1,'opensearch.php']]],
+ ['orient',['orient',['../classphoto__driver.html#a4de5bac8daea8f291a33c80788019d0d',1,'photo_driver']]],
+ ['outf',['outf',['../namespacefriendica-to-smarty-tpl.html#a87182a9bab47640428bd0b2b9946bef9',1,'friendica-to-smarty-tpl']]],
+ ['outpath',['outpath',['../namespacefriendica-to-smarty-tpl.html#a005c1b7a69cac31fad72a941974ba7bb',1,'friendica-to-smarty-tpl']]]
+];
diff --git a/doc/html/search/all_70.html b/doc/html/search/all_70.html
new file mode 100644
index 000000000..799c1a277
--- /dev/null
+++ b/doc/html/search/all_70.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_70.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/all_70.js b/doc/html/search/all_70.js
new file mode 100644
index 000000000..bc60353db
--- /dev/null
+++ b/doc/html/search/all_70.js
@@ -0,0 +1,185 @@
+var searchData=
+[
+ ['page',['page',['../mod__import_8php.html#a8db1899eeeb44dabd0904065b63627bb',1,'mod_import.php']]],
+ ['page_2ephp',['page.php',['../page_8php.html',1,'']]],
+ ['page_5fadult',['PAGE_ADULT',['../boot_8php.html#ace83842dbeb84f7ed9ac59a9f57a7c32',1,'boot.php']]],
+ ['page_5fapplication',['PAGE_APPLICATION',['../boot_8php.html#a8231d115060d41a9c2a677f2c86f10ed',1,'boot.php']]],
+ ['page_5fautoconnect',['PAGE_AUTOCONNECT',['../boot_8php.html#aa275653b9c87abc7391bb8040c1c2de9',1,'boot.php']]],
+ ['page_5fcontent',['page_content',['../page_8php.html#a91a5f649f68406149108bded1dc90b22',1,'page.php']]],
+ ['page_5fdirectory_5fchannel',['PAGE_DIRECTORY_CHANNEL',['../boot_8php.html#a5b8484922918946d041e5e0515dbe718',1,'boot.php']]],
+ ['page_5fhidden',['PAGE_HIDDEN',['../boot_8php.html#a5e322a2a2d0f51924c0b2e874988e640',1,'boot.php']]],
+ ['page_5finit',['page_init',['../page_8php.html#a4d89800c0366a239191b1692c09635cf',1,'page.php']]],
+ ['page_5fnormal',['PAGE_NORMAL',['../boot_8php.html#a09532c3f750ae8c4527e63b2b790cbf3',1,'boot.php']]],
+ ['page_5fpremium',['PAGE_PREMIUM',['../boot_8php.html#ab3920c2f3cd64802c0b7ff625c3b2ea8',1,'boot.php']]],
+ ['page_5fremoved',['PAGE_REMOVED',['../boot_8php.html#a4edce16cb7f21cdafa1e85bf63d713e6',1,'boot.php']]],
+ ['page_5fsystem',['PAGE_SYSTEM',['../boot_8php.html#a6ee7a72d558d1851bbb9e3cdde377932',1,'boot.php']]],
+ ['page_5fwidgets_2ephp',['page_widgets.php',['../page__widgets_8php.html',1,'']]],
+ ['pagelist_5fwidget',['pagelist_widget',['../page__widgets_8php.html#ad82011c1ed90d9de8b9f34c12af5c6f0',1,'page_widgets.php']]],
+ ['paginate',['paginate',['../text_8php.html#afe9f178d264d44a94dc1292aaf0fd585',1,'text.php']]],
+ ['parse_5furl_2ephp',['parse_url.php',['../parse__url_8php.html',1,'']]],
+ ['parse_5furl_5fcontent',['parse_url_content',['../parse__url_8php.html#a05a9e8944380ba3cf6bbf5893dd4b74b',1,'parse_url.php']]],
+ ['parse_5fxml_5fstring',['parse_xml_string',['../include_2network_8php.html#a27a951b59d8d622c0b3e7b0673ba74c6',1,'network.php']]],
+ ['parsed',['parsed',['../classFriendicaSmarty.html#a6a4d4281d6fa9be1d37a97b188ffe8c9',1,'FriendicaSmarty']]],
+ ['parseurl_5fgetsiteinfo',['parseurl_getsiteinfo',['../parse__url_8php.html#a25635549f2c22955d72465f4d2e58993',1,'parse_url.php']]],
+ ['passion_2ephp',['passion.php',['../passion_8php.html',1,'']]],
+ ['passionwide_2ephp',['passionwide.php',['../passionwide_8php.html',1,'']]],
+ ['path',['path',['../namespacefriendica-to-smarty-tpl.html#a68d15934660cd1f4301ce251b1646f09',1,'friendica-to-smarty-tpl.path()'],['../namespaceupdatetpl.html#ae694f5e1f25f8a92a945eb90c432dfe6',1,'updatetpl.path()']]],
+ ['pdl_5fselector',['pdl_selector',['../comanche_8php.html#af7150df735e5ff9d467994cd6f769c6e',1,'comanche.php']]],
+ ['perm_5fis_5fallowed',['perm_is_allowed',['../permissions_8php.html#a67ada9ed51e77885b6b0f6a28cee1835',1,'permissions.php']]],
+ ['permissions_2ephp',['permissions.php',['../permissions_8php.html',1,'']]],
+ ['permissions_5fsql',['permissions_sql',['../security_8php.html#afa683bc025a1d2fe9065e2f6cd71a22f',1,'security.php']]],
+ ['perms2str',['perms2str',['../text_8php.html#a98fd99dee3da8cf4c148dc04efe782ee',1,'text.php']]],
+ ['perms_5fa_5fdelegate',['PERMS_A_DELEGATE',['../boot_8php.html#a423505ab8dbd8e39d04ae3fe1374102b',1,'boot.php']]],
+ ['perms_5fa_5frepublish',['PERMS_A_REPUBLISH',['../boot_8php.html#aae6c941bde5fd6fce07e51dba7326ead',1,'boot.php']]],
+ ['perms_5fcontacts',['PERMS_CONTACTS',['../boot_8php.html#ab2d0e8a9b81ee548ef2ce8e4560da2f6',1,'boot.php']]],
+ ['perms_5fnetwork',['PERMS_NETWORK',['../boot_8php.html#a6df1102664f64b274810db85197c2755',1,'boot.php']]],
+ ['perms_5fpublic',['PERMS_PUBLIC',['../boot_8php.html#aff210e8403dd72368522b17fb6e5d4e7',1,'boot.php']]],
+ ['perms_5fr_5fabook',['PERMS_R_ABOOK',['../boot_8php.html#a3d6d4fc5fafcc9156811669158541caf',1,'boot.php']]],
+ ['perms_5fr_5fpages',['PERMS_R_PAGES',['../boot_8php.html#ab51965fabe54dc031e9a0ce1142ee83e',1,'boot.php']]],
+ ['perms_5fr_5fphotos',['PERMS_R_PHOTOS',['../boot_8php.html#a29e921c0c72412cc738e44cca6ca1f62',1,'boot.php']]],
+ ['perms_5fr_5fprofile',['PERMS_R_PROFILE',['../boot_8php.html#ad789aef3cb95fc1eb36be7c4283d0137',1,'boot.php']]],
+ ['perms_5fr_5fstorage',['PERMS_R_STORAGE',['../boot_8php.html#a1db4f0009c9cb4e107eab0f914a3c8dc',1,'boot.php']]],
+ ['perms_5fr_5fstream',['PERMS_R_STREAM',['../boot_8php.html#aec36f8fcd4cb14a52934590b3d6666b4',1,'boot.php']]],
+ ['perms_5fsite',['PERMS_SITE',['../boot_8php.html#a9ff652e5cb83cd11cbb0350844e7b28f',1,'boot.php']]],
+ ['perms_5fspecific',['PERMS_SPECIFIC',['../boot_8php.html#a9cc986b4f9dd6558cbb2e25aadbfd964',1,'boot.php']]],
+ ['perms_5fw_5fchat',['PERMS_W_CHAT',['../boot_8php.html#acd877c405b06b348b37b6f7e62a211e9',1,'boot.php']]],
+ ['perms_5fw_5fcomment',['PERMS_W_COMMENT',['../boot_8php.html#a32df13fec0e43281da5979e1f5579aa8',1,'boot.php']]],
+ ['perms_5fw_5fmail',['PERMS_W_MAIL',['../boot_8php.html#a6b31dd451bc6c37fe7c9c766ff385aaf',1,'boot.php']]],
+ ['perms_5fw_5fpages',['PERMS_W_PAGES',['../boot_8php.html#aa9244fc9cc221980c07a20cc534111be',1,'boot.php']]],
+ ['perms_5fw_5fphotos',['PERMS_W_PHOTOS',['../boot_8php.html#a57eee7352714c004d36c26dda74af73e',1,'boot.php']]],
+ ['perms_5fw_5fstorage',['PERMS_W_STORAGE',['../boot_8php.html#a4fefd7486d3b888a05cfd3dc9575f115',1,'boot.php']]],
+ ['perms_5fw_5fstream',['PERMS_W_STREAM',['../boot_8php.html#a8bb0395933b5e886f086f6a2fb0bfa55',1,'boot.php']]],
+ ['perms_5fw_5ftagwall',['PERMS_W_TAGWALL',['../boot_8php.html#a99a4a17cb644e7e6826ea07ecaf09777',1,'boot.php']]],
+ ['perms_5fw_5fwall',['PERMS_W_WALL',['../boot_8php.html#a6b14a31a8aa9f3452a13383f413bffa2',1,'boot.php']]],
+ ['photo_2ephp',['photo.php',['../photo_8php.html',1,'']]],
+ ['photo_5fdriver',['photo_driver',['../classphoto__driver.html',1,'']]],
+ ['photo_5fdriver_2ephp',['photo_driver.php',['../photo__driver_8php.html',1,'']]],
+ ['photo_5ffactory',['photo_factory',['../photo__driver_8php.html#a32e2817faa25d7f11f60a8abff565035',1,'photo_driver.php']]],
+ ['photo_5fgd',['photo_gd',['../classphoto__gd.html',1,'']]],
+ ['photo_5fgd_2ephp',['photo_gd.php',['../photo__gd_8php.html',1,'']]],
+ ['photo_5fimagick',['photo_imagick',['../classphoto__imagick.html',1,'']]],
+ ['photo_5fimagick_2ephp',['photo_imagick.php',['../photo__imagick_8php.html',1,'']]],
+ ['photo_5finit',['photo_init',['../photo_8php.html#a582779d24882b0d31ee909a91d70a448',1,'photo.php']]],
+ ['photo_5fnew_5fresource',['photo_new_resource',['../text_8php.html#aa5528f41533927e1bd2da3618a74a6d7',1,'text.php']]],
+ ['photo_5fnormal',['PHOTO_NORMAL',['../boot_8php.html#a4a49b29838ef2c45ab3556b52baec6a4',1,'boot.php']]],
+ ['photo_5fprofile',['PHOTO_PROFILE',['../boot_8php.html#ab4bc9c50ecc927b92d519e36562b0df0',1,'boot.php']]],
+ ['photo_5fthing',['PHOTO_THING',['../boot_8php.html#a78849a1bf8ce8d9804b4cbb502e8f383',1,'boot.php']]],
+ ['photo_5fupload',['photo_upload',['../include_2photos_8php.html#a6c40ef58aefef705a5adc84a40e97109',1,'photos.php']]],
+ ['photo_5fxchan',['PHOTO_XCHAN',['../boot_8php.html#ac43182e0d8bae7576a30b603774974f8',1,'boot.php']]],
+ ['photos_2ephp',['photos.php',['../mod_2photos_8php.html',1,'']]],
+ ['photos_2ephp',['photos.php',['../include_2photos_8php.html',1,'']]],
+ ['photos_5falbum_5fexists',['photos_album_exists',['../include_2photos_8php.html#a8e8b7be99e24c2497bc2cb3339280c35',1,'photos.php']]],
+ ['photos_5falbum_5fget_5fdb_5fidstr',['photos_album_get_db_idstr',['../include_2photos_8php.html#a7e7abc69872180697c5471dc69349afe',1,'photos.php']]],
+ ['photos_5falbum_5frename',['photos_album_rename',['../include_2photos_8php.html#ab0365f25b22ccea5f085fe7c49e1f4ab',1,'photos.php']]],
+ ['photos_5falbum_5fwidget',['photos_album_widget',['../include_2photos_8php.html#af24c6aeed28ecc31ec39e7d9a1804979',1,'photos.php']]],
+ ['photos_5falbums_5flist',['photos_albums_list',['../include_2photos_8php.html#aedccaf18282b26899d9549c29bd9d1b9',1,'photos.php']]],
+ ['photos_5fcontent',['photos_content',['../mod_2photos_8php.html#aa87382611a66ec5effdb2d78f13f5812',1,'photos.php']]],
+ ['photos_5fcreate_5fitem',['photos_create_item',['../include_2photos_8php.html#ad648c0c5544fe9263409b6f6e57c6274',1,'photos.php']]],
+ ['photos_5finit',['photos_init',['../mod_2photos_8php.html#ab950295cd77626f5fe65331a87693014',1,'photos.php']]],
+ ['photos_5flist_5fphotos',['photos_list_photos',['../include_2photos_8php.html#aa27b9e435dcc34e1009f56dc02c7ca51',1,'photos.php']]],
+ ['photos_5fpost',['photos_post',['../mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080',1,'photos.php']]],
+ ['php_2ephp',['php.php',['../php_8php.html',1,'']]],
+ ['php2po_2ephp',['php2po.php',['../php2po_8php.html',1,'']]],
+ ['php_5finit',['php_init',['../php_8php.html#adb7164dfed9a4ecbe2e168e1e78f12f6',1,'php.php']]],
+ ['php_5ftpl',['php_tpl',['../namespacefriendica-to-smarty-tpl.html#a5dfc21ab8282dda8e3a7dff43cd0e283',1,'friendica-to-smarty-tpl']]],
+ ['pine_2ephp',['pine.php',['../pine_8php.html',1,'']]],
+ ['ping_2ephp',['ping.php',['../ping_8php.html',1,'']]],
+ ['ping_5finit',['ping_init',['../ping_8php.html#a77217b1b190b4c5d8770867b45f0c0a1',1,'ping.php']]],
+ ['pipe_5fstreams',['pipe_streams',['../include_2attach_8php.html#a5d484de2d19a93071571d6499a50ae34',1,'attach.php']]],
+ ['pkcs5_5fpad',['pkcs5_pad',['../crypto_8php.html#ad5e51fd44cff93cfaa07a37e24a5edec',1,'crypto.php']]],
+ ['pkcs5_5funpad',['pkcs5_unpad',['../crypto_8php.html#ac95ac3b1b23b65b04a86613d4206ae85',1,'crypto.php']]],
+ ['plugin_2ephp',['plugin.php',['../plugin_8php.html',1,'']]],
+ ['png_5fquality',['PNG_QUALITY',['../boot_8php.html#a8df201788c9dd0ca91384e3a14c08bce',1,'boot.php']]],
+ ['po2php_2ephp',['po2php.php',['../po2php_8php.html',1,'']]],
+ ['po2php_5frun',['po2php_run',['../po2php_8php.html#a3b75e36f913198299e99559b175cd8b4',1,'po2php.php']]],
+ ['poco_2ephp',['poco.php',['../poco_8php.html',1,'']]],
+ ['poco_5finit',['poco_init',['../poco_8php.html#a53def16f75e3d41f1d2bb7cfa4905498',1,'poco.php']]],
+ ['poco_5fload',['poco_load',['../socgraph_8php.html#a5ef8bef37161df53718a21e93d02fbd6',1,'socgraph.php']]],
+ ['poke_2ephp',['poke.php',['../poke_8php.html',1,'']]],
+ ['poke_5fcontent',['poke_content',['../poke_8php.html#ac9190563a8da9c07a16f9dcd71cf6993',1,'poke.php']]],
+ ['poke_5finit',['poke_init',['../poke_8php.html#a9725aab97b3983e6a98bd81c4efe7d3b',1,'poke.php']]],
+ ['poll_5fmultiple_5fchoice',['POLL_MULTIPLE_CHOICE',['../boot_8php.html#abbf5ac24eb8aeedb862f618ee0d21e86',1,'boot.php']]],
+ ['poll_5foverwrite',['POLL_OVERWRITE',['../boot_8php.html#a2b525996e4426bdddbcec277778bde08',1,'boot.php']]],
+ ['poll_5fsimple_5frating',['POLL_SIMPLE_RATING',['../boot_8php.html#ad88a70ec62e08d590123d3697dfe64d5',1,'boot.php']]],
+ ['poll_5ftenscale',['POLL_TENSCALE',['../boot_8php.html#a1ba00027b718db732f30fc0e2c3e0abc',1,'boot.php']]],
+ ['poller_2ephp',['poller.php',['../poller_8php.html',1,'']]],
+ ['poller_5frun',['poller_run',['../poller_8php.html#a5f12df3a4738124b6c039971e87e76da',1,'poller.php']]],
+ ['pop_5flang',['pop_lang',['../language_8php.html#a78bd204955ec4cc3a9ac651285a1689d',1,'language.php']]],
+ ['populate_5facl',['populate_acl',['../acl__selectors_8php.html#a7b5446e999636ceceea65c154d865a31',1,'acl_selectors.php']]],
+ ['post_2ephp',['post.php',['../post_8php.html',1,'']]],
+ ['post_5factivity_5fitem',['post_activity_item',['../items_8php.html#a410f9c743877c125ca06312373346903',1,'items.php']]],
+ ['post_5finit',['post_init',['../post_8php.html#af4b48181ce773ef0cdfc972441445c34',1,'post.php']]],
+ ['post_5fpost',['post_post',['../post_8php.html#af59e6a1dc22d19d9257b01cd7ccedb75',1,'post.php']]],
+ ['post_5fto_5fred_2ephp',['post_to_red.php',['../post__to__red_8php.html',1,'']]],
+ ['post_5fto_5fred_5facct_5fname',['post_to_red_acct_name',['../post__to__red_8php.html#a588cea66afe0b32f27f2713d44940119',1,'post_to_red.php']]],
+ ['post_5fto_5fred_5fadmin',['post_to_red_admin',['../post__to__red_8php.html#aeec4125719184e7b097b3b9fba3101b5',1,'post_to_red.php']]],
+ ['post_5fto_5fred_5fdeactivate',['post_to_red_deactivate',['../post__to__red_8php.html#a49fd35f7b1cdddfe6e26ddfcf8d3c4ec',1,'post_to_red.php']]],
+ ['post_5fto_5fred_5fdelete_5fcomment',['post_to_red_delete_comment',['../post__to__red_8php.html#a5cc2a89a6d33cdb8e2ca557a69bef42d',1,'post_to_red.php']]],
+ ['post_5fto_5fred_5fdelete_5fpost',['post_to_red_delete_post',['../post__to__red_8php.html#a4674bb5ce2baa32c559607460c39a2c5',1,'post_to_red.php']]],
+ ['post_5fto_5fred_5fdisplay_5fadmin_5fpage',['post_to_red_display_admin_page',['../post__to__red_8php.html#a8ec8f8809e3c5d1b2c9598c8185d63aa',1,'post_to_red.php']]],
+ ['post_5fto_5fred_5fdisplayadmincontent',['post_to_red_displayAdminContent',['../post__to__red_8php.html#a75db5d87226a0287a0ac0fa315f2bcfd',1,'post_to_red.php']]],
+ ['post_5fto_5fred_5fget_5facct_5fname',['post_to_red_get_acct_name',['../post__to__red_8php.html#ae6f3a2c0561cbeacda5be565b06de8a7',1,'post_to_red.php']]],
+ ['post_5fto_5fred_5fget_5favatar',['post_to_red_get_avatar',['../post__to__red_8php.html#ae0b881461afbdba93d9329068ea52136',1,'post_to_red.php']]],
+ ['post_5fto_5fred_5fget_5fchannel_5fname',['post_to_red_get_channel_name',['../post__to__red_8php.html#aacba7a0646fc00ae6ac4f5dc383fccab',1,'post_to_red.php']]],
+ ['post_5fto_5fred_5fget_5fpassword',['post_to_red_get_password',['../post__to__red_8php.html#a4d90ac085c14f53ff4d8ab4c23477ea6',1,'post_to_red.php']]],
+ ['post_5fto_5fred_5fget_5fseed_5flocation',['post_to_red_get_seed_location',['../post__to__red_8php.html#a96d0ccecb96600ef1bfd50ab3f77315f',1,'post_to_red.php']]],
+ ['post_5fto_5fred_5fpath',['post_to_red_path',['../post__to__red_8php.html#a6210f39392a5f0fa0255cc7d3760493a',1,'post_to_red.php']]],
+ ['post_5fto_5fred_5fpost',['post_to_red_post',['../post__to__red_8php.html#af5fd50e2c42ede85f8a9e8d9ee3cf540',1,'post_to_red.php']]],
+ ['post_5fto_5fred_5fpost_5fcheckbox',['post_to_red_post_checkbox',['../post__to__red_8php.html#a0f139dea77a94c98f26007963eea639c',1,'post_to_red.php']]],
+ ['post_5fto_5fred_5fpost_5ffield_5fdata',['post_to_red_post_field_data',['../post__to__red_8php.html#a7e68a8d9c83cb28d032aad3ea85ce0a6',1,'post_to_red.php']]],
+ ['post_5fto_5fred_5fpost_5fmeta_5fcontent',['post_to_red_post_meta_content',['../post__to__red_8php.html#aa97aeda12ef080665f16311a4e1eb901',1,'post_to_red.php']]],
+ ['post_5fto_5fred_5fsettings_5flink',['post_to_red_settings_link',['../post__to__red_8php.html#a906be8f72cf1aa2e199c0683ea6a4017',1,'post_to_red.php']]],
+ ['post_5fto_5fred_5fversion',['post_to_red_version',['../post__to__red_8php.html#af3e7ebd361d4ed7cb6d43209970cd94a',1,'post_to_red.php']]],
+ ['posted_5fdate_5fwidget',['posted_date_widget',['../items_8php.html#abe695dd89e1e10ed042c26b80114f0ed',1,'items.php']]],
+ ['posted_5fdates',['posted_dates',['../items_8php.html#ad2abb4644ff1f20fefbc80326fe01cf0',1,'items.php']]],
+ ['preg_5fcallback_5fhelp_5finclude',['preg_callback_help_include',['../help_8php.html#a06b2a51aaabed99e53a9b639047c4ce4',1,'help.php']]],
+ ['preg_5fheart',['preg_heart',['../text_8php.html#ac19d2b33a58372a357a43d51eed19162',1,'text.php']]],
+ ['prepare_5fbody',['prepare_body',['../text_8php.html#ae4df74296fbe55051ed3c035e55205e5',1,'text.php']]],
+ ['prepare_5fpage',['prepare_page',['../conversation_8php.html#a4b0888b0f26e1c284a4341fe5fd04f0c',1,'conversation.php']]],
+ ['prepare_5ftext',['prepare_text',['../text_8php.html#afe54312607d92f7ce9593f5760831f80',1,'text.php']]],
+ ['pretheme_2ephp',['pretheme.php',['../pretheme_8php.html',1,'']]],
+ ['pretheme_5finit',['pretheme_init',['../pretheme_8php.html#af5660943ee99db5fd75182316522eafe',1,'pretheme.php']]],
+ ['print_5ftemplate',['print_template',['../tpldebug_8php.html#a44778457a6c02554812fbfad19d32ba3',1,'tpldebug.php']]],
+ ['printable',['printable',['../dba__driver_8php.html#a55bf30d8176967e682656b5be4ad9249',1,'dba_driver.php']]],
+ ['private_5fmessages_5fdrop',['private_messages_drop',['../include_2message_8php.html#aed272d77c06a309e2836ac79e75613f1',1,'message.php']]],
+ ['private_5fmessages_5ffetch_5fconversation',['private_messages_fetch_conversation',['../include_2message_8php.html#a5f8de9847e203329e317ac38dc646898',1,'message.php']]],
+ ['private_5fmessages_5ffetch_5fmessage',['private_messages_fetch_message',['../include_2message_8php.html#a254a756031e4d5e94f85e2939bdb5091',1,'message.php']]],
+ ['private_5fmessages_5flist',['private_messages_list',['../include_2message_8php.html#a652973ce47a262f2d238c2fd6233d97e',1,'message.php']]],
+ ['probe_2ephp',['probe.php',['../probe_8php.html',1,'']]],
+ ['probe_5fcontent',['probe_content',['../probe_8php.html#a1f1db3fa6038e451e737964c94bf5e99',1,'probe.php']]],
+ ['proc_5frun',['proc_run',['../boot_8php.html#ab346a2ece14993861f3e4206befa94f0',1,'boot.php']]],
+ ['process_5fchannel_5fsync_5fdelivery',['process_channel_sync_delivery',['../zot_8php.html#ac301c67864917c35922257950ae0f95c',1,'zot.php']]],
+ ['process_5fdelivery',['process_delivery',['../zot_8php.html#a37ec13b18057634eadb071f05297f5e1',1,'zot.php']]],
+ ['process_5fmail_5fdelivery',['process_mail_delivery',['../zot_8php.html#aa6ae96db8cbbdbb10e6876d206bbf7cc',1,'zot.php']]],
+ ['process_5fprofile_5fdelivery',['process_profile_delivery',['../zot_8php.html#a9a57b40669351c9791126b925cb7ef3b',1,'zot.php']]],
+ ['profile_2ephp',['profile.php',['../profile_8php.html',1,'']]],
+ ['profile_5factivity',['profile_activity',['../activities_8php.html#a80134e807719b3c54aba971958d2e132',1,'activities.php']]],
+ ['profile_5fcontent',['profile_content',['../profile_8php.html#a3775cf6eef6587e5143133356a7b76c0',1,'profile.php']]],
+ ['profile_5fcreate_5fsidebar',['profile_create_sidebar',['../identity_8php.html#ad4a2c8caca8f6ae93633ebeca0ed6620',1,'identity.php']]],
+ ['profile_5finit',['profile_init',['../profile_8php.html#ab5d0246be0552e2182a585c1206d22a5',1,'profile.php']]],
+ ['profile_5fload',['profile_load',['../identity_8php.html#a4751b522ea913d0e7ed43e03d22e9e68',1,'identity.php']]],
+ ['profile_5fphoto_2ephp',['profile_photo.php',['../profile__photo_8php.html',1,'']]],
+ ['profile_5fphoto_5finit',['profile_photo_init',['../profile__photo_8php.html#a140631c56438fbfacb61a1eb43067d02',1,'profile_photo.php']]],
+ ['profile_5fphoto_5fpost',['profile_photo_post',['../profile__photo_8php.html#a4b80234074bd603221aa5364f330e479',1,'profile_photo.php']]],
+ ['profile_5fselectors_2ephp',['profile_selectors.php',['../profile__selectors_8php.html',1,'']]],
+ ['profile_5fsidebar',['profile_sidebar',['../identity_8php.html#a432259b2cf5b6f59be53e71db9f2c7dc',1,'identity.php']]],
+ ['profile_5ftabs',['profile_tabs',['../conversation_8php.html#a1dfcb5146e9d1eca4528bc580ad5d273',1,'conversation.php']]],
+ ['profiler',['profiler',['../text_8php.html#a8b0a799341b1fc4cba2c3ede3e3fc9b6',1,'text.php']]],
+ ['profiles_2ephp',['profiles.php',['../profiles_8php.html',1,'']]],
+ ['profiles_5fcontent',['profiles_content',['../profiles_8php.html#a46975783b8b8d70402d51487eb1f0b00',1,'profiles.php']]],
+ ['profiles_5finit',['profiles_init',['../profiles_8php.html#a36f71405ad536228f8bb84a551b23f7e',1,'profiles.php']]],
+ ['profiles_5fpost',['profiles_post',['../profiles_8php.html#ab0362c81b1d3b0b12a772b9fac446e04',1,'profiles.php']]],
+ ['profperm_2ephp',['profperm.php',['../profperm_8php.html',1,'']]],
+ ['profperm_5fcontent',['profperm_content',['../profperm_8php.html#aef015787de2373d9fb3fe3f814fb5023',1,'profperm.php']]],
+ ['profperm_5finit',['profperm_init',['../profperm_8php.html#a17fb64ec05edee1dc94d95438807d6c6',1,'profperm.php']]],
+ ['protect_5fsprintf',['protect_sprintf',['../text_8php.html#a4e7698aca48982512594b274543c3b9b',1,'text.php']]],
+ ['protodriver',['ProtoDriver',['../classProtoDriver.html',1,'']]],
+ ['protodriver_2ephp',['ProtoDriver.php',['../ProtoDriver_8php.html',1,'']]],
+ ['public_5fpermissions_5fsql',['public_permissions_sql',['../security_8php.html#ab3bdd30dc60d9ee72370b866aa4a2d01',1,'security.php']]],
+ ['public_5frecips',['public_recips',['../zot_8php.html#a083aec6c900d244e1bfc1406f9461465',1,'zot.php']]],
+ ['pubsites_2ephp',['pubsites.php',['../pubsites_8php.html',1,'']]],
+ ['pubsites_5fcontent',['pubsites_content',['../pubsites_8php.html#af614e279aab54065345bda6b03eafdf0',1,'pubsites.php']]],
+ ['purify_5fhtml',['purify_html',['../text_8php.html#a4841df5beabdd1bdd1ed56781a915d61',1,'text.php']]],
+ ['push_5flang',['push_lang',['../language_8php.html#ac9142ef1d01a235c760deb0f16643f5a',1,'language.php']]],
+ ['put',['put',['../classRedFile.html#a41a49a583eb276b75626fcf97f4a699c',1,'RedFile']]]
+];
diff --git a/doc/html/search/all_71.html b/doc/html/search/all_71.html
new file mode 100644
index 000000000..e9d391f66
--- /dev/null
+++ b/doc/html/search/all_71.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_71.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/all_71.js b/doc/html/search/all_71.js
new file mode 100644
index 000000000..c1c1f6ba7
--- /dev/null
+++ b/doc/html/search/all_71.js
@@ -0,0 +1,9 @@
+var searchData=
+[
+ ['q',['q',['../classdba__driver.html#a558e738b88ae893cc5d79ffa3793d555',1,'dba_driver\q()'],['../classdba__mysql.html#ac3fd60c278f400907322dac578754a99',1,'dba_mysql\q()'],['../classdba__mysqli.html#a611c4de8d6d7512dffb83a38bb6701ec',1,'dba_mysqli\q()'],['../dba__driver_8php.html#a2c09a731d3b4fef41fed0e83db01be1f',1,'q():&#160;dba_driver.php']]],
+ ['qp',['qp',['../text_8php.html#afc998d2796a6b2a08e96f7cc061e7221',1,'text.php']]],
+ ['queue_2ephp',['queue.php',['../queue_8php.html',1,'']]],
+ ['queue_5ffn_2ephp',['queue_fn.php',['../queue__fn_8php.html',1,'']]],
+ ['queue_5frun',['queue_run',['../queue_8php.html#af8c93de86d866c3200174c8450a0f341',1,'queue.php']]],
+ ['quotelevel',['quotelevel',['../html2plain_8php.html#a56d29b254333d29abb9d96a9a903a4b0',1,'html2plain.php']]]
+];
diff --git a/doc/html/search/all_72.html b/doc/html/search/all_72.html
new file mode 100644
index 000000000..347b9f666
--- /dev/null
+++ b/doc/html/search/all_72.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_72.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/all_72.js b/doc/html/search/all_72.js
new file mode 100644
index 000000000..781e0fc82
--- /dev/null
+++ b/doc/html/search/all_72.js
@@ -0,0 +1,79 @@
+var searchData=
+[
+ ['random_5fprofile',['random_profile',['../Contact_8php.html#a852fa476f0c70bde10a4f2533aec5f71',1,'Contact.php']]],
+ ['random_5fstring',['random_string',['../text_8php.html#a9d6a5ee1290de7a8b483fe78585daade',1,'text.php']]],
+ ['random_5fstring_5fhex',['RANDOM_STRING_HEX',['../text_8php.html#aad557c054cf2ed915633701018fc7e3f',1,'text.php']]],
+ ['random_5fstring_5ftext',['RANDOM_STRING_TEXT',['../text_8php.html#a2ffd79c60cc87cec24ef76447b905187',1,'text.php']]],
+ ['randprof_2ephp',['randprof.php',['../randprof_8php.html',1,'']]],
+ ['randprof_5finit',['randprof_init',['../randprof_8php.html#abf5dba3c608b9304cbf68327cd31b090',1,'randprof.php']]],
+ ['rconnect_5furl',['rconnect_url',['../Contact_8php.html#a2f4f495d53f2a334ab75292af79d3c91',1,'Contact.php']]],
+ ['rdelim',['rdelim',['../namespacefriendica-to-smarty-tpl.html#a8540514fb7c4aa18ad2dffa2a975036b',1,'friendica-to-smarty-tpl']]],
+ ['readme_2emd',['README.md',['../apw_2README_8md.html',1,'']]],
+ ['readme_2emd',['README.md',['../blogga_2php_2README_8md.html',1,'']]],
+ ['rebuild_5ftheme_5ftable',['rebuild_theme_table',['../admin_8php.html#ae46311a3fefc21abc838a26e91789de6',1,'admin.php']]],
+ ['red_5fcomment',['red_comment',['../post__to__red_8php.html#a085c250d4ceff5e4f10052f3d2039823',1,'post_to_red.php']]],
+ ['red_5fplatform',['RED_PLATFORM',['../boot_8php.html#a96ad56755a21e1361dbd7bf93c9e7ff4',1,'boot.php']]],
+ ['red_5fversion',['RED_VERSION',['../boot_8php.html#a21cc29e0025943e7c28ff58cb4856ac3',1,'boot.php']]],
+ ['red_5fxmlrpc_5fmethods',['red_xmlrpc_methods',['../post__to__red_8php.html#a3a2af6ad845239f26e86fccabf8639e1',1,'post_to_red.php']]],
+ ['red_5fzrl_5fcallback',['red_zrl_callback',['../items_8php.html#a4e6d7639431e0dd8e9f4dba8e1ac408b',1,'items.php']]],
+ ['redbasic_2ephp',['redbasic.php',['../redbasic_8php.html',1,'']]],
+ ['redbasic_5fform',['redbasic_form',['../view_2theme_2redbasic_2php_2config_8php.html#a8574a41fa9735ee391ba57ab24b93793',1,'config.php']]],
+ ['redbasic_5finit',['redbasic_init',['../redbasic_2php_2theme_8php.html#af6eb813e9fc7e2d76ac1b82bc5c0ed9b',1,'theme.php']]],
+ ['redbasicauth',['RedBasicAuth',['../classRedBasicAuth.html',1,'']]],
+ ['redbrowser',['RedBrowser',['../classRedBrowser.html',1,'']]],
+ ['redchannellist',['RedChannelList',['../reddav_8php.html#ae92ea0df1993f6a7bcd1b6efa6c1fb66',1,'reddav.php']]],
+ ['redcollectiondata',['RedCollectionData',['../reddav_8php.html#a5df0d09893f2e65dc5cf6bbab6cfb266',1,'reddav.php']]],
+ ['reddav_2ephp',['reddav.php',['../reddav_8php.html',1,'']]],
+ ['reddirectory',['RedDirectory',['../classRedDirectory.html',1,'']]],
+ ['redfile',['RedFile',['../classRedFile.html',1,'']]],
+ ['redfiledata',['RedFileData',['../reddav_8php.html#a9f531641dfb4e43cd88ac1a9ae7e2088',1,'reddav.php']]],
+ ['reduce',['reduce',['../docblox__errorchecker_8php.html#ae9562cf60aa693114603d27b55d2185f',1,'docblox_errorchecker.php']]],
+ ['ref_5fsession_5fclose',['ref_session_close',['../session_8php.html#a5e1c616e02b863d5450317d101366bb7',1,'session.php']]],
+ ['ref_5fsession_5fdestroy',['ref_session_destroy',['../session_8php.html#af230b86bfff7db66c3bdd7e0bbc24052',1,'session.php']]],
+ ['ref_5fsession_5fgc',['ref_session_gc',['../session_8php.html#ac95373f4966862a028033dd2f94d4da1',1,'session.php']]],
+ ['ref_5fsession_5fopen',['ref_session_open',['../session_8php.html#a26fa1042356d555023cbf15ddd4f8507',1,'session.php']]],
+ ['ref_5fsession_5fread',['ref_session_read',['../session_8php.html#a7f0f50576360d9ba52d29364e0b83a8e',1,'session.php']]],
+ ['ref_5fsession_5fwrite',['ref_session_write',['../session_8php.html#ac4461c1984543d3553e73dba2771568f',1,'session.php']]],
+ ['register_2ephp',['register.php',['../register_8php.html',1,'']]],
+ ['register_5fapprove',['REGISTER_APPROVE',['../boot_8php.html#a7176c0f9f1c98421b97735d892cf6252',1,'boot.php']]],
+ ['register_5fclosed',['REGISTER_CLOSED',['../boot_8php.html#a69aac276ed82e010dc382b16ab4d59e1',1,'boot.php']]],
+ ['register_5fcontent',['register_content',['../register_8php.html#a0e91f57f111407ea8d3223a05022bb2a',1,'register.php']]],
+ ['register_5fhook',['register_hook',['../plugin_8php.html#a425472c5f3afc137268b2ad45652b209',1,'plugin.php']]],
+ ['register_5finit',['register_init',['../register_8php.html#ae20c0cd40f738d6295de58b9202c83d5',1,'register.php']]],
+ ['register_5fopen',['REGISTER_OPEN',['../boot_8php.html#ad8887b49bbb02dd30b4eb9f6c7773c63',1,'boot.php']]],
+ ['register_5fpost',['register_post',['../register_8php.html#a51731dcc1917c58a790eb1c0f6132271',1,'register.php']]],
+ ['register_5ftemplate_5fengine',['register_template_engine',['../classApp.html#abf46a653d8499e7c253cc1be894a6d83',1,'App']]],
+ ['regmod_2ephp',['regmod.php',['../regmod_8php.html',1,'']]],
+ ['regmod_5fcontent',['regmod_content',['../regmod_8php.html#a7953df4e32e63946565e90cdd5d50409',1,'regmod.php']]],
+ ['relative_5fdate',['relative_date',['../datetime_8php.html#a8ae8dc95ace7ac27fa5a1ecf42b78c82',1,'datetime.php']]],
+ ['reload_5fplugins',['reload_plugins',['../plugin_8php.html#af9ac19004dca49adae1ac7a0d9f3b025',1,'plugin.php']]],
+ ['reltoabs',['reltoabs',['../text_8php.html#ad855a32bee22c3f3b9734e3a334b96f2',1,'text.php']]],
+ ['remote_5fuser',['remote_user',['../boot_8php.html#a5542c5c2806ab8bca04bad53d47b5209',1,'boot.php']]],
+ ['remove_5fall_5fxchan_5fresources',['remove_all_xchan_resources',['../Contact_8php.html#acc12cda999c88c4d6185cca967c15125',1,'Contact.php']]],
+ ['remove_5fchild',['remove_child',['../classItem.html#a2ce70ef63f9f4d86a09c351678806925',1,'Item']]],
+ ['remove_5fcommunity_5ftag',['remove_community_tag',['../zot_8php.html#aad25a3fe0e1566121d6fb8222979bc10',1,'zot.php']]],
+ ['remove_5fparent',['remove_parent',['../classItem.html#aa452b5bcd8dea12119b09212c615cb41',1,'Item']]],
+ ['remove_5fqueue_5fitem',['remove_queue_item',['../queue__fn_8php.html#a8fe71e981399bbf5d000a6ca42f57b24',1,'queue_fn.php']]],
+ ['removeme_2ephp',['removeme.php',['../removeme_8php.html',1,'']]],
+ ['removeme_5fcontent',['removeme_content',['../removeme_8php.html#a065a589caa2aa84c60f7073a28f0ad9c',1,'removeme.php']]],
+ ['removeme_5fpost',['removeme_post',['../removeme_8php.html#a7be08738beca44bb98a79e01cdb2ee88',1,'removeme.php']]],
+ ['render_5flocation_5fdefault',['render_location_default',['../conversation_8php.html#a40b9b5e7825bc73932a32e667f05e6f2',1,'conversation.php']]],
+ ['replace',['replace',['../classTemplate.html#a285b5b2007dbbf733476273df3fed4ef',1,'Template']]],
+ ['replace_5fmacros',['replace_macros',['../classFriendicaSmartyEngine.html#ad62f1181d2f02b54b46731ad2bd46db2',1,'FriendicaSmartyEngine\replace_macros()'],['../interfaceITemplateEngine.html#aaa7381c8becc3d1c1790b53988a0f243',1,'ITemplateEngine\replace_macros()'],['../classTemplate.html#a07737733f6949bdedea1e3d301b2ab7b',1,'Template\replace_macros()'],['../text_8php.html#a9c6ce4e12a4ac883c5e3f36fed6e1e09',1,'replace_macros():&#160;text.php']]],
+ ['request_5ftoken_5fduration',['REQUEST_TOKEN_DURATION',['../oauth_8php.html#a7a32a5990f113ac9465b03b29175cf16',1,'oauth.php']]],
+ ['requestdata',['requestdata',['../include_2api_8php.html#a43c47de8565cc00c3369cb35c19cc75e',1,'api.php']]],
+ ['return_5fbytes',['return_bytes',['../text_8php.html#ae2126da85966da0e79c6bcbac63b0bda',1,'text.php']]],
+ ['rmagic_2ephp',['rmagic.php',['../rmagic_8php.html',1,'']]],
+ ['rmagic_5fcontent',['rmagic_content',['../rmagic_8php.html#a3e28db1e5cfa7e5c2617f90222c1caef',1,'rmagic.php']]],
+ ['rmagic_5finit',['rmagic_init',['../rmagic_8php.html#a95455edd43f1bff39446a57388cdde16',1,'rmagic.php']]],
+ ['rmagic_5fpost',['rmagic_post',['../rmagic_8php.html#a869de069d081b3c4e98b957d06bbf08f',1,'rmagic.php']]],
+ ['rotate',['rotate',['../classphoto__driver.html#a2f2b6337cf9aa0688d10b422123f0eec',1,'photo_driver\rotate()'],['../classphoto__gd.html#a77f87730b11093b76980c541159df37d',1,'photo_gd\rotate()'],['../classphoto__imagick.html#a9df5738a4a18e76dd304c440e96f045f',1,'photo_imagick\rotate()']]],
+ ['rpost_2ephp',['rpost.php',['../rpost_8php.html',1,'']]],
+ ['rpost_5fcallback',['rpost_callback',['../bbcode_8php.html#a5165a5221a52cf1bc1d7812ebd2069c7',1,'bbcode.php']]],
+ ['rpost_5fcontent',['rpost_content',['../rpost_8php.html#a8190354d789000806d9879aea276728f',1,'rpost.php']]],
+ ['rsa_5fsign',['rsa_sign',['../crypto_8php.html#a920e5f222d0020f47556033d8b2b6552',1,'crypto.php']]],
+ ['rsa_5fverify',['rsa_verify',['../crypto_8php.html#ab4f21d8f6b8ece0915e7c8bb73379f96',1,'crypto.php']]],
+ ['rsd_5fxml_2ephp',['rsd_xml.php',['../rsd__xml_8php.html',1,'']]],
+ ['rsd_5fxml_5fcontent',['rsd_xml_content',['../rsd__xml_8php.html#a740cd02fa15e5a53f8547fac73f0ab82',1,'rsd_xml.php']]],
+ ['runs',['runs',['../docblox__errorchecker_8php.html#a21b4bbe5aae2d85db33affc7126a67ec',1,'docblox_errorchecker.php']]]
+];
diff --git a/doc/html/search/all_73.html b/doc/html/search/all_73.html
new file mode 100644
index 000000000..9abac91a9
--- /dev/null
+++ b/doc/html/search/all_73.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_73.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/all_73.js b/doc/html/search/all_73.js
new file mode 100644
index 000000000..7a16cc846
--- /dev/null
+++ b/doc/html/search/all_73.js
@@ -0,0 +1,121 @@
+var searchData=
+[
+ ['sanitise_5facl',['sanitise_acl',['../text_8php.html#a9fbeae13c9abd6e27cb4d8d1817f969c',1,'text.php']]],
+ ['save',['save',['../classphoto__driver.html#a5864fae7d8389372955a8e78cec527ac',1,'photo_driver']]],
+ ['saveimage',['saveImage',['../classphoto__driver.html#a22ecb8c696de65a5a10bd185be9d90c3',1,'photo_driver']]],
+ ['scale_5fexternal_5fimages',['scale_external_images',['../include_2network_8php.html#ae8d9c41a11000fb8667039fc71b4f73f',1,'network.php']]],
+ ['scaleimage',['scaleImage',['../classphoto__driver.html#af0f7ec48a31ae9b557b6e3f8bd5b4af0',1,'photo_driver']]],
+ ['scaleimagesquare',['scaleImageSquare',['../classphoto__driver.html#a56634842b071b96502716e9843ea5361',1,'photo_driver']]],
+ ['scaleimageup',['scaleImageUp',['../classphoto__driver.html#a1a63c4ae17e892a115ab9cf6efb960ce',1,'photo_driver']]],
+ ['script_5fpath',['script_path',['../plugin_8php.html#a0e8c2ea50bfdbc39e17ccccaea21ddc3',1,'plugin.php']]],
+ ['search',['search',['../text_8php.html#a876e94892867019935b348b573299352',1,'text.php']]],
+ ['search_2ephp',['search.php',['../search_8php.html',1,'']]],
+ ['search_5fac_2ephp',['search_ac.php',['../search__ac_8php.html',1,'']]],
+ ['search_5fac_5finit',['search_ac_init',['../search__ac_8php.html#a14f90c83a3f2be095e9e2992a8d66138',1,'search_ac.php']]],
+ ['search_5fcontent',['search_content',['../search_8php.html#ab2568591359edde5b483a6cd9a24b2cc',1,'search.php']]],
+ ['search_5finit',['search_init',['../search_8php.html#acf19fd30f07f495781ca0d7a0a08b435',1,'search.php']]],
+ ['searchbox',['searchbox',['../text_8php.html#aae91e4d2a2c6f7a9daccd2c186ae3447',1,'text.php']]],
+ ['security_2ephp',['security.php',['../security_8php.html',1,'']]],
+ ['select_5ftimezone',['select_timezone',['../datetime_8php.html#a633dadba426fa2f60b25fabdb19ebc1f',1,'datetime.php']]],
+ ['send',['send',['../classenotify.html#afbc088860f534c6c05788b48cfc262c6',1,'enotify']]],
+ ['send_5fmessage',['send_message',['../include_2message_8php.html#a751ffd6635022b2190f56154ee745752',1,'message.php']]],
+ ['send_5freg_5fapproval_5femail',['send_reg_approval_email',['../account_8php.html#a014de2d5d5c9785de5bf547a485822fa',1,'account.php']]],
+ ['send_5fstatus_5fnotifications',['send_status_notifications',['../items_8php.html#aab9e0c58247427126de0699c729c3b6c',1,'items.php']]],
+ ['send_5fverification_5femail',['send_verification_email',['../account_8php.html#aa9c29c497c17d8f9344dce8631ad8761',1,'account.php']]],
+ ['service_5fclass_5fallows',['service_class_allows',['../plugin_8php.html#a030cec6793b909c439c0336ba39b1571',1,'plugin.php']]],
+ ['service_5fclass_5ffetch',['service_class_fetch',['../plugin_8php.html#a905b54e10704b283ac64680a8abc0971',1,'plugin.php']]],
+ ['session_2ephp',['session.php',['../session_8php.html',1,'']]],
+ ['set',['set',['../classCache.html#ae622b82adc1c2fb1f3e2cc4fd9688fce',1,'Cache']]],
+ ['set_5faccount',['set_account',['../classApp.html#aeb1fe1c8ad9aa639909bd183ce578536',1,'App']]],
+ ['set_5fapp',['set_app',['../classBaseObject.html#a0a9acda12d751692834cf6999f889223',1,'BaseObject']]],
+ ['set_5fapps',['set_apps',['../classApp.html#abea5a4f77dcd53c928dc4eed86616637',1,'App']]],
+ ['set_5fbaseurl',['set_baseurl',['../classApp.html#a78788f6e9d8b713b138f81e457c5cd08',1,'App']]],
+ ['set_5fchannel',['set_channel',['../classApp.html#a89e9feb2bfb5253883a9720beaffe876',1,'App']]],
+ ['set_5fcommentable',['set_commentable',['../classItem.html#aa1bd19fc8b5577078530265a7bf64123',1,'Item']]],
+ ['set_5fconfig',['set_config',['../include_2config_8php.html#ad6da879e4fb5b37d1e161d4e9be5c32a',1,'config.php']]],
+ ['set_5fconversation',['set_conversation',['../classItem.html#aa8b1bbc4236890694635295e46d7fd72',1,'Item']]],
+ ['set_5fdefault_5flogin_5fidentity',['set_default_login_identity',['../identity_8php.html#a78151baf4407a8482d2681a91a9c486b',1,'identity.php']]],
+ ['set_5fgroups',['set_groups',['../classApp.html#a3d84af5e42082098672531cd1a618853',1,'App']]],
+ ['set_5fhostname',['set_hostname',['../classApp.html#a344d2b7dc2f276648d521aee4da1731c',1,'App']]],
+ ['set_5fmode',['set_mode',['../classConversation.html#a66f121ca4026246f86a732e5faa0682c',1,'Conversation']]],
+ ['set_5fobserver',['set_observer',['../classApp.html#a4776d9322edea17fae56afa5d01a323e',1,'App']]],
+ ['set_5fpager_5fitemspage',['set_pager_itemspage',['../classApp.html#a4bdd7bfed62f50515fce652127bf481b',1,'App']]],
+ ['set_5fpager_5ftotal',['set_pager_total',['../classApp.html#a560189f048d3db2f526841963cc43e97',1,'App']]],
+ ['set_5fparent',['set_parent',['../classItem.html#a9890ff72662d5bba301d1f2dd8aec9d7',1,'Item']]],
+ ['set_5fpath',['set_path',['../classApp.html#adb060d5c7f35a521ec7ec0effbe08097',1,'App']]],
+ ['set_5fpconfig',['set_pconfig',['../include_2config_8php.html#a61591371cb18764138655d67dc817ab2',1,'config.php']]],
+ ['set_5fperms',['set_perms',['../classApp.html#a557d7b779d8259027f4724ebf7b248dc',1,'App']]],
+ ['set_5fprofile_5fowner',['set_profile_owner',['../classConversation.html#a8898bddc1e8990e81dab9a13a532cc93',1,'Conversation']]],
+ ['set_5ftemplate',['set_template',['../classItem.html#af1b73df9b7c4b927e26b7e243b491f42',1,'Item']]],
+ ['set_5ftemplate_5fengine',['set_template_engine',['../classApp.html#a20d1890cc16b22ba79eeb0cbf2f719f7',1,'App']]],
+ ['set_5fwidget',['set_widget',['../classApp.html#a123b903dfe5d3488cc68db3471d36fd2',1,'App']]],
+ ['set_5fwriteable',['set_writeable',['../classRedBrowser.html#a40fdbb9d9fe6c1243bbf135dd5b0a06f',1,'RedBrowser']]],
+ ['set_5fxconfig',['set_xconfig',['../include_2config_8php.html#afe117b70f1bba2f6348d9300b601f86e',1,'config.php']]],
+ ['setbrowserplugin',['setBrowserPlugin',['../classRedBasicAuth.html#a358ddad4abb5aa8c1382cf49a907adbc',1,'RedBasicAuth']]],
+ ['setcurrentuser',['setCurrentUser',['../classRedBasicAuth.html#a072e8244a9a7f191b32d3db5ac94f857',1,'RedBasicAuth']]],
+ ['setdimensions',['setDimensions',['../classphoto__driver.html#ae663867d2c4eaa2fae50d60670920143',1,'photo_driver\setDimensions()'],['../classphoto__gd.html#a1c75304bd15f3b9986f0b315fb59271e',1,'photo_gd\setDimensions()'],['../classphoto__imagick.html#af92901d252c1e6ab5b54eebedbed23bb',1,'photo_imagick\setDimensions()']]],
+ ['setname',['setName',['../classRedFile.html#a38a82bfc1b30028ea6ac75923e90fa25',1,'RedFile']]],
+ ['settings_2ephp',['settings.php',['../settings_8php.html',1,'']]],
+ ['settings_5finit',['settings_init',['../settings_8php.html#a3a4cde287482fced008583f54ba2a722',1,'settings.php']]],
+ ['settings_5fpost',['settings_post',['../settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586',1,'settings.php']]],
+ ['setup_2ephp',['setup.php',['../setup_8php.html',1,'']]],
+ ['setup_5fcontent',['setup_content',['../setup_8php.html#a88247384a96e14516f474d7af6a465c1',1,'setup.php']]],
+ ['setup_5finit',['setup_init',['../setup_8php.html#a267555abd17290e659b4bf44b885e4e0',1,'setup.php']]],
+ ['setup_5fpost',['setup_post',['../setup_8php.html#a13cf286774149a0a7bd8adb8179cec75',1,'setup.php']]],
+ ['sexpref_5fselector',['sexpref_selector',['../profile__selectors_8php.html#a3b50b3ea4ea4bdbebebfffc5d1b157c7',1,'profile_selectors.php']]],
+ ['share_2ephp',['share.php',['../share_8php.html',1,'']]],
+ ['share_5finit',['share_init',['../share_8php.html#afeb26046bdd02567ecd29ab5f188b249',1,'share.php']]],
+ ['showform',['showForm',['../fpostit_8php.html#a3f3ae3ae61578b5671673914fd894443',1,'fpostit.php']]],
+ ['site_5fdefault_5fperms',['site_default_perms',['../permissions_8php.html#aa8b7b102c653649d7a71b5a1c044d90d',1,'permissions.php']]],
+ ['siteinfo_2ephp',['siteinfo.php',['../siteinfo_8php.html',1,'']]],
+ ['siteinfo_5fcontent',['siteinfo_content',['../siteinfo_8php.html#a70c09bfb6dd1c86a125a35f62ed53656',1,'siteinfo.php']]],
+ ['siteinfo_5finit',['siteinfo_init',['../siteinfo_8php.html#a3efbd0bd6564af19ec0a9ce0294e59d0',1,'siteinfo.php']]],
+ ['sitelist_2ephp',['sitelist.php',['../sitelist_8php.html',1,'']]],
+ ['sitelist_5finit',['sitelist_init',['../sitelist_8php.html#a665a59bf60f780b40f32c909f4a473b1',1,'sitelist.php']]],
+ ['smile_5fdecode',['smile_decode',['../text_8php.html#aca0f589be74fab1a460c57e88dad9779',1,'text.php']]],
+ ['smile_5fencode',['smile_encode',['../text_8php.html#a44d460fcdee6247c67b9bef3ea15f3e6',1,'text.php']]],
+ ['smilies',['smilies',['../text_8php.html#a3d225b253bb9e0f2498c11647d927b0b',1,'text.php']]],
+ ['smilies_2ephp',['smilies.php',['../smilies_8php.html',1,'']]],
+ ['smilies_5fcontent',['smilies_content',['../smilies_8php.html#ab43b1e9f33a700a830aff14c7b3a617f',1,'smilies.php']]],
+ ['socgraph_2ephp',['socgraph.php',['../socgraph_8php.html',1,'']]],
+ ['sort_5fby_5fdate',['sort_by_date',['../event_8php.html#a018ea4484910a873a7c1eaa126de9b1a',1,'event.php']]],
+ ['sort_5fitem_5fchildren',['sort_item_children',['../conversation_8php.html#ae996eb116d397a2c6396c312d7b98664',1,'conversation.php']]],
+ ['sort_5fthr_5fcommented',['sort_thr_commented',['../conversation_8php.html#a9f909b8885259b79c6ac8da93afd8f11',1,'conversation.php']]],
+ ['sort_5fthr_5fcreated',['sort_thr_created',['../conversation_8php.html#ac55e070f65f46fcc8e269f7896be4c7d',1,'conversation.php']]],
+ ['sort_5fthr_5fcreated_5frev',['sort_thr_created_rev',['../conversation_8php.html#a9cc2a679606da9e535a06433f9f553a0',1,'conversation.php']]],
+ ['sources_2ephp',['sources.php',['../sources_8php.html',1,'']]],
+ ['sources_5fcontent',['sources_content',['../sources_8php.html#ac442ccef080ab95772d8929fcafcb4b7',1,'sources.php']]],
+ ['sources_5fpost',['sources_post',['../sources_8php.html#ac73298ff162ce7b2de8dcaf3d3305b1e',1,'sources.php']]],
+ ['ssl_5fpolicy_5ffull',['SSL_POLICY_FULL',['../boot_8php.html#a02566ac9d891369a1d3ebb81a15722fc',1,'boot.php']]],
+ ['ssl_5fpolicy_5fnone',['SSL_POLICY_NONE',['../boot_8php.html#af86c651547aa8f9e549ee40a09455549',1,'boot.php']]],
+ ['ssl_5fpolicy_5fselfsign',['SSL_POLICY_SELFSIGN',['../boot_8php.html#adca48aee78465ae3064ca4432c0d87b5',1,'boot.php']]],
+ ['sslify',['sslify',['../text_8php.html#a33bdb5d4bfff2ede7caf61a98ac0a2e9',1,'text.php']]],
+ ['sslify_2ephp',['sslify.php',['../sslify_8php.html',1,'']]],
+ ['sslify_5finit',['sslify_init',['../sslify_8php.html#a75b11e54a3d1fc83e7d4c0e8b4dab316',1,'sslify.php']]],
+ ['starred_2ephp',['starred.php',['../starred_8php.html',1,'']]],
+ ['starred_5finit',['starred_init',['../starred_8php.html#a63024fb418c678e49fd535e3752d349a',1,'starred.php']]],
+ ['startup',['startup',['../boot_8php.html#aca47505b8732177f52bb2d647eb2741c',1,'boot.php']]],
+ ['status_5feditor',['status_editor',['../conversation_8php.html#a2a7d541854bba755eb8ada59af7dcb1a',1,'conversation.php']]],
+ ['storage_5fdefault_5fpermissions',['STORAGE_DEFAULT_PERMISSIONS',['../boot_8php.html#aecaa1b6945b317ba8f1daf4af2aed8e6',1,'boot.php']]],
+ ['store',['store',['../classphoto__driver.html#a642a8d0c4ad5f887c99c6af77cee287b',1,'photo_driver']]],
+ ['store_5fitem_5ftag',['store_item_tag',['../taxonomy_8php.html#a4ba1339b2a7054971178ce194e4440fd',1,'taxonomy.php']]],
+ ['stream_5fperms_5fapi_5fuids',['stream_perms_api_uids',['../security_8php.html#ae92c5c1a1cbbc49ddbb8b3265d2db809',1,'security.php']]],
+ ['stream_5fperms_5fxchans',['stream_perms_xchans',['../security_8php.html#a15e0f8f511cc06192db63387f97238b3',1,'security.php']]],
+ ['string_5fplural_5fselect_5fdefault',['string_plural_select_default',['../language_8php.html#a151e5b4689aef86a12642cbb7a00bfe0',1,'language.php']]],
+ ['stringify_5farray_5felms',['stringify_array_elms',['../text_8php.html#a8796f6a9ca592ecdce7b3afc3462aa13',1,'text.php']]],
+ ['stripdcode_5fbr_5fcb',['stripdcode_br_cb',['../bb2diaspora_8php.html#a180b0e3a7d702998be19e3c3b44b0e93',1,'bb2diaspora.php']]],
+ ['style_2ephp',['style.php',['../apw_2php_2style_8php.html',1,'']]],
+ ['style_2ephp',['style.php',['../redbasic_2php_2style_8php.html',1,'']]],
+ ['subthread_2ephp',['subthread.php',['../subthread_8php.html',1,'']]],
+ ['subthread_5fcontent',['subthread_content',['../subthread_8php.html#a50368f3d825b77996030528e7fbfa3d3',1,'subthread.php']]],
+ ['suggest_2ephp',['suggest.php',['../suggest_8php.html',1,'']]],
+ ['suggest_5fcontent',['suggest_content',['../suggest_8php.html#a58748a8235d4523f8333847f3e42dd91',1,'suggest.php']]],
+ ['suggest_5finit',['suggest_init',['../suggest_8php.html#a696acf1dd8070e479adcc80c63c6718c',1,'suggest.php']]],
+ ['suggestion_5fquery',['suggestion_query',['../socgraph_8php.html#a76e6fca3d2bc842dcd9e710bb87c8329',1,'socgraph.php']]],
+ ['supportedtypes',['supportedTypes',['../classphoto__driver.html#a6eee8e36eaf9339f4faf80ddd43162da',1,'photo_driver\supportedTypes()'],['../classphoto__gd.html#a16f3dd7d3559f715aa2fe3f7880836dd',1,'photo_gd\supportedTypes()'],['../classphoto__imagick.html#a27596faca6108d9d563674d1b654a0b7',1,'photo_imagick\supportedTypes()']]],
+ ['sync_5fdirectories',['sync_directories',['../dir__fns_8php.html#aa666e7df6ca8c332f4081c9b66b4bdf6',1,'dir_fns.php']]],
+ ['syncdirs',['syncdirs',['../dir__fns_8php.html#a6cae22cfdd6edda5ddf09e07abb3242a',1,'dir_fns.php']]],
+ ['system_5fdown',['system_down',['../system__unavailable_8php.html#a73751a6bcc17ad3ca503496e2fb020fa',1,'system_unavailable.php']]],
+ ['system_5funavailable',['system_unavailable',['../boot_8php.html#ac608a34f3bc180e7724192e0fd31f9b0',1,'boot.php']]],
+ ['system_5funavailable_2ephp',['system_unavailable.php',['../system__unavailable_8php.html',1,'']]]
+];
diff --git a/doc/html/search/all_74.html b/doc/html/search/all_74.html
new file mode 100644
index 000000000..c646aeffc
--- /dev/null
+++ b/doc/html/search/all_74.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_74.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/all_74.js b/doc/html/search/all_74.js
new file mode 100644
index 000000000..a93bf7ab4
--- /dev/null
+++ b/doc/html/search/all_74.js
@@ -0,0 +1,69 @@
+var searchData=
+[
+ ['t',['t',['../language_8php.html#aae0c3638fb476ae1e31f8d242f5dac04',1,'language.php']]],
+ ['tag_5fdeliver',['tag_deliver',['../items_8php.html#ab1bce4261bcf75ad62753b498a144d17',1,'items.php']]],
+ ['tagadelic',['tagadelic',['../taxonomy_8php.html#aaf90ba8b839d6459065f39a4f1109b8a',1,'taxonomy.php']]],
+ ['tagblock',['tagblock',['../taxonomy_8php.html#ac21d1dff16d569e7d110167aea4e63c2',1,'taxonomy.php']]],
+ ['tagger_2ephp',['tagger.php',['../tagger_8php.html',1,'']]],
+ ['tagger_5fcontent',['tagger_content',['../tagger_8php.html#a0e4a3eb177d1684553c547503d67161c',1,'tagger.php']]],
+ ['tagrm_2ephp',['tagrm.php',['../tagrm_8php.html',1,'']]],
+ ['tagrm_5fcontent',['tagrm_content',['../tagrm_8php.html#adfd4ea5b4d7fc6d9c9e042af5cd7d49a',1,'tagrm.php']]],
+ ['tagrm_5fpost',['tagrm_post',['../tagrm_8php.html#a1702f40aa53a2fa93deade1f609abe78',1,'tagrm.php']]],
+ ['tags_5fsort',['tags_sort',['../taxonomy_8php.html#aaeded36bcc983b35d9205fe5b6c18c43',1,'taxonomy.php']]],
+ ['taxonomy_2ephp',['taxonomy.php',['../taxonomy_8php.html',1,'']]],
+ ['template',['Template',['../classTemplate.html',1,'']]],
+ ['template_5fengine',['template_engine',['../classApp.html#a94a1ed2dc493c58612d17035b74ae736',1,'App']]],
+ ['template_5fescape',['template_escape',['../template__processor_8php.html#ab2bcd8738f20f293636a6ae8e1099db5',1,'template_processor.php']]],
+ ['template_5fprocessor_2ephp',['template_processor.php',['../template__processor_8php.html',1,'']]],
+ ['template_5funescape',['template_unescape',['../template__processor_8php.html#ac635bb19a5f6eadd6b0cddefdd537c1e',1,'template_processor.php']]],
+ ['term_5fcategory',['TERM_CATEGORY',['../boot_8php.html#af33d1b2e98a1e21af672005525d46dfe',1,'boot.php']]],
+ ['term_5ffile',['TERM_FILE',['../boot_8php.html#afb97615e985a013799839b68b99018d7',1,'boot.php']]],
+ ['term_5fhashtag',['TERM_HASHTAG',['../boot_8php.html#a2750985ec445617d7e82ae3098c91e3f',1,'boot.php']]],
+ ['term_5fmention',['TERM_MENTION',['../boot_8php.html#ae37444eaa42705185080ccf3e670cbc2',1,'boot.php']]],
+ ['term_5fobj_5fchannel',['TERM_OBJ_CHANNEL',['../boot_8php.html#a8892374789fd261eb32a7969d934a14a',1,'boot.php']]],
+ ['term_5fobj_5fobject',['TERM_OBJ_OBJECT',['../boot_8php.html#a882b666adfe21f035a0f8c02806066d6',1,'boot.php']]],
+ ['term_5fobj_5fphoto',['TERM_OBJ_PHOTO',['../boot_8php.html#a64617d4655804de2a3c86501ab4fdbfd',1,'boot.php']]],
+ ['term_5fobj_5fpost',['TERM_OBJ_POST',['../boot_8php.html#a9eeb8989272d5ff804a616898bb13659',1,'boot.php']]],
+ ['term_5fobj_5fprofile',['TERM_OBJ_PROFILE',['../boot_8php.html#aead84fa27d7516b855220fe004964a45',1,'boot.php']]],
+ ['term_5fobj_5fthing',['TERM_OBJ_THING',['../boot_8php.html#a0cc8dc76bd10ac0ec81bac08a46f82fe',1,'boot.php']]],
+ ['term_5fpcategory',['TERM_PCATEGORY',['../boot_8php.html#a45b12aefab9675baffc7a07a09486db8',1,'boot.php']]],
+ ['term_5fquery',['term_query',['../taxonomy_8php.html#a7a913d19c77610da689be48fbbf6734c',1,'taxonomy.php']]],
+ ['term_5fsavedsearch',['TERM_SAVEDSEARCH',['../boot_8php.html#abd7bb40da9cc073297e49736b338ca07',1,'boot.php']]],
+ ['term_5fthing',['TERM_THING',['../boot_8php.html#a0d877df1e20bae765e1708be50f6b503',1,'boot.php']]],
+ ['term_5funknown',['TERM_UNKNOWN',['../boot_8php.html#a0c59dde058efebbc66520d136cbd1631',1,'boot.php']]],
+ ['terminate_5ffriendship',['terminate_friendship',['../Contact_8php.html#a38daa1c210b78385307123450ca9a1fc',1,'Contact.php']]],
+ ['termtype',['termtype',['../items_8php.html#ad34827ed330898456783fb14c7b46154',1,'items.php']]],
+ ['text_2ephp',['text.php',['../text_8php.html',1,'']]],
+ ['tgroup_5fcheck',['tgroup_check',['../items_8php.html#a88c6cf7649ac836fbbed82a7a0315110',1,'items.php']]],
+ ['theme_2ephp',['theme.php',['../apw_2php_2theme_8php.html',1,'']]],
+ ['theme_2ephp',['theme.php',['../blogga_2php_2theme_8php.html',1,'']]],
+ ['theme_2ephp',['theme.php',['../blogga_2view_2theme_2blog_2theme_8php.html',1,'']]],
+ ['theme_2ephp',['theme.php',['../redbasic_2php_2theme_8php.html',1,'']]],
+ ['theme_5fadmin',['theme_admin',['../view_2theme_2blogga_2php_2config_8php.html#a09cd81013505f83aea0771243a1e4e53',1,'theme_admin(&amp;$a):&#160;config.php'],['../view_2theme_2blogga_2view_2theme_2blog_2config_8php.html#a09cd81013505f83aea0771243a1e4e53',1,'theme_admin(&amp;$a):&#160;config.php']]],
+ ['theme_5fadmin_5fpost',['theme_admin_post',['../view_2theme_2blogga_2php_2config_8php.html#aef2da5582b7cb6b5f63e5ca5d69fd30b',1,'theme_admin_post(&amp;$a):&#160;config.php'],['../view_2theme_2blogga_2view_2theme_2blog_2config_8php.html#aef2da5582b7cb6b5f63e5ca5d69fd30b',1,'theme_admin_post(&amp;$a):&#160;config.php']]],
+ ['theme_5fattachments',['theme_attachments',['../text_8php.html#af9c9ac3f74c82dc60acfa404d0e9dc53',1,'text.php']]],
+ ['theme_5fcontent',['theme_content',['../view_2theme_2apw_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d',1,'theme_content(&amp;$a):&#160;config.php'],['../view_2theme_2blogga_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d',1,'theme_content(&amp;$a):&#160;config.php'],['../view_2theme_2blogga_2view_2theme_2blog_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d',1,'theme_content(&amp;$a):&#160;config.php'],['../view_2theme_2redbasic_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d',1,'theme_content(&amp;$a):&#160;config.php']]],
+ ['theme_5finclude',['theme_include',['../plugin_8php.html#a65fedcffbe03562ef844cabee37d34e2',1,'plugin.php']]],
+ ['theme_5finit_2ephp',['theme_init.php',['../php_2theme__init_8php.html',1,'']]],
+ ['theme_5finit_2ephp',['theme_init.php',['../theme_2blogga_2php_2theme__init_8php.html',1,'']]],
+ ['theme_5finit_2ephp',['theme_init.php',['../theme_2redbasic_2php_2theme__init_8php.html',1,'']]],
+ ['theme_5fpost',['theme_post',['../view_2theme_2apw_2php_2config_8php.html#ad29461920cf03b9ce1428e21eb1f4ba6',1,'theme_post(&amp;$a):&#160;config.php'],['../view_2theme_2blogga_2php_2config_8php.html#ad29461920cf03b9ce1428e21eb1f4ba6',1,'theme_post(&amp;$a):&#160;config.php'],['../view_2theme_2blogga_2view_2theme_2blog_2config_8php.html#ad29461920cf03b9ce1428e21eb1f4ba6',1,'theme_post(&amp;$a):&#160;config.php'],['../view_2theme_2redbasic_2php_2config_8php.html#ad29461920cf03b9ce1428e21eb1f4ba6',1,'theme_post(&amp;$a):&#160;config.php']]],
+ ['theme_5fstatus',['theme_status',['../admin_8php.html#ad4f74f33944a98b56d2c8c7601f124a4',1,'admin.php']]],
+ ['thing_2ephp',['thing.php',['../thing_8php.html',1,'']]],
+ ['thing_5fcontent',['thing_content',['../thing_8php.html#a24a35f1e64029a67fdbea94a776ae04b',1,'thing.php']]],
+ ['thing_5finit',['thing_init',['../thing_8php.html#a8be23b1d475ec3d9291999221c674c80',1,'thing.php']]],
+ ['timesel',['timesel',['../datetime_8php.html#a36d3d6dff8d76b5f295bb3d9c535a5b1',1,'datetime.php']]],
+ ['timezone_5fcmp',['timezone_cmp',['../datetime_8php.html#aa51b5a7ea4f931b23acbdfcea46e9865',1,'datetime.php']]],
+ ['title_5fis_5fbody',['title_is_body',['../items_8php.html#aa371905f0a211b307cb3f7188c6cba04',1,'items.php']]],
+ ['toggle_5fmobile_2ephp',['toggle_mobile.php',['../toggle__mobile_8php.html',1,'']]],
+ ['toggle_5fmobile_5finit',['toggle_mobile_init',['../toggle__mobile_8php.html#aca53ade8971802b45c31e722b22c6254',1,'toggle_mobile.php']]],
+ ['toggle_5fsafesearch_2ephp',['toggle_safesearch.php',['../toggle__safesearch_8php.html',1,'']]],
+ ['toggle_5fsafesearch_5finit',['toggle_safesearch_init',['../toggle__safesearch_8php.html#a23d5cfb2727a266e44993ffbf5595a79',1,'toggle_safesearch.php']]],
+ ['toggle_5ftheme',['toggle_theme',['../admin_8php.html#af81f081851791cd15e49e8ff6722dc27',1,'admin.php']]],
+ ['tpldebug_2ephp',['tpldebug.php',['../tpldebug_8php.html',1,'']]],
+ ['tplpaths',['tplpaths',['../namespaceupdatetpl.html#a52a85ffa6b6d63d840b185a133478c12',1,'updatetpl']]],
+ ['tryoembed',['tryoembed',['../bbcode_8php.html#a55b0cb6973f1ec731de0e726bcc0efa7',1,'bbcode.php']]],
+ ['tt',['tt',['../language_8php.html#ae310fb3880484ee1cc4faefe0c63c06d',1,'language.php']]],
+ ['typo_2ephp',['typo.php',['../typo_8php.html',1,'']]],
+ ['typohelper_2ephp',['typohelper.php',['../typohelper_8php.html',1,'']]]
+];
diff --git a/doc/html/search/all_75.html b/doc/html/search/all_75.html
new file mode 100644
index 000000000..550133a97
--- /dev/null
+++ b/doc/html/search/all_75.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_75.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/all_75.js b/doc/html/search/all_75.js
new file mode 100644
index 000000000..25d8a1213
--- /dev/null
+++ b/doc/html/search/all_75.js
@@ -0,0 +1,42 @@
+var searchData=
+[
+ ['uexport_2ephp',['uexport.php',['../uexport_8php.html',1,'']]],
+ ['uexport_5finit',['uexport_init',['../uexport_8php.html#a118920137dedebe0581623a2e57e7b0d',1,'uexport.php']]],
+ ['unamp',['unamp',['../text_8php.html#a29d6b804e368d3ef359ee295e96ed4c7',1,'text.php']]],
+ ['undo_5fpost_5ftagging',['undo_post_tagging',['../text_8php.html#a740ad03e00459039a2c0992246c4e727',1,'text.php']]],
+ ['unescape_5funderscores_5fin_5flinks',['unescape_underscores_in_links',['../bb2diaspora_8php.html#a599428bceb6f6d82a6a78cb66811f747',1,'bb2diaspora.php']]],
+ ['uninstall_5fplugin',['uninstall_plugin',['../plugin_8php.html#a093a9cb98f51e3643634bd8bc6ed6e76',1,'plugin.php']]],
+ ['unload_5fplugin',['unload_plugin',['../plugin_8php.html#a90538627db68605aeb6db17a8ead6523',1,'plugin.php']]],
+ ['unobscure',['unobscure',['../text_8php.html#a8264348059abd1d4d5bb521323d3b19a',1,'text.php']]],
+ ['unregister_5fhook',['unregister_hook',['../plugin_8php.html#a56f71fe5adf9586ce950523d8180443e',1,'plugin.php']]],
+ ['unxmlify',['unxmlify',['../text_8php.html#a1360fed7f918d859daaca1c9f384f9af',1,'text.php']]],
+ ['update_5fchannel_2ephp',['update_channel.php',['../update__channel_8php.html',1,'']]],
+ ['update_5fchannel_5fcontent',['update_channel_content',['../update__channel_8php.html#aca52a9da500f0db2f0a8666af5bc06ba',1,'update_channel.php']]],
+ ['update_5fcommunity_2ephp',['update_community.php',['../update__community_8php.html',1,'']]],
+ ['update_5fcommunity_5fcontent',['update_community_content',['../update__community_8php.html#abdcc5c4ecebbe0b5fcba2755c69cb3b1',1,'update_community.php']]],
+ ['update_5fdirectory_5fentry',['update_directory_entry',['../dir__fns_8php.html#a44062d4b471d1e83f92f6c184585aa13',1,'dir_fns.php']]],
+ ['update_5fdisplay_2ephp',['update_display.php',['../update__display_8php.html',1,'']]],
+ ['update_5fdisplay_5fcontent',['update_display_content',['../update__display_8php.html#aa36ac524059e209d5d75a03c16206246',1,'update_display.php']]],
+ ['update_5ffailed',['UPDATE_FAILED',['../boot_8php.html#a75fc600186b13c3b25e661afefb5eac8',1,'boot.php']]],
+ ['update_5fflags_5fdeleted',['UPDATE_FLAGS_DELETED',['../boot_8php.html#aea392cb26ed617f3a8cde648385b5df0',1,'boot.php']]],
+ ['update_5fflags_5fupdated',['UPDATE_FLAGS_UPDATED',['../boot_8php.html#a9690d73434125ce594a1f5e7c2a4f7c0',1,'boot.php']]],
+ ['update_5fimported_5fitem',['update_imported_item',['../zot_8php.html#a31aad56acf8ff8f2353e6ff8595544df',1,'zot.php']]],
+ ['update_5fmodtime',['update_modtime',['../zot_8php.html#ab319d1d9fff9c7775d9daef42d1f33dd',1,'zot.php']]],
+ ['update_5fnetwork_2ephp',['update_network.php',['../update__network_8php.html',1,'']]],
+ ['update_5fnetwork_5fcontent',['update_network_content',['../update__network_8php.html#a8abf5b9f65af6a27ee2f9d7207ed1b41',1,'update_network.php']]],
+ ['update_5fqueue_5ftime',['update_queue_time',['../queue__fn_8php.html#a4c2876181f75a4a61e85b7f00dfdbba1',1,'queue_fn.php']]],
+ ['update_5fremote_5fid',['update_remote_id',['../items_8php.html#a2baa9e05f1e8aa3dd61c85803ae39bd6',1,'items.php']]],
+ ['update_5fsearch_2ephp',['update_search.php',['../update__search_8php.html',1,'']]],
+ ['update_5fsearch_5fcontent',['update_search_content',['../update__search_8php.html#ace4c3a23fa7d6922399e27c297a6ba52',1,'update_search.php']]],
+ ['update_5fsuccess',['UPDATE_SUCCESS',['../boot_8php.html#ac86615ddc0763a00f5311c90e991730c',1,'boot.php']]],
+ ['update_5fsuggestions',['update_suggestions',['../socgraph_8php.html#a790690bb1a1d02483fe31632a160144d',1,'socgraph.php']]],
+ ['updatetpl',['updatetpl',['../namespaceupdatetpl.html',1,'']]],
+ ['updatetpl_2epy',['updatetpl.py',['../updatetpl_8py.html',1,'']]],
+ ['upgrade_5fbool_5fmessage',['upgrade_bool_message',['../plugin_8php.html#a754d7f53b3abc557b753c057dc4e021d',1,'plugin.php']]],
+ ['upgrade_5flink',['upgrade_link',['../plugin_8php.html#a4fc13e528367f510fcb6d8bbfc559040',1,'plugin.php']]],
+ ['upgrade_5fmessage',['upgrade_message',['../plugin_8php.html#a901657dd078e070516cf97285e0bada7',1,'plugin.php']]],
+ ['user_5fallow',['user_allow',['../account_8php.html#ac5c570a2d46446bad4dd2501e9c5a4b1',1,'account.php']]],
+ ['user_5fdeny',['user_deny',['../account_8php.html#ac1653efba62493b9d87513e1b6c04c83',1,'account.php']]],
+ ['user_5fremove',['user_remove',['../Contact_8php.html#a2fc191067dd571a79603c66b04b1ca15',1,'Contact.php']]],
+ ['util',['util',['../namespaceutil.html',1,'']]]
+];
diff --git a/doc/html/search/all_76.html b/doc/html/search/all_76.html
new file mode 100644
index 000000000..50b86daa0
--- /dev/null
+++ b/doc/html/search/all_76.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_76.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/all_76.js b/doc/html/search/all_76.js
new file mode 100644
index 000000000..13376a70b
--- /dev/null
+++ b/doc/html/search/all_76.js
@@ -0,0 +1,22 @@
+var searchData=
+[
+ ['valid_5femail',['valid_email',['../text_8php.html#a6a3d80a6c6fb234fd0bac44203b828eb',1,'text.php']]],
+ ['validate_5fchannelname',['validate_channelname',['../identity_8php.html#af2802bc13a00a17b867bba7978ba8f58',1,'identity.php']]],
+ ['validate_5femail',['validate_email',['../include_2network_8php.html#a897e7112d86eb95526cbd0bff9375f02',1,'network.php']]],
+ ['validate_5furl',['validate_url',['../include_2network_8php.html#a5caa264fab6d2b2344e6bd5b298b08f2',1,'network.php']]],
+ ['validateuserpass',['validateUserPass',['../classRedBasicAuth.html#a8dfd9a0953f8884723b421b7c1acf79b',1,'RedBasicAuth']]],
+ ['var_5freplace',['var_replace',['../classTemplate.html#abbc484016ddf5d818f55b823cae6feb0',1,'Template']]],
+ ['vcard_5ffrom_5fxchan',['vcard_from_xchan',['../Contact_8php.html#a6348a532c9d26cd1c9afbc9aa6aa8960',1,'Contact.php']]],
+ ['view_2ephp',['view.php',['../view_8php.html',1,'']]],
+ ['view_5finit',['view_init',['../view_8php.html#ac168f6c61a91ba2063f13b441c0ae96e',1,'view.php']]],
+ ['viewconnections_2ephp',['viewconnections.php',['../viewconnections_8php.html',1,'']]],
+ ['viewconnections_5fcontent',['viewconnections_content',['../viewconnections_8php.html#ab6c4d983e97b3a8a879567ff76507776',1,'viewconnections.php']]],
+ ['viewconnections_5finit',['viewconnections_init',['../viewconnections_8php.html#a00163d50b17568f7b0e48b1ca9ab7330',1,'viewconnections.php']]],
+ ['viewsrc_2ephp',['viewsrc.php',['../viewsrc_8php.html',1,'']]],
+ ['viewsrc_5fcontent',['viewsrc_content',['../viewsrc_8php.html#a6eff3d0c1d7d14b335c4edb785cd60a4',1,'viewsrc.php']]],
+ ['visible_5factivity',['visible_activity',['../conversation_8php.html#a7eeaaf44506815576f3bd80053ef52c3',1,'conversation.php']]],
+ ['vote_2ephp',['vote.php',['../vote_8php.html',1,'']]],
+ ['vote_5fcontent',['vote_content',['../vote_8php.html#a6aa67489bf458ca5e3206e46dac68596',1,'vote.php']]],
+ ['vote_5finit',['vote_init',['../vote_8php.html#ae0c6610f40afbbc1f4fe6494c51fbab2',1,'vote.php']]],
+ ['vote_5fpost',['vote_post',['../vote_8php.html#a57a9516ee1b923b224e66dcc47377fb2',1,'vote.php']]]
+];
diff --git a/doc/html/search/all_77.html b/doc/html/search/all_77.html
new file mode 100644
index 000000000..55d714292
--- /dev/null
+++ b/doc/html/search/all_77.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_77.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/all_77.js b/doc/html/search/all_77.js
new file mode 100644
index 000000000..9301e9453
--- /dev/null
+++ b/doc/html/search/all_77.js
@@ -0,0 +1,43 @@
+var searchData=
+[
+ ['wall_5fattach_2ephp',['wall_attach.php',['../wall__attach_8php.html',1,'']]],
+ ['wall_5fattach_5fpost',['wall_attach_post',['../wall__attach_8php.html#a7385e970e93228d082f0fd7254f6e653',1,'wall_attach.php']]],
+ ['wall_5fupload_2ephp',['wall_upload.php',['../wall__upload_8php.html',1,'']]],
+ ['wall_5fupload_5fpost',['wall_upload_post',['../wall__upload_8php.html#a7cbe204244cf9e0380ee932263a74d8f',1,'wall_upload.php']]],
+ ['webfinger',['webfinger',['../include_2network_8php.html#a8122356933bcd6b0a8567e8e15ae5cc5',1,'network.php']]],
+ ['webfinger_2ephp',['webfinger.php',['../webfinger_8php.html',1,'']]],
+ ['webfinger_5fcontent',['webfinger_content',['../webfinger_8php.html#a17dd28db6d390194bf9ecb809739d1d3',1,'webfinger.php']]],
+ ['webfinger_5fdfrn',['webfinger_dfrn',['../include_2network_8php.html#adf6008b38c555e98e7ed10da9ede2335',1,'network.php']]],
+ ['webpages_2ephp',['webpages.php',['../webpages_8php.html',1,'']]],
+ ['webpages_5fcontent',['webpages_content',['../webpages_8php.html#af3b7397d4abc153e3d2147740ee1a41d',1,'webpages.php']]],
+ ['wfinger_2ephp',['wfinger.php',['../wfinger_8php.html',1,'']]],
+ ['wfinger_5finit',['wfinger_init',['../wfinger_8php.html#ae21e50c8d0a5f3c9be9f43a4e519acd3',1,'wfinger.php']]],
+ ['what_5fnext',['what_next',['../setup_8php.html#aea1ebdda58ec938f4e7b31aa5c5f6b58',1,'setup.php']]],
+ ['while',['while',['../docblox__errorchecker_8php.html#af4ca738a05beffe9c8c23e1f7aea3c2d',1,'docblox_errorchecker.php']]],
+ ['widedarkness_2ephp',['widedarkness.php',['../widedarkness_8php.html',1,'']]],
+ ['widget_5faffinity',['widget_affinity',['../widgets_8php.html#add9b24d3304e529a7975e96122315554',1,'widgets.php']]],
+ ['widget_5farchive',['widget_archive',['../widgets_8php.html#a7b1e357b5a2027718470b77ec921fc65',1,'widgets.php']]],
+ ['widget_5fcategories',['widget_categories',['../widgets_8php.html#af37fdad3b2e861d860a4a8c4d8a76c0b',1,'widgets.php']]],
+ ['widget_5fcollections',['widget_collections',['../widgets_8php.html#aa189a07241246d97efbee29f1c6a6f7f',1,'widgets.php']]],
+ ['widget_5fdesign_5ftools',['widget_design_tools',['../widgets_8php.html#a145ff35319cfa47a9cc07f9425bd674b',1,'widgets.php']]],
+ ['widget_5fdirsafemode',['widget_dirsafemode',['../widgets_8php.html#a268b01ce1ab8fe2cb346cb769b9d1091',1,'widgets.php']]],
+ ['widget_5fdirsort',['widget_dirsort',['../widgets_8php.html#a95c06bc9be133e89768746302d2ac395',1,'widgets.php']]],
+ ['widget_5fdirtags',['widget_dirtags',['../widgets_8php.html#a08035db02ff6a23260146b4c64153422',1,'widgets.php']]],
+ ['widget_5ffiler',['widget_filer',['../widgets_8php.html#a5ab3b64496e02cab56429978ad55f1c0',1,'widgets.php']]],
+ ['widget_5ffindpeople',['widget_findpeople',['../widgets_8php.html#ade630b19fb4c622b7b2f6f8ef89eefa2',1,'widgets.php']]],
+ ['widget_5ffollow',['widget_follow',['../widgets_8php.html#ad1bf7aa69e8d100d95faba17c7bc91cd',1,'widgets.php']]],
+ ['widget_5ffullprofile',['widget_fullprofile',['../widgets_8php.html#a70442dfa079312d9d5e5ee01be51a165',1,'widgets.php']]],
+ ['widget_5fmailmenu',['widget_mailmenu',['../widgets_8php.html#afa2e55a78f95667a6da082efac7fec74',1,'widgets.php']]],
+ ['widget_5fmenu_5fpreview',['widget_menu_preview',['../widgets_8php.html#a3bdfb81bf9a8ddf219924fa7eaf22013',1,'widgets.php']]],
+ ['widget_5fnotes',['widget_notes',['../widgets_8php.html#a45ea061dabe9a8372e4ca3b9e5714256',1,'widgets.php']]],
+ ['widget_5fphoto_5falbums',['widget_photo_albums',['../widgets_8php.html#a702e2fc0adc9b615999eca18b7311b5e',1,'widgets.php']]],
+ ['widget_5fprofile',['widget_profile',['../widgets_8php.html#abd2e508a2a0b911c4a838e3cb7599923',1,'widgets.php']]],
+ ['widget_5fsavedsearch',['widget_savedsearch',['../widgets_8php.html#a94203eb9bcd63cbdecbbcb15163598d8',1,'widgets.php']]],
+ ['widget_5fsettings_5fmenu',['widget_settings_menu',['../widgets_8php.html#aaa73bcf1702eaadd9dcd253502f55e01',1,'widgets.php']]],
+ ['widget_5fsuggestions',['widget_suggestions',['../widgets_8php.html#a0d404276fedc59f5038cf5c085028326',1,'widgets.php']]],
+ ['widget_5ftagcloud',['widget_tagcloud',['../widgets_8php.html#a6dbc227aac750774284ee39c45f0a200',1,'widgets.php']]],
+ ['widget_5ftagcloud_5fwall',['widget_tagcloud_wall',['../widgets_8php.html#ae4ced69d83dbdd9e6b51660d9eba8653',1,'widgets.php']]],
+ ['widget_5fvcard',['widget_vcard',['../widgets_8php.html#abe03366fd22fd27d683518fa0765da50',1,'widgets.php']]],
+ ['widgets_2ephp',['widgets.php',['../widgets_8php.html',1,'']]],
+ ['writepages_5fwidget',['writepages_widget',['../page__widgets_8php.html#a1a1e729da27f252cab6678288a17958f',1,'page_widgets.php']]]
+];
diff --git a/doc/html/search/all_78.html b/doc/html/search/all_78.html
new file mode 100644
index 000000000..39075d44e
--- /dev/null
+++ b/doc/html/search/all_78.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_78.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/all_78.js b/doc/html/search/all_78.js
new file mode 100644
index 000000000..c3fc54170
--- /dev/null
+++ b/doc/html/search/all_78.js
@@ -0,0 +1,23 @@
+var searchData=
+[
+ ['x',['x',['../boot_8php.html#a01353c9abebc3544ea080ac161729632',1,'boot.php']]],
+ ['xchan_2ephp',['xchan.php',['../xchan_8php.html',1,'']]],
+ ['xchan_5fcontent',['xchan_content',['../xchan_8php.html#a9853348bf1a35c644460221ba75edc2d',1,'xchan.php']]],
+ ['xchan_5fflags_5fcensored',['XCHAN_FLAGS_CENSORED',['../boot_8php.html#accd6f36cc9f40225cbd720e4d12a7c6e',1,'boot.php']]],
+ ['xchan_5fflags_5fdeleted',['XCHAN_FLAGS_DELETED',['../boot_8php.html#a9ea1290e00c6d40684892047f2c778a9',1,'boot.php']]],
+ ['xchan_5fflags_5fhidden',['XCHAN_FLAGS_HIDDEN',['../boot_8php.html#a1af3ed96de14aa0d7891b39cc75b60f2',1,'boot.php']]],
+ ['xchan_5fflags_5fnormal',['XCHAN_FLAGS_NORMAL',['../boot_8php.html#a8fdcc4ffb365a3267bd02ce8a8d466d6',1,'boot.php']]],
+ ['xchan_5fflags_5forphan',['XCHAN_FLAGS_ORPHAN',['../boot_8php.html#a1c923b99bf77e4203ae94e5684b6ad0f',1,'boot.php']]],
+ ['xchan_5fflags_5fselfcensored',['XCHAN_FLAGS_SELFCENSORED',['../boot_8php.html#a5a681a672e007cdc22b43345d71f07c6',1,'boot.php']]],
+ ['xchan_5fflags_5fsystem',['XCHAN_FLAGS_SYSTEM',['../boot_8php.html#afef254290febac854c85fc698d9483a6',1,'boot.php']]],
+ ['xchan_5fmail_5fquery',['xchan_mail_query',['../text_8php.html#a543447c5ed766535221e2d9636b379ee',1,'text.php']]],
+ ['xchan_5fquery',['xchan_query',['../text_8php.html#a36a2e5d418ee81140f25c4233cfecd1f',1,'text.php']]],
+ ['xml2array',['xml2array',['../include_2network_8php.html#a99353baabbc3e0584b85eb79ee802cff',1,'network.php']]],
+ ['xml_5fstatus',['xml_status',['../include_2network_8php.html#a9e9da2aafb806c98ecdc318604e60dc6',1,'network.php']]],
+ ['xmlify',['xmlify',['../text_8php.html#aaed4413ed8918838b517e3b2fafaea0d',1,'text.php']]],
+ ['xpost_5fto_5fhtml2bbcode',['xpost_to_html2bbcode',['../post__to__red_8php.html#af2713018a2dc97e88f121fc6215beb66',1,'post_to_red.php']]],
+ ['xrd_2ephp',['xrd.php',['../xrd_8php.html',1,'']]],
+ ['xrd_5finit',['xrd_init',['../xrd_8php.html#aee3cf087968e4a0ff3a87de16eb23270',1,'xrd.php']]],
+ ['xref_2ephp',['xref.php',['../xref_8php.html',1,'']]],
+ ['xref_5finit',['xref_init',['../xref_8php.html#a9bee399213b8de8226b0d60834307473',1,'xref.php']]]
+];
diff --git a/doc/html/search/all_7a.html b/doc/html/search/all_7a.html
new file mode 100644
index 000000000..5d99ff761
--- /dev/null
+++ b/doc/html/search/all_7a.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_7a.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/all_7a.js b/doc/html/search/all_7a.js
new file mode 100644
index 000000000..a5c681623
--- /dev/null
+++ b/doc/html/search/all_7a.js
@@ -0,0 +1,38 @@
+var searchData=
+[
+ ['z_5fbirthday',['z_birthday',['../datetime_8php.html#ab55e545b72ec8c097e052ea7d373491f',1,'datetime.php']]],
+ ['z_5ffetch_5furl',['z_fetch_url',['../include_2network_8php.html#aafd06c0a75402aefb06cfb9f9740fa37',1,'network.php']]],
+ ['z_5finput_5ffilter',['z_input_filter',['../text_8php.html#a324c58f37f6acdf9cd1922aa76077d9f',1,'text.php']]],
+ ['z_5fmime_5fcontent_5ftype',['z_mime_content_type',['../include_2attach_8php.html#a6fdd92775f31c07d2863e16e0026018a',1,'attach.php']]],
+ ['z_5fpath',['z_path',['../boot_8php.html#aba208673515cbb8a55e5fa4a1da99fda',1,'boot.php']]],
+ ['z_5fpost_5furl',['z_post_url',['../include_2network_8php.html#a9129fd55e7fc175b4ea9a195cccc16bc',1,'network.php']]],
+ ['z_5freaddir',['z_readdir',['../include_2attach_8php.html#aeb07968990e66a88c95483ca09a7f909',1,'attach.php']]],
+ ['z_5froot',['z_root',['../boot_8php.html#add517a0958ac684792c62142a3877f81',1,'boot.php']]],
+ ['zcurl_5ftimeout',['ZCURL_TIMEOUT',['../boot_8php.html#a3cd42a70c6b3999590e4fd7a1a9096af',1,'boot.php']]],
+ ['zfinger_2ephp',['zfinger.php',['../zfinger_8php.html',1,'']]],
+ ['zfinger_5finit',['zfinger_init',['../zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0',1,'zfinger.php']]],
+ ['zid',['zid',['../identity_8php.html#a5b815330f3d177ab383af37a6c12e532',1,'identity.php']]],
+ ['zid_5finit',['zid_init',['../identity_8php.html#a680fbafc2db023c5b1309e0180e81315',1,'identity.php']]],
+ ['zidify_5fcallback',['zidify_callback',['../text_8php.html#a405afe814a23f3bd94d826101aa168ab',1,'text.php']]],
+ ['zidify_5fimg_5fcallback',['zidify_img_callback',['../text_8php.html#ab4a4c3d4700bc219bb84f33b499314f4',1,'text.php']]],
+ ['zidify_5flinks',['zidify_links',['../text_8php.html#a29988052f3944111def3b6aaf2c7a8f6',1,'text.php']]],
+ ['zot_2ephp',['zot.php',['../zot_8php.html',1,'']]],
+ ['zot_5fbuild_5fpacket',['zot_build_packet',['../zot_8php.html#a3862b3161b2c8557dc1a95020179bd81',1,'zot.php']]],
+ ['zot_5ffeed',['zot_feed',['../items_8php.html#a004e89d86b0f29b2c4da20108ecc4091',1,'items.php']]],
+ ['zot_5ffetch',['zot_fetch',['../zot_8php.html#a61cdc1ec843663c423ed2d8160ae5aea',1,'zot.php']]],
+ ['zot_5ffinger',['zot_finger',['../zot_8php.html#a95528377d7303131958c9f0b7158fdce',1,'zot.php']]],
+ ['zot_5fget_5fhublocs',['zot_get_hublocs',['../zot_8php.html#ae7cec2b417b5858fd4a41070f843d1d7',1,'zot.php']]],
+ ['zot_5fgethub',['zot_gethub',['../zot_8php.html#a55056e863a7860bc0cf922e78fcce073',1,'zot.php']]],
+ ['zot_5fimport',['zot_import',['../zot_8php.html#aeea071f17e306fe3d0c488551906bfab',1,'zot.php']]],
+ ['zot_5fnew_5fuid',['zot_new_uid',['../zot_8php.html#ab22d67660702056bf3f4696dcebf5ce7',1,'zot.php']]],
+ ['zot_5fprocess_5fresponse',['zot_process_response',['../zot_8php.html#a928f5643ca66ae9635d85aeb2be62e03',1,'zot.php']]],
+ ['zot_5frefresh',['zot_refresh',['../zot_8php.html#a7b23bfb31d4491231e1e73bdc077240d',1,'zot.php']]],
+ ['zot_5fregister_5fhub',['zot_register_hub',['../zot_8php.html#a5bcdfef419b16075a0eca990956223dc',1,'zot.php']]],
+ ['zot_5frevision',['ZOT_REVISION',['../boot_8php.html#a36b31575f992a10b5927b76efba9362e',1,'boot.php']]],
+ ['zot_5fzot',['zot_zot',['../zot_8php.html#ab3e9b99ddb11353f37f265a05bb42142',1,'zot.php']]],
+ ['zotdriver',['ZotDriver',['../classZotDriver.html',1,'']]],
+ ['zotfeed_2ephp',['zotfeed.php',['../zotfeed_8php.html',1,'']]],
+ ['zotfeed_5finit',['zotfeed_init',['../zotfeed_8php.html#a24dfc23d366e7f840cf2847d0c1c8eac',1,'zotfeed.php']]],
+ ['zping_2ephp',['zping.php',['../zping_8php.html',1,'']]],
+ ['zping_5fcontent',['zping_content',['../zping_8php.html#a4d3a6b0b8b04ed6469015823e615ee75',1,'zping.php']]]
+];
diff --git a/doc/html/search/classes_61.html b/doc/html/search/classes_61.html
new file mode 100644
index 000000000..a4c07d590
--- /dev/null
+++ b/doc/html/search/classes_61.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="classes_61.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/classes_61.js b/doc/html/search/classes_61.js
new file mode 100644
index 000000000..9703f2f97
--- /dev/null
+++ b/doc/html/search/classes_61.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['app',['App',['../classApp.html',1,'']]]
+];
diff --git a/doc/html/search/classes_62.html b/doc/html/search/classes_62.html
new file mode 100644
index 000000000..04a59d2ef
--- /dev/null
+++ b/doc/html/search/classes_62.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="classes_62.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/classes_62.js b/doc/html/search/classes_62.js
new file mode 100644
index 000000000..1aa035405
--- /dev/null
+++ b/doc/html/search/classes_62.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['baseobject',['BaseObject',['../classBaseObject.html',1,'']]]
+];
diff --git a/doc/html/search/classes_63.html b/doc/html/search/classes_63.html
new file mode 100644
index 000000000..def37a7e1
--- /dev/null
+++ b/doc/html/search/classes_63.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="classes_63.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/classes_63.js b/doc/html/search/classes_63.js
new file mode 100644
index 000000000..56b080754
--- /dev/null
+++ b/doc/html/search/classes_63.js
@@ -0,0 +1,5 @@
+var searchData=
+[
+ ['cache',['Cache',['../classCache.html',1,'']]],
+ ['conversation',['Conversation',['../classConversation.html',1,'']]]
+];
diff --git a/doc/html/search/classes_64.html b/doc/html/search/classes_64.html
new file mode 100644
index 000000000..4092564e3
--- /dev/null
+++ b/doc/html/search/classes_64.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="classes_64.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/classes_64.js b/doc/html/search/classes_64.js
new file mode 100644
index 000000000..c52174855
--- /dev/null
+++ b/doc/html/search/classes_64.js
@@ -0,0 +1,6 @@
+var searchData=
+[
+ ['dba_5fdriver',['dba_driver',['../classdba__driver.html',1,'']]],
+ ['dba_5fmysql',['dba_mysql',['../classdba__mysql.html',1,'']]],
+ ['dba_5fmysqli',['dba_mysqli',['../classdba__mysqli.html',1,'']]]
+];
diff --git a/doc/html/search/classes_65.html b/doc/html/search/classes_65.html
new file mode 100644
index 000000000..4f441f9de
--- /dev/null
+++ b/doc/html/search/classes_65.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="classes_65.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/classes_65.js b/doc/html/search/classes_65.js
new file mode 100644
index 000000000..ad80724c8
--- /dev/null
+++ b/doc/html/search/classes_65.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['enotify',['enotify',['../classenotify.html',1,'']]]
+];
diff --git a/doc/html/search/classes_66.html b/doc/html/search/classes_66.html
new file mode 100644
index 000000000..b83e5933f
--- /dev/null
+++ b/doc/html/search/classes_66.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="classes_66.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/classes_66.js b/doc/html/search/classes_66.js
new file mode 100644
index 000000000..b7fd611b8
--- /dev/null
+++ b/doc/html/search/classes_66.js
@@ -0,0 +1,7 @@
+var searchData=
+[
+ ['fkoauth1',['FKOAuth1',['../classFKOAuth1.html',1,'']]],
+ ['fkoauthdatastore',['FKOAuthDataStore',['../classFKOAuthDataStore.html',1,'']]],
+ ['friendicasmarty',['FriendicaSmarty',['../classFriendicaSmarty.html',1,'']]],
+ ['friendicasmartyengine',['FriendicaSmartyEngine',['../classFriendicaSmartyEngine.html',1,'']]]
+];
diff --git a/doc/html/search/classes_69.html b/doc/html/search/classes_69.html
new file mode 100644
index 000000000..7a0d01368
--- /dev/null
+++ b/doc/html/search/classes_69.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="classes_69.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/classes_69.js b/doc/html/search/classes_69.js
new file mode 100644
index 000000000..b0394186f
--- /dev/null
+++ b/doc/html/search/classes_69.js
@@ -0,0 +1,5 @@
+var searchData=
+[
+ ['item',['Item',['../classItem.html',1,'']]],
+ ['itemplateengine',['ITemplateEngine',['../interfaceITemplateEngine.html',1,'']]]
+];
diff --git a/doc/html/search/classes_70.html b/doc/html/search/classes_70.html
new file mode 100644
index 000000000..7c5b3e595
--- /dev/null
+++ b/doc/html/search/classes_70.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="classes_70.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/classes_70.js b/doc/html/search/classes_70.js
new file mode 100644
index 000000000..f59cd1115
--- /dev/null
+++ b/doc/html/search/classes_70.js
@@ -0,0 +1,7 @@
+var searchData=
+[
+ ['photo_5fdriver',['photo_driver',['../classphoto__driver.html',1,'']]],
+ ['photo_5fgd',['photo_gd',['../classphoto__gd.html',1,'']]],
+ ['photo_5fimagick',['photo_imagick',['../classphoto__imagick.html',1,'']]],
+ ['protodriver',['ProtoDriver',['../classProtoDriver.html',1,'']]]
+];
diff --git a/doc/html/search/classes_72.html b/doc/html/search/classes_72.html
new file mode 100644
index 000000000..03a77208f
--- /dev/null
+++ b/doc/html/search/classes_72.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="classes_72.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/classes_72.js b/doc/html/search/classes_72.js
new file mode 100644
index 000000000..7196e9f30
--- /dev/null
+++ b/doc/html/search/classes_72.js
@@ -0,0 +1,7 @@
+var searchData=
+[
+ ['redbasicauth',['RedBasicAuth',['../classRedBasicAuth.html',1,'']]],
+ ['redbrowser',['RedBrowser',['../classRedBrowser.html',1,'']]],
+ ['reddirectory',['RedDirectory',['../classRedDirectory.html',1,'']]],
+ ['redfile',['RedFile',['../classRedFile.html',1,'']]]
+];
diff --git a/doc/html/search/classes_74.html b/doc/html/search/classes_74.html
new file mode 100644
index 000000000..4b0fdaa16
--- /dev/null
+++ b/doc/html/search/classes_74.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="classes_74.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/classes_74.js b/doc/html/search/classes_74.js
new file mode 100644
index 000000000..a8854d502
--- /dev/null
+++ b/doc/html/search/classes_74.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['template',['Template',['../classTemplate.html',1,'']]]
+];
diff --git a/doc/html/search/classes_7a.html b/doc/html/search/classes_7a.html
new file mode 100644
index 000000000..d9534cdbc
--- /dev/null
+++ b/doc/html/search/classes_7a.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="classes_7a.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/classes_7a.js b/doc/html/search/classes_7a.js
new file mode 100644
index 000000000..1b4744a16
--- /dev/null
+++ b/doc/html/search/classes_7a.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['zotdriver',['ZotDriver',['../classZotDriver.html',1,'']]]
+];
diff --git a/doc/html/search/close.png b/doc/html/search/close.png
new file mode 100644
index 000000000..9342d3dfe
--- /dev/null
+++ b/doc/html/search/close.png
Binary files differ
diff --git a/doc/html/search/files_5f.html b/doc/html/search/files_5f.html
new file mode 100644
index 000000000..b6c444603
--- /dev/null
+++ b/doc/html/search/files_5f.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_5f.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/files_5f.js b/doc/html/search/files_5f.js
new file mode 100644
index 000000000..2dbe8fc3a
--- /dev/null
+++ b/doc/html/search/files_5f.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['_5fwell_5fknown_2ephp',['_well_known.php',['../__well__known_8php.html',1,'']]]
+];
diff --git a/doc/html/search/files_61.html b/doc/html/search/files_61.html
new file mode 100644
index 000000000..0aa6beb10
--- /dev/null
+++ b/doc/html/search/files_61.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_61.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/files_61.js b/doc/html/search/files_61.js
new file mode 100644
index 000000000..9d8a93b78
--- /dev/null
+++ b/doc/html/search/files_61.js
@@ -0,0 +1,15 @@
+var searchData=
+[
+ ['account_2ephp',['account.php',['../account_8php.html',1,'']]],
+ ['achievements_2ephp',['achievements.php',['../achievements_8php.html',1,'']]],
+ ['acl_2ephp',['acl.php',['../acl_8php.html',1,'']]],
+ ['acl_5fselectors_2ephp',['acl_selectors.php',['../acl__selectors_8php.html',1,'']]],
+ ['activities_2ephp',['activities.php',['../activities_8php.html',1,'']]],
+ ['admin_2ephp',['admin.php',['../admin_8php.html',1,'']]],
+ ['api_2ephp',['api.php',['../mod_2api_8php.html',1,'']]],
+ ['api_2ephp',['api.php',['../include_2api_8php.html',1,'']]],
+ ['apps_2ephp',['apps.php',['../apps_8php.html',1,'']]],
+ ['attach_2ephp',['attach.php',['../include_2attach_8php.html',1,'']]],
+ ['attach_2ephp',['attach.php',['../mod_2attach_8php.html',1,'']]],
+ ['auth_2ephp',['auth.php',['../auth_8php.html',1,'']]]
+];
diff --git a/doc/html/search/files_62.html b/doc/html/search/files_62.html
new file mode 100644
index 000000000..86dfe39e6
--- /dev/null
+++ b/doc/html/search/files_62.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_62.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/files_62.js b/doc/html/search/files_62.js
new file mode 100644
index 000000000..693ae9abd
--- /dev/null
+++ b/doc/html/search/files_62.js
@@ -0,0 +1,8 @@
+var searchData=
+[
+ ['baseobject_2ephp',['BaseObject.php',['../BaseObject_8php.html',1,'']]],
+ ['bb2diaspora_2ephp',['bb2diaspora.php',['../bb2diaspora_8php.html',1,'']]],
+ ['bbcode_2ephp',['bbcode.php',['../bbcode_8php.html',1,'']]],
+ ['blocks_2ephp',['blocks.php',['../blocks_8php.html',1,'']]],
+ ['boot_2ephp',['boot.php',['../boot_8php.html',1,'']]]
+];
diff --git a/doc/html/search/files_63.html b/doc/html/search/files_63.html
new file mode 100644
index 000000000..788d523a8
--- /dev/null
+++ b/doc/html/search/files_63.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_63.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/files_63.js b/doc/html/search/files_63.js
new file mode 100644
index 000000000..ab4e4cdd3
--- /dev/null
+++ b/doc/html/search/files_63.js
@@ -0,0 +1,31 @@
+var searchData=
+[
+ ['cache_2ephp',['cache.php',['../cache_8php.html',1,'']]],
+ ['chanman_2ephp',['chanman.php',['../mod_2chanman_8php.html',1,'']]],
+ ['chanman_2ephp',['chanman.php',['../include_2chanman_8php.html',1,'']]],
+ ['channel_2ephp',['channel.php',['../channel_8php.html',1,'']]],
+ ['chanview_2ephp',['chanview.php',['../chanview_8php.html',1,'']]],
+ ['cli_5fstartup_2ephp',['cli_startup.php',['../cli__startup_8php.html',1,'']]],
+ ['cli_5fsuggest_2ephp',['cli_suggest.php',['../cli__suggest_8php.html',1,'']]],
+ ['cloud_2ephp',['cloud.php',['../cloud_8php.html',1,'']]],
+ ['comanche_2ephp',['comanche.php',['../comanche_8php.html',1,'']]],
+ ['common_2ephp',['common.php',['../common_8php.html',1,'']]],
+ ['community_2ephp',['community.php',['../community_8php.html',1,'']]],
+ ['config_2emd',['config.md',['../config_8md.html',1,'']]],
+ ['config_2ephp',['config.php',['../view_2theme_2blogga_2view_2theme_2blog_2config_8php.html',1,'']]],
+ ['config_2ephp',['config.php',['../view_2theme_2redbasic_2php_2config_8php.html',1,'']]],
+ ['config_2ephp',['config.php',['../include_2config_8php.html',1,'']]],
+ ['config_2ephp',['config.php',['../view_2theme_2apw_2php_2config_8php.html',1,'']]],
+ ['config_2ephp',['config.php',['../view_2theme_2blogga_2php_2config_8php.html',1,'']]],
+ ['connect_2ephp',['connect.php',['../connect_8php.html',1,'']]],
+ ['connections_2ephp',['connections.php',['../connections_8php.html',1,'']]],
+ ['connedit_2ephp',['connedit.php',['../connedit_8php.html',1,'']]],
+ ['contact_2ephp',['Contact.php',['../Contact_8php.html',1,'']]],
+ ['contact_5fselectors_2ephp',['contact_selectors.php',['../contact__selectors_8php.html',1,'']]],
+ ['contact_5fwidgets_2ephp',['contact_widgets.php',['../contact__widgets_8php.html',1,'']]],
+ ['contactgroup_2ephp',['contactgroup.php',['../contactgroup_8php.html',1,'']]],
+ ['conversation_2ephp',['conversation.php',['../conversation_8php.html',1,'']]],
+ ['conversationobject_2ephp',['ConversationObject.php',['../ConversationObject_8php.html',1,'']]],
+ ['cronhooks_2ephp',['cronhooks.php',['../cronhooks_8php.html',1,'']]],
+ ['crypto_2ephp',['crypto.php',['../crypto_8php.html',1,'']]]
+];
diff --git a/doc/html/search/files_64.html b/doc/html/search/files_64.html
new file mode 100644
index 000000000..175a900cc
--- /dev/null
+++ b/doc/html/search/files_64.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_64.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/files_64.js b/doc/html/search/files_64.js
new file mode 100644
index 000000000..9d13417b9
--- /dev/null
+++ b/doc/html/search/files_64.js
@@ -0,0 +1,24 @@
+var searchData=
+[
+ ['dark_2ephp',['dark.php',['../dark_8php.html',1,'']]],
+ ['darkness_2ephp',['darkness.php',['../darkness_8php.html',1,'']]],
+ ['darknessleftaside_2ephp',['darknessleftaside.php',['../darknessleftaside_8php.html',1,'']]],
+ ['darknessrightaside_2ephp',['darknessrightaside.php',['../darknessrightaside_8php.html',1,'']]],
+ ['datetime_2ephp',['datetime.php',['../datetime_8php.html',1,'']]],
+ ['db_5fupdate_2ephp',['db_update.php',['../db__update_8php.html',1,'']]],
+ ['dba_5fdriver_2ephp',['dba_driver.php',['../dba__driver_8php.html',1,'']]],
+ ['dba_5fmysql_2ephp',['dba_mysql.php',['../dba__mysql_8php.html',1,'']]],
+ ['dba_5fmysqli_2ephp',['dba_mysqli.php',['../dba__mysqli_8php.html',1,'']]],
+ ['default_2ephp',['default.php',['../theme_2blogga_2php_2default_8php.html',1,'']]],
+ ['default_2ephp',['default.php',['../theme_2blogga_2view_2theme_2blog_2default_8php.html',1,'']]],
+ ['default_2ephp',['default.php',['../php_2default_8php.html',1,'']]],
+ ['delegate_2ephp',['delegate.php',['../delegate_8php.html',1,'']]],
+ ['deliver_2ephp',['deliver.php',['../deliver_8php.html',1,'']]],
+ ['dir_5ffns_2ephp',['dir_fns.php',['../dir__fns_8php.html',1,'']]],
+ ['directory_2ephp',['directory.php',['../mod_2directory_8php.html',1,'']]],
+ ['directory_2ephp',['directory.php',['../include_2directory_8php.html',1,'']]],
+ ['dirprofile_2ephp',['dirprofile.php',['../dirprofile_8php.html',1,'']]],
+ ['dirsearch_2ephp',['dirsearch.php',['../dirsearch_8php.html',1,'']]],
+ ['display_2ephp',['display.php',['../display_8php.html',1,'']]],
+ ['docblox_5ferrorchecker_2ephp',['docblox_errorchecker.php',['../docblox__errorchecker_8php.html',1,'']]]
+];
diff --git a/doc/html/search/files_65.html b/doc/html/search/files_65.html
new file mode 100644
index 000000000..2347de991
--- /dev/null
+++ b/doc/html/search/files_65.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_65.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/files_65.js b/doc/html/search/files_65.js
new file mode 100644
index 000000000..26c3ac164
--- /dev/null
+++ b/doc/html/search/files_65.js
@@ -0,0 +1,12 @@
+var searchData=
+[
+ ['editblock_2ephp',['editblock.php',['../editblock_8php.html',1,'']]],
+ ['editlayout_2ephp',['editlayout.php',['../editlayout_8php.html',1,'']]],
+ ['editpost_2ephp',['editpost.php',['../editpost_8php.html',1,'']]],
+ ['editwebpage_2ephp',['editwebpage.php',['../editwebpage_8php.html',1,'']]],
+ ['enotify_2ephp',['enotify.php',['../enotify_8php.html',1,'']]],
+ ['event_2ephp',['event.php',['../event_8php.html',1,'']]],
+ ['events_2ephp',['events.php',['../events_8php.html',1,'']]],
+ ['expire_2ephp',['expire.php',['../expire_8php.html',1,'']]],
+ ['extract_2ephp',['extract.php',['../extract_8php.html',1,'']]]
+];
diff --git a/doc/html/search/files_66.html b/doc/html/search/files_66.html
new file mode 100644
index 000000000..70873b352
--- /dev/null
+++ b/doc/html/search/files_66.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_66.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/files_66.js b/doc/html/search/files_66.js
new file mode 100644
index 000000000..aba1883e1
--- /dev/null
+++ b/doc/html/search/files_66.js
@@ -0,0 +1,17 @@
+var searchData=
+[
+ ['fbrowser_2ephp',['fbrowser.php',['../fbrowser_8php.html',1,'']]],
+ ['features_2ephp',['features.php',['../features_8php.html',1,'']]],
+ ['feed_2ephp',['feed.php',['../feed_8php.html',1,'']]],
+ ['filer_2ephp',['filer.php',['../filer_8php.html',1,'']]],
+ ['filerm_2ephp',['filerm.php',['../filerm_8php.html',1,'']]],
+ ['filestorage_2ephp',['filestorage.php',['../filestorage_8php.html',1,'']]],
+ ['follow_2ephp',['follow.php',['../mod_2follow_8php.html',1,'']]],
+ ['follow_2ephp',['follow.php',['../include_2follow_8php.html',1,'']]],
+ ['fpostit_2ephp',['fpostit.php',['../fpostit_8php.html',1,'']]],
+ ['fresh_2emd',['fresh.md',['../fresh_8md.html',1,'']]],
+ ['friendica_2dto_2dsmarty_2dtpl_2epy',['friendica-to-smarty-tpl.py',['../friendica-to-smarty-tpl_8py.html',1,'']]],
+ ['friendica_5fsmarty_2ephp',['friendica_smarty.php',['../friendica__smarty_8php.html',1,'']]],
+ ['fsuggest_2ephp',['fsuggest.php',['../fsuggest_8php.html',1,'']]],
+ ['full_2ephp',['full.php',['../full_8php.html',1,'']]]
+];
diff --git a/doc/html/search/files_67.html b/doc/html/search/files_67.html
new file mode 100644
index 000000000..65d69ddc0
--- /dev/null
+++ b/doc/html/search/files_67.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_67.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/files_67.js b/doc/html/search/files_67.js
new file mode 100644
index 000000000..3bd29b494
--- /dev/null
+++ b/doc/html/search/files_67.js
@@ -0,0 +1,7 @@
+var searchData=
+[
+ ['gprobe_2ephp',['gprobe.php',['../gprobe_8php.html',1,'']]],
+ ['greenthumbnails_2ephp',['greenthumbnails.php',['../greenthumbnails_8php.html',1,'']]],
+ ['group_2ephp',['group.php',['../include_2group_8php.html',1,'']]],
+ ['group_2ephp',['group.php',['../mod_2group_8php.html',1,'']]]
+];
diff --git a/doc/html/search/files_68.html b/doc/html/search/files_68.html
new file mode 100644
index 000000000..35734d1fc
--- /dev/null
+++ b/doc/html/search/files_68.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_68.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/files_68.js b/doc/html/search/files_68.js
new file mode 100644
index 000000000..533921876
--- /dev/null
+++ b/doc/html/search/files_68.js
@@ -0,0 +1,8 @@
+var searchData=
+[
+ ['help_2ephp',['help.php',['../help_8php.html',1,'']]],
+ ['home_2ephp',['home.php',['../home_8php.html',1,'']]],
+ ['hostxrd_2ephp',['hostxrd.php',['../hostxrd_8php.html',1,'']]],
+ ['html2bbcode_2ephp',['html2bbcode.php',['../html2bbcode_8php.html',1,'']]],
+ ['html2plain_2ephp',['html2plain.php',['../html2plain_8php.html',1,'']]]
+];
diff --git a/doc/html/search/files_69.html b/doc/html/search/files_69.html
new file mode 100644
index 000000000..4e0baee7a
--- /dev/null
+++ b/doc/html/search/files_69.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_69.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/files_69.js b/doc/html/search/files_69.js
new file mode 100644
index 000000000..a08e0c1d4
--- /dev/null
+++ b/doc/html/search/files_69.js
@@ -0,0 +1,10 @@
+var searchData=
+[
+ ['identity_2ephp',['identity.php',['../identity_8php.html',1,'']]],
+ ['import_2ephp',['import.php',['../import_8php.html',1,'']]],
+ ['invite_2ephp',['invite.php',['../invite_8php.html',1,'']]],
+ ['item_2ephp',['item.php',['../item_8php.html',1,'']]],
+ ['itemobject_2ephp',['ItemObject.php',['../ItemObject_8php.html',1,'']]],
+ ['itemplateengine_2ephp',['ITemplateEngine.php',['../ITemplateEngine_8php.html',1,'']]],
+ ['items_2ephp',['items.php',['../items_8php.html',1,'']]]
+];
diff --git a/doc/html/search/files_6c.html b/doc/html/search/files_6c.html
new file mode 100644
index 000000000..088b17f00
--- /dev/null
+++ b/doc/html/search/files_6c.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_6c.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/files_6c.js b/doc/html/search/files_6c.js
new file mode 100644
index 000000000..ffcd040c5
--- /dev/null
+++ b/doc/html/search/files_6c.js
@@ -0,0 +1,9 @@
+var searchData=
+[
+ ['language_2ephp',['language.php',['../language_8php.html',1,'']]],
+ ['layouts_2ephp',['layouts.php',['../layouts_8php.html',1,'']]],
+ ['like_2ephp',['like.php',['../like_8php.html',1,'']]],
+ ['lockview_2ephp',['lockview.php',['../lockview_8php.html',1,'']]],
+ ['login_2ephp',['login.php',['../login_8php.html',1,'']]],
+ ['lostpass_2ephp',['lostpass.php',['../lostpass_8php.html',1,'']]]
+];
diff --git a/doc/html/search/files_6d.html b/doc/html/search/files_6d.html
new file mode 100644
index 000000000..5796e5280
--- /dev/null
+++ b/doc/html/search/files_6d.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_6d.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/files_6d.js b/doc/html/search/files_6d.js
new file mode 100644
index 000000000..1b8fc71cd
--- /dev/null
+++ b/doc/html/search/files_6d.js
@@ -0,0 +1,17 @@
+var searchData=
+[
+ ['magic_2ephp',['magic.php',['../magic_8php.html',1,'']]],
+ ['mail_2ephp',['mail.php',['../mail_8php.html',1,'']]],
+ ['manage_2ephp',['manage.php',['../manage_8php.html',1,'']]],
+ ['match_2ephp',['match.php',['../match_8php.html',1,'']]],
+ ['menu_2ephp',['menu.php',['../mod_2menu_8php.html',1,'']]],
+ ['menu_2ephp',['menu.php',['../include_2menu_8php.html',1,'']]],
+ ['message_2ephp',['message.php',['../include_2message_8php.html',1,'']]],
+ ['message_2ephp',['message.php',['../mod_2message_8php.html',1,'']]],
+ ['minimal_2ephp',['minimal.php',['../minimal_8php.html',1,'']]],
+ ['minimalisticdarkness_2ephp',['minimalisticdarkness.php',['../minimalisticdarkness_8php.html',1,'']]],
+ ['mitem_2ephp',['mitem.php',['../mitem_8php.html',1,'']]],
+ ['mod_5fimport_2ephp',['mod_import.php',['../mod__import_8php.html',1,'']]],
+ ['mood_2ephp',['mood.php',['../mood_8php.html',1,'']]],
+ ['msearch_2ephp',['msearch.php',['../msearch_8php.html',1,'']]]
+];
diff --git a/doc/html/search/files_6e.html b/doc/html/search/files_6e.html
new file mode 100644
index 000000000..def03fe7d
--- /dev/null
+++ b/doc/html/search/files_6e.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_6e.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/files_6e.js b/doc/html/search/files_6e.js
new file mode 100644
index 000000000..2722d4f7d
--- /dev/null
+++ b/doc/html/search/files_6e.js
@@ -0,0 +1,13 @@
+var searchData=
+[
+ ['nav_2ephp',['nav.php',['../nav_8php.html',1,'']]],
+ ['network_2ephp',['network.php',['../include_2network_8php.html',1,'']]],
+ ['network_2ephp',['network.php',['../mod_2network_8php.html',1,'']]],
+ ['new_5fchannel_2ephp',['new_channel.php',['../new__channel_8php.html',1,'']]],
+ ['none_2ephp',['none.php',['../none_8php.html',1,'']]],
+ ['notes_2ephp',['notes.php',['../notes_8php.html',1,'']]],
+ ['notifications_2ephp',['notifications.php',['../notifications_8php.html',1,'']]],
+ ['notifier_2ephp',['notifier.php',['../notifier_8php.html',1,'']]],
+ ['notify_2ephp',['notify.php',['../include_2notify_8php.html',1,'']]],
+ ['notify_2ephp',['notify.php',['../mod_2notify_8php.html',1,'']]]
+];
diff --git a/doc/html/search/files_6f.html b/doc/html/search/files_6f.html
new file mode 100644
index 000000000..4f9b7bbdb
--- /dev/null
+++ b/doc/html/search/files_6f.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_6f.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/files_6f.js b/doc/html/search/files_6f.js
new file mode 100644
index 000000000..2cc921a73
--- /dev/null
+++ b/doc/html/search/files_6f.js
@@ -0,0 +1,11 @@
+var searchData=
+[
+ ['oauth_2ephp',['oauth.php',['../oauth_8php.html',1,'']]],
+ ['oembed_2ephp',['oembed.php',['../mod_2oembed_8php.html',1,'']]],
+ ['oembed_2ephp',['oembed.php',['../include_2oembed_8php.html',1,'']]],
+ ['oexchange_2ephp',['oexchange.php',['../oexchange_8php.html',1,'']]],
+ ['olddefault_2ephp',['olddefault.php',['../olddefault_8php.html',1,'']]],
+ ['onedirsync_2ephp',['onedirsync.php',['../onedirsync_8php.html',1,'']]],
+ ['onepoll_2ephp',['onepoll.php',['../onepoll_8php.html',1,'']]],
+ ['opensearch_2ephp',['opensearch.php',['../opensearch_8php.html',1,'']]]
+];
diff --git a/doc/html/search/files_70.html b/doc/html/search/files_70.html
new file mode 100644
index 000000000..e159ceaae
--- /dev/null
+++ b/doc/html/search/files_70.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_70.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/files_70.js b/doc/html/search/files_70.js
new file mode 100644
index 000000000..46e664291
--- /dev/null
+++ b/doc/html/search/files_70.js
@@ -0,0 +1,35 @@
+var searchData=
+[
+ ['page_2ephp',['page.php',['../page_8php.html',1,'']]],
+ ['page_5fwidgets_2ephp',['page_widgets.php',['../page__widgets_8php.html',1,'']]],
+ ['parse_5furl_2ephp',['parse_url.php',['../parse__url_8php.html',1,'']]],
+ ['passion_2ephp',['passion.php',['../passion_8php.html',1,'']]],
+ ['passionwide_2ephp',['passionwide.php',['../passionwide_8php.html',1,'']]],
+ ['permissions_2ephp',['permissions.php',['../permissions_8php.html',1,'']]],
+ ['photo_2ephp',['photo.php',['../photo_8php.html',1,'']]],
+ ['photo_5fdriver_2ephp',['photo_driver.php',['../photo__driver_8php.html',1,'']]],
+ ['photo_5fgd_2ephp',['photo_gd.php',['../photo__gd_8php.html',1,'']]],
+ ['photo_5fimagick_2ephp',['photo_imagick.php',['../photo__imagick_8php.html',1,'']]],
+ ['photos_2ephp',['photos.php',['../include_2photos_8php.html',1,'']]],
+ ['photos_2ephp',['photos.php',['../mod_2photos_8php.html',1,'']]],
+ ['php_2ephp',['php.php',['../php_8php.html',1,'']]],
+ ['php2po_2ephp',['php2po.php',['../php2po_8php.html',1,'']]],
+ ['pine_2ephp',['pine.php',['../pine_8php.html',1,'']]],
+ ['ping_2ephp',['ping.php',['../ping_8php.html',1,'']]],
+ ['plugin_2ephp',['plugin.php',['../plugin_8php.html',1,'']]],
+ ['po2php_2ephp',['po2php.php',['../po2php_8php.html',1,'']]],
+ ['poco_2ephp',['poco.php',['../poco_8php.html',1,'']]],
+ ['poke_2ephp',['poke.php',['../poke_8php.html',1,'']]],
+ ['poller_2ephp',['poller.php',['../poller_8php.html',1,'']]],
+ ['post_2ephp',['post.php',['../post_8php.html',1,'']]],
+ ['post_5fto_5fred_2ephp',['post_to_red.php',['../post__to__red_8php.html',1,'']]],
+ ['pretheme_2ephp',['pretheme.php',['../pretheme_8php.html',1,'']]],
+ ['probe_2ephp',['probe.php',['../probe_8php.html',1,'']]],
+ ['profile_2ephp',['profile.php',['../profile_8php.html',1,'']]],
+ ['profile_5fphoto_2ephp',['profile_photo.php',['../profile__photo_8php.html',1,'']]],
+ ['profile_5fselectors_2ephp',['profile_selectors.php',['../profile__selectors_8php.html',1,'']]],
+ ['profiles_2ephp',['profiles.php',['../profiles_8php.html',1,'']]],
+ ['profperm_2ephp',['profperm.php',['../profperm_8php.html',1,'']]],
+ ['protodriver_2ephp',['ProtoDriver.php',['../ProtoDriver_8php.html',1,'']]],
+ ['pubsites_2ephp',['pubsites.php',['../pubsites_8php.html',1,'']]]
+];
diff --git a/doc/html/search/files_71.html b/doc/html/search/files_71.html
new file mode 100644
index 000000000..a417eff53
--- /dev/null
+++ b/doc/html/search/files_71.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_71.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/files_71.js b/doc/html/search/files_71.js
new file mode 100644
index 000000000..6a4d7ec81
--- /dev/null
+++ b/doc/html/search/files_71.js
@@ -0,0 +1,5 @@
+var searchData=
+[
+ ['queue_2ephp',['queue.php',['../queue_8php.html',1,'']]],
+ ['queue_5ffn_2ephp',['queue_fn.php',['../queue__fn_8php.html',1,'']]]
+];
diff --git a/doc/html/search/files_72.html b/doc/html/search/files_72.html
new file mode 100644
index 000000000..573ec112d
--- /dev/null
+++ b/doc/html/search/files_72.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_72.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/files_72.js b/doc/html/search/files_72.js
new file mode 100644
index 000000000..e6734d438
--- /dev/null
+++ b/doc/html/search/files_72.js
@@ -0,0 +1,14 @@
+var searchData=
+[
+ ['randprof_2ephp',['randprof.php',['../randprof_8php.html',1,'']]],
+ ['readme_2emd',['README.md',['../apw_2README_8md.html',1,'']]],
+ ['readme_2emd',['README.md',['../blogga_2php_2README_8md.html',1,'']]],
+ ['redbasic_2ephp',['redbasic.php',['../redbasic_8php.html',1,'']]],
+ ['reddav_2ephp',['reddav.php',['../reddav_8php.html',1,'']]],
+ ['register_2ephp',['register.php',['../register_8php.html',1,'']]],
+ ['regmod_2ephp',['regmod.php',['../regmod_8php.html',1,'']]],
+ ['removeme_2ephp',['removeme.php',['../removeme_8php.html',1,'']]],
+ ['rmagic_2ephp',['rmagic.php',['../rmagic_8php.html',1,'']]],
+ ['rpost_2ephp',['rpost.php',['../rpost_8php.html',1,'']]],
+ ['rsd_5fxml_2ephp',['rsd_xml.php',['../rsd__xml_8php.html',1,'']]]
+];
diff --git a/doc/html/search/files_73.html b/doc/html/search/files_73.html
new file mode 100644
index 000000000..bcc9ae6ee
--- /dev/null
+++ b/doc/html/search/files_73.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_73.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/files_73.js b/doc/html/search/files_73.js
new file mode 100644
index 000000000..f43a68f92
--- /dev/null
+++ b/doc/html/search/files_73.js
@@ -0,0 +1,22 @@
+var searchData=
+[
+ ['search_2ephp',['search.php',['../search_8php.html',1,'']]],
+ ['search_5fac_2ephp',['search_ac.php',['../search__ac_8php.html',1,'']]],
+ ['security_2ephp',['security.php',['../security_8php.html',1,'']]],
+ ['session_2ephp',['session.php',['../session_8php.html',1,'']]],
+ ['settings_2ephp',['settings.php',['../settings_8php.html',1,'']]],
+ ['setup_2ephp',['setup.php',['../setup_8php.html',1,'']]],
+ ['share_2ephp',['share.php',['../share_8php.html',1,'']]],
+ ['siteinfo_2ephp',['siteinfo.php',['../siteinfo_8php.html',1,'']]],
+ ['sitelist_2ephp',['sitelist.php',['../sitelist_8php.html',1,'']]],
+ ['smilies_2ephp',['smilies.php',['../smilies_8php.html',1,'']]],
+ ['socgraph_2ephp',['socgraph.php',['../socgraph_8php.html',1,'']]],
+ ['sources_2ephp',['sources.php',['../sources_8php.html',1,'']]],
+ ['sslify_2ephp',['sslify.php',['../sslify_8php.html',1,'']]],
+ ['starred_2ephp',['starred.php',['../starred_8php.html',1,'']]],
+ ['style_2ephp',['style.php',['../apw_2php_2style_8php.html',1,'']]],
+ ['style_2ephp',['style.php',['../redbasic_2php_2style_8php.html',1,'']]],
+ ['subthread_2ephp',['subthread.php',['../subthread_8php.html',1,'']]],
+ ['suggest_2ephp',['suggest.php',['../suggest_8php.html',1,'']]],
+ ['system_5funavailable_2ephp',['system_unavailable.php',['../system__unavailable_8php.html',1,'']]]
+];
diff --git a/doc/html/search/files_74.html b/doc/html/search/files_74.html
new file mode 100644
index 000000000..985db8690
--- /dev/null
+++ b/doc/html/search/files_74.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_74.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/files_74.js b/doc/html/search/files_74.js
new file mode 100644
index 000000000..ae0686730
--- /dev/null
+++ b/doc/html/search/files_74.js
@@ -0,0 +1,21 @@
+var searchData=
+[
+ ['tagger_2ephp',['tagger.php',['../tagger_8php.html',1,'']]],
+ ['tagrm_2ephp',['tagrm.php',['../tagrm_8php.html',1,'']]],
+ ['taxonomy_2ephp',['taxonomy.php',['../taxonomy_8php.html',1,'']]],
+ ['template_5fprocessor_2ephp',['template_processor.php',['../template__processor_8php.html',1,'']]],
+ ['text_2ephp',['text.php',['../text_8php.html',1,'']]],
+ ['theme_2ephp',['theme.php',['../blogga_2view_2theme_2blog_2theme_8php.html',1,'']]],
+ ['theme_2ephp',['theme.php',['../blogga_2php_2theme_8php.html',1,'']]],
+ ['theme_2ephp',['theme.php',['../redbasic_2php_2theme_8php.html',1,'']]],
+ ['theme_2ephp',['theme.php',['../apw_2php_2theme_8php.html',1,'']]],
+ ['theme_5finit_2ephp',['theme_init.php',['../theme_2blogga_2php_2theme__init_8php.html',1,'']]],
+ ['theme_5finit_2ephp',['theme_init.php',['../php_2theme__init_8php.html',1,'']]],
+ ['theme_5finit_2ephp',['theme_init.php',['../theme_2redbasic_2php_2theme__init_8php.html',1,'']]],
+ ['thing_2ephp',['thing.php',['../thing_8php.html',1,'']]],
+ ['toggle_5fmobile_2ephp',['toggle_mobile.php',['../toggle__mobile_8php.html',1,'']]],
+ ['toggle_5fsafesearch_2ephp',['toggle_safesearch.php',['../toggle__safesearch_8php.html',1,'']]],
+ ['tpldebug_2ephp',['tpldebug.php',['../tpldebug_8php.html',1,'']]],
+ ['typo_2ephp',['typo.php',['../typo_8php.html',1,'']]],
+ ['typohelper_2ephp',['typohelper.php',['../typohelper_8php.html',1,'']]]
+];
diff --git a/doc/html/search/files_75.html b/doc/html/search/files_75.html
new file mode 100644
index 000000000..70607dd35
--- /dev/null
+++ b/doc/html/search/files_75.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_75.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/files_75.js b/doc/html/search/files_75.js
new file mode 100644
index 000000000..4a330b239
--- /dev/null
+++ b/doc/html/search/files_75.js
@@ -0,0 +1,10 @@
+var searchData=
+[
+ ['uexport_2ephp',['uexport.php',['../uexport_8php.html',1,'']]],
+ ['update_5fchannel_2ephp',['update_channel.php',['../update__channel_8php.html',1,'']]],
+ ['update_5fcommunity_2ephp',['update_community.php',['../update__community_8php.html',1,'']]],
+ ['update_5fdisplay_2ephp',['update_display.php',['../update__display_8php.html',1,'']]],
+ ['update_5fnetwork_2ephp',['update_network.php',['../update__network_8php.html',1,'']]],
+ ['update_5fsearch_2ephp',['update_search.php',['../update__search_8php.html',1,'']]],
+ ['updatetpl_2epy',['updatetpl.py',['../updatetpl_8py.html',1,'']]]
+];
diff --git a/doc/html/search/files_76.html b/doc/html/search/files_76.html
new file mode 100644
index 000000000..174dedb49
--- /dev/null
+++ b/doc/html/search/files_76.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_76.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/files_76.js b/doc/html/search/files_76.js
new file mode 100644
index 000000000..c3a52655e
--- /dev/null
+++ b/doc/html/search/files_76.js
@@ -0,0 +1,7 @@
+var searchData=
+[
+ ['view_2ephp',['view.php',['../view_8php.html',1,'']]],
+ ['viewconnections_2ephp',['viewconnections.php',['../viewconnections_8php.html',1,'']]],
+ ['viewsrc_2ephp',['viewsrc.php',['../viewsrc_8php.html',1,'']]],
+ ['vote_2ephp',['vote.php',['../vote_8php.html',1,'']]]
+];
diff --git a/doc/html/search/files_77.html b/doc/html/search/files_77.html
new file mode 100644
index 000000000..63bf92c09
--- /dev/null
+++ b/doc/html/search/files_77.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_77.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/files_77.js b/doc/html/search/files_77.js
new file mode 100644
index 000000000..8a870ac3f
--- /dev/null
+++ b/doc/html/search/files_77.js
@@ -0,0 +1,10 @@
+var searchData=
+[
+ ['wall_5fattach_2ephp',['wall_attach.php',['../wall__attach_8php.html',1,'']]],
+ ['wall_5fupload_2ephp',['wall_upload.php',['../wall__upload_8php.html',1,'']]],
+ ['webfinger_2ephp',['webfinger.php',['../webfinger_8php.html',1,'']]],
+ ['webpages_2ephp',['webpages.php',['../webpages_8php.html',1,'']]],
+ ['wfinger_2ephp',['wfinger.php',['../wfinger_8php.html',1,'']]],
+ ['widedarkness_2ephp',['widedarkness.php',['../widedarkness_8php.html',1,'']]],
+ ['widgets_2ephp',['widgets.php',['../widgets_8php.html',1,'']]]
+];
diff --git a/doc/html/search/files_78.html b/doc/html/search/files_78.html
new file mode 100644
index 000000000..d1e306db2
--- /dev/null
+++ b/doc/html/search/files_78.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_78.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/files_78.js b/doc/html/search/files_78.js
new file mode 100644
index 000000000..e725086d3
--- /dev/null
+++ b/doc/html/search/files_78.js
@@ -0,0 +1,6 @@
+var searchData=
+[
+ ['xchan_2ephp',['xchan.php',['../xchan_8php.html',1,'']]],
+ ['xrd_2ephp',['xrd.php',['../xrd_8php.html',1,'']]],
+ ['xref_2ephp',['xref.php',['../xref_8php.html',1,'']]]
+];
diff --git a/doc/html/search/files_7a.html b/doc/html/search/files_7a.html
new file mode 100644
index 000000000..935df7f2d
--- /dev/null
+++ b/doc/html/search/files_7a.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_7a.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/files_7a.js b/doc/html/search/files_7a.js
new file mode 100644
index 000000000..eafeb05f5
--- /dev/null
+++ b/doc/html/search/files_7a.js
@@ -0,0 +1,7 @@
+var searchData=
+[
+ ['zfinger_2ephp',['zfinger.php',['../zfinger_8php.html',1,'']]],
+ ['zot_2ephp',['zot.php',['../zot_8php.html',1,'']]],
+ ['zotfeed_2ephp',['zotfeed.php',['../zotfeed_8php.html',1,'']]],
+ ['zping_2ephp',['zping.php',['../zping_8php.html',1,'']]]
+];
diff --git a/doc/html/search/functions_5f.html b/doc/html/search/functions_5f.html
new file mode 100644
index 000000000..2946e1e69
--- /dev/null
+++ b/doc/html/search/functions_5f.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_5f.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/functions_5f.js b/doc/html/search/functions_5f.js
new file mode 100644
index 000000000..8921ecf12
--- /dev/null
+++ b/doc/html/search/functions_5f.js
@@ -0,0 +1,17 @@
+var searchData=
+[
+ ['_5f_5fconstruct',['__construct',['../classApp.html#af6d39f63fb7116bbeb04e51696f99474',1,'App\__construct()'],['../classConversation.html#af84ea6ccd72214c9bb4c504461cc8b09',1,'Conversation\__construct()'],['../classdba__driver.html#af3541d13ccb7a3eddfc03e253c746186',1,'dba_driver\__construct()'],['../classFriendicaSmarty.html#af12091b920b95eeef1218cbc48066ca6',1,'FriendicaSmarty\__construct()'],['../classFriendicaSmartyEngine.html#ab7c305bd8c386c2944e4dc9136cea5b6',1,'FriendicaSmartyEngine\__construct()'],['../classItem.html#a248f45871ecfe82a08d1d4c0769b2eb2',1,'Item\__construct()'],['../classFKOAuth1.html#a2f1276872329a6f0b704ccda1a4b9fa6',1,'FKOAuth1\__construct()'],['../classphoto__driver.html#ac6e85f8e507cab4e755ed7acdec401ae',1,'photo_driver\__construct()'],['../classRedDirectory.html#a1e35e3cd31d2a15250655e4cafdea180',1,'RedDirectory\__construct()'],['../classRedFile.html#a9a67bdb34c9db6ce144b3f371148b183',1,'RedFile\__construct()'],['../classRedBrowser.html#a4b76be9ccef0262cf78fffb4129eda93',1,'RedBrowser\__construct()']]],
+ ['_5f_5fdestruct',['__destruct',['../classdba__driver.html#a1a8bc9dc839a6320a0e07d8047a6b721',1,'dba_driver\__destruct()'],['../classphoto__driver.html#ae4501abdc9651359f81d036b63625686',1,'photo_driver\__destruct()']]],
+ ['_5fbuild_5fnodes',['_build_nodes',['../classTemplate.html#ac41c96e1f407b1a910029e5f4b7de8e4',1,'Template']]],
+ ['_5fget_5fvar',['_get_var',['../classTemplate.html#aae9c4d761ea1298e745e8052d7910194',1,'Template']]],
+ ['_5fpop_5fstack',['_pop_stack',['../classTemplate.html#a35d599c9b53a02e2fe2232e5b7ed5da7',1,'Template']]],
+ ['_5fpreg_5ferror',['_preg_error',['../classTemplate.html#a37c15f6d1ade500943629f27a62808b7',1,'Template']]],
+ ['_5fpush_5fstack',['_push_stack',['../classTemplate.html#aa6a087e0b7b887dd1c98c9e0ecbd3b29',1,'Template']]],
+ ['_5freplcb',['_replcb',['../classTemplate.html#ae791766c3d055f7f1ba5a5e60d647934',1,'Template']]],
+ ['_5freplcb_5fdebug',['_replcb_debug',['../classTemplate.html#a4b933954086d9e01a1804b0b1c6ee93e',1,'Template']]],
+ ['_5freplcb_5ffor',['_replcb_for',['../classTemplate.html#abf71098c80fd1f218a59452b3408309e',1,'Template']]],
+ ['_5freplcb_5fif',['_replcb_if',['../classTemplate.html#ae0836e7d5bd5afceb04f50fd635f1228',1,'Template']]],
+ ['_5freplcb_5finc',['_replcb_inc',['../classTemplate.html#a86e8fd27955ef10cadfd86f3fca70677',1,'Template']]],
+ ['_5freplcb_5fnode',['_replcb_node',['../classTemplate.html#aa6f9bd7a8f7512efcf90e8d376fe05ee',1,'Template']]],
+ ['_5fwell_5fknown_5finit',['_well_known_init',['../__well__known_8php.html#a6ebfa937a2024f0b5dab53f0ac90fed0',1,'_well_known.php']]]
+];
diff --git a/doc/html/search/functions_61.html b/doc/html/search/functions_61.html
new file mode 100644
index 000000000..d68c74892
--- /dev/null
+++ b/doc/html/search/functions_61.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_61.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/functions_61.js b/doc/html/search/functions_61.js
new file mode 100644
index 000000000..e415a9885
--- /dev/null
+++ b/doc/html/search/functions_61.js
@@ -0,0 +1,118 @@
+var searchData=
+[
+ ['abook_5fconnections',['abook_connections',['../Contact_8php.html#ae8803c330352cbf1e828eb7490edf47e',1,'Contact.php']]],
+ ['abook_5fself',['abook_self',['../Contact_8php.html#ad5b02c2a962ee55b1b7ca6c159d6e4c5',1,'Contact.php']]],
+ ['abook_5ftoggle_5fflag',['abook_toggle_flag',['../Contact_8php.html#a024919623a830e8703ac4f23496dd66c',1,'Contact.php']]],
+ ['absurl',['absurl',['../boot_8php.html#a081307d681d7d04f17b9ced2076e7c85',1,'boot.php']]],
+ ['account_5fremove',['account_remove',['../Contact_8php.html#a6e64de7db60b7243dce45fb6347636ff',1,'Contact.php']]],
+ ['account_5ftotal',['account_total',['../account_8php.html#a43e3042b2723d76915a030bac3c668b6',1,'account.php']]],
+ ['account_5fverify_5fpassword',['account_verify_password',['../auth_8php.html#a07bae0e623e2daa9ee2cd5a8aa294dee',1,'auth.php']]],
+ ['achievements_5fcontent',['achievements_content',['../achievements_8php.html#a35ae04ada0e227d19671f289a32fb30e',1,'achievements.php']]],
+ ['acknowledge_5fpermissions',['acknowledge_permissions',['../classProtoDriver.html#a1593f3abae050edbd9304f4f8bc4894a',1,'ProtoDriver\acknowledge_permissions()'],['../classZotDriver.html#a3cfdf443da4e5326e205855d7c0054f2',1,'ZotDriver\acknowledge_permissions()']]],
+ ['acl_5finit',['acl_init',['../acl_8php.html#ac6776dba871806ecdb5d1659bc2eb07a',1,'acl.php']]],
+ ['activity_5fmatch',['activity_match',['../text_8php.html#af8a3e3a66a7b862d4510f145d2e13186',1,'text.php']]],
+ ['activity_5fsanitise',['activity_sanitise',['../items_8php.html#a36e656667193c83aa2cc03a024fc131b',1,'items.php']]],
+ ['add_5fchild',['add_child',['../classItem.html#a80dcd9d0f548c3ad550abe7e6981fb51',1,'Item']]],
+ ['add_5fchildren_5fto_5flist',['add_children_to_list',['../conversation_8php.html#ad3e1d4b15e7d6d026ee182edd58f692b',1,'conversation.php']]],
+ ['add_5fthread',['add_thread',['../classConversation.html#a8335cdd43f1836e3c255638e61a09e16',1,'Conversation']]],
+ ['admin_5fcontent',['admin_content',['../admin_8php.html#afef415e4011607fbb665610441595015',1,'admin.php']]],
+ ['admin_5fpage_5fdbsync',['admin_page_dbsync',['../admin_8php.html#aaa6addf2dbc3f3fcf99244a56b41eade',1,'admin.php']]],
+ ['admin_5fpage_5fhubloc',['admin_page_hubloc',['../admin_8php.html#a6943543f3138f6ee182cb701f415d1cc',1,'admin.php']]],
+ ['admin_5fpage_5fhubloc_5fpost',['admin_page_hubloc_post',['../admin_8php.html#a60ba9783ad14545814919970bc3fb725',1,'admin.php']]],
+ ['admin_5fpage_5flogs',['admin_page_logs',['../admin_8php.html#a1d1362698af14d209aa3a0fb655551dd',1,'admin.php']]],
+ ['admin_5fpage_5flogs_5fpost',['admin_page_logs_post',['../admin_8php.html#a233b7c8c31776b7020532003c6e44e1c',1,'admin.php']]],
+ ['admin_5fpage_5fplugins',['admin_page_plugins',['../admin_8php.html#a54128076986ba80c4a103de3fc3e19a8',1,'admin.php']]],
+ ['admin_5fpage_5fsite',['admin_page_site',['../admin_8php.html#ac0f3bd12431c056aad77bac9d09fa30e',1,'admin.php']]],
+ ['admin_5fpage_5fsite_5fpost',['admin_page_site_post',['../admin_8php.html#add865f4ae806ecbf716f423fc3e50e4f',1,'admin.php']]],
+ ['admin_5fpage_5fsummary',['admin_page_summary',['../admin_8php.html#ac6e95b920b5abd030cc522964987087a',1,'admin.php']]],
+ ['admin_5fpage_5fthemes',['admin_page_themes',['../admin_8php.html#af124619fdc278fe2bf14c45ddaa260fb',1,'admin.php']]],
+ ['admin_5fpage_5fusers',['admin_page_users',['../admin_8php.html#a62f10f90c47686c9c3c37c4c03a108d2',1,'admin.php']]],
+ ['admin_5fpage_5fusers_5fpost',['admin_page_users_post',['../admin_8php.html#a5a696706a3869800e65fb365214241b7',1,'admin.php']]],
+ ['admin_5fpost',['admin_post',['../admin_8php.html#acf51f5837a7427832144c2bf7308ada3',1,'admin.php']]],
+ ['advanced_5fprofile',['advanced_profile',['../identity_8php.html#aa870d2c1f558cfd52bef05bc124e8fa4',1,'identity.php']]],
+ ['aes256cbc_5fdecrypt',['AES256CBC_decrypt',['../crypto_8php.html#ac852ee41392d1358c3a54d54935e0bf9',1,'crypto.php']]],
+ ['aes256cbc_5fencrypt',['AES256CBC_encrypt',['../crypto_8php.html#a5c61821d205f95f127114159cbffa764',1,'crypto.php']]],
+ ['aes_5fencapsulate',['aes_encapsulate',['../crypto_8php.html#a2148d7aac7b30c720f7ebda7e9790286',1,'crypto.php']]],
+ ['aes_5funencapsulate',['aes_unencapsulate',['../crypto_8php.html#aca7c3a574bfb6c6ef1f2403a56823914',1,'crypto.php']]],
+ ['age',['age',['../datetime_8php.html#abc1652f96799cec6fce8797ba2ebc2df',1,'datetime.php']]],
+ ['all_5ffriends',['all_friends',['../socgraph_8php.html#a16ac51c505d72987ed8d6d6aed0e8586',1,'socgraph.php']]],
+ ['allowed_5femail',['allowed_email',['../include_2network_8php.html#aba38458a2ff2d92d3536488dbb119694',1,'network.php']]],
+ ['allowed_5fpublic_5frecips',['allowed_public_recips',['../zot_8php.html#a703f528ade8382cf374e4119bd6f7859',1,'zot.php']]],
+ ['allowed_5furl',['allowed_url',['../include_2network_8php.html#aee35d9ad6b3f872bfb39ba3598936aa7',1,'network.php']]],
+ ['alt_5fpager',['alt_pager',['../text_8php.html#a75c243e06341ec16bd5a44b9b1cacd85',1,'text.php']]],
+ ['api_5faccount_5flogout',['api_account_logout',['../include_2api_8php.html#a2e94eab9d6c164bfef7a1b2ab87b339b',1,'api.php']]],
+ ['api_5faccount_5frate_5flimit_5fstatus',['api_account_rate_limit_status',['../include_2api_8php.html#ae8f5863e18d69421005c71441c9d99a5',1,'api.php']]],
+ ['api_5faccount_5fverify_5fcredentials',['api_account_verify_credentials',['../include_2api_8php.html#a864191bb876a515ed71b17e260ef35ad',1,'api.php']]],
+ ['api_5falbums',['api_albums',['../include_2api_8php.html#aa9dc5350b26d6c7727d6c4b641ecba18',1,'api.php']]],
+ ['api_5fapply_5ftemplate',['api_apply_template',['../include_2api_8php.html#a5990101034e7abf6404feba3cd273629',1,'api.php']]],
+ ['api_5fcall',['api_call',['../include_2api_8php.html#a176c448d79c211ad41c2bbe3124658f5',1,'api.php']]],
+ ['api_5fchannel_5fstream',['api_channel_stream',['../include_2api_8php.html#a72bfecac1970bc29b853073e816388ff',1,'api.php']]],
+ ['api_5fcontent',['api_content',['../mod_2api_8php.html#a33315b5bbf5418f6850b2038107b526d',1,'api.php']]],
+ ['api_5fdate',['api_date',['../include_2api_8php.html#aea2dda92a155f2843a0ca188d8dfdf25',1,'api.php']]],
+ ['api_5fdirect_5fmessages_5fall',['api_direct_messages_all',['../include_2api_8php.html#a970b02c06dea8b229aa3d5fff9cf4705',1,'api.php']]],
+ ['api_5fdirect_5fmessages_5fbox',['api_direct_messages_box',['../include_2api_8php.html#a7759ccddc8dff012ad168e511ffe5af5',1,'api.php']]],
+ ['api_5fdirect_5fmessages_5fconversation',['api_direct_messages_conversation',['../include_2api_8php.html#a9160288b7ac220635942d8dc209b78c3',1,'api.php']]],
+ ['api_5fdirect_5fmessages_5finbox',['api_direct_messages_inbox',['../include_2api_8php.html#ad2b0192f3006918bea895de8074bf8d2',1,'api.php']]],
+ ['api_5fdirect_5fmessages_5fnew',['api_direct_messages_new',['../include_2api_8php.html#a0991f72554f821255397d615e76f3203',1,'api.php']]],
+ ['api_5fdirect_5fmessages_5fsentbox',['api_direct_messages_sentbox',['../include_2api_8php.html#a58cf4c02ef435996f5c3bc4283d3968d',1,'api.php']]],
+ ['api_5fexport_5fbasic',['api_export_basic',['../include_2api_8php.html#adfc035ee6303c1d8ba5336a4ead2bd53',1,'api.php']]],
+ ['api_5ffavorites',['api_favorites',['../include_2api_8php.html#a2c71b1226ef1283b5370bd1c200fee5f',1,'api.php']]],
+ ['api_5fff_5fids',['api_ff_ids',['../include_2api_8php.html#a36344c80b8e9755da2f2dd3a0e28cce8',1,'api.php']]],
+ ['api_5ffollowers_5fids',['api_followers_ids',['../include_2api_8php.html#ab1ecb58954f722444bfe03233345cb1b',1,'api.php']]],
+ ['api_5fformat_5fas',['api_format_as',['../include_2api_8php.html#a18cab7c6391df5c421753463f5d2a879',1,'api.php']]],
+ ['api_5fformat_5fitems',['api_format_items',['../include_2api_8php.html#a4c6fb9fb5203aa60f4b3afd4521db8ea',1,'api.php']]],
+ ['api_5fformat_5fmessages',['api_format_messages',['../include_2api_8php.html#ae82608c317421f27446465aa6724733d',1,'api.php']]],
+ ['api_5ffriendica_5fversion',['api_friendica_version',['../include_2api_8php.html#a53b0680b682ae6078f2e1ed18cfb3f74',1,'api.php']]],
+ ['api_5ffriends_5fids',['api_friends_ids',['../include_2api_8php.html#acafd2899309a005fcb725289173dc7fe',1,'api.php']]],
+ ['api_5fget_5fuser',['api_get_user',['../include_2api_8php.html#aa40bae797bcd9ccacffdce5a3b5a1afa',1,'api.php']]],
+ ['api_5fhelp_5ftest',['api_help_test',['../include_2api_8php.html#ac5a64cc81d70ff3cf866093ea9721d23',1,'api.php']]],
+ ['api_5fitem_5fget_5fuser',['api_item_get_user',['../include_2api_8php.html#aa49741342ad8ba285737eea1209a37e1',1,'api.php']]],
+ ['api_5flogin',['api_login',['../include_2api_8php.html#afe534f826e4282b72d66e8cadca7bb73',1,'api.php']]],
+ ['api_5foauth_5faccess_5ftoken',['api_oauth_access_token',['../include_2api_8php.html#aff322705cc6084b329003fc8eab0aad0',1,'api.php']]],
+ ['api_5foauth_5frequest_5ftoken',['api_oauth_request_token',['../include_2api_8php.html#aa1bddb580510e70cc1a7b7381667f1a3',1,'api.php']]],
+ ['api_5fphotos',['api_photos',['../include_2api_8php.html#aa6fc3bc8c0fad1d081db0dcc456dd77f',1,'api.php']]],
+ ['api_5fpost',['api_post',['../mod_2api_8php.html#a6fe77f05c07cb51048df0d557b4b9bd2',1,'api.php']]],
+ ['api_5fregister_5ffunc',['api_register_func',['../include_2api_8php.html#ac2c2b18c426d697d11a830bca146be8a',1,'api.php']]],
+ ['api_5frss_5fextra',['api_rss_extra',['../include_2api_8php.html#a6a04b48168ba1d9dd2de3081a630611f',1,'api.php']]],
+ ['api_5fstatus_5fshow',['api_status_show',['../include_2api_8php.html#a645397787618b5c548a31e8686e8cca4',1,'api.php']]],
+ ['api_5fstatuses_5fdestroy',['api_statuses_destroy',['../include_2api_8php.html#ad4c29f43418f6110f85a6b3998239ab4',1,'api.php']]],
+ ['api_5fstatuses_5ff',['api_statuses_f',['../include_2api_8php.html#aa0d6b29fff0344a8e67f3507a6d01410',1,'api.php']]],
+ ['api_5fstatuses_5ffollowers',['api_statuses_followers',['../include_2api_8php.html#a6951c690d87775eb37e569c66011988e',1,'api.php']]],
+ ['api_5fstatuses_5ffriends',['api_statuses_friends',['../include_2api_8php.html#ade742525b2e41c82b090799ef3c51d5e',1,'api.php']]],
+ ['api_5fstatuses_5fhome_5ftimeline',['api_statuses_home_timeline',['../include_2api_8php.html#a528d8070ee74ea800102936ce73cf366',1,'api.php']]],
+ ['api_5fstatuses_5fmediap',['api_statuses_mediap',['../include_2api_8php.html#a450d8732b7b608f7ac929aee61572b95',1,'api.php']]],
+ ['api_5fstatuses_5fmentions',['api_statuses_mentions',['../include_2api_8php.html#a8b25a186bd0893f51aa72a62f655735e',1,'api.php']]],
+ ['api_5fstatuses_5fpublic_5ftimeline',['api_statuses_public_timeline',['../include_2api_8php.html#ad24ce1bf20867add4c9211a8eaf93f22',1,'api.php']]],
+ ['api_5fstatuses_5frepeat',['api_statuses_repeat',['../include_2api_8php.html#ae0fa388479cace9c5a7a45b571ab42f8',1,'api.php']]],
+ ['api_5fstatuses_5fshow',['api_statuses_show',['../include_2api_8php.html#af6f1d89cdb0a0621025efbec1597bc63',1,'api.php']]],
+ ['api_5fstatuses_5fupdate',['api_statuses_update',['../include_2api_8php.html#ad4d1634df6b35126552324683caaffa2',1,'api.php']]],
+ ['api_5fstatuses_5fuser_5ftimeline',['api_statuses_user_timeline',['../include_2api_8php.html#a32f0dda848d0c11c727fe1c3e741c283',1,'api.php']]],
+ ['api_5fstatusnet_5fconfig',['api_statusnet_config',['../include_2api_8php.html#a623793229a7256dd31bcfd5ab90eef08',1,'api.php']]],
+ ['api_5fstatusnet_5fversion',['api_statusnet_version',['../include_2api_8php.html#a8969e8d9c683f12ba17dcd4b059e020d',1,'api.php']]],
+ ['api_5fuser',['api_user',['../include_2api_8php.html#afb99daa6b731bf497b81f2128084852c',1,'api.php']]],
+ ['api_5fusers_5fshow',['api_users_show',['../include_2api_8php.html#abe8e929e93f7ab134b1cb1fb30f19a76',1,'api.php']]],
+ ['appdirpath',['appdirpath',['../boot_8php.html#a75a90b0eadd0df510f7e63210733634d',1,'boot.php']]],
+ ['apps_5fcontent',['apps_content',['../apps_8php.html#a546016cb960d0b110ee8e489dfa6c27c',1,'apps.php']]],
+ ['apw_5fform',['apw_form',['../view_2theme_2apw_2php_2config_8php.html#a8b51951a70e1c1324be71345a61d70ec',1,'config.php']]],
+ ['apw_5finit',['apw_init',['../apw_2php_2theme_8php.html#a42167c539043a39a6b83c252d05f1e89',1,'theme.php']]],
+ ['argc',['argc',['../boot_8php.html#abc0a90a1a77f5b668aa7e4b57d1776a7',1,'boot.php']]],
+ ['argv',['argv',['../boot_8php.html#a768f00b7d66be0daf7ef4eea2e862006',1,'boot.php']]],
+ ['arr_5fadd_5fhashes',['arr_add_hashes',['../parse__url_8php.html#aa7dd8f961bea042d62726ed909e4a868',1,'parse_url.php']]],
+ ['array_5fsanitise',['array_sanitise',['../items_8php.html#abf7a1b73eb352d79acd36309b0dababd',1,'items.php']]],
+ ['array_5fxmlify',['array_xmlify',['../text_8php.html#acedb584f65114a33f389efb796172a91',1,'text.php']]],
+ ['atom_5fauthor',['atom_author',['../items_8php.html#a016dd86c827d08db89061ea81d15c6cb',1,'items.php']]],
+ ['atom_5fentry',['atom_entry',['../items_8php.html#a275108c050f7eb18bcbb5018e6b81cf6',1,'items.php']]],
+ ['attach_5fby_5fhash',['attach_by_hash',['../include_2attach_8php.html#a0d07c5b83d3d54e186f752e571847b36',1,'attach.php']]],
+ ['attach_5fby_5fhash_5fnodata',['attach_by_hash_nodata',['../include_2attach_8php.html#ad991208ce939387e2f93a3bce7d09932',1,'attach.php']]],
+ ['attach_5fchange_5fpermissions',['attach_change_permissions',['../include_2attach_8php.html#a5c0875eafb8c0f8a0620ff7a875a2221',1,'attach.php']]],
+ ['attach_5fcount_5ffiles',['attach_count_files',['../include_2attach_8php.html#a887d2d44a3ef18dcb6624e7fb58dc8e3',1,'attach.php']]],
+ ['attach_5fdelete',['attach_delete',['../include_2attach_8php.html#a70bd666e080c2af5a91f5d14c297b8cd',1,'attach.php']]],
+ ['attach_5finit',['attach_init',['../mod_2attach_8php.html#aa88eb5ad87aa1036a30e70339cc6c1b1',1,'attach.php']]],
+ ['attach_5flist_5ffiles',['attach_list_files',['../include_2attach_8php.html#a3634af95f11a023dd8e882c3c7a3600d',1,'attach.php']]],
+ ['attach_5fmkdir',['attach_mkdir',['../include_2attach_8php.html#ab6830b3ab74a5d284876141ac80f6cbc',1,'attach.php']]],
+ ['attach_5fstore',['attach_store',['../include_2attach_8php.html#a84a8a64c4805e1525b42d4add464833f',1,'attach.php']]],
+ ['attribute_5fcontains',['attribute_contains',['../text_8php.html#a95fd2f8f23a1948414a03ebc963bac57',1,'text.php']]],
+ ['authenticate_5fsuccess',['authenticate_success',['../security_8php.html#adc7bf51e3b8d67bd80e9348f9ab03733',1,'security.php']]],
+ ['autoname',['autoname',['../text_8php.html#a27cd2c1b3bcb49a0cfb7249e851725ca',1,'text.php']]],
+ ['avatar_5fimg',['avatar_img',['../include_2network_8php.html#ab07ce9d75eae559865ed90aad2154bd7',1,'network.php']]]
+];
diff --git a/doc/html/search/functions_62.html b/doc/html/search/functions_62.html
new file mode 100644
index 000000000..5134d2d29
--- /dev/null
+++ b/doc/html/search/functions_62.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_62.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/functions_62.js b/doc/html/search/functions_62.js
new file mode 100644
index 000000000..106f84da7
--- /dev/null
+++ b/doc/html/search/functions_62.js
@@ -0,0 +1,29 @@
+var searchData=
+[
+ ['base64url_5fdecode',['base64url_decode',['../text_8php.html#a13286f8a95d2de6b102966ecc270c8d6',1,'text.php']]],
+ ['base64url_5fencode',['base64url_encode',['../text_8php.html#a070384ec000fd65043fce11d5392d241',1,'text.php']]],
+ ['bb2diaspora',['bb2diaspora',['../bb2diaspora_8php.html#a4f10e0876b27373c762bc1abbe745f5c',1,'bb2diaspora.php']]],
+ ['bb_5fparse_5fcrypt',['bb_parse_crypt',['../bbcode_8php.html#a851f5aafefe52474201b83f9fd65931f',1,'bbcode.php']]],
+ ['bb_5fqr',['bb_qr',['../bbcode_8php.html#a98d0eecc620c19561639f06cfbe8e74c',1,'bbcode.php']]],
+ ['bb_5fshareattributes',['bb_ShareAttributes',['../bbcode_8php.html#a1c69e021d5e0aef97d6966bf3169c86a',1,'bbcode.php']]],
+ ['bb_5fshareattributessimple',['bb_ShareAttributesSimple',['../bbcode_8php.html#a2be26414a367118143cc89e2d58e7377',1,'bbcode.php']]],
+ ['bb_5fspacefy',['bb_spacefy',['../bbcode_8php.html#a8911e027907820df3db03b4f76724b50',1,'bbcode.php']]],
+ ['bb_5ftag_5fpreg_5freplace',['bb_tag_preg_replace',['../bb2diaspora_8php.html#ad0abe1a7ee50aa0736a233df0a422eba',1,'bb2diaspora.php']]],
+ ['bb_5ftranslate_5fvideo',['bb_translate_video',['../text_8php.html#a3d2793d66db3345fd290b71e2eadf98e',1,'text.php']]],
+ ['bb_5funspacefy_5fand_5ftrim',['bb_unspacefy_and_trim',['../bbcode_8php.html#a064dcfd9767df6f53be1a0e11ceeb15d',1,'bbcode.php']]],
+ ['bbcode',['bbcode',['../bbcode_8php.html#a009f61aaf78771737ed0765c8463911b',1,'bbcode.php']]],
+ ['bbtoevent',['bbtoevent',['../event_8php.html#a180cccd63c2a2f00ff432b03113531f3',1,'event.php']]],
+ ['bbtovcal',['bbtovcal',['../event_8php.html#a184d6b9690e5b6dee35a0aa9edd47279',1,'event.php']]],
+ ['best_5flink_5furl',['best_link_url',['../conversation_8php.html#ad470fc7766f0db66d138fa1916c7a8b7',1,'conversation.php']]],
+ ['blocks_5fcontent',['blocks_content',['../blocks_8php.html#a2531a8fd51db3cecb2eb20c002c66e12',1,'blocks.php']]],
+ ['blog_5finit',['blog_init',['../blogga_2php_2theme_8php.html#aa55c1cb1f05087b5002ecb633b550b1b',1,'blog_init(&amp;$a):&#160;theme.php'],['../blogga_2view_2theme_2blog_2theme_8php.html#aa55c1cb1f05087b5002ecb633b550b1b',1,'blog_init(&amp;$a):&#160;theme.php']]],
+ ['blog_5finstall',['blog_install',['../blogga_2view_2theme_2blog_2theme_8php.html#aae58cc837fe56473d9f3370abfe533ae',1,'theme.php']]],
+ ['blog_5funinstall',['blog_uninstall',['../blogga_2view_2theme_2blog_2theme_8php.html#a3e77dbe111f330c64a1ff6c741cd515c',1,'theme.php']]],
+ ['blogtheme_5fdisplay_5fitem',['blogtheme_display_item',['../blogga_2view_2theme_2blog_2theme_8php.html#a028ae8e9f2824670dfa76a6651d817e5',1,'theme.php']]],
+ ['blogtheme_5fform',['blogtheme_form',['../view_2theme_2blogga_2php_2config_8php.html#a8a311a402d3e746ce53fadc38e4b2d27',1,'blogtheme_form(&amp;$a, $headimg, $headimghome):&#160;config.php'],['../view_2theme_2blogga_2view_2theme_2blog_2config_8php.html#a8a311a402d3e746ce53fadc38e4b2d27',1,'blogtheme_form(&amp;$a, $headimg, $headimghome):&#160;config.php']]],
+ ['blogtheme_5fimgurl',['blogtheme_imgurl',['../blogga_2view_2theme_2blog_2theme_8php.html#af634a3f721c5e238530d0636d33230ec',1,'theme.php']]],
+ ['breaklines',['breaklines',['../html2plain_8php.html#a3214912e3d00cf0a948072daccf16740',1,'html2plain.php']]],
+ ['build_5fpagehead',['build_pagehead',['../classApp.html#a08f0537964d98958d218066364cff785',1,'App']]],
+ ['build_5fquerystring',['build_querystring',['../boot_8php.html#a9cbab4ee728e9a8b4ce952bae643044e',1,'boot.php']]],
+ ['build_5fsync_5fpacket',['build_sync_packet',['../zot_8php.html#ac34e479d27f32b82dd6b33542f81a6a7',1,'zot.php']]]
+];
diff --git a/doc/html/search/functions_63.html b/doc/html/search/functions_63.html
new file mode 100644
index 000000000..9114d820c
--- /dev/null
+++ b/doc/html/search/functions_63.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_63.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/functions_63.js b/doc/html/search/functions_63.js
new file mode 100644
index 000000000..271be6b7e
--- /dev/null
+++ b/doc/html/search/functions_63.js
@@ -0,0 +1,114 @@
+var searchData=
+[
+ ['cal',['cal',['../datetime_8php.html#aea356409ba69f9de412298c998595dd2',1,'datetime.php']]],
+ ['call_5fhooks',['call_hooks',['../plugin_8php.html#a7f05de16c0a32602853b09b99dd85e7c',1,'plugin.php']]],
+ ['can_5fcomment_5fon_5fpost',['can_comment_on_post',['../items_8php.html#a1e75047cf175aaee8dd16aa761913ff9',1,'items.php']]],
+ ['categories_5fwidget',['categories_widget',['../contact__widgets_8php.html#a165eb021e61c4dcab2a552f28628d353',1,'contact_widgets.php']]],
+ ['change_5fchannel',['change_channel',['../security_8php.html#a8d23d2597aae380a3341872fe9513380',1,'security.php']]],
+ ['change_5fpermissions',['change_permissions',['../classProtoDriver.html#a34b97ca5ef2165f2e16eb2fe59ff6c67',1,'ProtoDriver\change_permissions()'],['../classZotDriver.html#a6776935156accb0f170e2e24577133db',1,'ZotDriver\change_permissions()']]],
+ ['chanlink_5fcid',['chanlink_cid',['../text_8php.html#a85e3a4851c16674834010d8419a5d7ca',1,'text.php']]],
+ ['chanlink_5fhash',['chanlink_hash',['../text_8php.html#a55ab893be57feda59c2a7ba1e58ff2d0',1,'text.php']]],
+ ['chanlink_5furl',['chanlink_url',['../text_8php.html#a2e8d6c402603be3a1256a16605e09c2a',1,'text.php']]],
+ ['chanman_5fremove_5feverything_5ffrom_5fnetwork',['chanman_remove_everything_from_network',['../include_2chanman_8php.html#a21ba9a5c961e866ff27aee3ee67bf99b',1,'chanman.php']]],
+ ['channel_5fcontent',['channel_content',['../channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1',1,'channel.php']]],
+ ['channel_5finit',['channel_init',['../channel_8php.html#ac7c8c7845741baadf87fae6bc279f3dc',1,'channel.php']]],
+ ['channel_5fremove',['channel_remove',['../Contact_8php.html#a186162051a5127069cc851d78740f205',1,'Contact.php']]],
+ ['channel_5ftotal',['channel_total',['../identity_8php.html#a77d2237f1846964634b1c99089c27c7d',1,'identity.php']]],
+ ['channelx_5fby_5fhash',['channelx_by_hash',['../Contact_8php.html#a483cda56f9e37c3a4a8773dcdfeb0258',1,'Contact.php']]],
+ ['channelx_5fby_5fn',['channelx_by_n',['../Contact_8php.html#a3a0844dac1e86d523de5d2f432cfeebc',1,'Contact.php']]],
+ ['channelx_5fby_5fnick',['channelx_by_nick',['../Contact_8php.html#a87e699f74a1102b25e8aa0432d86a91e',1,'Contact.php']]],
+ ['chanview_5fcontent',['chanview_content',['../chanview_8php.html#a4192c6da888c8c1165851acf9ad4cb8b',1,'chanview.php']]],
+ ['check_5faccount_5fadmin',['check_account_admin',['../account_8php.html#a917d74aad0baf3e0c4b51cf1051e654f',1,'account.php']]],
+ ['check_5faccount_5femail',['check_account_email',['../account_8php.html#ae052bd5558847bd38e89c213561a9771',1,'account.php']]],
+ ['check_5faccount_5finvite',['check_account_invite',['../account_8php.html#aaff7720423417a4333697894ffd9ddeb',1,'account.php']]],
+ ['check_5faccount_5fpassword',['check_account_password',['../account_8php.html#a144b4891022567668375b58ea61cfff0',1,'account.php']]],
+ ['check_5fadd',['check_add',['../setup_8php.html#ae8e4d9279a61de74d5f39962cb7b6ca1',1,'setup.php']]],
+ ['check_5fconfig',['check_config',['../boot_8php.html#a4c02d88e66852a01bd5a1feecb7c3ce3',1,'boot.php']]],
+ ['check_5fform_5fsecurity_5fstd_5ferr_5fmsg',['check_form_security_std_err_msg',['../security_8php.html#a20f8b9851f23ee8894b8925584ef6821',1,'security.php']]],
+ ['check_5fform_5fsecurity_5ftoken',['check_form_security_token',['../security_8php.html#a9c6180e82150a5a9af91a1255d096b5c',1,'security.php']]],
+ ['check_5fform_5fsecurity_5ftoken_5fforbiddenonerr',['check_form_security_token_ForbiddenOnErr',['../security_8php.html#a444ac867dfa8c37cf0a7a226412bee28',1,'security.php']]],
+ ['check_5fform_5fsecurity_5ftoken_5fredirectonerr',['check_form_security_token_redirectOnErr',['../security_8php.html#a77ba0d1889a39cf32434c5ce96fe1433',1,'security.php']]],
+ ['check_5ffuncs',['check_funcs',['../setup_8php.html#a69a450e06dd3771fb51d3e4b0266a35e',1,'setup.php']]],
+ ['check_5fhtaccess',['check_htaccess',['../setup_8php.html#a0c3f3b671381f6dccd924b8ecdfc56c4',1,'setup.php']]],
+ ['check_5fhtconfig',['check_htconfig',['../setup_8php.html#a5ad92c0857d1dadd6b60a9a557159c9f',1,'setup.php']]],
+ ['check_5fitem_5fsource',['check_item_source',['../items_8php.html#a87ac9e359591721a824ecd23bbb56296',1,'items.php']]],
+ ['check_5fkeys',['check_keys',['../setup_8php.html#aa3bbb111780da70ba35cc23a306f2c76',1,'setup.php']]],
+ ['check_5flist_5fpermissions',['check_list_permissions',['../permissions_8php.html#a0f5bd9f7f4c8fb7ba4b2c1ed048b4dc7',1,'permissions.php']]],
+ ['check_5fphp',['check_php',['../setup_8php.html#a14d208682a88632290c895d20da6e7d6',1,'setup.php']]],
+ ['check_5fsmarty3',['check_smarty3',['../setup_8php.html#afd8b0b3ade1507c45325caf377bf459d',1,'setup.php']]],
+ ['check_5fstore',['check_store',['../setup_8php.html#ab4b71369a25021d59247c917e98d8246',1,'setup.php']]],
+ ['check_5fwall_5fto_5fwall',['check_wall_to_wall',['../classItem.html#abcdb0ea9bcd1576bc99bba9b8f700bb8',1,'Item']]],
+ ['check_5fwebbie',['check_webbie',['../text_8php.html#a0c65597bb4aed3a039eb795ff540e5e3',1,'text.php']]],
+ ['childexists',['childExists',['../classRedDirectory.html#a5e3fc08b2bf9f61cea4d2ccae0495bec',1,'RedDirectory']]],
+ ['clean_5furls',['clean_urls',['../boot_8php.html#ab79b8b4555cae20d03f8200666d89d63',1,'boot.php']]],
+ ['clear',['clear',['../classCache.html#ab14d0f4bdf7116a94d545c574b38f568',1,'Cache']]],
+ ['cleardiv',['cleardiv',['../text_8php.html#afe18627c4983ee5f7c940a0992818cd5',1,'text.php']]],
+ ['cli_5fstartup',['cli_startup',['../cli__startup_8php.html#adfdde63686e33ccd4851fa5edc4fc70b',1,'cli_startup.php']]],
+ ['cli_5fsuggest_5frun',['cli_suggest_run',['../cli__suggest_8php.html#a8f3a60fc96f4bec7d3837c4efc7725f2',1,'cli_suggest.php']]],
+ ['close',['close',['../classdba__driver.html#a5afa54172f3c837df61643f8f5b2c975',1,'dba_driver\close()'],['../classdba__mysql.html#a850586714ef897bd25f643c89b4ef76e',1,'dba_mysql\close()'],['../classdba__mysqli.html#acb38f2c851187ad632ecfab30fdfab55',1,'dba_mysqli\close()']]],
+ ['cloud_5finit',['cloud_init',['../cloud_8php.html#a1b79a6fe0454bc76673ad9aef55bf02d',1,'cloud.php']]],
+ ['collect',['collect',['../classProtoDriver.html#a2ba1758f0f9e3564580b6ff85292804d',1,'ProtoDriver\collect()'],['../classZotDriver.html#af65febb26031eb7f39871b9e2a539797',1,'ZotDriver\collect()']]],
+ ['collect_5fprivate',['collect_private',['../classProtoDriver.html#af66171aa7dab9b62cee915cb4f1abe1b',1,'ProtoDriver\collect_private()'],['../classZotDriver.html#a2e15ff09772f0608203dad1c98299394',1,'ZotDriver\collect_private()']]],
+ ['collect_5frecipients',['collect_recipients',['../items_8php.html#a01e3cf44e082fa9bd06dcde5bf713d70',1,'items.php']]],
+ ['collecturls',['collecturls',['../html2plain_8php.html#ae1c203d0f089d5678d73a6c64a395201',1,'html2plain.php']]],
+ ['comanche_5fblock',['comanche_block',['../comanche_8php.html#a5a7ab801717d38e91ac910b933973887',1,'comanche.php']]],
+ ['comanche_5fmenu',['comanche_menu',['../comanche_8php.html#a1fe339e1454803aa502ac89379c17f5b',1,'comanche.php']]],
+ ['comanche_5fparser',['comanche_parser',['../comanche_8php.html#a1a208fdb40dd83d6298caec4290ee922',1,'comanche.php']]],
+ ['comanche_5fregion',['comanche_region',['../comanche_8php.html#a5718daeda40bf835345fe061e8808cdf',1,'comanche.php']]],
+ ['comanche_5freplace_5fregion',['comanche_replace_region',['../comanche_8php.html#a028f004d5b8c23d6367816d899e17cfe',1,'comanche.php']]],
+ ['comanche_5fwebpage',['comanche_webpage',['../comanche_8php.html#ae9fe1ce574db3dd0931eada80234f82a',1,'comanche.php']]],
+ ['comanche_5fwidget',['comanche_widget',['../comanche_8php.html#a6b0191c1a63db1696a2eb139d90d9e7f',1,'comanche.php']]],
+ ['common_5fcontent',['common_content',['../common_8php.html#ab63408f39abef7a6915186e8dabc5a96',1,'common.php']]],
+ ['common_5ffriends',['common_friends',['../socgraph_8php.html#a7d34cd58025bcd9e575282f44db75918',1,'socgraph.php']]],
+ ['common_5ffriends_5fvisitor_5fwidget',['common_friends_visitor_widget',['../contact__widgets_8php.html#a552f8544528cec0c995cea7287ea9d65',1,'contact_widgets.php']]],
+ ['common_5ffriends_5fzcid',['common_friends_zcid',['../socgraph_8php.html#ac343a846241d36cdf046b08f3396cfe9',1,'socgraph.php']]],
+ ['common_5finit',['common_init',['../common_8php.html#aca62f113655809f41f49042ce9b123c2',1,'common.php']]],
+ ['community_5fcontent',['community_content',['../community_8php.html#a1197aafd6a6b540dbb4a0c04ade3a25a',1,'community.php']]],
+ ['community_5finit',['community_init',['../community_8php.html#a56c94ec978a38633c5628fa6f8e386d9',1,'community.php']]],
+ ['compare_5fpermissions',['compare_permissions',['../items_8php.html#a0790a4550b829e85504af548623002ca',1,'items.php']]],
+ ['completeurl',['completeurl',['../parse__url_8php.html#a496f4e3836154f6f32b8e805a7160d3a',1,'parse_url.php']]],
+ ['connect',['connect',['../classdba__driver.html#ae533e62a240a793f17aef5ab4ef10edc',1,'dba_driver\connect()'],['../classdba__mysql.html#a1887338627ce0e28786839363014bd0b',1,'dba_mysql\connect()'],['../classdba__mysqli.html#add062bd93961e5f0194d94820e9a51b1',1,'dba_mysqli\connect()']]],
+ ['connect_5fcontent',['connect_content',['../connect_8php.html#a489f0a66c660de6ec4d6917b27674f07',1,'connect.php']]],
+ ['connect_5finit',['connect_init',['../connect_8php.html#ad46a38f32fd7a3d324b1fa26373efa36',1,'connect.php']]],
+ ['connect_5fpost',['connect_post',['../connect_8php.html#a417ec27afe33f21a929667a665e32ee2',1,'connect.php']]],
+ ['connections_5fclone',['connections_clone',['../connections_8php.html#a15af118efee9c948b6f8294e54a73bb2',1,'connections.php']]],
+ ['connections_5fcontent',['connections_content',['../connections_8php.html#aec2e457420fce3e3bf6a9f48e36df25c',1,'connections.php']]],
+ ['connections_5finit',['connections_init',['../connections_8php.html#a1f23623f802af7bd35e95b0e94e5d558',1,'connections.php']]],
+ ['connections_5fpost',['connections_post',['../connections_8php.html#a1224058db8e3fb56463eb312f98e561d',1,'connections.php']]],
+ ['connedit_5fclone',['connedit_clone',['../connedit_8php.html#a707ea7e63cf9674025b1d6b081ae74f5',1,'connedit.php']]],
+ ['connedit_5fcontent',['connedit_content',['../connedit_8php.html#a795acb3d9d841f55c255d7611681ab67',1,'connedit.php']]],
+ ['connedit_5finit',['connedit_init',['../connedit_8php.html#a4da871e075597a09a8b374b9171dd92e',1,'connedit.php']]],
+ ['connedit_5fpost',['connedit_post',['../connedit_8php.html#a234c48426b652bf4d37053f2af329ac5',1,'connedit.php']]],
+ ['construct_5factivity_5fobject',['construct_activity_object',['../items_8php.html#aa9e99613d38a97b39c8cf5449699c2ee',1,'items.php']]],
+ ['construct_5factivity_5ftarget',['construct_activity_target',['../items_8php.html#aa579bc4445d60098b1410961ca8e96b7',1,'items.php']]],
+ ['construct_5fpage',['construct_page',['../boot_8php.html#acc4e0c910af066148b810e5fde55fff1',1,'boot.php']]],
+ ['construct_5fverb',['construct_verb',['../items_8php.html#a8f3c85c584ccd2b98c3ca440e45b40f8',1,'items.php']]],
+ ['consume_5ffeed',['consume_feed',['../items_8php.html#a8794863cdf8ce1333040933d3a3f66bd',1,'items.php']]],
+ ['contact_5fblock',['contact_block',['../text_8php.html#ad6432621d0fafcbcf3d3b9b49bef7784',1,'text.php']]],
+ ['contact_5fpoll_5finterval',['contact_poll_interval',['../contact__selectors_8php.html#a9839e8fdaac7ffb37bf1420493f5c28f',1,'contact_selectors.php']]],
+ ['contact_5fprofile_5fassign',['contact_profile_assign',['../contact__selectors_8php.html#a2c743d2eb526eb758d943a1490162d75',1,'contact_selectors.php']]],
+ ['contact_5fremove',['contact_remove',['../Contact_8php.html#a28e062c884331dbb5dfa713228c25ad6',1,'Contact.php']]],
+ ['contact_5freputation',['contact_reputation',['../contact__selectors_8php.html#ae499960d6467bd30c78607b1018baf53',1,'contact_selectors.php']]],
+ ['contact_5fselect',['contact_select',['../acl__selectors_8php.html#a9476997d2968a5794f3723878ed89c91',1,'acl_selectors.php']]],
+ ['contactgroup_5fcontent',['contactgroup_content',['../contactgroup_8php.html#a18c7391b1b25debaf98c9dba639caab3',1,'contactgroup.php']]],
+ ['conv_5fsort',['conv_sort',['../conversation_8php.html#abed85a41f1160598de880b84021c9cf7',1,'conversation.php']]],
+ ['conversation',['conversation',['../conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81',1,'conversation.php']]],
+ ['convert',['convert',['../namespacefriendica-to-smarty-tpl.html#a38503e37fe68ac27c88cce91a9ac9efa',1,'friendica-to-smarty-tpl']]],
+ ['convert_5fxml_5felement_5fto_5farray',['convert_xml_element_to_array',['../include_2network_8php.html#ad4056d3ce69988f5c1a997a79f503246',1,'network.php']]],
+ ['count_5fall_5ffriends',['count_all_friends',['../socgraph_8php.html#af29d056beec10b4e38e5209c92452894',1,'socgraph.php']]],
+ ['count_5fcommon_5ffriends',['count_common_friends',['../socgraph_8php.html#a887d576f21fd708132a06d0f72f90f84',1,'socgraph.php']]],
+ ['count_5fcommon_5ffriends_5fzcid',['count_common_friends_zcid',['../socgraph_8php.html#af175807406d94407a5e11742a3287746',1,'socgraph.php']]],
+ ['count_5fdescendants',['count_descendants',['../classItem.html#aca1e66988ed00cd627b2a359b72cd0ae',1,'Item\count_descendants()'],['../conversation_8php.html#ab2383dff4f823e580399ff469d90ab19',1,'count_descendants():&#160;conversation.php']]],
+ ['create_5faccount',['create_account',['../account_8php.html#a141fe579c351c78209d425473f978eb5',1,'account.php']]],
+ ['create_5fidentity',['create_identity',['../identity_8php.html#a345f4c943d84de502ec6e72d2c813945',1,'identity.php']]],
+ ['create_5fsys_5fchannel',['create_sys_channel',['../identity_8php.html#a1cf83ac2b645de12868edaa3a5718f05',1,'identity.php']]],
+ ['createdirectory',['createDirectory',['../classRedDirectory.html#a986936910f0216887a25e28916c166c7',1,'RedDirectory']]],
+ ['createfile',['createFile',['../classRedDirectory.html#a2d12d99d38a6a75fc9a830b2f7fc0bf0',1,'RedDirectory']]],
+ ['cronhooks_5frun',['cronhooks_run',['../cronhooks_8php.html#a4c4c1bbec4ecc9a0efa00dd6afd2c0ca',1,'cronhooks.php']]],
+ ['cropimage',['cropImage',['../classphoto__driver.html#a2e6e61f1e356a90bc978f4404a77137e',1,'photo_driver\cropImage()'],['../classphoto__gd.html#ab2232d775c8bacf66773a03308105f0c',1,'photo_gd\cropImage()'],['../classphoto__imagick.html#a2f33a03a89497a2b2768e29736d4a8a4',1,'photo_imagick\cropImage()']]],
+ ['crypto_5fencapsulate',['crypto_encapsulate',['../crypto_8php.html#a32fc08d57a5694f94d8543ecbb03323c',1,'crypto.php']]],
+ ['crypto_5funencapsulate',['crypto_unencapsulate',['../crypto_8php.html#a0781202b0a43b82426929cc87c2fa2b5',1,'crypto.php']]],
+ ['curpageurl',['curPageURL',['../boot_8php.html#aa4221641e5c21db69fa52c426b9017f5',1,'boot.php']]],
+ ['current_5ftheme',['current_theme',['../boot_8php.html#ad206598b909e8eb67eb0e0bb5ef69c13',1,'boot.php']]],
+ ['current_5ftheme_5furl',['current_theme_url',['../boot_8php.html#a926cad0b3d8b9d9ee5da1898fc063ba3',1,'boot.php']]]
+];
diff --git a/doc/html/search/functions_64.html b/doc/html/search/functions_64.html
new file mode 100644
index 000000000..17149308a
--- /dev/null
+++ b/doc/html/search/functions_64.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_64.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/functions_64.js b/doc/html/search/functions_64.js
new file mode 100644
index 000000000..ef331a740
--- /dev/null
+++ b/doc/html/search/functions_64.js
@@ -0,0 +1,49 @@
+var searchData=
+[
+ ['datesel',['datesel',['../datetime_8php.html#ac265b86f384ee094ed5479aae02aa5c8',1,'datetime.php']]],
+ ['datesel_5fformat',['datesel_format',['../datetime_8php.html#a5f29553799005b1fd4e9ce9d98ce05aa',1,'datetime.php']]],
+ ['datetime_5fconvert',['datetime_convert',['../datetime_8php.html#ad6301e74b0f9267d52f8d432b5beb226',1,'datetime.php']]],
+ ['day_5ftranslate',['day_translate',['../text_8php.html#a63fb21c0bed2fc72eef2c1471ac42b63',1,'text.php']]],
+ ['dba_5ffactory',['dba_factory',['../dba__driver_8php.html#ac10e60f6e5b95bcf67bd82cb88f37947',1,'dba_driver.php']]],
+ ['dba_5ftimer',['dba_timer',['../boot_8php.html#a3e0930933fb2c0bf8211cc7ab4e1c3b4',1,'boot.php']]],
+ ['dbesc',['dbesc',['../dba__driver_8php.html#ab222aa1dbf9ea93b320f82028739127e',1,'dba_driver.php']]],
+ ['dbesc_5farray',['dbesc_array',['../dba__driver_8php.html#a65b83462bd26968106aebd43f16540e4',1,'dba_driver.php']]],
+ ['dbesc_5farray_5fcb',['dbesc_array_cb',['../dba__driver_8php.html#af531546fac5f0836a8557a4f6dfee930',1,'dba_driver.php']]],
+ ['dbg',['dbg',['../classdba__driver.html#adcc1f8955120fec0708bce39202d0422',1,'dba_driver\dbg()'],['../dba__driver_8php.html#aa6607893d8f60ade9122bcfbd1a53ffb',1,'dbg():&#160;dba_driver.php']]],
+ ['dbq',['dbq',['../dba__driver_8php.html#aa377074e70981e8c4e82ca0accd068ee',1,'dba_driver.php']]],
+ ['decode_5ftags',['decode_tags',['../items_8php.html#a56b2a4abcadfac71175cd50555528cc3',1,'items.php']]],
+ ['del_5fconfig',['del_config',['../include_2config_8php.html#a549910227348003efc3c05c9105c42da',1,'config.php']]],
+ ['del_5fpconfig',['del_pconfig',['../include_2config_8php.html#a7ad2081c5f812ac4387fd76f3762d941',1,'config.php']]],
+ ['del_5fxconfig',['del_xconfig',['../include_2config_8php.html#a9c171def547deee16738dc58fdeb4b72',1,'config.php']]],
+ ['delegate_5fcontent',['delegate_content',['../delegate_8php.html#a943eea8996ef348eb845c498f9f354dd',1,'delegate.php']]],
+ ['delete',['delete',['../classRedFile.html#aef71c9eaac7052be7dc8602eb12171e7',1,'RedFile']]],
+ ['delete_5fimported_5fitem',['delete_imported_item',['../zot_8php.html#adfeb9400ae6b726beec89f8f1e8fde72',1,'zot.php']]],
+ ['delete_5fitem_5flowlevel',['delete_item_lowlevel',['../items_8php.html#a2b56a4c01bd22a648d52ec9af1a04259',1,'items.php']]],
+ ['deletenode',['deletenode',['../html2bbcode_8php.html#a71a07f135d196ec5943b13f7b2e6a9b2',1,'html2bbcode.php']]],
+ ['deliver',['deliver',['../classProtoDriver.html#a85e9063f6d0c304410cd246f7900ea1b',1,'ProtoDriver\deliver()'],['../classZotDriver.html#a876e3e0e4cad83c0b58c8696b344be6f',1,'ZotDriver\deliver()']]],
+ ['deliver_5fprivate',['deliver_private',['../classProtoDriver.html#ae5b44739f84c10d00a9b65adf3785181',1,'ProtoDriver\deliver_private()'],['../classZotDriver.html#afaaf9941169fc966e43e25b25e6daea6',1,'ZotDriver\deliver_private()']]],
+ ['deliver_5frun',['deliver_run',['../deliver_8php.html#a397afcb9afecf0c1816b0951189dd346',1,'deliver.php']]],
+ ['design_5ftools',['design_tools',['../text_8php.html#a87a3cefc603302c78982f1d8e1245265',1,'text.php']]],
+ ['destroy',['destroy',['../classphoto__driver.html#ae1a9edaf846983780dc65ea77d99e813',1,'photo_driver\destroy()'],['../classphoto__gd.html#a724703ecf71b1f1d04a80e86c76db6b1',1,'photo_gd\destroy()'],['../classphoto__imagick.html#afd49d64751ee3a298eac0c0ce0ba0207',1,'photo_imagick\destroy()']]],
+ ['detect_5flanguage',['detect_language',['../language_8php.html#a632da17c7ac0d2dc1a00a4706870194b',1,'language.php']]],
+ ['diaspora2bb',['diaspora2bb',['../bb2diaspora_8php.html#a26c09c218413610e62e60754c579f6c6',1,'bb2diaspora.php']]],
+ ['diaspora_5fol',['diaspora_ol',['../bb2diaspora_8php.html#a8b96bd45884fa1c40b942939354197d4',1,'bb2diaspora.php']]],
+ ['diaspora_5ful',['diaspora_ul',['../bb2diaspora_8php.html#adc92ccda5f85ed27e64fcc17712c89cc',1,'bb2diaspora.php']]],
+ ['dir_5fsafe_5fmode',['dir_safe_mode',['../dir__fns_8php.html#acf621621e929d49441da30aad76a58cf',1,'dir_fns.php']]],
+ ['dir_5fsort_5flinks',['dir_sort_links',['../dir__fns_8php.html#ae56881d69bb6f8e828c9e35454386774',1,'dir_fns.php']]],
+ ['dir_5ftagadelic',['dir_tagadelic',['../taxonomy_8php.html#a088371f4bc19155b2291508f5cd63332',1,'taxonomy.php']]],
+ ['dir_5ftagblock',['dir_tagblock',['../taxonomy_8php.html#a599ee71dd3194c8127b00dabec77abc1',1,'taxonomy.php']]],
+ ['directory_5fcontent',['directory_content',['../mod_2directory_8php.html#aac79396570d759da2efac24fcedf5b44',1,'directory.php']]],
+ ['directory_5finit',['directory_init',['../mod_2directory_8php.html#a5ee59c213508b6b9787612a8219cb5bf',1,'directory.php']]],
+ ['directory_5frun',['directory_run',['../include_2directory_8php.html#aa75d3b0697ca1456aaabdb37a74aa0f0',1,'directory.php']]],
+ ['dirprofile_5finit',['dirprofile_init',['../dirprofile_8php.html#a3e1d30d3d93863ff5615f2df4ac7f052',1,'dirprofile.php']]],
+ ['dirsearch_5fcontent',['dirsearch_content',['../dirsearch_8php.html#aa1fb04e1de4f25b63349ac78f94ceb4c',1,'dirsearch.php']]],
+ ['dirsearch_5finit',['dirsearch_init',['../dirsearch_8php.html#a3e51964ae3f5ff147403407b65324752',1,'dirsearch.php']]],
+ ['discover',['discover',['../classProtoDriver.html#a64a3868cffe27d601d55f69a2ecc4337',1,'ProtoDriver\discover()'],['../classZotDriver.html#a40d328ff9f6b0a238afe286dddee1514',1,'ZotDriver\discover()']]],
+ ['display_5fcontent',['display_content',['../display_8php.html#a37137c98d47bf3306f4c2bb9f5b60de0',1,'display.php']]],
+ ['dlogger',['dlogger',['../text_8php.html#a0a1f7c0e97f9ecbebf3e5834582b014c',1,'text.php']]],
+ ['dob',['dob',['../datetime_8php.html#a3f2897db32e745fe2f3e70a6b46578f8',1,'datetime.php']]],
+ ['doscaleimage',['doScaleImage',['../classphoto__driver.html#ae18716018afcf362c7c24586b53e9e2f',1,'photo_driver\doScaleImage()'],['../classphoto__gd.html#a2f2e5900e6d8b1667892ac631b1d4754',1,'photo_gd\doScaleImage()'],['../classphoto__imagick.html#a3047c68bb4de7f66c2893fe451db2b66',1,'photo_imagick\doScaleImage()']]],
+ ['drop_5fitem',['drop_item',['../items_8php.html#afa1db13c2a8b73b5b17b97f17e5a19d1',1,'items.php']]],
+ ['drop_5fitems',['drop_items',['../items_8php.html#a668ece2c37f05cc3abe538eb0dabfe55',1,'items.php']]]
+];
diff --git a/doc/html/search/functions_65.html b/doc/html/search/functions_65.html
new file mode 100644
index 000000000..13260cf25
--- /dev/null
+++ b/doc/html/search/functions_65.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_65.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/functions_65.js b/doc/html/search/functions_65.js
new file mode 100644
index 000000000..2fcb5897e
--- /dev/null
+++ b/doc/html/search/functions_65.js
@@ -0,0 +1,25 @@
+var searchData=
+[
+ ['editblock_5fcontent',['editblock_content',['../editblock_8php.html#abbe8f55de06967bc8d79d620509a49e6',1,'editblock.php']]],
+ ['editlayout_5fcontent',['editlayout_content',['../editlayout_8php.html#aa877e4157a26b099de904164181dd386',1,'editlayout.php']]],
+ ['editpost_5fcontent',['editpost_content',['../editpost_8php.html#a34011690864d122680c802e9e748ccfb',1,'editpost.php']]],
+ ['editwebpage_5fcontent',['editwebpage_content',['../editwebpage_8php.html#a375e945255fad79a71036528f7480650',1,'editwebpage.php']]],
+ ['email_5fheader_5fencode',['email_header_encode',['../include_2network_8php.html#a469b9bd700269cd07d954f1a16c5899b',1,'network.php']]],
+ ['email_5fsend',['email_send',['../include_2network_8php.html#a1ff07d9fad93b713b93da0ab77aab7f0',1,'network.php']]],
+ ['encode_5fitem',['encode_item',['../items_8php.html#a82955cc578f0fa600acec84475026194',1,'items.php']]],
+ ['encode_5fitem_5fflags',['encode_item_flags',['../items_8php.html#a5f690fc2484abec07840b4f9dd525bd9',1,'items.php']]],
+ ['encode_5fitem_5fterms',['encode_item_terms',['../items_8php.html#ac6673627d289ee4f547de0fe3b7acd0a',1,'items.php']]],
+ ['encode_5fitem_5fxchan',['encode_item_xchan',['../items_8php.html#a566c601726697e044e75284af7fb6f17',1,'items.php']]],
+ ['encode_5fmail',['encode_mail',['../items_8php.html#a2d840c74ed23d1b6c7daee05cf89dda7',1,'items.php']]],
+ ['encode_5frel_5flinks',['encode_rel_links',['../items_8php.html#aa723c0571e314a1853a24c5854b4f54f',1,'items.php']]],
+ ['enumerate_5fpermissions',['enumerate_permissions',['../items_8php.html#afbcf26dfcf8a83fff952aa858c1b7b67',1,'items.php']]],
+ ['escape',['escape',['../classdba__driver.html#afc95ffa103a3290581b537670cde5311',1,'dba_driver\escape()'],['../classdba__mysql.html#a99a7691ea6cb1300031fb6549379066e',1,'dba_mysql\escape()'],['../classdba__mysqli.html#a27d6a748af7f80028801306e7ea33f64',1,'dba_mysqli\escape()']]],
+ ['escape_5ftags',['escape_tags',['../text_8php.html#aa5148a0dfea2a1ca64c3d52f10aa2d64',1,'text.php']]],
+ ['ev_5fcompare',['ev_compare',['../event_8php.html#a32ba1b9ddf7a744a9a1512b052e5f850',1,'event.php']]],
+ ['event_5fstore',['event_store',['../event_8php.html#a89ef533faf345db8d64a58d4856bde3a',1,'event.php']]],
+ ['events_5fcontent',['events_content',['../events_8php.html#a1d293fb217ae6bc9e3858c4b32e363ec',1,'events.php']]],
+ ['events_5fpost',['events_post',['../events_8php.html#ab3e8a8f901175f8e40a8089eea45c075',1,'events.php']]],
+ ['expand_5facl',['expand_acl',['../text_8php.html#ae4282a39492caa23ccbc2ce98e54f110',1,'text.php']]],
+ ['expand_5fgroups',['expand_groups',['../include_2group_8php.html#a22a81875259c7d3d64d4848afea6b345',1,'group.php']]],
+ ['expire_5frun',['expire_run',['../expire_8php.html#a444e45c9b67727b27db4c779fd51a298',1,'expire.php']]]
+];
diff --git a/doc/html/search/functions_66.html b/doc/html/search/functions_66.html
new file mode 100644
index 000000000..12565e3b2
--- /dev/null
+++ b/doc/html/search/functions_66.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_66.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/functions_66.js b/doc/html/search/functions_66.js
new file mode 100644
index 000000000..f9a7458d5
--- /dev/null
+++ b/doc/html/search/functions_66.js
@@ -0,0 +1,48 @@
+var searchData=
+[
+ ['fbrowser_5fcontent',['fbrowser_content',['../fbrowser_8php.html#aee476addcf7a3e0fe9454f7dfd5a56c4',1,'fbrowser.php']]],
+ ['feature_5fenabled',['feature_enabled',['../features_8php.html#a52b5bdfb61b256713efecf7a7b20b0c0',1,'features.php']]],
+ ['feed_5fhublinks',['feed_hublinks',['../text_8php.html#a8d8c4a11e53461caca21181ebd72daca',1,'text.php']]],
+ ['feed_5finit',['feed_init',['../feed_8php.html#af86137700b56f33d1d5f25c8dec22c04',1,'feed.php']]],
+ ['feed_5fsalmonlinks',['feed_salmonlinks',['../text_8php.html#a89929fa6f70a8ba54d5273fcf622b665',1,'text.php']]],
+ ['fetch_5flrdd_5ftemplate',['fetch_lrdd_template',['../include_2network_8php.html#a8d5a3afb51cc932032b5dcc159efaae0',1,'network.php']]],
+ ['fetch_5fpost_5ftags',['fetch_post_tags',['../items_8php.html#adf980098b6de9c3993bc3ff26a8dd6f9',1,'items.php']]],
+ ['field_5ftimezone',['field_timezone',['../datetime_8php.html#a03900dcf0f9e3c58793a031673a70326',1,'datetime.php']]],
+ ['file_5ftag_5fdecode',['file_tag_decode',['../taxonomy_8php.html#a08df5164926d2b31b8e9fcfe919de2b6',1,'taxonomy.php']]],
+ ['file_5ftag_5fencode',['file_tag_encode',['../taxonomy_8php.html#a3299482ac20e9d79453048dd52881d37',1,'taxonomy.php']]],
+ ['file_5ftag_5ffile_5fquery',['file_tag_file_query',['../taxonomy_8php.html#a163b5131f388080b0fc82398d3a32fe1',1,'taxonomy.php']]],
+ ['fileas_5fwidget',['fileas_widget',['../contact__widgets_8php.html#a1eda66319d170f60a8d07c7ece95533b',1,'contact_widgets.php']]],
+ ['filer_5fcontent',['filer_content',['../filer_8php.html#a5fd5d7e61b2f9c43cb5f110c89dc4274',1,'filer.php']]],
+ ['filerm_5fcontent',['filerm_content',['../filerm_8php.html#ae2eb28d2054fa2c37e38689882172208',1,'filerm.php']]],
+ ['filestorage_5fcontent',['filestorage_content',['../filestorage_8php.html#a61bb1be78472555df4ce619f51014040',1,'filestorage.php']]],
+ ['filestorage_5fpost',['filestorage_post',['../filestorage_8php.html#ad3b64e3ece9831f9d3a9f00c0ae983cd',1,'filestorage.php']]],
+ ['find_5fthread_5fparent_5findex',['find_thread_parent_index',['../conversation_8php.html#ae59703b07ce2ddf627b4172ff26058b6',1,'conversation.php']]],
+ ['find_5fupstream_5fdirectory',['find_upstream_directory',['../dir__fns_8php.html#a8c15aa69da12f2d3476b9e93b82b337d',1,'dir_fns.php']]],
+ ['find_5fxchan_5fin_5farray',['find_xchan_in_array',['../text_8php.html#ace3c98538c63e09b70a363210b414112',1,'text.php']]],
+ ['findpeople_5fwidget',['findpeople_widget',['../contact__widgets_8php.html#a57e73ebcfd62bb5d8c7a7b9e663726d6',1,'contact_widgets.php']]],
+ ['first_5fpost_5fdate',['first_post_date',['../items_8php.html#a0cf98bb619f07dd18f602683a55a5f59',1,'items.php']]],
+ ['fix_5fattached_5ffile_5fpermissions',['fix_attached_file_permissions',['../item_8php.html#a3daae7944f737bd30412a0d042207c0f',1,'item.php']]],
+ ['fix_5fattached_5fphoto_5fpermissions',['fix_attached_photo_permissions',['../item_8php.html#a7b63a9d0cd02096e17dcf11f4afa7c10',1,'item.php']]],
+ ['fix_5felement',['fix_element',['../namespacefriendica-to-smarty-tpl.html#a3719dd46e286a57d315e6adae1845854',1,'friendica-to-smarty-tpl']]],
+ ['fix_5fmce_5flf',['fix_mce_lf',['../text_8php.html#afdc69fe3f6c09e35e46304dcea63ae28',1,'text.php']]],
+ ['fix_5fprivate_5fphotos',['fix_private_photos',['../items_8php.html#aba98fcbbcd7044a7e9ea34edabc14c87',1,'items.php']]],
+ ['fix_5fsystem_5furls',['fix_system_urls',['../boot_8php.html#aca5e42678e178c6b9034610d66666fd7',1,'boot.php']]],
+ ['fixacl',['fixacl',['../acl__selectors_8php.html#ad6664fb8330308e23f2645cd6624727e',1,'acl_selectors.php']]],
+ ['flip',['flip',['../classphoto__driver.html#a2b2a99021fc63ed6465d703ddddcb832',1,'photo_driver\flip()'],['../classphoto__gd.html#a44cedef376044018702d9355ddc813ce',1,'photo_gd\flip()'],['../classphoto__imagick.html#aff6bcdbab18593a3fc5a480db8509393',1,'photo_imagick\flip()']]],
+ ['follow_5fcontent',['follow_content',['../mod_2follow_8php.html#a4c540ea4e9f5c581c1a53516ac585592',1,'follow.php']]],
+ ['follow_5finit',['follow_init',['../mod_2follow_8php.html#a171f5b19f50d7738adc3b2e96ec6018a',1,'follow.php']]],
+ ['format_5fcategories',['format_categories',['../text_8php.html#a3054189cff173977f4216c9a3dd29e1b',1,'text.php']]],
+ ['format_5fcss_5fif_5fexists',['format_css_if_exists',['../plugin_8php.html#a9039e15aae27676af7777dcbee5a11d6',1,'plugin.php']]],
+ ['format_5fevent_5fbbcode',['format_event_bbcode',['../event_8php.html#abb74206cf42d694307c3d7abb7af9869',1,'event.php']]],
+ ['format_5fevent_5fdiaspora',['format_event_diaspora',['../bb2diaspora_8php.html#a29a2ad41f5826f3975fa9a49934ff863',1,'bb2diaspora.php']]],
+ ['format_5fevent_5fhtml',['format_event_html',['../event_8php.html#a2ac9f1b08de03250ecd794f705781d17',1,'event.php']]],
+ ['format_5ffiler',['format_filer',['../text_8php.html#a4e4d42b0a805148d9f9a92bcac89bf91',1,'text.php']]],
+ ['format_5fjs_5fif_5fexists',['format_js_if_exists',['../plugin_8php.html#ad9ff8ba554576383c5911a4bce068c1f',1,'plugin.php']]],
+ ['format_5flike',['format_like',['../conversation_8php.html#a3d8e30cc94f9a175054c021305d3aca3',1,'conversation.php']]],
+ ['format_5flocation',['format_location',['../conversation_8php.html#a0891aaa4492cba2b51eda12fe01957f3',1,'conversation.php']]],
+ ['format_5fnotification',['format_notification',['../include_2notify_8php.html#a0e61728e487df50c72e6434f911a57d3',1,'notify.php']]],
+ ['format_5fterm_5ffor_5fdisplay',['format_term_for_display',['../taxonomy_8php.html#adfead45e3b8a3dfb2b4a4b9281d0dbe1',1,'taxonomy.php']]],
+ ['fsuggest_5fcontent',['fsuggest_content',['../fsuggest_8php.html#aa6c49ed4b50a387f1845f36844dd7998',1,'fsuggest.php']]],
+ ['fsuggest_5fpost',['fsuggest_post',['../fsuggest_8php.html#a61ecfe10ce937ed526614f8fd3de3c7d',1,'fsuggest.php']]],
+ ['ftosmarty',['fToSmarty',['../namespacefriendica-to-smarty-tpl.html#a89388ea9b2826e8218ed480e917d8105',1,'friendica-to-smarty-tpl']]]
+];
diff --git a/doc/html/search/functions_67.html b/doc/html/search/functions_67.html
new file mode 100644
index 000000000..53d4a096f
--- /dev/null
+++ b/doc/html/search/functions_67.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_67.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/functions_67.js b/doc/html/search/functions_67.js
new file mode 100644
index 000000000..cae67bdec
--- /dev/null
+++ b/doc/html/search/functions_67.js
@@ -0,0 +1,119 @@
+var searchData=
+[
+ ['gen_5ftoken',['gen_token',['../classFKOAuthDataStore.html#aa1a268be88ad3979bb4cc35bbb4dc819',1,'FKOAuthDataStore']]],
+ ['gender_5fselector',['gender_selector',['../profile__selectors_8php.html#ae2b2c087e6530c61c0b256fd26d52355',1,'profile_selectors.php']]],
+ ['generate_5fuser_5fguid',['generate_user_guid',['../text_8php.html#ae4f6881d7e13623f8eded6277595112a',1,'text.php']]],
+ ['generatedirectoryindex',['generateDirectoryIndex',['../classRedBrowser.html#a1f7daf50bb9bfcde7345b3b1908dbd7e',1,'RedBrowser']]],
+ ['get',['get',['../classCache.html#a70392b109331897bf9fdd7f1960e21de',1,'Cache\get()'],['../classRedFile.html#a7c868dfcef6c70cd0e24cf3caa2c3535',1,'RedFile\get()']]],
+ ['get_5faccount',['get_account',['../classApp.html#a08bc87aff64f39fbc084e9d6545cee4d',1,'App']]],
+ ['get_5faccount_5fid',['get_account_id',['../boot_8php.html#afe88b920aa285982edb817a0dd44eb37',1,'boot.php']]],
+ ['get_5fall_5fperms',['get_all_perms',['../permissions_8php.html#aeca9b280f3dc3358c89976d81d690008',1,'permissions.php']]],
+ ['get_5fapp',['get_app',['../classBaseObject.html#ac43f10e69ce80c78e4870636250fc8a2',1,'BaseObject\get_app()'],['../boot_8php.html#a0e6db7e365f2b041a828b93786f694bc',1,'get_app():&#160;boot.php']]],
+ ['get_5fapps',['get_apps',['../classApp.html#a5c63eabdc7fdd8b6e3348980ec16a3ad',1,'App']]],
+ ['get_5fatom_5felements',['get_atom_elements',['../items_8php.html#a896c1809d58f2d7a42cfe14577958ddf',1,'items.php']]],
+ ['get_5fbaseurl',['get_baseurl',['../classApp.html#a604d659d6977a99de42a160343e5289a',1,'App']]],
+ ['get_5fbb_5ftag_5fpos',['get_bb_tag_pos',['../bb2diaspora_8php.html#a4c2f8f11b29a06809d9b07782215b1b2',1,'bb2diaspora.php']]],
+ ['get_5fbest_5flanguage',['get_best_language',['../language_8php.html#a980dee1d8715a98ab02e36b59facf8ed',1,'language.php']]],
+ ['get_5fbirthdays',['get_birthdays',['../identity_8php.html#ad2c97627a313d53df1a1c7b4215ddb51',1,'identity.php']]],
+ ['get_5fbrowser_5flanguage',['get_browser_language',['../language_8php.html#ace67d6cad57da08d030ad9dc9b8c836e',1,'language.php']]],
+ ['get_5fcapath',['get_capath',['../include_2network_8php.html#a78e89557b2fbd344ad790846d761b0c7',1,'network.php']]],
+ ['get_5fchannel',['get_channel',['../classApp.html#a084e03c77686d8c13390fef3f7428a2b',1,'App']]],
+ ['get_5fchild',['get_child',['../classItem.html#a632185dd25c5caf277067c76230a4320',1,'Item']]],
+ ['get_5fchildren',['get_children',['../classItem.html#aa0ee775ec94abccec6c798428835d001',1,'Item']]],
+ ['get_5fcipher',['get_cipher',['../classConversation.html#a4aab60bb39fa6761b6cacdc8d9da2901',1,'Conversation']]],
+ ['get_5fcloudpath',['get_cloudpath',['../include_2attach_8php.html#a6aa00ea010ea030110faefb75eafc1ce',1,'attach.php']]],
+ ['get_5fcomment_5fbox',['get_comment_box',['../classItem.html#a3ee7667c2ec6cd7657328e27848c0bdf',1,'Item']]],
+ ['get_5fcomment_5fbox_5ftemplate',['get_comment_box_template',['../classItem.html#a904421c7a427411bb2ab473bca872f63',1,'Item']]],
+ ['get_5fconfig',['get_config',['../include_2config_8php.html#af02c96e6b37335774b548914ede1d22e',1,'config.php']]],
+ ['get_5fconfig_5ffrom_5fstorage',['get_config_from_storage',['../include_2config_8php.html#af08b7adb63adfb2eda7c466fba0cce74',1,'config.php']]],
+ ['get_5fconversation',['get_conversation',['../classItem.html#a0c301aaed2b7d682728d18db3a22afa3',1,'Item']]],
+ ['get_5fcustom_5fnav',['get_custom_nav',['../boot_8php.html#a899d24fd074594ceebbf72e1feff335f',1,'boot.php']]],
+ ['get_5fdata',['get_data',['../classItem.html#ad3638f93065693c1f69eb349feb1b7aa',1,'Item']]],
+ ['get_5fdata_5fvalue',['get_data_value',['../classItem.html#ac6f1c96cc82a0dfb7e881fc70309ea3c',1,'Item']]],
+ ['get_5fdb_5ferrno',['get_db_errno',['../setup_8php.html#a8652788e8589778c5f81634a9d5b9429',1,'setup.php']]],
+ ['get_5fdefault_5fprofile_5fphoto',['get_default_profile_photo',['../identity_8php.html#ab1485a26b032956e1496fc08c58b83ed',1,'identity.php']]],
+ ['get_5fdim',['get_dim',['../datetime_8php.html#a7df24d72ea05922d3127363e2295174c',1,'datetime.php']]],
+ ['get_5fevents',['get_events',['../identity_8php.html#ae381db3d43f8e7c1da8b15d14ecf5312',1,'identity.php']]],
+ ['get_5ffeatures',['get_features',['../features_8php.html#ae73c5b03b01c7284ed7e7e0e774e975c',1,'features.php']]],
+ ['get_5ffeed_5ffor',['get_feed_for',['../items_8php.html#a04a35b610acfe54434df08adec39c0c7',1,'items.php']]],
+ ['get_5ffirst_5fdim',['get_first_dim',['../datetime_8php.html#aba971b67f17fecf050813f1eba72367f',1,'datetime.php']]],
+ ['get_5fform_5fsecurity_5ftoken',['get_form_security_token',['../security_8php.html#acd06ef411116115c2f0a92633700db8a',1,'security.php']]],
+ ['get_5fformatsmap',['get_FormatsMap',['../classphoto__imagick.html#aef020d929f66f4370e33fc158c8eebd4',1,'photo_imagick']]],
+ ['get_5fgroups',['get_groups',['../classApp.html#a4659785d13e4bac0bed50dbb1b0d4299',1,'App']]],
+ ['get_5fhostname',['get_hostname',['../classApp.html#a622eace13f8fc9f4b5672a68e2bc4396',1,'App']]],
+ ['get_5fid',['get_id',['../classItem.html#ac0f27e58532612f6e7a54c8a621b9b92',1,'Item']]],
+ ['get_5fintltext_5ftemplate',['get_intltext_template',['../classFriendicaSmartyEngine.html#a35ec0ee828c36640ea25296bcb84a118',1,'FriendicaSmartyEngine\get_intltext_template()'],['../plugin_8php.html#acb63c27d07f6d7dffe95f98a6cef1295',1,'get_intltext_template():&#160;plugin.php']]],
+ ['get_5fitem_5fchildren',['get_item_children',['../conversation_8php.html#a7f6ef0dfa554bacf620e84c18d386e67',1,'conversation.php']]],
+ ['get_5fitem_5fcontact',['get_item_contact',['../items_8php.html#aab9c6bae4c40799867596bdaae9829fd',1,'items.php']]],
+ ['get_5fitem_5felements',['get_item_elements',['../items_8php.html#a536d0313b6ffe33b9d2490c4e25c5361',1,'items.php']]],
+ ['get_5fmail_5felements',['get_mail_elements',['../items_8php.html#a94ddb1d6c8fa21dd7433677e85168037',1,'items.php']]],
+ ['get_5fmarkup_5ftemplate',['get_markup_template',['../classFriendicaSmartyEngine.html#aab5994077fc3a64222e41b28e2bd8d88',1,'FriendicaSmartyEngine\get_markup_template()'],['../interfaceITemplateEngine.html#aaf2698adbf46c073c24b162fe1b1c442',1,'ITemplateEngine\get_markup_template()'],['../classTemplate.html#afd97b4b1e7754a550e67c0ea79159059',1,'Template\get_markup_template()'],['../plugin_8php.html#a75f7dfed291fd7add7fc85b5c022a1f4',1,'get_markup_template():&#160;plugin.php']]],
+ ['get_5fmax_5fimport_5fsize',['get_max_import_size',['../boot_8php.html#a97769915c9f14adc4f8ab1ea2cecfd90',1,'boot.php']]],
+ ['get_5fmentions',['get_mentions',['../text_8php.html#a76d1b3435c067978d7b484c45f56472b',1,'text.php']]],
+ ['get_5fmode',['get_mode',['../classConversation.html#a87a0d704d5f2b1a008cc2e9ce06a1bcd',1,'Conversation']]],
+ ['get_5fmood_5fverbs',['get_mood_verbs',['../text_8php.html#a736db13a966b8abaf8c9198faa35911a',1,'text.php']]],
+ ['get_5fmy_5faddress',['get_my_address',['../identity_8php.html#a490972c02fdb638c52ec0e012a30bfd2',1,'identity.php']]],
+ ['get_5fmy_5furl',['get_my_url',['../identity_8php.html#aa46321e1cd6a3b8dfde8bf9510112fec',1,'identity.php']]],
+ ['get_5fobserver',['get_observer',['../classApp.html#a1ad3bb1b68439b3b7cbe630918e618d2',1,'App\get_observer()'],['../classConversation.html#ae3d4190142e12b57051f11f2911f77a0',1,'Conversation\get_observer()']]],
+ ['get_5fobserver_5fhash',['get_observer_hash',['../boot_8php.html#a623e49c79943f3e7bdb770d021683cf7',1,'boot.php']]],
+ ['get_5fowner_5fname',['get_owner_name',['../classItem.html#a67892aa23d19f4431bb2e5f43c74000e',1,'Item']]],
+ ['get_5fowner_5fphoto',['get_owner_photo',['../classItem.html#aa541bc4290e51bfd688d6921bebabc73',1,'Item']]],
+ ['get_5fowner_5furl',['get_owner_url',['../classItem.html#a9f2d219da712390f59012fc32a342074',1,'Item']]],
+ ['get_5fparent',['get_parent',['../classItem.html#a4b92e3a9d6212c553aa2661489bd95d8',1,'Item']]],
+ ['get_5fpath',['get_path',['../classApp.html#a5293a8543ba338dcf38cd4ff3bc5d4be',1,'App']]],
+ ['get_5fpconfig',['get_pconfig',['../include_2config_8php.html#ad58a4913937179adb13201c2ee3261ad',1,'config.php']]],
+ ['get_5fperms',['get_perms',['../classApp.html#adb5a4bb657881e553978ff390babd01f',1,'App\get_perms()'],['../permissions_8php.html#a040fd3d3b8517658b1668ae0cd093972',1,'get_perms():&#160;permissions.php']]],
+ ['get_5fplink',['get_plink',['../text_8php.html#aac0969ae09853205992ba06ab9f9f61a',1,'text.php']]],
+ ['get_5fplugin_5finfo',['get_plugin_info',['../plugin_8php.html#aff0178bd8d0b34a94d5efddc883edd35',1,'plugin.php']]],
+ ['get_5fpoke_5fverbs',['get_poke_verbs',['../text_8php.html#aa46f941155c2ac1155f2f17ffb0adb66',1,'text.php']]],
+ ['get_5fprofile_5felements',['get_profile_elements',['../items_8php.html#a251343637ff40a50cca93452cd530c26',1,'items.php']]],
+ ['get_5fprofile_5fowner',['get_profile_owner',['../classConversation.html#a5effe8ad3007e01333df44b81432b813',1,'Conversation']]],
+ ['get_5fpublic_5ffeed',['get_public_feed',['../items_8php.html#a079e099e15d88d47aeb6ca6d60da7107',1,'items.php']]],
+ ['get_5fredirect_5furl',['get_redirect_url',['../classItem.html#a428f448f89a8629055ea3294eb942aea',1,'Item']]],
+ ['get_5frel_5flink',['get_rel_link',['../text_8php.html#a3972701c5c83624ec4e2d06242f614e7',1,'text.php']]],
+ ['get_5frpost_5fpath',['get_rpost_path',['../zot_8php.html#a8e22dbc6f884be3644a892a876cbd972',1,'zot.php']]],
+ ['get_5fsys_5fchannel',['get_sys_channel',['../identity_8php.html#aaff86ee3b5984821e7a256c2da5f1a51',1,'identity.php']]],
+ ['get_5ftags',['get_tags',['../text_8php.html#a4659fbc4e54ddc700c3aa66b9092c623',1,'text.php']]],
+ ['get_5ftemplate',['get_template',['../classItem.html#aba23a0a9d89e316d2b343cc46d695d91',1,'Item']]],
+ ['get_5ftemplate_5fdata',['get_template_data',['../classConversation.html#a2a96b7a6573ae53db861624659e831cb',1,'Conversation\get_template_data()'],['../classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8',1,'Item\get_template_data()']]],
+ ['get_5ftemplate_5fengine',['get_template_engine',['../classApp.html#acb27e607fe4c82603444676e25c36b70',1,'App']]],
+ ['get_5ftemplate_5fldelim',['get_template_ldelim',['../classApp.html#a2eb832a8577dee7d40b93abdf6d1d35a',1,'App']]],
+ ['get_5ftemplate_5frdelim',['get_template_rdelim',['../classApp.html#aab23c59172310fd30f2d60dc039d3eea',1,'App']]],
+ ['get_5fterms_5foftype',['get_terms_oftype',['../taxonomy_8php.html#a0fb8cf0ac7bcbc8b27d856fe9bf69cd1',1,'taxonomy.php']]],
+ ['get_5ftheme_5fconfig_5ffile',['get_theme_config_file',['../settings_8php.html#a39abc76ff5459c57e3b957664f273f18',1,'settings.php']]],
+ ['get_5ftheme_5finfo',['get_theme_info',['../plugin_8php.html#ad48de9c0fb7f19413a2aa49250d00405',1,'plugin.php']]],
+ ['get_5ftheme_5fscreenshot',['get_theme_screenshot',['../plugin_8php.html#a48047edfbef770125a5508dcc2f9282f',1,'plugin.php']]],
+ ['get_5ftheme_5fuid',['get_theme_uid',['../identity_8php.html#aaeb666872995e3ab8da8f7bc5f3b2bd3',1,'identity.php']]],
+ ['get_5fthings',['get_things',['../taxonomy_8php.html#a7747fa859ac56fbffd4f9782d85505de',1,'taxonomy.php']]],
+ ['get_5fthread',['get_thread',['../classConversation.html#a4cff75d8c46b517e7133e4d0da6fc1c8',1,'Conversation']]],
+ ['get_5fwidgets',['get_widgets',['../classApp.html#a871898becd0697d778f36d9336253ae8',1,'App']]],
+ ['get_5fxconfig',['get_xconfig',['../include_2config_8php.html#aa3dc1d3de2d091ac702e675acd3a085e',1,'config.php']]],
+ ['getchild',['getChild',['../classRedDirectory.html#aaa20f0f44da23781917af8170c0a2569',1,'RedDirectory']]],
+ ['getchildren',['getChildren',['../classRedDirectory.html#aa42d3065f6f065b17db87146a7cb031a',1,'RedDirectory']]],
+ ['getcontenttype',['getContentType',['../classRedFile.html#a26416827eb68554d033d1e2e5cc6dd3b',1,'RedFile']]],
+ ['getdir',['getDir',['../classRedDirectory.html#a70173d4458572d95e586b2037d2fd2f4',1,'RedDirectory']]],
+ ['getetag',['getETag',['../classRedFile.html#ae96d5caa2db7a461c57b24380fa87e28',1,'RedFile']]],
+ ['getext',['getExt',['../classphoto__driver.html#aa2efb5b2a6af3fd67e3f1c2b9852a5ba',1,'photo_driver']]],
+ ['getheight',['getHeight',['../classphoto__driver.html#af769e9abb144e57002c59aa2aa8f3468',1,'photo_driver']]],
+ ['getimage',['getImage',['../classphoto__driver.html#ab98da263bd7341fc132c4fb6fc76e8d5',1,'photo_driver\getImage()'],['../classphoto__gd.html#a86757ba021fd80d1a5cf8c2f766a8484',1,'photo_gd\getImage()'],['../classphoto__imagick.html#ad07288e0eb3922cb08cc9d33a163decc',1,'photo_imagick\getImage()']]],
+ ['getlastmodified',['getLastModified',['../classRedFile.html#a41562a28007789bbe7fe06d6a20eef47',1,'RedFile']]],
+ ['getname',['getName',['../classRedDirectory.html#af6e4475dbd5abcdede00d20b8d388583',1,'RedDirectory\getName()'],['../classRedFile.html#a0c961c5f49544d2502420361fa526437',1,'RedFile\getName()']]],
+ ['getsize',['getSize',['../classRedFile.html#acb1edbe1848fab05347746fa1ea09d8f',1,'RedFile']]],
+ ['gettype',['getType',['../classphoto__driver.html#a6c6c16dbc4f517ce799f9143ed61f0e3',1,'photo_driver']]],
+ ['getwidth',['getWidth',['../classphoto__driver.html#acc30486acee9e89e32701f44a1738117',1,'photo_driver']]],
+ ['goaway',['goaway',['../boot_8php.html#a5ab6181607a090bcdbaa13b15b85aba1',1,'boot.php']]],
+ ['gprobe_5frun',['gprobe_run',['../gprobe_8php.html#adf72cb0a70b5b9d99fdec1cc60e18ed1',1,'gprobe.php']]],
+ ['group_5fadd',['group_add',['../include_2group_8php.html#a06ec565d2b64e79044e7c1bf91a2a4ce',1,'group.php']]],
+ ['group_5fadd_5fmember',['group_add_member',['../include_2group_8php.html#a0122ef312df2c5546b1a46b3e6c7b31b',1,'group.php']]],
+ ['group_5fbyname',['group_byname',['../include_2group_8php.html#abd66a5ea34a07a3422dc2dde6c7b3ecb',1,'group.php']]],
+ ['group_5fcontent',['group_content',['../mod_2group_8php.html#a07a64f6c65b0080d8190b3d9728a7a83',1,'group.php']]],
+ ['group_5fget_5fmembers',['group_get_members',['../include_2group_8php.html#a5bd191d9692e6c34d48c0ede10810f09',1,'group.php']]],
+ ['group_5fpost',['group_post',['../mod_2group_8php.html#aed1f009b1221348021bb34761160ef35',1,'group.php']]],
+ ['group_5frec_5fbyhash',['group_rec_byhash',['../include_2group_8php.html#a90e157b3e1b99c981809cb5a2abd3245',1,'group.php']]],
+ ['group_5frmv',['group_rmv',['../include_2group_8php.html#a4118f498bbd1530c1d0136d016d197a5',1,'group.php']]],
+ ['group_5frmv_5fmember',['group_rmv_member',['../include_2group_8php.html#a540e3ef36f47d47532646be4241f6518',1,'group.php']]],
+ ['group_5fselect',['group_select',['../acl__selectors_8php.html#aa1e3bc344ca2b29f97eb9860216d21a0',1,'acl_selectors.php']]],
+ ['group_5fside',['group_side',['../include_2group_8php.html#a6a69bd7be032fa8ce4e49c43a42cc6e9',1,'group.php']]],
+ ['groups_5fcontaining',['groups_containing',['../include_2group_8php.html#afb802ae2ce73aae4bc36d157f7b6a92f',1,'group.php']]],
+ ['guess_5fimage_5ftype',['guess_image_type',['../photo__driver_8php.html#a243cee492ce443afb6a7d77d54b6c4aa',1,'photo_driver.php']]]
+];
diff --git a/doc/html/search/functions_68.html b/doc/html/search/functions_68.html
new file mode 100644
index 000000000..77d37fe1a
--- /dev/null
+++ b/doc/html/search/functions_68.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_68.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/functions_68.js b/doc/html/search/functions_68.js
new file mode 100644
index 000000000..29fd49882
--- /dev/null
+++ b/doc/html/search/functions_68.js
@@ -0,0 +1,23 @@
+var searchData=
+[
+ ['handle_5ftag',['handle_tag',['../item_8php.html#aa22feef4de326e1d7078dedd892e615c',1,'item.php']]],
+ ['has_5fpermissions',['has_permissions',['../items_8php.html#a77051724d1784074ff187e73a4db93fe',1,'items.php']]],
+ ['head_5fadd_5fcss',['head_add_css',['../plugin_8php.html#a23c4fccf1eb5fcd63b24783ba1f05f7a',1,'plugin.php']]],
+ ['head_5fadd_5fjs',['head_add_js',['../plugin_8php.html#a516591850f4fd49fd1425cfa54089db8',1,'plugin.php']]],
+ ['head_5fget_5fcss',['head_get_css',['../plugin_8php.html#af92789f559b89a380e49d303218aeeca',1,'plugin.php']]],
+ ['head_5fget_5ficon',['head_get_icon',['../classApp.html#af17df107f2216ddf5ad2a7e0f2ba2166',1,'App\head_get_icon()'],['../boot_8php.html#a24a7a70afedd5d85fe0eadc85afa9f77',1,'head_get_icon():&#160;boot.php']]],
+ ['head_5fget_5fjs',['head_get_js',['../plugin_8php.html#a65ab52cb1a7030d5190e247211bef2a1',1,'plugin.php']]],
+ ['head_5fremove_5fcss',['head_remove_css',['../plugin_8php.html#a9ab6caae31935f6cf781ce7872db7cdf',1,'plugin.php']]],
+ ['head_5fremove_5fjs',['head_remove_js',['../plugin_8php.html#a4a0ae7b881e7c8af99a69e3b03f898b4',1,'plugin.php']]],
+ ['head_5fset_5ficon',['head_set_icon',['../classApp.html#a8863703a0305eaa45eb970dbd2046291',1,'App\head_set_icon()'],['../boot_8php.html#a0e4701c9742c3ef88f02ac450a042a84',1,'head_set_icon():&#160;boot.php']]],
+ ['help',['help',['../namespacefriendica-to-smarty-tpl.html#af6b2c793958aae2aadc294577431f749',1,'friendica-to-smarty-tpl.help()'],['../namespaceupdatetpl.html#ac9d11279fed403a329a719298feafc4f',1,'updatetpl.help()']]],
+ ['help_5fcontent',['help_content',['../help_8php.html#af055e15f600ffa6fbca9386fdf715224',1,'help.php']]],
+ ['home_5fcontent',['home_content',['../home_8php.html#aa1cf697851a646755baf537f75334c46',1,'home.php']]],
+ ['home_5finit',['home_init',['../home_8php.html#ac4642c38b6f23a8d065dd4a75c620bde',1,'home.php']]],
+ ['hostxrd_5finit',['hostxrd_init',['../hostxrd_8php.html#aa37ffc8e7900bc76c4828bd25916db92',1,'hostxrd.php']]],
+ ['html2bb_5fvideo',['html2bb_video',['../text_8php.html#a138a3a611fa7f4f3630674145fc826bf',1,'text.php']]],
+ ['html2bbcode',['html2bbcode',['../html2bbcode_8php.html#a5ad726995ac4070213abdb3bd09f4837',1,'html2bbcode.php']]],
+ ['html2plain',['html2plain',['../html2plain_8php.html#ab3e121fa9f3feb16f9f942e705bc6c04',1,'html2plain.php']]],
+ ['htmlactionspanel',['htmlActionsPanel',['../classRedBrowser.html#a7f6bf0bda07833f4c647557bd172e349',1,'RedBrowser']]],
+ ['http_5fstatus_5fexit',['http_status_exit',['../include_2network_8php.html#a4cfb2c05a1c295317283d762440ce0b2',1,'network.php']]]
+];
diff --git a/doc/html/search/functions_69.html b/doc/html/search/functions_69.html
new file mode 100644
index 000000000..9edd1a1c1
--- /dev/null
+++ b/doc/html/search/functions_69.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_69.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/functions_69.js b/doc/html/search/functions_69.js
new file mode 100644
index 000000000..e50061ae5
--- /dev/null
+++ b/doc/html/search/functions_69.js
@@ -0,0 +1,52 @@
+var searchData=
+[
+ ['identity_5fbasic_5fexport',['identity_basic_export',['../identity_8php.html#a3570a4eb77332b292d394c4132cb8f03',1,'identity.php']]],
+ ['identity_5fcheck_5fservice_5fclass',['identity_check_service_class',['../identity_8php.html#ac9fcd5c4c371998790b5c55c3d0f4633',1,'identity.php']]],
+ ['ids_5fto_5fquerystr',['ids_to_querystr',['../text_8php.html#a436a8de00c942364c2d0fcfc7e1f4b5a',1,'text.php']]],
+ ['imagestring',['imageString',['../classphoto__driver.html#abc9f73ad90923772d52b9fcc4eb117dd',1,'photo_driver\imageString()'],['../classphoto__gd.html#a0795fc029be382557ae3f6e285f40e00',1,'photo_gd\imageString()'],['../classphoto__imagick.html#a70adbef31128c0ac8cbc5dcf34cdb019',1,'photo_imagick\imageString()']]],
+ ['import_5fauthor_5fxchan',['import_author_xchan',['../items_8php.html#ae73794179b62d39bb597ff670ab1c1e5',1,'items.php']]],
+ ['import_5fauthor_5fzot',['import_author_zot',['../zot_8php.html#ad149f1e98c0c5b88ff9147e6ee3f330d',1,'zot.php']]],
+ ['import_5fchannel_5fphoto',['import_channel_photo',['../photo__driver_8php.html#a1d0bc7161dec0d177b7d3bbe4421af9a',1,'photo_driver.php']]],
+ ['import_5fcontent',['import_content',['../import_8php.html#afdf25ed70096d5dbf4f6d0ca79fea184',1,'import.php']]],
+ ['import_5fdirectory_5fkeywords',['import_directory_keywords',['../zot_8php.html#a3bf11286c2619b4ca28e49d5b5ab374a',1,'zot.php']]],
+ ['import_5fdirectory_5fprofile',['import_directory_profile',['../zot_8php.html#aeec89da5b6ff090c63a79de4de884a35',1,'zot.php']]],
+ ['import_5fpost',['import_post',['../import_8php.html#af17fef0410518f7eac205d0ea416eaa2',1,'import.php']]],
+ ['import_5fprofile_5fphoto',['import_profile_photo',['../photo__driver_8php.html#a78f5a10c568d2a9bbbb129dc96548887',1,'photo_driver.php']]],
+ ['import_5fsite',['import_site',['../zot_8php.html#a2657e141d62d5f67ad3c87651b585299',1,'zot.php']]],
+ ['import_5fxchan',['import_xchan',['../zot_8php.html#a56f3f65514e4e7f0cd117d01735aebd1',1,'zot.php']]],
+ ['in_5farrayi',['in_arrayi',['../text_8php.html#a75c326298519ed14ebe762194c8a3f2a',1,'text.php']]],
+ ['info',['info',['../boot_8php.html#adfb2fc7be5a4226c0a8e24131da9d498',1,'boot.php']]],
+ ['insert_5fhook',['insert_hook',['../plugin_8php.html#aeaebe63dcf6fa2794f363ba2bc0b2c6b',1,'plugin.php']]],
+ ['install',['install',['../classdba__driver.html#a4ccb27243e62a8ca30dd8e1b8cc67746',1,'dba_driver']]],
+ ['install_5fplugin',['install_plugin',['../plugin_8php.html#a482131013272a1d5d5c1b1469c6c55d5',1,'plugin.php']]],
+ ['invite_5fcontent',['invite_content',['../invite_8php.html#a244385b28cfd021d308715f01158bfd9',1,'invite.php']]],
+ ['invite_5fpost',['invite_post',['../invite_8php.html#aeb0881c0f93c8e8552e5ed756ce6e5a5',1,'invite.php']]],
+ ['is_5fa_5fdate_5farg',['is_a_date_arg',['../text_8php.html#a1557112a774ec00fa06ed6b6f6495506',1,'text.php']]],
+ ['is_5fajax',['is_ajax',['../boot_8php.html#ac17fc8a416ea79e9d5cb4dc9a8ff8c5c',1,'boot.php']]],
+ ['is_5fcommentable',['is_commentable',['../classConversation.html#a8b47c92b69459d461ea3cc9aae9597a3',1,'Conversation\is_commentable()'],['../classItem.html#ac04525a8be24c12b0a2ae4ca1ba4b967',1,'Item\is_commentable()']]],
+ ['is_5fforeigner',['is_foreigner',['../identity_8php.html#ae2b140df652a55ca11bb6a99005fce35',1,'identity.php']]],
+ ['is_5fmember',['is_member',['../identity_8php.html#a9637c557e13d9671f3eeb124ab98212a',1,'identity.php']]],
+ ['is_5fpreview',['is_preview',['../classConversation.html#adf25ce023b69a166c63c6e84e02c136a',1,'Conversation']]],
+ ['is_5fsite_5fadmin',['is_site_admin',['../boot_8php.html#aa1e828bbbcba170265eb2668d8daf42e',1,'boot.php']]],
+ ['is_5fthreaded',['is_threaded',['../classItem.html#a5b2fafdca55aefeaa08993a5a60529f0',1,'Item']]],
+ ['is_5ftoplevel',['is_toplevel',['../classItem.html#aa49e40f961dff66da32c5ae110e32993',1,'Item']]],
+ ['is_5fvalid',['is_valid',['../classphoto__driver.html#a97289aef3be43d9435ca3717ef10b8ab',1,'photo_driver']]],
+ ['is_5fvisiting',['is_visiting',['../classItem.html#a97c7feeea7f26a73176cb19faa455e12',1,'Item']]],
+ ['is_5fwall_5fto_5fwall',['is_wall_to_wall',['../classItem.html#aabf87ded59c25b5fe2b2296678e70509',1,'Item']]],
+ ['is_5fwritable',['is_writable',['../classConversation.html#a5879199008b96bee7550b576d614e1c1',1,'Conversation']]],
+ ['item_5fcheck_5fservice_5fclass',['item_check_service_class',['../item_8php.html#a5b1b36cb301a94b38150074f0d424e74',1,'item.php']]],
+ ['item_5fcontent',['item_content',['../item_8php.html#a764bbb2e9a885a86fb23d0b5e4a09221',1,'item.php']]],
+ ['item_5fexpire',['item_expire',['../items_8php.html#a6f7e1334af5d684a987fa6a3eb37f4cc',1,'items.php']]],
+ ['item_5fextract_5fimages',['item_extract_images',['../conversation_8php.html#a0ee05f15255fb1cc3d89f30bc378a654',1,'conversation.php']]],
+ ['item_5fgetfeedattach',['item_getfeedattach',['../items_8php.html#a09d425596b9f8663472cf7474ad36d96',1,'items.php']]],
+ ['item_5fgetfeedtags',['item_getfeedtags',['../items_8php.html#a649dc3e53ed794d0ead4b5d037f8d8d7',1,'items.php']]],
+ ['item_5fmessage_5fid',['item_message_id',['../text_8php.html#aa6b0aa8afbeab50d1a3058ad21acb74e',1,'text.php']]],
+ ['item_5fpermissions_5fsql',['item_permissions_sql',['../security_8php.html#a9355488460ab11d6058656ff919e5cf9',1,'security.php']]],
+ ['item_5fphoto_5fmenu',['item_photo_menu',['../conversation_8php.html#aacbb12d372d5e9c3ab0735b4aea48fb3',1,'conversation.php']]],
+ ['item_5fpost',['item_post',['../item_8php.html#a693cd09805755ab85bbb5ecae69a48c3',1,'item.php']]],
+ ['item_5fpost_5ftype',['item_post_type',['../text_8php.html#ac1dbf2e37e8069bea2c0f557fdbf203e',1,'text.php']]],
+ ['item_5fredir_5fand_5freplace_5fimages',['item_redir_and_replace_images',['../conversation_8php.html#adda79b75bf1ccf6ce9503aa310953533',1,'conversation.php']]],
+ ['item_5fstore',['item_store',['../items_8php.html#a2541e6861a56d145c9281877cc501615',1,'items.php']]],
+ ['item_5fstore_5fupdate',['item_store_update',['../items_8php.html#acf0bf7c9d21ac84f32effb754f7ad484',1,'items.php']]],
+ ['items_5ffetch',['items_fetch',['../items_8php.html#a756738301f2ed96be50232500677d58a',1,'items.php']]]
+];
diff --git a/doc/html/search/functions_6a.html b/doc/html/search/functions_6a.html
new file mode 100644
index 000000000..948495f1b
--- /dev/null
+++ b/doc/html/search/functions_6a.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_6a.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/functions_6a.js b/doc/html/search/functions_6a.js
new file mode 100644
index 000000000..d6a51a5d9
--- /dev/null
+++ b/doc/html/search/functions_6a.js
@@ -0,0 +1,6 @@
+var searchData=
+[
+ ['jindent',['jindent',['../text_8php.html#ae17b39d5e321debd3ad16dcbbde842b8',1,'text.php']]],
+ ['json_5fdecode_5fplus',['json_decode_plus',['../text_8php.html#a0271381208acfa2d4cff36da281e3e23',1,'text.php']]],
+ ['json_5freturn_5fand_5fdie',['json_return_and_die',['../include_2network_8php.html#a4c5d50079e089168d9248427018fffd4',1,'network.php']]]
+];
diff --git a/doc/html/search/functions_6b.html b/doc/html/search/functions_6b.html
new file mode 100644
index 000000000..a0d07a92d
--- /dev/null
+++ b/doc/html/search/functions_6b.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_6b.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/functions_6b.js b/doc/html/search/functions_6b.js
new file mode 100644
index 000000000..d29bcec09
--- /dev/null
+++ b/doc/html/search/functions_6b.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['killme',['killme',['../boot_8php.html#aea7fc57a4d8e9dcb42f2601b0b9b761c',1,'boot.php']]]
+];
diff --git a/doc/html/search/functions_6c.html b/doc/html/search/functions_6c.html
new file mode 100644
index 000000000..33c0d6dd1
--- /dev/null
+++ b/doc/html/search/functions_6c.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_6c.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/functions_6c.js b/doc/html/search/functions_6c.js
new file mode 100644
index 000000000..0353cfc34
--- /dev/null
+++ b/doc/html/search/functions_6c.js
@@ -0,0 +1,35 @@
+var searchData=
+[
+ ['lang_5fselector',['lang_selector',['../text_8php.html#a71f6952243d3fe1c5a8154f78027e29c',1,'text.php']]],
+ ['layout_5fselect',['layout_select',['../text_8php.html#a3999a0b3e22e440f280ee791ce34d384',1,'text.php']]],
+ ['layouts_5fcontent',['layouts_content',['../layouts_8php.html#a6e0193759ad9eef76d3df2db24237b50',1,'layouts.php']]],
+ ['legal_5fwebbie',['legal_webbie',['../text_8php.html#a2690ad67bb6fb97ef69de3e8d23f2728',1,'text.php']]],
+ ['like_5fcontent',['like_content',['../like_8php.html#a9d7dd268f21c21e9d29dd2aca2dd9538',1,'like.php']]],
+ ['like_5fpuller',['like_puller',['../conversation_8php.html#afe5b2f38d8b803edb0d7ec5fa2868db0',1,'conversation.php']]],
+ ['limit_5fbody_5fsize',['limit_body_size',['../items_8php.html#af94c281016c6c912d06e064113336c5c',1,'items.php']]],
+ ['link_5fcompare',['link_compare',['../text_8php.html#a47c1e4a5f3f53027daacd8a9db24f285',1,'text.php']]],
+ ['linkify',['linkify',['../text_8php.html#a11255c8c4e5245b6c24f97684826aa54',1,'text.php']]],
+ ['list_5fpublic_5fsites',['list_public_sites',['../dirsearch_8php.html#a985d410a170549429857af6ff2673149',1,'dirsearch.php']]],
+ ['load',['load',['../classphoto__driver.html#a19e1af2b6af4c63aa6230abe69f83712',1,'photo_driver\load()'],['../classphoto__gd.html#a33092b889875b68bfb1c97ff123012d9',1,'photo_gd\load()'],['../classphoto__imagick.html#a2c9168f110ccd6c264095d766615dfa8',1,'photo_imagick\load()']]],
+ ['load_5fconfig',['load_config',['../include_2config_8php.html#a27559f388c9b9af81c94e48d6889d1d1',1,'config.php']]],
+ ['load_5fcontact_5flinks',['load_contact_links',['../boot_8php.html#a719c7f3972d5f9268f37a41c76cd4ef6',1,'boot.php']]],
+ ['load_5fdatabase',['load_database',['../setup_8php.html#ad2e0375a9ab87ebe6e78124ee125054a',1,'setup.php']]],
+ ['load_5fdatabase_5frem',['load_database_rem',['../setup_8php.html#a2b375ddc555140236fc500135de99371',1,'setup.php']]],
+ ['load_5fhooks',['load_hooks',['../plugin_8php.html#a326365e48ef94f0b9a0a771b8d75e813',1,'plugin.php']]],
+ ['load_5fpconfig',['load_pconfig',['../include_2config_8php.html#ac543813a980b3841cc5a277fcd4a24a6',1,'config.php']]],
+ ['load_5fplugin',['load_plugin',['../plugin_8php.html#a9ca9632b7309a65b05c03a3e2f473a3d',1,'plugin.php']]],
+ ['load_5ftranslation_5ftable',['load_translation_table',['../language_8php.html#a7e9904c730bb24ddcb0ff50fc96f6b05',1,'language.php']]],
+ ['load_5fxconfig',['load_xconfig',['../include_2config_8php.html#a55bbed9a014c9109c767486834f3ca33',1,'config.php']]],
+ ['local_5fuser',['local_user',['../boot_8php.html#ad4c9dc2c8a82e8f52b7404c1655eab44',1,'boot.php']]],
+ ['localize_5fitem',['localize_item',['../conversation_8php.html#a9bd7f9fb6678736c581bcba3b17f471c',1,'conversation.php']]],
+ ['lockview_5fcontent',['lockview_content',['../lockview_8php.html#a851e26ab9a1008df5c5ebebea31e9b44',1,'lockview.php']]],
+ ['logger',['logger',['../text_8php.html#a030fa5ecc64168af0c4f44897a9bce63',1,'text.php']]],
+ ['login',['login',['../boot_8php.html#aefecf8599036df7f1b95d6820e0e2fa4',1,'boot.php']]],
+ ['login_5fcontent',['login_content',['../login_8php.html#a1d69ca88eb9005a7026e128b9a645904',1,'login.php']]],
+ ['loginuser',['loginUser',['../classFKOAuth1.html#a2b1dac2ed31fc6ef84668afdda8b263f',1,'FKOAuth1']]],
+ ['lookup_5fconsumer',['lookup_consumer',['../classFKOAuthDataStore.html#a1148d47b546350bf440bdd92792c5df1',1,'FKOAuthDataStore']]],
+ ['lookup_5fnonce',['lookup_nonce',['../classFKOAuthDataStore.html#a4edfe2e77ecd2e16ff6b5eb516ed3599',1,'FKOAuthDataStore']]],
+ ['lookup_5ftoken',['lookup_token',['../classFKOAuthDataStore.html#a96f76387c3a93b0abe27a98013804bab',1,'FKOAuthDataStore']]],
+ ['lostpass_5fcontent',['lostpass_content',['../lostpass_8php.html#a0314d94e48c789b1b3a201d740c9eab3',1,'lostpass.php']]],
+ ['lostpass_5fpost',['lostpass_post',['../lostpass_8php.html#a8ed35ba71a4404eaf4903da61d0321cc',1,'lostpass.php']]]
+];
diff --git a/doc/html/search/functions_6d.html b/doc/html/search/functions_6d.html
new file mode 100644
index 000000000..73fecffde
--- /dev/null
+++ b/doc/html/search/functions_6d.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_6d.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/functions_6d.js b/doc/html/search/functions_6d.js
new file mode 100644
index 000000000..4ceedb978
--- /dev/null
+++ b/doc/html/search/functions_6d.js
@@ -0,0 +1,38 @@
+var searchData=
+[
+ ['magic_5finit',['magic_init',['../magic_8php.html#acea2cc792849ca2d71d4b689f66518bf',1,'magic.php']]],
+ ['magic_5flink',['magic_link',['../text_8php.html#a1e510c53624933ce9b7d6715784894db',1,'text.php']]],
+ ['magiclink_5furl',['magiclink_url',['../text_8php.html#a24d441d30df4b8e6bf6780bf62a5e2c6',1,'text.php']]],
+ ['mail_5fcontent',['mail_content',['../mail_8php.html#a3c7c485fc69f92371e8b20936040eca1',1,'mail.php']]],
+ ['mail_5fpost',['mail_post',['../mail_8php.html#acfc2cc0bf4e0b178207758384977f25a',1,'mail.php']]],
+ ['mail_5fstore',['mail_store',['../items_8php.html#a77da7ce9a117601d49ac4a67c71b514f',1,'items.php']]],
+ ['manage_5fcontent',['manage_content',['../manage_8php.html#a2bca247b5296827638959138367db4f5',1,'manage.php']]],
+ ['manual_5fconfig',['manual_config',['../setup_8php.html#abe405d227ba7232971964a706d4f3bce',1,'setup.php']]],
+ ['map_5fscope',['map_scope',['../items_8php.html#ac1fcf621dce7370515b420a7753f4726',1,'items.php']]],
+ ['marital_5fselector',['marital_selector',['../profile__selectors_8php.html#a7473dd095987e1cdcc79d4f0bb5e6798',1,'profile_selectors.php']]],
+ ['match_5fcontent',['match_content',['../match_8php.html#a1dd853e959b9e70c1911bb2fb5f5130d',1,'match.php']]],
+ ['member_5fof',['member_of',['../include_2group_8php.html#a048f6892bfd28852de1b76470df411de',1,'group.php']]],
+ ['menu_5fadd_5fitem',['menu_add_item',['../include_2menu_8php.html#add35fae5e9695031b3d46e30ac409eb8',1,'menu.php']]],
+ ['menu_5fcontent',['menu_content',['../mod_2menu_8php.html#a6fed23af14d71a78a4153c8363a685cf',1,'menu.php']]],
+ ['menu_5fcreate',['menu_create',['../include_2menu_8php.html#a08a800821721781a8dfffbe31481ff98',1,'menu.php']]],
+ ['menu_5fdel_5fitem',['menu_del_item',['../include_2menu_8php.html#a9aa8e0052dd47c1a93f53a983bd4620a',1,'menu.php']]],
+ ['menu_5fdelete',['menu_delete',['../include_2menu_8php.html#a3884bda4d85d84ec99447db9403a68d8',1,'menu.php']]],
+ ['menu_5fdelete_5fid',['menu_delete_id',['../include_2menu_8php.html#ad87f51ce85172bcc3f931aa0cd96a804',1,'menu.php']]],
+ ['menu_5fedit',['menu_edit',['../include_2menu_8php.html#a6a33c6a3db2a7510b16cc656edaec571',1,'menu.php']]],
+ ['menu_5fedit_5fitem',['menu_edit_item',['../include_2menu_8php.html#acb66f80ca895a6ccd562b3d9ae7b41aa',1,'menu.php']]],
+ ['menu_5ffetch',['menu_fetch',['../include_2menu_8php.html#a68ebbf492470c930f652013656f9071d',1,'menu.php']]],
+ ['menu_5ffetch_5fid',['menu_fetch_id',['../include_2menu_8php.html#a47447c01ba8ea04cd74af1d4c5b68fc7',1,'menu.php']]],
+ ['menu_5flist',['menu_list',['../include_2menu_8php.html#acef15a498d52666b1c7e5c12765c689b',1,'menu.php']]],
+ ['menu_5fpost',['menu_post',['../mod_2menu_8php.html#aaa491ef173868fe002aece4632bcf393',1,'menu.php']]],
+ ['menu_5frender',['menu_render',['../include_2menu_8php.html#a890cc6237971e15f15702e6b2e88502e',1,'menu.php']]],
+ ['message_5fcontent',['message_content',['../mod_2message_8php.html#ac72dfed3ce08fcb331d66b37edc6e15f',1,'message.php']]],
+ ['micropro',['micropro',['../text_8php.html#a2a902f5fdba8646333e997898ac45ea3',1,'text.php']]],
+ ['mimetype_5fselect',['mimetype_select',['../text_8php.html#a1633412120f52bdce5f43e0a127d9293',1,'text.php']]],
+ ['mini_5fgroup_5fselect',['mini_group_select',['../include_2group_8php.html#ab0e422a0f31c0c64fd9084ca03d85f32',1,'group.php']]],
+ ['mitem_5fcontent',['mitem_content',['../mitem_8php.html#a7a31b702ecad18eeb6a38b243ff0037e',1,'mitem.php']]],
+ ['mitem_5finit',['mitem_init',['../mitem_8php.html#a9627cd857cafdf04e4fc0ae48c8e8518',1,'mitem.php']]],
+ ['mitem_5fpost',['mitem_post',['../mitem_8php.html#a6ee694cca4b551a20d7c7a94b5243ec1',1,'mitem.php']]],
+ ['mood_5fcontent',['mood_content',['../mood_8php.html#a721b9b6703b3234a005641c92d409b8f',1,'mood.php']]],
+ ['mood_5finit',['mood_init',['../mood_8php.html#a7ae136dd7476865b4828136175db5022',1,'mood.php']]],
+ ['msearch_5fpost',['msearch_post',['../msearch_8php.html#ac80d2a6c0a92e79eec7efbbccd74d9a8',1,'msearch.php']]]
+];
diff --git a/doc/html/search/functions_6e.html b/doc/html/search/functions_6e.html
new file mode 100644
index 000000000..5e54741d4
--- /dev/null
+++ b/doc/html/search/functions_6e.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_6e.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/functions_6e.js b/doc/html/search/functions_6e.js
new file mode 100644
index 000000000..c51d3673c
--- /dev/null
+++ b/doc/html/search/functions_6e.js
@@ -0,0 +1,33 @@
+var searchData=
+[
+ ['nameslist',['namesList',['../docblox__errorchecker_8php.html#a2b767cfc461fdd5061fffc9e4a806d5b',1,'docblox_errorchecker.php']]],
+ ['nav',['nav',['../nav_8php.html#a43be0df73b90647ea70947ce004e231e',1,'nav.php']]],
+ ['nav_5fset_5fselected',['nav_set_selected',['../nav_8php.html#ac3c920ce3ea5b0d9e0678ee37155f06a',1,'nav.php']]],
+ ['navbar_5fcomplete',['navbar_complete',['../acl_8php.html#a57dceff370d4a0e7ae673d50fbfda61f',1,'acl.php']]],
+ ['network_5fcontent',['network_content',['../mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4',1,'network.php']]],
+ ['network_5finit',['network_init',['../mod_2network_8php.html#a180fce90ad11d7e0e45be094da7149ec',1,'network.php']]],
+ ['network_5ftabs',['network_tabs',['../conversation_8php.html#a96b34b9d64d13c543e8163e52f5ce8c4',1,'conversation.php']]],
+ ['network_5fto_5fname',['network_to_name',['../contact__selectors_8php.html#ad472e4716426dd1a9dd77b62962454be',1,'contact_selectors.php']]],
+ ['new_5faccess_5ftoken',['new_access_token',['../classFKOAuthDataStore.html#a434882f03e3cdb171ed89e09e337e934',1,'FKOAuthDataStore']]],
+ ['new_5fchannel_5fcontent',['new_channel_content',['../new__channel_8php.html#ae585191610f79da129492482ce8e2fee',1,'new_channel.php']]],
+ ['new_5fchannel_5finit',['new_channel_init',['../new__channel_8php.html#a1ad7f99e4366a32942c6b954aba3a164',1,'new_channel.php']]],
+ ['new_5fchannel_5fpost',['new_channel_post',['../new__channel_8php.html#a180b0646957db8290482f02454ad7f23',1,'new_channel.php']]],
+ ['new_5fcontact',['new_contact',['../include_2follow_8php.html#ae387d4ae097c23d69f3247e7f08140c7',1,'follow.php']]],
+ ['new_5fcookie',['new_cookie',['../session_8php.html#a4c0ead624f95483e386bc80abf570a8f',1,'session.php']]],
+ ['new_5fkeypair',['new_keypair',['../crypto_8php.html#aae0ab70d6a199b29555b1ac3cf250d6a',1,'crypto.php']]],
+ ['new_5frequest_5ftoken',['new_request_token',['../classFKOAuthDataStore.html#a431b44d70e3da6a8256ab38f710e3050',1,'FKOAuthDataStore']]],
+ ['node2bbcode',['node2bbcode',['../html2bbcode_8php.html#ad174afe0ccbd8c475e48f8a6ee2f27d8',1,'html2bbcode.php']]],
+ ['node2bbcodesub',['node2bbcodesub',['../html2bbcode_8php.html#a39c662b19d318990fee2ba795a55d7a7',1,'html2bbcode.php']]],
+ ['normalise_5flink',['normalise_link',['../text_8php.html#a4bbb7d00c05cd20b4e043424f322388f',1,'text.php']]],
+ ['normalise_5fopenid',['normalise_openid',['../text_8php.html#adba17ec946f4285285dc100f7860bf51',1,'text.php']]],
+ ['notags',['notags',['../text_8php.html#a1af49756c8c71902a66c7e329c462beb',1,'text.php']]],
+ ['notes_5finit',['notes_init',['../notes_8php.html#a4dbd7b1f906440746af48b484d66535a',1,'notes.php']]],
+ ['notice',['notice',['../boot_8php.html#a9255af5ae9c887520091ea04763c1a88',1,'boot.php']]],
+ ['notification',['notification',['../enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc',1,'enotify.php']]],
+ ['notifications_5fcontent',['notifications_content',['../notifications_8php.html#aadd0b5525bd8c283a5d8a37982bbfe62',1,'notifications.php']]],
+ ['notifications_5fpost',['notifications_post',['../notifications_8php.html#a5baffec7b2e625c9f9cefbc097550d33',1,'notifications.php']]],
+ ['notifier_5frun',['notifier_run',['../notifier_8php.html#a568c502f626cff95e344c0748938b85d',1,'notifier.php']]],
+ ['notify_5fcontent',['notify_content',['../mod_2notify_8php.html#acdf3851688ebd6d6a575eb84ef9febe3',1,'notify.php']]],
+ ['notify_5finit',['notify_init',['../mod_2notify_8php.html#a94f9a6a9d4b5fd704baafff0c34f41ae',1,'notify.php']]],
+ ['nuke_5fsession',['nuke_session',['../auth_8php.html#a2add3a1129ffa4d5515442a9d52a9b1a',1,'auth.php']]]
+];
diff --git a/doc/html/search/functions_6f.html b/doc/html/search/functions_6f.html
new file mode 100644
index 000000000..9d6926417
--- /dev/null
+++ b/doc/html/search/functions_6f.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_6f.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/functions_6f.js b/doc/html/search/functions_6f.js
new file mode 100644
index 000000000..33c7a2134
--- /dev/null
+++ b/doc/html/search/functions_6f.js
@@ -0,0 +1,21 @@
+var searchData=
+[
+ ['oauth_5fget_5fclient',['oauth_get_client',['../mod_2api_8php.html#a02ae0f60e240dc806b860edb7d582117',1,'api.php']]],
+ ['obj_5fverb_5fselector',['obj_verb_selector',['../taxonomy_8php.html#af387463d42ffdf7d2ab3d5b22e40a0c7',1,'taxonomy.php']]],
+ ['obj_5fverbs',['obj_verbs',['../taxonomy_8php.html#a03f55ee46c5f496e42f3d29db8d09cce',1,'taxonomy.php']]],
+ ['oe_5fbuild_5fxpath',['oe_build_xpath',['../include_2oembed_8php.html#ab953a6e7c11bc6498ce01ed73e2ba319',1,'oembed.php']]],
+ ['oe_5fget_5finner_5fhtml',['oe_get_inner_html',['../include_2oembed_8php.html#a03fa3b7832c98a3d0b4630afeb73d487',1,'oembed.php']]],
+ ['oembed_5fbbcode2html',['oembed_bbcode2html',['../include_2oembed_8php.html#aba89ae64b355efcb4f706553d3edb6a2',1,'oembed.php']]],
+ ['oembed_5ffetch_5furl',['oembed_fetch_url',['../include_2oembed_8php.html#a98549b9af8140eda3eceaeedcaabc2c2',1,'oembed.php']]],
+ ['oembed_5fformat_5fobject',['oembed_format_object',['../include_2oembed_8php.html#a26bb4c1e330d2f94ea7b6ce2fe970cf3',1,'oembed.php']]],
+ ['oembed_5fhtml2bbcode',['oembed_html2bbcode',['../include_2oembed_8php.html#a000a62b97113cf95b0e9e00412168172',1,'oembed.php']]],
+ ['oembed_5fiframe',['oembed_iframe',['../include_2oembed_8php.html#a9e57f3e36a0a0a47e6db79544b701d9a',1,'oembed.php']]],
+ ['oembed_5finit',['oembed_init',['../mod_2oembed_8php.html#a9145025aaf057fb5d3f9f7011e5e1014',1,'oembed.php']]],
+ ['oembed_5freplacecb',['oembed_replacecb',['../include_2oembed_8php.html#a00c4c80deffd9daf8dc97b58d4c64ed0',1,'oembed.php']]],
+ ['oexchange_5fcontent',['oexchange_content',['../oexchange_8php.html#a2d8b785cd7d041a4e6274f5af370cf26',1,'oexchange.php']]],
+ ['oexchange_5finit',['oexchange_init',['../oexchange_8php.html#ac8e2e469ddc3db984b0c1b44558aca59',1,'oexchange.php']]],
+ ['onedirsync_5frun',['onedirsync_run',['../onedirsync_8php.html#a411aedd47c57476099647961e6a86691',1,'onedirsync.php']]],
+ ['onepoll_5frun',['onepoll_run',['../onepoll_8php.html#a72753b2fdec79b37c7f432035c91fb6d',1,'onepoll.php']]],
+ ['opensearch_5finit',['opensearch_init',['../opensearch_8php.html#ad13034877a496565ac7d99e9fc6f55e9',1,'opensearch.php']]],
+ ['orient',['orient',['../classphoto__driver.html#a4de5bac8daea8f291a33c80788019d0d',1,'photo_driver']]]
+];
diff --git a/doc/html/search/functions_70.html b/doc/html/search/functions_70.html
new file mode 100644
index 000000000..8ef7fb962
--- /dev/null
+++ b/doc/html/search/functions_70.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_70.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/functions_70.js b/doc/html/search/functions_70.js
new file mode 100644
index 000000000..acb3abbec
--- /dev/null
+++ b/doc/html/search/functions_70.js
@@ -0,0 +1,103 @@
+var searchData=
+[
+ ['page_5fcontent',['page_content',['../page_8php.html#a91a5f649f68406149108bded1dc90b22',1,'page.php']]],
+ ['page_5finit',['page_init',['../page_8php.html#a4d89800c0366a239191b1692c09635cf',1,'page.php']]],
+ ['pagelist_5fwidget',['pagelist_widget',['../page__widgets_8php.html#ad82011c1ed90d9de8b9f34c12af5c6f0',1,'page_widgets.php']]],
+ ['paginate',['paginate',['../text_8php.html#afe9f178d264d44a94dc1292aaf0fd585',1,'text.php']]],
+ ['parse_5furl_5fcontent',['parse_url_content',['../parse__url_8php.html#a05a9e8944380ba3cf6bbf5893dd4b74b',1,'parse_url.php']]],
+ ['parse_5fxml_5fstring',['parse_xml_string',['../include_2network_8php.html#a27a951b59d8d622c0b3e7b0673ba74c6',1,'network.php']]],
+ ['parsed',['parsed',['../classFriendicaSmarty.html#a6a4d4281d6fa9be1d37a97b188ffe8c9',1,'FriendicaSmarty']]],
+ ['parseurl_5fgetsiteinfo',['parseurl_getsiteinfo',['../parse__url_8php.html#a25635549f2c22955d72465f4d2e58993',1,'parse_url.php']]],
+ ['pdl_5fselector',['pdl_selector',['../comanche_8php.html#af7150df735e5ff9d467994cd6f769c6e',1,'comanche.php']]],
+ ['perm_5fis_5fallowed',['perm_is_allowed',['../permissions_8php.html#a67ada9ed51e77885b6b0f6a28cee1835',1,'permissions.php']]],
+ ['permissions_5fsql',['permissions_sql',['../security_8php.html#afa683bc025a1d2fe9065e2f6cd71a22f',1,'security.php']]],
+ ['perms2str',['perms2str',['../text_8php.html#a98fd99dee3da8cf4c148dc04efe782ee',1,'text.php']]],
+ ['photo_5ffactory',['photo_factory',['../photo__driver_8php.html#a32e2817faa25d7f11f60a8abff565035',1,'photo_driver.php']]],
+ ['photo_5finit',['photo_init',['../photo_8php.html#a582779d24882b0d31ee909a91d70a448',1,'photo.php']]],
+ ['photo_5fnew_5fresource',['photo_new_resource',['../text_8php.html#aa5528f41533927e1bd2da3618a74a6d7',1,'text.php']]],
+ ['photo_5fupload',['photo_upload',['../include_2photos_8php.html#a6c40ef58aefef705a5adc84a40e97109',1,'photos.php']]],
+ ['photos_5falbum_5fexists',['photos_album_exists',['../include_2photos_8php.html#a8e8b7be99e24c2497bc2cb3339280c35',1,'photos.php']]],
+ ['photos_5falbum_5fget_5fdb_5fidstr',['photos_album_get_db_idstr',['../include_2photos_8php.html#a7e7abc69872180697c5471dc69349afe',1,'photos.php']]],
+ ['photos_5falbum_5frename',['photos_album_rename',['../include_2photos_8php.html#ab0365f25b22ccea5f085fe7c49e1f4ab',1,'photos.php']]],
+ ['photos_5falbum_5fwidget',['photos_album_widget',['../include_2photos_8php.html#af24c6aeed28ecc31ec39e7d9a1804979',1,'photos.php']]],
+ ['photos_5falbums_5flist',['photos_albums_list',['../include_2photos_8php.html#aedccaf18282b26899d9549c29bd9d1b9',1,'photos.php']]],
+ ['photos_5fcontent',['photos_content',['../mod_2photos_8php.html#aa87382611a66ec5effdb2d78f13f5812',1,'photos.php']]],
+ ['photos_5fcreate_5fitem',['photos_create_item',['../include_2photos_8php.html#ad648c0c5544fe9263409b6f6e57c6274',1,'photos.php']]],
+ ['photos_5finit',['photos_init',['../mod_2photos_8php.html#ab950295cd77626f5fe65331a87693014',1,'photos.php']]],
+ ['photos_5flist_5fphotos',['photos_list_photos',['../include_2photos_8php.html#aa27b9e435dcc34e1009f56dc02c7ca51',1,'photos.php']]],
+ ['photos_5fpost',['photos_post',['../mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080',1,'photos.php']]],
+ ['php_5finit',['php_init',['../php_8php.html#adb7164dfed9a4ecbe2e168e1e78f12f6',1,'php.php']]],
+ ['ping_5finit',['ping_init',['../ping_8php.html#a77217b1b190b4c5d8770867b45f0c0a1',1,'ping.php']]],
+ ['pipe_5fstreams',['pipe_streams',['../include_2attach_8php.html#a5d484de2d19a93071571d6499a50ae34',1,'attach.php']]],
+ ['pkcs5_5fpad',['pkcs5_pad',['../crypto_8php.html#ad5e51fd44cff93cfaa07a37e24a5edec',1,'crypto.php']]],
+ ['pkcs5_5funpad',['pkcs5_unpad',['../crypto_8php.html#ac95ac3b1b23b65b04a86613d4206ae85',1,'crypto.php']]],
+ ['po2php_5frun',['po2php_run',['../po2php_8php.html#a3b75e36f913198299e99559b175cd8b4',1,'po2php.php']]],
+ ['poco_5finit',['poco_init',['../poco_8php.html#a53def16f75e3d41f1d2bb7cfa4905498',1,'poco.php']]],
+ ['poco_5fload',['poco_load',['../socgraph_8php.html#a5ef8bef37161df53718a21e93d02fbd6',1,'socgraph.php']]],
+ ['poke_5fcontent',['poke_content',['../poke_8php.html#ac9190563a8da9c07a16f9dcd71cf6993',1,'poke.php']]],
+ ['poke_5finit',['poke_init',['../poke_8php.html#a9725aab97b3983e6a98bd81c4efe7d3b',1,'poke.php']]],
+ ['poller_5frun',['poller_run',['../poller_8php.html#a5f12df3a4738124b6c039971e87e76da',1,'poller.php']]],
+ ['pop_5flang',['pop_lang',['../language_8php.html#a78bd204955ec4cc3a9ac651285a1689d',1,'language.php']]],
+ ['populate_5facl',['populate_acl',['../acl__selectors_8php.html#a7b5446e999636ceceea65c154d865a31',1,'acl_selectors.php']]],
+ ['post_5factivity_5fitem',['post_activity_item',['../items_8php.html#a410f9c743877c125ca06312373346903',1,'items.php']]],
+ ['post_5finit',['post_init',['../post_8php.html#af4b48181ce773ef0cdfc972441445c34',1,'post.php']]],
+ ['post_5fpost',['post_post',['../post_8php.html#af59e6a1dc22d19d9257b01cd7ccedb75',1,'post.php']]],
+ ['post_5fto_5fred_5fadmin',['post_to_red_admin',['../post__to__red_8php.html#aeec4125719184e7b097b3b9fba3101b5',1,'post_to_red.php']]],
+ ['post_5fto_5fred_5fdeactivate',['post_to_red_deactivate',['../post__to__red_8php.html#a49fd35f7b1cdddfe6e26ddfcf8d3c4ec',1,'post_to_red.php']]],
+ ['post_5fto_5fred_5fdelete_5fcomment',['post_to_red_delete_comment',['../post__to__red_8php.html#a5cc2a89a6d33cdb8e2ca557a69bef42d',1,'post_to_red.php']]],
+ ['post_5fto_5fred_5fdelete_5fpost',['post_to_red_delete_post',['../post__to__red_8php.html#a4674bb5ce2baa32c559607460c39a2c5',1,'post_to_red.php']]],
+ ['post_5fto_5fred_5fdisplay_5fadmin_5fpage',['post_to_red_display_admin_page',['../post__to__red_8php.html#a8ec8f8809e3c5d1b2c9598c8185d63aa',1,'post_to_red.php']]],
+ ['post_5fto_5fred_5fdisplayadmincontent',['post_to_red_displayAdminContent',['../post__to__red_8php.html#a75db5d87226a0287a0ac0fa315f2bcfd',1,'post_to_red.php']]],
+ ['post_5fto_5fred_5fget_5facct_5fname',['post_to_red_get_acct_name',['../post__to__red_8php.html#ae6f3a2c0561cbeacda5be565b06de8a7',1,'post_to_red.php']]],
+ ['post_5fto_5fred_5fget_5favatar',['post_to_red_get_avatar',['../post__to__red_8php.html#ae0b881461afbdba93d9329068ea52136',1,'post_to_red.php']]],
+ ['post_5fto_5fred_5fget_5fchannel_5fname',['post_to_red_get_channel_name',['../post__to__red_8php.html#aacba7a0646fc00ae6ac4f5dc383fccab',1,'post_to_red.php']]],
+ ['post_5fto_5fred_5fget_5fpassword',['post_to_red_get_password',['../post__to__red_8php.html#a4d90ac085c14f53ff4d8ab4c23477ea6',1,'post_to_red.php']]],
+ ['post_5fto_5fred_5fget_5fseed_5flocation',['post_to_red_get_seed_location',['../post__to__red_8php.html#a96d0ccecb96600ef1bfd50ab3f77315f',1,'post_to_red.php']]],
+ ['post_5fto_5fred_5fpost',['post_to_red_post',['../post__to__red_8php.html#af5fd50e2c42ede85f8a9e8d9ee3cf540',1,'post_to_red.php']]],
+ ['post_5fto_5fred_5fpost_5fcheckbox',['post_to_red_post_checkbox',['../post__to__red_8php.html#a0f139dea77a94c98f26007963eea639c',1,'post_to_red.php']]],
+ ['post_5fto_5fred_5fpost_5ffield_5fdata',['post_to_red_post_field_data',['../post__to__red_8php.html#a7e68a8d9c83cb28d032aad3ea85ce0a6',1,'post_to_red.php']]],
+ ['post_5fto_5fred_5fpost_5fmeta_5fcontent',['post_to_red_post_meta_content',['../post__to__red_8php.html#aa97aeda12ef080665f16311a4e1eb901',1,'post_to_red.php']]],
+ ['post_5fto_5fred_5fsettings_5flink',['post_to_red_settings_link',['../post__to__red_8php.html#a906be8f72cf1aa2e199c0683ea6a4017',1,'post_to_red.php']]],
+ ['posted_5fdate_5fwidget',['posted_date_widget',['../items_8php.html#abe695dd89e1e10ed042c26b80114f0ed',1,'items.php']]],
+ ['posted_5fdates',['posted_dates',['../items_8php.html#ad2abb4644ff1f20fefbc80326fe01cf0',1,'items.php']]],
+ ['preg_5fcallback_5fhelp_5finclude',['preg_callback_help_include',['../help_8php.html#a06b2a51aaabed99e53a9b639047c4ce4',1,'help.php']]],
+ ['preg_5fheart',['preg_heart',['../text_8php.html#ac19d2b33a58372a357a43d51eed19162',1,'text.php']]],
+ ['prepare_5fbody',['prepare_body',['../text_8php.html#ae4df74296fbe55051ed3c035e55205e5',1,'text.php']]],
+ ['prepare_5fpage',['prepare_page',['../conversation_8php.html#a4b0888b0f26e1c284a4341fe5fd04f0c',1,'conversation.php']]],
+ ['prepare_5ftext',['prepare_text',['../text_8php.html#afe54312607d92f7ce9593f5760831f80',1,'text.php']]],
+ ['pretheme_5finit',['pretheme_init',['../pretheme_8php.html#af5660943ee99db5fd75182316522eafe',1,'pretheme.php']]],
+ ['print_5ftemplate',['print_template',['../tpldebug_8php.html#a44778457a6c02554812fbfad19d32ba3',1,'tpldebug.php']]],
+ ['printable',['printable',['../dba__driver_8php.html#a55bf30d8176967e682656b5be4ad9249',1,'dba_driver.php']]],
+ ['private_5fmessages_5fdrop',['private_messages_drop',['../include_2message_8php.html#aed272d77c06a309e2836ac79e75613f1',1,'message.php']]],
+ ['private_5fmessages_5ffetch_5fconversation',['private_messages_fetch_conversation',['../include_2message_8php.html#a5f8de9847e203329e317ac38dc646898',1,'message.php']]],
+ ['private_5fmessages_5ffetch_5fmessage',['private_messages_fetch_message',['../include_2message_8php.html#a254a756031e4d5e94f85e2939bdb5091',1,'message.php']]],
+ ['private_5fmessages_5flist',['private_messages_list',['../include_2message_8php.html#a652973ce47a262f2d238c2fd6233d97e',1,'message.php']]],
+ ['probe_5fcontent',['probe_content',['../probe_8php.html#a1f1db3fa6038e451e737964c94bf5e99',1,'probe.php']]],
+ ['proc_5frun',['proc_run',['../boot_8php.html#ab346a2ece14993861f3e4206befa94f0',1,'boot.php']]],
+ ['process_5fchannel_5fsync_5fdelivery',['process_channel_sync_delivery',['../zot_8php.html#ac301c67864917c35922257950ae0f95c',1,'zot.php']]],
+ ['process_5fdelivery',['process_delivery',['../zot_8php.html#a37ec13b18057634eadb071f05297f5e1',1,'zot.php']]],
+ ['process_5fmail_5fdelivery',['process_mail_delivery',['../zot_8php.html#aa6ae96db8cbbdbb10e6876d206bbf7cc',1,'zot.php']]],
+ ['process_5fprofile_5fdelivery',['process_profile_delivery',['../zot_8php.html#a9a57b40669351c9791126b925cb7ef3b',1,'zot.php']]],
+ ['profile_5factivity',['profile_activity',['../activities_8php.html#a80134e807719b3c54aba971958d2e132',1,'activities.php']]],
+ ['profile_5fcontent',['profile_content',['../profile_8php.html#a3775cf6eef6587e5143133356a7b76c0',1,'profile.php']]],
+ ['profile_5fcreate_5fsidebar',['profile_create_sidebar',['../identity_8php.html#ad4a2c8caca8f6ae93633ebeca0ed6620',1,'identity.php']]],
+ ['profile_5finit',['profile_init',['../profile_8php.html#ab5d0246be0552e2182a585c1206d22a5',1,'profile.php']]],
+ ['profile_5fload',['profile_load',['../identity_8php.html#a4751b522ea913d0e7ed43e03d22e9e68',1,'identity.php']]],
+ ['profile_5fphoto_5finit',['profile_photo_init',['../profile__photo_8php.html#a140631c56438fbfacb61a1eb43067d02',1,'profile_photo.php']]],
+ ['profile_5fphoto_5fpost',['profile_photo_post',['../profile__photo_8php.html#a4b80234074bd603221aa5364f330e479',1,'profile_photo.php']]],
+ ['profile_5fsidebar',['profile_sidebar',['../identity_8php.html#a432259b2cf5b6f59be53e71db9f2c7dc',1,'identity.php']]],
+ ['profile_5ftabs',['profile_tabs',['../conversation_8php.html#a1dfcb5146e9d1eca4528bc580ad5d273',1,'conversation.php']]],
+ ['profiler',['profiler',['../text_8php.html#a8b0a799341b1fc4cba2c3ede3e3fc9b6',1,'text.php']]],
+ ['profiles_5fcontent',['profiles_content',['../profiles_8php.html#a46975783b8b8d70402d51487eb1f0b00',1,'profiles.php']]],
+ ['profiles_5finit',['profiles_init',['../profiles_8php.html#a36f71405ad536228f8bb84a551b23f7e',1,'profiles.php']]],
+ ['profiles_5fpost',['profiles_post',['../profiles_8php.html#ab0362c81b1d3b0b12a772b9fac446e04',1,'profiles.php']]],
+ ['profperm_5fcontent',['profperm_content',['../profperm_8php.html#aef015787de2373d9fb3fe3f814fb5023',1,'profperm.php']]],
+ ['profperm_5finit',['profperm_init',['../profperm_8php.html#a17fb64ec05edee1dc94d95438807d6c6',1,'profperm.php']]],
+ ['protect_5fsprintf',['protect_sprintf',['../text_8php.html#a4e7698aca48982512594b274543c3b9b',1,'text.php']]],
+ ['public_5fpermissions_5fsql',['public_permissions_sql',['../security_8php.html#ab3bdd30dc60d9ee72370b866aa4a2d01',1,'security.php']]],
+ ['public_5frecips',['public_recips',['../zot_8php.html#a083aec6c900d244e1bfc1406f9461465',1,'zot.php']]],
+ ['pubsites_5fcontent',['pubsites_content',['../pubsites_8php.html#af614e279aab54065345bda6b03eafdf0',1,'pubsites.php']]],
+ ['purify_5fhtml',['purify_html',['../text_8php.html#a4841df5beabdd1bdd1ed56781a915d61',1,'text.php']]],
+ ['push_5flang',['push_lang',['../language_8php.html#ac9142ef1d01a235c760deb0f16643f5a',1,'language.php']]],
+ ['put',['put',['../classRedFile.html#a41a49a583eb276b75626fcf97f4a699c',1,'RedFile']]]
+];
diff --git a/doc/html/search/functions_71.html b/doc/html/search/functions_71.html
new file mode 100644
index 000000000..d8d7e7358
--- /dev/null
+++ b/doc/html/search/functions_71.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_71.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/functions_71.js b/doc/html/search/functions_71.js
new file mode 100644
index 000000000..11b357b31
--- /dev/null
+++ b/doc/html/search/functions_71.js
@@ -0,0 +1,7 @@
+var searchData=
+[
+ ['q',['q',['../classdba__driver.html#a558e738b88ae893cc5d79ffa3793d555',1,'dba_driver\q()'],['../classdba__mysql.html#ac3fd60c278f400907322dac578754a99',1,'dba_mysql\q()'],['../classdba__mysqli.html#a611c4de8d6d7512dffb83a38bb6701ec',1,'dba_mysqli\q()'],['../dba__driver_8php.html#a2c09a731d3b4fef41fed0e83db01be1f',1,'q():&#160;dba_driver.php']]],
+ ['qp',['qp',['../text_8php.html#afc998d2796a6b2a08e96f7cc061e7221',1,'text.php']]],
+ ['queue_5frun',['queue_run',['../queue_8php.html#af8c93de86d866c3200174c8450a0f341',1,'queue.php']]],
+ ['quotelevel',['quotelevel',['../html2plain_8php.html#a56d29b254333d29abb9d96a9a903a4b0',1,'html2plain.php']]]
+];
diff --git a/doc/html/search/functions_72.html b/doc/html/search/functions_72.html
new file mode 100644
index 000000000..71f58bbd1
--- /dev/null
+++ b/doc/html/search/functions_72.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_72.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/functions_72.js b/doc/html/search/functions_72.js
new file mode 100644
index 000000000..a37fda950
--- /dev/null
+++ b/doc/html/search/functions_72.js
@@ -0,0 +1,55 @@
+var searchData=
+[
+ ['random_5fprofile',['random_profile',['../Contact_8php.html#a852fa476f0c70bde10a4f2533aec5f71',1,'Contact.php']]],
+ ['random_5fstring',['random_string',['../text_8php.html#a9d6a5ee1290de7a8b483fe78585daade',1,'text.php']]],
+ ['randprof_5finit',['randprof_init',['../randprof_8php.html#abf5dba3c608b9304cbf68327cd31b090',1,'randprof.php']]],
+ ['rconnect_5furl',['rconnect_url',['../Contact_8php.html#a2f4f495d53f2a334ab75292af79d3c91',1,'Contact.php']]],
+ ['rebuild_5ftheme_5ftable',['rebuild_theme_table',['../admin_8php.html#ae46311a3fefc21abc838a26e91789de6',1,'admin.php']]],
+ ['red_5fcomment',['red_comment',['../post__to__red_8php.html#a085c250d4ceff5e4f10052f3d2039823',1,'post_to_red.php']]],
+ ['red_5fxmlrpc_5fmethods',['red_xmlrpc_methods',['../post__to__red_8php.html#a3a2af6ad845239f26e86fccabf8639e1',1,'post_to_red.php']]],
+ ['red_5fzrl_5fcallback',['red_zrl_callback',['../items_8php.html#a4e6d7639431e0dd8e9f4dba8e1ac408b',1,'items.php']]],
+ ['redbasic_5fform',['redbasic_form',['../view_2theme_2redbasic_2php_2config_8php.html#a8574a41fa9735ee391ba57ab24b93793',1,'config.php']]],
+ ['redbasic_5finit',['redbasic_init',['../redbasic_2php_2theme_8php.html#af6eb813e9fc7e2d76ac1b82bc5c0ed9b',1,'theme.php']]],
+ ['redchannellist',['RedChannelList',['../reddav_8php.html#ae92ea0df1993f6a7bcd1b6efa6c1fb66',1,'reddav.php']]],
+ ['redcollectiondata',['RedCollectionData',['../reddav_8php.html#a5df0d09893f2e65dc5cf6bbab6cfb266',1,'reddav.php']]],
+ ['redfiledata',['RedFileData',['../reddav_8php.html#a9f531641dfb4e43cd88ac1a9ae7e2088',1,'reddav.php']]],
+ ['reduce',['reduce',['../docblox__errorchecker_8php.html#ae9562cf60aa693114603d27b55d2185f',1,'docblox_errorchecker.php']]],
+ ['ref_5fsession_5fclose',['ref_session_close',['../session_8php.html#a5e1c616e02b863d5450317d101366bb7',1,'session.php']]],
+ ['ref_5fsession_5fdestroy',['ref_session_destroy',['../session_8php.html#af230b86bfff7db66c3bdd7e0bbc24052',1,'session.php']]],
+ ['ref_5fsession_5fgc',['ref_session_gc',['../session_8php.html#ac95373f4966862a028033dd2f94d4da1',1,'session.php']]],
+ ['ref_5fsession_5fopen',['ref_session_open',['../session_8php.html#a26fa1042356d555023cbf15ddd4f8507',1,'session.php']]],
+ ['ref_5fsession_5fread',['ref_session_read',['../session_8php.html#a7f0f50576360d9ba52d29364e0b83a8e',1,'session.php']]],
+ ['ref_5fsession_5fwrite',['ref_session_write',['../session_8php.html#ac4461c1984543d3553e73dba2771568f',1,'session.php']]],
+ ['register_5fcontent',['register_content',['../register_8php.html#a0e91f57f111407ea8d3223a05022bb2a',1,'register.php']]],
+ ['register_5fhook',['register_hook',['../plugin_8php.html#a425472c5f3afc137268b2ad45652b209',1,'plugin.php']]],
+ ['register_5finit',['register_init',['../register_8php.html#ae20c0cd40f738d6295de58b9202c83d5',1,'register.php']]],
+ ['register_5fpost',['register_post',['../register_8php.html#a51731dcc1917c58a790eb1c0f6132271',1,'register.php']]],
+ ['register_5ftemplate_5fengine',['register_template_engine',['../classApp.html#abf46a653d8499e7c253cc1be894a6d83',1,'App']]],
+ ['regmod_5fcontent',['regmod_content',['../regmod_8php.html#a7953df4e32e63946565e90cdd5d50409',1,'regmod.php']]],
+ ['relative_5fdate',['relative_date',['../datetime_8php.html#a8ae8dc95ace7ac27fa5a1ecf42b78c82',1,'datetime.php']]],
+ ['reload_5fplugins',['reload_plugins',['../plugin_8php.html#af9ac19004dca49adae1ac7a0d9f3b025',1,'plugin.php']]],
+ ['reltoabs',['reltoabs',['../text_8php.html#ad855a32bee22c3f3b9734e3a334b96f2',1,'text.php']]],
+ ['remote_5fuser',['remote_user',['../boot_8php.html#a5542c5c2806ab8bca04bad53d47b5209',1,'boot.php']]],
+ ['remove_5fall_5fxchan_5fresources',['remove_all_xchan_resources',['../Contact_8php.html#acc12cda999c88c4d6185cca967c15125',1,'Contact.php']]],
+ ['remove_5fchild',['remove_child',['../classItem.html#a2ce70ef63f9f4d86a09c351678806925',1,'Item']]],
+ ['remove_5fcommunity_5ftag',['remove_community_tag',['../zot_8php.html#aad25a3fe0e1566121d6fb8222979bc10',1,'zot.php']]],
+ ['remove_5fparent',['remove_parent',['../classItem.html#aa452b5bcd8dea12119b09212c615cb41',1,'Item']]],
+ ['remove_5fqueue_5fitem',['remove_queue_item',['../queue__fn_8php.html#a8fe71e981399bbf5d000a6ca42f57b24',1,'queue_fn.php']]],
+ ['removeme_5fcontent',['removeme_content',['../removeme_8php.html#a065a589caa2aa84c60f7073a28f0ad9c',1,'removeme.php']]],
+ ['removeme_5fpost',['removeme_post',['../removeme_8php.html#a7be08738beca44bb98a79e01cdb2ee88',1,'removeme.php']]],
+ ['render_5flocation_5fdefault',['render_location_default',['../conversation_8php.html#a40b9b5e7825bc73932a32e667f05e6f2',1,'conversation.php']]],
+ ['replace',['replace',['../classTemplate.html#a285b5b2007dbbf733476273df3fed4ef',1,'Template']]],
+ ['replace_5fmacros',['replace_macros',['../classFriendicaSmartyEngine.html#ad62f1181d2f02b54b46731ad2bd46db2',1,'FriendicaSmartyEngine\replace_macros()'],['../interfaceITemplateEngine.html#aaa7381c8becc3d1c1790b53988a0f243',1,'ITemplateEngine\replace_macros()'],['../classTemplate.html#a07737733f6949bdedea1e3d301b2ab7b',1,'Template\replace_macros()'],['../text_8php.html#a9c6ce4e12a4ac883c5e3f36fed6e1e09',1,'replace_macros():&#160;text.php']]],
+ ['requestdata',['requestdata',['../include_2api_8php.html#a43c47de8565cc00c3369cb35c19cc75e',1,'api.php']]],
+ ['return_5fbytes',['return_bytes',['../text_8php.html#ae2126da85966da0e79c6bcbac63b0bda',1,'text.php']]],
+ ['rmagic_5fcontent',['rmagic_content',['../rmagic_8php.html#a3e28db1e5cfa7e5c2617f90222c1caef',1,'rmagic.php']]],
+ ['rmagic_5finit',['rmagic_init',['../rmagic_8php.html#a95455edd43f1bff39446a57388cdde16',1,'rmagic.php']]],
+ ['rmagic_5fpost',['rmagic_post',['../rmagic_8php.html#a869de069d081b3c4e98b957d06bbf08f',1,'rmagic.php']]],
+ ['rotate',['rotate',['../classphoto__driver.html#a2f2b6337cf9aa0688d10b422123f0eec',1,'photo_driver\rotate()'],['../classphoto__gd.html#a77f87730b11093b76980c541159df37d',1,'photo_gd\rotate()'],['../classphoto__imagick.html#a9df5738a4a18e76dd304c440e96f045f',1,'photo_imagick\rotate()']]],
+ ['rpost_5fcallback',['rpost_callback',['../bbcode_8php.html#a5165a5221a52cf1bc1d7812ebd2069c7',1,'bbcode.php']]],
+ ['rpost_5fcontent',['rpost_content',['../rpost_8php.html#a8190354d789000806d9879aea276728f',1,'rpost.php']]],
+ ['rsa_5fsign',['rsa_sign',['../crypto_8php.html#a920e5f222d0020f47556033d8b2b6552',1,'crypto.php']]],
+ ['rsa_5fverify',['rsa_verify',['../crypto_8php.html#ab4f21d8f6b8ece0915e7c8bb73379f96',1,'crypto.php']]],
+ ['rsd_5fxml_5fcontent',['rsd_xml_content',['../rsd__xml_8php.html#a740cd02fa15e5a53f8547fac73f0ab82',1,'rsd_xml.php']]],
+ ['runs',['runs',['../docblox__errorchecker_8php.html#a21b4bbe5aae2d85db33affc7126a67ec',1,'docblox_errorchecker.php']]]
+];
diff --git a/doc/html/search/functions_73.html b/doc/html/search/functions_73.html
new file mode 100644
index 000000000..c80660e8c
--- /dev/null
+++ b/doc/html/search/functions_73.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_73.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/functions_73.js b/doc/html/search/functions_73.js
new file mode 100644
index 000000000..ab1a2ac62
--- /dev/null
+++ b/doc/html/search/functions_73.js
@@ -0,0 +1,98 @@
+var searchData=
+[
+ ['sanitise_5facl',['sanitise_acl',['../text_8php.html#a9fbeae13c9abd6e27cb4d8d1817f969c',1,'text.php']]],
+ ['save',['save',['../classphoto__driver.html#a5864fae7d8389372955a8e78cec527ac',1,'photo_driver']]],
+ ['saveimage',['saveImage',['../classphoto__driver.html#a22ecb8c696de65a5a10bd185be9d90c3',1,'photo_driver']]],
+ ['scale_5fexternal_5fimages',['scale_external_images',['../include_2network_8php.html#ae8d9c41a11000fb8667039fc71b4f73f',1,'network.php']]],
+ ['scaleimage',['scaleImage',['../classphoto__driver.html#af0f7ec48a31ae9b557b6e3f8bd5b4af0',1,'photo_driver']]],
+ ['scaleimagesquare',['scaleImageSquare',['../classphoto__driver.html#a56634842b071b96502716e9843ea5361',1,'photo_driver']]],
+ ['scaleimageup',['scaleImageUp',['../classphoto__driver.html#a1a63c4ae17e892a115ab9cf6efb960ce',1,'photo_driver']]],
+ ['script_5fpath',['script_path',['../plugin_8php.html#a0e8c2ea50bfdbc39e17ccccaea21ddc3',1,'plugin.php']]],
+ ['search',['search',['../text_8php.html#a876e94892867019935b348b573299352',1,'text.php']]],
+ ['search_5fac_5finit',['search_ac_init',['../search__ac_8php.html#a14f90c83a3f2be095e9e2992a8d66138',1,'search_ac.php']]],
+ ['search_5fcontent',['search_content',['../search_8php.html#ab2568591359edde5b483a6cd9a24b2cc',1,'search.php']]],
+ ['search_5finit',['search_init',['../search_8php.html#acf19fd30f07f495781ca0d7a0a08b435',1,'search.php']]],
+ ['searchbox',['searchbox',['../text_8php.html#aae91e4d2a2c6f7a9daccd2c186ae3447',1,'text.php']]],
+ ['select_5ftimezone',['select_timezone',['../datetime_8php.html#a633dadba426fa2f60b25fabdb19ebc1f',1,'datetime.php']]],
+ ['send',['send',['../classenotify.html#afbc088860f534c6c05788b48cfc262c6',1,'enotify']]],
+ ['send_5fmessage',['send_message',['../include_2message_8php.html#a751ffd6635022b2190f56154ee745752',1,'message.php']]],
+ ['send_5freg_5fapproval_5femail',['send_reg_approval_email',['../account_8php.html#a014de2d5d5c9785de5bf547a485822fa',1,'account.php']]],
+ ['send_5fstatus_5fnotifications',['send_status_notifications',['../items_8php.html#aab9e0c58247427126de0699c729c3b6c',1,'items.php']]],
+ ['send_5fverification_5femail',['send_verification_email',['../account_8php.html#aa9c29c497c17d8f9344dce8631ad8761',1,'account.php']]],
+ ['service_5fclass_5fallows',['service_class_allows',['../plugin_8php.html#a030cec6793b909c439c0336ba39b1571',1,'plugin.php']]],
+ ['service_5fclass_5ffetch',['service_class_fetch',['../plugin_8php.html#a905b54e10704b283ac64680a8abc0971',1,'plugin.php']]],
+ ['set',['set',['../classCache.html#ae622b82adc1c2fb1f3e2cc4fd9688fce',1,'Cache']]],
+ ['set_5faccount',['set_account',['../classApp.html#aeb1fe1c8ad9aa639909bd183ce578536',1,'App']]],
+ ['set_5fapp',['set_app',['../classBaseObject.html#a0a9acda12d751692834cf6999f889223',1,'BaseObject']]],
+ ['set_5fapps',['set_apps',['../classApp.html#abea5a4f77dcd53c928dc4eed86616637',1,'App']]],
+ ['set_5fbaseurl',['set_baseurl',['../classApp.html#a78788f6e9d8b713b138f81e457c5cd08',1,'App']]],
+ ['set_5fchannel',['set_channel',['../classApp.html#a89e9feb2bfb5253883a9720beaffe876',1,'App']]],
+ ['set_5fcommentable',['set_commentable',['../classItem.html#aa1bd19fc8b5577078530265a7bf64123',1,'Item']]],
+ ['set_5fconfig',['set_config',['../include_2config_8php.html#ad6da879e4fb5b37d1e161d4e9be5c32a',1,'config.php']]],
+ ['set_5fconversation',['set_conversation',['../classItem.html#aa8b1bbc4236890694635295e46d7fd72',1,'Item']]],
+ ['set_5fdefault_5flogin_5fidentity',['set_default_login_identity',['../identity_8php.html#a78151baf4407a8482d2681a91a9c486b',1,'identity.php']]],
+ ['set_5fgroups',['set_groups',['../classApp.html#a3d84af5e42082098672531cd1a618853',1,'App']]],
+ ['set_5fhostname',['set_hostname',['../classApp.html#a344d2b7dc2f276648d521aee4da1731c',1,'App']]],
+ ['set_5fmode',['set_mode',['../classConversation.html#a66f121ca4026246f86a732e5faa0682c',1,'Conversation']]],
+ ['set_5fobserver',['set_observer',['../classApp.html#a4776d9322edea17fae56afa5d01a323e',1,'App']]],
+ ['set_5fpager_5fitemspage',['set_pager_itemspage',['../classApp.html#a4bdd7bfed62f50515fce652127bf481b',1,'App']]],
+ ['set_5fpager_5ftotal',['set_pager_total',['../classApp.html#a560189f048d3db2f526841963cc43e97',1,'App']]],
+ ['set_5fparent',['set_parent',['../classItem.html#a9890ff72662d5bba301d1f2dd8aec9d7',1,'Item']]],
+ ['set_5fpath',['set_path',['../classApp.html#adb060d5c7f35a521ec7ec0effbe08097',1,'App']]],
+ ['set_5fpconfig',['set_pconfig',['../include_2config_8php.html#a61591371cb18764138655d67dc817ab2',1,'config.php']]],
+ ['set_5fperms',['set_perms',['../classApp.html#a557d7b779d8259027f4724ebf7b248dc',1,'App']]],
+ ['set_5fprofile_5fowner',['set_profile_owner',['../classConversation.html#a8898bddc1e8990e81dab9a13a532cc93',1,'Conversation']]],
+ ['set_5ftemplate',['set_template',['../classItem.html#af1b73df9b7c4b927e26b7e243b491f42',1,'Item']]],
+ ['set_5ftemplate_5fengine',['set_template_engine',['../classApp.html#a20d1890cc16b22ba79eeb0cbf2f719f7',1,'App']]],
+ ['set_5fwidget',['set_widget',['../classApp.html#a123b903dfe5d3488cc68db3471d36fd2',1,'App']]],
+ ['set_5fwriteable',['set_writeable',['../classRedBrowser.html#a40fdbb9d9fe6c1243bbf135dd5b0a06f',1,'RedBrowser']]],
+ ['set_5fxconfig',['set_xconfig',['../include_2config_8php.html#afe117b70f1bba2f6348d9300b601f86e',1,'config.php']]],
+ ['setbrowserplugin',['setBrowserPlugin',['../classRedBasicAuth.html#a358ddad4abb5aa8c1382cf49a907adbc',1,'RedBasicAuth']]],
+ ['setcurrentuser',['setCurrentUser',['../classRedBasicAuth.html#a072e8244a9a7f191b32d3db5ac94f857',1,'RedBasicAuth']]],
+ ['setdimensions',['setDimensions',['../classphoto__driver.html#ae663867d2c4eaa2fae50d60670920143',1,'photo_driver\setDimensions()'],['../classphoto__gd.html#a1c75304bd15f3b9986f0b315fb59271e',1,'photo_gd\setDimensions()'],['../classphoto__imagick.html#af92901d252c1e6ab5b54eebedbed23bb',1,'photo_imagick\setDimensions()']]],
+ ['setname',['setName',['../classRedFile.html#a38a82bfc1b30028ea6ac75923e90fa25',1,'RedFile']]],
+ ['settings_5finit',['settings_init',['../settings_8php.html#a3a4cde287482fced008583f54ba2a722',1,'settings.php']]],
+ ['settings_5fpost',['settings_post',['../settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586',1,'settings.php']]],
+ ['setup_5fcontent',['setup_content',['../setup_8php.html#a88247384a96e14516f474d7af6a465c1',1,'setup.php']]],
+ ['setup_5finit',['setup_init',['../setup_8php.html#a267555abd17290e659b4bf44b885e4e0',1,'setup.php']]],
+ ['setup_5fpost',['setup_post',['../setup_8php.html#a13cf286774149a0a7bd8adb8179cec75',1,'setup.php']]],
+ ['sexpref_5fselector',['sexpref_selector',['../profile__selectors_8php.html#a3b50b3ea4ea4bdbebebfffc5d1b157c7',1,'profile_selectors.php']]],
+ ['share_5finit',['share_init',['../share_8php.html#afeb26046bdd02567ecd29ab5f188b249',1,'share.php']]],
+ ['showform',['showForm',['../fpostit_8php.html#a3f3ae3ae61578b5671673914fd894443',1,'fpostit.php']]],
+ ['site_5fdefault_5fperms',['site_default_perms',['../permissions_8php.html#aa8b7b102c653649d7a71b5a1c044d90d',1,'permissions.php']]],
+ ['siteinfo_5fcontent',['siteinfo_content',['../siteinfo_8php.html#a70c09bfb6dd1c86a125a35f62ed53656',1,'siteinfo.php']]],
+ ['siteinfo_5finit',['siteinfo_init',['../siteinfo_8php.html#a3efbd0bd6564af19ec0a9ce0294e59d0',1,'siteinfo.php']]],
+ ['sitelist_5finit',['sitelist_init',['../sitelist_8php.html#a665a59bf60f780b40f32c909f4a473b1',1,'sitelist.php']]],
+ ['smile_5fdecode',['smile_decode',['../text_8php.html#aca0f589be74fab1a460c57e88dad9779',1,'text.php']]],
+ ['smile_5fencode',['smile_encode',['../text_8php.html#a44d460fcdee6247c67b9bef3ea15f3e6',1,'text.php']]],
+ ['smilies',['smilies',['../text_8php.html#a3d225b253bb9e0f2498c11647d927b0b',1,'text.php']]],
+ ['smilies_5fcontent',['smilies_content',['../smilies_8php.html#ab43b1e9f33a700a830aff14c7b3a617f',1,'smilies.php']]],
+ ['sort_5fby_5fdate',['sort_by_date',['../event_8php.html#a018ea4484910a873a7c1eaa126de9b1a',1,'event.php']]],
+ ['sort_5fitem_5fchildren',['sort_item_children',['../conversation_8php.html#ae996eb116d397a2c6396c312d7b98664',1,'conversation.php']]],
+ ['sort_5fthr_5fcommented',['sort_thr_commented',['../conversation_8php.html#a9f909b8885259b79c6ac8da93afd8f11',1,'conversation.php']]],
+ ['sort_5fthr_5fcreated',['sort_thr_created',['../conversation_8php.html#ac55e070f65f46fcc8e269f7896be4c7d',1,'conversation.php']]],
+ ['sort_5fthr_5fcreated_5frev',['sort_thr_created_rev',['../conversation_8php.html#a9cc2a679606da9e535a06433f9f553a0',1,'conversation.php']]],
+ ['sources_5fcontent',['sources_content',['../sources_8php.html#ac442ccef080ab95772d8929fcafcb4b7',1,'sources.php']]],
+ ['sources_5fpost',['sources_post',['../sources_8php.html#ac73298ff162ce7b2de8dcaf3d3305b1e',1,'sources.php']]],
+ ['sslify',['sslify',['../text_8php.html#a33bdb5d4bfff2ede7caf61a98ac0a2e9',1,'text.php']]],
+ ['sslify_5finit',['sslify_init',['../sslify_8php.html#a75b11e54a3d1fc83e7d4c0e8b4dab316',1,'sslify.php']]],
+ ['starred_5finit',['starred_init',['../starred_8php.html#a63024fb418c678e49fd535e3752d349a',1,'starred.php']]],
+ ['startup',['startup',['../boot_8php.html#aca47505b8732177f52bb2d647eb2741c',1,'boot.php']]],
+ ['status_5feditor',['status_editor',['../conversation_8php.html#a2a7d541854bba755eb8ada59af7dcb1a',1,'conversation.php']]],
+ ['store',['store',['../classphoto__driver.html#a642a8d0c4ad5f887c99c6af77cee287b',1,'photo_driver']]],
+ ['store_5fitem_5ftag',['store_item_tag',['../taxonomy_8php.html#a4ba1339b2a7054971178ce194e4440fd',1,'taxonomy.php']]],
+ ['stream_5fperms_5fapi_5fuids',['stream_perms_api_uids',['../security_8php.html#ae92c5c1a1cbbc49ddbb8b3265d2db809',1,'security.php']]],
+ ['stream_5fperms_5fxchans',['stream_perms_xchans',['../security_8php.html#a15e0f8f511cc06192db63387f97238b3',1,'security.php']]],
+ ['string_5fplural_5fselect_5fdefault',['string_plural_select_default',['../language_8php.html#a151e5b4689aef86a12642cbb7a00bfe0',1,'language.php']]],
+ ['stringify_5farray_5felms',['stringify_array_elms',['../text_8php.html#a8796f6a9ca592ecdce7b3afc3462aa13',1,'text.php']]],
+ ['stripdcode_5fbr_5fcb',['stripdcode_br_cb',['../bb2diaspora_8php.html#a180b0e3a7d702998be19e3c3b44b0e93',1,'bb2diaspora.php']]],
+ ['subthread_5fcontent',['subthread_content',['../subthread_8php.html#a50368f3d825b77996030528e7fbfa3d3',1,'subthread.php']]],
+ ['suggest_5fcontent',['suggest_content',['../suggest_8php.html#a58748a8235d4523f8333847f3e42dd91',1,'suggest.php']]],
+ ['suggest_5finit',['suggest_init',['../suggest_8php.html#a696acf1dd8070e479adcc80c63c6718c',1,'suggest.php']]],
+ ['suggestion_5fquery',['suggestion_query',['../socgraph_8php.html#a76e6fca3d2bc842dcd9e710bb87c8329',1,'socgraph.php']]],
+ ['supportedtypes',['supportedTypes',['../classphoto__driver.html#a6eee8e36eaf9339f4faf80ddd43162da',1,'photo_driver\supportedTypes()'],['../classphoto__gd.html#a16f3dd7d3559f715aa2fe3f7880836dd',1,'photo_gd\supportedTypes()'],['../classphoto__imagick.html#a27596faca6108d9d563674d1b654a0b7',1,'photo_imagick\supportedTypes()']]],
+ ['sync_5fdirectories',['sync_directories',['../dir__fns_8php.html#aa666e7df6ca8c332f4081c9b66b4bdf6',1,'dir_fns.php']]],
+ ['syncdirs',['syncdirs',['../dir__fns_8php.html#a6cae22cfdd6edda5ddf09e07abb3242a',1,'dir_fns.php']]],
+ ['system_5fdown',['system_down',['../system__unavailable_8php.html#a73751a6bcc17ad3ca503496e2fb020fa',1,'system_unavailable.php']]],
+ ['system_5funavailable',['system_unavailable',['../boot_8php.html#ac608a34f3bc180e7724192e0fd31f9b0',1,'boot.php']]]
+];
diff --git a/doc/html/search/functions_74.html b/doc/html/search/functions_74.html
new file mode 100644
index 000000000..1605901ee
--- /dev/null
+++ b/doc/html/search/functions_74.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_74.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/functions_74.js b/doc/html/search/functions_74.js
new file mode 100644
index 000000000..6b9dca5d7
--- /dev/null
+++ b/doc/html/search/functions_74.js
@@ -0,0 +1,35 @@
+var searchData=
+[
+ ['t',['t',['../language_8php.html#aae0c3638fb476ae1e31f8d242f5dac04',1,'language.php']]],
+ ['tag_5fdeliver',['tag_deliver',['../items_8php.html#ab1bce4261bcf75ad62753b498a144d17',1,'items.php']]],
+ ['tagadelic',['tagadelic',['../taxonomy_8php.html#aaf90ba8b839d6459065f39a4f1109b8a',1,'taxonomy.php']]],
+ ['tagblock',['tagblock',['../taxonomy_8php.html#ac21d1dff16d569e7d110167aea4e63c2',1,'taxonomy.php']]],
+ ['tagger_5fcontent',['tagger_content',['../tagger_8php.html#a0e4a3eb177d1684553c547503d67161c',1,'tagger.php']]],
+ ['tagrm_5fcontent',['tagrm_content',['../tagrm_8php.html#adfd4ea5b4d7fc6d9c9e042af5cd7d49a',1,'tagrm.php']]],
+ ['tagrm_5fpost',['tagrm_post',['../tagrm_8php.html#a1702f40aa53a2fa93deade1f609abe78',1,'tagrm.php']]],
+ ['tags_5fsort',['tags_sort',['../taxonomy_8php.html#aaeded36bcc983b35d9205fe5b6c18c43',1,'taxonomy.php']]],
+ ['template_5fengine',['template_engine',['../classApp.html#a94a1ed2dc493c58612d17035b74ae736',1,'App']]],
+ ['template_5fescape',['template_escape',['../template__processor_8php.html#ab2bcd8738f20f293636a6ae8e1099db5',1,'template_processor.php']]],
+ ['template_5funescape',['template_unescape',['../template__processor_8php.html#ac635bb19a5f6eadd6b0cddefdd537c1e',1,'template_processor.php']]],
+ ['term_5fquery',['term_query',['../taxonomy_8php.html#a7a913d19c77610da689be48fbbf6734c',1,'taxonomy.php']]],
+ ['terminate_5ffriendship',['terminate_friendship',['../Contact_8php.html#a38daa1c210b78385307123450ca9a1fc',1,'Contact.php']]],
+ ['termtype',['termtype',['../items_8php.html#ad34827ed330898456783fb14c7b46154',1,'items.php']]],
+ ['tgroup_5fcheck',['tgroup_check',['../items_8php.html#a88c6cf7649ac836fbbed82a7a0315110',1,'items.php']]],
+ ['theme_5fadmin',['theme_admin',['../view_2theme_2blogga_2php_2config_8php.html#a09cd81013505f83aea0771243a1e4e53',1,'theme_admin(&amp;$a):&#160;config.php'],['../view_2theme_2blogga_2view_2theme_2blog_2config_8php.html#a09cd81013505f83aea0771243a1e4e53',1,'theme_admin(&amp;$a):&#160;config.php']]],
+ ['theme_5fadmin_5fpost',['theme_admin_post',['../view_2theme_2blogga_2php_2config_8php.html#aef2da5582b7cb6b5f63e5ca5d69fd30b',1,'theme_admin_post(&amp;$a):&#160;config.php'],['../view_2theme_2blogga_2view_2theme_2blog_2config_8php.html#aef2da5582b7cb6b5f63e5ca5d69fd30b',1,'theme_admin_post(&amp;$a):&#160;config.php']]],
+ ['theme_5fattachments',['theme_attachments',['../text_8php.html#af9c9ac3f74c82dc60acfa404d0e9dc53',1,'text.php']]],
+ ['theme_5fcontent',['theme_content',['../view_2theme_2apw_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d',1,'theme_content(&amp;$a):&#160;config.php'],['../view_2theme_2blogga_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d',1,'theme_content(&amp;$a):&#160;config.php'],['../view_2theme_2blogga_2view_2theme_2blog_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d',1,'theme_content(&amp;$a):&#160;config.php'],['../view_2theme_2redbasic_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d',1,'theme_content(&amp;$a):&#160;config.php']]],
+ ['theme_5finclude',['theme_include',['../plugin_8php.html#a65fedcffbe03562ef844cabee37d34e2',1,'plugin.php']]],
+ ['theme_5fpost',['theme_post',['../view_2theme_2apw_2php_2config_8php.html#ad29461920cf03b9ce1428e21eb1f4ba6',1,'theme_post(&amp;$a):&#160;config.php'],['../view_2theme_2blogga_2php_2config_8php.html#ad29461920cf03b9ce1428e21eb1f4ba6',1,'theme_post(&amp;$a):&#160;config.php'],['../view_2theme_2blogga_2view_2theme_2blog_2config_8php.html#ad29461920cf03b9ce1428e21eb1f4ba6',1,'theme_post(&amp;$a):&#160;config.php'],['../view_2theme_2redbasic_2php_2config_8php.html#ad29461920cf03b9ce1428e21eb1f4ba6',1,'theme_post(&amp;$a):&#160;config.php']]],
+ ['theme_5fstatus',['theme_status',['../admin_8php.html#ad4f74f33944a98b56d2c8c7601f124a4',1,'admin.php']]],
+ ['thing_5fcontent',['thing_content',['../thing_8php.html#a24a35f1e64029a67fdbea94a776ae04b',1,'thing.php']]],
+ ['thing_5finit',['thing_init',['../thing_8php.html#a8be23b1d475ec3d9291999221c674c80',1,'thing.php']]],
+ ['timesel',['timesel',['../datetime_8php.html#a36d3d6dff8d76b5f295bb3d9c535a5b1',1,'datetime.php']]],
+ ['timezone_5fcmp',['timezone_cmp',['../datetime_8php.html#aa51b5a7ea4f931b23acbdfcea46e9865',1,'datetime.php']]],
+ ['title_5fis_5fbody',['title_is_body',['../items_8php.html#aa371905f0a211b307cb3f7188c6cba04',1,'items.php']]],
+ ['toggle_5fmobile_5finit',['toggle_mobile_init',['../toggle__mobile_8php.html#aca53ade8971802b45c31e722b22c6254',1,'toggle_mobile.php']]],
+ ['toggle_5fsafesearch_5finit',['toggle_safesearch_init',['../toggle__safesearch_8php.html#a23d5cfb2727a266e44993ffbf5595a79',1,'toggle_safesearch.php']]],
+ ['toggle_5ftheme',['toggle_theme',['../admin_8php.html#af81f081851791cd15e49e8ff6722dc27',1,'admin.php']]],
+ ['tryoembed',['tryoembed',['../bbcode_8php.html#a55b0cb6973f1ec731de0e726bcc0efa7',1,'bbcode.php']]],
+ ['tt',['tt',['../language_8php.html#ae310fb3880484ee1cc4faefe0c63c06d',1,'language.php']]]
+];
diff --git a/doc/html/search/functions_75.html b/doc/html/search/functions_75.html
new file mode 100644
index 000000000..a6c28fa65
--- /dev/null
+++ b/doc/html/search/functions_75.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_75.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/functions_75.js b/doc/html/search/functions_75.js
new file mode 100644
index 000000000..ef023b551
--- /dev/null
+++ b/doc/html/search/functions_75.js
@@ -0,0 +1,29 @@
+var searchData=
+[
+ ['uexport_5finit',['uexport_init',['../uexport_8php.html#a118920137dedebe0581623a2e57e7b0d',1,'uexport.php']]],
+ ['unamp',['unamp',['../text_8php.html#a29d6b804e368d3ef359ee295e96ed4c7',1,'text.php']]],
+ ['undo_5fpost_5ftagging',['undo_post_tagging',['../text_8php.html#a740ad03e00459039a2c0992246c4e727',1,'text.php']]],
+ ['unescape_5funderscores_5fin_5flinks',['unescape_underscores_in_links',['../bb2diaspora_8php.html#a599428bceb6f6d82a6a78cb66811f747',1,'bb2diaspora.php']]],
+ ['uninstall_5fplugin',['uninstall_plugin',['../plugin_8php.html#a093a9cb98f51e3643634bd8bc6ed6e76',1,'plugin.php']]],
+ ['unload_5fplugin',['unload_plugin',['../plugin_8php.html#a90538627db68605aeb6db17a8ead6523',1,'plugin.php']]],
+ ['unobscure',['unobscure',['../text_8php.html#a8264348059abd1d4d5bb521323d3b19a',1,'text.php']]],
+ ['unregister_5fhook',['unregister_hook',['../plugin_8php.html#a56f71fe5adf9586ce950523d8180443e',1,'plugin.php']]],
+ ['unxmlify',['unxmlify',['../text_8php.html#a1360fed7f918d859daaca1c9f384f9af',1,'text.php']]],
+ ['update_5fchannel_5fcontent',['update_channel_content',['../update__channel_8php.html#aca52a9da500f0db2f0a8666af5bc06ba',1,'update_channel.php']]],
+ ['update_5fcommunity_5fcontent',['update_community_content',['../update__community_8php.html#abdcc5c4ecebbe0b5fcba2755c69cb3b1',1,'update_community.php']]],
+ ['update_5fdirectory_5fentry',['update_directory_entry',['../dir__fns_8php.html#a44062d4b471d1e83f92f6c184585aa13',1,'dir_fns.php']]],
+ ['update_5fdisplay_5fcontent',['update_display_content',['../update__display_8php.html#aa36ac524059e209d5d75a03c16206246',1,'update_display.php']]],
+ ['update_5fimported_5fitem',['update_imported_item',['../zot_8php.html#a31aad56acf8ff8f2353e6ff8595544df',1,'zot.php']]],
+ ['update_5fmodtime',['update_modtime',['../zot_8php.html#ab319d1d9fff9c7775d9daef42d1f33dd',1,'zot.php']]],
+ ['update_5fnetwork_5fcontent',['update_network_content',['../update__network_8php.html#a8abf5b9f65af6a27ee2f9d7207ed1b41',1,'update_network.php']]],
+ ['update_5fqueue_5ftime',['update_queue_time',['../queue__fn_8php.html#a4c2876181f75a4a61e85b7f00dfdbba1',1,'queue_fn.php']]],
+ ['update_5fremote_5fid',['update_remote_id',['../items_8php.html#a2baa9e05f1e8aa3dd61c85803ae39bd6',1,'items.php']]],
+ ['update_5fsearch_5fcontent',['update_search_content',['../update__search_8php.html#ace4c3a23fa7d6922399e27c297a6ba52',1,'update_search.php']]],
+ ['update_5fsuggestions',['update_suggestions',['../socgraph_8php.html#a790690bb1a1d02483fe31632a160144d',1,'socgraph.php']]],
+ ['upgrade_5fbool_5fmessage',['upgrade_bool_message',['../plugin_8php.html#a754d7f53b3abc557b753c057dc4e021d',1,'plugin.php']]],
+ ['upgrade_5flink',['upgrade_link',['../plugin_8php.html#a4fc13e528367f510fcb6d8bbfc559040',1,'plugin.php']]],
+ ['upgrade_5fmessage',['upgrade_message',['../plugin_8php.html#a901657dd078e070516cf97285e0bada7',1,'plugin.php']]],
+ ['user_5fallow',['user_allow',['../account_8php.html#ac5c570a2d46446bad4dd2501e9c5a4b1',1,'account.php']]],
+ ['user_5fdeny',['user_deny',['../account_8php.html#ac1653efba62493b9d87513e1b6c04c83',1,'account.php']]],
+ ['user_5fremove',['user_remove',['../Contact_8php.html#a2fc191067dd571a79603c66b04b1ca15',1,'Contact.php']]]
+];
diff --git a/doc/html/search/functions_76.html b/doc/html/search/functions_76.html
new file mode 100644
index 000000000..e5263cc30
--- /dev/null
+++ b/doc/html/search/functions_76.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_76.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/functions_76.js b/doc/html/search/functions_76.js
new file mode 100644
index 000000000..7e2c42234
--- /dev/null
+++ b/doc/html/search/functions_76.js
@@ -0,0 +1,18 @@
+var searchData=
+[
+ ['valid_5femail',['valid_email',['../text_8php.html#a6a3d80a6c6fb234fd0bac44203b828eb',1,'text.php']]],
+ ['validate_5fchannelname',['validate_channelname',['../identity_8php.html#af2802bc13a00a17b867bba7978ba8f58',1,'identity.php']]],
+ ['validate_5femail',['validate_email',['../include_2network_8php.html#a897e7112d86eb95526cbd0bff9375f02',1,'network.php']]],
+ ['validate_5furl',['validate_url',['../include_2network_8php.html#a5caa264fab6d2b2344e6bd5b298b08f2',1,'network.php']]],
+ ['validateuserpass',['validateUserPass',['../classRedBasicAuth.html#a8dfd9a0953f8884723b421b7c1acf79b',1,'RedBasicAuth']]],
+ ['var_5freplace',['var_replace',['../classTemplate.html#abbc484016ddf5d818f55b823cae6feb0',1,'Template']]],
+ ['vcard_5ffrom_5fxchan',['vcard_from_xchan',['../Contact_8php.html#a6348a532c9d26cd1c9afbc9aa6aa8960',1,'Contact.php']]],
+ ['view_5finit',['view_init',['../view_8php.html#ac168f6c61a91ba2063f13b441c0ae96e',1,'view.php']]],
+ ['viewconnections_5fcontent',['viewconnections_content',['../viewconnections_8php.html#ab6c4d983e97b3a8a879567ff76507776',1,'viewconnections.php']]],
+ ['viewconnections_5finit',['viewconnections_init',['../viewconnections_8php.html#a00163d50b17568f7b0e48b1ca9ab7330',1,'viewconnections.php']]],
+ ['viewsrc_5fcontent',['viewsrc_content',['../viewsrc_8php.html#a6eff3d0c1d7d14b335c4edb785cd60a4',1,'viewsrc.php']]],
+ ['visible_5factivity',['visible_activity',['../conversation_8php.html#a7eeaaf44506815576f3bd80053ef52c3',1,'conversation.php']]],
+ ['vote_5fcontent',['vote_content',['../vote_8php.html#a6aa67489bf458ca5e3206e46dac68596',1,'vote.php']]],
+ ['vote_5finit',['vote_init',['../vote_8php.html#ae0c6610f40afbbc1f4fe6494c51fbab2',1,'vote.php']]],
+ ['vote_5fpost',['vote_post',['../vote_8php.html#a57a9516ee1b923b224e66dcc47377fb2',1,'vote.php']]]
+];
diff --git a/doc/html/search/functions_77.html b/doc/html/search/functions_77.html
new file mode 100644
index 000000000..add7295de
--- /dev/null
+++ b/doc/html/search/functions_77.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_77.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/functions_77.js b/doc/html/search/functions_77.js
new file mode 100644
index 000000000..90b12c339
--- /dev/null
+++ b/doc/html/search/functions_77.js
@@ -0,0 +1,35 @@
+var searchData=
+[
+ ['wall_5fattach_5fpost',['wall_attach_post',['../wall__attach_8php.html#a7385e970e93228d082f0fd7254f6e653',1,'wall_attach.php']]],
+ ['wall_5fupload_5fpost',['wall_upload_post',['../wall__upload_8php.html#a7cbe204244cf9e0380ee932263a74d8f',1,'wall_upload.php']]],
+ ['webfinger',['webfinger',['../include_2network_8php.html#a8122356933bcd6b0a8567e8e15ae5cc5',1,'network.php']]],
+ ['webfinger_5fcontent',['webfinger_content',['../webfinger_8php.html#a17dd28db6d390194bf9ecb809739d1d3',1,'webfinger.php']]],
+ ['webfinger_5fdfrn',['webfinger_dfrn',['../include_2network_8php.html#adf6008b38c555e98e7ed10da9ede2335',1,'network.php']]],
+ ['webpages_5fcontent',['webpages_content',['../webpages_8php.html#af3b7397d4abc153e3d2147740ee1a41d',1,'webpages.php']]],
+ ['wfinger_5finit',['wfinger_init',['../wfinger_8php.html#ae21e50c8d0a5f3c9be9f43a4e519acd3',1,'wfinger.php']]],
+ ['what_5fnext',['what_next',['../setup_8php.html#aea1ebdda58ec938f4e7b31aa5c5f6b58',1,'setup.php']]],
+ ['widget_5faffinity',['widget_affinity',['../widgets_8php.html#add9b24d3304e529a7975e96122315554',1,'widgets.php']]],
+ ['widget_5farchive',['widget_archive',['../widgets_8php.html#a7b1e357b5a2027718470b77ec921fc65',1,'widgets.php']]],
+ ['widget_5fcategories',['widget_categories',['../widgets_8php.html#af37fdad3b2e861d860a4a8c4d8a76c0b',1,'widgets.php']]],
+ ['widget_5fcollections',['widget_collections',['../widgets_8php.html#aa189a07241246d97efbee29f1c6a6f7f',1,'widgets.php']]],
+ ['widget_5fdesign_5ftools',['widget_design_tools',['../widgets_8php.html#a145ff35319cfa47a9cc07f9425bd674b',1,'widgets.php']]],
+ ['widget_5fdirsafemode',['widget_dirsafemode',['../widgets_8php.html#a268b01ce1ab8fe2cb346cb769b9d1091',1,'widgets.php']]],
+ ['widget_5fdirsort',['widget_dirsort',['../widgets_8php.html#a95c06bc9be133e89768746302d2ac395',1,'widgets.php']]],
+ ['widget_5fdirtags',['widget_dirtags',['../widgets_8php.html#a08035db02ff6a23260146b4c64153422',1,'widgets.php']]],
+ ['widget_5ffiler',['widget_filer',['../widgets_8php.html#a5ab3b64496e02cab56429978ad55f1c0',1,'widgets.php']]],
+ ['widget_5ffindpeople',['widget_findpeople',['../widgets_8php.html#ade630b19fb4c622b7b2f6f8ef89eefa2',1,'widgets.php']]],
+ ['widget_5ffollow',['widget_follow',['../widgets_8php.html#ad1bf7aa69e8d100d95faba17c7bc91cd',1,'widgets.php']]],
+ ['widget_5ffullprofile',['widget_fullprofile',['../widgets_8php.html#a70442dfa079312d9d5e5ee01be51a165',1,'widgets.php']]],
+ ['widget_5fmailmenu',['widget_mailmenu',['../widgets_8php.html#afa2e55a78f95667a6da082efac7fec74',1,'widgets.php']]],
+ ['widget_5fmenu_5fpreview',['widget_menu_preview',['../widgets_8php.html#a3bdfb81bf9a8ddf219924fa7eaf22013',1,'widgets.php']]],
+ ['widget_5fnotes',['widget_notes',['../widgets_8php.html#a45ea061dabe9a8372e4ca3b9e5714256',1,'widgets.php']]],
+ ['widget_5fphoto_5falbums',['widget_photo_albums',['../widgets_8php.html#a702e2fc0adc9b615999eca18b7311b5e',1,'widgets.php']]],
+ ['widget_5fprofile',['widget_profile',['../widgets_8php.html#abd2e508a2a0b911c4a838e3cb7599923',1,'widgets.php']]],
+ ['widget_5fsavedsearch',['widget_savedsearch',['../widgets_8php.html#a94203eb9bcd63cbdecbbcb15163598d8',1,'widgets.php']]],
+ ['widget_5fsettings_5fmenu',['widget_settings_menu',['../widgets_8php.html#aaa73bcf1702eaadd9dcd253502f55e01',1,'widgets.php']]],
+ ['widget_5fsuggestions',['widget_suggestions',['../widgets_8php.html#a0d404276fedc59f5038cf5c085028326',1,'widgets.php']]],
+ ['widget_5ftagcloud',['widget_tagcloud',['../widgets_8php.html#a6dbc227aac750774284ee39c45f0a200',1,'widgets.php']]],
+ ['widget_5ftagcloud_5fwall',['widget_tagcloud_wall',['../widgets_8php.html#ae4ced69d83dbdd9e6b51660d9eba8653',1,'widgets.php']]],
+ ['widget_5fvcard',['widget_vcard',['../widgets_8php.html#abe03366fd22fd27d683518fa0765da50',1,'widgets.php']]],
+ ['writepages_5fwidget',['writepages_widget',['../page__widgets_8php.html#a1a1e729da27f252cab6678288a17958f',1,'page_widgets.php']]]
+];
diff --git a/doc/html/search/functions_78.html b/doc/html/search/functions_78.html
new file mode 100644
index 000000000..7f647970f
--- /dev/null
+++ b/doc/html/search/functions_78.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_78.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/functions_78.js b/doc/html/search/functions_78.js
new file mode 100644
index 000000000..97e977ea8
--- /dev/null
+++ b/doc/html/search/functions_78.js
@@ -0,0 +1,13 @@
+var searchData=
+[
+ ['x',['x',['../boot_8php.html#a01353c9abebc3544ea080ac161729632',1,'boot.php']]],
+ ['xchan_5fcontent',['xchan_content',['../xchan_8php.html#a9853348bf1a35c644460221ba75edc2d',1,'xchan.php']]],
+ ['xchan_5fmail_5fquery',['xchan_mail_query',['../text_8php.html#a543447c5ed766535221e2d9636b379ee',1,'text.php']]],
+ ['xchan_5fquery',['xchan_query',['../text_8php.html#a36a2e5d418ee81140f25c4233cfecd1f',1,'text.php']]],
+ ['xml2array',['xml2array',['../include_2network_8php.html#a99353baabbc3e0584b85eb79ee802cff',1,'network.php']]],
+ ['xml_5fstatus',['xml_status',['../include_2network_8php.html#a9e9da2aafb806c98ecdc318604e60dc6',1,'network.php']]],
+ ['xmlify',['xmlify',['../text_8php.html#aaed4413ed8918838b517e3b2fafaea0d',1,'text.php']]],
+ ['xpost_5fto_5fhtml2bbcode',['xpost_to_html2bbcode',['../post__to__red_8php.html#af2713018a2dc97e88f121fc6215beb66',1,'post_to_red.php']]],
+ ['xrd_5finit',['xrd_init',['../xrd_8php.html#aee3cf087968e4a0ff3a87de16eb23270',1,'xrd.php']]],
+ ['xref_5finit',['xref_init',['../xref_8php.html#a9bee399213b8de8226b0d60834307473',1,'xref.php']]]
+];
diff --git a/doc/html/search/functions_7a.html b/doc/html/search/functions_7a.html
new file mode 100644
index 000000000..e23b42fb0
--- /dev/null
+++ b/doc/html/search/functions_7a.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_7a.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/functions_7a.js b/doc/html/search/functions_7a.js
new file mode 100644
index 000000000..ed0141186
--- /dev/null
+++ b/doc/html/search/functions_7a.js
@@ -0,0 +1,31 @@
+var searchData=
+[
+ ['z_5fbirthday',['z_birthday',['../datetime_8php.html#ab55e545b72ec8c097e052ea7d373491f',1,'datetime.php']]],
+ ['z_5ffetch_5furl',['z_fetch_url',['../include_2network_8php.html#aafd06c0a75402aefb06cfb9f9740fa37',1,'network.php']]],
+ ['z_5finput_5ffilter',['z_input_filter',['../text_8php.html#a324c58f37f6acdf9cd1922aa76077d9f',1,'text.php']]],
+ ['z_5fmime_5fcontent_5ftype',['z_mime_content_type',['../include_2attach_8php.html#a6fdd92775f31c07d2863e16e0026018a',1,'attach.php']]],
+ ['z_5fpath',['z_path',['../boot_8php.html#aba208673515cbb8a55e5fa4a1da99fda',1,'boot.php']]],
+ ['z_5fpost_5furl',['z_post_url',['../include_2network_8php.html#a9129fd55e7fc175b4ea9a195cccc16bc',1,'network.php']]],
+ ['z_5freaddir',['z_readdir',['../include_2attach_8php.html#aeb07968990e66a88c95483ca09a7f909',1,'attach.php']]],
+ ['z_5froot',['z_root',['../boot_8php.html#add517a0958ac684792c62142a3877f81',1,'boot.php']]],
+ ['zfinger_5finit',['zfinger_init',['../zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0',1,'zfinger.php']]],
+ ['zid',['zid',['../identity_8php.html#a5b815330f3d177ab383af37a6c12e532',1,'identity.php']]],
+ ['zid_5finit',['zid_init',['../identity_8php.html#a680fbafc2db023c5b1309e0180e81315',1,'identity.php']]],
+ ['zidify_5fcallback',['zidify_callback',['../text_8php.html#a405afe814a23f3bd94d826101aa168ab',1,'text.php']]],
+ ['zidify_5fimg_5fcallback',['zidify_img_callback',['../text_8php.html#ab4a4c3d4700bc219bb84f33b499314f4',1,'text.php']]],
+ ['zidify_5flinks',['zidify_links',['../text_8php.html#a29988052f3944111def3b6aaf2c7a8f6',1,'text.php']]],
+ ['zot_5fbuild_5fpacket',['zot_build_packet',['../zot_8php.html#a3862b3161b2c8557dc1a95020179bd81',1,'zot.php']]],
+ ['zot_5ffeed',['zot_feed',['../items_8php.html#a004e89d86b0f29b2c4da20108ecc4091',1,'items.php']]],
+ ['zot_5ffetch',['zot_fetch',['../zot_8php.html#a61cdc1ec843663c423ed2d8160ae5aea',1,'zot.php']]],
+ ['zot_5ffinger',['zot_finger',['../zot_8php.html#a95528377d7303131958c9f0b7158fdce',1,'zot.php']]],
+ ['zot_5fget_5fhublocs',['zot_get_hublocs',['../zot_8php.html#ae7cec2b417b5858fd4a41070f843d1d7',1,'zot.php']]],
+ ['zot_5fgethub',['zot_gethub',['../zot_8php.html#a55056e863a7860bc0cf922e78fcce073',1,'zot.php']]],
+ ['zot_5fimport',['zot_import',['../zot_8php.html#aeea071f17e306fe3d0c488551906bfab',1,'zot.php']]],
+ ['zot_5fnew_5fuid',['zot_new_uid',['../zot_8php.html#ab22d67660702056bf3f4696dcebf5ce7',1,'zot.php']]],
+ ['zot_5fprocess_5fresponse',['zot_process_response',['../zot_8php.html#a928f5643ca66ae9635d85aeb2be62e03',1,'zot.php']]],
+ ['zot_5frefresh',['zot_refresh',['../zot_8php.html#a7b23bfb31d4491231e1e73bdc077240d',1,'zot.php']]],
+ ['zot_5fregister_5fhub',['zot_register_hub',['../zot_8php.html#a5bcdfef419b16075a0eca990956223dc',1,'zot.php']]],
+ ['zot_5fzot',['zot_zot',['../zot_8php.html#ab3e9b99ddb11353f37f265a05bb42142',1,'zot.php']]],
+ ['zotfeed_5finit',['zotfeed_init',['../zotfeed_8php.html#a24dfc23d366e7f840cf2847d0c1c8eac',1,'zotfeed.php']]],
+ ['zping_5fcontent',['zping_content',['../zping_8php.html#a4d3a6b0b8b04ed6469015823e615ee75',1,'zping.php']]]
+];
diff --git a/doc/html/search/mag_sel.png b/doc/html/search/mag_sel.png
new file mode 100644
index 000000000..81f6040a2
--- /dev/null
+++ b/doc/html/search/mag_sel.png
Binary files differ
diff --git a/doc/html/search/namespaces_61.html b/doc/html/search/namespaces_61.html
new file mode 100644
index 000000000..05b64569f
--- /dev/null
+++ b/doc/html/search/namespaces_61.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="namespaces_61.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/namespaces_61.js b/doc/html/search/namespaces_61.js
new file mode 100644
index 000000000..3e7051957
--- /dev/null
+++ b/doc/html/search/namespaces_61.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['acl_5fselectors',['acl_selectors',['../namespaceacl__selectors.html',1,'']]]
+];
diff --git a/doc/html/search/namespaces_66.html b/doc/html/search/namespaces_66.html
new file mode 100644
index 000000000..eeb821dc9
--- /dev/null
+++ b/doc/html/search/namespaces_66.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="namespaces_66.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/namespaces_66.js b/doc/html/search/namespaces_66.js
new file mode 100644
index 000000000..e9fe2106c
--- /dev/null
+++ b/doc/html/search/namespaces_66.js
@@ -0,0 +1,5 @@
+var searchData=
+[
+ ['friendica',['Friendica',['../namespaceFriendica.html',1,'']]],
+ ['friendica_2dto_2dsmarty_2dtpl',['friendica-to-smarty-tpl',['../namespacefriendica-to-smarty-tpl.html',1,'']]]
+];
diff --git a/doc/html/search/namespaces_75.html b/doc/html/search/namespaces_75.html
new file mode 100644
index 000000000..185eb0b07
--- /dev/null
+++ b/doc/html/search/namespaces_75.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="namespaces_75.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/namespaces_75.js b/doc/html/search/namespaces_75.js
new file mode 100644
index 000000000..677307359
--- /dev/null
+++ b/doc/html/search/namespaces_75.js
@@ -0,0 +1,5 @@
+var searchData=
+[
+ ['updatetpl',['updatetpl',['../namespaceupdatetpl.html',1,'']]],
+ ['util',['util',['../namespaceutil.html',1,'']]]
+];
diff --git a/doc/html/search/nomatches.html b/doc/html/search/nomatches.html
new file mode 100644
index 000000000..b1ded27e9
--- /dev/null
+++ b/doc/html/search/nomatches.html
@@ -0,0 +1,12 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="NoMatches">No Matches</div>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/pages_61.html b/doc/html/search/pages_61.html
new file mode 100644
index 000000000..50c3255a8
--- /dev/null
+++ b/doc/html/search/pages_61.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="pages_61.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/pages_61.js b/doc/html/search/pages_61.js
new file mode 100644
index 000000000..61eb0e85f
--- /dev/null
+++ b/doc/html/search/pages_61.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['apw',['apw',['../md_README.html',1,'']]]
+];
diff --git a/doc/html/search/pages_63.html b/doc/html/search/pages_63.html
new file mode 100644
index 000000000..8a7aaf9e2
--- /dev/null
+++ b/doc/html/search/pages_63.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="pages_63.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/pages_63.js b/doc/html/search/pages_63.js
new file mode 100644
index 000000000..85cc4ab15
--- /dev/null
+++ b/doc/html/search/pages_63.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['cli_20config_20utility',['CLI config utility',['../md_config.html',1,'']]]
+];
diff --git a/doc/html/search/pages_66.html b/doc/html/search/pages_66.html
new file mode 100644
index 000000000..b5d700d10
--- /dev/null
+++ b/doc/html/search/pages_66.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="pages_66.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/pages_66.js b/doc/html/search/pages_66.js
new file mode 100644
index 000000000..3bc9f4b01
--- /dev/null
+++ b/doc/html/search/pages_66.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['fresh_20_2d_20the_20freaking_20red_20shell',['Fresh - The Freaking REd Shell',['../md_fresh.html',1,'']]]
+];
diff --git a/doc/html/search/pages_72.html b/doc/html/search/pages_72.html
new file mode 100644
index 000000000..5e9722171
--- /dev/null
+++ b/doc/html/search/pages_72.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="pages_72.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/pages_72.js b/doc/html/search/pages_72.js
new file mode 100644
index 000000000..6d650d56f
--- /dev/null
+++ b/doc/html/search/pages_72.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['redstrap_20theme',['Redstrap theme',['../md_README.html',1,'']]]
+];
diff --git a/doc/html/search/search.css b/doc/html/search/search.css
new file mode 100644
index 000000000..5b208eddd
--- /dev/null
+++ b/doc/html/search/search.css
@@ -0,0 +1,271 @@
+/*---------------- Search Box */
+
+#FSearchBox {
+ float: left;
+}
+
+#MSearchBox {
+ white-space : nowrap;
+ position: absolute;
+ float: none;
+ display: inline;
+ margin-top: 8px;
+ right: 0px;
+ width: 170px;
+ z-index: 102;
+ background-color: white;
+}
+
+#MSearchBox .left
+{
+ display:block;
+ position:absolute;
+ left:10px;
+ width:20px;
+ height:19px;
+ background:url('search_l.png') no-repeat;
+ background-position:right;
+}
+
+#MSearchSelect {
+ display:block;
+ position:absolute;
+ width:20px;
+ height:19px;
+}
+
+.left #MSearchSelect {
+ left:4px;
+}
+
+.right #MSearchSelect {
+ right:5px;
+}
+
+#MSearchField {
+ display:block;
+ position:absolute;
+ height:19px;
+ background:url('search_m.png') repeat-x;
+ border:none;
+ width:116px;
+ margin-left:20px;
+ padding-left:4px;
+ color: #909090;
+ outline: none;
+ font: 9pt Arial, Verdana, sans-serif;
+}
+
+#FSearchBox #MSearchField {
+ margin-left:15px;
+}
+
+#MSearchBox .right {
+ display:block;
+ position:absolute;
+ right:10px;
+ top:0px;
+ width:20px;
+ height:19px;
+ background:url('search_r.png') no-repeat;
+ background-position:left;
+}
+
+#MSearchClose {
+ display: none;
+ position: absolute;
+ top: 4px;
+ background : none;
+ border: none;
+ margin: 0px 4px 0px 0px;
+ padding: 0px 0px;
+ outline: none;
+}
+
+.left #MSearchClose {
+ left: 6px;
+}
+
+.right #MSearchClose {
+ right: 2px;
+}
+
+.MSearchBoxActive #MSearchField {
+ color: #000000;
+}
+
+/*---------------- Search filter selection */
+
+#MSearchSelectWindow {
+ display: none;
+ position: absolute;
+ left: 0; top: 0;
+ border: 1px solid #90A5CE;
+ background-color: #F9FAFC;
+ z-index: 1;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ -moz-border-radius: 4px;
+ -webkit-border-top-left-radius: 4px;
+ -webkit-border-top-right-radius: 4px;
+ -webkit-border-bottom-left-radius: 4px;
+ -webkit-border-bottom-right-radius: 4px;
+ -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+}
+
+.SelectItem {
+ font: 8pt Arial, Verdana, sans-serif;
+ padding-left: 2px;
+ padding-right: 12px;
+ border: 0px;
+}
+
+span.SelectionMark {
+ margin-right: 4px;
+ font-family: monospace;
+ outline-style: none;
+ text-decoration: none;
+}
+
+a.SelectItem {
+ display: block;
+ outline-style: none;
+ color: #000000;
+ text-decoration: none;
+ padding-left: 6px;
+ padding-right: 12px;
+}
+
+a.SelectItem:focus,
+a.SelectItem:active {
+ color: #000000;
+ outline-style: none;
+ text-decoration: none;
+}
+
+a.SelectItem:hover {
+ color: #FFFFFF;
+ background-color: #3D578C;
+ outline-style: none;
+ text-decoration: none;
+ cursor: pointer;
+ display: block;
+}
+
+/*---------------- Search results window */
+
+iframe#MSearchResults {
+ width: 60ex;
+ height: 15em;
+}
+
+#MSearchResultsWindow {
+ display: none;
+ position: absolute;
+ left: 0; top: 0;
+ border: 1px solid #000;
+ background-color: #EEF1F7;
+}
+
+/* ----------------------------------- */
+
+
+#SRIndex {
+ clear:both;
+ padding-bottom: 15px;
+}
+
+.SREntry {
+ font-size: 10pt;
+ padding-left: 1ex;
+}
+
+.SRPage .SREntry {
+ font-size: 8pt;
+ padding: 1px 5px;
+}
+
+body.SRPage {
+ margin: 5px 2px;
+}
+
+.SRChildren {
+ padding-left: 3ex; padding-bottom: .5em
+}
+
+.SRPage .SRChildren {
+ display: none;
+}
+
+.SRSymbol {
+ font-weight: bold;
+ color: #425E97;
+ font-family: Arial, Verdana, sans-serif;
+ text-decoration: none;
+ outline: none;
+}
+
+a.SRScope {
+ display: block;
+ color: #425E97;
+ font-family: Arial, Verdana, sans-serif;
+ text-decoration: none;
+ outline: none;
+}
+
+a.SRSymbol:focus, a.SRSymbol:active,
+a.SRScope:focus, a.SRScope:active {
+ text-decoration: underline;
+}
+
+span.SRScope {
+ padding-left: 4px;
+}
+
+.SRPage .SRStatus {
+ padding: 2px 5px;
+ font-size: 8pt;
+ font-style: italic;
+}
+
+.SRResult {
+ display: none;
+}
+
+DIV.searchresults {
+ margin-left: 10px;
+ margin-right: 10px;
+}
+
+/*---------------- External search page results */
+
+.searchresult {
+ background-color: #F0F3F8;
+}
+
+.pages b {
+ color: white;
+ padding: 5px 5px 3px 5px;
+ background-image: url("../tab_a.png");
+ background-repeat: repeat-x;
+ text-shadow: 0 1px 1px #000000;
+}
+
+.pages {
+ line-height: 17px;
+ margin-left: 4px;
+ text-decoration: none;
+}
+
+.hl {
+ font-weight: bold;
+}
+
+#searchresults {
+ margin-bottom: 20px;
+}
+
+.searchpages {
+ margin-top: 10px;
+}
+
diff --git a/doc/html/search/search.js b/doc/html/search/search.js
new file mode 100644
index 000000000..8759ed0f9
--- /dev/null
+++ b/doc/html/search/search.js
@@ -0,0 +1,807 @@
+// Search script generated by doxygen
+// Copyright (C) 2009 by Dimitri van Heesch.
+
+// The code in this file is loosly based on main.js, part of Natural Docs,
+// which is Copyright (C) 2003-2008 Greg Valure
+// Natural Docs is licensed under the GPL.
+
+var indexSectionsWithContent =
+{
+ 0: "0000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000010111111111111111111111111010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ 1: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111001000000101010000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ 2: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100001000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ 3: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010111111111001111111111111010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ 4: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010111111111111111111111111010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ 5: "0000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000101111111111111101111011010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ 6: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
+};
+
+var indexSectionNames =
+{
+ 0: "all",
+ 1: "classes",
+ 2: "namespaces",
+ 3: "files",
+ 4: "functions",
+ 5: "variables",
+ 6: "pages"
+};
+
+function convertToId(search)
+{
+ var result = '';
+ for (i=0;i<search.length;i++)
+ {
+ var c = search.charAt(i);
+ var cn = c.charCodeAt(0);
+ if (c.match(/[a-z0-9]/))
+ {
+ result+=c;
+ }
+ else if (cn<16)
+ {
+ result+="_0"+cn.toString(16);
+ }
+ else
+ {
+ result+="_"+cn.toString(16);
+ }
+ }
+ return result;
+}
+
+function getXPos(item)
+{
+ var x = 0;
+ if (item.offsetWidth)
+ {
+ while (item && item!=document.body)
+ {
+ x += item.offsetLeft;
+ item = item.offsetParent;
+ }
+ }
+ return x;
+}
+
+function getYPos(item)
+{
+ var y = 0;
+ if (item.offsetWidth)
+ {
+ while (item && item!=document.body)
+ {
+ y += item.offsetTop;
+ item = item.offsetParent;
+ }
+ }
+ return y;
+}
+
+/* A class handling everything associated with the search panel.
+
+ Parameters:
+ name - The name of the global variable that will be
+ storing this instance. Is needed to be able to set timeouts.
+ resultPath - path to use for external files
+*/
+function SearchBox(name, resultsPath, inFrame, label)
+{
+ if (!name || !resultsPath) { alert("Missing parameters to SearchBox."); }
+
+ // ---------- Instance variables
+ this.name = name;
+ this.resultsPath = resultsPath;
+ this.keyTimeout = 0;
+ this.keyTimeoutLength = 500;
+ this.closeSelectionTimeout = 300;
+ this.lastSearchValue = "";
+ this.lastResultsPage = "";
+ this.hideTimeout = 0;
+ this.searchIndex = 0;
+ this.searchActive = false;
+ this.insideFrame = inFrame;
+ this.searchLabel = label;
+
+ // ----------- DOM Elements
+
+ this.DOMSearchField = function()
+ { return document.getElementById("MSearchField"); }
+
+ this.DOMSearchSelect = function()
+ { return document.getElementById("MSearchSelect"); }
+
+ this.DOMSearchSelectWindow = function()
+ { return document.getElementById("MSearchSelectWindow"); }
+
+ this.DOMPopupSearchResults = function()
+ { return document.getElementById("MSearchResults"); }
+
+ this.DOMPopupSearchResultsWindow = function()
+ { return document.getElementById("MSearchResultsWindow"); }
+
+ this.DOMSearchClose = function()
+ { return document.getElementById("MSearchClose"); }
+
+ this.DOMSearchBox = function()
+ { return document.getElementById("MSearchBox"); }
+
+ // ------------ Event Handlers
+
+ // Called when focus is added or removed from the search field.
+ this.OnSearchFieldFocus = function(isActive)
+ {
+ this.Activate(isActive);
+ }
+
+ this.OnSearchSelectShow = function()
+ {
+ var searchSelectWindow = this.DOMSearchSelectWindow();
+ var searchField = this.DOMSearchSelect();
+
+ if (this.insideFrame)
+ {
+ var left = getXPos(searchField);
+ var top = getYPos(searchField);
+ left += searchField.offsetWidth + 6;
+ top += searchField.offsetHeight;
+
+ // show search selection popup
+ searchSelectWindow.style.display='block';
+ left -= searchSelectWindow.offsetWidth;
+ searchSelectWindow.style.left = left + 'px';
+ searchSelectWindow.style.top = top + 'px';
+ }
+ else
+ {
+ var left = getXPos(searchField);
+ var top = getYPos(searchField);
+ top += searchField.offsetHeight;
+
+ // show search selection popup
+ searchSelectWindow.style.display='block';
+ searchSelectWindow.style.left = left + 'px';
+ searchSelectWindow.style.top = top + 'px';
+ }
+
+ // stop selection hide timer
+ if (this.hideTimeout)
+ {
+ clearTimeout(this.hideTimeout);
+ this.hideTimeout=0;
+ }
+ return false; // to avoid "image drag" default event
+ }
+
+ this.OnSearchSelectHide = function()
+ {
+ this.hideTimeout = setTimeout(this.name +".CloseSelectionWindow()",
+ this.closeSelectionTimeout);
+ }
+
+ // Called when the content of the search field is changed.
+ this.OnSearchFieldChange = function(evt)
+ {
+ if (this.keyTimeout) // kill running timer
+ {
+ clearTimeout(this.keyTimeout);
+ this.keyTimeout = 0;
+ }
+
+ var e = (evt) ? evt : window.event; // for IE
+ if (e.keyCode==40 || e.keyCode==13)
+ {
+ if (e.shiftKey==1)
+ {
+ this.OnSearchSelectShow();
+ var win=this.DOMSearchSelectWindow();
+ for (i=0;i<win.childNodes.length;i++)
+ {
+ var child = win.childNodes[i]; // get span within a
+ if (child.className=='SelectItem')
+ {
+ child.focus();
+ return;
+ }
+ }
+ return;
+ }
+ else if (window.frames.MSearchResults.searchResults)
+ {
+ var elem = window.frames.MSearchResults.searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+ }
+ else if (e.keyCode==27) // Escape out of the search field
+ {
+ this.DOMSearchField().blur();
+ this.DOMPopupSearchResultsWindow().style.display = 'none';
+ this.DOMSearchClose().style.display = 'none';
+ this.lastSearchValue = '';
+ this.Activate(false);
+ return;
+ }
+
+ // strip whitespaces
+ var searchValue = this.DOMSearchField().value.replace(/ +/g, "");
+
+ if (searchValue != this.lastSearchValue) // search value has changed
+ {
+ if (searchValue != "") // non-empty search
+ {
+ // set timer for search update
+ this.keyTimeout = setTimeout(this.name + '.Search()',
+ this.keyTimeoutLength);
+ }
+ else // empty search field
+ {
+ this.DOMPopupSearchResultsWindow().style.display = 'none';
+ this.DOMSearchClose().style.display = 'none';
+ this.lastSearchValue = '';
+ }
+ }
+ }
+
+ this.SelectItemCount = function(id)
+ {
+ var count=0;
+ var win=this.DOMSearchSelectWindow();
+ for (i=0;i<win.childNodes.length;i++)
+ {
+ var child = win.childNodes[i]; // get span within a
+ if (child.className=='SelectItem')
+ {
+ count++;
+ }
+ }
+ return count;
+ }
+
+ this.SelectItemSet = function(id)
+ {
+ var i,j=0;
+ var win=this.DOMSearchSelectWindow();
+ for (i=0;i<win.childNodes.length;i++)
+ {
+ var child = win.childNodes[i]; // get span within a
+ if (child.className=='SelectItem')
+ {
+ var node = child.firstChild;
+ if (j==id)
+ {
+ node.innerHTML='&#8226;';
+ }
+ else
+ {
+ node.innerHTML='&#160;';
+ }
+ j++;
+ }
+ }
+ }
+
+ // Called when an search filter selection is made.
+ // set item with index id as the active item
+ this.OnSelectItem = function(id)
+ {
+ this.searchIndex = id;
+ this.SelectItemSet(id);
+ var searchValue = this.DOMSearchField().value.replace(/ +/g, "");
+ if (searchValue!="" && this.searchActive) // something was found -> do a search
+ {
+ this.Search();
+ }
+ }
+
+ this.OnSearchSelectKey = function(evt)
+ {
+ var e = (evt) ? evt : window.event; // for IE
+ if (e.keyCode==40 && this.searchIndex<this.SelectItemCount()) // Down
+ {
+ this.searchIndex++;
+ this.OnSelectItem(this.searchIndex);
+ }
+ else if (e.keyCode==38 && this.searchIndex>0) // Up
+ {
+ this.searchIndex--;
+ this.OnSelectItem(this.searchIndex);
+ }
+ else if (e.keyCode==13 || e.keyCode==27)
+ {
+ this.OnSelectItem(this.searchIndex);
+ this.CloseSelectionWindow();
+ this.DOMSearchField().focus();
+ }
+ return false;
+ }
+
+ // --------- Actions
+
+ // Closes the results window.
+ this.CloseResultsWindow = function()
+ {
+ this.DOMPopupSearchResultsWindow().style.display = 'none';
+ this.DOMSearchClose().style.display = 'none';
+ this.Activate(false);
+ }
+
+ this.CloseSelectionWindow = function()
+ {
+ this.DOMSearchSelectWindow().style.display = 'none';
+ }
+
+ // Performs a search.
+ this.Search = function()
+ {
+ this.keyTimeout = 0;
+
+ // strip leading whitespace
+ var searchValue = this.DOMSearchField().value.replace(/^ +/, "");
+
+ var code = searchValue.toLowerCase().charCodeAt(0);
+ var hexCode;
+ if (code<16)
+ {
+ hexCode="0"+code.toString(16);
+ }
+ else
+ {
+ hexCode=code.toString(16);
+ }
+
+ var resultsPage;
+ var resultsPageWithSearch;
+ var hasResultsPage;
+
+ if (indexSectionsWithContent[this.searchIndex].charAt(code) == '1')
+ {
+ resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + '.html';
+ resultsPageWithSearch = resultsPage+'?'+escape(searchValue);
+ hasResultsPage = true;
+ }
+ else // nothing available for this search term
+ {
+ resultsPage = this.resultsPath + '/nomatches.html';
+ resultsPageWithSearch = resultsPage;
+ hasResultsPage = false;
+ }
+
+ window.frames.MSearchResults.location = resultsPageWithSearch;
+ var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow();
+
+ if (domPopupSearchResultsWindow.style.display!='block')
+ {
+ var domSearchBox = this.DOMSearchBox();
+ this.DOMSearchClose().style.display = 'inline';
+ if (this.insideFrame)
+ {
+ var domPopupSearchResults = this.DOMPopupSearchResults();
+ domPopupSearchResultsWindow.style.position = 'relative';
+ domPopupSearchResultsWindow.style.display = 'block';
+ var width = document.body.clientWidth - 8; // the -8 is for IE :-(
+ domPopupSearchResultsWindow.style.width = width + 'px';
+ domPopupSearchResults.style.width = width + 'px';
+ }
+ else
+ {
+ var domPopupSearchResults = this.DOMPopupSearchResults();
+ var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth;
+ var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1;
+ domPopupSearchResultsWindow.style.display = 'block';
+ left -= domPopupSearchResults.offsetWidth;
+ domPopupSearchResultsWindow.style.top = top + 'px';
+ domPopupSearchResultsWindow.style.left = left + 'px';
+ }
+ }
+
+ this.lastSearchValue = searchValue;
+ this.lastResultsPage = resultsPage;
+ }
+
+ // -------- Activation Functions
+
+ // Activates or deactivates the search panel, resetting things to
+ // their default values if necessary.
+ this.Activate = function(isActive)
+ {
+ if (isActive || // open it
+ this.DOMPopupSearchResultsWindow().style.display == 'block'
+ )
+ {
+ this.DOMSearchBox().className = 'MSearchBoxActive';
+
+ var searchField = this.DOMSearchField();
+
+ if (searchField.value == this.searchLabel) // clear "Search" term upon entry
+ {
+ searchField.value = '';
+ this.searchActive = true;
+ }
+ }
+ else if (!isActive) // directly remove the panel
+ {
+ this.DOMSearchBox().className = 'MSearchBoxInactive';
+ this.DOMSearchField().value = this.searchLabel;
+ this.searchActive = false;
+ this.lastSearchValue = ''
+ this.lastResultsPage = '';
+ }
+ }
+}
+
+// -----------------------------------------------------------------------
+
+// The class that handles everything on the search results page.
+function SearchResults(name)
+{
+ // The number of matches from the last run of <Search()>.
+ this.lastMatchCount = 0;
+ this.lastKey = 0;
+ this.repeatOn = false;
+
+ // Toggles the visibility of the passed element ID.
+ this.FindChildElement = function(id)
+ {
+ var parentElement = document.getElementById(id);
+ var element = parentElement.firstChild;
+
+ while (element && element!=parentElement)
+ {
+ if (element.nodeName == 'DIV' && element.className == 'SRChildren')
+ {
+ return element;
+ }
+
+ if (element.nodeName == 'DIV' && element.hasChildNodes())
+ {
+ element = element.firstChild;
+ }
+ else if (element.nextSibling)
+ {
+ element = element.nextSibling;
+ }
+ else
+ {
+ do
+ {
+ element = element.parentNode;
+ }
+ while (element && element!=parentElement && !element.nextSibling);
+
+ if (element && element!=parentElement)
+ {
+ element = element.nextSibling;
+ }
+ }
+ }
+ }
+
+ this.Toggle = function(id)
+ {
+ var element = this.FindChildElement(id);
+ if (element)
+ {
+ if (element.style.display == 'block')
+ {
+ element.style.display = 'none';
+ }
+ else
+ {
+ element.style.display = 'block';
+ }
+ }
+ }
+
+ // Searches for the passed string. If there is no parameter,
+ // it takes it from the URL query.
+ //
+ // Always returns true, since other documents may try to call it
+ // and that may or may not be possible.
+ this.Search = function(search)
+ {
+ if (!search) // get search word from URL
+ {
+ search = window.location.search;
+ search = search.substring(1); // Remove the leading '?'
+ search = unescape(search);
+ }
+
+ search = search.replace(/^ +/, ""); // strip leading spaces
+ search = search.replace(/ +$/, ""); // strip trailing spaces
+ search = search.toLowerCase();
+ search = convertToId(search);
+
+ var resultRows = document.getElementsByTagName("div");
+ var matches = 0;
+
+ var i = 0;
+ while (i < resultRows.length)
+ {
+ var row = resultRows.item(i);
+ if (row.className == "SRResult")
+ {
+ var rowMatchName = row.id.toLowerCase();
+ rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_'
+
+ if (search.length<=rowMatchName.length &&
+ rowMatchName.substr(0, search.length)==search)
+ {
+ row.style.display = 'block';
+ matches++;
+ }
+ else
+ {
+ row.style.display = 'none';
+ }
+ }
+ i++;
+ }
+ document.getElementById("Searching").style.display='none';
+ if (matches == 0) // no results
+ {
+ document.getElementById("NoMatches").style.display='block';
+ }
+ else // at least one result
+ {
+ document.getElementById("NoMatches").style.display='none';
+ }
+ this.lastMatchCount = matches;
+ return true;
+ }
+
+ // return the first item with index index or higher that is visible
+ this.NavNext = function(index)
+ {
+ var focusItem;
+ while (1)
+ {
+ var focusName = 'Item'+index;
+ focusItem = document.getElementById(focusName);
+ if (focusItem && focusItem.parentNode.parentNode.style.display=='block')
+ {
+ break;
+ }
+ else if (!focusItem) // last element
+ {
+ break;
+ }
+ focusItem=null;
+ index++;
+ }
+ return focusItem;
+ }
+
+ this.NavPrev = function(index)
+ {
+ var focusItem;
+ while (1)
+ {
+ var focusName = 'Item'+index;
+ focusItem = document.getElementById(focusName);
+ if (focusItem && focusItem.parentNode.parentNode.style.display=='block')
+ {
+ break;
+ }
+ else if (!focusItem) // last element
+ {
+ break;
+ }
+ focusItem=null;
+ index--;
+ }
+ return focusItem;
+ }
+
+ this.ProcessKeys = function(e)
+ {
+ if (e.type == "keydown")
+ {
+ this.repeatOn = false;
+ this.lastKey = e.keyCode;
+ }
+ else if (e.type == "keypress")
+ {
+ if (!this.repeatOn)
+ {
+ if (this.lastKey) this.repeatOn = true;
+ return false; // ignore first keypress after keydown
+ }
+ }
+ else if (e.type == "keyup")
+ {
+ this.lastKey = 0;
+ this.repeatOn = false;
+ }
+ return this.lastKey!=0;
+ }
+
+ this.Nav = function(evt,itemIndex)
+ {
+ var e = (evt) ? evt : window.event; // for IE
+ if (e.keyCode==13) return true;
+ if (!this.ProcessKeys(e)) return false;
+
+ if (this.lastKey==38) // Up
+ {
+ var newIndex = itemIndex-1;
+ var focusItem = this.NavPrev(newIndex);
+ if (focusItem)
+ {
+ var child = this.FindChildElement(focusItem.parentNode.parentNode.id);
+ if (child && child.style.display == 'block') // children visible
+ {
+ var n=0;
+ var tmpElem;
+ while (1) // search for last child
+ {
+ tmpElem = document.getElementById('Item'+newIndex+'_c'+n);
+ if (tmpElem)
+ {
+ focusItem = tmpElem;
+ }
+ else // found it!
+ {
+ break;
+ }
+ n++;
+ }
+ }
+ }
+ if (focusItem)
+ {
+ focusItem.focus();
+ }
+ else // return focus to search field
+ {
+ parent.document.getElementById("MSearchField").focus();
+ }
+ }
+ else if (this.lastKey==40) // Down
+ {
+ var newIndex = itemIndex+1;
+ var focusItem;
+ var item = document.getElementById('Item'+itemIndex);
+ var elem = this.FindChildElement(item.parentNode.parentNode.id);
+ if (elem && elem.style.display == 'block') // children visible
+ {
+ focusItem = document.getElementById('Item'+itemIndex+'_c0');
+ }
+ if (!focusItem) focusItem = this.NavNext(newIndex);
+ if (focusItem) focusItem.focus();
+ }
+ else if (this.lastKey==39) // Right
+ {
+ var item = document.getElementById('Item'+itemIndex);
+ var elem = this.FindChildElement(item.parentNode.parentNode.id);
+ if (elem) elem.style.display = 'block';
+ }
+ else if (this.lastKey==37) // Left
+ {
+ var item = document.getElementById('Item'+itemIndex);
+ var elem = this.FindChildElement(item.parentNode.parentNode.id);
+ if (elem) elem.style.display = 'none';
+ }
+ else if (this.lastKey==27) // Escape
+ {
+ parent.searchBox.CloseResultsWindow();
+ parent.document.getElementById("MSearchField").focus();
+ }
+ else if (this.lastKey==13) // Enter
+ {
+ return true;
+ }
+ return false;
+ }
+
+ this.NavChild = function(evt,itemIndex,childIndex)
+ {
+ var e = (evt) ? evt : window.event; // for IE
+ if (e.keyCode==13) return true;
+ if (!this.ProcessKeys(e)) return false;
+
+ if (this.lastKey==38) // Up
+ {
+ if (childIndex>0)
+ {
+ var newIndex = childIndex-1;
+ document.getElementById('Item'+itemIndex+'_c'+newIndex).focus();
+ }
+ else // already at first child, jump to parent
+ {
+ document.getElementById('Item'+itemIndex).focus();
+ }
+ }
+ else if (this.lastKey==40) // Down
+ {
+ var newIndex = childIndex+1;
+ var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex);
+ if (!elem) // last child, jump to parent next parent
+ {
+ elem = this.NavNext(itemIndex+1);
+ }
+ if (elem)
+ {
+ elem.focus();
+ }
+ }
+ else if (this.lastKey==27) // Escape
+ {
+ parent.searchBox.CloseResultsWindow();
+ parent.document.getElementById("MSearchField").focus();
+ }
+ else if (this.lastKey==13) // Enter
+ {
+ return true;
+ }
+ return false;
+ }
+}
+
+function setKeyActions(elem,action)
+{
+ elem.setAttribute('onkeydown',action);
+ elem.setAttribute('onkeypress',action);
+ elem.setAttribute('onkeyup',action);
+}
+
+function setClassAttr(elem,attr)
+{
+ elem.setAttribute('class',attr);
+ elem.setAttribute('className',attr);
+}
+
+function createResults()
+{
+ var results = document.getElementById("SRResults");
+ for (var e=0; e<searchData.length; e++)
+ {
+ var id = searchData[e][0];
+ var srResult = document.createElement('div');
+ srResult.setAttribute('id','SR_'+id);
+ setClassAttr(srResult,'SRResult');
+ var srEntry = document.createElement('div');
+ setClassAttr(srEntry,'SREntry');
+ var srLink = document.createElement('a');
+ srLink.setAttribute('id','Item'+e);
+ setKeyActions(srLink,'return searchResults.Nav(event,'+e+')');
+ setClassAttr(srLink,'SRSymbol');
+ srLink.innerHTML = searchData[e][1][0];
+ srEntry.appendChild(srLink);
+ if (searchData[e][1].length==2) // single result
+ {
+ srLink.setAttribute('href',searchData[e][1][1][0]);
+ if (searchData[e][1][1][1])
+ {
+ srLink.setAttribute('target','_parent');
+ }
+ var srScope = document.createElement('span');
+ setClassAttr(srScope,'SRScope');
+ srScope.innerHTML = searchData[e][1][1][2];
+ srEntry.appendChild(srScope);
+ }
+ else // multiple results
+ {
+ srLink.setAttribute('href','javascript:searchResults.Toggle("SR_'+id+'")');
+ var srChildren = document.createElement('div');
+ setClassAttr(srChildren,'SRChildren');
+ for (var c=0; c<searchData[e][1].length-1; c++)
+ {
+ var srChild = document.createElement('a');
+ srChild.setAttribute('id','Item'+e+'_c'+c);
+ setKeyActions(srChild,'return searchResults.NavChild(event,'+e+','+c+')');
+ setClassAttr(srChild,'SRScope');
+ srChild.setAttribute('href',searchData[e][1][c+1][0]);
+ if (searchData[e][1][c+1][1])
+ {
+ srChild.setAttribute('target','_parent');
+ }
+ srChild.innerHTML = searchData[e][1][c+1][2];
+ srChildren.appendChild(srChild);
+ }
+ srEntry.appendChild(srChildren);
+ }
+ srResult.appendChild(srEntry);
+ results.appendChild(srResult);
+ }
+}
+
diff --git a/doc/html/search/search_l.png b/doc/html/search/search_l.png
new file mode 100644
index 000000000..c872f4da4
--- /dev/null
+++ b/doc/html/search/search_l.png
Binary files differ
diff --git a/doc/html/search/search_m.png b/doc/html/search/search_m.png
new file mode 100644
index 000000000..b429a16ba
--- /dev/null
+++ b/doc/html/search/search_m.png
Binary files differ
diff --git a/doc/html/search/search_r.png b/doc/html/search/search_r.png
new file mode 100644
index 000000000..97ee8b439
--- /dev/null
+++ b/doc/html/search/search_r.png
Binary files differ
diff --git a/doc/html/search/variables_24.html b/doc/html/search/variables_24.html
new file mode 100644
index 000000000..eb6f68ee2
--- /dev/null
+++ b/doc/html/search/variables_24.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_24.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/variables_24.js b/doc/html/search/variables_24.js
new file mode 100644
index 000000000..3f840682a
--- /dev/null
+++ b/doc/html/search/variables_24.js
@@ -0,0 +1,175 @@
+var searchData=
+[
+ ['_24a',['$a',['../typo_8php.html#acebf83966ef6d7e5645a6b62ba368f9f',1,'typo.php']]],
+ ['_24account',['$account',['../classApp.html#a14bd4b1c29f3aff371fe5d4cb11aeea3',1,'App']]],
+ ['_24api',['$API',['../include_2api_8php.html#aeb2e7ad00ea666b4b6dfcf82008194f8',1,'api.php']]],
+ ['_24app',['$app',['../classBaseObject.html#a02cc4cd8fa26b6fc76d92fde54b4e4b1',1,'BaseObject']]],
+ ['_24apps',['$apps',['../classApp.html#a230e975296cf164da2fee35ef720964f',1,'App']]],
+ ['_24argc',['$argc',['../classApp.html#af58db526040829b1c8bd95561b329262',1,'App']]],
+ ['_24argv',['$argv',['../classApp.html#ab3da757abe5cb45bf88f07cc51a73b58',1,'App']]],
+ ['_24arr',['$arr',['../extract_8php.html#a63bb4c41bc532baacf6a4976cfaa0feb',1,'extract.php']]],
+ ['_24aside',['$aside',['../minimalisticdarkness_8php.html#a6e5d97615c6faef5dbffe04b8024ceaf',1,'minimalisticdarkness.php']]],
+ ['_24auth',['$auth',['../classRedDirectory.html#a9616af16cd19a18a6afebebcc2881c44',1,'RedDirectory\$auth()'],['../classRedFile.html#a4b5d0e33f919c6c175b30a55de6263f2',1,'RedFile\$auth()'],['../classRedBrowser.html#ab6d6d1e2a67e06b344a4cede1bd00b35',1,'RedBrowser\$auth()']]],
+ ['_24background_5fimage',['$background_image',['../redbasic_2php_2style_8php.html#a339624aeef6604a2f00209a3962c6e1c',1,'style.php']]],
+ ['_24banner_5fcolour',['$banner_colour',['../redbasic_2php_2style_8php.html#ae587aa6949ab6e4aa77a591e60f67ee0',1,'style.php']]],
+ ['_24baseurl',['$baseurl',['../classApp.html#ad5175536561021548ae8188e24c7b80c',1,'App']]],
+ ['_24bgcolour',['$bgcolour',['../redbasic_2php_2style_8php.html#a0bdce350cf14bac44976e786d1be6574',1,'style.php']]],
+ ['_24body_5ffont_5fsize',['$body_font_size',['../redbasic_2php_2style_8php.html#ad78cb8a1793834626d73aca22a1501f8',1,'style.php']]],
+ ['_24bodyclass',['$bodyclass',['../theme_2blogga_2php_2default_8php.html#a720581ae288aa09511670563e4205a4a',1,'$bodyclass():&#160;default.php'],['../theme_2blogga_2view_2theme_2blog_2default_8php.html#a720581ae288aa09511670563e4205a4a',1,'$bodyclass():&#160;default.php']]],
+ ['_24browser',['$browser',['../classRedBasicAuth.html#af14337f1baad407f8a85d48205c0f30e',1,'RedBasicAuth']]],
+ ['_24cached_5fprofile_5fimage',['$cached_profile_image',['../classApp.html#abe0e4fa91097f7a6588e1213a834121c',1,'App']]],
+ ['_24cached_5fprofile_5fpicdate',['$cached_profile_picdate',['../classApp.html#aab4a685d15a363bb1d7edbbc20bfb94e',1,'App']]],
+ ['_24called_5fapi',['$called_api',['../include_2api_8php.html#aa62b15a6bbb280e86b98132eb214013d',1,'api.php']]],
+ ['_24category',['$category',['../classApp.html#a5cfc098c061b7d765add58fd2ca97445',1,'App']]],
+ ['_24channel',['$channel',['../classApp.html#a050b0696118da47e8b30859ad1a2c149',1,'App\$channel()'],['../classItem.html#acc32426c0f465391be8a99ad810c7b8e',1,'Item\$channel()'],['../php_2theme__init_8php.html#a54f32c086fe209c99769a4c4047dd864',1,'$channel():&#160;theme_init.php']]],
+ ['_24channel_5fhash',['$channel_hash',['../classRedBasicAuth.html#ad5a3ea4dc4783b242d9dc6e76478b6ef',1,'RedBasicAuth']]],
+ ['_24channel_5fid',['$channel_id',['../classRedBasicAuth.html#a2dab393650d1573e3515969a153e8354',1,'RedBasicAuth']]],
+ ['_24channel_5fname',['$channel_name',['../classRedBasicAuth.html#a438ab125b6ef46581947e35d49cdebac',1,'RedBasicAuth']]],
+ ['_24children',['$children',['../classItem.html#a80dcd0fb7673776c0967839d429c2a0f',1,'Item']]],
+ ['_24cid',['$cid',['../classApp.html#ad1c8eb91a6fd470b94f34b7fdad3a2d0',1,'App']]],
+ ['_24cipher',['$cipher',['../classConversation.html#aa95c1a62af38bdfba7add9549bec083b',1,'Conversation']]],
+ ['_24cmd',['$cmd',['../classApp.html#a495ec082c2719314e536070ca1ce073d',1,'App']]],
+ ['_24comment_5fbox_5ftemplate',['$comment_box_template',['../classItem.html#a90743c8348b13213275c223bb9333aa0',1,'Item']]],
+ ['_24comment_5findent',['$comment_indent',['../redbasic_2php_2style_8php.html#a5bff5012c56e34da6b3b2ed475726b27',1,'style.php']]],
+ ['_24commentable',['$commentable',['../classConversation.html#afd4965d22a6e4bfea2f35e931b3273c6',1,'Conversation\$commentable()'],['../classItem.html#aa2c221231ad0fc3720ccc1f00f0c6304',1,'Item\$commentable()']]],
+ ['_24config',['$config',['../classApp.html#ac73dc90e4764497e2f1b7e6612c8fb88',1,'App']]],
+ ['_24connected',['$connected',['../classdba__driver.html#a205f6535e399700b6fca2492f96f2229',1,'dba_driver']]],
+ ['_24contact',['$contact',['../classApp.html#a98ef4cfd36693a3457c879b76bc6d694',1,'App']]],
+ ['_24contacts',['$contacts',['../classApp.html#a61ca6e3af82071ea25ff2fd5dbcddae2',1,'App']]],
+ ['_24content',['$content',['../classApp.html#ac1d80a14492acc932715d54567d8a589',1,'App']]],
+ ['_24conversation',['$conversation',['../classItem.html#a007424e3e3171dcfb4312a02161da6cd',1,'Item']]],
+ ['_24converse_5fwidth',['$converse_width',['../redbasic_2php_2style_8php.html#a0cb037986e32302685d4f580dedd6473',1,'style.php']]],
+ ['_24css_5fsources',['$css_sources',['../classApp.html#a6f55d087e1ff4710132c1b0863faa2ee',1,'App']]],
+ ['_24curl_5fcode',['$curl_code',['../classApp.html#a256360c9184fed6d7556e0bc0a835d7f',1,'App']]],
+ ['_24curl_5fheaders',['$curl_headers',['../classApp.html#af5007c42a693afd9c4899c243b2e1363',1,'App']]],
+ ['_24d',['$d',['../classTemplate.html#a8469ab2988b6be2681516dc4b4e07d38',1,'Template']]],
+ ['_24data',['$data',['../classApp.html#a0ce85be198e46570366cb3344f3c55b8',1,'App\$data()'],['../classItem.html#aec24e233f9098f902b1e57e60dcb2019',1,'Item\$data()'],['../classRedFile.html#a2ff12032b45538353eded9809d3b7550',1,'RedFile\$data()']]],
+ ['_24db',['$db',['../classApp.html#a330410a288f3393d53772f5e98f857ea',1,'App\$db()'],['../classdba__driver.html#a3033b5f1c2716b52202faeaae2592fe6',1,'dba_driver\$db()']]],
+ ['_24debug',['$debug',['../classdba__driver.html#af48e2afeded5285766bf92e22123ed03',1,'dba_driver\$debug()'],['../classTemplate.html#afc4afb6f89bebcd5480022312a56cb4a',1,'Template\$debug()']]],
+ ['_24dir',['$dir',['../docblox__errorchecker_8php.html#a1659f0a629d408e0f849dbe4ee061e62',1,'docblox_errorchecker.php']]],
+ ['_24dirs',['$dirs',['../typo_8php.html#a1b709c1d79631ebc8320b41bda028b54',1,'typo.php']]],
+ ['_24dirstack',['$dirstack',['../docblox__errorchecker_8php.html#ab66bc0493d25f39bf8b4dcbb429f04e6',1,'docblox_errorchecker.php']]],
+ ['_24done',['$done',['../classTemplate.html#abda4c8d049f70553338eae7c905e9d5c',1,'Template']]],
+ ['_24error',['$error',['../classApp.html#ac1a8b2cd40609b231a560201a08852ba',1,'App\$error()'],['../classdba__driver.html#a84675d28c7bd9b7290dd37e66dbd216c',1,'dba_driver\$error()']]],
+ ['_24ext_5fpath',['$ext_path',['../classRedDirectory.html#a0f113244cd85c17848df991001d024f4',1,'RedDirectory']]],
+ ['_24filelist',['$filelist',['../docblox__errorchecker_8php.html#a648a570b0f9f6e0e51b7267647c4b09b',1,'docblox_errorchecker.php']]],
+ ['_24filename',['$filename',['../classFriendicaSmarty.html#a33fabbd4d6eef869df496adf357ae690',1,'FriendicaSmarty']]],
+ ['_24files',['$files',['../extract_8php.html#a9590b15215a21e9b42eb546aeef79704',1,'$files():&#160;extract.php'],['../tpldebug_8php.html#a5358407d65f2ca826f96356a6642d149',1,'$files():&#160;tpldebug.php'],['../typo_8php.html#a9590b15215a21e9b42eb546aeef79704',1,'$files():&#160;typo.php']]],
+ ['_24folder_5fhash',['$folder_hash',['../classRedDirectory.html#aa10254abf177bb2a0e4a88495725e09b',1,'RedDirectory']]],
+ ['_24font_5fcolour',['$font_colour',['../redbasic_2php_2style_8php.html#a68e3ff836ec87ae1370c9f4a12c21c6b',1,'style.php']]],
+ ['_24font_5fsize',['$font_size',['../redbasic_2php_2style_8php.html#afcbcf57d0b90d2e4226c2e8a1171befc',1,'style.php']]],
+ ['_24force_5fmax_5fitems',['$force_max_items',['../classApp.html#ae3f47830543d0d902f66913def8db66b',1,'App']]],
+ ['_24gc_5fprobability',['$gc_probability',['../session_8php.html#a96b09cc763572f45280786a7b33feb7e',1,'session.php']]],
+ ['_24groups',['$groups',['../classApp.html#ac6e6b1c7d6df408580ff79977fcfa656',1,'App']]],
+ ['_24headimg',['$headimg',['../theme_2blogga_2php_2default_8php.html#ac7062908d1eb80c0735270f7997c4527',1,'$headimg():&#160;default.php'],['../theme_2blogga_2view_2theme_2blog_2default_8php.html#a52d9dd070ed541729088395c22502539',1,'$headimg():&#160;default.php']]],
+ ['_24headimghome',['$headimghome',['../theme_2blogga_2php_2default_8php.html#a1230ab83d4ec9785d8f3a966f33dc5f3',1,'$headimghome():&#160;default.php'],['../theme_2blogga_2view_2theme_2blog_2default_8php.html#a1230ab83d4ec9785d8f3a966f33dc5f3',1,'$headimghome():&#160;default.php']]],
+ ['_24height',['$height',['../classphoto__driver.html#aea560be5dfba09117d36c12bacbf3b80',1,'photo_driver']]],
+ ['_24hooks',['$hooks',['../classApp.html#a3694aa1907aa103a2adbc71f926f0fa0',1,'App']]],
+ ['_24hostname',['$hostname',['../classApp.html#a037049cba88dfc6ff94f4b5b779e3fd3',1,'App']]],
+ ['_24i',['$i',['../docblox__errorchecker_8php.html#a83018d9153d17d91fbcf3bc10158d34f',1,'docblox_errorchecker.php']]],
+ ['_24identities',['$identities',['../classApp.html#a7954862f44f606b0ff83d4c74d15e792',1,'App']]],
+ ['_24image',['$image',['../classphoto__driver.html#a7c78b5a01afe61ba3895ac07f4869b55',1,'photo_driver']]],
+ ['_24infile',['$infile',['../php2po_8php.html#a61f8ddeb5557d46ebc546cc355bda214',1,'php2po.php']]],
+ ['_24ink',['$ink',['../php2po_8php.html#a6b0b8ebd9ce811d1325ef2c129443bc0',1,'php2po.php']]],
+ ['_24install_5fwizard_5fpass',['$install_wizard_pass',['../setup_8php.html#addb24714bc2542aa4f4215e98fe48432',1,'setup.php']]],
+ ['_24interactive',['$interactive',['../classApp.html#a4c7cfc62d39508086cf300dc2e39c4df',1,'App']]],
+ ['_24item_5fcolour',['$item_colour',['../redbasic_2php_2style_8php.html#a27cb59bbc750341f448cd0c298a7ea16',1,'style.php']]],
+ ['_24item_5fopacity',['$item_opacity',['../redbasic_2php_2style_8php.html#a136b0a2cdeb37f3fa506d28f82dcdbf8',1,'style.php']]],
+ ['_24itemfloat',['$itemfloat',['../minimalisticdarkness_8php.html#a7e6c3d4efde4e9a2de32308081372c6b',1,'minimalisticdarkness.php']]],
+ ['_24js_5fsources',['$js_sources',['../classApp.html#a11e24b3ed9b33ffee7dd41d110b4366d',1,'App']]],
+ ['_24k',['$k',['../php2po_8php.html#ad6726cfaa85d4b8299d2b0f034cbf178',1,'php2po.php']]],
+ ['_24lang',['$lang',['../classTemplate.html#ace26b8a4252fbc1c385d2b5e1e93e5c8',1,'Template']]],
+ ['_24language',['$language',['../classApp.html#a1a297e70b3667b83f4460aa7ed9f5d6f',1,'App']]],
+ ['_24layout',['$layout',['../classApp.html#a58ac598544892ff7c32890291b72635e',1,'App']]],
+ ['_24ldelim',['$ldelim',['../classApp.html#a59dd4b665c70e7dbd80682c014ff7145',1,'App']]],
+ ['_24minwidth',['$minwidth',['../minimalisticdarkness_8php.html#a70bb13be8f23ec47839da81e0796f1cb',1,'minimalisticdarkness.php']]],
+ ['_24mode',['$mode',['../classConversation.html#afb03d1648dbfafe62caa1e30f32f2b1a',1,'Conversation']]],
+ ['_24module',['$module',['../classApp.html#a9bf62f8e39585c0aa48fcffc3bf3484d',1,'App']]],
+ ['_24module_5floaded',['$module_loaded',['../classApp.html#a6e4f0fbfa3cf6c11baebe22a03db6165',1,'App']]],
+ ['_24name',['$name',['../classFriendicaSmartyEngine.html#aaba6a42101bc9ae32e36b7fa2e243f02',1,'FriendicaSmartyEngine\$name()'],['../classRedFile.html#acc48c05cd5a70951cb3c615ad84f03ba',1,'RedFile\$name()'],['../classTemplate.html#a6eb301a51cc94d8b94f4548fbad85eae',1,'Template\$name()']]],
+ ['_24nav_5fcolour',['$nav_colour',['../redbasic_2php_2style_8php.html#a8fdd5874587a9ad86fb05ed0be265649',1,'style.php']]],
+ ['_24nav_5fmin_5fopacity',['$nav_min_opacity',['../redbasic_2php_2style_8php.html#ab5ec5703848e0132f8a8f3d3a53a58e1',1,'style.php']]],
+ ['_24nav_5fpercent_5fmin_5fopacity',['$nav_percent_min_opacity',['../redbasic_2php_2style_8php.html#a01c151bf47f7da2b979aaa4cb868da4c',1,'style.php']]],
+ ['_24nav_5fsel',['$nav_sel',['../classApp.html#a33a8e90b60ec4438f6fbf299d0f6839c',1,'App']]],
+ ['_24needed',['$needed',['../docblox__errorchecker_8php.html#a852004caba0a34390297a079f4aaac73',1,'docblox_errorchecker.php']]],
+ ['_24nodes',['$nodes',['../classTemplate.html#a8f4d17e49f42b876a97364c13fb572d1',1,'Template']]],
+ ['_24observer',['$observer',['../classApp.html#a4ffe529fb14389f7fedf5fdc5f722e7f',1,'App\$observer()'],['../classConversation.html#a8748445aa26047ebed5141f3c3cbc244',1,'Conversation\$observer()'],['../classRedBasicAuth.html#aa75dc43b59adc98e38a98517d3fd35d1',1,'RedBasicAuth\$observer()']]],
+ ['_24os_5fpath',['$os_path',['../classRedDirectory.html#a3c148c07ad909985125aa4926d8d0021',1,'RedDirectory']]],
+ ['_24out',['$out',['../php2po_8php.html#a48cb304902320d173a4eaa41543327b9',1,'php2po.php']]],
+ ['_24owner_5fid',['$owner_id',['../classRedBasicAuth.html#a09c1488a0b290f5a54dc15180c5690d7',1,'RedBasicAuth']]],
+ ['_24owner_5fname',['$owner_name',['../classItem.html#a9594df6014b0b6f45364ea7a34510130',1,'Item']]],
+ ['_24owner_5fnick',['$owner_nick',['../classRedBasicAuth.html#a8d09b8d784cc810a0b3be580d05106a7',1,'RedBasicAuth']]],
+ ['_24owner_5fphoto',['$owner_photo',['../classItem.html#a078f95b4134ce3a1df344cf8d386f986',1,'Item']]],
+ ['_24owner_5furl',['$owner_url',['../classItem.html#afa54851df82962c7c42dea3cc9f5c92c',1,'Item']]],
+ ['_24page',['$page',['../classApp.html#a4b67935096f66d1f14b657399a8461ac',1,'App']]],
+ ['_24pager',['$pager',['../classApp.html#a6bcb19cdc4907077da72864686d5a780',1,'App']]],
+ ['_24parent',['$parent',['../classItem.html#a1a1e42877e6ac7af50286142ceb483d2',1,'Item']]],
+ ['_24path',['$path',['../classApp.html#acad5896b7a79ae31433ad8f89606c728',1,'App']]],
+ ['_24perms',['$perms',['../classApp.html#ab47de68fa39806d1fb0976407e188b77',1,'App']]],
+ ['_24phpath',['$phpath',['../typo_8php.html#a3ecd17ac846be1b35f3662f5c12ab6bd',1,'typo.php']]],
+ ['_24phpfile',['$phpfile',['../php2po_8php.html#abbb0e5fd8fbc1f13a9bf68f86eb3d2a4',1,'php2po.php']]],
+ ['_24plugin',['$plugin',['../post__to__red_8php.html#ada8a7130088351710bb02ed622d6bf65',1,'post_to_red.php']]],
+ ['_24plugin_5fdir',['$plugin_dir',['../post__to__red_8php.html#a99811555b30bde504a863e44015f2f19',1,'post_to_red.php']]],
+ ['_24plugins',['$plugins',['../classApp.html#ae9f96338f32187d308b67b980eea0008',1,'App']]],
+ ['_24pmenu_5freply',['$pmenu_reply',['../redbasic_2php_2style_8php.html#a9b489f1c595b867212d30eca0c85b38c',1,'style.php']]],
+ ['_24pmenu_5ftop',['$pmenu_top',['../redbasic_2php_2style_8php.html#ac98bd8264411bd207a5740d08e81a158',1,'style.php']]],
+ ['_24pofile',['$pofile',['../php2po_8php.html#a401d84ce156e49e8168bd0c4781e1be1',1,'php2po.php']]],
+ ['_24poi',['$poi',['../classApp.html#a1936f2afce0dc0d1bbed15ae1f2ee81a',1,'App']]],
+ ['_24prepared_5fitem',['$prepared_item',['../classConversation.html#a5b6adbb2fe24f0f53d6c22660dff91b2',1,'Conversation']]],
+ ['_24preview',['$preview',['../classConversation.html#ae9937f9e0f3d927acc2bed46cc72e9ae',1,'Conversation']]],
+ ['_24profile',['$profile',['../classApp.html#a57d041fcc003d08c127dfa99a02bc192',1,'App']]],
+ ['_24profile_5fowner',['$profile_owner',['../classConversation.html#a2f12724ef0244e9049fe1bb9641b516d',1,'Conversation']]],
+ ['_24profile_5fuid',['$profile_uid',['../classApp.html#a08c24d6a6fc52fcc784b0f765f13b820',1,'App']]],
+ ['_24query_5fstring',['$query_string',['../classApp.html#a2e82da4aecfc2017a8d1d332ca501f9f',1,'App']]],
+ ['_24r',['$r',['../classTemplate.html#aac9a4638f11271e1b1dcc9f247242718',1,'Template']]],
+ ['_24radius',['$radius',['../redbasic_2php_2style_8php.html#a6502bedd57105ad1fb2dee2be9cf6351',1,'style.php']]],
+ ['_24rdelim',['$rdelim',['../classApp.html#a244b2d53b21be269aad2269d23192f95',1,'App']]],
+ ['_24red_5fpath',['$red_path',['../classRedDirectory.html#acb32b8df27538c57772824a745e751d7',1,'RedDirectory']]],
+ ['_24redirect_5furl',['$redirect_url',['../classItem.html#a5b561415861f5b89b0733aacfe0428d1',1,'Item']]],
+ ['_24replace',['$replace',['../classTemplate.html#a4e86b566c3f728e95ce5db1b33665c10',1,'Template']]],
+ ['_24reply_5fphoto',['$reply_photo',['../redbasic_2php_2style_8php.html#a0b070f2c9140a7a12a0b1f88601a29e4',1,'style.php']]],
+ ['_24res',['$res',['../docblox__errorchecker_8php.html#a49a8a4009b02e49717caa88b128affc5',1,'docblox_errorchecker.php']]],
+ ['_24root_5fdir',['$root_dir',['../classRedDirectory.html#ad87c514a307ec97ba0f1372e9bcfa6a4',1,'RedDirectory']]],
+ ['_24s',['$s',['../extract_8php.html#a50b05cf2e02ef0b67fcad97106dd7634',1,'extract.php']]],
+ ['_24schema',['$schema',['../redbasic_2php_2style_8php.html#a83022b1d70799d2bde3d64dca9cb40ee',1,'style.php']]],
+ ['_24scheme',['$scheme',['../classApp.html#ad082d63acc078e5bf23825a03bdd6a76',1,'App']]],
+ ['_24search',['$search',['../classTemplate.html#a317d535946dc065c35dd5cd38380e6c6',1,'Template']]],
+ ['_24sectionleft',['$sectionleft',['../minimalisticdarkness_8php.html#a0ac3f5b52212b0af87d513273da03ead',1,'minimalisticdarkness.php']]],
+ ['_24sectionwidth',['$sectionwidth',['../minimalisticdarkness_8php.html#a04de7b747e4f0a353e0e38cf77c3404f',1,'minimalisticdarkness.php']]],
+ ['_24session_5fexists',['$session_exists',['../session_8php.html#a62e4a6cb26b4bb1b8ddd8277b26090eb',1,'session.php']]],
+ ['_24session_5fexpire',['$session_expire',['../session_8php.html#af0100a2642a5268594bbd5742a03d885',1,'session.php']]],
+ ['_24shadow',['$shadow',['../redbasic_2php_2style_8php.html#ab00dfc29448b183055d2ae61a0e1874a',1,'style.php']]],
+ ['_24sloppy_5fphotos',['$sloppy_photos',['../redbasic_2php_2style_8php.html#a6ffadaf926b41ad84c30da319011e9ad',1,'style.php']]],
+ ['_24sourcename',['$sourcename',['../classApp.html#a13710907ef62554a0b4dd8a5eaa2eb11',1,'App']]],
+ ['_24stack',['$stack',['../classTemplate.html#a6f0efc256688c36110180b501067ff11',1,'Template']]],
+ ['_24str',['$str',['../typohelper_8php.html#a7542d95618011800c61773127fa625cf',1,'typohelper.php']]],
+ ['_24strings',['$strings',['../classApp.html#a5f64620473a9727a48ebe9cf6f335a98',1,'App']]],
+ ['_24template',['$template',['../classItem.html#a7f7bc059de377319282cb4ef4a828480',1,'Item']]],
+ ['_24template_5fengine_5finstance',['$template_engine_instance',['../classApp.html#a6844aedad10e201b8c3d80cfc9e876d3',1,'App']]],
+ ['_24template_5fengines',['$template_engines',['../classApp.html#a6859a4848a5c0049b4134cc4b34228b6',1,'App']]],
+ ['_24theme',['$theme',['../classApp.html#a764cc6cd7578132c21d2b4545de9301c',1,'App']]],
+ ['_24theme_5finfo',['$theme_info',['../classApp.html#aeca29fd4f7192ca07369b3c598c36e67',1,'App']]],
+ ['_24theme_5fthread_5fallow',['$theme_thread_allow',['../classApp.html#a487332f8de40414ca1a54a4265570b70',1,'App']]],
+ ['_24threaded',['$threaded',['../classItem.html#a1cb6aa8abdf7ea7daca647e40c8ea3a2',1,'Item']]],
+ ['_24threads',['$threads',['../classConversation.html#a41f4a549e6a99f98935c4742addd22c8',1,'Conversation']]],
+ ['_24timezone',['$timezone',['../classApp.html#ab35b01a366a2ea95725e97af278f87ab',1,'App']]],
+ ['_24toolicon_5factivecolour',['$toolicon_activecolour',['../redbasic_2php_2style_8php.html#acfd00ec469ca3c5e8bfac787573093f3',1,'style.php']]],
+ ['_24toolicon_5fcolour',['$toolicon_colour',['../redbasic_2php_2style_8php.html#a4161f6b8aa923f67e53f54dfb6554cdb',1,'style.php']]],
+ ['_24top_5fphoto',['$top_photo',['../redbasic_2php_2style_8php.html#a810142b4bdd35a1d377ab279b02b47eb',1,'style.php']]],
+ ['_24toplevel',['$toplevel',['../classItem.html#a5cfa6cf964f433a917a81cab079ff9d8',1,'Item']]],
+ ['_24type',['$type',['../classphoto__driver.html#a4920ed7cbb1ac735ac84153067537f03',1,'photo_driver']]],
+ ['_24types',['$types',['../classphoto__driver.html#a00cb166c00b7502dbc456c94330e5b03',1,'photo_driver']]],
+ ['_24uid',['$uid',['../apw_2php_2style_8php.html#a109bbd7f4add27541707b191b73ef84a',1,'$uid():&#160;style.php'],['../redbasic_2php_2style_8php.html#a109bbd7f4add27541707b191b73ef84a',1,'$uid():&#160;style.php']]],
+ ['_24user',['$user',['../classApp.html#a91fd3c8b89016113b05f3be24805ccff',1,'App']]],
+ ['_24valid',['$valid',['../classphoto__driver.html#a01d28d43b404d6f6de219dc9c5069dc9',1,'photo_driver']]],
+ ['_24videoheight',['$videoheight',['../classApp.html#a56b1a432c96aef8b1971f779c9d93c8c',1,'App']]],
+ ['_24videowidth',['$videowidth',['../classApp.html#adf2aaf95b062736a6fd5fc70fadf80e8',1,'App']]],
+ ['_24visiting',['$visiting',['../classItem.html#a4a123ae98987c1e30ecb15c4edf5a3b8',1,'Item']]],
+ ['_24wall_5fto_5fwall',['$wall_to_wall',['../classItem.html#a5d29ddecc073151a65a8e2ea2f6e4189',1,'Item']]],
+ ['_24widgetlist',['$widgetlist',['../classApp.html#a4833bee2eae4ad1691a04fa19e11a766',1,'App']]],
+ ['_24widgets',['$widgets',['../classApp.html#aa5a87c46ab3fee21362c466bf78042ef',1,'App']]],
+ ['_24width',['$width',['../classphoto__driver.html#a3e4215890f4a4894bf3799a7d2e0c0b1',1,'photo_driver\$width()'],['../minimalisticdarkness_8php.html#a5795120b4b324bc4ca83f1e6fdce7d57',1,'$width():&#160;minimalisticdarkness.php']]],
+ ['_24writable',['$writable',['../classConversation.html#ae81221251307e315f566a11f921ce0a9',1,'Conversation']]],
+ ['_24wwtop',['$wwtop',['../redbasic_2php_2style_8php.html#a61891d0d3e6894f52410d507b04e565d',1,'style.php']]],
+ ['_24zones',['$zones',['../extract_8php.html#a0cbe524ffc9a496114fd7ba9f423ef44',1,'extract.php']]]
+];
diff --git a/doc/html/search/variables_61.html b/doc/html/search/variables_61.html
new file mode 100644
index 000000000..a0de7a473
--- /dev/null
+++ b/doc/html/search/variables_61.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_61.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/variables_61.js b/doc/html/search/variables_61.js
new file mode 100644
index 000000000..b5537bddf
--- /dev/null
+++ b/doc/html/search/variables_61.js
@@ -0,0 +1,52 @@
+var searchData=
+[
+ ['abook_5fflag_5farchived',['ABOOK_FLAG_ARCHIVED',['../boot_8php.html#a222395aa223cfbff6166fab0b4e2e1d5',1,'boot.php']]],
+ ['abook_5fflag_5fblocked',['ABOOK_FLAG_BLOCKED',['../boot_8php.html#a52b599cd13e152ebc80d7e4413683195',1,'boot.php']]],
+ ['abook_5fflag_5fhidden',['ABOOK_FLAG_HIDDEN',['../boot_8php.html#a34c756469ebed32e2fc987bcde62d382',1,'boot.php']]],
+ ['abook_5fflag_5fignored',['ABOOK_FLAG_IGNORED',['../boot_8php.html#aa3425e2de85b08f7041656d3a8502cb6',1,'boot.php']]],
+ ['abook_5fflag_5fpending',['ABOOK_FLAG_PENDING',['../boot_8php.html#a68eebe493e6f729ffd1aeda7a4b11155',1,'boot.php']]],
+ ['abook_5fflag_5fself',['ABOOK_FLAG_SELF',['../boot_8php.html#a0450389f24c632906fbc24347700a543',1,'boot.php']]],
+ ['access_5ffree',['ACCESS_FREE',['../boot_8php.html#afbb1fe1b2c8c730ec8e08da93b6512c4',1,'boot.php']]],
+ ['access_5fpaid',['ACCESS_PAID',['../boot_8php.html#a9c80420e5a063a4a87ce4831f086134d',1,'boot.php']]],
+ ['access_5fprivate',['ACCESS_PRIVATE',['../boot_8php.html#a7f3474fec541e261fc8dff47313c4017',1,'boot.php']]],
+ ['access_5ftiered',['ACCESS_TIERED',['../boot_8php.html#aeb1039302affcbe7e8872c01c08c88f8',1,'boot.php']]],
+ ['access_5ftoken_5fduration',['ACCESS_TOKEN_DURATION',['../oauth_8php.html#ad343cab37aa860d2d14dc86b7f5ca0c6',1,'oauth.php']]],
+ ['account_5fblocked',['ACCOUNT_BLOCKED',['../boot_8php.html#af3bdfc20979c16f15bb9c60446a480f9',1,'boot.php']]],
+ ['account_5fexpired',['ACCOUNT_EXPIRED',['../boot_8php.html#a400519fa181591cd6fdbb8f25fbcba0a',1,'boot.php']]],
+ ['account_5fok',['ACCOUNT_OK',['../boot_8php.html#a84057c5bfa1bca5fba8497fe005ee4d8',1,'boot.php']]],
+ ['account_5fpending',['ACCOUNT_PENDING',['../boot_8php.html#a032bbd6d0321e99e9117332c9ed2b1b8',1,'boot.php']]],
+ ['account_5fremoved',['ACCOUNT_REMOVED',['../boot_8php.html#ab5ddbe69d3d03acd06e1fb281488cb78',1,'boot.php']]],
+ ['account_5frole_5fadmin',['ACCOUNT_ROLE_ADMIN',['../boot_8php.html#ac8400313df2c831653f9036f71ebd86d',1,'boot.php']]],
+ ['account_5frole_5fallowcode',['ACCOUNT_ROLE_ALLOWCODE',['../boot_8php.html#a84f48897059bbd4a8738d7ee4cec6688',1,'boot.php']]],
+ ['account_5frole_5fsystem',['ACCOUNT_ROLE_SYSTEM',['../boot_8php.html#a7c2eb822d50e1554bf5c32861f36342b',1,'boot.php']]],
+ ['account_5funverified',['ACCOUNT_UNVERIFIED',['../boot_8php.html#af3a4271630aabd8be592213f925d6a36',1,'boot.php']]],
+ ['activity_5fdislike',['ACTIVITY_DISLIKE',['../boot_8php.html#a0e57f846e6d47a308feced0f7274f178',1,'boot.php']]],
+ ['activity_5ffavorite',['ACTIVITY_FAVORITE',['../boot_8php.html#a3e2ea123d29a72012db1241f96280b0e',1,'boot.php']]],
+ ['activity_5ffollow',['ACTIVITY_FOLLOW',['../boot_8php.html#a5ae728ac966ea1d3525a19e7fec59434',1,'boot.php']]],
+ ['activity_5ffriend',['ACTIVITY_FRIEND',['../boot_8php.html#a176664e78dcb9132e16be69418223eb2',1,'boot.php']]],
+ ['activity_5fjoin',['ACTIVITY_JOIN',['../boot_8php.html#aced60c7285192e80b7c4757e45a7f1e3',1,'boot.php']]],
+ ['activity_5flike',['ACTIVITY_LIKE',['../boot_8php.html#abdcdfc873ace4e0902177bad934de0c0',1,'boot.php']]],
+ ['activity_5fmood',['ACTIVITY_MOOD',['../boot_8php.html#a7aa57438db03834aaa0b468bdce773a6',1,'boot.php']]],
+ ['activity_5fobj_5falbum',['ACTIVITY_OBJ_ALBUM',['../boot_8php.html#aaf9b76832ee5f85e56466af162ba8a14',1,'boot.php']]],
+ ['activity_5fobj_5fcomment',['ACTIVITY_OBJ_COMMENT',['../boot_8php.html#a0a98dd0110dc6c8e24cefc8ae74d5562',1,'boot.php']]],
+ ['activity_5fobj_5fevent',['ACTIVITY_OBJ_EVENT',['../boot_8php.html#a2e90096fede6acce16abf0da8cb2febe',1,'boot.php']]],
+ ['activity_5fobj_5fgroup',['ACTIVITY_OBJ_GROUP',['../boot_8php.html#a7bff2278e68a71e524afd1c7c951e1e3',1,'boot.php']]],
+ ['activity_5fobj_5fheart',['ACTIVITY_OBJ_HEART',['../boot_8php.html#ad302cb26b838898d475f57f61b0fcc9f',1,'boot.php']]],
+ ['activity_5fobj_5fnote',['ACTIVITY_OBJ_NOTE',['../boot_8php.html#a44d069c8a1cfcc6d2007c506a17ff28f',1,'boot.php']]],
+ ['activity_5fobj_5fp_5fphoto',['ACTIVITY_OBJ_P_PHOTO',['../boot_8php.html#a74bf27f7564c9a37975e7b37d973dcab',1,'boot.php']]],
+ ['activity_5fobj_5fperson',['ACTIVITY_OBJ_PERSON',['../boot_8php.html#a2f8f25b13480c37a5f22511f53da8bab',1,'boot.php']]],
+ ['activity_5fobj_5fphoto',['ACTIVITY_OBJ_PHOTO',['../boot_8php.html#a774f0f792ebfec1e774c5a17bb9d5966',1,'boot.php']]],
+ ['activity_5fobj_5fprofile',['ACTIVITY_OBJ_PROFILE',['../boot_8php.html#a62c832a95e38b1fa23e6cef39521b7d5',1,'boot.php']]],
+ ['activity_5fobj_5ftagterm',['ACTIVITY_OBJ_TAGTERM',['../boot_8php.html#a1da180f961f49a11573cac4ff6c62c05',1,'boot.php']]],
+ ['activity_5fobj_5fthing',['ACTIVITY_OBJ_THING',['../boot_8php.html#a0fb63e51c2a9814941842ae8f2f4dff8',1,'boot.php']]],
+ ['activity_5fpoke',['ACTIVITY_POKE',['../boot_8php.html#a14ba8f9e162f2559831ee3bf98e0c3bd',1,'boot.php']]],
+ ['activity_5fpost',['ACTIVITY_POST',['../boot_8php.html#a5c3747e0f505f0d5271dc4c54e3feaf4',1,'boot.php']]],
+ ['activity_5freq_5ffriend',['ACTIVITY_REQ_FRIEND',['../boot_8php.html#afe084c30a1810c10442edb4fbcbc0086',1,'boot.php']]],
+ ['activity_5ftag',['ACTIVITY_TAG',['../boot_8php.html#a12c781cefc20167231e2e3fd5866b1b5',1,'boot.php']]],
+ ['activity_5funfollow',['ACTIVITY_UNFOLLOW',['../boot_8php.html#a53e4bdb6f225da55115acb9277f75e53',1,'boot.php']]],
+ ['activity_5funfriend',['ACTIVITY_UNFRIEND',['../boot_8php.html#a29528a2544373cc19a378f350040c6a1',1,'boot.php']]],
+ ['activity_5fupdate',['ACTIVITY_UPDATE',['../boot_8php.html#a7f4264232dbb6c3b41f2617deecb1866',1,'boot.php']]],
+ ['atom_5ftime',['ATOM_TIME',['../boot_8php.html#ad34c1547020a305915bcc39707744690',1,'boot.php']]],
+ ['attach_5fflag_5fdir',['ATTACH_FLAG_DIR',['../boot_8php.html#aa74438cf71e48e37bf7b440b94243985',1,'boot.php']]],
+ ['attach_5fflag_5fos',['ATTACH_FLAG_OS',['../boot_8php.html#a781916f83fcc8ff1035649afa45f0292',1,'boot.php']]]
+];
diff --git a/doc/html/search/variables_63.html b/doc/html/search/variables_63.html
new file mode 100644
index 000000000..422085c12
--- /dev/null
+++ b/doc/html/search/variables_63.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_63.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/variables_63.js b/doc/html/search/variables_63.js
new file mode 100644
index 000000000..e29a5d230
--- /dev/null
+++ b/doc/html/search/variables_63.js
@@ -0,0 +1,9 @@
+var searchData=
+[
+ ['client_5fmode_5fload',['CLIENT_MODE_LOAD',['../boot_8php.html#af6f6f6f40139f12fc09ec47373b30919',1,'boot.php']]],
+ ['client_5fmode_5fnormal',['CLIENT_MODE_NORMAL',['../boot_8php.html#a43c6c7d84d880e9500bd4f8f8ecc5731',1,'boot.php']]],
+ ['client_5fmode_5fupdate',['CLIENT_MODE_UPDATE',['../boot_8php.html#a3f40aa5bafff8c4eebdc62e5121daf77',1,'boot.php']]],
+ ['contact_5fis_5ffollower',['CONTACT_IS_FOLLOWER',['../boot_8php.html#ada72d88ae39a7e3b45baea201cb49a29',1,'boot.php']]],
+ ['contact_5fis_5ffriend',['CONTACT_IS_FRIEND',['../boot_8php.html#a27299ecfb9e9a99826f17a1c14c6995f',1,'boot.php']]],
+ ['contact_5fis_5fsharing',['CONTACT_IS_SHARING',['../boot_8php.html#a6c5e9e293c8242dcb9bc2c3ea2fee2c9',1,'boot.php']]]
+];
diff --git a/doc/html/search/variables_64.html b/doc/html/search/variables_64.html
new file mode 100644
index 000000000..df4414b92
--- /dev/null
+++ b/doc/html/search/variables_64.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_64.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/variables_64.js b/doc/html/search/variables_64.js
new file mode 100644
index 000000000..2c0187ed0
--- /dev/null
+++ b/doc/html/search/variables_64.js
@@ -0,0 +1,12 @@
+var searchData=
+[
+ ['db_5fupdate_5fversion',['DB_UPDATE_VERSION',['../boot_8php.html#ac59a18a4838710d6c2de37aed6b21f03',1,'boot.php']]],
+ ['default_5fdb_5fengine',['DEFAULT_DB_ENGINE',['../boot_8php.html#aa8a2b61e70900139d1ca28e46f1da49d',1,'boot.php']]],
+ ['directory_5ffallback_5fmaster',['DIRECTORY_FALLBACK_MASTER',['../boot_8php.html#abedd940e664017c61b48c6efa31d0cb8',1,'boot.php']]],
+ ['directory_5fmode_5fnormal',['DIRECTORY_MODE_NORMAL',['../boot_8php.html#ab7d65a7e7417825a4db62906bb600729',1,'boot.php']]],
+ ['directory_5fmode_5fprimary',['DIRECTORY_MODE_PRIMARY',['../boot_8php.html#a8a60cc38bb567765fd926fef70205f16',1,'boot.php']]],
+ ['directory_5fmode_5fsecondary',['DIRECTORY_MODE_SECONDARY',['../boot_8php.html#aedfb9501ed408278667995524e0d15cf',1,'boot.php']]],
+ ['directory_5fmode_5fstandalone',['DIRECTORY_MODE_STANDALONE',['../boot_8php.html#a25476eec71fceda237f7dc1d78b0adb8',1,'boot.php']]],
+ ['directory_5frealm',['DIRECTORY_REALM',['../boot_8php.html#a6b9909db6a7ec80ec6fdd40ba74014dd',1,'boot.php']]],
+ ['do',['do',['../docblox__errorchecker_8php.html#a721c6ff80a6d3e4ad4ffa52a04c60085',1,'docblox_errorchecker.php']]]
+];
diff --git a/doc/html/search/variables_65.html b/doc/html/search/variables_65.html
new file mode 100644
index 000000000..38eb9f67f
--- /dev/null
+++ b/doc/html/search/variables_65.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_65.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/variables_65.js b/doc/html/search/variables_65.js
new file mode 100644
index 000000000..78718ea57
--- /dev/null
+++ b/doc/html/search/variables_65.js
@@ -0,0 +1,8 @@
+var searchData=
+[
+ ['else',['else',['../auth_8php.html#a0950af7c2888ca1d4743fe5d0bff9ae5',1,'else():&#160;auth.php'],['../fpostit_8php.html#a501b5ca82f287509fc691c88524064c1',1,'else():&#160;fpostit.php'],['../tpldebug_8php.html#afbc7aadb3f7ff1edf0aaaa326a42179c',1,'else():&#160;tpldebug.php'],['../redbasic_2php_2style_8php.html#ab3afb90d611eca90819f597a2c0bb459',1,'else():&#160;style.php']]],
+ ['eol',['EOL',['../boot_8php.html#a0603d6ece8c5d37b4b7db697db053a4b',1,'boot.php']]],
+ ['eot',['EOT',['../typohelper_8php.html#ab6fd357fb5b2a3ba8aab9e8b98c6a805',1,'typohelper.php']]],
+ ['excludepaths',['excludepaths',['../namespaceupdatetpl.html#a988d937ed5d5c2b592b763036af5cf94',1,'updatetpl']]],
+ ['ext',['ext',['../namespacefriendica-to-smarty-tpl.html#aecf730e0884bb4ddc6c0deb1ef85f8eb',1,'friendica-to-smarty-tpl']]]
+];
diff --git a/doc/html/search/variables_66.html b/doc/html/search/variables_66.html
new file mode 100644
index 000000000..6e1863868
--- /dev/null
+++ b/doc/html/search/variables_66.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_66.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/variables_66.js b/doc/html/search/variables_66.js
new file mode 100644
index 000000000..071f9b973
--- /dev/null
+++ b/doc/html/search/variables_66.js
@@ -0,0 +1,8 @@
+var searchData=
+[
+ ['f',['f',['../namespacefriendica-to-smarty-tpl.html#a965e1d6d6293654a56e029a7e454dec7',1,'friendica-to-smarty-tpl']]],
+ ['filename',['filename',['../namespacefriendica-to-smarty-tpl.html#a5f9bf7a67d955c0d6be70a82097611c5',1,'friendica-to-smarty-tpl']]],
+ ['files',['files',['../namespacefriendica-to-smarty-tpl.html#ae74419b16516956c66f7db714a93a6ac',1,'friendica-to-smarty-tpl']]],
+ ['fnull',['fnull',['../namespaceupdatetpl.html#a79c20eb62d568c999b56eb08530355d3',1,'updatetpl']]],
+ ['foreach',['foreach',['../typo_8php.html#a329c9c12217d2c8660c47bbc7c8df4c5',1,'typo.php']]]
+];
diff --git a/doc/html/search/variables_67.html b/doc/html/search/variables_67.html
new file mode 100644
index 000000000..8a1f3d9e5
--- /dev/null
+++ b/doc/html/search/variables_67.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_67.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/variables_67.js b/doc/html/search/variables_67.js
new file mode 100644
index 000000000..cf66f0cdb
--- /dev/null
+++ b/doc/html/search/variables_67.js
@@ -0,0 +1,6 @@
+var searchData=
+[
+ ['gravity_5fcomment',['GRAVITY_COMMENT',['../boot_8php.html#a4a12ce5de39789b0361e308d89925a20',1,'boot.php']]],
+ ['gravity_5flike',['GRAVITY_LIKE',['../boot_8php.html#a1f5906598e90b5ea2b4245f682be4348',1,'boot.php']]],
+ ['gravity_5fparent',['GRAVITY_PARENT',['../boot_8php.html#a2af173e4e9836ee7c90757b4793a2be3',1,'boot.php']]]
+];
diff --git a/doc/html/search/variables_68.html b/doc/html/search/variables_68.html
new file mode 100644
index 000000000..2f0a862b9
--- /dev/null
+++ b/doc/html/search/variables_68.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_68.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/variables_68.js b/doc/html/search/variables_68.js
new file mode 100644
index 000000000..fcb2ae040
--- /dev/null
+++ b/doc/html/search/variables_68.js
@@ -0,0 +1,11 @@
+var searchData=
+[
+ ['hubloc_5fflags_5fdeleted',['HUBLOC_FLAGS_DELETED',['../boot_8php.html#a7c286add8961fd2d79216314cd4aadd8',1,'boot.php']]],
+ ['hubloc_5fflags_5fprimary',['HUBLOC_FLAGS_PRIMARY',['../boot_8php.html#a3ad9cc5d4354be741fa1de12b96e9955',1,'boot.php']]],
+ ['hubloc_5fflags_5funverified',['HUBLOC_FLAGS_UNVERIFIED',['../boot_8php.html#ab54b24cc302e1a42a67a49d788b6b764',1,'boot.php']]],
+ ['hubloc_5fnotused',['HUBLOC_NOTUSED',['../boot_8php.html#aa589421267f0c2f0d643f727792cce35',1,'boot.php']]],
+ ['hubloc_5foffline',['HUBLOC_OFFLINE',['../boot_8php.html#a845891f82bf6edd7fa2d578b66703112',1,'boot.php']]],
+ ['hubloc_5freceive_5ferror',['HUBLOC_RECEIVE_ERROR',['../boot_8php.html#abeb4d86e17cefa8584f1244e2183b0e1',1,'boot.php']]],
+ ['hubloc_5fsend_5ferror',['HUBLOC_SEND_ERROR',['../boot_8php.html#a3b56bfc6a0dd159070e316ddac3b7456',1,'boot.php']]],
+ ['hubloc_5fworks',['HUBLOC_WORKS',['../boot_8php.html#a7a8ba64d089cc0412c59a2eefc6d655c',1,'boot.php']]]
+];
diff --git a/doc/html/search/variables_69.html b/doc/html/search/variables_69.html
new file mode 100644
index 000000000..44c2cd1ee
--- /dev/null
+++ b/doc/html/search/variables_69.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_69.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/variables_69.js b/doc/html/search/variables_69.js
new file mode 100644
index 000000000..dc5368a10
--- /dev/null
+++ b/doc/html/search/variables_69.js
@@ -0,0 +1,30 @@
+var searchData=
+[
+ ['if',['if',['../php2po_8php.html#a45b05625748f412ec97afcd61cf7980b',1,'if():&#160;php2po.php'],['../php_2default_8php.html#a23bc1996b18e69c1a3ab44536613a762',1,'if():&#160;default.php'],['../full_8php.html#a6fac1b4b8cdfde06ea1b7713479e92db',1,'if():&#160;full.php'],['../apw_2php_2style_8php.html#a883f9f14e205f7aa7de02c14df67b40a',1,'if():&#160;style.php'],['../redbasic_2php_2style_8php.html#a883f9f14e205f7aa7de02c14df67b40a',1,'if():&#160;style.php']]],
+ ['item_5fblocked',['ITEM_BLOCKED',['../boot_8php.html#ab28dc518fa90b6f617dd8c564eb4f35f',1,'boot.php']]],
+ ['item_5fbug',['ITEM_BUG',['../boot_8php.html#a87b0f279f8413c7e4d805c5d85f20d34',1,'boot.php']]],
+ ['item_5fbuildblock',['ITEM_BUILDBLOCK',['../boot_8php.html#a7fc4b291a7cdaa48b38e27344ea183cf',1,'boot.php']]],
+ ['item_5fdelayed_5fpublish',['ITEM_DELAYED_PUBLISH',['../boot_8php.html#ac890557fedc5b5a3b1d996249b1e1a20',1,'boot.php']]],
+ ['item_5fdeleted',['ITEM_DELETED',['../boot_8php.html#a3515ea6bf77495de89b93e9ccd881c49',1,'boot.php']]],
+ ['item_5fhidden',['ITEM_HIDDEN',['../boot_8php.html#ac99fc4d040764eac1736bec6973556fe',1,'boot.php']]],
+ ['item_5fmentionsme',['ITEM_MENTIONSME',['../boot_8php.html#a8da836617174eed9fc2ac8054125354b',1,'boot.php']]],
+ ['item_5fmoderated',['ITEM_MODERATED',['../boot_8php.html#ac01230c7655e0705b2e99c9bc03c4450',1,'boot.php']]],
+ ['item_5fnocomment',['ITEM_NOCOMMENT',['../boot_8php.html#a949116d9a295b214293006c060ca4848',1,'boot.php']]],
+ ['item_5fnotshown',['ITEM_NOTSHOWN',['../boot_8php.html#a8663f32171568489dbb2a01dd00371f8',1,'boot.php']]],
+ ['item_5fnsfw',['ITEM_NSFW',['../boot_8php.html#a939de9a99278f4fd7dcd0ee67f243f08',1,'boot.php']]],
+ ['item_5fobscured',['ITEM_OBSCURED',['../boot_8php.html#a2c8906f1af94a3559a5b4661067bb79d',1,'boot.php']]],
+ ['item_5forigin',['ITEM_ORIGIN',['../boot_8php.html#a8c9dce0ef27b35397e29298eb966f7f7',1,'boot.php']]],
+ ['item_5fpdl',['ITEM_PDL',['../boot_8php.html#a6e57d913634d033b4d5ad72d99fd3e9d',1,'boot.php']]],
+ ['item_5frelay',['ITEM_RELAY',['../boot_8php.html#a2958a2bd5422b85329d7c36c06dbc221',1,'boot.php']]],
+ ['item_5fspam',['ITEM_SPAM',['../boot_8php.html#a40d885b2cfd736aab4234ae641ca4dfb',1,'boot.php']]],
+ ['item_5fstarred',['ITEM_STARRED',['../boot_8php.html#a7af107fab8d62b9a73801713b774ed30',1,'boot.php']]],
+ ['item_5fthread_5ftop',['ITEM_THREAD_TOP',['../boot_8php.html#a749144d8dd9c1366596a0213c277d050',1,'boot.php']]],
+ ['item_5funpublished',['ITEM_UNPUBLISHED',['../boot_8php.html#adaeb4f590c56326b2dca3b19f31b6272',1,'boot.php']]],
+ ['item_5funseen',['ITEM_UNSEEN',['../boot_8php.html#a009e6a0637cb65804ea8094ecc4450b0',1,'boot.php']]],
+ ['item_5fuplink',['ITEM_UPLINK',['../boot_8php.html#aefba06f1c0842036329033e7567ecf6d',1,'boot.php']]],
+ ['item_5fuplink_5fprv',['ITEM_UPLINK_PRV',['../boot_8php.html#aad33b494084f729b6ee3b0bc457718a1',1,'boot.php']]],
+ ['item_5fverified',['ITEM_VERIFIED',['../boot_8php.html#a18a400fa45e5632811b33041d8c048bf',1,'boot.php']]],
+ ['item_5fvisible',['ITEM_VISIBLE',['../boot_8php.html#ab55b16ae7fc19fafe5afaedd49163bbf',1,'boot.php']]],
+ ['item_5fwall',['ITEM_WALL',['../boot_8php.html#a6788e99021ec8ffb0fa94d651f22a322',1,'boot.php']]],
+ ['item_5fwebpage',['ITEM_WEBPAGE',['../boot_8php.html#af489d0c3166551b93e63a79ff2c9be35',1,'boot.php']]]
+];
diff --git a/doc/html/search/variables_6a.html b/doc/html/search/variables_6a.html
new file mode 100644
index 000000000..e87ecc409
--- /dev/null
+++ b/doc/html/search/variables_6a.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_6a.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/variables_6a.js b/doc/html/search/variables_6a.js
new file mode 100644
index 000000000..43e76e798
--- /dev/null
+++ b/doc/html/search/variables_6a.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['jpeg_5fquality',['JPEG_QUALITY',['../boot_8php.html#a3475ff6c2e575f946ea0ee377e944173',1,'boot.php']]]
+];
diff --git a/doc/html/search/variables_6b.html b/doc/html/search/variables_6b.html
new file mode 100644
index 000000000..d1001a969
--- /dev/null
+++ b/doc/html/search/variables_6b.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_6b.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/variables_6b.js b/doc/html/search/variables_6b.js
new file mode 100644
index 000000000..dd6ee4759
--- /dev/null
+++ b/doc/html/search/variables_6b.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['key_5fnot_5fexists',['KEY_NOT_EXISTS',['../template__processor_8php.html#a797745996c7839a93b2ab1af456631ab',1,'template_processor.php']]]
+];
diff --git a/doc/html/search/variables_6c.html b/doc/html/search/variables_6c.html
new file mode 100644
index 000000000..8d08e812e
--- /dev/null
+++ b/doc/html/search/variables_6c.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_6c.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/variables_6c.js b/doc/html/search/variables_6c.js
new file mode 100644
index 000000000..9540ea4f0
--- /dev/null
+++ b/doc/html/search/variables_6c.js
@@ -0,0 +1,11 @@
+var searchData=
+[
+ ['language_5fdetect_5fmin_5fconfidence',['LANGUAGE_DETECT_MIN_CONFIDENCE',['../boot_8php.html#a68d1d5bc9c7ccb663dc671b48c66df11',1,'boot.php']]],
+ ['language_5fdetect_5fmin_5flength',['LANGUAGE_DETECT_MIN_LENGTH',['../boot_8php.html#a17cf72338b040891781a4bcbdd9a8595',1,'boot.php']]],
+ ['ldelim',['ldelim',['../namespacefriendica-to-smarty-tpl.html#a0b4cf73d1a8d201a28d269eeb62a5d5c',1,'friendica-to-smarty-tpl']]],
+ ['logger_5fall',['LOGGER_ALL',['../boot_8php.html#afe63ae69ba55299f813766e54df06ede',1,'boot.php']]],
+ ['logger_5fdata',['LOGGER_DATA',['../boot_8php.html#a6969947145a139ec374ce098224d8e81',1,'boot.php']]],
+ ['logger_5fdebug',['LOGGER_DEBUG',['../boot_8php.html#a93823d15ae07548a4c49de88d325cd26',1,'boot.php']]],
+ ['logger_5fnormal',['LOGGER_NORMAL',['../boot_8php.html#a17b4ea23d9ecf628d9c8f53b7abcb805',1,'boot.php']]],
+ ['logger_5ftrace',['LOGGER_TRACE',['../boot_8php.html#a022cea669f9f13ef7c6268b63884c57f',1,'boot.php']]]
+];
diff --git a/doc/html/search/variables_6d.html b/doc/html/search/variables_6d.html
new file mode 100644
index 000000000..1b8f1a83a
--- /dev/null
+++ b/doc/html/search/variables_6d.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_6d.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/variables_6d.js b/doc/html/search/variables_6d.js
new file mode 100644
index 000000000..4996247cb
--- /dev/null
+++ b/doc/html/search/variables_6d.js
@@ -0,0 +1,13 @@
+var searchData=
+[
+ ['mail_5fdeleted',['MAIL_DELETED',['../boot_8php.html#ad0876e837cf3fad8a26417e315f6e2c8',1,'boot.php']]],
+ ['mail_5fisreply',['MAIL_ISREPLY',['../boot_8php.html#aa544a6c078130d0967a1f4ed8ce0a2d2',1,'boot.php']]],
+ ['mail_5fobscured',['MAIL_OBSCURED',['../boot_8php.html#a44ae1542a805ffd7f826fb511db07374',1,'boot.php']]],
+ ['mail_5frecalled',['MAIL_RECALLED',['../boot_8php.html#ae4861de36017fe399c1839f778bad9f5',1,'boot.php']]],
+ ['mail_5freplied',['MAIL_REPLIED',['../boot_8php.html#aa3679df31c8dad1b71816b0322d5baff',1,'boot.php']]],
+ ['mail_5fseen',['MAIL_SEEN',['../boot_8php.html#a1fbb93cf030f07391f22cc2948744869',1,'boot.php']]],
+ ['max_5fimage_5flength',['MAX_IMAGE_LENGTH',['../boot_8php.html#a525ca93ff35d3535d1a2b8ba57876afa',1,'boot.php']]],
+ ['max_5flikers',['MAX_LIKERS',['../boot_8php.html#a35625dacd2158b9f1f1a8e77f9f081fd',1,'boot.php']]],
+ ['menu_5fitem_5fnewwin',['MENU_ITEM_NEWWIN',['../boot_8php.html#ad11f30a6590d3d77f0c5e1e3909af8f5',1,'boot.php']]],
+ ['menu_5fitem_5fzid',['MENU_ITEM_ZID',['../boot_8php.html#aed0dfb35f7dd00dc9e4f868ea7f7ff53',1,'boot.php']]]
+];
diff --git a/doc/html/search/variables_6e.html b/doc/html/search/variables_6e.html
new file mode 100644
index 000000000..2eb4def97
--- /dev/null
+++ b/doc/html/search/variables_6e.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_6e.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/variables_6e.js b/doc/html/search/variables_6e.js
new file mode 100644
index 000000000..cf8c2728f
--- /dev/null
+++ b/doc/html/search/variables_6e.js
@@ -0,0 +1,45 @@
+var searchData=
+[
+ ['n',['n',['../php2po_8php.html#a1594a11499d06cc8a789ee7ca0c7a12b',1,'php2po.php']]],
+ ['names',['names',['../namespaceupdatetpl.html#ab42dd79af65ee82201fd6f04715f62f6',1,'updatetpl']]],
+ ['namespace_5factivity',['NAMESPACE_ACTIVITY',['../boot_8php.html#a5df5359090d1f8e898c36d7cf8878ad2',1,'boot.php']]],
+ ['namespace_5factivity_5fschema',['NAMESPACE_ACTIVITY_SCHEMA',['../boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133',1,'boot.php']]],
+ ['namespace_5fatom1',['NAMESPACE_ATOM1',['../boot_8php.html#a444ce608ce34efb82ee11852f36e825f',1,'boot.php']]],
+ ['namespace_5fdfrn',['NAMESPACE_DFRN',['../boot_8php.html#a7ed4581ab66ebcde97f6b3730856b028',1,'boot.php']]],
+ ['namespace_5ffeed',['NAMESPACE_FEED',['../boot_8php.html#ac195fc9003298923ea81f144388e24b1',1,'boot.php']]],
+ ['namespace_5fgeorss',['NAMESPACE_GEORSS',['../boot_8php.html#a03d19251c245587de7ed959300b87bdf',1,'boot.php']]],
+ ['namespace_5fmedia',['NAMESPACE_MEDIA',['../boot_8php.html#a6626f383c3d2d459f731ab8b4f237d16',1,'boot.php']]],
+ ['namespace_5fostatus',['NAMESPACE_OSTATUS',['../boot_8php.html#acca19aae62e1a6951a856b945de20d67',1,'boot.php']]],
+ ['namespace_5fostatussub',['NAMESPACE_OSTATUSSUB',['../boot_8php.html#a181c111f4b6c14d091dfd3bf0d0a22cd',1,'boot.php']]],
+ ['namespace_5fpoco',['NAMESPACE_POCO',['../boot_8php.html#a0b73e2548d6f9beb9c93211f488e336a',1,'boot.php']]],
+ ['namespace_5fsalmon_5fme',['NAMESPACE_SALMON_ME',['../boot_8php.html#aee324eca9de4e0fedf01ab5f92e27c67',1,'boot.php']]],
+ ['namespace_5fstatusnet',['NAMESPACE_STATUSNET',['../boot_8php.html#afaf93b7026f784b113b4f8921745891e',1,'boot.php']]],
+ ['namespace_5fthread',['NAMESPACE_THREAD',['../boot_8php.html#a1d6e7f4c08bb68e4a424326a811bdd86',1,'boot.php']]],
+ ['namespace_5ftomb',['NAMESPACE_TOMB',['../boot_8php.html#a4bfe22e163657690dfb6d5b1d04cb47e',1,'boot.php']]],
+ ['namespace_5fzot',['NAMESPACE_ZOT',['../boot_8php.html#a49f2a70b3b43aa904223a8d19e986a47',1,'boot.php']]],
+ ['network_5fdfrn',['NETWORK_DFRN',['../boot_8php.html#ae3cef7b63e25e7bafea3fcf6b99fad0e',1,'boot.php']]],
+ ['network_5fdiaspora',['NETWORK_DIASPORA',['../boot_8php.html#a38f6c7fe33b5434a24b4314567753dfa',1,'boot.php']]],
+ ['network_5ffacebook',['NETWORK_FACEBOOK',['../boot_8php.html#af3905ea8f8568d0236db13fca40514e3',1,'boot.php']]],
+ ['network_5ffeed',['NETWORK_FEED',['../boot_8php.html#ab4bddb41a0cf407178ec5278b950c393',1,'boot.php']]],
+ ['network_5fgplus',['NETWORK_GPLUS',['../boot_8php.html#a8905fde0a5b7882bdc083b20d9b34701',1,'boot.php']]],
+ ['network_5flinkedin',['NETWORK_LINKEDIN',['../boot_8php.html#a5b043b7fdcfd4e8c9c3747574afc6caa',1,'boot.php']]],
+ ['network_5fmail',['NETWORK_MAIL',['../boot_8php.html#a7236b2cdcf59f02a42302e893a99013b',1,'boot.php']]],
+ ['network_5fmail2',['NETWORK_MAIL2',['../boot_8php.html#aa17a4f9c63f5cbc5c06f1066b6aebc42',1,'boot.php']]],
+ ['network_5fmyspace',['NETWORK_MYSPACE',['../boot_8php.html#ae94f7c7c0909629a75aed1c41f10bc95',1,'boot.php']]],
+ ['network_5fostatus',['NETWORK_OSTATUS',['../boot_8php.html#aef4b6c558c68c88c10f13c5a00c20e3d',1,'boot.php']]],
+ ['network_5fphantom',['NETWORK_PHANTOM',['../boot_8php.html#ab21fb0f3e6b962419955c6fc7f26734f',1,'boot.php']]],
+ ['network_5fxmpp',['NETWORK_XMPP',['../boot_8php.html#a43296b1b4398aacbf92a4b2d56bab91e',1,'boot.php']]],
+ ['network_5fzot',['NETWORK_ZOT',['../boot_8php.html#a2c65e925994566a63e6c03c381f1b4a0',1,'boot.php']]],
+ ['newfilename',['newfilename',['../namespacefriendica-to-smarty-tpl.html#ad9ef87ccb2c9960501f5e02424a22d80',1,'friendica-to-smarty-tpl']]],
+ ['notify_5fcomment',['NOTIFY_COMMENT',['../boot_8php.html#a20f0eed431d25870b624b8937a07a59f',1,'boot.php']]],
+ ['notify_5fconfirm',['NOTIFY_CONFIRM',['../boot_8php.html#af8c0cb0744c9a6b5d6d3baafb1f1e71d',1,'boot.php']]],
+ ['notify_5fintro',['NOTIFY_INTRO',['../boot_8php.html#a56fd673eaa7014150297ce1162502db5',1,'boot.php']]],
+ ['notify_5fmail',['NOTIFY_MAIL',['../boot_8php.html#a285732e7889fa7f333cbe431111e1029',1,'boot.php']]],
+ ['notify_5fpoke',['NOTIFY_POKE',['../boot_8php.html#aca08bc4f1554ba877500f6abcc99e1e8',1,'boot.php']]],
+ ['notify_5fprofile',['NOTIFY_PROFILE',['../boot_8php.html#a981d46380f9f23c308bac1f9cb00dc5b',1,'boot.php']]],
+ ['notify_5fsuggest',['NOTIFY_SUGGEST',['../boot_8php.html#a9d01ef178b72b145016cca1393415bc4',1,'boot.php']]],
+ ['notify_5fsystem',['NOTIFY_SYSTEM',['../boot_8php.html#a14d44d4a00223dc3db4ea962325db192',1,'boot.php']]],
+ ['notify_5ftagself',['NOTIFY_TAGSELF',['../boot_8php.html#ab724491497ab2618b23a01d5da60aec0',1,'boot.php']]],
+ ['notify_5ftagshare',['NOTIFY_TAGSHARE',['../boot_8php.html#af6937db5f581d006bf4a5c3d9c7e0461',1,'boot.php']]],
+ ['notify_5fwall',['NOTIFY_WALL',['../boot_8php.html#a505410c7edc5f5bb5fa227b98359793e',1,'boot.php']]]
+];
diff --git a/doc/html/search/variables_6f.html b/doc/html/search/variables_6f.html
new file mode 100644
index 000000000..f06e2e0f4
--- /dev/null
+++ b/doc/html/search/variables_6f.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_6f.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/variables_6f.js b/doc/html/search/variables_6f.js
new file mode 100644
index 000000000..f7979a46a
--- /dev/null
+++ b/doc/html/search/variables_6f.js
@@ -0,0 +1,5 @@
+var searchData=
+[
+ ['outf',['outf',['../namespacefriendica-to-smarty-tpl.html#a87182a9bab47640428bd0b2b9946bef9',1,'friendica-to-smarty-tpl']]],
+ ['outpath',['outpath',['../namespacefriendica-to-smarty-tpl.html#a005c1b7a69cac31fad72a941974ba7bb',1,'friendica-to-smarty-tpl']]]
+];
diff --git a/doc/html/search/variables_70.html b/doc/html/search/variables_70.html
new file mode 100644
index 000000000..439d152f5
--- /dev/null
+++ b/doc/html/search/variables_70.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_70.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/variables_70.js b/doc/html/search/variables_70.js
new file mode 100644
index 000000000..6fe926c34
--- /dev/null
+++ b/doc/html/search/variables_70.js
@@ -0,0 +1,49 @@
+var searchData=
+[
+ ['page',['page',['../mod__import_8php.html#a8db1899eeeb44dabd0904065b63627bb',1,'mod_import.php']]],
+ ['page_5fadult',['PAGE_ADULT',['../boot_8php.html#ace83842dbeb84f7ed9ac59a9f57a7c32',1,'boot.php']]],
+ ['page_5fapplication',['PAGE_APPLICATION',['../boot_8php.html#a8231d115060d41a9c2a677f2c86f10ed',1,'boot.php']]],
+ ['page_5fautoconnect',['PAGE_AUTOCONNECT',['../boot_8php.html#aa275653b9c87abc7391bb8040c1c2de9',1,'boot.php']]],
+ ['page_5fdirectory_5fchannel',['PAGE_DIRECTORY_CHANNEL',['../boot_8php.html#a5b8484922918946d041e5e0515dbe718',1,'boot.php']]],
+ ['page_5fhidden',['PAGE_HIDDEN',['../boot_8php.html#a5e322a2a2d0f51924c0b2e874988e640',1,'boot.php']]],
+ ['page_5fnormal',['PAGE_NORMAL',['../boot_8php.html#a09532c3f750ae8c4527e63b2b790cbf3',1,'boot.php']]],
+ ['page_5fpremium',['PAGE_PREMIUM',['../boot_8php.html#ab3920c2f3cd64802c0b7ff625c3b2ea8',1,'boot.php']]],
+ ['page_5fremoved',['PAGE_REMOVED',['../boot_8php.html#a4edce16cb7f21cdafa1e85bf63d713e6',1,'boot.php']]],
+ ['page_5fsystem',['PAGE_SYSTEM',['../boot_8php.html#a6ee7a72d558d1851bbb9e3cdde377932',1,'boot.php']]],
+ ['path',['path',['../namespacefriendica-to-smarty-tpl.html#a68d15934660cd1f4301ce251b1646f09',1,'friendica-to-smarty-tpl.path()'],['../namespaceupdatetpl.html#ae694f5e1f25f8a92a945eb90c432dfe6',1,'updatetpl.path()']]],
+ ['perms_5fa_5fdelegate',['PERMS_A_DELEGATE',['../boot_8php.html#a423505ab8dbd8e39d04ae3fe1374102b',1,'boot.php']]],
+ ['perms_5fa_5frepublish',['PERMS_A_REPUBLISH',['../boot_8php.html#aae6c941bde5fd6fce07e51dba7326ead',1,'boot.php']]],
+ ['perms_5fcontacts',['PERMS_CONTACTS',['../boot_8php.html#ab2d0e8a9b81ee548ef2ce8e4560da2f6',1,'boot.php']]],
+ ['perms_5fnetwork',['PERMS_NETWORK',['../boot_8php.html#a6df1102664f64b274810db85197c2755',1,'boot.php']]],
+ ['perms_5fpublic',['PERMS_PUBLIC',['../boot_8php.html#aff210e8403dd72368522b17fb6e5d4e7',1,'boot.php']]],
+ ['perms_5fr_5fabook',['PERMS_R_ABOOK',['../boot_8php.html#a3d6d4fc5fafcc9156811669158541caf',1,'boot.php']]],
+ ['perms_5fr_5fpages',['PERMS_R_PAGES',['../boot_8php.html#ab51965fabe54dc031e9a0ce1142ee83e',1,'boot.php']]],
+ ['perms_5fr_5fphotos',['PERMS_R_PHOTOS',['../boot_8php.html#a29e921c0c72412cc738e44cca6ca1f62',1,'boot.php']]],
+ ['perms_5fr_5fprofile',['PERMS_R_PROFILE',['../boot_8php.html#ad789aef3cb95fc1eb36be7c4283d0137',1,'boot.php']]],
+ ['perms_5fr_5fstorage',['PERMS_R_STORAGE',['../boot_8php.html#a1db4f0009c9cb4e107eab0f914a3c8dc',1,'boot.php']]],
+ ['perms_5fr_5fstream',['PERMS_R_STREAM',['../boot_8php.html#aec36f8fcd4cb14a52934590b3d6666b4',1,'boot.php']]],
+ ['perms_5fsite',['PERMS_SITE',['../boot_8php.html#a9ff652e5cb83cd11cbb0350844e7b28f',1,'boot.php']]],
+ ['perms_5fspecific',['PERMS_SPECIFIC',['../boot_8php.html#a9cc986b4f9dd6558cbb2e25aadbfd964',1,'boot.php']]],
+ ['perms_5fw_5fchat',['PERMS_W_CHAT',['../boot_8php.html#acd877c405b06b348b37b6f7e62a211e9',1,'boot.php']]],
+ ['perms_5fw_5fcomment',['PERMS_W_COMMENT',['../boot_8php.html#a32df13fec0e43281da5979e1f5579aa8',1,'boot.php']]],
+ ['perms_5fw_5fmail',['PERMS_W_MAIL',['../boot_8php.html#a6b31dd451bc6c37fe7c9c766ff385aaf',1,'boot.php']]],
+ ['perms_5fw_5fpages',['PERMS_W_PAGES',['../boot_8php.html#aa9244fc9cc221980c07a20cc534111be',1,'boot.php']]],
+ ['perms_5fw_5fphotos',['PERMS_W_PHOTOS',['../boot_8php.html#a57eee7352714c004d36c26dda74af73e',1,'boot.php']]],
+ ['perms_5fw_5fstorage',['PERMS_W_STORAGE',['../boot_8php.html#a4fefd7486d3b888a05cfd3dc9575f115',1,'boot.php']]],
+ ['perms_5fw_5fstream',['PERMS_W_STREAM',['../boot_8php.html#a8bb0395933b5e886f086f6a2fb0bfa55',1,'boot.php']]],
+ ['perms_5fw_5ftagwall',['PERMS_W_TAGWALL',['../boot_8php.html#a99a4a17cb644e7e6826ea07ecaf09777',1,'boot.php']]],
+ ['perms_5fw_5fwall',['PERMS_W_WALL',['../boot_8php.html#a6b14a31a8aa9f3452a13383f413bffa2',1,'boot.php']]],
+ ['photo_5fnormal',['PHOTO_NORMAL',['../boot_8php.html#a4a49b29838ef2c45ab3556b52baec6a4',1,'boot.php']]],
+ ['photo_5fprofile',['PHOTO_PROFILE',['../boot_8php.html#ab4bc9c50ecc927b92d519e36562b0df0',1,'boot.php']]],
+ ['photo_5fthing',['PHOTO_THING',['../boot_8php.html#a78849a1bf8ce8d9804b4cbb502e8f383',1,'boot.php']]],
+ ['photo_5fxchan',['PHOTO_XCHAN',['../boot_8php.html#ac43182e0d8bae7576a30b603774974f8',1,'boot.php']]],
+ ['php_5ftpl',['php_tpl',['../namespacefriendica-to-smarty-tpl.html#a5dfc21ab8282dda8e3a7dff43cd0e283',1,'friendica-to-smarty-tpl']]],
+ ['png_5fquality',['PNG_QUALITY',['../boot_8php.html#a8df201788c9dd0ca91384e3a14c08bce',1,'boot.php']]],
+ ['poll_5fmultiple_5fchoice',['POLL_MULTIPLE_CHOICE',['../boot_8php.html#abbf5ac24eb8aeedb862f618ee0d21e86',1,'boot.php']]],
+ ['poll_5foverwrite',['POLL_OVERWRITE',['../boot_8php.html#a2b525996e4426bdddbcec277778bde08',1,'boot.php']]],
+ ['poll_5fsimple_5frating',['POLL_SIMPLE_RATING',['../boot_8php.html#ad88a70ec62e08d590123d3697dfe64d5',1,'boot.php']]],
+ ['poll_5ftenscale',['POLL_TENSCALE',['../boot_8php.html#a1ba00027b718db732f30fc0e2c3e0abc',1,'boot.php']]],
+ ['post_5fto_5fred_5facct_5fname',['post_to_red_acct_name',['../post__to__red_8php.html#a588cea66afe0b32f27f2713d44940119',1,'post_to_red.php']]],
+ ['post_5fto_5fred_5fpath',['post_to_red_path',['../post__to__red_8php.html#a6210f39392a5f0fa0255cc7d3760493a',1,'post_to_red.php']]],
+ ['post_5fto_5fred_5fversion',['post_to_red_version',['../post__to__red_8php.html#af3e7ebd361d4ed7cb6d43209970cd94a',1,'post_to_red.php']]]
+];
diff --git a/doc/html/search/variables_72.html b/doc/html/search/variables_72.html
new file mode 100644
index 000000000..8a4ee7bb3
--- /dev/null
+++ b/doc/html/search/variables_72.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_72.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/variables_72.js b/doc/html/search/variables_72.js
new file mode 100644
index 000000000..be2927ed5
--- /dev/null
+++ b/doc/html/search/variables_72.js
@@ -0,0 +1,12 @@
+var searchData=
+[
+ ['random_5fstring_5fhex',['RANDOM_STRING_HEX',['../text_8php.html#aad557c054cf2ed915633701018fc7e3f',1,'text.php']]],
+ ['random_5fstring_5ftext',['RANDOM_STRING_TEXT',['../text_8php.html#a2ffd79c60cc87cec24ef76447b905187',1,'text.php']]],
+ ['rdelim',['rdelim',['../namespacefriendica-to-smarty-tpl.html#a8540514fb7c4aa18ad2dffa2a975036b',1,'friendica-to-smarty-tpl']]],
+ ['red_5fplatform',['RED_PLATFORM',['../boot_8php.html#a96ad56755a21e1361dbd7bf93c9e7ff4',1,'boot.php']]],
+ ['red_5fversion',['RED_VERSION',['../boot_8php.html#a21cc29e0025943e7c28ff58cb4856ac3',1,'boot.php']]],
+ ['register_5fapprove',['REGISTER_APPROVE',['../boot_8php.html#a7176c0f9f1c98421b97735d892cf6252',1,'boot.php']]],
+ ['register_5fclosed',['REGISTER_CLOSED',['../boot_8php.html#a69aac276ed82e010dc382b16ab4d59e1',1,'boot.php']]],
+ ['register_5fopen',['REGISTER_OPEN',['../boot_8php.html#ad8887b49bbb02dd30b4eb9f6c7773c63',1,'boot.php']]],
+ ['request_5ftoken_5fduration',['REQUEST_TOKEN_DURATION',['../oauth_8php.html#a7a32a5990f113ac9465b03b29175cf16',1,'oauth.php']]]
+];
diff --git a/doc/html/search/variables_73.html b/doc/html/search/variables_73.html
new file mode 100644
index 000000000..388a6d74b
--- /dev/null
+++ b/doc/html/search/variables_73.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_73.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/variables_73.js b/doc/html/search/variables_73.js
new file mode 100644
index 000000000..961bce010
--- /dev/null
+++ b/doc/html/search/variables_73.js
@@ -0,0 +1,7 @@
+var searchData=
+[
+ ['ssl_5fpolicy_5ffull',['SSL_POLICY_FULL',['../boot_8php.html#a02566ac9d891369a1d3ebb81a15722fc',1,'boot.php']]],
+ ['ssl_5fpolicy_5fnone',['SSL_POLICY_NONE',['../boot_8php.html#af86c651547aa8f9e549ee40a09455549',1,'boot.php']]],
+ ['ssl_5fpolicy_5fselfsign',['SSL_POLICY_SELFSIGN',['../boot_8php.html#adca48aee78465ae3064ca4432c0d87b5',1,'boot.php']]],
+ ['storage_5fdefault_5fpermissions',['STORAGE_DEFAULT_PERMISSIONS',['../boot_8php.html#aecaa1b6945b317ba8f1daf4af2aed8e6',1,'boot.php']]]
+];
diff --git a/doc/html/search/variables_74.html b/doc/html/search/variables_74.html
new file mode 100644
index 000000000..1665fb806
--- /dev/null
+++ b/doc/html/search/variables_74.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_74.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/variables_74.js b/doc/html/search/variables_74.js
new file mode 100644
index 000000000..e36593332
--- /dev/null
+++ b/doc/html/search/variables_74.js
@@ -0,0 +1,18 @@
+var searchData=
+[
+ ['term_5fcategory',['TERM_CATEGORY',['../boot_8php.html#af33d1b2e98a1e21af672005525d46dfe',1,'boot.php']]],
+ ['term_5ffile',['TERM_FILE',['../boot_8php.html#afb97615e985a013799839b68b99018d7',1,'boot.php']]],
+ ['term_5fhashtag',['TERM_HASHTAG',['../boot_8php.html#a2750985ec445617d7e82ae3098c91e3f',1,'boot.php']]],
+ ['term_5fmention',['TERM_MENTION',['../boot_8php.html#ae37444eaa42705185080ccf3e670cbc2',1,'boot.php']]],
+ ['term_5fobj_5fchannel',['TERM_OBJ_CHANNEL',['../boot_8php.html#a8892374789fd261eb32a7969d934a14a',1,'boot.php']]],
+ ['term_5fobj_5fobject',['TERM_OBJ_OBJECT',['../boot_8php.html#a882b666adfe21f035a0f8c02806066d6',1,'boot.php']]],
+ ['term_5fobj_5fphoto',['TERM_OBJ_PHOTO',['../boot_8php.html#a64617d4655804de2a3c86501ab4fdbfd',1,'boot.php']]],
+ ['term_5fobj_5fpost',['TERM_OBJ_POST',['../boot_8php.html#a9eeb8989272d5ff804a616898bb13659',1,'boot.php']]],
+ ['term_5fobj_5fprofile',['TERM_OBJ_PROFILE',['../boot_8php.html#aead84fa27d7516b855220fe004964a45',1,'boot.php']]],
+ ['term_5fobj_5fthing',['TERM_OBJ_THING',['../boot_8php.html#a0cc8dc76bd10ac0ec81bac08a46f82fe',1,'boot.php']]],
+ ['term_5fpcategory',['TERM_PCATEGORY',['../boot_8php.html#a45b12aefab9675baffc7a07a09486db8',1,'boot.php']]],
+ ['term_5fsavedsearch',['TERM_SAVEDSEARCH',['../boot_8php.html#abd7bb40da9cc073297e49736b338ca07',1,'boot.php']]],
+ ['term_5fthing',['TERM_THING',['../boot_8php.html#a0d877df1e20bae765e1708be50f6b503',1,'boot.php']]],
+ ['term_5funknown',['TERM_UNKNOWN',['../boot_8php.html#a0c59dde058efebbc66520d136cbd1631',1,'boot.php']]],
+ ['tplpaths',['tplpaths',['../namespaceupdatetpl.html#a52a85ffa6b6d63d840b185a133478c12',1,'updatetpl']]]
+];
diff --git a/doc/html/search/variables_75.html b/doc/html/search/variables_75.html
new file mode 100644
index 000000000..7850aec50
--- /dev/null
+++ b/doc/html/search/variables_75.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_75.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/variables_75.js b/doc/html/search/variables_75.js
new file mode 100644
index 000000000..f7ce77673
--- /dev/null
+++ b/doc/html/search/variables_75.js
@@ -0,0 +1,7 @@
+var searchData=
+[
+ ['update_5ffailed',['UPDATE_FAILED',['../boot_8php.html#a75fc600186b13c3b25e661afefb5eac8',1,'boot.php']]],
+ ['update_5fflags_5fdeleted',['UPDATE_FLAGS_DELETED',['../boot_8php.html#aea392cb26ed617f3a8cde648385b5df0',1,'boot.php']]],
+ ['update_5fflags_5fupdated',['UPDATE_FLAGS_UPDATED',['../boot_8php.html#a9690d73434125ce594a1f5e7c2a4f7c0',1,'boot.php']]],
+ ['update_5fsuccess',['UPDATE_SUCCESS',['../boot_8php.html#ac86615ddc0763a00f5311c90e991730c',1,'boot.php']]]
+];
diff --git a/doc/html/search/variables_77.html b/doc/html/search/variables_77.html
new file mode 100644
index 000000000..434c6df9e
--- /dev/null
+++ b/doc/html/search/variables_77.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_77.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/variables_77.js b/doc/html/search/variables_77.js
new file mode 100644
index 000000000..59eb7ded7
--- /dev/null
+++ b/doc/html/search/variables_77.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['while',['while',['../docblox__errorchecker_8php.html#af4ca738a05beffe9c8c23e1f7aea3c2d',1,'docblox_errorchecker.php']]]
+];
diff --git a/doc/html/search/variables_78.html b/doc/html/search/variables_78.html
new file mode 100644
index 000000000..602e87995
--- /dev/null
+++ b/doc/html/search/variables_78.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_78.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/variables_78.js b/doc/html/search/variables_78.js
new file mode 100644
index 000000000..75be51da5
--- /dev/null
+++ b/doc/html/search/variables_78.js
@@ -0,0 +1,10 @@
+var searchData=
+[
+ ['xchan_5fflags_5fcensored',['XCHAN_FLAGS_CENSORED',['../boot_8php.html#accd6f36cc9f40225cbd720e4d12a7c6e',1,'boot.php']]],
+ ['xchan_5fflags_5fdeleted',['XCHAN_FLAGS_DELETED',['../boot_8php.html#a9ea1290e00c6d40684892047f2c778a9',1,'boot.php']]],
+ ['xchan_5fflags_5fhidden',['XCHAN_FLAGS_HIDDEN',['../boot_8php.html#a1af3ed96de14aa0d7891b39cc75b60f2',1,'boot.php']]],
+ ['xchan_5fflags_5fnormal',['XCHAN_FLAGS_NORMAL',['../boot_8php.html#a8fdcc4ffb365a3267bd02ce8a8d466d6',1,'boot.php']]],
+ ['xchan_5fflags_5forphan',['XCHAN_FLAGS_ORPHAN',['../boot_8php.html#a1c923b99bf77e4203ae94e5684b6ad0f',1,'boot.php']]],
+ ['xchan_5fflags_5fselfcensored',['XCHAN_FLAGS_SELFCENSORED',['../boot_8php.html#a5a681a672e007cdc22b43345d71f07c6',1,'boot.php']]],
+ ['xchan_5fflags_5fsystem',['XCHAN_FLAGS_SYSTEM',['../boot_8php.html#afef254290febac854c85fc698d9483a6',1,'boot.php']]]
+];
diff --git a/doc/html/search/variables_7a.html b/doc/html/search/variables_7a.html
new file mode 100644
index 000000000..8a5710483
--- /dev/null
+++ b/doc/html/search/variables_7a.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_7a.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/variables_7a.js b/doc/html/search/variables_7a.js
new file mode 100644
index 000000000..c1d257f75
--- /dev/null
+++ b/doc/html/search/variables_7a.js
@@ -0,0 +1,5 @@
+var searchData=
+[
+ ['zcurl_5ftimeout',['ZCURL_TIMEOUT',['../boot_8php.html#a3cd42a70c6b3999590e4fd7a1a9096af',1,'boot.php']]],
+ ['zot_5frevision',['ZOT_REVISION',['../boot_8php.html#a36b31575f992a10b5927b76efba9362e',1,'boot.php']]]
+];
diff --git a/doc/html/search_8php.html b/doc/html/search_8php.html
new file mode 100644
index 000000000..ec93dbf2b
--- /dev/null
+++ b/doc/html/search_8php.html
@@ -0,0 +1,173 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/search.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('search_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">search.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:acf19fd30f07f495781ca0d7a0a08b435"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="search_8php.html#acf19fd30f07f495781ca0d7a0a08b435">search_init</a> (&amp;$a)</td></tr>
+<tr class="separator:acf19fd30f07f495781ca0d7a0a08b435"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab2568591359edde5b483a6cd9a24b2cc"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="search_8php.html#ab2568591359edde5b483a6cd9a24b2cc">search_content</a> (&amp;$a, $update=0, $load=false)</td></tr>
+<tr class="separator:ab2568591359edde5b483a6cd9a24b2cc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="ab2568591359edde5b483a6cd9a24b2cc"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">search_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$update</em> = <code>0</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$load</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="update__search_8php.html#ace4c3a23fa7d6922399e27c297a6ba52">update_search_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="acf19fd30f07f495781ca0d7a0a08b435"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">search_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/search_8php.js b/doc/html/search_8php.js
new file mode 100644
index 000000000..254c8c72e
--- /dev/null
+++ b/doc/html/search_8php.js
@@ -0,0 +1,5 @@
+var search_8php =
+[
+ [ "search_content", "search_8php.html#ab2568591359edde5b483a6cd9a24b2cc", null ],
+ [ "search_init", "search_8php.html#acf19fd30f07f495781ca0d7a0a08b435", null ]
+]; \ No newline at end of file
diff --git a/doc/html/search__ac_8php.html b/doc/html/search__ac_8php.html
new file mode 100644
index 000000000..93c763f53
--- /dev/null
+++ b/doc/html/search__ac_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/search_ac.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('search__ac_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">search_ac.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a14f90c83a3f2be095e9e2992a8d66138"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="search__ac_8php.html#a14f90c83a3f2be095e9e2992a8d66138">search_ac_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a14f90c83a3f2be095e9e2992a8d66138"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a14f90c83a3f2be095e9e2992a8d66138"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">search_ac_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/search__ac_8php.js b/doc/html/search__ac_8php.js
new file mode 100644
index 000000000..27ce8db46
--- /dev/null
+++ b/doc/html/search__ac_8php.js
@@ -0,0 +1,4 @@
+var search__ac_8php =
+[
+ [ "search_ac_init", "search__ac_8php.html#a14f90c83a3f2be095e9e2992a8d66138", null ]
+]; \ No newline at end of file
diff --git a/doc/html/security_8php.html b/doc/html/security_8php.html
new file mode 100644
index 000000000..3451d9736
--- /dev/null
+++ b/doc/html/security_8php.html
@@ -0,0 +1,462 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/security.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('security_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">security.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:adc7bf51e3b8d67bd80e9348f9ab03733"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="security_8php.html#adc7bf51e3b8d67bd80e9348f9ab03733">authenticate_success</a> ($user_record, $login_initial=false, $interactive=false, $return=false, $update_lastlog=false)</td></tr>
+<tr class="separator:adc7bf51e3b8d67bd80e9348f9ab03733"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8d23d2597aae380a3341872fe9513380"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="security_8php.html#a8d23d2597aae380a3341872fe9513380">change_channel</a> ($change_channel)</td></tr>
+<tr class="separator:a8d23d2597aae380a3341872fe9513380"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afa683bc025a1d2fe9065e2f6cd71a22f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="security_8php.html#afa683bc025a1d2fe9065e2f6cd71a22f">permissions_sql</a> ($owner_id, $remote_verified=false, $groups=null)</td></tr>
+<tr class="separator:afa683bc025a1d2fe9065e2f6cd71a22f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9355488460ab11d6058656ff919e5cf9"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="security_8php.html#a9355488460ab11d6058656ff919e5cf9">item_permissions_sql</a> ($owner_id, $remote_verified=false, $groups=null)</td></tr>
+<tr class="separator:a9355488460ab11d6058656ff919e5cf9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab3bdd30dc60d9ee72370b866aa4a2d01"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="security_8php.html#ab3bdd30dc60d9ee72370b866aa4a2d01">public_permissions_sql</a> ($observer_hash)</td></tr>
+<tr class="separator:ab3bdd30dc60d9ee72370b866aa4a2d01"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acd06ef411116115c2f0a92633700db8a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="security_8php.html#acd06ef411116115c2f0a92633700db8a">get_form_security_token</a> ($typename= '')</td></tr>
+<tr class="separator:acd06ef411116115c2f0a92633700db8a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9c6180e82150a5a9af91a1255d096b5c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="security_8php.html#a9c6180e82150a5a9af91a1255d096b5c">check_form_security_token</a> ($typename= '', $formname= 'form_security_token')</td></tr>
+<tr class="separator:a9c6180e82150a5a9af91a1255d096b5c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a20f8b9851f23ee8894b8925584ef6821"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="security_8php.html#a20f8b9851f23ee8894b8925584ef6821">check_form_security_std_err_msg</a> ()</td></tr>
+<tr class="separator:a20f8b9851f23ee8894b8925584ef6821"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a77ba0d1889a39cf32434c5ce96fe1433"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="security_8php.html#a77ba0d1889a39cf32434c5ce96fe1433">check_form_security_token_redirectOnErr</a> ($err_redirect, $typename= '', $formname= 'form_security_token')</td></tr>
+<tr class="separator:a77ba0d1889a39cf32434c5ce96fe1433"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a444ac867dfa8c37cf0a7a226412bee28"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="security_8php.html#a444ac867dfa8c37cf0a7a226412bee28">check_form_security_token_ForbiddenOnErr</a> ($typename= '', $formname= 'form_security_token')</td></tr>
+<tr class="separator:a444ac867dfa8c37cf0a7a226412bee28"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae92c5c1a1cbbc49ddbb8b3265d2db809"><td class="memItemLeft" align="right" valign="top"><a class="el" href="redbasic_2php_2style_8php.html#a883f9f14e205f7aa7de02c14df67b40a">if</a>(!function_exists('init_groups_visitor'))&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="security_8php.html#ae92c5c1a1cbbc49ddbb8b3265d2db809">stream_perms_api_uids</a> ($perms_min=<a class="el" href="boot_8php.html#a9ff652e5cb83cd11cbb0350844e7b28f">PERMS_SITE</a>)</td></tr>
+<tr class="separator:ae92c5c1a1cbbc49ddbb8b3265d2db809"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a15e0f8f511cc06192db63387f97238b3"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="security_8php.html#a15e0f8f511cc06192db63387f97238b3">stream_perms_xchans</a> ($perms_min=<a class="el" href="boot_8php.html#a9ff652e5cb83cd11cbb0350844e7b28f">PERMS_SITE</a>)</td></tr>
+<tr class="separator:a15e0f8f511cc06192db63387f97238b3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="adc7bf51e3b8d67bd80e9348f9ab03733"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">authenticate_success </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$user_record</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$login_initial</em> = <code>false</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$interactive</em> = <code>false</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$return</em> = <code>false</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$update_lastlog</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#afe534f826e4282b72d66e8cadca7bb73">api_login()</a>, and <a class="el" href="register_8php.html#a51731dcc1917c58a790eb1c0f6132271">register_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a8d23d2597aae380a3341872fe9513380"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">change_channel </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$change_channel</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#afb99daa6b731bf497b81f2128084852c">api_user()</a>, <a class="el" href="security_8php.html#adc7bf51e3b8d67bd80e9348f9ab03733">authenticate_success()</a>, <a class="el" href="import_8php.html#af17fef0410518f7eac205d0ea416eaa2">import_post()</a>, <a class="el" href="classFKOAuth1.html#a2b1dac2ed31fc6ef84668afdda8b263f">FKOAuth1\loginUser()</a>, <a class="el" href="manage_8php.html#a2bca247b5296827638959138367db4f5">manage_content()</a>, and <a class="el" href="new__channel_8php.html#a180b0646957db8290482f02454ad7f23">new_channel_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a20f8b9851f23ee8894b8925584ef6821"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">check_form_security_std_err_msg </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="security_8php.html#a77ba0d1889a39cf32434c5ce96fe1433">check_form_security_token_redirectOnErr()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a9c6180e82150a5a9af91a1255d096b5c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">check_form_security_token </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$typename</em> = <code>''</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$formname</em> = <code>'form_security_token'</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="security_8php.html#a444ac867dfa8c37cf0a7a226412bee28">check_form_security_token_ForbiddenOnErr()</a>, and <a class="el" href="security_8php.html#a77ba0d1889a39cf32434c5ce96fe1433">check_form_security_token_redirectOnErr()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a444ac867dfa8c37cf0a7a226412bee28"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">check_form_security_token_ForbiddenOnErr </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$typename</em> = <code>''</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$formname</em> = <code>'form_security_token'</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="mod_2group_8php.html#a07a64f6c65b0080d8190b3d9728a7a83">group_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a77ba0d1889a39cf32434c5ce96fe1433"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">check_form_security_token_redirectOnErr </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$err_redirect</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$typename</em> = <code>''</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$formname</em> = <code>'form_security_token'</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="admin_8php.html#a60ba9783ad14545814919970bc3fb725">admin_page_hubloc_post()</a>, <a class="el" href="admin_8php.html#a233b7c8c31776b7020532003c6e44e1c">admin_page_logs_post()</a>, <a class="el" href="admin_8php.html#a54128076986ba80c4a103de3fc3e19a8">admin_page_plugins()</a>, <a class="el" href="admin_8php.html#add865f4ae806ecbf716f423fc3e50e4f">admin_page_site_post()</a>, <a class="el" href="admin_8php.html#af124619fdc278fe2bf14c45ddaa260fb">admin_page_themes()</a>, <a class="el" href="admin_8php.html#a62f10f90c47686c9c3c37c4c03a108d2">admin_page_users()</a>, <a class="el" href="admin_8php.html#a5a696706a3869800e65fb365214241b7">admin_page_users_post()</a>, <a class="el" href="mod_2group_8php.html#a07a64f6c65b0080d8190b3d9728a7a83">group_content()</a>, <a class="el" href="mod_2group_8php.html#aed1f009b1221348021bb34761160ef35">group_post()</a>, <a class="el" href="invite_8php.html#aeb0881c0f93c8e8552e5ed756ce6e5a5">invite_post()</a>, <a class="el" href="profile__photo_8php.html#a4b80234074bd603221aa5364f330e479">profile_photo_post()</a>, <a class="el" href="profiles_8php.html#a36f71405ad536228f8bb84a551b23f7e">profiles_init()</a>, <a class="el" href="profiles_8php.html#ab0362c81b1d3b0b12a772b9fac446e04">profiles_post()</a>, and <a class="el" href="settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586">settings_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="acd06ef411116115c2f0a92633700db8a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_form_security_token </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$typename</em> = <code>''</code></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="admin_8php.html#a1d1362698af14d209aa3a0fb655551dd">admin_page_logs()</a>, <a class="el" href="admin_8php.html#a54128076986ba80c4a103de3fc3e19a8">admin_page_plugins()</a>, <a class="el" href="admin_8php.html#ac0f3bd12431c056aad77bac9d09fa30e">admin_page_site()</a>, <a class="el" href="admin_8php.html#af124619fdc278fe2bf14c45ddaa260fb">admin_page_themes()</a>, <a class="el" href="admin_8php.html#a62f10f90c47686c9c3c37c4c03a108d2">admin_page_users()</a>, <a class="el" href="mod_2group_8php.html#a07a64f6c65b0080d8190b3d9728a7a83">group_content()</a>, <a class="el" href="invite_8php.html#a244385b28cfd021d308715f01158bfd9">invite_content()</a>, and <a class="el" href="profiles_8php.html#a46975783b8b8d70402d51487eb1f0b00">profiles_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a9355488460ab11d6058656ff919e5cf9"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">item_permissions_sql </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$owner_id</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$remote_verified</em> = <code>false</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$groups</em> = <code>null</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Construct permissions</p>
+<p>default permissions - anonymous user</p>
+<p>Profile owner - everything is visible</p>
+<p>Authenticated visitor. Unless pre-verified, check that the contact belongs to this $owner_id and load the groups the visitor belongs to. If pre-verified, the caller is expected to have already done this and passed the groups into this function.</p>
+
+<p>Referenced by <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>, <a class="el" href="items_8php.html#a756738301f2ed96be50232500677d58a">items_fetch()</a>, <a class="el" href="page_8php.html#a91a5f649f68406149108bded1dc90b22">page_content()</a>, <a class="el" href="comanche_8php.html#af7150df735e5ff9d467994cd6f769c6e">pdl_selector()</a>, <a class="el" href="share_8php.html#afeb26046bdd02567ecd29ab5f188b249">share_init()</a>, and <a class="el" href="items_8php.html#a004e89d86b0f29b2c4da20108ecc4091">zot_feed()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="afa683bc025a1d2fe9065e2f6cd71a22f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">permissions_sql </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$owner_id</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$remote_verified</em> = <code>false</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$groups</em> = <code>null</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Construct permissions</p>
+<p>default permissions - anonymous user</p>
+<p>Profile owner - everything is visible</p>
+<p>Authenticated visitor. Unless pre-verified, check that the contact belongs to this $owner_id and load the groups the visitor belongs to. If pre-verified, the caller is expected to have already done this and passed the groups into this function.</p>
+
+<p>Referenced by <a class="el" href="include_2attach_8php.html#a0d07c5b83d3d54e186f752e571847b36">attach_by_hash()</a>, <a class="el" href="include_2attach_8php.html#ad991208ce939387e2f93a3bce7d09932">attach_by_hash_nodata()</a>, <a class="el" href="include_2attach_8php.html#a887d2d44a3ef18dcb6624e7fb58dc8e3">attach_count_files()</a>, <a class="el" href="include_2attach_8php.html#a3634af95f11a023dd8e882c3c7a3600d">attach_list_files()</a>, <a class="el" href="include_2attach_8php.html#ab6830b3ab74a5d284876141ac80f6cbc">attach_mkdir()</a>, <a class="el" href="include_2menu_8php.html#a68ebbf492470c930f652013656f9071d">menu_fetch()</a>, <a class="el" href="photo_8php.html#a582779d24882b0d31ee909a91d70a448">photo_init()</a>, <a class="el" href="include_2photos_8php.html#aedccaf18282b26899d9549c29bd9d1b9">photos_albums_list()</a>, <a class="el" href="mod_2photos_8php.html#aa87382611a66ec5effdb2d78f13f5812">photos_content()</a>, <a class="el" href="include_2photos_8php.html#aa27b9e435dcc34e1009f56dc02c7ca51">photos_list_photos()</a>, <a class="el" href="reddav_8php.html#a5df0d09893f2e65dc5cf6bbab6cfb266">RedCollectionData()</a>, <a class="el" href="reddav_8php.html#a9f531641dfb4e43cd88ac1a9ae7e2088">RedFileData()</a>, and <a class="el" href="include_2attach_8php.html#aeb07968990e66a88c95483ca09a7f909">z_readdir()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ab3bdd30dc60d9ee72370b866aa4a2d01"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">public_permissions_sql </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$observer_hash</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="display_8php.html#a37137c98d47bf3306f4c2bb9f5b60de0">display_content()</a>, and <a class="el" href="search_8php.html#ab2568591359edde5b483a6cd9a24b2cc">search_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ae92c5c1a1cbbc49ddbb8b3265d2db809"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="redbasic_2php_2style_8php.html#a883f9f14e205f7aa7de02c14df67b40a">if</a> (!function_exists('init_groups_visitor')) stream_perms_api_uids </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$perms_min</em> = <code><a class="el" href="boot_8php.html#a9ff652e5cb83cd11cbb0350844e7b28f">PERMS_SITE</a></code></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#a645397787618b5c548a31e8686e8cca4">api_status_show()</a>, <a class="el" href="include_2api_8php.html#ad24ce1bf20867add4c9211a8eaf93f22">api_statuses_public_timeline()</a>, and <a class="el" href="include_2api_8php.html#abe8e929e93f7ab134b1cb1fb30f19a76">api_users_show()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a15e0f8f511cc06192db63387f97238b3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">stream_perms_xchans </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$perms_min</em> = <code><a class="el" href="boot_8php.html#a9ff652e5cb83cd11cbb0350844e7b28f">PERMS_SITE</a></code></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="display_8php.html#a37137c98d47bf3306f4c2bb9f5b60de0">display_content()</a>, and <a class="el" href="search_8php.html#ab2568591359edde5b483a6cd9a24b2cc">search_content()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/security_8php.js b/doc/html/security_8php.js
new file mode 100644
index 000000000..e9abb6b48
--- /dev/null
+++ b/doc/html/security_8php.js
@@ -0,0 +1,15 @@
+var security_8php =
+[
+ [ "authenticate_success", "security_8php.html#adc7bf51e3b8d67bd80e9348f9ab03733", null ],
+ [ "change_channel", "security_8php.html#a8d23d2597aae380a3341872fe9513380", null ],
+ [ "check_form_security_std_err_msg", "security_8php.html#a20f8b9851f23ee8894b8925584ef6821", null ],
+ [ "check_form_security_token", "security_8php.html#a9c6180e82150a5a9af91a1255d096b5c", null ],
+ [ "check_form_security_token_ForbiddenOnErr", "security_8php.html#a444ac867dfa8c37cf0a7a226412bee28", null ],
+ [ "check_form_security_token_redirectOnErr", "security_8php.html#a77ba0d1889a39cf32434c5ce96fe1433", null ],
+ [ "get_form_security_token", "security_8php.html#acd06ef411116115c2f0a92633700db8a", null ],
+ [ "item_permissions_sql", "security_8php.html#a9355488460ab11d6058656ff919e5cf9", null ],
+ [ "permissions_sql", "security_8php.html#afa683bc025a1d2fe9065e2f6cd71a22f", null ],
+ [ "public_permissions_sql", "security_8php.html#ab3bdd30dc60d9ee72370b866aa4a2d01", null ],
+ [ "stream_perms_api_uids", "security_8php.html#ae92c5c1a1cbbc49ddbb8b3265d2db809", null ],
+ [ "stream_perms_xchans", "security_8php.html#a15e0f8f511cc06192db63387f97238b3", null ]
+]; \ No newline at end of file
diff --git a/doc/html/session_8php.html b/doc/html/session_8php.html
new file mode 100644
index 000000000..0c02c1ec6
--- /dev/null
+++ b/doc/html/session_8php.html
@@ -0,0 +1,317 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/session.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('session_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> &#124;
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle">
+<div class="title">session.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a4c0ead624f95483e386bc80abf570a8f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="session_8php.html#a4c0ead624f95483e386bc80abf570a8f">new_cookie</a> ($time)</td></tr>
+<tr class="separator:a4c0ead624f95483e386bc80abf570a8f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a26fa1042356d555023cbf15ddd4f8507"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="session_8php.html#a26fa1042356d555023cbf15ddd4f8507">ref_session_open</a> ($s, $<a class="el" href="php2po_8php.html#a1594a11499d06cc8a789ee7ca0c7a12b">n</a>)</td></tr>
+<tr class="separator:a26fa1042356d555023cbf15ddd4f8507"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7f0f50576360d9ba52d29364e0b83a8e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="session_8php.html#a7f0f50576360d9ba52d29364e0b83a8e">ref_session_read</a> ($id)</td></tr>
+<tr class="separator:a7f0f50576360d9ba52d29364e0b83a8e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac4461c1984543d3553e73dba2771568f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="session_8php.html#ac4461c1984543d3553e73dba2771568f">ref_session_write</a> ($id, $data)</td></tr>
+<tr class="separator:ac4461c1984543d3553e73dba2771568f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5e1c616e02b863d5450317d101366bb7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="session_8php.html#a5e1c616e02b863d5450317d101366bb7">ref_session_close</a> ()</td></tr>
+<tr class="separator:a5e1c616e02b863d5450317d101366bb7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af230b86bfff7db66c3bdd7e0bbc24052"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="session_8php.html#af230b86bfff7db66c3bdd7e0bbc24052">ref_session_destroy</a> ($id)</td></tr>
+<tr class="separator:af230b86bfff7db66c3bdd7e0bbc24052"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac95373f4966862a028033dd2f94d4da1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="session_8php.html#ac95373f4966862a028033dd2f94d4da1">ref_session_gc</a> ($expire)</td></tr>
+<tr class="separator:ac95373f4966862a028033dd2f94d4da1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:a62e4a6cb26b4bb1b8ddd8277b26090eb"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="session_8php.html#a62e4a6cb26b4bb1b8ddd8277b26090eb">$session_exists</a> = 0</td></tr>
+<tr class="separator:a62e4a6cb26b4bb1b8ddd8277b26090eb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af0100a2642a5268594bbd5742a03d885"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="session_8php.html#af0100a2642a5268594bbd5742a03d885">$session_expire</a> = 180000</td></tr>
+<tr class="separator:af0100a2642a5268594bbd5742a03d885"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a96b09cc763572f45280786a7b33feb7e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="session_8php.html#a96b09cc763572f45280786a7b33feb7e">$gc_probability</a> = 50</td></tr>
+<tr class="separator:a96b09cc763572f45280786a7b33feb7e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a4c0ead624f95483e386bc80abf570a8f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">new_cookie </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$time</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="auth_8php.html#a2add3a1129ffa4d5515442a9d52a9b1a">nuke_session()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a5e1c616e02b863d5450317d101366bb7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">ref_session_close </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="af230b86bfff7db66c3bdd7e0bbc24052"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">ref_session_destroy </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$id</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ac95373f4966862a028033dd2f94d4da1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">ref_session_gc </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$expire</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a26fa1042356d555023cbf15ddd4f8507"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">ref_session_open </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$n</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a7f0f50576360d9ba52d29364e0b83a8e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">ref_session_read </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$id</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ac4461c1984543d3553e73dba2771568f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">ref_session_write </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$id</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$data</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Variable Documentation</h2>
+<a class="anchor" id="a96b09cc763572f45280786a7b33feb7e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$gc_probability = 50</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a62e4a6cb26b4bb1b8ddd8277b26090eb"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$session_exists = 0</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="session_8php.html#a7f0f50576360d9ba52d29364e0b83a8e">ref_session_read()</a>, and <a class="el" href="session_8php.html#ac4461c1984543d3553e73dba2771568f">ref_session_write()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="af0100a2642a5268594bbd5742a03d885"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$session_expire = 180000</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="session_8php.html#ac4461c1984543d3553e73dba2771568f">ref_session_write()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/session_8php.js b/doc/html/session_8php.js
new file mode 100644
index 000000000..5d69851d0
--- /dev/null
+++ b/doc/html/session_8php.js
@@ -0,0 +1,13 @@
+var session_8php =
+[
+ [ "new_cookie", "session_8php.html#a4c0ead624f95483e386bc80abf570a8f", null ],
+ [ "ref_session_close", "session_8php.html#a5e1c616e02b863d5450317d101366bb7", null ],
+ [ "ref_session_destroy", "session_8php.html#af230b86bfff7db66c3bdd7e0bbc24052", null ],
+ [ "ref_session_gc", "session_8php.html#ac95373f4966862a028033dd2f94d4da1", null ],
+ [ "ref_session_open", "session_8php.html#a26fa1042356d555023cbf15ddd4f8507", null ],
+ [ "ref_session_read", "session_8php.html#a7f0f50576360d9ba52d29364e0b83a8e", null ],
+ [ "ref_session_write", "session_8php.html#ac4461c1984543d3553e73dba2771568f", null ],
+ [ "$gc_probability", "session_8php.html#a96b09cc763572f45280786a7b33feb7e", null ],
+ [ "$session_exists", "session_8php.html#a62e4a6cb26b4bb1b8ddd8277b26090eb", null ],
+ [ "$session_expire", "session_8php.html#af0100a2642a5268594bbd5742a03d885", null ]
+]; \ No newline at end of file
diff --git a/doc/html/settings_8php.html b/doc/html/settings_8php.html
new file mode 100644
index 000000000..cb50bbc52
--- /dev/null
+++ b/doc/html/settings_8php.html
@@ -0,0 +1,175 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/settings.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('settings_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">settings.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a39abc76ff5459c57e3b957664f273f18"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="settings_8php.html#a39abc76ff5459c57e3b957664f273f18">get_theme_config_file</a> ($theme)</td></tr>
+<tr class="separator:a39abc76ff5459c57e3b957664f273f18"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3a4cde287482fced008583f54ba2a722"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="settings_8php.html#a3a4cde287482fced008583f54ba2a722">settings_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a3a4cde287482fced008583f54ba2a722"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa7ee94d88ac088edb04ccf3a26de3586"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586">settings_post</a> (&amp;$a)</td></tr>
+<tr class="separator:aa7ee94d88ac088edb04ccf3a26de3586"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a39abc76ff5459c57e3b957664f273f18"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_theme_config_file </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$theme</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586">settings_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a3a4cde287482fced008583f54ba2a722"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">settings_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aa7ee94d88ac088edb04ccf3a26de3586"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">settings_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/settings_8php.js b/doc/html/settings_8php.js
new file mode 100644
index 000000000..9185251bc
--- /dev/null
+++ b/doc/html/settings_8php.js
@@ -0,0 +1,6 @@
+var settings_8php =
+[
+ [ "get_theme_config_file", "settings_8php.html#a39abc76ff5459c57e3b957664f273f18", null ],
+ [ "settings_init", "settings_8php.html#a3a4cde287482fced008583f54ba2a722", null ],
+ [ "settings_post", "settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586", null ]
+]; \ No newline at end of file
diff --git a/doc/html/setup_8php.html b/doc/html/setup_8php.html
new file mode 100644
index 000000000..3537830f1
--- /dev/null
+++ b/doc/html/setup_8php.html
@@ -0,0 +1,499 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/setup.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('setup_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> &#124;
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle">
+<div class="title">setup.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a267555abd17290e659b4bf44b885e4e0"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="setup_8php.html#a267555abd17290e659b4bf44b885e4e0">setup_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a267555abd17290e659b4bf44b885e4e0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a13cf286774149a0a7bd8adb8179cec75"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="setup_8php.html#a13cf286774149a0a7bd8adb8179cec75">setup_post</a> (&amp;$a)</td></tr>
+<tr class="separator:a13cf286774149a0a7bd8adb8179cec75"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8652788e8589778c5f81634a9d5b9429"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="setup_8php.html#a8652788e8589778c5f81634a9d5b9429">get_db_errno</a> ()</td></tr>
+<tr class="separator:a8652788e8589778c5f81634a9d5b9429"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a88247384a96e14516f474d7af6a465c1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="setup_8php.html#a88247384a96e14516f474d7af6a465c1">setup_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a88247384a96e14516f474d7af6a465c1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae8e4d9279a61de74d5f39962cb7b6ca1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="setup_8php.html#ae8e4d9279a61de74d5f39962cb7b6ca1">check_add</a> (&amp;$checks, $title, $status, $required, $help)</td></tr>
+<tr class="separator:ae8e4d9279a61de74d5f39962cb7b6ca1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a14d208682a88632290c895d20da6e7d6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="setup_8php.html#a14d208682a88632290c895d20da6e7d6">check_php</a> (&amp;$phpath, &amp;$checks)</td></tr>
+<tr class="separator:a14d208682a88632290c895d20da6e7d6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa3bbb111780da70ba35cc23a306f2c76"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="setup_8php.html#aa3bbb111780da70ba35cc23a306f2c76">check_keys</a> (&amp;$checks)</td></tr>
+<tr class="separator:aa3bbb111780da70ba35cc23a306f2c76"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a69a450e06dd3771fb51d3e4b0266a35e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="setup_8php.html#a69a450e06dd3771fb51d3e4b0266a35e">check_funcs</a> (&amp;$checks)</td></tr>
+<tr class="separator:a69a450e06dd3771fb51d3e4b0266a35e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5ad92c0857d1dadd6b60a9a557159c9f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="setup_8php.html#a5ad92c0857d1dadd6b60a9a557159c9f">check_htconfig</a> (&amp;$checks)</td></tr>
+<tr class="separator:a5ad92c0857d1dadd6b60a9a557159c9f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afd8b0b3ade1507c45325caf377bf459d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="setup_8php.html#afd8b0b3ade1507c45325caf377bf459d">check_smarty3</a> (&amp;$checks)</td></tr>
+<tr class="separator:afd8b0b3ade1507c45325caf377bf459d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab4b71369a25021d59247c917e98d8246"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="setup_8php.html#ab4b71369a25021d59247c917e98d8246">check_store</a> (&amp;$checks)</td></tr>
+<tr class="separator:ab4b71369a25021d59247c917e98d8246"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0c3f3b671381f6dccd924b8ecdfc56c4"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="setup_8php.html#a0c3f3b671381f6dccd924b8ecdfc56c4">check_htaccess</a> (&amp;$checks)</td></tr>
+<tr class="separator:a0c3f3b671381f6dccd924b8ecdfc56c4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abe405d227ba7232971964a706d4f3bce"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="setup_8php.html#abe405d227ba7232971964a706d4f3bce">manual_config</a> (&amp;$a)</td></tr>
+<tr class="separator:abe405d227ba7232971964a706d4f3bce"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2b375ddc555140236fc500135de99371"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="setup_8php.html#a2b375ddc555140236fc500135de99371">load_database_rem</a> ($v, $i)</td></tr>
+<tr class="separator:a2b375ddc555140236fc500135de99371"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad2e0375a9ab87ebe6e78124ee125054a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="setup_8php.html#ad2e0375a9ab87ebe6e78124ee125054a">load_database</a> ($db)</td></tr>
+<tr class="separator:ad2e0375a9ab87ebe6e78124ee125054a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aea1ebdda58ec938f4e7b31aa5c5f6b58"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="setup_8php.html#aea1ebdda58ec938f4e7b31aa5c5f6b58">what_next</a> ()</td></tr>
+<tr class="separator:aea1ebdda58ec938f4e7b31aa5c5f6b58"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:addb24714bc2542aa4f4215e98fe48432"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="setup_8php.html#addb24714bc2542aa4f4215e98fe48432">$install_wizard_pass</a> =1</td></tr>
+<tr class="separator:addb24714bc2542aa4f4215e98fe48432"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="ae8e4d9279a61de74d5f39962cb7b6ca1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">check_add </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$checks</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$title</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$status</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$required</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$help</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>checks : array passed to template title : string status : boolean required : boolean help : string optional </p>
+
+<p>Referenced by <a class="el" href="setup_8php.html#a69a450e06dd3771fb51d3e4b0266a35e">check_funcs()</a>, <a class="el" href="setup_8php.html#a0c3f3b671381f6dccd924b8ecdfc56c4">check_htaccess()</a>, <a class="el" href="setup_8php.html#a5ad92c0857d1dadd6b60a9a557159c9f">check_htconfig()</a>, <a class="el" href="setup_8php.html#aa3bbb111780da70ba35cc23a306f2c76">check_keys()</a>, <a class="el" href="setup_8php.html#a14d208682a88632290c895d20da6e7d6">check_php()</a>, <a class="el" href="setup_8php.html#afd8b0b3ade1507c45325caf377bf459d">check_smarty3()</a>, and <a class="el" href="setup_8php.html#ab4b71369a25021d59247c917e98d8246">check_store()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a69a450e06dd3771fb51d3e4b0266a35e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">check_funcs </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$checks</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="setup_8php.html#a88247384a96e14516f474d7af6a465c1">setup_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a0c3f3b671381f6dccd924b8ecdfc56c4"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">check_htaccess </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$checks</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="setup_8php.html#a88247384a96e14516f474d7af6a465c1">setup_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a5ad92c0857d1dadd6b60a9a557159c9f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">check_htconfig </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$checks</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="setup_8php.html#a88247384a96e14516f474d7af6a465c1">setup_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa3bbb111780da70ba35cc23a306f2c76"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">check_keys </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$checks</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="setup_8php.html#a88247384a96e14516f474d7af6a465c1">setup_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a14d208682a88632290c895d20da6e7d6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">check_php </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$phpath</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$checks</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="setup_8php.html#a88247384a96e14516f474d7af6a465c1">setup_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="afd8b0b3ade1507c45325caf377bf459d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">check_smarty3 </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$checks</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="setup_8php.html#a88247384a96e14516f474d7af6a465c1">setup_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ab4b71369a25021d59247c917e98d8246"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">check_store </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$checks</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="setup_8php.html#a88247384a96e14516f474d7af6a465c1">setup_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a8652788e8589778c5f81634a9d5b9429"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_db_errno </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="setup_8php.html#a13cf286774149a0a7bd8adb8179cec75">setup_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ad2e0375a9ab87ebe6e78124ee125054a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">load_database </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$db</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="setup_8php.html#a13cf286774149a0a7bd8adb8179cec75">setup_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a2b375ddc555140236fc500135de99371"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">load_database_rem </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$v</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$i</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="abe405d227ba7232971964a706d4f3bce"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">manual_config </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="setup_8php.html#a88247384a96e14516f474d7af6a465c1">setup_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a88247384a96e14516f474d7af6a465c1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">setup_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a267555abd17290e659b4bf44b885e4e0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">setup_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a13cf286774149a0a7bd8adb8179cec75"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">setup_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aea1ebdda58ec938f4e7b31aa5c5f6b58"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">what_next </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="setup_8php.html#a88247384a96e14516f474d7af6a465c1">setup_content()</a>.</p>
+
+</div>
+</div>
+<h2 class="groupheader">Variable Documentation</h2>
+<a class="anchor" id="addb24714bc2542aa4f4215e98fe48432"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$install_wizard_pass =1</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="setup_8php.html#a88247384a96e14516f474d7af6a465c1">setup_content()</a>, <a class="el" href="setup_8php.html#a267555abd17290e659b4bf44b885e4e0">setup_init()</a>, and <a class="el" href="setup_8php.html#a13cf286774149a0a7bd8adb8179cec75">setup_post()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/setup_8php.js b/doc/html/setup_8php.js
new file mode 100644
index 000000000..e02d5899c
--- /dev/null
+++ b/doc/html/setup_8php.js
@@ -0,0 +1,20 @@
+var setup_8php =
+[
+ [ "check_add", "setup_8php.html#ae8e4d9279a61de74d5f39962cb7b6ca1", null ],
+ [ "check_funcs", "setup_8php.html#a69a450e06dd3771fb51d3e4b0266a35e", null ],
+ [ "check_htaccess", "setup_8php.html#a0c3f3b671381f6dccd924b8ecdfc56c4", null ],
+ [ "check_htconfig", "setup_8php.html#a5ad92c0857d1dadd6b60a9a557159c9f", null ],
+ [ "check_keys", "setup_8php.html#aa3bbb111780da70ba35cc23a306f2c76", null ],
+ [ "check_php", "setup_8php.html#a14d208682a88632290c895d20da6e7d6", null ],
+ [ "check_smarty3", "setup_8php.html#afd8b0b3ade1507c45325caf377bf459d", null ],
+ [ "check_store", "setup_8php.html#ab4b71369a25021d59247c917e98d8246", null ],
+ [ "get_db_errno", "setup_8php.html#a8652788e8589778c5f81634a9d5b9429", null ],
+ [ "load_database", "setup_8php.html#ad2e0375a9ab87ebe6e78124ee125054a", null ],
+ [ "load_database_rem", "setup_8php.html#a2b375ddc555140236fc500135de99371", null ],
+ [ "manual_config", "setup_8php.html#abe405d227ba7232971964a706d4f3bce", null ],
+ [ "setup_content", "setup_8php.html#a88247384a96e14516f474d7af6a465c1", null ],
+ [ "setup_init", "setup_8php.html#a267555abd17290e659b4bf44b885e4e0", null ],
+ [ "setup_post", "setup_8php.html#a13cf286774149a0a7bd8adb8179cec75", null ],
+ [ "what_next", "setup_8php.html#aea1ebdda58ec938f4e7b31aa5c5f6b58", null ],
+ [ "$install_wizard_pass", "setup_8php.html#addb24714bc2542aa4f4215e98fe48432", null ]
+]; \ No newline at end of file
diff --git a/doc/html/share_8php.html b/doc/html/share_8php.html
new file mode 100644
index 000000000..89298f55f
--- /dev/null
+++ b/doc/html/share_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/share.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('share_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">share.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:afeb26046bdd02567ecd29ab5f188b249"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="share_8php.html#afeb26046bdd02567ecd29ab5f188b249">share_init</a> (&amp;$a)</td></tr>
+<tr class="separator:afeb26046bdd02567ecd29ab5f188b249"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="afeb26046bdd02567ecd29ab5f188b249"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">share_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/share_8php.js b/doc/html/share_8php.js
new file mode 100644
index 000000000..6f63d2afc
--- /dev/null
+++ b/doc/html/share_8php.js
@@ -0,0 +1,4 @@
+var share_8php =
+[
+ [ "share_init", "share_8php.html#afeb26046bdd02567ecd29ab5f188b249", null ]
+]; \ No newline at end of file
diff --git a/doc/html/siteinfo_8php.html b/doc/html/siteinfo_8php.html
new file mode 100644
index 000000000..c53a3c42f
--- /dev/null
+++ b/doc/html/siteinfo_8php.html
@@ -0,0 +1,155 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/siteinfo.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('siteinfo_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">siteinfo.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a3efbd0bd6564af19ec0a9ce0294e59d0"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="siteinfo_8php.html#a3efbd0bd6564af19ec0a9ce0294e59d0">siteinfo_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a3efbd0bd6564af19ec0a9ce0294e59d0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a70c09bfb6dd1c86a125a35f62ed53656"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="siteinfo_8php.html#a70c09bfb6dd1c86a125a35f62ed53656">siteinfo_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a70c09bfb6dd1c86a125a35f62ed53656"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a70c09bfb6dd1c86a125a35f62ed53656"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">siteinfo_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a3efbd0bd6564af19ec0a9ce0294e59d0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">siteinfo_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/siteinfo_8php.js b/doc/html/siteinfo_8php.js
new file mode 100644
index 000000000..f293cd4f6
--- /dev/null
+++ b/doc/html/siteinfo_8php.js
@@ -0,0 +1,5 @@
+var siteinfo_8php =
+[
+ [ "siteinfo_content", "siteinfo_8php.html#a70c09bfb6dd1c86a125a35f62ed53656", null ],
+ [ "siteinfo_init", "siteinfo_8php.html#a3efbd0bd6564af19ec0a9ce0294e59d0", null ]
+]; \ No newline at end of file
diff --git a/doc/html/sitelist_8php.html b/doc/html/sitelist_8php.html
new file mode 100644
index 000000000..976943283
--- /dev/null
+++ b/doc/html/sitelist_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/sitelist.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('sitelist_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">sitelist.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a665a59bf60f780b40f32c909f4a473b1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="sitelist_8php.html#a665a59bf60f780b40f32c909f4a473b1">sitelist_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a665a59bf60f780b40f32c909f4a473b1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a665a59bf60f780b40f32c909f4a473b1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">sitelist_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/sitelist_8php.js b/doc/html/sitelist_8php.js
new file mode 100644
index 000000000..5feccee65
--- /dev/null
+++ b/doc/html/sitelist_8php.js
@@ -0,0 +1,4 @@
+var sitelist_8php =
+[
+ [ "sitelist_init", "sitelist_8php.html#a665a59bf60f780b40f32c909f4a473b1", null ]
+]; \ No newline at end of file
diff --git a/doc/html/smilies_8php.html b/doc/html/smilies_8php.html
new file mode 100644
index 000000000..624cb9b90
--- /dev/null
+++ b/doc/html/smilies_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/smilies.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('smilies_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">smilies.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ab43b1e9f33a700a830aff14c7b3a617f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="smilies_8php.html#ab43b1e9f33a700a830aff14c7b3a617f">smilies_content</a> (&amp;$a)</td></tr>
+<tr class="separator:ab43b1e9f33a700a830aff14c7b3a617f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="ab43b1e9f33a700a830aff14c7b3a617f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">smilies_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/smilies_8php.js b/doc/html/smilies_8php.js
new file mode 100644
index 000000000..dc1c06b09
--- /dev/null
+++ b/doc/html/smilies_8php.js
@@ -0,0 +1,4 @@
+var smilies_8php =
+[
+ [ "smilies_content", "smilies_8php.html#ab43b1e9f33a700a830aff14c7b3a617f", null ]
+]; \ No newline at end of file
diff --git a/doc/html/socgraph_8php.html b/doc/html/socgraph_8php.html
new file mode 100644
index 000000000..47a2222ca
--- /dev/null
+++ b/doc/html/socgraph_8php.html
@@ -0,0 +1,430 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/socgraph.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('socgraph_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">socgraph.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a5ef8bef37161df53718a21e93d02fbd6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="socgraph_8php.html#a5ef8bef37161df53718a21e93d02fbd6">poco_load</a> ($xchan= '', $url=null)</td></tr>
+<tr class="separator:a5ef8bef37161df53718a21e93d02fbd6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a887d576f21fd708132a06d0f72f90f84"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="socgraph_8php.html#a887d576f21fd708132a06d0f72f90f84">count_common_friends</a> ($uid, $xchan)</td></tr>
+<tr class="separator:a887d576f21fd708132a06d0f72f90f84"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7d34cd58025bcd9e575282f44db75918"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="socgraph_8php.html#a7d34cd58025bcd9e575282f44db75918">common_friends</a> ($uid, $xchan, $start=0, $limit=100000000, $shuffle=false)</td></tr>
+<tr class="separator:a7d34cd58025bcd9e575282f44db75918"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af175807406d94407a5e11742a3287746"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="socgraph_8php.html#af175807406d94407a5e11742a3287746">count_common_friends_zcid</a> ($uid, $zcid)</td></tr>
+<tr class="separator:af175807406d94407a5e11742a3287746"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac343a846241d36cdf046b08f3396cfe9"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="socgraph_8php.html#ac343a846241d36cdf046b08f3396cfe9">common_friends_zcid</a> ($uid, $zcid, $start=0, $limit=9999, $shuffle=false)</td></tr>
+<tr class="separator:ac343a846241d36cdf046b08f3396cfe9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af29d056beec10b4e38e5209c92452894"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="socgraph_8php.html#af29d056beec10b4e38e5209c92452894">count_all_friends</a> ($uid, $cid)</td></tr>
+<tr class="separator:af29d056beec10b4e38e5209c92452894"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a16ac51c505d72987ed8d6d6aed0e8586"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="socgraph_8php.html#a16ac51c505d72987ed8d6d6aed0e8586">all_friends</a> ($uid, $cid, $start=0, $limit=80)</td></tr>
+<tr class="separator:a16ac51c505d72987ed8d6d6aed0e8586"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a76e6fca3d2bc842dcd9e710bb87c8329"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="socgraph_8php.html#a76e6fca3d2bc842dcd9e710bb87c8329">suggestion_query</a> ($uid, $myxchan, $start=0, $limit=80)</td></tr>
+<tr class="separator:a76e6fca3d2bc842dcd9e710bb87c8329"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a790690bb1a1d02483fe31632a160144d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="socgraph_8php.html#a790690bb1a1d02483fe31632a160144d">update_suggestions</a> ()</td></tr>
+<tr class="separator:a790690bb1a1d02483fe31632a160144d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a16ac51c505d72987ed8d6d6aed0e8586"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">all_friends </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$cid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$start</em> = <code>0</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$limit</em> = <code>80</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a7d34cd58025bcd9e575282f44db75918"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">common_friends </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$xchan</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$start</em> = <code>0</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$limit</em> = <code>100000000</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$shuffle</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="common_8php.html#ab63408f39abef7a6915186e8dabc5a96">common_content()</a>, and <a class="el" href="contact__widgets_8php.html#a552f8544528cec0c995cea7287ea9d65">common_friends_visitor_widget()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ac343a846241d36cdf046b08f3396cfe9"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">common_friends_zcid </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$zcid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$start</em> = <code>0</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$limit</em> = <code>9999</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$shuffle</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="af29d056beec10b4e38e5209c92452894"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">count_all_friends </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$cid</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a887d576f21fd708132a06d0f72f90f84"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">count_common_friends </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$xchan</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="common_8php.html#ab63408f39abef7a6915186e8dabc5a96">common_content()</a>, and <a class="el" href="contact__widgets_8php.html#a552f8544528cec0c995cea7287ea9d65">common_friends_visitor_widget()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="af175807406d94407a5e11742a3287746"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">count_common_friends_zcid </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$zcid</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a5ef8bef37161df53718a21e93d02fbd6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">poco_load </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$xchan</em> = <code>''</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$url</em> = <code>null</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="onepoll_8php.html#a72753b2fdec79b37c7f432035c91fb6d">onepoll_run()</a>, and <a class="el" href="socgraph_8php.html#a790690bb1a1d02483fe31632a160144d">update_suggestions()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a76e6fca3d2bc842dcd9e710bb87c8329"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">suggestion_query </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$myxchan</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$start</em> = <code>0</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$limit</em> = <code>80</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="suggest_8php.html#a58748a8235d4523f8333847f3e42dd91">suggest_content()</a>, and <a class="el" href="widgets_8php.html#a0d404276fedc59f5038cf5c085028326">widget_suggestions()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a790690bb1a1d02483fe31632a160144d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">update_suggestions </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="cli__suggest_8php.html#a8f3a60fc96f4bec7d3837c4efc7725f2">cli_suggest_run()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/socgraph_8php.js b/doc/html/socgraph_8php.js
new file mode 100644
index 000000000..7485dd0a2
--- /dev/null
+++ b/doc/html/socgraph_8php.js
@@ -0,0 +1,12 @@
+var socgraph_8php =
+[
+ [ "all_friends", "socgraph_8php.html#a16ac51c505d72987ed8d6d6aed0e8586", null ],
+ [ "common_friends", "socgraph_8php.html#a7d34cd58025bcd9e575282f44db75918", null ],
+ [ "common_friends_zcid", "socgraph_8php.html#ac343a846241d36cdf046b08f3396cfe9", null ],
+ [ "count_all_friends", "socgraph_8php.html#af29d056beec10b4e38e5209c92452894", null ],
+ [ "count_common_friends", "socgraph_8php.html#a887d576f21fd708132a06d0f72f90f84", null ],
+ [ "count_common_friends_zcid", "socgraph_8php.html#af175807406d94407a5e11742a3287746", null ],
+ [ "poco_load", "socgraph_8php.html#a5ef8bef37161df53718a21e93d02fbd6", null ],
+ [ "suggestion_query", "socgraph_8php.html#a76e6fca3d2bc842dcd9e710bb87c8329", null ],
+ [ "update_suggestions", "socgraph_8php.html#a790690bb1a1d02483fe31632a160144d", null ]
+]; \ No newline at end of file
diff --git a/doc/html/sources_8php.html b/doc/html/sources_8php.html
new file mode 100644
index 000000000..5e565616e
--- /dev/null
+++ b/doc/html/sources_8php.html
@@ -0,0 +1,155 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/sources.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('sources_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">sources.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ac73298ff162ce7b2de8dcaf3d3305b1e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="sources_8php.html#ac73298ff162ce7b2de8dcaf3d3305b1e">sources_post</a> (&amp;$a)</td></tr>
+<tr class="separator:ac73298ff162ce7b2de8dcaf3d3305b1e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac442ccef080ab95772d8929fcafcb4b7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="sources_8php.html#ac442ccef080ab95772d8929fcafcb4b7">sources_content</a> (&amp;$a)</td></tr>
+<tr class="separator:ac442ccef080ab95772d8929fcafcb4b7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="ac442ccef080ab95772d8929fcafcb4b7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">sources_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ac73298ff162ce7b2de8dcaf3d3305b1e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">sources_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/sources_8php.js b/doc/html/sources_8php.js
new file mode 100644
index 000000000..182247a56
--- /dev/null
+++ b/doc/html/sources_8php.js
@@ -0,0 +1,5 @@
+var sources_8php =
+[
+ [ "sources_content", "sources_8php.html#ac442ccef080ab95772d8929fcafcb4b7", null ],
+ [ "sources_post", "sources_8php.html#ac73298ff162ce7b2de8dcaf3d3305b1e", null ]
+]; \ No newline at end of file
diff --git a/doc/html/sslify_8php.html b/doc/html/sslify_8php.html
new file mode 100644
index 000000000..e408329b5
--- /dev/null
+++ b/doc/html/sslify_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/sslify.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('sslify_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">sslify.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a75b11e54a3d1fc83e7d4c0e8b4dab316"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="sslify_8php.html#a75b11e54a3d1fc83e7d4c0e8b4dab316">sslify_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a75b11e54a3d1fc83e7d4c0e8b4dab316"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a75b11e54a3d1fc83e7d4c0e8b4dab316"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">sslify_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/sslify_8php.js b/doc/html/sslify_8php.js
new file mode 100644
index 000000000..ec3ef3c09
--- /dev/null
+++ b/doc/html/sslify_8php.js
@@ -0,0 +1,4 @@
+var sslify_8php =
+[
+ [ "sslify_init", "sslify_8php.html#a75b11e54a3d1fc83e7d4c0e8b4dab316", null ]
+]; \ No newline at end of file
diff --git a/doc/html/starred_8php.html b/doc/html/starred_8php.html
new file mode 100644
index 000000000..43fa8769e
--- /dev/null
+++ b/doc/html/starred_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/starred.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('starred_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">starred.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a63024fb418c678e49fd535e3752d349a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="starred_8php.html#a63024fb418c678e49fd535e3752d349a">starred_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a63024fb418c678e49fd535e3752d349a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a63024fb418c678e49fd535e3752d349a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">starred_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/starred_8php.js b/doc/html/starred_8php.js
new file mode 100644
index 000000000..328089950
--- /dev/null
+++ b/doc/html/starred_8php.js
@@ -0,0 +1,4 @@
+var starred_8php =
+[
+ [ "starred_init", "starred_8php.html#a63024fb418c678e49fd535e3752d349a", null ]
+]; \ No newline at end of file
diff --git a/doc/html/style_8php.html b/doc/html/style_8php.html
new file mode 100644
index 000000000..93d2929a6
--- /dev/null
+++ b/doc/html/style_8php.html
@@ -0,0 +1,378 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Project: view/theme/redbasic/php/style.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="r!-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Project
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('style_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle">
+<div class="title">style.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:a4131d1765ee4deb28e83fc4527943ee0"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="style_8php.html#a4131d1765ee4deb28e83fc4527943ee0">$line_height</a> = false</td></tr>
+<tr class="separator:a4131d1765ee4deb28e83fc4527943ee0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:addf42c3d02e53f8e4153f3bb9dabfcda"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="style_8php.html#addf42c3d02e53f8e4153f3bb9dabfcda">$redbasic_font_size</a> = false</td></tr>
+<tr class="separator:addf42c3d02e53f8e4153f3bb9dabfcda"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:adcfa918e05b5a98cbddc84bc3f1c15cc"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="style_8php.html#adcfa918e05b5a98cbddc84bc3f1c15cc">$resolution</a> = false</td></tr>
+<tr class="separator:adcfa918e05b5a98cbddc84bc3f1c15cc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4086b1a341b7c8462a47fb1b25fd49ab"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="style_8php.html#a4086b1a341b7c8462a47fb1b25fd49ab">$colour</a> = false</td></tr>
+<tr class="separator:a4086b1a341b7c8462a47fb1b25fd49ab"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acb3046ad9c01b7d60cde20f58d77c548"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="style_8php.html#acb3046ad9c01b7d60cde20f58d77c548">$shadows</a> = false</td></tr>
+<tr class="separator:acb3046ad9c01b7d60cde20f58d77c548"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a938168352fd3cdaa1c10c16a34f5938a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="style_8php.html#a938168352fd3cdaa1c10c16a34f5938a">$navcolour</a> = false</td></tr>
+<tr class="separator:a938168352fd3cdaa1c10c16a34f5938a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a232513bf4339fe34908c4c63cb93168b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="style_8php.html#a232513bf4339fe34908c4c63cb93168b">$nav_bg_1</a> = &quot;f88&quot;</td></tr>
+<tr class="separator:a232513bf4339fe34908c4c63cb93168b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a03a72942b7428fd9af1224770d20a8ba"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="style_8php.html#a03a72942b7428fd9af1224770d20a8ba">$nav_bg_2</a> = &quot;b00&quot;</td></tr>
+<tr class="separator:a03a72942b7428fd9af1224770d20a8ba"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acc190405dda0a23a80551dee11c74c0c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="style_8php.html#acc190405dda0a23a80551dee11c74c0c">$nav_bg_3</a> = &quot;f00&quot;</td></tr>
+<tr class="separator:acc190405dda0a23a80551dee11c74c0c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aef266cfcb27c6ddb3292584c945bab33"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="style_8php.html#aef266cfcb27c6ddb3292584c945bab33">$nav_bg_4</a> = &quot;b00&quot;</td></tr>
+<tr class="separator:aef266cfcb27c6ddb3292584c945bab33"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa658152b727ea1233f6df6ded6437dad"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="style_8php.html#aa658152b727ea1233f6df6ded6437dad">$displaystyle</a> = false</td></tr>
+<tr class="separator:aa658152b727ea1233f6df6ded6437dad"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6628a80911a6b37b464ef110ac8f6e42"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="style_8php.html#a6628a80911a6b37b464ef110ac8f6e42">$linkcolour</a> = false</td></tr>
+<tr class="separator:a6628a80911a6b37b464ef110ac8f6e42"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0b942d36d8862908864e2ffa4521be70"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="style_8php.html#a0b942d36d8862908864e2ffa4521be70">$shiny</a> = false</td></tr>
+<tr class="separator:a0b942d36d8862908864e2ffa4521be70"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8749837e08dfb3372662af9c33fa2a2e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="style_8php.html#a8749837e08dfb3372662af9c33fa2a2e">$site_line_height</a> = <a class="el" href="include_2config_8php.html#a5d19130818ea4c6b8726ab62cd989c15">get_config</a>(&quot;redbasic&quot;,&quot;line_height&quot;)</td></tr>
+<tr class="separator:a8749837e08dfb3372662af9c33fa2a2e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a45e6fafa363bc4586fa91dce1786be4f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="style_8php.html#a45e6fafa363bc4586fa91dce1786be4f">$site_redbasic_font_size</a> = <a class="el" href="include_2config_8php.html#a5d19130818ea4c6b8726ab62cd989c15">get_config</a>(&quot;redbasic&quot;, &quot;font_size&quot; )</td></tr>
+<tr class="separator:a45e6fafa363bc4586fa91dce1786be4f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a02d39b683a42fffbb27823d3860283bd"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="style_8php.html#a02d39b683a42fffbb27823d3860283bd">$site_colour</a> = <a class="el" href="include_2config_8php.html#a5d19130818ea4c6b8726ab62cd989c15">get_config</a>(&quot;redbasic&quot;, &quot;colour&quot; )</td></tr>
+<tr class="separator:a02d39b683a42fffbb27823d3860283bd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0a473a25349f07563d6c56d14031f02a"><td class="memItemLeft" align="right" valign="top">if(<a class="el" href="boot_8php.html#ad4c9dc2c8a82e8f52b7404c1655eab44">local_user</a>()) if(!<a class="el" href="features_8php.html#a52b5bdfb61b256713efecf7a7b20b0c0">feature_enabled</a>(<a class="el" href="boot_8php.html#ad4c9dc2c8a82e8f52b7404c1655eab44">local_user</a>(),'expert')) <br class="typebreak"/>
+if($line_height===false) if($line_height===false) <br class="typebreak"/>
+if($redbasic_font_size===false) <br class="typebreak"/>
+if($redbasic_font_size===false) <br class="typebreak"/>
+if($colour===false) if($colour===false) <br class="typebreak"/>
+if($navcolour===&quot;black&quot;)&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="style_8php.html#a0a473a25349f07563d6c56d14031f02a">if</a> (file_exists('view/theme/'.<a class="el" href="boot_8php.html#ad206598b909e8eb67eb0e0bb5ef69c13">current_theme</a>(). '/css/style.css'))</td></tr>
+<tr class="separator:a0a473a25349f07563d6c56d14031f02a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Variable Documentation</h2>
+<a class="anchor" id="a4086b1a341b7c8462a47fb1b25fd49ab"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$colour = false</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="view_2theme_2redbasic_2php_2config_8php.html#ab5073653dfb9eb2216f8580098a87071">redbasic_form()</a>, and <a class="el" href="view_2theme_2redbasic_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d">theme_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa658152b727ea1233f6df6ded6437dad"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$displaystyle = false</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="view_2theme_2redbasic_2php_2config_8php.html#ab5073653dfb9eb2216f8580098a87071">redbasic_form()</a>, and <a class="el" href="view_2theme_2redbasic_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d">theme_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a4131d1765ee4deb28e83fc4527943ee0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$line_height = false</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="view_2theme_2redbasic_2php_2config_8php.html#ab5073653dfb9eb2216f8580098a87071">redbasic_form()</a>, and <a class="el" href="view_2theme_2redbasic_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d">theme_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a6628a80911a6b37b464ef110ac8f6e42"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$linkcolour = false</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="view_2theme_2redbasic_2php_2config_8php.html#ab5073653dfb9eb2216f8580098a87071">redbasic_form()</a>, and <a class="el" href="view_2theme_2redbasic_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d">theme_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a232513bf4339fe34908c4c63cb93168b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$nav_bg_1 = &quot;f88&quot;</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a03a72942b7428fd9af1224770d20a8ba"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$nav_bg_2 = &quot;b00&quot;</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="acc190405dda0a23a80551dee11c74c0c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$nav_bg_3 = &quot;f00&quot;</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aef266cfcb27c6ddb3292584c945bab33"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$nav_bg_4 = &quot;b00&quot;</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a938168352fd3cdaa1c10c16a34f5938a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$navcolour = false</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="view_2theme_2redbasic_2php_2config_8php.html#ab5073653dfb9eb2216f8580098a87071">redbasic_form()</a>, and <a class="el" href="view_2theme_2redbasic_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d">theme_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="addf42c3d02e53f8e4153f3bb9dabfcda"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$redbasic_font_size = false</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="adcfa918e05b5a98cbddc84bc3f1c15cc"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$resolution = false</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="photo_8php.html#a582779d24882b0d31ee909a91d70a448">photo_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="acb3046ad9c01b7d60cde20f58d77c548"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$shadows = false</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="view_2theme_2redbasic_2php_2config_8php.html#ab5073653dfb9eb2216f8580098a87071">redbasic_form()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a0b942d36d8862908864e2ffa4521be70"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$shiny = false</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="view_2theme_2redbasic_2php_2config_8php.html#ab5073653dfb9eb2216f8580098a87071">redbasic_form()</a>, and <a class="el" href="view_2theme_2redbasic_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d">theme_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a02d39b683a42fffbb27823d3860283bd"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$site_colour = <a class="el" href="include_2config_8php.html#a5d19130818ea4c6b8726ab62cd989c15">get_config</a>(&quot;redbasic&quot;, &quot;colour&quot; )</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a8749837e08dfb3372662af9c33fa2a2e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$site_line_height = <a class="el" href="include_2config_8php.html#a5d19130818ea4c6b8726ab62cd989c15">get_config</a>(&quot;redbasic&quot;,&quot;line_height&quot;)</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a45e6fafa363bc4586fa91dce1786be4f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$site_redbasic_font_size = <a class="el" href="include_2config_8php.html#a5d19130818ea4c6b8726ab62cd989c15">get_config</a>(&quot;redbasic&quot;, &quot;font_size&quot; )</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a0a473a25349f07563d6c56d14031f02a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">if ($colour===&quot;dark&quot;) if (($redbasic_font_size &gt;=8.0)&amp;&amp;($redbasic_font_size&lt;=20.0)) if (($line_height &gt;=1.0)&amp;&amp;($line_height&lt;=2.0)) if($shadows===&quot;true&quot;)</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/style_8php.js b/doc/html/style_8php.js
new file mode 100644
index 000000000..35e00198f
--- /dev/null
+++ b/doc/html/style_8php.js
@@ -0,0 +1,20 @@
+var style_8php =
+[
+ [ "$colour", "style_8php.html#a4086b1a341b7c8462a47fb1b25fd49ab", null ],
+ [ "$displaystyle", "style_8php.html#aa658152b727ea1233f6df6ded6437dad", null ],
+ [ "$line_height", "style_8php.html#a4131d1765ee4deb28e83fc4527943ee0", null ],
+ [ "$linkcolour", "style_8php.html#a6628a80911a6b37b464ef110ac8f6e42", null ],
+ [ "$nav_bg_1", "style_8php.html#a232513bf4339fe34908c4c63cb93168b", null ],
+ [ "$nav_bg_2", "style_8php.html#a03a72942b7428fd9af1224770d20a8ba", null ],
+ [ "$nav_bg_3", "style_8php.html#acc190405dda0a23a80551dee11c74c0c", null ],
+ [ "$nav_bg_4", "style_8php.html#aef266cfcb27c6ddb3292584c945bab33", null ],
+ [ "$navcolour", "style_8php.html#a938168352fd3cdaa1c10c16a34f5938a", null ],
+ [ "$redbasic_font_size", "style_8php.html#addf42c3d02e53f8e4153f3bb9dabfcda", null ],
+ [ "$resolution", "style_8php.html#adcfa918e05b5a98cbddc84bc3f1c15cc", null ],
+ [ "$shadows", "style_8php.html#acb3046ad9c01b7d60cde20f58d77c548", null ],
+ [ "$shiny", "style_8php.html#a0b942d36d8862908864e2ffa4521be70", null ],
+ [ "$site_colour", "style_8php.html#a02d39b683a42fffbb27823d3860283bd", null ],
+ [ "$site_line_height", "style_8php.html#a8749837e08dfb3372662af9c33fa2a2e", null ],
+ [ "$site_redbasic_font_size", "style_8php.html#a45e6fafa363bc4586fa91dce1786be4f", null ],
+ [ "if", "style_8php.html#a0a473a25349f07563d6c56d14031f02a", null ]
+]; \ No newline at end of file
diff --git a/doc/html/subthread_8php.html b/doc/html/subthread_8php.html
new file mode 100644
index 000000000..ec10a25fa
--- /dev/null
+++ b/doc/html/subthread_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/subthread.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('subthread_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">subthread.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a50368f3d825b77996030528e7fbfa3d3"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="subthread_8php.html#a50368f3d825b77996030528e7fbfa3d3">subthread_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a50368f3d825b77996030528e7fbfa3d3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a50368f3d825b77996030528e7fbfa3d3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">subthread_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/subthread_8php.js b/doc/html/subthread_8php.js
new file mode 100644
index 000000000..93781b6dd
--- /dev/null
+++ b/doc/html/subthread_8php.js
@@ -0,0 +1,4 @@
+var subthread_8php =
+[
+ [ "subthread_content", "subthread_8php.html#a50368f3d825b77996030528e7fbfa3d3", null ]
+]; \ No newline at end of file
diff --git a/doc/html/suggest_8php.html b/doc/html/suggest_8php.html
new file mode 100644
index 000000000..822cf8fd4
--- /dev/null
+++ b/doc/html/suggest_8php.html
@@ -0,0 +1,155 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/suggest.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('suggest_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">suggest.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a696acf1dd8070e479adcc80c63c6718c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="suggest_8php.html#a696acf1dd8070e479adcc80c63c6718c">suggest_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a696acf1dd8070e479adcc80c63c6718c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a58748a8235d4523f8333847f3e42dd91"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="suggest_8php.html#a58748a8235d4523f8333847f3e42dd91">suggest_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a58748a8235d4523f8333847f3e42dd91"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a58748a8235d4523f8333847f3e42dd91"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">suggest_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a696acf1dd8070e479adcc80c63c6718c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">suggest_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/suggest_8php.js b/doc/html/suggest_8php.js
new file mode 100644
index 000000000..6a1ef5b3d
--- /dev/null
+++ b/doc/html/suggest_8php.js
@@ -0,0 +1,5 @@
+var suggest_8php =
+[
+ [ "suggest_content", "suggest_8php.html#a58748a8235d4523f8333847f3e42dd91", null ],
+ [ "suggest_init", "suggest_8php.html#a696acf1dd8070e479adcc80c63c6718c", null ]
+]; \ No newline at end of file
diff --git a/doc/html/sync_off.png b/doc/html/sync_off.png
new file mode 100644
index 000000000..3b443fc62
--- /dev/null
+++ b/doc/html/sync_off.png
Binary files differ
diff --git a/doc/html/sync_on.png b/doc/html/sync_on.png
new file mode 100644
index 000000000..e08320fb6
--- /dev/null
+++ b/doc/html/sync_on.png
Binary files differ
diff --git a/doc/html/system__unavailable_8php.html b/doc/html/system__unavailable_8php.html
new file mode 100644
index 000000000..35036ed15
--- /dev/null
+++ b/doc/html/system__unavailable_8php.html
@@ -0,0 +1,138 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/system_unavailable.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('system__unavailable_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">system_unavailable.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a73751a6bcc17ad3ca503496e2fb020fa"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="system__unavailable_8php.html#a73751a6bcc17ad3ca503496e2fb020fa">system_down</a> ()</td></tr>
+<tr class="separator:a73751a6bcc17ad3ca503496e2fb020fa"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a73751a6bcc17ad3ca503496e2fb020fa"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">system_down </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="boot_8php.html#ac608a34f3bc180e7724192e0fd31f9b0">system_unavailable()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/system__unavailable_8php.js b/doc/html/system__unavailable_8php.js
new file mode 100644
index 000000000..c92284b98
--- /dev/null
+++ b/doc/html/system__unavailable_8php.js
@@ -0,0 +1,4 @@
+var system__unavailable_8php =
+[
+ [ "system_down", "system__unavailable_8php.html#a73751a6bcc17ad3ca503496e2fb020fa", null ]
+]; \ No newline at end of file
diff --git a/doc/html/tab_a.png b/doc/html/tab_a.png
new file mode 100644
index 000000000..3b725c41c
--- /dev/null
+++ b/doc/html/tab_a.png
Binary files differ
diff --git a/doc/html/tab_b.png b/doc/html/tab_b.png
new file mode 100644
index 000000000..e2b4a8638
--- /dev/null
+++ b/doc/html/tab_b.png
Binary files differ
diff --git a/doc/html/tab_h.png b/doc/html/tab_h.png
new file mode 100644
index 000000000..fd5cb7054
--- /dev/null
+++ b/doc/html/tab_h.png
Binary files differ
diff --git a/doc/html/tab_s.png b/doc/html/tab_s.png
new file mode 100644
index 000000000..ab478c95b
--- /dev/null
+++ b/doc/html/tab_s.png
Binary files differ
diff --git a/doc/html/tabs.css b/doc/html/tabs.css
new file mode 100644
index 000000000..9cf578f23
--- /dev/null
+++ b/doc/html/tabs.css
@@ -0,0 +1,60 @@
+.tabs, .tabs2, .tabs3 {
+ background-image: url('tab_b.png');
+ width: 100%;
+ z-index: 101;
+ font-size: 13px;
+ font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif;
+}
+
+.tabs2 {
+ font-size: 10px;
+}
+.tabs3 {
+ font-size: 9px;
+}
+
+.tablist {
+ margin: 0;
+ padding: 0;
+ display: table;
+}
+
+.tablist li {
+ float: left;
+ display: table-cell;
+ background-image: url('tab_b.png');
+ line-height: 36px;
+ list-style: none;
+}
+
+.tablist a {
+ display: block;
+ padding: 0 20px;
+ font-weight: bold;
+ background-image:url('tab_s.png');
+ background-repeat:no-repeat;
+ background-position:right;
+ color: #283A5D;
+ text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);
+ text-decoration: none;
+ outline: none;
+}
+
+.tabs3 .tablist a {
+ padding: 0 10px;
+}
+
+.tablist a:hover {
+ background-image: url('tab_h.png');
+ background-repeat:repeat-x;
+ color: #fff;
+ text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0);
+ text-decoration: none;
+}
+
+.tablist li.current a {
+ background-image: url('tab_a.png');
+ background-repeat:repeat-x;
+ color: #fff;
+ text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0);
+}
diff --git a/doc/html/tagger_8php.html b/doc/html/tagger_8php.html
new file mode 100644
index 000000000..ee6c23754
--- /dev/null
+++ b/doc/html/tagger_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/tagger.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('tagger_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">tagger.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a0e4a3eb177d1684553c547503d67161c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tagger_8php.html#a0e4a3eb177d1684553c547503d67161c">tagger_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a0e4a3eb177d1684553c547503d67161c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a0e4a3eb177d1684553c547503d67161c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">tagger_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/tagger_8php.js b/doc/html/tagger_8php.js
new file mode 100644
index 000000000..845567bb3
--- /dev/null
+++ b/doc/html/tagger_8php.js
@@ -0,0 +1,4 @@
+var tagger_8php =
+[
+ [ "tagger_content", "tagger_8php.html#a0e4a3eb177d1684553c547503d67161c", null ]
+]; \ No newline at end of file
diff --git a/doc/html/tagrm_8php.html b/doc/html/tagrm_8php.html
new file mode 100644
index 000000000..2350816ae
--- /dev/null
+++ b/doc/html/tagrm_8php.html
@@ -0,0 +1,155 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/tagrm.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('tagrm_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">tagrm.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a1702f40aa53a2fa93deade1f609abe78"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tagrm_8php.html#a1702f40aa53a2fa93deade1f609abe78">tagrm_post</a> (&amp;$a)</td></tr>
+<tr class="separator:a1702f40aa53a2fa93deade1f609abe78"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:adfd4ea5b4d7fc6d9c9e042af5cd7d49a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tagrm_8php.html#adfd4ea5b4d7fc6d9c9e042af5cd7d49a">tagrm_content</a> (&amp;$a)</td></tr>
+<tr class="separator:adfd4ea5b4d7fc6d9c9e042af5cd7d49a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="adfd4ea5b4d7fc6d9c9e042af5cd7d49a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">tagrm_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a1702f40aa53a2fa93deade1f609abe78"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">tagrm_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/tagrm_8php.js b/doc/html/tagrm_8php.js
new file mode 100644
index 000000000..2753559fd
--- /dev/null
+++ b/doc/html/tagrm_8php.js
@@ -0,0 +1,5 @@
+var tagrm_8php =
+[
+ [ "tagrm_content", "tagrm_8php.html#adfd4ea5b4d7fc6d9c9e042af5cd7d49a", null ],
+ [ "tagrm_post", "tagrm_8php.html#a1702f40aa53a2fa93deade1f609abe78", null ]
+]; \ No newline at end of file
diff --git a/doc/html/taxonomy_8php.html b/doc/html/taxonomy_8php.html
new file mode 100644
index 000000000..f5a0c9243
--- /dev/null
+++ b/doc/html/taxonomy_8php.html
@@ -0,0 +1,591 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/taxonomy.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('taxonomy_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">taxonomy.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a3299482ac20e9d79453048dd52881d37"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="taxonomy_8php.html#a3299482ac20e9d79453048dd52881d37">file_tag_encode</a> ($s)</td></tr>
+<tr class="separator:a3299482ac20e9d79453048dd52881d37"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a08df5164926d2b31b8e9fcfe919de2b6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="taxonomy_8php.html#a08df5164926d2b31b8e9fcfe919de2b6">file_tag_decode</a> ($s)</td></tr>
+<tr class="separator:a08df5164926d2b31b8e9fcfe919de2b6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a163b5131f388080b0fc82398d3a32fe1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="taxonomy_8php.html#a163b5131f388080b0fc82398d3a32fe1">file_tag_file_query</a> ($table, $s, $type= 'file')</td></tr>
+<tr class="separator:a163b5131f388080b0fc82398d3a32fe1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7a913d19c77610da689be48fbbf6734c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="taxonomy_8php.html#a7a913d19c77610da689be48fbbf6734c">term_query</a> ($table, $s, $type=<a class="el" href="boot_8php.html#a0c59dde058efebbc66520d136cbd1631">TERM_UNKNOWN</a>)</td></tr>
+<tr class="separator:a7a913d19c77610da689be48fbbf6734c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4ba1339b2a7054971178ce194e4440fd"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="taxonomy_8php.html#a4ba1339b2a7054971178ce194e4440fd">store_item_tag</a> ($uid, $iid, $otype, $type, $term, $url= '')</td></tr>
+<tr class="separator:a4ba1339b2a7054971178ce194e4440fd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0fb8cf0ac7bcbc8b27d856fe9bf69cd1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="taxonomy_8php.html#a0fb8cf0ac7bcbc8b27d856fe9bf69cd1">get_terms_oftype</a> ($arr, $type)</td></tr>
+<tr class="separator:a0fb8cf0ac7bcbc8b27d856fe9bf69cd1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:adfead45e3b8a3dfb2b4a4b9281d0dbe1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="taxonomy_8php.html#adfead45e3b8a3dfb2b4a4b9281d0dbe1">format_term_for_display</a> ($term)</td></tr>
+<tr class="separator:adfead45e3b8a3dfb2b4a4b9281d0dbe1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aaf90ba8b839d6459065f39a4f1109b8a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="taxonomy_8php.html#aaf90ba8b839d6459065f39a4f1109b8a">tagadelic</a> ($uid, $count=0, $authors= '', $flags=0, $restrict=0, $type=<a class="el" href="boot_8php.html#a2750985ec445617d7e82ae3098c91e3f">TERM_HASHTAG</a>)</td></tr>
+<tr class="separator:aaf90ba8b839d6459065f39a4f1109b8a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aaeded36bcc983b35d9205fe5b6c18c43"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="taxonomy_8php.html#aaeded36bcc983b35d9205fe5b6c18c43">tags_sort</a> ($a, $b)</td></tr>
+<tr class="separator:aaeded36bcc983b35d9205fe5b6c18c43"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a088371f4bc19155b2291508f5cd63332"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="taxonomy_8php.html#a088371f4bc19155b2291508f5cd63332">dir_tagadelic</a> ($count=0)</td></tr>
+<tr class="separator:a088371f4bc19155b2291508f5cd63332"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac21d1dff16d569e7d110167aea4e63c2"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="taxonomy_8php.html#ac21d1dff16d569e7d110167aea4e63c2">tagblock</a> ($link, $uid, $count=0, $authors= '', $flags=0, $restrict=0, $type=<a class="el" href="boot_8php.html#a2750985ec445617d7e82ae3098c91e3f">TERM_HASHTAG</a>)</td></tr>
+<tr class="separator:ac21d1dff16d569e7d110167aea4e63c2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a599ee71dd3194c8127b00dabec77abc1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="taxonomy_8php.html#a599ee71dd3194c8127b00dabec77abc1">dir_tagblock</a> ($link, $r)</td></tr>
+<tr class="separator:a599ee71dd3194c8127b00dabec77abc1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a03f55ee46c5f496e42f3d29db8d09cce"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="taxonomy_8php.html#a03f55ee46c5f496e42f3d29db8d09cce">obj_verbs</a> ()</td></tr>
+<tr class="separator:a03f55ee46c5f496e42f3d29db8d09cce"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af387463d42ffdf7d2ab3d5b22e40a0c7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="taxonomy_8php.html#af387463d42ffdf7d2ab3d5b22e40a0c7">obj_verb_selector</a> ($current= '')</td></tr>
+<tr class="separator:af387463d42ffdf7d2ab3d5b22e40a0c7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7747fa859ac56fbffd4f9782d85505de"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="taxonomy_8php.html#a7747fa859ac56fbffd4f9782d85505de">get_things</a> ($profile_hash, $uid)</td></tr>
+<tr class="separator:a7747fa859ac56fbffd4f9782d85505de"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a088371f4bc19155b2291508f5cd63332"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">dir_tagadelic </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$count</em> = <code>0</code></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="dirsearch_8php.html#aa1fb04e1de4f25b63349ac78f94ceb4c">dirsearch_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a599ee71dd3194c8127b00dabec77abc1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">dir_tagblock </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$link</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$r</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="widgets_8php.html#a08035db02ff6a23260146b4c64153422">widget_dirtags()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a08df5164926d2b31b8e9fcfe919de2b6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">file_tag_decode </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a3299482ac20e9d79453048dd52881d37"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">file_tag_encode </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a163b5131f388080b0fc82398d3a32fe1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">file_tag_file_query </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$table</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em> = <code>'file'</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="adfead45e3b8a3dfb2b4a4b9281d0dbe1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">format_term_for_display </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$term</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a0fb8cf0ac7bcbc8b27d856fe9bf69cd1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_terms_oftype </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation()</a>, <a class="el" href="editpost_8php.html#a34011690864d122680c802e9e748ccfb">editpost_content()</a>, <a class="el" href="text_8php.html#a3054189cff173977f4216c9a3dd29e1b">format_categories()</a>, <a class="el" href="text_8php.html#a4e4d42b0a805148d9f9a92bcac89bf91">format_filer()</a>, <a class="el" href="items_8php.html#a6f7e1334af5d684a987fa6a3eb37f4cc">item_expire()</a>, <a class="el" href="items_8php.html#a649dc3e53ed794d0ead4b5d037f8d8d7">item_getfeedtags()</a>, <a class="el" href="items_8php.html#ab1bce4261bcf75ad62753b498a144d17">tag_deliver()</a>, and <a class="el" href="items_8php.html#a88c6cf7649ac836fbbed82a7a0315110">tgroup_check()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a7747fa859ac56fbffd4f9782d85505de"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_things </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$profile_hash</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="identity_8php.html#aa870d2c1f558cfd52bef05bc124e8fa4">advanced_profile()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="af387463d42ffdf7d2ab3d5b22e40a0c7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">obj_verb_selector </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$current</em> = <code>''</code></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="thing_8php.html#a24a35f1e64029a67fdbea94a776ae04b">thing_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a03f55ee46c5f496e42f3d29db8d09cce"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">obj_verbs </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>verbs: [0] = first person singular, e.g. "I want", [1] = 3rd person singular, e.g. "Bill wants" We use the first person form when creating an activity, but the third person for use in activities FIXME: There is no accounting for verb gender for languages where this is significant. We may eventually require <a class="el" href="taxonomy_8php.html#a03f55ee46c5f496e42f3d29db8d09cce">obj_verbs()</a> to provide full conjugations and specify which form to use in the $_REQUEST params to this module. </p>
+
+<p>Referenced by <a class="el" href="taxonomy_8php.html#a7747fa859ac56fbffd4f9782d85505de">get_things()</a>, <a class="el" href="taxonomy_8php.html#af387463d42ffdf7d2ab3d5b22e40a0c7">obj_verb_selector()</a>, and <a class="el" href="thing_8php.html#a8be23b1d475ec3d9291999221c674c80">thing_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a4ba1339b2a7054971178ce194e4440fd"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">store_item_tag </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$iid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$otype</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$term</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$url</em> = <code>''</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="filer_8php.html#a5fd5d7e61b2f9c43cb5f110c89dc4274">filer_content()</a>, <a class="el" href="items_8php.html#ab1bce4261bcf75ad62753b498a144d17">tag_deliver()</a>, and <a class="el" href="tagger_8php.html#a0e4a3eb177d1684553c547503d67161c">tagger_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aaf90ba8b839d6459065f39a4f1109b8a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">tagadelic </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$count</em> = <code>0</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$authors</em> = <code>''</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$flags</em> = <code>0</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$restrict</em> = <code>0</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em> = <code><a class="el" href="boot_8php.html#a2750985ec445617d7e82ae3098c91e3f">TERM_HASHTAG</a></code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="taxonomy_8php.html#ac21d1dff16d569e7d110167aea4e63c2">tagblock()</a>, and <a class="el" href="widgets_8php.html#a6dbc227aac750774284ee39c45f0a200">widget_tagcloud()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ac21d1dff16d569e7d110167aea4e63c2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">tagblock </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$link</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$count</em> = <code>0</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$authors</em> = <code>''</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$flags</em> = <code>0</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$restrict</em> = <code>0</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em> = <code><a class="el" href="boot_8php.html#a2750985ec445617d7e82ae3098c91e3f">TERM_HASHTAG</a></code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="widgets_8php.html#ae4ced69d83dbdd9e6b51660d9eba8653">widget_tagcloud_wall()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aaeded36bcc983b35d9205fe5b6c18c43"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">tags_sort </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$b</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a7a913d19c77610da689be48fbbf6734c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">term_query </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$table</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em> = <code><a class="el" href="boot_8php.html#a0c59dde058efebbc66520d136cbd1631">TERM_UNKNOWN</a></code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>, <a class="el" href="items_8php.html#a756738301f2ed96be50232500677d58a">items_fetch()</a>, and <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/taxonomy_8php.js b/doc/html/taxonomy_8php.js
new file mode 100644
index 000000000..24b5fb426
--- /dev/null
+++ b/doc/html/taxonomy_8php.js
@@ -0,0 +1,18 @@
+var taxonomy_8php =
+[
+ [ "dir_tagadelic", "taxonomy_8php.html#a088371f4bc19155b2291508f5cd63332", null ],
+ [ "dir_tagblock", "taxonomy_8php.html#a599ee71dd3194c8127b00dabec77abc1", null ],
+ [ "file_tag_decode", "taxonomy_8php.html#a08df5164926d2b31b8e9fcfe919de2b6", null ],
+ [ "file_tag_encode", "taxonomy_8php.html#a3299482ac20e9d79453048dd52881d37", null ],
+ [ "file_tag_file_query", "taxonomy_8php.html#a163b5131f388080b0fc82398d3a32fe1", null ],
+ [ "format_term_for_display", "taxonomy_8php.html#adfead45e3b8a3dfb2b4a4b9281d0dbe1", null ],
+ [ "get_terms_oftype", "taxonomy_8php.html#a0fb8cf0ac7bcbc8b27d856fe9bf69cd1", null ],
+ [ "get_things", "taxonomy_8php.html#a7747fa859ac56fbffd4f9782d85505de", null ],
+ [ "obj_verb_selector", "taxonomy_8php.html#af387463d42ffdf7d2ab3d5b22e40a0c7", null ],
+ [ "obj_verbs", "taxonomy_8php.html#a03f55ee46c5f496e42f3d29db8d09cce", null ],
+ [ "store_item_tag", "taxonomy_8php.html#a4ba1339b2a7054971178ce194e4440fd", null ],
+ [ "tagadelic", "taxonomy_8php.html#aaf90ba8b839d6459065f39a4f1109b8a", null ],
+ [ "tagblock", "taxonomy_8php.html#ac21d1dff16d569e7d110167aea4e63c2", null ],
+ [ "tags_sort", "taxonomy_8php.html#aaeded36bcc983b35d9205fe5b6c18c43", null ],
+ [ "term_query", "taxonomy_8php.html#a7a913d19c77610da689be48fbbf6734c", null ]
+]; \ No newline at end of file
diff --git a/doc/html/template__processor_8php.html b/doc/html/template__processor_8php.html
new file mode 100644
index 000000000..256076b85
--- /dev/null
+++ b/doc/html/template__processor_8php.html
@@ -0,0 +1,184 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/template_processor.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('template__processor_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Classes</a> &#124;
+<a href="#func-members">Functions</a> &#124;
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle">
+<div class="title">template_processor.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTemplate.html">Template</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ab2bcd8738f20f293636a6ae8e1099db5"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="template__processor_8php.html#ab2bcd8738f20f293636a6ae8e1099db5">template_escape</a> ($s)</td></tr>
+<tr class="separator:ab2bcd8738f20f293636a6ae8e1099db5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac635bb19a5f6eadd6b0cddefdd537c1e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="template__processor_8php.html#ac635bb19a5f6eadd6b0cddefdd537c1e">template_unescape</a> ($s)</td></tr>
+<tr class="separator:ac635bb19a5f6eadd6b0cddefdd537c1e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:a797745996c7839a93b2ab1af456631ab"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="template__processor_8php.html#a797745996c7839a93b2ab1af456631ab">KEY_NOT_EXISTS</a> '^R_key_not_Exists^'</td></tr>
+<tr class="separator:a797745996c7839a93b2ab1af456631ab"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="ab2bcd8738f20f293636a6ae8e1099db5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">template_escape </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classTemplate.html#aae9c4d761ea1298e745e8052d7910194">Template\_get_var()</a>, <a class="el" href="fbrowser_8php.html#aee476addcf7a3e0fe9454f7dfd5a56c4">fbrowser_content()</a>, and <a class="el" href="mod_2photos_8php.html#aa87382611a66ec5effdb2d78f13f5812">photos_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ac635bb19a5f6eadd6b0cddefdd537c1e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">template_unescape </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Variable Documentation</h2>
+<a class="anchor" id="a797745996c7839a93b2ab1af456631ab"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const KEY_NOT_EXISTS '^R_key_not_Exists^'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classTemplate.html#aae9c4d761ea1298e745e8052d7910194">Template\_get_var()</a>, and <a class="el" href="classTemplate.html#abbc484016ddf5d818f55b823cae6feb0">Template\var_replace()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/template__processor_8php.js b/doc/html/template__processor_8php.js
new file mode 100644
index 000000000..23335a2cc
--- /dev/null
+++ b/doc/html/template__processor_8php.js
@@ -0,0 +1,7 @@
+var template__processor_8php =
+[
+ [ "Template", "classTemplate.html", "classTemplate" ],
+ [ "template_escape", "template__processor_8php.html#ab2bcd8738f20f293636a6ae8e1099db5", null ],
+ [ "template_unescape", "template__processor_8php.html#ac635bb19a5f6eadd6b0cddefdd537c1e", null ],
+ [ "KEY_NOT_EXISTS", "template__processor_8php.html#a797745996c7839a93b2ab1af456631ab", null ]
+]; \ No newline at end of file
diff --git a/doc/html/test_2php_2theme_8php.html b/doc/html/test_2php_2theme_8php.html
new file mode 100644
index 000000000..322ba3135
--- /dev/null
+++ b/doc/html/test_2php_2theme_8php.html
@@ -0,0 +1,166 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Project: view/theme/test/php/theme.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="r!-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Project
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('test_2php_2theme_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> &#124;
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle">
+<div class="title">theme.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ad4235a22a5389b2291cdee55677e3cc5"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="test_2php_2theme_8php.html#ad4235a22a5389b2291cdee55677e3cc5">test_init</a> (&amp;$a)</td></tr>
+<tr class="separator:ad4235a22a5389b2291cdee55677e3cc5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:ae74b5c3ec259b616b5137f6cfc591fb5"><td class="memItemLeft" align="right" valign="top">$a&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="test_2php_2theme_8php.html#ae74b5c3ec259b616b5137f6cfc591fb5">theme_info</a> = array()</td></tr>
+<tr class="separator:ae74b5c3ec259b616b5137f6cfc591fb5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="ad4235a22a5389b2291cdee55677e3cc5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">test_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Variable Documentation</h2>
+<a class="anchor" id="ae74b5c3ec259b616b5137f6cfc591fb5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$a theme_info = array()</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="dir_b2f003339c516cc00c8cadcafbe82f13.html">view</a></li><li class="navelem"><a class="el" href="dir_8543001e5d25368a6edede3e63efb554.html">theme</a></li><li class="navelem"><a class="el" href="dir_8e4ceba158be32034f698ffd6810bb05.html">test</a></li><li class="navelem"><a class="el" href="dir_955ae6074e6c84afe72925e364242b14.html">php</a></li><li class="navelem"><a class="el" href="test_2php_2theme_8php.html">theme.php</a></li>
+ <li class="footer">Generated on Tue Feb 26 2013 15:43:22 for The Red Project by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.3.1 </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/test_2php_2theme_8php.js b/doc/html/test_2php_2theme_8php.js
new file mode 100644
index 000000000..cac936eda
--- /dev/null
+++ b/doc/html/test_2php_2theme_8php.js
@@ -0,0 +1,5 @@
+var test_2php_2theme_8php =
+[
+ [ "test_init", "test_2php_2theme_8php.html#ad4235a22a5389b2291cdee55677e3cc5", null ],
+ [ "theme_info", "test_2php_2theme_8php.html#ae74b5c3ec259b616b5137f6cfc591fb5", null ]
+]; \ No newline at end of file
diff --git a/doc/html/test_8php.html b/doc/html/test_8php.html
new file mode 100644
index 000000000..64f4f7c3d
--- /dev/null
+++ b/doc/html/test_8php.html
@@ -0,0 +1,147 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Project: mod/test.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="r!-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Project
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('test_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">test.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:aaff133c1f566a332b5a3ae41b70941f8"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="test_8php.html#aaff133c1f566a332b5a3ae41b70941f8">test_content</a> (&amp;$a)</td></tr>
+<tr class="separator:aaff133c1f566a332b5a3ae41b70941f8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="aaff133c1f566a332b5a3ae41b70941f8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">test_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="dir_d41ce877eb409a4791b288730010abe2.html">mod</a></li><li class="navelem"><a class="el" href="test_8php.html">test.php</a></li>
+ <li class="footer">Generated on Tue Feb 26 2013 15:43:21 for The Red Project by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.3.1 </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/test_8php.js b/doc/html/test_8php.js
new file mode 100644
index 000000000..3d877ee85
--- /dev/null
+++ b/doc/html/test_8php.js
@@ -0,0 +1,4 @@
+var test_8php =
+[
+ [ "test_content", "test_8php.html#aaff133c1f566a332b5a3ae41b70941f8", null ]
+]; \ No newline at end of file
diff --git a/doc/html/text_8php.html b/doc/html/text_8php.html
new file mode 100644
index 000000000..ba12fa22c
--- /dev/null
+++ b/doc/html/text_8php.html
@@ -0,0 +1,2306 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/text.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('text_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> &#124;
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle">
+<div class="title">text.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a9c6ce4e12a4ac883c5e3f36fed6e1e09"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a9c6ce4e12a4ac883c5e3f36fed6e1e09">replace_macros</a> ($s, $r)</td></tr>
+<tr class="separator:a9c6ce4e12a4ac883c5e3f36fed6e1e09"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9d6a5ee1290de7a8b483fe78585daade"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a9d6a5ee1290de7a8b483fe78585daade">random_string</a> ($size=64, $type=<a class="el" href="text_8php.html#aad557c054cf2ed915633701018fc7e3f">RANDOM_STRING_HEX</a>)</td></tr>
+<tr class="separator:a9d6a5ee1290de7a8b483fe78585daade"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1af49756c8c71902a66c7e329c462beb"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a1af49756c8c71902a66c7e329c462beb">notags</a> ($string)</td></tr>
+<tr class="separator:a1af49756c8c71902a66c7e329c462beb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa5148a0dfea2a1ca64c3d52f10aa2d64"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#aa5148a0dfea2a1ca64c3d52f10aa2d64">escape_tags</a> ($string)</td></tr>
+<tr class="separator:aa5148a0dfea2a1ca64c3d52f10aa2d64"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a324c58f37f6acdf9cd1922aa76077d9f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a324c58f37f6acdf9cd1922aa76077d9f">z_input_filter</a> ($channel_id, $s, $type= 'text/<a class="el" href="bbcode_8php.html#a009f61aaf78771737ed0765c8463911b">bbcode</a>')</td></tr>
+<tr class="separator:a324c58f37f6acdf9cd1922aa76077d9f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4841df5beabdd1bdd1ed56781a915d61"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a4841df5beabdd1bdd1ed56781a915d61">purify_html</a> ($s)</td></tr>
+<tr class="separator:a4841df5beabdd1bdd1ed56781a915d61"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a27cd2c1b3bcb49a0cfb7249e851725ca"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a27cd2c1b3bcb49a0cfb7249e851725ca">autoname</a> ($len)</td></tr>
+<tr class="separator:a27cd2c1b3bcb49a0cfb7249e851725ca"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aaed4413ed8918838b517e3b2fafaea0d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#aaed4413ed8918838b517e3b2fafaea0d">xmlify</a> ($str)</td></tr>
+<tr class="separator:aaed4413ed8918838b517e3b2fafaea0d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1360fed7f918d859daaca1c9f384f9af"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a1360fed7f918d859daaca1c9f384f9af">unxmlify</a> ($s)</td></tr>
+<tr class="separator:a1360fed7f918d859daaca1c9f384f9af"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afe9f178d264d44a94dc1292aaf0fd585"><td class="memItemLeft" align="right" valign="top"><a class="el" href="redbasic_2php_2style_8php.html#a883f9f14e205f7aa7de02c14df67b40a">if</a>(!function_exists('hex2bin'))&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#afe9f178d264d44a94dc1292aaf0fd585">paginate</a> (&amp;$a)</td></tr>
+<tr class="separator:afe9f178d264d44a94dc1292aaf0fd585"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a75c243e06341ec16bd5a44b9b1cacd85"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a75c243e06341ec16bd5a44b9b1cacd85">alt_pager</a> (&amp;$a, $i, $more= '', $less= '')</td></tr>
+<tr class="separator:a75c243e06341ec16bd5a44b9b1cacd85"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae4282a39492caa23ccbc2ce98e54f110"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#ae4282a39492caa23ccbc2ce98e54f110">expand_acl</a> ($s)</td></tr>
+<tr class="separator:ae4282a39492caa23ccbc2ce98e54f110"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9fbeae13c9abd6e27cb4d8d1817f969c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a9fbeae13c9abd6e27cb4d8d1817f969c">sanitise_acl</a> (&amp;$item)</td></tr>
+<tr class="separator:a9fbeae13c9abd6e27cb4d8d1817f969c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a98fd99dee3da8cf4c148dc04efe782ee"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a98fd99dee3da8cf4c148dc04efe782ee">perms2str</a> ($p)</td></tr>
+<tr class="separator:a98fd99dee3da8cf4c148dc04efe782ee"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa6b0aa8afbeab50d1a3058ad21acb74e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#aa6b0aa8afbeab50d1a3058ad21acb74e">item_message_id</a> ()</td></tr>
+<tr class="separator:aa6b0aa8afbeab50d1a3058ad21acb74e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa5528f41533927e1bd2da3618a74a6d7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#aa5528f41533927e1bd2da3618a74a6d7">photo_new_resource</a> ()</td></tr>
+<tr class="separator:aa5528f41533927e1bd2da3618a74a6d7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a95fd2f8f23a1948414a03ebc963bac57"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a95fd2f8f23a1948414a03ebc963bac57">attribute_contains</a> ($attr, $s)</td></tr>
+<tr class="separator:a95fd2f8f23a1948414a03ebc963bac57"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a030fa5ecc64168af0c4f44897a9bce63"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a030fa5ecc64168af0c4f44897a9bce63">logger</a> ($msg, $level=0)</td></tr>
+<tr class="separator:a030fa5ecc64168af0c4f44897a9bce63"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0a1f7c0e97f9ecbebf3e5834582b014c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a0a1f7c0e97f9ecbebf3e5834582b014c">dlogger</a> ($msg, $level=0)</td></tr>
+<tr class="separator:a0a1f7c0e97f9ecbebf3e5834582b014c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8b0a799341b1fc4cba2c3ede3e3fc9b6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a8b0a799341b1fc4cba2c3ede3e3fc9b6">profiler</a> ($t1, $t2, $label)</td></tr>
+<tr class="separator:a8b0a799341b1fc4cba2c3ede3e3fc9b6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af8a3e3a66a7b862d4510f145d2e13186"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#af8a3e3a66a7b862d4510f145d2e13186">activity_match</a> ($haystack, $needle)</td></tr>
+<tr class="separator:af8a3e3a66a7b862d4510f145d2e13186"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4659fbc4e54ddc700c3aa66b9092c623"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a4659fbc4e54ddc700c3aa66b9092c623">get_tags</a> ($s)</td></tr>
+<tr class="separator:a4659fbc4e54ddc700c3aa66b9092c623"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afc998d2796a6b2a08e96f7cc061e7221"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#afc998d2796a6b2a08e96f7cc061e7221">qp</a> ($s)</td></tr>
+<tr class="separator:afc998d2796a6b2a08e96f7cc061e7221"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a76d1b3435c067978d7b484c45f56472b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a76d1b3435c067978d7b484c45f56472b">get_mentions</a> ($item, $tags)</td></tr>
+<tr class="separator:a76d1b3435c067978d7b484c45f56472b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad6432621d0fafcbcf3d3b9b49bef7784"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#ad6432621d0fafcbcf3d3b9b49bef7784">contact_block</a> ()</td></tr>
+<tr class="separator:ad6432621d0fafcbcf3d3b9b49bef7784"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a55ab893be57feda59c2a7ba1e58ff2d0"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a55ab893be57feda59c2a7ba1e58ff2d0">chanlink_hash</a> ($s)</td></tr>
+<tr class="separator:a55ab893be57feda59c2a7ba1e58ff2d0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2e8d6c402603be3a1256a16605e09c2a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a2e8d6c402603be3a1256a16605e09c2a">chanlink_url</a> ($s)</td></tr>
+<tr class="separator:a2e8d6c402603be3a1256a16605e09c2a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a85e3a4851c16674834010d8419a5d7ca"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a85e3a4851c16674834010d8419a5d7ca">chanlink_cid</a> ($d)</td></tr>
+<tr class="separator:a85e3a4851c16674834010d8419a5d7ca"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a24d441d30df4b8e6bf6780bf62a5e2c6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a24d441d30df4b8e6bf6780bf62a5e2c6">magiclink_url</a> ($observer, $myaddr, $url)</td></tr>
+<tr class="separator:a24d441d30df4b8e6bf6780bf62a5e2c6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2a902f5fdba8646333e997898ac45ea3"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a2a902f5fdba8646333e997898ac45ea3">micropro</a> ($contact, $redirect=false, $class= '', $textmode=false)</td></tr>
+<tr class="separator:a2a902f5fdba8646333e997898ac45ea3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a876e94892867019935b348b573299352"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a876e94892867019935b348b573299352">search</a> ($s, $id='search-box', $url='/search', $save=false)</td></tr>
+<tr class="separator:a876e94892867019935b348b573299352"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aae91e4d2a2c6f7a9daccd2c186ae3447"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#aae91e4d2a2c6f7a9daccd2c186ae3447">searchbox</a> ($s, $id='<a class="el" href="text_8php.html#a876e94892867019935b348b573299352">search</a>-box', $url='/<a class="el" href="text_8php.html#a876e94892867019935b348b573299352">search</a>', $save=false)</td></tr>
+<tr class="separator:aae91e4d2a2c6f7a9daccd2c186ae3447"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6a3d80a6c6fb234fd0bac44203b828eb"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a6a3d80a6c6fb234fd0bac44203b828eb">valid_email</a> ($<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>)</td></tr>
+<tr class="separator:a6a3d80a6c6fb234fd0bac44203b828eb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a11255c8c4e5245b6c24f97684826aa54"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a11255c8c4e5245b6c24f97684826aa54">linkify</a> ($s)</td></tr>
+<tr class="separator:a11255c8c4e5245b6c24f97684826aa54"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a33bdb5d4bfff2ede7caf61a98ac0a2e9"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a33bdb5d4bfff2ede7caf61a98ac0a2e9">sslify</a> ($s)</td></tr>
+<tr class="separator:a33bdb5d4bfff2ede7caf61a98ac0a2e9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa46f941155c2ac1155f2f17ffb0adb66"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#aa46f941155c2ac1155f2f17ffb0adb66">get_poke_verbs</a> ()</td></tr>
+<tr class="separator:aa46f941155c2ac1155f2f17ffb0adb66"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a736db13a966b8abaf8c9198faa35911a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a736db13a966b8abaf8c9198faa35911a">get_mood_verbs</a> ()</td></tr>
+<tr class="separator:a736db13a966b8abaf8c9198faa35911a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3d225b253bb9e0f2498c11647d927b0b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a3d225b253bb9e0f2498c11647d927b0b">smilies</a> ($s, $sample=false)</td></tr>
+<tr class="separator:a3d225b253bb9e0f2498c11647d927b0b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a44d460fcdee6247c67b9bef3ea15f3e6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a44d460fcdee6247c67b9bef3ea15f3e6">smile_encode</a> ($m)</td></tr>
+<tr class="separator:a44d460fcdee6247c67b9bef3ea15f3e6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aca0f589be74fab1a460c57e88dad9779"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#aca0f589be74fab1a460c57e88dad9779">smile_decode</a> ($m)</td></tr>
+<tr class="separator:aca0f589be74fab1a460c57e88dad9779"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac19d2b33a58372a357a43d51eed19162"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#ac19d2b33a58372a357a43d51eed19162">preg_heart</a> ($<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>)</td></tr>
+<tr class="separator:ac19d2b33a58372a357a43d51eed19162"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a63fb21c0bed2fc72eef2c1471ac42b63"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a63fb21c0bed2fc72eef2c1471ac42b63">day_translate</a> ($s)</td></tr>
+<tr class="separator:a63fb21c0bed2fc72eef2c1471ac42b63"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4bbb7d00c05cd20b4e043424f322388f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a4bbb7d00c05cd20b4e043424f322388f">normalise_link</a> ($url)</td></tr>
+<tr class="separator:a4bbb7d00c05cd20b4e043424f322388f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a47c1e4a5f3f53027daacd8a9db24f285"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a47c1e4a5f3f53027daacd8a9db24f285">link_compare</a> ($a, $b)</td></tr>
+<tr class="separator:a47c1e4a5f3f53027daacd8a9db24f285"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8264348059abd1d4d5bb521323d3b19a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a8264348059abd1d4d5bb521323d3b19a">unobscure</a> (&amp;$item)</td></tr>
+<tr class="separator:a8264348059abd1d4d5bb521323d3b19a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af9c9ac3f74c82dc60acfa404d0e9dc53"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#af9c9ac3f74c82dc60acfa404d0e9dc53">theme_attachments</a> (&amp;$item)</td></tr>
+<tr class="separator:af9c9ac3f74c82dc60acfa404d0e9dc53"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3054189cff173977f4216c9a3dd29e1b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a3054189cff173977f4216c9a3dd29e1b">format_categories</a> (&amp;$item, $writeable)</td></tr>
+<tr class="separator:a3054189cff173977f4216c9a3dd29e1b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4e4d42b0a805148d9f9a92bcac89bf91"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a4e4d42b0a805148d9f9a92bcac89bf91">format_filer</a> (&amp;$item)</td></tr>
+<tr class="separator:a4e4d42b0a805148d9f9a92bcac89bf91"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae4df74296fbe55051ed3c035e55205e5"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#ae4df74296fbe55051ed3c035e55205e5">prepare_body</a> (&amp;$item, $attach=false)</td></tr>
+<tr class="separator:ae4df74296fbe55051ed3c035e55205e5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afe54312607d92f7ce9593f5760831f80"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#afe54312607d92f7ce9593f5760831f80">prepare_text</a> ($text, $content_type= 'text/<a class="el" href="bbcode_8php.html#a009f61aaf78771737ed0765c8463911b">bbcode</a>')</td></tr>
+<tr class="separator:afe54312607d92f7ce9593f5760831f80"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a405afe814a23f3bd94d826101aa168ab"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a405afe814a23f3bd94d826101aa168ab">zidify_callback</a> ($match)</td></tr>
+<tr class="separator:a405afe814a23f3bd94d826101aa168ab"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab4a4c3d4700bc219bb84f33b499314f4"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#ab4a4c3d4700bc219bb84f33b499314f4">zidify_img_callback</a> ($match)</td></tr>
+<tr class="separator:ab4a4c3d4700bc219bb84f33b499314f4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a29988052f3944111def3b6aaf2c7a8f6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a29988052f3944111def3b6aaf2c7a8f6">zidify_links</a> ($s)</td></tr>
+<tr class="separator:a29988052f3944111def3b6aaf2c7a8f6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8d8c4a11e53461caca21181ebd72daca"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a8d8c4a11e53461caca21181ebd72daca">feed_hublinks</a> ()</td></tr>
+<tr class="separator:a8d8c4a11e53461caca21181ebd72daca"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a89929fa6f70a8ba54d5273fcf622b665"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a89929fa6f70a8ba54d5273fcf622b665">feed_salmonlinks</a> ($nick)</td></tr>
+<tr class="separator:a89929fa6f70a8ba54d5273fcf622b665"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aac0969ae09853205992ba06ab9f9f61a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#aac0969ae09853205992ba06ab9f9f61a">get_plink</a> ($item, $conversation_mode=true)</td></tr>
+<tr class="separator:aac0969ae09853205992ba06ab9f9f61a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a29d6b804e368d3ef359ee295e96ed4c7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a29d6b804e368d3ef359ee295e96ed4c7">unamp</a> ($s)</td></tr>
+<tr class="separator:a29d6b804e368d3ef359ee295e96ed4c7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3999a0b3e22e440f280ee791ce34d384"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a3999a0b3e22e440f280ee791ce34d384">layout_select</a> ($channel_id, $current= '')</td></tr>
+<tr class="separator:a3999a0b3e22e440f280ee791ce34d384"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1633412120f52bdce5f43e0a127d9293"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a1633412120f52bdce5f43e0a127d9293">mimetype_select</a> ($channel_id, $current= 'text/<a class="el" href="bbcode_8php.html#a009f61aaf78771737ed0765c8463911b">bbcode</a>')</td></tr>
+<tr class="separator:a1633412120f52bdce5f43e0a127d9293"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a71f6952243d3fe1c5a8154f78027e29c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a71f6952243d3fe1c5a8154f78027e29c">lang_selector</a> ()</td></tr>
+<tr class="separator:a71f6952243d3fe1c5a8154f78027e29c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae2126da85966da0e79c6bcbac63b0bda"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#ae2126da85966da0e79c6bcbac63b0bda">return_bytes</a> ($size_str)</td></tr>
+<tr class="separator:ae2126da85966da0e79c6bcbac63b0bda"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae4f6881d7e13623f8eded6277595112a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#ae4f6881d7e13623f8eded6277595112a">generate_user_guid</a> ()</td></tr>
+<tr class="separator:ae4f6881d7e13623f8eded6277595112a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a070384ec000fd65043fce11d5392d241"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a070384ec000fd65043fce11d5392d241">base64url_encode</a> ($s, $strip_padding=true)</td></tr>
+<tr class="separator:a070384ec000fd65043fce11d5392d241"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a13286f8a95d2de6b102966ecc270c8d6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a13286f8a95d2de6b102966ecc270c8d6">base64url_decode</a> ($s)</td></tr>
+<tr class="separator:a13286f8a95d2de6b102966ecc270c8d6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afe18627c4983ee5f7c940a0992818cd5"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#afe18627c4983ee5f7c940a0992818cd5">cleardiv</a> ()</td></tr>
+<tr class="separator:afe18627c4983ee5f7c940a0992818cd5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3d2793d66db3345fd290b71e2eadf98e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a3d2793d66db3345fd290b71e2eadf98e">bb_translate_video</a> ($s)</td></tr>
+<tr class="separator:a3d2793d66db3345fd290b71e2eadf98e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a138a3a611fa7f4f3630674145fc826bf"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a138a3a611fa7f4f3630674145fc826bf">html2bb_video</a> ($s)</td></tr>
+<tr class="separator:a138a3a611fa7f4f3630674145fc826bf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acedb584f65114a33f389efb796172a91"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#acedb584f65114a33f389efb796172a91">array_xmlify</a> ($val)</td></tr>
+<tr class="separator:acedb584f65114a33f389efb796172a91"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad855a32bee22c3f3b9734e3a334b96f2"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#ad855a32bee22c3f3b9734e3a334b96f2">reltoabs</a> ($text, $base)</td></tr>
+<tr class="separator:ad855a32bee22c3f3b9734e3a334b96f2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac1dbf2e37e8069bea2c0f557fdbf203e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#ac1dbf2e37e8069bea2c0f557fdbf203e">item_post_type</a> ($item)</td></tr>
+<tr class="separator:ac1dbf2e37e8069bea2c0f557fdbf203e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:adba17ec946f4285285dc100f7860bf51"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#adba17ec946f4285285dc100f7860bf51">normalise_openid</a> ($s)</td></tr>
+<tr class="separator:adba17ec946f4285285dc100f7860bf51"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a740ad03e00459039a2c0992246c4e727"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a740ad03e00459039a2c0992246c4e727">undo_post_tagging</a> ($s)</td></tr>
+<tr class="separator:a740ad03e00459039a2c0992246c4e727"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afdc69fe3f6c09e35e46304dcea63ae28"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#afdc69fe3f6c09e35e46304dcea63ae28">fix_mce_lf</a> ($s)</td></tr>
+<tr class="separator:afdc69fe3f6c09e35e46304dcea63ae28"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4e7698aca48982512594b274543c3b9b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a4e7698aca48982512594b274543c3b9b">protect_sprintf</a> ($s)</td></tr>
+<tr class="separator:a4e7698aca48982512594b274543c3b9b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1557112a774ec00fa06ed6b6f6495506"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a1557112a774ec00fa06ed6b6f6495506">is_a_date_arg</a> ($s)</td></tr>
+<tr class="separator:a1557112a774ec00fa06ed6b6f6495506"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2690ad67bb6fb97ef69de3e8d23f2728"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a2690ad67bb6fb97ef69de3e8d23f2728">legal_webbie</a> ($s)</td></tr>
+<tr class="separator:a2690ad67bb6fb97ef69de3e8d23f2728"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0c65597bb4aed3a039eb795ff540e5e3"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a0c65597bb4aed3a039eb795ff540e5e3">check_webbie</a> ($arr)</td></tr>
+<tr class="separator:a0c65597bb4aed3a039eb795ff540e5e3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a436a8de00c942364c2d0fcfc7e1f4b5a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a436a8de00c942364c2d0fcfc7e1f4b5a">ids_to_querystr</a> ($arr, $idx= 'id')</td></tr>
+<tr class="separator:a436a8de00c942364c2d0fcfc7e1f4b5a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a36a2e5d418ee81140f25c4233cfecd1f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a36a2e5d418ee81140f25c4233cfecd1f">xchan_query</a> (&amp;$items, $abook=true)</td></tr>
+<tr class="separator:a36a2e5d418ee81140f25c4233cfecd1f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a543447c5ed766535221e2d9636b379ee"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a543447c5ed766535221e2d9636b379ee">xchan_mail_query</a> (&amp;$item)</td></tr>
+<tr class="separator:a543447c5ed766535221e2d9636b379ee"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ace3c98538c63e09b70a363210b414112"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#ace3c98538c63e09b70a363210b414112">find_xchan_in_array</a> ($xchan, $arr)</td></tr>
+<tr class="separator:ace3c98538c63e09b70a363210b414112"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3972701c5c83624ec4e2d06242f614e7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a3972701c5c83624ec4e2d06242f614e7">get_rel_link</a> ($j, $rel)</td></tr>
+<tr class="separator:a3972701c5c83624ec4e2d06242f614e7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1e510c53624933ce9b7d6715784894db"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a1e510c53624933ce9b7d6715784894db">magic_link</a> ($s)</td></tr>
+<tr class="separator:a1e510c53624933ce9b7d6715784894db"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8796f6a9ca592ecdce7b3afc3462aa13"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a8796f6a9ca592ecdce7b3afc3462aa13">stringify_array_elms</a> (&amp;$arr, $escape=false)</td></tr>
+<tr class="separator:a8796f6a9ca592ecdce7b3afc3462aa13"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae17b39d5e321debd3ad16dcbbde842b8"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#ae17b39d5e321debd3ad16dcbbde842b8">jindent</a> ($json)</td></tr>
+<tr class="separator:ae17b39d5e321debd3ad16dcbbde842b8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0271381208acfa2d4cff36da281e3e23"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a0271381208acfa2d4cff36da281e3e23">json_decode_plus</a> ($s)</td></tr>
+<tr class="separator:a0271381208acfa2d4cff36da281e3e23"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a87a3cefc603302c78982f1d8e1245265"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a87a3cefc603302c78982f1d8e1245265">design_tools</a> ()</td></tr>
+<tr class="separator:a87a3cefc603302c78982f1d8e1245265"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a75c326298519ed14ebe762194c8a3f2a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a75c326298519ed14ebe762194c8a3f2a">in_arrayi</a> ($needle, $haystack)</td></tr>
+<tr class="separator:a75c326298519ed14ebe762194c8a3f2a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:aad557c054cf2ed915633701018fc7e3f"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#aad557c054cf2ed915633701018fc7e3f">RANDOM_STRING_HEX</a> 0x00</td></tr>
+<tr class="separator:aad557c054cf2ed915633701018fc7e3f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2ffd79c60cc87cec24ef76447b905187"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a2ffd79c60cc87cec24ef76447b905187">RANDOM_STRING_TEXT</a> 0x01</td></tr>
+<tr class="separator:a2ffd79c60cc87cec24ef76447b905187"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="af8a3e3a66a7b862d4510f145d2e13186"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">activity_match </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$haystack</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$needle</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classItem.html#a80dcd9d0f548c3ad550abe7e6981fb51">Item\add_child()</a>, <a class="el" href="classConversation.html#a8335cdd43f1836e3c255638e61a09e16">Conversation\add_thread()</a>, <a class="el" href="items_8php.html#a8794863cdf8ce1333040933d3a3f66bd">consume_feed()</a>, <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation()</a>, <a class="el" href="items_8php.html#a896c1809d58f2d7a42cfe14577958ddf">get_atom_elements()</a>, <a class="el" href="text_8php.html#ac1dbf2e37e8069bea2c0f557fdbf203e">item_post_type()</a>, <a class="el" href="conversation_8php.html#afe5b2f38d8b803edb0d7ec5fa2868db0">like_puller()</a>, <a class="el" href="conversation_8php.html#a9bd7f9fb6678736c581bcba3b17f471c">localize_item()</a>, <a class="el" href="zot_8php.html#a37ec13b18057634eadb071f05297f5e1">process_delivery()</a>, <a class="el" href="zot_8php.html#aad25a3fe0e1566121d6fb8222979bc10">remove_community_tag()</a>, and <a class="el" href="conversation_8php.html#a7eeaaf44506815576f3bd80053ef52c3">visible_activity()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a75c243e06341ec16bd5a44b9b1cacd85"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">alt_pager </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$i</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$more</em> = <code>''</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$less</em> = <code>''</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>, <a class="el" href="community_8php.html#a1197aafd6a6b540dbb4a0c04ade3a25a">community_content()</a>, <a class="el" href="mod_2directory_8php.html#aac79396570d759da2efac24fcedf5b44">directory_content()</a>, <a class="el" href="mod_2message_8php.html#ac72dfed3ce08fcb331d66b37edc6e15f">message_content()</a>, and <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="acedb584f65114a33f389efb796172a91"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">array_xmlify </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$val</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>apply <a class="el" href="text_8php.html#aaed4413ed8918838b517e3b2fafaea0d">xmlify()</a> to all values of array $val, recursively </p>
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#a5990101034e7abf6404feba3cd273629">api_apply_template()</a>, and <a class="el" href="poco_8php.html#a53def16f75e3d41f1d2bb7cfa4905498">poco_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a95fd2f8f23a1948414a03ebc963bac57"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">attribute_contains </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$attr</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a27cd2c1b3bcb49a0cfb7249e851725ca"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">autoname </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$len</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>generate a string that's random, but usually pronounceable. used to generate initial passwords </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype">int</td><td class="paramname">$len</td><td></td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>string </dd></dl>
+
+<p>Referenced by <a class="el" href="setup_8php.html#a14d208682a88632290c895d20da6e7d6">check_php()</a>, <a class="el" href="invite_8php.html#aeb0881c0f93c8e8552e5ed756ce6e5a5">invite_post()</a>, and <a class="el" href="lostpass_8php.html#a0314d94e48c789b1b3a201d740c9eab3">lostpass_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a13286f8a95d2de6b102966ecc270c8d6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">base64url_decode </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="crypto_8php.html#aca7c3a574bfb6c6ef1f2403a56823914">aes_unencapsulate()</a>, <a class="el" href="items_8php.html#a896c1809d58f2d7a42cfe14577958ddf">get_atom_elements()</a>, <a class="el" href="items_8php.html#a536d0313b6ffe33b9d2490c4e25c5361">get_item_elements()</a>, <a class="el" href="import_8php.html#af17fef0410518f7eac205d0ea416eaa2">import_post()</a>, <a class="el" href="zot_8php.html#a2657e141d62d5f67ad3c87651b585299">import_site()</a>, <a class="el" href="zot_8php.html#a56f3f65514e4e7f0cd117d01735aebd1">import_xchan()</a>, <a class="el" href="mod_2oembed_8php.html#a9145025aaf057fb5d3f9f7011e5e1014">oembed_init()</a>, <a class="el" href="post_8php.html#af4b48181ce773ef0cdfc972441445c34">post_init()</a>, <a class="el" href="post_8php.html#af59e6a1dc22d19d9257b01cd7ccedb75">post_post()</a>, <a class="el" href="text_8php.html#aca0f589be74fab1a460c57e88dad9779">smile_decode()</a>, <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>, and <a class="el" href="zot_8php.html#a5bcdfef419b16075a0eca990956223dc">zot_register_hub()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a070384ec000fd65043fce11d5392d241"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">base64url_encode </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$strip_padding</em> = <code>true</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="crypto_8php.html#a2148d7aac7b30c720f7ebda7e9790286">aes_encapsulate()</a>, <a class="el" href="zot_8php.html#a703f528ade8382cf374e4119bd6f7859">allowed_public_recips()</a>, <a class="el" href="identity_8php.html#a345f4c943d84de502ec6e72d2c813945">create_identity()</a>, <a class="el" href="boot_8php.html#aca5e42678e178c6b9034610d66666fd7">fix_system_urls()</a>, <a class="el" href="items_8php.html#a536d0313b6ffe33b9d2490c4e25c5361">get_item_elements()</a>, <a class="el" href="identity_8php.html#a3570a4eb77332b292d394c4132cb8f03">identity_basic_export()</a>, <a class="el" href="zot_8php.html#ad149f1e98c0c5b88ff9147e6ee3f330d">import_author_zot()</a>, <a class="el" href="import_8php.html#af17fef0410518f7eac205d0ea416eaa2">import_post()</a>, <a class="el" href="zot_8php.html#a56f3f65514e4e7f0cd117d01735aebd1">import_xchan()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">item_store()</a>, <a class="el" href="items_8php.html#acf0bf7c9d21ac84f32effb754f7ad484">item_store_update()</a>, <a class="el" href="magic_8php.html#acea2cc792849ca2d71d4b689f66518bf">magic_init()</a>, <a class="el" href="include_2oembed_8php.html#a9e57f3e36a0a0a47e6db79544b701d9a">oembed_iframe()</a>, <a class="el" href="items_8php.html#a410f9c743877c125ca06312373346903">post_activity_item()</a>, <a class="el" href="post_8php.html#af59e6a1dc22d19d9257b01cd7ccedb75">post_post()</a>, <a class="el" href="text_8php.html#a9d6a5ee1290de7a8b483fe78585daade">random_string()</a>, <a class="el" href="text_8php.html#a44d460fcdee6247c67b9bef3ea15f3e6">smile_encode()</a>, <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>, <a class="el" href="zot_8php.html#a3862b3161b2c8557dc1a95020179bd81">zot_build_packet()</a>, <a class="el" href="zot_8php.html#a61cdc1ec843663c423ed2d8160ae5aea">zot_fetch()</a>, <a class="el" href="zot_8php.html#aeea071f17e306fe3d0c488551906bfab">zot_import()</a>, <a class="el" href="zot_8php.html#ab22d67660702056bf3f4696dcebf5ce7">zot_new_uid()</a>, and <a class="el" href="zot_8php.html#a5bcdfef419b16075a0eca990956223dc">zot_register_hub()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a3d2793d66db3345fd290b71e2eadf98e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">bb_translate_video </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a85e3a4851c16674834010d8419a5d7ca"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">chanlink_cid </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$d</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a55ab893be57feda59c2a7ba1e58ff2d0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">chanlink_hash </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="mail_8php.html#a3c7c485fc69f92371e8b20936040eca1">mail_content()</a>, <a class="el" href="mod_2message_8php.html#ac72dfed3ce08fcb331d66b37edc6e15f">message_content()</a>, and <a class="el" href="text_8php.html#a2a902f5fdba8646333e997898ac45ea3">micropro()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a2e8d6c402603be3a1256a16605e09c2a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">chanlink_url </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classItem.html#abcdb0ea9bcd1576bc99bba9b8f700bb8">Item\check_wall_to_wall()</a>, <a class="el" href="mod_2directory_8php.html#aac79396570d759da2efac24fcedf5b44">directory_content()</a>, <a class="el" href="dirprofile_8php.html#a3e1d30d3d93863ff5615f2df4ac7f052">dirprofile_init()</a>, <a class="el" href="items_8php.html#adf980098b6de9c3993bc3ff26a8dd6f9">fetch_post_tags()</a>, <a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">Item\get_template_data()</a>, <a class="el" href="conversation_8php.html#a9bd7f9fb6678736c581bcba3b17f471c">localize_item()</a>, <a class="el" href="randprof_8php.html#abf5dba3c608b9304cbf68327cd31b090">randprof_init()</a>, <a class="el" href="suggest_8php.html#a58748a8235d4523f8333847f3e42dd91">suggest_content()</a>, and <a class="el" href="widgets_8php.html#a0d404276fedc59f5038cf5c085028326">widget_suggestions()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a0c65597bb4aed3a039eb795ff540e5e3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">check_webbie </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="identity_8php.html#a345f4c943d84de502ec6e72d2c813945">create_identity()</a>, and <a class="el" href="new__channel_8php.html#a1ad7f99e4366a32942c6b954aba3a164">new_channel_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="afe18627c4983ee5f7c940a0992818cd5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">cleardiv </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="common_8php.html#ab63408f39abef7a6915186e8dabc5a96">common_content()</a>, and <a class="el" href="match_8php.html#a1dd853e959b9e70c1911bb2fb5f5130d">match_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ad6432621d0fafcbcf3d3b9b49bef7784"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">contact_block </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="identity_8php.html#a432259b2cf5b6f59be53e71db9f2c7dc">profile_sidebar()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a63fb21c0bed2fc72eef2c1471ac42b63"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">day_translate </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="identity_8php.html#aa870d2c1f558cfd52bef05bc124e8fa4">advanced_profile()</a>, <a class="el" href="datetime_8php.html#aea356409ba69f9de412298c998595dd2">cal()</a>, <a class="el" href="events_8php.html#a1d293fb217ae6bc9e3858c4b32e363ec">events_content()</a>, <a class="el" href="bb2diaspora_8php.html#a29a2ad41f5826f3975fa9a49934ff863">format_event_diaspora()</a>, <a class="el" href="event_8php.html#a2ac9f1b08de03250ecd794f705781d17">format_event_html()</a>, <a class="el" href="identity_8php.html#ad2c97627a313d53df1a1c7b4215ddb51">get_birthdays()</a>, <a class="el" href="identity_8php.html#ae381db3d43f8e7c1da8b15d14ecf5312">get_events()</a>, <a class="el" href="ping_8php.html#a77217b1b190b4c5d8770867b45f0c0a1">ping_init()</a>, and <a class="el" href="items_8php.html#ad2abb4644ff1f20fefbc80326fe01cf0">posted_dates()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a87a3cefc603302c78982f1d8e1245265"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">design_tools </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="widgets_8php.html#a145ff35319cfa47a9cc07f9425bd674b">widget_design_tools()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a0a1f7c0e97f9ecbebf3e5834582b014c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">dlogger </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$msg</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$level</em> = <code>0</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aa5148a0dfea2a1ca64c3d52f10aa2d64"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">escape_tags </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$string</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>use this on "body" or "content" input where angle chars shouldn't be removed, and allow them to be safely displayed. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype">string</td><td class="paramname">$string</td><td></td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>string </dd></dl>
+
+<p>Referenced by <a class="el" href="admin_8php.html#a1d1362698af14d209aa3a0fb655551dd">admin_page_logs()</a>, <a class="el" href="connect_8php.html#a417ec27afe33f21a929667a665e32ee2">connect_post()</a>, <a class="el" href="identity_8php.html#a345f4c943d84de502ec6e72d2c813945">create_identity()</a>, <a class="el" href="events_8php.html#ab3e8a8f901175f8e40a8089eea45c075">events_post()</a>, <a class="el" href="fsuggest_8php.html#a61ecfe10ce937ed526614f8fd3de3c7d">fsuggest_post()</a>, <a class="el" href="items_8php.html#a896c1809d58f2d7a42cfe14577958ddf">get_atom_elements()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">item_store()</a>, <a class="el" href="mail_8php.html#acfc2cc0bf4e0b178207758384977f25a">mail_post()</a>, <a class="el" href="items_8php.html#a77da7ce9a117601d49ac4a67c71b514f">mail_store()</a>, <a class="el" href="include_2menu_8php.html#add35fae5e9695031b3d46e30ac409eb8">menu_add_item()</a>, <a class="el" href="include_2menu_8php.html#a08a800821721781a8dfffbe31481ff98">menu_create()</a>, <a class="el" href="include_2menu_8php.html#a6a33c6a3db2a7510b16cc656edaec571">menu_edit()</a>, <a class="el" href="include_2menu_8php.html#acb66f80ca895a6ccd562b3d9ae7b41aa">menu_edit_item()</a>, <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>, <a class="el" href="notes_8php.html#a4dbd7b1f906440746af48b484d66535a">notes_init()</a>, <a class="el" href="dba__driver_8php.html#a55bf30d8176967e682656b5be4ad9249">printable()</a>, <a class="el" href="profiles_8php.html#ab0362c81b1d3b0b12a772b9fac446e04">profiles_post()</a>, <a class="el" href="thing_8php.html#a8be23b1d475ec3d9291999221c674c80">thing_init()</a>, and <a class="el" href="text_8php.html#a324c58f37f6acdf9cd1922aa76077d9f">z_input_filter()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ae4282a39492caa23ccbc2ce98e54f110"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">expand_acl </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a01e3cf44e082fa9bd06dcde5bf713d70">collect_recipients()</a>, <a class="el" href="items_8php.html#afbcf26dfcf8a83fff952aa858c1b7b67">enumerate_permissions()</a>, and <a class="el" href="lockview_8php.html#a851e26ab9a1008df5c5ebebea31e9b44">lockview_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a8d8c4a11e53461caca21181ebd72daca"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">feed_hublinks </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>return atom link elements for all of our hubs </p>
+
+</div>
+</div>
+<a class="anchor" id="a89929fa6f70a8ba54d5273fcf622b665"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">feed_salmonlinks </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$nick</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ace3c98538c63e09b70a363210b414112"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">find_xchan_in_array </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$xchan</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2message_8php.html#a5f8de9847e203329e317ac38dc646898">private_messages_fetch_conversation()</a>, <a class="el" href="include_2message_8php.html#a254a756031e4d5e94f85e2939bdb5091">private_messages_fetch_message()</a>, <a class="el" href="include_2message_8php.html#a652973ce47a262f2d238c2fd6233d97e">private_messages_list()</a>, <a class="el" href="text_8php.html#a543447c5ed766535221e2d9636b379ee">xchan_mail_query()</a>, and <a class="el" href="text_8php.html#a36a2e5d418ee81140f25c4233cfecd1f">xchan_query()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="afdc69fe3f6c09e35e46304dcea63ae28"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">fix_mce_lf </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="mail_8php.html#acfc2cc0bf4e0b178207758384977f25a">mail_post()</a>, and <a class="el" href="profiles_8php.html#ab0362c81b1d3b0b12a772b9fac446e04">profiles_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a3054189cff173977f4216c9a3dd29e1b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">format_categories </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$item</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$writeable</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="text_8php.html#ae4df74296fbe55051ed3c035e55205e5">prepare_body()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a4e4d42b0a805148d9f9a92bcac89bf91"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">format_filer </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$item</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="text_8php.html#ae4df74296fbe55051ed3c035e55205e5">prepare_body()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ae4f6881d7e13623f8eded6277595112a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">generate_user_guid </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a76d1b3435c067978d7b484c45f56472b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_mentions </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$tags</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a736db13a966b8abaf8c9198faa35911a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_mood_verbs </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="mood_8php.html#a721b9b6703b3234a005641c92d409b8f">mood_content()</a>, and <a class="el" href="mood_8php.html#a7ae136dd7476865b4828136175db5022">mood_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aac0969ae09853205992ba06ab9f9f61a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_plink </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$conversation_mode</em> = <code>true</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation()</a>, and <a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">Item\get_template_data()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa46f941155c2ac1155f2f17ffb0adb66"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_poke_verbs </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="poke_8php.html#ac9190563a8da9c07a16f9dcd71cf6993">poke_content()</a>, and <a class="el" href="poke_8php.html#a9725aab97b3983e6a98bd81c4efe7d3b">poke_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a3972701c5c83624ec4e2d06242f614e7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_rel_link </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$j</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$rel</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="conversation_8php.html#a9bd7f9fb6678736c581bcba3b17f471c">localize_item()</a>, <a class="el" href="zot_8php.html#aad25a3fe0e1566121d6fb8222979bc10">remove_community_tag()</a>, and <a class="el" href="items_8php.html#ab1bce4261bcf75ad62753b498a144d17">tag_deliver()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a4659fbc4e54ddc700c3aa66b9092c623"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_tags </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, and <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a138a3a611fa7f4f3630674145fc826bf"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">html2bb_video </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#a450d8732b7b608f7ac929aee61572b95">api_statuses_mediap()</a>, <a class="el" href="include_2api_8php.html#ad4d1634df6b35126552324683caaffa2">api_statuses_update()</a>, and <a class="el" href="items_8php.html#a896c1809d58f2d7a42cfe14577958ddf">get_atom_elements()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a436a8de00c942364c2d0fcfc7e1f4b5a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">ids_to_querystr </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$idx</em> = <code>'id'</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>, <a class="el" href="display_8php.html#a37137c98d47bf3306f4c2bb9f5b60de0">display_content()</a>, <a class="el" href="items_8php.html#a756738301f2ed96be50232500677d58a">items_fetch()</a>, <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>, and <a class="el" href="items_8php.html#a004e89d86b0f29b2c4da20108ecc4091">zot_feed()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a75c326298519ed14ebe762194c8a3f2a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">in_arrayi </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$needle</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$haystack</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="dirprofile_8php.html#a3e1d30d3d93863ff5615f2df4ac7f052">dirprofile_init()</a>, and <a class="el" href="zot_8php.html#aeec89da5b6ff090c63a79de4de884a35">import_directory_profile()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a1557112a774ec00fa06ed6b6f6495506"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">is_a_date_arg </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>, and <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa6b0aa8afbeab50d1a3058ad21acb74e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">item_message_id </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="event_8php.html#a89ef533faf345db8d64a58d4856bde3a">event_store()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="like_8php.html#a9d7dd268f21c21e9d29dd2aca2dd9538">like_content()</a>, <a class="el" href="mood_8php.html#a7ae136dd7476865b4828136175db5022">mood_init()</a>, <a class="el" href="include_2photos_8php.html#a6c40ef58aefef705a5adc84a40e97109">photo_upload()</a>, <a class="el" href="include_2photos_8php.html#ad648c0c5544fe9263409b6f6e57c6274">photos_create_item()</a>, <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>, <a class="el" href="items_8php.html#a410f9c743877c125ca06312373346903">post_activity_item()</a>, <a class="el" href="activities_8php.html#a80134e807719b3c54aba971958d2e132">profile_activity()</a>, and <a class="el" href="subthread_8php.html#a50368f3d825b77996030528e7fbfa3d3">subthread_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ac1dbf2e37e8069bea2c0f557fdbf203e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">item_post_type </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc">notification()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ae17b39d5e321debd3ad16dcbbde842b8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">jindent </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$json</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Indents a flat JSON string to make it more human-readable.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype">string</td><td class="paramname">$json</td><td>The original JSON string to process.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>string Indented version of the original JSON string. </dd></dl>
+
+</div>
+</div>
+<a class="anchor" id="a0271381208acfa2d4cff36da281e3e23"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">json_decode_plus </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="editpost_8php.html#a34011690864d122680c802e9e748ccfb">editpost_content()</a>, <a class="el" href="editwebpage_8php.html#a375e945255fad79a71036528f7480650">editwebpage_content()</a>, <a class="el" href="items_8php.html#a82955cc578f0fa600acec84475026194">encode_item()</a>, <a class="el" href="items_8php.html#a2d840c74ed23d1b6c7daee05cf89dda7">encode_mail()</a>, <a class="el" href="conversation_8php.html#a9bd7f9fb6678736c581bcba3b17f471c">localize_item()</a>, <a class="el" href="include_2message_8php.html#a5f8de9847e203329e317ac38dc646898">private_messages_fetch_conversation()</a>, <a class="el" href="include_2message_8php.html#a254a756031e4d5e94f85e2939bdb5091">private_messages_fetch_message()</a>, <a class="el" href="include_2message_8php.html#a652973ce47a262f2d238c2fd6233d97e">private_messages_list()</a>, <a class="el" href="zot_8php.html#aad25a3fe0e1566121d6fb8222979bc10">remove_community_tag()</a>, <a class="el" href="items_8php.html#ab1bce4261bcf75ad62753b498a144d17">tag_deliver()</a>, <a class="el" href="text_8php.html#af9c9ac3f74c82dc60acfa404d0e9dc53">theme_attachments()</a>, and <a class="el" href="text_8php.html#a8264348059abd1d4d5bb521323d3b19a">unobscure()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a71f6952243d3fe1c5a8154f78027e29c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">lang_selector </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="nav_8php.html#a43be0df73b90647ea70947ce004e231e">nav()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a3999a0b3e22e440f280ee791ce34d384"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">layout_select </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel_id</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$current</em> = <code>''</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="editwebpage_8php.html#a375e945255fad79a71036528f7480650">editwebpage_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a2690ad67bb6fb97ef69de3e8d23f2728"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">legal_webbie </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="text_8php.html#a0c65597bb4aed3a039eb795ff540e5e3">check_webbie()</a>, and <a class="el" href="new__channel_8php.html#a1ad7f99e4366a32942c6b954aba3a164">new_channel_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a47c1e4a5f3f53027daacd8a9db24f285"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">link_compare </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$b</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Compare two URLs to see if they are the same, but ignore slight but hopefully insignificant differences such as if one is https and the other isn't, or if one is www.something and the other isn't - and also ignore case differences.</p>
+<p>Return true if the URLs match, otherwise false. </p>
+
+<p>Referenced by <a class="el" href="items_8php.html#a8794863cdf8ce1333040933d3a3f66bd">consume_feed()</a>, <a class="el" href="conversation_8php.html#afe5b2f38d8b803edb0d7ec5fa2868db0">like_puller()</a>, <a class="el" href="items_8php.html#ab1bce4261bcf75ad62753b498a144d17">tag_deliver()</a>, <a class="el" href="items_8php.html#a88c6cf7649ac836fbbed82a7a0315110">tgroup_check()</a>, and <a class="el" href="identity_8php.html#a5b815330f3d177ab383af37a6c12e532">zid()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a11255c8c4e5245b6c24f97684826aa54"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">linkify </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Function: linkify</p>
+<p>Replace naked text hyperlink with HTML formatted hyperlink </p>
+
+<p>Referenced by <a class="el" href="identity_8php.html#aa870d2c1f558cfd52bef05bc124e8fa4">advanced_profile()</a>, <a class="el" href="dirprofile_8php.html#a3e1d30d3d93863ff5615f2df4ac7f052">dirprofile_init()</a>, and <a class="el" href="activities_8php.html#a80134e807719b3c54aba971958d2e132">profile_activity()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a030fa5ecc64168af0c4f44897a9bce63"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">logger </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$msg</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$level</em> = <code>0</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classRedDirectory.html#a1e35e3cd31d2a15250655e4cafdea180">RedDirectory\__construct()</a>, <a class="el" href="classRedFile.html#a9a67bdb34c9db6ce144b3f371148b183">RedFile\__construct()</a>, <a class="el" href="Contact_8php.html#a6e64de7db60b7243dce45fb6347636ff">account_remove()</a>, <a class="el" href="auth_8php.html#a07bae0e623e2daa9ee2cd5a8aa294dee">account_verify_password()</a>, <a class="el" href="classItem.html#a80dcd9d0f548c3ad550abe7e6981fb51">Item\add_child()</a>, <a class="el" href="classConversation.html#a8335cdd43f1836e3c255638e61a09e16">Conversation\add_thread()</a>, <a class="el" href="identity_8php.html#aa870d2c1f558cfd52bef05bc124e8fa4">advanced_profile()</a>, <a class="el" href="crypto_8php.html#a2148d7aac7b30c720f7ebda7e9790286">aes_encapsulate()</a>, <a class="el" href="zot_8php.html#a703f528ade8382cf374e4119bd6f7859">allowed_public_recips()</a>, <a class="el" href="include_2api_8php.html#a176c448d79c211ad41c2bbe3124658f5">api_call()</a>, <a class="el" href="include_2api_8php.html#a72bfecac1970bc29b853073e816388ff">api_channel_stream()</a>, <a class="el" href="include_2api_8php.html#adfc035ee6303c1d8ba5336a4ead2bd53">api_export_basic()</a>, <a class="el" href="include_2api_8php.html#a2c71b1226ef1283b5370bd1c200fee5f">api_favorites()</a>, <a class="el" href="include_2api_8php.html#aa40bae797bcd9ccacffdce5a3b5a1afa">api_get_user()</a>, <a class="el" href="include_2api_8php.html#afe534f826e4282b72d66e8cadca7bb73">api_login()</a>, <a class="el" href="include_2api_8php.html#aa1bddb580510e70cc1a7b7381667f1a3">api_oauth_request_token()</a>, <a class="el" href="include_2api_8php.html#ad4c29f43418f6110f85a6b3998239ab4">api_statuses_destroy()</a>, <a class="el" href="include_2api_8php.html#a450d8732b7b608f7ac929aee61572b95">api_statuses_mediap()</a>, <a class="el" href="include_2api_8php.html#ae0fa388479cace9c5a7a45b571ab42f8">api_statuses_repeat()</a>, <a class="el" href="include_2api_8php.html#af6f1d89cdb0a0621025efbec1597bc63">api_statuses_show()</a>, <a class="el" href="include_2api_8php.html#ad4d1634df6b35126552324683caaffa2">api_statuses_update()</a>, <a class="el" href="include_2api_8php.html#a32f0dda848d0c11c727fe1c3e741c283">api_statuses_user_timeline()</a>, <a class="el" href="include_2attach_8php.html#ab6830b3ab74a5d284876141ac80f6cbc">attach_mkdir()</a>, <a class="el" href="security_8php.html#adc7bf51e3b8d67bd80e9348f9ab03733">authenticate_success()</a>, <a class="el" href="include_2network_8php.html#ab07ce9d75eae559865ed90aad2154bd7">avatar_img()</a>, <a class="el" href="text_8php.html#a13286f8a95d2de6b102966ecc270c8d6">base64url_decode()</a>, <a class="el" href="blogga_2view_2theme_2blog_2theme_8php.html#aae58cc837fe56473d9f3370abfe533ae">blog_install()</a>, <a class="el" href="blogga_2view_2theme_2blog_2theme_8php.html#a3e77dbe111f330c64a1ff6c741cd515c">blog_uninstall()</a>, <a class="el" href="zot_8php.html#ac34e479d27f32b82dd6b33542f81a6a7">build_sync_packet()</a>, <a class="el" href="include_2chanman_8php.html#a21ba9a5c961e866ff27aee3ee67bf99b">chanman_remove_everything_from_network()</a>, <a class="el" href="Contact_8php.html#a186162051a5127069cc851d78740f205">channel_remove()</a>, <a class="el" href="chanview_8php.html#a4192c6da888c8c1165851acf9ad4cb8b">chanview_content()</a>, <a class="el" href="boot_8php.html#a4c02d88e66852a01bd5a1feecb7c3ce3">check_config()</a>, <a class="el" href="security_8php.html#a444ac867dfa8c37cf0a7a226412bee28">check_form_security_token_ForbiddenOnErr()</a>, <a class="el" href="security_8php.html#a77ba0d1889a39cf32434c5ce96fe1433">check_form_security_token_redirectOnErr()</a>, <a class="el" href="classRedDirectory.html#a5e3fc08b2bf9f61cea4d2ccae0495bec">RedDirectory\childExists()</a>, <a class="el" href="items_8php.html#a8794863cdf8ce1333040933d3a3f66bd">consume_feed()</a>, <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation()</a>, <a class="el" href="account_8php.html#a141fe579c351c78209d425473f978eb5">create_account()</a>, <a class="el" href="identity_8php.html#a345f4c943d84de502ec6e72d2c813945">create_identity()</a>, <a class="el" href="classRedDirectory.html#a986936910f0216887a25e28916c166c7">RedDirectory\createDirectory()</a>, <a class="el" href="classRedDirectory.html#a2d12d99d38a6a75fc9a830b2f7fc0bf0">RedDirectory\createFile()</a>, <a class="el" href="cronhooks_8php.html#a4c4c1bbec4ecc9a0efa00dd6afd2c0ca">cronhooks_run()</a>, <a class="el" href="datetime_8php.html#ad6301e74b0f9267d52f8d432b5beb226">datetime_convert()</a>, <a class="el" href="zot_8php.html#adfeb9400ae6b726beec89f8f1e8fde72">delete_imported_item()</a>, <a class="el" href="deliver_8php.html#a397afcb9afecf0c1816b0951189dd346">deliver_run()</a>, <a class="el" href="language_8php.html#a632da17c7ac0d2dc1a00a4706870194b">detect_language()</a>, <a class="el" href="mod_2directory_8php.html#aac79396570d759da2efac24fcedf5b44">directory_content()</a>, <a class="el" href="include_2directory_8php.html#aa75d3b0697ca1456aaabdb37a74aa0f0">directory_run()</a>, <a class="el" href="dirprofile_8php.html#a3e1d30d3d93863ff5615f2df4ac7f052">dirprofile_init()</a>, <a class="el" href="include_2network_8php.html#a1ff07d9fad93b713b93da0ab77aab7f0">email_send()</a>, <a class="el" href="items_8php.html#a82955cc578f0fa600acec84475026194">encode_item()</a>, <a class="el" href="expire_8php.html#a444e45c9b67727b27db4c779fd51a298">expire_run()</a>, <a class="el" href="feed_8php.html#af86137700b56f33d1d5f25c8dec22c04">feed_init()</a>, <a class="el" href="include_2network_8php.html#a8d5a3afb51cc932032b5dcc159efaae0">fetch_lrdd_template()</a>, <a class="el" href="filer_8php.html#a5fd5d7e61b2f9c43cb5f110c89dc4274">filer_content()</a>, <a class="el" href="filerm_8php.html#ae2eb28d2054fa2c37e38689882172208">filerm_content()</a>, <a class="el" href="items_8php.html#aba98fcbbcd7044a7e9ea34edabc14c87">fix_private_photos()</a>, <a class="el" href="boot_8php.html#aca5e42678e178c6b9034610d66666fd7">fix_system_urls()</a>, <a class="el" href="classRedFile.html#a7c868dfcef6c70cd0e24cf3caa2c3535">RedFile\get()</a>, <a class="el" href="items_8php.html#a896c1809d58f2d7a42cfe14577958ddf">get_atom_elements()</a>, <a class="el" href="items_8php.html#a536d0313b6ffe33b9d2490c4e25c5361">get_item_elements()</a>, <a class="el" href="classConversation.html#a2a96b7a6573ae53db861624659e831cb">Conversation\get_template_data()</a>, <a class="el" href="classRedDirectory.html#aaa20f0f44da23781917af8170c0a2569">RedDirectory\getChild()</a>, <a class="el" href="classRedDirectory.html#a70173d4458572d95e586b2037d2fd2f4">RedDirectory\getDir()</a>, <a class="el" href="classRedDirectory.html#af6e4475dbd5abcdede00d20b8d388583">RedDirectory\getName()</a>, <a class="el" href="classRedFile.html#a0c961c5f49544d2502420361fa526437">RedFile\getName()</a>, <a class="el" href="mod_2group_8php.html#a07a64f6c65b0080d8190b3d9728a7a83">group_content()</a>, <a class="el" href="photo__driver_8php.html#a243cee492ce443afb6a7d77d54b6c4aa">guess_image_type()</a>, <a class="el" href="boot_8php.html#a0e4701c9742c3ef88f02ac450a042a84">head_set_icon()</a>, <a class="el" href="include_2network_8php.html#a4cfb2c05a1c295317283d762440ce0b2">http_status_exit()</a>, <a class="el" href="zot_8php.html#ad149f1e98c0c5b88ff9147e6ee3f330d">import_author_zot()</a>, <a class="el" href="photo__driver_8php.html#a1d0bc7161dec0d177b7d3bbe4421af9a">import_channel_photo()</a>, <a class="el" href="zot_8php.html#aeec89da5b6ff090c63a79de4de884a35">import_directory_profile()</a>, <a class="el" href="import_8php.html#af17fef0410518f7eac205d0ea416eaa2">import_post()</a>, <a class="el" href="photo__driver_8php.html#a78f5a10c568d2a9bbbb129dc96548887">import_profile_photo()</a>, <a class="el" href="zot_8php.html#a2657e141d62d5f67ad3c87651b585299">import_site()</a>, <a class="el" href="zot_8php.html#a56f3f65514e4e7f0cd117d01735aebd1">import_xchan()</a>, <a class="el" href="plugin_8php.html#a482131013272a1d5d5c1b1469c6c55d5">install_plugin()</a>, <a class="el" href="items_8php.html#a6f7e1334af5d684a987fa6a3eb37f4cc">item_expire()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">item_store()</a>, <a class="el" href="items_8php.html#acf0bf7c9d21ac84f32effb754f7ad484">item_store_update()</a>, <a class="el" href="like_8php.html#a9d7dd268f21c21e9d29dd2aca2dd9538">like_content()</a>, <a class="el" href="items_8php.html#af94c281016c6c912d06e064113336c5c">limit_body_size()</a>, <a class="el" href="plugin_8php.html#a9ca9632b7309a65b05c03a3e2f473a3d">load_plugin()</a>, <a class="el" href="conversation_8php.html#a9bd7f9fb6678736c581bcba3b17f471c">localize_item()</a>, <a class="el" href="classFKOAuth1.html#a2b1dac2ed31fc6ef84668afdda8b263f">FKOAuth1\loginUser()</a>, <a class="el" href="classFKOAuthDataStore.html#a1148d47b546350bf440bdd92792c5df1">FKOAuthDataStore\lookup_consumer()</a>, <a class="el" href="classFKOAuthDataStore.html#a96f76387c3a93b0abe27a98013804bab">FKOAuthDataStore\lookup_token()</a>, <a class="el" href="magic_8php.html#acea2cc792849ca2d71d4b689f66518bf">magic_init()</a>, <a class="el" href="mail_8php.html#acfc2cc0bf4e0b178207758384977f25a">mail_post()</a>, <a class="el" href="items_8php.html#a77da7ce9a117601d49ac4a67c71b514f">mail_store()</a>, <a class="el" href="include_2menu_8php.html#a6a33c6a3db2a7510b16cc656edaec571">menu_edit()</a>, <a class="el" href="include_2group_8php.html#ab0e422a0f31c0c64fd9084ca03d85f32">mini_group_select()</a>, <a class="el" href="mood_8php.html#a7ae136dd7476865b4828136175db5022">mood_init()</a>, <a class="el" href="classFKOAuthDataStore.html#a434882f03e3cdb171ed89e09e337e934">FKOAuthDataStore\new_access_token()</a>, <a class="el" href="include_2follow_8php.html#ae387d4ae097c23d69f3247e7f08140c7">new_contact()</a>, <a class="el" href="crypto_8php.html#aae0ab70d6a199b29555b1ac3cf250d6a">new_keypair()</a>, <a class="el" href="classFKOAuthDataStore.html#a431b44d70e3da6a8256ab38f710e3050">FKOAuthDataStore\new_request_token()</a>, <a class="el" href="notes_8php.html#a4dbd7b1f906440746af48b484d66535a">notes_init()</a>, <a class="el" href="enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc">notification()</a>, <a class="el" href="notifier_8php.html#a568c502f626cff95e344c0748938b85d">notifier_run()</a>, <a class="el" href="onedirsync_8php.html#a411aedd47c57476099647961e6a86691">onedirsync_run()</a>, <a class="el" href="onepoll_8php.html#a72753b2fdec79b37c7f432035c91fb6d">onepoll_run()</a>, <a class="el" href="parse__url_8php.html#a05a9e8944380ba3cf6bbf5893dd4b74b">parse_url_content()</a>, <a class="el" href="include_2network_8php.html#a27a951b59d8d622c0b3e7b0673ba74c6">parse_xml_string()</a>, <a class="el" href="photo_8php.html#a582779d24882b0d31ee909a91d70a448">photo_init()</a>, <a class="el" href="include_2photos_8php.html#a6c40ef58aefef705a5adc84a40e97109">photo_upload()</a>, <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>, <a class="el" href="ping_8php.html#a77217b1b190b4c5d8770867b45f0c0a1">ping_init()</a>, <a class="el" href="poco_8php.html#a53def16f75e3d41f1d2bb7cfa4905498">poco_init()</a>, <a class="el" href="socgraph_8php.html#a5ef8bef37161df53718a21e93d02fbd6">poco_load()</a>, <a class="el" href="poke_8php.html#a9725aab97b3983e6a98bd81c4efe7d3b">poke_init()</a>, <a class="el" href="poller_8php.html#a5f12df3a4738124b6c039971e87e76da">poller_run()</a>, <a class="el" href="items_8php.html#a410f9c743877c125ca06312373346903">post_activity_item()</a>, <a class="el" href="post_8php.html#af4b48181ce773ef0cdfc972441445c34">post_init()</a>, <a class="el" href="post_8php.html#af59e6a1dc22d19d9257b01cd7ccedb75">post_post()</a>, <a class="el" href="include_2message_8php.html#a652973ce47a262f2d238c2fd6233d97e">private_messages_list()</a>, <a class="el" href="zot_8php.html#ac301c67864917c35922257950ae0f95c">process_channel_sync_delivery()</a>, <a class="el" href="zot_8php.html#a37ec13b18057634eadb071f05297f5e1">process_delivery()</a>, <a class="el" href="zot_8php.html#aa6ae96db8cbbdbb10e6876d206bbf7cc">process_mail_delivery()</a>, <a class="el" href="zot_8php.html#a9a57b40669351c9791126b925cb7ef3b">process_profile_delivery()</a>, <a class="el" href="identity_8php.html#a4751b522ea913d0e7ed43e03d22e9e68">profile_load()</a>, <a class="el" href="zot_8php.html#a083aec6c900d244e1bfc1406f9461465">public_recips()</a>, <a class="el" href="classRedFile.html#a41a49a583eb276b75626fcf97f4a699c">RedFile\put()</a>, <a class="el" href="classdba__mysql.html#ac3fd60c278f400907322dac578754a99">dba_mysql\q()</a>, <a class="el" href="classdba__mysqli.html#a611c4de8d6d7512dffb83a38bb6701ec">dba_mysqli\q()</a>, <a class="el" href="dba__driver_8php.html#a2c09a731d3b4fef41fed0e83db01be1f">q()</a>, <a class="el" href="queue_8php.html#af8c93de86d866c3200174c8450a0f341">queue_run()</a>, <a class="el" href="reddav_8php.html#a5df0d09893f2e65dc5cf6bbab6cfb266">RedCollectionData()</a>, <a class="el" href="reddav_8php.html#a9f531641dfb4e43cd88ac1a9ae7e2088">RedFileData()</a>, <a class="el" href="register_8php.html#a0e91f57f111407ea8d3223a05022bb2a">register_content()</a>, <a class="el" href="plugin_8php.html#af9ac19004dca49adae1ac7a0d9f3b025">reload_plugins()</a>, <a class="el" href="classItem.html#a2ce70ef63f9f4d86a09c351678806925">Item\remove_child()</a>, <a class="el" href="zot_8php.html#aad25a3fe0e1566121d6fb8222979bc10">remove_community_tag()</a>, <a class="el" href="queue__fn_8php.html#a8fe71e981399bbf5d000a6ca42f57b24">remove_queue_item()</a>, <a class="el" href="include_2network_8php.html#ae8d9c41a11000fb8667039fc71b4f73f">scale_external_images()</a>, <a class="el" href="search__ac_8php.html#a14f90c83a3f2be095e9e2992a8d66138">search_ac_init()</a>, <a class="el" href="classenotify.html#afbc088860f534c6c05788b48cfc262c6">enotify\send()</a>, <a class="el" href="account_8php.html#a014de2d5d5c9785de5bf547a485822fa">send_reg_approval_email()</a>, <a class="el" href="classConversation.html#a66f121ca4026246f86a732e5faa0682c">Conversation\set_mode()</a>, <a class="el" href="classRedFile.html#a38a82bfc1b30028ea6ac75923e90fa25">RedFile\setName()</a>, <a class="el" href="security_8php.html#ae92c5c1a1cbbc49ddbb8b3265d2db809">stream_perms_api_uids()</a>, <a class="el" href="security_8php.html#a15e0f8f511cc06192db63387f97238b3">stream_perms_xchans()</a>, <a class="el" href="subthread_8php.html#a50368f3d825b77996030528e7fbfa3d3">subthread_content()</a>, <a class="el" href="dir__fns_8php.html#aa666e7df6ca8c332f4081c9b66b4bdf6">sync_directories()</a>, <a class="el" href="dir__fns_8php.html#a6cae22cfdd6edda5ddf09e07abb3242a">syncdirs()</a>, <a class="el" href="items_8php.html#ab1bce4261bcf75ad62753b498a144d17">tag_deliver()</a>, <a class="el" href="tagger_8php.html#a0e4a3eb177d1684553c547503d67161c">tagger_content()</a>, <a class="el" href="items_8php.html#a88c6cf7649ac836fbbed82a7a0315110">tgroup_check()</a>, <a class="el" href="plugin_8php.html#a093a9cb98f51e3643634bd8bc6ed6e76">uninstall_plugin()</a>, <a class="el" href="plugin_8php.html#a90538627db68605aeb6db17a8ead6523">unload_plugin()</a>, <a class="el" href="dir__fns_8php.html#a44062d4b471d1e83f92f6c184585aa13">update_directory_entry()</a>, <a class="el" href="zot_8php.html#a31aad56acf8ff8f2353e6ff8595544df">update_imported_item()</a>, <a class="el" href="queue__fn_8php.html#a4c2876181f75a4a61e85b7f00dfdbba1">update_queue_time()</a>, <a class="el" href="classRedBasicAuth.html#a8dfd9a0953f8884723b421b7c1acf79b">RedBasicAuth\validateUserPass()</a>, <a class="el" href="include_2network_8php.html#a8122356933bcd6b0a8567e8e15ae5cc5">webfinger()</a>, <a class="el" href="include_2network_8php.html#adf6008b38c555e98e7ed10da9ede2335">webfinger_dfrn()</a>, <a class="el" href="include_2network_8php.html#a99353baabbc3e0584b85eb79ee802cff">xml2array()</a>, <a class="el" href="include_2network_8php.html#a9e9da2aafb806c98ecdc318604e60dc6">xml_status()</a>, <a class="el" href="include_2network_8php.html#aafd06c0a75402aefb06cfb9f9740fa37">z_fetch_url()</a>, <a class="el" href="include_2network_8php.html#a9129fd55e7fc175b4ea9a195cccc16bc">z_post_url()</a>, <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>, <a class="el" href="identity_8php.html#a680fbafc2db023c5b1309e0180e81315">zid_init()</a>, <a class="el" href="zot_8php.html#a3862b3161b2c8557dc1a95020179bd81">zot_build_packet()</a>, <a class="el" href="items_8php.html#a004e89d86b0f29b2c4da20108ecc4091">zot_feed()</a>, <a class="el" href="zot_8php.html#a61cdc1ec843663c423ed2d8160ae5aea">zot_fetch()</a>, <a class="el" href="zot_8php.html#a95528377d7303131958c9f0b7158fdce">zot_finger()</a>, <a class="el" href="zot_8php.html#a55056e863a7860bc0cf922e78fcce073">zot_gethub()</a>, <a class="el" href="zot_8php.html#aeea071f17e306fe3d0c488551906bfab">zot_import()</a>, <a class="el" href="zot_8php.html#a928f5643ca66ae9635d85aeb2be62e03">zot_process_response()</a>, <a class="el" href="zot_8php.html#a7b23bfb31d4491231e1e73bdc077240d">zot_refresh()</a>, <a class="el" href="zot_8php.html#a5bcdfef419b16075a0eca990956223dc">zot_register_hub()</a>, and <a class="el" href="zotfeed_8php.html#a24dfc23d366e7f840cf2847d0c1c8eac">zotfeed_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a1e510c53624933ce9b7d6715784894db"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">magic_link </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a24d441d30df4b8e6bf6780bf62a5e2c6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">magiclink_url </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$observer</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$myaddr</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$url</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="conversation_8php.html#adda79b75bf1ccf6ce9503aa310953533">item_redir_and_replace_images()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a2a902f5fdba8646333e997898ac45ea3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">micropro </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$contact</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$redirect</em> = <code>false</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$class</em> = <code>''</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$textmode</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="text_8php.html#ad6432621d0fafcbcf3d3b9b49bef7784">contact_block()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a1633412120f52bdce5f43e0a127d9293"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">mimetype_select </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel_id</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$current</em> = <code>'text/<a class="el" href="bbcode_8php.html#a009f61aaf78771737ed0765c8463911b">bbcode</a>'</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="editblock_8php.html#abbe8f55de06967bc8d79d620509a49e6">editblock_content()</a>, and <a class="el" href="editwebpage_8php.html#a375e945255fad79a71036528f7480650">editwebpage_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a4bbb7d00c05cd20b4e043424f322388f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">normalise_link </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$url</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="conversation_8php.html#ad470fc7766f0db66d138fa1916c7a8b7">best_link_url()</a>, <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation()</a>, <a class="el" href="delegate_8php.html#a943eea8996ef348eb845c498f9f354dd">delegate_content()</a>, <a class="el" href="conversation_8php.html#aacbb12d372d5e9c3ab0735b4aea48fb3">item_photo_menu()</a>, <a class="el" href="text_8php.html#a47c1e4a5f3f53027daacd8a9db24f285">link_compare()</a>, <a class="el" href="items_8php.html#ab1bce4261bcf75ad62753b498a144d17">tag_deliver()</a>, and <a class="el" href="items_8php.html#a88c6cf7649ac836fbbed82a7a0315110">tgroup_check()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="adba17ec946f4285285dc100f7860bf51"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">normalise_openid </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a1af49756c8c71902a66c7e329c462beb"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">notags </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$string</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>This is our primary input filter.</p>
+<p>The high bit hack only involved some old IE browser, forget which (IE5/Mac?) that had an XSS attack vector due to stripping the high-bit on an 8-bit character after cleansing, and angle chars with the high bit set could get through as markup.</p>
+<p>This is now disabled because it was interfering with some legitimate unicode sequences and hopefully there aren't a lot of those browsers left.</p>
+<p>Use this on any text input where angle chars are not valid or permitted They will be replaced with safer brackets. This may be filtered further if these are not allowed either.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype">string</td><td class="paramname">$string</td><td>Input string </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>string Filtered string </dd></dl>
+
+<p>Referenced by <a class="el" href="admin_8php.html#a233b7c8c31776b7020532003c6e44e1c">admin_page_logs_post()</a>, <a class="el" href="admin_8php.html#add865f4ae806ecbf716f423fc3e50e4f">admin_page_site_post()</a>, <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>, <a class="el" href="community_8php.html#a1197aafd6a6b540dbb4a0c04ade3a25a">community_content()</a>, <a class="el" href="connections_8php.html#aec2e457420fce3e3bf6a9f48e36df25c">connections_content()</a>, <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation()</a>, <a class="el" href="account_8php.html#a141fe579c351c78209d425473f978eb5">create_account()</a>, <a class="el" href="mod_2directory_8php.html#aac79396570d759da2efac24fcedf5b44">directory_content()</a>, <a class="el" href="filestorage_8php.html#ad3b64e3ece9831f9d3a9f00c0ae983cd">filestorage_post()</a>, <a class="el" href="mod_2follow_8php.html#a171f5b19f50d7738adc3b2e96ec6018a">follow_init()</a>, <a class="el" href="items_8php.html#a896c1809d58f2d7a42cfe14577958ddf">get_atom_elements()</a>, <a class="el" href="mod_2group_8php.html#aed1f009b1221348021bb34761160ef35">group_post()</a>, <a class="el" href="help_8php.html#af055e15f600ffa6fbca9386fdf715224">help_content()</a>, <a class="el" href="invite_8php.html#aeb0881c0f93c8e8552e5ed756ce6e5a5">invite_post()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">item_store()</a>, <a class="el" href="items_8php.html#acf0bf7c9d21ac84f32effb754f7ad484">item_store_update()</a>, <a class="el" href="like_8php.html#a9d7dd268f21c21e9d29dd2aca2dd9538">like_content()</a>, <a class="el" href="lostpass_8php.html#a8ed35ba71a4404eaf4903da61d0321cc">lostpass_post()</a>, <a class="el" href="mail_8php.html#acfc2cc0bf4e0b178207758384977f25a">mail_post()</a>, <a class="el" href="items_8php.html#a77da7ce9a117601d49ac4a67c71b514f">mail_store()</a>, <a class="el" href="mood_8php.html#a7ae136dd7476865b4828136175db5022">mood_init()</a>, <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>, <a class="el" href="oexchange_8php.html#a2d8b785cd7d041a4e6274f5af370cf26">oexchange_content()</a>, <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>, <a class="el" href="poco_8php.html#a53def16f75e3d41f1d2bb7cfa4905498">poco_init()</a>, <a class="el" href="poke_8php.html#a9725aab97b3983e6a98bd81c4efe7d3b">poke_init()</a>, <a class="el" href="profiles_8php.html#ab0362c81b1d3b0b12a772b9fac446e04">profiles_post()</a>, <a class="el" href="register_8php.html#a51731dcc1917c58a790eb1c0f6132271">register_post()</a>, <a class="el" href="text_8php.html#a9fbeae13c9abd6e27cb4d8d1817f969c">sanitise_acl()</a>, <a class="el" href="settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586">settings_post()</a>, <a class="el" href="setup_8php.html#a88247384a96e14516f474d7af6a465c1">setup_content()</a>, <a class="el" href="setup_8php.html#a13cf286774149a0a7bd8adb8179cec75">setup_post()</a>, <a class="el" href="subthread_8php.html#a50368f3d825b77996030528e7fbfa3d3">subthread_content()</a>, <a class="el" href="tagger_8php.html#a0e4a3eb177d1684553c547503d67161c">tagger_content()</a>, and <a class="el" href="xrd_8php.html#aee3cf087968e4a0ff3a87de16eb23270">xrd_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="afe9f178d264d44a94dc1292aaf0fd585"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="redbasic_2php_2style_8php.html#a883f9f14e205f7aa7de02c14df67b40a">if</a> (!function_exists('hex2bin')) paginate </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="admin_8php.html#a62f10f90c47686c9c3c37c4c03a108d2">admin_page_users()</a>, <a class="el" href="community_8php.html#a1197aafd6a6b540dbb4a0c04ade3a25a">community_content()</a>, <a class="el" href="connections_8php.html#aec2e457420fce3e3bf6a9f48e36df25c">connections_content()</a>, <a class="el" href="match_8php.html#a1dd853e959b9e70c1911bb2fb5f5130d">match_content()</a>, <a class="el" href="mod_2photos_8php.html#aa87382611a66ec5effdb2d78f13f5812">photos_content()</a>, and <a class="el" href="viewconnections_8php.html#ab6c4d983e97b3a8a879567ff76507776">viewconnections_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a98fd99dee3da8cf4c148dc04efe782ee"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">perms2str </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$p</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="events_8php.html#ab3e8a8f901175f8e40a8089eea45c075">events_post()</a>, <a class="el" href="filestorage_8php.html#ad3b64e3ece9831f9d3a9f00c0ae983cd">filestorage_post()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="include_2menu_8php.html#add35fae5e9695031b3d46e30ac409eb8">menu_add_item()</a>, <a class="el" href="include_2menu_8php.html#acb66f80ca895a6ccd562b3d9ae7b41aa">menu_edit_item()</a>, <a class="el" href="include_2photos_8php.html#a6c40ef58aefef705a5adc84a40e97109">photo_upload()</a>, <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>, and <a class="el" href="settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586">settings_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa5528f41533927e1bd2da3618a74a6d7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_new_resource </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="photo__driver_8php.html#a1d0bc7161dec0d177b7d3bbe4421af9a">import_channel_photo()</a>, <a class="el" href="photo__driver_8php.html#a78f5a10c568d2a9bbbb129dc96548887">import_profile_photo()</a>, and <a class="el" href="include_2photos_8php.html#a6c40ef58aefef705a5adc84a40e97109">photo_upload()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ac19d2b33a58372a357a43d51eed19162"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">preg_heart </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$x</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ae4df74296fbe55051ed3c035e55205e5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">prepare_body </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$item</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$attach</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation()</a>, <a class="el" href="include_2network_8php.html#a1ff07d9fad93b713b93da0ab77aab7f0">email_send()</a>, and <a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">Item\get_template_data()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="afe54312607d92f7ce9593f5760831f80"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">prepare_text </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$text</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$content_type</em> = <code>'text/<a class="el" href="bbcode_8php.html#a009f61aaf78771737ed0765c8463911b">bbcode</a>'</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="identity_8php.html#aa870d2c1f558cfd52bef05bc124e8fa4">advanced_profile()</a>, <a class="el" href="include_2api_8php.html#a4c6fb9fb5203aa60f4b3afd4521db8ea">api_format_items()</a>, <a class="el" href="include_2api_8php.html#ae82608c317421f27446465aa6724733d">api_format_messages()</a>, <a class="el" href="include_2api_8php.html#a645397787618b5c548a31e8686e8cca4">api_status_show()</a>, <a class="el" href="include_2api_8php.html#abe8e929e93f7ab134b1cb1fb30f19a76">api_users_show()</a>, <a class="el" href="items_8php.html#a275108c050f7eb18bcbb5018e6b81cf6">atom_entry()</a>, <a class="el" href="items_8php.html#a87ac9e359591721a824ecd23bbb56296">check_item_source()</a>, <a class="el" href="comanche_8php.html#a5a7ab801717d38e91ac910b933973887">comanche_block()</a>, <a class="el" href="connect_8php.html#a489f0a66c660de6ec4d6917b27674f07">connect_content()</a>, and <a class="el" href="text_8php.html#ae4df74296fbe55051ed3c035e55205e5">prepare_body()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a8b0a799341b1fc4cba2c3ede3e3fc9b6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">profiler </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$t1</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$t2</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$label</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation()</a>, and <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a4e7698aca48982512594b274543c3b9b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">protect_sprintf </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="acl_8php.html#ac6776dba871806ecdb5d1659bc2eb07a">acl_init()</a>, <a class="el" href="include_2api_8php.html#a8b25a186bd0893f51aa72a62f655735e">api_statuses_mentions()</a>, <a class="el" href="include_2attach_8php.html#a887d2d44a3ef18dcb6624e7fb58dc8e3">attach_count_files()</a>, <a class="el" href="include_2attach_8php.html#a3634af95f11a023dd8e882c3c7a3600d">attach_list_files()</a>, <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>, <a class="el" href="connections_8php.html#aec2e457420fce3e3bf6a9f48e36df25c">connections_content()</a>, <a class="el" href="dirsearch_8php.html#aa1fb04e1de4f25b63349ac78f94ceb4c">dirsearch_content()</a>, <a class="el" href="taxonomy_8php.html#a163b5131f388080b0fc82398d3a32fe1">file_tag_file_query()</a>, <a class="el" href="security_8php.html#a9355488460ab11d6058656ff919e5cf9">item_permissions_sql()</a>, <a class="el" href="items_8php.html#a756738301f2ed96be50232500677d58a">items_fetch()</a>, <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>, <a class="el" href="security_8php.html#afa683bc025a1d2fe9065e2f6cd71a22f">permissions_sql()</a>, <a class="el" href="include_2photos_8php.html#aa27b9e435dcc34e1009f56dc02c7ca51">photos_list_photos()</a>, <a class="el" href="security_8php.html#ab3bdd30dc60d9ee72370b866aa4a2d01">public_permissions_sql()</a>, <a class="el" href="search__ac_8php.html#a14f90c83a3f2be095e9e2992a8d66138">search_ac_init()</a>, <a class="el" href="search_8php.html#ab2568591359edde5b483a6cd9a24b2cc">search_content()</a>, and <a class="el" href="taxonomy_8php.html#a7a913d19c77610da689be48fbbf6734c">term_query()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a4841df5beabdd1bdd1ed56781a915d61"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">purify_html </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a896c1809d58f2d7a42cfe14577958ddf">get_atom_elements()</a>, and <a class="el" href="text_8php.html#a324c58f37f6acdf9cd1922aa76077d9f">z_input_filter()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="afc998d2796a6b2a08e96f7cc061e7221"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">qp </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a9d6a5ee1290de7a8b483fe78585daade"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">random_string </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$size</em> = <code>64</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em> = <code><a class="el" href="text_8php.html#aad557c054cf2ed915633701018fc7e3f">RANDOM_STRING_HEX</a></code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="crypto_8php.html#a2148d7aac7b30c720f7ebda7e9790286">aes_encapsulate()</a>, <a class="el" href="include_2attach_8php.html#ab6830b3ab74a5d284876141ac80f6cbc">attach_mkdir()</a>, <a class="el" href="include_2attach_8php.html#a84a8a64c4805e1525b42d4add464833f">attach_store()</a>, <a class="el" href="bbcode_8php.html#a851f5aafefe52474201b83f9fd65931f">bb_parse_crypt()</a>, <a class="el" href="bbcode_8php.html#a009f61aaf78771737ed0765c8463911b">bbcode()</a>, <a class="el" href="zot_8php.html#ac34e479d27f32b82dd6b33542f81a6a7">build_sync_packet()</a>, <a class="el" href="account_8php.html#a141fe579c351c78209d425473f978eb5">create_account()</a>, <a class="el" href="identity_8php.html#a345f4c943d84de502ec6e72d2c813945">create_identity()</a>, <a class="el" href="classRedDirectory.html#a2d12d99d38a6a75fc9a830b2f7fc0bf0">RedDirectory\createFile()</a>, <a class="el" href="include_2directory_8php.html#aa75d3b0697ca1456aaabdb37a74aa0f0">directory_run()</a>, <a class="el" href="event_8php.html#a89ef533faf345db8d64a58d4856bde3a">event_store()</a>, <a class="el" href="fsuggest_8php.html#a61ecfe10ce937ed526614f8fd3de3c7d">fsuggest_post()</a>, <a class="el" href="text_8php.html#ae4f6881d7e13623f8eded6277595112a">generate_user_guid()</a>, <a class="el" href="include_2group_8php.html#a06ec565d2b64e79044e7c1bf91a2a4ce">group_add()</a>, <a class="el" href="zot_8php.html#aeec89da5b6ff090c63a79de4de884a35">import_directory_profile()</a>, <a class="el" href="zot_8php.html#a56f3f65514e4e7f0cd117d01735aebd1">import_xchan()</a>, <a class="el" href="text_8php.html#aa6b0aa8afbeab50d1a3058ad21acb74e">item_message_id()</a>, <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">item_store()</a>, <a class="el" href="lostpass_8php.html#a0314d94e48c789b1b3a201d740c9eab3">lostpass_content()</a>, <a class="el" href="lostpass_8php.html#a8ed35ba71a4404eaf4903da61d0321cc">lostpass_post()</a>, <a class="el" href="magic_8php.html#acea2cc792849ca2d71d4b689f66518bf">magic_init()</a>, <a class="el" href="items_8php.html#a77da7ce9a117601d49ac4a67c71b514f">mail_store()</a>, <a class="el" href="enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc">notification()</a>, <a class="el" href="notifier_8php.html#a568c502f626cff95e344c0748938b85d">notifier_run()</a>, <a class="el" href="text_8php.html#ae4df74296fbe55051ed3c035e55205e5">prepare_body()</a>, <a class="el" href="profiles_8php.html#a36f71405ad536228f8bb84a551b23f7e">profiles_init()</a>, <a class="el" href="removeme_8php.html#a065a589caa2aa84c60f7073a28f0ad9c">removeme_content()</a>, <a class="el" href="include_2message_8php.html#a751ffd6635022b2190f56154ee745752">send_message()</a>, <a class="el" href="account_8php.html#a014de2d5d5c9785de5bf547a485822fa">send_reg_approval_email()</a>, <a class="el" href="settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586">settings_post()</a>, <a class="el" href="setup_8php.html#a13cf286774149a0a7bd8adb8179cec75">setup_post()</a>, <a class="el" href="dir__fns_8php.html#a6cae22cfdd6edda5ddf09e07abb3242a">syncdirs()</a>, and <a class="el" href="thing_8php.html#a8be23b1d475ec3d9291999221c674c80">thing_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ad855a32bee22c3f3b9734e3a334b96f2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">reltoabs </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$text</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$base</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a896c1809d58f2d7a42cfe14577958ddf">get_atom_elements()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a9c6ce4e12a4ac883c5e3f36fed6e1e09"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">replace_macros </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$r</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>This is our template processor</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype">string&#160;|&#160;<a class="el" href="classFriendicaSmarty.html">FriendicaSmarty</a></td><td class="paramname">$s</td><td>the string requiring macro substitution, or an instance of <a class="el" href="classFriendicaSmarty.html">FriendicaSmarty</a> </td></tr>
+ <tr><td class="paramtype">array</td><td class="paramname">$r</td><td>key value pairs (search =&gt; replace) </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>string substituted string </dd></dl>
+
+<p>Referenced by <a class="el" href="admin_8php.html#afef415e4011607fbb665610441595015">admin_content()</a>, <a class="el" href="admin_8php.html#aaa6addf2dbc3f3fcf99244a56b41eade">admin_page_dbsync()</a>, <a class="el" href="admin_8php.html#a6943543f3138f6ee182cb701f415d1cc">admin_page_hubloc()</a>, <a class="el" href="admin_8php.html#a1d1362698af14d209aa3a0fb655551dd">admin_page_logs()</a>, <a class="el" href="admin_8php.html#a54128076986ba80c4a103de3fc3e19a8">admin_page_plugins()</a>, <a class="el" href="admin_8php.html#ac0f3bd12431c056aad77bac9d09fa30e">admin_page_site()</a>, <a class="el" href="admin_8php.html#ac6e95b920b5abd030cc522964987087a">admin_page_summary()</a>, <a class="el" href="admin_8php.html#af124619fdc278fe2bf14c45ddaa260fb">admin_page_themes()</a>, <a class="el" href="admin_8php.html#a62f10f90c47686c9c3c37c4c03a108d2">admin_page_users()</a>, <a class="el" href="identity_8php.html#aa870d2c1f558cfd52bef05bc124e8fa4">advanced_profile()</a>, <a class="el" href="text_8php.html#a75c243e06341ec16bd5a44b9b1cacd85">alt_pager()</a>, <a class="el" href="include_2api_8php.html#a5990101034e7abf6404feba3cd273629">api_apply_template()</a>, <a class="el" href="mod_2api_8php.html#a33315b5bbf5418f6850b2038107b526d">api_content()</a>, <a class="el" href="apps_8php.html#a546016cb960d0b110ee8e489dfa6c27c">apps_content()</a>, <a class="el" href="view_2theme_2apw_2php_2config_8php.html#a8b51951a70e1c1324be71345a61d70ec">apw_form()</a>, <a class="el" href="blocks_8php.html#a2531a8fd51db3cecb2eb20c002c66e12">blocks_content()</a>, <a class="el" href="view_2theme_2blogga_2php_2config_8php.html#a8a311a402d3e746ce53fadc38e4b2d27">blogtheme_form()</a>, <a class="el" href="classApp.html#a08f0537964d98958d218066364cff785">App\build_pagehead()</a>, <a class="el" href="contact__widgets_8php.html#a165eb021e61c4dcab2a552f28628d353">categories_widget()</a>, <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>, <a class="el" href="chanview_8php.html#a4192c6da888c8c1165851acf9ad4cb8b">chanview_content()</a>, <a class="el" href="boot_8php.html#a4c02d88e66852a01bd5a1feecb7c3ce3">check_config()</a>, <a class="el" href="setup_8php.html#a14d208682a88632290c895d20da6e7d6">check_php()</a>, <a class="el" href="common_8php.html#ab63408f39abef7a6915186e8dabc5a96">common_content()</a>, <a class="el" href="contact__widgets_8php.html#a552f8544528cec0c995cea7287ea9d65">common_friends_visitor_widget()</a>, <a class="el" href="connect_8php.html#a489f0a66c660de6ec4d6917b27674f07">connect_content()</a>, <a class="el" href="connections_8php.html#aec2e457420fce3e3bf6a9f48e36df25c">connections_content()</a>, <a class="el" href="connedit_8php.html#a795acb3d9d841f55c255d7611681ab67">connedit_content()</a>, <a class="el" href="boot_8php.html#acc4e0c910af066148b810e5fde55fff1">construct_page()</a>, <a class="el" href="text_8php.html#ad6432621d0fafcbcf3d3b9b49bef7784">contact_block()</a>, <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation()</a>, <a class="el" href="delegate_8php.html#a943eea8996ef348eb845c498f9f354dd">delegate_content()</a>, <a class="el" href="text_8php.html#a87a3cefc603302c78982f1d8e1245265">design_tools()</a>, <a class="el" href="dir__fns_8php.html#acf621621e929d49441da30aad76a58cf">dir_safe_mode()</a>, <a class="el" href="dir__fns_8php.html#ae56881d69bb6f8e828c9e35454386774">dir_sort_links()</a>, <a class="el" href="mod_2directory_8php.html#aac79396570d759da2efac24fcedf5b44">directory_content()</a>, <a class="el" href="dirprofile_8php.html#a3e1d30d3d93863ff5615f2df4ac7f052">dirprofile_init()</a>, <a class="el" href="display_8php.html#a37137c98d47bf3306f4c2bb9f5b60de0">display_content()</a>, <a class="el" href="editblock_8php.html#abbe8f55de06967bc8d79d620509a49e6">editblock_content()</a>, <a class="el" href="editlayout_8php.html#aa877e4157a26b099de904164181dd386">editlayout_content()</a>, <a class="el" href="editpost_8php.html#a34011690864d122680c802e9e748ccfb">editpost_content()</a>, <a class="el" href="editwebpage_8php.html#a375e945255fad79a71036528f7480650">editwebpage_content()</a>, <a class="el" href="events_8php.html#a1d293fb217ae6bc9e3858c4b32e363ec">events_content()</a>, <a class="el" href="fbrowser_8php.html#aee476addcf7a3e0fe9454f7dfd5a56c4">fbrowser_content()</a>, <a class="el" href="datetime_8php.html#a03900dcf0f9e3c58793a031673a70326">field_timezone()</a>, <a class="el" href="contact__widgets_8php.html#a1eda66319d170f60a8d07c7ece95533b">fileas_widget()</a>, <a class="el" href="filer_8php.html#a5fd5d7e61b2f9c43cb5f110c89dc4274">filer_content()</a>, <a class="el" href="filestorage_8php.html#a61bb1be78472555df4ce619f51014040">filestorage_content()</a>, <a class="el" href="contact__widgets_8php.html#a57e73ebcfd62bb5d8c7a7b9e663726d6">findpeople_widget()</a>, <a class="el" href="text_8php.html#a3054189cff173977f4216c9a3dd29e1b">format_categories()</a>, <a class="el" href="text_8php.html#a4e4d42b0a805148d9f9a92bcac89bf91">format_filer()</a>, <a class="el" href="identity_8php.html#ad2c97627a313d53df1a1c7b4215ddb51">get_birthdays()</a>, <a class="el" href="classItem.html#a3ee7667c2ec6cd7657328e27848c0bdf">Item\get_comment_box()</a>, <a class="el" href="identity_8php.html#ae381db3d43f8e7c1da8b15d14ecf5312">get_events()</a>, <a class="el" href="items_8php.html#a04a35b610acfe54434df08adec39c0c7">get_feed_for()</a>, <a class="el" href="mod_2group_8php.html#a07a64f6c65b0080d8190b3d9728a7a83">group_content()</a>, <a class="el" href="include_2group_8php.html#a6a69bd7be032fa8ce4e49c43a42cc6e9">group_side()</a>, <a class="el" href="help_8php.html#af055e15f600ffa6fbca9386fdf715224">help_content()</a>, <a class="el" href="hostxrd_8php.html#aa37ffc8e7900bc76c4828bd25916db92">hostxrd_init()</a>, <a class="el" href="import_8php.html#afdf25ed70096d5dbf4f6d0ca79fea184">import_content()</a>, <a class="el" href="invite_8php.html#a244385b28cfd021d308715f01158bfd9">invite_content()</a>, <a class="el" href="text_8php.html#a71f6952243d3fe1c5a8154f78027e29c">lang_selector()</a>, <a class="el" href="layouts_8php.html#a6e0193759ad9eef76d3df2db24237b50">layouts_content()</a>, <a class="el" href="boot_8php.html#aefecf8599036df7f1b95d6820e0e2fa4">login()</a>, <a class="el" href="lostpass_8php.html#a0314d94e48c789b1b3a201d740c9eab3">lostpass_content()</a>, <a class="el" href="lostpass_8php.html#a8ed35ba71a4404eaf4903da61d0321cc">lostpass_post()</a>, <a class="el" href="mail_8php.html#a3c7c485fc69f92371e8b20936040eca1">mail_content()</a>, <a class="el" href="manage_8php.html#a2bca247b5296827638959138367db4f5">manage_content()</a>, <a class="el" href="match_8php.html#a1dd853e959b9e70c1911bb2fb5f5130d">match_content()</a>, <a class="el" href="mod_2menu_8php.html#a6fed23af14d71a78a4153c8363a685cf">menu_content()</a>, <a class="el" href="include_2menu_8php.html#a890cc6237971e15f15702e6b2e88502e">menu_render()</a>, <a class="el" href="mod_2message_8php.html#ac72dfed3ce08fcb331d66b37edc6e15f">message_content()</a>, <a class="el" href="text_8php.html#a2a902f5fdba8646333e997898ac45ea3">micropro()</a>, <a class="el" href="include_2group_8php.html#ab0e422a0f31c0c64fd9084ca03d85f32">mini_group_select()</a>, <a class="el" href="mitem_8php.html#a7a31b702ecad18eeb6a38b243ff0037e">mitem_content()</a>, <a class="el" href="mood_8php.html#a721b9b6703b3234a005641c92d409b8f">mood_content()</a>, <a class="el" href="nav_8php.html#a43be0df73b90647ea70947ce004e231e">nav()</a>, <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>, <a class="el" href="new__channel_8php.html#ae585191610f79da129492482ce8e2fee">new_channel_content()</a>, <a class="el" href="enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc">notification()</a>, <a class="el" href="notifications_8php.html#aadd0b5525bd8c283a5d8a37982bbfe62">notifications_content()</a>, <a class="el" href="mod_2notify_8php.html#acdf3851688ebd6d6a575eb84ef9febe3">notify_content()</a>, <a class="el" href="include_2oembed_8php.html#a26bb4c1e330d2f94ea7b6ce2fe970cf3">oembed_format_object()</a>, <a class="el" href="oexchange_8php.html#ac8e2e469ddc3db984b0c1b44558aca59">oexchange_init()</a>, <a class="el" href="opensearch_8php.html#ad13034877a496565ac7d99e9fc6f55e9">opensearch_init()</a>, <a class="el" href="page__widgets_8php.html#ad82011c1ed90d9de8b9f34c12af5c6f0">pagelist_widget()</a>, <a class="el" href="include_2photos_8php.html#af24c6aeed28ecc31ec39e7d9a1804979">photos_album_widget()</a>, <a class="el" href="mod_2photos_8php.html#aa87382611a66ec5effdb2d78f13f5812">photos_content()</a>, <a class="el" href="poco_8php.html#a53def16f75e3d41f1d2bb7cfa4905498">poco_init()</a>, <a class="el" href="poke_8php.html#ac9190563a8da9c07a16f9dcd71cf6993">poke_content()</a>, <a class="el" href="acl__selectors_8php.html#a7b5446e999636ceceea65c154d865a31">populate_acl()</a>, <a class="el" href="items_8php.html#abe695dd89e1e10ed042c26b80114f0ed">posted_date_widget()</a>, <a class="el" href="identity_8php.html#a432259b2cf5b6f59be53e71db9f2c7dc">profile_sidebar()</a>, <a class="el" href="profiles_8php.html#a46975783b8b8d70402d51487eb1f0b00">profiles_content()</a>, <a class="el" href="view_2theme_2redbasic_2php_2config_8php.html#a8574a41fa9735ee391ba57ab24b93793">redbasic_form()</a>, <a class="el" href="register_8php.html#a0e91f57f111407ea8d3223a05022bb2a">register_content()</a>, <a class="el" href="removeme_8php.html#a065a589caa2aa84c60f7073a28f0ad9c">removeme_content()</a>, <a class="el" href="rmagic_8php.html#a3e28db1e5cfa7e5c2617f90222c1caef">rmagic_content()</a>, <a class="el" href="rpost_8php.html#a8190354d789000806d9879aea276728f">rpost_content()</a>, <a class="el" href="search_8php.html#ab2568591359edde5b483a6cd9a24b2cc">search_content()</a>, <a class="el" href="account_8php.html#a014de2d5d5c9785de5bf547a485822fa">send_reg_approval_email()</a>, <a class="el" href="account_8php.html#aa9c29c497c17d8f9344dce8631ad8761">send_verification_email()</a>, <a class="el" href="setup_8php.html#a88247384a96e14516f474d7af6a465c1">setup_content()</a>, <a class="el" href="setup_8php.html#a13cf286774149a0a7bd8adb8179cec75">setup_post()</a>, <a class="el" href="siteinfo_8php.html#a70c09bfb6dd1c86a125a35f62ed53656">siteinfo_content()</a>, <a class="el" href="sources_8php.html#ac442ccef080ab95772d8929fcafcb4b7">sources_content()</a>, <a class="el" href="suggest_8php.html#a58748a8235d4523f8333847f3e42dd91">suggest_content()</a>, <a class="el" href="text_8php.html#af9c9ac3f74c82dc60acfa404d0e9dc53">theme_attachments()</a>, <a class="el" href="thing_8php.html#a24a35f1e64029a67fdbea94a776ae04b">thing_content()</a>, <a class="el" href="account_8php.html#ac5c570a2d46446bad4dd2501e9c5a4b1">user_allow()</a>, <a class="el" href="Contact_8php.html#a6348a532c9d26cd1c9afbc9aa6aa8960">vcard_from_xchan()</a>, <a class="el" href="viewconnections_8php.html#ab6c4d983e97b3a8a879567ff76507776">viewconnections_content()</a>, <a class="el" href="vote_8php.html#a6aa67489bf458ca5e3206e46dac68596">vote_content()</a>, <a class="el" href="webpages_8php.html#af3b7397d4abc153e3d2147740ee1a41d">webpages_content()</a>, <a class="el" href="widgets_8php.html#add9b24d3304e529a7975e96122315554">widget_affinity()</a>, <a class="el" href="widgets_8php.html#a7b1e357b5a2027718470b77ec921fc65">widget_archive()</a>, <a class="el" href="widgets_8php.html#a5ab3b64496e02cab56429978ad55f1c0">widget_filer()</a>, <a class="el" href="widgets_8php.html#ad1bf7aa69e8d100d95faba17c7bc91cd">widget_follow()</a>, <a class="el" href="widgets_8php.html#afa2e55a78f95667a6da082efac7fec74">widget_mailmenu()</a>, <a class="el" href="widgets_8php.html#a45ea061dabe9a8372e4ca3b9e5714256">widget_notes()</a>, <a class="el" href="widgets_8php.html#a94203eb9bcd63cbdecbbcb15163598d8">widget_savedsearch()</a>, <a class="el" href="widgets_8php.html#aaa73bcf1702eaadd9dcd253502f55e01">widget_settings_menu()</a>, <a class="el" href="widgets_8php.html#a0d404276fedc59f5038cf5c085028326">widget_suggestions()</a>, <a class="el" href="page__widgets_8php.html#a1a1e729da27f252cab6678288a17958f">writepages_widget()</a>, and <a class="el" href="xrd_8php.html#aee3cf087968e4a0ff3a87de16eb23270">xrd_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ae2126da85966da0e79c6bcbac63b0bda"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">return_bytes </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$size_str</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a9fbeae13c9abd6e27cb4d8d1817f969c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">sanitise_acl </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$item</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a876e94892867019935b348b573299352"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">search </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$id</em> = <code>'search-box'</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$url</em> = <code>'/search'</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$save</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="search_8php.html#ab2568591359edde5b483a6cd9a24b2cc">search_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aae91e4d2a2c6f7a9daccd2c186ae3447"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">searchbox </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$id</em> = <code>'<a class="el" href="text_8php.html#a876e94892867019935b348b573299352">search</a>-box'</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$url</em> = <code>'/<a class="el" href="text_8php.html#a876e94892867019935b348b573299352">search</a>'</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$save</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="widgets_8php.html#a94203eb9bcd63cbdecbbcb15163598d8">widget_savedsearch()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aca0f589be74fab1a460c57e88dad9779"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">smile_decode </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$m</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a44d460fcdee6247c67b9bef3ea15f3e6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">smile_encode </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$m</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a3d225b253bb9e0f2498c11647d927b0b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">smilies </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$sample</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Function: smilies</p>
+<p>Description: Replaces text emoticons with graphical images</p>
+<p>: string $s</p>
+<p>Returns string</p>
+<p>It is expected that this function will be called using HTML text. We will escape text between HTML pre and code blocks from being processed.</p>
+<p>At a higher level, the bbcode [nosmile] tag can be used to prevent this function from being executed by the <a class="el" href="text_8php.html#afe54312607d92f7ce9593f5760831f80">prepare_text()</a> routine when preparing bbcode source for HTML display </p>
+
+<p>Referenced by <a class="el" href="mail_8php.html#a3c7c485fc69f92371e8b20936040eca1">mail_content()</a>, <a class="el" href="mod_2message_8php.html#ac72dfed3ce08fcb331d66b37edc6e15f">message_content()</a>, and <a class="el" href="smilies_8php.html#ab43b1e9f33a700a830aff14c7b3a617f">smilies_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a33bdb5d4bfff2ede7caf61a98ac0a2e9"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">sslify </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>sslify($s) Replace media element using http url with https to a local redirector if using https locally </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype">string</td><td class="paramname">$s</td><td>Looks for HTML tags containing src elements that are http when we're viewing an https page Typically this throws an insecure content violation in the browser. So we redirect them to a local redirector which uses https and which redirects to the selected content</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>string </dd></dl>
+
+<p>Referenced by <a class="el" href="text_8php.html#ae4df74296fbe55051ed3c035e55205e5">prepare_body()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a8796f6a9ca592ecdce7b3afc3462aa13"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">stringify_array_elms </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$arr</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$escape</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2group_8php.html#a22a81875259c7d3d64d4848afea6b345">expand_groups()</a>, <a class="el" href="taxonomy_8php.html#a7747fa859ac56fbffd4f9782d85505de">get_things()</a>, <a class="el" href="identity_8php.html#a3570a4eb77332b292d394c4132cb8f03">identity_basic_export()</a>, <a class="el" href="lockview_8php.html#a851e26ab9a1008df5c5ebebea31e9b44">lockview_content()</a>, <a class="el" href="notifier_8php.html#a568c502f626cff95e344c0748938b85d">notifier_run()</a>, <a class="el" href="taxonomy_8php.html#aaf90ba8b839d6459065f39a4f1109b8a">tagadelic()</a>, and <a class="el" href="zot_8php.html#aeea071f17e306fe3d0c488551906bfab">zot_import()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="af9c9ac3f74c82dc60acfa404d0e9dc53"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">theme_attachments </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$item</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="mail_8php.html#a3c7c485fc69f92371e8b20936040eca1">mail_content()</a>, and <a class="el" href="text_8php.html#ae4df74296fbe55051ed3c035e55205e5">prepare_body()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a29d6b804e368d3ef359ee295e96ed4c7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">unamp </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a740ad03e00459039a2c0992246c4e727"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">undo_post_tagging </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="editblock_8php.html#abbe8f55de06967bc8d79d620509a49e6">editblock_content()</a>, <a class="el" href="editlayout_8php.html#aa877e4157a26b099de904164181dd386">editlayout_content()</a>, <a class="el" href="editpost_8php.html#a34011690864d122680c802e9e748ccfb">editpost_content()</a>, and <a class="el" href="editwebpage_8php.html#a375e945255fad79a71036528f7480650">editwebpage_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a8264348059abd1d4d5bb521323d3b19a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">unobscure </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$item</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#a4c6fb9fb5203aa60f4b3afd4521db8ea">api_format_items()</a>, <a class="el" href="include_2api_8php.html#ae82608c317421f27446465aa6724733d">api_format_messages()</a>, <a class="el" href="include_2api_8php.html#a645397787618b5c548a31e8686e8cca4">api_status_show()</a>, <a class="el" href="include_2api_8php.html#abe8e929e93f7ab134b1cb1fb30f19a76">api_users_show()</a>, and <a class="el" href="text_8php.html#ae4df74296fbe55051ed3c035e55205e5">prepare_body()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a1360fed7f918d859daaca1c9f384f9af"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">unxmlify </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="filer_8php.html#a5fd5d7e61b2f9c43cb5f110c89dc4274">filer_content()</a>, and <a class="el" href="items_8php.html#a896c1809d58f2d7a42cfe14577958ddf">get_atom_elements()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a6a3d80a6c6fb234fd0bac44203b828eb"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">valid_email </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$x</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="account_8php.html#ae052bd5558847bd38e89c213561a9771">check_account_email()</a>, <a class="el" href="invite_8php.html#aeb0881c0f93c8e8552e5ed756ce6e5a5">invite_post()</a>, and <a class="el" href="settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586">settings_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a543447c5ed766535221e2d9636b379ee"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xchan_mail_query </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$item</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="notifier_8php.html#a568c502f626cff95e344c0748938b85d">notifier_run()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a36a2e5d418ee81140f25c4233cfecd1f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xchan_query </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$items</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$abook</em> = <code>true</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#a4c6fb9fb5203aa60f4b3afd4521db8ea">api_format_items()</a>, <a class="el" href="include_2api_8php.html#a528d8070ee74ea800102936ce73cf366">api_statuses_home_timeline()</a>, <a class="el" href="include_2api_8php.html#ad24ce1bf20867add4c9211a8eaf93f22">api_statuses_public_timeline()</a>, <a class="el" href="include_2api_8php.html#af6f1d89cdb0a0621025efbec1597bc63">api_statuses_show()</a>, <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>, <a class="el" href="display_8php.html#a37137c98d47bf3306f4c2bb9f5b60de0">display_content()</a>, <a class="el" href="events_8php.html#a1d293fb217ae6bc9e3858c4b32e363ec">events_content()</a>, <a class="el" href="home_8php.html#aa1cf697851a646755baf537f75334c46">home_content()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="items_8php.html#a756738301f2ed96be50232500677d58a">items_fetch()</a>, <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>, <a class="el" href="enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc">notification()</a>, <a class="el" href="notifier_8php.html#a568c502f626cff95e344c0748938b85d">notifier_run()</a>, <a class="el" href="page_8php.html#a91a5f649f68406149108bded1dc90b22">page_content()</a>, <a class="el" href="ping_8php.html#a77217b1b190b4c5d8770867b45f0c0a1">ping_init()</a>, <a class="el" href="search_8php.html#ab2568591359edde5b483a6cd9a24b2cc">search_content()</a>, <a class="el" href="share_8php.html#afeb26046bdd02567ecd29ab5f188b249">share_init()</a>, and <a class="el" href="items_8php.html#a004e89d86b0f29b2c4da20108ecc4091">zot_feed()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aaed4413ed8918838b517e3b2fafaea0d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xmlify </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$str</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>escape text ($str) for XML transport </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype">string</td><td class="paramname">$str</td><td></td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>string Escaped text. </dd></dl>
+
+<p>Referenced by <a class="el" href="text_8php.html#acedb584f65114a33f389efb796172a91">array_xmlify()</a>, <a class="el" href="items_8php.html#a016dd86c827d08db89061ea81d15c6cb">atom_author()</a>, <a class="el" href="items_8php.html#a275108c050f7eb18bcbb5018e6b81cf6">atom_entry()</a>, <a class="el" href="items_8php.html#aa9e99613d38a97b39c8cf5449699c2ee">construct_activity_object()</a>, <a class="el" href="items_8php.html#aa579bc4445d60098b1410961ca8e96b7">construct_activity_target()</a>, <a class="el" href="items_8php.html#aa723c0571e314a1853a24c5854b4f54f">encode_rel_links()</a>, <a class="el" href="items_8php.html#a896c1809d58f2d7a42cfe14577958ddf">get_atom_elements()</a>, <a class="el" href="items_8php.html#a04a35b610acfe54434df08adec39c0c7">get_feed_for()</a>, <a class="el" href="items_8php.html#a09d425596b9f8663472cf7474ad36d96">item_getfeedattach()</a>, <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>, <a class="el" href="subthread_8php.html#a50368f3d825b77996030528e7fbfa3d3">subthread_content()</a>, <a class="el" href="tagger_8php.html#a0e4a3eb177d1684553c547503d67161c">tagger_content()</a>, and <a class="el" href="include_2network_8php.html#a9e9da2aafb806c98ecdc318604e60dc6">xml_status()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a324c58f37f6acdf9cd1922aa76077d9f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">z_input_filter </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel_id</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em> = <code>'text/<a class="el" href="bbcode_8php.html#a009f61aaf78771737ed0765c8463911b">bbcode</a>'</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">item_store()</a>, <a class="el" href="items_8php.html#acf0bf7c9d21ac84f32effb754f7ad484">item_store_update()</a>, and <a class="el" href="items_8php.html#a410f9c743877c125ca06312373346903">post_activity_item()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a405afe814a23f3bd94d826101aa168ab"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">zidify_callback </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$match</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p><a class="el" href="text_8php.html#a405afe814a23f3bd94d826101aa168ab">zidify_callback()</a> and <a class="el" href="text_8php.html#a29988052f3944111def3b6aaf2c7a8f6">zidify_links()</a> work together to turn any HTML a tags with class="zrl" into zid links These will typically be generated by a bbcode '[zrl]' tag. This is done inside <a class="el" href="text_8php.html#afe54312607d92f7ce9593f5760831f80">prepare_text()</a> rather than <a class="el" href="bbcode_8php.html#a009f61aaf78771737ed0765c8463911b">bbcode()</a> because the latter is used for general purpose conversions and the former is used only when preparing text for immediate display.</p>
+<p>Issues: Currently the order of HTML parameters in the text is somewhat rigid and inflexible. We assume it looks like <a href="xxxxxxxxxx" class="zrl">and will not work if zrl and href appear in a different order. </a></p>
+
+</div>
+</div>
+<a class="anchor" id="ab4a4c3d4700bc219bb84f33b499314f4"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">zidify_img_callback </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$match</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a29988052f3944111def3b6aaf2c7a8f6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">zidify_links </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc">notification()</a>.</p>
+
+</div>
+</div>
+<h2 class="groupheader">Variable Documentation</h2>
+<a class="anchor" id="aad557c054cf2ed915633701018fc7e3f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const RANDOM_STRING_HEX 0x00</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a2ffd79c60cc87cec24ef76447b905187"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const RANDOM_STRING_TEXT 0x01</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="crypto_8php.html#a2148d7aac7b30c720f7ebda7e9790286">aes_encapsulate()</a>, and <a class="el" href="text_8php.html#a9d6a5ee1290de7a8b483fe78585daade">random_string()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/text_8php.js b/doc/html/text_8php.js
new file mode 100644
index 000000000..65a33574e
--- /dev/null
+++ b/doc/html/text_8php.js
@@ -0,0 +1,93 @@
+var text_8php =
+[
+ [ "activity_match", "text_8php.html#af8a3e3a66a7b862d4510f145d2e13186", null ],
+ [ "alt_pager", "text_8php.html#a75c243e06341ec16bd5a44b9b1cacd85", null ],
+ [ "array_xmlify", "text_8php.html#acedb584f65114a33f389efb796172a91", null ],
+ [ "attribute_contains", "text_8php.html#a95fd2f8f23a1948414a03ebc963bac57", null ],
+ [ "autoname", "text_8php.html#a27cd2c1b3bcb49a0cfb7249e851725ca", null ],
+ [ "base64url_decode", "text_8php.html#a13286f8a95d2de6b102966ecc270c8d6", null ],
+ [ "base64url_encode", "text_8php.html#a070384ec000fd65043fce11d5392d241", null ],
+ [ "bb_translate_video", "text_8php.html#a3d2793d66db3345fd290b71e2eadf98e", null ],
+ [ "chanlink_cid", "text_8php.html#a85e3a4851c16674834010d8419a5d7ca", null ],
+ [ "chanlink_hash", "text_8php.html#a55ab893be57feda59c2a7ba1e58ff2d0", null ],
+ [ "chanlink_url", "text_8php.html#a2e8d6c402603be3a1256a16605e09c2a", null ],
+ [ "check_webbie", "text_8php.html#a0c65597bb4aed3a039eb795ff540e5e3", null ],
+ [ "cleardiv", "text_8php.html#afe18627c4983ee5f7c940a0992818cd5", null ],
+ [ "contact_block", "text_8php.html#ad6432621d0fafcbcf3d3b9b49bef7784", null ],
+ [ "day_translate", "text_8php.html#a63fb21c0bed2fc72eef2c1471ac42b63", null ],
+ [ "design_tools", "text_8php.html#a87a3cefc603302c78982f1d8e1245265", null ],
+ [ "dlogger", "text_8php.html#a0a1f7c0e97f9ecbebf3e5834582b014c", null ],
+ [ "escape_tags", "text_8php.html#aa5148a0dfea2a1ca64c3d52f10aa2d64", null ],
+ [ "expand_acl", "text_8php.html#ae4282a39492caa23ccbc2ce98e54f110", null ],
+ [ "feed_hublinks", "text_8php.html#a8d8c4a11e53461caca21181ebd72daca", null ],
+ [ "feed_salmonlinks", "text_8php.html#a89929fa6f70a8ba54d5273fcf622b665", null ],
+ [ "find_xchan_in_array", "text_8php.html#ace3c98538c63e09b70a363210b414112", null ],
+ [ "fix_mce_lf", "text_8php.html#afdc69fe3f6c09e35e46304dcea63ae28", null ],
+ [ "format_categories", "text_8php.html#a3054189cff173977f4216c9a3dd29e1b", null ],
+ [ "format_filer", "text_8php.html#a4e4d42b0a805148d9f9a92bcac89bf91", null ],
+ [ "generate_user_guid", "text_8php.html#ae4f6881d7e13623f8eded6277595112a", null ],
+ [ "get_mentions", "text_8php.html#a76d1b3435c067978d7b484c45f56472b", null ],
+ [ "get_mood_verbs", "text_8php.html#a736db13a966b8abaf8c9198faa35911a", null ],
+ [ "get_plink", "text_8php.html#aac0969ae09853205992ba06ab9f9f61a", null ],
+ [ "get_poke_verbs", "text_8php.html#aa46f941155c2ac1155f2f17ffb0adb66", null ],
+ [ "get_rel_link", "text_8php.html#a3972701c5c83624ec4e2d06242f614e7", null ],
+ [ "get_tags", "text_8php.html#a4659fbc4e54ddc700c3aa66b9092c623", null ],
+ [ "html2bb_video", "text_8php.html#a138a3a611fa7f4f3630674145fc826bf", null ],
+ [ "ids_to_querystr", "text_8php.html#a436a8de00c942364c2d0fcfc7e1f4b5a", null ],
+ [ "in_arrayi", "text_8php.html#a75c326298519ed14ebe762194c8a3f2a", null ],
+ [ "is_a_date_arg", "text_8php.html#a1557112a774ec00fa06ed6b6f6495506", null ],
+ [ "item_message_id", "text_8php.html#aa6b0aa8afbeab50d1a3058ad21acb74e", null ],
+ [ "item_post_type", "text_8php.html#ac1dbf2e37e8069bea2c0f557fdbf203e", null ],
+ [ "jindent", "text_8php.html#ae17b39d5e321debd3ad16dcbbde842b8", null ],
+ [ "json_decode_plus", "text_8php.html#a0271381208acfa2d4cff36da281e3e23", null ],
+ [ "lang_selector", "text_8php.html#a71f6952243d3fe1c5a8154f78027e29c", null ],
+ [ "layout_select", "text_8php.html#a3999a0b3e22e440f280ee791ce34d384", null ],
+ [ "legal_webbie", "text_8php.html#a2690ad67bb6fb97ef69de3e8d23f2728", null ],
+ [ "link_compare", "text_8php.html#a47c1e4a5f3f53027daacd8a9db24f285", null ],
+ [ "linkify", "text_8php.html#a11255c8c4e5245b6c24f97684826aa54", null ],
+ [ "logger", "text_8php.html#a030fa5ecc64168af0c4f44897a9bce63", null ],
+ [ "magic_link", "text_8php.html#a1e510c53624933ce9b7d6715784894db", null ],
+ [ "magiclink_url", "text_8php.html#a24d441d30df4b8e6bf6780bf62a5e2c6", null ],
+ [ "micropro", "text_8php.html#a2a902f5fdba8646333e997898ac45ea3", null ],
+ [ "mimetype_select", "text_8php.html#a1633412120f52bdce5f43e0a127d9293", null ],
+ [ "normalise_link", "text_8php.html#a4bbb7d00c05cd20b4e043424f322388f", null ],
+ [ "normalise_openid", "text_8php.html#adba17ec946f4285285dc100f7860bf51", null ],
+ [ "notags", "text_8php.html#a1af49756c8c71902a66c7e329c462beb", null ],
+ [ "paginate", "text_8php.html#afe9f178d264d44a94dc1292aaf0fd585", null ],
+ [ "perms2str", "text_8php.html#a98fd99dee3da8cf4c148dc04efe782ee", null ],
+ [ "photo_new_resource", "text_8php.html#aa5528f41533927e1bd2da3618a74a6d7", null ],
+ [ "preg_heart", "text_8php.html#ac19d2b33a58372a357a43d51eed19162", null ],
+ [ "prepare_body", "text_8php.html#ae4df74296fbe55051ed3c035e55205e5", null ],
+ [ "prepare_text", "text_8php.html#afe54312607d92f7ce9593f5760831f80", null ],
+ [ "profiler", "text_8php.html#a8b0a799341b1fc4cba2c3ede3e3fc9b6", null ],
+ [ "protect_sprintf", "text_8php.html#a4e7698aca48982512594b274543c3b9b", null ],
+ [ "purify_html", "text_8php.html#a4841df5beabdd1bdd1ed56781a915d61", null ],
+ [ "qp", "text_8php.html#afc998d2796a6b2a08e96f7cc061e7221", null ],
+ [ "random_string", "text_8php.html#a9d6a5ee1290de7a8b483fe78585daade", null ],
+ [ "reltoabs", "text_8php.html#ad855a32bee22c3f3b9734e3a334b96f2", null ],
+ [ "replace_macros", "text_8php.html#a9c6ce4e12a4ac883c5e3f36fed6e1e09", null ],
+ [ "return_bytes", "text_8php.html#ae2126da85966da0e79c6bcbac63b0bda", null ],
+ [ "sanitise_acl", "text_8php.html#a9fbeae13c9abd6e27cb4d8d1817f969c", null ],
+ [ "search", "text_8php.html#a876e94892867019935b348b573299352", null ],
+ [ "searchbox", "text_8php.html#aae91e4d2a2c6f7a9daccd2c186ae3447", null ],
+ [ "smile_decode", "text_8php.html#aca0f589be74fab1a460c57e88dad9779", null ],
+ [ "smile_encode", "text_8php.html#a44d460fcdee6247c67b9bef3ea15f3e6", null ],
+ [ "smilies", "text_8php.html#a3d225b253bb9e0f2498c11647d927b0b", null ],
+ [ "sslify", "text_8php.html#a33bdb5d4bfff2ede7caf61a98ac0a2e9", null ],
+ [ "stringify_array_elms", "text_8php.html#a8796f6a9ca592ecdce7b3afc3462aa13", null ],
+ [ "theme_attachments", "text_8php.html#af9c9ac3f74c82dc60acfa404d0e9dc53", null ],
+ [ "unamp", "text_8php.html#a29d6b804e368d3ef359ee295e96ed4c7", null ],
+ [ "undo_post_tagging", "text_8php.html#a740ad03e00459039a2c0992246c4e727", null ],
+ [ "unobscure", "text_8php.html#a8264348059abd1d4d5bb521323d3b19a", null ],
+ [ "unxmlify", "text_8php.html#a1360fed7f918d859daaca1c9f384f9af", null ],
+ [ "valid_email", "text_8php.html#a6a3d80a6c6fb234fd0bac44203b828eb", null ],
+ [ "xchan_mail_query", "text_8php.html#a543447c5ed766535221e2d9636b379ee", null ],
+ [ "xchan_query", "text_8php.html#a36a2e5d418ee81140f25c4233cfecd1f", null ],
+ [ "xmlify", "text_8php.html#aaed4413ed8918838b517e3b2fafaea0d", null ],
+ [ "z_input_filter", "text_8php.html#a324c58f37f6acdf9cd1922aa76077d9f", null ],
+ [ "zidify_callback", "text_8php.html#a405afe814a23f3bd94d826101aa168ab", null ],
+ [ "zidify_img_callback", "text_8php.html#ab4a4c3d4700bc219bb84f33b499314f4", null ],
+ [ "zidify_links", "text_8php.html#a29988052f3944111def3b6aaf2c7a8f6", null ],
+ [ "RANDOM_STRING_HEX", "text_8php.html#aad557c054cf2ed915633701018fc7e3f", null ],
+ [ "RANDOM_STRING_TEXT", "text_8php.html#a2ffd79c60cc87cec24ef76447b905187", null ]
+]; \ No newline at end of file
diff --git a/doc/html/theme_2apw_2schema_2default_8php.html b/doc/html/theme_2apw_2schema_2default_8php.html
new file mode 100644
index 000000000..3fbc57ee8
--- /dev/null
+++ b/doc/html/theme_2apw_2schema_2default_8php.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/apw/schema/default.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rhash-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('theme_2apw_2schema_2default_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">default.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/theme_2blogga_2php_2default_8php.html b/doc/html/theme_2blogga_2php_2default_8php.html
new file mode 100644
index 000000000..7e1aeec61
--- /dev/null
+++ b/doc/html/theme_2blogga_2php_2default_8php.html
@@ -0,0 +1,165 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/blogga/php/default.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('theme_2blogga_2php_2default_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle">
+<div class="title">default.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:ac7062908d1eb80c0735270f7997c4527"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="theme_2blogga_2php_2default_8php.html#ac7062908d1eb80c0735270f7997c4527">$headimg</a> = <a class="el" href="include_2config_8php.html#af02c96e6b37335774b548914ede1d22e">get_config</a>('blogtheme', 'headimg')</td></tr>
+<tr class="separator:ac7062908d1eb80c0735270f7997c4527"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1230ab83d4ec9785d8f3a966f33dc5f3"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="theme_2blogga_2php_2default_8php.html#a1230ab83d4ec9785d8f3a966f33dc5f3">$headimghome</a> = <a class="el" href="include_2config_8php.html#af02c96e6b37335774b548914ede1d22e">get_config</a>('blogtheme', 'headimghome')</td></tr>
+<tr class="separator:a1230ab83d4ec9785d8f3a966f33dc5f3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a720581ae288aa09511670563e4205a4a"><td class="memItemLeft" align="right" valign="top"><a class="el" href="redbasic_2php_2style_8php.html#a883f9f14e205f7aa7de02c14df67b40a">if</a>($a-&gt;module=='display')&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="theme_2blogga_2php_2default_8php.html#a720581ae288aa09511670563e4205a4a">$bodyclass</a> =&quot;&quot;</td></tr>
+<tr class="separator:a720581ae288aa09511670563e4205a4a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Variable Documentation</h2>
+<a class="anchor" id="a720581ae288aa09511670563e4205a4a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="redbasic_2php_2style_8php.html#a883f9f14e205f7aa7de02c14df67b40a">if</a> ($a-&gt;module=='display') $bodyclass =&quot;&quot;</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ac7062908d1eb80c0735270f7997c4527"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$headimg = <a class="el" href="include_2config_8php.html#af02c96e6b37335774b548914ede1d22e">get_config</a>('blogtheme', 'headimg')</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="view_2theme_2blogga_2php_2config_8php.html#a8a311a402d3e746ce53fadc38e4b2d27">blogtheme_form()</a>, <a class="el" href="blogga_2view_2theme_2blog_2theme_8php.html#af634a3f721c5e238530d0636d33230ec">blogtheme_imgurl()</a>, <a class="el" href="view_2theme_2blogga_2php_2config_8php.html#a09cd81013505f83aea0771243a1e4e53">theme_admin()</a>, and <a class="el" href="view_2theme_2blogga_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d">theme_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a1230ab83d4ec9785d8f3a966f33dc5f3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$headimghome = <a class="el" href="include_2config_8php.html#af02c96e6b37335774b548914ede1d22e">get_config</a>('blogtheme', 'headimghome')</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="view_2theme_2blogga_2php_2config_8php.html#a8a311a402d3e746ce53fadc38e4b2d27">blogtheme_form()</a>, <a class="el" href="view_2theme_2blogga_2php_2config_8php.html#a09cd81013505f83aea0771243a1e4e53">theme_admin()</a>, and <a class="el" href="view_2theme_2blogga_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d">theme_content()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/theme_2blogga_2php_2default_8php.js b/doc/html/theme_2blogga_2php_2default_8php.js
new file mode 100644
index 000000000..5cade9149
--- /dev/null
+++ b/doc/html/theme_2blogga_2php_2default_8php.js
@@ -0,0 +1,6 @@
+var theme_2blogga_2php_2default_8php =
+[
+ [ "$bodyclass", "theme_2blogga_2php_2default_8php.html#a720581ae288aa09511670563e4205a4a", null ],
+ [ "$headimg", "theme_2blogga_2php_2default_8php.html#ac7062908d1eb80c0735270f7997c4527", null ],
+ [ "$headimghome", "theme_2blogga_2php_2default_8php.html#a1230ab83d4ec9785d8f3a966f33dc5f3", null ]
+]; \ No newline at end of file
diff --git a/doc/html/theme_2blogga_2php_2theme__init_8php.html b/doc/html/theme_2blogga_2php_2theme__init_8php.html
new file mode 100644
index 000000000..06acd8602
--- /dev/null
+++ b/doc/html/theme_2blogga_2php_2theme__init_8php.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/blogga/php/theme_init.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('theme_2blogga_2php_2theme__init_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">theme_init.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/theme_2blogga_2view_2theme_2blog_2default_8php.html b/doc/html/theme_2blogga_2view_2theme_2blog_2default_8php.html
new file mode 100644
index 000000000..eafbefc24
--- /dev/null
+++ b/doc/html/theme_2blogga_2view_2theme_2blog_2default_8php.html
@@ -0,0 +1,161 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/blogga/view/theme/blog/default.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('theme_2blogga_2view_2theme_2blog_2default_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle">
+<div class="title">default.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:a52d9dd070ed541729088395c22502539"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="theme_2blogga_2view_2theme_2blog_2default_8php.html#a52d9dd070ed541729088395c22502539">$headimg</a> = <a class="el" href="include_2config_8php.html#af02c96e6b37335774b548914ede1d22e">get_config</a>('blogtheme', 'headimg')</td></tr>
+<tr class="separator:a52d9dd070ed541729088395c22502539"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1230ab83d4ec9785d8f3a966f33dc5f3"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="theme_2blogga_2view_2theme_2blog_2default_8php.html#a1230ab83d4ec9785d8f3a966f33dc5f3">$headimghome</a> = <a class="el" href="include_2config_8php.html#af02c96e6b37335774b548914ede1d22e">get_config</a>('blogtheme', 'headimghome')</td></tr>
+<tr class="separator:a1230ab83d4ec9785d8f3a966f33dc5f3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a720581ae288aa09511670563e4205a4a"><td class="memItemLeft" align="right" valign="top"><a class="el" href="redbasic_2php_2style_8php.html#a883f9f14e205f7aa7de02c14df67b40a">if</a>($a-&gt;module=='display')&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="theme_2blogga_2view_2theme_2blog_2default_8php.html#a720581ae288aa09511670563e4205a4a">$bodyclass</a> =&quot;&quot;</td></tr>
+<tr class="separator:a720581ae288aa09511670563e4205a4a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Variable Documentation</h2>
+<a class="anchor" id="a720581ae288aa09511670563e4205a4a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="redbasic_2php_2style_8php.html#a883f9f14e205f7aa7de02c14df67b40a">if</a> ($a-&gt;module=='display') $bodyclass =&quot;&quot;</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a52d9dd070ed541729088395c22502539"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="redbasic_2php_2style_8php.html#a883f9f14e205f7aa7de02c14df67b40a">if</a> (<a class="el" href="boot_8php.html#ad4c9dc2c8a82e8f52b7404c1655eab44">local_user</a>()) $headimg = <a class="el" href="include_2config_8php.html#af02c96e6b37335774b548914ede1d22e">get_config</a>('blogtheme', 'headimg')</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a1230ab83d4ec9785d8f3a966f33dc5f3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$headimghome = <a class="el" href="include_2config_8php.html#af02c96e6b37335774b548914ede1d22e">get_config</a>('blogtheme', 'headimghome')</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/theme_2blogga_2view_2theme_2blog_2default_8php.js b/doc/html/theme_2blogga_2view_2theme_2blog_2default_8php.js
new file mode 100644
index 000000000..6f23bcd93
--- /dev/null
+++ b/doc/html/theme_2blogga_2view_2theme_2blog_2default_8php.js
@@ -0,0 +1,6 @@
+var theme_2blogga_2view_2theme_2blog_2default_8php =
+[
+ [ "$bodyclass", "theme_2blogga_2view_2theme_2blog_2default_8php.html#a720581ae288aa09511670563e4205a4a", null ],
+ [ "$headimg", "theme_2blogga_2view_2theme_2blog_2default_8php.html#a52d9dd070ed541729088395c22502539", null ],
+ [ "$headimghome", "theme_2blogga_2view_2theme_2blog_2default_8php.html#a1230ab83d4ec9785d8f3a966f33dc5f3", null ]
+]; \ No newline at end of file
diff --git a/doc/html/theme_2redbasic_2php_2theme__init_8php.html b/doc/html/theme_2redbasic_2php_2theme__init_8php.html
new file mode 100644
index 000000000..078c11e4a
--- /dev/null
+++ b/doc/html/theme_2redbasic_2php_2theme__init_8php.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/redbasic/php/theme_init.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('theme_2redbasic_2php_2theme__init_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">theme_init.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/theme_2redstrap_2php_2default_8php.html b/doc/html/theme_2redstrap_2php_2default_8php.html
new file mode 100644
index 000000000..021a442d1
--- /dev/null
+++ b/doc/html/theme_2redstrap_2php_2default_8php.html
@@ -0,0 +1,133 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/redstrap/php/default.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rhash-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('theme_2redstrap_2php_2default_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle">
+<div class="title">default.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:a23bc1996b18e69c1a3ab44536613a762"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="theme_2redstrap_2php_2default_8php.html#a23bc1996b18e69c1a3ab44536613a762">if</a> (<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>($<a class="el" href="mod__register_8php.html#a8db1899eeeb44dabd0904065b63627bb">page</a>,'htmlhead')) echo $<a class="el" href="mod__register_8php.html#a8db1899eeeb44dabd0904065b63627bb">page</a>['htmlhead']?&gt;&lt;/head &gt;&lt; body &gt;&lt;?php if(<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>($<a class="el" href="mod__register_8php.html#a8db1899eeeb44dabd0904065b63627bb">page</a></td></tr>
+<tr class="separator:a23bc1996b18e69c1a3ab44536613a762"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Variable Documentation</h2>
+<a class="anchor" id="a23bc1996b18e69c1a3ab44536613a762"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">if(<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>($<a class="el" href="mod__register_8php.html#a8db1899eeeb44dabd0904065b63627bb">page</a>,'htmlhead')) echo $<a class="el" href="mod__register_8php.html#a8db1899eeeb44dabd0904065b63627bb">page</a>['htmlhead']?&gt;&lt;/head &gt;&lt; body &gt;&lt;?php if(<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>($<a class="el" href="mod__register_8php.html#a8db1899eeeb44dabd0904065b63627bb">page</a></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/theme_2redstrap_2php_2default_8php.js b/doc/html/theme_2redstrap_2php_2default_8php.js
new file mode 100644
index 000000000..2de3bcbba
--- /dev/null
+++ b/doc/html/theme_2redstrap_2php_2default_8php.js
@@ -0,0 +1,4 @@
+var theme_2redstrap_2php_2default_8php =
+[
+ [ "if", "theme_2redstrap_2php_2default_8php.html#a23bc1996b18e69c1a3ab44536613a762", null ]
+]; \ No newline at end of file
diff --git a/doc/html/theme_2redstrap_2php_2theme__init_8php.html b/doc/html/theme_2redstrap_2php_2theme__init_8php.html
new file mode 100644
index 000000000..01523bbaf
--- /dev/null
+++ b/doc/html/theme_2redstrap_2php_2theme__init_8php.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/redstrap/php/theme_init.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rhash-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('theme_2redstrap_2php_2theme__init_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">theme_init.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/theme_8php.html b/doc/html/theme_8php.html
new file mode 100644
index 000000000..4d2c3a1e3
--- /dev/null
+++ b/doc/html/theme_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Project: view/theme/redbasic/php/theme.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="r!-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Project
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('theme_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">theme.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:af6eb813e9fc7e2d76ac1b82bc5c0ed9b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="theme_8php.html#af6eb813e9fc7e2d76ac1b82bc5c0ed9b">redbasic_init</a> (&amp;$a)</td></tr>
+<tr class="separator:af6eb813e9fc7e2d76ac1b82bc5c0ed9b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="af6eb813e9fc7e2d76ac1b82bc5c0ed9b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">redbasic_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/theme_8php.js b/doc/html/theme_8php.js
new file mode 100644
index 000000000..2a9bf5efa
--- /dev/null
+++ b/doc/html/theme_8php.js
@@ -0,0 +1,4 @@
+var theme_8php =
+[
+ [ "redbasic_init", "theme_8php.html#af6eb813e9fc7e2d76ac1b82bc5c0ed9b", null ]
+]; \ No newline at end of file
diff --git a/doc/html/theme__init_8php.html b/doc/html/theme__init_8php.html
new file mode 100644
index 000000000..262bf0941
--- /dev/null
+++ b/doc/html/theme__init_8php.html
@@ -0,0 +1,136 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/php/theme_init.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rhash-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('theme__init_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle">
+<div class="title">theme_init.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:a54f32c086fe209c99769a4c4047dd864"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="theme__init_8php.html#a54f32c086fe209c99769a4c4047dd864">$channel</a> = <a class="el" href="boot_8php.html#a0e6db7e365f2b041a828b93786f694bc">get_app</a>()-&gt;get_channel()</td></tr>
+<tr class="separator:a54f32c086fe209c99769a4c4047dd864"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Variable Documentation</h2>
+<a class="anchor" id="a54f32c086fe209c99769a4c4047dd864"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$channel = <a class="el" href="boot_8php.html#a0e6db7e365f2b041a828b93786f694bc">get_app</a>()-&gt;get_channel()</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Those who require this feature will know what to do with it. Those who don't, won't. Eventually this functionality needs to be provided by a module such that permissions can be enforced. At the moment it's more of a proof of concept; but sufficient for our immediate needs. </p>
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#a176c448d79c211ad41c2bbe3124658f5">api_call()</a>, <a class="el" href="include_2api_8php.html#afb99daa6b731bf497b81f2128084852c">api_user()</a>, <a class="el" href="include_2attach_8php.html#ab6830b3ab74a5d284876141ac80f6cbc">attach_mkdir()</a>, <a class="el" href="include_2attach_8php.html#a84a8a64c4805e1525b42d4add464833f">attach_store()</a>, <a class="el" href="blocks_8php.html#a2531a8fd51db3cecb2eb20c002c66e12">blocks_content()</a>, <a class="el" href="zot_8php.html#ac34e479d27f32b82dd6b33542f81a6a7">build_sync_packet()</a>, <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>, <a class="el" href="channel_8php.html#ac7c8c7845741baadf87fae6bc279f3dc">channel_init()</a>, <a class="el" href="Contact_8php.html#a186162051a5127069cc851d78740f205">channel_remove()</a>, <a class="el" href="connections_8php.html#aec2e457420fce3e3bf6a9f48e36df25c">connections_content()</a>, <a class="el" href="connections_8php.html#a1f23623f802af7bd35e95b0e94e5d558">connections_init()</a>, <a class="el" href="connections_8php.html#a1224058db8e3fb56463eb312f98e561d">connections_post()</a>, <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation()</a>, <a class="el" href="text_8php.html#a87a3cefc603302c78982f1d8e1245265">design_tools()</a>, <a class="el" href="include_2directory_8php.html#aa75d3b0697ca1456aaabdb37a74aa0f0">directory_run()</a>, <a class="el" href="display_8php.html#a37137c98d47bf3306f4c2bb9f5b60de0">display_content()</a>, <a class="el" href="editblock_8php.html#abbe8f55de06967bc8d79d620509a49e6">editblock_content()</a>, <a class="el" href="editlayout_8php.html#aa877e4157a26b099de904164181dd386">editlayout_content()</a>, <a class="el" href="editpost_8php.html#a34011690864d122680c802e9e748ccfb">editpost_content()</a>, <a class="el" href="editwebpage_8php.html#a375e945255fad79a71036528f7480650">editwebpage_content()</a>, <a class="el" href="events_8php.html#a1d293fb217ae6bc9e3858c4b32e363ec">events_content()</a>, <a class="el" href="events_8php.html#ab3e8a8f901175f8e40a8089eea45c075">events_post()</a>, <a class="el" href="feed_8php.html#af86137700b56f33d1d5f25c8dec22c04">feed_init()</a>, <a class="el" href="item_8php.html#a3daae7944f737bd30412a0d042207c0f">fix_attached_file_permissions()</a>, <a class="el" href="boot_8php.html#aca5e42678e178c6b9034610d66666fd7">fix_system_urls()</a>, <a class="el" href="items_8php.html#a04a35b610acfe54434df08adec39c0c7">get_feed_for()</a>, <a class="el" href="items_8php.html#a079e099e15d88d47aeb6ca6d60da7107">get_public_feed()</a>, <a class="el" href="import_8php.html#af17fef0410518f7eac205d0ea416eaa2">import_post()</a>, <a class="el" href="invite_8php.html#a244385b28cfd021d308715f01158bfd9">invite_content()</a>, <a class="el" href="conversation_8php.html#aacbb12d372d5e9c3ab0735b4aea48fb3">item_photo_menu()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">item_store()</a>, <a class="el" href="items_8php.html#acf0bf7c9d21ac84f32effb754f7ad484">item_store_update()</a>, <a class="el" href="items_8php.html#a756738301f2ed96be50232500677d58a">items_fetch()</a>, <a class="el" href="lastpost_8php.html#a82f14cce5d3cfe27f40bdbd2c679d493">lastpost_content()</a>, <a class="el" href="lastpost_8php.html#ab4c6ebd25736af678e64d55ce508ce8c">lastpost_init()</a>, <a class="el" href="layouts_8php.html#a6e0193759ad9eef76d3df2db24237b50">layouts_content()</a>, <a class="el" href="magic_8php.html#acea2cc792849ca2d71d4b689f66518bf">magic_init()</a>, <a class="el" href="mod_2message_8php.html#a3547ed86d09a4bb8fa64ec374a40ee79">message_content()</a>, <a class="el" href="mod_2message_8php.html#a0db7030362a7e9ed9549b341d7b35718">message_post()</a>, <a class="el" href="mitem_8php.html#a6ee694cca4b551a20d7c7a94b5243ec1">mitem_post()</a>, <a class="el" href="mood_8php.html#a7ae136dd7476865b4828136175db5022">mood_init()</a>, <a class="el" href="nav_8php.html#a43be0df73b90647ea70947ce004e231e">nav()</a>, <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>, <a class="el" href="mod_2network_8php.html#a180fce90ad11d7e0e45be094da7149ec">network_init()</a>, <a class="el" href="include_2follow_8php.html#ae387d4ae097c23d69f3247e7f08140c7">new_contact()</a>, <a class="el" href="notifier_8php.html#a568c502f626cff95e344c0748938b85d">notifier_run()</a>, <a class="el" href="include_2photos_8php.html#a6c40ef58aefef705a5adc84a40e97109">photo_upload()</a>, <a class="el" href="include_2photos_8php.html#aedccaf18282b26899d9549c29bd9d1b9">photos_albums_list()</a>, <a class="el" href="include_2photos_8php.html#ad648c0c5544fe9263409b6f6e57c6274">photos_create_item()</a>, <a class="el" href="include_2photos_8php.html#aa27b9e435dcc34e1009f56dc02c7ca51">photos_list_photos()</a>, <a class="el" href="ping_8php.html#a77217b1b190b4c5d8770867b45f0c0a1">ping_init()</a>, <a class="el" href="poke_8php.html#a9725aab97b3983e6a98bd81c4efe7d3b">poke_init()</a>, <a class="el" href="items_8php.html#a410f9c743877c125ca06312373346903">post_activity_item()</a>, <a class="el" href="probe_8php.html#a1f1db3fa6038e451e737964c94bf5e99">probe_content()</a>, <a class="el" href="zot_8php.html#ac301c67864917c35922257950ae0f95c">process_channel_sync_delivery()</a>, <a class="el" href="zot_8php.html#a37ec13b18057634eadb071f05297f5e1">process_delivery()</a>, <a class="el" href="zot_8php.html#aa6ae96db8cbbdbb10e6876d206bbf7cc">process_mail_delivery()</a>, <a class="el" href="profile_8php.html#ab5d0246be0552e2182a585c1206d22a5">profile_init()</a>, <a class="el" href="profile__photo_8php.html#a140631c56438fbfacb61a1eb43067d02">profile_photo_init()</a>, <a class="el" href="profile__photo_8php.html#a4b80234074bd603221aa5364f330e479">profile_photo_post()</a>, <a class="el" href="boot_8php.html#a1dfcb5146e9d1eca4528bc580ad5d273">profile_tabs()</a>, <a class="el" href="profiles_8php.html#ab0362c81b1d3b0b12a772b9fac446e04">profiles_post()</a>, <a class="el" href="rpost_8php.html#a8190354d789000806d9879aea276728f">rpost_content()</a>, <a class="el" href="include_2message_8php.html#a751ffd6635022b2190f56154ee745752">send_message()</a>, <a class="el" href="settings_8php.html#ae5aebccb006bee1300078576baaf5582">settings_aside()</a>, <a class="el" href="settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586">settings_post()</a>, <a class="el" href="sources_8php.html#ac73298ff162ce7b2de8dcaf3d3305b1e">sources_post()</a>, <a class="el" href="tagger_8php.html#a0e4a3eb177d1684553c547503d67161c">tagger_content()</a>, <a class="el" href="thing_8php.html#a8be23b1d475ec3d9291999221c674c80">thing_init()</a>, <a class="el" href="uexport_8php.html#a118920137dedebe0581623a2e57e7b0d">uexport_init()</a>, <a class="el" href="wall__attach_8php.html#a7385e970e93228d082f0fd7254f6e653">wall_attach_post()</a>, <a class="el" href="wall__upload_8php.html#a7cbe204244cf9e0380ee932263a74d8f">wall_upload_post()</a>, <a class="el" href="webpages_8php.html#af3b7397d4abc153e3d2147740ee1a41d">webpages_content()</a>, <a class="el" href="wfinger_8php.html#ae21e50c8d0a5f3c9be9f43a4e519acd3">wfinger_init()</a>, <a class="el" href="zot_8php.html#a3862b3161b2c8557dc1a95020179bd81">zot_build_packet()</a>, <a class="el" href="zot_8php.html#a95528377d7303131958c9f0b7158fdce">zot_finger()</a>, and <a class="el" href="zot_8php.html#a7b23bfb31d4491231e1e73bdc077240d">zot_refresh()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/theme__init_8php.js b/doc/html/theme__init_8php.js
new file mode 100644
index 000000000..5500e5a4f
--- /dev/null
+++ b/doc/html/theme__init_8php.js
@@ -0,0 +1,4 @@
+var theme__init_8php =
+[
+ [ "$channel", "theme__init_8php.html#a54f32c086fe209c99769a4c4047dd864", null ]
+]; \ No newline at end of file
diff --git a/doc/html/thing_8php.html b/doc/html/thing_8php.html
new file mode 100644
index 000000000..f8cfdd7cc
--- /dev/null
+++ b/doc/html/thing_8php.html
@@ -0,0 +1,159 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/thing.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('thing_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">thing.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a8be23b1d475ec3d9291999221c674c80"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="thing_8php.html#a8be23b1d475ec3d9291999221c674c80">thing_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a8be23b1d475ec3d9291999221c674c80"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a24a35f1e64029a67fdbea94a776ae04b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="thing_8php.html#a24a35f1e64029a67fdbea94a776ae04b">thing_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a24a35f1e64029a67fdbea94a776ae04b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a24a35f1e64029a67fdbea94a776ae04b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">thing_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a8be23b1d475ec3d9291999221c674c80"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">thing_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>verbs: [0] = first person singular, e.g. "I want", [1] = 3rd person singular, e.g. "Bill wants" We use the first person form when creating an activity, but the third person for use in activities FIXME: There is no accounting for verb gender for languages where this is significant. We may eventually require <a class="el" href="taxonomy_8php.html#a03f55ee46c5f496e42f3d29db8d09cce">obj_verbs()</a> to provide full conjugations and specify which form to use in the $_REQUEST params to this module.</p>
+<p>The site administrator can do things that normals cannot. This is restricted because it will likely cause an activitystreams protocol violation and the activity might choke in some other network and result in unnecessary support requests. It isn't because we're trying to be heavy-handed about what you can and can't do.</p>
+<p>Things, objects: We do not provide definite (a, an) or indefinite (the) articles or singular/plural designators That needs to be specified in your thing. e.g. Mike has "a carrot", Greg wants "balls", Bob likes "the Boston Red Sox".</p>
+<p>Future work on this module might produce more complex activities with targets, e.g. Phillip likes Karen's moustache and to describe other non-thing objects like channels, such as Karl wants Susan - where Susan represents a channel profile.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/thing_8php.js b/doc/html/thing_8php.js
new file mode 100644
index 000000000..9fe6a8ff6
--- /dev/null
+++ b/doc/html/thing_8php.js
@@ -0,0 +1,5 @@
+var thing_8php =
+[
+ [ "thing_content", "thing_8php.html#a24a35f1e64029a67fdbea94a776ae04b", null ],
+ [ "thing_init", "thing_8php.html#a8be23b1d475ec3d9291999221c674c80", null ]
+]; \ No newline at end of file
diff --git a/doc/html/toggle__mobile_8php.html b/doc/html/toggle__mobile_8php.html
new file mode 100644
index 000000000..5f3db201a
--- /dev/null
+++ b/doc/html/toggle__mobile_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/toggle_mobile.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('toggle__mobile_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">toggle_mobile.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:aca53ade8971802b45c31e722b22c6254"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="toggle__mobile_8php.html#aca53ade8971802b45c31e722b22c6254">toggle_mobile_init</a> (&amp;$a)</td></tr>
+<tr class="separator:aca53ade8971802b45c31e722b22c6254"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="aca53ade8971802b45c31e722b22c6254"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">toggle_mobile_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/toggle__mobile_8php.js b/doc/html/toggle__mobile_8php.js
new file mode 100644
index 000000000..81ee78e90
--- /dev/null
+++ b/doc/html/toggle__mobile_8php.js
@@ -0,0 +1,4 @@
+var toggle__mobile_8php =
+[
+ [ "toggle_mobile_init", "toggle__mobile_8php.html#aca53ade8971802b45c31e722b22c6254", null ]
+]; \ No newline at end of file
diff --git a/doc/html/toggle__safesearch_8php.html b/doc/html/toggle__safesearch_8php.html
new file mode 100644
index 000000000..c91a17ec7
--- /dev/null
+++ b/doc/html/toggle__safesearch_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/toggle_safesearch.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('toggle__safesearch_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">toggle_safesearch.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a23d5cfb2727a266e44993ffbf5595a79"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="toggle__safesearch_8php.html#a23d5cfb2727a266e44993ffbf5595a79">toggle_safesearch_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a23d5cfb2727a266e44993ffbf5595a79"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a23d5cfb2727a266e44993ffbf5595a79"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">toggle_safesearch_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/toggle__safesearch_8php.js b/doc/html/toggle__safesearch_8php.js
new file mode 100644
index 000000000..414a8a12a
--- /dev/null
+++ b/doc/html/toggle__safesearch_8php.js
@@ -0,0 +1,4 @@
+var toggle__safesearch_8php =
+[
+ [ "toggle_safesearch_init", "toggle__safesearch_8php.html#a23d5cfb2727a266e44993ffbf5595a79", null ]
+]; \ No newline at end of file
diff --git a/doc/html/tpldebug_8php.html b/doc/html/tpldebug_8php.html
new file mode 100644
index 000000000..fc1d1a91f
--- /dev/null
+++ b/doc/html/tpldebug_8php.html
@@ -0,0 +1,174 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: util/tpldebug.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('tpldebug_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> &#124;
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle">
+<div class="title">tpldebug.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a44778457a6c02554812fbfad19d32ba3"><td class="memItemLeft" align="right" valign="top"><a class="el" href="typo_8php.html#a329c9c12217d2c8660c47bbc7c8df4c5">foreach</a>($files as $file)&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tpldebug_8php.html#a44778457a6c02554812fbfad19d32ba3">print_template</a> ($s)</td></tr>
+<tr class="separator:a44778457a6c02554812fbfad19d32ba3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:afbc7aadb3f7ff1edf0aaaa326a42179c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="redbasic_2php_2style_8php.html#a883f9f14e205f7aa7de02c14df67b40a">if</a>($<a class="el" href="boot_8php.html#abc0a90a1a77f5b668aa7e4b57d1776a7">argc</a> &gt; 1)&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tpldebug_8php.html#afbc7aadb3f7ff1edf0aaaa326a42179c">else</a></td></tr>
+<tr class="separator:afbc7aadb3f7ff1edf0aaaa326a42179c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5358407d65f2ca826f96356a6642d149"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tpldebug_8php.html#a5358407d65f2ca826f96356a6642d149">$files</a> = glob('include/*.php')</td></tr>
+<tr class="separator:a5358407d65f2ca826f96356a6642d149"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a44778457a6c02554812fbfad19d32ba3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="typo_8php.html#a329c9c12217d2c8660c47bbc7c8df4c5">foreach</a> ($files as $file) print_template </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Variable Documentation</h2>
+<a class="anchor" id="a5358407d65f2ca826f96356a6642d149"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="typo_8php.html#a329c9c12217d2c8660c47bbc7c8df4c5">foreach</a> ($files as $file) $files = glob('include/*.php')</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="afbc7aadb3f7ff1edf0aaaa326a42179c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="redbasic_2php_2style_8php.html#a883f9f14e205f7aa7de02c14df67b40a">if</a> ($<a class="el" href="boot_8php.html#abc0a90a1a77f5b668aa7e4b57d1776a7">argc</a> &gt; 1) else</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<b>Initial value:</b><div class="fragment"><div class="line">{</div>
+<div class="line"></div>
+<div class="line"></div>
+<div class="line"> echo <span class="stringliteral">&#39;boot.php: templates&#39;</span> . <span class="stringliteral">&quot;\n&quot;</span></div>
+</div><!-- fragment -->
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/tpldebug_8php.js b/doc/html/tpldebug_8php.js
new file mode 100644
index 000000000..2391d96cc
--- /dev/null
+++ b/doc/html/tpldebug_8php.js
@@ -0,0 +1,6 @@
+var tpldebug_8php =
+[
+ [ "print_template", "tpldebug_8php.html#a44778457a6c02554812fbfad19d32ba3", null ],
+ [ "$files", "tpldebug_8php.html#a5358407d65f2ca826f96356a6642d149", null ],
+ [ "else", "tpldebug_8php.html#afbc7aadb3f7ff1edf0aaaa326a42179c", null ]
+]; \ No newline at end of file
diff --git a/doc/html/typo_8php.html b/doc/html/typo_8php.html
new file mode 100644
index 000000000..88f40537c
--- /dev/null
+++ b/doc/html/typo_8php.html
@@ -0,0 +1,193 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: util/typo.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('typo_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle">
+<div class="title">typo.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:acebf83966ef6d7e5645a6b62ba368f9f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="typo_8php.html#acebf83966ef6d7e5645a6b62ba368f9f">$a</a> = new <a class="el" href="classApp.html">App</a>()</td></tr>
+<tr class="separator:acebf83966ef6d7e5645a6b62ba368f9f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9590b15215a21e9b42eb546aeef79704"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="typo_8php.html#a9590b15215a21e9b42eb546aeef79704">$files</a> = glob('include/*.php')</td></tr>
+<tr class="separator:a9590b15215a21e9b42eb546aeef79704"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a329c9c12217d2c8660c47bbc7c8df4c5"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="typo_8php.html#a329c9c12217d2c8660c47bbc7c8df4c5">foreach</a> ($files as $file) = glob('mod/*.php')</td></tr>
+<tr class="separator:a329c9c12217d2c8660c47bbc7c8df4c5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1b709c1d79631ebc8320b41bda028b54"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="typo_8php.html#a1b709c1d79631ebc8320b41bda028b54">$dirs</a> = glob('addon/*')</td></tr>
+<tr class="separator:a1b709c1d79631ebc8320b41bda028b54"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3ecd17ac846be1b35f3662f5c12ab6bd"><td class="memItemLeft" align="right" valign="top"><a class="el" href="redbasic_2php_2style_8php.html#ab3afb90d611eca90819f597a2c0bb459">else</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="typo_8php.html#a3ecd17ac846be1b35f3662f5c12ab6bd">$phpath</a> = 'php'</td></tr>
+<tr class="separator:a3ecd17ac846be1b35f3662f5c12ab6bd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Variable Documentation</h2>
+<a class="anchor" id="acebf83966ef6d7e5645a6b62ba368f9f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$a = new <a class="el" href="classApp.html">App</a>()</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classFriendicaSmarty.html#af12091b920b95eeef1218cbc48066ca6">FriendicaSmarty\__construct()</a>, <a class="el" href="classItem.html#a248f45871ecfe82a08d1d4c0769b2eb2">Item\__construct()</a>, <a class="el" href="classFriendicaSmartyEngine.html#ab7c305bd8c386c2944e4dc9136cea5b6">FriendicaSmartyEngine\__construct()</a>, <a class="el" href="classTemplate.html#ae0836e7d5bd5afceb04f50fd635f1228">Template\_replcb_if()</a>, <a class="el" href="classTemplate.html#a86e8fd27955ef10cadfd86f3fca70677">Template\_replcb_inc()</a>, <a class="el" href="__well__known_8php.html#a6ebfa937a2024f0b5dab53f0ac90fed0">_well_known_init()</a>, <a class="el" href="Contact_8php.html#a024919623a830e8703ac4f23496dd66c">abook_toggle_flag()</a>, <a class="el" href="achievements_8php.html#a35ae04ada0e227d19671f289a32fb30e">achievements_content()</a>, <a class="el" href="acl_8php.html#ac6776dba871806ecdb5d1659bc2eb07a">acl_init()</a>, <a class="el" href="admin_8php.html#afef415e4011607fbb665610441595015">admin_content()</a>, <a class="el" href="admin_8php.html#aaa6addf2dbc3f3fcf99244a56b41eade">admin_page_dbsync()</a>, <a class="el" href="admin_8php.html#a6943543f3138f6ee182cb701f415d1cc">admin_page_hubloc()</a>, <a class="el" href="admin_8php.html#a1d1362698af14d209aa3a0fb655551dd">admin_page_logs()</a>, <a class="el" href="admin_8php.html#a233b7c8c31776b7020532003c6e44e1c">admin_page_logs_post()</a>, <a class="el" href="admin_8php.html#a54128076986ba80c4a103de3fc3e19a8">admin_page_plugins()</a>, <a class="el" href="admin_8php.html#ac0f3bd12431c056aad77bac9d09fa30e">admin_page_site()</a>, <a class="el" href="admin_8php.html#add865f4ae806ecbf716f423fc3e50e4f">admin_page_site_post()</a>, <a class="el" href="admin_8php.html#ac6e95b920b5abd030cc522964987087a">admin_page_summary()</a>, <a class="el" href="admin_8php.html#af124619fdc278fe2bf14c45ddaa260fb">admin_page_themes()</a>, <a class="el" href="admin_8php.html#a62f10f90c47686c9c3c37c4c03a108d2">admin_page_users()</a>, <a class="el" href="admin_8php.html#a5a696706a3869800e65fb365214241b7">admin_page_users_post()</a>, <a class="el" href="admin_8php.html#acf51f5837a7427832144c2bf7308ada3">admin_post()</a>, <a class="el" href="identity_8php.html#aa870d2c1f558cfd52bef05bc124e8fa4">advanced_profile()</a>, <a class="el" href="include_2network_8php.html#aba38458a2ff2d92d3536488dbb119694">allowed_email()</a>, <a class="el" href="include_2network_8php.html#aee35d9ad6b3f872bfb39ba3598936aa7">allowed_url()</a>, <a class="el" href="text_8php.html#a75c243e06341ec16bd5a44b9b1cacd85">alt_pager()</a>, <a class="el" href="include_2api_8php.html#a864191bb876a515ed71b17e260ef35ad">api_account_verify_credentials()</a>, <a class="el" href="include_2api_8php.html#aa9dc5350b26d6c7727d6c4b641ecba18">api_albums()</a>, <a class="el" href="include_2api_8php.html#a5990101034e7abf6404feba3cd273629">api_apply_template()</a>, <a class="el" href="include_2api_8php.html#a176c448d79c211ad41c2bbe3124658f5">api_call()</a>, <a class="el" href="mod_2api_8php.html#a33315b5bbf5418f6850b2038107b526d">api_content()</a>, <a class="el" href="include_2api_8php.html#a970b02c06dea8b229aa3d5fff9cf4705">api_direct_messages_all()</a>, <a class="el" href="include_2api_8php.html#a7759ccddc8dff012ad168e511ffe5af5">api_direct_messages_box()</a>, <a class="el" href="include_2api_8php.html#a9160288b7ac220635942d8dc209b78c3">api_direct_messages_conversation()</a>, <a class="el" href="include_2api_8php.html#ad2b0192f3006918bea895de8074bf8d2">api_direct_messages_inbox()</a>, <a class="el" href="include_2api_8php.html#a0991f72554f821255397d615e76f3203">api_direct_messages_new()</a>, <a class="el" href="include_2api_8php.html#a58cf4c02ef435996f5c3bc4283d3968d">api_direct_messages_sentbox()</a>, <a class="el" href="include_2api_8php.html#a2c71b1226ef1283b5370bd1c200fee5f">api_favorites()</a>, <a class="el" href="include_2api_8php.html#ab1ecb58954f722444bfe03233345cb1b">api_followers_ids()</a>, <a class="el" href="include_2api_8php.html#a18cab7c6391df5c421753463f5d2a879">api_format_as()</a>, <a class="el" href="include_2api_8php.html#a4c6fb9fb5203aa60f4b3afd4521db8ea">api_format_items()</a>, <a class="el" href="include_2api_8php.html#acafd2899309a005fcb725289173dc7fe">api_friends_ids()</a>, <a class="el" href="include_2api_8php.html#aa40bae797bcd9ccacffdce5a3b5a1afa">api_get_user()</a>, <a class="el" href="include_2api_8php.html#aa49741342ad8ba285737eea1209a37e1">api_item_get_user()</a>, <a class="el" href="include_2api_8php.html#afe534f826e4282b72d66e8cadca7bb73">api_login()</a>, <a class="el" href="include_2api_8php.html#aa6fc3bc8c0fad1d081db0dcc456dd77f">api_photos()</a>, <a class="el" href="mod_2api_8php.html#a6fe77f05c07cb51048df0d557b4b9bd2">api_post()</a>, <a class="el" href="include_2api_8php.html#a6a04b48168ba1d9dd2de3081a630611f">api_rss_extra()</a>, <a class="el" href="include_2api_8php.html#a645397787618b5c548a31e8686e8cca4">api_status_show()</a>, <a class="el" href="include_2api_8php.html#ad4c29f43418f6110f85a6b3998239ab4">api_statuses_destroy()</a>, <a class="el" href="include_2api_8php.html#aa0d6b29fff0344a8e67f3507a6d01410">api_statuses_f()</a>, <a class="el" href="include_2api_8php.html#a6951c690d87775eb37e569c66011988e">api_statuses_followers()</a>, <a class="el" href="include_2api_8php.html#ade742525b2e41c82b090799ef3c51d5e">api_statuses_friends()</a>, <a class="el" href="include_2api_8php.html#a528d8070ee74ea800102936ce73cf366">api_statuses_home_timeline()</a>, <a class="el" href="include_2api_8php.html#a450d8732b7b608f7ac929aee61572b95">api_statuses_mediap()</a>, <a class="el" href="include_2api_8php.html#a8b25a186bd0893f51aa72a62f655735e">api_statuses_mentions()</a>, <a class="el" href="include_2api_8php.html#ad24ce1bf20867add4c9211a8eaf93f22">api_statuses_public_timeline()</a>, <a class="el" href="include_2api_8php.html#ae0fa388479cace9c5a7a45b571ab42f8">api_statuses_repeat()</a>, <a class="el" href="include_2api_8php.html#af6f1d89cdb0a0621025efbec1597bc63">api_statuses_show()</a>, <a class="el" href="include_2api_8php.html#ad4d1634df6b35126552324683caaffa2">api_statuses_update()</a>, <a class="el" href="include_2api_8php.html#a32f0dda848d0c11c727fe1c3e741c283">api_statuses_user_timeline()</a>, <a class="el" href="include_2api_8php.html#a623793229a7256dd31bcfd5ab90eef08">api_statusnet_config()</a>, <a class="el" href="include_2api_8php.html#abe8e929e93f7ab134b1cb1fb30f19a76">api_users_show()</a>, <a class="el" href="apps_8php.html#a546016cb960d0b110ee8e489dfa6c27c">apps_content()</a>, <a class="el" href="view_2theme_2apw_2php_2config_8php.html#a8b51951a70e1c1324be71345a61d70ec">apw_form()</a>, <a class="el" href="items_8php.html#a275108c050f7eb18bcbb5018e6b81cf6">atom_entry()</a>, <a class="el" href="text_8php.html#a95fd2f8f23a1948414a03ebc963bac57">attribute_contains()</a>, <a class="el" href="security_8php.html#adc7bf51e3b8d67bd80e9348f9ab03733">authenticate_success()</a>, <a class="el" href="include_2network_8php.html#ab07ce9d75eae559865ed90aad2154bd7">avatar_img()</a>, <a class="el" href="bbcode_8php.html#a009f61aaf78771737ed0765c8463911b">bbcode()</a>, <a class="el" href="conversation_8php.html#ad470fc7766f0db66d138fa1916c7a8b7">best_link_url()</a>, <a class="el" href="blocks_8php.html#a2531a8fd51db3cecb2eb20c002c66e12">blocks_content()</a>, <a class="el" href="blogga_2php_2theme_8php.html#aa55c1cb1f05087b5002ecb633b550b1b">blog_init()</a>, <a class="el" href="blogga_2view_2theme_2blog_2theme_8php.html#a028ae8e9f2824670dfa76a6651d817e5">blogtheme_display_item()</a>, <a class="el" href="view_2theme_2blogga_2php_2config_8php.html#a8a311a402d3e746ce53fadc38e4b2d27">blogtheme_form()</a>, <a class="el" href="blogga_2view_2theme_2blog_2theme_8php.html#af634a3f721c5e238530d0636d33230ec">blogtheme_imgurl()</a>, <a class="el" href="zot_8php.html#ac34e479d27f32b82dd6b33542f81a6a7">build_sync_packet()</a>, <a class="el" href="datetime_8php.html#aea356409ba69f9de412298c998595dd2">cal()</a>, <a class="el" href="plugin_8php.html#a7f05de16c0a32602853b09b99dd85e7c">call_hooks()</a>, <a class="el" href="contact__widgets_8php.html#a165eb021e61c4dcab2a552f28628d353">categories_widget()</a>, <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>, <a class="el" href="channel_8php.html#ac7c8c7845741baadf87fae6bc279f3dc">channel_init()</a>, <a class="el" href="Contact_8php.html#a186162051a5127069cc851d78740f205">channel_remove()</a>, <a class="el" href="chanview_8php.html#a4192c6da888c8c1165851acf9ad4cb8b">chanview_content()</a>, <a class="el" href="boot_8php.html#a4c02d88e66852a01bd5a1feecb7c3ce3">check_config()</a>, <a class="el" href="security_8php.html#a9c6180e82150a5a9af91a1255d096b5c">check_form_security_token()</a>, <a class="el" href="security_8php.html#a444ac867dfa8c37cf0a7a226412bee28">check_form_security_token_ForbiddenOnErr()</a>, <a class="el" href="security_8php.html#a77ba0d1889a39cf32434c5ce96fe1433">check_form_security_token_redirectOnErr()</a>, <a class="el" href="setup_8php.html#a0c3f3b671381f6dccd924b8ecdfc56c4">check_htaccess()</a>, <a class="el" href="boot_8php.html#ab79b8b4555cae20d03f8200666d89d63">clean_urls()</a>, <a class="el" href="cli__startup_8php.html#adfdde63686e33ccd4851fa5edc4fc70b">cli_startup()</a>, <a class="el" href="cli__suggest_8php.html#a8f3a60fc96f4bec7d3837c4efc7725f2">cli_suggest_run()</a>, <a class="el" href="cloud_8php.html#a1b79a6fe0454bc76673ad9aef55bf02d">cloud_init()</a>, <a class="el" href="comanche_8php.html#a1fe339e1454803aa502ac89379c17f5b">comanche_menu()</a>, <a class="el" href="comanche_8php.html#a1a208fdb40dd83d6298caec4290ee922">comanche_parser()</a>, <a class="el" href="comanche_8php.html#a028f004d5b8c23d6367816d899e17cfe">comanche_replace_region()</a>, <a class="el" href="comanche_8php.html#a6b0191c1a63db1696a2eb139d90d9e7f">comanche_widget()</a>, <a class="el" href="common_8php.html#ab63408f39abef7a6915186e8dabc5a96">common_content()</a>, <a class="el" href="contact__widgets_8php.html#a552f8544528cec0c995cea7287ea9d65">common_friends_visitor_widget()</a>, <a class="el" href="common_8php.html#aca62f113655809f41f49042ce9b123c2">common_init()</a>, <a class="el" href="community_8php.html#a1197aafd6a6b540dbb4a0c04ade3a25a">community_content()</a>, <a class="el" href="connect_8php.html#a489f0a66c660de6ec4d6917b27674f07">connect_content()</a>, <a class="el" href="connect_8php.html#ad46a38f32fd7a3d324b1fa26373efa36">connect_init()</a>, <a class="el" href="connect_8php.html#a417ec27afe33f21a929667a665e32ee2">connect_post()</a>, <a class="el" href="connections_8php.html#a15af118efee9c948b6f8294e54a73bb2">connections_clone()</a>, <a class="el" href="connections_8php.html#aec2e457420fce3e3bf6a9f48e36df25c">connections_content()</a>, <a class="el" href="connections_8php.html#a1f23623f802af7bd35e95b0e94e5d558">connections_init()</a>, <a class="el" href="connections_8php.html#a1224058db8e3fb56463eb312f98e561d">connections_post()</a>, <a class="el" href="connedit_8php.html#a707ea7e63cf9674025b1d6b081ae74f5">connedit_clone()</a>, <a class="el" href="connedit_8php.html#a795acb3d9d841f55c255d7611681ab67">connedit_content()</a>, <a class="el" href="connedit_8php.html#a4da871e075597a09a8b374b9171dd92e">connedit_init()</a>, <a class="el" href="connedit_8php.html#a234c48426b652bf4d37053f2af329ac5">connedit_post()</a>, <a class="el" href="boot_8php.html#acc4e0c910af066148b810e5fde55fff1">construct_page()</a>, <a class="el" href="text_8php.html#ad6432621d0fafcbcf3d3b9b49bef7784">contact_block()</a>, <a class="el" href="acl__selectors_8php.html#a9476997d2968a5794f3723878ed89c91">contact_select()</a>, <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation()</a>, <a class="el" href="identity_8php.html#a345f4c943d84de502ec6e72d2c813945">create_identity()</a>, <a class="el" href="boot_8php.html#ad206598b909e8eb67eb0e0bb5ef69c13">current_theme()</a>, <a class="el" href="boot_8php.html#a926cad0b3d8b9d9ee5da1898fc063ba3">current_theme_url()</a>, <a class="el" href="include_2config_8php.html#a549910227348003efc3c05c9105c42da">del_config()</a>, <a class="el" href="include_2config_8php.html#a7ad2081c5f812ac4387fd76f3762d941">del_pconfig()</a>, <a class="el" href="include_2config_8php.html#a9c171def547deee16738dc58fdeb4b72">del_xconfig()</a>, <a class="el" href="delegate_8php.html#a943eea8996ef348eb845c498f9f354dd">delegate_content()</a>, <a class="el" href="deliver_8php.html#a397afcb9afecf0c1816b0951189dd346">deliver_run()</a>, <a class="el" href="mod_2directory_8php.html#aac79396570d759da2efac24fcedf5b44">directory_content()</a>, <a class="el" href="mod_2directory_8php.html#a5ee59c213508b6b9787612a8219cb5bf">directory_init()</a>, <a class="el" href="dirsearch_8php.html#a3e51964ae3f5ff147403407b65324752">dirsearch_init()</a>, <a class="el" href="display_8php.html#a37137c98d47bf3306f4c2bb9f5b60de0">display_content()</a>, <a class="el" href="text_8php.html#a0a1f7c0e97f9ecbebf3e5834582b014c">dlogger()</a>, <a class="el" href="items_8php.html#afa1db13c2a8b73b5b17b97f17e5a19d1">drop_item()</a>, <a class="el" href="editblock_8php.html#abbe8f55de06967bc8d79d620509a49e6">editblock_content()</a>, <a class="el" href="editlayout_8php.html#aa877e4157a26b099de904164181dd386">editlayout_content()</a>, <a class="el" href="editpost_8php.html#a34011690864d122680c802e9e748ccfb">editpost_content()</a>, <a class="el" href="editwebpage_8php.html#a375e945255fad79a71036528f7480650">editwebpage_content()</a>, <a class="el" href="event_8php.html#a32ba1b9ddf7a744a9a1512b052e5f850">ev_compare()</a>, <a class="el" href="event_8php.html#a89ef533faf345db8d64a58d4856bde3a">event_store()</a>, <a class="el" href="events_8php.html#a1d293fb217ae6bc9e3858c4b32e363ec">events_content()</a>, <a class="el" href="events_8php.html#ab3e8a8f901175f8e40a8089eea45c075">events_post()</a>, <a class="el" href="text_8php.html#ae4282a39492caa23ccbc2ce98e54f110">expand_acl()</a>, <a class="el" href="include_2group_8php.html#a22a81875259c7d3d64d4848afea6b345">expand_groups()</a>, <a class="el" href="fbrowser_8php.html#aee476addcf7a3e0fe9454f7dfd5a56c4">fbrowser_content()</a>, <a class="el" href="contact__widgets_8php.html#a1eda66319d170f60a8d07c7ece95533b">fileas_widget()</a>, <a class="el" href="filer_8php.html#a5fd5d7e61b2f9c43cb5f110c89dc4274">filer_content()</a>, <a class="el" href="filerm_8php.html#ae2eb28d2054fa2c37e38689882172208">filerm_content()</a>, <a class="el" href="filestorage_8php.html#a61bb1be78472555df4ce619f51014040">filestorage_content()</a>, <a class="el" href="contact__widgets_8php.html#a57e73ebcfd62bb5d8c7a7b9e663726d6">findpeople_widget()</a>, <a class="el" href="items_8php.html#aba98fcbbcd7044a7e9ea34edabc14c87">fix_private_photos()</a>, <a class="el" href="mod_2follow_8php.html#a171f5b19f50d7738adc3b2e96ec6018a">follow_init()</a>, <a class="el" href="bb2diaspora_8php.html#a29a2ad41f5826f3975fa9a49934ff863">format_event_diaspora()</a>, <a class="el" href="fsuggest_8php.html#aa6c49ed4b50a387f1845f36844dd7998">fsuggest_content()</a>, <a class="el" href="fsuggest_8php.html#a61ecfe10ce937ed526614f8fd3de3c7d">fsuggest_post()</a>, <a class="el" href="classBaseObject.html#ac43f10e69ce80c78e4870636250fc8a2">BaseObject\get_app()</a>, <a class="el" href="boot_8php.html#a0e6db7e365f2b041a828b93786f694bc">get_app()</a>, <a class="el" href="language_8php.html#a980dee1d8715a98ab02e36b59facf8ed">get_best_language()</a>, <a class="el" href="identity_8php.html#ad2c97627a313d53df1a1c7b4215ddb51">get_birthdays()</a>, <a class="el" href="classItem.html#a3ee7667c2ec6cd7657328e27848c0bdf">Item\get_comment_box()</a>, <a class="el" href="include_2config_8php.html#af02c96e6b37335774b548914ede1d22e">get_config()</a>, <a class="el" href="boot_8php.html#a899d24fd074594ceebbf72e1feff335f">get_custom_nav()</a>, <a class="el" href="identity_8php.html#ae381db3d43f8e7c1da8b15d14ecf5312">get_events()</a>, <a class="el" href="security_8php.html#acd06ef411116115c2f0a92633700db8a">get_form_security_token()</a>, <a class="el" href="classFriendicaSmartyEngine.html#a35ec0ee828c36640ea25296bcb84a118">FriendicaSmartyEngine\get_intltext_template()</a>, <a class="el" href="plugin_8php.html#acb63c27d07f6d7dffe95f98a6cef1295">get_intltext_template()</a>, <a class="el" href="plugin_8php.html#a75f7dfed291fd7add7fc85b5c022a1f4">get_markup_template()</a>, <a class="el" href="include_2config_8php.html#ad58a4913937179adb13201c2ee3261ad">get_pconfig()</a>, <a class="el" href="text_8php.html#aac0969ae09853205992ba06ab9f9f61a">get_plink()</a>, <a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">Item\get_template_data()</a>, <a class="el" href="plugin_8php.html#a48047edfbef770125a5508dcc2f9282f">get_theme_screenshot()</a>, <a class="el" href="include_2config_8php.html#aa3dc1d3de2d091ac702e675acd3a085e">get_xconfig()</a>, <a class="el" href="gprobe_8php.html#adf72cb0a70b5b9d99fdec1cc60e18ed1">gprobe_run()</a>, <a class="el" href="mod_2group_8php.html#a07a64f6c65b0080d8190b3d9728a7a83">group_content()</a>, <a class="el" href="mod_2group_8php.html#aed1f009b1221348021bb34761160ef35">group_post()</a>, <a class="el" href="acl__selectors_8php.html#aa1e3bc344ca2b29f97eb9860216d21a0">group_select()</a>, <a class="el" href="photo__driver_8php.html#a243cee492ce443afb6a7d77d54b6c4aa">guess_image_type()</a>, <a class="el" href="item_8php.html#aa22feef4de326e1d7078dedd892e615c">handle_tag()</a>, <a class="el" href="boot_8php.html#a24a7a70afedd5d85fe0eadc85afa9f77">head_get_icon()</a>, <a class="el" href="plugin_8php.html#a9ab6caae31935f6cf781ce7872db7cdf">head_remove_css()</a>, <a class="el" href="plugin_8php.html#a4a0ae7b881e7c8af99a69e3b03f898b4">head_remove_js()</a>, <a class="el" href="boot_8php.html#a0e4701c9742c3ef88f02ac450a042a84">head_set_icon()</a>, <a class="el" href="help_8php.html#af055e15f600ffa6fbca9386fdf715224">help_content()</a>, <a class="el" href="home_8php.html#aa1cf697851a646755baf537f75334c46">home_content()</a>, <a class="el" href="home_8php.html#ac4642c38b6f23a8d065dd4a75c620bde">home_init()</a>, <a class="el" href="hostxrd_8php.html#aa37ffc8e7900bc76c4828bd25916db92">hostxrd_init()</a>, <a class="el" href="photo__driver_8php.html#a1d0bc7161dec0d177b7d3bbe4421af9a">import_channel_photo()</a>, <a class="el" href="import_8php.html#af17fef0410518f7eac205d0ea416eaa2">import_post()</a>, <a class="el" href="photo__driver_8php.html#a78f5a10c568d2a9bbbb129dc96548887">import_profile_photo()</a>, <a class="el" href="boot_8php.html#adfb2fc7be5a4226c0a8e24131da9d498">info()</a>, <a class="el" href="plugin_8php.html#aeaebe63dcf6fa2794f363ba2bc0b2c6b">insert_hook()</a>, <a class="el" href="invite_8php.html#a244385b28cfd021d308715f01158bfd9">invite_content()</a>, <a class="el" href="invite_8php.html#aeb0881c0f93c8e8552e5ed756ce6e5a5">invite_post()</a>, <a class="el" href="boot_8php.html#aa1e828bbbcba170265eb2668d8daf42e">is_site_admin()</a>, <a class="el" href="item_8php.html#a764bbb2e9a885a86fb23d0b5e4a09221">item_content()</a>, <a class="el" href="conversation_8php.html#aacbb12d372d5e9c3ab0735b4aea48fb3">item_photo_menu()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="items_8php.html#a756738301f2ed96be50232500677d58a">items_fetch()</a>, <a class="el" href="text_8php.html#a71f6952243d3fe1c5a8154f78027e29c">lang_selector()</a>, <a class="el" href="layouts_8php.html#a6e0193759ad9eef76d3df2db24237b50">layouts_content()</a>, <a class="el" href="like_8php.html#a9d7dd268f21c21e9d29dd2aca2dd9538">like_content()</a>, <a class="el" href="conversation_8php.html#afe5b2f38d8b803edb0d7ec5fa2868db0">like_puller()</a>, <a class="el" href="text_8php.html#a47c1e4a5f3f53027daacd8a9db24f285">link_compare()</a>, <a class="el" href="include_2config_8php.html#a27559f388c9b9af81c94e48d6889d1d1">load_config()</a>, <a class="el" href="boot_8php.html#a719c7f3972d5f9268f37a41c76cd4ef6">load_contact_links()</a>, <a class="el" href="setup_8php.html#ad2e0375a9ab87ebe6e78124ee125054a">load_database()</a>, <a class="el" href="plugin_8php.html#a326365e48ef94f0b9a0a771b8d75e813">load_hooks()</a>, <a class="el" href="include_2config_8php.html#ac543813a980b3841cc5a277fcd4a24a6">load_pconfig()</a>, <a class="el" href="language_8php.html#a7e9904c730bb24ddcb0ff50fc96f6b05">load_translation_table()</a>, <a class="el" href="include_2config_8php.html#a55bbed9a014c9109c767486834f3ca33">load_xconfig()</a>, <a class="el" href="text_8php.html#a030fa5ecc64168af0c4f44897a9bce63">logger()</a>, <a class="el" href="boot_8php.html#aefecf8599036df7f1b95d6820e0e2fa4">login()</a>, <a class="el" href="login_8php.html#a1d69ca88eb9005a7026e128b9a645904">login_content()</a>, <a class="el" href="classFKOAuth1.html#a2b1dac2ed31fc6ef84668afdda8b263f">FKOAuth1\loginUser()</a>, <a class="el" href="lostpass_8php.html#a0314d94e48c789b1b3a201d740c9eab3">lostpass_content()</a>, <a class="el" href="lostpass_8php.html#a8ed35ba71a4404eaf4903da61d0321cc">lostpass_post()</a>, <a class="el" href="magic_8php.html#acea2cc792849ca2d71d4b689f66518bf">magic_init()</a>, <a class="el" href="mail_8php.html#a3c7c485fc69f92371e8b20936040eca1">mail_content()</a>, <a class="el" href="mail_8php.html#acfc2cc0bf4e0b178207758384977f25a">mail_post()</a>, <a class="el" href="setup_8php.html#abe405d227ba7232971964a706d4f3bce">manual_config()</a>, <a class="el" href="match_8php.html#a1dd853e959b9e70c1911bb2fb5f5130d">match_content()</a>, <a class="el" href="mod_2message_8php.html#ac72dfed3ce08fcb331d66b37edc6e15f">message_content()</a>, <a class="el" href="mitem_8php.html#a7a31b702ecad18eeb6a38b243ff0037e">mitem_content()</a>, <a class="el" href="mitem_8php.html#a9627cd857cafdf04e4fc0ae48c8e8518">mitem_init()</a>, <a class="el" href="mitem_8php.html#a6ee694cca4b551a20d7c7a94b5243ec1">mitem_post()</a>, <a class="el" href="mood_8php.html#a7ae136dd7476865b4828136175db5022">mood_init()</a>, <a class="el" href="msearch_8php.html#ac80d2a6c0a92e79eec7efbbccd74d9a8">msearch_post()</a>, <a class="el" href="nav_8php.html#a43be0df73b90647ea70947ce004e231e">nav()</a>, <a class="el" href="nav_8php.html#ac3c920ce3ea5b0d9e0678ee37155f06a">nav_set_selected()</a>, <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>, <a class="el" href="mod_2network_8php.html#a180fce90ad11d7e0e45be094da7149ec">network_init()</a>, <a class="el" href="include_2follow_8php.html#ae387d4ae097c23d69f3247e7f08140c7">new_contact()</a>, <a class="el" href="boot_8php.html#a9255af5ae9c887520091ea04763c1a88">notice()</a>, <a class="el" href="enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc">notification()</a>, <a class="el" href="notifications_8php.html#aadd0b5525bd8c283a5d8a37982bbfe62">notifications_content()</a>, <a class="el" href="notifications_8php.html#a5baffec7b2e625c9f9cefbc097550d33">notifications_post()</a>, <a class="el" href="notifier_8php.html#a568c502f626cff95e344c0748938b85d">notifier_run()</a>, <a class="el" href="mod_2notify_8php.html#acdf3851688ebd6d6a575eb84ef9febe3">notify_content()</a>, <a class="el" href="mod_2notify_8php.html#a94f9a6a9d4b5fd704baafff0c34f41ae">notify_init()</a>, <a class="el" href="include_2oembed_8php.html#a98549b9af8140eda3eceaeedcaabc2c2">oembed_fetch_url()</a>, <a class="el" href="include_2oembed_8php.html#a26bb4c1e330d2f94ea7b6ce2fe970cf3">oembed_format_object()</a>, <a class="el" href="include_2oembed_8php.html#a9e57f3e36a0a0a47e6db79544b701d9a">oembed_iframe()</a>, <a class="el" href="oexchange_8php.html#a2d8b785cd7d041a4e6274f5af370cf26">oexchange_content()</a>, <a class="el" href="oexchange_8php.html#ac8e2e469ddc3db984b0c1b44558aca59">oexchange_init()</a>, <a class="el" href="onedirsync_8php.html#a411aedd47c57476099647961e6a86691">onedirsync_run()</a>, <a class="el" href="onepoll_8php.html#a72753b2fdec79b37c7f432035c91fb6d">onepoll_run()</a>, <a class="el" href="opensearch_8php.html#ad13034877a496565ac7d99e9fc6f55e9">opensearch_init()</a>, <a class="el" href="page_8php.html#a91a5f649f68406149108bded1dc90b22">page_content()</a>, <a class="el" href="page_8php.html#a4d89800c0366a239191b1692c09635cf">page_init()</a>, <a class="el" href="text_8php.html#afe9f178d264d44a94dc1292aaf0fd585">paginate()</a>, <a class="el" href="photo_8php.html#a582779d24882b0d31ee909a91d70a448">photo_init()</a>, <a class="el" href="mod_2photos_8php.html#aa87382611a66ec5effdb2d78f13f5812">photos_content()</a>, <a class="el" href="mod_2photos_8php.html#ab950295cd77626f5fe65331a87693014">photos_init()</a>, <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>, <a class="el" href="ping_8php.html#a77217b1b190b4c5d8770867b45f0c0a1">ping_init()</a>, <a class="el" href="poco_8php.html#a53def16f75e3d41f1d2bb7cfa4905498">poco_init()</a>, <a class="el" href="socgraph_8php.html#a5ef8bef37161df53718a21e93d02fbd6">poco_load()</a>, <a class="el" href="poke_8php.html#a9725aab97b3983e6a98bd81c4efe7d3b">poke_init()</a>, <a class="el" href="poller_8php.html#a5f12df3a4738124b6c039971e87e76da">poller_run()</a>, <a class="el" href="language_8php.html#a78bd204955ec4cc3a9ac651285a1689d">pop_lang()</a>, <a class="el" href="post_8php.html#af4b48181ce773ef0cdfc972441445c34">post_init()</a>, <a class="el" href="text_8php.html#ac19d2b33a58372a357a43d51eed19162">preg_heart()</a>, <a class="el" href="text_8php.html#ae4df74296fbe55051ed3c035e55205e5">prepare_body()</a>, <a class="el" href="probe_8php.html#a1f1db3fa6038e451e737964c94bf5e99">probe_content()</a>, <a class="el" href="boot_8php.html#ab346a2ece14993861f3e4206befa94f0">proc_run()</a>, <a class="el" href="activities_8php.html#a80134e807719b3c54aba971958d2e132">profile_activity()</a>, <a class="el" href="profile_8php.html#a3775cf6eef6587e5143133356a7b76c0">profile_content()</a>, <a class="el" href="identity_8php.html#ad4a2c8caca8f6ae93633ebeca0ed6620">profile_create_sidebar()</a>, <a class="el" href="profile_8php.html#ab5d0246be0552e2182a585c1206d22a5">profile_init()</a>, <a class="el" href="identity_8php.html#a4751b522ea913d0e7ed43e03d22e9e68">profile_load()</a>, <a class="el" href="profile__photo_8php.html#a140631c56438fbfacb61a1eb43067d02">profile_photo_init()</a>, <a class="el" href="profile__photo_8php.html#a4b80234074bd603221aa5364f330e479">profile_photo_post()</a>, <a class="el" href="identity_8php.html#a432259b2cf5b6f59be53e71db9f2c7dc">profile_sidebar()</a>, <a class="el" href="profiles_8php.html#a46975783b8b8d70402d51487eb1f0b00">profiles_content()</a>, <a class="el" href="profiles_8php.html#a36f71405ad536228f8bb84a551b23f7e">profiles_init()</a>, <a class="el" href="profiles_8php.html#ab0362c81b1d3b0b12a772b9fac446e04">profiles_post()</a>, <a class="el" href="profperm_8php.html#aef015787de2373d9fb3fe3f814fb5023">profperm_content()</a>, <a class="el" href="profperm_8php.html#a17fb64ec05edee1dc94d95438807d6c6">profperm_init()</a>, <a class="el" href="language_8php.html#ac9142ef1d01a235c760deb0f16643f5a">push_lang()</a>, <a class="el" href="queue_8php.html#af8c93de86d866c3200174c8450a0f341">queue_run()</a>, <a class="el" href="randprof_8php.html#abf5dba3c608b9304cbf68327cd31b090">randprof_init()</a>, <a class="el" href="view_2theme_2redbasic_2php_2config_8php.html#a8574a41fa9735ee391ba57ab24b93793">redbasic_form()</a>, <a class="el" href="register_8php.html#a0e91f57f111407ea8d3223a05022bb2a">register_content()</a>, <a class="el" href="regmod_8php.html#a7953df4e32e63946565e90cdd5d50409">regmod_content()</a>, <a class="el" href="datetime_8php.html#a8ae8dc95ace7ac27fa5a1ecf42b78c82">relative_date()</a>, <a class="el" href="removeme_8php.html#a065a589caa2aa84c60f7073a28f0ad9c">removeme_content()</a>, <a class="el" href="removeme_8php.html#a7be08738beca44bb98a79e01cdb2ee88">removeme_post()</a>, <a class="el" href="text_8php.html#a9c6ce4e12a4ac883c5e3f36fed6e1e09">replace_macros()</a>, <a class="el" href="rmagic_8php.html#a869de069d081b3c4e98b957d06bbf08f">rmagic_post()</a>, <a class="el" href="rpost_8php.html#a8190354d789000806d9879aea276728f">rpost_content()</a>, <a class="el" href="include_2network_8php.html#ae8d9c41a11000fb8667039fc71b4f73f">scale_external_images()</a>, <a class="el" href="text_8php.html#a876e94892867019935b348b573299352">search()</a>, <a class="el" href="search__ac_8php.html#a14f90c83a3f2be095e9e2992a8d66138">search_ac_init()</a>, <a class="el" href="search_8php.html#ab2568591359edde5b483a6cd9a24b2cc">search_content()</a>, <a class="el" href="search_8php.html#acf19fd30f07f495781ca0d7a0a08b435">search_init()</a>, <a class="el" href="text_8php.html#aae91e4d2a2c6f7a9daccd2c186ae3447">searchbox()</a>, <a class="el" href="include_2message_8php.html#a751ffd6635022b2190f56154ee745752">send_message()</a>, <a class="el" href="plugin_8php.html#a030cec6793b909c439c0336ba39b1571">service_class_allows()</a>, <a class="el" href="plugin_8php.html#a905b54e10704b283ac64680a8abc0971">service_class_fetch()</a>, <a class="el" href="include_2config_8php.html#ad6da879e4fb5b37d1e161d4e9be5c32a">set_config()</a>, <a class="el" href="classConversation.html#a66f121ca4026246f86a732e5faa0682c">Conversation\set_mode()</a>, <a class="el" href="include_2config_8php.html#a61591371cb18764138655d67dc817ab2">set_pconfig()</a>, <a class="el" href="include_2config_8php.html#afe117b70f1bba2f6348d9300b601f86e">set_xconfig()</a>, <a class="el" href="settings_8php.html#a3a4cde287482fced008583f54ba2a722">settings_init()</a>, <a class="el" href="settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586">settings_post()</a>, <a class="el" href="setup_8php.html#a88247384a96e14516f474d7af6a465c1">setup_content()</a>, <a class="el" href="setup_8php.html#a13cf286774149a0a7bd8adb8179cec75">setup_post()</a>, <a class="el" href="share_8php.html#afeb26046bdd02567ecd29ab5f188b249">share_init()</a>, <a class="el" href="siteinfo_8php.html#a70c09bfb6dd1c86a125a35f62ed53656">siteinfo_content()</a>, <a class="el" href="siteinfo_8php.html#a3efbd0bd6564af19ec0a9ce0294e59d0">siteinfo_init()</a>, <a class="el" href="text_8php.html#a3d225b253bb9e0f2498c11647d927b0b">smilies()</a>, <a class="el" href="sources_8php.html#ac73298ff162ce7b2de8dcaf3d3305b1e">sources_post()</a>, <a class="el" href="subthread_8php.html#a50368f3d825b77996030528e7fbfa3d3">subthread_content()</a>, <a class="el" href="suggest_8php.html#a58748a8235d4523f8333847f3e42dd91">suggest_content()</a>, <a class="el" href="language_8php.html#aae0c3638fb476ae1e31f8d242f5dac04">t()</a>, <a class="el" href="items_8php.html#ab1bce4261bcf75ad62753b498a144d17">tag_deliver()</a>, <a class="el" href="tagger_8php.html#a0e4a3eb177d1684553c547503d67161c">tagger_content()</a>, <a class="el" href="tagrm_8php.html#adfd4ea5b4d7fc6d9c9e042af5cd7d49a">tagrm_content()</a>, <a class="el" href="tagrm_8php.html#a1702f40aa53a2fa93deade1f609abe78">tagrm_post()</a>, <a class="el" href="taxonomy_8php.html#aaeded36bcc983b35d9205fe5b6c18c43">tags_sort()</a>, <a class="el" href="Contact_8php.html#a38daa1c210b78385307123450ca9a1fc">terminate_friendship()</a>, <a class="el" href="items_8php.html#a88c6cf7649ac836fbbed82a7a0315110">tgroup_check()</a>, <a class="el" href="view_2theme_2blogga_2php_2config_8php.html#a09cd81013505f83aea0771243a1e4e53">theme_admin()</a>, <a class="el" href="view_2theme_2apw_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d">theme_content()</a>, <a class="el" href="plugin_8php.html#a65fedcffbe03562ef844cabee37d34e2">theme_include()</a>, <a class="el" href="thing_8php.html#a8be23b1d475ec3d9291999221c674c80">thing_init()</a>, <a class="el" href="datetime_8php.html#aa51b5a7ea4f931b23acbdfcea46e9865">timezone_cmp()</a>, <a class="el" href="toggle__mobile_8php.html#aca53ade8971802b45c31e722b22c6254">toggle_mobile_init()</a>, <a class="el" href="language_8php.html#ae310fb3880484ee1cc4faefe0c63c06d">tt()</a>, <a class="el" href="uexport_8php.html#a118920137dedebe0581623a2e57e7b0d">uexport_init()</a>, <a class="el" href="update__channel_8php.html#aca52a9da500f0db2f0a8666af5bc06ba">update_channel_content()</a>, <a class="el" href="update__community_8php.html#abdcc5c4ecebbe0b5fcba2755c69cb3b1">update_community_content()</a>, <a class="el" href="update__display_8php.html#aa36ac524059e209d5d75a03c16206246">update_display_content()</a>, <a class="el" href="update__network_8php.html#a8abf5b9f65af6a27ee2f9d7207ed1b41">update_network_content()</a>, <a class="el" href="update__search_8php.html#ace4c3a23fa7d6922399e27c297a6ba52">update_search_content()</a>, <a class="el" href="socgraph_8php.html#a790690bb1a1d02483fe31632a160144d">update_suggestions()</a>, <a class="el" href="account_8php.html#ac5c570a2d46446bad4dd2501e9c5a4b1">user_allow()</a>, <a class="el" href="Contact_8php.html#a6348a532c9d26cd1c9afbc9aa6aa8960">vcard_from_xchan()</a>, <a class="el" href="viewconnections_8php.html#ab6c4d983e97b3a8a879567ff76507776">viewconnections_content()</a>, <a class="el" href="viewconnections_8php.html#a00163d50b17568f7b0e48b1ca9ab7330">viewconnections_init()</a>, <a class="el" href="viewsrc_8php.html#a6eff3d0c1d7d14b335c4edb785cd60a4">viewsrc_content()</a>, <a class="el" href="vote_8php.html#a6aa67489bf458ca5e3206e46dac68596">vote_content()</a>, <a class="el" href="vote_8php.html#ae0c6610f40afbbc1f4fe6494c51fbab2">vote_init()</a>, <a class="el" href="vote_8php.html#a57a9516ee1b923b224e66dcc47377fb2">vote_post()</a>, <a class="el" href="wall__upload_8php.html#a7cbe204244cf9e0380ee932263a74d8f">wall_upload_post()</a>, <a class="el" href="webpages_8php.html#af3b7397d4abc153e3d2147740ee1a41d">webpages_content()</a>, <a class="el" href="wfinger_8php.html#ae21e50c8d0a5f3c9be9f43a4e519acd3">wfinger_init()</a>, <a class="el" href="setup_8php.html#aea1ebdda58ec938f4e7b31aa5c5f6b58">what_next()</a>, <a class="el" href="widgets_8php.html#a7b1e357b5a2027718470b77ec921fc65">widget_archive()</a>, <a class="el" href="widgets_8php.html#af37fdad3b2e861d860a4a8c4d8a76c0b">widget_categories()</a>, <a class="el" href="widgets_8php.html#a145ff35319cfa47a9cc07f9425bd674b">widget_design_tools()</a>, <a class="el" href="widgets_8php.html#a5ab3b64496e02cab56429978ad55f1c0">widget_filer()</a>, <a class="el" href="widgets_8php.html#ad1bf7aa69e8d100d95faba17c7bc91cd">widget_follow()</a>, <a class="el" href="widgets_8php.html#a70442dfa079312d9d5e5ee01be51a165">widget_fullprofile()</a>, <a class="el" href="widgets_8php.html#afa2e55a78f95667a6da082efac7fec74">widget_mailmenu()</a>, <a class="el" href="widgets_8php.html#a702e2fc0adc9b615999eca18b7311b5e">widget_photo_albums()</a>, <a class="el" href="widgets_8php.html#abd2e508a2a0b911c4a838e3cb7599923">widget_profile()</a>, <a class="el" href="widgets_8php.html#a94203eb9bcd63cbdecbbcb15163598d8">widget_savedsearch()</a>, <a class="el" href="widgets_8php.html#aaa73bcf1702eaadd9dcd253502f55e01">widget_settings_menu()</a>, <a class="el" href="widgets_8php.html#a6dbc227aac750774284ee39c45f0a200">widget_tagcloud()</a>, <a class="el" href="widgets_8php.html#ae4ced69d83dbdd9e6b51660d9eba8653">widget_tagcloud_wall()</a>, <a class="el" href="xrd_8php.html#aee3cf087968e4a0ff3a87de16eb23270">xrd_init()</a>, <a class="el" href="include_2network_8php.html#aafd06c0a75402aefb06cfb9f9740fa37">z_fetch_url()</a>, <a class="el" href="boot_8php.html#aba208673515cbb8a55e5fa4a1da99fda">z_path()</a>, <a class="el" href="boot_8php.html#add517a0958ac684792c62142a3877f81">z_root()</a>, <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>, <a class="el" href="identity_8php.html#a680fbafc2db023c5b1309e0180e81315">zid_init()</a>, <a class="el" href="zotfeed_8php.html#a24dfc23d366e7f840cf2847d0c1c8eac">zotfeed_init()</a>, and <a class="el" href="zping_8php.html#a4d3a6b0b8b04ed6469015823e615ee75">zping_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a1b709c1d79631ebc8320b41bda028b54"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$dirs = glob('addon/*')</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a9590b15215a21e9b42eb546aeef79704"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$files = glob('include/*.php')</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a3ecd17ac846be1b35f3662f5c12ab6bd"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="redbasic_2php_2style_8php.html#ab3afb90d611eca90819f597a2c0bb459">else</a> $phpath = 'php'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="setup_8php.html#a14d208682a88632290c895d20da6e7d6">check_php()</a>, <a class="el" href="setup_8php.html#a88247384a96e14516f474d7af6a465c1">setup_content()</a>, and <a class="el" href="setup_8php.html#a13cf286774149a0a7bd8adb8179cec75">setup_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a329c9c12217d2c8660c47bbc7c8df4c5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">foreach = glob('mod/*.php')</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/typo_8php.js b/doc/html/typo_8php.js
new file mode 100644
index 000000000..83a7f7010
--- /dev/null
+++ b/doc/html/typo_8php.js
@@ -0,0 +1,8 @@
+var typo_8php =
+[
+ [ "$a", "typo_8php.html#acebf83966ef6d7e5645a6b62ba368f9f", null ],
+ [ "$dirs", "typo_8php.html#a1b709c1d79631ebc8320b41bda028b54", null ],
+ [ "$files", "typo_8php.html#a9590b15215a21e9b42eb546aeef79704", null ],
+ [ "$phpath", "typo_8php.html#a3ecd17ac846be1b35f3662f5c12ab6bd", null ],
+ [ "foreach", "typo_8php.html#a329c9c12217d2c8660c47bbc7c8df4c5", null ]
+]; \ No newline at end of file
diff --git a/doc/html/typohelper_8php.html b/doc/html/typohelper_8php.html
new file mode 100644
index 000000000..a84627eb5
--- /dev/null
+++ b/doc/html/typohelper_8php.html
@@ -0,0 +1,153 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: util/typohelper.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('typohelper_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle">
+<div class="title">typohelper.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:a7542d95618011800c61773127fa625cf"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="typohelper_8php.html#a7542d95618011800c61773127fa625cf">$str</a></td></tr>
+<tr class="separator:a7542d95618011800c61773127fa625cf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab6fd357fb5b2a3ba8aab9e8b98c6a805"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="typohelper_8php.html#ab6fd357fb5b2a3ba8aab9e8b98c6a805">EOT</a></td></tr>
+<tr class="separator:ab6fd357fb5b2a3ba8aab9e8b98c6a805"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Variable Documentation</h2>
+<a class="anchor" id="a7542d95618011800c61773127fa625cf"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$str</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<b>Initial value:</b><div class="fragment"><div class="line">= &lt;&lt;&lt; <a class="code" href="typohelper_8php.html#ab6fd357fb5b2a3ba8aab9e8b98c6a805">EOT</a></div>
+<div class="line"> error_reporting(E_ERROR | E_WARNING | E_PARSE )</div>
+</div><!-- fragment -->
+<p>Referenced by <a class="el" href="include_2api_8php.html#aea2dda92a155f2843a0ca188d8dfdf25">api_date()</a>, <a class="el" href="setup_8php.html#a14d208682a88632290c895d20da6e7d6">check_php()</a>, <a class="el" href="text_8php.html#a0c65597bb4aed3a039eb795ff540e5e3">check_webbie()</a>, <a class="el" href="dba__driver_8php.html#ab222aa1dbf9ea93b320f82028739127e">dbesc()</a>, <a class="el" href="classdba__mysql.html#a99a7691ea6cb1300031fb6549379066e">dba_mysql\escape()</a>, <a class="el" href="classdba__mysqli.html#a27d6a748af7f80028801306e7ea33f64">dba_mysqli\escape()</a>, <a class="el" href="plugin_8php.html#af92789f559b89a380e49d303218aeeca">head_get_css()</a>, <a class="el" href="plugin_8php.html#a65ab52cb1a7030d5190e247211bef2a1">head_get_js()</a>, <a class="el" href="items_8php.html#acf0bf7c9d21ac84f32effb754f7ad484">item_store_update()</a>, <a class="el" href="setup_8php.html#ad2e0375a9ab87ebe6e78124ee125054a">load_database()</a>, <a class="el" href="include_2photos_8php.html#a7e7abc69872180697c5471dc69349afe">photos_album_get_db_idstr()</a>, <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>, <a class="el" href="items_8php.html#ad2abb4644ff1f20fefbc80326fe01cf0">posted_dates()</a>, <a class="el" href="datetime_8php.html#a8ae8dc95ace7ac27fa5a1ecf42b78c82">relative_date()</a>, <a class="el" href="security_8php.html#ae92c5c1a1cbbc49ddbb8b3265d2db809">stream_perms_api_uids()</a>, <a class="el" href="security_8php.html#a15e0f8f511cc06192db63387f97238b3">stream_perms_xchans()</a>, <a class="el" href="thing_8php.html#a8be23b1d475ec3d9291999221c674c80">thing_init()</a>, and <a class="el" href="text_8php.html#aaed4413ed8918838b517e3b2fafaea0d">xmlify()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ab6fd357fb5b2a3ba8aab9e8b98c6a805"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">EOT</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="nav_8php.html#a43be0df73b90647ea70947ce004e231e">nav()</a>, <a class="el" href="subthread_8php.html#a50368f3d825b77996030528e7fbfa3d3">subthread_content()</a>, and <a class="el" href="system__unavailable_8php.html#a73751a6bcc17ad3ca503496e2fb020fa">system_down()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/typohelper_8php.js b/doc/html/typohelper_8php.js
new file mode 100644
index 000000000..7fb5a8d08
--- /dev/null
+++ b/doc/html/typohelper_8php.js
@@ -0,0 +1,5 @@
+var typohelper_8php =
+[
+ [ "$str", "typohelper_8php.html#a7542d95618011800c61773127fa625cf", null ],
+ [ "EOT", "typohelper_8php.html#ab6fd357fb5b2a3ba8aab9e8b98c6a805", null ]
+]; \ No newline at end of file
diff --git a/doc/html/uexport_8php.html b/doc/html/uexport_8php.html
new file mode 100644
index 000000000..ac904249a
--- /dev/null
+++ b/doc/html/uexport_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/uexport.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('uexport_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">uexport.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a118920137dedebe0581623a2e57e7b0d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="uexport_8php.html#a118920137dedebe0581623a2e57e7b0d">uexport_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a118920137dedebe0581623a2e57e7b0d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a118920137dedebe0581623a2e57e7b0d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">uexport_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/uexport_8php.js b/doc/html/uexport_8php.js
new file mode 100644
index 000000000..05a236df8
--- /dev/null
+++ b/doc/html/uexport_8php.js
@@ -0,0 +1,4 @@
+var uexport_8php =
+[
+ [ "uexport_init", "uexport_8php.html#a118920137dedebe0581623a2e57e7b0d", null ]
+]; \ No newline at end of file
diff --git a/doc/html/update__channel_8php.html b/doc/html/update__channel_8php.html
new file mode 100644
index 000000000..db2663d76
--- /dev/null
+++ b/doc/html/update__channel_8php.html
@@ -0,0 +1,141 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/update_channel.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('update__channel_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">update_channel.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:aca52a9da500f0db2f0a8666af5bc06ba"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="update__channel_8php.html#aca52a9da500f0db2f0a8666af5bc06ba">update_channel_content</a> (&amp;$a)</td></tr>
+<tr class="separator:aca52a9da500f0db2f0a8666af5bc06ba"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="aca52a9da500f0db2f0a8666af5bc06ba"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">update_channel_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Module: update_profile Purpose: AJAX synchronisation of profile page </p>
+<p>We can remove this hack once Internet Explorer recognises HTML5 natively</p>
+<p>Grab the page inner contents by calling the content function from the profile module directly, but move any image src attributes to another attribute name. This is because some browsers will prefetch all the images for the page even if we don't need them. The only ones we need to fetch are those for new page additions, which we'll discover on the client side and then swap the image back.</p>
+<p>reportedly some versions of MSIE don't handle tabs in XMLHttpRequest documents very well</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/update__channel_8php.js b/doc/html/update__channel_8php.js
new file mode 100644
index 000000000..94dbeff08
--- /dev/null
+++ b/doc/html/update__channel_8php.js
@@ -0,0 +1,4 @@
+var update__channel_8php =
+[
+ [ "update_channel_content", "update__channel_8php.html#aca52a9da500f0db2f0a8666af5bc06ba", null ]
+]; \ No newline at end of file
diff --git a/doc/html/update__community_8php.html b/doc/html/update__community_8php.html
new file mode 100644
index 000000000..c869c47b3
--- /dev/null
+++ b/doc/html/update__community_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/update_community.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('update__community_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">update_community.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:abdcc5c4ecebbe0b5fcba2755c69cb3b1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="update__community_8php.html#abdcc5c4ecebbe0b5fcba2755c69cb3b1">update_community_content</a> (&amp;$a)</td></tr>
+<tr class="separator:abdcc5c4ecebbe0b5fcba2755c69cb3b1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="abdcc5c4ecebbe0b5fcba2755c69cb3b1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">update_community_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/update__community_8php.js b/doc/html/update__community_8php.js
new file mode 100644
index 000000000..eda76aa18
--- /dev/null
+++ b/doc/html/update__community_8php.js
@@ -0,0 +1,4 @@
+var update__community_8php =
+[
+ [ "update_community_content", "update__community_8php.html#abdcc5c4ecebbe0b5fcba2755c69cb3b1", null ]
+]; \ No newline at end of file
diff --git a/doc/html/update__display_8php.html b/doc/html/update__display_8php.html
new file mode 100644
index 000000000..d4bdfc89a
--- /dev/null
+++ b/doc/html/update__display_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/update_display.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('update__display_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">update_display.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:aa36ac524059e209d5d75a03c16206246"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="update__display_8php.html#aa36ac524059e209d5d75a03c16206246">update_display_content</a> (&amp;$a)</td></tr>
+<tr class="separator:aa36ac524059e209d5d75a03c16206246"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="aa36ac524059e209d5d75a03c16206246"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">update_display_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/update__display_8php.js b/doc/html/update__display_8php.js
new file mode 100644
index 000000000..05acc47d5
--- /dev/null
+++ b/doc/html/update__display_8php.js
@@ -0,0 +1,4 @@
+var update__display_8php =
+[
+ [ "update_display_content", "update__display_8php.html#aa36ac524059e209d5d75a03c16206246", null ]
+]; \ No newline at end of file
diff --git a/doc/html/update__network_8php.html b/doc/html/update__network_8php.html
new file mode 100644
index 000000000..72e54103c
--- /dev/null
+++ b/doc/html/update__network_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/update_network.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('update__network_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">update_network.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a8abf5b9f65af6a27ee2f9d7207ed1b41"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="update__network_8php.html#a8abf5b9f65af6a27ee2f9d7207ed1b41">update_network_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a8abf5b9f65af6a27ee2f9d7207ed1b41"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a8abf5b9f65af6a27ee2f9d7207ed1b41"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">update_network_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/update__network_8php.js b/doc/html/update__network_8php.js
new file mode 100644
index 000000000..54bc186a3
--- /dev/null
+++ b/doc/html/update__network_8php.js
@@ -0,0 +1,4 @@
+var update__network_8php =
+[
+ [ "update_network_content", "update__network_8php.html#a8abf5b9f65af6a27ee2f9d7207ed1b41", null ]
+]; \ No newline at end of file
diff --git a/doc/html/update__search_8php.html b/doc/html/update__search_8php.html
new file mode 100644
index 000000000..402d8eec3
--- /dev/null
+++ b/doc/html/update__search_8php.html
@@ -0,0 +1,141 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/update_search.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('update__search_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">update_search.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ace4c3a23fa7d6922399e27c297a6ba52"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="update__search_8php.html#ace4c3a23fa7d6922399e27c297a6ba52">update_search_content</a> (&amp;$a)</td></tr>
+<tr class="separator:ace4c3a23fa7d6922399e27c297a6ba52"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="ace4c3a23fa7d6922399e27c297a6ba52"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">update_search_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Module: update_profile Purpose: AJAX synchronisation of search page </p>
+<p>We can remove this hack once Internet Explorer recognises HTML5 natively</p>
+<p>Grab the page inner contents by calling the content function from the profile module directly, but move any image src attributes to another attribute name. This is because some browsers will prefetch all the images for the page even if we don't need them. The only ones we need to fetch are those for new page additions, which we'll discover on the client side and then swap the image back.</p>
+<p>reportedly some versions of MSIE don't handle tabs in XMLHttpRequest documents very well</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/update__search_8php.js b/doc/html/update__search_8php.js
new file mode 100644
index 000000000..8eb5c446d
--- /dev/null
+++ b/doc/html/update__search_8php.js
@@ -0,0 +1,4 @@
+var update__search_8php =
+[
+ [ "update_search_content", "update__search_8php.html#ace4c3a23fa7d6922399e27c297a6ba52", null ]
+]; \ No newline at end of file
diff --git a/doc/html/updatetpl_8py.html b/doc/html/updatetpl_8py.html
new file mode 100644
index 000000000..08ad9b393
--- /dev/null
+++ b/doc/html/updatetpl_8py.html
@@ -0,0 +1,140 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: util/updatetpl.py File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('updatetpl_8py.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#namespaces">Namespaces</a> &#124;
+<a href="#func-members">Functions</a> &#124;
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle">
+<div class="title">updatetpl.py File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="namespaces"></a>
+Namespaces</h2></td></tr>
+<tr class="memitem:namespaceupdatetpl"><td class="memItemLeft" align="right" valign="top">namespace &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespaceupdatetpl.html">updatetpl</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ac9d11279fed403a329a719298feafc4f"><td class="memItemLeft" align="right" valign="top">def&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespaceupdatetpl.html#ac9d11279fed403a329a719298feafc4f">updatetpl.help</a></td></tr>
+<tr class="separator:ac9d11279fed403a329a719298feafc4f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:ae694f5e1f25f8a92a945eb90c432dfe6"><td class="memItemLeft" align="right" valign="top">string&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespaceupdatetpl.html#ae694f5e1f25f8a92a945eb90c432dfe6">updatetpl.path</a> = ''</td></tr>
+<tr class="separator:ae694f5e1f25f8a92a945eb90c432dfe6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a988d937ed5d5c2b592b763036af5cf94"><td class="memItemLeft" align="right" valign="top">list&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespaceupdatetpl.html#a988d937ed5d5c2b592b763036af5cf94">updatetpl.excludepaths</a> = ['css', 'img', 'js', 'php', 'theme']</td></tr>
+<tr class="separator:a988d937ed5d5c2b592b763036af5cf94"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a52a85ffa6b6d63d840b185a133478c12"><td class="memItemLeft" align="right" valign="top">list&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespaceupdatetpl.html#a52a85ffa6b6d63d840b185a133478c12">updatetpl.tplpaths</a> = []</td></tr>
+<tr class="separator:a52a85ffa6b6d63d840b185a133478c12"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab42dd79af65ee82201fd6f04715f62f6"><td class="memItemLeft" align="right" valign="top">tuple&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespaceupdatetpl.html#ab42dd79af65ee82201fd6f04715f62f6">updatetpl.names</a> = os.listdir(path + 'view/')</td></tr>
+<tr class="separator:ab42dd79af65ee82201fd6f04715f62f6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a79c20eb62d568c999b56eb08530355d3"><td class="memItemLeft" align="right" valign="top">tuple&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespaceupdatetpl.html#a79c20eb62d568c999b56eb08530355d3">updatetpl.fnull</a> = open(os.devnull, &quot;w&quot;)</td></tr>
+<tr class="separator:a79c20eb62d568c999b56eb08530355d3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/updatetpl_8py.js b/doc/html/updatetpl_8py.js
new file mode 100644
index 000000000..38f8a5299
--- /dev/null
+++ b/doc/html/updatetpl_8py.js
@@ -0,0 +1,9 @@
+var updatetpl_8py =
+[
+ [ "help", "updatetpl_8py.html#ac9d11279fed403a329a719298feafc4f", null ],
+ [ "excludepaths", "updatetpl_8py.html#a988d937ed5d5c2b592b763036af5cf94", null ],
+ [ "fnull", "updatetpl_8py.html#a79c20eb62d568c999b56eb08530355d3", null ],
+ [ "names", "updatetpl_8py.html#ab42dd79af65ee82201fd6f04715f62f6", null ],
+ [ "path", "updatetpl_8py.html#ae694f5e1f25f8a92a945eb90c432dfe6", null ],
+ [ "tplpaths", "updatetpl_8py.html#a52a85ffa6b6d63d840b185a133478c12", null ]
+]; \ No newline at end of file
diff --git a/doc/html/view_2theme_2apw_2php_2config_8php.html b/doc/html/view_2theme_2apw_2php_2config_8php.html
new file mode 100644
index 000000000..110191973
--- /dev/null
+++ b/doc/html/view_2theme_2apw_2php_2config_8php.html
@@ -0,0 +1,362 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/apw/php/config.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('view_2theme_2apw_2php_2config_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">config.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:aa7d5739b72efef9822535b2b32d5364d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="view_2theme_2apw_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d">theme_content</a> (&amp;$a)</td></tr>
+<tr class="separator:aa7d5739b72efef9822535b2b32d5364d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad29461920cf03b9ce1428e21eb1f4ba6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="view_2theme_2apw_2php_2config_8php.html#ad29461920cf03b9ce1428e21eb1f4ba6">theme_post</a> (&amp;$a)</td></tr>
+<tr class="separator:ad29461920cf03b9ce1428e21eb1f4ba6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8b51951a70e1c1324be71345a61d70ec"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="view_2theme_2apw_2php_2config_8php.html#a8b51951a70e1c1324be71345a61d70ec">apw_form</a> (&amp;$a, $schema, $font_size, $font, $iconpath, $bigshadow, $smallshadow, $shadowcolour, $radius, $line_height, $background, $bgcolour, $sectionbackground, $sectioncolour, $item_colour, $link_colour, $width, $minwidth, $gcrwidth, $font_colour, $symmetry, $aside, $scaling, $opacity, $<a class="el" href="nav_8php.html#a43be0df73b90647ea70947ce004e231e">nav</a>, $itemfloat, $sectionleft, $sectionright, $sectionwidth, $asideleft, $asideright)</td></tr>
+<tr class="separator:a8b51951a70e1c1324be71345a61d70ec"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a8b51951a70e1c1324be71345a61d70ec"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">apw_form </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$schema</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$font_size</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$font</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$iconpath</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$bigshadow</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$smallshadow</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$shadowcolour</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$radius</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$line_height</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$background</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$bgcolour</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$sectionbackground</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$sectioncolour</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item_colour</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$link_colour</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$width</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$minwidth</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$gcrwidth</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$font_colour</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$symmetry</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$aside</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$scaling</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$opacity</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$nav</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$itemfloat</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$sectionleft</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$sectionright</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$sectionwidth</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$asideleft</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$asideright</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="view_2theme_2apw_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d">theme_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa7d5739b72efef9822535b2b32d5364d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">theme_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Theme settings </p>
+
+</div>
+</div>
+<a class="anchor" id="ad29461920cf03b9ce1428e21eb1f4ba6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">theme_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586">settings_post()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/view_2theme_2apw_2php_2config_8php.js b/doc/html/view_2theme_2apw_2php_2config_8php.js
new file mode 100644
index 000000000..c696ce526
--- /dev/null
+++ b/doc/html/view_2theme_2apw_2php_2config_8php.js
@@ -0,0 +1,6 @@
+var view_2theme_2apw_2php_2config_8php =
+[
+ [ "apw_form", "view_2theme_2apw_2php_2config_8php.html#a8b51951a70e1c1324be71345a61d70ec", null ],
+ [ "theme_content", "view_2theme_2apw_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d", null ],
+ [ "theme_post", "view_2theme_2apw_2php_2config_8php.html#ad29461920cf03b9ce1428e21eb1f4ba6", null ]
+]; \ No newline at end of file
diff --git a/doc/html/view_2theme_2blogga_2php_2config_8php.html b/doc/html/view_2theme_2blogga_2php_2config_8php.html
new file mode 100644
index 000000000..2f384b38a
--- /dev/null
+++ b/doc/html/view_2theme_2blogga_2php_2config_8php.html
@@ -0,0 +1,232 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/blogga/php/config.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('view_2theme_2blogga_2php_2config_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">config.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:aa7d5739b72efef9822535b2b32d5364d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="view_2theme_2blogga_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d">theme_content</a> (&amp;$a)</td></tr>
+<tr class="separator:aa7d5739b72efef9822535b2b32d5364d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad29461920cf03b9ce1428e21eb1f4ba6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="view_2theme_2blogga_2php_2config_8php.html#ad29461920cf03b9ce1428e21eb1f4ba6">theme_post</a> (&amp;$a)</td></tr>
+<tr class="separator:ad29461920cf03b9ce1428e21eb1f4ba6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a09cd81013505f83aea0771243a1e4e53"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="view_2theme_2blogga_2php_2config_8php.html#a09cd81013505f83aea0771243a1e4e53">theme_admin</a> (&amp;$a)</td></tr>
+<tr class="separator:a09cd81013505f83aea0771243a1e4e53"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aef2da5582b7cb6b5f63e5ca5d69fd30b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="view_2theme_2blogga_2php_2config_8php.html#aef2da5582b7cb6b5f63e5ca5d69fd30b">theme_admin_post</a> (&amp;$a)</td></tr>
+<tr class="separator:aef2da5582b7cb6b5f63e5ca5d69fd30b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8a311a402d3e746ce53fadc38e4b2d27"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="view_2theme_2blogga_2php_2config_8php.html#a8a311a402d3e746ce53fadc38e4b2d27">blogtheme_form</a> (&amp;$a, $headimg, $headimghome)</td></tr>
+<tr class="separator:a8a311a402d3e746ce53fadc38e4b2d27"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a8a311a402d3e746ce53fadc38e4b2d27"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">blogtheme_form </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$headimg</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$headimghome</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="view_2theme_2blogga_2php_2config_8php.html#a09cd81013505f83aea0771243a1e4e53">theme_admin()</a>, and <a class="el" href="view_2theme_2blogga_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d">theme_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a09cd81013505f83aea0771243a1e4e53"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">theme_admin </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="admin_8php.html#af124619fdc278fe2bf14c45ddaa260fb">admin_page_themes()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aef2da5582b7cb6b5f63e5ca5d69fd30b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">theme_admin_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="admin_8php.html#acf51f5837a7427832144c2bf7308ada3">admin_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa7d5739b72efef9822535b2b32d5364d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">theme_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Theme settings </p>
+
+</div>
+</div>
+<a class="anchor" id="ad29461920cf03b9ce1428e21eb1f4ba6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">theme_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/view_2theme_2blogga_2php_2config_8php.js b/doc/html/view_2theme_2blogga_2php_2config_8php.js
new file mode 100644
index 000000000..7d1e21a69
--- /dev/null
+++ b/doc/html/view_2theme_2blogga_2php_2config_8php.js
@@ -0,0 +1,8 @@
+var view_2theme_2blogga_2php_2config_8php =
+[
+ [ "blogtheme_form", "view_2theme_2blogga_2php_2config_8php.html#a8a311a402d3e746ce53fadc38e4b2d27", null ],
+ [ "theme_admin", "view_2theme_2blogga_2php_2config_8php.html#a09cd81013505f83aea0771243a1e4e53", null ],
+ [ "theme_admin_post", "view_2theme_2blogga_2php_2config_8php.html#aef2da5582b7cb6b5f63e5ca5d69fd30b", null ],
+ [ "theme_content", "view_2theme_2blogga_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d", null ],
+ [ "theme_post", "view_2theme_2blogga_2php_2config_8php.html#ad29461920cf03b9ce1428e21eb1f4ba6", null ]
+]; \ No newline at end of file
diff --git a/doc/html/view_2theme_2blogga_2view_2theme_2blog_2config_8php.html b/doc/html/view_2theme_2blogga_2view_2theme_2blog_2config_8php.html
new file mode 100644
index 000000000..614fbcb7b
--- /dev/null
+++ b/doc/html/view_2theme_2blogga_2view_2theme_2blog_2config_8php.html
@@ -0,0 +1,226 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/blogga/view/theme/blog/config.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('view_2theme_2blogga_2view_2theme_2blog_2config_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">config.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:aa7d5739b72efef9822535b2b32d5364d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="view_2theme_2blogga_2view_2theme_2blog_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d">theme_content</a> (&amp;$a)</td></tr>
+<tr class="separator:aa7d5739b72efef9822535b2b32d5364d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad29461920cf03b9ce1428e21eb1f4ba6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="view_2theme_2blogga_2view_2theme_2blog_2config_8php.html#ad29461920cf03b9ce1428e21eb1f4ba6">theme_post</a> (&amp;$a)</td></tr>
+<tr class="separator:ad29461920cf03b9ce1428e21eb1f4ba6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a09cd81013505f83aea0771243a1e4e53"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="view_2theme_2blogga_2view_2theme_2blog_2config_8php.html#a09cd81013505f83aea0771243a1e4e53">theme_admin</a> (&amp;$a)</td></tr>
+<tr class="separator:a09cd81013505f83aea0771243a1e4e53"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aef2da5582b7cb6b5f63e5ca5d69fd30b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="view_2theme_2blogga_2view_2theme_2blog_2config_8php.html#aef2da5582b7cb6b5f63e5ca5d69fd30b">theme_admin_post</a> (&amp;$a)</td></tr>
+<tr class="separator:aef2da5582b7cb6b5f63e5ca5d69fd30b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8a311a402d3e746ce53fadc38e4b2d27"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="view_2theme_2blogga_2view_2theme_2blog_2config_8php.html#a8a311a402d3e746ce53fadc38e4b2d27">blogtheme_form</a> (&amp;$a, $headimg, $headimghome)</td></tr>
+<tr class="separator:a8a311a402d3e746ce53fadc38e4b2d27"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a8a311a402d3e746ce53fadc38e4b2d27"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">blogtheme_form </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$headimg</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$headimghome</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a09cd81013505f83aea0771243a1e4e53"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">theme_admin </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aef2da5582b7cb6b5f63e5ca5d69fd30b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">theme_admin_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aa7d5739b72efef9822535b2b32d5364d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">theme_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Theme settings </p>
+
+</div>
+</div>
+<a class="anchor" id="ad29461920cf03b9ce1428e21eb1f4ba6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">theme_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/view_2theme_2blogga_2view_2theme_2blog_2config_8php.js b/doc/html/view_2theme_2blogga_2view_2theme_2blog_2config_8php.js
new file mode 100644
index 000000000..1603323f9
--- /dev/null
+++ b/doc/html/view_2theme_2blogga_2view_2theme_2blog_2config_8php.js
@@ -0,0 +1,8 @@
+var view_2theme_2blogga_2view_2theme_2blog_2config_8php =
+[
+ [ "blogtheme_form", "view_2theme_2blogga_2view_2theme_2blog_2config_8php.html#a8a311a402d3e746ce53fadc38e4b2d27", null ],
+ [ "theme_admin", "view_2theme_2blogga_2view_2theme_2blog_2config_8php.html#a09cd81013505f83aea0771243a1e4e53", null ],
+ [ "theme_admin_post", "view_2theme_2blogga_2view_2theme_2blog_2config_8php.html#aef2da5582b7cb6b5f63e5ca5d69fd30b", null ],
+ [ "theme_content", "view_2theme_2blogga_2view_2theme_2blog_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d", null ],
+ [ "theme_post", "view_2theme_2blogga_2view_2theme_2blog_2config_8php.html#ad29461920cf03b9ce1428e21eb1f4ba6", null ]
+]; \ No newline at end of file
diff --git a/doc/html/view_2theme_2redbasic_2php_2config_8php.html b/doc/html/view_2theme_2redbasic_2php_2config_8php.html
new file mode 100644
index 000000000..ea12c42cb
--- /dev/null
+++ b/doc/html/view_2theme_2redbasic_2php_2config_8php.html
@@ -0,0 +1,185 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/redbasic/php/config.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('view_2theme_2redbasic_2php_2config_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">config.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:aa7d5739b72efef9822535b2b32d5364d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="view_2theme_2redbasic_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d">theme_content</a> (&amp;$a)</td></tr>
+<tr class="separator:aa7d5739b72efef9822535b2b32d5364d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad29461920cf03b9ce1428e21eb1f4ba6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="view_2theme_2redbasic_2php_2config_8php.html#ad29461920cf03b9ce1428e21eb1f4ba6">theme_post</a> (&amp;$a)</td></tr>
+<tr class="separator:ad29461920cf03b9ce1428e21eb1f4ba6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8574a41fa9735ee391ba57ab24b93793"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="view_2theme_2redbasic_2php_2config_8php.html#a8574a41fa9735ee391ba57ab24b93793">redbasic_form</a> (&amp;$a, $arr)</td></tr>
+<tr class="separator:a8574a41fa9735ee391ba57ab24b93793"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a8574a41fa9735ee391ba57ab24b93793"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">redbasic_form </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="view_2theme_2redbasic_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d">theme_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa7d5739b72efef9822535b2b32d5364d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">theme_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ad29461920cf03b9ce1428e21eb1f4ba6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">theme_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/view_2theme_2redbasic_2php_2config_8php.js b/doc/html/view_2theme_2redbasic_2php_2config_8php.js
new file mode 100644
index 000000000..3a5955982
--- /dev/null
+++ b/doc/html/view_2theme_2redbasic_2php_2config_8php.js
@@ -0,0 +1,6 @@
+var view_2theme_2redbasic_2php_2config_8php =
+[
+ [ "redbasic_form", "view_2theme_2redbasic_2php_2config_8php.html#a8574a41fa9735ee391ba57ab24b93793", null ],
+ [ "theme_content", "view_2theme_2redbasic_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d", null ],
+ [ "theme_post", "view_2theme_2redbasic_2php_2config_8php.html#ad29461920cf03b9ce1428e21eb1f4ba6", null ]
+]; \ No newline at end of file
diff --git a/doc/html/view_2theme_2redstrap_2php_2config_8php.html b/doc/html/view_2theme_2redstrap_2php_2config_8php.html
new file mode 100644
index 000000000..018994597
--- /dev/null
+++ b/doc/html/view_2theme_2redstrap_2php_2config_8php.html
@@ -0,0 +1,238 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/redstrap/php/config.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rhash-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('view_2theme_2redstrap_2php_2config_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">config.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:aa7d5739b72efef9822535b2b32d5364d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="view_2theme_2redstrap_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d">theme_content</a> (&amp;$a)</td></tr>
+<tr class="separator:aa7d5739b72efef9822535b2b32d5364d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad29461920cf03b9ce1428e21eb1f4ba6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="view_2theme_2redstrap_2php_2config_8php.html#ad29461920cf03b9ce1428e21eb1f4ba6">theme_post</a> (&amp;$a)</td></tr>
+<tr class="separator:ad29461920cf03b9ce1428e21eb1f4ba6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af58e97b437c1e98a5e434886494cc70e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="view_2theme_2redstrap_2php_2config_8php.html#af58e97b437c1e98a5e434886494cc70e">redbasic_form</a> (&amp;$a, $font_size, $line_height, $colour, $shadow, $navcolour, $opaquenav, $displaystyle, $linkcolour, $iconset, $shiny)</td></tr>
+<tr class="separator:af58e97b437c1e98a5e434886494cc70e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="af58e97b437c1e98a5e434886494cc70e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">redbasic_form </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$font_size</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$line_height</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$colour</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$shadow</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$navcolour</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$opaquenav</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$displaystyle</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$linkcolour</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$iconset</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$shiny</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aa7d5739b72efef9822535b2b32d5364d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">theme_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Theme settings </p>
+
+</div>
+</div>
+<a class="anchor" id="ad29461920cf03b9ce1428e21eb1f4ba6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">theme_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/view_2theme_2redstrap_2php_2config_8php.js b/doc/html/view_2theme_2redstrap_2php_2config_8php.js
new file mode 100644
index 000000000..e209d2eea
--- /dev/null
+++ b/doc/html/view_2theme_2redstrap_2php_2config_8php.js
@@ -0,0 +1,6 @@
+var view_2theme_2redstrap_2php_2config_8php =
+[
+ [ "redbasic_form", "view_2theme_2redstrap_2php_2config_8php.html#af58e97b437c1e98a5e434886494cc70e", null ],
+ [ "theme_content", "view_2theme_2redstrap_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d", null ],
+ [ "theme_post", "view_2theme_2redstrap_2php_2config_8php.html#ad29461920cf03b9ce1428e21eb1f4ba6", null ]
+]; \ No newline at end of file
diff --git a/doc/html/view_8php.html b/doc/html/view_8php.html
new file mode 100644
index 000000000..b6524b793
--- /dev/null
+++ b/doc/html/view_8php.html
@@ -0,0 +1,138 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/view.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('view_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">view.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ac168f6c61a91ba2063f13b441c0ae96e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="view_8php.html#ac168f6c61a91ba2063f13b441c0ae96e">view_init</a> ($a)</td></tr>
+<tr class="separator:ac168f6c61a91ba2063f13b441c0ae96e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="ac168f6c61a91ba2063f13b441c0ae96e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">view_init </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>load view/theme/$current_theme/style.php with Red context </p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/view_8php.js b/doc/html/view_8php.js
new file mode 100644
index 000000000..d40a196cb
--- /dev/null
+++ b/doc/html/view_8php.js
@@ -0,0 +1,4 @@
+var view_8php =
+[
+ [ "view_init", "view_8php.html#ac168f6c61a91ba2063f13b441c0ae96e", null ]
+]; \ No newline at end of file
diff --git a/doc/html/viewconnections_8php.html b/doc/html/viewconnections_8php.html
new file mode 100644
index 000000000..ebdf48289
--- /dev/null
+++ b/doc/html/viewconnections_8php.html
@@ -0,0 +1,155 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/viewconnections.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('viewconnections_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">viewconnections.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a00163d50b17568f7b0e48b1ca9ab7330"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="viewconnections_8php.html#a00163d50b17568f7b0e48b1ca9ab7330">viewconnections_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a00163d50b17568f7b0e48b1ca9ab7330"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab6c4d983e97b3a8a879567ff76507776"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="viewconnections_8php.html#ab6c4d983e97b3a8a879567ff76507776">viewconnections_content</a> (&amp;$a)</td></tr>
+<tr class="separator:ab6c4d983e97b3a8a879567ff76507776"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="ab6c4d983e97b3a8a879567ff76507776"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">viewconnections_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a00163d50b17568f7b0e48b1ca9ab7330"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">viewconnections_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/viewconnections_8php.js b/doc/html/viewconnections_8php.js
new file mode 100644
index 000000000..f74e87152
--- /dev/null
+++ b/doc/html/viewconnections_8php.js
@@ -0,0 +1,5 @@
+var viewconnections_8php =
+[
+ [ "viewconnections_content", "viewconnections_8php.html#ab6c4d983e97b3a8a879567ff76507776", null ],
+ [ "viewconnections_init", "viewconnections_8php.html#a00163d50b17568f7b0e48b1ca9ab7330", null ]
+]; \ No newline at end of file
diff --git a/doc/html/viewsrc_8php.html b/doc/html/viewsrc_8php.html
new file mode 100644
index 000000000..e0d9de8ef
--- /dev/null
+++ b/doc/html/viewsrc_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/viewsrc.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('viewsrc_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">viewsrc.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a6eff3d0c1d7d14b335c4edb785cd60a4"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="viewsrc_8php.html#a6eff3d0c1d7d14b335c4edb785cd60a4">viewsrc_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a6eff3d0c1d7d14b335c4edb785cd60a4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a6eff3d0c1d7d14b335c4edb785cd60a4"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">viewsrc_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/viewsrc_8php.js b/doc/html/viewsrc_8php.js
new file mode 100644
index 000000000..0f5ac6b8c
--- /dev/null
+++ b/doc/html/viewsrc_8php.js
@@ -0,0 +1,4 @@
+var viewsrc_8php =
+[
+ [ "viewsrc_content", "viewsrc_8php.html#a6eff3d0c1d7d14b335c4edb785cd60a4", null ]
+]; \ No newline at end of file
diff --git a/doc/html/vote_8php.html b/doc/html/vote_8php.html
new file mode 100644
index 000000000..944e87e2d
--- /dev/null
+++ b/doc/html/vote_8php.html
@@ -0,0 +1,173 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/vote.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('vote_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">vote.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ae0c6610f40afbbc1f4fe6494c51fbab2"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vote_8php.html#ae0c6610f40afbbc1f4fe6494c51fbab2">vote_init</a> (&amp;$a)</td></tr>
+<tr class="separator:ae0c6610f40afbbc1f4fe6494c51fbab2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a57a9516ee1b923b224e66dcc47377fb2"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vote_8php.html#a57a9516ee1b923b224e66dcc47377fb2">vote_post</a> (&amp;$a)</td></tr>
+<tr class="separator:a57a9516ee1b923b224e66dcc47377fb2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6aa67489bf458ca5e3206e46dac68596"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vote_8php.html#a6aa67489bf458ca5e3206e46dac68596">vote_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a6aa67489bf458ca5e3206e46dac68596"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a6aa67489bf458ca5e3206e46dac68596"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">vote_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ae0c6610f40afbbc1f4fe6494c51fbab2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">vote_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a57a9516ee1b923b224e66dcc47377fb2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">vote_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/vote_8php.js b/doc/html/vote_8php.js
new file mode 100644
index 000000000..6f0639cd8
--- /dev/null
+++ b/doc/html/vote_8php.js
@@ -0,0 +1,6 @@
+var vote_8php =
+[
+ [ "vote_content", "vote_8php.html#a6aa67489bf458ca5e3206e46dac68596", null ],
+ [ "vote_init", "vote_8php.html#ae0c6610f40afbbc1f4fe6494c51fbab2", null ],
+ [ "vote_post", "vote_8php.html#a57a9516ee1b923b224e66dcc47377fb2", null ]
+]; \ No newline at end of file
diff --git a/doc/html/wall__attach_8php.html b/doc/html/wall__attach_8php.html
new file mode 100644
index 000000000..55f751f2a
--- /dev/null
+++ b/doc/html/wall__attach_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/wall_attach.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('wall__attach_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">wall_attach.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a7385e970e93228d082f0fd7254f6e653"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="wall__attach_8php.html#a7385e970e93228d082f0fd7254f6e653">wall_attach_post</a> (&amp;$a)</td></tr>
+<tr class="separator:a7385e970e93228d082f0fd7254f6e653"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a7385e970e93228d082f0fd7254f6e653"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">wall_attach_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/wall__attach_8php.js b/doc/html/wall__attach_8php.js
new file mode 100644
index 000000000..c0281be85
--- /dev/null
+++ b/doc/html/wall__attach_8php.js
@@ -0,0 +1,4 @@
+var wall__attach_8php =
+[
+ [ "wall_attach_post", "wall__attach_8php.html#a7385e970e93228d082f0fd7254f6e653", null ]
+]; \ No newline at end of file
diff --git a/doc/html/wall__upload_8php.html b/doc/html/wall__upload_8php.html
new file mode 100644
index 000000000..991281577
--- /dev/null
+++ b/doc/html/wall__upload_8php.html
@@ -0,0 +1,139 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/wall_upload.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('wall__upload_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">wall_upload.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a7cbe204244cf9e0380ee932263a74d8f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="wall__upload_8php.html#a7cbe204244cf9e0380ee932263a74d8f">wall_upload_post</a> (&amp;$a)</td></tr>
+<tr class="separator:a7cbe204244cf9e0380ee932263a74d8f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a7cbe204244cf9e0380ee932263a74d8f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">wall_upload_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#a450d8732b7b608f7ac929aee61572b95">api_statuses_mediap()</a>, and <a class="el" href="include_2api_8php.html#ad4d1634df6b35126552324683caaffa2">api_statuses_update()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/wall__upload_8php.js b/doc/html/wall__upload_8php.js
new file mode 100644
index 000000000..86f363be5
--- /dev/null
+++ b/doc/html/wall__upload_8php.js
@@ -0,0 +1,4 @@
+var wall__upload_8php =
+[
+ [ "wall_upload_post", "wall__upload_8php.html#a7cbe204244cf9e0380ee932263a74d8f", null ]
+]; \ No newline at end of file
diff --git a/doc/html/webfinger_8php.html b/doc/html/webfinger_8php.html
new file mode 100644
index 000000000..288c6a5d2
--- /dev/null
+++ b/doc/html/webfinger_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/webfinger.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('webfinger_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">webfinger.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a17dd28db6d390194bf9ecb809739d1d3"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="webfinger_8php.html#a17dd28db6d390194bf9ecb809739d1d3">webfinger_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a17dd28db6d390194bf9ecb809739d1d3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a17dd28db6d390194bf9ecb809739d1d3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">webfinger_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/webfinger_8php.js b/doc/html/webfinger_8php.js
new file mode 100644
index 000000000..f34d3bd88
--- /dev/null
+++ b/doc/html/webfinger_8php.js
@@ -0,0 +1,4 @@
+var webfinger_8php =
+[
+ [ "webfinger_content", "webfinger_8php.html#a17dd28db6d390194bf9ecb809739d1d3", null ]
+]; \ No newline at end of file
diff --git a/doc/html/webpages_8php.html b/doc/html/webpages_8php.html
new file mode 100644
index 000000000..303ce4718
--- /dev/null
+++ b/doc/html/webpages_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/webpages.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('webpages_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">webpages.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:af3b7397d4abc153e3d2147740ee1a41d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="webpages_8php.html#af3b7397d4abc153e3d2147740ee1a41d">webpages_content</a> (&amp;$a)</td></tr>
+<tr class="separator:af3b7397d4abc153e3d2147740ee1a41d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="af3b7397d4abc153e3d2147740ee1a41d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">webpages_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/webpages_8php.js b/doc/html/webpages_8php.js
new file mode 100644
index 000000000..8e145305c
--- /dev/null
+++ b/doc/html/webpages_8php.js
@@ -0,0 +1,4 @@
+var webpages_8php =
+[
+ [ "webpages_content", "webpages_8php.html#af3b7397d4abc153e3d2147740ee1a41d", null ]
+]; \ No newline at end of file
diff --git a/doc/html/wfinger_8php.html b/doc/html/wfinger_8php.html
new file mode 100644
index 000000000..088eb9aad
--- /dev/null
+++ b/doc/html/wfinger_8php.html
@@ -0,0 +1,139 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/wfinger.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('wfinger_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">wfinger.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ae21e50c8d0a5f3c9be9f43a4e519acd3"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="wfinger_8php.html#ae21e50c8d0a5f3c9be9f43a4e519acd3">wfinger_init</a> (&amp;$a)</td></tr>
+<tr class="separator:ae21e50c8d0a5f3c9be9f43a4e519acd3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="ae21e50c8d0a5f3c9be9f43a4e519acd3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">wfinger_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="__well__known_8php.html#a6ebfa937a2024f0b5dab53f0ac90fed0">_well_known_init()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/wfinger_8php.js b/doc/html/wfinger_8php.js
new file mode 100644
index 000000000..b40fe5d03
--- /dev/null
+++ b/doc/html/wfinger_8php.js
@@ -0,0 +1,4 @@
+var wfinger_8php =
+[
+ [ "wfinger_init", "wfinger_8php.html#ae21e50c8d0a5f3c9be9f43a4e519acd3", null ]
+]; \ No newline at end of file
diff --git a/doc/html/widedarkness_8php.html b/doc/html/widedarkness_8php.html
new file mode 100644
index 000000000..1825b557e
--- /dev/null
+++ b/doc/html/widedarkness_8php.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/apw/schema/widedarkness.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('widedarkness_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">widedarkness.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/widgets_8php.html b/doc/html/widgets_8php.html
new file mode 100644
index 000000000..d3e9c1b08
--- /dev/null
+++ b/doc/html/widgets_8php.html
@@ -0,0 +1,534 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/widgets.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('widgets_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">widgets.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:abd2e508a2a0b911c4a838e3cb7599923"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="widgets_8php.html#abd2e508a2a0b911c4a838e3cb7599923">widget_profile</a> ($args)</td></tr>
+<tr class="separator:abd2e508a2a0b911c4a838e3cb7599923"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6dbc227aac750774284ee39c45f0a200"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="widgets_8php.html#a6dbc227aac750774284ee39c45f0a200">widget_tagcloud</a> ($args)</td></tr>
+<tr class="separator:a6dbc227aac750774284ee39c45f0a200"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa189a07241246d97efbee29f1c6a6f7f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="widgets_8php.html#aa189a07241246d97efbee29f1c6a6f7f">widget_collections</a> ($args)</td></tr>
+<tr class="separator:aa189a07241246d97efbee29f1c6a6f7f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0d404276fedc59f5038cf5c085028326"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="widgets_8php.html#a0d404276fedc59f5038cf5c085028326">widget_suggestions</a> ($arr)</td></tr>
+<tr class="separator:a0d404276fedc59f5038cf5c085028326"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad1bf7aa69e8d100d95faba17c7bc91cd"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="widgets_8php.html#ad1bf7aa69e8d100d95faba17c7bc91cd">widget_follow</a> ($args)</td></tr>
+<tr class="separator:ad1bf7aa69e8d100d95faba17c7bc91cd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a45ea061dabe9a8372e4ca3b9e5714256"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="widgets_8php.html#a45ea061dabe9a8372e4ca3b9e5714256">widget_notes</a> ($arr)</td></tr>
+<tr class="separator:a45ea061dabe9a8372e4ca3b9e5714256"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a94203eb9bcd63cbdecbbcb15163598d8"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="widgets_8php.html#a94203eb9bcd63cbdecbbcb15163598d8">widget_savedsearch</a> ($arr)</td></tr>
+<tr class="separator:a94203eb9bcd63cbdecbbcb15163598d8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5ab3b64496e02cab56429978ad55f1c0"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="widgets_8php.html#a5ab3b64496e02cab56429978ad55f1c0">widget_filer</a> ($arr)</td></tr>
+<tr class="separator:a5ab3b64496e02cab56429978ad55f1c0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7b1e357b5a2027718470b77ec921fc65"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="widgets_8php.html#a7b1e357b5a2027718470b77ec921fc65">widget_archive</a> ($arr)</td></tr>
+<tr class="separator:a7b1e357b5a2027718470b77ec921fc65"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a70442dfa079312d9d5e5ee01be51a165"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="widgets_8php.html#a70442dfa079312d9d5e5ee01be51a165">widget_fullprofile</a> ($arr)</td></tr>
+<tr class="separator:a70442dfa079312d9d5e5ee01be51a165"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af37fdad3b2e861d860a4a8c4d8a76c0b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="widgets_8php.html#af37fdad3b2e861d860a4a8c4d8a76c0b">widget_categories</a> ($arr)</td></tr>
+<tr class="separator:af37fdad3b2e861d860a4a8c4d8a76c0b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae4ced69d83dbdd9e6b51660d9eba8653"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="widgets_8php.html#ae4ced69d83dbdd9e6b51660d9eba8653">widget_tagcloud_wall</a> ($arr)</td></tr>
+<tr class="separator:ae4ced69d83dbdd9e6b51660d9eba8653"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:add9b24d3304e529a7975e96122315554"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="widgets_8php.html#add9b24d3304e529a7975e96122315554">widget_affinity</a> ($arr)</td></tr>
+<tr class="separator:add9b24d3304e529a7975e96122315554"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aaa73bcf1702eaadd9dcd253502f55e01"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="widgets_8php.html#aaa73bcf1702eaadd9dcd253502f55e01">widget_settings_menu</a> ($arr)</td></tr>
+<tr class="separator:aaa73bcf1702eaadd9dcd253502f55e01"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afa2e55a78f95667a6da082efac7fec74"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="widgets_8php.html#afa2e55a78f95667a6da082efac7fec74">widget_mailmenu</a> ($arr)</td></tr>
+<tr class="separator:afa2e55a78f95667a6da082efac7fec74"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a145ff35319cfa47a9cc07f9425bd674b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="widgets_8php.html#a145ff35319cfa47a9cc07f9425bd674b">widget_design_tools</a> ($arr)</td></tr>
+<tr class="separator:a145ff35319cfa47a9cc07f9425bd674b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ade630b19fb4c622b7b2f6f8ef89eefa2"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="widgets_8php.html#ade630b19fb4c622b7b2f6f8ef89eefa2">widget_findpeople</a> ($arr)</td></tr>
+<tr class="separator:ade630b19fb4c622b7b2f6f8ef89eefa2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a702e2fc0adc9b615999eca18b7311b5e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="widgets_8php.html#a702e2fc0adc9b615999eca18b7311b5e">widget_photo_albums</a> ($arr)</td></tr>
+<tr class="separator:a702e2fc0adc9b615999eca18b7311b5e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abe03366fd22fd27d683518fa0765da50"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="widgets_8php.html#abe03366fd22fd27d683518fa0765da50">widget_vcard</a> ($arr)</td></tr>
+<tr class="separator:abe03366fd22fd27d683518fa0765da50"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a268b01ce1ab8fe2cb346cb769b9d1091"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="widgets_8php.html#a268b01ce1ab8fe2cb346cb769b9d1091">widget_dirsafemode</a> ($arr)</td></tr>
+<tr class="separator:a268b01ce1ab8fe2cb346cb769b9d1091"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a95c06bc9be133e89768746302d2ac395"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="widgets_8php.html#a95c06bc9be133e89768746302d2ac395">widget_dirsort</a> ($arr)</td></tr>
+<tr class="separator:a95c06bc9be133e89768746302d2ac395"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a08035db02ff6a23260146b4c64153422"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="widgets_8php.html#a08035db02ff6a23260146b4c64153422">widget_dirtags</a> ($arr)</td></tr>
+<tr class="separator:a08035db02ff6a23260146b4c64153422"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3bdfb81bf9a8ddf219924fa7eaf22013"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="widgets_8php.html#a3bdfb81bf9a8ddf219924fa7eaf22013">widget_menu_preview</a> ($arr)</td></tr>
+<tr class="separator:a3bdfb81bf9a8ddf219924fa7eaf22013"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="add9b24d3304e529a7975e96122315554"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">widget_affinity </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a7b1e357b5a2027718470b77ec921fc65"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">widget_archive </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="af37fdad3b2e861d860a4a8c4d8a76c0b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">widget_categories </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aa189a07241246d97efbee29f1c6a6f7f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">widget_collections </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$args</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a145ff35319cfa47a9cc07f9425bd674b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">widget_design_tools </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a268b01ce1ab8fe2cb346cb769b9d1091"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">widget_dirsafemode </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>The following directory widgets are only useful on the directory page </p>
+
+</div>
+</div>
+<a class="anchor" id="a95c06bc9be133e89768746302d2ac395"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">widget_dirsort </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a08035db02ff6a23260146b4c64153422"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">widget_dirtags </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a5ab3b64496e02cab56429978ad55f1c0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">widget_filer </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ade630b19fb4c622b7b2f6f8ef89eefa2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">widget_findpeople </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ad1bf7aa69e8d100d95faba17c7bc91cd"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">widget_follow </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$args</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a70442dfa079312d9d5e5ee01be51a165"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">widget_fullprofile </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="afa2e55a78f95667a6da082efac7fec74"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">widget_mailmenu </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a3bdfb81bf9a8ddf219924fa7eaf22013"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">widget_menu_preview </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a45ea061dabe9a8372e4ca3b9e5714256"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">widget_notes </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a702e2fc0adc9b615999eca18b7311b5e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">widget_photo_albums </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="abd2e508a2a0b911c4a838e3cb7599923"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">widget_profile </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$args</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a94203eb9bcd63cbdecbbcb15163598d8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">widget_savedsearch </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aaa73bcf1702eaadd9dcd253502f55e01"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">widget_settings_menu </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a0d404276fedc59f5038cf5c085028326"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">widget_suggestions </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a6dbc227aac750774284ee39c45f0a200"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">widget_tagcloud </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$args</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ae4ced69d83dbdd9e6b51660d9eba8653"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">widget_tagcloud_wall </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="abe03366fd22fd27d683518fa0765da50"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">widget_vcard </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/widgets_8php.js b/doc/html/widgets_8php.js
new file mode 100644
index 000000000..65afb6aae
--- /dev/null
+++ b/doc/html/widgets_8php.js
@@ -0,0 +1,26 @@
+var widgets_8php =
+[
+ [ "widget_affinity", "widgets_8php.html#add9b24d3304e529a7975e96122315554", null ],
+ [ "widget_archive", "widgets_8php.html#a7b1e357b5a2027718470b77ec921fc65", null ],
+ [ "widget_categories", "widgets_8php.html#af37fdad3b2e861d860a4a8c4d8a76c0b", null ],
+ [ "widget_collections", "widgets_8php.html#aa189a07241246d97efbee29f1c6a6f7f", null ],
+ [ "widget_design_tools", "widgets_8php.html#a145ff35319cfa47a9cc07f9425bd674b", null ],
+ [ "widget_dirsafemode", "widgets_8php.html#a268b01ce1ab8fe2cb346cb769b9d1091", null ],
+ [ "widget_dirsort", "widgets_8php.html#a95c06bc9be133e89768746302d2ac395", null ],
+ [ "widget_dirtags", "widgets_8php.html#a08035db02ff6a23260146b4c64153422", null ],
+ [ "widget_filer", "widgets_8php.html#a5ab3b64496e02cab56429978ad55f1c0", null ],
+ [ "widget_findpeople", "widgets_8php.html#ade630b19fb4c622b7b2f6f8ef89eefa2", null ],
+ [ "widget_follow", "widgets_8php.html#ad1bf7aa69e8d100d95faba17c7bc91cd", null ],
+ [ "widget_fullprofile", "widgets_8php.html#a70442dfa079312d9d5e5ee01be51a165", null ],
+ [ "widget_mailmenu", "widgets_8php.html#afa2e55a78f95667a6da082efac7fec74", null ],
+ [ "widget_menu_preview", "widgets_8php.html#a3bdfb81bf9a8ddf219924fa7eaf22013", null ],
+ [ "widget_notes", "widgets_8php.html#a45ea061dabe9a8372e4ca3b9e5714256", null ],
+ [ "widget_photo_albums", "widgets_8php.html#a702e2fc0adc9b615999eca18b7311b5e", null ],
+ [ "widget_profile", "widgets_8php.html#abd2e508a2a0b911c4a838e3cb7599923", null ],
+ [ "widget_savedsearch", "widgets_8php.html#a94203eb9bcd63cbdecbbcb15163598d8", null ],
+ [ "widget_settings_menu", "widgets_8php.html#aaa73bcf1702eaadd9dcd253502f55e01", null ],
+ [ "widget_suggestions", "widgets_8php.html#a0d404276fedc59f5038cf5c085028326", null ],
+ [ "widget_tagcloud", "widgets_8php.html#a6dbc227aac750774284ee39c45f0a200", null ],
+ [ "widget_tagcloud_wall", "widgets_8php.html#ae4ced69d83dbdd9e6b51660d9eba8653", null ],
+ [ "widget_vcard", "widgets_8php.html#abe03366fd22fd27d683518fa0765da50", null ]
+]; \ No newline at end of file
diff --git a/doc/html/xchan_8php.html b/doc/html/xchan_8php.html
new file mode 100644
index 000000000..ab34d568a
--- /dev/null
+++ b/doc/html/xchan_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/xchan.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('xchan_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">xchan.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a9853348bf1a35c644460221ba75edc2d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xchan_8php.html#a9853348bf1a35c644460221ba75edc2d">xchan_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a9853348bf1a35c644460221ba75edc2d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a9853348bf1a35c644460221ba75edc2d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xchan_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/xchan_8php.js b/doc/html/xchan_8php.js
new file mode 100644
index 000000000..65ea176d4
--- /dev/null
+++ b/doc/html/xchan_8php.js
@@ -0,0 +1,4 @@
+var xchan_8php =
+[
+ [ "xchan_content", "xchan_8php.html#a9853348bf1a35c644460221ba75edc2d", null ]
+]; \ No newline at end of file
diff --git a/doc/html/xrd_8php.html b/doc/html/xrd_8php.html
new file mode 100644
index 000000000..b774c08b6
--- /dev/null
+++ b/doc/html/xrd_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/xrd.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('xrd_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">xrd.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:aee3cf087968e4a0ff3a87de16eb23270"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xrd_8php.html#aee3cf087968e4a0ff3a87de16eb23270">xrd_init</a> (&amp;$a)</td></tr>
+<tr class="separator:aee3cf087968e4a0ff3a87de16eb23270"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="aee3cf087968e4a0ff3a87de16eb23270"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xrd_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/xrd_8php.js b/doc/html/xrd_8php.js
new file mode 100644
index 000000000..01f00aa54
--- /dev/null
+++ b/doc/html/xrd_8php.js
@@ -0,0 +1,4 @@
+var xrd_8php =
+[
+ [ "xrd_init", "xrd_8php.html#aee3cf087968e4a0ff3a87de16eb23270", null ]
+]; \ No newline at end of file
diff --git a/doc/html/xref_8php.html b/doc/html/xref_8php.html
new file mode 100644
index 000000000..2f08a643f
--- /dev/null
+++ b/doc/html/xref_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/xref.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('xref_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">xref.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a9bee399213b8de8226b0d60834307473"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xref_8php.html#a9bee399213b8de8226b0d60834307473">xref_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a9bee399213b8de8226b0d60834307473"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a9bee399213b8de8226b0d60834307473"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xref_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/xref_8php.js b/doc/html/xref_8php.js
new file mode 100644
index 000000000..01291c5c5
--- /dev/null
+++ b/doc/html/xref_8php.js
@@ -0,0 +1,4 @@
+var xref_8php =
+[
+ [ "xref_init", "xref_8php.html#a9bee399213b8de8226b0d60834307473", null ]
+]; \ No newline at end of file
diff --git a/doc/html/zfinger_8php.html b/doc/html/zfinger_8php.html
new file mode 100644
index 000000000..b35337c42
--- /dev/null
+++ b/doc/html/zfinger_8php.html
@@ -0,0 +1,141 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/zfinger.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('zfinger_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">zfinger.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a8139b83a22ef98869adc10aa224027a0"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a8139b83a22ef98869adc10aa224027a0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a8139b83a22ef98869adc10aa224027a0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">zfinger_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>The special address '[system]' will return a system channel if one has been defined, Or the first valid channel we find if there are no system channels.</p>
+<p>This is used by magic-auth if we have no prior communications with this site - and returns an identity on this site which we can use to create a valid hub record so that we can exchange signed messages. The precise identity is irrelevant. It's the hub information that we really need at the other end - and this will return it.</p>
+
+<p>Referenced by <a class="el" href="__well__known_8php.html#a6ebfa937a2024f0b5dab53f0ac90fed0">_well_known_init()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/zfinger_8php.js b/doc/html/zfinger_8php.js
new file mode 100644
index 000000000..9bee68767
--- /dev/null
+++ b/doc/html/zfinger_8php.js
@@ -0,0 +1,4 @@
+var zfinger_8php =
+[
+ [ "zfinger_init", "zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0", null ]
+]; \ No newline at end of file
diff --git a/doc/html/zot_8php.html b/doc/html/zot_8php.html
new file mode 100644
index 000000000..b9e8c7180
--- /dev/null
+++ b/doc/html/zot_8php.html
@@ -0,0 +1,1101 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/zot.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('zot_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">zot.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ab22d67660702056bf3f4696dcebf5ce7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="zot_8php.html#ab22d67660702056bf3f4696dcebf5ce7">zot_new_uid</a> ($channel_nick)</td></tr>
+<tr class="separator:ab22d67660702056bf3f4696dcebf5ce7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae7cec2b417b5858fd4a41070f843d1d7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="zot_8php.html#ae7cec2b417b5858fd4a41070f843d1d7">zot_get_hublocs</a> ($hash)</td></tr>
+<tr class="separator:ae7cec2b417b5858fd4a41070f843d1d7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3862b3161b2c8557dc1a95020179bd81"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="zot_8php.html#a3862b3161b2c8557dc1a95020179bd81">zot_build_packet</a> ($channel, $type= 'notify', $recipients=null, $remote_key=null, $secret=null)</td></tr>
+<tr class="separator:a3862b3161b2c8557dc1a95020179bd81"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab3e9b99ddb11353f37f265a05bb42142"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="zot_8php.html#ab3e9b99ddb11353f37f265a05bb42142">zot_zot</a> ($url, $data)</td></tr>
+<tr class="separator:ab3e9b99ddb11353f37f265a05bb42142"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a95528377d7303131958c9f0b7158fdce"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="zot_8php.html#a95528377d7303131958c9f0b7158fdce">zot_finger</a> ($webbie, $channel, $autofallback=true)</td></tr>
+<tr class="separator:a95528377d7303131958c9f0b7158fdce"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7b23bfb31d4491231e1e73bdc077240d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="zot_8php.html#a7b23bfb31d4491231e1e73bdc077240d">zot_refresh</a> ($them, $channel=null)</td></tr>
+<tr class="separator:a7b23bfb31d4491231e1e73bdc077240d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a55056e863a7860bc0cf922e78fcce073"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="zot_8php.html#a55056e863a7860bc0cf922e78fcce073">zot_gethub</a> ($arr)</td></tr>
+<tr class="separator:a55056e863a7860bc0cf922e78fcce073"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5bcdfef419b16075a0eca990956223dc"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="zot_8php.html#a5bcdfef419b16075a0eca990956223dc">zot_register_hub</a> ($arr)</td></tr>
+<tr class="separator:a5bcdfef419b16075a0eca990956223dc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a56f3f65514e4e7f0cd117d01735aebd1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="zot_8php.html#a56f3f65514e4e7f0cd117d01735aebd1">import_xchan</a> ($arr, $ud_flags=1)</td></tr>
+<tr class="separator:a56f3f65514e4e7f0cd117d01735aebd1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a928f5643ca66ae9635d85aeb2be62e03"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="zot_8php.html#a928f5643ca66ae9635d85aeb2be62e03">zot_process_response</a> ($hub, $arr, $outq)</td></tr>
+<tr class="separator:a928f5643ca66ae9635d85aeb2be62e03"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a61cdc1ec843663c423ed2d8160ae5aea"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="zot_8php.html#a61cdc1ec843663c423ed2d8160ae5aea">zot_fetch</a> ($arr)</td></tr>
+<tr class="separator:a61cdc1ec843663c423ed2d8160ae5aea"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aeea071f17e306fe3d0c488551906bfab"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="zot_8php.html#aeea071f17e306fe3d0c488551906bfab">zot_import</a> ($arr, $sender_url)</td></tr>
+<tr class="separator:aeea071f17e306fe3d0c488551906bfab"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a083aec6c900d244e1bfc1406f9461465"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="zot_8php.html#a083aec6c900d244e1bfc1406f9461465">public_recips</a> ($msg)</td></tr>
+<tr class="separator:a083aec6c900d244e1bfc1406f9461465"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a703f528ade8382cf374e4119bd6f7859"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="zot_8php.html#a703f528ade8382cf374e4119bd6f7859">allowed_public_recips</a> ($msg)</td></tr>
+<tr class="separator:a703f528ade8382cf374e4119bd6f7859"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a37ec13b18057634eadb071f05297f5e1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="zot_8php.html#a37ec13b18057634eadb071f05297f5e1">process_delivery</a> ($sender, $arr, $deliveries, $relay)</td></tr>
+<tr class="separator:a37ec13b18057634eadb071f05297f5e1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aad25a3fe0e1566121d6fb8222979bc10"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="zot_8php.html#aad25a3fe0e1566121d6fb8222979bc10">remove_community_tag</a> ($sender, $arr, $uid)</td></tr>
+<tr class="separator:aad25a3fe0e1566121d6fb8222979bc10"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a31aad56acf8ff8f2353e6ff8595544df"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="zot_8php.html#a31aad56acf8ff8f2353e6ff8595544df">update_imported_item</a> ($sender, $item, $uid)</td></tr>
+<tr class="separator:a31aad56acf8ff8f2353e6ff8595544df"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:adfeb9400ae6b726beec89f8f1e8fde72"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="zot_8php.html#adfeb9400ae6b726beec89f8f1e8fde72">delete_imported_item</a> ($sender, $item, $uid)</td></tr>
+<tr class="separator:adfeb9400ae6b726beec89f8f1e8fde72"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa6ae96db8cbbdbb10e6876d206bbf7cc"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="zot_8php.html#aa6ae96db8cbbdbb10e6876d206bbf7cc">process_mail_delivery</a> ($sender, $arr, $deliveries)</td></tr>
+<tr class="separator:aa6ae96db8cbbdbb10e6876d206bbf7cc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9a57b40669351c9791126b925cb7ef3b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="zot_8php.html#a9a57b40669351c9791126b925cb7ef3b">process_profile_delivery</a> ($sender, $arr, $deliveries)</td></tr>
+<tr class="separator:a9a57b40669351c9791126b925cb7ef3b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aeec89da5b6ff090c63a79de4de884a35"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="zot_8php.html#aeec89da5b6ff090c63a79de4de884a35">import_directory_profile</a> ($hash, $profile, $addr, $ud_flags=1, $suppress_update=0)</td></tr>
+<tr class="separator:aeec89da5b6ff090c63a79de4de884a35"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3bf11286c2619b4ca28e49d5b5ab374a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="zot_8php.html#a3bf11286c2619b4ca28e49d5b5ab374a">import_directory_keywords</a> ($hash, $keywords)</td></tr>
+<tr class="separator:a3bf11286c2619b4ca28e49d5b5ab374a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab319d1d9fff9c7775d9daef42d1f33dd"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="zot_8php.html#ab319d1d9fff9c7775d9daef42d1f33dd">update_modtime</a> ($hash, $guid, $addr, $flags=0)</td></tr>
+<tr class="separator:ab319d1d9fff9c7775d9daef42d1f33dd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2657e141d62d5f67ad3c87651b585299"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="zot_8php.html#a2657e141d62d5f67ad3c87651b585299">import_site</a> ($arr, $pubkey)</td></tr>
+<tr class="separator:a2657e141d62d5f67ad3c87651b585299"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac34e479d27f32b82dd6b33542f81a6a7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="zot_8php.html#ac34e479d27f32b82dd6b33542f81a6a7">build_sync_packet</a> ($uid=0, $packet=null)</td></tr>
+<tr class="separator:ac34e479d27f32b82dd6b33542f81a6a7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac301c67864917c35922257950ae0f95c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="zot_8php.html#ac301c67864917c35922257950ae0f95c">process_channel_sync_delivery</a> ($sender, $arr, $deliveries)</td></tr>
+<tr class="separator:ac301c67864917c35922257950ae0f95c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8e22dbc6f884be3644a892a876cbd972"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="zot_8php.html#a8e22dbc6f884be3644a892a876cbd972">get_rpost_path</a> ($observer)</td></tr>
+<tr class="separator:a8e22dbc6f884be3644a892a876cbd972"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad149f1e98c0c5b88ff9147e6ee3f330d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="zot_8php.html#ad149f1e98c0c5b88ff9147e6ee3f330d">import_author_zot</a> ($<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>)</td></tr>
+<tr class="separator:ad149f1e98c0c5b88ff9147e6ee3f330d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a703f528ade8382cf374e4119bd6f7859"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">allowed_public_recips </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$msg</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="zot_8php.html#aeea071f17e306fe3d0c488551906bfab">zot_import()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ac34e479d27f32b82dd6b33542f81a6a7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">build_sync_packet </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em> = <code>0</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$packet</em> = <code>null</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Send a zot packet to all hubs where this channel is duplicated, refreshing such things as personal settings, channel permissions, address book updates, etc. </p>
+
+<p>Referenced by <a class="el" href="connections_8php.html#a15af118efee9c948b6f8294e54a73bb2">connections_clone()</a>, <a class="el" href="connedit_8php.html#a707ea7e63cf9674025b1d6b081ae74f5">connedit_clone()</a>, and <a class="el" href="settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586">settings_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="adfeb9400ae6b726beec89f8f1e8fde72"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">delete_imported_item </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$sender</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="zot_8php.html#a37ec13b18057634eadb071f05297f5e1">process_delivery()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a8e22dbc6f884be3644a892a876cbd972"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_rpost_path </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$observer</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="bbcode_8php.html#a5165a5221a52cf1bc1d7812ebd2069c7">rpost_callback()</a>, and <a class="el" href="rpost_8php.html#a8190354d789000806d9879aea276728f">rpost_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ad149f1e98c0c5b88ff9147e6ee3f330d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">import_author_zot </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$x</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#ae73794179b62d39bb597ff670ab1c1e5">import_author_xchan()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a3bf11286c2619b4ca28e49d5b5ab374a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">import_directory_keywords </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$hash</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$keywords</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="zot_8php.html#aeec89da5b6ff090c63a79de4de884a35">import_directory_profile()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aeec89da5b6ff090c63a79de4de884a35"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">import_directory_profile </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$hash</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$profile</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$addr</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$ud_flags</em> = <code>1</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$suppress_update</em> = <code>0</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="zot_8php.html#a56f3f65514e4e7f0cd117d01735aebd1">import_xchan()</a>, <a class="el" href="zot_8php.html#a9a57b40669351c9791126b925cb7ef3b">process_profile_delivery()</a>, and <a class="el" href="dir__fns_8php.html#a6cae22cfdd6edda5ddf09e07abb3242a">syncdirs()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a2657e141d62d5f67ad3c87651b585299"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">import_site </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$pubkey</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="zot_8php.html#a56f3f65514e4e7f0cd117d01735aebd1">import_xchan()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a56f3f65514e4e7f0cd117d01735aebd1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">import_xchan </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$ud_flags</em> = <code>1</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>import_xchan($arr,$ud_flags = 1) Takes an associative array of a fecthed discovery packet and updates all internal data structures which need to be updated as a result.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype">array</td><td class="paramname">$arr</td><td>=&gt; json_decoded discovery packet </td></tr>
+ <tr><td class="paramtype">int</td><td class="paramname">$ud_flags</td><td>Determines whether to create a directory update record if any changes occur, default 1 or true</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>array =&gt; 'success' (boolean true or false) 'message' (optional error string only if success is false) </dd></dl>
+
+<p>Referenced by <a class="el" href="chanview_8php.html#a4192c6da888c8c1165851acf9ad4cb8b">chanview_content()</a>, <a class="el" href="gprobe_8php.html#adf72cb0a70b5b9d99fdec1cc60e18ed1">gprobe_run()</a>, <a class="el" href="magic_8php.html#acea2cc792849ca2d71d4b689f66518bf">magic_init()</a>, <a class="el" href="mail_8php.html#acfc2cc0bf4e0b178207758384977f25a">mail_post()</a>, <a class="el" href="include_2follow_8php.html#ae387d4ae097c23d69f3247e7f08140c7">new_contact()</a>, <a class="el" href="socgraph_8php.html#a5ef8bef37161df53718a21e93d02fbd6">poco_load()</a>, <a class="el" href="post_8php.html#af4b48181ce773ef0cdfc972441445c34">post_init()</a>, <a class="el" href="dir__fns_8php.html#a44062d4b471d1e83f92f6c184585aa13">update_directory_entry()</a>, <a class="el" href="zot_8php.html#a7b23bfb31d4491231e1e73bdc077240d">zot_refresh()</a>, and <a class="el" href="zot_8php.html#a5bcdfef419b16075a0eca990956223dc">zot_register_hub()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ac301c67864917c35922257950ae0f95c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">process_channel_sync_delivery </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$sender</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$deliveries</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="zot_8php.html#aeea071f17e306fe3d0c488551906bfab">zot_import()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a37ec13b18057634eadb071f05297f5e1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">process_delivery </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$sender</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$deliveries</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$relay</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="onepoll_8php.html#a72753b2fdec79b37c7f432035c91fb6d">onepoll_run()</a>, and <a class="el" href="zot_8php.html#aeea071f17e306fe3d0c488551906bfab">zot_import()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa6ae96db8cbbdbb10e6876d206bbf7cc"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">process_mail_delivery </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$sender</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$deliveries</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="zot_8php.html#aeea071f17e306fe3d0c488551906bfab">zot_import()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a9a57b40669351c9791126b925cb7ef3b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">process_profile_delivery </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$sender</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$deliveries</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="zot_8php.html#aeea071f17e306fe3d0c488551906bfab">zot_import()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a083aec6c900d244e1bfc1406f9461465"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">public_recips </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$msg</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="zot_8php.html#a703f528ade8382cf374e4119bd6f7859">allowed_public_recips()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aad25a3fe0e1566121d6fb8222979bc10"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">remove_community_tag </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$sender</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="zot_8php.html#a37ec13b18057634eadb071f05297f5e1">process_delivery()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a31aad56acf8ff8f2353e6ff8595544df"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">update_imported_item </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$sender</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="zot_8php.html#a37ec13b18057634eadb071f05297f5e1">process_delivery()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ab319d1d9fff9c7775d9daef42d1f33dd"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">update_modtime </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$hash</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$guid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$addr</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$flags</em> = <code>0</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="zot_8php.html#aeec89da5b6ff090c63a79de4de884a35">import_directory_profile()</a>, <a class="el" href="zot_8php.html#a56f3f65514e4e7f0cd117d01735aebd1">import_xchan()</a>, and <a class="el" href="dir__fns_8php.html#a6cae22cfdd6edda5ddf09e07abb3242a">syncdirs()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a3862b3161b2c8557dc1a95020179bd81"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">zot_build_packet </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em> = <code>'notify'</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$recipients</em> = <code>null</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$remote_key</em> = <code>null</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$secret</em> = <code>null</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>zot_build_packet($channel,$type = 'notify',$recipients = null, $remote_key = null, $secret = null) builds a zot notification packet that you can either store in the queue with a message array or call zot_zot to immediately zot it to the other side</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype">array</td><td class="paramname">$channel</td><td>=&gt; sender channel structure </td></tr>
+ <tr><td class="paramtype">string</td><td class="paramname">$type</td><td>=&gt; packet type: one of 'ping', 'pickup', 'purge', 'refresh', 'notify', 'auth_check' </td></tr>
+ <tr><td class="paramtype">array</td><td class="paramname">$recipients</td><td>=&gt; envelope information, array ( 'guid' =&gt; string, 'guid_sig' =&gt; string ); empty for public posts </td></tr>
+ <tr><td class="paramtype">string</td><td class="paramname">$remote_key</td><td>=&gt; optional public site key of target hub used to encrypt entire packet NOTE: remote_key and encrypted packets are required for 'auth_check' packets, optional for all others </td></tr>
+ <tr><td class="paramtype">string</td><td class="paramname">$secret</td><td>=&gt; random string, required for packets which require verification/callback e.g. 'pickup', 'purge', 'notify', 'auth_check' &mdash; 'ping' and 'refresh' do not require verification</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>string json encoded zot packet </dd></dl>
+
+<p>Referenced by <a class="el" href="zot_8php.html#ac34e479d27f32b82dd6b33542f81a6a7">build_sync_packet()</a>, <a class="el" href="include_2directory_8php.html#aa75d3b0697ca1456aaabdb37a74aa0f0">directory_run()</a>, <a class="el" href="notifier_8php.html#a568c502f626cff95e344c0748938b85d">notifier_run()</a>, <a class="el" href="post_8php.html#af4b48181ce773ef0cdfc972441445c34">post_init()</a>, and <a class="el" href="zping_8php.html#a4d3a6b0b8b04ed6469015823e615ee75">zping_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a61cdc1ec843663c423ed2d8160ae5aea"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">zot_fetch </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>zot_fetch($arr) </p>
+<pre class="fragment">We received a notification packet (in mod/post.php) that a message is waiting for us, and we've verified the sender.
+Now send back a pickup message, using our message tracking ID ($arr['secret']), which we will sign with our site private key.
+The entire pickup message is encrypted with the remote site's public key.
+If everything checks out on the remote end, we will receive back a packet containing one or more messages,
+which will be processed and delivered before this function ultimately returns.
+</pre><dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype">array</td><td class="paramname">$arr</td><td>decrypted and json decoded notify packet from remote site </td></tr>
+ </table>
+ </dd>
+</dl>
+
+<p>Referenced by <a class="el" href="post_8php.html#af59e6a1dc22d19d9257b01cd7ccedb75">post_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a95528377d7303131958c9f0b7158fdce"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">zot_finger </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$webbie</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$autofallback</em> = <code>true</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>: zot_finger</p>
+<p>Look up information about channel </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname"></td><td>string $webbie does not have to be host qualified e.g. 'foo' is treated as 'foo' </td></tr>
+ <tr><td class="paramname"></td><td>array $channel (optional), if supplied permissions will be enumerated specifically for $channel </td></tr>
+ <tr><td class="paramname"></td><td>boolean $autofallback fallback/failover to http if https connection cannot be established. Default is true.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>: array =&gt; see z_post_url and <a class="el" href="zfinger_8php.html">mod/zfinger.php</a> </dd></dl>
+
+<p>Referenced by <a class="el" href="chanview_8php.html#a4192c6da888c8c1165851acf9ad4cb8b">chanview_content()</a>, <a class="el" href="gprobe_8php.html#adf72cb0a70b5b9d99fdec1cc60e18ed1">gprobe_run()</a>, <a class="el" href="magic_8php.html#acea2cc792849ca2d71d4b689f66518bf">magic_init()</a>, <a class="el" href="mail_8php.html#acfc2cc0bf4e0b178207758384977f25a">mail_post()</a>, <a class="el" href="include_2follow_8php.html#ae387d4ae097c23d69f3247e7f08140c7">new_contact()</a>, <a class="el" href="socgraph_8php.html#a5ef8bef37161df53718a21e93d02fbd6">poco_load()</a>, <a class="el" href="post_8php.html#af4b48181ce773ef0cdfc972441445c34">post_init()</a>, <a class="el" href="probe_8php.html#a1f1db3fa6038e451e737964c94bf5e99">probe_content()</a>, and <a class="el" href="dir__fns_8php.html#a44062d4b471d1e83f92f6c184585aa13">update_directory_entry()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ae7cec2b417b5858fd4a41070f843d1d7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">zot_get_hublocs </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$hash</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>zot_get_hublocs($hash) Given a zot hash, return all distinct hubs. This function is used in building the zot discovery packet and therefore should only be used by channels which are defined on this hub </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype">string</td><td class="paramname">$hash</td><td>- xchan_hash array of hubloc (hub location structures) hubloc_id int hubloc_guid char(255) hubloc_guid_sig text hubloc_hash char(255) hubloc_addr char(255) hubloc_flags int hubloc_status int hubloc_url char(255) hubloc_url_sig text hubloc_host char(255) hubloc_callback char(255) hubloc_connect char(255) hubloc_sitekey text hubloc_updated datetime hubloc_connected datetime </td></tr>
+ </table>
+ </dd>
+</dl>
+<p>Only search for active hublocs - e.g. those that haven't been marked deleted </p>
+
+<p>Referenced by <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a55056e863a7860bc0cf922e78fcce073"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">zot_gethub </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>: zot_gethub</p>
+<p>A guid and a url, both signed by the sender, distinguish a known sender at a known location This function looks these up to see if the channel is known and therefore previously verified. If not, we will need to verify it.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype">array</td><td class="paramname">$arr</td><td>$arr must contain: string $arr['guid'] =&gt; guid of conversant string $arr['guid_sig'] =&gt; guid signed with conversant's private key string $arr['url'] =&gt; URL of the origination hub of this communication string $arr['url_sig'] =&gt; URL signed with conversant's private key</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>: array =&gt; hubloc record </dd></dl>
+
+<p>Referenced by <a class="el" href="import_8php.html#af17fef0410518f7eac205d0ea416eaa2">import_post()</a>, <a class="el" href="post_8php.html#af59e6a1dc22d19d9257b01cd7ccedb75">post_post()</a>, <a class="el" href="zot_8php.html#a61cdc1ec843663c423ed2d8160ae5aea">zot_fetch()</a>, and <a class="el" href="zot_8php.html#aeea071f17e306fe3d0c488551906bfab">zot_import()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aeea071f17e306fe3d0c488551906bfab"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">zot_import </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$sender_url</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>zot_import</p>
+<p>Process an incoming array of messages which were obtained via pickup, and import, update, delete as directed.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype">array</td><td class="paramname">$arr</td><td>=&gt; 'pickup' structure returned from remote site </td></tr>
+ <tr><td class="paramtype">string</td><td class="paramname">$sender_url</td><td>=&gt; the url specified by the sender in the initial communication we will verify the sender and url in each returned message structure and also verify that all the messages returned match the site url that we are currently processing.</td></tr>
+ </table>
+ </dd>
+</dl>
+<p>The message types handled here are 'activity' (e.g. posts), 'mail' , 'profile', and 'channel_sync'</p>
+<dl class="section return"><dt>Returns</dt><dd>array =&gt; array ( [0] =&gt; string $channel_hash, [1] =&gt; string $delivery_status, [2] =&gt; string $address ) suitable for logging remotely, enumerating the processing results of each message/recipient combination. </dd></dl>
+
+<p>Referenced by <a class="el" href="deliver_8php.html#a397afcb9afecf0c1816b0951189dd346">deliver_run()</a>, and <a class="el" href="zot_8php.html#a61cdc1ec843663c423ed2d8160ae5aea">zot_fetch()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ab22d67660702056bf3f4696dcebf5ce7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">zot_new_uid </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel_nick</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Red implementation of zot protocol.</p>
+<p><a href="https://github.com/friendica/red/wiki/zot">https://github.com/friendica/red/wiki/zot</a> <a href="https://github.com/friendica/red/wiki/Zot&mdash;A-High-Level-Overview">https://github.com/friendica/red/wiki/Zot&amp;mdash;A-High-Level-Overview</a></p>
+<p>zot_new_uid($channel_nick)</p>
+<p>Generates a unique string for use as a zot guid using our DNS-based url, the channel nickname and some entropy. The entropy ensures uniqueness against re-installs where the same URL and nickname are chosen. NOTE: zot doesn't require this to be unique. Internally we use a whirlpool hash of this guid and the signature of this guid signed with the channel private key. This can be verified and should make the probability of collision of the verified result negligible within the constraints of our immediate universe.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">string</td><td>channel_nickname = unique nickname of controlling entity</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>string </dd></dl>
+
+<p>Referenced by <a class="el" href="identity_8php.html#a345f4c943d84de502ec6e72d2c813945">create_identity()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a928f5643ca66ae9635d85aeb2be62e03"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">zot_process_response </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$hub</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$outq</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>zot_process_response($hub,$arr,$outq) { Called immediately after sending a zot message which is using queue processing Updates the queue item according to the response result and logs any information returned to aid communications troubleshooting.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype">string</td><td class="paramname">$hub</td><td>- url of site we just contacted </td></tr>
+ <tr><td class="paramtype">array</td><td class="paramname">$arr</td><td>- output of <a class="el" href="include_2network_8php.html#a9129fd55e7fc175b4ea9a195cccc16bc">z_post_url()</a> </td></tr>
+ <tr><td class="paramtype">array</td><td class="paramname">$outq</td><td>- The queue structure attached to this request</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>nothing </dd></dl>
+
+<p>Referenced by <a class="el" href="deliver_8php.html#a397afcb9afecf0c1816b0951189dd346">deliver_run()</a>, and <a class="el" href="queue_8php.html#af8c93de86d866c3200174c8450a0f341">queue_run()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a7b23bfb31d4491231e1e73bdc077240d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">zot_refresh </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$them</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel</em> = <code>null</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>: zot_refresh($them, $channel = null)</p>
+<p>zot_refresh is typically invoked when somebody has changed permissions of a channel and they are notified to fetch new permissions via a finger/discovery operation. This may result in a new connection (abook entry) being added to a local channel and it may result in auto-permissions being granted.</p>
+<p>Friending in zot is accomplished by sending a refresh packet to a specific channel which indicates a permission change has been made by the sender which affects the target channel. The hub controlling the target channel does targetted discovery (a zot-finger request requesting permissions for the local channel). These are decoded here, and if necessary and abook structure (addressbook) is created to store the permissions assigned to this channel.</p>
+<p>Initially these abook structures are created with a 'pending' flag, so that no reverse permissions are implied until this is approved by the owner channel. A channel can also auto-populate permissions in return and send back a refresh packet of its own. This is used by forum and group communication channels so that friending and membership in the channel's "club" is automatic.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype">array</td><td class="paramname">$them</td><td>=&gt; xchan structure of sender </td></tr>
+ <tr><td class="paramtype">array</td><td class="paramname">$channel</td><td>=&gt; local channel structure of target recipient, required for "friending" operations</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>boolean true if successful, else false </dd></dl>
+
+<p>Referenced by <a class="el" href="connedit_8php.html#a795acb3d9d841f55c255d7611681ab67">connedit_content()</a>, <a class="el" href="zot_8php.html#ad149f1e98c0c5b88ff9147e6ee3f330d">import_author_zot()</a>, <a class="el" href="onepoll_8php.html#a72753b2fdec79b37c7f432035c91fb6d">onepoll_run()</a>, and <a class="el" href="post_8php.html#af59e6a1dc22d19d9257b01cd7ccedb75">post_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a5bcdfef419b16075a0eca990956223dc"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">zot_register_hub </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>zot_register_hub($arr)</p>
+<p>A communication has been received which has an unknown (to us) sender. Perform discovery based on our calculated hash of the sender at the origination address. This will fetch the discovery packet of the sender, which contains the public key we need to verify our guid and url signatures.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype">array</td><td class="paramname">$arr</td><td>$arr must contain: string $arr['guid'] =&gt; guid of conversant string $arr['guid_sig'] =&gt; guid signed with conversant's private key string $arr['url'] =&gt; URL of the origination hub of this communication string $arr['url_sig'] =&gt; URL signed with conversant's private key</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>array =&gt; 'success' (boolean true or false) 'message' (optional error string only if success is false) </dd></dl>
+
+<p>Referenced by <a class="el" href="post_8php.html#af59e6a1dc22d19d9257b01cd7ccedb75">post_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ab3e9b99ddb11353f37f265a05bb42142"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">zot_zot </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$url</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$data</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>: zot_zot </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname"></td><td>string $url </td></tr>
+ <tr><td class="paramname"></td><td>array $data</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>: array =&gt; see z_post_url for returned data format </dd></dl>
+
+<p>Referenced by <a class="el" href="deliver_8php.html#a397afcb9afecf0c1816b0951189dd346">deliver_run()</a>, <a class="el" href="include_2directory_8php.html#aa75d3b0697ca1456aaabdb37a74aa0f0">directory_run()</a>, <a class="el" href="notifier_8php.html#a568c502f626cff95e344c0748938b85d">notifier_run()</a>, <a class="el" href="post_8php.html#af4b48181ce773ef0cdfc972441445c34">post_init()</a>, <a class="el" href="queue_8php.html#af8c93de86d866c3200174c8450a0f341">queue_run()</a>, <a class="el" href="zot_8php.html#a61cdc1ec843663c423ed2d8160ae5aea">zot_fetch()</a>, and <a class="el" href="zping_8php.html#a4d3a6b0b8b04ed6469015823e615ee75">zping_content()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/zot_8php.js b/doc/html/zot_8php.js
new file mode 100644
index 000000000..dd70498b0
--- /dev/null
+++ b/doc/html/zot_8php.js
@@ -0,0 +1,31 @@
+var zot_8php =
+[
+ [ "allowed_public_recips", "zot_8php.html#a703f528ade8382cf374e4119bd6f7859", null ],
+ [ "build_sync_packet", "zot_8php.html#ac34e479d27f32b82dd6b33542f81a6a7", null ],
+ [ "delete_imported_item", "zot_8php.html#adfeb9400ae6b726beec89f8f1e8fde72", null ],
+ [ "get_rpost_path", "zot_8php.html#a8e22dbc6f884be3644a892a876cbd972", null ],
+ [ "import_author_zot", "zot_8php.html#ad149f1e98c0c5b88ff9147e6ee3f330d", null ],
+ [ "import_directory_keywords", "zot_8php.html#a3bf11286c2619b4ca28e49d5b5ab374a", null ],
+ [ "import_directory_profile", "zot_8php.html#aeec89da5b6ff090c63a79de4de884a35", null ],
+ [ "import_site", "zot_8php.html#a2657e141d62d5f67ad3c87651b585299", null ],
+ [ "import_xchan", "zot_8php.html#a56f3f65514e4e7f0cd117d01735aebd1", null ],
+ [ "process_channel_sync_delivery", "zot_8php.html#ac301c67864917c35922257950ae0f95c", null ],
+ [ "process_delivery", "zot_8php.html#a37ec13b18057634eadb071f05297f5e1", null ],
+ [ "process_mail_delivery", "zot_8php.html#aa6ae96db8cbbdbb10e6876d206bbf7cc", null ],
+ [ "process_profile_delivery", "zot_8php.html#a9a57b40669351c9791126b925cb7ef3b", null ],
+ [ "public_recips", "zot_8php.html#a083aec6c900d244e1bfc1406f9461465", null ],
+ [ "remove_community_tag", "zot_8php.html#aad25a3fe0e1566121d6fb8222979bc10", null ],
+ [ "update_imported_item", "zot_8php.html#a31aad56acf8ff8f2353e6ff8595544df", null ],
+ [ "update_modtime", "zot_8php.html#ab319d1d9fff9c7775d9daef42d1f33dd", null ],
+ [ "zot_build_packet", "zot_8php.html#a3862b3161b2c8557dc1a95020179bd81", null ],
+ [ "zot_fetch", "zot_8php.html#a61cdc1ec843663c423ed2d8160ae5aea", null ],
+ [ "zot_finger", "zot_8php.html#a95528377d7303131958c9f0b7158fdce", null ],
+ [ "zot_get_hublocs", "zot_8php.html#ae7cec2b417b5858fd4a41070f843d1d7", null ],
+ [ "zot_gethub", "zot_8php.html#a55056e863a7860bc0cf922e78fcce073", null ],
+ [ "zot_import", "zot_8php.html#aeea071f17e306fe3d0c488551906bfab", null ],
+ [ "zot_new_uid", "zot_8php.html#ab22d67660702056bf3f4696dcebf5ce7", null ],
+ [ "zot_process_response", "zot_8php.html#a928f5643ca66ae9635d85aeb2be62e03", null ],
+ [ "zot_refresh", "zot_8php.html#a7b23bfb31d4491231e1e73bdc077240d", null ],
+ [ "zot_register_hub", "zot_8php.html#a5bcdfef419b16075a0eca990956223dc", null ],
+ [ "zot_zot", "zot_8php.html#ab3e9b99ddb11353f37f265a05bb42142", null ]
+]; \ No newline at end of file
diff --git a/doc/html/zotfeed_8php.html b/doc/html/zotfeed_8php.html
new file mode 100644
index 000000000..804fc8d80
--- /dev/null
+++ b/doc/html/zotfeed_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/zotfeed.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('zotfeed_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">zotfeed.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a24dfc23d366e7f840cf2847d0c1c8eac"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="zotfeed_8php.html#a24dfc23d366e7f840cf2847d0c1c8eac">zotfeed_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a24dfc23d366e7f840cf2847d0c1c8eac"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a24dfc23d366e7f840cf2847d0c1c8eac"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">zotfeed_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/zotfeed_8php.js b/doc/html/zotfeed_8php.js
new file mode 100644
index 000000000..e13749e5b
--- /dev/null
+++ b/doc/html/zotfeed_8php.js
@@ -0,0 +1,4 @@
+var zotfeed_8php =
+[
+ [ "zotfeed_init", "zotfeed_8php.html#a24dfc23d366e7f840cf2847d0c1c8eac", null ]
+]; \ No newline at end of file
diff --git a/doc/html/zperms_8php.html b/doc/html/zperms_8php.html
new file mode 100644
index 000000000..b5d7369e2
--- /dev/null
+++ b/doc/html/zperms_8php.html
@@ -0,0 +1,138 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Project: mod/zperms.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="r!-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Project
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('zperms_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">zperms.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a2f698dcd51150bda3146425f038da628"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="zperms_8php.html#a2f698dcd51150bda3146425f038da628">zperms_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a2f698dcd51150bda3146425f038da628"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a2f698dcd51150bda3146425f038da628"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">zperms_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>hmmm we probably shouldn't sign somebody else's hub. FIXME </p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/zperms_8php.js b/doc/html/zperms_8php.js
new file mode 100644
index 000000000..42c93a5b3
--- /dev/null
+++ b/doc/html/zperms_8php.js
@@ -0,0 +1,4 @@
+var zperms_8php =
+[
+ [ "zperms_init", "zperms_8php.html#a2f698dcd51150bda3146425f038da628", null ]
+]; \ No newline at end of file
diff --git a/doc/html/zping_8php.html b/doc/html/zping_8php.html
new file mode 100644
index 000000000..612181d13
--- /dev/null
+++ b/doc/html/zping_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/zping.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('zping_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">zping.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a4d3a6b0b8b04ed6469015823e615ee75"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="zping_8php.html#a4d3a6b0b8b04ed6469015823e615ee75">zping_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a4d3a6b0b8b04ed6469015823e615ee75"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a4d3a6b0b8b04ed6469015823e615ee75"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">zping_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/zping_8php.js b/doc/html/zping_8php.js
new file mode 100644
index 000000000..28a58de4a
--- /dev/null
+++ b/doc/html/zping_8php.js
@@ -0,0 +1,4 @@
+var zping_8php =
+[
+ [ "zping_content", "zping_8php.html#a4d3a6b0b8b04ed6469015823e615ee75", null ]
+]; \ No newline at end of file
diff --git a/doc/install/sample-lighttpd.conf b/doc/install/sample-lighttpd.conf
new file mode 100644
index 000000000..213719ac9
--- /dev/null
+++ b/doc/install/sample-lighttpd.conf
@@ -0,0 +1,85 @@
+# See http://redmine.lighttpd.net/projects/lighttpd/wiki/Docs:ConfigurationOptions
+
+### LOAD MODULES
+server.modules = (
+ "mod_access",
+ "mod_accesslog",
+ "mod_fastcgi",
+ "mod_redirect",
+ "mod_rewrite"
+)
+
+### BASIC STUFF
+server.port = 80
+
+server.username = "http"
+
+server.groupname = "http"
+
+server.document-root = "/path/to/your/www/files" #adjust to your setup
+
+server.errorlog = "/var/log/lighttpd/error.log"
+
+accesslog.filename = "/var/log/lighttpd/access.log"
+
+### DISABLE DIR LISTING
+dir-listing.activate = "disable"
+
+### DISABLE REJECT EXPECT HEADER
+### (needed for curl POST requests - otherwise they fail with error 417)
+server.reject-expect-100-with-417 = "disable"
+
+### DEFINE SUPPORTED INDEX FILENAMES
+index-file.names = (
+ "index.html",
+ "index.htm",
+ "index.php"
+)
+
+### DEFINE SUPPORTED MIME TYPES
+mimetype.assign = (
+ ".html" => "text/html",
+ ".htm" => "text/html",
+ ".css" => "text/css",
+ ".txt" => "text/plain",
+ ".svg" => "image/svg+xml",
+ ".jpg" => "image/jpeg",
+ ".png" => "image/png"
+)
+
+### DONT EVER SERVE FILES WITH EXTENSION
+static-file.exclude-extensions = ( ".php" )
+
+### PHP WITH PHP-FPM
+### (needs php-fpm installed and running)
+fastcgi.server = (
+ ".php" => (
+ "localhost" => (
+ "socket" => "/run/php-fpm/php-fpm.sock",
+ "broken-scriptfilename" => "enable",
+ "allow-x-sendfile" => "enable"
+ )
+ )
+)
+
+### ENABLE SSL
+$SERVER["socket"] == ":443" {
+ ssl.engine = "enable"
+ ssl.ca-file = "/etc/lighttpd/certs/ca-certs.crt" #adjust to your needs
+ ssl.pemfile = "/etc/lighttpd/certs/red-ssl.crt" #adjust to your needs
+}
+
+### RISTRICT ACCESS TO DIRECTORYS AND FILES
+$HTTP["url"] =~ "\.(out|log|htaccess)$" {
+ url.access-deny = ("")
+}
+
+$HTTP["url"] =~ "(^|/)\.git" {
+ url.access-deny = ("")
+}
+
+### URL REWRITE RULES
+url.rewrite-if-not-file = (
+ "^\/([^\?]*)\?(.*)$" => "/index.php?q=$1&$2",
+ "^\/(.*)$" => "/index.php?q=$1"
+)
diff --git a/doc/install/sample-nginx.conf b/doc/install/sample-nginx.conf
new file mode 100644
index 000000000..396e39fb8
--- /dev/null
+++ b/doc/install/sample-nginx.conf
@@ -0,0 +1,127 @@
+##
+# Red Nginx configuration
+# by Olaf Conradi
+#
+# On Debian based distributions you can add this file to
+# /etc/nginx/sites-available
+#
+# Then customize to your needs. To enable the configuration
+# symlink it to /etc/nginx/sites-enabled and reload Nginx using
+#
+# service nginx reload
+##
+
+##
+# You should look at the following URL's in order to grasp a solid understanding
+# of Nginx configuration files in order to fully unleash the power of Nginx.
+#
+# http://wiki.nginx.org/Pitfalls
+# http://wiki.nginx.org/QuickStart
+# http://wiki.nginx.org/Configuration
+##
+
+##
+# This configuration assumes your domain is example.net
+# You have a separate subdomain red.example.net
+# You want all red traffic to be https
+# You have an SSL certificate and key for your subdomain
+# You have PHP FastCGI Process Manager (php5-fpm) running on localhost
+# You have Red installed in /var/www/red
+##
+
+server {
+ listen 80;
+ server_name red.example.net;
+
+ index index.php;
+ root /var/www/red;
+ rewrite ^ https://red.example.net$request_uri? permanent;
+}
+
+##
+# Configure Red with SSL
+#
+# All requests are routed to the front controller
+# except for certain known file types like images, css, etc.
+# Those are served statically whenever possible with a
+# fall back to the front controller (needed for avatars, for example)
+##
+
+server {
+ listen 443 ssl;
+ server_name red.example.net;
+
+ ssl on;
+ ssl_certificate /etc/nginx/ssl/red.example.net.chain.pem;
+ ssl_certificate_key /etc/nginx/ssl/example.net.key;
+ ssl_session_timeout 5m;
+ ssl_protocols SSLv3 TLSv1;
+ ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv3:+EXP;
+ ssl_prefer_server_ciphers on;
+
+ index index.php;
+ charset utf-8;
+ root /var/www/red;
+ access_log /var/log/nginx/red.log;
+ #Uncomment the following line to include a standard configuration file
+ #include standard.conf
+ # allow uploads up to 20MB in size
+ client_max_body_size 20m;
+ client_body_buffer_size 128k;
+
+ # rewrite to front controller as default rule
+ location / {
+ rewrite ^/(.*) /index.php?q=$uri&$args last;
+ }
+
+ # make sure webfinger and other well known services aren't blocked
+ # by denying dot files and rewrite request to the front controller
+ location ^~ /.well-known/ {
+ allow all;
+ rewrite ^/(.*) /index.php?q=$uri&$args last;
+ }
+
+ # statically serve these file types when possible
+ # otherwise fall back to front controller
+ # allow browser to cache them
+ # added .htm for advanced source code editor library
+ location ~* \.(jpg|jpeg|gif|png|ico|css|js|htm|html|ttf|woff|svg)$ {
+ expires 30d;
+ try_files $uri /index.php?q=$uri&$args;
+ }
+
+ # block these file types
+ location ~* \.(tpl|md|tgz|log|out)$ {
+ deny all;
+ }
+
+ # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
+ # or a unix socket
+ location ~* \.php$ {
+ # Zero-day exploit defense.
+ # http://forum.nginx.org/read.php?2,88845,page=3
+ # Won't work properly (404 error) if the file is not stored on this
+ # server, which is entirely possible with php-fpm/php-fcgi.
+ # Comment the 'try_files' line out if you set up php-fpm/php-fcgi on
+ # another machine. And then cross your fingers that you won't get hacked.
+ try_files $uri =404;
+
+ # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
+ fastcgi_split_path_info ^(.+\.php)(/.+)$;
+
+ # With php5-cgi alone:
+ # fastcgi_pass 127.0.0.1:9000;
+
+ # With php5-fpm:
+ fastcgi_pass unix:/var/run/php5-fpm.sock;
+
+ include fastcgi_params;
+ fastcgi_index index.php;
+ fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
+ }
+
+ # deny access to all dot files
+ location ~ /\. {
+ deny all;
+ }
+}
diff --git a/doc/makingnewfriends.md b/doc/makingnewfriends.md
deleted file mode 100644
index 7eff1eda1..000000000
--- a/doc/makingnewfriends.md
+++ /dev/null
@@ -1,11 +0,0 @@
-This is your Suggested Friends page. If you get lost, you can <a href="help/makenewfriends">click this link</a> to bring yourself back here.
-
-This is a bit like the Friend Suggestions page of Facebook. Everybody on this list has agreed that they may be suggested as a friend. This means they're unlikely to refuse an introduction you send, and they want to meet new people too!
-
-See somebody you like the look of? Click the connect button beneath their photograph. This will bring you to the introductions page. Fill in the form as instructed, and add a small note (optional). Now, wait a bit and they'll accept your request - note that these are real people, and it might take a while. Now you've added one, you're probably lost. Click the link at the top of this page to go back to the suggested friends list and add some more.
-
-Feel uncomfortable adding people you don't know? Don't worry - that's where <a href="help/groupsandpages">Groups and Pages</a> come in!
-
-<iframe src="suggest" width="950" height="600"></iframe>
-
-
diff --git a/doc/network.md b/doc/network.md
deleted file mode 100644
index afb092395..000000000
--- a/doc/network.md
+++ /dev/null
@@ -1,9 +0,0 @@
-This is your Network Tab. If you get lost, you can <a href="help/network">click this link</a> to bring yourself back here.
-
-This is a bit like the Newsfeed at Facebook or the Stream at Diaspora. It's where all the posts from your contacts, groups, and feeds will appear. If you're new, you won't see anything in this page, unless you posted your status in the last step. If you've already added a few friends, you'll be able to see their posts. Here, you can comment, like, or dislike posts, or click on somebody's name to visit their profile page where you can write on their wall.
-
-Now we need to fill it up, the first step, is to <a href="help/peopleyouknow"> add people you already know from Facebook</a>.
-
-<iframe src="network" width="950" height="600"></iframe>
-
-
diff --git a/doc/peopleyouknow.md b/doc/peopleyouknow.md
deleted file mode 100644
index ae0c9ef59..000000000
--- a/doc/peopleyouknow.md
+++ /dev/null
@@ -1,13 +0,0 @@
-This is your connector settings page. If you get lost, you can <a href="help/network">click this link</a> to bring yourself back here.
-
-This is the bit that makes Friendica unique. You can connect to <i>anybody on the internet</i> from your Friendica account using this page! The available connectors varies depending on which plugins you have installed, but for now, we'll walk you through Facebook. Note that not all servers have the Facebook connector installed. If you can't find it in the list below, don't worry, we'll look at ways of connecting to more people in the following pages.
-
-The biggest of all social networks is Facebook. Fortunately, this connector is really easy. Scroll down the page, and click Facebook Connector Settings. Enter your Facebook user name and password and let the application (the connector) do everything the options suggest. You can <a href="https://github.com/friendica/friendica/wiki/How-to:-Friendica%E2%80%99s-Facebook-connector" target="_blank">fine tune this</a> or experiment with the other connectors too. If you need help, you can always ask at <a href="http://helpers.pyxis.uberspace.de/profile/helpers" target="_blank">Friendica Support</a> or <a href="help/Connectors" target="_blank">see the instructions here</a>.
-
-When you're ready, we can move on to <a href="help/makingnewfriends">making new friends</a>.
-
-
-
-<iframe src="settings/connectors" width="950" height="600"></iframe>
-
-
diff --git a/done b/done
deleted file mode 100644
index 3493971df..000000000
--- a/done
+++ /dev/null
@@ -1,175 +0,0 @@
-Files transitioned to Red:
-
-Legend:
-
-+ Mostly or completely transitioned
-? Minimally transitioned, probably needs more work
-= Unlikely to require changes
-- Not needed in Red
-
- (No marker - has not yet been transitioned, may have some patches applied)
-
-
-include/
-
-+ account.php
- acl_selectors.php
-+ activities.php
-? api.php
-? attach.php
-+ auth.php
-- bb2diaspora.php (check for function dependencies before removing)
-+ bbcode.php
-= cache.php
-= config.php
- Contact.php
- contact_selectors.php
- contact_widgets.php
-? conversation.php
-+ cronhooks.php
-? crypto.php
-+ datetime.php (todo: html removal)
-? dba.php
-? delivery.php
-+ directory.php
-- email.php
-+ enotify.php
-+ event.php
-+ expire.php
- fcontact.php
-? follow.php
- gprobe.php
-+ group.php
- html2bbcode.php
- html2plain.php
-+ identity.php
- iquery.php
-? items.php
-+ js_strings.php
-+ language.php
-? message.php
-- msgclean.php
-? nav.php
- network.php
-+ notifier.php
- oauth.php
- oembed.php
-? onepoll.php
-? Photo.php
-? plugin.php
-? poller.php
-? profile_advanced.php
- profile_selectors.php
-? queue_fn.php
-? queue.php
-- salmon.php
-= Scrape.php
-+ security.php
-? session.php
- socgraph.php
-= system_unavailable.php
-= template_processor.php
- text.php
-- user.php
-+ zot.php
-
-
-mod/
-
-+ abook.php -> moved to connections.php
-? acl.php
- admin.php
- allfriends.php
- api.php
-+ apps.php
-+ attach.php
-- auth.php
-- cb.php
- common.php
- community.php
-+ contactgroup.php
- crepair.php
- delegate.php
-? directory.php
- dirfind.php
- display.php
- editpost.php
-? events.php
- fbrowser.php
- feed.php
- filerm.php
- filer.php
- follow.php
- friendica.php -> moved to siteinfo.php, require HTML templating, more
- fsuggest.php
-+ group.php
-- hcard.php -> not needed
-= help.php
-+ home.php
- hostxrd.php -> probably not needed
-? install.php
- invite.php
-+ item.php
-+ like.php
-+ lockview.php
-+ login.php
-+ lostpass.php
-? magic.php
-+ manage.php
- match.php
-? message.php
-? mood.php
- msearch.php
-? network.php
- nogroup.php
- notifications.php
-+ notify.php
-? oembed.php
-+ oexchange.php
-+ opensearch.php
-= parse_url.php
-+ photo.php
- photos.php
-+ ping.php (needs more work)
-+ poco.php
- poke.php
-? post.php
-+ pretheme.php
-+ probe.php
-? profile_photo.php
-? profile.php
-+ profiles.php
- profperm.php
- qsearch.php
-+ randprof.php
-- redir.php
-+ register.php
-? regmod.php
- removeme.php
- rsd_xml.php (what do we need this for? What functionality/feature does it enable)
- search_ac.php
- search.php
- settings.php - partially done
-+ share.php
-+ smilies.php
-+ starred.php
- subthread.php
- suggest.php
- tagger.php
- tagrm.php
-? uexport.php
-? update_community.php - needs converting to json
-? update_network.php - needs converting to json
-? update_profile.php - needs converting to json
-? viewconnections.php
-? view.php
-+ viewsrc.php
-+ wall_attach.php (needs remote permissions refactor)
-+ wall_upload.php (needs remote permissions refactor)
- webfinger.php
-+ _well_known.php
- xrd.php
-+ zchannel.php
-+ zfinger.php
-? zperms.php
-
diff --git a/images/default-profile-mm.jpg b/images/default-profile-mm.jpg
deleted file mode 100644
index 79c1a8530..000000000
--- a/images/default-profile-mm.jpg
+++ /dev/null
Binary files differ
diff --git a/images/default-profile-sm.jpg b/images/default-profile-sm.jpg
deleted file mode 100644
index 348957fb4..000000000
--- a/images/default-profile-sm.jpg
+++ /dev/null
Binary files differ
diff --git a/images/default-profile.jpg b/images/default-profile.jpg
deleted file mode 100644
index 85fbca8cd..000000000
--- a/images/default-profile.jpg
+++ /dev/null
Binary files differ
diff --git a/images/default_profile_photos/blank/175.jpg b/images/default_profile_photos/blank/175.jpg
new file mode 100644
index 000000000..4024d6e88
--- /dev/null
+++ b/images/default_profile_photos/blank/175.jpg
Binary files differ
diff --git a/images/default_profile_photos/blank/48.jpg b/images/default_profile_photos/blank/48.jpg
new file mode 100644
index 000000000..e7c44fcff
--- /dev/null
+++ b/images/default_profile_photos/blank/48.jpg
Binary files differ
diff --git a/images/default_profile_photos/blank/80.jpg b/images/default_profile_photos/blank/80.jpg
new file mode 100644
index 000000000..767e1ee66
--- /dev/null
+++ b/images/default_profile_photos/blank/80.jpg
Binary files differ
diff --git a/images/person-175.jpg b/images/default_profile_photos/rainbow_man/175.jpg
index fc0ec3d77..fc0ec3d77 100644
--- a/images/person-175.jpg
+++ b/images/default_profile_photos/rainbow_man/175.jpg
Binary files differ
diff --git a/images/person-48.jpg b/images/default_profile_photos/rainbow_man/48.jpg
index dc5eb6e69..dc5eb6e69 100644
--- a/images/person-48.jpg
+++ b/images/default_profile_photos/rainbow_man/48.jpg
Binary files differ
diff --git a/images/person-80.jpg b/images/default_profile_photos/rainbow_man/80.jpg
index 75b8faf92..75b8faf92 100644
--- a/images/person-80.jpg
+++ b/images/default_profile_photos/rainbow_man/80.jpg
Binary files differ
diff --git a/images/default_profile_photos/red_koala/175.jpg b/images/default_profile_photos/red_koala/175.jpg
new file mode 100644
index 000000000..e49343b1d
--- /dev/null
+++ b/images/default_profile_photos/red_koala/175.jpg
Binary files differ
diff --git a/images/default_profile_photos/red_koala/48.jpg b/images/default_profile_photos/red_koala/48.jpg
new file mode 100644
index 000000000..90e6d3a10
--- /dev/null
+++ b/images/default_profile_photos/red_koala/48.jpg
Binary files differ
diff --git a/images/default_profile_photos/red_koala/80.jpg b/images/default_profile_photos/red_koala/80.jpg
new file mode 100644
index 000000000..efab04c26
--- /dev/null
+++ b/images/default_profile_photos/red_koala/80.jpg
Binary files differ
diff --git a/images/diaspora.png b/images/diaspora.png
deleted file mode 100644
index 725fae718..000000000
--- a/images/diaspora.png
+++ /dev/null
Binary files differ
diff --git a/images/friendica-128.jpg b/images/friendica-128.jpg
deleted file mode 100644
index f7d86ae50..000000000
--- a/images/friendica-128.jpg
+++ /dev/null
Binary files differ
diff --git a/images/friendica-128.png b/images/friendica-128.png
deleted file mode 100644
index d2792ab54..000000000
--- a/images/friendica-128.png
+++ /dev/null
Binary files differ
diff --git a/images/friendica-16.jpg b/images/friendica-16.jpg
deleted file mode 100644
index ce59a70a0..000000000
--- a/images/friendica-16.jpg
+++ /dev/null
Binary files differ
diff --git a/images/friendica-16.png b/images/friendica-16.png
deleted file mode 100644
index 745b7ac6c..000000000
--- a/images/friendica-16.png
+++ /dev/null
Binary files differ
diff --git a/images/friendica-1600.png b/images/friendica-1600.png
deleted file mode 100644
index 615a81dd9..000000000
--- a/images/friendica-1600.png
+++ /dev/null
Binary files differ
diff --git a/images/friendica-256.jpg b/images/friendica-256.jpg
deleted file mode 100644
index 182810d62..000000000
--- a/images/friendica-256.jpg
+++ /dev/null
Binary files differ
diff --git a/images/friendica-256.png b/images/friendica-256.png
deleted file mode 100644
index e965fbaba..000000000
--- a/images/friendica-256.png
+++ /dev/null
Binary files differ
diff --git a/images/friendica-32.jpg b/images/friendica-32.jpg
deleted file mode 100644
index 4e697411d..000000000
--- a/images/friendica-32.jpg
+++ /dev/null
Binary files differ
diff --git a/images/friendica-32.png b/images/friendica-32.png
deleted file mode 100644
index 61764bf20..000000000
--- a/images/friendica-32.png
+++ /dev/null
Binary files differ
diff --git a/images/friendica-48.png b/images/friendica-48.png
deleted file mode 100644
index f858d9a81..000000000
--- a/images/friendica-48.png
+++ /dev/null
Binary files differ
diff --git a/images/friendica-64.jpg b/images/friendica-64.jpg
deleted file mode 100644
index 050830fff..000000000
--- a/images/friendica-64.jpg
+++ /dev/null
Binary files differ
diff --git a/images/friendica-64.png b/images/friendica-64.png
deleted file mode 100644
index 88cb8b016..000000000
--- a/images/friendica-64.png
+++ /dev/null
Binary files differ
diff --git a/images/friendica-96.png b/images/friendica-96.png
deleted file mode 100644
index 76a102ef2..000000000
--- a/images/friendica-96.png
+++ /dev/null
Binary files differ
diff --git a/images/friendica-red.svg b/images/friendica-red.svg
deleted file mode 100644
index b8afb09c7..000000000
--- a/images/friendica-red.svg
+++ /dev/null
@@ -1,240 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:cc="http://creativecommons.org/ns#"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:xlink="http://www.w3.org/1999/xlink"
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- width="96"
- height="96"
- id="svg2"
- version="1.1"
- inkscape:version="0.48.2 r9819"
- sodipodi:docname="friendica-red.svg"
- inkscape:export-filename="/home/meta/Documents/My random images/friendika.png"
- inkscape:export-xdpi="80.552788"
- inkscape:export-ydpi="80.552788">
- <defs
- id="defs4">
- <linearGradient
- id="highlightgradient">
- <stop
- id="stop3833"
- offset="0"
- style="stop-color:#ffffff;stop-opacity:0.74374998;" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop3829" />
- </linearGradient>
- <linearGradient
- id="shadowgradient">
- <stop
- id="stop3833-5"
- offset="0"
- style="stop-color:#000000;stop-opacity:0.5;" />
- <stop
- style="stop-color:#818080;stop-opacity:0;"
- offset="1"
- id="stop3829-9" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#highlightgradient"
- id="linearGradient4011"
- x1="44.948269"
- y1="0"
- x2="54.103466"
- y2="46.797421"
- gradientUnits="userSpaceOnUse"
- gradientTransform="scale(1,0.54545455)" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#shadowgradient"
- id="linearGradient4021"
- x1="52.016712"
- y1="96"
- x2="42.867535"
- y2="41.837971"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,0.5,0,48)" />
- <filter
- inkscape:collect="always"
- id="filter4055"
- x="-0.03"
- width="1.06"
- y="-0.12"
- height="1.24">
- <feGaussianBlur
- inkscape:collect="always"
- stdDeviation="1.2"
- id="feGaussianBlur4057" />
- </filter>
- <filter
- inkscape:collect="always"
- id="filter4059"
- x="-0.029877551"
- width="1.0597551"
- y="-0.122"
- height="1.244">
- <feGaussianBlur
- inkscape:collect="always"
- stdDeviation="1.22"
- id="feGaussianBlur4061" />
- </filter>
- </defs>
- <sodipodi:namedview
- id="base"
- pagecolor="#ffffff"
- bordercolor="#666666"
- borderopacity="1.0"
- inkscape:pageopacity="0.0"
- inkscape:pageshadow="2"
- inkscape:zoom="2.9132799"
- inkscape:cx="53.033009"
- inkscape:cy="2.8284271"
- inkscape:document-units="px"
- inkscape:current-layer="layer1"
- showgrid="true"
- width="256px"
- inkscape:snap-global="true"
- inkscape:window-width="1680"
- inkscape:window-height="1010"
- inkscape:window-x="194"
- inkscape:window-y="0"
- inkscape:window-maximized="0">
- <inkscape:grid
- type="xygrid"
- id="grid2985"
- empspacing="3"
- visible="true"
- enabled="true"
- snapvisiblegridlinesonly="true"
- spacingx="2px"
- spacingy="2px" />
- </sodipodi:namedview>
- <metadata
- id="metadata7">
- <rdf:RDF>
- <cc:Work
- rdf:about="">
- <dc:format>image/svg+xml</dc:format>
- <dc:type
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
- <dc:title />
- </cc:Work>
- </rdf:RDF>
- </metadata>
- <g
- inkscape:label="Colors"
- inkscape:groupmode="layer"
- id="layer1"
- transform="translate(0,-956.3622)"
- style="display:inline">
- <path
- style="fill:#ff0000;fill-opacity:1;stroke:none"
- d="M 16,0 C 7.0091019,0.04308252 0,7.0521845 0,16 0,16 0,57.499123 0,80 0,89.120146 7.0091019,96 16,96 L 32,96 32,70 64,70 63.916016,46.068359 32,46.236328 32,26 64,26 64,0 C 64,0 24,0 16,0 z"
- transform="translate(0,956.3622)"
- id="rect2993"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccsccccccccc" />
- <path
- style="fill:#00ffff;fill-opacity:1;stroke:none"
- d="m 80,1052.3622 c 8.990898,0 16.086165,-6.966 16,-16 0,0 0,-41.4991 0,-64 0.07767,-9.01639 -7.067354,-16 -16,-16 l -16,0 0,26 -32,0 0,22 32,0 0,22 -32,0 0,26 c 0,0 32,0 48,0 z"
- id="rect2993-6"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccsccccccccc" />
- </g>
- <g
- style="display:inline"
- inkscape:label="Lines as original logo"
- id="g3997"
- inkscape:groupmode="layer">
- <path
- sodipodi:nodetypes="cccccccc"
- inkscape:connector-curvature="0"
- id="path3999"
- d="m 64,0 0,26 -32,0 0,22 m 32,0 0,22 -32,0 0,26"
- style="fill:none;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
- <rect
- ry="16"
- rx="16"
- y="0"
- x="0"
- height="96"
- width="96"
- id="rect4001"
- style="fill:none;stroke:#000000;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
- </g>
- <g
- inkscape:groupmode="layer"
- id="layer3"
- inkscape:label="Lines with center break"
- style="display:none">
- <path
- style="fill:none;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- d="m 64,0 0,26 -32,0 0,22 32,0 0,22 -32,0 0,26"
- id="path3926"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccccccc" />
- <rect
- style="fill:none;stroke:#000000;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- id="rect3928"
- width="96"
- height="96"
- x="0"
- y="0"
- rx="16"
- ry="16" />
- </g>
- <g
- inkscape:groupmode="layer"
- id="layer2"
- inkscape:label="Effects"
- style="display:inline">
- <rect
- style="fill:url(#linearGradient3930);fill-opacity:1;stroke:none"
- id="rect3823"
- width="96"
- height="48.04369"
- x="-3.1086245e-15"
- y="1.8024861e-14"
- ry="15.215644"
- rx="15.214664" />
- <rect
- style="fill:url(#linearGradient3904);fill-opacity:1;stroke:none"
- id="rect3823-8"
- width="96"
- height="47.86721"
- x="1.5376101e-14"
- y="-96"
- ry="15.159752"
- rx="15.214664"
- transform="scale(1,-1)" />
- <rect
- style="fill:url(#linearGradient4011);fill-opacity:1;stroke:none;filter:url(#filter4059)"
- id="rect4003"
- width="98"
- height="24"
- x="0"
- y="0"
- rx="15.214664"
- ry="8.2994423"
- transform="matrix(1.0296115,0,0,1.1963836,-2.901924,-4.7132067)" />
- <rect
- style="opacity:0.56746030000000003;fill:url(#linearGradient4021);fill-opacity:1;stroke:none;filter:url(#filter4055)"
- id="rect4013"
- width="96"
- height="24"
- x="0"
- y="72"
- rx="14.008356"
- ry="12"
- transform="matrix(0.9768331,0,0,0.91974646,1.1649641,8.098115)" />
- </g>
-</svg>
diff --git a/images/friendica-red.xcf b/images/friendica-red.xcf
deleted file mode 100644
index 811ecb1e7..000000000
--- a/images/friendica-red.xcf
+++ /dev/null
Binary files differ
diff --git a/images/friendica.svg b/images/friendica.svg
deleted file mode 100644
index 2105ef317..000000000
--- a/images/friendica.svg
+++ /dev/null
@@ -1,240 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:cc="http://creativecommons.org/ns#"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:xlink="http://www.w3.org/1999/xlink"
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- width="96"
- height="96"
- id="svg2"
- version="1.1"
- inkscape:version="0.48.0 r9654"
- sodipodi:docname="friendica.svg"
- inkscape:export-filename="/home/meta/Documents/My random images/friendica.png"
- inkscape:export-xdpi="80.552788"
- inkscape:export-ydpi="80.552788">
- <defs
- id="defs4">
- <linearGradient
- id="highlightgradient">
- <stop
- id="stop3833"
- offset="0"
- style="stop-color:#ffffff;stop-opacity:0.74374998;" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop3829" />
- </linearGradient>
- <linearGradient
- id="shadowgradient">
- <stop
- id="stop3833-5"
- offset="0"
- style="stop-color:#000000;stop-opacity:0.5;" />
- <stop
- style="stop-color:#818080;stop-opacity:0;"
- offset="1"
- id="stop3829-9" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#highlightgradient"
- id="linearGradient4011"
- x1="44.948269"
- y1="0"
- x2="54.103466"
- y2="46.797421"
- gradientUnits="userSpaceOnUse"
- gradientTransform="scale(1,0.54545455)" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#shadowgradient"
- id="linearGradient4021"
- x1="52.016712"
- y1="96"
- x2="42.867535"
- y2="41.837971"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,0.5,0,48)" />
- <filter
- inkscape:collect="always"
- id="filter4055"
- x="-0.03"
- width="1.06"
- y="-0.12"
- height="1.24">
- <feGaussianBlur
- inkscape:collect="always"
- stdDeviation="1.2"
- id="feGaussianBlur4057" />
- </filter>
- <filter
- inkscape:collect="always"
- id="filter4059"
- x="-0.029877551"
- width="1.0597551"
- y="-0.122"
- height="1.244">
- <feGaussianBlur
- inkscape:collect="always"
- stdDeviation="1.22"
- id="feGaussianBlur4061" />
- </filter>
- </defs>
- <sodipodi:namedview
- id="base"
- pagecolor="#ffffff"
- bordercolor="#666666"
- borderopacity="1.0"
- inkscape:pageopacity="0.0"
- inkscape:pageshadow="2"
- inkscape:zoom="2.9132799"
- inkscape:cx="53.033009"
- inkscape:cy="2.8284271"
- inkscape:document-units="px"
- inkscape:current-layer="layer1"
- showgrid="true"
- width="256px"
- inkscape:snap-global="true"
- inkscape:window-width="1680"
- inkscape:window-height="1010"
- inkscape:window-x="194"
- inkscape:window-y="0"
- inkscape:window-maximized="0">
- <inkscape:grid
- type="xygrid"
- id="grid2985"
- empspacing="3"
- visible="true"
- enabled="true"
- snapvisiblegridlinesonly="true"
- spacingx="2px"
- spacingy="2px" />
- </sodipodi:namedview>
- <metadata
- id="metadata7">
- <rdf:RDF>
- <cc:Work
- rdf:about="">
- <dc:format>image/svg+xml</dc:format>
- <dc:type
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
- <dc:title />
- </cc:Work>
- </rdf:RDF>
- </metadata>
- <g
- inkscape:label="Colors"
- inkscape:groupmode="layer"
- id="layer1"
- transform="translate(0,-956.3622)"
- style="display:inline">
- <path
- style="fill:#ffc019;fill-opacity:1;stroke:none"
- d="M 16,0 C 7.0091019,0.04308252 0,7.0521845 0,16 0,16 0,57.499123 0,80 0,89.120146 7.0091019,96 16,96 L 32,96 32,70 64,70 63.916016,46.068359 32,46.236328 32,26 64,26 64,0 C 64,0 24,0 16,0 z"
- transform="translate(0,956.3622)"
- id="rect2993"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccsccccccccc" />
- <path
- style="fill:#1872a2;fill-opacity:1;stroke:none"
- d="m 80,1052.3622 c 8.990898,0 16.086165,-6.966 16,-16 0,0 0,-41.4991 0,-64 0.07767,-9.01639 -7.067354,-16 -16,-16 l -16,0 0,26 -32,0 0,22 32,0 0,22 -32,0 0,26 c 0,0 32,0 48,0 z"
- id="rect2993-6"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccsccccccccc" />
- </g>
- <g
- style="display:inline"
- inkscape:label="Lines as original logo"
- id="g3997"
- inkscape:groupmode="layer">
- <path
- sodipodi:nodetypes="cccccccc"
- inkscape:connector-curvature="0"
- id="path3999"
- d="m 64,0 0,26 -32,0 0,22 m 32,0 0,22 -32,0 0,26"
- style="fill:none;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
- <rect
- ry="16"
- rx="16"
- y="0"
- x="0"
- height="96"
- width="96"
- id="rect4001"
- style="fill:none;stroke:#000000;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
- </g>
- <g
- inkscape:groupmode="layer"
- id="layer3"
- inkscape:label="Lines with center break"
- style="display:none">
- <path
- style="fill:none;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- d="m 64,0 0,26 -32,0 0,22 32,0 0,22 -32,0 0,26"
- id="path3926"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccccccc" />
- <rect
- style="fill:none;stroke:#000000;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- id="rect3928"
- width="96"
- height="96"
- x="0"
- y="0"
- rx="16"
- ry="16" />
- </g>
- <g
- inkscape:groupmode="layer"
- id="layer2"
- inkscape:label="Effects"
- style="display:inline">
- <rect
- style="fill:url(#linearGradient3930);fill-opacity:1;stroke:none"
- id="rect3823"
- width="96"
- height="48.04369"
- x="-3.1086245e-15"
- y="1.8024861e-14"
- ry="15.215644"
- rx="15.214664" />
- <rect
- style="fill:url(#linearGradient3904);fill-opacity:1;stroke:none"
- id="rect3823-8"
- width="96"
- height="47.86721"
- x="1.5376101e-14"
- y="-96"
- ry="15.159752"
- rx="15.214664"
- transform="scale(1,-1)" />
- <rect
- style="fill:url(#linearGradient4011);fill-opacity:1;stroke:none;filter:url(#filter4059)"
- id="rect4003"
- width="98"
- height="24"
- x="0"
- y="0"
- rx="15.214664"
- ry="8.2994423"
- transform="matrix(1.0296115,0,0,1.1963836,-2.901924,-4.7132067)" />
- <rect
- style="opacity:0.56746030000000003;fill:url(#linearGradient4021);fill-opacity:1;stroke:none;filter:url(#filter4055)"
- id="rect4013"
- width="96"
- height="24"
- x="0"
- y="72"
- rx="14.008356"
- ry="12"
- transform="matrix(0.9768331,0,0,0.91974646,1.1649641,8.098115)" />
- </g>
-</svg>
diff --git a/images/friendika-128.jpg b/images/friendika-128.jpg
deleted file mode 100644
index f7d86ae50..000000000
--- a/images/friendika-128.jpg
+++ /dev/null
Binary files differ
diff --git a/images/friendika-128.png b/images/friendika-128.png
deleted file mode 100644
index d2792ab54..000000000
--- a/images/friendika-128.png
+++ /dev/null
Binary files differ
diff --git a/images/friendika-16.jpg b/images/friendika-16.jpg
deleted file mode 100644
index ce59a70a0..000000000
--- a/images/friendika-16.jpg
+++ /dev/null
Binary files differ
diff --git a/images/friendika-16.png b/images/friendika-16.png
deleted file mode 100644
index 745b7ac6c..000000000
--- a/images/friendika-16.png
+++ /dev/null
Binary files differ
diff --git a/images/friendika-1600.png b/images/friendika-1600.png
deleted file mode 100644
index 615a81dd9..000000000
--- a/images/friendika-1600.png
+++ /dev/null
Binary files differ
diff --git a/images/friendika-256.jpg b/images/friendika-256.jpg
deleted file mode 100644
index 182810d62..000000000
--- a/images/friendika-256.jpg
+++ /dev/null
Binary files differ
diff --git a/images/friendika-256.png b/images/friendika-256.png
deleted file mode 100644
index e965fbaba..000000000
--- a/images/friendika-256.png
+++ /dev/null
Binary files differ
diff --git a/images/friendika-32.jpg b/images/friendika-32.jpg
deleted file mode 100644
index 4e697411d..000000000
--- a/images/friendika-32.jpg
+++ /dev/null
Binary files differ
diff --git a/images/friendika-32.png b/images/friendika-32.png
deleted file mode 100644
index 61764bf20..000000000
--- a/images/friendika-32.png
+++ /dev/null
Binary files differ
diff --git a/images/friendika-48.png b/images/friendika-48.png
deleted file mode 100644
index f858d9a81..000000000
--- a/images/friendika-48.png
+++ /dev/null
Binary files differ
diff --git a/images/friendika-64.jpg b/images/friendika-64.jpg
deleted file mode 100644
index 050830fff..000000000
--- a/images/friendika-64.jpg
+++ /dev/null
Binary files differ
diff --git a/images/friendika-64.png b/images/friendika-64.png
deleted file mode 100644
index 88cb8b016..000000000
--- a/images/friendika-64.png
+++ /dev/null
Binary files differ
diff --git a/images/friendika-96.png b/images/friendika-96.png
deleted file mode 100644
index 76a102ef2..000000000
--- a/images/friendika-96.png
+++ /dev/null
Binary files differ
diff --git a/images/friendika.svg b/images/friendika.svg
deleted file mode 100644
index 2155d0b00..000000000
--- a/images/friendika.svg
+++ /dev/null
@@ -1,240 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:cc="http://creativecommons.org/ns#"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:xlink="http://www.w3.org/1999/xlink"
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- width="96"
- height="96"
- id="svg2"
- version="1.1"
- inkscape:version="0.48.0 r9654"
- sodipodi:docname="friendika.svg"
- inkscape:export-filename="/home/meta/Documents/My random images/friendika.png"
- inkscape:export-xdpi="80.552788"
- inkscape:export-ydpi="80.552788">
- <defs
- id="defs4">
- <linearGradient
- id="highlightgradient">
- <stop
- id="stop3833"
- offset="0"
- style="stop-color:#ffffff;stop-opacity:0.74374998;" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop3829" />
- </linearGradient>
- <linearGradient
- id="shadowgradient">
- <stop
- id="stop3833-5"
- offset="0"
- style="stop-color:#000000;stop-opacity:0.5;" />
- <stop
- style="stop-color:#818080;stop-opacity:0;"
- offset="1"
- id="stop3829-9" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#highlightgradient"
- id="linearGradient4011"
- x1="44.948269"
- y1="0"
- x2="54.103466"
- y2="46.797421"
- gradientUnits="userSpaceOnUse"
- gradientTransform="scale(1,0.54545455)" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#shadowgradient"
- id="linearGradient4021"
- x1="52.016712"
- y1="96"
- x2="42.867535"
- y2="41.837971"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,0.5,0,48)" />
- <filter
- inkscape:collect="always"
- id="filter4055"
- x="-0.03"
- width="1.06"
- y="-0.12"
- height="1.24">
- <feGaussianBlur
- inkscape:collect="always"
- stdDeviation="1.2"
- id="feGaussianBlur4057" />
- </filter>
- <filter
- inkscape:collect="always"
- id="filter4059"
- x="-0.029877551"
- width="1.0597551"
- y="-0.122"
- height="1.244">
- <feGaussianBlur
- inkscape:collect="always"
- stdDeviation="1.22"
- id="feGaussianBlur4061" />
- </filter>
- </defs>
- <sodipodi:namedview
- id="base"
- pagecolor="#ffffff"
- bordercolor="#666666"
- borderopacity="1.0"
- inkscape:pageopacity="0.0"
- inkscape:pageshadow="2"
- inkscape:zoom="2.9132799"
- inkscape:cx="53.033009"
- inkscape:cy="2.8284271"
- inkscape:document-units="px"
- inkscape:current-layer="layer1"
- showgrid="true"
- width="256px"
- inkscape:snap-global="true"
- inkscape:window-width="1680"
- inkscape:window-height="1010"
- inkscape:window-x="194"
- inkscape:window-y="0"
- inkscape:window-maximized="0">
- <inkscape:grid
- type="xygrid"
- id="grid2985"
- empspacing="3"
- visible="true"
- enabled="true"
- snapvisiblegridlinesonly="true"
- spacingx="2px"
- spacingy="2px" />
- </sodipodi:namedview>
- <metadata
- id="metadata7">
- <rdf:RDF>
- <cc:Work
- rdf:about="">
- <dc:format>image/svg+xml</dc:format>
- <dc:type
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
- <dc:title />
- </cc:Work>
- </rdf:RDF>
- </metadata>
- <g
- inkscape:label="Colors"
- inkscape:groupmode="layer"
- id="layer1"
- transform="translate(0,-956.3622)"
- style="display:inline">
- <path
- style="fill:#ffc019;fill-opacity:1;stroke:none"
- d="M 16,0 C 7.0091019,0.04308252 0,7.0521845 0,16 0,16 0,57.499123 0,80 0,89.120146 7.0091019,96 16,96 L 32,96 32,70 64,70 63.916016,46.068359 32,46.236328 32,26 64,26 64,0 C 64,0 24,0 16,0 z"
- transform="translate(0,956.3622)"
- id="rect2993"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccsccccccccc" />
- <path
- style="fill:#1872a2;fill-opacity:1;stroke:none"
- d="m 80,1052.3622 c 8.990898,0 16.086165,-6.966 16,-16 0,0 0,-41.4991 0,-64 0.07767,-9.01639 -7.067354,-16 -16,-16 l -16,0 0,26 -32,0 0,22 32,0 0,22 -32,0 0,26 c 0,0 32,0 48,0 z"
- id="rect2993-6"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccsccccccccc" />
- </g>
- <g
- style="display:inline"
- inkscape:label="Lines as original logo"
- id="g3997"
- inkscape:groupmode="layer">
- <path
- sodipodi:nodetypes="cccccccc"
- inkscape:connector-curvature="0"
- id="path3999"
- d="m 64,0 0,26 -32,0 0,22 m 32,0 0,22 -32,0 0,26"
- style="fill:none;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
- <rect
- ry="16"
- rx="16"
- y="0"
- x="0"
- height="96"
- width="96"
- id="rect4001"
- style="fill:none;stroke:#000000;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
- </g>
- <g
- inkscape:groupmode="layer"
- id="layer3"
- inkscape:label="Lines with center break"
- style="display:none">
- <path
- style="fill:none;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- d="m 64,0 0,26 -32,0 0,22 32,0 0,22 -32,0 0,26"
- id="path3926"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccccccc" />
- <rect
- style="fill:none;stroke:#000000;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- id="rect3928"
- width="96"
- height="96"
- x="0"
- y="0"
- rx="16"
- ry="16" />
- </g>
- <g
- inkscape:groupmode="layer"
- id="layer2"
- inkscape:label="Effects"
- style="display:inline">
- <rect
- style="fill:url(#linearGradient3930);fill-opacity:1;stroke:none"
- id="rect3823"
- width="96"
- height="48.04369"
- x="-3.1086245e-15"
- y="1.8024861e-14"
- ry="15.215644"
- rx="15.214664" />
- <rect
- style="fill:url(#linearGradient3904);fill-opacity:1;stroke:none"
- id="rect3823-8"
- width="96"
- height="47.86721"
- x="1.5376101e-14"
- y="-96"
- ry="15.159752"
- rx="15.214664"
- transform="scale(1,-1)" />
- <rect
- style="fill:url(#linearGradient4011);fill-opacity:1;stroke:none;filter:url(#filter4059)"
- id="rect4003"
- width="98"
- height="24"
- x="0"
- y="0"
- rx="15.214664"
- ry="8.2994423"
- transform="matrix(1.0296115,0,0,1.1963836,-2.901924,-4.7132067)" />
- <rect
- style="opacity:0.56746030000000003;fill:url(#linearGradient4021);fill-opacity:1;stroke:none;filter:url(#filter4055)"
- id="rect4013"
- width="96"
- height="24"
- x="0"
- y="72"
- rx="14.008356"
- ry="12"
- transform="matrix(0.9768331,0,0,0.91974646,1.1649641,8.098115)" />
- </g>
-</svg>
diff --git a/images/nosign.png b/images/nosign.png
new file mode 100644
index 000000000..e532371d8
--- /dev/null
+++ b/images/nosign.png
Binary files differ
diff --git a/images/r!-64.png b/images/r!-64.png
new file mode 100644
index 000000000..1fd1bc80c
--- /dev/null
+++ b/images/r!-64.png
Binary files differ
diff --git a/images/r!.png b/images/r!.png
new file mode 100644
index 000000000..07c423c49
--- /dev/null
+++ b/images/r!.png
Binary files differ
diff --git a/images/r!.xcf b/images/r!.xcf
new file mode 100644
index 000000000..ce9fad301
--- /dev/null
+++ b/images/r!.xcf
Binary files differ
diff --git a/images/red_antiprism.png b/images/red_antiprism.png
new file mode 100644
index 000000000..80637adf5
--- /dev/null
+++ b/images/red_antiprism.png
Binary files differ
diff --git a/images/red_antiprism.xcf b/images/red_antiprism.xcf
new file mode 100644
index 000000000..bd3dd826c
--- /dev/null
+++ b/images/red_antiprism.xcf
Binary files differ
diff --git a/images/rhash-16.png b/images/rhash-16.png
new file mode 100644
index 000000000..23dd9e4b3
--- /dev/null
+++ b/images/rhash-16.png
Binary files differ
diff --git a/images/rhash-32.png b/images/rhash-32.png
new file mode 100644
index 000000000..564556d48
--- /dev/null
+++ b/images/rhash-32.png
Binary files differ
diff --git a/images/rhash-64.png b/images/rhash-64.png
new file mode 100644
index 000000000..2e8396760
--- /dev/null
+++ b/images/rhash-64.png
Binary files differ
diff --git a/images/rhash.xcf b/images/rhash.xcf
new file mode 100644
index 000000000..960552290
--- /dev/null
+++ b/images/rhash.xcf
Binary files differ
diff --git a/images/rm-16.png b/images/rm-16.png
new file mode 100644
index 000000000..62e45c2dd
--- /dev/null
+++ b/images/rm-16.png
Binary files differ
diff --git a/images/rm-32.png b/images/rm-32.png
new file mode 100644
index 000000000..c9c942dee
--- /dev/null
+++ b/images/rm-32.png
Binary files differ
diff --git a/images/rm-64.png b/images/rm-64.png
new file mode 100644
index 000000000..30341bfa4
--- /dev/null
+++ b/images/rm-64.png
Binary files differ
diff --git a/images/rm300.png b/images/rm300.png
new file mode 100644
index 000000000..bc2600348
--- /dev/null
+++ b/images/rm300.png
Binary files differ
diff --git a/include/BaseObject.php b/include/BaseObject.php
index 200831e15..4bfac5fa0 100644
--- a/include/BaseObject.php
+++ b/include/BaseObject.php
@@ -1,4 +1,4 @@
-<?php
+<?php /** @file */
if(class_exists('BaseObject'))
return;
diff --git a/include/Contact.php b/include/Contact.php
index 36f4cbcf7..fd450033c 100644
--- a/include/Contact.php
+++ b/include/Contact.php
@@ -1,6 +1,38 @@
-<?php
+<?php /** @file */
+
+function rconnect_url($channel_id,$xchan) {
+
+ if(! $xchan)
+ return '';
+
+ $r = q("select abook_id from abook where abook_channel = %d and abook_xchan = '%s' limit 1",
+ intval($channel_id),
+ dbesc($xchan)
+ );
+
+ if($r)
+ return '';
+
+ $r = q("select * from xchan where xchan_hash = '%s' limit 1",
+ dbesc($xchan)
+ );
+
+ if(($r) && ($r[0]['xchan_follow']))
+ return $r[0]['xchan_follow'];
+
+ $r = q("select hubloc_url from hubloc where hubloc_hash = '%s' and ( hubloc_flags & %d ) limit 1",
+ dbesc($xchan),
+ intval(HUBLOC_FLAGS_PRIMARY)
+ );
+
+ if($r)
+ return $r[0]['hubloc_url'] . '/follow?f=&url=%s';
+ return '';
+
+}
+
function abook_connections($channel_id, $sql_conditions = '') {
$r = q("select * from abook left join xchan on abook_xchan = xchan_hash where abook_channel = %d
and not ( abook_flags & %d ) $sql_conditions",
@@ -43,6 +75,25 @@ function channelx_by_n($id) {
function vcard_from_xchan($xchan, $observer = null, $mode = '') {
+ $a = get_app();
+
+ if(! $xchan) {
+ if($a->poi) {
+ $xchan = $a->poi;
+ }
+ elseif($a->profile['channel_hash']) {
+ $r = q("select * from xchan where xchan_hash = '%s' limit 1",
+ dbesc($a->profile['channel_hash'])
+ );
+ if($r)
+ $xchan = $r[0];
+ }
+ }
+
+ if(! $xchan)
+ return;
+
+// FIXME - show connect button to observer if appropriate
$connect = false;
if(local_user()) {
$r = q("select * from abook where abook_xchan = '%s' and abook_channel = %d limit 1",
@@ -53,6 +104,9 @@ function vcard_from_xchan($xchan, $observer = null, $mode = '') {
$connect = t('Connect');
}
+ if(array_key_exists('channel_id',$xchan))
+ $a->profile_uid = $xchan['channel_id'];
+
$url = (($observer)
? z_root() . '/magic?f=&dest=' . $xchan['xchan_url'] . '&addr=' . $xchan['xchan_addr']
: $xchan['xchan_url']
@@ -76,6 +130,9 @@ function abook_toggle_flag($abook,$flag) {
intval($abook['abook_id']),
intval($abook['abook_channel'])
);
+ $a = get_app();
+ if($a->data['abook'])
+ $a->data['abook']['abook_flags'] = $a->data['abook']['abook_flags'] ^ $flag;
return $r;
}
@@ -107,24 +164,98 @@ function user_remove($uid) {
}
+function account_remove($account_id,$local = true) {
+
+ logger('account_remove: ' . $account_id);
+
+ if(! intval($account_id)) {
+ logger('account_remove: no account.');
+ return false;
+ }
+
+ // Don't let anybody nuke the only admin account.
-function channel_remove($channel_id) {
+ $r = q("select account_id from account where (account_roles & %d)",
+ intval(ACCOUNT_ROLE_ADMIN)
+ );
+
+ if($r !== false && count($r) == 1 && $r[0]['account_id'] == $account_id) {
+ logger("Unable to remove the only remaining admin account");
+ return false;
+ }
+
+ $r = q("select * from account where account_id = %d limit 1",
+ intval($account_id)
+ );
+
+ if(! $r) {
+ logger('account_remove: No account with id: ' . $account_id);
+ return false;
+ }
+
+ $x = q("select channel_id from channel where channel_account_id = %d",
+ intval($account_id)
+ );
+ if($x) {
+ foreach($x as $xx) {
+ channel_remove($xx['channel_id'],$local);
+ }
+ }
+
+ $r = q("delete from account where account_id = %d limit 1",
+ intval($account_id)
+ );
+
+ return $r;
+
+}
+
+function channel_remove($channel_id, $local = true) {
if(! $channel_id)
return;
$a = get_app();
logger('Removing channel: ' . $channel_id);
+ logger('channel_remove: local only: ' . intval($local));
$r = q("select * from channel where channel_id = %d limit 1", intval($channel_id));
+ if(! $r) {
+ logger('channel_remove: channel not found: ' . $channel_id);
+ return;
+ }
- call_hooks('channel_remove',$r[0]);
+ $channel = $r[0];
- // FIXME notify the directory
+ call_hooks('channel_remove',$r[0]);
- // FIXME notify all contacts
+ if(! $local) {
+
+ $r = q("update channel set channel_deleted = '%s', channel_pageflags = (channel_pageflags | %d), channel_r_stream = 0, channel_r_profile = 0,
+ channel_r_photos = 0, channel_r_abook = 0, channel_w_stream = 0, channel_w_wall = 0, channel_w_tagwall = 0,
+ channel_w_comment = 0, channel_w_mail = 0, channel_w_photos = 0, channel_w_chat = 0, channel_a_delegate = 0,
+ channel_r_storage = 0, channel_w_storage = 0, channel_r_pages = 0, channel_w_pages = 0, channel_a_republish = 0
+ where channel_id = %d limit 1",
+ dbesc(datetime_convert()),
+ intval(PAGE_REMOVED),
+ intval($channel_id)
+ );
+
+ $r = q("update hubloc set hubloc_flags = hubloc_flags | %d where hubloc_hash = '%s'",
+ intval(HUBLOC_FLAGS_DELETED),
+ dbesc($channel['channel_hash'])
+ );
+
+ $r = q("update xchan set xchan_flags = xchan_flags | %d where xchan_hash = '%s'",
+ intval(XCHAN_FLAGS_DELETED),
+ dbesc($channel['channel_hash'])
+ );
+
+ proc_run('php','include/notifier.php','purge_all',$channel_id);
- q("DELETE FROM `group` WHERE `uid` = %d", intval($channel_id));
+ }
+
+ q("DELETE FROM `groups` WHERE `uid` = %d", intval($channel_id));
q("DELETE FROM `group_member` WHERE `uid` = %d", intval($channel_id));
q("DELETE FROM `event` WHERE `uid` = %d", intval($channel_id));
q("DELETE FROM `item` WHERE `uid` = %d", intval($channel_id));
@@ -137,13 +268,31 @@ function channel_remove($channel_id) {
q("DELETE FROM `pconfig` WHERE `uid` = %d", intval($channel_id));
q("DELETE FROM `spam` WHERE `uid` = %d", intval($channel_id));
- // We also need a timestamp in the channel DB so we know when to remove the entry.
- $r = q("update channel set channel_pageflags = (channel_pageflags | %d) where channel_id = %d limit 1",
+ q("delete from abook where abook_xchan = '%s' and abook_flags & %d limit 1",
+ dbesc($channel['channel_hash']),
+ dbesc(ABOOK_FLAG_SELF)
+ );
+
+ $r = q("update channel set channel_deleted = '%s', channel_pageflags = (channel_pageflags | %d) where channel_id = %d limit 1",
+ dbesc(datetime_convert()),
intval(PAGE_REMOVED),
intval($channel_id)
);
+ $r = q("update hubloc set hubloc_flags = hubloc_flags | %d where hubloc_hash = '%s' and hubloc_url = '%s' ",
+ intval(HUBLOC_FLAGS_DELETED),
+ dbesc($channel['channel_hash']),
+ dbesc(z_root())
+ );
+
+ $r = q("update xchan set xchan_flags = xchan_flags | %d where xchan_hash = '%s' ",
+ intval(XCHAN_FLAGS_DELETED),
+ dbesc($channel['channel_hash'])
+ );
+
+
+ proc_run('php','include/directory.php',$channel_id);
if($channel_id == local_user()) {
unset($_SESSION['authenticated']);
@@ -162,10 +311,8 @@ function remove_all_xchan_resources($xchan, $channel_id = 0) {
}
else {
- // this is somewhat destructive
-// FIXME
- // We don't want to be quite as destructive on directories, which will need to mirror the action
- // and we also don't want to completely destroy an xchan that has moved to a new primary location
+ $dirmode = intval(get_config('system','directory_mode'));
+
$r = q("delete from photo where xchan = '%s'",
dbesc($xchan)
@@ -194,24 +341,37 @@ function remove_all_xchan_resources($xchan, $channel_id = 0) {
dbesc($xchan)
);
-
- $r = q("delete from xchan where xchan_hash = '%s' limit 1",
- dbesc($xchan)
- );
- $r = q("delete from hubloc where hubloc_hash = '%s'",
- dbesc($xchan)
- );
$r = q("delete from abook where abook_xchan = '%s'",
dbesc($xchan)
);
- $r = q("delete from xtag where xtag_hash = '%s'",
- dbesc($xchan)
- );
- }
-}
+ if($dirmode === false || $dirmode == DIRECTORY_MODE_NORMAL) {
+ $r = q("delete from xchan where xchan_hash = '%s' limit 1",
+ dbesc($xchan)
+ );
+ $r = q("delete from hubloc where hubloc_hash = '%s'",
+ dbesc($xchan)
+ );
+
+ }
+ else {
+
+ // directory servers need to keep the record around for sync purposes - mark it deleted
+
+ $r = q("update hubloc set hubloc_flags = hubloc_flags | %d where hubloc_hash = '%s'",
+ intval(HUBLOC_FLAGS_DELETED),
+ dbesc($xchan)
+ );
+
+ $r = q("update xchan set xchan_flags = xchan_flags | %d where xchan_hash = '%s'",
+ intval(XCHAN_FLAGS_DELETED),
+ dbesc($xchan)
+ );
+ }
+ }
+}
function contact_remove($channel_id, $abook_id) {
@@ -221,8 +381,8 @@ function contact_remove($channel_id, $abook_id) {
$archive = get_pconfig($channel_id, 'system','archive_removed_contacts');
if($archive) {
- q("update abook set abook_flags = abook_flags | %d where abook_id = %d and abook_channel = %d limit 1",
- intval(ABOOK_FLAG_ARCHIVE),
+ q("update abook set abook_flags = ( abook_flags | %d ) where abook_id = %d and abook_channel = %d limit 1",
+ intval(ABOOK_FLAG_ARCHIVED),
intval($abook_id),
intval($channel_id)
);
@@ -242,31 +402,37 @@ function contact_remove($channel_id, $abook_id) {
if($abook['abook_flags'] & ABOOK_FLAG_SELF)
return false;
- q("delete from item where author_xchan = '%s' and uid = %d",
+
+ $r = q("select * from item where author_xchan = '%s' and uid = %d",
dbesc($abook['abook_xchan']),
intval($channel_id)
);
+ if($r) {
+ foreach($r as $rr) {
+ drop_item($rr,false);
+ }
+ }
- q("delete from abook where abook_id = %d and channel_id = %d limit 1",
+ q("delete from abook where abook_id = %d and abook_channel = %d limit 1",
intval($abook['abook_id']),
intval($channel_id)
);
-/*
-// FIXME
- q("DELETE FROM `photo` WHERE `contact-id` = %d ",
- intval($id)
- );
- q("DELETE FROM `mail` WHERE `contact-id` = %d ",
- intval($id)
+ $r = q("delete from event where event_xchan = '%s' and uid = %d",
+ dbesc($abook['abook_xchan']),
+ intval($channel_id)
);
- q("DELETE FROM `event` WHERE `cid` = %d ",
- intval($id)
+
+ $r = q("delete from group_member where xchan = '%s' and uid = %d",
+ dbesc($abook['abook_xchan']),
+ intval($channel_id)
);
- q("DELETE FROM `queue` WHERE `cid` = %d ",
- intval($id)
+
+ $r = q("delete from mail where ( from_xchan = '%s' or to_xchan = '%s' ) and channel_id = %d ",
+ dbesc($abook['abook_xchan']),
+ dbesc($abook['abook_xchan']),
+ intval($channel_id)
);
-*/
return true;
}
@@ -340,90 +506,11 @@ function unmark_for_death($contact) {
);
}}
-if(! function_exists('contact_photo_menu')){
-function contact_photo_menu($contact) {
-
- $a = get_app();
-
- $contact_url="";
- $pm_url="";
- $status_link="";
- $photos_link="";
- $posts_link="";
- $poke_link="";
-
- $sparkle = false;
- if($contact['xchan_network'] === NETWORK_ZOT) {
- $sparkle = true;
- $profile_link = $a->get_baseurl() . '/magic?f=&id=' . $contact['abook_id'];
- }
- else
- $profile_link = $contact['xchan_url'];
-
- if($sparkle) {
- $status_link = $profile_link . "&url=status";
- $photos_link = $profile_link . "&url=photos";
- $profile_link = $profile_link . "&url=profile";
- $pm_url = $a->get_baseurl() . '/message/new/' . $contact['xchan_hash'];
- }
-
- $poke_link = $a->get_baseurl() . '/poke/?f=&c=' . $contact['abook_id'];
- $contact_url = $a->get_baseurl() . '/connections/' . $contact['abook_id'];
- $posts_link = $a->get_baseurl() . '/network/?cid=' . $contact['abook_id'];
-
- $menu = Array(
- t("Poke") => $poke_link,
- t("View Status") => $status_link,
- t("View Profile") => $profile_link,
- t("View Photos") => $photos_link,
- t("Network Posts") => $posts_link,
- t("Edit Contact") => $contact_url,
- t("Send PM") => $pm_url,
- );
-
-
- $args = array('contact' => $contact, 'menu' => &$menu);
-
- call_hooks('contact_photo_menu', $args);
-
- $o = "";
- foreach($menu as $k=>$v){
- if ($v!="") {
- $o .= "<li><a href=\"$v\">$k</a></li>\n";
- }
- }
- return $o;
-}}
-
-
function random_profile() {
- $r = q("select xchan_url from xchan where xchan_network = 'zot' order by rand() limit 1");
- if($r && count($r))
+ $r = q("select xchan_url from xchan where 1 order by rand() limit 1");
+ if($r)
return $r[0]['xchan_url'];
return '';
}
-function contacts_not_grouped($uid,$start = 0,$count = 0) {
-
- if(! $count) {
- $r = q("select count(*) as total from contact where uid = %d and self = 0 and id not in (select distinct(`contact-id`) from group_member where uid = %d) ",
- intval($uid),
- intval($uid)
- );
-
- return $r;
-
-
- }
-
- $r = q("select * from contact where uid = %d and self = 0 and id not in (select distinct(`contact-id`) from group_member where uid = %d) and blocked = 0 and pending = 0 limit %d, %d",
- intval($uid),
- intval($uid),
- intval($start),
- intval($count)
- );
-
- return $r;
-}
-
diff --git a/include/ConversationObject.php b/include/ConversationObject.php
index 37633369e..103c3664b 100644
--- a/include/ConversationObject.php
+++ b/include/ConversationObject.php
@@ -1,4 +1,5 @@
-<?php
+<?php /** @file */
+
if(class_exists('Conversation'))
return;
@@ -6,22 +7,35 @@ require_once('boot.php');
require_once('include/BaseObject.php');
require_once('include/ItemObject.php');
require_once('include/text.php');
+require_once('include/items.php');
/**
* A list of threads
*
- * We should think about making this a SPL Iterator
*/
+
class Conversation extends BaseObject {
private $threads = array();
private $mode = null;
+ private $observer = null;
private $writable = false;
+ private $commentable = false;
private $profile_owner = 0;
private $preview = false;
+ private $prepared_item = '';
+ private $cipher = 'aes256';
+
+ // $prepared_item is for use by alternate conversation structures such as photos
+ // wherein we've already prepared a top level item which doesn't look anything like
+ // a normal "post" item
- public function __construct($mode, $preview) {
+ public function __construct($mode, $preview, $prepared_item = '') {
$this->set_mode($mode);
$this->preview = $preview;
+ $this->prepared_item = $prepared_item;
+ $c = ((local_user()) ? get_pconfig(local_user(),'system','default_cipher') : '');
+ if($c)
+ $this->cipher = $c;
}
/**
@@ -33,8 +47,8 @@ class Conversation extends BaseObject {
$a = $this->get_app();
- $observer = $a->get_observer();
- $ob_hash = (($observer) ? $observer['xchan_hash'] : '');
+ $this->observer = $a->get_observer();
+ $ob_hash = (($this->observer) ? $this->observer['xchan_hash'] : '');
switch($mode) {
case 'network':
@@ -46,7 +60,10 @@ class Conversation extends BaseObject {
$this->writable = perm_is_allowed($this->profile_owner,$ob_hash,'post_comments');
break;
case 'display':
- $this->profile_owner = $a->profile['uid'];
+ // in this mode we set profile_owner after initialisation (from conversation()) and then
+ // pull some trickery which allows us to re-invoke this function afterward
+ // it's an ugly hack so FIXME
+// $this->profile_owner = $a->profile['uid'];
$this->writable = perm_is_allowed($this->profile_owner,$ob_hash,'post_comments');
break;
case 'page':
@@ -75,6 +92,10 @@ class Conversation extends BaseObject {
return $this->writable;
}
+ public function is_commentable() {
+ return $this->commentable;
+ }
+
/**
* Check if page is a preview
*/
@@ -89,6 +110,22 @@ class Conversation extends BaseObject {
return $this->profile_owner;
}
+ public function set_profile_owner($uid) {
+ $this->profile_owner = $uid;
+ $mode = $this->get_mode();
+ $this->mode = null;
+ $this->set_mode($mode);
+ }
+
+ public function get_observer() {
+ return $this->observer;
+ }
+
+ public function get_cipher() {
+ return $this->cipher;
+ }
+
+
/**
* Add a thread to the conversation
*
@@ -108,12 +145,36 @@ class Conversation extends BaseObject {
}
/*
- * Only add will be displayed
+ * Only add things that will be displayed
*/
- if(activity_match($item->get_data_value('verb'),ACTIVITY_LIKE) || activity_match($item->get_data_value('verb'),ACTIVITY_DISLIKE)) {
+
+ if(($item->get_data_value('id') != $item->get_data_value('parent')) && (activity_match($item->get_data_value('verb'),ACTIVITY_LIKE) || activity_match($item->get_data_value('verb'),ACTIVITY_DISLIKE))) {
return false;
}
+
+// if(local_user() && $item->get_data_value('uid') == local_user())
+// $this->commentable = true;
+
+// if($this->writable)
+// $this->commentable = true;
+
+ $item->set_commentable(false);
+ $ob_hash = (($this->observer) ? $this->observer['xchan_hash'] : '');
+
+ if(($item->get_data_value('author_xchan') === $ob_hash) || ($item->get_data_value('owner_xchan') === $ob_hash))
+ $item->set_commentable(true);
+
+ if($item->get_data_value('item_flags') & ITEM_NOCOMMENT) {
+ $item->set_commentable(false);
+ }
+ elseif(($this->observer) && (! $item->is_commentable())) {
+ if((array_key_exists('owner',$item->data)) && ($item->data['owner']['abook_flags'] & ABOOK_FLAG_SELF))
+ $item->set_commentable(perm_is_allowed($this->profile_owner,$this->observer['xchan_hash'],'post_comments'));
+ else
+ $item->set_commentable(can_comment_on_post($this->observer['xchan_hash'],$item->data));
+ }
+
$item->set_conversation($this);
$this->threads[] = $item;
return end($this->threads);
@@ -133,7 +194,12 @@ class Conversation extends BaseObject {
foreach($this->threads as $item) {
- $item_data = $item->get_template_data($alike, $dlike);
+ if(($item->get_data_value('id') == $item->get_data_value('parent')) && $this->prepared_item) {
+ $item_data = $this->prepared_item;
+ }
+ else {
+ $item_data = $item->get_template_data($alike, $dlike);
+ }
if(!$item_data) {
logger('[ERROR] Conversation::get_template_data : Failed to get item template data ('. $item->get_id() .').', LOGGER_DEBUG);
return false;
diff --git a/include/ITemplateEngine.php b/include/ITemplateEngine.php
new file mode 100755
index 000000000..53c1845f4
--- /dev/null
+++ b/include/ITemplateEngine.php
@@ -0,0 +1,11 @@
+<?php
+require_once 'boot.php';
+
+
+/**
+ * Interface for template engines
+ */
+interface ITemplateEngine {
+ public function replace_macros($s,$v);
+ public function get_markup_template($file, $root='');
+}
diff --git a/include/ItemObject.php b/include/ItemObject.php
index afa34abb1..9a62cee4b 100644
--- a/include/ItemObject.php
+++ b/include/ItemObject.php
@@ -1,21 +1,22 @@
-<?php
+<?php /** @file */
+
if(class_exists('Item'))
return;
-require_once('object/BaseObject.php');
+require_once('include/BaseObject.php');
require_once('include/text.php');
require_once('boot.php');
/**
* An item
*/
+
class Item extends BaseObject {
- private $data = array();
+ public $data = array();
private $template = 'conv_item.tpl';
private $comment_box_template = 'comment_item.tpl';
- private $toplevel = false;
- private $writable = false;
private $commentable = false;
+ private $toplevel = false;
private $children = array();
private $parent = null;
private $conversation = null;
@@ -26,40 +27,24 @@ class Item extends BaseObject {
private $wall_to_wall = false;
private $threaded = false;
private $visiting = false;
- private $observer = null;
private $channel = null;
+
public function __construct($data) {
$a = $this->get_app();
$this->data = $data;
- $this->channel = $a->get_channel();
- $this->observer = $a->get_observer();
-
$this->toplevel = ($this->get_id() == $this->get_data_value('parent'));
-
- $this->writable = (((local_user()) && ($this->channel['channel_hash'] === $this->data['owner_xchan'])) ? true : false);
- $this->commentable = $this->writable;
-
- if(($this->observer) && (! $this->writable)) {
- $this->commentable = perm_is_allowed($this->data['uid'],$this->observer['xchan_hash'],'post_comments');
- }
-
-// logger('writable: ' . $this->writable);
-// logger('commentable: ' . $this->commentable . ' uid=' . $this->data['uid'] . ' observer=' . $this->observer['xchan_hash']);
-// if(get_config('system','thread_allow') && $a->theme_thread_allow && !$this->is_toplevel())
-// $this->threaded = true;
-
// Prepare the children
if(count($data['children'])) {
foreach($data['children'] as $item) {
/*
- * Only add thos that will be displayed
+ * Only add those that will be displayed
*/
- if(! visible_activity($item)) {
+ if((! visible_activity($item)) || array_key_exists('author_blocked',$item)) {
continue;
}
@@ -84,7 +69,6 @@ class Item extends BaseObject {
$result = array();
$a = $this->get_app();
- $observer = $this->observer;
$item = $this->get_data();
$commentww = '';
@@ -92,12 +76,13 @@ class Item extends BaseObject {
$buttons = '';
$dropping = false;
$star = false;
- $isstarred = "unstarred";
+ $isstarred = "unstarred icon-star-empty";
$indent = '';
$osparkle = '';
$total_children = $this->count_descendants();
$conv = $this->get_conversation();
+ $observer = $conv->get_observer();
$lock = ((($item['item_private'] == 1) || (($item['uid'] == local_user()) && (strlen($item['allow_cid']) || strlen($item['allow_gid'])
|| strlen($item['deny_cid']) || strlen($item['deny_gid']))))
@@ -105,15 +90,16 @@ class Item extends BaseObject {
: false);
$shareable = ((($conv->get_profile_owner() == local_user()) && ($item['item_private'] != 1)) ? true : false);
+ $mode = $conv->get_mode();
+
if(local_user() && $observer['xchan_hash'] === $item['author_xchan'])
$edpost = array($a->get_baseurl($ssl_state)."/editpost/".$item['id'], t("Edit"));
else
$edpost = false;
-// FIXME - this is wrong.
-// if(($this->get_data_value('uid') == local_user()) || $this->is_visiting())
-
- if($this->get_data_value('uid') == local_user())
+ if($observer['xchan_hash'] == $this->get_data_value('author_xchan')
+ || $observer['xchan_hash'] == $this->get_data_value('owner_xchan')
+ || $this->get_data_value('uid') == local_user())
$dropping = true;
if($dropping) {
@@ -122,7 +108,7 @@ class Item extends BaseObject {
'delete' => t('Delete'),
);
}
-
+// FIXME
if($observer_is_pageowner) {
$multidrop = array(
'select' => t('Select'),
@@ -138,9 +124,9 @@ class Item extends BaseObject {
$location = format_location($item);
- $showlike = ((x($alike,$item['uri'])) ? format_like($alike[$item['uri']],$alike[$item['uri'] . '-l'],'like',$item['uri']) : '');
- $showdislike = ((x($dlike,$item['uri']) && feature_enabled($conv->get_profile_owner(),'dislike'))
- ? format_like($dlike[$item['uri']],$dlike[$item['uri'] . '-l'],'dislike',$item['uri']) : '');
+ $showlike = ((x($alike,$item['mid'])) ? format_like($alike[$item['mid']],$alike[$item['mid'] . '-l'],'like',$item['mid']) : '');
+ $showdislike = ((x($dlike,$item['mid']) && feature_enabled($conv->get_profile_owner(),'dislike'))
+ ? format_like($dlike[$item['mid']],$dlike[$item['mid'] . '-l'],'dislike',$item['mid']) : '');
/*
* We should avoid doing this all the time, but it depends on the conversation mode
@@ -151,6 +137,7 @@ class Item extends BaseObject {
$this->check_wall_to_wall();
if($this->is_toplevel()) {
+ // FIXME check this permission
if($conv->get_profile_owner() == local_user()) {
// FIXME we don't need all this stuff, some can be done in the template
@@ -161,20 +148,30 @@ class Item extends BaseObject {
'toggle' => t("toggle star status"),
'classdo' => (($item['item_flags'] & ITEM_STARRED) ? "hidden" : ""),
'classundo' => (($item['item_flags'] & ITEM_STARRED) ? "" : "hidden"),
- 'isstarred' => (($item['item_flags'] & ITEM_STARRED) ? "starred" : "unstarred"),
+ 'isstarred' => (($item['item_flags'] & ITEM_STARRED) ? "starred icon-star" : "unstarred icon-star-empty"),
'starred' => t('starred'),
);
- $tagger = array(
- 'tagit' => t("add tag"),
- 'classtagger' => "",
- );
}
} else {
$indent = 'comment';
}
- if($this->is_writable()) {
+
+ $verified = (($item['item_flags'] & ITEM_VERIFIED) ? t('Message is verified') : '');
+ $unverified = '' ; // (($this->is_wall_to_wall() && (! ($item['item_flags'] & ITEM_VERIFIED))) ? t('Message cannot be verified') : '');
+
+
+
+ // FIXME - check this permission
+ if($conv->get_profile_owner() == local_user()) {
+ $tagger = array(
+ 'tagit' => t("add tag"),
+ 'classtagger' => "",
+ );
+ }
+
+ if($this->is_commentable()) {
$like = array( t("I like this \x28toggle\x29"), t("like"));
$dislike = array( t("I don't like this \x28toggle\x29"), t("dislike"));
if ($shareable)
@@ -196,7 +193,7 @@ class Item extends BaseObject {
$tmp_item = array(
'template' => $this->get_template(),
-
+ 'mode' => $mode,
'type' => implode("",array_slice(explode("/",$item['verb']),-1)),
'tags' => array(),
'body' => $body,
@@ -205,6 +202,7 @@ class Item extends BaseObject {
'linktitle' => sprintf( t('View %s\'s profile - %s'), $profile_name, $item['author']['xchan_addr']),
'olinktitle' => sprintf( t('View %s\'s profile - %s'), $this->get_owner_name(), $item['owner']['xchan_addr']),
'to' => t('to'),
+ 'via' => t('via'),
'wall' => t('Wall-to-Wall'),
'vwall' => t('via Wall-To-Wall:'),
'profile_url' => $profile_link,
@@ -214,9 +212,16 @@ class Item extends BaseObject {
'osparkle' => $osparkle,
'sparkle' => $sparkle,
'title' => $item['title'],
+ 'ago' => relative_date($item['created']),
+ 'app' => $item['app'],
+ 'str_app' => sprintf( t(' from %s'), $item['app']),
+ 'isotime' => datetime_convert('UTC', date_default_timezone_get(), $item['created'], 'c'),
'localtime' => datetime_convert('UTC', date_default_timezone_get(), $item['created'], 'r'),
- 'ago' => (($item['app']) ? sprintf( t('%s from %s'),relative_date($item['created']),$item['app']) : relative_date($item['created'])),
+ 'editedtime' => (($item['edited'] != $item['created']) ? sprintf( t('last edited: %s'), datetime_convert('UTC', date_default_timezone_get(), $item['edited'], 'r')) : ''),
+ 'expiretime' => (($item['expires'] > 0) ? sprintf( t('Expires: %s'), datetime_convert('UTC', date_default_timezone_get(), $item['expires'], 'r')):''),
'lock' => $lock,
+ 'verified' => $verified,
+ 'unverified' => $unverified,
'location' => $location,
'indent' => $indent,
'owner_url' => $this->get_owner_url(),
@@ -272,7 +277,7 @@ class Item extends BaseObject {
}
}
- $result['private'] = $item['private'];
+ $result['private'] = $item['item_private'];
$result['toplevel'] = ($this->is_toplevel() ? 'toplevel_item' : '');
if($this->is_threaded()) {
@@ -303,6 +308,16 @@ class Item extends BaseObject {
return $this->threaded;
}
+ public function set_commentable($val) {
+ $this->commentable = $val;
+ foreach($this->get_children() as $child)
+ $child->set_commentable($val);
+ }
+
+ public function is_commentable() {
+ return $this->commentable;
+ }
+
/**
* Add a child item
*/
@@ -444,6 +459,11 @@ class Item extends BaseObject {
return $this->template;
}
+
+ private function set_template($t) {
+ $this->template = $t;
+ }
+
/**
* Check if this is a toplevel post
*/
@@ -452,28 +472,6 @@ class Item extends BaseObject {
}
/**
- * Check if this is writable
- */
- private function is_writable() {
-
- return $this->writable;
-
-// $conv = $this->get_conversation();
-
-// return true;
-
-// if($conv) {
- // This will allow us to comment on wall-to-wall items owned by our friends
- // and community forums even if somebody else wrote the post.
-// return ($this->writable || ($this->is_visiting() && $conv->get_mode() == 'channel'));
-// }
- }
-
- private function is_commentable() {
- return $this->commentable;
- }
-
- /**
* Count the total of our descendants
*/
private function count_descendants() {
@@ -510,44 +508,49 @@ class Item extends BaseObject {
$comment_box = '';
$conv = $this->get_conversation();
+// logger('Commentable conv: ' . $conv->is_commentable());
+
if(! $this->is_commentable())
return;
- if($conv->is_writable() || $this->is_writable()) {
- $template = get_markup_template($this->get_comment_box_template());
-
- $a = $this->get_app();
-
- $qc = ((local_user()) ? get_pconfig(local_user(),'system','qcomment') : null);
- $qcomment = (($qc) ? explode("\n",$qc) : null);
-
- $comment_box = replace_macros($template,array(
- '$return_path' => '',
- '$threaded' => $this->is_threaded(),
- '$jsreload' => (($conv->get_mode() === 'display') ? $_SESSION['return_url'] : ''),
- '$type' => (($conv->get_mode() === 'channel') ? 'wall-comment' : 'net-comment'),
- '$id' => $this->get_id(),
- '$parent' => $this->get_id(),
- '$qcomment' => $qcomment,
- '$profile_uid' => $conv->get_profile_owner(),
- '$mylink' => $this->observer['xchan_url'],
- '$mytitle' => t('This is you'),
- '$myphoto' => $this->observer['xchan_photo_s'],
- '$comment' => t('Comment'),
- '$submit' => t('Submit'),
- '$edbold' => t('Bold'),
- '$editalic' => t('Italic'),
- '$eduline' => t('Underline'),
- '$edquote' => t('Quote'),
- '$edcode' => t('Code'),
- '$edimg' => t('Image'),
- '$edurl' => t('Link'),
- '$edvideo' => t('Video'),
- '$preview' => ((feature_enabled($conv->get_profile_owner(),'preview')) ? t('Preview') : ''),
- '$indent' => $indent,
- '$sourceapp' => get_app()->sourcename
- ));
- }
+ $template = get_markup_template($this->get_comment_box_template());
+
+ $a = $this->get_app();
+ $observer = $conv->get_observer();
+
+ $qc = ((local_user()) ? get_pconfig(local_user(),'system','qcomment') : null);
+ $qcomment = (($qc) ? explode("\n",$qc) : null);
+
+ $comment_box = replace_macros($template,array(
+ '$return_path' => '',
+ '$threaded' => $this->is_threaded(),
+ '$jsreload' => (($conv->get_mode() === 'display') ? $_SESSION['return_url'] : ''),
+ '$type' => (($conv->get_mode() === 'channel') ? 'wall-comment' : 'net-comment'),
+ '$id' => $this->get_id(),
+ '$parent' => $this->get_id(),
+ '$qcomment' => $qcomment,
+ '$profile_uid' => $conv->get_profile_owner(),
+ '$mylink' => $observer['xchan_url'],
+ '$mytitle' => t('This is you'),
+ '$myphoto' => $observer['xchan_photo_s'],
+ '$comment' => t('Comment'),
+ '$submit' => t('Submit'),
+ '$edbold' => t('Bold'),
+ '$editalic' => t('Italic'),
+ '$eduline' => t('Underline'),
+ '$edquote' => t('Quote'),
+ '$edcode' => t('Code'),
+ '$edimg' => t('Image'),
+ '$edurl' => t('Link'),
+ '$edvideo' => t('Video'),
+ '$preview' => ((feature_enabled($conv->get_profile_owner(),'preview')) ? t('Preview') : ''),
+ '$indent' => $indent,
+ '$feature_encrypt' => ((feature_enabled($conv->get_profile_owner(),'content_encrypt')) ? true : false),
+ '$encrypt' => t('Encrypt text'),
+ '$cipher' => $conv->get_cipher(),
+ '$sourceapp' => get_app()->sourcename
+
+ ));
return $comment_box;
}
diff --git a/include/Photo.php b/include/Photo.php
deleted file mode 100644
index de3d30c39..000000000
--- a/include/Photo.php
+++ /dev/null
@@ -1,768 +0,0 @@
-<?php
-
-if(! class_exists("Photo")) {
-class Photo {
-
- private $image;
-
- /**
- * Put back gd stuff, not everybody have Imagick
- */
- private $imagick;
- private $width;
- private $height;
- private $valid;
- private $type;
- private $types;
-
- /**
- * supported mimetypes and corresponding file extensions
- */
- static function supportedTypes() {
- if(class_exists('Imagick')) {
- /**
- * Imagick::queryFormats won't help us a lot there...
- * At least, not yet, other parts of friendica uses this array
- */
- $t = array(
- 'image/jpeg' => 'jpg',
- 'image/png' => 'png',
- 'image/gif' => 'gif'
- );
- } else {
- $t = array();
- $t['image/jpeg'] ='jpg';
- if (imagetypes() & IMG_PNG) $t['image/png'] = 'png';
- }
-
- return $t;
- }
-
- public function __construct($data, $type=null) {
- $this->imagick = class_exists('Imagick');
- $this->types = $this->supportedTypes();
- if (!array_key_exists($type,$this->types)){
- $type='image/jpeg';
- }
- $this->type = $type;
-
- if($this->is_imagick()) {
- $this->image = new Imagick();
- $this->image->readImageBlob($data);
-
- /**
- * Setup the image to the format it will be saved to
- */
- $map = $this->get_FormatsMap();
- $format = $map[$type];
- $this->image->setFormat($format);
-
- // Always coalesce, if it is not a multi-frame image it won't hurt anyway
- $this->image = $this->image->coalesceImages();
-
- /**
- * setup the compression here, so we'll do it only once
- */
- switch($this->getType()){
- case "image/png":
- $quality = get_config('system','png_quality');
- if((! $quality) || ($quality > 9))
- $quality = PNG_QUALITY;
- /**
- * From http://www.imagemagick.org/script/command-line-options.php#quality:
- *
- * 'For the MNG and PNG image formats, the quality value sets
- * the zlib compression level (quality / 10) and filter-type (quality % 10).
- * The default PNG "quality" is 75, which means compression level 7 with adaptive PNG filtering,
- * unless the image has a color map, in which case it means compression level 7 with no PNG filtering'
- */
- $quality = $quality * 10;
- $this->image->setCompressionQuality($quality);
- break;
- case "image/jpeg":
- $quality = get_config('system','jpeg_quality');
- if((! $quality) || ($quality > 100))
- $quality = JPEG_QUALITY;
- $this->image->setCompressionQuality($quality);
- }
- } else {
- $this->valid = false;
- $this->image = @imagecreatefromstring($data);
- if($this->image !== FALSE) {
- $this->width = imagesx($this->image);
- $this->height = imagesy($this->image);
- $this->valid = true;
- imagealphablending($this->image, false);
- imagesavealpha($this->image, true);
- }
- }
- }
-
- public function __destruct() {
- if($this->image) {
- if($this->is_imagick()) {
- $this->image->clear();
- $this->image->destroy();
- return;
- }
- imagedestroy($this->image);
- }
- }
-
- public function is_imagick() {
- return $this->imagick;
- }
-
- /**
- * Maps Mime types to Imagick formats
- */
- public function get_FormatsMap() {
- $m = array(
- 'image/jpeg' => 'JPG',
- 'image/png' => 'PNG',
- 'image/gif' => 'GIF'
- );
- return $m;
- }
-
- public function is_valid() {
- if($this->is_imagick())
- return ($this->image !== FALSE);
- return $this->valid;
- }
-
- public function getWidth() {
- if(!$this->is_valid())
- return FALSE;
-
- if($this->is_imagick())
- return $this->image->getImageWidth();
- return $this->width;
- }
-
- public function getHeight() {
- if(!$this->is_valid())
- return FALSE;
-
- if($this->is_imagick())
- return $this->image->getImageHeight();
- return $this->height;
- }
-
- public function getImage() {
- if(!$this->is_valid())
- return FALSE;
-
- if($this->is_imagick()) {
- /* Clean it */
- $this->image = $this->image->deconstructImages();
- return $this->image;
- }
- return $this->image;
- }
-
- public function getType() {
- if(!$this->is_valid())
- return FALSE;
-
- return $this->type;
- }
-
- public function getExt() {
- if(!$this->is_valid())
- return FALSE;
-
- return $this->types[$this->getType()];
- }
-
- public function scaleImage($max) {
- if(!$this->is_valid())
- return FALSE;
-
- $width = $this->width;
- $height = $this->height;
-
- $dest_width = $dest_height = 0;
-
- if((! $width)|| (! $height))
- return FALSE;
-
- if($width > $max && $height > $max) {
-
- // very tall image (greater than 16:9)
- // constrain the width - let the height float.
-
- if((($height * 9) / 16) > $width) {
- $dest_width = $max;
- $dest_height = intval(( $height * $max ) / $width);
- }
-
- // else constrain both dimensions
-
- elseif($width > $height) {
- $dest_width = $max;
- $dest_height = intval(( $height * $max ) / $width);
- }
- else {
- $dest_width = intval(( $width * $max ) / $height);
- $dest_height = $max;
- }
- }
- else {
- if( $width > $max ) {
- $dest_width = $max;
- $dest_height = intval(( $height * $max ) / $width);
- }
- else {
- if( $height > $max ) {
-
- // very tall image (greater than 16:9)
- // but width is OK - don't do anything
-
- if((($height * 9) / 16) > $width) {
- $dest_width = $width;
- $dest_height = $height;
- }
- else {
- $dest_width = intval(( $width * $max ) / $height);
- $dest_height = $max;
- }
- }
- else {
- $dest_width = $width;
- $dest_height = $height;
- }
- }
- }
-
-
- if($this->is_imagick()) {
- /**
- * If it is not animated, there will be only one iteration here,
- * so don't bother checking
- */
- // Don't forget to go back to the first frame
- $this->image->setFirstIterator();
- do {
-
- // FIXME - implement horizantal bias for scaling as in followin GD functions
- // to allow very tall images to be constrained only horizontally.
-
- $this->image->scaleImage($dest_width, $dest_height);
- } while ($this->image->nextImage());
-
- // FIXME - also we need to copy the new dimensions to $this->height, $this->width as other functions
- // may rely on it.
-
- return;
- }
-
-
- $dest = imagecreatetruecolor( $dest_width, $dest_height );
- imagealphablending($dest, false);
- imagesavealpha($dest, true);
- if ($this->type=='image/png') imagefill($dest, 0, 0, imagecolorallocatealpha($dest, 0, 0, 0, 127)); // fill with alpha
- imagecopyresampled($dest, $this->image, 0, 0, 0, 0, $dest_width, $dest_height, $width, $height);
- if($this->image)
- imagedestroy($this->image);
- $this->image = $dest;
- $this->width = imagesx($this->image);
- $this->height = imagesy($this->image);
- }
-
- public function rotate($degrees) {
- if(!$this->is_valid())
- return FALSE;
-
- if($this->is_imagick()) {
- $this->image->setFirstIterator();
- do {
- $this->image->rotateImage(new ImagickPixel(), -$degrees); // ImageMagick rotates in the opposite direction of imagerotate()
- } while ($this->image->nextImage());
- return;
- }
-
- $this->image = imagerotate($this->image,$degrees,0);
- $this->width = imagesx($this->image);
- $this->height = imagesy($this->image);
- }
-
- public function flip($horiz = true, $vert = false) {
- if(!$this->is_valid())
- return FALSE;
-
- if($this->is_imagick()) {
- $this->image->setFirstIterator();
- do {
- if($horiz) $this->image->flipImage();
- if($vert) $this->image->flopImage();
- } while ($this->image->nextImage());
- return;
- }
-
- $w = imagesx($this->image);
- $h = imagesy($this->image);
- $flipped = imagecreate($w, $h);
- if($horiz) {
- for ($x = 0; $x < $w; $x++) {
- imagecopy($flipped, $this->image, $x, 0, $w - $x - 1, 0, 1, $h);
- }
- }
- if($vert) {
- for ($y = 0; $y < $h; $y++) {
- imagecopy($flipped, $this->image, 0, $y, 0, $h - $y - 1, $w, 1);
- }
- }
- $this->image = $flipped;
- }
-
- public function orient($filename) {
- // based off comment on http://php.net/manual/en/function.imagerotate.php
-
- if(!$this->is_valid())
- return FALSE;
-
- if( (! function_exists('exif_read_data')) || ($this->getType() !== 'image/jpeg') )
- return;
-
- $exif = @exif_read_data($filename);
- if($exif) {
- $ort = $exif['Orientation'];
-
- switch($ort)
- {
- case 1: // nothing
- break;
-
- case 2: // horizontal flip
- $this->flip();
- break;
-
- case 3: // 180 rotate left
- $this->rotate(180);
- break;
-
- case 4: // vertical flip
- $this->flip(false, true);
- break;
-
- case 5: // vertical flip + 90 rotate right
- $this->flip(false, true);
- $this->rotate(-90);
- break;
-
- case 6: // 90 rotate right
- $this->rotate(-90);
- break;
-
- case 7: // horizontal flip + 90 rotate right
- $this->flip();
- $this->rotate(-90);
- break;
-
- case 8: // 90 rotate left
- $this->rotate(90);
- break;
- }
- }
- }
-
-
-
- public function scaleImageUp($min) {
- if(!$this->is_valid())
- return FALSE;
-
-
- $width = $this->width;
- $height = $this->height;
-
- $dest_width = $dest_height = 0;
-
- if((! $width)|| (! $height))
- return FALSE;
-
- if($width < $min && $height < $min) {
- if($width > $height) {
- $dest_width = $min;
- $dest_height = intval(( $height * $min ) / $width);
- }
- else {
- $dest_width = intval(( $width * $min ) / $height);
- $dest_height = $min;
- }
- }
- else {
- if( $width < $min ) {
- $dest_width = $min;
- $dest_height = intval(( $height * $min ) / $width);
- }
- else {
- if( $height < $min ) {
- $dest_width = intval(( $width * $min ) / $height);
- $dest_height = $min;
- }
- else {
- $dest_width = $width;
- $dest_height = $height;
- }
- }
- }
-
- if($this->is_imagick())
- return $this->scaleImage($dest_width,$dest_height);
-
- $dest = imagecreatetruecolor( $dest_width, $dest_height );
- imagealphablending($dest, false);
- imagesavealpha($dest, true);
- if ($this->type=='image/png') imagefill($dest, 0, 0, imagecolorallocatealpha($dest, 0, 0, 0, 127)); // fill with alpha
- imagecopyresampled($dest, $this->image, 0, 0, 0, 0, $dest_width, $dest_height, $width, $height);
- if($this->image)
- imagedestroy($this->image);
- $this->image = $dest;
- $this->width = imagesx($this->image);
- $this->height = imagesy($this->image);
- }
-
-
-
- public function scaleImageSquare($dim) {
- if(!$this->is_valid())
- return FALSE;
-
- if($this->is_imagick()) {
- $this->image->setFirstIterator();
- do {
- $this->image->scaleImage($dim, $dim);
- } while ($this->image->nextImage());
- return;
- }
-
- $dest = imagecreatetruecolor( $dim, $dim );
- imagealphablending($dest, false);
- imagesavealpha($dest, true);
- if ($this->type=='image/png') imagefill($dest, 0, 0, imagecolorallocatealpha($dest, 0, 0, 0, 127)); // fill with alpha
- imagecopyresampled($dest, $this->image, 0, 0, 0, 0, $dim, $dim, $this->width, $this->height);
- if($this->image)
- imagedestroy($this->image);
- $this->image = $dest;
- $this->width = imagesx($this->image);
- $this->height = imagesy($this->image);
- }
-
-
- public function cropImage($max,$x,$y,$w,$h) {
- if(!$this->is_valid())
- return FALSE;
-
- if($this->is_imagick()) {
- $this->image->setFirstIterator();
- do {
- $this->image->cropImage($w, $h, $x, $y);
- /**
- * We need to remove the canva,
- * or the image is not resized to the crop:
- * http://php.net/manual/en/imagick.cropimage.php#97232
- */
- $this->image->setImagePage(0, 0, 0, 0);
- } while ($this->image->nextImage());
- return $this->scaleImage($max);
- }
-
- $dest = imagecreatetruecolor( $max, $max );
- imagealphablending($dest, false);
- imagesavealpha($dest, true);
- if ($this->type=='image/png') imagefill($dest, 0, 0, imagecolorallocatealpha($dest, 0, 0, 0, 127)); // fill with alpha
- imagecopyresampled($dest, $this->image, 0, 0, $x, $y, $max, $max, $w, $h);
- if($this->image)
- imagedestroy($this->image);
- $this->image = $dest;
- $this->width = imagesx($this->image);
- $this->height = imagesy($this->image);
- }
-
- public function saveImage($path) {
- if(!$this->is_valid())
- return FALSE;
-
- $string = $this->imageString();
- file_put_contents($path, $string);
- }
-
- public function imageString() {
- if(!$this->is_valid())
- return FALSE;
-
- if($this->is_imagick()) {
- /* Clean it */
- $this->image = $this->image->deconstructImages();
- $string = $this->image->getImagesBlob();
- return $string;
- }
-
- $quality = FALSE;
-
- ob_start();
-
- switch($this->getType()){
- case "image/png":
- $quality = get_config('system','png_quality');
- if((! $quality) || ($quality > 9))
- $quality = PNG_QUALITY;
- imagepng($this->image,NULL, $quality);
- break;
- case "image/jpeg":
- $quality = get_config('system','jpeg_quality');
- if((! $quality) || ($quality > 100))
- $quality = JPEG_QUALITY;
- imagejpeg($this->image,NULL,$quality);
- }
- $string = ob_get_contents();
- ob_end_clean();
-
- return $string;
- }
-
-
-
- public function store($aid, $uid, $xchan, $rid, $filename, $album, $scale, $profile = 0, $allow_cid = '', $allow_gid = '', $deny_cid = '', $deny_gid = '') {
-
- $x = q("select id from photo where `resource_id` = '%s' and uid = %d and `xchan` = '%s' and `scale` = %d limit 1",
- dbesc($rid),
- intval($uid),
- dbesc($xchan),
- intval($scale)
- );
- if(count($x)) {
- $r = q("UPDATE `photo`
- set `aid` = %d,
- `uid` = %d,
- `xchan` = '%s',
- `resource_id` = '%s',
- `created` = '%s',
- `edited` = '%s',
- `filename` = '%s',
- `type` = '%s',
- `album` = '%s',
- `height` = %d,
- `width` = %d,
- `data` = '%s',
- `size` = %d,
- `scale` = %d,
- `profile` = %d,
- `allow_cid` = '%s',
- `allow_gid` = '%s',
- `deny_cid` = '%s',
- `deny_gid` = '%s'
- where id = %d limit 1",
-
- intval($aid),
- intval($uid),
- dbesc($xchan),
- dbesc($rid),
- dbesc(datetime_convert()),
- dbesc(datetime_convert()),
- dbesc(basename($filename)),
- dbesc($this->getType()),
- dbesc($album),
- intval($this->getHeight()),
- intval($this->getWidth()),
- dbesc($this->imageString()),
- intval(strlen($this->imageString())),
- intval($scale),
- intval($profile),
- dbesc($allow_cid),
- dbesc($allow_gid),
- dbesc($deny_cid),
- dbesc($deny_gid),
- intval($x[0]['id'])
- );
- }
- else {
- $r = q("INSERT INTO `photo`
- ( `aid`, `uid`, `xchan`, `resource_id`, `created`, `edited`, `filename`, type, `album`, `height`, `width`, `data`, `size`, `scale`, `profile`, `allow_cid`, `allow_gid`, `deny_cid`, `deny_gid` )
- VALUES ( %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, '%s', %d, %d, %d, '%s', '%s', '%s', '%s' )",
- intval($aid),
- intval($uid),
- dbesc($xchan),
- dbesc($rid),
- dbesc(datetime_convert()),
- dbesc(datetime_convert()),
- dbesc(basename($filename)),
- dbesc($this->getType()),
- dbesc($album),
- intval($this->getHeight()),
- intval($this->getWidth()),
- dbesc($this->imageString()),
- intval(strlen($this->imageString())),
- intval($scale),
- intval($profile),
- dbesc($allow_cid),
- dbesc($allow_gid),
- dbesc($deny_cid),
- dbesc($deny_gid)
- );
- }
- return $r;
- }
-}}
-
-
-/**
- * Guess image mimetype from filename or from Content-Type header
- *
- * @arg $filename string Image filename
- * @arg $fromcurl boolean Check Content-Type header from curl request
- */
-function guess_image_type($filename, $fromcurl=false) {
- logger('Photo: guess_image_type: '.$filename . ($fromcurl?' from curl headers':''), LOGGER_DEBUG);
- $type = null;
- if ($fromcurl) {
- $a = get_app();
- $headers=array();
- $h = explode("\n",$a->get_curl_headers());
- foreach ($h as $l) {
- list($k,$v) = array_map("trim", explode(":", trim($l), 2));
- $headers[$k] = $v;
- }
- if (array_key_exists('Content-Type', $headers))
- $type = $headers['Content-Type'];
- }
- if (is_null($type)){
- // Guessing from extension? Isn't that... dangerous?
- if(class_exists('Imagick') && file_exists($filename) && is_readable($filename)) {
- /**
- * Well, this not much better,
- * but at least it comes from the data inside the image,
- * we won't be tricked by a manipulated extension
- */
- $image = new Imagick($filename);
- $type = $image->getImageMimeType();
- } else {
- $ext = pathinfo($filename, PATHINFO_EXTENSION);
- $types = Photo::supportedTypes();
- $type = "image/jpeg";
- foreach ($types as $m=>$e){
- if ($ext==$e) $type = $m;
- }
- }
- }
- logger('Photo: guess_image_type: type='.$type, LOGGER_DEBUG);
- return $type;
-
-}
-
-function import_profile_photo($photo,$xchan) {
-
- $a = get_app();
-
- logger('import_profile_photo: updating channel photo from ' . $photo . ' for ' . $xchan, LOGGER_DEBUG);
-
- $r = q("select resource_id from photo where xchan = '%s' and scale = 4 limit 1",
- dbesc($xchan)
- );
- if($r) {
- $hash = $r[0]['resource_id'];
- }
- else {
- $hash = photo_new_resource();
- }
-
- $photo_failure = false;
-
-
- $filename = basename($photo);
- $img_str = fetch_url($photo,true);
-
- $type = guess_image_type($photo,true);
- $img = new Photo($img_str, $type);
- if($img->is_valid()) {
-
- $img->scaleImageSquare(175);
-
- $r = $img->store(0, 0, $xchan, $hash, $filename, 'Contact Photos', 4 );
-
- if($r === false)
- $photo_failure = true;
-
- $img->scaleImage(80);
-
- $r = $img->store(0, 0, $xchan, $hash, $filename, 'Contact Photos', 5 );
-
- if($r === false)
- $photo_failure = true;
-
- $img->scaleImage(48);
-
- $r = $img->store(0, 0, $xchan, $hash, $filename, 'Contact Photos', 6 );
-
- if($r === false)
- $photo_failure = true;
-
- $photo = $a->get_baseurl() . '/photo/' . $hash . '-4';
- $thumb = $a->get_baseurl() . '/photo/' . $hash . '-5';
- $micro = $a->get_baseurl() . '/photo/' . $hash . '-6';
- }
- else {
- logger('import_profile_photo: invalid image from ' . $photo);
- $photo_failure = true;
- }
- if($photo_failure) {
- $photo = $a->get_baseurl() . '/images/person-175.jpg';
- $thumb = $a->get_baseurl() . '/images/person-80.jpg';
- $micro = $a->get_baseurl() . '/images/person-48.jpg';
- $type = 'image/jpeg';
- }
-
- return(array($photo,$thumb,$micro,$type));
-
-}
-
-
-
-function import_channel_photo($photo,$type,$aid,$uid) {
-
- $a = get_app();
-
- logger('import_channel_photo: importing channel photo for ' . $uid, LOGGER_DEBUG);
-
- $hash = photo_new_resource();
-
- $photo_failure = false;
-
-
- $filename = $hash;
-
- $img = new Photo($photo, $type);
- if($img->is_valid()) {
-
- $img->scaleImageSquare(175);
-
- $r = $img->store($aid,$uid,'', $hash, $filename, t('Profile Photos'), 4, true);
-
- if($r === false)
- $photo_failure = true;
-
- $img->scaleImage(80);
-
- $r = $img->store($aid,$uid,'', $hash, $filename, t('Profile Photos'), 5, true);
-
- if($r === false)
- $photo_failure = true;
-
- $img->scaleImage(48);
-
- $r = $img->store($aid,$uid,'', $hash, $filename, t('Profile Photos'), 6, true);
-
- if($r === false)
- $photo_failure = true;
-
- }
- else {
- logger('import_channel_photo: invalid image.');
- $photo_failure = true;
- }
-
- return(($photo_failure)? false : true);
-
-}
diff --git a/include/ProtoDriver.php b/include/ProtoDriver.php
index a39881e9a..7585a0135 100644
--- a/include/ProtoDriver.php
+++ b/include/ProtoDriver.php
@@ -1,4 +1,4 @@
-<?php
+<?php /** @file */
/*
* Abstraction class for dealing with alternate networks (which of course do not exist, hence the abstraction)
diff --git a/include/Scrape.php b/include/Scrape.php
deleted file mode 100644
index 806106ef1..000000000
--- a/include/Scrape.php
+++ /dev/null
@@ -1,712 +0,0 @@
-<?php
-
-require_once('library/HTML5/Parser.php');
-require_once('include/crypto.php');
-
-if(! function_exists('scrape_dfrn')) {
-function scrape_dfrn($url) {
-
- $a = get_app();
-
- $ret = array();
-
- logger('scrape_dfrn: url=' . $url);
-
- $s = fetch_url($url);
-
- if(! $s)
- return $ret;
-
- $headers = $a->get_curl_headers();
- logger('scrape_dfrn: headers=' . $headers, LOGGER_DEBUG);
-
-
- $lines = explode("\n",$headers);
- if(count($lines)) {
- foreach($lines as $line) {
- // don't try and run feeds through the html5 parser
- if(stristr($line,'content-type:') && ((stristr($line,'application/atom+xml')) || (stristr($line,'application/rss+xml'))))
- return ret;
- }
- }
-
- try {
- $dom = HTML5_Parser::parse($s);
- } catch (DOMException $e) {
- logger('scrape_dfrn: parse error: ' . $e);
- }
-
- if(! $dom)
- return $ret;
-
- $items = $dom->getElementsByTagName('link');
-
- // get DFRN link elements
-
- foreach($items as $item) {
- $x = $item->getAttribute('rel');
- if(($x === 'alternate') && ($item->getAttribute('type') === 'application/atom+xml'))
- $ret['feed_atom'] = $item->getAttribute('href');
- if(substr($x,0,5) == "dfrn-") {
- $ret[$x] = $item->getAttribute('href');
- }
- if($x === 'lrdd') {
- $decoded = urldecode($item->getAttribute('href'));
- if(preg_match('/acct:([^@]*)@/',$decoded,$matches))
- $ret['nick'] = $matches[1];
- }
- }
-
- // Pull out hCard profile elements
-
- $largest_photo = 0;
-
- $items = $dom->getElementsByTagName('*');
- foreach($items as $item) {
- if(attribute_contains($item->getAttribute('class'), 'vcard')) {
- $level2 = $item->getElementsByTagName('*');
- foreach($level2 as $x) {
- if(attribute_contains($x->getAttribute('class'),'fn')) {
- $ret['fn'] = $x->textContent;
- }
- if((attribute_contains($x->getAttribute('class'),'photo'))
- || (attribute_contains($x->getAttribute('class'),'avatar'))) {
- $size = intval($x->getAttribute('width'));
- // dfrn prefers 175, so if we find this, we set largest_size so it can't be topped.
- if(($size > $largest_photo) || ($size == 175) || (! $largest_photo)) {
- $ret['photo'] = $x->getAttribute('src');
- $largest_photo = (($size == 175) ? 9999 : $size);
- }
- }
- if(attribute_contains($x->getAttribute('class'),'key')) {
- $ret['key'] = $x->textContent;
- }
- }
- }
- }
-
- return $ret;
-}}
-
-
-
-
-
-
-if(! function_exists('validate_dfrn')) {
-function validate_dfrn($a) {
- $errors = 0;
- if(! x($a,'key'))
- $errors ++;
- if(! x($a,'dfrn-request'))
- $errors ++;
- if(! x($a,'dfrn-confirm'))
- $errors ++;
- if(! x($a,'dfrn-notify'))
- $errors ++;
- if(! x($a,'dfrn-poll'))
- $errors ++;
- return $errors;
-}}
-
-if(! function_exists('scrape_meta')) {
-function scrape_meta($url) {
-
- $a = get_app();
-
- $ret = array();
-
- logger('scrape_meta: url=' . $url);
-
- $s = fetch_url($url);
-
- if(! $s)
- return $ret;
-
- $headers = $a->get_curl_headers();
- logger('scrape_meta: headers=' . $headers, LOGGER_DEBUG);
-
- $lines = explode("\n",$headers);
- if(count($lines)) {
- foreach($lines as $line) {
- // don't try and run feeds through the html5 parser
- if(stristr($line,'content-type:') && ((stristr($line,'application/atom+xml')) || (stristr($line,'application/rss+xml'))))
- return ret;
- }
- }
-
- try {
- $dom = HTML5_Parser::parse($s);
- } catch (DOMException $e) {
- logger('scrape_meta: parse error: ' . $e);
- }
-
- if(! $dom)
- return $ret;
-
- $items = $dom->getElementsByTagName('meta');
-
- // get DFRN link elements
-
- foreach($items as $item) {
- $x = $item->getAttribute('name');
- if(substr($x,0,5) == "dfrn-")
- $ret[$x] = $item->getAttribute('content');
- }
-
- return $ret;
-}}
-
-
-if(! function_exists('scrape_vcard')) {
-function scrape_vcard($url) {
-
- $a = get_app();
-
- $ret = array();
-
- logger('scrape_vcard: url=' . $url);
-
- $s = fetch_url($url);
-
- if(! $s)
- return $ret;
-
- $headers = $a->get_curl_headers();
- $lines = explode("\n",$headers);
- if(count($lines)) {
- foreach($lines as $line) {
- // don't try and run feeds through the html5 parser
- if(stristr($line,'content-type:') && ((stristr($line,'application/atom+xml')) || (stristr($line,'application/rss+xml'))))
- return ret;
- }
- }
-
- try {
- $dom = HTML5_Parser::parse($s);
- } catch (DOMException $e) {
- logger('scrape_vcard: parse error: ' . $e);
- }
-
- if(! $dom)
- return $ret;
-
- // Pull out hCard profile elements
-
- $largest_photo = 0;
-
- $items = $dom->getElementsByTagName('*');
- foreach($items as $item) {
- if(attribute_contains($item->getAttribute('class'), 'vcard')) {
- $level2 = $item->getElementsByTagName('*');
- foreach($level2 as $x) {
- if(attribute_contains($x->getAttribute('class'),'fn'))
- $ret['fn'] = $x->textContent;
- if((attribute_contains($x->getAttribute('class'),'photo'))
- || (attribute_contains($x->getAttribute('class'),'avatar'))) {
- $size = intval($x->getAttribute('width'));
- if(($size > $largest_photo) || (! $largest_photo)) {
- $ret['photo'] = $x->getAttribute('src');
- $largest_photo = $size;
- }
- }
- if((attribute_contains($x->getAttribute('class'),'nickname'))
- || (attribute_contains($x->getAttribute('class'),'uid'))) {
- $ret['nick'] = $x->textContent;
- }
- }
- }
- }
-
- return $ret;
-}}
-
-
-if(! function_exists('scrape_feed')) {
-function scrape_feed($url) {
-
- $a = get_app();
-
- $ret = array();
- $s = fetch_url($url);
-
- $headers = $a->get_curl_headers();
- $code = $a->get_curl_code();
-
- logger('scrape_feed: returns: ' . $code . ' headers=' . $headers, LOGGER_DEBUG);
-
- if(! $s) {
- logger('scrape_feed: no data returned for ' . $url);
- return $ret;
- }
-
-
- $lines = explode("\n",$headers);
- if(count($lines)) {
- foreach($lines as $line) {
- if(stristr($line,'content-type:')) {
- if(stristr($line,'application/atom+xml') || stristr($s,'<feed')) {
- $ret['feed_atom'] = $url;
- return $ret;
- }
- if(stristr($line,'application/rss+xml') || stristr($s,'<rss')) {
- $ret['feed_rss'] = $url;
- return $ret;
- }
- }
- }
- // perhaps an RSS version 1 feed with a generic or incorrect content-type?
- if(stristr($s,'</item>')) {
- $ret['feed_rss'] = $url;
- return $ret;
- }
- }
-
- try {
- $dom = HTML5_Parser::parse($s);
- } catch (DOMException $e) {
- logger('scrape_feed: parse error: ' . $e);
- }
-
- if(! $dom) {
- logger('scrape_feed: failed to parse.');
- return $ret;
- }
-
-
- $head = $dom->getElementsByTagName('base');
- if($head) {
- foreach($head as $head0) {
- $basename = $head0->getAttribute('href');
- break;
- }
- }
- if(! $basename)
- $basename = implode('/', array_slice(explode('/',$url),0,3)) . '/';
-
- $items = $dom->getElementsByTagName('link');
-
- // get Atom/RSS link elements, take the first one of either.
-
- if($items) {
- foreach($items as $item) {
- $x = $item->getAttribute('rel');
- if(($x === 'alternate') && ($item->getAttribute('type') === 'application/atom+xml')) {
- if(! x($ret,'feed_atom'))
- $ret['feed_atom'] = $item->getAttribute('href');
- }
- if(($x === 'alternate') && ($item->getAttribute('type') === 'application/rss+xml')) {
- if(! x($ret,'feed_rss'))
- $ret['feed_rss'] = $item->getAttribute('href');
- }
- }
- }
-
- // Drupal and perhaps others only provide relative URL's. Turn them into absolute.
-
- if(x($ret,'feed_atom') && (! strstr($ret['feed_atom'],'://')))
- $ret['feed_atom'] = $basename . $ret['feed_atom'];
- if(x($ret,'feed_rss') && (! strstr($ret['feed_rss'],'://')))
- $ret['feed_rss'] = $basename . $ret['feed_rss'];
-
- return $ret;
-}}
-
-
-/**
- *
- * Probe a network address to discover what kind of protocols we need to communicate with it.
- *
- * Warning: this function is a bit touchy and there are some subtle dependencies within the logic flow.
- * Edit with care.
- *
- */
-
-/**
- *
- * PROBE_DIASPORA has a bias towards returning Diaspora information
- * while PROBE_NORMAL has a bias towards dfrn/zot - in the case where
- * an address (such as a Friendica address) supports more than one type
- * of network.
- *
- */
-
-
-define ( 'PROBE_NORMAL', 0);
-
-function probe_url($url, $mode = PROBE_NORMAL) {
- require_once('include/email.php');
-
- $result = array();
-
- if(! $url)
- return $result;
-
- $network = null;
- $has_lrdd = false;
- $email_conversant = false;
-
- $twitter = ((strpos($url,'twitter.com') !== false) ? true : false);
- $lastfm = ((strpos($url,'last.fm/user') !== false) ? true : false);
-
- $at_addr = ((strpos($url,'@') !== false) ? true : false);
-
- if((! $twitter) && (! $lastfm)) {
-
- if(strpos($url,'mailto:') !== false && $at_addr) {
- $url = str_replace('mailto:','',$url);
- $links = array();
- }
- else
- $links = lrdd($url);
-
- if(count($links)) {
- $has_lrdd = true;
-
- logger('probe_url: found lrdd links: ' . print_r($links,true), LOGGER_DATA);
- foreach($links as $link) {
- if($link['@attributes']['rel'] === NAMESPACE_ZOT)
- $zot = unamp($link['@attributes']['href']);
- if($link['@attributes']['rel'] === NAMESPACE_DFRN)
- $dfrn = unamp($link['@attributes']['href']);
- if($link['@attributes']['rel'] === 'salmon')
- $notify = unamp($link['@attributes']['href']);
- if($link['@attributes']['rel'] === NAMESPACE_FEED)
- $poll = unamp($link['@attributes']['href']);
- if($link['@attributes']['rel'] === 'http://microformats.org/profile/hcard')
- $hcard = unamp($link['@attributes']['href']);
- if($link['@attributes']['rel'] === 'http://webfinger.net/rel/profile-page')
- $profile = unamp($link['@attributes']['href']);
- if($link['@attributes']['rel'] === 'http://portablecontacts.net/spec/1.0')
- $poco = unamp($link['@attributes']['href']);
-
- }
-
- // Status.Net can have more than one profile URL. We need to match the profile URL
- // to a contact on incoming messages to prevent spam, and we won't know which one
- // to match. So in case of two, one of them is stored as an alias. Only store URL's
- // and not webfinger user@host aliases. If they've got more than two non-email style
- // aliases, let's hope we're lucky and get one that matches the feed author-uri because
- // otherwise we're screwed.
-
- foreach($links as $link) {
- if($link['@attributes']['rel'] === 'alias') {
- if(strpos($link['@attributes']['href'],'@') === false) {
- if(isset($profile)) {
- if($link['@attributes']['href'] !== $profile)
- $alias = unamp($link['@attributes']['href']);
- }
- else
- $profile = unamp($link['@attributes']['href']);
- }
- }
- }
- }
- elseif($mode == PROBE_NORMAL) {
-
- // Check email
-
- $orig_url = $url;
- if((strpos($orig_url,'@')) && validate_email($orig_url)) {
- $x = q("SELECT `prvkey` FROM `user` WHERE `uid` = %d LIMIT 1",
- intval(local_user())
- );
- $r = q("SELECT * FROM `mailacct` WHERE `uid` = %d AND `server` != '' LIMIT 1",
- intval(local_user())
- );
- if(count($x) && count($r)) {
- $mailbox = construct_mailbox_name($r[0]);
- $password = '';
- openssl_private_decrypt(hex2bin($r[0]['pass']),$password,$x[0]['prvkey']);
- $mbox = email_connect($mailbox,$r[0]['user'],$password);
- if(! $mbox)
- logger('probe_url: email_connect failed.');
- unset($password);
- }
- if($mbox) {
- $msgs = email_poll($mbox,$orig_url);
- logger('probe_url: searching ' . $orig_url . ', ' . count($msgs) . ' messages found.', LOGGER_DEBUG);
- if(count($msgs)) {
- $addr = $orig_url;
- $network = NETWORK_MAIL;
- $name = substr($url,0,strpos($url,'@'));
- $phost = substr($url,strpos($url,'@')+1);
- $profile = 'http://' . $phost;
- // fix nick character range
- $vcard = array('fn' => $name, 'nick' => $name, 'photo' => avatar_img($url));
- $notify = 'smtp ' . random_string();
- $poll = 'email ' . random_string();
- $priority = 0;
- $x = email_msg_meta($mbox,$msgs[0]);
- if(stristr($x[0]->from,$orig_url))
- $adr = imap_rfc822_parse_adrlist($x[0]->from,'');
- elseif(stristr($x[0]->to,$orig_url))
- $adr = imap_rfc822_parse_adrlist($x[0]->to,'');
- if(isset($adr)) {
- foreach($adr as $feadr) {
- if((strcasecmp($feadr->mailbox,$name) == 0)
- &&(strcasecmp($feadr->host,$phost) == 0)
- && (strlen($feadr->personal))) {
-
- $personal = imap_mime_header_decode($feadr->personal);
- $vcard['fn'] = "";
- foreach($personal as $perspart)
- if ($perspart->charset != "default")
- $vcard['fn'] .= iconv($perspart->charset, 'UTF-8//IGNORE', $perspart->text);
- else
- $vcard['fn'] .= $perspart->text;
-
- $vcard['fn'] = notags($vcard['fn']);
- }
- }
- }
- }
- imap_close($mbox);
- }
- }
- }
- }
-
- if($mode == PROBE_NORMAL) {
- if(strlen($zot)) {
- $s = fetch_url($zot);
- if($s) {
- $j = json_decode($s);
- if($j) {
- $network = NETWORK_ZOT;
- $vcard = array(
- 'fn' => $j->fullname,
- 'nick' => $j->nickname,
- 'photo' => $j->photo
- );
- $profile = $j->url;
- $notify = $j->post;
- $pubkey = $j->pubkey;
- $poll = 'N/A';
- }
- }
- }
-
- if(strlen($dfrn)) {
- $ret = scrape_dfrn(($hcard) ? $hcard : $dfrn);
- if(is_array($ret) && x($ret,'dfrn-request')) {
- $network = NETWORK_DFRN;
- $request = $ret['dfrn-request'];
- $confirm = $ret['dfrn-confirm'];
- $notify = $ret['dfrn-notify'];
- $poll = $ret['dfrn-poll'];
-
- $vcard = array();
- $vcard['fn'] = $ret['fn'];
- $vcard['nick'] = $ret['nick'];
- $vcard['photo'] = $ret['photo'];
- }
- }
- }
-
- if($network !== NETWORK_ZOT && $network !== NETWORK_DFRN && $network !== NETWORK_MAIL) {
- if($has_lrdd)
- $network = NETWORK_OSTATUS;
- $priority = 0;
-
- if($hcard && ! $vcard) {
- $vcard = scrape_vcard($hcard);
-
- // Google doesn't use absolute url in profile photos
-
- if((x($vcard,'photo')) && substr($vcard['photo'],0,1) == '/') {
- $h = @parse_url($hcard);
- if($h)
- $vcard['photo'] = $h['scheme'] . '://' . $h['host'] . $vcard['photo'];
- }
-
- logger('probe_url: scrape_vcard: ' . print_r($vcard,true), LOGGER_DATA);
- }
-
- if($diaspora && $addr) {
- // Diaspora returns the name as the nick. As the nick will never be updated,
- // let's use the Diaspora nickname (the first part of the handle) as the nick instead
- $addr_parts = explode('@', $addr);
- $vcard['nick'] = $addr_parts[0];
- }
-
- if($twitter) {
- logger('twitter: setup');
- $tid = basename($url);
- $tapi = 'https://api.twitter.com/1/statuses/user_timeline.rss';
- if(intval($tid))
- $poll = $tapi . '?user_id=' . $tid;
- else
- $poll = $tapi . '?screen_name=' . $tid;
- $profile = 'http://twitter.com/#!/' . $tid;
- //$vcard['photo'] = 'https://api.twitter.com/1/users/profile_image/' . $tid;
- $vcard['photo'] = 'https://api.twitter.com/1/users/profile_image?screen_name=' . $tid . '&size=bigger';
- $vcard['nick'] = $tid;
- $vcard['fn'] = $tid;
- }
-
- if($lastfm) {
- $profile = $url;
- $poll = str_replace(array('www.','last.fm/'),array('','ws.audioscrobbler.com/1.0/'),$url) . '/recenttracks.rss';
- $vcard['nick'] = basename($url);
- $vcard['fn'] = $vcard['nick'] . t(' on Last.fm');
- $network = NETWORK_FEED;
- }
-
- if(! x($vcard,'fn'))
- if(x($vcard,'nick'))
- $vcard['fn'] = $vcard['nick'];
-
- $check_feed = false;
-
- if($twitter || ! $poll)
- $check_feed = true;
- if((! isset($vcard)) || (! x($vcard,'fn')) || (! $profile))
- $check_feed = true;
- if(($at_addr) && (! count($links)))
- $check_feed = false;
-
- if($check_feed) {
-
- $feedret = scrape_feed(($poll) ? $poll : $url);
- logger('probe_url: scrape_feed ' . (($poll)? $poll : $url) . ' returns: ' . print_r($feedret,true), LOGGER_DATA);
- if(count($feedret) && ($feedret['feed_atom'] || $feedret['feed_rss'])) {
- $poll = ((x($feedret,'feed_atom')) ? unamp($feedret['feed_atom']) : unamp($feedret['feed_rss']));
- if(! x($vcard))
- $vcard = array();
- }
-
- if(x($feedret,'photo') && (! x($vcard,'photo')))
- $vcard['photo'] = $feedret['photo'];
- require_once('library/simplepie/simplepie.inc');
- $feed = new SimplePie();
- $xml = fetch_url($poll);
-
- logger('probe_url: fetch feed: ' . $poll . ' returns: ' . $xml, LOGGER_DATA);
- $a = get_app();
-
- logger('probe_url: scrape_feed: headers: ' . $a->get_curl_headers(), LOGGER_DATA);
-
- $feed->set_raw_data($xml);
-
- $feed->init();
- if($feed->error())
- logger('probe_url: scrape_feed: Error parsing XML: ' . $feed->error());
-
-
- if(! x($vcard,'photo'))
- $vcard['photo'] = $feed->get_image_url();
- $author = $feed->get_author();
-
- if($author) {
- $vcard['fn'] = unxmlify(trim($author->get_name()));
- if(! $vcard['fn'])
- $vcard['fn'] = trim(unxmlify($author->get_email()));
- if(strpos($vcard['fn'],'@') !== false)
- $vcard['fn'] = substr($vcard['fn'],0,strpos($vcard['fn'],'@'));
- $email = unxmlify($author->get_email());
- if(! $profile && $author->get_link())
- $profile = trim(unxmlify($author->get_link()));
- if(! $vcard['photo']) {
- $rawtags = $feed->get_feed_tags( SIMPLEPIE_NAMESPACE_ATOM_10, 'author');
- if($rawtags) {
- $elems = $rawtags[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10];
- if((x($elems,'link')) && ($elems['link'][0]['attribs']['']['rel'] === 'photo'))
- $vcard['photo'] = $elems['link'][0]['attribs']['']['href'];
- }
- }
- }
- else {
- $item = $feed->get_item(0);
- if($item) {
- $author = $item->get_author();
- if($author) {
- $vcard['fn'] = trim(unxmlify($author->get_name()));
- if(! $vcard['fn'])
- $vcard['fn'] = trim(unxmlify($author->get_email()));
- if(strpos($vcard['fn'],'@') !== false)
- $vcard['fn'] = substr($vcard['fn'],0,strpos($vcard['fn'],'@'));
- $email = unxmlify($author->get_email());
- if(! $profile && $author->get_link())
- $profile = trim(unxmlify($author->get_link()));
- }
- if(! $vcard['photo']) {
- $rawmedia = $item->get_item_tags('http://search.yahoo.com/mrss/','thumbnail');
- if($rawmedia && $rawmedia[0]['attribs']['']['url'])
- $vcard['photo'] = unxmlify($rawmedia[0]['attribs']['']['url']);
- }
- if(! $vcard['photo']) {
- $rawtags = $item->get_item_tags( SIMPLEPIE_NAMESPACE_ATOM_10, 'author');
- if($rawtags) {
- $elems = $rawtags[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10];
- if((x($elems,'link')) && ($elems['link'][0]['attribs']['']['rel'] === 'photo'))
- $vcard['photo'] = $elems['link'][0]['attribs']['']['href'];
- }
- }
- }
- }
-
- if((! $vcard['photo']) && strlen($email))
- $vcard['photo'] = avatar_img($email);
- if($poll === $profile)
- $lnk = $feed->get_permalink();
- if(isset($lnk) && strlen($lnk))
- $profile = $lnk;
-
- if(! (x($vcard,'fn')))
- $vcard['fn'] = notags($feed->get_title());
- if(! (x($vcard,'fn')))
- $vcard['fn'] = notags($feed->get_description());
-
- if(strpos($vcard['fn'],'Twitter / ') !== false) {
- $vcard['fn'] = substr($vcard['fn'],strpos($vcard['fn'],'/')+1);
- $vcard['fn'] = trim($vcard['fn']);
- }
- if(! x($vcard,'nick')) {
- $vcard['nick'] = strtolower(notags(unxmlify($vcard['fn'])));
- if(strpos($vcard['nick'],' '))
- $vcard['nick'] = trim(substr($vcard['nick'],0,strpos($vcard['nick'],' ')));
- }
- if(! $network)
- $network = NETWORK_FEED;
- if(! $priority)
- $priority = 2;
- }
- }
-
- if(! x($vcard,'photo')) {
- $a = get_app();
- $vcard['photo'] = $a->get_baseurl() . '/images/person-175.jpg' ;
- }
-
- if(! $profile)
- $profile = $url;
-
- // No human could be associated with this link, use the URL as the contact name
-
- if(($network === NETWORK_FEED) && ($poll) && (! x($vcard,'fn')))
- $vcard['fn'] = $url;
-
- $vcard['fn'] = notags($vcard['fn']);
- $vcard['nick'] = str_replace(' ','',notags($vcard['nick']));
-
- $result['name'] = $vcard['fn'];
- $result['nick'] = $vcard['nick'];
- $result['url'] = $profile;
- $result['addr'] = $addr;
- $result['batch'] = $batch;
- $result['notify'] = $notify;
- $result['poll'] = $poll;
- $result['request'] = $request;
- $result['confirm'] = $confirm;
- $result['poco'] = $poco;
- $result['photo'] = $vcard['photo'];
- $result['priority'] = $priority;
- $result['network'] = $network;
- $result['alias'] = $alias;
- $result['pubkey'] = $pubkey;
-
- logger('probe_url: ' . print_r($result,true), LOGGER_DEBUG);
-
- return $result;
-}
diff --git a/include/account.php b/include/account.php
index a31dbba4b..b3dbb7023 100644
--- a/include/account.php
+++ b/include/account.php
@@ -1,4 +1,4 @@
-<?php
+<?php /** @file */
require_once('include/config.php');
require_once('include/network.php');
@@ -6,6 +6,7 @@ require_once('include/plugin.php');
require_once('include/text.php');
require_once('include/language.php');
require_once('include/datetime.php');
+require_once('include/crypto.php');
function check_account_email($email) {
@@ -26,7 +27,7 @@ function check_account_email($email) {
$r = q("select account_email from account where account_email = '%s' limit 1",
dbesc($email)
);
- if(count($r)) {
+ if($r) {
$result['message'] .= t('Your email address is already registered at this site.');
}
}
@@ -80,14 +81,14 @@ function check_account_invite($invite_code) {
function check_account_admin($arr) {
if(is_site_admin())
return true;
- $admin_mail = trim(get_config('system','admin_email'));
+ $admin_email = trim(get_config('system','admin_email'));
if(strlen($admin_email) && $admin_email === trim($arr['email']))
return true;
return false;
}
function account_total() {
- $r = q("select account_id from account where 1");
+ $r = q("select account_id from account where true");
if(is_array($r))
return count($r);
return false;
@@ -107,8 +108,10 @@ function create_account($arr) {
$parent = ((x($arr,'parent')) ? intval($arr['parent']) : 0 );
$flags = ((x($arr,'account_flags')) ? intval($arr['account_flags']) : ACCOUNT_OK);
$roles = ((x($arr,'account_roles')) ? intval($arr['account_roles']) : 0 );
-
+ $expires = ((x($arr,'expires')) ? intval($arr['expires']) : '0000-00-00 00:00:00');
+
$default_service_class = get_config('system','default_service_class');
+
if($default_service_class === false)
$default_service_class = '';
@@ -129,9 +132,16 @@ function create_account($arr) {
// allow the admin_email account to be admin, but only if it's the first account.
$c = account_total();
- if((c === 0) && (check_account_admin($arr)))
+ if(($c === 0) && (check_account_admin($arr)))
$roles |= ACCOUNT_ROLE_ADMIN;
+ // Ensure that there is a host keypair.
+
+ if((! get_config('system','pubkey')) && (! get_config('system','prvkey'))) {
+ $hostkey = new_keypair(4096);
+ set_config('system','pubkey',$hostkey['pubkey']);
+ set_config('system','prvkey',$hostkey['prvkey']);
+ }
$invite_result = check_account_invite($invite_code);
if($invite_result['error']) {
@@ -281,7 +291,7 @@ function send_reg_approval_email($arr) {
function send_verification_email($email,$password) {
$email_msg = replace_macros(get_intltext_template('register_open_eml.tpl'), array(
- '$sitename' => get_config('config','sitename'),
+ '$sitename' => get_config('system','sitename'),
'$siteurl' => z_root(),
'$email' => $email,
'$password' => t('your registration password'),
diff --git a/include/acl_selectors.php b/include/acl_selectors.php
index f4dacb74a..749ca75eb 100644
--- a/include/acl_selectors.php
+++ b/include/acl_selectors.php
@@ -1,4 +1,4 @@
-<?php
+<?php /** @file */
/**
*
*/
@@ -14,7 +14,7 @@ function group_select($selname,$selclass,$preselected = false,$size = 4) {
$o .= "<select name=\"{$selname}[]\" id=\"$selclass\" class=\"$selclass\" multiple=\"multiple\" size=\"$size\" >\r\n";
- $r = q("SELECT * FROM `group` WHERE `deleted` = 0 AND `uid` = %d ORDER BY `name` ASC",
+ $r = q("SELECT * FROM `groups` WHERE `deleted` = 0 AND `uid` = %d ORDER BY `name` ASC",
intval(local_user())
);
@@ -208,62 +208,27 @@ function contact_select($selname, $selclass, $preselected = false, $size = 4, $p
function fixacl(&$item) {
- $item = intval(str_replace(array('<','>'),array('',''),$item));
+ $item = str_replace(array('<','>'),array('',''),$item);
}
-function populate_acl($user = null,$celeb = false) {
+function populate_acl($defaults = null,$unused = false) {
$allow_cid = $allow_gid = $deny_cid = $deny_gid = false;
- if(is_array($user)) {
- $allow_cid = ((strlen($user['allow_cid']))
- ? explode('><', $user['allow_cid']) : array() );
- $allow_gid = ((strlen($user['allow_gid']))
- ? explode('><', $user['allow_gid']) : array() );
- $deny_cid = ((strlen($user['deny_cid']))
- ? explode('><', $user['deny_cid']) : array() );
- $deny_gid = ((strlen($user['deny_gid']))
- ? explode('><', $user['deny_gid']) : array() );
+ if(is_array($defaults)) {
+ $allow_cid = ((strlen($defaults['allow_cid']))
+ ? explode('><', $defaults['allow_cid']) : array() );
+ $allow_gid = ((strlen($defaults['allow_gid']))
+ ? explode('><', $defaults['allow_gid']) : array() );
+ $deny_cid = ((strlen($defaults['deny_cid']))
+ ? explode('><', $defaults['deny_cid']) : array() );
+ $deny_gid = ((strlen($defaults['deny_gid']))
+ ? explode('><', $defaults['deny_gid']) : array() );
array_walk($allow_cid,'fixacl');
array_walk($allow_gid,'fixacl');
array_walk($deny_cid,'fixacl');
array_walk($deny_gid,'fixacl');
}
-
- /*$o = '';
- $o .= '<div id="acl-wrapper">';
- $o .= '<div id="acl-permit-outer-wrapper">';
- $o .= '<div id="acl-permit-text">' . t('Visible To:') . '</div><div id="jot-public">' . t('everybody') . '</div>';
- $o .= '<div id="acl-permit-text-end"></div>';
- $o .= '<div id="acl-permit-wrapper">';
- $o .= '<div id="group_allow_wrapper">';
- $o .= '<label id="acl-allow-group-label" for="group_allow" >' . t('Groups') . '</label>';
- $o .= group_select('group_allow','group_allow',$allow_gid);
- $o .= '</div>';
- $o .= '<div id="contact_allow_wrapper">';
- $o .= '<label id="acl-allow-contact-label" for="contact_allow" >' . t('Contacts') . '</label>';
- $o .= contact_select('contact_allow','contact_allow',$allow_cid,4,false,$celeb,true);
- $o .= '</div>';
- $o .= '</div>' . "\r\n";
- $o .= '<div id="acl-allow-end"></div>' . "\r\n";
- $o .= '</div>';
- $o .= '<div id="acl-deny-outer-wrapper">';
- $o .= '<div id="acl-deny-text">' . t('Except For:') . '</div>';
- $o .= '<div id="acl-deny-text-end"></div>';
- $o .= '<div id="acl-deny-wrapper">';
- $o .= '<div id="group_deny_wrapper" >';
- $o .= '<label id="acl-deny-group-label" for="group_deny" >' . t('Groups') . '</label>';
- $o .= group_select('group_deny','group_deny', $deny_gid);
- $o .= '</div>';
- $o .= '<div id="contact_deny_wrapper" >';
- $o .= '<label id="acl-deny-contact-label" for="contact_deny" >' . t('Contacts') . '</label>';
- $o .= contact_select('contact_deny','contact_deny', $deny_cid,4,false, $celeb,true);
- $o .= '</div>';
- $o .= '</div>' . "\r\n";
- $o .= '<div id="acl-deny-end"></div>' . "\r\n";
- $o .= '</div>';
- $o .= '</div>' . "\r\n";
- $o .= '<div id="acl-wrapper-end"></div>' . "\r\n";*/
$tpl = get_markup_template("acl_selector.tpl");
$o = replace_macros($tpl, array(
diff --git a/include/activities.php b/include/activities.php
index ced9f3d18..4502b758e 100644
--- a/include/activities.php
+++ b/include/activities.php
@@ -1,4 +1,4 @@
-<?php
+<?php /** @file */
function profile_activity($changed, $value) {
$a = get_app();
@@ -17,13 +17,15 @@ function profile_activity($changed, $value) {
return;
$arr = array();
- $arr['uri'] = $arr['parent_uri'] = item_message_id();
+ $arr['mid'] = $arr['parent_mid'] = item_message_id();
$arr['uid'] = local_user();
$arr['aid'] = $self['channel_account_id'];
$arr['owner_xchan'] = $arr['author_xchan'] = $self['xchan_hash'];
$arr['item_flags'] = ITEM_WALL|ITEM_ORIGIN|ITEM_THREAD_TOP;
$arr['verb'] = ACTIVITY_UPDATE;
$arr['obj_type'] = ACTIVITY_OBJ_PROFILE;
+
+ $arr['$plink'] = z_root() . '/channel/' . $self['channel_address'] . '/?f=&mid=' . $arr['mid'];
$A = '[url=' . z_root() . '/channel/' . $self['channel_address'] . ']' . $self['channel_name'] . '[/url]';
@@ -45,6 +47,8 @@ function profile_activity($changed, $value) {
$prof = '[url=' . z_root() . '/profile/' . $self['channel_address'] . ']' . t('public profile') . '[/url]';
if($t == 1 && strlen($value)) {
+ // if it's a url, the HTML quotes will mess it up, so link it and don't try and zidify it because we don't know what it points to.
+ $value = linkify($value);
$message = sprintf( t('%1$s changed %2$s to &ldquo;%3$s&rdquo;'), $A, $changes, $value);
$message .= "\n\n" . sprintf( t('Visit %1$s\'s %2$s'), $A, $prof);
}
@@ -73,7 +77,8 @@ function profile_activity($changed, $value) {
$arr['deny_cid'] = $self['channel_deny_cid'];
$arr['deny_gid'] = $self['channel_deny_gid'];
- $i = item_store($arr);
+ $res = item_store($arr);
+ $i = $res['item_id'];
if($i) {
// FIXME - limit delivery in notifier.php to those specificed in the perms argument
diff --git a/include/api.php b/include/api.php
index 4d74eb298..463d29cf8 100644
--- a/include/api.php
+++ b/include/api.php
@@ -1,4 +1,4 @@
-<?php
+<?php /** @file */
require_once("bbcode.php");
require_once("datetime.php");
@@ -6,6 +6,7 @@ require_once("conversation.php");
require_once("oauth.php");
require_once("html2plain.php");
require_once('include/security.php');
+require_once('include/photos.php');
/*
*
@@ -71,7 +72,9 @@ require_once('include/security.php');
// login with oauth
try {
$oauth = new FKOAuth1();
- list($consumer,$token) = $oauth->verify_request(OAuthRequest::from_request());
+ $req = OAuthRequest::from_request();
+ list($consumer,$token) = $oauth->verify_request($req);
+// list($consumer,$token) = $oauth->verify_request(OAuthRequest::from_request());
if (!is_null($token)){
$oauth->loginUser($token->uid);
call_hooks('logged_in', $a->user);
@@ -96,6 +99,16 @@ require_once('include/security.php');
}
}
+ if(x($_SERVER,'HTTP_AUTHORIZATION')) {
+ $userpass = base64_decode(substr($_SERVER["HTTP_AUTHORIZATION"],6)) ;
+ if(strlen($userpass)) {
+ list($name, $password) = explode(':', $userpass);
+ $_SERVER['PHP_AUTH_USER'] = $name;
+ $_SERVER['PHP_AUTH_PW'] = $password;
+ }
+ }
+
+
if (!isset($_SERVER['PHP_AUTH_USER'])) {
logger('API_login: ' . print_r($_SERVER,true), LOGGER_DEBUG);
header('WWW-Authenticate: Basic realm="Red"');
@@ -220,7 +233,7 @@ require_once('include/security.php');
'updated' => api_date(null),
'atom_updated' => datetime_convert('UTC','UTC','now',ATOM_TIME),
'language' => $user_info['language'],
- 'logo' => $a->get_baseurl()."/images/friendica-32.png",
+ 'logo' => $a->get_baseurl()."/images/rm-64.png",
);
return $arr;
@@ -349,7 +362,8 @@ require_once('include/security.php');
'location' => ($usr) ? $usr[0]['channel_location'] : '',
'profile_image_url' => $uinfo[0]['xchan_photo_l'],
'url' => $uinfo[0]['xchan_url'],
- 'contact_url' => $a->get_baseurl()."/connections/".$uinfo[0]['abook_id'],
+//FIXME
+ 'contact_url' => $a->get_baseurl() . "/connections/".$uinfo[0]['abook_id'],
'protected' => false,
'friends_count' => intval($countfriends),
'created_at' => api_date($uinfo[0]['abook_created']),
@@ -515,6 +529,40 @@ require_once('include/security.php');
json_return_and_die(identity_basic_export(api_user()));
}
api_register_func('api/export/basic','api_export_basic', true);
+ api_register_func('api/red/channel/export/basic','api_export_basic', true);
+
+
+ function api_channel_stream(&$a, $type) {
+ if(api_user() === false) {
+ logger('api_channel_stream: no user');
+ return false;
+ }
+
+ if($_SERVER['REQUEST_METHOD'] == 'POST') {
+ json_return_and_die(post_activity_item($_REQUEST));
+ }
+ else {
+ // fetch stream
+
+ }
+ }
+ api_register_func('api/red/channel/stream','api_channel_stream', true);
+
+
+ function api_albums(&$a,$type) {
+ json_return_and_die(photos_albums_list($a->get_channel(),$a->get_observer()));
+ }
+ api_register_func('api/red/albums','api_albums', true);
+
+ function api_photos(&$a,$type) {
+ $album = $_REQUEST['album'];
+ json_return_and_die(photos_list_photos($a->get_channel(),$a->get_observer()),$album);
+ }
+ api_register_func('api/red/photos','api_photos', true);
+
+
+
+
@@ -565,6 +613,15 @@ require_once('include/security.php');
return false;
}
+ logger('api_statuses_update: REQUEST ' . print_r($_REQUEST,true));
+ logger('api_statuses_update: FILES ' . print_r($_FILES,true));
+
+
+ // set this so that the item_post() function is quiet and doesn't redirect or emit json
+
+ $_REQUEST['api_source'] = true;
+
+
$user_info = api_get_user($a);
// convert $_POST array items to the form we use for web posts.
@@ -599,7 +656,7 @@ require_once('include/security.php');
if(ctype_digit($parent))
$_REQUEST['parent'] = $parent;
else
- $_REQUEST['parent_uri'] = $parent;
+ $_REQUEST['parent_mid'] = $parent;
if(requestdata('lat') && requestdata('long'))
$_REQUEST['coord'] = sprintf("%s %s",requestdata('lat'),requestdata('long'));
@@ -610,7 +667,9 @@ require_once('include/security.php');
$_REQUEST['type'] = 'net-comment';
else {
$_REQUEST['type'] = 'wall';
+
if(x($_FILES,'media')) {
+ $_FILES['userfile'] = $_FILES['media'];
// upload the image if we have one
$_REQUEST['silent']='1'; //tell wall_upload function to return img info instead of echo
require_once('mod/wall_upload.php');
@@ -620,10 +679,6 @@ require_once('include/security.php');
}
}
- // set this so that the item_post() function is quiet and doesn't redirect or emit json
-
- $_REQUEST['api_source'] = true;
-
// call out normal post function
require_once('mod/item.php');
@@ -643,7 +698,7 @@ require_once('include/security.php');
require_once('include/security.php');
$lastwall = q("SELECT * from item where 1
- and item_private != 0 and item_restrict = 0
+ and item_private = 0 and item_restrict = 0
and author_xchan = '%s'
and allow_cid = '' and allow_gid = '' and deny_cid = '' and deny_gid = ''
and verb = '%s'
@@ -677,14 +732,15 @@ require_once('include/security.php');
$in_reply_to_user_id = $user_info['id'];
$in_reply_to_screen_name = $user_info['screen_name'];
}
- }
+ }
+ unobscure($lastwall);
$status_info = array(
- 'text' => html2plain(bbcode($lastwall['body']), 0),
+ 'text' => html2plain(prepare_text($lastwall['body'],$lastwall['mimetype']), 0),
'truncated' => false,
'created_at' => api_date($lastwall['created']),
'in_reply_to_status_id' => $in_reply_to_status_id,
'source' => (($lastwall['app']) ? $lastwall['app'] : 'web'),
- 'id' => (($w) ? $w[0]['abook_id'] : $user_info['id']),
+ 'id' => ($lastwall['id']),
'in_reply_to_user_id' => $in_reply_to_user_id,
'in_reply_to_screen_name' => $in_reply_to_screen_name,
'geo' => '',
@@ -695,6 +751,7 @@ require_once('include/security.php');
);
$status_info['user'] = $user_info;
}
+
return api_apply_template("status", $type, array('$status' => $status_info));
}
@@ -750,8 +807,9 @@ require_once('include/security.php');
$in_reply_to_screen_name = $user_info['screen_name'];
}
}
+ unobscure($lastwall);
$user_info['status'] = array(
- 'text' => html2plain(bbcode($lastwall['body']), 0),
+ 'text' => html2plain(prepare_text($lastwall['body'],$lastwall['mimetype']), 0),
'truncated' => false,
'created_at' => api_date($lastwall['created']),
'in_reply_to_status_id' => $in_reply_to_status_id,
@@ -892,7 +950,7 @@ require_once('include/security.php');
and item_private = 0
and uid in ( " . stream_perms_api_uids() . " )
$sql_extra
- AND id > %d group by uri
+ AND id > %d group by mid
order by received desc LIMIT %d, %d ",
intval($since_id),
intval($start),
@@ -991,7 +1049,7 @@ require_once('include/security.php');
if(perm_is_allowed($r[0]['uid'],$observer['xchan_hash'],'view_stream')) {
if ($r[0]['body'] != "") {
- $_REQUEST['body'] = html_entity_decode("&#x2672; ", ENT_QUOTES, 'UTF-8')."[url=".$r[0]['reply_url']."]".$r[0]['reply_author']."[/url] \n".$r[0]['body'];
+ $_REQUEST['body'] = html_entity_decode("&#x2672; ", ENT_QUOTES, 'UTF-8')."[zrl=".$r[0]['reply_url']."]".$r[0]['reply_author']."[/zrl] \n".$r[0]['body'];
$_REQUEST['profile_uid'] = api_user();
$_REQUEST['type'] = 'wall';
$_REQUEST['api_source'] = true;
@@ -1023,12 +1081,46 @@ require_once('include/security.php');
// params
$id = intval(argv(3));
+ if($id) {
+ // first prove that we own the item
- logger('API: api_statuses_destroy: '.$id);
+ $r = q("select * from item where id = %d and uid = %d limit 1",
+ intval($id),
+ intval($user_info['uid'])
+ );
+ if(! $r)
+ return false;
+ }
+ else {
+ if($_REQUEST['namespace'] && $_REQUEST['remote_id']) {
+ $r = q("select * from item_id where service = '%s' and sid = '%s' and uid = %d limit 1",
+ dbesc($_REQUEST['namespace']),
+ dbesc($_REQUEST['remote_id']),
+ intval($user_info['uid'])
+ );
+ if(! $r)
+ return false;
+ $id = $r[0]['iid'];
+ }
+ if($_REQUEST['namespace'] && $_REQUEST['comment_id']) {
+ $r = q("select * from item_id left join item on item.id = item_id.iid where service = '%s' and sid = '%s' and uid = %d and item.id != item.parent limit 1",
+ dbesc($_REQUEST['namespace']),
+ dbesc($_REQUEST['comment_id']),
+ intval($user_info['uid'])
+ );
+ if(! $r)
+ return false;
+ $id = $r[0]['iid'];
+ }
+ }
+ if(! $id)
+ return false;
+ logger('API: api_statuses_destroy: '.$id);
require_once('include/items.php');
drop_item($id, false);
+
if ($type == 'xml')
$ok = "true";
else
@@ -1049,7 +1141,7 @@ require_once('include/security.php');
if (api_user()===false) return false;
$user_info = api_get_user($a);
- // get last newtork messages
+ // get last network messages
// params
@@ -1316,19 +1408,19 @@ require_once('include/security.php');
'recipient_screen_name' => $recipient['screen_name'],
'recipient' => $recipient,
);
-
+ unobscure($item);
//don't send title to regular StatusNET requests to avoid confusing these apps
if (x($_GET, 'getText')) {
$ret['title'] = $item['title'] ;
if ($_GET["getText"] == "html") {
- $ret['text'] = bbcode($item['body']);
+ $ret['text'] = prepare_text($item['body'],$item['mimetype']);
}
elseif ($_GET["getText"] == "plain") {
- $ret['text'] = html2plain(bbcode($item['body']), 0);
+ $ret['text'] = html2plain(prepare_text($item['body'],$item['mimetype']), 0);
}
}
else {
- $ret['text'] = $item['title']."\n".html2plain(bbcode($item['body']), 0);
+ $ret['text'] = $item['title']."\n".html2plain(prepare_text($item['body'],$item['mimetype']), 0);
}
if (isset($_GET["getUserObjects"]) && $_GET["getUserObjects"] == "false") {
unset($ret['sender']);
@@ -1372,9 +1464,9 @@ require_once('include/security.php');
$in_reply_to_user_id = 0;
$in_reply_to_status_id = 0;
}
-
+ unobscure($item);
// Workaround for ostatus messages where the title is identically to the body
- $statusbody = trim(html2plain(bbcode($item['body']), 0));
+ $statusbody = trim(html2plain(prepare_text($item['body'],$item['mimetype']), 0));
$statustitle = trim($item['title']);
if (($statustitle != '') and (strpos($statusbody, $statustitle) !== false))
@@ -1395,7 +1487,7 @@ require_once('include/security.php');
'geo' => '',
'favorited' => (($item['item_flags'] & ITEM_STARRED) ? true : false),
'user' => $status_user ,
- 'statusnet_html' => trim(bbcode($item['body'])),
+ 'statusnet_html' => trim(prepare_text($item['body']),$item['mimetype']),
'statusnet_conversation_id' => $item['parent'],
);
@@ -1404,7 +1496,7 @@ require_once('include/security.php');
$status2 = array(
'updated' => api_date($item['edited']),
'published' => api_date($item['created']),
- 'message_id' => $item['uri'],
+ 'message_id' => $item['mid'],
'url' => $item['plink'],
'coordinates' => $item['coord'],
'place' => $item['location'],
@@ -1452,7 +1544,7 @@ require_once('include/security.php');
return api_apply_template('test', $type, array('$ok' => $ok));
}
- api_register_func('api/help/test','api_help_test',true);
+ api_register_func('api/help/test','api_help_test',false);
/**
* https://dev.twitter.com/docs/api/1/get/statuses/friends
@@ -1483,17 +1575,17 @@ require_once('include/security.php');
// For Red, the closest thing we can do to figure out if you're friends is if both of you are sending each other your streams.
// This won't work if either of you send your stream to everybody on the network
if($qtype == 'friends')
- $sql_extra = sprintf(" AND ( their_perms & %d ) and ( my_perms & %d ) ", intval(PERMS_W_STREAM), intval(PERMS_W_STREAM));
+ $sql_extra = sprintf(" AND ( abook_their_perms & %d ) and ( abook_my_perms & %d ) ", intval(PERMS_W_STREAM), intval(PERMS_W_STREAM));
if($qtype == 'followers')
- $sql_extra = sprintf(" AND ( my_perms & %d ) and not ( their_perms & %d ) ", intval(PERMS_W_STREAM), intval(PERMS_W_STREAM));
+ $sql_extra = sprintf(" AND ( abook_my_perms & %d ) and not ( abook_their_perms & %d ) ", intval(PERMS_W_STREAM), intval(PERMS_W_STREAM));
- $r = q("SELECT id FROM abook where abook_flags = 0 and abook_channel = %d $sql_extra",
+ $r = q("SELECT abook_id FROM abook where abook_flags = 0 and abook_channel = %d $sql_extra",
intval(api_user())
);
$ret = array();
foreach($r as $cid){
- $ret[] = api_get_user($a, $cid['id']);
+ $ret[] = api_get_user($a, $cid['abook_id']);
}
@@ -1524,7 +1616,7 @@ require_once('include/security.php');
$name = get_config('system','sitename');
$server = $a->get_hostname();
- $logo = $a->get_baseurl() . '/images/fred-64.png';
+ $logo = $a->get_baseurl() . '/images/rm-64.png';
$email = get_config('system','admin_email');
$closed = ((get_config('system','register_policy') == REGISTER_CLOSED) ? 'true' : 'false');
$private = ((get_config('system','block_public')) ? 'true' : 'false');
@@ -1541,8 +1633,8 @@ require_once('include/security.php');
'private' => $private, 'textlimit' => $textlimit, 'sslserver' => $sslserver, 'ssl' => $ssl,
'shorturllength' => '30',
'friendica' => array(
- 'FRIENDICA_PLATFORM' => FRIENDICA_PLATFORM,
- 'FRIENDICA_VERSION' => FRIENDICA_VERSION,
+ 'RED_PLATFORM' => RED_PLATFORM,
+ 'RED_VERSION' => RED_VERSION,
'ZOT_REVISION' => ZOT_REVISION,
'DB_UPDATE_VERSION' => DB_UPDATE_VERSION
)
@@ -1577,12 +1669,12 @@ require_once('include/security.php');
if($type === 'xml') {
header("Content-type: application/xml");
- echo '<?xml version="1.0" encoding="UTF-8"?>' . "\r\n" . '<version>' . FRIENDICA_VERSION . '</version>' . "\r\n";
+ echo '<?xml version="1.0" encoding="UTF-8"?>' . "\r\n" . '<version>' . RED_VERSION . '</version>' . "\r\n";
killme();
}
elseif($type === 'json') {
header("Content-type: application/json");
- echo '"' . FRIENDICA_VERSION . '"';
+ echo '"' . RED_VERSION . '"';
killme();
}
}
@@ -1599,11 +1691,11 @@ require_once('include/security.php');
// This won't work if either of you send your stream to everybody on the network
if($qtype == 'friends')
- $sql_extra = sprintf(" AND ( their_perms & %d ) and ( my_perms & %d ) ", intval(PERMS_W_STREAM), intval(PERMS_W_STREAM));
+ $sql_extra = sprintf(" AND ( abook_their_perms & %d ) and ( abook_my_perms & %d ) ", intval(PERMS_W_STREAM), intval(PERMS_W_STREAM));
if($qtype == 'followers')
- $sql_extra = sprintf(" AND ( my_perms & %d ) and not ( their_perms & %d ) ", intval(PERMS_W_STREAM), intval(PERMS_W_STREAM));
+ $sql_extra = sprintf(" AND ( abook_my_perms & %d ) and not ( abook_their_perms & %d ) ", intval(PERMS_W_STREAM), intval(PERMS_W_STREAM));
- $r = q("SELECT id FROM abook where abook_flags = 0 and abook_channel = %d $sql_extra",
+ $r = q("SELECT abook_id FROM abook where abook_flags = 0 and abook_channel = %d $sql_extra",
intval(api_user())
);
@@ -1612,14 +1704,14 @@ require_once('include/security.php');
header("Content-type: application/xml");
echo '<?xml version="1.0" encoding="UTF-8"?>' . "\r\n" . '<ids>' . "\r\n";
foreach($r as $rr)
- echo '<id>' . $rr['id'] . '</id>' . "\r\n";
+ echo '<id>' . $rr['abook_id'] . '</id>' . "\r\n";
echo '</ids>' . "\r\n";
killme();
}
elseif($type === 'json') {
$ret = array();
header("Content-type: application/json");
- foreach($r as $rr) $ret[] = $rr['id'];
+ foreach($r as $rr) $ret[] = $rr['abook_id'];
echo json_encode($ret);
killme();
}
@@ -1653,10 +1745,10 @@ require_once('include/security.php');
$replyto = '';
$sub = '';
if (x($_REQUEST,'replyto')) {
- $r = q('SELECT `parent_uri`, `title` FROM `mail` WHERE `uid`=%d AND `id`=%d',
+ $r = q('SELECT `parent_mid`, `title` FROM `mail` WHERE `uid`=%d AND `id`=%d',
intval(api_user()),
intval($_REQUEST['replyto']));
- $replyto = $r[0]['parent_uri'];
+ $replyto = $r[0]['parent_mid'];
$sub = $r[0]['title'];
}
else {
@@ -1708,7 +1800,7 @@ require_once('include/security.php');
$sql_extra = "`from-url`='".dbesc( $profile_url )."'";
}
elseif ($box=="conversation") {
- $sql_extra = "`parent_uri`='".dbesc( $_GET["uri"] ) ."'";
+ $sql_extra = "`parent_mid`='".dbesc( $_GET["uri"] ) ."'";
}
elseif ($box=="all") {
$sql_extra = "true";
@@ -1770,9 +1862,13 @@ require_once('include/security.php');
function api_oauth_request_token(&$a, $type){
try{
$oauth = new FKOAuth1();
- $r = $oauth->fetch_request_token(OAuthRequest::from_request());
+ $req = OAuthRequest::from_request();
+logger('Req: ' . var_export($req,true));
+ $r = $oauth->fetch_request_token($req);
}catch(Exception $e){
- echo "error=". OAuthUtil::urlencode_rfc3986($e->getMessage()); killme();
+ logger('oauth_exception: ' . print_r($e->getMessage(),true));
+ echo "error=". OAuthUtil::urlencode_rfc3986($e->getMessage());
+ killme();
}
echo $r;
killme();
@@ -1780,7 +1876,8 @@ require_once('include/security.php');
function api_oauth_access_token(&$a, $type){
try{
$oauth = new FKOAuth1();
- $r = $oauth->fetch_access_token(OAuthRequest::from_request());
+ $req = OAuthRequest::from_request();
+ $r = $oauth->fetch_access_token($req);
}catch(Exception $e){
echo "error=". OAuthUtil::urlencode_rfc3986($e->getMessage()); killme();
}
diff --git a/include/attach.php b/include/attach.php
index 64d6a1689..dbc489a2d 100644
--- a/include/attach.php
+++ b/include/attach.php
@@ -1,4 +1,4 @@
-<?php
+<?php /** @file */
/*
* File/attach API with the potential for revision control.
@@ -10,6 +10,7 @@
*/
require_once('include/permissions.php');
+require_once('include/security.php');
function z_mime_content_type($filename) {
@@ -78,17 +79,12 @@ function z_mime_content_type($filename) {
if (array_key_exists($ext, $mime_types)) {
return $mime_types[$ext];
}
+
+
}
-// can't use this because we're just passing a name, e.g. not a file that can be opened
-// elseif (function_exists('finfo_open')) {
-// $finfo = @finfo_open(FILEINFO_MIME);
-// $mimetype = @finfo_file($finfo, $filename);
-// @finfo_close($finfo);
-// return $mimetype;
-// }
- else {
- return 'application/octet-stream';
- }
+
+ return 'application/octet-stream';
+
}
@@ -241,7 +237,7 @@ function attach_by_hash_nodata($hash,$rev = 0) {
// Now we'll see if we can access the attachment
- $r = q("select id, aid, uid, hash, filename, filetype, filesize, revision, folder, flags, created, edited, allow_cid, allow_gid, deny_cid, deny_gid from attach where uid = %d and hash = '%s' $sql_extra limit 1",
+ $r = q("select id, aid, uid, hash, creator, filename, filetype, filesize, revision, folder, flags, created, edited, allow_cid, allow_gid, deny_cid, deny_gid from attach where uid = %d and hash = '%s' $sql_extra limit 1",
intval($r[0]['uid']),
dbesc($hash)
);
@@ -333,12 +329,13 @@ function attach_store($channel,$observer_hash,$options = '',$arr = null) {
}
$limit = service_class_fetch($channel_id,'attach_upload_limit');
+
if($limit !== false) {
- $r = q("select sum(filesize) as total from attach where uid = %d ",
- intval($channel_id)
+ $r = q("select sum(filesize) as total from attach where aid = %d ",
+ intval($channel['channel_account_id'])
);
if(($r) && (($r[0]['total'] + $filesize) > ($limit - $existing_size))) {
- $ret['message'] = upgrade_message(true);
+ $ret['message'] = upgrade_message(true).sprintf(t("You have reached your limit of %1$.0f Mbytes attachment storage."),$limit / 1024000);
@unlink($src);
return $ret;
}
@@ -362,11 +359,12 @@ function attach_store($channel,$observer_hash,$options = '',$arr = null) {
);
}
elseif($options === 'revise') {
- $r = q("insert into attach ( aid, uid, hash, filename, filetype, filesize, revision, data, created, edited, allow_cid, allow_gid, deny_cid, deny_gid )
- VALUES ( %d, %d, '%s', '%s', '%s', %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s' ) ",
+ $r = q("insert into attach ( aid, uid, hash, creator, filename, filetype, filesize, revision, data, created, edited, allow_cid, allow_gid, deny_cid, deny_gid )
+ VALUES ( %d, %d, '%s', '%s', '%s', '%s', %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s' ) ",
intval($x[0]['aid']),
intval($channel_id),
dbesc($x[0]['hash']),
+ dbesc(get_observer_hash()),
dbesc($filename),
dbesc($mimetype),
intval($filesize),
@@ -397,11 +395,12 @@ function attach_store($channel,$observer_hash,$options = '',$arr = null) {
}
else {
- $r = q("INSERT INTO attach ( aid, uid, hash, filename, filetype, filesize, revision, data, created, edited, allow_cid, allow_gid,deny_cid, deny_gid )
- VALUES ( %d, %d, '%s', '%s', '%s', %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s' ) ",
+ $r = q("INSERT INTO attach ( aid, uid, hash, creator, filename, filetype, filesize, revision, data, created, edited, allow_cid, allow_gid,deny_cid, deny_gid )
+ VALUES ( %d, %d, '%s', '%s', '%s', '%s', %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s' ) ",
intval($channel['channel_account_id']),
intval($channel_id),
dbesc($hash),
+ dbesc(get_observer_hash()),
dbesc($filename),
dbesc($mimetype),
intval($filesize),
@@ -426,7 +425,7 @@ function attach_store($channel,$observer_hash,$options = '',$arr = null) {
// Caution: This re-uses $sql_options set further above
- $r = q("select id, aid, uid, hash, filename, filetype, filesize, revision, folder, flags, created, edited, allow_cid, allow_gid, deny_cid, deny_gid from attach where uid = %d and hash = '%s' $sql_options limit 1",
+ $r = q("select id, aid, uid, hash, creator, filename, filetype, filesize, revision, folder, flags, created, edited, allow_cid, allow_gid, deny_cid, deny_gid from attach where uid = %d and hash = '%s' $sql_options limit 1",
intval($channel_id),
dbesc($hash)
);
@@ -439,4 +438,353 @@ function attach_store($channel,$observer_hash,$options = '',$arr = null) {
$ret['success'] = true;
$ret['data'] = $r[0];
return $ret;
+}
+
+
+/**
+ * Read a virtual directory and return contents, checking permissions of all parent components.
+ * @function z_readdir
+ * @param integer $channel_id
+ * @param string $observer_hash
+ * @param string $pathname
+ * @param string $parent_hash (optional)
+ *
+ * @returns array $ret
+ * $ret['success'] = boolean true or false
+ * $ret['message'] = error message if success is false
+ * $ret['data'] = array of attach DB entries without data component
+ */
+
+function z_readdir($channel_id,$observer_hash,$pathname, $parent_hash = '') {
+
+ $ret = array('success' => false);
+ if(! perm_is_allowed($r[0]['uid'],get_observer_hash(),'view_storage')) {
+ $ret['message'] = t('Permission denied.');
+ return $ret;
+ }
+
+
+ if(strpos($pathname,'/')) {
+ $paths = explode('/',$pathname);
+ if(count($paths) > 1) {
+ $curpath = array_shift($paths);
+
+ $r = q("select hash, id from attach where uid = %d and filename = '%s' and (flags & %d ) " . permissions_sql($channel_id) . " limit 1",
+ intval($channel_id),
+ dbesc($curpath),
+ intval(ATTACH_FLAG_DIR)
+ );
+ if(! $r) {
+ $ret['message'] = t('Path not available.');
+ return $ret;
+ }
+
+ return z_readdir($channel_id,$observer_hash,implode('/',$paths),$r[0]['hash']);
+ }
+ }
+ else
+ $paths = array($pathname);
+
+ $r = q("select id, aid, uid, hash, creator, filename, filetype, filesize, revision, folder, flags, created, edited, allow_cid, allow_gid, deny_cid, deny_gid from attach where id = %d and folder = '%s' and filename = '%s' and (flags & %d ) " . permissions_sql($channel_id),
+ intval($channel_id),
+ dbesc($parent_hash),
+ dbesc($paths[0]),
+ intval(ATTACH_FLAG_DIR)
+ );
+ if(! $r) {
+ $ret['message'] = t('Path not available.');
+ return $ret;
+ }
+ $ret['success'] = true;
+ $ret['data'] = $r;
+ return $ret;
+}
+
+
+/**
+ * @function attach_mkdir($channel,$observer_hash,$arr);
+ *
+ * Create directory
+ *
+ * @param $channel channel array of owner
+ * @param $observer_hash hash of current observer
+ * @param $arr parameter array to fulfil request
+ *
+ * Required:
+ * $arr['filename']
+ * $arr['folder'] // hash of parent directory, empty string for root directory
+ *
+ * Optional:
+ * $arr['hash'] // precumputed hash for this node
+ * $arr['allow_cid']
+ * $arr['allow_gid']
+ * $arr['deny_cid']
+ * $arr['deny_gid']
+ */
+
+function attach_mkdir($channel,$observer_hash,$arr = null) {
+
+ $ret = array('success' => false);
+ $channel_id = $channel['channel_id'];
+ $sql_options = '';
+
+ $basepath = 'store/' . $channel['channel_address'];
+
+ logger('attach_mkdir: basepath: ' . $basepath);
+
+ if(! is_dir($basepath))
+ mkdir($basepath,STORAGE_DEFAULT_PERMISSIONS,true);
+
+
+ if(! perm_is_allowed($channel_id, $observer_hash,'write_storage')) {
+ $ret['message'] = t('Permission denied.');
+ return $ret;
+ }
+
+ if(! $arr['filename']) {
+ $ret['message'] = t('Empty pathname');
+ return $ret;
+ }
+
+
+ $arr['hash'] = (($arr['hash']) ? $arr['hash'] : random_string());
+
+
+ // Check for duplicate name.
+ // Check both the filename and the hash as we will be making use of both.
+
+ $r = q("select hash from attach where ( filename = '%s' or hash = '%s' ) and folder = '%s' and uid = %d limit 1",
+ dbesc($arr['filename']),
+ dbesc($arr['hash']),
+ dbesc($arr['folder']),
+ intval($channel['channel_id'])
+ );
+ if($r) {
+ $ret['message'] = t('duplicate filename or path');
+ return $ret;
+ }
+
+ if($arr['folder']) {
+
+ // Walk the directory tree from parent back to root to make sure the parent is valid and name is unique and we
+ // have permission to see this path. This implies the root directory itself is public since we won't have permissions
+ // set on the psuedo-directory. We can however set permissions for anything and everything contained within it.
+
+ $lpath = '';
+ $lfile = $arr['folder'];
+ $sql_options = permissions_sql($channel['channel_id']);
+
+ do {
+
+ $r = q("select filename, hash, flags, folder from attach where uid = %d and hash = '%s' and ( flags & %d )
+ $sql_options limit 1",
+ intval($channel['channel_id']),
+ dbesc($lfile),
+ intval(ATTACH_FLAG_DIR)
+ );
+
+ if(! $r) {
+ logger('attach_mkdir: hash ' . $lfile . ' not found in ' . $lpath);
+ $ret['message'] = t('Path not found.');
+ return $ret;
+ }
+ if($lfile)
+ $lpath = $r[0]['hash'] . '/' . $lpath;
+ $lfile = $r[0]['folder'];
+ } while ( ($r[0]['folder']) && ($r[0]['flags'] & ATTACH_FLAG_DIR)) ;
+ $path = $basepath . '/' . $lpath;
+
+ }
+ else
+ $path = $basepath . '/';
+
+ $path .= $arr['hash'];
+
+ $created = datetime_convert();
+
+ $r = q("INSERT INTO attach ( aid, uid, hash, creator, filename, filetype, filesize, revision, folder, flags, data, created, edited, allow_cid, allow_gid, deny_cid, deny_gid )
+ VALUES ( %d, %d, '%s', '%s', '%s', '%s', %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s' ) ",
+ intval($channel['channel_account_id']),
+ intval($channel_id),
+ dbesc($arr['hash']),
+ dbesc(get_observer_hash()),
+ dbesc($arr['filename']),
+ dbesc('multipart/mixed'),
+ intval(0),
+ intval(0),
+ dbesc($arr['folder']),
+ intval(ATTACH_FLAG_DIR|ATTACH_FLAG_OS),
+ dbesc($path),
+ dbesc($created),
+ dbesc($created),
+ dbesc(($arr && array_key_exists('allow_cid',$arr)) ? $arr['allow_cid'] : $channel['channel_allow_cid']),
+ dbesc(($arr && array_key_exists('allow_gid',$arr)) ? $arr['allow_gid'] : $channel['channel_allow_gid']),
+ dbesc(($arr && array_key_exists('deny_cid',$arr)) ? $arr['deny_cid'] : $channel['channel_deny_cid']),
+ dbesc(($arr && array_key_exists('deny_gid',$arr)) ? $arr['deny_gid'] : $channel['channel_deny_gid'])
+ );
+
+ if($r) {
+ if(mkdir($path,STORAGE_DEFAULT_PERMISSIONS,true)) {
+ $ret['success'] = true;
+ $ret['data'] = $arr;
+ }
+ else {
+ logger('attach_mkdir: ' . mkdir . ' ' . $path . 'failed.');
+ $ret['message'] = t('mkdir failed.');
+ }
+ }
+ else
+ $ret['message'] = t('database storage failed.');
+
+ return $ret;
+
+}
+
+
+
+function attach_change_permissions($channel_id,$resource,$allow_cid,$allow_gid,$deny_cid,$deny_gid,$recurse = false) {
+
+ $r = q("select hash, flags from attach where hash = '%s' and uid = %d limit 1",
+ dbesc($resource),
+ intval($channel_id)
+ );
+
+ if(! $r)
+ return;
+
+ if($r[0]['flags'] & ATTACH_FLAG_DIR) {
+ if($recurse) {
+ $r = q("select hash, flags from attach where folder = '%s' and uid = %d",
+ dbesc($resource),
+ intval($channel_id)
+ );
+ if($r) {
+ foreach($r as $rr) {
+ attach_change_permissions($channel_id,$resource,$allow_cid,$allow_gid,$deny_cid,$deny_gid,$recurse);
+ }
+ }
+ }
+ }
+
+ $x = q("update attach set allow_cid = '%s', allow_gid = '%s', deny_cid = '%s', deny_gid = '%s' where hash = '%s' and uid = %d limit 1",
+ dbesc($allow_cid),
+ dbesc($allow_gid),
+ dbesc($deny_cid),
+ dbesc($deny_gid),
+ dbesc($resource),
+ intval($channel_id)
+ );
+
+ return;
+}
+
+
+
+function attach_delete($channel_id,$resource) {
+
+
+ $c = q("select channel_address from channel where channel_id = %d limit 1",
+ intval($channel_id)
+ );
+
+ $channel_address = (($c) ? $c[0]['channel_address'] : 'notfound');
+
+ $r = q("select hash, flags from attach where hash = '%s' and uid = %d limit 1",
+ dbesc($resource),
+ intval($channel_id)
+ );
+
+
+ if(! $r)
+ return;
+
+ if($r[0]['flags'] & ATTACH_FLAG_DIR) {
+ $x = q("select hash, flags from attach where folder = '%s' and uid = %d",
+ dbesc($resource),
+ intval($channel_id)
+ );
+ if($x) {
+ foreach($x as $xx) {
+ attach_delete($channel_id,$xx['hash']);
+ }
+ }
+ }
+ if($r[0]['flags'] & ATTACH_FLAG_OS) {
+ $y = q("select data from attach where hash = '%s' and uid = %d limit 1",
+ dbesc($resource),
+ intval($channel_id)
+ );
+
+ if($y) {
+ $f = 'store/' . $channel_address . '/' . $y[0]['data'];
+ if(is_dir($f))
+ @rmdir($f);
+ elseif(file_exists($f))
+ unlink($f);
+ }
+ }
+
+ $z = q("delete from attach where hash = '%s' and uid = %d limit 1",
+ dbesc($resource),
+ intval($channel_id)
+ );
+
+ return;
+}
+
+
+
+function get_cloudpath($arr) {
+
+ $basepath = 'cloud/';
+ if($arr['uid']) {
+ $r = q("select channel_address from channel where channel_id = %d limit 1",
+ intval($arr['uid'])
+ );
+ if($r)
+ $basepath .= $r[0]['channel_address'] . '/';
+ }
+
+
+ $path = $basepath;
+
+ if($arr['folder']) {
+
+ $lpath = '';
+ $lfile = $arr['folder'];
+
+ do {
+ $r = q("select filename, hash, flags, folder from attach where uid = %d and hash = '%s' and ( flags & %d )
+ limit 1",
+ intval($arr['uid']),
+ dbesc($lfile),
+ intval(ATTACH_FLAG_DIR)
+ );
+
+ if(! $r)
+ break;
+
+ if($lfile)
+ $lpath = $r[0]['filename'] . '/' . $lpath;
+ $lfile = $r[0]['folder'];
+
+ } while ( ($r[0]['folder']) && ($r[0]['flags'] & ATTACH_FLAG_DIR)) ;
+
+ $path .= $lpath;
+
+ }
+
+ $path .= $arr['filename'];
+ return $path;
+
+}
+
+
+
+
+function pipe_streams($in, $out) {
+ $size = 0;
+ while (!feof($in))
+ $size += fwrite($out,fread($in,8192));
+ return $size;
} \ No newline at end of file
diff --git a/include/auth.php b/include/auth.php
index 14751f5a2..a92f998bf 100644
--- a/include/auth.php
+++ b/include/auth.php
@@ -1,4 +1,4 @@
-<?php
+<?php /** @file */
require_once('include/security.php');
@@ -14,13 +14,16 @@ function nuke_session() {
unset($_SESSION['administrator']);
unset($_SESSION['cid']);
unset($_SESSION['theme']);
- unset($_SESSION['mobile-theme']);
+ unset($_SESSION['mobile_theme']);
+ unset($_SESSION['show_mobile']);
unset($_SESSION['page_flags']);
unset($_SESSION['submanage']);
unset($_SESSION['my_url']);
unset($_SESSION['my_address']);
unset($_SESSION['addr']);
unset($_SESSION['return_url']);
+ unset($_SESSION['remote_service_class']);
+ unset($_SESSION['remote_hub']);
}
/**
@@ -31,6 +34,7 @@ function nuke_session() {
*/
function account_verify_password($email,$pass) {
+
$r = q("select * from account where account_email = '%s'",
dbesc($email)
);
@@ -43,7 +47,13 @@ function account_verify_password($email,$pass) {
return $record;
}
}
- logger('password failed for ' . $email);
+ $error = 'password failed for ' . $email;
+ logger($error);
+ // Also log failed logins to a separate auth log to reduce overhead for server side intrusion prevention
+ $authlog = get_config('system', 'authlog');
+ if ($authlog)
+ @file_put_contents($authlog, datetime_convert() . ':' . session_id() . ' ' . $error . "\n", FILE_APPEND);
+
return null;
}
@@ -60,13 +70,29 @@ if((isset($_SESSION)) && (x($_SESSION,'authenticated')) && ((! (x($_POST,'auth-p
if(((x($_POST,'auth-params')) && ($_POST['auth-params'] === 'logout')) || ($a->module === 'logout')) {
// process logout request
- call_hooks("logging_out");
+ $args = array('channel_id' => local_user());
+ call_hooks('logging_out', $args);
nuke_session();
info( t('Logged out.') . EOL);
goaway(z_root());
}
if(x($_SESSION,'visitor_id') && (! x($_SESSION,'uid'))) {
+ // if our authenticated guest is allowed to take control of the admin channel, make it so.
+ $admins = get_config('system','remote_admin');
+ if($admins && is_array($admins) && in_array($_SESSION['visitor_id'],$admins)) {
+ $x = q("select * from account where account_email = '%s' and account_email != '' and ( account_flags & %d ) limit 1",
+ dbesc(get_config('system','admin_email')),
+ intval(ACCOUNT_ROLE_ADMIN)
+ );
+ if($x) {
+ new_cookie(60*60*24); // one day
+ $_SESSION['last_login_date'] = datetime_convert();
+ unset($_SESSION['visitor_id']); // no longer a visitor
+ authenticate_success($x[0], true, true);
+ }
+ }
+
$r = q("select * from hubloc left join xchan on xchan_hash = hubloc_hash where hubloc_hash = '%s' limit 1",
dbesc($_SESSION['visitor_id'])
);
@@ -167,7 +193,13 @@ else {
}
if((! $record) || (! count($record))) {
- logger('authenticate: failed login attempt: ' . notags(trim($_POST['username'])) . ' from IP ' . $_SERVER['REMOTE_ADDR']);
+ $error = 'authenticate: failed login attempt: ' . notags(trim($_POST['username'])) . ' from IP ' . $_SERVER['REMOTE_ADDR'];
+ logger($error);
+ // Also log failed logins to a separate auth log to reduce overhead for server side intrusion prevention
+ $authlog = get_config('system', 'authlog');
+ if ($authlog)
+ @file_put_contents($authlog, datetime_convert() . ':' . session_id() . ' ' . $error . "\n", FILE_APPEND);
+
notice( t('Login failed.') . EOL );
goaway(z_root());
}
@@ -198,13 +230,3 @@ else {
authenticate_success($record, true, true);
}
}
-
-
-function new_cookie($time) {
- $old_sid = session_id();
- session_set_cookie_params("$time");
- session_regenerate_id(false);
-
- q("UPDATE session SET sid = '%s' WHERE sid = '%s'", dbesc(session_id()), dbesc($old_sid));
-}
-
diff --git a/include/bb2diaspora.php b/include/bb2diaspora.php
index ee070b4fe..8d3089a29 100644
--- a/include/bb2diaspora.php
+++ b/include/bb2diaspora.php
@@ -1,4 +1,4 @@
-<?php
+<?php /** @file */
require_once("include/oembed.php");
require_once("include/event.php");
diff --git a/include/bbcode.php b/include/bbcode.php
index d43929ef5..9f07b71ce 100644
--- a/include/bbcode.php
+++ b/include/bbcode.php
@@ -1,8 +1,8 @@
-<?php
+<?php /** @file */
require_once("include/oembed.php");
require_once('include/event.php');
-
+require_once('include/zot.php');
function tryoembed($match) {
@@ -91,7 +91,7 @@ function bb_replace_images($body, $images) {
// We're depending on the property of 'foreach' (specified on the PHP website) that
// it loops over the array starting from the first element and going sequentially
// to the last element
- $newbody = str_replace('[$#saved_image' . $cnt . '#$]', '<img src="' . $image .'" alt="' . t('Image/photo') . '" />', $newbody);
+ $newbody = str_replace('[$#saved_image' . $cnt . '#$]', '<img class="zrl" src="' . $image .'" alt="' . t('Image/photo') . '" />', $newbody);
$cnt++;
}
@@ -100,12 +100,136 @@ function bb_replace_images($body, $images) {
+function bb_parse_crypt($match) {
+
+ $attributes = $match[1];
+
+ $algorithm = "";
+
+ preg_match("/alg='(.*?)'/ism", $attributes, $matches);
+ if ($matches[1] != "")
+ $algorithm = $matches[1];
+
+ preg_match("/alg=\&quot\;(.*?)\&quot\;/ism", $attributes, $matches);
+ if ($matches[1] != "")
+ $algorithm = $matches[1];
+
+ $hint = "";
+
+
+ preg_match("/hint='(.*?)'/ism", $attributes, $matches);
+ if ($matches[1] != "")
+ $hint = $matches[1];
+ preg_match("/hint=\&quot\;(.*?)\&quot\;/ism", $attributes, $matches);
+ if ($matches[1] != "")
+ $hint = $matches[1];
+
+ $x = random_string();
+
+ $Text = '<br/><div id="' . $x . '"><img src="' . z_root() . '/images/lock_icon.gif" onclick="red_decrypt(\'' . $algorithm . '\',\'' . $hint . '\',\'' . $match[2] . '\',\'#' . $x . '\');" alt="' . t('Encrypted content') . '" title="' . t('Encrypted content') . '" /></div><br />';
+
+ return $Text;
+
+}
+
+function bb_qr($match) {
+ return '<img class="zrl" src="' . z_root() . '/photo/qr?f=&qr=' . urlencode($match[1]) . '" alt="' . t('QR code') . '" title="' . urlencode($match[1]) . '" />';
+}
+
+
+function bb_ShareAttributes($match) {
+
+ $attributes = $match[1];
+
+ $author = "";
+ preg_match("/author='(.*?)'/ism", $attributes, $matches);
+ if ($matches[1] != "")
+ $author = urldecode($matches[1]);
+
+ $link = "";
+ preg_match("/link='(.*?)'/ism", $attributes, $matches);
+ if ($matches[1] != "")
+ $link = $matches[1];
+
+ $avatar = "";
+ preg_match("/avatar='(.*?)'/ism", $attributes, $matches);
+ if ($matches[1] != "")
+ $avatar = $matches[1];
+
+ $profile = "";
+ preg_match("/profile='(.*?)'/ism", $attributes, $matches);
+ if ($matches[1] != "")
+ $profile = $matches[1];
+
+ $posted = "";
+ preg_match("/posted='(.*?)'/ism", $attributes, $matches);
+ if ($matches[1] != "")
+ $posted = $matches[1];
+
+ // FIXME - this should really be a wall-item-ago so it will get updated on the client
+ $reldate = (($posted) ? relative_date($posted) : '');
+
+ $headline = '<div class="shared_container"> <div class="shared_header">';
+
+ if ($avatar != "")
+ $headline .= '<img src="' . $avatar . '" alt="' . $author . '" height="32" width="32" />';
+
+ // Bob Smith wrote the following post 2 hours ago
+
+ $fmt = sprintf( t('%1$s wrote the following %2$s %3$s'),
+ '<a href="' . zid($profile) . '" >' . $author . '</a>',
+ '<a href="' . zid($link) . '" >' . t('post') . '</a>',
+ $reldate
+ );
+
+ $headline .= '<span>' . $fmt . '</span></div>';
+
+ $text = $headline . '<div class="reshared-content">' . trim($match[2]) . '</div></div>';
+
+ return($text);
+}
+
+function bb_ShareAttributesSimple($match) {
+
+ $attributes = $match[1];
+
+ $author = "";
+ preg_match("/author='(.*?)'/ism", $attributes, $matches);
+ if ($matches[1] != "")
+ $author = html_entity_decode($matches[1],ENT_QUOTES,'UTF-8');
+
+ preg_match('/author="(.*?)"/ism', $attributes, $matches);
+ if ($matches[1] != "")
+ $author = $matches[1];
+
+ $profile = "";
+ preg_match("/profile='(.*?)'/ism", $attributes, $matches);
+ if ($matches[1] != "")
+ $profile = $matches[1];
+
+ preg_match('/profile="(.*?)"/ism', $attributes, $matches);
+ if ($matches[1] != "")
+ $profile = $matches[1];
+
+ $text = "<br />".html_entity_decode("&#x2672; ", ENT_QUOTES, 'UTF-8').' <a href="'.$profile.'">'.$author."</a>: div class=\"reshared-content\">" .$match[2]."</div>";
+
+ return($text);
+}
+
+function rpost_callback($match) {
+ if ($match[2]) {
+ return str_replace($match[0],get_rpost_path(get_app()->get_observer()) . '&title=' . urlencode($match[2]) . '&body=' . urlencode($match[3]),$match[0]);
+ } else {
+ return str_replace($match[0],get_rpost_path(get_app()->get_observer()) . '&body=' . urlencode($match[3]),$match[0]);
+ }
+}
+
+
// BBcode 2 HTML was written by WAY2WEB.net
- // extended to work with Mistpark/Friendica - Mike Macgirvin
+ // extended to work with Mistpark/Friendica/Red - Mike Macgirvin
function bbcode($Text,$preserve_nl = false, $tryoembed = true) {
-
$a = get_app();
// Extract the private images which use data url's since preg has issues with
@@ -122,10 +246,15 @@ function bbcode($Text,$preserve_nl = false, $tryoembed = true) {
$Text = preg_replace("/(\s*)\[\/(\w*)\]/ism", '[/$2]$1', $Text);
// Hide all [noparse] contained bbtags by spacefying them
-
- $Text = preg_replace_callback("/\[noparse\](.*?)\[\/noparse\]/ism", 'bb_spacefy',$Text);
- $Text = preg_replace_callback("/\[nobb\](.*?)\[\/nobb\]/ism", 'bb_spacefy',$Text);
- $Text = preg_replace_callback("/\[pre\](.*?)\[\/pre\]/ism", 'bb_spacefy',$Text);
+ if (strpos($Text,'[noparse]') !== false) {
+ $Text = preg_replace_callback("/\[noparse\](.*?)\[\/noparse\]/ism", 'bb_spacefy',$Text);
+ }
+ if (strpos($Text,'[nobb]') !== false) {
+ $Text = preg_replace_callback("/\[nobb\](.*?)\[\/nobb\]/ism", 'bb_spacefy',$Text);
+ }
+ if (strpos($Text,'[pre]') !== false) {
+ $Text = preg_replace_callback("/\[pre\](.*?)\[\/pre\]/ism", 'bb_spacefy',$Text);
+ }
@@ -135,16 +264,30 @@ function bbcode($Text,$preserve_nl = false, $tryoembed = true) {
$ev = bbtoevent($Text);
+ // process [observer] tags before we do anything else because we might
+ // be stripping away stuff that then doesn't need to be worked on anymore
+ $observer = $a->get_observer();
+ if ((strpos($Text,'[/observer]') !== false) || (strpos($Text,'[/rpost]') !== false)) {
+ if ($observer) {
+ $Text = preg_replace("/\[observer\=1\](.*?)\[\/observer\]/ism", '$1', $Text);
+ $Text = preg_replace("/\[observer\=0\].*?\[\/observer\]/ism", '', $Text);
+ $Text = preg_replace_callback("/\[rpost(=(.*?))?\](.*?)\[\/rpost\]/ism", 'rpost_callback', $Text);
+ } else {
+ $Text = preg_replace("/\[observer\=1\].*?\[\/observer\]/ism", '', $Text);
+ $Text = preg_replace("/\[observer\=0\](.*?)\[\/observer\]/ism", '$1', $Text);
+ $Text = preg_replace("/\[rpost(=.*?)?\](.*?)\[\/rpost\]/ism", '', $Text);
+ }
+ }
+
+ $Text = str_replace(array('[baseurl]','[sitename]'),array(z_root(),get_config('system','sitename')),$Text);
+
// Replace any html brackets with HTML Entities to prevent executing HTML or script
// Don't use strip_tags here because it breaks [url] search by replacing & with amp
$Text = str_replace("<", "&lt;", $Text);
$Text = str_replace(">", "&gt;", $Text);
- // This only matters when looking for tags - otherwise has no meaning
-
- $Text = str_replace(array('[share]','[/share]'), array('',''), $Text);
// Convert new line chars to html <br /> tags
@@ -160,75 +303,116 @@ function bbcode($Text,$preserve_nl = false, $tryoembed = true) {
$Text = str_replace(array("\n","\r"), array('',''),$Text);
+ $Text = str_replace(array("\t"," "),array("&nbsp;&nbsp;&nbsp;&nbsp;","&nbsp;&nbsp;"),$Text);
// Set up the parameters for a URL search string
$URLSearchString = "^\[\]";
// Set up the parameters for a MAIL search string
$MAILSearchString = $URLSearchString;
+ // replace [observer.baseurl]
+ if ($observer) {
+ $obsBaseURL = $observer['xchan_url'];
+ $obsBaseURL = preg_replace("/\/channel\/.*$/", '', $obsBaseURL);
+ $Text = str_replace('[observer.baseurl]', $obsBaseURL, $Text);
+ $Text = str_replace('[observer.url]',$observer['xchan_url'], $Text);
+ $Text = str_replace('[observer.name]',$observer['xchan_name'], $Text);
+ $Text = str_replace('[observer.address]',$observer['xchan_addr'], $Text);
+ $Text = str_replace('[observer.photo]','[zmg]'.$observer['xchan_photo_l'].'[/zmg]', $Text);
+ } else {
+ $Text = str_replace('[observer.baseurl]', '', $Text);
+ $Text = str_replace('[observer.url]','', $Text);
+ $Text = str_replace('[observer.name]','', $Text);
+ $Text = str_replace('[observer.address]','', $Text);
+ $Text = str_replace('[observer.photo]','', $Text);
+ }
// Perform URL Search
- $Text = preg_replace("/([^\]\=]|^)(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,]+)/ism", '$1<a href="$2" >$2</a>', $Text);
-
- if ($tryoembed)
- $Text = preg_replace_callback("/\[bookmark\=([^\]]*)\].*?\[\/bookmark\]/ism",'tryoembed',$Text);
+ $urlchars = '[a-zA-Z0-9\:\/\-\?\&\;\.\=\@\_\~\#\%\$\!\+\,]';
- $Text = preg_replace("/\[bookmark\=([^\]]*)\](.*?)\[\/bookmark\]/ism",'[url=$1]$2[/url]',$Text);
+ if (strpos($Text,'http') !== false) {
+ $Text = preg_replace("/([^\]\='".'"'."]|^)(https?\:\/\/$urlchars+)/ism", '$1<a href="$2" >$2</a>', $Text);
+ }
- if ($tryoembed)
- $Text = preg_replace_callback("/\[url\]([$URLSearchString]*)\[\/url\]/ism",'tryoembed',$Text);
+ if (strpos($Text,'[/qr]') !== false) {
+ $Text = preg_replace_callback("/\[qr\](.*?)\[\/qr\]/ism","bb_qr",$Text);
+ }
- $Text = preg_replace("/\[url\]([$URLSearchString]*)\[\/url\]/ism", '<a href="$1" >$1</a>', $Text);
- $Text = preg_replace("/\[url\=([$URLSearchString]*)\](.*?)\[\/url\]/ism", '<a href="$1" >$2</a>', $Text);
- //$Text = preg_replace("/\[url\=([$URLSearchString]*)\]([$URLSearchString]*)\[\/url\]/ism", '<a href="$1" target="_blank">$2</a>', $Text);
+ if (strpos($Text,'[/share]') !== false) {
+ $Text = preg_replace_callback("/\[share(.*?)\](.*?)\[\/share\]/ism","bb_ShareAttributes",$Text);
+ }
+ if($tryoembed) {
+ if (strpos($Text,'[/url]') !== false) {
+ $Text = preg_replace_callback("/\[url\]([$URLSearchString]*)\[\/url\]/ism",'tryoembed',$Text);
+ }
+ }
+ if (strpos($Text,'[/url]') !== false) {
+ $Text = preg_replace("/\[url\]([$URLSearchString]*)\[\/url\]/ism", '<a href="$1" >$1</a>', $Text);
+ $Text = preg_replace("/\[url\=([$URLSearchString]*)\](.*?)\[\/url\]/ism", '<a href="$1" >$2</a>', $Text);
+ }
+ if (strpos($Text,'[/zrl]') !== false) {
+ $Text = preg_replace("/\[zrl\]([$URLSearchString]*)\[\/zrl\]/ism", '<a class="zrl" href="$1" >$1</a>', $Text);
+ $Text = preg_replace("/\[zrl\=([$URLSearchString]*)\](.*?)\[\/zrl\]/ism", '<a class="zrl" href="$1" >$2</a>', $Text);
+ }
// Perform MAIL Search
- $Text = preg_replace("/\[mail\]([$MAILSearchString]*)\[\/mail\]/", '<a href="mailto:$1">$1</a>', $Text);
- $Text = preg_replace("/\[mail\=([$MAILSearchString]*)\](.*?)\[\/mail\]/", '<a href="mailto:$1">$2</a>', $Text);
-
+ if (strpos($Text,'[/mail]') !== false) {
+ $Text = preg_replace("/\[mail\]([$MAILSearchString]*)\[\/mail\]/", '<a href="mailto:$1">$1</a>', $Text);
+ $Text = preg_replace("/\[mail\=([$MAILSearchString]*)\](.*?)\[\/mail\]/", '<a href="mailto:$1">$2</a>', $Text);
+ }
// Check for bold text
- $Text = preg_replace("(\[b\](.*?)\[\/b\])ism",'<strong>$1</strong>',$Text);
-
+ if (strpos($Text,'[b]') !== false) {
+ $Text = preg_replace("(\[b\](.*?)\[\/b\])ism",'<strong>$1</strong>',$Text);
+ }
// Check for Italics text
- $Text = preg_replace("(\[i\](.*?)\[\/i\])ism",'<em>$1</em>',$Text);
-
+ if (strpos($Text,'[i]') !== false) {
+ $Text = preg_replace("(\[i\](.*?)\[\/i\])ism",'<em>$1</em>',$Text);
+ }
// Check for Underline text
- $Text = preg_replace("(\[u\](.*?)\[\/u\])ism",'<u>$1</u>',$Text);
-
+ if (strpos($Text,'[u]') !== false) {
+ $Text = preg_replace("(\[u\](.*?)\[\/u\])ism",'<u>$1</u>',$Text);
+ }
// Check for strike-through text
- $Text = preg_replace("(\[s\](.*?)\[\/s\])ism",'<strike>$1</strike>',$Text);
-
+ if (strpos($Text,'[s]') !== false) {
+ $Text = preg_replace("(\[s\](.*?)\[\/s\])ism",'<strike>$1</strike>',$Text);
+ }
// Check for over-line text
- $Text = preg_replace("(\[o\](.*?)\[\/o\])ism",'<span class="overline">$1</span>',$Text);
-
+ if (strpos($Text,'[o]') !== false) {
+ $Text = preg_replace("(\[o\](.*?)\[\/o\])ism",'<span class="overline">$1</span>',$Text);
+ }
// Check for colored text
- $Text = preg_replace("(\[color=(.*?)\](.*?)\[\/color\])ism","<span style=\"color: $1;\">$2</span>",$Text);
-
+ if (strpos($Text,'[/color]') !== false) {
+ $Text = preg_replace("(\[color=(.*?)\](.*?)\[\/color\])ism","<span style=\"color: $1;\">$2</span>",$Text);
+ }
// Check for sized text
- // [size=50] --> font-size: 50px (with the unit).
- $Text = preg_replace("(\[size=(\d*?)\](.*?)\[\/size\])ism","<span style=\"font-size: $1px;\">$2</span>",$Text);
- $Text = preg_replace("(\[size=(.*?)\](.*?)\[\/size\])ism","<span style=\"font-size: $1;\">$2</span>",$Text);
-
+ // [size=50] --> font-size: 50px (with the unit).
+ if (strpos($Text,'[/size]') !== false) {
+ $Text = preg_replace("(\[size=(\d*?)\](.*?)\[\/size\])ism","<span style=\"font-size: $1px;\">$2</span>",$Text);
+ $Text = preg_replace("(\[size=(.*?)\](.*?)\[\/size\])ism","<span style=\"font-size: $1;\">$2</span>",$Text);
+ }
// Check for centered text
+ if (strpos($Text,'[/center]') !== false) {
$Text = preg_replace("(\[center\](.*?)\[\/center\])ism","<div style=\"text-align:center;\">$1</div>",$Text);
-
+ }
// Check for list text
$Text = str_replace("[*]", "<li>", $Text);
// Check for style sheet commands
- $Text = preg_replace("(\[style=(.*?)\](.*?)\[\/style\])ism","<span style=\"$1;\">$2</span>",$Text);
-
+ if (strpos($Text,'[/style]') !== false) {
+ $Text = preg_replace("(\[style=(.*?)\](.*?)\[\/style\])ism","<span style=\"$1;\">$2</span>",$Text);
+ }
// Check for CSS classes
- $Text = preg_replace("(\[class=(.*?)\](.*?)\[\/class\])ism","<span class=\"$1\">$2</span>",$Text);
-
+ if (strpos($Text,'[/class]') !== false) {
+ $Text = preg_replace("(\[class=(.*?)\](.*?)\[\/class\])ism","<span class=\"$1\">$2</span>",$Text);
+ }
// handle nested lists
$endlessloop = 0;
while ((((strpos($Text, "[/list]") !== false) && (strpos($Text, "[list") !== false)) ||
- ((strpos($Text, "[/ol]") !== false) && (strpos($Text, "[ol]") !== false)) ||
- ((strpos($Text, "[/ul]") !== false) && (strpos($Text, "[ul]") !== false)) ||
- ((strpos($Text, "[/li]") !== false) && (strpos($Text, "[li]") !== false))) && (++$endlessloop < 20)) {
+ ((strpos($Text, "[/ol]") !== false) && (strpos($Text, "[ol]") !== false)) ||
+ ((strpos($Text, "[/ul]") !== false) && (strpos($Text, "[ul]") !== false)) ||
+ ((strpos($Text, "[/li]") !== false) && (strpos($Text, "[li]") !== false))) && (++$endlessloop < 20)) {
$Text = preg_replace("/\[list\](.*?)\[\/list\]/ism", '<ul class="listbullet" style="list-style-type: circle;">$1</ul>' ,$Text);
$Text = preg_replace("/\[list=\](.*?)\[\/list\]/ism", '<ul class="listnone" style="list-style-type: none;">$1</ul>' ,$Text);
$Text = preg_replace("/\[list=1\](.*?)\[\/list\]/ism", '<ul class="listdecimal" style="list-style-type: decimal;">$1</ul>' ,$Text);
@@ -240,15 +424,20 @@ function bbcode($Text,$preserve_nl = false, $tryoembed = true) {
$Text = preg_replace("/\[ol\](.*?)\[\/ol\]/ism", '<ul class="listdecimal" style="list-style-type: decimal;">$1</ul>' ,$Text);
$Text = preg_replace("/\[li\](.*?)\[\/li\]/ism", '<li>$1</li>' ,$Text);
}
-
- $Text = preg_replace("/\[th\](.*?)\[\/th\]/sm", '<th>$1</th>' ,$Text);
- $Text = preg_replace("/\[td\](.*?)\[\/td\]/sm", '<td>$1</td>' ,$Text);
- $Text = preg_replace("/\[tr\](.*?)\[\/tr\]/sm", '<tr>$1</tr>' ,$Text);
- $Text = preg_replace("/\[table\](.*?)\[\/table\]/sm", '<table>$1</table>' ,$Text);
-
- $Text = preg_replace("/\[table border=1\](.*?)\[\/table\]/sm", '<table border="1" >$1</table>' ,$Text);
- $Text = preg_replace("/\[table border=0\](.*?)\[\/table\]/sm", '<table border="0" >$1</table>' ,$Text);
-
+ if (strpos($Text,'[th]') !== false) {
+ $Text = preg_replace("/\[th\](.*?)\[\/th\]/sm", '<th>$1</th>' ,$Text);
+ }
+ if (strpos($Text,'[td]') !== false) {
+ $Text = preg_replace("/\[td\](.*?)\[\/td\]/sm", '<td>$1</td>' ,$Text);
+ }
+ if (strpos($Text,'[tr]') !== false) {
+ $Text = preg_replace("/\[tr\](.*?)\[\/tr\]/sm", '<tr>$1</tr>' ,$Text);
+ }
+ if (strpos($Text,'[/table]') !== false) {
+ $Text = preg_replace("/\[table\](.*?)\[\/table\]/sm", '<table>$1</table>' ,$Text);
+ $Text = preg_replace("/\[table border=1\](.*?)\[\/table\]/sm", '<table border="1" >$1</table>' ,$Text);
+ $Text = preg_replace("/\[table border=0\](.*?)\[\/table\]/sm", '<table border="0" >$1</table>' ,$Text);
+ }
$Text = str_replace('[hr]','<hr />', $Text);
// This is actually executed in prepare_body()
@@ -256,14 +445,16 @@ function bbcode($Text,$preserve_nl = false, $tryoembed = true) {
$Text = str_replace('[nosmile]','',$Text);
// Check for font change text
- $Text = preg_replace("/\[font=(.*?)\](.*?)\[\/font\]/sm","<span style=\"font-family: $1;\">$2</span>",$Text);
-
+ if (strpos($Text,'[/font]') !== false) {
+ $Text = preg_replace("/\[font=(.*?)\](.*?)\[\/font\]/sm","<span style=\"font-family: $1;\">$2</span>",$Text);
+ }
// Declare the format for [code] layout
$CodeLayout = '<code>$1</code>';
// Check for [code] text
- $Text = preg_replace("/\[code\](.*?)\[\/code\]/ism","$CodeLayout", $Text);
-
+ if (strpos($Text,'[code]') !== false) {
+ $Text = preg_replace("/\[code\](.*?)\[\/code\]/ism","$CodeLayout", $Text);
+ }
// Declare the format for [spoiler] layout
$SpoilerLayout = '<blockquote class="spoiler">$1</blockquote>';
@@ -281,8 +472,8 @@ function bbcode($Text,$preserve_nl = false, $tryoembed = true) {
$endlessloop = 0;
while ((strpos($Text, "[/spoiler]")!== false) and (strpos($Text, "[spoiler=") !== false) and (++$endlessloop < 20))
$Text = preg_replace("/\[spoiler=[\"\']*(.*?)[\"\']*\](.*?)\[\/spoiler\]/ism",
- "<br /><strong class=".'"spoiler"'.">" . $t_wrote . "</strong><blockquote class=".'"spoiler"'.">$2</blockquote>",
- $Text);
+ "<br /><strong class=".'"spoiler"'.">" . $t_wrote . "</strong><blockquote class=".'"spoiler"'.">$2</blockquote>",
+ $Text);
// Declare the format for [quote] layout
$QuoteLayout = '<blockquote>$1</blockquote>';
@@ -301,71 +492,99 @@ function bbcode($Text,$preserve_nl = false, $tryoembed = true) {
$endlessloop = 0;
while ((strpos($Text, "[/quote]")!== false) and (strpos($Text, "[quote=") !== false) and (++$endlessloop < 20))
$Text = preg_replace("/\[quote=[\"\']*(.*?)[\"\']*\](.*?)\[\/quote\]/ism",
- "<br /><strong class=".'"author"'.">" . $t_wrote . "</strong><blockquote>$2</blockquote>",
- $Text);
+ "<br /><strong class=".'"author"'.">" . $t_wrote . "</strong><blockquote>$2</blockquote>",
+ $Text);
// [img=widthxheight]image source[/img]
//$Text = preg_replace("/\[img\=([0-9]*)x([0-9]*)\](.*?)\[\/img\]/ism", '<img src="$3" style="height: $2px; width: $1px;" >', $Text);
- $Text = preg_replace("/\[img\=([0-9]*)x([0-9]*)\](.*?)\[\/img\]/ism", '<img src="$3" style="width: $1px;" >', $Text);
-
+ if (strpos($Text,'[/img]') !== false) {
+ $Text = preg_replace("/\[img\=([0-9]*)x([0-9]*)\](.*?)\[\/img\]/ism", '<img src="$3" style="width: $1px;" >', $Text);
+ }
+ if (strpos($Text,'[/zmg]') !== false) {
+ $Text = preg_replace("/\[zmg\=([0-9]*)x([0-9]*)\](.*?)\[\/zmg\]/ism", '<img class="zrl" src="$3" style="width: $1px;" >', $Text);
+ }
// Images
// [img]pathtoimage[/img]
- $Text = preg_replace("/\[img\](.*?)\[\/img\]/ism", '<img src="$1" alt="' . t('Image/photo') . '" />', $Text);
-
-
- $Text = preg_replace("/\[crypt\](.*?)\[\/crypt\]/ism",'<br/><img src="' .$a->get_baseurl() . '/images/lock_icon.gif" alt="' . t('Encrypted content') . '" title="' . t('Encrypted content') . '" /><br />', $Text);
- $Text = preg_replace("/\[crypt=(.*?)\](.*?)\[\/crypt\]/ism",'<br/><img src="' .$a->get_baseurl() . '/images/lock_icon.gif" alt="' . t('Encrypted content') . '" title="' . '$1' . ' ' . t('Encrypted content') . '" /><br />', $Text);
+ if (strpos($Text,'[/img]') !== false) {
+ $Text = preg_replace("/\[img\](.*?)\[\/img\]/ism", '<img src="$1" alt="' . t('Image/photo') . '" />', $Text);
+ }
+ if (strpos($Text,'[/zmg]') !== false) {
+ $Text = preg_replace("/\[zmg\](.*?)\[\/zmg\]/ism", '<img class="zrl" src="$1" alt="' . t('Image/photo') . '" />', $Text);
+ }
+ if (strpos($Text,'[/crypt]') !== false) {
+ $x = random_string();
+ $Text = preg_replace("/\[crypt\](.*?)\[\/crypt\]/ism",'<br/><div id="' . $x . '"><img src="' .$a->get_baseurl() . '/images/lock_icon.gif" onclick="red_decrypt(\'rot13\',\'\',\'$1\',\'#' . $x . '\');" alt="' . t('Encrypted content') . '" title="' . t('Encrypted content') . '" /><br /></div>', $Text);
+ $Text = preg_replace_callback("/\[crypt (.*?)\](.*?)\[\/crypt\]/ism", 'bb_parse_crypt', $Text);
+ }
// Try to Oembed
if ($tryoembed) {
- $Text = preg_replace("/\[video\](.*?\.(ogg|ogv|oga|ogm|webm|mp4))\[\/video\]/ism", '<video src="$1" controls="controls" width="' . $a->videowidth . '" height="' . $a->videoheight . '"><a href="$1">$1</a></video>', $Text);
- $Text = preg_replace("/\[audio\](.*?\.(ogg|ogv|oga|ogm|webm|mp4|mp3))\[\/audio\]/ism", '<audio src="$1" controls="controls"><a href="$1">$1</a></audio>', $Text);
+ if (strpos($Text,'[/video]') !== false) {
+ $Text = preg_replace("/\[video\](.*?\.(ogg|ogv|oga|ogm|webm|mp4))\[\/video\]/ism", '<video src="$1" controls="controls" width="' . $a->videowidth . '" height="' . $a->videoheight . '"><a href="$1">$1</a></video>', $Text);
+ }
+ if (strpos($Text,'[/audio]') !== false) {
+ $Text = preg_replace("/\[audio\](.*?\.(ogg|ogv|oga|ogm|webm|mp4|mp3))\[\/audio\]/ism", '<audio src="$1" controls="controls"><a href="$1">$1</a></audio>', $Text);
+ }
+ if (strpos($Text,'[/video]') !== false) {
+ $Text = preg_replace_callback("/\[video\](.*?)\[\/video\]/ism", 'tryoembed', $Text);
+ }
+ if (strpos($Text,'[/audio]') !== false) {
+ $Text = preg_replace_callback("/\[audio\](.*?)\[\/audio\]/ism", 'tryoembed', $Text);
+ }
+ }
- $Text = preg_replace_callback("/\[video\](.*?)\[\/video\]/ism", 'tryoembed', $Text);
- $Text = preg_replace_callback("/\[audio\](.*?)\[\/audio\]/ism", 'tryoembed', $Text);
- } else {
- $Text = preg_replace("/\[video\](.*?)\[\/video\]/", '$1', $Text);
- $Text = preg_replace("/\[audio\](.*?)\[\/audio\]/", '$1', $Text);
+ // if video couldn't be embedded, link to it instead.
+ if (strpos($Text,'[/video]') !== false) {
+ $Text = preg_replace("/\[video\](.*?)\[\/video\]/", '<a href="$1">$1</a>', $Text);
+ }
+ if (strpos($Text,'[/audio]') !== false) {
+ $Text = preg_replace("/\[audio\](.*?)\[\/audio\]/", '<a href="$1">$1</a>', $Text);
}
- // html5 video and audio
+ // html5 video and audio
- if ($tryoembed)
- $Text = preg_replace("/\[iframe\](.*?)\[\/iframe\]/ism", '<iframe src="$1" width="' . $a->videowidth . '" height="' . $a->videoheight . '"><a href="$1">$1</a></iframe>', $Text);
- else
- $Text = preg_replace("/\[iframe\](.*?)\[\/iframe\]/ism", '<a href="$1">$1</a>', $Text);
+ if ($tryoembed){
+ if (strpos($Text,'[/iframe]') !== false) {
+ $Text = preg_replace("/\[iframe\](.*?)\[\/iframe\]/ism", '<iframe src="$1" width="' . $a->videowidth . '" height="' . $a->videoheight . '"><a href="$1">$1</a></iframe>', $Text);
+ }
+ }
+ else {
+ if (strpos($Text,'[/iframe]') !== false) {
+ $Text = preg_replace("/\[iframe\](.*?)\[\/iframe\]/ism", '<a href="$1">$1</a>', $Text);
+ }
+ }
// Youtube extensions
- if ($tryoembed) {
- $Text = preg_replace_callback("/\[youtube\](https?:\/\/www.youtube.com\/watch\?v\=.*?)\[\/youtube\]/ism", 'tryoembed', $Text);
- $Text = preg_replace_callback("/\[youtube\](www.youtube.com\/watch\?v\=.*?)\[\/youtube\]/ism", 'tryoembed', $Text);
- $Text = preg_replace_callback("/\[youtube\](https?:\/\/youtu.be\/.*?)\[\/youtube\]/ism",'tryoembed',$Text);
+ if (strpos($Text,'[youtube]') !== false) {
+ if ($tryoembed) {
+ $Text = preg_replace_callback("/\[youtube\](https?:\/\/www.youtube.com\/watch\?v\=.*?)\[\/youtube\]/ism", 'tryoembed', $Text);
+ $Text = preg_replace_callback("/\[youtube\](www.youtube.com\/watch\?v\=.*?)\[\/youtube\]/ism", 'tryoembed', $Text);
+ $Text = preg_replace_callback("/\[youtube\](https?:\/\/youtu.be\/.*?)\[\/youtube\]/ism",'tryoembed',$Text);
+ }
+ $Text = preg_replace("/\[youtube\]https?:\/\/www.youtube.com\/watch\?v\=(.*?)\[\/youtube\]/ism",'[youtube]$1[/youtube]',$Text);
+ $Text = preg_replace("/\[youtube\]https?:\/\/www.youtube.com\/embed\/(.*?)\[\/youtube\]/ism",'[youtube]$1[/youtube]',$Text);
+ $Text = preg_replace("/\[youtube\]https?:\/\/youtu.be\/(.*?)\[\/youtube\]/ism",'[youtube]$1[/youtube]',$Text);
+
+ if ($tryoembed)
+ $Text = preg_replace("/\[youtube\]([A-Za-z0-9\-_=]+)(.*?)\[\/youtube\]/ism", '<iframe width="' . $a->videowidth . '" height="' . $a->videoheight . '" src="http://www.youtube.com/embed/$1" frameborder="0" ></iframe>', $Text);
+ else
+ $Text = preg_replace("/\[youtube\]([A-Za-z0-9\-_=]+)(.*?)\[\/youtube\]/ism", "http://www.youtube.com/watch?v=$1", $Text);
}
+ if (strpos($Text,'[vimeo]') !== false) {
+ if ($tryoembed) {
+ $Text = preg_replace_callback("/\[vimeo\](https?:\/\/player.vimeo.com\/video\/[0-9]+).*?\[\/vimeo\]/ism",'tryoembed',$Text);
+ $Text = preg_replace_callback("/\[vimeo\](https?:\/\/vimeo.com\/[0-9]+).*?\[\/vimeo\]/ism",'tryoembed',$Text);
+ }
- $Text = preg_replace("/\[youtube\]https?:\/\/www.youtube.com\/watch\?v\=(.*?)\[\/youtube\]/ism",'[youtube]$1[/youtube]',$Text);
- $Text = preg_replace("/\[youtube\]https?:\/\/www.youtube.com\/embed\/(.*?)\[\/youtube\]/ism",'[youtube]$1[/youtube]',$Text);
- $Text = preg_replace("/\[youtube\]https?:\/\/youtu.be\/(.*?)\[\/youtube\]/ism",'[youtube]$1[/youtube]',$Text);
-
- if ($tryoembed)
- $Text = preg_replace("/\[youtube\]([A-Za-z0-9\-_=]+)(.*?)\[\/youtube\]/ism", '<iframe width="' . $a->videowidth . '" height="' . $a->videoheight . '" src="http://www.youtube.com/embed/$1" frameborder="0" ></iframe>', $Text);
- else
- $Text = preg_replace("/\[youtube\]([A-Za-z0-9\-_=]+)(.*?)\[\/youtube\]/ism", "http://www.youtube.com/watch?v=$1", $Text);
-
+ $Text = preg_replace("/\[vimeo\]https?:\/\/player.vimeo.com\/video\/([0-9]+)(.*?)\[\/vimeo\]/ism",'[vimeo]$1[/vimeo]',$Text);
+ $Text = preg_replace("/\[vimeo\]https?:\/\/vimeo.com\/([0-9]+)(.*?)\[\/vimeo\]/ism",'[vimeo]$1[/vimeo]',$Text);
- if ($tryoembed) {
- $Text = preg_replace_callback("/\[vimeo\](https?:\/\/player.vimeo.com\/video\/[0-9]+).*?\[\/vimeo\]/ism",'tryoembed',$Text);
- $Text = preg_replace_callback("/\[vimeo\](https?:\/\/vimeo.com\/[0-9]+).*?\[\/vimeo\]/ism",'tryoembed',$Text);
+ if ($tryoembed)
+ $Text = preg_replace("/\[vimeo\]([0-9]+)(.*?)\[\/vimeo\]/ism", '<iframe width="' . $a->videowidth . '" height="' . $a->videoheight . '" src="http://player.vimeo.com/video/$1" frameborder="0" ></iframe>', $Text);
+ else
+ $Text = preg_replace("/\[vimeo\]([0-9]+)(.*?)\[\/vimeo\]/ism", "http://vimeo.com/$1", $Text);
}
-
- $Text = preg_replace("/\[vimeo\]https?:\/\/player.vimeo.com\/video\/([0-9]+)(.*?)\[\/vimeo\]/ism",'[vimeo]$1[/vimeo]',$Text);
- $Text = preg_replace("/\[vimeo\]https?:\/\/vimeo.com\/([0-9]+)(.*?)\[\/vimeo\]/ism",'[vimeo]$1[/vimeo]',$Text);
-
- if ($tryoembed)
- $Text = preg_replace("/\[vimeo\]([0-9]+)(.*?)\[\/vimeo\]/ism", '<iframe width="' . $a->videowidth . '" height="' . $a->videoheight . '" src="http://player.vimeo.com/video/$1" frameborder="0" ></iframe>', $Text);
- else
- $Text = preg_replace("/\[vimeo\]([0-9]+)(.*?)\[\/vimeo\]/ism", "http://vimeo.com/$1", $Text);
-
// $Text = preg_replace("/\[youtube\](.*?)\[\/youtube\]/", '<object width="425" height="350" type="application/x-shockwave-flash" data="http://www.youtube.com/v/$1" ><param name="movie" value="http://www.youtube.com/v/$1"></param><!--[if IE]><embed src="http://www.youtube.com/v/$1" type="application/x-shockwave-flash" width="425" height="350" /><![endif]--></object>', $Text);
@@ -393,11 +612,15 @@ function bbcode($Text,$preserve_nl = false, $tryoembed = true) {
// Unhide all [noparse] contained bbtags unspacefying them
// and triming the [noparse] tag.
-
- $Text = preg_replace_callback("/\[noparse\](.*?)\[\/noparse\]/ism", 'bb_unspacefy_and_trim',$Text);
- $Text = preg_replace_callback("/\[nobb\](.*?)\[\/nobb\]/ism", 'bb_unspacefy_and_trim',$Text);
- $Text = preg_replace_callback("/\[pre\](.*?)\[\/pre\]/ism", 'bb_unspacefy_and_trim',$Text);
-
+ if (strpos($Text,'[noparse]') !== false) {
+ $Text = preg_replace_callback("/\[noparse\](.*?)\[\/noparse\]/ism", 'bb_unspacefy_and_trim',$Text);
+ }
+ if (strpos($Text,'[nobb]') !== false) {
+ $Text = preg_replace_callback("/\[nobb\](.*?)\[\/nobb\]/ism", 'bb_unspacefy_and_trim',$Text);
+ }
+ if (strpos($Text,'[pre]') !== false) {
+ $Text = preg_replace_callback("/\[pre\](.*?)\[\/pre\]/ism", 'bb_unspacefy_and_trim',$Text);
+ }
$Text = preg_replace('/\[\&amp\;([#a-z0-9]+)\;\]/','&$1;',$Text);
@@ -411,22 +634,22 @@ function bbcode($Text,$preserve_nl = false, $tryoembed = true) {
// Clean up the HTML by loading and saving the HTML with the DOM
// Only do it when it has to be done - for performance reasons
- if (!$tryoembed) {
- $doc = new DOMDocument();
- $doc->preserveWhiteSpace = false;
+// if (!$tryoembed) {//
+// $doc = new DOMDocument();
+// $doc->preserveWhiteSpace = false;
- $Text = mb_convert_encoding($Text, 'HTML-ENTITIES', "UTF-8");
+// $Text = mb_convert_encoding($Text, 'HTML-ENTITIES', "UTF-8");
- $doctype = '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">';
- @$doc->loadHTML($doctype."<html><body>".$Text."</body></html>");
+// $doctype = '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">';
+// @$doc->loadHTML($doctype."<html><body>".$Text."</body></html>");
- $Text = $doc->saveHTML();
- $Text = str_replace(array("<html><body>", "</body></html>", $doctype), array("", "", ""), $Text);
+// $Text = $doc->saveHTML();
+// $Text = str_replace(array("<html><body>", "</body></html>", $doctype), array("", "", ""), $Text);
- $Text = str_replace('<br></li>','</li>', $Text);
+// $Text = str_replace('<br></li>','</li>', $Text);
- $Text = mb_convert_encoding($Text, "UTF-8", 'HTML-ENTITIES');
- }
+// $Text = mb_convert_encoding($Text, "UTF-8", 'HTML-ENTITIES');
+// }
call_hooks('bbcode',$Text);
diff --git a/include/cache.php b/include/cache.php
index 567046f7a..b546cd0e9 100644
--- a/include/cache.php
+++ b/include/cache.php
@@ -1,4 +1,4 @@
-<?php
+<?php /** @file */
/**
* cache api
diff --git a/include/cli_startup.php b/include/cli_startup.php
index d9f6ecb8e..6bd4e7520 100644
--- a/include/cli_startup.php
+++ b/include/cli_startup.php
@@ -1,4 +1,4 @@
-<?php
+<?php /** @file */
require_once('boot.php');
@@ -14,14 +14,13 @@ function cli_startup() {
if(is_null($db)) {
@include(".htconfig.php");
- require_once("dba.php");
- $db = new dba($db_host, $db_user, $db_pass, $db_data);
- unset($db_host, $db_user, $db_pass, $db_data);
+ require_once('include/dba/dba_driver.php');
+ $db = dba_factory($db_host, $db_port, $db_user, $db_pass, $db_data);
+ unset($db_host, $db_port, $db_user, $db_pass, $db_data);
};
require_once('include/session.php');
- load_config('config');
load_config('system');
$a->set_baseurl(get_config('system','baseurl'));
diff --git a/include/cli_suggest.php b/include/cli_suggest.php
new file mode 100644
index 000000000..321ffd2e0
--- /dev/null
+++ b/include/cli_suggest.php
@@ -0,0 +1,22 @@
+<?php /** @file */
+
+require_once('boot.php');
+require_once('include/cli_startup.php');
+require_once('include/socgraph.php');
+
+
+function cli_suggest_run($argv, $argc){
+
+ cli_startup();
+
+ $a = get_app();
+
+ update_suggestions();
+
+}
+
+if (array_search(__file__,get_included_files())===0){
+ cli_suggest_run($argv,$argc);
+ killme();
+}
+
diff --git a/include/comanche.php b/include/comanche.php
new file mode 100644
index 000000000..7d7e0e70c
--- /dev/null
+++ b/include/comanche.php
@@ -0,0 +1,180 @@
+<?php /** @file */
+
+require_once('include/security.php');
+require_once('include/menu.php');
+require_once('include/widgets.php');
+
+// When editing a webpage - a dropdown is needed to select a page layout
+// On submit, the pdl_select value (which is the mid of an item with item_restrict = ITEM_PDL) is stored in
+// the webpage's resource_id, with resource_type 'pdl'.
+
+// Then when displaying a webpage, we can see if it has a pdl attached. If not we'll
+// use the default site/page layout.
+
+// If it has a pdl we'll load it as we know the mid and pass the body through comanche_parser() which will generate the
+// page layout from the given description
+
+
+function pdl_selector($uid,$current="") {
+
+ $o = '';
+
+ $sql_extra = item_permissions_sql($uid);
+
+ $r = q("select item_id.*, mid from item_id left join item on iid = item.id where item_id.uid = %d and item_id.uid = item.uid and service = 'PDL' order by sid asc",
+ intval($owner)
+ );
+
+ $arr = array('channel_id' => $uid, 'current' => $current, 'entries' => $r);
+ call_hooks('pdl_selector',$arr);
+
+ $entries = $arr['entries'];
+ $current = $arr['current'];
+
+ $o .= "<select name=\"pdl_select\" id=\"pdl_select\" size=\"1\" >";
+ $entries[] = array('title' => t('Default'), 'mid' => '');
+ foreach($entries as $selection) {
+ $selected = (($selection == $current) ? ' selected="selected" ' : '');
+ $o .= "<option value=\"{$selection['mid']}\" $selected >{$selection['sid']}</option>";
+ }
+
+ $o .= '</select>';
+ return $o;
+}
+
+
+
+function comanche_parser(&$a,$s) {
+
+ $cnt = preg_match_all("/\[comment\](.*?)\[\/comment\]/ism", $s, $matches, PREG_SET_ORDER);
+ if($cnt) {
+ foreach($matches as $mtch) {
+ $s = str_replace($mtch[0],'',$s);
+ }
+ }
+
+ $cnt = preg_match("/\[layout\](.*?)\[\/layout\]/ism", $s, $matches);
+ if($cnt)
+ $a->page['template'] = trim($matches[1]);
+
+ $cnt = preg_match("/\[theme\](.*?)\[\/theme\]/ism", $s, $matches);
+ if($cnt)
+ $a->layout['theme'] = trim($matches[1]);
+
+ $cnt = preg_match_all("/\[region=(.*?)\](.*?)\[\/region\]/ism", $s, $matches, PREG_SET_ORDER);
+ if($cnt) {
+ foreach($matches as $mtch) {
+ $a->layout['region_' . $mtch[1]] = comanche_region($a,$mtch[2]);
+ }
+ }
+
+ $cnt = preg_match_all("/\[webpage\](.*?)\[\/webpage\]/ism", $s, $matches, PREG_SET_ORDER);
+ if($cnt) {
+ // only the last webpage definition is used if there is more than one
+ foreach($matches as $mtch) {
+ $a->layout['webpage'] = comanche_webpage($a,$mtch[1]);
+ }
+ }
+
+}
+
+
+function comanche_menu($name) {
+ $a = get_app();
+ $m = menu_fetch($name,$a->profile['profile_uid'],get_observer_hash());
+ return menu_render($m);
+}
+
+function comanche_replace_region($match) {
+ $a = get_app();
+ if(array_key_exists($match[1],$a->page)) {
+ return $a->page[$match[1]];
+ }
+}
+
+function comanche_block($name) {
+
+ $o = '';
+ $r = q("select * from item inner join item_id on iid = item.id and item_id.uid = item.uid and item.uid = %d and service = 'BUILDBLOCK' and sid = '%s' limit 1",
+ intval(get_app()->profile['profile_uid']),
+ dbesc($name)
+ );
+ if($r) {
+ $o = '<div class="widget bblock">';
+ if($r[0]['title'])
+ $o .= '<h3>' . $r[0]['title'] . '</h3>';
+ $o .= prepare_text($r[0]['body'],$r[0]['mimetype']);
+ $o .= '</div>';
+
+ }
+ return $o;
+}
+
+// This doesn't really belong in Comanche, but it could also be argued that it is the perfect place.
+// We need to be able to select what kind of template and decoration to use for the webpage at the heart of our content.
+// For now we'll allow an '[authored]' element which defaults to name and date, or 'none' to remove these, and perhaps
+// 'full' to provide a social network style profile photo.
+// But leave it open to have richer templating options and perhaps ultimately discard this one, once we have a better idea
+// of what template and webpage options we might desire.
+
+function comanche_webpage(&$a,$s) {
+
+ $ret = array();
+ $cnt = preg_match_all("/\[authored\](.*?)\[\/authored\]/ism", $s, $matches, PREG_SET_ORDER);
+ if($cnt) {
+ foreach($matches as $mtch) {
+ $ret['authored'] = $mtch[1];
+ }
+ }
+ return $ret;
+}
+
+
+// Widgets will have to get any operational arguments from the session,
+// the global app environment, or config storage until we implement argument passing
+
+
+function comanche_widget($name,$text) {
+ $a = get_app();
+ $vars = array();
+ $cnt = preg_match_all("/\[var=(.*?)\](.*?)\[\/var\]/ism", $text, $matches, PREG_SET_ORDER);
+ if($cnt) {
+ foreach($matches as $mtch) {
+ $vars[$mtch[1]] = $mtch[2];
+ }
+ }
+
+ $func = 'widget_' . trim($name);
+ if(function_exists($func))
+ return $func($vars);
+}
+
+
+function comanche_region(&$a,$s) {
+
+
+ $cnt = preg_match_all("/\[menu\](.*?)\[\/menu\]/ism", $s, $matches, PREG_SET_ORDER);
+ if($cnt) {
+ foreach($matches as $mtch) {
+ $s = str_replace($mtch[0],comanche_menu(trim($mtch[1])),$s);
+ }
+ }
+ $cnt = preg_match_all("/\[block\](.*?)\[\/block\]/ism", $s, $matches, PREG_SET_ORDER);
+ if($cnt) {
+ foreach($matches as $mtch) {
+ $s = str_replace($mtch[0],comanche_block(trim($mtch[1])),$s);
+ }
+ }
+
+ // need to modify this to accept parameters
+
+ $cnt = preg_match_all("/\[widget=(.*?)\](.*?)\[\/widget\]/ism", $s, $matches, PREG_SET_ORDER);
+ if($cnt) {
+ foreach($matches as $mtch) {
+ $s = str_replace($mtch[0],comanche_widget(trim($mtch[1]),$mtch[2]),$s);
+ }
+ }
+
+ return $s;
+}
+
diff --git a/include/config.php b/include/config.php
index 44606e329..bccf0737f 100644
--- a/include/config.php
+++ b/include/config.php
@@ -1,4 +1,4 @@
-<?php
+<?php /** @file */
/**
*
@@ -15,24 +15,35 @@
// retrieve a "family" of config variables from database to cached storage
-if(! function_exists('load_config')) {
function load_config($family) {
global $a;
- $r = q("SELECT * FROM `config` WHERE `cat` = '%s'", dbesc($family));
- if(count($r)) {
- foreach($r as $rr) {
- $k = $rr['k'];
- if ($family === 'config') {
- $a->config[$k] = $rr['v'];
- } else {
- $a->config[$family][$k] = $rr['v'];
+
+ if(! array_key_exists($family,$a->config))
+ $a->config[$family] = array();
+
+ if(! array_key_exists('config_loaded',$a->config[$family])) {
+
+ $r = q("SELECT * FROM config WHERE cat = '%s'", dbesc($family));
+
+ // This is often one of the earliest database calls in the life of the page.
+ // If the DB was successfully opened, but we can't read from it,
+ // we must assume catastrophic failure of the DB. Report the system down.
+
+// if($r === false) {
+// system_unavailable();
+// }
+
+ if($r !== false) {
+ if($r) {
+ foreach($r as $rr) {
+ $k = $rr['k'];
+ $a->config[$family][$k] = $rr['v'];
+ }
}
+ $a->config[$family]['config_loaded'] = true;
}
- } else if ($family != 'config') {
- // Negative caching
- $a->config[$family] = "!<unset>!";
- }
-}}
+ }
+}
// get a particular config variable given the family name
// and key. Returns false if not set.
@@ -42,55 +53,50 @@ function load_config($family) {
// local config cache, pull it into the cache so we don't have
// to hit the DB again for this item.
-if(! function_exists('get_config')) {
-function get_config($family, $key, $instore = false) {
+
+function get_config($family, $key) {
global $a;
- if(! $instore) {
- // Looking if the whole family isn't set
- if(isset($a->config[$family])) {
- if($a->config[$family] === '!<unset>!') {
- return false;
- }
- }
+ if((! array_key_exists($family,$a->config)) || (! array_key_exists('config_loaded',$a->config[$family])))
+ load_config($family);
- if(isset($a->config[$family][$key])) {
- if($a->config[$family][$key] === '!<unset>!') {
- return false;
- }
- return $a->config[$family][$key];
+ if(array_key_exists('config_loaded',$a->config[$family])) {
+ if(! array_key_exists($key,$a->config[$family])) {
+ return false;
}
+ return ((preg_match('|^a:[0-9]+:{.*}$|s', $a->config[$family][$key]))
+ ? unserialize($a->config[$family][$key])
+ : $a->config[$family][$key]
+ );
}
- $ret = q("SELECT `v` FROM `config` WHERE `cat` = '%s' AND `k` = '%s' LIMIT 1",
+ return false;
+}
+
+function get_config_from_storage($family,$key) {
+ $ret = q("select * from config where cat = '%s' and k = '%s' limit 1",
dbesc($family),
dbesc($key)
);
- if(count($ret)) {
- // manage array value
- $val = (preg_match("|^a:[0-9]+:{.*}$|s", $ret[0]['v'])?unserialize( $ret[0]['v']):$ret[0]['v']);
- $a->config[$family][$key] = $val;
- return $val;
- }
- else {
- $a->config[$family][$key] = '!<unset>!';
- }
- return false;
-}}
+ return $ret;
+}
+
+
// Store a config value ($value) in the category ($family)
// under the key ($key)
// Return the value, or false if the database update failed
-if(! function_exists('set_config')) {
function set_config($family,$key,$value) {
global $a;
// manage array value
- $dbvalue = (is_array($value)?serialize($value):$value);
- $dbvalue = (is_bool($dbvalue) ? intval($dbvalue) : $dbvalue);
- if(get_config($family,$key,true) === false) {
+ $dbvalue = ((is_array($value)) ? serialize($value) : $value);
+ $dbvalue = ((is_bool($dbvalue)) ? intval($dbvalue) : $dbvalue);
+
+ if(get_config($family,$key) === false || (! get_config_from_storage($family,$key))) {
$a->config[$family][$key] = $value;
- $ret = q("INSERT INTO `config` ( `cat`, `k`, `v` ) VALUES ( '%s', '%s', '%s' ) ",
+
+ $ret = q("INSERT INTO config ( cat, k, v ) VALUES ( '%s', '%s', '%s' ) ",
dbesc($family),
dbesc($key),
dbesc($dbvalue)
@@ -100,7 +106,7 @@ function set_config($family,$key,$value) {
return $ret;
}
- $ret = q("UPDATE `config` SET `v` = '%s' WHERE `cat` = '%s' AND `k` = '%s' LIMIT 1",
+ $ret = q("UPDATE config SET v = '%s' WHERE cat = '%s' AND k = '%s' LIMIT 1",
dbesc($dbvalue),
dbesc($family),
dbesc($key)
@@ -111,129 +117,255 @@ function set_config($family,$key,$value) {
if($ret)
return $value;
return $ret;
-}}
-
+}
-if(! function_exists('load_pconfig')) {
-function load_pconfig($uid,$family) {
+function del_config($family,$key) {
global $a;
- $r = q("SELECT * FROM `pconfig` WHERE `cat` = '%s' AND `uid` = %d",
+ if(array_key_exists($family,$a->config) && array_key_exists($key,$a->config[$family]))
+ unset($a->config[$family][$key]);
+ $ret = q("DELETE FROM config WHERE cat = '%s' AND k = '%s' LIMIT 1",
dbesc($family),
+ dbesc($key)
+ );
+ return $ret;
+}
+
+
+function load_pconfig($uid,$family = '') {
+ global $a;
+
+ if($uid === false)
+ return false;
+
+ if(! array_key_exists($uid,$a->config))
+ $a->config[$uid] = array();
+
+ // family is no longer used - load entire user config
+
+ $r = q("SELECT * FROM `pconfig` WHERE `uid` = %d",
intval($uid)
);
- if(count($r)) {
+
+ if($r) {
foreach($r as $rr) {
$k = $rr['k'];
- $a->config[$uid][$family][$k] = $rr['v'];
+ $c = $rr['cat'];
+ if(! array_key_exists($c,$a->config[$uid])) {
+ $a->config[$uid][$c] = array();
+ $a->config[$uid][$c]['config_loaded'] = true;
+ }
+ $a->config[$uid][$c][$k] = $rr['v'];
}
- } else if ($family != 'config') {
- // Negative caching
- $a->config[$uid][$family] = "!<unset>!";
- }
-}}
+ }
+}
+
-if(! function_exists('get_pconfig')) {
function get_pconfig($uid,$family, $key, $instore = false) {
global $a;
- if(! $instore) {
- // Looking if the whole family isn't set
- if(isset($a->config[$uid][$family])) {
- if($a->config[$uid][$family] === '!<unset>!') {
- return false;
- }
- }
+ if($uid === false)
+ return false;
- if(isset($a->config[$uid][$family][$key])) {
- if($a->config[$uid][$family][$key] === '!<unset>!') {
- return false;
- }
- return $a->config[$uid][$family][$key];
- }
+ if(! array_key_exists($uid,$a->config))
+ load_pconfig($uid);
+
+ if((! array_key_exists($family,$a->config[$uid])) || (! array_key_exists($key,$a->config[$uid][$family])))
+ return false;
+
+ return ((preg_match('|^a:[0-9]+:{.*}$|s', $a->config[$uid][$family][$key]))
+ ? unserialize($a->config[$uid][$family][$key])
+ : $a->config[$uid][$family][$key]
+ );
+}
+
+function set_pconfig($uid,$family,$key,$value) {
+
+ global $a;
+
+
+ // manage array value
+ $dbvalue = ((is_array($value)) ? serialize($value) : $value);
+ $dbvalue = ((is_bool($dbvalue)) ? intval($dbvalue) : $dbvalue);
+
+ if(get_pconfig($uid,$family,$key) === false) {
+ if(! array_key_exists($uid,$a->config))
+ $a->config[$uid] = array();
+ if(! array_key_exists($family,$a->config[$uid]))
+ $a->config[$uid][$family] = array();
+
+ // keep a separate copy for all variables which were
+ // set in the life of this page. We need this to
+ // synchronise channel clones.
+
+ if(! array_key_exists('transient',$a->config[$uid]))
+ $a->config[$uid]['transient'] = array();
+ if(! array_key_exists($family,$a->config[$uid]['transient']))
+ $a->config[$uid]['transient'][$family] = array();
+
+ $a->config[$uid][$family][$key] = $value;
+ $a->config[$uid]['transient'][$family][$key] = $value;
+
+ $ret = q("INSERT INTO pconfig ( uid, cat, k, v ) VALUES ( %d, '%s', '%s', '%s' ) ",
+ intval($uid),
+ dbesc($family),
+ dbesc($key),
+ dbesc($dbvalue)
+ );
+ if($ret)
+ return $value;
+ return $ret;
}
- $ret = q("SELECT `v` FROM `pconfig` WHERE `uid` = %d AND `cat` = '%s' AND `k` = '%s' LIMIT 1",
+ $ret = q("UPDATE pconfig SET v = '%s' WHERE uid = %d and cat = '%s' AND k = '%s' LIMIT 1",
+ dbesc($dbvalue),
intval($uid),
dbesc($family),
dbesc($key)
);
- if(count($ret)) {
- $val = (preg_match("|^a:[0-9]+:{.*}$|s", $ret[0]['v'])?unserialize( $ret[0]['v']):$ret[0]['v']);
- $a->config[$uid][$family][$key] = $val;
- return $val;
- }
- else {
- $a->config[$uid][$family][$key] = '!<unset>!';
- }
- return false;
-}}
+ // keep a separate copy for all variables which were
+ // set in the life of this page. We need this to
+ // synchronise channel clones.
+
+ if(! array_key_exists('transient',$a->config[$uid]))
+ $a->config[$uid]['transient'] = array();
+ if(! array_key_exists($family,$a->config[$uid]['transient']))
+ $a->config[$uid]['transient'][$family] = array();
+
+ $a->config[$uid][$family][$key] = $value;
+ $a->config[$uid]['transient'][$family][$key] = $value;
+
+ if($ret)
+ return $value;
+ return $ret;
+}
-if(! function_exists('del_config')) {
-function del_config($family,$key) {
+
+function del_pconfig($uid,$family,$key) {
global $a;
- if(x($a->config[$family],$key))
- unset($a->config[$family][$key]);
- $ret = q("DELETE FROM `config` WHERE `cat` = '%s' AND `k` = '%s' LIMIT 1",
+ if(x($a->config[$uid][$family],$key))
+ unset($a->config[$uid][$family][$key]);
+ $ret = q("DELETE FROM pconfig WHERE uid = %d AND cat = '%s' AND k = '%s' LIMIT 1",
+ intval($uid),
dbesc($family),
dbesc($key)
);
return $ret;
-}}
+}
-// Same as above functions except these are for personal config storage and take an
-// additional $uid argument.
+function load_xconfig($xchan,$family = '') {
+ global $a;
+
+ if(! $xchan)
+ return false;
+
+ if(! array_key_exists($xchan,$a->config))
+ $a->config[$xchan] = array();
+
+ // family is no longer used. Entire config is loaded
+
+ $r = q("SELECT * FROM `xconfig` WHERE `xchan` = '%s'",
+ dbesc($xchan)
+ );
+
+ if($r) {
+ foreach($r as $rr) {
+ $k = $rr['k'];
+ $c = $rr['cat'];
+ if(! array_key_exists($c,$a->config[$xchan])) {
+ $a->config[$xchan][$c] = array();
+ $a->config[$xchan][$c]['config_loaded'] = true;
+ }
+ $a->config[$xchan][$c][$k] = $rr['v'];
+ }
+ }
+
+}
+
-if(! function_exists('set_pconfig')) {
-function set_pconfig($uid,$family,$key,$value) {
+
+
+function get_xconfig($xchan,$family, $key) {
global $a;
- // manage array value
- $dbvalue = (is_array($value)?serialize($value):$value);
+ if(! $xchan)
+ return false;
- if(get_pconfig($uid,$family,$key,true) === false) {
- $a->config[$uid][$family][$key] = $value;
- $ret = q("INSERT INTO `pconfig` ( `uid`, `cat`, `k`, `v` ) VALUES ( %d, '%s', '%s', '%s' ) ",
- intval($uid),
+ if(! array_key_exists($xchan,$a->config))
+ load_xconfig($xchan);
+
+ if((! array_key_exists($family,$a->config[$xchan])) || (! array_key_exists($key,$a->config[$xchan][$family])))
+ return false;
+
+ return ((preg_match('|^a:[0-9]+:{.*}$|s', $a->config[$xchan][$family][$key]))
+ ? unserialize($a->config[$xchan][$family][$key])
+ : $a->config[$xchan][$family][$key]
+ );
+
+}
+
+
+function set_xconfig($xchan,$family,$key,$value) {
+
+ global $a;
+
+ // manage array value
+ $dbvalue = ((is_array($value)) ? serialize($value) : $value);
+ $dbvalue = ((is_bool($dbvalue)) ? intval($dbvalue) : $dbvalue);
+
+ if(get_xconfig($xchan,$family,$key) === false) {
+ if(! array_key_exists($xchan,$a->config))
+ $a->config[$xchan] = array();
+ if(! array_key_exists($family,$a->config[$xchan]))
+ $a->config[$xchan][$family] = array();
+
+ $a->config[$xchan][$family][$key] = $value;
+ $ret = q("INSERT INTO xconfig ( xchan, cat, k, v ) VALUES ( '%s', '%s', '%s', '%s' ) ",
+ dbesc($xchan),
dbesc($family),
dbesc($key),
dbesc($dbvalue)
);
- if($ret)
+ if($ret)
return $value;
return $ret;
}
- $ret = q("UPDATE `pconfig` SET `v` = '%s' WHERE `uid` = %d AND `cat` = '%s' AND `k` = '%s' LIMIT 1",
+
+ $ret = q("UPDATE xconfig SET v = '%s' WHERE xchan = '%s' and cat = '%s' AND k = '%s' LIMIT 1",
dbesc($dbvalue),
- intval($uid),
+ dbesc($xchan),
dbesc($family),
dbesc($key)
);
- $a->config[$uid][$family][$key] = $value;
+ $a->config[$xchan][$family][$key] = $value;
if($ret)
return $value;
return $ret;
-}}
-if(! function_exists('del_pconfig')) {
-function del_pconfig($uid,$family,$key) {
+}
+
+
+function del_xconfig($xchan,$family,$key) {
global $a;
- if(x($a->config[$uid][$family],$key))
- unset($a->config[$uid][$family][$key]);
- $ret = q("DELETE FROM `pconfig` WHERE `uid` = %d AND `cat` = '%s' AND `k` = '%s' LIMIT 1",
- intval($uid),
+ if(x($a->config[$xchan][$family],$key))
+ unset($a->config[$xchan][$family][$key]);
+ $ret = q("DELETE FROM `xconfig` WHERE `xchan` = '%s' AND `cat` = '%s' AND `k` = '%s' LIMIT 1",
+ dbesc($xchan),
dbesc($family),
dbesc($key)
);
return $ret;
-}}
+}
+
+
+
diff --git a/include/contact_selectors.php b/include/contact_selectors.php
index 76d005305..b56a77937 100644
--- a/include/contact_selectors.php
+++ b/include/contact_selectors.php
@@ -1,21 +1,19 @@
-<?php
+<?php /** @file */
-function contact_profile_assign($current,$foreign_net) {
+function contact_profile_assign($current) {
$o = '';
- $disabled = (($foreign_net) ? ' disabled="true" ' : '');
+ $o .= "<select id=\"contact-profile-selector\" name=\"profile-assign\" />\r\n";
- $o .= "<select id=\"contact-profile-selector\" $disabled name=\"profile-assign\" />\r\n";
+ $r = q("SELECT profile_guid, profile_name FROM `profile` WHERE `uid` = %d",
+ intval($_SESSION['uid']));
- $r = q("SELECT `id`, `profile_name` FROM `profile` WHERE `uid` = %d",
- intval($_SESSION['uid']));
-
- if(count($r)) {
+ if($r) {
foreach($r as $rr) {
- $selected = (($rr['id'] == $current) ? " selected=\"selected\" " : "");
- $o .= "<option value=\"{$rr['id']}\" $selected >{$rr['profile_name']}</option>\r\n";
+ $selected = (($rr['profile_guid'] == $current) ? " selected=\"selected\" " : "");
+ $o .= "<option value=\"{$rr['profile_guid']}\" $selected >{$rr['profile_name']}</option>\r\n";
}
}
$o .= "</select>\r\n";
diff --git a/include/contact_widgets.php b/include/contact_widgets.php
index 54e2ad967..482bbed78 100644
--- a/include/contact_widgets.php
+++ b/include/contact_widgets.php
@@ -1,15 +1,6 @@
-<?php
+<?php /** @file */
-function follow_widget() {
- return replace_macros(get_markup_template('follow.tpl'),array(
- '$connect' => t('Add New Connection'),
- '$desc' => t('Enter the channel address'),
- '$hint' => t('Example: bob@example.com, http://example.com/barbara'),
- '$follow' => t('Connect')
- ));
-
-}
function findpeople_widget() {
require_once('include/Contact.php');
@@ -32,9 +23,10 @@ function findpeople_widget() {
'$hint' => t('Examples: Robert Morgenstein, Fishing'),
'$findthem' => t('Find'),
'$suggest' => t('Channel Suggestions'),
- '$similar' => t('Similar Interests'),
+ '$similar' => '', // FIXME and uncomment when mod/match working // t('Similar Interests'),
'$random' => t('Random Profile'),
- '$inv' => t('Invite Friends')
+ '$inv' => t('Invite Friends'),
+ '$loggedin' => local_user()
));
}
@@ -70,15 +62,22 @@ function fileas_widget($baseurl,$selected = '') {
function categories_widget($baseurl,$selected = '') {
+ $a = get_app();
+
if(! feature_enabled($a->profile['profile_uid'],'categories'))
return '';
- $a = get_app();
-
$terms = array();
- $r = q("select distinct(term) from term where uid = %d and type = %d order by term asc",
+ $r = q("select distinct(term.term)
+ from term join item on term.oid = item.id
+ where item.uid = %d
+ and term.uid = item.uid
+ and term.type = %d
+ and item.author_xchan = '%s'
+ order by term.term asc",
intval($a->profile['profile_uid']),
- intval(TERM_CATEGORY)
+ intval(TERM_CATEGORY),
+ dbesc($a->profile['channel_hash'])
);
if($r && count($r)) {
foreach($r as $rr)
@@ -127,4 +126,6 @@ function common_friends_visitor_widget($profile_uid) {
'$items' => $r
));
-}; \ No newline at end of file
+};
+
+
diff --git a/include/conversation.php b/include/conversation.php
index 368a0b0df..a9bf69a3e 100644
--- a/include/conversation.php
+++ b/include/conversation.php
@@ -1,4 +1,4 @@
-<?php
+<?php /** @file */
require_once('include/items.php');
@@ -6,7 +6,7 @@ require_once('include/items.php');
// is identical to the code in mod/message.php for 'item_extract_images' and
// 'item_redir_and_replace_images'
-if(! function_exists('item_extract_images')) {
+
function item_extract_images($body) {
$saved_image = array();
@@ -46,9 +46,9 @@ function item_extract_images($body) {
$new_body = $new_body . $orig_body;
return array('body' => $new_body, 'images' => $saved_image);
-}}
+}
+
-if(! function_exists('item_redir_and_replace_images')) {
function item_redir_and_replace_images($body, $images, $cid) {
$origbody = $body;
@@ -81,7 +81,7 @@ function item_redir_and_replace_images($body, $images, $cid) {
}
return $newbody;
-}}
+}
@@ -91,13 +91,15 @@ function item_redir_and_replace_images($body, $images, $cid) {
function localize_item(&$item){
- $extracted = item_extract_images($item['body']);
- if($extracted['images'])
- $item['body'] = item_redir_and_replace_images($extracted['body'], $extracted['images'], $item['contact-id']);
-
if (activity_match($item['verb'],ACTIVITY_LIKE) || activity_match($item['verb'],ACTIVITY_DISLIKE)){
-
- $obj= json_decode($item['object'],true);
+
+ if(! $item['object'])
+ return;
+
+ $obj = json_decode_plus($item['object']);
+ if((! $obj) && ($item['object'])) {
+ logger('localize_item: failed to decode object: ' . print_r($item['object'],true));
+ }
if($obj['author'] && $obj['author']['link'])
$author_link = get_rel_link($obj['author']['link'],'alternate');
@@ -108,32 +110,52 @@ function localize_item(&$item){
$item_url = get_rel_link($obj['link'],'alternate');
+ $Bphoto = '';
+
+ switch($obj['type']) {
+ case ACTIVITY_OBJ_PHOTO:
+ $post_type = t('photo');
+ break;
+ case ACTIVITY_OBJ_EVENT:
+ $post_type = t('event');
+ break;
+ case ACTIVITY_OBJ_PERSON:
+ $post_type = t('channel');
+ $author_name = $obj['title'];
+ if($obj['link']) {
+ $author_link = get_rel_link($obj['link'],'alternate');
+ $Bphoto = get_rel_link($obj['link'],'photo');
+ }
+ break;
+ case ACTIVITY_OBJ_THING:
+ $post_type = $obj['title'];
+ if($obj['owner']) {
+ if(array_key_exists('name',$obj['owner']))
+ $obj['owner']['name'];
+ if(array_key_exists('link',$obj['owner']))
+ $author_link = get_rel_link($obj['owner']['link'],'alternate');
+ }
+ if($obj['link']) {
+ $Bphoto = get_rel_link($obj['link'],'photo');
+ }
+ break;
+
+ case ACTIVITY_OBJ_NOTE:
+ default:
+ $post_type = t('status');
+ if($obj['mid'] != $obj['parent_mid'])
+ $post_type = t('comment');
+ break;
+ }
// If we couldn't parse something useful, don't bother translating.
// We need something better than zid here, probably magic_link(), but it needs writing
if($author_link && $author_name && $item_url) {
-
- $author = '[url=' . chanlink_url($item['author']['xchan_url']) . ']' . $item['author']['xchan_name'] . '[/url]';
- $objauthor = '[url=' . chanlink_url($author_link) . ']' . $author_name . '[/url]';
+ $author = '[zrl=' . chanlink_url($item['author']['xchan_url']) . ']' . $item['author']['xchan_name'] . '[/zrl]';
+ $objauthor = '[zrl=' . chanlink_url($author_link) . ']' . $author_name . '[/zrl]';
- switch($obj->type) {
- case ACTIVITY_OBJ_PHOTO:
- $post_type = t('photo');
- break;
- case ACTIVITY_OBJ_EVENT:
- $post_type = t('event');
- break;
- case ACTIVITY_OBJ_NOTE:
- default:
- if(! ($item_flags & ITEM_THREAD_TOP))
- $post_type = t('comment');
- else
- $post_type = t('status');
- break;
- }
-
- $plink = '[url=' . zid($item_url) . ']' . $post_type . '[/url]';
+ $plink = '[zrl=' . zid($item_url) . ']' . $post_type . '[/zrl]';
if(activity_match($item['verb'],ACTIVITY_LIKE)) {
$bodyverb = t('%1$s likes %2$s\'s %3$s');
@@ -142,20 +164,26 @@ function localize_item(&$item){
$bodyverb = t('%1$s doesn\'t like %2$s\'s %3$s');
}
$item['body'] = $item['localize'] = sprintf($bodyverb, $author, $objauthor, $plink);
+ if($Bphoto != "")
+ $item['body'] .= "\n\n\n" . '[zrl=' . chanlink_url($author_link) . '][zmg=80x80]' . $Bphoto . '[/zmg][/zrl]';
}
+ else {
+ logger('localize_item like failed: link ' . $author_link . ' name ' . $author_name . ' url ' . $item_url);
+ }
}
if (activity_match($item['verb'],ACTIVITY_FRIEND)) {
- if ($item['obj_type']=="" || $item['obj_type']!== ACTIVITY_OBJ_PERSON) return;
+
+// if ($item['obj_type']=="" || $item['obj_type']!== ACTIVITY_OBJ_PERSON) return;
$Aname = $item['author']['xchan_name'];
$Alink = $item['author']['xchan_url'];
- $obj= json_decode($item['object'],true);
+ $obj= json_decode_plus($item['object']);
$Blink = $Bphoto = '';
@@ -166,15 +194,19 @@ function localize_item(&$item){
$Bname = $obj['title'];
- $A = '[url=' . chanlink_url($Alink) . ']' . $Aname . '[/url]';
- $B = '[url=' . chanlink_url($Blink) . ']' . $Bname . '[/url]';
- if ($Bphoto!="") $Bphoto = '[url=' . chanlink_url($Blink) . '][img=80x80]' . $Bphoto . '[/img][/url]';
+ $A = '[zrl=' . chanlink_url($Alink) . ']' . $Aname . '[/zrl]';
+ $B = '[zrl=' . chanlink_url($Blink) . ']' . $Bname . '[/zrl]';
+ if ($Bphoto!="") $Bphoto = '[zrl=' . chanlink_url($Blink) . '][zmg=80x80]' . $Bphoto . '[/zmg][/zrl]';
$item['body'] = $item['localize'] = sprintf( t('%1$s is now connected with %2$s'), $A, $B);
$item['body'] .= "\n\n\n" . $Bphoto;
}
if (stristr($item['verb'],ACTIVITY_POKE)) {
+
+ // FIXME for obscured private posts, until then leave untranslated
+ return;
+
$verb = urldecode(substr($item['verb'],strpos($item['verb'],'#')+1));
if(! $verb)
return;
@@ -184,7 +216,7 @@ function localize_item(&$item){
$Alink = $item['author']['xchan_url'];
- $obj= json_decode($item['object'],true);
+ $obj= json_decode_plus($item['object']);
$Blink = $Bphoto = '';
@@ -194,9 +226,9 @@ function localize_item(&$item){
}
$Bname = $obj['title'];
- $A = '[url=' . chanlink_url($Alink) . ']' . $Aname . '[/url]';
- $B = '[url=' . chanlink_url($Blink) . ']' . $Bname . '[/url]';
- if ($Bphoto!="") $Bphoto = '[url=' . chanlink_url($Blink) . '][img=80x80]' . $Bphoto . '[/img][/url]';
+ $A = '[zrl=' . chanlink_url($Alink) . ']' . $Aname . '[/zrl]';
+ $B = '[zrl=' . chanlink_url($Blink) . ']' . $Bname . '[/zrl]';
+ if ($Bphoto!="") $Bphoto = '[zrl=' . chanlink_url($Blink) . '][zmg=80x80]' . $Bphoto . '[/zmg][/zrl]';
// we can't have a translation string with three positions but no distinguishable text
// So here is the translate string.
@@ -221,7 +253,7 @@ function localize_item(&$item){
$Aname = $item['author']['xchan_name'];
$Alink = $item['author']['xchan_url'];
- $A = '[url=' . chanlink_url($Alink) . ']' . $Aname . '[/url]';
+ $A = '[zrl=' . chanlink_url($Alink) . ']' . $Aname . '[/zrl]';
$txt = t('%1$s is currently %2$s');
@@ -233,13 +265,13 @@ function localize_item(&$item){
if (activity_match($item['verb'],ACTIVITY_TAG)) {
$r = q("SELECT * from `item`,`contact` WHERE
- `item`.`contact-id`=`contact`.`id` AND `item`.`uri`='%s';",
- dbesc($item['parent_uri']));
+ `item`.`contact-id`=`contact`.`id` AND `item`.`mid`='%s';",
+ dbesc($item['parent_mid']));
if(count($r)==0) return;
$obj=$r[0];
- $author = '[url=' . zid($item['author-link']) . ']' . $item['author-name'] . '[/url]';
- $objauthor = '[url=' . zid($obj['author-link']) . ']' . $obj['author-name'] . '[/url]';
+ $author = '[zrl=' . zid($item['author-link']) . ']' . $item['author-name'] . '[/zrl]';
+ $objauthor = '[zrl=' . zid($obj['author-link']) . ']' . $obj['author-name'] . '[/zrl]';
switch($obj['verb']){
case ACTIVITY_POST:
@@ -254,17 +286,17 @@ function localize_item(&$item){
default:
if($obj['resource_id']){
$post_type = t('photo');
- $m=array(); preg_match("/\[url=([^]]*)\]/", $obj['body'], $m);
+ $m=array(); preg_match("/\[[zu]rl=([^]]*)\]/", $obj['body'], $m);
$rr['plink'] = $m[1];
} else {
$post_type = t('status');
}
}
- $plink = '[url=' . $obj['plink'] . ']' . $post_type . '[/url]';
+ $plink = '[zrl=' . $obj['plink'] . ']' . $post_type . '[/zrl]';
$parsedobj = parse_xml_string($xmlhead.$item['object']);
- $tag = sprintf('#[url=%s]%s[/url]', $parsedobj->id, $parsedobj->content);
+ $tag = sprintf('#[zrl=%s]%s[/zrl]', $parsedobj->id, $parsedobj->content);
$item['body'] = sprintf( t('%1$s tagged %2$s\'s %3$s with %4$s'), $author, $objauthor, $plink, $tag );
}
@@ -281,7 +313,7 @@ function localize_item(&$item){
$obj = parse_xml_string($xmlhead.$item['object']);
if(strlen($obj->id)) {
- $r = q("select * from item where uri = '%s' and uid = %d limit 1",
+ $r = q("select * from item where mid = '%s' and uid = %d limit 1",
dbesc($obj->id),
intval($item['uid'])
);
@@ -289,9 +321,9 @@ function localize_item(&$item){
$target = $r[0];
$Bname = $target['author-name'];
$Blink = $target['author-link'];
- $A = '[url=' . zid($Alink) . ']' . $Aname . '[/url]';
- $B = '[url=' . zid($Blink) . ']' . $Bname . '[/url]';
- $P = '[url=' . $target['plink'] . ']' . t('post/item') . '[/url]';
+ $A = '[zrl=' . zid($Alink) . ']' . $Aname . '[/zrl]';
+ $B = '[zrl=' . zid($Blink) . ']' . $Bname . '[/zrl]';
+ $P = '[zrl=' . $target['plink'] . ']' . t('post/item') . '[/zrl]';
$item['body'] = sprintf( t('%1$s marked %2$s\'s %3$s as favorite'), $A, $B, $P)."\n";
}
@@ -299,25 +331,26 @@ function localize_item(&$item){
}
*/
+/*
$matches = null;
- if(strpos($item['body'],'[url') !== false) {
- if(preg_match_all('/@\[url=(.*?)\]/is',$item['body'],$matches,PREG_SET_ORDER)) {
+ if(strpos($item['body'],'[zrl') !== false) {
+ if(preg_match_all('/@\[zrl=(.*?)\]/is',$item['body'],$matches,PREG_SET_ORDER)) {
foreach($matches as $mtch) {
if(! strpos($mtch[1],'zid='))
- $item['body'] = str_replace($mtch[0],'@[url=' . zid($mtch[1]). ']',$item['body']);
+ $item['body'] = str_replace($mtch[0],'@[zrl=' . zid($mtch[1]). ']',$item['body']);
}
}
}
- if(strpos($item['body'],'[img') !== false) {
+ if(strpos($item['body'],'[zmg') !== false) {
// add zid's to public images
- if(preg_match_all('/\[url=(.*?)\/photos\/(.*?)\/image\/(.*?)\]\[img(.*?)\]h(.*?)\[\/img\]\[\/url\]/is',$item['body'],$matches,PREG_SET_ORDER)) {
+ if(preg_match_all('/\[zrl=(.*?)\/photos\/(.*?)\/image\/(.*?)\]\[zmg(.*?)\]h(.*?)\[\/zmg\]\[\/zrl\]/is',$item['body'],$matches,PREG_SET_ORDER)) {
foreach($matches as $mtch) {
- $item['body'] = str_replace($mtch[0],'[url=' . zid( $mtch[1] . '/photos/' . $mtch[2] . '/image/' . $mtch[3]) . '][img' . $mtch[4] . ']h' . $mtch[5] . '[/img][/url]',$item['body']);
+ $item['body'] = str_replace($mtch[0],'[zrl=' . zid( $mtch[1] . '/photos/' . $mtch[2] . '/image/' . $mtch[3]) . '][zmg' . $mtch[4] . ']h' . $mtch[5] . '[/zmg][/zrl]',$item['body']);
}
}
}
-
+*/
// add sparkle links to appropriate permalinks
// $x = stristr($item['plink'],'/display/');
@@ -349,7 +382,9 @@ function count_descendants($item) {
function visible_activity($item) {
- if(activity_match($item['verb'],ACTIVITY_LIKE) || activity_match($item['verb'],ACTIVITY_DISLIKE))
+ // likes can apply to other things besides posts. Check if they are post children, in which case we handle them specially
+
+ if((activity_match($item['verb'],ACTIVITY_LIKE) || activity_match($item['verb'],ACTIVITY_DISLIKE)) && ($item['mid'] != $item['parent_mid']))
return false;
return true;
}
@@ -365,15 +400,34 @@ function visible_activity($item) {
*
*/
-if(!function_exists('conversation')) {
-function conversation(&$a, $items, $mode, $update, $page_mode = 'traditional') {
+
+function conversation(&$a, $items, $mode, $update, $page_mode = 'traditional', $prepared_item = '') {
$tstart = dba_timer();
+ $t0 = $t1 = $t2 = $t3 = $t4 = $t5 = $t6 = null;
+ $content_html = '';
+ $o = '';
require_once('bbcode.php');
$ssl_state = ((local_user()) ? true : false);
+ if(local_user())
+ load_pconfig(local_user(),'');
+
+ $arr_blocked = null;
+
+ if(local_user()) {
+ $str_blocked = get_pconfig(local_user(),'system','blocked');
+ if($str_blocked) {
+ $arr_blocked = explode(',',$str_blocked);
+ for($x = 0; $x < count($arr_blocked); $x ++)
+ $arr_blocked[$x] = trim($arr_blocked[$x]);
+ }
+
+ }
+
+
$profile_owner = 0;
$page_writeable = false;
$live_update_div = '';
@@ -450,10 +504,16 @@ function conversation(&$a, $items, $mode, $update, $page_mode = 'traditional') {
}
- else if($mode === 'search') {
+ elseif($mode === 'search') {
$live_update_div = '<div id="live-search"></div>' . "\r\n";
}
-
+ elseif($mode === 'photos') {
+ $profile_onwer = $a->profile['profile_uid'];
+ $page_writeable = ($profile_owner == local_user());
+ $live_update_div = '<div id="live-photos"></div>' . "\r\n";
+ // for photos we've already formatted the top-level item (the photo)
+ $content_html = $a->data['photo_html'];
+ }
$page_dropping = ((local_user() && local_user() == $profile_owner) ? true : false);
@@ -476,9 +536,6 @@ function conversation(&$a, $items, $mode, $update, $page_mode = 'traditional') {
$items = $cb['items'];
- $cmnt_tpl = get_markup_template('comment_item.tpl');
- $hide_comments_tpl = get_markup_template('hide_comments.tpl');
-
$alike = array();
$dlike = array();
@@ -496,10 +553,24 @@ function conversation(&$a, $items, $mode, $update, $page_mode = 'traditional') {
// "New Item View" on network page or search page results
// - just loop through the items and format them minimally for display
+
//$tpl = get_markup_template('search_item.tpl');
$tpl = 'search_item.tpl';
foreach($items as $item) {
+
+ if($arr_blocked) {
+ $blocked = false;
+ foreach($arr_blocked as $b) {
+ if(($b) && ($item['author_xchan'] == $b)) {
+ $blocked = true;
+ break;
+ }
+ }
+ if($blocked)
+ continue;
+ }
+
$threadsid++;
$comment = '';
@@ -526,17 +597,6 @@ function conversation(&$a, $items, $mode, $update, $page_mode = 'traditional') {
$tags=array();
$hashtags = array();
$mentions = array();
- foreach(explode(',',$item['tag']) as $tag){
- $tag = trim($tag);
- if ($tag!="") {
- $t = bbcode($tag);
- $tags[] = $t;
- if($t[0] == '#')
- $hashtags[] = $t;
- elseif($t[0] == '@')
- $mentions[] = $t;
- }
- }
$sp = false;
$profile_link = best_link_url($item,$sp);
@@ -573,12 +633,17 @@ function conversation(&$a, $items, $mode, $update, $page_mode = 'traditional') {
);
$star = false;
- $isstarred = "unstarred";
+ $isstarred = "unstarred icon-star-empty";
$lock = false;
$likebuttons = false;
$shareable = false;
+ $verified = (($item['item_flags'] & ITEM_VERIFIED) ? t('Message is verified') : '');
+ $unverified = '';
+
+
+
$tags=array();
$terms = get_terms_oftype($item['term'],array(TERM_HASHTAG,TERM_MENTION,TERM_UNKNOWN));
if(count($terms))
@@ -592,7 +657,7 @@ function conversation(&$a, $items, $mode, $update, $page_mode = 'traditional') {
$tmp_item = array(
'template' => $tpl,
'toplevel' => 'toplevel_item',
- 'tags' => $tags,
+ 'mode' => $mode,
'id' => (($preview) ? 'P0' : $item['item_id']),
'linktitle' => sprintf( t('View %s\'s profile @ %s'), $profile_name, $profile_url),
'profile_url' => $profile_link,
@@ -606,6 +671,8 @@ function conversation(&$a, $items, $mode, $update, $page_mode = 'traditional') {
'tags' => $tags,
'hashtags' => $hashtags,
'mentions' => $mentions,
+ 'verified' => $verified,
+ 'unverified' => $unverified,
'txt_cats' => t('Categories:'),
'txt_folders' => t('Filed under:'),
'has_cats' => ((count($categories)) ? 'true' : ''),
@@ -617,13 +684,15 @@ function conversation(&$a, $items, $mode, $update, $page_mode = 'traditional') {
'ago' => relative_date($item['created']),
'app' => $item['app'],
'str_app' => sprintf( t(' from %s'), $item['app']),
- 'localtime' => datetime_convert('UTC', date_default_timezone_get(), $item['created'], 'c'),
+ 'isotime' => datetime_convert('UTC', date_default_timezone_get(), $item['created'], 'c'),
+ 'localtime' => datetime_convert('UTC', date_default_timezone_get(), $item['created'], 'r'),
+ 'editedtime' => (($item['edited'] != $item['created']) ? sprintf( t('last edited: %s'), datetime_convert('UTC', date_default_timezone_get(), $item['edited'], 'r')) : ''),
'location' => $location,
'indent' => '',
'owner_name' => $owner_name,
'owner_url' => $owner_url,
'owner_photo' => $owner_photo,
- 'plink' => get_plink($item),
+ 'plink' => get_plink($item,false),
'edpost' => false,
'isstarred' => $isstarred,
'star' => $star,
@@ -632,7 +701,7 @@ function conversation(&$a, $items, $mode, $update, $page_mode = 'traditional') {
'like' => '',
'dislike' => '',
'comment' => '',
- 'conv' => (($preview) ? '' : array('href'=> z_root() . '/display/' . $item['uri'], 'title'=> t('View in context'))),
+ 'conv' => (($preview) ? '' : array('href'=> z_root() . '/display/' . $item['mid'], 'title'=> t('View in context'))),
'previewing' => $previewing,
'wait' => t('Please wait'),
'thread_level' => 1,
@@ -649,12 +718,20 @@ function conversation(&$a, $items, $mode, $update, $page_mode = 'traditional') {
}
else
{
+
// Normal View
+// logger('conv: items: ' . print_r($items,true));
require_once('include/ConversationObject.php');
require_once('include/ItemObject.php');
- $conv = new Conversation($mode, $preview);
+ $conv = new Conversation($mode, $preview, $prepared_item);
+
+ // In the display mode we don't have a profile owner.
+
+ if($mode === 'display' && $items)
+ $conv->set_profile_owner($items[0]['uid']);
+
// get all the topmost parents
// this shouldn't be needed, as we should have only them in our array
@@ -663,7 +740,33 @@ function conversation(&$a, $items, $mode, $update, $page_mode = 'traditional') {
$threads = array();
foreach($items as $item) {
- // Can we put this after the visibility check?
+ // Check for any blocked authors
+
+ if($arr_blocked) {
+ $blocked = false;
+ foreach($arr_blocked as $b) {
+ if(($b) && ($item['author_xchan'] == $b)) {
+ $blocked = true;
+ break;
+ }
+ }
+ if($blocked)
+ continue;
+ }
+
+ // Check all the kids too
+
+ if($arr_blocked && $item['children']) {
+ for($d = 0; $d < count($item['children']); $d ++) {
+ foreach($arr_blocked as $b) {
+ if(($b) && ($item['children'][$d]['author_xchan'] == $b))
+ $item['children'][$d]['author_blocked'] = true;
+ }
+ }
+ }
+
+
+
like_puller($a,$item,$alike,'like');
if(feature_enabled($profile_owner,'dislike'))
@@ -679,6 +782,9 @@ function conversation(&$a, $items, $mode, $update, $page_mode = 'traditional') {
// $tx1 = dba_timer();
$item_object = new Item($item);
$conv->add_thread($item_object);
+ if($page_mode === 'list')
+ $item_object->set_template('conv_list.tpl');
+
// $tx2 = dba_timer();
// if($mode === 'network')
// profiler($tx1,$tx2,'add thread ' . $item['id']);
@@ -720,8 +826,9 @@ function conversation(&$a, $items, $mode, $update, $page_mode = 'traditional') {
// logger('nouveau: ' . print_r($threads,true));
- $o = replace_macros($page_template, array(
+ $o .= replace_macros($page_template, array(
'$baseurl' => $a->get_baseurl($ssl_state),
+ '$photo_item' => $content_html,
'$live_update' => $live_update_div,
'$remove' => t('remove'),
'$mode' => $mode,
@@ -742,7 +849,7 @@ function conversation(&$a, $items, $mode, $update, $page_mode = 'traditional') {
return $o;
-}}
+}
function best_link_url($item) {
@@ -775,13 +882,19 @@ function best_link_url($item) {
}
-if(! function_exists('item_photo_menu')){
+
function item_photo_menu($item){
$a = get_app();
$contact = null;
$ssl_state = false;
+ $sub_link="";
+ $poke_link="";
+ $contact_url="";
+ $pm_url="";
+ $vsrc_link = "";
+
if(local_user()) {
$ssl_state = true;
if(! count($a->contacts))
@@ -790,25 +903,22 @@ function item_photo_menu($item){
$channel_hash = (($channel) ? $channel['channel_hash'] : '');
}
- $sub_link="";
- $poke_link="";
- $contact_url="";
- $pm_url="";
-
- if((local_user()) && local_user() == $item['uid'] && $item['parent'] == $item['id']
- && $channel && ($channel_hash != $item['author_xchan'])) {
- $sub_link = 'javascript:dosubthread(' . $item['id'] . '); return false;';
+ if((local_user()) && local_user() == $item['uid']) {
+ $vsrc_link = $a->get_baseurl() . '/viewsrc/' . $item['id'];
+ if($item['parent'] == $item['id'] && $channel && ($channel_hash != $item['author_xchan'])) {
+ $sub_link = 'javascript:dosubthread(' . $item['id'] . '); return false;';
+ }
}
$profile_link = z_root() . "/chanview/?f=&hash=" . $item['author_xchan'];
- $pm_url = $a->get_baseurl($ssl_state) . '/message/new/?f=&hash=' . $item['author_xchan'];
+ $pm_url = $a->get_baseurl($ssl_state) . '/mail/new/?f=&hash=' . $item['author_xchan'];
if($a->contacts && array_key_exists($item['author_xchan'],$a->contacts))
$contact = $a->contacts[$item['author_xchan']];
if($contact) {
$poke_link = $a->get_baseurl($ssl_state) . '/poke/?f=&c=' . $contact['abook_id'];
- $contact_url = $a->get_baseurl($ssl_state) . '/connections/' . $contact['abook_id'];
+ $contact_url = $a->get_baseurl($ssl_state) . '/connedit/' . $contact['abook_id'];
$posts_link = $a->get_baseurl($ssl_state) . '/network/?cid=' . $contact['abook_id'];
$clean_url = normalise_link($item['author-link']);
@@ -816,11 +926,12 @@ function item_photo_menu($item){
}
$menu = Array(
+ t("View Source") => $vsrc_link,
t("Follow Thread") => $sub_link,
t("View Status") => $status_link,
t("View Profile") => $profile_link,
t("View Photos") => $photos_link,
- t("Network Posts") => $posts_link,
+ t("Matrix Activity") => $posts_link,
t("Edit Contact") => $contact_url,
t("Send PM") => $pm_url,
t("Poke") => $poke_link
@@ -842,9 +953,9 @@ function item_photo_menu($item){
elseif ($v!="") $o .= "<li><a href=\"$v\">$k</a></li>\n";
}
return $o;
-}}
+}
+
-if(! function_exists('like_puller')) {
function like_puller($a,$item,&$arr,$mode) {
$url = '';
@@ -861,7 +972,7 @@ function like_puller($a,$item,&$arr,$mode) {
$url = zid($url);
if(! $item['thr_parent'])
- $item['thr_parent'] = $item['parent_uri'];
+ $item['thr_parent'] = $item['parent_mid'];
if(! ((isset($arr[$item['thr_parent'] . '-l'])) && (is_array($arr[$item['thr_parent'] . '-l']))))
$arr[$item['thr_parent'] . '-l'] = array();
@@ -872,7 +983,7 @@ function like_puller($a,$item,&$arr,$mode) {
$arr[$item['thr_parent'] . '-l'][] = '<a href="'. $url . '"'. $sparkle .'>' . $item['author']['xchan_name'] . '</a>';
}
return;
-}}
+}
// Format the like/dislike text for a profile item
// $cnt = number of people who like/dislike the item
@@ -881,7 +992,7 @@ function like_puller($a,$item,&$arr,$mode) {
// $id = item id
// returns formatted text
-if(! function_exists('format_like')) {
+
function format_like($cnt,$arr,$type,$id) {
$o = '';
if($cnt == 1)
@@ -889,9 +1000,9 @@ function format_like($cnt,$arr,$type,$id) {
else {
$spanatts = 'class="fakelink" onclick="openClose(\'' . $type . 'list-' . $id . '\');"';
$o .= (($type === 'like') ?
- sprintf( t('<span %1$s>%2$d people</span> like this.'), $spanatts, $cnt)
+ sprintf( tt('<span %1$s>%2$d people</span> like this.','<span %1$s>%2$d people</span> like this.',$cnt), $spanatts, $cnt)
:
- sprintf( t('<span %1$s>%2$d people</span> don\'t like this.'), $spanatts, $cnt) );
+ sprintf( tt('<span %1$s>%2$d people</span> don\'t like this.','<span %1$s>%2$d people</span> don\'t like this.',$cnt), $spanatts, $cnt) );
$o .= EOL ;
$total = count($arr);
if($total >= MAX_LIKERS)
@@ -900,12 +1011,12 @@ function format_like($cnt,$arr,$type,$id) {
$arr[count($arr)-1] = t('and') . ' ' . $arr[count($arr)-1];
$str = implode(', ', $arr);
if($total >= MAX_LIKERS)
- $str .= sprintf( t(', and %d other people'), $total - MAX_LIKERS );
+ $str .= sprintf( tt(', and %d other people',', and %d other people',$total - MAX_LIKERS), $total - MAX_LIKERS );
$str = (($type === 'like') ? sprintf( t('%s like this.'), $str) : sprintf( t('%s don\'t like this.'), $str));
$o .= "\t" . '<div id="' . $type . 'list-' . $id . '" style="display: none;" >' . $str . '</div>';
}
return $o;
-}}
+}
function status_editor($a,$x,$popup=false) {
@@ -915,9 +1026,34 @@ function status_editor($a,$x,$popup=false) {
$geotag = (($x['allow_location']) ? replace_macros(get_markup_template('jot_geotag.tpl'), array()) : '');
$plaintext = true;
+
if(feature_enabled(local_user(),'richtext'))
$plaintext = false;
+ $mimeselect = '';
+ if(array_key_exists('mimetype',$x) && $x['mimetype']) {
+ if($x['mimetype'] != 'text/bbcode')
+ $plaintext = true;
+ if($x['mimetype'] === 'choose') {
+ $mimeselect = mimetype_select($x['profile_uid']);
+ }
+ else
+ $mimeselect = '<input type="hidden" name="mimetype" value="' . $x['mimetype'] . '" />';
+ }
+
+ $layoutselect = '';
+ if(array_key_exists('layout',$x) && $x['layout']) {
+ if($x['layout'] === 'choose') {
+ $layoutselect = layout_select($x['profile_uid']);
+ }
+ else
+ $layoutselect = '<input type="hidden" name="layout_mid" value="' . $x['layout'] . '" />';
+ }
+
+
+
+ $webpage = ((x($x,'webpage')) ? $x['webpage'] : '');
+
$tpl = get_markup_template('jot-header.tpl');
$a->page['htmlhead'] .= replace_macros($tpl, array(
@@ -932,7 +1068,8 @@ function status_editor($a,$x,$popup=false) {
'$audurl' => t("Please enter an audio link/URL:"),
'$term' => t('Tag term:'),
'$fileas' => t('Save to Folder:'),
- '$whereareu' => t('Where are you right now?')
+ '$whereareu' => t('Where are you right now?'),
+ '$expireswhen' => t('Expires YYYY-MM-DD HH:MM')
));
@@ -941,13 +1078,25 @@ function status_editor($a,$x,$popup=false) {
$jotplugins = '';
$jotnets = '';
+
+ $preview = ((feature_enabled($x['profile_uid'],'preview')) ? t('Preview') : '');
+ if(x($x,'nopreview'))
+ $preview = '';
+
+ $cipher = get_pconfig($x['profile_uid'],'system','default_cipher');
+ if(! $cipher)
+ $cipher = 'aes256';
+
call_hooks('jot_tool', $jotplugins);
call_hooks('jot_networks', $jotnets);
$o .= replace_macros($tpl,array(
- '$return_path' => $a->query_string,
+ '$return_path' => ((x($x,'return_path')) ? $x['return_path'] : $a->query_string),
'$action' => $a->get_baseurl(true) . '/item',
'$share' => (x($x,'button') ? $x['button'] : t('Share')),
+ '$webpage' => $webpage,
+ '$placeholdpagetitle' => ((x($x,'ptlabel')) ? $x['ptlabel'] : t('Page link title')),
+ '$pagetitle' => (x($x,'pagetitle') ? $x['pagetitle'] : ''),
'$upload' => t('Upload photo'),
'$shortupload' => t('upload photo'),
'$attach' => t('Attach file'),
@@ -962,16 +1111,16 @@ function status_editor($a,$x,$popup=false) {
'$shortsetloc' => t('set location'),
'$noloc' => t('Clear browser location'),
'$shortnoloc' => t('clear location'),
- '$title' => "",
+ '$title' => ((x($x,'title')) ? htmlspecialchars($x['title'], ENT_COMPAT,'UTF-8') : ''),
'$placeholdertitle' => t('Set title'),
- '$catsenabled' => ((feature_enabled($x['profile_uid'],'categories')) ? 'categories' : ''),
+ '$catsenabled' => ((feature_enabled($x['profile_uid'],'categories') && (! $webpage)) ? 'categories' : ''),
'$category' => "",
'$placeholdercategory' => t('Categories (comma-separated list)'),
'$wait' => t('Please wait'),
'$permset' => t('Permission settings'),
'$shortpermset' => t('permissions'),
'$ptyp' => (($notes_cid) ? 'note' : 'wall'),
- '$content' => '',
+ '$content' => ((x($x,'body')) ? htmlspecialchars($x['body'], ENT_COMPAT,'UTF-8') : ''),
'$post_id' => '',
'$baseurl' => $a->get_baseurl(true),
'$defloc' => $x['default_location'],
@@ -982,11 +1131,22 @@ function status_editor($a,$x,$popup=false) {
'$emtitle' => t('Example: bob@example.com, mary@example.com'),
'$lockstate' => $x['lockstate'],
'$acl' => $x['acl'],
+ '$mimeselect' => $mimeselect,
+ '$layoutselect' => $layoutselect,
+ '$showacl' => ((array_key_exists('showacl',$x)) ? $x['showacl'] : 'yes'),
'$bang' => $x['bang'],
'$profile_uid' => $x['profile_uid'],
- '$preview' => ((feature_enabled($x['profile_uid'],'preview')) ? t('Preview') : ''),
- '$sourceapp' => t($a->sourcename),
+ '$preview' => $preview,
+ '$source' => ((x($x,'source')) ? $x['source'] : ''),
'$jotplugins' => $jotplugins,
+ '$defexpire' => '',
+ '$feature_expire' => ((feature_enabled($x['profile_uid'],'content_expire') && (! $webpage)) ? 'block' : 'none'),
+ '$expires' => t('Set expiration date'),
+ '$feature_encrypt' => ((feature_enabled($x['profile_uid'],'content_encrypt') && (! $webpage)) ? 'block' : 'none'),
+ '$encrypt' => t('Encrypt text'),
+ '$cipher' => $cipher,
+ '$expiryModalOK' => t('OK'),
+ '$expiryModalCANCEL' => t('Cancel'),
));
@@ -1004,12 +1164,12 @@ function get_item_children($arr, $parent) {
foreach($arr as $item) {
if($item['id'] != $item['parent']) {
if(get_config('system','thread_allow')) {
- // Fallback to parent_uri if thr_parent is not set
+ // Fallback to parent_mid if thr_parent is not set
$thr_parent = $item['thr_parent'];
if($thr_parent == '')
- $thr_parent = $item['parent_uri'];
+ $thr_parent = $item['parent_mid'];
- if($thr_parent == $parent['uri']) {
+ if($thr_parent == $parent['mid']) {
$item['children'] = get_item_children($arr, $item);
$children[] = $item;
}
@@ -1057,6 +1217,9 @@ function conv_sort($arr,$order) {
usort($parents,'sort_thr_created');
elseif(stristr($order,'commented'))
usort($parents,'sort_thr_commented');
+ elseif(stristr($order,'ascending'))
+ usort($parents,'sort_thr_created_rev');
+
if(count($parents))
foreach($parents as $i=>$_x)
@@ -1133,12 +1296,217 @@ function render_location_default($item) {
function prepare_page($item) {
+
+ $a = get_app();
+ $naked = ((get_pconfig($item['uid'],'system','nakedpage')) ? 1 : 0);
+ $observer = $a->get_observer();
+ $zid = ($observer['xchan_addr']);
+
+ if(array_key_exists('webpage',$a->layout) && array_key_exists('authored',$a->layout['webpage'])) {
+ if($a->layout['webpage']['authored'] === 'none')
+ $naked = 1;
+ // ... other possible options
+ }
return replace_macros(get_markup_template('page_display.tpl'),array(
- '$author' => $item['author']['xchan_name'],
- '$auth_url' => $item['author']['xchan_url'],
- '$date' => datetime_convert('UTC',date_default_timezone_get(),$item['created'],'Y-m-d H:i'),
+ '$author' => (($naked) ? '' : $item['author']['xchan_name']),
+ '$auth_url' => (($naked) ? '' : $item['author']['xchan_url']),
+ '$zid' => $zid,
+ '$date' => (($naked) ? '' : datetime_convert('UTC',date_default_timezone_get(),$item['created'],'Y-m-d H:i')),
'$title' => smilies(bbcode($item['title'])),
- '$body' => smilies(bbcode($item['body']))
+ '$body' => prepare_body($item,true)
));
}
+
+function network_tabs() {
+ $a = get_app();
+ $no_active='';
+ $starred_active = '';
+ $new_active = '';
+ $all_active = '';
+ $search_active = '';
+ $conv_active = '';
+ $spam_active = '';
+ $postord_active = '';
+
+ if(x($_GET,'new')) {
+ $new_active = 'active';
+ }
+
+ if(x($_GET,'search')) {
+ $search_active = 'active';
+ }
+
+ if(x($_GET,'star')) {
+ $starred_active = 'active';
+ }
+
+ if(x($_GET,'conv')) {
+ $conv_active = 'active';
+ }
+
+ if(x($_GET,'spam')) {
+ $spam_active = 'active';
+ }
+
+
+
+ if (($new_active == '')
+ && ($starred_active == '')
+ && ($conv_active == '')
+ && ($search_active == '')
+ && ($spam_active == '')) {
+ $no_active = 'active';
+ }
+
+ if ($no_active=='active' && x($_GET,'order')) {
+ switch($_GET['order']){
+ case 'post': $postord_active = 'active'; $no_active=''; break;
+ case 'comment' : $all_active = 'active'; $no_active=''; break;
+ }
+ }
+
+ if ($no_active=='active') $all_active='active';
+
+ $cmd = $a->cmd;
+
+ // tabs
+ $tabs = array(
+ array(
+ 'label' => t('Commented Order'),
+ 'url'=>$a->get_baseurl(true) . '/' . $cmd . '?f=&order=comment' . ((x($_GET,'cid')) ? '&cid=' . $_GET['cid'] : ''),
+ 'sel'=>$all_active,
+ 'title'=> t('Sort by Comment Date'),
+ ),
+ array(
+ 'label' => t('Posted Order'),
+ 'url'=>$a->get_baseurl(true) . '/' . $cmd . '?f=&order=post' . ((x($_GET,'cid')) ? '&cid=' . $_GET['cid'] : ''),
+ 'sel'=>$postord_active,
+ 'title' => t('Sort by Post Date'),
+ ),
+
+ array(
+ 'label' => t('Personal'),
+ 'url' => $a->get_baseurl(true) . '/' . $cmd . ((x($_GET,'cid')) ? '/?f=&cid=' . $_GET['cid'] : '') . '&conv=1',
+ 'sel' => $conv_active,
+ 'title' => t('Posts that mention or involve you'),
+ ),
+ array(
+ 'label' => t('New'),
+ 'url' => $a->get_baseurl(true) . '/' . $cmd . ((x($_GET,'cid')) ? '/?f=&cid=' . $_GET['cid'] : '') . '&new=1',
+ 'sel' => $new_active,
+ 'title' => t('Activity Stream - by date'),
+ ),
+
+ );
+
+ if(feature_enabled(local_user(),'star_posts'))
+ $tabs[] = array(
+ 'label' => t('Starred'),
+ 'url'=>$a->get_baseurl(true) . '/' . $cmd . ((x($_GET,'cid')) ? '/?f=&cid=' . $_GET['cid'] : '') . '&star=1',
+ 'sel'=>$starred_active,
+ 'title' => t('Favourite Posts'),
+ );
+
+ // Not yet implemented
+
+ if(feature_enabled(local_user(),'spam_filter'))
+ $tabs[] = array(
+ 'label' => t('Spam'),
+ 'url'=>$a->get_baseurl(true) . '/network?f=&spam=1',
+ 'sel'=> $spam_active,
+ 'title' => t('Posts flagged as SPAM'),
+ );
+
+ $arr = array('tabs' => $tabs);
+ call_hooks('network_tabs', $arr);
+
+ $tpl = get_markup_template('common_tabs.tpl');
+
+ return replace_macros($tpl,array('$tabs' => $arr['tabs']));
+
+}
+
+
+
+function profile_tabs($a, $is_owner=False, $nickname=Null){
+ //echo "<pre>"; var_dump($a->user); killme();
+
+ $channel = $a->get_channel();
+
+ if (is_null($nickname))
+ $nickname = $channel['channel_address'];
+
+ if(x($_GET,'tab'))
+ $tab = notags(trim($_GET['tab']));
+
+ $url = $a->get_baseurl() . '/channel/' . $nickname;
+ $pr = $a->get_baseurl() . '/profile/' . $nickname;
+
+ $tabs = array(
+ array(
+ 'label' => t('Channel'),
+ 'url' => $url,
+ 'sel' => ((argv(0) == 'channel') ? 'active' : ''),
+ 'title' => t('Status Messages and Posts'),
+ 'id' => 'status-tab',
+ ),
+ array(
+ 'label' => t('About'),
+ 'url' => $pr,
+ 'sel' => ((argv(0) == 'profile') ? 'active' : ''),
+ 'title' => t('Profile Details'),
+ 'id' => 'profile-tab',
+ ),
+ array(
+ 'label' => t('Photos'),
+ 'url' => $a->get_baseurl() . '/photos/' . $nickname,
+ 'sel' => ((argv(0) == 'photos') ? 'active' : ''),
+ 'title' => t('Photo Albums'),
+ 'id' => 'photo-tab',
+ ),
+
+ array(
+ 'label' => t('Files'),
+ 'url' => $a->get_baseurl() . '/cloud/' . $nickname,
+ 'sel' => ((argv(0) == 'cloud') ? 'active' : ''),
+ 'title' => t('Files and Storage'),
+ 'id' => 'files-tab',
+ ),
+
+ );
+
+
+ if ($is_owner){
+ $tabs[] = array(
+ 'label' => t('Events'),
+ 'url' => $a->get_baseurl() . '/events',
+ 'sel' => ((argv(0) == 'events') ? 'active' : ''),
+ 'title' => t('Events and Calendar'),
+ 'id' => 'events-tab',
+ );
+ if(feature_enabled(local_user(),'webpages')){
+ $tabs[] = array(
+ 'label' => t('Webpages'),
+ 'url' => $a->get_baseurl() . '/webpages/' . $nickname,
+ 'sel' => ((argv(0) == 'webpages') ? 'active' : ''),
+ 'title' => t('Manage Webpages'),
+ 'id' => 'webpages-tab',
+ );}
+ }
+ else {
+ // FIXME
+ // we probably need a listing of events that were created by
+ // this channel and are visible to the observer
+
+
+ }
+
+
+ $arr = array('is_owner' => $is_owner, 'nickname' => $nickname, 'tab' => (($tab) ? $tab : false), 'tabs' => $tabs);
+ call_hooks('profile_tabs', $arr);
+
+ $tpl = get_markup_template('common_tabs.tpl');
+
+ return replace_macros($tpl,array('$tabs' => $arr['tabs']));
+}
diff --git a/include/cronhooks.php b/include/cronhooks.php
index 9ff8141c4..a314593d2 100644
--- a/include/cronhooks.php
+++ b/include/cronhooks.php
@@ -1,4 +1,4 @@
-<?php
+<?php /** @file */
require_once('boot.php');
require_once('include/cli_startup.php');
diff --git a/include/crypto.php b/include/crypto.php
index a646910a1..33cdc10c0 100644
--- a/include/crypto.php
+++ b/include/crypto.php
@@ -1,12 +1,11 @@
-<?php
-
-require_once('library/ASNValue.class.php');
-require_once('library/asn1.php');
+<?php /** @file */
function rsa_sign($data,$key,$alg = 'sha256') {
if(! $key)
return 'no key';
$sig = '';
+ if(intval(OPENSSL_ALGO_SHA256) && $alg === 'sha256')
+ $alg = OPENSSL_ALGO_SHA256;
openssl_sign($data,$sig,$key,$alg);
return $sig;
}
@@ -16,168 +15,12 @@ function rsa_verify($data,$sig,$key,$alg = 'sha256') {
if(! $key)
return false;
+ if(intval(OPENSSL_ALGO_SHA256) && $alg === 'sha256')
+ $alg = OPENSSL_ALGO_SHA256;
$verify = openssl_verify($data,$sig,$key,$alg);
return $verify;
}
-
-function DerToPem($Der, $Private=false)
-{
- //Encode:
- $Der = base64_encode($Der);
- //Split lines:
- $lines = str_split($Der, 65);
- $body = implode("\n", $lines);
- //Get title:
- $title = $Private? 'RSA PRIVATE KEY' : 'PUBLIC KEY';
- //Add wrapping:
- $result = "-----BEGIN {$title}-----\n";
- $result .= $body . "\n";
- $result .= "-----END {$title}-----\n";
-
- return $result;
-}
-
-function DerToRsa($Der)
-{
- //Encode:
- $Der = base64_encode($Der);
- //Split lines:
- $lines = str_split($Der, 64);
- $body = implode("\n", $lines);
- //Get title:
- $title = 'RSA PUBLIC KEY';
- //Add wrapping:
- $result = "-----BEGIN {$title}-----\n";
- $result .= $body . "\n";
- $result .= "-----END {$title}-----\n";
-
- return $result;
-}
-
-
-function pkcs8_encode($Modulus,$PublicExponent) {
- //Encode key sequence
- $modulus = new ASNValue(ASNValue::TAG_INTEGER);
- $modulus->SetIntBuffer($Modulus);
- $publicExponent = new ASNValue(ASNValue::TAG_INTEGER);
- $publicExponent->SetIntBuffer($PublicExponent);
- $keySequenceItems = array($modulus, $publicExponent);
- $keySequence = new ASNValue(ASNValue::TAG_SEQUENCE);
- $keySequence->SetSequence($keySequenceItems);
- //Encode bit string
- $bitStringValue = $keySequence->Encode();
- $bitStringValue = chr(0x00) . $bitStringValue; //Add unused bits byte
- $bitString = new ASNValue(ASNValue::TAG_BITSTRING);
- $bitString->Value = $bitStringValue;
- //Encode body
- $bodyValue = "\x30\x0d\x06\x09\x2a\x86\x48\x86\xf7\x0d\x01\x01\x01\x05\x00" . $bitString->Encode();
- $body = new ASNValue(ASNValue::TAG_SEQUENCE);
- $body->Value = $bodyValue;
- //Get DER encoded public key:
- $PublicDER = $body->Encode();
- return $PublicDER;
-}
-
-
-function pkcs1_encode($Modulus,$PublicExponent) {
- //Encode key sequence
- $modulus = new ASNValue(ASNValue::TAG_INTEGER);
- $modulus->SetIntBuffer($Modulus);
- $publicExponent = new ASNValue(ASNValue::TAG_INTEGER);
- $publicExponent->SetIntBuffer($PublicExponent);
- $keySequenceItems = array($modulus, $publicExponent);
- $keySequence = new ASNValue(ASNValue::TAG_SEQUENCE);
- $keySequence->SetSequence($keySequenceItems);
- //Encode bit string
- $bitStringValue = $keySequence->Encode();
- return $bitStringValue;
-}
-
-
-function metopem($m,$e) {
- $der = pkcs8_encode($m,$e);
- $key = DerToPem($der,false);
- return $key;
-}
-
-
-function pubrsatome($key,&$m,&$e) {
- require_once('library/asn1.php');
-
- $lines = explode("\n",$key);
- unset($lines[0]);
- unset($lines[count($lines)]);
- $x = base64_decode(implode('',$lines));
-
- $r = ASN_BASE::parseASNString($x);
-
- $m = base64url_decode($r[0]->asnData[0]->asnData);
- $e = base64url_decode($r[0]->asnData[1]->asnData);
-}
-
-
-function rsatopem($key) {
- pubrsatome($key,$m,$e);
- return(metopem($m,$e));
-}
-
-function pemtorsa($key) {
- pemtome($key,$m,$e);
- return(metorsa($m,$e));
-}
-
-function pemtome($key,&$m,&$e) {
- $lines = explode("\n",$key);
- unset($lines[0]);
- unset($lines[count($lines)]);
- $x = base64_decode(implode('',$lines));
-
- $r = ASN_BASE::parseASNString($x);
-
- $m = base64url_decode($r[0]->asnData[1]->asnData[0]->asnData[0]->asnData);
- $e = base64url_decode($r[0]->asnData[1]->asnData[0]->asnData[1]->asnData);
-}
-
-function metorsa($m,$e) {
- $der = pkcs1_encode($m,$e);
- $key = DerToRsa($der);
- return $key;
-}
-
-function salmon_key($pubkey) {
- pemtome($pubkey,$m,$e);
- return 'RSA' . '.' . base64url_encode($m,true) . '.' . base64url_encode($e,true) ;
-}
-
-
-
-if(! function_exists('aes_decrypt')) {
-function aes_decrypt($val,$ky)
-{
- $key="\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
- for($a=0;$a<strlen($ky);$a++)
- $key[$a%16]=chr(ord($key[$a%16]) ^ ord($ky[$a]));
- $mode = MCRYPT_MODE_ECB;
- $enc = MCRYPT_RIJNDAEL_128;
- $dec = @mcrypt_decrypt($enc, $key, $val, $mode, @mcrypt_create_iv( @mcrypt_get_iv_size($enc, $mode), MCRYPT_DEV_URANDOM ) );
- return rtrim($dec,(( ord(substr($dec,strlen($dec)-1,1))>=0 and ord(substr($dec, strlen($dec)-1,1))<=16)? chr(ord( substr($dec,strlen($dec)-1,1))):null));
-}}
-
-
-if(! function_exists('aes_encrypt')) {
-function aes_encrypt($val,$ky)
-{
- $key="\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
- for($a=0;$a<strlen($ky);$a++)
- $key[$a%16]=chr(ord($key[$a%16]) ^ ord($ky[$a]));
- $mode=MCRYPT_MODE_ECB;
- $enc=MCRYPT_RIJNDAEL_128;
- $val=str_pad($val, (16*(floor(strlen($val) / 16)+(strlen($val) % 16==0?2:1))), chr(16-(strlen($val) % 16)));
- return mcrypt_encrypt($enc, $key, $val, $mode, mcrypt_create_iv( mcrypt_get_iv_size($enc, $mode), MCRYPT_DEV_URANDOM));
-}}
-
-
function pkcs5_pad ($text, $blocksize)
{
$pad = $blocksize - (strlen($text) % $blocksize);
@@ -210,17 +53,41 @@ function AES256CBC_decrypt($data,$key,$iv) {
str_pad($iv,16,"\0")));
}
+function crypto_encapsulate($data,$pubkey,$alg='aes256cbc') {
+ if($alg === 'aes256cbc')
+ return aes_encapsulate($data,$pubkey);
+
+}
+
+
function aes_encapsulate($data,$pubkey) {
+ if(! $pubkey)
+ logger('aes_encapsulate: no key. data: ' . $data);
$key = random_string(32,RANDOM_STRING_TEXT);
$iv = random_string(16,RANDOM_STRING_TEXT);
$result['data'] = base64url_encode(AES256CBC_encrypt($data,$key,$iv),true);
- openssl_public_encrypt($key,$k,$pubkey);
- $result['key'] = base64url_encode($k,true);
+ // log the offending call so we can track it down
+ if(! openssl_public_encrypt($key,$k,$pubkey)) {
+ $x = debug_backtrace();
+ logger('aes_encapsulate: RSA failed. ' . print_r($x[0],true));
+ }
+ $result['alg'] = 'aes256cbc';
+ $result['key'] = base64url_encode($k,true);
openssl_public_encrypt($iv,$i,$pubkey);
$result['iv'] = base64url_encode($i,true);
return $result;
}
+function crypto_unencapsulate($data,$prvkey) {
+ if(! $data)
+ return;
+ $alg = ((array_key_exists('alg',$data)) ? $data['alg'] : 'aes256cbc');
+ if($alg === 'aes256cbc')
+ return aes_unencapsulate($data,$prvkey);
+
+}
+
+
function aes_unencapsulate($data,$prvkey) {
openssl_private_decrypt(base64url_decode($data['key']),$k,$prvkey);
openssl_private_decrypt(base64url_decode($data['iv']),$i,$prvkey);
diff --git a/include/datetime.php b/include/datetime.php
index a573e43a2..c0503fc7d 100644
--- a/include/datetime.php
+++ b/include/datetime.php
@@ -1,8 +1,8 @@
-<?php
+<?php /** @file */
// two-level sort for timezones.
-if(! function_exists('timezone_cmp')) {
+
function timezone_cmp($a, $b) {
if(strstr($a,'/') && strstr($b,'/')) {
if ( t($a) == t($b)) return 0;
@@ -12,10 +12,10 @@ function timezone_cmp($a, $b) {
if(strstr($b,'/')) return 1;
if ( t($a) == t($b)) return 0;
return ( t($a) < t($b)) ? -1 : 1;
-}}
+}
// emit a timezone selector grouped (primarily) by continent
-if(! function_exists('select_timezone')) {
+
function select_timezone($current = 'America/Los_Angeles') {
$timezone_identifiers = DateTimeZone::listIdentifiers();
@@ -52,13 +52,13 @@ function select_timezone($current = 'America/Los_Angeles') {
}
$o .= '</optgroup></select>';
return $o;
-}}
+}
// return a select using 'field_select_raw' template, with timezones
// groupped (primarily) by continent
// arguments follow convetion as other field_* template array:
// 'name', 'label', $value, 'help'
-if (!function_exists('field_timezone')){
+
function field_timezone($name='timezone', $label='', $current = 'America/Los_Angeles', $help){
$options = select_timezone($current);
$options = str_replace('<select id="timezone_select" name="timezone">','', $options);
@@ -69,7 +69,7 @@ function field_timezone($name='timezone', $label='', $current = 'America/Los_Ang
'$field' => array($name, $label, $current, $help, $options),
));
-}}
+}
// General purpose date parse/convert function.
// $from = source timezone
@@ -77,7 +77,7 @@ function field_timezone($name='timezone', $label='', $current = 'America/Los_Ang
// $s = some parseable date/time string
// $fmt = output format
-if(! function_exists('datetime_convert')) {
+
function datetime_convert($from = 'UTC', $to = 'UTC', $s = 'now', $fmt = "Y-m-d H:i:s") {
// Defaults to UTC if nothing is set, but throws an exception if set to empty string.
@@ -124,7 +124,7 @@ function datetime_convert($from = 'UTC', $to = 'UTC', $s = 'now', $fmt = "Y-m-d
$d->setTimeZone($to_obj);
return($d->format($fmt));
-}}
+}
// wrapper for date selector, tailored for use in birthday fields
@@ -180,7 +180,7 @@ function datesel_format($f) {
// $m = already selected month
// $d = already selected day
-if(! function_exists('datesel')) {
+
function datesel($f,$pre,$ymin,$ymax,$allow_blank,$y,$m,$d) {
$o = '';
@@ -231,9 +231,9 @@ function datesel($f,$pre,$ymin,$ymax,$allow_blank,$y,$m,$d) {
$o .= "</select>";
return $o;
-}}
+}
+
-if(! function_exists('timesel')) {
function timesel($pre,$h,$m) {
$o = '';
@@ -250,7 +250,7 @@ function timesel($pre,$h,$m) {
$o .= "</select>";
return $o;
-}}
+}
@@ -264,7 +264,7 @@ function timesel($pre,$h,$m) {
// Results relative to current timezone
// Limited to range of timestamps
-if(! function_exists('relative_date')) {
+
function relative_date($posted_date,$format = null) {
$localtime = datetime_convert('UTC',date_default_timezone_get(),$posted_date);
@@ -300,7 +300,7 @@ function relative_date($posted_date,$format = null) {
return sprintf( $format,$r, (($r == 1) ? $str[0] : $str[1]));
}
}
-}}
+}
@@ -341,7 +341,7 @@ function age($dob,$owner_tz = '',$viewer_tz = '') {
// $month[1] = 'January';
// to match human usage.
-if(! function_exists('get_dim')) {
+
function get_dim($y,$m) {
$dim = array( 0,
@@ -353,7 +353,7 @@ function get_dim($y,$m) {
if(((($y % 4) == 0) && (($y % 100) != 0)) || (($y % 400) == 0))
return 29;
return $dim[2];
-}}
+}
// Returns the first day in month for a given month, year
@@ -361,11 +361,11 @@ function get_dim($y,$m) {
// returns 0 = Sunday through 6 = Saturday
// Months start at 1.
-if(! function_exists('get_first_dim')) {
+
function get_first_dim($y,$m) {
$d = sprintf('%04d-%02d-01 00:00', intval($y), intval($m));
return datetime_convert('UTC','UTC',$d,'w');
-}}
+}
// output a calendar for the given month, year.
// if $links are provided (array), e.g. $links[12] => 'http://mylink' ,
@@ -376,8 +376,6 @@ function get_first_dim($y,$m) {
// TODO: provide (prev,next) links, define class variations for different size calendars
-
-if(! function_exists('cal')) {
function cal($y = 0,$m = 0, $links = false, $class='') {
@@ -442,6 +440,27 @@ function cal($y = 0,$m = 0, $links = false, $class='') {
$o .= '</tr></table>'."\r\n";
return $o;
-}}
+}
+
+
+function z_birthday($dob,$tz,$format="Y-m-d H:i:s") {
+
+ if(! strlen($tz))
+ $tz = 'UTC';
+
+ $tmp_dob = substr($dob,5);
+ if(intval($tmp_dob)) {
+ $y = datetime_convert($tz,$tz,'now','Y');
+ $bd = $y . '-' . $tmp_dob . ' 00:00';
+ $t_dob = strtotime($bd);
+ $now = strtotime(datetime_convert($tz,$tz,'now'));
+ if($t_dob < $now)
+ $bd = $y + 1 . '-' . $tmp_dob . ' 00:00';
+ $birthday = datetime_convert($tz,'UTC',$bd,$format);
+ }
+
+ return $birthday;
+
+}
diff --git a/include/dba.php b/include/dba.php
deleted file mode 100644
index d1502af12..000000000
--- a/include/dba.php
+++ /dev/null
@@ -1,289 +0,0 @@
-<?php
-
-require_once('include/datetime.php');
-
-/**
- *
- * MySQL database class
- *
- * For debugging, insert 'dbg(1);' anywhere in the program flow.
- * dbg(0); will turn it off. Logging is performed at LOGGER_DATA level.
- * When logging, all binary info is converted to text and html entities are escaped so that
- * the debugging stream is safe to view within both terminals and web pages.
- *
- */
-
-if(! class_exists('dba')) {
-class dba {
-
- private $debug = 0;
- private $db;
- public $mysqli = true;
- public $connected = false;
- public $error = false;
-
- function __construct($server,$user,$pass,$db,$install = false) {
-
- $server = trim($server);
- $user = trim($user);
- $pass = trim($pass);
- $db = trim($db);
-
- if (!(strlen($server) && strlen($user))){
- $this->connected = false;
- $this->db = null;
- return;
- }
-
- if($install) {
- if(strlen($server) && ($server !== 'localhost') && ($server !== '127.0.0.1')) {
- if(! dns_get_record($server, DNS_A + DNS_CNAME + DNS_PTR)) {
- $this->error = sprintf( t('Cannot locate DNS info for database server \'%s\''), $server);
- $this->connected = false;
- $this->db = null;
- return;
- }
- }
- }
-
- if(class_exists('mysqli')) {
- $this->db = @new mysqli($server,$user,$pass,$db);
- if(! mysqli_connect_errno()) {
- $this->connected = true;
- }
- }
- else {
- $this->mysqli = false;
- $this->db = mysql_connect($server,$user,$pass);
- if($this->db && mysql_select_db($db,$this->db)) {
- $this->connected = true;
- }
- }
- if(! $this->connected) {
- $this->db = null;
- if(! $install)
- system_unavailable();
- }
- }
-
- public function getdb() {
- return $this->db;
- }
-
- public function q($sql) {
- global $a;
-
- if((! $this->db) || (! $this->connected))
- return false;
-
- $this->error = '';
-
- if(x($a->config,'system') && x($a->config['system'],'db_log'))
- $stamp1 = microtime(true);
-
- if($this->mysqli)
- $result = @$this->db->query($sql);
- else
- $result = @mysql_query($sql,$this->db);
-
- if(x($a->config,'system') && x($a->config['system'],'db_log')) {
- $stamp2 = microtime(true);
- $duration = round($stamp2-$stamp1, 3);
- if ($duration > $a->config["system"]["db_loglimit"]) {
- $backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);
- @file_put_contents($a->config["system"]["db_log"], $duration."\t".
- basename($backtrace[1]["file"])."\t".
- $backtrace[1]["line"]."\t".$backtrace[2]["function"]."\t".
- substr($sql, 0, 2000)."\n", FILE_APPEND);
- }
- }
-
- if($this->mysqli) {
- if($this->db->errno)
- $this->error = $this->db->error;
- }
- elseif(mysql_errno($this->db))
- $this->error = mysql_error($this->db);
-
- if(strlen($this->error)) {
- logger('dba: ' . $this->error);
- }
-
- if($this->debug) {
-
- $mesg = '';
-
- if($result === false)
- $mesg = 'false';
- elseif($result === true)
- $mesg = 'true';
- else {
- if($this->mysqli)
- $mesg = $result->num_rows . ' results' . EOL;
- else
- $mesg = mysql_num_rows($result) . ' results' . EOL;
- }
-
- $str = 'SQL = ' . printable($sql) . EOL . 'SQL returned ' . $mesg
- . (($this->error) ? ' error: ' . $this->error : '')
- . EOL;
-
- logger('dba: ' . $str );
- }
-
- /**
- * If dbfail.out exists, we will write any failed calls directly to it,
- * regardless of any logging that may or may nor be in effect.
- * These usually indicate SQL syntax errors that need to be resolved.
- */
-
- if($result === false) {
- logger('dba: ' . printable($sql) . ' returned false.' . "\n" . $this->error);
- if(file_exists('dbfail.out'))
- file_put_contents('dbfail.out', datetime_convert() . "\n" . printable($sql) . ' returned false' . "\n" . $this->error . "\n", FILE_APPEND);
- }
-
- if(($result === true) || ($result === false))
- return $result;
-
- $r = array();
- if($this->mysqli) {
- if($result->num_rows) {
- while($x = $result->fetch_array(MYSQLI_ASSOC))
- $r[] = $x;
- $result->free_result();
- }
- }
- else {
- if(mysql_num_rows($result)) {
- while($x = mysql_fetch_array($result, MYSQL_ASSOC))
- $r[] = $x;
- mysql_free_result($result);
- }
- }
-
-
- if($this->debug)
- logger('dba: ' . printable(print_r($r, true)));
- return($r);
- }
-
- public function dbg($dbg) {
- $this->debug = $dbg;
- }
-
- public function escape($str) {
- if($this->db && $this->connected) {
- if($this->mysqli)
- return @$this->db->real_escape_string($str);
- else
- return @mysql_real_escape_string($str,$this->db);
- }
- }
-
- function __destruct() {
- if ($this->db)
- if($this->mysqli)
- $this->db->close();
- else
- mysql_close($this->db);
- }
-}}
-
-if(! function_exists('printable')) {
-function printable($s) {
- $s = preg_replace("~([\x01-\x08\x0E-\x0F\x10-\x1F\x7F-\xFF])~",".", $s);
- $s = str_replace("\x00",'.',$s);
- if(x($_SERVER,'SERVER_NAME'))
- $s = escape_tags($s);
- return $s;
-}}
-
-// Procedural functions
-if(! function_exists('dbg')) {
-function dbg($state) {
- global $db;
- if($db)
- $db->dbg($state);
-}}
-
-if(! function_exists('dbesc')) {
-function dbesc($str) {
- global $db;
- if($db && $db->connected)
- return($db->escape($str));
- else
- return(str_replace("'","\\'",$str));
-}}
-
-
-
-// Function: q($sql,$args);
-// Description: execute SQL query with printf style args.
-// Example: $r = q("SELECT * FROM `%s` WHERE `uid` = %d",
-// 'user', 1);
-
-if(! function_exists('q')) {
-function q($sql) {
-
- global $db;
- $args = func_get_args();
- unset($args[0]);
-
- if($db && $db->connected) {
- $stmt = vsprintf($sql,$args);
- if($stmt === false)
- logger('dba: vsprintf error: ' . print_r(debug_backtrace(),true));
- return $db->q($stmt);
- }
-
- /**
- *
- * This will happen occasionally trying to store the
- * session data after abnormal program termination
- *
- */
- logger('dba: no database: ' . print_r($args,true));
- return false;
-
-}}
-
-/**
- *
- * Raw db query, no arguments
- *
- */
-
-if(! function_exists('dbq')) {
-function dbq($sql) {
-
- global $db;
- if($db && $db->connected)
- $ret = $db->q($sql);
- else
- $ret = false;
- return $ret;
-}}
-
-
-// Caller is responsible for ensuring that any integer arguments to
-// dbesc_array are actually integers and not malformed strings containing
-// SQL injection vectors. All integer array elements should be specifically
-// cast to int to avoid trouble.
-
-
-if(! function_exists('dbesc_array_cb')) {
-function dbesc_array_cb(&$item, $key) {
- if(is_string($item))
- $item = dbesc($item);
-}}
-
-
-if(! function_exists('dbesc_array')) {
-function dbesc_array(&$arr) {
- if(is_array($arr) && count($arr)) {
- array_walk($arr,'dbesc_array_cb');
- }
-}}
-
-
diff --git a/include/dba/dba_driver.php b/include/dba/dba_driver.php
new file mode 100755
index 000000000..c829c3714
--- /dev/null
+++ b/include/dba/dba_driver.php
@@ -0,0 +1,167 @@
+<?php /** @file */
+
+function dba_factory($server, $port,$user,$pass,$db,$install = false) {
+ $dba = null;
+
+ if(class_exists('mysqli')) {
+ if (is_null($port)) $port = ini_get("mysqli.default_port");
+ require_once('include/dba/dba_mysqli.php');
+ $dba = new dba_mysqli($server, $port,$user,$pass,$db,$install);
+ }
+ else {
+ if (is_null($port)) $port = "3306";
+ require_once('include/dba/dba_mysql.php');
+ $dba = new dba_mysql($server, $port,$user,$pass,$db,$install);
+ }
+
+ return $dba;
+}
+
+
+abstract class dba_driver {
+
+ protected $debug = 0;
+ protected $db;
+ public $connected = false;
+ public $error = false;
+
+ abstract function connect($server, $port, $user,$pass,$db);
+ abstract function q($sql);
+ abstract function escape($str);
+ abstract function close();
+
+ function __construct($server, $port, $user,$pass,$db,$install = false) {
+ if(($install) && (! $this->install($server, $port, $user,$pass,$db))) {
+ return;
+ }
+ $this->connect($server, $port, $user,$pass,$db);
+ }
+
+
+ function install($server,$user,$pass,$db) {
+ if (!(strlen($server) && strlen($user))){
+ $this->connected = false;
+ $this->db = null;
+ return false;
+ }
+
+ if(strlen($server) && ($server !== 'localhost') && ($server !== '127.0.0.1')) {
+ if(! dns_get_record($server, DNS_A + DNS_CNAME + DNS_PTR)) {
+ $this->error = sprintf( t('Cannot locate DNS info for database server \'%s\''), $server);
+ $this->connected = false;
+ $this->db = null;
+ return false;
+ }
+ }
+ return true;
+ }
+
+
+ function dbg($dbg) {
+ $this->debug = $dbg;
+ }
+
+ function __destruct() {
+ if($this->db && $this->connected) {
+ $this->close();
+ }
+ }
+
+}
+
+
+
+function printable($s) {
+ $s = preg_replace("~([\x01-\x08\x0E-\x0F\x10-\x1F\x7F-\xFF])~",".", $s);
+ $s = str_replace("\x00",'.',$s);
+ if(x($_SERVER,'SERVER_NAME'))
+ $s = escape_tags($s);
+ return $s;
+}
+
+// Procedural functions
+
+function dbg($state) {
+ global $db;
+ if($db)
+ $db->dbg($state);
+}
+
+
+function dbesc($str) {
+ global $db;
+ if($db && $db->connected)
+ return($db->escape($str));
+ else
+ return(str_replace("'","\\'",$str));
+}
+
+
+
+// Function: q($sql,$args);
+// Description: execute SQL query with printf style args.
+// Example: $r = q("SELECT * FROM `%s` WHERE `uid` = %d",
+// 'user', 1);
+
+
+function q($sql) {
+
+ global $db;
+ $args = func_get_args();
+ unset($args[0]);
+
+ if($db && $db->connected) {
+ $stmt = vsprintf($sql,$args);
+ if($stmt === false)
+ logger('dba: vsprintf error: ' . print_r(debug_backtrace(),true));
+ return $db->q($stmt);
+ }
+
+ /**
+ *
+ * This will happen occasionally trying to store the
+ * session data after abnormal program termination
+ *
+ */
+ logger('dba: no database: ' . print_r($args,true));
+ return false;
+
+}
+
+/**
+ *
+ * Raw db query, no arguments
+ *
+ */
+
+
+function dbq($sql) {
+
+ global $db;
+ if($db && $db->connected)
+ $ret = $db->q($sql);
+ else
+ $ret = false;
+ return $ret;
+}
+
+
+// Caller is responsible for ensuring that any integer arguments to
+// dbesc_array are actually integers and not malformed strings containing
+// SQL injection vectors. All integer array elements should be specifically
+// cast to int to avoid trouble.
+
+
+
+function dbesc_array_cb(&$item, $key) {
+ if(is_string($item))
+ $item = dbesc($item);
+}
+
+
+
+function dbesc_array(&$arr) {
+ if(is_array($arr) && count($arr)) {
+ array_walk($arr,'dbesc_array_cb');
+ }
+}
diff --git a/include/dba/dba_mysql.php b/include/dba/dba_mysql.php
new file mode 100755
index 000000000..f5a2a47ba
--- /dev/null
+++ b/include/dba/dba_mysql.php
@@ -0,0 +1,63 @@
+<?php
+
+require_once('include/dba/dba_driver.php');
+
+
+class dba_mysql extends dba_driver {
+
+ function connect($server, $port, $user,$pass,$db) {
+ $this->db = mysql_connect($server.":".$port,$user,$pass);
+ if($this->db && mysql_select_db($db,$this->db)) {
+ $this->connected = true;
+ }
+ if($this->connected) {
+ return true;
+ }
+ return false;
+ }
+
+
+ function q($sql) {
+ if((! $this->db) || (! $this->connected))
+ return false;
+
+ $this->error = '';
+ $result = @mysql_query($sql,$this->db);
+
+
+ if(mysql_errno($this->db))
+ $this->error = mysql_error($this->db);
+
+ if($result === false || $this->error) {
+ logger('dba_mysql: ' . printable($sql) . ' returned false.' . "\n" . $this->error);
+ if(file_exists('dbfail.out'))
+ file_put_contents('dbfail.out', datetime_convert() . "\n" . printable($sql) . ' returned false' . "\n" . $this->error . "\n", FILE_APPEND);
+ }
+
+ if(($result === true) || ($result === false))
+ return $result;
+
+ $r = array();
+ if(mysql_num_rows($result)) {
+ while($x = mysql_fetch_array($result,MYSQL_ASSOC))
+ $r[] = $x;
+ mysql_free_result($result);
+ if($this->debug)
+ logger('dba_mysql: ' . printable(print_r($r,true)));
+ }
+ return $r;
+ }
+
+ function escape($str) {
+ if($this->db && $this->connected) {
+ return @mysql_real_escape_string($str,$this->db);
+ }
+ }
+
+ function close() {
+ if($this->db)
+ mysql_close($this->db);
+ $this->connected = false;
+ }
+
+}
diff --git a/include/dba/dba_mysqli.php b/include/dba/dba_mysqli.php
new file mode 100755
index 000000000..19907705b
--- /dev/null
+++ b/include/dba/dba_mysqli.php
@@ -0,0 +1,76 @@
+<?php /** @file */
+
+require_once('include/dba/dba_driver.php');
+
+class dba_mysqli extends dba_driver {
+
+ function connect($server, $port, $user,$pass,$db) {
+ if($port)
+ $this->db = new mysqli($server,$user,$pass,$db, $port);
+ else
+ $this->db = new mysqli($server,$user,$pass,$db);
+
+ if(! mysqli_connect_errno()) {
+ $this->connected = true;
+ }
+ if($this->connected) {
+ return true;
+ }
+ $this->error = $this->db->connect_error;
+ return false;
+ }
+
+ function q($sql) {
+ if((! $this->db) || (! $this->connected))
+ return false;
+
+ $this->error = '';
+ $result = $this->db->query($sql);
+
+ if($this->db->errno)
+ $this->error = $this->db->error;
+
+
+ if($this->error) {
+ logger('dba_mysqli: ERROR: ' . printable($sql) . "\n" . $this->error);
+ if(file_exists('dbfail.out')) {
+ file_put_contents('dbfail.out', datetime_convert() . "\n" . printable($sql) . "\n" . $this->error . "\n", FILE_APPEND);
+ }
+ }
+
+ if(($result === true) || ($result === false)) {
+ if($this->debug) {
+ logger('dba_mysqli: DEBUG: returns ' . (($result) ? 'true' : 'false'));
+ }
+ return $result;
+ }
+
+ if($this->debug) {
+ logger('dba_mysqli: DEBUG: ' . printable($sql) . ' returned ' . $result->num_rows . ' results.');
+ }
+
+ $r = array();
+ if($result->num_rows) {
+ while($x = $result->fetch_array(MYSQLI_ASSOC))
+ $r[] = $x;
+ $result->free_result();
+ if($this->debug) {
+ logger('dba_mysqli: ' . printable(print_r($r,true)));
+ }
+ }
+ return $r;
+ }
+
+ function escape($str) {
+ if($this->db && $this->connected) {
+ return @$this->db->real_escape_string($str);
+ }
+ }
+
+ function close() {
+ if($this->db)
+ $this->db->close();
+ $this->connected = false;
+ }
+
+} \ No newline at end of file
diff --git a/include/deliver.php b/include/deliver.php
index 471ea580d..b0d15e1ef 100644
--- a/include/deliver.php
+++ b/include/deliver.php
@@ -1,4 +1,4 @@
-<?php
+<?php /** @file */
require_once('include/cli_startup.php');
require_once('include/zot.php');
@@ -23,11 +23,15 @@ function deliver_run($argv, $argc) {
if($r[0]['outq_posturl'] === z_root() . '/post') {
// local delivery
// we should probably batch these and save a few delivery processes
- $msg = array('body' => json_encode(array('pickup' => array(array('notify' => json_decode($r[0]['outq_notify'],true),'message' => json_decode($r[0]['outq_msg'],true))))));
- zot_import($msg);
- $r = q("delete from outq where outq_hash = '%s' limit 1",
- dbesc($argv[$x])
- );
+ // If there is no outq_msg, this is a refresh_all message which does not require local handling
+ if($r[0]['outq_msg']) {
+ $msg = array('body' => json_encode(array('pickup' => array(array('notify' => json_decode($r[0]['outq_notify'],true),'message' => json_decode($r[0]['outq_msg'],true))))));
+
+ zot_import($msg,z_root());
+ $r = q("delete from outq where outq_hash = '%s' limit 1",
+ dbesc($argv[$x])
+ );
+ }
}
else {
$result = zot_zot($r[0]['outq_posturl'],$r[0]['outq_notify']);
diff --git a/include/dir_fns.php b/include/dir_fns.php
index be1bcd503..ab8b67985 100644
--- a/include/dir_fns.php
+++ b/include/dir_fns.php
@@ -1,16 +1,152 @@
-<?php
+<?php /** @file */
require_once('include/permissions.php');
function find_upstream_directory($dirmode) {
+ $preferred = get_config('system','directory_server');
+ if($preferred)
+ return array('url' => $preferred);
return '';
}
+function dir_sort_links() {
+
+ $o = replace_macros(get_markup_template('dir_sort_links.tpl'), array(
+ '$header' => t('Sort Options'),
+ '$normal' => t('Alphabetic'),
+ '$reverse' => t('Reverse Alphabetic'),
+ '$date' => t('Newest to Oldest')
+ ));
+ return $o;
+}
+
+function dir_safe_mode() {
+ $observer = get_observer_hash();
+ if (! $observer)
+ return;
+ if ($observer)
+ $safe_mode = get_xconfig($observer,'directory','safe_mode');
+ if($safe_mode === '0')
+ $toggle = t('Enable Safe Search');
+ else
+ $toggle = t('Disable Safe Search');
+ $o = replace_macros(get_markup_template('safesearch.tpl'), array(
+ '$safemode' => t('Safe Mode'),
+ '$toggle' => $toggle,
+ ));
+
+ return $o;
+}
+
+function sync_directories($dirmode) {
+
+ if($dirmode == DIRECTORY_MODE_STANDALONE || $dirmode == DIRECTORY_MODE_NORMAL)
+ return;
+
+ $r = q("select * from site where (site_flags & %d) and site_url != '%s'",
+ intval(DIRECTORY_MODE_PRIMARY|DIRECTORY_MODE_SECONDARY),
+ dbesc(z_root())
+ );
+
+ // If there are no directory servers, setup the fallback master
+
+ if((! $r) && (z_root() != DIRECTORY_FALLBACK_MASTER)) {
+ $r = array(
+ 'site_url' => DIRECTORY_FALLBACK_MASTER,
+ 'site_flags' => DIRECTORY_MODE_PRIMARY,
+ 'site_update' => '0000-00-00 00:00:00',
+ 'site_directory' => DIRECTORY_FALLBACK_MASTER . '/dirsearch'
+ );
+ $x = q("insert into site ( site_url, site_flags, site_update, site_directory )
+ values ( '%s', %d', '%s', '%s' ) ",
+ dbesc($r[0]['site_url']),
+ intval($r[0]['site_flags']),
+ dbesc($r[0]['site_update']),
+ dbesc($r[0]['site_directory'])
+ );
+
+ $r = q("select * from site where (site_flags & %d) and site_url != '%s'",
+ intval(DIRECTORY_MODE_PRIMARY|DIRECTORY_MODE_SECONDARY),
+ dbesc(z_root())
+ );
+
+ }
+ if(! $r)
+ return;
+
+ foreach($r as $rr) {
+ if(! $rr['site_directory'])
+ continue;
+ $x = z_fetch_url($rr['site_directory'] . '?f=&sync=' . urlencode($rr['site_sync']));
+ if(! $x['success'])
+ continue;
+ $j = json_decode($x['body'],true);
+ if((! $j['transactions']) || (! is_array($j['transactions'])))
+ continue;
+
+ q("update site set site_sync = '%s' where site_url = '%s' limit 1",
+ dbesc(datetime_convert()),
+ dbesc($rr['site_url'])
+ );
+
+ logger('sync_directories: ' . $rr['site_url'] . ': ' . print_r($j,true), LOGGER_DATA);
+
+ if(count($j['transactions'])) {
+ foreach($j['transactions'] as $t) {
+ $r = q("select * from updates where ud_guid = '%s' limit 1",
+ dbesc($t['transaction_id'])
+ );
+ if($r)
+ continue;
+ $ud_flags = 0;
+ if(is_array($t['flags']) && in_array('deleted',$t['flags']))
+ $ud_flags |= UPDATE_FLAGS_DELETED;
+ $z = q("insert into updates ( ud_hash, ud_guid, ud_date, ud_flags, ud_addr )
+ values ( '%s', '%s', '%s', %d, '%s' ) ",
+ dbesc($t['hash']),
+ dbesc($t['transaction_id']),
+ dbesc($t['timestamp']),
+ intval($ud_flags),
+ dbesc($t['address'])
+ );
+ }
+ }
+ }
+}
+
+
+function update_directory_entry($ud) {
+
+ logger('update_directory_entry: ' . print_r($ud,true), LOGGER_DATA);
+
+ if($ud['ud_addr'] && (! ($ud['ud_flags'] & UPDATE_FLAGS_DELETED))) {
+ $success = false;
+ $x = zot_finger($ud['ud_addr'],'');
+ if($x['success']) {
+ $j = json_decode($x['body'],true);
+ if($j)
+ $success = true;
+ $y = import_xchan($j,0);
+ }
+ if(! $success) {
+ $r = q("update updates set ud_last = '%s' where ud_addr = '%s'",
+ dbesc(datetime_convert()),
+ dbesc($ud['ud_addr'])
+ );
+ }
+ }
+
+}
+
+
+
+
+
function syncdirs($uid) {
logger('syncdirs', LOGGER_DEBUG);
- $p = q("select channel.channel_hash, profile.* from profile left join channel on channel_id = uid where uid = %d and is_default = 1",
+ $p = q("select channel.channel_hash, channel_address, channel_timezone, profile.* from profile left join channel on channel_id = uid where uid = %d and is_default = 1",
intval($uid)
);
@@ -21,6 +157,9 @@ function syncdirs($uid) {
$profile['description'] = $p[0]['pdesc'];
$profile['birthday'] = $p[0]['dob'];
+ if($age = age($p[0]['dob'],$p[0]['channel_timezone'],''))
+ $profile['age'] = $age;
+
$profile['gender'] = $p[0]['gender'];
$profile['marital'] = $p[0]['marital'];
$profile['sexual'] = $p[0]['sexual'];
@@ -28,6 +167,10 @@ function syncdirs($uid) {
$profile['region'] = $p[0]['region'];
$profile['postcode'] = $p[0]['postal_code'];
$profile['country'] = $p[0]['country_name'];
+ $profile['about'] = $p[0]['about'];
+ $profile['homepage'] = $p[0]['homepage'];
+ $profile['hometown'] = $p[0]['hometown'];
+
if($p[0]['keywords']) {
$tags = array();
$k = explode(' ',$p[0]['keywords']);
@@ -39,9 +182,33 @@ function syncdirs($uid) {
$profile['keywords'] = $tags;
}
- if(perm_is_allowed($uid,'','view_profile')) {
- import_directory_profile($hash,$profile);
+ $hidden = (1 - intval($p[0]['publish']));
+
+ logger('hidden: ' . $hidden);
+
+ $r = q("select xchan_flags from xchan where xchan_hash = '%s' limit 1",
+ dbesc($p[0]['channel_hash'])
+ );
+
+ // Be careful - XCHAN_FLAGS_HIDDEN should evaluate to 1
+ if(($r[0]['xchan_flags'] & XCHAN_FLAGS_HIDDEN) != $hidden)
+ $new_flags = $r[0]['xchan_flags'] ^ XCHAN_FLAGS_HIDDEN;
+ else
+ $new_flags = $r[0]['xchan_flags'];
+
+ if($new_flags != $r[0]['xchan_flags']) {
+
+ $r = q("update xchan set xchan_flags = %d where xchan_hash = '%s' limit 1",
+ intval($new_flags),
+ dbesc($p[0]['channel_hash'])
+ );
+
+ }
+ $address = $p[0]['channel_address'] . '@' . get_app()->get_hostname();
+
+ if(perm_is_allowed($uid,'','view_profile')) {
+ import_directory_profile($hash,$profile,$address,0);
}
else {
// they may have made it private
@@ -54,6 +221,8 @@ function syncdirs($uid) {
}
}
- // TODO send refresh zots to downstream directory servers
+ $ud_hash = random_string();
+ update_modtime($ud_hash,$hash,$p[0]['channel_address'] . '@' . get_app()->get_hostname(),1);
+
}
diff --git a/include/directory.php b/include/directory.php
index b0b975358..491240a9d 100644
--- a/include/directory.php
+++ b/include/directory.php
@@ -1,4 +1,5 @@
-g<?php
+<?php /** @file */
+
require_once('boot.php');
require_once('include/zot.php');
require_once('include/cli_startup.php');
@@ -18,11 +19,6 @@ function directory_run($argv, $argc){
if($dirmode === false)
$dirmode = DIRECTORY_MODE_NORMAL;
- if(($dirmode == DIRECTORY_MODE_PRIMARY) || ($dirmode == DIRECTORY_MODE_STANDALONE)) {
- syncdirs($argv[1]);
- return;
- }
-
$x = q("select * from channel where channel_id = %d limit 1",
intval($argv[1])
);
@@ -31,26 +27,67 @@ function directory_run($argv, $argc){
$channel = $x[0];
- // is channel profile visible to the public?
- // FIXME - remove dir entry if permission is revoked
- if(! perm_is_allowed($channel['channel_id'],null,'view_profile'))
+ if(($dirmode == DIRECTORY_MODE_PRIMARY) || ($dirmode == DIRECTORY_MODE_STANDALONE)) {
+ syncdirs($argv[1]);
+
+ q("update channel set channel_dirdate = '%s' where channel_id = %d limit 1",
+ dbesc(datetime_convert()),
+ intval($channel['channel_id'])
+ );
+
+
+ // Now update all the connections
+ proc_run('php','include/notifier.php','refresh_all',$channel['channel_id']);
return;
+ }
$directory = find_upstream_directory($dirmode);
if($directory) {
- $url = $directory['url'];
+ $url = $directory['url'] . '/post';
}
else {
$url = DIRECTORY_FALLBACK_MASTER . '/post';
}
+ // ensure the upstream directory is updated
+
$packet = zot_build_packet($channel,'refresh');
$z = zot_zot($url,$packet);
// re-queue if unsuccessful
+ if(! $z['success']) {
+
+ // FIXME - we aren't updating channel_dirdate if we have to queue
+ // the directory packet. That means we'll try again on the next poll run.
+
+ $hash = random_string();
+ q("insert into outq ( outq_hash, outq_account, outq_channel, outq_posturl, outq_async, outq_created, outq_updated, outq_notify, outq_msg )
+ values ( '%s', %d, %d, '%s', %d, '%s', '%s', '%s', '%s' )",
+ dbesc($hash),
+ intval($channel['channel_account_id']),
+ intval($channel['channel_id']),
+ dbesc($url),
+ intval(1),
+ dbesc(datetime_convert()),
+ dbesc(datetime_convert()),
+ dbesc($packet),
+ dbesc('')
+ );
+ }
+ else {
+ q("update channel set channel_dirdate = '%s' where channel_id = %d limit 1",
+ dbesc(datetime_convert()),
+ intval($channel['channel_id'])
+ );
+ }
+
+ // Now update all the connections
+
+ proc_run('php','include/notifier.php','refresh_all',$channel['channel_id']);
+
}
if (array_search(__file__,get_included_files())===0){
diff --git a/include/enotify.php b/include/enotify.php
index 32f4cc2e7..e0991257f 100644
--- a/include/enotify.php
+++ b/include/enotify.php
@@ -1,9 +1,13 @@
-<?php
+<?php /** @file */
function notification($params) {
logger('notification: entry', LOGGER_DEBUG);
+ // throw a small amount of entropy into the system to breakup duplicates arriving at the same precise instant.
+ usleep(mt_rand(0,10000));
+
+
$a = get_app();
@@ -33,8 +37,8 @@ function notification($params) {
push_lang($recip['account_language']); // should probably have a channel language
- $banner = t('Red Notification');
- $product = FRIENDICA_PLATFORM;
+ $banner = t('Red Matrix Notification');
+ $product = t('redmatrix'); // RED_PLATFORM;
$siteurl = $a->get_baseurl(true);
$thanks = t('Thank You,');
$sitename = get_config('system','sitename');
@@ -51,13 +55,27 @@ function notification($params) {
$additional_mail_header = "";
if(array_key_exists('item',$params)) {
- $title = $params['item']['title'];
- $body = $params['item']['body'];
+ require_once('include/conversation.php');
+ // if it's a normal item...
+ if(array_key_exists('verb',$params['item'])) {
+ // localize_item() alters the original item so make a copy first
+ $i = $params['item'];
+ logger('calling localize');
+ localize_item($i);
+ $title = $i['title'];
+ $body = $i['body'];
+ $private = $i['item_private'];
+ }
+ else {
+ $title = $params['item']['title'];
+ $body = $params['item']['body'];
+ }
}
else {
$title = $body = '';
}
+
// e.g. "your post", "David's photo", etc.
$possess_desc = t('%s <!item_type!>');
@@ -65,17 +83,25 @@ function notification($params) {
logger('notification: mail');
$subject = sprintf( t('[Red:Notify] New mail received at %s'),$sitename);
- $preamble = sprintf( t('%1$s sent you a new private message at %2$s.'),$sender['xchan_name'],$sitename);
- $epreamble = sprintf( t('%1$s sent you %2$s.'),'[url=' . $sender['xchan_url'] . ']' . $sender['xchan_name'] . '[/url]', '[url=$itemlink]' . t('a private message') . '[/url]');
+ $preamble = sprintf( t('%1$s, %2$s sent you a new private message at %3$s.'),$recip['channel_name'], $sender['xchan_name'],$sitename);
+ $epreamble = sprintf( t('%1$s sent you %2$s.'),'[zrl=' . $sender['xchan_url'] . ']' . $sender['xchan_name'] . '[/zrl]', '[zrl=$itemlink]' . t('a private message') . '[/zrl]');
$sitelink = t('Please visit %s to view and/or reply to your private messages.');
- $tsitelink = sprintf( $sitelink, $siteurl . '/message/' . $params['item']['id'] );
- $hsitelink = sprintf( $sitelink, '<a href="' . $siteurl . '/message/' . $params['item']['id'] . '">' . $sitename . '</a>');
+ $tsitelink = sprintf( $sitelink, $siteurl . '/mail/' . $params['item']['id'] );
+ $hsitelink = sprintf( $sitelink, '<a href="' . $siteurl . '/mail/' . $params['item']['id'] . '">' . $sitename . '</a>');
$itemlink = $siteurl . '/message/' . $params['item']['id'];
}
if($params['type'] == NOTIFY_COMMENT) {
// logger("notification: params = " . print_r($params, true), LOGGER_DEBUG);
+ $itemlink = $params['link'];
+
+
+ // ignore like/unlike activity on posts - they probably require a sepearate notification preference
+
+ if(array_key_exists('item',$params) && (! visible_activity($params['item'])))
+ return;
+
$parent_id = $params['parent'];
// Check to see if there was already a notify for this post.
@@ -87,7 +113,7 @@ function notification($params) {
intval($recip['channel_id'])
);
if($p) {
- logger('notification comment already notified');
+ logger('notification: comment already notified');
pop_lang();
return;
}
@@ -108,28 +134,33 @@ function notification($params) {
$item_post_type = item_post_type($p[0]);
+ $private = $p[0]['item_private'];
+
//$possess_desc = str_replace('<!item_type!>',$possess_desc);
// "a post"
- $dest_str = sprintf(t('%1$s commented on [url=%2$s]a %3$s[/url]'),
- '[url=' . $sender['xchan_url'] . ']' . $sender['xchan_name'] . '[/url]',
- $itemlink,
- $item_post_type);
+ $dest_str = sprintf(t('%1$s, %2$s commented on [zrl=%3$s]a %4$s[/zrl]'),
+ $recip['channel_name'],
+ '[zrl=' . $sender['xchan_url'] . ']' . $sender['xchan_name'] . '[/zrl]',
+ $itemlink,
+ $item_post_type);
// "George Bull's post"
if($p)
- $dest_str = sprintf(t('%1$s commented on [url=%2$s]%3$s\'s %4$s[/url]'),
- '[url=' . $sender['xchan_url'] . ']' . $sender['xchan_name'] . '[/url]',
- $itemlink,
- $p[0]['author']['xchan_name'],
- $item_post_type);
+ $dest_str = sprintf(t('%1$s, %2$s commented on [zrl=%3$s]%4$s\'s %5$s[/zrl]'),
+ $recip['channel_name'],
+ '[zrl=' . $sender['xchan_url'] . ']' . $sender['xchan_name'] . '[/zrl]',
+ $itemlink,
+ $p[0]['author']['xchan_name'],
+ $item_post_type);
// "your post"
if($p[0]['owner']['xchan_name'] == $p[0]['author']['xchan_name'] && ($p[0]['item_flags'] & ITEM_WALL))
- $dest_str = sprintf(t('%1$s commented on [url=%2$s]your %3$s[/url]'),
- '[url=' . $sender['xchan_url'] . ']' . $sender['xchan_name'] . '[/url]',
- $itemlink,
- $item_post_type);
+ $dest_str = sprintf(t('%1$s, %2$s commented on [zrl=%3$s]your %4$s[/zrl]'),
+ $recip['channel_name'],
+ '[zrl=' . $sender['xchan_url'] . ']' . $sender['xchan_name'] . '[/zrl]',
+ $itemlink,
+ $item_post_type);
// Some mail softwares relies on subject field for threading.
// So, we cannot have different subjects for notifications of the same thread.
@@ -137,23 +168,23 @@ function notification($params) {
// differents subjects for messages on the same thread.
$subject = sprintf( t('[Red:Notify] Comment to conversation #%1$d by %2$s'), $parent_id, $sender['xchan_name']);
- $preamble = sprintf( t('%s commented on an item/conversation you have been following.'), $sender['xchan_name']);
+ $preamble = sprintf( t('%1$s, %2$s commented on an item/conversation you have been following.'), $recip['channel_name'], $sender['xchan_name']);
$epreamble = $dest_str;
$sitelink = t('Please visit %s to view and/or reply to the conversation.');
$tsitelink = sprintf( $sitelink, $siteurl );
$hsitelink = sprintf( $sitelink, '<a href="' . $siteurl . '">' . $sitename . '</a>');
- $itemlink = $params['link'];
}
if($params['type'] == NOTIFY_WALL) {
$subject = sprintf( t('[Red:Notify] %s posted to your profile wall') , $sender['xchan_name']);
- $preamble = sprintf( t('%1$s posted to your profile wall at %2$s') , $sender['xchan_name'], $sitename);
+ $preamble = sprintf( t('%1$s, %2$s posted to your profile wall at %3$s') , $recip['channel_name'], $sender['xchan_name'], $sitename);
- $epreamble = sprintf( t('%1$s posted to [url=%2$s]your wall[/url]') ,
- '[url=' . $sender['xchan_url'] . ']' . $sender['xchan_name'] . '[/url]',
- $params['link']);
+ $epreamble = sprintf( t('%1$s, %2$s posted to [zrl=%3$s]your wall[/zrl]') ,
+ $recip['channel_name'],
+ '[zrl=' . $sender['xchan_url'] . ']' . $sender['xchan_name'] . '[/zrl]',
+ $params['link']);
$sitelink = t('Please visit %s to view and/or reply to the conversation.');
$tsitelink = sprintf( $sitelink, $siteurl );
@@ -162,11 +193,24 @@ function notification($params) {
}
if($params['type'] == NOTIFY_TAGSELF) {
+
+ $p = null;
+ $p = q("select id from notify where link = '%s' and uid = %d limit 1",
+ dbesc($params['link']),
+ intval($recip['channel_id'])
+ );
+ if($p) {
+ logger('enotify: tag: already notified about this post');
+ pop_lang();
+ return;
+ }
+
$subject = sprintf( t('[Red:Notify] %s tagged you') , $sender['xchan_name']);
- $preamble = sprintf( t('%1$s tagged you at %2$s') , $sender['xchan_name'], $sitename);
- $epreamble = sprintf( t('%1$s [url=%2$s]tagged you[/url].') ,
- '[url=' . $sender['xchan_url'] . ']' . $sender['xchan_name'] . '[/url]',
- $params['link']);
+ $preamble = sprintf( t('%1$s, %2$s tagged you at %3$s') , $recip['channel_name'], $sender['xchan_name'], $sitename);
+ $epreamble = sprintf( t('%1$s, %2$s [zrl=%3$s]tagged you[/zrl].') ,
+ $recip['channel_name'],
+ '[zrl=' . $sender['xchan_url'] . ']' . $sender['xchan_name'] . '[/zrl]',
+ $params['link']);
$sitelink = t('Please visit %s to view and/or reply to the conversation.');
$tsitelink = sprintf( $sitelink, $siteurl );
@@ -177,10 +221,11 @@ function notification($params) {
if($params['type'] == NOTIFY_POKE) {
$subject = sprintf( t('[Red:Notify] %1$s poked you') , $sender['xchan_name']);
- $preamble = sprintf( t('%1$s poked you at %2$s') , $sender['xchan_name'], $sitename);
- $epreamble = sprintf( t('%1$s [url=%2$s]poked you[/url].') ,
- '[url=' . $sender['xchan_url'] . ']' . $sender['xchan_name'] . '[/url]',
- $params['link']);
+ $preamble = sprintf( t('%1$s, %2$s poked you at %3$s') , $recip['channel_name'], $sender['xchan_name'], $sitename);
+ $epreamble = sprintf( t('%1$s, %2$s [zrl=%2$s]poked you[/zrl].') ,
+ $recip['channel_name'],
+ '[zrl=' . $sender['xchan_url'] . ']' . $sender['xchan_name'] . '[/zrl]',
+ $params['link']);
$subject = str_replace('poked', t($params['activity']), $subject);
$preamble = str_replace('poked', t($params['activity']), $preamble);
@@ -194,10 +239,11 @@ function notification($params) {
if($params['type'] == NOTIFY_TAGSHARE) {
$subject = sprintf( t('[Red:Notify] %s tagged your post') , $sender['xchan_name']);
- $preamble = sprintf( t('%1$s tagged your post at %2$s') , $sender['xchan_name'], $sitename);
- $epreamble = sprintf( t('%1$s tagged [url=%2$s]your post[/url]') ,
- '[url=' . $sender['xchan_url'] . ']' . $sender['xchan_name'] . '[/url]',
- $itemlink);
+ $preamble = sprintf( t('%1$s, %2$s tagged your post at %3$s') , $recip['channel_name'],$sender['xchan_name'], $sitename);
+ $epreamble = sprintf( t('%1$s, %2$s tagged [zrl=%3$s]your post[/zrl]') ,
+ $recip['channel_name'],
+ '[zrl=' . $sender['xchan_url'] . ']' . $sender['xchan_name'] . '[/zrl]',
+ $itemlink);
$sitelink = t('Please visit %s to view and/or reply to the conversation.');
$tsitelink = sprintf( $sitelink, $siteurl );
@@ -207,10 +253,11 @@ function notification($params) {
if($params['type'] == NOTIFY_INTRO) {
$subject = sprintf( t('[Red:Notify] Introduction received'));
- $preamble = sprintf( t('You\'ve received an introduction from \'%1$s\' at %2$s'), $sender['xchan_name'], $sitename);
- $epreamble = sprintf( t('You\'ve received [url=%1$s]an introduction[/url] from %2$s.'),
- $itemlink,
- '[url=' . $sender['xchan_url'] . ']' . $sender['xchan_name'] . '[/url]');
+ $preamble = sprintf( t('%1$s, you\'ve received an introduction from \'%2$s\' at %3$s'), $recip['channel_name'], $sender['xchan_name'], $sitename);
+ $epreamble = sprintf( t('%1$s, you\'ve received [zrl=%2$s]an introduction[/zrl] from %3$s.'),
+ $recip['channel_name'],
+ $itemlink,
+ '[zrl=' . $sender['xchan_url'] . ']' . $sender['xchan_name'] . '[/zrl]');
$body = sprintf( t('You may visit their profile at %s'),$sender['xchan_url']);
$sitelink = t('Please visit %s to approve or reject the introduction.');
@@ -221,11 +268,12 @@ function notification($params) {
if($params['type'] == NOTIFY_SUGGEST) {
$subject = sprintf( t('[Red:Notify] Friend suggestion received'));
- $preamble = sprintf( t('You\'ve received a friend suggestion from \'%1$s\' at %2$s'), $sender['xchan_name'], $sitename);
- $epreamble = sprintf( t('You\'ve received [url=%1$s]a friend suggestion[/url] for %2$s from %3$s.'),
- $itemlink,
- '[url=' . $params['item']['url'] . ']' . $params['item']['name'] . '[/url]',
- '[url=' . $sender['xchan_url'] . ']' . $sender['xchan_name'] . '[/url]');
+ $preamble = sprintf( t('%1$s, you\'ve received a friend suggestion from \'%2$s\' at %3$s'), $recip['channel_name'], $sender['xchan_name'], $sitename);
+ $epreamble = sprintf( t('%1$s, you\'ve received [zrl=%2$s]a friend suggestion[/zrl] for %3$s from %4$s.'),
+ $recip['channel_name'],
+ $itemlink,
+ '[zrl=' . $params['item']['url'] . ']' . $params['item']['name'] . '[/zrl]',
+ '[zrl=' . $sender['xchan_url'] . ']' . $sender['xchan_name'] . '[/zrl]');
$body = t('Name:') . ' ' . $params['item']['name'] . "\n";
$body .= t('Photo:') . ' ' . $params['item']['photo'] . "\n";
@@ -287,24 +335,33 @@ function notification($params) {
$datarray['url'] = $sender['xchan_url'];
$datarray['photo'] = $sender['xchan_photo_s'];
$datarray['date'] = datetime_convert();
+ $datarray['aid'] = $recip['channel_account_id'];
$datarray['uid'] = $recip['channel_id'];
$datarray['link'] = $itemlink;
$datarray['parent'] = $parent_id;
$datarray['type'] = $params['type'];
$datarray['verb'] = $params['verb'];
$datarray['otype'] = $params['otype'];
+ $datarray['abort'] = false;
call_hooks('enotify_store', $datarray);
+ if($datarray['abort']) {
+ pop_lang();
+ return;
+ }
+
+
// create notification entry in DB
- $r = q("insert into notify (hash,name,url,photo,date,uid,link,parent,type,verb,otype)
- values('%s','%s','%s','%s','%s',%d,'%s',%d,%d,'%s','%s')",
+ $r = q("insert into notify (hash,name,url,photo,date,aid,uid,link,parent,type,verb,otype)
+ values('%s','%s','%s','%s','%s',%d,%d,'%s',%d,%d,'%s','%s')",
dbesc($datarray['hash']),
dbesc($datarray['name']),
dbesc($datarray['url']),
dbesc($datarray['photo']),
dbesc($datarray['date']),
+ intval($datarray['aid']),
intval($datarray['uid']),
dbesc($datarray['link']),
intval($datarray['parent']),
@@ -341,10 +398,26 @@ function notification($params) {
logger('notification: sending notification email');
- $textversion = strip_tags(html_entity_decode(bbcode(stripslashes(str_replace(array("\\r\\n", "\\r", "\\n"), "\n",
- $body))),ENT_QUOTES,'UTF-8'));
- $htmlversion = html_entity_decode(bbcode(stripslashes(str_replace(array("\\r\\n", "\\r","\\n\\n" ,"\\n"),
- "<br />\n",$body))));
+
+ $textversion = strip_tags(html_entity_decode(bbcode(stripslashes(str_replace(array("\\r", "\\n"), array( "", "\n"), $body))),ENT_QUOTES,'UTF-8'));
+
+ $htmlversion = html_entity_decode(bbcode(stripslashes(str_replace(array("\\r","\\n"), array("","<br />\n"),$body))), ENT_QUOTES,'UTF-8');
+
+
+ // use $_SESSION['zid_override'] to force zid() to use
+ // the recipient address instead of the current observer
+
+ $_SESSION['zid_override'] = $recip['channel_address'] . '@' . get_app()->get_hostname();
+ $_SESSION['zrl_override'] = z_root() . '/channel/' . $recip['channel_address'];
+
+ $textversion = zidify_links($textversion);
+ $htmlversion = zidify_links($htmlversion);
+
+ // unset when done to revert to normal behaviour
+
+ unset($_SESSION['zid_override']);
+ unset($_SESSION['zrl_override']);
+
$datarray = array();
$datarray['banner'] = $banner;
@@ -370,9 +443,30 @@ function notification($params) {
$datarray['textversion'] = $textversion;
$datarray['subject'] = $subject;
$datarray['headers'] = $additional_mail_header;
+ $datarray['email_secure'] = false;
call_hooks('enotify_mail', $datarray);
+ // Default to private - don't disclose message contents over insecure channels (such as email)
+ // Might be interesting to use GPG,PGP,S/MIME encryption instead
+ // but we'll save that for a clever plugin developer to implement
+
+ if(! $datarray['email_secure']) {
+ switch($params['type']) {
+ case NOTIFY_WALL:
+ case NOTIFY_TAGSELF:
+ case NOTIFY_POKE:
+ case NOTIFY_COMMENT:
+ if(! $private)
+ break;
+ case NOTIFY_MAIL:
+ $datarray['textversion'] = $datarray['htmlversion'] = $datarray['title'] = '';
+ break;
+ default:
+ break;
+ }
+ }
+
// load the template for private message notifications
$tpl = get_markup_template('email_notify_html.tpl');
$email_html_body = replace_macros($tpl,array(
@@ -482,7 +576,7 @@ class enotify {
// send the message
$res = mail(
- $params['toEmail'], // send to address
+ $params['toEmail'], // send to address
$messageSubject, // subject
$multipartMessageBody, // message body
$messageHeader // message headers
diff --git a/include/event.php b/include/event.php
index 8bf65016f..08b94dafa 100644
--- a/include/event.php
+++ b/include/event.php
@@ -1,4 +1,4 @@
-<?php
+<?php /** @file */
function format_event_html($ev) {
@@ -15,7 +15,7 @@ function format_event_html($ev) {
$o .= '<p class="summary event-summary">' . bbcode($ev['summary']) . '</p>' . "\r\n";
- $o .= '<p class="description event-description">' . bbcode($ev['desc']) . '</p>' . "\r\n";
+ $o .= '<p class="description event-description">' . bbcode($ev['description']) . '</p>' . "\r\n";
$o .= '<p class="event-start">' . t('Starts:') . ' <abbr class="dtstart" title="'
. datetime_convert('UTC','UTC',$ev['start'], (($ev['adjust']) ? ATOM_TIME : 'Y-m-d\TH:i:s' ))
@@ -45,74 +45,6 @@ function format_event_html($ev) {
return $o;
}
-/*
-function parse_event($h) {
-
- require_once('include/Scrape.php');
- require_once('library/HTMLPurifier.auto.php');
- require_once('include/html2bbcode');
-
- $h = '<html><body>' . $h . '</body></html>';
-
- $ret = array();
-
-
- try {
- $dom = HTML5_Parser::parse($h);
- } catch (DOMException $e) {
- logger('parse_event: parse error: ' . $e);
- }
-
- if(! $dom)
- return $ret;
-
- $items = $dom->getElementsByTagName('*');
-
- foreach($items as $item) {
- if(attribute_contains($item->getAttribute('class'), 'vevent')) {
- $level2 = $item->getElementsByTagName('*');
- foreach($level2 as $x) {
- if(attribute_contains($x->getAttribute('class'),'dtstart') && $x->getAttribute('title')) {
- $ret['start'] = $x->getAttribute('title');
- if(! strpos($ret['start'],'Z'))
- $ret['adjust'] = true;
- }
- if(attribute_contains($x->getAttribute('class'),'dtend') && $x->getAttribute('title'))
- $ret['finish'] = $x->getAttribute('title');
-
- if(attribute_contains($x->getAttribute('class'),'description'))
- $ret['desc'] = $x->textContent;
- if(attribute_contains($x->getAttribute('class'),'location'))
- $ret['location'] = $x->textContent;
- }
- }
- }
-
- // sanitise
-
- if((x($ret,'desc')) && ((strpos($ret['desc'],'<') !== false) || (strpos($ret['desc'],'>') !== false))) {
- $config = HTMLPurifier_Config::createDefault();
- $config->set('Cache.DefinitionImpl', null);
- $purifier = new HTMLPurifier($config);
- $ret['desc'] = html2bbcode($purifier->purify($ret['desc']));
- }
-
- if((x($ret,'location')) && ((strpos($ret['location'],'<') !== false) || (strpos($ret['location'],'>') !== false))) {
- $config = HTMLPurifier_Config::createDefault();
- $config->set('Cache.DefinitionImpl', null);
- $purifier = new HTMLPurifier($config);
- $ret['location'] = html2bbcode($purifier->purify($ret['location']));
- }
-
- if(x($ret,'start'))
- $ret['start'] = datetime_convert('UTC','UTC',$ret['start']);
- if(x($ret,'finish'))
- $ret['finish'] = datetime_convert('UTC','UTC',$ret['finish']);
-
- return $ret;
-}
-*/
-
function format_event_bbcode($ev) {
$o = '';
@@ -120,8 +52,8 @@ function format_event_bbcode($ev) {
if($ev['summary'])
$o .= '[event-summary]' . $ev['summary'] . '[/event-summary]';
- if($ev['desc'])
- $o .= '[event-description]' . $ev['desc'] . '[/event-description]';
+ if($ev['description'])
+ $o .= '[event-description]' . $ev['description'] . '[/event-description]';
if($ev['start'])
$o .= '[event-start]' . $ev['start'] . '[/event-start]';
@@ -143,7 +75,7 @@ function format_event_bbcode($ev) {
function bbtovcal($s) {
$o = '';
$ev = bbtoevent($s);
- if($ev['desc'])
+ if($ev['description'])
$o = format_event_html($ev);
return $o;
}
@@ -158,7 +90,7 @@ function bbtoevent($s) {
$ev['summary'] = $match[1];
$match = '';
if(preg_match("/\[event\-description\](.*?)\[\/event\-description\]/is",$s,$match))
- $ev['desc'] = $match[1];
+ $ev['description'] = $match[1];
$match = '';
if(preg_match("/\[event\-start\](.*?)\[\/event\-start\]/is",$s,$match))
$ev['start'] = $match[1];
@@ -190,7 +122,7 @@ function ev_compare($a,$b) {
$date_b = (($b['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$b['start']) : $b['start']);
if($date_a === $date_b)
- return strcasecmp($a['desc'],$b['desc']);
+ return strcasecmp($a['description'],$b['description']);
return strcmp($date_a,$date_b);
}
@@ -237,6 +169,8 @@ function event_store($arr) {
return $r[0]['id'];
}
+ $event_hash = $r[0]['event_hash'];
+
// The event changed. Update it.
$r = q("UPDATE `event` SET
@@ -244,7 +178,7 @@ function event_store($arr) {
`start` = '%s',
`finish` = '%s',
`summary` = '%s',
- `desc` = '%s',
+ `description` = '%s',
`location` = '%s',
`type` = '%s',
`adjust` = %d,
@@ -259,7 +193,7 @@ function event_store($arr) {
dbesc($arr['start']),
dbesc($arr['finish']),
dbesc($arr['summary']),
- dbesc($arr['desc']),
+ dbesc($arr['description']),
dbesc($arr['location']),
dbesc($arr['type']),
intval($arr['adjust']),
@@ -273,7 +207,7 @@ function event_store($arr) {
);
$r = q("SELECT * FROM item left join xchan on author_xchan = xchan_hash WHERE resource_id = '%s' AND resource_type = 'event' and uid = %d LIMIT 1",
- intval($r[0]['event_hash']),
+ dbesc($event_hash),
intval($arr['uid'])
);
@@ -328,11 +262,11 @@ function event_store($arr) {
$hash = random_string();
- if(! $arr['uri'])
- $arr['uri'] = item_message_id();
+ if(! $arr['mid'])
+ $arr['mid'] = item_message_id();
- $r = q("INSERT INTO event ( uid,aid,event_xchan,event_hash,created,edited,start,finish,summary, desc,location,type,
+ $r = q("INSERT INTO event ( uid,aid,event_xchan,event_hash,created,edited,start,finish,summary,description,location,type,
adjust,nofinish,allow_cid,allow_gid,deny_cid,deny_gid)
VALUES ( %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, '%s', '%s', '%s', '%s' ) ",
intval($arr['uid']),
@@ -344,7 +278,7 @@ function event_store($arr) {
dbesc($arr['start']),
dbesc($arr['finish']),
dbesc($arr['summary']),
- dbesc($arr['desc']),
+ dbesc($arr['description']),
dbesc($arr['location']),
dbesc($arr['type']),
intval($arr['adjust']),
@@ -382,8 +316,8 @@ function event_store($arr) {
$item_arr['uid'] = $arr['uid'];
$item_arr['author_xchan'] = $arr['event_xchan'];
- $item_arr['uri'] = $arr['uri'];
- $item_arr['parent_uri'] = $arr['uri'];
+ $item_arr['mid'] = $arr['mid'];
+ $item_arr['parent_mid'] = $arr['mid'];
$item_arr['item_flags'] = $item_flags;
@@ -403,6 +337,8 @@ function event_store($arr) {
$item_arr['obj_type'] = ACTIVITY_OBJ_EVENT;
$item_arr['body'] = format_event_bbcode($arr);
+ $item_arr['plink'] = z_root() . '/channel/' . $z[0]['channel_address'] . '/?f=&mid=' . $item_arr['mid'];
+
$x = q("select * from xchan where xchan_hash = '%s' limit 1",
dbesc($arr['event_xchan'])
);
@@ -426,7 +362,8 @@ function event_store($arr) {
}
- $item_id = item_store($item_arr);
+ $res = item_store($item_arr);
+ $item_id = $res['item_id'];
call_hooks("event_created", $event['id']);
diff --git a/include/expire.php b/include/expire.php
index 3a914a41d..f1002b890 100644
--- a/include/expire.php
+++ b/include/expire.php
@@ -1,4 +1,4 @@
-<?php
+<?php /** @file */
require_once('boot.php');
require_once('include/cli_startup.php');
diff --git a/include/fcontact.php b/include/fcontact.php
deleted file mode 100644
index 8821a985f..000000000
--- a/include/fcontact.php
+++ /dev/null
@@ -1,41 +0,0 @@
-<?php
-
-
-
-function fcontact_store($url,$name,$photo) {
-
- $nurl = str_replace(array('https:','//www.'), array('http:','//'), $url);
-
- $r = q("SELECT `id` FROM `fcontact` WHERE `url` = '%s' LIMIT 1",
- dbesc($nurl)
- );
-
- if(count($r))
- return $r[0]['id'];
-
- $r = q("INSERT INTO `fcontact` ( `url`, `name`, `photo` ) VALUES ( '%s', '%s', '%s' ) ",
- dbesc($nurl),
- dbesc($name),
- dbesc($photo)
- );
-
- if($r) {
- $r = q("SELECT `id` FROM `fcontact` WHERE `url` = '%s' LIMIT 1",
- dbesc($nurl)
- );
- if(count($r))
- return $r[0]['id'];
- }
-
- return 0;
-}
-
-function ffinder_store($uid,$cid,$fid) {
- $r = q("INSERT INTO `ffinder` ( `uid`, `cid`, `fid` ) VALUES ( %d, %d, %d ) ",
- intval($uid),
- intval($cid),
- intval($fid)
- );
- return $r;
-}
-
diff --git a/include/features.php b/include/features.php
index 094e96c78..1f83eb319 100644
--- a/include/features.php
+++ b/include/features.php
@@ -1,4 +1,4 @@
-<?php
+<?php /** @file */
/*
* Features management
@@ -19,12 +19,18 @@ function get_features() {
// General
'general' => array(
t('General Features'),
- array('expire', t('Content Expiration'), t('Remove old posts/comments after a period of time')),
+// This is per post, and different from fixed expiration 'expire' which isn't working yet
+ array('content_expire', t('Content Expiration'), t('Remove posts/comments and/or private messages at a future time')),
array('multi_profiles', t('Multiple Profiles'), t('Ability to create multiple profiles')),
array('webpages', t('Web Pages'), t('Provide managed web pages on your channel')),
+ array('private_notes', t('Private Notes'), t('Enables a tool to store notes and reminders')),
+// prettyphoto has licensing issues and will no longer be provided in core -
+// in any event this setting should probably be a theme option or plugin
+// array('prettyphoto', t('Enhanced Photo Albums'), t('Enable photo album with enhanced features')),
+ //FIXME - needs a description, but how the hell do we explain this to normals?
+ array('sendzid', t('Extended Identity Sharing'), t('Share your identity with all websites on the internet. When disabled, identity is only shared with sites in the matrix.')),
array('expert', t('Expert Mode'), t('Enable Expert Mode to provide advanced configuration options')),
-
-
+ array('premium_channel', t('Premium Channel'), t('Allows you to set restrictions and terms on those that connect with your channel')),
),
// Post composition
@@ -32,6 +38,8 @@ function get_features() {
t('Post Composition Features'),
array('richtext', t('Richtext Editor'), t('Enable richtext editor')),
array('preview', t('Post Preview'), t('Allow previewing posts and comments before publishing them')),
+ array('channel_sources', t('Channel Sources'), t('Automatically import channel content from other channels or feeds')),
+ array('content_encrypt', t('Even More Encryption'), t('Allow optional encryption of content end-to-end with a shared secret key')),
),
// Network Tools
@@ -43,18 +51,20 @@ function get_features() {
array('personal_tab', t('Network Personal Tab'), t('Enable tab to display only Network posts that you\'ve interacted on')),
array('new_tab', t('Network New Tab'), t('Enable tab to display all new Network activity')),
array('affinity', t('Affinity Tool'), t('Filter stream activity by depth of relationships')),
+ array('suggest', t('Suggest Channels'), t('Show channel suggestions')),
),
// Item tools
'tools' => array(
t('Post/Comment Tools'),
- array('multi_delete', t('Multiple Deletion'), t('Select and delete multiple posts/comments at once')),
+// array('multi_delete', t('Multiple Deletion'), t('Select and delete multiple posts/comments at once')),
array('edit_posts', t('Edit Sent Posts'), t('Edit and correct posts and comments after sending')),
array('commtag', t('Tagging'), t('Ability to tag existing posts')),
array('categories', t('Post Categories'), t('Add categories to your posts')),
array('filing', t('Saved Folders'), t('Ability to file posts under folders')),
array('dislike', t('Dislike Posts'), t('Ability to dislike posts/comments')),
array('star_posts', t('Star Posts'), t('Ability to mark special posts with a star indicator')),
+ array('tagadelic', t('Tag Cloud'), t('Provide a personal tag cloud on your channel page')),
),
);
diff --git a/include/follow.php b/include/follow.php
index a094a979f..845ce11da 100644
--- a/include/follow.php
+++ b/include/follow.php
@@ -1,4 +1,4 @@
-<?php
+<?php /** @file */
//
@@ -11,7 +11,7 @@
require_once('include/zot.php');
-function new_contact($uid,$url,$channel,$interactive = false) {
+function new_contact($uid,$url,$channel,$interactive = false, $confirm = false) {
$result = array('success' => false,'message' => '');
@@ -60,6 +60,11 @@ function new_contact($uid,$url,$channel,$interactive = false) {
return $result;
}
+ // Premium channel, set confirm before callback to avoid recursion
+
+ if(array_key_exists('connect_url',$j) && (! $confirm))
+ goaway(zid($j['connect_url']));
+
// check service class limits
@@ -91,7 +96,7 @@ function new_contact($uid,$url,$channel,$interactive = false) {
$global_perms = get_perms();
if( array_key_exists('permissions',$j) && array_key_exists('data',$j['permissions'])) {
- $permissions = aes_unencapsulate(array(
+ $permissions = crypto_unencapsulate(array(
'data' => $j['permissions']['data'],
'key' => $j['permissions']['key'],
'iv' => $j['permissions']['iv']),
@@ -111,7 +116,10 @@ function new_contact($uid,$url,$channel,$interactive = false) {
if((local_user()) && $uid == local_user()) {
$aid = get_account_id();
- $hash = $a->observer['xchan_hash'];
+ $hash = get_observer_hash();
+ $ch = $a->get_channel();
+ $default_group = $ch['channel_default_group'];
+
}
else {
$r = q("select * from channel where channel_id = %d limit 1",
@@ -123,6 +131,7 @@ function new_contact($uid,$url,$channel,$interactive = false) {
}
$aid = $r[0]['channel_account_id'];
$hash = $r[0]['channel_hash'];
+ $default_group = $r[0]['channel_default_group'];
}
if($hash == $xchan_hash) {
@@ -141,12 +150,13 @@ function new_contact($uid,$url,$channel,$interactive = false) {
);
}
else {
- $r = q("insert into abook ( abook_account, abook_channel, abook_xchan, abook_their_perms, abook_created, abook_updated )
- values( %d, %d, '%s', %d, '%s', '%s' ) ",
+ $r = q("insert into abook ( abook_account, abook_channel, abook_xchan, abook_their_perms, abook_my_perms, abook_created, abook_updated )
+ values( %d, %d, '%s', %d, %d, '%s', '%s' ) ",
intval($aid),
intval($uid),
dbesc($xchan_hash),
intval($their_perms),
+ intval(PERMS_W_STREAM|PERMS_W_MAIL),
dbesc(datetime_convert()),
dbesc(datetime_convert())
);
@@ -160,62 +170,25 @@ function new_contact($uid,$url,$channel,$interactive = false) {
dbesc($xchan_hash),
intval($uid)
);
- if($r)
+ if($r) {
$result['abook'] = $r[0];
-
- // Then send a ping/message to the other side
-
-
-/*
-
- $r = q("INSERT INTO `contact` ( `uid`, `created`, `url`, `nurl`, `addr`, `alias`, `batch`, `notify`, `poll`, `poco`, `name`, `nick`, `photo`, `network`, `pubkey`, `rel`, `priority`,
- `writable`, `hidden`, `blocked`, `readonly`, `pending` )
- VALUES ( %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, %d, %d, 0, 0, 0) ",
- intval($uid),
- dbesc(datetime_convert()),
- dbesc($ret['url']),
- dbesc(normalise_link($ret['url'])),
- dbesc($ret['addr']),
- dbesc($ret['alias']),
- dbesc($ret['batch']),
- dbesc($ret['notify']),
- dbesc($ret['poll']),
- dbesc($ret['poco']),
- dbesc($ret['name']),
- dbesc($ret['nick']),
- dbesc($ret['photo']),
- dbesc($ret['network']),
- dbesc($ret['pubkey']),
- intval($new_relation),
- intval($ret['priority']),
- intval($writeable),
- intval($hidden)
- );
+ proc_run('php', 'include/notifier.php', 'permission_update', $result['abook']['abook_id']);
}
- $r = q("SELECT * FROM `contact` WHERE `url` = '%s' AND `uid` = %d LIMIT 1",
- dbesc($ret['url']),
- intval($uid)
- );
+ $arr = array('channel_id' => $uid, 'abook' => $result['abook']);
- if(! count($r)) {
- $result['message'] .= t('Unable to retrieve contact information.') . EOL;
- return $result;
- }
-
- $contact = $r[0];
- $contact_id = $r[0]['id'];
+ call_hooks('follow', $arr);
+ /** If there is a default group for this channel, add this member to it */
- $g = q("select def_gid from user where uid = %d limit 1",
- intval($uid)
- );
- if($g && intval($g[0]['def_gid'])) {
+ if($default_group) {
require_once('include/group.php');
- group_add_member($uid,'',$contact_id,$g[0]['def_gid']);
+ $g = group_rec_byhash($uid,$default_group);
+ if($g)
+ group_add_member($uid,'',$xchan_hash,$g['id']);
}
-*/
+ // Then send a ping/message to the other side
$result['success'] = true;
diff --git a/include/friendica_smarty.php b/include/friendica_smarty.php
index 2f4694c58..12a789c9a 100644..100755
--- a/include/friendica_smarty.php
+++ b/include/friendica_smarty.php
@@ -1,7 +1,8 @@
-<?php
-
+<?php /** @file */
+require_once 'include/ITemplateEngine.php';
require_once("library/Smarty/libs/Smarty.class.php");
+
class FriendicaSmarty extends Smarty {
public $filename;
@@ -14,15 +15,17 @@ class FriendicaSmarty extends Smarty {
// setTemplateDir can be set to an array, which Smarty will parse in order.
// The order is thus very important here
- $template_dirs = array('theme' => "view/theme/$theme/tpl/smarty3/");
+ $template_dirs = array('theme' => "view/theme/$theme/tpl/");
if( x($a->theme_info,"extends") )
- $template_dirs = $template_dirs + array('extends' => "view/theme/".$a->theme_info["extends"]."/tpl/smarty3/");
- $template_dirs = $template_dirs + array('base' => 'view/tpl/smarty3/');
+ $template_dirs = $template_dirs + array('extends' => "view/theme/".$a->theme_info["extends"]."/tpl/");
+ $template_dirs = $template_dirs + array('base' => 'view/tpl/');
$this->setTemplateDir($template_dirs);
- $this->setCompileDir('view/tpl/smarty3/compiled/');
- $this->setConfigDir('view/tpl/smarty3/config/');
- $this->setCacheDir('view/tpl/smarty3/cache/');
+ $basecompiledir = $a->config['system']['smarty3_folder'];
+
+ $this->setCompileDir($basecompiledir.'/compiled/');
+ $this->setConfigDir($basecompiledir.'/config/');
+ $this->setCacheDir($basecompiledir.'/cache/');
$this->left_delimiter = $a->get_template_ldelim('smarty3');
$this->right_delimiter = $a->get_template_rdelim('smarty3');
@@ -41,3 +44,67 @@ class FriendicaSmarty extends Smarty {
+class FriendicaSmartyEngine implements ITemplateEngine {
+ static $name ="smarty3";
+
+ public function __construct(){
+ $a = get_app();
+ $basecompiledir = ((array_key_exists('smarty3_folder',$a->config['system'])) ? $a->config['system']['smarty3_folder'] : '');
+ if (!$basecompiledir) $basecompiledir = dirname(__dir__)."/view/tpl/smarty3";
+ if (!is_dir($basecompiledir)) {
+ echo "<b>ERROR:</b> folder <tt>$basecompiledir</tt> does not exist."; killme();
+ }
+ if(!is_writable($basecompiledir)){
+ echo "<b>ERROR:</b> folder <tt>$basecompiledir</tt> must be writable by webserver."; killme();
+ }
+ $a->config['system']['smarty3_folder'] = $basecompiledir;
+ }
+
+ // ITemplateEngine interface
+ public function replace_macros($s, $r) {
+ $template = '';
+ if(gettype($s) === 'string') {
+ $template = $s;
+ $s = new FriendicaSmarty();
+ }
+ foreach($r as $key=>$value) {
+ if($key[0] === '$') {
+ $key = substr($key, 1);
+ }
+ $s->assign($key, $value);
+ }
+ return $s->parsed($template);
+ }
+
+ public function get_markup_template($file, $root=''){
+ $template_file = theme_include($file, $root);
+ if($template_file) {
+ $template = new FriendicaSmarty();
+ $template->filename = $template_file;
+
+ return $template;
+ }
+ return "";
+ }
+
+ public function get_intltext_template($file, $root='') {
+ $a = get_app();
+
+ if(file_exists("view/{$a->language}/$file"))
+ $template_file = "view/{$a->language}/$file";
+ elseif(file_exists("view/en/$file"))
+ $template_file = "view/en/$file";
+ else
+ $template_file = theme_include($file,$root);
+ if($template_file) {
+ $template = new FriendicaSmarty();
+ $template->filename = $template_file;
+
+ return $template;
+ }
+ return "";
+ }
+
+
+
+}
diff --git a/include/gprobe.php b/include/gprobe.php
index 2cc87d149..48c1c8e14 100644
--- a/include/gprobe.php
+++ b/include/gprobe.php
@@ -1,4 +1,4 @@
-<?php
+<?php /** @file */
require_once('include/cli_startup.php');
require_once('include/zot.php');
diff --git a/include/group.php b/include/group.php
index 6042acbb4..cdd779df2 100644
--- a/include/group.php
+++ b/include/group.php
@@ -1,7 +1,7 @@
-<?php
+<?php /** @file */
-function group_add($uid,$name) {
+function group_add($uid,$name,$public = 0) {
$ret = false;
if(x($uid) && x($name)) {
@@ -14,11 +14,11 @@ function group_add($uid,$name) {
// access lists. What we're doing here is reviving the dead group, but old content which
// was restricted to this group may now be seen by the new group members.
- $z = q("SELECT * FROM `group` WHERE `id` = %d LIMIT 1",
+ $z = q("SELECT * FROM `groups` WHERE `id` = %d LIMIT 1",
intval($r)
);
if(count($z) && $z[0]['deleted']) {
- $r = q("UPDATE `group` SET `deleted` = 0 WHERE `uid` = %d AND `name` = '%s' LIMIT 1",
+ $r = q("UPDATE `groups` SET `deleted` = 0 WHERE `uid` = %d AND `name` = '%s' LIMIT 1",
intval($uid),
dbesc($name)
);
@@ -31,16 +31,17 @@ function group_add($uid,$name) {
$dups = false;
$hash = random_string() . $name;
- $r = q("SELECT id FROM `group` WHERE hash = '%s' LIMIT 1", dbesc($hash));
+ $r = q("SELECT id FROM `groups` WHERE hash = '%s' LIMIT 1", dbesc($hash));
if($r)
$dups = true;
} while($dups == true);
- $r = q("INSERT INTO `group` ( hash, uid, name )
- VALUES( '%s', %d, '%s' ) ",
+ $r = q("INSERT INTO `groups` ( hash, uid, visible, name )
+ VALUES( '%s', %d, %d, '%s' ) ",
dbesc($hash),
intval($uid),
+ intval($public),
dbesc($name)
);
$ret = $r;
@@ -52,40 +53,43 @@ function group_add($uid,$name) {
function group_rmv($uid,$name) {
$ret = false;
if(x($uid) && x($name)) {
- $r = q("SELECT id FROM `group` WHERE `uid` = %d AND `name` = '%s' LIMIT 1",
+ $r = q("SELECT id, hash FROM `groups` WHERE `uid` = %d AND `name` = '%s' LIMIT 1",
intval($uid),
dbesc($name)
);
- if(count($r))
+ if($r) {
$group_id = $r[0]['id'];
+ $group_hash = $r[0]['hash'];
+ }
+
if(! $group_id)
return false;
// remove group from default posting lists
- $r = q("SELECT channel_default_gid, channel_allow_gid, channel_deny_gid FROM channel WHERE channel_id = %d LIMIT 1",
+ $r = q("SELECT channel_default_group, channel_allow_gid, channel_deny_gid FROM channel WHERE channel_id = %d LIMIT 1",
intval($uid)
);
if($r) {
$user_info = $r[0];
$change = false;
- if($user_info['channel_default_gid'] == $group_id) {
- $user_info['channel_default_gid'] = 0;
+ if($user_info['channel_default_group'] == $group_hash) {
+ $user_info['channel_default_group'] = '';
$change = true;
}
if(strpos($user_info['channel_allow_gid'], '<' . $group_id . '>') !== false) {
- $user_info['channel_allow_gid'] = str_replace('<' . $group_id . '>', '', $user_info['channel_allow_gid']);
+ $user_info['channel_allow_gid'] = str_replace('<' . $group_hash . '>', '', $user_info['channel_allow_gid']);
$change = true;
}
if(strpos($user_info['channel_deny_gid'], '<' . $group_id . '>') !== false) {
- $user_info['channel_deny_gid'] = str_replace('<' . $group_id . '>', '', $user_info['channel_deny_gid']);
+ $user_info['channel_deny_gid'] = str_replace('<' . $group_hash . '>', '', $user_info['channel_deny_gid']);
$change = true;
}
if($change) {
- q("UPDATE channel SET channel_default_gid = %d, channel_allow_gid = '%s', channel_deny_gid = '%s'
+ q("UPDATE channel SET channel_default_group = '%s', channel_allow_gid = '%s', channel_deny_gid = '%s'
WHERE channel_id = %d",
- intval($user_info['channel_default_gid']),
+ intval($user_info['channel_default_group']),
dbesc($user_info['channel_allow_gid']),
dbesc($user_info['channel_deny_gid']),
intval($uid)
@@ -100,7 +104,7 @@ function group_rmv($uid,$name) {
);
// remove group
- $r = q("UPDATE `group` SET `deleted` = 1 WHERE `uid` = %d AND `name` = '%s' LIMIT 1",
+ $r = q("UPDATE `groups` SET `deleted` = 1 WHERE `uid` = %d AND `name` = '%s' LIMIT 1",
intval($uid),
dbesc($name)
);
@@ -115,7 +119,7 @@ function group_rmv($uid,$name) {
function group_byname($uid,$name) {
if((! $uid) || (! strlen($name)))
return false;
- $r = q("SELECT * FROM `group` WHERE `uid` = %d AND `name` = '%s' LIMIT 1",
+ $r = q("SELECT * FROM `groups` WHERE `uid` = %d AND `name` = '%s' LIMIT 1",
intval($uid),
dbesc($name)
);
@@ -124,6 +128,19 @@ function group_byname($uid,$name) {
return false;
}
+
+function group_rec_byhash($uid,$hash) {
+ if((! $uid) || (! strlen($hash)))
+ return false;
+ $r = q("SELECT * FROM `groups` WHERE `uid` = %d AND `hash` = '%s' LIMIT 1",
+ intval($uid),
+ dbesc($hash)
+ );
+ if($r)
+ return $r[0];
+ return false;
+}
+
function group_rmv_member($uid,$name,$member) {
$gid = group_byname($uid,$name);
if(! $gid)
@@ -171,9 +188,10 @@ function group_get_members($gid) {
if(intval($gid)) {
$r = q("SELECT * FROM `group_member`
LEFT JOIN abook ON abook_xchan = `group_member`.`xchan` left join xchan on xchan_hash = abook_xchan
- WHERE `gid` = %d AND `group_member`.`uid` = %d and not ( abook_flags & %d ) and not ( abook_flags & %d ) and not ( abook_flags & %d ) ORDER BY xchan_name ASC ",
+ WHERE `gid` = %d AND abook_channel = %d and `group_member`.`uid` = %d and not ( abook_flags & %d ) and not ( abook_flags & %d ) and not ( abook_flags & %d ) ORDER BY xchan_name ASC ",
intval($gid),
intval(local_user()),
+ intval(local_user()),
intval(ABOOK_FLAG_SELF),
intval(ABOOK_FLAG_BLOCKED),
intval(ABOOK_FLAG_PENDING)
@@ -184,18 +202,18 @@ function group_get_members($gid) {
return $ret;
}
-function mini_group_select($uid,$gid = 0) {
+function mini_group_select($uid,$group = '') {
$grps = array();
$o = '';
- $r = q("SELECT * FROM `group` WHERE `deleted` = 0 AND `uid` = %d ORDER BY `name` ASC",
+ $r = q("SELECT * FROM `groups` WHERE `deleted` = 0 AND `uid` = %d ORDER BY `name` ASC",
intval($uid)
);
- $grps[] = array('name' => '', 'id' => '0', 'selected' => '');
+ $grps[] = array('name' => '', 'hash' => '0', 'selected' => '');
if(count($r)) {
foreach($r as $rr) {
- $grps[] = array('name' => $rr['name'], 'id' => $rr['id'], 'selected' => (($gid == $rr['id']) ? 'true' : ''));
+ $grps[] = array('name' => $rr['name'], 'id' => $rr['hash'], 'selected' => (($group == $rr['hash']) ? 'true' : ''));
}
}
@@ -211,7 +229,7 @@ function mini_group_select($uid,$gid = 0) {
-function group_side($every="contacts",$each="group",$edit = false, $group_id = 0, $cid = '') {
+function group_side($every="connections",$each="group",$edit = false, $group_id = 0, $cid = '',$mode = 1) {
$o = '';
@@ -221,14 +239,14 @@ function group_side($every="contacts",$each="group",$edit = false, $group_id = 0
$groups = array();
$groups[] = array(
- 'text' => t('All Connections'),
+ 'text' => t('All Channels'),
'id' => 0,
'selected' => (($group_id == 0) ? 'group-selected' : ''),
'href' => $every,
);
- $r = q("SELECT * FROM `group` WHERE `deleted` = 0 AND `uid` = %d ORDER BY `name` ASC",
+ $r = q("SELECT * FROM `groups` WHERE `deleted` = 0 AND `uid` = %d ORDER BY `name` ASC",
intval($_SESSION['uid'])
);
$member_of = array();
@@ -254,7 +272,7 @@ function group_side($every="contacts",$each="group",$edit = false, $group_id = 0
'cid' => $cid,
'text' => $rr['name'],
'selected' => $selected,
- 'href' => (($each === 'network') ? $each.'?f=&gid='.$rr['id'] : $each."/".$rr['id']),
+ 'href' => (($mode == 0) ? $each.'?f=&gid='.$rr['id'] : $each."/".$rr['id']),
'edit' => $groupedit,
'ismember' => in_array($rr['id'],$member_of),
);
@@ -279,12 +297,15 @@ function group_side($every="contacts",$each="group",$edit = false, $group_id = 0
function expand_groups($a) {
if(! (is_array($a) && count($a)))
return array();
- stringify_array_elms($groups);
- $groups = implode(',', $a);
- $groups = dbesc($groups);
- $r = q("SELECT xchan FROM `group_member` WHERE `gid` IN ( $groups )");
+ $x = $a;
+ stringify_array_elms($x,true);
+ $groups = implode(',', $x);
+
+ if($groups)
+ $r = q("SELECT xchan FROM group_member WHERE gid IN ( select id from `groups` where hash in ( $groups ))");
$ret = array();
- if(count($r))
+
+ if($r)
foreach($r as $rr)
$ret[] = $rr['xchan'];
return $ret;
@@ -293,7 +314,7 @@ function expand_groups($a) {
function member_of($c) {
- $r = q("SELECT `group`.`name`, `group`.`id` FROM `group` LEFT JOIN `group_member` ON `group_member`.`gid` = `group`.`id` WHERE `group_member`.`xchan` = '%s' AND `group`.`deleted` = 0 ORDER BY `group`.`name` ASC ",
+ $r = q("SELECT `groups`.`name`, `groups`.`id` FROM `groups` LEFT JOIN `group_member` ON `group_member`.`gid` = `groups`.`id` WHERE `group_member`.`xchan` = '%s' AND `groups`.`deleted` = 0 ORDER BY `groups`.`name` ASC ",
dbesc($c)
);
diff --git a/include/html2bbcode.php b/include/html2bbcode.php
index 985c36eaa..9bb755da5 100644
--- a/include/html2bbcode.php
+++ b/include/html2bbcode.php
@@ -1,4 +1,4 @@
-<?php
+<?php /** @file */
/*
html2bbcode.php
Converter for HTML to BBCode
diff --git a/include/html2plain.php b/include/html2plain.php
index b8c9c440d..2f5be7f69 100644
--- a/include/html2plain.php
+++ b/include/html2plain.php
@@ -1,4 +1,4 @@
-<?php
+<?php /** @file */
require_once "html2bbcode.php";
function breaklines($line, $level, $wraplength = 75)
@@ -219,4 +219,4 @@ function html2plain($html, $wraplength = 75, $compact = false)
return(trim($message));
}
-?>
+
diff --git a/include/identity.php b/include/identity.php
index 62092443e..30b6e4b6b 100644
--- a/include/identity.php
+++ b/include/identity.php
@@ -1,13 +1,28 @@
-<?php
+<?php /** @file */
require_once('include/zot.php');
require_once('include/crypto.php');
+/**
+ * @function identity_check_service_class($account_id)
+ * Called when creating a new channel. Checks the account's service class and number
+ * of current channels to determine whether creating a new channel is within the current
+ * service class constraints.
+ *
+ * @param int $account_id
+ * Account_id used for this request
+ *
+ * @returns array
+ * 'success' => boolean true if creating a new channel is allowed for this account
+ * 'message' => if success is false, optional error text
+ */
+
+
function identity_check_service_class($account_id) {
$ret = array('success' => false, $message => '');
- $r = q("select count(channel_id) as total from channel were channel_account_id = %d ",
+ $r = q("select count(channel_id) as total from channel where channel_account_id = %d ",
intval($account_id)
);
if(! ($r && count($r))) {
@@ -24,11 +39,22 @@ function identity_check_service_class($account_id) {
return $ret;
}
-// Return an error message if the name is not valid. We're currently only checking
-// for an empty name or one that exceeds our storage limit (255 chars).
-// 255 chars is probably going to create a mess on some pages.
-// Plugins can set additional policies such as full name requirements, character sets, multi-byte
-// length, etc.
+
+/**
+ * @function validate_channelname($name)
+ * Determine if the channel name is allowed when creating a new channel.
+ * This action is pluggable.
+ *
+ * @param string $name
+ *
+ * @returns nil return if name is valid, or string describing the error state.
+ *
+ * We're currently only checking for an empty name or one that exceeds our storage limit (255 chars).
+ * 255 chars is probably going to create a mess on some pages.
+ * Plugins can set additional policies such as full name requirements, character sets, multi-byte
+ * length, etc.
+ *
+ */
function validate_channelname($name) {
@@ -44,10 +70,70 @@ function validate_channelname($name) {
}
-// Required: name, nickname, account_id
+/**
+ * @function create_sys_channel()
+ * Create a system channel - which has no account attached
+ *
+ */
+
+function create_sys_channel() {
+ if(get_sys_channel())
+ return;
+ create_identity(array(
+ 'account_id' => 'xxx', // This will create an identity with an (integer) account_id of 0, but account_id is required
+ 'nickname' => 'sys',
+ 'name' => 'System',
+ 'pageflags' => PAGE_SYSTEM,
+ 'publish' => 0,
+ 'xchanflags' => XCHAN_FLAGS_SYSTEM
+ ));
+}
+
+function get_sys_channel() {
+ $r = q("select * from channel left join xchan on channel_hash = xchan_hash where (channel_pageflags & %d) limit 1",
+ intval(PAGE_SYSTEM)
+ );
+ if($r)
+ return $r[0];
+ return false;
+}
+
+
+/**
+ * @channel_total()
+ * Return the total number of channels on this site. No filtering is performed.
+ *
+ * @returns int
+ * on error returns boolean false
+ *
+ */
+
+function channel_total() {
+ $r = q("select channel_id from channel where true");
+ if(is_array($r))
+ return count($r);
+ return false;
+}
-// optional: pageflags
+/**
+ * @function create_identity($arr)
+ * Create a new channel
+ * Also creates the related xchan, hubloc, profile, and "self" abook records, and an
+ * empty "Friends" group/collection for the new channel
+ *
+ * @param array $arr
+ * 'name' => full name of channel
+ * 'nickname' => "email/url-compliant" nickname
+ * 'account_id' => account_id to attach with this channel
+ * [other identity fields as desired]
+ *
+ * @returns array
+ * 'success' => boolean true or false
+ * 'message' => optional error text if success is false
+ * 'channel' => if successful the created channel array
+ */
+
function create_identity($arr) {
$a = get_app();
@@ -57,11 +143,20 @@ function create_identity($arr) {
$ret['message'] = t('No account identifier');
return $ret;
}
+ $ret=identity_check_service_class($arr['account_id']);
+ if (!$ret['success']) {
+ return $ret;
+ }
+
+ $nick = mb_strtolower(trim($arr['nickname']));
+ if(! $nick) {
+ $ret['message'] = t('Nickname is required.');
+ return $ret;
+ }
- $nick = trim($arr['nickname']);
$name = escape_tags($arr['name']);
$pageflags = ((x($arr,'pageflags')) ? intval($arr['pageflags']) : PAGE_NORMAL);
-
+ $xchanflags = ((x($arr,'xchanflags')) ? intval($arr['xchanflags']) : XCHAN_FLAGS_NORMAL);
$name_error = validate_channelname($arr['name']);
if($name_error) {
$ret['message'] = $name_error;
@@ -92,11 +187,19 @@ function create_identity($arr) {
if(array_key_exists('primary', $arr))
$primary = intval($arr['primary']);
+ $perms_sql = '';
+
+ $defperms = site_default_perms();
+ $global_perms = get_perms();
+ foreach($defperms as $p => $v) {
+ $perms_keys .= ', ' . $global_perms[$p][0];
+ $perms_vals .= ', ' . intval($v);
+ }
$r = q("insert into channel ( channel_account_id, channel_primary,
channel_name, channel_address, channel_guid, channel_guid_sig,
- channel_hash, channel_prvkey, channel_pubkey, channel_pageflags )
- values ( %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d ) ",
+ channel_hash, channel_prvkey, channel_pubkey, channel_pageflags $perms_keys )
+ values ( %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d $perms_vals ) ",
intval($arr['account_id']),
intval($primary),
@@ -107,9 +210,12 @@ function create_identity($arr) {
dbesc($hash),
dbesc($key['prvkey']),
dbesc($key['pubkey']),
- intval(PAGE_NORMAL)
+ intval($pageflags)
);
+
+
+
$r = q("select * from channel where channel_account_id = %d
and channel_guid = '%s' limit 1",
intval($arr['account_id']),
@@ -123,16 +229,8 @@ function create_identity($arr) {
$ret['channel'] = $r[0];
- set_default_login_identity($arr['account_id'],$ret['channel']['channel_id'],false);
-
- // Ensure that there is a host keypair.
-
- if((! get_config('system','pubkey')) && (! get_config('system','prvkey'))) {
- $hostkey = new_keypair(4096);
- set_config('system','pubkey',$hostkey['pubkey']);
- set_config('system','prvkey',$hostkey['prvkey']);
- }
-
+ if(intval($arr['account_id']))
+ set_default_login_identity($arr['account_id'],$ret['channel']['channel_id'],false);
// Create a verified hub location pointing to this site.
@@ -156,7 +254,7 @@ function create_identity($arr) {
$newuid = $ret['channel']['channel_id'];
- $r = q("insert into xchan ( xchan_hash, xchan_guid, xchan_guid_sig, xchan_pubkey, xchan_photo_l, xchan_photo_m, xchan_photo_s, xchan_addr, xchan_url, xchan_name, xchan_network, xchan_photo_date, xchan_name_date ) values ('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s')",
+ $r = q("insert into xchan ( xchan_hash, xchan_guid, xchan_guid_sig, xchan_pubkey, xchan_photo_l, xchan_photo_m, xchan_photo_s, xchan_addr, xchan_url, xchan_follow, xchan_connurl, xchan_name, xchan_network, xchan_photo_date, xchan_name_date, xchan_flags ) values ('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d)",
dbesc($hash),
dbesc($guid),
dbesc($sig),
@@ -166,10 +264,13 @@ function create_identity($arr) {
dbesc($a->get_baseurl() . "/photo/profile/s/{$newuid}"),
dbesc($ret['channel']['channel_address'] . '@' . get_app()->get_hostname()),
dbesc(z_root() . '/channel/' . $ret['channel']['channel_address']),
+ dbesc(z_root() . '/follow?f=&url=%s'),
+ dbesc(z_root() . '/poco/' . $ret['channel']['channel_address']),
dbesc($ret['channel']['channel_name']),
dbesc('zot'),
dbesc(datetime_convert()),
- dbesc(datetime_convert())
+ dbesc(datetime_convert()),
+ intval($xchanflags)
);
// Not checking return value.
@@ -200,37 +301,69 @@ function create_identity($arr) {
intval(ABOOK_FLAG_SELF)
);
+ if(intval($ret['channel']['channel_account_id'])) {
- // Create a group with no members. This allows somebody to use it
- // right away as a default group for new contacts.
-
- require_once('include/group.php');
- group_add($newuid, t('Friends'));
+ // Create a group with no members. This allows somebody to use it
+ // right away as a default group for new contacts.
- call_hooks('register_account', $newuid);
+ require_once('include/group.php');
+ group_add($newuid, t('Friends'));
- proc_run('php','include/directory.php', $ret['channel']['channel_id']);
+ call_hooks('register_account', $newuid);
+
+ proc_run('php','include/directory.php', $ret['channel']['channel_id']);
+ }
$ret['success'] = true;
return $ret;
}
-// set default identity for account_id to channel_id
-// if $force is false only do this if there is no current default
+
+/**
+ * @function set_default_login_identity($account_id, $channel_id, $force = true)
+ * Set default channel to be used on login
+ *
+ * @param int $account_id
+ * login account
+ * @param int $channel_id
+ * channel id to set as default for this account
+ * @param boolean force
+ * if true, set this default unconditionally
+ * if $force is false only do this if there is no existing default
+ *
+ * @returns nil
+ */
function set_default_login_identity($account_id,$channel_id,$force = true) {
$r = q("select account_default_channel from account where account_id = %d limit 1",
intval($account_id)
);
- if(($r) && (count($r)) && ((! intval($r[0]['account_default_channel'])) || $force)) {
- $r = q("update account set account_default_channel = %d where account_id = %d limit 1",
- intval($channel_id),
- intval($account_id)
- );
+ if($r) {
+ if((intval($r[0]['account_default_channel']) == 0) || ($force)) {
+ $r = q("update account set account_default_channel = %d where account_id = %d limit 1",
+ intval($channel_id),
+ intval($account_id)
+ );
+ }
}
}
+/**
+ * @function identity_basic_export($channel_id)
+ * Create an array representing the important channel information
+ * which would be necessary to create a nomadic identity clone. This includes
+ * most channel resources and connection information with the exception of content.
+ *
+ * @param int $channel_id
+ * Channel_id to export
+ *
+ *
+ * @returns array
+ * See function for details
+ *
+ */
+
function identity_basic_export($channel_id) {
/*
@@ -239,7 +372,7 @@ function identity_basic_export($channel_id) {
$ret = array();
- $ret['compatibility'] = array('project' => FRIENDICA_PLATFORM, 'version' => FRIENDICA_VERSION, 'database' => DB_UPDATE_VERSION);
+ $ret['compatibility'] = array('project' => RED_PLATFORM, 'version' => RED_VERSION, 'database' => DB_UPDATE_VERSION);
$r = q("select * from channel where channel_id = %d limit 1",
intval($channel_id)
@@ -275,6 +408,26 @@ function identity_basic_export($channel_id) {
$ret['hubloc'] = $r;
}
+ $r = q("select * from `groups` where uid = %d ",
+ intval($channel_id)
+ );
+
+ if($r)
+ $ret['group'] = $r;
+
+ $r = q("select * from group_member where uid = %d ",
+ intval($channel_id)
+ );
+ if($r)
+ $ret['group_member'] = $r;
+
+ $r = q("select * from pconfig where uid = %d",
+ intval($channel_id)
+ );
+ if($r)
+ $ret['config'] = $r;
+
+
$r = q("select type, data from photo where scale = 4 and profile = 1 and uid = %d limit 1",
intval($channel_id)
);
@@ -289,49 +442,703 @@ function identity_basic_export($channel_id) {
-function identity_basic_import($arr, $seize_primary = false) {
+/**
+ *
+ * @function : profile_load(&$a, $nickname, $profile)
+ * Generate
+ * @param App $a
+ * @param string $nickname
+ * @param string $profile
+ *
+ * Summary: Loads a profile into the App structure.
+ * The function requires a writeable copy of the main App structure, and the nickname
+ * of a valid channel.
+ *
+ * Permissions of the current observer are checked. If a restricted profile is available
+ * to the current observer, that will be loaded instead of the channel default profile.
+ *
+ * The channel owner can set $profile to a valid profile_guid to preview that profile.
+ *
+ * The channel default theme is also selected for use, unless over-riden elsewhere.
+ *
+ */
- $ret = array('result' => false );
- if($arr['channel']) {
- // import channel
+function profile_load(&$a, $nickname, $profile = '') {
- // create a new xchan (if necessary)
+ logger('profile_load: ' . $nickname . (($profile) ? ' profile: ' . $profile : ''));
- // create a new hubloc and seize control if applicable
+ $user = q("select channel_id from channel where channel_address = '%s' limit 1",
+ dbesc($nickname)
+ );
+
+ if(! $user) {
+ logger('profile error: ' . $a->query_string, LOGGER_DEBUG);
+ notice( t('Requested channel is not available.') . EOL );
+ $a->error = 404;
+ return;
+ }
+ // get the current observer
+ $observer = $a->get_observer();
+ // Can the observer see our profile?
+ require_once('include/permissions.php');
+ if(! perm_is_allowed($user[0]['channel_id'],$observer['xchan_hash'],'view_profile')) {
+ // permission denied
+ notice( t(' Sorry, you don\'t have the permission to view this profile. ') . EOL);
+ return;
}
- if($arr['profile']) {
- // FIXME - change profile assignment to a hash instead of an id we have to fix
+ if(! $profile) {
+ $r = q("SELECT abook_profile FROM abook WHERE abook_xchan = '%s' and abook_channel = '%d' limit 1",
+ dbesc($observer['xchan_hash']),
+ intval($user[0]['channel_id'])
+ );
+ if($r)
+ $profile = $r[0]['abook_profile'];
+ }
+ $r = null;
+
+ if($profile) {
+ $r = q("SELECT profile.uid AS profile_uid, profile.*, channel.* FROM profile
+ LEFT JOIN channel ON profile.uid = channel.channel_id
+ WHERE channel.channel_address = '%s' AND profile.profile_guid = '%s' LIMIT 1",
+ dbesc($nickname),
+ dbesc($profile)
+ );
+ }
+ if(! $r) {
+ $r = q("SELECT profile.uid AS profile_uid, profile.*, channel.* FROM profile
+ LEFT JOIN channel ON profile.uid = channel.channel_id
+ WHERE channel.channel_address = '%s' and not ( channel_pageflags & %d )
+ AND profile.is_default = 1 LIMIT 1",
+ dbesc($nickname),
+ intval(PAGE_REMOVED)
+ );
}
- if($arr['xchan']) {
+ if(! $r) {
+ logger('profile error: ' . $a->query_string, LOGGER_DEBUG);
+ notice( t('Requested profile is not available.') . EOL );
+ $a->error = 404;
+ return;
+ }
+
+ // fetch user tags if this isn't the default profile
- // import any xchan and hubloc which are not yet available on this site
- // Unset primary for all other hubloc on our own record if $seize_primary
+ if(! $r[0]['is_default']) {
+ $x = q("select `keywords` from `profile` where uid = %d and `is_default` = 1 limit 1",
+ intval($profile_uid)
+ );
+ if($x)
+ $r[0]['keywords'] = $x[0]['keywords'];
+ }
+ if($r[0]['keywords']) {
+ $keywords = str_replace(array('#',',',' ',',,'),array('',' ',',',','),$r[0]['keywords']);
+ if(strlen($keywords))
+ $a->page['htmlhead'] .= '<meta name="keywords" content="' . htmlentities($keywords,ENT_COMPAT,'UTF-8') . '" />' . "\r\n" ;
}
- if($arr['abook']) {
- // import the abook entries
+ $a->profile = $r[0];
+ $a->profile_uid = $r[0]['profile_uid'];
+
+ $a->page['title'] = $a->profile['channel_name'] . " - " . $a->profile['channel_address'] . "@" . $a->get_hostname();
+ $a->profile['channel_mobile_theme'] = get_pconfig(local_user(),'system', 'mobile_theme');
+ $_SESSION['theme'] = $a->profile['channel_theme'];
+ $_SESSION['mobile_theme'] = $a->profile['channel_mobile_theme'];
+
+ /**
+ * load/reload current theme info
+ */
+ $a->set_template_engine(); // reset the template engine to the default in case the user's theme doesn't specify one
+
+ $theme_info_file = "view/theme/".current_theme()."/php/theme.php";
+ if (file_exists($theme_info_file)){
+ require_once($theme_info_file);
}
+ return;
+}
+
+function profile_create_sidebar(&$a,$connect = true) {
+
+ $block = (((get_config('system','block_public')) && (! local_user()) && (! remote_user())) ? true : false);
+
+ $a->set_widget('profile',profile_sidebar($a->profile, $block, $connect));
+ return;
+}
+
+
+/**
+ *
+ * Function: profile_sidebar
+ *
+ * Formats a profile for display in the sidebar.
+ * It is very difficult to templatise the HTML completely
+ * because of all the conditional logic.
+ *
+ * @parameter: array $profile
+ *
+ * Returns HTML string stuitable for sidebar inclusion
+ * Exceptions: Returns empty string if passed $profile is wrong type or not populated
+ *
+ */
+
+
+
+function profile_sidebar($profile, $block = 0, $show_connect = true) {
+
+ $a = get_app();
+
+ $observer = $a->get_observer();
- if($seize_primary) {
+ $o = '';
+ $location = false;
+ $address = false;
+ $pdesc = true;
- // send a refresh message to all our friends, telling them we've moved
+ if((! is_array($profile)) && (! count($profile)))
+ return $o;
+
+ head_set_icon($profile['thumb']);
+
+ $is_owner = (($profile['uid'] == local_user()) ? true : false);
+
+ $profile['picdate'] = urlencode($profile['picdate']);
+
+ call_hooks('profile_sidebar_enter', $profile);
+
+ require_once('include/Contact.php');
+
+ if($show_connect) {
+
+ // This will return an empty string if we're already connected.
+
+ $connect_url = rconnect_url($profile['uid'],get_observer_hash());
+ $connect = (($connect_url) ? t('Connect') : '');
+ if($connect_url)
+ $connect_url = sprintf($connect_url,urlencode($profile['channel_address'] . '@' . $a->get_hostname()));
+
+ // premium channel - over-ride
+
+ if($profile['channel_pageflags'] & PAGE_PREMIUM)
+ $connect_url = z_root() . '/connect/' . $profile['channel_address'];
}
+ // show edit profile to yourself
+ if($is_owner) {
+
+ $profile['menu'] = array(
+ 'chg_photo' => t('Change profile photo'),
+ 'entries' => array(),
+ );
- $ret['result'] = true ;
- return $ret;
+ if(feature_enabled(local_user(),'multi_profiles')) {
+ $profile['edit'] = array($a->get_baseurl(). '/profiles', t('Profiles'),"", t('Manage/edit profiles'));
+ $profile['menu']['cr_new'] = t('Create New Profile');
+ }
+ else
+ $profile['edit'] = array($a->get_baseurl() . '/profiles/' . $profile['id'], t('Edit Profile'),'',t('Edit Profile'));
+
+ $r = q("SELECT * FROM `profile` WHERE `uid` = %d",
+ local_user());
+
+
+ if($r) {
+ foreach($r as $rr) {
+ $profile['menu']['entries'][] = array(
+ 'photo' => $rr['thumb'],
+ 'id' => $rr['id'],
+ 'alt' => t('Profile Image'),
+ 'profile_name' => $rr['profile_name'],
+ 'isdefault' => $rr['is_default'],
+ 'visible_to_everybody' => t('visible to everybody'),
+ 'edit_visibility' => t('Edit visibility'),
+ );
+ }
+ }
+ }
+
+
+ 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:');
+
+ $gender = ((x($profile,'gender') == 1) ? t('Gender:') : False);
+ $marital = ((x($profile,'marital') == 1) ? t('Status:') : False);
+ $homepage = ((x($profile,'homepage') == 1) ? t('Homepage:') : False);
+
+ if(! perm_is_allowed($profile['uid'],((is_array($observer)) ? $observer['xchan_hash'] : ''),'view_profile')) {
+ $block = true;
+ }
+
+ if(($profile['hidewall'] || $block) && (! local_user()) && (! remote_user())) {
+ $location = $pdesc = $gender = $marital = $homepage = False;
+ }
+
+ $firstname = ((strpos($profile['name'],' '))
+ ? trim(substr($profile['name'],0,strpos($profile['name'],' '))) : $profile['name']);
+ $lastname = (($firstname === $profile['name']) ? '' : trim(substr($profile['name'],strlen($firstname))));
+
+ if(is_array($observer)
+ && perm_is_allowed($profile['uid'],$observer['xchan_hash'],'view_contacts')) {
+ $contact_block = contact_block();
+ }
-} \ No newline at end of file
+ $channel_menu = false;
+ $menu = get_pconfig($profile['uid'],'system','channel_menu');
+ if($menu) {
+ require_once('include/menu.php');
+ $m = menu_fetch($menu,$profile['uid'],$observer['xchan_hash']);
+ if($m)
+ $channel_menu = menu_render($m);
+ }
+ $menublock = get_pconfig($profile['uid'],'system','channel_menublock');
+ if ($menublock && (! $block)) {
+ require_once('include/comanche.php');
+ $channel_menu .= comanche_block($menublock);
+ }
+
+ $tpl = get_markup_template('profile_vcard.tpl');
+
+ $o .= replace_macros($tpl, array(
+ '$profile' => $profile,
+ '$connect' => $connect,
+ '$connect_url' => $connect_url,
+ '$location' => $location,
+ '$gender' => $gender,
+ '$pdesc' => $pdesc,
+ '$marital' => $marital,
+ '$homepage' => $homepage,
+ '$chanmenu' => $channel_menu,
+ '$contact_block' => $contact_block,
+ ));
+
+ $arr = array('profile' => &$profile, 'entry' => &$o);
+
+ call_hooks('profile_sidebar', $arr);
+
+ return $o;
+}
+
+
+// FIXME or remove
+
+
+ function get_birthdays() {
+
+ $a = get_app();
+ $o = '';
+
+ if(! local_user())
+ return $o;
+
+ $bd_format = t('g A l F d') ; // 8 AM Friday January 18
+ $bd_short = t('F d');
+
+ $r = q("SELECT `event`.*, `event`.`id` AS `eid`, `contact`.* FROM `event`
+ LEFT JOIN `contact` ON `contact`.`id` = `event`.`cid`
+ WHERE `event`.`uid` = %d AND `type` = 'birthday' AND `start` < '%s' AND `finish` > '%s'
+ ORDER BY `start` ASC ",
+ intval(local_user()),
+ dbesc(datetime_convert('UTC','UTC','now + 6 days')),
+ dbesc(datetime_convert('UTC','UTC','now'))
+ );
+
+ if($r && count($r)) {
+ $total = 0;
+ $now = strtotime('now');
+ $cids = array();
+
+ $istoday = false;
+ foreach($r as $rr) {
+ if(strlen($rr['name']))
+ $total ++;
+ if((strtotime($rr['start'] . ' +00:00') < $now) && (strtotime($rr['finish'] . ' +00:00') > $now))
+ $istoday = true;
+ }
+ $classtoday = $istoday ? ' birthday-today ' : '';
+ if($total) {
+ foreach($r as &$rr) {
+ if(! strlen($rr['name']))
+ continue;
+
+ // avoid duplicates
+
+ if(in_array($rr['cid'],$cids))
+ continue;
+ $cids[] = $rr['cid'];
+
+ $today = (((strtotime($rr['start'] . ' +00:00') < $now) && (strtotime($rr['finish'] . ' +00:00') > $now)) ? true : false);
+ $sparkle = '';
+ $url = $rr['url'];
+ if($rr['network'] === NETWORK_DFRN) {
+ $sparkle = " sparkle";
+ $url = $a->get_baseurl() . '/redir/' . $rr['cid'];
+ }
+
+ $rr['link'] = $url;
+ $rr['title'] = $rr['name'];
+ $rr['date'] = day_translate(datetime_convert('UTC', $a->timezone, $rr['start'], $rr['adjust'] ? $bd_format : $bd_short)) . (($today) ? ' ' . t('[today]') : '');
+ $rr['startime'] = Null;
+ $rr['today'] = $today;
+
+ }
+ }
+ }
+ $tpl = get_markup_template("birthdays_reminder.tpl");
+ return replace_macros($tpl, array(
+ '$baseurl' => $a->get_baseurl(),
+ '$classtoday' => $classtoday,
+ '$count' => $total,
+ '$event_reminders' => t('Birthday Reminders'),
+ '$event_title' => t('Birthdays this week:'),
+ '$events' => $r,
+ '$lbr' => '{', // raw brackets mess up if/endif macro processing
+ '$rbr' => '}'
+
+ ));
+ }
+
+
+// FIXME
+
+
+ function get_events() {
+
+ require_once('include/bbcode.php');
+
+ $a = get_app();
+
+ if(! local_user())
+ return $o;
+
+ $bd_format = t('g A l F d') ; // 8 AM Friday January 18
+ $bd_short = t('F d');
+
+ $r = q("SELECT `event`.* FROM `event`
+ WHERE `event`.`uid` = %d AND `type` != 'birthday' AND `start` < '%s' AND `start` > '%s'
+ ORDER BY `start` ASC ",
+ intval(local_user()),
+ dbesc(datetime_convert('UTC','UTC','now + 6 days')),
+ dbesc(datetime_convert('UTC','UTC','now - 1 days'))
+ );
+
+ if($r && count($r)) {
+ $now = strtotime('now');
+ $istoday = false;
+ foreach($r as $rr) {
+ if(strlen($rr['name']))
+ $total ++;
+
+ $strt = datetime_convert('UTC',$rr['convert'] ? $a->timezone : 'UTC',$rr['start'],'Y-m-d');
+ if($strt === datetime_convert('UTC',$a->timezone,'now','Y-m-d'))
+ $istoday = true;
+ }
+ $classtoday = (($istoday) ? 'event-today' : '');
+
+
+ foreach($r as &$rr) {
+ if($rr['adjust'])
+ $md = datetime_convert('UTC',$a->timezone,$rr['start'],'Y/m');
+ else
+ $md = datetime_convert('UTC','UTC',$rr['start'],'Y/m');
+ $md .= "/#link-".$rr['id'];
+
+ $title = substr(strip_tags(bbcode($rr['desc'])),0,32) . '... ';
+ if(! $title)
+ $title = t('[No description]');
+
+ $strt = datetime_convert('UTC',$rr['convert'] ? $a->timezone : 'UTC',$rr['start']);
+ $today = ((substr($strt,0,10) === datetime_convert('UTC',$a->timezone,'now','Y-m-d')) ? true : false);
+
+ $rr['link'] = $md;
+ $rr['title'] = $title;
+ $rr['date'] = day_translate(datetime_convert('UTC', $rr['adjust'] ? $a->timezone : 'UTC', $rr['start'], $bd_format)) . (($today) ? ' ' . t('[today]') : '');
+ $rr['startime'] = $strt;
+ $rr['today'] = $today;
+ }
+ }
+
+ $tpl = get_markup_template("events_reminder.tpl");
+ return replace_macros($tpl, array(
+ '$baseurl' => $a->get_baseurl(),
+ '$classtoday' => $classtoday,
+ '$count' => count($r),
+ '$event_reminders' => t('Event Reminders'),
+ '$event_title' => t('Events this week:'),
+ '$events' => $r,
+ ));
+ }
+
+
+function advanced_profile(&$a) {
+
+ if(! perm_is_allowed($a->profile['profile_uid'],get_observer_hash(),'view_profile'))
+ return '';
+
+ $o = '';
+
+ $o .= '<h2>' . t('Profile') . '</h2>';
+
+ if($a->profile['name']) {
+
+ $tpl = get_markup_template('profile_advanced.tpl');
+
+ $profile = array();
+
+ $profile['fullname'] = array( t('Full Name:'), $a->profile['name'] ) ;
+
+ if($a->profile['gender']) $profile['gender'] = array( t('Gender:'), $a->profile['gender'] );
+
+
+ if(($a->profile['dob']) && ($a->profile['dob'] != '0000-00-00')) {
+
+ $year_bd_format = t('j F, Y');
+ $short_bd_format = t('j F');
+
+
+ $val = ((intval($a->profile['dob']))
+ ? day_translate(datetime_convert('UTC','UTC',$a->profile['dob'] . ' 00:00 +00:00',$year_bd_format))
+ : day_translate(datetime_convert('UTC','UTC','2001-' . substr($a->profile['dob'],5) . ' 00:00 +00:00',$short_bd_format)));
+
+ $profile['birthday'] = array( t('Birthday:'), $val);
+
+ }
+
+ if($age = age($a->profile['dob'],$a->profile['timezone'],'')) $profile['age'] = array( t('Age:'), $age );
+
+
+ if($a->profile['marital']) $profile['marital'] = array( t('Status:'), $a->profile['marital']);
+
+
+ if($a->profile['with']) $profile['marital']['with'] = $a->profile['with'];
+
+ if(strlen($a->profile['howlong']) && $a->profile['howlong'] !== '0000-00-00 00:00:00') {
+ $profile['howlong'] = relative_date($a->profile['howlong'], t('for %1$d %2$s'));
+ }
+
+ if($a->profile['sexual']) $profile['sexual'] = array( t('Sexual Preference:'), $a->profile['sexual'] );
+
+ if($a->profile['homepage']) $profile['homepage'] = array( t('Homepage:'), linkify($a->profile['homepage']) );
+
+ if($a->profile['hometown']) $profile['hometown'] = array( t('Hometown:'), linkify($a->profile['hometown']) );
+
+ if($a->profile['keywords']) $profile['keywords'] = array( t('Tags:'), $a->profile['keywords']);
+
+ if($a->profile['politic']) $profile['politic'] = array( t('Political Views:'), $a->profile['politic']);
+
+ if($a->profile['religion']) $profile['religion'] = array( t('Religion:'), $a->profile['religion']);
+
+ if($txt = prepare_text($a->profile['about'])) $profile['about'] = array( t('About:'), $txt );
+
+ if($txt = prepare_text($a->profile['interest'])) $profile['interest'] = array( t('Hobbies/Interests:'), $txt);
+
+ if($txt = prepare_text($a->profile['likes'])) $profile['likes'] = array( t('Likes:'), $txt);
+
+ if($txt = prepare_text($a->profile['dislikes'])) $profile['dislikes'] = array( t('Dislikes:'), $txt);
+
+
+ if($txt = prepare_text($a->profile['contact'])) $profile['contact'] = array( t('Contact information and Social Networks:'), $txt);
+
+ if($txt = prepare_text($a->profile['music'])) $profile['music'] = array( t('Musical interests:'), $txt);
+
+ if($txt = prepare_text($a->profile['book'])) $profile['book'] = array( t('Books, literature:'), $txt);
+
+ if($txt = prepare_text($a->profile['tv'])) $profile['tv'] = array( t('Television:'), $txt);
+
+ if($txt = prepare_text($a->profile['film'])) $profile['film'] = array( t('Film/dance/culture/entertainment:'), $txt);
+
+ if($txt = prepare_text($a->profile['romance'])) $profile['romance'] = array( t('Love/Romance:'), $txt);
+
+ if($txt = prepare_text($a->profile['work'])) $profile['work'] = array( t('Work/employment:'), $txt);
+
+ if($txt = prepare_text($a->profile['education'])) $profile['education'] = array( t('School/education:'), $txt );
+
+
+ $things = get_things($a->profile['profile_guid'],$a->profile['profile_uid']);
+
+ logger('mod_profile: things: ' . print_r($things,true), LOGGER_DATA);
+
+ return replace_macros($tpl, array(
+ '$title' => t('Profile'),
+ '$profile' => $profile,
+ '$things' => $things
+ ));
+ }
+
+ return '';
+}
+
+
+
+
+function get_my_url() {
+ if(x($_SESSION,'zrl_override'))
+ return $_SESSION['zrl_override'];
+ if(x($_SESSION,'my_url'))
+ return $_SESSION['my_url'];
+ return false;
+}
+
+function get_my_address() {
+ if(x($_SESSION,'zid_override'))
+ return $_SESSION['zid_override'];
+ if(x($_SESSION,'my_address'))
+ return $_SESSION['my_address'];
+ return false;
+}
+
+/**
+ * @function zid_init(&$a)
+ * If somebody arrives at our site using a zid, add their xchan to our DB if we don't have it already.
+ * And if they aren't already authenticated here, attempt reverse magic auth.
+ *
+ * @hooks 'zid_init'
+ * string 'zid' - their zid
+ * string 'url' - the destination url
+ *
+ */
+
+function zid_init(&$a) {
+ $tmp_str = get_my_address();
+ if(validate_email($tmp_str)) {
+ proc_run('php','include/gprobe.php',bin2hex($tmp_str));
+ $arr = array('zid' => $tmp_str, 'url' => $a->cmd);
+ call_hooks('zid_init',$arr);
+ if((! local_user()) && (! remote_user())) {
+ logger('zid_init: not authenticated. Invoking reverse magic-auth for ' . $tmp_str);
+ $r = q("select * from hubloc where hubloc_addr = '%s' order by hubloc_id desc limit 1",
+ dbesc($tmp_str)
+ );
+ // try to avoid recursion - but send them home to do a proper magic auth
+ $query = $a->query_string;
+ $query = str_replace(array('?zid=','&zid='),array('?rzid=','&rzid='),$query);
+ $dest = '/' . urlencode($query);
+ if($r && ($r[0]['hubloc_url'] != z_root()) && (! strstr($dest,'/magic')) && (! strstr($dest,'/rmagic'))) {
+ goaway($r[0]['hubloc_url'] . '/magic' . '?f=&rev=1&dest=' . z_root() . $dest);
+ }
+ else
+ logger('zid_init: no hubloc found.');
+ }
+ }
+}
+
+/**
+ * @function zid($s,$address = '')
+ * Adds a zid parameter to a url
+ * @param string $s
+ * The url to accept the zid
+ * @param boolean $address
+ * $address to use instead of session environment
+ * @return string
+ *
+ * @hooks 'zid'
+ * string url - url to accept zid
+ * string zid - urlencoded zid
+ * string result - the return string we calculated, change it if you want to return something else
+ */
+
+
+function zid($s,$address = '') {
+ if(! strlen($s) || strpos($s,'zid='))
+ return $s;
+ $has_params = ((strpos($s,'?')) ? true : false);
+ $num_slashes = substr_count($s,'/');
+ if(! $has_params)
+ $has_params = ((strpos($s,'&')) ? true : false);
+ $achar = strpos($s,'?') ? '&' : '?';
+
+ $mine = get_my_url();
+ $myaddr = (($address) ? $address : get_my_address());
+
+ // FIXME checking against our own channel url is no longer reliable. We may have a lot
+ // of urls attached to out channel. Should probably match against our site, since we
+ // will not need to remote authenticate on our own site anyway.
+
+ if($mine && $myaddr && (! link_compare($mine,$s)))
+ $zurl = $s . (($num_slashes >= 3) ? '' : '/') . $achar . 'zid=' . urlencode($myaddr);
+ else
+ $zurl = $s;
+
+ $arr = array('url' => $s, 'zid' => urlencode($myaddr), 'result' => $zurl);
+ call_hooks('zid', $arr);
+ return $arr['result'];
+}
+
+// Used from within PCSS themes to set theme parameters. If there's a
+// puid request variable, that is the "page owner" and normally their theme
+// settings take precedence; unless a local user sets the "always_my_theme"
+// system pconfig, which means they don't want to see anybody else's theme
+// settings except their own while on this site.
+
+function get_theme_uid() {
+ $uid = (($_REQUEST['puid']) ? intval($_REQUEST['puid']) : 0);
+ if(local_user()) {
+ if((get_pconfig(local_user(),'system','always_my_theme')) || (! $uid))
+ return local_user();
+ if(! $uid)
+ return local_user();
+ }
+ return $uid;
+}
+
+/**
+* @function get_default_profile_photo($size = 175)
+* Retrieves the path of the default_profile_photo for this system
+* with the specified size.
+* @param int $size
+* one of (175, 80, 48)
+* @returns string
+*
+*/
+
+function get_default_profile_photo($size = 175) {
+ $scheme = get_config('system','default_profile_photo');
+ if(! $scheme)
+ $scheme = 'rainbow_man';
+ return 'images/default_profile_photos/' . $scheme . '/' . $size . '.jpg';
+}
+
+
+/**
+ *
+ * @function is_foreigner($s)
+ * Test whether a given identity is NOT a member of the Red Matrix
+ * @param string $s;
+ * xchan_hash of the identity in question
+ *
+ * @returns boolean true or false
+ *
+ */
+
+function is_foreigner($s) {
+ return((strpbrk($s,':@')) ? true : false);
+}
+
+
+/**
+ *
+ * @function is_member($s)
+ * Test whether a given identity is a member of the Red Matrix
+ * @param string $s;
+ * xchan_hash of the identity in question
+ *
+ * @returns boolean true or false
+ *
+ */
+
+function is_member($s) {
+ return((is_foreigner($s)) ? false : true);
+}
diff --git a/include/iquery.php b/include/iquery.php
deleted file mode 100644
index 0d51134a4..000000000
--- a/include/iquery.php
+++ /dev/null
@@ -1,139 +0,0 @@
-<?php
-
-
-function network_query($a,$arr) {
-
-
- $parent_options = '';
- $child_options = '';
-
- $ordering = (($arr['order'] === 'post') ? "`created`" : "`commented`") . " DESC ";
-
- $itemspage = get_pconfig($arr['uid'],'system','itemspage');
- $a->set_pager_itemspage(((intval($itemspage)) ? $itemspage : 40));
-
- $pager_sql = ((intval($arr['update'])) ? '' : sprintf(" LIMIT %d, %d ",intval($a->pager['start']), intval($a->pager['itemspage'])));
-
- $arr['cmin'] = ((x($arr,'cmin')) ? $arr['cmin'] : 0);
- $arr['cmax'] = ((x($arr,'cmax')) ? $arr['cmax'] : 0);
-
- $simple_update = (($arr['update']) ? " and `item`.`unseen` = 1 " : '');
-
- if($arr['new']) {
-
- // "New Item View" - show all items unthreaded in reverse created date order
-
- $items = q("SELECT `item`.*, `item`.`id` AS `item_id`,
- `contact`.`name`, `contact`.`photo`, `contact`.`url`, `contact`.`rel`, `contact`.`writable`,
- `contact`.`network`, `contact`.`thumb`, `contact`.`dfrn_id`, `contact`.`self`,
- `contact`.`id` AS `cid`, `contact`.`uid` AS `contact-uid`
- FROM `item`, `contact`
- WHERE `item`.`uid` = %d AND `item`.`visible` = 1
- AND `item`.`deleted` = 0 and `item`.`moderated` = 0
- $simple_update
- AND `contact`.`closeness` >= %d and `contact`.`closeness` <= %d
- AND `contact`.`id` = `item`.`contact-id`
- AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0
- $sql_extra $sql_nets
- ORDER BY `item`.`received` DESC $pager_sql ",
- intval($arr['uid']),
- intval($arr['cmin']),
- intval($arr['cmax'])
-
- );
-
- $items = fetch_post_tags($items);
- return $items;
-
- }
- if($update) {
- $r = q("SELECT `parent` AS `item_id`, `contact`.`uid` AS `contact_uid`
- FROM `item` LEFT JOIN `contact` ON `contact`.`id` = `item`.`contact-id`
- WHERE `item`.`uid` = %d AND `item`.`visible` = 1 AND
- `contact`.`closeness` >= %d and `contact`.`closeness` <= %d
- (`item`.`deleted` = 0 OR item.verb = '" . ACTIVITY_LIKE ."' OR item.verb = '" . ACTIVITY_DISLIKE . "')
- and `item`.`moderated` = 0 $simple_update
- AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0
- $sql_extra3 $sql_extra $sql_nets ",
- intval($arr['uid']),
- intval($arr['cmin']),
- intval($arr['cmax'])
- );
- }
- else {
- $r = q("SELECT `item`.`id` AS `item_id`, `contact`.`uid` AS `contact_uid`
- FROM `item` LEFT JOIN `contact` ON `contact`.`id` = `item`.`contact-id`
- WHERE `item`.`uid` = %d AND `item`.`visible` = 1 AND `item`.`deleted` = 0
- AND `item`.`moderated` = 0 AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0
- AND `contact`.`closeness` >= %d and `contact`.`closeness` <= %d
- AND `item`.`parent` = `item`.`id`
- $sql_extra3 $sql_extra $sql_nets
- ORDER BY `item`.$ordering $pager_sql ",
- intval($arr['uid']),
- intval($arr['cmin']),
- intval($arr['cmax'])
- );
- }
-
- // Then fetch all the children of the parents that are on this page
-
- $parents_arr = array();
- $parents_str = '';
-
- if(count($r)) {
- foreach($r as $rr)
- if(! in_array($rr['item_id'],$parents_arr))
- $parents_arr[] = $rr['item_id'];
- $parents_str = implode(', ', $parents_arr);
-
- $items = q("SELECT `item`.*, `item`.`id` AS `item_id`,
- `contact`.`name`, `contact`.`photo`, `contact`.`url`, `contact`.`alias`,
- `contact`.`rel`, `contact`.`writable`,
- `contact`.`network`, `contact`.`thumb`, `contact`.`self`,
- `contact`.`id` AS `cid`, `contact`.`uid` AS `contact-uid`
- FROM `item`, `contact`
- WHERE `item`.`uid` = %d AND `item`.`visible` = 1 AND `item`.`deleted` = 0
- AND `item`.`moderated` = 0 AND `contact`.`id` = `item`.`contact-id`
- AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0
- AND `item`.`parent` IN ( %s )
- $sql_extra ",
- intval($arr['uid']),
- dbesc($parents_str)
- );
-
- $items = fetch_post_tags($items);
-
- $items = conv_sort($items,$ordering);
- }
- else {
- $items = array();
- }
-
- return $items;
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/include/items.php b/include/items.php
index 3fd43ca4e..ea46df9bf 100755
--- a/include/items.php
+++ b/include/items.php
@@ -1,9 +1,9 @@
-<?php
+<?php /** @file */
require_once('include/bbcode.php');
require_once('include/oembed.php');
require_once('include/crypto.php');
-require_once('include/Photo.php');
+require_once('include/photo/photo_driver.php');
require_once('include/permissions.php');
@@ -18,23 +18,48 @@ function collect_recipients($item,&$private) {
require_once('include/group.php');
+ if($item['item_private'])
+ $private = true;
+
if($item['allow_cid'] || $item['allow_gid'] || $item['deny_cid'] || $item['deny_gid']) {
$allow_people = expand_acl($item['allow_cid']);
$allow_groups = expand_groups(expand_acl($item['allow_gid']));
+
+ $recipients = array_unique(array_merge($allow_people,$allow_groups));
+
+ // if you specifically deny somebody but haven't allowed anybody, we'll allow everybody in your
+ // address book minus the denied connections. The post is still private and can't be seen publicly
+ // as that would allow the denied person to see the post by logging out.
+
+ if((! $item['allow_cid']) && (! $item['allow_gid'])) {
+ $r = q("select * from abook where abook_channel = %d and not (abook_flags & %d) and not (abook_flags & %d) and not (abook_flags & %d)",
+ intval($item['uid']),
+ intval(ABOOK_FLAG_SELF),
+ intval(ABOOK_FLAG_PENDING),
+ intval(ABOOK_FLAG_ARCHIVED)
+ );
+
+ if($r) {
+ foreach($r as $rr) {
+ $recipients[] = $rr['abook_xchan'];
+ }
+ }
+ }
+
$deny_people = expand_acl($item['deny_cid']);
$deny_groups = expand_groups(expand_acl($item['deny_gid']));
- $recipients = array_unique(array_merge($allow_people,$allow_groups));
$deny = array_unique(array_merge($deny_people,$deny_groups));
$recipients = array_diff($recipients,$deny);
$private = true;
}
else {
$recipients = array();
- $r = q("select * from abook where abook_channel = %d and not (abook_flags & %d) and not (abook_flags & %d)",
+ $r = q("select * from abook where abook_channel = %d and not (abook_flags & %d) and not (abook_flags & %d) and not (abook_flags & %d)",
intval($item['uid']),
intval(ABOOK_FLAG_SELF),
- intval(ABOOK_FLAG_PENDING)
+ intval(ABOOK_FLAG_PENDING),
+ intval(ABOOK_FLAG_ARCHIVED)
);
if($r) {
foreach($r as $rr) {
@@ -49,237 +74,309 @@ function collect_recipients($item,&$private) {
$recipients = check_list_permissions($item['uid'],$recipients,'view_stream');
+ // add ourself just in case we have nomadic clones that need to get a copy.
+
+ $recipients[] = $item['author_xchan'];
+ if($item['owner_xchan'] != $item['author_xchan'])
+ $recipients[] = $item['owner_xchan'];
return $recipients;
}
+/**
+ * @function can_comment_on_post($observer_xchan,$item);
+ *
+ * This function examines the comment_policy attached to an item and decides if the current observer has
+ * sufficient privileges to comment. This will normally be called on a remote site where perm_is_allowed()
+ * will not be suitable because the post owner does not have a local channel_id.
+ * Generally we should look at the item - in particular the author['book_flags'] and see if ABOOK_FLAG_SELF is set.
+ * If it is, you should be able to use perm_is_allowed( ... 'post_comments'), and if it isn't you need to call
+ * can_comment_on_post()
+ */
+function can_comment_on_post($observer_xchan,$item) {
-function get_public_feed($channel,$params) {
-
- $type = 'xml';
- $begin = '0000-00-00 00:00:00';
- $end = '';
- $start = 0;
- $records = 40;
- $direction = 'desc';
+// logger('can_comment_on_post: comment_policy: ' . $item['comment_policy'], LOGGER_DEBUG);
- if(is_array($params)) {
- $type = ((x($params,'type')) ? $params['type'] : $type);
- $begin = ((x($params,'begin')) ? $params['begin'] : $begin);
- $end = ((x($params,'end')) ? $params['end'] : $end);
- $start = ((x($params,'start')) ? $params['start'] : $start);
- $records = ((x($params,'records')) ? $params['records'] : $records);
- $direction = ((x($params,'direction')) ? $params['direction'] : $direction);
- }
-
- switch($type) {
- case 'json':
- header("Content-type: application/atom+json");
+ if(! $observer_xchan)
+ return false;
+ if($item['comment_policy'] === 'none')
+ return false;
+ if($observer_xchan === $item['author_xchan'] || $observer_xchan === $item['owner_xchan'])
+ return true;
+ switch($item['comment_policy']) {
+ case 'self':
+ if($observer_xchan === $item['author_xchan'] || $observer_xchan === $item['owner_xchan'])
+ return true;
+ break;
+ case 'public':
+ // We don't allow public comments yet, until a policy
+ // for dealing with anonymous comments is in place with
+ // a means to moderate comments. Until that time, return
+ // false.
+ return false;
+ break;
+ case 'contacts':
+ case '':
+ if(array_key_exists('owner',$item)) {
+ if(($item['owner']['abook_xchan']) && ($item['owner']['abook_their_perms'] & PERMS_W_COMMENT))
+ return true;
+ }
break;
- case 'xml':
default:
- header("Content-type: application/atom+xml");
break;
}
+ if(strstr($item['comment_policy'],'network:') && strstr($item['comment_policy'],'red'))
+ return true;
+ if(strstr($item['comment_policy'],'site:') && strstr($item['comment_policy'],get_app()->get_hostname()))
+ return true;
+
+ return false;
+}
+/**
+ * @function red_zrl_callback
+ * preg_match function when fixing 'naked' links in mod item.php
+ * Check if we've got a hubloc for the site and use a zrl if we do, a url if we don't.
+ *
+ */
-
+function red_zrl_callback($matches) {
+ $m = @parse_url($matches[2]);
+ $zrl = false;
+ if($m['host']) {
+ $r = q("select hubloc_url from hubloc where hubloc_host = '%s' limit 1",
+ dbesc($m['host'])
+ );
+ if($r)
+ $zrl = true;
+ }
+ if($zrl)
+ return $matches[1] . '[zrl=' . $matches[2] . ']' . $matches[2] . '[/zrl]';
+ return $matches[0];
}
-function get_feed_for(&$a, $dfrn_id, $owner_nick, $last_update, $direction = 0) {
- $sitefeed = ((strlen($owner_nick)) ? false : true); // not yet implemented, need to rewrite huge chunks of following logic
- $public_feed = (($dfrn_id) ? false : true);
- $starred = false; // not yet implemented, possible security issues
- $converse = false;
+/**
+ * @function post_activity_item($arr)
+ *
+ * post an activity
+ *
+ * @param array $arr
+ *
+ * In its simplest form one needs only to set $arr['body'] to post a note to the logged in channel's wall.
+ * Much more complex activities can be created. Permissions are checked. No filtering, tag expansion
+ * or other processing is performed.
+ *
+ * @returns array
+ * 'success' => true or false
+ * 'activity' => the resulting activity if successful
+ */
- if($public_feed && $a->argc > 2) {
- for($x = 2; $x < $a->argc; $x++) {
- if($a->argv[$x] == 'converse')
- $converse = true;
- if($a->argv[$x] == 'starred')
- $starred = true;
- if($a->argv[$x] === 'category' && $a->argc > ($x + 1) && strlen($a->argv[$x+1]))
- $category = $a->argv[$x+1];
- }
- }
+function post_activity_item($arr) {
-
+ $ret = array('success' => false);
- // default permissions - anonymous user
+ $is_comment = false;
+ if((($arr['parent']) && $arr['parent'] != $arr['id']) || (($arr['parent_mid']) && $arr['parent_mid'] != $arr['mid']))
+ $is_comment = true;
- $sql_extra = " AND `allow_cid` = '' AND `allow_gid` = '' AND `deny_cid` = '' AND `deny_gid` = '' ";
-
- $r = q("SELECT `contact`.*, `user`.`uid` AS `user_uid`, `user`.`nickname`, `user`.`timezone`, `user`.`page-flags`
- FROM `contact` LEFT JOIN `user` ON `user`.`uid` = `contact`.`uid`
- WHERE `contact`.`self` = 1 AND `user`.`nickname` = '%s' LIMIT 1",
- dbesc($owner_nick)
- );
+ if(! x($arr,'item_flags')) {
+ if($is_comment)
+ $arr['item_flags'] = ITEM_ORIGIN;
+ else
+ $arr['item_flags'] = ITEM_ORIGIN | ITEM_WALL | ITEM_THREAD_TOP;
+ }
- if(! count($r))
- killme();
- $owner = $r[0];
- $owner_id = $owner['user_uid'];
- $owner_nick = $owner['nickname'];
+ $channel = get_app()->get_channel();
+ $observer = get_app()->get_observer();
- $birthday = feed_birthday($owner_id,$owner['timezone']);
+ $arr['aid'] = ((x($arr,'aid')) ? $arr['aid'] : $channel['channel_account_id']);
+ $arr['uid'] = ((x($arr,'uid')) ? $arr['uid'] : $channel['channel_id']);
- if(! $public_feed) {
+ if(! perm_is_allowed($arr['uid'],$observer['xchan_hash'],(($is_comment) ? 'post_comments' : 'post_wall'))) {
+ $ret['message'] = t('Permission denied');
+ return $ret;
+ }
- $sql_extra = '';
- switch($direction) {
- case (-1):
- $sql_extra = sprintf(" AND `issued_id` = '%s' ", dbesc($dfrn_id));
- $my_id = $dfrn_id;
- break;
- case 0:
- $sql_extra = sprintf(" AND `issued_id` = '%s' AND `duplex` = 1 ", dbesc($dfrn_id));
- $my_id = '1:' . $dfrn_id;
- break;
- case 1:
- $sql_extra = sprintf(" AND `dfrn_id` = '%s' AND `duplex` = 1 ", dbesc($dfrn_id));
- $my_id = '0:' . $dfrn_id;
- break;
- default:
- return false;
- break; // NOTREACHED
- }
- $r = q("SELECT * FROM `contact` WHERE `blocked` = 0 AND `pending` = 0 AND `contact`.`uid` = %d $sql_extra LIMIT 1",
- intval($owner_id)
- );
+ if(! array_key_exists('mimetype',$arr))
+ $arr['mimetype'] = 'text/bbcode';
- if(! count($r))
- killme();
+ if(array_key_exists('item_private',$arr) && $arr['item_private']) {
- $contact = $r[0];
- require_once('include/security.php');
- $groups = init_groups_visitor($contact['id']);
+ $arr['body'] = z_input_filter($arr['uid'],$arr['body'],$arr['mimetype']);
- if(count($groups)) {
- for($x = 0; $x < count($groups); $x ++)
- $groups[$x] = '<' . intval($groups[$x]) . '>' ;
- $gs = implode('|', $groups);
+ if($channel) {
+ if($channel['channel_hash'] === $arr['author_xchan']) {
+ $arr['sig'] = base64url_encode(rsa_sign($arr['body'],$channel['channel_prvkey']));
+ $arr['item_flags'] = $arr['item_flags'] | ITEM_VERIFIED;
+ }
}
- else
- $gs = '<<>>' ; // Impossible to match
-
- $sql_extra = sprintf("
- AND ( `allow_cid` = '' OR `allow_cid` REGEXP '<%d>' )
- AND ( `deny_cid` = '' OR NOT `deny_cid` REGEXP '<%d>' )
- AND ( `allow_gid` = '' OR `allow_gid` REGEXP '%s' )
- AND ( `deny_gid` = '' OR NOT `deny_gid` REGEXP '%s')
- ",
- intval($contact['id']),
- intval($contact['id']),
- dbesc($gs),
- dbesc($gs)
- );
+
+ logger('Encrypting local storage');
+ $key = get_config('system','pubkey');
+ $arr['item_flags'] = $arr['item_flags'] | ITEM_OBSCURED;
+ if($arr['title'])
+ $arr['title'] = json_encode(aes_encapsulate($arr['title'],$key));
+ if($arr['body'])
+ $arr['body'] = json_encode(aes_encapsulate($arr['body'],$key));
}
- if($public_feed)
- $sort = 'DESC';
- else
- $sort = 'ASC';
+ $arr['mid'] = ((x($arr,'mid')) ? $arr['mid'] : item_message_id());
+ $arr['parent_mid'] = ((x($arr,'parent_mid')) ? $arr['parent_mid'] : $arr['mid']);
+ $arr['thr_parent'] = ((x($arr,'thr_parent')) ? $arr['thr_parent'] : $arr['mid']);
+
+ $arr['owner_xchan'] = ((x($arr,'owner_xchan')) ? $arr['owner_xchan'] : $channel['channel_hash']);
+ $arr['author_xchan'] = ((x($arr,'author_xchan')) ? $arr['author_xchan'] : $observer['xchan_hash']);
+
+ $arr['verb'] = ((x($arr,'verb')) ? $arr['verb'] : ACTIVITY_POST);
+ $arr['obj_type'] = ((x($arr,'obj_type')) ? $arr['obj_type'] : ACTIVITY_OBJ_NOTE);
- if(! strlen($last_update))
- $last_update = 'now -30 days';
+ $arr['allow_cid'] = ((x($arr,'allow_cid')) ? $arr['allow_cid'] : $channel['channel_allow_cid']);
+ $arr['allow_gid'] = ((x($arr,'allow_gid')) ? $arr['allow_gid'] : $channel['channel_allow_gid']);
+ $arr['deny_cid'] = ((x($arr,'deny_cid')) ? $arr['deny_cid'] : $channel['channel_deny_cid']);
+ $arr['deny_gid'] = ((x($arr,'deny_gid')) ? $arr['deny_gid'] : $channel['channel_deny_gid']);
- if(isset($category)) {
- $sql_extra .= file_tag_file_query('item',$category,'category');
+ $arr['comment_policy'] = map_scope($channel['channel_w_comment']);
+
+
+ if ((! $arr['plink']) && ($arr['item_flags'] & ITEM_THREAD_TOP)) {
+ $arr['plink'] = z_root() . '/channel/' . $channel['channel_address'] . '/?f=&mid=' . $arr['mid'];
}
- if($public_feed) {
- if(! $converse)
- $sql_extra .= " AND `contact`.`self` = 1 ";
+
+ // for the benefit of plugins, we will behave as if this is an API call rather than a normal online post
+
+ $_REQUEST['api_source'] = 1;
+
+ call_hooks('post_local',$arr);
+
+ if(x($arr,'cancel')) {
+ logger('post_activity_item: post cancelled by plugin.');
+ return $ret;
}
- $check_date = datetime_convert('UTC','UTC',$last_update,'Y-m-d H:i:s');
-
- $r = q("SELECT `item`.*, `item`.`id` AS `item_id`,
- `contact`.`name`, `contact`.`network`, `contact`.`photo`, `contact`.`url`,
- `contact`.`name_date`, `contact`.`uri_date`, `contact`.`avatar_date`,
- `contact`.`thumb`, `contact`.`dfrn_id`, `contact`.`self`,
- `contact`.`id` AS `contact-id`, `contact`.`uid` AS `contact-uid`,
- `sign`.`signed_text`, `sign`.`signature`, `sign`.`signer`
- FROM `item` LEFT JOIN `contact` ON `contact`.`id` = `item`.`contact-id`
- LEFT JOIN `sign` ON `sign`.`iid` = `item`.`id`
- WHERE `item`.`uid` = %d AND `item`.`visible` = 1 and `item`.`moderated` = 0 AND `item`.`parent` != 0
- AND `item`.`wall` = 1 AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0
- AND ( `item`.`edited` > '%s' OR `item`.`changed` > '%s' )
- $sql_extra
- ORDER BY `parent` %s, `created` ASC LIMIT 0, 300",
- intval($owner_id),
- dbesc($check_date),
- dbesc($check_date),
- dbesc($sort)
- );
- // Will check further below if this actually returned results.
- // We will provide an empty feed if that is the case.
+ $post = item_store($arr);
+ if($post['success'])
+ $post_id = $post['item_id'];
- $items = $r;
- $items = fetch_post_tags($items);
+ if($post_id) {
+ $arr['id'] = $post_id;
+ call_hooks('post_local_end', $arr);
+ proc_run('php','include/notifier.php','activity',$post_id);
+ $ret['success'] = true;
+ $r = q("select * from item where id = %d limit 1",
+ intval($post_id)
+ );
+ if($r)
+ $ret['activity'] = $r[0];
+ }
- $feed_template = get_markup_template(($dfrn_id) ? 'atom_feed_dfrn.tpl' : 'atom_feed.tpl');
+ return $ret;
- $atom = '';
+}
- $hubxml = feed_hublinks();
- $salmon = feed_salmonlinks($owner_nick);
+function get_public_feed($channel,$params) {
- $atom .= replace_macros($feed_template, array(
- '$version' => xmlify(FRIENDICA_VERSION),
- '$feed_id' => xmlify($a->get_baseurl() . '/channel/' . $owner_nick),
- '$feed_title' => xmlify($owner['name']),
- '$feed_updated' => xmlify(datetime_convert('UTC', 'UTC', 'now' , ATOM_TIME)) ,
- '$hub' => $hubxml,
- '$salmon' => $salmon,
- '$name' => xmlify($owner['name']),
- '$profile_page' => xmlify($owner['url']),
- '$photo' => xmlify($owner['photo']),
- '$thumb' => xmlify($owner['thumb']),
- '$picdate' => xmlify(datetime_convert('UTC','UTC',$owner['avatar_date'] . '+00:00' , ATOM_TIME)) ,
- '$uridate' => xmlify(datetime_convert('UTC','UTC',$owner['uri_date'] . '+00:00' , ATOM_TIME)) ,
- '$namdate' => xmlify(datetime_convert('UTC','UTC',$owner['name_date'] . '+00:00' , ATOM_TIME)) ,
- '$birthday' => ((strlen($birthday)) ? '<dfrn:birthday>' . xmlify($birthday) . '</dfrn:birthday>' : ''),
- '$community' => (($owner['page-flags'] == PAGE_COMMUNITY) ? '<dfrn:community>1</dfrn:community>' : '')
- ));
+ $type = 'xml';
+ $begin = '0000-00-00 00:00:00';
+ $end = '';
+ $start = 0;
+ $records = 40;
+ $direction = 'desc';
+ $pages = 0;
+
+ if(! $params)
+ $params = array();
+
+ $params['type'] = ((x($params,'type')) ? $params['type'] : 'xml');
+ $params['begin'] = ((x($params,'begin')) ? $params['begin'] : '0000-00-00 00:00:00');
+ $params['end'] = ((x($params,'end')) ? $params['end'] : datetime_convert('UTC','UTC','now'));
+ $params['start'] = ((x($params,'start')) ? $params['start'] : 0);
+ $params['records'] = ((x($params,'records')) ? $params['records'] : 40);
+ $params['direction'] = ((x($params,'direction')) ? $params['direction'] : 'desc');
+ $params['pages'] = ((x($params,'pages')) ? intval($params['pages']) : 0);
+
+ switch($params['type']) {
+ case 'json':
+ header("Content-type: application/atom+json");
+ break;
+ case 'xml':
+ default:
+ header("Content-type: application/atom+xml");
+ break;
+ }
- call_hooks('atom_feed', $atom);
+
+ return get_feed_for($channel,get_observer_hash(),$params);
+}
- if(! count($items)) {
+function get_feed_for($channel, $observer_hash, $params) {
- call_hooks('atom_feed_end', $atom);
+ if(! channel)
+ http_status_exit(401);
- $atom .= '</feed>' . "\r\n";
- return $atom;
+
+ if($params['pages']) {
+ if(! perm_is_allowed($channel['channel_id'],$observer_hash,'view_pages'))
+ http_status_exit(403);
+ }
+ else {
+ if(! perm_is_allowed($channel['channel_id'],$observer_hash,'view_stream'))
+ http_status_exit(403);
}
+ $items = items_fetch(array(
+ 'wall' => '1',
+ 'datequery' => $params['begin'],
+ 'datequery2' => $params['end'],
+ 'start' => $params['start'], // FIXME
+ 'records' => $params['records'], // FIXME
+ 'direction' => $params['direction'], // FIXME
+ 'pages' => $params['pages'],
+ 'order' => 'post'
+ ), $channel, $observer_hash, CLIENT_MODE_NORMAL, get_app()->module);
- foreach($items as $item) {
- // prevent private email from leaking.
- if($item['network'] === NETWORK_MAIL)
- continue;
+ $feed_template = get_markup_template('atom_feed.tpl');
+
+ $atom = '';
+
+ $atom .= replace_macros($feed_template, array(
+ '$version' => xmlify(RED_VERSION),
+ '$red' => xmlify(RED_PLATFORM),
+ '$feed_id' => xmlify($channel['channel_url']),
+ '$feed_title' => xmlify($channel['channel_name']),
+ '$feed_updated' => xmlify(datetime_convert('UTC', 'UTC', 'now' , ATOM_TIME)) ,
+ '$hub' => '', // feed_hublinks(),
+ '$salmon' => '', // feed_salmonlinks($channel['channel_address']),
+ '$name' => xmlify($channel['channel_name']),
+ '$profile_page' => xmlify($channel['channel_url']),
+ '$mimephoto' => xmlify($channel['xchan_photo_mimetype']),
+ '$photo' => xmlify($channel['xchan_photo_l']),
+ '$thumb' => xmlify($channel['xchan_photo_m']),
+ '$picdate' => '',
+ '$uridate' => '',
+ '$namdate' => '',
+ '$birthday' => '',
+ '$community' => '',
+ ));
- // public feeds get html, our own nodes use bbcode
+ call_hooks('atom_feed', $atom);
- if($public_feed) {
- $type = 'html';
- // catch any email that's in a public conversation and make sure it doesn't leak
- if($item['private'])
+ if($items) {
+ $type = 'html';
+ foreach($items as $item) {
+ if($item['item_private'])
continue;
- }
- else {
- $type = 'text';
- }
- $atom .= atom_entry($item,$type,null,$owner,true);
+ $atom .= atom_entry($item,$type,null,$owner,true);
+ }
}
call_hooks('atom_feed_end', $atom);
@@ -300,8 +397,7 @@ function construct_activity_object($item) {
if($item['object']) {
$o = '<as:object>' . "\r\n";
- $r = parse_xml_string($item['object'],false);
-
+ $r = json_decode($item['object'],false);
if(! $r)
return '';
@@ -311,7 +407,8 @@ function construct_activity_object($item) {
$o .= '<id>' . xmlify($r->id) . '</id>' . "\r\n";
if($r->title)
$o .= '<title>' . xmlify($r->title) . '</title>' . "\r\n";
- if($r->link) {
+ if($r->links) {
+ // FIXME!!
if(substr($r->link,0,1) === '<') {
$r->link = preg_replace('/\<link(.*?)\"\>/','<link$1"/>',$r->link);
$o .= $r->link;
@@ -332,7 +429,7 @@ function construct_activity_target($item) {
if($item['target']) {
$o = '<as:target>' . "\r\n";
- $r = parse_xml_string($item['target'],false);
+ $r = json_decode($item['target'],false);
if(! $r)
return '';
if($r->type)
@@ -341,7 +438,8 @@ function construct_activity_target($item) {
$o .= '<id>' . xmlify($r->id) . '</id>' . "\r\n";
if($r->title)
$o .= '<title>' . xmlify($r->title) . '</title>' . "\r\n";
- if($r->link) {
+ if($r->links) {
+ // FIXME !!!
if(substr($r->link,0,1) === '<') {
if(strstr($r->link,'&') && (! strstr($r->link,'&amp;')))
$r->link = str_replace('&','&amp;', $r->link);
@@ -365,7 +463,7 @@ function construct_activity_target($item) {
* The purpose of this function is to apply system message length limits to
* imported messages without including any embedded photos in the length
*/
-if(! function_exists('limit_body_size')) {
+
function limit_body_size($body) {
$maxlen = get_max_import_size();
@@ -443,7 +541,7 @@ function limit_body_size($body) {
}
else
return $body;
-}}
+}
function title_is_body($title, $body) {
@@ -472,35 +570,49 @@ function title_is_body($title, $body) {
function get_item_elements($x) {
- $arr = array();
- $arr['body'] = (($x['body']) ? htmlentities($x['body'],ENT_COMPAT,'UTF-8',false) : '');
+ $arr = array();
+ $arr['body'] = (($x['body']) ? htmlspecialchars($x['body'],ENT_COMPAT,'UTF-8',false) : '');
$arr['created'] = datetime_convert('UTC','UTC',$x['created']);
$arr['edited'] = datetime_convert('UTC','UTC',$x['edited']);
- $arr['expires'] = ((x($x,'expires') && $x['expires'])
- ? datetime_convert('UTC','UTC',$x['expires'])
- : '0000-00-00 00:00:00');
if($arr['created'] > datetime_convert())
$arr['created'] = datetime_convert();
if($arr['edited'] > datetime_convert())
$arr['edited'] = datetime_convert();
- $arr['title'] = (($x['title']) ? htmlentities($x['title'], ENT_COMPAT,'UTF-8',false) : '');
- $arr['app'] = (($x['app']) ? htmlentities($x['app'], ENT_COMPAT,'UTF-8',false) : '');
- $arr['uri'] = (($x['message_id']) ? htmlentities($x['message_id'], ENT_COMPAT,'UTF-8',false) : '');
- $arr['parent_uri'] = (($x['message_top']) ? htmlentities($x['message_top'], ENT_COMPAT,'UTF-8',false) : '');
- $arr['thr_parent'] = (($x['message_parent']) ? htmlentities($x['message_parent'], ENT_COMPAT,'UTF-8',false) : '');
+ $arr['expires'] = ((x($x,'expires') && $x['expires'])
+ ? datetime_convert('UTC','UTC',$x['expires'])
+ : '0000-00-00 00:00:00');
+
+ $arr['commented'] = ((x($x,'commented') && $x['commented'])
+ ? datetime_convert('UTC','UTC',$x['commented'])
+ : $arr['created']);
+
+ $arr['title'] = (($x['title']) ? htmlspecialchars($x['title'], ENT_COMPAT,'UTF-8',false) : '');
+
+ if(mb_strlen($arr['title']) > 255)
+ $arr['title'] = mb_substr($arr['title'],0,255);
+
- $arr['plink'] = (($x['permalink']) ? htmlentities($x['permalink'], ENT_COMPAT,'UTF-8',false) : '');
- $arr['location'] = (($x['location']) ? htmlentities($x['location'], ENT_COMPAT,'UTF-8',false) : '');
- $arr['coord'] = (($x['longlat']) ? htmlentities($x['longlat'], ENT_COMPAT,'UTF-8',false) : '');
- $arr['verb'] = (($x['verb']) ? htmlentities($x['verb'], ENT_COMPAT,'UTF-8',false) : '');
- $arr['mimetype'] = (($x['mimetype']) ? htmlentities($x['mimetype'], ENT_COMPAT,'UTF-8',false) : '');
- $arr['obj_type'] = (($x['object_type']) ? htmlentities($x['object_type'], ENT_COMPAT,'UTF-8',false) : '');
- $arr['tgt_type'] = (($x['target_type']) ? htmlentities($x['target_type'], ENT_COMPAT,'UTF-8',false) : '');
+ $arr['app'] = (($x['app']) ? htmlspecialchars($x['app'], ENT_COMPAT,'UTF-8',false) : '');
+ $arr['mid'] = (($x['message_id']) ? htmlspecialchars($x['message_id'], ENT_COMPAT,'UTF-8',false) : '');
+ $arr['parent_mid'] = (($x['message_top']) ? htmlspecialchars($x['message_top'], ENT_COMPAT,'UTF-8',false) : '');
+ $arr['thr_parent'] = (($x['message_parent']) ? htmlspecialchars($x['message_parent'], ENT_COMPAT,'UTF-8',false) : '');
+ $arr['plink'] = (($x['permalink']) ? htmlspecialchars($x['permalink'], ENT_COMPAT,'UTF-8',false) : '');
+ $arr['location'] = (($x['location']) ? htmlspecialchars($x['location'], ENT_COMPAT,'UTF-8',false) : '');
+ $arr['coord'] = (($x['longlat']) ? htmlspecialchars($x['longlat'], ENT_COMPAT,'UTF-8',false) : '');
+ $arr['verb'] = (($x['verb']) ? htmlspecialchars($x['verb'], ENT_COMPAT,'UTF-8',false) : '');
+ $arr['mimetype'] = (($x['mimetype']) ? htmlspecialchars($x['mimetype'], ENT_COMPAT,'UTF-8',false) : '');
+ $arr['obj_type'] = (($x['object_type']) ? htmlspecialchars($x['object_type'], ENT_COMPAT,'UTF-8',false) : '');
+ $arr['tgt_type'] = (($x['target_type']) ? htmlspecialchars($x['target_type'], ENT_COMPAT,'UTF-8',false) : '');
+ $arr['comment_policy'] = (($x['comment_scope']) ? htmlspecialchars($x['comment_scope'], ENT_COMPAT,'UTF-8',false) : 'contacts');
+
+ $arr['sig'] = (($x['signature']) ? htmlspecialchars($x['signature'], ENT_COMPAT,'UTF-8',false) : '');
+
+
$arr['object'] = activity_sanitise($x['object']);
$arr['target'] = activity_sanitise($x['target']);
@@ -509,6 +621,9 @@ function get_item_elements($x) {
$arr['item_private'] = ((array_key_exists('flags',$x) && is_array($x['flags']) && in_array('private',$x['flags'])) ? 1 : 0);
+ $arr['item_flags'] = 0;
+
+
if(array_key_exists('flags',$x) && in_array('deleted',$x['flags']))
$arr['item_restrict'] = ITEM_DELETED;
@@ -518,8 +633,8 @@ function get_item_elements($x) {
// once, and after that your hub knows them. Sure some info is in the post, but it's only a transit identifier
// and not enough info to be able to look you up from your hash - which is the only thing stored with the post.
- if(import_author_xchan($x['author']))
- $arr['author_xchan'] = base64url_encode(hash('whirlpool',$x['author']['guid'] . $x['author']['guid_sig'], true));
+ if(($xchan_hash = import_author_xchan($x['author'])) !== false)
+ $arr['author_xchan'] = $xchan_hash;
else
return array();
@@ -527,13 +642,37 @@ function get_item_elements($x) {
if($arr['author_xchan'] === base64url_encode(hash('whirlpool',$x['owner']['guid'] . $x['owner']['guid_sig'], true)))
$arr['owner_xchan'] = $arr['author_xchan'];
else {
- if(import_author_xchan($x['owner']))
- $arr['owner_xchan'] = base64url_encode(hash('whirlpool',$x['owner']['guid'] . $x['owner']['guid_sig'], true));
+ if(($xchan_hash = import_author_xchan($x['owner'])) !== false)
+ $arr['owner_xchan'] = $xchan_hash;
else
return array();
}
+ if($arr['sig']) {
+ $r = q("select xchan_pubkey from xchan where xchan_hash = '%s' limit 1",
+ dbesc($arr['author_xchan'])
+ );
+ if($r && rsa_verify($x['body'],base64url_decode($arr['sig']),$r[0]['xchan_pubkey']))
+ $arr['item_flags'] |= ITEM_VERIFIED;
+ else
+ logger('get_item_elements: message verification failed.');
+ }
+
+
+ // if it's a private post, encrypt it in the DB.
+ // We have to do that here because we need to cleanse the input and prevent bad stuff from getting in,
+ // and we need plaintext to do that.
+
+ if(intval($arr['item_private'])) {
+ $arr['item_flags'] = $arr['item_flags'] | ITEM_OBSCURED;
+ $key = get_config('system','pubkey');
+ if($arr['title'])
+ $arr['title'] = json_encode(crypto_encapsulate($arr['title'],$key));
+ if($arr['body'])
+ $arr['body'] = json_encode(crypto_encapsulate($arr['body'],$key));
+ }
+
return $arr;
}
@@ -541,43 +680,52 @@ function get_item_elements($x) {
function import_author_xchan($x) {
- $r = q("select hubloc_url from hubloc where hubloc_guid = '%s' and hubloc_guid_sig = '%s' and (hubloc_flags & %d) limit 1",
- dbesc($x['guid']),
- dbesc($x['guid_sig']),
- intval(HUBLOC_FLAGS_PRIMARY)
- );
+ $arr = array('xchan' => $x, 'xchan_hash' => '');
+ call_hooks('import_author_xchan',$arr);
+ if($arr['xchan_hash'])
+ return $arr['xchan_hash'];
- if($r) {
- logger('import_author_xchan: in cache', LOGGER_DEBUG);
- return true;
+ if((! array_key_exists('network', $x)) || ($x['network'] === 'zot')) {
+ return import_author_zot($x);
}
- logger('import_author_xchan: entry not in cache - probing: ' . print_r($x,true), LOGGER_DEBUG);
+ // TODO: create xchans for other common and/or aligned networks
- $them = array('hubloc_url' => $x['url'],'xchan_guid' => $x['guid'], 'xchan_guid_sig' => $x['guid_sig']);
- return zot_refresh($them);
+ return false;
}
function encode_item($item) {
$x = array();
$x['type'] = 'activity';
- logger('encode_item: ' . print_r($item,true));
+// logger('encode_item: ' . print_r($item,true));
- $r = q("select channel_r_stream from channel where channel_id = %d limit 1",
+ $r = q("select channel_r_stream, channel_w_comment from channel where channel_id = %d limit 1",
intval($item['uid'])
);
- if($r)
+ if($r) {
$public_scope = $r[0]['channel_r_stream'];
- else
+ $comment_scope = $r[0]['channel_w_comment'];
+ }
+ else {
$public_scope = 0;
+ $comment_scope = 0;
+ }
$scope = map_scope($public_scope);
+ $c_scope = map_scope($comment_scope);
+ if(array_key_exists('item_flags',$item) && ($item['item_flags'] & ITEM_OBSCURED)) {
+ $key = get_config('system','prvkey');
+ if($item['title'])
+ $item['title'] = crypto_unencapsulate(json_decode_plus($item['title']),$key);
+ if($item['body'])
+ $item['body'] = crypto_unencapsulate(json_decode_plus($item['body']),$key);
+ }
if($item['item_restrict'] & ITEM_DELETED) {
- $x['message_id'] = $item['uri'];
+ $x['message_id'] = $item['mid'];
$x['created'] = $item['created'];
$x['flags'] = array('deleted');
$x['owner'] = encode_item_xchan($item['owner']);
@@ -585,12 +733,13 @@ function encode_item($item) {
return $x;
}
- $x['message_id'] = $item['uri'];
- $x['message_top'] = $item['parent_uri'];
+ $x['message_id'] = $item['mid'];
+ $x['message_top'] = $item['parent_mid'];
$x['message_parent'] = $item['thr_parent'];
$x['created'] = $item['created'];
$x['edited'] = $item['edited'];
$x['expires'] = $item['expires'];
+ $x['commented'] = $item['commented'];
$x['mimetype'] = $item['mimetype'];
$x['title'] = $item['title'];
$x['body'] = $item['body'];
@@ -601,24 +750,32 @@ function encode_item($item) {
$x['permalink'] = $item['plink'];
$x['location'] = $item['location'];
$x['longlat'] = $item['coord'];
+ $x['signature'] = $item['sig'];
$x['owner'] = encode_item_xchan($item['owner']);
$x['author'] = encode_item_xchan($item['author']);
if($item['object'])
- $x['object'] = json_decode($item['object'],true);
+ $x['object'] = json_decode_plus($item['object']);
if($item['target'])
- $x['target'] = json_decode($item['target'],true);
+ $x['target'] = json_decode_plus($item['target']);
if($item['attach'])
- $x['attach'] = json_decode($item['attach'],true);
+ $x['attach'] = json_decode_plus($item['attach']);
if($y = encode_item_flags($item))
$x['flags'] = $y;
if(! in_array('private',$y))
$x['public_scope'] = $scope;
+ if($item['item_flags'] & ITEM_NOCOMMENT)
+ $x['comment_scope'] = 'none';
+ else
+ $x['comment_scope'] = $c_scope;
+
if($item['term'])
$x['tags'] = encode_item_terms($item['term']);
+ logger('encode_item: ' . print_r($x,true));
+
return $x;
}
@@ -648,6 +805,7 @@ function encode_item_xchan($xchan) {
$ret['name'] = $xchan['xchan_name'];
$ret['address'] = $xchan['xchan_addr'];
$ret['url'] = $xchan['hubloc_url'];
+ $ret['network'] = $xchan['xchan_network'];
$ret['photo'] = array('mimetype' => $xchan['xchan_photo_mimetype'], 'src' => $xchan['xchan_photo_m']);
$ret['guid'] = $xchan['xchan_guid'];
$ret['guid_sig'] = $xchan['xchan_guid_sig'];
@@ -679,8 +837,8 @@ function decode_tags($t) {
$ret = array();
foreach($t as $x) {
$tag = array();
- $tag['term'] = htmlentities($x['tag'], ENT_COMPAT,'UTF-8',false);
- $tag['url'] = htmlentities($x['url'], ENT_COMPAT,'UTF-8',false);
+ $tag['term'] = htmlspecialchars($x['tag'], ENT_COMPAT,'UTF-8',false);
+ $tag['url'] = htmlspecialchars($x['url'], ENT_COMPAT,'UTF-8',false);
switch($x['type']) {
case 'hashtag':
$tag['type'] = TERM_HASHTAG;
@@ -717,14 +875,19 @@ function decode_tags($t) {
function activity_sanitise($arr) {
if($arr) {
- $ret = array();
- foreach($arr as $k => $x) {
- if(is_array($x))
- $ret[$k] = activity_sanitise($x);
- else
- $ret[$k] = htmlentities($x, ENT_COMPAT,'UTF-8',false);
+ if(is_array($arr)) {
+ $ret = array();
+ foreach($arr as $k => $x) {
+ if(is_array($x))
+ $ret[$k] = activity_sanitise($x);
+ else
+ $ret[$k] = htmlspecialchars($x, ENT_COMPAT,'UTF-8',false);
+ }
+ return $ret;
+ }
+ else {
+ return htmlspecialchars($arr, ENT_COMPAT,'UTF-8', false);
}
- return $ret;
}
return '';
}
@@ -735,7 +898,7 @@ function array_sanitise($arr) {
if($arr) {
$ret = array();
foreach($arr as $x) {
- $ret[] = htmlentities($x, ENT_COMPAT,'UTF-8',false);
+ $ret[] = htmlspecialchars($x, ENT_COMPAT,'UTF-8',false);
}
return $ret;
}
@@ -763,16 +926,34 @@ function encode_mail($item) {
$x = array();
$x['type'] = 'mail';
- logger('encode_mail: ' . print_r($item,true));
+ if(array_key_exists('mail_flags',$item) && ($item['mail_flags'] & MAIL_OBSCURED)) {
+ $key = get_config('system','prvkey');
+ if($item['title'])
+ $item['title'] = crypto_unencapsulate(json_decode_plus($item['title']),$key);
+ if($item['body'])
+ $item['body'] = crypto_unencapsulate(json_decode_plus($item['body']),$key);
+ }
- $x['message_id'] = $item['uri'];
- $x['message_parent'] = $item['parent_uri'];
+ $x['message_id'] = $item['mid'];
+ $x['message_parent'] = $item['parent_mid'];
$x['created'] = $item['created'];
+ $x['expires'] = $item['expires'];
$x['title'] = $item['title'];
$x['body'] = $item['body'];
$x['from'] = encode_item_xchan($item['from']);
$x['to'] = encode_item_xchan($item['to']);
+ if($item['attach'])
+ $x['attach'] = json_decode_plus($item['attach']);
+
+ $x['flags'] = array();
+
+ if($item['mail_flags'] & MAIL_RECALLED) {
+ $x['flags'][] = 'recalled';
+ $x['title'] = '';
+ $x['body'] = '';
+ }
+
return $x;
}
@@ -782,29 +963,51 @@ function get_mail_elements($x) {
$arr = array();
- $arr['body'] = (($x['body']) ? htmlentities($x['body'],ENT_COMPAT,'UTF-8',false) : '');
+ $arr['body'] = (($x['body']) ? htmlspecialchars($x['body'], ENT_COMPAT,'UTF-8',false) : '');
+ $arr['title'] = (($x['title'])? htmlspecialchars($x['title'],ENT_COMPAT,'UTF-8',false) : '');
$arr['created'] = datetime_convert('UTC','UTC',$x['created']);
+ if((! array_key_exists('expires',$x)) || ($x['expires'] === '0000-00-00 00:00:00'))
+ $arr['expires'] = '0000-00-00 00:00:00';
+ else
+ $arr['expires'] = datetime_convert('UTC','UTC',$x['expires']);
+
+ $arr['mail_flags'] = 0;
+
+ if($x['flags'] && is_array($x['flags'])) {
+ if(in_array('recalled',$x['flags'])) {
+ $arr['mail_flags'] |= MAIL_RECALLED;
+ }
+ }
+
+ $key = get_config('system','pubkey');
+ $arr['mail_flags'] |= MAIL_OBSCURED;
+ $arr['body'] = htmlspecialchars($arr['body'],ENT_COMPAT,'UTF-8',false);
+ if($arr['body'])
+ $arr['body'] = json_encode(crypto_encapsulate($arr['body'],$key));
+ $arr['title'] = htmlspecialchars($arr['title'],ENT_COMPAT,'UTF-8',false);
+ if($arr['title'])
+ $arr['title'] = json_encode(crypto_encapsulate($arr['title'],$key));
if($arr['created'] > datetime_convert())
$arr['created'] = datetime_convert();
- $arr['title'] = (($x['title']) ? htmlentities($x['title'], ENT_COMPAT,'UTF-8',false) : '');
- $arr['uri'] = (($x['message_id']) ? htmlentities($x['message_id'], ENT_COMPAT,'UTF-8',false) : '');
- $arr['parent_uri'] = (($x['message_parent']) ? htmlentities($x['message_parent'], ENT_COMPAT,'UTF-8',false) : '');
+ $arr['mid'] = (($x['message_id']) ? htmlspecialchars($x['message_id'], ENT_COMPAT,'UTF-8',false) : '');
+ $arr['parent_mid'] = (($x['message_parent']) ? htmlspecialchars($x['message_parent'], ENT_COMPAT,'UTF-8',false) : '');
+ if($x['attach'])
+ $arr['attach'] = activity_sanitise($x['attach']);
- if(import_author_xchan($x['from']))
- $arr['from_xchan'] = base64url_encode(hash('whirlpool',$x['from']['guid'] . $x['from']['guid_sig'], true));
+ if(($xchan_hash = import_author_xchan($x['from'])) !== false)
+ $arr['from_xchan'] = $xchan_hash;
else
return array();
- if(import_author_xchan($x['to']))
- $arr['to_xchan'] = base64url_encode(hash('whirlpool',$x['to']['guid'] . $x['to']['guid_sig'], true));
+ if(($xchan_hash = import_author_xchan($x['to'])) !== false)
+ $arr['to_xchan'] = $xchan_hash;
else
return array();
-
return $arr;
}
@@ -814,22 +1017,23 @@ function get_profile_elements($x) {
$arr = array();
- if(import_author_xchan($x['from']))
- $arr['xprof_hash'] = base64url_encode(hash('whirlpool',$x['from']['guid'] . $x['from']['guid_sig'], true));
+ if(($xchan_hash = import_author_xchan($x['from'])) !== false)
+ $arr['xprof_hash'] = $xchan_hash;
else
return array();
- $arr['desc'] = (($x['title']) ? htmlentities($x['title'],ENT_COMPAT,'UTF-8',false) : '');
+ $arr['desc'] = (($x['title']) ? htmlspecialchars($x['title'],ENT_COMPAT,'UTF-8',false) : '');
$arr['dob'] = datetime_convert('UTC','UTC',$x['birthday'],'Y-m-d');
+ $arr['age'] = (($x['age']) ? intval($x['age']) : 0);
- $arr['gender'] = (($x['gender']) ? htmlentities($x['gender'], ENT_COMPAT,'UTF-8',false) : '');
- $arr['marital'] = (($x['marital']) ? htmlentities($x['marital'], ENT_COMPAT,'UTF-8',false) : '');
- $arr['sexual'] = (($x['sexual']) ? htmlentities($x['sexual'], ENT_COMPAT,'UTF-8',false) : '');
- $arr['locale'] = (($x['locale']) ? htmlentities($x['locale'], ENT_COMPAT,'UTF-8',false) : '');
- $arr['region'] = (($x['region']) ? htmlentities($x['region'], ENT_COMPAT,'UTF-8',false) : '');
- $arr['postcode'] = (($x['postcode']) ? htmlentities($x['postcode'], ENT_COMPAT,'UTF-8',false) : '');
- $arr['country'] = (($x['country']) ? htmlentities($x['country'], ENT_COMPAT,'UTF-8',false) : '');
+ $arr['gender'] = (($x['gender']) ? htmlspecialchars($x['gender'], ENT_COMPAT,'UTF-8',false) : '');
+ $arr['marital'] = (($x['marital']) ? htmlspecialchars($x['marital'], ENT_COMPAT,'UTF-8',false) : '');
+ $arr['sexual'] = (($x['sexual']) ? htmlspecialchars($x['sexual'], ENT_COMPAT,'UTF-8',false) : '');
+ $arr['locale'] = (($x['locale']) ? htmlspecialchars($x['locale'], ENT_COMPAT,'UTF-8',false) : '');
+ $arr['region'] = (($x['region']) ? htmlspecialchars($x['region'], ENT_COMPAT,'UTF-8',false) : '');
+ $arr['postcode'] = (($x['postcode']) ? htmlspecialchars($x['postcode'], ENT_COMPAT,'UTF-8',false) : '');
+ $arr['country'] = (($x['country']) ? htmlspecialchars($x['country'], ENT_COMPAT,'UTF-8',false) : '');
$arr['keywords'] = (($x['keywords'] && is_array($x['keywords'])) ? array_sanitise($x['keywords']) : array());
@@ -841,8 +1045,6 @@ function get_profile_elements($x) {
function get_atom_elements($feed,$item) {
- require_once('library/HTMLPurifier.auto.php');
- require_once('include/html2bbcode.php');
$best_photo = array();
@@ -857,13 +1059,14 @@ function get_atom_elements($feed,$item) {
$res['author-name'] = unxmlify($feed->get_title());
$res['author-link'] = unxmlify($feed->get_permalink());
}
- $res['uri'] = unxmlify($item->get_id());
+ $res['mid'] = unxmlify($item->get_id());
$res['title'] = unxmlify($item->get_title());
$res['body'] = unxmlify($item->get_content());
$res['plink'] = unxmlify($item->get_link(0));
// removing the content of the title if its identically to the body
// This helps with auto generated titles e.g. from tumblr
+
if (title_is_body($res["title"], $res["body"]))
$res['title'] = "";
@@ -978,14 +1181,7 @@ function get_atom_elements($feed,$item) {
$res['body'] = oembed_html2bbcode($res['body']);
- $config = HTMLPurifier_Config::createDefault();
- $config->set('Cache.DefinitionImpl', null);
-
- // we shouldn't need a whitelist, because the bbcode converter
- // will strip out any unsupported tags.
-
- $purifier = new HTMLPurifier($config);
- $res['body'] = $purifier->purify($res['body']);
+ $res['body'] = purify_html($res['body']);
$res['body'] = @html2bbcode($res['body']);
@@ -1155,14 +1351,9 @@ function get_atom_elements($feed,$item) {
$res['object'] .= '<orig>' . xmlify($body) . '</orig>' . "\n";
if((strpos($body,'<') !== false) || (strpos($body,'>') !== false)) {
- $body = html2bb_video($body);
-
- $config = HTMLPurifier_Config::createDefault();
- $config->set('Cache.DefinitionImpl', null);
-
- $purifier = new HTMLPurifier($config);
- $body = $purifier->purify($body);
+ $body = purify_html($body);
$body = html2bbcode($body);
+
}
$res['object'] .= '<content>' . $body . '</content>' . "\n";
@@ -1193,13 +1384,7 @@ function get_atom_elements($feed,$item) {
$res['target'] .= '<orig>' . xmlify($body) . '</orig>' . "\n";
if((strpos($body,'<') !== false) || (strpos($body,'>') !== false)) {
- $body = html2bb_video($body);
-
- $config = HTMLPurifier_Config::createDefault();
- $config->set('Cache.DefinitionImpl', null);
-
- $purifier = new HTMLPurifier($config);
- $body = $purifier->purify($body);
+ $body = purify_html($body);
$body = html2bbcode($body);
}
@@ -1212,6 +1397,7 @@ function get_atom_elements($feed,$item) {
// This is some experimental stuff. By now retweets are shown with "RT:"
// But: There is data so that the message could be shown similar to native retweets
// There is some better way to parse this array - but it didn't worked for me.
+
$child = $item->feed->data["child"][SIMPLEPIE_NAMESPACE_ATOM_10]["feed"][0]["child"][SIMPLEPIE_NAMESPACE_ATOM_10]["entry"][0]["child"]["http://activitystrea.ms/spec/1.0/"][object][0]["child"];
if (is_array($child)) {
$message = $child["http://activitystrea.ms/spec/1.0/"]["object"][0]["child"][SIMPLEPIE_NAMESPACE_ATOM_10]["content"][0]["data"];
@@ -1237,12 +1423,7 @@ function get_atom_elements($feed,$item) {
$arr = array('feed' => $feed, 'item' => $item, 'result' => $res);
call_hooks('parse_atom', $arr);
-
- //if (($res["title"] != "") or (strpos($res["body"], "RT @") > 0)) {
- //if (strpos($res["body"], "RT @") !== false) {
- // $debugfile = tempnam("/home/ike/log", "item-res2-");
- // file_put_contents($debugfile, serialize($arr));
- //}
+ logger('get_atom_elements: ' . print_r($res,true));
return $res;
}
@@ -1268,31 +1449,105 @@ function encode_rel_links($links) {
return xmlify($o);
}
-function item_store($arr,$force_parent = false) {
+function item_store($arr,$allow_exec = false) {
+
+ $d = array('item' => $arr, 'allow_exec' => $allow_exec);
+ call_hooks('item_store', $d );
+ $arr = $d['item'];
+ $allow_exec = $d['allow_exec'];
+
+
+ $ret = array('result' => false, 'item_id' => 0);
if(! $arr['uid']) {
logger('item_store: no uid');
- return 0;
+ $ret['message'] = 'No uid.';
+ return ret;
+ }
+
+ $uplinked_comment = false;
+
+ // If a page layout is provided, ensure it exists and belongs to us.
+
+ if(array_key_exists('layout_mid',$arr) && $arr['layout_mid']) {
+ $l = q("select item_restrict from item where mid = '%s' and uid = %d limit 1",
+ dbesc($arr['layout_mid']),
+ intval($arr['uid'])
+ );
+ if((! $l) || (! ($l[0]['item_restrict'] & ITEM_PDL)))
+ unset($arr['layout_mid']);
+ }
+
+ // Don't let anybody set these, either intentionally or accidentally
+
+ if(array_key_exists('id',$arr))
+ unset($arr['id']);
+ if(array_key_exists('parent',$arr))
+ unset($arr['parent']);
+
+ $arr['mimetype'] = ((x($arr,'mimetype')) ? notags(trim($arr['mimetype'])) : 'text/bbcode');
+
+ if(($arr['mimetype'] == 'application/x-php') && (! $allow_exec)) {
+ logger('item_store: php mimetype but allow_exec is denied.');
+ $ret['message'] = 'exec denied.';
+ return $ret;
}
- $arr['lang'] = detect_language($arr['body']);
- $allowed_languages = get_pconfig($arr['uid'],'system','allowed_languages');
+ $arr['title'] = ((x($arr,'title')) ? notags(trim($arr['title'])) : '');
+ $arr['body'] = ((x($arr,'body')) ? trim($arr['body']) : '');
+
+ $arr['allow_cid'] = ((x($arr,'allow_cid')) ? trim($arr['allow_cid']) : '');
+ $arr['allow_gid'] = ((x($arr,'allow_gid')) ? trim($arr['allow_gid']) : '');
+ $arr['deny_cid'] = ((x($arr,'deny_cid')) ? trim($arr['deny_cid']) : '');
+ $arr['deny_gid'] = ((x($arr,'deny_gid')) ? trim($arr['deny_gid']) : '');
+ $arr['item_private'] = ((x($arr,'item_private')) ? intval($arr['item_private']) : 0 );
+ $arr['item_flags'] = ((x($arr,'item_flags')) ? intval($arr['item_flags']) : 0 );
+
+ $arr['title'] = escape_tags($arr['title']);
+
+
+ // only detect language if we have text content, and if the post is private but not yet
+ // obscured, make it so.
+
+ if(! ($arr['item_flags'] & ITEM_OBSCURED)) {
+
+ $arr['lang'] = detect_language($arr['body']);
+ // apply the input filter here - if it is obscured it has been filtered already
+ $arr['body'] = z_input_filter($arr['uid'],$arr['body'],$arr['mimetype']);
+
+
+ if(local_user() && (! $arr['sig'])) {
+ $channel = get_app()->get_channel();
+ if($channel['channel_hash'] === $arr['author_xchan']) {
+ $arr['sig'] = base64url_encode(rsa_sign($arr['body'],$channel['channel_prvkey']));
+ $arr['item_flags'] |= ITEM_VERIFIED;
+ }
+ }
+
+ $allowed_languages = get_pconfig($arr['uid'],'system','allowed_languages');
- if((is_array($allowed_languages)) && ($arr['lang']) && (! array_key_exists($arr['lang'],$allowed_languages))) {
- $translate = array('item' => $arr, 'from' => $arr['lang'], 'to' => $allowed_languages, 'translated' => false);
- call_hooks('item_translate', $translate);
- if((! $translate['translated']) && (intval(get_pconfig($arr['uid'],'system','reject_disallowed_languages')))) {
- logger('item_store: language ' . $arr['lang'] . ' not accepted for uid ' . $arr['uid']);
- return;
+ if((is_array($allowed_languages)) && ($arr['lang']) && (! array_key_exists($arr['lang'],$allowed_languages))) {
+ $translate = array('item' => $arr, 'from' => $arr['lang'], 'to' => $allowed_languages, 'translated' => false);
+ call_hooks('item_translate', $translate);
+ if((! $translate['translated']) && (intval(get_pconfig($arr['uid'],'system','reject_disallowed_languages')))) {
+ logger('item_store: language ' . $arr['lang'] . ' not accepted for uid ' . $arr['uid']);
+ $ret['message'] = 'language not accepted';
+ return $ret;
+ }
+ $arr = $translate['item'];
+ }
+ if($arr['item_private']) {
+ $key = get_config('system','pubkey');
+ $arr['item_flags'] = $arr['item_flags'] | ITEM_OBSCURED;
+ if($arr['title'])
+ $arr['title'] = json_encode(crypto_encapsulate($arr['title'],$key));
+ if($arr['body'])
+ $arr['body'] = json_encode(crypto_encapsulate($arr['body'],$key));
}
- $arr = $translate['item'];
- }
- // Shouldn't happen but we want to make absolutely sure it doesn't leak from a plugin.
+ }
- if((strpos($arr['body'],'<') !== false) || (strpos($arr['body'],'>') !== false))
- $arr['body'] = escape_tags($arr['body']);
if((x($arr,'object')) && is_array($arr['object'])) {
activity_sanitise($arr['object']);
@@ -1310,47 +1565,55 @@ function item_store($arr,$force_parent = false) {
}
$arr['aid'] = ((x($arr,'aid')) ? intval($arr['aid']) : 0);
- $arr['uri'] = ((x($arr,'uri')) ? notags(trim($arr['uri'])) : random_string());
+ $arr['mid'] = ((x($arr,'mid')) ? notags(trim($arr['mid'])) : random_string());
$arr['author_xchan'] = ((x($arr,'author_xchan')) ? notags(trim($arr['author_xchan'])) : '');
$arr['owner_xchan'] = ((x($arr,'owner_xchan')) ? notags(trim($arr['owner_xchan'])) : '');
$arr['created'] = ((x($arr,'created') !== false) ? datetime_convert('UTC','UTC',$arr['created']) : datetime_convert());
$arr['edited'] = ((x($arr,'edited') !== false) ? datetime_convert('UTC','UTC',$arr['edited']) : datetime_convert());
- $arr['expires'] = ((x($arr,'expires') !== false) ? datetime_convert('UTC','UTC',$arr['expires']) : '0000-00-00 00:00:00');
- $arr['commented'] = datetime_convert();
+ $arr['expires'] = ((x($arr,'expires') !== false) ? datetime_convert('UTC','UTC',$arr['expires']) : '0000-00-00 00:00:00');
+ $arr['commented'] = ((x($arr,'commented') !== false) ? datetime_convert('UTC','UTC',$arr['commented']) : datetime_convert());
$arr['received'] = datetime_convert();
$arr['changed'] = datetime_convert();
- $arr['mimetype'] = ((x($arr,'mimetype')) ? notags(trim($arr['mimetype'])) : 'text/bbcode');
- $arr['title'] = ((x($arr,'title')) ? notags(trim($arr['title'])) : '');
$arr['location'] = ((x($arr,'location')) ? notags(trim($arr['location'])) : '');
$arr['coord'] = ((x($arr,'coord')) ? notags(trim($arr['coord'])) : '');
- $arr['parent_uri'] = ((x($arr,'parent_uri')) ? notags(trim($arr['parent_uri'])) : '');
+ $arr['parent_mid'] = ((x($arr,'parent_mid')) ? notags(trim($arr['parent_mid'])) : '');
+ $arr['thr_parent'] = ((x($arr,'thr_parent')) ? notags(trim($arr['thr_parent'])) : $arr['parent_mid']);
$arr['verb'] = ((x($arr,'verb')) ? notags(trim($arr['verb'])) : '');
$arr['obj_type'] = ((x($arr,'obj_type')) ? notags(trim($arr['obj_type'])) : '');
$arr['object'] = ((x($arr,'object')) ? trim($arr['object']) : '');
$arr['tgt_type'] = ((x($arr,'tgt_type')) ? notags(trim($arr['tgt_type'])) : '');
$arr['target'] = ((x($arr,'target')) ? trim($arr['target']) : '');
$arr['plink'] = ((x($arr,'plink')) ? notags(trim($arr['plink'])) : '');
- $arr['allow_cid'] = ((x($arr,'allow_cid')) ? trim($arr['allow_cid']) : '');
- $arr['allow_gid'] = ((x($arr,'allow_gid')) ? trim($arr['allow_gid']) : '');
- $arr['deny_cid'] = ((x($arr,'deny_cid')) ? trim($arr['deny_cid']) : '');
- $arr['deny_gid'] = ((x($arr,'deny_gid')) ? trim($arr['deny_gid']) : '');
- $arr['item_private'] = ((x($arr,'item_private')) ? intval($arr['item_private']) : 0 );
- $arr['body'] = ((x($arr,'body')) ? trim($arr['body']) : '');
$arr['attach'] = ((x($arr,'attach')) ? notags(trim($arr['attach'])) : '');
$arr['app'] = ((x($arr,'app')) ? notags(trim($arr['app'])) : '');
$arr['item_restrict'] = ((x($arr,'item_restrict')) ? intval($arr['item_restrict']) : 0 );
- $arr['item_flags'] = ((x($arr,'item_flags')) ? intval($arr['item_flags']) : 0 );
+
+ $arr['comment_policy'] = ((x($arr,'comment_policy')) ? notags(trim($arr['comment_policy'])) : 'contacts' );
+
$arr['item_flags'] = $arr['item_flags'] | ITEM_UNSEEN;
-
- $arr['thr_parent'] = $arr['parent_uri'];
- $arr['llink'] = z_root() . '/display/' . $arr['uri'];
+ if($arr['comment_policy'] == 'none')
+ $arr['item_flags'] = $arr['item_flags'] | ITEM_NOCOMMENT;
+
+
+
+ // handle time travelers
+ // Allow a bit of fudge in case somebody just has a slightly slow/fast clock
+
+ $d1 = new DateTime('now +10 minutes', new DateTimeZone('UTC'));
+ $d2 = new DateTime($arr['created'] . '+00:00');
+ if($d2 > $d1)
+ $arr['item_restrict'] = $arr['item_restrict'] | ITEM_DELAYED_PUBLISH;
+
+ $arr['llink'] = z_root() . '/display/' . $arr['mid'];
if(! $arr['plink'])
$arr['plink'] = $arr['llink'];
- if($arr['parent_uri'] === $arr['uri']) {
+
+
+ if($arr['parent_mid'] === $arr['mid']) {
$parent_id = 0;
$parent_deleted = 0;
$allow_cid = $arr['allow_cid'];
@@ -1364,23 +1627,23 @@ function item_store($arr,$force_parent = false) {
// find the parent and snarf the item id and ACL's
// and anything else we need to inherit
- $r = q("SELECT * FROM `item` WHERE `uri` = '%s' AND `uid` = %d ORDER BY `id` ASC LIMIT 1",
- dbesc($arr['parent_uri']),
+ $r = q("SELECT * FROM `item` WHERE `mid` = '%s' AND `uid` = %d ORDER BY `id` ASC LIMIT 1",
+ dbesc($arr['parent_mid']),
intval($arr['uid'])
);
- if(count($r)) {
+ if($r) {
// is the new message multi-level threaded?
// even though we don't support it now, preserve the info
// and re-attach to the conversation parent.
- if($r[0]['uri'] != $r[0]['parent_uri']) {
- $arr['parent_uri'] = $r[0]['parent_uri'];
- $z = q("SELECT * FROM `item` WHERE `uri` = '%s' AND `parent_uri` = '%s' AND `uid` = %d
+ if($r[0]['mid'] != $r[0]['parent_mid']) {
+ $arr['parent_mid'] = $r[0]['parent_mid'];
+ $z = q("SELECT * FROM `item` WHERE `mid` = '%s' AND `parent_mid` = '%s' AND `uid` = %d
ORDER BY `id` ASC LIMIT 1",
- dbesc($r[0]['parent_uri']),
- dbesc($r[0]['parent_uri']),
+ dbesc($r[0]['parent_mid']),
+ dbesc($r[0]['parent_mid']),
intval($arr['uid'])
);
if($z && count($z))
@@ -1397,6 +1660,16 @@ function item_store($arr,$force_parent = false) {
if($r[0]['item_flags'] & ITEM_WALL)
$arr['item_flags'] = $arr['item_flags'] | ITEM_WALL;
+
+ // An uplinked comment might arrive with a downstream owner.
+ // Fix it.
+
+ if($r[0]['owner_xchan'] !== $arr['owner_xchan']) {
+ $arr['owner_xchan'] = $r[0]['owner_xchan'];
+ $uplinked_comment = true;
+ }
+
+
// if the parent is private, force privacy for the entire conversation
// This differs from the above settings as it subtly allows comments from
// email correspondents to be private even if the overall thread is not.
@@ -1412,22 +1685,9 @@ function item_store($arr,$force_parent = false) {
$arr['item_private'] = 0;
}
else {
-
- // Allow one to see reply tweets from status.net even when
- // we don't have or can't see the original post.
-
- if($force_parent) {
- logger('item_store: $force_parent=true, reply converted to top-level post.');
- $parent_id = 0;
- $arr['parent_uri'] = $arr['uri'];
- $arr['flags'] = $arr['flags'] | ITEM_THREAD_TOP;
- }
- else {
- logger('item_store: item parent was not found - ignoring item');
- return 0;
- }
-
- $parent_deleted = 0;
+ logger('item_store: item parent was not found - ignoring item');
+ $ret['message'] = 'parent not found.';
+ return $ret;
}
}
@@ -1435,20 +1695,22 @@ function item_store($arr,$force_parent = false) {
$arr['item_restrict'] = $arr['item_restrict'] | ITEM_DELETED;
- $r = q("SELECT `id` FROM `item` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
- dbesc($arr['uri']),
+ $r = q("SELECT `id` FROM `item` WHERE `mid` = '%s' AND `uid` = %d LIMIT 1",
+ dbesc($arr['mid']),
intval($arr['uid'])
);
if($r) {
- logger('item-store: duplicate item ignored. ' . print_r($arr,true));
- return 0;
+ logger('item_store: duplicate item ignored. ' . print_r($arr,true));
+ $ret['message'] = 'duplicate post.';
+ return $ret;
}
call_hooks('post_remote',$arr);
if(x($arr,'cancel')) {
logger('item_store: post cancelled by plugin.');
- return 0;
+ $ret['message'] = 'cancelled.';
+ return $ret;
}
// pull out all the taxonomy stuff for separate storage
@@ -1459,10 +1721,10 @@ function item_store($arr,$force_parent = false) {
unset($arr['term']);
}
- dbesc_array($arr);
-
logger('item_store: ' . print_r($arr,true), LOGGER_DATA);
+ dbesc_array($arr);
+
$r = dbq("INSERT INTO `item` (`"
. implode("`, `", array_keys($arr))
. "`) VALUES ('"
@@ -1471,40 +1733,43 @@ function item_store($arr,$force_parent = false) {
// find the item we just created
- $r = q("SELECT `id` FROM `item` WHERE `uri` = '%s' AND `uid` = %d ORDER BY `id` ASC ",
- $arr['uri'], // already dbesc'd
+ $r = q("SELECT * FROM `item` WHERE `mid` = '%s' AND `uid` = %d ORDER BY `id` ASC ",
+ $arr['mid'], // already dbesc'd
intval($arr['uid'])
);
+
if($r && count($r)) {
$current_post = $r[0]['id'];
+ $arr = $r[0]; // This will gives us a fresh copy of what's now in the DB and undo the db escaping, which really messes up the notifications
logger('item_store: created item ' . $current_post, LOGGER_DEBUG);
}
else {
- logger('item_store: could not locate created item');
- return 0;
+ logger('item_store: could not locate stored item');
+ $ret['message'] = 'unable to retrieve.';
+ return $ret;
}
if(count($r) > 1) {
logger('item_store: duplicated post occurred. Removing duplicates.');
- q("DELETE FROM `item` WHERE `uri` = '%s' AND `uid` = %d AND `id` != %d ",
- $arr['uri'],
+ q("DELETE FROM `item` WHERE `mid` = '%s' AND `uid` = %d AND `id` != %d ",
+ $arr['mid'],
intval($arr['uid']),
intval($current_post)
);
}
- if((! $parent_id) || ($arr['parent_uri'] === $arr['uri']))
+ if((! $parent_id) || ($arr['parent_mid'] === $arr['mid']))
$parent_id = $current_post;
if(strlen($allow_cid) || strlen($allow_gid) || strlen($deny_cid) || strlen($deny_gid))
$private = 1;
else
- $private = $arr['private'];
+ $private = $arr['item_private'];
// Set parent id - and also make sure to inherit the parent's ACL's.
- $r = q("UPDATE `item` SET `parent` = %d, `allow_cid` = '%s', `allow_gid` = '%s',
- `deny_cid` = '%s', `deny_gid` = '%s', `item_private` = %d WHERE `id` = %d LIMIT 1",
+ $r = q("UPDATE item SET parent = %d, allow_cid = '%s', allow_gid = '%s',
+ deny_cid = '%s', deny_gid = '%s', item_private = %d WHERE id = %d LIMIT 1",
intval($parent_id),
dbesc($allow_cid),
dbesc($allow_gid),
@@ -1514,13 +1779,14 @@ function item_store($arr,$force_parent = false) {
intval($current_post)
);
+ // These are probably redundant now that we've queried the just stored post
$arr['id'] = $current_post;
$arr['parent'] = $parent_id;
$arr['allow_cid'] = $allow_cid;
$arr['allow_gid'] = $allow_gid;
$arr['deny_cid'] = $deny_cid;
$arr['deny_gid'] = $deny_gid;
- $arr['private'] = $private;
+ $arr['item_private'] = $private;
// Store taxonomy
@@ -1544,8 +1810,13 @@ function item_store($arr,$force_parent = false) {
// update the commented timestamp on the parent
- q("UPDATE `item` set `commented` = '%s', `changed` = '%s' WHERE `id` = %d LIMIT 1",
- dbesc(datetime_convert()),
+ $z = q("select max(created) as commented from item where parent_mid = '%s' and uid = %d ",
+ dbesc($arr['parent_mid']),
+ intval($arr['uid'])
+ );
+
+ q("UPDATE item set commented = '%s', changed = '%s' WHERE id = %d LIMIT 1",
+ dbesc(($z) ? $z[0]['commented'] : (datetime_convert())),
dbesc(datetime_convert()),
intval($parent_id)
);
@@ -1554,11 +1825,238 @@ function item_store($arr,$force_parent = false) {
send_status_notifications($current_post,$arr);
tag_deliver($arr['uid'],$current_post);
+ $ret['success'] = true;
+ $ret['item_id'] = $current_post;
- return $current_post;
+ return $ret;
}
+
+function item_store_update($arr,$allow_exec = false) {
+
+
+
+ $d = array('item' => $arr, 'allow_exec' => $allow_exec);
+ call_hooks('item_store_update', $d );
+ $arr = $d['item'];
+ $allow_exec = $d['allow_exec'];
+
+
+
+ $ret = array('result' => false, 'item_id' => 0);
+ if(! intval($arr['uid'])) {
+ logger('item_store_update: no uid');
+ $ret['message'] = 'no uid.';
+ return $ret;
+ }
+ if(! intval($arr['id'])) {
+ logger('item_store_update: no id');
+ $ret['message'] = 'no id.';
+ return $ret;
+ }
+
+ $orig_post_id = $arr['id'];
+ $uid = $arr['uid'];
+
+ $orig = q("select * from item where id = %d and uid = %d limit 1",
+ intval($orig_post_id),
+ intval($uid)
+ );
+ if(! $orig) {
+ logger('item_store_update: original post not found: ' . $orig_post_id);
+ $ret['message'] = 'no original';
+ return $ret;
+ }
+
+ // override the unseen flag with the original
+
+ if($arr['item_flags'] & ITEM_UNSEEN)
+ $arr['item_flags'] = $arr['item_flags'] ^ ITEM_UNSEEN;
+
+ if($orig[0]['item_flags'] & ITEM_VERIFIED)
+ $orig[0]['item_flags'] = $orig[0]['item_flags'] ^ ITEM_VERIFIED;
+
+ $arr['item_flags'] = intval($arr['item_flags']) | $orig[0]['item_flags'];
+ $arr['item_restrict'] = intval($arr['item_restrict']) | $orig[0]['item_restrict'];
+
+
+ if(array_key_exists('edit',$arr))
+ unset($arr['edit']);
+ $arr['mimetype'] = ((x($arr,'mimetype')) ? notags(trim($arr['mimetype'])) : 'text/bbcode');
+
+ if(($arr['mimetype'] == 'application/x-php') && (! $allow_exec)) {
+ logger('item_store: php mimetype but allow_exec is denied.');
+ $ret['message'] = 'exec denied.';
+ return $ret;
+ }
+
+ if(! ($arr['item_flags'] & ITEM_OBSCURED)) {
+
+ $arr['lang'] = detect_language($arr['body']);
+ // apply the input filter here - if it is obscured it has been filtered already
+ $arr['body'] = z_input_filter($arr['uid'],$arr['body'],$arr['mimetype']);
+
+ if(local_user() && (! $arr['sig'])) {
+ $channel = get_app()->get_channel();
+ if($channel['channel_hash'] === $arr['author_xchan']) {
+ $arr['sig'] = base64url_encode(rsa_sign($arr['body'],$channel['channel_prvkey']));
+ $arr['item_flags'] |= ITEM_VERIFIED;
+ }
+ }
+
+ $allowed_languages = get_pconfig($arr['uid'],'system','allowed_languages');
+
+ if((is_array($allowed_languages)) && ($arr['lang']) && (! array_key_exists($arr['lang'],$allowed_languages))) {
+ $translate = array('item' => $arr, 'from' => $arr['lang'], 'to' => $allowed_languages, 'translated' => false);
+ call_hooks('item_translate', $translate);
+ if((! $translate['translated']) && (intval(get_pconfig($arr['uid'],'system','reject_disallowed_languages')))) {
+ logger('item_store: language ' . $arr['lang'] . ' not accepted for uid ' . $arr['uid']);
+ $ret['message'] = 'language not accepted';
+ return $ret;
+ }
+ $arr = $translate['item'];
+ }
+ if($arr['item_private']) {
+ $key = get_config('system','pubkey');
+ $arr['item_flags'] = $arr['item_flags'] | ITEM_OBSCURED;
+ if($arr['title'])
+ $arr['title'] = json_encode(crypto_encapsulate($arr['title'],$key));
+ if($arr['body'])
+ $arr['body'] = json_encode(crypto_encapsulate($arr['body'],$key));
+ }
+
+ }
+
+
+ if((x($arr,'object')) && is_array($arr['object'])) {
+ activity_sanitise($arr['object']);
+ $arr['object'] = json_encode($arr['object']);
+ }
+
+ if((x($arr,'target')) && is_array($arr['target'])) {
+ activity_sanitise($arr['target']);
+ $arr['target'] = json_encode($arr['target']);
+ }
+
+ if((x($arr,'attach')) && is_array($arr['attach'])) {
+ activity_sanitise($arr['attach']);
+ $arr['attach'] = json_encode($arr['attach']);
+ }
+
+
+ unset($arr['id']);
+ unset($arr['uid']);
+ unset($arr['aid']);
+ unset($arr['mid']);
+ unset($arr['parent']);
+ unset($arr['parent_mid']);
+ unset($arr['created']);
+ unset($arr['author_xchan']);
+ unset($arr['owner_xchan']);
+ unset($arr['thr_parent']);
+ unset($arr['llink']);
+
+ $arr['edited'] = ((x($arr,'edited') !== false) ? datetime_convert('UTC','UTC',$arr['edited']) : datetime_convert());
+ $arr['expires'] = ((x($arr,'expires') !== false) ? datetime_convert('UTC','UTC',$arr['expires']) : $orig[0]['expires']);
+ $arr['commented'] = $orig[0]['commented'];
+ $arr['received'] = datetime_convert();
+ $arr['changed'] = datetime_convert();
+ $arr['title'] = ((x($arr,'title')) ? notags(trim($arr['title'])) : '');
+ $arr['location'] = ((x($arr,'location')) ? notags(trim($arr['location'])) : $orig[0]['location']);
+ $arr['coord'] = ((x($arr,'coord')) ? notags(trim($arr['coord'])) : $orig[0]['coord']);
+ $arr['verb'] = ((x($arr,'verb')) ? notags(trim($arr['verb'])) : $orig[0]['verb']);
+ $arr['obj_type'] = ((x($arr,'obj_type')) ? notags(trim($arr['obj_type'])) : $orig[0]['obj_type']);
+ $arr['object'] = ((x($arr,'object')) ? trim($arr['object']) : $orig[0]['object']);
+ $arr['tgt_type'] = ((x($arr,'tgt_type')) ? notags(trim($arr['tgt_type'])) : $orig[0]['tgt_type']);
+ $arr['target'] = ((x($arr,'target')) ? trim($arr['target']) : $orig[0]['target']);
+ $arr['plink'] = ((x($arr,'plink')) ? notags(trim($arr['plink'])) : $orig[0]['plink']);
+ $arr['allow_cid'] = ((x($arr,'allow_cid')) ? trim($arr['allow_cid']) : $orig[0]['allow_cid']);
+ $arr['allow_gid'] = ((x($arr,'allow_gid')) ? trim($arr['allow_gid']) : $orig[0]['allow_gid']);
+ $arr['deny_cid'] = ((x($arr,'deny_cid')) ? trim($arr['deny_cid']) : $orig[0]['deny_cid']);
+ $arr['deny_gid'] = ((x($arr,'deny_gid')) ? trim($arr['deny_gid']) : $orig[0]['deny_gid']);
+ $arr['item_private'] = ((x($arr,'item_private')) ? intval($arr['item_private']) : $orig[0]['item_private']);
+ $arr['body'] = ((x($arr,'body')) ? trim($arr['body']) : '');
+ $arr['attach'] = ((x($arr,'attach')) ? notags(trim($arr['attach'])) : $orig[0]['attach']);
+ $arr['app'] = ((x($arr,'app')) ? notags(trim($arr['app'])) : $orig[0]['app']);
+// $arr['item_restrict'] = ((x($arr,'item_restrict')) ? intval($arr['item_restrict']) : $orig[0]['item_restrict'] );
+// $arr['item_flags'] = ((x($arr,'item_flags')) ? intval($arr['item_flags']) : $orig[0]['item_flags'] );
+
+ $arr['sig'] = ((x($arr,'sig')) ? $arr['sig'] : '');
+ $arr['layout_mid'] = ((x($arr,'layout_mid')) ? dbesc($arr['layout_mid']) : $orig[0]['layout_mid'] );
+
+ call_hooks('post_remote_update',$arr);
+
+ if(x($arr,'cancel')) {
+ logger('item_store_update: post cancelled by plugin.');
+ $ret['message'] = 'cancelled.';
+ return $ret;
+ }
+
+ // pull out all the taxonomy stuff for separate storage
+
+ $terms = null;
+ if(array_key_exists('term',$arr)) {
+ $terms = $arr['term'];
+ unset($arr['term']);
+ }
+
+ dbesc_array($arr);
+
+ logger('item_store_update: ' . print_r($arr,true), LOGGER_DATA);
+
+ $str = '';
+ foreach($arr as $k => $v) {
+ if($str)
+ $str .= ",";
+ $str .= " `" . $k . "` = '" . $v . "' ";
+ }
+
+ $r = dbq("update `item` set " . $str . " where id = " . $orig_post_id . " limit 1");
+
+ if($r)
+ logger('item_store_update: updated item ' . $orig_post_id, LOGGER_DEBUG);
+ else {
+ logger('item_store_update: could not update item');
+ $ret['message'] = 'DB update failed.';
+ return $ret;
+ }
+
+ $r = q("delete from term where oid = %d and otype = %d",
+ intval($orig_post_id),
+ intval(TERM_OBJ_POST)
+ );
+
+ if(($terms) && (is_array($terms))) {
+ foreach($terms as $t) {
+ q("insert into term (uid,oid,otype,type,term,url)
+ values(%d,%d,%d,%d,'%s','%s') ",
+ intval($uid),
+ intval($orig_post_id),
+ intval(TERM_OBJ_POST),
+ intval($t['type']),
+ dbesc($t['term']),
+ dbesc($t['url'])
+ );
+ }
+
+ $arr['term'] = $terms;
+ }
+
+ call_hooks('post_remote_update_end',$arr);
+
+ send_status_notifications($orig_post_id,$arr);
+
+ tag_deliver($uid,$orig_post_id);
+ $ret['success'] = true;
+ $ret['item_id'] = $orig_post_id;
+
+ return $ret;
+}
+
+
+
+
function send_status_notifications($post_id,$item) {
$notify = false;
@@ -1581,8 +2079,8 @@ function send_status_notifications($post_id,$item) {
// Was I involved in this conversation?
- $x = q("select * from item where parent_uri = '%s' and uid = %d",
- dbesc($item['parent_uri']),
+ $x = q("select * from item where parent_mid = '%s' and uid = %d",
+ dbesc($item['parent_mid']),
intval($item['uid'])
);
if($x) {
@@ -1604,11 +2102,11 @@ function send_status_notifications($post_id,$item) {
'from_xchan' => $item['author_xchan'],
'to_xchan' => $r[0]['channel_hash'],
'item' => $item,
- 'link' => get_app()->get_baseurl() . '/display/' . $item['uri'],
+ 'link' => get_app()->get_baseurl() . '/display/' . $item['mid'],
'verb' => ACTIVITY_POST,
'otype' => 'item',
'parent' => $parent,
- 'parent_uri' => $item['parent_uri']
+ 'parent_mid' => $item['parent_mid']
));
return;
}
@@ -1633,7 +2131,9 @@ function get_item_contact($item,$contacts) {
function tag_deliver($uid,$item_id) {
- // look for mention tags and setup a second delivery chain for forum/community posts if appropriate
+ // Called when we deliver things that might be tagged in ways that require delivery processing.
+ // Handles community tagging of posts and also look for mention tags
+ // and sets up a second delivery chain if appropriate
$a = get_app();
@@ -1649,22 +2149,117 @@ function tag_deliver($uid,$item_id) {
intval($item_id),
intval($uid)
);
- if(! count($i))
+ if(! $i)
return;
$i = fetch_post_tags($i);
$item = $i[0];
+ if(($item['source_xchan']) && ($item['item_flags'] & ITEM_UPLINK) && ($item['item_flags'] & ITEM_THREAD_TOP) && ($item['edited'] != $item['created'])) {
+ // this is an update to a post which was already processed by us and has a second delivery chain
+ // Just start the second delivery chain to deliver the updated post
+ proc_run('php','include/notifier.php','tgroup',$item['id']);
+ return;
+ }
+
+
+ if($item['obj_type'] === ACTIVITY_OBJ_TAGTERM) {
+
+ // We received a community tag activity for a post.
+ // See if we are the owner of the parent item and have given permission to tag our posts.
+ // If so tag the parent post.
+
+ logger('tag_deliver: community tag activity received');
+
+ if(($item['owner_xchan'] === $u[0]['channel_hash']) && (! get_pconfig($u[0]['channel_id'],'system','blocktags'))) {
+ $j_tgt = json_decode_plus($item['target']);
+ if($j_tgt && $j_tgt['id']) {
+ $p = q("select * from item where mid = '%s' and uid = %d limit 1",
+ dbesc($j_tgt['id']),
+ intval($u[0]['channel_id'])
+ );
+ if($p) {
+ $j_obj = json_decode_plus($item['object']);
+ logger('tag_deliver: tag object: ' . print_r($j_obj,true), LOGGER_DATA);
+ if($j_obj && $j_obj['id'] && $j_obj['title']) {
+ if(is_array($j_obj['link']))
+ $taglink = get_rel_link($j_obj['link'],'alternate');
+ store_item_tag($u[0]['channel_id'],$p[0]['id'],TERM_OBJ_POST,TERM_HASHTAG,$j_obj['title'],$j_obj['id']);
+ proc_run('php','include/notifier.php','edit_post',$p[0]['id']);
+ }
+ }
+ }
+ }
+ else
+ logger('tag_deliver: tag permission denied for ' . $u[0]['channel_address']);
+ }
+
+
+ $union = check_item_source($uid,$item);
+ if($union)
+ logger('check_item_source returns true');
+
+
+ // This might be a followup by the original post author to a tagged forum
+ // If so setup a second delivery chain
+
+ $r = null;
+
+ if( ! ($item['item_flags'] & ITEM_THREAD_TOP)) {
+ $x = q("select * from item where id = parent and parent = %d and uid = %d limit 1",
+ intval($item['parent']),
+ intval($uid)
+ );
+
+
+ if(($x) && ($x[0]['item_flags'] & ITEM_UPLINK)) {
+
+ logger('tag_deliver: creating second delivery chain for comment to tagged post.');
+
+ // now change this copy of the post to a forum head message and deliver to all the tgroup members
+ // also reset all the privacy bits to the forum default permissions
+
+ $private = (($u[0]['allow_cid'] || $u[0]['allow_gid'] || $u[0]['deny_cid'] || $u[0]['deny_gid']) ? 1 : 0);
+
+ $flag_bits = ITEM_WALL|ITEM_ORIGIN;
+
+ // maintain the original source, which will be the original item owner and was stored in source_xchan
+ // when we created the delivery fork
+
+ $r = q("update item set source_xchan = '%s' where id = %d limit 1",
+ dbesc($x[0]['source_xchan']),
+ intval($item_id)
+ );
+
+ $r = q("update item set item_flags = ( item_flags | %d ), owner_xchan = '%s', allow_cid = '%s', allow_gid = '%s',
+ deny_cid = '%s', deny_gid = '%s', item_private = %d where id = %d limit 1",
+ intval($flag_bits),
+ dbesc($u[0]['channel_hash']),
+ dbesc($u[0]['allow_cid']),
+ dbesc($u[0]['allow_gid']),
+ dbesc($u[0]['deny_cid']),
+ dbesc($u[0]['deny_gid']),
+ intval($private),
+ intval($item_id)
+ );
+ if($r)
+ proc_run('php','include/notifier.php','tgroup',$item_id);
+ else
+ logger('tag_deliver: failed to update item');
+ }
+ }
+
$terms = get_terms_oftype($item['term'],TERM_MENTION);
- logger('tag_deliver: post mentions: ' . print_r($terms,true), LOGGER_DATA);
+ if($terms)
+ logger('tag_deliver: post mentions: ' . print_r($terms,true), LOGGER_DATA);
$link = normalise_link($a->get_baseurl() . '/channel/' . $u[0]['channel_address']);
if($terms) {
foreach($terms as $term) {
- if(($term['term'] == $u[0]['channel_name']) && link_compare($term['url'],$link)) {
+ if((strcasecmp($term['term'],$u[0]['channel_name']) == 0) && link_compare($term['url'],$link)) {
$mention = true;
break;
}
@@ -1678,48 +2273,69 @@ function tag_deliver($uid,$item_id) {
intval(ITEM_MENTIONSME),
intval($item_id)
);
- }
- else
- return;
- // At this point we've determined that the person receiving this post was mentioned in it.
- // Now let's check if this mention was inside a reshare so we don't spam a forum
- $body = preg_replace('/\[share(.*?)\[\/share\]/','',$item['body']);
- $pattern = '/@\[url\=' . preg_quote($term['url'],'/') . '\]' . preg_quote($u[0]['channel_name'],'/') . '\[\/url\]/';
+ // At this point we've determined that the person receiving this post was mentioned in it or it is a union.
+ // Now let's check if this mention was inside a reshare so we don't spam a forum
+ // If it's private we may have to unobscure it momentarily so that we can parse it.
- if(! preg_match($pattern,$body,$matches)) {
- logger('tag_deliver: mention was in a reshare - ignoring');
- return;
- }
+ $body = '';
+
+ if($item['item_flags'] & ITEM_OBSCURED) {
+ $key = get_config('system','prvkey');
+ if($item['body'])
+ $body = crypto_unencapsulate(json_decode_plus($item['body']),$key);
+ }
+ else
+ $body = $item['body'];
+
+ $body = preg_replace('/\[share(.*?)\[\/share\]/','',$body);
+
+ $pattern = '/@\!?\[zrl\=' . preg_quote($term['url'],'/') . '\]' . preg_quote($u[0]['channel_name'],'/') . '\[\/zrl\]/';
+
+ if(! preg_match($pattern,$body,$matches)) {
+ logger('tag_deliver: mention was in a reshare - ignoring');
+ return;
+ }
- // All good.
- // Send a notification
+ // All good.
+ // Send a notification
- require_once('include/enotify.php');
- notification(array(
- 'to_xchan' => $u[0]['channel_hash'],
- 'from_xchan' => $item['author_xchan'],
- 'type' => NOTIFY_TAGSELF,
- 'item' => $item,
- 'link' => $i[0]['llink'],
- 'verb' => ACTIVITY_TAG,
- 'otype' => 'item'
- ));
+ require_once('include/enotify.php');
+ notification(array(
+ 'to_xchan' => $u[0]['channel_hash'],
+ 'from_xchan' => $item['author_xchan'],
+ 'type' => NOTIFY_TAGSELF,
+ 'item' => $item,
+ 'link' => $i[0]['llink'],
+ 'verb' => ACTIVITY_TAG,
+ 'otype' => 'item'
+ ));
- if(! perm_is_allowed($uid,$item['author_xchan'],'tag_deliver'))
+ if(! perm_is_allowed($uid,$item['author_xchan'],'tag_deliver')) {
+ logger('tag_delivery denied for uid ' . $uid . ' and xchan ' . $item['author_xchan']);
+ return;
+ }
+
+ }
+
+ if((! $mention) && (! $union)) {
+ logger('tag_deliver: no mention and no union.');
return;
+ }
// tgroup delivery - setup a second delivery chain
// prevent delivery looping - only proceed
// if the message originated elsewhere and is a top-level post
- if(($item['item_flags'] & ITEM_WALL) || ($item['item_flags'] & ITEM_ORIGIN) || (!($item['item_flags'] & ITEM_THREAD_TOP)) || ($item['id'] != $item['parent']))
+ if(($item['item_flags'] & ITEM_WALL) || ($item['item_flags'] & ITEM_ORIGIN) || (!($item['item_flags'] & ITEM_THREAD_TOP)) || ($item['id'] != $item['parent'])) {
+ logger('tag_deliver: item was local or a comment. rejected.');
return;
+ }
logger('tag_deliver: creating second delivery chain.');
@@ -1730,6 +2346,12 @@ function tag_deliver($uid,$item_id) {
$flag_bits = ITEM_WALL|ITEM_ORIGIN|ITEM_UPLINK;
+ // preserve the source
+
+ $r = q("update item set source_xchan = owner_xchan where id = %d limit 1",
+ intval($item_id)
+ );
+
$r = q("update item set item_flags = ( item_flags | %d ), owner_xchan = '%s', allow_cid = '%s', allow_gid = '%s',
deny_cid = '%s', deny_gid = '%s', item_private = %d where id = %d limit 1",
intval($flag_bits),
@@ -1757,53 +2379,135 @@ function tgroup_check($uid,$item) {
$mention = false;
// check that the message originated elsewhere and is a top-level post
+ // or is a followup and we have already accepted the top level post as an uplink
- if(($item['wall']) || ($item['origin']) || ($item['uri'] != $item['parent-uri']))
+ if($item['mid'] != $item['parent_mid']) {
+ $r = q("select id from item where mid = '%s' and uid = %d and ( item_flags & %d ) limit 1",
+ dbesc($item['parent_mid']),
+ intval($uid),
+ intval(ITEM_UPLINK)
+ );
+ if($r)
+ return true;
+ return false;
+ }
+ if(! perm_is_allowed($uid,$item['author_xchan'],'tag_deliver'))
return false;
-
- $u = q("select * from user where uid = %d limit 1",
+ $u = q("select * from channel where channel_id = %d limit 1",
intval($uid)
);
- if(! count($u))
- return false;
-
- $community_page = (($u[0]['page-flags'] == PAGE_COMMUNITY) ? true : false);
- $prvgroup = (($u[0]['page-flags'] == PAGE_PRVGROUP) ? true : false);
+ if(! $u)
+ return false;
- $link = normalise_link($a->get_baseurl() . '/channel/' . $u[0]['nickname']);
+ $terms = get_terms_oftype($item['term'],TERM_MENTION);
- // Diaspora uses their own hardwired link URL in @-tags
- // instead of the one we supply with webfinger
+ if($terms)
+ logger('tgroup_check: post mentions: ' . print_r($terms,true), LOGGER_DATA);
- $dlink = normalise_link($a->get_baseurl() . '/u/' . $u[0]['nickname']);
+ $link = normalise_link($a->get_baseurl() . '/channel/' . $u[0]['channel_address']);
- $body = preg_replace("/\[share\](.*?)\[\/share\]/ism", '', $item['body']);
-
- $cnt = preg_match_all('/[\@\!]\[url\=(.*?)\](.*?)\[\/url\]/ism',$body,$matches,PREG_SET_ORDER);
- if($cnt) {
- foreach($matches as $mtch) {
- if(link_compare($link,$mtch[1]) || link_compare($dlink,$mtch[1])) {
+ if($terms) {
+ foreach($terms as $term) {
+ if(($term['term'] == $u[0]['channel_name']) && link_compare($term['url'],$link)) {
$mention = true;
- logger('tgroup_check: mention found: ' . $mtch[2]);
+ break;
}
}
+ }
+
+ if($mention) {
+ logger('tgroup_check: mention found for ' . $u[0]['channel_name']);
+ }
+ else
+ return false;
+
+ // At this point we've determined that the person receiving this post was mentioned in it.
+ // Now let's check if this mention was inside a reshare so we don't spam a forum
+
+ $body = preg_replace('/\[share(.*?)\[\/share\]/','',$item['body']);
+
+ $pattern = '/@\!?\[zrl\=' . preg_quote($term['url'],'/') . '\]' . preg_quote($u[0]['channel_name'],'/') . '\[\/zrl\]/';
+
+ if(! preg_match($pattern,$body,$matches)) {
+ logger('tgroup_check: mention was in a reshare - ignoring');
+ return false;
}
- if(! $mention)
+
+ return true;
+
+}
+
+
+/**
+ * @function check_item_source($uid,$item)
+ * @param $uid
+ * @param $item
+ *
+ * @description
+ * Checks to see if this item owner is referenced as a source for this channel and if the post
+ * matches the rules for inclusion in this channel. Returns true if we should create a second delivery
+ * chain and false if none of the rules apply, or if the item is private.
+ */
+
+
+function check_item_source($uid,$item) {
+
+ if($item['item_private'])
return false;
+
+
+ $r = q("select * from source where src_channel_id = %d and src_xchan = '%s' limit 1",
+ intval($uid),
+ dbesc(($item['source_xchan']) ? $item['source_xchan'] : $item['owner_xchan'])
+ );
- if((! $community_page) && (! $prvgroup))
+ if(! $r)
return false;
+ $x = q("select abook_their_perms from abook where abook_channel = %d and abook_xchan = '%s' limit 1",
+ intval($uid),
+ dbesc($item['owner_xchan'])
+ );
+
+ if(! $x)
+ return false;
+ if(! ($x[0]['abook_their_perms'] & PERMS_A_REPUBLISH))
+ return false;
- return true;
+ if($r[0]['src_channel_xchan'] === $item['owner_xchan'])
+ return false;
+ if(! $r[0]['src_patt'])
+ return true;
+
+ require_once('include/html2plain.php');
+ $text = prepare_text($item['body'],$item['mimetype']);
+ $text = html2plain($text);
+
+ $tags = ((count($items['term'])) ? $items['term'] : false);
+
+ $words = explode("\n",$r[0]['src_patt']);
+ if($words) {
+ foreach($words as $word) {
+ if(substr($word,0,1) === '#' && $tags) {
+ foreach($tags as $t)
+ if($t['type'] == TERM_HASHTAG && substr($t,1) === $word)
+ return true;
+ }
+ if(stristr($text,$word) !== false)
+ return true;
+ }
+ }
+ return false;
}
+
+
function mail_store($arr) {
if(! $arr['channel_id']) {
@@ -1814,24 +2518,29 @@ function mail_store($arr) {
if((strpos($arr['body'],'<') !== false) || (strpos($arr['body'],'>') !== false))
$arr['body'] = escape_tags($arr['body']);
+ if(array_key_exists('attach',$arr) && is_array($arr['attach']))
+ $arr['attach'] = json_encode($arr['attach']);
+
$arr['account_id'] = ((x($arr,'account_id')) ? intval($arr['account_id']) : 0);
- $arr['uri'] = ((x($arr,'uri')) ? notags(trim($arr['uri'])) : random_string());
+ $arr['mid'] = ((x($arr,'mid')) ? notags(trim($arr['mid'])) : random_string());
$arr['from_xchan'] = ((x($arr,'from_xchan')) ? notags(trim($arr['from_xchan'])) : '');
$arr['to_xchan'] = ((x($arr,'to_xchan')) ? notags(trim($arr['to_xchan'])) : '');
$arr['created'] = ((x($arr,'created') !== false) ? datetime_convert('UTC','UTC',$arr['created']) : datetime_convert());
+ $arr['expires'] = ((x($arr,'expires') !== false) ? datetime_convert('UTC','UTC',$arr['expires']) : '0000-00-00 00:00:00');
$arr['title'] = ((x($arr,'title')) ? notags(trim($arr['title'])) : '');
- $arr['parent_uri'] = ((x($arr,'parent_uri')) ? notags(trim($arr['parent_uri'])) : '');
+ $arr['parent_mid'] = ((x($arr,'parent_mid')) ? notags(trim($arr['parent_mid'])) : '');
$arr['body'] = ((x($arr,'body')) ? trim($arr['body']) : '');
+
$arr['mail_flags'] = ((x($arr,'mail_flags')) ? intval($arr['mail_flags']) : 0 );
- if(! $arr['parent_uri']) {
+ if(! $arr['parent_mid']) {
logger('mail_store: missing parent');
- $arr['parent_uri'] = $arr['uri'];
+ $arr['parent_mid'] = $arr['mid'];
}
- $r = q("SELECT `id` FROM mail WHERE `uri` = '%s' AND channel_id = %d LIMIT 1",
- dbesc($arr['uri']),
+ $r = q("SELECT `id` FROM mail WHERE `mid` = '%s' AND channel_id = %d LIMIT 1",
+ dbesc($arr['mid']),
intval($arr['channel_id'])
);
if($r) {
@@ -1858,8 +2567,8 @@ function mail_store($arr) {
// find the item we just created
- $r = q("SELECT `id` FROM mail WHERE `uri` = '%s' AND `channel_id` = %d ORDER BY `id` ASC ",
- $arr['uri'], // already dbesc'd
+ $r = q("SELECT `id` FROM mail WHERE `mid` = '%s' AND `channel_id` = %d ORDER BY `id` ASC ",
+ $arr['mid'], // already dbesc'd
intval($arr['channel_id'])
);
@@ -1874,8 +2583,8 @@ function mail_store($arr) {
}
if(count($r) > 1) {
logger('mail_store: duplicated post occurred. Removing duplicates.');
- q("DELETE FROM mail WHERE `uri` = '%s' AND `channel_id` = %d AND `id` != %d ",
- $arr['uri'],
+ q("DELETE FROM mail WHERE `mid` = '%s' AND `channel_id` = %d AND `id` != %d ",
+ $arr['mid'],
intval($arr['channel_id']),
intval($current_post)
);
@@ -1901,198 +2610,6 @@ function mail_store($arr) {
-
-
-
-function dfrn_deliver($owner,$contact,$atom, $dissolve = false) {
-
- $a = get_app();
-
- $idtosend = $orig_id = (($contact['dfrn_id']) ? $contact['dfrn_id'] : $contact['issued_id']);
-
- if($contact['duplex'] && $contact['dfrn_id'])
- $idtosend = '0:' . $orig_id;
- if($contact['duplex'] && $contact['issued_id'])
- $idtosend = '1:' . $orig_id;
-
- $rino = ((function_exists('mcrypt_encrypt')) ? 1 : 0);
-
- $rino_enable = get_config('system','rino_encrypt');
-
- if(! $rino_enable)
- $rino = 0;
-
- $ssl_val = intval(get_config('system','ssl_policy'));
- $ssl_policy = '';
-
- switch($ssl_val){
- case SSL_POLICY_FULL:
- $ssl_policy = 'full';
- break;
- case SSL_POLICY_SELFSIGN:
- $ssl_policy = 'self';
- break;
- case SSL_POLICY_NONE:
- default:
- $ssl_policy = 'none';
- break;
- }
-
- $url = $contact['notify'] . '&dfrn_id=' . $idtosend . '&dfrn_version=' . DFRN_PROTOCOL_VERSION . (($rino) ? '&rino=1' : '');
-
- logger('dfrn_deliver: ' . $url);
-
- $xml = fetch_url($url);
-
- $curl_stat = $a->get_curl_code();
- if(! $curl_stat)
- return(-1); // timed out
-
- logger('dfrn_deliver: ' . $xml, LOGGER_DATA);
-
- if(! $xml)
- return 3;
-
- if(strpos($xml,'<?xml') === false) {
- logger('dfrn_deliver: no valid XML returned');
- logger('dfrn_deliver: returned XML: ' . $xml, LOGGER_DATA);
- return 3;
- }
-
- $res = parse_xml_string($xml);
-
- if((intval($res->status) != 0) || (! strlen($res->challenge)) || (! strlen($res->dfrn_id)))
- return (($res->status) ? $res->status : 3);
-
- $postvars = array();
- $sent_dfrn_id = hex2bin((string) $res->dfrn_id);
- $challenge = hex2bin((string) $res->challenge);
- $perm = (($res->perm) ? $res->perm : null);
- $dfrn_version = (float) (($res->dfrn_version) ? $res->dfrn_version : 2.0);
- $rino_allowed = ((intval($res->rino) === 1) ? 1 : 0);
- $page = (($owner['page-flags'] == PAGE_COMMUNITY) ? 1 : 0);
-
- if($owner['page-flags'] == PAGE_PRVGROUP)
- $page = 2;
-
- $final_dfrn_id = '';
-
- if($perm) {
- if((($perm == 'rw') && (! intval($contact['writable'])))
- || (($perm == 'r') && (intval($contact['writable'])))) {
- q("update contact set writable = %d where id = %d limit 1",
- intval(($perm == 'rw') ? 1 : 0),
- intval($contact['id'])
- );
- $contact['writable'] = (string) 1 - intval($contact['writable']);
- }
- }
-
- if(($contact['duplex'] && strlen($contact['pubkey']))
- || ($owner['page-flags'] == PAGE_COMMUNITY && strlen($contact['pubkey']))
- || ($contact['rel'] == CONTACT_IS_SHARING && strlen($contact['pubkey']))) {
- openssl_public_decrypt($sent_dfrn_id,$final_dfrn_id,$contact['pubkey']);
- openssl_public_decrypt($challenge,$postvars['challenge'],$contact['pubkey']);
- }
- else {
- openssl_private_decrypt($sent_dfrn_id,$final_dfrn_id,$contact['prvkey']);
- openssl_private_decrypt($challenge,$postvars['challenge'],$contact['prvkey']);
- }
-
- $final_dfrn_id = substr($final_dfrn_id, 0, strpos($final_dfrn_id, '.'));
-
- if(strpos($final_dfrn_id,':') == 1)
- $final_dfrn_id = substr($final_dfrn_id,2);
-
- if($final_dfrn_id != $orig_id) {
- logger('dfrn_deliver: wrong dfrn_id.');
- // did not decode properly - cannot trust this site
- return 3;
- }
-
- $postvars['dfrn_id'] = $idtosend;
- $postvars['dfrn_version'] = DFRN_PROTOCOL_VERSION;
- if($dissolve)
- $postvars['dissolve'] = '1';
-
-
- if((($contact['rel']) && ($contact['rel'] != CONTACT_IS_SHARING) && (! $contact['blocked'])) || ($owner['page-flags'] == PAGE_COMMUNITY)) {
- $postvars['data'] = $atom;
- $postvars['perm'] = 'rw';
- }
- else {
- $postvars['data'] = str_replace('<dfrn:comment-allow>1','<dfrn:comment-allow>0',$atom);
- $postvars['perm'] = 'r';
- }
-
- $postvars['ssl_policy'] = $ssl_policy;
-
- if($page)
- $postvars['page'] = $page;
-
- if($rino && $rino_allowed && (! $dissolve)) {
- $key = substr(random_string(),0,16);
- $data = bin2hex(aes_encrypt($postvars['data'],$key));
- $postvars['data'] = $data;
- logger('rino: sent key = ' . $key, LOGGER_DEBUG);
-
-
- if($dfrn_version >= 2.1) {
- if(($contact['duplex'] && strlen($contact['pubkey']))
- || ($owner['page-flags'] == PAGE_COMMUNITY && strlen($contact['pubkey']))
- || ($contact['rel'] == CONTACT_IS_SHARING && strlen($contact['pubkey']))) {
-
- openssl_public_encrypt($key,$postvars['key'],$contact['pubkey']);
- }
- else {
- openssl_private_encrypt($key,$postvars['key'],$contact['prvkey']);
- }
- }
- else {
- if(($contact['duplex'] && strlen($contact['prvkey'])) || ($owner['page-flags'] == PAGE_COMMUNITY)) {
- openssl_private_encrypt($key,$postvars['key'],$contact['prvkey']);
- }
- else {
- openssl_public_encrypt($key,$postvars['key'],$contact['pubkey']);
- }
- }
-
- logger('md5 rawkey ' . md5($postvars['key']));
-
- $postvars['key'] = bin2hex($postvars['key']);
- }
-
- logger('dfrn_deliver: ' . "SENDING: " . print_r($postvars,true), LOGGER_DATA);
-
- $xml = post_url($contact['notify'],$postvars);
-
- logger('dfrn_deliver: ' . "RECEIVED: " . $xml, LOGGER_DATA);
-
- $curl_stat = $a->get_curl_code();
- if((! $curl_stat) || (! strlen($xml)))
- return(-1); // timed out
-
- if(($curl_stat == 503) && (stristr($a->get_curl_headers(),'retry-after')))
- return(-1);
-
- if(strpos($xml,'<?xml') === false) {
- logger('dfrn_deliver: phase 2: no valid XML returned');
- logger('dfrn_deliver: phase 2: returned XML: ' . $xml, LOGGER_DATA);
- return 3;
- }
-
- if($contact['term_date'] != '0000-00-00 00:00:00') {
- logger("dfrn_deliver: $url back from the dead - removing mark for death");
- require_once('include/Contact.php');
- unmark_for_death($contact);
- }
-
- $res = parse_xml_string($xml);
-
- return $res->status;
-}
-
-
/**
*
* consume_feed - process atom feed and update anything/everything we might need to update
@@ -2128,6 +2645,9 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $pass = 0)
logger('consume_feed: empty input');
return;
}
+
+ // Want to see this work as a content source for the matrix?
+ // Read this: https://github.com/friendica/red/wiki/Service_Federation
$feed = new SimplePie();
$feed->set_raw_data($xml);
@@ -2144,182 +2664,6 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $pass = 0)
// Check at the feed level for updated contact name and/or photo
- $name_updated = '';
- $new_name = '';
- $photo_timestamp = '';
- $photo_url = '';
- $birthday = '';
-
- $hubs = $feed->get_links('hub');
- logger('consume_feed: hubs: ' . print_r($hubs,true), LOGGER_DATA);
-
- if(count($hubs))
- $hub = implode(',', $hubs);
-
- $rawtags = $feed->get_feed_tags( NAMESPACE_DFRN, 'owner');
- if(! $rawtags)
- $rawtags = $feed->get_feed_tags( SIMPLEPIE_NAMESPACE_ATOM_10, 'author');
- if($rawtags) {
- $elems = $rawtags[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10];
- if($elems['name'][0]['attribs'][NAMESPACE_DFRN]['updated']) {
- $name_updated = $elems['name'][0]['attribs'][NAMESPACE_DFRN]['updated'];
- $new_name = $elems['name'][0]['data'];
- }
- if((x($elems,'link')) && ($elems['link'][0]['attribs']['']['rel'] === 'photo') && ($elems['link'][0]['attribs'][NAMESPACE_DFRN]['updated'])) {
- $photo_timestamp = datetime_convert('UTC','UTC',$elems['link'][0]['attribs'][NAMESPACE_DFRN]['updated']);
- $photo_url = $elems['link'][0]['attribs']['']['href'];
- }
-
- if((x($rawtags[0]['child'], NAMESPACE_DFRN)) && (x($rawtags[0]['child'][NAMESPACE_DFRN],'birthday'))) {
- $birthday = datetime_convert('UTC','UTC', $rawtags[0]['child'][NAMESPACE_DFRN]['birthday'][0]['data']);
- }
- }
-
- if((is_array($contact)) && ($photo_timestamp) && (strlen($photo_url)) && ($photo_timestamp > $contact['avatar_date'])) {
- logger('consume_feed: Updating photo for ' . $contact['name']);
- require_once("Photo.php");
- $photo_failure = false;
- $have_photo = false;
-
- $r = q("SELECT `resource_id` FROM `photo` WHERE `contact-id` = %d AND `uid` = %d LIMIT 1",
- intval($contact['id']),
- intval($contact['uid'])
- );
- if(count($r)) {
- $resource_id = $r[0]['resource_id'];
- $have_photo = true;
- }
- else {
- $resource_id = photo_new_resource();
- }
-
- $img_str = fetch_url($photo_url,true);
- // guess mimetype from headers or filename
- $type = guess_image_type($photo_url,true);
-
-
- $img = new Photo($img_str, $type);
- if($img->is_valid()) {
- if($have_photo) {
- q("DELETE FROM `photo` WHERE `resource_id` = '%s' AND `contact-id` = %d AND `uid` = %d",
- dbesc($resource_id),
- intval($contact['id']),
- intval($contact['uid'])
- );
- }
-
- $img->scaleImageSquare(175);
-
- $hash = $resource_id;
- $r = $img->store(0, $contact['uid'], $contact['id'], $hash, basename($photo_url), 'Contact Photos', 4);
-
- $img->scaleImage(80);
- $r = $img->store(0, $contact['uid'], $contact['id'], $hash, basename($photo_url), 'Contact Photos', 5);
-
- $img->scaleImage(48);
- $r = $img->store(0, $contact['uid'], $contact['id'], $hash, basename($photo_url), 'Contact Photos', 6);
-
- $a = get_app();
-
- q("UPDATE `contact` SET `avatar_date` = '%s', `photo` = '%s', `thumb` = '%s', `micro` = '%s'
- WHERE `uid` = %d AND `id` = %d LIMIT 1",
- dbesc(datetime_convert()),
- dbesc($a->get_baseurl() . '/photo/' . $hash . '-4.'.$img->getExt()),
- dbesc($a->get_baseurl() . '/photo/' . $hash . '-5.'.$img->getExt()),
- dbesc($a->get_baseurl() . '/photo/' . $hash . '-6.'.$img->getExt()),
- intval($contact['uid']),
- intval($contact['id'])
- );
- }
- }
-
- if((is_array($contact)) && ($name_updated) && (strlen($new_name)) && ($name_updated > $contact['name_date'])) {
- $r = q("select * from contact where uid = %d and id = %d limit 1",
- intval($contact['uid']),
- intval($contact['id'])
- );
-
- $x = q("UPDATE `contact` SET `name` = '%s', `name_date` = '%s' WHERE `uid` = %d AND `id` = %d LIMIT 1",
- dbesc(notags(trim($new_name))),
- dbesc(datetime_convert()),
- intval($contact['uid']),
- intval($contact['id'])
- );
-
- // do our best to update the name on content items
-
- if(count($r)) {
- q("update item set `author-name` = '%s' where `author-name` = '%s' and `author-link` = '%s' and uid = %d",
- dbesc(notags(trim($new_name))),
- dbesc($r[0]['name']),
- dbesc($r[0]['url']),
- intval($contact['uid'])
- );
- }
- }
-
- if(strlen($birthday)) {
- if(substr($birthday,0,4) != $contact['bdyear']) {
- logger('consume_feed: updating birthday: ' . $birthday);
-
- /**
- *
- * Add new birthday event for this person
- *
- * $bdtext is just a readable placeholder in case the event is shared
- * with others. We will replace it during presentation to our $importer
- * to contain a sparkle link and perhaps a photo.
- *
- */
-
- $bdtext = sprintf( t('%s\'s birthday'), $contact['name']);
- $bdtext2 = sprintf( t('Happy Birthday %s'), ' [url=' . $contact['url'] . ']' . $contact['name'] . '[/url]' ) ;
-
-
- $r = q("INSERT INTO `event` (`uid`,`cid`,`created`,`edited`,`start`,`finish`,`summary`,`desc`,`type`)
- VALUES ( %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s' ) ",
- intval($contact['uid']),
- intval($contact['id']),
- dbesc(datetime_convert()),
- dbesc(datetime_convert()),
- dbesc(datetime_convert('UTC','UTC', $birthday)),
- dbesc(datetime_convert('UTC','UTC', $birthday . ' + 1 day ')),
- dbesc($bdtext),
- dbesc($bdtext2),
- dbesc('birthday')
- );
-
-
- // update bdyear
-
- q("UPDATE `contact` SET `bdyear` = '%s' WHERE `uid` = %d AND `id` = %d LIMIT 1",
- dbesc(substr($birthday,0,4)),
- intval($contact['uid']),
- intval($contact['id'])
- );
-
- // This function is called twice without reloading the contact
- // Make sure we only create one event. This is why &$contact
- // is a reference var in this function
-
- $contact['bdyear'] = substr($birthday,0,4);
- }
-
- }
-
- $community_page = 0;
- $rawtags = $feed->get_feed_tags( NAMESPACE_DFRN, 'community');
- if($rawtags) {
- $community_page = intval($rawtags[0]['data']);
- }
- if(is_array($contact) && intval($contact['forum']) != $community_page) {
- q("update contact set forum = %d where id = %d limit 1",
- intval($community_page),
- intval($contact['id'])
- );
- $contact['forum'] = (string) $community_page;
- }
-
// process any deleted entries
@@ -2328,7 +2672,7 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $pass = 0)
foreach($del_entries as $dentry) {
$deleted = false;
if(isset($dentry['attribs']['']['ref'])) {
- $uri = $dentry['attribs']['']['ref'];
+ $mid = $dentry['attribs']['']['ref'];
$deleted = true;
if(isset($dentry['attribs']['']['when'])) {
$when = $dentry['attribs']['']['when'];
@@ -2338,71 +2682,39 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $pass = 0)
$when = datetime_convert('UTC','UTC','now','Y-m-d H:i:s');
}
if($deleted && is_array($contact)) {
- $r = q("SELECT `item`.*, `contact`.`self` FROM `item` left join `contact` on `item`.`contact-id` = `contact`.`id`
- WHERE `uri` = '%s' AND `item`.`uid` = %d AND `contact-id` = %d AND NOT `item`.`file` LIKE '%%[%%' LIMIT 1",
- dbesc($uri),
- intval($importer['uid']),
+/* $r = q("SELECT `item`.*, `contact`.`self` FROM `item` left join `contact` on `item`.`contact-id` = `contact`.`id`
+ WHERE `mid` = '%s' AND `item`.`uid` = %d AND `contact-id` = %d AND NOT `item`.`file` LIKE '%%[%%' LIMIT 1",
+ dbesc($mid),
+ intval($importer['channel_id']),
intval($contact['id'])
);
+*/
if(count($r)) {
$item = $r[0];
if(! $item['deleted'])
- logger('consume_feed: deleting item ' . $item['id'] . ' uri=' . $item['uri'], LOGGER_DEBUG);
-
- if(($item['verb'] === ACTIVITY_TAG) && ($item['obj_type'] === ACTIVITY_OBJ_TAGTERM)) {
- $xo = parse_xml_string($item['object'],false);
- $xt = parse_xml_string($item['target'],false);
- if($xt->type === ACTIVITY_OBJ_NOTE) {
- $i = q("select * from `item` where uri = '%s' and uid = %d limit 1",
- dbesc($xt->id),
- intval($importer['importer_uid'])
- );
- if(count($i)) {
-
- // For tags, the owner cannot remove the tag on the author's copy of the post.
-
- $owner_remove = (($item['contact-id'] == $i[0]['contact-id']) ? true: false);
- $author_remove = (($item['origin'] && $item['self']) ? true : false);
- $author_copy = (($item['origin']) ? true : false);
-
- if($owner_remove && $author_copy)
- continue;
- if($author_remove || $owner_remove) {
- $tags = explode(',',$i[0]['tag']);
- $newtags = array();
- if(count($tags)) {
- foreach($tags as $tag)
- if(trim($tag) !== trim($xo->body))
- $newtags[] = trim($tag);
- }
- q("update item set tag = '%s' where id = %d limit 1",
- dbesc(implode(',',$newtags)),
- intval($i[0]['id'])
- );
- }
- }
- }
- }
+ logger('consume_feed: deleting item ' . $item['id'] . ' mid=' . $item['mid'], LOGGER_DEBUG);
- if($item['uri'] == $item['parent_uri']) {
- $r = q("UPDATE `item` SET `deleted` = 1, `edited` = '%s', `changed` = '%s',
+ if($item['mid'] == $item['parent_mid']) {
+ $r = q("UPDATE `item` SET item_restrict = (item_restrict | %d), `edited` = '%s', `changed` = '%s',
`body` = '', `title` = ''
- WHERE `parent_uri` = '%s' AND `uid` = %d",
+ WHERE `parent_mid` = '%s' AND `uid` = %d",
+ intval(ITEM_DELETED),
dbesc($when),
dbesc(datetime_convert()),
- dbesc($item['uri']),
- intval($importer['uid'])
+ dbesc($item['mid']),
+ intval($importer['channel_id'])
);
}
else {
- $r = q("UPDATE `item` SET `deleted` = 1, `edited` = '%s', `changed` = '%s',
+ $r = q("UPDATE `item` SET item_restrict = ( item_restrict | %d ), `edited` = '%s', `changed` = '%s',
`body` = '', `title` = ''
- WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
+ WHERE `mid` = '%s' AND `uid` = %d LIMIT 1",
+ intval(ITEM_DELETED),
dbesc($when),
dbesc(datetime_convert()),
- dbesc($uri),
- intval($importer['uid'])
+ dbesc($mid),
+ intval($importer['channel_id'])
);
}
}
@@ -2427,22 +2739,20 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $pass = 0)
$is_reply = false;
$item_id = $item->get_id();
+
+logger('consume_feed: processing ' . $item_id);
+
$rawthread = $item->get_item_tags( NAMESPACE_THREAD,'in-reply-to');
if(isset($rawthread[0]['attribs']['']['ref'])) {
$is_reply = true;
- $parent_uri = $rawthread[0]['attribs']['']['ref'];
+ $parent_mid = $rawthread[0]['attribs']['']['ref'];
}
- if(($is_reply) && is_array($contact)) {
+ if($is_reply) {
if($pass == 1)
continue;
- // not allowed to post
-
- if($contact['rel'] == CONTACT_IS_FOLLOWER)
- continue;
-
// Have we seen it? If not, import it.
@@ -2462,26 +2772,26 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $pass = 0)
}
- $r = q("SELECT `uid`, `edited`, `body` FROM `item` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
+ $r = q("SELECT `uid`, `edited`, `body` FROM `item` WHERE `mid` = '%s' AND `uid` = %d LIMIT 1",
dbesc($item_id),
- intval($importer['uid'])
+ intval($importer['channel_id'])
);
// Update content if 'updated' changes
- if(count($r)) {
+ if($r) {
if((x($datarray,'edited') !== false) && (datetime_convert('UTC','UTC',$datarray['edited']) !== $r[0]['edited'])) {
// do not accept (ignore) an earlier edit than one we currently have.
if(datetime_convert('UTC','UTC',$datarray['edited']) < $r[0]['edited'])
continue;
- $r = q("UPDATE `item` SET `title` = '%s', `body` = '%s', `edited` = '%s' WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
+ $r = q("UPDATE `item` SET `title` = '%s', `body` = '%s', `edited` = '%s' WHERE `mid` = '%s' AND `uid` = %d LIMIT 1",
dbesc($datarray['title']),
dbesc($datarray['body']),
dbesc(datetime_convert('UTC','UTC',$datarray['edited'])),
dbesc($item_id),
- intval($importer['uid'])
+ intval($importer['channel_id'])
);
}
@@ -2489,19 +2799,19 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $pass = 0)
}
- $datarray['parent_uri'] = $parent_uri;
- $datarray['uid'] = $importer['uid'];
+ $datarray['parent_mid'] = $parent_mid;
+ $datarray['uid'] = $importer['channel_id'];
$datarray['contact-id'] = $contact['id'];
if((activity_match($datarray['verb'],ACTIVITY_LIKE)) || (activity_match($datarray['verb'],ACTIVITY_DISLIKE))) {
$datarray['type'] = 'activity';
$datarray['gravity'] = GRAVITY_LIKE;
// only one like or dislike per person
- $r = q("select id from item where uid = %d and `contact-id` = %d and verb ='%s' and deleted = 0 and (`parent_uri` = '%s' OR `thr_parent` = '%s') limit 1",
+ $r = q("select id from item where uid = %d and `contact-id` = %d and verb ='%s' and deleted = 0 and (`parent_mid` = '%s' OR `thr_parent` = '%s') limit 1",
intval($datarray['uid']),
intval($datarray['contact-id']),
dbesc($datarray['verb']),
- dbesc($parent_uri),
- dbesc($parent_uri)
+ dbesc($parent_mid),
+ dbesc($parent_mid)
);
if($r && count($r))
continue;
@@ -2512,16 +2822,16 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $pass = 0)
$xt = parse_xml_string($datarray['target'],false);
if($xt->type == ACTIVITY_OBJ_NOTE) {
- $r = q("select * from item where `uri` = '%s' AND `uid` = %d limit 1",
+ $r = q("select * from item where `mid` = '%s' AND `uid` = %d limit 1",
dbesc($xt->id),
- intval($importer['importer_uid'])
+ intval($importer['channel_id'])
);
if(! count($r))
continue;
// extract tag, if not duplicate, add to parent item
if($xo->id && $xo->content) {
- $newtag = '#[url=' . $xo->id . ']'. $xo->content . '[/url]';
+ $newtag = '#[zrl=' . $xo->id . ']'. $xo->content . '[/zrl]';
if(! (stristr($r[0]['tag'],$newtag))) {
q("UPDATE item SET tag = '%s' WHERE id = %d LIMIT 1",
dbesc($r[0]['tag'] . (strlen($r[0]['tag']) ? ',' : '') . $newtag),
@@ -2532,7 +2842,10 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $pass = 0)
}
}
- $r = item_store($datarray,$force_parent);
+logger('consume_feed: ' . print_r($datarray,true));
+
+// $xx = item_store($datarray);
+ $r = $xx['item_id'];
continue;
}
@@ -2563,44 +2876,44 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $pass = 0)
if((x($datarray,'obj_type')) && ($datarray['obj_type'] === ACTIVITY_OBJ_EVENT)) {
$ev = bbtoevent($datarray['body']);
if(x($ev,'desc') && x($ev,'start')) {
- $ev['uid'] = $importer['uid'];
- $ev['uri'] = $item_id;
+ $ev['uid'] = $importer['channel_id'];
+ $ev['mid'] = $item_id;
$ev['edited'] = $datarray['edited'];
$ev['private'] = $datarray['private'];
if(is_array($contact))
$ev['cid'] = $contact['id'];
- $r = q("SELECT * FROM `event` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
+ $r = q("SELECT * FROM `event` WHERE `mid` = '%s' AND `uid` = %d LIMIT 1",
dbesc($item_id),
- intval($importer['uid'])
+ intval($importer['channel_id'])
);
if(count($r))
$ev['id'] = $r[0]['id'];
- $xyz = event_store($ev);
+// $xyz = event_store($ev);
continue;
}
}
- $r = q("SELECT `uid`, `edited`, `body` FROM `item` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
+ $r = q("SELECT `uid`, `edited`, `body` FROM `item` WHERE `mid` = '%s' AND `uid` = %d LIMIT 1",
dbesc($item_id),
- intval($importer['uid'])
+ intval($importer['channel_id'])
);
// Update content if 'updated' changes
- if(count($r)) {
+ if($r) {
if((x($datarray,'edited') !== false) && (datetime_convert('UTC','UTC',$datarray['edited']) !== $r[0]['edited'])) {
// do not accept (ignore) an earlier edit than one we currently have.
if(datetime_convert('UTC','UTC',$datarray['edited']) < $r[0]['edited'])
continue;
- $r = q("UPDATE `item` SET `title` = '%s', `body` = '%s', `edited` = '%s' WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
+ $r = q("UPDATE `item` SET `title` = '%s', `body` = '%s', `edited` = '%s' WHERE `mid` = '%s' AND `uid` = %d LIMIT 1",
dbesc($datarray['title']),
dbesc($datarray['body']),
dbesc(datetime_convert('UTC','UTC',$datarray['edited'])),
dbesc($item_id),
- intval($importer['uid'])
+ intval($importer['channel_id'])
);
}
@@ -2628,8 +2941,8 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $pass = 0)
}
- if(! is_array($contact))
- return;
+// if(! is_array($contact))
+// return;
// This is my contact on another system, but it's really me.
@@ -2639,8 +2952,8 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $pass = 0)
$datarray['wall'] = 1;
}
- $datarray['parent_uri'] = $item_id;
- $datarray['uid'] = $importer['uid'];
+ $datarray['parent_mid'] = $item_id;
+ $datarray['uid'] = $importer['channel_id'];
$datarray['contact-id'] = $contact['id'];
if(! link_compare($datarray['owner-link'],$contact['url'])) {
@@ -2658,1129 +2971,25 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $pass = 0)
// posting an @-tag delivery, which followers are allowed to do for certain
// page types. Now that we've parsed the post, let's check if it is legit. Otherwise ignore it.
- if(($contact['rel'] == CONTACT_IS_FOLLOWER) && (! tgroup_check($importer['uid'],$datarray)))
+ if(($contact['rel'] == CONTACT_IS_FOLLOWER) && (! tgroup_check($importer['channel_id'],$datarray)))
continue;
+logger('consume_feed: ' . print_r($datarray,true));
- $r = item_store($datarray);
+// $xx = item_store($datarray);
+ $r = $xx['item_id'];
continue;
}
}
}
-}
-
-function local_delivery($importer,$data) {
-
- $a = get_app();
-
- if($importer['readonly']) {
- // We aren't receiving stuff from this person. But we will quietly ignore them
- // rather than a blatant "go away" message.
- logger('local_delivery: ignoring');
- return 0;
- //NOTREACHED
- }
-
- // Consume notification feed. This may differ from consuming a public feed in several ways
- // - might contain email or friend suggestions
- // - might contain remote followup to our message
- // - in which case we need to accept it and then notify other conversants
- // - we may need to send various email notifications
-
- $feed = new SimplePie();
- $feed->set_raw_data($data);
- $feed->enable_order_by_date(false);
- $feed->init();
-
-
- if($feed->error())
- logger('local_delivery: Error parsing XML: ' . $feed->error());
-
-
- // Check at the feed level for updated contact name and/or photo
-
- $name_updated = '';
- $new_name = '';
- $photo_timestamp = '';
- $photo_url = '';
-
-
- $rawtags = $feed->get_feed_tags( NAMESPACE_DFRN, 'owner');
- if(! $rawtags)
- $rawtags = $feed->get_feed_tags( SIMPLEPIE_NAMESPACE_ATOM_10, 'author');
- if($rawtags) {
- $elems = $rawtags[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10];
- if($elems['name'][0]['attribs'][NAMESPACE_DFRN]['updated']) {
- $name_updated = $elems['name'][0]['attribs'][NAMESPACE_DFRN]['updated'];
- $new_name = $elems['name'][0]['data'];
- }
- if((x($elems,'link')) && ($elems['link'][0]['attribs']['']['rel'] === 'photo') && ($elems['link'][0]['attribs'][NAMESPACE_DFRN]['updated'])) {
- $photo_timestamp = datetime_convert('UTC','UTC',$elems['link'][0]['attribs'][NAMESPACE_DFRN]['updated']);
- $photo_url = $elems['link'][0]['attribs']['']['href'];
- }
- }
-
- if(($photo_timestamp) && (strlen($photo_url)) && ($photo_timestamp > $importer['avatar_date'])) {
- logger('local_delivery: Updating photo for ' . $importer['name']);
- require_once("Photo.php");
- $photo_failure = false;
- $have_photo = false;
-
- $r = q("SELECT `resource_id` FROM `photo` WHERE `contact-id` = %d AND `uid` = %d LIMIT 1",
- intval($importer['id']),
- intval($importer['importer_uid'])
- );
- if(count($r)) {
- $resource_id = $r[0]['resource_id'];
- $have_photo = true;
- }
- else {
- $resource_id = photo_new_resource();
- }
-
- $img_str = fetch_url($photo_url,true);
- // guess mimetype from headers or filename
- $type = guess_image_type($photo_url,true);
-
-
- $img = new Photo($img_str, $type);
- if($img->is_valid()) {
- if($have_photo) {
- q("DELETE FROM `photo` WHERE `resource_id` = '%s' AND `contact-id` = %d AND `uid` = %d",
- dbesc($resource_id),
- intval($importer['id']),
- intval($importer['importer_uid'])
- );
- }
-
- $img->scaleImageSquare(175);
-
- $hash = $resource_id;
- $r = $img->store($importer['importer_uid'], $importer['id'], $hash, basename($photo_url), 'Contact Photos', 4);
-
- $img->scaleImage(80);
- $r = $img->store($importer['importer_uid'], $importer['id'], $hash, basename($photo_url), 'Contact Photos', 5);
-
- $img->scaleImage(48);
- $r = $img->store($importer['importer_uid'], $importer['id'], $hash, basename($photo_url), 'Contact Photos', 6);
-
- $a = get_app();
-
- q("UPDATE `contact` SET `avatar_date` = '%s', `photo` = '%s', `thumb` = '%s', `micro` = '%s'
- WHERE `uid` = %d AND `id` = %d LIMIT 1",
- dbesc(datetime_convert()),
- dbesc($a->get_baseurl() . '/photo/' . $hash . '-4.'.$img->getExt()),
- dbesc($a->get_baseurl() . '/photo/' . $hash . '-5.'.$img->getExt()),
- dbesc($a->get_baseurl() . '/photo/' . $hash . '-6.'.$img->getExt()),
- intval($importer['importer_uid']),
- intval($importer['id'])
- );
- }
- }
-
- if(($name_updated) && (strlen($new_name)) && ($name_updated > $importer['name_date'])) {
- $r = q("select * from contact where uid = %d and id = %d limit 1",
- intval($importer['importer_uid']),
- intval($importer['id'])
- );
-
- $x = q("UPDATE `contact` SET `name` = '%s', `name_date` = '%s' WHERE `uid` = %d AND `id` = %d LIMIT 1",
- dbesc(notags(trim($new_name))),
- dbesc(datetime_convert()),
- intval($importer['importer_uid']),
- intval($importer['id'])
- );
-
- // do our best to update the name on content items
-
- if(count($r)) {
- q("update item set `author-name` = '%s' where `author-name` = '%s' and `author-link` = '%s' and uid = %d",
- dbesc(notags(trim($new_name))),
- dbesc($r[0]['name']),
- dbesc($r[0]['url']),
- intval($importer['importer_uid'])
- );
- }
- }
-
-
-/*
- // Currently unsupported - needs a lot of work
- $reloc = $feed->get_feed_tags( NAMESPACE_DFRN, 'relocate' );
- if(isset($reloc[0]['child'][NAMESPACE_DFRN])) {
- $base = $reloc[0]['child'][NAMESPACE_DFRN];
- $newloc = array();
- $newloc['uid'] = $importer['importer_uid'];
- $newloc['cid'] = $importer['id'];
- $newloc['name'] = notags(unxmlify($base['name'][0]['data']));
- $newloc['photo'] = notags(unxmlify($base['photo'][0]['data']));
- $newloc['url'] = notags(unxmlify($base['url'][0]['data']));
- $newloc['request'] = notags(unxmlify($base['request'][0]['data']));
- $newloc['confirm'] = notags(unxmlify($base['confirm'][0]['data']));
- $newloc['notify'] = notags(unxmlify($base['notify'][0]['data']));
- $newloc['poll'] = notags(unxmlify($base['poll'][0]['data']));
- $newloc['site_pubkey'] = notags(unxmlify($base['site_pubkey'][0]['data']));
- $newloc['pubkey'] = notags(unxmlify($base['pubkey'][0]['data']));
- $newloc['prvkey'] = notags(unxmlify($base['prvkey'][0]['data']));
-
- // TODO
- // merge with current record, current contents have priority
- // update record, set url-updated
- // update profile photos
- // schedule a scan?
-
- }
-*/
-
- // handle friend suggestion notification
-
- $sugg = $feed->get_feed_tags( NAMESPACE_DFRN, 'suggest' );
- if(isset($sugg[0]['child'][NAMESPACE_DFRN])) {
- $base = $sugg[0]['child'][NAMESPACE_DFRN];
- $fsugg = array();
- $fsugg['uid'] = $importer['importer_uid'];
- $fsugg['cid'] = $importer['id'];
- $fsugg['name'] = notags(unxmlify($base['name'][0]['data']));
- $fsugg['photo'] = notags(unxmlify($base['photo'][0]['data']));
- $fsugg['url'] = notags(unxmlify($base['url'][0]['data']));
- $fsugg['request'] = notags(unxmlify($base['request'][0]['data']));
- $fsugg['body'] = escape_tags(unxmlify($base['note'][0]['data']));
-
- // Does our member already have a friend matching this description?
-
- $r = q("SELECT * FROM `contact` WHERE `name` = '%s' AND `nurl` = '%s' AND `uid` = %d LIMIT 1",
- dbesc($fsugg['name']),
- dbesc(normalise_link($fsugg['url'])),
- intval($fsugg['uid'])
- );
- if(count($r))
- return 0;
-
- // Do we already have an fcontact record for this person?
-
- $fid = 0;
- $r = q("SELECT * FROM `fcontact` WHERE `url` = '%s' AND `name` = '%s' AND `request` = '%s' LIMIT 1",
- dbesc($fsugg['url']),
- dbesc($fsugg['name']),
- dbesc($fsugg['request'])
- );
- if(count($r)) {
- $fid = $r[0]['id'];
-
- // OK, we do. Do we already have an introduction for this person ?
- $r = q("select id from intro where uid = %d and fid = %d limit 1",
- intval($fsugg['uid']),
- intval($fid)
- );
- if(count($r))
- return 0;
- }
- if(! $fid)
- $r = q("INSERT INTO `fcontact` ( `name`,`url`,`photo`,`request` ) VALUES ( '%s', '%s', '%s', '%s' ) ",
- dbesc($fsugg['name']),
- dbesc($fsugg['url']),
- dbesc($fsugg['photo']),
- dbesc($fsugg['request'])
- );
- $r = q("SELECT * FROM `fcontact` WHERE `url` = '%s' AND `name` = '%s' AND `request` = '%s' LIMIT 1",
- dbesc($fsugg['url']),
- dbesc($fsugg['name']),
- dbesc($fsugg['request'])
- );
- if(count($r)) {
- $fid = $r[0]['id'];
- }
- // database record did not get created. Quietly give up.
- else
- return 0;
-
-
- $hash = random_string();
-
- $r = q("INSERT INTO `intro` ( `uid`, `fid`, `contact-id`, `note`, `hash`, `datetime`, `blocked` )
- VALUES( %d, %d, %d, '%s', '%s', '%s', %d )",
- intval($fsugg['uid']),
- intval($fid),
- intval($fsugg['cid']),
- dbesc($fsugg['body']),
- dbesc($hash),
- dbesc(datetime_convert()),
- intval(0)
- );
-
- notification(array(
- 'type' => NOTIFY_SUGGEST,
- 'notify_flags' => $importer['notify-flags'],
- 'language' => $importer['language'],
- 'to_name' => $importer['username'],
- 'to_email' => $importer['email'],
- 'uid' => $importer['importer_uid'],
- 'item' => $fsugg,
- 'link' => $a->get_baseurl() . '/notifications/intros',
- 'source_name' => $importer['name'],
- 'source_link' => $importer['url'],
- 'source_photo' => $importer['photo'],
- 'verb' => ACTIVITY_REQ_FRIEND,
- 'otype' => 'intro'
- ));
-
- return 0;
- }
-
- $ismail = false;
-
- $rawmail = $feed->get_feed_tags( NAMESPACE_DFRN, 'mail' );
- if(isset($rawmail[0]['child'][NAMESPACE_DFRN])) {
-
- logger('local_delivery: private message received');
-
- $ismail = true;
- $base = $rawmail[0]['child'][NAMESPACE_DFRN];
-
- $msg = array();
- $msg['uid'] = $importer['importer_uid'];
- $msg['from-name'] = notags(unxmlify($base['sender'][0]['child'][NAMESPACE_DFRN]['name'][0]['data']));
- $msg['from-photo'] = notags(unxmlify($base['sender'][0]['child'][NAMESPACE_DFRN]['avatar'][0]['data']));
- $msg['from-url'] = notags(unxmlify($base['sender'][0]['child'][NAMESPACE_DFRN]['uri'][0]['data']));
- $msg['contact-id'] = $importer['id'];
- $msg['title'] = notags(unxmlify($base['subject'][0]['data']));
- $msg['body'] = escape_tags(unxmlify($base['content'][0]['data']));
- $msg['seen'] = 0;
- $msg['replied'] = 0;
- $msg['uri'] = notags(unxmlify($base['id'][0]['data']));
- $msg['parent_uri'] = notags(unxmlify($base['in-reply-to'][0]['data']));
- $msg['created'] = datetime_convert(notags(unxmlify('UTC','UTC',$base['sentdate'][0]['data'])));
-
- dbesc_array($msg);
-
- $r = dbq("INSERT INTO `mail` (`" . implode("`, `", array_keys($msg))
- . "`) VALUES ('" . implode("', '", array_values($msg)) . "')" );
-
- // send notifications.
-
- require_once('include/enotify.php');
-
- $notif_params = array(
- 'type' => NOTIFY_MAIL,
- 'notify_flags' => $importer['notify-flags'],
- 'language' => $importer['language'],
- 'to_name' => $importer['username'],
- 'to_email' => $importer['email'],
- 'uid' => $importer['importer_uid'],
- 'item' => $msg,
- 'source_name' => $msg['from-name'],
- 'source_link' => $importer['url'],
- 'source_photo' => $importer['thumb'],
- 'verb' => ACTIVITY_POST,
- 'otype' => 'mail'
- );
-
- notification($notif_params);
- return 0;
-
- // NOTREACHED
- }
-
- $community_page = 0;
- $rawtags = $feed->get_feed_tags( NAMESPACE_DFRN, 'community');
- if($rawtags) {
- $community_page = intval($rawtags[0]['data']);
- }
- if(intval($importer['forum']) != $community_page) {
- q("update contact set forum = %d where id = %d limit 1",
- intval($community_page),
- intval($importer['id'])
- );
- $importer['forum'] = (string) $community_page;
- }
-
- logger('local_delivery: feed item count = ' . $feed->get_item_quantity());
-
- // process any deleted entries
-
- $del_entries = $feed->get_feed_tags(NAMESPACE_TOMB, 'deleted-entry');
- if(is_array($del_entries) && count($del_entries)) {
- foreach($del_entries as $dentry) {
- $deleted = false;
- if(isset($dentry['attribs']['']['ref'])) {
- $uri = $dentry['attribs']['']['ref'];
- $deleted = true;
- if(isset($dentry['attribs']['']['when'])) {
- $when = $dentry['attribs']['']['when'];
- $when = datetime_convert('UTC','UTC', $when, 'Y-m-d H:i:s');
- }
- else
- $when = datetime_convert('UTC','UTC','now','Y-m-d H:i:s');
- }
- if($deleted) {
-
- // check for relayed deletes to our conversation
-
- $is_reply = false;
- $r = q("select * from item where uri = '%s' and uid = %d limit 1",
- dbesc($uri),
- intval($importer['importer_uid'])
- );
- if(count($r)) {
- $parent_uri = $r[0]['parent_uri'];
- if($r[0]['id'] != $r[0]['parent'])
- $is_reply = true;
- }
-
- if($is_reply) {
- $community = false;
-
- if($importer['page-flags'] == PAGE_COMMUNITY || $importer['page-flags'] == PAGE_PRVGROUP ) {
- $sql_extra = '';
- $community = true;
- logger('local_delivery: possible community delete');
- }
- else
- $sql_extra = " and contact.self = 1 and item.wall = 1 ";
-
- // was the top-level post for this reply written by somebody on this site?
- // Specifically, the recipient?
-
- $is_a_remote_delete = false;
-
- $r = q("select `item`.`id`, `item`.`uri`, `item`.`forum_mode`,`item`.`origin`,`item`.`wall`,
- `contact`.`name`, `contact`.`url`, `contact`.`thumb` from `item`
- LEFT JOIN `contact` ON `contact`.`id` = `item`.`contact-id`
- WHERE `item`.`uri` = '%s' AND (`item`.`parent_uri` = '%s' or `item`.`thr_parent` = '%s')
- AND `item`.`uid` = %d
- $sql_extra
- LIMIT 1",
- dbesc($parent_uri),
- dbesc($parent_uri),
- dbesc($parent_uri),
- intval($importer['importer_uid'])
- );
- if($r && count($r))
- $is_a_remote_delete = true;
-
- // Does this have the characteristics of a community or private group comment?
- // If it's a reply to a wall post on a community/prvgroup page it's a
- // valid community comment. Also forum_mode makes it valid for sure.
- // If neither, it's not.
-
- if($is_a_remote_delete && $community) {
- if((! $r[0]['forum_mode']) && (! $r[0]['wall'])) {
- $is_a_remote_delete = false;
- logger('local_delivery: not a community delete');
- }
- }
-
- if($is_a_remote_delete) {
- logger('local_delivery: received remote delete');
- }
- }
-
- $r = q("SELECT `item`.*, `contact`.`self` FROM `item` left join contact on `item`.`contact-id` = `contact`.`id`
- WHERE `uri` = '%s' AND `item`.`uid` = %d AND `contact-id` = %d AND NOT `item`.`file` LIKE '%%[%%' LIMIT 1",
- dbesc($uri),
- intval($importer['importer_uid']),
- intval($importer['id'])
- );
-
- if(count($r)) {
- $item = $r[0];
-
- if($item['deleted'])
- continue;
-
- logger('local_delivery: deleting item ' . $item['id'] . ' uri=' . $item['uri'], LOGGER_DEBUG);
-
- if(($item['verb'] === ACTIVITY_TAG) && ($item['obj_type'] === ACTIVITY_OBJ_TAGTERM)) {
- $xo = parse_xml_string($item['object'],false);
- $xt = parse_xml_string($item['target'],false);
-
- if($xt->type === ACTIVITY_OBJ_NOTE) {
- $i = q("select * from `item` where uri = '%s' and uid = %d limit 1",
- dbesc($xt->id),
- intval($importer['importer_uid'])
- );
- if(count($i)) {
-
- // For tags, the owner cannot remove the tag on the author's copy of the post.
-
- $owner_remove = (($item['contact-id'] == $i[0]['contact-id']) ? true: false);
- $author_remove = (($item['origin'] && $item['self']) ? true : false);
- $author_copy = (($item['origin']) ? true : false);
-
- if($owner_remove && $author_copy)
- continue;
- if($author_remove || $owner_remove) {
-//FIXME
- $tags = explode(',',$i[0]['tag']);
- $newtags = array();
- if(count($tags)) {
- foreach($tags as $tag)
- if(trim($tag) !== trim($xo->body))
- $newtags[] = trim($tag);
- }
- q("update item set tag = '%s' where id = %d limit 1",
- dbesc(implode(',',$newtags)),
- intval($i[0]['id'])
- );
- }
- }
- }
- }
-
- if($item['uri'] == $item['parent_uri']) {
- $r = q("UPDATE `item` SET `deleted` = 1, `edited` = '%s', `changed` = '%s',
- `body` = '', `title` = ''
- WHERE `parent_uri` = '%s' AND `uid` = %d",
- dbesc($when),
- dbesc(datetime_convert()),
- dbesc($item['uri']),
- intval($importer['importer_uid'])
- );
- }
- else {
- $r = q("UPDATE `item` SET `deleted` = 1, `edited` = '%s', `changed` = '%s',
- `body` = '', `title` = ''
- WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
- dbesc($when),
- dbesc(datetime_convert()),
- dbesc($uri),
- intval($importer['importer_uid'])
- );
-
- // if this is a relayed delete, propagate it to other recipients
-
- if($is_a_remote_delete)
- proc_run('php',"include/notifier.php","drop",$item['id']);
- }
- }
- }
- }
- }
- foreach($feed->get_items() as $item) {
-
- $is_reply = false;
- $item_id = $item->get_id();
- $rawthread = $item->get_item_tags( NAMESPACE_THREAD, 'in-reply-to');
- if(isset($rawthread[0]['attribs']['']['ref'])) {
- $is_reply = true;
- $parent_uri = $rawthread[0]['attribs']['']['ref'];
- }
-
- if($is_reply) {
- $community = false;
-
- if($importer['page-flags'] == PAGE_COMMUNITY || $importer['page-flags'] == PAGE_PRVGROUP ) {
- $sql_extra = '';
- $community = true;
- logger('local_delivery: possible community reply');
- }
- else
- $sql_extra = " and contact.self = 1 and item.wall = 1 ";
-
- // was the top-level post for this reply written by somebody on this site?
- // Specifically, the recipient?
-
- $is_a_remote_comment = false;
-
- // POSSIBLE CLEANUP --> Why select so many fields when only forum_mode and wall are used?
- $r = q("select `item`.`id`, `item`.`uri`, `item`.`forum_mode`,`item`.`origin`,`item`.`wall`,
- `contact`.`name`, `contact`.`url`, `contact`.`thumb` from `item`
- LEFT JOIN `contact` ON `contact`.`id` = `item`.`contact-id`
- WHERE `item`.`uri` = '%s' AND (`item`.`parent_uri` = '%s' or `item`.`thr_parent` = '%s')
- AND `item`.`uid` = %d
- $sql_extra
- LIMIT 1",
- dbesc($parent_uri),
- dbesc($parent_uri),
- dbesc($parent_uri),
- intval($importer['importer_uid'])
- );
- if($r && count($r))
- $is_a_remote_comment = true;
-
- // Does this have the characteristics of a community or private group comment?
- // If it's a reply to a wall post on a community/prvgroup page it's a
- // valid community comment. Also forum_mode makes it valid for sure.
- // If neither, it's not.
-
- if($is_a_remote_comment && $community) {
- if((! $r[0]['forum_mode']) && (! $r[0]['wall'])) {
- $is_a_remote_comment = false;
- logger('local_delivery: not a community reply');
- }
- }
-
- if($is_a_remote_comment) {
- logger('local_delivery: received remote comment');
- $is_like = false;
- // remote reply to our post. Import and then notify everybody else.
-
- $datarray = get_atom_elements($feed,$item);
-
- $r = q("SELECT `id`, `uid`, `edited`, `body` FROM `item` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
- dbesc($item_id),
- intval($importer['importer_uid'])
- );
-
- // Update content if 'updated' changes
-
- if(count($r)) {
- $iid = $r[0]['id'];
- if((x($datarray,'edited') !== false) && (datetime_convert('UTC','UTC',$datarray['edited']) !== $r[0]['edited'])) {
-
- // do not accept (ignore) an earlier edit than one we currently have.
- if(datetime_convert('UTC','UTC',$datarray['edited']) < $r[0]['edited'])
- continue;
-
- logger('received updated comment' , LOGGER_DEBUG);
- $r = q("UPDATE `item` SET `title` = '%s', `body` = '%s', `edited` = '%s' WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
- dbesc($datarray['title']),
- dbesc($datarray['body']),
- dbesc(datetime_convert('UTC','UTC',$datarray['edited'])),
- dbesc($item_id),
- intval($importer['importer_uid'])
- );
-
- proc_run('php',"include/notifier.php","comment-import",$iid);
-
- }
-
- continue;
- }
-
-
-
- $own = q("select name,url,thumb from contact where uid = %d and self = 1 limit 1",
- intval($importer['importer_uid'])
- );
-
-
- $datarray['type'] = 'remote-comment';
- $datarray['wall'] = 1;
- $datarray['parent_uri'] = $parent_uri;
- $datarray['uid'] = $importer['importer_uid'];
- $datarray['owner-name'] = $own[0]['name'];
- $datarray['owner-link'] = $own[0]['url'];
- $datarray['owner-avatar'] = $own[0]['thumb'];
- $datarray['contact-id'] = $importer['id'];
-
- if(($datarray['verb'] === ACTIVITY_LIKE) || ($datarray['verb'] === ACTIVITY_DISLIKE)) {
- $is_like = true;
- $datarray['type'] = 'activity';
- $datarray['gravity'] = GRAVITY_LIKE;
-
- // only one like or dislike per person
- $r = q("select id from item where uid = %d and `contact-id` = %d and verb = '%s' and (`thr_parent` = '%s' or `parent_uri` = '%s') and deleted = 0 limit 1",
- intval($datarray['uid']),
- intval($datarray['contact-id']),
- dbesc($datarray['verb']),
- dbesc($datarray['parent_uri']),
- dbesc($datarray['parent_uri'])
-
- );
- if($r && count($r))
- continue;
- }
-
- if(($datarray['verb'] === ACTIVITY_TAG) && ($datarray['obj_type'] === ACTIVITY_OBJ_TAGTERM)) {
-
- $xo = parse_xml_string($datarray['object'],false);
- $xt = parse_xml_string($datarray['target'],false);
-
- if(($xt->type == ACTIVITY_OBJ_NOTE) && ($xt->id)) {
-
- // fetch the parent item
-
- $tagp = q("select * from item where uri = '%s' and uid = %d limit 1",
- dbesc($xt->id),
- intval($importer['importer_uid'])
- );
- if(! count($tagp))
- continue;
-
- // extract tag, if not duplicate, and this user allows tags, add to parent item
-//FIXME
- if($xo->id && $xo->content) {
- $newtag = '#[url=' . $xo->id . ']'. $xo->content . '[/url]';
- if(! (stristr($tagp[0]['tag'],$newtag))) {
- $i = q("SELECT `blocktags` FROM `user` where `uid` = %d LIMIT 1",
- intval($importer['importer_uid'])
- );
- if(count($i) && ! intval($i[0]['blocktags'])) {
- q("UPDATE item SET tag = '%s', `edited` = '%s' WHERE id = %d LIMIT 1",
- dbesc($tagp[0]['tag'] . (strlen($tagp[0]['tag']) ? ',' : '') . $newtag),
- intval($tagp[0]['id']),
- dbesc(datetime_convert())
- );
- }
- }
- }
- }
- }
-
-
- $posted_id = item_store($datarray);
- $parent = 0;
-
- if($posted_id) {
- $r = q("SELECT `parent`, `parent_uri` FROM `item` WHERE `id` = %d AND `uid` = %d LIMIT 1",
- intval($posted_id),
- intval($importer['importer_uid'])
- );
- if(count($r)) {
- $parent = $r[0]['parent'];
- $parent_uri = $r[0]['parent_uri'];
- }
-
- if(! $is_like) {
- $r1 = q("UPDATE `item` SET `changed` = '%s' WHERE `uid` = %d AND `parent` = %d",
- dbesc(datetime_convert()),
- intval($importer['importer_uid']),
- intval($r[0]['parent'])
- );
-
- $r2 = q("UPDATE `item` SET `changed` = '%s' WHERE `uid` = %d AND `id` = %d LIMIT 1",
- dbesc(datetime_convert()),
- intval($importer['importer_uid']),
- intval($posted_id)
- );
- }
-
- if($posted_id && $parent) {
-
- proc_run('php',"include/notifier.php","comment-import","$posted_id");
-
- if((! $is_like) && (! $importer['self'])) {
-
- require_once('include/enotify.php');
-
- notification(array(
- 'type' => NOTIFY_COMMENT,
- 'notify_flags' => $importer['notify-flags'],
- 'language' => $importer['language'],
- 'to_name' => $importer['username'],
- 'to_email' => $importer['email'],
- 'uid' => $importer['importer_uid'],
- 'item' => $datarray,
- 'link' => $a->get_baseurl() . '/display/' . $importer['nickname'] . '/' . $posted_id,
- 'source_name' => stripslashes($datarray['author-name']),
- 'source_link' => $datarray['author-link'],
- 'source_photo' => ((link_compare($datarray['author-link'],$importer['url']))
- ? $importer['thumb'] : $datarray['author-avatar']),
- 'verb' => ACTIVITY_POST,
- 'otype' => 'item',
- 'parent' => $parent,
- 'parent_uri' => $parent_uri,
- ));
-
- }
- }
-
- return 0;
- // NOTREACHED
- }
- }
- else {
-
- // regular comment that is part of this total conversation. Have we seen it? If not, import it.
-
- $item_id = $item->get_id();
- $datarray = get_atom_elements($feed,$item);
-
- if($importer['rel'] == CONTACT_IS_FOLLOWER)
- continue;
-
-
- $r = q("SELECT `uid`, `edited`, `body` FROM `item` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
- dbesc($item_id),
- intval($importer['importer_uid'])
- );
-
- // Update content if 'updated' changes
-
- if(count($r)) {
- if((x($datarray,'edited') !== false) && (datetime_convert('UTC','UTC',$datarray['edited']) !== $r[0]['edited'])) {
-
- // do not accept (ignore) an earlier edit than one we currently have.
- if(datetime_convert('UTC','UTC',$datarray['edited']) < $r[0]['edited'])
- continue;
-
- $r = q("UPDATE `item` SET `title` = '%s', `body` = '%s', `edited` = '%s' WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
- dbesc($datarray['title']),
- dbesc($datarray['body']),
- dbesc(datetime_convert('UTC','UTC',$datarray['edited'])),
- dbesc($item_id),
- intval($importer['importer_uid'])
- );
- }
-
- continue;
- }
-
- $datarray['parent_uri'] = $parent_uri;
- $datarray['uid'] = $importer['importer_uid'];
- $datarray['contact-id'] = $importer['id'];
- if(($datarray['verb'] == ACTIVITY_LIKE) || ($datarray['verb'] == ACTIVITY_DISLIKE)) {
- $datarray['type'] = 'activity';
- $datarray['gravity'] = GRAVITY_LIKE;
- // only one like or dislike per person
- $r = q("select id from item where uid = %d and `contact-id` = %d and verb ='%s' and deleted = 0 and (`parent_uri` = '%s' OR `thr_parent` = '%s') limit 1",
- intval($datarray['uid']),
- intval($datarray['contact-id']),
- dbesc($datarray['verb']),
- dbesc($parent_uri),
- dbesc($parent_uri)
- );
- if($r && count($r))
- continue;
-
- }
-
- if(($datarray['verb'] === ACTIVITY_TAG) && ($datarray['obj_type'] === ACTIVITY_OBJ_TAGTERM)) {
-
- $xo = parse_xml_string($datarray['object'],false);
- $xt = parse_xml_string($datarray['target'],false);
-
- if($xt->type == ACTIVITY_OBJ_NOTE) {
- $r = q("select * from item where `uri` = '%s' AND `uid` = %d limit 1",
- dbesc($xt->id),
- intval($importer['importer_uid'])
- );
- if(! count($r))
- continue;
-
- // extract tag, if not duplicate, add to parent item
- if($xo->content) {
- if(! (stristr($r[0]['tag'],trim($xo->content)))) {
- q("UPDATE item SET tag = '%s' WHERE id = %d LIMIT 1",
- dbesc($r[0]['tag'] . (strlen($r[0]['tag']) ? ',' : '') . '#[url=' . $xo->id . ']'. $xo->content . '[/url]'),
- intval($r[0]['id'])
- );
- }
- }
- }
- }
-
- $posted_id = item_store($datarray);
-
- // find out if our user is involved in this conversation and wants to be notified.
-
- if(!x($datarray['type']) || $datarray['type'] != 'activity') {
-
- $myconv = q("SELECT `author-link`, `author-avatar`, `parent` FROM `item` WHERE `parent_uri` = '%s' AND `uid` = %d AND `parent` != 0 AND `deleted` = 0",
- dbesc($parent_uri),
- intval($importer['importer_uid'])
- );
-
- if(count($myconv)) {
- $importer_url = $a->get_baseurl() . '/channel/' . $importer['nickname'];
-
- // first make sure this isn't our own post coming back to us from a wall-to-wall event
- if(! link_compare($datarray['author-link'],$importer_url)) {
-
-
- foreach($myconv as $conv) {
-
- // now if we find a match, it means we're in this conversation
-
- if(! link_compare($conv['author-link'],$importer_url))
- continue;
-
- require_once('include/enotify.php');
-
- $conv_parent = $conv['parent'];
-
- notification(array(
- 'type' => NOTIFY_COMMENT,
- 'notify_flags' => $importer['notify-flags'],
- 'language' => $importer['language'],
- 'to_name' => $importer['username'],
- 'to_email' => $importer['email'],
- 'uid' => $importer['importer_uid'],
- 'item' => $datarray,
- 'link' => $a->get_baseurl() . '/display/' . $importer['nickname'] . '/' . $posted_id,
- 'source_name' => stripslashes($datarray['author-name']),
- 'source_link' => $datarray['author-link'],
- 'source_photo' => ((link_compare($datarray['author-link'],$importer['url']))
- ? $importer['thumb'] : $datarray['author-avatar']),
- 'verb' => ACTIVITY_POST,
- 'otype' => 'item',
- 'parent' => $conv_parent,
- 'parent_uri' => $parent_uri
-
- ));
-
- // only send one notification
- break;
- }
- }
- }
- }
- continue;
- }
- }
-
- else {
-
- // Head post of a conversation. Have we seen it? If not, import it.
-
-
- $item_id = $item->get_id();
- $datarray = get_atom_elements($feed,$item);
-
- if((x($datarray,'obj_type')) && ($datarray['obj_type'] === ACTIVITY_OBJ_EVENT)) {
- $ev = bbtoevent($datarray['body']);
- if(x($ev,'desc') && x($ev,'start')) {
- $ev['cid'] = $importer['id'];
- $ev['uid'] = $importer['uid'];
- $ev['uri'] = $item_id;
- $ev['edited'] = $datarray['edited'];
- $ev['private'] = $datarray['private'];
-
- $r = q("SELECT * FROM `event` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
- dbesc($item_id),
- intval($importer['uid'])
- );
- if(count($r))
- $ev['id'] = $r[0]['id'];
- $xyz = event_store($ev);
- continue;
- }
- }
-
- $r = q("SELECT `uid`, `edited`, `body` FROM `item` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
- dbesc($item_id),
- intval($importer['importer_uid'])
- );
-
- // Update content if 'updated' changes
-
- if(count($r)) {
- if((x($datarray,'edited') !== false) && (datetime_convert('UTC','UTC',$datarray['edited']) !== $r[0]['edited'])) {
-
- // do not accept (ignore) an earlier edit than one we currently have.
- if(datetime_convert('UTC','UTC',$datarray['edited']) < $r[0]['edited'])
- continue;
-
- $r = q("UPDATE `item` SET `title` = '%s', `body` = '%s', `edited` = '%s' WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
- dbesc($datarray['title']),
- dbesc($datarray['body']),
- dbesc(datetime_convert('UTC','UTC',$datarray['edited'])),
- dbesc($item_id),
- intval($importer['importer_uid'])
- );
- }
-
- continue;
- }
-
- // This is my contact on another system, but it's really me.
- // Turn this into a wall post.
-
- if($importer['remote_self'])
- $datarray['wall'] = 1;
-
- $datarray['parent_uri'] = $item_id;
- $datarray['uid'] = $importer['importer_uid'];
- $datarray['contact-id'] = $importer['id'];
-
-
- if(! link_compare($datarray['owner-link'],$importer['url'])) {
- // The item owner info is not our contact. It's OK and is to be expected if this is a tgroup delivery,
- // but otherwise there's a possible data mixup on the sender's system.
- // the tgroup delivery code called from item_store will correct it if it's a forum,
- // but we're going to unconditionally correct it here so that the post will always be owned by our contact.
- logger('local_delivery: Correcting item owner.', LOGGER_DEBUG);
- $datarray['owner-name'] = $importer['senderName'];
- $datarray['owner-link'] = $importer['url'];
- $datarray['owner-avatar'] = $importer['thumb'];
- }
-
- if(($importer['rel'] == CONTACT_IS_FOLLOWER) && (! tgroup_check($importer['importer_uid'],$datarray)))
- continue;
-
- $posted_id = item_store($datarray);
-
- if(stristr($datarray['verb'],ACTIVITY_POKE)) {
- $verb = urldecode(substr($datarray['verb'],strpos($datarray['verb'],'#')+1));
- if(! $verb)
- continue;
- $xo = parse_xml_string($datarray['object'],false);
-
- if(($xo->type == ACTIVITY_OBJ_PERSON) && ($xo->id)) {
-
- // somebody was poked/prodded. Was it me?
-
- $links = parse_xml_string("<links>".unxmlify($xo->link)."</links>",false);
-
- foreach($links->link as $l) {
- $atts = $l->attributes();
- switch($atts['rel']) {
- case "alternate":
- $Blink = $atts['href'];
- break;
- default:
- break;
- }
- }
- if($Blink && link_compare($Blink,$a->get_baseurl() . '/channel/' . $importer['nickname'])) {
-
- // send a notification
- require_once('include/enotify.php');
-
- notification(array(
- 'type' => NOTIFY_POKE,
- 'notify_flags' => $importer['notify-flags'],
- 'language' => $importer['language'],
- 'to_name' => $importer['username'],
- 'to_email' => $importer['email'],
- 'uid' => $importer['importer_uid'],
- 'item' => $datarray,
- 'link' => $a->get_baseurl() . '/display/' . $importer['nickname'] . '/' . $posted_id,
- 'source_name' => stripslashes($datarray['author-name']),
- 'source_link' => $datarray['author-link'],
- 'source_photo' => ((link_compare($datarray['author-link'],$importer['url']))
- ? $importer['thumb'] : $datarray['author-avatar']),
- 'verb' => $datarray['verb'],
- 'otype' => 'person',
- 'activity' => $verb,
-
- ));
- }
- }
- }
-
- continue;
- }
- }
-
- return 0;
- // NOTREACHED
-
}
-function new_follower($importer,$contact,$datarray,$item,$sharing = false) {
- $url = notags(trim($datarray['author-link']));
- $name = notags(trim($datarray['author-name']));
- $photo = notags(trim($datarray['author-avatar']));
-
- $rawtag = $item->get_item_tags(NAMESPACE_ACTIVITY,'actor');
- if($rawtag && $rawtag[0]['child'][NAMESPACE_POCO]['preferredUsername'][0]['data'])
- $nick = $rawtag[0]['child'][NAMESPACE_POCO]['preferredUsername'][0]['data'];
- if(is_array($contact)) {
- if(($contact['network'] == NETWORK_OSTATUS && $contact['rel'] == CONTACT_IS_SHARING)
- || ($sharing && $contact['rel'] == CONTACT_IS_FOLLOWER)) {
- $r = q("UPDATE `contact` SET `rel` = %d WHERE `id` = %d AND `uid` = %d LIMIT 1",
- intval(CONTACT_IS_FRIEND),
- intval($contact['id']),
- intval($importer['uid'])
- );
- }
- // send email notification to owner?
- }
- else {
-
- // create contact record
-
- $r = q("INSERT INTO `contact` ( `uid`, `created`, `url`, `nurl`, `name`, `nick`, `photo`, `network`, `rel`,
- `blocked`, `readonly`, `pending`, `writable` )
- VALUES ( %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, 0, 0, 1, 1 ) ",
- intval($importer['uid']),
- dbesc(datetime_convert()),
- dbesc($url),
- dbesc(normalise_link($url)),
- dbesc($name),
- dbesc($nick),
- dbesc($photo),
- dbesc(($sharing) ? NETWORK_ZOT : NETWORK_OSTATUS),
- intval(($sharing) ? CONTACT_IS_SHARING : CONTACT_IS_FOLLOWER)
- );
- $r = q("SELECT `id` FROM `contact` WHERE `uid` = %d AND `url` = '%s' AND `pending` = 1 LIMIT 1",
- intval($importer['uid']),
- dbesc($url)
- );
- if(count($r))
- $contact_record = $r[0];
-
- // create notification
- $hash = random_string();
-
- if(is_array($contact_record)) {
- $ret = q("INSERT INTO `intro` ( `uid`, `contact-id`, `blocked`, `knowyou`, `hash`, `datetime`)
- VALUES ( %d, %d, 0, 0, '%s', '%s' )",
- intval($importer['uid']),
- intval($contact_record['id']),
- dbesc($hash),
- dbesc(datetime_convert())
- );
- }
- $r = q("SELECT * FROM `user` WHERE `uid` = %d LIMIT 1",
- intval($importer['uid'])
- );
- $a = get_app();
- if(count($r)) {
-
- if(intval($r[0]['def_gid'])) {
- require_once('include/group.php');
- group_add_member($r[0]['uid'],'',$contact_record['id'],$r[0]['def_gid']);
- }
-
- if(($r[0]['notify-flags'] & NOTIFY_INTRO) && ($r[0]['page-flags'] == PAGE_NORMAL)) {
-
- $email_tpl = get_intltext_template('follow_notify_eml.tpl');
- $email = replace_macros($email_tpl, array(
- '$requestor' => ((strlen($name)) ? $name : t('[Name Withheld]')),
- '$url' => $url,
- '$myname' => $r[0]['username'],
- '$siteurl' => $a->get_baseurl(),
- '$sitename' => $a->config['sitename']
- ));
-
- $res = mail($r[0]['email'],
- (($sharing) ? t('A new person is sharing with you at ') : t("You have a new follower at ")) . $a->config['sitename'],
- $email,
- 'From: ' . t('Administrator') . '@' . $_SERVER['SERVER_NAME'] . "\n"
- . 'Content-type: text/plain; charset=UTF-8' . "\n"
- . 'Content-transfer-encoding: 8bit' );
-
- }
- }
- }
-}
-
-function lose_follower($importer,$contact,$datarray,$item) {
-
- if(($contact['rel'] == CONTACT_IS_FRIEND) || ($contact['rel'] == CONTACT_IS_SHARING)) {
- q("UPDATE `contact` SET `rel` = %d WHERE `id` = %d LIMIT 1",
- intval(CONTACT_IS_SHARING),
- intval($contact['id'])
- );
- }
- else {
-// contact_remove($contact['id']);
- }
-}
-
-function lose_sharer($importer,$contact,$datarray,$item) {
-
- if(($contact['rel'] == CONTACT_IS_FRIEND) || ($contact['rel'] == CONTACT_IS_FOLLOWER)) {
- q("UPDATE `contact` SET `rel` = %d WHERE `id` = %d LIMIT 1",
- intval(CONTACT_IS_FOLLOWER),
- intval($contact['id'])
- );
- }
- else {
-// contact_remove($contact['id']);
- }
-}
-
-
-function atom_author($tag,$name,$uri,$h,$w,$photo) {
+function atom_author($tag,$name,$uri,$h,$w,$type,$photo) {
$o = '';
if(! $tag)
return $o;
@@ -3794,8 +3003,8 @@ function atom_author($tag,$name,$uri,$h,$w,$photo) {
$o .= "<$tag>\r\n";
$o .= "<name>$name</name>\r\n";
$o .= "<uri>$uri</uri>\r\n";
- $o .= '<link rel="photo" type="image/jpeg" media:width="' . $w . '" media:height="' . $h . '" href="' . $photo . '" />' . "\r\n";
- $o .= '<link rel="avatar" type="image/jpeg" media:width="' . $w . '" media:height="' . $h . '" href="' . $photo . '" />' . "\r\n";
+ $o .= '<link rel="photo" type="' . $type . '" media:width="' . $w . '" media:height="' . $h . '" href="' . $photo . '" />' . "\r\n";
+ $o .= '<link rel="avatar" type="' . $type . '" media:width="' . $w . '" media:height="' . $h . '" href="' . $photo . '" />' . "\r\n";
call_hooks('atom_author', $o);
@@ -3811,7 +3020,7 @@ function atom_entry($item,$type,$author,$owner,$comment = false,$cid = 0) {
return;
if($item['deleted'])
- return '<at:deleted-entry ref="' . xmlify($item['uri']) . '" when="' . xmlify(datetime_convert('UTC','UTC',$item['edited'] . '+00:00',ATOM_TIME)) . '" />' . "\r\n";
+ return '<at:deleted-entry ref="' . xmlify($item['mid']) . '" when="' . xmlify(datetime_convert('UTC','UTC',$item['edited'] . '+00:00',ATOM_TIME)) . '" />' . "\r\n";
if($item['allow_cid'] || $item['allow_gid'] || $item['deny_cid'] || $item['deny_gid'])
@@ -3823,35 +3032,35 @@ function atom_entry($item,$type,$author,$owner,$comment = false,$cid = 0) {
$o = "\r\n\r\n<entry>\r\n";
if(is_array($author))
- $o .= atom_author('author',$author['name'],$author['url'],80,80,$author['thumb']);
+ $o .= atom_author('author',$author['xchan_name'],$author['xchan_url'],80,80,$author['xchan_photo_mimetype'],$author['xchan_photo_m']);
else
- $o .= atom_author('author',(($item['author-name']) ? $item['author-name'] : $item['name']),(($item['author-link']) ? $item['author-link'] : $item['url']),80,80,(($item['author-avatar']) ? $item['author-avatar'] : $item['thumb']));
- if(strlen($item['owner-name']))
- $o .= atom_author('dfrn:owner',$item['owner-name'],$item['owner-link'],80,80,$item['owner-avatar']);
+ $o .= atom_author('author',$item['author']['xchan_name'],$item['author']['xchan_url'],80,80,$item['author']['xchan_photo_mimetype'], $item['author']['xchan_photo_m']);
+
+ $o .= atom_author('zot:owner',$item['owner']['xchan_name'],$item['owner']['xchan_url'],80,80,$item['owner']['xchan_photo_mimetype'],$item['owner']['xchan_photo_m']);
- if(($item['parent'] != $item['id']) || ($item['parent_uri'] !== $item['uri']) || (($item['thr_parent'] !== '') && ($item['thr_parent'] !== $item['uri']))) {
- $parent_item = (($item['thr_parent']) ? $item['thr_parent'] : $item['parent_uri']);
- $o .= '<thr:in-reply-to ref="' . xmlify($parent_item) . '" type="text/html" href="' . xmlify($a->get_baseurl() . '/display/' . $owner['nickname'] . '/' . $item['parent']) . '" />' . "\r\n";
+ if(($item['parent'] != $item['id']) || ($item['parent_mid'] !== $item['mid']) || (($item['thr_parent'] !== '') && ($item['thr_parent'] !== $item['mid']))) {
+ $parent_item = (($item['thr_parent']) ? $item['thr_parent'] : $item['parent_mid']);
+ $o .= '<thr:in-reply-to ref="' . xmlify($parent_item) . '" type="text/html" href="' . xmlify($item['plink']) . '" />' . "\r\n";
}
- $o .= '<id>' . xmlify($item['uri']) . '</id>' . "\r\n";
+ $o .= '<id>' . xmlify($item['mid']) . '</id>' . "\r\n";
$o .= '<title>' . xmlify($item['title']) . '</title>' . "\r\n";
$o .= '<published>' . xmlify(datetime_convert('UTC','UTC',$item['created'] . '+00:00',ATOM_TIME)) . '</published>' . "\r\n";
$o .= '<updated>' . xmlify(datetime_convert('UTC','UTC',$item['edited'] . '+00:00',ATOM_TIME)) . '</updated>' . "\r\n";
- $o .= '<dfrn:env>' . base64url_encode($body, true) . '</dfrn:env>' . "\r\n";
- $o .= '<content type="' . $type . '" >' . xmlify((($type === 'html') ? bbcode($body) : $body)) . '</content>' . "\r\n";
- $o .= '<link rel="alternate" type="text/html" href="' . xmlify($a->get_baseurl() . '/display/' . $owner['nickname'] . '/' . $item['id']) . '" />' . "\r\n";
+
+ $o .= '<content type="' . $type . '" >' . xmlify(prepare_text($body,$item['mimetype'])) . '</content>' . "\r\n";
+ $o .= '<link rel="alternate" type="text/html" href="' . xmlify($item['plink']) . '" />' . "\r\n";
if($item['location']) {
- $o .= '<dfrn:location>' . xmlify($item['location']) . '</dfrn:location>' . "\r\n";
+ $o .= '<zot:location>' . xmlify($item['location']) . '</zot:location>' . "\r\n";
$o .= '<poco:address><poco:formatted>' . xmlify($item['location']) . '</poco:formatted></poco:address>' . "\r\n";
}
if($item['coord'])
$o .= '<georss:point>' . xmlify($item['coord']) . '</georss:point>' . "\r\n";
- if(($item['private']) || strlen($item['allow_cid']) || strlen($item['allow_gid']) || strlen($item['deny_cid']) || strlen($item['deny_gid']))
- $o .= '<dfrn:private>' . (($item['private']) ? $item['private'] : 1) . '</dfrn:private>' . "\r\n";
+ if(($item['item_private']) || strlen($item['allow_cid']) || strlen($item['allow_gid']) || strlen($item['deny_cid']) || strlen($item['deny_gid']))
+ $o .= '<zot:private>' . (($item['item_private']) ? $item['item_private'] : 1) . '</zot:private>' . "\r\n";
if($item['app'])
@@ -3867,18 +3076,20 @@ function atom_entry($item,$type,$author,$owner,$comment = false,$cid = 0) {
if(strlen($actarg))
$o .= $actarg;
- $tags = item_getfeedtags($item);
- if(count($tags)) {
- foreach($tags as $t) {
- $o .= '<category scheme="X-DFRN:' . xmlify($t[0]) . ':' . xmlify($t[1]) . '" term="' . xmlify($t[2]) . '" />' . "\r\n";
- }
- }
+ // FIXME
+// $tags = item_getfeedtags($item);
+// if(count($tags)) {
+// foreach($tags as $t) {
+// $o .= '<category scheme="X-DFRN:' . xmlify($t[0]) . ':' . xmlify($t[1]) . '" term="' . xmlify($t[2]) . '" />' . "\r\n";
+// }
+// }
- $o .= item_getfeedattach($item);
+// FIXME
+// $o .= item_getfeedattach($item);
- $mentioned = get_mentions($item,$tags);
- if($mentioned)
- $o .= $mentioned;
+// $mentioned = get_mentions($item,$tags);
+// if($mentioned)
+// $o .= $mentioned;
call_hooks('atom_entry', $o);
@@ -3896,9 +3107,9 @@ function fix_private_photos($s, $uid, $item = null, $cid = 0) {
$orig_body = $s;
$new_body = '';
- $img_start = strpos($orig_body, '[img');
+ $img_start = strpos($orig_body, '[zmg');
$img_st_close = ($img_start !== false ? strpos(substr($orig_body, $img_start), ']') : false);
- $img_len = ($img_start !== false ? strpos(substr($orig_body, $img_start + $img_st_close + 1), '[/img]') : false);
+ $img_len = ($img_start !== false ? strpos(substr($orig_body, $img_start + $img_st_close + 1), '[/zmg]') : false);
while( ($img_st_close !== false) && ($img_len !== false) ) {
$img_st_close++; // make it point to AFTER the closing bracket
@@ -3948,13 +3159,13 @@ function fix_private_photos($s, $uid, $item = null, $cid = 0) {
$type = $r[0]['type'];
// If a custom width and height were specified, apply before embedding
- if(preg_match("/\[img\=([0-9]*)x([0-9]*)\]/is", substr($orig_body, $img_start, $img_st_close), $match)) {
+ if(preg_match("/\[zmg\=([0-9]*)x([0-9]*)\]/is", substr($orig_body, $img_start, $img_st_close), $match)) {
logger('fix_private_photos: scaling photo', LOGGER_DEBUG);
$width = intval($match[1]);
$height = intval($match[2]);
- $ph = new Photo($data, $type);
+ $ph = photo_factory($data, $type);
if($ph->is_valid()) {
$ph->scaleImage(max($width, $height));
$data = $ph->imageString();
@@ -3970,14 +3181,14 @@ function fix_private_photos($s, $uid, $item = null, $cid = 0) {
}
}
- $new_body = $new_body . substr($orig_body, 0, $img_start + $img_st_close) . $image . '[/img]';
- $orig_body = substr($orig_body, $img_start + $img_st_close + $img_len + strlen('[/img]'));
+ $new_body = $new_body . substr($orig_body, 0, $img_start + $img_st_close) . $image . '[/zmg]';
+ $orig_body = substr($orig_body, $img_start + $img_st_close + $img_len + strlen('[/zmg]'));
if($orig_body === false)
$orig_body = '';
- $img_start = strpos($orig_body, '[img');
+ $img_start = strpos($orig_body, '[zmg');
$img_st_close = ($img_start !== false ? strpos(substr($orig_body, $img_start), ']') : false);
- $img_len = ($img_start !== false ? strpos(substr($orig_body, $img_start + $img_st_close + 1), '[/img]') : false);
+ $img_len = ($img_start !== false ? strpos(substr($orig_body, $img_start + $img_st_close + 1), '[/zmg]') : false);
}
$new_body = $new_body . $orig_body;
@@ -4072,21 +3283,28 @@ function item_expire($uid,$days) {
// and just expire conversations started by others
$expire_network_only = get_pconfig($uid,'expire','network_only');
- $sql_extra = ((intval($expire_network_only)) ? " AND wall = 0 " : "");
+ $sql_extra = ((intval($expire_network_only)) ? " AND not (item_flags & " . intval(ITEM_WALL) . ") " : "");
$r = q("SELECT * FROM `item`
WHERE `uid` = %d
AND `created` < UTC_TIMESTAMP() - INTERVAL %d DAY
AND `id` = `parent`
$sql_extra
- AND `deleted` = 0",
+ AND NOT (item_restrict & %d )
+ AND NOT (item_restrict & %d )
+ AND NOT (item_restrict & %d ) ",
intval($uid),
- intval($days)
+ intval($days),
+ intval(ITEM_DELETED),
+ intval(ITEM_WEBPAGE),
+ intval(ITEM_BUILDBLOCK)
);
- if(! count($r))
+ if(! $r)
return;
+ $r = fetch_post_tags($r,true);
+
$expire_items = get_pconfig($uid, 'expire','items');
$expire_items = (($expire_items===false)?1:intval($expire_items)); // default if not set: 1
@@ -4103,20 +3321,19 @@ function item_expire($uid,$days) {
foreach($r as $item) {
+
+
// don't expire filed items
- if(strpos($item['file'],'[') !== false)
+ $terms = get_terms_oftype($item['term'],TERM_FILE);
+ if($terms)
continue;
// Only expire posts, not photos and photo comments
- if($expire_photos==0 && strlen($item['resource_id']))
- continue;
- if($expire_starred==0 && intval($item['starred']))
- continue;
- if($expire_notes==0 && $item['type']=='note')
+ if($expire_photos==0 && ($item['resource_type'] === 'photo'))
continue;
- if($expire_items==0 && $item['type']!='note')
+ if($expire_starred==0 && ($item['item_flags'] & ITEM_STARRED))
continue;
drop_item($item['id'],false);
@@ -4162,7 +3379,7 @@ function drop_item($id,$interactive = true) {
intval($id)
);
- if(! $r) {
+ if((! $r) || ($r[0]['item_restrict'] & ITEM_DELETED)) {
if(! $interactive)
return 0;
notice( t('Item not found.') . EOL);
@@ -4188,6 +3405,17 @@ function drop_item($id,$interactive = true) {
if($ok_to_delete) {
+ // set the deleted flag immediately on this item just in case the
+ // hook calls a remote process which loops. We'll delete it properly in a second.
+
+ $r = q("UPDATE item SET item_restrict = ( item_restrict | %d ) WHERE id = %d LIMIT 1",
+ intval(ITEM_DELETED),
+ intval($item['id'])
+ );
+
+ $arr = array('item' => $item);
+ call_hooks('drop_item', $arr );
+
$notify_id = intval($item['id']);
$items = q("select * from item where parent = %d and uid = %d",
@@ -4404,44 +3632,62 @@ function fetch_post_tags($items,$link = false) {
function zot_feed($uid,$observer_xchan,$mindate) {
+
$result = array();
$mindate = datetime_convert('UTC','UTC',$mindate);
if(! $mindate)
$mindate = '0000-00-00 00:00:00';
+ $mindate = dbesc($mindate);
+
+ logger('zot_feed: ' . $uid);
+
if(! perm_is_allowed($uid,$observer_xchan,'view_stream')) {
+ logger('zot_feed: permission denied.');
return $result;
}
-// FIXME
- $sql_extra = item_permissions_sql($uid,$remote_contact,$groups);
+ require_once('include/security.php');
+ $sql_extra = item_permissions_sql($uid);
- if($mindate != '0000-00-00 00:00:00')
+ if($mindate != '0000-00-00 00:00:00') {
$sql_extra .= " and created > '$mindate' ";
+ $limit = "";
+ }
+ else
+ $limit = " limit 0, 50 ";
+ $items = array();
-// FIXME
- // We probably should use two queries and pick up total conversations.
- // For now get a chunk of raw posts in ascending created order so that
- // hopefully the parent is imported before we see the kids.
- // This will fail if there are more than $limit kids and you didn't
- // receive the parent via direct delivery
-
- $limit = 200;
-
- $items = q("SELECT item.* from item
- WHERE uid = %d AND item_restrict = 0
+ $r = q("SELECT item.*, item.id as item_id from item
+ WHERE uid = %d AND item_restrict = 0 and id = parent
AND (item_flags & %d)
- $sql_extra ORDER BY created ASC limit 0, $limit",
+ $sql_extra ORDER BY created ASC $limit",
intval($uid),
intval(ITEM_WALL)
);
+ if($r) {
+
+ $parents_str = ids_to_querystr($r,'id');
+
+ $items = q("SELECT `item`.*, `item`.`id` AS `item_id` FROM `item`
+ WHERE `item`.`uid` = %d AND `item`.`item_restrict` = 0
+ AND `item`.`parent` IN ( %s ) ",
+ intval($uid),
+ dbesc($parents_str)
+ );
+
+ }
+
if($items) {
xchan_query($items);
$items = fetch_post_tags($items);
- } else {
- $items = array();
+ require_once('include/conversation.php');
+ $items = conv_sort($items,'ascending');
+
}
+ else
+ $items = array();
foreach($items as $item)
$result[] = encode_item($item);
@@ -4449,3 +3695,302 @@ function zot_feed($uid,$observer_xchan,$mindate) {
return $result;
}
+
+
+
+function items_fetch($arr,$channel = null,$observer_hash = null,$client_mode = CLIENT_MODE_NORMAL,$module = 'network') {
+
+ $result = array('success' => false);
+
+ $a = get_app();
+
+ $sql_extra = '';
+ $sql_nets = '';
+ $sql_options = '';
+ $sql_extra2 = '';
+ $sql_extra3 = '';
+ $def_acl = '';
+
+ $item_uids = ' true ';
+
+ if($channel) {
+ $uid = $channel['channel_id'];
+ $uidhash = $channel['channel_hash'];
+ $item_uids = " item.uid = " . intval($uid) . " ";
+ }
+
+ if($arr['star'])
+ $sql_options .= " and (item_flags & " . intval(ITEM_STARRED) . ") ";
+
+ if($arr['wall'])
+ $sql_options .= " and (item_flags & " . intval(ITEM_WALL) . ") ";
+
+ $sql_extra = " AND item.parent IN ( SELECT parent FROM item WHERE (item_flags & " . intval(ITEM_THREAD_TOP) . ") $sql_options ) ";
+
+ if($arr['gid'] && $uid) {
+ $r = q("SELECT * FROM `groups` WHERE id = %d AND uid = %d LIMIT 1",
+ intval($arr['group']),
+ intval($uid)
+ );
+ if(! $r) {
+ $result['message'] = t('Collection not found.');
+ return $result;
+ }
+
+ $contact_str = '';
+ $contacts = group_get_members($group);
+ if($contacts) {
+ foreach($contacts as $c) {
+ if($contact_str)
+ $contact_str .= ',';
+ $contact_str .= "'" . $c['xchan'] . "'";
+ }
+ }
+ else {
+ $contact_str = ' 0 ';
+ $result['message'] = t('Collection is empty.');
+ return $result;
+ }
+
+ $sql_extra = " AND item.parent IN ( SELECT DISTINCT parent FROM item WHERE true $sql_options AND (( author_xchan IN ( $contact_str ) OR owner_xchan in ( $contact_str)) or allow_gid like '" . protect_sprintf('%<' . dbesc($r[0]['hash']) . '>%') . "' ) and id = parent and item_restrict = 0 ) ";
+
+ $x = group_rec_byhash($uid,$r[0]['hash']);
+ $result['headline'] = sprintf( t('Collection: %s'),$x['name']);
+
+ }
+ elseif($arr['cid'] && $uid) {
+
+ $r = q("SELECT abook.*, xchan.* from abook left join xchan on abook_xchan = xchan_hash where abook_id = %d and abook_channel = %d and not ( abook_flags & " . intval(ABOOK_FLAG_BLOCKED) . ") limit 1",
+ intval($arr['cid']),
+ intval(local_user())
+ );
+ if($r) {
+ $sql_extra = " AND item.parent IN ( SELECT DISTINCT parent FROM item WHERE true $sql_options AND uid = " . intval($arr['uid']) . " AND ( author_xchan = '" . dbesc($r[0]['abook_xchan']) . "' or owner_xchan = '" . dbesc($r[0]['abook_xchan']) . "' ) and item_restrict = 0 ) ";
+ $result['headline'] = sprintf( t('Connection: %s'),$r[0]['xchan_name']);
+ }
+ else {
+ $result['message'] = t('Connection not found.');
+ return $result;
+ }
+ }
+
+ if($arr['datequery']) {
+ $sql_extra3 .= protect_sprintf(sprintf(" AND item.created <= '%s' ", dbesc(datetime_convert(date_default_timezone_get(),'',$arr['datequery']))));
+ }
+ if($arr['datequery2']) {
+ $sql_extra3 .= protect_sprintf(sprintf(" AND item.created >= '%s' ", dbesc(datetime_convert(date_default_timezone_get(),'',$arr['datequery2']))));
+ }
+
+ if(! array_key_exists('nouveau',$arr)) {
+ $sql_extra2 = " AND item.parent = item.id ";
+ $sql_extra3 = '';
+ }
+
+ if($arr['search']) {
+ if(strpos($arr['search'],'#') === 0)
+ $sql_extra .= term_query('item',substr($arr['search'],1),TERM_HASHTAG);
+ else
+ $sql_extra .= sprintf(" AND item.body like '%s' ",
+ dbesc(protect_sprintf('%' . $arr['search'] . '%'))
+ );
+ }
+
+ if(strlen($arr['file'])) {
+ $sql_extra .= term_query('item',$arr['files'],TERM_FILE);
+ }
+
+ if($arr['conv'] && $channel) {
+ $sql_extra .= sprintf(" AND parent IN (SELECT distinct parent from item where ( author_xchan like '%s' or ( item_flags & %d ))) ",
+ dbesc(protect_sprintf($uidhash)),
+ intval(ITEM_MENTIONSME)
+ );
+ }
+
+ if(($client_mode & CLIENT_MODE_UPDATE) && (! ($client_mode & CLIENT_MODE_LOAD))) {
+
+ // only setup pagination on initial page view
+ $pager_sql = '';
+
+ }
+ else {
+ $itemspage = (($channel) ? get_pconfig($uid,'system','itemspage') : 20);
+ $a->set_pager_itemspage(((intval($itemspage)) ? $itemspage : 20));
+ $pager_sql = sprintf(" LIMIT %d, %d ",intval(get_app()->pager['start']), intval(get_app()->pager['itemspage']));
+ }
+
+
+ if(($arr['cmin'] != 0) || ($arr['cmax'] != 99)) {
+
+ // Not everybody who shows up in the network stream will be in your address book.
+ // By default those that aren't are assumed to have closeness = 99; but this isn't
+ // recorded anywhere. So if cmax is 99, we'll open the search up to anybody in
+ // the stream with a NULL address book entry.
+
+ $sql_nets .= " AND ";
+
+ if($arr['cmax'] == 99)
+ $sql_nets .= " ( ";
+
+ $sql_nets .= "( abook.abook_closeness >= " . intval($arr['cmin']) . " ";
+ $sql_nets .= " AND abook.abook_closeness <= " . intval($arr['cmax']) . " ) ";
+ if($cmax == 99)
+ $sql_nets .= " OR abook.abook_closeness IS NULL ) ";
+ }
+
+ $simple_update = (($client_mode & CLIENT_MODE_UPDATE) ? " and ( item.item_flags & " . intval(ITEM_UNSEEN) . " ) " : '');
+ if($client_mode & CLIENT_MODE_LOAD)
+ $simple_update = '';
+
+ $start = dba_timer();
+
+ require_once('include/security.php');
+ $sql_extra .= item_permissions_sql($channel['channel_id']);
+
+ if($arr['pages'])
+ $item_restrict = " AND (item_restrict & " . ITEM_WEBPAGE . ") ";
+ else
+ $item_restrict = " AND item_restrict = 0 ";
+
+
+ if($arr['nouveau'] && ($client_mode & CLIENT_MODELOAD) && $channel) {
+ // "New Item View" - show all items unthreaded in reverse created date order
+
+ $items = q("SELECT item.*, item.id AS item_id FROM item
+ WHERE $item_uids $item_restrict
+ $simple_update
+ $sql_extra $sql_nets
+ ORDER BY item.received DESC $pager_sql "
+ );
+
+ require_once('include/items.php');
+
+ xchan_query($items);
+
+ $items = fetch_post_tags($items,true);
+ }
+ else {
+
+ // Normal conversation view
+
+ if($arr['order'] === 'post')
+ $ordering = "created";
+ else
+ $ordering = "commented";
+
+ if(($client_mode & CLIENT_MODE_LOAD) || ($client_mode & CLIENT_MODE_NORMAL)) {
+
+ // Fetch a page full of parent items for this page
+
+ $r = q("SELECT distinct item.id AS item_id FROM item
+ left join abook on item.author_xchan = abook.abook_xchan
+ WHERE $item_uids $item_restrict
+ AND item.parent = item.id
+ and ((abook.abook_flags & %d) = 0 or abook.abook_flags is null)
+ $sql_extra3 $sql_extra $sql_nets
+ ORDER BY item.$ordering DESC $pager_sql ",
+ intval(ABOOK_FLAG_BLOCKED)
+ );
+
+ }
+ else {
+ // update
+ $r = q("SELECT item.parent AS item_id FROM item
+ left join abook on item.author_xchan = abook.abook_xchan
+ WHERE $item_uids $item_restrict $simple_update
+ and ((abook.abook_flags & %d) = 0 or abook.abook_flags is null)
+ $sql_extra3 $sql_extra $sql_nets ",
+ intval(ABOOK_FLAG_BLOCKED)
+ );
+ }
+
+ $first = dba_timer();
+
+ // Then fetch all the children of the parents that are on this page
+
+ if($r) {
+
+ $parents_str = ids_to_querystr($r,'item_id');
+
+ $items = q("SELECT item.*, item.id AS item_id FROM item
+ WHERE $item_uids $item_restrict
+ AND item.parent IN ( %s )
+ $sql_extra ",
+ dbesc($parents_str)
+ );
+
+ $second = dba_timer();
+
+ xchan_query($items);
+
+ $third = dba_timer();
+
+ $items = fetch_post_tags($items,true);
+
+ $fourth = dba_timer();
+
+ require_once('include/conversation.php');
+ $items = conv_sort($items,$ordering);
+
+ //logger('items: ' . print_r($items,true));
+
+ }
+ else {
+ $items = array();
+ }
+
+ if($parents_str && $arr['mark_seen'])
+ $update_unseen = ' AND parent IN ( ' . dbesc($parents_str) . ' )';
+ // FIXME finish mark unseen sql
+ }
+
+ return $items;
+}
+
+
+function update_remote_id($channel,$post_id,$webpage,$pagetitle,$namespace,$remote_id,$mid) {
+
+ $page_type = '';
+
+ if($webpage & ITEM_WEBPAGE)
+ $page_type = 'WEBPAGE';
+ elseif($webpage & ITEM_BUILDBLOCK)
+ $page_type = 'BUILDBLOCK';
+ elseif($webpage & ITEM_PDL)
+ $page_type = 'PDL';
+ elseif($namespace && $remote_id) {
+ $page_type = $namespace;
+ $pagetitle = $remote_id;
+ }
+
+ if($page_type) {
+
+ // store page info as an alternate message_id so we can access it via
+ // https://sitename/page/$channelname/$pagetitle
+ // if no pagetitle was given or it couldn't be transliterated into a url, use the first
+ // sixteen bytes of the mid - which makes the link portable and not quite as daunting
+ // as the entire mid. If it were the post_id the link would be less portable.
+
+ $r = q("select * from item_id where iid = %d and uid = %d and service = '%s' limit 1",
+ intval($post_id),
+ intval($channel['channel_id']),
+ dbesc($page_type)
+ );
+ if($r) {
+ q("update item_id set sid = '%s' where id = %d limit 1",
+ dbesc(($pagetitle) ? $pagetitle : substr($mid,0,16)),
+ intval($r[0]['id'])
+ );
+ }
+ else {
+ q("insert into item_id ( iid, uid, sid, service ) values ( %d, %d, '%s','%s' )",
+ intval($post_id),
+ intval($channel['channel_id']),
+ dbesc(($pagetitle) ? $pagetitle : substr($mid,0,16)),
+ dbesc($page_type)
+ );
+ }
+ }
+
+}
+
+
diff --git a/include/js_strings.php b/include/js_strings.php
index 60a3e1a86..afa8f075a 100644
--- a/include/js_strings.php
+++ b/include/js_strings.php
@@ -1,14 +1,16 @@
-<?php
+<?php /** @file */
function js_strings() {
return replace_macros(get_markup_template('js_strings.tpl'), array(
- '$delitem' => t('Delete this item?'),
- '$comment' => t('Comment'),
- '$showmore' => t('show more'),
- '$showfewer' => t('show fewer'),
- '$pwshort' => t("Password too short"),
- '$pwnomatch' => t("Passwords do not match"),
- '$everybody' => t('everybody'),
+ '$delitem' => t('Delete this item?'),
+ '$comment' => t('Comment'),
+ '$showmore' => t('show more'),
+ '$showfewer' => t('show fewer'),
+ '$pwshort' => t("Password too short"),
+ '$pwnomatch' => t("Passwords do not match"),
+ '$everybody' => t('everybody'),
+ '$passphrase' => t('Secret Passphrase'),
+ '$passhint' => t('Passphrase hint'),
'$t01' => ((t('timeago.prefixAgo') != 'timeago.prefixAgo') ? t('timeago.prefixAgo') : 'null'),
'$t02' => ((t('timeago.suffixAgo') != 'timeago.suffixAgo') ? t('timeago.suffixAgo') : 'null'),
diff --git a/include/language.php b/include/language.php
index 56d5f1cf4..2e7ad5ff1 100644
--- a/include/language.php
+++ b/include/language.php
@@ -1,4 +1,4 @@
-<?php
+<?php /** @file */
/**
@@ -15,35 +15,33 @@
*
*/
-
-if(! function_exists('get_browser_language')) {
function get_browser_language() {
$langs = array();
if (x($_SERVER,'HTTP_ACCEPT_LANGUAGE')) {
- // break up string into pieces (languages and q factors)
- preg_match_all('/([a-z]{1,8}(-[a-z]{1,8})?)\s*(;\s*q\s*=\s*(1|0\.[0-9]+))?/i',
+ // break up string into pieces (languages and q factors)
+ preg_match_all('/([a-z]{1,8}(-[a-z]{1,8})?)\s*(;\s*q\s*=\s*(1|0\.[0-9]+))?/i',
$_SERVER['HTTP_ACCEPT_LANGUAGE'], $lang_parse);
- if (count($lang_parse[1])) {
- // create a list like "en" => 0.8
- $langs = array_combine($lang_parse[1], $lang_parse[4]);
-
- // set default to 1 for any without q factor
- foreach ($langs as $lang => $val) {
- if ($val === '') $langs[$lang] = 1;
- }
-
- // sort list based on value
- arsort($langs, SORT_NUMERIC);
- }
+ if (count($lang_parse[1])) {
+ // create a list like "en" => 0.8
+ $langs = array_combine($lang_parse[1], $lang_parse[4]);
+
+ // set default to 1 for any without q factor
+ foreach ($langs as $lang => $val) {
+ if ($val === '') $langs[$lang] = 1;
+ }
+
+ // sort list based on value
+ arsort($langs, SORT_NUMERIC);
+ }
}
else
$langs['en'] = 1;
return $langs;
-}}
+}
function get_best_language() {
@@ -62,7 +60,7 @@ function get_best_language() {
if(isset($preferred))
return $preferred;
- $a = get_app();
+ $a = get_app();
return ((isset($a->config['system']['language'])) ? $a->config['system']['language'] : 'en');
}
@@ -101,15 +99,25 @@ function pop_lang() {
// load string translation table for alternate language
-if(! function_exists('load_translation_table')) {
-function load_translation_table($lang) {
+function load_translation_table($lang, $install = false) {
global $a;
+ $a->strings = array();
if(file_exists("view/$lang/strings.php")) {
include("view/$lang/strings.php");
}
- else
- $a->strings = array();
+
+ if(! $install) {
+ $plugins = q("SELECT name FROM addon WHERE installed=1;");
+ if ($plugins!==false) {
+ foreach($plugins as $p) {
+ $name = $p['name'];
+ if(file_exists("addon/$name/lang/$lang/strings.php")) {
+ include("addon/$name/lang/$lang/strings.php");
+ }
+ }
+ }
+ }
// Allow individual strings to be over-ridden on this site
// Either for the default language or for all languages
@@ -118,11 +126,10 @@ function load_translation_table($lang) {
include("view/local-$lang/strings.php");
}
-}}
+}
// translate string if translation exists
-if(! function_exists('t')) {
function t($s) {
global $a;
@@ -132,9 +139,9 @@ function t($s) {
return is_array($t)?$t[0]:$t;
}
return $s;
-}}
+}
+
-if(! function_exists('tt')){
function tt($singular, $plural, $count){
$a = get_app();
@@ -152,15 +159,14 @@ function tt($singular, $plural, $count){
} else {
return $singular;
}
-}}
+}
// provide a fallback which will not collide with
// a function defined in any language file
-if(! function_exists('string_plural_select_default')) {
function string_plural_select_default($n) {
return ($n != 1);
-}}
+}
diff --git a/include/menu.php b/include/menu.php
new file mode 100644
index 000000000..c10a669b3
--- /dev/null
+++ b/include/menu.php
@@ -0,0 +1,306 @@
+<?php /** @file */
+
+require_once('include/security.php');
+
+function menu_fetch($name,$uid,$observer_xchan) {
+
+ $sql_options = permissions_sql($uid);
+
+ $r = q("select * from menu where menu_channel_id = %d and menu_name = '%s' limit 1",
+ intval($uid),
+ dbesc($name)
+ );
+ if($r) {
+ $x = q("select * from menu_item where mitem_menu_id = %d and mitem_channel_id = %d
+ $sql_options
+ order by mitem_order asc, mitem_desc asc",
+ intval($r[0]['menu_id']),
+ intval($uid)
+ );
+ return array('menu' => $r[0], 'items' => $x );
+ }
+
+ return null;
+}
+
+
+function menu_render($menu) {
+ if(! $menu)
+ return '';
+ for($x = 0; $x < count($menu['items']); $x ++)
+ if($menu['items']['mitem_flags'] & MENU_ITEM_ZID)
+ $menu['items']['mitem_link'] = zid($menu['items']['mitem_link']);
+ if($menu['items']['mitem_flags'] & MENU_ITEM_NEWWIN)
+ $menu['items']['newwin'] = '1';
+
+ return replace_macros(get_markup_template('usermenu.tpl'),array(
+ '$menu' => $menu['menu'],
+ '$items' => $menu['items']
+ ));
+}
+
+
+
+function menu_fetch_id($menu_id,$channel_id) {
+
+ $r = q("select * from menu where menu_id = %d and menu_channel_id = %d limit 1",
+ intval($menu_id),
+ intval($channel_id)
+ );
+
+ return (($r) ? $r[0] : false);
+}
+
+
+
+function menu_create($arr) {
+
+
+ $menu_name = trim(escape_tags($arr['menu_name']));
+ $menu_desc = trim(escape_tags($arr['menu_desc']));
+
+ if(! $menu_desc)
+ $menu_desc = $menu_name;
+
+ if(! $menu_name)
+ return false;
+
+
+ $menu_channel_id = intval($arr['menu_channel_id']);
+
+ $r = q("select * from menu where menu_name = '%s' and menu_channel_id = %d limit 1",
+ dbesc($menu_name),
+ intval($menu_channel_id)
+ );
+
+ if($r)
+ return false;
+
+ $r = q("insert into menu ( menu_name, menu_desc, menu_channel_id )
+ values( '%s', '%s', %d )",
+ dbesc($menu_name),
+ dbesc($menu_desc),
+ intval($menu_channel_id)
+ );
+ if(! $r)
+ return false;
+
+ $r = q("select menu_id from menu where menu_name = '%s' and menu_channel_id = %d limit 1",
+ dbesc($menu_name),
+ intval($menu_channel_id)
+ );
+ if($r)
+ return $r[0]['menu_id'];
+ return false;
+
+}
+
+function menu_list($channel_id) {
+ $r = q("select * from menu where menu_channel_id = %d order by menu_name",
+ intval($channel_id)
+ );
+ return $r;
+}
+
+
+
+function menu_edit($arr) {
+
+ $menu_id = intval($arr['menu_id']);
+
+ $menu_name = trim(escape_tags($arr['menu_name']));
+ $menu_desc = trim(escape_tags($arr['menu_desc']));
+
+ if(! $menu_desc)
+ $menu_desc = $menu_name;
+
+ if(! $menu_name)
+ return false;
+
+
+ $menu_channel_id = intval($arr['menu_channel_id']);
+
+ $r = q("select menu_id from menu where menu_name = '%s' and menu_channel_id = %d limit 1",
+ dbesc($menu_name),
+ intval($menu_channel_id)
+ );
+ if(($r) && ($r[0]['menu_id'] != $menu_id)) {
+ logger('menu_edit: duplicate menu name for channel ' . $menu_channel_id);
+ return false;
+ }
+
+
+ $r = q("select * from menu where menu_id = %d and menu_channel_id = %d limit 1",
+ intval($menu_id),
+ intval($menu_channel_id)
+ );
+ if(! $r) {
+ logger('menu_edit: not found: ' . print_r($arr,true));
+ return false;
+ }
+
+
+ $r = q("select * from menu where menu_name = '%s' and menu_channel_id = %d and menu_desc = '%s' limit 1",
+ dbesc($menu_name),
+ intval($menu_channel_id),
+ dbesc($menu_desc)
+ );
+
+ if($r)
+ return false;
+
+
+ return q("update menu set menu_name = '%s', menu_desc = '%s'
+ where menu_id = %d and menu_channel_id = %d limit 1",
+ dbesc($menu_name),
+ dbesc($menu_desc),
+ intval($menu_id),
+ intval($menu_channel_id)
+ );
+}
+
+function menu_delete($menu_name, $uid) {
+ $r = q("select menu_id from menu where menu_name = '%s' and menu_channel_id = %d limit 1",
+ dbesc($menu_name),
+ intval($uid)
+ );
+
+ if($r)
+ return menu_delete_id($r[0]['menu_id'],$uid);
+ return false;
+}
+
+function menu_delete_id($menu_id, $uid) {
+ $r = q("select menu_id from menu where menu_id = %d and menu_channel_id = %d limit 1",
+ intval($menu_id),
+ intval($uid)
+ );
+ if($r) {
+ $x = q("delete from menu_item where mitem_menu_id = %d and mitem_channel_id = %d",
+ intval($menu_id),
+ intval($uid)
+ );
+ return q("delete from menu where menu_id = %d and menu_channel_id = %d limit 1",
+ intval($menu_id),
+ intval($uid)
+ );
+ }
+ return false;
+}
+
+
+function menu_add_item($menu_id, $uid, $arr) {
+
+
+ $mitem_link = escape_tags($arr['mitem_link']);
+ $mitem_desc = escape_tags($arr['mitem_desc']);
+ $mitem_order = intval($arr['mitem_order']);
+ $mitem_flags = intval($arr['mitem_flags']);
+
+ if(local_user() == $uid) {
+ $channel = get_app()->get_channel();
+ }
+
+ if ((! $arr['contact_allow'])
+ && (! $arr['group_allow'])
+ && (! $arr['contact_deny'])
+ && (! $arr['group_deny'])) {
+ $str_group_allow = $channel['channel_allow_gid'];
+ $str_contact_allow = $channel['channel_allow_cid'];
+ $str_group_deny = $channel['channel_deny_gid'];
+ $str_contact_deny = $channel['channel_deny_cid'];
+ }
+ else {
+
+ // use the posted permissions
+
+ $str_group_allow = perms2str($arr['group_allow']);
+ $str_contact_allow = perms2str($arr['contact_allow']);
+ $str_group_deny = perms2str($arr['group_deny']);
+ $str_contact_deny = perms2str($arr['contact_deny']);
+ }
+
+
+ $allow_cid = perms2str($arr['allow_cid']);
+ $allow_gid = perms2str($arr['allow_gid']);
+ $deny_cid = perms2str($arr['deny_cid']);
+ $deny_gid = perms2str($arr['deny_gid']);
+
+ $r = q("insert into menu_item ( mitem_link, mitem_desc, mitem_flags, allow_cid, allow_gid, deny_cid, deny_gid, mitem_channel_id, mitem_menu_id, mitem_order ) values ( '%s', '%s', %d, '%s', '%s', '%s', '%s', %d, %d, %d ) ",
+ dbesc($mitem_link),
+ dbesc($mitem_desc),
+ intval($mitem_flags),
+ dbesc($str_contact_allow),
+ dbesc($str_group_allow),
+ dbesc($str_contact_deny),
+ dbesc($str_group_deny),
+ intval($uid),
+ intval($menu_id),
+ intval($mitem_order)
+ );
+ return $r;
+
+}
+
+function menu_edit_item($menu_id, $uid, $arr) {
+
+
+ $mitem_id = intval($arr['mitem_id']);
+ $mitem_link = escape_tags($arr['mitem_link']);
+ $mitem_desc = escape_tags($arr['mitem_desc']);
+ $mitem_order = intval($arr['mitem_order']);
+ $mitem_flags = intval($arr['mitem_flags']);
+
+
+ if(local_user() == $uid) {
+ $channel = get_app()->get_channel();
+ }
+
+ if ((! $arr['contact_allow'])
+ && (! $arr['group_allow'])
+ && (! $arr['contact_deny'])
+ && (! $arr['group_deny'])) {
+ $str_group_allow = $channel['channel_allow_gid'];
+ $str_contact_allow = $channel['channel_allow_cid'];
+ $str_group_deny = $channel['channel_deny_gid'];
+ $str_contact_deny = $channel['channel_deny_cid'];
+ }
+ else {
+
+ // use the posted permissions
+
+ $str_group_allow = perms2str($arr['group_allow']);
+ $str_contact_allow = perms2str($arr['contact_allow']);
+ $str_group_deny = perms2str($arr['group_deny']);
+ $str_contact_deny = perms2str($arr['contact_deny']);
+ }
+
+
+ $r = q("update menu_item set mitem_link = '%s', mitem_desc = '%s', mitem_flags = %d, allow_cid = '%s', allow_gid = '%s', deny_cid = '%s', deny_gid = '%s', mitem_order = %d where mitem_channel_id = %d and mitem_menu_id = %d and mitem_id = %d limit 1",
+ dbesc($mitem_link),
+ dbesc($mitem_desc),
+ intval($mitem_flags),
+ dbesc($str_contact_allow),
+ dbesc($str_group_allow),
+ dbesc($str_contact_deny),
+ dbesc($str_group_deny),
+ intval($mitem_order),
+ intval($uid),
+ intval($menu_id),
+ intval($mitem_id)
+ );
+ return $r;
+}
+
+
+
+
+function menu_del_item($menu_id,$uid,$item_id) {
+ $r = q("delete from menu_item where mitem_menu_id = %d and mitem_channel_id = %d and mitem_id = %d limit 1",
+ intval($menu_id),
+ intval($uid),
+ intval($item_id)
+ );
+ return $r;
+}
+
diff --git a/include/message.php b/include/message.php
index 00cf30512..a95021583 100644
--- a/include/message.php
+++ b/include/message.php
@@ -1,12 +1,14 @@
-<?php
+<?php /** @file */
/* Private Message backend API */
+require_once('include/crypto.php');
+require_once('include/attach.php');
// send a private message
-function send_message($uid = 0, $recipient='', $body='', $subject='', $replyto=''){
+function send_message($uid = 0, $recipient='', $body='', $subject='', $replyto='',$expires = ''){
$ret = array('success' => false);
@@ -20,6 +22,10 @@ function send_message($uid = 0, $recipient='', $body='', $subject='', $replyto='
if(! strlen($subject))
$subject = t('[no subject]');
+// if(! $expires)
+// $expires = '0000-00-00 00:00:00';
+// else
+// $expires = datetime_convert(date_default_timezone_get(),'UTC',$expires);
if($uid) {
$r = q("select * from channel where channel_id = %d limit 1",
@@ -43,37 +49,92 @@ function send_message($uid = 0, $recipient='', $body='', $subject='', $replyto='
$dups = false;
$hash = random_string();
- $uri = $hash . '@' . get_app()->get_hostname();
+ $mid = $hash . '@' . get_app()->get_hostname();
- $r = q("SELECT id FROM mail WHERE uri = '%s' LIMIT 1",
- dbesc($uri));
+ $r = q("SELECT id FROM mail WHERE mid = '%s' LIMIT 1",
+ dbesc($mid));
if(count($r))
$dups = true;
} while($dups == true);
if(! strlen($replyto)) {
- $replyto = $uri;
+ $replyto = $mid;
}
+ /**
+ *
+ * When a photo was uploaded into the message using the (profile wall) ajax
+ * uploader, The permissions are initially set to disallow anybody but the
+ * owner from seeing it. This is because the permissions may not yet have been
+ * set for the post. If it's private, the photo permissions should be set
+ * appropriately. But we didn't know the final permissions on the post until
+ * now. So now we'll look for links of uploaded messages that are in the
+ * post and set them to the same permissions as the post itself.
+ *
+ */
+
+ $match = null;
+ $images = null;
+ if(preg_match_all("/\[img\](.*?)\[\/img\]/",((strpos($body,'[/crypt]')) ? $_POST['media_str'] : $body),$match))
+ $images = $match[1];
+
+ $match = false;
+
+ if(preg_match_all("/\[attachment\](.*?)\[\/attachment\]/",((strpos($body,'[/crypt]')) ? $_POST['media_str'] : $body),$match))
+ $attaches = $match[1];
+
+ $attachments = '';
+
+ if(preg_match_all('/(\[attachment\](.*?)\[\/attachment\])/',$body,$match)) {
+ $attachments = array();
+ foreach($match[2] as $mtch) {
+ $hash = substr($mtch,0,strpos($mtch,','));
+ $rev = intval(substr($mtch,strpos($mtch,',')));
+ $r = attach_by_hash_nodata($hash,$rev);
+ if($r['success']) {
+ $attachments[] = array(
+ 'href' => $a->get_baseurl() . '/attach/' . $r['data']['hash'],
+ 'length' => $r['data']['filesize'],
+ 'type' => $r['data']['filetype'],
+ 'title' => urlencode($r['data']['filename']),
+ 'revision' => $r['data']['revision']
+ );
+ }
+ $body = str_replace($match[1],'',$body);
+ }
+ }
+
+ $jattach = (($attachments) ? json_encode($attachments) : '');
+
+ $key = get_config('system','pubkey');
+ if($subject)
+ $subject = json_encode(crypto_encapsulate($subject,$key));
+ if($body)
+ $body = json_encode(crypto_encapsulate($body,$key));
- $r = q("INSERT INTO mail ( account_id, channel_id, from_xchan, to_xchan, title, body, uri, parent_uri, created )
- VALUES ( %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s' )",
+
+
+ $r = q("INSERT INTO mail ( account_id, mail_flags, channel_id, from_xchan, to_xchan, title, body, attach, mid, parent_mid, created, expires )
+ VALUES ( %d, %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s' )",
intval($channel['channel_account_id']),
+ intval(MAIL_OBSCURED),
intval($channel['channel_id']),
dbesc($channel['channel_hash']),
dbesc($recipient),
dbesc($subject),
dbesc($body),
- dbesc($uri),
+ dbesc($jattach),
+ dbesc($mid),
dbesc($replyto),
- dbesc(datetime_convert())
+ dbesc(datetime_convert()),
+ dbesc($expires)
);
// verify the save
- $r = q("SELECT * FROM mail WHERE uri = '%s' and channel_id = %d LIMIT 1",
- dbesc($uri),
+ $r = q("SELECT * FROM mail WHERE mid = '%s' and channel_id = %d LIMIT 1",
+ dbesc($mid),
intval($channel['channel_id'])
);
if($r)
@@ -83,38 +144,34 @@ function send_message($uid = 0, $recipient='', $body='', $subject='', $replyto='
return $ret;
}
- /**
- *
- * When a photo was uploaded into the message using the (profile wall) ajax
- * uploader, The permissions are initially set to disallow anybody but the
- * owner from seeing it. This is because the permissions may not yet have been
- * set for the post. If it's private, the photo permissions should be set
- * appropriately. But we didn't know the final permissions on the post until
- * now. So now we'll look for links of uploaded messages that are in the
- * post and set them to the same permissions as the post itself.
- *
- */
-
- $match = null;
-
- if(preg_match_all("/\[img\](.*?)\[\/img\]/",$body,$match)) {
- $images = $match[1];
- if(count($images)) {
- foreach($images as $image) {
- if(! stristr($image,$a->get_baseurl() . '/photo/'))
- continue;
- $image_uri = substr($image,strrpos($image,'/') + 1);
- $image_uri = substr($image_uri,0, strpos($image_uri,'-'));
- $r = q("UPDATE photo SET allow_cid = '%s' WHERE resource_id = '%s' AND uid = %d and allow_cid = '%s'",
- dbesc('<' . $recipient . '>'),
- dbesc($image_uri),
- intval($channel['channel_id']),
- dbesc('<' . $channel['channel_hash'] . '>')
- );
- }
+ if(count($images)) {
+ foreach($images as $image) {
+ if(! stristr($image,$a->get_baseurl() . '/photo/'))
+ continue;
+ $image_uri = substr($image,strrpos($image,'/') + 1);
+ $image_uri = substr($image_uri,0, strpos($image_uri,'-'));
+ $r = q("UPDATE photo SET allow_cid = '%s' WHERE resource_id = '%s' AND uid = %d and allow_cid = '%s'",
+ dbesc('<' . $recipient . '>'),
+ dbesc($image_uri),
+ intval($channel['channel_id']),
+ dbesc('<' . $channel['channel_hash'] . '>')
+ );
}
}
+ if($attaches) {
+ foreach($attaches as $attach) {
+ $hash = substr($attach,0,strpos($attach,','));
+ $rev = intval(substr($attach,strpos($attach,',')));
+ attach_store($channel,$observer_hash,$options = 'update', array(
+ 'hash' => $hash,
+ 'revision' => $rev,
+ 'allow_cid' => '<' . $recipient . '>',
+
+ ));
+ }
+ }
+
proc_run('php','include/notifier.php','mail',$post_id);
$ret['success'] = true;
@@ -169,6 +226,15 @@ function private_messages_list($uid, $mailbox = '', $start = 0, $numitems = 0) {
$r[$k]['from'] = find_xchan_in_array($rr['from_xchan'],$c);
$r[$k]['to'] = find_xchan_in_array($rr['to_xchan'],$c);
$r[$k]['seen'] = (($rr['mail_flags'] & MAIL_SEEN) ? 1 : 0);
+ if($r[$k]['mail_flags'] & MAIL_OBSCURED) {
+ logger('unencrypting');
+ $key = get_config('system','prvkey');
+
+ if($r[$k]['title'])
+ $r[$k]['title'] = crypto_unencapsulate(json_decode_plus($r[$k]['title']),$key);
+ if($r[$k]['body'])
+ $r[$k]['body'] = crypto_unencapsulate(json_decode_plus($r[$k]['body']),$key);
+ }
}
return $r;
@@ -201,6 +267,13 @@ function private_messages_fetch_message($channel_id, $messageitem_id, $updatesee
foreach($messages as $k => $message) {
$messages[$k]['from'] = find_xchan_in_array($message['from_xchan'],$c);
$messages[$k]['to'] = find_xchan_in_array($message['to_xchan'],$c);
+ if($messages[$k]['mail_flags'] & MAIL_OBSCURED) {
+ $key = get_config('system','prvkey');
+ if($messages[$k]['title'])
+ $messages[$k]['title'] = crypto_unencapsulate(json_decode_plus($messages[$k]['title']),$key);
+ if($messages[$k]['body'])
+ $messages[$k]['body'] = crypto_unencapsulate(json_decode_plus($messages[$k]['body']),$key);
+ }
}
if($updateseen) {
@@ -221,13 +294,13 @@ function private_messages_drop($channel_id, $messageitem_id, $drop_conversation
if($drop_conversation) {
// find the parent_id
- $p = q("SELECT parent_uri FROM mail WHERE id = %d AND channel_id = %d LIMIT 1",
+ $p = q("SELECT parent_mid FROM mail WHERE id = %d AND channel_id = %d LIMIT 1",
intval($messageitem_id),
intval($channel_id)
);
if($p) {
- $r = q("DELETE FROM mail WHERE parent_uri = '%s' AND channel_id = %d ",
- dbesc($p[0]['parent_uri']),
+ $r = q("DELETE FROM mail WHERE parent_mid = '%s' AND channel_id = %d ",
+ dbesc($p[0]['parent_mid']),
intval($channel_id)
);
if($r)
@@ -248,9 +321,9 @@ function private_messages_drop($channel_id, $messageitem_id, $drop_conversation
function private_messages_fetch_conversation($channel_id, $messageitem_id, $updateseen = false) {
- // find the parent_uri of the message being requested
+ // find the parent_mid of the message being requested
- $r = q("SELECT parent_uri from mail WHERE channel_id = %d and id = %d limit 1",
+ $r = q("SELECT parent_mid from mail WHERE channel_id = %d and id = %d limit 1",
intval($channel_id),
intval($messageitem_id)
);
@@ -258,8 +331,8 @@ function private_messages_fetch_conversation($channel_id, $messageitem_id, $upda
if(! $r)
return array();
- $messages = q("select * from mail where parent_uri = '%s' and channel_id = %d order by created asc",
- dbesc($r[0]['parent_uri']),
+ $messages = q("select * from mail where parent_mid = '%s' and channel_id = %d order by created asc",
+ dbesc($r[0]['parent_mid']),
intval($channel_id)
);
@@ -282,14 +355,21 @@ function private_messages_fetch_conversation($channel_id, $messageitem_id, $upda
foreach($messages as $k => $message) {
$messages[$k]['from'] = find_xchan_in_array($message['from_xchan'],$c);
$messages[$k]['to'] = find_xchan_in_array($message['to_xchan'],$c);
+ if($messages[$k]['mail_flags'] & MAIL_OBSCURED) {
+ $key = get_config('system','prvkey');
+ if($messages[$k]['title'])
+ $messages[$k]['title'] = crypto_unencapsulate(json_decode_plus($messages[$k]['title']),$key);
+ if($messages[$k]['body'])
+ $messages[$k]['body'] = crypto_unencapsulate(json_decode_plus($messages[$k]['body']),$key);
+ }
}
if($updateseen) {
- $r = q("UPDATE `mail` SET mail_flags = (mail_flags ^ %d) where not (mail_flags & %d) and parent_uri = '%s' AND channel_id = %d",
+ $r = q("UPDATE `mail` SET mail_flags = (mail_flags ^ %d) where not (mail_flags & %d) and parent_mid = '%s' AND channel_id = %d",
intval(MAIL_SEEN),
intval(MAIL_SEEN),
- dbesc($r[0]['parent_uri']),
+ dbesc($r[0]['parent_mid']),
intval($channel_id)
);
}
diff --git a/include/nav.php b/include/nav.php
index 5490d6cd4..008899c47 100644
--- a/include/nav.php
+++ b/include/nav.php
@@ -1,4 +1,4 @@
-<?php
+<?php /** @file */
function nav(&$a) {
@@ -22,6 +22,7 @@ function nav(&$a) {
serviceUrl: '$base/acl',
minChars: 2,
width: 250,
+ id: 'nav-search-text-ac',
});
a.setOptions({ autoSubmit: true, params: { type: 'x' }});
@@ -71,7 +72,7 @@ EOT;
$nav['logout'] = Array('logout',t('Logout'), "", t('End this session'));
// user menu
- $nav['usermenu'][] = Array('channel/' . $channel['channel_address'], t('Status'), "", t('Your posts and conversations'));
+ $nav['usermenu'][] = Array('channel/' . $channel['channel_address'], t('Home'), "", t('Your posts and conversations'));
$nav['usermenu'][] = Array('profile/' . $channel['channel_address'], t('View Profile'), "", t('Your profile page'));
if(feature_enabled(local_user(),'multi_profiles'))
$nav['usermenu'][] = Array('profiles', t('Edit Profiles'),"", t('Manage/Edit Profiles'));
@@ -95,20 +96,26 @@ EOT;
);
}
- if($observer)
+ if($observer) {
+ $nav['locked'] = true;
$nav['lock'] = array('logout','','lock',
sprintf( t('%s - click to logout'), $observer['xchan_addr']));
- else
+ }
+ else {
+ $nav['locked'] = false;
$nav['lock'] = array('rmagic','','unlock',
t('Click to authenticate to your home hub'));
+ }
/**
* "Home" should also take you home from an authenticated remote profile connection
*/
$homelink = get_my_url();
- if(! $homelink)
- $homelink = ((x($_SESSION,'visitor_home')) ? $_SESSION['visitor_home'] : '');
+ if(! $homelink) {
+ $observer = $a->get_observer();
+ $homelink = (($observer) ? $observer['xchan_url'] : '');
+ }
if(($a->module != 'home') && (! (local_user())))
$nav['home'] = array($homelink, t('Home'), "", t('Home Page'));
@@ -128,7 +135,7 @@ EOT;
$nav['search'] = array('search', t('Search'), "", t('Search site content'));
- $nav['directory'] = array('directory', t('Channel Directory'), "", t('Channel Locator'));
+ $nav['directory'] = array('directory', t('Directory'), "", t('Channel Locator'));
/**
@@ -139,29 +146,26 @@ EOT;
if(local_user()) {
- $nav['network'] = array('network', t('Network'), "", t('Conversations from your friends'));
- $nav['network']['all']=array('notifications/network', t('See all network notifications'), "", "");
- $nav['network']['mark'] = array('', t('Mark all network notifications seen'), '','');
+ $nav['network'] = array('network', t('Matrix'), "", t('Your matrix'));
+ $nav['network']['mark'] = array('', t('Mark all matrix notifications seen'), '','');
- $nav['home'] = array('channel/' . $channel['channel_address'], t('Home'), "", t('Your posts and conversations'));
- $nav['home']['all']=array('notifications/channel', t('See all channel notifications'), "", "");
+ $nav['home'] = array('channel/' . $channel['channel_address'], t('Channel Home'), "", t('Channel home'));
$nav['home']['mark'] = array('', t('Mark all channel notifications seen'), '','');
- $nav['intros'] = array('connections/pending', t('Introductions'), "", t('New Connections'));
- $nav['intros']['all']=array('intro', t('See all channel introductions'), "", "");
+ $nav['intros'] = array('connections/pending', t('Intros'), "", t('New Connections'));
- $nav['notifications'] = array('notifications/system', t('Notifications'), "", t('Notifications'));
+ $nav['notifications'] = array('notifications/system', t('Notices'), "", t('Notifications'));
$nav['notifications']['all']=array('notifications/system', t('See all notifications'), "", "");
$nav['notifications']['mark'] = array('', t('Mark all system notifications seen'), '','');
- $nav['messages'] = array('message', t('Messages'), "", t('Private mail'));
+ $nav['messages'] = array('message', t('Mail'), "", t('Private mail'));
$nav['messages']['all']=array('message', t('See all private messages'), "", "");
$nav['messages']['mark'] = array('', t('Mark all private messages seen'), '','');
$nav['messages']['inbox'] = array('message', t('Inbox'), "", t('Inbox'));
$nav['messages']['outbox']= array('message/sent', t('Outbox'), "", t('Outbox'));
- $nav['messages']['new'] = array('message/new', t('New Message'), "", t('New Message'));
+ $nav['messages']['new'] = array('mail/new', t('New Message'), "", t('New Message'));
$nav['all_events'] = array('events', t('Events'), "", t('Event Calendar'));
@@ -192,19 +196,21 @@ EOT;
$banner = get_config('system','banner');
if($banner === false)
-// $banner .= '<a href="http://friendica.com"><img id="logo-img" src="images/fred-32.png" alt="logo" /></a>';
- $banner = 'red';
+ $banner = get_config('system','sitename');
+
+ $x = array('nav' => $nav, 'usermenu' => $userinfo );
+ call_hooks('nav', $x);
$tpl = get_markup_template('nav.tpl');
$a->page['nav'] .= replace_macros($tpl, array(
'$baseurl' => $a->get_baseurl(),
- '$langselector' => lang_selector(),
+ '$langselector' => ((get_config('system','select_language')) ? lang_selector() : ''),
'$sitelocation' => $sitelocation,
- '$nav' => $nav,
+ '$nav' => $x['nav'],
'$banner' => $banner,
'$emptynotifications' => t('Nothing new here'),
- '$userinfo' => $userinfo,
+ '$userinfo' => $x['usermenu'],
'$localuser' => local_user(),
'$sel' => $a->nav_sel,
'$apps' => $a->get_apps(),
@@ -234,5 +240,5 @@ function nav_set_selected($item){
'manage' => null,
'register' => null,
);
- $a->nav_sel[$item] = 'selected';
+ $a->nav_sel[$item] = 'active';
}
diff --git a/include/network.php b/include/network.php
index 555e76802..3fe7f5400 100644
--- a/include/network.php
+++ b/include/network.php
@@ -1,4 +1,4 @@
-<?php
+<?php /** @file */
@@ -6,196 +6,27 @@ function get_capath() {
return appdirpath() . '/library/cacert.pem';
}
-// curl wrapper. If binary flag is true, return binary
-// results.
-
-if(! function_exists('fetch_url')) {
-function fetch_url($url,$binary = false, &$redirects = 0, $timeout = 0, $accept_content=Null) {
-
- $a = get_app();
-
- $ch = @curl_init($url);
- if(($redirects > 8) || (! $ch))
- return false;
-
- @curl_setopt($ch, CURLOPT_HEADER, true);
- @curl_setopt($ch, CURLOPT_CAINFO, get_capath());
-
- if (!is_null($accept_content)){
- curl_setopt($ch,CURLOPT_HTTPHEADER, array (
- "Accept: " . $accept_content
- ));
- }
-
- @curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
- //@curl_setopt($ch, CURLOPT_USERAGENT, "Friendica");
- @curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (compatible; Friendica)");
-
-
- if(intval($timeout)) {
- @curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
- }
- else {
- $curl_time = intval(get_config('system','curl_timeout'));
- @curl_setopt($ch, CURLOPT_TIMEOUT, (($curl_time !== false) ? $curl_time : 60));
- }
- // by default we will allow self-signed certs
- // but you can override this
-
- $check_cert = get_config('system','verifyssl');
- @curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, (($check_cert) ? true : false));
-
- $prx = get_config('system','proxy');
- if(strlen($prx)) {
- @curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1);
- @curl_setopt($ch, CURLOPT_PROXY, $prx);
- $prxusr = @get_config('system','proxyuser');
- if(strlen($prxusr))
- @curl_setopt($ch, CURLOPT_PROXYUSERPWD, $prxusr);
- }
- if($binary)
- @curl_setopt($ch, CURLOPT_BINARYTRANSFER,1);
-
- $a->set_curl_code(0);
-
- // don't let curl abort the entire application
- // if it throws any errors.
-
- $s = @curl_exec($ch);
-
- $base = $s;
- $curl_info = @curl_getinfo($ch);
- $http_code = $curl_info['http_code'];
-// logger('fetch_url:' . $http_code . ' data: ' . $s);
- $header = '';
-
- // Pull out multiple headers, e.g. proxy and continuation headers
- // allow for HTTP/2.x without fixing code
-
- while(preg_match('/^HTTP\/[1-2].+? [1-5][0-9][0-9]/',$base)) {
- $chunk = substr($base,0,strpos($base,"\r\n\r\n")+4);
- $header .= $chunk;
- $base = substr($base,strlen($chunk));
- }
-
- if($http_code == 301 || $http_code == 302 || $http_code == 303 || $http_code == 307 || $http_code == 308) {
- $matches = array();
- preg_match('/(Location:|URI:)(.*?)\n/', $header, $matches);
- $newurl = trim(array_pop($matches));
- if(strpos($newurl,'/') === 0)
- $newurl = $url . $newurl;
- $url_parsed = @parse_url($newurl);
- if (isset($url_parsed)) {
- $redirects++;
- @curl_close($ch);
- return fetch_url($newurl,$binary,$redirects,$timeout);
- }
- }
-
- $a->set_curl_code($http_code);
-
- $body = substr($s,strlen($header));
- $a->set_curl_headers($header);
- @curl_close($ch);
- return($body);
-}}
-
-// post request to $url. $params is an array of post variables.
-
-if(! function_exists('post_url')) {
-function post_url($url,$params, $headers = null, &$redirects = 0, $timeout = 0) {
- $a = get_app();
- $ch = curl_init($url);
- if(($redirects > 8) || (! $ch))
- return false;
-
- curl_setopt($ch, CURLOPT_HEADER, true);
- @curl_setopt($ch, CURLOPT_CAINFO, get_capath());
- curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
- curl_setopt($ch, CURLOPT_POST,1);
- curl_setopt($ch, CURLOPT_POSTFIELDS,$params);
- curl_setopt($ch, CURLOPT_USERAGENT, "Friendica");
-
- if(intval($timeout)) {
- curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
- }
- else {
- $curl_time = intval(get_config('system','curl_timeout'));
- curl_setopt($ch, CURLOPT_TIMEOUT, (($curl_time !== false) ? $curl_time : 60));
- }
-
- if(defined('LIGHTTPD')) {
- if(!is_array($headers)) {
- $headers = array('Expect:');
- } else {
- if(!in_array('Expect:', $headers)) {
- array_push($headers, 'Expect:');
- }
- }
- }
- if($headers)
- curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
-
- $check_cert = get_config('system','verifyssl');
- curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, (($check_cert) ? true : false));
- $prx = get_config('system','proxy');
- if(strlen($prx)) {
- curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1);
- curl_setopt($ch, CURLOPT_PROXY, $prx);
- $prxusr = get_config('system','proxyuser');
- if(strlen($prxusr))
- curl_setopt($ch, CURLOPT_PROXYUSERPWD, $prxusr);
- }
-
- $a->set_curl_code(0);
-
- // don't let curl abort the entire application
- // if it throws any errors.
-
- $s = @curl_exec($ch);
-
- $base = $s;
- $curl_info = curl_getinfo($ch);
- $http_code = $curl_info['http_code'];
-
- $header = '';
-
- // Pull out multiple headers, e.g. proxy and continuation headers
- // allow for HTTP/2.x without fixing code
-
- while(preg_match('/^HTTP\/[1-2].+? [1-5][0-9][0-9]/',$base)) {
- $chunk = substr($base,0,strpos($base,"\r\n\r\n")+4);
- $header .= $chunk;
- $base = substr($base,strlen($chunk));
- }
-
- if($http_code == 301 || $http_code == 302 || $http_code == 303 || $http_code == 307 || $http_code == 308) {
- $matches = array();
- preg_match('/(Location:|URI:)(.*?)\n/', $header, $matches);
- $newurl = trim(array_pop($matches));
- if(strpos($newurl,'/') === 0)
- $newurl = $url . $newurl;
- $url_parsed = @parse_url($newurl);
- if (isset($url_parsed)) {
- $redirects++;
- @curl_close($ch);
- if($http_code == 303) {
- return fetch_url($newurl,false,$redirects,$timeout);
- } else {
- return post_url($newurl,$params,$redirects,$timeout);
- }
- }
- }
- $a->set_curl_code($http_code);
- $body = substr($s,strlen($header));
-
- $a->set_curl_headers($header);
-
- curl_close($ch);
- return($body);
-}}
+/**
+ * @function z_fetch_url
+ * @param string $url
+ * URL to fetch
+ * @param boolean $binary = false
+ * TRUE if asked to return binary results (file download)
+ * @param int $redirects = 0
+ * internal use, recursion counter
+ * @param array $opts (optional parameters)
+ * 'accept_content' => supply Accept: header with 'accept_content' as the value
+ * 'timeout' => int seconds, default system config value or 60 seconds
+ * 'http_auth' => username:password
+ * 'novalidate' => do not validate SSL certs, default is to validate using our CA list
+ *
+ * @returns array
+ * 'return_code' => HTTP return code or 0 if timeout or failure
+ * 'success' => boolean true (if HTTP 2xx result) or false
+ * 'header' => HTTP headers
+ * 'body' => fetched content
+ */
-if(! function_exists('z_fetch_url')) {
function z_fetch_url($url, $binary = false, $redirects = 0, $opts = array()) {
$ret = array('return_code' => 0, 'success' => false, 'header' => "", 'body' => "");
@@ -210,7 +41,7 @@ function z_fetch_url($url, $binary = false, $redirects = 0, $opts = array()) {
@curl_setopt($ch, CURLOPT_CAINFO, get_capath());
@curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
@curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
- @curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (compatible; Friendica Red)");
+ @curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (compatible; Red)");
if (x($opts,'accept_content')){
curl_setopt($ch,CURLOPT_HTTPHEADER, array (
@@ -231,6 +62,10 @@ function z_fetch_url($url, $binary = false, $redirects = 0, $opts = array()) {
@curl_setopt($ch, CURLOPT_USERPWD, $opts['http_auth']);
}
+ @curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,
+ ((x($opts,'novalidate') && intval($opts['novalidate'])) ? false : true));
+
+
$prx = get_config('system','proxy');
if(strlen($prx)) {
@curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1);
@@ -279,16 +114,21 @@ function z_fetch_url($url, $binary = false, $redirects = 0, $opts = array()) {
$rc = intval($http_code);
$ret['return_code'] = $rc;
$ret['success'] = (($rc >= 200 && $rc <= 299) ? true : false);
+ if(! $ret['success']) {
+ $ret['debug'] = $curl_info;
+ logger('z_fetch_url: debug:' . print_r($curl_info,true), LOGGER_DATA);
+ }
$ret['body'] = substr($s,strlen($header));
$ret['header'] = $header;
+
@curl_close($ch);
return($ret);
-}}
+}
-if(! function_exists('z_post_url')) {
-function z_post_url($url,$params, $headers = null, $redirects = 0, $timeout = 0) {
+
+function z_post_url($url,$params, $redirects = 0, $opts = array()) {
$ret = array('return_code' => 0, 'success' => false, 'header' => "", 'body' => "");
@@ -301,30 +141,32 @@ function z_post_url($url,$params, $headers = null, $redirects = 0, $timeout = 0)
curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
curl_setopt($ch, CURLOPT_POST,1);
curl_setopt($ch, CURLOPT_POSTFIELDS,$params);
- curl_setopt($ch, CURLOPT_USERAGENT, "Friendica");
+ curl_setopt($ch, CURLOPT_USERAGENT, "Red");
+
- if(intval($timeout)) {
- curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
+ if (x($opts,'accept_content')){
+ curl_setopt($ch,CURLOPT_HTTPHEADER, array (
+ "Accept: " . $opts['accept_content']
+ ));
+ }
+ if(x($opts,'headers'))
+ curl_setopt($ch, CURLOPT_HTTPHEADER, $opts['headers']);
+
+ if(x($opts,'timeout') && intval($opts['timeout'])) {
+ @curl_setopt($ch, CURLOPT_TIMEOUT, $opts['timeout']);
}
else {
$curl_time = intval(get_config('system','curl_timeout'));
- curl_setopt($ch, CURLOPT_TIMEOUT, (($curl_time !== false) ? $curl_time : 60));
+ @curl_setopt($ch, CURLOPT_TIMEOUT, (($curl_time !== false) ? $curl_time : 60));
}
- if(defined('LIGHTTPD')) {
- if(!is_array($headers)) {
- $headers = array('Expect:');
- } else {
- if(!in_array('Expect:', $headers)) {
- array_push($headers, 'Expect:');
- }
- }
+ if(x($opts,'http_auth')) {
+ // "username" . ':' . "password"
+ @curl_setopt($ch, CURLOPT_USERPWD, $opts['http_auth']);
}
- if($headers)
- curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
-
- curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
+ @curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,
+ ((x($opts,'novalidate') && intval($opts['novalidate'])) ? false : true));
$prx = get_config('system','proxy');
if(strlen($prx)) {
@@ -365,20 +207,25 @@ function z_post_url($url,$params, $headers = null, $redirects = 0, $timeout = 0)
if (isset($url_parsed)) {
curl_close($ch);
if($http_code == 303) {
- return z_fetch_url($newurl,false,$headers,$redirects++,$timeout);
+ return z_fetch_url($newurl,false,$redirects++,$opts);
} else {
- return z_post_url($newurl,$params,$headers,$redirects++,$timeout);
+ return z_post_url($newurl,$params,$redirects++,$opts);
}
}
}
$rc = intval($http_code);
$ret['return_code'] = $rc;
$ret['success'] = (($rc >= 200 && $rc <= 299) ? true : false);
+ if(! $ret['success']) {
+ $ret['debug'] = $curl_info;
+ logger('z_fetch_url: debug:' . print_r($curl_info,true), LOGGER_DATA);
+ }
+
$ret['body'] = substr($s,strlen($header));
$ret['header'] = $header;
curl_close($ch);
return($ret);
-}}
+}
@@ -394,7 +241,7 @@ function json_return_and_die($x) {
// Outputs a basic dfrn XML status structure to STDOUT, with a <status> variable
// of $st and an optional text <message> of $message and terminates the current process.
-if(! function_exists('xml_status')) {
+
function xml_status($st, $message = '') {
$xml_message = ((strlen($message)) ? "\t<message>" . xmlify($message) . "</message>\r\n" : '');
@@ -406,29 +253,37 @@ function xml_status($st, $message = '') {
echo '<?xml version="1.0" encoding="UTF-8"?>'."\r\n";
echo "<result>\r\n\t<status>$st</status>\r\n$xml_message</result>\r\n";
killme();
-}}
-
+}
-if(! function_exists('http_status_exit')) {
-function http_status_exit($val) {
+/**
+ * @function http_status_exit
+ *
+ * Send HTTP status header and exit
+ * @param int $val
+ * integer HTTP status result value
+ * @param string $msg
+ * optional message
+ * @returns (does not return, process is terminated)
+ */
+
+function http_status_exit($val,$msg = '') {
$err = '';
if($val >= 400)
- $err = 'Error';
+ $msg = (($msg) ? $msg : 'Error');
if($val >= 200 && $val < 300)
- $err = 'OK';
+ $msg = (($msg) ? $msg : 'OK');
- logger('http_status_exit ' . $val);
- header($_SERVER["SERVER_PROTOCOL"] . ' ' . $val . ' ' . $err);
+ logger('http_status_exit ' . $val . ' ' . $msg);
+ header($_SERVER['SERVER_PROTOCOL'] . ' ' . $val . ' ' . $msg);
killme();
-
-}}
+}
// convert an XML document to a normalised, case-corrected array
// used by webfinger
-if(! function_exists('convert_xml_element_to_array')) {
+
function convert_xml_element_to_array($xml_element, &$recursion_depth=0) {
// If we're getting too deep, bail out
@@ -468,7 +323,7 @@ function convert_xml_element_to_array($xml_element, &$recursion_depth=0) {
} else {
return (trim(strval($xml_element)));
}
-}}
+}
// Given an email style address, perform webfinger lookup and
// return the resulting DFRN profile URL, or if no DFRN profile URL
@@ -482,7 +337,7 @@ function convert_xml_element_to_array($xml_element, &$recursion_depth=0) {
// amended 7/9/2011 to return an hcard which could save potentially loading
// a lengthy content page to scrape dfrn attributes
-if(! function_exists('webfinger_dfrn')) {
+
function webfinger_dfrn($s,&$hcard) {
if(! strstr($s,'@')) {
return $s;
@@ -502,14 +357,14 @@ function webfinger_dfrn($s,&$hcard) {
}
}
return $profile_link;
-}}
+}
// Given an email style address, perform webfinger lookup and
// return the array of link attributes from the personal XRD file.
// On error/failure return an empty array.
-if(! function_exists('webfinger')) {
+
function webfinger($s, $debug = false) {
$host = '';
if(strstr($s,'@')) {
@@ -532,177 +387,8 @@ function webfinger($s, $debug = false) {
}
}
return array();
-}}
-
-if(! function_exists('lrdd')) {
-function lrdd($uri, $debug = false) {
-
- $a = get_app();
-
- // default priority is host priority, host-meta first
-
- $priority = 'host';
-
- // All we have is an email address. Resource-priority is irrelevant
- // because our URI isn't directly resolvable.
-
- if(strstr($uri,'@')) {
- return(webfinger($uri));
- }
-
- // get the host meta file
-
- $host = @parse_url($uri);
-
- if($host) {
- $url = ((x($host,'scheme')) ? $host['scheme'] : 'http') . '://';
- $url .= $host['host'] . '/.well-known/host-meta' ;
- }
- else
- return array();
-
- logger('lrdd: constructed url: ' . $url);
-
- $xml = fetch_url($url);
- $headers = $a->get_curl_headers();
-
- if (! $xml)
- return array();
-
- logger('lrdd: host_meta: ' . $xml, LOGGER_DATA);
-
- if(! stristr($xml,'<xrd'))
- return array();
-
- $h = parse_xml_string($xml);
- if(! $h)
- return array();
-
- $arr = convert_xml_element_to_array($h);
-
- if(isset($arr['xrd']['property'])) {
- $property = $arr['crd']['property'];
- if(! isset($property[0]))
- $properties = array($property);
- else
- $properties = $property;
- foreach($properties as $prop)
- if((string) $prop['@attributes'] === 'http://lrdd.net/priority/resource')
- $priority = 'resource';
- }
-
- // save the links in case we need them
-
- $links = array();
-
- if(isset($arr['xrd']['link'])) {
- $link = $arr['xrd']['link'];
- if(! isset($link[0]))
- $links = array($link);
- else
- $links = $link;
- }
-
- // do we have a template or href?
-
- if(count($links)) {
- foreach($links as $link) {
- if($link['@attributes']['rel'] && attribute_contains($link['@attributes']['rel'],'lrdd')) {
- if(x($link['@attributes'],'template'))
- $tpl = $link['@attributes']['template'];
- elseif(x($link['@attributes'],'href'))
- $href = $link['@attributes']['href'];
- }
- }
- }
-
- if((! isset($tpl)) || (! strpos($tpl,'{uri}')))
- $tpl = '';
-
- if($priority === 'host') {
- if(strlen($tpl))
- $pxrd = str_replace('{uri}', urlencode($uri), $tpl);
- elseif(isset($href))
- $pxrd = $href;
- if(isset($pxrd)) {
- logger('lrdd: (host priority) pxrd: ' . $pxrd);
- $links = fetch_xrd_links($pxrd);
- return $links;
- }
-
- $lines = explode("\n",$headers);
- if(count($lines)) {
- foreach($lines as $line) {
- if((stristr($line,'link:')) && preg_match('/<([^>].*)>.*rel\=[\'\"]lrdd[\'\"]/',$line,$matches)) {
- return(fetch_xrd_links($matches[1]));
- break;
- }
- }
- }
- }
-
-
- // priority 'resource'
-
-
- $html = fetch_url($uri);
- $headers = $a->get_curl_headers();
- logger('lrdd: headers=' . $headers, LOGGER_DEBUG);
-
- // don't try and parse raw xml as html
- if(! strstr($html,'<?xml')) {
- require_once('library/HTML5/Parser.php');
-
- try {
- $dom = HTML5_Parser::parse($html);
- } catch (DOMException $e) {
- logger('lrdd: parse error: ' . $e);
- }
-
- if(isset($dom) && $dom) {
- $items = $dom->getElementsByTagName('link');
- foreach($items as $item) {
- $x = $item->getAttribute('rel');
- if($x == "lrdd") {
- $pagelink = $item->getAttribute('href');
- break;
- }
- }
- }
- }
-
- if(isset($pagelink))
- return(fetch_xrd_links($pagelink));
-
- // next look in HTTP headers
-
- $lines = explode("\n",$headers);
- if(count($lines)) {
- foreach($lines as $line) {
- // TODO alter the following regex to support multiple relations (space separated)
- if((stristr($line,'link:')) && preg_match('/<([^>].*)>.*rel\=[\'\"]lrdd[\'\"]/',$line,$matches)) {
- $pagelink = $matches[1];
- break;
- }
- // don't try and run feeds through the html5 parser
- if(stristr($line,'content-type:') && ((stristr($line,'application/atom+xml')) || (stristr($line,'application/rss+xml'))))
- return array();
- if(stristr($html,'<rss') || stristr($html,'<feed'))
- return array();
- }
- }
-
- if(isset($pagelink))
- return(fetch_xrd_links($pagelink));
-
- // If we haven't found any links, return the host xrd links (which we have already fetched)
-
- if(isset($links))
- return $links;
-
- return array();
+}
-}}
@@ -710,7 +396,7 @@ function lrdd($uri, $debug = false) {
// host. Returns the LRDD template or an empty string on
// error/failure.
-if(! function_exists('fetch_lrdd_template')) {
+
function fetch_lrdd_template($host) {
$tpl = '';
@@ -732,65 +418,13 @@ function fetch_lrdd_template($host) {
if(! strpos($tpl,'{uri}'))
$tpl = '';
return $tpl;
-}}
-
-// Given a URL, retrieve the page as an XRD document.
-// Return an array of links.
-// on error/failure return empty array.
-
-if(! function_exists('fetch_xrd_links')) {
-function fetch_xrd_links($url) {
-
- $xrd_timeout = intval(get_config('system','xrd_timeout'));
- $redirects = 0;
- $xml = fetch_url($url,false,$redirects,(($xrd_timeout) ? $xrd_timeout : 30));
-
- logger('fetch_xrd_links: ' . $xml, LOGGER_DATA);
-
- if ((! $xml) || (! stristr($xml,'<xrd')))
- return array();
-
- // fix diaspora's bad xml
- $xml = str_replace(array('href=&quot;','&quot;/>'),array('href="','"/>'),$xml);
-
- $arr = xml2array($xml);
-
- logger('fetch_xrd_links: ' . print_r($arr,true), LOGGER_DATA);
-
- $links = array();
-
- if(isset($arr['xrd']['link'])) {
- $link = $arr['xrd']['link'];
- if(! isset($link[0]))
- $links = array($link);
- else
- $links = $link;
- }
- if(isset($arr['xrd']['alias'])) {
- $alias = $arr['xrd']['alias'];
- if(! isset($alias[0]))
- $aliases = array($alias);
- else
- $aliases = $alias;
- if(is_array($aliases) && count($aliases)) {
- foreach($aliases as $alias) {
- $links[]['@attributes'] = array('rel' => 'alias' , 'href' => $alias);
- }
- }
- }
-
- logger('fetch_xrd_links: ' . print_r($links,true), LOGGER_DATA);
-
- return $links;
-
-}}
-
+}
// Take a URL from the wild, prepend http:// if necessary
// and check DNS to see if it's real (or check if is a valid IP address)
// return true if it's OK, false if something is wrong with it
-if(! function_exists('validate_url')) {
+
function validate_url(&$url) {
// no naked subdomains (allow localhost for tests)
@@ -804,11 +438,11 @@ function validate_url(&$url) {
return true;
}
return false;
-}}
+}
// checks that email is an actual resolvable internet address
-if(! function_exists('validate_email')) {
+
function validate_email($addr) {
if(get_config('system','disable_email_validation'))
@@ -822,14 +456,14 @@ function validate_email($addr) {
return true;
}
return false;
-}}
+}
// Check $url against our list of allowed sites,
// wildcards allowed. If allowed_sites is unset return true;
// If url is allowed, return true.
// otherwise, return false
-if(! function_exists('allowed_url')) {
+
function allowed_url($url) {
$h = @parse_url($url);
@@ -864,14 +498,14 @@ function allowed_url($url) {
}
}
return $found;
-}}
+}
// check if email address is allowed to register here.
// Compare against our list (wildcards allowed).
// Returns false if not allowed, true if allowed or if
// allowed list is not configured.
-if(! function_exists('allowed_email')) {
+
function allowed_email($email) {
@@ -898,10 +532,10 @@ function allowed_email($email) {
}
}
return $found;
-}}
+}
+
-if(! function_exists('avatar_img')) {
function avatar_img($email) {
$a = get_app();
@@ -914,14 +548,14 @@ function avatar_img($email) {
call_hooks('avatar_lookup', $avatar);
if(! $avatar['success'])
- $avatar['url'] = $a->get_baseurl() . '/images/person-175.jpg';
+ $avatar['url'] = $a->get_baseurl() . '/' . get_default_profile_photo();
logger('Avatar: ' . $avatar['email'] . ' ' . $avatar['url'], LOGGER_DEBUG);
return $avatar['url'];
-}}
+}
+
-if(! function_exists('parse_xml_string')) {
function parse_xml_string($s,$strict = true) {
if($strict) {
if(! strstr($s,'<?xml'))
@@ -940,63 +574,6 @@ function parse_xml_string($s,$strict = true) {
libxml_clear_errors();
}
return $x;
-}}
-
-function add_fcontact($arr,$update = false) {
-
- if($update) {
- $r = q("UPDATE `fcontact` SET
- `name` = '%s',
- `photo` = '%s',
- `request` = '%s',
- `nick` = '%s',
- `addr` = '%s',
- `batch` = '%s',
- `notify` = '%s',
- `poll` = '%s',
- `confirm` = '%s',
- `alias` = '%s',
- `pubkey` = '%s',
- `updated` = '%s'
- WHERE `url` = '%s' AND `network` = '%s' LIMIT 1",
- dbesc($arr['name']),
- dbesc($arr['photo']),
- dbesc($arr['request']),
- dbesc($arr['nick']),
- dbesc($arr['addr']),
- dbesc($arr['batch']),
- dbesc($arr['notify']),
- dbesc($arr['poll']),
- dbesc($arr['confirm']),
- dbesc($arr['alias']),
- dbesc($arr['pubkey']),
- dbesc(datetime_convert()),
- dbesc($arr['url']),
- dbesc($arr['network'])
- );
- }
- else {
- $r = q("insert into fcontact ( `url`,`name`,`photo`,`request`,`nick`,`addr`,
- `batch`, `notify`,`poll`,`confirm`,`network`,`alias`,`pubkey`,`updated` )
- values('%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s')",
- dbesc($arr['url']),
- dbesc($arr['name']),
- dbesc($arr['photo']),
- dbesc($arr['request']),
- dbesc($arr['nick']),
- dbesc($arr['addr']),
- dbesc($arr['batch']),
- dbesc($arr['notify']),
- dbesc($arr['poll']),
- dbesc($arr['confirm']),
- dbesc($arr['network']),
- dbesc($arr['alias']),
- dbesc($arr['pubkey']),
- dbesc(datetime_convert())
- );
- }
-
- return $r;
}
@@ -1005,17 +582,24 @@ function scale_external_images($s, $include_link = true, $scale_replace = false)
$a = get_app();
// Picture addresses can contain special characters
- $s = htmlspecialchars_decode($s);
+ $s = htmlspecialchars_decode($s, ENT_COMPAT);
$matches = null;
- $c = preg_match_all('/\[img.*?\](.*?)\[\/img\]/ism',$s,$matches,PREG_SET_ORDER);
+ $c = preg_match_all('/\[img(.*?)\](.*?)\[\/img\]/ism',$s,$matches,PREG_SET_ORDER);
if($c) {
- require_once('include/Photo.php');
+ require_once('include/photo/photo_driver.php');
+
foreach($matches as $mtch) {
- logger('scale_external_image: ' . $mtch[1]);
+ logger('scale_external_image: ' . $mtch[1] . ' ' . $mtch[2]);
+
+ if(substr($mtch[1],0,1) == '=') {
+ $owidth = intval(substr($mtch[1],1));
+ if(intval($owidth) > 0 && intval($owidth) < 640)
+ continue;
+ }
$hostname = str_replace('www.','',substr($a->get_baseurl(),strpos($a->get_baseurl(),'://')+3));
- if(stristr($mtch[1],$hostname))
+ if(stristr($mtch[2],$hostname))
continue;
// $scale_replace, if passed, is an array of two elements. The
@@ -1024,22 +608,23 @@ function scale_external_images($s, $include_link = true, $scale_replace = false)
// This allows Friendica to display the smaller remote image if
// one exists, while still linking to the full-size image
if($scale_replace)
- $scaled = str_replace($scale_replace[0], $scale_replace[1], $mtch[1]);
+ $scaled = str_replace($scale_replace[0], $scale_replace[1], $mtch[2]);
else
- $scaled = $mtch[1];
- $i = fetch_url($scaled);
+ $scaled = $mtch[2];
+ $i = z_fetch_url($scaled);
+
$cache = get_config('system','itemcache');
if (($cache != '') and is_dir($cache)) {
$cachefile = $cache."/".hash("md5", $scaled);
- file_put_contents($cachefile, $i);
+ file_put_contents($cachefile, $i['body']);
}
// guess mimetype from headers or filename
- $type = guess_image_type($mtch[1],true);
+ $type = guess_image_type($mtch[2],$i['header']);
- if($i) {
- $ph = new Photo($i, $type);
+ if($i['success']) {
+ $ph = photo_factory($i['body'], $type);
if($ph->is_valid()) {
$orig_width = $ph->getWidth();
$orig_height = $ph->getHeight();
@@ -1052,7 +637,7 @@ function scale_external_images($s, $include_link = true, $scale_replace = false)
logger('scale_external_images: ' . $orig_width . '->' . $new_width . 'w ' . $orig_height . '->' . $new_height . 'h' . ' match: ' . $mtch[0], LOGGER_DEBUG);
$s = str_replace($mtch[0],'[img=' . $new_width . 'x' . $new_height. ']' . $scaled . '[/img]'
. "\n" . (($include_link)
- ? '[url=' . $mtch[1] . ']' . t('view full size') . '[/url]' . "\n"
+ ? '[zrl=' . $mtch[2] . ']' . t('view full size') . '[/zrl]' . "\n"
: ''),$s);
logger('scale_external_images: new string: ' . $s, LOGGER_DEBUG);
}
@@ -1068,52 +653,6 @@ function scale_external_images($s, $include_link = true, $scale_replace = false)
return $s;
}
-
-function fix_contact_ssl_policy(&$contact,$new_policy) {
-
- $ssl_changed = false;
- if((intval($new_policy) == SSL_POLICY_SELFSIGN || $new_policy === 'self') && strstr($contact['url'],'https:')) {
- $ssl_changed = true;
- $contact['url'] = str_replace('https:','http:',$contact['url']);
- $contact['request'] = str_replace('https:','http:',$contact['request']);
- $contact['notify'] = str_replace('https:','http:',$contact['notify']);
- $contact['poll'] = str_replace('https:','http:',$contact['poll']);
- $contact['confirm'] = str_replace('https:','http:',$contact['confirm']);
- $contact['poco'] = str_replace('https:','http:',$contact['poco']);
- }
-
- if((intval($new_policy) == SSL_POLICY_FULL || $new_policy === 'full') && strstr($contact['url'],'http:')) {
- $ssl_changed = true;
- $contact['url'] = str_replace('http:','https:',$contact['url']);
- $contact['request'] = str_replace('http:','https:',$contact['request']);
- $contact['notify'] = str_replace('http:','https:',$contact['notify']);
- $contact['poll'] = str_replace('http:','https:',$contact['poll']);
- $contact['confirm'] = str_replace('http:','https:',$contact['confirm']);
- $contact['poco'] = str_replace('http:','https:',$contact['poco']);
- }
-
- if($ssl_changed) {
- q("update contact set
- url = '%s',
- request = '%s',
- notify = '%s',
- poll = '%s',
- confirm = '%s',
- poco = '%s'
- where id = %d limit 1",
- dbesc($contact['url']),
- dbesc($contact['request']),
- dbesc($contact['notify']),
- dbesc($contact['poll']),
- dbesc($contact['confirm']),
- dbesc($contact['poco']),
- intval($contact['id'])
- );
- }
-}
-
-
-
/**
* xml2array() will convert the given XML text to an array in the XML structure.
* Link: http://www.bin-co.com/php/scripts/xml2array/
@@ -1278,7 +817,7 @@ function xml2array($contents, $namespaces = true, $get_attributes=1, $priority =
}
-function email_header_encode($in_str, $charset) {
+function email_header_encode($in_str, $charset = 'UTF-8') {
$out_str = $in_str;
$need_to_convert = false;
diff --git a/include/notifier.php b/include/notifier.php
index b22f77d91..0868ac77e 100644
--- a/include/notifier.php
+++ b/include/notifier.php
@@ -1,4 +1,4 @@
-<?php
+<?php /** @file */
require_once("boot.php");
require_once('include/queue_fn.php');
@@ -53,6 +53,9 @@ require_once('include/html2plain.php');
*
* ZOT
* permission_update abook_id
+ * refresh_all channel_id
+ * purge_all channel_id
+ * expire channel_id
* relay item_id (item was relayed to owner, we will deliver it as owner)
*
*/
@@ -136,6 +139,7 @@ function notifier_run($argv, $argc){
$recipients = array();
$url_recipients = array();
$normal_mode = true;
+ $packet_type = 'undefined';
if($cmd === 'mail') {
$normal_mode = false;
@@ -164,14 +168,24 @@ function notifier_run($argv, $argc){
elseif($cmd === 'expire') {
$normal_mode = false;
$expire = true;
- $items = q("SELECT * FROM `item` WHERE `uid` = %d AND `wall` = 1
- AND `deleted` = 1 AND `changed` > UTC_TIMESTAMP() - INTERVAL 10 MINUTE",
- intval($item_id)
+ $items = q("SELECT * FROM item WHERE uid = %d AND ( item_flags & %d )
+ AND ( item_restrict & %d ) AND `changed` > UTC_TIMESTAMP() - INTERVAL 10 MINUTE",
+ intval($item_id),
+ intval(ITEM_WALL),
+ intval(ITEM_DELETED)
);
$uid = $item_id;
$item_id = 0;
- if(! count($items))
+ if(! $items)
return;
+
+// FIXME
+// This will require a special zot packet containing a list of item message_id's to be expired.
+// This packet will be public, since we cannot selectively deliver here.
+// We need the handling on this end to create the array, and the handling on the remote end
+// to verify permissions (for each item) and process it. Until this is complete, the expire feature will be disabled.
+
+ return;
}
elseif($cmd === 'suggest') {
$normal_mode = false;
@@ -186,6 +200,46 @@ function notifier_run($argv, $argc){
$recipients[] = $suggest[0]['cid'];
$item = $suggest[0];
}
+ elseif($cmd === 'refresh_all') {
+ logger('notifier: refresh_all: ' . $item_id);
+ $s = q("select * from channel where channel_id = %d limit 1",
+ intval($item_id)
+ );
+ if($s)
+ $channel = $s[0];
+ $uid = $item_id;
+ $recipients = array();
+ $r = q("select abook_xchan from abook where abook_channel = %d",
+ intval($item_id)
+ );
+ if($r) {
+ foreach($r as $rr) {
+ $recipients[] = $rr['abook_xchan'];
+ }
+ }
+ $private = false;
+ $packet_type = 'refresh';
+ }
+ elseif($cmd === 'purge_all') {
+ logger('notifier: purge_all: ' . $item_id);
+ $s = q("select * from channel where channel_id = %d limit 1",
+ intval($item_id)
+ );
+ if($s)
+ $channel = $s[0];
+ $uid = $item_id;
+ $recipients = array();
+ $r = q("select abook_xchan from abook where abook_channel = %d",
+ intval($item_id)
+ );
+ if($r) {
+ foreach($r as $rr) {
+ $recipients[] = $rr['abook_xchan'];
+ }
+ }
+ $private = false;
+ $packet_type = 'purge';
+ }
else {
// Normal items
@@ -208,6 +262,25 @@ function notifier_run($argv, $argc){
if($target_item['item_restrict'] & ITEM_DELETED)
logger('notifier: target item ITEM_DELETED', LOGGER_DEBUG);
+ if($target_item['item_restrict'] & ITEM_DELAYED_PUBLISH) {
+ logger('notifier: target item ITEM_DELAYED_PUBLISH', LOGGER_DEBUG);
+ return;
+ }
+
+ if($target_item['item_restrict'] & ITEM_WEBPAGE) {
+ logger('notifier: target item ITEM_WEBPAGE', LOGGER_DEBUG);
+ return;
+ }
+
+ if($target_item['item_restrict'] & ITEM_BUILDBLOCK) {
+ logger('notifier: target item ITEM_BUILDBLOCK', LOGGER_DEBUG);
+ return;
+ }
+
+ if($target_item['item_restrict'] & ITEM_PDL) {
+ logger('notifier: target item ITEM_PDL', LOGGER_DEBUG);
+ return;
+ }
$s = q("select * from channel where channel_id = %d limit 1",
intval($target_item['uid'])
@@ -252,12 +325,13 @@ function notifier_run($argv, $argc){
// tag_deliver'd post which needs to be sent back to the original author
if(($cmd === 'uplink') && ($parent_item['item_flags'] & ITEM_UPLINK) && (! $top_level_post)) {
- $uplink = true;
+ logger('notifier: uplink');
+ $uplink = true;
}
if(($relay_to_owner || $uplink) && ($cmd !== 'relay')) {
logger('notifier: followup relay', LOGGER_DEBUG);
- $recipients = array(($uplink) ? $parent_item['author_xchan'] : $parent_item['owner_xchan']);
+ $recipients = array(($uplink) ? $parent_item['source_xchan'] : $parent_item['owner_xchan']);
$private = true;
if(! $encoded_item['flags'])
$encoded_item['flags'] = array();
@@ -295,40 +369,83 @@ function notifier_run($argv, $argc){
// Generic delivery section, we have an encoded item and recipients
// Now start the delivery process
- logger('notifier: encoded item: ' . print_r($encoded_item,true));
+ $x = $encoded_item;
+ $x['title'] = 'private';
+ $x['body'] = 'private';
+ logger('notifier: encoded item: ' . print_r($x,true), LOGGER_DATA);
stringify_array_elms($recipients);
if(! $recipients)
return;
- logger('notifier: recipients: ' . print_r($recipients,true));
+// logger('notifier: recipients: ' . print_r($recipients,true));
- $env_recips = null;
- if($private) {
- $r = q("select xchan_guid, xchan_guid_sig from xchan where xchan_hash in (" . implode(',',$recipients) . ")");
- if($r) {
- $env_recips = array();
- foreach($r as $rr)
- $env_recips[] = array('guid' => $rr['xchan_guid'],'guid_sig' => $rr['xchan_guid_sig']);
+ $env_recips = (($private) ? array() : null);
+
+ $details = q("select xchan_hash, xchan_instance_url, xchan_addr, xchan_guid, xchan_guid_sig from xchan where xchan_hash in (" . implode(',',$recipients) . ")");
+
+ $recip_list = array();
+
+ if($details) {
+ foreach($details as $d) {
+
+ // If the recipient is federated from a traditional network they won't be able to
+ // handle nomadic identity. If we're publishing from a site that they aren't
+ // directly connected with, ignore them.
+
+ // FIXME: make sure we run through a notifier loop on the hub they're connected
+ // with if this post comes in from a different hub - so that we will deliver to them.
+
+ // On the down side, these channels will stop working if the hub they connected with
+ // goes down permanently, as they are (doh) not nomadic.
+
+ if(($d['xchan_instance_url']) && ($d['xchan_instance_url'] != z_root()))
+ continue;
+
+
+ $recip_list[] = $d['xchan_addr'] . ' (' . $d['xchan_hash'] . ')';
+ if($private)
+ $env_recips[] = array('guid' => $d['xchan_guid'],'guid_sig' => $d['xchan_guid_sig']);
}
}
+ if(($private) && (! $env_recips)) {
+ // shouldn't happen
+ logger('notifier: private message with no envelope recipients.' . print_r($argv,true));
+ }
+
+ logger('notifier: recipients (may be delivered to more if public): ' . print_r($recip_list,true), LOGGER_DEBUG);
+
+
// Now we have collected recipients (except for external mentions, FIXME)
// Let's reduce this to a set of hubs.
// for public posts always include our own hub
- $sql_extra = (($private) ? "" : " or hubloc_url = '" . z_root() . "' ");
+ $sql_extra = (($private) ? "" : " or hubloc_url = '" . dbesc(z_root()) . "' ");
- $r = q("select distinct(hubloc_callback),hubloc_host,hubloc_sitekey from hubloc
- where hubloc_hash in (" . implode(',',$recipients) . ") $sql_extra group by hubloc_callback");
+ $r = q("select hubloc_sitekey, hubloc_flags, hubloc_callback, hubloc_host from hubloc
+ where hubloc_hash in (" . implode(',',$recipients) . ") $sql_extra group by hubloc_sitekey");
if(! $r) {
logger('notifier: no hubs');
return;
}
$hubs = $r;
+ $hublist = array();
+ $keys = array();
+
+ foreach($hubs as $hub) {
+ // don't try to deliver to deleted hublocs - and inexplicably SQL "distinct" and "group by"
+ // both return records with duplicate keys in rare circumstances
+ if((! ($hub['hubloc_flags'] & HUBLOC_FLAGS_DELETED)) && (! in_array($hub['hubloc_sitekey'],$keys))) {
+ $hublist[] = $hub['hubloc_host'];
+ $keys[] = $hub['hubloc_sitekey'];
+ }
+ }
+
+ logger('notifier: will notify/deliver to these hubs: ' . print_r($hublist,true), LOGGER_DEBUG);
$interval = ((get_config('system','delivery_interval') !== false)
? intval(get_config('system','delivery_interval')) : 2 );
@@ -342,18 +459,34 @@ function notifier_run($argv, $argc){
foreach($hubs as $hub) {
$hash = random_string();
- $n = zot_build_packet($channel,'notify',$env_recips,(($private) ? $hub['hubloc_sitekey'] : null),$hash);
- q("insert into outq ( outq_hash, outq_account, outq_channel, outq_posturl, outq_async, outq_created, outq_updated, outq_notify, outq_msg ) values ( '%s', %d, %d, '%s', %d, '%s', '%s', '%s', '%s' )",
- dbesc($hash),
- intval($target_item['aid']),
- intval($target_item['uid']),
- dbesc($hub['hubloc_callback']),
- intval(1),
- dbesc(datetime_convert()),
- dbesc(datetime_convert()),
- dbesc($n),
- dbesc(json_encode($encoded_item))
- );
+ if($packet_type === 'refresh' || $packet_type === 'purge') {
+ $n = zot_build_packet($channel,$packet_type);
+ q("insert into outq ( outq_hash, outq_account, outq_channel, outq_posturl, outq_async, outq_created, outq_updated, outq_notify, outq_msg ) values ( '%s', %d, %d, '%s', %d, '%s', '%s', '%s', '%s' )",
+ dbesc($hash),
+ intval($channel['channel_account_id']),
+ intval($channel['channel_id']),
+ dbesc($hub['hubloc_callback']),
+ intval(1),
+ dbesc(datetime_convert()),
+ dbesc(datetime_convert()),
+ dbesc($n),
+ dbesc('')
+ );
+ }
+ else {
+ $n = zot_build_packet($channel,'notify',$env_recips,(($private) ? $hub['hubloc_sitekey'] : null),$hash);
+ q("insert into outq ( outq_hash, outq_account, outq_channel, outq_posturl, outq_async, outq_created, outq_updated, outq_notify, outq_msg ) values ( '%s', %d, %d, '%s', %d, '%s', '%s', '%s', '%s' )",
+ dbesc($hash),
+ intval($target_item['aid']),
+ intval($target_item['uid']),
+ dbesc($hub['hubloc_callback']),
+ intval(1),
+ dbesc(datetime_convert()),
+ dbesc(datetime_convert()),
+ dbesc($n),
+ dbesc(json_encode($encoded_item))
+ );
+ }
$deliver[] = $hash;
if(count($deliver) >= $deliveries_per_process) {
@@ -369,12 +502,16 @@ function notifier_run($argv, $argc){
if(count($deliver)) {
proc_run('php','include/deliver.php',$deliver);
}
+
+ logger('notifier: basic loop complete.', LOGGER_DEBUG);
if($normal_mode)
call_hooks('notifier_normal',$target_item);
+
call_hooks('notifier_end',$target_item);
+ logger('notifer: complete.');
return;
}
diff --git a/include/notify.php b/include/notify.php
index 3bfd1e58c..aa96fa279 100644
--- a/include/notify.php
+++ b/include/notify.php
@@ -1,4 +1,4 @@
-<?php
+<?php /** @file */
function format_notification($item) {
diff --git a/include/oauth.php b/include/oauth.php
index 99fc16eef..8eb8a83d8 100644
--- a/include/oauth.php
+++ b/include/oauth.php
@@ -1,4 +1,4 @@
-<?php
+<?php /** @file */
/**
* OAuth server
* Based on oauth2-php <http://code.google.com/p/oauth2-php/>
@@ -18,11 +18,12 @@ class FKOAuthDataStore extends OAuthDataStore {
function lookup_consumer($consumer_key) {
logger(__function__.":".$consumer_key);
- //echo "<pre>"; var_dump($consumer_key); killme();
-
+// echo "<pre>"; var_dump($consumer_key); killme();
+
$r = q("SELECT client_id, pw, redirect_uri FROM clients WHERE client_id='%s'",
dbesc($consumer_key)
);
+
if (count($r))
return new OAuthConsumer($r[0]['client_id'],$r[0]['pw'],$r[0]['redirect_uri']);
return null;
@@ -30,11 +31,13 @@ class FKOAuthDataStore extends OAuthDataStore {
function lookup_token($consumer, $token_type, $token) {
logger(__function__.":".$consumer.", ". $token_type.", ".$token);
+
$r = q("SELECT id, secret,scope, expires, uid FROM tokens WHERE client_id='%s' AND scope='%s' AND id='%s'",
dbesc($consumer->key),
dbesc($token_type),
dbesc($token)
);
+
if (count($r)){
$ot=new OAuthToken($r[0]['id'],$r[0]['secret']);
$ot->scope=$r[0]['scope'];
@@ -46,12 +49,14 @@ class FKOAuthDataStore extends OAuthDataStore {
}
function lookup_nonce($consumer, $token, $nonce, $timestamp) {
- //echo __file__.":".__line__."<pre>"; var_dump($consumer,$key); killme();
+// echo __file__.":".__line__."<pre>"; var_dump($consumer,$key); killme();
+
$r = q("SELECT id, secret FROM tokens WHERE client_id='%s' AND id='%s' AND expires=%d",
dbesc($consumer->key),
dbesc($nonce),
intval($timestamp)
);
+
if (count($r))
return new OAuthToken($r[0]['id'],$r[0]['secret']);
return null;
@@ -67,13 +72,14 @@ class FKOAuthDataStore extends OAuthDataStore {
} else {
$k = $consumer;
}
-
+
$r = q("INSERT INTO tokens (id, secret, client_id, scope, expires) VALUES ('%s','%s','%s','%s', UNIX_TIMESTAMP()+%d)",
dbesc($key),
dbesc($sec),
dbesc($k),
'request',
intval(REQUEST_TOKEN_DURATION));
+
if (!$r) return null;
return new OAuthToken($key,$sec);
}
@@ -95,6 +101,7 @@ class FKOAuthDataStore extends OAuthDataStore {
$key = $this->gen_token();
$sec = $this->gen_token();
+
$r = q("INSERT INTO tokens (id, secret, client_id, scope, expires, uid) VALUES ('%s','%s','%s','%s', UNIX_TIMESTAMP()+%d, %d)",
dbesc($key),
dbesc($sec),
@@ -102,6 +109,7 @@ class FKOAuthDataStore extends OAuthDataStore {
'access',
intval(ACCESS_TOKEN_DURATION),
intval($uverifier));
+
if ($r)
$ret = new OAuthToken($key,$sec);
}
@@ -131,9 +139,9 @@ class FKOAuth1 extends OAuthServer {
}
function loginUser($uid){
- logger("FKOAuth1::loginUser $uid");
+ logger("RedOAuth1::loginUser $uid");
$a = get_app();
- $r = q("SELECT * FROM `user` WHERE uid=%d AND `blocked` = 0 AND `account_expired` = 0 AND `verified` = 1 LIMIT 1",
+ $r = q("SELECT * FROM channel WHERE channel_id = %d LIMIT 1",
intval($uid)
);
if(count($r)){
@@ -143,35 +151,43 @@ class FKOAuth1 extends OAuthServer {
header('HTTP/1.0 401 Unauthorized');
die('This api requires login');
}
- $_SESSION['uid'] = $record['uid'];
- $_SESSION['theme'] = $record['theme'];
- $_SESSION['mobile-theme'] = get_pconfig($record['uid'], 'system', 'mobile_theme');
+
+ $_SESSION['uid'] = $record['channel_id'];
+ $_SESSION['theme'] = $record['channel_theme'];
+ $_SESSION['account_id'] = $record['channel_account_id'];
+ $_SESSION['mobile_theme'] = get_pconfig($record['channel_id'], 'system', 'mobile_theme');
$_SESSION['authenticated'] = 1;
- $_SESSION['page_flags'] = $record['page-flags'];
- $_SESSION['my_url'] = $a->get_baseurl() . '/channel/' . $record['nickname'];
+ $_SESSION['my_url'] = $a->get_baseurl() . '/channel/' . $record['channel_address'];
$_SESSION['addr'] = $_SERVER['REMOTE_ADDR'];
+ $_SESSION['allow_api'] = true;
+ $x = q("select * from account where account_id = %d limit 1",
+ intval($record['channel_account_id'])
+ );
+ if($x)
+ $a->account = $x[0];
- //notice( t("Welcome back ") . $record['username'] . EOL);
- $a->user = $record;
+ change_channel($record['channel_id']);
- if(strlen($a->user['timezone'])) {
- date_default_timezone_set($a->user['timezone']);
- $a->timezone = $a->user['timezone'];
- }
+ $a->channel = $record;
- $r = q("SELECT * FROM `contact` WHERE `uid` = %s AND `self` = 1 LIMIT 1",
- intval($_SESSION['uid']));
- if(count($r)) {
- $a->contact = $r[0];
- $a->cid = $r[0]['id'];
- $_SESSION['cid'] = $a->cid;
+ if(strlen($a->channel['channel_timezone'])) {
+ date_default_timezone_set($a->channel['channel_timezone']);
+// $a->timezone = $a->user['timezone'];
}
- q("UPDATE `user` SET `login_date` = '%s' WHERE `uid` = %d LIMIT 1",
- dbesc(datetime_convert()),
- intval($_SESSION['uid'])
- );
- call_hooks('logged_in', $a->user);
+// $r = q("SELECT * FROM `contact` WHERE `uid` = %s AND `self` = 1 LIMIT 1",
+// intval($_SESSION['uid']));
+// if(count($r)) {
+// $a->contact = $r[0];
+// $a->cid = $r[0]['id'];
+// $_SESSION['cid'] = $a->cid;
+// }
+// q("UPDATE `user` SET `login_date` = '%s' WHERE `uid` = %d LIMIT 1",
+// dbesc(datetime_convert()),
+// intval($_SESSION['uid'])
+// );
+//
+// call_hooks('logged_in', $a->user);
}
}
diff --git a/include/oembed.php b/include/oembed.php
index 6fc4c5371..520b69892 100755
--- a/include/oembed.php
+++ b/include/oembed.php
@@ -1,4 +1,4 @@
-<?php
+<?php /** @file */
function oembed_replacecb($matches){
// logger('oembedcb');
$embedurl=$matches[1];
@@ -29,7 +29,11 @@ function oembed_fetch_url($embedurl){
if (!in_array($ext, $noexts)){
// try oembed autodiscovery
$redirects = 0;
- $html_text = fetch_url($embedurl, false, $redirects, 15, "text/*");
+
+ $result = z_fetch_url($embedurl, false, $redirects, array('timeout' => 15, 'accept_content' => "text/*", 'novalidate' => true ));
+ if($result['success'])
+ $html_text = $result['body'];
+
if($html_text){
$dom = @DOMDocument::loadHTML($html_text);
if ($dom){
@@ -40,17 +44,25 @@ function oembed_fetch_url($embedurl){
$entries = $xpath->query("//link[@type='application/json+oembed']");
foreach($entries as $e){
$href = $e->getAttributeNode("href")->nodeValue;
- $txt = fetch_url($href . '&maxwidth=' . $a->videowidth);
+ $x = z_fetch_url($href . '&maxwidth=' . $a->videowidth);
+ $txt = $x['body'];
break;
}
}
}
}
- if ($txt==false || $txt==""){
+ if ($txt==false || $txt=="") {
+ $x = array('url' => $embedurl,'videowidth' => $a->videowidth);
+ call_hooks('oembed_probe',$x);
+ if(array_key_exists('embed',$x))
+ $txt = $x['embed'];
+
// try oohembed service
- $ourl = "http://oohembed.com/oohembed/?url=".urlencode($embedurl).'&maxwidth=' . $a->videowidth;
- $txt = fetch_url($ourl);
+// $ourl = "http://oohembed.com/oohembed/?url=".urlencode($embedurl).'&maxwidth=' . $a->videowidth;
+// $result = z_fetch_url($ourl);
+// if($result['success'])
+// $txt = $result['body'];
}
$txt=trim($txt);
@@ -112,6 +124,7 @@ function oembed_format_object($j){
if ( $j->type!='rich' || !strpos($j->html,$embedurl) ){
$embedlink = (isset($j->title))?$j->title:$embedurl;
$ret .= "<a href='$embedurl' rel='oembed'>$embedlink</a>";
+ $ret .= "<br>";
if (isset($j->author_name)) $ret.=" by ".$j->author_name;
if (isset($j->provider_name)) $ret.=" on ".$j->provider_name;
} else {
diff --git a/include/onedirsync.php b/include/onedirsync.php
new file mode 100644
index 000000000..8ae1df5e5
--- /dev/null
+++ b/include/onedirsync.php
@@ -0,0 +1,61 @@
+<?php /** @file */
+
+require_once('boot.php');
+require_once('include/cli_startup.php');
+require_once('include/zot.php');
+require_once('include/dir_fns.php');
+
+
+function onedirsync_run($argv, $argc){
+
+
+ cli_startup();
+ $a = get_app();
+
+ logger('onedirsync: start ' . intval($argv[1]));
+
+ if(($argc > 1) && (intval($argv[1])))
+ $update_id = intval($argv[1]);
+
+ if(! $update_id) {
+ logger('onedirsync: no update');
+ return;
+ }
+
+ $r = q("select * from updates where ud_id = %d limit 1",
+ intval($update_id)
+ );
+
+ if(! $r)
+ return;
+ if(($r[0]['ud_flags'] & UPDATE_FLAGS_UPDATED) || (! $r[0]['ud_addr']))
+ return;
+
+ // Have we probed this channel more recently than the other directory server
+ // (where we received this update from) ?
+ // If we have, we don't need to do anything except mark any older entries updated
+
+ $x = q("select * from updates where ud_addr = '%s' and ud_date > '%s' and ( ud_flags & %d ) order by ud_date desc limit 1",
+ dbesc($r[0]['ud_addr']),
+ dbesc($r[0]['ud_date']),
+ intval(UPDATE_FLAGS_UPDATED)
+ );
+ if($x) {
+ $y = q("update updates set ud_flags = ( ud_flags | %d ) where ud_addr = '%s' and not ( ud_flags & %d ) and ud_date < '%s' ",
+ intval(UPDATE_FLAGS_UPDATED),
+ dbesc($r[0]['ud_addr']),
+ intval(UPDATE_FLAGS_UPDATED),
+ dbesc($x[0]['ud_date'])
+ );
+ return;
+ }
+
+ update_directory_entry($r[0]);
+
+ return;
+}
+
+if (array_search(__file__,get_included_files())===0){
+ onedirsync_run($argv,$argc);
+ killme();
+}
diff --git a/include/onepoll.php b/include/onepoll.php
index 8b0c5211b..a821b76cf 100644
--- a/include/onepoll.php
+++ b/include/onepoll.php
@@ -1,4 +1,4 @@
-<?php
+<?php /** @file */
require_once('boot.php');
require_once('include/cli_startup.php');
@@ -36,11 +36,12 @@ function onepoll_run($argv, $argc){
$contacts = q("SELECT abook.*, xchan.*, account.*
FROM abook LEFT JOIN account on abook_account = account_id left join xchan on xchan_hash = abook_xchan
where abook_id = %d
- AND (( abook_flags = %d ) OR ( abook_flags = %d ))
+ AND (( abook_flags = %d ) OR ( abook_flags = %d ) OR ( abook_flags & %d ))
AND (( account_flags = %d ) OR ( account_flags = %d )) limit 1",
intval($contact_id),
intval(ABOOK_FLAG_HIDDEN),
intval(0),
+ intval(ABOOK_FLAG_PENDING),
intval(ACCOUNT_OK),
intval(ACCOUNT_UNVERIFIED)
);
@@ -67,9 +68,9 @@ function onepoll_run($argv, $argc){
logger("onepoll: poll: ({$contact['id']}) IMPORTER: {$importer['xchan_name']}, CONTACT: {$contact['xchan_name']}");
- $last_update = (($contact['abook_updated'] === '0000-00-00 00:00:00')
+ $last_update = ((($contact['abook_updated'] === $contact['abook_created']) || ($contact['abook_updated'] === '0000-00-00 00:00:00'))
? datetime_convert('UTC','UTC','now - 7 days')
- : datetime_convert('UTC','UTC',$contact['abook_updated'])
+ : datetime_convert('UTC','UTC',$contact['abook_updated'] . ' - 2 days')
);
// update permissions
@@ -98,16 +99,31 @@ function onepoll_run($argv, $argc){
return;
if($contact['xchan_connurl']) {
- $feedurl = str_replace('/poco/','/zotfeed/',$channel['xchan_connurl']);
-
- $x = z_fetch_url($feedurl . '?f=$mindate=' . $last_update);
- if($x['success']) {
+ $fetch_feed = true;
+ $x = null;
+
+ if(! ($contact['abook_their_perms'] & PERMS_R_STREAM ))
+ $fetch_feed = false;
+
+ if($fetch_feed) {
+
+ $feedurl = str_replace('/poco/','/zotfeed/',$contact['xchan_connurl']);
+ $x = z_fetch_url($feedurl . '?f=&mindate=' . urlencode($last_update));
+
+ logger('feed_update: ' . print_r($x,true), LOGGER_DATA);
+
+ }
+
+ if(($x) && ($x['success'])) {
$total = 0;
+ logger('onepoll: feed update ' . $contact['xchan_name']);
+
$j = json_decode($x['body'],true);
if($j['success'] && $j['messages']) {
foreach($j['messages'] as $message) {
- $results = process_delivery(array('hash' => $contact['xchan_hash']),$message,
+ $results = process_delivery(array('hash' => $contact['xchan_hash']), get_item_elements($message),
array(array('hash' => $importer['xchan_hash'])), false);
+ logger('onepoll: feed_update: process_delivery: ' . print_r($results,true));
$total ++;
}
logger("onepoll: $total messages processed");
diff --git a/include/page_widgets.php b/include/page_widgets.php
new file mode 100644
index 000000000..d70281afc
--- /dev/null
+++ b/include/page_widgets.php
@@ -0,0 +1,39 @@
+<?php
+
+// A basic toolbar for observers with write_pages permissions
+function writepages_widget ($who,$which){
+ return replace_macros(get_markup_template('write_pages.tpl'), array(
+ '$new' => t('New Page'),
+ '$newurl' => "webpages/$who",
+ '$edit' => t('Edit'),
+ '$editurl' => "editwebpage/$who/$which"
+ ));
+}
+
+
+
+// Chan is channel_id, $who is channel_address - we'll need to pass observer later too.
+function pagelist_widget ($chan,$who){
+ $r = q("select * from item_id where uid = %d and service = 'WEBPAGE' order by sid asc",
+ intval($chan)
+ );
+ $pages = null;
+// TODO - only list public pages. Doesn't matter for now, since we don't have ACL anyway.
+
+ if($r) {
+ $pages = array();
+ foreach($r as $rr) {
+ $pages[$rr['iid']][] = array('url' => $rr['iid'],'title' => $rr['sid']);
+ }
+ }
+
+ return replace_macros(get_markup_template('webpagelist.tpl'), array(
+ '$baseurl' => $url,
+ '$edit' => '',
+ '$pages' => $pages,
+ '$channel' => $who,
+ '$preview' => '',
+ '$widget' => 1,
+ ));
+
+}
diff --git a/include/permissions.php b/include/permissions.php
index 72e002ace..45ea7c3eb 100644
--- a/include/permissions.php
+++ b/include/permissions.php
@@ -1,4 +1,4 @@
-<?php
+<?php /** @file */
function get_perms() {
@@ -23,11 +23,12 @@ function get_perms() {
'post_comments' => array('channel_w_comment', intval(PERMS_W_COMMENT), false, t('Can comment on my posts'), ''),
'post_mail' => array('channel_w_mail', intval(PERMS_W_MAIL), false, t('Can send me private mail messages'), ''),
'post_photos' => array('channel_w_photos', intval(PERMS_W_PHOTOS), false, t('Can post photos to my photo albums'), ''),
- 'tag_deliver' => array('channel_w_tagwall', intval(PERMS_W_TAGWALL), false, t('Can forward to all my channel contacts via post tags'), t('Advanced - useful for creating group forum channels')),
+ 'tag_deliver' => array('channel_w_tagwall', intval(PERMS_W_TAGWALL), false, t('Can forward to all my channel contacts via post @mentions'), t('Advanced - useful for creating group forum channels')),
'chat' => array('channel_w_chat', intval(PERMS_W_CHAT), false, t('Can chat with me (when available)'), t('Requires compatible chat plugin')),
'write_storage' => array('channel_w_storage', intval(PERMS_W_STORAGE), false, t('Can write to my "public" file storage'), ''),
'write_pages' => array('channel_w_pages', intval(PERMS_W_PAGES), false, t('Can edit my "public" pages'), ''),
+ 'republish' => array('channel_a_republish', intval(PERMS_A_REPUBLISH), false, t('Can source my "public" posts in derived channels'), t('Somewhat advanced - very useful in open communities')),
'delegate' => array('channel_a_delegate', intval(PERMS_A_DELEGATE), false, t('Can administer my channel resources'), t('Extremely advanced. Leave this alone unless you know what you are doing')),
);
$ret = array('global_permissions' => $global_perms);
@@ -168,6 +169,13 @@ function get_all_perms($uid,$observer_xchan,$internal_use = true) {
$ret[$perm_name] = false;
continue;
}
+
+ // They are in your address book, but haven't been approved
+
+ if($x[0]['abook_flags'] & ABOOK_FLAG_PENDING) {
+ $ret[$perm_name] = false;
+ continue;
+ }
if(($r) && ($r[0][$channel_perm] & PERMS_CONTACTS)) {
@@ -192,6 +200,8 @@ function get_all_perms($uid,$observer_xchan,$internal_use = true) {
continue;
}
+
+
$arr = array(
'channel_id' => $uid,
'observer_hash' => $observer_xchan,
@@ -282,6 +292,10 @@ function perm_is_allowed($uid,$observer_xchan,$permission) {
return false;
}
+ if($x[0]['abook_flags'] & ABOOK_FLAG_PENDING) {
+ return false;
+ }
+
if($r[0][$channel_perm] & PERMS_CONTACTS) {
return true;
}
@@ -315,3 +329,38 @@ function check_list_permissions($uid,$arr,$perm) {
return($result);
}
+
+
+function site_default_perms() {
+
+ $typical = array(
+ 'view_stream' => PERMS_PUBLIC,
+ 'view_profile' => PERMS_PUBLIC,
+ 'view_photos' => PERMS_PUBLIC,
+ 'view_contacts' => PERMS_PUBLIC,
+ 'view_storage' => PERMS_PUBLIC,
+ 'view_pages' => PERMS_PUBLIC,
+ 'send_stream' => PERMS_SPECIFIC,
+ 'post_wall' => PERMS_SPECIFIC,
+ 'post_comments' => PERMS_SPECIFIC,
+ 'post_mail' => PERMS_SPECIFIC,
+ 'post_photos' => 0,
+ 'tag_deliver' => PERMS_SPECIFIC,
+ 'chat' => PERMS_SPECIFIC,
+ 'write_storage' => 0,
+ 'write_pages' => 0,
+ 'delegate' => 0,
+ );
+
+
+ $global_perms = get_perms();
+ $ret = array();
+
+ foreach($global_perms as $perm => $v) {
+ $x = get_config('default_perms',$perm);
+ if($x === false)
+ $x = $typical[$perm];
+ $ret[$perm] = $x;
+ }
+ return $ret;
+}
diff --git a/include/photo/photo_driver.php b/include/photo/photo_driver.php
new file mode 100644
index 000000000..debe1bc38
--- /dev/null
+++ b/include/photo/photo_driver.php
@@ -0,0 +1,668 @@
+<?php /** @file */
+
+function photo_factory($data, $type = null) {
+ $ph = null;
+
+ if(class_exists('Imagick')) {
+ require_once('include/photo/photo_imagick.php');
+ $ph = new photo_imagick($data,$type);
+ }
+ else {
+ require_once('include/photo/photo_gd.php');
+ $ph = new photo_gd($data,$type);
+ }
+
+ return $ph;
+}
+
+
+
+
+abstract class photo_driver {
+
+ protected $image;
+ protected $width;
+ protected $height;
+ protected $valid;
+ protected $type;
+ protected $types;
+
+ abstract function supportedTypes();
+
+ abstract function load($data,$type);
+
+ abstract function destroy();
+
+ abstract function setDimensions();
+
+ abstract function getImage();
+
+ abstract function doScaleImage($new_width,$new_height);
+
+ abstract function rotate($degrees);
+
+ abstract function flip($horiz = true, $vert = false);
+
+ abstract function cropImage($max,$x,$y,$w,$h);
+
+ abstract function imageString();
+
+
+ public function __construct($data, $type='') {
+ $this->types = $this->supportedTypes();
+ if (! array_key_exists($type,$this->types)){
+ $type='image/jpeg';
+ }
+ $this->type = $type;
+ $this->valid = false;
+ $this->load($data,$type);
+ }
+
+ public function __destruct() {
+ if($this->is_valid())
+ $this->destroy();
+ }
+
+ public function is_valid() {
+ return $this->valid;
+ }
+
+ public function getWidth() {
+ if(!$this->is_valid())
+ return FALSE;
+ return $this->width;
+ }
+
+ public function getHeight() {
+ if(!$this->is_valid())
+ return FALSE;
+ return $this->height;
+ }
+
+
+ public function saveImage($path) {
+ if(!$this->is_valid())
+ return FALSE;
+ file_put_contents($path, $this->imageString());
+ }
+
+
+ public function getType() {
+ if(!$this->is_valid())
+ return FALSE;
+
+ return $this->type;
+ }
+
+ public function getExt() {
+ if(!$this->is_valid())
+ return FALSE;
+
+ return $this->types[$this->getType()];
+ }
+
+ public function scaleImage($max) {
+ if(!$this->is_valid())
+ return FALSE;
+
+ $width = $this->width;
+ $height = $this->height;
+
+ $dest_width = $dest_height = 0;
+
+ if((! $width)|| (! $height))
+ return FALSE;
+
+ if($width > $max && $height > $max) {
+
+ // very tall image (greater than 16:9)
+ // constrain the width - let the height float.
+
+ if((($height * 9) / 16) > $width) {
+ $dest_width = $max;
+ $dest_height = intval(( $height * $max ) / $width);
+ }
+
+ // else constrain both dimensions
+
+ elseif($width > $height) {
+ $dest_width = $max;
+ $dest_height = intval(( $height * $max ) / $width);
+ }
+ else {
+ $dest_width = intval(( $width * $max ) / $height);
+ $dest_height = $max;
+ }
+ }
+ else {
+ if( $width > $max ) {
+ $dest_width = $max;
+ $dest_height = intval(( $height * $max ) / $width);
+ }
+ else {
+ if( $height > $max ) {
+
+ // very tall image (greater than 16:9)
+ // but width is OK - don't do anything
+
+ if((($height * 9) / 16) > $width) {
+ $dest_width = $width;
+ $dest_height = $height;
+ }
+ else {
+ $dest_width = intval(( $width * $max ) / $height);
+ $dest_height = $max;
+ }
+ }
+ else {
+ $dest_width = $width;
+ $dest_height = $height;
+ }
+ }
+ }
+ $this->doScaleImage($dest_width,$dest_height);
+ }
+
+ public function scaleImageUp($min) {
+ if(!$this->is_valid())
+ return FALSE;
+
+
+ $width = $this->width;
+ $height = $this->height;
+
+ $dest_width = $dest_height = 0;
+
+ if((! $width)|| (! $height))
+ return FALSE;
+
+ if($width < $min && $height < $min) {
+ if($width > $height) {
+ $dest_width = $min;
+ $dest_height = intval(( $height * $min ) / $width);
+ }
+ else {
+ $dest_width = intval(( $width * $min ) / $height);
+ $dest_height = $min;
+ }
+ }
+ else {
+ if( $width < $min ) {
+ $dest_width = $min;
+ $dest_height = intval(( $height * $min ) / $width);
+ }
+ else {
+ if( $height < $min ) {
+ $dest_width = intval(( $width * $min ) / $height);
+ $dest_height = $min;
+ }
+ else {
+ $dest_width = $width;
+ $dest_height = $height;
+ }
+ }
+ }
+ $this->doScaleImage($dest_width,$dest_height);
+ }
+
+ public function scaleImageSquare($dim) {
+ if(!$this->is_valid())
+ return FALSE;
+ $this->doScaleImage($dim,$dim);
+ }
+
+
+
+
+ public function orient($filename) {
+
+ /**
+ * This function is a bit unusual, because it is operating on a file, but you must
+ * first create an image from that file to initialise the type and check validity
+ * of the image.
+ */
+
+ if(! $this->is_valid())
+ return FALSE;
+
+ if((! function_exists('exif_read_data')) || ($this->getType() !== 'image/jpeg'))
+ return;
+
+ $exif = @exif_read_data($filename);
+ if($exif) {
+ $ort = $exif['Orientation'];
+
+ switch($ort)
+ {
+ case 1: // nothing
+ break;
+
+ case 2: // horizontal flip
+ $this->flip();
+ break;
+
+ case 3: // 180 rotate left
+ $this->rotate(180);
+ break;
+
+ case 4: // vertical flip
+ $this->flip(false, true);
+ break;
+
+ case 5: // vertical flip + 90 rotate right
+ $this->flip(false, true);
+ $this->rotate(-90);
+ break;
+
+ case 6: // 90 rotate right
+ $this->rotate(-90);
+ break;
+
+ case 7: // horizontal flip + 90 rotate right
+ $this->flip();
+ $this->rotate(-90);
+ break;
+
+ case 8: // 90 rotate left
+ $this->rotate(90);
+ break;
+ }
+ }
+ }
+
+
+ public function save($arr) {
+
+ $p = array();
+
+ $p['aid'] = ((intval($arr['aid'])) ? intval($arr['aid']) : 0);
+ $p['uid'] = ((intval($arr['uid'])) ? intval($arr['uid']) : 0);
+ $p['xchan'] = (($arr['xchan']) ? $arr['xchan'] : '');
+ $p['resource_id'] = (($arr['resource_id']) ? $arr['resource_id'] : '');
+ $p['filename'] = (($arr['filename']) ? $arr['filename'] : '');
+ $p['album'] = (($arr['album']) ? $arr['album'] : '');
+ $p['scale'] = ((intval($arr['scale'])) ? intval($arr['scale']) : 0);
+ $p['photo_flags'] = ((intval($arr['photo_flags'])) ? intval($arr['photo_flags']) : 0);
+ $p['allow_cid'] = (($arr['allow_cid']) ? $arr['allow_cid'] : '');
+ $p['allow_gid'] = (($arr['allow_gid']) ? $arr['allow_gid'] : '');
+ $p['deny_cid'] = (($arr['deny_cid']) ? $arr['deny_cid'] : '');
+ $p['deny_gid'] = (($arr['deny_gid']) ? $arr['deny_gid'] : '');
+
+ // temporary until we get rid of photo['profile'] and just use photo['photo_flags']
+ // but this will require updating all existing photos in the DB.
+
+ $p['profile'] = (($p['photo_flags'] & PHOTO_PROFILE) ? 1 : 0);
+
+
+ $x = q("select id from photo where resource_id = '%s' and uid = %d and xchan = '%s' and `scale` = %d limit 1",
+ dbesc($p['resource_id']),
+ intval($p['uid']),
+ dbesc($p['xchan']),
+ intval($p['scale'])
+ );
+ if($x) {
+ $r = q("UPDATE `photo` set
+ `aid` = %d,
+ `uid` = %d,
+ `xchan` = '%s',
+ `resource_id` = '%s',
+ `created` = '%s',
+ `edited` = '%s',
+ `filename` = '%s',
+ `type` = '%s',
+ `album` = '%s',
+ `height` = %d,
+ `width` = %d,
+ `data` = '%s',
+ `size` = %d,
+ `scale` = %d,
+ `profile` = %d,
+ `photo_flags` = %d,
+ `allow_cid` = '%s',
+ `allow_gid` = '%s',
+ `deny_cid` = '%s',
+ `deny_gid` = '%s'
+ where id = %d limit 1",
+
+ intval($p['aid']),
+ intval($p['uid']),
+ dbesc($p['xchan']),
+ dbesc($p['resource_id']),
+ dbesc(datetime_convert()),
+ dbesc(datetime_convert()),
+ dbesc(basename($p['filename'])),
+ dbesc($this->getType()),
+ dbesc($p['album']),
+ intval($this->getHeight()),
+ intval($this->getWidth()),
+ dbesc($this->imageString()),
+ intval(strlen($this->imageString())),
+ intval($p['scale']),
+ intval($p['profile']),
+ intval($p['photo_flags']),
+ dbesc($p['allow_cid']),
+ dbesc($p['allow_gid']),
+ dbesc($p['deny_cid']),
+ dbesc($p['deny_gid']),
+ intval($x[0]['id'])
+ );
+ }
+ else {
+ $r = q("INSERT INTO `photo`
+ ( `aid`, `uid`, `xchan`, `resource_id`, `created`, `edited`, `filename`, type, `album`, `height`, `width`, `data`, `size`, `scale`, `profile`, `photo_flags`, `allow_cid`, `allow_gid`, `deny_cid`, `deny_gid` )
+ VALUES ( %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, '%s', %d, %d, %d, %d, '%s', '%s', '%s', '%s' )",
+ intval($p['aid']),
+ intval($p['uid']),
+ dbesc($p['xchan']),
+ dbesc($p['resource_id']),
+ dbesc(datetime_convert()),
+ dbesc(datetime_convert()),
+ dbesc(basename($filename)),
+ dbesc($this->getType()),
+ dbesc($p['album']),
+ intval($this->getHeight()),
+ intval($this->getWidth()),
+ dbesc($this->imageString()),
+ intval(strlen($this->imageString())),
+ intval($p['scale']),
+ intval($p['profile']),
+ intval($p['photo_flags']),
+ dbesc($p['allow_cid']),
+ dbesc($p['allow_gid']),
+ dbesc($p['deny_cid']),
+ dbesc($p['deny_gid'])
+ );
+ }
+ return $r;
+ }
+
+ public function store($aid, $uid, $xchan, $rid, $filename, $album, $scale, $profile = 0, $allow_cid = '', $allow_gid = '', $deny_cid = '', $deny_gid = '') {
+
+ $x = q("select id from photo where `resource_id` = '%s' and uid = %d and `xchan` = '%s' and `scale` = %d limit 1",
+ dbesc($rid),
+ intval($uid),
+ dbesc($xchan),
+ intval($scale)
+ );
+ if(count($x)) {
+ $r = q("UPDATE `photo`
+ set `aid` = %d,
+ `uid` = %d,
+ `xchan` = '%s',
+ `resource_id` = '%s',
+ `created` = '%s',
+ `edited` = '%s',
+ `filename` = '%s',
+ `type` = '%s',
+ `album` = '%s',
+ `height` = %d,
+ `width` = %d,
+ `data` = '%s',
+ `size` = %d,
+ `scale` = %d,
+ `profile` = %d,
+ `allow_cid` = '%s',
+ `allow_gid` = '%s',
+ `deny_cid` = '%s',
+ `deny_gid` = '%s'
+ where id = %d limit 1",
+
+ intval($aid),
+ intval($uid),
+ dbesc($xchan),
+ dbesc($rid),
+ dbesc(datetime_convert()),
+ dbesc(datetime_convert()),
+ dbesc(basename($filename)),
+ dbesc($this->getType()),
+ dbesc($album),
+ intval($this->getHeight()),
+ intval($this->getWidth()),
+ dbesc($this->imageString()),
+ intval(strlen($this->imageString())),
+ intval($scale),
+ intval($profile),
+ dbesc($allow_cid),
+ dbesc($allow_gid),
+ dbesc($deny_cid),
+ dbesc($deny_gid),
+ intval($x[0]['id'])
+ );
+ }
+ else {
+ $r = q("INSERT INTO `photo`
+ ( `aid`, `uid`, `xchan`, `resource_id`, `created`, `edited`, `filename`, type, `album`, `height`, `width`, `data`, `size`, `scale`, `profile`, `allow_cid`, `allow_gid`, `deny_cid`, `deny_gid` )
+ VALUES ( %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, '%s', %d, %d, %d, '%s', '%s', '%s', '%s' )",
+ intval($aid),
+ intval($uid),
+ dbesc($xchan),
+ dbesc($rid),
+ dbesc(datetime_convert()),
+ dbesc(datetime_convert()),
+ dbesc(basename($filename)),
+ dbesc($this->getType()),
+ dbesc($album),
+ intval($this->getHeight()),
+ intval($this->getWidth()),
+ dbesc($this->imageString()),
+ intval(strlen($this->imageString())),
+ intval($scale),
+ intval($profile),
+ dbesc($allow_cid),
+ dbesc($allow_gid),
+ dbesc($deny_cid),
+ dbesc($deny_gid)
+ );
+ }
+ return $r;
+ }
+
+}
+
+
+
+
+
+
+
+
+/**
+ * Guess image mimetype from filename or from Content-Type header
+ *
+ * @arg $filename string Image filename
+ * @arg $fromcurl boolean Check Content-Type header from curl request
+ */
+
+function guess_image_type($filename, $headers = '') {
+ logger('Photo: guess_image_type: '.$filename . ($fromcurl?' from curl headers':''), LOGGER_DEBUG);
+ $type = null;
+ if ($headers) {
+ $a = get_app();
+ $hdrs=array();
+ $h = explode("\n",$headers);
+ foreach ($h as $l) {
+ list($k,$v) = array_map("trim", explode(":", trim($l), 2));
+ $hdrs[$k] = $v;
+ }
+ if (array_key_exists('Content-Type', $hdrs))
+ $type = $hdrs['Content-Type'];
+ }
+ if (is_null($type)){
+// FIXME!!!!
+ // Guessing from extension? Isn't that... dangerous?
+ if(class_exists('Imagick') && file_exists($filename) && is_readable($filename)) {
+ /**
+ * Well, this not much better,
+ * but at least it comes from the data inside the image,
+ * we won't be tricked by a manipulated extension
+ */
+ $image = new Imagick($filename);
+ $type = $image->getImageMimeType();
+ } else {
+ $ext = pathinfo($filename, PATHINFO_EXTENSION);
+ $ph = photo_factory('');
+ $types = $ph->supportedTypes();
+ $type = "image/jpeg";
+ foreach ($types as $m=>$e){
+ if ($ext==$e) $type = $m;
+ }
+ }
+ }
+ logger('Photo: guess_image_type: type='.$type, LOGGER_DEBUG);
+ return $type;
+
+}
+
+function import_profile_photo($photo,$xchan,$thing = false) {
+
+ $a = get_app();
+
+ $flags = (($thing) ? PHOTO_THING : PHOTO_XCHAN);
+ $album = (($thing) ? 'Things' : 'Contact Photos');
+
+ logger('import_profile_photo: updating channel photo from ' . $photo . ' for ' . $xchan, LOGGER_DEBUG);
+
+ if($thing)
+ $hash = photo_new_resource();
+ else {
+ $r = q("select resource_id from photo where xchan = '%s' and (photo_flags & %d ) scale = 4 limit 1",
+ dbesc($xchan),
+ intval(PHOTO_XCHAN)
+ );
+ if($r) {
+ $hash = $r[0]['resource_id'];
+ }
+ else {
+ $hash = photo_new_resource();
+ }
+ }
+
+ $photo_failure = false;
+
+
+ $filename = basename($photo);
+ $type = guess_image_type($photo,true);
+ $result = z_fetch_url($photo,true);
+
+ if($result['success'])
+ $img_str = $result['body'];
+
+ $img = photo_factory($img_str, $type);
+ if($img->is_valid()) {
+ $width = $img->getWidth();
+ $height = $img->getHeight();
+
+ if($width && $height) {
+ if(($width / $height) > 1.2) {
+ // crop out the sides
+ $margin = $width - $height;
+ $img->cropImage(175,($margin / 2),0,$height,$height);
+ }
+ elseif(($height / $width) > 1.2) {
+ // crop out the bottom
+ $margin = $height - $width;
+ $img->cropImage(175,0,0,$width,$width);
+
+ }
+ else {
+ $img->scaleImageSquare(175);
+ }
+
+ }
+ else
+ $photo_failure = true;
+
+ $p = array('xchan' => $xchan,'resource_id' => $hash, 'filename' => basename($photo), 'album' => $album, 'photo_flags' => $flags, 'scale' => 4);
+
+ $r = $img->save($p);
+
+ if($r === false)
+ $photo_failure = true;
+
+ $img->scaleImage(80);
+ $p['scale'] = 5;
+
+ $r = $img->save($p);
+
+ if($r === false)
+ $photo_failure = true;
+
+ $img->scaleImage(48);
+ $p['scale'] = 6;
+
+ $r = $img->save($p);
+
+ if($r === false)
+ $photo_failure = true;
+
+ $photo = $a->get_baseurl() . '/photo/' . $hash . '-4';
+ $thumb = $a->get_baseurl() . '/photo/' . $hash . '-5';
+ $micro = $a->get_baseurl() . '/photo/' . $hash . '-6';
+ }
+ else {
+ logger('import_profile_photo: invalid image from ' . $photo);
+ $photo_failure = true;
+ }
+ if($photo_failure) {
+ $photo = $a->get_baseurl() . '/' . get_default_profile_photo();
+ $thumb = $a->get_baseurl() . '/' . get_default_profile_photo(80);
+ $micro = $a->get_baseurl() . '/' . get_default_profile_photo(48);
+ $type = 'image/jpeg';
+ }
+
+ return(array($photo,$thumb,$micro,$type));
+
+}
+
+
+
+function import_channel_photo($photo,$type,$aid,$uid) {
+
+ $a = get_app();
+
+ logger('import_channel_photo: importing channel photo for ' . $uid, LOGGER_DEBUG);
+
+ $hash = photo_new_resource();
+
+ $photo_failure = false;
+
+
+ $filename = $hash;
+
+ $img = photo_factory($photo, $type);
+ if($img->is_valid()) {
+
+ $img->scaleImageSquare(175);
+
+ $p = array('aid' => $aid, 'uid' => $uid, 'resource_id' => $hash, 'filename' => $filename, 'album' => t('Profile Photos'), 'photo_flags' => PHOTO_PROFILE, 'scale' => 4);
+
+ $r = $img->save($p);
+
+ if($r === false)
+ $photo_failure = true;
+
+ $img->scaleImage(80);
+ $p['scale'] = 5;
+
+ $r = $img->save($p);
+
+ if($r === false)
+ $photo_failure = true;
+
+ $img->scaleImage(48);
+ $p['scale'] = 6;
+
+ $r = $img->save($p);
+
+ if($r === false)
+ $photo_failure = true;
+
+ }
+ else {
+ logger('import_channel_photo: invalid image.');
+ $photo_failure = true;
+ }
+
+ return(($photo_failure)? false : true);
+
+}
diff --git a/include/photo/photo_gd.php b/include/photo/photo_gd.php
new file mode 100644
index 000000000..466f8c23a
--- /dev/null
+++ b/include/photo/photo_gd.php
@@ -0,0 +1,140 @@
+<?php /** @file */
+
+
+require_once('include/photo/photo_driver.php');
+
+
+class photo_gd extends photo_driver {
+
+ function supportedTypes() {
+ $t = array();
+ $t['image/jpeg'] ='jpg';
+ if (imagetypes() & IMG_PNG) $t['image/png'] = 'png';
+
+ return $t;
+
+ }
+
+ function load($data, $type) {
+ $this->valid = false;
+ if(! $data)
+ return;
+
+ $this->image = @imagecreatefromstring($data);
+ if($this->image !== FALSE) {
+ $this->valid = true;
+ $this->setDimensions();
+ imagealphablending($this->image, false);
+ imagesavealpha($this->image, true);
+ }
+ }
+
+ function setDimensions() {
+ $this->width = imagesx($this->image);
+ $this->height = imagesy($this->image);
+ }
+
+
+ public function destroy() {
+ if($this->is_valid()) {
+ imagedestroy($this->image);
+ }
+ }
+
+ public function getImage() {
+ if(!$this->is_valid())
+ return FALSE;
+
+ return $this->image;
+ }
+
+ public function doScaleImage($dest_width,$dest_height) {
+
+ $dest = imagecreatetruecolor( $dest_width, $dest_height );
+ $width = imagesx($this->image);
+ $height = imagesy($this->image);
+
+ imagealphablending($dest, false);
+ imagesavealpha($dest, true);
+ if ($this->type=='image/png') imagefill($dest, 0, 0, imagecolorallocatealpha($dest, 0, 0, 0, 127)); // fill with alpha
+ imagecopyresampled($dest, $this->image, 0, 0, 0, 0, $dest_width, $dest_height, $width, $height);
+ if($this->image)
+ imagedestroy($this->image);
+ $this->image = $dest;
+ $this->setDimensions();
+ }
+
+ public function rotate($degrees) {
+ if(!$this->is_valid())
+ return FALSE;
+
+ $this->image = imagerotate($this->image,$degrees,0);
+ $this->setDimensions();
+ }
+
+ public function flip($horiz = true, $vert = false) {
+ if(!$this->is_valid())
+ return FALSE;
+
+ $w = imagesx($this->image);
+ $h = imagesy($this->image);
+ $flipped = imagecreate($w, $h);
+ if($horiz) {
+ for ($x = 0; $x < $w; $x++) {
+ imagecopy($flipped, $this->image, $x, 0, $w - $x - 1, 0, 1, $h);
+ }
+ }
+ if($vert) {
+ for ($y = 0; $y < $h; $y++) {
+ imagecopy($flipped, $this->image, 0, $y, 0, $h - $y - 1, $w, 1);
+ }
+ }
+ $this->image = $flipped;
+ $this->setDimensions(); // Shouldn't really be necessary
+ }
+
+ public function cropImage($max,$x,$y,$w,$h) {
+ if(!$this->is_valid())
+ return FALSE;
+
+ $dest = imagecreatetruecolor( $max, $max );
+ imagealphablending($dest, false);
+ imagesavealpha($dest, true);
+ if ($this->type=='image/png') imagefill($dest, 0, 0, imagecolorallocatealpha($dest, 0, 0, 0, 127)); // fill with alpha
+ imagecopyresampled($dest, $this->image, 0, 0, $x, $y, $max, $max, $w, $h);
+ if($this->image)
+ imagedestroy($this->image);
+ $this->image = $dest;
+ $this->setDimensions();
+ }
+
+ public function imageString() {
+ if(!$this->is_valid())
+ return FALSE;
+
+ $quality = FALSE;
+
+ ob_start();
+
+ switch($this->getType()){
+ case "image/png":
+ $quality = get_config('system','png_quality');
+ if((! $quality) || ($quality > 9))
+ $quality = PNG_QUALITY;
+ imagepng($this->image,NULL, $quality);
+ break;
+ case "image/jpeg":
+ default:
+ $quality = get_config('system','jpeg_quality');
+ if((! $quality) || ($quality > 100))
+ $quality = JPEG_QUALITY;
+ imagejpeg($this->image,NULL,$quality);
+ break;
+ }
+ $string = ob_get_contents();
+ ob_end_clean();
+
+ return $string;
+ }
+
+} \ No newline at end of file
diff --git a/include/photo/photo_imagick.php b/include/photo/photo_imagick.php
new file mode 100644
index 000000000..3f84fd06c
--- /dev/null
+++ b/include/photo/photo_imagick.php
@@ -0,0 +1,177 @@
+<?php /** @file */
+
+
+require_once('include/photo/photo_driver.php');
+
+
+class photo_imagick extends photo_driver {
+
+
+ function supportedTypes() {
+ return array(
+ 'image/jpeg' => 'jpg',
+ 'image/png' => 'png',
+ 'image/gif' => 'gif'
+ );
+ }
+
+ public function get_FormatsMap() {
+ return array(
+ 'image/jpeg' => 'JPG',
+ 'image/png' => 'PNG',
+ 'image/gif' => 'GIF'
+ );
+ }
+
+
+ function load($data, $type) {
+ $this->valid = false;
+ $this->image = new Imagick();
+
+ if(! $data)
+ return;
+
+ $this->image->readImageBlob($data);
+
+
+ /**
+ * Setup the image to the format it will be saved to
+ */
+
+ $map = $this->get_FormatsMap();
+ $format = $map[$type];
+
+ if($this->image) {
+ $this->image->setFormat($format);
+
+ // Always coalesce, if it is not a multi-frame image it won't hurt anyway
+ $this->image = $this->image->coalesceImages();
+
+
+ $this->valid = true;
+ $this->setDimensions();
+
+ /**
+ * setup the compression here, so we'll do it only once
+ */
+ switch($this->getType()) {
+ case "image/png":
+ $quality = get_config('system','png_quality');
+ if((! $quality) || ($quality > 9))
+ $quality = PNG_QUALITY;
+ /**
+ * From http://www.imagemagick.org/script/command-line-options.php#quality:
+ *
+ * 'For the MNG and PNG image formats, the quality value sets
+ * the zlib compression level (quality / 10) and filter-type (quality % 10).
+ * The default PNG "quality" is 75, which means compression level 7 with adaptive PNG filtering,
+ * unless the image has a color map, in which case it means compression level 7 with no PNG filtering'
+ */
+ $quality = $quality * 10;
+ $this->image->setCompressionQuality($quality);
+ break;
+ case "image/jpeg":
+ $quality = get_config('system','jpeg_quality');
+ if((! $quality) || ($quality > 100))
+ $quality = JPEG_QUALITY;
+ $this->image->setCompressionQuality($quality);
+ default:
+ break;
+
+ }
+ }
+ }
+
+ public function destroy() {
+ if($this->is_valid()) {
+ $this->image->clear();
+ $this->image->destroy();
+ }
+ }
+
+
+ public function setDimensions() {
+ $this->width = $this->image->getImageWidth();
+ $this->height = $this->image->getImageHeight();
+ }
+
+
+ public function getImage() {
+ if(!$this->is_valid())
+ return FALSE;
+
+ $this->image = $this->image->deconstructImages();
+ return $this->image;
+ }
+
+ public function doScaleImage($dest_width,$dest_height) {
+
+ /**
+ * If it is not animated, there will be only one iteration here,
+ * so don't bother checking
+ */
+ // Don't forget to go back to the first frame
+ $this->image->setFirstIterator();
+ do {
+ $this->image->scaleImage($dest_width, $dest_height);
+ } while ($this->image->nextImage());
+
+ $this->setDimensions();
+ }
+
+ public function rotate($degrees) {
+ if(!$this->is_valid())
+ return FALSE;
+
+ $this->image->setFirstIterator();
+ do {
+ // ImageMagick rotates in the opposite direction of imagerotate()
+ $this->image->rotateImage(new ImagickPixel(), -$degrees);
+ } while ($this->image->nextImage());
+
+ $this->setDimensions();
+ }
+
+ public function flip($horiz = true, $vert = false) {
+ if(!$this->is_valid())
+ return FALSE;
+
+ $this->image->setFirstIterator();
+ do {
+ if($horiz) $this->image->flipImage();
+ if($vert) $this->image->flopImage();
+ } while ($this->image->nextImage());
+
+ $this->setDimensions(); // Shouldn't really be necessary
+ }
+
+ public function cropImage($max,$x,$y,$w,$h) {
+ if(!$this->is_valid())
+ return FALSE;
+
+ $this->image->setFirstIterator();
+ do {
+ $this->image->cropImage($w, $h, $x, $y);
+ /**
+ * We need to remove the canvas,
+ * or the image is not resized to the crop:
+ * http://php.net/manual/en/imagick.cropimage.php#97232
+ */
+ $this->image->setImagePage(0, 0, 0, 0);
+ } while ($this->image->nextImage());
+
+ $this->doScaleImage($max,$max);
+ }
+
+ public function imageString() {
+ if(!$this->is_valid())
+ return FALSE;
+
+ /* Clean it */
+ $this->image = $this->image->deconstructImages();
+ return $this->image->getImagesBlob();
+ }
+
+
+
+} \ No newline at end of file
diff --git a/include/photos.php b/include/photos.php
index 885d2f958..5c03b2cdb 100644
--- a/include/photos.php
+++ b/include/photos.php
@@ -1,7 +1,9 @@
-<?php
+<?php /** @file */
require_once('include/permissions.php');
require_once('include/items.php');
+require_once('include/photo/photo_driver.php');
+
function photo_upload($channel, $observer, $args) {
@@ -100,12 +102,10 @@ function photo_upload($channel, $observer, $args) {
$imagedata = @file_get_contents($src);
- $r = q("select sum(size) as total from photo where uid = %d and scale = 0 ",
- intval($channel_id)
+ $r = q("select sum(size) as total from photo where aid = %d and scale = 0 ",
+ intval($account_id)
);
-// FIXME service class limits should probably apply to accounts and not channels
-
$limit = service_class_fetch($channel_id,'photo_upload_limit');
if(($r) && ($limit !== false) && (($r[0]['total'] + strlen($imagedata)) > $limit)) {
@@ -116,13 +116,13 @@ function photo_upload($channel, $observer, $args) {
}
- $ph = new Photo($imagedata, $type);
+ $ph = photo_factory($imagedata, $type);
if(! $ph->is_valid()) {
$ret['message'] = t('Unable to process image');
logger('photo_upload: unable to process image');
@unlink($src);
- call_hooks('photo_post_end',$ret);
+ call_hooks('photo_upload_end',$ret);
return $ret;
}
@@ -148,13 +148,20 @@ function photo_upload($channel, $observer, $args) {
$errors = false;
- $r1 = $ph->store($account_id, $channel_id, $visitor, $photo_hash, $filename, $album, 0 , 0, $str_contact_allow, $str_group_allow, $str_contact_deny, $str_group_deny);
+ $p = array('aid' => $account_id, 'uid' => $channel_id, 'xchan' => $visitor, 'resource_id' => $photo_hash,
+ 'filename' => $filename, 'album' => $album, 'scale' => 0, 'photo_flags' => PHOTO_NORMAL,
+ 'allow_cid' => $str_contact_allow, 'allow_gid' => $str_group_allow,
+ 'deny_cid' => $str_contact_deny, 'deny_gid' => $str_group_deny
+ );
+
+ $r1 = $ph->save($p);
if(! $r1)
$errors = true;
if(($width > 640 || $height > 640) && (! $errors)) {
$ph->scaleImage(640);
- $r2 = $ph->store($account_id, $channel_id, $visitor, $photo_hash, $filename, $album, 1, 0, $str_contact_allow, $str_group_allow, $str_contact_deny, $str_group_deny);
+ $p['scale'] = 1;
+ $r2 = $ph->save($p);
$smallest = 1;
if(! $r2)
$errors = true;
@@ -162,7 +169,8 @@ function photo_upload($channel, $observer, $args) {
if(($width > 320 || $height > 320) && (! $errors)) {
$ph->scaleImage(320);
- $r3 = $ph->store($account_id, $channel_id, $visitor, $photo_hash, $filename, $album, 2, 0, $str_contact_allow, $str_group_allow, $str_contact_deny, $str_group_deny);
+ $p['scale'] = 2;
+ $r3 = $ph->save($p);
$smallest = 2;
if(! $r3)
$errors = true;
@@ -175,26 +183,26 @@ function photo_upload($channel, $observer, $args) {
);
$ret['message'] = t('Photo storage failed.');
logger('photo_upload: photo store failed.');
- call_hooks('photo_post_end',$ret);
+ call_hooks('photo_upload_end',$ret);
return $ret;
}
$basename = basename($filename);
- $uri = item_message_id();
+ $mid = item_message_id();
// Create item container
$item_flags = ITEM_WALL|ITEM_ORIGIN|ITEM_THREAD_TOP;
$item_restrict = (($visible) ? ITEM_VISIBLE : ITEM_HIDDEN);
$title = '';
- $uri = item_message_id();
+ $mid = item_message_id();
$arr = array();
$arr['aid'] = $account_id;
$arr['uid'] = $channel_id;
- $arr['uri'] = $uri;
- $arr['parent_uri'] = $uri;
+ $arr['mid'] = $mid;
+ $arr['parent_mid'] = $mid;
$arr['item_flags'] = $item_flags;
$arr['item_restrict'] = $item_restrict;
$arr['resource_type'] = 'photo';
@@ -206,13 +214,17 @@ function photo_upload($channel, $observer, $args) {
$arr['allow_gid'] = $str_group_allow;
$arr['deny_cid'] = $str_contact_deny;
$arr['deny_gid'] = $str_group_deny;
+ $arr['verb'] = ACTIVITY_POST;
+ $arr['plink'] = z_root() . '/channel/' . $channel['channel_address'] . '/?f=&mid=' . $arr['mid'];
- $arr['body'] = '[url=' . z_root() . '/photos/' . $channel['channel_address'] . '/image/' . $photo_hash . ']'
- . '[img]' . z_root() . "/photo/{$photo_hash}-{$smallest}.".$ph->getExt() . '[/img]'
- . '[/url]';
+
+ $arr['body'] = '[zrl=' . z_root() . '/photos/' . $channel['channel_address'] . '/image/' . $photo_hash . ']'
+ . '[zmg]' . z_root() . "/photo/{$photo_hash}-{$smallest}.".$ph->getExt() . '[/zmg]'
+ . '[/zrl]';
- $item_id = item_store($arr);
+ $result = item_store($arr);
+ $item_id = $result['item_id'];
if($visible)
proc_run('php', "include/notifier.php", 'wall-new', $item_id);
@@ -222,7 +234,7 @@ function photo_upload($channel, $observer, $args) {
$ret['resource_id'] = $photo_hash;
$ret['photoitem_id'] = $item_id;
- call_hooks('photo_post_end',$ret);
+ call_hooks('photo_upload_end',$ret);
return $ret;
}
@@ -242,19 +254,25 @@ function photos_albums_list($channel,$observer) {
$sql_extra = permissions_sql($channel_id);
- $albums = q("SELECT distinct album from photo where uid = %d $sql_extra order by created desc",
- intval($channel_id)
+ $albums = q("SELECT distinct album from photo where uid = %d and ( photo_flags = %d or photo_flags = %d ) $sql_extra order by created desc",
+ intval($channel_id),
+ intval(PHOTO_NORMAL),
+ intval(PHOTO_PROFILE)
+
);
// add various encodings to the array so we can just loop through and pick them out in a template
+ $ret = array('success' => false);
+
if($albums) {
+ $ret['success'] = true;
foreach($albums as $k => $album) {
- $albums[$k]['urlencode'] = urlencode($album['album']);
- $albums[$k]['bin2hex'] = bin2hex($album['album']);
+ $entry = array('text' => $album['album'], 'urlencode' => urlencode($album['album']),'bin2hex' => bin2hex($album['album']));
+ $ret[] = $entry;
}
}
- return $albums;
+ return $ret;
}
@@ -262,8 +280,16 @@ function photos_album_widget($channelx,$observer,$albums = null) {
$o = '';
- if(! $albums)
- $albums = photos_albums_list($channelx,$observer);
+ // If we weren't passed an album list, see if the photos module
+ // dropped one for us to find in $a->data['albums'].
+ // If all else fails, load it.
+
+ if(! $albums) {
+ if(array_key_exists('albums', get_app()->data))
+ $albums = get_app()->data['albums'];
+ else
+ $albums = photos_albums_list($channelx,$observer);
+ }
if($albums) {
$o = replace_macros(get_markup_template('photo_albums.tpl'),array(
@@ -278,6 +304,41 @@ function photos_album_widget($channelx,$observer,$albums = null) {
return $o;
}
+
+function photos_list_photos($channel,$observer,$album = '') {
+
+ $channel_id = $channel['channel_id'];
+ $observer_xchan = (($observer) ? $observer['xchan_hash'] : '');
+
+ if(! perm_is_allowed($channel_id,$observer_xchan,'view_photos'))
+ return false;
+
+ $sql_extra = permissions_sql($channel_id);
+
+ if($album)
+ $sql_extra .= " and album = '" . protect_sprintf(dbesc($album)) . "' ";
+
+ $ret = array('success' => false);
+
+ $r = q("select resource_id, created, edited, title, description, album, filename, type, height, width, size, scale, profile, photo_flags, allow_cid, allow_gid, deny_cid, deny_gid from photo where uid = %d and ( photo_flags = %d or photo_flags = %d ) $sql_extra ",
+ intval($channel_id),
+ intval(PHOTO_NORMAL),
+ intval(PHOTO_PROFILE)
+ );
+
+ if($r) {
+ for($x = 0; $x < count($r); $x ++) {
+ $r[$x]['src'] = z_root() . '/photo/' . $r[$x]['resource_id'] . '-' . $r[$x]['scale'];
+ }
+ $ret['success'] = true;
+ $ret['photos'] = $r;
+ }
+
+ return $ret;
+}
+
+
+
function photos_album_exists($channel_id,$album) {
$r = q("SELECT id from photo where album = '%s' and uid = %d limit 1",
dbesc($album),
@@ -330,14 +391,14 @@ function photos_create_item($channel, $creator_hash, $photo, $visible = false) {
$item_restrict = (($visible) ? ITEM_HIDDEN : ITEM_VISIBLE);
$title = '';
- $uri = item_message_id();
+ $mid = item_message_id();
$arr = array();
$arr['aid'] = $channel['channel_account_id'];
$arr['uid'] = $channel['channel_id'];
- $arr['uri'] = $uri;
- $arr['parent_uri'] = $uri;
+ $arr['mid'] = $mid;
+ $arr['parent_mid'] = $mid;
$arr['item_flags'] = $item_flags;
$arr['item_restrict'] = $item_restrict;
$arr['resource_type'] = 'photo';
@@ -349,12 +410,15 @@ function photos_create_item($channel, $creator_hash, $photo, $visible = false) {
$arr['allow_gid'] = $photo['allow_gid'];
$arr['deny_cid'] = $photo['deny_cid'];
$arr['deny_gid'] = $photo['deny_gid'];
+
+ $arr['plink'] = z_root() . '/channel/' . $channel['channel_address'] . '/?f=&mid=' . $arr['mid'];
- $arr['body'] = '[url=' . z_root() . '/photos/' . $channel['channel_address'] . '/image/' . $photo['resource_id'] . ']'
- . '[img]' . z_root() . '/photo/' . $photo['resource_id'] . '-' . $photo['scale'] . '[/img]'
- . '[/url]';
+ $arr['body'] = '[zrl=' . z_root() . '/photos/' . $channel['channel_address'] . '/image/' . $photo['resource_id'] . ']'
+ . '[zmg]' . z_root() . '/photo/' . $photo['resource_id'] . '-' . $photo['scale'] . '[/zmg]'
+ . '[/zrl]';
- $item_id = item_store($arr);
+ $result = item_store($arr);
+ $item_id = $result['item_id'];
return $item_id;
} \ No newline at end of file
diff --git a/include/plugin.php b/include/plugin.php
index 6660fba59..9982a48a2 100644..100755
--- a/include/plugin.php
+++ b/include/plugin.php
@@ -1,26 +1,43 @@
-<?php
+<?php /** @file */
require_once("include/friendica_smarty.php");
// install and uninstall plugin
-if (! function_exists('uninstall_plugin')){
-function uninstall_plugin($plugin){
- logger("Addons: uninstalling " . $plugin, LOGGER_DEBUG);
- q("DELETE FROM `addon` WHERE `name` = '%s' ",
- dbesc($plugin)
- );
+
+function unload_plugin($plugin){
+ logger("Addons: unloading " . $plugin, LOGGER_DEBUG);
@include_once('addon/' . $plugin . '/' . $plugin . '.php');
+ if(function_exists($plugin . '_unload')) {
+ $func = $plugin . '_unload';
+ $func();
+ }
+}
+
+
+
+function uninstall_plugin($plugin) {
+
+ unload_plugin($plugin);
+
+ if(! file_exists('addon/' . $plugin . '/' . $plugin . '.php'))
+ return false;
+
+ logger("Addons: uninstalling " . $plugin);
+ $t = @filemtime('addon/' . $plugin . '/' . $plugin . '.php');
+ @include_once('addon/' . $plugin . '/' . $plugin . '.php');
if(function_exists($plugin . '_uninstall')) {
$func = $plugin . '_uninstall';
$func();
}
-}}
-if (! function_exists('install_plugin')){
-function install_plugin($plugin) {
- // silently fail if plugin was removed
+ q("DELETE FROM `addon` WHERE `name` = '%s' ",
+ dbesc($plugin)
+ );
+
+}
+function install_plugin($plugin) {
if(! file_exists('addon/' . $plugin . '/' . $plugin . '.php'))
return false;
@@ -30,14 +47,34 @@ function install_plugin($plugin) {
if(function_exists($plugin . '_install')) {
$func = $plugin . '_install';
$func();
+ }
+
+ $plugin_admin = (function_exists($plugin . "_plugin_admin") ? 1 : 0);
- $plugin_admin = (function_exists($plugin . "_plugin_admin") ? 1 : 0);
+ $r = q("INSERT INTO `addon` (`name`, `installed`, `timestamp`, `plugin_admin`) VALUES ( '%s', 1, %d , %d ) ",
+ dbesc($plugin),
+ intval($t),
+ $plugin_admin
+ );
+
+ load_plugin($plugin);
+
+}
+
+
+function load_plugin($plugin) {
+ // silently fail if plugin was removed
+
+ if(! file_exists('addon/' . $plugin . '/' . $plugin . '.php'))
+ return false;
+
+ logger("Addons: loading " . $plugin);
+ $t = @filemtime('addon/' . $plugin . '/' . $plugin . '.php');
+ @include_once('addon/' . $plugin . '/' . $plugin . '.php');
+ if(function_exists($plugin . '_load')) {
+ $func = $plugin . '_load';
+ $func();
- $r = q("INSERT INTO `addon` (`name`, `installed`, `timestamp`, `plugin_admin`) VALUES ( '%s', 1, %d , %d ) ",
- dbesc($plugin),
- intval($t),
- $plugin_admin
- );
// we can add the following with the previous SQL
// once most site tables have been updated.
@@ -51,15 +88,14 @@ function install_plugin($plugin) {
return true;
}
else {
- logger("Addons: FAILED installing " . $plugin);
+ logger("Addons: FAILED loading " . $plugin);
return false;
}
-}}
+}
// reload all updated plugins
-if(! function_exists('reload_plugins')) {
function reload_plugins() {
$plugins = get_config('system','addon');
if(strlen($plugins)) {
@@ -86,12 +122,12 @@ function reload_plugins() {
logger('Reloading plugin: ' . $i['name']);
@include_once($fname);
- if(function_exists($pl . '_uninstall')) {
- $func = $pl . '_uninstall';
+ if(function_exists($pl . '_unload')) {
+ $func = $pl . '_unload';
$func();
}
- if(function_exists($pl . '_install')) {
- $func = $pl . '_install';
+ if(function_exists($pl . '_load')) {
+ $func = $pl . '_load';
$func();
}
q("UPDATE `addon` SET `timestamp` = %d WHERE `id` = %d LIMIT 1",
@@ -104,14 +140,13 @@ function reload_plugins() {
}
}
}
-
-}}
+}
-if(! function_exists('register_hook')) {
+
function register_hook($hook,$file,$function,$priority=0) {
$r = q("SELECT * FROM `hook` WHERE `hook` = '%s' AND `file` = '%s' AND `function` = '%s' LIMIT 1",
@@ -129,47 +164,82 @@ function register_hook($hook,$file,$function,$priority=0) {
dbesc($priority)
);
return $r;
-}}
+}
+
-if(! function_exists('unregister_hook')) {
function unregister_hook($hook,$file,$function) {
- $r = q("DELETE FROM `hook` WHERE `hook` = '%s' AND `file` = '%s' AND `function` = '%s' LIMIT 1",
+ $r = q("DELETE FROM hook WHERE hook = '%s' AND `file` = '%s' AND `function` = '%s' LIMIT 1",
dbesc($hook),
dbesc($file),
dbesc($function)
);
return $r;
-}}
+}
//
// It might not be obvious but themes can manually add hooks to the $a->hooks
// array in their theme_init() and use this to customise the app behaviour.
+// UPDATE: use insert_hook($hookname,$function_name) to do this
//
-if(! function_exists('load_hooks')) {
+
function load_hooks() {
$a = get_app();
- $a->hooks = array();
- $r = q("SELECT * FROM `hook` WHERE 1 ORDER BY `priority` DESC");
- if(count($r)) {
+// if(! is_array($a->hooks))
+ $a->hooks = array();
+ $r = q("SELECT * FROM hook WHERE true ORDER BY priority DESC");
+ if($r) {
foreach($r as $rr) {
if(! array_key_exists($rr['hook'],$a->hooks))
$a->hooks[$rr['hook']] = array();
$a->hooks[$rr['hook']][] = array($rr['file'],$rr['function']);
}
}
-}}
+//logger('hooks: ' . print_r($a->hooks,true));
+
+}
+
+/**
+ *
+ * @function insert_hook($hook,$fn)
+ *
+ * Insert a short-lived hook into the running page request.
+ * Hooks are normally persistent so that they can be called
+ * across asynchronous processes such as delivery and poll
+ * processes.
+ *
+ * insert_hook lets you attach a hook callback immediately
+ * which will not persist beyond the life of this page request
+ * or the current process.
+ *
+ * @param string $hook;
+ * name of hook to attach callback
+ * @param string $fn;
+ * function name of callback handler
+ *
+ */
+
+function insert_hook($hook,$fn) {
+ $a = get_app();
+ if(! is_array($a->hooks))
+ $a->hooks = array();
+ if(! array_key_exists($hook,$a->hooks))
+ $a->hooks[$hook] = array();
+ $a->hooks[$hook][] = array('',$fn);
+}
+
+
-if(! function_exists('call_hooks')) {
function call_hooks($name, &$data = null) {
$a = get_app();
if((is_array($a->hooks)) && (array_key_exists($name,$a->hooks))) {
foreach($a->hooks[$name] as $hook) {
- @include_once($hook[0]);
+ if($hook[0])
+ @include_once($hook[0]);
if(function_exists($hook[1])) {
$func = $hook[1];
$func($a,$data);
@@ -185,7 +255,7 @@ function call_hooks($name, &$data = null) {
}
}
-}}
+}
/*
@@ -201,7 +271,7 @@ function call_hooks($name, &$data = null) {
* *
*/
-if (! function_exists('get_plugin_info')){
+
function get_plugin_info($plugin){
$info=Array(
'name' => $plugin,
@@ -241,7 +311,7 @@ function get_plugin_info($plugin){
}
return $info;
-}}
+}
/*
@@ -257,16 +327,16 @@ function get_plugin_info($plugin){
* *
*/
-if (! function_exists('get_theme_info')){
+
function get_theme_info($theme){
$info=Array(
'name' => $theme,
'description' => "",
'author' => array(),
- 'maintainer' => array(),
'version' => "",
- 'credits' => "",
'compat' => "",
+ 'credits' => "",
+ 'maintainer' => array(),
'experimental' => false,
'unsupported' => false
);
@@ -316,7 +386,7 @@ function get_theme_info($theme){
}
return $info;
-}}
+}
function get_theme_screenshot($theme) {
@@ -339,12 +409,14 @@ function get_theme_screenshot($theme) {
function service_class_allows($uid,$property,$usage = false) {
-
+ $a = get_app();
if($uid == local_user()) {
- $service_class = $a->user['service_class'];
+ $service_class = $a->account['account_service_class'];
}
else {
- $r = q("select service_class from user where uid = %d limit 1",
+ $r = q("select account_service_class as service_class
+ from channel c, account a
+ where c.channel_account_id=a.account_id and c.channel_id= %d limit 1",
intval($uid)
);
if($r !== false and count($r)) {
@@ -369,13 +441,15 @@ function service_class_allows($uid,$property,$usage = false) {
function service_class_fetch($uid,$property) {
-
+ $a = get_app();
if($uid == local_user()) {
- $service_class = $a->user['service_class'];
+ $service_class = $a->account['account_service_class'];
}
else {
- $r = q("select service_class from user where uid = %d limit 1",
- intval($uid)
+ $r = q("select account_service_class as service_class
+ from channel c, account a
+ where c.channel_account_id=a.account_id and c.channel_id= %d limit 1",
+ intval($uid)
);
if($r !== false and count($r)) {
$service_class = $r[0]['service_class'];
@@ -385,6 +459,7 @@ function service_class_fetch($uid,$property) {
return false; // everything is allowed
$arr = get_config('service_class',$service_class);
+
if(! is_array($arr) || (! count($arr)))
return false;
@@ -397,7 +472,7 @@ function upgrade_link($bbcode = false) {
if(! $l)
return '';
if($bbcode)
- $t = sprintf('[url=%s]' . t('Click here to upgrade.') . '[/url]', $l);
+ $t = sprintf('[zrl=%s]' . t('Click here to upgrade.') . '[/zrl]', $l);
else
$t = sprintf('<a href="%s">' . t('Click here to upgrade.') . '</div>', $l);
return $t;
@@ -419,6 +494,15 @@ function head_add_css($src,$media = 'screen') {
get_app()->css_sources[] = array($src,$media);
}
+
+function head_remove_css($src,$media = 'screen') {
+ $a = get_app();
+ $index = array_search(array($src,$media),$a->css_sources);
+ if($index !== false)
+ unset($a->css_sources[$index]);
+
+}
+
function head_get_css() {
$str = '';
$sources = get_app()->css_sources;
@@ -436,15 +520,44 @@ function format_css_if_exists($source) {
$path = theme_include($source[0]);
if($path)
- return '<link rel="stylesheet" href="' . z_root() . '/' . $path . '" type="text/css" media="' . $source[1] . '" />' . "\r\n";
+ return '<link rel="stylesheet" href="' . script_path() . '/' . $path . '" type="text/css" media="' . $source[1] . '" />' . "\r\n";
}
+function script_path() {
+ if(x($_SERVER,'HTTPS') && $_SERVER['HTTPS'])
+ $scheme = 'https';
+ elseif(x($_SERVER,'SERVER_PORT') && (intval($_SERVER['SERVER_PORT']) == 443))
+ $scheme = 'https';
+ else
+ $scheme = 'http';
+
+ if(x($_SERVER,'SERVER_NAME')) {
+ $hostname = $_SERVER['SERVER_NAME'];
+ }
+ else {
+ return z_root();
+ }
+
+ if(x($_SERVER,'SERVER_PORT') && $_SERVER['SERVER_PORT'] != 80 && $_SERVER['SERVER_PORT'] != 443) {
+ $hostname .= ':' . $_SERVER['SERVER_PORT'];
+ }
+
+ return $scheme . '://' . $hostname;
+}
function head_add_js($src) {
get_app()->js_sources[] = $src;
}
+function head_remove_js($src) {
+ $a = get_app();
+ $index = array_search($src,$a->js_sources);
+ if($index !== false)
+ unset($a->js_sources[$index]);
+
+}
+
function head_get_js() {
$str = '';
$sources = get_app()->js_sources;
@@ -461,7 +574,7 @@ function format_js_if_exists($source) {
else
$path = theme_include($source);
if($path)
- return '<script src="' . z_root() . '/' . $path . '" ></script>' . "\r\n" ;
+ return '<script src="' . script_path() . '/' . $path . '" ></script>' . "\r\n" ;
}
@@ -503,55 +616,21 @@ function theme_include($file, $root = '') {
-if(! function_exists('get_intltext_template')) {
-function get_intltext_template($s) {
- global $a;
- if(! isset($a->language))
- $a->language = 'en';
+function get_intltext_template($s, $root = '') {
+ $a = get_app();
+ $t = $a->template_engine();
- $engine = '';
- if($a->get_template_engine() === 'smarty3')
- $engine = "/smarty3";
+ $template = $t->get_intltext_template($s, $root);
+ return $template;
- $file = '';
- if(file_exists("view/{$a->language}$engine/$s"))
- $file = "view/{$a->language}$engine/$s";
- elseif(file_exists("view/en$engine/$s"))
- $file = "view/en$engine/$s";
- else
- $file = "view/tpl/$engine/$s";
- if($engine === '/smarty3') {
- $template = new FriendicaSmarty();
- $template->filename = $file;
-
- return $template;
- }
- else
- return file_get_contents($file);
+}
-}}
-if(! function_exists('get_markup_template')) {
function get_markup_template($s, $root = '') {
-
$a = get_app();
-
- $template_eng = $a->get_template_engine();
- if($template_eng === 'internal') {
- $template_file = theme_include($s, $root);
- if($template_file)
- return file_get_contents($template_file);
- }
- else {
- $template_file = theme_include("$template_eng/$s", $root);
-
- if($template_file) {
- $template = new FriendicaSmarty();
- $template->filename = $template_file;
-
- return $template;
- }
- }
-}}
+ $t = $a->template_engine();
+ $template = $t->get_markup_template($s, $root);
+ return $template;
+}
diff --git a/include/poller.php b/include/poller.php
index ef4b93fe7..0dcec4c0f 100644
--- a/include/poller.php
+++ b/include/poller.php
@@ -1,4 +1,4 @@
-<?php
+<?php /** @file */
require_once('boot.php');
require_once('include/cli_startup.php');
@@ -21,6 +21,11 @@ function poller_run($argv, $argc){
}
}
+ $interval = intval(get_config('system','poll_interval'));
+ if(! $interval)
+ $interval = ((get_config('system','delivery_interval') === false) ? 3 : intval(get_config('system','delivery_interval')));
+
+
logger('poller: start');
// run queue delivery process in the background
@@ -30,14 +35,59 @@ function poller_run($argv, $argc){
// expire any expired accounts
q("UPDATE account
- SET account_flags = account_flags | %d
- where not account_flags & %d
+ SET account_flags = (account_flags | %d)
+ where not (account_flags & %d)
and account_expires != '0000-00-00 00:00:00'
and account_expires < UTC_TIMESTAMP() ",
intval(ACCOUNT_EXPIRED),
intval(ACCOUNT_EXPIRED)
);
+
+ // expire any expired mail
+
+ q("delete from mail where expires != '0000-00-00 00:00:00' and expires < UTC_TIMESTAMP() ");
+
+ $r = q("select id from item where expires != '0000-00-00 00:00:00' and expires < UTC_TIMESTAMP()
+ and not ( item_restrict & %d ) ",
+ intval(ITEM_DELETED)
+ );
+ if($r) {
+ require_once('include/items.php');
+ foreach($r as $rr)
+ drop_item($rr['id'],false);
+ }
+ // Ensure that every channel pings a directory server once a month. This way we can discover
+ // channels and sites that quietly vanished and prevent the directory from accumulating stale
+ // or dead entries.
+
+ $r = q("select channel_id from channel where channel_dirdate < UTC_TIMESTAMP() - INTERVAL 30 DAY");
+ if($r) {
+ foreach($r as $rr) {
+ proc_run('php','include/directory.php',$rr['channel_id']);
+ if($interval)
+ @time_sleep_until(microtime(true) + (float) $interval);
+ }
+ }
+
+ // publish any applicable items that were set to be published in the future
+ // (time travel posts)
+
+ $r = q("select id from item where ( item_restrict & %d ) and created <= UTC_TIMESTAMP() ",
+ intval(ITEM_DELAYED_PUBLISH)
+ );
+ if($r) {
+ foreach($r as $rr) {
+ $x = q("update item set item_restrict = ( item_restrict ^ %d ) where id = %d limit 1",
+ intval(ITEM_DELAYED_PUBLISH),
+ intval($rr['id'])
+ );
+ if($x) {
+ proc_run('php','include/notifer.php','wall-new',$rr['id']);
+ }
+ }
+ }
+
$abandon_days = intval(get_config('system','account_abandon_days'));
if($abandon_days < 1)
$abandon_days = 0;
@@ -45,15 +95,56 @@ function poller_run($argv, $argc){
// once daily run birthday_updates and then expire in background
+ // FIXME: add birthday updates, both locally and for xprof for use
+ // by directory servers
+
$d1 = get_config('system','last_expire_day');
$d2 = intval(datetime_convert('UTC','UTC','now','d'));
+ $dirmode = get_config('system','directory_mode');
+
if($d2 != intval($d1)) {
-// update_suggestions();
+ // If this is a directory server, request a sync with an upstream
+ // directory at least once a day, up to once every poll interval.
+ // Pull remote changes and push local changes.
+ // potential issue: how do we keep from creating an endless update loop?
+
+ if($dirmode == DIRECTORY_MODE_SECONDARY || $dirmode == DIRECTORY_MODE_PRIMARY) {
+ require_once('include/dir_fns.php');
+ sync_directories($dirmode);
+ }
+
set_config('system','last_expire_day',$d2);
- proc_run('php','include/expire.php');
+
+// Uncomment when expire protocol component is working
+// Update - this is not going to happen. We are only going to
+// implement per-item expire, not blanket expiration
+// proc_run('php','include/expire.php');
+
+ proc_run('php','include/cli_suggest.php');
+
+ }
+
+ // update any photos which didn't get imported properly
+ // This should be rare
+
+ $r = q("select xchan_photo_l, xchan_hash from xchan where xchan_photo_l != '' and xchan_photo_m = ''
+ and xchan_photo_date < UTC_TIMESTAMP() - INTERVAL 1 DAY");
+ if($r) {
+ require_once('include/photo/photo_driver.php');
+ foreach($r as $rr) {
+ $photos = import_profile_photo($rr['xchan_photo_l'],$rr['xchan_hash']);
+ $x = q("update xchan set xchan_photo_l = '%s', xchan_photo_m = '%s', xchan_photo_s = '%s', xchan_photo_mimetype = '%s'
+ where xchan_hash = '%s' limit 1",
+ dbesc($photos[0]),
+ dbesc($photos[1]),
+ dbesc($photos[2]),
+ dbesc($photos[3]),
+ dbesc($rr['xchan_hash'])
+ );
+ }
}
@@ -63,24 +154,21 @@ function poller_run($argv, $argc){
$force = false;
$restart = false;
- if((argc() > 1) && (argv(1) == 'force'))
+ if(($argc > 1) && ($argv[1] == 'force'))
$force = true;
- if((argc() > 1) && (argv(1) == 'restart')) {
+ if(($argc > 1) && ($argv[1] == 'restart')) {
$restart = true;
- $generation = intval(argv(2));
+ $generation = intval($argv[2]);
if(! $generation)
killme();
}
- if((argc() > 1) && intval(argv(1))) {
- $manual_id = intval(argv(1));
+ if(($argc > 1) && intval($argv[1])) {
+ $manual_id = intval($argv[1]);
$force = true;
}
- $interval = intval(get_config('system','poll_interval'));
- if(! $interval)
- $interval = ((get_config('system','delivery_interval') === false) ? 3 : intval(get_config('system','delivery_interval')));
$sql_extra = (($manual_id) ? " AND abook_id = $manual_id " : "");
@@ -102,7 +190,8 @@ function poller_run($argv, $argc){
: ''
);
- $contacts = q("SELECT abook_id, abook_updated, abook_closeness, abook_channel
+
+ $contacts = q("SELECT abook_id, abook_flags, abook_updated, abook_connected, abook_closeness, abook_channel
FROM abook LEFT JOIN account on abook_account = account_id where 1
$sql_extra
AND (( abook_flags = %d ) OR ( abook_flags = %d ))
@@ -115,69 +204,95 @@ function poller_run($argv, $argc){
);
- if(! $contacts) {
- return;
- }
-
- foreach($contacts as $contact) {
+ if($contacts) {
- $update = false;
+ foreach($contacts as $contact) {
- $t = $contact['abook_updated'];
- $c = $contact['abook_connected'];
+ $update = false;
+ $t = $contact['abook_updated'];
+ $c = $contact['abook_connected'];
- if($c == $t) {
- if(datetime_convert('UTC','UTC', 'now') > datetime_convert('UTC','UTC', $t . " + 1 day"))
- $update = true;
- }
- else {
- // if we've never connected with them, start the mark for death countdown from now
-
- if($c === '0000-00-00 00:00:00') {
- $r = q("update abook set abook_connected = '%s' where abook_id = %d limit 1",
- dbesc(datetime_convert()),
- intval($abook['abook_id'])
- );
- $c = datetime_convert();
- $update = true;
- }
-
- // He's dead, Jim
- if(datetime_convert('UTC','UTC', 'now') > datetime_convert('UTC','UTC', $c . " + 30 day")) {
- $r = q("update abook set abook_flags = (abook_flags & %d) where abook_id = %d limit 1",
- intval(ABOOK_FLAG_ARCHIVED),
- intval($contact['abook_id'])
- );
- $update = false;
- continue;
+ if($c == $t) {
+ if(datetime_convert('UTC','UTC', 'now') > datetime_convert('UTC','UTC', $t . " + 1 day"))
+ $update = true;
}
+ else {
+ // if we've never connected with them, start the mark for death countdown from now
+
+ if($c == '0000-00-00 00:00:00') {
+ $r = q("update abook set abook_connected = '%s' where abook_id = %d limit 1",
+ dbesc(datetime_convert()),
+ intval($contact['abook_id'])
+ );
+ $c = datetime_convert();
+ $update = true;
+ }
+
+ // He's dead, Jim
+
+ if(strcmp(datetime_convert('UTC','UTC', 'now'),datetime_convert('UTC','UTC', $c . " + 30 day")) > 0) {
+ $r = q("update abook set abook_flags = (abook_flags | %d) where abook_id = %d limit 1",
+ intval(ABOOK_FLAG_ARCHIVED),
+ intval($contact['abook_id'])
+ );
+ $update = false;
+ continue;
+ }
+
+ if($contact['abook_flags'] & ABOOK_FLAG_ARCHIVED) {
+ $update = false;
+ continue;
+ }
+
+ // might be dead, so maybe don't poll quite so often
+
+ // recently deceased, so keep up the regular schedule for 3 days
+
+ if((strcmp(datetime_convert('UTC','UTC', 'now'),datetime_convert('UTC','UTC', $c . " + 3 day")) > 0)
+ && (strcmp(datetime_convert('UTC','UTC', 'now'),datetime_convert('UTC','UTC', $t . " + 1 day")) > 0))
+ $update = true;
- // might be dead, so maybe don't poll quite so often
+ // After that back off and put them on a morphine drip
- // recently deceased, so keep up the regular schedule for 3 days
-
- if((datetime_convert('UTC','UTC', 'now') > datetime_convert('UTC','UTC', $c . " + 3 day"))
- && (datetime_convert('UTC','UTC', 'now') > datetime_convert('UTC','UTC', $t . " + 1 day")))
- $update = true;
+ if(strcmp(datetime_convert('UTC','UTC', 'now'),datetime_convert('UTC','UTC', $t . " + 2 day")) > 0) {
+ $update = true;
+ }
- // After that back off and put them on a morphine drip
- if(datetime_convert('UTC','UTC', 'now') > datetime_convert('UTC','UTC', $t . " + 2 day")) {
- $update = true;
}
- }
- if((! $update) && (! $force))
- continue;
+ if((! $update) && (! $force))
+ continue;
- proc_run('php','include/onepoll.php',$contact['abook_id']);
- if($interval)
- @time_sleep_until(microtime(true) + (float) $interval);
+ proc_run('php','include/onepoll.php',$contact['abook_id']);
+ if($interval)
+ @time_sleep_until(microtime(true) + (float) $interval);
+ }
}
+ if($dirmode == DIRECTORY_MODE_SECONDARY || $dirmode == DIRECTORY_MODE_PRIMARY) {
+ $r = q("select distinct ud_addr, updates.* from updates where not ( ud_flags & %d ) and ud_addr != '' and ( ud_last = '0000-00-00 00:00:00' OR ud_last > UTC_TIMESTAMP() - INTERVAL 7 DAY ) group by ud_addr ",
+ intval(UPDATE_FLAGS_UPDATED)
+ );
+ if($r) {
+ foreach($r as $rr) {
+
+ // If they didn't respond when we attempted before, back off to once a day
+ // After 7 days we won't bother anymore
+
+ if($rr['ud_last'] != '0000-00-00 00:00:00')
+ if($rr['ud_last'] > datetime_convert('UTC','UTC', 'now - 1 day'))
+ continue;
+ proc_run('php','include/onedirsync.php',$rr['ud_id']);
+ if($interval)
+ @time_sleep_until(microtime(true) + (float) $interval);
+ }
+ }
+ }
+
return;
}
diff --git a/include/profile_advanced.php b/include/profile_advanced.php
deleted file mode 100644
index 749c79a3b..000000000
--- a/include/profile_advanced.php
+++ /dev/null
@@ -1,90 +0,0 @@
-<?php
-
-function advanced_profile(&$a) {
-
- $o = '';
-
- $o .= '<h2>' . t('Profile') . '</h2>';
-
- if($a->profile['name']) {
-
- $tpl = get_markup_template('profile_advanced.tpl');
-
- $profile = array();
-
- $profile['fullname'] = array( t('Full Name:'), $a->profile['name'] ) ;
-
- if($a->profile['gender']) $profile['gender'] = array( t('Gender:'), $a->profile['gender'] );
-
-
- if(($a->profile['dob']) && ($a->profile['dob'] != '0000-00-00')) {
-
- $year_bd_format = t('j F, Y');
- $short_bd_format = t('j F');
-
-
- $val = ((intval($a->profile['dob']))
- ? day_translate(datetime_convert('UTC','UTC',$a->profile['dob'] . ' 00:00 +00:00',$year_bd_format))
- : day_translate(datetime_convert('UTC','UTC','2001-' . substr($a->profile['dob'],5) . ' 00:00 +00:00',$short_bd_format)));
-
- $profile['birthday'] = array( t('Birthday:'), $val);
-
- }
-
- if($age = age($a->profile['dob'],$a->profile['timezone'],'')) $profile['age'] = array( t('Age:'), $age );
-
-
- if($a->profile['marital']) $profile['marital'] = array( t('Status:'), $a->profile['marital']);
-
-
- if($a->profile['with']) $profile['marital']['with'] = $a->profile['with'];
-
- if(strlen($a->profile['howlong']) && $a->profile['howlong'] !== '0000-00-00 00:00:00') {
- $profile['howlong'] = relative_date($a->profile['howlong'], t('for %1$d %2$s'));
- }
-
- if($a->profile['sexual']) $profile['sexual'] = array( t('Sexual Preference:'), $a->profile['sexual'] );
-
- if($a->profile['homepage']) $profile['homepage'] = array( t('Homepage:'), linkify($a->profile['homepage']) );
-
- if($a->profile['hometown']) $profile['hometown'] = array( t('Hometown:'), linkify($a->profile['hometown']) );
-
- if($a->profile['keywords']) $profile['keywords'] = array( t('Tags:'), $a->profile['keywords']);
-
- if($a->profile['politic']) $profile['politic'] = array( t('Political Views:'), $a->profile['politic']);
-
- if($a->profile['religion']) $profile['religion'] = array( t('Religion:'), $a->profile['religion']);
-
- if($txt = prepare_text($a->profile['about'])) $profile['about'] = array( t('About:'), $txt );
-
- if($txt = prepare_text($a->profile['interest'])) $profile['interest'] = array( t('Hobbies/Interests:'), $txt);
-
- if($txt = prepare_text($a->profile['likes'])) $profile['likes'] = array( t('Likes:'), $txt);
-
- if($txt = prepare_text($a->profile['dislikes'])) $profile['dislikes'] = array( t('Dislikes:'), $txt);
-
-
- if($txt = prepare_text($a->profile['contact'])) $profile['contact'] = array( t('Contact information and Social Networks:'), $txt);
-
- if($txt = prepare_text($a->profile['music'])) $profile['music'] = array( t('Musical interests:'), $txt);
-
- if($txt = prepare_text($a->profile['book'])) $profile['book'] = array( t('Books, literature:'), $txt);
-
- if($txt = prepare_text($a->profile['tv'])) $profile['tv'] = array( t('Television:'), $txt);
-
- if($txt = prepare_text($a->profile['film'])) $profile['film'] = array( t('Film/dance/culture/entertainment:'), $txt);
-
- if($txt = prepare_text($a->profile['romance'])) $profile['romance'] = array( t('Love/Romance:'), $txt);
-
- if($txt = prepare_text($a->profile['work'])) $profile['work'] = array( t('Work/employment:'), $txt);
-
- if($txt = prepare_text($a->profile['education'])) $profile['education'] = array( t('School/education:'), $txt );
-
- return replace_macros($tpl, array(
- '$title' => t('Profile'),
- '$profile' => $profile,
- ));
- }
-
- return '';
-}
diff --git a/include/profile_selectors.php b/include/profile_selectors.php
index 8d29fd099..1ffcd49be 100644
--- a/include/profile_selectors.php
+++ b/include/profile_selectors.php
@@ -1,4 +1,4 @@
-<?php
+<?php /** @file */
function gender_selector($current="",$suffix="") {
diff --git a/include/queue.php b/include/queue.php
index c74a08ac9..ec7246cb2 100644
--- a/include/queue.php
+++ b/include/queue.php
@@ -1,4 +1,4 @@
-<?php
+<?php /** @file */
require_once("boot.php");
require_once('include/cli_startup.php');
require_once('include/queue_fn.php');
@@ -40,14 +40,14 @@ function queue_run($argv, $argc){
return;
foreach($r as $rr) {
- if(in_array($rr['outq_hub'],$deadguys))
+ if(in_array($rr['outq_posturl'],$deadguys))
continue;
$result = zot_zot($rr['outq_posturl'],$rr['outq_notify']);
if($result['success']) {
zot_process_response($rr['outq_posturl'],$result, $rr);
}
else {
- $deadguys[] = $rr['outq_hub'];
+ $deadguys[] = $rr['outq_posturl'];
$y = q("update outq set outq_updated = '%s' where outq_hash = '%s' limit 1",
dbesc(datetime_convert()),
dbesc($rr['outq_hash'])
diff --git a/include/queue_fn.php b/include/queue_fn.php
index c9782b939..512edb531 100644
--- a/include/queue_fn.php
+++ b/include/queue_fn.php
@@ -1,4 +1,4 @@
-<?php
+<?php /** @file */
function update_queue_time($id) {
logger('queue: requeue item ' . $id);
diff --git a/include/reddav.php b/include/reddav.php
new file mode 100644
index 000000000..c53838297
--- /dev/null
+++ b/include/reddav.php
@@ -0,0 +1,991 @@
+<?php /** @file */
+
+use Sabre\DAV;
+require_once('vendor/autoload.php');
+
+require_once('include/attach.php');
+
+class RedDirectory extends DAV\Node implements DAV\ICollection {
+
+ private $red_path;
+ private $folder_hash;
+ private $ext_path;
+ private $root_dir = '';
+ private $auth;
+ private $os_path = '';
+
+ function __construct($ext_path,&$auth_plugin) {
+ logger('RedDirectory::__construct() ' . $ext_path, LOGGER_DEBUG);
+ $this->ext_path = $ext_path;
+ $this->red_path = ((strpos($ext_path,'/cloud') === 0) ? substr($ext_path,6) : $ext_path);
+ if(! $this->red_path)
+ $this->red_path = '/';
+ $this->auth = $auth_plugin;
+ $this->folder_hash = '';
+
+ $this->getDir();
+
+ if($this->auth->browser)
+ $this->auth->browser->set_writeable();
+
+ }
+
+ function getChildren() {
+
+ if(get_config('system','block_public') && (! $this->auth->channel_id) && (! $this->auth->observer)) {
+ throw new DAV\Exception\Forbidden('Permission denied.');
+ return;
+ }
+
+ if(($this->auth->owner_id) && (! perm_is_allowed($this->auth->owner_id,$this->auth->observer,'view_storage'))) {
+ throw new DAV\Exception\Forbidden('Permission denied.');
+ return;
+ }
+
+ $contents = RedCollectionData($this->red_path,$this->auth);
+ return $contents;
+ }
+
+
+ function getChild($name) {
+
+ logger('RedDirectory::getChild : ' . $name, LOGGER_DATA);
+
+
+ if(get_config('system','block_public') && (! $this->auth->channel_id) && (! $this->auth->observer)) {
+ throw new DAV\Exception\Forbidden('Permission denied.');
+ return;
+ }
+
+ if(($this->auth->owner_id) && (! perm_is_allowed($this->auth->owner_id,$this->auth->observer,'view_storage'))) {
+ throw new DAV\Exception\Forbidden('Permission denied.');
+ return;
+ }
+
+ if($this->red_path === '/' && $name === 'cloud') {
+ return new RedDirectory('/cloud', $this->auth);
+ }
+
+ $x = RedFileData($this->ext_path . '/' . $name, $this->auth);
+ if($x)
+ return $x;
+
+ throw new DAV\Exception\NotFound('The file with name: ' . $name . ' could not be found');
+
+ }
+
+ function getName() {
+ logger('RedDirectory::getName returns: ' . basename($this->red_path), LOGGER_DATA);
+ return (basename($this->red_path));
+ }
+
+
+
+
+ function createFile($name,$data = null) {
+ logger('RedDirectory::createFile : ' . $name, LOGGER_DEBUG);
+
+ if(! $this->auth->owner_id) {
+ logger('createFile: permission denied');
+ throw new DAV\Exception\Forbidden('Permission denied.');
+ return;
+ }
+
+ if(! perm_is_allowed($this->auth->owner_id,$this->auth->observer,'write_storage')) {
+ logger('createFile: permission denied');
+ throw new DAV\Exception\Forbidden('Permission denied.');
+ return;
+ }
+
+ $mimetype = z_mime_content_type($name);
+
+
+ $c = q("select * from channel where channel_id = %d and not (channel_pageflags & %d) limit 1",
+ intval(PAGE_REMOVED),
+ intval($this->auth->owner_id)
+ );
+
+ if(! $c) {
+ logger('createFile: no channel');
+ throw new DAV\Exception\Forbidden('Permission denied.');
+ return;
+ }
+
+
+ $filesize = 0;
+ $hash = random_string();
+
+ $r = q("INSERT INTO attach ( aid, uid, hash, creator, filename, folder, flags, filetype, filesize, revision, data, created, edited, allow_cid, allow_gid, deny_cid, deny_gid )
+ VALUES ( %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s' ) ",
+ intval($c[0]['channel_account_id']),
+ intval($c[0]['channel_id']),
+ dbesc($hash),
+ dbesc($this->auth->observer),
+ dbesc($name),
+ dbesc($this->folder_hash),
+ dbesc(ATTACH_FLAG_OS),
+ dbesc($mimetype),
+ intval($filesize),
+ intval(0),
+ dbesc($this->os_path . '/' . $hash),
+ dbesc(datetime_convert()),
+ dbesc(datetime_convert()),
+ dbesc($c[0]['channel_allow_cid']),
+ dbesc($c[0]['channel_allow_gid']),
+ dbesc($c[0]['channel_deny_cid']),
+ dbesc($c[0]['channel_deny_gid'])
+
+
+ );
+
+ $f = 'store/' . $this->auth->owner_nick . '/' . (($this->os_path) ? $this->os_path . '/' : '') . $hash;
+
+ file_put_contents($f, $data);
+ $size = filesize($f);
+
+ $edited = datetime_convert();
+
+ $d = q("update attach set filesize = '%s', edited = '%s' where hash = '%s' and uid = %d limit 1",
+ dbesc($size),
+ dbesc($edited),
+ dbesc($hash),
+ intval($c[0]['channel_id'])
+ );
+
+ $e = q("update attach set edited = '%s' where folder = '%s' and uid = %d limit 1",
+ dbesc($edited),
+ dbesc($this->folder_hash),
+ intval($c[0]['channel_id'])
+ );
+
+ $maxfilesize = get_config('system','maxfilesize');
+
+ if(($maxfilesize) && ($size > $maxfilesize)) {
+ attach_delete($c[0]['channel_id'],$hash);
+ return;
+ }
+
+ $limit = service_class_fetch($c[0]['channel_id'],'attach_upload_limit');
+ if($limit !== false) {
+ $x = q("select sum(filesize) as total from attach where aid = %d ",
+ intval($c[0]['channel_account_id'])
+ );
+ if(($x) && ($x[0]['total'] + $size > $limit)) {
+ logger('reddav: service class limit exceeded for ' . $c[0]['channel_name'] . ' total usage is ' . $x[0]['total'] . ' limit is ' . $limit);
+ attach_delete($c[0]['channel_id'],$hash);
+ return;
+ }
+ }
+ }
+
+
+ function createDirectory($name) {
+
+ logger('RedDirectory::createDirectory: ' . $name, LOGGER_DEBUG);
+
+ if((! $this->auth->owner_id) || (! perm_is_allowed($this->auth->owner_id,$this->auth->observer,'write_storage'))) {
+ throw new DAV\Exception\Forbidden('Permission denied.');
+ return;
+ }
+
+ $r = q("select * from channel where channel_id = %d and not (channel_pageflags & %d) limit 1",
+ intval(PAGE_REMOVED),
+ intval($this->auth->owner_id)
+ );
+
+ if($r) {
+ $result = attach_mkdir($r[0],$this->auth->observer,array('filename' => $name,'folder' => $this->folder_hash));
+ if(! $result['success'])
+ logger('RedDirectory::createDirectory: ' . print_r($result,true), LOGGER_DEBUG);
+ }
+ }
+
+
+ function childExists($name) {
+
+ if($this->red_path === '/' && $name === 'cloud') {
+ logger('RedDirectory::childExists /cloud: true', LOGGER_DATA);
+ return true;
+ }
+
+ $x = RedFileData($this->ext_path . '/' . $name, $this->auth,true);
+ logger('RedFileData returns: ' . print_r($x,true), LOGGER_DATA);
+ if($x)
+ return true;
+ return false;
+ }
+
+ function getDir() {
+ logger('getDir: ' . $this->ext_path, LOGGER_DEBUG);
+
+ $file = $this->ext_path;
+
+ $x = strpos($file,'/cloud');
+ if($x === false)
+ return;
+ if($x === 0) {
+ $file = substr($file,6);
+ }
+
+ if((! $file) || ($file === '/')) {
+ return;
+ }
+
+ $file = trim($file,'/');
+ $path_arr = explode('/', $file);
+
+ if(! $path_arr)
+ return;
+
+
+ logger('getDir(): path: ' . print_r($path_arr,true));
+
+ $channel_name = $path_arr[0];
+
+
+ $r = q("select channel_id from channel where channel_address = '%s' and not ( channel_pageflags & %d ) limit 1",
+ dbesc($channel_name),
+ intval(PAGE_REMOVED)
+ );
+
+ if(! $r) {
+ throw new DAV\Exception\NotFound('The file with name: ' . $channel_name . ' could not be found');
+
+ return;
+ }
+ $channel_id = $r[0]['channel_id'];
+ $this->auth->owner_id = $channel_id;
+ $this->auth->owner_nick = $channel_name;
+
+ $path = '/' . $channel_name;
+
+ $folder = '';
+ $os_path = '';
+
+ for($x = 1; $x < count($path_arr); $x ++) {
+
+ $r = q("select id, hash, filename, flags from attach where folder = '%s' and filename = '%s' and (flags & %d)",
+ dbesc($folder),
+ dbesc($path_arr[$x]),
+ intval($channel_id),
+ intval(ATTACH_FLAG_DIR)
+ );
+
+ if($r && ( $r[0]['flags'] & ATTACH_FLAG_DIR)) {
+ $folder = $r[0]['hash'];
+ if(strlen($os_path))
+ $os_path .= '/';
+ $os_path .= $folder;
+
+ $path = $path . '/' . $r[0]['filename'];
+ }
+ }
+ $this->folder_hash = $folder;
+ $this->os_path = $os_path;
+ return;
+ }
+
+
+ function getLastModified() {
+ $r = q("select edited from attach where folder = '%s' and uid = %d order by edited desc limit 1",
+ dbesc($this->folder_hash),
+ intval($this->auth->owner_id)
+ );
+ if($r)
+ return datetime_convert('UTC','UTC', $r[0]['edited'],'U');
+ return '';
+ }
+
+
+
+}
+
+
+class RedFile extends DAV\Node implements DAV\IFile {
+
+ private $data;
+ private $auth;
+ private $name;
+
+ function __construct($name, $data, &$auth) {
+ $this->name = $name;
+ $this->data = $data;
+ $this->auth = $auth;
+
+ logger('RedFile::_construct: ' . print_r($this->data,true), LOGGER_DATA);
+ }
+
+
+ function getName() {
+ logger('RedFile::getName: ' . basename($this->name), LOGGER_DEBUG);
+ return basename($this->name);
+
+ }
+
+
+ function setName($newName) {
+ logger('RedFile::setName: ' . basename($this->name) . ' -> ' . $newName, LOGGER_DEBUG);
+
+ if((! $newName) || (! $this->auth->owner_id) || (! perm_is_allowed($this->auth->owner_id,$this->auth->observer,'write_storage'))) {
+ throw new DAV\Exception\Forbidden('Permission denied.');
+ return;
+ }
+
+ $newName = str_replace('/','%2F',$newName);
+
+ $r = q("update attach set filename = '%s' where hash = '%s' and id = %d limit 1",
+ dbesc($this->data['filename']),
+ intval($this->data['id'])
+ );
+
+ }
+
+
+ function put($data) {
+ logger('RedFile::put: ' . basename($this->name), LOGGER_DEBUG);
+
+ $c = q("select * from channel where channel_id = %d and not (channel_pageflags & %d) limit 1",
+ intval(PAGE_REMOVED),
+ intval($this->auth->owner_id)
+ );
+
+ $r = q("select flags, folder, data from attach where hash = '%s' and uid = %d limit 1",
+ dbesc($this->data['hash']),
+ intval($c[0]['channel_id'])
+ );
+ if($r) {
+ if($r[0]['flags'] & ATTACH_FLAG_OS) {
+ $f = 'store/' . $this->auth->owner_nick . '/' . (($r[0]['data']) ? $r[0]['data'] : '');
+ @file_put_contents($f, $data);
+ $size = @filesize($f);
+ logger('reddav: put() filename: ' . $f . ' size: ' . $size, LOGGER_DEBUG);
+ }
+ else {
+ $r = q("update attach set data = '%s' where hash = '%s' and uid = %d limit 1",
+ dbesc(stream_get_contents($data)),
+ dbesc($this->data['hash']),
+ intval($this->data['uid'])
+ );
+ $r = q("select length(data) as fsize from attach where hash = '%s' and uid = %d limit 1",
+ dbesc($this->data['hash']),
+ intval($this->data['uid'])
+ );
+ if($r)
+ $size = $r[0]['fsize'];
+ }
+
+ }
+
+ $edited = datetime_convert();
+
+ $d = q("update attach set filesize = '%s', edited = '%s' where hash = '%s' and uid = %d limit 1",
+ dbesc($size),
+ dbesc($edited),
+ dbesc($this->data['hash']),
+ intval($c[0]['channel_id'])
+ );
+
+ $e = q("update attach set edited = '%s' where folder = '%s' and uid = %d limit 1",
+ dbesc($edited),
+ dbesc($r[0]['folder']),
+ intval($c[0]['channel_id'])
+ );
+
+ $maxfilesize = get_config('system','maxfilesize');
+
+ if(($maxfilesize) && ($size > $maxfilesize)) {
+ attach_delete($c[0]['channel_id'],$this->data['hash']);
+ return;
+ }
+
+ $limit = service_class_fetch($c[0]['channel_id'],'attach_upload_limit');
+ if($limit !== false) {
+ $x = q("select sum(filesize) as total from attach where aid = %d ",
+ intval($c[0]['channel_account_id'])
+ );
+ if(($x) && ($x[0]['total'] + $size > $limit)) {
+ logger('reddav: service class limit exceeded for ' . $c[0]['channel_name'] . ' total usage is ' . $x[0]['total'] . ' limit is ' . $limit);
+ attach_delete($c[0]['channel_id'],$this->data['hash']);
+ return;
+ }
+ }
+ }
+
+
+ function get() {
+ logger('RedFile::get: ' . basename($this->name), LOGGER_DEBUG);
+
+ $r = q("select data, flags from attach where hash = '%s' and uid = %d limit 1",
+ dbesc($this->data['hash']),
+ intval($this->data['uid'])
+ );
+ if($r) {
+ if($r[0]['flags'] & ATTACH_FLAG_OS ) {
+ $f = 'store/' . $this->auth->owner_nick . '/' . (($this->os_path) ? $this->os_path . '/' : '') . $r[0]['data'];
+ return fopen($f,'rb');
+ }
+ return $r[0]['data'];
+ }
+
+ }
+
+ function getETag() {
+ return $this->data['hash'];
+ }
+
+
+ function getContentType() {
+ return $this->data['filetype'];
+ }
+
+
+ function getSize() {
+ return $this->data['filesize'];
+ }
+
+
+ function getLastModified() {
+ return datetime_convert('UTC','UTC',$this->data['edited'],'U');
+ }
+
+
+ function delete() {
+ if((! $this->auth->owner_id) || (! perm_is_allowed($this->auth->owner_id,$this->auth->observer,'write_storage'))) {
+ throw new DAV\Exception\Forbidden('Permission denied.');
+ return;
+ }
+
+ if($this->auth->owner_id !== $this->auth->channel_id) {
+ if(($this->auth->observer !== $this->data['creator']) || ($this->data['flags'] & ATTACH_FLAG_DIR)) {
+ throw new DAV\Exception\Forbidden('Permission denied.');
+ return;
+ }
+ }
+
+ attach_delete($this->auth->owner_id,$this->data['hash']);
+ }
+
+}
+
+function RedChannelList(&$auth) {
+
+ $ret = array();
+
+ $r = q("select channel_id, channel_address from channel where not (channel_pageflags & %d) and not (channel_pageflags & %d) ",
+ intval(PAGE_REMOVED),
+ intval(PAGE_HIDDEN)
+ );
+
+ if($r) {
+ foreach($r as $rr) {
+ if(perm_is_allowed($rr['channel_id'],$auth->observer,'view_storage')) {
+ $ret[] = new RedDirectory('/cloud/' . $rr['channel_address'],$auth);
+ }
+ }
+ }
+ return $ret;
+
+}
+
+
+function RedCollectionData($file,&$auth) {
+
+ $ret = array();
+
+ $x = strpos($file,'/cloud');
+ if($x === 0) {
+ $file = substr($file,6);
+ }
+
+ if((! $file) || ($file === '/')) {
+ return RedChannelList($auth);
+ }
+
+ $file = trim($file,'/');
+ $path_arr = explode('/', $file);
+
+ if(! $path_arr)
+ return null;
+
+ $channel_name = $path_arr[0];
+
+ $r = q("select channel_id from channel where channel_address = '%s' limit 1",
+ dbesc($channel_name)
+ );
+
+ if(! $r)
+ return null;
+
+ $channel_id = $r[0]['channel_id'];
+ $perms = permissions_sql($channel_id);
+
+ $auth->owner_id = $channel_id;
+
+ $path = '/' . $channel_name;
+
+ $folder = '';
+ $errors = false;
+ $permission_error = false;
+
+ for($x = 1; $x < count($path_arr); $x ++) {
+ $r = q("select id, hash, filename, flags from attach where folder = '%s' and filename = '%s' and (flags & %d) $perms limit 1",
+ dbesc($folder),
+ dbesc($path_arr[$x]),
+ intval(ATTACH_FLAG_DIR)
+ );
+ if(! $r) {
+ // path wasn't found. Try without permissions to see if it was the result of permissions.
+ $errors = true;
+ $r = q("select id, hash, filename, flags from attach where folder = '%s' and filename = '%s' and (flags & %d) limit 1",
+ dbesc($folder),
+ basename($path_arr[$x]),
+ intval(ATTACH_FLAG_DIR)
+ );
+ if($r) {
+ $permission_error = true;
+ }
+ break;
+ }
+
+ if($r && ( $r[0]['flags'] & ATTACH_FLAG_DIR)) {
+ $folder = $r[0]['hash'];
+ $path = $path . '/' . $r[0]['filename'];
+ }
+ }
+
+ if($errors) {
+ if($permission_error) {
+ throw new DAV\Exception\Forbidden('Permission denied.');
+ return;
+ }
+ else {
+ throw new DAV\Exception\NotFound('A component of the request file path could not be found');
+ return;
+ }
+ }
+
+ // This should no longer be needed since we just returned errors for paths not found
+
+ if($path !== '/' . $file) {
+ logger("RedCollectionData: Path mismatch: $path !== /$file");
+ return NULL;
+ }
+
+ $ret = array();
+
+ $r = q("select id, uid, hash, filename, filetype, filesize, revision, folder, flags, created, edited from attach where folder = '%s' and uid = %d $perms group by filename",
+ dbesc($folder),
+ intval($channel_id)
+ );
+
+ foreach($r as $rr) {
+ if($rr['flags'] & ATTACH_FLAG_DIR)
+ $ret[] = new RedDirectory('/cloud' . $path . '/' . $rr['filename'],$auth);
+ else
+ $ret[] = new RedFile('/cloud' . $path . '/' . $rr['filename'],$rr,$auth);
+ }
+
+ return $ret;
+
+}
+
+function RedFileData($file, &$auth,$test = false) {
+
+ logger('RedFileData:' . $file . (($test) ? ' (test mode) ' : ''), LOGGER_DEBUG);
+
+
+ $x = strpos($file,'/cloud');
+ if($x === 0) {
+ $file = substr($file,6);
+ }
+
+ if((! $file) || ($file === '/')) {
+ return RedDirectory('/',$auth);
+
+ }
+
+ $file = trim($file,'/');
+
+ $path_arr = explode('/', $file);
+
+ if(! $path_arr)
+ return null;
+
+
+ $channel_name = $path_arr[0];
+
+
+ $r = q("select channel_id from channel where channel_address = '%s' limit 1",
+ dbesc($channel_name)
+ );
+
+ if(! $r)
+ return null;
+
+ $channel_id = $r[0]['channel_id'];
+
+ $path = '/' . $channel_name;
+
+ $auth->owner_id = $channel_id;
+
+ $permission_error = false;
+
+ $folder = '';
+
+ require_once('include/security.php');
+ $perms = permissions_sql($channel_id);
+
+ $errors = false;
+
+ for($x = 1; $x < count($path_arr); $x ++) {
+ $r = q("select id, hash, filename, flags from attach where folder = '%s' and filename = '%s' and uid = %d and (flags & %d) $perms",
+ dbesc($folder),
+ dbesc($path_arr[$x]),
+ intval($channel_id),
+ intval(ATTACH_FLAG_DIR)
+ );
+
+ if($r && ( $r[0]['flags'] & ATTACH_FLAG_DIR)) {
+ $folder = $r[0]['hash'];
+ $path = $path . '/' . $r[0]['filename'];
+ }
+ if(! $r) {
+ $r = q("select id, uid, hash, filename, filetype, filesize, revision, folder, flags, created, edited from attach
+ where folder = '%s' and filename = '%s' and uid = %d $perms group by filename limit 1",
+ dbesc($folder),
+ basename($file),
+ intval($channel_id)
+
+ );
+ }
+ if(! $r) {
+
+ $errors = true;
+ $r = q("select id, uid, hash, filename, filetype, filesize, revision, folder, flags, created, edited from attach
+ where folder = '%s' and filename = '%s' and uid = %d group by filename limit 1",
+ dbesc($folder),
+ basename($file),
+ intval($channel_id)
+ );
+ if($r)
+ $permission_error = true;
+
+ }
+
+ }
+
+ if($path === '/' . $file) {
+ if($test)
+ return true;
+ // final component was a directory.
+ return new RedDirectory('/cloud/' . $file,$auth);
+ }
+
+ if($errors) {
+ logger('RedFileData: not found');
+ if($test)
+ return false;
+ if($permission_error) {
+ logger('RedFileData: permission error');
+ throw new DAV\Exception\Forbidden('Permission denied.');
+ }
+ return;
+ }
+
+ if($r) {
+ if($test)
+ return true;
+
+ if($r[0]['flags'] & ATTACH_FLAG_DIR)
+ return new RedDirectory('/cloud' . $path . '/' . $r[0]['filename'],$auth);
+ else
+ return new RedFile('/cloud' . $path . '/' . $r[0]['filename'],$r[0],$auth);
+ }
+ return false;
+}
+
+
+class RedBasicAuth extends Sabre\DAV\Auth\Backend\AbstractBasic {
+
+ public $channel_name = '';
+ public $channel_id = 0;
+ public $channel_hash = '';
+ public $observer = '';
+ public $browser;
+ public $owner_id;
+ public $owner_nick = '';
+ public $timezone;
+
+ protected function validateUserPass($username, $password) {
+ require_once('include/auth.php');
+ $record = account_verify_password($email,$pass);
+ if($record && $record['account_default_channel']) {
+ $r = q("select * from channel where channel_account_id = %d and channel_id = %d limit 1",
+ intval($record['account_id']),
+ intval($record['account_default_channel'])
+ );
+ if($r) {
+ $this->currentUser = $r[0]['channel_address'];
+ $this->channel_name = $r[0]['channel_address'];
+ $this->channel_id = $r[0]['channel_id'];
+ $this->channel_hash = $this->observer = $r[0]['channel_hash'];
+ return true;
+ }
+ }
+ $r = q("select * from channel where channel_address = '%s' limit 1",
+ dbesc($username)
+ );
+ if($r) {
+ $x = q("select * from account where account_id = %d limit 1",
+ intval($r[0]['channel_account_id'])
+ );
+ if($x) {
+ foreach($x as $record) {
+ if(($record['account_flags'] == ACCOUNT_OK) || ($record['account_flags'] == ACCOUNT_UNVERIFIED)
+ && (hash('whirlpool',$record['account_salt'] . $password) === $record['account_password'])) {
+ logger('(DAV) RedBasicAuth: password verified for ' . $username);
+ $this->currentUser = $r[0]['channel_address'];
+ $this->channel_name = $r[0]['channel_address'];
+ $this->channel_id = $r[0]['channel_id'];
+ $this->channel_hash = $this->observer = $r[0]['channel_hash'];
+ return true;
+ }
+ }
+ }
+ }
+ logger('(DAV) RedBasicAuth: password failed for ' . $username);
+ return false;
+ }
+
+ function setCurrentUser($name) {
+ $this->currentUser = $name;
+ }
+
+ function setBrowserPlugin($browser) {
+ $this->browser = $browser;
+ }
+
+}
+
+
+class RedBrowser extends DAV\Browser\Plugin {
+
+ private $auth;
+
+ function __construct(&$auth) {
+
+ $this->auth = $auth;
+
+
+ }
+
+ // The DAV browser is instantiated after the auth module and directory classes but before we know the current
+ // directory and who the owner and observer are. So we add a pointer to the browser into the auth module and vice
+ // versa. Then when we've figured out what directory is actually being accessed, we call the following function
+ // to decide whether or not to show web elements which include writeable objects.
+
+
+ function set_writeable() {
+
+ if(! $this->auth->owner_id)
+ $this->enablePost = false;
+
+ if(! perm_is_allowed($this->auth->owner_id, get_observer_hash(), 'write_storage'))
+ $this->enablePost = false;
+ else
+ $this->enablePost = true;
+
+ }
+
+ public function generateDirectoryIndex($path) {
+
+ if($this->auth->timezone)
+ date_default_timezone_set($this->auth->timezone);
+
+ $version = '';
+
+ $html = "
+<body>
+ <h1>Index for " . $this->escapeHTML($path) . "/</h1>
+ <table>
+ <tr><th width=\"24\"></th><th>Name</th><th>Type</th><th>Size</th><th>Last modified</th></tr>
+ <tr><td colspan=\"5\"><hr /></td></tr>";
+
+ $files = $this->server->getPropertiesForPath($path,array(
+ '{DAV:}displayname',
+ '{DAV:}resourcetype',
+ '{DAV:}getcontenttype',
+ '{DAV:}getcontentlength',
+ '{DAV:}getlastmodified',
+ ),1);
+
+ $parent = $this->server->tree->getNodeForPath($path);
+
+
+ if ($path) {
+
+ list($parentUri) = DAV\URLUtil::splitPath($path);
+ $fullPath = DAV\URLUtil::encodePath($this->server->getBaseUri() . $parentUri);
+
+ $icon = $this->enableAssets?'<a href="' . $fullPath . '"><img src="' . $this->getAssetUrl('icons/parent' . $this->iconExtension) . '" width="24" alt="Parent" /></a>':'';
+ $html.= "<tr>
+ <td>$icon</td>
+ <td><a href=\"{$fullPath}\">..</a></td>
+ <td>[parent]</td>
+ <td></td>
+ <td></td>
+ </tr>";
+
+ }
+
+ foreach($files as $file) {
+
+ // This is the current directory, we can skip it
+ if (rtrim($file['href'],'/')==$path) continue;
+
+ list(, $name) = DAV\URLUtil::splitPath($file['href']);
+
+ $type = null;
+
+
+ if (isset($file[200]['{DAV:}resourcetype'])) {
+ $type = $file[200]['{DAV:}resourcetype']->getValue();
+
+ // resourcetype can have multiple values
+ if (!is_array($type)) $type = array($type);
+
+ foreach($type as $k=>$v) {
+
+ // Some name mapping is preferred
+ switch($v) {
+ case '{DAV:}collection' :
+ $type[$k] = 'Collection';
+ break;
+ case '{DAV:}principal' :
+ $type[$k] = 'Principal';
+ break;
+ case '{urn:ietf:params:xml:ns:carddav}addressbook' :
+ $type[$k] = 'Addressbook';
+ break;
+ case '{urn:ietf:params:xml:ns:caldav}calendar' :
+ $type[$k] = 'Calendar';
+ break;
+ case '{urn:ietf:params:xml:ns:caldav}schedule-inbox' :
+ $type[$k] = 'Schedule Inbox';
+ break;
+ case '{urn:ietf:params:xml:ns:caldav}schedule-outbox' :
+ $type[$k] = 'Schedule Outbox';
+ break;
+ case '{http://calendarserver.org/ns/}calendar-proxy-read' :
+ $type[$k] = 'Proxy-Read';
+ break;
+ case '{http://calendarserver.org/ns/}calendar-proxy-write' :
+ $type[$k] = 'Proxy-Write';
+ break;
+ }
+
+ }
+ $type = implode(', ', $type);
+ }
+
+ // If no resourcetype was found, we attempt to use
+ // the contenttype property
+ if (!$type && isset($file[200]['{DAV:}getcontenttype'])) {
+ $type = $file[200]['{DAV:}getcontenttype'];
+ }
+ if (!$type) $type = 'Unknown';
+
+ $size = isset($file[200]['{DAV:}getcontentlength'])?(int)$file[200]['{DAV:}getcontentlength']:'';
+ $lastmodified = ((isset($file[200]['{DAV:}getlastmodified']))? $file[200]['{DAV:}getlastmodified']->getTime()->format('Y-m-d H:i:s') :'');
+
+ $fullPath = DAV\URLUtil::encodePath('/' . trim($this->server->getBaseUri() . ($path?$path . '/':'') . $name,'/'));
+
+ $displayName = isset($file[200]['{DAV:}displayname'])?$file[200]['{DAV:}displayname']:$name;
+
+ $displayName = $this->escapeHTML($displayName);
+ $type = $this->escapeHTML($type);
+
+ $icon = '';
+
+ if ($this->enableAssets) {
+ $node = $this->server->tree->getNodeForPath(($path?$path.'/':'') . $name);
+ foreach(array_reverse($this->iconMap) as $class=>$iconName) {
+
+ if ($node instanceof $class) {
+ $icon = '<a href="' . $fullPath . '"><img src="' . $this->getAssetUrl($iconName . $this->iconExtension) . '" alt="" width="24" /></a>';
+ break;
+ }
+
+
+ }
+
+ }
+
+ $html.= "<tr>
+ <td>$icon</td>
+ <td><a href=\"{$fullPath}\">{$displayName}</a></td>
+ <td>{$type}</td>
+ <td>{$size}</td>
+ <td>" . (($lastmodified) ? datetime_convert('UTC', date_default_timezone_get(),$lastmodified) : '') . "</td>
+ </tr>";
+
+ }
+
+ $html.= "<tr><td colspan=\"5\"><hr /></td></tr>";
+
+ $output = '';
+
+ if ($this->enablePost) {
+ $this->server->broadcastEvent('onHTMLActionsPanel',array($parent, &$output));
+ }
+
+ $html.=$output;
+
+ $html.= "</table>";
+
+ get_app()->page['content'] = $html;
+ construct_page(get_app());
+
+// return $html;
+
+ }
+
+
+ public function htmlActionsPanel(DAV\INode $node, &$output) {
+
+ if (!$node instanceof DAV\ICollection)
+ return;
+
+ // We also know fairly certain that if an object is a non-extended
+ // SimpleCollection, we won't need to show the panel either.
+
+ if (get_class($node)==='Sabre\\DAV\\SimpleCollection')
+ return;
+
+ $output.= '<tr><td colspan="2"><form method="post" action="">
+ <h3>Create new folder</h3>
+ <input type="hidden" name="sabreAction" value="mkcol" />
+ Name: <input type="text" name="name" />
+ <input type="submit" value="create" />
+ </form>
+ <form method="post" action="" enctype="multipart/form-data">
+ <h3>Upload file</h3>
+ <input type="hidden" name="sabreAction" value="put" />
+ Name (optional): <input type="text" name="name" /><br />
+ File: <input type="file" name="file" /><br />
+ <input type="submit" value="upload" />
+ </form>
+ </td></tr>';
+
+
+ if($this->auth->owner_id && $this->auth->owner_id == $this->auth->channel_id) {
+ $channel = get_app()->get_channel();
+ if($channel) {
+ $output .= '<tr><td>&nbsp;</td></tr><tr><td colspan="2"><a href="filestorage/' . $channel['channel_address'] . '" >' . t('Edit File properties') . '</a></td></tr>';
+ }
+ }
+
+ }
+
+
+} \ No newline at end of file
diff --git a/include/security.php b/include/security.php
index e691939fb..a87442d42 100644
--- a/include/security.php
+++ b/include/security.php
@@ -1,4 +1,4 @@
-<?php
+<?php /** @file */
function authenticate_success($user_record, $login_initial = false, $interactive = false,$return = false,$update_lastlog = false) {
@@ -34,6 +34,7 @@ function authenticate_success($user_record, $login_initial = false, $interactive
else {
$_SESSION['uid'] = $user_record['uid'];
$_SESSION['theme'] = $user_record['theme'];
+ $_SESSION['mobile_theme'] = get_pconfig($user_record['uid'], 'system', 'mobile_theme');
$_SESSION['authenticated'] = 1;
$_SESSION['page_flags'] = $user_record['page-flags'];
$_SESSION['my_url'] = $a->get_baseurl() . '/channel/' . $user_record['nickname'];
@@ -148,6 +149,7 @@ function change_channel($change_channel) {
$_SESSION['uid'] = intval($r[0]['channel_id']);
get_app()->set_channel($r[0]);
$_SESSION['theme'] = $r[0]['channel_theme'];
+ $_SESSION['mobile_theme'] = get_pconfig(local_user(),'system', 'mobile_theme');
date_default_timezone_set($r[0]['channel_timezone']);
$ret = $r[0];
}
@@ -161,6 +163,9 @@ function change_channel($change_channel) {
get_app()->set_observer($x[0]);
get_app()->set_perms(get_all_perms(local_user(),$hash));
}
+ if(! is_dir('store/' . $r[0]['channel_address']))
+ @mkdir('store/' . $r[0]['channel_address'], STORAGE_DEFAULT_PERMISSIONS,true);
+
}
return $ret;
@@ -205,26 +210,29 @@ function permissions_sql($owner_id,$remote_verified = false,$groups = null) {
else {
- $observer = get_app()->get_observer();
- $groups = init_groups_visitor($remote_user);
-
- $gs = '<<>>'; // should be impossible to match
-
- if(is_array($groups) && count($groups)) {
- foreach($groups as $g)
- $gs .= '|<' . $g . '>';
- }
- $sql = sprintf(
- " AND ( NOT (deny_cid like '%s' OR deny_gid REGEXP '%s')
- AND ( allow_cid like '%s' OR allow_gid REGEXP '%s' OR ( allow_cid = '' AND allow_gid = '') )
- )
- ",
- dbesc(protect_sprintf( '%<' . $remote_user . '>%')),
- dbesc($gs),
- dbesc(protect_sprintf( '%<' . $remote_user . '>%')),
- dbesc($gs)
- );
+ $observer = get_observer_hash();
+ if($observer) {
+ $groups = init_groups_visitor($observer);
+
+ $gs = '<<>>'; // should be impossible to match
+
+ if(is_array($groups) && count($groups)) {
+ foreach($groups as $g)
+ $gs .= '|<' . $g . '>';
+ }
+ $sql = sprintf(
+ " AND ( NOT (deny_cid like '%s' OR deny_gid REGEXP '%s')
+ AND ( allow_cid like '%s' OR allow_gid REGEXP '%s' OR ( allow_cid = '' AND allow_gid = '') )
+ )
+ ",
+ dbesc(protect_sprintf( '%<' . $observer . '>%')),
+ dbesc($gs),
+ dbesc(protect_sprintf( '%<' . $observer . '>%')),
+ dbesc($gs)
+ );
+ }
}
+
return $sql;
}
@@ -260,25 +268,28 @@ function item_permissions_sql($owner_id,$remote_verified = false,$groups = null)
else {
- $observer = get_app()->get_observer();
- $groups = init_groups_visitor($remote_user);
-
- $gs = '<<>>'; // should be impossible to match
-
- if(is_array($groups) && count($groups)) {
- foreach($groups as $g)
- $gs .= '|<' . $g . '>';
- }
- $sql = sprintf(
- " AND ( NOT (deny_cid like '%s' OR deny_gid REGEXP '%s')
- AND ( allow_cid like '%s' OR allow_gid REGEXP '%s' OR ( allow_cid = '' AND allow_gid = '') )
- )
- ",
- dbesc(protect_sprintf( '%<' . $remote_user . '>%')),
- dbesc($gs),
- dbesc(protect_sprintf( '%<' . $remote_user . '>%')),
- dbesc($gs)
- );
+ $observer = get_observer_hash();
+
+ if($observer) {
+ $groups = init_groups_visitor($observer);
+
+ $gs = '<<>>'; // should be impossible to match
+
+ if(is_array($groups) && count($groups)) {
+ foreach($groups as $g)
+ $gs .= '|<' . $g . '>';
+ }
+ $sql = sprintf(
+ " AND ( NOT (deny_cid like '%s' OR deny_gid REGEXP '%s')
+ AND ( allow_cid like '%s' OR allow_gid REGEXP '%s' OR ( allow_cid = '' AND allow_gid = '') )
+ )
+ ",
+ dbesc(protect_sprintf( '%<' . $observer . '>%')),
+ dbesc($gs),
+ dbesc(protect_sprintf( '%<' . $observer . '>%')),
+ dbesc($gs)
+ );
+ }
}
return $sql;
}
@@ -294,16 +305,19 @@ function public_permissions_sql($observer_hash) {
foreach($groups as $g)
$gs .= '|<' . $g . '>';
}
- $sql = sprintf(
- " OR (( NOT (deny_cid like '%s' OR deny_gid REGEXP '%s')
- AND ( allow_cid like '%s' OR allow_gid REGEXP '%s' OR ( allow_cid = '' AND allow_gid = '') )
- ))
- ",
- dbesc(protect_sprintf( '%<' . $observer_hash . '>%')),
- dbesc($gs),
- dbesc(protect_sprintf( '%<' . $observer_hash . '>%')),
- dbesc($gs)
- );
+ $sql = '';
+ if($observer_hash) {
+ $sql = sprintf(
+ " OR (( NOT (deny_cid like '%s' OR deny_gid REGEXP '%s')
+ AND ( allow_cid like '%s' OR allow_gid REGEXP '%s' OR ( allow_cid = '' AND allow_gid = '') )
+ ))
+ ",
+ dbesc(protect_sprintf( '%<' . $observer_hash . '>%')),
+ dbesc($gs),
+ dbesc(protect_sprintf( '%<' . $observer_hash . '>%')),
+ dbesc($gs)
+ );
+ }
return $sql;
}
@@ -375,12 +389,12 @@ function check_form_security_token_ForbiddenOnErr($typename = '', $formname = 'f
if(! function_exists('init_groups_visitor')) {
function init_groups_visitor($contact_id) {
$groups = array();
- $r = q("SELECT gid FROM group_member WHERE xchan = '%s' ",
+ $r = q("SELECT hash FROM `groups` left join group_member on groups.id = group_member.gid WHERE xchan = '%s' ",
dbesc($contact_id)
);
if(count($r)) {
foreach($r as $rr)
- $groups[] = $rr['gid'];
+ $groups[] = $rr['hash'];
}
return $groups;
}}
@@ -401,7 +415,7 @@ function stream_perms_api_uids($perms_min = PERMS_SITE) {
$ret = array();
if(local_user())
$ret[] = local_user();
- $r = q("select channel_id from channel where channel_r_stream <= %d",
+ $r = q("select channel_id from channel where channel_r_stream > 0 and channel_r_stream <= %d",
intval($perms_min)
);
if($r)
@@ -416,6 +430,30 @@ function stream_perms_api_uids($perms_min = PERMS_SITE) {
$str .= ',';
$str .= intval($rr);
}
+logger('stream_perms_api_uids: ' . $str);
return $str;
}
+function stream_perms_xchans($perms_min = PERMS_SITE) {
+ $ret = array();
+ if(local_user())
+ $ret[] = get_observer_hash();
+
+ $r = q("select channel_hash from channel where channel_r_stream > 0 and channel_r_stream <= %d",
+ intval($perms_min)
+ );
+ if($r)
+ foreach($r as $rr)
+ if(! in_array($rr['channel_hash'],$ret))
+ $ret[] = $rr['channel_hash'];
+
+ $str = '';
+ if($ret)
+ foreach($ret as $rr) {
+ if($str)
+ $str .= ',';
+ $str .= "'" . dbesc($rr) . "'";
+ }
+logger('stream_perms_xchans: ' . $str);
+ return $str;
+}
diff --git a/include/session.php b/include/session.php
index 6c32e299f..6072bdb33 100644
--- a/include/session.php
+++ b/include/session.php
@@ -1,4 +1,4 @@
-<?php
+<?php /** @file */
// Session management functions. These provide database storage of PHP
// session info.
@@ -6,12 +6,23 @@
$session_exists = 0;
$session_expire = 180000;
-if(! function_exists('ref_session_open')) {
+
+
+
+function new_cookie($time) {
+ $old_sid = session_id();
+ session_set_cookie_params("$time");
+ session_regenerate_id(false);
+
+ q("UPDATE session SET sid = '%s' WHERE sid = '%s'", dbesc(session_id()), dbesc($old_sid));
+}
+
+
function ref_session_open ($s,$n) {
return true;
-}}
+}
+
-if(! function_exists('ref_session_read')) {
function ref_session_read ($id) {
global $session_exists;
if(x($id))
@@ -21,9 +32,9 @@ function ref_session_read ($id) {
return $r[0]['data'];
}
return '';
-}}
+}
+
-if(! function_exists('ref_session_write')) {
function ref_session_write ($id,$data) {
global $session_exists, $session_expire;
if(! $id || ! $data) {
@@ -44,25 +55,25 @@ function ref_session_write ($id,$data) {
dbesc($id), dbesc($default_expire), dbesc($data));
return true;
-}}
+}
+
-if(! function_exists('ref_session_close')) {
function ref_session_close() {
return true;
-}}
+}
+
-if(! function_exists('ref_session_destroy')) {
function ref_session_destroy ($id) {
q("DELETE FROM `session` WHERE `sid` = '%s'", dbesc($id));
return true;
-}}
+}
+
-if(! function_exists('ref_session_gc')) {
function ref_session_gc($expire) {
- q("DELETE FROM `session` WHERE `expire` < %d", dbesc(time()));
- q("OPTIMIZE TABLE `sess_data`");
+ q("DELETE FROM session WHERE expire < %d", dbesc(time()));
+ q("OPTIMIZE TABLE session");
return true;
-}}
+}
$gc_probability = 50;
@@ -71,6 +82,4 @@ ini_set('session.use_only_cookies', 1);
ini_set('session.cookie_httponly', 1);
-session_set_save_handler ('ref_session_open', 'ref_session_close',
- 'ref_session_read', 'ref_session_write',
- 'ref_session_destroy', 'ref_session_gc');
+session_set_save_handler ('ref_session_open', 'ref_session_close', 'ref_session_read', 'ref_session_write', 'ref_session_destroy', 'ref_session_gc');
diff --git a/include/socgraph.php b/include/socgraph.php
index 0d9ae3e6c..0e91eba60 100644
--- a/include/socgraph.php
+++ b/include/socgraph.php
@@ -1,10 +1,17 @@
-<?php
+<?php /** @file */
+require_once('include/dir_fns.php');
require_once('include/zot.php');
/*
* poco_load
*
+ * xchan is your connection
+ * We will load their friend list, and store in xlink_xchan your connection hash and xlink_link the hash for each connection
+ * If xchan isn't provided we will load the list of people from url who have indicated they are willing to be friends with
+ * new folks and add them to xlink with no xlink_xchan.
+ *
+ * Old behaviour: (documentation only):
* Given a contact-id (minimum), load the PortableContacts friend list for that contact,
* and add the entries to the gcontact (Global Contact) table, or update existing entries
* if anything (name or photo) has changed.
@@ -19,7 +26,7 @@ require_once('include/zot.php');
-function poco_load($xchan = null,$url = null) {
+function poco_load($xchan = '',$url = null) {
$a = get_app();
if($xchan && ! $url) {
@@ -44,7 +51,12 @@ function poco_load($xchan = null,$url = null) {
$s = z_fetch_url($url);
if(! $s['success']) {
- logger('poco_load: returns ' . print_r($s,true));
+ if($s['return_code'] == 401)
+ logger('poco_load: protected');
+ elseif($s['return_code'] == 404)
+ logger('poco_load: nothing found');
+ else
+ logger('poco_load: returns ' . print_r($s,true));
return;
}
@@ -60,7 +72,6 @@ function poco_load($xchan = null,$url = null) {
$total = 0;
foreach($j['entry'] as $entry) {
- $total ++;
$profile_url = '';
$profile_photo = '';
$address = '';
@@ -112,30 +123,40 @@ function poco_load($xchan = null,$url = null) {
if($j)
import_xchan($j);
}
+ $x = q("select xchan_hash from xchan where xchan_hash = '%s' limit 1",
+ dbesc($hash)
+ );
+ if(! $x) {
+ continue;
+ }
+ }
+ else {
+ continue;
}
}
+ $total ++;
- if($xchan) {
- $r = q("select * from xlink where xlink_xchan = '%s' and xlink_link = '%s' limit 1",
+
+ $r = q("select * from xlink where xlink_xchan = '%s' and xlink_link = '%s' limit 1",
+ dbesc($xchan),
+ dbesc($hash)
+ );
+
+ if(! $r) {
+ q("insert into xlink ( xlink_xchan, xlink_link, xlink_rating, xlink_updated ) values ( '%s', '%s', %d, '%s' ) ",
dbesc($xchan),
- dbesc($hash)
+ dbesc($hash),
+ intval($rating),
+ dbesc(datetime_convert())
+ );
+ }
+ else {
+ q("update xlink set xlink_updated = '%s', xlink_rating = %d where xlink_id = %d limit 1",
+ dbesc(datetime_convert()),
+ intval($rating),
+ intval($r[0]['xlink_id'])
);
- if(! $r) {
- q("insert into xlink ( xlink_xchan, xlink_link, xlink_rating, xlink_updated ) values ( '%s', '%s', %d, '%s' ) ",
- dbesc($xchan),
- dbesc($hash),
- intval($rating),
- dbesc(datetime_convert())
- );
- }
- else {
- q("update xlink set xlink_updated = '%s', rating = %d where xlink_id = %d limit 1",
- dbesc(datetime_convert()),
- intval($rating),
- intval($r[0]['xlink_id'])
- );
- }
}
}
logger("poco_load: loaded $total entries",LOGGER_DEBUG);
@@ -254,80 +275,96 @@ function all_friends($uid,$cid,$start = 0, $limit = 80) {
-function suggestion_query($uid, $start = 0, $limit = 80) {
+function suggestion_query($uid, $myxchan, $start = 0, $limit = 80) {
- if(! $uid)
+ if((! $uid) || (! $myxchan))
return array();
- $r = q("SELECT count(glink.gcid) as `total`, gcontact.* from gcontact
- left join glink on glink.gcid = gcontact.id
- where uid = %d and not gcontact.nurl in ( select nurl from contact where uid = %d )
- and not gcontact.name in ( select name from contact where uid = %d )
- and not gcontact.id in ( select gcid from gcign where uid = %d )
- group by glink.gcid order by total desc limit %d, %d ",
- intval($uid),
+ $r = q("SELECT count(xlink_xchan) as `total`, xchan.* from xchan
+ left join xlink on xlink_link = xchan_hash
+ where xlink_xchan in ( select abook_xchan from abook where abook_channel = %d )
+ and not xlink_link in ( select abook_xchan from abook where abook_channel = %d )
+ and not xlink_link in ( select xchan from xign where uid = %d )
+ and xlink_xchan != ''
+ and not ( xchan_flags & %d )
+ and not ( xchan_flags & %d )
+ group by xchan_hash order by total desc limit %d, %d ",
intval($uid),
intval($uid),
intval($uid),
+ intval(XCHAN_FLAGS_HIDDEN),
+ intval(XCHAN_FLAGS_DELETED),
intval($start),
intval($limit)
);
- if(count($r) && count($r) >= ($limit -1))
+ if($r && count($r) >= ($limit -1))
return $r;
- $r2 = q("SELECT gcontact.* from gcontact
- left join glink on glink.gcid = gcontact.id
- where glink.uid = 0 and glink.cid = 0 and glink.zcid = 0 and not gcontact.nurl in ( select nurl from contact where uid = %d )
- and not gcontact.name in ( select name from contact where uid = %d )
- and not gcontact.id in ( select gcid from gcign where uid = %d )
- order by rand() limit %d, %d ",
- intval($uid),
+ $r2 = q("SELECT count(xlink_link) as `total`, xchan.* from xchan
+ left join xlink on xlink_link = xchan_hash
+ where xlink_xchan = ''
+ and not xlink_link in ( select abook_xchan from abook where abook_channel = %d )
+ and not xlink_link in ( select xchan from xign where uid = %d )
+ and not ( xchan_flags & %d )
+ and not ( xchan_flags & %d )
+ group by xchan_hash order by total desc limit %d, %d ",
intval($uid),
intval($uid),
+ intval(XCHAN_FLAGS_HIDDEN),
+ intval(XCHAN_FLAGS_DELETED),
intval($start),
intval($limit)
);
+ if(is_array($r) && is_array($r2))
+ return array_merge($r,$r2);
- return array_merge($r,$r2);
-
+ return array();
}
function update_suggestions() {
-// FIXME
-return;
$a = get_app();
- $done = array();
-
- // fix this to get a json list from an upstream directory
-// poco_load(0,0,0,$a->get_baseurl() . '/poco');
-
-// $done[] = $a->get_baseurl() . '/poco';
-
-// if(strlen(get_config('system','directory_submit_url'))) {
-// $x = fetch_url('http://dir.friendica.com/pubsites');
-// if($x) {
-// $j = json_decode($x);
-// if($j->entries) {
-// foreach($j->entries as $entry) {
-// $url = $entry->url . '/poco';
-// if(! in_array($url,$done))
-// poco_load(0,0,0,$entry->url . '/poco');
-// }
-// }
-// }
-// }
-
- $r = q("select distinct(xchan_connurl) as poco from xchan where xchan_network = 'zot'");
-
- if($r) {
- foreach($r as $rr) {
- $base = substr($rr['poco'],0,strrpos($rr['poco'],'/'));
- if(! in_array($base,$done))
- poco_load('',$base);
+ $dirmode = get_config('system','directory_mode');
+ if($dirmode === false)
+ $dirmode = DIRECTORY_MODE_NORMAL;
+
+ if(($dirmode == DIRECTORY_MODE_PRIMARY) || ($dirmode == DIRECTORY_MODE_STANDALONE)) {
+ $url = z_root() . '/sitelist';
+ }
+ else {
+ $directory = find_upstream_directory($dirmode);
+
+ if($directory) {
+ $url = $directory['url'] . '/sitelist';
+ }
+ else {
+ $url = DIRECTORY_FALLBACK_MASTER . '/sitelist';
+ }
+ }
+ if(! $url)
+ return;
+
+
+
+ $ret = z_fetch_url($url);
+
+ if($ret['success']) {
+
+ // We will grab fresh data once a day via the poller. Remove anything over a week old because
+ // the targets may have changed their preferences and don't want to be suggested - and they
+ // may have simply gone away.
+
+ $r = q("delete from xlink where xlink_xchan = '' and xlink_updated < UTC_TIMESTAMP() - INTERVAL 7 DAY");
+
+
+ $j = json_decode($ret['body'],true);
+ if($j && $j['success']) {
+ foreach($j['entries'] as $host) {
+ poco_load('',$host['url'] . '/poco');
+ }
}
}
}
diff --git a/include/system_unavailable.php b/include/system_unavailable.php
index bd7196cdf..dfe7c5e6b 100644
--- a/include/system_unavailable.php
+++ b/include/system_unavailable.php
@@ -1,4 +1,4 @@
-<?php
+<?php /** @file */
function system_down() {
echo <<< EOT
diff --git a/include/taxonomy.php b/include/taxonomy.php
new file mode 100644
index 000000000..4f2b5e8fd
--- /dev/null
+++ b/include/taxonomy.php
@@ -0,0 +1,341 @@
+<?php /** @file */
+
+// post categories and "save to file" use the same item.file table for storage.
+// We will differentiate the different uses by wrapping categories in angle brackets
+// and save to file categories in square brackets.
+// To do this we need to escape these characters if they appear in our tag.
+
+function file_tag_encode($s) {
+ return str_replace(array('<','>','[',']'),array('%3c','%3e','%5b','%5d'),$s);
+}
+
+function file_tag_decode($s) {
+ return str_replace(array('%3c','%3e','%5b','%5d'),array('<','>','[',']'),$s);
+}
+
+function file_tag_file_query($table,$s,$type = 'file') {
+
+ if($type == 'file')
+ $termtype = TERM_FILE;
+ else
+ $termtype = TERM_CATEGORY;
+
+ return sprintf(" AND " . (($table) ? dbesc($table) . '.' : '') . "id in (select term.oid from term where term.type = %d and term.term = '%s' and term.uid = " . (($table) ? dbesc($table) . '.' : '') . "uid ) ",
+ intval($termtype),
+ protect_sprintf(dbesc($s))
+ );
+}
+
+function term_query($table,$s,$type = TERM_UNKNOWN) {
+
+ return sprintf(" AND " . (($table) ? dbesc($table) . '.' : '') . "id in (select term.oid from term where term.type = %d and term.term = '%s' and term.uid = " . (($table) ? dbesc($table) . '.' : '') . "uid ) ",
+ intval($type),
+ protect_sprintf(dbesc($s))
+ );
+}
+
+
+function store_item_tag($uid,$iid,$otype,$type,$term,$url = '') {
+ if(! $term)
+ return false;
+ $r = q("select * from term
+ where uid = %d and oid = %d and otype = %d and type = %d
+ and term = '%s' and url = '%s' ",
+ intval($uid),
+ intval($iid),
+ intval($otype),
+ intval($type),
+ dbesc($term),
+ dbesc($url)
+ );
+ if($r)
+ return false;
+ $r = q("insert into term (uid, oid, otype, type, term, url)
+ values( %d, %d, %d, %d, '%s', '%s') ",
+ intval($uid),
+ intval($iid),
+ intval($otype),
+ intval($type),
+ dbesc($term),
+ dbesc($url)
+ );
+ return $r;
+}
+
+function get_terms_oftype($arr,$type) {
+ $ret = array();
+ if(! (is_array($arr) && count($arr)))
+ return $ret;
+
+ if(! is_array($type))
+ $type = array($type);
+
+ foreach($type as $t)
+ foreach($arr as $x)
+ if($x['type'] == $t)
+ $ret[] = $x;
+ return $ret;
+}
+
+function format_term_for_display($term) {
+ $s = '';
+ if($term['type'] == TERM_HASHTAG)
+ $s .= '#';
+ elseif($term['type'] == TERM_MENTION)
+ $s .= '@';
+ else
+ return $s;
+
+ if($term['url'])
+ $s .= '<a href="' . $term['url'] . '">' . htmlspecialchars($term['term'], ENT_COMPAT,'UTF-8') . '</a>';
+ else
+ $s .= htmlspecialchars($term['term'], ENT_COMPAT,'UTF-8');
+ return $s;
+}
+
+// Tag cloud functions - need to be adpated to this database format
+
+
+function tagadelic($uid, $count = 0, $authors = '', $flags = 0, $restrict = 0, $type = TERM_HASHTAG) {
+
+ $sql_options = '';
+ $count = intval($count);
+
+ if($flags)
+ $sql_options .= " and ((item_flags & " . intval($flags) . ") = " . intval($flags) . ") ";
+
+ if($authors) {
+ if(! is_array($authors))
+ $authors = array($authors);
+ stringify_array_elms($authors,true);
+ $sql_options .= " and author_xchan in (" . implode(',',$authors) . ") ";
+ }
+
+ // Fetch tags
+ $r = q("select term, count(term) as total from term left join item on term.oid = item.id
+ where term.uid = %d and term.type = %d
+ and otype = %d and item_restrict = %d and item_private = 0
+ $sql_options
+ group by term order by total desc %s",
+ intval($uid),
+ intval($type),
+ intval(TERM_OBJ_POST),
+ intval($restrict),
+ ((intval($count)) ? "limit $count" : '')
+ );
+
+ if(! $r)
+ return array();
+
+ // Find minimum and maximum log-count.
+ $tags = array();
+ $min = 1e9;
+ $max = -1e9;
+
+ $x = 0;
+ foreach($r as $rr) {
+ $tags[$x][0] = $rr['term'];
+ $tags[$x][1] = log($rr['total']);
+ $tags[$x][2] = 0;
+ $min = min($min,$tags[$x][1]);
+ $max = max($max,$tags[$x][1]);
+ $x ++;
+ }
+
+ usort($tags,'tags_sort');
+
+ $range = max(.01, $max - $min) * 1.0001;
+
+ for($x = 0; $x < count($tags); $x ++) {
+ $tags[$x][2] = 1 + floor(5 * ($tags[$x][1] - $min) / $range);
+ }
+
+ return $tags;
+}
+
+function tags_sort($a,$b) {
+ if($a[0] == $b[0])
+ return 0;
+ return((strtolower($a[0]) < strtolower($b[0])) ? -1 : 1);
+}
+
+
+function dir_tagadelic($count = 0) {
+
+ $sql_options = '';
+ $count = intval($count);
+
+ // Fetch tags
+ $r = q("select xtag_term, count(xtag_term) as total from xtag
+ group by xtag_term order by total desc %s",
+ ((intval($count)) ? "limit $count" : '')
+ );
+
+ if(! $r)
+ return array();
+
+ // Find minimum and maximum log-count.
+ $tags = array();
+ $min = 1e9;
+ $max = -1e9;
+
+ $x = 0;
+ foreach($r as $rr) {
+ $tags[$x][0] = $rr['xtag_term'];
+ $tags[$x][1] = log($rr['total']);
+ $tags[$x][2] = 0;
+ $min = min($min,$tags[$x][1]);
+ $max = max($max,$tags[$x][1]);
+ $x ++;
+ }
+
+ usort($tags,'tags_sort');
+
+ $range = max(.01, $max - $min) * 1.0001;
+
+ for($x = 0; $x < count($tags); $x ++) {
+ $tags[$x][2] = 1 + floor(5 * ($tags[$x][1] - $min) / $range);
+ }
+
+ return $tags;
+}
+
+
+function tagblock($link,$uid,$count = 0,$authors = '',$flags = 0,$restrict = 0,$type = TERM_HASHTAG) {
+ $o = '';
+ $tab = 0;
+ $r = tagadelic($uid,$count,$authors,$flags,$restrict,$type);
+
+ if($r) {
+ $o = '<div class="tagblock widget"><h3>' . t('Tags') . '</h3><div class="tags" align="center">';
+ foreach($r as $rr) {
+ $o .= '<a href="'.$link .'/' . '?f=&tag=' . urlencode($rr[0]).'" class="tag'.$rr[2].'">'.$rr[0].'</a> ' . "\r\n";
+ }
+ $o .= '</div></div>';
+ }
+ return $o;
+}
+
+function dir_tagblock($link,$r) {
+ $o = '';
+ $tab = 0;
+
+ if(! $r)
+ $r = get_app()->data['directory_keywords'];
+
+ if($r) {
+ $o = '<div class="dirtagblock widget"><h3>' . t('Keywords') . '</h3><div class="tags" align="center">';
+ foreach($r as $rr) {
+ $o .= '<a href="'.$link .'/' . '?f=&keywords=' . urlencode($rr['term']).'" class="tag'.$rr['normalise'].'" rel="nofollow" >'.$rr['term'].'</a> ' . "\r\n";
+ }
+ $o .= '</div></div>';
+ }
+ return $o;
+}
+
+
+
+
+
+
+ /**
+ * verbs: [0] = first person singular, e.g. "I want", [1] = 3rd person singular, e.g. "Bill wants"
+ * We use the first person form when creating an activity, but the third person for use in activities
+ * FIXME: There is no accounting for verb gender for languages where this is significant. We may eventually
+ * require obj_verbs() to provide full conjugations and specify which form to use in the $_REQUEST params to this module.
+ */
+
+
+
+function obj_verbs() {
+ $verbs = array(
+ 'has' => array( t('have'), t('has')),
+ 'wants' => array( t('want'), t('wants')),
+ 'likes' => array( t('like'), t('likes')),
+ 'dislikes' => array( t('dislike'), t('dislikes')),
+ );
+
+ $arr = array('verbs' => $verbs);
+ call_hooks('obj_verbs', $arr);
+ return $arr['verbs'];
+}
+
+
+function obj_verb_selector($current = '') {
+ $verbs = obj_verbs();
+ $o .= '<select class="obj-verb-selector" name="verb" >';
+ foreach($verbs as $k => $v) {
+ $selected = (($k == $current) ? ' selected="selected" ' : '');
+ $o .= '<option value="' . urlencode($k) . '"' . $selected . '>' . $v[0] . '</option>';
+ }
+ $o .= '</select>';
+ return $o;
+
+}
+
+function get_things($profile_hash,$uid) {
+
+ $sql_extra = (($profile_hash) ? " and obj_page = '" . $profile_hash . "' " : '');
+
+ $r = q("select * from obj left join term on obj_obj = term_hash where term_hash != '' and uid = %d and obj_type = %d $sql_extra order by obj_verb, term",
+ intval($uid),
+ intval(TERM_OBJ_THING)
+ );
+
+ $things = $sorted_things = null;
+
+ $profile_hashes = array();
+
+ if($r) {
+
+ // if no profile_hash was specified (display on profile page mode), match each of the things to a profile name
+ // (list all my things mode). This is harder than it sounds.
+
+ foreach($r as $rr) {
+ $rr['profile_name'] = '';
+ if(! in_array($rr['term_hash'],$profile_hashes))
+ $profile_hashes[] = $rr['term_hash'];
+ }
+ stringify_array_elms($profile_hashes);
+ if(! $profile_hash) {
+ $exp = explode(',',$profile_hashes);
+ $p = q("select profile_guid as hash, profile_name as name from profile where profile_guid in ( $exp ) ");
+ if($p) {
+ foreach($r as $rr) {
+ foreach($p as $pp) {
+ if($rr['obj_page'] == $pp['hash']) {
+ $rr['profile_name'] == $pp['name'];
+ }
+ }
+ }
+ }
+ }
+
+ $things = array();
+
+ // Use the system obj_verbs array as a sort key, since we don't really
+ // want an alphabetic sort. To change the order, use a plugin to
+ // alter the obj_verbs() array or alter it in code. Unknown verbs come
+ // after the known ones - in no particular order.
+
+ $v = obj_verbs();
+ foreach($v as $k => $foo)
+ $things[$k] = null;
+ foreach($r as $rr) {
+ if(! $things[$rr['obj_verb']])
+ $things[$rr['obj_verb']] = array();
+ $things[$rr['obj_verb']][] = array('term' => $rr['term'],'url' => $rr['url'],'img' => $rr['imgurl'], 'profile' => $rr['profile_name']);
+ }
+ $sorted_things = array();
+ if($things) {
+ foreach($things as $k => $v) {
+ if(is_array($things[$k])) {
+ $sorted_things[$k] = $v;
+ }
+ }
+ }
+ }
+
+ return $sorted_things;
+
+} \ No newline at end of file
diff --git a/include/template_processor.php b/include/template_processor.php
index 61526e570..74acc9c67 100644..100755
--- a/include/template_processor.php
+++ b/include/template_processor.php
@@ -1,7 +1,11 @@
<?php
+ require_once 'include/ITemplateEngine.php';
+
define ("KEY_NOT_EXISTS", '^R_key_not_Exists^');
- class Template {
+ class Template implements ITemplateEngine {
+ static $name ="internal";
+
var $r;
var $search;
var $replace;
@@ -244,9 +248,13 @@
return $s;
}
-
- public function replace($s, $r) {
- $t1 = dba_timer();
+
+ private function replace($s,$r) {
+ $this->replace_macros($s, $r);
+ }
+
+ // TemplateEngine interface
+ public function replace_macros($s, $r) {
$this->r = $r;
$s = $this->_build_nodes($s);
@@ -265,14 +273,18 @@
$os=$s; $count++;
$s = $this->var_replace($s);
}
- $t3 = dba_timer();
-// logger('macro timer: ' . sprintf('%01.4f %01.4f',$t3 - $t2, $t2 - $t1));
-
return $s;
}
+
+ public function get_markup_template($file, $root='') {
+ $template_file = theme_include($file, $root);
+ if ($template_file) {
+ $content = file_get_contents($template_file);
+ }
+ return $content;
+ }
}
- $t = new Template;
diff --git a/include/text.php b/include/text.php
index 523970bf4..f5c440e4a 100644..100755
--- a/include/text.php
+++ b/include/text.php
@@ -1,48 +1,28 @@
-<?php
+<?php /** @file */
-// This is our template processor.
-// $s is the string requiring macro substitution.
-// $r is an array of key value pairs (search => replace)
-// returns substituted string.
-// WARNING: this is pretty basic, and doesn't properly handle search strings that are substrings of each other.
-// For instance if 'test' => "foo" and 'testing' => "bar", testing could become either bar or fooing,
-// depending on the order in which they were declared in the array.
require_once("include/template_processor.php");
+require_once("include/friendica_smarty.php");
-if(! function_exists('replace_macros')) {
+/**
+ * This is our template processor
+ *
+ * @param string|FriendicaSmarty $s the string requiring macro substitution,
+ * or an instance of FriendicaSmarty
+ * @param array $r key value pairs (search => replace)
+ * @return string substituted string
+ */
function replace_macros($s,$r) {
- global $t;
-
-// $ts = microtime();
$a = get_app();
- if($a->get_template_engine() === 'smarty3') {
- $output = '';
- if(gettype($s) !== 'NULL') {
- $template = '';
- if(gettype($s) === 'string') {
- $template = $s;
- $s = new FriendicaSmarty();
- }
- foreach($r as $key=>$value) {
- if($key[0] === '$') {
- $key = substr($key, 1);
- }
- $s->assign($key, $value);
- }
- $output = $s->parsed($template);
- }
- }
- else {
- $r = $t->replace($s,$r);
+ $arr = array('template' => $s, 'params' => $r);
+ call_hooks('replace_macros', $arr);
+
+ $t = $a->template_engine();
+ $output = $t->replace_macros($arr['template'],$arr['params']);
- $output = template_unescape($r);
- }
-// $tt = microtime() - $ts;
-// $a->page['debug'] .= "$tt <br>\n";
return $output;
-}}
+}
// random string, there are 86 characters max in text mode, 128 for hex
@@ -51,13 +31,13 @@ function replace_macros($s,$r) {
define('RANDOM_STRING_HEX', 0x00 );
define('RANDOM_STRING_TEXT', 0x01 );
-if(! function_exists('random_string')) {
+
function random_string($size = 64,$type = RANDOM_STRING_HEX) {
// generate a bit of entropy and run it through the whirlpool
$s = hash('whirlpool', (string) rand() . uniqid(rand(),true) . (string) rand(),(($type == RANDOM_STRING_TEXT) ? true : false));
$s = (($type == RANDOM_STRING_TEXT) ? str_replace("\n","",base64url_encode($s,true)) : $s);
return(substr($s,0,$size));
-}}
+}
/**
* This is our primary input filter.
@@ -73,32 +53,94 @@ function random_string($size = 64,$type = RANDOM_STRING_HEX) {
* They will be replaced with safer brackets. This may be filtered further
* if these are not allowed either.
*
+ * @param string $string Input string
+ * @return string Filtered string
*/
-if(! function_exists('notags')) {
+
function notags($string) {
return(str_replace(array("<",">"), array('[',']'), $string));
// High-bit filter no longer used
// return(str_replace(array("<",">","\xBA","\xBC","\xBE"), array('[',']','','',''), $string));
-}}
+}
// use this on "body" or "content" input where angle chars shouldn't be removed,
// and allow them to be safely displayed.
-if(! function_exists('escape_tags')) {
+
+
+/**
+ * use this on "body" or "content" input where angle chars shouldn't be removed,
+ * and allow them to be safely displayed.
+ * @param string $string
+ * @return string
+ */
function escape_tags($string) {
return(htmlspecialchars($string, ENT_COMPAT, 'UTF-8', false));
-}}
+}
+
+
+function z_input_filter($channel_id,$s,$type = 'text/bbcode') {
+
+ if($type === 'text/bbcode')
+ return escape_tags($s);
+ if($type === 'text/markdown')
+ return escape_tags($s);
+ if($type == 'text/plain')
+ return escape_tags($s);
+ $r = q("select account_id, account_roles from account left join channel on channel_account_id = account_id where channel_id = %d limit 1",
+ intval($channel_id)
+ );
+ if($r && ($r[0]['account_roles'] & ACCOUNT_ROLE_ALLOWCODE)) {
+ if(local_user() && (get_account_id() == $r[0]['account_id'])) {
+ return $s;
+ }
+ }
+
+ if($type === 'text/html')
+ return purify_html($s);
+
+ return escape_tags($s);
+
+}
+
+
+
+
+
+function purify_html($s) {
+ require_once('library/HTMLPurifier.auto.php');
+ require_once('include/html2bbcode.php');
+
+// FIXME this function has html output, not bbcode - so safely purify these
+// $s = html2bb_video($s);
+// $s = oembed_html2bbcode($s);
+
+ $config = HTMLPurifier_Config::createDefault();
+ $config->set('Cache.DefinitionImpl', null);
+
+ $purifier = new HTMLPurifier($config);
+ return $purifier->purify($s);
+}
+
+
+
// generate a string that's random, but usually pronounceable.
// used to generate initial passwords
-if(! function_exists('autoname')) {
+
+/**
+ * generate a string that's random, but usually pronounceable.
+ * used to generate initial passwords
+ * @param int $len
+ * @return string
+ */
function autoname($len) {
if($len <= 0)
@@ -167,13 +209,18 @@ function autoname($len) {
if(substr($word,-1) == 'q')
$word = substr($word,0,-1);
return $word;
-}}
+}
// escape text ($str) for XML transport
// returns escaped text.
-if(! function_exists('xmlify')) {
+
+/**
+ * escape text ($str) for XML transport
+ * @param string $str
+ * @return string Escaped text.
+ */
function xmlify($str) {
$buffer = '';
@@ -210,20 +257,22 @@ function xmlify($str) {
}
$buffer = trim($buffer);
return($buffer);
-}}
+}
// undo an xmlify
// pass xml escaped text ($s), returns unescaped text
-if(! function_exists('unxmlify')) {
+
function unxmlify($s) {
$ret = str_replace('&amp;','&', $s);
$ret = str_replace(array('&lt;','&gt;','&quot;','&apos;'),array('<','>','"',"'"),$ret);
return $ret;
-}}
+}
// convenience wrapper, reverse the operation "bin2hex"
+// This is a built-in function in php >= 5.4
+
if(! function_exists('hex2bin')) {
function hex2bin($s) {
if(! (is_string($s) && strlen($s)))
@@ -236,6 +285,7 @@ function hex2bin($s) {
return(pack("H*",$s));
}}
+
// Automatic pagination.
// To use, get the count of total items.
// Then call $a->set_pager_total($number_items);
@@ -246,7 +296,7 @@ function hex2bin($s) {
// will limit the results to the correct items for the current page.
// The actual page handling is then accomplished at the application layer.
-if(! function_exists('paginate')) {
+
function paginate(&$a) {
$o = '';
$stripped = preg_replace('/(&page=[0-9]*)/','',$a->query_string);
@@ -300,9 +350,9 @@ function paginate(&$a) {
$o .= '</div>'."\r\n";
}
return $o;
-}}
+}
+
-if(! function_exists('alt_pager')) {
function alt_pager(&$a, $i, $more = '', $less = '') {
$o = '';
@@ -318,25 +368,21 @@ function alt_pager(&$a, $i, $more = '', $less = '') {
$pagenum = $a->pager['page'];
$url = $a->get_baseurl() . '/' . $stripped;
- $o .= '<div class="pager">';
-
- if($a->pager['page'] > 1)
- $o .= "<a href=\"$url"."&page=".($a->pager['page'] - 1).'">' . $less . '</a>';
- if($i > 0 && $i == $a->pager['itemspage']) {
- if($a->pager['page']>1)
- $o .= " | ";
- $o .= "<a href=\"$url"."&page=".($a->pager['page'] + 1).'">' . $more . '</a>';
- }
-
-
- $o .= '</div>'."\r\n";
+ return replace_macros(get_markup_template('alt_pager.tpl'),array(
+ '$has_less' => (($a->pager['page'] > 1) ? true : false),
+ '$has_more' => (($i > 0 && $i >= $a->pager['itemspage']) ? true : false),
+ '$less' => $less,
+ '$more' => $more,
+ '$url' => $url,
+ '$prevpage' => $a->pager['page'] - 1,
+ '$nextpage' => $a->pager['page'] + 1,
+ ));
- return $o;
-}}
+}
// Turn user/group ACLs stored as angle bracketed text into arrays
-if(! function_exists('expand_acl')) {
+
function expand_acl($s) {
// turn string array of angle-bracketed elements into string array
@@ -353,22 +399,22 @@ function expand_acl($s) {
}
}
return $ret;
-}}
+}
// Used to wrap ACL elements in angle brackets for storage
-if(! function_exists('sanitise_acl')) {
+
function sanitise_acl(&$item) {
if(strlen($item))
$item = '<' . notags(trim($item)) . '>';
else
unset($item);
-}}
+}
// Convert an ACL array to a storable string
-if(! function_exists('perms2str')) {
+
function perms2str($p) {
$ret = '';
@@ -382,32 +428,32 @@ function perms2str($p) {
$ret = implode('',$tmp);
}
return $ret;
-}}
+}
// generate a guaranteed unique (for this domain) item ID for ATOM
// safe from birthday paradox
-if(! function_exists('item_message_id')) {
+
function item_message_id() {
do {
$dups = false;
$hash = random_string();
- $uri = $hash . '@' . get_app()->get_hostname();
+ $mid = $hash . '@' . get_app()->get_hostname();
- $r = q("SELECT `id` FROM `item` WHERE `uri` = '%s' LIMIT 1",
- dbesc($uri));
+ $r = q("SELECT `id` FROM `item` WHERE `mid` = '%s' LIMIT 1",
+ dbesc($mid));
if(count($r))
$dups = true;
} while($dups == true);
- return $uri;
-}}
+ return $mid;
+}
// Generate a guaranteed unique photo ID.
// safe from birthday paradox
-if(! function_exists('photo_new_resource')) {
+
function photo_new_resource() {
do {
@@ -420,7 +466,7 @@ function photo_new_resource() {
$found = true;
} while($found == true);
return $resource;
-}}
+}
@@ -435,15 +481,14 @@ function photo_new_resource() {
// pass the attribute string as $attr and the attribute you
// are looking for as $s - returns true if found, otherwise false
-if(! function_exists('attribute_contains')) {
function attribute_contains($attr,$s) {
$a = explode(' ', $attr);
if(count($a) && in_array($s,$a))
return true;
return false;
-}}
+}
+
-if(! function_exists('logger')) {
function logger($msg,$level = 0) {
// turn off logger in install mode
global $a;
@@ -460,7 +505,7 @@ function logger($msg,$level = 0) {
@file_put_contents($logfile, datetime_convert() . ':' . session_id() . ' ' . $msg . "\n", FILE_APPEND);
return;
-}}
+}
// This is a special logging facility for developers. It allows one to target specific things to trace/debug
@@ -469,7 +514,7 @@ function logger($msg,$level = 0) {
// If you find dlogger() calls in checked in code, you are free to remove them - so as to provide a noise-free
// development environment which responds to events you are targetting personally.
-if(! function_exists('dlogger')) {
+
function dlogger($msg,$level = 0) {
// turn off logger in install mode
global $a;
@@ -486,7 +531,7 @@ function dlogger($msg,$level = 0) {
@file_put_contents($logfile, datetime_convert() . ':' . session_id() . ' ' . $msg . "\n", FILE_APPEND);
return;
-}}
+}
function profiler($t1,$t2,$label) {
@@ -495,12 +540,13 @@ function profiler($t1,$t2,$label) {
}
-if(! function_exists('activity_match')) {
+
function activity_match($haystack,$needle) {
if(($haystack === $needle) || ((basename($needle) === $haystack) && strstr($needle,NAMESPACE_ACTIVITY_SCHEMA)))
return true;
+
return false;
-}}
+}
// Pull out all #hashtags and @person tags from $s;
@@ -511,7 +557,7 @@ function activity_match($haystack,$needle) {
// Returns array of tags found, or empty array.
-if(! function_exists('get_tags')) {
+
function get_tags($s) {
$ret = array();
@@ -556,19 +602,19 @@ function get_tags($s) {
}
}
return $ret;
-}}
+}
// quick and dirty quoted_printable encoding
-if(! function_exists('qp')) {
+
function qp($s) {
return str_replace ("%","=",rawurlencode($s));
-}}
+}
+
-if(! function_exists('get_mentions')) {
function get_mentions($item,$tags) {
$o = '';
@@ -582,9 +628,9 @@ function get_mentions($item,$tags) {
}
}
return $o;
-}}
+}
+
-if(! function_exists('contact_block')) {
function contact_block() {
$o = '';
$a = get_app();
@@ -637,7 +683,7 @@ function contact_block() {
call_hooks('contact_block_end', $arr);
return $o;
-}}
+}
function chanlink_hash($s) {
@@ -661,7 +707,7 @@ function magiclink_url($observer,$myaddr,$url) {
}
-if(! function_exists('micropro')) {
+
function micropro($contact, $redirect = false, $class = '', $textmode = false) {
if($contact['click'])
@@ -677,24 +723,38 @@ function micropro($contact, $redirect = false, $class = '', $textmode = false) {
'$name' => $contact['xchan_name'],
'$title' => $contact['xchan_name'] . ' [' . $contact['xchan_addr'] . ']',
));
-}}
+}
+
-if(! function_exists('search')) {
function search($s,$id='search-box',$url='/search',$save = false) {
$a = get_app();
$o = '<div id="' . $id . '">';
$o .= '<form action="' . $a->get_baseurl((stristr($url,'network')) ? true : false) . $url . '" method="get" >';
- $o .= '<input type="text" name="search" id="search-text" placeholder="' . t('Search') . '" value="' . $s .'" />';
+ $o .= '<input type="text" class="icon-search" name="search" id="search-text" placeholder="&#xf002;" value="' . $s .'" onclick="this.submit();" />';
$o .= '<input type="submit" name="submit" id="search-submit" value="' . t('Search') . '" />';
- if($save)
+ if(feature_enabled(local_user(),'savedsearch'))
$o .= '<input type="submit" name="save" id="search-save" value="' . t('Save') . '" />';
$o .= '</form></div>';
return $o;
-}}
+}
+
+
+function searchbox($s,$id='search-box',$url='/search',$save = false) {
+ $a = get_app();
+ $o = '<div id="' . $id . '">';
+ $o .= '<form action="' . z_root() . '/' . $url . '" method="get" >';
+ $o .= '<input type="hidden" name="f" value="" />';
+ $o .= '<input type="text" class="icon-search" name="search" id="search-text" placeholder="&#xf002;" value="' . $s .'" onclick="this.submit();" />';
+ $o .= '<input type="submit" name="submit" id="search-submit" value="' . t('Search') . '" />';
+ if(feature_enabled(local_user(),'savedsearch'))
+ $o .= '<input type="submit" name="searchsave" id="search-save" value="' . t('Save') . '" />';
+ $o .= '</form></div>';
+ return $o;
+}
+
-if(! function_exists('valid_email')) {
function valid_email($x){
if(get_config('system','disable_email_validation'))
@@ -703,7 +763,7 @@ function valid_email($x){
if(preg_match('/^[_a-zA-Z0-9\-\+]+(\.[_a-zA-Z0-9\-\+]+)*@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)+$/',$x))
return true;
return false;
-}}
+}
/**
@@ -714,12 +774,40 @@ function valid_email($x){
*
*/
-if(! function_exists('linkify')) {
+
function linkify($s) {
- $s = preg_replace("/(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\'\%\$\!\+]*)/", ' <a href="$1" >$1</a>', $s);
+ $s = preg_replace("/(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\_\@\~\#\'\%\$\!\+]*)/", ' <a href="$1" >$1</a>', $s);
$s = preg_replace("/\<(.*?)(src|href)=(.*?)\&amp\;(.*?)\>/ism",'<$1$2=$3&$4>',$s);
return($s);
-}}
+}
+
+/**
+ * @function sslify($s)
+ * Replace media element using http url with https to a local redirector if using https locally
+ * @param string $s
+ *
+ * Looks for HTML tags containing src elements that are http when we're viewing an https page
+ * Typically this throws an insecure content violation in the browser. So we redirect them
+ * to a local redirector which uses https and which redirects to the selected content
+ *
+ * @returns string
+ */
+
+
+function sslify($s) {
+ if(strpos(z_root(),'https:') === false)
+ return $s;
+ $matches = null;
+ $cnt = preg_match_all("/\<(.*?)src=\"(http\:.*?)\"(.*?)\>/",$s,$matches,PREG_SET_ORDER);
+ if($cnt) {
+ foreach($matches as $match) {
+ $s = str_replace($match[2],z_root() . '/sslify?f=&url=' . urlencode($match[2]),$s);
+ }
+ }
+ return $s;
+}
+
+
function get_poke_verbs() {
@@ -792,7 +880,7 @@ function get_mood_verbs() {
*
*/
-if(! function_exists('smilies')) {
+
function smilies($s, $sample = false) {
$a = get_app();
@@ -837,9 +925,8 @@ function smilies($s, $sample = false) {
':facepalm',
':like',
':dislike',
- '~friendika',
- '~friendica'
-
+ 'red#',
+ 'r#'
);
$icons = array(
@@ -875,8 +962,9 @@ function smilies($s, $sample = false) {
'<img class="smiley" src="' . $a->get_baseurl() . '/images/smiley-facepalm.gif" alt=":facepalm" />',
'<img class="smiley" src="' . $a->get_baseurl() . '/images/like.gif" alt=":like" />',
'<img class="smiley" src="' . $a->get_baseurl() . '/images/dislike.gif" alt=":dislike" />',
- '<a href="http://project.friendika.com">~friendika <img class="smiley" src="' . $a->get_baseurl() . '/images/friendika-16.png" alt="~friendika" /></a>',
- '<a href="http://friendica.com">~friendica <img class="smiley" src="' . $a->get_baseurl() . '/images/friendica-16.png" alt="~friendica" /></a>'
+ '<a href="http://getzot.com"><strong>red<img class="smiley" src="' . $a->get_baseurl() . '/images/rm-16.png" alt="red#" />matrix</strong></a>',
+ '<a href="http://getzot.com"><strong>red<img class="smiley" src="' . $a->get_baseurl() . '/images/rm-16.png" alt="r#" />matrix</strong></a>'
+
);
$params = array('texts' => $texts, 'icons' => $icons, 'string' => $s);
@@ -898,7 +986,7 @@ function smilies($s, $sample = false) {
return $s;
-}}
+}
function smile_encode($m) {
return(str_replace($m[1],base64url_encode($m[1]),$m[0]));
@@ -922,7 +1010,7 @@ function preg_heart($x) {
}
-if(! function_exists('day_translate')) {
+
function day_translate($s) {
$ret = str_replace(array('Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday'),
array( t('Monday'), t('Tuesday'), t('Wednesday'), t('Thursday'), t('Friday'), t('Saturday'), t('Sunday')),
@@ -933,14 +1021,14 @@ function day_translate($s) {
$ret);
return $ret;
-}}
+}
+
-if(! function_exists('normalise_link')) {
function normalise_link($url) {
$ret = str_replace(array('https:','//www.'), array('http:','//'), $url);
return(rtrim($ret,'/'));
-}}
+}
/**
*
@@ -953,91 +1041,162 @@ function normalise_link($url) {
*
*/
-if(! function_exists('link_compare')) {
+
function link_compare($a,$b) {
if(strcasecmp(normalise_link($a),normalise_link($b)) === 0)
return true;
return false;
-}}
+}
// Given an item array, convert the body element from bbcode to html and add smilie icons.
// If attach is true, also add icons for item attachments
-if(! function_exists('prepare_body')) {
-function prepare_body($item,$attach = false) {
-
- $a = get_app();
- call_hooks('prepare_body_init', $item);
-
- $s = prepare_text($item['body']);
+function unobscure(&$item) {
+ if(array_key_exists('item_flags',$item) && ($item['item_flags'] & ITEM_OBSCURED)) {
+ $key = get_config('system','prvkey');
+ if($item['title'])
+ $item['title'] = crypto_unencapsulate(json_decode_plus($item['title']),$key);
+ if($item['body'])
+ $item['body'] = crypto_unencapsulate(json_decode_plus($item['body']),$key);
+ }
- $prep_arr = array('item' => $item, 'html' => $s);
- call_hooks('prepare_body', $prep_arr);
- $s = $prep_arr['html'];
+}
- if(! $attach) {
- return $s;
- }
+function theme_attachments(&$item) {
- $arr = json_decode($item['attach'],true);
- if(count($arr)) {
- $s .= '<div class="body-attach">';
+ $arr = json_decode_plus($item['attach']);
+ if(is_array($arr) && count($arr)) {
+ $attaches = array();
foreach($arr as $r) {
- $matches = false;
$icon = '';
$icontype = substr($r['type'],0,strpos($r['type'],'/'));
+ // FIXME This should probably be a giant "if" statement in the template so that we don't have icon names
+ // embedded in php code
+
switch($icontype) {
case 'video':
+ $icon = 'icon-facetime-video';
+ break;
case 'audio':
+ $icon = 'icon-volume-up';
+ break;
case 'image':
+ $icon = 'icon-picture';
+ break;
case 'text':
- $icon = '<div class="attachtype icon s22 type-' . $icontype . '"></div>';
+ $icon = 'icon-align-justify';
break;
default:
- $icon = '<div class="attachtype icon s22 type-unkn"></div>';
+ $icon = 'icon-question';
break;
}
- $title = htmlentities($r['title'], ENT_COMPAT,'UTF-8');
+ $title = htmlspecialchars($r['title'], ENT_COMPAT,'UTF-8');
if(! $title)
$title = t('unknown.???');
$title .= ' ' . $r['length'] . ' ' . t('bytes');
- $url = $a->get_baseurl() . '/magic?f=&hash=' . $item['author_xchan'] . '&dest=' . $r['href'] . '/' . $r['revision'];
+ $url = z_root() . '/magic?f=&hash=' . $item['author_xchan'] . '&dest=' . $r['href'] . '/' . $r['revision'];
$s .= '<a href="' . $url . '" title="' . $title . '" class="attachlink" >' . $icon . '</a>';
+ $attaches[] = array('title' => $title, 'url' => $url, 'icon' => $icon );
+
}
- $s .= '<div class="clear"></div></div>';
+
+
}
- $x = '';
+ $s = replace_macros(get_markup_template('item_attach.tpl'), array(
+ '$attaches' => $attaches
+ ));
+
+ return $s;
+
+}
+
+
+function format_categories(&$item,$writeable) {
+
+ $s = '';
$terms = get_terms_oftype($item['term'],TERM_CATEGORY);
if($terms) {
+ $categories = array();
foreach($terms as $t) {
- if(strlen($x))
- $x .= ',';
- $x .= htmlspecialchars($t['term'],ENT_COMPAT,'UTF-8')
- . ((local_user() == $item['uid']) ? ' <a href="' . $a->get_baseurl() . '/filerm/' . $item['id'] . '?f=&cat=' . urlencode($t['term']) . '" title="' . t('remove') . '" >' . t('[remove]') . '</a>' : '');
+ $term = htmlspecialchars($t['term'],ENT_COMPAT,'UTF-8',false) ;
+ if(! trim($term))
+ continue;
+ $removelink = (($writeable) ? z_root() . '/filerm/' . $item['id'] . '?f=&cat=' . urlencode($t['term']) : '');
+ $categories[] = array('term' => $term, 'writeable' => $writeable, 'removelink' => $removelink, 'url' => zid($t['url']));
}
- if(strlen($x))
- $s .= '<div class="categorytags"><span>' . t('Categories:') . ' </span>' . $x . '</div>';
+ }
+ $s = replace_macros(get_markup_template('item_categories.tpl'),array(
+ '$remove' => t('remove category'),
+ '$categories' => $categories
+ ));
+ return $s;
+}
- }
+function format_filer(&$item) {
- $x = '';
+ $s = '';
$terms = get_terms_oftype($item['term'],TERM_FILE);
if($terms) {
+ $categories = array();
foreach($terms as $t) {
- if(strlen($x))
- $x .= '&nbsp;&nbsp;&nbsp;';
- $x .= htmlspecialchars($t['term'],ENT_COMPAT,'UTF-8')
- . ' <a href="' . $a->get_baseurl() . '/filerm/' . $item['id'] . '?f=&term=' . urlencode($t['term']) . '" title="' . t('remove') . '" >' . t('[remove]') . '</a>';
+ $term = htmlspecialchars($t['term'],ENT_COMPAT,'UTF-8',false) ;
+ if(! trim($term))
+ continue;
+ $removelink = z_root() . '/filerm/' . $item['id'] . '?f=&term=' . urlencode($t['term']);
+ $categories[] = array('term' => $term, 'removelink' => $removelink);
}
- if(strlen($x) && (local_user() == $item['uid']))
- $s .= '<div class="filesavetags"><span>' . t('Filed under:') . ' </span>' . $x . '</div>';
}
+ $s = replace_macros(get_markup_template('item_filer.tpl'),array(
+ '$remove' => t('remove from file'),
+ '$categories' => $categories
+ ));
+ return $s;
+}
+
+
+
+
+
+function prepare_body(&$item,$attach = false) {
+
+ $a = get_app();
+
+
+
+ call_hooks('prepare_body_init', $item);
+
+ unobscure($item);
+
+ $s = prepare_text($item['body'],$item['mimetype']);
+
+ $prep_arr = array('item' => $item, 'html' => $s);
+ call_hooks('prepare_body', $prep_arr);
+ $s = $prep_arr['html'];
+
+ if(! $attach) {
+ return $s;
+ }
+
+
+ $s .= theme_attachments($item);
+
+
+ $writeable = ((get_observer_hash() == $item['owner_xchan']) ? true : false);
+
+ $s .= format_categories($item,$writeable);
+
+ if(local_user() == $item['uid'])
+ $s .= format_filer($item);
+
+
+ $s = sslify($s);
+
// Look for spoiler
$spoilersearch = '<blockquote class="spoiler">';
@@ -1073,30 +1232,127 @@ function prepare_body($item,$attach = false) {
call_hooks('prepare_body_final', $prep_arr);
return $prep_arr['html'];
-}}
+}
// Given a text string, convert from bbcode to html and add smilie icons.
-if(! function_exists('prepare_text')) {
-function prepare_text($text) {
- require_once('include/bbcode.php');
+function prepare_text($text,$content_type = 'text/bbcode') {
- if(stristr($text,'[nosmile]'))
- $s = bbcode($text);
- else
- $s = smilies(bbcode($text));
+
+
+ switch($content_type) {
+
+ case 'text/plain':
+ $s = escape_tags($text);
+ break;
+
+ case 'text/html':
+ $s = $text;
+ break;
+
+ case 'text/markdown':
+ require_once('library/markdown.php');
+ $s = Markdown($text);
+ break;
+
+ // No security checking is done here at display time - so we need to verify
+ // that the author is allowed to use PHP before storing. We also cannot allow
+ // importation of PHP text bodies from other sites. Therefore this content
+ // type is only valid for web pages (and profile details).
+
+ // It may be possible to provide a PHP message body which is evaluated on the
+ // sender's site before sending it elsewhere. In that case we will have a
+ // different content-type here.
+
+ case 'application/x-php':
+ ob_start();
+ eval($text);
+ $s = ob_get_contents();
+ ob_end_clean();
+ break;
+
+ case 'text/bbcode':
+ case '':
+ default:
+ require_once('include/bbcode.php');
+
+ if(stristr($text,'[nosmile]'))
+ $s = bbcode($text);
+ else
+ $s = smilies(bbcode($text));
+ $s = zidify_links($s);
+ break;
+ }
+
+//logger('prepare_text: ' . $s);
return $s;
-}}
+}
+
+
+/**
+ * zidify_callback() and zidify_links() work together to turn any HTML a tags with class="zrl" into zid links
+ * These will typically be generated by a bbcode '[zrl]' tag. This is done inside prepare_text() rather than bbcode()
+ * because the latter is used for general purpose conversions and the former is used only when preparing text for
+ * immediate display.
+ *
+ * Issues: Currently the order of HTML parameters in the text is somewhat rigid and inflexible.
+ * We assume it looks like <a class="zrl" href="xxxxxxxxxx"> and will not work if zrl and href appear in a different order.
+ */
+
+
+function zidify_callback($match) {
+ if (feature_enabled(local_user(),'sendzid')) {
+ $replace = '<a' . $match[1] . ' href="' . zid($match[2]) . '"';
+ }
+ else {
+ $replace = '<a' . $match[1] . 'class="zrl"' . $match[2] . ' href="' . zid($match[3]) . '"';
+ }
+
+ $x = str_replace($match[0],$replace,$match[0]);
+ return $x;
+}
+
+function zidify_img_callback($match) {
+ if (feature_enabled(local_user(),'sendzid')) {
+ $replace = '<img' . $match[1] . ' src="' . zid($match[2]) . '"';
+ }
+ else {
+ $replace = '<img' . $match[1] . ' src="' . zid($match[2]) . '"';
+ }
+
+ $x = str_replace($match[0],$replace,$match[0]);
+ return $x;
+}
+
+
+function zidify_links($s) {
+ if(feature_enabled(local_user(),'sendzid')) {
+ $s = preg_replace_callback('/\<a(.*?)href\=\"(.*?)\"/ism','zidify_callback',$s);
+ $s = preg_replace_callback('/\<img(.*?)src\=\"(.*?)\"/ism','zidify_img_callback',$s);
+ }
+ else {
+ $s = preg_replace_callback('/\<a(.*?)class\=\"zrl\"(.*?)href\=\"(.*?)\"/ism','zidify_callback',$s);
+ $s = preg_replace_callback('/\<img class\=\"zrl\"(.*?)src\=\"(.*?)\"/ism','zidify_img_callback',$s);
+// FIXME - remove the following line and redo the regex for the prev line once all Red images are converted to zmg
+ $s = preg_replace_callback('/\<img(.*?)src\=\"(.*?)\"/ism','zidify_img_callback',$s);
+ }
+
+ return $s;
+}
+
+
+
+
/**
* return atom link elements for all of our hubs
*/
-if(! function_exists('feed_hublinks')) {
+
function feed_hublinks() {
$hub = get_config('system','huburl');
@@ -1114,11 +1370,11 @@ function feed_hublinks() {
}
}
return $hubxml;
-}}
+}
/* return atom link elements for salmon endpoints */
-if(! function_exists('feed_salmonlinks')) {
+
function feed_salmonlinks($nick) {
$a = get_app();
@@ -1130,31 +1386,91 @@ function feed_salmonlinks($nick) {
$salmon .= ' <link rel="http://salmon-protocol.org/ns/salmon-replies" href="' . xmlify($a->get_baseurl() . '/salmon/' . $nick) . '" />' . "\n" ;
$salmon .= ' <link rel="http://salmon-protocol.org/ns/salmon-mention" href="' . xmlify($a->get_baseurl() . '/salmon/' . $nick) . '" />' . "\n" ;
return $salmon;
-}}
+}
-if(! function_exists('get_plink')) {
-function get_plink($item) {
- $a = get_app();
- if (x($item,'plink') && ($item['private'] != 1)) {
+
+function get_plink($item,$conversation_mode = true) {
+ $a = get_app();
+ if($conversation_mode)
+ $key = 'plink';
+ else
+ $key = 'llink';
+
+ if(x($item,$key)) {
return array(
- 'href' => $item['plink'],
+ 'href' => zid($item[$key]),
'title' => t('link to source'),
);
}
else {
return false;
}
-}}
+}
+
-if(! function_exists('unamp')) {
function unamp($s) {
return str_replace('&amp;', '&', $s);
-}}
+}
+
+function layout_select($channel_id, $current = '') {
+ $r = q("select mid,sid from item left join item_id on iid = item.id where service = 'PDL' and item.uid = item_id.uid and item_id.uid = %d and (item_restrict & %d)",
+ intval($channel_id),
+ intval(ITEM_PDL)
+ );
+ if($r) {
+ $o = t('Select a page layout: ');
+ $o .= '<select name="layout_mid" id="select-layout_mid" >';
+ $empty_selected = (($current === '') ? ' selected="selected" ' : '');
+ $o .= '<option value="" ' . $empty_selected . '>' . t('default') . '</option>';
+ foreach($r as $rr) {
+ $selected = (($rr['mid'] == $current) ? ' selected="selected" ' : '');
+ $o .= '<option value="' . $rr['mid'] . '"' . $selected . '>' . $rr['sid'] . '</option>';
+ }
+ $o .= '</select>';
+ }
+
+ return $o;
+}
+
+
+
+
+
+function mimetype_select($channel_id, $current = 'text/bbcode') {
+
+ $x = array(
+ 'text/bbcode',
+ 'text/html',
+ 'text/markdown',
+ 'text/plain'
+ );
+ $r = q("select account_id, account_roles from account left join channel on account_id = channel_account_id where
+ channel_id = %d limit 1",
+ intval($channel_id)
+ );
+
+ if($r) {
+ if($r[0]['account_roles'] & ACCOUNT_ROLE_ALLOWCODE) {
+ if(local_user() && get_account_id() == $r[0]['account_id'])
+ $x[] = 'application/x-php';
+ }
+ }
+
+ $o = t('Page content type: ');
+ $o .= '<select name="mimetype" id="mimetype-select">';
+ foreach($x as $y) {
+ $select = (($y == $current) ? ' selected="selected" ' : '');
+ $o .= '<option name="' . $y . '"' . $select . '>' . $y . '</option>';
+ }
+ $o .= '</select>';
+
+ return $o;
+
+}
-if(! function_exists('lang_selector')) {
function lang_selector() {
global $a;
@@ -1187,10 +1503,10 @@ function lang_selector() {
));
return $o;
-}}
+}
+
-if(! function_exists('return_bytes')) {
function return_bytes ($size_str) {
switch (substr ($size_str, -1))
{
@@ -1199,7 +1515,7 @@ function return_bytes ($size_str) {
case 'G': case 'g': return (int)$size_str * 1073741824;
default: return $size_str;
}
-}}
+}
function generate_user_guid() {
$found = true;
@@ -1253,63 +1569,6 @@ function base64url_decode($s) {
}
-if (!function_exists('str_getcsv')) {
- function str_getcsv($input, $delimiter = ',', $enclosure = '"', $escape = '\\', $eol = '\n') {
- if (is_string($input) && !empty($input)) {
- $output = array();
- $tmp = preg_split("/".$eol."/",$input);
- if (is_array($tmp) && !empty($tmp)) {
- while (list($line_num, $line) = each($tmp)) {
- if (preg_match("/".$escape.$enclosure."/",$line)) {
- while ($strlen = strlen($line)) {
- $pos_delimiter = strpos($line,$delimiter);
- $pos_enclosure_start = strpos($line,$enclosure);
- if (
- is_int($pos_delimiter) && is_int($pos_enclosure_start)
- && ($pos_enclosure_start < $pos_delimiter)
- ) {
- $enclosed_str = substr($line,1);
- $pos_enclosure_end = strpos($enclosed_str,$enclosure);
- $enclosed_str = substr($enclosed_str,0,$pos_enclosure_end);
- $output[$line_num][] = $enclosed_str;
- $offset = $pos_enclosure_end+3;
- } else {
- if (empty($pos_delimiter) && empty($pos_enclosure_start)) {
- $output[$line_num][] = substr($line,0);
- $offset = strlen($line);
- } else {
- $output[$line_num][] = substr($line,0,$pos_delimiter);
- $offset = (
- !empty($pos_enclosure_start)
- && ($pos_enclosure_start < $pos_delimiter)
- )
- ?$pos_enclosure_start
- :$pos_delimiter+1;
- }
- }
- $line = substr($line,$offset);
- }
- } else {
- $line = preg_split("/".$delimiter."/",$line);
-
- /*
- * Validating against pesky extra line breaks creating false rows.
- */
- if (is_array($line) && !empty($line[0])) {
- $output[$line_num] = $line;
- }
- }
- }
- return $output;
- } else {
- return false;
- }
- } else {
- return false;
- }
- }
-}
-
function cleardiv() {
return '<div class="clear"></div>';
}
@@ -1357,7 +1616,7 @@ function array_xmlify($val){
function reltoabs($text, $base)
{
if (empty($base))
- return $text;
+ return $text;
$base = rtrim($base,'/');
@@ -1387,278 +1646,28 @@ function reltoabs($text, $base)
}
function item_post_type($item) {
- if(intval($item['event-id']))
- return t('event');
- if(strlen($item['resource_id']))
- return t('photo');
- if(strlen($item['verb']) && $item['verb'] !== ACTIVITY_POST)
- return t('activity');
- if($item['id'] != $item['parent'])
- return t('comment');
- return t('post');
-}
-
-// post categories and "save to file" use the same item.file table for storage.
-// We will differentiate the different uses by wrapping categories in angle brackets
-// and save to file categories in square brackets.
-// To do this we need to escape these characters if they appear in our tag.
-
-function file_tag_encode($s) {
- return str_replace(array('<','>','[',']'),array('%3c','%3e','%5b','%5d'),$s);
-}
-
-function file_tag_decode($s) {
- return str_replace(array('%3c','%3e','%5b','%5d'),array('<','>','[',']'),$s);
-}
-
-function file_tag_file_query($table,$s,$type = 'file') {
-
- if($type == 'file')
- $termtype = TERM_FILE;
- else
- $termtype = TERM_CATEGORY;
-
- return sprintf(" AND " . (($table) ? dbesc($table) . '.' : '') . "id in (select term.oid from term where term.type = %d and term.term = '%s' and term.uid = " . (($table) ? dbesc($table) . '.' : '') . "uid ) ",
- intval($termtype),
- protect_sprintf(dbesc($s))
- );
-}
-
-function term_query($table,$s,$type = TERM_UNKNOWN) {
-
- return sprintf(" AND " . (($table) ? dbesc($table) . '.' : '') . "id in (select term.oid from term where term.type = %d and term.term = '%s' and term.uid = " . (($table) ? dbesc($table) . '.' : '') . "uid ) ",
- intval($type),
- protect_sprintf(dbesc($s))
- );
-}
-
-// ex. given music,video return <music><video> or [music][video]
-function file_tag_list_to_file($list,$type = 'file') {
- $tag_list = '';
- if(strlen($list)) {
- $list_array = explode(",",$list);
- if($type == 'file') {
- $lbracket = '[';
- $rbracket = ']';
- }
- else {
- $lbracket = '<';
- $rbracket = '>';
- }
-
- foreach($list_array as $item) {
- if(strlen($item)) {
- $tag_list .= $lbracket . file_tag_encode(trim($item)) . $rbracket;
- }
- }
- }
- return $tag_list;
-}
-
-// ex. given <music><video>[friends], return music,video or friends
-function file_tag_file_to_list($file,$type = 'file') {
- $matches = false;
- $list = '';
- if($type == 'file') {
- $cnt = preg_match_all('/\[(.*?)\]/',$file,$matches,PREG_SET_ORDER);
- }
- else {
- $cnt = preg_match_all('/<(.*?)>/',$file,$matches,PREG_SET_ORDER);
- }
- if($cnt) {
- foreach($matches as $mtch) {
- if(strlen($list))
- $list .= ',';
- $list .= file_tag_decode($mtch[1]);
- }
- }
-
- return $list;
-}
-
-function file_tag_update_pconfig($uid,$file_old,$file_new,$type = 'file') {
- // $file_old - categories previously associated with an item
- // $file_new - new list of categories for an item
-
- if(! intval($uid))
- return false;
-
- if($file_old == $file_new)
- return true;
-
- $saved = get_pconfig($uid,'system','filetags');
- if(strlen($saved)) {
- if($type == 'file') {
- $lbracket = '[';
- $rbracket = ']';
- }
- else {
- $lbracket = '<';
- $rbracket = '>';
- }
-
- $filetags_updated = $saved;
-
- // check for new tags to be added as filetags in pconfig
- $new_tags = array();
- $check_new_tags = explode(",",file_tag_file_to_list($file_new,$type));
-
- foreach($check_new_tags as $tag) {
- if(! stristr($saved,$lbracket . file_tag_encode($tag) . $rbracket))
- $new_tags[] = $tag;
- }
-
- $filetags_updated .= file_tag_list_to_file(implode(",",$new_tags),$type);
-
- // check for deleted tags to be removed from filetags in pconfig
- $deleted_tags = array();
- $check_deleted_tags = explode(",",file_tag_file_to_list($file_old,$type));
-
- foreach($check_deleted_tags as $tag) {
- if(! stristr($file_new,$lbracket . file_tag_encode($tag) . $rbracket))
- $deleted_tags[] = $tag;
- }
-
- foreach($deleted_tags as $key => $tag) {
- $r = q("select file from item where uid = %d " . file_tag_file_query('item',$tag,$type),
- intval($uid)
- );
-
- if(count($r)) {
- unset($deleted_tags[$key]);
- }
- else {
- $filetags_updated = str_replace($lbracket . file_tag_encode($tag) . $rbracket,'',$filetags_updated);
- }
- }
-
- if($saved != $filetags_updated) {
- set_pconfig($uid,'system','filetags', $filetags_updated);
- }
- return true;
- }
- else
- if(strlen($file_new)) {
- set_pconfig($uid,'system','filetags', $file_new);
- }
- return true;
-}
-
-function store_item_tag($uid,$iid,$otype,$type,$term,$url = '') {
- if(! $term)
- return false;
- $r = q("select * from term
- where uid = %d and oid = %d and otype = %d and type = %d
- and term = '%s' and url = '%s' ",
- intval($uid),
- intval($iid),
- intval($otype),
- intval($type),
- dbesc($term),
- dbesc($url)
- );
- if(count($r))
- return false;
- $r = q("insert into term (uid, oid, otype, type, term, url)
- values( %d, %d, %d, %d, '%s', '%s') ",
- intval($uid),
- intval($iid),
- intval($otype),
- intval($type),
- dbesc($term),
- dbesc($url)
- );
- return $r;
-}
-
-function get_terms_oftype($arr,$type) {
- $ret = array();
- if(! (is_array($arr) && count($arr)))
- return $ret;
-
- if(! is_array($type))
- $type = array($type);
-
- foreach($type as $t)
- foreach($arr as $x)
- if($x['type'] == $t)
- $ret[] = $x;
- return $ret;
-}
-
-function format_term_for_display($term) {
- $s = '';
- if($term['type'] == TERM_HASHTAG)
- $s .= '#';
- elseif($term['type'] == TERM_MENTION)
- $s .= '@';
-
- if($term['url']) $s .= '<a target="extlink" href="' . $term['url'] . '">' . htmlspecialchars($term['term']) . '</a>';
- else $s .= htmlspecialchars($term['term']);
- return $s;
-}
+ switch($item['resource_type']) {
+ case 'photo':
+ $post_type = t('photo');
+ break;
+ case 'event':
+ $post_type = t('event');
+ break;
+ default:
+ $post_type = t('status');
+ if($item['mid'] != $item['parent_mid'])
+ $post_type = t('comment');
+ break;
+ }
-function file_tag_save_file($uid,$item,$file) {
- $result = false;
- if(! intval($uid))
- return false;
+ if(strlen($item['verb']) && (! activity_match($item['verb'],ACTIVITY_POST)))
+ $post_type = t('activity');
- $r = q("select file from item where id = %d and uid = %d limit 1",
- intval($item),
- intval($uid)
- );
- if(count($r)) {
- if(! stristr($r[0]['file'],'[' . file_tag_encode($file) . ']'))
- q("update item set file = '%s' where id = %d and uid = %d limit 1",
- dbesc($r[0]['file'] . '[' . file_tag_encode($file) . ']'),
- intval($item),
- intval($uid)
- );
- $saved = get_pconfig($uid,'system','filetags');
- if((! strlen($saved)) || (! stristr($saved,'[' . file_tag_encode($file) . ']')))
- set_pconfig($uid,'system','filetags',$saved . '[' . file_tag_encode($file) . ']');
- info( t('Item filed') );
- }
- return true;
+ return $post_type;
}
-function file_tag_unsave_file($uid,$item,$file,$cat = false) {
- $result = false;
- if(! intval($uid))
- return false;
-
- if($cat == true)
- $pattern = '<' . file_tag_encode($file) . '>' ;
- else
- $pattern = '[' . file_tag_encode($file) . ']' ;
-
-
- $r = q("select file from item where id = %d and uid = %d limit 1",
- intval($item),
- intval($uid)
- );
- if(! count($r))
- return false;
-
- q("update item set file = '%s' where id = %d and uid = %d limit 1",
- dbesc(str_replace($pattern,'',$r[0]['file'])),
- intval($item),
- intval($uid)
- );
-
- $r = q("select file from item where uid = %d and deleted = 0 " . file_tag_file_query('item',$file,(($cat) ? 'category' : 'file')),
- intval($uid)
- );
-
- if(! count($r)) {
- $saved = get_pconfig($uid,'system','filetags');
- set_pconfig($uid,'system','filetags',str_replace($pattern,'',$saved));
-
- }
- return true;
-}
function normalise_openid($s) {
return trim(str_replace(array('http://','https://'),array('',''),$s),'/');
@@ -1667,7 +1676,7 @@ function normalise_openid($s) {
function undo_post_tagging($s) {
$matches = null;
- $cnt = preg_match_all('/([@#])\[url=(.*?)\](.*?)\[\/url\]/ism',$s,$matches,PREG_SET_ORDER);
+ $cnt = preg_match_all('/([@#])\[zrl=(.*?)\](.*?)\[\/zrl\]/ism',$s,$matches,PREG_SET_ORDER);
if($cnt) {
foreach($matches as $mtch) {
$s = str_replace($mtch[0], $mtch[1] . $mtch[3],$s);
@@ -1757,7 +1766,7 @@ function ids_to_querystr($arr,$idx = 'id') {
// author_xchan and owner_xchan. If $abook is true also include the abook info.
// This is needed in the API to save extra per item lookups there.
-function xchan_query(&$items,$abook = false) {
+function xchan_query(&$items,$abook = true) {
$arr = array();
if($items && count($items)) {
foreach($items as $item) {
@@ -1769,8 +1778,10 @@ function xchan_query(&$items,$abook = false) {
}
if(count($arr)) {
if($abook) {
- $chans = q("select * from xchan left join hubloc on hubloc_hash = xchan_hash left join abook on abook_xchan = xchan_hash
- where xchan_hash in (" . implode(',', $arr) . ") and ( hubloc_flags & " . intval(HUBLOC_FLAGS_PRIMARY) . " )");
+ $chans = q("select * from xchan left join hubloc on hubloc_hash = xchan_hash left join abook on abook_xchan = xchan_hash and abook_channel = %d
+ where xchan_hash in (" . implode(',', $arr) . ") and ( hubloc_flags & " . intval(HUBLOC_FLAGS_PRIMARY) . " )",
+ intval($item['uid'])
+ );
}
else {
$chans = q("select xchan.*,hubloc.* from xchan left join hubloc on hubloc_hash = xchan_hash
@@ -1849,117 +1860,83 @@ function stringify_array_elms(&$arr,$escape = false) {
*/
function jindent($json) {
- $result = '';
- $pos = 0;
- $strLen = strlen($json);
- $indentStr = ' ';
- $newLine = "\n";
- $prevChar = '';
- $outOfQuotes = true;
+ $result = '';
+ $pos = 0;
+ $strLen = strlen($json);
+ $indentStr = ' ';
+ $newLine = "\n";
+ $prevChar = '';
+ $outOfQuotes = true;
- for ($i=0; $i<=$strLen; $i++) {
+ for ($i=0; $i<=$strLen; $i++) {
- // Grab the next character in the string.
- $char = substr($json, $i, 1);
+ // Grab the next character in the string.
+ $char = substr($json, $i, 1);
- // Are we inside a quoted string?
- if ($char == '"' && $prevChar != '\\') {
- $outOfQuotes = !$outOfQuotes;
-
- // If this character is the end of an element,
- // output a new line and indent the next line.
- } else if(($char == '}' || $char == ']') && $outOfQuotes) {
- $result .= $newLine;
- $pos --;
- for ($j=0; $j<$pos; $j++) {
- $result .= $indentStr;
- }
- }
-
- // Add the character to the result string.
- $result .= $char;
-
- // If the last character was the beginning of an element,
- // output a new line and indent the next line.
- if (($char == ',' || $char == '{' || $char == '[') && $outOfQuotes) {
- $result .= $newLine;
- if ($char == '{' || $char == '[') {
- $pos ++;
- }
-
- for ($j = 0; $j < $pos; $j++) {
- $result .= $indentStr;
- }
- }
-
- $prevChar = $char;
- }
+ // Are we inside a quoted string?
+ if ($char == '"' && $prevChar != '\\') {
+ $outOfQuotes = !$outOfQuotes;
+
+ // If this character is the end of an element,
+ // output a new line and indent the next line.
+ } else if(($char == '}' || $char == ']') && $outOfQuotes) {
+ $result .= $newLine;
+ $pos --;
+ for ($j=0; $j<$pos; $j++) {
+ $result .= $indentStr;
+ }
+ }
+
+ // Add the character to the result string.
+ $result .= $char;
+
+ // If the last character was the beginning of an element,
+ // output a new line and indent the next line.
+ if (($char == ',' || $char == '{' || $char == '[') && $outOfQuotes) {
+ $result .= $newLine;
+ if ($char == '{' || $char == '[') {
+ $pos ++;
+ }
+
+ for ($j = 0; $j < $pos; $j++) {
+ $result .= $indentStr;
+ }
+ }
+
+ $prevChar = $char;
+ }
- return $result;
+ return $result;
}
-// Tag cloud functions - need to be adpated to this database format
-
+function json_decode_plus($s) {
-function tagadelic($uid, $count = 0, $type = TERM_HASHTAG) {
+ $x = json_decode($s,true);
+ if(! $x)
+ $x = json_decode(str_replace(array('\\"','\\\\'),array('"','\\'),$s),true);
+ return $x;
- // Fetch tags
- $r = q("select term, count(term) as total from term
- where uid = %d and type = %d
- and otype = %d
- group by term order by total desc %s",
- intval($uid),
- intval($type),
- intval(TERM_OBJ_POST),
- ((intval($count)) ? "limit $count" : '')
- );
-
- if(! $r)
- return array();
-
- // Find minimum and maximum log-count.
- $tags = array();
- $min = 1e9;
- $max = -1e9;
-
- $x = 0;
- foreach($r as $rr) {
- $tags[$x][0] = $rr['term'];
- $tags[$x][1] = log($rr['total']);
- $tags[$x][2] = 0;
- $min = min($min,$tags[$x][1]);
- $max = max($max,$tags[$x][1]);
- $x ++;
- }
-
- usort($tags,'tags_sort');
+}
- $range = max(.01, $max - $min) * 1.0001;
- for($x = 0; $x < count($tags); $x ++) {
- $tags[$x][2] = 1 + floor(5 * ($tags[$x][1] - $min) / $range);
- }
+function design_tools() {
+ $channel = get_app()->get_channel();
+ $who = $channel['channel_address'];
- return $tags;
-}
-
-function tags_sort($a,$b) {
- if($a[0] == $b[0])
- return 0;
- return((strtolower($a[0]) < strtolower($b[0])) ? -1 : 1);
+ return replace_macros(get_markup_template('design_tools.tpl'), array(
+ '$title' => t('Design'),
+ '$who' => $who,
+ '$blocks' => t('Blocks'),
+ '$menus' => t('Menus'),
+ '$layout' => t('Layouts'),
+ '$pages' => t('Pages')
+ ));
}
+/* case insensitive in_array() */
-function tagblock($link,$uid,$count = 0,$type = TERM_HASHTAG) {
- $tab = 0;
- $r = tagadelic($uid,$count,$type);
-
- if($r) {
- echo '<div class="tags" align="center">';
- foreach($r as $rr) {
- echo '<a href="'.$link .'/' . '?f=&tag=' . urlencode($rr[0]).'" class="tag'.$rr[2].'">'.$rr[0].'</a> ';
- }
- echo '</div>';
- }
+function in_arrayi($needle, $haystack) {
+ return in_array(strtolower($needle), array_map('strtolower', $haystack));
}
+
diff --git a/include/widgets.php b/include/widgets.php
new file mode 100644
index 000000000..a1ff756ff
--- /dev/null
+++ b/include/widgets.php
@@ -0,0 +1,577 @@
+<?php /** @file */
+
+require_once('include/dir_fns.php');
+require_once('include/contact_widgets.php');
+
+
+function widget_profile($args) {
+ $a = get_app();
+ $block = (((get_config('system','block_public')) && (! local_user()) && (! remote_user())) ? true : false);
+ return profile_sidebar($a->profile, $block, true);
+}
+
+// FIXME The problem with the next widget is that we don't have a search function for webpages that we can send the links to.
+// Then we should also provide an option to search webpages and conversations.
+
+function widget_tagcloud($args) {
+
+ $o = '';
+ $tab = 0;
+ $a = get_app();
+ $uid = $a->profile_uid;
+ $count = ((x($args,'count')) ? intval($args['count']) : 24);
+ $flags = 0;
+ $type = TERM_CATEGORY;
+
+ $r = tagadelic($uid,$count,$authors,$flags,ITEM_WEBPAGE,$type);
+
+ if($r) {
+ $o = '<div class="tagblock widget"><h3>' . t('Categories') . '</h3><div class="tags" align="center">';
+ foreach($r as $rr) {
+ $o .= '<span class="tag'.$rr[2].'">'.$rr[0].'</span> ' . "\r\n";
+ }
+ $o .= '</div></div>';
+ }
+ return $o;
+}
+
+function widget_collections($args) {
+ require_once('include/group.php');
+
+ $mode = ((array_key_exists('mode',$args)) ? $args['mode'] : 'conversation');
+ switch($mode) {
+ case 'conversation':
+ $every = argv(0);
+ $each = argv(0);
+ $edit = true;
+ $current = $_REQUEST['gid'];
+ $abook_id = 0;
+ $wmode = 0;
+ break;
+ case 'groups':
+ $every = 'connections';
+ $each = argv(0);
+ $edit = false;
+ $current = intval(argv(1));
+ $abook_id = 0;
+ $wmode = 1;
+ break;
+ case 'abook':
+ $every = 'connections';
+ $each = 'group';
+ $edit = false;
+ $current = 0;
+ $abook_id = get_app()->poi['abook_xchan'];
+ $wmode = 1;
+ break;
+ default:
+ return '';
+ break;
+ }
+
+ return group_side($every, $each, $edit, $current, $abook_id, $wmode);
+
+}
+
+
+function widget_suggestions($arr) {
+
+ if((! local_user()) || (! feature_enabled(local_user(),'suggest')))
+ return '';
+
+ require_once('include/socgraph.php');
+
+ $r = suggestion_query(local_user(),get_observer_hash(),0,20);
+
+ if(! $r) {
+ return;
+ }
+
+ $arr = array();
+
+ // Get two random entries from the top 20 returned.
+ // We'll grab the first one and the one immediately following.
+ // This will throw some entropy intot he situation so you won't
+ // be looking at the same two mug shots every time the widget runs
+
+
+ $index = ((count($r) > 2) ? mt_rand(0,count($r) - 2) : 0);
+
+
+ for($x = $index; $x <= ($index+1); $x ++) {
+
+ $rr = $r[$x];
+ if(! $rr['xchan_url'])
+ break;
+
+ $connlnk = z_root() . '/follow/?url=' . $rr['xchan_addr'];
+
+ $arr[] = array(
+ 'url' => chanlink_url($rr['xchan_url']),
+ 'profile' => $rr['xchan_url'],
+ 'name' => $rr['xchan_name'],
+ 'photo' => $rr['xchan_photo_m'],
+ 'ignlnk' => z_root() . '/suggest?ignore=' . $rr['xchan_hash'],
+ 'conntxt' => t('Connect'),
+ 'connlnk' => $connlnk,
+ 'ignore' => t('Ignore/Hide')
+ );
+ }
+
+
+ $o = replace_macros(get_markup_template('suggest_widget.tpl'),array(
+ '$title' => t('Suggestions'),
+ '$more' => t('See more...'),
+ '$entries' => $arr
+ ));
+
+ return $o;
+
+}
+
+
+function widget_follow($args) {
+ if(! local_user())
+ return '';
+ $a = get_app();
+ $uid =$a->channel['channel_id'];
+ $r = q("select count(*) as total from abook where abook_channel = %d and not (abook_flags & %d) ",
+ intval($uid),
+ intval(ABOOK_FLAG_SELF)
+ );
+ if($r)
+ $total_channels = $r[0]['total'];
+ $limit = service_class_fetch($uid,'total_channels');
+ if($limit !== false) {
+ $abook_usage_message = sprintf( t("You have %1$.0f of %2$.0f allowed connections."), $total_channels, $limit);
+ }
+ else {
+ $abook_usage_message = '';
+ }
+ return replace_macros(get_markup_template('follow.tpl'),array(
+ '$connect' => t('Add New Connection'),
+ '$desc' => t('Enter the channel address'),
+ '$hint' => t('Example: bob@example.com, http://example.com/barbara'),
+ '$follow' => t('Connect'),
+ '$abook_usage_message' => $abook_usage_message
+ ));
+
+}
+
+
+function widget_notes($arr) {
+ if(! local_user())
+ return '';
+ if(! feature_enabled(local_user(),'private_notes'))
+ return '';
+
+ $text = get_pconfig(local_user(),'notes','text');
+
+ $o = replace_macros(get_markup_template('notes.tpl'), array(
+ '$banner' => t('Notes'),
+ '$text' => $text,
+ '$save' => t('Save'),
+ ));
+ return $o;
+}
+
+
+function widget_savedsearch($arr) {
+ if((! local_user()) || (! feature_enabled(local_user(),'savedsearch')))
+ return '';
+
+ $a = get_app();
+
+ $search = ((x($_GET,'search')) ? $_GET['search'] : '');
+
+ if(x($_GET,'searchsave') && $search) {
+ $r = q("select * from `term` where `uid` = %d and `type` = %d and `term` = '%s' limit 1",
+ intval(local_user()),
+ intval(TERM_SAVEDSEARCH),
+ dbesc($search)
+ );
+ if(! $r) {
+ q("insert into `term` ( `uid`,`type`,`term` ) values ( %d, %d, '%s') ",
+ intval(local_user()),
+ intval(TERM_SAVEDSEARCH),
+ dbesc($search)
+ );
+ }
+ }
+
+ if(x($_GET,'searchremove') && $search) {
+ q("delete from `term` where `uid` = %d and `type` = %d and `term` = '%s' limit 1",
+ intval(local_user()),
+ intval(TERM_SAVEDSEARCH),
+ dbesc($search)
+ );
+ $search = '';
+ }
+
+
+
+ $srchurl = $a->query_string;
+
+ $srchurl = rtrim(preg_replace('/searchsave\=[^\&].*?(\&|$)/is','',$srchurl),'&');
+ $hasq = ((strpos($srchurl,'?') !== false) ? true : false);
+ $srchurl = rtrim(preg_replace('/searchremove\=[^\&].*?(\&|$)/is','',$srchurl),'&');
+ $hasq = ((strpos($srchurl,'?') !== false) ? true : false);
+
+ $srchurl = rtrim(preg_replace('/search\=[^\&].*?(\&|$)/is','',$srchurl),'&');
+ $srchurl = str_replace(array('?f=','&f='),array('',''),$srchurl);
+ $hasq = ((strpos($srchurl,'?') !== false) ? true : false);
+
+ $o = '';
+
+ $r = q("select `tid`,`term` from `term` WHERE `uid` = %d and `type` = %d ",
+ intval(local_user()),
+ intval(TERM_SAVEDSEARCH)
+ );
+
+ $saved = array();
+
+ if(count($r)) {
+ foreach($r as $rr) {
+
+ $saved[] = array(
+ 'id' => $rr['tid'],
+ 'term' => $rr['term'],
+ 'dellink' => z_root() . '/' . $srchurl . (($hasq) ? '' : '?f=') . '&amp;searchremove=1&amp;search=' . urlencode($rr['term']),
+ 'srchlink' => z_root() . '/' . $srchurl . (($hasq) ? '' : '?f=') . '&amp;search=' . urlencode($rr['term']),
+ 'displayterm' => htmlspecialchars($rr['term'], ENT_COMPAT,'UTF-8'),
+ 'encodedterm' => urlencode($rr['term']),
+ 'delete' => t('Remove term'),
+ 'selected' => ($search==$rr['term']),
+ );
+ }
+ }
+
+
+ $tpl = get_markup_template("saved_searches.tpl");
+ $o = replace_macros($tpl, array(
+ '$title' => t('Saved Searches'),
+ '$add' => t('add'),
+ '$searchbox' => searchbox('','netsearch-box',$srchurl . (($hasq) ? '' : '?f='),true),
+ '$saved' => $saved,
+ ));
+
+ return $o;
+
+}
+
+
+function widget_filer($arr) {
+ if(! local_user())
+ return '';
+
+ $a = get_app();
+
+ $selected = ((x($_REQUEST,'file')) ? $_REQUEST['file'] : '');
+
+ $terms = array();
+ $r = q("select distinct(term) from term where uid = %d and type = %d order by term asc",
+ intval(local_user()),
+ intval(TERM_FILE)
+ );
+ if(! $r)
+ return;
+
+ foreach($r as $rr)
+ $terms[] = array('name' => $rr['term'], 'selected' => (($selected == $rr['term']) ? 'selected' : ''));
+
+ return replace_macros(get_markup_template('fileas_widget.tpl'),array(
+ '$title' => t('Saved Folders'),
+ '$desc' => '',
+ '$sel_all' => (($selected == '') ? 'selected' : ''),
+ '$all' => t('Everything'),
+ '$terms' => $terms,
+ '$base' => z_root() . '/' . $a->cmd
+
+ ));
+}
+
+function widget_archive($arr) {
+
+ $o = '';
+ $a = get_app();
+
+ if(! $a->profile_uid) {
+ return '';
+ }
+
+ $uid = $a->profile_uid;
+
+ if(! feature_enabled($uid,'archives'))
+ return '';
+
+
+ $wall = ((array_key_exists('wall', $arr)) ? intval($arr['wall']) : 0);
+ $url = z_root() . '/' . $a->cmd;
+
+
+ $ret = posted_dates($uid,$wall);
+
+ if(! count($ret))
+ return '';
+
+ $o = replace_macros(get_markup_template('posted_date_widget.tpl'),array(
+ '$title' => t('Archives'),
+ '$size' => ((count($ret) > 6) ? 6 : count($ret)),
+ '$url' => $url,
+ '$dates' => $ret
+ ));
+ return $o;
+}
+
+
+function widget_fullprofile($arr) {
+ $a = get_app();
+ if(! $a->profile['profile_uid'])
+ return;
+
+ $block = (((get_config('system','block_public')) && (! local_user()) && (! remote_user())) ? true : false);
+
+ return profile_sidebar($a->profile, $block);
+}
+
+function widget_categories($arr) {
+ $a = get_app();
+ $cat = ((x($_REQUEST,'cat')) ? htmlspecialchars($_REQUEST['cat'],ENT_COMPAT,'UTF-8') : '');
+ $srchurl = $a->query_string;
+ $srchurl = rtrim(preg_replace('/cat\=[^\&].*?(\&|$)/is','',$srchurl),'&');
+ $srchurl = str_replace(array('?f=','&f='),array('',''),$srchurl);
+ return categories_widget($srchurl,$cat);
+
+}
+
+function widget_tagcloud_wall($arr) {
+ $a = get_app();
+ if((! $a->profile['profile_uid']) || (! $a->profile['channel_hash']))
+ return '';
+ $limit = ((array_key_exists('limit',$arr)) ? intval($arr['limit']) : 50);
+ if(feature_enabled($a->profile['profile_uid'],'tagadelic'))
+ return tagblock('search',$a->profile['profile_uid'],$limit,$a->profile['channel_hash'],ITEM_WALL);
+ return '';
+}
+
+
+function widget_affinity($arr) {
+
+ if(! local_user())
+ return '';
+
+ $cmin = ((x($_REQUEST,'cmin')) ? intval($_REQUEST['cmin']) : 0);
+ $cmax = ((x($_REQUEST,'cmax')) ? intval($_REQUEST['cmax']) : 99);
+
+ if(feature_enabled(local_user(),'affinity')) {
+ $tpl = get_markup_template('main_slider.tpl');
+ $x = replace_macros($tpl,array(
+ '$val' => $cmin . ';' . $cmax,
+ '$refresh' => t('Refresh'),
+ '$me' => t('Me'),
+ '$intimate' => t('Best Friends'),
+ '$friends' => t('Friends'),
+ '$coworkers' => t('Co-workers'),
+ '$oldfriends' => t('Former Friends'),
+ '$acquaintances' => t('Acquaintances'),
+ '$world' => t('Everybody')
+ ));
+ $arr = array('html' => $x);
+ call_hooks('main_slider',$arr);
+ return $arr['html'];
+ }
+ return '';
+}
+
+
+function widget_settings_menu($arr) {
+
+ if(! local_user())
+ return;
+
+ $a = get_app();
+ $channel = $a->get_channel();
+
+ $abook_self_id = 0;
+
+ // Retrieve the 'self' address book entry for use in the auto-permissions link
+
+ $abk = q("select abook_id from abook where abook_channel = %d and ( abook_flags & %d ) limit 1",
+ intval(local_user()),
+ intval(ABOOK_FLAG_SELF)
+ );
+ if($abk)
+ $abook_self_id = $abk[0]['abook_id'];
+
+
+ $tabs = array(
+ array(
+ 'label' => t('Account settings'),
+ 'url' => $a->get_baseurl(true).'/settings/account',
+ 'selected' => ((argv(1) === 'account') ? 'active' : ''),
+ ),
+
+ array(
+ 'label' => t('Channel settings'),
+ 'url' => $a->get_baseurl(true).'/settings/channel',
+ 'selected' => ((argv(1) === 'channel') ? 'active' : ''),
+ ),
+
+ array(
+ 'label' => t('Additional features'),
+ 'url' => $a->get_baseurl(true).'/settings/features',
+ 'selected' => ((argv(1) === 'features') ? 'active' : ''),
+ ),
+
+ array(
+ 'label' => t('Feature settings'),
+ 'url' => $a->get_baseurl(true).'/settings/featured',
+ 'selected' => ((argv(1) === 'featured') ? 'active' : ''),
+ ),
+
+ array(
+ 'label' => t('Display settings'),
+ 'url' => $a->get_baseurl(true).'/settings/display',
+ 'selected' => ((argv(1) === 'display') ? 'active' : ''),
+ ),
+
+ array(
+ 'label' => t('Connected apps'),
+ 'url' => $a->get_baseurl(true) . '/settings/oauth',
+ 'selected' => ((argv(1) === 'oauth') ? 'active' : ''),
+ ),
+
+ array(
+ 'label' => t('Export channel'),
+ 'url' => $a->get_baseurl(true) . '/uexport/basic',
+ 'selected' => ''
+ ),
+
+// array(
+// 'label' => t('Export account'),
+// 'url' => $a->get_baseurl(true) . '/uexport/complete',
+// 'selected' => ''
+// ),
+
+ array(
+ 'label' => t('Automatic Permissions (Advanced)'),
+ 'url' => $a->get_baseurl(true) . '/connedit/' . $abook_self_id,
+ 'selected' => ''
+ ),
+
+
+ );
+
+ if(feature_enabled(local_user(),'premium_channel')) {
+ $tabs[] = array(
+ 'label' => t('Premium Channel Settings'),
+ 'url' => $a->get_baseurl(true) . '/connect/' . $channel['channel_address'],
+ 'selected' => ''
+ );
+
+ }
+
+ if(feature_enabled(local_user(),'channel_sources')) {
+ $tabs[] = array(
+ 'label' => t('Channel Sources'),
+ 'url' => $a->get_baseurl(true) . '/sources',
+ 'selected' => ''
+ );
+
+ }
+
+
+
+ $tabtpl = get_markup_template("generic_links_widget.tpl");
+ return replace_macros($tabtpl, array(
+ '$title' => t('Settings'),
+ '$class' => 'settings-widget',
+ '$items' => $tabs,
+ ));
+
+}
+
+
+function widget_mailmenu($arr) {
+ if (! local_user())
+ return;
+
+ $a = get_app();
+ return replace_macros(get_markup_template('message_side.tpl'), array(
+ '$tabs'=> array(),
+
+ '$check'=>array(
+ 'label' => t('Check Mail'),
+ 'url' => $a->get_baseurl(true) . '/message',
+ 'sel' => (argv(1) == ''),
+ ),
+ '$new'=>array(
+ 'label' => t('New Message'),
+ 'url' => $a->get_baseurl(true) . '/mail/new',
+ 'sel'=> (argv(1) == 'new'),
+ )
+
+ ));
+
+}
+
+function widget_design_tools($arr) {
+ $a = get_app();
+
+ // mod menu doesn't load a profile. For any modules which load a profile, check it.
+ // otherwise local_user() is sufficient for permissions.
+
+ if($a->profile['profile_uid'])
+ if($a->profile['profile_uid'] != local_user())
+ return '';
+
+ if(! local_user())
+ return '';
+
+ return design_tools();
+}
+
+function widget_findpeople($arr) {
+ return findpeople_widget();
+}
+
+
+function widget_photo_albums($arr) {
+ $a = get_app();
+ if(! $a->profile['profile_uid'])
+ return '';
+ $channelx = channelx_by_n($a->profile['profile_uid']);
+ if((! $channelx) || (! perm_is_allowed($a->profile['profile_uid'],get_observer_hash(),'view_photos')))
+ return '';
+ return photos_album_widget($channelx[0],$a->get_observer());
+
+}
+
+
+function widget_vcard($arr) {
+ return vcard_from_xchan('',get_app()->get_observer());
+}
+
+
+/**
+ * The following directory widgets are only useful on the directory page
+ */
+
+function widget_dirsafemode($arr) {
+ return dir_safe_mode();
+}
+
+function widget_dirsort($arr) {
+ return dir_sort_links();
+}
+
+function widget_dirtags($arr) {
+ return dir_tagblock(z_root() . '/directory',null);
+}
+
+function widget_menu_preview($arr) {
+ if(! get_app()->data['menu_item'])
+ return;
+ require_once('include/menu.php');
+ return menu_render(get_app()->data['menu_item']);
+}
diff --git a/include/zot.php b/include/zot.php
index 524f958ad..7c2cfe019 100644
--- a/include/zot.php
+++ b/include/zot.php
@@ -1,12 +1,29 @@
-<?php
+<?php /** @file */
require_once('include/crypto.php');
require_once('include/items.php');
/**
+ * Red implementation of zot protocol.
+ *
+ * https://github.com/friendica/red/wiki/zot
+ * https://github.com/friendica/red/wiki/Zot---A-High-Level-Overview
+ *
+ */
+
+
+/**
*
* @function zot_new_uid($channel_nick)
- * @channel_id = unique nickname of controlling entity
+ *
+ * Generates a unique string for use as a zot guid using our DNS-based url, the channel nickname and some entropy.
+ * The entropy ensures uniqueness against re-installs where the same URL and nickname are chosen.
+ * NOTE: zot doesn't require this to be unique. Internally we use a whirlpool hash of this guid and the signature
+ * of this guid signed with the channel private key. This can be verified and should make the probability of
+ * collision of the verified result negligible within the constraints of our immediate universe.
+ *
+ * @param string channel_nickname = unique nickname of controlling entity
+ *
* @returns string
*
*/
@@ -18,69 +35,58 @@ function zot_new_uid($channel_nick) {
/**
- *
- * Given an array of zot hashes, return all distinct hubs
- * If primary is true, return only primary hubs
- * Result is ordered by url to assist in batching.
- * Return only the first primary hub as there should only be one.
+ * @function zot_get_hublocs($hash)
+ * Given a zot hash, return all distinct hubs.
+ * This function is used in building the zot discovery packet
+ * and therefore should only be used by channels which are defined
+ * on this hub
+ * @param string $hash - xchan_hash
+ * @retuns array of hubloc (hub location structures)
+ * hubloc_id int
+ * hubloc_guid char(255)
+ * hubloc_guid_sig text
+ * hubloc_hash char(255)
+ * hubloc_addr char(255)
+ * hubloc_flags int
+ * hubloc_status int
+ * hubloc_url char(255)
+ * hubloc_url_sig text
+ * hubloc_host char(255)
+ * hubloc_callback char(255)
+ * hubloc_connect char(255)
+ * hubloc_sitekey text
+ * hubloc_updated datetime
+ * hubloc_connected datetime
*
*/
-function zot_get_hubloc($arr,$primary = false) {
-
- $tmp = '';
-
- if(is_array($arr)) {
- foreach($arr as $e) {
- if(strlen($tmp))
- $tmp .= ',';
- $tmp .= "'" . dbesc($e) . "'" ;
- }
- }
-
- if(! strlen($tmp))
- return array();
+function zot_get_hublocs($hash) {
- $sql_extra = (($primary) ? " and hubloc_flags & " . intval(HUBLOC_FLAGS_PRIMARY) : "" );
- $limit = (($primary) ? " limit 1 " : "");
- return q("select * from hubloc where hubloc_hash in ( $tmp ) $sql_extra order by hubloc_url $limit");
+ /** Only search for active hublocs - e.g. those that haven't been marked deleted */
-}
-
-function zot_notify($channel,$url,$type = 'notify',$recipients = null, $remote_key = null) {
-
- $params = array(
- 'type' => $type,
- 'sender' => json_encode(array(
- 'guid' => $channel['channel_guid'],
- 'guid_sig' => base64url_encode(rsa_sign($channel['channel_guid'],$channel['channel_prvkey'])),
- 'url' => z_root(),
- 'url_sig' => base64url_encode(rsa_sign(z_root(),$channel['channel_prvkey']))
- )),
- 'callback' => '/post',
- 'version' => ZOT_REVISION
+ $ret = q("select * from hubloc where hubloc_hash = '%s' and not ( hubloc_flags & %d ) group by hubloc_url ",
+ dbesc($hash),
+ intval(HUBLOC_FLAGS_DELETED)
);
-
-
- if($recipients)
- $params['recipients'] = json_encode($recipients);
-
- // Hush-hush ultra top-secret mode
-
- if($remote_key) {
- $params = aes_encapsulate($params,$remote_key);
- }
-
- $x = z_post_url($url,$params);
- return($x);
+ return $ret;
}
-
-/*
+
+/**
*
- * zot_build_packet builds a notification packet that you can either
- * store in the queue with a message array or call zot_zot to immediately
- * zot it to the other side
+ * @function zot_build_packet($channel,$type = 'notify',$recipients = null, $remote_key = null, $secret = null)
+ * builds a zot notification packet that you can either
+ * store in the queue with a message array or call zot_zot to immediately
+ * zot it to the other side
*
+ * @param array $channel => sender channel structure
+ * @param string $type => packet type: one of 'ping', 'pickup', 'purge', 'refresh', 'notify', 'auth_check'
+ * @param array $recipients => envelope information, array ( 'guid' => string, 'guid_sig' => string ); empty for public posts
+ * @param string $remote_key => optional public site key of target hub used to encrypt entire packet
+ * NOTE: remote_key and encrypted packets are required for 'auth_check' packets, optional for all others
+ * @param string $secret => random string, required for packets which require verification/callback
+ * e.g. 'pickup', 'purge', 'notify', 'auth_check' --- 'ping' and 'refresh' do not require verification
+ *
+ * @returns string json encoded zot packet
*/
function zot_build_packet($channel,$type = 'notify',$recipients = null, $remote_key = null, $secret = null) {
@@ -110,18 +116,43 @@ function zot_build_packet($channel,$type = 'notify',$recipients = null, $remote_
// Hush-hush ultra top-secret mode
if($remote_key) {
- $data = aes_encapsulate(json_encode($data),$remote_key);
+ $data = crypto_encapsulate(json_encode($data),$remote_key);
}
return json_encode($data);
}
+/**
+ * @function: zot_zot
+ * @param: string $url
+ * @param: array $data
+ *
+ * @returns: array => see z_post_url for returned data format
+ */
+
+
+
function zot_zot($url,$data) {
return z_post_url($url,array('data' => $data));
}
-function zot_finger($webbie,$channel) {
+/**
+ * @function: zot_finger
+ *
+ * Look up information about channel
+ * @param: string $webbie
+ * does not have to be host qualified e.g. 'foo' is treated as 'foo@thishub'
+ * @param: array $channel
+ * (optional), if supplied permissions will be enumerated specifically for $channel
+ * @param: boolean $autofallback
+ * fallback/failover to http if https connection cannot be established. Default is true.
+ *
+ * @returns: array => see z_post_url and mod/zfinger.php
+ */
+
+
+function zot_finger($webbie,$channel,$autofallback = true) {
if(strpos($webbie,'@') === false) {
@@ -135,10 +166,15 @@ function zot_finger($webbie,$channel) {
$xchan_addr = $address . '@' . $host;
+ if((! $address) || (! $xchan_addr)) {
+ logger('zot_finger: no address :' . $webbie);
+ return array('success' => false);
+ }
+
$r = q("select xchan.*, hubloc.* from xchan
left join hubloc on xchan_hash = hubloc_hash
where xchan_addr = '%s' and (hubloc_flags & %d) limit 1",
- dbesc($xchan_address),
+ dbesc($xchan_addr),
intval(HUBLOC_FLAGS_PRIMARY)
);
@@ -152,7 +188,7 @@ function zot_finger($webbie,$channel) {
$rhs = '/.well-known/zot-info';
$https = ((strpos($url,'https://') === 0) ? true : false);
- logger('zot_finger: ' . $url, LOGGER_DEBUG);
+ logger('zot_finger: ' . $address . ' at ' . $url, LOGGER_DEBUG);
if($channel) {
$postvars = array(
@@ -165,7 +201,7 @@ function zot_finger($webbie,$channel) {
$result = z_post_url($url . $rhs,$postvars);
- if(! $result['success']) {
+ if((! $result['success']) && ($autofallback)) {
if($https) {
logger('zot_finger: https failed. falling back to http');
$result = z_post_url('http://' . $host . $rhs,$postvars);
@@ -176,7 +212,7 @@ function zot_finger($webbie,$channel) {
$rhs .= '?f=&address=' . urlencode($address);
$result = z_fetch_url($url . $rhs);
- if(! $result['success']) {
+ if((! $result['success']) && ($autofallback)) {
if($https) {
logger('zot_finger: https failed. falling back to http');
$result = z_fetch_url('http://' . $host . $rhs);
@@ -191,6 +227,30 @@ function zot_finger($webbie,$channel) {
}
+/**
+ * @function: zot_refresh($them, $channel = null)
+ *
+ * zot_refresh is typically invoked when somebody has changed permissions of a channel and they are notified
+ * to fetch new permissions via a finger/discovery operation. This may result in a new connection
+ * (abook entry) being added to a local channel and it may result in auto-permissions being granted.
+ *
+ * Friending in zot is accomplished by sending a refresh packet to a specific channel which indicates a
+ * permission change has been made by the sender which affects the target channel. The hub controlling
+ * the target channel does targetted discovery (a zot-finger request requesting permissions for the local
+ * channel). These are decoded here, and if necessary and abook structure (addressbook) is created to store
+ * the permissions assigned to this channel.
+ *
+ * Initially these abook structures are created with a 'pending' flag, so that no reverse permissions are
+ * implied until this is approved by the owner channel. A channel can also auto-populate permissions in
+ * return and send back a refresh packet of its own. This is used by forum and group communication channels
+ * so that friending and membership in the channel's "club" is automatic.
+ *
+ * @param array $them => xchan structure of sender
+ * @param array $channel => local channel structure of target recipient, required for "friending" operations
+ *
+ * @returns boolean true if successful, else false
+ */
+
function zot_refresh($them,$channel = null) {
logger('zot_refresh: them: ' . print_r($them,true), LOGGER_DATA);
@@ -258,7 +318,7 @@ function zot_refresh($them,$channel = null) {
if($channel) {
$global_perms = get_perms();
if($j['permissions']['data']) {
- $permissions = aes_unencapsulate(array(
+ $permissions = crypto_unencapsulate(array(
'data' => $j['permissions']['data'],
'key' => $j['permissions']['key'],
'iv' => $j['permissions']['iv']),
@@ -295,6 +355,11 @@ function zot_refresh($them,$channel = null) {
);
if(! $y)
logger('abook update failed');
+ else {
+ // if we were just granted read stream permission and didn't have it before, try to pull in some posts
+ if((! ($r[0]['abook_their_perms'] & PERMS_R_STREAM)) && ($their_perms & PERMS_R_STREAM))
+ proc_run('php','include/onepoll.php',$r[0]['abook_id']);
+ }
}
else {
$default_perms = 0;
@@ -319,7 +384,6 @@ function zot_refresh($them,$channel = null) {
);
if($y) {
-
logger("New introduction received for {$channel['channel_name']}");
if($default_perms) {
// send back a permissions update for auto-friend/auto-permissions
@@ -329,29 +393,16 @@ function zot_refresh($them,$channel = null) {
intval(ABOOK_FLAG_SELF)
);
if($z)
- proc_run('php','include/notifier.php','permissions_update',$z[0]['abook_id']);
+ proc_run('php','include/notifier.php','permission_update',$z[0]['abook_id']);
}
- }
- }
- }
- else {
-
- logger('zot_refresh: importing profile if available');
-
- // Are we a directory server of some kind?
- $dirmode = intval(get_config('system','directory_mode'));
- if($dirmode != DIRECTORY_MODE_NORMAL) {
- if(array_key_exists('profile',$x) && is_array($x['profile'])) {
- import_directory_profile($x['hash'],$x['profile']);
- }
- else {
- // they may have made it private
- $r = q("delete from xprof where xprof_hash = '%s' limit 1",
- dbesc($x['hash'])
- );
- $r = q("delete from xtag where xtag_hash = '%s' limit 1",
+ $new_connection = q("select abook_id, abook_flags from abook where abook_channel = %d and abook_xchan = '%s' order by abook_created desc limit 1",
+ intval($channel['channel_id']),
dbesc($x['hash'])
);
+
+ if($new_connection && (! ($new_connection[0]['abook_flags'] & ABOOK_FLAG_PENDING)) && ($their_perms & PERMS_R_STREAM))
+ proc_run('php','include/onepoll.php',$new_connection[0]['abook_id']);
+
}
}
}
@@ -360,6 +411,25 @@ function zot_refresh($them,$channel = null) {
return false;
}
+/**
+ * @function: zot_gethub
+ *
+ * A guid and a url, both signed by the sender, distinguish a known sender at a known location
+ * This function looks these up to see if the channel is known and therefore previously verified.
+ * If not, we will need to verify it.
+ *
+ * @param array $arr
+ * $arr must contain:
+ * string $arr['guid'] => guid of conversant
+ * string $arr['guid_sig'] => guid signed with conversant's private key
+ * string $arr['url'] => URL of the origination hub of this communication
+ * string $arr['url_sig'] => URL signed with conversant's private key
+ *
+ *
+ * @returns: array => hubloc record
+ */
+
+
function zot_gethub($arr) {
@@ -378,10 +448,31 @@ function zot_gethub($arr) {
return $r[0];
}
}
- logger('zot_gethub: not found', LOGGER_DEBUG);
+ logger('zot_gethub: not found: ' . print_r($arr,true), LOGGER_DEBUG);
return null;
}
+/**
+ * @function zot_register_hub($arr)
+ *
+ * A communication has been received which has an unknown (to us) sender.
+ * Perform discovery based on our calculated hash of the sender at the origination address.
+ * This will fetch the discovery packet of the sender, which contains the public key we
+ * need to verify our guid and url signatures.
+ *
+ * @param array $arr
+ * $arr must contain:
+ * string $arr['guid'] => guid of conversant
+ * string $arr['guid_sig'] => guid signed with conversant's private key
+ * string $arr['url'] => URL of the origination hub of this communication
+ * string $arr['url_sig'] => URL signed with conversant's private key
+ *
+ *
+ * @returns array => 'success' (boolean true or false)
+ * 'message' (optional error string only if success is false)
+ */
+
+
function zot_register_hub($arr) {
$result = array('success' => false);
@@ -400,23 +491,61 @@ function zot_register_hub($arr) {
if($x['success']) {
$record = json_decode($x['body'],true);
- $c = import_xchan($record);
- if($c['success'])
- $result['success'] = true;
+
+ /*
+ * We now have a key - only continue registration if our signatures are valid
+ * AND the guid and guid sig in the returned packet match those provided in
+ * our current communication.
+ */
+
+ if((rsa_verify($arr['guid'],base64url_decode($arr['guid_sig']),$record['key']))
+ && (rsa_verify($arr['url'],base64url_decode($arr['url_sig']),$record['key']))
+ && ($arr['guid'] === $record['guid'])
+ && ($arr['guid_sig'] === $record['guid_sig'])) {
+
+ $c = import_xchan($record);
+ if($c['success'])
+ $result['success'] = true;
+ }
+ else {
+ logger('zot_register_hub: failure to verify returned packet.');
+ }
}
}
return $result;
}
+/**
+ * @function import_xchan($arr,$ud_flags = 1)
+ * Takes an associative array of a fecthed discovery packet and updates
+ * all internal data structures which need to be updated as a result.
+ *
+ * @param array $arr => json_decoded discovery packet
+ * @param int $ud_flags
+ * Determines whether to create a directory update record if any changes occur, default 1 or true
+ *
+ * @returns array => 'success' (boolean true or false)
+ * 'message' (optional error string only if success is false)
+ */
+
+function import_xchan($arr,$ud_flags = 1) {
-// Takes a json associative array from zot_finger and imports the xchan and hublocs
-// If the xchan already exists, update the name and photo if these have changed.
-//
-function import_xchan($arr) {
+ call_hooks('import_xchan', $arr);
$ret = array('success' => false);
+ $dirmode = intval(get_config('system','directory_mode'));
+
+ $changed = false;
+ $what = '';
+
+ if(! (is_array($arr) && array_key_exists('success',$arr) && $arr['success'])) {
+ logger('import_xchan: invalid data packet: ' . print_r($arr,true));
+ $ret['message'] = t('Invalid data packet');
+ return $ret;
+ }
+
$xchan_hash = base64url_encode(hash('whirlpool',$arr['guid'] . $arr['guid_sig'], true));
$import_photos = false;
@@ -427,10 +556,17 @@ function import_xchan($arr) {
return $ret;
}
+ logger('import_xchan: ' . $xchan_hash, LOGGER_DEBUG);
+
$r = q("select * from xchan where xchan_hash = '%s' limit 1",
dbesc($xchan_hash)
);
+ if(! array_key_exists('connect_url', $arr))
+ $arr['connect_url'] = '';
+
+ if(strpos($arr['address'],'/') !== false)
+ $arr['address'] = substr($arr['address'],0,strpos($arr['address'],'/'));
if($r) {
if($r[0]['xchan_photo_date'] != $arr['photo_updated'])
@@ -452,23 +588,60 @@ function import_xchan($arr) {
$new_flags = $r[0]['xchan_flags'] ^ XCHAN_FLAGS_HIDDEN;
else
$new_flags = $r[0]['xchan_flags'];
-
-
- if(($r[0]['xchan_name_date'] != $arr['name_updated']) || ($r[0]['xchan_connurl'] != $arr['connections_url']) || ($r[0]['xchan_flags'] != $new_flags)) {
- $r = q("update xchan set xchan_name = '%s', xchan_name_date = '%s', xchan_connurl = '%s', xchan_flags = %d where xchan_hash = '%s' limit 1",
+
+ $adult = (($r[0]['xchan_flags'] & XCHAN_FLAGS_SELFCENSORED) ? true : false);
+ $adult_changed = ((intval($adult) != intval($arr['adult_content'])) ? true : false);
+ if($adult_changed)
+ $new_flags = $new_flags ^ XCHAN_FLAGS_SELFCENSORED;
+
+
+ if(($r[0]['xchan_name_date'] != $arr['name_updated'])
+ || ($r[0]['xchan_connurl'] != $arr['connections_url'])
+ || ($r[0]['xchan_flags'] != $new_flags)
+ || ($r[0]['xchan_addr'] != $arr['address'])
+ || ($r[0]['xchan_follow'] != $arr['follow_url'])
+ || ($r[0]['xchan_connpage'] != $arr['connect_url'])
+ || ($r[0]['xchan_url'] != $arr['url'])) {
+ $r = q("update xchan set xchan_name = '%s', xchan_name_date = '%s', xchan_connurl = '%s', xchan_follow = '%s',
+ xchan_connpage = '%s', xchan_flags = %d,
+ xchan_addr = '%s', xchan_url = '%s' where xchan_hash = '%s' limit 1",
dbesc($arr['name']),
dbesc($arr['name_updated']),
dbesc($arr['connections_url']),
+ dbesc($arr['follow_url']),
+ dbesc($arr['connect_url']),
intval($new_flags),
+ dbesc($arr['address']),
+ dbesc($arr['url']),
dbesc($xchan_hash)
);
+
+ logger('import_xchan: existing: ' . print_r($r[0],true), LOGGER_DATA);
+ logger('import_xchan: new: ' . print_r($arr,true), LOGGER_DATA);
+ $what .= 'xchan ';
+ $changed = true;
}
}
else {
$import_photos = true;
+
+
+ if((($arr['site']['directory_mode'] === 'standalone') || ($dirmode & DIRECTORY_MODE_STANDALONE))
+&& ($arr['site']['url'] != z_root()))
+ $arr['searchable'] = false;
+
+ $hidden = (1 - intval($arr['searchable']));
+
+ if($hidden)
+ $new_flags = XCHAN_FLAGS_HIDDEN;
+ else
+ $new_flags = 0;
+ if($arr['adult_content'])
+ $new_flags |= XCHAN_FLAGS_SELFCENSORED;
+
$x = q("insert into xchan ( xchan_hash, xchan_guid, xchan_guid_sig, xchan_pubkey, xchan_photo_mimetype,
- xchan_photo_l, xchan_addr, xchan_url, xchan_connurl, xchan_name, xchan_network, xchan_photo_date, xchan_name_date)
- values ( '%s', '%s', '%s', '%s' , '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s') ",
+ xchan_photo_l, xchan_addr, xchan_url, xchan_connurl, xchan_follow, xchan_connpage, xchan_name, xchan_network, xchan_photo_date, xchan_name_date, xchan_flags)
+ values ( '%s', '%s', '%s', '%s' , '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d) ",
dbesc($xchan_hash),
dbesc($arr['guid']),
dbesc($arr['guid_sig']),
@@ -478,32 +651,81 @@ function import_xchan($arr) {
dbesc($arr['address']),
dbesc($arr['url']),
dbesc($arr['connections_url']),
+ dbesc($arr['follow_url']),
+ dbesc($arr['connect_url']),
dbesc($arr['name']),
dbesc('zot'),
dbesc($arr['photo_updated']),
- dbesc($arr['name_updated'])
+ dbesc($arr['name_updated']),
+ intval($new_flags)
);
+ $what .= 'new_xchan';
+ $changed = true;
+
}
if($import_photos) {
- require_once("Photo.php");
+ require_once('include/photo/photo_driver.php');
+
+ // see if this is a channel clone that's hosted locally - which we treat different from other xchans/connections
- $photos = import_profile_photo($arr['photo'],$xchan_hash);
- $r = q("update xchan set xchan_photo_date = '%s', xchan_photo_l = '%s', xchan_photo_m = '%s', xchan_photo_s = '%s', xchan_photo_mimetype = '%s'
+ $local = q("select channel_account_id, channel_id from channel where channel_hash = '%s' limit 1",
+ dbesc($xchan_hash)
+ );
+ if($local) {
+ $ph = z_fetch_url($arr['photo'],true);
+ if($ph['success']) {
+ import_channel_photo($ph['body'], $arr['photo_mimetype'], $local[0]['channel_account_id'],$local[0]['channel_id']);
+ // reset the names in case they got messed up when we had a bug in this function
+ $photos = array(
+ z_root() . '/photo/profile/l/' . $local[0]['channel_id'],
+ z_root() . '/photo/profile/m/' . $local[0]['channel_id'],
+ z_root() . '/photo/profile/s/' . $local[0]['channel_id'],
+ $arr['photo_mimetype']
+ );
+ }
+ }
+ else {
+ $photos = import_profile_photo($arr['photo'],$xchan_hash);
+ }
+ if($photos) {
+ $r = q("update xchan set xchan_photo_date = '%s', xchan_photo_l = '%s', xchan_photo_m = '%s', xchan_photo_s = '%s', xchan_photo_mimetype = '%s'
where xchan_hash = '%s' limit 1",
- dbesc($arr['photo_updated']),
+ dbesc(datetime_convert('UTC','UTC',$arr['photo_updated'])),
dbesc($photos[0]),
dbesc($photos[1]),
dbesc($photos[2]),
dbesc($photos[3]),
dbesc($xchan_hash)
- );
+ );
+
+ $what .= 'photo ';
+ $changed = true;
+ }
}
+ // what we are missing for true hub independence is for any changes in the primary hub to
+ // get reflected not only in the hublocs, but also to update the URLs and addr in the appropriate xchan
+
if($arr['locations']) {
+
+ $xisting = q("select hubloc_id, hubloc_url, hubloc_sitekey from hubloc where hubloc_hash = '%s'",
+ dbesc($xchan_hash)
+ );
+
+ // See if a primary is specified
+
+ $has_primary = false;
+ foreach($arr['locations'] as $location) {
+ if($location['primary']) {
+ $has_primary = true;
+ break;
+ }
+ }
+
foreach($arr['locations'] as $location) {
if(! rsa_verify($location['url'],base64url_decode($location['url_sig']),$arr['key'])) {
logger('import_xchan: Unable to verify site signature for ' . $location['url']);
@@ -511,22 +733,95 @@ function import_xchan($arr) {
continue;
}
- $r = q("select * from hubloc where hubloc_hash = '%s' and hubloc_url = '%s' limit 1",
+ // Ensure that they have one primary hub
+
+ if(! $has_primary)
+ $location['primary'] = true;
+
+
+ for($x = 0; $x < count($xisting); $x ++) {
+ if(($xisting[$x]['hubloc_url'] === $location['url']) && ($xisting[$x]['hubloc_sitekey'] === $location['sitekey'])) {
+ $xisting[$x]['updated'] = true;
+ }
+ }
+
+ // match as many fields as possible in case anything at all changed.
+
+ $r = q("select * from hubloc where hubloc_hash = '%s' and hubloc_guid = '%s' and hubloc_guid_sig = '%s' and hubloc_url = '%s' and hubloc_url_sig = '%s' and hubloc_host = '%s' and hubloc_addr = '%s' and hubloc_callback = '%s' and hubloc_sitekey = '%s' ",
dbesc($xchan_hash),
- dbesc($location['url'])
+ dbesc($arr['guid']),
+ dbesc($arr['guid_sig']),
+ dbesc($location['url']),
+ dbesc($location['url_sig']),
+ dbesc($location['host']),
+ dbesc($location['address']),
+ dbesc($location['callback']),
+ dbesc($location['sitekey'])
);
if($r) {
- if(($r[0]['hubloc_flags'] & HUBLOC_FLAGS_PRIMARY) && (! $location['primary'])) {
- $r = q("update hubloc set hubloc_flags = (hubloc_flags ^ %d) where hubloc_id = %d limit 1",
+ logger('import_xchan: hub exists: ' . $location['url']);
+ // update connection timestamp if this is the site we're talking to
+ if($location['url'] == $arr['site']['url']) {
+ q("update hubloc set hubloc_connected = '%s', hubloc_updated = '%s' where hubloc_id = %d limit 1",
+ dbesc(datetime_convert()),
+ dbesc(datetime_convert()),
+ intval($r[0]['hubloc_id'])
+ );
+ }
+
+ // Remove pure duplicates
+ if(count($r) > 1) {
+ for($h = 1; $h < count($r); $h ++) {
+ q("delete from hubloc where hubloc_id = %d limit 1",
+ intval($r[$h]['hubloc_id'])
+ );
+ }
+ }
+
+ if((($r[0]['hubloc_flags'] & HUBLOC_FLAGS_PRIMARY) && (! $location['primary']))
+ || ((! ($r[0]['hubloc_flags'] & HUBLOC_FLAGS_PRIMARY)) && ($location['primary']))) {
+ $r = q("update hubloc set hubloc_flags = (hubloc_flags ^ %d), hubloc_updated = '%s' where hubloc_id = %d limit 1",
intval(HUBLOC_FLAGS_PRIMARY),
+ dbesc(datetime_convert()),
+ intval($r[0]['hubloc_id'])
+ );
+ $what = 'primary_hub ';
+ $changed = true;
+ }
+ if((($r[0]['hubloc_flags'] & HUBLOC_FLAGS_DELETED) && (! $location['deleted']))
+ || ((! ($r[0]['hubloc_flags'] & HUBLOC_FLAGS_DELETED)) && ($location['deleted']))) {
+ $r = q("update hubloc set hubloc_flags = (hubloc_flags ^ %d), hubloc_updated = '%s' where hubloc_id = %d limit 1",
+ intval(HUBLOC_FLAGS_DELETED),
+ dbesc(datetime_convert()),
intval($r[0]['hubloc_id'])
);
+ $what = 'delete_hub ';
+ $changed = true;
}
continue;
}
- $r = q("insert into hubloc ( hubloc_guid, hubloc_guid_sig, hubloc_hash, hubloc_addr, hubloc_flags, hubloc_url, hubloc_url_sig, hubloc_host, hubloc_callback, hubloc_sitekey)
- values ( '%s','%s','%s','%s', %d ,'%s','%s','%s','%s','%s')",
+ if(! $location['sitekey']) {
+ logger('import_xchan: empty hubloc sitekey. ' . print_r($location,true));
+ continue;
+ }
+
+ if(strpos($location['address'],'/') !== false)
+ $location['address'] = substr($location['address'],0,strpos($location['address'],'/'));
+
+ // new hub claiming to be primary. Make it so.
+
+ if(intval($location['primary'])) {
+ $r = q("update hubloc set hubloc_flags = (hubloc_flags ^ %d), hubloc_updated = '%s' where hubloc_hash = '%s' and (hubloc_flags & %d )",
+ intval(HUBLOC_FLAGS_PRIMARY),
+ dbesc(datetime_convert()),
+ dbesc($xchan_hash),
+ intval(HUBLOC_FLAGS_PRIMARY)
+ );
+ }
+ logger('import_xchan: new hub: ' . $location['url']);
+ $r = q("insert into hubloc ( hubloc_guid, hubloc_guid_sig, hubloc_hash, hubloc_addr, hubloc_flags, hubloc_url, hubloc_url_sig, hubloc_host, hubloc_callback, hubloc_sitekey, hubloc_updated, hubloc_connected)
+ values ( '%s','%s','%s','%s', %d ,'%s','%s','%s','%s','%s','%s','%s')",
dbesc($arr['guid']),
dbesc($arr['guid_sig']),
dbesc($xchan_hash),
@@ -536,13 +831,74 @@ function import_xchan($arr) {
dbesc($location['url_sig']),
dbesc($location['host']),
dbesc($location['callback']),
- dbesc($location['sitekey'])
+ dbesc($location['sitekey']),
+ dbesc(datetime_convert()),
+ dbesc(datetime_convert())
);
+ $what .= 'newhub ';
+ $changed = true;
+ }
+ // get rid of any hubs we have for this channel which weren't reported.
+ if($xisting) {
+ foreach($xisting as $x) {
+ if(! array_key_exists('updated',$x)) {
+ logger('import_xchan: removing unreferenced hub location ' . $x['hubloc_url']);
+ $r = q("delete from hubloc where hubloc_id = %d limit 1",
+ intval($x['hubloc_id'])
+ );
+ $what .= 'removed_hub';
+ $changed = true;
+ }
+ }
}
}
+ // Are we a directory server of some kind?
+
+ if($dirmode != DIRECTORY_MODE_NORMAL) {
+ if(array_key_exists('profile',$arr) && is_array($arr['profile'])) {
+ $profile_changed = import_directory_profile($xchan_hash,$arr['profile'],$arr['address'],$ud_flags, 1);
+ if($profile_changed) {
+ $what .= 'profile ';
+ $changed = true;
+ }
+ }
+ else {
+ logger('import_xchan: profile not available - hiding');
+ // they may have made it private
+ $r = q("delete from xprof where xprof_hash = '%s' limit 1",
+ dbesc($xchan_hash)
+ );
+ $r = q("delete from xtag where xtag_hash = '%s' limit 1",
+ dbesc($xchan_hash)
+ );
+ }
+ }
+
+ if(array_key_exists('site',$arr) && is_array($arr['site'])) {
+ $profile_changed = import_site($arr['site'],$arr['key']);
+ if($profile_changed) {
+ $what .= 'site ';
+ $changed = true;
+ }
+ }
+
+ if($changed) {
+ $guid = random_string() . '@' . get_app()->get_hostname();
+ update_modtime($xchan_hash,$guid,$arr['address'],$ud_flags);
+ logger('import_xchan: changed: ' . $what,LOGGER_DEBUG);
+ }
+ elseif(! $ud_flags) {
+ // nothing changed but we still need to update the updates record
+ q("update updates set ud_flags = ( ud_flags | %d ) where ud_addr = '%s' and not (ud_flags & %d) ",
+ intval(UPDATE_FLAGS_UPDATED),
+ dbesc($arr['address']),
+ intval(UPDATE_FLAGS_UPDATED)
+ );
+ }
+
if(! x($ret,'message')) {
$ret['success'] = true;
$ret['hash'] = $xchan_hash;
@@ -552,6 +908,20 @@ function import_xchan($arr) {
return $ret;
}
+/**
+ * @function zot_process_response($hub,$arr,$outq) {
+ * Called immediately after sending a zot message which is using queue processing
+ * Updates the queue item according to the response result and logs any information
+ * returned to aid communications troubleshooting.
+ *
+ * @param string $hub - url of site we just contacted
+ * @param array $arr - output of z_post_url()
+ * @param array $outq - The queue structure attached to this request
+ *
+ * @returns nothing
+ */
+
+
function zot_process_response($hub,$arr,$outq) {
if(! $arr['success']) {
@@ -586,6 +956,20 @@ function zot_process_response($hub,$arr,$outq) {
logger('zot_process_response: ' . print_r($x,true), LOGGER_DATA);
}
+/**
+ * @function zot_fetch($arr)
+ *
+ * We received a notification packet (in mod/post.php) that a message is waiting for us, and we've verified the sender.
+ * Now send back a pickup message, using our message tracking ID ($arr['secret']), which we will sign with our site private key.
+ * The entire pickup message is encrypted with the remote site's public key.
+ * If everything checks out on the remote end, we will receive back a packet containing one or more messages,
+ * which will be processed and delivered before this function ultimately returns.
+ *
+ * @param array $arr
+ * decrypted and json decoded notify packet from remote site
+ */
+
+
function zot_fetch($arr) {
logger('zot_fetch: ' . print_r($arr,true), LOGGER_DATA);
@@ -594,13 +978,9 @@ function zot_fetch($arr) {
$ret_hub = zot_gethub($arr['sender']);
if(! $ret_hub) {
- logger('zot_fetch: not ret_hub');
+ logger('zot_fetch: no hub: ' . print_r($arr['sender'],true));
return;
}
-
-
- $ret_secret = json_encode(array($arr['secret'],'secret_sig' => base64url_encode(rsa_sign($arr['secret'],get_config('system','prvkey')))));
-
$data = array(
'type' => 'pickup',
@@ -611,19 +991,32 @@ function zot_fetch($arr) {
'secret_sig' => base64url_encode(rsa_sign($arr['secret'],get_config('system','prvkey')))
);
-
- $datatosend = json_encode(aes_encapsulate(json_encode($data),$ret_hub['hubloc_sitekey']));
+ $datatosend = json_encode(crypto_encapsulate(json_encode($data),$ret_hub['hubloc_sitekey']));
$fetch = zot_zot($url,$datatosend);
-
- $result = zot_import($fetch);
+ $result = zot_import($fetch, $arr['sender']['url']);
return $result;
}
+/**
+ * @function zot_import
+ *
+ * Process an incoming array of messages which were obtained via pickup, and
+ * import, update, delete as directed.
+ *
+ * @param array $arr => 'pickup' structure returned from remote site
+ * @param string $sender_url => the url specified by the sender in the initial communication
+ * we will verify the sender and url in each returned message structure and also verify
+ * that all the messages returned match the site url that we are currently processing.
+ *
+ * The message types handled here are 'activity' (e.g. posts), 'mail' , 'profile', and 'channel_sync'
+ *
+ * @returns array => array ( [0] => string $channel_hash, [1] => string $delivery_status, [2] => string $address )
+ * suitable for logging remotely, enumerating the processing results of each message/recipient combination.
+ *
+ */
-function zot_import($arr) {
-
-// logger('zot_import: ' . print_r($arr,true), LOGGER_DATA);
+function zot_import($arr, $sender_url) {
$data = json_decode($arr['body'],true);
@@ -632,14 +1025,10 @@ function zot_import($arr) {
return array();
}
-// logger('zot_import: data1: ' . print_r($data,true));
-
if(array_key_exists('iv',$data)) {
- $data = json_decode(aes_unencapsulate($data,get_config('system','prvkey')),true);
+ $data = json_decode(crypto_unencapsulate($data,get_config('system','prvkey')),true);
}
- logger('zot_import: data' . print_r($data,true), LOGGER_DATA);
-
$incoming = $data['pickup'];
$return = array();
@@ -649,11 +1038,18 @@ function zot_import($arr) {
$result = null;
if(array_key_exists('iv',$i['notify'])) {
- $i['notify'] = json_decode(aes_unencapsulate($i['notify'],get_config('system','prvkey')),true);
+ $i['notify'] = json_decode(crypto_unencapsulate($i['notify'],get_config('system','prvkey')),true);
}
logger('zot_import: notify: ' . print_r($i['notify'],true), LOGGER_DATA);
+ $hub = zot_gethub($i['notify']['sender']);
+ if((! $hub) || ($hub['hubloc_url'] != $sender_url)) {
+ logger('zot_import: potential forgery: wrong site for sender: ' . $sender_url . ' != ' . print_r($i['notify'],true));
+ continue;
+ }
+
+
$i['notify']['sender']['hash'] = base64url_encode(hash('whirlpool',$i['notify']['sender']['guid'] . $i['notify']['sender']['guid_sig'], true));
$deliveries = null;
@@ -677,25 +1073,52 @@ function zot_import($arr) {
}
else {
+ if(($i['message']) && (array_key_exists('flags',$i['message'])) && (in_array('private',$i['message']['flags']))) {
+ // This should not happen but until we can stop it...
+ logger('private message was delivered with no recipients.');
+ continue;
+ }
+
logger('public post');
// Public post. look for any site members who are or may be accepting posts from this sender
// and who are allowed to see them based on the sender's permissions
$deliveries = allowed_public_recips($i);
+
+ }
+
+ // Go through the hash array and remove duplicates. array_unique() won't do this because the array is more than one level.
+
+ $no_dups = array();
+ if($deliveries) {
+ foreach($deliveries as $d) {
+ if(! in_array($d['hash'],$no_dups))
+ $no_dups[] = $d['hash'];
+ }
+
+ if($no_dups) {
+ $deliveries = array();
+ foreach($no_dups as $n) {
+ $deliveries[] = array('hash' => $n);
+ }
+ }
}
+
if(! $deliveries) {
logger('zot_import: no deliveries on this site');
continue;
}
-
+
if($i['message']) {
if($i['message']['type'] === 'activity') {
$arr = get_item_elements($i['message']);
+
if(! array_key_exists('created',$arr)) {
logger('Activity rejected: probable failure to lookup author/owner. ' . print_r($i['message'],true));
continue;
}
+
logger('Activity received: ' . print_r($arr,true), LOGGER_DATA);
logger('Activity recipients: ' . print_r($deliveries,true), LOGGER_DATA);
@@ -722,9 +1145,20 @@ function zot_import($arr) {
$result = process_profile_delivery($i['notify']['sender'],$arr,$deliveries);
}
+ elseif($i['message']['type'] === 'channel_sync') {
+// $arr = get_channelsync_elements($i['message']);
+
+ $arr = $i['message'];
+
+ logger('Channel sync received: ' . print_r($arr,true), LOGGER_DATA);
+ logger('Channel sync recipients: ' . print_r($deliveries,true), LOGGER_DATA);
+
+ $result = process_channel_sync_delivery($i['notify']['sender'],$arr,$deliveries);
+ }
}
- if($result)
+ if($result){
$return = array_merge($return,$result);
+ }
}
}
@@ -743,14 +1177,24 @@ function zot_import($arr) {
function public_recips($msg) {
+ $check_mentions = false;
if($msg['message']['type'] === 'activity') {
+ $col = 'channel_w_stream';
+ $field = PERMS_W_STREAM;
if(array_key_exists('flags',$msg['message']) && in_array('thread_parent', $msg['message']['flags'])) {
- $col = 'channel_w_stream';
- $field = PERMS_W_STREAM;
+ // check mention recipient permissions on top level posts only
+ $check_mentions = true;
}
else {
- $col = 'channel_w_comment';
- $field = PERMS_W_COMMENT;
+ // if this is a comment and it wasn't sent by the post owner, check to see who is allowing them to comment.
+ // We should have one specific recipient and this step shouldn't be needed unless somebody stuffed up their software.
+ // We may need this step to protect us from bad guys intentionally stuffing up their software.
+ // If it is sent by the post owner, we don't need to do this. We only need to see who is receiving the
+ // owner's stream (which was already set above) - as they control the comment permissions
+ if($msg['notify']['sender']['guid_sig'] != $msg['message']['owner']['guid_sig']) {
+ $col = 'channel_w_comment';
+ $field = PERMS_W_COMMENT;
+ }
}
}
elseif($msg['message']['type'] === 'mail') {
@@ -761,18 +1205,22 @@ function public_recips($msg) {
if(! $col)
return NULL;
+
if($msg['notify']['sender']['url'] === z_root())
- $sql = " where (( " . $col . " & " . PERMS_NETWORK . " ) or ( " . $col . " & " . PERMS_SITE . " )) ";
+ $sql = " where (( " . $col . " & " . PERMS_NETWORK . " ) or ( " . $col . " & " . PERMS_SITE . " ) or ( " . $col . " & " . PERMS_PUBLIC . ")) ";
else
- $sql = " where ( " . $col . " & " . PERMS_NETWORK . " ) " ;
+ $sql = " where (( " . $col . " & " . PERMS_NETWORK . " ) or ( " . $col . " & " . PERMS_PUBLIC . ")) ";
- $r = q("select channel_hash as hash from channel " . $sql );
+
+ $r = q("select channel_hash as hash from channel $sql or channel_hash = '%s' ",
+ dbesc($msg['notify']['sender']['hash'])
+ );
if(! $r)
$r = array();
$x = q("select channel_hash as hash from channel left join abook on abook_channel = channel_id where abook_xchan = '%s'
- and (( " . $col . " & " . PERMS_SPECIFIC . " ) OR ( " . $col . " & " . PERMS_CONTACTS . " )) and ( abook_my_perms & " . $field . " ) ",
+ and (( " . $col . " & " . PERMS_SPECIFIC . " ) and ( abook_my_perms & " . $field . " )) OR ( " . $col . " & " . PERMS_CONTACTS . " ) ",
dbesc($msg['notify']['sender']['hash'])
);
@@ -781,6 +1229,27 @@ function public_recips($msg) {
$r = array_merge($r,$x);
+ // look for any public mentions on this site
+ // They will get filtered by tgroup_check() so we don't need to check permissions now
+
+ if($check_mentions && $msg['message']['tags']) {
+ if(is_array($msg['message']['tags']) && $msg['message']['tags']) {
+ foreach($msg['message']['tags'] as $tag) {
+ if(($tag['type'] === 'mention') && (strpos($tag['url'],z_root()) !== false)) {
+ $address = basename($tag['url']);
+ if($address) {
+ $z = q("select channel_hash as hash from channel where channel_address = '%s' limit 1",
+ dbesc($address)
+ );
+ if($z)
+ $r = array_merge($r,$z);
+ }
+ }
+ }
+ }
+ }
+
+ logger('public_recips: ' . print_r($r,true), LOGGER_DATA);
return $r;
}
@@ -832,7 +1301,7 @@ function allowed_public_recips($msg) {
$condensed_recips[] = $rr['hash'];
$results = array();
- $r = q("select channel_hash as hash from channel left join abook on abook_channel = channel_id where abook_hash = '%s' ",
+ $r = q("select channel_hash as hash from channel left join abook on abook_channel = channel_id where abook_xchan = '%s' ",
dbesc($hash)
);
if($r) {
@@ -850,6 +1319,14 @@ function allowed_public_recips($msg) {
function process_delivery($sender,$arr,$deliveries,$relay) {
$result = array();
+
+
+ // We've validated the sender. Now make sure that the sender is the owner or author
+
+ if($sender['hash'] != $arr['owner_xchan'] && $sender['hash'] != $arr['author_xchan']) {
+ logger('process_delivery: sender is not owner or author');
+ return;
+ }
foreach($deliveries as $d) {
$r = q("select * from channel where channel_hash = '%s' limit 1",
@@ -857,50 +1334,70 @@ function process_delivery($sender,$arr,$deliveries,$relay) {
);
if(! $r) {
- $result[] = array($d['hash'],'not found');
+ $result[] = array($d['hash'],'recipients not found');
continue;
}
$channel = $r[0];
- $perm = (($arr['uri'] == $arr['parent_uri']) ? 'send_stream' : 'post_comments');
+ $tag_delivery = tgroup_check($channel['channel_id'],$arr);
+
+ $perm = (($arr['mid'] == $arr['parent_mid']) ? 'send_stream' : 'post_comments');
+
+ // This is our own post, possibly coming from a channel clone
+
+ if($arr['owner_xchan'] == $d['hash']) {
+ $arr['item_flags'] = $arr['item_flags'] | ITEM_WALL;
+ }
+ else {
+ // clear the wall flag if it is set
+ if($arr['item_flags'] & ITEM_WALL) {
+ $arr['item_flags'] = ($arr['item_flags'] ^ ITEM_WALL);
+ }
+ }
- if(! perm_is_allowed($channel['channel_id'],$sender['hash'],$perm)) {
+ if((! perm_is_allowed($channel['channel_id'],$sender['hash'],$perm)) && (! $tag_delivery)) {
logger("permission denied for delivery {$channel['channel_id']}");
- $result[] = array($d['hash'],'permission denied');
+ $result[] = array($d['hash'],'permission denied',$channel['channel_name'] . ' <' . $channel['channel_address'] . '@' . get_app()->get_hostname() . '>');
continue;
}
if($arr['item_restrict'] & ITEM_DELETED) {
+
+ // remove_community_tag is a no-op if this isn't a community tag activity
+ remove_community_tag($sender,$arr,$channel['channel_id']);
+
+
+
$item_id = delete_imported_item($sender,$arr,$channel['channel_id']);
- $result[] = array($d['hash'],'deleted');
+ $result[] = array($d['hash'],(($item_id) ? 'deleted' : 'delete_failed'),$channel['channel_name'] . ' <' . $channel['channel_address'] . '@' . get_app()->get_hostname() . '>');
if($relay && $item_id) {
logger('process_delivery: invoking relay');
proc_run('php','include/notifier.php','relay',intval($item_id));
- $result[] = array($d['hash'],'relayed');
+ $result[] = array($d['hash'],'relayed',$channel['channel_name'] . ' <' . $channel['channel_address'] . '@' . get_app()->get_hostname() . '>');
}
continue;
}
- // for events, extract the event info and create and event linked to an item
+ // for events, extract the event info and create an event linked to an item
if((x($arr,'obj_type')) && (activity_match($arr['obj_type'],ACTIVITY_OBJ_EVENT))) {
require_once('include/event.php');
$ev = bbtoevent($arr['body']);
- if(x($ev,'desc') && x($ev,'start')) {
+ if(x($ev,'desc') && x($ev,'start')) {
$ev['event_xchan'] = $arr['author_xchan'];
$ev['uid'] = $channel['channel_id'];
$ev['account'] = $channel['channel_account_id'];
$ev['edited'] = $arr['edited'];
- $ev['uri'] = $arr['uri'];
+ $ev['mid'] = $arr['mid'];
$ev['private'] = $arr['item_private'];
// is this an edit?
- $r = q("SELECT resource_id FROM item where uri = '%s' and uid = %d and resource_type = 'event' limit 1",
- dbesc($arr['uri']),
+ $r = q("SELECT resource_id FROM item where mid = '%s' and uid = %d and resource_type = 'event' limit 1",
+ dbesc($arr['mid']),
intval($channel['channel_id'])
);
if($r) {
@@ -909,34 +1406,38 @@ function process_delivery($sender,$arr,$deliveries,$relay) {
$xyz = event_store($ev);
- $result = array($d['hash'],'event processed');
+ $result = array($d['hash'],'event processed',$channel['channel_name'] . ' <' . $channel['channel_address'] . '@' . get_app()->get_hostname() . '>');
continue;
}
}
- $r = q("select id, edited from item where uri = '%s' and uid = %d limit 1",
- dbesc($arr['uri']),
+ $r = q("select id, edited from item where mid = '%s' and uid = %d limit 1",
+ dbesc($arr['mid']),
intval($channel['channel_id'])
);
if($r) {
- if($arr['edited'] > $r[0]['edited'])
+ if($arr['edited'] > $r[0]['edited']) {
+ $arr['id'] = $r[0]['id'];
+ $arr['uid'] = $channel['channel_id'];
update_imported_item($sender,$arr,$channel['channel_id']);
- $result[] = array($d['hash'],'updated');
+ }
+ $result[] = array($d['hash'],'updated',$channel['channel_name'] . ' <' . $channel['channel_address'] . '@' . get_app()->get_hostname() . '>');
$item_id = $r[0]['id'];
}
else {
$arr['aid'] = $channel['channel_account_id'];
$arr['uid'] = $channel['channel_id'];
- $item_id = item_store($arr);
- $result[] = array($d['hash'],'posted');
+ $item_result = item_store($arr);
+ $item_id = $item_result['item_id'];
+ $result[] = array($d['hash'],(($item_id) ? 'posted' : 'storage failed:' . $item_result['message']),$channel['channel_name'] . ' <' . $channel['channel_address'] . '@' . get_app()->get_hostname() . '>');
}
if($relay && $item_id) {
logger('process_delivery: invoking relay');
proc_run('php','include/notifier.php','relay',intval($item_id));
- $result[] = array($d['hash'],'relayed');
+ $result[] = array($d['hash'],'relayed',$channel['channel_name'] . ' <' . $channel['channel_address'] . '@' . get_app()->get_hostname() . '>');
}
}
@@ -949,9 +1450,75 @@ function process_delivery($sender,$arr,$deliveries,$relay) {
}
+function remove_community_tag($sender,$arr,$uid) {
+
+ if(! (activity_match($arr['verb'],ACTIVITY_TAG) && ($arr['obj_type'] == ACTIVITY_OBJ_TAGTERM)))
+ return;
+
+ logger('remove_community_tag: invoked');
+
+
+ if(! get_pconfig($uid,'system','blocktags')) {
+ logger('remove_community tag: permission denied.');
+ return;
+ }
+
+ $r = q("select * from item where mid = '%s' and uid = %d limit 1",
+ dbesc($arr['mid']),
+ intval($uid)
+ );
+ if(! $r) {
+ logger('remove_community_tag: no item');
+ return;
+ }
+
+ if(($sender['hash'] != $r[0]['owner_xchan']) && ($sender['hash'] != $r[0]['author_xchan'])) {
+ logger('remove_community_tag: sender not authorised.');
+ return;
+ }
+
+ $i = $r[0];
+
+ if($i['target'])
+ $i['target'] = json_decode_plus($i['target']);
+ if($i['object'])
+ $i['object'] = json_decode_plus($i['object']);
+
+ if(! ($i['target'] && $i['object'])) {
+ logger('remove_community_tag: no target/object');
+ return;
+ }
+
+ $message_id = $i['target']['id'];
+
+ $r = q("select id from item where mid = '%s' and uid = %d limit 1",
+ dbesc($message_id),
+ intval($uid)
+ );
+ if(! $r) {
+ logger('remove_community_tag: no parent message');
+ return;
+ }
+
+ $x = q("delete from term where uid = %d and oid = %d and otype = %d and type = %d and term = '%s' and url = '%s' limit 1",
+ intval($uid),
+ intval($r[0]['id']),
+ intval(TERM_OBJ_POST),
+ intval(TERM_HASHTAG),
+ dbesc($i['object']['title']),
+ dbesc(get_rel_link($i['object']['link'],'alternate'))
+ );
+
+ return;
+}
+
function update_imported_item($sender,$item,$uid) {
-// FIXME
- logger('update_imported_item');
+
+ $x = item_store_update($item);
+ if(! $x['item_id'])
+ logger('update_imported_item: failed: ' . $x['message']);
+ else
+ logger('update_imported_item');
}
@@ -959,11 +1526,12 @@ function delete_imported_item($sender,$item,$uid) {
logger('delete_imported_item invoked',LOGGER_DEBUG);
- $r = q("select id from item where ( author_xchan = '%s' or owner_xchan = '%s' )
- and uri = '%s' and uid = %d limit 1",
+ $r = q("select id, item_restrict from item where ( author_xchan = '%s' or owner_xchan = '%s' or source_xchan = '%s' )
+ and mid = '%s' and uid = %d limit 1",
+ dbesc($sender['hash']),
dbesc($sender['hash']),
dbesc($sender['hash']),
- dbesc($item['uri']),
+ dbesc($item['mid']),
intval($uid)
);
@@ -971,44 +1539,79 @@ function delete_imported_item($sender,$item,$uid) {
logger('delete_imported_item: failed: ownership issue');
return false;
}
+
+ if($r[0]['item_restrict'] & ITEM_DELETED) {
+ logger('delete_imported_item: item was already deleted');
+ return false;
+ }
require_once('include/items.php');
drop_item($r[0]['id'],false);
+
+ tag_deliver($uid,$r[0]['id']);
+
return $r[0]['id'];
}
function process_mail_delivery($sender,$arr,$deliveries) {
+
+
+ $result = array();
+
+
+ if($sender['hash'] != $arr['from_xchan']) {
+ logger('process_mail_delivery: sender is not mail author');
+ return;
+ }
+
+
foreach($deliveries as $d) {
$r = q("select * from channel where channel_hash = '%s' limit 1",
dbesc($d['hash'])
);
- if(! $r)
+ if(! $r) {
+ $result[] = array($d['hash'],'not found');
continue;
+ }
$channel = $r[0];
if(! perm_is_allowed($channel['channel_id'],$sender['hash'],'post_mail')) {
logger("permission denied for mail delivery {$channel['channel_id']}");
+ $result[] = array($d['hash'],'permission denied',$channel['channel_name']);
continue;
}
- $r = q("select id from mail where uri = '%s' and channel_id = %d limit 1",
- dbesc($arr['uri']),
+ $r = q("select id from mail where mid = '%s' and channel_id = %d limit 1",
+ dbesc($arr['mid']),
intval($channel['channel_id'])
);
if($r) {
- logger('duplicate mail received');
+ if($arr['mail_flags'] & MAIL_RECALLED) {
+ $x = q("delete from mail where id = %d and channel_id = %d limit 1",
+ intval($r[0]['id']),
+ intval($channel['channel_id'])
+ );
+ $result[] = array($d['hash'],'mail recalled',$channel['channel_name']);
+ logger('mail_recalled');
+ }
+ else {
+ $result[] = array($d['hash'],'duplicate mail received',$channel['channel_name']);
+ logger('duplicate mail received');
+ }
continue;
}
else {
$arr['account_id'] = $channel['channel_account_id'];
$arr['channel_id'] = $channel['channel_id'];
$item_id = mail_store($arr);
+ $result[] = array($d['hash'],'mail delivered',$channel['channel_name']);
}
}
+ return $result;
}
function process_profile_delivery($sender,$arr,$deliveries) {
@@ -1016,74 +1619,125 @@ function process_profile_delivery($sender,$arr,$deliveries) {
// deliveries is irrelevant, what to do about birthday notification....?
logger('process_profile_delivery', LOGGER_DEBUG);
- import_directory_profile($sender['hash'],$arr);
+
+ $r = q("select xchan_addr from xchan where xchan_hash = '%s' limit 1",
+ dbesc($sender['hash'])
+ );
+ if($r)
+ import_directory_profile($sender['hash'],$arr,$r[0]['xchan_addr'], 1, 0);
}
-function import_directory_profile($hash,$profile) {
+
+/*
+ * @function import_directory_profile
+ *
+ * @returns boolean $updated if something changed
+ *
+ */
+
+function import_directory_profile($hash,$profile,$addr,$ud_flags = 1, $suppress_update = 0) {
logger('import_directory_profile', LOGGER_DEBUG);
if(! $hash)
- return;
+ return false;
$arr = array();
$arr['xprof_hash'] = $hash;
- $arr['xprof_desc'] = (($profile['description']) ? htmlentities($profile['description'], ENT_COMPAT,'UTF-8',false) : '');
+ $arr['xprof_desc'] = (($profile['description']) ? htmlspecialchars($profile['description'], ENT_COMPAT,'UTF-8',false) : '');
$arr['xprof_dob'] = datetime_convert('','',$profile['birthday'],'Y-m-d'); // !!!! check this for 0000 year
- $arr['xprof_gender'] = (($profile['gender']) ? htmlentities($profile['gender'], ENT_COMPAT,'UTF-8',false) : '');
- $arr['xprof_marital'] = (($profile['marital']) ? htmlentities($profile['marital'], ENT_COMPAT,'UTF-8',false) : '');
- $arr['xprof_sexual'] = (($profile['sexual']) ? htmlentities($profile['sexual'], ENT_COMPAT,'UTF-8',false) : '');
- $arr['xprof_locale'] = (($profile['locale']) ? htmlentities($profile['locale'], ENT_COMPAT,'UTF-8',false) : '');
- $arr['xprof_region'] = (($profile['region']) ? htmlentities($profile['region'], ENT_COMPAT,'UTF-8',false) : '');
- $arr['xprof_postcode'] = (($profile['postcode']) ? htmlentities($profile['postcode'], ENT_COMPAT,'UTF-8',false) : '');
- $arr['xprof_country'] = (($profile['country']) ? htmlentities($profile['country'], ENT_COMPAT,'UTF-8',false) : '');
+ $arr['xprof_age'] = (($profile['age']) ? intval($profile['age']) : 0);
+ $arr['xprof_gender'] = (($profile['gender']) ? htmlspecialchars($profile['gender'], ENT_COMPAT,'UTF-8',false) : '');
+ $arr['xprof_marital'] = (($profile['marital']) ? htmlspecialchars($profile['marital'], ENT_COMPAT,'UTF-8',false) : '');
+ $arr['xprof_sexual'] = (($profile['sexual']) ? htmlspecialchars($profile['sexual'], ENT_COMPAT,'UTF-8',false) : '');
+ $arr['xprof_locale'] = (($profile['locale']) ? htmlspecialchars($profile['locale'], ENT_COMPAT,'UTF-8',false) : '');
+ $arr['xprof_region'] = (($profile['region']) ? htmlspecialchars($profile['region'], ENT_COMPAT,'UTF-8',false) : '');
+ $arr['xprof_postcode'] = (($profile['postcode']) ? htmlspecialchars($profile['postcode'], ENT_COMPAT,'UTF-8',false) : '');
+ $arr['xprof_country'] = (($profile['country']) ? htmlspecialchars($profile['country'], ENT_COMPAT,'UTF-8',false) : '');
+
+ $arr['xprof_about'] = (($profile['about']) ? htmlspecialchars($profile['about'], ENT_COMPAT,'UTF-8',false) : '');
+ $arr['xprof_homepage'] = (($profile['homepage']) ? htmlspecialchars($profile['homepage'], ENT_COMPAT,'UTF-8',false) : '');
+ $arr['xprof_hometown'] = (($profile['hometown']) ? htmlspecialchars($profile['hometown'], ENT_COMPAT,'UTF-8',false) : '');
$clean = array();
if(array_key_exists('keywords',$profile) and is_array($profile['keywords'])) {
import_directory_keywords($hash,$profile['keywords']);
foreach($profile['keywords'] as $kw) {
- $kw = trim(htmlentities($kw,ENT_COMPAT,'UTF-8',false));
+ $kw = trim(htmlspecialchars($kw,ENT_COMPAT,'UTF-8',false));
+ $kw = trim($kw,',');
+ $clean[] = $kw;
}
- $clean[] = $kw;
}
$arr['xprof_keywords'] = implode(' ',$clean);
+ // Self censored, make it so
+ // These are not translated, so the German "erwachsenen" keyword will not censor the directory profile. Only the English form - "adult".
+
+
+ if(in_arrayi('nsfw',$clean) || in_arrayi('adult',$clean)) {
+ q("update xchan set xchan_flags = (xchan_flags | %d) where xchan_hash = '%s' limit 1",
+ intval(XCHAN_FLAGS_SELFCENSORED),
+ dbesc($hash)
+ );
+ }
+
$r = q("select * from xprof where xprof_hash = '%s' limit 1",
dbesc($hash)
);
if($r) {
- $x = q("update xprof set
- xprof_desc = '%s',
- xprof_dob = '%s',
- xprof_gender = '%s',
- xprof_marital = '%s',
- xprof_sexual = '%s',
- xprof_locale = '%s',
- xprof_region = '%s',
- xprof_postcode = '%s',
- xprof_country = '%s',
- xprof_keywords = '%s'
- where xprof_hash = '%s' limit 1",
- dbesc($arr['xprof_desc']),
- dbesc($arr['xprof_dob']),
- dbesc($arr['xprof_gender']),
- dbesc($arr['xprof_marital']),
- dbesc($arr['xprof_sexual']),
- dbesc($arr['xprof_locale']),
- dbesc($arr['xprof_region']),
- dbesc($arr['xprof_postcode']),
- dbesc($arr['xprof_country']),
- dbesc($arr['xprof_keywords']),
- dbesc($arr['xprof_hash'])
- );
+ $update = false;
+ foreach($r[0] as $k => $v) {
+ if((array_key_exists($k,$arr)) && ($arr[$k] != $v)) {
+ logger('import_directory_profile: update' . $k . ' => ' . $arr[$k]);
+ $update = true;
+ break;
+ }
+ }
+ if($update) {
+ $x = q("update xprof set
+ xprof_desc = '%s',
+ xprof_dob = '%s',
+ xprof_age = %d,
+ xprof_gender = '%s',
+ xprof_marital = '%s',
+ xprof_sexual = '%s',
+ xprof_locale = '%s',
+ xprof_region = '%s',
+ xprof_postcode = '%s',
+ xprof_country = '%s',
+ xprof_about = '%s',
+ xprof_homepage = '%s',
+ xprof_hometown = '%s',
+ xprof_keywords = '%s'
+ where xprof_hash = '%s' limit 1",
+ dbesc($arr['xprof_desc']),
+ dbesc($arr['xprof_dob']),
+ intval($arr['xprof_age']),
+ dbesc($arr['xprof_gender']),
+ dbesc($arr['xprof_marital']),
+ dbesc($arr['xprof_sexual']),
+ dbesc($arr['xprof_locale']),
+ dbesc($arr['xprof_region']),
+ dbesc($arr['xprof_postcode']),
+ dbesc($arr['xprof_country']),
+ dbesc($arr['xprof_about']),
+ dbesc($arr['xprof_homepage']),
+ dbesc($arr['xprof_hometown']),
+ dbesc($arr['xprof_keywords']),
+ dbesc($arr['xprof_hash'])
+ );
+ }
}
else {
- $x = q("insert into xprof (xprof_hash, xprof_desc, xprof_dob, xprof_gender, xprof_marital, xprof_sexual, xprof_locale, xprof_region, xprof_postcode, xprof_country, xprof_keywords) values ('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s') ",
+ $update = true;
+ logger('import_directory_profile: new profile');
+ $x = q("insert into xprof (xprof_hash, xprof_desc, xprof_dob, xprof_age, xprof_gender, xprof_marital, xprof_sexual, xprof_locale, xprof_region, xprof_postcode, xprof_country, xprof_about, xprof_homepage, xprof_hometown, xprof_keywords) values ('%s', '%s', '%s', %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s') ",
dbesc($arr['xprof_hash']),
dbesc($arr['xprof_desc']),
dbesc($arr['xprof_dob']),
+ intval($arr['xprof_age']),
dbesc($arr['xprof_gender']),
dbesc($arr['xprof_marital']),
dbesc($arr['xprof_sexual']),
@@ -1091,11 +1745,19 @@ function import_directory_profile($hash,$profile) {
dbesc($arr['xprof_region']),
dbesc($arr['xprof_postcode']),
dbesc($arr['xprof_country']),
+ dbesc($arr['xprof_about']),
+ dbesc($arr['xprof_homepage']),
+ dbesc($arr['xprof_hometown']),
dbesc($arr['xprof_keywords'])
);
}
- return;
+ $d = array('xprof' => $arr, 'profile' => $profile, 'update' => $update);
+ call_hooks('import_directory_profile', $d);
+
+ if(($d['update']) && (! $suppress_update))
+ update_modtime($arr['xprof_hash'],random_string() . '@' . get_app()->get_hostname(), $addr, $ud_flags);
+ return $d['update'];
}
function import_directory_keywords($hash,$keywords) {
@@ -1112,7 +1774,8 @@ function import_directory_keywords($hash,$keywords) {
$clean = array();
foreach($keywords as $kw) {
- $kw = trim(htmlentities($kw,ENT_COMPAT,'UTF-8',false));
+ $kw = trim(htmlspecialchars($kw,ENT_COMPAT,'UTF-8',false));
+ $kw = trim($kw,',');
$clean[] = $kw;
}
@@ -1125,9 +1788,383 @@ function import_directory_keywords($hash,$keywords) {
}
foreach($clean as $x) {
if(! in_array($x,$existing))
- $r = q("insert int xtag ( xtag_hash, xtag_term) values ( '%s' ,'%s' )",
+ $r = q("insert into xtag ( xtag_hash, xtag_term) values ( '%s' ,'%s' )",
dbesc($hash),
dbesc($x)
);
}
-} \ No newline at end of file
+}
+
+
+function update_modtime($hash,$guid,$addr,$flags = 0) {
+
+ $dirmode = intval(get_config('system','directory_mode'));
+
+ if($dirmode == DIRECTORY_MODE_NORMAL)
+ return;
+
+ if($flags) {
+ q("insert into updates (ud_hash, ud_guid, ud_date, ud_flags, ud_addr ) values ( '%s', '%s', '%s', %d, '%s' )",
+ dbesc($hash),
+ dbesc($guid),
+ dbesc(datetime_convert()),
+ intval($flags),
+ dbesc($addr)
+ );
+ }
+ else {
+ q("update updates set ud_flags = ( ud_flags | %d ) where ud_addr = '%s' and not (ud_flags & %d) ",
+ intval(UPDATE_FLAGS_UPDATED),
+ dbesc($addr),
+ intval(UPDATE_FLAGS_UPDATED)
+ );
+ }
+}
+
+
+function import_site($arr,$pubkey) {
+ if( (! is_array($arr)) || (! $arr['url']) || (! $arr['url_sig']))
+ return false;
+
+ if(! rsa_verify($arr['url'],base64url_decode($arr['url_sig']),$pubkey)) {
+ logger('import_site: bad url_sig');
+ return false;
+ }
+
+ $update = false;
+ $exists = false;
+
+ $r = q("select * from site where site_url = '%s' limit 1",
+ dbesc($arr['url'])
+ );
+ if($r) {
+ $exists = true;
+ $siterecord = $r[0];
+ }
+
+ $site_directory = 0;
+ if($arr['directory_mode'] == 'normal')
+ $site_directory = DIRECTORY_MODE_NORMAL;
+
+ if($arr['directory_mode'] == 'primary')
+ $site_directory = DIRECTORY_MODE_PRIMARY;
+ if($arr['directory_mode'] == 'secondary')
+ $site_directory = DIRECTORY_MODE_SECONDARY;
+ if($arr['directory_mode'] == 'standalone')
+ $site_directory = DIRECTORY_MODE_STANDALONE;
+
+ $register_policy = 0;
+ if($arr['register_policy'] == 'closed')
+ $register_policy = REGISTER_CLOSED;
+ if($arr['register_policy'] == 'open')
+ $register_policy = REGISTER_OPEN;
+ if($arr['register_policy'] == 'approve')
+ $register_policy = REGISTER_APPROVE;
+
+ $access_policy = 0;
+ if(array_key_exists('access_policy',$arr)) {
+ if($arr['access_policy'] === 'private')
+ $access_policy = ACCESS_PRIVATE;
+ if($arr['access_policy'] === 'paid')
+ $access_policy = ACCESS_PAID;
+ if($arr['access_policy'] === 'free')
+ $access_policy = ACCESS_FREE;
+ if($arr['access_policy'] === 'tiered')
+ $access_policy = ACCESS_TIERED;
+ }
+
+ $directory_url = htmlspecialchars($arr['directory_url'],ENT_COMPAT,'UTF-8',false);
+ $url = htmlspecialchars($arr['url'],ENT_COMPAT,'UTF-8',false);
+ $sellpage = htmlspecialchars($arr['sellpage'],ENT_COMPAT,'UTF-8',false);
+ $site_location = htmlspecialchars($arr['location'],ENT_COMPAT,'UTF-8',false);
+
+ if($exists) {
+ if(($siterecord['site_flags'] != $site_directory)
+ || ($siterecord['site_access'] != $access_policy)
+ || ($siterecord['site_directory'] != $directory_url)
+ || ($siterecord['site_sellpage'] != $sellpage)
+ || ($siterecord['site_location'] != $site_location)
+ || ($siterecord['site_register'] != $register_policy)) {
+ $update = true;
+
+// logger('import_site: input: ' . print_r($arr,true));
+// logger('import_site: stored: ' . print_r($siterecord,true));
+
+ $r = q("update site set site_location = '%s', site_flags = %d, site_access = %d, site_directory = '%s', site_register = %d, site_update = '%s', site_sellpage = '%s'
+ where site_url = '%s' limit 1",
+ dbesc($site_location),
+ intval($site_directory),
+ intval($access_policy),
+ dbesc($directory_url),
+ intval($register_policy),
+ dbesc(datetime_convert()),
+ dbesc($sellpage),
+ dbesc($url)
+ );
+ if(! $r) {
+ logger('import_site: update failed. ' . print_r($arr,true));
+ }
+ }
+ }
+ else {
+ $update = true;
+ $r = q("insert into site ( site_location, site_url, site_access, site_flags, site_update, site_directory, site_register, site_sellpage )
+ values ( '%s', '%s', %d, %d, '%s', '%s', %d, '%s' )",
+ dbesc($site_location),
+ dbesc($url),
+ intval($access_policy),
+ intval($site_directory),
+ dbesc(datetime_convert()),
+ dbesc($directory_url),
+ intval($register_policy),
+ dbesc($sellpage)
+ );
+ if(! $r) {
+ logger('import_site: record create failed. ' . print_r($arr,true));
+ }
+ }
+
+ return $update;
+
+}
+
+
+
+/**
+ * Send a zot packet to all hubs where this channel is duplicated, refreshing
+ * such things as personal settings, channel permissions, address book updates, etc.
+ */
+
+function build_sync_packet($uid = 0, $packet = null) {
+
+ $a = get_app();
+
+ logger('build_sync_packet');
+
+ if(! $uid)
+ $uid = local_user();
+
+ if(! $uid)
+ return;
+
+ $r = q("select * from channel where channel_id = %d limit 1",
+ intval($uid)
+ );
+ if(! $r)
+ return;
+
+ $channel = $r[0];
+
+ $h = q("select * from hubloc where hubloc_hash = '%s'",
+ dbesc($channel['channel_hash'])
+ );
+
+ if(! $h)
+ return;
+
+ $synchubs = array();
+
+ foreach($h as $x) {
+ if($x['hubloc_host'] == $a->get_hostname())
+ continue;
+ $synchubs[] = $x;
+ }
+
+ if(! $synchubs)
+ return;
+
+ $r = q("select xchan_guid, xchan_guid_sig from xchan where xchan_hash = '%s' limit 1",
+ dbesc($channel['channel_hash'])
+ );
+ if(! $r)
+ return;
+
+ $env_recips = array();
+ $env_recips[] = array('guid' => $r[0]['xchan_guid'],'guid_sig' => $r[0]['xchan_guid_sig']);
+
+ $info = (($packet) ? $packet : array());
+ $info['type'] = 'channel_sync';
+
+ if(array_key_exists($uid,$a->config) && array_key_exists('transient',$a->config[$uid])) {
+ $settings = $a->config[$uid]['transient'];
+ if($settings) {
+ $info['config'] = $settings;
+ }
+ }
+
+ if($channel) {
+ $info['channel'] = array();
+ foreach($channel as $k => $v) {
+
+ // filter out any joined tables like xchan
+
+ if(strpos($k,'channel_') !== 0)
+ continue;
+
+ // don't pass these elements, they should not be synchronised
+
+ $disallowed = array('channel_id','channel_account_id','channel_primary','channel_prvkey','channel_address');
+
+ if(in_array($k,$disallowed))
+ continue;
+
+ $info['channel'][$k] = $v;
+ }
+ }
+
+ $interval = ((get_config('system','delivery_interval') !== false)
+ ? intval(get_config('system','delivery_interval')) : 2 );
+
+
+ logger('build_sync_packet: packet: ' . print_r($info,true), LOGGER_DATA);
+
+ foreach($synchubs as $hub) {
+ $hash = random_string();
+ $n = zot_build_packet($channel,'notify',$env_recips,$hub['hubloc_sitekey'],$hash);
+ q("insert into outq ( outq_hash, outq_account, outq_channel, outq_posturl, outq_async, outq_created, outq_updated, outq_notify, outq_msg ) values ( '%s', %d, %d, '%s', %d, '%s', '%s', '%s', '%s' )",
+ dbesc($hash),
+ intval($channel['channel_account']),
+ intval($channel['channel_id']),
+ dbesc($hub['hubloc_callback']),
+ intval(1),
+ dbesc(datetime_convert()),
+ dbesc(datetime_convert()),
+ dbesc($n),
+ dbesc(json_encode($info))
+ );
+
+ proc_run('php','include/deliver.php',$hash);
+ if($interval)
+ @time_sleep_until(microtime(true) + (float) $interval);
+ }
+
+
+}
+
+function process_channel_sync_delivery($sender,$arr,$deliveries) {
+
+// FIXME - this will sync red structures (channel, pconfig and abook). Eventually we need to make this application agnostic.
+// TODO: missing group membership changes
+
+ $result = array();
+
+ foreach($deliveries as $d) {
+ $r = q("select * from channel where channel_hash = '%s' limit 1",
+ dbesc($d['hash'])
+ );
+
+ if(! $r) {
+ $result[] = array($d['hash'],'not found');
+ continue;
+ }
+
+ $channel = $r[0];
+
+ if($channel['channel_hash'] != $sender['hash']) {
+ logger('process_channel_sync_delivery: possible forgery. Sender ' . $sender['hash'] . ' is not ' . $channel['channel_hash']);
+ $result[] = array($d['hash'],'channel mismatch',$channel['channel_name']);
+ continue;
+ }
+
+ if(array_key_exists('config',$arr) && is_array($arr['config']) && count($arr['config'])) {
+ foreach($arr['config'] as $cat => $k) {
+ foreach($arr['config'][$cat] as $k => $v)
+ set_pconfig($channel['channel_id'],$cat,$k,$v);
+ }
+ }
+
+ if(array_key_exists('channel',$arr) && is_array($arr['channel']) && count($arr['channel'])) {
+ $disallowed = array('channel_id','channel_account_id','channel_primary','channel_prvkey', 'channel_address');
+
+ $clean = array();
+ foreach($arr['channel'] as $k => $v) {
+ if(in_array($k,$disallowed))
+ continue;
+ $clean[$k] = $v;
+ }
+ if(count($clean)) {
+ foreach($clean as $k => $v) {
+ $r = dbq("UPDATE channel set " . dbesc($k) . " = '" . dbesc($v)
+ . "' where channel_id = " . intval($channel['channel_id']) . " limit 1");
+ }
+ }
+ }
+
+
+ if(array_key_exists('abook',$arr) && is_array($arr['abook']) && count($arr['abook'])) {
+
+ $disallowed = array('abook_id','abook_account','abook_channel');
+
+ $clean = array();
+ foreach($arr['abook'] as $abook) {
+ foreach($abook as $k => $v) {
+ if(in_array($k,$disallowed) || (strpos($k,'abook') !== 0))
+ continue;
+ $clean[$k] = $v;
+ }
+
+ if(! array_key_exists('abook_xchan',$clean))
+ continue;
+
+ $r = q("select * from abook where abook_xchan = '%s' and abook_channel = %d limit 1",
+ dbesc($clean['abook_xchan']),
+ intval($channel['channel_id'])
+ );
+
+ // make sure we have an abook entry for this xchan on this system
+
+ if(! $r) {
+ q("insert into abook ( abook_xchan, abook_channel ) values ('%s', %d ) ",
+ dbesc($clean['abook_xchan']),
+ intval($channel['channel_id'])
+ );
+ }
+
+ if(count($clean)) {
+ foreach($clean as $k => $v) {
+ $r = dbq("UPDATE abook set " . dbesc($k) . " = '" . dbesc($v)
+ . "' where abook_xchan = '" . dbesc($clean['abook_xchan']) . "' and abook_channel = " . intval($channel['channel_id'])
+ . " limit 1");
+ }
+ }
+ }
+ }
+
+ $result[] = array($d['hash'],'channel sync updated',$channel['channel_name']);
+
+
+ }
+ return $result;
+}
+
+// We probably should make rpost discoverable.
+
+function get_rpost_path($observer) {
+ if(! $observer)
+ return '';
+ $parsed = parse_url($observer['xchan_url']);
+ return $parsed['scheme'] . '://' . $parsed['host'] . (($parsed['port']) ? ':' . $parsed['port'] : '') . '/rpost?f=';
+
+}
+
+function import_author_zot($x) {
+ $hash = base64url_encode(hash('whirlpool',$x['guid'] . $x['guid_sig'], true));
+ $r = q("select hubloc_url from hubloc where hubloc_guid = '%s' and hubloc_guid_sig = '%s' and (hubloc_flags & %d) limit 1",
+ dbesc($x['guid']),
+ dbesc($x['guid_sig']),
+ intval(HUBLOC_FLAGS_PRIMARY)
+ );
+
+ if($r) {
+ logger('import_author_zot: in cache', LOGGER_DEBUG);
+ return $hash;
+ }
+
+ logger('import_author_zot: entry not in cache - probing: ' . print_r($x,true), LOGGER_DEBUG);
+
+ $them = array('hubloc_url' => $x['url'],'xchan_guid' => $x['guid'], 'xchan_guid_sig' => $x['guid_sig']);
+ if(zot_refresh($them))
+ return $hash;
+ return false;
+}
+
diff --git a/index.php b/index.php
index cc6249256..640a2b6a1 100644..100755
--- a/index.php
+++ b/index.php
@@ -1,8 +1,8 @@
-<?php
+<?php /** @file */
/**
*
- * Friendica Red
+ * Red Matrix
*
*/
@@ -29,7 +29,6 @@ $install = ((file_exists('.htconfig.php') && filesize('.htconfig.php')) ? false
$a->language = get_best_language();
-load_translation_table($a->language);
/**
*
@@ -37,11 +36,11 @@ load_translation_table($a->language);
*
*/
-require_once("dba.php");
+require_once("include/dba/dba_driver.php");
if(! $install) {
- $db = new dba($db_host, $db_user, $db_pass, $db_data, $install);
- unset($db_host, $db_user, $db_pass, $db_data);
+ $db = dba_factory($db_host, $db_port, $db_user, $db_pass, $db_data, $install);
+ unset($db_host, $db_port, $db_user, $db_pass, $db_data);
/**
* Load configs from db. Overwrite configs from .htconfig.php
@@ -49,10 +48,17 @@ if(! $install) {
load_config('config');
load_config('system');
+ load_config('feature');
- require_once("session.php");
+ require_once("include/session.php");
load_hooks();
call_hooks('init_1');
+
+ load_translation_table($a->language);
+}
+else {
+ // load translations but do not check plugins as we have no database
+ load_translation_table($a->language,true);
}
@@ -94,7 +100,7 @@ if((x($_GET,'zid')) && (! $install)) {
}
if((x($_SESSION,'authenticated')) || (x($_POST,'auth-params')) || ($a->module === 'login'))
- require("auth.php");
+ require("include/auth.php");
if(! x($_SESSION,'sysmsg'))
@@ -110,8 +116,11 @@ if(! x($_SESSION,'sysmsg_info'))
*/
-if($install)
- $a->module = 'setup';
+if($install) {
+ /* Allow an exception for the view module so that pcss will be interpreted during installation */
+ if($a->module != 'view')
+ $a->module = 'setup';
+}
else
check_config($a);
@@ -234,6 +243,12 @@ if (file_exists($theme_info_file)){
if(! x($a->page,'content'))
$a->page['content'] = '';
+/* set JS cookie */
+if($_COOKIE['jsAvailable'] != 1) {
+ $a->page['content'] .= '<script>document.cookie="jsAvailable=1; path=/"; location.reload();</script>';
+}
+
+
if(! $install)
call_hooks('page_content_top',$a->page['content']);
@@ -281,7 +296,7 @@ if($a->module_loaded) {
// If $aside_default is not False after the theme _aside() function, run the
// module's _aside() function too
//
- // This gives themes more control over how the left sidebar looks
+ // This gives themes more control over how the sidebar looks
$aside_default = true;
call_hooks($a->module . '_mod_aside',$placeholder);
@@ -317,7 +332,7 @@ if($a->module_loaded) {
if(x($_SESSION,'visitor_home'))
$homebase = $_SESSION['visitor_home'];
elseif(local_user())
- $homebase = $a->get_baseurl() . '/channel/' . $a->user['nickname'];
+ $homebase = $a->get_baseurl() . '/channel/' . $a->channel['channel_address'];
if(isset($homebase))
$a->page['content'] .= '<script>var homebase="' . $homebase . '" ; </script>';
diff --git a/install/INSTALL.txt b/install/INSTALL.txt
index e6adbba7d..500abb0f9 100644
--- a/install/INSTALL.txt
+++ b/install/INSTALL.txt
@@ -1,31 +1,39 @@
-Friendica Installation
+Red Matrix Installation
-We've tried very hard to ensure that Friendica will run on commodity hosting
-platforms - such as those used to host Wordpress blogs and Drupal websites.
-But be aware that Friendica is more than a simple web application. It is a
+We've tried very hard to ensure that the Red Matrix will run on commodity
+hosting platforms - such as those used to host Wordpress blogs and Drupal
+websites. It will run on most any Linux VPS system. Windows LAMP platforms
+such as XAMPP and WAMP are not officially supported at this time - however
+we welcome patches if you manage to get it working.
+
+Be aware that the Red Matrix is more than a simple web application. It is a
complex communications system which more closely resembles an email server
than a web server. For reliability and performance, messages are delivered in
the background and are queued for later delivery when sites are down. This
kind of functionality requires a bit more of the host system than the typical
-blog. Not every PHP/MySQL hosting provider will be able to support Friendica.
-Many will. But please review the requirements and confirm these with your
-hosting provider prior to installation.
+blog. Not every PHP/MySQL hosting provider will be able to support the
+Red Matrix. Many will - but please review the requirements and confirm these
+with your hosting provider prior to installation. (And preferably before
+entering into a long-term contract.)
+
+If you encounter installation issues, please let us know via the Github issue
+tracker (https://github.com/friendica/red/issues). Please be as clear as you
+can about your operating environment and provide as much detail as possible
+about any error messages you may see, so that we can prevent it from happening
+in the future. Due to the large variety of operating systems and PHP platforms
+in existence we may have only limited ability to debug your PHP installation or
+acquire any missing modules - but we will do our best to solve any general code
+issues.
+
+
Before you begin: Choose a domain name or subdomain name for your server.
Put some thought into this - because changing it is currently not-supported.
Things will break, and some of your friends may have difficulty communicating
-with you. We plan to address this limitation in a future release. Also decide
-if you wish to connect with members of the Diaspora network, as this will
-impact the installation requirements.
-
-Decide if you will use SSL and obtain an SSL cert. Communications with the
-Diaspora network MAY require both SSL AND an SSL cert signed by a CA which is
-recognised by the major browsers. Friendica will work with self-signed certs
-but Diaspora communication may not. For best results, install your cert PRIOR
-to installing Friendica and when visiting your site for the initial
-installation in step 5, please use the https: link. (Use the http: or non-SSL
-link if your cert is self-signed).
+with you. We plan to address this limitation in a future release.
+
+Decide if you will use SSL and obtain an SSL cert before software installation. You SHOULD use SSL. If you use SSL, you MUST use a "browser-valid" certificate. Please test your certificate prior to installation. A web tool for testing your certificate is available at "http://www.digicert.com/help/". When visiting your site for the first time, please use the SSL ("https://") URL if SSL is available. This will avoid problems later.
1. Requirements
@@ -35,27 +43,69 @@ local .htaccess file
- PHP 5.3+. The later the better.
- PHP *command line* access with register_argc_argv set to true in the
-php.ini file [or see 'poormancron' in section 8]
+php.ini file - and with no hosting provider restrictions on the use of exec()
+and proc_open().
- - curl, gd (with at least jpeg support), mysql, mbstring, mcrypt, and openssl extensions
+ - curl, gd (with at least jpeg support), mysqli, mbstring, mcrypt, and openssl extensions. The imagick extension is not required but desirable.
- some form of email server or email gateway such that PHP mail() works
- - Mysql 5.x
+ - Mysql 5.x or MariaDB
- - ability to schedule jobs with cron (Linux/Mac) or Scheduled Tasks
-(Windows) [Note: other options are presented in Section 8 of this document]
+ - ability to schedule jobs with cron.
- Installation into a top-level domain or sub-domain (without a
-directory/path component in the URL) is preferred. This is REQUIRED if
-you wish to communicate with the Diaspora network.
+directory/path component in the URL) is REQUIRED.
-2. Unpack the Friendica files into the root of your web server document area.
+2. Unpack the Red Matrix files into the root of your web server document area.
- If you copy the directory tree to your webserver, make sure
that you also copy .htaccess - as "dot" files are often hidden
and aren't normally copied.
+ - If you are able to do so, we recommend using git to clone the
+ source repository rather than to use a packaged tar or zip file.
+ This makes the software much easier to update. The Linux command
+ to clone the repository into a directory "mywebsite" would be
+
+ git clone https://github.com/friendica/red.git mywebsite
+
+ - and then you can pick up the latest changes at any time with
+
+ git pull
+
+ - make sure folders *view/tpl/smarty3* and *store* exist and are writable by webserver
+
+ mkdir view/tpl/smarty3
+ mkdir store
+
+ chmod 777 view/tpl/smarty3
+ chmod 777 store
+
+ [This permission (777) is very dangerous and if you have sufficient
+ privilege and knowledge you should make this directory writeable only
+ by the webserver. In many shared hosting environments this may be
+ difficult without opening a trouble ticket with your provider. The
+ above permissions will allow the software to work, but are not
+ optimal.]
+
+ - For installing addons
+
+ - First you should be **on** your website folder
+
+ cd mywebsite
+
+ - Then you should clone the addon repository (separately)
+
+ git clone https://github.com/friendica/red-addons.git addon
+
+ - For keeping the addon tree updated, you should be on you addon tree and issue a git pull
+
+ cd mywebsite/addon
+
+ git pull
+
+
3. Create an empty database and note the access details (hostname, username,
password, database name).
@@ -66,8 +116,8 @@ write or create files in your web directory, create an empty file called
5. Visit your website with a web browser and follow the instructions. Please
note any error messages and correct these before continuing. If you are using
-SSL with a known signature authority (recommended), use the https: link to your
-website. If you are using a self-signed cert or no cert, use the http: link.
+SSL with a known signature authority, use the https: link to your
+website.
6. *If* the automated installation fails for any reason, check the following:
@@ -107,29 +157,11 @@ You can generally find the location of PHP by executing "which php". If you
have troubles with this section please contact your hosting provider for
assistance. Friendica will not work correctly if you cannot perform this step.
-You should also be sure that $a->config['php_path'] is set correctly, it should
+You should also be sure that $a->config['system']['php_path'] is set correctly, it should
look like (changing it to the correct PHP location)
-$a->config['php_path'] = '/usr/local/php53/bin/php'
+$a->config['system']['php_path'] = '/usr/local/php53/bin/php';
-Alternative: You may be able to use the 'poormancron' plugin to perform this
-step if you are using a recent Friendica release. 'poormancron' may result in
-perfomance and memory issues and is only suitable for small sites with one or
-two users and a handful of contacts. To do this, edit the file
-".htconfig.php" and look for a line describing your plugins. On a fresh
-installation, it will look like
-
-$a->config['system']['addon'] = 'js_upload';
-
-This indicates the "js_upload" addon module is enabled. You may add additional
-addons/plugins using this same line in the configuration file. Change it to
-read
-
-$a->config['system']['addon'] = 'js_upload,poormancron';
-
-and save your changes.
-
-
#####################################################################
@@ -145,7 +177,7 @@ and save your changes.
Check your database settings. It usually means your database could not
be opened or accessed. If the database resides on the same machine, check that
-the database server name is "localhost".
+the database server name is the word "localhost".
#####################################################################
- 500 Internal Error
@@ -153,8 +185,6 @@ the database server name is "localhost".
This could be the result of one of our Apache directives not being
supported by your version of Apache. Examine your apache server logs.
- You might remove the line "Options -Indexes" from the .htaccess file if
-you are using a Windows server as this has been known to cause problems.
Also check your file permissions. Your website and all contents must generally
be world-readable.
@@ -191,7 +221,7 @@ configuration for your site. This will need to be changed to
If you do not see the word "test", your .htaccess is working, but it is
likely that mod-rewrite is not installed in your web server or is not working.
- On most flavour of Linux,
+ On most flavours of Linux,
% a2enmod rewrite
% /etc/init.d/apache2 restart
@@ -200,8 +230,7 @@ likely that mod-rewrite is not installed in your web server or is not working.
distribution or (if Windows) the provider of your Apache server software if
you need to change either of these and can not figure out how. There is
a lot of help available on the web. Google "mod-rewrite" along with the
-name of your operating system distribution or Apache package (if using
-Windows).
+name of your operating system distribution or Apache package.
#####################################################################
@@ -223,7 +252,7 @@ Retry the installation. As soon as the database has been created,
#####################################################################
- Some configurations with "suhosin" security are configured without
-an ability to run external processes. Friendica requires this ability.
+an ability to run external processes. The Red Matrix requires this ability.
Following are some notes provided by one of our members.
#####################################################################
@@ -233,26 +262,26 @@ certain functions like proc_open, as configured in /etc/php5/conf.d/suhosin.ini:
suhosin.executor.func.blacklist = proc_open, ...
-For those sites like Friendica that really need these functions they can be
-enabled, e.g. in /etc/apache2/sites-available/friendica:
+For those sites like Red Matrix that really need these functions they can be
+enabled, e.g. in /etc/apache2/sites-available/redmatrix:
- <Directory /var/www/friendica/>
+ <Directory /var/www/redmatrix/>
php_admin_value suhosin.executor.func.blacklist none
php_admin_value suhosin.executor.eval.blacklist none
</Directory>
-This enables every function for Friendica if accessed via browser, but not for
+This enables every function for Red Matrix if accessed via browser, but not for
the cronjob that is called via php command line. I attempted to enable it for
cron by using something like
- */10 * * * * cd /var/www/friendica/friendica/ && sudo -u www-data /usr/bin/php
+ */10 * * * * cd /var/www/redmatrix/ && sudo -u www-data /usr/bin/php
-d suhosin.executor.func.blacklist=none -d suhosin.executor.eval.blacklist=none
-f include/poller.php
-This worked well for simple test cases, but the friendica-cron still failed with
+This worked well for simple test cases, but the cron job still failed with
a fatal error:
suhosin[22962]: ALERT - function within blacklist called: proc_open() (attacker
-'REMOTE_ADDR not set', file '/var/www/friendica/friendica/boot.php', line 1341)
+'REMOTE_ADDR not set', file '/var/www/redmatrix/boot.php', line 1341)
After a while I noticed, that include/poller.php calls further php script via
proc_open. These scripts themselves also use proc_open and fail, because they
@@ -260,11 +289,11 @@ are NOT called with -d suhosin.executor.func.blacklist=none.
So the simple solution is to put the correct parameters into .htconfig.php:
// Location of PHP command line processor
- $a->config['php_path'] = '/usr/bin/php -d suhosin.executor.func.blacklist=none
+ $a->config['system']['php_path'] = '/usr/bin/php -d suhosin.executor.func.blacklist=none
-d suhosin.executor.eval.blacklist=none';
-This is obvious as soon as you notice that the friendica-cron uses proc_open to
+This is obvious as soon as you notice that the cron uses proc_open to
execute php-scripts that also use proc_open, but it took me quite some time to
find that out. I hope this saves some time for other people using suhosin with
function blacklists.
diff --git a/install/database.sql b/install/database.sql
index 3dcbb7be0..597124566 100644
--- a/install/database.sql
+++ b/install/database.sql
@@ -44,6 +44,7 @@ CREATE TABLE IF NOT EXISTS `account` (
`account_salt` char(32) NOT NULL DEFAULT '',
`account_password` char(255) NOT NULL DEFAULT '',
`account_email` char(255) NOT NULL DEFAULT '',
+ `account_external` char(255) NOT NULL DEFAULT '',
`account_language` char(16) NOT NULL DEFAULT 'en',
`account_created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`account_lastlog` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
@@ -53,6 +54,7 @@ CREATE TABLE IF NOT EXISTS `account` (
`account_expires` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`account_expire_notified` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`account_service_class` char(32) NOT NULL DEFAULT '',
+ `account_level` int(10) unsigned NOT NULL,
PRIMARY KEY (`account_id`),
KEY `account_email` (`account_email`),
KEY `account_service_class` (`account_service_class`),
@@ -61,7 +63,9 @@ CREATE TABLE IF NOT EXISTS `account` (
KEY `account_roles` (`account_roles`),
KEY `account_lastlog` (`account_lastlog`),
KEY `account_expires` (`account_expires`),
- KEY `account_default_channel` (`account_default_channel`)
+ KEY `account_default_channel` (`account_default_channel`),
+ KEY `account_external` (`account_external`),
+ KEY `account_level` (`account_level`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `addon` (
@@ -83,6 +87,7 @@ CREATE TABLE IF NOT EXISTS `attach` (
`aid` int(10) unsigned NOT NULL DEFAULT '0',
`uid` int(10) unsigned NOT NULL DEFAULT '0',
`hash` char(64) NOT NULL DEFAULT '',
+ `creator` char(128) NOT NULL DEFAULT '0',
`filename` char(255) NOT NULL DEFAULT '',
`filetype` char(64) NOT NULL DEFAULT '',
`filesize` int(10) unsigned NOT NULL DEFAULT '0',
@@ -100,6 +105,7 @@ CREATE TABLE IF NOT EXISTS `attach` (
KEY `aid` (`aid`),
KEY `uid` (`uid`),
KEY `hash` (`hash`),
+ KEY `creator` (`creator`),
KEY `filename` (`filename`),
KEY `filetype` (`filetype`),
KEY `filesize` (`filesize`),
@@ -126,16 +132,6 @@ CREATE TABLE IF NOT EXISTS `cache` (
PRIMARY KEY (`k`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-CREATE TABLE IF NOT EXISTS `challenge` (
- `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `challenge` char(255) NOT NULL,
- `dfrn-id` char(255) NOT NULL,
- `expire` int(11) NOT NULL,
- `type` char(255) NOT NULL,
- `last_update` char(255) NOT NULL,
- PRIMARY KEY (`id`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-
CREATE TABLE IF NOT EXISTS `channel` (
`channel_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`channel_account_id` int(10) unsigned NOT NULL DEFAULT '0',
@@ -153,12 +149,13 @@ CREATE TABLE IF NOT EXISTS `channel` (
`channel_prvkey` text NOT NULL,
`channel_notifyflags` int(10) unsigned NOT NULL DEFAULT '65535',
`channel_pageflags` int(10) unsigned NOT NULL DEFAULT '0',
+ `channel_dirdate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`channel_deleted` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`channel_max_anon_mail` int(10) unsigned NOT NULL DEFAULT '10',
`channel_max_friend_req` int(10) unsigned NOT NULL DEFAULT '10',
`channel_expire_days` int(11) NOT NULL DEFAULT '0',
`channel_passwd_reset` char(255) NOT NULL DEFAULT '',
- `channel_default_gid` int(10) unsigned NOT NULL DEFAULT '0',
+ `channel_default_group` char(255) NOT NULL DEFAULT '',
`channel_allow_cid` mediumtext NOT NULL,
`channel_allow_gid` mediumtext NOT NULL,
`channel_deny_cid` mediumtext NOT NULL,
@@ -179,11 +176,12 @@ CREATE TABLE IF NOT EXISTS `channel` (
`channel_w_storage` int(10) unsigned NOT NULL DEFAULT '128',
`channel_r_pages` int(10) unsigned NOT NULL DEFAULT '128',
`channel_w_pages` int(10) unsigned NOT NULL DEFAULT '128',
+ `channel_a_republish` int(10) unsigned NOT NULL DEFAULT '128',
PRIMARY KEY (`channel_id`),
+ UNIQUE KEY `channel_address_unique` (`channel_address`),
KEY `channel_account_id` (`channel_account_id`),
KEY `channel_primary` (`channel_primary`),
KEY `channel_name` (`channel_name`),
- KEY `channel_address` (`channel_address`),
KEY `channel_timezone` (`channel_timezone`),
KEY `channel_location` (`channel_location`),
KEY `channel_theme` (`channel_theme`),
@@ -191,7 +189,7 @@ CREATE TABLE IF NOT EXISTS `channel` (
KEY `channel_pageflags` (`channel_pageflags`),
KEY `channel_max_anon_mail` (`channel_max_anon_mail`),
KEY `channel_max_friend_req` (`channel_max_friend_req`),
- KEY `channel_default_gid` (`channel_default_gid`),
+ KEY `channel_default_gid` (`channel_default_group`),
KEY `channel_r_stream` (`channel_r_stream`),
KEY `channel_r_profile` (`channel_r_profile`),
KEY `channel_r_photos` (`channel_r_photos`),
@@ -211,7 +209,9 @@ CREATE TABLE IF NOT EXISTS `channel` (
KEY `channel_w_storage` (`channel_w_storage`),
KEY `channel_r_pages` (`channel_r_pages`),
KEY `channel_w_pages` (`channel_w_pages`),
- KEY `channel_deleted` (`channel_deleted`)
+ KEY `channel_deleted` (`channel_deleted`),
+ KEY `channel_a_republish` (`channel_a_republish`),
+ KEY `channel_dirdate` (`channel_dirdate`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `clients` (
@@ -244,7 +244,7 @@ CREATE TABLE IF NOT EXISTS `event` (
`start` datetime NOT NULL,
`finish` datetime NOT NULL,
`summary` text NOT NULL,
- `desc` text NOT NULL,
+ `description` text NOT NULL,
`location` text NOT NULL,
`type` char(255) NOT NULL,
`nofinish` tinyint(1) NOT NULL DEFAULT '0',
@@ -265,7 +265,7 @@ CREATE TABLE IF NOT EXISTS `event` (
KEY `aid` (`aid`),
KEY `event_hash` (`event_hash`),
KEY `event_xchan` (`event_xchan`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `fcontact` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
@@ -307,7 +307,6 @@ CREATE TABLE IF NOT EXISTS `fserver` (
`key` text NOT NULL,
PRIMARY KEY (`id`),
KEY `server` (`server`),
- KEY `server_2` (`server`),
KEY `posturl` (`posturl`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
@@ -324,44 +323,7 @@ CREATE TABLE IF NOT EXISTS `fsuggest` (
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-CREATE TABLE IF NOT EXISTS `gcign` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `uid` int(11) NOT NULL,
- `gcid` int(11) NOT NULL,
- PRIMARY KEY (`id`),
- KEY `uid` (`uid`),
- KEY `gcid` (`gcid`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-
-CREATE TABLE IF NOT EXISTS `gcontact` (
- `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `name` char(255) NOT NULL,
- `url` char(255) NOT NULL,
- `nurl` char(255) NOT NULL,
- `photo` char(255) NOT NULL,
- `connect` char(255) NOT NULL,
- PRIMARY KEY (`id`),
- KEY `nurl` (`nurl`),
- KEY `name` (`name`),
- KEY `url` (`url`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-
-CREATE TABLE IF NOT EXISTS `glink` (
- `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `cid` int(11) NOT NULL,
- `uid` int(11) NOT NULL,
- `gcid` int(11) NOT NULL,
- `zcid` int(11) NOT NULL,
- `updated` datetime NOT NULL,
- PRIMARY KEY (`id`),
- KEY `cid` (`cid`),
- KEY `uid` (`uid`),
- KEY `gcid` (`gcid`),
- KEY `zcid` (`zcid`),
- KEY `updated` (`updated`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-
-CREATE TABLE IF NOT EXISTS `group` (
+CREATE TABLE IF NOT EXISTS `groups` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`hash` char(255) NOT NULL DEFAULT '',
`uid` int(10) unsigned NOT NULL,
@@ -403,41 +365,25 @@ CREATE TABLE IF NOT EXISTS `hubloc` (
`hubloc_hash` char(255) NOT NULL,
`hubloc_addr` char(255) NOT NULL DEFAULT '',
`hubloc_flags` int(10) unsigned NOT NULL DEFAULT '0',
+ `hubloc_status` int(10) unsigned NOT NULL DEFAULT '0',
`hubloc_url` char(255) NOT NULL DEFAULT '',
`hubloc_url_sig` text NOT NULL,
`hubloc_host` char(255) NOT NULL DEFAULT '',
`hubloc_callback` char(255) NOT NULL DEFAULT '',
`hubloc_connect` char(255) NOT NULL DEFAULT '',
`hubloc_sitekey` text NOT NULL,
+ `hubloc_updated` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
+ `hubloc_connected` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`hubloc_id`),
KEY `hubloc_url` (`hubloc_url`),
KEY `hubloc_guid` (`hubloc_guid`),
KEY `hubloc_flags` (`hubloc_flags`),
KEY `hubloc_connect` (`hubloc_connect`),
KEY `hubloc_host` (`hubloc_host`),
- KEY `hubloc_addr` (`hubloc_addr`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-
-CREATE TABLE IF NOT EXISTS `intro` (
- `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `uid` int(10) unsigned NOT NULL,
- `fid` int(11) NOT NULL DEFAULT '0',
- `contact-id` int(11) NOT NULL,
- `knowyou` tinyint(1) NOT NULL,
- `duplex` tinyint(1) NOT NULL DEFAULT '0',
- `note` text NOT NULL,
- `hash` char(255) NOT NULL,
- `datetime` datetime NOT NULL,
- `blocked` tinyint(1) NOT NULL DEFAULT '1',
- `ignore` tinyint(1) NOT NULL DEFAULT '0',
- PRIMARY KEY (`id`),
- KEY `uid` (`uid`),
- KEY `fid` (`fid`),
- KEY `hash` (`hash`),
- KEY `datetime` (`datetime`),
- KEY `blocked` (`blocked`),
- KEY `ignore` (`ignore`),
- KEY `contact-id` (`contact-id`)
+ KEY `hubloc_addr` (`hubloc_addr`),
+ KEY `hubloc_updated` (`hubloc_updated`),
+ KEY `hubloc_connected` (`hubloc_connected`),
+ KEY `hubloc_status` (`hubloc_status`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `issue` (
@@ -459,12 +405,11 @@ CREATE TABLE IF NOT EXISTS `issue` (
CREATE TABLE IF NOT EXISTS `item` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `uri` char(255) CHARACTER SET ascii NOT NULL DEFAULT '',
+ `mid` char(255) CHARACTER SET ascii NOT NULL DEFAULT '',
`aid` int(10) unsigned NOT NULL DEFAULT '0',
`uid` int(10) unsigned NOT NULL DEFAULT '0',
- `wall` tinyint(1) NOT NULL DEFAULT '0',
`parent` int(10) unsigned NOT NULL DEFAULT '0',
- `parent_uri` char(255) CHARACTER SET ascii NOT NULL DEFAULT '',
+ `parent_mid` char(255) CHARACTER SET ascii NOT NULL DEFAULT '',
`thr_parent` char(255) NOT NULL DEFAULT '',
`created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`edited` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
@@ -474,8 +419,9 @@ CREATE TABLE IF NOT EXISTS `item` (
`changed` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`owner_xchan` char(255) NOT NULL DEFAULT '',
`author_xchan` char(255) NOT NULL DEFAULT '',
+ `source_xchan` char(255) NOT NULL DEFAULT '',
`mimetype` char(255) NOT NULL DEFAULT '',
- `title` char(255) NOT NULL DEFAULT '',
+ `title` text NOT NULL,
`body` mediumtext NOT NULL,
`app` char(255) NOT NULL DEFAULT '',
`lang` char(64) NOT NULL DEFAULT '',
@@ -485,15 +431,17 @@ CREATE TABLE IF NOT EXISTS `item` (
`object` text NOT NULL,
`tgt_type` char(255) NOT NULL DEFAULT '',
`target` text NOT NULL,
+ `layout_mid` char(255) NOT NULL DEFAULT '',
`postopts` text NOT NULL,
`llink` char(255) NOT NULL DEFAULT '',
`plink` char(255) NOT NULL DEFAULT '',
`resource_id` char(255) NOT NULL DEFAULT '',
`resource_type` char(16) NOT NULL DEFAULT '',
`attach` mediumtext NOT NULL,
- `inform` mediumtext NOT NULL,
+ `sig` text NOT NULL,
`location` char(255) NOT NULL DEFAULT '',
`coord` char(255) NOT NULL DEFAULT '',
+ `comment_policy` char(255) NOT NULL DEFAULT '',
`allow_cid` mediumtext NOT NULL,
`allow_gid` mediumtext NOT NULL,
`deny_cid` mediumtext NOT NULL,
@@ -502,23 +450,19 @@ CREATE TABLE IF NOT EXISTS `item` (
`item_flags` int(11) NOT NULL DEFAULT '0',
`item_private` tinyint(4) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
- KEY `uri` (`uri`),
KEY `uid` (`uid`),
KEY `parent` (`parent`),
KEY `created` (`created`),
KEY `edited` (`edited`),
KEY `received` (`received`),
- KEY `wall` (`wall`),
KEY `uid_commented` (`uid`,`commented`),
KEY `uid_created` (`uid`,`created`),
- KEY `parent_uri` (`parent_uri`),
KEY `aid` (`aid`),
KEY `owner_xchan` (`owner_xchan`),
KEY `author_xchan` (`author_xchan`),
KEY `resource_type` (`resource_type`),
KEY `item_restrict` (`item_restrict`),
KEY `item_flags` (`item_flags`),
- KEY `uid_uri` (`uri`,`uid`),
KEY `commented` (`commented`),
KEY `verb` (`verb`),
KEY `item_private` (`item_private`),
@@ -526,6 +470,11 @@ CREATE TABLE IF NOT EXISTS `item` (
KEY `expires` (`expires`),
KEY `revision` (`revision`),
KEY `mimetype` (`mimetype`),
+ KEY `mid` (`mid`),
+ KEY `parent_mid` (`parent_mid`),
+ KEY `uid_mid` (`mid`,`uid`),
+ KEY `comment_policy` (`comment_policy`),
+ KEY `layout_mid` (`layout_mid`),
FULLTEXT KEY `title` (`title`),
FULLTEXT KEY `body` (`body`),
FULLTEXT KEY `allow_cid` (`allow_cid`),
@@ -554,43 +503,51 @@ CREATE TABLE IF NOT EXISTS `mail` (
`to_xchan` char(255) NOT NULL DEFAULT '',
`account_id` int(10) unsigned NOT NULL DEFAULT '0',
`channel_id` int(10) unsigned NOT NULL,
- `title` char(255) NOT NULL,
+ `title` text NOT NULL,
`body` mediumtext NOT NULL,
- `uri` char(255) NOT NULL,
- `parent_uri` char(255) NOT NULL,
+ `attach` mediumtext NOT NULL,
+ `mid` char(255) NOT NULL,
+ `parent_mid` char(255) NOT NULL,
`created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
+ `expires` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`id`),
- KEY `uri` (`uri`),
KEY `created` (`created`),
KEY `mail_flags` (`mail_flags`),
KEY `account_id` (`account_id`),
KEY `channel_id` (`channel_id`),
- KEY `parent_uri` (`parent_uri`),
KEY `from_xchan` (`from_xchan`),
- KEY `to_xchan` (`to_xchan`)
+ KEY `to_xchan` (`to_xchan`),
+ KEY `mid` (`mid`),
+ KEY `parent_mid` (`parent_mid`),
+ KEY `expires` (`expires`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `manage` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`uid` int(11) NOT NULL,
- `mid` int(11) NOT NULL,
+ `xchan` char(255) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
KEY `uid` (`uid`),
- KEY `mid` (`mid`)
+ KEY `xchan` (`xchan`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `menu` (
`menu_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`menu_channel_id` int(10) unsigned NOT NULL DEFAULT '0',
+ `menu_name` char(255) NOT NULL DEFAULT '',
`menu_desc` char(255) NOT NULL DEFAULT '',
+ `menu_flags` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`menu_id`),
- KEY `menu_channel_id` (`menu_channel_id`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+ KEY `menu_channel_id` (`menu_channel_id`),
+ KEY `menu_name` (`menu_name`),
+ KEY `menu_flags` (`menu_flags`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `menu_item` (
`mitem_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`mitem_link` char(255) NOT NULL DEFAULT '',
`mitem_desc` char(255) NOT NULL DEFAULT '',
+ `mitem_flags` int(11) NOT NULL DEFAULT '0',
`allow_cid` mediumtext NOT NULL,
`allow_gid` mediumtext NOT NULL,
`deny_cid` mediumtext NOT NULL,
@@ -600,8 +557,9 @@ CREATE TABLE IF NOT EXISTS `menu_item` (
`mitem_order` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`mitem_id`),
KEY `mitem_channel_id` (`mitem_channel_id`),
- KEY `mitem_menu_id` (`mitem_menu_id`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+ KEY `mitem_menu_id` (`mitem_menu_id`),
+ KEY `mitem_flags` (`mitem_flags`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `notify` (
`id` int(11) NOT NULL AUTO_INCREMENT,
@@ -611,6 +569,7 @@ CREATE TABLE IF NOT EXISTS `notify` (
`photo` char(255) NOT NULL,
`date` datetime NOT NULL,
`msg` mediumtext NOT NULL,
+ `aid` int(11) NOT NULL,
`uid` int(11) NOT NULL,
`link` char(255) NOT NULL,
`parent` int(11) NOT NULL,
@@ -626,13 +585,34 @@ CREATE TABLE IF NOT EXISTS `notify` (
KEY `hash` (`hash`),
KEY `parent` (`parent`),
KEY `link` (`link`),
- KEY `otype` (`otype`)
+ KEY `otype` (`otype`),
+ KEY `aid` (`aid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+CREATE TABLE IF NOT EXISTS `obj` (
+ `obj_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `obj_page` char(64) NOT NULL DEFAULT '',
+ `obj_verb` char(255) NOT NULL DEFAULT '',
+ `obj_type` int(10) unsigned NOT NULL DEFAULT '0',
+ `obj_obj` char(255) NOT NULL DEFAULT '',
+ `obj_channel` int(10) unsigned NOT NULL DEFAULT '0',
+ `allow_cid` MEDIUMTEXT NOT NULL DEFAULT '',
+ `allow_gid` MEDIUMTEXT NOT NULL DEFAULT '',
+ `deny_cid` MEDIUMTEXT NOT NULL DEFAULT '',
+ `deny_gid` MEDIUMTEXT NOT NULL DEFAULT '',
+ PRIMARY KEY (`obj_id`),
+ KEY `obj_verb` (`obj_verb`),
+ KEY `obj_page` (`obj_page`),
+ KEY `obj_type` (`obj_type`),
+ KEY `obj_channel` (`obj_channel`),
+ KEY `obj_obj` (`obj_obj`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
CREATE TABLE IF NOT EXISTS `outq` (
`outq_hash` char(255) NOT NULL,
`outq_account` int(10) unsigned NOT NULL DEFAULT '0',
`outq_channel` int(10) unsigned NOT NULL DEFAULT '0',
+ `outq_driver` char(32) NOT NULL DEFAULT '',
`outq_posturl` char(255) NOT NULL DEFAULT '',
`outq_async` tinyint(1) NOT NULL DEFAULT '0',
`outq_delivered` tinyint(1) NOT NULL DEFAULT '0',
@@ -669,7 +649,7 @@ CREATE TABLE IF NOT EXISTS `photo` (
`created` datetime NOT NULL,
`edited` datetime NOT NULL,
`title` char(255) NOT NULL,
- `desc` text NOT NULL,
+ `description` text NOT NULL,
`album` char(255) NOT NULL,
`filename` char(255) NOT NULL,
`type` char(128) NOT NULL DEFAULT 'image/jpeg',
@@ -679,6 +659,7 @@ CREATE TABLE IF NOT EXISTS `photo` (
`data` mediumblob NOT NULL,
`scale` tinyint(3) NOT NULL,
`profile` tinyint(1) NOT NULL DEFAULT '0',
+ `photo_flags` int(10) unsigned NOT NULL DEFAULT '0',
`allow_cid` mediumtext NOT NULL,
`allow_gid` mediumtext NOT NULL,
`deny_cid` mediumtext NOT NULL,
@@ -688,6 +669,7 @@ CREATE TABLE IF NOT EXISTS `photo` (
KEY `album` (`album`),
KEY `scale` (`scale`),
KEY `profile` (`profile`),
+ KEY `photo_flags` (`photo_flags`),
KEY `type` (`type`),
KEY `aid` (`aid`),
KEY `xchan` (`xchan`),
@@ -695,6 +677,29 @@ CREATE TABLE IF NOT EXISTS `photo` (
KEY `resource_id` (`resource_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+CREATE TABLE IF NOT EXISTS `poll` (
+ `poll_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `poll_channel` int(10) unsigned NOT NULL DEFAULT '0',
+ `poll_desc` text NOT NULL,
+ `poll_flags` int(11) NOT NULL DEFAULT '0',
+ `poll_votes` int(11) NOT NULL DEFAULT '0',
+ PRIMARY KEY (`poll_id`),
+ KEY `poll_channel` (`poll_channel`),
+ KEY `poll_flags` (`poll_flags`),
+ KEY `poll_votes` (`poll_votes`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+CREATE TABLE IF NOT EXISTS `poll_elm` (
+ `pelm_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `pelm_poll` int(10) unsigned NOT NULL DEFAULT '0',
+ `pelm_desc` text NOT NULL,
+ `pelm_flags` int(11) NOT NULL DEFAULT '0',
+ `pelm_result` float NOT NULL DEFAULT '0',
+ PRIMARY KEY (`pelm_id`),
+ KEY `pelm_poll` (`pelm_poll`),
+ KEY `pelm_result` (`pelm_result`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
CREATE TABLE IF NOT EXISTS `profile` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`profile_guid` char(64) NOT NULL DEFAULT '',
@@ -705,6 +710,7 @@ CREATE TABLE IF NOT EXISTS `profile` (
`hide_friends` tinyint(1) NOT NULL DEFAULT '0',
`name` char(255) NOT NULL,
`pdesc` char(255) NOT NULL,
+ `chandesc` text NOT NULL,
`dob` char(32) NOT NULL DEFAULT '0000-00-00',
`dob_tz` char(255) NOT NULL DEFAULT 'UTC',
`address` char(255) NOT NULL,
@@ -734,6 +740,7 @@ CREATE TABLE IF NOT EXISTS `profile` (
`work` text NOT NULL,
`education` text NOT NULL,
`contact` text NOT NULL,
+ `channels` text NOT NULL,
`homepage` char(255) NOT NULL,
`photo` char(255) NOT NULL,
`thumb` char(255) NOT NULL,
@@ -770,22 +777,6 @@ CREATE TABLE IF NOT EXISTS `profile_check` (
KEY `expire` (`expire`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-CREATE TABLE IF NOT EXISTS `queue` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `cid` int(11) NOT NULL,
- `network` char(32) NOT NULL,
- `created` datetime NOT NULL,
- `last` datetime NOT NULL,
- `content` mediumtext NOT NULL,
- `batch` tinyint(1) NOT NULL DEFAULT '0',
- PRIMARY KEY (`id`),
- KEY `cid` (`cid`),
- KEY `network` (`network`),
- KEY `created` (`created`),
- KEY `last` (`last`),
- KEY `batch` (`batch`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-
CREATE TABLE IF NOT EXISTS `register` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`hash` char(255) NOT NULL,
@@ -797,29 +788,60 @@ CREATE TABLE IF NOT EXISTS `register` (
KEY `hash` (`hash`),
KEY `created` (`created`),
KEY `uid` (`uid`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `session` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`sid` char(255) NOT NULL,
`data` text NOT NULL,
- `expire` int(10) unsigned NOT NULL,
+ `expire` bigint(20) unsigned NOT NULL,
PRIMARY KEY (`id`),
KEY `sid` (`sid`),
KEY `expire` (`expire`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+CREATE TABLE IF NOT EXISTS `shares` (
+ `share_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `share_type` int(11) NOT NULL DEFAULT '0',
+ `share_target` int(10) unsigned NOT NULL DEFAULT '0',
+ `share_xchan` char(255) NOT NULL DEFAULT '',
+ PRIMARY KEY (`share_id`),
+ KEY `share_type` (`share_type`),
+ KEY `share_target` (`share_target`),
+ KEY `share_xchan` (`share_xchan`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
CREATE TABLE IF NOT EXISTS `site` (
`site_url` char(255) NOT NULL,
+ `site_access` int(11) NOT NULL DEFAULT '0',
`site_flags` int(11) NOT NULL DEFAULT '0',
`site_update` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
+ `site_sync` datetime NOT NULL,
`site_directory` char(255) NOT NULL DEFAULT '',
+ `site_register` int(11) NOT NULL DEFAULT '0',
+ `site_sellpage` char(255) NOT NULL DEFAULT '',
+ `site_location` char(255) NOT NULL DEFAULT '',
PRIMARY KEY (`site_url`),
KEY `site_flags` (`site_flags`),
KEY `site_update` (`site_update`),
- KEY `site_directory` (`site_directory`)
+ KEY `site_directory` (`site_directory`),
+ KEY `site_register` (`site_register`),
+ KEY `site_access` (`site_access`),
+ KEY `site_sellpage` (`site_sellpage`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+CREATE TABLE IF NOT EXISTS `source` (
+ `src_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `src_channel_id` int(10) unsigned NOT NULL DEFAULT '0',
+ `src_channel_xchan` char(255) NOT NULL DEFAULT '',
+ `src_xchan` char(255) NOT NULL DEFAULT '',
+ `src_patt` mediumtext NOT NULL,
+ PRIMARY KEY (`src_id`),
+ KEY `src_channel_id` (`src_channel_id`),
+ KEY `src_channel_xchan` (`src_channel_xchan`),
+ KEY `src_xchan` (`src_xchan`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
CREATE TABLE IF NOT EXISTS `spam` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`uid` int(11) NOT NULL,
@@ -834,6 +856,15 @@ CREATE TABLE IF NOT EXISTS `spam` (
KEY `term` (`term`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+CREATE TABLE IF NOT EXISTS `sys_perms` (
+ `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `cat` char(255) NOT NULL,
+ `k` char(255) NOT NULL,
+ `v` mediumtext NOT NULL,
+ `public_perm` tinyint(1) unsigned NOT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
CREATE TABLE IF NOT EXISTS `term` (
`tid` int(10) unsigned NOT NULL AUTO_INCREMENT,
`aid` int(10) unsigned NOT NULL DEFAULT '0',
@@ -843,20 +874,26 @@ CREATE TABLE IF NOT EXISTS `term` (
`type` tinyint(3) unsigned NOT NULL,
`term` char(255) NOT NULL,
`url` char(255) NOT NULL,
+ `imgurl` char(255) NOT NULL,
+ `term_hash` char(255) NOT NULL DEFAULT '',
+ `parent_hash` char(255) NOT NULL DEFAULT '',
PRIMARY KEY (`tid`),
KEY `oid` (`oid`),
KEY `otype` (`otype`),
KEY `type` (`type`),
KEY `term` (`term`),
KEY `uid` (`uid`),
- KEY `aid` (`aid`)
+ KEY `aid` (`aid`),
+ KEY `imgurl` (`imgurl`),
+ KEY `term_hash` (`term_hash`),
+ KEY `parent_hash` (`parent_hash`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `tokens` (
`id` varchar(40) NOT NULL,
`secret` text NOT NULL,
`client_id` varchar(20) NOT NULL,
- `expires` int(11) NOT NULL,
+ `expires` bigint(20) unsigned NOT NULL,
`scope` varchar(200) NOT NULL,
`uid` int(11) NOT NULL,
PRIMARY KEY (`id`),
@@ -865,6 +902,23 @@ CREATE TABLE IF NOT EXISTS `tokens` (
KEY `uid` (`uid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+CREATE TABLE IF NOT EXISTS `updates` (
+ `ud_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `ud_hash` char(128) NOT NULL,
+ `ud_guid` char(255) NOT NULL DEFAULT '',
+ `ud_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
+ `ud_last` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
+ `ud_flags` int(11) NOT NULL DEFAULT '0',
+ `ud_addr` char(255) NOT NULL DEFAULT '',
+ PRIMARY KEY (`ud_id`),
+ KEY `ud_date` (`ud_date`),
+ KEY `ud_guid` (`ud_guid`),
+ KEY `ud_hash` (`ud_hash`),
+ KEY `ud_flags` (`ud_flags`),
+ KEY `ud_addr` (`ud_addr`),
+ KEY `ud_last` (`ud_last`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
CREATE TABLE IF NOT EXISTS `verify` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`channel` int(10) unsigned NOT NULL DEFAULT '0',
@@ -880,6 +934,18 @@ CREATE TABLE IF NOT EXISTS `verify` (
KEY `created` (`created`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+CREATE TABLE IF NOT EXISTS `vote` (
+ `vote_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `vote_poll` int(11) NOT NULL DEFAULT '0',
+ `vote_element` int(11) NOT NULL DEFAULT '0',
+ `vote_result` text NOT NULL,
+ `vote_xchan` char(255) NOT NULL DEFAULT '',
+ PRIMARY KEY (`vote_id`),
+ UNIQUE KEY `vote_vote` (`vote_poll`,`vote_element`,`vote_xchan`),
+ KEY `vote_poll` (`vote_poll`),
+ KEY `vote_element` (`vote_element`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
CREATE TABLE IF NOT EXISTS `xchan` (
`xchan_hash` char(255) NOT NULL,
`xchan_guid` char(255) NOT NULL DEFAULT '',
@@ -892,8 +958,11 @@ CREATE TABLE IF NOT EXISTS `xchan` (
`xchan_addr` char(255) NOT NULL DEFAULT '',
`xchan_url` char(255) NOT NULL DEFAULT '',
`xchan_connurl` char(255) NOT NULL DEFAULT '',
+ `xchan_follow` char(255) NOT NULL DEFAULT '',
+ `xchan_connpage` char(255) NOT NULL DEFAULT '',
`xchan_name` char(255) NOT NULL DEFAULT '',
`xchan_network` char(255) NOT NULL DEFAULT '',
+ `xchan_instance_url` char(255) NOT NULL DEFAULT '',
`xchan_flags` int(10) unsigned NOT NULL DEFAULT '0',
`xchan_photo_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`xchan_name_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
@@ -904,7 +973,30 @@ CREATE TABLE IF NOT EXISTS `xchan` (
KEY `xchan_network` (`xchan_network`),
KEY `xchan_url` (`xchan_url`),
KEY `xchan_flags` (`xchan_flags`),
- KEY `xchan_connurl` (`xchan_connurl`)
+ KEY `xchan_connurl` (`xchan_connurl`),
+ KEY `xchan_instance_url` (`xchan_instance_url`),
+ KEY `xchan_follow` (`xchan_follow`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+CREATE TABLE IF NOT EXISTS `xconfig` (
+ `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `xchan` char(255) NOT NULL,
+ `cat` char(255) NOT NULL,
+ `k` char(255) NOT NULL,
+ `v` mediumtext NOT NULL,
+ PRIMARY KEY (`id`),
+ KEY `xchan` (`xchan`),
+ KEY `cat` (`cat`),
+ KEY `k` (`k`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+CREATE TABLE IF NOT EXISTS `xign` (
+ `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `uid` int(11) NOT NULL DEFAULT '0',
+ `xchan` char(255) NOT NULL DEFAULT '',
+ PRIMARY KEY (`id`),
+ KEY `uid` (`uid`),
+ KEY `xchan` (`xchan`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `xlink` (
@@ -918,10 +1010,11 @@ CREATE TABLE IF NOT EXISTS `xlink` (
KEY `xlink_link` (`xlink_link`),
KEY `xlink_updated` (`xlink_updated`),
KEY `xlink_rating` (`xlink_rating`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `xprof` (
`xprof_hash` char(255) NOT NULL,
+ `xprof_age` tinyint(3) unsigned NOT NULL DEFAULT '0',
`xprof_desc` char(255) NOT NULL DEFAULT '',
`xprof_dob` char(12) NOT NULL DEFAULT '',
`xprof_gender` char(255) NOT NULL DEFAULT '',
@@ -932,6 +1025,9 @@ CREATE TABLE IF NOT EXISTS `xprof` (
`xprof_postcode` char(32) NOT NULL DEFAULT '',
`xprof_country` char(255) NOT NULL DEFAULT '',
`xprof_keywords` text NOT NULL,
+ `xprof_about` text NOT NULL,
+ `xprof_homepage` char(255) NOT NULL DEFAULT '',
+ `xprof_hometown` char(255) NOT NULL DEFAULT '',
PRIMARY KEY (`xprof_hash`),
KEY `xprof_desc` (`xprof_desc`),
KEY `xprof_dob` (`xprof_dob`),
@@ -941,12 +1037,18 @@ CREATE TABLE IF NOT EXISTS `xprof` (
KEY `xprof_locale` (`xprof_locale`),
KEY `xprof_region` (`xprof_region`),
KEY `xprof_postcode` (`xprof_postcode`),
- KEY `xprof_country` (`xprof_country`)
+ KEY `xprof_country` (`xprof_country`),
+ KEY `xprof_age` (`xprof_age`),
+ KEY `xprof_hometown` (`xprof_hometown`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `xtag` (
+ `xtag_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`xtag_hash` char(255) NOT NULL,
`xtag_term` char(255) NOT NULL DEFAULT '',
- PRIMARY KEY (`xtag_hash`),
- KEY `xtag_term` (`xtag_term`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+ `xtag_flags` int(11) NOT NULL DEFAULT '0',
+ PRIMARY KEY (`xtag_id`),
+ KEY `xtag_term` (`xtag_term`),
+ KEY `xtag_hash` (`xtag_hash`),
+ KEY `xtag_flags` (`xtag_flags`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
diff --git a/install/htconfig.sample.php b/install/htconfig.sample.php
index ebfc84543..33258cf41 100644..100755
--- a/install/htconfig.sample.php
+++ b/install/htconfig.sample.php
@@ -12,11 +12,26 @@
// Then set the following for your MySQL installation
-$db_host = 'your.mysqlhost.com';
+$db_host = 'your.mysqlhost.com'; // Use 'localhost' if you aren't using a remote server
+$db_port = 0; // leave 0 for default or set your port
$db_user = 'mysqlusername';
$db_pass = 'mysqlpassword';
$db_data = 'mysqldatabasename';
+
+/*
+ * Notice: Many of the following settings will be available in the admin panel
+ * after a successful site install. Once they are set in the admin panel, they
+ * are stored in the DB - and the DB setting will over-ride any corresponding
+ * setting in this file
+ *
+ * The command-line tool util/config is able to query and set the DB items
+ * directly if for some reason the admin panel is not available and a system
+ * setting requires modification.
+ *
+ */
+
+
// Choose a legal default timezone. If you are unsure, use "America/Los_Angeles".
// It can be changed later and only applies to timestamps for anonymous viewers.
@@ -24,7 +39,10 @@ $default_timezone = 'America/Los_Angeles';
// What is your site name?
-$a->config['sitename'] = "Friendica Social Network";
+$a->config['system']['baseurl'] = 'https://myredsite.example';
+$a->config['system']['sitename'] = "Red Matrix";
+$a->config['system']['location_hash'] = 'if the auto install failed, put a unique random string here';
+
// Your choices are REGISTER_OPEN, REGISTER_APPROVE, or REGISTER_CLOSED.
// Be certain to create your own personal account before setting
@@ -37,20 +55,12 @@ $a->config['sitename'] = "Friendica Social Network";
// must precisely match the email address of the person logged in.
$a->config['system']['register_policy'] = REGISTER_OPEN;
-$a->config['register_text'] = '';
+$a->config['system']['register_text'] = '';
$a->config['system']['admin_email'] = '';
-// Maximum size of an imported message, 0 is unlimited
-
-$a->config['max_import_size'] = 200000;
-
-// maximum size of uploaded photos
-
-$a->config['system']['maximagesize'] = 800000;
-
// Location of PHP command line processor
-$a->config['php_path'] = 'php';
+$a->config['system']['php_path'] = 'php';
// Configure how we communicate with directory servers.
@@ -62,17 +72,13 @@ $a->config['php_path'] = 'php';
$a->config['system']['directory_mode'] = DIRECTORY_MODE_NORMAL;
-// PuSH - aka pubsubhubbub URL. This makes delivery of public posts as fast as private posts
-
-$a->config['system']['huburl'] = 'http://pubsubhubbub.appspot.com';
-
-// allowed themes (change this from admin panel after installation)
-
-$a->config['system']['allowed_themes'] = 'redbasic';
-
-// default system theme
-
-$a->config['system']['theme'] = 'redbasic';
-
-
+// PHP error logging setup
+// Before doing this ensure that the webserver has permission
+// to create and write to php.out in the top level Red directory,
+// or change the name (below) to a file/path where this is allowed.
+// Uncomment the following 4 lines to turn on PHP error logging.
+//error_reporting(E_ERROR | E_WARNING | E_PARSE );
+//ini_set('error_log','php.out');
+//ini_set('log_errors','1');
+//ini_set('display_errors', '0');
diff --git a/install/update.php b/install/update.php
index c40dd1982..022d7f0dc 100644
--- a/install/update.php
+++ b/install/update.php
@@ -1,6 +1,6 @@
<?php
-define( 'UPDATE_VERSION' , 1031 );
+define( 'UPDATE_VERSION' , 1091 );
/**
*
@@ -52,7 +52,7 @@ function update_r1001() {
`meta` CHAR( 255 ) NOT NULL DEFAULT '',
`created` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY ( `id` )
- ) ENGINE = MYISAM ");
+ ) ENGINE = MYISAM DEFAULT CHARSET=utf8");
$r2 = q("alter table `verify` add index (`channel`), add index (`type`), add index (`token`),
add index (`meta`), add index (`created`)");
@@ -91,7 +91,7 @@ function update_r1004() {
`site_update` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
`site_directory` CHAR( 255 ) NOT NULL DEFAULT '',
PRIMARY KEY ( `site_url` )
-) ENGINE = MYISAM ");
+) ENGINE = MYISAM DEFAULT CHARSET=utf8");
$r2 = q("alter table site add index (site_flags), add index (site_update), add index (site_directory) ");
@@ -204,7 +204,7 @@ function update_r1013() {
`xlink_xchan` CHAR( 255 ) NOT NULL DEFAULT '',
`xlink_link` CHAR( 255 ) NOT NULL DEFAULT '',
`xlink_updated` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00'
-) ENGINE = MYISAM ");
+) ENGINE = MYISAM DEFAULT CHARSET=utf8");
$r2 = q("alter table xlink add index ( xlink_xchan ), add index ( xlink_link ), add index ( xlink_updated ) ");
if($r && $r2)
@@ -367,7 +367,7 @@ ADD INDEX ( `channel_deleted` ) ");
}
function update_r1030() {
- $r = q("CREATE TABLE IF NOT EXISTS`issue` (
+ $r = q("CREATE TABLE IF NOT EXISTS `issue` (
`issue_id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`issue_created` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
`issue_updated` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
@@ -381,9 +381,616 @@ KEY `issue_assigned` (`issue_assigned`),
KEY `issue_priority` (`issue_priority`),
KEY `issue_status` (`issue_status`),
KEY `issue_component` (`issue_component`)
-) ENGINE = MYISAM ");
+) ENGINE = MYISAM DEFAULT CHARSET=utf8");
if($r)
return UPDATE_SUCCESS;
return UPDATE_FAILED;
}
+
+function update_r1031() {
+ $r = q("ALTER TABLE `account` ADD `account_external` CHAR( 255 ) NOT NULL DEFAULT '' AFTER `account_email` ,
+ADD INDEX ( `account_external` )");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+
+function update_r1032() {
+ $r = q("CREATE TABLE if not exists `xign` (
+`id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
+`uid` INT NOT NULL DEFAULT '0',
+`xchan` CHAR( 255 ) NOT NULL DEFAULT '',
+KEY `uid` (`uid`),
+KEY `xchan` (`xchan`)
+) ENGINE = MYISAM DEFAULT CHARSET = utf8");
+
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1033() {
+ $r = q("CREATE TABLE if not exists `shares` (
+`share_id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
+`share_type` INT NOT NULL DEFAULT '0',
+`share_target` INT UNSIGNED NOT NULL DEFAULT '0',
+`share_xchan` CHAR( 255 ) NOT NULL DEFAULT '',
+KEY `share_type` (`share_type`),
+KEY `share_target` (`share_target`),
+KEY `share_xchan` (`share_xchan`)
+) ENGINE = MYISAM DEFAULT CHARSET = utf8");
+
+ // if these fail don't bother reporting it
+
+ q("drop table gcign");
+ q("drop table gcontact");
+ q("drop table glink");
+
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1034() {
+ $r = q("CREATE TABLE if not exists `updates` (
+`ud_hash` CHAR( 128 ) NOT NULL ,
+`ud_date` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
+PRIMARY KEY ( `ud_hash` ),
+KEY `ud_date` ( `ud_date` )
+) ENGINE = MYISAM DEFAULT CHARSET = utf8");
+
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1035() {
+ $r = q("CREATE TABLE if not exists `xconfig` (
+`id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
+`xchan` CHAR( 255 ) NOT NULL ,
+`cat` CHAR( 255 ) NOT NULL ,
+`k` CHAR( 255 ) NOT NULL ,
+`v` MEDIUMTEXT NOT NULL,
+KEY `xchan` ( `xchan` ),
+KEY `cat` ( `cat` ),
+KEY `k` ( `k` )
+) ENGINE = MYISAM DEFAULT CHARSET = utf8");
+
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1036() {
+ $r = q("ALTER TABLE `profile` ADD `channels` TEXT NOT NULL AFTER `contact` ");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+
+}
+
+
+function update_r1037() {
+ $r1 = q("ALTER TABLE `item` CHANGE `uri` `mid` CHAR( 255 ) CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL DEFAULT '',
+CHANGE `parent_uri` `parent_mid` CHAR( 255 ) CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL DEFAULT '',
+ DROP INDEX `uri` ,
+ADD INDEX `mid` ( `mid` ),
+DROP INDEX `parent_uri` ,
+ADD INDEX `parent_mid` ( `parent_mid` ),
+ DROP INDEX `uid_uri` ,
+ADD INDEX `uid_mid` ( `mid` , `uid` ) ");
+
+ $r2 = q("ALTER TABLE `mail` CHANGE `uri` `mid` CHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
+CHANGE `parent_uri` `parent_mid` CHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
+DROP INDEX `uri` ,
+ADD INDEX `mid` ( `mid` ),
+ DROP INDEX `parent_uri` ,
+ADD INDEX `parent_mid` ( `parent_mid` ) ");
+
+ if($r1 && $r2)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+
+function update_r1038() {
+ $r = q("ALTER TABLE `manage` CHANGE `mid` `xchan` CHAR( 255 ) NOT NULL DEFAULT '', drop index `mid`, ADD INDEX ( `xchan` )");
+
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+
+}
+
+
+function update_r1039() {
+ $r = q("ALTER TABLE `channel` CHANGE `channel_default_gid` `channel_default_group` CHAR( 255 ) NOT NULL DEFAULT ''");
+
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+
+}
+
+function update_r1040() {
+ $r1 = q("ALTER TABLE `session` CHANGE `expire` `expire` BIGINT UNSIGNED NOT NULL ");
+ $r2 = q("ALTER TABLE `tokens` CHANGE `expires` `expires` BIGINT UNSIGNED NOT NULL ");
+
+ if($r1 && $r2)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1041() {
+ $r = q("ALTER TABLE `outq` ADD `outq_driver` CHAR( 32 ) NOT NULL DEFAULT '' AFTER `outq_channel` ");
+
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+
+function update_r1042() {
+ $r = q("ALTER TABLE `hubloc` ADD `hubloc_updated` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
+ADD `hubloc_connected` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00', ADD INDEX ( `hubloc_updated` ), ADD INDEX ( `hubloc_connected` )");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+
+function update_r1043() {
+ $r = q("ALTER TABLE `item` ADD `comment_policy` CHAR( 255 ) NOT NULL DEFAULT '' AFTER `coord` ,
+ADD INDEX ( `comment_policy` ) ");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1044() {
+ $r = q("ALTER TABLE `term` ADD `imgurl` CHAR( 255 ) NOT NULL ,
+ADD INDEX ( `imgurl` ) ");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1045() {
+ $r = q("ALTER TABLE `site` ADD `site_register` INT NOT NULL DEFAULT '0',
+ADD INDEX ( `site_register` ) ");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1046() {
+ $r = q("ALTER TABLE `term` ADD `term_hash` CHAR( 255 ) NOT NULL DEFAULT '',
+ADD INDEX ( `term_hash` ) ");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1047() {
+ $r = q("ALTER TABLE `xprof` ADD `xprof_age` TINYINT( 3 ) UNSIGNED NOT NULL DEFAULT '0' AFTER `xprof_hash` ,
+ADD INDEX ( `xprof_age` ) ");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1048() {
+ $r = q("CREATE TABLE IF NOT EXISTS `obj` (
+ `obj_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `obj_page` char(64) NOT NULL DEFAULT '',
+ `obj_verb` char(255) NOT NULL DEFAULT '',
+ `obj_type` int(10) unsigned NOT NULL DEFAULT '0',
+ `obj_obj` char(255) NOT NULL DEFAULT '',
+ `obj_channel` int(10) unsigned NOT NULL DEFAULT '0',
+ PRIMARY KEY (`obj_id`),
+ KEY `obj_verb` (`obj_verb`),
+ KEY `obj_page` (`obj_page`),
+ KEY `obj_type` (`obj_type`),
+ KEY `obj_channel` (`obj_channel`),
+ KEY `obj_obj` (`obj_obj`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ");
+
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+
+function update_r1049() {
+ $r = q("ALTER TABLE `term` ADD `parent_hash` CHAR( 255 ) NOT NULL DEFAULT '' AFTER `term_hash` , ADD INDEX ( `parent_hash` ) ");
+
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1050() {
+ $r = q("ALTER TABLE `xtag` DROP PRIMARY KEY , ADD `xtag_id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST , ADD INDEX ( `xtag_hash` ) ");
+
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1051() {
+ $r = q("ALTER TABLE `photo` ADD `photo_flags` INT UNSIGNED NOT NULL DEFAULT '0' AFTER `profile` , ADD INDEX ( `photo_flags` ) ");
+
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+
+function update_r1052() {
+ $r = q("ALTER TABLE `channel` ADD UNIQUE (`channel_address`) ");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1053() {
+ $r = q("ALTER TABLE `profile` ADD `chandesc` TEXT NOT NULL DEFAULT '' AFTER `pdesc` ");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1054() {
+ $r = q("ALTER TABLE `item` CHANGE `title` `title` TEXT CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' ");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1055() {
+ $r = q("ALTER TABLE `mail` CHANGE `title` `title` TEXT CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' ");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1056() {
+ $r = q("ALTER TABLE `xchan` ADD `xchan_instance_url` CHAR( 255 ) NOT NULL DEFAULT '' AFTER `xchan_network` ,
+ADD INDEX ( `xchan_instance_url` ) ");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1057() {
+ $r = q("drop table intro");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1058() {
+ $r1 = q("ALTER TABLE `menu` ADD `menu_name` CHAR( 255 ) NOT NULL DEFAULT '' AFTER `menu_channel_id` ,
+ADD INDEX ( `menu_name` ) ");
+
+ $r2 = q("ALTER TABLE `menu_item` ADD `mitem_flags` INT NOT NULL DEFAULT '0' AFTER `mitem_desc` ,
+ADD INDEX ( `mitem_flags` ) ");
+
+ if($r1 && $r2)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1059() {
+ $r = q("ALTER TABLE `mail` ADD `attach` MEDIUMTEXT NOT NULL DEFAULT '' AFTER `body` ");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1060() {
+
+ $r = q("CREATE TABLE IF NOT EXISTS `vote` (
+ `vote_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `vote_poll` int(11) NOT NULL DEFAULT '0',
+ `vote_element` int(11) NOT NULL DEFAULT '0',
+ `vote_result` text NOT NULL,
+ `vote_xchan` char(255) NOT NULL DEFAULT '',
+ PRIMARY KEY (`vote_id`),
+ UNIQUE KEY `vote_vote` (`vote_poll`,`vote_element`,`vote_xchan`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ");
+
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1061() {
+ $r = q("ALTER TABLE `vote` ADD INDEX ( `vote_poll` ), ADD INDEX ( `vote_element` ) ");
+
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1062() {
+ $r1 = q("CREATE TABLE IF NOT EXISTS `poll` (
+`poll_id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
+`poll_channel` INT UNSIGNED NOT NULL DEFAULT '0',
+`poll_desc` TEXT NOT NULL DEFAULT '',
+`poll_flags` INT NOT NULL DEFAULT '0',
+`poll_votes` INT NOT NULL DEFAULT '0',
+KEY `poll_channel` (`poll_channel`),
+KEY `poll_flags` (`poll_flags`),
+KEY `poll_votes` (`poll_votes`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ");
+
+ $r2 = q("CREATE TABLE IF NOT EXISTS `poll_elm` (
+`pelm_id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
+`pelm_poll` INT UNSIGNED NOT NULL DEFAULT '0',
+`pelm_desc` TEXT NOT NULL DEFAULT '',
+`pelm_flags` INT NOT NULL DEFAULT '0',
+`pelm_result` FLOAT NOT NULL DEFAULT '0',
+KEY `pelm_poll` (`pelm_poll`),
+KEY `pelm_result` (`pelm_result`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ");
+
+ if($r1 && $r2)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1063() {
+ $r = q("ALTER TABLE `xchan` ADD `xchan_follow` CHAR( 255 ) NOT NULL DEFAULT '' AFTER `xchan_connurl` ,
+ADD `xchan_connpage` CHAR( 255 ) NOT NULL DEFAULT '' AFTER `xchan_follow` ,
+ADD INDEX ( `xchan_follow` ), ADD INDEX ( `xchan_connpage`) ");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1064() {
+ $r = q("ALTER TABLE `updates` ADD `ud_guid` CHAR( 255 ) NOT NULL DEFAULT '' AFTER `ud_hash` ,
+ADD INDEX ( `ud_guid` )");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1065() {
+ $r = q("ALTER TABLE `item` DROP `wall`, ADD `layout_mid` CHAR( 255 ) NOT NULL DEFAULT '' AFTER `target` ,
+ADD INDEX ( `layout_mid` ) ");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1066() {
+ $r = q("ALTER TABLE `site` ADD `site_access` INT NOT NULL DEFAULT '0' AFTER `site_url` ,
+ADD INDEX ( `site_access` )");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1067() {
+ $r = q("ALTER TABLE `updates` DROP PRIMARY KEY , ADD `ud_id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST, ADD INDEX ( `ud_hash` ) ");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1068(){
+ $r = q("ALTER TABLE `hubloc` ADD `hubloc_status` INT UNSIGNED NOT NULL DEFAULT '0' AFTER `hubloc_flags` , ADD INDEX ( `hubloc_status` )");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1069() {
+ $r = q("ALTER TABLE `site` ADD `site_sellpage` CHAR( 255 ) NOT NULL DEFAULT '',
+ADD INDEX ( `site_sellpage` )");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1070() {
+ $r = q("ALTER TABLE `updates` ADD `ud_flags` INT NOT NULL DEFAULT '0',
+ADD INDEX ( `ud_flags` )");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1071() {
+ $r = q("ALTER TABLE `updates` ADD `ud_addr` CHAR( 255 ) NOT NULL DEFAULT '',
+ADD INDEX ( `ud_addr` ) ");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1072() {
+ $r = q("ALTER TABLE `xtag` ADD `xtag_flags` INT NOT NULL DEFAULT '0',
+ADD INDEX ( `xtag_flags` ) ");
+
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+
+function update_r1073() {
+ $r1 = q("CREATE TABLE IF NOT EXISTS `source` (
+`src_id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
+`src_channel_id` INT UNSIGNED NOT NULL DEFAULT '0',
+`src_channel_xchan` CHAR( 255 ) NOT NULL DEFAULT '',
+`src_xchan` CHAR( 255 ) NOT NULL DEFAULT '',
+`src_patt` MEDIUMTEXT NOT NULL DEFAULT ''
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ");
+
+ $r2 = q("ALTER TABLE `source` ADD INDEX ( `src_channel_id` ), ADD INDEX ( `src_channel_xchan` ), ADD INDEX ( `src_xchan` ) ");
+
+ if($r1 && $r2)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1074() {
+ $r1 = q("ALTER TABLE `site` ADD `site_sync` DATETIME NOT NULL AFTER `site_update` ");
+
+ $r2 = q("ALTER TABLE `updates` ADD `ud_last` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' AFTER `ud_date` ,
+ADD INDEX ( `ud_last` ) ");
+
+ if($r1 && $r2)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+
+function update_r1075() {
+ $r = q("ALTER TABLE `channel` ADD `channel_a_republish` INT UNSIGNED NOT NULL DEFAULT '128',
+ADD INDEX ( `channel_a_republish` )");
+
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1076() {
+ $r = q("ALTER TABLE `item` CHANGE `inform` `sig` TEXT CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' ");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1077() {
+ $r = q("ALTER TABLE `item` ADD `source_xchan` CHAR( 255 ) NOT NULL DEFAULT '' AFTER `author_xchan` ");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1078() {
+ $r = q("ALTER TABLE `channel` ADD `channel_dirdate` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' AFTER `channel_pageflags` , ADD INDEX ( `channel_dirdate` )");
+
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1079() {
+ $r = q("ALTER TABLE `site` ADD `site_location` CHAR( 255 ) NOT NULL DEFAULT ''");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1080() {
+ $r = q("ALTER TABLE `mail` ADD `expires` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
+ADD INDEX ( `expires` ) ");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1081() {
+ $r = q("DROP TABLE `queue` ");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1082() {
+ $r = q("DROP TABLE `challenge` ");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1083() {
+ $r = q("ALTER TABLE `notify` ADD `aid` INT NOT NULL AFTER `msg` ,
+ADD INDEX ( `aid` )");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1084() {
+
+
+ $r = q("CREATE TABLE if not exists `sys_perms` (
+ `id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
+ `cat` CHAR( 255 ) NOT NULL ,
+ `k` CHAR( 255 ) NOT NULL ,
+ `v` MEDIUMTEXT NOT NULL,
+ `public_perm` TINYINT( 1 ) UNSIGNED NOT NULL
+) ENGINE = MYISAM DEFAULT CHARSET = utf8");
+
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+
+}
+
+function update_r1085() {
+ $r1 = q("ALTER TABLE `photo` CHANGE `desc` `description` TEXT CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ");
+
+ $r2 = q("RENAME TABLE `group` TO `groups`");
+
+ $r3 = q("ALTER TABLE `event` CHANGE `desc` `description` TEXT CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ");
+
+ if($r1 && $r2 && $r3)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+
+}
+
+function update_r1086() {
+ $r = q("ALTER TABLE `account` ADD `account_level` INT UNSIGNED NOT NULL DEFAULT '0',
+ADD INDEX ( `account_level` )");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1087() {
+ $r = q("ALTER TABLE `xprof` ADD `xprof_about` TEXT NOT NULL DEFAULT '',
+ADD `xprof_homepage` CHAR( 255 ) NOT NULL DEFAULT '',
+ADD `xprof_hometown` CHAR( 255 ) NOT NULL DEFAULT '',
+ADD INDEX ( `xprof_hometown` )");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1088() {
+ $r = q("ALTER TABLE `obj` ADD `allow_cid` MEDIUMTEXT NOT NULL DEFAULT '',
+ADD `allow_gid` MEDIUMTEXT NOT NULL DEFAULT '',
+ADD `deny_cid` MEDIUMTEXT NOT NULL DEFAULT '',
+ADD `deny_gid` MEDIUMTEXT NOT NULL DEFAULT ''");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1089() {
+ $r = q("ALTER TABLE `attach` ADD `creator` CHAR( 128 ) NOT NULL DEFAULT '' AFTER `hash` ,
+ADD INDEX ( `creator` ) ");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+
+function update_r1090() {
+ $r = q("ALTER TABLE `menu` ADD `menu_flags` INT NOT NULL DEFAULT '0',
+ADD INDEX ( `menu_flags` )");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
diff --git a/js/acl.js b/js/acl.js
deleted file mode 100644
index 3eb6a65a4..000000000
--- a/js/acl.js
+++ /dev/null
@@ -1,258 +0,0 @@
-function ACL(backend_url, preset){
- that = this;
-
- that.url = backend_url;
-
- that.kp_timer = null;
-
- if (preset==undefined) preset = [];
- that.allow_cid = (preset[0] || []);
- that.allow_gid = (preset[1] || []);
- that.deny_cid = (preset[2] || []);
- that.deny_gid = (preset[3] || []);
- that.group_uids = [];
- that.nw = 4; //items per row. should be calulated from #acl-list.width
-
- that.list_content = $("#acl-list-content");
- that.item_tpl = unescape($(".acl-list-item[rel=acl-template]").html());
- that.showall = $("#acl-showall");
-
- if (preset.length==0) that.showall.addClass("selected");
-
- /*events*/
- that.showall.click(that.on_showall);
- $(".acl-button-show").live('click', that.on_button_show);
- $(".acl-button-hide").live('click', that.on_button_hide);
- $("#acl-search").keypress(that.on_search);
- $("#acl-wrapper").parents("form").submit(that.on_submit);
-
- /* startup! */
- that.get(0,100);
-}
-
-ACL.prototype.on_submit = function(){
- aclfileds = $("#acl-fields").html("");
- $(that.allow_gid).each(function(i,v){
- aclfileds.append("<input type='hidden' name='group_allow[]' value='"+v+"'>");
- });
- $(that.allow_cid).each(function(i,v){
- aclfileds.append("<input type='hidden' name='contact_allow[]' value='"+v+"'>");
- });
- $(that.deny_gid).each(function(i,v){
- aclfileds.append("<input type='hidden' name='group_deny[]' value='"+v+"'>");
- });
- $(that.deny_cid).each(function(i,v){
- aclfileds.append("<input type='hidden' name='contact_deny[]' value='"+v+"'>");
- });
-}
-
-ACL.prototype.search = function(){
- var srcstr = $("#acl-search").val();
- that.list_content.html("");
- that.get(0,100, srcstr);
-}
-
-ACL.prototype.on_search = function(event){
- if (that.kp_timer) clearTimeout(that.kp_timer);
- that.kp_timer = setTimeout( that.search, 1000);
-}
-
-ACL.prototype.on_showall = function(event){
- event.preventDefault()
- event.stopPropagation();
-
- if (that.showall.hasClass("selected")){
- return false;
- }
- that.showall.addClass("selected");
-
- that.allow_cid = [];
- that.allow_gid = [];
- that.deny_cid = [];
- that.deny_gid = [];
-
- that.update_view();
-
- return false;
-}
-
-ACL.prototype.on_button_show = function(event){
- event.preventDefault()
- event.stopImmediatePropagation()
- event.stopPropagation();
-
- /*that.showall.removeClass("selected");
- $(this).siblings(".acl-button-hide").removeClass("selected");
- $(this).toggleClass("selected");*/
-
- that.set_allow($(this).parent().attr('id'));
-
- return false;
-}
-ACL.prototype.on_button_hide = function(event){
- event.preventDefault()
- event.stopImmediatePropagation()
- event.stopPropagation();
-
- /*that.showall.removeClass("selected");
- $(this).siblings(".acl-button-show").removeClass("selected");
- $(this).toggleClass("selected");*/
-
- that.set_deny($(this).parent().attr('id'));
-
- return false;
-}
-
-ACL.prototype.set_allow = function(itemid){
- type = itemid[0];
- id = itemid.substr(1);
- switch(type){
- case "g":
- if (that.allow_gid.indexOf(id)<0){
- that.allow_gid.push(id)
- }else {
- that.allow_gid.remove(id);
- }
- if (that.deny_gid.indexOf(id)>=0) that.deny_gid.remove(id);
- break;
- case "c":
- if (that.allow_cid.indexOf(id)<0){
- that.allow_cid.push(id)
- } else {
- that.allow_cid.remove(id);
- }
- if (that.deny_cid.indexOf(id)>=0) that.deny_cid.remove(id);
- break;
- }
- that.update_view();
-}
-
-ACL.prototype.set_deny = function(itemid){
- type = itemid[0];
- id = itemid.substr(1);
- switch(type){
- case "g":
- if (that.deny_gid.indexOf(id)<0){
- that.deny_gid.push(id)
- } else {
- that.deny_gid.remove(id);
- }
- if (that.allow_gid.indexOf(id)>=0) that.allow_gid.remove(id);
- break;
- case "c":
- if (that.deny_cid.indexOf(id)<0){
- that.deny_cid.push(id)
- } else {
- that.deny_cid.remove(id);
- }
- if (that.allow_cid.indexOf(id)>=0) that.allow_cid.remove(id);
- break;
- }
- that.update_view();
-}
-
-ACL.prototype.update_view = function(){
- if (that.allow_gid.length==0 && that.allow_cid.length==0 &&
- that.deny_gid.length==0 && that.deny_cid.length==0){
- that.showall.addClass("selected");
- /* jot acl */
- $('#jot-perms-icon').removeClass('lock').addClass('unlock');
- $('#jot-public').show();
- $('.profile-jot-net input').attr('disabled', false);
- if(typeof editor != 'undefined' && editor != false) {
- $('#profile-jot-desc').html(ispublic);
- }
-
- } else {
- that.showall.removeClass("selected");
- /* jot acl */
- $('#jot-perms-icon').removeClass('unlock').addClass('lock');
- $('#jot-public').hide();
- $('.profile-jot-net input').attr('disabled', 'disabled');
- $('#profile-jot-desc').html('&nbsp;');
- }
- $("#acl-list-content .acl-list-item").each(function(){
- $(this).removeClass("groupshow grouphide");
- });
-
- $("#acl-list-content .acl-list-item").each(function(){
- itemid = $(this).attr('id');
- type = itemid[0];
- id = itemid.substr(1);
-
- btshow = $(this).children(".acl-button-show").removeClass("selected");
- bthide = $(this).children(".acl-button-hide").removeClass("selected");
-
- switch(type){
- case "g":
- var uclass = "";
- if (that.allow_gid.indexOf(id)>=0){
- btshow.addClass("selected");
- bthide.removeClass("selected");
- uclass="groupshow";
- }
- if (that.deny_gid.indexOf(id)>=0){
- btshow.removeClass("selected");
- bthide.addClass("selected");
- uclass="grouphide";
- }
-
- $(that.group_uids[id]).each(function(i,v) {
- if(uclass == "grouphide")
- $("#c"+v).removeClass("groupshow");
- if(uclass != "") {
- var cls = $("#c"+v).attr('class');
- if( cls == undefined)
- return true;
- var hiding = cls.indexOf('grouphide');
- if(hiding == -1)
- $("#c"+v).addClass(uclass);
- }
- });
-
- break;
- case "c":
- if (that.allow_cid.indexOf(id)>=0){
- btshow.addClass("selected");
- bthide.removeClass("selected");
- }
- if (that.deny_cid.indexOf(id)>=0){
- btshow.removeClass("selected");
- bthide.addClass("selected");
- }
- }
-
- });
-
-}
-
-
-ACL.prototype.get = function(start,count, search){
- var postdata = {
- start:start,
- count:count,
- search:search,
- }
-
- $.ajax({
- type:'POST',
- url: that.url,
- data: postdata,
- dataType: 'json',
- success:that.populate
- });
-}
-
-ACL.prototype.populate = function(data){
- var height = Math.ceil(data.tot / that.nw) * 42;
- that.list_content.height(height);
- $(data.items).each(function(){
- html = "<div class='acl-list-item {4} {5}' title='{6}' id='{2}{3}'>"+that.item_tpl+"</div>";
- html = html.format( this.photo, this.name, this.type, this.xid, '', this.network, this.link );
- if (this.uids!=undefined) that.group_uids[this.id] = this.uids;
- //console.log(html);
- that.list_content.append(html);
- });
- that.update_view();
-}
-
diff --git a/js/ajaxupload.js b/js/ajaxupload.js
deleted file mode 100644
index 67c4a56fb..000000000
--- a/js/ajaxupload.js
+++ /dev/null
@@ -1,695 +0,0 @@
-/**
- * AJAX Upload ( http://valums.com/ajax-upload/ )
- * Copyright (c) Andris Valums
- * Licensed under the MIT license ( http://valums.com/mit-license/ )
- * Thanks to Gary Haran, David Mark, Corey Burns and others for contributions.
- */
-
-(function () {
- /* global window */
- /* jslint browser: true, devel: true, undef: true, nomen: true, bitwise: true, regexp: true, newcap: true, immed: true */
-
- /**
- * Wrapper for FireBug's console.log
- */
- function log(){
- if (typeof(console) != 'undefined' && typeof(console.log) == 'function'){
- Array.prototype.unshift.call(arguments, '[Ajax Upload]');
- console.log( Array.prototype.join.call(arguments, ' '));
- }
- }
-
- /**
- * Attaches event to a dom element.
- * @param {Element} el
- * @param type event name
- * @param fn callback This refers to the passed element
- */
- function addEvent(el, type, fn){
- if (el.addEventListener) {
- el.addEventListener(type, fn, false);
- } else if (el.attachEvent) {
- el.attachEvent('on' + type, function(){
- fn.call(el);
- });
- } else {
- throw new Error('not supported or DOM not loaded');
- }
- }
-
- /**
- * Attaches resize event to a window, limiting
- * number of event fired. Fires only when encounteres
- * delay of 100 after series of events.
- *
- * Some browsers fire event multiple times when resizing
- * http://www.quirksmode.org/dom/events/resize.html
- *
- * @param fn callback This refers to the passed element
- */
- function addResizeEvent(fn){
- var timeout;
-
- addEvent(window, 'resize', function(){
- if (timeout){
- clearTimeout(timeout);
- }
- timeout = setTimeout(fn, 100);
- });
- }
-
- // Needs more testing, will be rewriten for next version
- // getOffset function copied from jQuery lib (http://jquery.com/)
- if (document.documentElement.getBoundingClientRect){
- // Get Offset using getBoundingClientRect
- // http://ejohn.org/blog/getboundingclientrect-is-awesome/
- var getOffset = function(el){
- var box = el.getBoundingClientRect();
- var doc = el.ownerDocument;
- var body = doc.body;
- var docElem = doc.documentElement; // for ie
- var clientTop = docElem.clientTop || body.clientTop || 0;
- var clientLeft = docElem.clientLeft || body.clientLeft || 0;
-
- // In Internet Explorer 7 getBoundingClientRect property is treated as physical,
- // while others are logical. Make all logical, like in IE8.
- var zoom = 1;
- if (body.getBoundingClientRect) {
- var bound = body.getBoundingClientRect();
- zoom = (bound.right - bound.left) / body.clientWidth;
- }
-
- if (zoom > 1) {
- clientTop = 0;
- clientLeft = 0;
- }
-
- var top = box.top / zoom + (window.pageYOffset || docElem && docElem.scrollTop / zoom || body.scrollTop / zoom) - clientTop, left = box.left / zoom + (window.pageXOffset || docElem && docElem.scrollLeft / zoom || body.scrollLeft / zoom) - clientLeft;
-
- return {
- top: top,
- left: left
- };
- };
- } else {
- // Get offset adding all offsets
- var getOffset = function(el){
- var top = 0, left = 0;
- do {
- top += el.offsetTop || 0;
- left += el.offsetLeft || 0;
- el = el.offsetParent;
- } while (el);
-
- return {
- left: left,
- top: top
- };
- };
- }
-
- /**
- * Returns left, top, right and bottom properties describing the border-box,
- * in pixels, with the top-left relative to the body
- * @param {Element} el
- * @return {Object} Contains left, top, right,bottom
- */
- function getBox(el){
- var left, right, top, bottom;
- var offset = getOffset(el);
- left = offset.left;
- top = offset.top;
-
- right = left + el.offsetWidth;
- bottom = top + el.offsetHeight;
-
- return {
- left: left,
- right: right,
- top: top,
- bottom: bottom
- };
- }
-
- /**
- * Helper that takes object literal
- * and add all properties to element.style
- * @param {Element} el
- * @param {Object} styles
- */
- function addStyles(el, styles){
- for (var name in styles) {
- if (styles.hasOwnProperty(name)) {
- el.style[name] = styles[name];
- }
- }
- }
-
- /**
- * Function places an absolutely positioned
- * element on top of the specified element
- * copying position and dimentions.
- * @param {Element} from
- * @param {Element} to
- */
- function copyLayout(from, to){
- var box = getBox(from);
-
- addStyles(to, {
- position: 'absolute',
- left : box.left + 'px',
- top : box.top + 'px',
- width : from.offsetWidth + 'px',
- height : from.offsetHeight + 'px'
- });
- to.title = from.title;
-
- }
-
- /**
- * Creates and returns element from html chunk
- * Uses innerHTML to create an element
- */
- var toElement = (function(){
- var div = document.createElement('div');
- return function(html){
- div.innerHTML = html;
- var el = div.firstChild;
- return div.removeChild(el);
- };
- })();
-
- /**
- * Function generates unique id
- * @return unique id
- */
- var getUID = (function(){
- var id = 0;
- return function(){
- return 'ValumsAjaxUpload' + id++;
- };
- })();
-
- /**
- * Get file name from path
- * @param {String} file path to file
- * @return filename
- */
- function fileFromPath(file){
- return file.replace(/.*(\/|\\)/, "");
- }
-
- /**
- * Get file extension lowercase
- * @param {String} file name
- * @return file extenstion
- */
- function getExt(file){
- return (-1 !== file.indexOf('.')) ? file.replace(/.*[.]/, '') : '';
- }
-
- function hasClass(el, name){
- var re = new RegExp('\\b' + name + '\\b');
- return re.test(el.className);
- }
- function addClass(el, name){
- if ( ! hasClass(el, name)){
- el.className += ' ' + name;
- }
- }
- function removeClass(el, name){
- var re = new RegExp('\\b' + name + '\\b');
- el.className = el.className.replace(re, '');
- }
-
- function removeNode(el){
- el.parentNode.removeChild(el);
- }
-
- /**
- * Easy styling and uploading
- * @constructor
- * @param button An element you want convert to
- * upload button. Tested dimentions up to 500x500px
- * @param {Object} options See defaults below.
- */
- window.AjaxUpload = function(button, options){
- this._settings = {
- // Location of the server-side upload script
- action: 'upload.php',
- // File upload name
- name: 'userfile',
- // Additional data to send
- data: {},
- // Submit file as soon as it's selected
- autoSubmit: true,
- // The type of data that you're expecting back from the server.
- // html and xml are detected automatically.
- // Only useful when you are using json data as a response.
- // Set to "json" in that case.
- responseType: false,
- // Class applied to button when mouse is hovered
- hoverClass: 'hover',
- // Class applied to button when button is focused
- focusClass: 'focus',
- // Class applied to button when AU is disabled
- disabledClass: 'disabled',
- // When user selects a file, useful with autoSubmit disabled
- // You can return false to cancel upload
- onChange: function(file, extension){
- },
- // Callback to fire before file is uploaded
- // You can return false to cancel upload
- onSubmit: function(file, extension){
- },
- // Fired when file upload is completed
- // WARNING! DO NOT USE "FALSE" STRING AS A RESPONSE!
- onComplete: function(file, response){
- }
- };
-
- // Merge the users options with our defaults
- for (var i in options) {
- if (options.hasOwnProperty(i)){
- this._settings[i] = options[i];
- }
- }
-
- // button isn't necessary a dom element
- if (button.jquery){
- // jQuery object was passed
- button = button[0];
- } else if (typeof button == "string") {
- if (/^#.*/.test(button)){
- // If jQuery user passes #elementId don't break it
- button = button.slice(1);
- }
-
- button = document.getElementById(button);
- }
-
- if ( ! button || button.nodeType !== 1){
- throw new Error("Please make sure that you're passing a valid element");
- }
-
- if ( button.nodeName.toUpperCase() == 'A'){
- // disable link
- addEvent(button, 'click', function(e){
- if (e && e.preventDefault){
- e.preventDefault();
- } else if (window.event){
- window.event.returnValue = false;
- }
- });
- }
-
- // DOM element
- this._button = button;
- // DOM element
- this._input = null;
- // If disabled clicking on button won't do anything
- this._disabled = false;
-
- // if the button was disabled before refresh if will remain
- // disabled in FireFox, let's fix it
- this.enable();
-
- this._rerouteClicks();
- };
-
- // assigning methods to our class
- AjaxUpload.prototype = {
- setData: function(data){
- this._settings.data = data;
- },
- disable: function(){
- addClass(this._button, this._settings.disabledClass);
- this._disabled = true;
-
- var nodeName = this._button.nodeName.toUpperCase();
- if (nodeName == 'INPUT' || nodeName == 'BUTTON'){
- this._button.setAttribute('disabled', 'disabled');
- }
-
- // hide input
- if (this._input){
- // We use visibility instead of display to fix problem with Safari 4
- // The problem is that the value of input doesn't change if it
- // has display none when user selects a file
- this._input.parentNode.style.visibility = 'hidden';
- }
- },
- enable: function(){
- removeClass(this._button, this._settings.disabledClass);
- this._button.removeAttribute('disabled');
- this._disabled = false;
-
- },
- /**
- * Creates invisible file input
- * that will hover above the button
- * <div><input type='file' /></div>
- */
- _createInput: function(){
- var self = this;
-
- var input = document.createElement("input");
- input.setAttribute('type', 'file');
- input.setAttribute('name', this._settings.name);
-
- addStyles(input, {
- 'position' : 'absolute',
- // in Opera only 'browse' button
- // is clickable and it is located at
- // the right side of the input
- 'right' : 0,
- 'margin' : 0,
- 'padding' : 0,
- 'fontSize' : '480px',
- // in Firefox if font-family is set to
- // 'inherit' the input doesn't work
- 'fontFamily' : 'sans-serif',
- 'cursor' : 'pointer'
- });
-
- var div = document.createElement("div");
- addStyles(div, {
- 'display' : 'block',
- 'position' : 'absolute',
- 'overflow' : 'hidden',
- 'margin' : 0,
- 'padding' : 0,
- 'opacity' : 0,
- // Make sure browse button is in the right side
- // in Internet Explorer
- 'direction' : 'ltr',
- //Max zIndex supported by Opera 9.0-9.2
- 'zIndex': 2147483583,
- 'cursor' : 'pointer'
-
- });
-
- // Make sure that element opacity exists.
- // Otherwise use IE filter
- if ( div.style.opacity !== "0") {
- if (typeof(div.filters) == 'undefined'){
- throw new Error('Opacity not supported by the browser');
- }
- div.style.filter = "alpha(opacity=0)";
- }
-
- addEvent(input, 'change', function(){
-
- if ( ! input || input.value === ''){
- return;
- }
-
- // Get filename from input, required
- // as some browsers have path instead of it
- var file = fileFromPath(input.value);
-
- if (false === self._settings.onChange.call(self, file, getExt(file))){
- self._clearInput();
- return;
- }
-
- // Submit form when value is changed
- if (self._settings.autoSubmit) {
- self.submit();
- }
- });
-
- addEvent(input, 'mouseover', function(){
- addClass(self._button, self._settings.hoverClass);
- });
-
- addEvent(input, 'mouseout', function(){
- removeClass(self._button, self._settings.hoverClass);
- removeClass(self._button, self._settings.focusClass);
-
- // We use visibility instead of display to fix problem with Safari 4
- // The problem is that the value of input doesn't change if it
- // has display none when user selects a file
- input.parentNode.style.visibility = 'hidden';
-
- });
-
- addEvent(input, 'focus', function(){
- addClass(self._button, self._settings.focusClass);
- });
-
- addEvent(input, 'blur', function(){
- removeClass(self._button, self._settings.focusClass);
- });
-
- div.appendChild(input);
- document.body.appendChild(div);
-
- this._input = input;
- },
- _clearInput : function(){
- if (!this._input){
- return;
- }
-
- // this._input.value = ''; Doesn't work in IE6
- removeNode(this._input.parentNode);
- this._input = null;
- this._createInput();
-
- removeClass(this._button, this._settings.hoverClass);
- removeClass(this._button, this._settings.focusClass);
- },
- /**
- * Function makes sure that when user clicks upload button,
- * the this._input is clicked instead
- */
- _rerouteClicks: function(){
- var self = this;
-
- // IE will later display 'access denied' error
- // if you use using self._input.click()
- // other browsers just ignore click()
-
- addEvent(self._button, 'mouseover', function(){
- if (self._disabled){
- return;
- }
-
- if ( ! self._input){
- self._createInput();
- }
-
- var div = self._input.parentNode;
- copyLayout(self._button, div);
- div.style.visibility = 'visible';
-
- });
-
-
- // commented because we now hide input on mouseleave
- /**
- * When the window is resized the elements
- * can be misaligned if button position depends
- * on window size
- */
- //addResizeEvent(function(){
- // if (self._input){
- // copyLayout(self._button, self._input.parentNode);
- // }
- //});
-
- },
- /**
- * Creates iframe with unique name
- * @return {Element} iframe
- */
- _createIframe: function(){
- // We can't use getTime, because it sometimes return
- // same value in safari :(
- var id = getUID();
-
- // We can't use following code as the name attribute
- // won't be properly registered in IE6, and new window
- // on form submit will open
- // var iframe = document.createElement('iframe');
- // iframe.setAttribute('name', id);
-
- var iframe = toElement('<iframe src="javascript:false;" name="' + id + '" />');
- // src="javascript:false; was added
- // because it possibly removes ie6 prompt
- // "This page contains both secure and nonsecure items"
- // Anyway, it doesn't do any harm.
- iframe.setAttribute('id', id);
-
- iframe.style.display = 'none';
- document.body.appendChild(iframe);
-
- return iframe;
- },
- /**
- * Creates form, that will be submitted to iframe
- * @param {Element} iframe Where to submit
- * @return {Element} form
- */
- _createForm: function(iframe){
- var settings = this._settings;
-
- // We can't use the following code in IE6
- // var form = document.createElement('form');
- // form.setAttribute('method', 'post');
- // form.setAttribute('enctype', 'multipart/form-data');
- // Because in this case file won't be attached to request
- var form = toElement('<form method="post" enctype="multipart/form-data"></form>');
-
- form.setAttribute('action', settings.action);
- form.setAttribute('target', iframe.name);
- form.style.display = 'none';
- document.body.appendChild(form);
-
- // Create hidden input element for each data key
- for (var prop in settings.data) {
- if (settings.data.hasOwnProperty(prop)){
- var el = document.createElement("input");
- el.setAttribute('type', 'hidden');
- el.setAttribute('name', prop);
- el.setAttribute('value', settings.data[prop]);
- form.appendChild(el);
- }
- }
- return form;
- },
- /**
- * Gets response from iframe and fires onComplete event when ready
- * @param iframe
- * @param file Filename to use in onComplete callback
- */
- _getResponse : function(iframe, file){
- // getting response
- var toDeleteFlag = false, self = this, settings = this._settings;
-
- addEvent(iframe, 'load', function(){
-
- if (// For Safari
- iframe.src == "javascript:'%3Chtml%3E%3C/html%3E';" ||
- // For FF, IE
- iframe.src == "javascript:'<html></html>';"){
- // First time around, do not delete.
- // We reload to blank page, so that reloading main page
- // does not re-submit the post.
-
- if (toDeleteFlag) {
- // Fix busy state in FF3
- setTimeout(function(){
- removeNode(iframe);
- }, 0);
- }
-
- return;
- }
-
- var doc = iframe.contentDocument ? iframe.contentDocument : window.frames[iframe.id].document;
-
- // fixing Opera 9.26,10.00
- if (doc.readyState && doc.readyState != 'complete') {
- // Opera fires load event multiple times
- // Even when the DOM is not ready yet
- // this fix should not affect other browsers
- return;
- }
-
- // fixing Opera 9.64
- if (doc.body && doc.body.innerHTML == "false") {
- // In Opera 9.64 event was fired second time
- // when body.innerHTML changed from false
- // to server response approx. after 1 sec
- return;
- }
-
- var response;
-
- if (doc.XMLDocument) {
- // response is a xml document Internet Explorer property
- response = doc.XMLDocument;
- } else if (doc.body){
- // response is html document or plain text
- response = doc.body.innerHTML;
-
- if (settings.responseType && settings.responseType.toLowerCase() == 'json') {
- // If the document was sent as 'application/javascript' or
- // 'text/javascript', then the browser wraps the text in a <pre>
- // tag and performs html encoding on the contents. In this case,
- // we need to pull the original text content from the text node's
- // nodeValue property to retrieve the unmangled content.
- // Note that IE6 only understands text/html
- if (doc.body.firstChild && doc.body.firstChild.nodeName.toUpperCase() == 'PRE') {
- doc.normalize();
- response = doc.body.firstChild.firstChild.nodeValue;
- }
-
- if (response) {
- response = eval("(" + response + ")");
- } else {
- response = {};
- }
- }
- } else {
- // response is a xml document
- response = doc;
- }
-
- settings.onComplete.call(self, file, response);
-
- // Reload blank page, so that reloading main page
- // does not re-submit the post. Also, remember to
- // delete the frame
- toDeleteFlag = true;
-
- // Fix IE mixed content issue
- iframe.src = "javascript:'<html></html>';";
- });
- },
- /**
- * Upload file contained in this._input
- */
- submit: function(){
- var self = this, settings = this._settings;
-
- if ( ! this._input || this._input.value === ''){
- return;
- }
-
- var file = fileFromPath(this._input.value);
-
- // user returned false to cancel upload
- if (false === settings.onSubmit.call(this, file, getExt(file))){
- this._clearInput();
- return;
- }
-
- // sending request
- var iframe = this._createIframe();
- var form = this._createForm(iframe);
-
- // assuming following structure
- // div -> input type='file'
- removeNode(this._input.parentNode);
- removeClass(self._button, self._settings.hoverClass);
- removeClass(self._button, self._settings.focusClass);
-
- form.appendChild(this._input);
-
- form.submit();
-
- // request set, clean up
- removeNode(form); form = null;
- removeNode(this._input); this._input = null;
-
- // Get response from iframe and fire onComplete event when ready
- this._getResponse(iframe, file);
-
- // get ready for next request
- this._createInput();
- }
- };
-})();
diff --git a/js/fk.autocomplete.js b/js/fk.autocomplete.js
deleted file mode 100644
index fc41f9cbe..000000000
--- a/js/fk.autocomplete.js
+++ /dev/null
@@ -1,194 +0,0 @@
-/**
- * Friendica people autocomplete
- *
- * require jQuery, jquery.textareas
- */
-
-
-
-function ACPopup(elm,backend_url){
- this.idsel=-1;
- this.element = elm;
- this.searchText="";
- this.ready=true;
- this.kp_timer = false;
- this.url = backend_url;
-
- var w = 530;
- var h = 130;
-
-
- if(typeof elm.editorId == "undefined") {
- style = $(elm).offset();
- w = $(elm).width();
- h = $(elm).height();
- }
- else {
- var container = elm.getContainer();
- if(typeof container != "undefined") {
- style = $(container).offset();
- w = $(container).width();
- h = $(container).height();
- }
- }
-
- style.top=style.top+h;
- style.width = w;
- style.position = 'absolute';
- /* style['max-height'] = '150px';
- style.border = '1px solid red';
- style.background = '#cccccc';
-
- style.overflow = 'auto';
- style['z-index'] = '100000';
- */
- style.display = 'none';
-
- this.cont = $("<div class='acpopup'></div>");
- this.cont.css(style);
-
- $("body").append(this.cont);
-}
-ACPopup.prototype.close = function(){
- $(this.cont).remove();
- this.ready=false;
-}
-ACPopup.prototype.search = function(text){
- var that = this;
- this.searchText=text;
- if (this.kp_timer) clearTimeout(this.kp_timer);
- this.kp_timer = setTimeout( function(){that._search();}, 500);
-}
-ACPopup.prototype._search = function(){
- console.log("_search");
- var that = this;
- var postdata = {
- start:0,
- count:100,
- search:this.searchText,
- type:'c',
- }
-
- $.ajax({
- type:'POST',
- url: this.url,
- data: postdata,
- dataType: 'json',
- success:function(data){
- that.cont.html("");
- if (data.tot>0){
- that.cont.show();
- $(data.items).each(function(){
- html = "<img src='{0}' height='16px' width='16px'>{1} ({2})".format(this.photo, this.name, this.nick)
- that.add(html, this.nick.replace(' ','') + '+' + this.id + ' - ' + this.link);
- });
- } else {
- that.cont.hide();
- }
- }
- });
-
-}
- ACPopup.prototype.add = function(label, value){
- var that=this;
- var elm = $("<div class='acpopupitem' title='"+value+"'>"+label+"</div>");
- elm.click(function(e){
- t = $(this).attr('title').replace(new RegExp(' \- .*'),'');
- if(typeof(that.element.container) === "undefined") {
- el=$(that.element);
- sel = el.getSelection();
- sel.start = sel.start- that.searchText.length;
- el.setSelection(sel.start,sel.end).replaceSelectedText(t+' ').collapseSelection(false);
- that.close();
- }
- else {
- txt = tinyMCE.activeEditor.getContent();
- // alert(that.searchText + ':' + t);
- newtxt = txt.replace('@' + that.searchText, '@' + t + ' ');
- tinyMCE.activeEditor.setContent(newtxt);
- tinyMCE.activeEditor.focus();
- that.close();
- }
- });
- $(this.cont).append(elm);
-}
-ACPopup.prototype.onkey = function(event){
- if (event.keyCode == '13') {
- if(this.idsel>-1) {
- this.cont.children()[this.idsel].click();
- event.preventDefault();
- }
- else
- this.close();
- }
- if (event.keyCode == '38') { //cursor up
- cmax = this.cont.children().size()-1;
- this.idsel--;
- if (this.idsel<0) this.idsel=cmax;
- event.preventDefault();
- }
- if (event.keyCode == '40' || event.keyCode == '9') { //cursor down
- cmax = this.cont.children().size()-1;
- this.idsel++;
- if (this.idsel>cmax) this.idsel=0;
- event.preventDefault();
- }
-
- if (event.keyCode == '38' || event.keyCode == '40' || event.keyCode == '9') {
- this.cont.children().removeClass('selected');
- $(this.cont.children()[this.idsel]).addClass('selected');
- }
-
- if (event.keyCode == '27') { //ESC
- this.close();
- }
-}
-
-function ContactAutocomplete(element,backend_url){
- this.pattern=/@([^ \n]+)$/;
- this.popup=null;
- var that = this;
-
- $(element).unbind('keydown');
- $(element).unbind('keyup');
-
- $(element).keydown(function(event){
- if (that.popup!==null) that.popup.onkey(event);
- });
-
- $(element).keyup(function(event){
- cpos = $(this).getSelection();
- if (cpos.start==cpos.end){
- match = $(this).val().substring(0,cpos.start).match(that.pattern);
- if (match!==null){
- if (that.popup===null){
- that.popup = new ACPopup(this, backend_url);
- }
- if (that.popup.ready && match[1]!==that.popup.searchText) that.popup.search(match[1]);
- if (!that.popup.ready) that.popup=null;
-
- } else {
- if (that.popup!==null) {that.popup.close(); that.popup=null;}
- }
-
-
- }
- });
-
-}
-
-
-/**
- * jQuery plugin 'contact_autocomplete'
- */
-(function( $ ){
- $.fn.contact_autocomplete = function(backend_url) {
- this.each(function(){
- new ContactAutocomplete(this, backend_url);
- });
- };
-})( jQuery );
-
-
-
-
diff --git a/js/jquery.js b/js/jquery.js
deleted file mode 100644
index 16ad06c5a..000000000
--- a/js/jquery.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/*! jQuery v1.7.2 jquery.com | jquery.org/license */
-(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cu(a){if(!cj[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ck||(ck=c.createElement("iframe"),ck.frameBorder=ck.width=ck.height=0),b.appendChild(ck);if(!cl||!ck.createElement)cl=(ck.contentWindow||ck.contentDocument).document,cl.write((f.support.boxModel?"<!doctype html>":"")+"<html><body>"),cl.close();d=cl.createElement(a),cl.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ck)}cj[a]=e}return cj[a]}function ct(a,b){var c={};f.each(cp.concat.apply([],cp.slice(0,b)),function(){c[this]=a});return c}function cs(){cq=b}function cr(){setTimeout(cs,0);return cq=f.now()}function ci(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ch(){try{return new a.XMLHttpRequest}catch(b){}}function cb(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g<i;g++){if(g===1)for(h in a.converters)typeof h=="string"&&(e[h.toLowerCase()]=a.converters[h]);l=k,k=d[g];if(k==="*")k=l;else if(l!=="*"&&l!==k){m=l+" "+k,n=e[m]||e["* "+k];if(!n){p=b;for(o in e){j=o.split(" ");if(j[0]===l||j[0]==="*"){p=e[j[1]+" "+k];if(p){o=e[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&f.error("No conversion from "+m.replace(" "," to ")),n!==!0&&(c=n?n(c):p(o(c)))}}return c}function ca(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]==="*")f.shift(),h===b&&(h=a.mimeType||c.getResponseHeader("content-type"));if(h)for(i in e)if(e[i]&&e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+" "+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j);return d[j]}}function b_(a,b,c,d){if(f.isArray(b))f.each(b,function(b,e){c||bD.test(a)?d(a,e):b_(a+"["+(typeof e=="object"?b:"")+"]",e,c,d)});else if(!c&&f.type(b)==="object")for(var e in b)b_(a+"["+e+"]",b[e],c,d);else d(a,b)}function b$(a,c){var d,e,g=f.ajaxSettings.flatOptions||{};for(d in c)c[d]!==b&&((g[d]?a:e||(e={}))[d]=c[d]);e&&f.extend(!0,a,e)}function bZ(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bS,l;for(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l=="string"&&(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=bZ(a,c,d,e,l,g)));(k||!l)&&!g["*"]&&(l=bZ(a,c,d,e,"*",g));return l}function bY(a){return function(b,c){typeof b!="string"&&(c=b,b="*");if(f.isFunction(c)){var d=b.toLowerCase().split(bO),e=0,g=d.length,h,i,j;for(;e<g;e++)h=d[e],j=/^\+/.test(h),j&&(h=h.substr(1)||"*"),i=a[h]=a[h]||[],i[j?"unshift":"push"](c)}}}function bB(a,b,c){var d=b==="width"?a.offsetWidth:a.offsetHeight,e=b==="width"?1:0,g=4;if(d>0){if(c!=="border")for(;e<g;e+=2)c||(d-=parseFloat(f.css(a,"padding"+bx[e]))||0),c==="margin"?d+=parseFloat(f.css(a,c+bx[e]))||0:d-=parseFloat(f.css(a,"border"+bx[e]+"Width"))||0;return d+"px"}d=by(a,b);if(d<0||d==null)d=a.style[b];if(bt.test(d))return d;d=parseFloat(d)||0;if(c)for(;e<g;e+=2)d+=parseFloat(f.css(a,"padding"+bx[e]))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+bx[e]+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+bx[e]))||0);return d+"px"}function bo(a){var b=c.createElement("div");bh.appendChild(b),b.innerHTML=a.outerHTML;return b.firstChild}function bn(a){var b=(a.nodeName||"").toLowerCase();b==="input"?bm(a):b!=="script"&&typeof a.getElementsByTagName!="undefined"&&f.grep(a.getElementsByTagName("input"),bm)}function bm(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bl(a){return typeof a.getElementsByTagName!="undefined"?a.getElementsByTagName("*"):typeof a.querySelectorAll!="undefined"?a.querySelectorAll("*"):[]}function bk(a,b){var c;b.nodeType===1&&(b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase(),c==="object"?b.outerHTML=a.outerHTML:c!=="input"||a.type!=="checkbox"&&a.type!=="radio"?c==="option"?b.selected=a.defaultSelected:c==="input"||c==="textarea"?b.defaultValue=a.defaultValue:c==="script"&&b.text!==a.text&&(b.text=a.text):(a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value)),b.removeAttribute(f.expando),b.removeAttribute("_submit_attached"),b.removeAttribute("_change_attached"))}function bj(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c,d,e,g=f._data(a),h=f._data(b,g),i=g.events;if(i){delete h.handle,h.events={};for(c in i)for(d=0,e=i[c].length;d<e;d++)f.event.add(b,c,i[c][d])}h.data&&(h.data=f.extend({},h.data))}}function bi(a,b){return f.nodeName(a,"table")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function U(a){var b=V.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}function T(a,b,c){b=b||0;if(f.isFunction(b))return f.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return f.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=f.grep(a,function(a){return a.nodeType===1});if(O.test(b))return f.filter(b,d,!c);b=f.filter(b,d)}return f.grep(a,function(a,d){return f.inArray(a,b)>=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?+d:j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c<d;c++)b[a[c]]=!0;return b}var c=a.document,d=a.navigator,e=a.location,f=function(){function J(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(J,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.2",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j<k;j++)if((a=arguments[j])!=null)for(c in a){d=i[c],f=a[c];if(i===f)continue;l&&f&&(e.isPlainObject(f)||(g=e.isArray(f)))?(g?(g=!1,h=d&&e.isArray(d)?d:[]):h=d&&e.isPlainObject(d)?d:{},i[c]=e.extend(l,h,f)):f!==b&&(i[c]=f)}return i},e.extend({noConflict:function(b){a.$===e&&(a.$=g),b&&a.jQuery===e&&(a.jQuery=f);return e},isReady:!1,readyWait:1,holdReady:function(a){a?e.readyWait++:e.ready(!0)},ready:function(a){if(a===!0&&!--e.readyWait||a!==!0&&!e.isReady){if(!c.body)return setTimeout(e.ready,1);e.isReady=!0;if(a!==!0&&--e.readyWait>0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a!=null&&a==a.window},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){if(typeof c!="string"||!c)return null;var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g<h;)if(c.apply(a[g++],d)===!1)break}else if(i){for(f in a)if(c.call(a[f],f,a[f])===!1)break}else for(;g<h;)if(c.call(a[g],g,a[g++])===!1)break;return a},trim:G?function(a){return a==null?"":G.call(a)}:function(a){return a==null?"":(a+"").replace(k,"").replace(l,"")},makeArray:function(a,b){var c=b||[];if(a!=null){var d=e.type(a);a.length==null||d==="string"||d==="function"||d==="regexp"||e.isWindow(a)?E.call(c,a):e.merge(c,a)}return c},inArray:function(a,b,c){var d;if(b){if(H)return H.call(b,a,c);d=b.length,c=c?c<0?Math.max(0,d+c):c:0;for(;c<d;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,c){var d=a.length,e=0;if(typeof c.length=="number")for(var f=c.length;e<f;e++)a[d++]=c[e];else while(c[e]!==b)a[d++]=c[e++];a.length=d;return a},grep:function(a,b,c){var d=[],e;c=!!c;for(var f=0,g=a.length;f<g;f++)e=!!b(a[f],f),c!==e&&d.push(a[f]);return d},map:function(a,c,d){var f,g,h=[],i=0,j=a.length,k=a instanceof e||j!==b&&typeof j=="number"&&(j>0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i<j;i++)f=c(a[i],i,d),f!=null&&(h[h.length]=f);else for(g in a)f=c(a[g],g,d),f!=null&&(h[h.length]=f);return h.concat.apply([],h)},guid:1,proxy:function(a,c){if(typeof c=="string"){var d=a[c];c=a,a=d}if(!e.isFunction(a))return b;var f=F.call(arguments,2),g=function(){return a.apply(c,f.concat(F.call(arguments)))};g.guid=a.guid=a.guid||g.guid||e.guid++;return g},access:function(a,c,d,f,g,h,i){var j,k=d==null,l=0,m=a.length;if(d&&typeof d=="object"){for(l in d)e.access(a,c,l,d[l],1,h,f);g=1}else if(f!==b){j=i===b&&e.isFunction(f),k&&(j?(j=c,c=function(a,b,c){return j.call(e(a),c)}):(c.call(a,f),c=null));if(c)for(;l<m;l++)c(a[l],d,j?f.call(a[l],l,c(a[l],d)):f,i);g=1}return g?a:k?c.call(a):m?c(a[0],d):h},now:function(){return(new Date).getTime()},uaMatch:function(a){a=a.toLowerCase();var b=r.exec(a)||s.exec(a)||t.exec(a)||a.indexOf("compatible")<0&&u.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},sub:function(){function a(b,c){return new a.fn.init(b,c)}e.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function(d,f){f&&f instanceof e&&!(f instanceof a)&&(f=a(f));return e.fn.init.call(this,d,f,b)},a.fn.init.prototype=a.fn;var b=a(c);return a},browser:{}}),e.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){I["[object "+b+"]"]=b.toLowerCase()}),z=e.uaMatch(y),z.browser&&(e.browser[z.browser]=!0,e.browser.version=z.version),e.browser.webkit&&(e.browser.safari=!0),j.test(" ")&&(k=/^[\s\xA0]+/,l=/[\s\xA0]+$/),h=e(c),c.addEventListener?B=function(){c.removeEventListener("DOMContentLoaded",B,!1),e.ready()}:c.attachEvent&&(B=function(){c.readyState==="complete"&&(c.detachEvent("onreadystatechange",B),e.ready())});return e}(),g={};f.Callbacks=function(a){a=a?g[a]||h(a):{};var c=[],d=[],e,i,j,k,l,m,n=function(b){var d,e,g,h,i;for(d=0,e=b.length;d<e;d++)g=b[d],h=f.type(g),h==="array"?n(g):h==="function"&&(!a.unique||!p.has(g))&&c.push(g)},o=function(b,f){f=f||[],e=!a.memory||[b,f],i=!0,j=!0,m=k||0,k=0,l=c.length;for(;c&&m<l;m++)if(c[m].apply(b,f)===!1&&a.stopOnFalse){e=!0;break}j=!1,c&&(a.once?e===!0?p.disable():c=[]:d&&d.length&&(e=d.shift(),p.fireWith(e[0],e[1])))},p={add:function(){if(c){var a=c.length;n(arguments),j?l=c.length:e&&e!==!0&&(k=a,o(e[0],e[1]))}return this},remove:function(){if(c){var b=arguments,d=0,e=b.length;for(;d<e;d++)for(var f=0;f<c.length;f++)if(b[d]===c[f]){j&&f<=l&&(l--,f<=m&&m--),c.splice(f--,1);if(a.unique)break}}return this},has:function(a){if(c){var b=0,d=c.length;for(;b<d;b++)if(a===c[b])return!0}return!1},empty:function(){c=[];return this},disable:function(){c=d=e=b;return this},disabled:function(){return!c},lock:function(){d=b,(!e||e===!0)&&p.disable();return this},locked:function(){return!d},fireWith:function(b,c){d&&(j?a.once||d.push([b,c]):(!a.once||!e)&&o(b,c));return this},fire:function(){p.fireWith(this,arguments);return this},fired:function(){return!!i}};return p};var i=[].slice;f.extend({Deferred:function(a){var b=f.Callbacks("once memory"),c=f.Callbacks("once memory"),d=f.Callbacks("memory"),e="pending",g={resolve:b,reject:c,notify:d},h={done:b.add,fail:c.add,progress:d.add,state:function(){return e},isResolved:b.fired,isRejected:c.fired,then:function(a,b,c){i.done(a).fail(b).progress(c);return this},always:function(){i.done.apply(i,arguments).fail.apply(i,arguments);return this},pipe:function(a,b,c){return f.Deferred(function(d){f.each({done:[a,"resolve"],fail:[b,"reject"],progress:[c,"notify"]},function(a,b){var c=b[0],e=b[1],g;f.isFunction(c)?i[a](function(){g=c.apply(this,arguments),g&&f.isFunction(g.promise)?g.promise().then(d.resolve,d.reject,d.notify):d[e+"With"](this===i?d:this,[g])}):i[a](d[e])})}).promise()},promise:function(a){if(a==null)a=h;else for(var b in h)a[b]=h[b];return a}},i=h.promise({}),j;for(j in g)i[j]=g[j].fire,i[j+"With"]=g[j].fireWith;i.done(function(){e="resolved"},c.disable,d.lock).fail(function(){e="rejected"},b.disable,d.lock),a&&a.call(i,i);return i},when:function(a){function m(a){return function(b){e[a]=arguments.length>1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c<d;c++)b[c]&&b[c].promise&&f.isFunction(b[c].promise)?b[c].promise().then(l(c),j.reject,m(c)):--g;g||j.resolveWith(j,b)}else j!==a&&j.resolveWith(j,d?[a]:[]);return k}}),f.support=function(){var b,d,e,g,h,i,j,k,l,m,n,o,p=c.createElement("div"),q=c.documentElement;p.setAttribute("className","t"),p.innerHTML=" <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>",d=p.getElementsByTagName("*"),e=p.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=p.getElementsByTagName("input")[0],b={leadingWhitespace:p.firstChild.nodeType===3,tbody:!p.getElementsByTagName("tbody").length,htmlSerialize:!!p.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:p.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav></:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,pixelMargin:!0},f.boxModel=b.boxModel=c.compatMode==="CSS1Compat",i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete p.test}catch(r){b.deleteExpando=!1}!p.addEventListener&&p.attachEvent&&p.fireEvent&&(p.attachEvent("onclick",function(){b.noCloneEvent=!1}),p.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),i.setAttribute("name","t"),p.appendChild(i),j=c.createDocumentFragment(),j.appendChild(p.lastChild),b.checkClone=j.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,j.removeChild(i),j.appendChild(p);if(p.attachEvent)for(n in{submit:1,change:1,focusin:1})m="on"+n,o=m in p,o||(p.setAttribute(m,"return;"),o=typeof p[m]=="function"),b[n+"Bubbles"]=o;j.removeChild(p),j=g=h=p=i=null,f(function(){var d,e,g,h,i,j,l,m,n,q,r,s,t,u=c.getElementsByTagName("body")[0];!u||(m=1,t="padding:0;margin:0;border:",r="position:absolute;top:0;left:0;width:1px;height:1px;",s=t+"0;visibility:hidden;",n="style='"+r+t+"5px solid #000;",q="<div "+n+"display:block;'><div style='"+t+"0;display:block;overflow:hidden;'></div></div>"+"<table "+n+"' cellpadding='0' cellspacing='0'>"+"<tr><td></td></tr></table>",d=c.createElement("div"),d.style.cssText=s+"width:0;height:0;position:static;top:0;margin-top:"+m+"px",u.insertBefore(d,u.firstChild),p=c.createElement("div"),d.appendChild(p),p.innerHTML="<table><tr><td style='"+t+"0;display:none'></td><td>t</td></tr></table>",k=p.getElementsByTagName("td"),o=k[0].offsetHeight===0,k[0].style.display="",k[1].style.display="none",b.reliableHiddenOffsets=o&&k[0].offsetHeight===0,a.getComputedStyle&&(p.innerHTML="",l=c.createElement("div"),l.style.width="0",l.style.marginRight="0",p.style.width="2px",p.appendChild(l),b.reliableMarginRight=(parseInt((a.getComputedStyle(l,null)||{marginRight:0}).marginRight,10)||0)===0),typeof p.style.zoom!="undefined"&&(p.innerHTML="",p.style.width=p.style.padding="1px",p.style.border=0,p.style.overflow="hidden",p.style.display="inline",p.style.zoom=1,b.inlineBlockNeedsLayout=p.offsetWidth===3,p.style.display="block",p.style.overflow="visible",p.innerHTML="<div style='width:5px;'></div>",b.shrinkWrapBlocks=p.offsetWidth!==3),p.style.cssText=r+s,p.innerHTML=q,e=p.firstChild,g=e.firstChild,i=e.nextSibling.firstChild.firstChild,j={doesNotAddBorder:g.offsetTop!==5,doesAddBorderForTableAndCells:i.offsetTop===5},g.style.position="fixed",g.style.top="20px",j.fixedPosition=g.offsetTop===20||g.offsetTop===15,g.style.position=g.style.top="",e.style.overflow="hidden",e.style.position="relative",j.subtractsBorderForOverflowNotVisible=g.offsetTop===-5,j.doesNotIncludeMarginInBodyOffset=u.offsetTop!==m,a.getComputedStyle&&(p.style.marginTop="1%",b.pixelMargin=(a.getComputedStyle(p,null)||{marginTop:0}).marginTop!=="1%"),typeof d.style.zoom!="undefined"&&(d.style.zoom=1),u.removeChild(d),l=p=d=null,f.extend(b,j))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e<g;e++)delete d[b[e]];if(!(c?m:f.isEmptyObject)(d))return}}if(!c){delete j[k].data;if(!m(j[k]))return}f.support.deleteExpando||!j.setInterval?delete j[k]:j[k]=null,i&&(f.support.deleteExpando?delete a[h]:a.removeAttribute?a.removeAttribute(h):a[h]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d,e,g,h,i,j=this[0],k=0,m=null;if(a===b){if(this.length){m=f.data(j);if(j.nodeType===1&&!f._data(j,"parsedAttrs")){g=j.attributes;for(i=g.length;k<i;k++)h=g[k].name,h.indexOf("data-")===0&&(h=f.camelCase(h.substring(5)),l(j,h,m[h]));f._data(j,"parsedAttrs",!0)}}return m}if(typeof a=="object")return this.each(function(){f.data(this,a)});d=a.split(".",2),d[1]=d[1]?"."+d[1]:"",e=d[1]+"!";return f.access(this,function(c){if(c===b){m=this.triggerHandler("getData"+e,[d[0]]),m===b&&j&&(m=f.data(j,a),m=l(j,a,m));return m===b&&d[1]?this.data(d[0]):m}d[1]=c,this.each(function(){var b=f(this);b.triggerHandler("setData"+e,d),f.data(this,a,c),b.triggerHandler("changeData"+e,d)})},null,c,arguments.length>1,null,!1)},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,b){a&&(b=(b||"fx")+"mark",f._data(a,b,(f._data(a,b)||0)+1))},_unmark:function(a,b,c){a!==!0&&(c=b,b=a,a=!1);if(b){c=c||"fx";var d=c+"mark",e=a?0:(f._data(b,d)||1)-1;e?f._data(b,d,e):(f.removeData(b,d,!0),n(b,c,"mark"))}},queue:function(a,b,c){var d;if(a){b=(b||"fx")+"queue",d=f._data(a,b),c&&(!d||f.isArray(c)?d=f._data(a,b,f.makeArray(c)):d.push(c));return d||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e={};d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),f._data(a,b+".run",e),d.call(a,function(){f.dequeue(a,b)},e)),c.length||(f.removeData(a,b+"queue "+b+".run",!0),n(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){var d=2;typeof a!="string"&&(c=a,a="fx",d--);if(arguments.length<d)return f.queue(this[0],a);return c===b?this:this.each(function(){var b=f.queue(this,a,c);a==="fx"&&b[0]!=="inprogress"&&f.dequeue(this,a)})},dequeue:function(a){return this.each(function(){f.dequeue(this,a)})},delay:function(a,b){a=f.fx?f.fx.speeds[a]||a:a,b=b||"fx";return this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,c){function m(){--h||d.resolveWith(e,[e])}typeof a!="string"&&(c=a,a=b),a=a||"fx";var d=f.Deferred(),e=this,g=e.length,h=1,i=a+"defer",j=a+"queue",k=a+"mark",l;while(g--)if(l=f.data(e[g],i,b,!0)||(f.data(e[g],j,b,!0)||f.data(e[g],k,b,!0))&&f.data(e[g],i,f.Callbacks("once memory"),!0))h++,l.add(m);m();return d.promise(c)}});var o=/[\n\t\r]/g,p=/\s+/,q=/\r/g,r=/^(?:button|input)$/i,s=/^(?:button|input|object|select|textarea)$/i,t=/^a(?:rea)?$/i,u=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,v=f.support.getSetAttribute,w,x,y;f.fn.extend({attr:function(a,b){return f.access(this,f.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,f.prop,a,b,arguments.length>1)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(p);for(c=0,d=this.length;c<d;c++){e=this[c];if(e.nodeType===1)if(!e.className&&b.length===1)e.className=a;else{g=" "+e.className+" ";for(h=0,i=b.length;h<i;h++)~g.indexOf(" "+b[h]+" ")||(g+=b[h]+" ");e.className=f.trim(g)}}}return this},removeClass:function(a){var c,d,e,g,h,i,j;if(f.isFunction(a))return this.each(function(b){f(this).removeClass(a.call(this,b,this.className))});if(a&&typeof a=="string"||a===b){c=(a||"").split(p);for(d=0,e=this.length;d<e;d++){g=this[d];if(g.nodeType===1&&g.className)if(a){h=(" "+g.className+" ").replace(o," ");for(i=0,j=c.length;i<j;i++)h=h.replace(" "+c[i]+" "," ");g.className=f.trim(h)}else g.className=""}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b=="boolean";if(f.isFunction(a))return this.each(function(c){f(this).toggleClass(a.call(this,c,this.className,b),b)});return this.each(function(){if(c==="string"){var e,g=0,h=f(this),i=b,j=a.split(p);while(e=j[g++])i=d?i:!h.hasClass(e),h[i?"addClass":"removeClass"](e)}else if(c==="undefined"||c==="boolean")this.className&&f._data(this,"__className__",this.className),this.className=this.className||a===!1?"":f._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ",c=0,d=this.length;for(;c<d;c++)if(this[c].nodeType===1&&(" "+this[c].className+" ").replace(o," ").indexOf(b)>-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.type]||f.valHooks[this.nodeName.toLowerCase()];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.type]||f.valHooks[g.nodeName.toLowerCase()];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c<d;c++){e=i[c];if(e.selected&&(f.support.optDisabled?!e.disabled:e.getAttribute("disabled")===null)&&(!e.parentNode.disabled||!f.nodeName(e.parentNode,"optgroup"))){b=f(e).val();if(j)return b;h.push(b)}}if(j&&!h.length&&i.length)return f(i[g]).val();return h},set:function(a,b){var c=f.makeArray(b);f(a).find("option").each(function(){this.selected=f.inArray(f(this).val(),c)>=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h,i=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;i<g;i++)e=d[i],e&&(c=f.propFix[e]||e,h=u.test(e),h||f.attr(a,e,""),a.removeAttribute(v?e:c),h&&c in a&&(a[c]=!1))}},attrHooks:{type:{set:function(a,b){if(r.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},value:{get:function(a,b){if(w&&f.nodeName(a,"button"))return w.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(w&&f.nodeName(a,"button"))return w.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e,g,h,i=a.nodeType;if(!!a&&i!==3&&i!==8&&i!==2){h=i!==1||!f.isXMLDoc(a),h&&(c=f.propFix[c]||c,g=f.propHooks[c]);return d!==b?g&&"set"in g&&(e=g.set(a,d,c))!==b?e:a[c]=d:g&&"get"in g&&(e=g.get(a,c))!==null?e:a[c]}},propHooks:{tabIndex:{get:function(a){var c=a.getAttributeNode("tabindex");return c&&c.specified?parseInt(c.value,10):s.test(a.nodeName)||t.test(a.nodeName)&&a.href?0:b}}}}),f.attrHooks.tabindex=f.propHooks.tabIndex,x={get:function(a,c){var d,e=f.prop(a,c);return e===!0||typeof e!="boolean"&&(d=a.getAttributeNode(c))&&d.nodeValue!==!1?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},v||(y={name:!0,id:!0,coords:!0},w=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&(y[c]?d.nodeValue!=="":d.specified)?d.nodeValue:b},set:function(a,b,d){var e=a.getAttributeNode(d);e||(e=c.createAttribute(d),a.setAttributeNode(e));return e.nodeValue=b+""}},f.attrHooks.tabindex.set=w.set,f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})}),f.attrHooks.contenteditable={get:w.get,set:function(a,b,c){b===""&&(b="false"),w.set(a,b,c)}}),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex);return null}})),f.support.enctype||(f.propFix.enctype="encoding"),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/(?:^|\s)hover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function(
-a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")};f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler,g=p.selector),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k<c.length;k++){l=A.exec(c[k])||[],m=l[1],n=(l[2]||"").split(".").sort(),s=f.event.special[m]||{},m=(g?s.delegateType:s.bindType)||m,s=f.event.special[m]||{},o=f.extend({type:m,origType:l[1],data:e,handler:d,guid:d.guid,selector:g,quick:g&&G(g),namespace:n.join(".")},p),r=j[m];if(!r){r=j[m]=[],r.delegateCount=0;if(!s.setup||s.setup.call(a,e,n,i)===!1)a.addEventListener?a.addEventListener(m,i,!1):a.attachEvent&&a.attachEvent("on"+m,i)}s.add&&(s.add.call(a,o),o.handler.guid||(o.handler.guid=d.guid)),g?r.splice(r.delegateCount++,0,o):r.push(o),f.event.global[m]=!0}a=null}},global:{},remove:function(a,b,c,d,e){var g=f.hasData(a)&&f._data(a),h,i,j,k,l,m,n,o,p,q,r,s;if(!!g&&!!(o=g.events)){b=f.trim(I(b||"")).split(" ");for(h=0;h<b.length;h++){i=A.exec(b[h])||[],j=k=i[1],l=i[2];if(!j){for(j in o)f.event.remove(a,j+b[h],c,d,!0);continue}p=f.event.special[j]||{},j=(d?p.delegateType:p.bindType)||j,r=o[j]||[],m=r.length,l=l?new RegExp("(^|\\.)"+l.split(".").sort().join("\\.(?:.*\\.)?")+"(\\.|$)"):null;for(n=0;n<r.length;n++)s=r[n],(e||k===s.origType)&&(!c||c.guid===s.guid)&&(!l||l.test(s.namespace))&&(!d||d===s.selector||d==="**"&&s.selector)&&(r.splice(n--,1),s.selector&&r.delegateCount--,p.remove&&p.remove.call(a,s));r.length===0&&m!==r.length&&((!p.teardown||p.teardown.call(a,l)===!1)&&f.removeEvent(a,j,g.handle),delete o[j])}f.isEmptyObject(o)&&(q=g.handle,q&&(q.elem=null),f.removeData(a,["events","handle"],!0))}},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(c,d,e,g){if(!e||e.nodeType!==3&&e.nodeType!==8){var h=c.type||c,i=[],j,k,l,m,n,o,p,q,r,s;if(E.test(h+f.event.triggered))return;h.indexOf("!")>=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;l<r.length&&!c.isPropagationStopped();l++)m=r[l][0],c.type=r[l][1],q=(f._data(m,"events")||{})[c.type]&&f._data(m,"handle"),q&&q.apply(m,d),q=o&&m[o],q&&f.acceptData(m)&&q.apply(m,d)===!1&&c.preventDefault();c.type=h,!g&&!c.isDefaultPrevented()&&(!p._default||p._default.apply(e.ownerDocument,d)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)&&o&&e[h]&&(h!=="focus"&&h!=="blur"||c.target.offsetWidth!==0)&&!f.isWindow(e)&&(n=e[o],n&&(e[o]=null),f.event.triggered=h,e[h](),f.event.triggered=b,n&&(e[o]=n));return c.result}},dispatch:function(c){c=f.event.fix(c||a.event);var d=(f._data(this,"events")||{})[c.type]||[],e=d.delegateCount,g=[].slice.call(arguments,0),h=!c.exclusive&&!c.namespace,i=f.event.special[c.type]||{},j=[],k,l,m,n,o,p,q,r,s,t,u;g[0]=c,c.delegateTarget=this;if(!i.preDispatch||i.preDispatch.call(this,c)!==!1){if(e&&(!c.button||c.type!=="click")){n=f(this),n.context=this.ownerDocument||this;for(m=c.target;m!=this;m=m.parentNode||this)if(m.disabled!==!0){p={},r=[],n[0]=m;for(k=0;k<e;k++)s=d[k],t=s.selector,p[t]===b&&(p[t]=s.quick?H(m,s.quick):n.is(t)),p[t]&&r.push(s);r.length&&j.push({elem:m,matches:r})}}d.length>e&&j.push({elem:this,matches:d.slice(e)});for(k=0;k<j.length&&!c.isPropagationStopped();k++){q=j[k],c.currentTarget=q.elem;for(l=0;l<q.matches.length&&!c.isImmediatePropagationStopped();l++){s=q.matches[l];if(h||!c.namespace&&!s.namespace||c.namespace_re&&c.namespace_re.test(s.namespace))c.data=s.data,c.handleObj=s,o=((f.event.special[s.origType]||{}).handle||s.handler).apply(q.elem,g),o!==b&&(c.result=o,o===!1&&(c.preventDefault(),c.stopPropagation()))}}i.postDispatch&&i.postDispatch.call(this,c);return c.result}},props:"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){a.which==null&&(a.which=b.charCode!=null?b.charCode:b.keyCode);return a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,d){var e,f,g,h=d.button,i=d.fromElement;a.pageX==null&&d.clientX!=null&&(e=a.target.ownerDocument||c,f=e.documentElement,g=e.body,a.pageX=d.clientX+(f&&f.scrollLeft||g&&g.scrollLeft||0)-(f&&f.clientLeft||g&&g.clientLeft||0),a.pageY=d.clientY+(f&&f.scrollTop||g&&g.scrollTop||0)-(f&&f.clientTop||g&&g.clientTop||0)),!a.relatedTarget&&i&&(a.relatedTarget=i===a.target?d.toElement:i),!a.which&&h!==b&&(a.which=h&1?1:h&2?3:h&4?2:0);return a}},fix:function(a){if(a[f.expando])return a;var d,e,g=a,h=f.event.fixHooks[a.type]||{},i=h.props?this.props.concat(h.props):this.props;a=f.Event(g);for(d=i.length;d;)e=i[--d],a[e]=g[e];a.target||(a.target=g.srcElement||c),a.target.nodeType===3&&(a.target=a.target.parentNode),a.metaKey===b&&(a.metaKey=a.ctrlKey);return h.filter?h.filter(a,g):a},special:{ready:{setup:f.bindReady},load:{noBubble:!0},focus:{delegateType:"focusin"},blur:{delegateType:"focusout"},beforeunload:{setup:function(a,b,c){f.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}},simulate:function(a,b,c,d){var e=f.extend(new f.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?f.event.trigger(e,null,b):f.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},f.event.handle=f.event.dispatch,f.removeEvent=c.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){a.detachEvent&&a.detachEvent("on"+b,c)},f.Event=function(a,b){if(!(this instanceof f.Event))return new f.Event(a,b);a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?K:J):this.type=a,b&&f.extend(this,b),this.timeStamp=a&&a.timeStamp||f.now(),this[f.expando]=!0},f.Event.prototype={preventDefault:function(){this.isDefaultPrevented=K;var a=this.originalEvent;!a||(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){this.isPropagationStopped=K;var a=this.originalEvent;!a||(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=K,this.stopPropagation()},isDefaultPrevented:J,isPropagationStopped:J,isImmediatePropagationStopped:J},f.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){f.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c=this,d=a.relatedTarget,e=a.handleObj,g=e.selector,h;if(!d||d!==c&&!f.contains(c,d))a.type=e.origType,h=e.handler.apply(this,arguments),a.type=b;return h}}}),f.support.submitBubbles||(f.event.special.submit={setup:function(){if(f.nodeName(this,"form"))return!1;f.event.add(this,"click._submit keypress._submit",function(a){var c=a.target,d=f.nodeName(c,"input")||f.nodeName(c,"button")?c.form:b;d&&!d._submit_attached&&(f.event.add(d,"submit._submit",function(a){a._submit_bubble=!0}),d._submit_attached=!0)})},postDispatch:function(a){a._submit_bubble&&(delete a._submit_bubble,this.parentNode&&!a.isTrigger&&f.event.simulate("submit",this.parentNode,a,!0))},teardown:function(){if(f.nodeName(this,"form"))return!1;f.event.remove(this,"._submit")}}),f.support.changeBubbles||(f.event.special.change={setup:function(){if(z.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio")f.event.add(this,"propertychange._change",function(a){a.originalEvent.propertyName==="checked"&&(this._just_changed=!0)}),f.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1,f.event.simulate("change",this,a,!0))});return!1}f.event.add(this,"beforeactivate._change",function(a){var b=a.target;z.test(b.nodeName)&&!b._change_attached&&(f.event.add(b,"change._change",function(a){this.parentNode&&!a.isSimulated&&!a.isTrigger&&f.event.simulate("change",this.parentNode,a,!0)}),b._change_attached=!0)})},handle:function(a){var b=a.target;if(this!==b||a.isSimulated||a.isTrigger||b.type!=="radio"&&b.type!=="checkbox")return a.handleObj.handler.apply(this,arguments)},teardown:function(){f.event.remove(this,"._change");return z.test(this.nodeName)}}),f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){var d=0,e=function(a){f.event.simulate(b,a.target,f.event.fix(a),!0)};f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.fn.extend({on:function(a,c,d,e,g){var h,i;if(typeof a=="object"){typeof c!="string"&&(d=d||c,c=b);for(i in a)this.on(i,c,d,a[i],g);return this}d==null&&e==null?(e=c,d=c=b):e==null&&(typeof c=="string"?(e=d,d=b):(e=d,d=c,c=b));if(e===!1)e=J;else if(!e)return this;g===1&&(h=e,e=function(a){f().off(a);return h.apply(this,arguments)},e.guid=h.guid||(h.guid=f.guid++));return this.each(function(){f.event.add(this,a,e,d,c)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,c,d){if(a&&a.preventDefault&&a.handleObj){var e=a.handleObj;f(a.delegateTarget).off(e.namespace?e.origType+"."+e.namespace:e.origType,e.selector,e.handler);return this}if(typeof a=="object"){for(var g in a)this.off(g,c,a[g]);return this}if(c===!1||typeof c=="function")d=c,c=b;d===!1&&(d=J);return this.each(function(){f.event.remove(this,a,d,c)})},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},live:function(a,b,c){f(this.context).on(a,this.selector,b,c);return this},die:function(a,b){f(this.context).off(a,this.selector||"**",b);return this},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return arguments.length==1?this.off(a,"**"):this.off(b,a,c)},trigger:function(a,b){return this.each(function(){f.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0])return f.event.trigger(a,b,this[0],!0)},toggle:function(a){var b=arguments,c=a.guid||f.guid++,d=0,e=function(c){var e=(f._data(this,"lastToggle"+a.guid)||0)%d;f._data(this,"lastToggle"+a.guid,e+1),c.preventDefault();return b[e].apply(this,arguments)||!1};e.guid=c;while(d<b.length)b[d++].guid=c;return this.click(e)},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),f.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(a,b){f.fn[b]=function(a,c){c==null&&(c=a,a=null);return arguments.length>0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}if(j.nodeType===1){g||(j[d]=c,j.sizset=h);if(typeof b!="string"){if(j===b){k=!0;break}}else if(m.filter(b,[j]).length>0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}j.nodeType===1&&!g&&(j[d]=c,j.sizset=h);if(j.nodeName.toLowerCase()===b){k=j;break}j=j[a]}e[h]=k}}}var a=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b<a.length;b++)a[b]===a[b-1]&&a.splice(b--,1)}return a},m.matches=function(a,b){return m(a,null,null,b)},m.matchesSelector=function(a,b){return m(b,null,null,[a]).length>0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e<f;e++){h=o.order[e];if(g=o.leftMatch[h].exec(a)){i=g[1],g.splice(1,1);if(i.substr(i.length-1)!=="\\"){g[1]=(g[1]||"").replace(j,""),d=o.find[h](g,b,c);if(d!=null){a=a.replace(o.match[h],"");break}}}}d||(d=typeof b.getElementsByTagName!="undefined"?b.getElementsByTagName("*"):[]);return{set:d,expr:a}},m.filter=function(a,c,d,e){var f,g,h,i,j,k,l,n,p,q=a,r=[],s=c,t=c&&c[0]&&m.isXML(c[0]);while(a&&c.length){for(h in o.filter)if((f=o.leftMatch[h].exec(a))!=null&&f[2]){k=o.filter[h],l=f[1],g=!1,f.splice(1,1);if(l.substr(l.length-1)==="\\")continue;s===r&&(r=[]);if(o.preFilter[h]){f=o.preFilter[h](f,s,d,r,e,t);if(!f)g=i=!0;else if(f===!0)continue}if(f)for(n=0;(j=s[n])!=null;n++)j&&(i=k(j,f,n,s),p=e^i,d&&i!=null?p?g=!0:s[n]=!1:p&&(r.push(j),g=!0));if(i!==b){d||(s=r),a=a.replace(o.match[h],"");if(!g)return[];break}}if(a===q)if(g==null)m.error(a);else break;q=a}return s},m.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)};var n=m.getText=function(a){var b,c,d=a.nodeType,e="";if(d){if(d===1||d===9||d===11){if(typeof a.textContent=="string")return a.textContent;if(typeof a.innerText=="string")return a.innerText.replace(k,"");for(a=a.firstChild;a;a=a.nextSibling)e+=n(a)}else if(d===3||d===4)return a.nodeValue}else for(b=0;c=a[b];b++)c.nodeType!==8&&(e+=n(c));return e},o=m.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(a){return a.getAttribute("href")},type:function(a){return a.getAttribute("type")}},relative:{"+":function(a,b){var c=typeof b=="string",d=c&&!l.test(b),e=c&&!d;d&&(b=b.toLowerCase());for(var f=0,g=a.length,h;f<g;f++)if(h=a[f]){while((h=h.previousSibling)&&h.nodeType!==1);a[f]=e||h&&h.nodeName.toLowerCase()===b?h||!1:h===b}e&&m.filter(b,a,!0)},">":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e<f;e++){c=a[e];if(c){var g=c.parentNode;a[e]=g.nodeName.toLowerCase()===b?g:!1}}}else{for(;e<f;e++)c=a[e],c&&(a[e]=d?c.parentNode:c.parentNode===b);d&&m.filter(b,a,!0)}},"":function(a,b,c){var d,f=e++,g=x;typeof b=="string"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g("parentNode",b,f,a,d,c)},"~":function(a,b,c){var d,f=e++,g=x;typeof b=="string"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g("previousSibling",b,f,a,d,c)}},find:{ID:function(a,b,c){if(typeof b.getElementById!="undefined"&&!c){var d=b.getElementById(a[1]);return d&&d.parentNode?[d]:[]}},NAME:function(a,b){if(typeof b.getElementsByName!="undefined"){var c=[],d=b.getElementsByName(a[1]);for(var e=0,f=d.length;e<f;e++)d[e].getAttribute("name")===a[1]&&c.push(d[e]);return c.length===0?null:c}},TAG:function(a,b){if(typeof b.getElementsByTagName!="undefined")return b.getElementsByTagName(a[1])}},preFilter:{CLASS:function(a,b,c,d,e,f){a=" "+a[1].replace(j,"")+" ";if(f)return a;for(var g=0,h;(h=b[g])!=null;g++)h&&(e^(h.className&&(" "+h.className+" ").replace(/[\t\n\r]/g," ").indexOf(a)>=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return b<c[3]-0},gt:function(a,b,c){return b>c[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h<i;h++)if(g[h]===a)return!1;return!0}m.error(e)},CHILD:function(a,b){var c,e,f,g,h,i,j,k=b[1],l=a;switch(k){case"only":case"first":while(l=l.previousSibling)if(l.nodeType===1)return!1;if(k==="first")return!0;l=a;case"last":while(l=l.nextSibling)if(l.nodeType===1)return!1;return!0;case"nth":c=b[2],e=b[3];if(c===1&&e===0)return!0;f=b[0],g=a.parentNode;if(g&&(g[d]!==f||!a.nodeIndex)){i=0;for(l=g.firstChild;l;l=l.nextSibling)l.nodeType===1&&(l.nodeIndex=++i);g[d]=f}j=a.nodeIndex-e;return c===0?j===0:j%c===0&&j/c>=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));o.match.globalPOS=p;var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c<e;c++)d.push(a[c]);else for(;a[c];c++)d.push(a[c]);return d}}var u,v;c.documentElement.compareDocumentPosition?u=function(a,b){if(a===b){h=!0;return 0}if(!a.compareDocumentPosition||!b.compareDocumentPosition)return a.compareDocumentPosition?-1:1;return a.compareDocumentPosition(b)&4?-1:1}:(u=function(a,b){if(a===b){h=!0;return 0}if(a.sourceIndex&&b.sourceIndex)return a.sourceIndex-b.sourceIndex;var c,d,e=[],f=[],g=a.parentNode,i=b.parentNode,j=g;if(g===i)return v(a,b);if(!g)return-1;if(!i)return 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)f.unshift(j),j=j.parentNode;c=e.length,d=f.length;for(var k=0;k<c&&k<d;k++)if(e[k]!==f[k])return v(e[k],f[k]);return k===c?v(a,f[k],-1):v(e[k],b,1)},v=function(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),function(){var a=c.createElement("div"),d="script"+(new Date).getTime(),e=c.documentElement;a.innerHTML="<a name='"+d+"'/>",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="<p class='TEST'></p>";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="<div class='test e'></div><div class='test'></div>";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h<i;h++)m(a,g[h],e,c);return m.filter(f,e)};m.attr=f.attr,m.selectors.attrMap={},f.find=m,f.expr=m.selectors,f.expr[":"]=f.expr.filters,f.unique=m.uniqueSort,f.text=m.getText,f.isXMLDoc=m.isXML,f.contains=m.contains}();var L=/Until$/,M=/^(?:parents|prevUntil|prevAll)/,N=/,/,O=/^.[^:#\[\.,]*$/,P=Array.prototype.slice,Q=f.expr.match.globalPOS,R={children:!0,contents:!0,next:!0,prev:!0};f.fn.extend({find:function(a){var b=this,c,d;if(typeof a!="string")return f(a).filter(function(){for(c=0,d=b.length;c<d;c++)if(f.contains(b[c],this))return!0});var e=this.pushStack("","find",a),g,h,i;for(c=0,d=this.length;c<d;c++){g=e.length,f.find(a,this[c],e);if(c>0)for(h=g;h<e.length;h++)for(i=0;i<g;i++)if(e[i]===e[h]){e.splice(h--,1);break}}return e},has:function(a){var b=f(a);return this.filter(function(){for(var a=0,c=b.length;a<c;a++)if(f.contains(this,b[a]))return!0})},not:function(a){return this.pushStack(T(this,a,!1),"not",a)},filter:function(a){return this.pushStack(T(this,a,!0),"filter",a)},is:function(a){return!!a&&(typeof a=="string"?Q.test(a)?f(a,this.context).index(this[0])>=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d<a.length;d++)f(g).is(a[d])&&c.push({selector:a[d],elem:g,level:h});g=g.parentNode,h++}return c}var i=Q.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d<e;d++){g=this[d];while(g){if(i?i.index(g)>-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/<tbody/i,_=/<|&#?\w+;/,ba=/<(?:script|style)/i,bb=/<(?:script|object|embed|option|style)/i,bc=new RegExp("<(?:"+V+")[\\s/>]","i"),bd=/checked\s*(?:[^=]|=\s*.checked.)/i,be=/\/(java|ecma)script/i,bf=/^\s*<!(?:\[CDATA\[|\-\-)/,bg={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div<div>","</div>"]),f.fn.extend({text:function(a){return f.access(this,function(a){return a===b?f.text(this):this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a))},null,a,arguments.length)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f
-.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){return f.access(this,function(a){var c=this[0]||{},d=0,e=this.length;if(a===b)return c.nodeType===1?c.innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1></$2>");try{for(;d<e;d++)c=this[d]||{},c.nodeType===1&&(f.cleanData(c.getElementsByTagName("*")),c.innerHTML=a);c=0}catch(g){}}c&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(f.isFunction(a))return this.each(function(b){var c=f(this),d=c.html();c.replaceWith(a.call(this,b,d))});typeof a!="string"&&(a=f(a).detach());return this.each(function(){var b=this.nextSibling,c=this.parentNode;f(this).remove(),b?f(b).before(a):f(c).append(a)})}return this.length?this.pushStack(f(f.isFunction(a)?a():a),"replaceWith",a):this},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,d){var e,g,h,i,j=a[0],k=[];if(!f.support.checkClone&&arguments.length===3&&typeof j=="string"&&bd.test(j))return this.each(function(){f(this).domManip(a,c,d,!0)});if(f.isFunction(j))return this.each(function(e){var g=f(this);a[0]=j.call(this,e,c?g.html():b),g.domManip(a,c,d)});if(this[0]){i=j&&j.parentNode,f.support.parentNode&&i&&i.nodeType===11&&i.childNodes.length===this.length?e={fragment:i}:e=f.buildFragment(a,this,k),h=e.fragment,h.childNodes.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&&f.nodeName(g,"tr");for(var l=0,m=this.length,n=m-1;l<m;l++)d.call(c?bi(this[l],g):this[l],e.cacheable||m>1&&l<n?f.clone(h,!0,!0):h)}k.length&&f.each(k,function(a,b){b.src?f.ajax({type:"GET",global:!1,url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(bf,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)})}return this}}),f.buildFragment=function(a,b,d){var e,g,h,i,j=a[0];b&&b[0]&&(i=b[0].ownerDocument||b[0]),i.createDocumentFragment||(i=c),a.length===1&&typeof j=="string"&&j.length<512&&i===c&&j.charAt(0)==="<"&&!bb.test(j)&&(f.support.checkClone||!bd.test(j))&&(f.support.html5Clone||!bc.test(j))&&(g=!0,h=f.fragments[j],h&&h!==1&&(e=h)),e||(e=i.createDocumentFragment(),f.clean(a,i,e,d)),g&&(f.fragments[j]=h?e:1);return{fragment:e,cacheable:g}},f.fragments={},f.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){f.fn[a]=function(c){var d=[],e=f(c),g=this.length===1&&this[0].parentNode;if(g&&g.nodeType===11&&g.childNodes.length===1&&e.length===1){e[b](this[0]);return this}for(var h=0,i=e.length;h<i;h++){var j=(h>0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||f.isXMLDoc(a)||!bc.test("<"+a.nodeName+">")?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g,h,i,j=[];b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);for(var k=0,l;(l=a[k])!=null;k++){typeof l=="number"&&(l+="");if(!l)continue;if(typeof l=="string")if(!_.test(l))l=b.createTextNode(l);else{l=l.replace(Y,"<$1></$2>");var m=(Z.exec(l)||["",""])[1].toLowerCase(),n=bg[m]||bg._default,o=n[0],p=b.createElement("div"),q=bh.childNodes,r;b===c?bh.appendChild(p):U(b).appendChild(p),p.innerHTML=n[1]+l+n[2];while(o--)p=p.lastChild;if(!f.support.tbody){var s=$.test(l),t=m==="table"&&!s?p.firstChild&&p.firstChild.childNodes:n[1]==="<table>"&&!s?p.childNodes:[];for(i=t.length-1;i>=0;--i)f.nodeName(t[i],"tbody")&&!t[i].childNodes.length&&t[i].parentNode.removeChild(t[i])}!f.support.leadingWhitespace&&X.test(l)&&p.insertBefore(b.createTextNode(X.exec(l)[0]),p.firstChild),l=p.childNodes,p&&(p.parentNode.removeChild(p),q.length>0&&(r=q[q.length-1],r&&r.parentNode&&r.parentNode.removeChild(r)))}var u;if(!f.support.appendChecked)if(l[0]&&typeof (u=l.length)=="number")for(i=0;i<u;i++)bn(l[i]);else bn(l);l.nodeType?j.push(l):j=f.merge(j,l)}if(d){g=function(a){return!a.type||be.test(a.type)};for(k=0;j[k];k++){h=j[k];if(e&&f.nodeName(h,"script")&&(!h.type||be.test(h.type)))e.push(h.parentNode?h.parentNode.removeChild(h):h);else{if(h.nodeType===1){var v=f.grep(h.getElementsByTagName("script"),g);j.splice.apply(j,[k+1,0].concat(v))}d.appendChild(h)}}}return j},cleanData:function(a){var b,c,d=f.cache,e=f.event.special,g=f.support.deleteExpando;for(var h=0,i;(i=a[h])!=null;h++){if(i.nodeName&&f.noData[i.nodeName.toLowerCase()])continue;c=i[f.expando];if(c){b=d[c];if(b&&b.events){for(var j in b.events)e[j]?f.event.remove(i,j):f.removeEvent(i,j,b.handle);b.handle&&(b.handle.elem=null)}g?delete i[f.expando]:i.removeAttribute&&i.removeAttribute(f.expando),delete d[c]}}}});var bp=/alpha\([^)]*\)/i,bq=/opacity=([^)]*)/,br=/([A-Z]|^ms)/g,bs=/^[\-+]?(?:\d*\.)?\d+$/i,bt=/^-?(?:\d*\.)?\d+(?!px)[^\d\s]+$/i,bu=/^([\-+])=([\-+.\de]+)/,bv=/^margin/,bw={position:"absolute",visibility:"hidden",display:"block"},bx=["Top","Right","Bottom","Left"],by,bz,bA;f.fn.css=function(a,c){return f.access(this,function(a,c,d){return d!==b?f.style(a,c,d):f.css(a,c)},a,c,arguments.length>1)},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=by(a,"opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h==="string"&&(g=bu.exec(d))&&(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h="number");if(d==null||h==="number"&&isNaN(d))return;h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(by)return by(a,c)},swap:function(a,b,c){var d={},e,f;for(f in b)d[f]=a.style[f],a.style[f]=b[f];e=c.call(a);for(f in b)a.style[f]=d[f];return e}}),f.curCSS=f.css,c.defaultView&&c.defaultView.getComputedStyle&&(bz=function(a,b){var c,d,e,g,h=a.style;b=b.replace(br,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b))),!f.support.pixelMargin&&e&&bv.test(b)&&bt.test(c)&&(g=h.width,h.width=c,c=e.width,h.width=g);return c}),c.documentElement.currentStyle&&(bA=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f==null&&g&&(e=g[b])&&(f=e),bt.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),by=bz||bA,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){if(c)return a.offsetWidth!==0?bB(a,b,d):f.swap(a,bw,function(){return bB(a,b,d)})},set:function(a,b){return bs.test(b)?b+"px":b}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bq.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bp,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bp.test(g)?g.replace(bp,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){return f.swap(a,{display:"inline-block"},function(){return b?by(a,"margin-right"):a.style.marginRight})}})}),f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)}),f.each({margin:"",padding:"",border:"Width"},function(a,b){f.cssHooks[a+b]={expand:function(c){var d,e=typeof c=="string"?c.split(" "):[c],f={};for(d=0;d<4;d++)f[a+bx[d]+b]=e[d]||e[d-2]||e[0];return f}}});var bC=/%20/g,bD=/\[\]$/,bE=/\r?\n/g,bF=/#.*$/,bG=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bH=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bI=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bJ=/^(?:GET|HEAD)$/,bK=/^\/\//,bL=/\?/,bM=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bN=/^(?:select|textarea)/i,bO=/\s+/,bP=/([?&])_=[^&]*/,bQ=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bR=f.fn.load,bS={},bT={},bU,bV,bW=["*/"]+["*"];try{bU=e.href}catch(bX){bU=c.createElement("a"),bU.href="",bU=bU.href}bV=bQ.exec(bU.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bR)return bR.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("<div>").append(c.replace(bM,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bN.test(this.nodeName)||bH.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bE,"\r\n")}}):{name:b.name,value:c.replace(bE,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b$(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b$(a,b);return a},ajaxSettings:{url:bU,isLocal:bI.test(bV[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bW},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bY(bS),ajaxTransport:bY(bT),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?ca(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cb(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bG.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bF,"").replace(bK,bV[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bO),d.crossDomain==null&&(r=bQ.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bV[1]&&r[2]==bV[2]&&(r[3]||(r[1]==="http:"?80:443))==(bV[3]||(bV[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bZ(bS,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bJ.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bL.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bP,"$1_="+x);d.url=y+(y===d.url?(bL.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bW+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bZ(bT,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)b_(g,a[g],c,e);return d.join("&").replace(bC,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cc=f.now(),cd=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cc++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=typeof b.data=="string"&&/^application\/x\-www\-form\-urlencoded/.test(b.contentType);if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(cd.test(b.url)||e&&cd.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(cd,l),b.url===j&&(e&&(k=k.replace(cd,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var ce=a.ActiveXObject?function(){for(var a in cg)cg[a](0,1)}:!1,cf=0,cg;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ch()||ci()}:ch,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,ce&&delete cg[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n);try{m.text=h.responseText}catch(a){}try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cf,ce&&(cg||(cg={},f(a).unload(ce)),cg[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cj={},ck,cl,cm=/^(?:toggle|show|hide)$/,cn=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,co,cp=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cq;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(ct("show",3),a,b,c);for(var g=0,h=this.length;g<h;g++)d=this[g],d.style&&(e=d.style.display,!f._data(d,"olddisplay")&&e==="none"&&(e=d.style.display=""),(e===""&&f.css(d,"display")==="none"||!f.contains(d.ownerDocument.documentElement,d))&&f._data(d,"olddisplay",cu(d.nodeName)));for(g=0;g<h;g++){d=this[g];if(d.style){e=d.style.display;if(e===""||e==="none")d.style.display=f._data(d,"olddisplay")||""}}return this},hide:function(a,b,c){if(a||a===0)return this.animate(ct("hide",3),a,b,c);var d,e,g=0,h=this.length;for(;g<h;g++)d=this[g],d.style&&(e=f.css(d,"display"),e!=="none"&&!f._data(d,"olddisplay")&&f._data(d,"olddisplay",e));for(g=0;g<h;g++)this[g].style&&(this[g].style.display="none");return this},_toggle:f.fn.toggle,toggle:function(a,b,c){var d=typeof a=="boolean";f.isFunction(a)&&f.isFunction(b)?this._toggle.apply(this,arguments):a==null||d?this.each(function(){var b=d?a:f(this).is(":hidden");f(this)[b?"show":"hide"]()}):this.animate(ct("toggle",3),a,b,c);return this},fadeTo:function(a,b,c,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){function g(){e.queue===!1&&f._mark(this);var b=f.extend({},e),c=this.nodeType===1,d=c&&f(this).is(":hidden"),g,h,i,j,k,l,m,n,o,p,q;b.animatedProperties={};for(i in a){g=f.camelCase(i),i!==g&&(a[g]=a[i],delete a[i]);if((k=f.cssHooks[g])&&"expand"in k){l=k.expand(a[g]),delete a[g];for(i in l)i in a||(a[i]=l[i])}}for(g in a){h=a[g],f.isArray(h)?(b.animatedProperties[g]=h[1],h=a[g]=h[0]):b.animatedProperties[g]=b.specialEasing&&b.specialEasing[g]||b.easing||"swing";if(h==="hide"&&d||h==="show"&&!d)return b.complete.call(this);c&&(g==="height"||g==="width")&&(b.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY],f.css(this,"display")==="inline"&&f.css(this,"float")==="none"&&(!f.support.inlineBlockNeedsLayout||cu(this.nodeName)==="inline"?this.style.display="inline-block":this.style.zoom=1))}b.overflow!=null&&(this.style.overflow="hidden");for(i in a)j=new f.fx(this,b,i),h=a[i],cm.test(h)?(q=f._data(this,"toggle"+i)||(h==="toggle"?d?"show":"hide":0),q?(f._data(this,"toggle"+i,q==="show"?"hide":"show"),j[q]()):j[h]()):(m=cn.exec(h),n=j.cur(),m?(o=parseFloat(m[2]),p=m[3]||(f.cssNumber[i]?"":"px"),p!=="px"&&(f.style(this,i,(o||1)+p),n=(o||1)/j.cur()*n,f.style(this,i,n+p)),m[1]&&(o=(m[1]==="-="?-1:1)*o+n),j.custom(n,o,p)):j.custom(n,h,""));return!0}var e=f.speed(b,c,d);if(f.isEmptyObject(a))return this.each(e.complete,[!1]);a=f.extend({},a);return e.queue===!1?this.each(g):this.queue(e.queue,g)},stop:function(a,c,d){typeof a!="string"&&(d=c,c=a,a=b),c&&a!==!1&&this.queue(a||"fx",[]);return this.each(function(){function h(a,b,c){var e=b[c];f.removeData(a,c,!0),e.stop(d)}var b,c=!1,e=f.timers,g=f._data(this);d||f._unmark(!0,this);if(a==null)for(b in g)g[b]&&g[b].stop&&b.indexOf(".run")===b.length-4&&h(this,g,b);else g[b=a+".run"]&&g[b].stop&&h(this,g,b);for(b=e.length;b--;)e[b].elem===this&&(a==null||e[b].queue===a)&&(d?e[b](!0):e[b].saveState(),c=!0,e.splice(b,1));(!d||!c)&&f.dequeue(this,a)})}}),f.each({slideDown:ct("show",1),slideUp:ct("hide",1),slideToggle:ct("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){f.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),f.extend({speed:function(a,b,c){var d=a&&typeof a=="object"?f.extend({},a):{complete:c||!c&&b||f.isFunction(a)&&a,duration:a,easing:c&&b||b&&!f.isFunction(b)&&b};d.duration=f.fx.off?0:typeof d.duration=="number"?d.duration:d.duration in f.fx.speeds?f.fx.speeds[d.duration]:f.fx.speeds._default;if(d.queue==null||d.queue===!0)d.queue="fx";d.old=d.complete,d.complete=function(a){f.isFunction(d.old)&&d.old.call(this),d.queue?f.dequeue(this,d.queue):a!==!1&&f._unmark(this)};return d},easing:{linear:function(a){return a},swing:function(a){return-Math.cos(a*Math.PI)/2+.5}},timers:[],fx:function(a,b,c){this.options=b,this.elem=a,this.prop=c,b.orig=b.orig||{}}}),f.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this),(f.fx.step[this.prop]||f.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a,b=f.css(this.elem,this.prop);return isNaN(a=parseFloat(b))?!b||b==="auto"?0:b:a},custom:function(a,c,d){function h(a){return e.step(a)}var e=this,g=f.fx;this.startTime=cq||cr(),this.end=c,this.now=this.start=a,this.pos=this.state=0,this.unit=d||this.unit||(f.cssNumber[this.prop]?"":"px"),h.queue=this.options.queue,h.elem=this.elem,h.saveState=function(){f._data(e.elem,"fxshow"+e.prop)===b&&(e.options.hide?f._data(e.elem,"fxshow"+e.prop,e.start):e.options.show&&f._data(e.elem,"fxshow"+e.prop,e.end))},h()&&f.timers.push(h)&&!co&&(co=setInterval(g.tick,g.interval))},show:function(){var a=f._data(this.elem,"fxshow"+this.prop);this.options.orig[this.prop]=a||f.style(this.elem,this.prop),this.options.show=!0,a!==b?this.custom(this.cur(),a):this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur()),f(this.elem).show()},hide:function(){this.options.orig[this.prop]=f._data(this.elem,"fxshow"+this.prop)||f.style(this.elem,this.prop),this.options.hide=!0,this.custom(this.cur(),0)},step:function(a){var b,c,d,e=cq||cr(),g=!0,h=this.elem,i=this.options;if(a||e>=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c<b.length;c++)a=b[c],!a()&&b[c]===a&&b.splice(c--,1);b.length||f.fx.stop()},interval:13,stop:function(){clearInterval(co),co=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){f.style(a.elem,"opacity",a.now)},_default:function(a){a.elem.style&&a.elem.style[a.prop]!=null?a.elem.style[a.prop]=a.now+a.unit:a.elem[a.prop]=a.now}}}),f.each(cp.concat.apply([],cp),function(a,b){b.indexOf("margin")&&(f.fx.step[b]=function(a){f.style(a.elem,b,Math.max(0,a.now)+a.unit)})}),f.expr&&f.expr.filters&&(f.expr.filters.animated=function(a){return f.grep(f.timers,function(b){return a===b.elem}).length});var cv,cw=/^t(?:able|d|h)$/i,cx=/^(?:body|html)$/i;"getBoundingClientRect"in c.documentElement?cv=function(a,b,c,d){try{d=a.getBoundingClientRect()}catch(e){}if(!d||!f.contains(c,a))return d?{top:d.top,left:d.left}:{top:0,left:0};var g=b.body,h=cy(b),i=c.clientTop||g.clientTop||0,j=c.clientLeft||g.clientLeft||0,k=h.pageYOffset||f.support.boxModel&&c.scrollTop||g.scrollTop,l=h.pageXOffset||f.support.boxModel&&c.scrollLeft||g.scrollLeft,m=d.top+k-i,n=d.left+l-j;return{top:m,left:n}}:cv=function(a,b,c){var d,e=a.offsetParent,g=a,h=b.body,i=b.defaultView,j=i?i.getComputedStyle(a,null):a.currentStyle,k=a.offsetTop,l=a.offsetLeft;while((a=a.parentNode)&&a!==h&&a!==c){if(f.support.fixedPosition&&j.position==="fixed")break;d=i?i.getComputedStyle(a,null):a.currentStyle,k-=a.scrollTop,l-=a.scrollLeft,a===e&&(k+=a.offsetTop,l+=a.offsetLeft,f.support.doesNotAddBorder&&(!f.support.doesAddBorderForTableAndCells||!cw.test(a.nodeName))&&(k+=parseFloat(d.borderTopWidth)||0,l+=parseFloat(d.borderLeftWidth)||0),g=e,e=a.offsetParent),f.support.subtractsBorderForOverflowNotVisible&&d.overflow!=="visible"&&(k+=parseFloat(d.borderTopWidth)||0,l+=parseFloat(d.borderLeftWidth)||0),j=d}if(j.position==="relative"||j.position==="static")k+=h.offsetTop,l+=h.offsetLeft;f.support.fixedPosition&&j.position==="fixed"&&(k+=Math.max(c.scrollTop,h.scrollTop),l+=Math.max(c.scrollLeft,h.scrollLeft));return{top:k,left:l}},f.fn.offset=function(a){if(arguments.length)return a===b?this:this.each(function(b){f.offset.setOffset(this,a,b)});var c=this[0],d=c&&c.ownerDocument;if(!d)return null;if(c===d.body)return f.offset.bodyOffset(c);return cv(c,d,d.documentElement)},f.offset={bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.support.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,c){var d=/Y/.test(c);f.fn[a]=function(e){return f.access(this,function(a,e,g){var h=cy(a);if(g===b)return h?c in h?h[c]:f.support.boxModel&&h.document.documentElement[e]||h.document.body[e]:a[e];h?h.scrollTo(d?f(h).scrollLeft():g,d?g:f(h).scrollTop()):a[e]=g},a,e,arguments.length,null)}}),f.each({Height:"height",Width:"width"},function(a,c){var d="client"+a,e="scroll"+a,g="offset"+a;f.fn["inner"+a]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,c,"padding")):this[c]():null},f.fn["outer"+a]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,c,a?"margin":"border")):this[c]():null},f.fn[c]=function(a){return f.access(this,function(a,c,h){var i,j,k,l;if(f.isWindow(a)){i=a.document,j=i.documentElement[d];return f.support.boxModel&&j||i.body&&i.body[d]||j}if(a.nodeType===9){i=a.documentElement;if(i[d]>=i[e])return i[d];return Math.max(a.body[e],i[e],a.body[g],i[g])}if(h===b){k=f.css(a,c),l=parseFloat(k);return f.isNumeric(l)?l:k}f(a).css(c,h)},c,a,arguments.length,null)}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window); \ No newline at end of file
diff --git a/js/main.js b/js/main.js
deleted file mode 100644
index ed8d4ec3f..000000000
--- a/js/main.js
+++ /dev/null
@@ -1,954 +0,0 @@
-
- function confirmDelete() { return confirm(aStr['delitem']); }
- function commentOpen(obj,id) {
- if(obj.value == aStr['comment']) {
- obj.value = '';
- $("#comment-edit-text-" + id).addClass("comment-edit-text-full");
- $("#comment-edit-text-" + id).removeClass("comment-edit-text-empty");
- $("#mod-cmnt-wrap-" + id).show();
- openMenu("comment-edit-submit-wrapper-" + id);
- return true;
- }
- return false;
- }
- function commentClose(obj,id) {
- if(obj.value == '') {
- obj.value = aStr['comment'];
- $("#comment-edit-text-" + id).removeClass("comment-edit-text-full");
- $("#comment-edit-text-" + id).addClass("comment-edit-text-empty");
- $("#mod-cmnt-wrap-" + id).hide();
- closeMenu("comment-edit-submit-wrapper-" + id);
- return true;
- }
- return false;
- }
-
- function showHideCommentBox(id) {
- if( $('#comment-edit-form-' + id).is(':visible')) {
- $('#comment-edit-form-' + id).hide();
- }
- else {
- $('#comment-edit-form-' + id).show();
- }
- }
-
-
- function commentInsert(obj,id) {
- var tmpStr = $("#comment-edit-text-" + id).val();
- if(tmpStr == '$comment') {
- tmpStr = '';
- $("#comment-edit-text-" + id).addClass("comment-edit-text-full");
- $("#comment-edit-text-" + id).removeClass("comment-edit-text-empty");
- openMenu("comment-edit-submit-wrapper-" + id);
- }
- var ins = $(obj).html();
- ins = ins.replace('&lt;','<');
- ins = ins.replace('&gt;','>');
- ins = ins.replace('&amp;','&');
- ins = ins.replace('&quot;','"');
- $("#comment-edit-text-" + id).val(tmpStr + ins);
- }
-
- function qCommentInsert(obj,id) {
- var tmpStr = $("#comment-edit-text-" + id).val();
- if(tmpStr == aStr['comment']) {
- tmpStr = '';
- $("#comment-edit-text-" + id).addClass("comment-edit-text-full");
- $("#comment-edit-text-" + id).removeClass("comment-edit-text-empty");
- openMenu("comment-edit-submit-wrapper-" + id);
- }
- var ins = $(obj).val();
- ins = ins.replace('&lt;','<');
- ins = ins.replace('&gt;','>');
- ins = ins.replace('&amp;','&');
- ins = ins.replace('&quot;','"');
- $("#comment-edit-text-" + id).val(tmpStr + ins);
- $(obj).val('');
- }
-
- function showHideComments(id) {
- if( $('#collapsed-comments-' + id).is(':visible')) {
- $('#collapsed-comments-' + id).hide();
- $('#hide-comments-' + id).html(aStr['showmore']);
- }
- else {
- $('#collapsed-comments-' + id).show();
- $('#hide-comments-' + id).html(aStr['showfewer']);
- }
- }
-
-
- function openClose(theID) {
- if(document.getElementById(theID).style.display == "block") {
- document.getElementById(theID).style.display = "none"
- }
- else {
- document.getElementById(theID).style.display = "block"
- }
- }
-
- function openMenu(theID) {
- document.getElementById(theID).style.display = "block"
- }
-
- function closeMenu(theID) {
- document.getElementById(theID).style.display = "none"
- }
-
- function markRead(notifType) {
- $.get('ping?f=&markRead='+notifType);
- if(timer) clearTimeout(timer);
- timer = setTimeout(NavUpdate,2000);
- }
-
- var src = null;
- var prev = null;
- var livetime = null;
- var msie = false;
- var stopped = false;
- var totStopped = false;
- var timer = null;
- var pr = 0;
- var liking = 0;
- var in_progress = false;
- var langSelect = false;
- var commentBusy = false;
- var last_popup_menu = null;
- var last_popup_button = null;
- var scroll_next = false;
- var next_page = 1;
- var page_load = true;
-
- $(function() {
- $.ajaxSetup({cache: false});
-
- msie = $.browser.msie ;
-
- /* setup tooltips *//*
- $("a,.tt").each(function(){
- var e = $(this);
- var pos="bottom";
- if (e.hasClass("tttop")) pos="top";
- if (e.hasClass("ttbottom")) pos="bottom";
- if (e.hasClass("ttleft")) pos="left";
- if (e.hasClass("ttright")) pos="right";
- e.tipTip({defaultPosition: pos, edgeOffset: 8});
- });*/
-
-
-
- /* setup onoff widgets */
- $(".onoff input").each(function(){
- val = $(this).val();
- id = $(this).attr("id");
- $("#"+id+"_onoff ."+ (val==0?"on":"off")).addClass("hidden");
-
- });
- $(".onoff > a").click(function(event){
- event.preventDefault();
- var input = $(this).siblings("input");
- var val = 1-input.val();
- var id = input.attr("id");
- $("#"+id+"_onoff ."+ (val==0?"on":"off")).addClass("hidden");
- $("#"+id+"_onoff ."+ (val==1?"on":"off")).removeClass("hidden");
- input.val(val);
- //console.log(id);
- });
-
- /* setup field_richtext */
- setupFieldRichtext();
-
- /* popup menus */
- function close_last_popup_menu() {
- if(last_popup_menu) {
- last_popup_menu.hide();
- last_popup_button.removeClass("selected");
- last_popup_menu = null;
- last_popup_button = null;
- }
- }
-
- /* Turn elements with one of our special rel tags into popup menus */
-
- $('a[rel^=#]').click(function(e){
- manage_popup_menu(this,e);
- return false;
- });
-
- $('span[rel^=#]').click(function(e){
- manage_popup_menu(this,e);
- return false;
- });
-
-
- function manage_popup_menu(w,e) {
- close_last_popup_menu();
- menu = $( $(w).attr('rel') );
- e.preventDefault();
- e.stopPropagation();
- if (menu.attr('popup')=="false") return false;
- $(w).parent().toggleClass("selected");
- /* notification menus are loaded dynamically
- * - here we find a rel tag to figure out what type of notification to load */
- var loader_source = $(menu).attr('rel');
-
- if(typeof(loader_source) != 'undefined' && loader_source.length) {
- notify_popup_loader(loader_source);
- }
- menu.toggle();
- if (menu.css("display") == "none") {
- last_popup_menu = null;
- last_popup_button = null;
- } else {
- last_popup_menu = menu;
- last_popup_button = $(w).parent();
- }
- return false;
- }
-
- $('html').click(function() {
- close_last_popup_menu();
- });
-
- // fancyboxes
- $("a.popupbox").fancybox({
- 'transitionIn' : 'elastic',
- 'transitionOut' : 'elastic'
- });
-
-
-
- NavUpdate();
- // Allow folks to stop the ajax page updates with the pause/break key
- $(document).keydown(function(event) {
- if(event.keyCode == '8') {
- var target = event.target || event.srcElement;
- if (!/input|textarea/i.test(target.nodeName)) {
- return false;
- }
- }
- if(event.keyCode == '19' || (event.ctrlKey && event.which == '32')) {
- event.preventDefault();
- if(stopped == false) {
- stopped = true;
- if (event.ctrlKey) {
- totStopped = true;
- }
- $('#pause').html('<img src="images/pause.gif" alt="pause" style="border: 1px solid black;" />');
- } else {
- unpause();
- }
- } else {
- if (!totStopped) {
- unpause();
- }
- }
- });
-
-
- });
-
- function NavUpdate() {
-
- if(liking)
- $('.like-rotator').hide();
-
- if(! stopped) {
-
- var pingCmd = 'ping' + ((localUser != 0) ? '?f=&uid=' + localUser : '');
-
- $.get(pingCmd,function(data) {
-
- if(data.invalid == 1) {
- window.location.href=window.location.href
- }
-
-
- // start live update
-
- if($('#live-network').length) { src = 'network'; liveUpdate(); }
- if($('#live-channel').length) { src = 'channel'; liveUpdate(); }
- if($('#live-community').length) { src = 'community'; liveUpdate(); }
- if($('#live-display').length) { src = 'display'; liveUpdate(); }
-
- if($('#live-photos').length) {
- if(liking) {
- liking = 0;
- window.location.href=window.location.href
- }
- }
-
-
- if(data.network == 0) {
- data.network = '';
- $('#net-update').removeClass('show')
- }
- else {
- $('#net-update').addClass('show')
- }
- $('#net-update').html(data.network);
-
- if(data.home == 0) { data.home = ''; $('#home-update').removeClass('show') } else { $('#home-update').addClass('show') }
- $('#home-update').html(data.home);
-
-
- if(data.intros == 0) { data.intros = ''; $('#intro-update').removeClass('show') } else { $('#intro-update').addClass('show') }
- $('#intro-update').html(data.intros);
-
- if(data.mail == 0) { data.mail = ''; $('#mail-update').removeClass('show') } else { $('#mail-update').addClass('show') }
- $('#mail-update').html(data.mail);
-
-
- if(data.notify == 0) { data.notify = ''; $('#notify-update').removeClass('show') } else { $('#notify-update').addClass('show') }
- $('#notify-update').html(data.notify);
-
- if(data.register == 0) { data.register = ''; $('#register-update').removeClass('show') } else { $('#register-update').addClass('show') }
- $('#register-update').html(data.register);
-
- if(data.events == 0) { data.events = ''; $('#events-update').removeClass('show') } else { $('#events-update').addClass('show') }
- $('#events-update').html(data.events);
-
- if(data.events_today == 0) { data.events_today = ''; $('#events-today-update').removeClass('show') } else { $('#events-today-update').addClass('show') }
- $('#events-today-update').html(data.events_today);
-
- if(data.birthdays == 0) { data.birthdays = ''; $('#birthdays-update').removeClass('show') } else { $('#birthdays-update').addClass('show') }
- $('#birthdays-update').html(data.birthdays);
-
- if(data.birthdays_today == 0) { data.birthdays_today = ''; $('#birthdays-today-update').removeClass('show') } else { $('#birthdays-today-update').addClass('show') }
- $('#birthdays-today-update').html(data.birthdays_today);
-
- if(data.all_events == 0) { data.all_events = ''; $('#all_events-update').removeClass('show') } else { $('#all_events-update').addClass('show') }
- $('#all_events-update').html(data.all_events);
- if(data.all_events_today == 0) { data.all_events_today = ''; $('#all_events-today-update').removeClass('show') } else { $('#all_events-today-update').addClass('show') }
- $('#all_events-today-update').html(data.all_events_today);
-
-
- $(data.notice).each(function() {
- $.jGrowl(this.message, { sticky: true, theme: 'notice' });
- });
-
- $(data.info).each(function(){
- $.jGrowl(this.message, { sticky: false, theme: 'info', life: 10000 });
- });
-
-
-
- }) ;
- }
- timer = setTimeout(NavUpdate,updateInterval);
- }
-
-
-function updateConvItems(mode,data) {
-
- if(mode === 'update') {
- prev = 'threads-begin';
-
- $('.thread-wrapper.toplevel_item',data).each(function() {
- var ident = $(this).attr('id');
-
- if($('#' + ident).length == 0 && profile_page == 1) {
- $('img',this).each(function() {
- $(this).attr('src',$(this).attr('dst'));
- });
- $('#' + prev).after($(this));
- $("div.wall-item-ago").timeago();
- // divgrow doesn't prevent itself from attaching a second (or 500th)
- // "show more" div to a content region - it also has a few other
- // issues related to how we're trying to use it.
- // disable for now.
- // $("div.wall-item-body").divgrow({ initialHeight: 400 });
- }
- else {
- $('img',this).each(function() {
- $(this).attr('src',$(this).attr('dst'));
- });
- $('#' + ident).replaceWith($(this));
- $("div.wall-item-ago").timeago();
- // $("div.wall-item-body").divgrow({ initialHeight: 400 });
-
- }
- prev = ident;
- });
- }
- if(mode === 'append') {
- next = 'threads-end';
- $('.thread-wrapper.toplevel_item',data).each(function() {
- var ident = $(this).attr('id');
-
- if($('#' + ident).length == 0) {
- $('img',this).each(function() {
- $(this).attr('src',$(this).attr('dst'));
- });
- $('#threads-end').before($(this));
- $("div.wall-item-ago").timeago();
- // $("div.wall-item-body").divgrow({ initialHeight: 400 });
-
- }
- else {
- $('img',this).each(function() {
- $(this).attr('src',$(this).attr('dst'));
- });
- $('#' + ident).replaceWith($(this));
- $("div.wall-item-ago").timeago();
- // $("div.wall-item-body").divgrow({ initialHeight: 400 });
- }
- });
- }
- if(mode === 'replace') {
- // clear existing content
- $('.thread-wrapper').remove();
-
- prev = 'threads-begin';
-
- $('.thread-wrapper.toplevel_item',data).each(function() {
- var ident = $(this).attr('id');
-
- if($('#' + ident).length == 0 && profile_page == 1) {
- $('img',this).each(function() {
- $(this).attr('src',$(this).attr('dst'));
- });
- $('#' + prev).after($(this));
- $("div.wall-item-ago").timeago();
-
- // $("div.wall-item-body").divgrow({ initialHeight: 400 });
- }
- prev = ident;
- });
- }
-
- $('.like-rotator').hide();
-
- if(commentBusy) {
- commentBusy = false;
- $('body').css('cursor', 'auto');
- }
-
- /* autocomplete @nicknames */
- $(".comment-edit-form textarea").contact_autocomplete(baseurl+"/acl");
-
- var bimgs = $(".wall-item-body > img").not(function() { return this.complete; });
- var bimgcount = bimgs.length;
-
- if (bimgcount) {
- bimgs.load(function() {
- bimgcount--;
- if (! bimgcount) {
- collapseHeight();
-
- }
- });
- } else {
- collapseHeight();
- }
-
-
- // $(".wall-item-body").each(function() {
- // if(! $(this).hasClass('divmore')) {
- // $(this).divgrow({ initialHeight: 400, showBrackets: false });
- // $(this).addClass('divmore');
- // }
- //});
-
-}
-
-
- function collapseHeight() {
- $(".wall-item-body").each(function() {
- if($(this).height() > 410) {
- if(! $(this).hasClass('divmore')) {
- $(this).divgrow({ initialHeight: 400, showBrackets: false });
- $(this).addClass('divmore');
- }
- }
- });
- }
-
-
-
-
-
- function liveUpdate() {
- if((src == null) || (stopped) || (! profile_uid)) { $('.like-rotator').hide(); return; }
- if(($('.comment-edit-text-full').length) || (in_progress)) {
- if(livetime) {
- clearTimeout(livetime);
- }
- livetime = setTimeout(liveUpdate, 10000);
- return;
- }
- if(livetime != null)
- livetime = null;
-
- prev = 'live-' + src;
-
- in_progress = true;
-
- var update_url;
-
- if(typeof buildCmd == 'function') {
- if(scroll_next) {
- bParam_page = next_page;
- page_load = true;
- }
- else {
- bParam_page = 1;
- }
- update_url = buildCmd();
- }
- else {
- page_load = false;
- var udargs = ((page_load) ? '/load' : '');
- update_url = 'update_' + src + udargs + '&p=' + profile_uid + '&page=' + profile_page + '&msie=' + ((msie) ? 1 : 0);
- }
-
- if(page_load)
- $("#page-spinner").show();
-
- $.get(update_url,function(data) {
- var update_mode = ((page_load) ? 'replace' : 'update');
- if(scroll_next)
- update_mode = 'append';
- page_load = false;
- scroll_next = false;
- in_progress = false;
- updateConvItems(update_mode,data);
- $("#page-spinner").hide();
- $("#profile-jot-text-loading").hide();
-
- });
-
-
- }
-
-
- function imgbright(node) {
- $(node).removeClass("drophide").addClass("drop");
- }
-
- function imgdull(node) {
- $(node).removeClass("drop").addClass("drophide");
- }
-
- function notify_popup_loader(notifyType) {
-
- /* notifications template */
- var notifications_tpl= unescape($("#nav-notifications-template[rel=template]").html());
- var notifications_all = unescape($('<div>').append( $("#nav-" + notifyType + "-see-all").clone() ).html()); //outerHtml hack
- var notifications_mark = unescape($('<div>').append( $("#nav-" + notifyType + "-mark-all").clone() ).html()); //outerHtml hack
- var notifications_empty = unescape($("#nav-" + notifyType + "-menu").html());
-
- var notify_menu = $("#nav-" + notifyType + "-menu");
-
- var pingExCmd = 'ping/' + notifyType + ((localUser != 0) ? '?f=&uid=' + localUser : '');
- $.get(pingExCmd,function(data) {
-
- if(data.invalid == 1) {
- window.location.href=window.location.href
- }
-
-
- if(data.notify.length==0){
- $("#nav-" + notifyType + "-menu").html(notifications_empty);
-
- } else {
- $("#nav-" + notifyType + "-menu").html(notifications_all + notifications_mark);
-
-
- $(data.notify).each(function() {
- text = "<span class='contactname'>"+this.name+"</span>" + ' ' + this.message + '<br />';
- html = notifications_tpl.format(this.notify_link,this.photo,text,this.when,this.class);
- $("#nav-" + notifyType + "-menu").append(html);
- });
-
- }
- });
-
- }
-
-
- // Since our ajax calls are asynchronous, we will give a few
- // seconds for the first ajax call (setting like/dislike), then
- // run the updater to pick up any changes and display on the page.
- // The updater will turn any rotators off when it's done.
- // This function will have returned long before any of these
- // events have completed and therefore there won't be any
- // visible feedback that anything changed without all this
- // trickery. This still could cause confusion if the "like" ajax call
- // is delayed and NavUpdate runs before it completes.
-
-
- function dolike(ident,verb) {
- unpause();
- $('#like-rotator-' + ident.toString()).show();
- $.get('like/' + ident.toString() + '?verb=' + verb, NavUpdate );
- liking = 1;
- }
-
- function dosubthread(ident) {
- unpause();
- $('#like-rotator-' + ident.toString()).show();
- $.get('subthread/' + ident.toString(), NavUpdate );
- liking = 1;
- }
-
-
- function dostar(ident) {
- ident = ident.toString();
- $('#like-rotator-' + ident).show();
- $.get('starred/' + ident, function(data) {
- if(data.result == 1) {
- $('#starred-' + ident).addClass('starred');
- $('#starred-' + ident).removeClass('unstarred');
- $('#star-' + ident).addClass('hidden');
- $('#unstar-' + ident).removeClass('hidden');
- }
- else {
- $('#starred-' + ident).addClass('unstarred');
- $('#starred-' + ident).removeClass('starred');
- $('#star-' + ident).removeClass('hidden');
- $('#unstar-' + ident).addClass('hidden');
- }
- $('#like-rotator-' + ident).hide();
- });
- }
-
- function getPosition(e) {
- var cursor = {x:0, y:0};
- if ( e.pageX || e.pageY ) {
- cursor.x = e.pageX;
- cursor.y = e.pageY;
- }
- else {
- if( e.clientX || e.clientY ) {
- cursor.x = e.clientX + (document.documentElement.scrollLeft || document.body.scrollLeft) - document.documentElement.clientLeft;
- cursor.y = e.clientY + (document.documentElement.scrollTop || document.body.scrollTop) - document.documentElement.clientTop;
- }
- else {
- if( e.x || e.y ) {
- cursor.x = e.x;
- cursor.y = e.y;
- }
- }
- }
- return cursor;
- }
-
- var lockvisible = false;
-
- function lockview(event,id) {
- event = event || window.event;
- cursor = getPosition(event);
- if(lockvisible) {
- lockviewhide();
- }
- else {
- lockvisible = true;
- $.get('lockview/' + id, function(data) {
- $('#panel').html(data);
- $('#panel').css({ 'left': cursor.x + 5 , 'top': cursor.y + 5});
- $('#panel').show();
- });
- }
- }
-
- function lockviewhide() {
- lockvisible = false;
- $('#panel').hide();
- }
-
- function post_comment(id) {
- unpause();
- commentBusy = true;
- $('body').css('cursor', 'wait');
- $("#comment-preview-inp-" + id).val("0");
- $.post(
- "item",
- $("#comment-edit-form-" + id).serialize(),
- function(data) {
- if(data.success) {
- $("#comment-edit-wrapper-" + id).hide();
- $("#comment-edit-text-" + id).val('');
- var tarea = document.getElementById("comment-edit-text-" + id);
- if(tarea)
- commentClose(tarea,id);
- if(timer) clearTimeout(timer);
- timer = setTimeout(NavUpdate,1500);
- }
- if(data.reload) {
- window.location.href=data.reload;
- }
- },
- "json"
- );
- return false;
- }
-
-
- function preview_comment(id) {
- $("#comment-preview-inp-" + id).val("1");
- $("#comment-edit-preview-" + id).show();
- $.post(
- "item",
- $("#comment-edit-form-" + id).serialize(),
- function(data) {
- if(data.preview) {
-
- $("#comment-edit-preview-" + id).html(data.preview);
- $("#comment-edit-preview-" + id + " a").click(function() { return false; });
- }
- },
- "json"
- );
- return true;
- }
-
-
-
- function preview_post() {
- $("#jot-preview").val("1");
- $("#jot-preview-content").show();
- tinyMCE.triggerSave();
- $.post(
- "item",
- $("#profile-jot-form").serialize(),
- function(data) {
- if(data.preview) {
- $("#jot-preview-content").html(data.preview);
- $("#jot-preview-content" + " a").click(function() { return false; });
- }
- },
- "json"
- );
- $("#jot-preview").val("0");
- return true;
- }
-
-
- function unpause() {
- // unpause auto reloads if they are currently stopped
- totStopped = false;
- stopped = false;
- $('#pause').html('');
- }
-
-
- function bin2hex(s){
- // Converts the binary representation of data to hex
- //
- // version: 812.316
- // discuss at: http://phpjs.org/functions/bin2hex
- // + original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
- // + bugfixed by: Onno Marsman
- // + bugfixed by: Linuxworld
- // * example 1: bin2hex('Kev');
- // * returns 1: '4b6576'
- // * example 2: bin2hex(String.fromCharCode(0x00));
- // * returns 2: '00'
- var v,i, f = 0, a = [];
- s += '';
- f = s.length;
-
- for (i = 0; i<f; i++) {
- a[i] = s.charCodeAt(i).toString(16).replace(/^([\da-f])$/,"0$1");
- }
-
- return a.join('');
- }
-
- function groupChangeMember(gid, cid, sec_token) {
- $('body .fakelink').css('cursor', 'wait');
- $.get('group/' + gid + '/' + cid + "?t=" + sec_token, function(data) {
- $('#group-update-wrapper').html(data);
- $('body .fakelink').css('cursor', 'auto');
- });
- }
-
- function profChangeMember(gid,cid) {
- $('body .fakelink').css('cursor', 'wait');
- $.get('profperm/' + gid + '/' + cid, function(data) {
- $('#prof-update-wrapper').html(data);
- $('body .fakelink').css('cursor', 'auto');
- });
- }
-
- function contactgroupChangeMember(gid,cid) {
- $('body').css('cursor', 'wait');
- $.get('contactgroup/' + gid + '/' + cid, function(data) {
- $('body').css('cursor', 'auto');
- });
- }
-
-
-function checkboxhighlight(box) {
- if($(box).is(':checked')) {
- $(box).addClass('checkeditem');
- }
- else {
- $(box).removeClass('checkeditem');
- }
-}
-
-
-// code from http://www.tinymce.com/wiki.php/How-to_implement_a_custom_file_browser
-function fcFileBrowser (field_name, url, type, win) {
- /* TODO: If you work with sessions in PHP and your client doesn't accept cookies you might need to carry
- the session name and session ID in the request string (can look like this: "?PHPSESSID=88p0n70s9dsknra96qhuk6etm5").
- These lines of code extract the necessary parameters and add them back to the filebrowser URL again. */
-
-
- var cmsURL = baseurl+"/fbrowser/"+type+"/";
-
- tinyMCE.activeEditor.windowManager.open({
- file : cmsURL,
- title : 'File Browser',
- width : 420, // Your dimensions may differ - toy around with them!
- height : 400,
- resizable : "yes",
- inline : "yes", // This parameter only has an effect if you use the inlinepopups plugin!
- close_previous : "no"
- }, {
- window : win,
- input : field_name
- });
- return false;
- }
-
-function setupFieldRichtext(){
- tinyMCE.init({
- theme : "advanced",
- mode : "specific_textareas",
- editor_selector: "fieldRichtext",
- plugins : "bbcode,paste, inlinepopups",
- theme_advanced_buttons1 : "bold,italic,underline,undo,redo,link,unlink,image,forecolor,formatselect,code",
- theme_advanced_buttons2 : "",
- theme_advanced_buttons3 : "",
- theme_advanced_toolbar_location : "top",
- theme_advanced_toolbar_align : "center",
- theme_advanced_blockformats : "blockquote,code",
- paste_text_sticky : true,
- entity_encoding : "raw",
- add_unload_trigger : false,
- remove_linebreaks : false,
- force_p_newlines : false,
- force_br_newlines : true,
- forced_root_block : '',
- convert_urls: false,
- content_css: baseurl+"/view/custom_tinymce.css",
- theme_advanced_path : false,
- file_browser_callback : "fcFileBrowser",
- });
-}
-
-
-/**
- * sprintf in javascript
- * "{0} and {1}".format('zero','uno');
- **/
-String.prototype.format = function() {
- var formatted = this;
- for (var i = 0; i < arguments.length; i++) {
- var regexp = new RegExp('\\{'+i+'\\}', 'gi');
- formatted = formatted.replace(regexp, arguments[i]);
- }
- return formatted;
-};
-// Array Remove
-Array.prototype.remove = function(item) {
- to=undefined; from=this.indexOf(item);
- var rest = this.slice((to || from) + 1 || this.length);
- this.length = from < 0 ? this.length + from : from;
- return this.push.apply(this, rest);
-};
-
-function previewTheme(elm) {
- theme = $(elm).val();
- $.getJSON('pretheme?f=&theme=' + theme,function(data) {
- $('#theme-preview').html('<div id="theme-desc">' + data.desc + '</div><div id="theme-version">' + data.version + '</div><div id="theme-credits">' + data.credits + '</div><a href="' + data.img + '"><img src="' + data.img + '" width="320" height="240" alt="' + theme + '" /></a>');
- });
-
-}
-
-$(document).ready(function() {
-
-jQuery.timeago.settings.strings = {
- prefixAgo : aStr['t01'],
- prefixFromNow : aStr['t02'],
- suffixAgo : aStr['t03'],
- suffixFromNow : aStr['t04'],
- seconds : aStr['t05'],
- minute : aStr['t06'],
- minutes : aStr['t07'],
- hour : aStr['t08'],
- hours : aStr['t09'],
- day : aStr['t10'],
- days : aStr['t11'],
- month : aStr['t12'],
- months : aStr['t13'],
- year : aStr['t14'],
- years : aStr['t15'],
- wordSeparator : aStr['t16'],
- numbers : aStr['t17'],
-};
-
-
-$("div.wall-item-ago").timeago();
-//$("div.wall-item-body").divgrow({ initialHeight: 400 });
-
-//reCalcHeight();
-
-
-
-
-
-});
-
- function zFormError(elm,x) {
- if(x) {
- $(elm).addClass("zform-error");
- $(elm).removeClass("zform-ok");
- }
- else {
- $(elm).addClass("zform-ok");
- $(elm).removeClass("zform-error");
- }
- }
-
-
-$(window).scroll(function () {
- if(typeof buildCmd == 'function') {
- $('#more').hide();
- $('#no-more').hide();
-
- if($(window).scrollTop() + $(window).height() > $(document).height() - 200) {
- $('#more').css("top","400");
- $('#more').show();
- }
-
- if($(window).scrollTop() + $(window).height() == $(document).height()) {
- $('#more').hide();
- $('#no-more').hide();
- // alert('scroll');
- next_page++;
- scroll_next = true;
- liveUpdate();
-
- }
- }
-});
-
-var chanviewFullSize = false;
-
-function chanviewFull() {
- if(chanviewFullSize) {
- chanviewFullSize = false;
- $('#chanview-iframe-border').css({ 'position' : 'relative', 'z-index' : '10' });
- $('#remote-channel').css({ 'position' : 'relative' , 'z-index' : '10' });
- }
- else {
- chanviewFullSize = true;
- $('#chanview-iframe-border').css({ 'position' : 'fixed', 'top' : '0', 'left' : '0', 'z-index' : '150001' });
- $('#remote-channel').css({ 'position' : 'fixed', 'top' : '0', 'left' : '0', 'z-index' : '150000' });
- resize_iframe();
- }
-}
diff --git a/library/IXR_Library.php b/library/IXR_Library.php
new file mode 100644
index 000000000..9e2537701
--- /dev/null
+++ b/library/IXR_Library.php
@@ -0,0 +1,1371 @@
+<?php
+/**
+ * IXR - The Incutio XML-RPC Library
+ *
+ * Copyright (c) 2010, Incutio Ltd.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * - Neither the name of Incutio Ltd. nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 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.
+ *
+ * @package IXR
+ * @since 1.5
+ *
+ * @copyright Incutio Ltd 2010 (http://www.incutio.com)
+ * @version 1.7.4 7th September 2010
+ * @author Simon Willison
+ * @link http://scripts.incutio.com/xmlrpc/ Site/manual
+ */
+
+
+class IXR_Value
+{
+ var $data;
+ var $type;
+
+ function IXR_Value($data, $type = false)
+ {
+ $this->data = $data;
+ if (!$type) {
+ $type = $this->calculateType();
+ }
+ $this->type = $type;
+ if ($type == 'struct') {
+ // Turn all the values in the array in to new IXR_Value objects
+ foreach ($this->data as $key => $value) {
+ $this->data[$key] = new IXR_Value($value);
+ }
+ }
+ if ($type == 'array') {
+ for ($i = 0, $j = count($this->data); $i < $j; $i++) {
+ $this->data[$i] = new IXR_Value($this->data[$i]);
+ }
+ }
+ }
+
+ function calculateType()
+ {
+ if ($this->data === true || $this->data === false) {
+ return 'boolean';
+ }
+ if (is_integer($this->data)) {
+ return 'int';
+ }
+ if (is_double($this->data)) {
+ return 'double';
+ }
+
+ // Deal with IXR object types base64 and date
+ if (is_object($this->data) && is_a($this->data, 'IXR_Date')) {
+ return 'date';
+ }
+ if (is_object($this->data) && is_a($this->data, 'IXR_Base64')) {
+ return 'base64';
+ }
+
+ // If it is a normal PHP object convert it in to a struct
+ if (is_object($this->data)) {
+ $this->data = get_object_vars($this->data);
+ return 'struct';
+ }
+ if (!is_array($this->data)) {
+ return 'string';
+ }
+
+ // We have an array - is it an array or a struct?
+ if ($this->isStruct($this->data)) {
+ return 'struct';
+ } else {
+ return 'array';
+ }
+ }
+
+ function getXml()
+ {
+ // Return XML for this value
+ switch ($this->type) {
+ case 'boolean':
+ return '<boolean>'.(($this->data) ? '1' : '0').'</boolean>';
+ break;
+ case 'int':
+ return '<int>'.$this->data.'</int>';
+ break;
+ case 'double':
+ return '<double>'.$this->data.'</double>';
+ break;
+ case 'string':
+ return '<string>'.htmlspecialchars($this->data).'</string>';
+ break;
+ case 'array':
+ $return = '<array><data>'."\n";
+ foreach ($this->data as $item) {
+ $return .= ' <value>'.$item->getXml()."</value>\n";
+ }
+ $return .= '</data></array>';
+ return $return;
+ break;
+ case 'struct':
+ $return = '<struct>'."\n";
+ foreach ($this->data as $name => $value) {
+ $return .= " <member><name>$name</name><value>";
+ $return .= $value->getXml()."</value></member>\n";
+ }
+ $return .= '</struct>';
+ return $return;
+ break;
+ case 'date':
+ case 'base64':
+ return $this->data->getXml();
+ break;
+ }
+ return false;
+ }
+
+ /**
+ * Checks whether or not the supplied array is a struct or not
+ *
+ * @param unknown_type $array
+ * @return boolean
+ */
+ function isStruct($array)
+ {
+ $expected = 0;
+ foreach ($array as $key => $value) {
+ if ((string)$key != (string)$expected) {
+ return true;
+ }
+ $expected++;
+ }
+ return false;
+ }
+}
+
+/**
+ * IXR_MESSAGE
+ *
+ * @package IXR
+ * @since 1.5
+ *
+ */
+class IXR_Message
+{
+ var $message;
+ var $messageType; // methodCall / methodResponse / fault
+ var $faultCode;
+ var $faultString;
+ var $methodName;
+ var $params;
+
+ // Current variable stacks
+ var $_arraystructs = array(); // The stack used to keep track of the current array/struct
+ var $_arraystructstypes = array(); // Stack keeping track of if things are structs or array
+ var $_currentStructName = array(); // A stack as well
+ var $_param;
+ var $_value;
+ var $_currentTag;
+ var $_currentTagContents;
+ // The XML parser
+ var $_parser;
+
+ function IXR_Message($message)
+ {
+ $this->message =& $message;
+ }
+
+ function parse()
+ {
+ // first remove the XML declaration
+ // merged from WP #10698 - this method avoids the RAM usage of preg_replace on very large messages
+ $header = preg_replace( '/<\?xml.*?\?'.'>/', '', substr($this->message, 0, 100), 1);
+ $this->message = substr_replace($this->message, $header, 0, 100);
+ if (trim($this->message) == '') {
+ return false;
+ }
+ $this->_parser = xml_parser_create();
+ // Set XML parser to take the case of tags in to account
+ xml_parser_set_option($this->_parser, XML_OPTION_CASE_FOLDING, false);
+ // Set XML parser callback functions
+ xml_set_object($this->_parser, $this);
+ xml_set_element_handler($this->_parser, 'tag_open', 'tag_close');
+ xml_set_character_data_handler($this->_parser, 'cdata');
+ $chunk_size = 262144; // 256Kb, parse in chunks to avoid the RAM usage on very large messages
+ do {
+ if (strlen($this->message) <= $chunk_size) {
+ $final = true;
+ }
+ $part = substr($this->message, 0, $chunk_size);
+ $this->message = substr($this->message, $chunk_size);
+ if (!xml_parse($this->_parser, $part, $final)) {
+ return false;
+ }
+ if ($final) {
+ break;
+ }
+ } while (true);
+ xml_parser_free($this->_parser);
+
+ // Grab the error messages, if any
+ if ($this->messageType == 'fault') {
+ $this->faultCode = $this->params[0]['faultCode'];
+ $this->faultString = $this->params[0]['faultString'];
+ }
+ return true;
+ }
+
+ function tag_open($parser, $tag, $attr)
+ {
+ $this->_currentTagContents = '';
+ $this->currentTag = $tag;
+ switch($tag) {
+ case 'methodCall':
+ case 'methodResponse':
+ case 'fault':
+ $this->messageType = $tag;
+ break;
+ /* Deal with stacks of arrays and structs */
+ case 'data': // data is to all intents and puposes more interesting than array
+ $this->_arraystructstypes[] = 'array';
+ $this->_arraystructs[] = array();
+ break;
+ case 'struct':
+ $this->_arraystructstypes[] = 'struct';
+ $this->_arraystructs[] = array();
+ break;
+ }
+ }
+
+ function cdata($parser, $cdata)
+ {
+ $this->_currentTagContents .= $cdata;
+ }
+
+ function tag_close($parser, $tag)
+ {
+ $valueFlag = false;
+ switch($tag) {
+ case 'int':
+ case 'i4':
+ $value = (int)trim($this->_currentTagContents);
+ $valueFlag = true;
+ break;
+ case 'double':
+ $value = (double)trim($this->_currentTagContents);
+ $valueFlag = true;
+ break;
+ case 'string':
+ $value = (string)trim($this->_currentTagContents);
+ $valueFlag = true;
+ break;
+ case 'dateTime.iso8601':
+ $value = new IXR_Date(trim($this->_currentTagContents));
+ $valueFlag = true;
+ break;
+ case 'value':
+ // "If no type is indicated, the type is string."
+ if (trim($this->_currentTagContents) != '') {
+ $value = (string)$this->_currentTagContents;
+ $valueFlag = true;
+ }
+ break;
+ case 'boolean':
+ $value = (boolean)trim($this->_currentTagContents);
+ $valueFlag = true;
+ break;
+ case 'base64':
+ $value = base64_decode($this->_currentTagContents);
+ $valueFlag = true;
+ break;
+ /* Deal with stacks of arrays and structs */
+ case 'data':
+ case 'struct':
+ $value = array_pop($this->_arraystructs);
+ array_pop($this->_arraystructstypes);
+ $valueFlag = true;
+ break;
+ case 'member':
+ array_pop($this->_currentStructName);
+ break;
+ case 'name':
+ $this->_currentStructName[] = trim($this->_currentTagContents);
+ break;
+ case 'methodName':
+ $this->methodName = trim($this->_currentTagContents);
+ break;
+ }
+
+ if ($valueFlag) {
+ if (count($this->_arraystructs) > 0) {
+ // Add value to struct or array
+ if ($this->_arraystructstypes[count($this->_arraystructstypes)-1] == 'struct') {
+ // Add to struct
+ $this->_arraystructs[count($this->_arraystructs)-1][$this->_currentStructName[count($this->_currentStructName)-1]] = $value;
+ } else {
+ // Add to array
+ $this->_arraystructs[count($this->_arraystructs)-1][] = $value;
+ }
+ } else {
+ // Just add as a paramater
+ $this->params[] = $value;
+ }
+ }
+ $this->_currentTagContents = '';
+ }
+}
+
+/**
+ * IXR_Server
+ *
+ * @package IXR
+ * @since 1.5
+ */
+class IXR_Server
+{
+ var $data;
+ var $callbacks = array();
+ var $message;
+ var $capabilities;
+
+ function IXR_Server($callbacks = false, $data = false, $wait = false)
+ {
+ $this->setCapabilities();
+ if ($callbacks) {
+ $this->callbacks = $callbacks;
+ }
+ $this->setCallbacks();
+ if (!$wait) {
+ $this->serve($data);
+ }
+ }
+
+ function serve($data = false)
+ {
+ if (!$data) {
+ if (isset($_SERVER['REQUEST_METHOD']) && $_SERVER['REQUEST_METHOD'] !== 'POST') {
+ header('Content-Type: text/plain'); // merged from WP #9093
+ die('XML-RPC server accepts POST requests only.');
+ }
+
+ global $HTTP_RAW_POST_DATA;
+ if (empty($HTTP_RAW_POST_DATA)) {
+ // workaround for a bug in PHP 5.2.2 - http://bugs.php.net/bug.php?id=41293
+ $data = file_get_contents('php://input');
+ } else {
+ $data =& $HTTP_RAW_POST_DATA;
+ }
+ }
+ $this->message = new IXR_Message($data);
+ if (!$this->message->parse()) {
+ $this->error(-32700, 'parse error. not well formed');
+ }
+ if ($this->message->messageType != 'methodCall') {
+ $this->error(-32600, 'server error. invalid xml-rpc. not conforming to spec. Request must be a methodCall');
+ }
+ $result = $this->call($this->message->methodName, $this->message->params);
+
+ // Is the result an error?
+ if (is_a($result, 'IXR_Error')) {
+ $this->error($result);
+ }
+
+ // Encode the result
+ $r = new IXR_Value($result);
+ $resultxml = $r->getXml();
+
+ // Create the XML
+ $xml = <<<EOD
+<methodResponse>
+ <params>
+ <param>
+ <value>
+ $resultxml
+ </value>
+ </param>
+ </params>
+</methodResponse>
+
+EOD;
+ // Send it
+ $this->output($xml);
+ }
+
+ function call($methodname, $args)
+ {
+ if (!$this->hasMethod($methodname)) {
+ return new IXR_Error(-32601, 'server error. requested method '.$methodname.' does not exist.');
+ }
+ $method = $this->callbacks[$methodname];
+
+ // Perform the callback and send the response
+ if (count($args) == 1) {
+ // If only one paramater just send that instead of the whole array
+ $args = $args[0];
+ }
+
+ // Are we dealing with a function or a method?
+ if (is_string($method) && substr($method, 0, 5) == 'this:') {
+ // It's a class method - check it exists
+ $method = substr($method, 5);
+ if (!method_exists($this, $method)) {
+ return new IXR_Error(-32601, 'server error. requested class method "'.$method.'" does not exist.');
+ }
+
+ //Call the method
+ $result = $this->$method($args);
+ } else {
+ // It's a function - does it exist?
+ if (is_array($method)) {
+ if (!method_exists($method[0], $method[1])) {
+ return new IXR_Error(-32601, 'server error. requested object method "'.$method[1].'" does not exist.');
+ }
+ } else if (!function_exists($method)) {
+ return new IXR_Error(-32601, 'server error. requested function "'.$method.'" does not exist.');
+ }
+
+ // Call the function
+ $result = call_user_func($method, $args);
+ }
+ return $result;
+ }
+
+ function error($error, $message = false)
+ {
+ // Accepts either an error object or an error code and message
+ if ($message && !is_object($error)) {
+ $error = new IXR_Error($error, $message);
+ }
+ $this->output($error->getXml());
+ }
+
+ function output($xml)
+ {
+ $xml = '<?xml version="1.0"?>'."\n".$xml;
+ $length = strlen($xml);
+ header('Connection: close');
+ header('Content-Length: '.$length);
+ header('Content-Type: text/xml');
+ header('Date: '.date('r'));
+ echo $xml;
+ exit;
+ }
+
+ function hasMethod($method)
+ {
+ return in_array($method, array_keys($this->callbacks));
+ }
+
+ function setCapabilities()
+ {
+ // Initialises capabilities array
+ $this->capabilities = array(
+ 'xmlrpc' => array(
+ 'specUrl' => 'http://www.xmlrpc.com/spec',
+ 'specVersion' => 1
+ ),
+ 'faults_interop' => array(
+ 'specUrl' => 'http://xmlrpc-epi.sourceforge.net/specs/rfc.fault_codes.php',
+ 'specVersion' => 20010516
+ ),
+ 'system.multicall' => array(
+ 'specUrl' => 'http://www.xmlrpc.com/discuss/msgReader$1208',
+ 'specVersion' => 1
+ ),
+ );
+ }
+
+ function getCapabilities($args)
+ {
+ return $this->capabilities;
+ }
+
+ function setCallbacks()
+ {
+ $this->callbacks['system.getCapabilities'] = 'this:getCapabilities';
+ $this->callbacks['system.listMethods'] = 'this:listMethods';
+ $this->callbacks['system.multicall'] = 'this:multiCall';
+ }
+
+ function listMethods($args)
+ {
+ // Returns a list of methods - uses array_reverse to ensure user defined
+ // methods are listed before server defined methods
+ return array_reverse(array_keys($this->callbacks));
+ }
+
+ function multiCall($methodcalls)
+ {
+ // See http://www.xmlrpc.com/discuss/msgReader$1208
+ $return = array();
+ foreach ($methodcalls as $call) {
+ $method = $call['methodName'];
+ $params = $call['params'];
+ if ($method == 'system.multicall') {
+ $result = new IXR_Error(-32600, 'Recursive calls to system.multicall are forbidden');
+ } else {
+ $result = $this->call($method, $params);
+ }
+ if (is_a($result, 'IXR_Error')) {
+ $return[] = array(
+ 'faultCode' => $result->code,
+ 'faultString' => $result->message
+ );
+ } else {
+ $return[] = array($result);
+ }
+ }
+ return $return;
+ }
+}
+
+/**
+ * IXR_Request
+ *
+ * @package IXR
+ * @since 1.5
+ */
+class IXR_Request
+{
+ var $method;
+ var $args;
+ var $xml;
+
+ function IXR_Request($method, $args)
+ {
+ $this->method = $method;
+ $this->args = $args;
+ $this->xml = <<<EOD
+<?xml version="1.0"?>
+<methodCall>
+<methodName>{$this->method}</methodName>
+<params>
+
+EOD;
+ foreach ($this->args as $arg) {
+ $this->xml .= '<param><value>';
+ $v = new IXR_Value($arg);
+ $this->xml .= $v->getXml();
+ $this->xml .= "</value></param>\n";
+ }
+ $this->xml .= '</params></methodCall>';
+ }
+
+ function getLength()
+ {
+ return strlen($this->xml);
+ }
+
+ function getXml()
+ {
+ return $this->xml;
+ }
+}
+
+/**
+ * IXR_Client
+ *
+ * @package IXR
+ * @since 1.5
+ *
+ */
+class IXR_Client
+{
+ var $server;
+ var $port;
+ var $path;
+ var $useragent;
+ var $response;
+ var $message = false;
+ var $debug = false;
+ var $timeout;
+
+ // Storage place for an error message
+ var $error = false;
+
+ function IXR_Client($server, $path = false, $port = 80, $timeout = 15)
+ {
+ if (!$path) {
+ // Assume we have been given a URL instead
+ $bits = parse_url($server);
+ $this->server = $bits['host'];
+ $this->port = isset($bits['port']) ? $bits['port'] : 80;
+ $this->path = isset($bits['path']) ? $bits['path'] : '/';
+
+ // Make absolutely sure we have a path
+ if (!$this->path) {
+ $this->path = '/';
+ }
+ } else {
+ $this->server = $server;
+ $this->path = $path;
+ $this->port = $port;
+ }
+ $this->useragent = 'The Incutio XML-RPC PHP Library';
+ $this->timeout = $timeout;
+ }
+
+ function query()
+ {
+ $args = func_get_args();
+ $method = array_shift($args);
+ $request = new IXR_Request($method, $args);
+ $length = $request->getLength();
+ $xml = $request->getXml();
+ $r = "\r\n";
+ $request = "POST {$this->path} HTTP/1.0$r";
+
+ // Merged from WP #8145 - allow custom headers
+ $this->headers['Host'] = $this->server;
+ $this->headers['Content-Type'] = 'text/xml';
+ $this->headers['User-Agent'] = $this->useragent;
+ $this->headers['Content-Length']= $length;
+
+ foreach( $this->headers as $header => $value ) {
+ $request .= "{$header}: {$value}{$r}";
+ }
+ $request .= $r;
+
+ $request .= $xml;
+
+ // Now send the request
+ if ($this->debug) {
+ echo '<pre class="ixr_request">'.htmlspecialchars($request)."\n</pre>\n\n";
+ }
+
+ if ($this->timeout) {
+ $fp = @fsockopen($this->server, $this->port, $errno, $errstr, $this->timeout);
+ } else {
+ $fp = @fsockopen($this->server, $this->port, $errno, $errstr);
+ }
+ if (!$fp) {
+ $this->error = new IXR_Error(-32300, 'transport error - could not open socket');
+ return false;
+ }
+ fputs($fp, $request);
+ $contents = '';
+ $debugContents = '';
+ $gotFirstLine = false;
+ $gettingHeaders = true;
+ while (!feof($fp)) {
+ $line = fgets($fp, 4096);
+ if (!$gotFirstLine) {
+ // Check line for '200'
+ if (strstr($line, '200') === false) {
+ $this->error = new IXR_Error(-32300, 'transport error - HTTP status code was not 200');
+ return false;
+ }
+ $gotFirstLine = true;
+ }
+ if (trim($line) == '') {
+ $gettingHeaders = false;
+ }
+ if (!$gettingHeaders) {
+ // merged from WP #12559 - remove trim
+ $contents .= $line;
+ }
+ if ($this->debug) {
+ $debugContents .= $line;
+ }
+ }
+ if ($this->debug) {
+ echo '<pre class="ixr_response">'.htmlspecialchars($debugContents)."\n</pre>\n\n";
+ }
+
+ // Now parse what we've got back
+ $this->message = new IXR_Message($contents);
+ if (!$this->message->parse()) {
+ // XML error
+ $this->error = new IXR_Error(-32700, 'parse error. not well formed');
+ return false;
+ }
+
+ // Is the message a fault?
+ if ($this->message->messageType == 'fault') {
+ $this->error = new IXR_Error($this->message->faultCode, $this->message->faultString);
+ return false;
+ }
+
+ // Message must be OK
+ return true;
+ }
+
+ function getResponse()
+ {
+ // methodResponses can only have one param - return that
+ return $this->message->params[0];
+ }
+
+ function isError()
+ {
+ return (is_object($this->error));
+ }
+
+ function getErrorCode()
+ {
+ return $this->error->code;
+ }
+
+ function getErrorMessage()
+ {
+ return $this->error->message;
+ }
+}
+
+
+/**
+ * IXR_Error
+ *
+ * @package IXR
+ * @since 1.5
+ */
+class IXR_Error
+{
+ var $code;
+ var $message;
+
+ function IXR_Error($code, $message)
+ {
+ $this->code = $code;
+ $this->message = htmlspecialchars($message);
+ }
+
+ function getXml()
+ {
+ $xml = <<<EOD
+<methodResponse>
+ <fault>
+ <value>
+ <struct>
+ <member>
+ <name>faultCode</name>
+ <value><int>{$this->code}</int></value>
+ </member>
+ <member>
+ <name>faultString</name>
+ <value><string>{$this->message}</string></value>
+ </member>
+ </struct>
+ </value>
+ </fault>
+</methodResponse>
+
+EOD;
+ return $xml;
+ }
+}
+
+/**
+ * IXR_Date
+ *
+ * @package IXR
+ * @since 1.5
+ */
+class IXR_Date {
+ var $year;
+ var $month;
+ var $day;
+ var $hour;
+ var $minute;
+ var $second;
+ var $timezone;
+
+ function IXR_Date($time)
+ {
+ // $time can be a PHP timestamp or an ISO one
+ if (is_numeric($time)) {
+ $this->parseTimestamp($time);
+ } else {
+ $this->parseIso($time);
+ }
+ }
+
+ function parseTimestamp($timestamp)
+ {
+ $this->year = date('Y', $timestamp);
+ $this->month = date('m', $timestamp);
+ $this->day = date('d', $timestamp);
+ $this->hour = date('H', $timestamp);
+ $this->minute = date('i', $timestamp);
+ $this->second = date('s', $timestamp);
+ $this->timezone = '';
+ }
+
+ function parseIso($iso)
+ {
+ $this->year = substr($iso, 0, 4);
+ $this->month = substr($iso, 4, 2);
+ $this->day = substr($iso, 6, 2);
+ $this->hour = substr($iso, 9, 2);
+ $this->minute = substr($iso, 12, 2);
+ $this->second = substr($iso, 15, 2);
+ $this->timezone = substr($iso, 17);
+ }
+
+ function getIso()
+ {
+ return $this->year.$this->month.$this->day.'T'.$this->hour.':'.$this->minute.':'.$this->second.$this->timezone;
+ }
+
+ function getXml()
+ {
+ return '<dateTime.iso8601>'.$this->getIso().'</dateTime.iso8601>';
+ }
+
+ function getTimestamp()
+ {
+ return mktime($this->hour, $this->minute, $this->second, $this->month, $this->day, $this->year);
+ }
+}
+
+/**
+ * IXR_Base64
+ *
+ * @package IXR
+ * @since 1.5
+ */
+class IXR_Base64
+{
+ var $data;
+
+ function IXR_Base64($data)
+ {
+ $this->data = $data;
+ }
+
+ function getXml()
+ {
+ return '<base64>'.base64_encode($this->data).'</base64>';
+ }
+}
+
+/**
+ * IXR_IntrospectionServer
+ *
+ * @package IXR
+ * @since 1.5
+ */
+class IXR_IntrospectionServer extends IXR_Server
+{
+ var $signatures;
+ var $help;
+
+ function IXR_IntrospectionServer()
+ {
+ $this->setCallbacks();
+ $this->setCapabilities();
+ $this->capabilities['introspection'] = array(
+ 'specUrl' => 'http://xmlrpc.usefulinc.com/doc/reserved.html',
+ 'specVersion' => 1
+ );
+ $this->addCallback(
+ 'system.methodSignature',
+ 'this:methodSignature',
+ array('array', 'string'),
+ 'Returns an array describing the return type and required parameters of a method'
+ );
+ $this->addCallback(
+ 'system.getCapabilities',
+ 'this:getCapabilities',
+ array('struct'),
+ 'Returns a struct describing the XML-RPC specifications supported by this server'
+ );
+ $this->addCallback(
+ 'system.listMethods',
+ 'this:listMethods',
+ array('array'),
+ 'Returns an array of available methods on this server'
+ );
+ $this->addCallback(
+ 'system.methodHelp',
+ 'this:methodHelp',
+ array('string', 'string'),
+ 'Returns a documentation string for the specified method'
+ );
+ }
+
+ function addCallback($method, $callback, $args, $help)
+ {
+ $this->callbacks[$method] = $callback;
+ $this->signatures[$method] = $args;
+ $this->help[$method] = $help;
+ }
+
+ function call($methodname, $args)
+ {
+ // Make sure it's in an array
+ if ($args && !is_array($args)) {
+ $args = array($args);
+ }
+
+ // Over-rides default call method, adds signature check
+ if (!$this->hasMethod($methodname)) {
+ return new IXR_Error(-32601, 'server error. requested method "'.$this->message->methodName.'" not specified.');
+ }
+ $method = $this->callbacks[$methodname];
+ $signature = $this->signatures[$methodname];
+ $returnType = array_shift($signature);
+
+ // Check the number of arguments
+ if (count($args) != count($signature)) {
+ return new IXR_Error(-32602, 'server error. wrong number of method parameters');
+ }
+
+ // Check the argument types
+ $ok = true;
+ $argsbackup = $args;
+ for ($i = 0, $j = count($args); $i < $j; $i++) {
+ $arg = array_shift($args);
+ $type = array_shift($signature);
+ switch ($type) {
+ case 'int':
+ case 'i4':
+ if (is_array($arg) || !is_int($arg)) {
+ $ok = false;
+ }
+ break;
+ case 'base64':
+ case 'string':
+ if (!is_string($arg)) {
+ $ok = false;
+ }
+ break;
+ case 'boolean':
+ if ($arg !== false && $arg !== true) {
+ $ok = false;
+ }
+ break;
+ case 'float':
+ case 'double':
+ if (!is_float($arg)) {
+ $ok = false;
+ }
+ break;
+ case 'date':
+ case 'dateTime.iso8601':
+ if (!is_a($arg, 'IXR_Date')) {
+ $ok = false;
+ }
+ break;
+ }
+ if (!$ok) {
+ return new IXR_Error(-32602, 'server error. invalid method parameters');
+ }
+ }
+ // It passed the test - run the "real" method call
+ return parent::call($methodname, $argsbackup);
+ }
+
+ function methodSignature($method)
+ {
+ if (!$this->hasMethod($method)) {
+ return new IXR_Error(-32601, 'server error. requested method "'.$method.'" not specified.');
+ }
+ // We should be returning an array of types
+ $types = $this->signatures[$method];
+ $return = array();
+ foreach ($types as $type) {
+ switch ($type) {
+ case 'string':
+ $return[] = 'string';
+ break;
+ case 'int':
+ case 'i4':
+ $return[] = 42;
+ break;
+ case 'double':
+ $return[] = 3.1415;
+ break;
+ case 'dateTime.iso8601':
+ $return[] = new IXR_Date(time());
+ break;
+ case 'boolean':
+ $return[] = true;
+ break;
+ case 'base64':
+ $return[] = new IXR_Base64('base64');
+ break;
+ case 'array':
+ $return[] = array('array');
+ break;
+ case 'struct':
+ $return[] = array('struct' => 'struct');
+ break;
+ }
+ }
+ return $return;
+ }
+
+ function methodHelp($method)
+ {
+ return $this->help[$method];
+ }
+}
+
+/**
+ * IXR_ClientMulticall
+ *
+ * @package IXR
+ * @since 1.5
+ */
+class IXR_ClientMulticall extends IXR_Client
+{
+ var $calls = array();
+
+ function IXR_ClientMulticall($server, $path = false, $port = 80)
+ {
+ parent::IXR_Client($server, $path, $port);
+ $this->useragent = 'The Incutio XML-RPC PHP Library (multicall client)';
+ }
+
+ function addCall()
+ {
+ $args = func_get_args();
+ $methodName = array_shift($args);
+ $struct = array(
+ 'methodName' => $methodName,
+ 'params' => $args
+ );
+ $this->calls[] = $struct;
+ }
+
+ function query()
+ {
+ // Prepare multicall, then call the parent::query() method
+ return parent::query('system.multicall', $this->calls);
+ }
+}
+
+/**
+ * Client for communicating with a XML-RPC Server over HTTPS.
+ *
+ * @author Jason Stirk <jstirk@gmm.com.au> (@link http://blog.griffin.homelinux.org/projects/xmlrpc/)
+ * @version 0.2.0 26May2005 08:34 +0800
+ * @copyright (c) 2004-2005 Jason Stirk
+ * @package IXR
+ */
+class IXR_ClientSSL extends IXR_Client
+{
+ /**
+ * Filename of the SSL Client Certificate
+ * @access private
+ * @since 0.1.0
+ * @var string
+ */
+ var $_certFile;
+
+ /**
+ * Filename of the SSL CA Certificate
+ * @access private
+ * @since 0.1.0
+ * @var string
+ */
+ var $_caFile;
+
+ /**
+ * Filename of the SSL Client Private Key
+ * @access private
+ * @since 0.1.0
+ * @var string
+ */
+ var $_keyFile;
+
+ /**
+ * Passphrase to unlock the private key
+ * @access private
+ * @since 0.1.0
+ * @var string
+ */
+ var $_passphrase;
+
+ /**
+ * Constructor
+ * @param string $server URL of the Server to connect to
+ * @since 0.1.0
+ */
+ function IXR_ClientSSL($server, $path = false, $port = 443, $timeout = false)
+ {
+ parent::IXR_Client($server, $path, $port, $timeout);
+ $this->useragent = 'The Incutio XML-RPC PHP Library for SSL';
+
+ // Set class fields
+ $this->_certFile=false;
+ $this->_caFile=false;
+ $this->_keyFile=false;
+ $this->_passphrase='';
+ }
+
+ /**
+ * Set the client side certificates to communicate with the server.
+ *
+ * @since 0.1.0
+ * @param string $certificateFile Filename of the client side certificate to use
+ * @param string $keyFile Filename of the client side certificate's private key
+ * @param string $keyPhrase Passphrase to unlock the private key
+ */
+ function setCertificate($certificateFile, $keyFile, $keyPhrase='')
+ {
+ // Check the files all exist
+ if (is_file($certificateFile)) {
+ $this->_certFile = $certificateFile;
+ } else {
+ die('Could not open certificate: ' . $certificateFile);
+ }
+
+ if (is_file($keyFile)) {
+ $this->_keyFile = $keyFile;
+ } else {
+ die('Could not open private key: ' . $keyFile);
+ }
+
+ $this->_passphrase=(string)$keyPhrase;
+ }
+
+ function setCACertificate($caFile)
+ {
+ if (is_file($caFile)) {
+ $this->_caFile = $caFile;
+ } else {
+ die('Could not open CA certificate: ' . $caFile);
+ }
+ }
+
+ /**
+ * Sets the connection timeout (in seconds)
+ * @param int $newTimeOut Timeout in seconds
+ * @returns void
+ * @since 0.1.2
+ */
+ function setTimeOut($newTimeOut)
+ {
+ $this->timeout = (int)$newTimeOut;
+ }
+
+ /**
+ * Returns the connection timeout (in seconds)
+ * @returns int
+ * @since 0.1.2
+ */
+ function getTimeOut()
+ {
+ return $this->timeout;
+ }
+
+ /**
+ * Set the query to send to the XML-RPC Server
+ * @since 0.1.0
+ */
+ function query()
+ {
+ $args = func_get_args();
+ $method = array_shift($args);
+ $request = new IXR_Request($method, $args);
+ $length = $request->getLength();
+ $xml = $request->getXml();
+
+ if ($this->debug) {
+ echo '<pre>'.htmlspecialchars($xml)."\n</pre>\n\n";
+ }
+
+ //This is where we deviate from the normal query()
+ //Rather than open a normal sock, we will actually use the cURL
+ //extensions to make the calls, and handle the SSL stuff.
+
+ //Since 04Aug2004 (0.1.3) - Need to include the port (duh...)
+ //Since 06Oct2004 (0.1.4) - Need to include the colon!!!
+ // (I swear I've fixed this before... ESP in live... But anyhu...)
+ $curl=curl_init('https://' . $this->server . ':' . $this->port . $this->path);
+ curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
+
+ //Since 23Jun2004 (0.1.2) - Made timeout a class field
+ curl_setopt($curl, CURLOPT_TIMEOUT, $this->timeout);
+
+ if ($this->debug) {
+ curl_setopt($curl, CURLOPT_VERBOSE, 1);
+ }
+
+ curl_setopt($curl, CURLOPT_HEADER, 1);
+ curl_setopt($curl, CURLOPT_POST, 1);
+ curl_setopt($curl, CURLOPT_POSTFIELDS, $xml);
+ curl_setopt($curl, CURLOPT_PORT, $this->port);
+ curl_setopt($curl, CURLOPT_HTTPHEADER, array(
+ "Content-Type: text/xml",
+ "Content-length: {$length}"));
+
+ // Process the SSL certificates, etc. to use
+ if (!($this->_certFile === false)) {
+ // We have a certificate file set, so add these to the cURL handler
+ curl_setopt($curl, CURLOPT_SSLCERT, $this->_certFile);
+ curl_setopt($curl, CURLOPT_SSLKEY, $this->_keyFile);
+
+ if ($this->debug) {
+ echo "SSL Cert at : " . $this->_certFile . "\n";
+ echo "SSL Key at : " . $this->_keyFile . "\n";
+ }
+
+ // See if we need to give a passphrase
+ if (!($this->_passphrase === '')) {
+ curl_setopt($curl, CURLOPT_SSLCERTPASSWD, $this->_passphrase);
+ }
+
+ if ($this->_caFile === false) {
+ // Don't verify their certificate, as we don't have a CA to verify against
+ curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
+ } else {
+ // Verify against a CA
+ curl_setopt($curl, CURLOPT_CAINFO, $this->_caFile);
+ }
+ }
+
+ // Call cURL to do it's stuff and return us the content
+ $contents = curl_exec($curl);
+ curl_close($curl);
+
+ // Check for 200 Code in $contents
+ if (!strstr($contents, '200 OK')) {
+ //There was no "200 OK" returned - we failed
+ $this->error = new IXR_Error(-32300, 'transport error - HTTP status code was not 200');
+ return false;
+ }
+
+ if ($this->debug) {
+ echo '<pre>'.htmlspecialchars($contents)."\n</pre>\n\n";
+ }
+ // Now parse what we've got back
+ // Since 20Jun2004 (0.1.1) - We need to remove the headers first
+ // Why I have only just found this, I will never know...
+ // So, remove everything before the first <
+ $contents = substr($contents,strpos($contents, '<'));
+
+ $this->message = new IXR_Message($contents);
+ if (!$this->message->parse()) {
+ // XML error
+ $this->error = new IXR_Error(-32700, 'parse error. not well formed');
+ return false;
+ }
+ // Is the message a fault?
+ if ($this->message->messageType == 'fault') {
+ $this->error = new IXR_Error($this->message->faultCode, $this->message->faultString);
+ return false;
+ }
+
+ // Message must be OK
+ return true;
+ }
+}
+
+/**
+ * Extension of the {@link IXR_Server} class to easily wrap objects.
+ *
+ * Class is designed to extend the existing XML-RPC server to allow the
+ * presentation of methods from a variety of different objects via an
+ * XML-RPC server.
+ * It is intended to assist in organization of your XML-RPC methods by allowing
+ * you to "write once" in your existing model classes and present them.
+ *
+ * @author Jason Stirk <jstirk@gmm.com.au>
+ * @version 1.0.1 19Apr2005 17:40 +0800
+ * @copyright Copyright (c) 2005 Jason Stirk
+ * @package IXR
+ */
+class IXR_ClassServer extends IXR_Server
+{
+ var $_objects;
+ var $_delim;
+
+ function IXR_ClassServer($delim = '.', $wait = false)
+ {
+ $this->IXR_Server(array(), false, $wait);
+ $this->_delimiter = $delim;
+ $this->_objects = array();
+ }
+
+ function addMethod($rpcName, $functionName)
+ {
+ $this->callbacks[$rpcName] = $functionName;
+ }
+
+ function registerObject($object, $methods, $prefix=null)
+ {
+ if (is_null($prefix))
+ {
+ $prefix = get_class($object);
+ }
+ $this->_objects[$prefix] = $object;
+
+ // Add to our callbacks array
+ foreach($methods as $method)
+ {
+ if (is_array($method))
+ {
+ $targetMethod = $method[0];
+ $method = $method[1];
+ }
+ else
+ {
+ $targetMethod = $method;
+ }
+ $this->callbacks[$prefix . $this->_delimiter . $method]=array($prefix, $targetMethod);
+ }
+ }
+
+ function call($methodname, $args)
+ {
+ if (!$this->hasMethod($methodname)) {
+ return new IXR_Error(-32601, 'server error. requested method '.$methodname.' does not exist.');
+ }
+ $method = $this->callbacks[$methodname];
+
+ // Perform the callback and send the response
+ if (count($args) == 1) {
+ // If only one paramater just send that instead of the whole array
+ $args = $args[0];
+ }
+
+ // See if this method comes from one of our objects or maybe self
+ if (is_array($method) || (substr($method, 0, 5) == 'this:')) {
+ if (is_array($method)) {
+ $object=$this->_objects[$method[0]];
+ $method=$method[1];
+ } else {
+ $object=$this;
+ $method = substr($method, 5);
+ }
+
+ // It's a class method - check it exists
+ if (!method_exists($object, $method)) {
+ return new IXR_Error(-32601, 'server error. requested class method "'.$method.'" does not exist.');
+ }
+
+ // Call the method
+ $result = $object->$method($args);
+ } else {
+ // It's a function - does it exist?
+ if (!function_exists($method)) {
+ return new IXR_Error(-32601, 'server error. requested function "'.$method.'" does not exist.');
+ }
+
+ // Call the function
+ $result = $method($args);
+ }
+ return $result;
+ }
+}
diff --git a/library/OAuth1.php b/library/OAuth1.php
index 0db6fabcb..b790655af 100644
--- a/library/OAuth1.php
+++ b/library/OAuth1.php
@@ -273,6 +273,7 @@ class OAuthRequest {
&& @strstr($request_headers["Content-Type"],
"application/x-www-form-urlencoded")
) {
+
$post_data = OAuthUtil::parse_parameters(
file_get_contents(self::$POST_INPUT)
);
@@ -286,15 +287,15 @@ class OAuthRequest {
$request_headers['Authorization']
);
$parameters = array_merge($parameters, $header_parameters);
+
}
}
// fix for friendica redirect system
-
+ // FIXME or don't, but figure out if this is absolutely necessary and act accordingly
$http_url = substr($http_url, 0, strpos($http_url,$parameters['q'])+strlen($parameters['q']));
unset( $parameters['q'] );
- //echo "<pre>".__function__."\n"; var_dump($http_method, $http_url, $parameters, $_SERVER['REQUEST_URI']); killme();
return new OAuthRequest($http_method, $http_url, $parameters);
}
@@ -514,9 +515,7 @@ class OAuthServer {
*/
public function fetch_request_token(&$request) {
$this->get_version($request);
-
$consumer = $this->get_consumer($request);
-
// no token required for the initial token request
$token = NULL;
@@ -525,7 +524,6 @@ class OAuthServer {
// Rev A change
$callback = $request->get_parameter('oauth_callback');
$new_token = $this->data_store->new_request_token($consumer, $callback);
-
return $new_token;
}
@@ -796,7 +794,8 @@ class OAuthUtil {
);
$out[$key] = $value;
}
- } else {
+ }
+ if((! isset($out)) || (! array_key_exists('Authorization',$out))) {
// otherwise we don't have apache and are just going to have to hope
// that $_SERVER actually contains what we need
$out = array();
@@ -806,6 +805,8 @@ class OAuthUtil {
$out['Content-Type'] = $_ENV['CONTENT_TYPE'];
foreach ($_SERVER as $key => $value) {
+ if($key === 'REDIRECT_REMOTE_USER')
+ $out['Authorization'] = $value;
if (substr($key, 0, 5) == "HTTP_") {
// this is chaos, basically it is just there to capitalize the first
// letter of every word that is not an initial HTTP and strip HTTP
diff --git a/library/bootstrap-datetimepicker/css/bootstrap-datetimepicker.css b/library/bootstrap-datetimepicker/css/bootstrap-datetimepicker.css
new file mode 100755
index 000000000..e5eb7a65c
--- /dev/null
+++ b/library/bootstrap-datetimepicker/css/bootstrap-datetimepicker.css
@@ -0,0 +1,174 @@
+/**
+ * Build file for the dist version of datetimepicker.css
+ */
+/*!
+ * Datetimepicker for Bootstrap v3
+ * https://github.com/Eonasdan/bootstrap-datetimepicker/
+ * Copyright 2012 Stefan Petre
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ */
+.bootstrap-datetimepicker-widget {
+ top: 0;
+ left: 0;
+ width: 250px;
+ padding: 4px;
+ margin-top: 1px;
+ z-index: 9999;
+ border-radius: 4px;
+ /*.dow {
+ border-top: 1px solid #ddd !important;
+ }*/
+}
+.bootstrap-datetimepicker-widget .btn {
+ padding: 6px;
+}
+.bootstrap-datetimepicker-widget:before {
+ content: '';
+ display: inline-block;
+ border-left: 7px solid transparent;
+ border-right: 7px solid transparent;
+ border-bottom: 7px solid #ccc;
+ border-bottom-color: rgba(0, 0, 0, 0.2);
+ position: absolute;
+ top: -7px;
+ left: 6px;
+}
+.bootstrap-datetimepicker-widget:after {
+ content: '';
+ display: inline-block;
+ border-left: 6px solid transparent;
+ border-right: 6px solid transparent;
+ border-bottom: 6px solid white;
+ position: absolute;
+ top: -6px;
+ left: 7px;
+}
+.bootstrap-datetimepicker-widget.pull-right:before {
+ left: auto;
+ right: 6px;
+}
+.bootstrap-datetimepicker-widget.pull-right:after {
+ left: auto;
+ right: 7px;
+}
+.bootstrap-datetimepicker-widget > ul {
+ list-style-type: none;
+ margin: 0;
+}
+.bootstrap-datetimepicker-widget .timepicker-hour,
+.bootstrap-datetimepicker-widget .timepicker-minute,
+.bootstrap-datetimepicker-widget .timepicker-second {
+ width: 100%;
+ font-weight: bold;
+ font-size: 1.2em;
+}
+.bootstrap-datetimepicker-widget table[data-hour-format="12"] .separator {
+ width: 4px;
+ padding: 0;
+ margin: 0;
+}
+.bootstrap-datetimepicker-widget .datepicker > div {
+ display: none;
+}
+.bootstrap-datetimepicker-widget .picker-switch {
+ text-align: center;
+}
+.bootstrap-datetimepicker-widget table {
+ width: 100%;
+ margin: 0;
+}
+.bootstrap-datetimepicker-widget td,
+.bootstrap-datetimepicker-widget th {
+ text-align: center;
+ width: 20px;
+ height: 20px;
+ border-radius: 4px;
+}
+.bootstrap-datetimepicker-widget td.day:hover,
+.bootstrap-datetimepicker-widget td.hour:hover,
+.bootstrap-datetimepicker-widget td.minute:hover,
+.bootstrap-datetimepicker-widget td.second:hover {
+ background: #eeeeee;
+ cursor: pointer;
+}
+.bootstrap-datetimepicker-widget td.old,
+.bootstrap-datetimepicker-widget td.new {
+ color: #999999;
+}
+.bootstrap-datetimepicker-widget td.active,
+.bootstrap-datetimepicker-widget td.active:hover {
+ background-color: #428bca;
+ color: #fff;
+ text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+}
+.bootstrap-datetimepicker-widget td.disabled,
+.bootstrap-datetimepicker-widget td.disabled:hover {
+ background: none;
+ color: #999999;
+ cursor: not-allowed;
+}
+.bootstrap-datetimepicker-widget td span {
+ display: block;
+ width: 47px;
+ height: 54px;
+ line-height: 54px;
+ float: left;
+ margin: 2px;
+ cursor: pointer;
+ border-radius: 4px;
+}
+.bootstrap-datetimepicker-widget td span:hover {
+ background: #eeeeee;
+}
+.bootstrap-datetimepicker-widget td span.active {
+ background-color: #428bca;
+ color: #fff;
+ text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+}
+.bootstrap-datetimepicker-widget td span.old {
+ color: #999999;
+}
+.bootstrap-datetimepicker-widget td span.disabled,
+.bootstrap-datetimepicker-widget td span.disabled:hover {
+ background: none;
+ color: #999999;
+ cursor: not-allowed;
+}
+.bootstrap-datetimepicker-widget th.switch {
+ width: 145px;
+}
+.bootstrap-datetimepicker-widget th.next,
+.bootstrap-datetimepicker-widget th.prev {
+ font-size: 21px;
+}
+.bootstrap-datetimepicker-widget th.disabled,
+.bootstrap-datetimepicker-widget th.disabled:hover {
+ background: none;
+ color: #999999;
+ cursor: not-allowed;
+}
+.bootstrap-datetimepicker-widget thead tr:first-child th {
+ cursor: pointer;
+}
+.bootstrap-datetimepicker-widget thead tr:first-child th:hover {
+ background: #eeeeee;
+}
+.input-group.date .input-group-addon span {
+ display: block;
+ cursor: pointer;
+ width: 16px;
+ height: 16px;
+}
+.bootstrap-datetimepicker-widget.left-oriented:before {
+ left: auto;
+ right: 6px;
+}
+.bootstrap-datetimepicker-widget.left-oriented:after {
+ left: auto;
+ right: 7px;
+}
+.bootstrap-datetimepicker-widget ul.list-unstyled li.in div.timepicker div.timepicker-picker table.table-condensed tbody > tr > td {
+ padding: 0px !important;
+}
diff --git a/library/bootstrap-datetimepicker/css/bootstrap-datetimepicker.min.css b/library/bootstrap-datetimepicker/css/bootstrap-datetimepicker.min.css
new file mode 100755
index 000000000..00b768767
--- /dev/null
+++ b/library/bootstrap-datetimepicker/css/bootstrap-datetimepicker.min.css
@@ -0,0 +1,8 @@
+/*!
+ * Datetimepicker for Bootstrap v3
+ * https://github.com/Eonasdan/bootstrap-datetimepicker/
+ * Copyright 2012 Stefan Petre
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ */.bootstrap-datetimepicker-widget{top:0;left:0;width:250px;padding:4px;margin-top:1px;z-index:9999;border-radius:4px}.bootstrap-datetimepicker-widget .btn{padding:6px}.bootstrap-datetimepicker-widget:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0,0,0,0.2);position:absolute;top:-7px;left:6px}.bootstrap-datetimepicker-widget:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #fff;position:absolute;top:-6px;left:7px}.bootstrap-datetimepicker-widget.pull-right:before{left:auto;right:6px}.bootstrap-datetimepicker-widget.pull-right:after{left:auto;right:7px}.bootstrap-datetimepicker-widget>ul{list-style-type:none;margin:0}.bootstrap-datetimepicker-widget .timepicker-hour,.bootstrap-datetimepicker-widget .timepicker-minute,.bootstrap-datetimepicker-widget .timepicker-second{width:100%;font-weight:bold;font-size:1.2em}.bootstrap-datetimepicker-widget table[data-hour-format="12"] .separator{width:4px;padding:0;margin:0}.bootstrap-datetimepicker-widget .datepicker>div{display:none}.bootstrap-datetimepicker-widget .picker-switch{text-align:center}.bootstrap-datetimepicker-widget table{width:100%;margin:0}.bootstrap-datetimepicker-widget td,.bootstrap-datetimepicker-widget th{text-align:center;width:20px;height:20px;border-radius:4px}.bootstrap-datetimepicker-widget td.day:hover,.bootstrap-datetimepicker-widget td.hour:hover,.bootstrap-datetimepicker-widget td.minute:hover,.bootstrap-datetimepicker-widget td.second:hover{background:#eee;cursor:pointer}.bootstrap-datetimepicker-widget td.old,.bootstrap-datetimepicker-widget td.new{color:#999}.bootstrap-datetimepicker-widget td.active,.bootstrap-datetimepicker-widget td.active:hover{background-color:#428bca;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.bootstrap-datetimepicker-widget td.disabled,.bootstrap-datetimepicker-widget td.disabled:hover{background:none;color:#999;cursor:not-allowed}.bootstrap-datetimepicker-widget td span{display:block;width:47px;height:54px;line-height:54px;float:left;margin:2px;cursor:pointer;border-radius:4px}.bootstrap-datetimepicker-widget td span:hover{background:#eee}.bootstrap-datetimepicker-widget td span.active{background-color:#428bca;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.bootstrap-datetimepicker-widget td span.old{color:#999}.bootstrap-datetimepicker-widget td span.disabled,.bootstrap-datetimepicker-widget td span.disabled:hover{background:none;color:#999;cursor:not-allowed}.bootstrap-datetimepicker-widget th.switch{width:145px}.bootstrap-datetimepicker-widget th.next,.bootstrap-datetimepicker-widget th.prev{font-size:21px}.bootstrap-datetimepicker-widget th.disabled,.bootstrap-datetimepicker-widget th.disabled:hover{background:none;color:#999;cursor:not-allowed}.bootstrap-datetimepicker-widget thead tr:first-child th{cursor:pointer}.bootstrap-datetimepicker-widget thead tr:first-child th:hover{background:#eee}.input-group.date .input-group-addon span{display:block;cursor:pointer;width:16px;height:16px}.bootstrap-datetimepicker-widget.left-oriented:before{left:auto;right:6px}.bootstrap-datetimepicker-widget.left-oriented:after{left:auto;right:7px}.bootstrap-datetimepicker-widget ul.list-unstyled li.in div.timepicker div.timepicker-picker table.table-condensed tbody>tr>td{padding:0 !important} \ No newline at end of file
diff --git a/library/bootstrap-datetimepicker/js/bootstrap-datetimepicker.min.js b/library/bootstrap-datetimepicker/js/bootstrap-datetimepicker.min.js
new file mode 100755
index 000000000..3bc74fcbb
--- /dev/null
+++ b/library/bootstrap-datetimepicker/js/bootstrap-datetimepicker.min.js
@@ -0,0 +1,28 @@
+/**
+ * version 2.1.11
+ * @license
+ * =========================================================
+ * bootstrap-datetimepicker.js
+ * http://www.eyecon.ro/bootstrap-datepicker
+ * =========================================================
+ * Copyright 2012 Stefan Petre
+ *
+ * Contributions:
+ * - updated for Bootstrap v3 by Jonathan Peterson (@Eonasdan) and (almost)
+ * completely rewritten to use Momentjs
+ * - based on tarruda's bootstrap-datepicker
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * =========================================================
+ */
+(function($){if(typeof moment==="undefined"){alert("momentjs is requried");throw new Error("momentjs is requried")}var dpgId=0,pMoment=moment,DateTimePicker=function(element,options){var defaults={pickDate:true,pickTime:true,startDate:new pMoment({y:1970}),endDate:(new pMoment).add(50,"y"),collapse:true,language:"en",defaultDate:"",disabledDates:[],icons:{},useStrict:false},icons={time:"glyphicon glyphicon-time",date:"glyphicon glyphicon-calendar",up:"glyphicon glyphicon-chevron-up",down:"glyphicon glyphicon-chevron-down"},picker=this,init=function(){var icon=false,i,dDate,longDateFormat;picker.options=$.extend({},defaults,options);picker.options.icons=$.extend({},icons,picker.options.icons);if(!(picker.options.pickTime||picker.options.pickDate))throw new Error("Must choose at least one picker");picker.id=dpgId++;pMoment.lang(picker.options.language);picker.date=pMoment();picker.element=$(element);picker.unset=false;picker.isInput=picker.element.is("input");picker.component=false;if(picker.element.hasClass("input-group")){if(picker.element.find(".datepickerbutton").size()==0){picker.component=picker.element.find(".input-group-addon")}else{picker.component=picker.element.find(".datepickerbutton")}}picker.format=picker.options.format;longDateFormat=pMoment()._lang._longDateFormat;if(!picker.format){if(picker.isInput)picker.format=picker.element.data("format");else picker.format=picker.element.find("input").data("format");if(!picker.format){picker.format=picker.options.pickDate?longDateFormat.L:"";if(picker.options.pickDate&&picker.options.pickTime)picker.format+=" ";picker.format+=picker.options.pickTime?longDateFormat.LT:""}}picker.use24hours=picker.format.toLowerCase().indexOf("a")<1;if(picker.component)icon=picker.component.find("span");if(picker.options.pickTime){if(icon)icon.addClass(picker.options.icons.time)}if(picker.options.pickDate){if(icon){icon.removeClass(picker.options.icons.time);icon.addClass(picker.options.icons.date)}}picker.widget=$(getTemplate(picker.options.pickDate,picker.options.pickTime,picker.options.collapse)).appendTo("body");picker.minViewMode=picker.options.minViewMode||picker.element.data("date-minviewmode")||0;if(typeof picker.minViewMode==="string"){switch(picker.minViewMode){case"months":picker.minViewMode=1;break;case"years":picker.minViewMode=2;break;default:picker.minViewMode=0;break}}picker.viewMode=picker.options.viewMode||picker.element.data("date-viewmode")||0;if(typeof picker.viewMode==="string"){switch(picker.viewMode){case"months":picker.viewMode=1;break;case"years":picker.viewMode=2;break;default:picker.viewMode=0;break}}for(i=0;i<picker.options.disabledDates.length;i++){dDate=picker.options.disabledDates[i];dDate=pMoment(dDate);if(!dDate.isValid())dDate=pMoment(picker.options.startDate).subtract(1,"day");picker.options.disabledDates[i]=dDate.format("L")}picker.startViewMode=picker.viewMode;picker.setStartDate(picker.options.startDate||picker.element.data("date-startdate"));picker.setEndDate(picker.options.endDate||picker.element.data("date-enddate"));fillDow();fillMonths();fillHours();fillMinutes();update();showMode();attachDatePickerEvents();if(picker.options.defaultDate!=="")picker.setValue(picker.options.defaultDate)},place=function(){var position="absolute",offset=picker.component?picker.component.offset():picker.element.offset(),$window=$(window);picker.width=picker.component?picker.component.outerWidth():picker.element.outerWidth();offset.top=offset.top+picker.element.outerHeight();if(picker.options.width!==undefined){picker.widget.width(picker.options.width)}if(picker.options.orientation==="left"){picker.widget.addClass("left-oriented");offset.left=offset.left-picker.widget.width()+20}if(isInFixed()){position="fixed";offset.top-=$window.scrollTop();offset.left-=$window.scrollLeft()}if($window.width()<offset.left+picker.widget.outerWidth()){offset.right=$window.width()-offset.left-picker.width;offset.left="auto";picker.widget.addClass("pull-right")}else{offset.right="auto";picker.widget.removeClass("pull-right")}picker.widget.css({position:position,top:offset.top,left:offset.left,right:offset.right})},notifyChange=function(oldDate){picker.element.trigger({type:"change.dp",date:picker.getDate(),oldDate:oldDate})},notifyError=function(date){picker.element.trigger({type:"error.dp",date:date})},update=function(newDate){pMoment.lang(picker.options.language);var dateStr=newDate;if(!dateStr){if(picker.isInput){dateStr=picker.element.val()}else{dateStr=picker.element.find("input").val()}if(dateStr)picker.date=pMoment(dateStr,picker.format,picker.options.useStrict);if(!picker.date)picker.date=pMoment()}picker.viewDate=pMoment(picker.date).startOf("month");fillDate();fillTime()},fillDow=function(){pMoment.lang(picker.options.language);var html=$("<tr>"),weekdaysMin=pMoment.weekdaysMin(),i;if(pMoment()._lang._week.dow==0){for(i=0;i<7;i++){html.append('<th class="dow">'+weekdaysMin[i]+"</th>")}}else{for(i=1;i<8;i++){if(i==7){html.append('<th class="dow">'+weekdaysMin[0]+"</th>")}else{html.append('<th class="dow">'+weekdaysMin[i]+"</th>")}}}picker.widget.find(".datepicker-days thead").append(html)},fillMonths=function(){pMoment.lang(picker.options.language);var html="",i=0,monthsShort=pMoment.monthsShort();while(i<12){html+='<span class="month">'+monthsShort[i++]+"</span>"}picker.widget.find(".datepicker-months td").append(html)},fillDate=function(){pMoment.lang(picker.options.language);var year=picker.viewDate.year(),month=picker.viewDate.month(),startYear=picker.options.startDate.year(),startMonth=picker.options.startDate.month(),endYear=picker.options.endDate.year(),endMonth=picker.options.endDate.month(),prevMonth,nextMonth,html=[],row,clsName,i,days,yearCont,currentYear,months=pMoment.months();picker.widget.find(".datepicker-days").find(".disabled").removeClass("disabled");picker.widget.find(".datepicker-months").find(".disabled").removeClass("disabled");picker.widget.find(".datepicker-years").find(".disabled").removeClass("disabled");picker.widget.find(".datepicker-days th:eq(1)").text(months[month]+" "+year);prevMonth=pMoment(picker.viewDate).subtract("months",1);days=prevMonth.daysInMonth();prevMonth.date(days).startOf("week");if(year==startYear&&month<=startMonth||year<startYear){picker.widget.find(".datepicker-days th:eq(0)").addClass("disabled")}if(year==endYear&&month>=endMonth||year>endYear){picker.widget.find(".datepicker-days th:eq(2)").addClass("disabled")}nextMonth=pMoment(prevMonth).add(42,"d");while(prevMonth.isBefore(nextMonth)){if(prevMonth.weekday()===pMoment().startOf("week").weekday()){row=$("<tr>");html.push(row)}clsName="";if(prevMonth.year()<year||prevMonth.year()==year&&prevMonth.month()<month){clsName+=" old"}else if(prevMonth.year()>year||prevMonth.year()==year&&prevMonth.month()>month){clsName+=" new"}if(prevMonth.isSame(pMoment({y:picker.date.year(),M:picker.date.month(),d:picker.date.date()}))){clsName+=" active"}if(pMoment(prevMonth).add(1,"d")<=picker.options.startDate||prevMonth>picker.options.endDate||isInDisableDates(prevMonth)){clsName+=" disabled"}row.append('<td class="day'+clsName+'">'+prevMonth.date()+"</td>");prevMonth.add(1,"d")}picker.widget.find(".datepicker-days tbody").empty().append(html);currentYear=pMoment().year(),months=picker.widget.find(".datepicker-months").find("th:eq(1)").text(year).end().find("span").removeClass("active");if(currentYear===year){months.eq(pMoment().month()).addClass("active")}if(currentYear-1<startYear){picker.widget.find(".datepicker-months th:eq(0)").addClass("disabled")}if(currentYear+1>endYear){picker.widget.find(".datepicker-months th:eq(2)").addClass("disabled")}for(i=0;i<12;i++){if(year==startYear&&startMonth>i||year<startYear){$(months[i]).addClass("disabled")}else if(year==endYear&&endMonth<i||year>endYear){$(months[i]).addClass("disabled")}}html="";year=parseInt(year/10,10)*10;yearCont=picker.widget.find(".datepicker-years").find("th:eq(1)").text(year+"-"+(year+9)).end().find("td");picker.widget.find(".datepicker-years").find("th").removeClass("disabled");if(startYear>year){picker.widget.find(".datepicker-years").find("th:eq(0)").addClass("disabled")}if(endYear<year+9){picker.widget.find(".datepicker-years").find("th:eq(2)").addClass("disabled")}year-=1;for(i=-1;i<11;i++){html+='<span class="year'+(i===-1||i===10?" old":"")+(currentYear===year?" active":"")+(year<startYear||year>endYear?" disabled":"")+'">'+year+"</span>";year+=1}yearCont.html(html)},fillHours=function(){pMoment.lang(picker.options.language);var table=picker.widget.find(".timepicker .timepicker-hours table"),html="",current,i,j;table.parent().hide();if(picker.use24hours){current=0;for(i=0;i<6;i+=1){html+="<tr>";for(j=0;j<4;j+=1){html+='<td class="hour">'+padLeft(current.toString())+"</td>";current++}html+="</tr>"}}else{current=1;for(i=0;i<3;i+=1){html+="<tr>";for(j=0;j<4;j+=1){html+='<td class="hour">'+padLeft(current.toString())+"</td>";current++}html+="</tr>"}}table.html(html)},fillMinutes=function(){var table=picker.widget.find(".timepicker .timepicker-minutes table"),html="",current=0,i,j;table.parent().hide();for(i=0;i<5;i++){html+="<tr>";for(j=0;j<4;j+=1){html+='<td class="minute">'+padLeft(current.toString())+"</td>";current+=3}html+="</tr>"}table.html(html)},fillTime=function(){if(!picker.date)return;var timeComponents=picker.widget.find(".timepicker span[data-time-component]"),hour=picker.date.hours(),period="AM";if(!picker.use24hours){if(hour>=12)period="PM";if(hour===0)hour=12;else if(hour!=12)hour=hour%12;picker.widget.find(".timepicker [data-action=togglePeriod]").text(period)}timeComponents.filter("[data-time-component=hours]").text(padLeft(hour));timeComponents.filter("[data-time-component=minutes]").text(padLeft(picker.date.minutes()))},click=function(e){e.stopPropagation();e.preventDefault();picker.unset=false;var target=$(e.target).closest("span, td, th"),month,year,step,day,oldDate=picker.date;if(target.length===1){if(!target.is(".disabled")){switch(target[0].nodeName.toLowerCase()){case"th":switch(target[0].className){case"switch":showMode(1);break;case"prev":case"next":step=dpGlobal.modes[picker.viewMode].navStep;if(target[0].className==="prev")step=step*-1;picker.viewDate.add(step,dpGlobal.modes[picker.viewMode].navFnc);fillDate();break}break;case"span":if(target.is(".month")){month=target.parent().find("span").index(target);picker.viewDate.month(month)}else{year=parseInt(target.text(),10)||0;picker.viewDate.year(year)}if(picker.viewMode!==0){picker.date=pMoment({y:picker.viewDate.year(),M:picker.viewDate.month(),d:picker.viewDate.date(),h:picker.date.hours(),m:picker.date.minutes()});notifyChange(oldDate)}showMode(-1);fillDate();break;case"td":if(target.is(".day")){day=parseInt(target.text(),10)||1;month=picker.viewDate.month();year=picker.viewDate.year();if(target.is(".old")){if(month===0){month=11;year-=1}else{month-=1}}else if(target.is(".new")){if(month==11){month=0;year+=1}else{month+=1}}picker.date=pMoment({y:year,M:month,d:day,h:picker.date.hours(),m:picker.date.minutes()});picker.viewDate=pMoment({y:year,M:month,d:Math.min(28,day)});fillDate();set();notifyChange(oldDate)}break}}}},actions={incrementHours:function(){checkDate("add","hours")},incrementMinutes:function(){checkDate("add","minutes")},decrementHours:function(){checkDate("subtract","hours")},decrementMinutes:function(){checkDate("subtract","minutes")},togglePeriod:function(){var hour=picker.date.hours();if(hour>=12)hour-=12;else hour+=12;picker.date.hours(hour)},showPicker:function(){picker.widget.find(".timepicker > div:not(.timepicker-picker)").hide();picker.widget.find(".timepicker .timepicker-picker").show()},showHours:function(){picker.widget.find(".timepicker .timepicker-picker").hide();picker.widget.find(".timepicker .timepicker-hours").show()},showMinutes:function(){picker.widget.find(".timepicker .timepicker-picker").hide();picker.widget.find(".timepicker .timepicker-minutes").show()},selectHour:function(e){picker.date.hours(parseInt($(e.target).text(),10));actions.showPicker.call(picker)},selectMinute:function(e){picker.date.minutes(parseInt($(e.target).text(),10));actions.showPicker.call(picker)}},doAction=function(e){var action=$(e.currentTarget).data("action"),rv=actions[action].apply(picker,arguments),oldDate=picker.date;stopEvent(e);if(!picker.date)picker.date=pMoment({y:1970});set();fillTime();notifyChange(oldDate);return rv},stopEvent=function(e){e.stopPropagation();e.preventDefault()},change=function(e){pMoment.lang(picker.options.language);var input=$(e.target),oldDate=picker.date,d=pMoment(input.val(),picker.format,picker.options.useStrict);if(d.isValid()){update();picker.setValue(d);notifyChange(oldDate);set()}else{picker.viewDate=oldDate;notifyChange(oldDate);notifyError(d);picker.unset=true;input.val("")}},showMode=function(dir){if(dir){picker.viewMode=Math.max(picker.minViewMode,Math.min(2,picker.viewMode+dir))}picker.widget.find(".datepicker > div").hide().filter(".datepicker-"+dpGlobal.modes[picker.viewMode].clsName).show()},attachDatePickerEvents=function(){var $this,$parent,expanded,closed,collapseData;picker.widget.on("click",".datepicker *",$.proxy(click,this));picker.widget.on("click","[data-action]",$.proxy(doAction,this));picker.widget.on("mousedown",$.proxy(stopEvent,this));if(picker.options.pickDate&&picker.options.pickTime){picker.widget.on("click.togglePicker",".accordion-toggle",function(e){e.stopPropagation();$this=$(this);$parent=$this.closest("ul");expanded=$parent.find(".in");closed=$parent.find(".collapse:not(.in)");if(expanded&&expanded.length){collapseData=expanded.data("collapse");if(collapseData&&collapseData.transitioning)return;expanded.collapse("hide");closed.collapse("show");$this.find("span").toggleClass(picker.options.icons.time+" "+picker.options.icons.date);picker.element.find(".input-group-addon span").toggleClass(picker.options.icons.time+" "+picker.options.icons.date)}})}if(picker.isInput){picker.element.on({focus:$.proxy(picker.show,this),change:$.proxy(change,this),blur:$.proxy(picker.hide,this)})}else{picker.element.on({change:$.proxy(change,this)},"input");if(picker.component){picker.component.on("click",$.proxy(picker.show,this))}else{picker.element.on("click",$.proxy(picker.show,this))}}},attachDatePickerGlobalEvents=function(){$(window).on("resize.datetimepicker"+picker.id,$.proxy(place,this));if(!picker.isInput){$(document).on("mousedown.datetimepicker"+picker.id,$.proxy(picker.hide,this))}},detachDatePickerEvents=function(){picker.widget.off("click",".datepicker *",picker.click);picker.widget.off("click","[data-action]");picker.widget.off("mousedown",picker.stopEvent);if(picker.options.pickDate&&picker.options.pickTime){picker.widget.off("click.togglePicker")}if(picker.isInput){picker.element.off({focus:picker.show,change:picker.change})}else{picker.element.off({change:picker.change},"input");if(picker.component){picker.component.off("click",picker.show)}else{picker.element.off("click",picker.show)}}},detachDatePickerGlobalEvents=function(){$(window).off("resize.datetimepicker"+picker.id);if(!picker.isInput){$(document).off("mousedown.datetimepicker"+picker.id)}},isInFixed=function(){if(picker.element){var parents=picker.element.parents(),inFixed=false,i;for(i=0;i<parents.length;i++){if($(parents[i]).css("position")=="fixed"){inFixed=true;break}}return inFixed}else{return false}},set=function(){pMoment.lang(picker.options.language);var formatted="",input;if(!picker.unset)formatted=pMoment(picker.date).format(picker.format);if(!picker.isInput){if(picker.component){input=picker.element.find("input");input.val(formatted)}picker.element.data("date",formatted)}else{picker.element.val(formatted)}if(!picker.options.pickTime)picker.hide()},checkDate=function(direction,unit){pMoment.lang(picker.options.language);var newDate;if(direction=="add"){newDate=pMoment(picker.date);if(newDate.hours()==23)newDate.add(1,unit);newDate.add(1,unit)}else{newDate=pMoment(picker.date).subtract(1,unit)}if(newDate.isAfter(picker.options.endDate)||newDate.subtract(1,unit).isBefore(picker.options.startDate)||isInDisableDates(newDate)){notifyError(newDate.format(picker.format));return}if(direction=="add"){picker.date.add(1,unit)}else{picker.date.subtract(1,unit)}},isInDisableDates=function(date){pMoment.lang(picker.options.language);var disabled=picker.options.disabledDates,i;for(i in disabled){if(disabled[i]==pMoment(date).format("L")){return true}}return false},padLeft=function(string){string=string.toString();if(string.length>=2)return string;else return"0"+string},getTemplate=function(pickDate,pickTime,collapse){if(pickDate&&pickTime){return'<div class="bootstrap-datetimepicker-widget dropdown-menu" style="z-index:9999 !important;">'+'<ul class="list-unstyled">'+"<li"+(collapse?' class="collapse in"':"")+">"+'<div class="datepicker">'+dpGlobal.template+"</div>"+"</li>"+'<li class="picker-switch accordion-toggle"><a class="btn" style="width:100%"><span class="'+picker.options.icons.time+'"></span></a></li>'+"<li"+(collapse?' class="collapse"':"")+">"+'<div class="timepicker">'+tpGlobal.getTemplate()+"</div>"+"</li>"+"</ul>"+"</div>"}else if(pickTime){return'<div class="bootstrap-datetimepicker-widget dropdown-menu">'+'<div class="timepicker">'+tpGlobal.getTemplate()+"</div>"+"</div>"}else{return'<div class="bootstrap-datetimepicker-widget dropdown-menu">'+'<div class="datepicker">'+dpGlobal.template+"</div>"+"</div>"}},dpGlobal={modes:[{clsName:"days",navFnc:"month",navStep:1},{clsName:"months",navFnc:"year",navStep:1},{clsName:"years",navFnc:"year",navStep:10}],headTemplate:"<thead>"+"<tr>"+'<th class="prev">&lsaquo;</th><th colspan="5" class="switch"></th><th class="next">&rsaquo;</th>'+"</tr>"+"</thead>",contTemplate:'<tbody><tr><td colspan="7"></td></tr></tbody>'},tpGlobal={hourTemplate:'<span data-action="showHours" data-time-component="hours" class="timepicker-hour"></span>',minuteTemplate:'<span data-action="showMinutes" data-time-component="minutes" class="timepicker-minute"></span>'};dpGlobal.template='<div class="datepicker-days">'+'<table class="table-condensed">'+dpGlobal.headTemplate+"<tbody></tbody></table>"+"</div>"+'<div class="datepicker-months">'+'<table class="table-condensed">'+dpGlobal.headTemplate+dpGlobal.contTemplate+"</table>"+"</div>"+'<div class="datepicker-years">'+'<table class="table-condensed">'+dpGlobal.headTemplate+dpGlobal.contTemplate+"</table>"+"</div>";tpGlobal.getTemplate=function(){return'<div class="timepicker-picker">'+'<table class="table-condensed">'+"<tr>"+'<td><a href="#" class="btn" data-action="incrementHours"><span class="'+picker.options.icons.up+'"></span></a></td>'+'<td class="separator"></td>'+'<td><a href="#" class="btn" data-action="incrementMinutes"><span class="'+picker.options.icons.up+'"></span></a></td>'+(!picker.use24hours?'<td class="separator"></td>':"")+"</tr>"+"<tr>"+"<td>"+tpGlobal.hourTemplate+"</td> "+'<td class="separator">:</td>'+"<td>"+tpGlobal.minuteTemplate+"</td> "+(!picker.use24hours?'<td class="separator"></td>'+'<td><button type="button" class="btn btn-primary" data-action="togglePeriod"></button></td>':"")+"</tr>"+"<tr>"+'<td><a href="#" class="btn" data-action="decrementHours"><span class="'+picker.options.icons.down+'"></span></a></td>'+'<td class="separator"></td>'+'<td><a href="#" class="btn" data-action="decrementMinutes"><span class="'+picker.options.icons.down+'"></span></a></td>'+(!picker.use24hours?'<td class="separator"></td>':"")+"</tr>"+"</table>"+"</div>"+'<div class="timepicker-hours" data-action="selectHour">'+'<table class="table-condensed"></table>'+"</div>"+'<div class="timepicker-minutes" data-action="selectMinute">'+'<table class="table-condensed"></table>'+"</div>"};picker.destroy=function(){detachDatePickerEvents();detachDatePickerGlobalEvents();picker.widget.remove();picker.element.removeData("DateTimePicker");if(picker.component)picker.component.removeData("DateTimePicker")};picker.show=function(e){picker.widget.show();picker.height=picker.component?picker.component.outerHeight():picker.element.outerHeight();place();picker.element.trigger({type:"show.dp",date:picker.date});attachDatePickerGlobalEvents();if(e){stopEvent(e)}},picker.disable=function(){picker.element.find("input").prop("disabled",true);detachDatePickerEvents()},picker.enable=function(){picker.element.find("input").prop("disabled",false);attachDatePickerEvents()},picker.hide=function(){var collapse=picker.widget.find(".collapse"),i,collapseData;for(i=0;i<collapse.length;i++){collapseData=collapse.eq(i).data("collapse");if(collapseData&&collapseData.transitioning)return}picker.widget.hide();picker.viewMode=picker.startViewMode;showMode();picker.element.trigger({type:"hide.dp",date:picker.date});detachDatePickerGlobalEvents()},picker.setValue=function(newDate){pMoment.lang(picker.options.language);if(!newDate){picker.unset=true}else{picker.unset=false}if(!pMoment.isMoment(newDate))newDate=pMoment(newDate);if(newDate.isValid()){picker.date=newDate;set();picker.viewDate=pMoment({y:picker.date.year(),M:picker.date.month()});fillDate();fillTime()}else{notifyError(newDate)}},picker.getDate=function(){if(picker.unset)return null;return picker.date},picker.setDate=function(date){if(!date)picker.setValue(null);else picker.setValue(date)},picker.setEndDate=function(date){picker.options.endDate=pMoment(date);if(!picker.options.endDate.isValid()){picker.options.endDate=pMoment().add(50,"y")}if(picker.viewDate)update()},picker.setStartDate=function(date){picker.options.startDate=pMoment(date);if(!picker.options.startDate.isValid()){picker.options.startDate=pMoment({y:1970})}if(picker.viewDate)update()};init()};$.fn.datetimepicker=function(options){return this.each(function(){var $this=$(this),data=$this.data("DateTimePicker");if(!data)$this.data("DateTimePicker",new DateTimePicker(this,options))})}})(jQuery); \ No newline at end of file
diff --git a/library/bootstrap-datetimepicker/js/moment.js b/library/bootstrap-datetimepicker/js/moment.js
new file mode 100644
index 000000000..0168748fa
--- /dev/null
+++ b/library/bootstrap-datetimepicker/js/moment.js
@@ -0,0 +1,7063 @@
+//! moment.js
+//! version : 2.4.0
+//! authors : Tim Wood, Iskren Chernev, Moment.js contributors
+//! license : MIT
+//! momentjs.com
+
+(function (undefined) {
+
+ /************************************
+ Constants
+ ************************************/
+
+ var moment,
+ VERSION = "2.4.0",
+ round = Math.round,
+ i,
+
+ YEAR = 0,
+ MONTH = 1,
+ DATE = 2,
+ HOUR = 3,
+ MINUTE = 4,
+ SECOND = 5,
+ MILLISECOND = 6,
+
+ // internal storage for language config files
+ languages = {},
+
+ // check for nodeJS
+ hasModule = (typeof module !== 'undefined' && module.exports),
+
+ // ASP.NET json date format regex
+ aspNetJsonRegex = /^\/?Date\((\-?\d+)/i,
+ aspNetTimeSpanJsonRegex = /(\-)?(?:(\d*)\.)?(\d+)\:(\d+)(?:\:(\d+)\.?(\d{3})?)?/,
+
+ // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html
+ // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere
+ isoDurationRegex = /^(-)?P(?:(?:([0-9,.]*)Y)?(?:([0-9,.]*)M)?(?:([0-9,.]*)D)?(?:T(?:([0-9,.]*)H)?(?:([0-9,.]*)M)?(?:([0-9,.]*)S)?)?|([0-9,.]*)W)$/,
+
+ // format tokens
+ formattingTokens = /(\[[^\[]*\])|(\\)?(Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|mm?|ss?|S{1,4}|X|zz?|ZZ?|.)/g,
+ localFormattingTokens = /(\[[^\[]*\])|(\\)?(LT|LL?L?L?|l{1,4})/g,
+
+ // parsing token regexes
+ parseTokenOneOrTwoDigits = /\d\d?/, // 0 - 99
+ parseTokenOneToThreeDigits = /\d{1,3}/, // 0 - 999
+ parseTokenThreeDigits = /\d{3}/, // 000 - 999
+ parseTokenFourDigits = /\d{1,4}/, // 0 - 9999
+ parseTokenSixDigits = /[+\-]?\d{1,6}/, // -999,999 - 999,999
+ parseTokenDigits = /\d+/, // nonzero number of digits
+ parseTokenWord = /[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i, // any word (or two) characters or numbers including two/three word month in arabic.
+ parseTokenTimezone = /Z|[\+\-]\d\d:?\d\d/i, // +00:00 -00:00 +0000 -0000 or Z
+ parseTokenT = /T/i, // T (ISO seperator)
+ parseTokenTimestampMs = /[\+\-]?\d+(\.\d{1,3})?/, // 123456789 123456789.123
+
+ // preliminary iso regex
+ // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000)
+ isoRegex = /^\s*\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|Z)?)?$/,
+
+ isoFormat = 'YYYY-MM-DDTHH:mm:ssZ',
+
+ isoDates = [
+ 'YYYY-MM-DD',
+ 'GGGG-[W]WW',
+ 'GGGG-[W]WW-E',
+ 'YYYY-DDD'
+ ],
+
+ // iso time formats and regexes
+ isoTimes = [
+ ['HH:mm:ss.SSSS', /(T| )\d\d:\d\d:\d\d\.\d{1,3}/],
+ ['HH:mm:ss', /(T| )\d\d:\d\d:\d\d/],
+ ['HH:mm', /(T| )\d\d:\d\d/],
+ ['HH', /(T| )\d\d/]
+ ],
+
+ // timezone chunker "+10:00" > ["10", "00"] or "-1530" > ["-15", "30"]
+ parseTimezoneChunker = /([\+\-]|\d\d)/gi,
+
+ // getter and setter names
+ proxyGettersAndSetters = 'Date|Hours|Minutes|Seconds|Milliseconds'.split('|'),
+ unitMillisecondFactors = {
+ 'Milliseconds' : 1,
+ 'Seconds' : 1e3,
+ 'Minutes' : 6e4,
+ 'Hours' : 36e5,
+ 'Days' : 864e5,
+ 'Months' : 2592e6,
+ 'Years' : 31536e6
+ },
+
+ unitAliases = {
+ ms : 'millisecond',
+ s : 'second',
+ m : 'minute',
+ h : 'hour',
+ d : 'day',
+ D : 'date',
+ w : 'week',
+ W : 'isoWeek',
+ M : 'month',
+ y : 'year',
+ DDD : 'dayOfYear',
+ e : 'weekday',
+ E : 'isoWeekday',
+ gg: 'weekYear',
+ GG: 'isoWeekYear'
+ },
+
+ camelFunctions = {
+ dayofyear : 'dayOfYear',
+ isoweekday : 'isoWeekday',
+ isoweek : 'isoWeek',
+ weekyear : 'weekYear',
+ isoweekyear : 'isoWeekYear'
+ },
+
+ // format function strings
+ formatFunctions = {},
+
+ // tokens to ordinalize and pad
+ ordinalizeTokens = 'DDD w W M D d'.split(' '),
+ paddedTokens = 'M D H h m s w W'.split(' '),
+
+ formatTokenFunctions = {
+ M : function () {
+ return this.month() + 1;
+ },
+ MMM : function (format) {
+ return this.lang().monthsShort(this, format);
+ },
+ MMMM : function (format) {
+ return this.lang().months(this, format);
+ },
+ D : function () {
+ return this.date();
+ },
+ DDD : function () {
+ return this.dayOfYear();
+ },
+ d : function () {
+ return this.day();
+ },
+ dd : function (format) {
+ return this.lang().weekdaysMin(this, format);
+ },
+ ddd : function (format) {
+ return this.lang().weekdaysShort(this, format);
+ },
+ dddd : function (format) {
+ return this.lang().weekdays(this, format);
+ },
+ w : function () {
+ return this.week();
+ },
+ W : function () {
+ return this.isoWeek();
+ },
+ YY : function () {
+ return leftZeroFill(this.year() % 100, 2);
+ },
+ YYYY : function () {
+ return leftZeroFill(this.year(), 4);
+ },
+ YYYYY : function () {
+ return leftZeroFill(this.year(), 5);
+ },
+ gg : function () {
+ return leftZeroFill(this.weekYear() % 100, 2);
+ },
+ gggg : function () {
+ return this.weekYear();
+ },
+ ggggg : function () {
+ return leftZeroFill(this.weekYear(), 5);
+ },
+ GG : function () {
+ return leftZeroFill(this.isoWeekYear() % 100, 2);
+ },
+ GGGG : function () {
+ return this.isoWeekYear();
+ },
+ GGGGG : function () {
+ return leftZeroFill(this.isoWeekYear(), 5);
+ },
+ e : function () {
+ return this.weekday();
+ },
+ E : function () {
+ return this.isoWeekday();
+ },
+ a : function () {
+ return this.lang().meridiem(this.hours(), this.minutes(), true);
+ },
+ A : function () {
+ return this.lang().meridiem(this.hours(), this.minutes(), false);
+ },
+ H : function () {
+ return this.hours();
+ },
+ h : function () {
+ return this.hours() % 12 || 12;
+ },
+ m : function () {
+ return this.minutes();
+ },
+ s : function () {
+ return this.seconds();
+ },
+ S : function () {
+ return toInt(this.milliseconds() / 100);
+ },
+ SS : function () {
+ return leftZeroFill(toInt(this.milliseconds() / 10), 2);
+ },
+ SSS : function () {
+ return leftZeroFill(this.milliseconds(), 3);
+ },
+ SSSS : function () {
+ return leftZeroFill(this.milliseconds(), 3);
+ },
+ Z : function () {
+ var a = -this.zone(),
+ b = "+";
+ if (a < 0) {
+ a = -a;
+ b = "-";
+ }
+ return b + leftZeroFill(toInt(a / 60), 2) + ":" + leftZeroFill(toInt(a) % 60, 2);
+ },
+ ZZ : function () {
+ var a = -this.zone(),
+ b = "+";
+ if (a < 0) {
+ a = -a;
+ b = "-";
+ }
+ return b + leftZeroFill(toInt(10 * a / 6), 4);
+ },
+ z : function () {
+ return this.zoneAbbr();
+ },
+ zz : function () {
+ return this.zoneName();
+ },
+ X : function () {
+ return this.unix();
+ }
+ },
+
+ lists = ['months', 'monthsShort', 'weekdays', 'weekdaysShort', 'weekdaysMin'];
+
+ function padToken(func, count) {
+ return function (a) {
+ return leftZeroFill(func.call(this, a), count);
+ };
+ }
+ function ordinalizeToken(func, period) {
+ return function (a) {
+ return this.lang().ordinal(func.call(this, a), period);
+ };
+ }
+
+ while (ordinalizeTokens.length) {
+ i = ordinalizeTokens.pop();
+ formatTokenFunctions[i + 'o'] = ordinalizeToken(formatTokenFunctions[i], i);
+ }
+ while (paddedTokens.length) {
+ i = paddedTokens.pop();
+ formatTokenFunctions[i + i] = padToken(formatTokenFunctions[i], 2);
+ }
+ formatTokenFunctions.DDDD = padToken(formatTokenFunctions.DDD, 3);
+
+
+ /************************************
+ Constructors
+ ************************************/
+
+ function Language() {
+
+ }
+
+ // Moment prototype object
+ function Moment(config) {
+ checkOverflow(config);
+ extend(this, config);
+ }
+
+ // Duration Constructor
+ function Duration(duration) {
+ var normalizedInput = normalizeObjectUnits(duration),
+ years = normalizedInput.year || 0,
+ months = normalizedInput.month || 0,
+ weeks = normalizedInput.week || 0,
+ days = normalizedInput.day || 0,
+ hours = normalizedInput.hour || 0,
+ minutes = normalizedInput.minute || 0,
+ seconds = normalizedInput.second || 0,
+ milliseconds = normalizedInput.millisecond || 0;
+
+ // store reference to input for deterministic cloning
+ this._input = duration;
+
+ // representation for dateAddRemove
+ this._milliseconds = +milliseconds +
+ seconds * 1e3 + // 1000
+ minutes * 6e4 + // 1000 * 60
+ hours * 36e5; // 1000 * 60 * 60
+ // Because of dateAddRemove treats 24 hours as different from a
+ // day when working around DST, we need to store them separately
+ this._days = +days +
+ weeks * 7;
+ // It is impossible translate months into days without knowing
+ // which months you are are talking about, so we have to store
+ // it separately.
+ this._months = +months +
+ years * 12;
+
+ this._data = {};
+
+ this._bubble();
+ }
+
+ /************************************
+ Helpers
+ ************************************/
+
+
+ function extend(a, b) {
+ for (var i in b) {
+ if (b.hasOwnProperty(i)) {
+ a[i] = b[i];
+ }
+ }
+
+ if (b.hasOwnProperty("toString")) {
+ a.toString = b.toString;
+ }
+
+ if (b.hasOwnProperty("valueOf")) {
+ a.valueOf = b.valueOf;
+ }
+
+ return a;
+ }
+
+ function absRound(number) {
+ if (number < 0) {
+ return Math.ceil(number);
+ } else {
+ return Math.floor(number);
+ }
+ }
+
+ // left zero fill a number
+ // see http://jsperf.com/left-zero-filling for performance comparison
+ function leftZeroFill(number, targetLength) {
+ var output = number + '';
+ while (output.length < targetLength) {
+ output = '0' + output;
+ }
+ return output;
+ }
+
+ // helper function for _.addTime and _.subtractTime
+ function addOrSubtractDurationFromMoment(mom, duration, isAdding, ignoreUpdateOffset) {
+ var milliseconds = duration._milliseconds,
+ days = duration._days,
+ months = duration._months,
+ minutes,
+ hours;
+
+ if (milliseconds) {
+ mom._d.setTime(+mom._d + milliseconds * isAdding);
+ }
+ // store the minutes and hours so we can restore them
+ if (days || months) {
+ minutes = mom.minute();
+ hours = mom.hour();
+ }
+ if (days) {
+ mom.date(mom.date() + days * isAdding);
+ }
+ if (months) {
+ mom.month(mom.month() + months * isAdding);
+ }
+ if (milliseconds && !ignoreUpdateOffset) {
+ moment.updateOffset(mom);
+ }
+ // restore the minutes and hours after possibly changing dst
+ if (days || months) {
+ mom.minute(minutes);
+ mom.hour(hours);
+ }
+ }
+
+ // check if is an array
+ function isArray(input) {
+ return Object.prototype.toString.call(input) === '[object Array]';
+ }
+
+ function isDate(input) {
+ return Object.prototype.toString.call(input) === '[object Date]' ||
+ input instanceof Date;
+ }
+
+ // compare two arrays, return the number of differences
+ function compareArrays(array1, array2, dontConvert) {
+ var len = Math.min(array1.length, array2.length),
+ lengthDiff = Math.abs(array1.length - array2.length),
+ diffs = 0,
+ i;
+ for (i = 0; i < len; i++) {
+ if ((dontConvert && array1[i] !== array2[i]) ||
+ (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) {
+ diffs++;
+ }
+ }
+ return diffs + lengthDiff;
+ }
+
+ function normalizeUnits(units) {
+ if (units) {
+ var lowered = units.toLowerCase().replace(/(.)s$/, '$1');
+ units = unitAliases[units] || camelFunctions[lowered] || lowered;
+ }
+ return units;
+ }
+
+ function normalizeObjectUnits(inputObject) {
+ var normalizedInput = {},
+ normalizedProp,
+ prop,
+ index;
+
+ for (prop in inputObject) {
+ if (inputObject.hasOwnProperty(prop)) {
+ normalizedProp = normalizeUnits(prop);
+ if (normalizedProp) {
+ normalizedInput[normalizedProp] = inputObject[prop];
+ }
+ }
+ }
+
+ return normalizedInput;
+ }
+
+ function makeList(field) {
+ var count, setter;
+
+ if (field.indexOf('week') === 0) {
+ count = 7;
+ setter = 'day';
+ }
+ else if (field.indexOf('month') === 0) {
+ count = 12;
+ setter = 'month';
+ }
+ else {
+ return;
+ }
+
+ moment[field] = function (format, index) {
+ var i, getter,
+ method = moment.fn._lang[field],
+ results = [];
+
+ if (typeof format === 'number') {
+ index = format;
+ format = undefined;
+ }
+
+ getter = function (i) {
+ var m = moment().utc().set(setter, i);
+ return method.call(moment.fn._lang, m, format || '');
+ };
+
+ if (index != null) {
+ return getter(index);
+ }
+ else {
+ for (i = 0; i < count; i++) {
+ results.push(getter(i));
+ }
+ return results;
+ }
+ };
+ }
+
+ function toInt(argumentForCoercion) {
+ var coercedNumber = +argumentForCoercion,
+ value = 0;
+
+ if (coercedNumber !== 0 && isFinite(coercedNumber)) {
+ if (coercedNumber >= 0) {
+ value = Math.floor(coercedNumber);
+ } else {
+ value = Math.ceil(coercedNumber);
+ }
+ }
+
+ return value;
+ }
+
+ function daysInMonth(year, month) {
+ return new Date(Date.UTC(year, month + 1, 0)).getUTCDate();
+ }
+
+ function daysInYear(year) {
+ return isLeapYear(year) ? 366 : 365;
+ }
+
+ function isLeapYear(year) {
+ return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;
+ }
+
+ function checkOverflow(m) {
+ var overflow;
+ if (m._a && m._pf.overflow === -2) {
+ overflow =
+ m._a[MONTH] < 0 || m._a[MONTH] > 11 ? MONTH :
+ m._a[DATE] < 1 || m._a[DATE] > daysInMonth(m._a[YEAR], m._a[MONTH]) ? DATE :
+ m._a[HOUR] < 0 || m._a[HOUR] > 23 ? HOUR :
+ m._a[MINUTE] < 0 || m._a[MINUTE] > 59 ? MINUTE :
+ m._a[SECOND] < 0 || m._a[SECOND] > 59 ? SECOND :
+ m._a[MILLISECOND] < 0 || m._a[MILLISECOND] > 999 ? MILLISECOND :
+ -1;
+
+ if (m._pf._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) {
+ overflow = DATE;
+ }
+
+ m._pf.overflow = overflow;
+ }
+ }
+
+ function initializeParsingFlags(config) {
+ config._pf = {
+ empty : false,
+ unusedTokens : [],
+ unusedInput : [],
+ overflow : -2,
+ charsLeftOver : 0,
+ nullInput : false,
+ invalidMonth : null,
+ invalidFormat : false,
+ userInvalidated : false,
+ iso: false
+ };
+ }
+
+ function isValid(m) {
+ if (m._isValid == null) {
+ m._isValid = !isNaN(m._d.getTime()) &&
+ m._pf.overflow < 0 &&
+ !m._pf.empty &&
+ !m._pf.invalidMonth &&
+ !m._pf.nullInput &&
+ !m._pf.invalidFormat &&
+ !m._pf.userInvalidated;
+
+ if (m._strict) {
+ m._isValid = m._isValid &&
+ m._pf.charsLeftOver === 0 &&
+ m._pf.unusedTokens.length === 0;
+ }
+ }
+ return m._isValid;
+ }
+
+ function normalizeLanguage(key) {
+ return key ? key.toLowerCase().replace('_', '-') : key;
+ }
+
+ /************************************
+ Languages
+ ************************************/
+
+
+ extend(Language.prototype, {
+
+ set : function (config) {
+ var prop, i;
+ for (i in config) {
+ prop = config[i];
+ if (typeof prop === 'function') {
+ this[i] = prop;
+ } else {
+ this['_' + i] = prop;
+ }
+ }
+ },
+
+ _months : "January_February_March_April_May_June_July_August_September_October_November_December".split("_"),
+ months : function (m) {
+ return this._months[m.month()];
+ },
+
+ _monthsShort : "Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),
+ monthsShort : function (m) {
+ return this._monthsShort[m.month()];
+ },
+
+ monthsParse : function (monthName) {
+ var i, mom, regex;
+
+ if (!this._monthsParse) {
+ this._monthsParse = [];
+ }
+
+ for (i = 0; i < 12; i++) {
+ // make the regex if we don't have it already
+ if (!this._monthsParse[i]) {
+ mom = moment.utc([2000, i]);
+ regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, '');
+ this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i');
+ }
+ // test the regex
+ if (this._monthsParse[i].test(monthName)) {
+ return i;
+ }
+ }
+ },
+
+ _weekdays : "Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),
+ weekdays : function (m) {
+ return this._weekdays[m.day()];
+ },
+
+ _weekdaysShort : "Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),
+ weekdaysShort : function (m) {
+ return this._weekdaysShort[m.day()];
+ },
+
+ _weekdaysMin : "Su_Mo_Tu_We_Th_Fr_Sa".split("_"),
+ weekdaysMin : function (m) {
+ return this._weekdaysMin[m.day()];
+ },
+
+ weekdaysParse : function (weekdayName) {
+ var i, mom, regex;
+
+ if (!this._weekdaysParse) {
+ this._weekdaysParse = [];
+ }
+
+ for (i = 0; i < 7; i++) {
+ // make the regex if we don't have it already
+ if (!this._weekdaysParse[i]) {
+ mom = moment([2000, 1]).day(i);
+ regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, '');
+ this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i');
+ }
+ // test the regex
+ if (this._weekdaysParse[i].test(weekdayName)) {
+ return i;
+ }
+ }
+ },
+
+ _longDateFormat : {
+ LT : "h:mm A",
+ L : "MM/DD/YYYY",
+ LL : "MMMM D YYYY",
+ LLL : "MMMM D YYYY LT",
+ LLLL : "dddd, MMMM D YYYY LT"
+ },
+ longDateFormat : function (key) {
+ var output = this._longDateFormat[key];
+ if (!output && this._longDateFormat[key.toUpperCase()]) {
+ output = this._longDateFormat[key.toUpperCase()].replace(/MMMM|MM|DD|dddd/g, function (val) {
+ return val.slice(1);
+ });
+ this._longDateFormat[key] = output;
+ }
+ return output;
+ },
+
+ isPM : function (input) {
+ // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays
+ // Using charAt should be more compatible.
+ return ((input + '').toLowerCase().charAt(0) === 'p');
+ },
+
+ _meridiemParse : /[ap]\.?m?\.?/i,
+ meridiem : function (hours, minutes, isLower) {
+ if (hours > 11) {
+ return isLower ? 'pm' : 'PM';
+ } else {
+ return isLower ? 'am' : 'AM';
+ }
+ },
+
+ _calendar : {
+ sameDay : '[Today at] LT',
+ nextDay : '[Tomorrow at] LT',
+ nextWeek : 'dddd [at] LT',
+ lastDay : '[Yesterday at] LT',
+ lastWeek : '[Last] dddd [at] LT',
+ sameElse : 'L'
+ },
+ calendar : function (key, mom) {
+ var output = this._calendar[key];
+ return typeof output === 'function' ? output.apply(mom) : output;
+ },
+
+ _relativeTime : {
+ 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"
+ },
+ relativeTime : function (number, withoutSuffix, string, isFuture) {
+ var output = this._relativeTime[string];
+ return (typeof output === 'function') ?
+ output(number, withoutSuffix, string, isFuture) :
+ output.replace(/%d/i, number);
+ },
+ pastFuture : function (diff, output) {
+ var format = this._relativeTime[diff > 0 ? 'future' : 'past'];
+ return typeof format === 'function' ? format(output) : format.replace(/%s/i, output);
+ },
+
+ ordinal : function (number) {
+ return this._ordinal.replace("%d", number);
+ },
+ _ordinal : "%d",
+
+ preparse : function (string) {
+ return string;
+ },
+
+ postformat : function (string) {
+ return string;
+ },
+
+ week : function (mom) {
+ return weekOfYear(mom, this._week.dow, this._week.doy).week;
+ },
+
+ _week : {
+ dow : 0, // Sunday is the first day of the week.
+ doy : 6 // The week that contains Jan 1st is the first week of the year.
+ },
+
+ _invalidDate: 'Invalid date',
+ invalidDate: function () {
+ return this._invalidDate;
+ }
+ });
+
+ // Loads a language definition into the `languages` cache. The function
+ // takes a key and optionally values. If not in the browser and no values
+ // are provided, it will load the language file module. As a convenience,
+ // this function also returns the language values.
+ function loadLang(key, values) {
+ values.abbr = key;
+ if (!languages[key]) {
+ languages[key] = new Language();
+ }
+ languages[key].set(values);
+ return languages[key];
+ }
+
+ // Remove a language from the `languages` cache. Mostly useful in tests.
+ function unloadLang(key) {
+ delete languages[key];
+ }
+
+ // Determines which language definition to use and returns it.
+ //
+ // With no parameters, it will return the global language. If you
+ // pass in a language key, such as 'en', it will return the
+ // definition for 'en', so long as 'en' has already been loaded using
+ // moment.lang.
+ function getLangDefinition(key) {
+ var i = 0, j, lang, next, split,
+ get = function (k) {
+ if (!languages[k] && hasModule) {
+ try {
+ require('./lang/' + k);
+ } catch (e) { }
+ }
+ return languages[k];
+ };
+
+ if (!key) {
+ return moment.fn._lang;
+ }
+
+ if (!isArray(key)) {
+ //short-circuit everything else
+ lang = get(key);
+ if (lang) {
+ return lang;
+ }
+ key = [key];
+ }
+
+ //pick the language from the array
+ //try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each
+ //substring from most specific to least, but move to the next array item if it's a more specific variant than the current root
+ while (i < key.length) {
+ split = normalizeLanguage(key[i]).split('-');
+ j = split.length;
+ next = normalizeLanguage(key[i + 1]);
+ next = next ? next.split('-') : null;
+ while (j > 0) {
+ lang = get(split.slice(0, j).join('-'));
+ if (lang) {
+ return lang;
+ }
+ if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) {
+ //the next array item is better than a shallower substring of this one
+ break;
+ }
+ j--;
+ }
+ i++;
+ }
+ return moment.fn._lang;
+ }
+
+ /************************************
+ Formatting
+ ************************************/
+
+
+ function removeFormattingTokens(input) {
+ if (input.match(/\[[\s\S]/)) {
+ return input.replace(/^\[|\]$/g, "");
+ }
+ return input.replace(/\\/g, "");
+ }
+
+ function makeFormatFunction(format) {
+ var array = format.match(formattingTokens), i, length;
+
+ for (i = 0, length = array.length; i < length; i++) {
+ if (formatTokenFunctions[array[i]]) {
+ array[i] = formatTokenFunctions[array[i]];
+ } else {
+ array[i] = removeFormattingTokens(array[i]);
+ }
+ }
+
+ return function (mom) {
+ var output = "";
+ for (i = 0; i < length; i++) {
+ output += array[i] instanceof Function ? array[i].call(mom, format) : array[i];
+ }
+ return output;
+ };
+ }
+
+ // format date using native date object
+ function formatMoment(m, format) {
+
+ if (!m.isValid()) {
+ return m.lang().invalidDate();
+ }
+
+ format = expandFormat(format, m.lang());
+
+ if (!formatFunctions[format]) {
+ formatFunctions[format] = makeFormatFunction(format);
+ }
+
+ return formatFunctions[format](m);
+ }
+
+ function expandFormat(format, lang) {
+ var i = 5;
+
+ function replaceLongDateFormatTokens(input) {
+ return lang.longDateFormat(input) || input;
+ }
+
+ localFormattingTokens.lastIndex = 0;
+ while (i >= 0 && localFormattingTokens.test(format)) {
+ format = format.replace(localFormattingTokens, replaceLongDateFormatTokens);
+ localFormattingTokens.lastIndex = 0;
+ i -= 1;
+ }
+
+ return format;
+ }
+
+
+ /************************************
+ Parsing
+ ************************************/
+
+
+ // get the regex to find the next token
+ function getParseRegexForToken(token, config) {
+ var a;
+ switch (token) {
+ case 'DDDD':
+ return parseTokenThreeDigits;
+ case 'YYYY':
+ case 'GGGG':
+ case 'gggg':
+ return parseTokenFourDigits;
+ case 'YYYYY':
+ case 'GGGGG':
+ case 'ggggg':
+ return parseTokenSixDigits;
+ case 'S':
+ case 'SS':
+ case 'SSS':
+ case 'DDD':
+ return parseTokenOneToThreeDigits;
+ case 'MMM':
+ case 'MMMM':
+ case 'dd':
+ case 'ddd':
+ case 'dddd':
+ return parseTokenWord;
+ case 'a':
+ case 'A':
+ return getLangDefinition(config._l)._meridiemParse;
+ case 'X':
+ return parseTokenTimestampMs;
+ case 'Z':
+ case 'ZZ':
+ return parseTokenTimezone;
+ case 'T':
+ return parseTokenT;
+ case 'SSSS':
+ return parseTokenDigits;
+ case 'MM':
+ case 'DD':
+ case 'YY':
+ case 'GG':
+ case 'gg':
+ case 'HH':
+ case 'hh':
+ case 'mm':
+ case 'ss':
+ case 'M':
+ case 'D':
+ case 'd':
+ case 'H':
+ case 'h':
+ case 'm':
+ case 's':
+ case 'w':
+ case 'ww':
+ case 'W':
+ case 'WW':
+ case 'e':
+ case 'E':
+ return parseTokenOneOrTwoDigits;
+ default :
+ a = new RegExp(regexpEscape(unescapeFormat(token.replace('\\', '')), "i"));
+ return a;
+ }
+ }
+
+ function timezoneMinutesFromString(string) {
+ var tzchunk = (parseTokenTimezone.exec(string) || [])[0],
+ parts = (tzchunk + '').match(parseTimezoneChunker) || ['-', 0, 0],
+ minutes = +(parts[1] * 60) + toInt(parts[2]);
+
+ return parts[0] === '+' ? -minutes : minutes;
+ }
+
+ // function to convert string input to date
+ function addTimeToArrayFromToken(token, input, config) {
+ var a, datePartArray = config._a;
+
+ switch (token) {
+ // MONTH
+ case 'M' : // fall through to MM
+ case 'MM' :
+ if (input != null) {
+ datePartArray[MONTH] = toInt(input) - 1;
+ }
+ break;
+ case 'MMM' : // fall through to MMMM
+ case 'MMMM' :
+ a = getLangDefinition(config._l).monthsParse(input);
+ // if we didn't find a month name, mark the date as invalid.
+ if (a != null) {
+ datePartArray[MONTH] = a;
+ } else {
+ config._pf.invalidMonth = input;
+ }
+ break;
+ // DAY OF MONTH
+ case 'D' : // fall through to DD
+ case 'DD' :
+ if (input != null) {
+ datePartArray[DATE] = toInt(input);
+ }
+ break;
+ // DAY OF YEAR
+ case 'DDD' : // fall through to DDDD
+ case 'DDDD' :
+ if (input != null) {
+ config._dayOfYear = toInt(input);
+ }
+
+ break;
+ // YEAR
+ case 'YY' :
+ datePartArray[YEAR] = toInt(input) + (toInt(input) > 68 ? 1900 : 2000);
+ break;
+ case 'YYYY' :
+ case 'YYYYY' :
+ datePartArray[YEAR] = toInt(input);
+ break;
+ // AM / PM
+ case 'a' : // fall through to A
+ case 'A' :
+ config._isPm = getLangDefinition(config._l).isPM(input);
+ break;
+ // 24 HOUR
+ case 'H' : // fall through to hh
+ case 'HH' : // fall through to hh
+ case 'h' : // fall through to hh
+ case 'hh' :
+ datePartArray[HOUR] = toInt(input);
+ break;
+ // MINUTE
+ case 'm' : // fall through to mm
+ case 'mm' :
+ datePartArray[MINUTE] = toInt(input);
+ break;
+ // SECOND
+ case 's' : // fall through to ss
+ case 'ss' :
+ datePartArray[SECOND] = toInt(input);
+ break;
+ // MILLISECOND
+ case 'S' :
+ case 'SS' :
+ case 'SSS' :
+ case 'SSSS' :
+ datePartArray[MILLISECOND] = toInt(('0.' + input) * 1000);
+ break;
+ // UNIX TIMESTAMP WITH MS
+ case 'X':
+ config._d = new Date(parseFloat(input) * 1000);
+ break;
+ // TIMEZONE
+ case 'Z' : // fall through to ZZ
+ case 'ZZ' :
+ config._useUTC = true;
+ config._tzm = timezoneMinutesFromString(input);
+ break;
+ case 'w':
+ case 'ww':
+ case 'W':
+ case 'WW':
+ case 'd':
+ case 'dd':
+ case 'ddd':
+ case 'dddd':
+ case 'e':
+ case 'E':
+ token = token.substr(0, 1);
+ /* falls through */
+ case 'gg':
+ case 'gggg':
+ case 'GG':
+ case 'GGGG':
+ case 'GGGGG':
+ token = token.substr(0, 2);
+ if (input) {
+ config._w = config._w || {};
+ config._w[token] = input;
+ }
+ break;
+ }
+ }
+
+ // convert an array to a date.
+ // the array should mirror the parameters below
+ // note: all values past the year are optional and will default to the lowest possible value.
+ // [year, month, day , hour, minute, second, millisecond]
+ function dateFromConfig(config) {
+ var i, date, input = [], currentDate,
+ yearToUse, fixYear, w, temp, lang, weekday, week;
+
+ if (config._d) {
+ return;
+ }
+
+ currentDate = currentDateArray(config);
+
+ //compute day of the year from weeks and weekdays
+ if (config._w && config._a[DATE] == null && config._a[MONTH] == null) {
+ fixYear = function (val) {
+ return val ?
+ (val.length < 3 ? (parseInt(val, 10) > 68 ? '19' + val : '20' + val) : val) :
+ (config._a[YEAR] == null ? moment().weekYear() : config._a[YEAR]);
+ };
+
+ w = config._w;
+ if (w.GG != null || w.W != null || w.E != null) {
+ temp = dayOfYearFromWeeks(fixYear(w.GG), w.W || 1, w.E, 4, 1);
+ }
+ else {
+ lang = getLangDefinition(config._l);
+ weekday = w.d != null ? parseWeekday(w.d, lang) :
+ (w.e != null ? parseInt(w.e, 10) + lang._week.dow : 0);
+
+ week = parseInt(w.w, 10) || 1;
+
+ //if we're parsing 'd', then the low day numbers may be next week
+ if (w.d != null && weekday < lang._week.dow) {
+ week++;
+ }
+
+ temp = dayOfYearFromWeeks(fixYear(w.gg), week, weekday, lang._week.doy, lang._week.dow);
+ }
+
+ config._a[YEAR] = temp.year;
+ config._dayOfYear = temp.dayOfYear;
+ }
+
+ //if the day of the year is set, figure out what it is
+ if (config._dayOfYear) {
+ yearToUse = config._a[YEAR] == null ? currentDate[YEAR] : config._a[YEAR];
+
+ if (config._dayOfYear > daysInYear(yearToUse)) {
+ config._pf._overflowDayOfYear = true;
+ }
+
+ date = makeUTCDate(yearToUse, 0, config._dayOfYear);
+ config._a[MONTH] = date.getUTCMonth();
+ config._a[DATE] = date.getUTCDate();
+ }
+
+ // Default to current date.
+ // * if no year, month, day of month are given, default to today
+ // * if day of month is given, default month and year
+ // * if month is given, default only year
+ // * if year is given, don't default anything
+ for (i = 0; i < 3 && config._a[i] == null; ++i) {
+ config._a[i] = input[i] = currentDate[i];
+ }
+
+ // Zero out whatever was not defaulted, including time
+ for (; i < 7; i++) {
+ config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i];
+ }
+
+ // add the offsets to the time to be parsed so that we can have a clean array for checking isValid
+ input[HOUR] += toInt((config._tzm || 0) / 60);
+ input[MINUTE] += toInt((config._tzm || 0) % 60);
+
+ config._d = (config._useUTC ? makeUTCDate : makeDate).apply(null, input);
+ }
+
+ function dateFromObject(config) {
+ var normalizedInput;
+
+ if (config._d) {
+ return;
+ }
+
+ normalizedInput = normalizeObjectUnits(config._i);
+ config._a = [
+ normalizedInput.year,
+ normalizedInput.month,
+ normalizedInput.day,
+ normalizedInput.hour,
+ normalizedInput.minute,
+ normalizedInput.second,
+ normalizedInput.millisecond
+ ];
+
+ dateFromConfig(config);
+ }
+
+ function currentDateArray(config) {
+ var now = new Date();
+ if (config._useUTC) {
+ return [
+ now.getUTCFullYear(),
+ now.getUTCMonth(),
+ now.getUTCDate()
+ ];
+ } else {
+ return [now.getFullYear(), now.getMonth(), now.getDate()];
+ }
+ }
+
+ // date from string and format string
+ function makeDateFromStringAndFormat(config) {
+
+ config._a = [];
+ config._pf.empty = true;
+
+ // This array is used to make a Date, either with `new Date` or `Date.UTC`
+ var lang = getLangDefinition(config._l),
+ string = '' + config._i,
+ i, parsedInput, tokens, token, skipped,
+ stringLength = string.length,
+ totalParsedInputLength = 0;
+
+ tokens = expandFormat(config._f, lang).match(formattingTokens) || [];
+
+ for (i = 0; i < tokens.length; i++) {
+ token = tokens[i];
+ parsedInput = (getParseRegexForToken(token, config).exec(string) || [])[0];
+ if (parsedInput) {
+ skipped = string.substr(0, string.indexOf(parsedInput));
+ if (skipped.length > 0) {
+ config._pf.unusedInput.push(skipped);
+ }
+ string = string.slice(string.indexOf(parsedInput) + parsedInput.length);
+ totalParsedInputLength += parsedInput.length;
+ }
+ // don't parse if it's not a known token
+ if (formatTokenFunctions[token]) {
+ if (parsedInput) {
+ config._pf.empty = false;
+ }
+ else {
+ config._pf.unusedTokens.push(token);
+ }
+ addTimeToArrayFromToken(token, parsedInput, config);
+ }
+ else if (config._strict && !parsedInput) {
+ config._pf.unusedTokens.push(token);
+ }
+ }
+
+ // add remaining unparsed input length to the string
+ config._pf.charsLeftOver = stringLength - totalParsedInputLength;
+ if (string.length > 0) {
+ config._pf.unusedInput.push(string);
+ }
+
+ // handle am pm
+ if (config._isPm && config._a[HOUR] < 12) {
+ config._a[HOUR] += 12;
+ }
+ // if is 12 am, change hours to 0
+ if (config._isPm === false && config._a[HOUR] === 12) {
+ config._a[HOUR] = 0;
+ }
+
+ dateFromConfig(config);
+ checkOverflow(config);
+ }
+
+ function unescapeFormat(s) {
+ return s.replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (matched, p1, p2, p3, p4) {
+ return p1 || p2 || p3 || p4;
+ });
+ }
+
+ // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript
+ function regexpEscape(s) {
+ return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
+ }
+
+ // date from string and array of format strings
+ function makeDateFromStringAndArray(config) {
+ var tempConfig,
+ bestMoment,
+
+ scoreToBeat,
+ i,
+ currentScore;
+
+ if (config._f.length === 0) {
+ config._pf.invalidFormat = true;
+ config._d = new Date(NaN);
+ return;
+ }
+
+ for (i = 0; i < config._f.length; i++) {
+ currentScore = 0;
+ tempConfig = extend({}, config);
+ initializeParsingFlags(tempConfig);
+ tempConfig._f = config._f[i];
+ makeDateFromStringAndFormat(tempConfig);
+
+ if (!isValid(tempConfig)) {
+ continue;
+ }
+
+ // if there is any input that was not parsed add a penalty for that format
+ currentScore += tempConfig._pf.charsLeftOver;
+
+ //or tokens
+ currentScore += tempConfig._pf.unusedTokens.length * 10;
+
+ tempConfig._pf.score = currentScore;
+
+ if (scoreToBeat == null || currentScore < scoreToBeat) {
+ scoreToBeat = currentScore;
+ bestMoment = tempConfig;
+ }
+ }
+
+ extend(config, bestMoment || tempConfig);
+ }
+
+ // date from iso format
+ function makeDateFromString(config) {
+ var i,
+ string = config._i,
+ match = isoRegex.exec(string);
+
+ if (match) {
+ config._pf.iso = true;
+ for (i = 4; i > 0; i--) {
+ if (match[i]) {
+ // match[5] should be "T" or undefined
+ config._f = isoDates[i - 1] + (match[6] || " ");
+ break;
+ }
+ }
+ for (i = 0; i < 4; i++) {
+ if (isoTimes[i][1].exec(string)) {
+ config._f += isoTimes[i][0];
+ break;
+ }
+ }
+ if (parseTokenTimezone.exec(string)) {
+ config._f += "Z";
+ }
+ makeDateFromStringAndFormat(config);
+ }
+ else {
+ config._d = new Date(string);
+ }
+ }
+
+ function makeDateFromInput(config) {
+ var input = config._i,
+ matched = aspNetJsonRegex.exec(input);
+
+ if (input === undefined) {
+ config._d = new Date();
+ } else if (matched) {
+ config._d = new Date(+matched[1]);
+ } else if (typeof input === 'string') {
+ makeDateFromString(config);
+ } else if (isArray(input)) {
+ config._a = input.slice(0);
+ dateFromConfig(config);
+ } else if (isDate(input)) {
+ config._d = new Date(+input);
+ } else if (typeof(input) === 'object') {
+ dateFromObject(config);
+ } else {
+ config._d = new Date(input);
+ }
+ }
+
+ function makeDate(y, m, d, h, M, s, ms) {
+ //can't just apply() to create a date:
+ //http://stackoverflow.com/questions/181348/instantiating-a-javascript-object-by-calling-prototype-constructor-apply
+ var date = new Date(y, m, d, h, M, s, ms);
+
+ //the date constructor doesn't accept years < 1970
+ if (y < 1970) {
+ date.setFullYear(y);
+ }
+ return date;
+ }
+
+ function makeUTCDate(y) {
+ var date = new Date(Date.UTC.apply(null, arguments));
+ if (y < 1970) {
+ date.setUTCFullYear(y);
+ }
+ return date;
+ }
+
+ function parseWeekday(input, language) {
+ if (typeof input === 'string') {
+ if (!isNaN(input)) {
+ input = parseInt(input, 10);
+ }
+ else {
+ input = language.weekdaysParse(input);
+ if (typeof input !== 'number') {
+ return null;
+ }
+ }
+ }
+ return input;
+ }
+
+ /************************************
+ Relative Time
+ ************************************/
+
+
+ // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize
+ function substituteTimeAgo(string, number, withoutSuffix, isFuture, lang) {
+ return lang.relativeTime(number || 1, !!withoutSuffix, string, isFuture);
+ }
+
+ function relativeTime(milliseconds, withoutSuffix, lang) {
+ var seconds = round(Math.abs(milliseconds) / 1000),
+ minutes = round(seconds / 60),
+ hours = round(minutes / 60),
+ days = round(hours / 24),
+ years = round(days / 365),
+ args = seconds < 45 && ['s', seconds] ||
+ minutes === 1 && ['m'] ||
+ minutes < 45 && ['mm', minutes] ||
+ hours === 1 && ['h'] ||
+ hours < 22 && ['hh', hours] ||
+ days === 1 && ['d'] ||
+ days <= 25 && ['dd', days] ||
+ days <= 45 && ['M'] ||
+ days < 345 && ['MM', round(days / 30)] ||
+ years === 1 && ['y'] || ['yy', years];
+ args[2] = withoutSuffix;
+ args[3] = milliseconds > 0;
+ args[4] = lang;
+ return substituteTimeAgo.apply({}, args);
+ }
+
+
+ /************************************
+ Week of Year
+ ************************************/
+
+
+ // firstDayOfWeek 0 = sun, 6 = sat
+ // the day of the week that starts the week
+ // (usually sunday or monday)
+ // firstDayOfWeekOfYear 0 = sun, 6 = sat
+ // the first week is the week that contains the first
+ // of this day of the week
+ // (eg. ISO weeks use thursday (4))
+ function weekOfYear(mom, firstDayOfWeek, firstDayOfWeekOfYear) {
+ var end = firstDayOfWeekOfYear - firstDayOfWeek,
+ daysToDayOfWeek = firstDayOfWeekOfYear - mom.day(),
+ adjustedMoment;
+
+
+ if (daysToDayOfWeek > end) {
+ daysToDayOfWeek -= 7;
+ }
+
+ if (daysToDayOfWeek < end - 7) {
+ daysToDayOfWeek += 7;
+ }
+
+ adjustedMoment = moment(mom).add('d', daysToDayOfWeek);
+ return {
+ week: Math.ceil(adjustedMoment.dayOfYear() / 7),
+ year: adjustedMoment.year()
+ };
+ }
+
+ //http://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday
+ function dayOfYearFromWeeks(year, week, weekday, firstDayOfWeekOfYear, firstDayOfWeek) {
+ var d = new Date(Date.UTC(year, 0)).getUTCDay(),
+ daysToAdd, dayOfYear;
+
+ weekday = weekday != null ? weekday : firstDayOfWeek;
+ daysToAdd = firstDayOfWeek - d + (d > firstDayOfWeekOfYear ? 7 : 0);
+ dayOfYear = 7 * (week - 1) + (weekday - firstDayOfWeek) + daysToAdd + 1;
+
+ return {
+ year: dayOfYear > 0 ? year : year - 1,
+ dayOfYear: dayOfYear > 0 ? dayOfYear : daysInYear(year - 1) + dayOfYear
+ };
+ }
+
+ /************************************
+ Top Level Functions
+ ************************************/
+
+ function makeMoment(config) {
+ var input = config._i,
+ format = config._f;
+
+ if (typeof config._pf === 'undefined') {
+ initializeParsingFlags(config);
+ }
+
+ if (input === null) {
+ return moment.invalid({nullInput: true});
+ }
+
+ if (typeof input === 'string') {
+ config._i = input = getLangDefinition().preparse(input);
+ }
+
+ if (moment.isMoment(input)) {
+ config = extend({}, input);
+
+ config._d = new Date(+input._d);
+ } else if (format) {
+ if (isArray(format)) {
+ makeDateFromStringAndArray(config);
+ } else {
+ makeDateFromStringAndFormat(config);
+ }
+ } else {
+ makeDateFromInput(config);
+ }
+
+ return new Moment(config);
+ }
+
+ moment = function (input, format, lang, strict) {
+ if (typeof(lang) === "boolean") {
+ strict = lang;
+ lang = undefined;
+ }
+ return makeMoment({
+ _i : input,
+ _f : format,
+ _l : lang,
+ _strict : strict,
+ _isUTC : false
+ });
+ };
+
+ // creating with utc
+ moment.utc = function (input, format, lang, strict) {
+ var m;
+
+ if (typeof(lang) === "boolean") {
+ strict = lang;
+ lang = undefined;
+ }
+ m = makeMoment({
+ _useUTC : true,
+ _isUTC : true,
+ _l : lang,
+ _i : input,
+ _f : format,
+ _strict : strict
+ }).utc();
+
+ return m;
+ };
+
+ // creating with unix timestamp (in seconds)
+ moment.unix = function (input) {
+ return moment(input * 1000);
+ };
+
+ // duration
+ moment.duration = function (input, key) {
+ var isDuration = moment.isDuration(input),
+ isNumber = (typeof input === 'number'),
+ duration = (isDuration ? input._input : (isNumber ? {} : input)),
+ // matching against regexp is expensive, do it on demand
+ match = null,
+ sign,
+ ret,
+ parseIso,
+ timeEmpty,
+ dateTimeEmpty;
+
+ if (isNumber) {
+ if (key) {
+ duration[key] = input;
+ } else {
+ duration.milliseconds = input;
+ }
+ } else if (!!(match = aspNetTimeSpanJsonRegex.exec(input))) {
+ sign = (match[1] === "-") ? -1 : 1;
+ duration = {
+ y: 0,
+ d: toInt(match[DATE]) * sign,
+ h: toInt(match[HOUR]) * sign,
+ m: toInt(match[MINUTE]) * sign,
+ s: toInt(match[SECOND]) * sign,
+ ms: toInt(match[MILLISECOND]) * sign
+ };
+ } else if (!!(match = isoDurationRegex.exec(input))) {
+ sign = (match[1] === "-") ? -1 : 1;
+ parseIso = function (inp) {
+ // We'd normally use ~~inp for this, but unfortunately it also
+ // converts floats to ints.
+ // inp may be undefined, so careful calling replace on it.
+ var res = inp && parseFloat(inp.replace(',', '.'));
+ // apply sign while we're at it
+ return (isNaN(res) ? 0 : res) * sign;
+ };
+ duration = {
+ y: parseIso(match[2]),
+ M: parseIso(match[3]),
+ d: parseIso(match[4]),
+ h: parseIso(match[5]),
+ m: parseIso(match[6]),
+ s: parseIso(match[7]),
+ w: parseIso(match[8])
+ };
+ }
+
+ ret = new Duration(duration);
+
+ if (isDuration && input.hasOwnProperty('_lang')) {
+ ret._lang = input._lang;
+ }
+
+ return ret;
+ };
+
+ // version number
+ moment.version = VERSION;
+
+ // default format
+ moment.defaultFormat = isoFormat;
+
+ // This function will be called whenever a moment is mutated.
+ // It is intended to keep the offset in sync with the timezone.
+ moment.updateOffset = function () {};
+
+ // This function will load languages and then set the global language. If
+ // no arguments are passed in, it will simply return the current global
+ // language key.
+ moment.lang = function (key, values) {
+ var r;
+ if (!key) {
+ return moment.fn._lang._abbr;
+ }
+ if (values) {
+ loadLang(normalizeLanguage(key), values);
+ } else if (values === null) {
+ unloadLang(key);
+ key = 'en';
+ } else if (!languages[key]) {
+ getLangDefinition(key);
+ }
+ r = moment.duration.fn._lang = moment.fn._lang = getLangDefinition(key);
+ return r._abbr;
+ };
+
+ // returns language data
+ moment.langData = function (key) {
+ if (key && key._lang && key._lang._abbr) {
+ key = key._lang._abbr;
+ }
+ return getLangDefinition(key);
+ };
+
+ // compare moment object
+ moment.isMoment = function (obj) {
+ return obj instanceof Moment;
+ };
+
+ // for typechecking Duration objects
+ moment.isDuration = function (obj) {
+ return obj instanceof Duration;
+ };
+
+ for (i = lists.length - 1; i >= 0; --i) {
+ makeList(lists[i]);
+ }
+
+ moment.normalizeUnits = function (units) {
+ return normalizeUnits(units);
+ };
+
+ moment.invalid = function (flags) {
+ var m = moment.utc(NaN);
+ if (flags != null) {
+ extend(m._pf, flags);
+ }
+ else {
+ m._pf.userInvalidated = true;
+ }
+
+ return m;
+ };
+
+ moment.parseZone = function (input) {
+ return moment(input).parseZone();
+ };
+
+ /************************************
+ Moment Prototype
+ ************************************/
+
+
+ extend(moment.fn = Moment.prototype, {
+
+ clone : function () {
+ return moment(this);
+ },
+
+ valueOf : function () {
+ return +this._d + ((this._offset || 0) * 60000);
+ },
+
+ unix : function () {
+ return Math.floor(+this / 1000);
+ },
+
+ toString : function () {
+ return this.clone().lang('en').format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ");
+ },
+
+ toDate : function () {
+ return this._offset ? new Date(+this) : this._d;
+ },
+
+ toISOString : function () {
+ return formatMoment(moment(this).utc(), 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]');
+ },
+
+ toArray : function () {
+ var m = this;
+ return [
+ m.year(),
+ m.month(),
+ m.date(),
+ m.hours(),
+ m.minutes(),
+ m.seconds(),
+ m.milliseconds()
+ ];
+ },
+
+ isValid : function () {
+ return isValid(this);
+ },
+
+ isDSTShifted : function () {
+
+ if (this._a) {
+ return this.isValid() && compareArrays(this._a, (this._isUTC ? moment.utc(this._a) : moment(this._a)).toArray()) > 0;
+ }
+
+ return false;
+ },
+
+ parsingFlags : function () {
+ return extend({}, this._pf);
+ },
+
+ invalidAt: function () {
+ return this._pf.overflow;
+ },
+
+ utc : function () {
+ return this.zone(0);
+ },
+
+ local : function () {
+ this.zone(0);
+ this._isUTC = false;
+ return this;
+ },
+
+ format : function (inputString) {
+ var output = formatMoment(this, inputString || moment.defaultFormat);
+ return this.lang().postformat(output);
+ },
+
+ add : function (input, val) {
+ var dur;
+ // switch args to support add('s', 1) and add(1, 's')
+ if (typeof input === 'string') {
+ dur = moment.duration(+val, input);
+ } else {
+ dur = moment.duration(input, val);
+ }
+ addOrSubtractDurationFromMoment(this, dur, 1);
+ return this;
+ },
+
+ subtract : function (input, val) {
+ var dur;
+ // switch args to support subtract('s', 1) and subtract(1, 's')
+ if (typeof input === 'string') {
+ dur = moment.duration(+val, input);
+ } else {
+ dur = moment.duration(input, val);
+ }
+ addOrSubtractDurationFromMoment(this, dur, -1);
+ return this;
+ },
+
+ diff : function (input, units, asFloat) {
+ var that = this._isUTC ? moment(input).zone(this._offset || 0) : moment(input).local(),
+ zoneDiff = (this.zone() - that.zone()) * 6e4,
+ diff, output;
+
+ units = normalizeUnits(units);
+
+ if (units === 'year' || units === 'month') {
+ // average number of days in the months in the given dates
+ diff = (this.daysInMonth() + that.daysInMonth()) * 432e5; // 24 * 60 * 60 * 1000 / 2
+ // difference in months
+ output = ((this.year() - that.year()) * 12) + (this.month() - that.month());
+ // adjust by taking difference in days, average number of days
+ // and dst in the given months.
+ output += ((this - moment(this).startOf('month')) -
+ (that - moment(that).startOf('month'))) / diff;
+ // same as above but with zones, to negate all dst
+ output -= ((this.zone() - moment(this).startOf('month').zone()) -
+ (that.zone() - moment(that).startOf('month').zone())) * 6e4 / diff;
+ if (units === 'year') {
+ output = output / 12;
+ }
+ } else {
+ diff = (this - that);
+ output = units === 'second' ? diff / 1e3 : // 1000
+ units === 'minute' ? diff / 6e4 : // 1000 * 60
+ units === 'hour' ? diff / 36e5 : // 1000 * 60 * 60
+ units === 'day' ? (diff - zoneDiff) / 864e5 : // 1000 * 60 * 60 * 24, negate dst
+ units === 'week' ? (diff - zoneDiff) / 6048e5 : // 1000 * 60 * 60 * 24 * 7, negate dst
+ diff;
+ }
+ return asFloat ? output : absRound(output);
+ },
+
+ from : function (time, withoutSuffix) {
+ return moment.duration(this.diff(time)).lang(this.lang()._abbr).humanize(!withoutSuffix);
+ },
+
+ fromNow : function (withoutSuffix) {
+ return this.from(moment(), withoutSuffix);
+ },
+
+ calendar : function () {
+ var diff = this.diff(moment().zone(this.zone()).startOf('day'), 'days', true),
+ format = diff < -6 ? 'sameElse' :
+ diff < -1 ? 'lastWeek' :
+ diff < 0 ? 'lastDay' :
+ diff < 1 ? 'sameDay' :
+ diff < 2 ? 'nextDay' :
+ diff < 7 ? 'nextWeek' : 'sameElse';
+ return this.format(this.lang().calendar(format, this));
+ },
+
+ isLeapYear : function () {
+ return isLeapYear(this.year());
+ },
+
+ isDST : function () {
+ return (this.zone() < this.clone().month(0).zone() ||
+ this.zone() < this.clone().month(5).zone());
+ },
+
+ day : function (input) {
+ var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay();
+ if (input != null) {
+ input = parseWeekday(input, this.lang());
+ return this.add({ d : input - day });
+ } else {
+ return day;
+ }
+ },
+
+ month : function (input) {
+ var utc = this._isUTC ? 'UTC' : '',
+ dayOfMonth;
+
+ if (input != null) {
+ if (typeof input === 'string') {
+ input = this.lang().monthsParse(input);
+ if (typeof input !== 'number') {
+ return this;
+ }
+ }
+
+ dayOfMonth = this.date();
+ this.date(1);
+ this._d['set' + utc + 'Month'](input);
+ this.date(Math.min(dayOfMonth, this.daysInMonth()));
+
+ moment.updateOffset(this);
+ return this;
+ } else {
+ return this._d['get' + utc + 'Month']();
+ }
+ },
+
+ startOf: function (units) {
+ units = normalizeUnits(units);
+ // the following switch intentionally omits break keywords
+ // to utilize falling through the cases.
+ switch (units) {
+ case 'year':
+ this.month(0);
+ /* falls through */
+ case 'month':
+ this.date(1);
+ /* falls through */
+ case 'week':
+ case 'isoWeek':
+ case 'day':
+ this.hours(0);
+ /* falls through */
+ case 'hour':
+ this.minutes(0);
+ /* falls through */
+ case 'minute':
+ this.seconds(0);
+ /* falls through */
+ case 'second':
+ this.milliseconds(0);
+ /* falls through */
+ }
+
+ // weeks are a special case
+ if (units === 'week') {
+ this.weekday(0);
+ } else if (units === 'isoWeek') {
+ this.isoWeekday(1);
+ }
+
+ return this;
+ },
+
+ endOf: function (units) {
+ units = normalizeUnits(units);
+ return this.startOf(units).add((units === 'isoWeek' ? 'week' : units), 1).subtract('ms', 1);
+ },
+
+ isAfter: function (input, units) {
+ units = typeof units !== 'undefined' ? units : 'millisecond';
+ return +this.clone().startOf(units) > +moment(input).startOf(units);
+ },
+
+ isBefore: function (input, units) {
+ units = typeof units !== 'undefined' ? units : 'millisecond';
+ return +this.clone().startOf(units) < +moment(input).startOf(units);
+ },
+
+ isSame: function (input, units) {
+ units = typeof units !== 'undefined' ? units : 'millisecond';
+ return +this.clone().startOf(units) === +moment(input).startOf(units);
+ },
+
+ min: function (other) {
+ other = moment.apply(null, arguments);
+ return other < this ? this : other;
+ },
+
+ max: function (other) {
+ other = moment.apply(null, arguments);
+ return other > this ? this : other;
+ },
+
+ zone : function (input) {
+ var offset = this._offset || 0;
+ if (input != null) {
+ if (typeof input === "string") {
+ input = timezoneMinutesFromString(input);
+ }
+ if (Math.abs(input) < 16) {
+ input = input * 60;
+ }
+ this._offset = input;
+ this._isUTC = true;
+ if (offset !== input) {
+ addOrSubtractDurationFromMoment(this, moment.duration(offset - input, 'm'), 1, true);
+ }
+ } else {
+ return this._isUTC ? offset : this._d.getTimezoneOffset();
+ }
+ return this;
+ },
+
+ zoneAbbr : function () {
+ return this._isUTC ? "UTC" : "";
+ },
+
+ zoneName : function () {
+ return this._isUTC ? "Coordinated Universal Time" : "";
+ },
+
+ parseZone : function () {
+ if (typeof this._i === 'string') {
+ this.zone(this._i);
+ }
+ return this;
+ },
+
+ hasAlignedHourOffset : function (input) {
+ if (!input) {
+ input = 0;
+ }
+ else {
+ input = moment(input).zone();
+ }
+
+ return (this.zone() - input) % 60 === 0;
+ },
+
+ daysInMonth : function () {
+ return daysInMonth(this.year(), this.month());
+ },
+
+ dayOfYear : function (input) {
+ var dayOfYear = round((moment(this).startOf('day') - moment(this).startOf('year')) / 864e5) + 1;
+ return input == null ? dayOfYear : this.add("d", (input - dayOfYear));
+ },
+
+ weekYear : function (input) {
+ var year = weekOfYear(this, this.lang()._week.dow, this.lang()._week.doy).year;
+ return input == null ? year : this.add("y", (input - year));
+ },
+
+ isoWeekYear : function (input) {
+ var year = weekOfYear(this, 1, 4).year;
+ return input == null ? year : this.add("y", (input - year));
+ },
+
+ week : function (input) {
+ var week = this.lang().week(this);
+ return input == null ? week : this.add("d", (input - week) * 7);
+ },
+
+ isoWeek : function (input) {
+ var week = weekOfYear(this, 1, 4).week;
+ return input == null ? week : this.add("d", (input - week) * 7);
+ },
+
+ weekday : function (input) {
+ var weekday = (this.day() + 7 - this.lang()._week.dow) % 7;
+ return input == null ? weekday : this.add("d", input - weekday);
+ },
+
+ isoWeekday : function (input) {
+ // behaves the same as moment#day except
+ // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6)
+ // as a setter, sunday should belong to the previous week.
+ return input == null ? this.day() || 7 : this.day(this.day() % 7 ? input : input - 7);
+ },
+
+ get : function (units) {
+ units = normalizeUnits(units);
+ return this[units]();
+ },
+
+ set : function (units, value) {
+ units = normalizeUnits(units);
+ if (typeof this[units] === 'function') {
+ this[units](value);
+ }
+ return this;
+ },
+
+ // If passed a language key, it will set the language for this
+ // instance. Otherwise, it will return the language configuration
+ // variables for this instance.
+ lang : function (key) {
+ if (key === undefined) {
+ return this._lang;
+ } else {
+ this._lang = getLangDefinition(key);
+ return this;
+ }
+ }
+ });
+
+ // helper for adding shortcuts
+ function makeGetterAndSetter(name, key) {
+ moment.fn[name] = moment.fn[name + 's'] = function (input) {
+ var utc = this._isUTC ? 'UTC' : '';
+ if (input != null) {
+ this._d['set' + utc + key](input);
+ moment.updateOffset(this);
+ return this;
+ } else {
+ return this._d['get' + utc + key]();
+ }
+ };
+ }
+
+ // loop through and add shortcuts (Month, Date, Hours, Minutes, Seconds, Milliseconds)
+ for (i = 0; i < proxyGettersAndSetters.length; i ++) {
+ makeGetterAndSetter(proxyGettersAndSetters[i].toLowerCase().replace(/s$/, ''), proxyGettersAndSetters[i]);
+ }
+
+ // add shortcut for year (uses different syntax than the getter/setter 'year' == 'FullYear')
+ makeGetterAndSetter('year', 'FullYear');
+
+ // add plural methods
+ moment.fn.days = moment.fn.day;
+ moment.fn.months = moment.fn.month;
+ moment.fn.weeks = moment.fn.week;
+ moment.fn.isoWeeks = moment.fn.isoWeek;
+
+ // add aliased format methods
+ moment.fn.toJSON = moment.fn.toISOString;
+
+ /************************************
+ Duration Prototype
+ ************************************/
+
+
+ extend(moment.duration.fn = Duration.prototype, {
+
+ _bubble : function () {
+ var milliseconds = this._milliseconds,
+ days = this._days,
+ months = this._months,
+ data = this._data,
+ seconds, minutes, hours, years;
+
+ // The following code bubbles up values, see the tests for
+ // examples of what that means.
+ data.milliseconds = milliseconds % 1000;
+
+ seconds = absRound(milliseconds / 1000);
+ data.seconds = seconds % 60;
+
+ minutes = absRound(seconds / 60);
+ data.minutes = minutes % 60;
+
+ hours = absRound(minutes / 60);
+ data.hours = hours % 24;
+
+ days += absRound(hours / 24);
+ data.days = days % 30;
+
+ months += absRound(days / 30);
+ data.months = months % 12;
+
+ years = absRound(months / 12);
+ data.years = years;
+ },
+
+ weeks : function () {
+ return absRound(this.days() / 7);
+ },
+
+ valueOf : function () {
+ return this._milliseconds +
+ this._days * 864e5 +
+ (this._months % 12) * 2592e6 +
+ toInt(this._months / 12) * 31536e6;
+ },
+
+ humanize : function (withSuffix) {
+ var difference = +this,
+ output = relativeTime(difference, !withSuffix, this.lang());
+
+ if (withSuffix) {
+ output = this.lang().pastFuture(difference, output);
+ }
+
+ return this.lang().postformat(output);
+ },
+
+ add : function (input, val) {
+ // supports only 2.0-style add(1, 's') or add(moment)
+ var dur = moment.duration(input, val);
+
+ this._milliseconds += dur._milliseconds;
+ this._days += dur._days;
+ this._months += dur._months;
+
+ this._bubble();
+
+ return this;
+ },
+
+ subtract : function (input, val) {
+ var dur = moment.duration(input, val);
+
+ this._milliseconds -= dur._milliseconds;
+ this._days -= dur._days;
+ this._months -= dur._months;
+
+ this._bubble();
+
+ return this;
+ },
+
+ get : function (units) {
+ units = normalizeUnits(units);
+ return this[units.toLowerCase() + 's']();
+ },
+
+ as : function (units) {
+ units = normalizeUnits(units);
+ return this['as' + units.charAt(0).toUpperCase() + units.slice(1) + 's']();
+ },
+
+ lang : moment.fn.lang,
+
+ toIsoString : function () {
+ // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js
+ var years = Math.abs(this.years()),
+ months = Math.abs(this.months()),
+ days = Math.abs(this.days()),
+ hours = Math.abs(this.hours()),
+ minutes = Math.abs(this.minutes()),
+ seconds = Math.abs(this.seconds() + this.milliseconds() / 1000);
+
+ if (!this.asSeconds()) {
+ // this is the same as C#'s (Noda) and python (isodate)...
+ // but not other JS (goog.date)
+ return 'P0D';
+ }
+
+ return (this.asSeconds() < 0 ? '-' : '') +
+ 'P' +
+ (years ? years + 'Y' : '') +
+ (months ? months + 'M' : '') +
+ (days ? days + 'D' : '') +
+ ((hours || minutes || seconds) ? 'T' : '') +
+ (hours ? hours + 'H' : '') +
+ (minutes ? minutes + 'M' : '') +
+ (seconds ? seconds + 'S' : '');
+ }
+ });
+
+ function makeDurationGetter(name) {
+ moment.duration.fn[name] = function () {
+ return this._data[name];
+ };
+ }
+
+ function makeDurationAsGetter(name, factor) {
+ moment.duration.fn['as' + name] = function () {
+ return +this / factor;
+ };
+ }
+
+ for (i in unitMillisecondFactors) {
+ if (unitMillisecondFactors.hasOwnProperty(i)) {
+ makeDurationAsGetter(i, unitMillisecondFactors[i]);
+ makeDurationGetter(i.toLowerCase());
+ }
+ }
+
+ makeDurationAsGetter('Weeks', 6048e5);
+ moment.duration.fn.asMonths = function () {
+ return (+this - this.years() * 31536e6) / 2592e6 + this.years() * 12;
+ };
+
+
+ /************************************
+ Default Lang
+ ************************************/
+
+
+ // Set default language, other languages will inherit from English.
+ moment.lang('en', {
+ ordinal : function (number) {
+ var b = number % 10,
+ output = (toInt(number % 100 / 10) === 1) ? 'th' :
+ (b === 1) ? 'st' :
+ (b === 2) ? 'nd' :
+ (b === 3) ? 'rd' : 'th';
+ return number + output;
+ }
+ });
+
+ // moment.js language configuration
+// language : Moroccan Arabic (ar-ma)
+// author : ElFadili Yassine : https://github.com/ElFadiliY
+// author : Abdel Said : https://github.com/abdelsaid
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ return moment.lang('ar-ma', {
+ months : "يناير_Ùبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),
+ monthsShort : "يناير_Ùبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),
+ weekdays : "الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),
+ weekdaysShort : "احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت".split("_"),
+ weekdaysMin : "ح_ن_ث_ر_خ_ج_س".split("_"),
+ longDateFormat : {
+ LT : "HH:mm",
+ L : "DD/MM/YYYY",
+ LL : "D MMMM YYYY",
+ LLL : "D MMMM YYYY LT",
+ LLLL : "dddd D MMMM YYYY LT"
+ },
+ 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 : "%d ساعات",
+ d : "يوم",
+ dd : "%d أيام",
+ M : "شهر",
+ MM : "%d أشهر",
+ y : "سنة",
+ yy : "%d سنوات"
+ },
+ week : {
+ dow : 6, // Saturday is the first day of the week.
+ doy : 12 // The week that contains Jan 1st is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : Arabic (ar)
+// author : Abdel Said : https://github.com/abdelsaid
+// changes in months, weekdays : Ahmed Elkhatib
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ return moment.lang('ar', {
+ months : "يناير/ كانون الثاني_Ùبراير/ شباط_مارس/ آذار_أبريل/ نيسان_مايو/ أيار_يونيو/ حزيران_يوليو/ تموز_أغسطس/ آب_سبتمبر/ أيلول_أكتوبر/ تشرين الأول_نوÙمبر/ تشرين الثاني_ديسمبر/ كانون الأول".split("_"),
+ monthsShort : "يناير/ كانون الثاني_Ùبراير/ شباط_مارس/ آذار_أبريل/ نيسان_مايو/ أيار_يونيو/ حزيران_يوليو/ تموز_أغسطس/ آب_سبتمبر/ أيلول_أكتوبر/ تشرين الأول_نوÙمبر/ تشرين الثاني_ديسمبر/ كانون الأول".split("_"),
+ weekdays : "الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),
+ weekdaysShort : "الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),
+ weekdaysMin : "ح_ن_ث_ر_خ_ج_س".split("_"),
+ longDateFormat : {
+ LT : "HH:mm",
+ L : "DD/MM/YYYY",
+ LL : "D MMMM YYYY",
+ LLL : "D MMMM YYYY LT",
+ LLLL : "dddd D MMMM YYYY LT"
+ },
+ 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 : "%d ساعات",
+ d : "يوم",
+ dd : "%d أيام",
+ M : "شهر",
+ MM : "%d أشهر",
+ y : "سنة",
+ yy : "%d سنوات"
+ },
+ week : {
+ dow : 6, // Saturday is the first day of the week.
+ doy : 12 // The week that contains Jan 1st is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : bulgarian (bg)
+// author : Krasen Borisov : https://github.com/kraz
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ return moment.lang('bg', {
+ months : "Ñнуари_февруари_март_април_май_юни_юли_авгуÑÑ‚_Ñептември_октомври_ноември_декември".split("_"),
+ monthsShort : "Ñнр_фев_мар_апр_май_юни_юли_авг_Ñеп_окт_ное_дек".split("_"),
+ weekdays : "неделÑ_понеделник_вторник_ÑÑ€Ñда_четвъртък_петък_Ñъбота".split("_"),
+ weekdaysShort : "нед_пон_вто_ÑÑ€Ñ_чет_пет_Ñъб".split("_"),
+ weekdaysMin : "нд_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"),
+ longDateFormat : {
+ LT : "H:mm",
+ L : "D.MM.YYYY",
+ LL : "D MMMM YYYY",
+ LLL : "D MMMM YYYY LT",
+ LLLL : "dddd, D MMMM YYYY LT"
+ },
+ calendar : {
+ sameDay : '[Ð”Ð½ÐµÑ Ð²] LT',
+ nextDay : '[Утре в] LT',
+ nextWeek : 'dddd [в] LT',
+ lastDay : '[Вчера в] LT',
+ lastWeek : function () {
+ switch (this.day()) {
+ case 0:
+ case 3:
+ case 6:
+ return '[В изминалата] dddd [в] LT';
+ case 1:
+ case 2:
+ case 4:
+ case 5:
+ return '[Ð’ изминалиÑ] dddd [в] LT';
+ }
+ },
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : "Ñлед %s",
+ past : "преди %s",
+ s : "нÑколко Ñекунди",
+ m : "минута",
+ mm : "%d минути",
+ h : "чаÑ",
+ hh : "%d чаÑа",
+ d : "ден",
+ dd : "%d дни",
+ M : "меÑец",
+ MM : "%d меÑеца",
+ y : "година",
+ yy : "%d години"
+ },
+ ordinal : function (number) {
+ var lastDigit = number % 10,
+ last2Digits = number % 100;
+ if (number === 0) {
+ return number + '-ев';
+ } else if (last2Digits === 0) {
+ return number + '-ен';
+ } else if (last2Digits > 10 && last2Digits < 20) {
+ return number + '-ти';
+ } else if (lastDigit === 1) {
+ return number + '-ви';
+ } else if (lastDigit === 2) {
+ return number + '-ри';
+ } else if (lastDigit === 7 || lastDigit === 8) {
+ return number + '-ми';
+ } else {
+ return number + '-ти';
+ }
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : breton (br)
+// author : Jean-Baptiste Le Duigou : https://github.com/jbleduigou
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ function relativeTimeWithMutation(number, withoutSuffix, key) {
+ var format = {
+ 'mm': "munutenn",
+ 'MM': "miz",
+ 'dd': "devezh"
+ };
+ return number + ' ' + mutation(format[key], number);
+ }
+
+ function specialMutationForYears(number) {
+ switch (lastNumber(number)) {
+ case 1:
+ case 3:
+ case 4:
+ case 5:
+ case 9:
+ return number + ' bloaz';
+ default:
+ return number + ' vloaz';
+ }
+ }
+
+ function lastNumber(number) {
+ if (number > 9) {
+ return lastNumber(number % 10);
+ }
+ return number;
+ }
+
+ function mutation(text, number) {
+ if (number === 2) {
+ return softMutation(text);
+ }
+ return text;
+ }
+
+ function softMutation(text) {
+ var mutationTable = {
+ 'm': 'v',
+ 'b': 'v',
+ 'd': 'z'
+ };
+ if (mutationTable[text.charAt(0)] === undefined) {
+ return text;
+ }
+ return mutationTable[text.charAt(0)] + text.substring(1);
+ }
+
+ return moment.lang('br', {
+ months : "Genver_C'hwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu".split("_"),
+ monthsShort : "Gen_C'hwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker".split("_"),
+ weekdays : "Sul_Lun_Meurzh_Merc'her_Yaou_Gwener_Sadorn".split("_"),
+ weekdaysShort : "Sul_Lun_Meu_Mer_Yao_Gwe_Sad".split("_"),
+ weekdaysMin : "Su_Lu_Me_Mer_Ya_Gw_Sa".split("_"),
+ longDateFormat : {
+ LT : "h[e]mm A",
+ L : "DD/MM/YYYY",
+ LL : "D [a viz] MMMM YYYY",
+ LLL : "D [a viz] MMMM YYYY LT",
+ LLLL : "dddd, D [a viz] MMMM YYYY LT"
+ },
+ calendar : {
+ sameDay : '[Hiziv da] LT',
+ nextDay : '[Warc\'hoazh da] LT',
+ nextWeek : 'dddd [da] LT',
+ lastDay : '[Dec\'h da] LT',
+ lastWeek : 'dddd [paset da] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : "a-benn %s",
+ past : "%s 'zo",
+ s : "un nebeud segondennoù",
+ m : "ur vunutenn",
+ mm : relativeTimeWithMutation,
+ h : "un eur",
+ hh : "%d eur",
+ d : "un devezh",
+ dd : relativeTimeWithMutation,
+ M : "ur miz",
+ MM : relativeTimeWithMutation,
+ y : "ur bloaz",
+ yy : specialMutationForYears
+ },
+ ordinal : function (number) {
+ var output = (number === 1) ? 'añ' : 'vet';
+ return number + output;
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : bosnian (bs)
+// author : Nedim Cholich : https://github.com/frontyard
+// based on (hr) translation by Bojan Marković
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+
+ function translate(number, withoutSuffix, key) {
+ var result = number + " ";
+ switch (key) {
+ case 'm':
+ return withoutSuffix ? 'jedna minuta' : 'jedne minute';
+ case 'mm':
+ if (number === 1) {
+ result += 'minuta';
+ } else if (number === 2 || number === 3 || number === 4) {
+ result += 'minute';
+ } else {
+ result += 'minuta';
+ }
+ return result;
+ case 'h':
+ return withoutSuffix ? 'jedan sat' : 'jednog sata';
+ case 'hh':
+ if (number === 1) {
+ result += 'sat';
+ } else if (number === 2 || number === 3 || number === 4) {
+ result += 'sata';
+ } else {
+ result += 'sati';
+ }
+ return result;
+ case 'dd':
+ if (number === 1) {
+ result += 'dan';
+ } else {
+ result += 'dana';
+ }
+ return result;
+ case 'MM':
+ if (number === 1) {
+ result += 'mjesec';
+ } else if (number === 2 || number === 3 || number === 4) {
+ result += 'mjeseca';
+ } else {
+ result += 'mjeseci';
+ }
+ return result;
+ case 'yy':
+ if (number === 1) {
+ result += 'godina';
+ } else if (number === 2 || number === 3 || number === 4) {
+ result += 'godine';
+ } else {
+ result += 'godina';
+ }
+ return result;
+ }
+ }
+
+ return moment.lang('bs', {
+ months : "januar_februar_mart_april_maj_juni_juli_avgust_septembar_oktobar_novembar_decembar".split("_"),
+ monthsShort : "jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.".split("_"),
+ weekdays : "nedjelja_ponedjeljak_utorak_srijeda_Äetvrtak_petak_subota".split("_"),
+ weekdaysShort : "ned._pon._uto._sri._Äet._pet._sub.".split("_"),
+ weekdaysMin : "ne_po_ut_sr_Äe_pe_su".split("_"),
+ longDateFormat : {
+ LT : "H:mm",
+ L : "DD. MM. YYYY",
+ LL : "D. MMMM YYYY",
+ LLL : "D. MMMM YYYY LT",
+ LLLL : "dddd, D. MMMM YYYY LT"
+ },
+ calendar : {
+ sameDay : '[danas u] LT',
+ nextDay : '[sutra u] LT',
+
+ nextWeek : function () {
+ switch (this.day()) {
+ case 0:
+ return '[u] [nedjelju] [u] LT';
+ case 3:
+ return '[u] [srijedu] [u] LT';
+ case 6:
+ return '[u] [subotu] [u] LT';
+ case 1:
+ case 2:
+ case 4:
+ case 5:
+ return '[u] dddd [u] LT';
+ }
+ },
+ lastDay : '[juÄer u] LT',
+ lastWeek : function () {
+ switch (this.day()) {
+ case 0:
+ case 3:
+ return '[prošlu] dddd [u] LT';
+ case 6:
+ return '[prošle] [subote] [u] LT';
+ case 1:
+ case 2:
+ case 4:
+ case 5:
+ return '[prošli] dddd [u] LT';
+ }
+ },
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : "za %s",
+ past : "prije %s",
+ s : "par sekundi",
+ m : translate,
+ mm : translate,
+ h : translate,
+ hh : translate,
+ d : "dan",
+ dd : translate,
+ M : "mjesec",
+ MM : translate,
+ y : "godinu",
+ yy : translate
+ },
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : catalan (ca)
+// author : Juan G. Hurtado : https://github.com/juanghurtado
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ return moment.lang('ca', {
+ months : "Gener_Febrer_Març_Abril_Maig_Juny_Juliol_Agost_Setembre_Octubre_Novembre_Desembre".split("_"),
+ monthsShort : "Gen._Febr._Mar._Abr._Mai._Jun._Jul._Ag._Set._Oct._Nov._Des.".split("_"),
+ weekdays : "Diumenge_Dilluns_Dimarts_Dimecres_Dijous_Divendres_Dissabte".split("_"),
+ weekdaysShort : "Dg._Dl._Dt._Dc._Dj._Dv._Ds.".split("_"),
+ weekdaysMin : "Dg_Dl_Dt_Dc_Dj_Dv_Ds".split("_"),
+ longDateFormat : {
+ LT : "H:mm",
+ L : "DD/MM/YYYY",
+ LL : "D MMMM YYYY",
+ LLL : "D MMMM YYYY LT",
+ LLLL : "dddd D MMMM YYYY LT"
+ },
+ calendar : {
+ sameDay : function () {
+ return '[avui a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT';
+ },
+ nextDay : function () {
+ return '[demà a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT';
+ },
+ nextWeek : function () {
+ return 'dddd [a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT';
+ },
+ lastDay : function () {
+ return '[ahir a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT';
+ },
+ lastWeek : function () {
+ return '[el] dddd [passat a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT';
+ },
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : "en %s",
+ past : "fa %s",
+ s : "uns segons",
+ m : "un minut",
+ mm : "%d minuts",
+ h : "una hora",
+ hh : "%d hores",
+ d : "un dia",
+ dd : "%d dies",
+ M : "un mes",
+ MM : "%d mesos",
+ y : "un any",
+ yy : "%d anys"
+ },
+ ordinal : '%dº',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : czech (cs)
+// author : petrbela : https://github.com/petrbela
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ var months = "leden_únor_bÅ™ezen_duben_kvÄ›ten_Äerven_Äervenec_srpen_září_říjen_listopad_prosinec".split("_"),
+ monthsShort = "led_úno_bÅ™e_dub_kvÄ›_Ävn_Ävc_srp_zář_říj_lis_pro".split("_");
+
+ function plural(n) {
+ return (n > 1) && (n < 5) && (~~(n / 10) !== 1);
+ }
+
+ function translate(number, withoutSuffix, key, isFuture) {
+ var result = number + " ";
+ switch (key) {
+ case 's': // a few seconds / in a few seconds / a few seconds ago
+ return (withoutSuffix || isFuture) ? 'pár vteřin' : 'pár vteřinami';
+ case 'm': // a minute / in a minute / a minute ago
+ return withoutSuffix ? 'minuta' : (isFuture ? 'minutu' : 'minutou');
+ case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago
+ if (withoutSuffix || isFuture) {
+ return result + (plural(number) ? 'minuty' : 'minut');
+ } else {
+ return result + 'minutami';
+ }
+ break;
+ case 'h': // an hour / in an hour / an hour ago
+ return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou');
+ case 'hh': // 9 hours / in 9 hours / 9 hours ago
+ if (withoutSuffix || isFuture) {
+ return result + (plural(number) ? 'hodiny' : 'hodin');
+ } else {
+ return result + 'hodinami';
+ }
+ break;
+ case 'd': // a day / in a day / a day ago
+ return (withoutSuffix || isFuture) ? 'den' : 'dnem';
+ case 'dd': // 9 days / in 9 days / 9 days ago
+ if (withoutSuffix || isFuture) {
+ return result + (plural(number) ? 'dny' : 'dní');
+ } else {
+ return result + 'dny';
+ }
+ break;
+ case 'M': // a month / in a month / a month ago
+ return (withoutSuffix || isFuture) ? 'měsíc' : 'měsícem';
+ case 'MM': // 9 months / in 9 months / 9 months ago
+ if (withoutSuffix || isFuture) {
+ return result + (plural(number) ? 'měsíce' : 'měsíců');
+ } else {
+ return result + 'měsíci';
+ }
+ break;
+ case 'y': // a year / in a year / a year ago
+ return (withoutSuffix || isFuture) ? 'rok' : 'rokem';
+ case 'yy': // 9 years / in 9 years / 9 years ago
+ if (withoutSuffix || isFuture) {
+ return result + (plural(number) ? 'roky' : 'let');
+ } else {
+ return result + 'lety';
+ }
+ break;
+ }
+ }
+
+ return moment.lang('cs', {
+ months : months,
+ monthsShort : monthsShort,
+ monthsParse : (function (months, monthsShort) {
+ var i, _monthsParse = [];
+ for (i = 0; i < 12; i++) {
+ // use custom parser to solve problem with July (Äervenec)
+ _monthsParse[i] = new RegExp('^' + months[i] + '$|^' + monthsShort[i] + '$', 'i');
+ }
+ return _monthsParse;
+ }(months, monthsShort)),
+ weekdays : "nedÄ›le_pondÄ›lí_úterý_stÅ™eda_Ätvrtek_pátek_sobota".split("_"),
+ weekdaysShort : "ne_po_út_st_Ät_pá_so".split("_"),
+ weekdaysMin : "ne_po_út_st_Ät_pá_so".split("_"),
+ longDateFormat : {
+ LT: "H:mm",
+ L : "DD.MM.YYYY",
+ LL : "D. MMMM YYYY",
+ LLL : "D. MMMM YYYY LT",
+ LLLL : "dddd D. MMMM YYYY LT"
+ },
+ calendar : {
+ sameDay: "[dnes v] LT",
+ nextDay: '[zítra v] LT',
+ nextWeek: function () {
+ switch (this.day()) {
+ case 0:
+ return '[v neděli v] LT';
+ case 1:
+ case 2:
+ return '[v] dddd [v] LT';
+ case 3:
+ return '[ve středu v] LT';
+ case 4:
+ return '[ve Ätvrtek v] LT';
+ case 5:
+ return '[v pátek v] LT';
+ case 6:
+ return '[v sobotu v] LT';
+ }
+ },
+ lastDay: '[vÄera v] LT',
+ lastWeek: function () {
+ switch (this.day()) {
+ case 0:
+ return '[minulou neděli v] LT';
+ case 1:
+ case 2:
+ return '[minulé] dddd [v] LT';
+ case 3:
+ return '[minulou středu v] LT';
+ case 4:
+ case 5:
+ return '[minulý] dddd [v] LT';
+ case 6:
+ return '[minulou sobotu v] LT';
+ }
+ },
+ sameElse: "L"
+ },
+ relativeTime : {
+ future : "za %s",
+ past : "před %s",
+ s : translate,
+ m : translate,
+ mm : translate,
+ h : translate,
+ hh : translate,
+ d : translate,
+ dd : translate,
+ M : translate,
+ MM : translate,
+ y : translate,
+ yy : translate
+ },
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : chuvash (cv)
+// author : Anatoly Mironov : https://github.com/mirontoli
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ return moment.lang('cv', {
+ months : "кăрлач_нарăÑ_пуш_ака_май_çĕртме_утă_çурла_авăн_юпа_чӳк_раштав".split("_"),
+ monthsShort : "кăр_нар_пуш_ака_май_çĕр_утă_çур_ав_юпа_чӳк_раш".split("_"),
+ weekdays : "вырÑарникун_тунтикун_ытларикун_юнкун_кĕçнерникун_Ñрнекун_шăматкун".split("_"),
+ weekdaysShort : "выр_тун_ытл_юн_кĕç_Ñрн_шăм".split("_"),
+ weekdaysMin : "вр_тн_Ñ‹Ñ‚_юн_кç_ÑÑ€_шм".split("_"),
+ longDateFormat : {
+ LT : "HH:mm",
+ L : "DD-MM-YYYY",
+ LL : "YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ]",
+ LLL : "YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ], LT",
+ LLLL : "dddd, YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ], LT"
+ },
+ calendar : {
+ sameDay: '[ПаÑн] LT [Ñехетре]',
+ nextDay: '[Ыран] LT [Ñехетре]',
+ lastDay: '[Ĕнер] LT [Ñехетре]',
+ nextWeek: '[ÇитеÑ] dddd LT [Ñехетре]',
+ lastWeek: '[Иртнĕ] dddd LT [Ñехетре]',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : function (output) {
+ var affix = /Ñехет$/i.exec(output) ? "рен" : /çул$/i.exec(output) ? "тан" : "ран";
+ return output + affix;
+ },
+ past : "%s каÑлла",
+ s : "пĕр-ик çеккунт",
+ m : "пĕр минут",
+ mm : "%d минут",
+ h : "пĕр Ñехет",
+ hh : "%d Ñехет",
+ d : "пĕр кун",
+ dd : "%d кун",
+ M : "пĕр уйăх",
+ MM : "%d уйăх",
+ y : "пĕр çул",
+ yy : "%d çул"
+ },
+ ordinal : '%d-мĕш',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : Welsh (cy)
+// author : Robert Allen
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ return moment.lang("cy", {
+ months: "Ionawr_Chwefror_Mawrth_Ebrill_Mai_Mehefin_Gorffennaf_Awst_Medi_Hydref_Tachwedd_Rhagfyr".split("_"),
+ monthsShort: "Ion_Chwe_Maw_Ebr_Mai_Meh_Gor_Aws_Med_Hyd_Tach_Rhag".split("_"),
+ weekdays: "Dydd Sul_Dydd Llun_Dydd Mawrth_Dydd Mercher_Dydd Iau_Dydd Gwener_Dydd Sadwrn".split("_"),
+ weekdaysShort: "Sul_Llun_Maw_Mer_Iau_Gwe_Sad".split("_"),
+ weekdaysMin: "Su_Ll_Ma_Me_Ia_Gw_Sa".split("_"),
+ // time formats are the same as en-gb
+ longDateFormat: {
+ LT: "HH:mm",
+ L: "DD/MM/YYYY",
+ LL: "D MMMM YYYY",
+ LLL: "D MMMM YYYY LT",
+ LLLL: "dddd, D MMMM YYYY LT"
+ },
+ calendar: {
+ sameDay: '[Heddiw am] LT',
+ nextDay: '[Yfory am] LT',
+ nextWeek: 'dddd [am] LT',
+ lastDay: '[Ddoe am] LT',
+ lastWeek: 'dddd [diwethaf am] LT',
+ sameElse: 'L'
+ },
+ relativeTime: {
+ future: "mewn %s",
+ past: "%s yn &#244;l",
+ s: "ychydig eiliadau",
+ m: "munud",
+ mm: "%d munud",
+ h: "awr",
+ hh: "%d awr",
+ d: "diwrnod",
+ dd: "%d diwrnod",
+ M: "mis",
+ MM: "%d mis",
+ y: "blwyddyn",
+ yy: "%d flynedd"
+ },
+ // traditional ordinal numbers above 31 are not commonly used in colloquial Welsh
+ ordinal: function (number) {
+ var b = number,
+ output = '',
+ lookup = [
+ '', 'af', 'il', 'ydd', 'ydd', 'ed', 'ed', 'ed', 'fed', 'fed', 'fed', // 1af to 10fed
+ 'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'fed' // 11eg to 20fed
+ ];
+
+ if (b > 20) {
+ if (b === 40 || b === 50 || b === 60 || b === 80 || b === 100) {
+ output = 'fed'; // not 30ain, 70ain or 90ain
+ } else {
+ output = 'ain';
+ }
+ } else if (b > 0) {
+ output = lookup[b];
+ }
+
+ return number + output;
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : danish (da)
+// author : Ulrik Nielsen : https://github.com/mrbase
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ return moment.lang('da', {
+ months : "januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december".split("_"),
+ monthsShort : "jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),
+ weekdays : "søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag".split("_"),
+ weekdaysShort : "søn_man_tir_ons_tor_fre_lør".split("_"),
+ weekdaysMin : "sø_ma_ti_on_to_fr_lø".split("_"),
+ longDateFormat : {
+ LT : "HH:mm",
+ L : "DD/MM/YYYY",
+ LL : "D MMMM YYYY",
+ LLL : "D MMMM YYYY LT",
+ LLLL : "dddd D. MMMM, YYYY LT"
+ },
+ calendar : {
+ sameDay : '[I dag kl.] LT',
+ nextDay : '[I morgen kl.] LT',
+ nextWeek : 'dddd [kl.] LT',
+ lastDay : '[I går kl.] LT',
+ lastWeek : '[sidste] dddd [kl] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : "om %s",
+ past : "%s siden",
+ s : "få sekunder",
+ m : "et minut",
+ mm : "%d minutter",
+ h : "en time",
+ hh : "%d timer",
+ d : "en dag",
+ dd : "%d dage",
+ M : "en måned",
+ MM : "%d måneder",
+ y : "et år",
+ yy : "%d år"
+ },
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : german (de)
+// author : lluchs : https://github.com/lluchs
+// author: Menelion Elensúle: https://github.com/Oire
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ function processRelativeTime(number, withoutSuffix, key, isFuture) {
+ var format = {
+ 'm': ['eine Minute', 'einer Minute'],
+ 'h': ['eine Stunde', 'einer Stunde'],
+ 'd': ['ein Tag', 'einem Tag'],
+ 'dd': [number + ' Tage', number + ' Tagen'],
+ 'M': ['ein Monat', 'einem Monat'],
+ 'MM': [number + ' Monate', number + ' Monaten'],
+ 'y': ['ein Jahr', 'einem Jahr'],
+ 'yy': [number + ' Jahre', number + ' Jahren']
+ };
+ return withoutSuffix ? format[key][0] : format[key][1];
+ }
+
+ return moment.lang('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: "H:mm [Uhr]",
+ L : "DD.MM.YYYY",
+ LL : "D. MMMM YYYY",
+ LLL : "D. MMMM YYYY LT",
+ LLLL : "dddd, D. MMMM YYYY LT"
+ },
+ calendar : {
+ sameDay: "[Heute um] LT",
+ sameElse: "L",
+ nextDay: '[Morgen um] LT',
+ nextWeek: 'dddd [um] LT',
+ lastDay: '[Gestern um] LT',
+ lastWeek: '[letzten] dddd [um] LT'
+ },
+ relativeTime : {
+ future : "in %s",
+ past : "vor %s",
+ s : "ein paar Sekunden",
+ m : processRelativeTime,
+ mm : "%d Minuten",
+ h : processRelativeTime,
+ hh : "%d Stunden",
+ d : processRelativeTime,
+ dd : processRelativeTime,
+ M : processRelativeTime,
+ MM : processRelativeTime,
+ y : processRelativeTime,
+ yy : processRelativeTime
+ },
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : modern greek (el)
+// author : Aggelos Karalias : https://github.com/mehiel
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ return moment.lang('el', {
+ monthsNominativeEl : "ΙανουάÏιος_ΦεβÏουάÏιος_ΜάÏτιος_ΑπÏίλιος_Μάιος_ΙοÏνιος_ΙοÏλιος_ΑÏγουστος_ΣεπτέμβÏιος_ΟκτώβÏιος_ÎοέμβÏιος_ΔεκέμβÏιος".split("_"),
+ monthsGenitiveEl : "ΙανουαÏίου_ΦεβÏουαÏίου_ΜαÏτίου_ΑπÏιλίου_ΜαÎου_Ιουνίου_Ιουλίου_ΑυγοÏστου_ΣεπτεμβÏίου_ΟκτωβÏίου_ÎοεμβÏίου_ΔεκεμβÏίου".split("_"),
+ months : function (momentToFormat, format) {
+ if (/D/.test(format.substring(0, format.indexOf("MMMM")))) { // if there is a day number before 'MMMM'
+ return this._monthsGenitiveEl[momentToFormat.month()];
+ } else {
+ return this._monthsNominativeEl[momentToFormat.month()];
+ }
+ },
+ monthsShort : "Ιαν_Φεβ_ΜαÏ_ΑπÏ_Μαϊ_Ιουν_Ιουλ_Αυγ_Σεπ_Οκτ_Îοε_Δεκ".split("_"),
+ weekdays : "ΚυÏιακή_ΔευτέÏα_ΤÏίτη_ΤετάÏτη_Πέμπτη_ΠαÏασκευή_Σάββατο".split("_"),
+ weekdaysShort : "ΚυÏ_Δευ_ΤÏι_Τετ_Πεμ_ΠαÏ_Σαβ".split("_"),
+ weekdaysMin : "Κυ_Δε_ΤÏ_Τε_Πε_Πα_Σα".split("_"),
+ meridiem : function (hours, minutes, isLower) {
+ if (hours > 11) {
+ return isLower ? 'μμ' : 'ΜΜ';
+ } else {
+ return isLower ? 'πμ' : 'ΠΜ';
+ }
+ },
+ longDateFormat : {
+ LT : "h:mm A",
+ L : "DD/MM/YYYY",
+ LL : "D MMMM YYYY",
+ LLL : "D MMMM YYYY LT",
+ LLLL : "dddd, D MMMM YYYY LT"
+ },
+ calendarEl : {
+ sameDay : '[ΣήμεÏα {}] LT',
+ nextDay : '[ΑÏÏιο {}] LT',
+ nextWeek : 'dddd [{}] LT',
+ lastDay : '[Χθες {}] LT',
+ lastWeek : '[την Ï€ÏοηγοÏμενη] dddd [{}] LT',
+ sameElse : 'L'
+ },
+ calendar : function (key, mom) {
+ var output = this._calendarEl[key],
+ hours = mom && mom.hours();
+
+ return output.replace("{}", (hours % 12 === 1 ? "στη" : "στις"));
+ },
+ relativeTime : {
+ future : "σε %s",
+ past : "%s Ï€Ïιν",
+ s : "δευτεÏόλεπτα",
+ m : "ένα λεπτό",
+ mm : "%d λεπτά",
+ h : "μία ÏŽÏα",
+ hh : "%d ÏŽÏες",
+ d : "μία μέÏα",
+ dd : "%d μέÏες",
+ M : "ένας μήνας",
+ MM : "%d μήνες",
+ y : "ένας χÏόνος",
+ yy : "%d χÏόνια"
+ },
+ ordinal : function (number) {
+ return number + 'η';
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4st is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : australian english (en-au)
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ return moment.lang('en-au', {
+ months : "January_February_March_April_May_June_July_August_September_October_November_December".split("_"),
+ monthsShort : "Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),
+ weekdays : "Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),
+ weekdaysShort : "Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),
+ weekdaysMin : "Su_Mo_Tu_We_Th_Fr_Sa".split("_"),
+ longDateFormat : {
+ LT : "h:mm A",
+ L : "DD/MM/YYYY",
+ LL : "D MMMM YYYY",
+ LLL : "D MMMM YYYY LT",
+ LLLL : "dddd, D MMMM YYYY LT"
+ },
+ calendar : {
+ sameDay : '[Today at] LT',
+ nextDay : '[Tomorrow at] LT',
+ nextWeek : 'dddd [at] LT',
+ lastDay : '[Yesterday at] LT',
+ lastWeek : '[Last] dddd [at] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ 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"
+ },
+ ordinal : function (number) {
+ var b = number % 10,
+ output = (~~ (number % 100 / 10) === 1) ? 'th' :
+ (b === 1) ? 'st' :
+ (b === 2) ? 'nd' :
+ (b === 3) ? 'rd' : 'th';
+ return number + output;
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : canadian english (en-ca)
+// author : Jonathan Abourbih : https://github.com/jonbca
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ return moment.lang('en-ca', {
+ months : "January_February_March_April_May_June_July_August_September_October_November_December".split("_"),
+ monthsShort : "Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),
+ weekdays : "Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),
+ weekdaysShort : "Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),
+ weekdaysMin : "Su_Mo_Tu_We_Th_Fr_Sa".split("_"),
+ longDateFormat : {
+ LT : "h:mm A",
+ L : "YYYY-MM-DD",
+ LL : "D MMMM, YYYY",
+ LLL : "D MMMM, YYYY LT",
+ LLLL : "dddd, D MMMM, YYYY LT"
+ },
+ calendar : {
+ sameDay : '[Today at] LT',
+ nextDay : '[Tomorrow at] LT',
+ nextWeek : 'dddd [at] LT',
+ lastDay : '[Yesterday at] LT',
+ lastWeek : '[Last] dddd [at] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ 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"
+ },
+ ordinal : function (number) {
+ var b = number % 10,
+ output = (~~ (number % 100 / 10) === 1) ? 'th' :
+ (b === 1) ? 'st' :
+ (b === 2) ? 'nd' :
+ (b === 3) ? 'rd' : 'th';
+ return number + output;
+ }
+ });
+}));
+// moment.js language configuration
+// language : great britain english (en-gb)
+// author : Chris Gedrim : https://github.com/chrisgedrim
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ return moment.lang('en-gb', {
+ months : "January_February_March_April_May_June_July_August_September_October_November_December".split("_"),
+ monthsShort : "Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),
+ weekdays : "Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),
+ weekdaysShort : "Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),
+ weekdaysMin : "Su_Mo_Tu_We_Th_Fr_Sa".split("_"),
+ longDateFormat : {
+ LT : "HH:mm",
+ L : "DD/MM/YYYY",
+ LL : "D MMMM YYYY",
+ LLL : "D MMMM YYYY LT",
+ LLLL : "dddd, D MMMM YYYY LT"
+ },
+ calendar : {
+ sameDay : '[Today at] LT',
+ nextDay : '[Tomorrow at] LT',
+ nextWeek : 'dddd [at] LT',
+ lastDay : '[Yesterday at] LT',
+ lastWeek : '[Last] dddd [at] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ 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"
+ },
+ ordinal : function (number) {
+ var b = number % 10,
+ output = (~~ (number % 100 / 10) === 1) ? 'th' :
+ (b === 1) ? 'st' :
+ (b === 2) ? 'nd' :
+ (b === 3) ? 'rd' : 'th';
+ return number + output;
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : esperanto (eo)
+// author : Colin Dean : https://github.com/colindean
+// komento: Mi estas malcerta se mi korekte traktis akuzativojn en tiu traduko.
+// Se ne, bonvolu korekti kaj avizi min por ke mi povas lerni!
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ return moment.lang('eo', {
+ months : "januaro_februaro_marto_aprilo_majo_junio_julio_aÅ­gusto_septembro_oktobro_novembro_decembro".split("_"),
+ monthsShort : "jan_feb_mar_apr_maj_jun_jul_aÅ­g_sep_okt_nov_dec".split("_"),
+ weekdays : "Dimanĉo_Lundo_Mardo_Merkredo_Ĵaŭdo_Vendredo_Sabato".split("_"),
+ weekdaysShort : "Dim_Lun_Mard_Merk_Ä´aÅ­_Ven_Sab".split("_"),
+ weekdaysMin : "Di_Lu_Ma_Me_Ä´a_Ve_Sa".split("_"),
+ longDateFormat : {
+ LT : "HH:mm",
+ L : "YYYY-MM-DD",
+ LL : "D[-an de] MMMM, YYYY",
+ LLL : "D[-an de] MMMM, YYYY LT",
+ LLLL : "dddd, [la] D[-an de] MMMM, YYYY LT"
+ },
+ meridiem : function (hours, minutes, isLower) {
+ if (hours > 11) {
+ return isLower ? 'p.t.m.' : 'P.T.M.';
+ } else {
+ return isLower ? 'a.t.m.' : 'A.T.M.';
+ }
+ },
+ calendar : {
+ sameDay : '[HodiaÅ­ je] LT',
+ nextDay : '[MorgaÅ­ je] LT',
+ nextWeek : 'dddd [je] LT',
+ lastDay : '[HieraÅ­ je] LT',
+ lastWeek : '[pasinta] dddd [je] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : "je %s",
+ past : "antaÅ­ %s",
+ s : "sekundoj",
+ m : "minuto",
+ mm : "%d minutoj",
+ h : "horo",
+ hh : "%d horoj",
+ d : "tago",//ne 'diurno', ĉar estas uzita por proksimumo
+ dd : "%d tagoj",
+ M : "monato",
+ MM : "%d monatoj",
+ y : "jaro",
+ yy : "%d jaroj"
+ },
+ ordinal : "%da",
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : spanish (es)
+// author : Julio Napurí : https://github.com/julionc
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ return moment.lang('es', {
+ months : "enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),
+ monthsShort : "ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),
+ 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",
+ L : "DD/MM/YYYY",
+ LL : "D [de] MMMM [de] YYYY",
+ LLL : "D [de] MMMM [de] YYYY LT",
+ LLLL : "dddd, D [de] MMMM [de] YYYY LT"
+ },
+ 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"
+ },
+ ordinal : '%dº',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : estonian (et)
+// author : Henry Kehlmann : https://github.com/madhenry
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ function translateSeconds(number, withoutSuffix, key, isFuture) {
+ return (isFuture || withoutSuffix) ? 'paari sekundi' : 'paar sekundit';
+ }
+
+ return moment.lang('et', {
+ months : "jaanuar_veebruar_märts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember".split("_"),
+ monthsShort : "jaan_veebr_märts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets".split("_"),
+ weekdays : "pühapäev_esmaspäev_teisipäev_kolmapäev_neljapäev_reede_laupäev".split("_"),
+ weekdaysShort : "P_E_T_K_N_R_L".split("_"),
+ weekdaysMin : "P_E_T_K_N_R_L".split("_"),
+ longDateFormat : {
+ LT : "H:mm",
+ L : "DD.MM.YYYY",
+ LL : "D. MMMM YYYY",
+ LLL : "D. MMMM YYYY LT",
+ LLLL : "dddd, D. MMMM YYYY LT"
+ },
+ calendar : {
+ sameDay : '[Täna,] LT',
+ nextDay : '[Homme,] LT',
+ nextWeek : '[Järgmine] dddd LT',
+ lastDay : '[Eile,] LT',
+ lastWeek : '[Eelmine] dddd LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : "%s pärast",
+ past : "%s tagasi",
+ s : translateSeconds,
+ m : "minut",
+ mm : "%d minutit",
+ h : "tund",
+ hh : "%d tundi",
+ d : "päev",
+ dd : "%d päeva",
+ M : "kuu",
+ MM : "%d kuud",
+ y : "aasta",
+ yy : "%d aastat"
+ },
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : euskara (eu)
+// author : Eneko Illarramendi : https://github.com/eillarra
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ return moment.lang('eu', {
+ months : "urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua".split("_"),
+ monthsShort : "urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.".split("_"),
+ weekdays : "igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata".split("_"),
+ weekdaysShort : "ig._al._ar._az._og._ol._lr.".split("_"),
+ weekdaysMin : "ig_al_ar_az_og_ol_lr".split("_"),
+ longDateFormat : {
+ LT : "HH:mm",
+ L : "YYYY-MM-DD",
+ LL : "YYYY[ko] MMMM[ren] D[a]",
+ LLL : "YYYY[ko] MMMM[ren] D[a] LT",
+ LLLL : "dddd, YYYY[ko] MMMM[ren] D[a] LT",
+ l : "YYYY-M-D",
+ ll : "YYYY[ko] MMM D[a]",
+ lll : "YYYY[ko] MMM D[a] LT",
+ llll : "ddd, YYYY[ko] MMM D[a] LT"
+ },
+ calendar : {
+ sameDay : '[gaur] LT[etan]',
+ nextDay : '[bihar] LT[etan]',
+ nextWeek : 'dddd LT[etan]',
+ lastDay : '[atzo] LT[etan]',
+ lastWeek : '[aurreko] dddd LT[etan]',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : "%s barru",
+ past : "duela %s",
+ s : "segundo batzuk",
+ m : "minutu bat",
+ mm : "%d minutu",
+ h : "ordu bat",
+ hh : "%d ordu",
+ d : "egun bat",
+ dd : "%d egun",
+ M : "hilabete bat",
+ MM : "%d hilabete",
+ y : "urte bat",
+ yy : "%d urte"
+ },
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : Persian Language
+// author : Ebrahim Byagowi : https://github.com/ebraminio
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ var symbolMap = {
+ '1': 'Û±',
+ '2': 'Û²',
+ '3': 'Û³',
+ '4': 'Û´',
+ '5': 'Ûµ',
+ '6': 'Û¶',
+ '7': 'Û·',
+ '8': 'Û¸',
+ '9': 'Û¹',
+ '0': 'Û°'
+ }, numberMap = {
+ 'Û±': '1',
+ 'Û²': '2',
+ 'Û³': '3',
+ 'Û´': '4',
+ 'Ûµ': '5',
+ 'Û¶': '6',
+ 'Û·': '7',
+ 'Û¸': '8',
+ 'Û¹': '9',
+ 'Û°': '0'
+ };
+
+ return moment.lang('fa', {
+ months : 'ژانویه_Ùوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'),
+ monthsShort : 'ژانویه_Ùوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'),
+ weekdays : 'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split('_'),
+ weekdaysShort : 'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split('_'),
+ weekdaysMin : 'ی_د_س_چ_پ_ج_ش'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY LT',
+ LLLL : 'dddd, D MMMM YYYY LT'
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 12) {
+ return "قبل از ظهر";
+ } else {
+ return "بعد از ظهر";
+ }
+ },
+ 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 : '%d ساعت',
+ d : 'یک روز',
+ dd : '%d روز',
+ M : 'یک ماه',
+ MM : '%d ماه',
+ y : 'یک سال',
+ yy : '%d سال'
+ },
+ preparse: function (string) {
+ return string.replace(/[Û°-Û¹]/g, function (match) {
+ return numberMap[match];
+ }).replace(/،/g, ',');
+ },
+ postformat: function (string) {
+ return string.replace(/\d/g, function (match) {
+ return symbolMap[match];
+ }).replace(/,/g, '،');
+ },
+ ordinal : '%dÙ…',
+ week : {
+ dow : 6, // Saturday is the first day of the week.
+ doy : 12 // The week that contains Jan 1st is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : finnish (fi)
+// author : Tarmo Aidantausta : https://github.com/bleadof
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ var numbers_past = 'nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän'.split(' '),
+ numbers_future = ['nolla', 'yhden', 'kahden', 'kolmen', 'neljän', 'viiden', 'kuuden',
+ numbers_past[7], numbers_past[8], numbers_past[9]];
+
+ function translate(number, withoutSuffix, key, isFuture) {
+ var result = "";
+ switch (key) {
+ case 's':
+ return isFuture ? 'muutaman sekunnin' : 'muutama sekunti';
+ case 'm':
+ return isFuture ? 'minuutin' : 'minuutti';
+ case 'mm':
+ result = isFuture ? 'minuutin' : 'minuuttia';
+ break;
+ case 'h':
+ return isFuture ? 'tunnin' : 'tunti';
+ case 'hh':
+ result = isFuture ? 'tunnin' : 'tuntia';
+ break;
+ case 'd':
+ return isFuture ? 'päivän' : 'päivä';
+ case 'dd':
+ result = isFuture ? 'päivän' : 'päivää';
+ break;
+ case 'M':
+ return isFuture ? 'kuukauden' : 'kuukausi';
+ case 'MM':
+ result = isFuture ? 'kuukauden' : 'kuukautta';
+ break;
+ case 'y':
+ return isFuture ? 'vuoden' : 'vuosi';
+ case 'yy':
+ result = isFuture ? 'vuoden' : 'vuotta';
+ break;
+ }
+ result = verbal_number(number, isFuture) + " " + result;
+ return result;
+ }
+
+ function verbal_number(number, isFuture) {
+ return number < 10 ? (isFuture ? numbers_future[number] : numbers_past[number]) : number;
+ }
+
+ return moment.lang('fi', {
+ months : "tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu".split("_"),
+ monthsShort : "tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu".split("_"),
+ weekdays : "sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai".split("_"),
+ weekdaysShort : "su_ma_ti_ke_to_pe_la".split("_"),
+ weekdaysMin : "su_ma_ti_ke_to_pe_la".split("_"),
+ longDateFormat : {
+ LT : "HH.mm",
+ L : "DD.MM.YYYY",
+ LL : "Do MMMM[ta] YYYY",
+ LLL : "Do MMMM[ta] YYYY, [klo] LT",
+ LLLL : "dddd, Do MMMM[ta] YYYY, [klo] LT",
+ l : "D.M.YYYY",
+ ll : "Do MMM YYYY",
+ lll : "Do MMM YYYY, [klo] LT",
+ llll : "ddd, Do MMM YYYY, [klo] LT"
+ },
+ calendar : {
+ sameDay : '[tänään] [klo] LT',
+ nextDay : '[huomenna] [klo] LT',
+ nextWeek : 'dddd [klo] LT',
+ lastDay : '[eilen] [klo] LT',
+ lastWeek : '[viime] dddd[na] [klo] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : "%s päästä",
+ past : "%s sitten",
+ s : translate,
+ m : translate,
+ mm : translate,
+ h : translate,
+ hh : translate,
+ d : translate,
+ dd : translate,
+ M : translate,
+ MM : translate,
+ y : translate,
+ yy : translate
+ },
+ ordinal : "%d.",
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : faroese (fo)
+// author : Ragnar Johannesen : https://github.com/ragnar123
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ return moment.lang('fo', {
+ months : "januar_februar_mars_apríl_mai_juni_juli_august_september_oktober_november_desember".split("_"),
+ monthsShort : "jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),
+ weekdays : "sunnudagur_mánadagur_týsdagur_mikudagur_hósdagur_fríggjadagur_leygardagur".split("_"),
+ weekdaysShort : "sun_mán_týs_mik_hós_frí_ley".split("_"),
+ weekdaysMin : "su_má_tý_mi_hó_fr_le".split("_"),
+ longDateFormat : {
+ LT : "HH:mm",
+ L : "DD/MM/YYYY",
+ LL : "D MMMM YYYY",
+ LLL : "D MMMM YYYY LT",
+ LLLL : "dddd D. MMMM, YYYY LT"
+ },
+ calendar : {
+ sameDay : '[Ã dag kl.] LT',
+ nextDay : '[Ã morgin kl.] LT',
+ nextWeek : 'dddd [kl.] LT',
+ lastDay : '[à gjár kl.] LT',
+ lastWeek : '[síðstu] dddd [kl] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : "um %s",
+ past : "%s síðani",
+ s : "fá sekund",
+ m : "ein minutt",
+ mm : "%d minuttir",
+ h : "ein tími",
+ hh : "%d tímar",
+ d : "ein dagur",
+ dd : "%d dagar",
+ M : "ein mánaði",
+ MM : "%d mánaðir",
+ y : "eitt ár",
+ yy : "%d ár"
+ },
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : canadian french (fr-ca)
+// author : Jonathan Abourbih : https://github.com/jonbca
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ return moment.lang('fr-ca', {
+ 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",
+ L : "YYYY-MM-DD",
+ LL : "D MMMM YYYY",
+ LLL : "D MMMM YYYY LT",
+ LLLL : "dddd D MMMM YYYY LT"
+ },
+ 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"
+ },
+ ordinal : function (number) {
+ return number + (number === 1 ? 'er' : '');
+ }
+ });
+}));
+// moment.js language configuration
+// language : french (fr)
+// author : John Fischer : https://github.com/jfroffice
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ return moment.lang('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",
+ L : "DD/MM/YYYY",
+ LL : "D MMMM YYYY",
+ LLL : "D MMMM YYYY LT",
+ LLLL : "dddd D MMMM YYYY LT"
+ },
+ 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"
+ },
+ ordinal : function (number) {
+ return number + (number === 1 ? 'er' : '');
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : galician (gl)
+// author : Juan G. Hurtado : https://github.com/juanghurtado
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ return moment.lang('gl', {
+ months : "Xaneiro_Febreiro_Marzo_Abril_Maio_Xuño_Xullo_Agosto_Setembro_Outubro_Novembro_Decembro".split("_"),
+ monthsShort : "Xan._Feb._Mar._Abr._Mai._Xuñ._Xul._Ago._Set._Out._Nov._Dec.".split("_"),
+ weekdays : "Domingo_Luns_Martes_Mércores_Xoves_Venres_Sábado".split("_"),
+ weekdaysShort : "Dom._Lun._Mar._Mér._Xov._Ven._Sáb.".split("_"),
+ weekdaysMin : "Do_Lu_Ma_Mé_Xo_Ve_Sá".split("_"),
+ longDateFormat : {
+ LT : "H:mm",
+ L : "DD/MM/YYYY",
+ LL : "D MMMM YYYY",
+ LLL : "D MMMM YYYY LT",
+ LLLL : "dddd D MMMM YYYY LT"
+ },
+ calendar : {
+ sameDay : function () {
+ return '[hoxe ' + ((this.hours() !== 1) ? 'ás' : 'á') + '] LT';
+ },
+ nextDay : function () {
+ return '[mañá ' + ((this.hours() !== 1) ? 'ás' : 'á') + '] LT';
+ },
+ nextWeek : function () {
+ return 'dddd [' + ((this.hours() !== 1) ? 'ás' : 'a') + '] LT';
+ },
+ lastDay : function () {
+ return '[onte ' + ((this.hours() !== 1) ? 'á' : 'a') + '] LT';
+ },
+ lastWeek : function () {
+ return '[o] dddd [pasado ' + ((this.hours() !== 1) ? 'ás' : 'a') + '] LT';
+ },
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : function (str) {
+ if (str === "uns segundos") {
+ return "nuns segundos";
+ }
+ return "en " + str;
+ },
+ past : "hai %s",
+ s : "uns segundos",
+ m : "un minuto",
+ mm : "%d minutos",
+ h : "unha hora",
+ hh : "%d horas",
+ d : "un día",
+ dd : "%d días",
+ M : "un mes",
+ MM : "%d meses",
+ y : "un ano",
+ yy : "%d anos"
+ },
+ ordinal : '%dº',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : Hebrew (he)
+// author : Tomer Cohen : https://github.com/tomer
+// author : Moshe Simantov : https://github.com/DevelopmentIL
+// author : Tal Ater : https://github.com/TalAter
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ return moment.lang('he', {
+ months : "ינו×ר_פברו×ר_מרץ_×פריל_מ××™_יוני_יולי_×וגוסט_ספטמבר_×וקטובר_נובמבר_דצמבר".split("_"),
+ monthsShort : "ינו׳_פבר׳_מרץ_×פר׳_מ××™_יוני_יולי_×וג׳_ספט׳_×וק׳_נוב׳_דצמ׳".split("_"),
+ weekdays : "ר×שון_שני_שלישי_רביעי_חמישי_שישי_שבת".split("_"),
+ weekdaysShort : "×׳_ב׳_ג׳_ד׳_ה׳_ו׳_ש׳".split("_"),
+ weekdaysMin : "×_ב_×’_ד_×”_ו_ש".split("_"),
+ longDateFormat : {
+ LT : "HH:mm",
+ L : "DD/MM/YYYY",
+ LL : "D [ב]MMMM YYYY",
+ LLL : "D [ב]MMMM YYYY LT",
+ LLLL : "dddd, D [ב]MMMM YYYY LT",
+ l : "D/M/YYYY",
+ ll : "D MMM YYYY",
+ lll : "D MMM YYYY LT",
+ llll : "ddd, D MMM YYYY LT"
+ },
+ 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 (number) {
+ if (number === 2) {
+ return "שעתיי×";
+ }
+ return number + " שעות";
+ },
+ d : "יו×",
+ dd : function (number) {
+ if (number === 2) {
+ return "יומיי×";
+ }
+ return number + " ימי×";
+ },
+ M : "חודש",
+ MM : function (number) {
+ if (number === 2) {
+ return "חודשיי×";
+ }
+ return number + " חודשי×";
+ },
+ y : "שנה",
+ yy : function (number) {
+ if (number === 2) {
+ return "שנתיי×";
+ }
+ return number + " שני×";
+ }
+ }
+ });
+}));
+// moment.js language configuration
+// language : hindi (hi)
+// author : Mayank Singhal : https://github.com/mayanksinghal
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ var symbolMap = {
+ '1': '१',
+ '2': '२',
+ '3': '३',
+ '4': '४',
+ '5': '५',
+ '6': '६',
+ '7': '७',
+ '8': '८',
+ '9': '९',
+ '0': '०'
+ },
+ numberMap = {
+ '१': '1',
+ '२': '2',
+ '३': '3',
+ '४': '4',
+ '५': '5',
+ '६': '6',
+ '७': '7',
+ '८': '8',
+ '९': '9',
+ '०': '0'
+ };
+
+ return moment.lang('hi', {
+ months : 'जनवरी_फ़रवरी_मारà¥à¤š_अपà¥à¤°à¥ˆà¤²_मई_जून_जà¥à¤²à¤¾à¤ˆ_अगसà¥à¤¤_सितमà¥à¤¬à¤°_अकà¥à¤Ÿà¥‚बर_नवमà¥à¤¬à¤°_दिसमà¥à¤¬à¤°'.split("_"),
+ monthsShort : 'जन._फ़र._मारà¥à¤š_अपà¥à¤°à¥ˆ._मई_जून_जà¥à¤²._अग._सित._अकà¥à¤Ÿà¥‚._नव._दिस.'.split("_"),
+ weekdays : 'रविवार_सोमवार_मंगलवार_बà¥à¤§à¤µà¤¾à¤°_गà¥à¤°à¥‚वार_शà¥à¤•à¥à¤°à¤µà¤¾à¤°_शनिवार'.split("_"),
+ weekdaysShort : 'रवि_सोम_मंगल_बà¥à¤§_गà¥à¤°à¥‚_शà¥à¤•à¥à¤°_शनि'.split("_"),
+ weekdaysMin : 'र_सो_मं_बà¥_गà¥_शà¥_श'.split("_"),
+ longDateFormat : {
+ LT : "A h:mm बजे",
+ L : "DD/MM/YYYY",
+ LL : "D MMMM YYYY",
+ LLL : "D MMMM YYYY, LT",
+ LLLL : "dddd, D MMMM YYYY, LT"
+ },
+ 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 : "%d घंटे",
+ d : "à¤à¤• दिन",
+ dd : "%d दिन",
+ M : "à¤à¤• महीने",
+ MM : "%d महीने",
+ y : "à¤à¤• वरà¥à¤·",
+ yy : "%d वरà¥à¤·"
+ },
+ preparse: function (string) {
+ return string.replace(/[१२३४५६७८९०]/g, function (match) {
+ return numberMap[match];
+ });
+ },
+ postformat: function (string) {
+ return string.replace(/\d/g, function (match) {
+ return symbolMap[match];
+ });
+ },
+ // Hindi notation for meridiems are quite fuzzy in practice. While there exists
+ // a rigid notion of a 'Pahar' it is not used as rigidly in modern Hindi.
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 4) {
+ return "रात";
+ } else if (hour < 10) {
+ return "सà¥à¤¬à¤¹";
+ } else if (hour < 17) {
+ return "दोपहर";
+ } else if (hour < 20) {
+ return "शाम";
+ } else {
+ return "रात";
+ }
+ },
+ week : {
+ dow : 0, // Sunday is the first day of the week.
+ doy : 6 // The week that contains Jan 1st is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : hrvatski (hr)
+// author : Bojan Marković : https://github.com/bmarkovic
+
+// based on (sl) translation by Robert Sedovšek
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+
+ function translate(number, withoutSuffix, key) {
+ var result = number + " ";
+ switch (key) {
+ case 'm':
+ return withoutSuffix ? 'jedna minuta' : 'jedne minute';
+ case 'mm':
+ if (number === 1) {
+ result += 'minuta';
+ } else if (number === 2 || number === 3 || number === 4) {
+ result += 'minute';
+ } else {
+ result += 'minuta';
+ }
+ return result;
+ case 'h':
+ return withoutSuffix ? 'jedan sat' : 'jednog sata';
+ case 'hh':
+ if (number === 1) {
+ result += 'sat';
+ } else if (number === 2 || number === 3 || number === 4) {
+ result += 'sata';
+ } else {
+ result += 'sati';
+ }
+ return result;
+ case 'dd':
+ if (number === 1) {
+ result += 'dan';
+ } else {
+ result += 'dana';
+ }
+ return result;
+ case 'MM':
+ if (number === 1) {
+ result += 'mjesec';
+ } else if (number === 2 || number === 3 || number === 4) {
+ result += 'mjeseca';
+ } else {
+ result += 'mjeseci';
+ }
+ return result;
+ case 'yy':
+ if (number === 1) {
+ result += 'godina';
+ } else if (number === 2 || number === 3 || number === 4) {
+ result += 'godine';
+ } else {
+ result += 'godina';
+ }
+ return result;
+ }
+ }
+
+ return moment.lang('hr', {
+ months : "sjeÄanj_veljaÄa_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac".split("_"),
+ monthsShort : "sje._vel._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.".split("_"),
+ weekdays : "nedjelja_ponedjeljak_utorak_srijeda_Äetvrtak_petak_subota".split("_"),
+ weekdaysShort : "ned._pon._uto._sri._Äet._pet._sub.".split("_"),
+ weekdaysMin : "ne_po_ut_sr_Äe_pe_su".split("_"),
+ longDateFormat : {
+ LT : "H:mm",
+ L : "DD. MM. YYYY",
+ LL : "D. MMMM YYYY",
+ LLL : "D. MMMM YYYY LT",
+ LLLL : "dddd, D. MMMM YYYY LT"
+ },
+ calendar : {
+ sameDay : '[danas u] LT',
+ nextDay : '[sutra u] LT',
+
+ nextWeek : function () {
+ switch (this.day()) {
+ case 0:
+ return '[u] [nedjelju] [u] LT';
+ case 3:
+ return '[u] [srijedu] [u] LT';
+ case 6:
+ return '[u] [subotu] [u] LT';
+ case 1:
+ case 2:
+ case 4:
+ case 5:
+ return '[u] dddd [u] LT';
+ }
+ },
+ lastDay : '[juÄer u] LT',
+ lastWeek : function () {
+ switch (this.day()) {
+ case 0:
+ case 3:
+ return '[prošlu] dddd [u] LT';
+ case 6:
+ return '[prošle] [subote] [u] LT';
+ case 1:
+ case 2:
+ case 4:
+ case 5:
+ return '[prošli] dddd [u] LT';
+ }
+ },
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : "za %s",
+ past : "prije %s",
+ s : "par sekundi",
+ m : translate,
+ mm : translate,
+ h : translate,
+ hh : translate,
+ d : "dan",
+ dd : translate,
+ M : "mjesec",
+ MM : translate,
+ y : "godinu",
+ yy : translate
+ },
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : hungarian (hu)
+// author : Adam Brunner : https://github.com/adambrunner
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ var weekEndings = 'vasárnap hétfőn kedden szerdán csütörtökön pénteken szombaton'.split(' ');
+
+ function translate(number, withoutSuffix, key, isFuture) {
+ var num = number,
+ suffix;
+
+ switch (key) {
+ case 's':
+ return (isFuture || withoutSuffix) ? 'néhány másodperc' : 'néhány másodperce';
+ case 'm':
+ return 'egy' + (isFuture || withoutSuffix ? ' perc' : ' perce');
+ case 'mm':
+ return num + (isFuture || withoutSuffix ? ' perc' : ' perce');
+ case 'h':
+ return 'egy' + (isFuture || withoutSuffix ? ' óra' : ' órája');
+ case 'hh':
+ return num + (isFuture || withoutSuffix ? ' óra' : ' órája');
+ case 'd':
+ return 'egy' + (isFuture || withoutSuffix ? ' nap' : ' napja');
+ case 'dd':
+ return num + (isFuture || withoutSuffix ? ' nap' : ' napja');
+ case 'M':
+ return 'egy' + (isFuture || withoutSuffix ? ' hónap' : ' hónapja');
+ case 'MM':
+ return num + (isFuture || withoutSuffix ? ' hónap' : ' hónapja');
+ case 'y':
+ return 'egy' + (isFuture || withoutSuffix ? ' év' : ' éve');
+ case 'yy':
+ return num + (isFuture || withoutSuffix ? ' év' : ' éve');
+ }
+
+ return '';
+ }
+
+ function week(isFuture) {
+ return (isFuture ? '' : '[múlt] ') + '[' + weekEndings[this.day()] + '] LT[-kor]';
+ }
+
+ return moment.lang('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",
+ L : "YYYY.MM.DD.",
+ LL : "YYYY. MMMM D.",
+ LLL : "YYYY. MMMM D., LT",
+ LLLL : "YYYY. MMMM D., dddd LT"
+ },
+ calendar : {
+ sameDay : '[ma] LT[-kor]',
+ nextDay : '[holnap] LT[-kor]',
+ nextWeek : function () {
+ return week.call(this, true);
+ },
+ lastDay : '[tegnap] LT[-kor]',
+ lastWeek : function () {
+ return week.call(this, false);
+ },
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : "%s múlva",
+ past : "%s",
+ s : translate,
+ m : translate,
+ mm : translate,
+ h : translate,
+ hh : translate,
+ d : translate,
+ dd : translate,
+ M : translate,
+ MM : translate,
+ y : translate,
+ yy : translate
+ },
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : Bahasa Indonesia (id)
+// author : Mohammad Satrio Utomo : https://github.com/tyok
+// reference: http://id.wikisource.org/wiki/Pedoman_Umum_Ejaan_Bahasa_Indonesia_yang_Disempurnakan
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ return moment.lang('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",
+ L : "DD/MM/YYYY",
+ LL : "D MMMM YYYY",
+ LLL : "D MMMM YYYY [pukul] LT",
+ LLLL : "dddd, D MMMM YYYY [pukul] LT"
+ },
+ meridiem : function (hours, minutes, isLower) {
+ if (hours < 11) {
+ return 'pagi';
+ } else if (hours < 15) {
+ return 'siang';
+ } else if (hours < 19) {
+ return 'sore';
+ } else {
+ return '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, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : icelandic (is)
+// author : Hinrik Örn Sigurðsson : https://github.com/hinrik
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ function plural(n) {
+ if (n % 100 === 11) {
+ return true;
+ } else if (n % 10 === 1) {
+ return false;
+ }
+ return true;
+ }
+
+ function translate(number, withoutSuffix, key, isFuture) {
+ var result = number + " ";
+ switch (key) {
+ case 's':
+ return withoutSuffix || isFuture ? 'nokkrar sekúndur' : 'nokkrum sekúndum';
+ case 'm':
+ return withoutSuffix ? 'mínúta' : 'mínútu';
+ case 'mm':
+ if (plural(number)) {
+ return result + (withoutSuffix || isFuture ? 'mínútur' : 'mínútum');
+ } else if (withoutSuffix) {
+ return result + 'mínúta';
+ }
+ return result + 'mínútu';
+ case 'hh':
+ if (plural(number)) {
+ return result + (withoutSuffix || isFuture ? 'klukkustundir' : 'klukkustundum');
+ }
+ return result + 'klukkustund';
+ case 'd':
+ if (withoutSuffix) {
+ return 'dagur';
+ }
+ return isFuture ? 'dag' : 'degi';
+ case 'dd':
+ if (plural(number)) {
+ if (withoutSuffix) {
+ return result + 'dagar';
+ }
+ return result + (isFuture ? 'daga' : 'dögum');
+ } else if (withoutSuffix) {
+ return result + 'dagur';
+ }
+ return result + (isFuture ? 'dag' : 'degi');
+ case 'M':
+ if (withoutSuffix) {
+ return 'mánuður';
+ }
+ return isFuture ? 'mánuð' : 'mánuði';
+ case 'MM':
+ if (plural(number)) {
+ if (withoutSuffix) {
+ return result + 'mánuðir';
+ }
+ return result + (isFuture ? 'mánuði' : 'mánuðum');
+ } else if (withoutSuffix) {
+ return result + 'mánuður';
+ }
+ return result + (isFuture ? 'mánuð' : 'mánuði');
+ case 'y':
+ return withoutSuffix || isFuture ? 'ár' : 'ári';
+ case 'yy':
+ if (plural(number)) {
+ return result + (withoutSuffix || isFuture ? 'ár' : 'árum');
+ }
+ return result + (withoutSuffix || isFuture ? 'ár' : 'ári');
+ }
+ }
+
+ return moment.lang('is', {
+ months : "janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember".split("_"),
+ monthsShort : "jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des".split("_"),
+ weekdays : "sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur".split("_"),
+ weekdaysShort : "sun_mán_þri_mið_fim_fös_lau".split("_"),
+ weekdaysMin : "Su_Má_Þr_Mi_Fi_Fö_La".split("_"),
+ longDateFormat : {
+ LT : "H:mm",
+ L : "DD/MM/YYYY",
+ LL : "D. MMMM YYYY",
+ LLL : "D. MMMM YYYY [kl.] LT",
+ LLLL : "dddd, D. MMMM YYYY [kl.] LT"
+ },
+ calendar : {
+ sameDay : '[í dag kl.] LT',
+ nextDay : '[á morgun kl.] LT',
+ nextWeek : 'dddd [kl.] LT',
+ lastDay : '[í gær kl.] LT',
+ lastWeek : '[síðasta] dddd [kl.] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : "eftir %s",
+ past : "fyrir %s síðan",
+ s : translate,
+ m : translate,
+ mm : translate,
+ h : "klukkustund",
+ hh : translate,
+ d : translate,
+ dd : translate,
+ M : translate,
+ MM : translate,
+ y : translate,
+ yy : translate
+ },
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : italian (it)
+// author : Lorenzo : https://github.com/aliem
+// author: Mattia Larentis: https://github.com/nostalgiaz
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ return moment.lang('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",
+ L : "DD/MM/YYYY",
+ LL : "D MMMM YYYY",
+ LLL : "D MMMM YYYY LT",
+ LLLL : "dddd, D MMMM YYYY LT"
+ },
+ calendar : {
+ sameDay: '[Oggi alle] LT',
+ nextDay: '[Domani alle] LT',
+ nextWeek: 'dddd [alle] LT',
+ lastDay: '[Ieri alle] LT',
+ lastWeek: '[lo scorso] dddd [alle] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : function (s) {
+ return ((/^[0-9].+$/).test(s) ? "tra" : "in") + " " + s;
+ },
+ past : "%s fa",
+ s : "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"
+ },
+ ordinal: '%dº',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : japanese (ja)
+// author : LI Long : https://github.com/baryon
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ return moment.lang('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分",
+ L : "YYYY/MM/DD",
+ LL : "YYYY年M月D日",
+ LLL : "YYYY年M月D日LT",
+ LLLL : "YYYY年M月D日LT dddd"
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 12) {
+ return "åˆå‰";
+ } else {
+ return "åˆå¾Œ";
+ }
+ },
+ 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å¹´"
+ }
+ });
+}));
+// moment.js language configuration
+// language : Georgian (ka)
+// author : Irakli Janiashvili : https://github.com/irakli-janiashvili
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+
+ function monthsCaseReplace(m, format) {
+ var months = {
+ 'nominative': 'იáƒáƒœáƒ•áƒáƒ áƒ˜_თებერვáƒáƒšáƒ˜_მáƒáƒ áƒ¢áƒ˜_áƒáƒžáƒ áƒ˜áƒšáƒ˜_მáƒáƒ˜áƒ¡áƒ˜_ივნისი_ივლისი_áƒáƒ’ვისტáƒ_სექტემბერი_áƒáƒ¥áƒ¢áƒáƒ›áƒ‘ერი_ნáƒáƒ”მბერი_დეკემბერი'.split('_'),
+ 'accusative': 'იáƒáƒœáƒ•áƒáƒ áƒ¡_თებერვáƒáƒšáƒ¡_მáƒáƒ áƒ¢áƒ¡_áƒáƒžáƒ áƒ˜áƒšáƒ˜áƒ¡_მáƒáƒ˜áƒ¡áƒ¡_ივნისს_ივლისს_áƒáƒ’ვისტს_სექტემბერს_áƒáƒ¥áƒ¢áƒáƒ›áƒ‘ერს_ნáƒáƒ”მბერს_დეკემბერს'.split('_')
+ },
+
+ nounCase = (/D[oD] *MMMM?/).test(format) ?
+ 'accusative' :
+ 'nominative';
+
+ return months[nounCase][m.month()];
+ }
+
+ function weekdaysCaseReplace(m, format) {
+ var weekdays = {
+ 'nominative': 'კვირáƒ_áƒáƒ áƒ¨áƒáƒ‘áƒáƒ—ი_სáƒáƒ›áƒ¨áƒáƒ‘áƒáƒ—ი_áƒáƒ—ხშáƒáƒ‘áƒáƒ—ი_ხუთშáƒáƒ‘áƒáƒ—ი_პáƒáƒ áƒáƒ¡áƒ™áƒ”ვი_შáƒáƒ‘áƒáƒ—ი'.split('_'),
+ 'accusative': 'კვირáƒáƒ¡_áƒáƒ áƒ¨áƒáƒ‘áƒáƒ—ს_სáƒáƒ›áƒ¨áƒáƒ‘áƒáƒ—ს_áƒáƒ—ხშáƒáƒ‘áƒáƒ—ს_ხუთშáƒáƒ‘áƒáƒ—ს_პáƒáƒ áƒáƒ¡áƒ™áƒ”ვს_შáƒáƒ‘áƒáƒ—ს'.split('_')
+ },
+
+ nounCase = (/(წინáƒ|შემდეგ)/).test(format) ?
+ 'accusative' :
+ 'nominative';
+
+ return weekdays[nounCase][m.day()];
+ }
+
+ return moment.lang('ka', {
+ months : monthsCaseReplace,
+ monthsShort : "იáƒáƒœ_თებ_მáƒáƒ _áƒáƒžáƒ _მáƒáƒ˜_ივნ_ივლ_áƒáƒ’ვ_სექ_áƒáƒ¥áƒ¢_ნáƒáƒ”_დეკ".split("_"),
+ weekdays : weekdaysCaseReplace,
+ weekdaysShort : "კვი_áƒáƒ áƒ¨_სáƒáƒ›_áƒáƒ—ხ_ხუთ_პáƒáƒ _შáƒáƒ‘".split("_"),
+ weekdaysMin : "კვ_áƒáƒ _სáƒ_áƒáƒ—_ხუ_პáƒ_შáƒ".split("_"),
+ longDateFormat : {
+ LT : "h:mm A",
+ L : "DD/MM/YYYY",
+ LL : "D MMMM YYYY",
+ LLL : "D MMMM YYYY LT",
+ LLLL : "dddd, D MMMM YYYY LT"
+ },
+ calendar : {
+ sameDay : '[დღეს] LT[-ზე]',
+ nextDay : '[ხვáƒáƒš] LT[-ზე]',
+ lastDay : '[გუშინ] LT[-ზე]',
+ nextWeek : '[შემდეგ] dddd LT[-ზე]',
+ lastWeek : '[წინáƒ] dddd LT-ზე',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : function (s) {
+ return (/(წáƒáƒ›áƒ˜|წუთი|სáƒáƒáƒ—ი|წელი)/).test(s) ?
+ s.replace(/ი$/, "ში") :
+ s + "ში";
+ },
+ past : function (s) {
+ if ((/(წáƒáƒ›áƒ˜|წუთი|სáƒáƒáƒ—ი|დღე|თვე)/).test(s)) {
+ return s.replace(/(ი|ე)$/, "ის წინ");
+ }
+ if ((/წელი/).test(s)) {
+ return s.replace(/წელი$/, "წლის წინ");
+ }
+ },
+ s : "რáƒáƒ›áƒ“ენიმე წáƒáƒ›áƒ˜",
+ m : "წუთი",
+ mm : "%d წუთი",
+ h : "სáƒáƒáƒ—ი",
+ hh : "%d სáƒáƒáƒ—ი",
+ d : "დღე",
+ dd : "%d დღე",
+ M : "თვე",
+ MM : "%d თვე",
+ y : "წელი",
+ yy : "%d წელი"
+ },
+ ordinal : function (number) {
+ if (number === 0) {
+ return number;
+ }
+
+ if (number === 1) {
+ return number + "-ლი";
+ }
+
+ if ((number < 20) || (number <= 100 && (number % 20 === 0)) || (number % 100 === 0)) {
+ return "მე-" + number;
+ }
+
+ return number + "-ე";
+ },
+ week : {
+ dow : 1,
+ doy : 7
+ }
+ });
+}));
+// moment.js language configuration
+// language : korean (ko)
+// author : Kyungwook, Park : https://github.com/kyungw00k
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ return moment.lang('ko', {
+ 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 : "A h시 mm분",
+ L : "YYYY.MM.DD",
+ LL : "YYYYë…„ MMMM Dì¼",
+ LLL : "YYYYë…„ MMMM Dì¼ LT",
+ LLLL : "YYYYë…„ MMMM Dì¼ dddd LT"
+ },
+ meridiem : function (hour, minute, isUpper) {
+ return hour < 12 ? '오전' : '오후';
+ },
+ calendar : {
+ sameDay : '오늘 LT',
+ nextDay : 'ë‚´ì¼ LT',
+ nextWeek : 'dddd LT',
+ lastDay : '어제 LT',
+ lastWeek : '지난주 dddd LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : "%s 후",
+ past : "%s ì „",
+ s : "몇초",
+ ss : "%dì´ˆ",
+ m : "ì¼ë¶„",
+ mm : "%d분",
+ h : "한시간",
+ hh : "%d시간",
+ d : "하루",
+ dd : "%dì¼",
+ M : "한달",
+ MM : "%d달",
+ y : "ì¼ë…„",
+ yy : "%dë…„"
+ },
+ ordinal : '%dì¼'
+ });
+}));
+// moment.js language configuration
+// language : Lithuanian (lt)
+// author : Mindaugas Mozūras : https://github.com/mmozuras
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ var units = {
+ "m" : "minutÄ—_minutÄ—s_minutÄ™",
+ "mm": "minutÄ—s_minuÄių_minutes",
+ "h" : "valanda_valandos_valandÄ…",
+ "hh": "valandos_valandų_valandas",
+ "d" : "diena_dienos_dienÄ…",
+ "dd": "dienos_dienų_dienas",
+ "M" : "mėnuo_mėnesio_mėnesį",
+ "MM": "mėnesiai_mėnesių_mėnesius",
+ "y" : "metai_metų_metus",
+ "yy": "metai_metų_metus"
+ },
+ weekDays = "pirmadienis_antradienis_treÄiadienis_ketvirtadienis_penktadienis_Å¡eÅ¡tadienis_sekmadienis".split("_");
+
+ function translateSeconds(number, withoutSuffix, key, isFuture) {
+ if (withoutSuffix) {
+ return "kelios sekundÄ—s";
+ } else {
+ return isFuture ? "kelių sekundžių" : "kelias sekundes";
+ }
+ }
+
+ function translateSingular(number, withoutSuffix, key, isFuture) {
+ return withoutSuffix ? forms(key)[0] : (isFuture ? forms(key)[1] : forms(key)[2]);
+ }
+
+ function special(number) {
+ return number % 10 === 0 || (number > 10 && number < 20);
+ }
+
+ function forms(key) {
+ return units[key].split("_");
+ }
+
+ function translate(number, withoutSuffix, key, isFuture) {
+ var result = number + " ";
+ if (number === 1) {
+ return result + translateSingular(number, withoutSuffix, key[0], isFuture);
+ } else if (withoutSuffix) {
+ return result + (special(number) ? forms(key)[1] : forms(key)[0]);
+ } else {
+ if (isFuture) {
+ return result + forms(key)[1];
+ } else {
+ return result + (special(number) ? forms(key)[1] : forms(key)[2]);
+ }
+ }
+ }
+
+ function relativeWeekDay(moment, format) {
+ var nominative = format.indexOf('dddd LT') === -1,
+ weekDay = weekDays[moment.weekday()];
+
+ return nominative ? weekDay : weekDay.substring(0, weekDay.length - 2) + "į";
+ }
+
+ return moment.lang("lt", {
+ months : "sausio_vasario_kovo_balandžio_gegužės_biržėlio_liepos_rugpjÅ«Äio_rugsÄ—jo_spalio_lapkriÄio_gruodžio".split("_"),
+ monthsShort : "sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd".split("_"),
+ weekdays : relativeWeekDay,
+ weekdaysShort : "Sek_Pir_Ant_Tre_Ket_Pen_Šeš".split("_"),
+ weekdaysMin : "S_P_A_T_K_Pn_Å ".split("_"),
+ longDateFormat : {
+ LT : "HH:mm",
+ L : "YYYY-MM-DD",
+ LL : "YYYY [m.] MMMM D [d.]",
+ LLL : "YYYY [m.] MMMM D [d.], LT [val.]",
+ LLLL : "YYYY [m.] MMMM D [d.], dddd, LT [val.]",
+ l : "YYYY-MM-DD",
+ ll : "YYYY [m.] MMMM D [d.]",
+ lll : "YYYY [m.] MMMM D [d.], LT [val.]",
+ llll : "YYYY [m.] MMMM D [d.], ddd, LT [val.]"
+ },
+ calendar : {
+ sameDay : "[Å iandien] LT",
+ nextDay : "[Rytoj] LT",
+ nextWeek : "dddd LT",
+ lastDay : "[Vakar] LT",
+ lastWeek : "[Praėjusį] dddd LT",
+ sameElse : "L"
+ },
+ relativeTime : {
+ future : "po %s",
+ past : "prieš %s",
+ s : translateSeconds,
+ m : translateSingular,
+ mm : translate,
+ h : translateSingular,
+ hh : translate,
+ d : translateSingular,
+ dd : translate,
+ M : translateSingular,
+ MM : translate,
+ y : translateSingular,
+ yy : translate
+ },
+ ordinal : function (number) {
+ return number + '-oji';
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : latvian (lv)
+// author : Kristaps Karlsons : https://github.com/skakri
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ var units = {
+ 'mm': 'minūti_minūtes_minūte_minūtes',
+ 'hh': 'stundu_stundas_stunda_stundas',
+ 'dd': 'dienu_dienas_diena_dienas',
+ 'MM': 'mēnesi_mēnešus_mēnesis_mēneši',
+ 'yy': 'gadu_gadus_gads_gadi'
+ };
+
+ function format(word, number, withoutSuffix) {
+ var forms = word.split('_');
+ if (withoutSuffix) {
+ return number % 10 === 1 && number !== 11 ? forms[2] : forms[3];
+ } else {
+ return number % 10 === 1 && number !== 11 ? forms[0] : forms[1];
+ }
+ }
+
+ function relativeTimeWithPlural(number, withoutSuffix, key) {
+ return number + ' ' + format(units[key], number, withoutSuffix);
+ }
+
+ return moment.lang('lv', {
+ months : "janvÄris_februÄris_marts_aprÄ«lis_maijs_jÅ«nijs_jÅ«lijs_augusts_septembris_oktobris_novembris_decembris".split("_"),
+ monthsShort : "jan_feb_mar_apr_mai_jūn_jūl_aug_sep_okt_nov_dec".split("_"),
+ weekdays : "svētdiena_pirmdiena_otrdiena_trešdiena_ceturtdiena_piektdiena_sestdiena".split("_"),
+ weekdaysShort : "Sv_P_O_T_C_Pk_S".split("_"),
+ weekdaysMin : "Sv_P_O_T_C_Pk_S".split("_"),
+ longDateFormat : {
+ LT : "HH:mm",
+ L : "DD.MM.YYYY",
+ LL : "YYYY. [gada] D. MMMM",
+ LLL : "YYYY. [gada] D. MMMM, LT",
+ LLLL : "YYYY. [gada] D. MMMM, dddd, LT"
+ },
+ calendar : {
+ sameDay : '[Å odien pulksten] LT',
+ nextDay : '[RÄ«t pulksten] LT',
+ nextWeek : 'dddd [pulksten] LT',
+ lastDay : '[Vakar pulksten] LT',
+ lastWeek : '[PagÄjuÅ¡Ä] dddd [pulksten] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : "%s vÄ“lÄk",
+ past : "%s agrÄk",
+ s : "dažas sekundes",
+ m : "minūti",
+ mm : relativeTimeWithPlural,
+ h : "stundu",
+ hh : relativeTimeWithPlural,
+ d : "dienu",
+ dd : relativeTimeWithPlural,
+ M : "mēnesi",
+ MM : relativeTimeWithPlural,
+ y : "gadu",
+ yy : relativeTimeWithPlural
+ },
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : malayalam (ml)
+// author : Floyd Pink : https://github.com/floydpink
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ return moment.lang('ml', {
+ months : 'ജനàµà´µà´°à´¿_ഫെബàµà´°àµà´µà´°à´¿_മാർചàµà´šàµ_à´à´ªàµà´°à´¿àµ½_മേയàµ_ജൂൺ_ജൂലൈ_à´“à´—à´¸àµà´±àµà´±àµ_സെപàµà´±àµà´±à´‚ബർ_à´’à´•àµà´Ÿàµ‹à´¬àµ¼_നവംബർ_ഡിസംബർ'.split("_"),
+ monthsShort : 'ജനàµ._ഫെബàµà´°àµ._മാർ._à´à´ªàµà´°à´¿._മേയàµ_ജൂൺ_ജൂലൈ._à´“à´—._സെപàµà´±àµà´±._à´’à´•àµà´Ÿàµ‹._നവം._ഡിസം.'.split("_"),
+ weekdays : 'ഞായറാഴàµà´š_തിങàµà´•à´³à´¾à´´àµà´š_ചൊവàµà´µà´¾à´´àµà´š_à´¬àµà´§à´¨à´¾à´´àµà´š_à´µàµà´¯à´¾à´´à´¾à´´àµà´š_വെളàµà´³à´¿à´¯à´¾à´´àµà´š_ശനിയാഴàµà´š'.split("_"),
+ weekdaysShort : 'ഞായർ_തിങàµà´•àµ¾_ചൊവàµà´µ_à´¬àµà´§àµ»_à´µàµà´¯à´¾à´´à´‚_വെളàµà´³à´¿_ശനി'.split("_"),
+ weekdaysMin : 'à´žà´¾_തി_ചൊ_à´¬àµ_à´µàµà´¯à´¾_വെ_à´¶'.split("_"),
+ longDateFormat : {
+ LT : "A h:mm -à´¨àµ",
+ L : "DD/MM/YYYY",
+ LL : "D MMMM YYYY",
+ LLL : "D MMMM YYYY, LT",
+ LLLL : "dddd, D MMMM YYYY, LT"
+ },
+ 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 : "%d മണികàµà´•àµ‚ർ",
+ d : "ഒരൠദിവസം",
+ dd : "%d ദിവസം",
+ M : "ഒരൠമാസം",
+ MM : "%d മാസം",
+ y : "ഒരൠവർഷം",
+ yy : "%d വർഷം"
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 4) {
+ return "രാതàµà´°à´¿";
+ } else if (hour < 12) {
+ return "രാവിലെ";
+ } else if (hour < 17) {
+ return "ഉചàµà´š à´•à´´à´¿à´žàµà´žàµ";
+ } else if (hour < 20) {
+ return "വൈകàµà´¨àµà´¨àµ‡à´°à´‚";
+ } else {
+ return "രാതàµà´°à´¿";
+ }
+ }
+ });
+}));
+// moment.js language configuration
+// language : Marathi (mr)
+// author : Harshad Kale : https://github.com/kalehv
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ var symbolMap = {
+ '1': '१',
+ '2': '२',
+ '3': '३',
+ '4': '४',
+ '5': '५',
+ '6': '६',
+ '7': '७',
+ '8': '८',
+ '9': '९',
+ '0': '०'
+ },
+ numberMap = {
+ '१': '1',
+ '२': '2',
+ '३': '3',
+ '४': '4',
+ '५': '5',
+ '६': '6',
+ '७': '7',
+ '८': '8',
+ '९': '9',
+ '०': '0'
+ };
+
+ return moment.lang('mr', {
+ months : 'जानेवारी_फेबà¥à¤°à¥à¤µà¤¾à¤°à¥€_मारà¥à¤š_à¤à¤ªà¥à¤°à¤¿à¤²_मे_जून_जà¥à¤²à¥ˆ_ऑगसà¥à¤Ÿ_सपà¥à¤Ÿà¥‡à¤‚बर_ऑकà¥à¤Ÿà¥‹à¤¬à¤°_नोवà¥à¤¹à¥‡à¤‚बर_डिसेंबर'.split("_"),
+ monthsShort: 'जाने._फेबà¥à¤°à¥._मारà¥à¤š._à¤à¤ªà¥à¤°à¤¿._मे._जून._जà¥à¤²à¥ˆ._ऑग._सपà¥à¤Ÿà¥‡à¤‚._ऑकà¥à¤Ÿà¥‹._नोवà¥à¤¹à¥‡à¤‚._डिसें.'.split("_"),
+ weekdays : 'रविवार_सोमवार_मंगळवार_बà¥à¤§à¤µà¤¾à¤°_गà¥à¤°à¥‚वार_शà¥à¤•à¥à¤°à¤µà¤¾à¤°_शनिवार'.split("_"),
+ weekdaysShort : 'रवि_सोम_मंगळ_बà¥à¤§_गà¥à¤°à¥‚_शà¥à¤•à¥à¤°_शनि'.split("_"),
+ weekdaysMin : 'र_सो_मं_बà¥_गà¥_शà¥_श'.split("_"),
+ longDateFormat : {
+ LT : "A h:mm वाजता",
+ L : "DD/MM/YYYY",
+ LL : "D MMMM YYYY",
+ LLL : "D MMMM YYYY, LT",
+ LLLL : "dddd, D MMMM YYYY, LT"
+ },
+ 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 : "%d तास",
+ d : "à¤à¤• दिवस",
+ dd : "%d दिवस",
+ M : "à¤à¤• महिना",
+ MM : "%d महिने",
+ y : "à¤à¤• वरà¥à¤·",
+ yy : "%d वरà¥à¤·à¥‡"
+ },
+ preparse: function (string) {
+ return string.replace(/[१२३४५६७८९०]/g, function (match) {
+ return numberMap[match];
+ });
+ },
+ postformat: function (string) {
+ return string.replace(/\d/g, function (match) {
+ return symbolMap[match];
+ });
+ },
+ meridiem: function (hour, minute, isLower)
+ {
+ if (hour < 4) {
+ return "रातà¥à¤°à¥€";
+ } else if (hour < 10) {
+ return "सकाळी";
+ } else if (hour < 17) {
+ return "दà¥à¤ªà¤¾à¤°à¥€";
+ } else if (hour < 20) {
+ return "सायंकाळी";
+ } else {
+ return "रातà¥à¤°à¥€";
+ }
+ },
+ week : {
+ dow : 0, // Sunday is the first day of the week.
+ doy : 6 // The week that contains Jan 1st is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : Bahasa Malaysia (ms-MY)
+// author : Weldan Jamili : https://github.com/weldan
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ return moment.lang('ms-my', {
+ months : "Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember".split("_"),
+ monthsShort : "Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis".split("_"),
+ weekdays : "Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu".split("_"),
+ weekdaysShort : "Ahd_Isn_Sel_Rab_Kha_Jum_Sab".split("_"),
+ weekdaysMin : "Ah_Is_Sl_Rb_Km_Jm_Sb".split("_"),
+ longDateFormat : {
+ LT : "HH.mm",
+ L : "DD/MM/YYYY",
+ LL : "D MMMM YYYY",
+ LLL : "D MMMM YYYY [pukul] LT",
+ LLLL : "dddd, D MMMM YYYY [pukul] LT"
+ },
+ meridiem : function (hours, minutes, isLower) {
+ if (hours < 11) {
+ return 'pagi';
+ } else if (hours < 15) {
+ return 'tengahari';
+ } else if (hours < 19) {
+ return 'petang';
+ } else {
+ return 'malam';
+ }
+ },
+ calendar : {
+ sameDay : '[Hari ini pukul] LT',
+ nextDay : '[Esok pukul] LT',
+ nextWeek : 'dddd [pukul] LT',
+ lastDay : '[Kelmarin pukul] LT',
+ lastWeek : 'dddd [lepas pukul] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : "dalam %s",
+ past : "%s yang lepas",
+ s : "beberapa saat",
+ m : "seminit",
+ mm : "%d minit",
+ h : "sejam",
+ hh : "%d jam",
+ d : "sehari",
+ dd : "%d hari",
+ M : "sebulan",
+ MM : "%d bulan",
+ y : "setahun",
+ yy : "%d tahun"
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : norwegian bokmål (nb)
+// authors : Espen Hovlandsdal : https://github.com/rexxars
+// Sigurd Gartmann : https://github.com/sigurdga
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ return moment.lang('nb', {
+ months : "januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),
+ monthsShort : "jan._feb._mars_april_mai_juni_juli_aug._sep._okt._nov._des.".split("_"),
+ weekdays : "søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag".split("_"),
+ weekdaysShort : "sø._ma._ti._on._to._fr._lø.".split("_"),
+ weekdaysMin : "sø_ma_ti_on_to_fr_lø".split("_"),
+ longDateFormat : {
+ LT : "H.mm",
+ L : "DD.MM.YYYY",
+ LL : "D. MMMM YYYY",
+ LLL : "D. MMMM YYYY [kl.] LT",
+ LLLL : "dddd D. MMMM YYYY [kl.] LT"
+ },
+ 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"
+ },
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : nepali/nepalese
+// author : suvash : https://github.com/suvash
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ var symbolMap = {
+ '1': '१',
+ '2': '२',
+ '3': '३',
+ '4': '४',
+ '5': '५',
+ '6': '६',
+ '7': '७',
+ '8': '८',
+ '9': '९',
+ '0': '०'
+ },
+ numberMap = {
+ '१': '1',
+ '२': '2',
+ '३': '3',
+ '४': '4',
+ '५': '5',
+ '६': '6',
+ '७': '7',
+ '८': '8',
+ '९': '9',
+ '०': '0'
+ };
+
+ return moment.lang('ne', {
+ months : 'जनवरी_फेबà¥à¤°à¥à¤µà¤°à¥€_मारà¥à¤š_अपà¥à¤°à¤¿à¤²_मई_जà¥à¤¨_जà¥à¤²à¤¾à¤ˆ_अगषà¥à¤Ÿ_सेपà¥à¤Ÿà¥‡à¤®à¥à¤¬à¤°_अकà¥à¤Ÿà¥‹à¤¬à¤°_नोभेमà¥à¤¬à¤°_डिसेमà¥à¤¬à¤°'.split("_"),
+ monthsShort : 'जन._फेबà¥à¤°à¥._मारà¥à¤š_अपà¥à¤°à¤¿._मई_जà¥à¤¨_जà¥à¤²à¤¾à¤ˆ._अग._सेपà¥à¤Ÿ._अकà¥à¤Ÿà¥‹._नोभे._डिसे.'.split("_"),
+ weekdays : 'आइतबार_सोमबार_मङà¥à¤—लबार_बà¥à¤§à¤¬à¤¾à¤°_बिहिबार_शà¥à¤•à¥à¤°à¤¬à¤¾à¤°_शनिबार'.split("_"),
+ weekdaysShort : 'आइत._सोम._मङà¥à¤—ल._बà¥à¤§._बिहि._शà¥à¤•à¥à¤°._शनि.'.split("_"),
+ weekdaysMin : 'आइ._सो._मङà¥_बà¥._बि._शà¥._श.'.split("_"),
+ longDateFormat : {
+ LT : "Aको h:mm बजे",
+ L : "DD/MM/YYYY",
+ LL : "D MMMM YYYY",
+ LLL : "D MMMM YYYY, LT",
+ LLLL : "dddd, D MMMM YYYY, LT"
+ },
+ preparse: function (string) {
+ return string.replace(/[१२३४५६७८९०]/g, function (match) {
+ return numberMap[match];
+ });
+ },
+ postformat: function (string) {
+ return string.replace(/\d/g, function (match) {
+ return symbolMap[match];
+ });
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 3) {
+ return "राती";
+ } else if (hour < 10) {
+ return "बिहान";
+ } else if (hour < 15) {
+ return "दिउà¤à¤¸à¥‹";
+ } else if (hour < 18) {
+ return "बेलà¥à¤•à¤¾";
+ } else if (hour < 20) {
+ return "साà¤à¤";
+ } else {
+ return "राती";
+ }
+ },
+ 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 : "%d घणà¥à¤Ÿà¤¾",
+ d : "à¤à¤• दिन",
+ dd : "%d दिन",
+ M : "à¤à¤• महिना",
+ MM : "%d महिना",
+ y : "à¤à¤• बरà¥à¤·",
+ yy : "%d बरà¥à¤·"
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : dutch (nl)
+// author : Joris Röling : https://github.com/jjupiter
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ var monthsShortWithDots = "jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"),
+ monthsShortWithoutDots = "jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_");
+
+ return moment.lang('nl', {
+ months : "januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),
+ monthsShort : function (m, format) {
+ if (/-MMM-/.test(format)) {
+ return monthsShortWithoutDots[m.month()];
+ } else {
+ return monthsShortWithDots[m.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",
+ L : "DD-MM-YYYY",
+ LL : "D MMMM YYYY",
+ LLL : "D MMMM YYYY LT",
+ LLLL : "dddd D MMMM YYYY LT"
+ },
+ 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"
+ },
+ ordinal : function (number) {
+ return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de');
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : norwegian nynorsk (nn)
+// author : https://github.com/mechuwind
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ return moment.lang('nn', {
+ 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 : "sundag_måndag_tysdag_onsdag_torsdag_fredag_laurdag".split("_"),
+ weekdaysShort : "sun_mån_tys_ons_tor_fre_lau".split("_"),
+ weekdaysMin : "su_må_ty_on_to_fr_lø".split("_"),
+ longDateFormat : {
+ LT : "HH:mm",
+ L : "DD.MM.YYYY",
+ LL : "D MMMM YYYY",
+ LLL : "D MMMM YYYY LT",
+ LLLL : "dddd D MMMM YYYY LT"
+ },
+ calendar : {
+ sameDay: '[I dag klokka] LT',
+ nextDay: '[I morgon klokka] LT',
+ nextWeek: 'dddd [klokka] LT',
+ lastDay: '[I går klokka] LT',
+ lastWeek: '[Føregående] dddd [klokka] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : "om %s",
+ past : "for %s siden",
+ s : "noen sekund",
+ m : "ett minutt",
+ mm : "%d minutt",
+ h : "en time",
+ hh : "%d timar",
+ d : "en dag",
+ dd : "%d dagar",
+ M : "en månad",
+ MM : "%d månader",
+ y : "ett år",
+ yy : "%d år"
+ },
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : polish (pl)
+// author : Rafal Hirsz : https://github.com/evoL
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ var monthsNominative = "styczeń_luty_marzec_kwiecień_maj_czerwiec_lipiec_sierpień_wrzesień_październik_listopad_grudzień".split("_"),
+ monthsSubjective = "stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_września_października_listopada_grudnia".split("_");
+
+ function plural(n) {
+ return (n % 10 < 5) && (n % 10 > 1) && (~~(n / 10) !== 1);
+ }
+
+ function translate(number, withoutSuffix, key) {
+ var result = number + " ";
+ switch (key) {
+ case 'm':
+ return withoutSuffix ? 'minuta' : 'minutÄ™';
+ case 'mm':
+ return result + (plural(number) ? 'minuty' : 'minut');
+ case 'h':
+ return withoutSuffix ? 'godzina' : 'godzinÄ™';
+ case 'hh':
+ return result + (plural(number) ? 'godziny' : 'godzin');
+ case 'MM':
+ return result + (plural(number) ? 'miesiące' : 'miesięcy');
+ case 'yy':
+ return result + (plural(number) ? 'lata' : 'lat');
+ }
+ }
+
+ return moment.lang('pl', {
+ months : function (momentToFormat, format) {
+ if (/D MMMM/.test(format)) {
+ return monthsSubjective[momentToFormat.month()];
+ } else {
+ return monthsNominative[momentToFormat.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",
+ L : "DD.MM.YYYY",
+ LL : "D MMMM YYYY",
+ LLL : "D MMMM YYYY LT",
+ LLLL : "dddd, D MMMM YYYY LT"
+ },
+ 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 : translate,
+ mm : translate,
+ h : translate,
+ hh : translate,
+ d : "1 dzień",
+ dd : '%d dni',
+ M : "miesiÄ…c",
+ MM : translate,
+ y : "rok",
+ yy : translate
+ },
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : brazilian portuguese (pt-br)
+// author : Caio Ribeiro Pereira : https://github.com/caio-ribeiro-pereira
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ return moment.lang('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",
+ L : "DD/MM/YYYY",
+ LL : "D [de] MMMM [de] YYYY",
+ LLL : "D [de] MMMM [de] YYYY LT",
+ LLLL : "dddd, D [de] MMMM [de] YYYY LT"
+ },
+ 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' : // Saturday + Sunday
+ '[Última] dddd [às] LT'; // Monday - Friday
+ },
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : "em %s",
+ past : "%s atrás",
+ s : "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"
+ },
+ ordinal : '%dº'
+ });
+}));
+// moment.js language configuration
+// language : portuguese (pt)
+// author : Jefferson : https://github.com/jalex79
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ return moment.lang('pt', {
+ 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",
+ L : "DD/MM/YYYY",
+ LL : "D [de] MMMM [de] YYYY",
+ LLL : "D [de] MMMM [de] YYYY LT",
+ LLLL : "dddd, D [de] MMMM [de] YYYY LT"
+ },
+ 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' : // Saturday + Sunday
+ '[Última] dddd [às] LT'; // Monday - Friday
+ },
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : "em %s",
+ past : "%s atrás",
+ s : "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"
+ },
+ ordinal : '%dº',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : romanian (ro)
+// author : Vlad Gurdiga : https://github.com/gurdiga
+// author : Valentin Agachi : https://github.com/avaly
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ return moment.lang('ro', {
+ months : "Ianuarie_Februarie_Martie_Aprilie_Mai_Iunie_Iulie_August_Septembrie_Octombrie_Noiembrie_Decembrie".split("_"),
+ monthsShort : "Ian_Feb_Mar_Apr_Mai_Iun_Iul_Aug_Sep_Oct_Noi_Dec".split("_"),
+ weekdays : "Duminică_Luni_Marţi_Miercuri_Joi_Vineri_Sâmbătă".split("_"),
+ weekdaysShort : "Dum_Lun_Mar_Mie_Joi_Vin_Sâm".split("_"),
+ weekdaysMin : "Du_Lu_Ma_Mi_Jo_Vi_Sâ".split("_"),
+ longDateFormat : {
+ LT : "H:mm",
+ L : "DD/MM/YYYY",
+ LL : "D MMMM YYYY",
+ LLL : "D MMMM YYYY H:mm",
+ LLLL : "dddd, D MMMM YYYY H:mm"
+ },
+ calendar : {
+ sameDay: "[azi la] LT",
+ nextDay: '[mâine la] LT',
+ nextWeek: 'dddd [la] LT',
+ lastDay: '[ieri la] LT',
+ lastWeek: '[fosta] dddd [la] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : "peste %s",
+ past : "%s în urmă",
+ s : "câteva secunde",
+ m : "un minut",
+ mm : "%d minute",
+ h : "o oră",
+ hh : "%d ore",
+ d : "o zi",
+ dd : "%d zile",
+ M : "o lună",
+ MM : "%d luni",
+ y : "un an",
+ yy : "%d ani"
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : russian (ru)
+// author : Viktorminator : https://github.com/Viktorminator
+// Author : Menelion Elensúle : https://github.com/Oire
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ function plural(word, num) {
+ var forms = word.split('_');
+ return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]);
+ }
+
+ function relativeTimeWithPlural(number, withoutSuffix, key) {
+ var format = {
+ 'mm': 'минута_минуты_минут',
+ 'hh': 'чаÑ_чаÑа_чаÑов',
+ 'dd': 'день_днÑ_дней',
+ 'MM': 'меÑÑц_меÑÑца_меÑÑцев',
+ 'yy': 'год_года_лет'
+ };
+ if (key === 'm') {
+ return withoutSuffix ? 'минута' : 'минуту';
+ }
+ else {
+ return number + ' ' + plural(format[key], +number);
+ }
+ }
+
+ function monthsCaseReplace(m, format) {
+ var months = {
+ 'nominative': 'Ñнварь_февраль_март_апрель_май_июнь_июль_авгуÑÑ‚_ÑентÑбрь_октÑбрь_ноÑбрь_декабрь'.split('_'),
+ 'accusative': 'ÑнварÑ_февралÑ_марта_апрелÑ_маÑ_июнÑ_июлÑ_авгуÑта_ÑентÑбрÑ_октÑбрÑ_ноÑбрÑ_декабрÑ'.split('_')
+ },
+
+ nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ?
+ 'accusative' :
+ 'nominative';
+
+ return months[nounCase][m.month()];
+ }
+
+ function monthsShortCaseReplace(m, format) {
+ var monthsShort = {
+ 'nominative': 'Ñнв_фев_мар_апр_май_июнь_июль_авг_Ñен_окт_ноÑ_дек'.split('_'),
+ 'accusative': 'Ñнв_фев_мар_апр_маÑ_июнÑ_июлÑ_авг_Ñен_окт_ноÑ_дек'.split('_')
+ },
+
+ nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ?
+ 'accusative' :
+ 'nominative';
+
+ return monthsShort[nounCase][m.month()];
+ }
+
+ function weekdaysCaseReplace(m, format) {
+ var weekdays = {
+ 'nominative': 'воÑкреÑенье_понедельник_вторник_Ñреда_четверг_пÑтница_Ñуббота'.split('_'),
+ 'accusative': 'воÑкреÑенье_понедельник_вторник_Ñреду_четверг_пÑтницу_Ñубботу'.split('_')
+ },
+
+ nounCase = (/\[ ?[Вв] ?(?:прошлую|Ñледующую)? ?\] ?dddd/).test(format) ?
+ 'accusative' :
+ 'nominative';
+
+ return weekdays[nounCase][m.day()];
+ }
+
+ return moment.lang('ru', {
+ months : monthsCaseReplace,
+ monthsShort : monthsShortCaseReplace,
+ weekdays : weekdaysCaseReplace,
+ weekdaysShort : "вÑ_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"),
+ weekdaysMin : "вÑ_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"),
+ monthsParse : [/^Ñнв/i, /^фев/i, /^мар/i, /^апр/i, /^ма[й|Ñ]/i, /^июн/i, /^июл/i, /^авг/i, /^Ñен/i, /^окт/i, /^ноÑ/i, /^дек/i],
+ longDateFormat : {
+ LT : "HH:mm",
+ L : "DD.MM.YYYY",
+ LL : "D MMMM YYYY г.",
+ LLL : "D MMMM YYYY г., LT",
+ LLLL : "dddd, D MMMM YYYY г., LT"
+ },
+ calendar : {
+ sameDay: '[Ð¡ÐµÐ³Ð¾Ð´Ð½Ñ Ð²] LT',
+ nextDay: '[Завтра в] LT',
+ lastDay: '[Вчера в] LT',
+ nextWeek: function () {
+ return this.day() === 2 ? '[Во] dddd [в] LT' : '[В] dddd [в] LT';
+ },
+ lastWeek: function () {
+ 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 : relativeTimeWithPlural,
+ mm : relativeTimeWithPlural,
+ h : "чаÑ",
+ hh : relativeTimeWithPlural,
+ d : "день",
+ dd : relativeTimeWithPlural,
+ M : "меÑÑц",
+ MM : relativeTimeWithPlural,
+ y : "год",
+ yy : relativeTimeWithPlural
+ },
+
+ // M. E.: those two are virtually unused but a user might want to implement them for his/her website for some reason
+
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 4) {
+ return "ночи";
+ } else if (hour < 12) {
+ return "утра";
+ } else if (hour < 17) {
+ return "днÑ";
+ } else {
+ return "вечера";
+ }
+ },
+
+ ordinal: function (number, period) {
+ switch (period) {
+ case 'M':
+ case 'd':
+ case 'DDD':
+ return number + '-й';
+ case 'D':
+ return number + '-го';
+ case 'w':
+ case 'W':
+ return number + '-Ñ';
+ default:
+ return number;
+ }
+ },
+
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : slovak (sk)
+// author : Martin Minka : https://github.com/k2s
+// based on work of petrbela : https://github.com/petrbela
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ var months = "január_február_marec_apríl_máj_jún_júl_august_september_október_november_december".split("_"),
+ monthsShort = "jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec".split("_");
+
+ function plural(n) {
+ return (n > 1) && (n < 5);
+ }
+
+ function translate(number, withoutSuffix, key, isFuture) {
+ var result = number + " ";
+ switch (key) {
+ case 's': // a few seconds / in a few seconds / a few seconds ago
+ return (withoutSuffix || isFuture) ? 'pár sekúnd' : 'pár sekundami';
+ case 'm': // a minute / in a minute / a minute ago
+ return withoutSuffix ? 'minúta' : (isFuture ? 'minútu' : 'minútou');
+ case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago
+ if (withoutSuffix || isFuture) {
+ return result + (plural(number) ? 'minúty' : 'minút');
+ } else {
+ return result + 'minútami';
+ }
+ break;
+ case 'h': // an hour / in an hour / an hour ago
+ return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou');
+ case 'hh': // 9 hours / in 9 hours / 9 hours ago
+ if (withoutSuffix || isFuture) {
+ return result + (plural(number) ? 'hodiny' : 'hodín');
+ } else {
+ return result + 'hodinami';
+ }
+ break;
+ case 'd': // a day / in a day / a day ago
+ return (withoutSuffix || isFuture) ? 'deň' : 'dňom';
+ case 'dd': // 9 days / in 9 days / 9 days ago
+ if (withoutSuffix || isFuture) {
+ return result + (plural(number) ? 'dni' : 'dní');
+ } else {
+ return result + 'dňami';
+ }
+ break;
+ case 'M': // a month / in a month / a month ago
+ return (withoutSuffix || isFuture) ? 'mesiac' : 'mesiacom';
+ case 'MM': // 9 months / in 9 months / 9 months ago
+ if (withoutSuffix || isFuture) {
+ return result + (plural(number) ? 'mesiace' : 'mesiacov');
+ } else {
+ return result + 'mesiacmi';
+ }
+ break;
+ case 'y': // a year / in a year / a year ago
+ return (withoutSuffix || isFuture) ? 'rok' : 'rokom';
+ case 'yy': // 9 years / in 9 years / 9 years ago
+ if (withoutSuffix || isFuture) {
+ return result + (plural(number) ? 'roky' : 'rokov');
+ } else {
+ return result + 'rokmi';
+ }
+ break;
+ }
+ }
+
+ return moment.lang('sk', {
+ months : months,
+ monthsShort : monthsShort,
+ monthsParse : (function (months, monthsShort) {
+ var i, _monthsParse = [];
+ for (i = 0; i < 12; i++) {
+ // use custom parser to solve problem with July (Äervenec)
+ _monthsParse[i] = new RegExp('^' + months[i] + '$|^' + monthsShort[i] + '$', 'i');
+ }
+ return _monthsParse;
+ }(months, monthsShort)),
+ weekdays : "nedeľa_pondelok_utorok_streda_štvrtok_piatok_sobota".split("_"),
+ weekdaysShort : "ne_po_ut_st_Å¡t_pi_so".split("_"),
+ weekdaysMin : "ne_po_ut_st_Å¡t_pi_so".split("_"),
+ longDateFormat : {
+ LT: "H:mm",
+ L : "DD.MM.YYYY",
+ LL : "D. MMMM YYYY",
+ LLL : "D. MMMM YYYY LT",
+ LLLL : "dddd D. MMMM YYYY LT"
+ },
+ calendar : {
+ sameDay: "[dnes o] LT",
+ nextDay: '[zajtra o] LT',
+ nextWeek: function () {
+ switch (this.day()) {
+ case 0:
+ return '[v nedeľu o] LT';
+ case 1:
+ case 2:
+ return '[v] dddd [o] LT';
+ case 3:
+ return '[v stredu o] LT';
+ case 4:
+ return '[vo Å¡tvrtok o] LT';
+ case 5:
+ return '[v piatok o] LT';
+ case 6:
+ return '[v sobotu o] LT';
+ }
+ },
+ lastDay: '[vÄera o] LT',
+ lastWeek: function () {
+ switch (this.day()) {
+ case 0:
+ return '[minulú nedeľu o] LT';
+ case 1:
+ case 2:
+ return '[minulý] dddd [o] LT';
+ case 3:
+ return '[minulú stredu o] LT';
+ case 4:
+ case 5:
+ return '[minulý] dddd [o] LT';
+ case 6:
+ return '[minulú sobotu o] LT';
+ }
+ },
+ sameElse: "L"
+ },
+ relativeTime : {
+ future : "za %s",
+ past : "pred %s",
+ s : translate,
+ m : translate,
+ mm : translate,
+ h : translate,
+ hh : translate,
+ d : translate,
+ dd : translate,
+ M : translate,
+ MM : translate,
+ y : translate,
+ yy : translate
+ },
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : slovenian (sl)
+// author : Robert Sedovšek : https://github.com/sedovsek
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ function translate(number, withoutSuffix, key) {
+ var result = number + " ";
+ switch (key) {
+ case 'm':
+ return withoutSuffix ? 'ena minuta' : 'eno minuto';
+ case 'mm':
+ if (number === 1) {
+ result += 'minuta';
+ } else if (number === 2) {
+ result += 'minuti';
+ } else if (number === 3 || number === 4) {
+ result += 'minute';
+ } else {
+ result += 'minut';
+ }
+ return result;
+ case 'h':
+ return withoutSuffix ? 'ena ura' : 'eno uro';
+ case 'hh':
+ if (number === 1) {
+ result += 'ura';
+ } else if (number === 2) {
+ result += 'uri';
+ } else if (number === 3 || number === 4) {
+ result += 'ure';
+ } else {
+ result += 'ur';
+ }
+ return result;
+ case 'dd':
+ if (number === 1) {
+ result += 'dan';
+ } else {
+ result += 'dni';
+ }
+ return result;
+ case 'MM':
+ if (number === 1) {
+ result += 'mesec';
+ } else if (number === 2) {
+ result += 'meseca';
+ } else if (number === 3 || number === 4) {
+ result += 'mesece';
+ } else {
+ result += 'mesecev';
+ }
+ return result;
+ case 'yy':
+ if (number === 1) {
+ result += 'leto';
+ } else if (number === 2) {
+ result += 'leti';
+ } else if (number === 3 || number === 4) {
+ result += 'leta';
+ } else {
+ result += 'let';
+ }
+ return result;
+ }
+ }
+
+ return moment.lang('sl', {
+ months : "januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december".split("_"),
+ monthsShort : "jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.".split("_"),
+ weekdays : "nedelja_ponedeljek_torek_sreda_Äetrtek_petek_sobota".split("_"),
+ weekdaysShort : "ned._pon._tor._sre._Äet._pet._sob.".split("_"),
+ weekdaysMin : "ne_po_to_sr_Äe_pe_so".split("_"),
+ longDateFormat : {
+ LT : "H:mm",
+ L : "DD. MM. YYYY",
+ LL : "D. MMMM YYYY",
+ LLL : "D. MMMM YYYY LT",
+ LLLL : "dddd, D. MMMM YYYY LT"
+ },
+ calendar : {
+ sameDay : '[danes ob] LT',
+ nextDay : '[jutri ob] LT',
+
+ nextWeek : function () {
+ switch (this.day()) {
+ case 0:
+ return '[v] [nedeljo] [ob] LT';
+ case 3:
+ return '[v] [sredo] [ob] LT';
+ case 6:
+ return '[v] [soboto] [ob] LT';
+ case 1:
+ case 2:
+ case 4:
+ case 5:
+ return '[v] dddd [ob] LT';
+ }
+ },
+ lastDay : '[vÄeraj ob] LT',
+ lastWeek : function () {
+ switch (this.day()) {
+ case 0:
+ case 3:
+ case 6:
+ return '[prejšnja] dddd [ob] LT';
+ case 1:
+ case 2:
+ case 4:
+ case 5:
+ return '[prejšnji] dddd [ob] LT';
+ }
+ },
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : "Äez %s",
+ past : "%s nazaj",
+ s : "nekaj sekund",
+ m : translate,
+ mm : translate,
+ h : translate,
+ hh : translate,
+ d : "en dan",
+ dd : translate,
+ M : "en mesec",
+ MM : translate,
+ y : "eno leto",
+ yy : translate
+ },
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : Albanian (sq)
+// author : Flakërim Ismani : https://github.com/flakerimi
+// author: Menelion Elensúle: https://github.com/Oire (tests)
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ return moment.lang('sq', {
+ months : "Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_Nëntor_Dhjetor".split("_"),
+ monthsShort : "Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_Nën_Dhj".split("_"),
+ weekdays : "E Diel_E Hënë_E Marte_E Mërkure_E Enjte_E Premte_E Shtunë".split("_"),
+ weekdaysShort : "Die_Hën_Mar_Mër_Enj_Pre_Sht".split("_"),
+ weekdaysMin : "D_H_Ma_Më_E_P_Sh".split("_"),
+ longDateFormat : {
+ LT : "HH:mm",
+ L : "DD/MM/YYYY",
+ LL : "D MMMM YYYY",
+ LLL : "D MMMM YYYY LT",
+ LLLL : "dddd, D MMMM YYYY LT"
+ },
+ calendar : {
+ sameDay : '[Sot në] LT',
+ nextDay : '[Neser në] LT',
+ nextWeek : 'dddd [në] LT',
+ lastDay : '[Dje në] LT',
+ lastWeek : 'dddd [e kaluar në] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : "në %s",
+ past : "%s me parë",
+ s : "disa seconda",
+ m : "një minut",
+ mm : "%d minutea",
+ h : "një orë",
+ hh : "%d orë",
+ d : "një ditë",
+ dd : "%d ditë",
+ M : "një muaj",
+ MM : "%d muaj",
+ y : "një vit",
+ yy : "%d vite"
+ },
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : swedish (sv)
+// author : Jens Alm : https://github.com/ulmus
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ return moment.lang('sv', {
+ months : "januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december".split("_"),
+ monthsShort : "jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),
+ weekdays : "söndag_måndag_tisdag_onsdag_torsdag_fredag_lördag".split("_"),
+ weekdaysShort : "sön_mån_tis_ons_tor_fre_lör".split("_"),
+ weekdaysMin : "sö_må_ti_on_to_fr_lö".split("_"),
+ longDateFormat : {
+ LT : "HH:mm",
+ L : "YYYY-MM-DD",
+ LL : "D MMMM YYYY",
+ LLL : "D MMMM YYYY LT",
+ LLLL : "dddd D MMMM YYYY LT"
+ },
+ calendar : {
+ sameDay: '[Idag] LT',
+ nextDay: '[Imorgon] LT',
+ lastDay: '[Igår] LT',
+ nextWeek: 'dddd LT',
+ lastWeek: '[Förra] dddd[en] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : "om %s",
+ past : "för %s sedan",
+ s : "några sekunder",
+ m : "en minut",
+ mm : "%d minuter",
+ h : "en timme",
+ hh : "%d timmar",
+ d : "en dag",
+ dd : "%d dagar",
+ M : "en månad",
+ MM : "%d månader",
+ y : "ett år",
+ yy : "%d år"
+ },
+ ordinal : function (number) {
+ var b = number % 10,
+ output = (~~ (number % 100 / 10) === 1) ? 'e' :
+ (b === 1) ? 'a' :
+ (b === 2) ? 'a' :
+ (b === 3) ? 'e' : 'e';
+ return number + output;
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : thai (th)
+// author : Kridsada Thanabulpong : https://github.com/sirn
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ return moment.lang('th', {
+ months : "มà¸à¸£à¸²à¸„ม_à¸à¸¸à¸¡à¸ à¸²à¸žà¸±à¸™à¸˜à¹Œ_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_à¸à¸£à¸à¸Žà¸²à¸„ม_สิงหาคม_à¸à¸±à¸™à¸¢à¸²à¸¢à¸™_ตุลาคม_พฤศจิà¸à¸²à¸¢à¸™_ธันวาคม".split("_"),
+ monthsShort : "มà¸à¸£à¸²_à¸à¸¸à¸¡à¸ à¸²_มีนา_เมษา_พฤษภา_มิถุนา_à¸à¸£à¸à¸Žà¸²_สิงหา_à¸à¸±à¸™à¸¢à¸²_ตุลา_พฤศจิà¸à¸²_ธันวา".split("_"),
+ weekdays : "อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุà¸à¸£à¹Œ_เสาร์".split("_"),
+ weekdaysShort : "อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุà¸à¸£à¹Œ_เสาร์".split("_"), // yes, three characters difference
+ weekdaysMin : "อา._จ._อ._พ._พฤ._ศ._ส.".split("_"),
+ longDateFormat : {
+ LT : "H นาฬิà¸à¸² m นาที",
+ L : "YYYY/MM/DD",
+ LL : "D MMMM YYYY",
+ LLL : "D MMMM YYYY เวลา LT",
+ LLLL : "วันddddที่ D MMMM YYYY เวลา LT"
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 12) {
+ return "à¸à¹ˆà¸­à¸™à¹€à¸—ี่ยง";
+ } else {
+ return "หลังเที่ยง";
+ }
+ },
+ 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 ปี"
+ }
+ });
+}));
+// moment.js language configuration
+// language : Tagalog/Filipino (tl-ph)
+// author : Dan Hagman
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ return moment.lang('tl-ph', {
+ months : "Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre".split("_"),
+ monthsShort : "Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis".split("_"),
+ weekdays : "Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado".split("_"),
+ weekdaysShort : "Lin_Lun_Mar_Miy_Huw_Biy_Sab".split("_"),
+ weekdaysMin : "Li_Lu_Ma_Mi_Hu_Bi_Sab".split("_"),
+ longDateFormat : {
+ LT : "HH:mm",
+ L : "MM/D/YYYY",
+ LL : "MMMM D, YYYY",
+ LLL : "MMMM D, YYYY LT",
+ LLLL : "dddd, MMMM DD, YYYY LT"
+ },
+ calendar : {
+ sameDay: "[Ngayon sa] LT",
+ nextDay: '[Bukas sa] LT',
+ nextWeek: 'dddd [sa] LT',
+ lastDay: '[Kahapon sa] LT',
+ lastWeek: 'dddd [huling linggo] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : "sa loob ng %s",
+ past : "%s ang nakalipas",
+ s : "ilang segundo",
+ m : "isang minuto",
+ mm : "%d minuto",
+ h : "isang oras",
+ hh : "%d oras",
+ d : "isang araw",
+ dd : "%d araw",
+ M : "isang buwan",
+ MM : "%d buwan",
+ y : "isang taon",
+ yy : "%d taon"
+ },
+ ordinal : function (number) {
+ return number;
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : turkish (tr)
+// authors : Erhan Gundogan : https://github.com/erhangundogan,
+// Burak YiÄŸit Kaya: https://github.com/BYK
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+
+ var suffixes = {
+ 1: "'inci",
+ 5: "'inci",
+ 8: "'inci",
+ 70: "'inci",
+ 80: "'inci",
+
+ 2: "'nci",
+ 7: "'nci",
+ 20: "'nci",
+ 50: "'nci",
+
+ 3: "'üncü",
+ 4: "'üncü",
+ 100: "'üncü",
+
+ 6: "'ncı",
+
+ 9: "'uncu",
+ 10: "'uncu",
+ 30: "'uncu",
+
+ 60: "'ıncı",
+ 90: "'ıncı"
+ };
+
+ return moment.lang('tr', {
+ months : "Ocak_Şubat_Mart_Nisan_Mayıs_Haziran_Temmuz_Ağustos_Eylül_Ekim_Kasım_Aralık".split("_"),
+ monthsShort : "Oca_Åžub_Mar_Nis_May_Haz_Tem_AÄŸu_Eyl_Eki_Kas_Ara".split("_"),
+ weekdays : "Pazar_Pazartesi_Salı_Çarşamba_Perşembe_Cuma_Cumartesi".split("_"),
+ weekdaysShort : "Paz_Pts_Sal_Çar_Per_Cum_Cts".split("_"),
+ weekdaysMin : "Pz_Pt_Sa_Ça_Pe_Cu_Ct".split("_"),
+ longDateFormat : {
+ LT : "HH:mm",
+ L : "DD.MM.YYYY",
+ LL : "D MMMM YYYY",
+ LLL : "D MMMM YYYY LT",
+ LLLL : "dddd, D MMMM YYYY LT"
+ },
+ calendar : {
+ sameDay : '[bugün saat] LT',
+ nextDay : '[yarın saat] LT',
+ nextWeek : '[haftaya] dddd [saat] LT',
+ lastDay : '[dün] LT',
+ lastWeek : '[geçen hafta] dddd [saat] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : "%s sonra",
+ past : "%s önce",
+ s : "birkaç saniye",
+ m : "bir dakika",
+ mm : "%d dakika",
+ h : "bir saat",
+ hh : "%d saat",
+ d : "bir gün",
+ dd : "%d gün",
+ M : "bir ay",
+ MM : "%d ay",
+ y : "bir yıl",
+ yy : "%d yıl"
+ },
+ ordinal : function (number) {
+ if (number === 0) { // special case for zero
+ return number + "'ıncı";
+ }
+ var a = number % 10,
+ b = number % 100 - a,
+ c = number >= 100 ? 100 : null;
+
+ return number + (suffixes[a] || suffixes[b] || suffixes[c]);
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : Morocco Central Atlas Tamaziɣt in Latin (tzm-la)
+// author : Abdel Said : https://github.com/abdelsaid
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ return moment.lang('tzm-la', {
+ months : "innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir".split("_"),
+ monthsShort : "innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir".split("_"),
+ weekdays : "asamas_aynas_asinas_akras_akwas_asimwas_asiá¸yas".split("_"),
+ weekdaysShort : "asamas_aynas_asinas_akras_akwas_asimwas_asiá¸yas".split("_"),
+ weekdaysMin : "asamas_aynas_asinas_akras_akwas_asimwas_asiá¸yas".split("_"),
+ longDateFormat : {
+ LT : "HH:mm",
+ L : "DD/MM/YYYY",
+ LL : "D MMMM YYYY",
+ LLL : "D MMMM YYYY LT",
+ LLLL : "dddd D MMMM YYYY LT"
+ },
+ calendar : {
+ sameDay: "[asdkh g] LT",
+ nextDay: '[aska g] LT',
+ nextWeek: 'dddd [g] LT',
+ lastDay: '[assant g] LT',
+ lastWeek: 'dddd [g] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : "dadkh s yan %s",
+ past : "yan %s",
+ s : "imik",
+ m : "minuá¸",
+ mm : "%d minuá¸",
+ h : "saɛa",
+ hh : "%d tassaɛin",
+ d : "ass",
+ dd : "%d ossan",
+ M : "ayowr",
+ MM : "%d iyyirn",
+ y : "asgas",
+ yy : "%d isgasn"
+ },
+ week : {
+ dow : 6, // Saturday is the first day of the week.
+ doy : 12 // The week that contains Jan 1st is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : Morocco Central Atlas Tamaziɣt (tzm)
+// author : Abdel Said : https://github.com/abdelsaid
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ return moment.lang('tzm', {
+ months : "ⵉâµâµâ´°âµ¢âµ”_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓâµâµ¢âµ“_ⵢⵓâµâµ¢âµ“âµ£_ⵖⵓⵛⵜ_ⵛⵓⵜⴰâµâ´±âµ‰âµ”_ⴽⵟⵓⴱⵕ_âµâµ“ⵡⴰâµâ´±âµ‰âµ”_ⴷⵓⵊâµâ´±âµ‰âµ”".split("_"),
+ monthsShort : "ⵉâµâµâ´°âµ¢âµ”_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓâµâµ¢âµ“_ⵢⵓâµâµ¢âµ“âµ£_ⵖⵓⵛⵜ_ⵛⵓⵜⴰâµâ´±âµ‰âµ”_ⴽⵟⵓⴱⵕ_âµâµ“ⵡⴰâµâ´±âµ‰âµ”_ⴷⵓⵊâµâ´±âµ‰âµ”".split("_"),
+ weekdays : "ⴰⵙⴰⵎⴰⵙ_â´°âµ¢âµâ´°âµ™_ⴰⵙⵉâµâ´°âµ™_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"),
+ weekdaysShort : "ⴰⵙⴰⵎⴰⵙ_â´°âµ¢âµâ´°âµ™_ⴰⵙⵉâµâ´°âµ™_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"),
+ weekdaysMin : "ⴰⵙⴰⵎⴰⵙ_â´°âµ¢âµâ´°âµ™_ⴰⵙⵉâµâ´°âµ™_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"),
+ longDateFormat : {
+ LT : "HH:mm",
+ L : "DD/MM/YYYY",
+ LL : "D MMMM YYYY",
+ LLL : "D MMMM YYYY LT",
+ LLLL : "dddd D MMMM YYYY LT"
+ },
+ 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 : "%d ⵜⴰⵙⵙⴰⵄⵉâµ",
+ d : "ⴰⵙⵙ",
+ dd : "%d oⵙⵙⴰâµ",
+ M : "ⴰⵢoⵓⵔ",
+ MM : "%d ⵉⵢⵢⵉⵔâµ",
+ y : "ⴰⵙⴳⴰⵙ",
+ yy : "%d ⵉⵙⴳⴰⵙâµ"
+ },
+ week : {
+ dow : 6, // Saturday is the first day of the week.
+ doy : 12 // The week that contains Jan 1st is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : ukrainian (uk)
+// author : zemlanin : https://github.com/zemlanin
+// Author : Menelion Elensúle : https://github.com/Oire
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ function plural(word, num) {
+ var forms = word.split('_');
+ return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]);
+ }
+
+ function relativeTimeWithPlural(number, withoutSuffix, key) {
+ var format = {
+ 'mm': 'хвилина_хвилини_хвилин',
+ 'hh': 'година_години_годин',
+ 'dd': 'день_дні_днів',
+ 'MM': 'міÑÑць_міÑÑці_міÑÑців',
+ 'yy': 'рік_роки_років'
+ };
+ if (key === 'm') {
+ return withoutSuffix ? 'хвилина' : 'хвилину';
+ }
+ else if (key === 'h') {
+ return withoutSuffix ? 'година' : 'годину';
+ }
+ else {
+ return number + ' ' + plural(format[key], +number);
+ }
+ }
+
+ function monthsCaseReplace(m, format) {
+ var months = {
+ 'nominative': 'Ñічень_лютий_березень_квітень_травень_червень_липень_Ñерпень_вереÑень_жовтень_лиÑтопад_грудень'.split('_'),
+ 'accusative': 'ÑічнÑ_лютого_березнÑ_квітнÑ_травнÑ_червнÑ_липнÑ_ÑерпнÑ_вереÑнÑ_жовтнÑ_лиÑтопада_груднÑ'.split('_')
+ },
+
+ nounCase = (/D[oD]? *MMMM?/).test(format) ?
+ 'accusative' :
+ 'nominative';
+
+ return months[nounCase][m.month()];
+ }
+
+ function weekdaysCaseReplace(m, format) {
+ var weekdays = {
+ 'nominative': 'неділÑ_понеділок_вівторок_Ñереда_четвер_п’ÑтницÑ_Ñубота'.split('_'),
+ 'accusative': 'неділю_понеділок_вівторок_Ñереду_четвер_п’Ñтницю_Ñуботу'.split('_'),
+ 'genitive': 'неділі_понеділка_вівторка_Ñереди_четверга_п’Ñтниці_Ñуботи'.split('_')
+ },
+
+ nounCase = (/(\[[ВвУу]\]) ?dddd/).test(format) ?
+ 'accusative' :
+ ((/\[?(?:минулої|наÑтупної)? ?\] ?dddd/).test(format) ?
+ 'genitive' :
+ 'nominative');
+
+ return weekdays[nounCase][m.day()];
+ }
+
+ function processHoursFunction(str) {
+ return function () {
+ return str + 'о' + (this.hours() === 11 ? 'б' : '') + '] LT';
+ };
+ }
+
+ return moment.lang('uk', {
+ months : monthsCaseReplace,
+ monthsShort : "Ñіч_лют_бер_квіт_трав_черв_лип_Ñерп_вер_жовт_лиÑÑ‚_груд".split("_"),
+ weekdays : weekdaysCaseReplace,
+ weekdaysShort : "нд_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"),
+ weekdaysMin : "нд_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"),
+ longDateFormat : {
+ LT : "HH:mm",
+ L : "DD.MM.YYYY",
+ LL : "D MMMM YYYY р.",
+ LLL : "D MMMM YYYY р., LT",
+ LLLL : "dddd, D MMMM YYYY р., LT"
+ },
+ calendar : {
+ sameDay: processHoursFunction('[Сьогодні '),
+ nextDay: processHoursFunction('[Завтра '),
+ lastDay: processHoursFunction('[Вчора '),
+ nextWeek: processHoursFunction('[У] dddd ['),
+ lastWeek: function () {
+ switch (this.day()) {
+ case 0:
+ case 3:
+ case 5:
+ case 6:
+ return processHoursFunction('[Минулої] dddd [').call(this);
+ case 1:
+ case 2:
+ case 4:
+ return processHoursFunction('[Минулого] dddd [').call(this);
+ }
+ },
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : "за %s",
+ past : "%s тому",
+ s : "декілька Ñекунд",
+ m : relativeTimeWithPlural,
+ mm : relativeTimeWithPlural,
+ h : "годину",
+ hh : relativeTimeWithPlural,
+ d : "день",
+ dd : relativeTimeWithPlural,
+ M : "міÑÑць",
+ MM : relativeTimeWithPlural,
+ y : "рік",
+ yy : relativeTimeWithPlural
+ },
+
+ // M. E.: those two are virtually unused but a user might want to implement them for his/her website for some reason
+
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 4) {
+ return "ночі";
+ } else if (hour < 12) {
+ return "ранку";
+ } else if (hour < 17) {
+ return "днÑ";
+ } else {
+ return "вечора";
+ }
+ },
+
+ ordinal: function (number, period) {
+ switch (period) {
+ case 'M':
+ case 'd':
+ case 'DDD':
+ case 'w':
+ case 'W':
+ return number + '-й';
+ case 'D':
+ return number + '-го';
+ default:
+ return number;
+ }
+ },
+
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : uzbek
+// author : Sardor Muminov : https://github.com/muminoff
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ return moment.lang('uz', {
+ months : "Ñнварь_февраль_март_апрель_май_июнь_июль_авгуÑÑ‚_ÑентÑбрь_октÑбрь_ноÑбрь_декабрь".split("_"),
+ monthsShort : "Ñнв_фев_мар_апр_май_июн_июл_авг_Ñен_окт_ноÑ_дек".split("_"),
+ weekdays : "Якшанба_Душанба_Сешанба_Чоршанба_Пайшанба_Жума_Шанба".split("_"),
+ weekdaysShort : "Якш_Душ_Сеш_Чор_Пай_Жум_Шан".split("_"),
+ weekdaysMin : "Як_Ду_Се_Чо_Па_Жу_Ша".split("_"),
+ longDateFormat : {
+ LT : "HH:mm",
+ L : "DD/MM/YYYY",
+ LL : "D MMMM YYYY",
+ LLL : "D MMMM YYYY LT",
+ LLLL : "D MMMM YYYY, dddd LT"
+ },
+ 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 : "%d Ñоат",
+ d : "бир кун",
+ dd : "%d кун",
+ M : "бир ой",
+ MM : "%d ой",
+ y : "бир йил",
+ yy : "%d йил"
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 4th is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : vietnamese (vn)
+// author : Bang Nguyen : https://github.com/bangnk
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ return moment.lang('vn', {
+ months : "tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12".split("_"),
+ monthsShort : "Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12".split("_"),
+ weekdays : "chủ nhật_thứ hai_thứ ba_thứ tư_thứ năm_thứ sáu_thứ bảy".split("_"),
+ weekdaysShort : "CN_T2_T3_T4_T5_T6_T7".split("_"),
+ weekdaysMin : "CN_T2_T3_T4_T5_T6_T7".split("_"),
+ longDateFormat : {
+ LT : "HH:mm",
+ L : "DD/MM/YYYY",
+ LL : "D MMMM [năm] YYYY",
+ LLL : "D MMMM [năm] YYYY LT",
+ LLLL : "dddd, D MMMM [năm] YYYY LT",
+ l : "DD/M/YYYY",
+ ll : "D MMM YYYY",
+ lll : "D MMM YYYY LT",
+ llll : "ddd, D MMM YYYY LT"
+ },
+ calendar : {
+ sameDay: "[Hôm nay lúc] LT",
+ nextDay: '[Ngày mai lúc] LT',
+ nextWeek: 'dddd [tuần tới lúc] LT',
+ lastDay: '[Hôm qua lúc] LT',
+ lastWeek: 'dddd [tuần rồi lúc] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : "%s tá»›i",
+ past : "%s trÆ°á»›c",
+ s : "vài giây",
+ m : "một phút",
+ mm : "%d phút",
+ h : "má»™t giá»",
+ hh : "%d giá»",
+ d : "một ngày",
+ dd : "%d ngày",
+ M : "một tháng",
+ MM : "%d tháng",
+ y : "một năm",
+ yy : "%d năm"
+ },
+ ordinal : function (number) {
+ return number;
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : chinese
+// author : suupic : https://github.com/suupic
+// author : Zeno Zeng : https://github.com/zenozeng
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ return moment.lang('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",
+ L : "YYYYå¹´MMMDæ—¥",
+ LL : "YYYYå¹´MMMDæ—¥",
+ LLL : "YYYYå¹´MMMDæ—¥LT",
+ LLLL : "YYYYå¹´MMMDæ—¥ddddLT",
+ l : "YYYYå¹´MMMDæ—¥",
+ ll : "YYYYå¹´MMMDæ—¥",
+ lll : "YYYYå¹´MMMDæ—¥LT",
+ llll : "YYYYå¹´MMMDæ—¥ddddLT"
+ },
+ meridiem : function (hour, minute, isLower) {
+ var hm = hour * 100 + minute;
+ if (hm < 600) {
+ return "凌晨";
+ } else if (hm < 900) {
+ return "早上";
+ } else if (hm < 1130) {
+ return "上åˆ";
+ } else if (hm < 1230) {
+ return "中åˆ";
+ } else if (hm < 1800) {
+ return "下åˆ";
+ } else {
+ return "晚上";
+ }
+ },
+ 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 startOfWeek, prefix;
+ startOfWeek = moment().startOf('week');
+ prefix = this.unix() - startOfWeek.unix() >= 7 * 24 * 3600 ? '[下]' : '[本]';
+ return this.minutes() === 0 ? prefix + "dddAh点整" : prefix + "dddAh点mm";
+ },
+ lastWeek : function () {
+ var startOfWeek, prefix;
+ startOfWeek = moment().startOf('week');
+ prefix = this.unix() < startOfWeek.unix() ? '[上]' : '[本]';
+ return this.minutes() === 0 ? prefix + "dddAh点整" : prefix + "dddAh点mm";
+ },
+ sameElse : 'L'
+ },
+ ordinal : function (number, period) {
+ switch (period) {
+ case "d":
+ case "D":
+ case "DDD":
+ return number + "æ—¥";
+ case "M":
+ return number + "月";
+ case "w":
+ case "W":
+ return number + "周";
+ default:
+ return number;
+ }
+ },
+ 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 : {
+ // GB/T 7408-1994《数æ®å…ƒå’Œäº¤æ¢æ ¼å¼Â·ä¿¡æ¯äº¤æ¢Â·æ—¥æœŸå’Œæ—¶é—´è¡¨ç¤ºæ³•ã€‹ä¸ŽISO 8601:1988等效
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : traditional chinese (zh-tw)
+// author : Ben : https://github.com/ben-lin
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ return moment.lang('zh-tw', {
+ 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",
+ L : "YYYYå¹´MMMDæ—¥",
+ LL : "YYYYå¹´MMMDæ—¥",
+ LLL : "YYYYå¹´MMMDæ—¥LT",
+ LLLL : "YYYYå¹´MMMDæ—¥ddddLT",
+ l : "YYYYå¹´MMMDæ—¥",
+ ll : "YYYYå¹´MMMDæ—¥",
+ lll : "YYYYå¹´MMMDæ—¥LT",
+ llll : "YYYYå¹´MMMDæ—¥ddddLT"
+ },
+ meridiem : function (hour, minute, isLower) {
+ var hm = hour * 100 + minute;
+ if (hm < 900) {
+ return "早上";
+ } else if (hm < 1130) {
+ return "上åˆ";
+ } else if (hm < 1230) {
+ return "中åˆ";
+ } else if (hm < 1800) {
+ return "下åˆ";
+ } else {
+ return "晚上";
+ }
+ },
+ calendar : {
+ sameDay : '[今天]LT',
+ nextDay : '[明天]LT',
+ nextWeek : '[下]ddddLT',
+ lastDay : '[昨天]LT',
+ lastWeek : '[上]ddddLT',
+ sameElse : 'L'
+ },
+ ordinal : function (number, period) {
+ switch (period) {
+ case "d" :
+ case "D" :
+ case "DDD" :
+ return number + "æ—¥";
+ case "M" :
+ return number + "月";
+ case "w" :
+ case "W" :
+ return number + "週";
+ default :
+ return number;
+ }
+ },
+ relativeTime : {
+ future : "%så…§",
+ past : "%så‰",
+ s : "幾秒",
+ m : "一分é˜",
+ mm : "%d分é˜",
+ h : "一å°æ™‚",
+ hh : "%då°æ™‚",
+ d : "一天",
+ dd : "%d天",
+ M : "一個月",
+ MM : "%d個月",
+ y : "一年",
+ yy : "%då¹´"
+ }
+ });
+}));
+
+ moment.lang('en');
+
+
+ /************************************
+ Exposing Moment
+ ************************************/
+
+ function makeGlobal(deprecate) {
+ var warned = false, local_moment = moment;
+ /*global ender:false */
+ if (typeof ender !== 'undefined') {
+ return;
+ }
+ // here, `this` means `window` in the browser, or `global` on the server
+ // add `moment` as a global object via a string identifier,
+ // for Closure Compiler "advanced" mode
+ if (deprecate) {
+ this.moment = function () {
+ if (!warned && console && console.warn) {
+ warned = true;
+ console.warn(
+ "Accessing Moment through the global scope is " +
+ "deprecated, and will be removed in an upcoming " +
+ "release.");
+ }
+ return local_moment.apply(null, arguments);
+ };
+ } else {
+ this['moment'] = moment;
+ }
+ }
+
+ // CommonJS module is defined
+ if (hasModule) {
+ module.exports = moment;
+ makeGlobal(true);
+ } else if (typeof define === "function" && define.amd) {
+ define("moment", function (require, exports, module) {
+ if (module.config().noGlobal !== true) {
+ // If user provided noGlobal, he is aware of global
+ makeGlobal(module.config().noGlobal === undefined);
+ }
+
+ return moment;
+ });
+ } else {
+ makeGlobal();
+ }
+}).call(this);
diff --git a/library/bootstrap/css/bootstrap-theme.css b/library/bootstrap/css/bootstrap-theme.css
new file mode 100644
index 000000000..df2d3d967
--- /dev/null
+++ b/library/bootstrap/css/bootstrap-theme.css
@@ -0,0 +1,397 @@
+/*!
+ * Bootstrap v3.0.3 (http://getbootstrap.com)
+ * Copyright 2013 Twitter, Inc.
+ * Licensed under http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+.btn-default,
+.btn-primary,
+.btn-success,
+.btn-info,
+.btn-warning,
+.btn-danger {
+ text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);
+ -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);
+}
+
+.btn-default:active,
+.btn-primary:active,
+.btn-success:active,
+.btn-info:active,
+.btn-warning:active,
+.btn-danger:active,
+.btn-default.active,
+.btn-primary.active,
+.btn-success.active,
+.btn-info.active,
+.btn-warning.active,
+.btn-danger.active {
+ -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+}
+
+.btn:active,
+.btn.active {
+ background-image: none;
+}
+
+.btn-default {
+ text-shadow: 0 1px 0 #fff;
+ background-image: -webkit-linear-gradient(top, #ffffff 0%, #e0e0e0 100%);
+ background-image: linear-gradient(to bottom, #ffffff 0%, #e0e0e0 100%);
+ background-repeat: repeat-x;
+ border-color: #dbdbdb;
+ border-color: #ccc;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+}
+
+.btn-default:hover,
+.btn-default:focus {
+ background-color: #e0e0e0;
+ background-position: 0 -15px;
+}
+
+.btn-default:active,
+.btn-default.active {
+ background-color: #e0e0e0;
+ border-color: #dbdbdb;
+}
+
+.btn-primary {
+ background-image: -webkit-linear-gradient(top, #428bca 0%, #2d6ca2 100%);
+ background-image: linear-gradient(to bottom, #428bca 0%, #2d6ca2 100%);
+ background-repeat: repeat-x;
+ border-color: #2b669a;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff2d6ca2', GradientType=0);
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+}
+
+.btn-primary:hover,
+.btn-primary:focus {
+ background-color: #2d6ca2;
+ background-position: 0 -15px;
+}
+
+.btn-primary:active,
+.btn-primary.active {
+ background-color: #2d6ca2;
+ border-color: #2b669a;
+}
+
+.btn-success {
+ background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);
+ background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%);
+ background-repeat: repeat-x;
+ border-color: #3e8f3e;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+}
+
+.btn-success:hover,
+.btn-success:focus {
+ background-color: #419641;
+ background-position: 0 -15px;
+}
+
+.btn-success:active,
+.btn-success.active {
+ background-color: #419641;
+ border-color: #3e8f3e;
+}
+
+.btn-warning {
+ background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);
+ background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);
+ background-repeat: repeat-x;
+ border-color: #e38d13;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+}
+
+.btn-warning:hover,
+.btn-warning:focus {
+ background-color: #eb9316;
+ background-position: 0 -15px;
+}
+
+.btn-warning:active,
+.btn-warning.active {
+ background-color: #eb9316;
+ border-color: #e38d13;
+}
+
+.btn-danger {
+ background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);
+ background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);
+ background-repeat: repeat-x;
+ border-color: #b92c28;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+}
+
+.btn-danger:hover,
+.btn-danger:focus {
+ background-color: #c12e2a;
+ background-position: 0 -15px;
+}
+
+.btn-danger:active,
+.btn-danger.active {
+ background-color: #c12e2a;
+ border-color: #b92c28;
+}
+
+.btn-info {
+ background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);
+ background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);
+ background-repeat: repeat-x;
+ border-color: #28a4c9;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+}
+
+.btn-info:hover,
+.btn-info:focus {
+ background-color: #2aabd2;
+ background-position: 0 -15px;
+}
+
+.btn-info:active,
+.btn-info.active {
+ background-color: #2aabd2;
+ border-color: #28a4c9;
+}
+
+.thumbnail,
+.img-thumbnail {
+ -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);
+}
+
+.dropdown-menu > li > a:hover,
+.dropdown-menu > li > a:focus {
+ background-color: #e8e8e8;
+ background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
+ background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);
+}
+
+.dropdown-menu > .active > a,
+.dropdown-menu > .active > a:hover,
+.dropdown-menu > .active > a:focus {
+ background-color: #357ebd;
+ background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%);
+ background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0);
+}
+
+.navbar-default {
+ background-image: -webkit-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);
+ background-image: linear-gradient(to bottom, #ffffff 0%, #f8f8f8 100%);
+ background-repeat: repeat-x;
+ border-radius: 4px;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+ -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);
+}
+
+.navbar-default .navbar-nav > .active > a {
+ background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f3f3f3 100%);
+ background-image: linear-gradient(to bottom, #ebebeb 0%, #f3f3f3 100%);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff3f3f3', GradientType=0);
+ -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);
+ box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);
+}
+
+.navbar-brand,
+.navbar-nav > li > a {
+ text-shadow: 0 1px 0 rgba(255, 255, 255, 0.25);
+}
+
+.navbar-inverse {
+ background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222222 100%);
+ background-image: linear-gradient(to bottom, #3c3c3c 0%, #222222 100%);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+}
+
+.navbar-inverse .navbar-nav > .active > a {
+ background-image: -webkit-linear-gradient(top, #222222 0%, #282828 100%);
+ background-image: linear-gradient(to bottom, #222222 0%, #282828 100%);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff282828', GradientType=0);
+ -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);
+ box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);
+}
+
+.navbar-inverse .navbar-brand,
+.navbar-inverse .navbar-nav > li > a {
+ text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+}
+
+.navbar-static-top,
+.navbar-fixed-top,
+.navbar-fixed-bottom {
+ border-radius: 0;
+}
+
+.alert {
+ text-shadow: 0 1px 0 rgba(255, 255, 255, 0.2);
+ -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);
+}
+
+.alert-success {
+ background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);
+ background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);
+ background-repeat: repeat-x;
+ border-color: #b2dba1;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);
+}
+
+.alert-info {
+ background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);
+ background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);
+ background-repeat: repeat-x;
+ border-color: #9acfea;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);
+}
+
+.alert-warning {
+ background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);
+ background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);
+ background-repeat: repeat-x;
+ border-color: #f5e79e;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);
+}
+
+.alert-danger {
+ background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);
+ background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);
+ background-repeat: repeat-x;
+ border-color: #dca7a7;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);
+}
+
+.progress {
+ background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);
+ background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);
+}
+
+.progress-bar {
+ background-image: -webkit-linear-gradient(top, #428bca 0%, #3071a9 100%);
+ background-image: linear-gradient(to bottom, #428bca 0%, #3071a9 100%);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0);
+}
+
+.progress-bar-success {
+ background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);
+ background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);
+}
+
+.progress-bar-info {
+ background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);
+ background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);
+}
+
+.progress-bar-warning {
+ background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);
+ background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);
+}
+
+.progress-bar-danger {
+ background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);
+ background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);
+}
+
+.list-group {
+ border-radius: 4px;
+ -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);
+}
+
+.list-group-item.active,
+.list-group-item.active:hover,
+.list-group-item.active:focus {
+ text-shadow: 0 -1px 0 #3071a9;
+ background-image: -webkit-linear-gradient(top, #428bca 0%, #3278b3 100%);
+ background-image: linear-gradient(to bottom, #428bca 0%, #3278b3 100%);
+ background-repeat: repeat-x;
+ border-color: #3278b3;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3278b3', GradientType=0);
+}
+
+.panel {
+ -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
+}
+
+.panel-default > .panel-heading {
+ background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
+ background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);
+}
+
+.panel-primary > .panel-heading {
+ background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%);
+ background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0);
+}
+
+.panel-success > .panel-heading {
+ background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);
+ background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);
+}
+
+.panel-info > .panel-heading {
+ background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);
+ background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);
+}
+
+.panel-warning > .panel-heading {
+ background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);
+ background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);
+}
+
+.panel-danger > .panel-heading {
+ background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);
+ background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);
+}
+
+.well {
+ background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);
+ background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);
+ background-repeat: repeat-x;
+ border-color: #dcdcdc;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);
+ -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);
+ box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);
+} \ No newline at end of file
diff --git a/library/bootstrap/css/bootstrap-theme.min.css b/library/bootstrap/css/bootstrap-theme.min.css
new file mode 100644
index 000000000..c7b6d39b4
--- /dev/null
+++ b/library/bootstrap/css/bootstrap-theme.min.css
@@ -0,0 +1,7 @@
+/*!
+ * Bootstrap v3.0.3 (http://getbootstrap.com)
+ * Copyright 2013 Twitter, Inc.
+ * Licensed under http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+.btn-default,.btn-primary,.btn-success,.btn-info,.btn-warning,.btn-danger{text-shadow:0 -1px 0 rgba(0,0,0,0.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 1px rgba(0,0,0,0.075)}.btn-default:active,.btn-primary:active,.btn-success:active,.btn-info:active,.btn-warning:active,.btn-danger:active,.btn-default.active,.btn-primary.active,.btn-success.active,.btn-info.active,.btn-warning.active,.btn-danger.active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn:active,.btn.active{background-image:none}.btn-default{text-shadow:0 1px 0 #fff;background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%);background-repeat:repeat-x;border-color:#dbdbdb;border-color:#ccc;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffe0e0e0',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-default:hover,.btn-default:focus{background-color:#e0e0e0;background-position:0 -15px}.btn-default:active,.btn-default.active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-primary{background-image:-webkit-linear-gradient(top,#428bca 0,#2d6ca2 100%);background-image:linear-gradient(to bottom,#428bca 0,#2d6ca2 100%);background-repeat:repeat-x;border-color:#2b669a;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff2d6ca2',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:focus{background-color:#2d6ca2;background-position:0 -15px}.btn-primary:active,.btn-primary.active{background-color:#2d6ca2;border-color:#2b669a}.btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);background-repeat:repeat-x;border-color:#3e8f3e;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c',endColorstr='#ff419641',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:focus{background-color:#419641;background-position:0 -15px}.btn-success:active,.btn-success.active{background-color:#419641;border-color:#3e8f3e}.btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);background-repeat:repeat-x;border-color:#e38d13;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e',endColorstr='#ffeb9316',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:focus{background-color:#eb9316;background-position:0 -15px}.btn-warning:active,.btn-warning.active{background-color:#eb9316;border-color:#e38d13}.btn-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:linear-gradient(to bottom,#d9534f 0,#c12e2a 100%);background-repeat:repeat-x;border-color:#b92c28;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f',endColorstr='#ffc12e2a',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:focus{background-color:#c12e2a;background-position:0 -15px}.btn-danger:active,.btn-danger.active{background-color:#c12e2a;border-color:#b92c28}.btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);background-repeat:repeat-x;border-color:#28a4c9;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff2aabd2',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-info:hover,.btn-info:focus{background-color:#2aabd2;background-position:0 -15px}.btn-info:active,.btn-info.active{background-color:#2aabd2;border-color:#28a4c9}.thumbnail,.img-thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.075);box-shadow:0 1px 2px rgba(0,0,0,0.075)}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{background-color:#e8e8e8;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#ffe8e8e8',GradientType=0)}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{background-color:#357ebd;background-image:-webkit-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:linear-gradient(to bottom,#428bca 0,#357ebd 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff357ebd',GradientType=0)}.navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);background-repeat:repeat-x;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#fff8f8f8',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 5px rgba(0,0,0,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 5px rgba(0,0,0,0.075)}.navbar-default .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f3f3f3 100%);background-image:linear-gradient(to bottom,#ebebeb 0,#f3f3f3 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb',endColorstr='#fff3f3f3',GradientType=0);-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,0.075);box-shadow:inset 0 3px 9px rgba(0,0,0,0.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,0.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c',endColorstr='#ff222222',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.navbar-inverse .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top,#222 0,#282828 100%);background-image:linear-gradient(to bottom,#222 0,#282828 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222',endColorstr='#ff282828',GradientType=0);-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,0.25);box-shadow:inset 0 3px 9px rgba(0,0,0,0.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-static-top,.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}.alert{text-shadow:0 1px 0 rgba(255,255,255,0.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.25),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.25),0 1px 2px rgba(0,0,0,0.05)}.alert-success{background-image:-webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);background-repeat:repeat-x;border-color:#b2dba1;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8',endColorstr='#ffc8e5bc',GradientType=0)}.alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);background-repeat:repeat-x;border-color:#9acfea;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7',endColorstr='#ffb9def0',GradientType=0)}.alert-warning{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);background-repeat:repeat-x;border-color:#f5e79e;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3',endColorstr='#fff8efc0',GradientType=0)}.alert-danger{background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);background-repeat:repeat-x;border-color:#dca7a7;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede',endColorstr='#ffe7c3c3',GradientType=0)}.progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb',endColorstr='#fff5f5f5',GradientType=0)}.progress-bar{background-image:-webkit-linear-gradient(top,#428bca 0,#3071a9 100%);background-image:linear-gradient(to bottom,#428bca 0,#3071a9 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff3071a9',GradientType=0)}.progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c',endColorstr='#ff449d44',GradientType=0)}.progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff31b0d5',GradientType=0)}.progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e',endColorstr='#ffec971f',GradientType=0)}.progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f',endColorstr='#ffc9302c',GradientType=0)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.075);box-shadow:0 1px 2px rgba(0,0,0,0.075)}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{text-shadow:0 -1px 0 #3071a9;background-image:-webkit-linear-gradient(top,#428bca 0,#3278b3 100%);background-image:linear-gradient(to bottom,#428bca 0,#3278b3 100%);background-repeat:repeat-x;border-color:#3278b3;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff3278b3',GradientType=0)}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#ffe8e8e8',GradientType=0)}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:linear-gradient(to bottom,#428bca 0,#357ebd 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff357ebd',GradientType=0)}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8',endColorstr='#ffd0e9c6',GradientType=0)}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7',endColorstr='#ffc4e3f3',GradientType=0)}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3',endColorstr='#fffaf2cc',GradientType=0)}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede',endColorstr='#ffebcccc',GradientType=0)}.well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);background-repeat:repeat-x;border-color:#dcdcdc;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8',endColorstr='#fff5f5f5',GradientType=0);-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,0.05),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 3px rgba(0,0,0,0.05),0 1px 0 rgba(255,255,255,0.1)} \ No newline at end of file
diff --git a/library/bootstrap/css/bootstrap.css b/library/bootstrap/css/bootstrap.css
new file mode 100644
index 000000000..377dff300
--- /dev/null
+++ b/library/bootstrap/css/bootstrap.css
@@ -0,0 +1,7118 @@
+/*!
+ * Bootstrap v3.0.3 (http://getbootstrap.com)
+ * Copyright 2013 Twitter, Inc.
+ * Licensed under http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+/*! normalize.css v2.1.3 | MIT License | git.io/normalize */
+
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+main,
+nav,
+section,
+summary {
+ display: block;
+}
+
+audio,
+canvas,
+video {
+ display: inline-block;
+}
+
+audio:not([controls]) {
+ display: none;
+ height: 0;
+}
+
+[hidden],
+template {
+ display: none;
+}
+
+html {
+ font-family: sans-serif;
+ -webkit-text-size-adjust: 100%;
+ -ms-text-size-adjust: 100%;
+}
+
+body {
+ margin: 0;
+}
+
+a {
+ background: transparent;
+}
+
+a:focus {
+ outline: thin dotted;
+}
+
+a:active,
+a:hover {
+ outline: 0;
+}
+
+h1 {
+ margin: 0.67em 0;
+ font-size: 2em;
+}
+
+abbr[title] {
+ border-bottom: 1px dotted;
+}
+
+b,
+strong {
+ font-weight: bold;
+}
+
+dfn {
+ font-style: italic;
+}
+
+hr {
+ height: 0;
+ -moz-box-sizing: content-box;
+ box-sizing: content-box;
+}
+
+mark {
+ color: #000;
+ background: #ff0;
+}
+
+code,
+kbd,
+pre,
+samp {
+ font-family: monospace, serif;
+ font-size: 1em;
+}
+
+pre {
+ white-space: pre-wrap;
+}
+
+q {
+ quotes: "\201C" "\201D" "\2018" "\2019";
+}
+
+small {
+ font-size: 80%;
+}
+
+sub,
+sup {
+ position: relative;
+ font-size: 75%;
+ line-height: 0;
+ vertical-align: baseline;
+}
+
+sup {
+ top: -0.5em;
+}
+
+sub {
+ bottom: -0.25em;
+}
+
+img {
+ border: 0;
+}
+
+svg:not(:root) {
+ overflow: hidden;
+}
+
+figure {
+ margin: 0;
+}
+
+fieldset {
+ padding: 0.35em 0.625em 0.75em;
+ margin: 0 2px;
+ border: 1px solid #c0c0c0;
+}
+
+legend {
+ padding: 0;
+ border: 0;
+}
+
+button,
+input,
+select,
+textarea {
+ margin: 0;
+ font-family: inherit;
+ font-size: 100%;
+}
+
+button,
+input {
+ line-height: normal;
+}
+
+button,
+select {
+ text-transform: none;
+}
+
+button,
+html input[type="button"],
+input[type="reset"],
+input[type="submit"] {
+ cursor: pointer;
+ -webkit-appearance: button;
+}
+
+button[disabled],
+html input[disabled] {
+ cursor: default;
+}
+
+input[type="checkbox"],
+input[type="radio"] {
+ padding: 0;
+ box-sizing: border-box;
+}
+
+input[type="search"] {
+ -webkit-box-sizing: content-box;
+ -moz-box-sizing: content-box;
+ box-sizing: content-box;
+ -webkit-appearance: textfield;
+}
+
+input[type="search"]::-webkit-search-cancel-button,
+input[type="search"]::-webkit-search-decoration {
+ -webkit-appearance: none;
+}
+
+button::-moz-focus-inner,
+input::-moz-focus-inner {
+ padding: 0;
+ border: 0;
+}
+
+textarea {
+ overflow: auto;
+ vertical-align: top;
+}
+
+table {
+ border-collapse: collapse;
+ border-spacing: 0;
+}
+
+@media print {
+ * {
+ color: #000 !important;
+ text-shadow: none !important;
+ background: transparent !important;
+ box-shadow: none !important;
+ }
+ a,
+ a:visited {
+ text-decoration: underline;
+ }
+ a[href]:after {
+ content: " (" attr(href) ")";
+ }
+ abbr[title]:after {
+ content: " (" attr(title) ")";
+ }
+ a[href^="javascript:"]:after,
+ a[href^="#"]:after {
+ content: "";
+ }
+ pre,
+ blockquote {
+ border: 1px solid #999;
+ page-break-inside: avoid;
+ }
+ thead {
+ display: table-header-group;
+ }
+ tr,
+ img {
+ page-break-inside: avoid;
+ }
+ img {
+ max-width: 100% !important;
+ }
+ @page {
+ margin: 2cm .5cm;
+ }
+ p,
+ h2,
+ h3 {
+ orphans: 3;
+ widows: 3;
+ }
+ h2,
+ h3 {
+ page-break-after: avoid;
+ }
+ select {
+ background: #fff !important;
+ }
+ .navbar {
+ display: none;
+ }
+ .table td,
+ .table th {
+ background-color: #fff !important;
+ }
+ .btn > .caret,
+ .dropup > .btn > .caret {
+ border-top-color: #000 !important;
+ }
+ .label {
+ border: 1px solid #000;
+ }
+ .table {
+ border-collapse: collapse !important;
+ }
+ .table-bordered th,
+ .table-bordered td {
+ border: 1px solid #ddd !important;
+ }
+}
+
+*,
+*:before,
+*:after {
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 62.5%;
+ -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+}
+
+body {
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+ font-size: 14px;
+ line-height: 1.428571429;
+ color: #333333;
+ background-color: #ffffff;
+}
+
+input,
+button,
+select,
+textarea {
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit;
+}
+
+a {
+ color: #428bca;
+ text-decoration: none;
+}
+
+a:hover,
+a:focus {
+ color: #2a6496;
+ text-decoration: underline;
+}
+
+a:focus {
+ outline: thin dotted;
+ outline: 5px auto -webkit-focus-ring-color;
+ outline-offset: -2px;
+}
+
+img {
+ vertical-align: middle;
+}
+
+.img-responsive {
+ display: block;
+ height: auto;
+ max-width: 100%;
+}
+
+.img-rounded {
+ border-radius: 6px;
+}
+
+.img-thumbnail {
+ display: inline-block;
+ height: auto;
+ max-width: 100%;
+ padding: 4px;
+ line-height: 1.428571429;
+ background-color: #ffffff;
+ border: 1px solid #dddddd;
+ border-radius: 4px;
+ -webkit-transition: all 0.2s ease-in-out;
+ transition: all 0.2s ease-in-out;
+}
+
+.img-circle {
+ border-radius: 50%;
+}
+
+hr {
+ margin-top: 20px;
+ margin-bottom: 20px;
+ border: 0;
+ border-top: 1px solid #eeeeee;
+}
+
+.sr-only {
+ position: absolute;
+ width: 1px;
+ height: 1px;
+ padding: 0;
+ margin: -1px;
+ overflow: hidden;
+ clip: rect(0, 0, 0, 0);
+ border: 0;
+}
+
+h1,
+h2,
+h3,
+h4,
+h5,
+h6,
+.h1,
+.h2,
+.h3,
+.h4,
+.h5,
+.h6 {
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+ font-weight: 500;
+ line-height: 1.1;
+ color: inherit;
+}
+
+h1 small,
+h2 small,
+h3 small,
+h4 small,
+h5 small,
+h6 small,
+.h1 small,
+.h2 small,
+.h3 small,
+.h4 small,
+.h5 small,
+.h6 small,
+h1 .small,
+h2 .small,
+h3 .small,
+h4 .small,
+h5 .small,
+h6 .small,
+.h1 .small,
+.h2 .small,
+.h3 .small,
+.h4 .small,
+.h5 .small,
+.h6 .small {
+ font-weight: normal;
+ line-height: 1;
+ color: #999999;
+}
+
+h1,
+h2,
+h3 {
+ margin-top: 20px;
+ margin-bottom: 10px;
+}
+
+h1 small,
+h2 small,
+h3 small,
+h1 .small,
+h2 .small,
+h3 .small {
+ font-size: 65%;
+}
+
+h4,
+h5,
+h6 {
+ margin-top: 10px;
+ margin-bottom: 10px;
+}
+
+h4 small,
+h5 small,
+h6 small,
+h4 .small,
+h5 .small,
+h6 .small {
+ font-size: 75%;
+}
+
+h1,
+.h1 {
+ font-size: 36px;
+}
+
+h2,
+.h2 {
+ font-size: 30px;
+}
+
+h3,
+.h3 {
+ font-size: 24px;
+}
+
+h4,
+.h4 {
+ font-size: 18px;
+}
+
+h5,
+.h5 {
+ font-size: 14px;
+}
+
+h6,
+.h6 {
+ font-size: 12px;
+}
+
+p {
+ margin: 0 0 10px;
+}
+
+.lead {
+ margin-bottom: 20px;
+ font-size: 16px;
+ font-weight: 200;
+ line-height: 1.4;
+}
+
+@media (min-width: 768px) {
+ .lead {
+ font-size: 21px;
+ }
+}
+
+small,
+.small {
+ font-size: 85%;
+}
+
+cite {
+ font-style: normal;
+}
+
+.text-muted {
+ color: #999999;
+}
+
+.text-primary {
+ color: #428bca;
+}
+
+.text-primary:hover {
+ color: #3071a9;
+}
+
+.text-warning {
+ color: #8a6d3b;
+}
+
+.text-warning:hover {
+ color: #66512c;
+}
+
+.text-danger {
+ color: #a94442;
+}
+
+.text-danger:hover {
+ color: #843534;
+}
+
+.text-success {
+ color: #3c763d;
+}
+
+.text-success:hover {
+ color: #2b542c;
+}
+
+.text-info {
+ color: #31708f;
+}
+
+.text-info:hover {
+ color: #245269;
+}
+
+.text-left {
+ text-align: left;
+}
+
+.text-right {
+ text-align: right;
+}
+
+.text-center {
+ text-align: center;
+}
+
+.page-header {
+ padding-bottom: 9px;
+ margin: 40px 0 20px;
+ border-bottom: 1px solid #eeeeee;
+}
+
+ul,
+ol {
+ margin-top: 0;
+ margin-bottom: 10px;
+}
+
+ul ul,
+ol ul,
+ul ol,
+ol ol {
+ margin-bottom: 0;
+}
+
+.list-unstyled {
+ padding-left: 0;
+ list-style: none;
+}
+
+.list-inline {
+ padding-left: 0;
+ list-style: none;
+}
+
+.list-inline > li {
+ display: inline-block;
+ padding-right: 5px;
+ padding-left: 5px;
+}
+
+.list-inline > li:first-child {
+ padding-left: 0;
+}
+
+dl {
+ margin-top: 0;
+ margin-bottom: 20px;
+}
+
+dt,
+dd {
+ line-height: 1.428571429;
+}
+
+dt {
+ font-weight: bold;
+}
+
+dd {
+ margin-left: 0;
+}
+
+@media (min-width: 768px) {
+ .dl-horizontal dt {
+ float: left;
+ width: 160px;
+ overflow: hidden;
+ clear: left;
+ text-align: right;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ }
+ .dl-horizontal dd {
+ margin-left: 180px;
+ }
+ .dl-horizontal dd:before,
+ .dl-horizontal dd:after {
+ display: table;
+ content: " ";
+ }
+ .dl-horizontal dd:after {
+ clear: both;
+ }
+ .dl-horizontal dd:before,
+ .dl-horizontal dd:after {
+ display: table;
+ content: " ";
+ }
+ .dl-horizontal dd:after {
+ clear: both;
+ }
+}
+
+abbr[title],
+abbr[data-original-title] {
+ cursor: help;
+ border-bottom: 1px dotted #999999;
+}
+
+.initialism {
+ font-size: 90%;
+ text-transform: uppercase;
+}
+
+blockquote {
+ padding: 10px 20px;
+ margin: 0 0 20px;
+ border-left: 5px solid #eeeeee;
+}
+
+blockquote p {
+ font-size: 17.5px;
+ font-weight: 300;
+ line-height: 1.25;
+}
+
+blockquote p:last-child {
+ margin-bottom: 0;
+}
+
+blockquote small,
+blockquote .small {
+ display: block;
+ line-height: 1.428571429;
+ color: #999999;
+}
+
+blockquote small:before,
+blockquote .small:before {
+ content: '\2014 \00A0';
+}
+
+blockquote.pull-right {
+ padding-right: 15px;
+ padding-left: 0;
+ border-right: 5px solid #eeeeee;
+ border-left: 0;
+}
+
+blockquote.pull-right p,
+blockquote.pull-right small,
+blockquote.pull-right .small {
+ text-align: right;
+}
+
+blockquote.pull-right small:before,
+blockquote.pull-right .small:before {
+ content: '';
+}
+
+blockquote.pull-right small:after,
+blockquote.pull-right .small:after {
+ content: '\00A0 \2014';
+}
+
+blockquote:before,
+blockquote:after {
+ content: "";
+}
+
+address {
+ margin-bottom: 20px;
+ font-style: normal;
+ line-height: 1.428571429;
+}
+
+code,
+kbd,
+pre,
+samp {
+ font-family: Menlo, Monaco, Consolas, "Courier New", monospace;
+}
+
+code {
+ padding: 2px 4px;
+ font-size: 90%;
+ color: #c7254e;
+ white-space: nowrap;
+ background-color: #f9f2f4;
+ border-radius: 4px;
+}
+
+pre {
+ display: block;
+ padding: 9.5px;
+ margin: 0 0 10px;
+ font-size: 13px;
+ line-height: 1.428571429;
+ color: #333333;
+ word-break: break-all;
+ word-wrap: break-word;
+ background-color: #f5f5f5;
+ border: 1px solid #cccccc;
+ border-radius: 4px;
+}
+
+pre code {
+ padding: 0;
+ font-size: inherit;
+ color: inherit;
+ white-space: pre-wrap;
+ background-color: transparent;
+ border-radius: 0;
+}
+
+.pre-scrollable {
+ max-height: 340px;
+ overflow-y: scroll;
+}
+
+.container {
+ padding-right: 15px;
+ padding-left: 15px;
+ margin-right: auto;
+ margin-left: auto;
+}
+
+.container:before,
+.container:after {
+ display: table;
+ content: " ";
+}
+
+.container:after {
+ clear: both;
+}
+
+.container:before,
+.container:after {
+ display: table;
+ content: " ";
+}
+
+.container:after {
+ clear: both;
+}
+
+@media (min-width: 768px) {
+ .container {
+ width: 750px;
+ }
+}
+
+@media (min-width: 992px) {
+ .container {
+ width: 970px;
+ }
+}
+
+@media (min-width: 1200px) {
+ .container {
+ width: 1170px;
+ }
+}
+
+.row {
+ margin-right: -15px;
+ margin-left: -15px;
+}
+
+.row:before,
+.row:after {
+ display: table;
+ content: " ";
+}
+
+.row:after {
+ clear: both;
+}
+
+.row:before,
+.row:after {
+ display: table;
+ content: " ";
+}
+
+.row:after {
+ clear: both;
+}
+
+.col-xs-1,
+.col-sm-1,
+.col-md-1,
+.col-lg-1,
+.col-xs-2,
+.col-sm-2,
+.col-md-2,
+.col-lg-2,
+.col-xs-3,
+.col-sm-3,
+.col-md-3,
+.col-lg-3,
+.col-xs-4,
+.col-sm-4,
+.col-md-4,
+.col-lg-4,
+.col-xs-5,
+.col-sm-5,
+.col-md-5,
+.col-lg-5,
+.col-xs-6,
+.col-sm-6,
+.col-md-6,
+.col-lg-6,
+.col-xs-7,
+.col-sm-7,
+.col-md-7,
+.col-lg-7,
+.col-xs-8,
+.col-sm-8,
+.col-md-8,
+.col-lg-8,
+.col-xs-9,
+.col-sm-9,
+.col-md-9,
+.col-lg-9,
+.col-xs-10,
+.col-sm-10,
+.col-md-10,
+.col-lg-10,
+.col-xs-11,
+.col-sm-11,
+.col-md-11,
+.col-lg-11,
+.col-xs-12,
+.col-sm-12,
+.col-md-12,
+.col-lg-12 {
+ position: relative;
+ min-height: 1px;
+ padding-right: 15px;
+ padding-left: 15px;
+}
+
+.col-xs-1,
+.col-xs-2,
+.col-xs-3,
+.col-xs-4,
+.col-xs-5,
+.col-xs-6,
+.col-xs-7,
+.col-xs-8,
+.col-xs-9,
+.col-xs-10,
+.col-xs-11,
+.col-xs-12 {
+ float: left;
+}
+
+.col-xs-12 {
+ width: 100%;
+}
+
+.col-xs-11 {
+ width: 91.66666666666666%;
+}
+
+.col-xs-10 {
+ width: 83.33333333333334%;
+}
+
+.col-xs-9 {
+ width: 75%;
+}
+
+.col-xs-8 {
+ width: 66.66666666666666%;
+}
+
+.col-xs-7 {
+ width: 58.333333333333336%;
+}
+
+.col-xs-6 {
+ width: 50%;
+}
+
+.col-xs-5 {
+ width: 41.66666666666667%;
+}
+
+.col-xs-4 {
+ width: 33.33333333333333%;
+}
+
+.col-xs-3 {
+ width: 25%;
+}
+
+.col-xs-2 {
+ width: 16.666666666666664%;
+}
+
+.col-xs-1 {
+ width: 8.333333333333332%;
+}
+
+.col-xs-pull-12 {
+ right: 100%;
+}
+
+.col-xs-pull-11 {
+ right: 91.66666666666666%;
+}
+
+.col-xs-pull-10 {
+ right: 83.33333333333334%;
+}
+
+.col-xs-pull-9 {
+ right: 75%;
+}
+
+.col-xs-pull-8 {
+ right: 66.66666666666666%;
+}
+
+.col-xs-pull-7 {
+ right: 58.333333333333336%;
+}
+
+.col-xs-pull-6 {
+ right: 50%;
+}
+
+.col-xs-pull-5 {
+ right: 41.66666666666667%;
+}
+
+.col-xs-pull-4 {
+ right: 33.33333333333333%;
+}
+
+.col-xs-pull-3 {
+ right: 25%;
+}
+
+.col-xs-pull-2 {
+ right: 16.666666666666664%;
+}
+
+.col-xs-pull-1 {
+ right: 8.333333333333332%;
+}
+
+.col-xs-pull-0 {
+ right: 0;
+}
+
+.col-xs-push-12 {
+ left: 100%;
+}
+
+.col-xs-push-11 {
+ left: 91.66666666666666%;
+}
+
+.col-xs-push-10 {
+ left: 83.33333333333334%;
+}
+
+.col-xs-push-9 {
+ left: 75%;
+}
+
+.col-xs-push-8 {
+ left: 66.66666666666666%;
+}
+
+.col-xs-push-7 {
+ left: 58.333333333333336%;
+}
+
+.col-xs-push-6 {
+ left: 50%;
+}
+
+.col-xs-push-5 {
+ left: 41.66666666666667%;
+}
+
+.col-xs-push-4 {
+ left: 33.33333333333333%;
+}
+
+.col-xs-push-3 {
+ left: 25%;
+}
+
+.col-xs-push-2 {
+ left: 16.666666666666664%;
+}
+
+.col-xs-push-1 {
+ left: 8.333333333333332%;
+}
+
+.col-xs-push-0 {
+ left: 0;
+}
+
+.col-xs-offset-12 {
+ margin-left: 100%;
+}
+
+.col-xs-offset-11 {
+ margin-left: 91.66666666666666%;
+}
+
+.col-xs-offset-10 {
+ margin-left: 83.33333333333334%;
+}
+
+.col-xs-offset-9 {
+ margin-left: 75%;
+}
+
+.col-xs-offset-8 {
+ margin-left: 66.66666666666666%;
+}
+
+.col-xs-offset-7 {
+ margin-left: 58.333333333333336%;
+}
+
+.col-xs-offset-6 {
+ margin-left: 50%;
+}
+
+.col-xs-offset-5 {
+ margin-left: 41.66666666666667%;
+}
+
+.col-xs-offset-4 {
+ margin-left: 33.33333333333333%;
+}
+
+.col-xs-offset-3 {
+ margin-left: 25%;
+}
+
+.col-xs-offset-2 {
+ margin-left: 16.666666666666664%;
+}
+
+.col-xs-offset-1 {
+ margin-left: 8.333333333333332%;
+}
+
+.col-xs-offset-0 {
+ margin-left: 0;
+}
+
+@media (min-width: 768px) {
+ .col-sm-1,
+ .col-sm-2,
+ .col-sm-3,
+ .col-sm-4,
+ .col-sm-5,
+ .col-sm-6,
+ .col-sm-7,
+ .col-sm-8,
+ .col-sm-9,
+ .col-sm-10,
+ .col-sm-11,
+ .col-sm-12 {
+ float: left;
+ }
+ .col-sm-12 {
+ width: 100%;
+ }
+ .col-sm-11 {
+ width: 91.66666666666666%;
+ }
+ .col-sm-10 {
+ width: 83.33333333333334%;
+ }
+ .col-sm-9 {
+ width: 75%;
+ }
+ .col-sm-8 {
+ width: 66.66666666666666%;
+ }
+ .col-sm-7 {
+ width: 58.333333333333336%;
+ }
+ .col-sm-6 {
+ width: 50%;
+ }
+ .col-sm-5 {
+ width: 41.66666666666667%;
+ }
+ .col-sm-4 {
+ width: 33.33333333333333%;
+ }
+ .col-sm-3 {
+ width: 25%;
+ }
+ .col-sm-2 {
+ width: 16.666666666666664%;
+ }
+ .col-sm-1 {
+ width: 8.333333333333332%;
+ }
+ .col-sm-pull-12 {
+ right: 100%;
+ }
+ .col-sm-pull-11 {
+ right: 91.66666666666666%;
+ }
+ .col-sm-pull-10 {
+ right: 83.33333333333334%;
+ }
+ .col-sm-pull-9 {
+ right: 75%;
+ }
+ .col-sm-pull-8 {
+ right: 66.66666666666666%;
+ }
+ .col-sm-pull-7 {
+ right: 58.333333333333336%;
+ }
+ .col-sm-pull-6 {
+ right: 50%;
+ }
+ .col-sm-pull-5 {
+ right: 41.66666666666667%;
+ }
+ .col-sm-pull-4 {
+ right: 33.33333333333333%;
+ }
+ .col-sm-pull-3 {
+ right: 25%;
+ }
+ .col-sm-pull-2 {
+ right: 16.666666666666664%;
+ }
+ .col-sm-pull-1 {
+ right: 8.333333333333332%;
+ }
+ .col-sm-pull-0 {
+ right: 0;
+ }
+ .col-sm-push-12 {
+ left: 100%;
+ }
+ .col-sm-push-11 {
+ left: 91.66666666666666%;
+ }
+ .col-sm-push-10 {
+ left: 83.33333333333334%;
+ }
+ .col-sm-push-9 {
+ left: 75%;
+ }
+ .col-sm-push-8 {
+ left: 66.66666666666666%;
+ }
+ .col-sm-push-7 {
+ left: 58.333333333333336%;
+ }
+ .col-sm-push-6 {
+ left: 50%;
+ }
+ .col-sm-push-5 {
+ left: 41.66666666666667%;
+ }
+ .col-sm-push-4 {
+ left: 33.33333333333333%;
+ }
+ .col-sm-push-3 {
+ left: 25%;
+ }
+ .col-sm-push-2 {
+ left: 16.666666666666664%;
+ }
+ .col-sm-push-1 {
+ left: 8.333333333333332%;
+ }
+ .col-sm-push-0 {
+ left: 0;
+ }
+ .col-sm-offset-12 {
+ margin-left: 100%;
+ }
+ .col-sm-offset-11 {
+ margin-left: 91.66666666666666%;
+ }
+ .col-sm-offset-10 {
+ margin-left: 83.33333333333334%;
+ }
+ .col-sm-offset-9 {
+ margin-left: 75%;
+ }
+ .col-sm-offset-8 {
+ margin-left: 66.66666666666666%;
+ }
+ .col-sm-offset-7 {
+ margin-left: 58.333333333333336%;
+ }
+ .col-sm-offset-6 {
+ margin-left: 50%;
+ }
+ .col-sm-offset-5 {
+ margin-left: 41.66666666666667%;
+ }
+ .col-sm-offset-4 {
+ margin-left: 33.33333333333333%;
+ }
+ .col-sm-offset-3 {
+ margin-left: 25%;
+ }
+ .col-sm-offset-2 {
+ margin-left: 16.666666666666664%;
+ }
+ .col-sm-offset-1 {
+ margin-left: 8.333333333333332%;
+ }
+ .col-sm-offset-0 {
+ margin-left: 0;
+ }
+}
+
+@media (min-width: 992px) {
+ .col-md-1,
+ .col-md-2,
+ .col-md-3,
+ .col-md-4,
+ .col-md-5,
+ .col-md-6,
+ .col-md-7,
+ .col-md-8,
+ .col-md-9,
+ .col-md-10,
+ .col-md-11,
+ .col-md-12 {
+ float: left;
+ }
+ .col-md-12 {
+ width: 100%;
+ }
+ .col-md-11 {
+ width: 91.66666666666666%;
+ }
+ .col-md-10 {
+ width: 83.33333333333334%;
+ }
+ .col-md-9 {
+ width: 75%;
+ }
+ .col-md-8 {
+ width: 66.66666666666666%;
+ }
+ .col-md-7 {
+ width: 58.333333333333336%;
+ }
+ .col-md-6 {
+ width: 50%;
+ }
+ .col-md-5 {
+ width: 41.66666666666667%;
+ }
+ .col-md-4 {
+ width: 33.33333333333333%;
+ }
+ .col-md-3 {
+ width: 25%;
+ }
+ .col-md-2 {
+ width: 16.666666666666664%;
+ }
+ .col-md-1 {
+ width: 8.333333333333332%;
+ }
+ .col-md-pull-12 {
+ right: 100%;
+ }
+ .col-md-pull-11 {
+ right: 91.66666666666666%;
+ }
+ .col-md-pull-10 {
+ right: 83.33333333333334%;
+ }
+ .col-md-pull-9 {
+ right: 75%;
+ }
+ .col-md-pull-8 {
+ right: 66.66666666666666%;
+ }
+ .col-md-pull-7 {
+ right: 58.333333333333336%;
+ }
+ .col-md-pull-6 {
+ right: 50%;
+ }
+ .col-md-pull-5 {
+ right: 41.66666666666667%;
+ }
+ .col-md-pull-4 {
+ right: 33.33333333333333%;
+ }
+ .col-md-pull-3 {
+ right: 25%;
+ }
+ .col-md-pull-2 {
+ right: 16.666666666666664%;
+ }
+ .col-md-pull-1 {
+ right: 8.333333333333332%;
+ }
+ .col-md-pull-0 {
+ right: 0;
+ }
+ .col-md-push-12 {
+ left: 100%;
+ }
+ .col-md-push-11 {
+ left: 91.66666666666666%;
+ }
+ .col-md-push-10 {
+ left: 83.33333333333334%;
+ }
+ .col-md-push-9 {
+ left: 75%;
+ }
+ .col-md-push-8 {
+ left: 66.66666666666666%;
+ }
+ .col-md-push-7 {
+ left: 58.333333333333336%;
+ }
+ .col-md-push-6 {
+ left: 50%;
+ }
+ .col-md-push-5 {
+ left: 41.66666666666667%;
+ }
+ .col-md-push-4 {
+ left: 33.33333333333333%;
+ }
+ .col-md-push-3 {
+ left: 25%;
+ }
+ .col-md-push-2 {
+ left: 16.666666666666664%;
+ }
+ .col-md-push-1 {
+ left: 8.333333333333332%;
+ }
+ .col-md-push-0 {
+ left: 0;
+ }
+ .col-md-offset-12 {
+ margin-left: 100%;
+ }
+ .col-md-offset-11 {
+ margin-left: 91.66666666666666%;
+ }
+ .col-md-offset-10 {
+ margin-left: 83.33333333333334%;
+ }
+ .col-md-offset-9 {
+ margin-left: 75%;
+ }
+ .col-md-offset-8 {
+ margin-left: 66.66666666666666%;
+ }
+ .col-md-offset-7 {
+ margin-left: 58.333333333333336%;
+ }
+ .col-md-offset-6 {
+ margin-left: 50%;
+ }
+ .col-md-offset-5 {
+ margin-left: 41.66666666666667%;
+ }
+ .col-md-offset-4 {
+ margin-left: 33.33333333333333%;
+ }
+ .col-md-offset-3 {
+ margin-left: 25%;
+ }
+ .col-md-offset-2 {
+ margin-left: 16.666666666666664%;
+ }
+ .col-md-offset-1 {
+ margin-left: 8.333333333333332%;
+ }
+ .col-md-offset-0 {
+ margin-left: 0;
+ }
+}
+
+@media (min-width: 1200px) {
+ .col-lg-1,
+ .col-lg-2,
+ .col-lg-3,
+ .col-lg-4,
+ .col-lg-5,
+ .col-lg-6,
+ .col-lg-7,
+ .col-lg-8,
+ .col-lg-9,
+ .col-lg-10,
+ .col-lg-11,
+ .col-lg-12 {
+ float: left;
+ }
+ .col-lg-12 {
+ width: 100%;
+ }
+ .col-lg-11 {
+ width: 91.66666666666666%;
+ }
+ .col-lg-10 {
+ width: 83.33333333333334%;
+ }
+ .col-lg-9 {
+ width: 75%;
+ }
+ .col-lg-8 {
+ width: 66.66666666666666%;
+ }
+ .col-lg-7 {
+ width: 58.333333333333336%;
+ }
+ .col-lg-6 {
+ width: 50%;
+ }
+ .col-lg-5 {
+ width: 41.66666666666667%;
+ }
+ .col-lg-4 {
+ width: 33.33333333333333%;
+ }
+ .col-lg-3 {
+ width: 25%;
+ }
+ .col-lg-2 {
+ width: 16.666666666666664%;
+ }
+ .col-lg-1 {
+ width: 8.333333333333332%;
+ }
+ .col-lg-pull-12 {
+ right: 100%;
+ }
+ .col-lg-pull-11 {
+ right: 91.66666666666666%;
+ }
+ .col-lg-pull-10 {
+ right: 83.33333333333334%;
+ }
+ .col-lg-pull-9 {
+ right: 75%;
+ }
+ .col-lg-pull-8 {
+ right: 66.66666666666666%;
+ }
+ .col-lg-pull-7 {
+ right: 58.333333333333336%;
+ }
+ .col-lg-pull-6 {
+ right: 50%;
+ }
+ .col-lg-pull-5 {
+ right: 41.66666666666667%;
+ }
+ .col-lg-pull-4 {
+ right: 33.33333333333333%;
+ }
+ .col-lg-pull-3 {
+ right: 25%;
+ }
+ .col-lg-pull-2 {
+ right: 16.666666666666664%;
+ }
+ .col-lg-pull-1 {
+ right: 8.333333333333332%;
+ }
+ .col-lg-pull-0 {
+ right: 0;
+ }
+ .col-lg-push-12 {
+ left: 100%;
+ }
+ .col-lg-push-11 {
+ left: 91.66666666666666%;
+ }
+ .col-lg-push-10 {
+ left: 83.33333333333334%;
+ }
+ .col-lg-push-9 {
+ left: 75%;
+ }
+ .col-lg-push-8 {
+ left: 66.66666666666666%;
+ }
+ .col-lg-push-7 {
+ left: 58.333333333333336%;
+ }
+ .col-lg-push-6 {
+ left: 50%;
+ }
+ .col-lg-push-5 {
+ left: 41.66666666666667%;
+ }
+ .col-lg-push-4 {
+ left: 33.33333333333333%;
+ }
+ .col-lg-push-3 {
+ left: 25%;
+ }
+ .col-lg-push-2 {
+ left: 16.666666666666664%;
+ }
+ .col-lg-push-1 {
+ left: 8.333333333333332%;
+ }
+ .col-lg-push-0 {
+ left: 0;
+ }
+ .col-lg-offset-12 {
+ margin-left: 100%;
+ }
+ .col-lg-offset-11 {
+ margin-left: 91.66666666666666%;
+ }
+ .col-lg-offset-10 {
+ margin-left: 83.33333333333334%;
+ }
+ .col-lg-offset-9 {
+ margin-left: 75%;
+ }
+ .col-lg-offset-8 {
+ margin-left: 66.66666666666666%;
+ }
+ .col-lg-offset-7 {
+ margin-left: 58.333333333333336%;
+ }
+ .col-lg-offset-6 {
+ margin-left: 50%;
+ }
+ .col-lg-offset-5 {
+ margin-left: 41.66666666666667%;
+ }
+ .col-lg-offset-4 {
+ margin-left: 33.33333333333333%;
+ }
+ .col-lg-offset-3 {
+ margin-left: 25%;
+ }
+ .col-lg-offset-2 {
+ margin-left: 16.666666666666664%;
+ }
+ .col-lg-offset-1 {
+ margin-left: 8.333333333333332%;
+ }
+ .col-lg-offset-0 {
+ margin-left: 0;
+ }
+}
+
+table {
+ max-width: 100%;
+ background-color: transparent;
+}
+
+th {
+ text-align: left;
+}
+
+.table {
+ width: 100%;
+ margin-bottom: 20px;
+}
+
+.table > thead > tr > th,
+.table > tbody > tr > th,
+.table > tfoot > tr > th,
+.table > thead > tr > td,
+.table > tbody > tr > td,
+.table > tfoot > tr > td {
+ padding: 8px;
+ line-height: 1.428571429;
+ vertical-align: top;
+ border-top: 1px solid #dddddd;
+}
+
+.table > thead > tr > th {
+ vertical-align: bottom;
+ border-bottom: 2px solid #dddddd;
+}
+
+.table > caption + thead > tr:first-child > th,
+.table > colgroup + thead > tr:first-child > th,
+.table > thead:first-child > tr:first-child > th,
+.table > caption + thead > tr:first-child > td,
+.table > colgroup + thead > tr:first-child > td,
+.table > thead:first-child > tr:first-child > td {
+ border-top: 0;
+}
+
+.table > tbody + tbody {
+ border-top: 2px solid #dddddd;
+}
+
+.table .table {
+ background-color: #ffffff;
+}
+
+.table-condensed > thead > tr > th,
+.table-condensed > tbody > tr > th,
+.table-condensed > tfoot > tr > th,
+.table-condensed > thead > tr > td,
+.table-condensed > tbody > tr > td,
+.table-condensed > tfoot > tr > td {
+ padding: 5px;
+}
+
+.table-bordered {
+ border: 1px solid #dddddd;
+}
+
+.table-bordered > thead > tr > th,
+.table-bordered > tbody > tr > th,
+.table-bordered > tfoot > tr > th,
+.table-bordered > thead > tr > td,
+.table-bordered > tbody > tr > td,
+.table-bordered > tfoot > tr > td {
+ border: 1px solid #dddddd;
+}
+
+.table-bordered > thead > tr > th,
+.table-bordered > thead > tr > td {
+ border-bottom-width: 2px;
+}
+
+.table-striped > tbody > tr:nth-child(odd) > td,
+.table-striped > tbody > tr:nth-child(odd) > th {
+ background-color: #f9f9f9;
+}
+
+.table-hover > tbody > tr:hover > td,
+.table-hover > tbody > tr:hover > th {
+ background-color: #f5f5f5;
+}
+
+table col[class*="col-"] {
+ position: static;
+ display: table-column;
+ float: none;
+}
+
+table td[class*="col-"],
+table th[class*="col-"] {
+ display: table-cell;
+ float: none;
+}
+
+.table > thead > tr > .active,
+.table > tbody > tr > .active,
+.table > tfoot > tr > .active,
+.table > thead > .active > td,
+.table > tbody > .active > td,
+.table > tfoot > .active > td,
+.table > thead > .active > th,
+.table > tbody > .active > th,
+.table > tfoot > .active > th {
+ background-color: #f5f5f5;
+}
+
+.table-hover > tbody > tr > .active:hover,
+.table-hover > tbody > .active:hover > td,
+.table-hover > tbody > .active:hover > th {
+ background-color: #e8e8e8;
+}
+
+.table > thead > tr > .success,
+.table > tbody > tr > .success,
+.table > tfoot > tr > .success,
+.table > thead > .success > td,
+.table > tbody > .success > td,
+.table > tfoot > .success > td,
+.table > thead > .success > th,
+.table > tbody > .success > th,
+.table > tfoot > .success > th {
+ background-color: #dff0d8;
+}
+
+.table-hover > tbody > tr > .success:hover,
+.table-hover > tbody > .success:hover > td,
+.table-hover > tbody > .success:hover > th {
+ background-color: #d0e9c6;
+}
+
+.table > thead > tr > .danger,
+.table > tbody > tr > .danger,
+.table > tfoot > tr > .danger,
+.table > thead > .danger > td,
+.table > tbody > .danger > td,
+.table > tfoot > .danger > td,
+.table > thead > .danger > th,
+.table > tbody > .danger > th,
+.table > tfoot > .danger > th {
+ background-color: #f2dede;
+}
+
+.table-hover > tbody > tr > .danger:hover,
+.table-hover > tbody > .danger:hover > td,
+.table-hover > tbody > .danger:hover > th {
+ background-color: #ebcccc;
+}
+
+.table > thead > tr > .warning,
+.table > tbody > tr > .warning,
+.table > tfoot > tr > .warning,
+.table > thead > .warning > td,
+.table > tbody > .warning > td,
+.table > tfoot > .warning > td,
+.table > thead > .warning > th,
+.table > tbody > .warning > th,
+.table > tfoot > .warning > th {
+ background-color: #fcf8e3;
+}
+
+.table-hover > tbody > tr > .warning:hover,
+.table-hover > tbody > .warning:hover > td,
+.table-hover > tbody > .warning:hover > th {
+ background-color: #faf2cc;
+}
+
+@media (max-width: 767px) {
+ .table-responsive {
+ width: 100%;
+ margin-bottom: 15px;
+ overflow-x: scroll;
+ overflow-y: hidden;
+ border: 1px solid #dddddd;
+ -ms-overflow-style: -ms-autohiding-scrollbar;
+ -webkit-overflow-scrolling: touch;
+ }
+ .table-responsive > .table {
+ margin-bottom: 0;
+ }
+ .table-responsive > .table > thead > tr > th,
+ .table-responsive > .table > tbody > tr > th,
+ .table-responsive > .table > tfoot > tr > th,
+ .table-responsive > .table > thead > tr > td,
+ .table-responsive > .table > tbody > tr > td,
+ .table-responsive > .table > tfoot > tr > td {
+ white-space: nowrap;
+ }
+ .table-responsive > .table-bordered {
+ border: 0;
+ }
+ .table-responsive > .table-bordered > thead > tr > th:first-child,
+ .table-responsive > .table-bordered > tbody > tr > th:first-child,
+ .table-responsive > .table-bordered > tfoot > tr > th:first-child,
+ .table-responsive > .table-bordered > thead > tr > td:first-child,
+ .table-responsive > .table-bordered > tbody > tr > td:first-child,
+ .table-responsive > .table-bordered > tfoot > tr > td:first-child {
+ border-left: 0;
+ }
+ .table-responsive > .table-bordered > thead > tr > th:last-child,
+ .table-responsive > .table-bordered > tbody > tr > th:last-child,
+ .table-responsive > .table-bordered > tfoot > tr > th:last-child,
+ .table-responsive > .table-bordered > thead > tr > td:last-child,
+ .table-responsive > .table-bordered > tbody > tr > td:last-child,
+ .table-responsive > .table-bordered > tfoot > tr > td:last-child {
+ border-right: 0;
+ }
+ .table-responsive > .table-bordered > tbody > tr:last-child > th,
+ .table-responsive > .table-bordered > tfoot > tr:last-child > th,
+ .table-responsive > .table-bordered > tbody > tr:last-child > td,
+ .table-responsive > .table-bordered > tfoot > tr:last-child > td {
+ border-bottom: 0;
+ }
+}
+
+fieldset {
+ padding: 0;
+ margin: 0;
+ border: 0;
+}
+
+legend {
+ display: block;
+ width: 100%;
+ padding: 0;
+ margin-bottom: 20px;
+ font-size: 21px;
+ line-height: inherit;
+ color: #333333;
+ border: 0;
+ border-bottom: 1px solid #e5e5e5;
+}
+
+label {
+ display: inline-block;
+ margin-bottom: 5px;
+ font-weight: bold;
+}
+
+input[type="search"] {
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+}
+
+input[type="radio"],
+input[type="checkbox"] {
+ margin: 4px 0 0;
+ margin-top: 1px \9;
+ /* IE8-9 */
+
+ line-height: normal;
+}
+
+input[type="file"] {
+ display: block;
+}
+
+select[multiple],
+select[size] {
+ height: auto;
+}
+
+select optgroup {
+ font-family: inherit;
+ font-size: inherit;
+ font-style: inherit;
+}
+
+input[type="file"]:focus,
+input[type="radio"]:focus,
+input[type="checkbox"]:focus {
+ outline: thin dotted;
+ outline: 5px auto -webkit-focus-ring-color;
+ outline-offset: -2px;
+}
+
+input[type="number"]::-webkit-outer-spin-button,
+input[type="number"]::-webkit-inner-spin-button {
+ height: auto;
+}
+
+output {
+ display: block;
+ padding-top: 7px;
+ font-size: 14px;
+ line-height: 1.428571429;
+ color: #555555;
+ vertical-align: middle;
+}
+
+.form-control {
+ display: block;
+ width: 100%;
+ height: 34px;
+ padding: 6px 12px;
+ font-size: 14px;
+ line-height: 1.428571429;
+ color: #555555;
+ vertical-align: middle;
+ background-color: #ffffff;
+ background-image: none;
+ border: 1px solid #cccccc;
+ border-radius: 4px;
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+ -webkit-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;
+ transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;
+}
+
+.form-control:focus {
+ border-color: #66afe9;
+ outline: 0;
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);
+}
+
+.form-control:-moz-placeholder {
+ color: #999999;
+}
+
+.form-control::-moz-placeholder {
+ color: #999999;
+ opacity: 1;
+}
+
+.form-control:-ms-input-placeholder {
+ color: #999999;
+}
+
+.form-control::-webkit-input-placeholder {
+ color: #999999;
+}
+
+.form-control[disabled],
+.form-control[readonly],
+fieldset[disabled] .form-control {
+ cursor: not-allowed;
+ background-color: #eeeeee;
+}
+
+textarea.form-control {
+ height: auto;
+}
+
+.form-group {
+ margin-bottom: 15px;
+}
+
+.radio,
+.checkbox {
+ display: block;
+ min-height: 20px;
+ padding-left: 20px;
+ margin-top: 10px;
+ margin-bottom: 10px;
+ vertical-align: middle;
+}
+
+.radio label,
+.checkbox label {
+ display: inline;
+ margin-bottom: 0;
+ font-weight: normal;
+ cursor: pointer;
+}
+
+.radio input[type="radio"],
+.radio-inline input[type="radio"],
+.checkbox input[type="checkbox"],
+.checkbox-inline input[type="checkbox"] {
+ float: left;
+ margin-left: -20px;
+}
+
+.radio + .radio,
+.checkbox + .checkbox {
+ margin-top: -5px;
+}
+
+.radio-inline,
+.checkbox-inline {
+ display: inline-block;
+ padding-left: 20px;
+ margin-bottom: 0;
+ font-weight: normal;
+ vertical-align: middle;
+ cursor: pointer;
+}
+
+.radio-inline + .radio-inline,
+.checkbox-inline + .checkbox-inline {
+ margin-top: 0;
+ margin-left: 10px;
+}
+
+input[type="radio"][disabled],
+input[type="checkbox"][disabled],
+.radio[disabled],
+.radio-inline[disabled],
+.checkbox[disabled],
+.checkbox-inline[disabled],
+fieldset[disabled] input[type="radio"],
+fieldset[disabled] input[type="checkbox"],
+fieldset[disabled] .radio,
+fieldset[disabled] .radio-inline,
+fieldset[disabled] .checkbox,
+fieldset[disabled] .checkbox-inline {
+ cursor: not-allowed;
+}
+
+.input-sm {
+ height: 30px;
+ padding: 5px 10px;
+ font-size: 12px;
+ line-height: 1.5;
+ border-radius: 3px;
+}
+
+select.input-sm {
+ height: 30px;
+ line-height: 30px;
+}
+
+textarea.input-sm {
+ height: auto;
+}
+
+.input-lg {
+ height: 46px;
+ padding: 10px 16px;
+ font-size: 18px;
+ line-height: 1.33;
+ border-radius: 6px;
+}
+
+select.input-lg {
+ height: 46px;
+ line-height: 46px;
+}
+
+textarea.input-lg {
+ height: auto;
+}
+
+.has-warning .help-block,
+.has-warning .control-label,
+.has-warning .radio,
+.has-warning .checkbox,
+.has-warning .radio-inline,
+.has-warning .checkbox-inline {
+ color: #8a6d3b;
+}
+
+.has-warning .form-control {
+ border-color: #8a6d3b;
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+}
+
+.has-warning .form-control:focus {
+ border-color: #66512c;
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;
+}
+
+.has-warning .input-group-addon {
+ color: #8a6d3b;
+ background-color: #fcf8e3;
+ border-color: #8a6d3b;
+}
+
+.has-error .help-block,
+.has-error .control-label,
+.has-error .radio,
+.has-error .checkbox,
+.has-error .radio-inline,
+.has-error .checkbox-inline {
+ color: #a94442;
+}
+
+.has-error .form-control {
+ border-color: #a94442;
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+}
+
+.has-error .form-control:focus {
+ border-color: #843534;
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;
+}
+
+.has-error .input-group-addon {
+ color: #a94442;
+ background-color: #f2dede;
+ border-color: #a94442;
+}
+
+.has-success .help-block,
+.has-success .control-label,
+.has-success .radio,
+.has-success .checkbox,
+.has-success .radio-inline,
+.has-success .checkbox-inline {
+ color: #3c763d;
+}
+
+.has-success .form-control {
+ border-color: #3c763d;
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+}
+
+.has-success .form-control:focus {
+ border-color: #2b542c;
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;
+}
+
+.has-success .input-group-addon {
+ color: #3c763d;
+ background-color: #dff0d8;
+ border-color: #3c763d;
+}
+
+.form-control-static {
+ margin-bottom: 0;
+}
+
+.help-block {
+ display: block;
+ margin-top: 5px;
+ margin-bottom: 10px;
+ color: #737373;
+}
+
+@media (min-width: 768px) {
+ .form-inline .form-group {
+ display: inline-block;
+ margin-bottom: 0;
+ vertical-align: middle;
+ }
+ .form-inline .form-control {
+ display: inline-block;
+ }
+ .form-inline select.form-control {
+ width: auto;
+ }
+ .form-inline .radio,
+ .form-inline .checkbox {
+ display: inline-block;
+ padding-left: 0;
+ margin-top: 0;
+ margin-bottom: 0;
+ }
+ .form-inline .radio input[type="radio"],
+ .form-inline .checkbox input[type="checkbox"] {
+ float: none;
+ margin-left: 0;
+ }
+}
+
+.form-horizontal .control-label,
+.form-horizontal .radio,
+.form-horizontal .checkbox,
+.form-horizontal .radio-inline,
+.form-horizontal .checkbox-inline {
+ padding-top: 7px;
+ margin-top: 0;
+ margin-bottom: 0;
+}
+
+.form-horizontal .radio,
+.form-horizontal .checkbox {
+ min-height: 27px;
+}
+
+.form-horizontal .form-group {
+ margin-right: -15px;
+ margin-left: -15px;
+}
+
+.form-horizontal .form-group:before,
+.form-horizontal .form-group:after {
+ display: table;
+ content: " ";
+}
+
+.form-horizontal .form-group:after {
+ clear: both;
+}
+
+.form-horizontal .form-group:before,
+.form-horizontal .form-group:after {
+ display: table;
+ content: " ";
+}
+
+.form-horizontal .form-group:after {
+ clear: both;
+}
+
+.form-horizontal .form-control-static {
+ padding-top: 7px;
+}
+
+@media (min-width: 768px) {
+ .form-horizontal .control-label {
+ text-align: right;
+ }
+}
+
+.btn {
+ display: inline-block;
+ padding: 6px 12px;
+ margin-bottom: 0;
+ font-size: 14px;
+ font-weight: normal;
+ line-height: 1.428571429;
+ text-align: center;
+ white-space: nowrap;
+ vertical-align: middle;
+ cursor: pointer;
+ background-image: none;
+ border: 1px solid transparent;
+ border-radius: 4px;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ -o-user-select: none;
+ user-select: none;
+}
+
+.btn:focus {
+ outline: thin dotted;
+ outline: 5px auto -webkit-focus-ring-color;
+ outline-offset: -2px;
+}
+
+.btn:hover,
+.btn:focus {
+ color: #333333;
+ text-decoration: none;
+}
+
+.btn:active,
+.btn.active {
+ background-image: none;
+ outline: 0;
+ -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+}
+
+.btn.disabled,
+.btn[disabled],
+fieldset[disabled] .btn {
+ pointer-events: none;
+ cursor: not-allowed;
+ opacity: 0.65;
+ filter: alpha(opacity=65);
+ -webkit-box-shadow: none;
+ box-shadow: none;
+}
+
+.btn-default {
+ color: #333333;
+ background-color: #ffffff;
+ border-color: #cccccc;
+}
+
+.btn-default:hover,
+.btn-default:focus,
+.btn-default:active,
+.btn-default.active,
+.open .dropdown-toggle.btn-default {
+ color: #333333;
+ background-color: #ebebeb;
+ border-color: #adadad;
+}
+
+.btn-default:active,
+.btn-default.active,
+.open .dropdown-toggle.btn-default {
+ background-image: none;
+}
+
+.btn-default.disabled,
+.btn-default[disabled],
+fieldset[disabled] .btn-default,
+.btn-default.disabled:hover,
+.btn-default[disabled]:hover,
+fieldset[disabled] .btn-default:hover,
+.btn-default.disabled:focus,
+.btn-default[disabled]:focus,
+fieldset[disabled] .btn-default:focus,
+.btn-default.disabled:active,
+.btn-default[disabled]:active,
+fieldset[disabled] .btn-default:active,
+.btn-default.disabled.active,
+.btn-default[disabled].active,
+fieldset[disabled] .btn-default.active {
+ background-color: #ffffff;
+ border-color: #cccccc;
+}
+
+.btn-default .badge {
+ color: #ffffff;
+ background-color: #fff;
+}
+
+.btn-primary {
+ color: #ffffff;
+ background-color: #428bca;
+ border-color: #357ebd;
+}
+
+.btn-primary:hover,
+.btn-primary:focus,
+.btn-primary:active,
+.btn-primary.active,
+.open .dropdown-toggle.btn-primary {
+ color: #ffffff;
+ background-color: #3276b1;
+ border-color: #285e8e;
+}
+
+.btn-primary:active,
+.btn-primary.active,
+.open .dropdown-toggle.btn-primary {
+ background-image: none;
+}
+
+.btn-primary.disabled,
+.btn-primary[disabled],
+fieldset[disabled] .btn-primary,
+.btn-primary.disabled:hover,
+.btn-primary[disabled]:hover,
+fieldset[disabled] .btn-primary:hover,
+.btn-primary.disabled:focus,
+.btn-primary[disabled]:focus,
+fieldset[disabled] .btn-primary:focus,
+.btn-primary.disabled:active,
+.btn-primary[disabled]:active,
+fieldset[disabled] .btn-primary:active,
+.btn-primary.disabled.active,
+.btn-primary[disabled].active,
+fieldset[disabled] .btn-primary.active {
+ background-color: #428bca;
+ border-color: #357ebd;
+}
+
+.btn-primary .badge {
+ color: #428bca;
+ background-color: #fff;
+}
+
+.btn-warning {
+ color: #ffffff;
+ background-color: #f0ad4e;
+ border-color: #eea236;
+}
+
+.btn-warning:hover,
+.btn-warning:focus,
+.btn-warning:active,
+.btn-warning.active,
+.open .dropdown-toggle.btn-warning {
+ color: #ffffff;
+ background-color: #ed9c28;
+ border-color: #d58512;
+}
+
+.btn-warning:active,
+.btn-warning.active,
+.open .dropdown-toggle.btn-warning {
+ background-image: none;
+}
+
+.btn-warning.disabled,
+.btn-warning[disabled],
+fieldset[disabled] .btn-warning,
+.btn-warning.disabled:hover,
+.btn-warning[disabled]:hover,
+fieldset[disabled] .btn-warning:hover,
+.btn-warning.disabled:focus,
+.btn-warning[disabled]:focus,
+fieldset[disabled] .btn-warning:focus,
+.btn-warning.disabled:active,
+.btn-warning[disabled]:active,
+fieldset[disabled] .btn-warning:active,
+.btn-warning.disabled.active,
+.btn-warning[disabled].active,
+fieldset[disabled] .btn-warning.active {
+ background-color: #f0ad4e;
+ border-color: #eea236;
+}
+
+.btn-warning .badge {
+ color: #f0ad4e;
+ background-color: #fff;
+}
+
+.btn-danger {
+ color: #ffffff;
+ background-color: #d9534f;
+ border-color: #d43f3a;
+}
+
+.btn-danger:hover,
+.btn-danger:focus,
+.btn-danger:active,
+.btn-danger.active,
+.open .dropdown-toggle.btn-danger {
+ color: #ffffff;
+ background-color: #d2322d;
+ border-color: #ac2925;
+}
+
+.btn-danger:active,
+.btn-danger.active,
+.open .dropdown-toggle.btn-danger {
+ background-image: none;
+}
+
+.btn-danger.disabled,
+.btn-danger[disabled],
+fieldset[disabled] .btn-danger,
+.btn-danger.disabled:hover,
+.btn-danger[disabled]:hover,
+fieldset[disabled] .btn-danger:hover,
+.btn-danger.disabled:focus,
+.btn-danger[disabled]:focus,
+fieldset[disabled] .btn-danger:focus,
+.btn-danger.disabled:active,
+.btn-danger[disabled]:active,
+fieldset[disabled] .btn-danger:active,
+.btn-danger.disabled.active,
+.btn-danger[disabled].active,
+fieldset[disabled] .btn-danger.active {
+ background-color: #d9534f;
+ border-color: #d43f3a;
+}
+
+.btn-danger .badge {
+ color: #d9534f;
+ background-color: #fff;
+}
+
+.btn-success {
+ color: #ffffff;
+ background-color: #5cb85c;
+ border-color: #4cae4c;
+}
+
+.btn-success:hover,
+.btn-success:focus,
+.btn-success:active,
+.btn-success.active,
+.open .dropdown-toggle.btn-success {
+ color: #ffffff;
+ background-color: #47a447;
+ border-color: #398439;
+}
+
+.btn-success:active,
+.btn-success.active,
+.open .dropdown-toggle.btn-success {
+ background-image: none;
+}
+
+.btn-success.disabled,
+.btn-success[disabled],
+fieldset[disabled] .btn-success,
+.btn-success.disabled:hover,
+.btn-success[disabled]:hover,
+fieldset[disabled] .btn-success:hover,
+.btn-success.disabled:focus,
+.btn-success[disabled]:focus,
+fieldset[disabled] .btn-success:focus,
+.btn-success.disabled:active,
+.btn-success[disabled]:active,
+fieldset[disabled] .btn-success:active,
+.btn-success.disabled.active,
+.btn-success[disabled].active,
+fieldset[disabled] .btn-success.active {
+ background-color: #5cb85c;
+ border-color: #4cae4c;
+}
+
+.btn-success .badge {
+ color: #5cb85c;
+ background-color: #fff;
+}
+
+.btn-info {
+ color: #ffffff;
+ background-color: #5bc0de;
+ border-color: #46b8da;
+}
+
+.btn-info:hover,
+.btn-info:focus,
+.btn-info:active,
+.btn-info.active,
+.open .dropdown-toggle.btn-info {
+ color: #ffffff;
+ background-color: #39b3d7;
+ border-color: #269abc;
+}
+
+.btn-info:active,
+.btn-info.active,
+.open .dropdown-toggle.btn-info {
+ background-image: none;
+}
+
+.btn-info.disabled,
+.btn-info[disabled],
+fieldset[disabled] .btn-info,
+.btn-info.disabled:hover,
+.btn-info[disabled]:hover,
+fieldset[disabled] .btn-info:hover,
+.btn-info.disabled:focus,
+.btn-info[disabled]:focus,
+fieldset[disabled] .btn-info:focus,
+.btn-info.disabled:active,
+.btn-info[disabled]:active,
+fieldset[disabled] .btn-info:active,
+.btn-info.disabled.active,
+.btn-info[disabled].active,
+fieldset[disabled] .btn-info.active {
+ background-color: #5bc0de;
+ border-color: #46b8da;
+}
+
+.btn-info .badge {
+ color: #5bc0de;
+ background-color: #fff;
+}
+
+.btn-link {
+ font-weight: normal;
+ color: #428bca;
+ cursor: pointer;
+ border-radius: 0;
+}
+
+.btn-link,
+.btn-link:active,
+.btn-link[disabled],
+fieldset[disabled] .btn-link {
+ background-color: transparent;
+ -webkit-box-shadow: none;
+ box-shadow: none;
+}
+
+.btn-link,
+.btn-link:hover,
+.btn-link:focus,
+.btn-link:active {
+ border-color: transparent;
+}
+
+.btn-link:hover,
+.btn-link:focus {
+ color: #2a6496;
+ text-decoration: underline;
+ background-color: transparent;
+}
+
+.btn-link[disabled]:hover,
+fieldset[disabled] .btn-link:hover,
+.btn-link[disabled]:focus,
+fieldset[disabled] .btn-link:focus {
+ color: #999999;
+ text-decoration: none;
+}
+
+.btn-lg {
+ padding: 10px 16px;
+ font-size: 18px;
+ line-height: 1.33;
+ border-radius: 6px;
+}
+
+.btn-sm {
+ padding: 5px 10px;
+ font-size: 12px;
+ line-height: 1.5;
+ border-radius: 3px;
+}
+
+.btn-xs {
+ padding: 1px 5px;
+ font-size: 12px;
+ line-height: 1.5;
+ border-radius: 3px;
+}
+
+.btn-block {
+ display: block;
+ width: 100%;
+ padding-right: 0;
+ padding-left: 0;
+}
+
+.btn-block + .btn-block {
+ margin-top: 5px;
+}
+
+input[type="submit"].btn-block,
+input[type="reset"].btn-block,
+input[type="button"].btn-block {
+ width: 100%;
+}
+
+.fade {
+ opacity: 0;
+ -webkit-transition: opacity 0.15s linear;
+ transition: opacity 0.15s linear;
+}
+
+.fade.in {
+ opacity: 1;
+}
+
+.collapse {
+ display: none;
+}
+
+.collapse.in {
+ display: block;
+}
+
+.collapsing {
+ position: relative;
+ height: 0;
+ overflow: hidden;
+ -webkit-transition: height 0.35s ease;
+ transition: height 0.35s ease;
+}
+
+@font-face {
+ font-family: 'Glyphicons Halflings';
+ src: url('../fonts/glyphicons-halflings-regular.eot');
+ src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons-halflingsregular') format('svg');
+}
+
+.glyphicon {
+ position: relative;
+ top: 1px;
+ display: inline-block;
+ font-family: 'Glyphicons Halflings';
+ -webkit-font-smoothing: antialiased;
+ font-style: normal;
+ font-weight: normal;
+ line-height: 1;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+.glyphicon:empty {
+ width: 1em;
+}
+
+.glyphicon-asterisk:before {
+ content: "\2a";
+}
+
+.glyphicon-plus:before {
+ content: "\2b";
+}
+
+.glyphicon-euro:before {
+ content: "\20ac";
+}
+
+.glyphicon-minus:before {
+ content: "\2212";
+}
+
+.glyphicon-cloud:before {
+ content: "\2601";
+}
+
+.glyphicon-envelope:before {
+ content: "\2709";
+}
+
+.glyphicon-pencil:before {
+ content: "\270f";
+}
+
+.glyphicon-glass:before {
+ content: "\e001";
+}
+
+.glyphicon-music:before {
+ content: "\e002";
+}
+
+.glyphicon-search:before {
+ content: "\e003";
+}
+
+.glyphicon-heart:before {
+ content: "\e005";
+}
+
+.glyphicon-star:before {
+ content: "\e006";
+}
+
+.glyphicon-star-empty:before {
+ content: "\e007";
+}
+
+.glyphicon-user:before {
+ content: "\e008";
+}
+
+.glyphicon-film:before {
+ content: "\e009";
+}
+
+.glyphicon-th-large:before {
+ content: "\e010";
+}
+
+.glyphicon-th:before {
+ content: "\e011";
+}
+
+.glyphicon-th-list:before {
+ content: "\e012";
+}
+
+.glyphicon-ok:before {
+ content: "\e013";
+}
+
+.glyphicon-remove:before {
+ content: "\e014";
+}
+
+.glyphicon-zoom-in:before {
+ content: "\e015";
+}
+
+.glyphicon-zoom-out:before {
+ content: "\e016";
+}
+
+.glyphicon-off:before {
+ content: "\e017";
+}
+
+.glyphicon-signal:before {
+ content: "\e018";
+}
+
+.glyphicon-cog:before {
+ content: "\e019";
+}
+
+.glyphicon-trash:before {
+ content: "\e020";
+}
+
+.glyphicon-home:before {
+ content: "\e021";
+}
+
+.glyphicon-file:before {
+ content: "\e022";
+}
+
+.glyphicon-time:before {
+ content: "\e023";
+}
+
+.glyphicon-road:before {
+ content: "\e024";
+}
+
+.glyphicon-download-alt:before {
+ content: "\e025";
+}
+
+.glyphicon-download:before {
+ content: "\e026";
+}
+
+.glyphicon-upload:before {
+ content: "\e027";
+}
+
+.glyphicon-inbox:before {
+ content: "\e028";
+}
+
+.glyphicon-play-circle:before {
+ content: "\e029";
+}
+
+.glyphicon-repeat:before {
+ content: "\e030";
+}
+
+.glyphicon-refresh:before {
+ content: "\e031";
+}
+
+.glyphicon-list-alt:before {
+ content: "\e032";
+}
+
+.glyphicon-lock:before {
+ content: "\e033";
+}
+
+.glyphicon-flag:before {
+ content: "\e034";
+}
+
+.glyphicon-headphones:before {
+ content: "\e035";
+}
+
+.glyphicon-volume-off:before {
+ content: "\e036";
+}
+
+.glyphicon-volume-down:before {
+ content: "\e037";
+}
+
+.glyphicon-volume-up:before {
+ content: "\e038";
+}
+
+.glyphicon-qrcode:before {
+ content: "\e039";
+}
+
+.glyphicon-barcode:before {
+ content: "\e040";
+}
+
+.glyphicon-tag:before {
+ content: "\e041";
+}
+
+.glyphicon-tags:before {
+ content: "\e042";
+}
+
+.glyphicon-book:before {
+ content: "\e043";
+}
+
+.glyphicon-bookmark:before {
+ content: "\e044";
+}
+
+.glyphicon-print:before {
+ content: "\e045";
+}
+
+.glyphicon-camera:before {
+ content: "\e046";
+}
+
+.glyphicon-font:before {
+ content: "\e047";
+}
+
+.glyphicon-bold:before {
+ content: "\e048";
+}
+
+.glyphicon-italic:before {
+ content: "\e049";
+}
+
+.glyphicon-text-height:before {
+ content: "\e050";
+}
+
+.glyphicon-text-width:before {
+ content: "\e051";
+}
+
+.glyphicon-align-left:before {
+ content: "\e052";
+}
+
+.glyphicon-align-center:before {
+ content: "\e053";
+}
+
+.glyphicon-align-right:before {
+ content: "\e054";
+}
+
+.glyphicon-align-justify:before {
+ content: "\e055";
+}
+
+.glyphicon-list:before {
+ content: "\e056";
+}
+
+.glyphicon-indent-left:before {
+ content: "\e057";
+}
+
+.glyphicon-indent-right:before {
+ content: "\e058";
+}
+
+.glyphicon-facetime-video:before {
+ content: "\e059";
+}
+
+.glyphicon-picture:before {
+ content: "\e060";
+}
+
+.glyphicon-map-marker:before {
+ content: "\e062";
+}
+
+.glyphicon-adjust:before {
+ content: "\e063";
+}
+
+.glyphicon-tint:before {
+ content: "\e064";
+}
+
+.glyphicon-edit:before {
+ content: "\e065";
+}
+
+.glyphicon-share:before {
+ content: "\e066";
+}
+
+.glyphicon-check:before {
+ content: "\e067";
+}
+
+.glyphicon-move:before {
+ content: "\e068";
+}
+
+.glyphicon-step-backward:before {
+ content: "\e069";
+}
+
+.glyphicon-fast-backward:before {
+ content: "\e070";
+}
+
+.glyphicon-backward:before {
+ content: "\e071";
+}
+
+.glyphicon-play:before {
+ content: "\e072";
+}
+
+.glyphicon-pause:before {
+ content: "\e073";
+}
+
+.glyphicon-stop:before {
+ content: "\e074";
+}
+
+.glyphicon-forward:before {
+ content: "\e075";
+}
+
+.glyphicon-fast-forward:before {
+ content: "\e076";
+}
+
+.glyphicon-step-forward:before {
+ content: "\e077";
+}
+
+.glyphicon-eject:before {
+ content: "\e078";
+}
+
+.glyphicon-chevron-left:before {
+ content: "\e079";
+}
+
+.glyphicon-chevron-right:before {
+ content: "\e080";
+}
+
+.glyphicon-plus-sign:before {
+ content: "\e081";
+}
+
+.glyphicon-minus-sign:before {
+ content: "\e082";
+}
+
+.glyphicon-remove-sign:before {
+ content: "\e083";
+}
+
+.glyphicon-ok-sign:before {
+ content: "\e084";
+}
+
+.glyphicon-question-sign:before {
+ content: "\e085";
+}
+
+.glyphicon-info-sign:before {
+ content: "\e086";
+}
+
+.glyphicon-screenshot:before {
+ content: "\e087";
+}
+
+.glyphicon-remove-circle:before {
+ content: "\e088";
+}
+
+.glyphicon-ok-circle:before {
+ content: "\e089";
+}
+
+.glyphicon-ban-circle:before {
+ content: "\e090";
+}
+
+.glyphicon-arrow-left:before {
+ content: "\e091";
+}
+
+.glyphicon-arrow-right:before {
+ content: "\e092";
+}
+
+.glyphicon-arrow-up:before {
+ content: "\e093";
+}
+
+.glyphicon-arrow-down:before {
+ content: "\e094";
+}
+
+.glyphicon-share-alt:before {
+ content: "\e095";
+}
+
+.glyphicon-resize-full:before {
+ content: "\e096";
+}
+
+.glyphicon-resize-small:before {
+ content: "\e097";
+}
+
+.glyphicon-exclamation-sign:before {
+ content: "\e101";
+}
+
+.glyphicon-gift:before {
+ content: "\e102";
+}
+
+.glyphicon-leaf:before {
+ content: "\e103";
+}
+
+.glyphicon-fire:before {
+ content: "\e104";
+}
+
+.glyphicon-eye-open:before {
+ content: "\e105";
+}
+
+.glyphicon-eye-close:before {
+ content: "\e106";
+}
+
+.glyphicon-warning-sign:before {
+ content: "\e107";
+}
+
+.glyphicon-plane:before {
+ content: "\e108";
+}
+
+.glyphicon-calendar:before {
+ content: "\e109";
+}
+
+.glyphicon-random:before {
+ content: "\e110";
+}
+
+.glyphicon-comment:before {
+ content: "\e111";
+}
+
+.glyphicon-magnet:before {
+ content: "\e112";
+}
+
+.glyphicon-chevron-up:before {
+ content: "\e113";
+}
+
+.glyphicon-chevron-down:before {
+ content: "\e114";
+}
+
+.glyphicon-retweet:before {
+ content: "\e115";
+}
+
+.glyphicon-shopping-cart:before {
+ content: "\e116";
+}
+
+.glyphicon-folder-close:before {
+ content: "\e117";
+}
+
+.glyphicon-folder-open:before {
+ content: "\e118";
+}
+
+.glyphicon-resize-vertical:before {
+ content: "\e119";
+}
+
+.glyphicon-resize-horizontal:before {
+ content: "\e120";
+}
+
+.glyphicon-hdd:before {
+ content: "\e121";
+}
+
+.glyphicon-bullhorn:before {
+ content: "\e122";
+}
+
+.glyphicon-bell:before {
+ content: "\e123";
+}
+
+.glyphicon-certificate:before {
+ content: "\e124";
+}
+
+.glyphicon-thumbs-up:before {
+ content: "\e125";
+}
+
+.glyphicon-thumbs-down:before {
+ content: "\e126";
+}
+
+.glyphicon-hand-right:before {
+ content: "\e127";
+}
+
+.glyphicon-hand-left:before {
+ content: "\e128";
+}
+
+.glyphicon-hand-up:before {
+ content: "\e129";
+}
+
+.glyphicon-hand-down:before {
+ content: "\e130";
+}
+
+.glyphicon-circle-arrow-right:before {
+ content: "\e131";
+}
+
+.glyphicon-circle-arrow-left:before {
+ content: "\e132";
+}
+
+.glyphicon-circle-arrow-up:before {
+ content: "\e133";
+}
+
+.glyphicon-circle-arrow-down:before {
+ content: "\e134";
+}
+
+.glyphicon-globe:before {
+ content: "\e135";
+}
+
+.glyphicon-wrench:before {
+ content: "\e136";
+}
+
+.glyphicon-tasks:before {
+ content: "\e137";
+}
+
+.glyphicon-filter:before {
+ content: "\e138";
+}
+
+.glyphicon-briefcase:before {
+ content: "\e139";
+}
+
+.glyphicon-fullscreen:before {
+ content: "\e140";
+}
+
+.glyphicon-dashboard:before {
+ content: "\e141";
+}
+
+.glyphicon-paperclip:before {
+ content: "\e142";
+}
+
+.glyphicon-heart-empty:before {
+ content: "\e143";
+}
+
+.glyphicon-link:before {
+ content: "\e144";
+}
+
+.glyphicon-phone:before {
+ content: "\e145";
+}
+
+.glyphicon-pushpin:before {
+ content: "\e146";
+}
+
+.glyphicon-usd:before {
+ content: "\e148";
+}
+
+.glyphicon-gbp:before {
+ content: "\e149";
+}
+
+.glyphicon-sort:before {
+ content: "\e150";
+}
+
+.glyphicon-sort-by-alphabet:before {
+ content: "\e151";
+}
+
+.glyphicon-sort-by-alphabet-alt:before {
+ content: "\e152";
+}
+
+.glyphicon-sort-by-order:before {
+ content: "\e153";
+}
+
+.glyphicon-sort-by-order-alt:before {
+ content: "\e154";
+}
+
+.glyphicon-sort-by-attributes:before {
+ content: "\e155";
+}
+
+.glyphicon-sort-by-attributes-alt:before {
+ content: "\e156";
+}
+
+.glyphicon-unchecked:before {
+ content: "\e157";
+}
+
+.glyphicon-expand:before {
+ content: "\e158";
+}
+
+.glyphicon-collapse-down:before {
+ content: "\e159";
+}
+
+.glyphicon-collapse-up:before {
+ content: "\e160";
+}
+
+.glyphicon-log-in:before {
+ content: "\e161";
+}
+
+.glyphicon-flash:before {
+ content: "\e162";
+}
+
+.glyphicon-log-out:before {
+ content: "\e163";
+}
+
+.glyphicon-new-window:before {
+ content: "\e164";
+}
+
+.glyphicon-record:before {
+ content: "\e165";
+}
+
+.glyphicon-save:before {
+ content: "\e166";
+}
+
+.glyphicon-open:before {
+ content: "\e167";
+}
+
+.glyphicon-saved:before {
+ content: "\e168";
+}
+
+.glyphicon-import:before {
+ content: "\e169";
+}
+
+.glyphicon-export:before {
+ content: "\e170";
+}
+
+.glyphicon-send:before {
+ content: "\e171";
+}
+
+.glyphicon-floppy-disk:before {
+ content: "\e172";
+}
+
+.glyphicon-floppy-saved:before {
+ content: "\e173";
+}
+
+.glyphicon-floppy-remove:before {
+ content: "\e174";
+}
+
+.glyphicon-floppy-save:before {
+ content: "\e175";
+}
+
+.glyphicon-floppy-open:before {
+ content: "\e176";
+}
+
+.glyphicon-credit-card:before {
+ content: "\e177";
+}
+
+.glyphicon-transfer:before {
+ content: "\e178";
+}
+
+.glyphicon-cutlery:before {
+ content: "\e179";
+}
+
+.glyphicon-header:before {
+ content: "\e180";
+}
+
+.glyphicon-compressed:before {
+ content: "\e181";
+}
+
+.glyphicon-earphone:before {
+ content: "\e182";
+}
+
+.glyphicon-phone-alt:before {
+ content: "\e183";
+}
+
+.glyphicon-tower:before {
+ content: "\e184";
+}
+
+.glyphicon-stats:before {
+ content: "\e185";
+}
+
+.glyphicon-sd-video:before {
+ content: "\e186";
+}
+
+.glyphicon-hd-video:before {
+ content: "\e187";
+}
+
+.glyphicon-subtitles:before {
+ content: "\e188";
+}
+
+.glyphicon-sound-stereo:before {
+ content: "\e189";
+}
+
+.glyphicon-sound-dolby:before {
+ content: "\e190";
+}
+
+.glyphicon-sound-5-1:before {
+ content: "\e191";
+}
+
+.glyphicon-sound-6-1:before {
+ content: "\e192";
+}
+
+.glyphicon-sound-7-1:before {
+ content: "\e193";
+}
+
+.glyphicon-copyright-mark:before {
+ content: "\e194";
+}
+
+.glyphicon-registration-mark:before {
+ content: "\e195";
+}
+
+.glyphicon-cloud-download:before {
+ content: "\e197";
+}
+
+.glyphicon-cloud-upload:before {
+ content: "\e198";
+}
+
+.glyphicon-tree-conifer:before {
+ content: "\e199";
+}
+
+.glyphicon-tree-deciduous:before {
+ content: "\e200";
+}
+
+.caret {
+ display: inline-block;
+ width: 0;
+ height: 0;
+ margin-left: 2px;
+ vertical-align: middle;
+ border-top: 4px solid;
+ border-right: 4px solid transparent;
+ border-left: 4px solid transparent;
+}
+
+.dropdown {
+ position: relative;
+}
+
+.dropdown-toggle:focus {
+ outline: 0;
+}
+
+.dropdown-menu {
+ position: absolute;
+ top: 100%;
+ left: 0;
+ z-index: 1000;
+ display: none;
+ float: left;
+ min-width: 160px;
+ padding: 5px 0;
+ margin: 2px 0 0;
+ font-size: 14px;
+ list-style: none;
+ background-color: #ffffff;
+ border: 1px solid #cccccc;
+ border: 1px solid rgba(0, 0, 0, 0.15);
+ border-radius: 4px;
+ -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);
+ box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);
+ background-clip: padding-box;
+}
+
+.dropdown-menu.pull-right {
+ right: 0;
+ left: auto;
+}
+
+.dropdown-menu .divider {
+ height: 1px;
+ margin: 9px 0;
+ overflow: hidden;
+ background-color: #e5e5e5;
+}
+
+.dropdown-menu > li > a {
+ display: block;
+ padding: 3px 20px;
+ clear: both;
+ font-weight: normal;
+ line-height: 1.428571429;
+ color: #333333;
+ white-space: nowrap;
+}
+
+.dropdown-menu > li > a:hover,
+.dropdown-menu > li > a:focus {
+ color: #262626;
+ text-decoration: none;
+ background-color: #f5f5f5;
+}
+
+.dropdown-menu > .active > a,
+.dropdown-menu > .active > a:hover,
+.dropdown-menu > .active > a:focus {
+ color: #ffffff;
+ text-decoration: none;
+ background-color: #428bca;
+ outline: 0;
+}
+
+.dropdown-menu > .disabled > a,
+.dropdown-menu > .disabled > a:hover,
+.dropdown-menu > .disabled > a:focus {
+ color: #999999;
+}
+
+.dropdown-menu > .disabled > a:hover,
+.dropdown-menu > .disabled > a:focus {
+ text-decoration: none;
+ cursor: not-allowed;
+ background-color: transparent;
+ background-image: none;
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+}
+
+.open > .dropdown-menu {
+ display: block;
+}
+
+.open > a {
+ outline: 0;
+}
+
+.dropdown-header {
+ display: block;
+ padding: 3px 20px;
+ font-size: 12px;
+ line-height: 1.428571429;
+ color: #999999;
+}
+
+.dropdown-backdrop {
+ position: fixed;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 990;
+}
+
+.pull-right > .dropdown-menu {
+ right: 0;
+ left: auto;
+}
+
+.dropup .caret,
+.navbar-fixed-bottom .dropdown .caret {
+ border-top: 0;
+ border-bottom: 4px solid;
+ content: "";
+}
+
+.dropup .dropdown-menu,
+.navbar-fixed-bottom .dropdown .dropdown-menu {
+ top: auto;
+ bottom: 100%;
+ margin-bottom: 1px;
+}
+
+@media (min-width: 768px) {
+ .navbar-right .dropdown-menu {
+ right: 0;
+ left: auto;
+ }
+}
+
+.btn-group,
+.btn-group-vertical {
+ position: relative;
+ display: inline-block;
+ vertical-align: middle;
+}
+
+.btn-group > .btn,
+.btn-group-vertical > .btn {
+ position: relative;
+ float: left;
+}
+
+.btn-group > .btn:hover,
+.btn-group-vertical > .btn:hover,
+.btn-group > .btn:focus,
+.btn-group-vertical > .btn:focus,
+.btn-group > .btn:active,
+.btn-group-vertical > .btn:active,
+.btn-group > .btn.active,
+.btn-group-vertical > .btn.active {
+ z-index: 2;
+}
+
+.btn-group > .btn:focus,
+.btn-group-vertical > .btn:focus {
+ outline: none;
+}
+
+.btn-group .btn + .btn,
+.btn-group .btn + .btn-group,
+.btn-group .btn-group + .btn,
+.btn-group .btn-group + .btn-group {
+ margin-left: -1px;
+}
+
+.btn-toolbar:before,
+.btn-toolbar:after {
+ display: table;
+ content: " ";
+}
+
+.btn-toolbar:after {
+ clear: both;
+}
+
+.btn-toolbar:before,
+.btn-toolbar:after {
+ display: table;
+ content: " ";
+}
+
+.btn-toolbar:after {
+ clear: both;
+}
+
+.btn-toolbar .btn-group {
+ float: left;
+}
+
+.btn-toolbar > .btn + .btn,
+.btn-toolbar > .btn-group + .btn,
+.btn-toolbar > .btn + .btn-group,
+.btn-toolbar > .btn-group + .btn-group {
+ margin-left: 5px;
+}
+
+.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {
+ border-radius: 0;
+}
+
+.btn-group > .btn:first-child {
+ margin-left: 0;
+}
+
+.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+}
+
+.btn-group > .btn:last-child:not(:first-child),
+.btn-group > .dropdown-toggle:not(:first-child) {
+ border-bottom-left-radius: 0;
+ border-top-left-radius: 0;
+}
+
+.btn-group > .btn-group {
+ float: left;
+}
+
+.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {
+ border-radius: 0;
+}
+
+.btn-group > .btn-group:first-child > .btn:last-child,
+.btn-group > .btn-group:first-child > .dropdown-toggle {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+}
+
+.btn-group > .btn-group:last-child > .btn:first-child {
+ border-bottom-left-radius: 0;
+ border-top-left-radius: 0;
+}
+
+.btn-group .dropdown-toggle:active,
+.btn-group.open .dropdown-toggle {
+ outline: 0;
+}
+
+.btn-group-xs > .btn {
+ padding: 1px 5px;
+ font-size: 12px;
+ line-height: 1.5;
+ border-radius: 3px;
+}
+
+.btn-group-sm > .btn {
+ padding: 5px 10px;
+ font-size: 12px;
+ line-height: 1.5;
+ border-radius: 3px;
+}
+
+.btn-group-lg > .btn {
+ padding: 10px 16px;
+ font-size: 18px;
+ line-height: 1.33;
+ border-radius: 6px;
+}
+
+.btn-group > .btn + .dropdown-toggle {
+ padding-right: 8px;
+ padding-left: 8px;
+}
+
+.btn-group > .btn-lg + .dropdown-toggle {
+ padding-right: 12px;
+ padding-left: 12px;
+}
+
+.btn-group.open .dropdown-toggle {
+ -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+}
+
+.btn-group.open .dropdown-toggle.btn-link {
+ -webkit-box-shadow: none;
+ box-shadow: none;
+}
+
+.btn .caret {
+ margin-left: 0;
+}
+
+.btn-lg .caret {
+ border-width: 5px 5px 0;
+ border-bottom-width: 0;
+}
+
+.dropup .btn-lg .caret {
+ border-width: 0 5px 5px;
+}
+
+.btn-group-vertical > .btn,
+.btn-group-vertical > .btn-group,
+.btn-group-vertical > .btn-group > .btn {
+ display: block;
+ float: none;
+ width: 100%;
+ max-width: 100%;
+}
+
+.btn-group-vertical > .btn-group:before,
+.btn-group-vertical > .btn-group:after {
+ display: table;
+ content: " ";
+}
+
+.btn-group-vertical > .btn-group:after {
+ clear: both;
+}
+
+.btn-group-vertical > .btn-group:before,
+.btn-group-vertical > .btn-group:after {
+ display: table;
+ content: " ";
+}
+
+.btn-group-vertical > .btn-group:after {
+ clear: both;
+}
+
+.btn-group-vertical > .btn-group > .btn {
+ float: none;
+}
+
+.btn-group-vertical > .btn + .btn,
+.btn-group-vertical > .btn + .btn-group,
+.btn-group-vertical > .btn-group + .btn,
+.btn-group-vertical > .btn-group + .btn-group {
+ margin-top: -1px;
+ margin-left: 0;
+}
+
+.btn-group-vertical > .btn:not(:first-child):not(:last-child) {
+ border-radius: 0;
+}
+
+.btn-group-vertical > .btn:first-child:not(:last-child) {
+ border-top-right-radius: 4px;
+ border-bottom-right-radius: 0;
+ border-bottom-left-radius: 0;
+}
+
+.btn-group-vertical > .btn:last-child:not(:first-child) {
+ border-top-right-radius: 0;
+ border-bottom-left-radius: 4px;
+ border-top-left-radius: 0;
+}
+
+.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {
+ border-radius: 0;
+}
+
+.btn-group-vertical > .btn-group:first-child > .btn:last-child,
+.btn-group-vertical > .btn-group:first-child > .dropdown-toggle {
+ border-bottom-right-radius: 0;
+ border-bottom-left-radius: 0;
+}
+
+.btn-group-vertical > .btn-group:last-child > .btn:first-child {
+ border-top-right-radius: 0;
+ border-top-left-radius: 0;
+}
+
+.btn-group-justified {
+ display: table;
+ width: 100%;
+ border-collapse: separate;
+ table-layout: fixed;
+}
+
+.btn-group-justified > .btn,
+.btn-group-justified > .btn-group {
+ display: table-cell;
+ float: none;
+ width: 1%;
+}
+
+.btn-group-justified > .btn-group .btn {
+ width: 100%;
+}
+
+[data-toggle="buttons"] > .btn > input[type="radio"],
+[data-toggle="buttons"] > .btn > input[type="checkbox"] {
+ display: none;
+}
+
+.input-group {
+ position: relative;
+ display: table;
+ border-collapse: separate;
+}
+
+.input-group[class*="col-"] {
+ float: none;
+ padding-right: 0;
+ padding-left: 0;
+}
+
+.input-group .form-control {
+ width: 100%;
+ margin-bottom: 0;
+}
+
+.input-group-lg > .form-control,
+.input-group-lg > .input-group-addon,
+.input-group-lg > .input-group-btn > .btn {
+ height: 46px;
+ padding: 10px 16px;
+ font-size: 18px;
+ line-height: 1.33;
+ border-radius: 6px;
+}
+
+select.input-group-lg > .form-control,
+select.input-group-lg > .input-group-addon,
+select.input-group-lg > .input-group-btn > .btn {
+ height: 46px;
+ line-height: 46px;
+}
+
+textarea.input-group-lg > .form-control,
+textarea.input-group-lg > .input-group-addon,
+textarea.input-group-lg > .input-group-btn > .btn {
+ height: auto;
+}
+
+.input-group-sm > .form-control,
+.input-group-sm > .input-group-addon,
+.input-group-sm > .input-group-btn > .btn {
+ height: 30px;
+ padding: 5px 10px;
+ font-size: 12px;
+ line-height: 1.5;
+ border-radius: 3px;
+}
+
+select.input-group-sm > .form-control,
+select.input-group-sm > .input-group-addon,
+select.input-group-sm > .input-group-btn > .btn {
+ height: 30px;
+ line-height: 30px;
+}
+
+textarea.input-group-sm > .form-control,
+textarea.input-group-sm > .input-group-addon,
+textarea.input-group-sm > .input-group-btn > .btn {
+ height: auto;
+}
+
+.input-group-addon,
+.input-group-btn,
+.input-group .form-control {
+ display: table-cell;
+}
+
+.input-group-addon:not(:first-child):not(:last-child),
+.input-group-btn:not(:first-child):not(:last-child),
+.input-group .form-control:not(:first-child):not(:last-child) {
+ border-radius: 0;
+}
+
+.input-group-addon,
+.input-group-btn {
+ width: 1%;
+ white-space: nowrap;
+ vertical-align: middle;
+}
+
+.input-group-addon {
+ padding: 6px 12px;
+ font-size: 14px;
+ font-weight: normal;
+ line-height: 1;
+ color: #555555;
+ text-align: center;
+ background-color: #eeeeee;
+ border: 1px solid #cccccc;
+ border-radius: 4px;
+}
+
+.input-group-addon.input-sm {
+ padding: 5px 10px;
+ font-size: 12px;
+ border-radius: 3px;
+}
+
+.input-group-addon.input-lg {
+ padding: 10px 16px;
+ font-size: 18px;
+ border-radius: 6px;
+}
+
+.input-group-addon input[type="radio"],
+.input-group-addon input[type="checkbox"] {
+ margin-top: 0;
+}
+
+.input-group .form-control:first-child,
+.input-group-addon:first-child,
+.input-group-btn:first-child > .btn,
+.input-group-btn:first-child > .dropdown-toggle,
+.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle) {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+}
+
+.input-group-addon:first-child {
+ border-right: 0;
+}
+
+.input-group .form-control:last-child,
+.input-group-addon:last-child,
+.input-group-btn:last-child > .btn,
+.input-group-btn:last-child > .dropdown-toggle,
+.input-group-btn:first-child > .btn:not(:first-child) {
+ border-bottom-left-radius: 0;
+ border-top-left-radius: 0;
+}
+
+.input-group-addon:last-child {
+ border-left: 0;
+}
+
+.input-group-btn {
+ position: relative;
+ white-space: nowrap;
+}
+
+.input-group-btn:first-child > .btn {
+ margin-right: -1px;
+}
+
+.input-group-btn:last-child > .btn {
+ margin-left: -1px;
+}
+
+.input-group-btn > .btn {
+ position: relative;
+}
+
+.input-group-btn > .btn + .btn {
+ margin-left: -4px;
+}
+
+.input-group-btn > .btn:hover,
+.input-group-btn > .btn:active {
+ z-index: 2;
+}
+
+.nav {
+ padding-left: 0;
+ margin-bottom: 0;
+ list-style: none;
+}
+
+.nav:before,
+.nav:after {
+ display: table;
+ content: " ";
+}
+
+.nav:after {
+ clear: both;
+}
+
+.nav:before,
+.nav:after {
+ display: table;
+ content: " ";
+}
+
+.nav:after {
+ clear: both;
+}
+
+.nav > li {
+ position: relative;
+ display: block;
+}
+
+.nav > li > a {
+ position: relative;
+ display: block;
+ padding: 10px 15px;
+}
+
+.nav > li > a:hover,
+.nav > li > a:focus {
+ text-decoration: none;
+ background-color: #eeeeee;
+}
+
+.nav > li.disabled > a {
+ color: #999999;
+}
+
+.nav > li.disabled > a:hover,
+.nav > li.disabled > a:focus {
+ color: #999999;
+ text-decoration: none;
+ cursor: not-allowed;
+ background-color: transparent;
+}
+
+.nav .open > a,
+.nav .open > a:hover,
+.nav .open > a:focus {
+ background-color: #eeeeee;
+ border-color: #428bca;
+}
+
+.nav .nav-divider {
+ height: 1px;
+ margin: 9px 0;
+ overflow: hidden;
+ background-color: #e5e5e5;
+}
+
+.nav > li > a > img {
+ max-width: none;
+}
+
+.nav-tabs {
+ border-bottom: 1px solid #dddddd;
+}
+
+.nav-tabs > li {
+ float: left;
+ margin-bottom: -1px;
+}
+
+.nav-tabs > li > a {
+ margin-right: 2px;
+ line-height: 1.428571429;
+ border: 1px solid transparent;
+ border-radius: 4px 4px 0 0;
+}
+
+.nav-tabs > li > a:hover {
+ border-color: #eeeeee #eeeeee #dddddd;
+}
+
+.nav-tabs > li.active > a,
+.nav-tabs > li.active > a:hover,
+.nav-tabs > li.active > a:focus {
+ color: #555555;
+ cursor: default;
+ background-color: #ffffff;
+ border: 1px solid #dddddd;
+ border-bottom-color: transparent;
+}
+
+.nav-tabs.nav-justified {
+ width: 100%;
+ border-bottom: 0;
+}
+
+.nav-tabs.nav-justified > li {
+ float: none;
+}
+
+.nav-tabs.nav-justified > li > a {
+ margin-bottom: 5px;
+ text-align: center;
+}
+
+.nav-tabs.nav-justified > .dropdown .dropdown-menu {
+ top: auto;
+ left: auto;
+}
+
+@media (min-width: 768px) {
+ .nav-tabs.nav-justified > li {
+ display: table-cell;
+ width: 1%;
+ }
+ .nav-tabs.nav-justified > li > a {
+ margin-bottom: 0;
+ }
+}
+
+.nav-tabs.nav-justified > li > a {
+ margin-right: 0;
+ border-radius: 4px;
+}
+
+.nav-tabs.nav-justified > .active > a,
+.nav-tabs.nav-justified > .active > a:hover,
+.nav-tabs.nav-justified > .active > a:focus {
+ border: 1px solid #dddddd;
+}
+
+@media (min-width: 768px) {
+ .nav-tabs.nav-justified > li > a {
+ border-bottom: 1px solid #dddddd;
+ border-radius: 4px 4px 0 0;
+ }
+ .nav-tabs.nav-justified > .active > a,
+ .nav-tabs.nav-justified > .active > a:hover,
+ .nav-tabs.nav-justified > .active > a:focus {
+ border-bottom-color: #ffffff;
+ }
+}
+
+.nav-pills > li {
+ float: left;
+}
+
+.nav-pills > li > a {
+ border-radius: 4px;
+}
+
+.nav-pills > li + li {
+ margin-left: 2px;
+}
+
+.nav-pills > li.active > a,
+.nav-pills > li.active > a:hover,
+.nav-pills > li.active > a:focus {
+ color: #ffffff;
+ background-color: #428bca;
+}
+
+.nav-stacked > li {
+ float: none;
+}
+
+.nav-stacked > li + li {
+ margin-top: 2px;
+ margin-left: 0;
+}
+
+.nav-justified {
+ width: 100%;
+}
+
+.nav-justified > li {
+ float: none;
+}
+
+.nav-justified > li > a {
+ margin-bottom: 5px;
+ text-align: center;
+}
+
+.nav-justified > .dropdown .dropdown-menu {
+ top: auto;
+ left: auto;
+}
+
+@media (min-width: 768px) {
+ .nav-justified > li {
+ display: table-cell;
+ width: 1%;
+ }
+ .nav-justified > li > a {
+ margin-bottom: 0;
+ }
+}
+
+.nav-tabs-justified {
+ border-bottom: 0;
+}
+
+.nav-tabs-justified > li > a {
+ margin-right: 0;
+ border-radius: 4px;
+}
+
+.nav-tabs-justified > .active > a,
+.nav-tabs-justified > .active > a:hover,
+.nav-tabs-justified > .active > a:focus {
+ border: 1px solid #dddddd;
+}
+
+@media (min-width: 768px) {
+ .nav-tabs-justified > li > a {
+ border-bottom: 1px solid #dddddd;
+ border-radius: 4px 4px 0 0;
+ }
+ .nav-tabs-justified > .active > a,
+ .nav-tabs-justified > .active > a:hover,
+ .nav-tabs-justified > .active > a:focus {
+ border-bottom-color: #ffffff;
+ }
+}
+
+.tab-content > .tab-pane {
+ display: none;
+}
+
+.tab-content > .active {
+ display: block;
+}
+
+.nav-tabs .dropdown-menu {
+ margin-top: -1px;
+ border-top-right-radius: 0;
+ border-top-left-radius: 0;
+}
+
+.navbar {
+ position: relative;
+ min-height: 50px;
+ margin-bottom: 20px;
+ border: 1px solid transparent;
+}
+
+.navbar:before,
+.navbar:after {
+ display: table;
+ content: " ";
+}
+
+.navbar:after {
+ clear: both;
+}
+
+.navbar:before,
+.navbar:after {
+ display: table;
+ content: " ";
+}
+
+.navbar:after {
+ clear: both;
+}
+
+@media (min-width: 768px) {
+ .navbar {
+ border-radius: 4px;
+ }
+}
+
+.navbar-header:before,
+.navbar-header:after {
+ display: table;
+ content: " ";
+}
+
+.navbar-header:after {
+ clear: both;
+}
+
+.navbar-header:before,
+.navbar-header:after {
+ display: table;
+ content: " ";
+}
+
+.navbar-header:after {
+ clear: both;
+}
+
+@media (min-width: 768px) {
+ .navbar-header {
+ float: left;
+ }
+}
+
+.navbar-collapse {
+ max-height: 340px;
+ padding-right: 15px;
+ padding-left: 15px;
+ overflow-x: visible;
+ border-top: 1px solid transparent;
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);
+ -webkit-overflow-scrolling: touch;
+}
+
+.navbar-collapse:before,
+.navbar-collapse:after {
+ display: table;
+ content: " ";
+}
+
+.navbar-collapse:after {
+ clear: both;
+}
+
+.navbar-collapse:before,
+.navbar-collapse:after {
+ display: table;
+ content: " ";
+}
+
+.navbar-collapse:after {
+ clear: both;
+}
+
+.navbar-collapse.in {
+ overflow-y: auto;
+}
+
+@media (min-width: 768px) {
+ .navbar-collapse {
+ width: auto;
+ border-top: 0;
+ box-shadow: none;
+ }
+ .navbar-collapse.collapse {
+ display: block !important;
+ height: auto !important;
+ padding-bottom: 0;
+ overflow: visible !important;
+ }
+ .navbar-collapse.in {
+ overflow-y: visible;
+ }
+ .navbar-fixed-top .navbar-collapse,
+ .navbar-static-top .navbar-collapse,
+ .navbar-fixed-bottom .navbar-collapse {
+ padding-right: 0;
+ padding-left: 0;
+ }
+}
+
+.container > .navbar-header,
+.container > .navbar-collapse {
+ margin-right: -15px;
+ margin-left: -15px;
+}
+
+@media (min-width: 768px) {
+ .container > .navbar-header,
+ .container > .navbar-collapse {
+ margin-right: 0;
+ margin-left: 0;
+ }
+}
+
+.navbar-static-top {
+ z-index: 1000;
+ border-width: 0 0 1px;
+}
+
+@media (min-width: 768px) {
+ .navbar-static-top {
+ border-radius: 0;
+ }
+}
+
+.navbar-fixed-top,
+.navbar-fixed-bottom {
+ position: fixed;
+ right: 0;
+ left: 0;
+ z-index: 1030;
+}
+
+@media (min-width: 768px) {
+ .navbar-fixed-top,
+ .navbar-fixed-bottom {
+ border-radius: 0;
+ }
+}
+
+.navbar-fixed-top {
+ top: 0;
+ border-width: 0 0 1px;
+}
+
+.navbar-fixed-bottom {
+ bottom: 0;
+ margin-bottom: 0;
+ border-width: 1px 0 0;
+}
+
+.navbar-brand {
+ float: left;
+ padding: 15px 15px;
+ font-size: 18px;
+ line-height: 20px;
+}
+
+.navbar-brand:hover,
+.navbar-brand:focus {
+ text-decoration: none;
+}
+
+@media (min-width: 768px) {
+ .navbar > .container .navbar-brand {
+ margin-left: -15px;
+ }
+}
+
+.navbar-toggle {
+ position: relative;
+ float: right;
+ padding: 9px 10px;
+ margin-top: 8px;
+ margin-right: 15px;
+ margin-bottom: 8px;
+ background-color: transparent;
+ background-image: none;
+ border: 1px solid transparent;
+ border-radius: 4px;
+}
+
+.navbar-toggle .icon-bar {
+ display: block;
+ width: 22px;
+ height: 2px;
+ border-radius: 1px;
+}
+
+.navbar-toggle .icon-bar + .icon-bar {
+ margin-top: 4px;
+}
+
+@media (min-width: 768px) {
+ .navbar-toggle {
+ display: none;
+ }
+}
+
+.navbar-nav {
+ margin: 7.5px -15px;
+}
+
+.navbar-nav > li > a {
+ padding-top: 10px;
+ padding-bottom: 10px;
+ line-height: 20px;
+}
+
+@media (max-width: 767px) {
+ .navbar-nav .open .dropdown-menu {
+ position: static;
+ float: none;
+ width: auto;
+ margin-top: 0;
+ background-color: transparent;
+ border: 0;
+ box-shadow: none;
+ }
+ .navbar-nav .open .dropdown-menu > li > a,
+ .navbar-nav .open .dropdown-menu .dropdown-header {
+ padding: 5px 15px 5px 25px;
+ }
+ .navbar-nav .open .dropdown-menu > li > a {
+ line-height: 20px;
+ }
+ .navbar-nav .open .dropdown-menu > li > a:hover,
+ .navbar-nav .open .dropdown-menu > li > a:focus {
+ background-image: none;
+ }
+}
+
+@media (min-width: 768px) {
+ .navbar-nav {
+ float: left;
+ margin: 0;
+ }
+ .navbar-nav > li {
+ float: left;
+ }
+ .navbar-nav > li > a {
+ padding-top: 15px;
+ padding-bottom: 15px;
+ }
+ .navbar-nav.navbar-right:last-child {
+ margin-right: -15px;
+ }
+}
+
+@media (min-width: 768px) {
+ .navbar-left {
+ float: left !important;
+ }
+ .navbar-right {
+ float: right !important;
+ }
+}
+
+.navbar-form {
+ padding: 10px 15px;
+ margin-top: 8px;
+ margin-right: -15px;
+ margin-bottom: 8px;
+ margin-left: -15px;
+ border-top: 1px solid transparent;
+ border-bottom: 1px solid transparent;
+ -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
+}
+
+@media (min-width: 768px) {
+ .navbar-form .form-group {
+ display: inline-block;
+ margin-bottom: 0;
+ vertical-align: middle;
+ }
+ .navbar-form .form-control {
+ display: inline-block;
+ }
+ .navbar-form select.form-control {
+ width: auto;
+ }
+ .navbar-form .radio,
+ .navbar-form .checkbox {
+ display: inline-block;
+ padding-left: 0;
+ margin-top: 0;
+ margin-bottom: 0;
+ }
+ .navbar-form .radio input[type="radio"],
+ .navbar-form .checkbox input[type="checkbox"] {
+ float: none;
+ margin-left: 0;
+ }
+}
+
+@media (max-width: 767px) {
+ .navbar-form .form-group {
+ margin-bottom: 5px;
+ }
+}
+
+@media (min-width: 768px) {
+ .navbar-form {
+ width: auto;
+ padding-top: 0;
+ padding-bottom: 0;
+ margin-right: 0;
+ margin-left: 0;
+ border: 0;
+ -webkit-box-shadow: none;
+ box-shadow: none;
+ }
+ .navbar-form.navbar-right:last-child {
+ margin-right: -15px;
+ }
+}
+
+.navbar-nav > li > .dropdown-menu {
+ margin-top: 0;
+ border-top-right-radius: 0;
+ border-top-left-radius: 0;
+}
+
+.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {
+ border-bottom-right-radius: 0;
+ border-bottom-left-radius: 0;
+}
+
+.navbar-nav.pull-right > li > .dropdown-menu,
+.navbar-nav > li > .dropdown-menu.pull-right {
+ right: 0;
+ left: auto;
+}
+
+.navbar-btn {
+ margin-top: 8px;
+ margin-bottom: 8px;
+}
+
+.navbar-btn.btn-sm {
+ margin-top: 10px;
+ margin-bottom: 10px;
+}
+
+.navbar-btn.btn-xs {
+ margin-top: 14px;
+ margin-bottom: 14px;
+}
+
+.navbar-text {
+ margin-top: 15px;
+ margin-bottom: 15px;
+}
+
+@media (min-width: 768px) {
+ .navbar-text {
+ float: left;
+ margin-right: 15px;
+ margin-left: 15px;
+ }
+ .navbar-text.navbar-right:last-child {
+ margin-right: 0;
+ }
+}
+
+.navbar-default {
+ background-color: #f8f8f8;
+ border-color: #e7e7e7;
+}
+
+.navbar-default .navbar-brand {
+ color: #777777;
+}
+
+.navbar-default .navbar-brand:hover,
+.navbar-default .navbar-brand:focus {
+ color: #5e5e5e;
+ background-color: transparent;
+}
+
+.navbar-default .navbar-text {
+ color: #777777;
+}
+
+.navbar-default .navbar-nav > li > a {
+ color: #777777;
+}
+
+.navbar-default .navbar-nav > li > a:hover,
+.navbar-default .navbar-nav > li > a:focus {
+ color: #333333;
+ background-color: transparent;
+}
+
+.navbar-default .navbar-nav > .active > a,
+.navbar-default .navbar-nav > .active > a:hover,
+.navbar-default .navbar-nav > .active > a:focus {
+ color: #555555;
+ background-color: #e7e7e7;
+}
+
+.navbar-default .navbar-nav > .disabled > a,
+.navbar-default .navbar-nav > .disabled > a:hover,
+.navbar-default .navbar-nav > .disabled > a:focus {
+ color: #cccccc;
+ background-color: transparent;
+}
+
+.navbar-default .navbar-toggle {
+ border-color: #dddddd;
+}
+
+.navbar-default .navbar-toggle:hover,
+.navbar-default .navbar-toggle:focus {
+ background-color: #dddddd;
+}
+
+.navbar-default .navbar-toggle .icon-bar {
+ background-color: #cccccc;
+}
+
+.navbar-default .navbar-collapse,
+.navbar-default .navbar-form {
+ border-color: #e7e7e7;
+}
+
+.navbar-default .navbar-nav > .open > a,
+.navbar-default .navbar-nav > .open > a:hover,
+.navbar-default .navbar-nav > .open > a:focus {
+ color: #555555;
+ background-color: #e7e7e7;
+}
+
+@media (max-width: 767px) {
+ .navbar-default .navbar-nav .open .dropdown-menu > li > a {
+ color: #777777;
+ }
+ .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,
+ .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {
+ color: #333333;
+ background-color: transparent;
+ }
+ .navbar-default .navbar-nav .open .dropdown-menu > .active > a,
+ .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,
+ .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {
+ color: #555555;
+ background-color: #e7e7e7;
+ }
+ .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,
+ .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,
+ .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {
+ color: #cccccc;
+ background-color: transparent;
+ }
+}
+
+.navbar-default .navbar-link {
+ color: #777777;
+}
+
+.navbar-default .navbar-link:hover {
+ color: #333333;
+}
+
+.navbar-inverse {
+ background-color: #222222;
+ border-color: #080808;
+}
+
+.navbar-inverse .navbar-brand {
+ color: #999999;
+}
+
+.navbar-inverse .navbar-brand:hover,
+.navbar-inverse .navbar-brand:focus {
+ color: #ffffff;
+ background-color: transparent;
+}
+
+.navbar-inverse .navbar-text {
+ color: #999999;
+}
+
+.navbar-inverse .navbar-nav > li > a {
+ color: #999999;
+}
+
+.navbar-inverse .navbar-nav > li > a:hover,
+.navbar-inverse .navbar-nav > li > a:focus {
+ color: #ffffff;
+ background-color: transparent;
+}
+
+.navbar-inverse .navbar-nav > .active > a,
+.navbar-inverse .navbar-nav > .active > a:hover,
+.navbar-inverse .navbar-nav > .active > a:focus {
+ color: #ffffff;
+ background-color: #080808;
+}
+
+.navbar-inverse .navbar-nav > .disabled > a,
+.navbar-inverse .navbar-nav > .disabled > a:hover,
+.navbar-inverse .navbar-nav > .disabled > a:focus {
+ color: #444444;
+ background-color: transparent;
+}
+
+.navbar-inverse .navbar-toggle {
+ border-color: #333333;
+}
+
+.navbar-inverse .navbar-toggle:hover,
+.navbar-inverse .navbar-toggle:focus {
+ background-color: #333333;
+}
+
+.navbar-inverse .navbar-toggle .icon-bar {
+ background-color: #ffffff;
+}
+
+.navbar-inverse .navbar-collapse,
+.navbar-inverse .navbar-form {
+ border-color: #101010;
+}
+
+.navbar-inverse .navbar-nav > .open > a,
+.navbar-inverse .navbar-nav > .open > a:hover,
+.navbar-inverse .navbar-nav > .open > a:focus {
+ color: #ffffff;
+ background-color: #080808;
+}
+
+@media (max-width: 767px) {
+ .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {
+ border-color: #080808;
+ }
+ .navbar-inverse .navbar-nav .open .dropdown-menu .divider {
+ background-color: #080808;
+ }
+ .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {
+ color: #999999;
+ }
+ .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,
+ .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {
+ color: #ffffff;
+ background-color: transparent;
+ }
+ .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,
+ .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,
+ .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {
+ color: #ffffff;
+ background-color: #080808;
+ }
+ .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,
+ .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,
+ .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {
+ color: #444444;
+ background-color: transparent;
+ }
+}
+
+.navbar-inverse .navbar-link {
+ color: #999999;
+}
+
+.navbar-inverse .navbar-link:hover {
+ color: #ffffff;
+}
+
+.breadcrumb {
+ padding: 8px 15px;
+ margin-bottom: 20px;
+ list-style: none;
+ background-color: #f5f5f5;
+ border-radius: 4px;
+}
+
+.breadcrumb > li {
+ display: inline-block;
+}
+
+.breadcrumb > li + li:before {
+ padding: 0 5px;
+ color: #cccccc;
+ content: "/\00a0";
+}
+
+.breadcrumb > .active {
+ color: #999999;
+}
+
+.pagination {
+ display: inline-block;
+ padding-left: 0;
+ margin: 20px 0;
+ border-radius: 4px;
+}
+
+.pagination > li {
+ display: inline;
+}
+
+.pagination > li > a,
+.pagination > li > span {
+ position: relative;
+ float: left;
+ padding: 6px 12px;
+ margin-left: -1px;
+ line-height: 1.428571429;
+ text-decoration: none;
+ background-color: #ffffff;
+ border: 1px solid #dddddd;
+}
+
+.pagination > li:first-child > a,
+.pagination > li:first-child > span {
+ margin-left: 0;
+ border-bottom-left-radius: 4px;
+ border-top-left-radius: 4px;
+}
+
+.pagination > li:last-child > a,
+.pagination > li:last-child > span {
+ border-top-right-radius: 4px;
+ border-bottom-right-radius: 4px;
+}
+
+.pagination > li > a:hover,
+.pagination > li > span:hover,
+.pagination > li > a:focus,
+.pagination > li > span:focus {
+ background-color: #eeeeee;
+}
+
+.pagination > .active > a,
+.pagination > .active > span,
+.pagination > .active > a:hover,
+.pagination > .active > span:hover,
+.pagination > .active > a:focus,
+.pagination > .active > span:focus {
+ z-index: 2;
+ color: #ffffff;
+ cursor: default;
+ background-color: #428bca;
+ border-color: #428bca;
+}
+
+.pagination > .disabled > span,
+.pagination > .disabled > span:hover,
+.pagination > .disabled > span:focus,
+.pagination > .disabled > a,
+.pagination > .disabled > a:hover,
+.pagination > .disabled > a:focus {
+ color: #999999;
+ cursor: not-allowed;
+ background-color: #ffffff;
+ border-color: #dddddd;
+}
+
+.pagination-lg > li > a,
+.pagination-lg > li > span {
+ padding: 10px 16px;
+ font-size: 18px;
+}
+
+.pagination-lg > li:first-child > a,
+.pagination-lg > li:first-child > span {
+ border-bottom-left-radius: 6px;
+ border-top-left-radius: 6px;
+}
+
+.pagination-lg > li:last-child > a,
+.pagination-lg > li:last-child > span {
+ border-top-right-radius: 6px;
+ border-bottom-right-radius: 6px;
+}
+
+.pagination-sm > li > a,
+.pagination-sm > li > span {
+ padding: 5px 10px;
+ font-size: 12px;
+}
+
+.pagination-sm > li:first-child > a,
+.pagination-sm > li:first-child > span {
+ border-bottom-left-radius: 3px;
+ border-top-left-radius: 3px;
+}
+
+.pagination-sm > li:last-child > a,
+.pagination-sm > li:last-child > span {
+ border-top-right-radius: 3px;
+ border-bottom-right-radius: 3px;
+}
+
+.pager {
+ padding-left: 0;
+ margin: 20px 0;
+ text-align: center;
+ list-style: none;
+}
+
+.pager:before,
+.pager:after {
+ display: table;
+ content: " ";
+}
+
+.pager:after {
+ clear: both;
+}
+
+.pager:before,
+.pager:after {
+ display: table;
+ content: " ";
+}
+
+.pager:after {
+ clear: both;
+}
+
+.pager li {
+ display: inline;
+}
+
+.pager li > a,
+.pager li > span {
+ display: inline-block;
+ padding: 5px 14px;
+ background-color: #ffffff;
+ border: 1px solid #dddddd;
+ border-radius: 15px;
+}
+
+.pager li > a:hover,
+.pager li > a:focus {
+ text-decoration: none;
+ background-color: #eeeeee;
+}
+
+.pager .next > a,
+.pager .next > span {
+ float: right;
+}
+
+.pager .previous > a,
+.pager .previous > span {
+ float: left;
+}
+
+.pager .disabled > a,
+.pager .disabled > a:hover,
+.pager .disabled > a:focus,
+.pager .disabled > span {
+ color: #999999;
+ cursor: not-allowed;
+ background-color: #ffffff;
+}
+
+.label {
+ display: inline;
+ padding: .2em .6em .3em;
+ font-size: 75%;
+ font-weight: bold;
+ line-height: 1;
+ color: #ffffff;
+ text-align: center;
+ white-space: nowrap;
+ vertical-align: baseline;
+ border-radius: .25em;
+}
+
+.label[href]:hover,
+.label[href]:focus {
+ color: #ffffff;
+ text-decoration: none;
+ cursor: pointer;
+}
+
+.label:empty {
+ display: none;
+}
+
+.btn .label {
+ position: relative;
+ top: -1px;
+}
+
+.label-default {
+ background-color: #999999;
+}
+
+.label-default[href]:hover,
+.label-default[href]:focus {
+ background-color: #808080;
+}
+
+.label-primary {
+ background-color: #428bca;
+}
+
+.label-primary[href]:hover,
+.label-primary[href]:focus {
+ background-color: #3071a9;
+}
+
+.label-success {
+ background-color: #5cb85c;
+}
+
+.label-success[href]:hover,
+.label-success[href]:focus {
+ background-color: #449d44;
+}
+
+.label-info {
+ background-color: #5bc0de;
+}
+
+.label-info[href]:hover,
+.label-info[href]:focus {
+ background-color: #31b0d5;
+}
+
+.label-warning {
+ background-color: #f0ad4e;
+}
+
+.label-warning[href]:hover,
+.label-warning[href]:focus {
+ background-color: #ec971f;
+}
+
+.label-danger {
+ background-color: #d9534f;
+}
+
+.label-danger[href]:hover,
+.label-danger[href]:focus {
+ background-color: #c9302c;
+}
+
+.badge {
+ display: inline-block;
+ min-width: 10px;
+ padding: 3px 7px;
+ font-size: 12px;
+ font-weight: bold;
+ line-height: 1;
+ color: #ffffff;
+ text-align: center;
+ white-space: nowrap;
+ vertical-align: baseline;
+ background-color: #999999;
+ border-radius: 10px;
+}
+
+.badge:empty {
+ display: none;
+}
+
+.btn .badge {
+ position: relative;
+ top: -1px;
+}
+
+a.badge:hover,
+a.badge:focus {
+ color: #ffffff;
+ text-decoration: none;
+ cursor: pointer;
+}
+
+a.list-group-item.active > .badge,
+.nav-pills > .active > a > .badge {
+ color: #428bca;
+ background-color: #ffffff;
+}
+
+.nav-pills > li > a > .badge {
+ margin-left: 3px;
+}
+
+.jumbotron {
+ padding: 30px;
+ margin-bottom: 30px;
+ font-size: 21px;
+ font-weight: 200;
+ line-height: 2.1428571435;
+ color: inherit;
+ background-color: #eeeeee;
+}
+
+.jumbotron h1,
+.jumbotron .h1 {
+ line-height: 1;
+ color: inherit;
+}
+
+.jumbotron p {
+ line-height: 1.4;
+}
+
+.container .jumbotron {
+ border-radius: 6px;
+}
+
+.jumbotron .container {
+ max-width: 100%;
+}
+
+@media screen and (min-width: 768px) {
+ .jumbotron {
+ padding-top: 48px;
+ padding-bottom: 48px;
+ }
+ .container .jumbotron {
+ padding-right: 60px;
+ padding-left: 60px;
+ }
+ .jumbotron h1,
+ .jumbotron .h1 {
+ font-size: 63px;
+ }
+}
+
+.thumbnail {
+ display: block;
+ padding: 4px;
+ margin-bottom: 20px;
+ line-height: 1.428571429;
+ background-color: #ffffff;
+ border: 1px solid #dddddd;
+ border-radius: 4px;
+ -webkit-transition: all 0.2s ease-in-out;
+ transition: all 0.2s ease-in-out;
+}
+
+.thumbnail > img,
+.thumbnail a > img {
+ display: block;
+ height: auto;
+ max-width: 100%;
+ margin-right: auto;
+ margin-left: auto;
+}
+
+a.thumbnail:hover,
+a.thumbnail:focus,
+a.thumbnail.active {
+ border-color: #428bca;
+}
+
+.thumbnail .caption {
+ padding: 9px;
+ color: #333333;
+}
+
+.alert {
+ padding: 15px;
+ margin-bottom: 20px;
+ border: 1px solid transparent;
+ border-radius: 4px;
+}
+
+.alert h4 {
+ margin-top: 0;
+ color: inherit;
+}
+
+.alert .alert-link {
+ font-weight: bold;
+}
+
+.alert > p,
+.alert > ul {
+ margin-bottom: 0;
+}
+
+.alert > p + p {
+ margin-top: 5px;
+}
+
+.alert-dismissable {
+ padding-right: 35px;
+}
+
+.alert-dismissable .close {
+ position: relative;
+ top: -2px;
+ right: -21px;
+ color: inherit;
+}
+
+.alert-success {
+ color: #3c763d;
+ background-color: #dff0d8;
+ border-color: #d6e9c6;
+}
+
+.alert-success hr {
+ border-top-color: #c9e2b3;
+}
+
+.alert-success .alert-link {
+ color: #2b542c;
+}
+
+.alert-info {
+ color: #31708f;
+ background-color: #d9edf7;
+ border-color: #bce8f1;
+}
+
+.alert-info hr {
+ border-top-color: #a6e1ec;
+}
+
+.alert-info .alert-link {
+ color: #245269;
+}
+
+.alert-warning {
+ color: #8a6d3b;
+ background-color: #fcf8e3;
+ border-color: #faebcc;
+}
+
+.alert-warning hr {
+ border-top-color: #f7e1b5;
+}
+
+.alert-warning .alert-link {
+ color: #66512c;
+}
+
+.alert-danger {
+ color: #a94442;
+ background-color: #f2dede;
+ border-color: #ebccd1;
+}
+
+.alert-danger hr {
+ border-top-color: #e4b9c0;
+}
+
+.alert-danger .alert-link {
+ color: #843534;
+}
+
+@-webkit-keyframes progress-bar-stripes {
+ from {
+ background-position: 40px 0;
+ }
+ to {
+ background-position: 0 0;
+ }
+}
+
+@keyframes progress-bar-stripes {
+ from {
+ background-position: 40px 0;
+ }
+ to {
+ background-position: 0 0;
+ }
+}
+
+.progress {
+ height: 20px;
+ margin-bottom: 20px;
+ overflow: hidden;
+ background-color: #f5f5f5;
+ border-radius: 4px;
+ -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
+ box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
+}
+
+.progress-bar {
+ float: left;
+ width: 0;
+ height: 100%;
+ font-size: 12px;
+ line-height: 20px;
+ color: #ffffff;
+ text-align: center;
+ background-color: #428bca;
+ -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
+ box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
+ -webkit-transition: width 0.6s ease;
+ transition: width 0.6s ease;
+}
+
+.progress-striped .progress-bar {
+ background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+ background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+ background-size: 40px 40px;
+}
+
+.progress.active .progress-bar {
+ -webkit-animation: progress-bar-stripes 2s linear infinite;
+ animation: progress-bar-stripes 2s linear infinite;
+}
+
+.progress-bar-success {
+ background-color: #5cb85c;
+}
+
+.progress-striped .progress-bar-success {
+ background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+ background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+}
+
+.progress-bar-info {
+ background-color: #5bc0de;
+}
+
+.progress-striped .progress-bar-info {
+ background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+ background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+}
+
+.progress-bar-warning {
+ background-color: #f0ad4e;
+}
+
+.progress-striped .progress-bar-warning {
+ background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+ background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+}
+
+.progress-bar-danger {
+ background-color: #d9534f;
+}
+
+.progress-striped .progress-bar-danger {
+ background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+ background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+}
+
+.media,
+.media-body {
+ overflow: hidden;
+ zoom: 1;
+}
+
+.media,
+.media .media {
+ margin-top: 15px;
+}
+
+.media:first-child {
+ margin-top: 0;
+}
+
+.media-object {
+ display: block;
+}
+
+.media-heading {
+ margin: 0 0 5px;
+}
+
+.media > .pull-left {
+ margin-right: 10px;
+}
+
+.media > .pull-right {
+ margin-left: 10px;
+}
+
+.media-list {
+ padding-left: 0;
+ list-style: none;
+}
+
+.list-group {
+ padding-left: 0;
+ margin-bottom: 20px;
+}
+
+.list-group-item {
+ position: relative;
+ display: block;
+ padding: 10px 15px;
+ margin-bottom: -1px;
+ background-color: #ffffff;
+ border: 1px solid #dddddd;
+}
+
+.list-group-item:first-child {
+ border-top-right-radius: 4px;
+ border-top-left-radius: 4px;
+}
+
+.list-group-item:last-child {
+ margin-bottom: 0;
+ border-bottom-right-radius: 4px;
+ border-bottom-left-radius: 4px;
+}
+
+.list-group-item > .badge {
+ float: right;
+}
+
+.list-group-item > .badge + .badge {
+ margin-right: 5px;
+}
+
+a.list-group-item {
+ color: #555555;
+}
+
+a.list-group-item .list-group-item-heading {
+ color: #333333;
+}
+
+a.list-group-item:hover,
+a.list-group-item:focus {
+ text-decoration: none;
+ background-color: #f5f5f5;
+}
+
+a.list-group-item.active,
+a.list-group-item.active:hover,
+a.list-group-item.active:focus {
+ z-index: 2;
+ color: #ffffff;
+ background-color: #428bca;
+ border-color: #428bca;
+}
+
+a.list-group-item.active .list-group-item-heading,
+a.list-group-item.active:hover .list-group-item-heading,
+a.list-group-item.active:focus .list-group-item-heading {
+ color: inherit;
+}
+
+a.list-group-item.active .list-group-item-text,
+a.list-group-item.active:hover .list-group-item-text,
+a.list-group-item.active:focus .list-group-item-text {
+ color: #e1edf7;
+}
+
+.list-group-item-heading {
+ margin-top: 0;
+ margin-bottom: 5px;
+}
+
+.list-group-item-text {
+ margin-bottom: 0;
+ line-height: 1.3;
+}
+
+.panel {
+ margin-bottom: 20px;
+ background-color: #ffffff;
+ border: 1px solid transparent;
+ border-radius: 4px;
+ -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);
+ box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);
+}
+
+.panel-body {
+ padding: 15px;
+}
+
+.panel-body:before,
+.panel-body:after {
+ display: table;
+ content: " ";
+}
+
+.panel-body:after {
+ clear: both;
+}
+
+.panel-body:before,
+.panel-body:after {
+ display: table;
+ content: " ";
+}
+
+.panel-body:after {
+ clear: both;
+}
+
+.panel > .list-group {
+ margin-bottom: 0;
+}
+
+.panel > .list-group .list-group-item {
+ border-width: 1px 0;
+}
+
+.panel > .list-group .list-group-item:first-child {
+ border-top-right-radius: 0;
+ border-top-left-radius: 0;
+}
+
+.panel > .list-group .list-group-item:last-child {
+ border-bottom: 0;
+}
+
+.panel-heading + .list-group .list-group-item:first-child {
+ border-top-width: 0;
+}
+
+.panel > .table,
+.panel > .table-responsive > .table {
+ margin-bottom: 0;
+}
+
+.panel > .panel-body + .table,
+.panel > .panel-body + .table-responsive {
+ border-top: 1px solid #dddddd;
+}
+
+.panel > .table > tbody:first-child th,
+.panel > .table > tbody:first-child td {
+ border-top: 0;
+}
+
+.panel > .table-bordered,
+.panel > .table-responsive > .table-bordered {
+ border: 0;
+}
+
+.panel > .table-bordered > thead > tr > th:first-child,
+.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,
+.panel > .table-bordered > tbody > tr > th:first-child,
+.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,
+.panel > .table-bordered > tfoot > tr > th:first-child,
+.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,
+.panel > .table-bordered > thead > tr > td:first-child,
+.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,
+.panel > .table-bordered > tbody > tr > td:first-child,
+.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,
+.panel > .table-bordered > tfoot > tr > td:first-child,
+.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {
+ border-left: 0;
+}
+
+.panel > .table-bordered > thead > tr > th:last-child,
+.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,
+.panel > .table-bordered > tbody > tr > th:last-child,
+.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,
+.panel > .table-bordered > tfoot > tr > th:last-child,
+.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,
+.panel > .table-bordered > thead > tr > td:last-child,
+.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,
+.panel > .table-bordered > tbody > tr > td:last-child,
+.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,
+.panel > .table-bordered > tfoot > tr > td:last-child,
+.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {
+ border-right: 0;
+}
+
+.panel > .table-bordered > thead > tr:last-child > th,
+.panel > .table-responsive > .table-bordered > thead > tr:last-child > th,
+.panel > .table-bordered > tbody > tr:last-child > th,
+.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,
+.panel > .table-bordered > tfoot > tr:last-child > th,
+.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th,
+.panel > .table-bordered > thead > tr:last-child > td,
+.panel > .table-responsive > .table-bordered > thead > tr:last-child > td,
+.panel > .table-bordered > tbody > tr:last-child > td,
+.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,
+.panel > .table-bordered > tfoot > tr:last-child > td,
+.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td {
+ border-bottom: 0;
+}
+
+.panel > .table-responsive {
+ margin-bottom: 0;
+ border: 0;
+}
+
+.panel-heading {
+ padding: 10px 15px;
+ border-bottom: 1px solid transparent;
+ border-top-right-radius: 3px;
+ border-top-left-radius: 3px;
+}
+
+.panel-heading > .dropdown .dropdown-toggle {
+ color: inherit;
+}
+
+.panel-title {
+ margin-top: 0;
+ margin-bottom: 0;
+ font-size: 16px;
+ color: inherit;
+}
+
+.panel-title > a {
+ color: inherit;
+}
+
+.panel-footer {
+ padding: 10px 15px;
+ background-color: #f5f5f5;
+ border-top: 1px solid #dddddd;
+ border-bottom-right-radius: 3px;
+ border-bottom-left-radius: 3px;
+}
+
+.panel-group .panel {
+ margin-bottom: 0;
+ overflow: hidden;
+ border-radius: 4px;
+}
+
+.panel-group .panel + .panel {
+ margin-top: 5px;
+}
+
+.panel-group .panel-heading {
+ border-bottom: 0;
+}
+
+.panel-group .panel-heading + .panel-collapse .panel-body {
+ border-top: 1px solid #dddddd;
+}
+
+.panel-group .panel-footer {
+ border-top: 0;
+}
+
+.panel-group .panel-footer + .panel-collapse .panel-body {
+ border-bottom: 1px solid #dddddd;
+}
+
+.panel-default {
+ border-color: #dddddd;
+}
+
+.panel-default > .panel-heading {
+ color: #333333;
+ background-color: #f5f5f5;
+ border-color: #dddddd;
+}
+
+.panel-default > .panel-heading + .panel-collapse .panel-body {
+ border-top-color: #dddddd;
+}
+
+.panel-default > .panel-footer + .panel-collapse .panel-body {
+ border-bottom-color: #dddddd;
+}
+
+.panel-primary {
+ border-color: #428bca;
+}
+
+.panel-primary > .panel-heading {
+ color: #ffffff;
+ background-color: #428bca;
+ border-color: #428bca;
+}
+
+.panel-primary > .panel-heading + .panel-collapse .panel-body {
+ border-top-color: #428bca;
+}
+
+.panel-primary > .panel-footer + .panel-collapse .panel-body {
+ border-bottom-color: #428bca;
+}
+
+.panel-success {
+ border-color: #d6e9c6;
+}
+
+.panel-success > .panel-heading {
+ color: #3c763d;
+ background-color: #dff0d8;
+ border-color: #d6e9c6;
+}
+
+.panel-success > .panel-heading + .panel-collapse .panel-body {
+ border-top-color: #d6e9c6;
+}
+
+.panel-success > .panel-footer + .panel-collapse .panel-body {
+ border-bottom-color: #d6e9c6;
+}
+
+.panel-warning {
+ border-color: #faebcc;
+}
+
+.panel-warning > .panel-heading {
+ color: #8a6d3b;
+ background-color: #fcf8e3;
+ border-color: #faebcc;
+}
+
+.panel-warning > .panel-heading + .panel-collapse .panel-body {
+ border-top-color: #faebcc;
+}
+
+.panel-warning > .panel-footer + .panel-collapse .panel-body {
+ border-bottom-color: #faebcc;
+}
+
+.panel-danger {
+ border-color: #ebccd1;
+}
+
+.panel-danger > .panel-heading {
+ color: #a94442;
+ background-color: #f2dede;
+ border-color: #ebccd1;
+}
+
+.panel-danger > .panel-heading + .panel-collapse .panel-body {
+ border-top-color: #ebccd1;
+}
+
+.panel-danger > .panel-footer + .panel-collapse .panel-body {
+ border-bottom-color: #ebccd1;
+}
+
+.panel-info {
+ border-color: #bce8f1;
+}
+
+.panel-info > .panel-heading {
+ color: #31708f;
+ background-color: #d9edf7;
+ border-color: #bce8f1;
+}
+
+.panel-info > .panel-heading + .panel-collapse .panel-body {
+ border-top-color: #bce8f1;
+}
+
+.panel-info > .panel-footer + .panel-collapse .panel-body {
+ border-bottom-color: #bce8f1;
+}
+
+.well {
+ min-height: 20px;
+ padding: 19px;
+ margin-bottom: 20px;
+ background-color: #f5f5f5;
+ border: 1px solid #e3e3e3;
+ border-radius: 4px;
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
+}
+
+.well blockquote {
+ border-color: #ddd;
+ border-color: rgba(0, 0, 0, 0.15);
+}
+
+.well-lg {
+ padding: 24px;
+ border-radius: 6px;
+}
+
+.well-sm {
+ padding: 9px;
+ border-radius: 3px;
+}
+
+.close {
+ float: right;
+ font-size: 21px;
+ font-weight: bold;
+ line-height: 1;
+ color: #000000;
+ text-shadow: 0 1px 0 #ffffff;
+ opacity: 0.2;
+ filter: alpha(opacity=20);
+}
+
+.close:hover,
+.close:focus {
+ color: #000000;
+ text-decoration: none;
+ cursor: pointer;
+ opacity: 0.5;
+ filter: alpha(opacity=50);
+}
+
+button.close {
+ padding: 0;
+ cursor: pointer;
+ background: transparent;
+ border: 0;
+ -webkit-appearance: none;
+}
+
+.modal-open {
+ overflow: hidden;
+}
+
+.modal {
+ position: fixed;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 1040;
+ display: none;
+ overflow: auto;
+ overflow-y: scroll;
+}
+
+.modal.fade .modal-dialog {
+ -webkit-transform: translate(0, -25%);
+ -ms-transform: translate(0, -25%);
+ transform: translate(0, -25%);
+ -webkit-transition: -webkit-transform 0.3s ease-out;
+ -moz-transition: -moz-transform 0.3s ease-out;
+ -o-transition: -o-transform 0.3s ease-out;
+ transition: transform 0.3s ease-out;
+}
+
+.modal.in .modal-dialog {
+ -webkit-transform: translate(0, 0);
+ -ms-transform: translate(0, 0);
+ transform: translate(0, 0);
+}
+
+.modal-dialog {
+ position: relative;
+ z-index: 1050;
+ width: auto;
+ margin: 10px;
+}
+
+.modal-content {
+ position: relative;
+ background-color: #ffffff;
+ border: 1px solid #999999;
+ border: 1px solid rgba(0, 0, 0, 0.2);
+ border-radius: 6px;
+ outline: none;
+ -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);
+ box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);
+ background-clip: padding-box;
+}
+
+.modal-backdrop {
+ position: fixed;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 1030;
+ background-color: #000000;
+}
+
+.modal-backdrop.fade {
+ opacity: 0;
+ filter: alpha(opacity=0);
+}
+
+.modal-backdrop.in {
+ opacity: 0.5;
+ filter: alpha(opacity=50);
+}
+
+.modal-header {
+ min-height: 16.428571429px;
+ padding: 15px;
+ border-bottom: 1px solid #e5e5e5;
+}
+
+.modal-header .close {
+ margin-top: -2px;
+}
+
+.modal-title {
+ margin: 0;
+ line-height: 1.428571429;
+}
+
+.modal-body {
+ position: relative;
+ padding: 20px;
+}
+
+.modal-footer {
+ padding: 19px 20px 20px;
+ margin-top: 15px;
+ text-align: right;
+ border-top: 1px solid #e5e5e5;
+}
+
+.modal-footer:before,
+.modal-footer:after {
+ display: table;
+ content: " ";
+}
+
+.modal-footer:after {
+ clear: both;
+}
+
+.modal-footer:before,
+.modal-footer:after {
+ display: table;
+ content: " ";
+}
+
+.modal-footer:after {
+ clear: both;
+}
+
+.modal-footer .btn + .btn {
+ margin-bottom: 0;
+ margin-left: 5px;
+}
+
+.modal-footer .btn-group .btn + .btn {
+ margin-left: -1px;
+}
+
+.modal-footer .btn-block + .btn-block {
+ margin-left: 0;
+}
+
+@media screen and (min-width: 768px) {
+ .modal-dialog {
+ width: 600px;
+ margin: 30px auto;
+ }
+ .modal-content {
+ -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);
+ box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);
+ }
+}
+
+.tooltip {
+ position: absolute;
+ z-index: 1030;
+ display: block;
+ font-size: 12px;
+ line-height: 1.4;
+ opacity: 0;
+ filter: alpha(opacity=0);
+ visibility: visible;
+}
+
+.tooltip.in {
+ opacity: 0.9;
+ filter: alpha(opacity=90);
+}
+
+.tooltip.top {
+ padding: 5px 0;
+ margin-top: -3px;
+}
+
+.tooltip.right {
+ padding: 0 5px;
+ margin-left: 3px;
+}
+
+.tooltip.bottom {
+ padding: 5px 0;
+ margin-top: 3px;
+}
+
+.tooltip.left {
+ padding: 0 5px;
+ margin-left: -3px;
+}
+
+.tooltip-inner {
+ max-width: 200px;
+ padding: 3px 8px;
+ color: #ffffff;
+ text-align: center;
+ text-decoration: none;
+ background-color: #000000;
+ border-radius: 4px;
+}
+
+.tooltip-arrow {
+ position: absolute;
+ width: 0;
+ height: 0;
+ border-color: transparent;
+ border-style: solid;
+}
+
+.tooltip.top .tooltip-arrow {
+ bottom: 0;
+ left: 50%;
+ margin-left: -5px;
+ border-top-color: #000000;
+ border-width: 5px 5px 0;
+}
+
+.tooltip.top-left .tooltip-arrow {
+ bottom: 0;
+ left: 5px;
+ border-top-color: #000000;
+ border-width: 5px 5px 0;
+}
+
+.tooltip.top-right .tooltip-arrow {
+ right: 5px;
+ bottom: 0;
+ border-top-color: #000000;
+ border-width: 5px 5px 0;
+}
+
+.tooltip.right .tooltip-arrow {
+ top: 50%;
+ left: 0;
+ margin-top: -5px;
+ border-right-color: #000000;
+ border-width: 5px 5px 5px 0;
+}
+
+.tooltip.left .tooltip-arrow {
+ top: 50%;
+ right: 0;
+ margin-top: -5px;
+ border-left-color: #000000;
+ border-width: 5px 0 5px 5px;
+}
+
+.tooltip.bottom .tooltip-arrow {
+ top: 0;
+ left: 50%;
+ margin-left: -5px;
+ border-bottom-color: #000000;
+ border-width: 0 5px 5px;
+}
+
+.tooltip.bottom-left .tooltip-arrow {
+ top: 0;
+ left: 5px;
+ border-bottom-color: #000000;
+ border-width: 0 5px 5px;
+}
+
+.tooltip.bottom-right .tooltip-arrow {
+ top: 0;
+ right: 5px;
+ border-bottom-color: #000000;
+ border-width: 0 5px 5px;
+}
+
+.popover {
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1010;
+ display: none;
+ max-width: 276px;
+ padding: 1px;
+ text-align: left;
+ white-space: normal;
+ background-color: #ffffff;
+ border: 1px solid #cccccc;
+ border: 1px solid rgba(0, 0, 0, 0.2);
+ border-radius: 6px;
+ -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+ box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+ background-clip: padding-box;
+}
+
+.popover.top {
+ margin-top: -10px;
+}
+
+.popover.right {
+ margin-left: 10px;
+}
+
+.popover.bottom {
+ margin-top: 10px;
+}
+
+.popover.left {
+ margin-left: -10px;
+}
+
+.popover-title {
+ padding: 8px 14px;
+ margin: 0;
+ font-size: 14px;
+ font-weight: normal;
+ line-height: 18px;
+ background-color: #f7f7f7;
+ border-bottom: 1px solid #ebebeb;
+ border-radius: 5px 5px 0 0;
+}
+
+.popover-content {
+ padding: 9px 14px;
+}
+
+.popover .arrow,
+.popover .arrow:after {
+ position: absolute;
+ display: block;
+ width: 0;
+ height: 0;
+ border-color: transparent;
+ border-style: solid;
+}
+
+.popover .arrow {
+ border-width: 11px;
+}
+
+.popover .arrow:after {
+ border-width: 10px;
+ content: "";
+}
+
+.popover.top .arrow {
+ bottom: -11px;
+ left: 50%;
+ margin-left: -11px;
+ border-top-color: #999999;
+ border-top-color: rgba(0, 0, 0, 0.25);
+ border-bottom-width: 0;
+}
+
+.popover.top .arrow:after {
+ bottom: 1px;
+ margin-left: -10px;
+ border-top-color: #ffffff;
+ border-bottom-width: 0;
+ content: " ";
+}
+
+.popover.right .arrow {
+ top: 50%;
+ left: -11px;
+ margin-top: -11px;
+ border-right-color: #999999;
+ border-right-color: rgba(0, 0, 0, 0.25);
+ border-left-width: 0;
+}
+
+.popover.right .arrow:after {
+ bottom: -10px;
+ left: 1px;
+ border-right-color: #ffffff;
+ border-left-width: 0;
+ content: " ";
+}
+
+.popover.bottom .arrow {
+ top: -11px;
+ left: 50%;
+ margin-left: -11px;
+ border-bottom-color: #999999;
+ border-bottom-color: rgba(0, 0, 0, 0.25);
+ border-top-width: 0;
+}
+
+.popover.bottom .arrow:after {
+ top: 1px;
+ margin-left: -10px;
+ border-bottom-color: #ffffff;
+ border-top-width: 0;
+ content: " ";
+}
+
+.popover.left .arrow {
+ top: 50%;
+ right: -11px;
+ margin-top: -11px;
+ border-left-color: #999999;
+ border-left-color: rgba(0, 0, 0, 0.25);
+ border-right-width: 0;
+}
+
+.popover.left .arrow:after {
+ right: 1px;
+ bottom: -10px;
+ border-left-color: #ffffff;
+ border-right-width: 0;
+ content: " ";
+}
+
+.carousel {
+ position: relative;
+}
+
+.carousel-inner {
+ position: relative;
+ width: 100%;
+ overflow: hidden;
+}
+
+.carousel-inner > .item {
+ position: relative;
+ display: none;
+ -webkit-transition: 0.6s ease-in-out left;
+ transition: 0.6s ease-in-out left;
+}
+
+.carousel-inner > .item > img,
+.carousel-inner > .item > a > img {
+ display: block;
+ height: auto;
+ max-width: 100%;
+ line-height: 1;
+}
+
+.carousel-inner > .active,
+.carousel-inner > .next,
+.carousel-inner > .prev {
+ display: block;
+}
+
+.carousel-inner > .active {
+ left: 0;
+}
+
+.carousel-inner > .next,
+.carousel-inner > .prev {
+ position: absolute;
+ top: 0;
+ width: 100%;
+}
+
+.carousel-inner > .next {
+ left: 100%;
+}
+
+.carousel-inner > .prev {
+ left: -100%;
+}
+
+.carousel-inner > .next.left,
+.carousel-inner > .prev.right {
+ left: 0;
+}
+
+.carousel-inner > .active.left {
+ left: -100%;
+}
+
+.carousel-inner > .active.right {
+ left: 100%;
+}
+
+.carousel-control {
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ left: 0;
+ width: 15%;
+ font-size: 20px;
+ color: #ffffff;
+ text-align: center;
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);
+ opacity: 0.5;
+ filter: alpha(opacity=50);
+}
+
+.carousel-control.left {
+ background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.5) 0), color-stop(rgba(0, 0, 0, 0.0001) 100%));
+ background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0, rgba(0, 0, 0, 0.0001) 100%);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);
+}
+
+.carousel-control.right {
+ right: 0;
+ left: auto;
+ background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.0001) 0), color-stop(rgba(0, 0, 0, 0.5) 100%));
+ background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0, rgba(0, 0, 0, 0.5) 100%);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);
+}
+
+.carousel-control:hover,
+.carousel-control:focus {
+ color: #ffffff;
+ text-decoration: none;
+ outline: none;
+ opacity: 0.9;
+ filter: alpha(opacity=90);
+}
+
+.carousel-control .icon-prev,
+.carousel-control .icon-next,
+.carousel-control .glyphicon-chevron-left,
+.carousel-control .glyphicon-chevron-right {
+ position: absolute;
+ top: 50%;
+ z-index: 5;
+ display: inline-block;
+}
+
+.carousel-control .icon-prev,
+.carousel-control .glyphicon-chevron-left {
+ left: 50%;
+}
+
+.carousel-control .icon-next,
+.carousel-control .glyphicon-chevron-right {
+ right: 50%;
+}
+
+.carousel-control .icon-prev,
+.carousel-control .icon-next {
+ width: 20px;
+ height: 20px;
+ margin-top: -10px;
+ margin-left: -10px;
+ font-family: serif;
+}
+
+.carousel-control .icon-prev:before {
+ content: '\2039';
+}
+
+.carousel-control .icon-next:before {
+ content: '\203a';
+}
+
+.carousel-indicators {
+ position: absolute;
+ bottom: 10px;
+ left: 50%;
+ z-index: 15;
+ width: 60%;
+ padding-left: 0;
+ margin-left: -30%;
+ text-align: center;
+ list-style: none;
+}
+
+.carousel-indicators li {
+ display: inline-block;
+ width: 10px;
+ height: 10px;
+ margin: 1px;
+ text-indent: -999px;
+ cursor: pointer;
+ background-color: #000 \9;
+ background-color: rgba(0, 0, 0, 0);
+ border: 1px solid #ffffff;
+ border-radius: 10px;
+}
+
+.carousel-indicators .active {
+ width: 12px;
+ height: 12px;
+ margin: 0;
+ background-color: #ffffff;
+}
+
+.carousel-caption {
+ position: absolute;
+ right: 15%;
+ bottom: 20px;
+ left: 15%;
+ z-index: 10;
+ padding-top: 20px;
+ padding-bottom: 20px;
+ color: #ffffff;
+ text-align: center;
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);
+}
+
+.carousel-caption .btn {
+ text-shadow: none;
+}
+
+@media screen and (min-width: 768px) {
+ .carousel-control .glyphicons-chevron-left,
+ .carousel-control .glyphicons-chevron-right,
+ .carousel-control .icon-prev,
+ .carousel-control .icon-next {
+ width: 30px;
+ height: 30px;
+ margin-top: -15px;
+ margin-left: -15px;
+ font-size: 30px;
+ }
+ .carousel-caption {
+ right: 20%;
+ left: 20%;
+ padding-bottom: 30px;
+ }
+ .carousel-indicators {
+ bottom: 20px;
+ }
+}
+
+.clearfix:before,
+.clearfix:after {
+ display: table;
+ content: " ";
+}
+
+.clearfix:after {
+ clear: both;
+}
+
+.center-block {
+ display: block;
+ margin-right: auto;
+ margin-left: auto;
+}
+
+.pull-right {
+ float: right !important;
+}
+
+.pull-left {
+ float: left !important;
+}
+
+.hide {
+ display: none !important;
+}
+
+.show {
+ display: block !important;
+}
+
+.invisible {
+ visibility: hidden;
+}
+
+.text-hide {
+ font: 0/0 a;
+ color: transparent;
+ text-shadow: none;
+ background-color: transparent;
+ border: 0;
+}
+
+.hidden {
+ display: none !important;
+ visibility: hidden !important;
+}
+
+.affix {
+ position: fixed;
+}
+
+@-ms-viewport {
+ width: device-width;
+}
+
+.visible-xs,
+tr.visible-xs,
+th.visible-xs,
+td.visible-xs {
+ display: none !important;
+}
+
+@media (max-width: 767px) {
+ .visible-xs {
+ display: block !important;
+ }
+ table.visible-xs {
+ display: table;
+ }
+ tr.visible-xs {
+ display: table-row !important;
+ }
+ th.visible-xs,
+ td.visible-xs {
+ display: table-cell !important;
+ }
+}
+
+@media (min-width: 768px) and (max-width: 991px) {
+ .visible-xs.visible-sm {
+ display: block !important;
+ }
+ table.visible-xs.visible-sm {
+ display: table;
+ }
+ tr.visible-xs.visible-sm {
+ display: table-row !important;
+ }
+ th.visible-xs.visible-sm,
+ td.visible-xs.visible-sm {
+ display: table-cell !important;
+ }
+}
+
+@media (min-width: 992px) and (max-width: 1199px) {
+ .visible-xs.visible-md {
+ display: block !important;
+ }
+ table.visible-xs.visible-md {
+ display: table;
+ }
+ tr.visible-xs.visible-md {
+ display: table-row !important;
+ }
+ th.visible-xs.visible-md,
+ td.visible-xs.visible-md {
+ display: table-cell !important;
+ }
+}
+
+@media (min-width: 1200px) {
+ .visible-xs.visible-lg {
+ display: block !important;
+ }
+ table.visible-xs.visible-lg {
+ display: table;
+ }
+ tr.visible-xs.visible-lg {
+ display: table-row !important;
+ }
+ th.visible-xs.visible-lg,
+ td.visible-xs.visible-lg {
+ display: table-cell !important;
+ }
+}
+
+.visible-sm,
+tr.visible-sm,
+th.visible-sm,
+td.visible-sm {
+ display: none !important;
+}
+
+@media (max-width: 767px) {
+ .visible-sm.visible-xs {
+ display: block !important;
+ }
+ table.visible-sm.visible-xs {
+ display: table;
+ }
+ tr.visible-sm.visible-xs {
+ display: table-row !important;
+ }
+ th.visible-sm.visible-xs,
+ td.visible-sm.visible-xs {
+ display: table-cell !important;
+ }
+}
+
+@media (min-width: 768px) and (max-width: 991px) {
+ .visible-sm {
+ display: block !important;
+ }
+ table.visible-sm {
+ display: table;
+ }
+ tr.visible-sm {
+ display: table-row !important;
+ }
+ th.visible-sm,
+ td.visible-sm {
+ display: table-cell !important;
+ }
+}
+
+@media (min-width: 992px) and (max-width: 1199px) {
+ .visible-sm.visible-md {
+ display: block !important;
+ }
+ table.visible-sm.visible-md {
+ display: table;
+ }
+ tr.visible-sm.visible-md {
+ display: table-row !important;
+ }
+ th.visible-sm.visible-md,
+ td.visible-sm.visible-md {
+ display: table-cell !important;
+ }
+}
+
+@media (min-width: 1200px) {
+ .visible-sm.visible-lg {
+ display: block !important;
+ }
+ table.visible-sm.visible-lg {
+ display: table;
+ }
+ tr.visible-sm.visible-lg {
+ display: table-row !important;
+ }
+ th.visible-sm.visible-lg,
+ td.visible-sm.visible-lg {
+ display: table-cell !important;
+ }
+}
+
+.visible-md,
+tr.visible-md,
+th.visible-md,
+td.visible-md {
+ display: none !important;
+}
+
+@media (max-width: 767px) {
+ .visible-md.visible-xs {
+ display: block !important;
+ }
+ table.visible-md.visible-xs {
+ display: table;
+ }
+ tr.visible-md.visible-xs {
+ display: table-row !important;
+ }
+ th.visible-md.visible-xs,
+ td.visible-md.visible-xs {
+ display: table-cell !important;
+ }
+}
+
+@media (min-width: 768px) and (max-width: 991px) {
+ .visible-md.visible-sm {
+ display: block !important;
+ }
+ table.visible-md.visible-sm {
+ display: table;
+ }
+ tr.visible-md.visible-sm {
+ display: table-row !important;
+ }
+ th.visible-md.visible-sm,
+ td.visible-md.visible-sm {
+ display: table-cell !important;
+ }
+}
+
+@media (min-width: 992px) and (max-width: 1199px) {
+ .visible-md {
+ display: block !important;
+ }
+ table.visible-md {
+ display: table;
+ }
+ tr.visible-md {
+ display: table-row !important;
+ }
+ th.visible-md,
+ td.visible-md {
+ display: table-cell !important;
+ }
+}
+
+@media (min-width: 1200px) {
+ .visible-md.visible-lg {
+ display: block !important;
+ }
+ table.visible-md.visible-lg {
+ display: table;
+ }
+ tr.visible-md.visible-lg {
+ display: table-row !important;
+ }
+ th.visible-md.visible-lg,
+ td.visible-md.visible-lg {
+ display: table-cell !important;
+ }
+}
+
+.visible-lg,
+tr.visible-lg,
+th.visible-lg,
+td.visible-lg {
+ display: none !important;
+}
+
+@media (max-width: 767px) {
+ .visible-lg.visible-xs {
+ display: block !important;
+ }
+ table.visible-lg.visible-xs {
+ display: table;
+ }
+ tr.visible-lg.visible-xs {
+ display: table-row !important;
+ }
+ th.visible-lg.visible-xs,
+ td.visible-lg.visible-xs {
+ display: table-cell !important;
+ }
+}
+
+@media (min-width: 768px) and (max-width: 991px) {
+ .visible-lg.visible-sm {
+ display: block !important;
+ }
+ table.visible-lg.visible-sm {
+ display: table;
+ }
+ tr.visible-lg.visible-sm {
+ display: table-row !important;
+ }
+ th.visible-lg.visible-sm,
+ td.visible-lg.visible-sm {
+ display: table-cell !important;
+ }
+}
+
+@media (min-width: 992px) and (max-width: 1199px) {
+ .visible-lg.visible-md {
+ display: block !important;
+ }
+ table.visible-lg.visible-md {
+ display: table;
+ }
+ tr.visible-lg.visible-md {
+ display: table-row !important;
+ }
+ th.visible-lg.visible-md,
+ td.visible-lg.visible-md {
+ display: table-cell !important;
+ }
+}
+
+@media (min-width: 1200px) {
+ .visible-lg {
+ display: block !important;
+ }
+ table.visible-lg {
+ display: table;
+ }
+ tr.visible-lg {
+ display: table-row !important;
+ }
+ th.visible-lg,
+ td.visible-lg {
+ display: table-cell !important;
+ }
+}
+
+.hidden-xs {
+ display: block !important;
+}
+
+table.hidden-xs {
+ display: table;
+}
+
+tr.hidden-xs {
+ display: table-row !important;
+}
+
+th.hidden-xs,
+td.hidden-xs {
+ display: table-cell !important;
+}
+
+@media (max-width: 767px) {
+ .hidden-xs,
+ tr.hidden-xs,
+ th.hidden-xs,
+ td.hidden-xs {
+ display: none !important;
+ }
+}
+
+@media (min-width: 768px) and (max-width: 991px) {
+ .hidden-xs.hidden-sm,
+ tr.hidden-xs.hidden-sm,
+ th.hidden-xs.hidden-sm,
+ td.hidden-xs.hidden-sm {
+ display: none !important;
+ }
+}
+
+@media (min-width: 992px) and (max-width: 1199px) {
+ .hidden-xs.hidden-md,
+ tr.hidden-xs.hidden-md,
+ th.hidden-xs.hidden-md,
+ td.hidden-xs.hidden-md {
+ display: none !important;
+ }
+}
+
+@media (min-width: 1200px) {
+ .hidden-xs.hidden-lg,
+ tr.hidden-xs.hidden-lg,
+ th.hidden-xs.hidden-lg,
+ td.hidden-xs.hidden-lg {
+ display: none !important;
+ }
+}
+
+.hidden-sm {
+ display: block !important;
+}
+
+table.hidden-sm {
+ display: table;
+}
+
+tr.hidden-sm {
+ display: table-row !important;
+}
+
+th.hidden-sm,
+td.hidden-sm {
+ display: table-cell !important;
+}
+
+@media (max-width: 767px) {
+ .hidden-sm.hidden-xs,
+ tr.hidden-sm.hidden-xs,
+ th.hidden-sm.hidden-xs,
+ td.hidden-sm.hidden-xs {
+ display: none !important;
+ }
+}
+
+@media (min-width: 768px) and (max-width: 991px) {
+ .hidden-sm,
+ tr.hidden-sm,
+ th.hidden-sm,
+ td.hidden-sm {
+ display: none !important;
+ }
+}
+
+@media (min-width: 992px) and (max-width: 1199px) {
+ .hidden-sm.hidden-md,
+ tr.hidden-sm.hidden-md,
+ th.hidden-sm.hidden-md,
+ td.hidden-sm.hidden-md {
+ display: none !important;
+ }
+}
+
+@media (min-width: 1200px) {
+ .hidden-sm.hidden-lg,
+ tr.hidden-sm.hidden-lg,
+ th.hidden-sm.hidden-lg,
+ td.hidden-sm.hidden-lg {
+ display: none !important;
+ }
+}
+
+.hidden-md {
+ display: block !important;
+}
+
+table.hidden-md {
+ display: table;
+}
+
+tr.hidden-md {
+ display: table-row !important;
+}
+
+th.hidden-md,
+td.hidden-md {
+ display: table-cell !important;
+}
+
+@media (max-width: 767px) {
+ .hidden-md.hidden-xs,
+ tr.hidden-md.hidden-xs,
+ th.hidden-md.hidden-xs,
+ td.hidden-md.hidden-xs {
+ display: none !important;
+ }
+}
+
+@media (min-width: 768px) and (max-width: 991px) {
+ .hidden-md.hidden-sm,
+ tr.hidden-md.hidden-sm,
+ th.hidden-md.hidden-sm,
+ td.hidden-md.hidden-sm {
+ display: none !important;
+ }
+}
+
+@media (min-width: 992px) and (max-width: 1199px) {
+ .hidden-md,
+ tr.hidden-md,
+ th.hidden-md,
+ td.hidden-md {
+ display: none !important;
+ }
+}
+
+@media (min-width: 1200px) {
+ .hidden-md.hidden-lg,
+ tr.hidden-md.hidden-lg,
+ th.hidden-md.hidden-lg,
+ td.hidden-md.hidden-lg {
+ display: none !important;
+ }
+}
+
+.hidden-lg {
+ display: block !important;
+}
+
+table.hidden-lg {
+ display: table;
+}
+
+tr.hidden-lg {
+ display: table-row !important;
+}
+
+th.hidden-lg,
+td.hidden-lg {
+ display: table-cell !important;
+}
+
+@media (max-width: 767px) {
+ .hidden-lg.hidden-xs,
+ tr.hidden-lg.hidden-xs,
+ th.hidden-lg.hidden-xs,
+ td.hidden-lg.hidden-xs {
+ display: none !important;
+ }
+}
+
+@media (min-width: 768px) and (max-width: 991px) {
+ .hidden-lg.hidden-sm,
+ tr.hidden-lg.hidden-sm,
+ th.hidden-lg.hidden-sm,
+ td.hidden-lg.hidden-sm {
+ display: none !important;
+ }
+}
+
+@media (min-width: 992px) and (max-width: 1199px) {
+ .hidden-lg.hidden-md,
+ tr.hidden-lg.hidden-md,
+ th.hidden-lg.hidden-md,
+ td.hidden-lg.hidden-md {
+ display: none !important;
+ }
+}
+
+@media (min-width: 1200px) {
+ .hidden-lg,
+ tr.hidden-lg,
+ th.hidden-lg,
+ td.hidden-lg {
+ display: none !important;
+ }
+}
+
+.visible-print,
+tr.visible-print,
+th.visible-print,
+td.visible-print {
+ display: none !important;
+}
+
+@media print {
+ .visible-print {
+ display: block !important;
+ }
+ table.visible-print {
+ display: table;
+ }
+ tr.visible-print {
+ display: table-row !important;
+ }
+ th.visible-print,
+ td.visible-print {
+ display: table-cell !important;
+ }
+ .hidden-print,
+ tr.hidden-print,
+ th.hidden-print,
+ td.hidden-print {
+ display: none !important;
+ }
+} \ No newline at end of file
diff --git a/library/bootstrap/css/bootstrap.min.css b/library/bootstrap/css/bootstrap.min.css
new file mode 100644
index 000000000..c547283bb
--- /dev/null
+++ b/library/bootstrap/css/bootstrap.min.css
@@ -0,0 +1,7 @@
+/*!
+ * Bootstrap v3.0.3 (http://getbootstrap.com)
+ * Copyright 2013 Twitter, Inc.
+ * Licensed under http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+/*! normalize.css v2.1.3 | MIT License | git.io/normalize */article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,video{display:inline-block}audio:not([controls]){display:none;height:0}[hidden],template{display:none}html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a{background:transparent}a:focus{outline:thin dotted}a:active,a:hover{outline:0}h1{margin:.67em 0;font-size:2em}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}hr{height:0;-moz-box-sizing:content-box;box-sizing:content-box}mark{color:#000;background:#ff0}code,kbd,pre,samp{font-family:monospace,serif;font-size:1em}pre{white-space:pre-wrap}q{quotes:"\201C" "\201D" "\2018" "\2019"}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:0}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid #c0c0c0}legend{padding:0;border:0}button,input,select,textarea{margin:0;font-family:inherit;font-size:100%}button,input{line-height:normal}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}button[disabled],html input[disabled]{cursor:default}input[type="checkbox"],input[type="radio"]{padding:0;box-sizing:border-box}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}textarea{overflow:auto;vertical-align:top}table{border-collapse:collapse;border-spacing:0}@media print{*{color:#000!important;text-shadow:none!important;background:transparent!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}@page{margin:2cm .5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff!important}.navbar{display:none}.table td,.table th{background-color:#fff!important}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table-bordered th,.table-bordered td{border:1px solid #ddd!important}}*,*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:62.5%;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.428571429;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#428bca;text-decoration:none}a:hover,a:focus{color:#2a6496;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}img{vertical-align:middle}.img-responsive{display:block;height:auto;max-width:100%}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;height:auto;max-width:100%;padding:4px;line-height:1.428571429;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:500;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:normal;line-height:1;color:#999}h1,h2,h3{margin-top:20px;margin-bottom:10px}h1 small,h2 small,h3 small,h1 .small,h2 .small,h3 .small{font-size:65%}h4,h5,h6{margin-top:10px;margin-bottom:10px}h4 small,h5 small,h6 small,h4 .small,h5 .small,h6 .small{font-size:75%}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:200;line-height:1.4}@media(min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}cite{font-style:normal}.text-muted{color:#999}.text-primary{color:#428bca}.text-primary:hover{color:#3071a9}.text-warning{color:#8a6d3b}.text-warning:hover{color:#66512c}.text-danger{color:#a94442}.text-danger:hover{color:#843534}.text-success{color:#3c763d}.text-success:hover{color:#2b542c}.text-info{color:#31708f}.text-info:hover{color:#245269}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}.list-inline>li:first-child{padding-left:0}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.428571429}dt{font-weight:bold}dd{margin-left:0}@media(min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}.dl-horizontal dd:before,.dl-horizontal dd:after{display:table;content:" "}.dl-horizontal dd:after{clear:both}.dl-horizontal dd:before,.dl-horizontal dd:after{display:table;content:" "}.dl-horizontal dd:after{clear:both}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;border-left:5px solid #eee}blockquote p{font-size:17.5px;font-weight:300;line-height:1.25}blockquote p:last-child{margin-bottom:0}blockquote small,blockquote .small{display:block;line-height:1.428571429;color:#999}blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small,blockquote.pull-right .small{text-align:right}blockquote.pull-right small:before,blockquote.pull-right .small:before{content:''}blockquote.pull-right small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}blockquote:before,blockquote:after{content:""}address{margin-bottom:20px;font-style:normal;line-height:1.428571429}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;white-space:nowrap;background-color:#f9f2f4;border-radius:4px}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.428571429;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.container:before,.container:after{display:table;content:" "}.container:after{clear:both}.container:before,.container:after{display:table;content:" "}.container:after{clear:both}@media(min-width:768px){.container{width:750px}}@media(min-width:992px){.container{width:970px}}@media(min-width:1200px){.container{width:1170px}}.row{margin-right:-15px;margin-left:-15px}.row:before,.row:after{display:table;content:" "}.row:after{clear:both}.row:before,.row:after{display:table;content:" "}.row:after{clear:both}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666666666666%}.col-xs-10{width:83.33333333333334%}.col-xs-9{width:75%}.col-xs-8{width:66.66666666666666%}.col-xs-7{width:58.333333333333336%}.col-xs-6{width:50%}.col-xs-5{width:41.66666666666667%}.col-xs-4{width:33.33333333333333%}.col-xs-3{width:25%}.col-xs-2{width:16.666666666666664%}.col-xs-1{width:8.333333333333332%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666666666666%}.col-xs-pull-10{right:83.33333333333334%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666666666666%}.col-xs-pull-7{right:58.333333333333336%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666666666667%}.col-xs-pull-4{right:33.33333333333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.666666666666664%}.col-xs-pull-1{right:8.333333333333332%}.col-xs-pull-0{right:0}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666666666666%}.col-xs-push-10{left:83.33333333333334%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666666666666%}.col-xs-push-7{left:58.333333333333336%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666666666667%}.col-xs-push-4{left:33.33333333333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.666666666666664%}.col-xs-push-1{left:8.333333333333332%}.col-xs-push-0{left:0}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666666666666%}.col-xs-offset-10{margin-left:83.33333333333334%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666666666666%}.col-xs-offset-7{margin-left:58.333333333333336%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666666666667%}.col-xs-offset-4{margin-left:33.33333333333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.666666666666664%}.col-xs-offset-1{margin-left:8.333333333333332%}.col-xs-offset-0{margin-left:0}@media(min-width:768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666666666666%}.col-sm-10{width:83.33333333333334%}.col-sm-9{width:75%}.col-sm-8{width:66.66666666666666%}.col-sm-7{width:58.333333333333336%}.col-sm-6{width:50%}.col-sm-5{width:41.66666666666667%}.col-sm-4{width:33.33333333333333%}.col-sm-3{width:25%}.col-sm-2{width:16.666666666666664%}.col-sm-1{width:8.333333333333332%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666666666666%}.col-sm-pull-10{right:83.33333333333334%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666666666666%}.col-sm-pull-7{right:58.333333333333336%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666666666667%}.col-sm-pull-4{right:33.33333333333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.666666666666664%}.col-sm-pull-1{right:8.333333333333332%}.col-sm-pull-0{right:0}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666666666666%}.col-sm-push-10{left:83.33333333333334%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666666666666%}.col-sm-push-7{left:58.333333333333336%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666666666667%}.col-sm-push-4{left:33.33333333333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.666666666666664%}.col-sm-push-1{left:8.333333333333332%}.col-sm-push-0{left:0}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666666666666%}.col-sm-offset-10{margin-left:83.33333333333334%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666666666666%}.col-sm-offset-7{margin-left:58.333333333333336%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666666666667%}.col-sm-offset-4{margin-left:33.33333333333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.666666666666664%}.col-sm-offset-1{margin-left:8.333333333333332%}.col-sm-offset-0{margin-left:0}}@media(min-width:992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666666666666%}.col-md-10{width:83.33333333333334%}.col-md-9{width:75%}.col-md-8{width:66.66666666666666%}.col-md-7{width:58.333333333333336%}.col-md-6{width:50%}.col-md-5{width:41.66666666666667%}.col-md-4{width:33.33333333333333%}.col-md-3{width:25%}.col-md-2{width:16.666666666666664%}.col-md-1{width:8.333333333333332%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666666666666%}.col-md-pull-10{right:83.33333333333334%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666666666666%}.col-md-pull-7{right:58.333333333333336%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666666666667%}.col-md-pull-4{right:33.33333333333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.666666666666664%}.col-md-pull-1{right:8.333333333333332%}.col-md-pull-0{right:0}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666666666666%}.col-md-push-10{left:83.33333333333334%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666666666666%}.col-md-push-7{left:58.333333333333336%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666666666667%}.col-md-push-4{left:33.33333333333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.666666666666664%}.col-md-push-1{left:8.333333333333332%}.col-md-push-0{left:0}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666666666666%}.col-md-offset-10{margin-left:83.33333333333334%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666666666666%}.col-md-offset-7{margin-left:58.333333333333336%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666666666667%}.col-md-offset-4{margin-left:33.33333333333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.666666666666664%}.col-md-offset-1{margin-left:8.333333333333332%}.col-md-offset-0{margin-left:0}}@media(min-width:1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666666666666%}.col-lg-10{width:83.33333333333334%}.col-lg-9{width:75%}.col-lg-8{width:66.66666666666666%}.col-lg-7{width:58.333333333333336%}.col-lg-6{width:50%}.col-lg-5{width:41.66666666666667%}.col-lg-4{width:33.33333333333333%}.col-lg-3{width:25%}.col-lg-2{width:16.666666666666664%}.col-lg-1{width:8.333333333333332%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666666666666%}.col-lg-pull-10{right:83.33333333333334%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666666666666%}.col-lg-pull-7{right:58.333333333333336%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666666666667%}.col-lg-pull-4{right:33.33333333333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.666666666666664%}.col-lg-pull-1{right:8.333333333333332%}.col-lg-pull-0{right:0}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666666666666%}.col-lg-push-10{left:83.33333333333334%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666666666666%}.col-lg-push-7{left:58.333333333333336%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666666666667%}.col-lg-push-4{left:33.33333333333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.666666666666664%}.col-lg-push-1{left:8.333333333333332%}.col-lg-push-0{left:0}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666666666666%}.col-lg-offset-10{margin-left:83.33333333333334%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666666666666%}.col-lg-offset-7{margin-left:58.333333333333336%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666666666667%}.col-lg-offset-4{margin-left:33.33333333333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.666666666666664%}.col-lg-offset-1{margin-left:8.333333333333332%}.col-lg-offset-0{margin-left:0}}table{max-width:100%;background-color:transparent}th{text-align:left}.table{width:100%;margin-bottom:20px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.428571429;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd)>td,.table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover>tbody>tr:hover>td,.table-hover>tbody>tr:hover>th{background-color:#f5f5f5}table col[class*="col-"]{position:static;display:table-column;float:none}table td[class*="col-"],table th[class*="col-"]{display:table-cell;float:none}.table>thead>tr>.active,.table>tbody>tr>.active,.table>tfoot>tr>.active,.table>thead>.active>td,.table>tbody>.active>td,.table>tfoot>.active>td,.table>thead>.active>th,.table>tbody>.active>th,.table>tfoot>.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>.active:hover,.table-hover>tbody>.active:hover>td,.table-hover>tbody>.active:hover>th{background-color:#e8e8e8}.table>thead>tr>.success,.table>tbody>tr>.success,.table>tfoot>tr>.success,.table>thead>.success>td,.table>tbody>.success>td,.table>tfoot>.success>td,.table>thead>.success>th,.table>tbody>.success>th,.table>tfoot>.success>th{background-color:#dff0d8}.table-hover>tbody>tr>.success:hover,.table-hover>tbody>.success:hover>td,.table-hover>tbody>.success:hover>th{background-color:#d0e9c6}.table>thead>tr>.danger,.table>tbody>tr>.danger,.table>tfoot>tr>.danger,.table>thead>.danger>td,.table>tbody>.danger>td,.table>tfoot>.danger>td,.table>thead>.danger>th,.table>tbody>.danger>th,.table>tfoot>.danger>th{background-color:#f2dede}.table-hover>tbody>tr>.danger:hover,.table-hover>tbody>.danger:hover>td,.table-hover>tbody>.danger:hover>th{background-color:#ebcccc}.table>thead>tr>.warning,.table>tbody>tr>.warning,.table>tfoot>tr>.warning,.table>thead>.warning>td,.table>tbody>.warning>td,.table>tfoot>.warning>td,.table>thead>.warning>th,.table>tbody>.warning>th,.table>tfoot>.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>.warning:hover,.table-hover>tbody>.warning:hover>td,.table-hover>tbody>.warning:hover>th{background-color:#faf2cc}@media(max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-x:scroll;overflow-y:hidden;border:1px solid #ddd;-ms-overflow-style:-ms-autohiding-scrollbar;-webkit-overflow-scrolling:touch}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}select[multiple],select[size]{height:auto}select optgroup{font-family:inherit;font-size:inherit;font-style:inherit}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}input[type="number"]::-webkit-outer-spin-button,input[type="number"]::-webkit-inner-spin-button{height:auto}output{display:block;padding-top:7px;font-size:14px;line-height:1.428571429;color:#555;vertical-align:middle}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.428571429;color:#555;vertical-align:middle;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6)}.form-control:-moz-placeholder{color:#999}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee}textarea.form-control{height:auto}.form-group{margin-bottom:15px}.radio,.checkbox{display:block;min-height:20px;padding-left:20px;margin-top:10px;margin-bottom:10px;vertical-align:middle}.radio label,.checkbox label{display:inline;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{float:left;margin-left:-20px}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;font-weight:normal;vertical-align:middle;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="checkbox"][disabled],.radio[disabled],.radio-inline[disabled],.checkbox[disabled],.checkbox-inline[disabled],fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"],fieldset[disabled] .radio,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}textarea.input-sm{height:auto}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-lg{height:46px;line-height:46px}textarea.input-lg{height:auto}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.form-control-static{margin-bottom:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media(min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block}.form-inline select.form-control{width:auto}.form-inline .radio,.form-inline .checkbox{display:inline-block;padding-left:0;margin-top:0;margin-bottom:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:none;margin-left:0}}.form-horizontal .control-label,.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}.form-horizontal .form-group:before,.form-horizontal .form-group:after{display:table;content:" "}.form-horizontal .form-group:after{clear:both}.form-horizontal .form-group:before,.form-horizontal .form-group:after{display:table;content:" "}.form-horizontal .form-group:after{clear:both}.form-horizontal .form-control-static{padding-top:7px}@media(min-width:768px){.form-horizontal .control-label{text-align:right}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:normal;line-height:1.428571429;text-align:center;white-space:nowrap;vertical-align:middle;cursor:pointer;background-image:none;border:1px solid transparent;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none}.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus{color:#333;text-decoration:none}.btn:active,.btn.active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{pointer-events:none;cursor:not-allowed;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:hover,.btn-default:focus,.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{color:#333;background-color:#ebebeb;border-color:#adadad}.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#fff}.btn-primary{color:#fff;background-color:#428bca;border-color:#357ebd}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{color:#fff;background-color:#3276b1;border-color:#285e8e}.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#428bca;border-color:#357ebd}.btn-primary .badge{color:#428bca;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{color:#fff;background-color:#ed9c28;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{color:#fff;background-color:#d2322d;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{color:#fff;background-color:#47a447;border-color:#398439}.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{color:#fff;background-color:#39b3d7;border-color:#269abc}.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-link{font-weight:normal;color:#428bca;cursor:pointer;border-radius:0}.btn-link,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#2a6496;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#999;text-decoration:none}.btn-lg{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;transition:height .35s ease}@font-face{font-family:'Glyphicons Halflings';src:url('../fonts/glyphicons-halflings-regular.eot');src:url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'),url('../fonts/glyphicons-halflings-regular.woff') format('woff'),url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'),url('../fonts/glyphicons-halflings-regular.svg#glyphicons-halflingsregular') format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';-webkit-font-smoothing:antialiased;font-style:normal;font-weight:normal;line-height:1;-moz-osx-font-smoothing:grayscale}.glyphicon:empty{width:1em}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.428571429;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#428bca;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.428571429;color:#999}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media(min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group>.btn:focus,.btn-group-vertical>.btn:focus{outline:0}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar:before,.btn-toolbar:after{display:table;content:" "}.btn-toolbar:after{clear:both}.btn-toolbar:before,.btn-toolbar:after{display:table;content:" "}.btn-toolbar:after{clear:both}.btn-toolbar .btn-group{float:left}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group,.btn-toolbar>.btn-group+.btn-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after{display:table;content:" "}.btn-group-vertical>.btn-group:after{clear:both}.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after{display:table;content:" "}.btn-group-vertical>.btn-group:after{clear:both}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-right-radius:0;border-bottom-left-radius:4px;border-top-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child>.btn:last-child,.btn-group-vertical>.btn-group:first-child>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;border-collapse:separate;table-layout:fixed}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}[data-toggle="buttons"]>.btn>input[type="radio"],[data-toggle="buttons"]>.btn>input[type="checkbox"]{display:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*="col-"]{float:none;padding-right:0;padding-left:0}.input-group .form-control{width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:normal;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type="radio"],.input-group-addon input[type="checkbox"]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;white-space:nowrap}.input-group-btn:first-child>.btn{margin-right:-1px}.input-group-btn:last-child>.btn{margin-left:-1px}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-4px}.input-group-btn>.btn:hover,.input-group-btn>.btn:active{z-index:2}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav:before,.nav:after{display:table;content:" "}.nav:after{clear:both}.nav:before,.nav:after{display:table;content:" "}.nav:after{clear:both}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#999}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#999;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;border-color:#428bca}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.428571429;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media(min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd}@media(min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#428bca}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media(min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #ddd}@media(min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}.navbar:before,.navbar:after{display:table;content:" "}.navbar:after{clear:both}.navbar:before,.navbar:after{display:table;content:" "}.navbar:after{clear:both}@media(min-width:768px){.navbar{border-radius:4px}}.navbar-header:before,.navbar-header:after{display:table;content:" "}.navbar-header:after{clear:both}.navbar-header:before,.navbar-header:after{display:table;content:" "}.navbar-header:after{clear:both}@media(min-width:768px){.navbar-header{float:left}}.navbar-collapse{max-height:340px;padding-right:15px;padding-left:15px;overflow-x:visible;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling:touch}.navbar-collapse:before,.navbar-collapse:after{display:table;content:" "}.navbar-collapse:after{clear:both}.navbar-collapse:before,.navbar-collapse:after{display:table;content:" "}.navbar-collapse:after{clear:both}.navbar-collapse.in{overflow-y:auto}@media(min-width:768px){.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-right:0;padding-left:0}}.container>.navbar-header,.container>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media(min-width:768px){.container>.navbar-header,.container>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media(min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media(min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}@media(min-width:768px){.navbar>.container .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media(min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media(max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media(min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}.navbar-nav.navbar-right:last-child{margin-right:-15px}}@media(min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1)}@media(min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block}.navbar-form select.form-control{width:auto}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;padding-left:0;margin-top:0;margin-bottom:0}.navbar-form .radio input[type="radio"],.navbar-form .checkbox input[type="checkbox"]{float:none;margin-left:0}}@media(max-width:767px){.navbar-form .form-group{margin-bottom:5px}}@media(min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-form.navbar-right:last-child{margin-right:-15px}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-nav.pull-right>li>.dropdown-menu,.navbar-nav>li>.dropdown-menu.pull-right{right:0;left:auto}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media(min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}.navbar-text.navbar-right:last-child{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#ccc}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{color:#555;background-color:#e7e7e7}@media(max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#999}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#999}.navbar-inverse .navbar-nav>li>a{color:#999}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{color:#fff;background-color:#080808}@media(max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#999}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover{color:#fff}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#999}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.428571429;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{background-color:#eee}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:2;color:#fff;cursor:default;background-color:#428bca;border-color:#428bca}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#999;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager:before,.pager:after{display:table;content:" "}.pager:after{clear:both}.pager:before,.pager:after{display:table;content:" "}.pager:after{clear:both}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}.label[href]:hover,.label[href]:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#999}.label-default[href]:hover,.label-default[href]:focus{background-color:#808080}.label-primary{background-color:#428bca}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#3071a9}.label-success{background-color:#5cb85c}.label-success[href]:hover,.label-success[href]:focus{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:hover,.label-info[href]:focus{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;background-color:#999;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}a.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#428bca;background-color:#fff}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px;margin-bottom:30px;font-size:21px;font-weight:200;line-height:2.1428571435;color:inherit;background-color:#eee}.jumbotron h1,.jumbotron .h1{line-height:1;color:inherit}.jumbotron p{line-height:1.4}.container .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron{padding-right:60px;padding-left:60px}.jumbotron h1,.jumbotron .h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.428571429;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.thumbnail>img,.thumbnail a>img{display:block;height:auto;max-width:100%;margin-right:auto;margin-left:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#428bca}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:bold}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable{padding-right:35px}.alert-dismissable .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#428bca;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-transition:width .6s ease;transition:width .6s ease}.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-size:40px 40px}.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.media,.media-body{overflow:hidden;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:hover,a.list-group-item:focus{text-decoration:none;background-color:#f5f5f5}a.list-group-item.active,a.list-group-item.active:hover,a.list-group-item.active:focus{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca}a.list-group-item.active .list-group-item-heading,a.list-group-item.active:hover .list-group-item-heading,a.list-group-item.active:focus .list-group-item-heading{color:inherit}a.list-group-item.active .list-group-item-text,a.list-group-item.active:hover .list-group-item-text,a.list-group-item.active:focus .list-group-item-text{color:#e1edf7}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding:15px}.panel-body:before,.panel-body:after{display:table;content:" "}.panel-body:after{clear:both}.panel-body:before,.panel-body:after{display:table;content:" "}.panel-body:after{clear:both}.panel>.list-group{margin-bottom:0}.panel>.list-group .list-group-item{border-width:1px 0}.panel>.list-group .list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.panel>.list-group .list-group-item:last-child{border-bottom:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive{border-top:1px solid #ddd}.panel>.table>tbody:first-child th,.panel>.table>tbody:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:last-child>th,.panel>.table-responsive>.table-bordered>thead>tr:last-child>th,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th,.panel>.table-bordered>thead>tr:last-child>td,.panel>.table-responsive>.table-bordered>thead>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-group .panel{margin-bottom:0;overflow:hidden;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse .panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse .panel-body{border-top-color:#ddd}.panel-default>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#428bca}.panel-primary>.panel-heading{color:#fff;background-color:#428bca;border-color:#428bca}.panel-primary>.panel-heading+.panel-collapse .panel-body{border-top-color:#428bca}.panel-primary>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#428bca}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse .panel-body{border-top-color:#d6e9c6}.panel-success>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#d6e9c6}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse .panel-body{border-top-color:#faebcc}.panel-warning>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse .panel-body{border-top-color:#ebccd1}.panel-danger>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ebccd1}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse .panel-body{border-top-color:#bce8f1}.panel-info>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#bce8f1}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:bold;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;display:none;overflow:auto;overflow-y:scroll}.modal.fade .modal-dialog{-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);transform:translate(0,-25%);-webkit-transition:-webkit-transform .3s ease-out;-moz-transition:-moz-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}.modal-dialog{position:relative;z-index:1050;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);background-clip:padding-box}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1030;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{min-height:16.428571429px;padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.428571429}.modal-body{position:relative;padding:20px}.modal-footer{padding:19px 20px 20px;margin-top:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer:before,.modal-footer:after{display:table;content:" "}.modal-footer:after{clear:both}.modal-footer:before,.modal-footer:after{display:table;content:" "}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}@media screen and (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}}.tooltip{position:absolute;z-index:1030;display:block;font-size:12px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.9;filter:alpha(opacity=90)}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.top-left .tooltip-arrow{bottom:0;left:5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.top-right .tooltip-arrow{right:5px;bottom:0;border-top-color:#000;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#000;border-width:0 5px 5px}.tooltip.bottom-left .tooltip-arrow{top:0;left:5px;border-bottom-color:#000;border-width:0 5px 5px}.tooltip.bottom-right .tooltip-arrow{top:0;right:5px;border-bottom-color:#000;border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);background-clip:padding-box}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover .arrow,.popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover .arrow{border-width:11px}.popover .arrow:after{border-width:10px;content:""}.popover.top .arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);border-bottom-width:0}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#fff;border-bottom-width:0;content:" "}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,0.25);border-left-width:0}.popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#fff;border-left-width:0;content:" "}.popover.bottom .arrow{top:-11px;left:50%;margin-left:-11px;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);border-top-width:0}.popover.bottom .arrow:after{top:1px;margin-left:-10px;border-bottom-color:#fff;border-top-width:0;content:" "}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-left-color:#999;border-left-color:rgba(0,0,0,0.25);border-right-width:0}.popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#fff;border-right-width:0;content:" "}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;height:auto;max-width:100%;line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6);opacity:.5;filter:alpha(opacity=50)}.carousel-control.left{background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,0.5) 0),color-stop(rgba(0,0,0,0.0001) 100%));background-image:linear-gradient(to right,rgba(0,0,0,0.5) 0,rgba(0,0,0,0.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000',endColorstr='#00000000',GradientType=1)}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,0.0001) 0),color-stop(rgba(0,0,0,0.5) 100%));background-image:linear-gradient(to right,rgba(0,0,0,0.0001) 0,rgba(0,0,0,0.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000',endColorstr='#80000000',GradientType=1)}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;outline:0;opacity:.9;filter:alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;margin-top:-10px;margin-left:-10px;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicons-chevron-left,.carousel-control .glyphicons-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;margin-left:-15px;font-size:30px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after{display:table;content:" "}.clearfix:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important;visibility:hidden!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,tr.visible-xs,th.visible-xs,td.visible-xs{display:none!important}@media(max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table}tr.visible-xs{display:table-row!important}th.visible-xs,td.visible-xs{display:table-cell!important}}@media(min-width:768px) and (max-width:991px){.visible-xs.visible-sm{display:block!important}table.visible-xs.visible-sm{display:table}tr.visible-xs.visible-sm{display:table-row!important}th.visible-xs.visible-sm,td.visible-xs.visible-sm{display:table-cell!important}}@media(min-width:992px) and (max-width:1199px){.visible-xs.visible-md{display:block!important}table.visible-xs.visible-md{display:table}tr.visible-xs.visible-md{display:table-row!important}th.visible-xs.visible-md,td.visible-xs.visible-md{display:table-cell!important}}@media(min-width:1200px){.visible-xs.visible-lg{display:block!important}table.visible-xs.visible-lg{display:table}tr.visible-xs.visible-lg{display:table-row!important}th.visible-xs.visible-lg,td.visible-xs.visible-lg{display:table-cell!important}}.visible-sm,tr.visible-sm,th.visible-sm,td.visible-sm{display:none!important}@media(max-width:767px){.visible-sm.visible-xs{display:block!important}table.visible-sm.visible-xs{display:table}tr.visible-sm.visible-xs{display:table-row!important}th.visible-sm.visible-xs,td.visible-sm.visible-xs{display:table-cell!important}}@media(min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table}tr.visible-sm{display:table-row!important}th.visible-sm,td.visible-sm{display:table-cell!important}}@media(min-width:992px) and (max-width:1199px){.visible-sm.visible-md{display:block!important}table.visible-sm.visible-md{display:table}tr.visible-sm.visible-md{display:table-row!important}th.visible-sm.visible-md,td.visible-sm.visible-md{display:table-cell!important}}@media(min-width:1200px){.visible-sm.visible-lg{display:block!important}table.visible-sm.visible-lg{display:table}tr.visible-sm.visible-lg{display:table-row!important}th.visible-sm.visible-lg,td.visible-sm.visible-lg{display:table-cell!important}}.visible-md,tr.visible-md,th.visible-md,td.visible-md{display:none!important}@media(max-width:767px){.visible-md.visible-xs{display:block!important}table.visible-md.visible-xs{display:table}tr.visible-md.visible-xs{display:table-row!important}th.visible-md.visible-xs,td.visible-md.visible-xs{display:table-cell!important}}@media(min-width:768px) and (max-width:991px){.visible-md.visible-sm{display:block!important}table.visible-md.visible-sm{display:table}tr.visible-md.visible-sm{display:table-row!important}th.visible-md.visible-sm,td.visible-md.visible-sm{display:table-cell!important}}@media(min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table}tr.visible-md{display:table-row!important}th.visible-md,td.visible-md{display:table-cell!important}}@media(min-width:1200px){.visible-md.visible-lg{display:block!important}table.visible-md.visible-lg{display:table}tr.visible-md.visible-lg{display:table-row!important}th.visible-md.visible-lg,td.visible-md.visible-lg{display:table-cell!important}}.visible-lg,tr.visible-lg,th.visible-lg,td.visible-lg{display:none!important}@media(max-width:767px){.visible-lg.visible-xs{display:block!important}table.visible-lg.visible-xs{display:table}tr.visible-lg.visible-xs{display:table-row!important}th.visible-lg.visible-xs,td.visible-lg.visible-xs{display:table-cell!important}}@media(min-width:768px) and (max-width:991px){.visible-lg.visible-sm{display:block!important}table.visible-lg.visible-sm{display:table}tr.visible-lg.visible-sm{display:table-row!important}th.visible-lg.visible-sm,td.visible-lg.visible-sm{display:table-cell!important}}@media(min-width:992px) and (max-width:1199px){.visible-lg.visible-md{display:block!important}table.visible-lg.visible-md{display:table}tr.visible-lg.visible-md{display:table-row!important}th.visible-lg.visible-md,td.visible-lg.visible-md{display:table-cell!important}}@media(min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table}tr.visible-lg{display:table-row!important}th.visible-lg,td.visible-lg{display:table-cell!important}}.hidden-xs{display:block!important}table.hidden-xs{display:table}tr.hidden-xs{display:table-row!important}th.hidden-xs,td.hidden-xs{display:table-cell!important}@media(max-width:767px){.hidden-xs,tr.hidden-xs,th.hidden-xs,td.hidden-xs{display:none!important}}@media(min-width:768px) and (max-width:991px){.hidden-xs.hidden-sm,tr.hidden-xs.hidden-sm,th.hidden-xs.hidden-sm,td.hidden-xs.hidden-sm{display:none!important}}@media(min-width:992px) and (max-width:1199px){.hidden-xs.hidden-md,tr.hidden-xs.hidden-md,th.hidden-xs.hidden-md,td.hidden-xs.hidden-md{display:none!important}}@media(min-width:1200px){.hidden-xs.hidden-lg,tr.hidden-xs.hidden-lg,th.hidden-xs.hidden-lg,td.hidden-xs.hidden-lg{display:none!important}}.hidden-sm{display:block!important}table.hidden-sm{display:table}tr.hidden-sm{display:table-row!important}th.hidden-sm,td.hidden-sm{display:table-cell!important}@media(max-width:767px){.hidden-sm.hidden-xs,tr.hidden-sm.hidden-xs,th.hidden-sm.hidden-xs,td.hidden-sm.hidden-xs{display:none!important}}@media(min-width:768px) and (max-width:991px){.hidden-sm,tr.hidden-sm,th.hidden-sm,td.hidden-sm{display:none!important}}@media(min-width:992px) and (max-width:1199px){.hidden-sm.hidden-md,tr.hidden-sm.hidden-md,th.hidden-sm.hidden-md,td.hidden-sm.hidden-md{display:none!important}}@media(min-width:1200px){.hidden-sm.hidden-lg,tr.hidden-sm.hidden-lg,th.hidden-sm.hidden-lg,td.hidden-sm.hidden-lg{display:none!important}}.hidden-md{display:block!important}table.hidden-md{display:table}tr.hidden-md{display:table-row!important}th.hidden-md,td.hidden-md{display:table-cell!important}@media(max-width:767px){.hidden-md.hidden-xs,tr.hidden-md.hidden-xs,th.hidden-md.hidden-xs,td.hidden-md.hidden-xs{display:none!important}}@media(min-width:768px) and (max-width:991px){.hidden-md.hidden-sm,tr.hidden-md.hidden-sm,th.hidden-md.hidden-sm,td.hidden-md.hidden-sm{display:none!important}}@media(min-width:992px) and (max-width:1199px){.hidden-md,tr.hidden-md,th.hidden-md,td.hidden-md{display:none!important}}@media(min-width:1200px){.hidden-md.hidden-lg,tr.hidden-md.hidden-lg,th.hidden-md.hidden-lg,td.hidden-md.hidden-lg{display:none!important}}.hidden-lg{display:block!important}table.hidden-lg{display:table}tr.hidden-lg{display:table-row!important}th.hidden-lg,td.hidden-lg{display:table-cell!important}@media(max-width:767px){.hidden-lg.hidden-xs,tr.hidden-lg.hidden-xs,th.hidden-lg.hidden-xs,td.hidden-lg.hidden-xs{display:none!important}}@media(min-width:768px) and (max-width:991px){.hidden-lg.hidden-sm,tr.hidden-lg.hidden-sm,th.hidden-lg.hidden-sm,td.hidden-lg.hidden-sm{display:none!important}}@media(min-width:992px) and (max-width:1199px){.hidden-lg.hidden-md,tr.hidden-lg.hidden-md,th.hidden-lg.hidden-md,td.hidden-lg.hidden-md{display:none!important}}@media(min-width:1200px){.hidden-lg,tr.hidden-lg,th.hidden-lg,td.hidden-lg{display:none!important}}.visible-print,tr.visible-print,th.visible-print,td.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table}tr.visible-print{display:table-row!important}th.visible-print,td.visible-print{display:table-cell!important}.hidden-print,tr.hidden-print,th.hidden-print,td.hidden-print{display:none!important}} \ No newline at end of file
diff --git a/library/bootstrap/fonts/glyphicons-halflings-regular.eot b/library/bootstrap/fonts/glyphicons-halflings-regular.eot
new file mode 100644
index 000000000..423bd5d3a
--- /dev/null
+++ b/library/bootstrap/fonts/glyphicons-halflings-regular.eot
Binary files differ
diff --git a/library/bootstrap/fonts/glyphicons-halflings-regular.svg b/library/bootstrap/fonts/glyphicons-halflings-regular.svg
new file mode 100644
index 000000000..446948874
--- /dev/null
+++ b/library/bootstrap/fonts/glyphicons-halflings-regular.svg
@@ -0,0 +1,229 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
+<svg xmlns="http://www.w3.org/2000/svg">
+<metadata></metadata>
+<defs>
+<font id="glyphicons_halflingsregular" horiz-adv-x="1200" >
+<font-face units-per-em="1200" ascent="960" descent="-240" />
+<missing-glyph horiz-adv-x="500" />
+<glyph />
+<glyph />
+<glyph unicode="&#xd;" />
+<glyph unicode=" " />
+<glyph unicode="*" d="M100 500v200h259l-183 183l141 141l183 -183v259h200v-259l183 183l141 -141l-183 -183h259v-200h-259l183 -183l-141 -141l-183 183v-259h-200v259l-183 -183l-141 141l183 183h-259z" />
+<glyph unicode="+" d="M0 400v300h400v400h300v-400h400v-300h-400v-400h-300v400h-400z" />
+<glyph unicode="&#xa0;" />
+<glyph unicode="&#x2000;" horiz-adv-x="652" />
+<glyph unicode="&#x2001;" horiz-adv-x="1304" />
+<glyph unicode="&#x2002;" horiz-adv-x="652" />
+<glyph unicode="&#x2003;" horiz-adv-x="1304" />
+<glyph unicode="&#x2004;" horiz-adv-x="434" />
+<glyph unicode="&#x2005;" horiz-adv-x="326" />
+<glyph unicode="&#x2006;" horiz-adv-x="217" />
+<glyph unicode="&#x2007;" horiz-adv-x="217" />
+<glyph unicode="&#x2008;" horiz-adv-x="163" />
+<glyph unicode="&#x2009;" horiz-adv-x="260" />
+<glyph unicode="&#x200a;" horiz-adv-x="72" />
+<glyph unicode="&#x202f;" horiz-adv-x="260" />
+<glyph unicode="&#x205f;" horiz-adv-x="326" />
+<glyph unicode="&#x20ac;" d="M100 500l100 100h113q0 47 5 100h-218l100 100h135q37 167 112 257q117 141 297 141q242 0 354 -189q60 -103 66 -209h-181q0 55 -25.5 99t-63.5 68t-75 36.5t-67 12.5q-24 0 -52.5 -10t-62.5 -32t-65.5 -67t-50.5 -107h379l-100 -100h-300q-6 -46 -6 -100h406l-100 -100 h-300q9 -74 33 -132t52.5 -91t62 -54.5t59 -29t46.5 -7.5q29 0 66 13t75 37t63.5 67.5t25.5 96.5h174q-31 -172 -128 -278q-107 -117 -274 -117q-205 0 -324 158q-36 46 -69 131.5t-45 205.5h-217z" />
+<glyph unicode="&#x2212;" d="M200 400h900v300h-900v-300z" />
+<glyph unicode="&#x2601;" d="M-14 494q0 -80 56.5 -137t135.5 -57h750q120 0 205 86t85 208q0 120 -85 206.5t-205 86.5q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5z" />
+<glyph unicode="&#x2709;" d="M0 100l400 400l200 -200l200 200l400 -400h-1200zM0 300v600l300 -300zM0 1100l600 -603l600 603h-1200zM900 600l300 300v-600z" />
+<glyph unicode="&#x270f;" d="M-13 -13l333 112l-223 223zM187 403l214 -214l614 614l-214 214zM887 1103l214 -214l99 92q13 13 13 32.5t-13 33.5l-153 153q-15 13 -33 13t-33 -13z" />
+<glyph unicode="&#xe000;" horiz-adv-x="500" d="M0 0z" />
+<glyph unicode="&#xe001;" d="M0 1200h1200l-500 -550v-550h300v-100h-800v100h300v550z" />
+<glyph unicode="&#xe002;" d="M14 84q18 -55 86 -75.5t147 5.5q65 21 109 69t44 90v606l600 155v-521q-64 16 -138 -7q-79 -26 -122.5 -83t-25.5 -111q17 -55 85.5 -75.5t147.5 4.5q70 23 111.5 63.5t41.5 95.5v881q0 10 -7 15.5t-17 2.5l-752 -193q-10 -3 -17 -12.5t-7 -19.5v-689q-64 17 -138 -7 q-79 -25 -122.5 -82t-25.5 -112z" />
+<glyph unicode="&#xe003;" d="M23 693q0 200 142 342t342 142t342 -142t142 -342q0 -142 -78 -261l300 -300q7 -8 7 -18t-7 -18l-109 -109q-8 -7 -18 -7t-18 7l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 693q0 -136 97 -233t234 -97t233.5 96.5t96.5 233.5t-96.5 233.5t-233.5 96.5 t-234 -97t-97 -233z" />
+<glyph unicode="&#xe005;" d="M100 784q0 64 28 123t73 100.5t104.5 64t119 20.5t120 -38.5t104.5 -104.5q48 69 109.5 105t121.5 38t118.5 -20.5t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-149.5 152.5t-126.5 127.5 t-94 124.5t-33.5 117.5z" />
+<glyph unicode="&#xe006;" d="M-72 800h479l146 400h2l146 -400h472l-382 -278l145 -449l-384 275l-382 -275l146 447zM168 71l2 1z" />
+<glyph unicode="&#xe007;" d="M-72 800h479l146 400h2l146 -400h472l-382 -278l145 -449l-384 275l-382 -275l146 447zM168 71l2 1zM237 700l196 -142l-73 -226l192 140l195 -141l-74 229l193 140h-235l-77 211l-78 -211h-239z" />
+<glyph unicode="&#xe008;" d="M0 0v143l400 257v100q-37 0 -68.5 74.5t-31.5 125.5v200q0 124 88 212t212 88t212 -88t88 -212v-200q0 -51 -31.5 -125.5t-68.5 -74.5v-100l400 -257v-143h-1200z" />
+<glyph unicode="&#xe009;" d="M0 0v1100h1200v-1100h-1200zM100 100h100v100h-100v-100zM100 300h100v100h-100v-100zM100 500h100v100h-100v-100zM100 700h100v100h-100v-100zM100 900h100v100h-100v-100zM300 100h600v400h-600v-400zM300 600h600v400h-600v-400zM1000 100h100v100h-100v-100z M1000 300h100v100h-100v-100zM1000 500h100v100h-100v-100zM1000 700h100v100h-100v-100zM1000 900h100v100h-100v-100z" />
+<glyph unicode="&#xe010;" d="M0 50v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5zM0 650v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5zM600 50v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5zM600 650v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5z" />
+<glyph unicode="&#xe011;" d="M0 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM0 450v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200 q-21 0 -35.5 14.5t-14.5 35.5zM0 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5 t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 450v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5 v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 450v200q0 21 14.5 35.5t35.5 14.5h200 q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5z" />
+<glyph unicode="&#xe012;" d="M0 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM0 450q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v200q0 21 -14.5 35.5t-35.5 14.5h-200q-21 0 -35.5 -14.5 t-14.5 -35.5v-200zM0 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 50v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5 t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5zM400 450v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5zM400 850v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5 v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5z" />
+<glyph unicode="&#xe013;" d="M29 454l419 -420l818 820l-212 212l-607 -607l-206 207z" />
+<glyph unicode="&#xe014;" d="M106 318l282 282l-282 282l212 212l282 -282l282 282l212 -212l-282 -282l282 -282l-212 -212l-282 282l-282 -282z" />
+<glyph unicode="&#xe015;" d="M23 693q0 200 142 342t342 142t342 -142t142 -342q0 -142 -78 -261l300 -300q7 -8 7 -18t-7 -18l-109 -109q-8 -7 -18 -7t-18 7l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 693q0 -136 97 -233t234 -97t233.5 96.5t96.5 233.5t-96.5 233.5t-233.5 96.5 t-234 -97t-97 -233zM300 600v200h100v100h200v-100h100v-200h-100v-100h-200v100h-100z" />
+<glyph unicode="&#xe016;" d="M23 694q0 200 142 342t342 142t342 -142t142 -342q0 -141 -78 -262l300 -299q7 -7 7 -18t-7 -18l-109 -109q-8 -8 -18 -8t-18 8l-300 299q-120 -77 -261 -77q-200 0 -342 142t-142 342zM176 694q0 -136 97 -233t234 -97t233.5 97t96.5 233t-96.5 233t-233.5 97t-234 -97 t-97 -233zM300 601h400v200h-400v-200z" />
+<glyph unicode="&#xe017;" d="M23 600q0 183 105 331t272 210v-166q-103 -55 -165 -155t-62 -220q0 -177 125 -302t302 -125t302 125t125 302q0 120 -62 220t-165 155v166q167 -62 272 -210t105 -331q0 -118 -45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123t-123 184t-45.5 224.5 zM500 750q0 -21 14.5 -35.5t35.5 -14.5h100q21 0 35.5 14.5t14.5 35.5v400q0 21 -14.5 35.5t-35.5 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-400z" />
+<glyph unicode="&#xe018;" d="M100 1h200v300h-200v-300zM400 1v500h200v-500h-200zM700 1v800h200v-800h-200zM1000 1v1200h200v-1200h-200z" />
+<glyph unicode="&#xe019;" d="M26 601q0 -33 6 -74l151 -38l2 -6q14 -49 38 -93l3 -5l-80 -134q45 -59 105 -105l133 81l5 -3q45 -26 94 -39l5 -2l38 -151q40 -5 74 -5q27 0 74 5l38 151l6 2q46 13 93 39l5 3l134 -81q56 44 104 105l-80 134l3 5q24 44 39 93l1 6l152 38q5 40 5 74q0 28 -5 73l-152 38 l-1 6q-16 51 -39 93l-3 5l80 134q-44 58 -104 105l-134 -81l-5 3q-45 25 -93 39l-6 1l-38 152q-40 5 -74 5q-27 0 -74 -5l-38 -152l-5 -1q-50 -14 -94 -39l-5 -3l-133 81q-59 -47 -105 -105l80 -134l-3 -5q-25 -47 -38 -93l-2 -6l-151 -38q-6 -48 -6 -73zM385 601 q0 88 63 151t152 63t152 -63t63 -151q0 -89 -63 -152t-152 -63t-152 63t-63 152z" />
+<glyph unicode="&#xe020;" d="M100 1025v50q0 10 7.5 17.5t17.5 7.5h275v100q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5v-100h275q10 0 17.5 -7.5t7.5 -17.5v-50q0 -11 -7 -18t-18 -7h-1050q-11 0 -18 7t-7 18zM200 100v800h900v-800q0 -41 -29.5 -71t-70.5 -30h-700q-41 0 -70.5 30 t-29.5 71zM300 100h100v700h-100v-700zM500 100h100v700h-100v-700zM500 1100h300v100h-300v-100zM700 100h100v700h-100v-700zM900 100h100v700h-100v-700z" />
+<glyph unicode="&#xe021;" d="M1 601l656 644l644 -644h-200v-600h-300v400h-300v-400h-300v600h-200z" />
+<glyph unicode="&#xe022;" d="M100 25v1150q0 11 7 18t18 7h475v-500h400v-675q0 -11 -7 -18t-18 -7h-850q-11 0 -18 7t-7 18zM700 800v300l300 -300h-300z" />
+<glyph unicode="&#xe023;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM500 500v400h100 v-300h200v-100h-300z" />
+<glyph unicode="&#xe024;" d="M-100 0l431 1200h209l-21 -300h162l-20 300h208l431 -1200h-538l-41 400h-242l-40 -400h-539zM488 500h224l-27 300h-170z" />
+<glyph unicode="&#xe025;" d="M0 0v400h490l-290 300h200v500h300v-500h200l-290 -300h490v-400h-1100zM813 200h175v100h-175v-100z" />
+<glyph unicode="&#xe026;" d="M1 600q0 122 47.5 233t127.5 191t191 127.5t233 47.5t233 -47.5t191 -127.5t127.5 -191t47.5 -233t-47.5 -233t-127.5 -191t-191 -127.5t-233 -47.5t-233 47.5t-191 127.5t-127.5 191t-47.5 233zM188 600q0 -170 121 -291t291 -121t291 121t121 291t-121 291t-291 121 t-291 -121t-121 -291zM350 600h150v300h200v-300h150l-250 -300z" />
+<glyph unicode="&#xe027;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM350 600l250 300 l250 -300h-150v-300h-200v300h-150z" />
+<glyph unicode="&#xe028;" d="M0 25v475l200 700h800q199 -700 200 -700v-475q0 -11 -7 -18t-18 -7h-1150q-11 0 -18 7t-7 18zM200 500h200l50 -200h300l50 200h200l-97 500h-606z" />
+<glyph unicode="&#xe029;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -172 121.5 -293t292.5 -121t292.5 121t121.5 293q0 171 -121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM500 397v401 l297 -200z" />
+<glyph unicode="&#xe030;" d="M23 600q0 -118 45.5 -224.5t123 -184t184 -123t224.5 -45.5t224.5 45.5t184 123t123 184t45.5 224.5h-150q0 -177 -125 -302t-302 -125t-302 125t-125 302t125 302t302 125q136 0 246 -81l-146 -146h400v400l-145 -145q-157 122 -355 122q-118 0 -224.5 -45.5t-184 -123 t-123 -184t-45.5 -224.5z" />
+<glyph unicode="&#xe031;" d="M23 600q0 118 45.5 224.5t123 184t184 123t224.5 45.5q198 0 355 -122l145 145v-400h-400l147 147q-112 80 -247 80q-177 0 -302 -125t-125 -302h-150zM100 0v400h400l-147 -147q112 -80 247 -80q177 0 302 125t125 302h150q0 -118 -45.5 -224.5t-123 -184t-184 -123 t-224.5 -45.5q-198 0 -355 122z" />
+<glyph unicode="&#xe032;" d="M100 0h1100v1200h-1100v-1200zM200 100v900h900v-900h-900zM300 200v100h100v-100h-100zM300 400v100h100v-100h-100zM300 600v100h100v-100h-100zM300 800v100h100v-100h-100zM500 200h500v100h-500v-100zM500 400v100h500v-100h-500zM500 600v100h500v-100h-500z M500 800v100h500v-100h-500z" />
+<glyph unicode="&#xe033;" d="M0 100v600q0 41 29.5 70.5t70.5 29.5h100v200q0 82 59 141t141 59h300q82 0 141 -59t59 -141v-200h100q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-900q-41 0 -70.5 29.5t-29.5 70.5zM400 800h300v150q0 21 -14.5 35.5t-35.5 14.5h-200 q-21 0 -35.5 -14.5t-14.5 -35.5v-150z" />
+<glyph unicode="&#xe034;" d="M100 0v1100h100v-1100h-100zM300 400q60 60 127.5 84t127.5 17.5t122 -23t119 -30t110 -11t103 42t91 120.5v500q-40 -81 -101.5 -115.5t-127.5 -29.5t-138 25t-139.5 40t-125.5 25t-103 -29.5t-65 -115.5v-500z" />
+<glyph unicode="&#xe035;" d="M0 275q0 -11 7 -18t18 -7h50q11 0 18 7t7 18v300q0 127 70.5 231.5t184.5 161.5t245 57t245 -57t184.5 -161.5t70.5 -231.5v-300q0 -11 7 -18t18 -7h50q11 0 18 7t7 18v300q0 116 -49.5 227t-131 192.5t-192.5 131t-227 49.5t-227 -49.5t-192.5 -131t-131 -192.5 t-49.5 -227v-300zM200 20v460q0 8 6 14t14 6h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14zM800 20v460q0 8 6 14t14 6h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14z" />
+<glyph unicode="&#xe036;" d="M0 400h300l300 -200v800l-300 -200h-300v-400zM688 459l141 141l-141 141l71 71l141 -141l141 141l71 -71l-141 -141l141 -141l-71 -71l-141 141l-141 -141z" />
+<glyph unicode="&#xe037;" d="M0 400h300l300 -200v800l-300 -200h-300v-400zM700 857l69 53q111 -135 111 -310q0 -169 -106 -302l-67 54q86 110 86 248q0 146 -93 257z" />
+<glyph unicode="&#xe038;" d="M0 401v400h300l300 200v-800l-300 200h-300zM702 858l69 53q111 -135 111 -310q0 -170 -106 -303l-67 55q86 110 86 248q0 145 -93 257zM889 951l7 -8q123 -151 123 -344q0 -189 -119 -339l-7 -8l81 -66l6 8q142 178 142 405q0 230 -144 408l-6 8z" />
+<glyph unicode="&#xe039;" d="M0 0h500v500h-200v100h-100v-100h-200v-500zM0 600h100v100h400v100h100v100h-100v300h-500v-600zM100 100v300h300v-300h-300zM100 800v300h300v-300h-300zM200 200v100h100v-100h-100zM200 900h100v100h-100v-100zM500 500v100h300v-300h200v-100h-100v-100h-200v100 h-100v100h100v200h-200zM600 0v100h100v-100h-100zM600 1000h100v-300h200v-300h300v200h-200v100h200v500h-600v-200zM800 800v300h300v-300h-300zM900 0v100h300v-100h-300zM900 900v100h100v-100h-100zM1100 200v100h100v-100h-100z" />
+<glyph unicode="&#xe040;" d="M0 200h100v1000h-100v-1000zM100 0v100h300v-100h-300zM200 200v1000h100v-1000h-100zM500 0v91h100v-91h-100zM500 200v1000h200v-1000h-200zM700 0v91h100v-91h-100zM800 200v1000h100v-1000h-100zM900 0v91h200v-91h-200zM1000 200v1000h200v-1000h-200z" />
+<glyph unicode="&#xe041;" d="M1 700v475q0 10 7.5 17.5t17.5 7.5h474l700 -700l-500 -500zM148 953q0 -42 29 -71q30 -30 71.5 -30t71.5 30q29 29 29 71t-29 71q-30 30 -71.5 30t-71.5 -30q-29 -29 -29 -71z" />
+<glyph unicode="&#xe042;" d="M2 700v475q0 11 7 18t18 7h474l700 -700l-500 -500zM148 953q0 -42 30 -71q29 -30 71 -30t71 30q30 29 30 71t-30 71q-29 30 -71 30t-71 -30q-30 -29 -30 -71zM701 1200h100l700 -700l-500 -500l-50 50l450 450z" />
+<glyph unicode="&#xe043;" d="M100 0v1025l175 175h925v-1000l-100 -100v1000h-750l-100 -100h750v-1000h-900z" />
+<glyph unicode="&#xe044;" d="M200 0l450 444l450 -443v1150q0 20 -14.5 35t-35.5 15h-800q-21 0 -35.5 -15t-14.5 -35v-1151z" />
+<glyph unicode="&#xe045;" d="M0 100v700h200l100 -200h600l100 200h200v-700h-200v200h-800v-200h-200zM253 829l40 -124h592l62 124l-94 346q-2 11 -10 18t-18 7h-450q-10 0 -18 -7t-10 -18zM281 24l38 152q2 10 11.5 17t19.5 7h500q10 0 19.5 -7t11.5 -17l38 -152q2 -10 -3.5 -17t-15.5 -7h-600 q-10 0 -15.5 7t-3.5 17z" />
+<glyph unicode="&#xe046;" d="M0 200q0 -41 29.5 -70.5t70.5 -29.5h1000q41 0 70.5 29.5t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5h-150q-4 8 -11.5 21.5t-33 48t-53 61t-69 48t-83.5 21.5h-200q-41 0 -82 -20.5t-70 -50t-52 -59t-34 -50.5l-12 -20h-150q-41 0 -70.5 -29.5t-29.5 -70.5v-600z M356 500q0 100 72 172t172 72t172 -72t72 -172t-72 -172t-172 -72t-172 72t-72 172zM494 500q0 -44 31 -75t75 -31t75 31t31 75t-31 75t-75 31t-75 -31t-31 -75zM900 700v100h100v-100h-100z" />
+<glyph unicode="&#xe047;" d="M53 0h365v66q-41 0 -72 11t-49 38t1 71l92 234h391l82 -222q16 -45 -5.5 -88.5t-74.5 -43.5v-66h417v66q-34 1 -74 43q-18 19 -33 42t-21 37l-6 13l-385 998h-93l-399 -1006q-24 -48 -52 -75q-12 -12 -33 -25t-36 -20l-15 -7v-66zM416 521l178 457l46 -140l116 -317h-340 z" />
+<glyph unicode="&#xe048;" d="M100 0v89q41 7 70.5 32.5t29.5 65.5v827q0 28 -1 39.5t-5.5 26t-15.5 21t-29 14t-49 14.5v70h471q120 0 213 -88t93 -228q0 -55 -11.5 -101.5t-28 -74t-33.5 -47.5t-28 -28l-12 -7q8 -3 21.5 -9t48 -31.5t60.5 -58t47.5 -91.5t21.5 -129q0 -84 -59 -156.5t-142 -111 t-162 -38.5h-500zM400 200h161q89 0 153 48.5t64 132.5q0 90 -62.5 154.5t-156.5 64.5h-159v-400zM400 700h139q76 0 130 61.5t54 138.5q0 82 -84 130.5t-239 48.5v-379z" />
+<glyph unicode="&#xe049;" d="M200 0v57q77 7 134.5 40.5t65.5 80.5l173 849q10 56 -10 74t-91 37q-6 1 -10.5 2.5t-9.5 2.5v57h425l2 -57q-33 -8 -62 -25.5t-46 -37t-29.5 -38t-17.5 -30.5l-5 -12l-128 -825q-10 -52 14 -82t95 -36v-57h-500z" />
+<glyph unicode="&#xe050;" d="M-75 200h75v800h-75l125 167l125 -167h-75v-800h75l-125 -167zM300 900v300h150h700h150v-300h-50q0 29 -8 48.5t-18.5 30t-33.5 15t-39.5 5.5t-50.5 1h-200v-850l100 -50v-100h-400v100l100 50v850h-200q-34 0 -50.5 -1t-40 -5.5t-33.5 -15t-18.5 -30t-8.5 -48.5h-49z " />
+<glyph unicode="&#xe051;" d="M33 51l167 125v-75h800v75l167 -125l-167 -125v75h-800v-75zM100 901v300h150h700h150v-300h-50q0 29 -8 48.5t-18 30t-33.5 15t-40 5.5t-50.5 1h-200v-650l100 -50v-100h-400v100l100 50v650h-200q-34 0 -50.5 -1t-39.5 -5.5t-33.5 -15t-18.5 -30t-8 -48.5h-50z" />
+<glyph unicode="&#xe052;" d="M0 50q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 350q0 -20 14.5 -35t35.5 -15h800q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-800q-21 0 -35.5 -14.5t-14.5 -35.5 v-100zM0 650q0 -20 14.5 -35t35.5 -15h1000q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1000q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 950q0 -20 14.5 -35t35.5 -15h600q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-600q-21 0 -35.5 -14.5 t-14.5 -35.5v-100z" />
+<glyph unicode="&#xe053;" d="M0 50q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 650q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5 v-100zM200 350q0 -20 14.5 -35t35.5 -15h700q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-700q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM200 950q0 -20 14.5 -35t35.5 -15h700q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-700q-21 0 -35.5 -14.5 t-14.5 -35.5v-100z" />
+<glyph unicode="&#xe054;" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM100 650v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1000q-21 0 -35.5 15 t-14.5 35zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM500 950v100q0 21 14.5 35.5t35.5 14.5h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-600 q-21 0 -35.5 15t-14.5 35z" />
+<glyph unicode="&#xe055;" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM0 350v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15 t-14.5 35zM0 650v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM0 950v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100 q-21 0 -35.5 15t-14.5 35z" />
+<glyph unicode="&#xe056;" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35zM0 350v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15 t-14.5 35zM0 650v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35zM0 950v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15 t-14.5 35zM300 50v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800 q-21 0 -35.5 15t-14.5 35zM300 650v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM300 950v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15 h-800q-21 0 -35.5 15t-14.5 35z" />
+<glyph unicode="&#xe057;" d="M-101 500v100h201v75l166 -125l-166 -125v75h-201zM300 0h100v1100h-100v-1100zM500 50q0 -20 14.5 -35t35.5 -15h600q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-600q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 350q0 -20 14.5 -35t35.5 -15h300q20 0 35 15t15 35 v100q0 21 -15 35.5t-35 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 650q0 -20 14.5 -35t35.5 -15h500q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 950q0 -20 14.5 -35t35.5 -15h100q20 0 35 15t15 35v100 q0 21 -15 35.5t-35 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-100z" />
+<glyph unicode="&#xe058;" d="M1 50q0 -20 14.5 -35t35.5 -15h600q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-600q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 350q0 -20 14.5 -35t35.5 -15h300q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 650 q0 -20 14.5 -35t35.5 -15h500q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 950q0 -20 14.5 -35t35.5 -15h100q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM801 0v1100h100v-1100 h-100zM934 550l167 -125v75h200v100h-200v75z" />
+<glyph unicode="&#xe059;" d="M0 275v650q0 31 22 53t53 22h750q31 0 53 -22t22 -53v-650q0 -31 -22 -53t-53 -22h-750q-31 0 -53 22t-22 53zM900 600l300 300v-600z" />
+<glyph unicode="&#xe060;" d="M0 44v1012q0 18 13 31t31 13h1112q19 0 31.5 -13t12.5 -31v-1012q0 -18 -12.5 -31t-31.5 -13h-1112q-18 0 -31 13t-13 31zM100 263l247 182l298 -131l-74 156l293 318l236 -288v500h-1000v-737zM208 750q0 56 39 95t95 39t95 -39t39 -95t-39 -95t-95 -39t-95 39t-39 95z " />
+<glyph unicode="&#xe062;" d="M148 745q0 124 60.5 231.5t165 172t226.5 64.5q123 0 227 -63t164.5 -169.5t60.5 -229.5t-73 -272q-73 -114 -166.5 -237t-150.5 -189l-57 -66q-10 9 -27 26t-66.5 70.5t-96 109t-104 135.5t-100.5 155q-63 139 -63 262zM342 772q0 -107 75.5 -182.5t181.5 -75.5 q107 0 182.5 75.5t75.5 182.5t-75.5 182t-182.5 75t-182 -75.5t-75 -181.5z" />
+<glyph unicode="&#xe063;" d="M1 600q0 122 47.5 233t127.5 191t191 127.5t233 47.5t233 -47.5t191 -127.5t127.5 -191t47.5 -233t-47.5 -233t-127.5 -191t-191 -127.5t-233 -47.5t-233 47.5t-191 127.5t-127.5 191t-47.5 233zM173 600q0 -177 125.5 -302t301.5 -125v854q-176 0 -301.5 -125 t-125.5 -302z" />
+<glyph unicode="&#xe064;" d="M117 406q0 94 34 186t88.5 172.5t112 159t115 177t87.5 194.5q21 -71 57.5 -142.5t76 -130.5t83 -118.5t82 -117t70 -116t50 -125.5t18.5 -136q0 -89 -39 -165.5t-102 -126.5t-140 -79.5t-156 -33.5q-114 6 -211.5 53t-161.5 138.5t-64 210.5zM243 414q14 -82 59.5 -136 t136.5 -80l16 98q-7 6 -18 17t-34 48t-33 77q-15 73 -14 143.5t10 122.5l9 51q-92 -110 -119.5 -185t-12.5 -156z" />
+<glyph unicode="&#xe065;" d="M0 400v300q0 165 117.5 282.5t282.5 117.5q366 -6 397 -14l-186 -186h-311q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v125l200 200v-225q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5 t-117.5 282.5zM436 341l161 50l412 412l-114 113l-405 -405zM995 1015l113 -113l113 113l-21 85l-92 28z" />
+<glyph unicode="&#xe066;" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h261l2 -80q-133 -32 -218 -120h-145q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5l200 153v-53q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5 zM423 524q30 38 81.5 64t103 35.5t99 14t77.5 3.5l29 -1v-209l360 324l-359 318v-216q-7 0 -19 -1t-48 -8t-69.5 -18.5t-76.5 -37t-76.5 -59t-62 -88t-39.5 -121.5z" />
+<glyph unicode="&#xe067;" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q60 0 127 -23l-178 -177h-349q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v69l200 200v-169q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5 t-117.5 282.5zM342 632l283 -284l566 567l-136 137l-430 -431l-147 147z" />
+<glyph unicode="&#xe068;" d="M0 603l300 296v-198h200v200h-200l300 300l295 -300h-195v-200h200v198l300 -296l-300 -300v198h-200v-200h195l-295 -300l-300 300h200v200h-200v-198z" />
+<glyph unicode="&#xe069;" d="M200 50v1000q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-437l500 487v-1100l-500 488v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5z" />
+<glyph unicode="&#xe070;" d="M0 50v1000q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-437l500 487v-487l500 487v-1100l-500 488v-488l-500 488v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5z" />
+<glyph unicode="&#xe071;" d="M136 550l564 550v-487l500 487v-1100l-500 488v-488z" />
+<glyph unicode="&#xe072;" d="M200 0l900 550l-900 550v-1100z" />
+<glyph unicode="&#xe073;" d="M200 150q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v800q0 21 -14.5 35.5t-35.5 14.5h-200q-21 0 -35.5 -14.5t-14.5 -35.5v-800zM600 150q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v800q0 21 -14.5 35.5t-35.5 14.5h-200 q-21 0 -35.5 -14.5t-14.5 -35.5v-800z" />
+<glyph unicode="&#xe074;" d="M200 150q0 -20 14.5 -35t35.5 -15h800q21 0 35.5 15t14.5 35v800q0 21 -14.5 35.5t-35.5 14.5h-800q-21 0 -35.5 -14.5t-14.5 -35.5v-800z" />
+<glyph unicode="&#xe075;" d="M0 0v1100l500 -487v487l564 -550l-564 -550v488z" />
+<glyph unicode="&#xe076;" d="M0 0v1100l500 -487v487l500 -487v437q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438l-500 -488v488z" />
+<glyph unicode="&#xe077;" d="M300 0v1100l500 -487v437q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438z" />
+<glyph unicode="&#xe078;" d="M100 250v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5zM100 500h1100l-550 564z" />
+<glyph unicode="&#xe079;" d="M185 599l592 -592l240 240l-353 353l353 353l-240 240z" />
+<glyph unicode="&#xe080;" d="M272 194l353 353l-353 353l241 240l572 -571l21 -22l-1 -1v-1l-592 -591z" />
+<glyph unicode="&#xe081;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -300t-217.5 -218t-299.5 -80t-299.5 80t-217.5 218t-80 300zM300 500h200v-200h200v200h200v200h-200v200h-200v-200h-200v-200z" />
+<glyph unicode="&#xe082;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -300t-217.5 -218t-299.5 -80t-299.5 80t-217.5 218t-80 300zM300 500h600v200h-600v-200z" />
+<glyph unicode="&#xe083;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -300t-217.5 -218t-299.5 -80t-299.5 80t-217.5 218t-80 300zM246 459l213 -213l141 142l141 -142l213 213l-142 141l142 141l-213 212l-141 -141l-141 142l-212 -213l141 -141z" />
+<glyph unicode="&#xe084;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM270 551l276 -277l411 411l-175 174l-236 -236l-102 102z" />
+<glyph unicode="&#xe085;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -300t-217.5 -218t-299.5 -80t-299.5 80t-217.5 218t-80 300zM363 700h144q4 0 11.5 -1t11 -1t6.5 3t3 9t1 11t3.5 8.5t3.5 6t5.5 4t6.5 2.5t9 1.5t9 0.5h11.5h12.5q19 0 30 -10t11 -26 q0 -22 -4 -28t-27 -22q-5 -1 -12.5 -3t-27 -13.5t-34 -27t-26.5 -46t-11 -68.5h200q5 3 14 8t31.5 25.5t39.5 45.5t31 69t14 94q0 51 -17.5 89t-42 58t-58.5 32t-58.5 15t-51.5 3q-105 0 -172 -56t-67 -183zM500 300h200v100h-200v-100z" />
+<glyph unicode="&#xe086;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -300t-217.5 -218t-299.5 -80t-299.5 80t-217.5 218t-80 300zM400 300h400v100h-100v300h-300v-100h100v-200h-100v-100zM500 800h200v100h-200v-100z" />
+<glyph unicode="&#xe087;" d="M0 500v200h194q15 60 36 104.5t55.5 86t88 69t126.5 40.5v200h200v-200q54 -20 113 -60t112.5 -105.5t71.5 -134.5h203v-200h-203q-25 -102 -116.5 -186t-180.5 -117v-197h-200v197q-140 27 -208 102.5t-98 200.5h-194zM290 500q24 -73 79.5 -127.5t130.5 -78.5v206h200 v-206q149 48 201 206h-201v200h200q-25 74 -76 127.5t-124 76.5v-204h-200v203q-75 -24 -130 -77.5t-79 -125.5h209v-200h-210z" />
+<glyph unicode="&#xe088;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM356 465l135 135 l-135 135l109 109l135 -135l135 135l109 -109l-135 -135l135 -135l-109 -109l-135 135l-135 -135z" />
+<glyph unicode="&#xe089;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM322 537l141 141 l87 -87l204 205l142 -142l-346 -345z" />
+<glyph unicode="&#xe090;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -115 62 -215l568 567q-100 62 -216 62q-171 0 -292.5 -121.5t-121.5 -292.5zM391 245q97 -59 209 -59q171 0 292.5 121.5t121.5 292.5 q0 112 -59 209z" />
+<glyph unicode="&#xe091;" d="M0 547l600 453v-300h600v-300h-600v-301z" />
+<glyph unicode="&#xe092;" d="M0 400v300h600v300l600 -453l-600 -448v301h-600z" />
+<glyph unicode="&#xe093;" d="M204 600l450 600l444 -600h-298v-600h-300v600h-296z" />
+<glyph unicode="&#xe094;" d="M104 600h296v600h300v-600h298l-449 -600z" />
+<glyph unicode="&#xe095;" d="M0 200q6 132 41 238.5t103.5 193t184 138t271.5 59.5v271l600 -453l-600 -448v301q-95 -2 -183 -20t-170 -52t-147 -92.5t-100 -135.5z" />
+<glyph unicode="&#xe096;" d="M0 0v400l129 -129l294 294l142 -142l-294 -294l129 -129h-400zM635 777l142 -142l294 294l129 -129v400h-400l129 -129z" />
+<glyph unicode="&#xe097;" d="M34 176l295 295l-129 129h400v-400l-129 130l-295 -295zM600 600v400l129 -129l295 295l142 -141l-295 -295l129 -130h-400z" />
+<glyph unicode="&#xe101;" d="M23 600q0 118 45.5 224.5t123 184t184 123t224.5 45.5t224.5 -45.5t184 -123t123 -184t45.5 -224.5t-45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123t-123 184t-45.5 224.5zM456 851l58 -302q4 -20 21.5 -34.5t37.5 -14.5h54q20 0 37.5 14.5 t21.5 34.5l58 302q4 20 -8 34.5t-33 14.5h-207q-20 0 -32 -14.5t-8 -34.5zM500 300h200v100h-200v-100z" />
+<glyph unicode="&#xe102;" d="M0 800h100v-200h400v300h200v-300h400v200h100v100h-111v6t-1 15t-3 18l-34 172q-11 39 -41.5 63t-69.5 24q-32 0 -61 -17l-239 -144q-22 -13 -40 -35q-19 24 -40 36l-238 144q-33 18 -62 18q-39 0 -69.5 -23t-40.5 -61l-35 -177q-2 -8 -3 -18t-1 -15v-6h-111v-100z M100 0h400v400h-400v-400zM200 900q-3 0 14 48t35 96l18 47l214 -191h-281zM700 0v400h400v-400h-400zM731 900l202 197q5 -12 12 -32.5t23 -64t25 -72t7 -28.5h-269z" />
+<glyph unicode="&#xe103;" d="M0 -22v143l216 193q-9 53 -13 83t-5.5 94t9 113t38.5 114t74 124q47 60 99.5 102.5t103 68t127.5 48t145.5 37.5t184.5 43.5t220 58.5q0 -189 -22 -343t-59 -258t-89 -181.5t-108.5 -120t-122 -68t-125.5 -30t-121.5 -1.5t-107.5 12.5t-87.5 17t-56.5 7.5l-99 -55z M238.5 300.5q19.5 -6.5 86.5 76.5q55 66 367 234q70 38 118.5 69.5t102 79t99 111.5t86.5 148q22 50 24 60t-6 19q-7 5 -17 5t-26.5 -14.5t-33.5 -39.5q-35 -51 -113.5 -108.5t-139.5 -89.5l-61 -32q-369 -197 -458 -401q-48 -111 -28.5 -117.5z" />
+<glyph unicode="&#xe104;" d="M111 408q0 -33 5 -63q9 -56 44 -119.5t105 -108.5q31 -21 64 -16t62 23.5t57 49.5t48 61.5t35 60.5q32 66 39 184.5t-13 157.5q79 -80 122 -164t26 -184q-5 -33 -20.5 -69.5t-37.5 -80.5q-10 -19 -14.5 -29t-12 -26t-9 -23.5t-3 -19t2.5 -15.5t11 -9.5t19.5 -5t30.5 2.5 t42 8q57 20 91 34t87.5 44.5t87 64t65.5 88.5t47 122q38 172 -44.5 341.5t-246.5 278.5q22 -44 43 -129q39 -159 -32 -154q-15 2 -33 9q-79 33 -120.5 100t-44 175.5t48.5 257.5q-13 -8 -34 -23.5t-72.5 -66.5t-88.5 -105.5t-60 -138t-8 -166.5q2 -12 8 -41.5t8 -43t6 -39.5 t3.5 -39.5t-1 -33.5t-6 -31.5t-13.5 -24t-21 -20.5t-31 -12q-38 -10 -67 13t-40.5 61.5t-15 81.5t10.5 75q-52 -46 -83.5 -101t-39 -107t-7.5 -85z" />
+<glyph unicode="&#xe105;" d="M-61 600l26 40q6 10 20 30t49 63.5t74.5 85.5t97 90t116.5 83.5t132.5 59t145.5 23.5t145.5 -23.5t132.5 -59t116.5 -83.5t97 -90t74.5 -85.5t49 -63.5t20 -30l26 -40l-26 -40q-6 -10 -20 -30t-49 -63.5t-74.5 -85.5t-97 -90t-116.5 -83.5t-132.5 -59t-145.5 -23.5 t-145.5 23.5t-132.5 59t-116.5 83.5t-97 90t-74.5 85.5t-49 63.5t-20 30zM120 600q7 -10 40.5 -58t56 -78.5t68 -77.5t87.5 -75t103 -49.5t125 -21.5t123.5 20t100.5 45.5t85.5 71.5t66.5 75.5t58 81.5t47 66q-1 1 -28.5 37.5t-42 55t-43.5 53t-57.5 63.5t-58.5 54 q49 -74 49 -163q0 -124 -88 -212t-212 -88t-212 88t-88 212q0 85 46 158q-102 -87 -226 -258zM377 656q49 -124 154 -191l105 105q-37 24 -75 72t-57 84l-20 36z" />
+<glyph unicode="&#xe106;" d="M-61 600l26 40q6 10 20 30t49 63.5t74.5 85.5t97 90t116.5 83.5t132.5 59t145.5 23.5q61 0 121 -17l37 142h148l-314 -1200h-148l37 143q-82 21 -165 71.5t-140 102t-109.5 112t-72 88.5t-29.5 43zM120 600q210 -282 393 -336l37 141q-107 18 -178.5 101.5t-71.5 193.5 q0 85 46 158q-102 -87 -226 -258zM377 656q49 -124 154 -191l47 47l23 87q-30 28 -59 69t-44 68l-14 26zM780 161l38 145q22 15 44.5 34t46 44t40.5 44t41 50.5t33.5 43.5t33 44t24.5 34q-97 127 -140 175l39 146q67 -54 131.5 -125.5t87.5 -103.5t36 -52l26 -40l-26 -40 q-7 -12 -25.5 -38t-63.5 -79.5t-95.5 -102.5t-124 -100t-146.5 -79z" />
+<glyph unicode="&#xe107;" d="M-97.5 34q13.5 -34 50.5 -34h1294q37 0 50.5 35.5t-7.5 67.5l-642 1056q-20 33 -48 36t-48 -29l-642 -1066q-21 -32 -7.5 -66zM155 200l445 723l445 -723h-345v100h-200v-100h-345zM500 600l100 -300l100 300v100h-200v-100z" />
+<glyph unicode="&#xe108;" d="M100 262v41q0 20 11 44.5t26 38.5l363 325v339q0 62 44 106t106 44t106 -44t44 -106v-339l363 -325q15 -14 26 -38.5t11 -44.5v-41q0 -20 -12 -26.5t-29 5.5l-359 249v-263q100 -91 100 -113v-64q0 -21 -13 -29t-32 1l-94 78h-222l-94 -78q-19 -9 -32 -1t-13 29v64 q0 22 100 113v263l-359 -249q-17 -12 -29 -5.5t-12 26.5z" />
+<glyph unicode="&#xe109;" d="M0 50q0 -20 14.5 -35t35.5 -15h1000q21 0 35.5 15t14.5 35v750h-1100v-750zM0 900h1100v150q0 21 -14.5 35.5t-35.5 14.5h-150v100h-100v-100h-500v100h-100v-100h-150q-21 0 -35.5 -14.5t-14.5 -35.5v-150zM100 100v100h100v-100h-100zM100 300v100h100v-100h-100z M100 500v100h100v-100h-100zM300 100v100h100v-100h-100zM300 300v100h100v-100h-100zM300 500v100h100v-100h-100zM500 100v100h100v-100h-100zM500 300v100h100v-100h-100zM500 500v100h100v-100h-100zM700 100v100h100v-100h-100zM700 300v100h100v-100h-100zM700 500 v100h100v-100h-100zM900 100v100h100v-100h-100zM900 300v100h100v-100h-100zM900 500v100h100v-100h-100z" />
+<glyph unicode="&#xe110;" d="M0 200v200h259l600 600h241v198l300 -295l-300 -300v197h-159l-600 -600h-341zM0 800h259l122 -122l141 142l-181 180h-341v-200zM678 381l141 142l122 -123h159v198l300 -295l-300 -300v197h-241z" />
+<glyph unicode="&#xe111;" d="M0 400v600q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-596l-304 -300v300h-100q-41 0 -70.5 29.5t-29.5 70.5z" />
+<glyph unicode="&#xe112;" d="M100 600v200h300v-250q0 -113 6 -145q17 -92 102 -117q39 -11 92 -11q37 0 66.5 5.5t50 15.5t36 24t24 31.5t14 37.5t7 42t2.5 45t0 47v25v250h300v-200q0 -42 -3 -83t-15 -104t-31.5 -116t-58 -109.5t-89 -96.5t-129 -65.5t-174.5 -25.5t-174.5 25.5t-129 65.5t-89 96.5 t-58 109.5t-31.5 116t-15 104t-3 83zM100 900v300h300v-300h-300zM800 900v300h300v-300h-300z" />
+<glyph unicode="&#xe113;" d="M-30 411l227 -227l352 353l353 -353l226 227l-578 579z" />
+<glyph unicode="&#xe114;" d="M70 797l580 -579l578 579l-226 227l-353 -353l-352 353z" />
+<glyph unicode="&#xe115;" d="M-198 700l299 283l300 -283h-203v-400h385l215 -200h-800v600h-196zM402 1000l215 -200h381v-400h-198l299 -283l299 283h-200v600h-796z" />
+<glyph unicode="&#xe116;" d="M18 939q-5 24 10 42q14 19 39 19h896l38 162q5 17 18.5 27.5t30.5 10.5h94q20 0 35 -14.5t15 -35.5t-15 -35.5t-35 -14.5h-54l-201 -961q-2 -4 -6 -10.5t-19 -17.5t-33 -11h-31v-50q0 -20 -14.5 -35t-35.5 -15t-35.5 15t-14.5 35v50h-300v-50q0 -20 -14.5 -35t-35.5 -15 t-35.5 15t-14.5 35v50h-50q-21 0 -35.5 15t-14.5 35q0 21 14.5 35.5t35.5 14.5h535l48 200h-633q-32 0 -54.5 21t-27.5 43z" />
+<glyph unicode="&#xe117;" d="M0 0v800h1200v-800h-1200zM0 900v100h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500v-100h-1200z" />
+<glyph unicode="&#xe118;" d="M1 0l300 700h1200l-300 -700h-1200zM1 400v600h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500v-200h-1000z" />
+<glyph unicode="&#xe119;" d="M302 300h198v600h-198l298 300l298 -300h-198v-600h198l-298 -300z" />
+<glyph unicode="&#xe120;" d="M0 600l300 298v-198h600v198l300 -298l-300 -297v197h-600v-197z" />
+<glyph unicode="&#xe121;" d="M0 100v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM31 400l172 739q5 22 23 41.5t38 19.5h672q19 0 37.5 -22.5t23.5 -45.5l172 -732h-1138zM800 100h100v100h-100v-100z M1000 100h100v100h-100v-100z" />
+<glyph unicode="&#xe122;" d="M-101 600v50q0 24 25 49t50 38l25 13v-250l-11 5.5t-24 14t-30 21.5t-24 27.5t-11 31.5zM99 500v250v5q0 13 0.5 18.5t2.5 13t8 10.5t15 3h200l675 250v-850l-675 200h-38l47 -276q2 -12 -3 -17.5t-11 -6t-21 -0.5h-8h-83q-20 0 -34.5 14t-18.5 35q-56 337 -56 351z M1100 200v850q0 21 14.5 35.5t35.5 14.5q20 0 35 -14.5t15 -35.5v-850q0 -20 -15 -35t-35 -15q-21 0 -35.5 15t-14.5 35z" />
+<glyph unicode="&#xe123;" d="M74 350q0 21 13.5 35.5t33.5 14.5h17l118 173l63 327q15 77 76 140t144 83l-18 32q-6 19 3 32t29 13h94q20 0 29 -10.5t3 -29.5l-18 -37q83 -19 144 -82.5t76 -140.5l63 -327l118 -173h17q20 0 33.5 -14.5t13.5 -35.5q0 -20 -13 -40t-31 -27q-22 -9 -63 -23t-167.5 -37 t-251.5 -23t-245.5 20.5t-178.5 41.5l-58 20q-18 7 -31 27.5t-13 40.5zM497 110q12 -49 40 -79.5t63 -30.5t63 30.5t39 79.5q-48 -6 -102 -6t-103 6z" />
+<glyph unicode="&#xe124;" d="M21 445l233 -45l-78 -224l224 78l45 -233l155 179l155 -179l45 233l224 -78l-78 224l234 45l-180 155l180 156l-234 44l78 225l-224 -78l-45 233l-155 -180l-155 180l-45 -233l-224 78l78 -225l-233 -44l179 -156z" />
+<glyph unicode="&#xe125;" d="M0 200h200v600h-200v-600zM300 275q0 -75 100 -75h61q123 -100 139 -100h250q46 0 83 57l238 344q29 31 29 74v100q0 44 -30.5 84.5t-69.5 40.5h-328q28 118 28 125v150q0 44 -30.5 84.5t-69.5 40.5h-50q-27 0 -51 -20t-38 -48l-96 -198l-145 -196q-20 -26 -20 -63v-400z M400 300v375l150 212l100 213h50v-175l-50 -225h450v-125l-250 -375h-214l-136 100h-100z" />
+<glyph unicode="&#xe126;" d="M0 400v600h200v-600h-200zM300 525v400q0 75 100 75h61q123 100 139 100h250q46 0 83 -57l238 -344q29 -31 29 -74v-100q0 -44 -30.5 -84.5t-69.5 -40.5h-328q28 -118 28 -125v-150q0 -44 -30.5 -84.5t-69.5 -40.5h-50q-27 0 -51 20t-38 48l-96 198l-145 196 q-20 26 -20 63zM400 525l150 -212l100 -213h50v175l-50 225h450v125l-250 375h-214l-136 -100h-100v-375z" />
+<glyph unicode="&#xe127;" d="M8 200v600h200v-600h-200zM308 275v525q0 17 14 35.5t28 28.5l14 9l362 230q14 6 25 6q17 0 29 -12l109 -112q14 -14 14 -34q0 -18 -11 -32l-85 -121h302q85 0 138.5 -38t53.5 -110t-54.5 -111t-138.5 -39h-107l-130 -339q-7 -22 -20.5 -41.5t-28.5 -19.5h-341 q-7 0 -90 81t-83 94zM408 289l100 -89h293l131 339q6 21 19.5 41t28.5 20h203q16 0 25 15t9 36q0 20 -9 34.5t-25 14.5h-457h-6.5h-7.5t-6.5 0.5t-6 1t-5 1.5t-5.5 2.5t-4 4t-4 5.5q-5 12 -5 20q0 14 10 27l147 183l-86 83l-339 -236v-503z" />
+<glyph unicode="&#xe128;" d="M-101 651q0 72 54 110t139 37h302l-85 121q-11 16 -11 32q0 21 14 34l109 113q13 12 29 12q11 0 25 -6l365 -230q7 -4 16.5 -10.5t26 -26t16.5 -36.5v-526q0 -13 -85.5 -93.5t-93.5 -80.5h-342q-15 0 -28.5 20t-19.5 41l-131 339h-106q-84 0 -139 39t-55 111zM-1 601h222 q15 0 28.5 -20.5t19.5 -40.5l131 -339h293l106 89v502l-342 237l-87 -83l145 -184q10 -11 10 -26q0 -11 -5 -20q-1 -3 -3.5 -5.5l-4 -4t-5 -2.5t-5.5 -1.5t-6.5 -1t-6.5 -0.5h-7.5h-6.5h-476v-100zM999 201v600h200v-600h-200z" />
+<glyph unicode="&#xe129;" d="M97 719l230 -363q4 -6 10.5 -15.5t26 -25t36.5 -15.5h525q13 0 94 83t81 90v342q0 15 -20 28.5t-41 19.5l-339 131v106q0 84 -39 139t-111 55t-110 -53.5t-38 -138.5v-302l-121 84q-15 12 -33.5 11.5t-32.5 -13.5l-112 -110q-22 -22 -6 -53zM172 739l83 86l183 -146 q22 -18 47 -5q3 1 5.5 3.5l4 4t2.5 5t1.5 5.5t1 6.5t0.5 6v7.5v7v456q0 22 25 31t50 -0.5t25 -30.5v-202q0 -16 20 -29.5t41 -19.5l339 -130v-294l-89 -100h-503zM400 0v200h600v-200h-600z" />
+<glyph unicode="&#xe130;" d="M1 585q-15 -31 7 -53l112 -110q13 -13 32 -13.5t34 10.5l121 85l-1 -302q0 -84 38.5 -138t110.5 -54t111 55t39 139v106l339 131q20 6 40.5 19.5t20.5 28.5v342q0 7 -81 90t-94 83h-525q-17 0 -35.5 -14t-28.5 -28l-10 -15zM76 565l237 339h503l89 -100v-294l-340 -130 q-20 -6 -40 -20t-20 -29v-202q0 -22 -25 -31t-50 0t-25 31v456v14.5t-1.5 11.5t-5 12t-9.5 7q-24 13 -46 -5l-184 -146zM305 1104v200h600v-200h-600z" />
+<glyph unicode="&#xe131;" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM300 500h300l-2 -194l402 294l-402 298v-197h-298v-201z" />
+<glyph unicode="&#xe132;" d="M0 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t231.5 47.5q122 0 232.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-218 -217.5t-300 -80t-299.5 80t-217.5 217.5t-80 299.5zM200 600l400 -294v194h302v201h-300v197z" />
+<glyph unicode="&#xe133;" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q121 0 231.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM300 600h200v-300h200v300h200l-300 400z" />
+<glyph unicode="&#xe134;" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q121 0 231.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM300 600l300 -400l300 400h-200v300h-200v-300h-200z" />
+<glyph unicode="&#xe135;" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q121 0 231.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM254 780q-8 -34 5.5 -93t7.5 -87q0 -9 17 -44t16 -60q12 0 23 -5.5 t23 -15t20 -13.5q20 -10 108 -42q22 -8 53 -31.5t59.5 -38.5t57.5 -11q8 -18 -15 -55.5t-20 -57.5q12 -21 22.5 -34.5t28 -27t36.5 -17.5q0 -6 -3 -15.5t-3.5 -14.5t4.5 -17q101 -2 221 111q31 30 47 48t34 49t21 62q-14 9 -37.5 9.5t-35.5 7.5q-14 7 -49 15t-52 19 q-9 0 -39.5 -0.5t-46.5 -1.5t-39 -6.5t-39 -16.5q-50 -35 -66 -12q-4 2 -3.5 25.5t0.5 25.5q-6 13 -26.5 17t-24.5 7q2 22 -2 41t-16.5 28t-38.5 -20q-23 -25 -42 4q-19 28 -8 58q8 16 22 22q6 -1 26 -1.5t33.5 -4.5t19.5 -13q12 -19 32 -37.5t34 -27.5l14 -8q0 3 9.5 39.5 t5.5 57.5q-4 23 14.5 44.5t22.5 31.5q5 14 10 35t8.5 31t15.5 22.5t34 21.5q-6 18 10 37q8 0 23.5 -1.5t24.5 -1.5t20.5 4.5t20.5 15.5q-10 23 -30.5 42.5t-38 30t-49 26.5t-43.5 23q11 41 1 44q31 -13 58.5 -14.5t39.5 3.5l11 4q6 36 -17 53.5t-64 28.5t-56 23 q-19 -3 -37 0q-15 -12 -36.5 -21t-34.5 -12t-44 -8t-39 -6q-15 -3 -46 0t-45 -3q-20 -6 -51.5 -25.5t-34.5 -34.5q-3 -11 6.5 -22.5t8.5 -18.5q-3 -34 -27.5 -91t-29.5 -79zM518 915q3 12 16 30.5t16 25.5q10 -10 18.5 -10t14 6t14.5 14.5t16 12.5q0 -18 8 -42.5t16.5 -44 t9.5 -23.5q-6 1 -39 5t-53.5 10t-36.5 16z" />
+<glyph unicode="&#xe136;" d="M0 164.5q0 21.5 15 37.5l600 599q-33 101 6 201.5t135 154.5q164 92 306 -9l-259 -138l145 -232l251 126q13 -175 -151 -267q-123 -70 -253 -23l-596 -596q-15 -16 -36.5 -16t-36.5 16l-111 110q-15 15 -15 36.5z" />
+<glyph unicode="&#xe137;" horiz-adv-x="1220" d="M0 196v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM0 596v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5zM0 996v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM600 596h500v100h-500v-100zM800 196h300v100h-300v-100zM900 996h200v100h-200v-100z" />
+<glyph unicode="&#xe138;" d="M100 1100v100h1000v-100h-1000zM150 1000h900l-350 -500v-300l-200 -200v500z" />
+<glyph unicode="&#xe139;" d="M0 200v200h1200v-200q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM0 500v400q0 41 29.5 70.5t70.5 29.5h300v100q0 41 29.5 70.5t70.5 29.5h200q41 0 70.5 -29.5t29.5 -70.5v-100h300q41 0 70.5 -29.5t29.5 -70.5v-400h-500v100h-200v-100h-500z M500 1000h200v100h-200v-100z" />
+<glyph unicode="&#xe140;" d="M0 0v400l129 -129l200 200l142 -142l-200 -200l129 -129h-400zM0 800l129 129l200 -200l142 142l-200 200l129 129h-400v-400zM729 329l142 142l200 -200l129 129v-400h-400l129 129zM729 871l200 200l-129 129h400v-400l-129 129l-200 -200z" />
+<glyph unicode="&#xe141;" d="M0 596q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM182 596q0 -172 121.5 -293t292.5 -121t292.5 121t121.5 293q0 171 -121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM291 655 q0 23 15.5 38.5t38.5 15.5t39 -16t16 -38q0 -23 -16 -39t-39 -16q-22 0 -38 16t-16 39zM400 850q0 22 16 38.5t39 16.5q22 0 38 -16t16 -39t-16 -39t-38 -16q-23 0 -39 16.5t-16 38.5zM513 609q0 32 21 56.5t52 29.5l122 126l1 1q-9 14 -9 28q0 22 16 38.5t39 16.5 q22 0 38 -16t16 -39t-16 -39t-38 -16q-16 0 -29 10l-55 -145q17 -22 17 -51q0 -36 -25.5 -61.5t-61.5 -25.5q-37 0 -62.5 25.5t-25.5 61.5zM800 655q0 22 16 38t39 16t38.5 -15.5t15.5 -38.5t-16 -39t-38 -16q-23 0 -39 16t-16 39z" />
+<glyph unicode="&#xe142;" d="M-40 375q-13 -95 35 -173q35 -57 94 -89t129 -32q63 0 119 28q33 16 65 40.5t52.5 45.5t59.5 64q40 44 57 61l394 394q35 35 47 84t-3 96q-27 87 -117 104q-20 2 -29 2q-46 0 -79.5 -17t-67.5 -51l-388 -396l-7 -7l69 -67l377 373q20 22 39 38q23 23 50 23q38 0 53 -36 q16 -39 -20 -75l-547 -547q-52 -52 -125 -52q-55 0 -100 33t-54 96q-5 35 2.5 66t31.5 63t42 50t56 54q24 21 44 41l348 348q52 52 82.5 79.5t84 54t107.5 26.5q25 0 48 -4q95 -17 154 -94.5t51 -175.5q-7 -101 -98 -192l-252 -249l-253 -256l7 -7l69 -60l517 511 q67 67 95 157t11 183q-16 87 -67 154t-130 103q-69 33 -152 33q-107 0 -197 -55q-40 -24 -111 -95l-512 -512q-68 -68 -81 -163z" />
+<glyph unicode="&#xe143;" d="M79 784q0 131 99 229.5t230 98.5q144 0 242 -129q103 129 245 129q130 0 227 -98.5t97 -229.5q0 -46 -17.5 -91t-61 -99t-77 -89.5t-104.5 -105.5q-197 -191 -293 -322l-17 -23l-16 23q-43 58 -100 122.5t-92 99.5t-101 100l-84.5 84.5t-68 74t-60 78t-33.5 70.5t-15 78z M250 784q0 -27 30.5 -70t61.5 -75.5t95 -94.5l22 -22q93 -90 190 -201q82 92 195 203l12 12q64 62 97.5 97t64.5 79t31 72q0 71 -48 119.5t-106 48.5q-73 0 -131 -83l-118 -171l-114 174q-51 80 -124 80q-59 0 -108.5 -49.5t-49.5 -118.5z" />
+<glyph unicode="&#xe144;" d="M57 353q0 -94 66 -160l141 -141q66 -66 159 -66q95 0 159 66l283 283q66 66 66 159t-66 159l-141 141q-12 12 -19 17l-105 -105l212 -212l-389 -389l-247 248l95 95l-18 18q-46 45 -75 101l-55 -55q-66 -66 -66 -159zM269 706q0 -93 66 -159l141 -141l19 -17l105 105 l-212 212l389 389l247 -247l-95 -96l18 -18q46 -46 77 -99l29 29q35 35 62.5 88t27.5 96q0 93 -66 159l-141 141q-66 66 -159 66q-95 0 -159 -66l-283 -283q-66 -64 -66 -159z" />
+<glyph unicode="&#xe145;" d="M200 100v953q0 21 30 46t81 48t129 38t163 15t162 -15t127 -38t79 -48t29 -46v-953q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-41 0 -70.5 29.5t-29.5 70.5zM300 300h600v700h-600v-700zM496 150q0 -43 30.5 -73.5t73.5 -30.5t73.5 30.5t30.5 73.5t-30.5 73.5t-73.5 30.5 t-73.5 -30.5t-30.5 -73.5z" />
+<glyph unicode="&#xe146;" d="M0 0l303 380l207 208l-210 212h300l267 279l-35 36q-15 14 -15 35t15 35q14 15 35 15t35 -15l283 -282q15 -15 15 -36t-15 -35q-14 -15 -35 -15t-35 15l-36 35l-279 -267v-300l-212 210l-208 -207z" />
+<glyph unicode="&#xe148;" d="M295 433h139q5 -77 48.5 -126.5t117.5 -64.5v335l-27 7q-46 14 -79 26.5t-72 36t-62.5 52t-40 72.5t-16.5 99q0 92 44 159.5t109 101t144 40.5v78h100v-79q38 -4 72.5 -13.5t75.5 -31.5t71 -53.5t51.5 -84t24.5 -118.5h-159q-8 72 -35 109.5t-101 50.5v-307l64 -14 q34 -7 64 -16.5t70 -31.5t67.5 -52t47.5 -80.5t20 -112.5q0 -139 -89 -224t-244 -96v-77h-100v78q-152 17 -237 104q-40 40 -52.5 93.5t-15.5 139.5zM466 889q0 -29 8 -51t16.5 -34t29.5 -22.5t31 -13.5t38 -10q7 -2 11 -3v274q-61 -8 -97.5 -37.5t-36.5 -102.5zM700 237 q170 18 170 151q0 64 -44 99.5t-126 60.5v-311z" />
+<glyph unicode="&#xe149;" d="M100 600v100h166q-24 49 -44 104q-10 26 -14.5 55.5t-3 72.5t25 90t68.5 87q97 88 263 88q129 0 230 -89t101 -208h-153q0 52 -34 89.5t-74 51.5t-76 14q-37 0 -79 -14.5t-62 -35.5q-41 -44 -41 -101q0 -11 2.5 -24.5t5.5 -24t9.5 -26.5t10.5 -25t14 -27.5t14 -25.5 t15.5 -27t13.5 -24h242v-100h-197q8 -50 -2.5 -115t-31.5 -94q-41 -59 -99 -113q35 11 84 18t70 7q32 1 102 -16t104 -17q76 0 136 30l50 -147q-41 -25 -80.5 -36.5t-59 -13t-61.5 -1.5q-23 0 -128 33t-155 29q-39 -4 -82 -17t-66 -25l-24 -11l-55 145l16.5 11t15.5 10 t13.5 9.5t14.5 12t14.5 14t17.5 18.5q48 55 54 126.5t-30 142.5h-221z" />
+<glyph unicode="&#xe150;" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM602 900l298 300l298 -300h-198v-900h-200v900h-198z" />
+<glyph unicode="&#xe151;" d="M2 300h198v900h200v-900h198l-298 -300zM700 0v200h100v-100h200v-100h-300zM700 400v100h300v-200h-99v-100h-100v100h99v100h-200zM700 700v500h300v-500h-100v100h-100v-100h-100zM801 900h100v200h-100v-200z" />
+<glyph unicode="&#xe152;" d="M2 300h198v900h200v-900h198l-298 -300zM700 0v500h300v-500h-100v100h-100v-100h-100zM700 700v200h100v-100h200v-100h-300zM700 1100v100h300v-200h-99v-100h-100v100h99v100h-200zM801 200h100v200h-100v-200z" />
+<glyph unicode="&#xe153;" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM800 100v400h300v-500h-100v100h-200zM800 1100v100h200v-500h-100v400h-100zM901 200h100v200h-100v-200z" />
+<glyph unicode="&#xe154;" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM800 400v100h200v-500h-100v400h-100zM800 800v400h300v-500h-100v100h-200zM901 900h100v200h-100v-200z" />
+<glyph unicode="&#xe155;" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM700 100v200h500v-200h-500zM700 400v200h400v-200h-400zM700 700v200h300v-200h-300zM700 1000v200h200v-200h-200z" />
+<glyph unicode="&#xe156;" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM700 100v200h200v-200h-200zM700 400v200h300v-200h-300zM700 700v200h400v-200h-400zM700 1000v200h500v-200h-500z" />
+<glyph unicode="&#xe157;" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q162 0 281 -118.5t119 -281.5v-300q0 -165 -118.5 -282.5t-281.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500z" />
+<glyph unicode="&#xe158;" d="M0 400v300q0 163 119 281.5t281 118.5h300q165 0 282.5 -117.5t117.5 -282.5v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-163 0 -281.5 117.5t-118.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM400 300l333 250l-333 250v-500z" />
+<glyph unicode="&#xe159;" d="M0 400v300q0 163 117.5 281.5t282.5 118.5h300q163 0 281.5 -119t118.5 -281v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM300 700l250 -333l250 333h-500z" />
+<glyph unicode="&#xe160;" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q165 0 282.5 -117.5t117.5 -282.5v-300q0 -162 -118.5 -281t-281.5 -119h-300q-165 0 -282.5 118.5t-117.5 281.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM300 400h500l-250 333z" />
+<glyph unicode="&#xe161;" d="M0 400v300h300v200l400 -350l-400 -350v200h-300zM500 0v200h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-500v200h400q165 0 282.5 -117.5t117.5 -282.5v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-400z" />
+<glyph unicode="&#xe162;" d="M216 519q10 -19 32 -19h302q-155 -438 -160 -458q-5 -21 4 -32l9 -8l9 -1q13 0 26 16l538 630q15 19 6 36q-8 18 -32 16h-300q1 4 78 219.5t79 227.5q2 17 -6 27l-8 8h-9q-16 0 -25 -15q-4 -5 -98.5 -111.5t-228 -257t-209.5 -238.5q-17 -19 -7 -40z" />
+<glyph unicode="&#xe163;" d="M0 400q0 -165 117.5 -282.5t282.5 -117.5h300q47 0 100 15v185h-500q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5h500v185q-14 4 -114 7.5t-193 5.5l-93 2q-165 0 -282.5 -117.5t-117.5 -282.5v-300zM600 400v300h300v200l400 -350l-400 -350v200h-300z " />
+<glyph unicode="&#xe164;" d="M0 400q0 -165 117.5 -282.5t282.5 -117.5h300q163 0 281.5 117.5t118.5 282.5v98l-78 73l-122 -123v-148q0 -41 -29.5 -70.5t-70.5 -29.5h-500q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5h156l118 122l-74 78h-100q-165 0 -282.5 -117.5t-117.5 -282.5 v-300zM496 709l353 342l-149 149h500v-500l-149 149l-342 -353z" />
+<glyph unicode="&#xe165;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM406 600 q0 80 57 137t137 57t137 -57t57 -137t-57 -137t-137 -57t-137 57t-57 137z" />
+<glyph unicode="&#xe166;" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 800l445 -500l450 500h-295v400h-300v-400h-300zM900 150h100v50h-100v-50z" />
+<glyph unicode="&#xe167;" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 700h300v-300h300v300h295l-445 500zM900 150h100v50h-100v-50z" />
+<glyph unicode="&#xe168;" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 705l305 -305l596 596l-154 155l-442 -442l-150 151zM900 150h100v50h-100v-50z" />
+<glyph unicode="&#xe169;" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 988l97 -98l212 213l-97 97zM200 401h700v699l-250 -239l-149 149l-212 -212l149 -149zM900 150h100v50h-100v-50z" />
+<glyph unicode="&#xe170;" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM200 612l212 -212l98 97l-213 212zM300 1200l239 -250l-149 -149l212 -212l149 148l248 -237v700h-699zM900 150h100v50h-100v-50z" />
+<glyph unicode="&#xe171;" d="M23 415l1177 784v-1079l-475 272l-310 -393v416h-392zM494 210l672 938l-672 -712v-226z" />
+<glyph unicode="&#xe172;" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-850q0 -21 -15 -35.5t-35 -14.5h-150v400h-700v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 1000h100v200h-100v-200z" />
+<glyph unicode="&#xe173;" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-218l-276 -275l-120 120l-126 -127h-378v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM581 306l123 123l120 -120l353 352l123 -123l-475 -476zM600 1000h100v200h-100v-200z" />
+<glyph unicode="&#xe174;" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-269l-103 -103l-170 170l-298 -298h-329v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 1000h100v200h-100v-200zM700 133l170 170l-170 170l127 127l170 -170l170 170l127 -128l-170 -169l170 -170 l-127 -127l-170 170l-170 -170z" />
+<glyph unicode="&#xe175;" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-300h-400v-200h-500v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 300l300 -300l300 300h-200v300h-200v-300h-200zM600 1000v200h100v-200h-100z" />
+<glyph unicode="&#xe176;" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-402l-200 200l-298 -298h-402v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 300h200v-300h200v300h200l-300 300zM600 1000v200h100v-200h-100z" />
+<glyph unicode="&#xe177;" d="M0 250q0 -21 14.5 -35.5t35.5 -14.5h1100q21 0 35.5 14.5t14.5 35.5v550h-1200v-550zM0 900h1200v150q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-150zM100 300v200h400v-200h-400z" />
+<glyph unicode="&#xe178;" d="M0 400l300 298v-198h400v-200h-400v-198zM100 800v200h100v-200h-100zM300 800v200h100v-200h-100zM500 800v200h400v198l300 -298l-300 -298v198h-400zM800 300v200h100v-200h-100zM1000 300h100v200h-100v-200z" />
+<glyph unicode="&#xe179;" d="M100 700v400l50 100l50 -100v-300h100v300l50 100l50 -100v-300h100v300l50 100l50 -100v-400l-100 -203v-447q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v447zM800 597q0 -29 10.5 -55.5t25 -43t29 -28.5t25.5 -18l10 -5v-397q0 -21 14.5 -35.5 t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v1106q0 31 -18 40.5t-44 -7.5l-276 -117q-25 -16 -43.5 -50.5t-18.5 -65.5v-359z" />
+<glyph unicode="&#xe180;" d="M100 0h400v56q-75 0 -87.5 6t-12.5 44v394h500v-394q0 -38 -12.5 -44t-87.5 -6v-56h400v56q-4 0 -11 0.5t-24 3t-30 7t-24 15t-11 24.5v888q0 22 25 34.5t50 13.5l25 2v56h-400v-56q75 0 87.5 -6t12.5 -44v-394h-500v394q0 38 12.5 44t87.5 6v56h-400v-56q4 0 11 -0.5 t24 -3t30 -7t24 -15t11 -24.5v-888q0 -22 -25 -34.5t-50 -13.5l-25 -2v-56z" />
+<glyph unicode="&#xe181;" d="M0 300q0 -41 29.5 -70.5t70.5 -29.5h300q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-300q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM100 100h400l200 200h105l295 98v-298h-425l-100 -100h-375zM100 300v200h300v-200h-300zM100 600v200h300v-200h-300z M100 1000h400l200 -200v-98l295 98h105v200h-425l-100 100h-375zM700 402v163l400 133v-163z" />
+<glyph unicode="&#xe182;" d="M16.5 974.5q0.5 -21.5 16 -90t46.5 -140t104 -177.5t175 -208q103 -103 207.5 -176t180 -103.5t137 -47t92.5 -16.5l31 1l163 162q16 17 13 40.5t-22 37.5l-192 136q-19 14 -45 12t-42 -19l-119 -118q-143 103 -267 227q-126 126 -227 268l118 118q17 17 20 41.5 t-11 44.5l-139 194q-14 19 -36.5 22t-40.5 -14l-162 -162q-1 -11 -0.5 -32.5z" />
+<glyph unicode="&#xe183;" d="M0 50v212q0 20 10.5 45.5t24.5 39.5l365 303v50q0 4 1 10.5t12 22.5t30 28.5t60 23t97 10.5t97 -10t60 -23.5t30 -27.5t12 -24l1 -10v-50l365 -303q14 -14 24.5 -39.5t10.5 -45.5v-212q0 -21 -15 -35.5t-35 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5zM0 712 q0 -21 14.5 -33.5t34.5 -8.5l202 33q20 4 34.5 21t14.5 38v146q141 24 300 24t300 -24v-146q0 -21 14.5 -38t34.5 -21l202 -33q20 -4 34.5 8.5t14.5 33.5v200q-6 8 -19 20.5t-63 45t-112 57t-171 45t-235 20.5q-92 0 -175 -10.5t-141.5 -27t-108.5 -36.5t-81.5 -40 t-53.5 -36.5t-31 -27.5l-9 -10v-200z" />
+<glyph unicode="&#xe184;" d="M100 0v100h1100v-100h-1100zM175 200h950l-125 150v250l100 100v400h-100v-200h-100v200h-200v-200h-100v200h-200v-200h-100v200h-100v-400l100 -100v-250z" />
+<glyph unicode="&#xe185;" d="M100 0h300v400q0 41 -29.5 70.5t-70.5 29.5h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-400zM500 0v1000q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-1000h-300zM900 0v700q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-700h-300z" />
+<glyph unicode="&#xe186;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v300h-200v100h200v100h-300v-300h200v-100h-200v-100zM600 300h200v100h100v300h-100v100h-200v-500 zM700 400v300h100v-300h-100z" />
+<glyph unicode="&#xe187;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h100v200h100v-200h100v500h-100v-200h-100v200h-100v-500zM600 300h200v100h100v300h-100v100h-200v-500 zM700 400v300h100v-300h-100z" />
+<glyph unicode="&#xe188;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v100h-200v300h200v100h-300v-500zM600 300h300v100h-200v300h200v100h-300v-500z" />
+<glyph unicode="&#xe189;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 550l300 -150v300zM600 400l300 150l-300 150v-300z" />
+<glyph unicode="&#xe190;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300v500h700v-500h-700zM300 400h130q41 0 68 42t27 107t-28.5 108t-66.5 43h-130v-300zM575 549 q0 -65 27 -107t68 -42h130v300h-130q-38 0 -66.5 -43t-28.5 -108z" />
+<glyph unicode="&#xe191;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v300h-200v100h200v100h-300v-300h200v-100h-200v-100zM601 300h100v100h-100v-100zM700 700h100 v-400h100v500h-200v-100z" />
+<glyph unicode="&#xe192;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v400h-200v100h-100v-500zM301 400v200h100v-200h-100zM601 300h100v100h-100v-100zM700 700h100 v-400h100v500h-200v-100z" />
+<glyph unicode="&#xe193;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 700v100h300v-300h-99v-100h-100v100h99v200h-200zM201 300v100h100v-100h-100zM601 300v100h100v-100h-100z M700 700v100h200v-500h-100v400h-100z" />
+<glyph unicode="&#xe194;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM400 500v200 l100 100h300v-100h-300v-200h300v-100h-300z" />
+<glyph unicode="&#xe195;" d="M0 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM182 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM400 400v400h300 l100 -100v-100h-100v100h-200v-100h200v-100h-200v-100h-100zM700 400v100h100v-100h-100z" />
+<glyph unicode="&#xe197;" d="M-14 494q0 -80 56.5 -137t135.5 -57h222v300h400v-300h128q120 0 205 86t85 208q0 120 -85 206.5t-205 86.5q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5zM300 200h200v300h200v-300 h200l-300 -300z" />
+<glyph unicode="&#xe198;" d="M-14 494q0 -80 56.5 -137t135.5 -57h8l414 414l403 -403q94 26 154.5 104t60.5 178q0 121 -85 207.5t-205 86.5q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5zM300 200l300 300 l300 -300h-200v-300h-200v300h-200z" />
+<glyph unicode="&#xe199;" d="M100 200h400v-155l-75 -45h350l-75 45v155h400l-270 300h170l-270 300h170l-300 333l-300 -333h170l-270 -300h170z" />
+<glyph unicode="&#xe200;" d="M121 700q0 -53 28.5 -97t75.5 -65q-4 -16 -4 -38q0 -74 52.5 -126.5t126.5 -52.5q56 0 100 30v-306l-75 -45h350l-75 45v306q46 -30 100 -30q74 0 126.5 52.5t52.5 126.5q0 24 -9 55q50 32 79.5 83t29.5 112q0 90 -61.5 155.5t-150.5 71.5q-26 89 -99.5 145.5 t-167.5 56.5q-116 0 -197.5 -81.5t-81.5 -197.5q0 -4 1 -12t1 -11q-14 2 -23 2q-74 0 -126.5 -52.5t-52.5 -126.5z" />
+</font>
+</defs></svg> \ No newline at end of file
diff --git a/library/bootstrap/fonts/glyphicons-halflings-regular.ttf b/library/bootstrap/fonts/glyphicons-halflings-regular.ttf
new file mode 100644
index 000000000..a498ef4e7
--- /dev/null
+++ b/library/bootstrap/fonts/glyphicons-halflings-regular.ttf
Binary files differ
diff --git a/library/bootstrap/fonts/glyphicons-halflings-regular.woff b/library/bootstrap/fonts/glyphicons-halflings-regular.woff
new file mode 100644
index 000000000..d83c539b8
--- /dev/null
+++ b/library/bootstrap/fonts/glyphicons-halflings-regular.woff
Binary files differ
diff --git a/library/bootstrap/js/bootbox.min.js b/library/bootstrap/js/bootbox.min.js
new file mode 100644
index 000000000..4ea792f3a
--- /dev/null
+++ b/library/bootstrap/js/bootbox.min.js
@@ -0,0 +1,6 @@
+/**
+ * bootbox.js v4.1.0
+ *
+ * http://bootboxjs.com/license.txt
+ */
+window.bootbox=window.bootbox||function a(b,c){"use strict";function d(a){var b=r[p.locale];return b?b[a]:r.en[a]}function e(a,c,d){a.preventDefault();var e=b.isFunction(d)&&d(a)===!1;e||c.modal("hide")}function f(a){var b,c=0;for(b in a)c++;return c}function g(a,c){var d=0;b.each(a,function(a,b){c(a,b,d++)})}function h(a){var c,d;if("object"!=typeof a)throw new Error("Please supply an object of options");if(!a.message)throw new Error("Please specify a message");return a=b.extend({},p,a),a.buttons||(a.buttons={}),a.backdrop=a.backdrop?"static":!1,c=a.buttons,d=f(c),g(c,function(a,e,f){if(b.isFunction(e)&&(e=c[a]={callback:e}),"object"!==b.type(e))throw new Error("button with key "+a+" must be an object");e.label||(e.label=a),e.className||(e.className=2>=d&&f===d-1?"btn-primary":"btn-default")}),a}function i(a,b){var c=a.length,d={};if(1>c||c>2)throw new Error("Invalid argument length");return 2===c||"string"==typeof a[0]?(d[b[0]]=a[0],d[b[1]]=a[1]):d=a[0],d}function j(a,c,d){return b.extend(!0,{},a,i(c,d))}function k(a,b,c,d){var e={className:"bootbox-"+a,buttons:l.apply(null,b)};return m(j(e,d,c),b)}function l(){for(var a={},b=0,c=arguments.length;c>b;b++){var e=arguments[b],f=e.toLowerCase(),g=e.toUpperCase();a[f]={label:d(g)}}return a}function m(a,b){var d={};return g(b,function(a,b){d[b]=!0}),g(a.buttons,function(a){if(d[a]===c)throw new Error("button key "+a+" is not allowed (options are "+b.join("\n")+")")}),a}var n={dialog:"<div class='bootbox modal' tabindex='-1' role='dialog'><div class='modal-dialog'><div class='modal-content'><div class='modal-body'><div class='bootbox-body'></div></div></div></div></div>",header:"<div class='modal-header'><h4 class='modal-title'></h4></div>",footer:"<div class='modal-footer'></div>",closeButton:"<button type='button' class='bootbox-close-button close'>&times;</button>",form:"<form class='bootbox-form'></form>",inputs:{text:"<input class='bootbox-input bootbox-input-text form-control' autocomplete=off type=text />",email:"<input class='bootbox-input bootbox-input-email form-control' autocomplete='off' type='email' />",select:"<select class='bootbox-input bootbox-input-select form-control'></select>",checkbox:"<div class='checkbox'><label><input class='bootbox-input bootbox-input-checkbox' type='checkbox' /></label></div>"}},o=b("body"),p={locale:"en",backdrop:!0,animate:!0,className:null,closeButton:!0,show:!0},q={};q.alert=function(){var a;if(a=k("alert",["ok"],["message","callback"],arguments),a.callback&&!b.isFunction(a.callback))throw new Error("alert requires callback property to be a function when provided");return a.buttons.ok.callback=a.onEscape=function(){return b.isFunction(a.callback)?a.callback():!0},q.dialog(a)},q.confirm=function(){var a;if(a=k("confirm",["cancel","confirm"],["message","callback"],arguments),a.buttons.cancel.callback=a.onEscape=function(){return a.callback(!1)},a.buttons.confirm.callback=function(){return a.callback(!0)},!b.isFunction(a.callback))throw new Error("confirm requires a callback");return q.dialog(a)},q.prompt=function(){var a,d,e,f,h,i,k;if(f=b(n.form),d={className:"bootbox-prompt",buttons:l("cancel","confirm"),value:"",inputType:"text"},a=m(j(d,arguments,["title","callback"]),["cancel","confirm"]),i=a.show===c?!0:a.show,a.message=f,a.buttons.cancel.callback=a.onEscape=function(){return a.callback(null)},a.buttons.confirm.callback=function(){var c;switch(a.inputType){case"text":case"email":case"select":c=h.val();break;case"checkbox":var d=h.find("input:checked");c=[],g(d,function(a,d){c.push(b(d).val())})}return a.callback(c)},a.show=!1,!a.title)throw new Error("prompt requires a title");if(!b.isFunction(a.callback))throw new Error("prompt requires a callback");if(!n.inputs[a.inputType])throw new Error("invalid prompt type");switch(h=b(n.inputs[a.inputType]),a.inputType){case"text":case"email":h.val(a.value);break;case"select":var o={};if(k=a.inputOptions||[],!k.length)throw new Error("prompt with select requires options");g(k,function(a,d){var e=h;if(d.value===c||d.text===c)throw new Error("given options in wrong format");d.group&&(o[d.group]||(o[d.group]=b("<optgroup/>").attr("label",d.group)),e=o[d.group]),e.append("<option value='"+d.value+"'>"+d.text+"</option>")}),g(o,function(a,b){h.append(b)}),h.val(a.value);break;case"checkbox":var p=b.isArray(a.value)?a.value:[a.value];if(k=a.inputOptions||[],!k.length)throw new Error("prompt with checkbox requires options");if(!k[0].value||!k[0].text)throw new Error("given options in wrong format");h=b("<div/>"),g(k,function(c,d){var e=b(n.inputs[a.inputType]);e.find("input").attr("value",d.value),e.find("label").append(d.text),g(p,function(a,b){b===d.value&&e.find("input").prop("checked",!0)}),h.append(e)})}return a.placeholder&&h.attr("placeholder",a.placeholder),f.append(h),f.on("submit",function(a){a.preventDefault(),e.find(".btn-primary").click()}),e=q.dialog(a),e.off("shown.bs.modal"),e.on("shown.bs.modal",function(){h.focus()}),i===!0&&e.modal("show"),e},q.dialog=function(a){a=h(a);var c=b(n.dialog),d=c.find(".modal-body"),f=a.buttons,i="",j={onEscape:a.onEscape};if(g(f,function(a,b){i+="<button data-bb-handler='"+a+"' type='button' class='btn "+b.className+"'>"+b.label+"</button>",j[a]=b.callback}),d.find(".bootbox-body").html(a.message),a.animate===!0&&c.addClass("fade"),a.className&&c.addClass(a.className),a.title&&d.before(n.header),a.closeButton){var k=b(n.closeButton);a.title?c.find(".modal-header").prepend(k):k.css("margin-top","-10px").prependTo(d)}return a.title&&c.find(".modal-title").html(a.title),i.length&&(d.after(n.footer),c.find(".modal-footer").html(i)),c.on("hidden.bs.modal",function(a){a.target===this&&c.remove()}),c.on("shown.bs.modal",function(){c.find(".btn-primary:first").focus()}),c.on("escape.close.bb",function(a){j.onEscape&&e(a,c,j.onEscape)}),c.on("click",".modal-footer button",function(a){var d=b(this).data("bb-handler");e(a,c,j[d])}),c.on("click",".bootbox-close-button",function(a){e(a,c,j.onEscape)}),c.on("keyup",function(a){27===a.which&&c.trigger("escape.close.bb")}),o.append(c),c.modal({backdrop:a.backdrop,keyboard:!1,show:!1}),a.show&&c.modal("show"),c},q.setDefaults=function(){var a={};2===arguments.length?a[arguments[0]]=arguments[1]:a=arguments[0],b.extend(p,a)},q.hideAll=function(){b(".bootbox").modal("hide")};var r={br:{OK:"OK",CANCEL:"Cancelar",CONFIRM:"Sim"},da:{OK:"OK",CANCEL:"Annuller",CONFIRM:"Accepter"},de:{OK:"OK",CANCEL:"Abbrechen",CONFIRM:"Akzeptieren"},en:{OK:"OK",CANCEL:"Cancel",CONFIRM:"OK"},es:{OK:"OK",CANCEL:"Cancelar",CONFIRM:"Aceptar"},fi:{OK:"OK",CANCEL:"Peruuta",CONFIRM:"OK"},fr:{OK:"OK",CANCEL:"Annuler",CONFIRM:"D'accord"},it:{OK:"OK",CANCEL:"Annulla",CONFIRM:"Conferma"},nl:{OK:"OK",CANCEL:"Annuleren",CONFIRM:"Accepteren"},no:{OK:"OK",CANCEL:"Avbryt",CONFIRM:"OK"},pl:{OK:"OK",CANCEL:"Anuluj",CONFIRM:"Potwierdź"},ru:{OK:"OK",CANCEL:"Отмена",CONFIRM:"Применить"},zh_CN:{OK:"OK",CANCEL:"å–消",CONFIRM:"确认"},zh_TW:{OK:"OK",CANCEL:"å–消",CONFIRM:"確èª"}};return q.init=function(c){window.bootbox=a(c||b)},q}(window.jQuery); \ No newline at end of file
diff --git a/library/bootstrap/js/bootstrap.js b/library/bootstrap/js/bootstrap.js
new file mode 100644
index 000000000..850e6e53b
--- /dev/null
+++ b/library/bootstrap/js/bootstrap.js
@@ -0,0 +1,2006 @@
+/*!
+ * Bootstrap v3.0.3 (http://getbootstrap.com)
+ * Copyright 2013 Twitter, Inc.
+ * Licensed under http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+if (typeof jQuery === "undefined") { throw new Error("Bootstrap requires jQuery") }
+
+/* ========================================================================
+ * Bootstrap: transition.js v3.0.3
+ * http://getbootstrap.com/javascript/#transitions
+ * ========================================================================
+ * Copyright 2013 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ======================================================================== */
+
+
++function ($) { "use strict";
+
+ // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)
+ // ============================================================
+
+ function transitionEnd() {
+ var el = document.createElement('bootstrap')
+
+ var transEndEventNames = {
+ 'WebkitTransition' : 'webkitTransitionEnd'
+ , 'MozTransition' : 'transitionend'
+ , 'OTransition' : 'oTransitionEnd otransitionend'
+ , 'transition' : 'transitionend'
+ }
+
+ for (var name in transEndEventNames) {
+ if (el.style[name] !== undefined) {
+ return { end: transEndEventNames[name] }
+ }
+ }
+ }
+
+ // http://blog.alexmaccaw.com/css-transitions
+ $.fn.emulateTransitionEnd = function (duration) {
+ var called = false, $el = this
+ $(this).one($.support.transition.end, function () { called = true })
+ var callback = function () { if (!called) $($el).trigger($.support.transition.end) }
+ setTimeout(callback, duration)
+ return this
+ }
+
+ $(function () {
+ $.support.transition = transitionEnd()
+ })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: alert.js v3.0.3
+ * http://getbootstrap.com/javascript/#alerts
+ * ========================================================================
+ * Copyright 2013 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ======================================================================== */
+
+
++function ($) { "use strict";
+
+ // ALERT CLASS DEFINITION
+ // ======================
+
+ var dismiss = '[data-dismiss="alert"]'
+ var Alert = function (el) {
+ $(el).on('click', dismiss, this.close)
+ }
+
+ Alert.prototype.close = function (e) {
+ var $this = $(this)
+ var selector = $this.attr('data-target')
+
+ if (!selector) {
+ selector = $this.attr('href')
+ selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
+ }
+
+ var $parent = $(selector)
+
+ if (e) e.preventDefault()
+
+ if (!$parent.length) {
+ $parent = $this.hasClass('alert') ? $this : $this.parent()
+ }
+
+ $parent.trigger(e = $.Event('close.bs.alert'))
+
+ if (e.isDefaultPrevented()) return
+
+ $parent.removeClass('in')
+
+ function removeElement() {
+ $parent.trigger('closed.bs.alert').remove()
+ }
+
+ $.support.transition && $parent.hasClass('fade') ?
+ $parent
+ .one($.support.transition.end, removeElement)
+ .emulateTransitionEnd(150) :
+ removeElement()
+ }
+
+
+ // ALERT PLUGIN DEFINITION
+ // =======================
+
+ var old = $.fn.alert
+
+ $.fn.alert = function (option) {
+ return this.each(function () {
+ var $this = $(this)
+ var data = $this.data('bs.alert')
+
+ if (!data) $this.data('bs.alert', (data = new Alert(this)))
+ if (typeof option == 'string') data[option].call($this)
+ })
+ }
+
+ $.fn.alert.Constructor = Alert
+
+
+ // ALERT NO CONFLICT
+ // =================
+
+ $.fn.alert.noConflict = function () {
+ $.fn.alert = old
+ return this
+ }
+
+
+ // ALERT DATA-API
+ // ==============
+
+ $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close)
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: button.js v3.0.3
+ * http://getbootstrap.com/javascript/#buttons
+ * ========================================================================
+ * Copyright 2013 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ======================================================================== */
+
+
++function ($) { "use strict";
+
+ // BUTTON PUBLIC CLASS DEFINITION
+ // ==============================
+
+ var Button = function (element, options) {
+ this.$element = $(element)
+ this.options = $.extend({}, Button.DEFAULTS, options)
+ }
+
+ Button.DEFAULTS = {
+ loadingText: 'loading...'
+ }
+
+ Button.prototype.setState = function (state) {
+ var d = 'disabled'
+ var $el = this.$element
+ var val = $el.is('input') ? 'val' : 'html'
+ var data = $el.data()
+
+ state = state + 'Text'
+
+ if (!data.resetText) $el.data('resetText', $el[val]())
+
+ $el[val](data[state] || this.options[state])
+
+ // push to event loop to allow forms to submit
+ setTimeout(function () {
+ state == 'loadingText' ?
+ $el.addClass(d).attr(d, d) :
+ $el.removeClass(d).removeAttr(d);
+ }, 0)
+ }
+
+ Button.prototype.toggle = function () {
+ var $parent = this.$element.closest('[data-toggle="buttons"]')
+ var changed = true
+
+ if ($parent.length) {
+ var $input = this.$element.find('input')
+ if ($input.prop('type') === 'radio') {
+ // see if clicking on current one
+ if ($input.prop('checked') && this.$element.hasClass('active'))
+ changed = false
+ else
+ $parent.find('.active').removeClass('active')
+ }
+ if (changed) $input.prop('checked', !this.$element.hasClass('active')).trigger('change')
+ }
+
+ if (changed) this.$element.toggleClass('active')
+ }
+
+
+ // BUTTON PLUGIN DEFINITION
+ // ========================
+
+ var old = $.fn.button
+
+ $.fn.button = function (option) {
+ return this.each(function () {
+ var $this = $(this)
+ var data = $this.data('bs.button')
+ var options = typeof option == 'object' && option
+
+ if (!data) $this.data('bs.button', (data = new Button(this, options)))
+
+ if (option == 'toggle') data.toggle()
+ else if (option) data.setState(option)
+ })
+ }
+
+ $.fn.button.Constructor = Button
+
+
+ // BUTTON NO CONFLICT
+ // ==================
+
+ $.fn.button.noConflict = function () {
+ $.fn.button = old
+ return this
+ }
+
+
+ // BUTTON DATA-API
+ // ===============
+
+ $(document).on('click.bs.button.data-api', '[data-toggle^=button]', function (e) {
+ var $btn = $(e.target)
+ if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')
+ $btn.button('toggle')
+ e.preventDefault()
+ })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: carousel.js v3.0.3
+ * http://getbootstrap.com/javascript/#carousel
+ * ========================================================================
+ * Copyright 2013 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ======================================================================== */
+
+
++function ($) { "use strict";
+
+ // CAROUSEL CLASS DEFINITION
+ // =========================
+
+ var Carousel = function (element, options) {
+ this.$element = $(element)
+ this.$indicators = this.$element.find('.carousel-indicators')
+ this.options = options
+ this.paused =
+ this.sliding =
+ this.interval =
+ this.$active =
+ this.$items = null
+
+ this.options.pause == 'hover' && this.$element
+ .on('mouseenter', $.proxy(this.pause, this))
+ .on('mouseleave', $.proxy(this.cycle, this))
+ }
+
+ Carousel.DEFAULTS = {
+ interval: 5000
+ , pause: 'hover'
+ , wrap: true
+ }
+
+ Carousel.prototype.cycle = function (e) {
+ e || (this.paused = false)
+
+ this.interval && clearInterval(this.interval)
+
+ this.options.interval
+ && !this.paused
+ && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
+
+ return this
+ }
+
+ Carousel.prototype.getActiveIndex = function () {
+ this.$active = this.$element.find('.item.active')
+ this.$items = this.$active.parent().children()
+
+ return this.$items.index(this.$active)
+ }
+
+ Carousel.prototype.to = function (pos) {
+ var that = this
+ var activeIndex = this.getActiveIndex()
+
+ if (pos > (this.$items.length - 1) || pos < 0) return
+
+ if (this.sliding) return this.$element.one('slid.bs.carousel', function () { that.to(pos) })
+ if (activeIndex == pos) return this.pause().cycle()
+
+ return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos]))
+ }
+
+ Carousel.prototype.pause = function (e) {
+ e || (this.paused = true)
+
+ if (this.$element.find('.next, .prev').length && $.support.transition.end) {
+ this.$element.trigger($.support.transition.end)
+ this.cycle(true)
+ }
+
+ this.interval = clearInterval(this.interval)
+
+ return this
+ }
+
+ Carousel.prototype.next = function () {
+ if (this.sliding) return
+ return this.slide('next')
+ }
+
+ Carousel.prototype.prev = function () {
+ if (this.sliding) return
+ return this.slide('prev')
+ }
+
+ Carousel.prototype.slide = function (type, next) {
+ var $active = this.$element.find('.item.active')
+ var $next = next || $active[type]()
+ var isCycling = this.interval
+ var direction = type == 'next' ? 'left' : 'right'
+ var fallback = type == 'next' ? 'first' : 'last'
+ var that = this
+
+ if (!$next.length) {
+ if (!this.options.wrap) return
+ $next = this.$element.find('.item')[fallback]()
+ }
+
+ this.sliding = true
+
+ isCycling && this.pause()
+
+ var e = $.Event('slide.bs.carousel', { relatedTarget: $next[0], direction: direction })
+
+ if ($next.hasClass('active')) return
+
+ if (this.$indicators.length) {
+ this.$indicators.find('.active').removeClass('active')
+ this.$element.one('slid.bs.carousel', function () {
+ var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()])
+ $nextIndicator && $nextIndicator.addClass('active')
+ })
+ }
+
+ if ($.support.transition && this.$element.hasClass('slide')) {
+ this.$element.trigger(e)
+ if (e.isDefaultPrevented()) return
+ $next.addClass(type)
+ $next[0].offsetWidth // force reflow
+ $active.addClass(direction)
+ $next.addClass(direction)
+ $active
+ .one($.support.transition.end, function () {
+ $next.removeClass([type, direction].join(' ')).addClass('active')
+ $active.removeClass(['active', direction].join(' '))
+ that.sliding = false
+ setTimeout(function () { that.$element.trigger('slid.bs.carousel') }, 0)
+ })
+ .emulateTransitionEnd(600)
+ } else {
+ this.$element.trigger(e)
+ if (e.isDefaultPrevented()) return
+ $active.removeClass('active')
+ $next.addClass('active')
+ this.sliding = false
+ this.$element.trigger('slid.bs.carousel')
+ }
+
+ isCycling && this.cycle()
+
+ return this
+ }
+
+
+ // CAROUSEL PLUGIN DEFINITION
+ // ==========================
+
+ var old = $.fn.carousel
+
+ $.fn.carousel = function (option) {
+ return this.each(function () {
+ var $this = $(this)
+ var data = $this.data('bs.carousel')
+ var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option)
+ var action = typeof option == 'string' ? option : options.slide
+
+ if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))
+ if (typeof option == 'number') data.to(option)
+ else if (action) data[action]()
+ else if (options.interval) data.pause().cycle()
+ })
+ }
+
+ $.fn.carousel.Constructor = Carousel
+
+
+ // CAROUSEL NO CONFLICT
+ // ====================
+
+ $.fn.carousel.noConflict = function () {
+ $.fn.carousel = old
+ return this
+ }
+
+
+ // CAROUSEL DATA-API
+ // =================
+
+ $(document).on('click.bs.carousel.data-api', '[data-slide], [data-slide-to]', function (e) {
+ var $this = $(this), href
+ var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
+ var options = $.extend({}, $target.data(), $this.data())
+ var slideIndex = $this.attr('data-slide-to')
+ if (slideIndex) options.interval = false
+
+ $target.carousel(options)
+
+ if (slideIndex = $this.attr('data-slide-to')) {
+ $target.data('bs.carousel').to(slideIndex)
+ }
+
+ e.preventDefault()
+ })
+
+ $(window).on('load', function () {
+ $('[data-ride="carousel"]').each(function () {
+ var $carousel = $(this)
+ $carousel.carousel($carousel.data())
+ })
+ })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: collapse.js v3.0.3
+ * http://getbootstrap.com/javascript/#collapse
+ * ========================================================================
+ * Copyright 2013 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ======================================================================== */
+
+
++function ($) { "use strict";
+
+ // COLLAPSE PUBLIC CLASS DEFINITION
+ // ================================
+
+ var Collapse = function (element, options) {
+ this.$element = $(element)
+ this.options = $.extend({}, Collapse.DEFAULTS, options)
+ this.transitioning = null
+
+ if (this.options.parent) this.$parent = $(this.options.parent)
+ if (this.options.toggle) this.toggle()
+ }
+
+ Collapse.DEFAULTS = {
+ toggle: true
+ }
+
+ Collapse.prototype.dimension = function () {
+ var hasWidth = this.$element.hasClass('width')
+ return hasWidth ? 'width' : 'height'
+ }
+
+ Collapse.prototype.show = function () {
+ if (this.transitioning || this.$element.hasClass('in')) return
+
+ var startEvent = $.Event('show.bs.collapse')
+ this.$element.trigger(startEvent)
+ if (startEvent.isDefaultPrevented()) return
+
+ var actives = this.$parent && this.$parent.find('> .panel > .in')
+
+ if (actives && actives.length) {
+ var hasData = actives.data('bs.collapse')
+ if (hasData && hasData.transitioning) return
+ actives.collapse('hide')
+ hasData || actives.data('bs.collapse', null)
+ }
+
+ var dimension = this.dimension()
+
+ this.$element
+ .removeClass('collapse')
+ .addClass('collapsing')
+ [dimension](0)
+
+ this.transitioning = 1
+
+ var complete = function () {
+ this.$element
+ .removeClass('collapsing')
+ .addClass('in')
+ [dimension]('auto')
+ this.transitioning = 0
+ this.$element.trigger('shown.bs.collapse')
+ }
+
+ if (!$.support.transition) return complete.call(this)
+
+ var scrollSize = $.camelCase(['scroll', dimension].join('-'))
+
+ this.$element
+ .one($.support.transition.end, $.proxy(complete, this))
+ .emulateTransitionEnd(350)
+ [dimension](this.$element[0][scrollSize])
+ }
+
+ Collapse.prototype.hide = function () {
+ if (this.transitioning || !this.$element.hasClass('in')) return
+
+ var startEvent = $.Event('hide.bs.collapse')
+ this.$element.trigger(startEvent)
+ if (startEvent.isDefaultPrevented()) return
+
+ var dimension = this.dimension()
+
+ this.$element
+ [dimension](this.$element[dimension]())
+ [0].offsetHeight
+
+ this.$element
+ .addClass('collapsing')
+ .removeClass('collapse')
+ .removeClass('in')
+
+ this.transitioning = 1
+
+ var complete = function () {
+ this.transitioning = 0
+ this.$element
+ .trigger('hidden.bs.collapse')
+ .removeClass('collapsing')
+ .addClass('collapse')
+ }
+
+ if (!$.support.transition) return complete.call(this)
+
+ this.$element
+ [dimension](0)
+ .one($.support.transition.end, $.proxy(complete, this))
+ .emulateTransitionEnd(350)
+ }
+
+ Collapse.prototype.toggle = function () {
+ this[this.$element.hasClass('in') ? 'hide' : 'show']()
+ }
+
+
+ // COLLAPSE PLUGIN DEFINITION
+ // ==========================
+
+ var old = $.fn.collapse
+
+ $.fn.collapse = function (option) {
+ return this.each(function () {
+ var $this = $(this)
+ var data = $this.data('bs.collapse')
+ var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)
+
+ if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))
+ if (typeof option == 'string') data[option]()
+ })
+ }
+
+ $.fn.collapse.Constructor = Collapse
+
+
+ // COLLAPSE NO CONFLICT
+ // ====================
+
+ $.fn.collapse.noConflict = function () {
+ $.fn.collapse = old
+ return this
+ }
+
+
+ // COLLAPSE DATA-API
+ // =================
+
+ $(document).on('click.bs.collapse.data-api', '[data-toggle=collapse]', function (e) {
+ var $this = $(this), href
+ var target = $this.attr('data-target')
+ || e.preventDefault()
+ || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7
+ var $target = $(target)
+ var data = $target.data('bs.collapse')
+ var option = data ? 'toggle' : $this.data()
+ var parent = $this.attr('data-parent')
+ var $parent = parent && $(parent)
+
+ if (!data || !data.transitioning) {
+ if ($parent) $parent.find('[data-toggle=collapse][data-parent="' + parent + '"]').not($this).addClass('collapsed')
+ $this[$target.hasClass('in') ? 'addClass' : 'removeClass']('collapsed')
+ }
+
+ $target.collapse(option)
+ })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: dropdown.js v3.0.3
+ * http://getbootstrap.com/javascript/#dropdowns
+ * ========================================================================
+ * Copyright 2013 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ======================================================================== */
+
+
++function ($) { "use strict";
+
+ // DROPDOWN CLASS DEFINITION
+ // =========================
+
+ var backdrop = '.dropdown-backdrop'
+ var toggle = '[data-toggle=dropdown]'
+ var Dropdown = function (element) {
+ $(element).on('click.bs.dropdown', this.toggle)
+ }
+
+ Dropdown.prototype.toggle = function (e) {
+ var $this = $(this)
+
+ if ($this.is('.disabled, :disabled')) return
+
+ var $parent = getParent($this)
+ var isActive = $parent.hasClass('open')
+
+ clearMenus()
+
+ if (!isActive) {
+ if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {
+ // if mobile we use a backdrop because click events don't delegate
+ $('<div class="dropdown-backdrop"/>').insertAfter($(this)).on('click', clearMenus)
+ }
+
+ $parent.trigger(e = $.Event('show.bs.dropdown'))
+
+ if (e.isDefaultPrevented()) return
+
+ $parent
+ .toggleClass('open')
+ .trigger('shown.bs.dropdown')
+
+ $this.focus()
+ }
+
+ return false
+ }
+
+ Dropdown.prototype.keydown = function (e) {
+ if (!/(38|40|27)/.test(e.keyCode)) return
+
+ var $this = $(this)
+
+ e.preventDefault()
+ e.stopPropagation()
+
+ if ($this.is('.disabled, :disabled')) return
+
+ var $parent = getParent($this)
+ var isActive = $parent.hasClass('open')
+
+ if (!isActive || (isActive && e.keyCode == 27)) {
+ if (e.which == 27) $parent.find(toggle).focus()
+ return $this.click()
+ }
+
+ var $items = $('[role=menu] li:not(.divider):visible a', $parent)
+
+ if (!$items.length) return
+
+ var index = $items.index($items.filter(':focus'))
+
+ if (e.keyCode == 38 && index > 0) index-- // up
+ if (e.keyCode == 40 && index < $items.length - 1) index++ // down
+ if (!~index) index=0
+
+ $items.eq(index).focus()
+ }
+
+ function clearMenus() {
+ $(backdrop).remove()
+ $(toggle).each(function (e) {
+ var $parent = getParent($(this))
+ if (!$parent.hasClass('open')) return
+ $parent.trigger(e = $.Event('hide.bs.dropdown'))
+ if (e.isDefaultPrevented()) return
+ $parent.removeClass('open').trigger('hidden.bs.dropdown')
+ })
+ }
+
+ function getParent($this) {
+ var selector = $this.attr('data-target')
+
+ if (!selector) {
+ selector = $this.attr('href')
+ selector = selector && /#/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
+ }
+
+ var $parent = selector && $(selector)
+
+ return $parent && $parent.length ? $parent : $this.parent()
+ }
+
+
+ // DROPDOWN PLUGIN DEFINITION
+ // ==========================
+
+ var old = $.fn.dropdown
+
+ $.fn.dropdown = function (option) {
+ return this.each(function () {
+ var $this = $(this)
+ var data = $this.data('bs.dropdown')
+
+ if (!data) $this.data('bs.dropdown', (data = new Dropdown(this)))
+ if (typeof option == 'string') data[option].call($this)
+ })
+ }
+
+ $.fn.dropdown.Constructor = Dropdown
+
+
+ // DROPDOWN NO CONFLICT
+ // ====================
+
+ $.fn.dropdown.noConflict = function () {
+ $.fn.dropdown = old
+ return this
+ }
+
+
+ // APPLY TO STANDARD DROPDOWN ELEMENTS
+ // ===================================
+
+ $(document)
+ .on('click.bs.dropdown.data-api', clearMenus)
+ .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
+ .on('click.bs.dropdown.data-api' , toggle, Dropdown.prototype.toggle)
+ .on('keydown.bs.dropdown.data-api', toggle + ', [role=menu]' , Dropdown.prototype.keydown)
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: modal.js v3.0.3
+ * http://getbootstrap.com/javascript/#modals
+ * ========================================================================
+ * Copyright 2013 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ======================================================================== */
+
+
++function ($) { "use strict";
+
+ // MODAL CLASS DEFINITION
+ // ======================
+
+ var Modal = function (element, options) {
+ this.options = options
+ this.$element = $(element)
+ this.$backdrop =
+ this.isShown = null
+
+ if (this.options.remote) this.$element.load(this.options.remote)
+ }
+
+ Modal.DEFAULTS = {
+ backdrop: true
+ , keyboard: true
+ , show: true
+ }
+
+ Modal.prototype.toggle = function (_relatedTarget) {
+ return this[!this.isShown ? 'show' : 'hide'](_relatedTarget)
+ }
+
+ Modal.prototype.show = function (_relatedTarget) {
+ var that = this
+ var e = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })
+
+ this.$element.trigger(e)
+
+ if (this.isShown || e.isDefaultPrevented()) return
+
+ this.isShown = true
+
+ this.escape()
+
+ this.$element.on('click.dismiss.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this))
+
+ this.backdrop(function () {
+ var transition = $.support.transition && that.$element.hasClass('fade')
+
+ if (!that.$element.parent().length) {
+ that.$element.appendTo(document.body) // don't move modals dom position
+ }
+
+ that.$element.show()
+
+ if (transition) {
+ that.$element[0].offsetWidth // force reflow
+ }
+
+ that.$element
+ .addClass('in')
+ .attr('aria-hidden', false)
+
+ that.enforceFocus()
+
+ var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })
+
+ transition ?
+ that.$element.find('.modal-dialog') // wait for modal to slide in
+ .one($.support.transition.end, function () {
+ that.$element.focus().trigger(e)
+ })
+ .emulateTransitionEnd(300) :
+ that.$element.focus().trigger(e)
+ })
+ }
+
+ Modal.prototype.hide = function (e) {
+ if (e) e.preventDefault()
+
+ e = $.Event('hide.bs.modal')
+
+ this.$element.trigger(e)
+
+ if (!this.isShown || e.isDefaultPrevented()) return
+
+ this.isShown = false
+
+ this.escape()
+
+ $(document).off('focusin.bs.modal')
+
+ this.$element
+ .removeClass('in')
+ .attr('aria-hidden', true)
+ .off('click.dismiss.modal')
+
+ $.support.transition && this.$element.hasClass('fade') ?
+ this.$element
+ .one($.support.transition.end, $.proxy(this.hideModal, this))
+ .emulateTransitionEnd(300) :
+ this.hideModal()
+ }
+
+ Modal.prototype.enforceFocus = function () {
+ $(document)
+ .off('focusin.bs.modal') // guard against infinite focus loop
+ .on('focusin.bs.modal', $.proxy(function (e) {
+ if (this.$element[0] !== e.target && !this.$element.has(e.target).length) {
+ this.$element.focus()
+ }
+ }, this))
+ }
+
+ Modal.prototype.escape = function () {
+ if (this.isShown && this.options.keyboard) {
+ this.$element.on('keyup.dismiss.bs.modal', $.proxy(function (e) {
+ e.which == 27 && this.hide()
+ }, this))
+ } else if (!this.isShown) {
+ this.$element.off('keyup.dismiss.bs.modal')
+ }
+ }
+
+ Modal.prototype.hideModal = function () {
+ var that = this
+ this.$element.hide()
+ this.backdrop(function () {
+ that.removeBackdrop()
+ that.$element.trigger('hidden.bs.modal')
+ })
+ }
+
+ Modal.prototype.removeBackdrop = function () {
+ this.$backdrop && this.$backdrop.remove()
+ this.$backdrop = null
+ }
+
+ Modal.prototype.backdrop = function (callback) {
+ var that = this
+ var animate = this.$element.hasClass('fade') ? 'fade' : ''
+
+ if (this.isShown && this.options.backdrop) {
+ var doAnimate = $.support.transition && animate
+
+ this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />')
+ .appendTo(document.body)
+
+ this.$element.on('click.dismiss.modal', $.proxy(function (e) {
+ if (e.target !== e.currentTarget) return
+ this.options.backdrop == 'static'
+ ? this.$element[0].focus.call(this.$element[0])
+ : this.hide.call(this)
+ }, this))
+
+ if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
+
+ this.$backdrop.addClass('in')
+
+ if (!callback) return
+
+ doAnimate ?
+ this.$backdrop
+ .one($.support.transition.end, callback)
+ .emulateTransitionEnd(150) :
+ callback()
+
+ } else if (!this.isShown && this.$backdrop) {
+ this.$backdrop.removeClass('in')
+
+ $.support.transition && this.$element.hasClass('fade')?
+ this.$backdrop
+ .one($.support.transition.end, callback)
+ .emulateTransitionEnd(150) :
+ callback()
+
+ } else if (callback) {
+ callback()
+ }
+ }
+
+
+ // MODAL PLUGIN DEFINITION
+ // =======================
+
+ var old = $.fn.modal
+
+ $.fn.modal = function (option, _relatedTarget) {
+ return this.each(function () {
+ var $this = $(this)
+ var data = $this.data('bs.modal')
+ var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)
+
+ if (!data) $this.data('bs.modal', (data = new Modal(this, options)))
+ if (typeof option == 'string') data[option](_relatedTarget)
+ else if (options.show) data.show(_relatedTarget)
+ })
+ }
+
+ $.fn.modal.Constructor = Modal
+
+
+ // MODAL NO CONFLICT
+ // =================
+
+ $.fn.modal.noConflict = function () {
+ $.fn.modal = old
+ return this
+ }
+
+
+ // MODAL DATA-API
+ // ==============
+
+ $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) {
+ var $this = $(this)
+ var href = $this.attr('href')
+ var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) //strip for ie7
+ var option = $target.data('modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())
+
+ e.preventDefault()
+
+ $target
+ .modal(option, this)
+ .one('hide', function () {
+ $this.is(':visible') && $this.focus()
+ })
+ })
+
+ $(document)
+ .on('show.bs.modal', '.modal', function () { $(document.body).addClass('modal-open') })
+ .on('hidden.bs.modal', '.modal', function () { $(document.body).removeClass('modal-open') })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: tooltip.js v3.0.3
+ * http://getbootstrap.com/javascript/#tooltip
+ * Inspired by the original jQuery.tipsy by Jason Frame
+ * ========================================================================
+ * Copyright 2013 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ======================================================================== */
+
+
++function ($) { "use strict";
+
+ // TOOLTIP PUBLIC CLASS DEFINITION
+ // ===============================
+
+ var Tooltip = function (element, options) {
+ this.type =
+ this.options =
+ this.enabled =
+ this.timeout =
+ this.hoverState =
+ this.$element = null
+
+ this.init('tooltip', element, options)
+ }
+
+ Tooltip.DEFAULTS = {
+ animation: true
+ , placement: 'top'
+ , selector: false
+ , template: '<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>'
+ , trigger: 'hover focus'
+ , title: ''
+ , delay: 0
+ , html: false
+ , container: false
+ }
+
+ Tooltip.prototype.init = function (type, element, options) {
+ this.enabled = true
+ this.type = type
+ this.$element = $(element)
+ this.options = this.getOptions(options)
+
+ var triggers = this.options.trigger.split(' ')
+
+ for (var i = triggers.length; i--;) {
+ var trigger = triggers[i]
+
+ if (trigger == 'click') {
+ this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))
+ } else if (trigger != 'manual') {
+ var eventIn = trigger == 'hover' ? 'mouseenter' : 'focus'
+ var eventOut = trigger == 'hover' ? 'mouseleave' : 'blur'
+
+ this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this))
+ this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))
+ }
+ }
+
+ this.options.selector ?
+ (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
+ this.fixTitle()
+ }
+
+ Tooltip.prototype.getDefaults = function () {
+ return Tooltip.DEFAULTS
+ }
+
+ Tooltip.prototype.getOptions = function (options) {
+ options = $.extend({}, this.getDefaults(), this.$element.data(), options)
+
+ if (options.delay && typeof options.delay == 'number') {
+ options.delay = {
+ show: options.delay
+ , hide: options.delay
+ }
+ }
+
+ return options
+ }
+
+ Tooltip.prototype.getDelegateOptions = function () {
+ var options = {}
+ var defaults = this.getDefaults()
+
+ this._options && $.each(this._options, function (key, value) {
+ if (defaults[key] != value) options[key] = value
+ })
+
+ return options
+ }
+
+ Tooltip.prototype.enter = function (obj) {
+ var self = obj instanceof this.constructor ?
+ obj : $(obj.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type)
+
+ clearTimeout(self.timeout)
+
+ self.hoverState = 'in'
+
+ if (!self.options.delay || !self.options.delay.show) return self.show()
+
+ self.timeout = setTimeout(function () {
+ if (self.hoverState == 'in') self.show()
+ }, self.options.delay.show)
+ }
+
+ Tooltip.prototype.leave = function (obj) {
+ var self = obj instanceof this.constructor ?
+ obj : $(obj.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type)
+
+ clearTimeout(self.timeout)
+
+ self.hoverState = 'out'
+
+ if (!self.options.delay || !self.options.delay.hide) return self.hide()
+
+ self.timeout = setTimeout(function () {
+ if (self.hoverState == 'out') self.hide()
+ }, self.options.delay.hide)
+ }
+
+ Tooltip.prototype.show = function () {
+ var e = $.Event('show.bs.'+ this.type)
+
+ if (this.hasContent() && this.enabled) {
+ this.$element.trigger(e)
+
+ if (e.isDefaultPrevented()) return
+
+ var $tip = this.tip()
+
+ this.setContent()
+
+ if (this.options.animation) $tip.addClass('fade')
+
+ var placement = typeof this.options.placement == 'function' ?
+ this.options.placement.call(this, $tip[0], this.$element[0]) :
+ this.options.placement
+
+ var autoToken = /\s?auto?\s?/i
+ var autoPlace = autoToken.test(placement)
+ if (autoPlace) placement = placement.replace(autoToken, '') || 'top'
+
+ $tip
+ .detach()
+ .css({ top: 0, left: 0, display: 'block' })
+ .addClass(placement)
+
+ this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)
+
+ var pos = this.getPosition()
+ var actualWidth = $tip[0].offsetWidth
+ var actualHeight = $tip[0].offsetHeight
+
+ if (autoPlace) {
+ var $parent = this.$element.parent()
+
+ var orgPlacement = placement
+ var docScroll = document.documentElement.scrollTop || document.body.scrollTop
+ var parentWidth = this.options.container == 'body' ? window.innerWidth : $parent.outerWidth()
+ var parentHeight = this.options.container == 'body' ? window.innerHeight : $parent.outerHeight()
+ var parentLeft = this.options.container == 'body' ? 0 : $parent.offset().left
+
+ placement = placement == 'bottom' && pos.top + pos.height + actualHeight - docScroll > parentHeight ? 'top' :
+ placement == 'top' && pos.top - docScroll - actualHeight < 0 ? 'bottom' :
+ placement == 'right' && pos.right + actualWidth > parentWidth ? 'left' :
+ placement == 'left' && pos.left - actualWidth < parentLeft ? 'right' :
+ placement
+
+ $tip
+ .removeClass(orgPlacement)
+ .addClass(placement)
+ }
+
+ var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)
+
+ this.applyPlacement(calculatedOffset, placement)
+ this.$element.trigger('shown.bs.' + this.type)
+ }
+ }
+
+ Tooltip.prototype.applyPlacement = function(offset, placement) {
+ var replace
+ var $tip = this.tip()
+ var width = $tip[0].offsetWidth
+ var height = $tip[0].offsetHeight
+
+ // manually read margins because getBoundingClientRect includes difference
+ var marginTop = parseInt($tip.css('margin-top'), 10)
+ var marginLeft = parseInt($tip.css('margin-left'), 10)
+
+ // we must check for NaN for ie 8/9
+ if (isNaN(marginTop)) marginTop = 0
+ if (isNaN(marginLeft)) marginLeft = 0
+
+ offset.top = offset.top + marginTop
+ offset.left = offset.left + marginLeft
+
+ $tip
+ .offset(offset)
+ .addClass('in')
+
+ // check to see if placing tip in new offset caused the tip to resize itself
+ var actualWidth = $tip[0].offsetWidth
+ var actualHeight = $tip[0].offsetHeight
+
+ if (placement == 'top' && actualHeight != height) {
+ replace = true
+ offset.top = offset.top + height - actualHeight
+ }
+
+ if (/bottom|top/.test(placement)) {
+ var delta = 0
+
+ if (offset.left < 0) {
+ delta = offset.left * -2
+ offset.left = 0
+
+ $tip.offset(offset)
+
+ actualWidth = $tip[0].offsetWidth
+ actualHeight = $tip[0].offsetHeight
+ }
+
+ this.replaceArrow(delta - width + actualWidth, actualWidth, 'left')
+ } else {
+ this.replaceArrow(actualHeight - height, actualHeight, 'top')
+ }
+
+ if (replace) $tip.offset(offset)
+ }
+
+ Tooltip.prototype.replaceArrow = function(delta, dimension, position) {
+ this.arrow().css(position, delta ? (50 * (1 - delta / dimension) + "%") : '')
+ }
+
+ Tooltip.prototype.setContent = function () {
+ var $tip = this.tip()
+ var title = this.getTitle()
+
+ $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
+ $tip.removeClass('fade in top bottom left right')
+ }
+
+ Tooltip.prototype.hide = function () {
+ var that = this
+ var $tip = this.tip()
+ var e = $.Event('hide.bs.' + this.type)
+
+ function complete() {
+ if (that.hoverState != 'in') $tip.detach()
+ }
+
+ this.$element.trigger(e)
+
+ if (e.isDefaultPrevented()) return
+
+ $tip.removeClass('in')
+
+ $.support.transition && this.$tip.hasClass('fade') ?
+ $tip
+ .one($.support.transition.end, complete)
+ .emulateTransitionEnd(150) :
+ complete()
+
+ this.$element.trigger('hidden.bs.' + this.type)
+
+ return this
+ }
+
+ Tooltip.prototype.fixTitle = function () {
+ var $e = this.$element
+ if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') {
+ $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')
+ }
+ }
+
+ Tooltip.prototype.hasContent = function () {
+ return this.getTitle()
+ }
+
+ Tooltip.prototype.getPosition = function () {
+ var el = this.$element[0]
+ return $.extend({}, (typeof el.getBoundingClientRect == 'function') ? el.getBoundingClientRect() : {
+ width: el.offsetWidth
+ , height: el.offsetHeight
+ }, this.$element.offset())
+ }
+
+ Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {
+ return placement == 'bottom' ? { top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2 } :
+ placement == 'top' ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } :
+ placement == 'left' ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :
+ /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width }
+ }
+
+ Tooltip.prototype.getTitle = function () {
+ var title
+ var $e = this.$element
+ var o = this.options
+
+ title = $e.attr('data-original-title')
+ || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title)
+
+ return title
+ }
+
+ Tooltip.prototype.tip = function () {
+ return this.$tip = this.$tip || $(this.options.template)
+ }
+
+ Tooltip.prototype.arrow = function () {
+ return this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow')
+ }
+
+ Tooltip.prototype.validate = function () {
+ if (!this.$element[0].parentNode) {
+ this.hide()
+ this.$element = null
+ this.options = null
+ }
+ }
+
+ Tooltip.prototype.enable = function () {
+ this.enabled = true
+ }
+
+ Tooltip.prototype.disable = function () {
+ this.enabled = false
+ }
+
+ Tooltip.prototype.toggleEnabled = function () {
+ this.enabled = !this.enabled
+ }
+
+ Tooltip.prototype.toggle = function (e) {
+ var self = e ? $(e.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type) : this
+ self.tip().hasClass('in') ? self.leave(self) : self.enter(self)
+ }
+
+ Tooltip.prototype.destroy = function () {
+ this.hide().$element.off('.' + this.type).removeData('bs.' + this.type)
+ }
+
+
+ // TOOLTIP PLUGIN DEFINITION
+ // =========================
+
+ var old = $.fn.tooltip
+
+ $.fn.tooltip = function (option) {
+ return this.each(function () {
+ var $this = $(this)
+ var data = $this.data('bs.tooltip')
+ var options = typeof option == 'object' && option
+
+ if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))
+ if (typeof option == 'string') data[option]()
+ })
+ }
+
+ $.fn.tooltip.Constructor = Tooltip
+
+
+ // TOOLTIP NO CONFLICT
+ // ===================
+
+ $.fn.tooltip.noConflict = function () {
+ $.fn.tooltip = old
+ return this
+ }
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: popover.js v3.0.3
+ * http://getbootstrap.com/javascript/#popovers
+ * ========================================================================
+ * Copyright 2013 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ======================================================================== */
+
+
++function ($) { "use strict";
+
+ // POPOVER PUBLIC CLASS DEFINITION
+ // ===============================
+
+ var Popover = function (element, options) {
+ this.init('popover', element, options)
+ }
+
+ if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')
+
+ Popover.DEFAULTS = $.extend({} , $.fn.tooltip.Constructor.DEFAULTS, {
+ placement: 'right'
+ , trigger: 'click'
+ , content: ''
+ , template: '<div class="popover"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'
+ })
+
+
+ // NOTE: POPOVER EXTENDS tooltip.js
+ // ================================
+
+ Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)
+
+ Popover.prototype.constructor = Popover
+
+ Popover.prototype.getDefaults = function () {
+ return Popover.DEFAULTS
+ }
+
+ Popover.prototype.setContent = function () {
+ var $tip = this.tip()
+ var title = this.getTitle()
+ var content = this.getContent()
+
+ $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)
+ $tip.find('.popover-content')[this.options.html ? 'html' : 'text'](content)
+
+ $tip.removeClass('fade top bottom left right in')
+
+ // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do
+ // this manually by checking the contents.
+ if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide()
+ }
+
+ Popover.prototype.hasContent = function () {
+ return this.getTitle() || this.getContent()
+ }
+
+ Popover.prototype.getContent = function () {
+ var $e = this.$element
+ var o = this.options
+
+ return $e.attr('data-content')
+ || (typeof o.content == 'function' ?
+ o.content.call($e[0]) :
+ o.content)
+ }
+
+ Popover.prototype.arrow = function () {
+ return this.$arrow = this.$arrow || this.tip().find('.arrow')
+ }
+
+ Popover.prototype.tip = function () {
+ if (!this.$tip) this.$tip = $(this.options.template)
+ return this.$tip
+ }
+
+
+ // POPOVER PLUGIN DEFINITION
+ // =========================
+
+ var old = $.fn.popover
+
+ $.fn.popover = function (option) {
+ return this.each(function () {
+ var $this = $(this)
+ var data = $this.data('bs.popover')
+ var options = typeof option == 'object' && option
+
+ if (!data) $this.data('bs.popover', (data = new Popover(this, options)))
+ if (typeof option == 'string') data[option]()
+ })
+ }
+
+ $.fn.popover.Constructor = Popover
+
+
+ // POPOVER NO CONFLICT
+ // ===================
+
+ $.fn.popover.noConflict = function () {
+ $.fn.popover = old
+ return this
+ }
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: scrollspy.js v3.0.3
+ * http://getbootstrap.com/javascript/#scrollspy
+ * ========================================================================
+ * Copyright 2013 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ======================================================================== */
+
+
++function ($) { "use strict";
+
+ // SCROLLSPY CLASS DEFINITION
+ // ==========================
+
+ function ScrollSpy(element, options) {
+ var href
+ var process = $.proxy(this.process, this)
+
+ this.$element = $(element).is('body') ? $(window) : $(element)
+ this.$body = $('body')
+ this.$scrollElement = this.$element.on('scroll.bs.scroll-spy.data-api', process)
+ this.options = $.extend({}, ScrollSpy.DEFAULTS, options)
+ this.selector = (this.options.target
+ || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
+ || '') + ' .nav li > a'
+ this.offsets = $([])
+ this.targets = $([])
+ this.activeTarget = null
+
+ this.refresh()
+ this.process()
+ }
+
+ ScrollSpy.DEFAULTS = {
+ offset: 10
+ }
+
+ ScrollSpy.prototype.refresh = function () {
+ var offsetMethod = this.$element[0] == window ? 'offset' : 'position'
+
+ this.offsets = $([])
+ this.targets = $([])
+
+ var self = this
+ var $targets = this.$body
+ .find(this.selector)
+ .map(function () {
+ var $el = $(this)
+ var href = $el.data('target') || $el.attr('href')
+ var $href = /^#\w/.test(href) && $(href)
+
+ return ($href
+ && $href.length
+ && [[ $href[offsetMethod]().top + (!$.isWindow(self.$scrollElement.get(0)) && self.$scrollElement.scrollTop()), href ]]) || null
+ })
+ .sort(function (a, b) { return a[0] - b[0] })
+ .each(function () {
+ self.offsets.push(this[0])
+ self.targets.push(this[1])
+ })
+ }
+
+ ScrollSpy.prototype.process = function () {
+ var scrollTop = this.$scrollElement.scrollTop() + this.options.offset
+ var scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight
+ var maxScroll = scrollHeight - this.$scrollElement.height()
+ var offsets = this.offsets
+ var targets = this.targets
+ var activeTarget = this.activeTarget
+ var i
+
+ if (scrollTop >= maxScroll) {
+ return activeTarget != (i = targets.last()[0]) && this.activate(i)
+ }
+
+ for (i = offsets.length; i--;) {
+ activeTarget != targets[i]
+ && scrollTop >= offsets[i]
+ && (!offsets[i + 1] || scrollTop <= offsets[i + 1])
+ && this.activate( targets[i] )
+ }
+ }
+
+ ScrollSpy.prototype.activate = function (target) {
+ this.activeTarget = target
+
+ $(this.selector)
+ .parents('.active')
+ .removeClass('active')
+
+ var selector = this.selector
+ + '[data-target="' + target + '"],'
+ + this.selector + '[href="' + target + '"]'
+
+ var active = $(selector)
+ .parents('li')
+ .addClass('active')
+
+ if (active.parent('.dropdown-menu').length) {
+ active = active
+ .closest('li.dropdown')
+ .addClass('active')
+ }
+
+ active.trigger('activate.bs.scrollspy')
+ }
+
+
+ // SCROLLSPY PLUGIN DEFINITION
+ // ===========================
+
+ var old = $.fn.scrollspy
+
+ $.fn.scrollspy = function (option) {
+ return this.each(function () {
+ var $this = $(this)
+ var data = $this.data('bs.scrollspy')
+ var options = typeof option == 'object' && option
+
+ if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))
+ if (typeof option == 'string') data[option]()
+ })
+ }
+
+ $.fn.scrollspy.Constructor = ScrollSpy
+
+
+ // SCROLLSPY NO CONFLICT
+ // =====================
+
+ $.fn.scrollspy.noConflict = function () {
+ $.fn.scrollspy = old
+ return this
+ }
+
+
+ // SCROLLSPY DATA-API
+ // ==================
+
+ $(window).on('load', function () {
+ $('[data-spy="scroll"]').each(function () {
+ var $spy = $(this)
+ $spy.scrollspy($spy.data())
+ })
+ })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: tab.js v3.0.3
+ * http://getbootstrap.com/javascript/#tabs
+ * ========================================================================
+ * Copyright 2013 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ======================================================================== */
+
+
++function ($) { "use strict";
+
+ // TAB CLASS DEFINITION
+ // ====================
+
+ var Tab = function (element) {
+ this.element = $(element)
+ }
+
+ Tab.prototype.show = function () {
+ var $this = this.element
+ var $ul = $this.closest('ul:not(.dropdown-menu)')
+ var selector = $this.data('target')
+
+ if (!selector) {
+ selector = $this.attr('href')
+ selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
+ }
+
+ if ($this.parent('li').hasClass('active')) return
+
+ var previous = $ul.find('.active:last a')[0]
+ var e = $.Event('show.bs.tab', {
+ relatedTarget: previous
+ })
+
+ $this.trigger(e)
+
+ if (e.isDefaultPrevented()) return
+
+ var $target = $(selector)
+
+ this.activate($this.parent('li'), $ul)
+ this.activate($target, $target.parent(), function () {
+ $this.trigger({
+ type: 'shown.bs.tab'
+ , relatedTarget: previous
+ })
+ })
+ }
+
+ Tab.prototype.activate = function (element, container, callback) {
+ var $active = container.find('> .active')
+ var transition = callback
+ && $.support.transition
+ && $active.hasClass('fade')
+
+ function next() {
+ $active
+ .removeClass('active')
+ .find('> .dropdown-menu > .active')
+ .removeClass('active')
+
+ element.addClass('active')
+
+ if (transition) {
+ element[0].offsetWidth // reflow for transition
+ element.addClass('in')
+ } else {
+ element.removeClass('fade')
+ }
+
+ if (element.parent('.dropdown-menu')) {
+ element.closest('li.dropdown').addClass('active')
+ }
+
+ callback && callback()
+ }
+
+ transition ?
+ $active
+ .one($.support.transition.end, next)
+ .emulateTransitionEnd(150) :
+ next()
+
+ $active.removeClass('in')
+ }
+
+
+ // TAB PLUGIN DEFINITION
+ // =====================
+
+ var old = $.fn.tab
+
+ $.fn.tab = function ( option ) {
+ return this.each(function () {
+ var $this = $(this)
+ var data = $this.data('bs.tab')
+
+ if (!data) $this.data('bs.tab', (data = new Tab(this)))
+ if (typeof option == 'string') data[option]()
+ })
+ }
+
+ $.fn.tab.Constructor = Tab
+
+
+ // TAB NO CONFLICT
+ // ===============
+
+ $.fn.tab.noConflict = function () {
+ $.fn.tab = old
+ return this
+ }
+
+
+ // TAB DATA-API
+ // ============
+
+ $(document).on('click.bs.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) {
+ e.preventDefault()
+ $(this).tab('show')
+ })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: affix.js v3.0.3
+ * http://getbootstrap.com/javascript/#affix
+ * ========================================================================
+ * Copyright 2013 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ======================================================================== */
+
+
++function ($) { "use strict";
+
+ // AFFIX CLASS DEFINITION
+ // ======================
+
+ var Affix = function (element, options) {
+ this.options = $.extend({}, Affix.DEFAULTS, options)
+ this.$window = $(window)
+ .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))
+ .on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop, this))
+
+ this.$element = $(element)
+ this.affixed =
+ this.unpin = null
+
+ this.checkPosition()
+ }
+
+ Affix.RESET = 'affix affix-top affix-bottom'
+
+ Affix.DEFAULTS = {
+ offset: 0
+ }
+
+ Affix.prototype.checkPositionWithEventLoop = function () {
+ setTimeout($.proxy(this.checkPosition, this), 1)
+ }
+
+ Affix.prototype.checkPosition = function () {
+ if (!this.$element.is(':visible')) return
+
+ var scrollHeight = $(document).height()
+ var scrollTop = this.$window.scrollTop()
+ var position = this.$element.offset()
+ var offset = this.options.offset
+ var offsetTop = offset.top
+ var offsetBottom = offset.bottom
+
+ if (typeof offset != 'object') offsetBottom = offsetTop = offset
+ if (typeof offsetTop == 'function') offsetTop = offset.top()
+ if (typeof offsetBottom == 'function') offsetBottom = offset.bottom()
+
+ var affix = this.unpin != null && (scrollTop + this.unpin <= position.top) ? false :
+ offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ? 'bottom' :
+ offsetTop != null && (scrollTop <= offsetTop) ? 'top' : false
+
+ if (this.affixed === affix) return
+ if (this.unpin) this.$element.css('top', '')
+
+ this.affixed = affix
+ this.unpin = affix == 'bottom' ? position.top - scrollTop : null
+
+ this.$element.removeClass(Affix.RESET).addClass('affix' + (affix ? '-' + affix : ''))
+
+ if (affix == 'bottom') {
+ this.$element.offset({ top: document.body.offsetHeight - offsetBottom - this.$element.height() })
+ }
+ }
+
+
+ // AFFIX PLUGIN DEFINITION
+ // =======================
+
+ var old = $.fn.affix
+
+ $.fn.affix = function (option) {
+ return this.each(function () {
+ var $this = $(this)
+ var data = $this.data('bs.affix')
+ var options = typeof option == 'object' && option
+
+ if (!data) $this.data('bs.affix', (data = new Affix(this, options)))
+ if (typeof option == 'string') data[option]()
+ })
+ }
+
+ $.fn.affix.Constructor = Affix
+
+
+ // AFFIX NO CONFLICT
+ // =================
+
+ $.fn.affix.noConflict = function () {
+ $.fn.affix = old
+ return this
+ }
+
+
+ // AFFIX DATA-API
+ // ==============
+
+ $(window).on('load', function () {
+ $('[data-spy="affix"]').each(function () {
+ var $spy = $(this)
+ var data = $spy.data()
+
+ data.offset = data.offset || {}
+
+ if (data.offsetBottom) data.offset.bottom = data.offsetBottom
+ if (data.offsetTop) data.offset.top = data.offsetTop
+
+ $spy.affix(data)
+ })
+ })
+
+}(jQuery);
diff --git a/library/bootstrap/js/bootstrap.min.js b/library/bootstrap/js/bootstrap.min.js
new file mode 100644
index 000000000..1a6258efc
--- /dev/null
+++ b/library/bootstrap/js/bootstrap.min.js
@@ -0,0 +1,7 @@
+/*!
+ * Bootstrap v3.0.3 (http://getbootstrap.com)
+ * Copyright 2013 Twitter, Inc.
+ * Licensed under http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+if("undefined"==typeof jQuery)throw new Error("Bootstrap requires jQuery");+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]}}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one(a.support.transition.end,function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b()})}(jQuery),+function(a){"use strict";var b='[data-dismiss="alert"]',c=function(c){a(c).on("click",b,this.close)};c.prototype.close=function(b){function c(){f.trigger("closed.bs.alert").remove()}var d=a(this),e=d.attr("data-target");e||(e=d.attr("href"),e=e&&e.replace(/.*(?=#[^\s]*$)/,""));var f=a(e);b&&b.preventDefault(),f.length||(f=d.hasClass("alert")?d:d.parent()),f.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one(a.support.transition.end,c).emulateTransitionEnd(150):c())};var d=a.fn.alert;a.fn.alert=function(b){return this.each(function(){var d=a(this),e=d.data("bs.alert");e||d.data("bs.alert",e=new c(this)),"string"==typeof b&&e[b].call(d)})},a.fn.alert.Constructor=c,a.fn.alert.noConflict=function(){return a.fn.alert=d,this},a(document).on("click.bs.alert.data-api",b,c.prototype.close)}(jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d)};b.DEFAULTS={loadingText:"loading..."},b.prototype.setState=function(a){var b="disabled",c=this.$element,d=c.is("input")?"val":"html",e=c.data();a+="Text",e.resetText||c.data("resetText",c[d]()),c[d](e[a]||this.options[a]),setTimeout(function(){"loadingText"==a?c.addClass(b).attr(b,b):c.removeClass(b).removeAttr(b)},0)},b.prototype.toggle=function(){var a=this.$element.closest('[data-toggle="buttons"]'),b=!0;if(a.length){var c=this.$element.find("input");"radio"===c.prop("type")&&(c.prop("checked")&&this.$element.hasClass("active")?b=!1:a.find(".active").removeClass("active")),b&&c.prop("checked",!this.$element.hasClass("active")).trigger("change")}b&&this.$element.toggleClass("active")};var c=a.fn.button;a.fn.button=function(c){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof c&&c;e||d.data("bs.button",e=new b(this,f)),"toggle"==c?e.toggle():c&&e.setState(c)})},a.fn.button.Constructor=b,a.fn.button.noConflict=function(){return a.fn.button=c,this},a(document).on("click.bs.button.data-api","[data-toggle^=button]",function(b){var c=a(b.target);c.hasClass("btn")||(c=c.closest(".btn")),c.button("toggle"),b.preventDefault()})}(jQuery),+function(a){"use strict";var b=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=this.sliding=this.interval=this.$active=this.$items=null,"hover"==this.options.pause&&this.$element.on("mouseenter",a.proxy(this.pause,this)).on("mouseleave",a.proxy(this.cycle,this))};b.DEFAULTS={interval:5e3,pause:"hover",wrap:!0},b.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},b.prototype.getActiveIndex=function(){return this.$active=this.$element.find(".item.active"),this.$items=this.$active.parent().children(),this.$items.index(this.$active)},b.prototype.to=function(b){var c=this,d=this.getActiveIndex();return b>this.$items.length-1||0>b?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){c.to(b)}):d==b?this.pause().cycle():this.slide(b>d?"next":"prev",a(this.$items[b]))},b.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition.end&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},b.prototype.next=function(){return this.sliding?void 0:this.slide("next")},b.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},b.prototype.slide=function(b,c){var d=this.$element.find(".item.active"),e=c||d[b](),f=this.interval,g="next"==b?"left":"right",h="next"==b?"first":"last",i=this;if(!e.length){if(!this.options.wrap)return;e=this.$element.find(".item")[h]()}this.sliding=!0,f&&this.pause();var j=a.Event("slide.bs.carousel",{relatedTarget:e[0],direction:g});if(!e.hasClass("active")){if(this.$indicators.length&&(this.$indicators.find(".active").removeClass("active"),this.$element.one("slid.bs.carousel",function(){var b=a(i.$indicators.children()[i.getActiveIndex()]);b&&b.addClass("active")})),a.support.transition&&this.$element.hasClass("slide")){if(this.$element.trigger(j),j.isDefaultPrevented())return;e.addClass(b),e[0].offsetWidth,d.addClass(g),e.addClass(g),d.one(a.support.transition.end,function(){e.removeClass([b,g].join(" ")).addClass("active"),d.removeClass(["active",g].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger("slid.bs.carousel")},0)}).emulateTransitionEnd(600)}else{if(this.$element.trigger(j),j.isDefaultPrevented())return;d.removeClass("active"),e.addClass("active"),this.sliding=!1,this.$element.trigger("slid.bs.carousel")}return f&&this.cycle(),this}};var c=a.fn.carousel;a.fn.carousel=function(c){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},b.DEFAULTS,d.data(),"object"==typeof c&&c),g="string"==typeof c?c:f.slide;e||d.data("bs.carousel",e=new b(this,f)),"number"==typeof c?e.to(c):g?e[g]():f.interval&&e.pause().cycle()})},a.fn.carousel.Constructor=b,a.fn.carousel.noConflict=function(){return a.fn.carousel=c,this},a(document).on("click.bs.carousel.data-api","[data-slide], [data-slide-to]",function(b){var c,d=a(this),e=a(d.attr("data-target")||(c=d.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"")),f=a.extend({},e.data(),d.data()),g=d.attr("data-slide-to");g&&(f.interval=!1),e.carousel(f),(g=d.attr("data-slide-to"))&&e.data("bs.carousel").to(g),b.preventDefault()}),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var b=a(this);b.carousel(b.data())})})}(jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d),this.transitioning=null,this.options.parent&&(this.$parent=a(this.options.parent)),this.options.toggle&&this.toggle()};b.DEFAULTS={toggle:!0},b.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},b.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b=a.Event("show.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.$parent&&this.$parent.find("> .panel > .in");if(c&&c.length){var d=c.data("bs.collapse");if(d&&d.transitioning)return;c.collapse("hide"),d||c.data("bs.collapse",null)}var e=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[e](0),this.transitioning=1;var f=function(){this.$element.removeClass("collapsing").addClass("in")[e]("auto"),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return f.call(this);var g=a.camelCase(["scroll",e].join("-"));this.$element.one(a.support.transition.end,a.proxy(f,this)).emulateTransitionEnd(350)[e](this.$element[0][g])}}},b.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse").removeClass("in"),this.transitioning=1;var d=function(){this.transitioning=0,this.$element.trigger("hidden.bs.collapse").removeClass("collapsing").addClass("collapse")};return a.support.transition?(this.$element[c](0).one(a.support.transition.end,a.proxy(d,this)).emulateTransitionEnd(350),void 0):d.call(this)}}},b.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()};var c=a.fn.collapse;a.fn.collapse=function(c){return this.each(function(){var d=a(this),e=d.data("bs.collapse"),f=a.extend({},b.DEFAULTS,d.data(),"object"==typeof c&&c);e||d.data("bs.collapse",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.collapse.Constructor=b,a.fn.collapse.noConflict=function(){return a.fn.collapse=c,this},a(document).on("click.bs.collapse.data-api","[data-toggle=collapse]",function(b){var c,d=a(this),e=d.attr("data-target")||b.preventDefault()||(c=d.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,""),f=a(e),g=f.data("bs.collapse"),h=g?"toggle":d.data(),i=d.attr("data-parent"),j=i&&a(i);g&&g.transitioning||(j&&j.find('[data-toggle=collapse][data-parent="'+i+'"]').not(d).addClass("collapsed"),d[f.hasClass("in")?"addClass":"removeClass"]("collapsed")),f.collapse(h)})}(jQuery),+function(a){"use strict";function b(){a(d).remove(),a(e).each(function(b){var d=c(a(this));d.hasClass("open")&&(d.trigger(b=a.Event("hide.bs.dropdown")),b.isDefaultPrevented()||d.removeClass("open").trigger("hidden.bs.dropdown"))})}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}var d=".dropdown-backdrop",e="[data-toggle=dropdown]",f=function(b){a(b).on("click.bs.dropdown",this.toggle)};f.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){if("ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a('<div class="dropdown-backdrop"/>').insertAfter(a(this)).on("click",b),f.trigger(d=a.Event("show.bs.dropdown")),d.isDefaultPrevented())return;f.toggleClass("open").trigger("shown.bs.dropdown"),e.focus()}return!1}},f.prototype.keydown=function(b){if(/(38|40|27)/.test(b.keyCode)){var d=a(this);if(b.preventDefault(),b.stopPropagation(),!d.is(".disabled, :disabled")){var f=c(d),g=f.hasClass("open");if(!g||g&&27==b.keyCode)return 27==b.which&&f.find(e).focus(),d.click();var h=a("[role=menu] li:not(.divider):visible a",f);if(h.length){var i=h.index(h.filter(":focus"));38==b.keyCode&&i>0&&i--,40==b.keyCode&&i<h.length-1&&i++,~i||(i=0),h.eq(i).focus()}}}};var g=a.fn.dropdown;a.fn.dropdown=function(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new f(this)),"string"==typeof b&&d[b].call(c)})},a.fn.dropdown.Constructor=f,a.fn.dropdown.noConflict=function(){return a.fn.dropdown=g,this},a(document).on("click.bs.dropdown.data-api",b).on("click.bs.dropdown.data-api",".dropdown form",function(a){a.stopPropagation()}).on("click.bs.dropdown.data-api",e,f.prototype.toggle).on("keydown.bs.dropdown.data-api",e+", [role=menu]",f.prototype.keydown)}(jQuery),+function(a){"use strict";var b=function(b,c){this.options=c,this.$element=a(b),this.$backdrop=this.isShown=null,this.options.remote&&this.$element.load(this.options.remote)};b.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},b.prototype.toggle=function(a){return this[this.isShown?"hide":"show"](a)},b.prototype.show=function(b){var c=this,d=a.Event("show.bs.modal",{relatedTarget:b});this.$element.trigger(d),this.isShown||d.isDefaultPrevented()||(this.isShown=!0,this.escape(),this.$element.on("click.dismiss.modal",'[data-dismiss="modal"]',a.proxy(this.hide,this)),this.backdrop(function(){var d=a.support.transition&&c.$element.hasClass("fade");c.$element.parent().length||c.$element.appendTo(document.body),c.$element.show(),d&&c.$element[0].offsetWidth,c.$element.addClass("in").attr("aria-hidden",!1),c.enforceFocus();var e=a.Event("shown.bs.modal",{relatedTarget:b});d?c.$element.find(".modal-dialog").one(a.support.transition.end,function(){c.$element.focus().trigger(e)}).emulateTransitionEnd(300):c.$element.focus().trigger(e)}))},b.prototype.hide=function(b){b&&b.preventDefault(),b=a.Event("hide.bs.modal"),this.$element.trigger(b),this.isShown&&!b.isDefaultPrevented()&&(this.isShown=!1,this.escape(),a(document).off("focusin.bs.modal"),this.$element.removeClass("in").attr("aria-hidden",!0).off("click.dismiss.modal"),a.support.transition&&this.$element.hasClass("fade")?this.$element.one(a.support.transition.end,a.proxy(this.hideModal,this)).emulateTransitionEnd(300):this.hideModal())},b.prototype.enforceFocus=function(){a(document).off("focusin.bs.modal").on("focusin.bs.modal",a.proxy(function(a){this.$element[0]===a.target||this.$element.has(a.target).length||this.$element.focus()},this))},b.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("keyup.dismiss.bs.modal",a.proxy(function(a){27==a.which&&this.hide()},this)):this.isShown||this.$element.off("keyup.dismiss.bs.modal")},b.prototype.hideModal=function(){var a=this;this.$element.hide(),this.backdrop(function(){a.removeBackdrop(),a.$element.trigger("hidden.bs.modal")})},b.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},b.prototype.backdrop=function(b){var c=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var d=a.support.transition&&c;if(this.$backdrop=a('<div class="modal-backdrop '+c+'" />').appendTo(document.body),this.$element.on("click.dismiss.modal",a.proxy(function(a){a.target===a.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus.call(this.$element[0]):this.hide.call(this))},this)),d&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!b)return;d?this.$backdrop.one(a.support.transition.end,b).emulateTransitionEnd(150):b()}else!this.isShown&&this.$backdrop?(this.$backdrop.removeClass("in"),a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one(a.support.transition.end,b).emulateTransitionEnd(150):b()):b&&b()};var c=a.fn.modal;a.fn.modal=function(c,d){return this.each(function(){var e=a(this),f=e.data("bs.modal"),g=a.extend({},b.DEFAULTS,e.data(),"object"==typeof c&&c);f||e.data("bs.modal",f=new b(this,g)),"string"==typeof c?f[c](d):g.show&&f.show(d)})},a.fn.modal.Constructor=b,a.fn.modal.noConflict=function(){return a.fn.modal=c,this},a(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(b){var c=a(this),d=c.attr("href"),e=a(c.attr("data-target")||d&&d.replace(/.*(?=#[^\s]+$)/,"")),f=e.data("modal")?"toggle":a.extend({remote:!/#/.test(d)&&d},e.data(),c.data());b.preventDefault(),e.modal(f,this).one("hide",function(){c.is(":visible")&&c.focus()})}),a(document).on("show.bs.modal",".modal",function(){a(document.body).addClass("modal-open")}).on("hidden.bs.modal",".modal",function(){a(document.body).removeClass("modal-open")})}(jQuery),+function(a){"use strict";var b=function(a,b){this.type=this.options=this.enabled=this.timeout=this.hoverState=this.$element=null,this.init("tooltip",a,b)};b.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1},b.prototype.init=function(b,c,d){this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d);for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focus",i="hover"==g?"mouseleave":"blur";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},b.prototype.getDefaults=function(){return b.DEFAULTS},b.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},b.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},b.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget)[this.type](this.getDelegateOptions()).data("bs."+this.type);return clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show),void 0):c.show()},b.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget)[this.type](this.getDelegateOptions()).data("bs."+this.type);return clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide),void 0):c.hide()},b.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){if(this.$element.trigger(b),b.isDefaultPrevented())return;var c=this.tip();this.setContent(),this.options.animation&&c.addClass("fade");var d="function"==typeof this.options.placement?this.options.placement.call(this,c[0],this.$element[0]):this.options.placement,e=/\s?auto?\s?/i,f=e.test(d);f&&(d=d.replace(e,"")||"top"),c.detach().css({top:0,left:0,display:"block"}).addClass(d),this.options.container?c.appendTo(this.options.container):c.insertAfter(this.$element);var g=this.getPosition(),h=c[0].offsetWidth,i=c[0].offsetHeight;if(f){var j=this.$element.parent(),k=d,l=document.documentElement.scrollTop||document.body.scrollTop,m="body"==this.options.container?window.innerWidth:j.outerWidth(),n="body"==this.options.container?window.innerHeight:j.outerHeight(),o="body"==this.options.container?0:j.offset().left;d="bottom"==d&&g.top+g.height+i-l>n?"top":"top"==d&&g.top-l-i<0?"bottom":"right"==d&&g.right+h>m?"left":"left"==d&&g.left-h<o?"right":d,c.removeClass(k).addClass(d)}var p=this.getCalculatedOffset(d,g,h,i);this.applyPlacement(p,d),this.$element.trigger("shown.bs."+this.type)}},b.prototype.applyPlacement=function(a,b){var c,d=this.tip(),e=d[0].offsetWidth,f=d[0].offsetHeight,g=parseInt(d.css("margin-top"),10),h=parseInt(d.css("margin-left"),10);isNaN(g)&&(g=0),isNaN(h)&&(h=0),a.top=a.top+g,a.left=a.left+h,d.offset(a).addClass("in");var i=d[0].offsetWidth,j=d[0].offsetHeight;if("top"==b&&j!=f&&(c=!0,a.top=a.top+f-j),/bottom|top/.test(b)){var k=0;a.left<0&&(k=-2*a.left,a.left=0,d.offset(a),i=d[0].offsetWidth,j=d[0].offsetHeight),this.replaceArrow(k-e+i,i,"left")}else this.replaceArrow(j-f,j,"top");c&&d.offset(a)},b.prototype.replaceArrow=function(a,b,c){this.arrow().css(c,a?50*(1-a/b)+"%":"")},b.prototype.setContent=function(){var a=this.tip(),b=this.getTitle();a.find(".tooltip-inner")[this.options.html?"html":"text"](b),a.removeClass("fade in top bottom left right")},b.prototype.hide=function(){function b(){"in"!=c.hoverState&&d.detach()}var c=this,d=this.tip(),e=a.Event("hide.bs."+this.type);return this.$element.trigger(e),e.isDefaultPrevented()?void 0:(d.removeClass("in"),a.support.transition&&this.$tip.hasClass("fade")?d.one(a.support.transition.end,b).emulateTransitionEnd(150):b(),this.$element.trigger("hidden.bs."+this.type),this)},b.prototype.fixTitle=function(){var a=this.$element;(a.attr("title")||"string"!=typeof a.attr("data-original-title"))&&a.attr("data-original-title",a.attr("title")||"").attr("title","")},b.prototype.hasContent=function(){return this.getTitle()},b.prototype.getPosition=function(){var b=this.$element[0];return a.extend({},"function"==typeof b.getBoundingClientRect?b.getBoundingClientRect():{width:b.offsetWidth,height:b.offsetHeight},this.$element.offset())},b.prototype.getCalculatedOffset=function(a,b,c,d){return"bottom"==a?{top:b.top+b.height,left:b.left+b.width/2-c/2}:"top"==a?{top:b.top-d,left:b.left+b.width/2-c/2}:"left"==a?{top:b.top+b.height/2-d/2,left:b.left-c}:{top:b.top+b.height/2-d/2,left:b.left+b.width}},b.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},b.prototype.tip=function(){return this.$tip=this.$tip||a(this.options.template)},b.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},b.prototype.validate=function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},b.prototype.enable=function(){this.enabled=!0},b.prototype.disable=function(){this.enabled=!1},b.prototype.toggleEnabled=function(){this.enabled=!this.enabled},b.prototype.toggle=function(b){var c=b?a(b.currentTarget)[this.type](this.getDelegateOptions()).data("bs."+this.type):this;c.tip().hasClass("in")?c.leave(c):c.enter(c)},b.prototype.destroy=function(){this.hide().$element.off("."+this.type).removeData("bs."+this.type)};var c=a.fn.tooltip;a.fn.tooltip=function(c){return this.each(function(){var d=a(this),e=d.data("bs.tooltip"),f="object"==typeof c&&c;e||d.data("bs.tooltip",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.tooltip.Constructor=b,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=c,this}}(jQuery),+function(a){"use strict";var b=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");b.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:'<div class="popover"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),b.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),b.prototype.constructor=b,b.prototype.getDefaults=function(){return b.DEFAULTS},b.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content")[this.options.html?"html":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},b.prototype.hasContent=function(){return this.getTitle()||this.getContent()},b.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},b.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")},b.prototype.tip=function(){return this.$tip||(this.$tip=a(this.options.template)),this.$tip};var c=a.fn.popover;a.fn.popover=function(c){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof c&&c;e||d.data("bs.popover",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.popover.Constructor=b,a.fn.popover.noConflict=function(){return a.fn.popover=c,this}}(jQuery),+function(a){"use strict";function b(c,d){var e,f=a.proxy(this.process,this);this.$element=a(c).is("body")?a(window):a(c),this.$body=a("body"),this.$scrollElement=this.$element.on("scroll.bs.scroll-spy.data-api",f),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||(e=a(c).attr("href"))&&e.replace(/.*(?=#[^\s]+$)/,"")||"")+" .nav li > a",this.offsets=a([]),this.targets=a([]),this.activeTarget=null,this.refresh(),this.process()}b.DEFAULTS={offset:10},b.prototype.refresh=function(){var b=this.$element[0]==window?"offset":"position";this.offsets=a([]),this.targets=a([]);var c=this;this.$body.find(this.selector).map(function(){var d=a(this),e=d.data("target")||d.attr("href"),f=/^#\w/.test(e)&&a(e);return f&&f.length&&[[f[b]().top+(!a.isWindow(c.$scrollElement.get(0))&&c.$scrollElement.scrollTop()),e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){c.offsets.push(this[0]),c.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.$scrollElement[0].scrollHeight||this.$body[0].scrollHeight,d=c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(b>=d)return g!=(a=f.last()[0])&&this.activate(a);for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(!e[a+1]||b<=e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarget=b,a(this.selector).parents(".active").removeClass("active");var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active");d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")),d.trigger("activate.bs.scrollspy")};var c=a.fn.scrollspy;a.fn.scrollspy=function(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=c,this},a(window).on("load",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);b.scrollspy(b.data())})})}(jQuery),+function(a){"use strict";var b=function(b){this.element=a(b)};b.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.data("target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){var e=c.find(".active:last a")[0],f=a.Event("show.bs.tab",{relatedTarget:e});if(b.trigger(f),!f.isDefaultPrevented()){var g=a(d);this.activate(b.parent("li"),c),this.activate(g,g.parent(),function(){b.trigger({type:"shown.bs.tab",relatedTarget:e})})}}},b.prototype.activate=function(b,c,d){function e(){f.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),b.addClass("active"),g?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu")&&b.closest("li.dropdown").addClass("active"),d&&d()}var f=c.find("> .active"),g=d&&a.support.transition&&f.hasClass("fade");g?f.one(a.support.transition.end,e).emulateTransitionEnd(150):e(),f.removeClass("in")};var c=a.fn.tab;a.fn.tab=function(c){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new b(this)),"string"==typeof c&&e[c]()})},a.fn.tab.Constructor=b,a.fn.tab.noConflict=function(){return a.fn.tab=c,this},a(document).on("click.bs.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(b){b.preventDefault(),a(this).tab("show")})}(jQuery),+function(a){"use strict";var b=function(c,d){this.options=a.extend({},b.DEFAULTS,d),this.$window=a(window).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(c),this.affixed=this.unpin=null,this.checkPosition()};b.RESET="affix affix-top affix-bottom",b.DEFAULTS={offset:0},b.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},b.prototype.checkPosition=function(){if(this.$element.is(":visible")){var c=a(document).height(),d=this.$window.scrollTop(),e=this.$element.offset(),f=this.options.offset,g=f.top,h=f.bottom;"object"!=typeof f&&(h=g=f),"function"==typeof g&&(g=f.top()),"function"==typeof h&&(h=f.bottom());var i=null!=this.unpin&&d+this.unpin<=e.top?!1:null!=h&&e.top+this.$element.height()>=c-h?"bottom":null!=g&&g>=d?"top":!1;this.affixed!==i&&(this.unpin&&this.$element.css("top",""),this.affixed=i,this.unpin="bottom"==i?e.top-d:null,this.$element.removeClass(b.RESET).addClass("affix"+(i?"-"+i:"")),"bottom"==i&&this.$element.offset({top:document.body.offsetHeight-h-this.$element.height()}))}};var c=a.fn.affix;a.fn.affix=function(c){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof c&&c;e||d.data("bs.affix",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.affix.Constructor=b,a.fn.affix.noConflict=function(){return a.fn.affix=c,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var b=a(this),c=b.data();c.offset=c.offset||{},c.offsetBottom&&(c.offset.bottom=c.offsetBottom),c.offsetTop&&(c.offset.top=c.offsetTop),b.affix(c)})})}(jQuery); \ No newline at end of file
diff --git a/library/colorbox/README.md b/library/colorbox/README.md
new file mode 100644
index 000000000..bc002381e
--- /dev/null
+++ b/library/colorbox/README.md
@@ -0,0 +1,376 @@
+## About ColorBox:
+A customizable lightbox plugin for jQuery. See the [project page](http://jacklmoore.com/colorbox/) for documentation and a demonstration, and the [FAQ](http://jacklmoore.com/colorbox/faq/) for solutions and examples to common issues. Released under the [MIT license](http://www.opensource.org/licenses/mit-license.php).
+
+## Translations Welcome
+Send me your language configuration files. See /i18n/jquery.colorbox-de.js as an example.
+
+## Changelog:
+
+### Version 1.3.32 - 2013/1/31
+
+* Improved internal event subscribing & fixed event bug introduced in v1.3.21
+
+### Version 1.3.31 - 2013/1/28
+
+* Fixed a size-calculation bug introduced in the previous commit.
+
+### Version 1.3.30 - 2013/1/25
+
+* Delayed border-width calculations until after opening, to avoid a bug in FF when using ColorBox in a hidden iframe.
+
+### Version 1.3.29 - 2013/1/24
+
+* Fixes bug with bubbling delegated events, introduced in the previous commit.
+
+### Version 1.3.28 - 2013/1/24
+
+* Fixed compatibility issue with old versions of jQuery (1.3.2-1.4.2)
+
+### Version 1.3.27 - 2013/1/23
+
+* Added className property.
+
+### Version 1.3.26 - 2013/1/23
+
+* Minor bugfix: clear the onload event handler after photo has loaded.
+
+### Version 1.3.25 - 2013/1/23
+
+* Removed grunt file & added Bower component.json.
+
+### Version 1.3.24 - 2013/1/22
+
+* Added generated files (jquery.colorbox.js / jquery.colorbox-min.js) back to the repository.
+
+### Version 1.3.23 - 2013/1/18
+
+* Minor bugfix for calling ColorBox on empty jQuery collections without a selector.
+
+### Version 1.3.22 - 2013/1/17
+
+* Recommit for plugins.jquery.com
+
+### Version 1.3.21 - 2013/1/15
+Files Changed: *.js
+
+* Fixed compatability issues with jQuery 1.9
+
+### Version 1.3.20 - August 15 2012
+Files Changed:jquery.colorbox.js
+
+* Added temporary workaround for jQuery-UI 1.8 bug (http://bugs.jquery.com/ticket/12273)
+* Added *.jpe extension to the list of image types.
+
+### Version 1.3.19 - December 08 2011
+Files Changed:jquery.colorbox.js, colorbox.css (all)
+
+* Fixed bug related to using the 'fixed' property.
+* Optimized the setup procedure to be more efficient.
+* Removed $.colorbox.init() as it will no longer be needed (will self-init when called).
+* Removed use of $.browser.
+
+### Version 1.3.18 - October 07 2011
+Files Changed:jquery.colorbox.js/jquery.colorbox-min.js, colorbox.css (all) and example 1's controls.png
+
+* Fixed a regression where Flash content displayed in ColorBox would be reloaded if the browser window was resized.
+* Added safety check to make sure that ColorBox's markup is only added to the DOM a single time, even if $.colorbox.init() is called multiple times. This will allow site owners to manually initialize ColorBox if they need it before the DOM has finished loading.
+* Updated the example index.html files to be HTML5 compliant.
+* Changed the slideshow behavior so that it immediately moves to the next slide when the slideshow is started.
+* Minor regex bugfix to allow automatic detection of image URLs that include fragments.
+
+### Version 1.3.17 - May 11 2011
+Files Changed:jquery.colorbox.js/jquery.colorbox-min.js
+
+* Added properties "top", "bottom", "left" and "right" to specify a position relative to the viewport, rather than using the default centering.
+* Added property "data" to specify GET or POST data when using Ajax. ColorBox's ajax functionality is handled by jQuery's .load() method, so the data property works the same way as it does with .load().
+* Added property "fixed" which can provide fixed positioning for ColorBox, rather than absolute positioning. This will allow ColorBox to remain in a fixed position within the visitors viewport, despite scrolling. IE6 support for this was not added, it will continue to use the default absolute positioning.
+* Fixed ClearType problem with IE7.
+* Minor fixes.
+
+### Version 1.3.16 - March 01 2011
+Files Changed:jquery.colorbox.js/jquery.colorbox-min.js, colorbox.css (all) and example 4 background png files
+
+* Better IE related transparency workarounds. IE7 and up now uses the same background image sprite as other browsers.
+* Added error handling for broken image links. A message will be displayed telling the user that the image could not be loaded.
+* Added new property: 'fastIframe' and set it to true by default. Setting to fastIframe:false will delay the loading graphic removal and onComplete event until iframe has completely loaded.
+* Ability to redefine $.colorbox.close (or prev, or next) at any time.
+
+### Version 1.3.15 - October 27 2010
+Files Changed: jquery.colorbox.js/jquery.colorbox-min.js
+
+* Minor fixes for specific cases.
+
+### Version 1.3.14 - October 27 2010
+Files Changed: jquery.colorbox.js/jquery.colorbox-min.js
+
+* In IE6, closing an iframe when using HTTPS no longer generates a security warning.
+
+### Version 1.3.13 - October 22 2010
+Files Changed: jquery.colorbox.js/jquery.colorbox-min.js
+
+* Changed the index.html example files to use YouTube's new embedded link format.
+* By default, ColorBox returns focus to the element it was launched from once it closes. This can now be disabled by setting the 'returnFocus' property to false. Focus was causing problems for some users who had their anchor elements inside animated containers.
+* Minor bug fix involved in using a combination of slideshow and non-slideshow content.
+
+### Version 1.3.12 - October 20 2010
+Files Changed: jquery.colorbox.js/jquery.colorbox-min.js
+
+* Minor bug fix involved in preloading images when using a function as a value for the href property.
+
+### Version 1.3.11 - October 19 2010
+Files Changed: jquery.colorbox.js/jquery.colorbox-min.js
+
+* Fixed the slideshow functionality that broke with 1.3.10
+* The slideshow now respects the loop property.
+
+### Version 1.3.10 - October 16 2010
+Files Changed: jquery.colorbox.js/jquery.colorbox-min.js
+
+* Fixed compatibility with jQuery 1.4.3
+* The 'open' property now accepts a function as a value, like all of the other properties.
+* Preloading now loads the correct href for images when using a dynamic (function) value for the href property.
+* Fixed bug in Safari 3 for Win where ColorBox centered on the document, rather than the visitor's viewport.
+* May have fixed an issue in Opera 10.6+ where ColorBox would rarely/randomly freeze up while switching between photos in a group.
+* Some functionality better encapsulated & minor performance improvements.
+
+### Version 1.3.9 - July 7 2010
+Files Changed: jquery.colorbox.js/jquery.colorbox-min.js/ all colorbox.css (the core styles)
+
+* Fixed a problem where iframed youtube videos would cause a security alert in IE.
+* More code is event driven now, making the source easier to grasp.
+* Removed some unnecessary style from the core CSS.
+
+### Version 1.3.8 - June 21 2010
+Files Changed: jquery.colorbox.js/jquery.colorbox-min.js
+
+* Fixed a bug in Chrome where it would sometimes render photos at 0 by 0 width and height (behavior introduced in recent update to Chrome).
+* Fixed a bug where the onClosed callback would fire twice (only affected 1.3.7).
+* Fixed a bug in IE7 that existed with some iframed websites that use JS to reposition the viewport caused ColorBox to move out of position.
+* Abstracted the identifiers (HTML ids & classes, and JS plugin name, method, and events) so that the plugin can be easily rebranded.
+* Small changes to improve either code readability or compression.
+
+### Version 1.3.7 - June 13 2010
+Files Changed: jquery.colorbox.js/jquery.colorbox-min.js/index.html
+
+* $.colorbox can now be used for direct calls and accessing public methods. Example: $.colorbox.close();
+* Resize now accepts 'width', 'innerWidth', 'height' and 'innerHeight'. Example: $.colorbox.resize({width:"100%"})
+* Added option (loop:false) to disable looping in a group.
+* Added options (escKey:false, arrowKey:false) to disable esc-key and arrow-key bindings.
+* Added method for removing ColorBox from a document: $.colorbox.remove();
+* Fixed a bug where iframed URLs would be truncated if they contained an unencoded apostrophe.
+* Now uses the exact href specified on an anchor, rather than the version returned by 'this.href'. This was causing "#example" to be normalized to "http://domain/#example" which interfered with how some users were setting up links to inline content.
+* Changed example documents over to HTML5.
+
+### Version 1.3.6 - Jan 13 2010
+Files Changed: jquery.colorbox.js/jquery.colorbox-min.js
+
+* Small change to make ColorBox compatible with jQuery 1.4
+
+### Version 1.3.5 - December 15 2009
+Files Changed: jquery.colorbox.js/jquery.colorbox-min.js
+
+* Fixed a bug introduced in 1.3.4 with IE7's display of example 2 and 3, and auto-width in Opera.
+* Fixed a bug introduced in 1.3.4 where colorbox could not be launched by triggering an element's click event through JavaScript.
+* Minor refinements.
+
+### Version 1.3.4 - December 5 2009
+Files Changed: jquery.colorbox.js/jquery.colorbox-min.js
+
+* Event delegation is now used for elements that ColorBox is assigned to, rather than individual click events.
+* Additional callbacks have been added to represent other stages of ColorBox's lifecycle. Available callbacks, in order of their execution: onOpen, onLoad, onComplete, onCleanup, onClosed These take place at the same time as the event hooks, but will be better suited than the hooks for targeting specific instances of ColorBox.
+* Ajax content is now immediately added to the DOM to be more compatible if that content contains script tags.
+* Focus is now returned to the calling element on closing.
+* Fixed a bug where maxHeight and maxWidth did not work for non-photo content.
+* Direct calls no longer need 'open:true', it is assumed. Example: `$.fn.colorbox({html:'<p>Hi</p>'});`
+
+### Version 1.3.3 - November 7 2009
+Files Changed: jquery.colorbox.js/jquery.colorbox-min.js
+
+* Changed $.fn.colorbox.element() to return a jQuery object rather the DOM element.
+* jQuery.colorbox-min.js is compressed with Google's Closure Compiler rather than YUI Compressor.
+
+### Version 1.3.2 - October 27 2009
+Files Changed: jquery.colorbox.js/jquery.colorbox-min.js
+
+* Added 'innerWidth' and 'innerHeight' options to allow people to easily set the size dimensions for ColorBox, without having to anticipate the size of the borders and buttons.
+* Renamed 'scrollbars' option to 'scrolling' to be in keeping with the existing HTML attribute. The option now also applies to iframes.
+* Bug fix: In Safari, positioning occassionally incorrect when using '100%' dimensions.
+* Bug fix: In IE6, the background overlay is briefly not full size when first viewing.
+* Bug fix: In Firefox, opening ColorBox causes a split second shift with a small minority of webpage layouts.
+* Simplified code in a few areas.
+
+### Version 1.3.1 - September 16 2009
+Files Changed: jquery.colorbox.js/jquery.colorbox-min.js/colorbox.css/colorbox-ie.css(removed)
+
+* Removed the IE-only stylesheets and conditional comments for example styles 1 & 4. All CSS is handled by a single CSS file for all examples.
+* Removed user-agent sniffing from the js and replaced it with feature detection. This will allow correct rendering for visitors masking their agent type.
+
+### Version 1.3.0 - September 15 2009
+Files Changed: jquery.colorbox.js/jquery.colorbox-min.js/colorbox.css
+
+* Added $.fn.colorbox.resize() method to allow ColorBox to resize it's height if it's contents change.
+* Added 'scrollbars' option to allow users to turn off scrollbars when using the resize() method.
+* Renamed the 'resize' option to be less ambiguous. It's now 'scalePhotos'.
+* Renamed the 'cbox_close' event to be less ambiguous. It's now 'cbox_cleanup'. It is the first thing to happen in the close method while the 'cbox_closed' event is the last to happen.
+* Fixed a bug with the slideshow mouseover graphics that appeared after ColorBox is opened a 2nd time.
+* Fixed a bug where ClearType may not work in IE6&7 if using the fade transition.
+* Minor code optimizations to increase compression.
+
+### Version 1.2.9 - August 7 2009
+Files Changed: jquery.colorbox.js/jquery.colorbox-min.js
+
+* Minor change to enable use with $.getScript();
+* Minor change to the timing of the 'cbox_load' event so that it is more useful.
+* Added a direct link to a YouTube video to the examples.
+
+### Version 1.2.8 - August 5 2009
+Files Changed: jquery.colorbox.js/jquery.colorbox-min.js
+
+* Fixed a bug with the overlay in IE6
+* Fixed a bug where left & right keypress events might be prematurely unbound.
+
+### Version 1.2.7 - July 31 2009
+Files Changed: jquery.colorbox.js/jquery.colorbox-min.js, example stylesheets and background images (core styles have not changed and the updates will not affect existing user themes / old example themes)
+
+* Code cleanup and reduction, better organization and documentation in the full source.
+* Added ability to use functions in place of static values for ColorBox's options (thanks Ken!).
+* Added an option for straight HTML. Example: `$.fn.colorbox({html:'<p>Howdy</p>', open:true})`
+* Added an event for the beginning of the closing process. This is in addition to the event that already existed for when ColorBox had completely closed. 'cbox_close' and 'cbox_closed' respectively.
+* Fixed a minor bug in IE6 that would cause a brief content shift in the parent document when opening ColorBox.
+* Fixed a minor bug in IE6 that would reveal select elements that had a hidden visibility after closing ColorBox.
+* The 'esc' key is unbound now when ColorBox is not open, to avoid any potential conflicts.
+* Used background sprites for examples 1 & 4. Put IE-only (non-sprite) background images in a separate folder.
+* Example themes 1, 3, & 4 received slight visual tweaks.
+* Optimized pngs for smaller file size.
+* Added slices, grid, and correct sizing to the Adobe Illustrator file, all theme files are now export ready!
+
+### Version 1.2.6 - July 15 2009
+Files Changed: jquery.colorbox.js/jquery.colorbox-min.js
+
+* Fixed a bug with fixed width/height images in Opera 9.64.
+* Fixed a bug with trying to set a value for rel during a direct call to ColorBox. Example: `$.fn.colorbox({rel:'foo', open:true});`
+* Changed how href/rel/title settings are determined to avoid users having to manually update ColorBox settings if they use JavaScript to update any of those attributes, after ColorBox has been defined.
+* Fixed a FF3 bug where the back button was disabled after closing an iframe.
+
+### Version 1.2.5 - June 23 2009
+Files Changed: jquery.colorbox.js/jquery.colorbox-min.js
+
+* Changed the point at which iframe srcs are set (to eliminate the need to refresh the iframe once it has been added to the DOM).
+* Removed unnecessary return values for a very slight code reduction.
+
+### Version 1.2.4 - June 9 2009
+Files Changed: jquery.colorbox.js, jquery.colorbox-min.js
+
+* Fixed an issue where ColorBox may not close completely if it is closed during a transition animation.
+* Minor code reduction.
+
+### Version 1.2.3 - June 4 2009
+* Fixed a png transparency stacking issue in IE.
+* More accurate Ajax auto-sizing if the user was depending on the #cboxLoadedContent ID for CSS styling.
+* Added a public function for returning the current html element that ColorBox is associated with. Example use: var that = $.fn.colorbox.element();
+* Added bicubic scaling for resized images in the original IE7.
+* Removed the IE6 stylesheet and png files from Example 3. It now uses the same png file for the controls that the rest of the browsers use (an alpha transparency PNG8). This example now only has 2 graphics files and 1 stylesheet.
+
+### Version 1.2.2 - May 28 2009
+* Fixed an issue with the 'resize' option.
+
+### Version 1.2.1 - May 28 2009
+* Note: If you are upgrading, update your jquery.colorbox.js and colorbox.css files.
+* Added photo resizing.
+* Added a maximum width and maximum height. Example: {height:800, maxHeight:'100%'}, would allow the box to be a maximum potential height of 800px, instead of a fixed height of 800px. With maxHeight of 100% the height of ColorBox cannot exceed the height of the browser window.
+* Added 'rel' setting to add the ability to set an alternative rel for any ColorBox call. This allows the user to group any combination of elements together for a gallery, or to override an existing rel. attribute so those element are not grouped together, without having to alter their rel in the HTML.
+* Added a 'photo' setting to force ColorBox to display a link as a photo. Use this when automatic photo detection fails (such as using a url like 'photo.php' instead of 'photo.jpg', 'photo.jpg#1', or 'photo.jpg?pic=1')
+* Removed the need to ever create disposable elements to call colorbox on. ColorBox can now be called directly, without being associated with any existing element, by using the following format:
+ `$.fn.colorbox({open:true, href:'yourLink.xxx'});`
+* ColorBox settings are now persistent and unique for each element. This allows for extremely flexible options for individual elements. You could use this to create a gallery in which each page in the gallery has different settings. One could be a photo with a fade transition, next could be an inline element with an elastic transition with a set width and height, etc.
+* For user callbacks, 'this' now refers to the element colorbox was opened from.
+* Fixed a minor grouping issue with IE6, when transition type is set to 'none'.
+* Added an Adobe Illustrator file that contains the borders and buttons used in the various examples.
+
+### Version 1.2 - May 13 2009
+* Added a slideshow feature.
+* Added re-positioning on browser resize. If the browser is resized, ColorBox will recenter itself onscreen.
+* Added hooks for key events: cbox_open, cbox_load, cbox_complete, cbox_closed.
+* Fixed an IE transparency-stacking problem, where transparent PNGs would show through to the background overlay.
+* Fixed an IE iframe issue where the ifame might shift up and to the left under certain circumstances.
+* Fixed an IE6 bug where the loading overlay was not at full height.
+* Removed the delay in switching between same-sized gallery content when using transitions.
+* Changed how iframes are loaded to make it more compatible with iframed pages that use DOM dependent JavaScript.
+* Changed how the JS is structured to be better organized and increase compression. Increased documentation.
+* Changed CSS :hover states to a .hover class. This sidesteps a minor IE8 bug with css hover states and allows easier access to hover state user styles from the JavaScript.
+* Changed: elements added to the DOM have new ID's. The naming is more consistent and less likely to cause conflicts with existing website stylesheets. All stylesheets have been updated.
+* Changed the behavior for prev/next links so that ColorBox does not get hung up on broken links. A visitor can now skip through broken or long-loading links by clicking prev/next buttons.
+* Changed the naming of variables in the parameter map to be more concise and intuitive.
+* Removed colorbox.css. Combined the colorbox.css styles with jquery.colorbox.js: the css file was not large enough to warrant being a separate file.
+
+### Version 1.1.6 - April 28 2009
+* Prevented the default action of the next & previous anchors and the left and right keys for gallery mode.
+* Fixed a bug where the title element was being added back to the DOM when closing ColorBox while using inline content.
+* Fixed a bug where IE7 would crash for example 2.
+* Smaller filesize: removed a small amount of unused code and rewrote the HTML injection with less syntax.
+* Added a public method for closing ColorBox: $.fn.colorbox.close(). This will allow iframe users to add an event to close ColorBox without having to create an additional function.
+
+### Version 1.1.5 - April 11 2009
+* Fixed minor issues with exiting ColorBox.
+
+### Version 1.1.4 - April 08 2009
+* Fixed a bug in the fade transition where ColorBox not close completely if instructed to close during the fade-in portion of the transition.
+
+### Version 1.1.3 - April 06 2009
+* Fixed an IE6&7 issue with using ColorBox to display animated GIFs.
+
+### Version 1.1.2 - April 05 2009
+* Added ability to change content when ColorBox is already open.
+* Added vertical photo centering now works for all browsers (this feature previously excluded IE6&7).
+* Added namespacing to the esc-key keydown event for people who want to disable it: "keydown.colorClose"
+* Added 'title' setting to add the ability to set an alternative title for any ColorBox call.
+* Fixed rollover navigation issue with IE8. (Added JS-based rollover state due to a browser-bug.)
+* Fixed an overflow issue for when the fixed width/height is smaller than the size of a photo.
+* Fixed a bug in the fade transition where the border would still come up if ColorBox was closed mid-transition.
+* Switch from JSMin to Yui Compressor for minification. Minified code now under 7KB.
+
+### Version 1.1.1 - March 31 2009
+* More robust image detection regex. Now detects image file types with url fragments and/or query strings.
+* Added 'nofollow' exception to rel grouping.
+* Changed how images are loaded into the DOM to prevent premature size calculation by ColorBox.
+* Added timestamp to iframe name to prevent caching - this was a problem in some browsers if the user had multiple iframes and the visitor left the page and came back, or if they refreshed the page.
+
+### Version 1.1.0 - March 21 2009
+* Animation is now much smoother and less resource intensive.
+* Added support for % sizing.
+* Callback option added.
+* Inline content now preserves JavaScript events, and changes made while ColorBox is open are also preserved.
+* Added 'href' setting to add the ability to set an alternative href for any anchor, or to assign the ColorBox event to non-anchors.
+ Example: $('button').colorbox({'href':'process.php'})
+ Example: $('a[href='http://msn.com']).colorbox({'href':'http://google.com', iframe:true});
+* Photos are now horizontally centered if they are smaller than the lightbox size. Also vertically centered for browsers newer than IE7.
+* Buttons in the examples are now included in the 'protected zone'. The lightbox will never expand it's borders or buttons beyond an accessible area of the screen.
+* Keypress events don't queue up by holding down the arrow keys.
+* Added option to close ColorBox by clicking on the background overlay.
+* Added 'none' transition setting.
+* Changed 'contentIframe' and 'contentInline' to 'inline' and 'iframe'. Removed 'contentAjax' because it is automatically assumed for non-image file types.
+* Changed 'contentWidth' and 'contentHeight' to 'fixedWidth' and 'fixedHeight'. These sizes now reflect the total size of the lightbox, not just the inner content. This is so users can accurately anticipate % sizes without fear of creating scrollbars.
+* Clicking on a photo will now switch to the next photo in a set.
+* Loading.gif is more stable in it's position.
+* Added a minified version.
+* Code passes JSLint.
+
+### Version 1.0.5 - March 11 2009
+* Redo: Fixed a bug where IE would cut off the bottom portion of a photo, if the photo was larger than the document dimensions.
+
+### Version 1.0.4 - March 10 2009
+* Added an option to allow users to automatically open the lightbox. Example usage: $(".colorbox").colorbox({open:true});
+* Fixed a bug where IE would cut off the bottom portion of a photo, if the photo was larger than the document dimensions.
+
+### Version 1.0.3 - March 09 2009
+* Fixed vertical centering for Safari 3.0.x.
+
+### Version 1.0.2 - March 06 2009
+* Corrected a typo.
+* Changed the content-type check so that it does not assume all links to photos should actually display photos. This allows for Ajax/inline/and iframe calls on anchors linking to picture file types.
+
+### Version 1.0.1 - March 05 2009
+* Fixed keydown events (esc, left arrow, right arrow) for Webkit browsers.
+
+### Version 1.0 - March 03 2009
+* First release
diff --git a/library/colorbox/colorbox.ai b/library/colorbox/colorbox.ai
new file mode 100644
index 000000000..1b51881af
--- /dev/null
+++ b/library/colorbox/colorbox.ai
@@ -0,0 +1,1811 @@
+%PDF-1.4 %âãÏÓ
+1 0 obj <</Metadata 2 0 R/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <</Length 48282/Subtype/XML/Type/Metadata>>stream
+<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
+<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 4.2.2-c063 53.351735, 2008/07/22-18:11:12 ">
+ <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+ <rdf:Description rdf:about=""
+ xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <dc:format>application/vnd.adobe.illustrator</dc:format>
+ <dc:title>
+ <rdf:Alt>
+ <rdf:li xml:lang="x-default">colorbox</rdf:li>
+ </rdf:Alt>
+ </dc:title>
+ </rdf:Description>
+ <rdf:Description rdf:about=""
+ xmlns:xmp="http://ns.adobe.com/xap/1.0/"
+ xmlns:xmpGImg="http://ns.adobe.com/xap/1.0/g/img/">
+ <xmp:CreatorTool>Adobe Illustrator CS4</xmp:CreatorTool>
+ <xmp:CreateDate>2009-05-27T04:22:39-04:00</xmp:CreateDate>
+ <xmp:ModifyDate>2009-07-30T21:43:35-05:00</xmp:ModifyDate>
+ <xmp:MetadataDate>2009-07-30T21:43:35-05:00</xmp:MetadataDate>
+ <xmp:Thumbnails>
+ <rdf:Alt>
+ <rdf:li rdf:parseType="Resource">
+ <xmpGImg:width>208</xmpGImg:width>
+ <xmpGImg:height>256</xmpGImg:height>
+ <xmpGImg:format>JPEG</xmpGImg:format>
+ <xmpGImg:image>/9j/4AAQSkZJRgABAgEBLAEsAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABABLAAAAAEA&#xA;AQEsAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK&#xA;DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f&#xA;Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAADQAwER&#xA;AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA&#xA;AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB&#xA;UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE&#xA;1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ&#xA;qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy&#xA;obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp&#xA;0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo&#xA;+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7&#xA;FXYq7FXYq7FXYq7FXnn5b+fNd85T6us6W9jHpkiRL6KOzOzl9zzagACdMVZt9U1D/lt/5Jr/AFxV&#xA;gf5ZfmZrHmfzJrei39vBGNIaSNbiEODIYpjFUqzNStK4q9JxV2KuxV2KuxV2KuxV2KuxV2KvG/Pf&#xA;5jfmBY/mDL5Z8twpdMyRNb2/pKzktEHf4jTYbmpxVQ/xJ/zkV/1Y1/4G3/6qYqh9G/ND8zYvPml+&#xA;WvMdtHZSXcsXqwtEgYwyEjkjKSCDQioPXFXueKvBB+aX5r6n5k1HSdAtI717OSX4EiT4Y0fiCzOV&#xA;H44qmH+JP+civ+rGv/A2/wD1UxVd5F/Nbzde6/qVh5lMVnHpcEj3aNGIzG0TANyPgBiqbeU/z18v&#xA;eZdcl0izkZZ2kZLEPEw9aONOTS1pRQTUKCa+OKqdh+fvlm882Dy+kzAycYoLkxsFN16jRtbsCOuy&#xA;lWFVNaVr1VRfnv8AN5/Jt9AmpWLvp1zbyPBexFWrcx7iEx1BFV/aO340VR+r/mFqWj+Sl8x6lYGG&#xA;aOOGS808MrPH6jKHVW2VivLbpX2xVMtC8622vaLFq+lzLPaTKxRuJHxLUMpBoQQRirDfIf5y6x5n&#xA;1DSrWaxhtl1HT7i/dkZmKmC7a2CCoHXjyriqH/5x3/vvNf8AzFQ/rmxV7Lirwb8hv/JkedP+M9z/&#xA;ANRhxV7zirsVdirsVdirsVdirsVdirsVeNSf+tKx/wDMKf8AqDOKvZcVeHfmF/60T5T/AOYO0/6i&#xA;7nFXuOKvDvyS/wDJleb/AJN/1EHFXuOKvCPKoB/O/wA3AioLSgg/OPFWbeXvLflPTby/m0e1gjnl&#xA;n5XRjCnhLxHJVP7O1KqPn1OKtQ+W/KaebH1VLaAa4LZVQhVBWIu9XVRtyZmYM3XtiqC8x+VvI2q6&#xA;79Y19I7m7WzkRbe5c+mkBPxyIhPFH/yx8W3XbFVeXQvK8/km20meQyeX1jgQPJI3xRqylQ7k1AOw&#xA;O+2Kp/bWdpb2iWtpEkNsiCOKKIBVVQOICgbAAbDFWE+SPKfkrTL7TZ9Eu7i4ltrCeCzEtaNbPdM8&#xA;jtVE3EzFR0+XfFVH/nHf++81/wDMVD+ubFXsuKvBvyG/8mR50/4z3P8A1GHFXvOKuxV2KuxV2Kux&#xA;V2KuxV2KuxV4tfgH/nISYHcfUl/6h1xV6LwT+Ufdil5J5sAH/OQPlWgp/o1r0/5ibjFD3/FXg/5T&#xA;gHzt5xqK/vk6/wDGWbFXqnBP5R92KXlnlqJJPzo80xNUI8AU8SVNDFCNitCD7jFDLfL3kW10fUZL&#xA;xLiWQh2MKsduDClHH7RB74qttvIVnD5iGrfWZSqfvEj5GplZmJJbrwoR8Pfvttiqt5q8pyeYJ4Vl&#xA;uBDawRuU4oDJ6zbAlj+xtuBT5+CqM1DRrrUPLf6LnlRJ5I40mljWiAggsVTbw2GKo3SNNg0uwgso&#xA;Gd4oBRWkYsx+k/qG2KpD5W8sajpU1k9y0TC3spraT02J+OS5MwIqo24/jiqS/wDOO/8Afea/+YqH&#xA;9c2KvZcVeDfkN/5Mjzp/xnuf+ow4q95xV2KuxV2KuxV2KuxV2KuxV2KvA/OPmPTvL356y6jqJZbM&#xA;W0cUsiKXKc4AAxUbkA9ab4qyL/ldX5a/9XZv+kW7/wCqWKsFm8z6R5m/PLy5qGkO81lALa19Z0aM&#xA;O6yySEqrgNQeqBuBvXtvir6UxV81eTfOmheWPPHmY6zI8EF5MwjnVHkUNFK54ssYZvi57bYqzv8A&#xA;5XV+Wv8A1dm/6Rbv/qlirFfy41m11v8ANXXtVtAwtbqImHmKMVT04wxHblwrir2LFLsVdirsVdir&#xA;sVeef847/wB95r/5iof1zYoey4q8G/Ib/wAmR50/4z3P/UYcVe84q7FXYq7FXYq7FXYq7FXYq7FU&#xA;p1Dyj5X1G6a7v9Ktbq6cAPNNEjuQooKkiuwGKob/AJV95G/6sNh/0jx/0xVVtfJPlC0uY7m10azg&#xA;uIWDxSxworKw6EEDY4qnWKpHN5F8mTSvLLollJLISzu0EZJYmpJNMVWf8q+8jf8AVhsP+keP+mKo&#xA;rT/KfljTpjNYaXa2sxHEyQxIjFT2qoGKph9Utv8AfS/dirvqlt/vpfuxV31S2/30v3Yq76pbf76X&#xA;7sVd9Utv99L92Ku+qW3++l+7FXj/APzjwQLjzUhNGNzCwU9aVl3pir2XFXg35DD/AJCN5zb9lprk&#xA;q3Yj62emKvecVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVSyfy1oU2&#xA;5soUbpySNUNPCoGKqH+D9B/5ZhiqN03RdK0xOFhaRWwIofSRUJHvxAxVG4q7FXYq7FXYq7FXYq7F&#xA;XYqg9H1jTdZ0u11XTLhLqwvI1mt54yCrI4qP7R2xVL/OHm6x8qaNca1qNrdTabaL6l3NaRiYxJWh&#xA;ZkDB+I7kKaDc7Yq84/6Gu/Kj0DcV1P0AokMv1GTgELcA3KtKc/hr47Yq9J8pea7PzTo1vrNha3UG&#xA;nXiCW0lu41iMsbfZdU5F+LdQSBUbjbFUdrOs6ZoulXWq6pcJa2FlG01zPIaKqIKn5nwHfFUZirsV&#xA;dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir8t7NtVW2nltHmS3gCvcNGzKq8mCK&#xA;TQjck0xV9Tf84pyar5v/AC088eUtS1CZ7GaM2dq8hMpgXULeaOXhyPTYNx6Vr44qxf8A6Fe/OhtP&#xA;Hllv0WNHEwYXv1iSgYOT6/GnPdTTjx+iu+Kss/5y2utV8sfl/wCTPLWnX80diA1vcshMbTixgiSI&#xA;vxPT4i3HpX5DFXyrdvqzW0El28z209XgaRmZGKEoSKkioNRir9SMVdirsVdirsVdirsVdirsVdir&#xA;sVdirsVdirsVdirsVdirsVdirsVfnX5S85aNpmjNFND6bwAGSJAC0xJA5DkRU+IJxV71/wA4TyrN&#xA;a+dJUHFZLq0dR4BhOR0xV9NYq+ZP+c25FjsvJsjCqpdXbMPYLCcVeC+YvOOiXnl4WyQCea4B9KNw&#xA;AYCCRzPGtG8ADv32xV+iuKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KvhDQ&#xA;P+cTvzc1nSbbU1gsrGO6jWWKC7uCk3BxyUskaScag9CajuMVfSX/ADjl+TmsflroGpx61cwz6nqs&#xA;8ckkVsWeKOOFWVBzZULMeZJ28MVeu4q8h/5yN/JzWfzK0HS49EuoYNS0qeR0iuSyRSRzqqv8aq5D&#xA;LwUjanXFXzb5h/5xQ/NzRdJudTaCzv4rSNpZobOcvNwQcmKo6R8qDsu57DFX3hirsVdirsVdirsV&#xA;dirsVdirsVdirsVdirsVdirsVdirsVdirsVdir4I0T/nKf8AOHSNKttMi1CC5htIxFFLc26SS8FF&#xA;FDPsWoNqnfxxV9Mf843fnBrf5j+XtSbXIYk1TSZ445Li3UokscysyEoSeLDgwNNumKvX8VePf85J&#xA;fnDrv5ceX9LbQoIX1LVp5I1uLhS6RRwKrOQgK1di60rt12xV80a7/wA5S/m/rGkXWlzahb28F5G0&#xA;M0ltbpHL6bijBX+LjUbVG/hir74xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K&#xA;uxV8lfkx+Uv5Sa1+Wlxd6peLeXGprGupX/NIZbF0kST6vGZAwiPNQGcirg7fCcVZD/zhpbW1sfPd&#xA;tauZLaC/t44HJDFo09dVNRQGoHbFX0pir5q/5zNt7e5/wLb3LcLea+uI5nqFojegGNTsNjiqTfnD&#xA;+T/5PaP+U8OoWF/Hp+oaajrpV7zWaTUHaR5DbycKeqxZyA4HwAb/AAjFX1dirsVdirsVdirsVdir&#xA;sVdirsVdirsVdirsVdirsVdirsVdirsVdir8vLF9eSxu7exFx9Sv1WO8jiDmOUROJEDgCh4uoI8M&#xA;VfRv/OPmm+ffKv5QeePN1gq6dLEgvbFb+BnjuYtPhlkn+Csb7g8UcNTlXFV7f85FfnGvkL/GBuNH&#xA;+r8liFl9RufW9RpjHUn1eAi4rX1a0LfB9rFW/wDnI7SPPnmL8qfJPmbUE/SVwVa61L6hAVhthfQx&#xA;yRfADJJxAXizs1OVOlaYq+br+XX3sbS2vvrP1HT1eOyilDiOISyGVwgIoOTsSfHFX6h4q7FXYq7F&#xA;XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqhNI0nT9I0y10vToEtrGzjWG3gjAVVRBQA&#xA;AUGKq91bW91bS2tzGs1vOjRTROKq6OOLKw7gg0xV45H/AM4lflEmofWfT1BrblU6cbtvq5Tlz9I/&#xA;D6vDlvTnir2SCCG3gjggRYoYlCRRoAqqqiiqoHQAYqhtY0jTtZ0q70rUoFubC9iaC5gcAqyOKEb/&#xA;AIYqjMVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs&#xA;VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV&#xA;dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd&#xA;irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi&#xA;rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir&#xA;sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs&#xA;VdirsVdirsVdirqitO/hirsVcSBudsVdirSujEhWBI60NaYq3irsVdirsVdirsVdirsVdirsVdir&#xA;sVdirsVdirsVdirsVdiq2WP1Inj5MnNSvNDRlqKVB33GKpL5U8sy6DbzwyahPf8ArSM49diQlXZv&#xA;hBrQtyq57nfFVlj5WmtvM9zrbalczJPHwWzd6otWZuO/7CcvgHY1xVT82eU5tdmtJI7sWwtg/JeD&#xA;MJQzI3pycXSsZ4bjFU21vTm1LSLuwWT0muomiEtK8eQpWm3TFVawtTaWUFqZpLgwoqGeU8pH4inJ&#xA;j3JxVJvKflmfQ2vDJOswuW5LxBFP3ssm9f8AjLirIMVdirsVdirsVdirsVdirsVdirsVdirsVdir&#xA;sVdirsVdirsVU7o3ItpTaqj3QRjAkrFIzJT4Q7KHIWvUhT8sVYV+VN9+a93pt8fzEsbOyu0uHFj9&#xA;UapaMyyVDgM6hUHERnqVoWq1TiqjomofnBJ+Z+p2urafYxeREgrYXUTn1i3qSek37RaRlH71DRVH&#xA;EjeoZVT/ADT1L807S90lPI9s1xayrINZcQwStDF6sIEsHrSwhp1Vn4Rn4WFSegxVlPnWbzFD5S1e&#xA;Xy2nq6+lrI2lx0VuVwF/dij/AA7t44qi9Bk1qTRbF9cihg1hoUOoRWrM8KzcfjEbMAeNf9s9cVYT&#xA;+UepfmTevrI86JOoikA0717eO3BT61dL8PppHy/crD1r2Pc4q9FxV2KuxV2KuxV2KuxV2KuxV2Ku&#xA;xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux&#xA;V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVQmmkDiOIcpCK09vE4qome+hHO&#xA;ZF9MHcqa0riqMRgyhh3xVvFXYq7FXYq7FXYq7FVOW5ghkhjkfi9w5ihG/wAThGkI/wCAjY4q3PPF&#xA;bwSTzNwiiUvI57KoqTt7YqlekebvLusXLWum3q3M6IZGRVcUQEKT8SgdWGKppJNDEAZHVAenIgV+&#xA;/FWzJGE9QsAlK86ilPGuKujlikFY3VwNiVIIr9GKtLPA7lFkVnFaqCCduu2KpTqnnLyxpdwba/1G&#xA;KG4H2ovidl7/ABBA1PpxVB/8rJ8kf9XWP/gJf+aMVTzTtSsNStVurC4S5t2NBJGaio6g+B9sVS1f&#xA;OnlhtT/Ra36m/wDVNv6HF6+qG4la8adffFU7xV2KuxV2KuxVBqf9ytP+KW/4kuKrtV/4583yH6xi&#xA;qpZ/7zp8hiqtirsVdirsVdirsVdiqFvbH6zc2E3Ph9SnafjSvPlBLDxrUU/vq19sVUfMP/HA1P8A&#xA;5hJ/+TbYq8l/JT/lKrr/AJgZP+T0WKvSPM/6aEMg0uWK3vXdfSmncRp6QQ1XkUk35e21a+2Kooi4&#xA;FoZEAjFWMRk+JFkMYCu1APh9Tlv71xVC6IuuNYn9IzQ3V6FkEklqCE4FgY4+RJ5OFrvXb8SqttDr&#xA;bapcrNc2sun8h+joIUYTxkFd5KmihRy5Cn9MVeIaDpF75m8wpZ+uFuLx3kmuJKt0Bd2I7nFWXa/+&#xA;TtzpmkXWoQamt0bWNpXhaH0qogqxDc33A36Yqj/yMkflrMfI8ALdgvap9QVxVjdt/wCTYP8A22ZP&#xA;+ohsVe9Yq7FVK5mEMTOe2KqKQ3MirJ63HkAeIWvXfrXFVS3lYu8TmrxkAn5iuKqKf8dX/ni3/Elx&#xA;Vdqv/HPm+Q/WMVVbP/eZPkMVVsVdirsVdirsVdirsVQ9zexW81pC4YteSmCIrSgYRSTVapG3GI/T&#xA;iqH8w/8AHA1P/mEn/wCTbYq8l/JT/lKrr/mBk/5PRYq9G83+ZH0Wyku/q0t2ElWJbWBpFkasZcuP&#xA;TSRiB37AVPtlmLHxmrphOXCLR0uozLZSSAPP6aPIFg+KSULEsojj2WrNyoNq5ADemV7IHy55jn1P&#xA;ShffU7mxEglCw3gIb92VHqry+P0zy/a8NttzPJDhNXaISsWssfMc82vX2miwvofqFC19Op+rzfEg&#xA;4KT8PJ/UqnHw+jDLHUQbG6BOzVPGPJ2uxeX/ADJb6hcxNJFDzSaNaBwHUoaVpuK9MqZvQPM35t6B&#xA;eaDfWVjDcPcXcLwL6iKiKJFKsxIZjsDttiqF/Iz+91n/AFbf9cmKsdtv/JsH/tsyf9RDYq96xV2K&#xA;oe+hMtuyDqRiqHi1KKONIpI5A6gKaCo2264qq2il5pZypUSEEA9aAU/hiq1P+Or/AM8W/wCJLiq7&#xA;Vf8AjnzfIfrGKqtn/vMnyGKq2KuxV2KuxV2KuxV2Koe5soria0mcsGs5TPEFpQsYpIaNUHbjKfpx&#xA;VdeWsd3Zz2khIjuI3icrQMFdSppWu++Ksd8r/l5ovlvUJL6xmuZJZIjAyztGy8WZWqOKIa1Qd8VZ&#xA;HJbRSPzNVelOSMVJHgeJFcVd9Vg9IRcfgB5ChIIbx5V5V964q2ltChY0LFxRi5Lkjw+Inb2xVYll&#xA;AjKRyITdFZ2ZR8gSRirFta/Kvytqt9JeuJ7WaYl5hbOqqzHqxV1cAn2xVL/+VKeVf+Wq+/5GQ/8A&#xA;VLFWV+XvLOkeX7RrbTYiiueUsjHlI5HQs3t2HTFUmT8s9Bj8wnXhcXX1v6y15wLx+n6jOXIp6fLj&#xA;U/zYqyWXUbWI0dwDiqn+l7L/AH4MVd+l7L/fgxVb+k9PrXmMVXDVrEdHGKoe0vbe41grGwYiBj9H&#xA;NcVROsMF02dj0AH6xiqrYsGtYyOlBiqvirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdiqnc&#xA;kiFyOtDiqG0tFayR3UF3LFiRufiIxVF+lF/Iv3DFXelF/Iv3DFXelF/Iv3DFXelF/Iv3DFUPLA0c&#xA;3rwopfiVI6VBNeo+WKqMxuruMwPCscbbOeXKo8OgxVU0tStvw7KSo+QNMVRmKuxV2KuxV2KuxV2K&#xA;uxV2KuxV2KuxV2KuxV2KuxV2KtMoZSD0OKoJrGdaiCZo1JrxFCPxxVr6nf8A/LW/3D+mKu+p3/8A&#xA;y1v9w/pirvqd/wD8tb/cP6Yq76nf/wDLW/3D+mKu+p3/APy1v9w/piraWl6D8VyxHyAxVFwxLEgU&#xA;dsVf/9k=</xmpGImg:image>
+ </rdf:li>
+ </rdf:Alt>
+ </xmp:Thumbnails>
+ </rdf:Description>
+ <rdf:Description rdf:about=""
+ xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/"
+ xmlns:stEvt="http://ns.adobe.com/xap/1.0/sType/ResourceEvent#"
+ xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#">
+ <xmpMM:RenditionClass>default</xmpMM:RenditionClass>
+ <xmpMM:OriginalDocumentID>uuid:65E6390686CF11DBA6E2D887CEACB407</xmpMM:OriginalDocumentID>
+ <xmpMM:DocumentID>xmp.did:8BC7D877974ADE11BCECCFF09938C3CC</xmpMM:DocumentID>
+ <xmpMM:InstanceID>uuid:30267148-672c-4d34-8534-e8cce420f815</xmpMM:InstanceID>
+ <xmpMM:History>
+ <rdf:Seq>
+ <rdf:li rdf:parseType="Resource">
+ <stEvt:action>converted</stEvt:action>
+ <stEvt:params>from application/pdf to &lt;unknown&gt;</stEvt:params>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <stEvt:action>saved</stEvt:action>
+ <stEvt:instanceID>xmp.iid:D47F11740720681191099C3B601C4548</stEvt:instanceID>
+ <stEvt:when>2008-04-17T14:19:21+05:30</stEvt:when>
+ <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+ <stEvt:changed>
+ <rdf:Bag>
+ <rdf:li>/</rdf:li>
+ </rdf:Bag>
+ </stEvt:changed>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <stEvt:action>converted</stEvt:action>
+ <stEvt:params>from application/pdf to &lt;unknown&gt;</stEvt:params>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <stEvt:action>converted</stEvt:action>
+ <stEvt:params>from application/pdf to &lt;unknown&gt;</stEvt:params>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <stEvt:action>saved</stEvt:action>
+ <stEvt:instanceID>xmp.iid:FD7F11740720681197C1BF14D1759E83</stEvt:instanceID>
+ <stEvt:when>2008-05-16T17:01:20-07:00</stEvt:when>
+ <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+ <stEvt:changed>
+ <rdf:Bag>
+ <rdf:li>/</rdf:li>
+ </rdf:Bag>
+ </stEvt:changed>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <stEvt:action>saved</stEvt:action>
+ <stEvt:instanceID>xmp.iid:F77F117407206811BC18AC99CBA78E83</stEvt:instanceID>
+ <stEvt:when>2008-05-19T18:10:15-07:00</stEvt:when>
+ <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+ <stEvt:changed>
+ <rdf:Bag>
+ <rdf:li>/</rdf:li>
+ </rdf:Bag>
+ </stEvt:changed>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <stEvt:action>converted</stEvt:action>
+ <stEvt:params>from application/vnd.adobe.illustrator to application/vnd.adobe.illustrator</stEvt:params>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <stEvt:action>saved</stEvt:action>
+ <stEvt:instanceID>xmp.iid:FB7F117407206811B628E3BF27C8C41B</stEvt:instanceID>
+ <stEvt:when>2008-05-22T14:26:44-07:00</stEvt:when>
+ <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+ <stEvt:changed>
+ <rdf:Bag>
+ <rdf:li>/</rdf:li>
+ </rdf:Bag>
+ </stEvt:changed>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <stEvt:action>converted</stEvt:action>
+ <stEvt:params>from application/vnd.adobe.illustrator to application/vnd.adobe.illustrator</stEvt:params>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <stEvt:action>saved</stEvt:action>
+ <stEvt:instanceID>xmp.iid:08C3BD25102DDD1181B594070CEB88D9</stEvt:instanceID>
+ <stEvt:when>2008-05-28T16:51:46-07:00</stEvt:when>
+ <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+ <stEvt:changed>
+ <rdf:Bag>
+ <rdf:li>/</rdf:li>
+ </rdf:Bag>
+ </stEvt:changed>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <stEvt:action>converted</stEvt:action>
+ <stEvt:params>from application/vnd.adobe.illustrator to application/vnd.adobe.illustrator</stEvt:params>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <stEvt:action>saved</stEvt:action>
+ <stEvt:instanceID>xmp.iid:F77F11740720681192B0DFFC927805D7</stEvt:instanceID>
+ <stEvt:when>2008-05-30T21:26:38-07:00</stEvt:when>
+ <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+ <stEvt:changed>
+ <rdf:Bag>
+ <rdf:li>/</rdf:li>
+ </rdf:Bag>
+ </stEvt:changed>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <stEvt:action>converted</stEvt:action>
+ <stEvt:params>from application/vnd.adobe.illustrator to application/vnd.adobe.illustrator</stEvt:params>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <stEvt:action>saved</stEvt:action>
+ <stEvt:instanceID>xmp.iid:F87F11740720681192B0DFFC927805D7</stEvt:instanceID>
+ <stEvt:when>2008-05-30T21:27-07:00</stEvt:when>
+ <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+ <stEvt:changed>
+ <rdf:Bag>
+ <rdf:li>/</rdf:li>
+ </rdf:Bag>
+ </stEvt:changed>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <stEvt:action>converted</stEvt:action>
+ <stEvt:params>from application/vnd.adobe.illustrator to application/vnd.adobe.illustrator</stEvt:params>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <stEvt:action>saved</stEvt:action>
+ <stEvt:instanceID>xmp.iid:F97F1174072068119098B097FDA39BEF</stEvt:instanceID>
+ <stEvt:when>2008-06-02T13:26:10-07:00</stEvt:when>
+ <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+ <stEvt:changed>
+ <rdf:Bag>
+ <rdf:li>/</rdf:li>
+ </rdf:Bag>
+ </stEvt:changed>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <stEvt:action>saved</stEvt:action>
+ <stEvt:instanceID>xmp.iid:8BC7D877974ADE11BCECCFF09938C3CC</stEvt:instanceID>
+ <stEvt:when>2009-05-27T04:22:07-04:00</stEvt:when>
+ <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+ <stEvt:changed>/</stEvt:changed>
+ </rdf:li>
+ </rdf:Seq>
+ </xmpMM:History>
+ <xmpMM:DerivedFrom rdf:parseType="Resource">
+ <stRef:instanceID>uuid:32300939-b1c4-8440-b812-b255b7b0d326</stRef:instanceID>
+ <stRef:documentID>xmp.did:F97F1174072068119098B097FDA39BEF</stRef:documentID>
+ <stRef:originalDocumentID>uuid:65E6390686CF11DBA6E2D887CEACB407</stRef:originalDocumentID>
+ <stRef:renditionClass>proof:pdf</stRef:renditionClass>
+ </xmpMM:DerivedFrom>
+ </rdf:Description>
+ <rdf:Description rdf:about=""
+ xmlns:illustrator="http://ns.adobe.com/illustrator/1.0/">
+ <illustrator:StartupProfile>Web</illustrator:StartupProfile>
+ <illustrator:Type>Document</illustrator:Type>
+ </rdf:Description>
+ <rdf:Description rdf:about=""
+ xmlns:xmpTPg="http://ns.adobe.com/xap/1.0/t/pg/"
+ xmlns:stDim="http://ns.adobe.com/xap/1.0/sType/Dimensions#"
+ xmlns:xmpG="http://ns.adobe.com/xap/1.0/g/">
+ <xmpTPg:NPages>1</xmpTPg:NPages>
+ <xmpTPg:HasVisibleTransparency>True</xmpTPg:HasVisibleTransparency>
+ <xmpTPg:HasVisibleOverprint>False</xmpTPg:HasVisibleOverprint>
+ <xmpTPg:MaxPageSize rdf:parseType="Resource">
+ <stDim:w>1024.000000</stDim:w>
+ <stDim:h>768.000000</stDim:h>
+ <stDim:unit>Pixels</stDim:unit>
+ </xmpTPg:MaxPageSize>
+ <xmpTPg:PlateNames>
+ <rdf:Seq>
+ <rdf:li>Cyan</rdf:li>
+ <rdf:li>Magenta</rdf:li>
+ <rdf:li>Yellow</rdf:li>
+ <rdf:li>Black</rdf:li>
+ </rdf:Seq>
+ </xmpTPg:PlateNames>
+ <xmpTPg:SwatchGroups>
+ <rdf:Seq>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:groupName>Default Swatch Group</xmpG:groupName>
+ <xmpG:groupType>0</xmpG:groupType>
+ <xmpG:Colorants>
+ <rdf:Seq>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>White</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>255</xmpG:red>
+ <xmpG:green>255</xmpG:green>
+ <xmpG:blue>255</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>Black</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>0</xmpG:red>
+ <xmpG:green>0</xmpG:green>
+ <xmpG:blue>0</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>RGB Red</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>255</xmpG:red>
+ <xmpG:green>0</xmpG:green>
+ <xmpG:blue>0</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>RGB Yellow</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>255</xmpG:red>
+ <xmpG:green>255</xmpG:green>
+ <xmpG:blue>0</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>RGB Green</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>0</xmpG:red>
+ <xmpG:green>255</xmpG:green>
+ <xmpG:blue>0</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>RGB Cyan</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>0</xmpG:red>
+ <xmpG:green>255</xmpG:green>
+ <xmpG:blue>255</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>RGB Blue</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>0</xmpG:red>
+ <xmpG:green>0</xmpG:green>
+ <xmpG:blue>255</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>RGB Magenta</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>255</xmpG:red>
+ <xmpG:green>0</xmpG:green>
+ <xmpG:blue>255</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=193 G=39 B=45</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>193</xmpG:red>
+ <xmpG:green>39</xmpG:green>
+ <xmpG:blue>45</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=237 G=28 B=36</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>237</xmpG:red>
+ <xmpG:green>28</xmpG:green>
+ <xmpG:blue>36</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=241 G=90 B=36</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>241</xmpG:red>
+ <xmpG:green>90</xmpG:green>
+ <xmpG:blue>36</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=247 G=147 B=30</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>247</xmpG:red>
+ <xmpG:green>147</xmpG:green>
+ <xmpG:blue>30</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=251 G=176 B=59</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>251</xmpG:red>
+ <xmpG:green>176</xmpG:green>
+ <xmpG:blue>59</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=252 G=238 B=33</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>252</xmpG:red>
+ <xmpG:green>238</xmpG:green>
+ <xmpG:blue>33</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=217 G=224 B=33</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>217</xmpG:red>
+ <xmpG:green>224</xmpG:green>
+ <xmpG:blue>33</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=140 G=198 B=63</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>140</xmpG:red>
+ <xmpG:green>198</xmpG:green>
+ <xmpG:blue>63</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=57 G=181 B=74</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>57</xmpG:red>
+ <xmpG:green>181</xmpG:green>
+ <xmpG:blue>74</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=0 G=146 B=69</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>0</xmpG:red>
+ <xmpG:green>146</xmpG:green>
+ <xmpG:blue>69</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=0 G=104 B=55</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>0</xmpG:red>
+ <xmpG:green>104</xmpG:green>
+ <xmpG:blue>55</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=34 G=181 B=115</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>34</xmpG:red>
+ <xmpG:green>181</xmpG:green>
+ <xmpG:blue>115</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=0 G=169 B=157</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>0</xmpG:red>
+ <xmpG:green>169</xmpG:green>
+ <xmpG:blue>157</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=41 G=171 B=226</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>41</xmpG:red>
+ <xmpG:green>171</xmpG:green>
+ <xmpG:blue>226</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=0 G=113 B=188</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>0</xmpG:red>
+ <xmpG:green>113</xmpG:green>
+ <xmpG:blue>188</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=46 G=49 B=146</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>46</xmpG:red>
+ <xmpG:green>49</xmpG:green>
+ <xmpG:blue>146</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=27 G=20 B=100</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>27</xmpG:red>
+ <xmpG:green>20</xmpG:green>
+ <xmpG:blue>100</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=102 G=45 B=145</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>102</xmpG:red>
+ <xmpG:green>45</xmpG:green>
+ <xmpG:blue>145</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=147 G=39 B=143</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>147</xmpG:red>
+ <xmpG:green>39</xmpG:green>
+ <xmpG:blue>143</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=158 G=0 B=93</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>158</xmpG:red>
+ <xmpG:green>0</xmpG:green>
+ <xmpG:blue>93</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=212 G=20 B=90</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>212</xmpG:red>
+ <xmpG:green>20</xmpG:green>
+ <xmpG:blue>90</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=237 G=30 B=121</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>237</xmpG:red>
+ <xmpG:green>30</xmpG:green>
+ <xmpG:blue>121</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=199 G=178 B=153</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>199</xmpG:red>
+ <xmpG:green>178</xmpG:green>
+ <xmpG:blue>153</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=153 G=134 B=117</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>153</xmpG:red>
+ <xmpG:green>134</xmpG:green>
+ <xmpG:blue>117</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=115 G=99 B=87</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>115</xmpG:red>
+ <xmpG:green>99</xmpG:green>
+ <xmpG:blue>87</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=83 G=71 B=65</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>83</xmpG:red>
+ <xmpG:green>71</xmpG:green>
+ <xmpG:blue>65</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=198 G=156 B=109</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>198</xmpG:red>
+ <xmpG:green>156</xmpG:green>
+ <xmpG:blue>109</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=166 G=124 B=82</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>166</xmpG:red>
+ <xmpG:green>124</xmpG:green>
+ <xmpG:blue>82</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=140 G=98 B=57</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>140</xmpG:red>
+ <xmpG:green>98</xmpG:green>
+ <xmpG:blue>57</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=117 G=76 B=36</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>117</xmpG:red>
+ <xmpG:green>76</xmpG:green>
+ <xmpG:blue>36</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=96 G=56 B=19</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>96</xmpG:red>
+ <xmpG:green>56</xmpG:green>
+ <xmpG:blue>19</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=66 G=33 B=11</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>66</xmpG:red>
+ <xmpG:green>33</xmpG:green>
+ <xmpG:blue>11</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=0 G=0 B=0</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>0</xmpG:red>
+ <xmpG:green>0</xmpG:green>
+ <xmpG:blue>0</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=26 G=26 B=26</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>26</xmpG:red>
+ <xmpG:green>26</xmpG:green>
+ <xmpG:blue>26</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=51 G=51 B=51</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>51</xmpG:red>
+ <xmpG:green>51</xmpG:green>
+ <xmpG:blue>51</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=77 G=77 B=77</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>77</xmpG:red>
+ <xmpG:green>77</xmpG:green>
+ <xmpG:blue>77</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=102 G=102 B=102</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>102</xmpG:red>
+ <xmpG:green>102</xmpG:green>
+ <xmpG:blue>102</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=128 G=128 B=128</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>128</xmpG:red>
+ <xmpG:green>128</xmpG:green>
+ <xmpG:blue>128</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=153 G=153 B=153</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>153</xmpG:red>
+ <xmpG:green>153</xmpG:green>
+ <xmpG:blue>153</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=179 G=179 B=179</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>179</xmpG:red>
+ <xmpG:green>179</xmpG:green>
+ <xmpG:blue>179</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=204 G=204 B=204</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>204</xmpG:red>
+ <xmpG:green>204</xmpG:green>
+ <xmpG:blue>204</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=230 G=230 B=230</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>230</xmpG:red>
+ <xmpG:green>230</xmpG:green>
+ <xmpG:blue>230</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=242 G=242 B=242</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>242</xmpG:red>
+ <xmpG:green>242</xmpG:green>
+ <xmpG:blue>242</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=63 G=169 B=245</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>63</xmpG:red>
+ <xmpG:green>169</xmpG:green>
+ <xmpG:blue>245</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=122 G=201 B=67</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>122</xmpG:red>
+ <xmpG:green>201</xmpG:green>
+ <xmpG:blue>67</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=255 G=147 B=30</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>255</xmpG:red>
+ <xmpG:green>147</xmpG:green>
+ <xmpG:blue>30</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=255 G=29 B=37</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>255</xmpG:red>
+ <xmpG:green>29</xmpG:green>
+ <xmpG:blue>37</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=255 G=123 B=172</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>255</xmpG:red>
+ <xmpG:green>123</xmpG:green>
+ <xmpG:blue>172</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=189 G=204 B=212</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>189</xmpG:red>
+ <xmpG:green>204</xmpG:green>
+ <xmpG:blue>212</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=138 G=138 B=138 1</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>138</xmpG:red>
+ <xmpG:green>138</xmpG:green>
+ <xmpG:blue>138</xmpG:blue>
+ </rdf:li>
+ </rdf:Seq>
+ </xmpG:Colorants>
+ </rdf:li>
+ </rdf:Seq>
+ </xmpTPg:SwatchGroups>
+ </rdf:Description>
+ <rdf:Description rdf:about=""
+ xmlns:pdf="http://ns.adobe.com/pdf/1.3/">
+ <pdf:Producer>Adobe PDF library 9.00</pdf:Producer>
+ </rdf:Description>
+ </rdf:RDF>
+</x:xmpmeta>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+<?xpacket end="w"?>
+endstream endobj 3 0 obj <</Count 1/Kids[155 0 R]/Type/Pages>> endobj 155 0 obj <</ArtBox[0.0 73.0 508.0 701.0]/BleedBox[0.0 0.0 1024.0 768.0]/Contents 156 0 R/Group 157 0 R/LastModified(D:20090730214335-05'00')/MediaBox[0.0 0.0 1024.0 768.0]/Parent 3 0 R/PieceInfo<</Illustrator 158 0 R>>/Resources<</ColorSpace<</DefaultRGB 159 0 R>>/XObject<</Fm0 160 0 R>>>>/Thumb 161 0 R/TrimBox[0.0 0.0 1024.0 768.0]/Type/Page>> endobj 156 0 obj <</Filter/FlateDecode/Length 130>>stream
+H‰ŒÎ-Ã0 †aîSøõìø' ŸÆ‹v€©°ºûƒµ,$’õ‘<à=±FCáb¸Üï·Á8A¯-‚âFÅ{­(V(Ì\Eñ³Ããµ3>¿°Îüå¨IGIykF½µÝS><H‚朗7)dªÞ5×?úLÿè3ý£Ÿö¯ð`
+endstream endobj 157 0 obj <</CS 162 0 R/I false/K false/S/Transparency>> endobj 161 0 obj <</BitsPerComponent 8/ColorSpace 163 0 R/Filter[/ASCII85Decode/FlateDecode]/Height 79/Length 284/Width 106>>stream
+8;Z\ui<k5l%"j!.(Yn<rGVB89DS9W38A;imV+n")c,d,Cr$jiKcnTe_@#q%%4(.C8
+HN;BSQ0K3*YFS=EP`>nRqnec:hag&4%a](-!f93L:A4D\h\gZ/n@lX;HcTPGfEHCj
+Q%6lr1C^ia9#<W0(GV,aU!d`IC%Y0XNP6><b7'6om5]6K!.0N/D61*)F/P7m\Pl,G
+gpGL0adN#/Z594=1XIk%(grE!EB@RojEgmQOd52KE0$6o\NS1_@3+<#Mt:Yj;B;Fb
+IK^@:(iq@&!<@UeLT(~>
+endstream endobj 163 0 obj [/Indexed/DeviceRGB 255 164 0 R] endobj 164 0 obj <</Filter[/ASCII85Decode/FlateDecode]/Length 428>>stream
+8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0
+b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup`
+E1r!/,*0[*9.aFIR2&b-C#s<Xl5FH@[<=!#6V)uDBXnIr.F>oRZ7Dl%MLY\.?d>Mn
+6%Q2oYfNRF$$+ON<+]RUJmC0I<jlL.oXisZ;SYU[/7#<&37rclQKqeJe#,UF7Rgb1
+VNWFKf>nDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j<etJICj7e7nPMb=O6S7UOH<
+PO7r\I.Hu&e0d&E<.')fERr/l+*W,)q^D*ai5<uuLX.7g/>$XKrcYp0n+Xl_nU*O(
+l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~>
+endstream endobj 160 0 obj <</BBox[-103.108 71.3223 103.108 -71.3213]/Length 854/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ColorSpace<</CS0 165 0 R>>/ExtGState<</GS0 166 0 R>>/Font<</T1_0 154 0 R>>/ProcSet[/PDF/Text]>>/Subtype/Form>>stream
+BT
+/CS0 cs 0 0 0 scn
+/GS0 gs
+/T1_0 1 Tf
+0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 12 0 0 -12 -103.0967 -61.2773 Tm
+[(T)7(his is an A)12(dobe\256 I)-10(llustr)5(a)4(t)6(or\256 F)26(ile tha)4(t w)4(as)]TJ
+0 -1.2 TD
+[(sa)8(v)10(ed without PDF C)11(on)4(t)6(en)4(t)3(.)]TJ
+0 -1.2 TD
+[(T)71(o P)5(lac)6(e or open this \037le in other)]TJ
+0 -1.2 TD
+[(applica)4(tions)11(, it should be r)10(e)-28(-sa)8(v)10(ed fr)10(om)]TJ
+0 -1.2 TD
+[(A)12(dobe I)-10(llustr)5(a)4(t)6(or with the ")3(C)3(r)10(ea)4(t)6(e PDF)]TJ
+0 -1.2 TD
+[(C)11(ompa)4(tible F)26(ile" option tur)-4(ned on. )41(T)7(his)]TJ
+T*
+[(option is in the I)-10(llustr)5(a)4(t)6(or Na)4(tiv)10(e F)31(or)-4(ma)4(t)]TJ
+0 -1.2 TD
+[(Options dialog bo)14(x, which appears when)]TJ
+0 -1.2 TD
+[(sa)8(ving an A)12(dobe I)-10(llustr)5(a)4(t)6(or \037le using the)]TJ
+0 -1.2 TD
+[(S)-3(a)8(v)10(e A)6(s c)6(ommand)10(.)]TJ
+ET
+
+endstream endobj 154 0 obj <</BaseFont/OUPLQW+MyriadPro-Regular/Encoding 167 0 R/FirstChar 31/FontDescriptor 168 0 R/LastChar 174/Subtype/Type1/Type/Font/Widths[523 212 0 337 0 0 0 0 0 0 0 0 0 207 307 207 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 612 0 580 666 0 487 0 0 239 0 0 0 0 658 689 532 0 0 493 497 0 0 0 0 0 0 0 0 0 0 0 0 482 569 448 564 501 292 559 555 234 0 0 236 834 555 549 569 0 327 396 331 551 481 736 463 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 419]>> endobj 167 0 obj <</BaseEncoding/WinAnsiEncoding/Differences[31/f_i]/Type/Encoding>> endobj 168 0 obj <</Ascent 952/CapHeight 674/CharSet(/f_i/space/quotedbl/comma/hyphen/period/A/C/D/F/I/N/O/P/S/T/a/b/c/d/e/f/g/h/i/l/m/n/o/p/r/s/t/u/v/w/x/registered)/Descent -250/Flags 32/FontBBox[-157 -250 1126 952]/FontFamily(Myriad Pro)/FontFile3 169 0 R/FontName/OUPLQW+MyriadPro-Regular/FontStretch/Normal/FontWeight 400/ItalicAngle 0/StemV 88/Type/FontDescriptor/XHeight 484>> endobj 169 0 obj <</Filter/FlateDecode/Length 3130/Subtype/Type1C>>stream
+H‰|TyPwîffz è$ÒÕD§“î#hD”[-±o!b(/˜a¸@e0‚ §E
+D%"‰g”C ¹Ed=€ñ
+1ÆMÜ}?¬l[[•¿¶ªëõ»ú{ï}¯ëá˜ÐÃq|Ž—Ÿ·ÇWþ‹<©U
+ouÔâíÊà˜ð@µ1ÈrŸáÜl!÷ù
+Ù£¬÷ïß{ˆà¹Ïgµ|6cÔð˜O”ìß«ZÍc‡heöË—;Ø¥Ó´tµ•9,]ºtZ:ÉÖ(¢‚”2ŸC­2B#Û)RGG©µJ…lMx¸lB#S+5Ju¬ÑÉ÷¤UÊù¸,èÌÏ·÷ðÙ‘|Î:'g'[çev²ÿv/SidJ•6D©–ò
+å~ŒgÇ0†Í4Á¬0ì ³Á°/1l‰ æ„c§ó!°R ?a6F=1o,ËÇÊ°Ü—ã øþÖd­I¾É„`³@!º ¿þ!Ú :AÄN"8+¶ï›š›z™^00s6‹2ùÈö£VsQjz÷º çåM‚t!—:é=•J@j£Ð*øV¯$C·(0S9â)bÏ´«o\3eÔÑ’ : ZÁí„ãøÏatØHŸàæä&ª
+… 5X¡°ýqWAÁe¾1×ä>®¶0Ι¿<ȤRên¦vÐðéŸåìÝ»ÏÁD
+xÈÃm·™o‡Kh½Á#ùØv܃:y¾<»žçÖÈ1E[læ!/UXFV #‰çÇm
+óYÉE~ºÂ>¸h¤ ’Ç,Çá<‘r®$­”½¡±-¯(ºÑ.½£m ¾ÂTÊ=Î9Óë}“YË>s1«šžèÜg¿t«¿U¤&óäAV’¤än „ÆY´ Â@×”QšÊþ¸.¼øóÍöÛˆ¨cí*ƒ.wH¯WÜ~Ù^ðh1CÖ—ðû.ŒÜY°‘FŸ:¹Y-îù
+Läì Uå~OéFÿ]^>g/(Irq,÷ú>û Øgià^CÐý©k ÄêºBc!½fvYT p”lä졉ú5ø-Z°Íû°ZÎœó/oÈ¿N¿ÉÈsWH“ÄÈ+cÞVd&]ß´á·Þæòêï™,‚LÈÙ&!RÊô×j¤. ÙøMZRjt$H¾•Þ«,mûðÂ_õ¬äž®O˹õBxœÅà8T>#aE&ìÓèC™!‚l<9"Ê$<ªZ£ûhÀÀd Ö€µëïh¦›Ê/œÕÃONÄø”;u:óTVs¯¨µægz¢iÙ—Hà·Ún«M{<›š›–—'•øòÛÇúðêgÎæ ¥S‡&~M/ZÛ Âßï<Á²D]1{®[”¯ÙïO#‡ùG Ñ‚‰`Ýu³0ï<+i×õ+þ×lõ3¸8ÎÓc3@¡½¸:& b5̬"ç Ù¼X
+ˆÐi{~)™$!x63áú”'(&}÷¹ŸÓÜhg¹1Ì…æ‹H ›ÅÁÙ_šrŽ L Ãi œ‘?Ü Ù»bd[Ý! íëäÙÖøõeh1µšíÔ”ýÒ௤½Éhh¢gù¦šZS5™›_œ]®O÷˜Î"5ä‰ë8Â1×x—ïøûQÞo‰ã½ÕebÁ‰¹éCiçhIW‰Û+ºxæìˆÿ;åÉ6ªcs-rñ»veìö}þŠž,ë*ÿLTüõaÉ¡B·SN X’U°›‚± s¸|½IlgÝF.>Þ—×\ä‘SÇ:.¨|do·Õê¢uAL§VÊÈeï [`lÅÂh¾à'M¨8²’±7°2ŒûÙRVA¤ 
+endstream endobj 166 0 obj <</AIS false/BM/Normal/CA 1.0/OP false/OPM 1/SA true/SMask/None/Type/ExtGState/ca 1.0/op false>> endobj 165 0 obj [/ICCBased 170 0 R] endobj 170 0 obj <</Filter/FlateDecode/Length 2574/N 3>>stream
+H‰œ–yTSwÇoÉž•°Ãc [€°5la‘QIBHØADED„ª•2ÖmtFOE.®c­Ö}êÒõ0êè8´׎8GNg¦Óïï÷9÷wïïÝß½÷ó
+ 
+V³)gB£0ñiœWו8#©8wÕ©•õ8_Å٥ʨQãüÜ«QÊj@é&»A)/ÇÙgº>'K‚ó
+€x¯Íú·¶Ò-
+¨ꇆ¡Ðnè÷ÐQètº}MA ï —0Óal»Á¾°ŽSàx ¬‚kà&¸^Á£ð>ø0|>_ƒ'á‡ð,ÂG!"F$H:Rˆ”!z¤éF‘Qd?r 9‹\A&‘GÈ ”ˆrQ ¢áhš‹ÊÑ´íE‡Ñ]èaô4zBgÐ×Á–àE#H ‹*B=¡‹0HØIøˆp†p0MxJ$ùD1„˜D, V›‰½Ä­ÄÄãÄKÄ»ÄY‰dEò"EÒI2’ÔEÚBÚGúŒt™4MzN¦‘Èþär!YKî ’÷?%_&ß#¿¢°(®”0J:EAi¤ôQÆ(Ç()Ó”WT6U@ æP+¨íÔ!ê~êêmêæD ¥eÒÔ´å´!ÚïhŸÓ¦h/èº']B/¢éëèÒÓ¿¢?a0nŒhF!ÃÀXÇØÍ8ÅøšñÜŒkæc&5S˜µ™˜6»lö˜Iaº2c˜K™MÌAæ!æEæ#…åÆ’°d¬VÖë(ëk–Íe‹Øél »—½‡}Ž}ŸCâ¸qâ9
+N'çÎ)Î].ÂuæJ¸rî
+î÷ wšGä xR^¯‡÷[ÞoÆœchžgÞ`>bþ‰ù$á»ñ¥ü*~ÿ ÿ:ÿ¥…EŒ…ÒbÅ~‹ËÏ,m,£-•–Ý–,¯Y¾´Â¬â­*­6X[ݱF­=­3­ë­·YŸ±~dó ·‘ÛtÛ´¹i ÛzÚfÙ6Û~`{ÁvÖÎÞ.ÑNg·Åî”Ý#{¾}´}…ý€ý§ö¸‘j‡‡ÏþŠ™c1X6„Æfm“Ž;'_9 œr:œ8Ýq¦:‹ËœœO:ϸ8¸¤¹´¸ìu¹éJq»–»nv=ëúÌMà–ï¶ÊmÜí¾ÀR 4 ö
+n»3Ü£ÜkÜGݯz=Ä•[=¾ô„=ƒ<Ë=G</zÁ^Á^j¯­^—¼ Þ¡ÞZïQïBº0FX'Ü+œòáû¤útøŒû<öuñ-ôÝà{Ö÷µ__•ß˜ß-G”,ê}çïé/÷ñ¿ÀHh 8ðm W 2p[àŸƒ¸AiA«‚Ný#8$X¼?øAˆKHIÈ{!7Ä<q†¸Wüy(!46´-ôãÐaÁa†°ƒa†W†ï ¿¿@°@¹`lÁݧYÄŽˆÉH,²$òýÈÉ(Ç(YÔhÔ7ÑÎÑŠèÑ÷b<b*böÅ<Žõ‹ÕÇ~ûL&Y&9‡Ä%ÆuÇMÄsâsã‡ã¿NpJP%ìM˜I JlN<žDHJIÚtCj'•KwKg’C’—%ŸN¡§d§ §|“ꙪO=–§%§mL»½Ðu¡váx:H—¦oL¿“!ȨÉøC&13#s$ó/Y¢¬–¬³ÙÜìâì=ÙOsbsúrnåºçsOæ1óŠòvç=ËËïÏŸ\ä»hÙ¢óÖê‚#…¤Â¼Â…³‹ãoZ<]TÔUt}‰`IÃ’sK­—V-ý¤˜Y,+>TB(É/ÙSòƒ,]6*›-•–¾W:#—È7Ë*¢ŠÊe¿ò^YDYÙ}U„j£êAyTù`ù#µD=¬þ¶"©b{ųÊôÊ+¬Ê¯: !kJ4Gµm¥ötµ}uCõ%—®K7YV³©fFŸ¢ßY Õ.©=bàá?SŒîÆ•Æ©ºÈº‘ºçõyõ‡Ø Ú† žkï5%4ý¦m–7Ÿlqlio™Z³lG+ÔZÚz²Í¹­³mzyâò]íÔöÊö?uøuôw|¿"űN»ÎåwW&®ÜÛe֥ﺱ*|ÕöÕèjõê‰5k¶¬yÝ­èþ¢Ç¯g°ç‡^yïkEk‡Öþ¸®lÝD_p߶õÄõÚõ×7DmØÕÏîoê¿»1mãál {àûMśΠnßLÝlÜ<9”úO
+¾„¾ÿ¿z¿õÀpÀìÁgÁãÂ_ÂÛÃXÃÔÄQÄÎÅKÅÈÆFÆÃÇAÇ¿È=ȼÉ:ɹÊ8Ê·Ë6˶Ì5̵Í5͵Î6ζÏ7ϸÐ9кÑ<ѾÒ?ÒÁÓDÓÆÔIÔËÕNÕÑÖUÖØ×\×àØdØèÙlÙñÚvÚûÛ€ÜÜŠÝÝ–ÞÞ¢ß)߯à6à½áDáÌâSâÛãcãëäsäüå„æ æ–çç©è2è¼éFéÐê[êåëpëûì†ííœî(î´ï@ïÌðXðåñrñÿòŒóó§ô4ôÂõPõÞömöû÷Šøø¨ù8ùÇúWúçûwüü˜ý)ýºþKþÜÿmÿÿ
+endstream endobj 159 0 obj [/ICCBased 171 0 R] endobj 171 0 obj <</Length 3144/N 3>>stream
+
+
+
+'
+=
+T
+j
+
+ó " 9 Q i € ˜ ° È á ù  * C \ u Ž § À Ù ó & @ Z t Ž © Ã Þ ø.Id›¶Òî %A^z–³Ïì &Ca~›¹×õ1OmŒªÉè&Ed„£Ãã#Ccƒ¤Åå'Ij‹­Îð4Vx›½à&Il²ÖúAe‰®Ò÷@eŠ¯Õú Ek‘·Ý*QwžÅì;cŠ²Ú*R{£ÌõGp™Ãì@j”¾é>i”¿ê  A l ˜ Ä ð!!H!u!¡!Î!û"'"U"‚"¯"Ý#
+#8#f#”#Â#ð$$M$|$«$Ú% %8%h%—%Ç%÷&'&W&‡&·&è''I'z'«'Ü( (?(q(¢(Ô))8)k))Ð**5*h*›*Ï++6+i++Ñ,,9,n,¢,×- -A-v-«-á..L.‚.·.î/$/Z/‘/Ç/þ050l0¤0Û11J1‚1º1ò2*2c2›2Ô3 3F33¸3ñ4+4e4ž4Ø55M5‡5Â5ý676r6®6é7$7`7œ7×88P8Œ8È99B99¼9ù:6:t:²:ï;-;k;ª;è<'<e<¤<ã="=a=¡=à> >`> >à?!?a?¢?â@#@d@¦@çA)AjA¬AîB0BrBµB÷C:C}CÀDDGDŠDÎEEUEšEÞF"FgF«FðG5G{GÀHHKH‘H×IIcI©IðJ7J}JÄK KSKšKâL*LrLºMMJM“MÜN%NnN·O
+kÍ‚0‚’‚ôƒWƒº„„€„ã…G…«††r†×‡;‡ŸˆˆiˆÎ‰3‰™‰þŠdŠÊ‹0‹–‹üŒcŒÊ1˜ÿŽfŽÎ6žnÖ‘?‘¨’’z’ã“M“¶” ”Š”ô•_•É–4–Ÿ—
+—u—à˜L˜¸™$™™üšhšÕ›B›¯œœ‰œ÷dÒž@ž®ŸŸ‹Ÿú i Ø¡G¡¶¢&¢–££v£æ¤V¤Ç¥8¥©¦¦‹¦ý§n§à¨R¨Ä©7©©ªª««u«é¬\¬Ð­D­¸®-®¡¯¯‹°
+¾„¾ÿ¿z¿õÀpÀìÁgÁãÂ_ÂÛÃXÃÔÄQÄÎÅKÅÈÆFÆÃÇAÇ¿È=ȼÉ:ɹÊ8Ê·Ë6˶Ì5̵Í5͵Î6ζÏ7ϸÐ9кÑ<ѾÒ?ÒÁÓDÓÆÔIÔËÕNÕÑÖUÖØ×\×àØdØèÙlÙñÚvÚûÛ€ÜÜŠÝÝ–ÞÞ¢ß)߯à6à½áDáÌâSâÛãcãëäsäüå„æ æ–çç©è2è¼éFéÐê[êåëpëûì†ííœî(î´ï@ïÌðXðåñrñÿòŒóó§ô4ôÂõPõÞömöû÷Šøø¨ù8ùÇúWúçûwüü˜ý)ýºþKþÜÿmÿÿ
+endstream endobj 158 0 obj <</LastModified(D:20090730214335-05'00')/Private 172 0 R>> endobj 172 0 obj <</AIMetaData 173 0 R/AIPrivateData1 174 0 R/AIPrivateData10 175 0 R/AIPrivateData11 176 0 R/AIPrivateData12 177 0 R/AIPrivateData13 178 0 R/AIPrivateData14 179 0 R/AIPrivateData15 180 0 R/AIPrivateData16 181 0 R/AIPrivateData2 182 0 R/AIPrivateData3 183 0 R/AIPrivateData4 184 0 R/AIPrivateData5 185 0 R/AIPrivateData6 186 0 R/AIPrivateData7 187 0 R/AIPrivateData8 188 0 R/AIPrivateData9 189 0 R/ContainerVersion 9/CreatorVersion 14/NumBlock 16/RoundtripVersion 11>> endobj 173 0 obj <</Length 894>>stream
+%!PS-Adobe-3.0
+%%Creator: Adobe Illustrator(R) 11.0
+%%AI8_CreatorVersion: 14.0.0
+%%For: (Administrator) ()
+%%Title: (colorbox.ai)
+%%CreationDate: 7/30/2009 9:43 PM
+%%Canvassize: 16383
+%%BoundingBox: 0 73 508 701
+%%HiResBoundingBox: 0 73 508 701
+%%DocumentProcessColors: Cyan Magenta Yellow Black
+%AI5_FileFormat 7.0
+%AI3_ColorUsage: Color
+%AI7_ImageSettings: 0
+%%RGBProcessColor: 0 0 0 ([Registration])
+%AI3_TemplateBox: 512.5 383.5 512.5 383.5
+%AI3_TileBox: 116 78 908 690
+%AI3_DocumentPreview: None
+%AI5_ArtSize: 14400 14400
+%AI5_RulerUnits: 6
+%AI9_ColorModel: 1
+%AI5_ArtFlags: 0 0 0 1 0 0 1 0 0
+%AI5_TargetResolution: 800
+%AI5_NumLayers: 1
+%AI9_OpenToView: 93.25 700 8 1780 1006 18 0 0 45 111 1 0 1 1 1 0 1
+%AI5_OpenViewLayers: 7
+%%PageOrigin:0 0
+%AI7_GridSettings: 100 4 100 4 1 0 0.8 0.8 0.8 0.9 0.9 0.9
+%AI9_Flatten: 1
+%AI12_CMSettings: 00.MS
+%%EndComments
+
+endstream endobj 174 0 obj <</Length 6746>>stream
+%%BoundingBox: 0 73 508 701
+%%HiResBoundingBox: 0 73 508 701
+%AI7_Thumbnail: 104 128 8
+%%BeginData: 6616 Hex Bytes
+%0000330000660000990000CC0033000033330033660033990033CC0033FF
+%0066000066330066660066990066CC0066FF009900009933009966009999
+%0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66
+%00FF9900FFCC3300003300333300663300993300CC3300FF333300333333
+%3333663333993333CC3333FF3366003366333366663366993366CC3366FF
+%3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99
+%33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033
+%6600666600996600CC6600FF6633006633336633666633996633CC6633FF
+%6666006666336666666666996666CC6666FF669900669933669966669999
+%6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33
+%66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF
+%9933009933339933669933999933CC9933FF996600996633996666996699
+%9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33
+%99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF
+%CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399
+%CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933
+%CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF
+%CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC
+%FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699
+%FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33
+%FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100
+%000011111111220000002200000022222222440000004400000044444444
+%550000005500000055555555770000007700000077777777880000008800
+%000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB
+%DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF
+%00FF0000FFFFFF0000FF00FFFFFF00FFFFFF
+%524C45FDA0FFA8A8A8FFA8FFA8A87DA8A8FD5DFF5227FD06FF7D27A8FD5D
+%FF5252FD06FF52277DFD5DFF5252FD06FF7D27A8FD2AFF7D527D527D527D
+%527D52A8FD04FF7D7D527D527D527D527D7DFFFFFFA8FFA8FFA8FFA8FFA8
+%FFA8FFA8FFFFFFA8FFA8A8A8FF5252FD06FF5227A8FD2AFF522727522752
+%27522752A8FD04FF7D2752275227522752277DFFA852A8A8FF527DA8FF7D
+%52527DFFA852A8CAFFA8525252A85252FD06FF7D27A8FD2AFF5227A8A8FF
+%A8A8A85227A8FD04FF52277DFFA8FFA8FF7D277DA8F82727A85227F87DA8
+%A827F87DFFA82727A8A8A8275252FF5252FD06FF5227A8FD2AFF5252FD06
+%FF7D27A8FD04FF7D27A8FD06FF277DA87D52A8A8A85252A8FF7D52527DFF
+%FF277DA8FFA8525252FF7D52FD06FF7D27A8FD2AFF5252FD06FF7D27A8FD
+%04FF5227A8FD05FF7D277DFFA8A8A8FFA8A8A8FFA8A8A8FF7DFFA8A8A8FF
+%A8A87DA87DFF5252FD06FF5227A8FD2AFF5252FD06FF7D27A8FD04FF7D27
+%A8FD05FFA8277DFFFFA8FFA8FFA8FFA8FFA8FFFFFFA8FFFFFFA8FFA8FFA8
+%FFA85252FD06FF7D27A8FD2AFF5227FFFFFFA8FFFF7DF8A8FD04FF7D277D
+%FFFFFFA8FF7D277DFFA8A8A8FFA8A87DFFA8A87DA87DFFA8A8A8FFA8FF7D
+%7D7DFF5252A8FD05FF52277DFD2AFF527DA8FFA8FFA8FF7D27A8FD04FF7D
+%27A8FFFFA8FFFFA827A8A87D52A8CAA8527DA8FFA87D52A8A8FF527DA8FF
+%A87D7DA8FF5252FD06FF7D27A8FD2AFF5252FFA8FFA8FFFF7DF8A8FD04FF
+%7D27A8FFA8FFA8FFA8277DFF7D7D7DFFA87D7DFFA8A8527D7DFFA87D7DFF
+%A8FF527D7DFF5252FD06FF5227A8FD2AFF5252A8FFA8FFA8FF7D27A8FD04
+%FF7D27A8A8FFA8FFA8A8277DFFFFA8FFA8FFA8FFA8FFFD04A8CAFFA8FFA8
+%FFFD05A85252FD06FF7D27A8FD2AFF5252FFA8FFA8FFA87D27A8FD04FF52
+%27A8FFA8FFA8FF7D277DFFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8
+%FFA8FFA8FF5252FD06FF5227A8FD2AFF5252A8FFA8FFA8FF7D27A8FD04FF
+%7D27A8A8FFA8FFA8A8277DFFFFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8
+%FFA8FFA8FFA87D52FD06FF7D27A8FD2AFF5252FFA8FFA8FFFF7D27A8FD04
+%FF5252A8FFA8FFA8FFA8527DFFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8
+%FFA8FFA8FFA8FF5252FD06FF5227A8FD2AFF5252A8FFA8FFA8FF5227A8FD
+%04FF7D277DA8FFA8FFA87D277DFFFFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8
+%FFA8FFA8FFA8FFA85252FD06FF7D27A8FD2AFF52FD0927A8FD04FF52FD09
+%2752FFA8CAA8FFA8CAA8FFA8CAA8FFA8CAA8FFA8CAA8FFA8CAA8FF5252A8
+%FD05FF52277DFD2AFF7DA87D7D7DA87D7D7DA8A8FD04FFA87DA87D7D7DA8
+%7D7D7DA8FD19FF5252FD06FF7D27A8FD5DFF5252FD06FF5227A8FD5DFF52
+%52FD06FF7D27A8FD5DFF5252A8FFA8FFFFFF5227A8FD5EFFFD09A8FD62FF
+%A8FFA8FDFCFFFDD3FFA87DA87DA87DA8A8FD5AFF52FD05FFA827F827F8F8
+%27FFFFFFA8FFFF7DA8FD53FFF8F82727277DFF52F85252F87DFFA8FD0427
+%F8FD54FFFD05F827FF7DF827F8F87DFF27FD05F8A8FD53FFFD05F827FFFF
+%7D272752FFFF27FD05F8FD54FFF8F827F8F827A8FD07FFF8F8F827F8F8A8
+%FD53FFF8277D522727FD08FF27F8525252F8FD54FFF852277DF827FD08FF
+%F8F852525227A8FD53FFF8275227F827FD08FF27F8275227F8FD54FFFD05
+%F827FD08FFF8F8F827F8F8A8FD53FFFD05F827FD08FF27FD05F8FD54FFFD
+%05F827FD08FF27FD05F8A8FD53FFF827525252A8FD09FFFD0452F8FD54FF
+%7DFD05FFA8FD0CFFA8A8FD53FFA8FD12FF7DFD54FFF827275227A8FD08FF
+%A852272727F8A8FD53FFFD05F827FD08FF27FD05F8FD54FFFD05F827FD08
+%FFFD06F8A8FD53FFF8F852F8F827FD08FF27F82752F8F8FD54FFF87DFF7D
+%F827FD08FFF8277DFF52F8A8FD53FF52FFFFFF52F8FD08FF2727FFFFFF52
+%FD54FFF87DA8A8F827A8FD07FFF8277DFF5227A8FD53FFF8F852F8F827FD
+%08FF27F82752F8F8FD54FFFD05F8277D525252275252A8FD05F827A8FD53
+%FFFD05F827FF27F85252F852FF27FD05F8FD54FFF8272727F8A8FF76F87D
+%52F87DFF7D27F827F8F8A8FD53FF7DFD06FFA827F8F8F8FD07FF52FD5CFF
+%A87D7DA8FDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFC
+%FFFDFCFFFDFCFFFDFCFFFD80FFA8FD07FFA8FD53FF7DA8FFFFFF7DA8FFFF
+%FF7D7DFFFFFF7DA8FFFFFFA87DFD52FF52A8FFFFA87D7DFFFFFF7D7DFFFF
+%FF7D7DFFFFFF7D7DFD67FFA8FDFCFFFD26FF277DFFFFA82752FFFFFF2752
+%FFFFFF7D7DFFFFFF2752A8FD50FFA8F827FFFFA8F852FFFFFF2727FFFFFF
+%277DFFFFFF5227FD52FFA8FD09FFA8A8A8FD07FF7DA8FDFCFFFDFCFFFDA2
+%FFA8FFA8FD64FFA8FFA8FFA8FD62FFA8FD05FFA8FD66FFA8FD62FFA8FD04
+%FFA8A8FD60FFA8FD05FFA8FD22FFA8FD04FFA8527D7DFFFFFFA8FFA8FFFF
+%FFA8FFFFFFA8FFA8FFFFA8527D7D7D527D7DFFFFFFA87D52A8FD16FFA8FD
+%05FFA8FD21FFA8FD04FFA87D52A8FFFFA9FD0EFFA8527D527D527D527D7D
+%FFFFA8527DA8FD15FFA8FD05FFA8FD22FFA8FD04FFA852527DFFFFFFA87D
+%A8FFA8FF52A8A8FFA87DA8FF527D527D527D527D527DA8FF7D5252A8FD0C
+%FFA8FFA8FFA8FD05FFA8FD05FFA8FD26FFA87D52A8FFFFFFA97DFFFFFFA8
+%A8A8FFA8FF7DFFA87D527DA8FFFFFF7D7D52FFFFA8527DA8FD0BFFA8FD09
+%FFA8FD05FFA8FD27FFA852527DFFFFFFA8FFA8FFCFFFA8FFFFFFA8FFA8FF
+%52527DFD04FFA8527DA8FF7D5252A8FD0BFFA8A8FFFFFFA8FD05FFA8FD04
+%FFA8A8FD26FFA87D52A8FD04FFA8FD09FFA8FFFF7D527DFD04FFA87D7DFF
+%FFA8527DA8FD0BFFA8FD05FFA8FD09FFA8FD27FFA852527DFFFFFFA8FFA8
+%FFA8FD05FFA8FFCFFF527D7DFD04FFA8527DA8FF7D5252A8FD0BFFA8A8FD
+%09FFA8FD04FFA8A8FD26FFA87D52A8FFFFCFAF53FFA8FFA85AA8FFFFAF53
+%A9FF7D527D7DA8A8A8527D52FFFFA8527DA8FD0DFFA8FFFFFFA8FFFFFFA8
+%FD05FFA8FD22FF7DFD04FFA852527DFFFFFF847EA8FFA8A953A9A8FFA85A
+%A8FFFD07527D527DA8FF7D5252A8FD0CFFA8A8A8FFA8FD05FFA8FD05FFA8
+%FD21FFA8FD04FFA85252A8FD0AFFA8FD06FFA8527D527D527D527D7DFFFF
+%A8527DA8FD15FFA8FD05FFA8FD22FFA8FD05FF7DA8A8FD13FF7DA87DA87D
+%A8A8FFFFFFA8A87DFD17FFA8FD05FFA8FD60FFA8FD05FFA8FD4CFFA8FFA8
+%A8A8FFA8A8A8FFA8A8A8FFA8A8A8FFFD05A8FD04FFA8A8FD60FFA8FD05FF
+%A8FD4CFFA8FD15FFA8FFFFFFA8FFA8FD62FFA8FFA8FFFFFFA8FD4AFFA8FD
+%19FFA8FFA8FD4CFFA8FD68FFA8FFA8A8A8FFA8A8A8FFA8A8A8FFA8A8A8FF
+%A8A8A8FFA8A8A8FDD4FFFF
+%%EndData
+
+endstream endobj 175 0 obj <</Filter[/FlateDecode]/Length 15093>>stream
+H‰ìWiw›ÈýþÎyÿoÊxY‹·$Úmy¤Ä±;/{ ZvC“¦QìùõS  ˜VVœ—|˜ã·ºëVUWÝ2ðcië¿ÿYûx$e41;ÇLÅ&Ÿü¼ûºÝzN5,zÿWÓU®S±»ñ`uk
+ñï÷îŒ!à=NV™ (ƒ¿ !Þ 6[ËKˆÏ¯TJ…RrOÈt»~‹T±™a—
+Q¼óÊýÎ $\¥„².ê,BàçTô·³"T½ÁZÕåfÿN¼¼lyM¦n‹“û‘^4 Ê $ô~¸7±æÌ9à¾[öuÚÍÊòAAÉÉ…\Òì
+ YêL‹Fé˜^Iµ`Þ× ¯Ä
+hI* U°býðÔ(ÊäŽýG|= Èù¼RÌfsÿoz`ÿø#¢jÃÆã¸U6À½ã9X&Êt>4„xG™¥‚}òpa”:¬lçˆÀ㎠Uˆt´åáN/Ü´‰‘õÃÃ?Bð
+Á_Í0›/$ÉÓ1¼œI2?:YN"¨Át€n‰™ŠM1ý²HÑDš_p¯3Ôû|¢ 6© 
+ñï÷îiBãd-§l~'•)ÐÕìú-RÅJd†MÍb«ºý§‹zDHGüœŠþvV„ª7XïÄ…——-¯ÉÔMÀbqr?Ò«ÄõõçºÃ`Þ9¸tDˆZ\7ô[P©rÌîI…æHC}g¾Ù™ªŽ!:ö}è±ùÛ6ÖtÇ.°M‰ã¦ü½ï rSQ¤ÚÄD‚bp,©A\1ob&3lc.=Ÿß
+ùü^>ö,I‘zóØùü‚”L³(ݘ0<¨Ã¥£Žu?V‡ #ŽáTljÞ©³ùYÖ\'ÚØ΢â±öÕÆÄ$ŸÍe÷ãÏJl¶%B Ï^Þpå…Ã- –àLÖw:gÈ´-ïK½ƒ“u ’7 w¢+¾p'¦Æïv"x%ï±–ºø–KuЦ¨§ß…”Ô3l!sà –Ω5Ë|FÉíÈ;²ïß”› ‡©ñ%f®º†¯¡ZÜ9bð’!ÔvÝèaíœÑ¾Nðßø.è
+«EUDÜ!`{€h•9CC1kÖXÿwOÞ»WGºy¡†™üÜ¥–ÿc~úñ„P¨Œ l9ÄôñiÌ:+©êf­K¥òäù.fÌEÕo-ʸ‹«v:±¡
+ÿà©î)§ÝvKª õÆíÛ¦&5 ï)#>œb±˜UæEeUõÏœd¤ÔáÐÿ£iy¯l<ñ¤lû¬ýS3êð¹HŒFÐךc]u'Sšˆ''¤
+¢‘>#—Ñ]¯ìÇá0Ž…çܧDƒjJ?¿9µ:ÎÝl.à^œó»æ¾>jº¸ BMz'Ëùiƒ\Ö0÷µ†{SÃý% ³Ój9XÒPYIvÓù(fcK>mt” Í_6xTL¬“û1IH0+~YáëÌâJ,Á,®ÀÌö¾Î,ûufJdK²’CT’ULuÅããÊ+45fVˆK¯Lý6ºýøQm¤F ?èJ75úÅûëƒèa©è?ªiªÄÑ°ôº}3ì¨uwO‹÷2 N¨½gÍ1î°md¹’À'Ñe“î|ëe3x·v¥k|xŠ]! p|ÇBª§h-~WÅ„Dè°E£ÚÒGxf‚£Câ1Ž88 ²â]ãwÛ Ê ´ ù¢ð0Âæ’#—Ìù”ÂÒqØ8Ìb®‡
+®©õå³^äi«Åƒ~ñòåÛwånuç2þV?îð}éø¦ñ¾th­5§‘9Ñúp¯Æ§/œZÿýU±BJäõa¿2äÕañˆÈ§õšª´>—ŽŸm\§íê‡Á
+­®5µæ£Êöþõj¹³½bŽx4®9¸Îlªu5ÿ2Sæ>—×öÖ7+Ï·>m–ª¯Uìüõôòlex¤ªèÆýK߬÷[ÃñÕŠ¼‹ŠL_ýt¨8Ó*díÙÆ6Û|ç”[õÏ.Ç¥£³á\S8º|_*›ê†±ù¤}´[4Þ=Ñ‹Å]û_Ö«t=Y‹^‹Z­Š ‚ *aRQëDkÕ:á\m­ÓýŸ$  íûž>çûþð
+X;¶Ò¤\¼9.¢ yô/ïb
+ðÜÆk­¿Ù÷÷Ƹ³„Mã£äèKvþUÝjĺ—û)9Öî„°iƒÞÝæfÁg­7í–ÕóiÑüìÿîµ›{¹þòÍs-š?êËÒ¹t£Ï­;Òëmxʚǡ¿ÝôzÈzs0îÄÑnu¨nY1žhÛÆÕˆöÝ´–údGJ•ü9d,Õ£cy'6,ßÔ<.`áþZÝ¿t¬õ‚MÓt9Ö÷ê\OþgÄ® ¼. ;ì ç­ã\‹ÿdõ'ÅõébÂs­Òç`t.AÿmýØÃ6ÿfúêjaw¤'×û CêêAF™?ªÌdùväÒÖâMÆ3}Pœ>ªó¸HËÓ©ú…ðÖ@ï¾gÔN§™ŸÇ(o•ï{Šž3áj„4-Æ`ï 7W"âËc%e¾« 5%Ó§ïhØ\¿¦Œ˜|VÊáÏ
+Í¥Š<2ÂHÚÒyŸ»
+µf²¿áŸV¹j¡Ãm{ƒ Ì k„:Ú8jkã&8kAž5ÜBr~ž6eˆ§f¤Û"P†v»«>1BX<ƹ hE•¥ç_w¬<•õ=i‘^ó ›*jî,Ôˆ8¯ÎöTÙ$üWH4¶hl»áAÀ{Æ(V¥ìõî—ýí;ESÎÙýâ¥2LŸ{îÉ×"#îÓÁ‹iˆÐçÃÆ!ÏÆ9÷|õÌ»¯¥ù§ÉñjXºƒñ?¨#Í2Å]lè î,‡[
+‡ê‡k9váMü(2€½à×ñrDgdÂÙ,»¸"š®à#43ӪǾêЃ”ê•ax²ëÛñø1V‹ÿÝh™0ïØLŽM4 Ý…õ¥ð€Ðµ^q0ZLx~Ð[c¿q*æŸaattö1@.Ì>B‡ýA ܆qq ·@¾67Ó­êxêˆCrüAØ“—t[lÞÎH#‚ºÆdÃ,=e9•Ð²C胈˜•>ZëošwÞh€Ÿ€‡+Òé
+‡t#1«BY”P¶‡’éÎêz(·;‚oë3ïÂ
+\;7 ê(u†],gùoÍ€Ô³/Ý„Ýi³ÂJÝ[DŽÉq'À½ñŽ¾[ä=W÷à"™êÝ2ò“™ÄØlþ¬£ÐfQâeùÊùj¥´ã´úedíî?›ùm
+³"˜É=²[nV@“Œ¸—KŸK¬üŒ
+kx*y¼ò§Ïú³:âcìFŽÎo:wÇÿS
+‘0&‹^Ü–üˆ3ßFšüS'HÖYlHdªÐZ“1™½å˜ù©Å…ÔIÆJH¦Äˆ±{¬›9Eóg'Ä,iáÛAËi°€´8{XNRy‹Æct<Mh„x”Lt“è ­È·Œh®—
+‹IÒé­ß(rGÞ3I5gbÜŒáXDƒ‚*jÃ؉b2ƒ˜,ºPûðx‘ÝÇKékÔb$”KC1É@ŽarN ý3‡… a³_¾Û"Ø©‰F
+é1Ɖ{çb]„ÝßJÎr¶{É“Ñ,$ËTÍeîs¥JhÝs,´3ð%n,†ªðpKÂQx40Ѓ rü"¡’HYlç/4 tTòœð¡—³"˜ú•nÜ7/ª‘ø™HßXÀòhÏ”K{-O÷Yúšñ9j1Ü&r“ŒëeG"t Š+g‹²%,¡D@oa3 ¥lm¦`èÊl²Ÿ–aÐIª1Ƶ—3ÅLxK&ˆ´ù¸3)yK”Cþ¶ÕŽlÏMìñ=BíðPbúåÙç[ÜH\"‰9]hˆÚi\‹¨ÇG0j¸xÔVåàò²qP
+Ö &0`Ó2е¨O, ¨G ËÓlMB4~b ~à.HÕÐpƒÂ颊òœ’
+—•zmáG‹O§–Y^©=¢©±o;n„çÜ¢Äï,QSÍ4'Ï©øy0ô' È-Š¨È@õíC-˜„"ÿû"|g¸ÎÞZ¦a™à­b/ÃKR¬ŽÕE™D˜í%ç/Ä[[ÿ_D«\—¹çhíK]Ö¬•8ÿ‹ÇˆDÁ1~ïñr7=âºTŠˆá2omòKg"÷ᒫ†D>âDq Ä2ùBEÎ `q#Ùe½µe¢@É Úã¡oͤéìOü ©š‘ûê¯ÓÐè­·¥ÃýàTüwv÷=KÈžÒagc5êÛ•ªþ±uú?©¯}«5uc^©º;…˱qêÄFšÎZI“Kœ@+OÁMnô¿ Òp¡(âFÐ’sé°‡2¾ƒüõ´Ú@•Èªèb6Mª‰øZtïÊépáçöª1ô櫵!S"‰æµø‰²vçùRƒÙÆE1Lå6‹°£Æhb Û;ËS%i˜=>ÄõIK4DI…¢â„A\æ¹"/N»¤6pHâ^ û 
+.—‡áìE"ÅTRœh ¨Un2C¿¦XGLüàuĽÊØçÜøñB"ã?6"òh H™«’ºgöÅð—9ç| °v¢d›á\:U©ºsyº‡€xq¾#“ð‹dŒTŽ i¢s& ¦°SÈÌ’§ÜàK½™:Ñ——9Ìs>5(mDÆKƒT†,ýM‡ŠÌE/={ÈÀÍ2U¤w¬/}Þ¨gB§AÜv‹ ºvR+'ÿüH&rè3ƒ‹WwDUwÀ‚;Pÿ¸Ýu‹Ÿà„ÝFŸ©æ}””ͧ§} 9>6£Ó1¤ê¬ ¯³ö?A#­`RŽ°ô â_iÐŽ>RQg4ž¾HFÜ)ðƒÛ÷”óµ)Ò4ro`Šº€økKNX °’b³„³§râî‡Qa¿z  ›©ûÆ£6Š±Ke`I|Ýìó>HÓ
+íJ}³1lè÷üDï¬6¼³ryV¹¨hRç½ý$T.xÌ/*Ç[ízvúÜ|½) ¾^Õ÷ࣼ°hnNy¯Ïÿ×<ÒùûQõ<#CX®/Nö÷ëg'Õ«Ic8ÜqÂacØUÊ‘>oñÜ4 »ñ}ý´mÇü¸x¸v“ý«_æ®Nƒ·Ù¸#ê2wZ“i+{ô“®=7µ¯ýÌòûý.>—ù±Röô|í иñz8OÏKÖã«3™‚òå±=OÐ+9£´Æ¾Ñ—L»[(îÿ<¶=tJ Ùoa8™}*¯—Žw«wx7˾]² }¹¯¶—ÄÖÊÝÁb}¥/ïæ}kKªöÅý’Í:/1e‡£bëEùh«ñÎz²þ…mo#Œ•{c½æ6w¤Íþ÷0w³'¥ë(_«O7•pÖòãSAhVomV^w×…Ÿ‡›úA­ÆZÆòE$ë—Rù±Æʽb¥p~NÃ,¼ß—ZCi X÷÷‚~ÙžÏY{ÛÛ¼ЇüÔfšânCêøSûL_Ú=ÎZ[Mmù¥læî÷ÃY‹¿ÃXÆ&®Þj6q«Lÿ9,~ g½éìn¼W­n+Û0š‚ÍjÎw/ê%½øÎZÎ<fkÚýM+TÓ_™Ý³Ñ®`å4Nj:§A®nlh-‚õñ¥ ¼\ôC}]Xmë-ÿ0
+4ó ß »õ¯gk<È…ý ëõ×æãœõqÿ¬Wgc¢@ý-6°FÐÄ
+X0–Ø£Æh4ñ4‰(øÿowAAXïò…»¸°ïM{3ã5 ÆÚµMOAåÆþÌÖ—<Uq
+þ¾{ÿ§`qZN‹±ÎúÄðëŒ/êC§8§ÕŸWkiÊðŸ×ë﨎Xœ~ﶡÍ2a8Õ2m8ižFkóçÿè”äæÓé®wTFÌél
+•F«ð OMz´g¦ß’cB²ÚiVô¥Å# T((NPâ}ý·$OÅ>Í/h厊´ýàßj †ÑƒÛ Ó*ÖdZþð«ªVï Á~ˆ>šéTåƒ&§Ÿ…O€Õ{×X¥÷ûˆìv
+7åùðŸÌ܇V\µ9ОýIºY¦ܸ¡ßꘙif!°GÙÇÀþ˜<ê8ñÍlÙWw ëŠÂîáw1ñ—¯(ÚÌ
+
+q›÷Ʊ!'u°MKáôAî7qÒÚš‰Vø¿]¥rJy_”°œ
+^5µ2Oác±µ-b#…—dWF
+¾;g˜p#ÃÒg¤Åt³Ð 1eÍ! ø÷ ËÜxl,¥³Ö¤?[¿á­UÃ.·í=ßô~`5øãyZÏϘâ<ãt ÙˆósNõž`–×êpyœ~!,k7ÍÐ/Éدp)¨/Yî6f£€´–%lÓìCÒN'`žS6–åayÁq:I83
+,¬± «á¾<¼·Õ ,ÓW çÒÆ0kÏ8‚³U­C³Vxø×s°p‰e“†Öà –'|ˆ—1U(E·´v¨:ëq`™Ó­¡~‘Ô,Ñû¾ýѵö8²jih„ #Cƒ¹ð 44¿V†f¸tnh07côžeQ‹ªæœÌás3 ïÉmhÞâÞ$/€gx ¨uÌ u­hLåÇЀœnÃû2wϸ‚ÌÓÐ`ê6Êf Î 6H$nõYFŽch`¿âØZÀjâþ‰´ëWAœþvcú¦Ñ±‡…Là›F‰7Í*$gˆå–_V4,Cx:ó¾@’O–dzߌ‡»ñ0ú€gà¯OÖ½!GÞ´x:I›CŽ=Ç“ï}Ä÷„N;€ò_VL¾'Å-Ç~B¾mýŠI|Ù˜B°7ÜäÈŒ%ð È­³¼²Î°ãÑàé4$K/+,¡)<˜ …”úêâk›ÆµûdÈ™å⻀g©?·µ‡VX‚ÇƧÁqåóx°„.´“±° x^ mð2L,×α´•ƒä0^Ä#b „$¨É–öW@L4‡¾âÅsa*U¿ò}h
+3‹ç,y`‚J¨™(–ùÿø`£í47ÑØúOåâíéíBzTzíBì·t#¯F¹—\GšÇË¥XíAòMkm)Öî¤#a~§BÜ€ÿ(+ý¡2¹œÅ»bGúw&˜zLÝT®ÂƒH¾p•ªŸƒñù.”×—†_9M\'´ª“oZŠ6•[9ü|+¥Â ¯ÎÔ?#é­#%c·éï
+æŸ>­óÊ%Lâ–-åó-S›¡M™^å]´M 5íäüNzµ¶>çˆ&ÜLgû¦yU1Ã1‚“û·m» ð4-]ñ'³/¶Ñª}#ÁÅuâ³Ø)~+[©nڪ̈́ã'‰»÷M™?†” ë'½÷9óW›—ù‰á`_§žx:{oAÊ·ô´UÀIðÏ Wŧÿÿ*e¶ ¯b¼4|—¢­nXñœ=‰è_5[6r«=™n‡Y“´tíÀãçáÖûu©:ÉcÓ¾.²ÍûF±½é& MÝíhMB§SõÈfÊ•Êlk¯Ó$ðV@¡…‚³±P, ]4„¥¥,ÅfSÉÛ3Huv´•£hÌP¨i aÍ “£`ȉÚ9Rè¡Ù¸Õz€‡·VøŒÝÞƒ;‡V@ŸÃXùÛ—L"Tb"®[p·äU†ã|’ÄéÇ´·ïÄ uƒùwî'~ZúP¬³C73Á·À²ï_àbêp‰iîTªVjšMÆ©.ƒð ÔËÜ@tqâ§Åì7ƒu.Qz¼¬1;WÀf´´û5³î—L9^en¸î— [¥r¹µ.è¸iQ[+ﱂûÒlÔHN<oJu߆>úà
+PB÷–?¤OÛWm¹®‚à™âÅÈ…f Pž]TR½¾,]_VüÛ훨â$ðW¶co ¤ÑG_Õ#ìWe+n2À[ýµ£Ù«^6&j\~^«(;(ÕÝ%hÊn´±æ[¸iœÇ%HîøQZ€ˆfI¹û2ùjAãqÄa$ýÙú -;ðŒ«a|[fGЪ~lØ RH‡¢Î0ÕÒLq;O¯†‡©àž5vÊƽÓ
+?Ð<‚U©0³ÃÎ"i«+KßÃß¼àÄö¶ö$ï%ê(+ŠS·Æ $r¤£áÆ&Püàºà3 Pâ( bƒ®
+(ñÚFS1öÝ·n=Zµ÷Û–uNÌ0¹5Ž´@NÃ¥óœöÊ”©5é­2\¿Þ_•‘ØxM^znðÐD ·ùί„áVƒ'Û¢NšB—¸]Ô±)1®€ý”êtÜþ/À
+endstream endobj 176 0 obj <</Filter[/FlateDecode]/Length 17828>>stream
+H‰¬WYWâÌ}¿kÝ„!B2…  ai@Ú¡‘ÿÿUUBÈP_jÙm<óÙ{ŸÁ,Î$¦_Ûh±(£EZ Ñóÿÿ£Õ‹H57ÝÜd/}Õp;µMÚÑÒ
+³1¥ ªu6À˜Âû nÎØ8áF†À VC¥Ñú<€½Ñ{É,YÿèwêeZc¸ž˜›lW´~ÑÅ;ÈëÆX¹ÝÑí6øú¼@Dºÿ–¿ò±NŸ}ÑGƘÈÛÂÒ«º7{ÇK÷Y>(fNŽxËDædõ¯_$Ú4v ‘šÝô@“o\“º½‡½éᣦI«Z£
+¦ÛõŸ¯1P¯ô1øSÀl°îMÄÈŽ€[Cóg3ª¢l@/õ·z-s¡ÓX e³¯Í…Ô!3lÁb1›¬ÆMòVö€{“‡"HQ@Kj±U@¬0®Zò’BX"ÈÐ}à þ÷ý2ÊAÓî L"è¤`Úh!‚°È5iÊôI‚oàI©×šõ‚°hOgŒíö¡ÃcÌŸ¿€j7miÒpp´ö®€{ÚÔëÄ[Æ¡h¬¹hl`Î[Í‹oö” ܘYT£U.¬¬Ux¼A” úlV~ñwΰ‹>+ßã²²‰’¡°K÷V>Èu€|ó ,Ú}Èʦ4uÉÁÊp6pYÙ”¡Z´Ã$Õ :î÷” ¯µ³ëeÁÊ&
+UÙ“•¡I<V6Ù;œ4KVÎ…h[VÖú®§ d4¬œ 1Žý*3‹Ÿ~<þ—ÈÑèQíÍ’adO#éC“G獅½„Jk.ø…{Á®l¾!1.¸a´Ä6šX°z¢¢€sÎiÌ5²¡ ’`Q’?±°ê9{´È…b&´PÜ#¾úŠ4ý¥ C®1ö%@ÕlÙSÚÁ¤ŠKˆQ_ƒ•>QÜpT©®2µ5ßhl¸âU-ð¦×ˆÉ'8Ku­ezÆï¢åTqù#™Ýµõ…$½T[Å
+‡JÎÖ@¿
+ çÀ€”)±IïÆ.±ùÅWÆ5Í4LÝòS÷¢ùÅm
+ÃÙ\¬ænIL§hÙZðîoëÅ5Í&…S´l-ð/™Ÿ¸Z«“Ö
+’´fíûlkº©­…°°†y7ñHëaTi ­'S¾srÝ€jÍÿ{•ûRn>(BM‡’¡ýQ¢ëÏ>äu•üÈ3‹·ÅÀ¹rzÑŒ•sÐt…áF§^G.©ÍЭµ¸û%7ê‰k€‰tú†kã-7ºY‡l¤’ÛöÍskÜÃÕ§ÊiD`]¹fjŒ]9GD#0¢ÿÙ¡`u°zï’Z4Ö\Â:c¤ ëÚ±l0¾û±¢å"ð~S> ‰§×°:
+±­Õ m×NÑ憞¿Ö¬ݘç\²èqi7ÜÜ’Sä(DEƒ‡(˜–šm€X°£A¬­¸ý)‘s£k,Ké’›Ä<^k¶†p ÀÊŠÖÝó+y±&+ˆÖN1”ðÎê<4„³çXšø§¸…|ãH¯L}c;‘̲™[-žé¾±Ú½ÝÑA¼Á×ç
+¨Sþ;“oßɕ€ÉÝêK^‡›&àКæ FÉF*3aFk£ 24èt°æ€ìL©{¬½_Õ‰y€àb tP:.¹–ØF#W¤ÜûPʵ[çTÎHpFäO|FAø-S”åâ=mW(Ð'Ím÷l®%0Ú?^-Ú~÷ìØà­Ž$ʉ•;P°r“ÿX¯ÖµÄ‘ ú,L@@D”{ @tÅ뀺¢#¼ÿvw’tº“NàO¾™Ý¡ªºêœS§~÷×¹ÔƇj¹t.õ°©ªn}ùNÁtäl^£œ‚ßm§×ÕP̧Y§Ô¢Lé»íœ¹õœE¡´Ï¬“à‘DZæ€ÚQ¨Iåal­ˆ‹ÇZ0QhD¡FZ裨<uq¦#ùLÃáÉ"yÖqÚ¦<z¡¹=-lo4Så§ûäÖ+C„ùwÆWY¤ša
+¥°WË•`ø4rmPSH¶…ÄÛR-Sx»PákhÔõËÛ…J’M¼§¤ä­®ÐNå»Âþx«"±¡P×oKƒBŒ
+F†#ùn( okM5©»oAM&" 
+—••·è(ô,kgÞZ ”ŠQw?¼g/OHC³ö52ŠÛ6GVÌ|Œ£$¦tGŒá5ŽU`tC%/~ß°í]èNV†‚!}¸{-øVÇÙëû­=Ásf<€Àšb$‹À[ 6b‡¾^h5PÎ*ãÅîz
+ihÀm4èí0½ÀÓF€µÅ·vL¡ m
+_㵕aH¿[‹§§qnå|4NÝÊ ÚÀóT°­dêVÎGE×y•ÅÙzLþÇåãè£o¾×t ‹gŠM>*í'ä6^ÊŒ·¥'A¿X/8ÐÃŽyßX8ZGG%I½d’Ó)#gC~s–‘F”5a«NSÎ7“Ã…à¡«E>š ªHƒ#ùñsT0ü—õ¹ô/¡I ,žnÕñº.¡ú~ðUp…Nª:Wj§Í…¬ªËjñ¬ùܶ˜%T§ 5Í™e½×'óUÕÑÔu™]w·
+ëR œ<Êo}9¼ÊýDI¿WÔÛ:·Êý)õL)Ê>_[õ×ãrö$†²zÙfÅ Çm§åÊM|1º·€#¢<;¬€æšÅ|í~l4ƒÿ®üÈ‘£"—={Úw÷•þýÍÄF‰ôåÛVHƒø»yÎK Š ñðʳº,9íÅ =
+OHâí 7ijuÐf
+w7`(Ph½&Þê¸ïFí­s­zc³Ùð8sU¿û»œbÃÈŒ>.Ͻ¢uËVC@Ä¢¥û/÷h`^…”g´,Ç-³› )Ô4kßE†h™?ò³Ç3ÃU†¥iYŽ¿œ}L½¢)bÞ³°\¤9¸þïêų¶K!Zä_úü‰¥i-ž J v¢¸J}Uú•ú_­¨ÚLÝÒyÍÍ$ _B¤ŸApýåïæi~`çbö/ßú-ý,· Ý(`Ñ¥Áÿ½Ë”/Žœþß"Y¹>/\)ýÉã³(U'ïr¢7ˆ7BG÷¢Å˜Mù‚ë¥qÝÛÞ7D§€Ä&ïm¹¯Ê­iˆM‡ÿ¦Ý72Á“ÉŽÝj3dÐ@Q<ˆÖ^ÑpkÒÉ“¬ ²ƒ~‰¯W)2•±;Ävñ‘£ÁP¿¤PºòmÅP˜éÑk\n$óuls˜:HO½@!´·Î a,RÀsøÑî;«á䣘á„p‹‚4[œ·(Žø^gŸ³á.˜Ûž¸Û¹@–êÞ„åU #Å\ø¥L–˜Fd³íj×4×p6ÈZ[NÁñq”t
+J‡•ód@”¬:è\ªzwÖÞWç.37´ÑêMÓ¢YàJíÑ.¢•ÓÇP´´X¤\¦uØ´©ðRw¿‚Ø*¬Kõ‡•B
+ҘѴϬ“ài' ÐåùYËëð‰×ãÚGP;Ò¹7>vˆ‚íúAã>Ø~z+¯uRuˆ7’zÉt™)*¯…€ÃúdÂQ7Hc½Ÿc<ÒÊ ã §º8Ij½Þ4[÷•áÓ%ëY“‰x­ù)ËY“C
+XÇ(K®ø*‹³õ ‰<–Eì^ÂkÓÅ,Llžéý/Ú7Û~~éÙ6=„Îæ%<ÚxG¨&Ì&/Ôæªb6š†~ô;‚@$ÊKøŠ¹Ã†¹%ÍÍ2Å>4g<¤[ƒ¬­÷ƒ¯Ê€+ôÁsÅpåæ+ôÛ¨çzI+úæ9¢ l /빕I»VR Ô<·öU Wu¯é¦Yî: 6À«@£º3{‡ ”ewÓ£áÏ­¼}&ñ­éT¼Ü,Û0¶ÕEÐ?iö4ŒR¾{E­!Íß0r¿L–ÖÆ ”F ñ$R‚¡ ûAL£йÌ0çèCئŠék÷èܯôšî=44Í*D.=tc MsXy]í±‡Pl ÉõC‹"(¸¦¦­‹,W+Ó·.n|…Dë—ªŽ>BÞ-5¶7x0y6M‚U&€±/i0®K˜Æ³U¬V¹Iðɲ9ÂH†Ì{3]ö¯Xï+ê‰ pÀ$X„Ó
+‹b?š´%$tXýl°–C½o` Çí¨(EÐ;r:l²¦YË6uúâ[-qï rCvsíXÒ€2Êlíƽë‘™xoJ•[Ó‚
+…ˆÐ—gnŽÛH‡Ñ 7W\¨&Íò®‰æƒNk;{ ›ŸËÈ„G±Æ.·¯c¬H§Ý ÷"Vÿs¥”}||[
+ѳHâ/ºÅ¨Ê6›ÐÍã ½ˆ ñ¥f¢Ò~ì=”KÒ×±áÉ?^îÇøhÝ•YЪßb‘=AnúÖn”àƒï˜ >DÍ¿æøâ¦L£‡½Qì†úŽØåñÍkkƒ#¦$nRBË«jVÆw{îÍ- ÂRœa„¨›-“gØ\š4;5ÏìíúæÜ« y nk8"?Î9˜ÜýèÜ §š›¸^Ы‰Ù¼Ú²[e³Í[ÙŸ„S?!BÉÔöc‡H:táÊü¸ý¡‚¾ßlèãþzŠb¥ïǺÛLL¨òot*è³g¹¶Ší—kª –ú£Ýe3Q[˜V÷gpeþkñÝñúÎÏ∗w4wÅö•v}Ó¸ÀŸêáôe¥=hòš‚r%¿¦€¶$­ULˆ ³
+~‘ºœÂhØügÖ) Í}ø‡Þ3¡€Î؆[³ü§à»ˆõBÝØÖÌ4 ü&¹ÌŽÓÝ°¹Ù€•£úM„F40H"ÈŒ‚V¨k
+h?ÓÆ \âå³õ¥›
+ ›{"¨rAGÐ&-äR@(š V†óËu›•;–ÌÒ+_P²áæÈ>‹÷O„tÕ ämAÿ +¿-¬|1 ›ÿ`ekà¡X Z»î/XùüMnƒÖþ„•;–¬çf„; ý@BͱòÅP8VÚY.ÍÊG¼íù7¬l˜<°ò…½}¥ý'+Ã=$Ç]ce„°v¤dèæ׬ }5Ö÷òõŠrã£Ê>êðÑØšìXÖ‰&ß7÷M^³‡ÜÜ1ÙÅþfƒÛ)íb‰ûå×Òý6V͘#é“´Ü xf7+no1ÅùÁ Ó*›
+Ø(Õ³iq¦làÛ*÷Ç?ë²w§¿ÌÄZñö ›_˜\{4TràÙDé­…Á{À§˜®È¡‚×°¼#é¥ÁÅ w䟄d¬Kª*uköÕg&Žï@;™ˆ]žêM¹PCÓ"y'iÐtó IH¹ó-’ê×K«»ºI¹ó-ÊÍPô0&)×j&à+¤{Ø=¯ÖþýÉ/z¼f™ih£Zo'ã }:+oƺ6G“owµÞÏ&TáУª”êÇpht°6ØSxû<…2¥`®8…%ø&•Ï;¨÷Êt¹ì[èµ®õZëîkn´¹ß·»–EÏUÁÖõAC£ã8“÷ó…9צAõ+êÒûùb‡ŒS+…¬éDbÝZÌ”¨Ò÷m}¥Vó¡ÒÎl @±ÅA“W …ÌÓ<·|î±{9øí¾Ñ
+m¿Ò¤?g»ø{¼C.H_J¯7Ç3èf{¬jäþ2½‘<¯£¨®Ó«‚“4L׋í /Õç‰%*[h]ÑB¼Ü¬˜} `x(˜s^Ìct¤˜u±Óˆ
+ iÔ{ ë\y@‘ÅŸ@±õ,€òg·*øl*ßTi¨>w%Ð|¨ ¹öh •rÏ@ÛY°ƒvô„ntýÅë+¾É諹#¥o"ëÆʺ†&“:ƒ\Ñ+0#Ìù1ÏÅË–;$:ø g­ÔKqÛL÷*:ÐzÁÛÅHÈRJ÷Ü®’’Ããùè€AàbÐ _òvŸu=@–\1¯»ŠŒ9¶ù>•Ò¾¨å\ ¶ôÕGÚ
+èü›•6¹”úzָȢÉ~oí“l*¨úsÐ Ç–òwõ”dë™V˜ïå;ONêE:}¹×–sè95W4êŽ\…Ù
+GÁâ½)~ŒJ-a:àc{!{Päzo$0‡Ñž»A$°Ã/ÖÆç¡_*¾Ã’}óœÞ‰+Æ·è¡3vq#Õ•&YûYl&
+’/bßÂy×Ñ4ç]õY%lää*燩šÅÓŠöÆ'¬ ÓK.ú¬PïUñ¤4µ8TbÖ(úk)|½ÆŸ RáBèò—Òq?MÄ‘«n5J ƒéûcÕ±ª6tI”}£ÉTŠ±ÃÃpή‰p
+å]ŠLg‘ ÙÂE4bŒÀý@|g …Æ/­d¼ÿ&rlzƒSÕµ±ß?]C}£HOO3qåÄQ %?ŠR©*f¹œ±ù„‰)ˤ8jô6ì 4­B4ƒcCXxÍ-Æ,"«Új=hªNïx‘±áŠô9lË='VÜòß!©i¦(»1wyÿ¯¿ *°K©Ï¥¼?«ÃR¥ÑÎô³iŸ‹™eÙ&÷òIȶ+Ât†»%!S)?9³ò%©lC3-5ÕZ
+1oû¤¡»ñ
+M¶°ûk4«5~–t.Ï„IæSWÚYGÐ%W´$¯V«saÚï“|©¢‘R*U Ã¹´;­ÈÙJHÁ(ǯϠ5˜<E6cÊ{“l\14ÇŸŒÚ¨n®Ù
+3Cº¹êæ™ê—ìa6…ð
+a‚o«¬x$–†¨>òJzžq‡'›SS®ØñÎÕÏ…$/-·!ý»‰øþfü…˜^NäñÊK/€“ü,²€æ}"!ˆŠ>ì@nlO˜µpxiÀí«œæ»çc˜JL˜dÕÜCO ´Þ¸`!Ñ
+w 2Æ×™\š±¯vE°Kd’áqô×>){¾ä³ €~XÚÍŽé¢EÊi§_¬V$f` †«whž¦Y{W½=q èµ²Ÿ¶ÎTjK©QZæz–“„
+ª ƒ0(\äµî¦ûÚ-ZÿB;  íiáþzظ‘&ºë ÉÞ)]ÙoT­¡)Æ&ðš ËÉŸ(z¬Tªaá¦^fÆ<+£j*êdäÊɸ?Šè—±X£¶ÓÙêBÊo m=ÐögŸØó´4Ã)ðœ=™&½U͉ÆCb­[ž­‡aƒÃ}ÕÉâs*\0Í Ýa΢‹Äé#¾Á&OpFÙâ;y§3YÊ„…Ú(©äçj—CƉûpeðÌIŒý K~»uµ¸ŽÖž.Òyašåh]Àž» ~TɨÇ÷b¬\†ø…ÎØ2£«ôGêâ»ú u™>„)¾ÎÙlv¼eŠ¬¯Å–Z[Ó6tiG›cæ&µ%ô÷ó¬Cg<ø–dKÆ„è$®;€9ëpÓnÆwN „€
+ÜÊw&ÞF^]0ö™}L诼OT˜ ¡E2n´cu¼ Qgª@¯Ã.ä
+Ð73dxK&~8¨Y€ºÖifÕ–6çzݸ…Yr6à´DÀʉ±Î)YyLsóÜÔ–ô£KÃ2tG»dV8£Å7öèFû h·?ƒ;éº:IuèòtnCí‰*½\[ ×jÝ€®¸Q·˜è`58îüÉ“mÉ#=™•£YµåÙwF}s‹qA]Å°UdönöDmi3…\gÔ5Ãþô„Šl|&0ÈØNíÌ-°×zÿb–qÆÊäüÉÂ÷^
+Ùn@úñï¢ðáŒ&¹~R®ž˜>!§Ò}"±êíxi„ƒL‹sºú¦¢ùæØ؜¥3¨ˆvò8]Q>*ß«êeê¼y§Â>Xµ«@lé (y°ÏëÊL`¥2 ohï¢7{——%âѪ†´Ã†Ú@€#gœP®«7£Œ^4ŒÚ±D{uDßEN‰{9Å-'4x<’ÖiµùPN(Ì1-Ê8­cÏܹ*BõÝÍ©a~vUôC9!²y$­ŸåÄèÔiø‚”ÿ.ª:wsjsB®óFZØÈR^ÞH‹ýaNæ¡´ɉ;ç„úæOQå°ÜÊIë›cZþöÊ÷z#-þפ
+[½Õ_ŸÈ†TËþúÕ¹ªî†óøªo„åÙÜ´{tÉé0/œûMô‹fœ‘U-¯y
+o³‚ÐëȲ3.v¶ú¹ÍIÿD%f%íPÍC§† ABØ £zÜ'Ì Ô\‰æ] ×d…Æ(’ªoáçÝÑ_KóèM‚`ÍŒ´ºW¸‚0A Eí~ZW¸‚0ø´öA+Ùx’½¼!´žJûù´Q¥Bî ‡ Uìlî@‹S*¼~ÂÕ‰Ól­€÷.´WÐ:âj0ÔEa~¤Ï_@ë
+WÿBÀZa‹Ó·¡E¨Ow)+ aºÓ{ÍZ~ª„aÆÐJ°[ù´|® ‹ŸquÐíô8kݧ¬ Bkg2„žä*£[ÐÒULb†ÕE }}n³#Ÿ+T™Òs…5q+YÍŠÅõ7Xö7{˜¾Ã²'Ší=N±—óÍc­ðmŠí*£ìÁ@Ýð?To¤7ßdY|Ú£ðR,„ù.Ë>J±og\A˜ï²ìo(özĽɲý_@w<ôÇ Ê74‰©+\]VÓû ´ìlkÜ3¤XÄFÐò¹zA±1´FŸߥØ[€þ)´–ª!e¡jþ„µîS
+ó´¤Á¯¡u…«k@ÿ€µèû3‡v(RÏÿwæÐp…Xà -±çqCë õF/lDY Õvá´à‘oB«9W ¡õäþ£½Êše–èûDÌ»]@EqDv÷QlÜm7÷]#¾§ûÛohoã̯ïÌ‹ÑteVåÉsN®^q…jóÃ`ÙéýÁ™ÃÆ•c9Œéß›9ÞAà_Aë—3Ç]ʲ½À;þø$kÙäq—²ò„Š<ô_ž9l\¡Óü6ku.?7†¿VCó·fcþŠ«»€ÆK¿€Vôù´¢§þ=Êz |üj°w %’ùÑ£ò¯ õW7üIhMfÀ\½;Íÿ-—Oîk?¥,#—ˆÝ‡Öd~ü$´>àê. ? -Ëø)e½ôŸgïQ£î@ëž×úÝqöÞ,ûŽÓ>;ΔþµÑ‚0ŸgÏhq{lºDæv¶ÎpçÚ@ÜT¹DTìD
+¨–QqU!Î<Sì·ã‘r3Ö†q ÕÅ©J¥™T]þ'$p1¯\*¸ôë_Ek•ÏôcõH`EûÈHIØäÚÙÌÉÉ7ÒbŽ8Ë¿Ëæ=Ñ#lvåäÖZ«£aõ ÔõÀH.b8¥«C
+@v0„dpœà:„ˆ‚“-]ce‹ìú%+3¯IóøPÏMÙ aØ ÅlÅV·ÓGÕÐtÙCÿTTÆ£ü3€“<K¹ŽðXê‹5{ pœâA
+z³
+[t‡èmÿ9ó\RÂèÒf6’ êèAÈî‘Ñ3#¤jžY›)ŠFKÍžr5uÔì
+O„»"U2[‰4k!Po£|5­Úíe`SLr;ëÇ”‰Ö®8(…¨,ÕÎIJ=~¾±[g-M[Á–li§!bþ†ªDŽn98> ,»„³Þôlëk@b L6OÙ¸£¨1W<…(«BÆ¢å³: 6Ó†KåÚ$èõ¼ý·e¤-ˆ^¹=Ê$…ªdö¹¨Îàñ6ðÿŽªJsº´¿zõ9˜Su>½NQLZ.aFö'‚.l[è?Šv{zt]šÍN®±t¡Ï#œn®Ë¹wMÙÓág3VÙ\/§ñ^É^KŸ1‹ôb´àE»vÄ—ÍÅ®—óäúŽ¬éJâu7ŠT{¼oÚ•F¸}’Í6{y‰«hÆàr%/ä”÷!
+ÑSÐJ¾¹â¹ÍZ.âMÕ¨ó6ú8ÜCÅ\ÆU?R•½}8ÈÝ{°…€:ïÓèÒTa=ÞÜV0Ž¹ H+º³3Â÷*¯b¥\ÊáØhÈïq{'ß)àCý àÓüÏfIÕC¨6 œ[Ä­º´XRa`¾Öå-¡"ëMDz‹K7²Á<ŠÆNºÍ9ò,ê½2Û"}ç›@¼b§Ö’inçr(Dµ ÏA½÷t“x¨8¢cc.²BïY 
+a¢ÅèfŽ6ÒèR].LÙ#"€…£»’‹%u¯¯bÛ»§iÆh¾N¥,*³œlµ¿c¬|Xªä¾‚
+‰¾K¦va ÌøìBOÚ ³Vß®úÊÄëGÔ‰|U Χńê7ÄêŇ!ÂÌËÖà„«ž ?è·l‘ë·Äànväu·‹f#è †#y÷IG*
+;{D‚Qä™ÝÁ a@Â:˜P_ïýŽÿŠ ÅZØ*mìŒøþ5’Q_¦VLt_K°m
+—^)ª)æu|nÓ:—Îu¸]c†úñ·B j"رœ×ô/RuÂ\)á…FȪbÉj%„¯½Ô­°2¯:¨Ép¨MM‚>ý‡ûú…¦èÔ·d‚N| ×/kóX=.f‹í·à×/Ì×/a¡‰4¶Óz4MÝüç,ïŒËÆÜž¿¥¿……'©PH»©‰þ¥B¸ùÞ~€Ù°T\‹
+üA`ñluÄÑ­9eÌÿ²^ÝÉ*Aø·Ø*b‰b£K좉=¯]1vôÿßÙÅr“¿x”•ÙÙ™§Ð¶þÕÖ©—?8$“§MÞ<»ËS­È²…
+2y¤cR轚‘Ȫñí1P̧MRÌ¡ž·‹ ßþ‘O
+[D»¡ÏŽ6ßcغxÆ3ä-“-_¦ÛqÒü¸Z~;oä9]ÐÿÙJcì,Ÿc+Š:ËçØJ4ž†Îò9¶ÆÐY>ÇV¢0t–ϱ•úx8ËçØJ47†Îò9¶C§‘³|Ž­Ä²ÄÈY>ÇV¢0¿ñ³´•¸ÓŒœåsl%Cgù[‰•©‘³|Ž­D mè,Ÿc+1­9ËçØÊGÆñ|Ómå±µB„‚‰K$¢šn®¢z¸µVD]]µ>
+‰ý]ËÆËY0.
+j­ÚÅÆǵž¢MoÏ!k&W
+º’Xx½V½w*Œ/Á-:1÷&„¹q»ñÉ"3•˜)ÓÑJ¿Zn0ûö?ìvcZØPžøcz`¶Ì.Ú8zj Õ„hͱ²W ­@›$µž]”þ±åE½ïD½lÖE5÷mZùãÿßR7˜ü°JßšN~|ècƒÉ-K©0„¡¸F3/|£1ö®žTÙ¾DRF;ÝÝ;Rbn‹ã8ø½Ö¶®!ìæ´ãNOÙ«´êI5×>Tª”lQ2>Ü‘HreAš™N““ïä©¿bŽM² ™&3`WiÓZxmG,~59p%]uzåYKãÄgr®€ØÕ2$EìL¨h@?îÈ)FÝÑá!:@Ïñ/» ¬rEûg“ÙN¦+Ô£<ºûùCÑñ>ëj8ttCPNÇLO‘ËÏÚd [˜qaW‡9OÖš ‡6¦Ðé¤,Ó¶0(P8˶%(ýu¡5óŒSsŒ¦ße5k’«¬Òt‘;ÔÅÖÈÖ¼<çyy—ùÞ'ç GÁëýüŠ›õ
+Ne;=à¶æd/OY“=ÁwÐ0²µäÒHTlM´«:óÂÄ!€Ø³žl¸1ˆ~ AnFΤ€fTf«³âUµ>`jJ´* ®Q…¼m´'Ûc2ïÃ*NJ,¨Šs'|›‰žYCÖ·Ÿ'ˆAÐ ,žïÕïa™ûdE(•c/êýåï‹/ æCuTäÍ7åMA1FH&ñYêHn{Éÿ  ¤Óæ S\äPQ
+Ìî0|Áì²
+[«Ùrx /€Nä*\Ä&™âªo§ÕVLô”JÚ»2c]´ÇÛøÔd›‹ÃfâYÿZ, `Vý*A§ðëL½b3£?,1SøÕÔ›x½ ¿yýZ
+PlÄŠ"a©Ÿ»žÄ¶
+ø.9á»ùqZ½âÃœH‰‹”æa ã§$n@ S±Òû´$}tÖ 9šÄŠ.’‹‘ƒ¬ƒã}Ø›”Ã0P‹³inÚl)/·¾EÍ%Êç)"¾‰wÿY€)¼ë@ßœy=ÅuM˜¬‹îë~ i¡x5Éy¾G Ïܶ„i}cA²·… Õ)×MU[U^/mãNÔ΃º.”{u=¡Àÿ^7¸[×´SØ=¨«~®+†Îï¥õ$âËcZ™ý˘ Þ÷/«ña©pÌ)ëßm²ëœÐxêi²Úã´Ú»ààáuë•xœÓâ µÀ¯Ò:æD—÷¿Êé6?Më9¥2ïkcøND¦ß¡@·wÜ÷·#
+‘ÚIü`
+Žà¹ž2…§Öh7}u§¡ŸB077|l‡­5þck¡M»—MqѾ×_[Öµ{}l£ž‘ïõ¾Ã›M¯$ðèÈo´o³ýh߉q²úiŒó}ÂÜêa¾Œ.L×öÅLÝ\ÍmÄ‚Ày{XÔ`ÅGûâAÄb …^H 
+x³­ÙjË´ç¨^aŽé»?ºÈû?tèLoijàW™xö³/[|¶.«Ô:q@Æu?¨û¼Trý‰¿AÊ3˜Âº¥˜
+ãÝŽ`—ë¼ê[ô |g23s »€0¼úíÕµ¤:¶CßoÕüƒÉÑÆ'B·3±OCC“ih‚ÁM°»fÎË|ûh›Øgέº/ª\¶¼-ioIKKŸ
+¦iT›½N~ÈBÚ±Sz§W†õ½ LMµj<^¡'åEš¤>B ×cÁPeïSrNÔ Ö¢pJó´>Ÿ‡’ÈÙPêšK.D”¤=ñ4éZ\ØBÏŠ%VrkóÐlБm›¨gÖK-ü0ZLñ• ÃK6¢)õÎí†7¦“W H4š[‹h‚ý”òŽHù{ESd¦ÀŽprµÄM¼+$¤zKÙîc8ÒöNÒ[—U6‡\DiÊaNɺ©¡·§”fâÃWØÈ4+óã…‹´ôïóÒWÓ*‹b
+†ÆhH¨~ÝÐéDòá8èÐd#1JæëüH­xœUQ¦ÝýÍ×%ûÁý¢q(û‘ƒ° ›ÒÑ3býÉ‚‚F¼®5?—¹5Ð_ÁFøªVž¢FA/Žï°‡È­?âQv ]¹çʯÞºhá4ÏA>/QfKÔ »0NÆêJ³_"¯7!†o»–1*×—ò«ªôµZ%й¿@±9¿[‘U¿Î‹q< ½þ.Ëp_«lS?
+-±À§ _ОºöÞºRÎùHèóÍAô¡P[Z6ÚºZE¹´ÛÊv$æ®Ýà,—"¥Ñ—>këìC¥}O­;¹™ÜVßMe+„„2QÖ¥üîI=£€…¼5úÊ–T®»©,ækø¥gp™((ªôµL0ÁS³z%AÒxŠ¬vª*/]¶aÄk%‘¬²‘ÈË:>HË "3pTª´ä:äZÚ2ùThzÛ8Ÿ/z+f󻶲¡z{?G(äascds¥[R•ˆä—¹Èþüøµ©7r–ªºh,xBM$o¿4P*Ž¬žüèeyÕg6ûg)G&
+@o¥jý£‘Œ',©Ú…>Ú]Ò*
+ ¢1åÖ±SBmŠD±IÆŽžž²Và~#ºCMr
+Mr“Pv©hÿ¬­öì´`½Ó*_‡2­áÃP)W^½˜ cUÕS'=ª®GLZ&Ÿ<Þg[®ãùtPÚÎS,BöÀ£ö6¯Ï¢IhSp­à9-œ±z.ò0š±Ò¹Ô“_Ør»NêSΙKsµO)öIAK"·Ë¨âÂ`ü5褿Ðñ/@t» º¹òðáBŸE3Ôò eÛû<‰Vz} ZâÇ$â×VŽÚ&]*vMUòǨÐÆÔŸ+¹ÝiŸôÁÒ^ê!f‹c¿,Ô.Ç·xÉ€)JýÑÕ÷ˆÅeïŸM­Z°I’—À“¾2⦀ú¶œz3¥q’w¬·Æ|$r¥ÄÀ™k „Ò”mpoð….7AÍB½¸©§ÛfæÁ1Ú“Öys{8d O=¯]†¤DùÌ:Ë*´å¡©©§¾Møé ,íUËj»>1CuóSE½-Ò‹5”–úÆEPý‚qdhév̇NSn5ZZ£øüü³J÷aòß
+w_ ûËb/ØpLb‹?àtUšg ’8ŒEB³¶gXdˆîÂúƒã³7áíóß
+?7ÿ[8.gáùÇ΀àY’F;ƒ=sãß4MŸ7Íe¯;ƒ}
+)ò‡eiž xGÎÓ$AgaõM†<ÊœÈ2w- )”eÀœ(2–
+endstream endobj 177 0 obj <</Filter[/FlateDecode]/Length 8499>>stream
+H‰ÌW]o\·} ÿÀ2PÓüþhž$(lÀ®QE!(’ì:XI… #õ¿ïÉË{÷ÊÒn‚"Q¼¸{–3Ι™kœTÆ;aev*áL”:¦(’T9†0oŽ>½?>zqþúôþá/Ÿ/>ßÝ^Ü&ì;ú8>Êâä¥øðã£/xŽ2…wYæ’¸)˜NPÆd‘­LQ|·Òz+V*cûwl£Œ>¦m
+à!+œPåïÃéñ‘?-~Á·_C’.ËûSÝ0cVå CLïŽL–:ÇùR“$îbg©?íÒü€§_Ö¯Ç6J“i —ÎÒ6 ² * Ú!‡LÓ^88µn¹â ”„Ð\…7ÒDç& ~|Ñ=aAI•ž<O@Ý­a-È͈i ¥,²B›8‘³Cö›VélVÈzÂ:%Õó’¢=k™¢«Ðþ¯ ¡«©–
+r'Î=¤kaà!¤B:´tqˆ
+Ð70— +ðìŒôê ¨T„P—™YdCJ3o§Hºíšr_GtàˆA7sgƒÔÚ¦ŠÙluÁŒeiµHP5}ö±ìr5å{*óf¶°¨T,X´|°R€ý\Ø+gÿ&)¼¿½½¸¹¾Ÿî/®>_ß>m^‚_­Bò¼R¤%T1hä?Ý-DH‹™=î9 ƒr4h]åÅÄ Î>ajd †–¾Â—˜"‡´,
+ Ú€Œ<») €˜ÎË×# ^ÿíîáíõåÝý"ÿý^‚Bò+½~{}±ýñâáþóÉDœ¼9ýþ¯õØÿxwÿ½d߉“Ó«»Ÿ¯ÏO¿ÏçˆèÝÃ×íõùF[ÆÉ zć«]†Í! snó'±ÈÄ„–ÿZœþ‡ê“–
+Ô£üÇjŒAÒá¸×^•ÇM}Œå±/Z|å…ŸP+Yivo”*›ú.+¥êt÷ûó6ø2ü¯*#^PÎô|‹v†ºˆˆs)3Ð)L):.„ZFˆmk
+rI†4‹äaÙ–ÁH¥x°õ2·eÉ;?"†Ã¨Þ*ˆÚb1l U(ƒÿ =-¨HñÖ®à–Áz®nÛÏŽnò5"‘øœQ”i*ôìm
+ži‹Ò"¶ bØ©ûë! (rlÝ…åUâøé ÅŽO­Ä +Ù„eË ÑŠAŠÅ€@üÆ'1Riî¡Õ0çŨ[h5JÃÔ`‘G%w8“¢Ý5Úøôø5R¡¯´1I
+y*ÅÞí§\8lª¡E”§X·ÕHo7N)Wœ‚­ÅÊsOÏô¾ê,×5Ç$0¼ŸšZýðV8 Ž ã`G¥/³5´º.ÏçÐBë= ïVH –*¸öb8S-õ•5>}i J7Ö
+G½yL„·3"¥]®¥îS³ q¤bäÙeM3x?E’éŠ&>H•lº£Ë¼Ÿ2ÉtE› ¤Î‘°AŸ x…’åŠF>H¥0]Ñ)£)•cÙÑ*é•éÚÑ+Ç(v-½Ÿ3¹ì«ÛçN.£¨ü µ!ë ¼ÙIï’Œ›…“ux>_€ç ´®ÓHh¾q¡u*Âè’ÛY=tFn‡©hç8OÌ.ûÓúÇš]Œ5˜ÑRUZƨ~³
+†±^gõ¬\˜¼÷S±0¥V= BœvzV,ŒÍR¬W
+‚Œ7yªRëÄd6•‰ÁÿT$†0j‰B­%¢ž(ÌJŸÝÆé=¯’Ƶú0^ëà iõa÷BŸÙÑÝoéè¸~e%hòÙ?×÷~“Áoðÿä±*Œ¼4FÓY;=Xdº"†’™îˆ„ÁCdB–+Baø ©éŠX˜Äƒä²vÑ{´Óg‹æ™ít–:y%ëfxT&¥E'¤»p&ØE'VpFËÔ w#y^'܃‘e'ü}$þ¼Žº¿ßµæ{`ÏÕFÆTFz }C7 úTø†ô2.oT¬©v™ªMR{éR:•Êe$0$e
+h”‡ÒFÄëÄÌ0êØôœŠ¼P£tæ6 P¥\…Sê‰FŒQÏÃ`Wœa莦¾ iWCÃÜSðûPQ: 戥TCò¦0pcbŸ‡ñ‘¨@Å5Αè›Ç¦<
+’²Óé· ZŽ€iÍ
+ÛÅW‚ú¼›îeË êP®oBê Ov5æ½lÃ<0—³#`ÕßÑL§À³@?9uœ„md‚¨—¤L‡j$ŽsÝ ëuÖ[Á”žê86]^X“Ib¸à©yP ‹·–1cl-¯z =õF„3tårHÓé»´Hæq4,l_®éó‰ê±ÁU®œÉõMÔÛVϱm²EQQÚ€$åš‹ãg[DŠþŠÆØ`”MÃ*è¶w¤Qp—‹‘:‡´t\ `r
+d¹{¸¥gšHLÎË0 Z½Y†¼X‹P]MÇîw‡Œß>÷­Ç¥ÕÂk|¦Öý_ `7 ÐÚr<8Ï…ÁÓ2BT[Sº|Ú¢
+tœJ
+ÄßƘVZ?Ƥi´•áÑ´8˜( „®µ÷>gï}î¹3ç^®3œ¥Î|³×Úß^{½¶‹®«œ sO˜Ïe,¦ÿ›  %>³°!C‘çêƒ0Æà#&4ÉÀ:
+Ö°[«ûgÅB>ž‘¼B±øD*DÕ{Dx²F!c¨}5Že5 †¡®®„·…YI𴃄š†±¦AA‡ þµ ÈIT¬}@$.³4DYK'`Mƒú\V79; !>®„ic®‹\¸™Š<P=> |ò¢¨ˆ‰è8TYƒŠ‹°#Í [+‰Í¾8—"m8ÔÜ Ë+„H,}È? R[ƒã3õ
+CmMÂLM4-˜XF*㊣Y+Sjz¸+‰Sš¡¦‰¨
+~GRJ[vI¨-;êƒ
+ê•;
+KkŽ*+’Ŷâ8Hl_mZÍkß)7–FRl,դؘ^±Ñgç¡Wj¬‹’JcݘTI*Mý… Â[ ˜^LJÁM2fEm77ˆÜ‚ýöÌ,¹Ù“›ÉOÕíÞ-çªæd‘†[Ê#T­Ë$ ¶’K¨™“Mn)ŸP5'£´[Ê©¼‹n¢{άvvo/¾â¼Ðt/‹°(Ê4^¼(Áži¼vµ×x=ßÙÆ[ϤXãmÂmÙÆÛžbQ¬7o7¯×ÿ”-ž²á0Ro‘*E¨ ŒÔ¥@ÇpÈ¡P=HWbZ…j™q™Pªf`¦@F$䬋HÆEÅS iik0“E*Q¡ÚÑHwe
+uß,3ö„8ÖD ¦P'`-˜”²oºˆ:EìI6%ìlz.«›œÝÚO'`ëü6'ëîê¬ë='`]W9‘éž0žË€µ1ÂôÅ?æQü !Ãèå<ŒÑË¡àqΆ2% B`Ä
+àCÄB5A †Bƒp**â™ÀD½šg³ª®ùgÈZ:L9Š <o`L„@'‚‰€RP9Š1lI4Äq
+–qʃÎ&êÕ<›
+ÇE¡Z/à?›¯V;?=úÒèú
+¥‚ˆþ¾íûnÞɲ }r›Ðh É9ãSœÛ¼Pš™Ø<RjDl¾¡Üž¬øÄ曋•’Uq)Y5%·!¥%«f¤dU\JVÅ¥dU\JVÅ¥dU\JVÅ¥dU\JVÅ¥dU\JVÅ¥dU\JVÅ¥dU\JVÅ¥dU\JVÅ¥dU\JVÅ¥dU\JVÅ¥dU\JVÅ¥dU\n&2ßD<¹ YÝtd¾¹X)Y—›¾Ì7#·!«›y2ߤòYÍ/±F”æ‘ØÌ”æžX>sÉ­Y>?Ïvq˜G¹Å[èh$ wvv.ÌøCgV Vwuu÷ô6žžî®…®NGgWÏ¢¾»ú–åÉÀÒþ%‹{»A'UXؽhÉÀ=÷¯|pphhh•'
+¨åq;}ŒÏO{Æx:¥ÝNpwYšáNÎëóÑ^·¿Ðá|rŸ¢2Œ ëd¾@Iƒ¢Ûéõ”‹Œ; wSê—¦TM½l©ZIô€²ºTÞËËå•ESòEXL™–âU¦^,_ØR±G®(6B1’Ð]vzð¢Ô¶ ®Ðx¦79”I¦Åøø:µSð
+ïášbŽTªÄsðê÷“|ñ$« '¨#e"œµ<žâ®¤•›+ŠðšÅþƒÈ“ Ò«<9>éíÆHï7é z.9–Êí3‰KI±ø>…A·WIâuù¥ÈÐàRÒ>7CæÁW6
+àTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTè<,rÔAJ<,㨳”À©ÐyþS='Á>ÂQ'‚<šêȃUŒt´Á騂=1Ò3Άžçò)c-O9÷ªC8¬³N§«®8ñˆ ôÖë ÆšC0ôzàRôFQORTC(Š¬'LF}™¥ªÚ`ª£[,­mV«µ]ÚZ--TÉP]¥Œ`¨57Y::.–ã8
+ °.Gg‡¥É\k(Ž¢Ó›ÌÍív®»'‰F4D£‘pO7goo6›ô:yc]S»#Ž #£)QL«ÅÔèˆ íMuÆ Uze±û…ôäÔÌìÜU s³3S“i¡?h·P&½ì ;¸°01=¿°¸´œÕ°¼´¸0?=!„¹ŽF¢àÐê[:»céékÙ•Õµõ ëk«+ÙkÓéXwgK½AšˆÎHZ=Âä|öúæÖöÎM ;Û[›×³ó“BÃBuÒÄk¨VWxdjaeóÆî^.wKE.··{cseaj$ìj¥jàÔ«ªk¨662:³¸ºµ{{?Ÿ¿£"Ÿß¿½»µº83aÛ¨šê‚£ÁÊES³KkÛ{ûwîi8¸»¿·½¶4›ŠrÖ†r‡8·¼¾“ËÜ áþA>·³¾<'jâÕìÆÍ\þÞíOîÁ½|îæFöª8Pîh÷ ¤¡ãÖJŽ;· #=àiÇìÀìÀìÀìÀìÀìÀìÀìÀŽÿw‡•¡#—¯äÈç Cà¬åŽ¨8·¼¾“ËÜ áþA>·³¾<'F5ŽÔìÒÚöÞþ݃{îîïm¯-ͦÊTY\ÝÚ½½ŸÏßQ‘ÏïßÞÝZ]œ°mTÁ¡«¡Z]á‘©…•Í»{¹Ü-¹ÜÞîÍ•…©‘°«•ªÑÇ1‘´8z„ÉùìõÍ­í›v¶·6¯gç'…‡…4êŽA‡¡¾¥³;–ž¾–]Y][ßа¾¶º’½6Žuw¶Ô$G•žhìàÂÂÄôüÂâÒrVÃòÒâÂüô„æ: }UÁa¢,ö`¿žœš™»ªanvfj2-ôíÊ$;tƺ¦vG0FFS¢˜V!Š©Ñ!:Ú›êŒÒÄÁDô&ss»ëî G¢Ñ Ñh$ÜÓÍÙÛ›Í&½4 8ˆ¡ÖÜdéèt¸XŽã<*€Àº–&s­AÞDƒ©Žjl±´¶Y­Öv@hkµ´4Ru&CuÑ
+¸tÕ'Àéc•¨:„ŠÑ±ÙΊýñLœ$Ã$a õñP^‹_Î$ÆI"J$ÁС·HÂM÷ÂÃ
+ð²E¤{uÀ¯Ó>&Ô6ñBÆ*›C*'I¬äß² ÑLQý3Í%’3Ômàü`
+endstream endobj 178 0 obj <</Filter[/FlateDecode]/Length 15049>>stream
+H‰ì—}lUÀ÷§©6Ì%,_¶4-l»;ß-¨]»v]:0ÛŠe)w]e]·µÛbd ˆ3þá2•1,3Gâ㶠„„@Œòp¢ã5? K`‰Æ@âóœ¯÷¼·wYœÑ¸÷¶ïÇï¾ç¼ÏyÎóÙ1ÖÓÞÖ1ÖÞF‹®ÞéÓ7#›ÚÛöÄ?Rôî‚cMYaXgN ž•TÂ…4\Qü¡ü©ã0Z÷ÙS+QÓ„«BIQ£Tðb‡‡ÂP[B$LZî#„9B“ŽpMhÑ%¯)JD¡«IÍx1ì!A¢U€
+ïTxÁˆ°Šã~\‚hQÎb)‹ì} 1#Ö á$(Í@^†$?0m¹-Ê51ÚzâU
+¡dXKóÇdMÂ\ŽH-XNhÍxcŸè¡Ò5%e#ƒB7Tíî™U~vcàéDp.MjBkZBœ ^ÆX‘Àž£6Î*s"k–éó¤5"•Š³Hjœ
+if) RÔ+(Snwuƒ­Rµ•
+)&ì µà,R·Hδ[ŸeQ/ A¹WƒáIõœ8D¹_´„$`†£ö!Çø$RL,% ¹¬Ï v×@"ʦ‚4B¬ßZx£q„j,,ʆ愩.®‚‚ÖHþÃq¹ív\˜à¨—ÈÁH´N;çõ'ñWëmÝëØåÓª“ðÌI$X 1ùcªt7Êœ›¨¯tUé¿ÉñólRB
+Ê`¢„ÔX6•+$Ä$¨XCô®@>Å|Øóóƒ „@˜åÖD“Àç0ï*Äú Äx¯¥Ü`«vÝw cÇä´¡½mViPŸmmoSE—/û€Ùxë¿~<܆ÉLâ0a)ÖpwAs)‹À›bÁWI\­‚¯Uð}¨
+¾XÕ]òÂ[å]«¼k•w­ò®U޵ʻÿgy×1¶¢wf®r|nrçt}fÑíØÚúìv9r ÷àÁ•}xÚ†§ŽÞ!96095ÑîVNl›œ^WŸ›˜AoÄ6ˆ—£p…¯‡¥H( z‹Æ¨éusˆ?îîË?‹¿øçýŸIO“BÀ—8i:œ(ýõ¹zw!9ooj[pÅŸ«®n6øz²bÑ|Ú9¸~°«vôŽÍî· tÙ{¿yô»÷¯¯ÒåcýôéÓ?|èÎA»ìÚH—ÞùàϽöû³/žüÎ}Û7ÚküøòM~ðÜïþzáí?¾|êØ¡Ý·u:\ ì8ü“WÞºø¯¾óæ‹'ÞûùšÃ‹×ì>òÔ«€ÿñι~|ôÀ(qøš›ïzàøóçþ~áí?¼ô³Çͬ_êßx]Ïø¡ÏŸ=wö…'˜ºã³‹£(+¶:~úÙ3utuY²0 N6ß÷íï½Cãâoº}Ç—öMôÌÓÔ{ë¦5ËækpÁ§8½® ^°ð“k†¯øƒv²jz+Z‰³ôÕÉ–f<€ç*©‚‡—â±èç¹±X†×´X±rçΩ¢kxrzûÄÖF:4ýʼn™¹ÄIä}S“»vMNokäý“³õ-SéùxÕC¿Œ˜úVàèlûÑË×ÀÝ=p·Üam1º™[ÛÁ¹Öý' ÌN‚w‘0uÃð=ÍÚBe…Á&PqˆÔpbTB}€UTäøCùïª^M“ë®òÞÐ@3FEÞáƲ¬>/I–JˆeñQ6‡¾/
+ Žpæ‹ FüŠ
+ªTqè&TÃN¸íQ {6\©‹‰ó—N™Á’Ý$qó&©„Á^«0¶bIG©]+=„W<ž’ÕÇŒÖ"k„]',ô‘RÅ`¤cÕŽ<ž[m}kª­Ë4¡]
+§'V¤ŒAYhw!Ð{íÇ.C=±lTùÁcjF|éóããÂ`Í‘ÃHá ¥ÆCeHf(šÛ{ˆ?†§EB¬ƒ–rã¬f˜I„0¡ÂV b0Y6;éOcÄÞÀ½ŽKsm´ê¾f¦~ÙžÐVË»¼¶Ó³(u`½Üñ‚àvAnIE¬[e]«¬û–u±v»ä…ÿ¶Š¸V×*âZE\«ˆkqÿ“"®clEïÌ\ÿäøÜäÎéúÌþ¢Û±µõÙíþrä<îÁƒ+îð´ O½Crl`rj¢;Ý­œØ69½®>;71ƒ Þl/Gá
+_V¥%,E¢ŒPaƒ7`à] ÜÝ—ñÏû£IO“BÀ—8i:œ(ýõ¹zw!)°‘¡¶WðùÈG›Ñk»:ͧ«Ö®\2ÚúFºþ+GŽÜÂÒýÂ%ìÓkÆ:~êÔ‰oíètñªÍ3<òÔ¯~ûÆK§¾·C§§ËGö~â™×ÿ|áÂ[¯Ÿytß­78Êêyõü{ï¿ÿÞŸ~yâëã=Ÿ@Jž~åüÅ>¸xþ×O~câ3Nîå›ö ¿ùË»ïþígûòú¥ ‘ÞÐ7ºûkGþò¹7_{æñƒ£KýÛ®ZLoºëОþÅÉGï]^YÅí~øÁ{;«k럛ÞHWܵús}pÁ¢Zíúùšl»zá|ø_|Ð VMoEsp&ýoö«&DÏ«
+w)‘`A\XÞ¶”LH3¹?ï{Rè|iÚ +‰m!ÄÉdˆÓNgÒtÒ´ ]ˆQQWJպЅ `]‚µh»±bAWR7…¶Ë<çÞsî9÷›)¥
+.$ùùæýž¹ï½çžß繯e, ’¯Çñ£ÔD“6°ø~ P%‡;ñÙG–¶·7‡…•­GÖ/ΣË[O¬_Ùi¸a|¶¹qùòÆÖ¥yüØÆã«6Ûú»à¨å| üÀafpúAöcU=…å|¾= ß®AÞŸΞ3ÃÅýPE§ÞK©/F–l§ìGNï\ ‡…¥¥»×Ö®>zj{g÷†ª8CVÌtu/Aò˜Pþý~8;ùA’z !ÿ‘òB›\tÇR…@b‘Ÿ †À8RD¡B„‰ ¨H…Iã´íY»ˆJâ 8fëúeѺ,‘ìrÔÇÀLÌm-q,4¼ID’w¢p4@GCEߨmHߨÓDß³¼ ¾ëYßÈ ÅÏóјí¢NßøˆCÜd`‘~`¡“GœÆó?%üyê‚>:Eûª¥Þ5Ƀ@p´„5óaÑg;уàä‘Û°èq>b=ˆL–h‹ô¬™ˆ°èApt(YôtH=êE=r„=b ‹±–DÜIT\^ÉqËq# ñ¶Ò=B&9½ CDÕVtBújË{U[æj##êî:–}È…W¿ô* ò?/ sYN)^!BáTôWDeæµÊQ¾sT0&ô˲Ÿ&¡¿Îc:&ßÑ_ŒaLÆwôc?N$o™þ«‹Ö›ÜÑßRôÑäŽþºXd6Iè/"Þ;a¿`C‰¶&5cD~Õ>D~kɹ#¿Õ°Âˆ…üÖ+ôÜ·Þµô#á¾Å+£q÷ç1÷·8ïJ‡Ù^9ò®Ü7÷#KÏ«ò{T
+— qhûd`H`å° ž+‰a?ã‘Ô®T¬FåCºÚ"†Ä, Gje„¼P㯗•‘8‘ø@ÊñšrHCbà/y‰A7´Ô„ê…3œÊðZzY-½U­):¯ØÀŧ=Ñj´Ùßê¸]±•»ö„…kºqÒË"nëõV\ï
+gPwx ÒJC*jc Hr&I°P)¡Áš9²g—H)8£n…²„s•|á2ۖшx•òò½Õ…‚JñèMjé£Jv^à‚%/äiÔu-×¾¼E@6GëæÕâ!í—c¦[tßÉg{µwâ©85ÁóÈ¿áÁM˜júþx„yD?ÿ³(¢0mhtädCCk¹ C‚ˆ©"ÖzÏN4‘rd´Ö²!*hb¬N$$HÅÝäE9x®\õD‘´+ -IM` 8W2„^‚"H9ôVáʤšš
+}×
+k¬Äs ba¨dC=¦_cÑ*$—-çÒü(+ ´Ö%µaarA)1ô*†Ðû&›õ2¤VÙ *Å3+`Ó ¿¬Ç! œL8lL…! ˆ¡°Ú‰é7&i„Fþ¬¾Ø@oB}‘¶Š˜ÈµÚꉀÀ=ZZGs¸ŒïmÛ„ÄcÊlÛ¥Q‹5Y?($.cƒ:bÉ4¾=Îè׬Nš<¸Æ¿8ùåU‹¢¨È*œìÄñå»L
+Âî—÷(JLSR}<ÛJŽ<~U‚
+"dìßÿÌ`†3÷ï ÃÂÁáÌCËü|µü3ØpÌp?¸¾E’b’[ rG iàýq0åoOÖ˜R‡ªú@“Ȫ!„h²ÔÐâ¶id·ÜštA0Q+¯ò£?Ç#!TÅ’^Vô”Þ‰x8£îW䙦Ê,âÚšÎk—Ô,¢ k4‹j”e¬,e+ÒŸÚM¨2‰§®“ë5™ë Âz@^$Ù@b‚\±ÂÝcT2d’*ÂzFƒUô¨ª*Òç¡vênÄ"‹š«óJ‰Áwí»ª54Q' I?Þ‡µ¡FrÆ}6õê¶E£IÒ±&[5_iê¶Å_/+)";q"iqÛRûJ œâ%/K«A7´Ô„êE ï‚P†×BÐËj±è­jMÑy¤cjñiO´mö·:nWÔl¥y¢iFYƺR¶bù©]Ñ„*‰ÚsH…¸r,IÜbK°P)¡Áš9²g—H)H­Ó{ú˜«+̱‚UˆW)/ß[](¨Þ¤˜>ª”aç.XòBžF]ׂpíË‹Ô"f<A¨-µæÕâ!í—c¦[tßÉ»±Â ‹þxœïøPÿöƒ‚y. Š"J… ³nÆÌòVS~¸¹‰”EŽË ìI©AXÙÈ‹$€¨r¡D¼§«&§P¿D²¬³Š\gUÓy‚”÷ª^¤0Ökk)Û¼Óô';°IT° ¢ØTj[VY‹Þ©
+­dYé€íä‘{U‘C˜­>Õ¡Z ÿf¿Úb¬¼ªð<“΃IË%üÜ/µ‡ÿÿ÷kê0S˜iÐ6(:ÁÃÌ™8Ì03‘Ø›@iPR[ÓÆ[}­¶IK|mÚ÷Æ'S›X_äÑú }°Ñq­}]ÿ™À1a€3û|ì½öZk{ío•]¯±GBݳýæz´d*´raCÿv¹¦¦"ö†1€Ø?Æ é{œ$sèFӴб&S"å+æ^†<ž’½@kòt” §–yRø ³•ÉÓÇ7]NYGŽQÄÑ0-ôd­xH]q-r?!á~¤…þùÅ5v²1Gñ^Æ<Æ»K_ÉÔ†S¡ÓÜÉ%Sá€éTÀâ]–"pÏ1ë·β
+Ò™>”ñäs¥Ó,“%Ïõ°Ÿ¿8îRÐ\Ä»“j”L)ëÖè){z—(²kõáÅáL½WêB‹Z†J/‡aiŠÀ%×õÑæ"6‡Ñ`èãžé Io›Ñ4-4¬ÉRèk©kÀ¯‚á“ú¯a¡cS¤=D1çZ¨„N‹‚®!K¦BÓw ½ç`QúW7vqfè½o®i+ZÏ´Ð5¨v‡}èd‡ƒÚ¬4¼1‘€t—(FJ”?•4+\²Î7lXax_Èø9ÊPÏ"³¢½È¾¸gzHˆg±MÓBÚL…¾–ºOœRJǤٗÎ3/9ImBBúÓ:JA”h)«çg†“÷[@Þ8! ,¨DG"ŠD®%0P2™
+´;v[ßBôôâÅ$¥›™n{wQ诫^~ì]ó,Ï÷.“Ù¶íÙ¡¯[lssgßÌÜ@§5×™žYÈvYlßèì„ú~žÆ<;à~Å_›û†DsOg²½+~ÛÝ>Ú™zltv®=ƒìbn/G`„Ûã#’{Ö)Ñ@m{2“Áý
+¿à=
+™ZBT/V:熴“Øib—jûP(æ©ÁŒ =æ+KÐ¥2K汪Úr½ˆ5f@3–:hLæ f¤ k%JKIÌ' HÆ"Ü®€!ªh>E¼H]Ö\%‡“Ù§ÓÈá‡!)–¸?x •8£€”ø
+™‚ˆPts'ô5’"Õ@بAÚ6É~lœh ².P¬ÁZF׉ʒÚOH•좇C\Ñ~ŒòƒÕñ#<§Q•§ÿ$ª<™I0îÆYE6ƒøQ M­ai
+N’éÒL'ƒÔ€°’ý¨²RR‰Kég)ÓpJà•˜¤ ×’ØOÉti¦âŠöSìÝyë¯KæM…KÖUÆŠ¬ïä-U²ÅT?±ˆê‘é²›é~ŠEZ%'Ó•^’éuDoÕ}r1ÑË,™¯ÝϱH+¤Ÿp2¹t(k
+D«.k“ö0Aþ
+fr›ÍX†yEK›²ôÏ0¥Áž@õ}KîžÇm<O'ýñ*áoú¶ö&@`‚‚¾(–Ðþq†ýng¹Ï›KþR¨JþÞµ›·n^s×êÁá½j-·>Úl7‡¶âpç¡é3S_kàYxvþ[%eû™çŸn «Ÿ;ç¿Îzâ¹\èhšÉç_¼xœ ­7_|ÎMÐÇ/\>ÌÕÑï^zv\âP´ž¼ðQŽÃòð™'O8|ààÄÌÄãV†oÙ»‡«åÀà€°þÞ³zã–kzoQõî¿£U¯/Û·Z7n¬•‹º·¥QBôú¨¸Ñ ÌŽ»3•%}Õ˜–ðS˜ˆjd ¸bdjÉÛÝ733êÇó¬ïôÜtæØÐùv{{¶óñ¹8¯t,ãÓcí&αÙöÌ™öxóÑöBÓÍšínQ¶õMMOe‚ ú
+çþþl0k”F’>Áü²¡¸Oœ“Ѐ”¦TfG„j–
+û`?‰ÿ˜PÒ8¤ÔÓÆA7T.
+ºÖ4˜Î9µšç
+Ô6L9?ì@Â1]0‘!Pð¶dP­¹áUD
+…ÙÎ@³ µõÁúŠEr§­íi'÷TÆè,…ˆÖBe)A/¤€Dš‚Nuá
+msÙ09ˆ§~·Ðƒ ódáRAA^ÛµR+ X!‰
+0Ît5i ù«T5i%ž²ÐY:JÏ*‹ûë¨í³k ™Ê¹Á{RŠ\ËÊ tˆ†»’Zý]½6À†¼ð×F‚YGW@GkŠT¹’×q%‚dØ®åE)íñê.²x¤J;¼Wd-/ dá…¤@•+¬Ž+,pEh¼MÑ< eW<RåŠ} .¬¸6†ÜÐÕ*BÙ’×±%lQ&‹g_å"ªHBx-‹ê4®ÝwéÊ~‚’ Nm¹3à^Ž1Beb‡arf,&Y KÔ/† |/r[îtÞh‡ð¼d¡všÂ¸ÚiT¡Bí\[A«¬‚(È[F`5s”Š[ ¥ræÎ-z 6¶¤zg9 X–"@JrãBG3ÉBAÅô Ó™O³K`â~÷ [{ð¨\]¹>UÐoÄTA@[à™tH`DXC1††Ã÷Ìö•@\(ŸÁJeã3ÀaBiçsY@²„W+GaJŒ‹Z@Þ´¹6˜0H¯{¥ ù9^…„¸·¬ß­óœ­ç™X‚W¤2ój‹ØDõS×Mÿa¿zc£8®8#RWQuÁ²l0>ÏÌþ›±CZÿÇ–D8€SÇrûdÌÙØç€U5$iMP©ú!ˆ¶!DUš
+¤©´T5(%Š%ªR’(”Ð’mEèŸDH R«*‘úÞÌìÌìú
+UúéîN»³¿›Ý}óæ½÷û=ÙEPŸIðX$aGÁ¸`¹"D9#yœçÇh*ÿ1Œ Pźò1 Ù$áN’
+Ô¥; b;+FW^r6×7v$§Í‰º^"¦3RPÒ&“–‚†µn8Pß*}Ué«J_UúªÒW•¾þŸôU7ÚÜ6Sî,Ž•‹S¥ü̼×"±üìN5Ú€Ç9<HJÃÓžêÚzÃÑîâd¡Å\µ&Š¥MùÙra1x [‡a„¯Ç %¹˜ËlÁªz#Ô*ømÛo:ÿPÓÕ›ÉÄ àK¤-uÒÎ|9ßâ…¾¿bùPïòe·ü¹ãÎJ7ßCšW-Eë{{²`]ÛèìܘȠëÞóƒ#?~r06.ûÕËg~và‘±~e‚6>òô‰WßýÓÅ7Nýè‰[Ä]ürÓÖ}?}õ¿öá_ÞZ<vp÷õöºwúåÛW¯ÿçß½ÿÆ©#3'á5}»Ÿ~à}tùõ_Ù7L$|×½î?þÚå^ûðÏçýÂÁ™ÁFõÆ»[Çž|íâ勯¿thßäÃßX“˜Ò¼íàñ3¯œ}ñ;Ãm1œŒ<ñßyrsvñëÚõ­½…Ö%žª÷oí[¿ÔƒË¾æÓ»+ÀËj¾ú¥Jð-0NºJã%2Î7š0Ôq7d¢¥“ñè5@ê¬õÖã˜zÍíSS“^C±´³0žE{KfÊ' Þ1Yœž.–&²xgq6¿mÒÌo…WõŠQÌÊÁ ˆI©69ÞW;àj¤Ã€7<B¼ñ[›>Oþë§]D?:sû\òsoÈx
+©‚9TiJ]ÿƹ„ "¼Ê$0”Áqi‚(ò4…¹`0y+c\^Ç’!
+ £ e7Âc¡½¶Á¿e¾îÌ
+
+T–`+„v[cM»”¬{ª€ðd7äÊ“æ«? ×Ú-ñ iጟÝN@PÙn§‡é‘T§X8×™ÚÄ+Õ&rò^­_“^ÖV'¤ªSèH_pô*έ1·.O!Çô³Hº<…•ÊS˜”§
+_[ž¨¾fQæV³pˆØ°0¸õ‰WªO<©OŒ†jãÔ–¸±ŸÎ·w´:½#Úˆô`U7gö=J™[D›#mdÖp³b§r[,G²Èm"ëcÝ^D™­ûe6­?š¶&y¾m},‡™È1æº]“uĦ@Ó›™þÍfOeÌ
+ÓÓÀƒÓ1òö0ÝXÒ ©E1c,Ý‚BÊû"ºYU‹¸Sr8vµ¡©4•` ÏŽôLp™mzb±‰rLÑ´ÀŠnÍ"êF B1£$öœGAÉTU²ˆR.Ψ*¨Ò6¹÷’G£d!B‚Ö™ÔÙ˜I¾„J2½èä*ˆC˜)UÊ–L¢\ù؆k6ª;*…úM›D‘V|ë2’ÏÐÓ ê[å©*OUyªÊSUžªòÔÂSu£Ím3åÎâX¹8UÊÏÌ{-ÈÏîTá xœÃƒä.<Mà©®­7í.NZÌU{a¢XÚ”Ÿ-fƒ·
+¢Ð3o_¹þÙgׯüþ¥ï¾.ínÚºžð‡¿}üñ?.½ò·k]Ý1¼û»G~óÖå÷ß=÷âÂp£zÛkè½½üùË¿=uôñá¦Ô*ZxöÙ§wôÔ§×Ö2V.m¡Ù7l|°£> .[•ËݳԓËï¬Y
+þ ˆ®Ò8†ƒ è&^µÑÚ™F»ÁäF<z #k½õ8¦^sûÔÔ¤×Ð_,í,ŒgÑÞÒc…™²ÁI‚wL§§‹¥‰,ÞYœÍo›4ó[áU½bÓ/Að€TF µ1ú1§æ1™ûàj\í¸ð†Gˆ7¾’hÓçIô†&?G
+­×<Xž ½†öö¶±±¹]›¦Êyœœ6„èŒ#ڊ̛撟«vCƨŒPŸDTòÒ^C„G,+ PCÙ„Bˆô'É 8f‚ʤo1@j)ª%wG›YБÌÁõÓ¸8ÖRkD‚Œ)Ë$;¤¦Å” ‰ÄBp‰&b‰€m’qÈ?¢¾âx®´Bª!äI
+0§BoÄÃZá£mÛo:ÿPÓÕ‘›ÉZ˜À#Ò–:ivk-^Hê]~+mßm·WBW6Ô­ZŠÖw ´×.AE~÷ä–\|êðá…mÌ\×Ô²ûúF_\<ùÌtwF×tÌìîô›ï]:¿øüüæz…6 í=tâÜ…®]»záìѽ÷¯–(Ë/;û_ö«.ƪ«
+Ï3 ±BJZ¬á€ —ýö 2w  J¥jÑ †;zaœa(CˆVˆDš¦IM µÖøbª­RÒ§R+øL4þµ¶>ˆ!1­JM+®µ×93M%Ô·¹39³ï7û¬½þ×·{íí÷Þ{û/W~ú­ÎÆÛ倾ô›kï¼ÿþ;×~uþ‘±ÍNïu ¯þõúõ7ÿð‹|õþµ·!º¼=täÔ“/þú?ýþòO­õ§}lß4°ïìO~~é…§¾6´®fÅçOŸ;÷̓÷Ü]·mCgz⋼iqïöûÚw7Áž¥­Ö'g{rÁâÛfƒ·ðÁ„Ø:1Šéàz{ÊW@s¶nÇ«ˆ4ÄaóZ|½P#áË‹õ}““ãEï`wâÐØh˜xhlj:á,âíñîáÃ݉M¼¿{tdÿxÚ¿Ž¨†±ü"‚ ¦f?ÖÔ ,æðí |;y¿³ÚËŠÑ…PD»o¦Ð{×Iœ³º’«‹õ÷OO†Eo_ß–NçØWvONàæº",T Z4N:)íѪ
+ïiJI¼âBàLÀÑÃti±F”zŽ…ãBz§‰÷Gf€²*« "Ât˜×¢DFÃuË2æ'šÆþŽm’Ãý”a›ÄY"”ë¹€Çñ3ÇT0ÑZxÂQ¢&ˆ(­MF:þE©mUß]¸. fb™ÎCL,VUY1T‚™–ÕŠ¨€æ‚ØW–:0 £ËÛ4:ÛRQF¤­;‚C³Úºé똢S¦·R€Ó*õGZ_z¦¥@eKSz¾§ªhÌ;In”ÓßXîg¯bFÖ7;á½ÂÐ.¨$c!xµãJmlÝ"d°A^ ´Î c`’ÚiϬUQÊé@Ëฎ-€`d)¼ÙÂpÍ‘ÏæÓT«,™gÇÑÑÀ¿rÜAùp
+«‹2GÓ1¥ÈF$øÁ'
+"Ðü[x«Â¼ Ã.!CECÅÀÂHc=ÂyÅ£Y’Dñ2úP1å1f}B@‚oPV~ Jˆ Ë£ò÷ wÅôq¾‡)] 3
+o_¶²1°Þl…µ¦ŒõÞÁ{/¯|0³âjH\5ð‹ú6éʇJâ:Ì*w {š/&h·Sû^°\þªÐtLi|F‹ÆˆHl†RUõmŒkNE1,Tž 
+UÖ]-ÙVŠ
+ =VÆÜóƒÝp?}VR–¶6<’Ïç(ÝæÒ8K
+¹Ï …ã‹‚ú"ÕNîQ&»LÎÑÛðÑ_k…¶Ö
+}¤#ˆ=¦¬Jå^¤Bf?Ù
+“xt" V¦D‚™¨òÆ
+Vì]¸À½«‹=8¬Šëcî×Q7l:¬ØåH\dj¸ð?ó”mž²ÍS¶yÊ6OÙæ)Û<e›§ló”íÿGÙV ¯ß25ÝßíLw''F¦N¶säè!¿Üó|Ç£qøç
+÷þ矰·LàšýO\~ý­üýÍ?^úöþu\¾ëÄ÷_^ýÝ•‹OŸÜåuX²¹sê©ç.<ÿÌ3ç/<÷ÝSû7ßá¶nðë>~v¦3vò‘ÇûFw`¢Ëú÷M?2¤zzÔБ™©}[ g±¾whh —½;††ÕíNðbS¹Ì¼¬ÜÄ–%>þ‰ÅQÉEKýO"Lˆ­£˜.¥·§Œ4çë6|¸šHؼŸE/TÉêâÓ¸æÅú¾ÉÉñ¢w°;qhl´‰L<465pñöx÷ðáîÄ&Þß=:²<íßG TÃX€ÁrÖ˜å«ê–óøv¾‡¼ßY íeÅèB¨¢Ý7SêAzãêÖ¸¹ihdÐè 47îBiws«˜†žˆ5ÈÒg/ð:ÇB•2§¹ÐLJçÞç2 }’³*ƒˆhôÑÐJ3 ™ßÒöïyP™– M€0ú Ñ,;­k¡I‹ˆ8i@á•°DiÚOe4y× Ý4T~FL––À¨ð £YI|¶<j‘ö\^óÝbµãÕbð‘.&´ð?š‰T‚"Ž¶fbŠª)åíäЋ)R·Óƒ ;=ˆ×"ü¡^~ºLQCÍ\†š( âWY+é»QÈ0"?!üð`#?íJò“í4?ä\ùGlbêùŸ„©g1y(ãiJÖ¸´
+ŒÕ 6U))B<@êé‚'$³¦ÈòóÊN%-»ßfOC”L)(ï4Àn š‰ü„PO'z:ƒÑ®$?ÛÞô[{.g~(™™ k4¶´« #[¢2U½¸2ª–¾š•Ð¤à#Pó^kÞK`ê3Q|îEQ ÚÇ ®•nô1 B¬ ï /­¢òBë;‚µúŽ`2+ŠÏ–G-h›åµ[écÔÎÜÇ€7ëÐëe´S–¡ƒ‡>–ºlØéÁÜÇ¢üÔ‹¨¡f.CsuÉôMˆg¥•‘Fvx°‘LVyéÙn’r®Ü˜ÕÃò?IËbHƒÓ•1ôRµ^BåÐZOõrk^Ž`î1Q~îCÉ¡¤‡e×Óf[% ÷Ìð.ˆµLQù©ù9‚5?'0ÙågÛ›~kÏåÌ[ëa7Ãâx±åp½ß•š!„æ[t¸`nQ¬U1nT$hPU:—Cï—ÈX UJ«ªªà€J¸hâßØ ³—ãÿe¿lv¢(ܵ‰ïÀÆmãŒà€Ë¦iÓÄ0išÆ…iMnúþöþÌŒ?ÐNa ™£Æ{ðÎð1G°„ÞŽ=þPÚÁlRêÇnvsSfx>ÁW߆­4©¢ùiWŠæ?!€'83˜¤~ÍŸÓj×­õ}rvyZŠ`öNÂ뀆Á¬­QÚPÛ…1mE ƒ€Ëþ⫈ÒLJ¡Î­Íïáå…öBÀvøÏ?˜R꥚+½Î‹ LLï˜ Ä„%æ’I½Îàeš³YrîP&1玥ÒQÛÁð·J“Â;æ‚»‚s´à Î fsîÌß8ÇRn‚‘sKùhÖÖ,…ŽJˆ+cÚZä&ÎrÃS.((
+¾_£Χ}¾[éúa÷±/Ìí' CÛótòª„UÉðPÑ[«‘àT›ÏêÏÑs?ÓhßE­1<æ°Ëíïqû½]E©Jät²y™ƒ¼ê®±†IÕ3­;Xw¨]°ý#g×xŽýàÝ Ù'Þ ý㵂ô…×Ò/kÔ„¾ÑN
+„î8+ºkt„¾qªÝÝÝÝÝÝ5.ÂBKòMt­@è®2á  +ña+ýF8È?ðFAè²Ï/dC¼ã
+endstream endobj 179 0 obj <</Filter[/FlateDecode]/Length 5613>>stream
+H‰ì—}LSWǧPÚÞö¶¥-¥€À-Ø®å¥Ð7JyQÞ*¢DEHS+/JZP|¦”eÙÂ6<ËFÍMƒÑ %ã12õq$0§$è24ÆDÍÌþó9÷¶ååT)ƒ{>MÚ{ç{ßs¾ç¾ðò%à=·óréüÃí¹Ó¤ËöÜcò-í-«Ïwåí[]&coéÖ® yû}õv¬›Ç뼉Ò9Þà ÀÚ×hpM¡x9 P1!|…h€Â‹J¥ÑéN£R½€’Ð-.òÀ%4:ƒ‰²Øl€Íf¡LP¡Çb2»ˆJG˜,—Ç|ŸÇå°˜º¨ Q¼hÊæò}ýƒ1
+ †Ê2ómlë¹<0tstl||lôæÐÀ垶ƣó3ä¡À"Õ¹ö`1(4” Q&e›­õg;/ ŒŒÞ™˜|ð`râÎèÈÀ¥Î³õVsv’RÀCÁÄfU`ZRMÚ®âšÓíç¯ Þ½?õèñãGS÷ïŽ];ß~º¦xWšF&6£ZïáEg ‚Ãb3rËŽ5uô^¿yçþÃ'O§§Ÿ>yxÿÎÍë½MÇÊr3bÂlº—cqÂ`:}~yÝ™®+ƒ£SO¦Ÿ=þlúÉÔÄèà•®3uåùz]&`#³*O/„ã+ŠŒÏ4ZN6w÷ M>zúìÏ/þ|öôÑäØp_wóI‹13>RäËAœK?«2+ë[z®ŽŒ?x<ýüÅ_½x>ýøÁøÈÕž–úJ£áݪ–æеÕpiå]KÙÅåÊîuíJqùªtéàÒÝƵ;›«wQ—îØ®=\|¹öÔsñ ëâÓÜÅ7ßR\|#zϵ·¯áßôæ+— XNÄâ-…iæ*3ŠänEq²^c=;Ͷª"+Šd¡H5Š(°äJ‰Æ¶ƒ/y4@¥À^s`ÿäšq è&>¹GPD­Š‘k0…Z¾Ëg›
+yŒ&Z©U*¹J ¤ªXЯVêð¿Ç`°2z¦ùh*bä1jÎ9X¡šw*GSãÐÚ›µSkoÆÊUj] 6{ªQ—(Duu3M\;cÒ>Ø>…™S9šj‡vÎ|¶Ev¡ˆ“Ê°Ü=ıØ•l­J+-¨*µT˜­G°8¼/ÿÂ׬Z!ŠÄ8b“ã„ĔˉûTˆÃœÂœaŽdAǬ¤âU>@ŸÕì8–&ë±äê* fߥÿ*’aQ9UÖÒŠXa“&Zö™’õ:Óöý¶"ë¡¢BSfÑ“}”MægŸœ ¯°T`±:e´}vÕøŒñm†o$5±gÄ®!¶dzéEqŽã”¢¥Î
+Ö Ë@‘|ÇVS`*µS(µ˜L;ÓàçÊ-Y|
+°²H…Z«‹OHLÜäFâuZµ"R¶ pY `s¾KÜ$…Æ`ó„A¡²(MÜæÔt}¦!+k»ÉÊ2dêÓS7Çi¢d¡AB›A£Ì· ò¦PÏ/X©ŽOÙš•³'ÏhÚg6ïwfó>“1oONÖÖ”xu¤$ØÇB¨ùü¼é(W,‰Ò&éwäš
+KË+­¶ªêêêCnª²Y+ËK M¹;ôIÚ(I°‹ÒçeŽ/%ÁŠå±)Ûvï+©<ôaíÉ>n8åF>þèd퇇*KöíÞ–+
+8 ó9‹I,%‹ï¡MÉÚ[d9R×ðéÍçZÛÚÿí6ÚÛZÏ5ñiCÝKÑÞ¬mD¨?ŸE,æLàžTÇ7X¦ÚlØ[l;~êóÖ¯:»¿ýîû .\t  Ð÷ß}ÛÝùUë秎ۊ÷6«dÁ¾ÕÓÃ98åù‡Êã¶î.´Õ~r®ã›‹—ûúøÁõeÆ^eàÇþ¾Ë¿é8÷I­­p÷Ö8y¨?¥ÏFŽŽ°}‚¤êäl“åxck×Å~þùÆ­[ÿŹ½ÌEnݺñóðO?\ìjm<n1e'«¥A>ld6rà.Eè2ö¨ihéìí¼ñËد¿Ý½woÂMÜ»w÷·_Ç~¹1ØßÛÙÒPs`O†.B$Ä#w¸÷!
+Éõ߸Íh©ýìë ýC·Ç'&ÿcjê¡Û˜šúã÷ɉñÛCý¾þ¬ÖbÜ–½ÑŸË¤Q÷"pñPh(oƒD•¼ãì—{P×ÀÇyl²IHBB ! " IH@D@+>‚`1<¤ D ÄgÅ¢¶Nµ•Q±^Ñëè@}Lõvt”ªs¯£Su¬ÓÚ‡Ú©Sø[‹´p-×ëé=»y½ê‘Ìì/3a÷ã|çû³g7gËíw>uñ«[Ýw{~íí½O½½¿öÜíî¼õÕÅS‡wm´—ÿ%-!B.BÁ³è±%› Pë3gW­úpï§g¯Þè¼Ósÿ·þQÆÀ@ÿo÷{îtÞ¸zöÓ½®ªš©W+xìa–JMb–yQãÖ¶ŸýcwO_ÿƒ?ÿMƒƒ<èïëéþñëÏO´mm\dÎJÔ(=-ßð·¸DmÊžW÷ÎöŸ]úö§_zû >üà%•>èïýå§o/}v`û;uó²MÑJ ¸É"§%“”Sl]·ãàé/¾ïºÛ7
+1:Äüö«ðÉù¥K×mo;vöÊõ›·»¨ÿ…ìº}óú•³ÇÚ¶¯[Zš?Wùí!vþ²°Øä좚U›[8{ùÚ77nQ¸Ù ··n|síòÙ‡Z7¯ª)ÊNŽ “ù“»qî="(£ Sf–-mjÞsèø™s¯\½FÍÆ͵u»võÊÅsgŽÚÓÜ´´læC”R"@˜;7â…B®ŠKÉ1WÙ×7·¶9ÞqƵ íMðùó®]ð™ŽãGÚ[›×Û«Ì9)q*9ñJá±  “ëª1¤ç—TÛ›6·ìÞàðªß(Ž>°wËæ&{uI~ºAèÏõx=#&جËUZSfAI•mõúMÍ-;wíÞCåÛٞݻv¶4oZ¿ÚVURiÒªä`«ÎôxÕuN¦T‰'gæ•ÕØV¬iÚðÕoºïmhZ³ÂVSV”Ÿ™ŒG*¥C¦Òù‰ðD2L›Òs ç-XXc]b«o°ÛíË(j¨·-±Ö,\0¯07Ý„«1™ˆ‡x¼B’—L&‡/
+UO0¤däÌ2Ï/]`±”Q†Å² t~±yVANFŠa‚:4HÌçSé¶$'“Áæ
+ÄAJU4nHNÍÈÊΑ——O!yy3r³³2R“ x´J$pÙ Ï©tL&¡ÉÊC#4Úx½1)ybÊ$JI™˜œdÔÇk5¡ò@Ÿ”ôœJç5g°9<a€LŽ…G¨51±ZíJÑjcc4êˆpL. ò8l†ß0I—& AùB±T¬Pb¡aaaáÊ…bJE°L*òQ„5‚¤ó¢û1Ù—'ŠÄ©4 £ ¢šT*‹„a3ý†_nOM“ÅæpQŸ/
+lÕÖ*,†¦N«X\VYš–m*Í/«¯´-«¬(Í­\YêhUålç-š[[1£)>Î1\;1Ä%¡Ž\o8¹âÈå<µº¶2Éyœ^YUmu-n0Y YŠ;—)ŽétF,OÀæcz†ƒË&ö­‘çÎFÎ?F,Xù‰dc°˜±8PUE–$î°$,>N‡À–üIãmžçéøzZyÅFl´U_­Û+÷==xO
+Ü`$©Ô{ Iêõ^HÒ[zÏ/ùšzWÏÁ˜6ô¶Úcƨ¡·¥†CÂ3æ ½­32´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<cËð5”üó ¼m4Úž' _+ÉõÆ„ák"ù ½1aèuÉÿ«7& ½(ùœzÞ’|!=ê%_BJO½Ñ–„w=ÏWëö
+UGUì¥m©·¢Ì¢z%ŒóàÅ3ž3“hòÀÇ qöìDGŠ¯¯Ÿ__2óéyDHñc0˜,›„Åb2DæÓòˆBD
+“ÅF8\”G‚r¹›E$úŒ˜Fòe0Ù—Ç÷ŠÅ’€
+©ˆÏa±y~@$)Â5¸qRFN~ásQ‘yNaAîÔTS|Œ*$PÄC˜~žÅˆR 6*”†¨bô)™3fÍ[PñVMmí¢êJKÉ켩“ Úˆ@!Êfx#J±8‰b|¬!5»°¤¢Ö¶|uãÚµo¯¨¯[øæìÜ4£V¥¸,bd)„'
+
+‹6¤æαÔÚ×lØ´eë¶m[›7¿Û¸¬®Ü<#=1&<XÌC<Š9JùK•ê„I¹s+–¬~wËG{öµ}üqûþ¿ílÞ¸fieÑôɺ(LêïY dQ‰‚Çk“²f—/iÜ´cï£ÇNvtœ<~ôà¾6¯µUÌ™–<a|°ŒÌ# ò%!j]Zþ›uooúkÛÑŽœ¿péÒ…óÿìø{û®—¤ë¢B$|RÑ=,&Ç?04Æ”õ?…§—·O[²a×á“ç.^¾|éü©Ã»7.ÞQ‘áa¥«$!ÈÍó##Ð[<ÂR*v¾qù ¬Û}ôÜÕ›wîÝ»{ëêùc{Ö/œØ˜çgg *- òB'¯ˆŒº‰SPriûŒÛœ»~ïÑÓçÏŸ=¾wãü‘+gv”¥;™¨ËŠðrÂuƒOTNÓÌ5,£ºwþú}§¯Ý{úòÍ»wo_=½íôþ óûª3ÃÝÌ5åDùàÁÒ ymK¨œúIK¶¹pûÉ«w?þôþÕ“Ûl]2©>'ÊÓR[(ºÄt¬¼bò›¦®ØyâÊýçï>}ýöíë§w/î_=±sÅ´æüXokEq$]À€WÔµñ‰+l±j÷©ë^}øòýçÏï_?¼ztýôžÕ3Z‹â|lô%àAÒÅ- ¡¤gë_Ü6kÍÞ37¿ùôíç¯_?¿}zóäæ™}kgµ'øÙê)Ip£ëÒ·õK(阽nÿ¹[Oß~þþë÷ï_ß?¿}zëÜþu³;JýlõÑt"YYßÎ?±´cP×md]·ÏX?§³4ÑßN_Í]’]sÖ8ûÙ»/?~ýùóëÇ—wÏnŸ?°~ngiH—$V]I¥sºî ëºC’®ßþü†êÚ@@WYçÜ Xu•ÑF×Á ¨º.Õ5ªkTר®§ À
+endstream endobj 180 0 obj <</Filter[/FlateDecode]/Length 9111>>stream
+H‰ìW{PTׯ^ Ëû©‚d/÷ž{îËq×RŠŽvUZ`Ôšhú°>ÒšêLŒI´1míÃG:£mª‰:¡N3hš«X1>ZGiê3¢ô;÷µ÷.`Bf2Îpavïýöû}¯s¾ßùn]û†ŽŸ¾p­ûî?~ôÅÝîkN?°cC{]yaÁ˜´¸È°áC‡| ®!C‡‡EÆ¥)(,¯D ¢Qƒ¨AÔ ê:vÊŠ:uì›Aµmر¿OTÛWDõ<~Ü£¡ö?ånÛ°P]fTדP©*jýö}G;»®Þºó çÑ£žwn]íê<¶û†67A¥ZP¡‘±©YSÊú׿¨ófÔùΣû^_ïw—M)ÈJ BÑSf׶þäµß½ûѹÏnÞ¾ÿ°§çáýÛ7¯œûè½½¯­k]X6…FÙbS2“Kk–­Ýö›Ãž½|ãó»>|pïó—Ïž<òÛmk[jJ'Ó™©±¶
+ ŒKÖÌõ,]µvÓÖí;ßÚ½{×›;^yiÝó˼óJŸÂ¹TJIË@)!F'ŒÈš L-™ãnl{þÇ7mÞ²eóK/®]ÝÞT_=Û%æ™­¨¡4g±ÉécÂÔâʞƖå«V¯Y³ú¹­M‹jªJœžkv¥9‹°Ç§ddçóSfÌ~vþBÏ’ï66~¯Áë^PU6³P Çe¤ÆCV&Wª³0[t|Jú˜<V*œþtyåœêyóªçT>S2sªŒò³3R¢mafWª3ˆ`£2Çå³Â¤§\3f͘6u²ˆ9Yé) 1‘á!WÄÄn³Ç%¥¥gŽËs°/J’(`–ž0>+cDr|tdxèp‹+ÅÙ°ádTL|RÚ¨ÑYÙãsróòòrÇg¡ÒG$'ÄÚm*È‚Òaá‘ö˜øÄä´£Ò3FÎÈ52-%)>ÖÒ¤À
+#ÀôRÝ)Àá!Æ€ôÑpHýªBž€1€Á×—@ú@~5Ä7xegÏhöLwûÝv[õ,»-ÛYÌׂ¤ÂÝê÷¶Ømev[›ÝÆRÎ¥vC•ÃÍÀűÔnÔ¿j7€Xù«^i·aI Aà)–‘iY–©&‹L Y,c
+Kͳ‚
+—EE+&P¢’­2bÊHG¶Æ0\+0µÈn«²Ûd*'—ªž«Üg×8[üÓêý ¾fwËJj"‘M"¤øPvÝ&è€ìZ“U¤¯
+ˆæ9‘"è‰fxX+ı´,’E5Ä)
+ú#¬ÂÍ ›t°Õ¶xQ Š„‡Ê±ŒH,ðV/¼ bDbè «ìeQeÏqÈ4†D9Pâ—ËY_ßÖTá󻉲µ˜yJá”æ§bx C—³"‡ò-q¬hîN.±¯Âܽè›È28 „dàA E¬?˜«§<K4‡”JéX‘Ó°Ú
+iÚ
+!IL:X2™PÌ«#™œX#6küÓzeTª”ž¥¦¿ˆæ\(—!Dˆ¸¡D,¯=˜s•”%F2–©
+Z:N—‰4{”,%Y$NZ„@Ú£–%PŒYó´Äq&3†Àœ­&ƒrÈœÒyºÓˆaÕëÕSã1tô 3ÁyÌU§pÐL·ÇK«Í]ÒàFs0¤[1’¡TŽEh,KÚñH Mh‘‘h Y¸€¥jgÇ:X²+eÊÈ™£·ü@EILƒ˜ªnÒQÆ”C” J’Ù~<%10krè¸ê¿ŽK×@]ªåÔü-"Äåê÷œ0 ¨‚2Ÿ¿Â[ïkñx=*KõW½‚
+¯»q¶nQ£r¦9‹‹ZÜžo³ÿÙE¾–&õ·Ü>ˆ¢Ò¿²Ñ[p­© œ=Ih¤/È–@Þä“lµ@Foét,ð b ó"DÅ‘Ç<!hŽ'T ߌ ËÛÇ:šU(Ó'‚W²Jˆg$Ár£Ó:ˆâÉú]íÔç;¤ÍwpFðÔr;i%ØZ2´¦Á<«òGcŽçÂR‹¡±ÄbUhÀû’Þ¡+‰3*M8T›„̤‰˜ÃB&†]ɱAŽ`¶“9!HˆÖoYð0Ë’Lp-””yZ`§6±°%•¾Yå°QíÄ LŠ26)A²,´ †ae Ò' k¬Q4dEðÂÞ‚>EʤñÊ0‚눬¬¡Á)S  «+S½CpWUs³» zl±Ö2ìx¨ŸÌAUõ½Šaeø¯L_Ä
+Ewp05Àb"žÕ’„#š•Qß&ÈP¡~Á2!1¥% õ"±8î‹Éžì+\†9™ÿ?$3ÆŽ•„¯Ifß#ýð™:+)VÆÊf‡£ÂÒ‡rM“Š€¥•àµI¹V™ÔEu ‰6&LjX€#[aÝT@¢yT€º N"샀)2W!Ò—†G]¢ j`†š¼aªWŽ
+©áÓ’ ÑÒîpÒÌmSmeëêŸêñ:J—â+mCGY¥Bÿ•®Ÿ |©Bý€‹½˜sËZjñ¥¶¡£¬Tp!ì¿C—Ü涵Öv¨µ-µÞZGás3ôƼoÙtT(­r•¦£Ú¶ÍUèP«4%>$¨TGI3øjƒé¨­P“³8´
+€¹£:¼’3%>cÉf_×o®£ð»Qƒ]®"Qx
+)½œ“52•”²ÜAHís>½kN‘R7ãëÃïZêvZ
+oD‡¨bˆ~Е'½‚
+áR®n.M Ñ›µzâË­¯1ù¶÷¼K4×yVKá‡g‚¤$üA•¢2-•ZïÒǘb éRuCM‰–fr*oD_(…LN¥š“¾TSNUìÝ81:=±dŠ_ÂÐS ï*~fnµ(¨Â¶]×ÿeU«N×D,óT+;§kd2 *|¶·ŽÍì‰Oõ³O'A•jL_aG{`‚Šðeˆœ±QÝ,FD–Ñ° A…DB¹èÒª R‹ò‚
+ªáÆ?TPI¨iÑŒ|ÁâT±ãMž¡x19¹ŒÃ¢Ô ‚j¸Ùâ-Ô¡Æo@P!»ÊÍ´ êØ© xAE>H
+{zEµžPw'4•œPr! íN'¹äÑK*6:|v¨ÈKªhÄjõ’Jj!ÐBÓß¾TUT)à^Q­ŸÉ,Õ+*ý]€ý‡8sG/¨üN*mK¥·TÁ Û'¨ZL\¤ ª-Ĺ
+j‘&¨Äœ â0à•ëU-p1ã$Jyn¨¯ä¼¦ bŸà‡Ù×õ9U9!PÀi›Vê!‰X ŸÕ6`z
+ƒ§Û)Au›œOïšSôÐÔ¯Ž>„žú°¶å‡!«THáÅÂ[‚ à9 5ðUxÞ%õi¼”†ÒDaàåŒ*zbÄ«†×zñÄ#…ÔÛnzD­:ß½’°[O\Ÿ(óãÉ‹s—PX…‘ðºÔE"aí±OÔmgË#"fîxqÞˆãZ·h0íÆ%ÿ»W1¹±ÞŒÝ«°Uú¾©0²|”üS…±[ô*¬SSô" ?W}ÜœÛðnÓÞL†ÕQôà5cG÷ ¨iVÿ¹5 ›£š/…
+D~ò§#‹Æ”`ìN‚I(ðŒ2òõr °1ÍHd¥¹|jPȘú«0òNùÅaå}ê ÁVjHMMhP,kíw8Em>Y}ð‚²ƒiërRíd>y ’—,<E,Q…“E€5 ¸)¶ó5ì³<Tõ¥µ¡j›Ž5ˆ‚F¢ª¬¶ÖtංƸePx§Æ\ÜÓ¾žPw'$
+Ê|è-³4XNgsÉm®­m]ÿ³CE^}éZ|­ *[­+-Ô(ƒ¥VãÀû:çÂZ+øZA5”ùäæBä¶ÿ]r››×Zó¡Ö¼Ôz[ýå>‘³?ä?þP ‹ªYî§Úp©¡!mÑžˆ:§n a®Y‡º'¢²Ì‡~°0ðìÍ°Ê,‹C«`%¦ûߧZ³õ˜•1Âìëúuï긧øŽ‘0¥»·õ~ â/ÚjÄEFläN<yúRx" ¾4¥våñèº0•Š: ,uÑiü5'|Jè±ÆËÅXçXÅf³OÙ°SFžÎ¤
+Çä…3Þ]JK7,ÚĆÅm3BíËûp8 „Ìß½³É"]@p8Ì>lñö.:XƒÀ’…¦€‘l븳Ñá°ÏnJp8,>a öY*ÇÝ6Ýáp×Ú¸²mà·Bq˜>Ø9w¿¯'ÔÝ ‹$Òît’KûøcøìP‘Çá8àqÖêpXkUαÊ`©Uq¸â ÷õ3™¥:ÖRaF
+Ñu:2b ]6¦bœá)´\BÛÌ'/FÌ]BØ%kZeÝêÎO›òjËc=ŠÝoN¾|íöÆ UÇî9tV
+±{Ž’AÁs4Y>JîÉÑì=G'À› Ž£S„¢]Êq4
+­~Çèûbtðœ¹iÇ ž£SÞø6MŽÞjãv<Aš,Úý'I³x”æPàQš2òýò,“<“¥;?™ž¥É¢oÀdiv ž¥9ԡƇÓú†c›z°këoýÀؾ$ƒ®_Hîâh;¢¬ æEÍ‘ŸHîÒü³åÇ›1{íÇâzö™Ô¥RߣýŽ5r’1”ç –xrˆÎ—ëÜO¥zô¾-´Þn[ä)¾ ü¬2å\]…fÊf6ú·ãqx[êKÁ»¡Ÿ1l>ò/Û§q$Zü=¾[66CèÜ Ì†#ÛüÂNÙÆÜËñ>yÚzØ·n)ÕùõâJS Ë×ÌcùšÙÕýt^ç׃’%ÇÒÓ­?¾{|v‡Z`½©<þ-káoi´ŽÑEä6Ë>—Ý»6s¶­¢7?«^]¿þç«÷š“¦ªý¿¯_¾u4g–¨i<©Oþö§Ë¿>ÿ¾í~ü9=ûñ/o^_]ã¯?þø» z•ŸÇ@2ºŒOž¾}‹^¼»~1‚Ä‚„`«pñä9>«~¢06‡’üùíËëHq‹?ã2~¾yó/tøáÅ{Üý¿xýÓˆüûwï^ý®^½~óòÝõ8•±ªñgúßûÿýûz–tøóÇo>Œ¿?_;zïG<1!ÆýÒE=ºzûö«®·mc‰¾ð и¡÷ûãÑν¸uá4@ãâæÍ%Vv«H%·iý=Cr—K[Ž©~$2² ¯Ž†Ã™ÙÙ³sVÛz½Ü<ø Á6‹ &ß¾t‚#Òš.·ÓŨĂésIm;­Õv\Sv¦Ï%µÕf3]ŒëÇh{ÉsÇ´× Í~šQõúî–øqDŽÑö r±wõrTbÝA$õä ðkUoO–7‹Õ¨ÄëƒHo²Z¯;Oƒ4¯¦³_¨ÝVóQy¦æ‘è“ûx½®ÿ¿‰õA¤ÇÂìõh~³j¹¼¨>nÏ6ß^¼9•äýGþµO*SEþñª¿LjßÌæÓíôÕ¦šµãþÓ•½_È{!íêÕýB
+;wÁ4ÿ¨†ë,CG7ï¥Ö£TÞÞRuÃÞvjŠ“LR¬ÑQ½xâš–08ïm?¥£¤Þ­£vª¨^tE¥ØxuÉ÷RÜã³:Ò\­ëyUg•eT–QŸ%¹cØqRè]·v–QYFe•eT–QYF=Ö«YFí”QÅÉíÑ V¼ÅGÉðOòâ‹öÿû)t¾àB“þŒ5ËóniUésò"«ûß[ÓŸº{ ÄºÈXÙ³–yb™'²&˼¹²¼Ëò.˻ϑÜ1no@¯&뻬ïHd}—õ]ÖwYß=W}÷œõ“Ü_?i)œÌúé@H7맬Ÿ²~úÉ5úI{+´Íú)ë§Ã™»³~Êú)맬Ÿž­~‚<ºÕO‰hbƒ¥è¥T»|T?õ’èÏé'¡÷ÐOjoý¤™´Leýt ¤;¹Z×óªs}f•uÔÁ¤öÜu”cJ³¬£²Ž:œù;먬£²ŽÊ:êÙê(Vˆ £°lÅýI—"J*ñ'uT¯žPRb/%¥÷WR‚iγ’:ÚÌÖ«m½^n²–ÊZ*k©Ï’ܱrž;a]–RYJО¥T–RYJe)õL¥ÔÝÑ V¼…bb¥²’ZˆR¦H[¥˜7V
+ /iÍ,3pVJh)Ö
+@Ä—ÖJ5¨3œã¬ ÊŒ×7ì6P5Ñ«8¢E Ñ"–Œh‹=Ày\$=€œ}:¢ÅfÉf\ÐÄ ¸QÌÐÄ Sª›@Dÿö#42<&h_ŒkZÓqí
+ÑEÎ
+$¬3Mh+–#ÐV,X ­´Õc‘¶z¨£­¸‡~âF'¼"á­Ø5‹}x«zÞzÐ{ñ–¨‘£CÄs(Csˆ@¼\€ ÷Ó–¦Ä0Í Z(*ÓÒÒÀîYÕl9]%¾:m9¦äÿoý€Òj&hKmD-˜Í´ Qa.;¡vùüŒo¿t±®xN!¶Ì€z$M;?zñ)ãèy;4%‰'íÓvÒ”ø«ŸÖoGÒ¶L!1Ë*ß¼&@ Åâ<p>~8¥Cˆ‰Á;C|‹ÖŽÀë£àa•ê1øA¯B\ò3¬”–ñÞsto‡§ˆ… ÏSLƒ†„- F'Ž¿±8ŠýzGU)7¼Yù¤ª±$çû%zÝœ³§šÇ‡¦Ñˆ”5¡]N,JŒSåÍ~x9—çM¹$m½¶1f"EAo¶Òí­ØšùƒMs[ï $'/õÑŠrØP[êL3^ =nÀ¤”ƒ8°'ˆ#F«|÷dZ“”é 4„%ANŠÖì~=Î÷áXî%ÃE„S£pCâ|£ÓI‘îC°˜½½2­)(£™Ín&jÜG\‰¯“Q?Qà'è”a›¡À=è‹ÖŒ¶¦_ƒóÔ_VÕ—KÖÖ§˜\W7‹ëm—|uðo7óíu‡FÛP,¼"@¡0ÇïßœÿxöoìÖäò£|}ùny3«°úÏ她|YPyÏ8£Êª{†ǧë5œLëjüp­½Ñ
+û[Ÿ¡|“ yŠÏÐ{¾_Ï«}2âg„ññÃrƒWÓ-vÿên[m‚瓺ž>´›]ß,çuµê¬DUø™>¶¿ßV}J~þuº¼ ¿OZÛãwxùj1´£¾é»1qú¥“šÌÖ«m½^n |`›Åˆ“o_:ÁiM—Û‹ébTbÁô¹¤¶Ö‹j;®);Óç’Ú‡j³™.Æõc´=ˆäŽ­‘W8þ FYÔë»[âÇ9FÛƒÈqÄÞÕËQ‰5v‘Ô“7À¯U½=YÞ,V£K¬"½Éj½zì< Ò¼šÎ~¡v[ÍG噚D¢Oîãõºþcü>&Ö‘ ³×£ùͪåò¢ú¸=Û|{ñæ|T’÷ù×>©üMùÇ «þ2©}3›O·ÓW›ª mLeïò^H»zu¿ÂÎD0ÍÄ?ªá:ËÐÑÍ{©õ(•··TÝ°·pãÅÉ-´•#…¤Sa%Ù:O éÜ]Q=RŠ±Âjz7­8–xTéÁ²[±°z\б݂N³]‚N±’þÇ+:»¿¢³ÜZ•Ý°ÿäj]Ï«šgA—]tŸ%¹ÿ³_.­mA
+7Š”ßF£è‰F•áÇ{TÚÞ£R¢„âQyèveţģģ^åäö‘ŸƒÁcˆQDJDj:ÀE¤D¤D¤D¤Þ¨H9ã]…Ù… ',N›„œ+ p8ä$­Þõ¡Vè¡Š“áå*:NØÅresÌ}ñV«ÏÝRz"]ÂCóó©€ï£Ë< òÉ7 Dë8q‚³%±H!$õ¥V–*‚‚PùìE\Õ¢ok¬‚œ®¯-ûÎÆãÚµV
+rå“e¦s¤À‰ë¨\5™JB1†¤Àò„ÐB¸*w°«O˜—aCmÙw>0×Nø¶˜c>FËc~5—}\›÷5ʹwCíß¾Cµr±Îµ:f€S_iÌ»÷¦¾x¾ÃC9/^0¼FyCSÿæúá)};¹¹]tùÑâûÍÝÙåÏ_‹{­x`nöQ«/üÙvâ“©
+endstream endobj 181 0 obj <</Filter[/FlateDecode]/Length 2284>>stream
+H‰ìW}lçoœÄI.$$9>Rœ6±ïÃ_G ­!ép’iÒÜ‹}8û.;_€TíP'1P¡ ›öê6UZ©:ÊH¢Jûø±j+$ªTUê¦B›ðÇP+¦R ¦‚ÂÞ;ßï.çp¡-1Òý"Ìù¹çyî÷¼ïs¯Ÿß#èâ®
+Ì7—,LVÆqWù¦#"YÝÕÃ|“Òg5¿ÄrQšGb³SzðÄŒðyÜæÊç‡àù}q˜G|Ç](ȅ΋¥Pà†E¼‹ŠŠ­%9`µZ”1–"k©md·WêÁ^•—•ƒ9 °¸´Ü¾hiõŠÚºººz€¡®¶fÙ’…P™U)°—U,®^¹¶É…á8îV0¤¹qMmU¥ÍZ(FXŠJ+ªêñ§6µ;;»´èìØÜú´·iղʲâÌC
+,ÖòÅõMëÚzB;v&hšQƒNìê'{ƒUUPIæ!E¥öêÆu!æÅý‡†GŽh1|øÀ¾døÇšj–‰¶E+ñ¶ÐàÁ£o?96®ÁØè‰c¯
+½k–”[„2Š,]ûTsðõñSï˜Ô`âÜ™Óïüáp²÷éÆe5a…ª›6…^<:þÏ?ùlú¢ÓSç?:óÎkûÈÖæš
++_z¥Ä¾ÂÕ¶cÿ§>œúüJ*uMÔ•/¦?:}ì@ÿf¤Ö^"D–Øk±àÎCÇßûäó/¯§Ó7UH§¯ùÅù3'ïêÀê*…Å•uxgbøäÙÏ®\ÿæÖm n}sýÊÔ¹ÑáD'®Ž GÆ&¦Sé[ßÞÑàÛ[éÔôÄغKÑEŸ¼˜Jß¾£}åîÜN_»89~„QEÔ»»>âÚM½ˆ›b„»ÞŒ0#Ì3ÂŒ0#̈!ýžÏ¡33äš
+Ïr‘ùë%ù`þz‡ ›×ãô¡>?ìEQ'A¸Q8¡´!N°·ìu;q¯Ï{ÆÉ‹‰’! ÙpŸ#|DÖ6ÓëVÚp·è$¥ÎÐl&É#g’mnÒ Ë™ÙLféñ’$’iJ6H®E²ÉÕŠ™³ß±l"í*D; [d#`G#Ü»]¸n¹,× s1†&Ù!xo{’ÿà—,x¤’BrViu¼U®T²UV‰vP•AߪÊ@ç"l,)^;íp`càLÇÅ^ a×6ŽÑQ¸I¨v"L
+´¡®¾$Åî¦"¡-ÔP(ã•lý2U£Àfh؃™ª³=ëwûP?ß¡€=F>Ç•ÍK (áå/ü„Á‰ìE¶‘1m#»Q§{F#g·M¿¹Q¿º¹·WÛÜ8ŠÎèmî¿ßÞ41?¡¦$Q—»kÖŽ"t:IQ¼Âª(_iË€œ¹Àx_‹ hgÅ2蔟µqÕ=–Y D<·ò-†¸×Ë·êAO¸ðà¸OÙb~ù_o çáøøpp‘Po `·Ý‹!Â?Px#P®_ØŸ¬Ñç–_S›bú6)8¨—s.”Ï»¶RdvôS±h?'¾£&Û÷Ä"\¿h¹%ó^ÑäÍš†D“«·#ØÓÞ¯ƒ¡½ø¦Ð¶x,L«ÖPˆ5Âü9ÑŽ"!ÀxI™a×F†IH–"¥<`KšÈ»Úiv$ùLr ÿœN&B‰gÕŒÃköÛ€ÆÞDœÍ$¨¾AŽ’Ž(幧ð ÷Çâ–¢¥EYI·ùnh€Ê–4ãön2>(Ýwd|¥3TåG“ É <_‘t¾‹r„šc™x2qU™* ¨ø6ß(‹ŒsÝdÔPa’ëÃRG²QŠ3Ö”¢ëÃRZ‚J&ɨ±~”}ó¢8†"êÃ0÷½Ž”(Ë ð¤"eß¼(ÒÀ²qC… ~yQÔ=vS,ˆÇ¢´¡ÂÞyQžÌV¹^(U™}dxßntÄPJ÷¼(ôžûØÏ°/ßG…w^”‡HÃWÎúÂT<ÞMíåÚ“mÝACEjCšæRÊ÷´"?øÂêÈs;ÔV‡#$G6')š‘•Õ.¤†’^¯Î’´syAFù 5œè)u´ð\¾õøRºøÕ•öVÔ^n‚×H¼à⯀BɃ(¯ÀÝ ìw2
+ÕQ ÝwÒP@:ÍYDá‚`¦ˆÊ“óÖÑÇ°Š5%”)¡L õ@Šs¡˜Ûãó{ÔgJ(SBåÏèmJ(SB™Ê”P©„
+nÿÚ=¡V:$‡(¶¹ž¿üÝ,‹S,d‹&ÉÝLÒ4Ñ5
+endstream endobj 182 0 obj <</Filter[/FlateDecode]/Length 16119>>stream
+H‰ìWkoÛÈý.@ÿaú!@ü!ÚrÈáE>SëÄ°]‹B`,Æa+“%e7ýõ=w†/Éò#Þ¤M»Ò@5CÞ™{:»x.ê÷Å+wÆÙtòâEÜùºnŽ™™f'ËåfµnhêåùbÆé©ð$˜·OþT4«²®Ž™3nW3zÿe¸¸)«²}ùˆ½<¢¥Ër½,°xU/ëæ}ýÛ,/úm!&É×XV?¸ü‡sÍô±tÙÙ©y$¯>å«Uù/< |7pi2ª7Õ¢¬®£ú·cÆ™r™Ç¦¸ Å¿–çÅêÁ'’újsST볦¾*V«˜Nµ:fñç¼b§ù5Vrö·b¹¬eÑ2¿ú'Þ O¼yV. (y“¯™2*‡'îܼün…· €îͼšŸÜ`ê¢X¯qÈ6¿ŽÆ[ÒÁh¼ü弸¶‹¿µ’/‹›Û%€1*x™y êã:ºïÅÉÌcBøLLCW_wGÔ->•Å¯ÇìM]­Na³¾°ØrG2åíüùfY4ïªr³ûfN[UOëE±ÄãÃûÙ27š!†kûÄeÞ\k˜¤^nÖ†2ïÖÞln~Ì?¾h7y{[T—õOæœÚ9ŒÆYÀ„
+ —sŸ‰Àì!=h+ÌV‚µ¿­X’A:ÙŠÀ?ƒ=Þ6åuYw‡Só×M¹ŒñLvWÚdŒ¾ºû¶'…ÞëuQuGÎ<>œÏN/hß´ZÄõ á¿2Ô…©+°`Y_·«Ã³›ÛV31‡¹Îš²"ÁÓÉ»ÌÏ–,¾nêÍíIõ¡žN^Zß½lò+<ÉÞ¾ÿGqµ†¶ÃÝŦ\pÁÛ£GD-ó*o˜Y8bíäå'¬ä8³ïae˜{ŠØ¤ø
+x Š¢0ÒQ©ÈUe„“FnäD"âa¦aBH…a¨Ã T>h-C7©BriT':Ö‘ÆCZë
+ñ¡¨ê,»–µþ ‡m}cÙÇlk­;Ø7Øcߌlkllì+[ß·Þ¯ŒƒÞÂ] Hwl,FvvMQ0XÛÚ»³t¸eé¤i7þŠÉ}Å£ÛÙgš¾=‚ÄpƱh_Þ±ÍQÚÆ â©g"Pß(:°mËRâhÐfpÓDÑþ6ט‚¿3¾i
+CÃBj ©!¤ì‚3¤¸–™Ð»è£Á(Ä 0‰¶ñÀ2yLL1q‰ß P©@B¡Ô•H÷Ê÷•ÉC‘Ü—ÉÚÚ±+Œ|“­º²ˆ÷¥aÔǪ-Ž%4và~’Âg[Œÿ„@%
+vŽ¿ù’uÓÄĽó8ˆ»ËEÑsq›z\*öíͽ…"568éý 븱Ùnmtß°¶ÍÐÖÀ˜~ÛÚè¾m½ÛÞøöbëNôW«{wuzÿè‹iH$d,:öjqê®^;üþj=ʆª/¾éK˜â
+‰ºÇW·yw%D–âÉŽ>ä‹ÏK–£t‰T‰„Ù§Ëç'˧¥ÊQ¢y:éDZ%F3Òíßì—MnÝH„÷|‡9@‹,Ö’ÅŸ9Io{1÷_LDdV>ROÝm÷èÍ0É$>²22ò ¾Ýo¸^–(½©¹
+<‡ÍSàªóà‰ðLf O†gÃÓa qF<%\8£]§E¼Ø”+WUѹñä„7z¿Î¬ãsáŽo?ó“ú‘jï…;¾ÿt{¯‡§âÍ€ àEŒ`ö"ÿ4Õ®PwàPÑ¢EÃ
+®lÞ< ás8Ò?s"Ž¦ •Nlô{ |_èkðkøk
+ „ï(ì u
+ßAø…Áå†Á‚_,
+.zù‘jR—Š [Ñ.ÙíjªMtçñí:’]òæHì)¸n–óÒ{“ü—5È…/91½øÓ‘ya²äÌUîÜÃÌ"—¦OgyõD)4 ŒëG#Ê·y7Ý›þM¯án_øÄU´pÇûÿןªòUáŽ_ý|ùÁšßë-þ>JÊßFÇþ×F«\±VþÞ ‡œ¿¼Å’ hþΊ¹.þQ×óÇÛ•©ŽÓ¿¦ù£Îóí‰~í}=ÈYKc~yÇ”Ë0óŽ ¬*ów*¸iͼãøƒËŸÓݯºåOF¾ÿç·ß~@ö§Ÿ AË ¯}¼^v®û` ‘IÀ$·X˜+춹±­,3Õ†zôñ„Ó®²ï˜=¡Q0xýçh¸i…³,. ¬ °Ó©³ie­©K(JHÅ0agñ ¥×_`Ïß¾¾¼#ñÈÐÝ?YO|šã:RW¡w…ÌíY`Ÿ¼Æ¨/ÞèÂÄÛ;? È
+„żª¨·)î5E¾Ýc”KþžÄ󞲌‘Ä2¼ég Õ;Ù[­þf›¿Ý®ÕurÚô–£&Ð>4
+§º³TME7ä)¤*ix’vM³MZ½´XèÔ¦­Ó¡-˜1”gkÅÌ·uÓÅšÕæ¾T´R_)£VJV¦±•²Â¯±q~vå£ ÇÏ 5)[-Ä›7§ã8l5Á•†€*Š øpÜ
+µõe]¦.”=¨ßºÙ¥´Ø ÚêU\yVZP'Uh5Ý"hŠ j5ôR,íu>J‡%ÒÔwëS̉MÉbóqÄd¬þl}*FŸˆOÜŠû?ÙÕï¿>¯)žzßn:§Æ±Ÿ¤ñ1Ô}„®k׳tl]»§+ÖTZÅæÅØ\ÙéüÍ7±9G¬äŦ™À+V•>¹ŒNÊKRÀÆCƒh
+K®ŒG&v“¨É©7ys¢ß>ó¹N©ŸSÕ9•ðƒÉOŠHÒ}àuV¯Óz4ë“þ~^¯4“u^J28«ËÏê~R·SúþM§4¾ŸRœPyœ‹Éé'Ñ"Ï Ëà,Š'™žb”` @É„ã½k$ˆÑ4Sšba`@Ëp{âðÁ}3YÞÃ+ÏhÁ(‡¢3U9Ñ,¢÷Ðuè6¶oÖØ4¶eNŸ›>5xk›ÍMŸšÕ7‰æŧÅf…;ã™ï8œ Î…¦½¶-`½¶.«¿Þ[vÖzJõ»s«M4½{çØ7tÆ:çÙúîʶnY§Zt‰Äʽ?ïçiJ Ê4%MÒbÏR–¤˜¢6¥¨½§(ÏPÉ
+Éi¡T#=5§U®ŒË“e¥ìÔºà4\y5Ù÷!Ç»èˆðÐQn9ÉEg¹Xqž5¢mè—Q-¹–>ÊÕ)ÅßáÖ3iœ pwtÒ´_ŒwI¼Ü@KPïª-eìÛÂ}ùr›Wó{ÚuĽuá®ßdöYÉ7œ[2ûî³ÏîŸoOП¢?Éæ[´þq‡]§—íÝÎè¬Ñ+y™…e¯ÙË¡Á·{Ѧg©‰ß¿9á[ùšì/zƇŸ¯ëê¥40ôÓ‹TU<WµHVCd«ÙÓUU¾Rºš/ÏW“'¬b {¡Áyh'RÖ œ5)i-žµ¶Ðú:ÏÒùo®ï‹3,u'W÷âº6URõ办j®®då0éx´,5›†‹˜Áô»G&<•M"”—nk(lÿ¼Q†K€=Ži¤©fÏ»–hñh¸á¡¦_i@‰×DW…·.pÙUŽ»É÷²€(Oz3o§æ•i2pp.ZC•¿7y=Å{j+Òg’veöΪ·xܪÝÑÔaëñÉíÂ]¬N'¹XV¿ÙñU¯ÚP-ú~ÒÙ{tšýOÚl³4°È/×"Y¶¢I]'÷¤±±¼6I“’¨íZ¥•*½˜?6Aäá.)§„‚Æ[%÷ÌÉ…;Ê=ÍAwQsR»ª×(¹îòÑ=ïÞ{ìݵ¾®êéÎ^NøEï!»·‰PØ· =Kê–Í O úuù ÚöùÛoógÓ—uîUg­3ö©ãÌŸ9œN׶Kß,6o}£h›ø&Éš´¢£áœisÜfÌ' œjÛ¢oŠ±OXlˆ×tÙ|=7Ãs+`¶àææÞgx5=Z¾~üi„ÛvíÞ*W…SvO Ù¸w¾ó¸;ä5ª¦¨9J'îYÞ­§3Ëf–Ër0‘QÑ)¬9UÏ^‹§.¸”2×+oYÎÚšzº*NO³ç©ž¤†ÈOGOMð½-ÒRq®š#¥ž‚"÷ZªM¼E⪑"òbBiˆÀ&ÑnPZ¹ª­©#R Él¬"´R-êZ†Éb&™$·Å4Ì4—¯½Ã™}×dÚ¤V§÷ÕgÚ&|vŽÏÎò=û¤Nõ¢«Á“ÐåhœßkjÚ¬Dl[ß |È~+SHèEð:J^¦¯Á*ö²]”d:²ê»½ïz?Úàþø:?tžÀàŽ“Ô׫ˆ‰ôx¹*­^W§šY@›Æ>5jzä5ß*GM¯ÂÓ­Æ[ ¯2†‹:u< ^ò~µ·Úþ êÙ¯–·‘+º7ààÆÀÌF¨ë5;–HÈÎH6YFºc4’t
+ÌR™ÀÜg/ÈÌ•‰3eÒdÆÊ|å:W±N“«ST&S5d®“1‰>GQµa†²¢éš
+/ð
+øçšÆŽâz²øùò…ÆPKDtt½N/ú(+.Ùî<ßßIþØ€
+C\$lK»í1ÄQ.`9ŒåÑîn0ƒ1šŸA+ÅE?¾÷áÓ-×Ì¿sAá¬,ßcLpzàç<¤1¸°£S)â¡)†ÕeI385${0@Àfs7X¬ì
+V†ˆŸFSc, )ÜÈï§uðüZ¾}Qï§ËBÞ, °ÙÕ +»¢q6q{Ôf"wí
+ÏÈw †å¥‘ú,Òʃ£ø› ^ëU[{tklŒ3}œÇUb#‚a Œ%,KLÜ„ /ñ"Õp±H¼Ð/Ü>`0üa;0\5`xk’¨‡xÁ€Wã…“HWâÅQÆZ㛑Øæ$²E jŒh³ˆÄ
+‹Õ¹¶„XÃV–@µÐ9ÕÈa
+žNˆº†©Ðq• [b‘[@YC—Þ ¬`ì„2_S@<ÃÚ´A\-Ä£s_9ïëE˜ÈKgŒ-gìX˜8ñÆÄÃÓˆ(x¸‚ˆÑˆ :GDéxØ#â(&®!¢à¡!â{˜h¨hìÒø¥ábÝá¢0 ⨰LP¸EƲC†îè8áÃW|ìÑ1W ½ìØGu|\"ÄmprÂÊ1ÀÄ 7{ìL 5g˜¸Ñëÿº¢Þ”©ek] ‰íãaÅKÆ;×D »ò1MŽ+x&š –‰ä¢‚è ]ª»D.™l׈†©+0jEí9‰t@_æ Íc!"
+<Î@e:0À¾ˆµÀ­6J¯àçhÎ@uºPî€v ÔkÍÙB;1 8rÌŽ“â™p1Aø8§ï o˜xÃÄ&þ
+!𳄇Œ¹¿žÁÂõ & ì”ÁRMaó¸
+‰ê™HK¶P5W´Ÿ–/ÎJÖhy£dŽö#…CO!QØsêi¤Ô±Ö,É„?‹0îÚSŠ&6’V0ÍøÛ
+?;É.L/^X;HŠ‰Âⓤæ&f¤ÄY¾Œ–|ăN@œèÕ!IÞI¢Y0tYGD’¶V°4Z¿9·vj§ßºŸâµß§sÕrší„¥°¢Ùû)ßr^9}»éÃéÞØ«^cÅËw•+»ùÄéžÝ=±íž~ËŠ§w_^ÛþÍt?™’]‹f6™‘¼…çÙ:øŸxž­ãÿ¹çÙ:øŸö< yp™ô™tšôšt›ô›tœôœtôtžôžtŸš#JJJJ'J/Š=‘<f)=)])}))½)Ý©æ°¢[ì;Æž±kì;ÇÞ±{ìf=dÙGv’½Ôyô“eOÙUö•eoÙ]ö—fÙeö™F'8Ö$tœ=g×ga³,n—~7 ÓA€ö‰ƒîàåáëT+õŠ½B-ßËõkÙVXÑÔÒ½T+äR§×ÜëX+÷’¯„Þ–n¦ÞÓØ;Ûºë{]ïtë¶í=¯}ÇŠºõ¿”  !aéx˜;*2ò¥Ë…ÔÅàÄ,—Å5·6\ìï`ºF-Æ Ž ïK/zƒÅŠ™ñÒÀw•’¯º[ƒiמ~¥]`Æ£¯yœÛ¬÷jëcâuëƒûgÖG„6ˆì–
+µü¦¶r]j+»ª4ov"t.?v#Wf'n•ü»Pª.FVp²Ã$†àHÙ©§°‘rÊ÷"‚M±¦LGˆó$¢¼R;DŠ½XºIìÍ\±r´q4qbáªyÛZ7±m4mmw ­ D6Wi΀òH}¤@R!)‘Ô˜À72¾–yå0a¤t·‘ãˆóTmÂ0s´˜±eYéC„8à*…Z¨§‘Q¡&ò+gs¹Ëõüµ<Só³%,ŽOT~¦¦}ujµB‚Jènb›„À‚PÕ(¤¤…|¡
+OÁñ"5VD†#f
+Ú@žm*Ìê%½*kt
+[š ‘>åt‡÷’#â[Àƒ.‰õUËJÅ»Œ"óÙ¨Ù-Á6·]3Eê#zFù/¹uQo²Ü« Õ^çSK:µ[:u›òß­ðdÅR ãSu9î’ôJ΋›ŒW^Kw¾æºIrSÝ
+lÑ1
+á £J ”¸­£0HtdVü™Ã€Ñµï¡²Ž{¦Æ—VÜY¨Ëj3»7â/°áO˜p°ÀƆ_3á»y|SÕ7U}SÕ?‡ª"DÄ‹w>ÎäÓ#ïrÜ‹½¢ª¯Y¦ªê ³Õøg ·Qù¶ØŸXëÇ'Ä~´áéœF ‘FPi#Ódª„N­ª¯”: ©¿,Djµâ{ ¹f@x‚Å7‚u•bÆ€$»Íj¡Y'D1H¹P-8M9ƒQ³;ºÍn!mç v¢7AüŽ`×,H¥Ò˜ tÊ
+26f[µAÈ9FþÇ~Ùô¸+Qt߀ÿƒ7f6 Q%qð6¢>³¼Õ[4t#Èbz‘™ÿwXEJ”ew’N0+›H`8±,U{ë¿\P¢#ØÊn×1¼'¥N¬l´ {^ð¸ú fLüêÊLŸ¨ :¨™“‘ž6òsz‚”¡D‘p´§(s”H‚£L’’l" –$Äeš”§¨kLu+W^
+™‡:ñ°'"ò°¡<d"¾ÆD¦"»Kö—ÌŲãB† '.}¦ß‘1ïÈ0+mâcOÇ$Σ|lîS­| q'+10±q³ggÈÔ\0ñ“^ÿêMq.—’f„mÚdWÇãŠGÇ»œ‰ÓaÕPžeÕ–#É:é Ó ŒìöiÑXÄÅxíÓŠ±À¨•iç!r‚Dƒú<ÌÍÐfa¬ë 05C’…œ^F¶†
+úíéàÄ„1L®žÑÀ$+Âpæ–30$âú2ËúÂêrz@(ݺ°ŒyU!€[YQÚ5´/²*Œë=HwHÆÉÒû®0Ï/ãü¬þ}q¾wÖ;ê⨎¥Ff¨ÐÑŒ¦F6P½ž¶T2ÆËeV(uF³#ÚP1÷HÕ[jßÐÅW¨ÆFÜ` ;==jéTC¿jºVá#3éã@7{zÚÒÙ†þÖt™{t ¾4Ñ÷@÷= tààÁâe&-ºzèâ¡k‡.ºrè¡ë÷(ë†.²h¤5C— ]1tÁÐõB— ]-X, »ƒríê‰Ú¢¨’£ Ê‚RZTÓÄyTw&îLÜ™¸3ñML4çOዬ¥ÕcÐÖœßx£§>»êlªGj¿þçéáÃÓû¾þŽ¿Û9Æ6ÿ­¥“½•7OÉ_™¶9Wrä{Þ=V®)ö_Ž¿H
+²‡Æ*å:i¥´VR­T/­˜ŽpêvmÔÔ.šó#>€¨uFø®+§†ïÖ<Þô]åú>~R×z5ój7z~üj:Šªª­ë6N‘–‘*°]ëüîJ1]ü?Lu'£§­y—ÛþÆ~Âå~x\9{}\ñ9nËq•G€‘K6Ó'[ ¤‰©Zð;CÊ œ$Ž–äÑ“@’H¤f"—,¸™!©°Á’YxL9.xprŽŒNF†Œùbdt ¡•Ã"Òàhžôvc£apt ŸFÇ”†Gu ­ŒŸ†…-I,›uœô6Ž” C%z …ˆcE 7†KøL D=â áࢌ›8px|,#Ž8x&Òb%q
+qŒ°óË#‘qÆÞ q’©ŽP: Ìc 49C"iM<mªmfbY–y™HAVŒ^'ñ?†ûj^æ™ ;JÜõ)êºsMŠ¸E¼ç—8àïã=|ç€ÞñË€O½ßŒø¾Ã%~añ ÷à%ž g\tx–þÖt™{d‡šéùˆK @Ñ´¸W5dTlT3”Œ¸ÜÐx¨é`Çá–ÉhØ(œqÂ!ò÷–{Ä9[¸k ¯†ÂŠmkÆaGÈ0›N[hmpâv+v¯’Gˆ ›4 åÚ-ÔµµÄDz€ö²ž:YgùzUÝ™¸3qgâÎÄ71Ñœ?<…/ÂFÞGÖý$ï+yÑ×c·Gw ݇t7¢0\Ñ¥­I7(ݦòn%±5n]iÿš¤çcºø ½÷Òÿ^R­€ '$4’®jåAˆX$‰M’ÜÃJFf#Ó‘ùX A¶…~eD)ù&N®‘Bz-HJ”‘’=%{6 ÃrÅ•Œ#%7©€‰IÒ”2±QQp¡ Nýâr/9ì-»½¦H¬[ïú”rÛ‹6)#kÍ¡“e/ÉßÚÏnßS’¸tµè«j?ì:›õ¯{»u7÷—Ÿ.¼ ÷X»|Íb§7G8x~a®ðUOHŽpÕN×]aç — ¬Ñ²;Px˜PÔ#IäõFDÁÄe¯‡bké×Sn8ÛÞ³íB+\Ѧ­)QPp $L”‚ƒ¬îx¸Ó•†yGC/4¨Ò7­g6µg½gÅãe‰ˆ·™ÈTlúW*Ž“‚+^L‹o¥¢¿5)`B=!rQRqËJoÈî'Fø>&Š”pÈ$Í1”Ù &ƒ†TPɬ 4¸C<–\Äyína¤æVfðôÜÑ銮Žt³£‡–œé™§SŽ:3ÑO/]0t V Þ=•57Ô;ª0V;ÖZ]7VY7VWj+•U§J‹ÕÙ+µ<=ÜrÙ]%‡uúæJnµÌõÔšêmÒùI/®ø“__¿bf‚·†ç²<«ã¹;jà©E *ÕYxLC½,usÔ¯£Žžz¨ðBQ õ¶TÝÁ3s.xzèÉDgÊgè“E Ž®uôΣ’€Z&ú¹PfƒŠ,jrtº£ßž®z?¡8(£ Z¸pÐÑÁˆG§b&”»Ð0ƒ’-Švh»Cåµt?á
+_þpOóëóï_>>~yý'}^>}~ÍŸývþ忯¯ÿzy>JMÛÿzz¸þ¹<Ux–îýGÖ”(Ä馯Kñ–¹é(ÈBŽ¥ UŽ“Èñ¶ GYHR¢}’å*Ê€(÷²Ü„¹Isg!OÊúá
+‘n2E¨²ÞYvš$Ôÿs_-¹‘ëHpÿ€>ÈlâŸ\R”tÿ#Mdð#J¥¶Ûváa0J¸,W•©d222¢·jmVi×Ö°¢ÄWC4®´®4¯´¯4°´p`×FF JU$Õ…RRQ©Ç_züÌaHÂýÕ¶ÀV¼¾g)c«œõ$í‘B7’Â姿fþôWˆb¬XMF!Ñ—fF7RþFù|Hˆ”¦¤a­hT GA}µÞ"¿=äxäpˆå"Í3íÎÆ1!Ì$ò]kÊx¹Ä"9
+{/£D- UE®„ð–"~%,1ì€á0U½×¼
+x5…ç §39ŵfœî°¢ž,Âü ;Ô|&¶™‹n3Üø +ö{ùÌݾoÇï~Ö ó?Êsfú/ûðwû¼¡ú7+A¬é §s-—vßmFçSÖŸó¸XÌH“é0Ò F›ØšÍ‚±—Ñ5ýãÑM¥1ôÜŽî+h&`=Ñ}j1X5 µ¤ãvC?¯hÙ„ã¢Û-:_ƒ°ÁV(hË žˆà æ°`œ(ไ̲að¯àšB à2
+œ#QÑ‘Ñ#H#âa„áj`ÅŽ#;¡éÄ”ÈR'¾&”k-€µó*#Ö)x`¯²â"G=‡ŽªÂN›8+=Ø¿È;à«(Å¢ÅÐzooX¬‰G£”øP+ëÔ³
+–Ü%²3ü’øÜ €Q?ò7'ð7>à×?†;gÁ
+$¤™`ÚÚ>Sì¤o}'ØZÒƒ6O:š SHhotÏ&vÒ- él‚´§¬þòù¯Ãfx}~%èþüªD2Ãg¦;½¾™ðîtÿžðnTö.Â…¢mÔõIùü/g€ç?çk¯ô£u ¦v°K&°ƒ“]. Í„ó”›
+°6€·Ìàž
+¼…ð‰B1MpÁ‡bÈa  ´àÐMtÑÇSÌq…ÙýîYPb“lò)¤˜rZÓ'v
+cm‘‰[†oá–]“mLu Öt—ö˜~‘€ÎBV#3#Ö
+RÏàÀ&ü/û嶣6 EÑ÷‘æ_’‹óhrùÿOêÚÛ± ` }iÕX•*†˜ÄÇ>{­žDmé‹ Û¶b.kâµ"}3Ð=û±£b¸líŠí¹Pĉ.ImuÜïèÀ'úpIÑ•)ðDÊG:u ó{úvK÷n8&[z¡ô=Òᾧ߷ôý†£Ä3²Ý6ÅD.Dò!ÀÊ‹–ìh8raa»LpI$aIÓ“8-ÉÓp4+ŽÇÂ6šÈ¦HFñŒN¬Žü:‘dµ8‹í<›Ï"‰Ì€™±¹RÛ;±}£ÖoU›Z‡Ãj\o„„ŠoõþýŠSsj½UýãšßTýûëR÷7ªþ¤îÔzWù§uYùí ¡Kæ'9mªN:4(¨Ìph»ô‡zìµò£Û?ÙUöˆìx,²ãS‘ýÝ‹5cÆÇ°Gí¯¿çÁŒwб/ãÑŒÏî9žñ'ßUÛçe/ã9œmw=Õ˜½È$•I8
+ÑËœô¿|¡1u®Œ[ÁªkÌâ˜&­™¬VŽ°²óÉr#½é6½! 8ö£?™èf0[uµžo;éj­<•'Xx¤<’ž¬=³[΢æc.T+J‹% ’I„¤B“IGlµZ‰*=š~B_OZ´‰Q°I¢©Eœ$2“gÖ%©ÒÉÑ©‹ŽëÆ-Mj·b:’éûË$ÜX¢¤Q)©”dJ:ݼEf‹¥JZu[Õz«g[ê˜Tô¼!´ª–pÙ
+j(VT£‹p6 !º gp6Õ´hžŠd¯tVK­ì©¬©Vó¼KΫ˜ÄrðšY(Y©¬”W( å´)ee©lY‹ÁëpNRÉ»7gÌRIàE€gk‘ÊŽˆ „e$6g‹eÅ‹H-;–2´’Ë™è]õòl—ÆÚQ–˜ŽÍ™ð^Ù¼’Í–b¡›„|$ì'B™VKgÃ&k7ñIò3аÌ+Ç„úhÛ²™:Ê<çG`ƒ<VÊÁ¢j›±xx‹?èªæî‘”ãky{À5Ì8¿5¦Wƒo?;¿=â~0cüÁ>˜ñZã~>†ãÁŒþ²Óûq§žy…óäg̳d½ÌZ¹)åN'-’충HdÈ,ŽY³,Q,’˜õ0ká¸Ao(:˜E0+`Ñ¿"~Yù²ìeÑËŠP&½+bW¤®è\¹,q£ÁYè<¸mvh!´¤)a´Fe˜Ng žl€ÑX-°Z ®…×l!¶ »1h׊9-ý÷—oœ ÝÂn·Ð[ð-ü€ ÁáÂpxó_2ÿEɼW šrßË ˆ5fâ?¬OÂÜǾåõ,u=ðÙ‘sü™ùþ. éûC ácÿÆÛR¿þJºv¨tÏ]ˆÒ#H¿Q†ÜP8H+G
+äá€õÆsÁ†#y;´±šc,Ôé9Ú#GܨCƒ4èì0g¤Aœ7Ì©
+ètn×u
+endstream endobj 183 0 obj <</Filter[/FlateDecode]/Length 17413>>stream
+H‰ì—mk$ÇÇß/Ìw˜7ß ‹~~0!ÐÝÓclÇä0˜ R„Bn“è΄|ûü«º{wVZ݃ï$ÜÒŽz5=]Õ¿þWUTQG³ÑñOˆ>Ƙð“cÁÏë´K"®I&T2É%›|Š)à'§”JZÒšjYe™u60›}v9ä”éZr͵ˆ"aºØb¦]ñ%ÀbÉ…®¥¬e]Ä¢`f±0¿XZÊB×Z%LW[Mu5ÀR-°ºÊUÃì´[ýêÖ0í~?í~7íÄg¾þ—f1@<¶fŸ1óŒédžÛzÆä³&ÎÛ´«ë3öܵ<c¥fìŸ- ™¸6 \EEXÏôrH!†|pÁtPAáW_ýâ‹Ï>ùèƒ÷Þyë×^yé±b„²ºÅ—]rÑçsÖ§rÒ „´àb³M6XoµÖXm••V °Õ,¦à$»`ü´3ÎXcŒ6ÊH#àª]tÖIG´×N[m´ÖJK-èŠcRTVIE”WNYe”VJI%ä:ípXyˆ{Ñüž°/^°/Í›æÏð¨ùÔ¼j~5ÏØ·iïšÉFøؼl~O›¯ÍÛæïð>ÃãæsóZ!ðüà{ó¾ùß"Ðb0¢Àqè‘h±hÑñ@D¦b‚¨p Ì|q•¦Ý/8!—tB´œÅ¥‰œÂ1J9|Ap諨¤õôÏ^Øf5[1 šîå´»¸ú<³å7m]!Ðó1*-"Ýx#T䉤䛨¬¡O)b†nŒ”Þµy¤8]קÏFëÊØí‹ô½ªû›o®oîo÷oûH¾½»ß±oæ¯~Þï¯_ßÞÌw}hö/¦Ý¹Q¸¬æ|Ãûq”j)öÔ s`3ˆK"‹"±J,[*©±H ½ 2Ê$3åÀ^åªð×´åØx"€È@c$+€‘€Ç
+’4È¡†²ÄŠå·ö‘ÚF´ŒÜ,R£[‹ˆQÌ=$'qc¸”
+y—¨‘Õ{S! ™ÛŠ¶P ÄâѺCÛ³¢XÐOf¤±¤=7?†´"Ü\PÑê"°÷¨©±Ô˜KV±¬˜yÁ2ÞЈ÷:¼Ý`
+«hV+ÖV°Æ„µ¬ØQ[‹æVAX2Y…G~%xࣃ§þ*x &a+bP‰„xïp& Ή¹8Ggªà„%D/¼¯A¼?²‘y_ƒšgÛÈÄieÞÝÈ€²neZ#¢È Ütâȧ³…íÄi@Èq6êipj u8â _˜øÂÄ&>ˆ 3_\ånKÅ¥·HŸ³¸tˆhÐ|#ð6ÜD!A+¸µbÆóôäËiwqõÑæ7ô6*4=õìM3~lû¶|Þ–‘ï/Òwöªîo¾}¸¾¹¿Ý¿í#ùöî~?ƾ™¿úy¿¿~}{3ßõ¡9ªÓîì0û”o8zT˜²çf1Û¿o€íEθ3Ó§†5oÖi™4J¥q¯6¶-«Ú_òl+¡{á{Q¸¸¢ÂŠÊªVTQIõ¸ ¢¡T@–šƒÖ$n
+¨%h "5±—Tµ·£1Œ½°ªTþÕA(?+?b‚F½Î"d†
+¡Q
+å^õ‚ˆ‹",–
+#”ü.Oõ=d,AÎPkAØj]!sX> µÞÊÕïÝ24 "‰Iyuƒª! §W}‡-ï4z
+ÛöyÆò;,ÚAÞ£ŒŸq–pìËoñS «ë²8„qHãÇ!C ‡D‘„L²H™ÄùhRyË!—C0‡dѲ9„“¥ó© b³•€h]ê ¬#CŠQv«31d:§¼á¯xèœ8~–éºdj%£ß>éå½­òa6«¢¡!8# Ÿ2Í'Ëi8/§áKöQNY‚Z_·vÒ,Dî EÔÝ-,G‚û;Þç/¥ÖåA–°Ë†{=ÏÝ^>ô{Š;¾&Nå)“<A PÈø™ß¢ð¨"*‚ŒÊ`!å˜vPwâÌ zpÞsOQUê ýŠ|ðT~?Óõ_›‘’ˆè‰åà ê1‡º *4º2{Á¡¯ÜãJÈ€æN×BHþ%ÓUH‹¡±ØXˆ‰ÂùÆF@h RÓAZ£x¡3 QjI`¤€–
+¿Ý‚­yç< ÆR%Y}\z¥Q3Ñ
+ÒkòÌÁ¹ j&Í}í
+|^jõ¶3|ÑTÐg¤öH„«8ßIf`þéë×l_*Þ:È¥«\Â}«¶wÒ~דÜPLÒÊeÌED:]ˆ@QŸJ8Wÿ {5¤‡'huÂ7‚ý^^ñιM~S.³Ë…Ø'¢;ìB{;øÌ»¾ÅæçÃ-bmÿï YìwøçOÿúÇâúêÛÏŸÿöñãß%}ý)=Ð0Åþüéw?Í?×É÷~÷Œ˜íYˆ ‚M5«c¾¡:
+^<Æ¿®xŒ²b2ÜInÁ“á³Zó']oÚè¨4Í’^‹ý@ºíÙ\gºÌîWg ø¢”W¾wÊS÷B3¼†mª6½6?SÁW
+eš§eƒÑC¯%Çab¿®¦ò°ƒ™ÅªªA@è®IÌ„<s`}æÜŠs[E:cî©á!–`@»½¥µæ ÷‹“ê@Öq7ã/9H9‡½¹·`VœÂm:XJrZN-Š´ð½NΛù¡®Å÷6p’
+bLÊ‘³´L&DÛåΠÙX#nÖa&ÈQË¢[í:é6t¨Ôf Zíó˜nµ÷ðî÷(æíÀ©¬:²À„KÃg9ÌŽ¾,y¥SfË{ã–N
+Õ âEPÕ#gkRp·Xýïf‰BPJó0¦©RÖÀÃÙALã~ÑÊ´R
+J÷Û0[òîǘ
+úè ㉠ÊG{€sì·¨¥Öätén‹¡ñWÕ¡Wড়„†„m¤ËŽcy1÷5Øä]*`Α¿1”´¦ï5G)˜‘I1G-G"FªÑˆÃ=ñR s0v¨Ì‘|e×;’È¿ÖØ—ƒº›C‰™­“DcÞyõ<-øWà³À[ ’˜¯µ-4rp¬„±ylæÑÙ‹“jšÎ,˜‹[Ô
+-™MÎÀα¼ J`-zYÄ”ÖÆÉþ
+‚˜ÁÐk4›(‡~UÞPïXP|·
+Ï+p,°ÑY¬ºîö6í6æÑÂcú‰£ÛäÿÐ]5i“¦ ìJ*ø·žmÝÿ<„ Uß̦Ÿî´Å‹$!Ûì 1€Wíê`_=JV ‚aaÍéøNkY[4z›®'
+ð/[¯>劰d2ÙÜdn-ÀæÏ L
+ßáü-´$Ó~`Ÿ59e3êÜì¦gw÷ê– ¿ö!ü´ˆ)‚ÀÁÒý*ˆíe7póá}$€µ9wä¼¾x– ” {¯:¨õ¥ ŒÐÇfä ]€\/Ha7 Oy¥ìlõN¥§k¿Æ¢ÛRçhm‚“2û¦^Ç=ÂŒtÍNµ¿µ`ÔGËEø¤M%¦|P8%õ÷Zg€Ïmn"ððC–n·›è<>t]¾×qxçÚèÓ×Nb"Ù6ç?aЊ¸Ôèæ0”[ʆ#"È ž,íБ3`ïÊvï,¹çÂÖ*¡ƒlGKíà‘€±ŒDoÊó§–Xsi~š›`÷}åï6Ä\,ûæïÏkß`xõ>Ìw–}ˆc{þŽ-.Ü{”l„A°tk‰Öú]HË'Êq«SF†.>WiwÕ!r ȶvü~¬íàêe<ÿý=ÒJ6k,$7Õ'±i6Ñoá¢ä\7×\¸P€{S‘´*`'éÚÄòìÈ6ÍÎ×ZJQ4éÍ` ñÁATeC—0-
+·Þé+AÜ•ê%~h±ëÚµªÀ«æ*ô“€™Ṽ!›b@z!(›$ÑÒ~ cm¶ÒQ&îèðc;RîŒ+ÞnÀóO|„=½®6e[œÇËOïMy2ÄÕÜóéf«Ø¡«ÆÝh_¿á·°&ãAÆô¾´¬;{>bTO°ýð!|¥ýʈq3è~mä×`Øôám­KFPÖ&¶°Y©~ûšûX…g]6ÊG䲶ËD¤µxc·JÐìVFÞøOrN*,œ/­Q[ˆs‰}.Û›iÄ’FÏ=[˜3
+é‡A¸¼ôÈܺð=ÖÕ1Àg+ñ¹cÊõbl.qjÞ
+Ðï6‹Ô8¬BÞ¡+³¨ÂújzŸ¡Oê.üZÛ””v=Àž{âmw;Âæ9kËÁ«¸Õ˜ËÀa‘MÒÆ“ÃÚ¤³eÜõíà±-Ä5Ûçu„b Î³àxôàDæŒX5Š&ùØá©Bmáâ Ôêä,5U¨NÞ†Gd¤„0#¬JåU¹Ì;†±¯ûœ` _¶p¾Üx´P7é Ö²þmž…RãkG¶:áέ֋(}PÛ<f„ût:]€Úç:ç~)Ü…Æw.io„Ü_%ˆ‚yòsè¡äˈ!:~$#,©¤¥šW…\už5Sš—ªm<9„’°1k“‡ëb;l·ö­ºô#¼@©Ñ€“,>MÆáéÎÕ°xKûÔíà%•žTV}Ë zëµE„Ò…_æ
+ }eæ$=ÒÚϽÚ&%äB·Ï͘êaÐÁ9)Ûpçq#œö.çú_Nhßó°žÉüÁÛ/ÿMÜÐö›q$ƒc²²Ã¤nFõÒR?·˜º# ¹u >c{„5${]¿ëÃiP¯kU’C‚2¬½n„²•5[ƒÝwÀ2èKÎé£k—»>ÇÛêY3‰‘¢4¶v|7R[#Hâ mä*ZÒã
+ÌׯYehF(õ‰À%Ž{Ì)?Õl."Y–­ ¹Ðy;.ñ/ÝÕ×ãÕqCß‘ø¿—H µdÆ3ž?í>¤ÝªUÓTHU!تîÑ"¾}ŽÇÇsovAHh9Ìúz<öñ9Á”È¡9ùá‰5Cê<'Ïj*§—ž%r«y?(×J&²ójyœó GJã¾h®5¬-Ô¤ +ÇêÞh Ä5.;3>g•Ùw»væ ‡Š2\?}NrcØo1Ì3Å«ŸsÀÔŽøœª»
+€E#¤Â°f“TN¿žS«§&sɬš1i#Kôn96ÆFsñ``‹Aî²³Âóõ8™Ë‰+q#~.v4è¯*‡Æ5ÕE°í
+qzâ«À¥5^zsåÜŽµ(;ÄÕb‹o(F_ý¸v¨ƒ‡42¼Çd#‚«½$‹ß%oÿºV¯äxår%o*Iµ$Ó©Æn]ô Ù™×AQaIådtærŠü[7-yG
+Xæ¢FjA4,™{#Ã0]ÌÙ½.G1Öê–&Ù5#@ _2&•F´U3·‘øÅ:=$nwŽÀY*vlçJ2®m–øÞì”üX©×˜zß} ¤©AŸKr0‚I¡‘3 aë ³£FØBü^nq·ÒB^4û½6O¸ƒË9.°ÃL¢Q2›I s ”ì>Õ@ØŪ-Jéì§XN½ë•öp±›]Þ{}KœS€Ö§›P°„V‚«› 4¡^x óI ¡G‰ƒ{Ø1pÙfWiÞS
+¹%!ØZâ%ROåˆSDÀrô͵;M'Á0k‚…Ú¶5Ài«éØ©#¤ºûl³_…lî1Çáaq²Äcf˜¡ˆP]¯¢Å"
+^-}âQ”`­)^LuåâLPL}Ž8;â÷×£x‡»,mïoœMNà
+¼‹0~÷ŠÆ-_AÖî
+^Š°÷RxyÊ.|n‰ñ:² ÍSø
+(W-Õ¯¼½Ñ4U½>³L®è1gÖÌÇ´—µôÐøÃtœƒÒ¢ë—nØN# <lªŒM iY?à9²€%Á‘¢øÌÓù”€Cóåù‡xÆT:[r¹Î›ûx5ýÕh«&9•Ïþbà¸vYB<v‘{‡3x{.ût
+{™dãxœ..ŽŽ° æÞê½ÜdDŽχ÷ÕÎaÔÁkõÕ_?ÿx÷Íû7wïÿwûúã§Ëï {ò§§—¯¿»ûøþöÇË“ïÞ½þpýâ¿×·o±KßýýӇ맗߬S/¾xêÛoxæ÷ö—í4{Ü-ŠžOϬjb› Üì-vYÒõoè;l$ü[l—á‡Û,ÙŠjÝ9"\Ž· ÜÄ‹ß·‹`–_ù…öjG’趹«|‡ íd‹$ø í 8RYpº¡ßÞ ¿Çç*«J£@Ò¨Ó4A°qd,]Ÿ ÚQVÚ-‚3§DýÁ0ÉÀNRð¶Î2ñ`Å\H®”,ßl…EÚ—
+ç$!. C`£Ï´?æf®]]µŽ­6Üÿ —©`X@Ý:I—ÓEÈ·=ý¹qXéAU4–²_Žs>>B@Ó8Õ=%c0\ñ‹ÖAÉA ‡+'¾B ݈‹|ä  ‰, Ç`+-Ò¾t0‘)Á‡A¸¹')sbqѹe€eâ-…?œAd¢(2<´oßðsãÄ6h‰ÈeôuÚ?)ÏÐê{GLÊß½á<ïM)íâtP0…G5¼g>X!Z§óby
+šÂ’m öºíKSûEãÖlð¨8­´mÜdcþ€½el+\Ó˜û8ÚÃøb0ÂÐI5ÛÊ\ÎVvr¦®ït>Æ• ÄS¾h—žè
+曾w¦HëàI!ÌšsÇ´ñõ`…l«˜Æ’‚‚¦±äƒ½²@{« wöÓ{¶â ö‡‚¬s«Â^ós‰¡kæuÔƧÐ÷’ƺ&Ü—Xq8¨ES$®}; taïK}½Ÿ‡U@©¯#—qózXè¢uPr°CR³Oí¾Ñâž—L뙃‚¦±$ƒ½´@ûÒÁDƤ¥#$NŠ§0Œç^ÒFÈ8OW‡E?#ÙõCÏ®`‹p}‡]K2®Øl41ÿ8ñ¦fU–Mß:(_ÁèÀ–ÛEë äà—@p¥|=h!YK6©$M_I8{iö¥ƒê w•h`áVãb̹†Äܳõô,ÄU7ÁÙO·xvûX‡°½w'Ë »,Œ4Ç
+©ën³AS9MÝ…,{]×­Éh#¸s0ÅÑDC›XXÙÛ-YRPÐD–|c°Wæ¬/Lcvy;l½»wñ.ÒSã"b`»íü'ŒkLM3ººÆŠg¶·YR5˳€íI Ĭ´-¦ÏÑ®`H4Ò¼h”ü” ¯}êàUZ^mÚ•ÂÁLbM×Cc½ÆùáHœÅ×U°†íù[KÉ[_˜òúÈ
+}a&
+ÿiqwSºWý±²ë¬0N6[ò™°)r­’¶rêó]QÖ—Zñ8]œžß·ï;ŒLO!õ6ôß?˜i¬©ÆŽõRó®ÿ+Îß~óŠó o98¦ýϯÿáÿÃÿõç?õ¯¿üõë×î½ôß ÿc»œ‰·—ÒªÔ÷Í‚­,ÛÓ”+¶ÛâÅ·ïœ3bÜåœJòc(¿`„¿—'’ÒŸ‡@yí QlÈñî[AÙ–…àˆF
+O8‡Òœö­ƒL³Oì ÄþHÄc}©ÈGCJuðfMlZ?K%ª«‰f
+†n£¬ö¤  ä`"+ŽldqZ^laíŸ9(h"KÂ1ØKsÚ·Ÿ\A‘ÇêU|ÈZÖÉó9& l‰S+ME†(4‘ñræg0@8³ö¤ àIÁÆ­ç÷`Ýwý¼¨ž‚‚¦±äƒ½2§}©ðÁÜ4²ºé>ŠK¬8†|±vI7½5äšáï“(€RûÜ”ŸÁPˆÖi8§  ä`+²Ü%£…B£Éƒg9((9XÂ1ØK ´/>³‚r¼O{MƒT_Ça_x; e _áSÛà£tÐôÍ25=¸ìnÎOÚ
+ÉV8ºù¶ˆci1øM]d¼BŒª@«¾½‚aÊ‹ÖÁƒŸ“ásÊãä´¬QWƒ&üöÒí¥Ãç÷P~JÖ’“„ºˆD¼ÕºôÎö$Ãk$‰Ø‰¦c^¥ŒÏ:J)/NwFà8šIÛYYB3ЗdëÁº”ö-Âú—ß¹þý7/¤ÿ•èZHiáFWѾ¼Â=u²"ƒœêñÆ«œ ¨â{뼞c¨•{7_Á-ª{®Ñ:øXHŽÉEý0-žýœ3=sPP,áJsÚ·æ3×*Ê;•C[ùú¹ñ
+›&¥á7r“•¤v“×e¬=Ê›9÷g0>ÎóŽZ%apœGòúz°B0¢³ýx
+
+šº’o•ë[…O®£p°2Wy—ø¹qx³•EažG´Ä~ê”GmFPÊã¯zWx岞¬ŽIvDŠóÕ•V5Vˆ†/´g
+
+šÂ’o…9í[….£H#Õ¢‹`×5)À„Vª{ÐV¼¥eÈÚѪI\ªî(4‰k›í
+Æ ¯*±Ñ:xRð!SUâÙ¨}=XyùšrH–‚‚Â`ùÆ`¯,ÐÞ*|r­ÜèS¼œTÐXqÂf0†hœÊ5Ÿ¦qÆïÐ4Îy–+˜ÐXª±Ñ:(9ƒâÜM”v‘~å  ‰¬ ‡`/-оtøà2Z¨ã¼÷‹jw‘/ßsä,"ÒݦBGaJP
+,¼~ÐLüÄÍ‹ÖAÉÁ¯BR‰àJ¾ž¬¨¾RÐ4Ö|C°Wæ¬/>³Šò°Â˜/‹×ÔÕUO+žQ—ps¥û\Âcç
+ ©›J]WpG
+¹\´žL\…ÑNy~=HÙ'ù¾e  Xº1Ø sÖ[ƒîƒ8àœõØvTv­!scƒ•ž¥ )¯Ö:(åáÿè´unö’ڞ؃‘?{X¾öóæ´Pm±Axä  I, Ç`/-оtøàFr‚
+b 0~n˜¾iH\jíG5ʽJyT3Ð$VK‚q¿áCŸ¬Ž| CVûúz’¢RiWšÀšnöºí­Á'÷AÃ-ÊéåÔB++œr‰‰²ÎŽ4uc 
+Åí]-ÃÔáœRØK±HîŒòÏ+á¹^:m“ä“RÚ0¨SÚJ}¯JzðdŸ95IO×ÕÌ^‡S)Ô+ÏDÌq™Ë½K6¸AuêlÅy¬ím£]À¡A §å+m-=nÐ<VÁ®ØZSÚÇ'3 Ø[Š’³ÂÕÍeà E9öF¸SЯ«;P;¼/çQ\;´ÞŒAñ–Iì0Z£¦ »1lbµÐšr„›ÿC ¯w~à HxJΨ(ÎP¹Uÿ}æŽ{ RÁ¸êE¡i
+Ñ8#e)l+U[ã–BØ
+Z»ŸNG2
+ÛÏMŒÿÔ„Y©ÈwŒ[Ÿ|§¹¿.ìº6â7·!›‰‚Ÿ¡aÈm…åœç­Dkµ'ro—j¾d®˜PÜãFk kЯ!8–‚Tî+âhÑFÒ¯)4Y°+¶ÖíáÃqÆ’/˜*E3Yð4vÑÊ&הط[–C%ªÉõšo”+&$°¶ÓÈÔdÁáF›Û®£½†ƒ›„‰©Å"×J­/Çy˜ð`Ú9*9 Œ‹ô¶Ã #åÊbp»ø ʘCwò!nHíÍ<:])îw§¸‘ý7S>vz­¬£ùœ ™»¬Õ•ZWŽtwàɼ!É
+C’gpÁ{¹dÚR´ÑQ;·‡]§;PŽ×·âª¯¿£õà­AlUÀ'*¯•s±]»Õd슭5G{øð`ây;öMpCÌdÃUá®L×b®òÆ`Šƒ¶:¿±Qz>Ý?mçŸqì#±ÌãWç¿_qnÚîw4[Y¤+¶fãÑù3A¼9V ±UƒÞ‚»Ç­á}äC—‹ö$Þ ÷†÷¼÷¶×Ï°pî´¼5¨µ‚Ûªçh.¨´Mƒê¯vÅÖš£=|x2èG–ßÙ\<Ž±-¯[«½r~ËYž–8f›êré¿PÜz)­¬A ¯A—1¡ÅósÜ40h.ףط¬´‡Oæ½{Ha¿Z4—¶äÏz õ(É9
+¥EªGØ
+>"\˜çwl°tÙñ™‚¸Û.
+TwÓ|f}ñÈ.)l´²f0A&Qy-´uL¾ÚW 2ƒ
+vÅ®5£=}x.‰Žo]bä§OO“ }b2Fû–)É)º•¨&GÚJ3V©¬@-G·z9RœA ̸þ¾€j0‹uÅ®-#==x0ŒX‡eèrŠ<nKŒlpow²€kËtm,ÁwbP YN±gÜý^6Z§uX`Ø:ÛÂzßó«¬TY¯/¶ÎíîÂsItpÓÕdý¨ÍbÁ1Ü£œv­I¡Ss Z|Å­ïN£Ô@V`T“ÅGHžÚ‹¯ø¸Üëï ȯb}±µåHɤ·‚+pjC\Hâ­á8#”MjàÉco~ÐÜ[Ô¬ãŠ1B¡d£55Øg;]éµÒâôå6 ª¿"Ø[kŽöðáÁLz?–û°Ž˜ËææN–Ã’åb±«“Õe¢­tœ¿¸“È
+Ü Ùc“OJ¼Ó2æöû êï‹XWlm9ÒÃóè­¯Õ&‘­ê2ìq i¦¤(³Ù:,­gj‡5Ë7rŵõ~Ðxk0Å[ã—Îh‡GmT¼[kŽvóáñDzŸ™vqÃþAâµÇKÎõ ƒ #LÎW˜ÏĬ˸&<ߣ÷ÏëŸFvðœËý’_gPÿ^”®÷F{RÒÀgÒèO¥ÑŸ4ýüVá“’»â.|:<ccâèˆ/S{»0vݹ•]zRœŸ¡6L‡\ÖâJŸ]4¼Ñ:p ŸÇDNu2(-ûBZ5È Iûâ䆵О>ènù«b'‹kŽ \èñþ¼í8–»Î0ð4MÇrU{ÍÆ\½½8m-†cX{ÃJë@Ö ö
+>Æq-¬0 ‘±¯TwY¯/¶Î”õtáÉø‰í"&™©#?¼í8v²Øa,·4M»Æ5Û£¢Ùdηb­¬cú‰Wwž>c…iøƒ²JPf½¾Ø3ÚÓ…'Ã'æd’ j3‡N¸9³Åˆ\qÁ’Õ↽Öj1Òe]‹Ç OWZN 6d4•×Â:WãO¯T‹Y¯/¶ÎŒöpáÉô TÏlQê±á|Ds& šåÊqîjêq/¹:P=Æ¢•×b€xh¥u kPÁñ±ƒÐÞKHÝ40È&›`Wl­íéÃäxù9ô”«™,8R …À&·<“ÆWâI†-‘Bs 7xiì°âqIάÐ:5ØU 9ɽËàµðñ\nTE¯+¶ÎŒõpá™:†É6ØBËæ®àxZ±,s”
+‰Ë$î†ÖŠÕ]H [1äõy¦þM{•Iƒ°T&ßGP“ÿw¡
+ȶÍü„Çžb*ÑÜ‹Þô°6ÚúÔÙ¯b~¼/Zc®x“œ¸ÑòÑ>[`LoíZ©Íå84{þ&þSd.©b‹ƒ/t?Öå³èˆNä2IÏ°ä¢
+ïƒK˜Úé"Kgq#µàÿ@ëÀ-:ÜL™Ñ²CfϺõ
+endstream endobj 184 0 obj <</Filter[/FlateDecode]/Length 5796>>stream
+H‰´WKÏ]GÜ[ò8$[‚“y?`eœ "HI„wÈJ ±Äg,Ë,üï©žéžî3'¡\Ž¯ëvêV×Ìô#çГ?Þ¼}þì75¦ûÑr §w9O;ûrèΚZž`w-˜ûÙRˆüa0ävöˆº·Ó÷^¯´d ‹Ap¼§ãJëÎè|Û408Œ` 6©)íÝ0üíù3w–šjé‡;Swe|¾•ð„9$|ˆ-EORMÙãïâsiŘR*“ܹ +Ü¢÷ì1ÈËt(;±¸§Ücú‚‡„¶³¤’¯œÐ9sBÈÅJ!u …%W .E¬›´”öfÁ²7yÜ°‚ðÁ×P !ÎÅT‡ñø“Sv¾†­¡fã¬s)Íßj½%µVðpB\fks-|ù\Ï•A‡“7à27Ÿ¯Á
+Ô†î¨Nô˸ð1Å਄„Š›?êM§‹Nbž
+º‚bËßR\¹†–³•Z7NÇÏ/wÕyÌp’ºÖ·ßgPÝe­l²2ÓãfÀòÖ•˜éJæŽéŽ!ºpo£Yb:
+ô!\W*‰F;ò?_6ÁL‹MáÙÖ—µ¥ƒpÈR"2ÕžùÀi_˜ùÕг—ÁXê\q‘\Ýhd ‹Ap˜ÑÅbay·MƒËbÑ«Á&³Åzwá{ È]2ËQ¡zºã•Kh_ i<ãj/Í·¦'×Ðcc»†Vúíz¥´˜­ŸŠ{zyR„”Êb.›
+²½ÿ OxªÇ•-?ö]ƒê¯—v¸‚mÊ‹öæÃ#AªT1¯U×uYq *¢/fÇól©Yh§Â¤àrõ)ß‚cñm£µàаÇÍ‚êãJÖÞa4»¤Á&XS3´7¹
+Òi'ÙT14uYpHiRˆešG¿õQ4»Ö’—E­¯æ,Á(™qm‚̪+XŠgLhÇ•e´U¿I`py¬Û‡ Ö„íÍ…G.‚¤õœ¯–w]=V<× *àù¥×ÄH ¸2ôÉû{°“=ÎÐ*84(ÃÂ[ªR³”¶—›‚nj±Š]š”!Üøö@¼úøÜ#Úuìv{ÚqLyŒj‘fV/ ȸұâvh N+—ÀŒ[ê6>Å.[ Áéæ¶qs 'åè·_ŸÿÿªSC5ÃyKž/þôü—-‚ Ç{à‡G’ÔYÁ#í
+ß_ Žy%d¹°Ú]èqSÀ ÌrM°¦eho<f%oÉAÛ²V nZ]ÈE`š•ÜpÀÙ€ËÝP{Û‚qýè]i-84è`\çACë‘êÜŒ—¿"Økj†öæÃ#WBkh÷œãfÓBñ@E\z]ðŽ“’’4š–J0àr95ÆÓò­‚¬a1(^üÏ„Í*¤°i`P]fÁ&ئ¼ho><r%åªò+ë®uYð ó@;= †ìQ”{„=(pyTš·àÔrÛhd æœ/EÚ«°R% u“Àà2Yôš`›±°Þ\˜ó6òÅðrâ-£F?‹à¹¹àe¥(§S«UpÙÔÖÔk‚±>”Ö‚$a(\q*Ç•õrÅEƒj4ë½\\ÍlÑî.¬ÝðWýêÕ§Ï_¿ÿáóû~xûéËñ[Â^üñåñÕ·Ÿ?½ÿð÷ãÅ·?½ýøî÷ÿx÷áÇ?¿ýüÓw_>¾{yüzD½úQøšc~Gÿù¯+è÷?ƒ9»“þâ«pÛI;žG”½pÜÒ§ÇÄèÜð¯7¼ä:N cTñTˆQ6±²µnÀq,(Péâ58`”ok´d ¯pm3ÿfÇ“8Ôò–æÏÕZïÚ8µ9šÉEçŽZæc»ÐZÐjûß¾w‰”4Z¥è«Ô1†¢=-CÐw€gôŽb=Óñ4Fy7ÓÖf:˜Ó¸ì A›`Ä o%Ó ![^ÆXJ2æ":çÞgGÈ”cŸ†dJ¿…³LMüo7Ëk)ó´;M‹~úíftªNÏ5¼Ñ×iœ°cAshï³QL°äDæU¿V¸^ ¡ø Ž—ùZJ)¤¡RCÏlOîc%¤3¬nÍÕЕ™ïÕ‘ŽmVÜLˆ¬—äDɾO'µ³éÎ`€ál~Úãɾqa°÷z—)»Q8p¡Õy #8ÁKvý~ø¯ù^P‚aÎ<8g¨—Õ ":ñC`ë|sÿf¿lzÛÖ•0¼?ÀùÞ8‹¦‘»IoVqÜšÔiqw-"¶4©C‘ŽÝ_©'rrMÒ¤\!hcØ#‡gæyË“|ð
+sf.ß+¼Õp!Ý]¾ùûýâ›Ín0©öy–Æ¡HivC}³×v¿g—qxP ;SmÞ‡AÙQã¼£3«›«xV—Ãþa™R3ß7½j.cxä—Ù3Š_)nïý ÏÞ ¬J³oõã{ýaþæÁ; 2­ºkÓý¢Ñ3í;ôK:0.¯€ ËšzßÏM’¹˜™ 6W{äå¼&ÉýþQQÂæú›<ä;v™Óoy9œÖ$íóff|¨Èö›“OG³<IÆFùHž¿;ÌÞ]~eæƒ2#bo¯|7”W?ùû¯‹$ÿÌ÷Š§ß&g”™¯úû¯ý»×ÙdÚÿïùç Bþz{h=ñÑqïŸÕ‚qóáž9 ¤s­ Íç“™}’<Œ bÊB <è÷ö?quÿaöŸÚŒÀ|Ï{S™Õ %aºŒŠÞĪ&Ž“EfN° |ë4Î- UŒ )ãlÁ`PVŒ•ÛkÂÚÂɧ٠Kb2ó›Qhˆ`É‚lÁˆùwÔHhš3ŽD]ùT˜¢\»¾rªRÜVô[Škš¨´œkãh¾â©Æk¹ûrk@Í(RÍ0"¿ ´&*ï¼a3Îœ¤p&á_m‰‘˜ñ¶à¸˜*ª‚ºñTLó¸kÊ
+ŒH@%êvÕ*Î}¨e=:‹D¤õnÁm@Œ…D:² ‡w±˜†ÿa±ß1y¨ãÜbðÝÎÆáÀö™H’Ä4عøŒ ïüLdT]Zk¤Ú8‰¤*^€ÂÔÚ=1®ÍVE)¨Óu){¡ØLè9ÈÈn²•Û^Av3¯z
+›' LB÷ÇõŽM^¦ß&gù3.ê†?ðÞ4Wh ô&Æ̸M µµÐÇàÜÒPÅš2ÎÌÞÁ²Bp¬,2 êk€XÛƒ8ù4;‚$ÀÏ:é©êyˆÑóИ‡@„æ¡9ãHÔÕÐ#ÕûÊ©Jp[ÑÈ©åœ2¾«3)Õ埄Tcndh×kž°$&;à41 ®7!‚¡5Ö2¤ŒÔú®–ÛÊs!“X0qƒRÚÝ’±]¯ùˆ‚¡¯N¼~Ý=4§%Ę‡Ð¢{Àô»óšåï‚h! ^¢Z6ü2ŠR@œ×ÁæŽ$ a‚¦õ-žkLËÝ×;[aî÷:bat¿×1[o[6³ÃÏI
+gþÕÀÌH|o‹‹©¢*ˆ›Ó<îš2À8•­h[pÃf*®—F—(¨j°åÁs­å\3S;Uvpø ê- 3rʸnæ¼öÌáuAÛ}‹ˆ²rt" Z3:OšYÖ§1áØJHÕãGlñ}iæ[=Ÿïñ#–§Í˜¦ #,€«s’´rä,ˆùºÕŽ8¯·ùé=zéo½lÎ_bÖŸM ËÊèþ¨ìÂŒB@¼dFÙÔ¸SÁ„<J$ÜÖ7Ta9ßËæ~w Z³Á!ìMªÂ1,)É΃1l[áÈ®w­Û" ð³nO¨ê
+e q'E˜Ã9Ž¤X`8ò0[ˆ¾S³Û ‹ u›X"Ô‘GÙ 얬(FÞ‘H!,"­íÜœ9Ü flg ¡Ø¨»?~‘4Â=ˆ·É(R×(¼€°àܼ… »µÅGLz¡Q¨tU‚maIH 0daH]¢¸îB­: Â镈·¯u‚&D§)%|Ä0“ÃAs³w„˜ŠkÌP\[ô;`ÐÄ®è¼AÃ@¼Ä Ù™.£(ÄylîH’@v!hŠ˜
+&äùS"ᶾ¡
+ËùîîBw Z³Á!ìMªÂ1,)É΃1l[á–»~BtšRÂGL#6³_O‚sªi¸g¨†Í\žƒ¼ì[©ßó.Žd‚ü©‰xÕSØ<e
+ò¾?†¨wlò2ý69ËŸqQ²O>ÍÆ”3ŒzƲÔÆù…¸IBª1þvhkÕš
+-˜H’Ä4Øe>Ì«´D$ ‰ˆ­„ÚV!“Ø8Æ›u§k¿]×Þwº†¸‚N×:]ët­ºöQšwºu­[×\–5ÈŠ´SµNÕž§jݲÖ-kªuª¶+ª6!:M)á#¦ålЉâ
+RŽaIIvÄel‡[n¢jº»6z¥6:ìÚq]umô°®è
+Ø#ë™ÿ{{È
+ÐÐë ½fŽ"‹_
+Kø•S…g,£[ªb‰XÄ +Ã] ³—qß«K[…$Ä(ae‹ƒ°[²F HH‘
+c_7‘¶0™™Ã Ê·–qÖª¬ç÷½ž?4ÿ{=óïؼ6¿Í½fÊü%F^6¶8)!¢FÝò !¢Æ¨ÖªÄÚBkšd²»¿|‘#4Ò=ˆ·E˜&ŒrDâ‚só‚ì>Ô$z¡©­Û­tU‚ma™†`$À…!U´v\oqÝ…Zu „Ó*Oß½•´L…–œ°$&ˆ3¸lN­y½l“UÁa˜uG3ä^”ÚÂ9lfIU8†%%ÙyDÛáV›?‚ ÑiJ ÕgÍm @vëÍ_HÙD’$¦†§êÛ#
+Ä"©ÙM/u]Ÿ·Qj+©#D ̪}jYN7éj¥
+xÍIù1@¤# ²æZ ˜®ÿa±é1y¨ãÜbðÝÎÆá -âÛ’éˆ^ô[5åÖšáH$Uñf…ù£‡$µûÌ¢}Ž¨ØÌé9ÈÈ.•ÓW=…ÍP¦
+ÏXF#uƵZ–°Ë:iؾ†»ö?âË aˆ¢Wñ¡Û®·ºñcu`š–’ ÞÞÒjI„Ø¿f×Ńò2ÉÌÅlmjeËL\BBÁL©yÐP™Y¤Œn ©¶º:ƒÆú›Sí–mcviÁÎ9"-åj¹qpþÊ¡žA‹Û7xŠè9e¬–ÚÖôÊÌÖ?Ÿf…M»/^ËP8xªU#Ó³$öEÒ Õ’
+}
+endstream endobj 185 0 obj <</Filter[/FlateDecode]/Length 4444>>stream
+H‰ì—_oܶÅß ô;ø¥@ Ô±×ŽÓ ûd{k#€cØ´÷¾\‘Z1á’
+EúO>ý•´»¶d_ZÇNÝ¡¶z âõ‘—?ÍpÎgåÌ;Qü²õë?ìZËn¶ÞýøÃxëçë…Ò†‹í$“Š[¡kÅÞÖÎ{íî~YýãnrQÿòç™òö—­©³RÏÛ¢K¦üJ%y@£Ùb))¿½U'úóòWÕ™v&2qÒhfï‘9÷ÏcXQxå
+ç·n–Âñ‰¸”¬:@Ô–ÿú}‡=vøΓ§â”ù¢L…«Ö8ûãEˆ¸Ý$R©éÚŒË4õ…Ø€û“ôfŒºYVÐÇFŽiêÁÓ- 0M˜
+•õa¹Vj*ª¡”¹êFSrž¹R°e€ øà*ÀÀ—¼MY"кµå /ÅfV,Ì%0|R©ðN–2²«yP
+*¹`nݳ†–
+ ²´Þíן׈÷ôt˜Z0
+ñø»§Éow’|“ ï2¤"k%U›½p„*ªN
+ÞMEœ&Õýè6ºn¸ÂÛ´4Ëi™FlË£[5ìï×ys4Ò!¼e}Úc£ëqýÀ»G@§‰m¨Z±0ÁÜÖ´©ð^–2ºní° -„œrdêŠÝ
+á:z ¤IöM.¼ËŠ¬•¤“¯›H†V»&L%¢âx”E¨ò§ê4
+Ü|j!]pî†1¹°Ì³gçNJ<™ŽÍ"7Exˆ{
+ÊÔ!½û
+n´Û¥ý⢜ƒ—USÜÓ±oÅÂ\¿´8…9¡Šüf¦Ö,’ZFGò`±`CGqºD î̼TQa0uÅn
+@¹0®ãF¥Ü& ÂáûOwýiðŽØ§#2³Ï"qGÆk^žñÈ„zèÁÐû³Ü¸B‹d®¥-#¶ÁèºbYãí,Ÿê|-·œ ¨ÅŠÂ+dÒ¯…d“åÕîA7ÎŒâÄŠ¯¾,$2gîéé6É©“. yT°¨u¥ÈÅl©©àÞvSi¿¸H»„ šbâ|Úó]Ã67lsÃ67ls±à Û\L½Úæ€9ls›°Í¥–•QY ûÜÿ…¡ßç^ë\×9 lÃ:ñ„Ö¹aÖ¹8×¹ƒÍZç œž¬sÛ£ Xè0ˆøWºÿÃç–!“uØç6aŸ[f‚SËòL&qfʇ\«O½‹aôf'V›Âñ‰¸”¬:´±5åÄí”ù¢L…«÷‚Ô‡#æÅ Ý a@R'ŒàôŠ}›4-Dh.õi /Aªkm?TyÆ^f(S¯‹ÇŠ÷ØJUW·£Œ}7S,ù2ÞZ~dr–Hwón÷ä<7J@–Së¨z±ÆÜ€;rôíT×Ë[„6V?\çiÃZê=ˆj«È7WÇrûÿ)G% ^‘ŒÉ…e.XË&Δx¶›En
+¯}2¶B¯’±CX9€äl j¦Ðk$”'w˘…¶ÞåÇ‘«³ððàB5!°ÚChŒ‘çp(ˆµt2ÅP|‹åó€ ûpÛ”l(Çɺ„w[ÊŦ8Ђ¬£ÕRgu2u¾‚N ~WBÒ–Ê5
+¯›h m
+^íÊOÃŒF¶µ á:FqðEK
+endstream endobj 186 0 obj <</Filter[/FlateDecode]/Length 17759>>stream
+H‰lWÉŽ7¼?àýCm.p'óÚ=ðÉ€OÆèªiy;H‡Áøÿ'r#‹õlKr+œE&s‰Œ<Fíí %?öVó™j¬°z|<;”Oª$få,¥eÆÒIÔôÛz¶ª‚¡•y@;¥Âx<ãhUŒûÙSL †3×^ ¤ÑÀFgn=ù ãL-³qgNý„ZøØÖÏ
+˜ZËŠ J[>ô¢x93n>L&
+€kñÙ¡XjÛqüÈvb¨Á‘æI@8ࡘxMzW=S!v€“4* ߥ$–Ißg'4ä)4Å+§WA÷`𨆴0ûù*µí¦9”Ú6Fïg.šW 1×P(nŒÕ&¯EI˜«¾+ 0L\\ýÚ HsMífœÏˆ€˜G40#?zu²€·+.w0Xµ¬-bQmÚ
+~l\ÈŠ«ØÑ‚ÞõëúóóñöŸç#úïÛŸÏG<¾ûõÛ·Ï_ûrüñßÏ_þúíÛÿŽXèû# Åÿ—JÌöù,=# Q¾Ö?ßþx>JåðüýGÿ‹æ+¥¡µ9*îûú|üÎ÷¿½=??àw8Ã
+p&¢«Ù¦F4f;>}Þ_Úþ×ñÕÁÐQûjäb—”Qc³Ø'Ï . ‹^=3INŸh4£ ]u4Ë}ÉBMé+ö¨Æ˜ÈðX†•u)V€m”6ë/ô h'Äý~7øQÑyA_€h9f+“›ž€´Nf<ºuQGÕÕ¡ÏJJ„Ü„¥]°wob0L»›–¬O@TH+`ÒnF›T”Ì°ˆµbÞ‚Gj¶È¤ ã€'w96£GÁðïNd#éÓ_<™Œ†ÇIæ ÂNÒlĵ‹²±’·Ð ³í7lå*0v£TÞç”S‹þ
+Ph'™ÀÁJ>PrÖª4´ÜÅóÆ]
+‡ÈmI8v ½-ù©…dÈŒ¢$?]AØldLßN6Q*g`œÂÓ/é±(z ~H£6î¹ #ë°F¥„Zm0wÜ sp˜.`y0—uS
+±æ<¯' Ò—3†#«^ˆÚ—þ¨Hª lJH
+VÍ\‹2|X-ðœywePy‰
+)åc–x3¹
+ávS=9j‰ ;‹°z?)•· ‹‚(Â4'D0}‘Òì ›%,Š©€9q8,9íÓ Ê ¯~X£ Ê@ó:ñxà¿
+ƒy3i¯.3pÅ(=ùi$§ULËÕäWè– ²†Ý”^º½†Z¢——ï¸nX0$¯*(ÀÔ½D *9•›1º+ªñJ*Ø•Ö_*
+0ó xq%Qf‘¨ZIIú…75Oâ,(—2B]uä’8)±lÅUy2¾J§´I/-Ùeºj›µÛ«ú3pLÏýf<Û«róÞŠŒ1-OÛcµµ 9qsËÚWéìÂôYC[&pPS9
+ ‡8^.eeGßä-"ù~â/‘•#ö—g÷è“LpÝOxí)¡mÁܶ¦wÀ¢ñn¦©÷á¹¾øaðÇ—ÄC‹ÅîÞz•
+¹ æ^Š‹y–¯W*«×Y¾^Óºo¼7@«Ø3‹L¢Ù,8ðL¤²Î›Š¹po@àI){ukÃsBˆ{__AÀš<q=q2Š^/T¹ÑÏÅÕIU—'9Öó…þÒò¾Nþ4ª¼u‘ªf@'öÆÀ+]B×Ùsh‰½»TŽ›m
+HÉTÚG†ÔVëÛlá2„ª¼!®ØÜwS)íTöÑ&}úËÔ¦É7ãÙ]kº®NÜ'ñjÛËØž½m³}ÿ﯊àççã÷çã‡_Ÿü
+G8>}y>ÚñÝ÷ǧÿ3ö·ü
+,/Âñ‹«æDÂðµ$$ñë\HxÉ’‚,1(£¼r-Zº¹Ål`Ö™Œ:ÜÀJÒÐÈ$l†x‹vScùž³åû"”²ª*ä;Ƈª˜B4¼–îÆY„Aó
+¼<dU£cVÒê,üjÙ(-›¥ª±¥4ÓœÕS4U¢1̃Æt"Ô„¸W½ UÝŠ.:èêfíO'–Ž¢ E_ ·(e‚a`Õ¾
+º†¨å?Œ€Ìü-·²ÎDOšqá•C¶¢’s3”ÅA¸õÃÛ¤!>T¬
+•E"”owÙÜtU4Çþ8dOš¤×ÀÃCV¢Ê±'´Ôådû‡ ¢Ò¿dªÎ¨\9#ï^ EçÃyd|9u[´|¯C­EÍ9mÕÜÙu‘]p¡q£‹ŠŽ9€qè^'¤SÛü˜Ó;Hx®Æ¨€îÆ)GÔ¤ÀÅäµ
+‰¥&´ t\ZÖ~pœèLŒË|!˜€Éù™=/?||ùÂ.¯¼¿¿¼»¾Zn/¯n¯ï?-ùd9¥=¢sЧ$j1_ d+ÈÍ.$-äçáwà»1᧞Ü)r; kœZ4“\¤2¶%…•,|NŠË”†¥Ñ&æ ¤… BÏ}½‰–jŸÈ„ê–Ãñï~ëá/kÑ„ÞÌ}éH:¬¯^}x{öøéÝíñÓíÃýåãÓò%ÅÌòö=jøúì½5Ëñáî÷‡?ÿþrùûõr÷pu}²üƒŽ}E?^¾pZF(µ§çUÜÿã[êÿ¼o{ð]üáëû«žî>>üÖ‡ë›Ûûz}¸¼º¹^@=Ëw—÷7×'/ÍrF¯¸ø<Äæwôc~ä7øíWÄ>/aùvùég³\á“ß 5Ââxæýh¸EcÚÈ´A“´p.󇿠pvÅ÷p¦Áàã@€O¾Å©•‘Õ¦'s.ƒ„¿œ88l@ ¯PE¼`±Á+ø¼³ø¤³¸;Zå ««Y•€Žø ÛT
+yžXv©ƒyyEn_
+ãDP>ß ðÎ7u'CéZ“‚}@ú¹‡‚<m{
+‡K¡W›vub˜[&¾ŸÇÎðLþsæð‡E8r~)ÌÜV’3Ƕ•äéO¼²zÑWG×ýY]=÷“SIuÛÿUêŒܸ}ê¯QFcOgT’Á‹ <ŠCAú®îú£8?B6:*‡_ž'gëÊÉ‚ýRCI`g(”LÚ,Ž—iÞ±³§iäïÓö‡ÈÄ*x¢ÇcK5v~Ãì~Aó ¿7ðE1Ùhùú7N7Ð/%`*ýÓÄRçUÈé\\N`3Ðý:È´ÐT’p1„Qä'‹Öb½¤É:=Ïz@[
+ Ϲ-”TWò3lTYy)½1%×qµ‘½q㛌U+ñ•.€†qA²a0H•reI¦-&-(–K Î ì,Ç®5JÖx­e‘®ë¾'h;ù<^˜s/ü§|D)L†xµ_¤ëKÊBШC‡)Nù¨äaa@³¥ÐËñ&Sc·*¨²uŠÂ?ºUè`Š“Ø­e@§z~â†^ÑE†7F‰˜k¬`Á©"D‡ks‡”'d¬DFˆY!Ë-×8>]ŒªeFÈŠ
+«!`è¤Ý̲Ae?a€çàö1@bc–yrÏÅÈ=gÞòÉrŠo)žÔì`ë àf¹ûvçÝ` í̾­¢úËiØð4cŽ¨-ñ
+ñئ»D£ñj%ÌOdUJ±€,A—™Ö[P/Àx%·= kÖSˆì!Äà¼Õ þÛv
+:In 8¼˜•8Ä~ÕþUo¾”Ü® PˆÚ<íÀ5ñþ€®2ÞHɱ÷ïalFVjröÓ‹,¡zŽ
+Ë´LœÈ á|áIEÙ qyzš“:¾Šéj7
+)+”Þ’fH°ˆÂÿÏ©Ñö½-D—|ýÙ®:Óˆð›!L¨’‹cŒ@c\€aî¸ÍÓV"P GxÕŸ3Â5 ]t
+\Έ‘­’Â`ÊúS0ÝÂ@o†™‚Ú‡Ét!%Gnÿ&Óp~ÃwÀ¨ AüêÁ<T½˜ç\µ=»+~„+ȹ?-ÆuÚ2¯á3Á((ÙÎ@ûWЦÝ"ƒ•Ü´b²ÎŠç®`Ì]ûp<éy)œÛ%;Õ`öHß ÝùpWPâ´´TÐP„¼ºñNŽ‚ 5›¶5ND8÷9–VÕ>öFD 1‰?‹Gfß éc3ÁNñ@(¶<—“qó•%ùLÜK-m×ï’„3&¿°Ë²Ž¹6@®'%‰³aSPz³µÔ²›‚B.SeHÙ`ê}ô«×f¦€'XUFñ HÉwÀ/31fïP’…ËÑʈó&3
+½æ£°¬Xg¾Õ‚ ÄÜ;‡´ .ß¾DH^2·[±`¬aTÞ`Ür… ²øŠW«
+§ZÈ$;oiÑK¢Ù"D áDs’(–O"%dŽ^é’7JÍ[èàYëþÛ]rU=÷‹;§Ã6ž' a?ïàx€Û/ì×Úæâx×yÜ)š žÅçø蘜¹WoÅ
+Q½AlÓ\» 63l±úãš-±bµÝsxÙ¶=²jñ×l‹lóÂm4"—b2ûÃÑ%/.n´’1©Ç®z”€òš’—Ëø6C¾ý°’$…Ë<oæ§Ý9ü¼aÉ7]î}×^ºîH›ïø°¹óÈ›eT²)ùŽ0›¿ÏÅÁôG2Ú²pÇ(Ñq¤Gæµ)OéL¤©I¸¢œèX‘³íÜ'zw¥Ã§‰ßþýý-?þö2³%Ll›YIÏD¹ú#NeN¾ÕŸË§×bGË“d"×:ªâò|yX+†Öy˜= ÝÆbÉ5\‹Ùj)½,5wƒî7lbýõ3¿¥™ÅOÛ†©â
+” 0ņ@GŠ0èÕØMµ…c¢é„5›ZDÚ*Æ=ËÀ`R…þŒ#€Â.L7‡`߸+ £)’c uõÈEk³:=åè/e[ÜÜVQkOѧ½„iì9”ÎvêŸëÂwJUlm\ >žL§âúOaÞ8¾½gêóq½*Š«(¸v  ö­Õ¶›˜ø#bÖnâäÓˆéÞÄ–6SßsäŽr”5†íáB±ôWÇĵp\6²{éžm`æÓgÅÍ0$Òx.x±ñ\õ†"×Z‹0n»ùÑ¢C à– §iÞ~{jœ±%8 ¶þ؇í~r³{|”³Ažt­èö¾É‘D®k“Zk^·0…<Ù<aÙc^aj¿;ʠץ椗2ùñÖ¢üÒx8±L~ZŸãðš' rk<¯áãaŽñõIÅïzŒ¯Ï4<nß0zÇ~¥`Á†?”%Ò âMÉ,á@Ô‹RöFëÀuRÊ7®Ï¢?ÀQ
+ž8w FÑχÍÚf5¨ê¸Ò aØ×ú+ûô=øÓ¨òxÔMªÚÙôfàÝ.¡ëê=´ÆÄ.S rs©€ŒL_·dÈl º´…Ç°Q}–!žØJ÷RíÒni$zÑAM}ZèÚ꺑x+ñ†í!ÛmÓöKþ?^Áïo¿½¿}÷Óûþ¤Gz|þåým<¾ùöñùŸ_¯ý%Û‹ôø‡ JN2O
+‡¤F㬳‘ld:+Í ÁYKMª&»4IüäKÈù¤.…°ÀC$§þš9lê²raÿšu®›®³™:ë즔B0¾­†
+Ü¡¢;”¦ºŽK¤¡—ÀÑ“ƒ¬1ƒA+b¼Q¬­“_bˆåã*Âe7]iYÞ²¸þ¥1B8ïòßWõšô¸b虿%&`þ›‘,䵊ï
+ 2ÊçÒÌd§R]A«¦!r—Û<†-¨´‚>«%ÆiqôRâÜ•¨Ü‹9O•à -âi™ÑŸ ‘ñKXÏ\³ÖˆÇäyÖj‹}BD†©Å/î~Ñ€×Åò¨Z\DVÌ”,W@ýªï€wMÉ"dµ™Øýqzr%IšÿŇLÜpö‡„ª:Nú^40Q§I8(JáçEÝŒðîÅàµzç¶x›‘«Áï@Í•õ8.Ø‹»ÌÓݯÀ•g»Ÿ EŒëqQD«óK'ˆÓdy^œ\—ŽŽ1 ûÀà›?…W¹È©,M²ä
+#éÉÕDœ‹9{£ÐaÞ@ùQ ÀfÅCµ(à°£* ¡“)^åf
+PØ5` (‚µ´UÕHr Èpüï{8$ï̽»rU×6dÍÙY‡CÖõf*"Íw}Wjiyn
+'h<L̨’ 7}æmLÉÀÅ©ϹP’÷2‰zV-ã0‘"Èεn‹ühâ™A&j «ˆèÑK}!gbËØŠWÏF ¸jåû­Åµ³ð AÈÜ*JÞ†èeri2ƒ¯eA
+ÿD`ûUÉÁ9(ÏM¬üÔÍ£.É<¥‡CÔßzs“š²^ñÑF7_0ÚC<X~l~$ze”1‡$!ѪÎT:¥™B†é)‚ƒJÆ­ˆÄ²Þ3niÈä‹Ûø†æ
+Roü”3ƒ!àý¶úIJ9Ÿ ˜Z‹˜PV›¢rñœ#¨§¨$!É&ö óL]0<윢¤ƒv¬ÎpCï@lP¸vÙeÈ\C=hIÀ2}•Í¥$½å@¬ž…’áv°U ¹Tiv†HžÁ„ ²Å„<}̯#BT‘—r¦Qhñ<+{HÉn¡ÏÐÒvó\%)'ovó³=[FÛÌwêŒÖ´TIò4ÖVDPçPAÚsMnú¯ióêô¹©oˆóQ½PƒŽÍR¥òÌPÆC€4²I{Mç'!„¶j ˆa””j X'`{ÒEÛ¼M£ -pÍ“k 5Ñæë–ÒƒzË<… :% àhZæ'»”?Éñ8Ô-Ø$›­ËrZµ7€ ±XL+ Yu5kß7Z]ØL-BÜe-@•ƒj˜Ž>å×e;ND-Ѭí1²m
+Cß°üLÙ‰À”„‡Í®èœ§»)+mzó°é&I™`GÓ%x’åTF%¢“"/‚&¼ÓÑ°1*w{Ræ \KÏaP ³>¨ÞX¯-¸+MÛc³³Ìå¤á!g©«§gÙ>ð4šHD럯K·[‰:ˆÔÚú@KsÚV-¸bdsŽµˆ…àÚ³ª¡ãðµÙ‚ñÓIËFiYcÓ2JÉr”7‚,BÊëÝÙzÊX;ìæty¬íÍö‡X¶¿˜/Àpêi‘[¿û||Ï7?¿xywÿêêüþêÃíîîóôGÂþD?NžTÝøÍˬùù»Û‹7ŸoÞ¸V`³¿¼ºUèéf÷Û/ûûg'fzIg½ûÔ’öÛô¯${ ^Ô@7†Vðíã(@§ÕXé øòŽ¾`Îÿˆßþ ìÓ¦Ÿ¦¿ÿÃL8ëÝk¦ˆZÓDm@’š$5A8ÔåHO'ó‰K™
+% õ¬÷Ê~)‡œ%‹´2ÅÏf½ì}XIÑñ¼3G ˜Í ¾‰e{êY Q#¨x÷3öú;·d_áw<“$xŪãGÖœ¢¡ãf £h±V¹b|VúEldì\u£Mõ [í1›vuþV—ÀÏ¡ùž­q¨6—ã´8 wl›Ž)Ø…_bÜŽ™ k¶ÇCÆÅ'˜mdîXs€ûÅ1£iœs„0ù&Ù83#Aüz«;fÓ­Îßê÷^sÀû­ûaC|ºcË`öKŒ›ã1³qíÃöxÈæ`–ÅlÊ:˜Ü/ÐrÛí*4'ñÆ1˜ÅCÅ°>ë[Ý1›nu>;Üáe0¼ßº6ħ;¶ f¿Ä¸93×>l‡lfM§Ñ¹ƒ2à~ñJV²[D˜‘c0k@sOe¹Õ³éWçÏÚAàe0¼ßº6ħ;¶ f¿Ä¸93›Ö>l‡Œƒùí[M#PIScØ¢é‰yÖ⢠F®Y™ó¤TP–á–@,štÊF¢]`rt°èx ®<êu³ªÁÎ\òÁ‘HJÔ²ª¤l› É{ŸçQ K¢ÚŒ[ ´l2ûâûÚòç¬Ú¶ˆµ›Ò 5U6X†ŒmÛÔ]ÏuæKÉÞë,6¹z J¹ÚÞ
+Ñ0pô…¶Z a¼°4<¨_Ûäæ"b˜„ÚþfÅÛŽûæ[#VL›yšk<¤á]Náà~¡\2µÖ° À1|²ô Kyx†³š_j°ÜŸsŽÍ,¼8[ëGÜËB¬h†Óœ—å –ú0hÍHxÆMaw‘ª¨Y¿L8u°°UudbkÍ4ë@æ¨jòB$8”l›GSÉåÑB2x•d4ói2©¹ž ‡¼Æ‰&™áîYüœó
+´hˆœg ÛU”pÕê! ΔÏU‚ÄF:H©BÙ}4ÎÛ…BC\ßØC)ê;e>Å9´&ð¡ÁðÔ¥þÇpµs+
+®ÈÒUfƒ ®Z…æÓ<×,!ùÕf‰‹kv0ÛÁ…œíf‡KFà|¦âÇ7½ø#ÜS þ¯»ûûýÝíw¿ÿúáîþoŸÝ?›þ@{ÌôbóáÃõrÓíîýõþûWûßd›=4õSÌo÷w;:r0ˆÉ+”‰ªÍ£ ÛxZ¦
+YWžÑ$9xŒWжsÉÉ+ðÏÍåɇi-¢ƒÐú¹.ZÝÒ‘P²{s#L±Ù´%úÛxØ>Åå"ü‡Q°¦-~(2dö4šXÀ¼ø¨bªÓ»ÝZíŠøØ·¡—™»IYˆ³š\×=¤iPZÅD”VÅVt=˜nJí%5ÓA÷æFݯ‡”Z&ÔÒÇn‹ï É´L%úîŸ{ïc´jš{^iÒ˧t˜ç,‹óB£Á+¯ZŽuLš’D£?ÑöÄîcLı¨x¥à•8¥&š»ó½¶‹[žlÚ¨àâäIRÊ9†}ìéÆ$r)!–8Ôó„áh~Ü`eˆBƒÆYKäW 6Ø%Ø:C=ª3„äˆ%냋ýØŸn¶]9,ð™¦}$­2ZˆyÞÚê`Šêï1Cý‚Ã-
+ËØ-@ä‰N"ÚV0i«}R&Áµº
+½®BŸ° ¶:ÓÁ†ÒcþÄVE_Zíà|³Í7ëPulta¿¦iáÖcæ% ÷|þB»á`°­;Ë”9ˆrÑlÉBië Ñg5 £þ€gŸƒ•èÞÄŒyÏÑ¿kM6é“ö¡ÏŠ
+ÄP9½»éßÆO°ÿ/_NW5Ì}þÿ½ùŠ£#Ý#·£ç¦ñ…¢×ž¤Ê`µ£þü”yA•VºÕpv^÷ún3hËVmì 1ï[‘`*ÆÌ%ŸŠúâØ/·Ý6Ž$ ¿ÊÜ°/4ÛçÃ¥i{
+×€ d“k9IA(~ûý»§O53$%Ã’„7‚¦Ø]}¨êªÿËßIâÉÎ9g
+N=jÛ¬œŸ1}ÁdãÃãKæÇ[ÞíÞœdèN"¥d
+ÅI3í\(WÌ;&}®I™!×缩 åÑø]ï×Û5„s_Ãq†›ä^E[‰sãXd ñ5|7ùE³‹î±úÎ2‹æÕ¨lfšl…`iª®B¨e²âéðQ% $t'àM.4ïjFµûѼfy¨uãBœÑ„d´®›Ê.¼ïšs½&§$u{®ÞÎæ\L¨²~V m½ŸÕÐ# ½CAOtv÷L:¨É•EB+Ë¥Ý'¡%
+€`VÝZ
+"™ãìŸ
+àšÔùãV]<~U„C
+ÿt¤¨sÜ…E˜» ùPãÛÚYcW½³#O@Wn:¾Í“Ø¿*Ç¡8Lƃn„ÊùÜÚQÍÚõœ=Ÿw|®ÆÞÒE9_T$åžê¾²}f¿ÍúIļžÞk{À4“ï^ú!÷=k§û™µF˜”“ì)æ±¾ÿ–óïíõýùõr†bŽ óã@F¸—a@¯Pƒ™Š
+1ªÆ-K¥–*¶;®¸>ŽžlÚ³½“uõ§ØÒ^z¨`vâ â„;0Û0H Ç'¥æ‘kÿ µÃ•jëø¨ÖDuê$÷Ìbž‘ð(¦hÿ±–ó M™¡VCÊjá£låºÕd‘ê‚Ì1âJg1®WÓ0§¡Ø“Ó[§.¨Äï:ý®ƒzήÚÀý™{˜[zäb½
+°]T Ì°ÌzóPª«éßË·?èSL1÷í_WÛëÛpñüÛí%´9ÿx¹úùîËru“†ñ©«30ïÍíuÜYãp¼»ŸBaùãífùîëúãö2˜½É¦‹»ËËÕmwÒ®þwû°û*Ü݇ûZdÞ™K;â/øïOØî;ÕýÚýö;ë–˜þálÄ†ëŒ ‰jMÚD¾•8³¥›¾•[ù»¡Úê52Eś¨ pz]‘"Qmž‘‚xM–*¹tßÊîü]wÞxM§Ë SöQï#ÕS–îrq1_[9j+*ª:oøOh¦BÃAçä\7©°
+/Rj¿OòÇ C˜ºéQct¬j¥.e’AÁc
+½.hE®q˜¨¤8w±9 Š“fÚ¹P®˜wLú\“2H®3A$Ø S
+¥ñ»Þ¯!·kì6¾†ã 7+ȽŠª¸ìƱÈâkønò‹fÝcõ5œ!eÍ«QÙÌHÙªÁ ®’¨e²2êðQu $ˆ'êM.4ïjFµûѼfy¨uãB¦Ñg´®›Ê.¼ïšs½&§$u{®ÞΨæ\L¨¼~V!m½ŸÒ#½CFOTtv÷L*:¨É•EG+˥ݧ£%
+€`VâZp
+Zõ‰ôxˆ´Í9Â,&¯Gvë{¡J.4vÄ™Ø՜݄lÈ95oÇj1u32ûýf¼¶32Ð#>5™4¼dàìñiS¬ûq¶œ•öȇ×M]¥¡À Ôæ™›i7‰ év˜Ç÷®vÄc´Á=öƒ¤ò„ räpÊÙ—ÏGP9‚ÊTŽ r•#¨üAÅ¡ÊÚ˜z R2"PbPT-M4fÂ$—vÊ<Æö•¦lu(•ÉŸVD>ïXAî œvÿ\Ð\=V&ë.¾aÝ'†D†‰ÜVLè" Z’¡”ªÈîÆ܆ Ù75û!9WgÍ„u/c;;`'Zz|Úë:Všõ‰?Ï
+Äì²îHÏ_]2SîAP2ÉèÉP
++³ö#¬ü`Xyu$•#©IåH*GR9’Ê?‘TP4½Óƒ†TVš¬§ŠÝÊÞòš—²JMíPW8FÖÇLȪ¤2ŽŽ×/÷Ùó~Nwìó» Æ();y†UÆê?ä B½ž GÛ:0W…weÇÀò¨e'Àò€e¹ùD¼BÏ$áaí`oj€tu|kÇ ÚÕœ aE›(VåD™µS?ÄÞ¬ë$paÆîCbi1ÝçähŸ$¿[+ŠJ]q1=YÖŽó‰z¾z¯»ìÔÁ.fnu²Ë=öƒô"{®8êÿÐËc]ÿ½èåöv»A;éþs}¾ù¼ša˜oÆ«Ñ×C/ò¥#X %&£àÏvêPQbÚ¡B£M’¢1…÷&•êˆG‡ôf0–å³q þ™à=f&Dò×:â$H÷d¹ÆøÞ«m7Žãˆ~Aþa^ HA´ê{w%O"ã8Nd ü`À zE8 xh:6ÿ>§º«o3»+S±Ô왞ªêºžªf P7Ø/:¨¯àùo˜K:…ÂfL$œ¬lFyj0½0„¾œð
+MðyM…Ø=9®oÊÊ“‘}¯)Ÿ©VZ”ƒ[ý6 ¼¢H~™$"iª{¦Bì>ž ·û˜¥#ÅIˆgÒ$mê°G¾AÝüAb¿èohgÕ[O\-tzHÖ‹_aè¨\å*ÑPH ¬ºå¯×GÕÎ’?€‹ˆMŒlhÉBzéiÌiƒCˆÖ] ¯è>¨0‚†‹½žX«2ÍHÚ‘Ÿw4‹à6Äa9ùqð8æѹ™<YåÙǨô<Ž9ôþ¥­r–ûÊÙë¼·î”Ö)³é2í¹qy…‚ãÆ¥ˆ[Xm\šûg‰®'×púm8ûQtÜâ"b®h„[Þ'.l7+<pŽRÝé”=”I+'ðòÆz‡ŒD9âødÙtªêù_ˆù4ÄÎa4YÍaC¾uNçó´TÚ­AÿÓëÛv:× ô¿„mc™„×Æ ¿¥ëa…
+Ôù› ¶~Å­UŽtÑØ©[ƒº©ƒ°|ŸA~Ÿo½ð+¸šš×«Ù¨\8JÖ9«½‹Ìw"x¤¡™ï(1ˆ‹(`û:ÿÁ¯=wš¨ÚÓuŸ}”nøm‡µÕ2¦ÖsMq i&¯
+,ñ-O<VØGulyâ°o,“8\Ư3eçäÊÎä,&Û¿åj0­jDÅ
+iGQ×ÉÍ&p«ƒ±>àeÇ°–dQ1Õ™4ñ]ANˆhHuV†Áõ¬YU„Û¡(õ¦Lö«2ɹ騕‰‘ªsÔ[j¶^°u©¼.–&a]Ž6å²_•K7=ƒ…7·;2¦“Š+wð&À}&×EAM•›œ| Rç9/ŽL|š x%Þ
+¨|¦KJ|ejÃÒ7à
+‡Õ~&G±Ê 3g+â%66d@¯ÕBˆÕŽŒs`ëZÄkªŠ™¢Í[e+,5©šh¾LG&œcü¾óÀ ÷3}ºÎ³ÑÉ.„»ô!œÐ­` jÇ&g¸SMÞ懈"ÊœšÙnæÆÞPî/X…ÚM´®c1QQÕ9Ö®ÖamGaŠ¼Š˜ #ÂnÚ{²Á×’l8ä©`«dÔFõFÄ ¼çõgß½|uÿðç«ýÃÕÝíÅýãòGÆž½
+\$8‡²uA8!ÙX5Ž¹iÄ8‰…8Šúò±Öƒ¥…ßò§:šéZ¬$GðÄ 7Þ"ÊÝìZuUÖÏAÀ*ˆÌ
+H:ó`€6®Ö3-¸Âßœ¨+í2o«²õ(áð!é–¡®ä]Ð š%Éð©v©ìF;g4IŠDç3×q ¨i•öž¿ •-¡¨÷TS>ìñèsád±6 ØK/Û Eí†RÍæ¾®8õ|-³&í&pÉkoOødv- Ƭ"¶M®ó#IwšJmåfyù%xÎ34lû‹‡‡ËûÛÏywÿðõãûK™jyyvww=º½øþúò‹Ÿ®Þ]þ(ÇôVÔL€îóÀ‚ScgM šþ·‹C?3ilœ‰¹¿|syqýÕf×/üÅ$•Þ^_í/ßî/®1ؾ¸¿z÷÷ËÇ#ãìWM¦¿^^¿_O¥ÿÓHò‹FíÁÔ= ºŸû›EªxiI«Ü±â"ý÷µèDý-RÓÆD£„¨4« ®l_ºC¡ç2M<ÆT™ äòáÔx4ÍhEwÓå]ÀWÙÚfw¶ZËå‹vyÛî;Hè®™”9[k§6€ý
+[ßîZŠ•@IY´/Oâv®çÈ}Ôó¨”b™R¶-õ›¤ê÷€†«©½% !2fÁ-msÐW<¯såÜÐBa˜@ÉC™LY‚ÉÞYâú¦Ž¤6a¶õL1Õ÷|Ÿ¨ÛÛ~éAD÷ЬÏQƒqì×8àã}ëP¬ëH( œŠ·É›jÊ8®fu ã+•¹ÄĘdX7P"‚1 C®†KÀBT11¿¨2NoAÍ©¢Í—DseÓ‹§-ºSI1˜IF}òa­ª >ñL/nÒ;ÞÕ^WØ
+¥²Å«…¶$b?NËøÆä°Uø_»œÆ
+Å”™Ö%ûyá‘Ãy¿÷ÄÂ4*(Ḫ¡Õa<ªìKÎ „Ò£¨Šµ¸qóNäõÓ†+øR"”(È 5ÚÐ
+DL¼ª—p\I#Ú‚Iu‰2±ô¸(¼:¯¯Êê*¿Ø0¼÷`EKñŒ$!.£0 Åí¹Ì{c]s£)L8|n| ¢ãœpbVÀ¨TæߌŠª¸¦òEH£/uÎwwå0xžŸ!ðÁÐéÉ„ƒ9 ña7Ø`ìAœçL^S­‘°!
+ü`
+endstream endobj 187 0 obj <</Filter[/FlateDecode]/Length 14501>>stream
+H‰ÌWÛnÇ}'Àè¤aû^Ýö—r&’2L ˆåîŠÙ€äë,þ}Nõe¦g–ŽhƒbÒÌٞ꺞ª"ïLgIjùNjåĻÃò6vd¤cÜtÊû
+ÛNûÈpQÑ0þñð@Š7éwª8Òg ö±‹1}VàwØSú<cçt¿Sì´4ªàª”h»@1|Ð||~Ï¢lð×?àÿ¯nN϶»7ëÅn½yœoŸÄ·Œiqzñ¸GgÊü}¾Û­¶ßþe³Ý}xúeu,¾á3RœÎ6›ûñ¡Çùíýêí§õrõk9¦öE]®îÖ¿î¶s¾²¨¨3ÞYát'£WÂRGNz¡\•BâÏéåj~ÿ~¾Û®?ó'#±ñê~½X]-æ÷ëÇ»·Ûõòo«§"ú;þë𠊣cqý3^ð™¼ùþqyõôp»¹¯À Š=VèèÇí­8³ûO«ãC)Î8G®;<øtx ÄÙ/üú#?ª¤~{bè¯xú7°ß„ïÅ?þ)Å__æäcK„ÂwÚS²«Áu§-‚Ź%;ÒÄq6‘ß)æÇEÎê4éþWRp2b$¢Ë}éãw¸7b$1•Tpý¥õ=ß<èÕœ,h$î› ³[vSþ3û;ðè§ÇÇùÃj)î¶óåz…d1渜€{;euȯvR‰¥Œï,¨ùÐy mfw‡ÆÀ,íÓÙb/H£ŠIz æg¥èg³ß+Ó§?lv—«Åf»„ž9[_¦×^žŸ]¼-v~ø¸Ù>äßjž"¡—›ÛÕÍÙE¼RW»§ûÕÍ É8Ù=×Ë}—ê/¹´ü›ÎßU7øZŸÒÿ²äx›Þ5!XI^—ìEâ(émƒsŠ©.˜œb± ´3 T¨´ªùØ㮂­X¯q}6–·>C4¾=ƒ+Ÿ’®‘5€£‹|ÐrÚØ3¶û|ßï^–Ùʇcq";)•µ™c`¼±ŽÎª@a/8Æv
+ÿ央/év°¤Õ¹ AjœÔˆà×Å.X2
+y
+ñZáARÐЕÜ&8‘¿L¹\ÚÊk¯ç½‰ìZWÛ êðU0{Ðæ¹/ã¬î>¯î.8Ü­M,ÑËd_=vwzÏ#œ¥<:Ç™ãBM³"±G×7x£k/¶7i0Ÿý…ãø¦q†²^“µq*$*è3'š ÁÒ‹V¢ÃFŽ(ïç[?>×ð q
+,5Ò¡‚Y‡Aáæpcò vß/l˜ÊþzGÚSáüXu¬…N#öà…qŒðEpŠ¿ˆª3ÒR­ƒ˜¸]vMiÆϨ3h:ï½kÀ"×iirØçÑb$µÇª‹J ‡1‹‘ÔÈœÕX…
+ ½¾íáÁàFìž^#BœÆf‡ŸÔ—ªoo°£q²:’RÀ¼¡ ÈãaŠƒé´­Q‘:²•Þ`qÈUƒ­IΫ`ïÔ`£Ÿh’*LÄ`Ñ¡HèqBÁ[ëÄH,éÎÅèÇ:T°KQ¸=ܛ֊ÝóÃk„Åb±²”N}éõ­—9»¬…ÖåÍwÆèa‰¬0&gíRŒQAÙdI2õD²¨Óœ½ÌWxôˆÉat>ˆ˜ˆÀ¬Â¢2j…c?§÷R½D‡Œ&ŒTèÁ"¡êÛn,Äîyá5b‚²öʸ“úRÔÕ’†Ë&|6c]çtêµÄ©uÓÀÇ ƒ˜#¥Ôh$„|ö‚×Ìä0L™â±˜UBÜÃQ‰±T¡ò‚بPÀ"aз9ÜÜ‹záUÚ “°”æ†S^ªºZÕËÌ^Õ
+•cG¸•á°Çâô
+ß?Þ‰£Ùìl±øôp¹ÙÍùt•È±ÁJ\/sBê?šS
+ËÞóâèX\ÿœˆèÌ»4»¼YbBØ\ª^äq©3H]LÛ—è Šr9a ¯D•ò4s^%›¨à²Œ·hï1–Æ*&UtãyvQ¹1D_n#“Ë ESLédÛ)˜b„ÓÃü†Ã”f*äv–Dbà³ä:¤.¹ÏóÒ’ÉŠ©Ö×µGvšœÍx’œA :ªd¥ê.äU0Àžó:1Y2>ã2L‡P‡tWÕ“HüYZBΡɦŒ‡Ñéß´èACv9⦡»CI\É_…ÌNŠàH8ì5ìÒYЦCÂÊ%µ.•ò$›âåx¾Oôä±î ™¡h04îTÚ=#@i”8Å„‘;±Ž2E“¸‘›OxîãçnO<ƒÆI+ØXæŸý–›¡K݇ÙʺÂQ/Õ<É—š è#˜W¡©?®ÿ[)$+Ê\ÿ¿°Ù*på¥Ý ¬MiÙ*b•C÷b£ˆK\C’ç$rŸ/…NÒ"º201o©LÓ\¦=±è5Ï@eƒ–UªT†28쎲¤)ߦcb6Œ­^™¤.žHå$„U¼‹TøYÕGB`<3Ï2ü]b°4•AN%½<71WÉŠ§>Ìc˜b2* k™@ƒª  6ƒiÂüóU×bÉmDAþC¿²†¹H*I%=îŽHpXH0,„`l¯q<›`0&ÿ>§>Ô­î{Ù½ã¹c&ñÜZu©T§Îq2‰µj5\²îwŽªÈVšñÆ‹•xZáµÖöĺ uqAÊ´áÙ9
+0ò FƒÙ”n:ˆxˆrsःŠ#ƒ²ba†uÞ›p_dO*v°kàœ)™dEp¿Nµ§Œ]
+S4v„çwÕ\8) ‰×eCªhê;ZÛ°Põ“*Je톚IÈZ“¾€ì£èÑÖyuùº1©Ì„T-º
+Í–Ö7Œv5‡ëR1*…d“%#„
+Çõº¦$u…¨UF¤D
+8œ@Gˆ
++çg…¤€
+ˆ–‡
+•³zgÊ¢(EFÖ
+©æq°®œYúá FpqMNtrwlAÅtØõ …âÄŠ\\{„¶š ‡‹Q°¬dFêa
+ñN¤^ºc‹®Ú.LXž¦º ?5욊zJg`¦¡}‰¤Š3NFgÛÙÈ—!,)3[ pO.Ù@g
+Ë]'j¦Q/~.4Ø‹!dPLÐ6^„à@!¨T]Í\w» 
+l ŸBâ" T’yñ[!«Ü%çÐp ÿîÒíÊÐåû„>µ}™”•Ý„=²VσJè%Š)”—
+È’$œ“ U—Ø›p„ˆ|J· ¨~ {†ú\„!¹•é'60+„ºÑb!éµ:L¡XX@e_Å45°ÑóSÆqˆRtUÇ´”ˤ“DÔˆp¿ôé¥{c0Ä -‚mÄ ~/}YQ\Ü,%
+'È(é/ÿWF}fsçb6ú}úñdÇ¢Õ ¿óˆ]“±×KÇoÇŒ5®éÜö‚Éãùs3‚§ìÍ?/ãÑ+?ôb@°÷¬­S‘Š
+¢áå ø8_Æö”î!4«Öd,Yº;Y¸M/#ŽnÓúÄq»2®ßjÞæ”^š½]J?¹þ~¾°û´DÐ1(ÏÃhÂjžìÒ\µ8?jªµf#’bŠ£W»pìØê2»­àa¼ö¡ÿZ»°uªóW(ÄÞ×fÜ]<Ù·(7§Ó{öï¾?OÅ—×õtLíÕ¢"æ,òðxŒ›`aŽ RäXʧˆÿY;&RA
+#\[rM Ì ¬z
+?AÞá¿!-ïó!¹’<!8Ì$`gˆ ã‘ÁÁ¶‚ñ0ñÛç«Ãßj©;“–-}ánUïCí:¬ZË8’¡fþjÆs5ü¬»<¬Šc0í`-+²É$AUá–Í^²‹#“Ú Ü¥Æ4Û4£R3×•é ¯ ´™cÜ>­Öc6’¾ˆ×³¶ýD\¼VBm6š¥B¢*È{4æH…+ÕG5ShÂêö2Õì-˜Ãsi¾¸à±ãè¾2·¾¦e¡v¹.Iä¡h0ê¤
+h5íĨ ÓÉ$c?ôf¸dÕoÕ­ã3ñhÅk­ìs×­­È©ä¥
+Ï.QР÷i¢´ZP± /…›C€‡6jðÅMä§4-‡t±vüpö+XQŠdaÈ5µdieIØþþÔf*F!c \”7JÏg^…»ÌÓT«L–£n¼‰ÌÎ.˜OèKníàV²BV1èŠÁÜÑŽ«x]¶7¡Ö㞀êΙzœBEò¾˜Š{ 5²r†YŒÁ8¥BÎÄ Ô¥_1ñ•“B`¡‚ÈÛ°Q(¢j?_·§!öÚÄX^fì}nR•jdÖ® CUtaðØ!?ÑÈw)ÒÔ&¦h4‰çO- VÆV­‡›1™o;j Xºb#Vé»Ágʪˆú/¯HI‘Õz@­Na7La„³E7"»¡k󬕲ëu©§"ع*¦ 3±–ƒ¹ø|­7²Êôe1ÐâÓ­”>·çÎ9NQ¨Ã@jÒæšLmÑBnN#3@ª
+Ùõ¼&)¨[¥Fʨ
+MYxq:t¯2i-N…·œ‰ç5ù"¥V` Ò"”î^$ß]³ô`D*·
+=VQNp¾(€5 «1W8c)ÕŒUçñW2ò&§¶æ>”–ÊikŠB‘‚P+^!ÜŸQì:ªšU¥f¢”l±@d‰.+G0>5½Ôtå6ä¨æšMíz–g¾87ãS”m
+ÝW*.Zfô×µ £Ïµ»ÂÄ›gb/sñÔ©$âE±qŠ÷*k#P›’¨X@¼ ‚~æâ"/£R\„E¢½–$§umM”®¥¯ˆ‡|¤ÚLÁXÓ†q!LŠ„‹ÂÿÆþn*@ž
+¡þ‡qb…£”  $/3}Ô½FxZÁ¥@àì$’šµY3„ í±&z´”mÖ…Áº¶t·ä<Ñ3ôüUp%Ó*»hì†Þ×
+®u£Ô £Y§ÒÿÒ>Í„U^y£¥–]Á‰½J¦Í>£¯U²¬6‘6¶˜‘y]ض̆¬síà E¸¸E§;e:´±R«¿¡æ¸ËLkÃ{DSJ³0rzU‚•-›1‹ð´¤SñIì%˜
+MÍÍ5Íq· ª`ƒ‚
+¿‰ ©óà^¡¬}JÌ‘r©ÄUÁéºìO!5—I™Ù½ð£;æêaP‰ZÊȈú5€R’÷ß”p à)MÉŽˆõÝŠ1)e
+BÛ¶h5QPB(’B„P,¦àJ† 7µË„s[¨Ò²¨ÁÙÓz@Iѽ€ Ž1L(t¢¹bŽsB6 fÊjä¹L/ 9få[×þ
+å×b+8™Õ]ƒFâÀh^2nØubû‹LË3æ9|1S}_ <]@_ïÑŒI¤©'Óa· ‡eâÑR«F§#í~"¾€+M¢¬š A-þ2—¡µ°$”)”–8‡p„Ø›V IMœ¤ÙKe† CH"91ä>œ"o4Wļ5G)rÅü!CÐUºi0Fö6§ÂrS¦ †)7¾”ÅAê#Š¿Äþ¨kahaàfau@ãÀ¾Fb‹¦…ðN*áüXoU/Ž”4Ï‚§¥ßUº{n˜dþ¶ó×
+ ôG´Í ÂÂÓÈd‚äÁ<Í™”0ŒÌÁo@7\YŸÊ$Iÿ€ÂD@JrSÄCþ¤!C YÙq]µ’.á@žò<í¹üÊv"29@ÑùÉç_~~çËG1Õe&Ü Å8&ÄÒ½Göä~YüŸFüAÎÙmAý|usÅÜù~8rîÞvá7gOcxñ‡÷¯žz÷ãÕÛÕpþú§7ïWÓɳçÏý&,gréÅ/
+
+ÁAá/JdkHQê®iÞCJÂifˆPwúåm ËŸøö/l¿,eù~ùû?ÂòŠ‹.žY;„Cç9Ð[
+ÞW‹%¢diÿo¶N©n~Þ]ˆöÁŽ¬áâ)÷'rý,èŽ[1úî÷üè{îxò›éõpÁW:çütu}µòœË0&þð¹å/!·$Üâ:EzóÍBœØÅà&3z©1bˆsÖ4-ÆÖ
+å̬;Ø) I’/:¥bFñìÕ(X–FÒÚgdåÐLs5öÁiÈ:/Ò•sKzö[pœuuìÙâŒÔ@PcNv0¼9näKí·(³N¬†Z±4x>#Eªº¦jC½†¤¡Æ§@”m‡¼ö¨n±C/ úº¾‘Q÷BeVcþ.©ñ×y¬d'ýÑeÇ–@Š}ÝnyŒ’ÔÅÑ
+åá ó3kf!zÌ*#˜ËPçi¨¶ÔDq\SwöÊ Ôu#Nˆ =Ý8â¾’ÒƳR¶¡¨€À…“¡j¬—@¨! CÂb€!MdÉN±%,Õ¨‹“sn•ä“ú±ë,íb¯qboÌ‹XBÌÑé1pÑÖ”&q_&Éé‘ä12ýáÕGèô»‰<“¯ß¯~| ¼z½ún³ùi»ýpùâúV¹rN~‡šù—D¾€1tÎý©f”ìÈ4úãÑ÷öìfu²zvsöûþuRø¦ÿÑt-‘v‘ 5‰ùm}H§OË«Q´PŽ
+*Ï;V¯³¨L«aœ]ÑŠ–
+ Ô³S_XQ5q7Q/…ùR”ÊÜïmŒLŽœiÿRÅ`~ìÙ aÚüj™'ÿmÞh3}uuuv¹;_½¾9;»Cvx´U”"š0º½M–A Ž…ÔŠ&šƒíïæõ7ñpY öý¤1¥‚â²u
+5Ym.µ’ð³Íص1abJ•ŽY•½tl&rúnçk%¬W´p8ÏaÚDS÷9 ¥~˜4h½—CókL݃°û . eŒƒ²£Ù]M=Òßµ£…! &‘HR *ÚÁå!¥Ç vh\^‹æ t&2½jÌ µhj§Á"H ¯³xZÀ°Ž’Êæ|)
+s[]E`ÃÙågG‡³’Ó£c0%ßÅ}éó¦Á‡t7¿Šðp¤ˆ)~ŽÆŒ
+ar2êîë®°"°fu Òù{ 
+?b
+Òð•uùÏ¥ü4pgË «ø©¸½€f‹ #ð­6ÛO~ëæ¾oEÿ*Y9µV3VÉ[‡®q”’܈6nµ½¾|wýáê|õþÍÙ»Ýêòú|7‡¿‡ ÷e±‡½¥~™l÷
+‹øyñzª"Dñqèʇº¹@W¦ÃÐ5Ø ]¹ÃË}˜+~6æ
+d.Þ;ö§!W=‚\uátA.ïž¹ò£‹ï\ùQÈÅO\ÇðÊ=^ÑŽWü¼Bj«²<€±Ò1–?ÌXîs2În´'=±””vPý÷`,š0ÖÃߺ¹ï[ÿ\Œõ‰¸óvûßÏ‹ÝùÓáN
+Z{ÑŽA $3hG<4óãé³÷¥,"U_ƒ@>±5ТÒR
+òr°ï'ý‹8=¯ñ'Š;¥AC`g õ¡³®ŠíeóR䃃SÈ>8Ç\ì †IxK°¬$ŸCœ—Ä,÷’HVöƒÕÜî{]*SSîþ !nkXÉB"÷¸Ö’Z½+c‰|‹ °7Žl=v/.±‚0S3Î8ÄOÒÖ¥2Y#é{È '¦~Á0¹ê°Óè‰ÓNL“ÐŒ†ZLÂj’ÍÉvVcÿ>¾šìlì ­¦¿Ž ¾íŠÝaÈbê®Õ½ó¹'ˆQl¬ïãÄÞŒ”S7–ÑèóÄ8„;'×h 8Ù§¤šp+[g¤¡ü‹ÄHžhü>fÎÌ+’€¬ün^|z:óðÇYê_Íàê«v~AÚ™’AW!{‘ÎBÞ©0bf=Ø—Î
+±¤á ¥D:‹†$ (I>Ä\ÁøôU5¿ªæŸZ5%Ô.è –FL² MÌ8%Ó¡1²YÔ}¥–…Qv۶υ˜IæKeôJžÛ0ŒŒ0Ør0IEÊ‹ 5Å’K´Å:bÊ®õá‚íÚ‹ Ö»eÛ3ŽEv†er Ëä:úlfœª~3%¬ – óW…h /¡
+Ô|·Ô¤I•`ÄÌd;`q‰lqt±®fÞ”mÇN4÷üö®‘4 ×àçIôH]þ\{ª~É¡ÖAtî$ˆÇä8MŽx›Œ‹Á™úÔn­R™,˘u&Åc•é°@%óáŸæ€XVé&™âË:~ê[7÷|kµ9)÷RײÇþHzÇ8yx&› g-©SOSátˆ¹j‘­ÌIuíŠj–Ð~¬MÄŽÀ±Ç5•Ú”áCûÓZŸÙS•õ b÷ìUvJA¿²ÍË`‰K&×¼NÁ¥^0°ç¢š‚w¸’Ôa8^.²C‰ÿg¿J{ÛƵè÷ùü2@L®Z^?Å]Þt^ÛM0(03[MÜ:’!+É´¿þ’¢K^âlÄq“ÊW$/yyî¹çö|ßò¡¨CTã9Ôgó]õ²¥°+§÷ÎN¥ Ýx:– ñ›Û@}ò}W¥©và_pje¬ëgBÂ
+á/Ã
+ÊÓÕ€RJø&Í1×çž2sîœë¤BOë N-qê”[×oe¿ ŸzF§@C‡xšMu-ô‚µ’½]µ/J»r¢Œ¾“Ù¾2à×wA•*6»‹µ—ìiî’CuY!…4TAe| MÒ¶/Æ!Å­hA7º3”
+ØÆá.ʬG5Ïàž=¤™¸>$-n4*,€t1'}ú`>Â]f(ºÝC"3=”sÐ+fj£‡ú¯±°žÏþŠ>A—ÜW†ìAEh']7‡üdÙé‰@ºùËÀÉc jz7èQ<
+†,'Cs Z6á•Š[ÂZÛsχíR}iŽo¥]7úŠ€ëûñª ®ìúRÚž„«•›qdø¬‰Âh «¨Â^\1â ™V‹è{wð-ÝÕÅÞìÊL¶A2;O&3Ú÷·H<„;úH *$_”PB,Ç¥õ:“fù¥s™´œIˆ9î¯ãWÀkw©K¥ƒáåf/«ÑaÚ%ß6]‹ºJÔÍ!ºjA˜.Ím\¼\¼.´
+jIl¡
+  fÁ‹zdú–eॷzºðÞÔ{-ïÊG½G¶(òŽ%0¿k tK`Á» ½±ÏzÞQèíÀV¡÷jCk…Þç¤UèíЙB盧гn ¬.qç, j¼6ÃWÝ(ίø»Ø‘TJhlèò)f°áÂàQ q>Sôwe
+´ïï~Ú=ÑÑ9yµ˜.j÷æÎ]¥Ý[æxQ»7wîÚíÞ­ôŽÒßO>¦Éa6JòQr¶»[Ø ª¿ÙzñqbÞöÝáøN¿ÆƒBi˜žÆ¤Ÿ]NÏɇ(‰Îâ ¢ig;Ë^ûöU4€‹ÉùhP =NÓñä×$«Ïí¡ e½F}‚Z8¡c¨]ãí8Ê—Nf§ô26ÇÚ5:føóf´Çgaª=÷{FùycíWçQ6H«sb”]£cìqüON^®FûâUíÑ$ΪGy–~‹±·^qû@LóîïGs"¤áRŽù®ã¥ÿQjÍ7›0tñ®×ÜAHëŸëGÐí9ßìÞ|‹Ùà |ÜÑkŸ{qn#¯óÄúVD9òÂsr홯»cÂƜݓs6æ>>7Žù]§HWîêí9N°[Ý#®äÚQ˜@øq¶=bbÇz¼,»·ˆã¼m7èdvsœvïé^wT#ĹÁÊã,!^µ9 -†'}]—)‡4Ò\ú–3u{böNWßû:Àí;í(ÿ>Ž§[/öþ—¤×‰ù¦Ëÿö~’&;dï#ŽC~Åë}ˆƒ«¸|¿÷*½˜hD¿qF3È%ıf«ÍöŠ1¿vO;Ê£Á·›O[Å[?šŽ W<‹'qóe|ƒõ:ui„˜¤ù§xB Í[;° i¶#”üŽ§¯°]I>?ÿ¦d¸…wŸ*)¶÷:þB^’­d»¶ÔŽ^û%1¾ ´Ù;Œ²¼óXýqœ —„bñÌ
+ÍðNPÛyµÂü/>Å«4^Žòy'hN¾#@蛾Mà0´:@c2ß\ÅÉÁphŽo TÅSw©= ëöž§xhüPˆBÐ M!e¡g${hÑ_>|ŽfÝÅÈb³È*7ôÔqõdŽ„9oþ‰—z/ö¥Y¢›ª ~p|=?[–!¯Ò,‰³éŽ‰AmÒvãu/M°1[¶0(v[ÜžYeïx”Wà[ô§8BÎeÑpt9]€ç5‹Í3©7âÛG"Î[eÂ{ªXå0÷M(>σ)Ć)ž SX‰åtÔÜûy5µ8*6;^gé„GÃôºµ—ó3£±ÂªyÁ\H'Ñ(›L_Q®#‘êÂ<PιU©žtÁ»m(§ƒ±ÝNÿ.ÉÉö`š vŠmÚô=O³MËUœåÖB©³ £ì›];uÆtÙÅJ.8_fn1ãïtœ [ÿeA¨çQhOm
+ÃÆ;ÐCÖ/”&<O°@ÿÇ™b
+*Ó/ªß‡()s’é]ü“ÿŽ×."õnPCfV.gXg8Ë¿OÔRõ@ªÐÓEàñ„œ!FA÷)n÷3W‰þi…÷V6½Ž 6EmSÔžd·£ÈÙc·1O˜7 olxãIò†¯¨VQ=Ͻ@˜ʹV\!ežtq{
+É8`™€ä¸W,¡ŽÍ+ÍuÎ/ÈLÅîÁ0¢û%«Ã\RÓ‹RSñÕÿ#¡õç ƒ<äâÙÔ,‡$¢tÎÌ-ÈA”Îz•h×;%JK¨MãAZu- À-{x`8¥ƒ srBªb€å~ ^OxæÛ€
+î9ùå
+¦Àªe´b­X°W,
+endstream endobj 188 0 obj <</Filter[/FlateDecode]/Length 6788>>stream
+H‰ìWkOËýŽÄè/‘@ŠÙ~?®ÅÖ/ÝäÚF‡#˺vØËx–Ìvð¯OUõôÌô.ð#ÉÌŠeèé>]}ªêT5ãìÍõögbœýÆûÈ4{ÉÞ¾ãl¾ ïŽðüooMž–§ì1ÛÞb;ÏUuÜ^Wå.ûãöÖc6yº˜µì1¼šMKƒã&Óbµ˜Áª¶lØOÛ[;óåIÉ~®køÿEµü¸ ;s6éfÀŠ§Íò’Ÿóåǽbq¹ `ÕÕÙ¢†)å«â}I“Æ
+ÉlÕÌhà‘Ü6“óeó)Ö›Ñà‡²‰EÈô½Ä¼h.hˆï¹þŠº¼,"¤…KJ<©®òOªzþC—oÑå·0^\Uí»±4/Þ_Vƒ4Q®EWqI÷K¬WHh%<.¬NÇ?xH¬‰k‡ Mmv¸?ü~}VÏš–Œ_ÑÁ¡__-ëÃ,ê³Gºñi ©vXTeÛ–QtOîoöÎÛ#X¿j›Y~·K}ó IÍ_loÎJàÎßÏmÙ/½'‘E)T¿Í=CPÁ{–mÖ¯9z1eGå|XeEðrl`°F@Že–Žÿ£¬*P§´ÞJgIX†­z¨|ዦ,ë~.(7ÞWH£BÈ—‹aù“ëbXí½²ÖÀ\gƒ°7}”VO««biCàxf„ru£w²Õ/‹3h‹@Ø
+Ή$
+蘢©/#A´:,²Q£Çìà18%RÚ
+Wï(ܤåÖÂÓ Å1ù—áqdÓ ¹æ ‡ÍXp€HèÌO"9¾?tL‘WéþÌBŒ½Ö¤©{²TgLç&颩‚”ÂnšjQ„qƒÌGiy{0ÔâÉc¹@"Q#-nÕÁê˜h©”Cîzgqh¤Õy
+G AT"€£ÜÉZ КHÐÉØX[¤…yŽÂÚHx^b;å’Š )—(•P³磀7’L­]²†ïRzŒ
+=H6˜õ+%Ǽç¡}ƒÛu0†,
+€Úº™2ýKk¢çúüt©,=ä'è"Òéœä7‚{A* ql¹'O3ïcI`xô0R'ÑÉÔAF)õNRȨNV*£•½,ÉÄeà74+ ú†ëµÌjV”}ØÛa¼e%K‘“¤
+µô˜× ZR…AgÍŠKd±ªá–Ãáo yO©4¢
+†¦LtcNI°Ösª26Ž’2i ¯Á?˶PšRÞ¤96/(¤Î<sd3Pé‹kª**+® X\Ñó~„ëLìÏ,ׂpÁCžà ƒ >MõÚ9MÆÐáz4˜ßš³ÖE1õ*?,Ôð¨}mT@,ZI;ʱϰ†
+5
+Ø7­6
+l=¥²V×÷¿)t¸¦n«|ýˆ×†î|LÑ×gó»^²oý¡oH8Ýì0ÞåøB
+ý[.Ml†‡»+Aùßþ¢K-”Æ0€ï!Vc¨C Ð2»ÞöÝ=ntqYçhUs£¦Š Ïx„¶<fS?¢SãàRg"ã}xŶz·Ù÷Šâ
+Fjäÿêiø%¿U~ú8÷¾ý‹…_HZÜÉÇ3%ìÛgξˆ„É„å—ÐçµúÌ/?û(ä£<¤ô>Édþ7~ûD¿“M*ÿ¸©.Á;.’gÎdý²ê=Æ$ä»âÿ¾$ìéjF·4-žæŒÑüNùîÊ»Z+éG!ÈÁüß{yÑ×ò÷››c(yÜõ@4z¿o…ròÃÇÃjÉÓâ§þ‘ÿý;¾*¬Eëâ¿3’=Ñ"7 A|£|È6OYÞ×ÇG%Û¤y*¯úW_“(–µ7ŸøŽÕ^ÜÓïuÅÖµÇYî—vD„µ—ÿæB¿ûU,ó¿
+Â"£̌ùb¶‘’³ü4Ÿx9¬½\eCV¼©kÊ?Wø2aDÕwŠRþxSÿNùn”¿S碌2 žhèWå;tØù99Üè‚äU¬•£¥´Ç3ù‰›U~Ì>™ŸûŸ¾ ô‹«åcÈ„3"Çÿ}¸ÿÌsyúã_®zûUÊrAŸH)’åFÒìæêg%.Ïæßø3oôW ]'i(òŠ”ªáÕ`ž§ªú¸øGÖôøqïŸ,û¶%"ûåæjð˜ÿÕµ[R‹£¸ø {AÈÈJëŽÑdõÇ‹OãŒB²”ò¼ BPš´ôg€Ë„…yÀ.2?3T~V4
+¸{ëx¾§J{ÛE‚oÖÀ¶«´(܈¦t( ¬VdK…ü˜&jx=ÆÙKýTÃ\’à©8n,qšr Ö:Æ\<Ãëh¨Qàå[ÎŒó6ŸÐ4]нœgw‹‡{dó+×Ë×'vüê¡v„D’~FUhÌ6ÙéÔY=/$]9Á(sŽÄRð®mdßbšD1Ì€i)ŠâZÉvI(cØQ‰…«}ô—Zˆ_6 ]×÷’‹
+ÈÕ]2
+÷ ¨=¢±è
+÷ ¨=¢±è
+ _> 5
+¼ã쥆ªa.IðT7‚8M9
+Pkc.žáu4Ô(ðr£2ã¼Í¨è½ržÝ-îAͯ4×ÍV”7ÊÈ»'vüê¡v„D’~FUhÌ6ÙéÔY=/$]9Á(wŽÄRð® °äÄ4‰b˜ÓR3ĵ’í’PÆ °£ Wûè/µÃl8º®/î%!«»d
+žf뻤
+H@w‘T.HbÓÒKA“DDv—i饠­h–‘6+-
+¸Át2ò'#ÇslmWì`k`ÛUZŒ€nD
+S:PV#²¥B·PC¯Ç8{©Ÿj˜K<Ç… NSŽÔZǘ‹gx 5
+¼|¬Ì8oó)zÁœgw‹‡{dó+ͽ³å2òz¨]!‘¤ŸQ$³ÍD6B:uVÏ IWE0Ê‚#±¼ëFsûJÓ$ŠaLKQ ÏŽ¶KBƒÈŽJ`Öá_j!ŽÙ°t]_ÝK.B*\Èí]B
+H@{‘T.HbÓÒKA“DDv—i饠­h–‘6+-
+¸Á­7M'Cç”®ÆXì`k`ÛUZŒ€nD
+S:PV#²¥B·PC¯Ç8{©Ÿj˜K<Ç… NSŽÔZǘ‹gx 5
+¼ÜxÍ8oó)zÁœgw‹‡{dó+ͽ³å2òî‰=åƒÎj×AH$égT…Él3‘NÕóBÒ•CŒ2‡àH,ïºÑÆÖ… ¦IÃü—–¢!ž}yÛ%¡ŒAdG%
+0ëè/µ¿lº®/î%!CÈÝ]B
+
+šf2àØ8«¤·‚¶æJ±
+qjQ©nÌõ¼˜¿BÝ'ÝÓó$Ê…<ruÇjÈç5µ;ÏgšÝ+^š†x¶ëÈŽI‡rõ<“ªÈ‘0¦ÜaK ï»Ð\Çx„<
+Bl«¤$zˆm$ûˆ|B`ßJ*\§[ÿ—Y˜]߃{)¤Ï%2º¿
+ª…¹dÞ{‘n‰q6å$@q …üÄãØP“ÀË•G!N-*Õyù¢žóW²û¤{užD¹G®îØñ_7µ;ÏgšÝ+^š†x¶ëÈŽI‡rõ<“ªÈ‘0¦ÜéX¢`S ¹×wÍOFSãyò(±m°’’ègŽefûˆ|BhßJdæ“2ƒ˜2"<îƒhíˆ
+endstream endobj 189 0 obj <</Filter[/FlateDecode]/Length 3958>>stream
+H‰ì—Qoã8Ç߸ï0@q@¸Eã4IÛÛ§¹6)\ƒ¦÷vPd: *K$§í·?ÚÓm­Ä‰h4måŒý0ƒ™6"Eþù;¿_ŠXƒüíÛ?ÿþ·ü/úv:‘ö[ç)RÅð{þ‡}^ÁËÏßNgV/åÂ5X3‘ýeÑŠ?@|¥„Òæ·j{ÉÒ¿Ìÿøù×é§ÿùùö¯â_×Kn—J2ýüó?þxóg_8Ï,˜—7œ~ךmÛœ‹çD³ûebGm÷‘QÝLÆc¥SfƒˆÆ2½
+x…Óçܬ·¢òd)€^Žùf1îÅ ¿Bþ­”ØW"šI³bøFþL+Ç!ˆÒèúîPÆÐè^,ƒÀê€ß\¥â5ÄYàw±PziïSp•[ô]oéj%„Zƒž2cAÿ`[Ö®£Ú€®öl7ˬºÍÓFƒ-›7„Pª)~
+­Fbt‚ ìœŒ‹‡rwÓz´ih¬þŒ.%^4Á8Ä$²yc¹Èb¸b«<2"¥ëio0ôS™¥ô5ªl`Ôõê…ç ÎÐ$M@nxêÅ|„y±7ÖÝò Ï?I2³ûâU¤·žNÚò9¦5ÐÝÌè‰qZ‰¼ÚÖ:¢ÝÁW­¹¥à çyÿ¹csARLŸSÑ流?@LïÄMá*²U4™‘D[ Ã}dT7“ñXi”^ADc™^€áÞ‚vËþW÷¡ªŸ÷`O®IýhÛ)Œ™å«(‡<Y
+ ×Ÿc~L“*òN*«™4+†oäÏ´òp‚( ¯rÊÝ‹eXð›ë]cØaÔgE€õ„Z•[ô~‘¥•j zÊŒÅe‚ lY$Ų˳!Ü,³ê6O ¶lÞB©¦øi(´‰Ñu‚²s2.ÊÝMëѦ¡±"‰M01m'*™7†‹,†+¶Ê##Rº.AöCß8•YJ_£ÊÖA
+W‘­¢ÉŒ$Úî#£º™ŒÇJ£ô
+"Ëôì ÷´;Xö¿ºõ}ËÅž\“úѶS3ËWQy²@¯?Çü˜&UäTV3iV ßÈŸiåá8Q^å&”14ºË °:à7׻ưè!Ί
+ —¢c~LC+ò-«™4+†oäÏ´q‚(ÿhÆüâ²D\¬ÞŒB'Õ´´íRÖ Ç!ÊÎɸx(—;­G›†ÆJ’+P0N¬Ø²y0‚Òß±[9p
+czamõú{‹ËaO–è¥è˜ÓÔŠ¼SËj&ÍŠáù3­@‡ ŠÃ?›1¿¸C÷7ã†Ð¹ /eßp‚ ìœŒ‹‡r¹Óz´ih¬-)ßV^Šœ,™£(ý»•çóËáYwà]e[9ÐÊV´r •±¶r •“ƒþÙù°×­²kå@+Z9ÐÊV´r •¿„ˆ¢Á`؆çç­hõ@«Z=ÐêV´zà—Õ½þàübpýrz࢕­¨ª ð›k ”ú¬ð»X(½´÷)‰»Ê-zÿpÑJµ=eÇÆ&ðrï:ª èjφp³ÌªÛ<m4زyC[!Ø
+AW~5ao0ôÉ™¥ENH’¬l`Ôíú
+W‘­¢ÉŒ$Úî#£ò®¯ŸŽezv†rí–þ¯nD§Ñå êºçÝKßðr`rMjMÛNaŒ/,®^ou9ìÉR
+¼ý*†iS+C§4g)ÖgÉÒ/Ûüðv¤·NÚò9¦5ÐÝìø™ Z‰¼Ù¶º¢æàÙþà UÿyàsIRL_Sѧ’Z<BFïÄ]árÙrMf¬ÐèpŸÕdš¦Ú ôŠ"š‚›%÷¸· ÝÁ²ÿÝ}蜖ô»Î.ÿ¦7¤Î´íÇô
+Õ–G¾XI W¢g~L3‹gVa¸²kŽ/´òð¢(à;ÚZÝ«eX= ðÌMÓ@ö d¥ °dÛå}Xn-¥Þ€™q[àZÁ%¶,’viòì7/ }W¥[7ï¡Ò3<œj#1úQPöÎR÷QÞnÞŽ6•°)|h’ ÈhÛQͼ3„B–\óu‘Òw‰‚t\…Æ©*súBU·Žõƒz!Ã9ˆsŒ
+ú°Ü2ZJ½3ã¶Àµ‚KlY$íÒäÙn^ú®J ¶nÞB¥gx48ÕFbô¢ ì¥î£¼Ý¼m+a5RøÐ$Ѷ£šyg…,3¸æë*2"¥ïé ¹
+SUæô…ªn ëõB†sçŠ& ßyDÄ|‚¹Û Û€nùDŠ÷¿X”¶ùáíHo;´åsLk¡»Ùñ3´y³muEÍÁ³ýÁ.ªþóÀç’¤˜¾¦¢?N%µx„ŒÞ‰»Âå²åšÌX¡-Ðá>3ªÉ4MµAéE47K(îqoA»ƒeÿ»ûÐù ß%¿ú—Ipvù0½!u¦m§8¦×íŸÉàrouyì‹•z-zæÇ4µXpj†+»æøGñB+Ï!ŠâÏfÌ/nKÄÍê¿qG蔞ÕÖ]ʾá9DAÙ;KÝGyÜy;Ú<6V‚–TX’ bÅÖÍ£Q”áŽ}Ò‡Ò£á þ(=Òš'5ðƒÕÀþw µµ4ºWË(°z$à™ T<Ê—Òø[.µYsð.·(èÃ#Óh)õÌŒ[†·\bËjºªwл=;ÂÍËBßUi£ÁÖÍ;Bx’·'yëËÛ.
+YfpÍ×UdDJß%
+ÒAr§ªÌ]õ‘$uÝ:
+@Öê… ç Î0T³€ü'À
+endstream endobj 162 0 obj [/ICCBased 170 0 R] endobj 190 0 obj <</CreationDate(D:20090527042239-04'00')/Creator(Adobe Illustrator CS4)/ModDate(D:20090730214335-05'00')/Producer(Adobe PDF library 9.00)/Title(colorbox)>> endobj xref
+0 191
+0000000004 65535 f
+0000000016 00000 n
+0000000076 00000 n
+0000048436 00000 n
+0000000005 00000 f
+0000000006 00000 f
+0000000007 00000 f
+0000000008 00000 f
+0000000009 00000 f
+0000000010 00000 f
+0000000011 00000 f
+0000000012 00000 f
+0000000013 00000 f
+0000000014 00000 f
+0000000015 00000 f
+0000000016 00000 f
+0000000017 00000 f
+0000000018 00000 f
+0000000019 00000 f
+0000000020 00000 f
+0000000021 00000 f
+0000000022 00000 f
+0000000023 00000 f
+0000000024 00000 f
+0000000025 00000 f
+0000000026 00000 f
+0000000027 00000 f
+0000000028 00000 f
+0000000029 00000 f
+0000000030 00000 f
+0000000031 00000 f
+0000000032 00000 f
+0000000033 00000 f
+0000000034 00000 f
+0000000035 00000 f
+0000000036 00000 f
+0000000037 00000 f
+0000000038 00000 f
+0000000039 00000 f
+0000000040 00000 f
+0000000041 00000 f
+0000000042 00000 f
+0000000043 00000 f
+0000000044 00000 f
+0000000045 00000 f
+0000000046 00000 f
+0000000047 00000 f
+0000000048 00000 f
+0000000049 00000 f
+0000000050 00000 f
+0000000051 00000 f
+0000000052 00000 f
+0000000053 00000 f
+0000000054 00000 f
+0000000055 00000 f
+0000000056 00000 f
+0000000057 00000 f
+0000000058 00000 f
+0000000059 00000 f
+0000000060 00000 f
+0000000061 00000 f
+0000000062 00000 f
+0000000063 00000 f
+0000000064 00000 f
+0000000065 00000 f
+0000000066 00000 f
+0000000067 00000 f
+0000000068 00000 f
+0000000069 00000 f
+0000000070 00000 f
+0000000071 00000 f
+0000000072 00000 f
+0000000073 00000 f
+0000000074 00000 f
+0000000075 00000 f
+0000000076 00000 f
+0000000077 00000 f
+0000000078 00000 f
+0000000079 00000 f
+0000000080 00000 f
+0000000081 00000 f
+0000000082 00000 f
+0000000083 00000 f
+0000000084 00000 f
+0000000085 00000 f
+0000000086 00000 f
+0000000087 00000 f
+0000000088 00000 f
+0000000089 00000 f
+0000000090 00000 f
+0000000091 00000 f
+0000000092 00000 f
+0000000093 00000 f
+0000000094 00000 f
+0000000095 00000 f
+0000000096 00000 f
+0000000097 00000 f
+0000000098 00000 f
+0000000099 00000 f
+0000000100 00000 f
+0000000101 00000 f
+0000000102 00000 f
+0000000103 00000 f
+0000000104 00000 f
+0000000105 00000 f
+0000000106 00000 f
+0000000107 00000 f
+0000000108 00000 f
+0000000109 00000 f
+0000000110 00000 f
+0000000111 00000 f
+0000000112 00000 f
+0000000113 00000 f
+0000000114 00000 f
+0000000115 00000 f
+0000000117 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000051202 00000 n
+0000048489 00000 n
+0000048844 00000 n
+0000049045 00000 n
+0000061445 00000 n
+0000058207 00000 n
+0000050103 00000 n
+0000049109 00000 n
+0000231123 00000 n
+0000049538 00000 n
+0000049588 00000 n
+0000055520 00000 n
+0000055406 00000 n
+0000051720 00000 n
+0000051805 00000 n
+0000052189 00000 n
+0000055557 00000 n
+0000058244 00000 n
+0000061521 00000 n
+0000062006 00000 n
+0000062952 00000 n
+0000069751 00000 n
+0000084919 00000 n
+0000102822 00000 n
+0000111395 00000 n
+0000126519 00000 n
+0000132206 00000 n
+0000141391 00000 n
+0000143749 00000 n
+0000159943 00000 n
+0000177431 00000 n
+0000183301 00000 n
+0000187819 00000 n
+0000205653 00000 n
+0000220229 00000 n
+0000227091 00000 n
+0000231160 00000 n
+trailer
+<</Size 191/Root 1 0 R/Info 190 0 R/ID[<7EB5FF43BD08164184F35B8300F050C9><E617EB833E197F43BC059F7255614CEE>]>>
+startxref
+231333
+%%EOF
diff --git a/library/colorbox/colorbox.css b/library/colorbox/colorbox.css
new file mode 100644
index 000000000..544a76f3b
--- /dev/null
+++ b/library/colorbox/colorbox.css
@@ -0,0 +1,52 @@
+/*
+ ColorBox Core Style:
+ The following CSS is consistent between example themes and should not be altered.
+*/
+#colorbox, #cboxOverlay, #cboxWrapper{position:absolute; top:0; left:0; z-index:9999; overflow:hidden;}
+#cboxOverlay{position:fixed; width:100%; height:100%;}
+#cboxMiddleLeft, #cboxBottomLeft{clear:left;}
+#cboxContent{position:relative;}
+#cboxLoadedContent{overflow:auto;}
+#cboxTitle{margin:0;}
+#cboxLoadingOverlay, #cboxLoadingGraphic{position:absolute; top:0; left:0; width:100%; height:100%;}
+#cboxPrevious, #cboxNext, #cboxClose, #cboxSlideshow{cursor:pointer;}
+.cboxPhoto{float:left; margin:auto; border:0; display:block; max-width:none;}
+.cboxIframe{width:100%; height:100%; display:block; border:0;}
+#colorbox, #cboxContent, #cboxLoadedContent{box-sizing:content-box; -moz-box-sizing:content-box; -webkit-box-sizing:content-box;}
+
+/*
+ User Style:
+ Change the following styles to modify the appearance of ColorBox. They are
+ ordered & tabbed in a way that represents the nesting of the generated HTML.
+*/
+#cboxOverlay{background:#000;}
+#colorbox{}
+ #cboxTopLeft{width:14px; height:14px; background:url(images/controls.png) no-repeat 0 0;}
+ #cboxTopCenter{height:14px; background:url(images/border.png) repeat-x top left;}
+ #cboxTopRight{width:14px; height:14px; background:url(images/controls.png) no-repeat -36px 0;}
+ #cboxBottomLeft{width:14px; height:43px; background:url(images/controls.png) no-repeat 0 -32px;}
+ #cboxBottomCenter{height:43px; background:url(images/border.png) repeat-x bottom left;}
+ #cboxBottomRight{width:14px; height:43px; background:url(images/controls.png) no-repeat -36px -32px;}
+ #cboxMiddleLeft{width:14px; background:url(images/controls.png) repeat-y -175px 0;}
+ #cboxMiddleRight{width:14px; background:url(images/controls.png) repeat-y -211px 0;}
+ #cboxContent{background:#fff; overflow:visible;}
+ .cboxIframe{background:#fff;}
+ #cboxError{padding:50px; border:1px solid #ccc;}
+ #cboxLoadedContent{margin-bottom:5px;}
+ #cboxLoadingOverlay{background:url(images/loading_background.png) no-repeat center center;}
+ #cboxLoadingGraphic{background:url(images/loading.gif) no-repeat center center;}
+ #cboxTitle{position:absolute; bottom:-25px; left:0; text-align:center; width:100%; font-weight:bold; color:#7C7C7C;}
+ #cboxCurrent{position:absolute; bottom:-25px; left:58px; font-weight:bold; color:#7C7C7C;}
+
+ #cboxPrevious, #cboxNext, #cboxClose, #cboxSlideshow{position:absolute; bottom:-29px; background:url(images/controls.png) no-repeat 0px 0px; width:23px; height:23px; text-indent:-9999px;}
+ #cboxPrevious{left:0px; background-position: -51px -25px;}
+ #cboxPrevious:hover{background-position:-51px 0px;}
+ #cboxNext{left:27px; background-position:-75px -25px;}
+ #cboxNext:hover{background-position:-75px 0px;}
+ #cboxClose{right:0; background-position:-100px -25px;}
+ #cboxClose:hover{background-position:-100px 0px;}
+
+ .cboxSlideshow_on #cboxSlideshow{background-position:-125px 0px; right:27px;}
+ .cboxSlideshow_on #cboxSlideshow:hover{background-position:-150px 0px;}
+ .cboxSlideshow_off #cboxSlideshow{background-position:-150px -25px; right:27px;}
+ .cboxSlideshow_off #cboxSlideshow:hover{background-position:-125px 0px;} \ No newline at end of file
diff --git a/library/colorbox/colorbox.jquery.json b/library/colorbox/colorbox.jquery.json
new file mode 100644
index 000000000..dd517a5f4
--- /dev/null
+++ b/library/colorbox/colorbox.jquery.json
@@ -0,0 +1,30 @@
+{
+ "name": "colorbox",
+ "title": "ColorBox",
+ "description": "A lightweight customizable lightbox plugin",
+ "keywords": [
+ "modal",
+ "lightbox",
+ "window",
+ "popup",
+ "ui"
+ ],
+ "version": "1.3.32",
+ "author": {
+ "name": "Jack Moore",
+ "url": "http://www.jacklmoore.com",
+ "email": "jack@colorpowered.com"
+ },
+ "licenses": [
+ {
+ "type": "MIT",
+ "url": "http://www.opensource.org/licenses/mit-license.php"
+ }
+ ],
+ "homepage": "http://jacklmoore.com/colorbox",
+ "demo": "http://jacklmoore.com/colorbox",
+ "download": "http://jacklmoore.com/colorbox/colorbox.zip",
+ "dependencies": {
+ "jquery": ">=1.3.2"
+ }
+} \ No newline at end of file
diff --git a/library/colorbox/component.json b/library/colorbox/component.json
new file mode 100644
index 000000000..171764fbf
--- /dev/null
+++ b/library/colorbox/component.json
@@ -0,0 +1,8 @@
+{
+ "name": "jquery-autosize",
+ "version": "1.3.32",
+ "main": "./jquery.autosize.js",
+ "dependencies": {
+ "jquery": ">=1.3.2"
+ }
+} \ No newline at end of file
diff --git a/library/colorbox/content/ajax.html b/library/colorbox/content/ajax.html
new file mode 100644
index 000000000..e772638ad
--- /dev/null
+++ b/library/colorbox/content/ajax.html
@@ -0,0 +1,11 @@
+<div id='homer' style="background:url(../content/homer.jpg) right center no-repeat #ececec; height:135px; width:280px; padding:30px 10px;">
+ <strong>Homer</strong><br/>
+ <em>\noun\</em><br/>
+ <strong>1.</strong> American bonehead<br/>
+ <strong>2. Pull a Homer-</strong><br/>
+ to succeed despite<br/>
+ idiocy
+</div>
+<script>
+ $('#homer strong').css({color:'red'});
+</script> \ No newline at end of file
diff --git a/library/colorbox/content/homer.jpg b/library/colorbox/content/homer.jpg
new file mode 100644
index 000000000..87ec76c99
--- /dev/null
+++ b/library/colorbox/content/homer.jpg
Binary files differ
diff --git a/library/colorbox/content/marylou.jpg b/library/colorbox/content/marylou.jpg
new file mode 100644
index 000000000..4c717d276
--- /dev/null
+++ b/library/colorbox/content/marylou.jpg
Binary files differ
diff --git a/library/colorbox/content/ohoopee1.jpg b/library/colorbox/content/ohoopee1.jpg
new file mode 100644
index 000000000..aae19a3e6
--- /dev/null
+++ b/library/colorbox/content/ohoopee1.jpg
Binary files differ
diff --git a/library/colorbox/content/ohoopee2.jpg b/library/colorbox/content/ohoopee2.jpg
new file mode 100644
index 000000000..206894489
--- /dev/null
+++ b/library/colorbox/content/ohoopee2.jpg
Binary files differ
diff --git a/library/colorbox/content/ohoopee3.jpg b/library/colorbox/content/ohoopee3.jpg
new file mode 100644
index 000000000..4d64d2400
--- /dev/null
+++ b/library/colorbox/content/ohoopee3.jpg
Binary files differ
diff --git a/library/colorbox/example1/colorbox.css b/library/colorbox/example1/colorbox.css
new file mode 100644
index 000000000..5ee3feba9
--- /dev/null
+++ b/library/colorbox/example1/colorbox.css
@@ -0,0 +1,86 @@
+/*
+ ColorBox Core Style:
+ The following CSS is consistent between example themes and should not be altered.
+*/
+#colorbox, #cboxOverlay, #cboxWrapper{position:absolute; top:0; left:0; z-index:9999; overflow:hidden;}
+#cboxOverlay{position:fixed; width:100%; height:100%;}
+#cboxMiddleLeft, #cboxBottomLeft{clear:left;}
+#cboxContent{position:relative;}
+#cboxLoadedContent{overflow:auto;}
+#cboxTitle{margin:0;}
+#cboxLoadingOverlay, #cboxLoadingGraphic{position:absolute; top:0; left:0; width:100%; height:100%;}
+#cboxPrevious, #cboxNext, #cboxClose, #cboxSlideshow{cursor:pointer;}
+.cboxPhoto{float:left; margin:auto; border:0; display:block; max-width:none;}
+.cboxIframe{width:100%; height:100%; display:block; border:0;}
+#colorbox, #cboxContent, #cboxLoadedContent{box-sizing:content-box; -moz-box-sizing:content-box; -webkit-box-sizing:content-box;}
+
+/*
+ User Style:
+ Change the following styles to modify the appearance of ColorBox. They are
+ ordered & tabbed in a way that represents the nesting of the generated HTML.
+*/
+#cboxOverlay{background:url(images/overlay.png) repeat 0 0;}
+#colorbox{}
+ #cboxTopLeft{width:21px; height:21px; background:url(images/controls.png) no-repeat -101px 0;}
+ #cboxTopRight{width:21px; height:21px; background:url(images/controls.png) no-repeat -130px 0;}
+ #cboxBottomLeft{width:21px; height:21px; background:url(images/controls.png) no-repeat -101px -29px;}
+ #cboxBottomRight{width:21px; height:21px; background:url(images/controls.png) no-repeat -130px -29px;}
+ #cboxMiddleLeft{width:21px; background:url(images/controls.png) left top repeat-y;}
+ #cboxMiddleRight{width:21px; background:url(images/controls.png) right top repeat-y;}
+ #cboxTopCenter{height:21px; background:url(images/border.png) 0 0 repeat-x;}
+ #cboxBottomCenter{height:21px; background:url(images/border.png) 0 -29px repeat-x;}
+ #cboxContent{background:#fff; overflow:hidden;}
+ .cboxIframe{background:#fff;}
+ #cboxError{padding:50px; border:1px solid #ccc;}
+ #cboxLoadedContent{margin-bottom:28px;}
+ #cboxTitle{position:absolute; bottom:4px; left:0; text-align:center; width:100%; color:#949494;}
+ #cboxCurrent{position:absolute; bottom:4px; left:58px; color:#949494;}
+ #cboxSlideshow{position:absolute; bottom:4px; right:30px; color:#0092ef;}
+ #cboxPrevious{position:absolute; bottom:0; left:0; background:url(images/controls.png) no-repeat -75px 0; width:25px; height:25px; text-indent:-9999px;}
+ #cboxPrevious:hover{background-position:-75px -25px;}
+ #cboxNext{position:absolute; bottom:0; left:27px; background:url(images/controls.png) no-repeat -50px 0; width:25px; height:25px; text-indent:-9999px;}
+ #cboxNext:hover{background-position:-50px -25px;}
+ #cboxLoadingOverlay{background:url(images/loading_background.png) no-repeat center center;}
+ #cboxLoadingGraphic{background:url(images/loading.gif) no-repeat center center;}
+ #cboxClose{position:absolute; bottom:0; right:0; background:url(images/controls.png) no-repeat -25px 0; width:25px; height:25px; text-indent:-9999px;}
+ #cboxClose:hover{background-position:-25px -25px;}
+
+/*
+ The following fixes a problem where IE7 and IE8 replace a PNG's alpha transparency with a black fill
+ when an alpha filter (opacity change) is set on the element or ancestor element. This style is not applied to or needed in IE9.
+ See: http://jacklmoore.com/notes/ie-transparency-problems/
+*/
+.cboxIE #cboxTopLeft,
+.cboxIE #cboxTopCenter,
+.cboxIE #cboxTopRight,
+.cboxIE #cboxBottomLeft,
+.cboxIE #cboxBottomCenter,
+.cboxIE #cboxBottomRight,
+.cboxIE #cboxMiddleLeft,
+.cboxIE #cboxMiddleRight {
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#00FFFFFF,endColorstr=#00FFFFFF);
+}
+
+/*
+ The following provides PNG transparency support for IE6
+ Feel free to remove this and the /ie6/ directory if you have dropped IE6 support.
+*/
+.cboxIE6 #cboxTopLeft{background:url(images/ie6/borderTopLeft.png);}
+.cboxIE6 #cboxTopCenter{background:url(images/ie6/borderTopCenter.png);}
+.cboxIE6 #cboxTopRight{background:url(images/ie6/borderTopRight.png);}
+.cboxIE6 #cboxBottomLeft{background:url(images/ie6/borderBottomLeft.png);}
+.cboxIE6 #cboxBottomCenter{background:url(images/ie6/borderBottomCenter.png);}
+.cboxIE6 #cboxBottomRight{background:url(images/ie6/borderBottomRight.png);}
+.cboxIE6 #cboxMiddleLeft{background:url(images/ie6/borderMiddleLeft.png);}
+.cboxIE6 #cboxMiddleRight{background:url(images/ie6/borderMiddleRight.png);}
+
+.cboxIE6 #cboxTopLeft,
+.cboxIE6 #cboxTopCenter,
+.cboxIE6 #cboxTopRight,
+.cboxIE6 #cboxBottomLeft,
+.cboxIE6 #cboxBottomCenter,
+.cboxIE6 #cboxBottomRight,
+.cboxIE6 #cboxMiddleLeft,
+.cboxIE6 #cboxMiddleRight {
+ _behavior: expression(this.src = this.src ? this.src : this.currentStyle.backgroundImage.split('"')[1], this.style.background = "none", this.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src=" + this.src + ", sizingMethod='scale')");
+}
diff --git a/library/colorbox/example1/images/border.png b/library/colorbox/example1/images/border.png
new file mode 100644
index 000000000..f463a10d8
--- /dev/null
+++ b/library/colorbox/example1/images/border.png
Binary files differ
diff --git a/library/colorbox/example1/images/controls.png b/library/colorbox/example1/images/controls.png
new file mode 100644
index 000000000..dcfd6fb9f
--- /dev/null
+++ b/library/colorbox/example1/images/controls.png
Binary files differ
diff --git a/library/colorbox/example1/images/ie6/borderBottomCenter.png b/library/colorbox/example1/images/ie6/borderBottomCenter.png
new file mode 100644
index 000000000..0d4475edf
--- /dev/null
+++ b/library/colorbox/example1/images/ie6/borderBottomCenter.png
Binary files differ
diff --git a/library/colorbox/example1/images/ie6/borderBottomLeft.png b/library/colorbox/example1/images/ie6/borderBottomLeft.png
new file mode 100644
index 000000000..2775eba89
--- /dev/null
+++ b/library/colorbox/example1/images/ie6/borderBottomLeft.png
Binary files differ
diff --git a/library/colorbox/example1/images/ie6/borderBottomRight.png b/library/colorbox/example1/images/ie6/borderBottomRight.png
new file mode 100644
index 000000000..f7f51379c
--- /dev/null
+++ b/library/colorbox/example1/images/ie6/borderBottomRight.png
Binary files differ
diff --git a/library/colorbox/example1/images/ie6/borderMiddleLeft.png b/library/colorbox/example1/images/ie6/borderMiddleLeft.png
new file mode 100644
index 000000000..a2d63d156
--- /dev/null
+++ b/library/colorbox/example1/images/ie6/borderMiddleLeft.png
Binary files differ
diff --git a/library/colorbox/example1/images/ie6/borderMiddleRight.png b/library/colorbox/example1/images/ie6/borderMiddleRight.png
new file mode 100644
index 000000000..fd7c3e849
--- /dev/null
+++ b/library/colorbox/example1/images/ie6/borderMiddleRight.png
Binary files differ
diff --git a/library/colorbox/example1/images/ie6/borderTopCenter.png b/library/colorbox/example1/images/ie6/borderTopCenter.png
new file mode 100644
index 000000000..2937a9cf9
--- /dev/null
+++ b/library/colorbox/example1/images/ie6/borderTopCenter.png
Binary files differ
diff --git a/library/colorbox/example1/images/ie6/borderTopLeft.png b/library/colorbox/example1/images/ie6/borderTopLeft.png
new file mode 100644
index 000000000..f9d458b5b
--- /dev/null
+++ b/library/colorbox/example1/images/ie6/borderTopLeft.png
Binary files differ
diff --git a/library/colorbox/example1/images/ie6/borderTopRight.png b/library/colorbox/example1/images/ie6/borderTopRight.png
new file mode 100644
index 000000000..74b8583cf
--- /dev/null
+++ b/library/colorbox/example1/images/ie6/borderTopRight.png
Binary files differ
diff --git a/library/colorbox/example1/images/loading.gif b/library/colorbox/example1/images/loading.gif
new file mode 100644
index 000000000..b4695d811
--- /dev/null
+++ b/library/colorbox/example1/images/loading.gif
Binary files differ
diff --git a/library/colorbox/example1/images/loading_background.png b/library/colorbox/example1/images/loading_background.png
new file mode 100644
index 000000000..6ae83e697
--- /dev/null
+++ b/library/colorbox/example1/images/loading_background.png
Binary files differ
diff --git a/library/colorbox/example1/images/overlay.png b/library/colorbox/example1/images/overlay.png
new file mode 100644
index 000000000..53ea98f70
--- /dev/null
+++ b/library/colorbox/example1/images/overlay.png
Binary files differ
diff --git a/library/colorbox/example1/index.html b/library/colorbox/example1/index.html
new file mode 100644
index 000000000..727fe78d7
--- /dev/null
+++ b/library/colorbox/example1/index.html
@@ -0,0 +1,87 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset='utf-8'/>
+ <title>ColorBox Examples</title>
+ <style>
+ body{font:12px/1.2 Verdana, sans-serif; padding:0 10px;}
+ a:link, a:visited{text-decoration:none; color:#416CE5; border-bottom:1px solid #416CE5;}
+ h2{font-size:13px; margin:15px 0 0 0;}
+ </style>
+ <link rel="stylesheet" href="colorbox.css" />
+ <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"></script>
+ <script src="../jquery.colorbox.js"></script>
+ <script>
+ $(document).ready(function(){
+ //Examples of how to assign the ColorBox event to elements
+ $(".group1").colorbox({rel:'group1'});
+ $(".group2").colorbox({rel:'group2', transition:"fade"});
+ $(".group3").colorbox({rel:'group3', transition:"none", width:"75%", height:"75%"});
+ $(".group4").colorbox({rel:'group4', slideshow:true});
+ $(".ajax").colorbox();
+ $(".youtube").colorbox({iframe:true, innerWidth:425, innerHeight:344});
+ $(".vimeo").colorbox({iframe:true, innerWidth:500, innerHeight:409});
+ $(".iframe").colorbox({iframe:true, width:"80%", height:"80%"});
+ $(".inline").colorbox({inline:true, width:"50%"});
+ $(".callbacks").colorbox({
+ onOpen:function(){ alert('onOpen: colorbox is about to open'); },
+ onLoad:function(){ alert('onLoad: colorbox has started to load the targeted content'); },
+ onComplete:function(){ alert('onComplete: colorbox has displayed the loaded content'); },
+ onCleanup:function(){ alert('onCleanup: colorbox has begun the close process'); },
+ onClosed:function(){ alert('onClosed: colorbox has completely closed'); }
+ });
+
+ //Example of preserving a JavaScript event for inline calls.
+ $("#click").click(function(){
+ $('#click').css({"background-color":"#f00", "color":"#fff", "cursor":"inherit"}).text("Open this window again and this message will still be here.");
+ return false;
+ });
+ });
+ </script>
+ </head>
+ <body>
+ <h1>ColorBox Demonstration</h1>
+ <h2>Elastic Transition</h2>
+ <p><a class="group1" href="../content/ohoopee1.jpg" title="Me and my grandfather on the Ohoopee.">Grouped Photo 1</a></p>
+ <p><a class="group1" href="../content/ohoopee2.jpg" title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+ <p><a class="group1" href="../content/ohoopee3.jpg" title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+
+ <h2>Fade Transition</h2>
+ <p><a class="group2" href="../content/ohoopee1.jpg" title="Me and my grandfather on the Ohoopee">Grouped Photo 1</a></p>
+ <p><a class="group2" href="../content/ohoopee2.jpg" title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+ <p><a class="group2" href="../content/ohoopee3.jpg" title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+
+ <h2>No Transition + fixed width and height (75% of screen size)</h2>
+ <p><a class="group3" href="../content/ohoopee1.jpg" title="Me and my grandfather on the Ohoopee.">Grouped Photo 1</a></p>
+ <p><a class="group3" href="../content/ohoopee2.jpg" title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+ <p><a class="group3" href="../content/ohoopee3.jpg" title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+
+ <h2>Slideshow</h2>
+ <p><a class="group4" href="../content/ohoopee1.jpg" title="Me and my grandfather on the Ohoopee.">Grouped Photo 1</a></p>
+ <p><a class="group4" href="../content/ohoopee2.jpg" title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+ <p><a class="group4" href="../content/ohoopee3.jpg" title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+
+ <h2>Other Content Types</h2>
+ <p><a class='ajax' href="../content/ajax.html" title="Homer Defined">Outside HTML (Ajax)</a></p>
+ <p><a class='youtube' href="http://www.youtube.com/embed/617ANIA5Rqs?rel=0&amp;wmode=transparent" title="The Knife: We Share Our Mother's Health">Flash / Video (Iframe/Direct Link To YouTube)</a></p>
+ <p><a class='vimeo' href="http://player.vimeo.com/video/2285902" title="R&ouml;yksopp: Remind Me">Flash / Video (Iframe/Direct Link To Vimeo)</a></p>
+ <p><a class='iframe' href="http://wikipedia.com">Outside Webpage (Iframe)</a></p>
+ <p><a class='inline' href="#inline_content">Inline HTML</a></p>
+
+ <h2>Demonstration of using callbacks</h2>
+ <p><a class='callbacks' href="../content/marylou.jpg" title="Marylou on Cumberland Island">Example with alerts</a>. Callbacks and event-hooks allow users to extend functionality without having to rewrite parts of the plugin.</p>
+
+ <!-- This contains the hidden content for inline calls -->
+ <div style='display:none'>
+ <div id='inline_content' style='padding:10px; background:#fff;'>
+ <p><strong>This content comes from a hidden element on this page.</strong></p>
+ <p>The inline option preserves bound JavaScript events and changes, and it puts the content back where it came from when it is closed.</p>
+ <p><a id="click" href="#" style='padding:5px; background:#ccc;'>Click me, it will be preserved!</a></p>
+
+ <p><strong>If you try to open a new ColorBox while it is already open, it will update itself with the new content.</strong></p>
+ <p>Updating Content Example:<br />
+ <a class="ajax" href="../content/ajax.html">Click here to load new content</a></p>
+ </div>
+ </div>
+ </body>
+</html> \ No newline at end of file
diff --git a/library/colorbox/example2/colorbox.css b/library/colorbox/example2/colorbox.css
new file mode 100644
index 000000000..3bb3d8121
--- /dev/null
+++ b/library/colorbox/example2/colorbox.css
@@ -0,0 +1,43 @@
+/*
+ ColorBox Core Style:
+ The following CSS is consistent between example themes and should not be altered.
+*/
+#colorbox, #cboxOverlay, #cboxWrapper{position:absolute; top:0; left:0; z-index:9999; overflow:hidden;}
+#cboxOverlay{position:fixed; width:100%; height:100%;}
+#cboxMiddleLeft, #cboxBottomLeft{clear:left;}
+#cboxContent{position:relative;}
+#cboxLoadedContent{overflow:auto;}
+#cboxTitle{margin:0;}
+#cboxLoadingOverlay, #cboxLoadingGraphic{position:absolute; top:0; left:0; width:100%; height:100%;}
+#cboxPrevious, #cboxNext, #cboxClose, #cboxSlideshow{cursor:pointer;}
+.cboxPhoto{float:left; margin:auto; border:0; display:block; max-width:none;}
+.cboxIframe{width:100%; height:100%; display:block; border:0;}
+#colorbox, #cboxContent, #cboxLoadedContent{box-sizing:content-box; -moz-box-sizing:content-box; -webkit-box-sizing:content-box;}
+
+/*
+ User Style:
+ Change the following styles to modify the appearance of ColorBox. They are
+ ordered & tabbed in a way that represents the nesting of the generated HTML.
+*/
+#cboxOverlay{background:#fff;}
+#colorbox{}
+ #cboxContent{margin-top:32px; overflow:visible;}
+ .cboxIframe{background:#fff;}
+ #cboxError{padding:50px; border:1px solid #ccc;}
+ #cboxLoadedContent{background:#000; padding:1px;}
+ #cboxLoadingGraphic{background:url(images/loading.gif) no-repeat center center;}
+ #cboxLoadingOverlay{background:#000;}
+ #cboxTitle{position:absolute; top:-22px; left:0; color:#000;}
+ #cboxCurrent{position:absolute; top:-22px; right:205px; text-indent:-9999px;}
+ #cboxSlideshow, #cboxPrevious, #cboxNext, #cboxClose{text-indent:-9999px; width:20px; height:20px; position:absolute; top:-20px; background:url(images/controls.png) no-repeat 0 0;}
+ #cboxPrevious{background-position:0px 0px; right:44px;}
+ #cboxPrevious:hover{background-position:0px -25px;}
+ #cboxNext{background-position:-25px 0px; right:22px;}
+ #cboxNext:hover{background-position:-25px -25px;}
+ #cboxClose{background-position:-50px 0px; right:0;}
+ #cboxClose:hover{background-position:-50px -25px;}
+ .cboxSlideshow_on #cboxPrevious, .cboxSlideshow_off #cboxPrevious{right:66px;}
+ .cboxSlideshow_on #cboxSlideshow{background-position:-75px -25px; right:44px;}
+ .cboxSlideshow_on #cboxSlideshow:hover{background-position:-100px -25px;}
+ .cboxSlideshow_off #cboxSlideshow{background-position:-100px 0px; right:44px;}
+ .cboxSlideshow_off #cboxSlideshow:hover{background-position:-75px -25px;}
diff --git a/library/colorbox/example2/images/controls.png b/library/colorbox/example2/images/controls.png
new file mode 100644
index 000000000..8569b57f1
--- /dev/null
+++ b/library/colorbox/example2/images/controls.png
Binary files differ
diff --git a/library/colorbox/example2/images/loading.gif b/library/colorbox/example2/images/loading.gif
new file mode 100644
index 000000000..19c67bbd0
--- /dev/null
+++ b/library/colorbox/example2/images/loading.gif
Binary files differ
diff --git a/library/colorbox/example2/index.html b/library/colorbox/example2/index.html
new file mode 100644
index 000000000..727fe78d7
--- /dev/null
+++ b/library/colorbox/example2/index.html
@@ -0,0 +1,87 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset='utf-8'/>
+ <title>ColorBox Examples</title>
+ <style>
+ body{font:12px/1.2 Verdana, sans-serif; padding:0 10px;}
+ a:link, a:visited{text-decoration:none; color:#416CE5; border-bottom:1px solid #416CE5;}
+ h2{font-size:13px; margin:15px 0 0 0;}
+ </style>
+ <link rel="stylesheet" href="colorbox.css" />
+ <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"></script>
+ <script src="../jquery.colorbox.js"></script>
+ <script>
+ $(document).ready(function(){
+ //Examples of how to assign the ColorBox event to elements
+ $(".group1").colorbox({rel:'group1'});
+ $(".group2").colorbox({rel:'group2', transition:"fade"});
+ $(".group3").colorbox({rel:'group3', transition:"none", width:"75%", height:"75%"});
+ $(".group4").colorbox({rel:'group4', slideshow:true});
+ $(".ajax").colorbox();
+ $(".youtube").colorbox({iframe:true, innerWidth:425, innerHeight:344});
+ $(".vimeo").colorbox({iframe:true, innerWidth:500, innerHeight:409});
+ $(".iframe").colorbox({iframe:true, width:"80%", height:"80%"});
+ $(".inline").colorbox({inline:true, width:"50%"});
+ $(".callbacks").colorbox({
+ onOpen:function(){ alert('onOpen: colorbox is about to open'); },
+ onLoad:function(){ alert('onLoad: colorbox has started to load the targeted content'); },
+ onComplete:function(){ alert('onComplete: colorbox has displayed the loaded content'); },
+ onCleanup:function(){ alert('onCleanup: colorbox has begun the close process'); },
+ onClosed:function(){ alert('onClosed: colorbox has completely closed'); }
+ });
+
+ //Example of preserving a JavaScript event for inline calls.
+ $("#click").click(function(){
+ $('#click').css({"background-color":"#f00", "color":"#fff", "cursor":"inherit"}).text("Open this window again and this message will still be here.");
+ return false;
+ });
+ });
+ </script>
+ </head>
+ <body>
+ <h1>ColorBox Demonstration</h1>
+ <h2>Elastic Transition</h2>
+ <p><a class="group1" href="../content/ohoopee1.jpg" title="Me and my grandfather on the Ohoopee.">Grouped Photo 1</a></p>
+ <p><a class="group1" href="../content/ohoopee2.jpg" title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+ <p><a class="group1" href="../content/ohoopee3.jpg" title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+
+ <h2>Fade Transition</h2>
+ <p><a class="group2" href="../content/ohoopee1.jpg" title="Me and my grandfather on the Ohoopee">Grouped Photo 1</a></p>
+ <p><a class="group2" href="../content/ohoopee2.jpg" title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+ <p><a class="group2" href="../content/ohoopee3.jpg" title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+
+ <h2>No Transition + fixed width and height (75% of screen size)</h2>
+ <p><a class="group3" href="../content/ohoopee1.jpg" title="Me and my grandfather on the Ohoopee.">Grouped Photo 1</a></p>
+ <p><a class="group3" href="../content/ohoopee2.jpg" title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+ <p><a class="group3" href="../content/ohoopee3.jpg" title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+
+ <h2>Slideshow</h2>
+ <p><a class="group4" href="../content/ohoopee1.jpg" title="Me and my grandfather on the Ohoopee.">Grouped Photo 1</a></p>
+ <p><a class="group4" href="../content/ohoopee2.jpg" title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+ <p><a class="group4" href="../content/ohoopee3.jpg" title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+
+ <h2>Other Content Types</h2>
+ <p><a class='ajax' href="../content/ajax.html" title="Homer Defined">Outside HTML (Ajax)</a></p>
+ <p><a class='youtube' href="http://www.youtube.com/embed/617ANIA5Rqs?rel=0&amp;wmode=transparent" title="The Knife: We Share Our Mother's Health">Flash / Video (Iframe/Direct Link To YouTube)</a></p>
+ <p><a class='vimeo' href="http://player.vimeo.com/video/2285902" title="R&ouml;yksopp: Remind Me">Flash / Video (Iframe/Direct Link To Vimeo)</a></p>
+ <p><a class='iframe' href="http://wikipedia.com">Outside Webpage (Iframe)</a></p>
+ <p><a class='inline' href="#inline_content">Inline HTML</a></p>
+
+ <h2>Demonstration of using callbacks</h2>
+ <p><a class='callbacks' href="../content/marylou.jpg" title="Marylou on Cumberland Island">Example with alerts</a>. Callbacks and event-hooks allow users to extend functionality without having to rewrite parts of the plugin.</p>
+
+ <!-- This contains the hidden content for inline calls -->
+ <div style='display:none'>
+ <div id='inline_content' style='padding:10px; background:#fff;'>
+ <p><strong>This content comes from a hidden element on this page.</strong></p>
+ <p>The inline option preserves bound JavaScript events and changes, and it puts the content back where it came from when it is closed.</p>
+ <p><a id="click" href="#" style='padding:5px; background:#ccc;'>Click me, it will be preserved!</a></p>
+
+ <p><strong>If you try to open a new ColorBox while it is already open, it will update itself with the new content.</strong></p>
+ <p>Updating Content Example:<br />
+ <a class="ajax" href="../content/ajax.html">Click here to load new content</a></p>
+ </div>
+ </div>
+ </body>
+</html> \ No newline at end of file
diff --git a/library/colorbox/example3/colorbox.css b/library/colorbox/example3/colorbox.css
new file mode 100644
index 000000000..153e32e6f
--- /dev/null
+++ b/library/colorbox/example3/colorbox.css
@@ -0,0 +1,38 @@
+/*
+ ColorBox Core Style:
+ The following CSS is consistent between example themes and should not be altered.
+*/
+#colorbox, #cboxOverlay, #cboxWrapper{position:absolute; top:0; left:0; z-index:9999; overflow:hidden;}
+#cboxOverlay{position:fixed; width:100%; height:100%;}
+#cboxMiddleLeft, #cboxBottomLeft{clear:left;}
+#cboxContent{position:relative;}
+#cboxLoadedContent{overflow:auto;}
+#cboxTitle{margin:0;}
+#cboxLoadingOverlay, #cboxLoadingGraphic{position:absolute; top:0; left:0; width:100%; height:100%;}
+#cboxPrevious, #cboxNext, #cboxClose, #cboxSlideshow{cursor:pointer;}
+.cboxPhoto{float:left; margin:auto; border:0; display:block; max-width:none;}
+.cboxIframe{width:100%; height:100%; display:block; border:0;}
+#colorbox, #cboxContent, #cboxLoadedContent{box-sizing:content-box; -moz-box-sizing:content-box; -webkit-box-sizing:content-box;}
+
+/*
+ User Style:
+ Change the following styles to modify the appearance of ColorBox. They are
+ ordered & tabbed in a way that represents the nesting of the generated HTML.
+*/
+#cboxOverlay{background:#000;}
+#colorbox{}
+ #cboxContent{margin-top:20px;}
+ .cboxIframe{background:#fff;}
+ #cboxError{padding:50px; border:1px solid #ccc;}
+ #cboxLoadedContent{border:5px solid #000; background:#fff;}
+ #cboxTitle{position:absolute; top:-20px; left:0; color:#ccc;}
+ #cboxCurrent{position:absolute; top:-20px; right:0px; color:#ccc;}
+ #cboxSlideshow{position:absolute; top:-20px; right:90px; color:#fff;}
+ #cboxPrevious{position:absolute; top:50%; left:5px; margin-top:-32px; background:url(images/controls.png) no-repeat top left; width:28px; height:65px; text-indent:-9999px;}
+ #cboxPrevious:hover{background-position:bottom left;}
+ #cboxNext{position:absolute; top:50%; right:5px; margin-top:-32px; background:url(images/controls.png) no-repeat top right; width:28px; height:65px; text-indent:-9999px;}
+ #cboxNext:hover{background-position:bottom right;}
+ #cboxLoadingOverlay{background:#000;}
+ #cboxLoadingGraphic{background:url(images/loading.gif) no-repeat center center;}
+ #cboxClose{position:absolute; top:5px; right:5px; display:block; background:url(images/controls.png) no-repeat top center; width:38px; height:19px; text-indent:-9999px;}
+ #cboxClose:hover{background-position:bottom center;} \ No newline at end of file
diff --git a/library/colorbox/example3/images/controls.png b/library/colorbox/example3/images/controls.png
new file mode 100644
index 000000000..e1e97982a
--- /dev/null
+++ b/library/colorbox/example3/images/controls.png
Binary files differ
diff --git a/library/colorbox/example3/images/loading.gif b/library/colorbox/example3/images/loading.gif
new file mode 100644
index 000000000..19c67bbd0
--- /dev/null
+++ b/library/colorbox/example3/images/loading.gif
Binary files differ
diff --git a/library/colorbox/example3/index.html b/library/colorbox/example3/index.html
new file mode 100644
index 000000000..727fe78d7
--- /dev/null
+++ b/library/colorbox/example3/index.html
@@ -0,0 +1,87 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset='utf-8'/>
+ <title>ColorBox Examples</title>
+ <style>
+ body{font:12px/1.2 Verdana, sans-serif; padding:0 10px;}
+ a:link, a:visited{text-decoration:none; color:#416CE5; border-bottom:1px solid #416CE5;}
+ h2{font-size:13px; margin:15px 0 0 0;}
+ </style>
+ <link rel="stylesheet" href="colorbox.css" />
+ <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"></script>
+ <script src="../jquery.colorbox.js"></script>
+ <script>
+ $(document).ready(function(){
+ //Examples of how to assign the ColorBox event to elements
+ $(".group1").colorbox({rel:'group1'});
+ $(".group2").colorbox({rel:'group2', transition:"fade"});
+ $(".group3").colorbox({rel:'group3', transition:"none", width:"75%", height:"75%"});
+ $(".group4").colorbox({rel:'group4', slideshow:true});
+ $(".ajax").colorbox();
+ $(".youtube").colorbox({iframe:true, innerWidth:425, innerHeight:344});
+ $(".vimeo").colorbox({iframe:true, innerWidth:500, innerHeight:409});
+ $(".iframe").colorbox({iframe:true, width:"80%", height:"80%"});
+ $(".inline").colorbox({inline:true, width:"50%"});
+ $(".callbacks").colorbox({
+ onOpen:function(){ alert('onOpen: colorbox is about to open'); },
+ onLoad:function(){ alert('onLoad: colorbox has started to load the targeted content'); },
+ onComplete:function(){ alert('onComplete: colorbox has displayed the loaded content'); },
+ onCleanup:function(){ alert('onCleanup: colorbox has begun the close process'); },
+ onClosed:function(){ alert('onClosed: colorbox has completely closed'); }
+ });
+
+ //Example of preserving a JavaScript event for inline calls.
+ $("#click").click(function(){
+ $('#click').css({"background-color":"#f00", "color":"#fff", "cursor":"inherit"}).text("Open this window again and this message will still be here.");
+ return false;
+ });
+ });
+ </script>
+ </head>
+ <body>
+ <h1>ColorBox Demonstration</h1>
+ <h2>Elastic Transition</h2>
+ <p><a class="group1" href="../content/ohoopee1.jpg" title="Me and my grandfather on the Ohoopee.">Grouped Photo 1</a></p>
+ <p><a class="group1" href="../content/ohoopee2.jpg" title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+ <p><a class="group1" href="../content/ohoopee3.jpg" title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+
+ <h2>Fade Transition</h2>
+ <p><a class="group2" href="../content/ohoopee1.jpg" title="Me and my grandfather on the Ohoopee">Grouped Photo 1</a></p>
+ <p><a class="group2" href="../content/ohoopee2.jpg" title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+ <p><a class="group2" href="../content/ohoopee3.jpg" title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+
+ <h2>No Transition + fixed width and height (75% of screen size)</h2>
+ <p><a class="group3" href="../content/ohoopee1.jpg" title="Me and my grandfather on the Ohoopee.">Grouped Photo 1</a></p>
+ <p><a class="group3" href="../content/ohoopee2.jpg" title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+ <p><a class="group3" href="../content/ohoopee3.jpg" title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+
+ <h2>Slideshow</h2>
+ <p><a class="group4" href="../content/ohoopee1.jpg" title="Me and my grandfather on the Ohoopee.">Grouped Photo 1</a></p>
+ <p><a class="group4" href="../content/ohoopee2.jpg" title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+ <p><a class="group4" href="../content/ohoopee3.jpg" title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+
+ <h2>Other Content Types</h2>
+ <p><a class='ajax' href="../content/ajax.html" title="Homer Defined">Outside HTML (Ajax)</a></p>
+ <p><a class='youtube' href="http://www.youtube.com/embed/617ANIA5Rqs?rel=0&amp;wmode=transparent" title="The Knife: We Share Our Mother's Health">Flash / Video (Iframe/Direct Link To YouTube)</a></p>
+ <p><a class='vimeo' href="http://player.vimeo.com/video/2285902" title="R&ouml;yksopp: Remind Me">Flash / Video (Iframe/Direct Link To Vimeo)</a></p>
+ <p><a class='iframe' href="http://wikipedia.com">Outside Webpage (Iframe)</a></p>
+ <p><a class='inline' href="#inline_content">Inline HTML</a></p>
+
+ <h2>Demonstration of using callbacks</h2>
+ <p><a class='callbacks' href="../content/marylou.jpg" title="Marylou on Cumberland Island">Example with alerts</a>. Callbacks and event-hooks allow users to extend functionality without having to rewrite parts of the plugin.</p>
+
+ <!-- This contains the hidden content for inline calls -->
+ <div style='display:none'>
+ <div id='inline_content' style='padding:10px; background:#fff;'>
+ <p><strong>This content comes from a hidden element on this page.</strong></p>
+ <p>The inline option preserves bound JavaScript events and changes, and it puts the content back where it came from when it is closed.</p>
+ <p><a id="click" href="#" style='padding:5px; background:#ccc;'>Click me, it will be preserved!</a></p>
+
+ <p><strong>If you try to open a new ColorBox while it is already open, it will update itself with the new content.</strong></p>
+ <p>Updating Content Example:<br />
+ <a class="ajax" href="../content/ajax.html">Click here to load new content</a></p>
+ </div>
+ </div>
+ </body>
+</html> \ No newline at end of file
diff --git a/library/colorbox/example4/colorbox.css b/library/colorbox/example4/colorbox.css
new file mode 100644
index 000000000..54560688a
--- /dev/null
+++ b/library/colorbox/example4/colorbox.css
@@ -0,0 +1,82 @@
+/*
+ ColorBox Core Style:
+ The following CSS is consistent between example themes and should not be altered.
+*/
+#colorbox, #cboxOverlay, #cboxWrapper{position:absolute; top:0; left:0; z-index:9999; overflow:hidden;}
+#cboxOverlay{position:fixed; width:100%; height:100%;}
+#cboxMiddleLeft, #cboxBottomLeft{clear:left;}
+#cboxContent{position:relative;}
+#cboxLoadedContent{overflow:auto;}
+#cboxTitle{margin:0;}
+#cboxLoadingOverlay, #cboxLoadingGraphic{position:absolute; top:0; left:0; width:100%; height:100%;}
+#cboxPrevious, #cboxNext, #cboxClose, #cboxSlideshow{cursor:pointer;}
+.cboxPhoto{float:left; margin:auto; border:0; display:block; max-width:none;}
+.cboxIframe{width:100%; height:100%; display:block; border:0;}
+#colorbox, #cboxContent, #cboxLoadedContent{box-sizing:content-box; -moz-box-sizing:content-box; -webkit-box-sizing:content-box;}
+
+/*
+ User Style:
+ Change the following styles to modify the appearance of ColorBox. They are
+ ordered & tabbed in a way that represents the nesting of the generated HTML.
+*/
+#cboxOverlay{background:#fff;}
+#colorbox{}
+ #cboxTopLeft{width:25px; height:25px; background:url(images/border1.png) no-repeat 0 0;}
+ #cboxTopCenter{height:25px; background:url(images/border1.png) repeat-x 0 -50px;}
+ #cboxTopRight{width:25px; height:25px; background:url(images/border1.png) no-repeat -25px 0;}
+ #cboxBottomLeft{width:25px; height:25px; background:url(images/border1.png) no-repeat 0 -25px;}
+ #cboxBottomCenter{height:25px; background:url(images/border1.png) repeat-x 0 -75px;}
+ #cboxBottomRight{width:25px; height:25px; background:url(images/border1.png) no-repeat -25px -25px;}
+ #cboxMiddleLeft{width:25px; background:url(images/border2.png) repeat-y 0 0;}
+ #cboxMiddleRight{width:25px; background:url(images/border2.png) repeat-y -25px 0;}
+ #cboxContent{background:#fff; overflow:hidden;}
+ .cboxIframe{background:#fff;}
+ #cboxError{padding:50px; border:1px solid #ccc;}
+ #cboxLoadedContent{margin-bottom:20px;}
+ #cboxTitle{position:absolute; bottom:0px; left:0; text-align:center; width:100%; color:#999;}
+ #cboxCurrent{position:absolute; bottom:0px; left:100px; color:#999;}
+ #cboxSlideshow{position:absolute; bottom:0px; right:42px; color:#444;}
+ #cboxPrevious{position:absolute; bottom:0px; left:0; color:#444;}
+ #cboxNext{position:absolute; bottom:0px; left:63px; color:#444;}
+ #cboxLoadingOverlay{background:#fff url(images/loading.gif) no-repeat 5px 5px;}
+ #cboxClose{position:absolute; bottom:0; right:0; display:block; color:#444;}
+
+/*
+ The following fixes a problem where IE7 and IE8 replace a PNG's alpha transparency with a black fill
+ when an alpha filter (opacity change) is set on the element or ancestor element. This style is not applied to or needed in IE9.
+ See: http://jacklmoore.com/notes/ie-transparency-problems/
+*/
+.cboxIE #cboxTopLeft,
+.cboxIE #cboxTopCenter,
+.cboxIE #cboxTopRight,
+.cboxIE #cboxBottomLeft,
+.cboxIE #cboxBottomCenter,
+.cboxIE #cboxBottomRight,
+.cboxIE #cboxMiddleLeft,
+.cboxIE #cboxMiddleRight {
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#00FFFFFF,endColorstr=#00FFFFFF);
+}
+
+/*
+ The following provides PNG transparency support for IE6
+ Feel free to remove this and the /ie6/ directory if you have dropped IE6 support.
+*/
+.cboxIE6 #cboxTopLeft{background:url(images/ie6/borderTopLeft.png);}
+.cboxIE6 #cboxTopCenter{background:url(images/ie6/borderTopCenter.png);}
+.cboxIE6 #cboxTopRight{background:url(images/ie6/borderTopRight.png);}
+.cboxIE6 #cboxBottomLeft{background:url(images/ie6/borderBottomLeft.png);}
+.cboxIE6 #cboxBottomCenter{background:url(images/ie6/borderBottomCenter.png);}
+.cboxIE6 #cboxBottomRight{background:url(images/ie6/borderBottomRight.png);}
+.cboxIE6 #cboxMiddleLeft{background:url(images/ie6/borderMiddleLeft.png);}
+.cboxIE6 #cboxMiddleRight{background:url(images/ie6/borderMiddleRight.png);}
+
+.cboxIE6 #cboxTopLeft,
+.cboxIE6 #cboxTopCenter,
+.cboxIE6 #cboxTopRight,
+.cboxIE6 #cboxBottomLeft,
+.cboxIE6 #cboxBottomCenter,
+.cboxIE6 #cboxBottomRight,
+.cboxIE6 #cboxMiddleLeft,
+.cboxIE6 #cboxMiddleRight {
+ _behavior: expression(this.src = this.src ? this.src : this.currentStyle.backgroundImage.split('"')[1], this.style.background = "none", this.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src=" + this.src + ", sizingMethod='scale')");
+}
diff --git a/library/colorbox/example4/images/border1.png b/library/colorbox/example4/images/border1.png
new file mode 100644
index 000000000..0ddc70405
--- /dev/null
+++ b/library/colorbox/example4/images/border1.png
Binary files differ
diff --git a/library/colorbox/example4/images/border2.png b/library/colorbox/example4/images/border2.png
new file mode 100644
index 000000000..aa62a0b72
--- /dev/null
+++ b/library/colorbox/example4/images/border2.png
Binary files differ
diff --git a/library/colorbox/example4/images/ie6/borderBottomCenter.png b/library/colorbox/example4/images/ie6/borderBottomCenter.png
new file mode 100644
index 000000000..12e0e9ac0
--- /dev/null
+++ b/library/colorbox/example4/images/ie6/borderBottomCenter.png
Binary files differ
diff --git a/library/colorbox/example4/images/ie6/borderBottomLeft.png b/library/colorbox/example4/images/ie6/borderBottomLeft.png
new file mode 100644
index 000000000..b7a474ae0
--- /dev/null
+++ b/library/colorbox/example4/images/ie6/borderBottomLeft.png
Binary files differ
diff --git a/library/colorbox/example4/images/ie6/borderBottomRight.png b/library/colorbox/example4/images/ie6/borderBottomRight.png
new file mode 100644
index 000000000..6b6cb159b
--- /dev/null
+++ b/library/colorbox/example4/images/ie6/borderBottomRight.png
Binary files differ
diff --git a/library/colorbox/example4/images/ie6/borderMiddleLeft.png b/library/colorbox/example4/images/ie6/borderMiddleLeft.png
new file mode 100644
index 000000000..8d0eb739d
--- /dev/null
+++ b/library/colorbox/example4/images/ie6/borderMiddleLeft.png
Binary files differ
diff --git a/library/colorbox/example4/images/ie6/borderMiddleRight.png b/library/colorbox/example4/images/ie6/borderMiddleRight.png
new file mode 100644
index 000000000..d65509e30
--- /dev/null
+++ b/library/colorbox/example4/images/ie6/borderMiddleRight.png
Binary files differ
diff --git a/library/colorbox/example4/images/ie6/borderTopCenter.png b/library/colorbox/example4/images/ie6/borderTopCenter.png
new file mode 100644
index 000000000..35d8da2d0
--- /dev/null
+++ b/library/colorbox/example4/images/ie6/borderTopCenter.png
Binary files differ
diff --git a/library/colorbox/example4/images/ie6/borderTopLeft.png b/library/colorbox/example4/images/ie6/borderTopLeft.png
new file mode 100644
index 000000000..ae9bda040
--- /dev/null
+++ b/library/colorbox/example4/images/ie6/borderTopLeft.png
Binary files differ
diff --git a/library/colorbox/example4/images/ie6/borderTopRight.png b/library/colorbox/example4/images/ie6/borderTopRight.png
new file mode 100644
index 000000000..0d8868399
--- /dev/null
+++ b/library/colorbox/example4/images/ie6/borderTopRight.png
Binary files differ
diff --git a/library/colorbox/example4/images/loading.gif b/library/colorbox/example4/images/loading.gif
new file mode 100644
index 000000000..602ce3c3a
--- /dev/null
+++ b/library/colorbox/example4/images/loading.gif
Binary files differ
diff --git a/library/colorbox/example4/index.html b/library/colorbox/example4/index.html
new file mode 100644
index 000000000..727fe78d7
--- /dev/null
+++ b/library/colorbox/example4/index.html
@@ -0,0 +1,87 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset='utf-8'/>
+ <title>ColorBox Examples</title>
+ <style>
+ body{font:12px/1.2 Verdana, sans-serif; padding:0 10px;}
+ a:link, a:visited{text-decoration:none; color:#416CE5; border-bottom:1px solid #416CE5;}
+ h2{font-size:13px; margin:15px 0 0 0;}
+ </style>
+ <link rel="stylesheet" href="colorbox.css" />
+ <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"></script>
+ <script src="../jquery.colorbox.js"></script>
+ <script>
+ $(document).ready(function(){
+ //Examples of how to assign the ColorBox event to elements
+ $(".group1").colorbox({rel:'group1'});
+ $(".group2").colorbox({rel:'group2', transition:"fade"});
+ $(".group3").colorbox({rel:'group3', transition:"none", width:"75%", height:"75%"});
+ $(".group4").colorbox({rel:'group4', slideshow:true});
+ $(".ajax").colorbox();
+ $(".youtube").colorbox({iframe:true, innerWidth:425, innerHeight:344});
+ $(".vimeo").colorbox({iframe:true, innerWidth:500, innerHeight:409});
+ $(".iframe").colorbox({iframe:true, width:"80%", height:"80%"});
+ $(".inline").colorbox({inline:true, width:"50%"});
+ $(".callbacks").colorbox({
+ onOpen:function(){ alert('onOpen: colorbox is about to open'); },
+ onLoad:function(){ alert('onLoad: colorbox has started to load the targeted content'); },
+ onComplete:function(){ alert('onComplete: colorbox has displayed the loaded content'); },
+ onCleanup:function(){ alert('onCleanup: colorbox has begun the close process'); },
+ onClosed:function(){ alert('onClosed: colorbox has completely closed'); }
+ });
+
+ //Example of preserving a JavaScript event for inline calls.
+ $("#click").click(function(){
+ $('#click').css({"background-color":"#f00", "color":"#fff", "cursor":"inherit"}).text("Open this window again and this message will still be here.");
+ return false;
+ });
+ });
+ </script>
+ </head>
+ <body>
+ <h1>ColorBox Demonstration</h1>
+ <h2>Elastic Transition</h2>
+ <p><a class="group1" href="../content/ohoopee1.jpg" title="Me and my grandfather on the Ohoopee.">Grouped Photo 1</a></p>
+ <p><a class="group1" href="../content/ohoopee2.jpg" title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+ <p><a class="group1" href="../content/ohoopee3.jpg" title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+
+ <h2>Fade Transition</h2>
+ <p><a class="group2" href="../content/ohoopee1.jpg" title="Me and my grandfather on the Ohoopee">Grouped Photo 1</a></p>
+ <p><a class="group2" href="../content/ohoopee2.jpg" title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+ <p><a class="group2" href="../content/ohoopee3.jpg" title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+
+ <h2>No Transition + fixed width and height (75% of screen size)</h2>
+ <p><a class="group3" href="../content/ohoopee1.jpg" title="Me and my grandfather on the Ohoopee.">Grouped Photo 1</a></p>
+ <p><a class="group3" href="../content/ohoopee2.jpg" title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+ <p><a class="group3" href="../content/ohoopee3.jpg" title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+
+ <h2>Slideshow</h2>
+ <p><a class="group4" href="../content/ohoopee1.jpg" title="Me and my grandfather on the Ohoopee.">Grouped Photo 1</a></p>
+ <p><a class="group4" href="../content/ohoopee2.jpg" title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+ <p><a class="group4" href="../content/ohoopee3.jpg" title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+
+ <h2>Other Content Types</h2>
+ <p><a class='ajax' href="../content/ajax.html" title="Homer Defined">Outside HTML (Ajax)</a></p>
+ <p><a class='youtube' href="http://www.youtube.com/embed/617ANIA5Rqs?rel=0&amp;wmode=transparent" title="The Knife: We Share Our Mother's Health">Flash / Video (Iframe/Direct Link To YouTube)</a></p>
+ <p><a class='vimeo' href="http://player.vimeo.com/video/2285902" title="R&ouml;yksopp: Remind Me">Flash / Video (Iframe/Direct Link To Vimeo)</a></p>
+ <p><a class='iframe' href="http://wikipedia.com">Outside Webpage (Iframe)</a></p>
+ <p><a class='inline' href="#inline_content">Inline HTML</a></p>
+
+ <h2>Demonstration of using callbacks</h2>
+ <p><a class='callbacks' href="../content/marylou.jpg" title="Marylou on Cumberland Island">Example with alerts</a>. Callbacks and event-hooks allow users to extend functionality without having to rewrite parts of the plugin.</p>
+
+ <!-- This contains the hidden content for inline calls -->
+ <div style='display:none'>
+ <div id='inline_content' style='padding:10px; background:#fff;'>
+ <p><strong>This content comes from a hidden element on this page.</strong></p>
+ <p>The inline option preserves bound JavaScript events and changes, and it puts the content back where it came from when it is closed.</p>
+ <p><a id="click" href="#" style='padding:5px; background:#ccc;'>Click me, it will be preserved!</a></p>
+
+ <p><strong>If you try to open a new ColorBox while it is already open, it will update itself with the new content.</strong></p>
+ <p>Updating Content Example:<br />
+ <a class="ajax" href="../content/ajax.html">Click here to load new content</a></p>
+ </div>
+ </div>
+ </body>
+</html> \ No newline at end of file
diff --git a/library/colorbox/example5/colorbox.css b/library/colorbox/example5/colorbox.css
new file mode 100644
index 000000000..544a76f3b
--- /dev/null
+++ b/library/colorbox/example5/colorbox.css
@@ -0,0 +1,52 @@
+/*
+ ColorBox Core Style:
+ The following CSS is consistent between example themes and should not be altered.
+*/
+#colorbox, #cboxOverlay, #cboxWrapper{position:absolute; top:0; left:0; z-index:9999; overflow:hidden;}
+#cboxOverlay{position:fixed; width:100%; height:100%;}
+#cboxMiddleLeft, #cboxBottomLeft{clear:left;}
+#cboxContent{position:relative;}
+#cboxLoadedContent{overflow:auto;}
+#cboxTitle{margin:0;}
+#cboxLoadingOverlay, #cboxLoadingGraphic{position:absolute; top:0; left:0; width:100%; height:100%;}
+#cboxPrevious, #cboxNext, #cboxClose, #cboxSlideshow{cursor:pointer;}
+.cboxPhoto{float:left; margin:auto; border:0; display:block; max-width:none;}
+.cboxIframe{width:100%; height:100%; display:block; border:0;}
+#colorbox, #cboxContent, #cboxLoadedContent{box-sizing:content-box; -moz-box-sizing:content-box; -webkit-box-sizing:content-box;}
+
+/*
+ User Style:
+ Change the following styles to modify the appearance of ColorBox. They are
+ ordered & tabbed in a way that represents the nesting of the generated HTML.
+*/
+#cboxOverlay{background:#000;}
+#colorbox{}
+ #cboxTopLeft{width:14px; height:14px; background:url(images/controls.png) no-repeat 0 0;}
+ #cboxTopCenter{height:14px; background:url(images/border.png) repeat-x top left;}
+ #cboxTopRight{width:14px; height:14px; background:url(images/controls.png) no-repeat -36px 0;}
+ #cboxBottomLeft{width:14px; height:43px; background:url(images/controls.png) no-repeat 0 -32px;}
+ #cboxBottomCenter{height:43px; background:url(images/border.png) repeat-x bottom left;}
+ #cboxBottomRight{width:14px; height:43px; background:url(images/controls.png) no-repeat -36px -32px;}
+ #cboxMiddleLeft{width:14px; background:url(images/controls.png) repeat-y -175px 0;}
+ #cboxMiddleRight{width:14px; background:url(images/controls.png) repeat-y -211px 0;}
+ #cboxContent{background:#fff; overflow:visible;}
+ .cboxIframe{background:#fff;}
+ #cboxError{padding:50px; border:1px solid #ccc;}
+ #cboxLoadedContent{margin-bottom:5px;}
+ #cboxLoadingOverlay{background:url(images/loading_background.png) no-repeat center center;}
+ #cboxLoadingGraphic{background:url(images/loading.gif) no-repeat center center;}
+ #cboxTitle{position:absolute; bottom:-25px; left:0; text-align:center; width:100%; font-weight:bold; color:#7C7C7C;}
+ #cboxCurrent{position:absolute; bottom:-25px; left:58px; font-weight:bold; color:#7C7C7C;}
+
+ #cboxPrevious, #cboxNext, #cboxClose, #cboxSlideshow{position:absolute; bottom:-29px; background:url(images/controls.png) no-repeat 0px 0px; width:23px; height:23px; text-indent:-9999px;}
+ #cboxPrevious{left:0px; background-position: -51px -25px;}
+ #cboxPrevious:hover{background-position:-51px 0px;}
+ #cboxNext{left:27px; background-position:-75px -25px;}
+ #cboxNext:hover{background-position:-75px 0px;}
+ #cboxClose{right:0; background-position:-100px -25px;}
+ #cboxClose:hover{background-position:-100px 0px;}
+
+ .cboxSlideshow_on #cboxSlideshow{background-position:-125px 0px; right:27px;}
+ .cboxSlideshow_on #cboxSlideshow:hover{background-position:-150px 0px;}
+ .cboxSlideshow_off #cboxSlideshow{background-position:-150px -25px; right:27px;}
+ .cboxSlideshow_off #cboxSlideshow:hover{background-position:-125px 0px;} \ No newline at end of file
diff --git a/library/colorbox/example5/images/border.png b/library/colorbox/example5/images/border.png
new file mode 100644
index 000000000..df13bb6da
--- /dev/null
+++ b/library/colorbox/example5/images/border.png
Binary files differ
diff --git a/library/colorbox/example5/images/controls.png b/library/colorbox/example5/images/controls.png
new file mode 100644
index 000000000..65cfd1dc9
--- /dev/null
+++ b/library/colorbox/example5/images/controls.png
Binary files differ
diff --git a/library/colorbox/example5/images/loading.gif b/library/colorbox/example5/images/loading.gif
new file mode 100644
index 000000000..b4695d811
--- /dev/null
+++ b/library/colorbox/example5/images/loading.gif
Binary files differ
diff --git a/library/colorbox/example5/images/loading_background.png b/library/colorbox/example5/images/loading_background.png
new file mode 100644
index 000000000..9de11f467
--- /dev/null
+++ b/library/colorbox/example5/images/loading_background.png
Binary files differ
diff --git a/library/colorbox/example5/index.html b/library/colorbox/example5/index.html
new file mode 100644
index 000000000..727fe78d7
--- /dev/null
+++ b/library/colorbox/example5/index.html
@@ -0,0 +1,87 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset='utf-8'/>
+ <title>ColorBox Examples</title>
+ <style>
+ body{font:12px/1.2 Verdana, sans-serif; padding:0 10px;}
+ a:link, a:visited{text-decoration:none; color:#416CE5; border-bottom:1px solid #416CE5;}
+ h2{font-size:13px; margin:15px 0 0 0;}
+ </style>
+ <link rel="stylesheet" href="colorbox.css" />
+ <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"></script>
+ <script src="../jquery.colorbox.js"></script>
+ <script>
+ $(document).ready(function(){
+ //Examples of how to assign the ColorBox event to elements
+ $(".group1").colorbox({rel:'group1'});
+ $(".group2").colorbox({rel:'group2', transition:"fade"});
+ $(".group3").colorbox({rel:'group3', transition:"none", width:"75%", height:"75%"});
+ $(".group4").colorbox({rel:'group4', slideshow:true});
+ $(".ajax").colorbox();
+ $(".youtube").colorbox({iframe:true, innerWidth:425, innerHeight:344});
+ $(".vimeo").colorbox({iframe:true, innerWidth:500, innerHeight:409});
+ $(".iframe").colorbox({iframe:true, width:"80%", height:"80%"});
+ $(".inline").colorbox({inline:true, width:"50%"});
+ $(".callbacks").colorbox({
+ onOpen:function(){ alert('onOpen: colorbox is about to open'); },
+ onLoad:function(){ alert('onLoad: colorbox has started to load the targeted content'); },
+ onComplete:function(){ alert('onComplete: colorbox has displayed the loaded content'); },
+ onCleanup:function(){ alert('onCleanup: colorbox has begun the close process'); },
+ onClosed:function(){ alert('onClosed: colorbox has completely closed'); }
+ });
+
+ //Example of preserving a JavaScript event for inline calls.
+ $("#click").click(function(){
+ $('#click').css({"background-color":"#f00", "color":"#fff", "cursor":"inherit"}).text("Open this window again and this message will still be here.");
+ return false;
+ });
+ });
+ </script>
+ </head>
+ <body>
+ <h1>ColorBox Demonstration</h1>
+ <h2>Elastic Transition</h2>
+ <p><a class="group1" href="../content/ohoopee1.jpg" title="Me and my grandfather on the Ohoopee.">Grouped Photo 1</a></p>
+ <p><a class="group1" href="../content/ohoopee2.jpg" title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+ <p><a class="group1" href="../content/ohoopee3.jpg" title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+
+ <h2>Fade Transition</h2>
+ <p><a class="group2" href="../content/ohoopee1.jpg" title="Me and my grandfather on the Ohoopee">Grouped Photo 1</a></p>
+ <p><a class="group2" href="../content/ohoopee2.jpg" title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+ <p><a class="group2" href="../content/ohoopee3.jpg" title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+
+ <h2>No Transition + fixed width and height (75% of screen size)</h2>
+ <p><a class="group3" href="../content/ohoopee1.jpg" title="Me and my grandfather on the Ohoopee.">Grouped Photo 1</a></p>
+ <p><a class="group3" href="../content/ohoopee2.jpg" title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+ <p><a class="group3" href="../content/ohoopee3.jpg" title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+
+ <h2>Slideshow</h2>
+ <p><a class="group4" href="../content/ohoopee1.jpg" title="Me and my grandfather on the Ohoopee.">Grouped Photo 1</a></p>
+ <p><a class="group4" href="../content/ohoopee2.jpg" title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+ <p><a class="group4" href="../content/ohoopee3.jpg" title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+
+ <h2>Other Content Types</h2>
+ <p><a class='ajax' href="../content/ajax.html" title="Homer Defined">Outside HTML (Ajax)</a></p>
+ <p><a class='youtube' href="http://www.youtube.com/embed/617ANIA5Rqs?rel=0&amp;wmode=transparent" title="The Knife: We Share Our Mother's Health">Flash / Video (Iframe/Direct Link To YouTube)</a></p>
+ <p><a class='vimeo' href="http://player.vimeo.com/video/2285902" title="R&ouml;yksopp: Remind Me">Flash / Video (Iframe/Direct Link To Vimeo)</a></p>
+ <p><a class='iframe' href="http://wikipedia.com">Outside Webpage (Iframe)</a></p>
+ <p><a class='inline' href="#inline_content">Inline HTML</a></p>
+
+ <h2>Demonstration of using callbacks</h2>
+ <p><a class='callbacks' href="../content/marylou.jpg" title="Marylou on Cumberland Island">Example with alerts</a>. Callbacks and event-hooks allow users to extend functionality without having to rewrite parts of the plugin.</p>
+
+ <!-- This contains the hidden content for inline calls -->
+ <div style='display:none'>
+ <div id='inline_content' style='padding:10px; background:#fff;'>
+ <p><strong>This content comes from a hidden element on this page.</strong></p>
+ <p>The inline option preserves bound JavaScript events and changes, and it puts the content back where it came from when it is closed.</p>
+ <p><a id="click" href="#" style='padding:5px; background:#ccc;'>Click me, it will be preserved!</a></p>
+
+ <p><strong>If you try to open a new ColorBox while it is already open, it will update itself with the new content.</strong></p>
+ <p>Updating Content Example:<br />
+ <a class="ajax" href="../content/ajax.html">Click here to load new content</a></p>
+ </div>
+ </div>
+ </body>
+</html> \ No newline at end of file
diff --git a/library/colorbox/i18n/jquery.colorbox-cs.js b/library/colorbox/i18n/jquery.colorbox-cs.js
new file mode 100644
index 000000000..42114c0a7
--- /dev/null
+++ b/library/colorbox/i18n/jquery.colorbox-cs.js
@@ -0,0 +1,14 @@
+/*
+ jQuery ColorBox language configuration
+ language: Czech (cs)
+ translated by: Filip Novak
+ site: mame.napilno.cz/filip-novak
+*/
+jQuery.extend(jQuery.colorbox.settings, {
+ current: "{current}. obrázek z {total}",
+ previous: "Předchozí",
+ next: "Následující",
+ close: "Zavřít",
+ xhrError: "Obsah se nepodaÅ™ilo naÄíst.",
+ imgError: "Obrázek se nepodaÅ™ilo naÄíst."
+}); \ No newline at end of file
diff --git a/library/colorbox/i18n/jquery.colorbox-da.js b/library/colorbox/i18n/jquery.colorbox-da.js
new file mode 100644
index 000000000..66bfb6cd0
--- /dev/null
+++ b/library/colorbox/i18n/jquery.colorbox-da.js
@@ -0,0 +1,14 @@
+/*
+ jQuery ColorBox language configuration
+ language: Danish (da)
+ translated by: danieljuhl
+ site: danieljuhl.dk
+*/
+jQuery.extend(jQuery.colorbox.settings, {
+ current: "Billede {current} af {total}",
+ previous: "Forrige",
+ next: "Næste",
+ close: "Luk",
+ xhrError: "Indholdet fejlede i indlæsningen.",
+ imgError: "Billedet fejlede i indlæsningen."
+});
diff --git a/library/colorbox/i18n/jquery.colorbox-de.js b/library/colorbox/i18n/jquery.colorbox-de.js
new file mode 100644
index 000000000..3d6e2e147
--- /dev/null
+++ b/library/colorbox/i18n/jquery.colorbox-de.js
@@ -0,0 +1,13 @@
+/*
+ jQuery ColorBox language configuration
+ language: German (de)
+ translated by: wallenium
+*/
+jQuery.extend(jQuery.colorbox.settings, {
+ current: "Bild {current} von {total}",
+ previous: "Zurück",
+ next: "Vor",
+ close: "Schließen",
+ xhrError: "Dieser Inhalt konnte nicht geladen werden.",
+ imgError: "Dieses Bild konnte nicht geladen werden."
+}); \ No newline at end of file
diff --git a/library/colorbox/i18n/jquery.colorbox-es.js b/library/colorbox/i18n/jquery.colorbox-es.js
new file mode 100644
index 000000000..6449c66f8
--- /dev/null
+++ b/library/colorbox/i18n/jquery.colorbox-es.js
@@ -0,0 +1,13 @@
+/*
+ jQuery ColorBox language configuration
+ language: Spanish (es)
+ translated by: migolo
+*/
+jQuery.extend(jQuery.colorbox.settings, {
+ current: "Imagen {current} de {total}",
+ previous: "Anterior",
+ next: "Siguiente",
+ close: "Cerrar",
+ xhrError: "Error en la carga del contenido.",
+ imgError: "Error en la carga de la imagen."
+});
diff --git a/library/colorbox/i18n/jquery.colorbox-fr.js b/library/colorbox/i18n/jquery.colorbox-fr.js
new file mode 100644
index 000000000..f6afe3fd4
--- /dev/null
+++ b/library/colorbox/i18n/jquery.colorbox-fr.js
@@ -0,0 +1,14 @@
+/*
+ jQuery ColorBox language configuration
+ language: French (fr)
+ translated by: oaubert
+*/
+jQuery.extend(jQuery.colorbox.settings, {
+current: "image {current} sur {total}",
+previous: "pr&eacute;c&eacute;dente",
+next: "suivante",
+close: "fermer",
+xhrError: "Impossible de charger ce contenu.",
+imgError: "Impossible de charger cette image."
+});
+
diff --git a/library/colorbox/i18n/jquery.colorbox-it.js b/library/colorbox/i18n/jquery.colorbox-it.js
new file mode 100644
index 000000000..d67d76cf7
--- /dev/null
+++ b/library/colorbox/i18n/jquery.colorbox-it.js
@@ -0,0 +1,13 @@
+/*
+ jQuery ColorBox language configuration
+ language: Italian (it)
+ translated by: maur8ino
+*/
+jQuery.extend(jQuery.colorbox.settings, {
+ current: "Immagine {current} di {total}",
+ previous: "Precedente",
+ next: "Successiva",
+ close: "Chiudi",
+ xhrError: "Errore nel caricamento del contenuto.",
+ imgError: "Errore nel caricamento dell'immagine."
+});
diff --git a/library/colorbox/i18n/jquery.colorbox-ru.js b/library/colorbox/i18n/jquery.colorbox-ru.js
new file mode 100644
index 000000000..c9c220068
--- /dev/null
+++ b/library/colorbox/i18n/jquery.colorbox-ru.js
@@ -0,0 +1,14 @@
+/*
+ jQuery ColorBox language configuration
+ language: Russian (ru)
+ translated by: Marfa
+ site: themarfa.name
+*/
+jQuery.extend(jQuery.colorbox.settings, {
+ current: "изображение {current} из {total}",
+ previous: "предыдущее",
+ next: "Ñледующее",
+ close: "закрыть",
+ xhrError: "Ðе удалоÑÑŒ загрузить Ñодержимое.",
+ imgError: "Ðе удалоÑÑŒ загрузить изображение."
+}); \ No newline at end of file
diff --git a/library/colorbox/images/border.png b/library/colorbox/images/border.png
new file mode 100644
index 000000000..df13bb6da
--- /dev/null
+++ b/library/colorbox/images/border.png
Binary files differ
diff --git a/library/colorbox/images/controls.png b/library/colorbox/images/controls.png
new file mode 100644
index 000000000..65cfd1dc9
--- /dev/null
+++ b/library/colorbox/images/controls.png
Binary files differ
diff --git a/library/colorbox/images/loading.gif b/library/colorbox/images/loading.gif
new file mode 100644
index 000000000..b4695d811
--- /dev/null
+++ b/library/colorbox/images/loading.gif
Binary files differ
diff --git a/library/colorbox/images/loading_background.png b/library/colorbox/images/loading_background.png
new file mode 100644
index 000000000..9de11f467
--- /dev/null
+++ b/library/colorbox/images/loading_background.png
Binary files differ
diff --git a/library/colorbox/jquery.colorbox-min.js b/library/colorbox/jquery.colorbox-min.js
new file mode 100644
index 000000000..969064042
--- /dev/null
+++ b/library/colorbox/jquery.colorbox-min.js
@@ -0,0 +1 @@
+(function($,document,window){var defaults={transition:"elastic",speed:300,width:false,initialWidth:"600",innerWidth:false,maxWidth:false,height:false,initialHeight:"450",innerHeight:false,maxHeight:false,scalePhotos:true,scrolling:true,inline:false,html:false,iframe:false,fastIframe:true,photo:false,href:false,title:false,rel:false,opacity:.9,preloading:true,className:false,current:"image {current} of {total}",previous:"previous",next:"next",close:"close",xhrError:"This content failed to load.",imgError:"This image failed to load.",open:false,returnFocus:true,reposition:true,loop:true,slideshow:false,slideshowAuto:true,slideshowSpeed:2500,slideshowStart:"start slideshow",slideshowStop:"stop slideshow",onOpen:false,onLoad:false,onComplete:false,onCleanup:false,onClosed:false,overlayClose:true,escKey:true,arrowKey:true,top:false,bottom:false,left:false,right:false,fixed:false,data:undefined},colorbox="colorbox",prefix="cbox",boxElement=prefix+"Element",event_open=prefix+"_open",event_load=prefix+"_load",event_complete=prefix+"_complete",event_cleanup=prefix+"_cleanup",event_closed=prefix+"_closed",event_purge=prefix+"_purge",isIE=!$.support.leadingWhitespace,isIE6=isIE&&!window.XMLHttpRequest,event_ie6=prefix+"_IE6",$overlay,$box,$wrap,$content,$topBorder,$leftBorder,$rightBorder,$bottomBorder,$related,$window,$loaded,$loadingBay,$loadingOverlay,$title,$current,$slideshow,$next,$prev,$close,$groupControls,$events=$({}),settings,interfaceHeight,interfaceWidth,loadedHeight,loadedWidth,element,index,photo,open,active,closing,loadingTimer,publicMethod,div="div",className,init;function $tag(tag,id,css){var element=document.createElement(tag);if(id){element.id=prefix+id}if(css){element.style.cssText=css}return $(element)}function getIndex(increment){var max=$related.length,newIndex=(index+increment)%max;return newIndex<0?max+newIndex:newIndex}function setSize(size,dimension){return Math.round((/%/.test(size)?(dimension==="x"?$window.width():$window.height())/100:1)*parseInt(size,10))}function isImage(url){return settings.photo||/\.(gif|png|jp(e|g|eg)|bmp|ico)((#|\?).*)?$/i.test(url)}function makeSettings(){var i,data=$.data(element,colorbox);if(data==null){settings=$.extend({},defaults);if(console&&console.log){console.log("Error: cboxElement missing settings object")}}else{settings=$.extend({},data)}for(i in settings){if($.isFunction(settings[i])&&i.slice(0,2)!=="on"){settings[i]=settings[i].call(element)}}settings.rel=settings.rel||element.rel||$(element).data("rel")||"nofollow";settings.href=settings.href||$(element).attr("href");settings.title=settings.title||element.title;if(typeof settings.href==="string"){settings.href=$.trim(settings.href)}}function trigger(event,callback){$(document).trigger(event);$events.trigger(event);if($.isFunction(callback)){callback.call(element)}}function slideshow(){var timeOut,className=prefix+"Slideshow_",click="click."+prefix,clear,set,start,stop;if(settings.slideshow&&$related[1]){clear=function(){clearTimeout(timeOut)};set=function(){if(settings.loop||$related[index+1]){timeOut=setTimeout(publicMethod.next,settings.slideshowSpeed)}};start=function(){$slideshow.html(settings.slideshowStop).unbind(click).one(click,stop);$events.bind(event_complete,set).bind(event_load,clear).bind(event_cleanup,stop);$box.removeClass(className+"off").addClass(className+"on")};stop=function(){clear();$events.unbind(event_complete,set).unbind(event_load,clear).unbind(event_cleanup,stop);$slideshow.html(settings.slideshowStart).unbind(click).one(click,function(){publicMethod.next();start()});$box.removeClass(className+"on").addClass(className+"off")};if(settings.slideshowAuto){start()}else{stop()}}else{$box.removeClass(className+"off "+className+"on")}}function launch(target){if(!closing){element=target;makeSettings();$related=$(element);index=0;if(settings.rel!=="nofollow"){$related=$("."+boxElement).filter(function(){var data=$.data(this,colorbox),relRelated;if(data){relRelated=$(this).data("rel")||data.rel||this.rel}return relRelated===settings.rel});index=$related.index(element);if(index===-1){$related=$related.add(element);index=$related.length-1}}if(!open){open=active=true;$box.css({visibility:"hidden",display:"block"});$loaded=$tag(div,"LoadedContent","width:0; height:0; overflow:hidden").appendTo($content);interfaceHeight=$topBorder.height()+$bottomBorder.height()+$content.outerHeight(true)-$content.height();interfaceWidth=$leftBorder.width()+$rightBorder.width()+$content.outerWidth(true)-$content.width();loadedHeight=$loaded.outerHeight(true);loadedWidth=$loaded.outerWidth(true);if(settings.returnFocus){$(element).blur();$events.one(event_closed,function(){$(element).focus()})}$overlay.css({opacity:parseFloat(settings.opacity),cursor:settings.overlayClose?"pointer":"auto",visibility:"visible"}).show();settings.w=setSize(settings.initialWidth,"x");settings.h=setSize(settings.initialHeight,"y");publicMethod.position();if(isIE6){$window.bind("resize."+event_ie6+" scroll."+event_ie6,function(){$overlay.css({width:$window.width(),height:$window.height(),top:$window.scrollTop(),left:$window.scrollLeft()})}).trigger("resize."+event_ie6)}slideshow();trigger(event_open,settings.onOpen);$groupControls.add($title).hide();$close.html(settings.close).show()}publicMethod.load(true)}}function appendHTML(){if(!$box&&document.body){init=false;$window=$(window);$box=$tag(div).attr({id:colorbox,"class":isIE?prefix+(isIE6?"IE6":"IE"):""}).hide();$overlay=$tag(div,"Overlay",isIE6?"position:absolute":"").hide();$loadingOverlay=$tag(div,"LoadingOverlay").add($tag(div,"LoadingGraphic"));$wrap=$tag(div,"Wrapper");$content=$tag(div,"Content").append($title=$tag(div,"Title"),$current=$tag(div,"Current"),$next=$tag(div,"Next"),$prev=$tag(div,"Previous"),$slideshow=$tag(div,"Slideshow"),$close=$tag(div,"Close"));$wrap.append($tag(div).append($tag(div,"TopLeft"),$topBorder=$tag(div,"TopCenter"),$tag(div,"TopRight")),$tag(div,false,"clear:left").append($leftBorder=$tag(div,"MiddleLeft"),$content,$rightBorder=$tag(div,"MiddleRight")),$tag(div,false,"clear:left").append($tag(div,"BottomLeft"),$bottomBorder=$tag(div,"BottomCenter"),$tag(div,"BottomRight"))).find("div div").css({"float":"left"});$loadingBay=$tag(div,false,"position:absolute; width:9999px; visibility:hidden; display:none");$groupControls=$next.add($prev).add($current).add($slideshow);$(document.body).append($overlay,$box.append($wrap,$loadingBay))}}function addBindings(){function clickHandler(e){if(!(e.which>1||e.shiftKey||e.altKey||e.metaKey)){e.preventDefault();launch(this)}}if($box){if(!init){init=true;$next.click(function(){publicMethod.next()});$prev.click(function(){publicMethod.prev()});$close.click(function(){publicMethod.close()});$overlay.click(function(){if(settings.overlayClose){publicMethod.close()}});$(document).bind("keydown."+prefix,function(e){var key=e.keyCode;if(open&&settings.escKey&&key===27){e.preventDefault();publicMethod.close()}if(open&&settings.arrowKey&&$related[1]){if(key===37){e.preventDefault();$prev.click()}else if(key===39){e.preventDefault();$next.click()}}});if($.isFunction($.fn.on)){$(document).on("click."+prefix,"."+boxElement,clickHandler)}else{$("."+boxElement).live("click."+prefix,clickHandler)}}return true}return false}if($.colorbox){return}$(appendHTML);publicMethod=$.fn[colorbox]=$[colorbox]=function(options,callback){var $this=this;options=options||{};appendHTML();if(addBindings()){if($.isFunction($this)){$this=$("<a/>");options.open=true}else if(!$this[0]){return $this}if(callback){options.onComplete=callback}$this.each(function(){$.data(this,colorbox,$.extend({},$.data(this,colorbox)||defaults,options))}).addClass(boxElement);if($.isFunction(options.open)&&options.open.call($this)||options.open){launch($this[0])}}return $this};publicMethod.position=function(speed,loadedCallback){var css,top=0,left=0,offset=$box.offset(),scrollTop,scrollLeft;$window.unbind("resize."+prefix);$box.css({top:-9e4,left:-9e4});scrollTop=$window.scrollTop();scrollLeft=$window.scrollLeft();if(settings.fixed&&!isIE6){offset.top-=scrollTop;offset.left-=scrollLeft;$box.css({position:"fixed"})}else{top=scrollTop;left=scrollLeft;$box.css({position:"absolute"})}if(settings.right!==false){left+=Math.max($window.width()-settings.w-loadedWidth-interfaceWidth-setSize(settings.right,"x"),0)}else if(settings.left!==false){left+=setSize(settings.left,"x")}else{left+=Math.round(Math.max($window.width()-settings.w-loadedWidth-interfaceWidth,0)/2)}if(settings.bottom!==false){top+=Math.max($window.height()-settings.h-loadedHeight-interfaceHeight-setSize(settings.bottom,"y"),0)}else if(settings.top!==false){top+=setSize(settings.top,"y")}else{top+=Math.round(Math.max($window.height()-settings.h-loadedHeight-interfaceHeight,0)/2)}$box.css({top:offset.top,left:offset.left,visibility:"visible"});speed=$box.width()===settings.w+loadedWidth&&$box.height()===settings.h+loadedHeight?0:speed||0;$wrap[0].style.width=$wrap[0].style.height="9999px";function modalDimensions(that){$topBorder[0].style.width=$bottomBorder[0].style.width=$content[0].style.width=parseInt(that.style.width,10)-interfaceWidth+"px";$content[0].style.height=$leftBorder[0].style.height=$rightBorder[0].style.height=parseInt(that.style.height,10)-interfaceHeight+"px"}css={width:settings.w+loadedWidth+interfaceWidth,height:settings.h+loadedHeight+interfaceHeight,top:top,left:left};if(speed===0){$box.css(css)}$box.dequeue().animate(css,{duration:speed,complete:function(){modalDimensions(this);active=false;$wrap[0].style.width=settings.w+loadedWidth+interfaceWidth+"px";$wrap[0].style.height=settings.h+loadedHeight+interfaceHeight+"px";if(settings.reposition){setTimeout(function(){$window.bind("resize."+prefix,publicMethod.position)},1)}if(loadedCallback){loadedCallback()}},step:function(){modalDimensions(this)}})};publicMethod.resize=function(options){if(open){options=options||{};if(options.width){settings.w=setSize(options.width,"x")-loadedWidth-interfaceWidth}if(options.innerWidth){settings.w=setSize(options.innerWidth,"x")}$loaded.css({width:settings.w});if(options.height){settings.h=setSize(options.height,"y")-loadedHeight-interfaceHeight}if(options.innerHeight){settings.h=setSize(options.innerHeight,"y")}if(!options.innerHeight&&!options.height){$loaded.css({height:"auto"});settings.h=$loaded.height()}$loaded.css({height:settings.h});publicMethod.position(settings.transition==="none"?0:settings.speed)}};publicMethod.prep=function(object){if(!open){return}var callback,speed=settings.transition==="none"?0:settings.speed;$loaded.empty().remove();$loaded=$tag(div,"LoadedContent").append(object);function getWidth(){settings.w=settings.w||$loaded.width();settings.w=settings.mw&&settings.mw<settings.w?settings.mw:settings.w;return settings.w}function getHeight(){settings.h=settings.h||$loaded.height();settings.h=settings.mh&&settings.mh<settings.h?settings.mh:settings.h;return settings.h}$loaded.hide().appendTo($loadingBay.show()).css({width:getWidth(),overflow:settings.scrolling?"auto":"hidden"}).css({height:getHeight()}).prependTo($content);$loadingBay.hide();$(photo).css({"float":"none"});callback=function(){var total=$related.length,iframe,frameBorder="frameBorder",allowTransparency="allowTransparency",complete;if(!open){return}function removeFilter(){if(isIE){$box[0].style.removeAttribute("filter")}}complete=function(){clearTimeout(loadingTimer);$loadingOverlay.remove();trigger(event_complete,settings.onComplete)};if(isIE){if(photo){$loaded.fadeIn(100)}}$title.html(settings.title).add($loaded).show();if(total>1){if(typeof settings.current==="string"){$current.html(settings.current.replace("{current}",index+1).replace("{total}",total)).show()}$next[settings.loop||index<total-1?"show":"hide"]().html(settings.next);$prev[settings.loop||index?"show":"hide"]().html(settings.previous);if(settings.slideshow){$slideshow.show()}if(settings.preloading){$.each([getIndex(-1),getIndex(1)],function(){var src,img,i=$related[this],data=$.data(i,colorbox);if(data&&data.href){src=data.href;if($.isFunction(src)){src=src.call(i)}}else{src=$(i).attr("href")}if(src&&(isImage(src)||data.photo)){img=new Image;img.src=src}})}}else{$groupControls.hide()}if(settings.iframe){iframe=$tag("iframe")[0];if(frameBorder in iframe){iframe[frameBorder]=0}if(allowTransparency in iframe){iframe[allowTransparency]="true"}if(!settings.scrolling){iframe.scrolling="no"}$(iframe).attr({src:settings.href,name:(new Date).getTime(),"class":prefix+"Iframe",allowFullScreen:true,webkitAllowFullScreen:true,mozallowfullscreen:true}).one("load",complete).appendTo($loaded);$events.one(event_purge,function(){iframe.src="//about:blank"});if(settings.fastIframe){$(iframe).trigger("load")}}else{complete()}if(settings.transition==="fade"){$box.fadeTo(speed,1,removeFilter)}else{removeFilter()}};if(settings.transition==="fade"){$box.fadeTo(speed,0,function(){publicMethod.position(0,callback)})}else{publicMethod.position(speed,callback)}};publicMethod.load=function(launched){var href,setResize,prep=publicMethod.prep,$inline;active=true;photo=false;element=$related[index];if(!launched){makeSettings()}if(className){$box.add($overlay).removeClass(className)}if(settings.className){$box.add($overlay).addClass(settings.className)}className=settings.className;trigger(event_purge);trigger(event_load,settings.onLoad);settings.h=settings.height?setSize(settings.height,"y")-loadedHeight-interfaceHeight:settings.innerHeight&&setSize(settings.innerHeight,"y");settings.w=settings.width?setSize(settings.width,"x")-loadedWidth-interfaceWidth:settings.innerWidth&&setSize(settings.innerWidth,"x");settings.mw=settings.w;settings.mh=settings.h;if(settings.maxWidth){settings.mw=setSize(settings.maxWidth,"x")-loadedWidth-interfaceWidth;settings.mw=settings.w&&settings.w<settings.mw?settings.w:settings.mw}if(settings.maxHeight){settings.mh=setSize(settings.maxHeight,"y")-loadedHeight-interfaceHeight;settings.mh=settings.h&&settings.h<settings.mh?settings.h:settings.mh}href=settings.href;loadingTimer=setTimeout(function(){$loadingOverlay.appendTo($content)},100);if(settings.inline){$inline=$tag(div).hide().insertBefore($(href)[0]);$events.one(event_purge,function(){$inline.replaceWith($loaded.children())});prep($(href))}else if(settings.iframe){prep(" ")}else if(settings.html){prep(settings.html)}else if(isImage(href)){$(photo=new Image).addClass(prefix+"Photo").bind("error",function(){settings.title=false;prep($tag(div,"Error").html(settings.imgError))}).one("load",function(){var percent;if(settings.scalePhotos){setResize=function(){photo.height-=photo.height*percent;photo.width-=photo.width*percent};if(settings.mw&&photo.width>settings.mw){percent=(photo.width-settings.mw)/photo.width;setResize()}if(settings.mh&&photo.height>settings.mh){percent=(photo.height-settings.mh)/photo.height;setResize()}}if(settings.h){photo.style.marginTop=Math.max(settings.mh-photo.height,0)/2+"px"}if($related[1]&&(settings.loop||$related[index+1])){photo.style.cursor="pointer";photo.onclick=function(){publicMethod.next()}}if(isIE){photo.style.msInterpolationMode="bicubic"}setTimeout(function(){prep(photo)},1)});setTimeout(function(){photo.src=href},1)}else if(href){$loadingBay.load(href,settings.data,function(data,status){prep(status==="error"?$tag(div,"Error").html(settings.xhrError):$(this).contents())})}};publicMethod.next=function(){if(!active&&$related[1]&&(settings.loop||$related[index+1])){index=getIndex(1);publicMethod.load()}};publicMethod.prev=function(){if(!active&&$related[1]&&(settings.loop||index)){index=getIndex(-1);publicMethod.load()}};publicMethod.close=function(){if(open&&!closing){closing=true;open=false;trigger(event_cleanup,settings.onCleanup);$window.unbind("."+prefix+" ."+event_ie6);$overlay.fadeTo(200,0);$box.stop().fadeTo(300,0,function(){$box.add($overlay).css({opacity:1,cursor:"auto"}).hide();trigger(event_purge);$loaded.empty().remove();setTimeout(function(){closing=false;trigger(event_closed,settings.onClosed)},1)})}};publicMethod.remove=function(){$([]).add($box).add($overlay).remove();$box=null;$("."+boxElement).removeData(colorbox).removeClass(boxElement);$(document).unbind("click."+prefix)};publicMethod.element=function(){return $(element)};publicMethod.settings=defaults})(jQuery,document,window); \ No newline at end of file
diff --git a/library/colorbox/jquery.colorbox.js b/library/colorbox/jquery.colorbox.js
new file mode 100644
index 000000000..5b9aecdc2
--- /dev/null
+++ b/library/colorbox/jquery.colorbox.js
@@ -0,0 +1,975 @@
+/*
+ jQuery ColorBox v1.3.32 - 2013-01-31
+ (c) 2013 Jack Moore - jacklmoore.com/colorbox
+ license: http://www.opensource.org/licenses/mit-license.php
+*/
+(function ($, document, window) {
+ var
+ // Default settings object.
+ // See http://jacklmoore.com/colorbox for details.
+ defaults = {
+ transition: "elastic",
+ speed: 300,
+ width: false,
+ initialWidth: "600",
+ innerWidth: false,
+ maxWidth: false,
+ height: false,
+ initialHeight: "450",
+ innerHeight: false,
+ maxHeight: false,
+ scalePhotos: true,
+ scrolling: true,
+ inline: false,
+ html: false,
+ iframe: false,
+ fastIframe: true,
+ photo: false,
+ href: false,
+ title: false,
+ rel: false,
+ opacity: 0.9,
+ preloading: true,
+ className: false,
+
+ current: "image {current} of {total}",
+ previous: "previous",
+ next: "next",
+ close: "close",
+ xhrError: "This content failed to load.",
+ imgError: "This image failed to load.",
+
+ open: false,
+ returnFocus: true,
+ reposition: true,
+ loop: true,
+ slideshow: false,
+ slideshowAuto: true,
+ slideshowSpeed: 2500,
+ slideshowStart: "start slideshow",
+ slideshowStop: "stop slideshow",
+ onOpen: false,
+ onLoad: false,
+ onComplete: false,
+ onCleanup: false,
+ onClosed: false,
+ overlayClose: true,
+ escKey: true,
+ arrowKey: true,
+ top: false,
+ bottom: false,
+ left: false,
+ right: false,
+ fixed: false,
+ data: undefined
+ },
+
+ // Abstracting the HTML and event identifiers for easy rebranding
+ colorbox = 'colorbox',
+ prefix = 'cbox',
+ boxElement = prefix + 'Element',
+
+ // Events
+ event_open = prefix + '_open',
+ event_load = prefix + '_load',
+ event_complete = prefix + '_complete',
+ event_cleanup = prefix + '_cleanup',
+ event_closed = prefix + '_closed',
+ event_purge = prefix + '_purge',
+
+ // Special Handling for IE
+ isIE = !$.support.leadingWhitespace, // IE6 to IE8
+ isIE6 = isIE && !window.XMLHttpRequest, // IE6
+ event_ie6 = prefix + '_IE6',
+
+ // Cached jQuery Object Variables
+ $overlay,
+ $box,
+ $wrap,
+ $content,
+ $topBorder,
+ $leftBorder,
+ $rightBorder,
+ $bottomBorder,
+ $related,
+ $window,
+ $loaded,
+ $loadingBay,
+ $loadingOverlay,
+ $title,
+ $current,
+ $slideshow,
+ $next,
+ $prev,
+ $close,
+ $groupControls,
+ $events = $({}),
+
+ // Variables for cached values or use across multiple functions
+ settings,
+ interfaceHeight,
+ interfaceWidth,
+ loadedHeight,
+ loadedWidth,
+ element,
+ index,
+ photo,
+ open,
+ active,
+ closing,
+ loadingTimer,
+ publicMethod,
+ div = "div",
+ className,
+ init;
+
+ // ****************
+ // HELPER FUNCTIONS
+ // ****************
+
+ // Convience function for creating new jQuery objects
+ function $tag(tag, id, css) {
+ var element = document.createElement(tag);
+
+ if (id) {
+ element.id = prefix + id;
+ }
+
+ if (css) {
+ element.style.cssText = css;
+ }
+
+ return $(element);
+ }
+
+ // Determine the next and previous members in a group.
+ function getIndex(increment) {
+ var
+ max = $related.length,
+ newIndex = (index + increment) % max;
+
+ return (newIndex < 0) ? max + newIndex : newIndex;
+ }
+
+ // Convert '%' and 'px' values to integers
+ function setSize(size, dimension) {
+ return Math.round((/%/.test(size) ? ((dimension === 'x' ? $window.width() : $window.height()) / 100) : 1) * parseInt(size, 10));
+ }
+
+ // Checks an href to see if it is a photo.
+ // There is a force photo option (photo: true) for hrefs that cannot be matched by this regex.
+ function isImage(url) {
+ return settings.photo || /\.(gif|png|jp(e|g|eg)|bmp|ico)((#|\?).*)?$/i.test(url);
+ }
+
+ // Assigns function results to their respective properties
+ function makeSettings() {
+ var i,
+ data = $.data(element, colorbox);
+
+ if (data == null) {
+ settings = $.extend({}, defaults);
+ if (console && console.log) {
+ console.log('Error: cboxElement missing settings object');
+ }
+ } else {
+ settings = $.extend({}, data);
+ }
+
+ for (i in settings) {
+ if ($.isFunction(settings[i]) && i.slice(0, 2) !== 'on') { // checks to make sure the function isn't one of the callbacks, they will be handled at the appropriate time.
+ settings[i] = settings[i].call(element);
+ }
+ }
+
+ settings.rel = settings.rel || element.rel || $(element).data('rel') || 'nofollow';
+ settings.href = settings.href || $(element).attr('href');
+ settings.title = settings.title || element.title;
+
+ if (typeof settings.href === "string") {
+ settings.href = $.trim(settings.href);
+ }
+ }
+
+ function trigger(event, callback) {
+ // for external use
+ $(document).trigger(event);
+
+ // for internal use
+ $events.trigger(event);
+
+ if ($.isFunction(callback)) {
+ callback.call(element);
+ }
+ }
+
+ // Slideshow functionality
+ function slideshow() {
+ var
+ timeOut,
+ className = prefix + "Slideshow_",
+ click = "click." + prefix,
+ clear,
+ set,
+ start,
+ stop;
+
+ if (settings.slideshow && $related[1]) {
+ clear = function () {
+ clearTimeout(timeOut);
+ };
+
+ set = function () {
+ if (settings.loop || $related[index + 1]) {
+ timeOut = setTimeout(publicMethod.next, settings.slideshowSpeed);
+ }
+ };
+
+ start = function () {
+ $slideshow
+ .html(settings.slideshowStop)
+ .unbind(click)
+ .one(click, stop);
+
+ $events
+ .bind(event_complete, set)
+ .bind(event_load, clear)
+ .bind(event_cleanup, stop);
+
+ $box.removeClass(className + "off").addClass(className + "on");
+ };
+
+ stop = function () {
+ clear();
+
+ $events
+ .unbind(event_complete, set)
+ .unbind(event_load, clear)
+ .unbind(event_cleanup, stop);
+
+ $slideshow
+ .html(settings.slideshowStart)
+ .unbind(click)
+ .one(click, function () {
+ publicMethod.next();
+ start();
+ });
+
+ $box.removeClass(className + "on").addClass(className + "off");
+ };
+
+ if (settings.slideshowAuto) {
+ start();
+ } else {
+ stop();
+ }
+ } else {
+ $box.removeClass(className + "off " + className + "on");
+ }
+ }
+
+ function launch(target) {
+ if (!closing) {
+
+ element = target;
+
+ makeSettings();
+
+ $related = $(element);
+
+ index = 0;
+
+ if (settings.rel !== 'nofollow') {
+ $related = $('.' + boxElement).filter(function () {
+ var data = $.data(this, colorbox),
+ relRelated;
+
+ if (data) {
+ relRelated = $(this).data('rel') || data.rel || this.rel;
+ }
+
+ return (relRelated === settings.rel);
+ });
+ index = $related.index(element);
+
+ // Check direct calls to ColorBox.
+ if (index === -1) {
+ $related = $related.add(element);
+ index = $related.length - 1;
+ }
+ }
+
+ if (!open) {
+ open = active = true; // Prevents the page-change action from queuing up if the visitor holds down the left or right keys.
+
+ // Show colorbox so the sizes can be calculated in older versions of jQuery
+ $box.css({visibility:'hidden', display:'block'});
+
+ $loaded = $tag(div, 'LoadedContent', 'width:0; height:0; overflow:hidden').appendTo($content);
+
+ // Cache values needed for size calculations
+ interfaceHeight = $topBorder.height() + $bottomBorder.height() + $content.outerHeight(true) - $content.height();//Subtraction needed for IE6
+ interfaceWidth = $leftBorder.width() + $rightBorder.width() + $content.outerWidth(true) - $content.width();
+ loadedHeight = $loaded.outerHeight(true);
+ loadedWidth = $loaded.outerWidth(true);
+
+ if (settings.returnFocus) {
+ $(element).blur();
+ $events.one(event_closed, function () {
+ $(element).focus();
+ });
+ }
+
+ $overlay.css({
+ opacity: parseFloat(settings.opacity),
+ cursor: settings.overlayClose ? "pointer" : "auto",
+ visibility: 'visible'
+ }).show();
+
+ // Opens inital empty ColorBox prior to content being loaded.
+ settings.w = setSize(settings.initialWidth, 'x');
+ settings.h = setSize(settings.initialHeight, 'y');
+ publicMethod.position();
+
+ if (isIE6) {
+ $window.bind('resize.' + event_ie6 + ' scroll.' + event_ie6, function () {
+ $overlay.css({width: $window.width(), height: $window.height(), top: $window.scrollTop(), left: $window.scrollLeft()});
+ }).trigger('resize.' + event_ie6);
+ }
+
+ slideshow();
+
+ trigger(event_open, settings.onOpen);
+
+ $groupControls.add($title).hide();
+
+ $close.html(settings.close).show();
+ }
+
+ publicMethod.load(true);
+ }
+ }
+
+ // ColorBox's markup needs to be added to the DOM prior to being called
+ // so that the browser will go ahead and load the CSS background images.
+ function appendHTML() {
+ if (!$box && document.body) {
+ init = false;
+
+ $window = $(window);
+ $box = $tag(div).attr({id: colorbox, 'class': isIE ? prefix + (isIE6 ? 'IE6' : 'IE') : ''}).hide();
+ $overlay = $tag(div, "Overlay", isIE6 ? 'position:absolute' : '').hide();
+ $loadingOverlay = $tag(div, "LoadingOverlay").add($tag(div, "LoadingGraphic"));
+ $wrap = $tag(div, "Wrapper");
+ $content = $tag(div, "Content").append(
+ $title = $tag(div, "Title"),
+ $current = $tag(div, "Current"),
+ $next = $tag(div, "Next"),
+ $prev = $tag(div, "Previous"),
+ $slideshow = $tag(div, "Slideshow"),
+ $close = $tag(div, "Close")
+ );
+
+ $wrap.append( // The 3x3 Grid that makes up ColorBox
+ $tag(div).append(
+ $tag(div, "TopLeft"),
+ $topBorder = $tag(div, "TopCenter"),
+ $tag(div, "TopRight")
+ ),
+ $tag(div, false, 'clear:left').append(
+ $leftBorder = $tag(div, "MiddleLeft"),
+ $content,
+ $rightBorder = $tag(div, "MiddleRight")
+ ),
+ $tag(div, false, 'clear:left').append(
+ $tag(div, "BottomLeft"),
+ $bottomBorder = $tag(div, "BottomCenter"),
+ $tag(div, "BottomRight")
+ )
+ ).find('div div').css({'float': 'left'});
+
+ $loadingBay = $tag(div, false, 'position:absolute; width:9999px; visibility:hidden; display:none');
+
+ $groupControls = $next.add($prev).add($current).add($slideshow);
+
+ $(document.body).append($overlay, $box.append($wrap, $loadingBay));
+ }
+ }
+
+ // Add ColorBox's event bindings
+ function addBindings() {
+ function clickHandler(e) {
+ // ignore non-left-mouse-clicks and clicks modified with ctrl / command, shift, or alt.
+ // See: http://jacklmoore.com/notes/click-events/
+ if (!(e.which > 1 || e.shiftKey || e.altKey || e.metaKey)) {
+ e.preventDefault();
+ launch(this);
+ }
+ }
+
+ if ($box) {
+ if (!init) {
+ init = true;
+
+ // Anonymous functions here keep the public method from being cached, thereby allowing them to be redefined on the fly.
+ $next.click(function () {
+ publicMethod.next();
+ });
+ $prev.click(function () {
+ publicMethod.prev();
+ });
+ $close.click(function () {
+ publicMethod.close();
+ });
+ $overlay.click(function () {
+ if (settings.overlayClose) {
+ publicMethod.close();
+ }
+ });
+
+ // Key Bindings
+ $(document).bind('keydown.' + prefix, function (e) {
+ var key = e.keyCode;
+ if (open && settings.escKey && key === 27) {
+ e.preventDefault();
+ publicMethod.close();
+ }
+ if (open && settings.arrowKey && $related[1]) {
+ if (key === 37) {
+ e.preventDefault();
+ $prev.click();
+ } else if (key === 39) {
+ e.preventDefault();
+ $next.click();
+ }
+ }
+ });
+
+ if ($.isFunction($.fn.on)) {
+ $(document).on('click.'+prefix, '.'+boxElement, clickHandler);
+ } else { // For jQuery 1.3.x -> 1.6.x
+ $('.'+boxElement).live('click.'+prefix, clickHandler);
+ }
+ }
+ return true;
+ }
+ return false;
+ }
+
+ // Don't do anything if ColorBox already exists.
+ if ($.colorbox) {
+ return;
+ }
+
+ // Append the HTML when the DOM loads
+ $(appendHTML);
+
+
+ // ****************
+ // PUBLIC FUNCTIONS
+ // Usage format: $.fn.colorbox.close();
+ // Usage from within an iframe: parent.$.fn.colorbox.close();
+ // ****************
+
+ publicMethod = $.fn[colorbox] = $[colorbox] = function (options, callback) {
+ var $this = this;
+
+ options = options || {};
+
+ appendHTML();
+
+ if (addBindings()) {
+ if ($.isFunction($this)) { // assume a call to $.colorbox
+ $this = $('<a/>');
+ options.open = true;
+ } else if (!$this[0]) { // colorbox being applied to empty collection
+ return $this;
+ }
+
+ if (callback) {
+ options.onComplete = callback;
+ }
+
+ $this.each(function () {
+ $.data(this, colorbox, $.extend({}, $.data(this, colorbox) || defaults, options));
+ }).addClass(boxElement);
+
+ if (($.isFunction(options.open) && options.open.call($this)) || options.open) {
+ launch($this[0]);
+ }
+ }
+
+ return $this;
+ };
+
+ publicMethod.position = function (speed, loadedCallback) {
+ var
+ css,
+ top = 0,
+ left = 0,
+ offset = $box.offset(),
+ scrollTop,
+ scrollLeft;
+
+ $window.unbind('resize.' + prefix);
+
+ // remove the modal so that it doesn't influence the document width/height
+ $box.css({top: -9e4, left: -9e4});
+
+ scrollTop = $window.scrollTop();
+ scrollLeft = $window.scrollLeft();
+
+ if (settings.fixed && !isIE6) {
+ offset.top -= scrollTop;
+ offset.left -= scrollLeft;
+ $box.css({position: 'fixed'});
+ } else {
+ top = scrollTop;
+ left = scrollLeft;
+ $box.css({position: 'absolute'});
+ }
+
+ // keeps the top and left positions within the browser's viewport.
+ if (settings.right !== false) {
+ left += Math.max($window.width() - settings.w - loadedWidth - interfaceWidth - setSize(settings.right, 'x'), 0);
+ } else if (settings.left !== false) {
+ left += setSize(settings.left, 'x');
+ } else {
+ left += Math.round(Math.max($window.width() - settings.w - loadedWidth - interfaceWidth, 0) / 2);
+ }
+
+ if (settings.bottom !== false) {
+ top += Math.max($window.height() - settings.h - loadedHeight - interfaceHeight - setSize(settings.bottom, 'y'), 0);
+ } else if (settings.top !== false) {
+ top += setSize(settings.top, 'y');
+ } else {
+ top += Math.round(Math.max($window.height() - settings.h - loadedHeight - interfaceHeight, 0) / 2);
+ }
+
+ $box.css({top: offset.top, left: offset.left, visibility:'visible'});
+
+ // setting the speed to 0 to reduce the delay between same-sized content.
+ speed = ($box.width() === settings.w + loadedWidth && $box.height() === settings.h + loadedHeight) ? 0 : speed || 0;
+
+ // this gives the wrapper plenty of breathing room so it's floated contents can move around smoothly,
+ // but it has to be shrank down around the size of div#colorbox when it's done. If not,
+ // it can invoke an obscure IE bug when using iframes.
+ $wrap[0].style.width = $wrap[0].style.height = "9999px";
+
+ function modalDimensions(that) {
+ $topBorder[0].style.width = $bottomBorder[0].style.width = $content[0].style.width = (parseInt(that.style.width,10) - interfaceWidth)+'px';
+ $content[0].style.height = $leftBorder[0].style.height = $rightBorder[0].style.height = (parseInt(that.style.height,10) - interfaceHeight)+'px';
+ }
+
+ css = {width: settings.w + loadedWidth + interfaceWidth, height: settings.h + loadedHeight + interfaceHeight, top: top, left: left};
+
+ if(speed===0){ // temporary workaround to side-step jQuery-UI 1.8 bug (http://bugs.jquery.com/ticket/12273)
+ $box.css(css);
+ }
+ $box.dequeue().animate(css, {
+ duration: speed,
+ complete: function () {
+ modalDimensions(this);
+
+ active = false;
+
+ // shrink the wrapper down to exactly the size of colorbox to avoid a bug in IE's iframe implementation.
+ $wrap[0].style.width = (settings.w + loadedWidth + interfaceWidth) + "px";
+ $wrap[0].style.height = (settings.h + loadedHeight + interfaceHeight) + "px";
+
+ if (settings.reposition) {
+ setTimeout(function () { // small delay before binding onresize due to an IE8 bug.
+ $window.bind('resize.' + prefix, publicMethod.position);
+ }, 1);
+ }
+
+ if (loadedCallback) {
+ loadedCallback();
+ }
+ },
+ step: function () {
+ modalDimensions(this);
+ }
+ });
+ };
+
+ publicMethod.resize = function (options) {
+ if (open) {
+ options = options || {};
+
+ if (options.width) {
+ settings.w = setSize(options.width, 'x') - loadedWidth - interfaceWidth;
+ }
+ if (options.innerWidth) {
+ settings.w = setSize(options.innerWidth, 'x');
+ }
+ $loaded.css({width: settings.w});
+
+ if (options.height) {
+ settings.h = setSize(options.height, 'y') - loadedHeight - interfaceHeight;
+ }
+ if (options.innerHeight) {
+ settings.h = setSize(options.innerHeight, 'y');
+ }
+ if (!options.innerHeight && !options.height) {
+ $loaded.css({height: "auto"});
+ settings.h = $loaded.height();
+ }
+ $loaded.css({height: settings.h});
+
+ publicMethod.position(settings.transition === "none" ? 0 : settings.speed);
+ }
+ };
+
+ publicMethod.prep = function (object) {
+ if (!open) {
+ return;
+ }
+
+ var callback, speed = settings.transition === "none" ? 0 : settings.speed;
+
+ $loaded.empty().remove(); // Using empty first may prevent some IE7 issues.
+
+ $loaded = $tag(div, 'LoadedContent').append(object);
+
+ function getWidth() {
+ settings.w = settings.w || $loaded.width();
+ settings.w = settings.mw && settings.mw < settings.w ? settings.mw : settings.w;
+ return settings.w;
+ }
+ function getHeight() {
+ settings.h = settings.h || $loaded.height();
+ settings.h = settings.mh && settings.mh < settings.h ? settings.mh : settings.h;
+ return settings.h;
+ }
+
+ $loaded.hide()
+ .appendTo($loadingBay.show())// content has to be appended to the DOM for accurate size calculations.
+ .css({width: getWidth(), overflow: settings.scrolling ? 'auto' : 'hidden'})
+ .css({height: getHeight()})// sets the height independently from the width in case the new width influences the value of height.
+ .prependTo($content);
+
+ $loadingBay.hide();
+
+ // floating the IMG removes the bottom line-height and fixed a problem where IE miscalculates the width of the parent element as 100% of the document width.
+ //$(photo).css({'float': 'none', marginLeft: 'auto', marginRight: 'auto'});
+
+ $(photo).css({'float': 'none'});
+
+
+ callback = function () {
+ var total = $related.length,
+ iframe,
+ frameBorder = 'frameBorder',
+ allowTransparency = 'allowTransparency',
+ complete;
+
+ if (!open) {
+ return;
+ }
+
+ function removeFilter() {
+ if (isIE) {
+ $box[0].style.removeAttribute('filter');
+ }
+ }
+
+ complete = function () {
+ clearTimeout(loadingTimer);
+ $loadingOverlay.remove();
+ trigger(event_complete, settings.onComplete);
+ };
+
+ if (isIE) {
+ //This fadeIn helps the bicubic resampling to kick-in.
+ if (photo) {
+ $loaded.fadeIn(100);
+ }
+ }
+
+ $title.html(settings.title).add($loaded).show();
+
+ if (total > 1) { // handle grouping
+ if (typeof settings.current === "string") {
+ $current.html(settings.current.replace('{current}', index + 1).replace('{total}', total)).show();
+ }
+
+ $next[(settings.loop || index < total - 1) ? "show" : "hide"]().html(settings.next);
+ $prev[(settings.loop || index) ? "show" : "hide"]().html(settings.previous);
+
+ if (settings.slideshow) {
+ $slideshow.show();
+ }
+
+ // Preloads images within a rel group
+ if (settings.preloading) {
+ $.each([getIndex(-1), getIndex(1)], function(){
+ var src,
+ img,
+ i = $related[this],
+ data = $.data(i, colorbox);
+
+ if (data && data.href) {
+ src = data.href;
+ if ($.isFunction(src)) {
+ src = src.call(i);
+ }
+ } else {
+ src = $(i).attr('href');
+ }
+
+ if (src && (isImage(src) || data.photo)) {
+ img = new Image();
+ img.src = src;
+ }
+ });
+ }
+ } else {
+ $groupControls.hide();
+ }
+
+ if (settings.iframe) {
+ iframe = $tag('iframe')[0];
+
+ if (frameBorder in iframe) {
+ iframe[frameBorder] = 0;
+ }
+
+ if (allowTransparency in iframe) {
+ iframe[allowTransparency] = "true";
+ }
+
+ if (!settings.scrolling) {
+ iframe.scrolling = "no";
+ }
+
+ $(iframe)
+ .attr({
+ src: settings.href,
+ name: (new Date()).getTime(), // give the iframe a unique name to prevent caching
+ 'class': prefix + 'Iframe',
+ allowFullScreen : true, // allow HTML5 video to go fullscreen
+ webkitAllowFullScreen : true,
+ mozallowfullscreen : true
+ })
+ .one('load', complete)
+ .appendTo($loaded);
+
+ $events.one(event_purge, function () {
+ iframe.src = "//about:blank";
+ });
+
+ if (settings.fastIframe) {
+ $(iframe).trigger('load');
+ }
+ } else {
+ complete();
+ }
+
+ if (settings.transition === 'fade') {
+ $box.fadeTo(speed, 1, removeFilter);
+ } else {
+ removeFilter();
+ }
+ };
+
+ if (settings.transition === 'fade') {
+ $box.fadeTo(speed, 0, function () {
+ publicMethod.position(0, callback);
+ });
+ } else {
+ publicMethod.position(speed, callback);
+ }
+ };
+
+ publicMethod.load = function (launched) {
+ var href, setResize, prep = publicMethod.prep, $inline;
+
+ active = true;
+
+ photo = false;
+
+ element = $related[index];
+
+ if (!launched) {
+ makeSettings();
+ }
+
+ if (className) {
+ $box.add($overlay).removeClass(className);
+ }
+ if (settings.className) {
+ $box.add($overlay).addClass(settings.className);
+ }
+ className = settings.className;
+
+ trigger(event_purge);
+
+ trigger(event_load, settings.onLoad);
+
+ settings.h = settings.height ?
+ setSize(settings.height, 'y') - loadedHeight - interfaceHeight :
+ settings.innerHeight && setSize(settings.innerHeight, 'y');
+
+ settings.w = settings.width ?
+ setSize(settings.width, 'x') - loadedWidth - interfaceWidth :
+ settings.innerWidth && setSize(settings.innerWidth, 'x');
+
+ // Sets the minimum dimensions for use in image scaling
+ settings.mw = settings.w;
+ settings.mh = settings.h;
+
+ // Re-evaluate the minimum width and height based on maxWidth and maxHeight values.
+ // If the width or height exceed the maxWidth or maxHeight, use the maximum values instead.
+ if (settings.maxWidth) {
+ settings.mw = setSize(settings.maxWidth, 'x') - loadedWidth - interfaceWidth;
+ settings.mw = settings.w && settings.w < settings.mw ? settings.w : settings.mw;
+ }
+ if (settings.maxHeight) {
+ settings.mh = setSize(settings.maxHeight, 'y') - loadedHeight - interfaceHeight;
+ settings.mh = settings.h && settings.h < settings.mh ? settings.h : settings.mh;
+ }
+
+ href = settings.href;
+
+ loadingTimer = setTimeout(function () {
+ $loadingOverlay.appendTo($content);
+ }, 100);
+
+ if (settings.inline) {
+ // Inserts an empty placeholder where inline content is being pulled from.
+ // An event is bound to put inline content back when ColorBox closes or loads new content.
+ $inline = $tag(div).hide().insertBefore($(href)[0]);
+
+ $events.one(event_purge, function () {
+ $inline.replaceWith($loaded.children());
+ });
+
+ prep($(href));
+ } else if (settings.iframe) {
+ // IFrame element won't be added to the DOM until it is ready to be displayed,
+ // to avoid problems with DOM-ready JS that might be trying to run in that iframe.
+ prep(" ");
+ } else if (settings.html) {
+ prep(settings.html);
+ } else if (isImage(href)) {
+ $(photo = new Image())
+ .addClass(prefix + 'Photo')
+ .bind('error',function () {
+ settings.title = false;
+ prep($tag(div, 'Error').html(settings.imgError));
+ })
+ .one('load', function () {
+ var percent;
+
+ if (settings.scalePhotos) {
+ setResize = function () {
+ photo.height -= photo.height * percent;
+ photo.width -= photo.width * percent;
+ };
+ if (settings.mw && photo.width > settings.mw) {
+ percent = (photo.width - settings.mw) / photo.width;
+ setResize();
+ }
+ if (settings.mh && photo.height > settings.mh) {
+ percent = (photo.height - settings.mh) / photo.height;
+ setResize();
+ }
+ }
+
+ if (settings.h) {
+ photo.style.marginTop = Math.max(settings.mh - photo.height, 0) / 2 + 'px';
+ }
+
+ if ($related[1] && (settings.loop || $related[index + 1])) {
+ photo.style.cursor = 'pointer';
+ photo.onclick = function () {
+ publicMethod.next();
+ };
+ }
+
+ if (isIE) {
+ photo.style.msInterpolationMode = 'bicubic';
+ }
+
+ setTimeout(function () { // A pause because Chrome will sometimes report a 0 by 0 size otherwise.
+ prep(photo);
+ }, 1);
+ });
+
+ setTimeout(function () { // A pause because Opera 10.6+ will sometimes not run the onload function otherwise.
+ photo.src = href;
+ }, 1);
+ } else if (href) {
+ $loadingBay.load(href, settings.data, function (data, status) {
+ prep(status === 'error' ? $tag(div, 'Error').html(settings.xhrError) : $(this).contents());
+ });
+ }
+ };
+
+ // Navigates to the next page/image in a set.
+ publicMethod.next = function () {
+ if (!active && $related[1] && (settings.loop || $related[index + 1])) {
+ index = getIndex(1);
+ publicMethod.load();
+ }
+ };
+
+ publicMethod.prev = function () {
+ if (!active && $related[1] && (settings.loop || index)) {
+ index = getIndex(-1);
+ publicMethod.load();
+ }
+ };
+
+ // Note: to use this within an iframe use the following format: parent.$.fn.colorbox.close();
+ publicMethod.close = function () {
+ if (open && !closing) {
+
+ closing = true;
+
+ open = false;
+
+ trigger(event_cleanup, settings.onCleanup);
+
+ $window.unbind('.' + prefix + ' .' + event_ie6);
+
+ $overlay.fadeTo(200, 0);
+
+ $box.stop().fadeTo(300, 0, function () {
+
+ $box.add($overlay).css({'opacity': 1, cursor: 'auto'}).hide();
+
+ trigger(event_purge);
+
+ $loaded.empty().remove(); // Using empty first may prevent some IE7 issues.
+
+ setTimeout(function () {
+ closing = false;
+ trigger(event_closed, settings.onClosed);
+ }, 1);
+ });
+ }
+ };
+
+ // Removes changes ColorBox made to the document, but does not remove the plugin
+ // from jQuery.
+ publicMethod.remove = function () {
+ $([]).add($box).add($overlay).remove();
+ $box = null;
+ $('.' + boxElement)
+ .removeData(colorbox)
+ .removeClass(boxElement);
+
+ $(document).unbind('click.'+prefix);
+ };
+
+ // A method for fetching the current element ColorBox is referencing.
+ // returns a jQuery object.
+ publicMethod.element = function () {
+ return $(element);
+ };
+
+ publicMethod.settings = defaults;
+
+}(jQuery, document, window));
diff --git a/library/colorpicker/css/colorpicker.css b/library/colorpicker/css/colorpicker.css
new file mode 100644
index 000000000..05b02b485
--- /dev/null
+++ b/library/colorpicker/css/colorpicker.css
@@ -0,0 +1,161 @@
+.colorpicker {
+ width: 356px;
+ height: 176px;
+ overflow: hidden;
+ position: absolute;
+ background: url(../images/colorpicker_background.png);
+ font-family: Arial, Helvetica, sans-serif;
+ display: none;
+}
+.colorpicker_color {
+ width: 150px;
+ height: 150px;
+ left: 14px;
+ top: 13px;
+ position: absolute;
+ background: #f00;
+ overflow: hidden;
+ cursor: crosshair;
+}
+.colorpicker_color div {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 150px;
+ height: 150px;
+ background: url(../images/colorpicker_overlay.png);
+}
+.colorpicker_color div div {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 11px;
+ height: 11px;
+ overflow: hidden;
+ background: url(../images/colorpicker_select.gif);
+ margin: -5px 0 0 -5px;
+}
+.colorpicker_hue {
+ position: absolute;
+ top: 13px;
+ left: 171px;
+ width: 35px;
+ height: 150px;
+ cursor: n-resize;
+}
+.colorpicker_hue div {
+ position: absolute;
+ width: 35px;
+ height: 9px;
+ overflow: hidden;
+ background: url(../images/colorpicker_indic.gif) left top;
+ margin: -4px 0 0 0;
+ left: 0px;
+}
+.colorpicker_new_color {
+ position: absolute;
+ width: 60px;
+ height: 30px;
+ left: 213px;
+ top: 13px;
+ background: #f00;
+}
+.colorpicker_current_color {
+ position: absolute;
+ width: 60px;
+ height: 30px;
+ left: 283px;
+ top: 13px;
+ background: #f00;
+}
+.colorpicker input {
+ background-color: transparent;
+ border: 1px solid transparent;
+ position: absolute;
+ font-size: 10px;
+ font-family: Arial, Helvetica, sans-serif;
+ color: #898989;
+ top: 4px;
+ right: 11px;
+ text-align: right;
+ margin: 0;
+ padding: 0;
+ height: 11px;
+}
+.colorpicker_hex {
+ position: absolute;
+ width: 72px;
+ height: 22px;
+ background: url(../images/colorpicker_hex.png) top;
+ left: 212px;
+ top: 142px;
+}
+.colorpicker_hex input {
+ right: 6px;
+}
+.colorpicker_field {
+ height: 22px;
+ width: 62px;
+ background-position: top;
+ position: absolute;
+}
+.colorpicker_field span {
+ position: absolute;
+ width: 12px;
+ height: 22px;
+ overflow: hidden;
+ top: 0;
+ right: 0;
+ cursor: n-resize;
+}
+.colorpicker_rgb_r {
+ background-image: url(../images/colorpicker_rgb_r.png);
+ top: 52px;
+ left: 212px;
+}
+.colorpicker_rgb_g {
+ background-image: url(../images/colorpicker_rgb_g.png);
+ top: 82px;
+ left: 212px;
+}
+.colorpicker_rgb_b {
+ background-image: url(../images/colorpicker_rgb_b.png);
+ top: 112px;
+ left: 212px;
+}
+.colorpicker_hsb_h {
+ background-image: url(../images/colorpicker_hsb_h.png);
+ top: 52px;
+ left: 282px;
+}
+.colorpicker_hsb_s {
+ background-image: url(../images/colorpicker_hsb_s.png);
+ top: 82px;
+ left: 282px;
+}
+.colorpicker_hsb_b {
+ background-image: url(../images/colorpicker_hsb_b.png);
+ top: 112px;
+ left: 282px;
+}
+.colorpicker_submit {
+ position: absolute;
+ width: 22px;
+ height: 22px;
+ background: url(../images/colorpicker_submit.png) top;
+ left: 322px;
+ top: 142px;
+ overflow: hidden;
+}
+.colorpicker_focus {
+ background-position: center;
+}
+.colorpicker_hex.colorpicker_focus {
+ background-position: bottom;
+}
+.colorpicker_submit.colorpicker_focus {
+ background-position: bottom;
+}
+.colorpicker_slider {
+ background-position: bottom;
+}
diff --git a/library/colorpicker/css/layout.css b/library/colorpicker/css/layout.css
new file mode 100644
index 000000000..8b3f00ff3
--- /dev/null
+++ b/library/colorpicker/css/layout.css
@@ -0,0 +1,218 @@
+body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,textarea,p,blockquote,th,td {
+ margin:0;
+ padding:0;
+}
+table {
+ border-collapse:collapse;
+ border-spacing:0;
+}
+fieldset,img {
+ border:0;
+}
+address,caption,cite,code,dfn,em,strong,th,var {
+ font-style:normal;
+ font-weight:normal;
+}
+ol,ul {
+ list-style:none;
+}
+caption,th {
+ text-align:left;
+}
+h1,h2,h3,h4,h5,h6 {
+ font-size:100%;
+ font-weight:normal;
+}
+q:before,q:after {
+ content:'';
+}
+abbr,acronym { border:0;
+}
+html, body {
+ background-color: #fff;
+ font-family: Arial, Helvetica, sans-serif;
+ font-size: 12px;
+ line-height: 18px;
+ color: #52697E;
+}
+body {
+ text-align: center;
+ overflow: auto;
+}
+.wrapper {
+ width: 700px;
+ margin: 0 auto;
+ text-align: left;
+}
+h1 {
+ font-size: 21px;
+ height: 47px;
+ line-height: 47px;
+ text-transform: uppercase;
+}
+.navigationTabs {
+ height: 23px;
+ line-height: 23px;
+ border-bottom: 1px solid #ccc;
+}
+.navigationTabs li {
+ float: left;
+ height: 23px;
+ line-height: 23px;
+ padding-right: 3px;
+}
+.navigationTabs li a{
+ float: left;
+ dispaly: block;
+ height: 23px;
+ line-height: 23px;
+ padding: 0 10px;
+ overflow: hidden;
+ color: #52697E;
+ background-color: #eee;
+ position: relative;
+ text-decoration: none;
+}
+.navigationTabs li a:hover {
+ background-color: #f0f0f0;
+}
+.navigationTabs li a.active {
+ background-color: #fff;
+ border: 1px solid #ccc;
+ border-bottom: 0px solid;
+}
+.tabsContent {
+ border: 1px solid #ccc;
+ border-top: 0px solid;
+ width: 698px;
+ overflow: hidden;
+}
+.tab {
+ padding: 16px;
+ display: none;
+}
+.tab h2 {
+ font-weight: bold;
+ font-size: 16px;
+}
+.tab h3 {
+ font-weight: bold;
+ font-size: 14px;
+ margin-top: 20px;
+}
+.tab p {
+ margin-top: 16px;
+ clear: both;
+}
+.tab ul {
+ margin-top: 16px;
+ list-style: disc;
+}
+.tab li {
+ margin: 10px 0 0 35px;
+}
+.tab a {
+ color: #8FB0CF;
+}
+.tab strong {
+ font-weight: bold;
+}
+.tab pre {
+ font-size: 11px;
+ margin-top: 20px;
+ width: 668px;
+ overflow: auto;
+ clear: both;
+}
+.tab table {
+ width: 100%;
+}
+.tab table td {
+ padding: 6px 10px 6px 0;
+ vertical-align: top;
+}
+.tab dt {
+ margin-top: 16px;
+}
+
+#colorSelector {
+ position: relative;
+ width: 36px;
+ height: 36px;
+ background: url(../images/select.png);
+}
+#colorSelector div {
+ position: absolute;
+ top: 3px;
+ left: 3px;
+ width: 30px;
+ height: 30px;
+ background: url(../images/select.png) center;
+}
+#colorSelector2 {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 36px;
+ height: 36px;
+ background: url(../images/select2.png);
+}
+#colorSelector2 div {
+ position: absolute;
+ top: 4px;
+ left: 4px;
+ width: 28px;
+ height: 28px;
+ background: url(../images/select2.png) center;
+}
+#colorpickerHolder2 {
+ top: 32px;
+ left: 0;
+ width: 356px;
+ height: 0;
+ overflow: hidden;
+ position: absolute;
+}
+#colorpickerHolder2 .colorpicker {
+ background-image: url(../images/custom_background.png);
+ position: absolute;
+ bottom: 0;
+ left: 0;
+}
+#colorpickerHolder2 .colorpicker_hue div {
+ background-image: url(../images/custom_indic.gif);
+}
+#colorpickerHolder2 .colorpicker_hex {
+ background-image: url(../images/custom_hex.png);
+}
+#colorpickerHolder2 .colorpicker_rgb_r {
+ background-image: url(../images/custom_rgb_r.png);
+}
+#colorpickerHolder2 .colorpicker_rgb_g {
+ background-image: url(../images/custom_rgb_g.png);
+}
+#colorpickerHolder2 .colorpicker_rgb_b {
+ background-image: url(../images/custom_rgb_b.png);
+}
+#colorpickerHolder2 .colorpicker_hsb_s {
+ background-image: url(../images/custom_hsb_s.png);
+ display: none;
+}
+#colorpickerHolder2 .colorpicker_hsb_h {
+ background-image: url(../images/custom_hsb_h.png);
+ display: none;
+}
+#colorpickerHolder2 .colorpicker_hsb_b {
+ background-image: url(../images/custom_hsb_b.png);
+ display: none;
+}
+#colorpickerHolder2 .colorpicker_submit {
+ background-image: url(../images/custom_submit.png);
+}
+#colorpickerHolder2 .colorpicker input {
+ color: #778398;
+}
+#customWidget {
+ position: relative;
+ height: 36px;
+}
diff --git a/library/colorpicker/images/blank.gif b/library/colorpicker/images/blank.gif
new file mode 100644
index 000000000..75b945d25
--- /dev/null
+++ b/library/colorpicker/images/blank.gif
Binary files differ
diff --git a/library/colorpicker/images/colorpicker_background.png b/library/colorpicker/images/colorpicker_background.png
new file mode 100644
index 000000000..8401572f1
--- /dev/null
+++ b/library/colorpicker/images/colorpicker_background.png
Binary files differ
diff --git a/library/colorpicker/images/colorpicker_hex.png b/library/colorpicker/images/colorpicker_hex.png
new file mode 100644
index 000000000..4e532d7c6
--- /dev/null
+++ b/library/colorpicker/images/colorpicker_hex.png
Binary files differ
diff --git a/library/colorpicker/images/colorpicker_hsb_b.png b/library/colorpicker/images/colorpicker_hsb_b.png
new file mode 100644
index 000000000..dfac595d0
--- /dev/null
+++ b/library/colorpicker/images/colorpicker_hsb_b.png
Binary files differ
diff --git a/library/colorpicker/images/colorpicker_hsb_h.png b/library/colorpicker/images/colorpicker_hsb_h.png
new file mode 100644
index 000000000..3977ed9f2
--- /dev/null
+++ b/library/colorpicker/images/colorpicker_hsb_h.png
Binary files differ
diff --git a/library/colorpicker/images/colorpicker_hsb_s.png b/library/colorpicker/images/colorpicker_hsb_s.png
new file mode 100644
index 000000000..a2a699736
--- /dev/null
+++ b/library/colorpicker/images/colorpicker_hsb_s.png
Binary files differ
diff --git a/library/colorpicker/images/colorpicker_indic.gif b/library/colorpicker/images/colorpicker_indic.gif
new file mode 100644
index 000000000..f9fa95e28
--- /dev/null
+++ b/library/colorpicker/images/colorpicker_indic.gif
Binary files differ
diff --git a/library/colorpicker/images/colorpicker_overlay.png b/library/colorpicker/images/colorpicker_overlay.png
new file mode 100644
index 000000000..561cdd9c5
--- /dev/null
+++ b/library/colorpicker/images/colorpicker_overlay.png
Binary files differ
diff --git a/library/colorpicker/images/colorpicker_rgb_b.png b/library/colorpicker/images/colorpicker_rgb_b.png
new file mode 100644
index 000000000..dfac595d0
--- /dev/null
+++ b/library/colorpicker/images/colorpicker_rgb_b.png
Binary files differ
diff --git a/library/colorpicker/images/colorpicker_rgb_g.png b/library/colorpicker/images/colorpicker_rgb_g.png
new file mode 100644
index 000000000..72b32760a
--- /dev/null
+++ b/library/colorpicker/images/colorpicker_rgb_g.png
Binary files differ
diff --git a/library/colorpicker/images/colorpicker_rgb_r.png b/library/colorpicker/images/colorpicker_rgb_r.png
new file mode 100644
index 000000000..4855fe03f
--- /dev/null
+++ b/library/colorpicker/images/colorpicker_rgb_r.png
Binary files differ
diff --git a/library/colorpicker/images/colorpicker_select.gif b/library/colorpicker/images/colorpicker_select.gif
new file mode 100644
index 000000000..599f7f13a
--- /dev/null
+++ b/library/colorpicker/images/colorpicker_select.gif
Binary files differ
diff --git a/library/colorpicker/images/colorpicker_submit.png b/library/colorpicker/images/colorpicker_submit.png
new file mode 100644
index 000000000..7f4c0825f
--- /dev/null
+++ b/library/colorpicker/images/colorpicker_submit.png
Binary files differ
diff --git a/library/colorpicker/images/custom_background.png b/library/colorpicker/images/custom_background.png
new file mode 100644
index 000000000..cf55ffdd6
--- /dev/null
+++ b/library/colorpicker/images/custom_background.png
Binary files differ
diff --git a/library/colorpicker/images/custom_hex.png b/library/colorpicker/images/custom_hex.png
new file mode 100644
index 000000000..888f44449
--- /dev/null
+++ b/library/colorpicker/images/custom_hex.png
Binary files differ
diff --git a/library/colorpicker/images/custom_hsb_b.png b/library/colorpicker/images/custom_hsb_b.png
new file mode 100644
index 000000000..2f99dae8e
--- /dev/null
+++ b/library/colorpicker/images/custom_hsb_b.png
Binary files differ
diff --git a/library/colorpicker/images/custom_hsb_h.png b/library/colorpicker/images/custom_hsb_h.png
new file mode 100644
index 000000000..a217e9218
--- /dev/null
+++ b/library/colorpicker/images/custom_hsb_h.png
Binary files differ
diff --git a/library/colorpicker/images/custom_hsb_s.png b/library/colorpicker/images/custom_hsb_s.png
new file mode 100644
index 000000000..7826b4150
--- /dev/null
+++ b/library/colorpicker/images/custom_hsb_s.png
Binary files differ
diff --git a/library/colorpicker/images/custom_indic.gif b/library/colorpicker/images/custom_indic.gif
new file mode 100644
index 000000000..222fb94cf
--- /dev/null
+++ b/library/colorpicker/images/custom_indic.gif
Binary files differ
diff --git a/library/colorpicker/images/custom_rgb_b.png b/library/colorpicker/images/custom_rgb_b.png
new file mode 100644
index 000000000..80764e5d6
--- /dev/null
+++ b/library/colorpicker/images/custom_rgb_b.png
Binary files differ
diff --git a/library/colorpicker/images/custom_rgb_g.png b/library/colorpicker/images/custom_rgb_g.png
new file mode 100644
index 000000000..fc9778be1
--- /dev/null
+++ b/library/colorpicker/images/custom_rgb_g.png
Binary files differ
diff --git a/library/colorpicker/images/custom_rgb_r.png b/library/colorpicker/images/custom_rgb_r.png
new file mode 100644
index 000000000..91b0cd4c5
--- /dev/null
+++ b/library/colorpicker/images/custom_rgb_r.png
Binary files differ
diff --git a/library/colorpicker/images/custom_submit.png b/library/colorpicker/images/custom_submit.png
new file mode 100644
index 000000000..cd202cd93
--- /dev/null
+++ b/library/colorpicker/images/custom_submit.png
Binary files differ
diff --git a/library/colorpicker/images/select.png b/library/colorpicker/images/select.png
new file mode 100644
index 000000000..21213bfd5
--- /dev/null
+++ b/library/colorpicker/images/select.png
Binary files differ
diff --git a/library/colorpicker/images/select2.png b/library/colorpicker/images/select2.png
new file mode 100644
index 000000000..2cd2cabeb
--- /dev/null
+++ b/library/colorpicker/images/select2.png
Binary files differ
diff --git a/library/colorpicker/images/slider.png b/library/colorpicker/images/slider.png
new file mode 100644
index 000000000..8b03da96e
--- /dev/null
+++ b/library/colorpicker/images/slider.png
Binary files differ
diff --git a/library/colorpicker/index.html b/library/colorpicker/index.html
new file mode 100644
index 000000000..e1ad5782d
--- /dev/null
+++ b/library/colorpicker/index.html
@@ -0,0 +1,184 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+ <link rel="stylesheet" href="css/colorpicker.css" type="text/css" />
+ <link rel="stylesheet" media="screen" type="text/css" href="css/layout.css" />
+ <title>ColorPicker - jQuery plugin</title>
+ <script type="text/javascript" src="js/jquery.js"></script>
+ <script type="text/javascript" src="js/colorpicker.js"></script>
+ <script type="text/javascript" src="js/eye.js"></script>
+ <script type="text/javascript" src="js/utils.js"></script>
+ <script type="text/javascript" src="js/layout.js?ver=1.0.2"></script>
+</head>
+<body>
+ <div class="wrapper">
+ <h1>Color Picker - jQuery plugin</h1>
+ <ul class="navigationTabs">
+ <li><a href="#about" rel="about">About</a></li>
+ <li><a href="#download" rel="download">Download</a></li>
+ <li><a href="#implement" rel="implement">Implement</a></li>
+ </ul>
+ <div class="tabsContent">
+ <div class="tab">
+ <h2>About</h2>
+ <p>A simple component to select color in the same way you select color in Adobe Photoshop</p>
+ <h3>Last update</h3>
+ <p>23.05.2009 - Check Download tab</p>
+ <h3>Features</h3>
+ <ul>
+ <li>Flat mode - as element in page</li>
+ <li>Powerful controls for color selection</li>
+ <li>Easy to customize the look by changing some images</li>
+ <li>Fits into the viewport</li>
+ </ul>
+ <h3>License</h3>
+ <p>Dual licensed under the MIT and GPL licenses.</p>
+ <h3>Examples</h3>
+ <p>Flat mode.</p>
+ <p id="colorpickerHolder">
+ </p>
+ <pre>
+$('#colorpickerHolder').ColorPicker({flat: true});
+ </pre>
+ <p>Custom skin and using flat mode to display the color picker in a custom widget.</p>
+ <div id="customWidget">
+ <div id="colorSelector2"><div style="background-color: #00ff00"></div></div>
+ <div id="colorpickerHolder2">
+ </div>
+ </div>
+
+ <p>Attached to an text field and using callback functions to update the color with field's value and set the value back in the field by submiting the color.</p>
+ <p><input type="text" maxlength="6" size="6" id="colorpickerField1" value="00ff00" /></p>
+ <p><input type="text" maxlength="6" size="6" id="colorpickerField3" value="0000ff" /></p>
+ <p><input type="text" maxlength="6" size="6" id="colorpickerField2" value="ff0000" /></p>
+ <pre>$('#colorpickerField1, #colorpickerField2, #colorpickerField3').ColorPicker({
+ onSubmit: function(hsb, hex, rgb, el) {
+ $(el).val(hex);
+ $(el).ColorPickerHide();
+ },
+ onBeforeShow: function () {
+ $(this).ColorPickerSetColor(this.value);
+ }
+})
+.bind('keyup', function(){
+ $(this).ColorPickerSetColor(this.value);
+});
+</pre>
+ <p>Attached to DOMElement and using callbacks to live preview the color and adding animation.</p>
+ <p>
+ <div id="colorSelector"><div style="background-color: #0000ff"></div></div>
+ </p>
+ <pre>
+$('#colorSelector').ColorPicker({
+ color: '#0000ff',
+ onShow: function (colpkr) {
+ $(colpkr).fadeIn(500);
+ return false;
+ },
+ onHide: function (colpkr) {
+ $(colpkr).fadeOut(500);
+ return false;
+ },
+ onChange: function (hsb, hex, rgb) {
+ $('#colorSelector div').css('backgroundColor', '#' + hex);
+ }
+});
+</pre>
+ </div>
+ <div class="tab">
+ <h2>Download</h2>
+ <p><a href="colorpicker.zip">colorpicker.zip (73 kb)</a>: jQuery, Javscript files, CSS files, images, examples and instructions.</p>
+ <h3>Changelog</h3>
+ <dl>
+ <dt>23.05.2009</dt>
+ <dd>Added: close on color selection example</dd>
+ <dd>Added: restore original color option</dd>
+ <dd>Changed: color update on key up event</dd>
+ <dd>Fixed: colorpicker hide and show methods</dd>
+ <dd>Fixed: reference to options. Multiple fields with colorpickers is possible now.</dd>
+ <dd>Fixed: RGB to HSB convertion</dd>
+ <dt>22.08.2008</dt>
+ <dd>Fixed bug: where some events were not canceled right on Safari</dd>
+ <dd>Fixed bug: where teh view port was not detected right on Safari</dd>
+ <dt>16-07-2008</dt>
+ <dd>Fixed bug where the letter 'F' could not be typed in the Hex field</dd>
+ <dd>Fixed bug where the changes on Hex field where not parsed</dd>
+ <dd>Added new option 'livePreview'</dd>
+ <dt>08-07-2008</dt>
+ <dd>Fixed typo in the code, both JavaScript and CSS</dd>
+ <dd>Changed the cursor for some elements</dd>
+ <dd>Added new demo explaining how to implement custom skin</dd>
+ <dt>07.07.2008</dt>
+ <dd>The first release.</dd>
+ </dl>
+ </div>
+ <div class="tab">
+ <h2>Implement</h2>
+ <p>Attach the Javascript and CSS files to your document. Edit CSS file and fix the paths to images and change colors to fit your site theme.</p>
+ <pre>
+&lt;link rel="stylesheet" media="screen" type="text/css" href="css/colorpicker.css" /&gt;
+&lt;script type="text/javascript" src="js/colorpicker.js"&gt;&lt;/script&gt;
+ </pre>
+ <h3>Invocation code</h3>
+ <p>All you have to do is to select the elements in a jQuery way and call the plugin.</p>
+ <pre>
+ $('input').ColorPicker(options);
+ </pre>
+ <h3>Options</h3>
+ <p>A hash of parameters. All parameters are optional.</p>
+ <table>
+ <tr>
+ <td><strong>eventName</strong></td>
+ <td>string</td>
+ <td>The desired event to trigger the colorpicker. Default: 'click'</td>
+ </tr>
+ <tr>
+ <td><strong>color</strong></td>
+ <td>string or hash</td>
+ <td>The default color. String for hex color or hash for RGB and HSB ({r:255, r:0, b:0}) . Default: 'ff0000'</td>
+ </tr>
+ <tr>
+ <td><strong>flat</strong></td>
+ <td>boolean</td>
+ <td>Whatever if the color picker is appended to the element or triggered by an event. Default false</td>
+ </tr>
+ <tr>
+ <td><strong>livePreview</strong></td>
+ <td>boolean</td>
+ <td>Whatever if the color values are filled in the fields while changing values on selector or a field. If false it may improve speed. Default true</td>
+ </tr>
+ <tr>
+ <td><strong>onShow</strong></td>
+ <td>function</td>
+ <td>Callback function triggered when the color picker is shown</td>
+ </tr>
+ <tr>
+ <td><strong>onBeforeShow</strong></td>
+ <td>function</td>
+ <td>Callback function triggered before the color picker is shown</td>
+ </tr>
+ <tr>
+ <td><strong>onHide</strong></td>
+ <td>function</td>
+ <td>Callback function triggered when the color picker is hidden</td>
+ </tr>
+ <tr>
+ <td><strong>onChange</strong></td>
+ <td>function</td>
+ <td>Callback function triggered when the color is changed</td>
+ </tr>
+ <tr>
+ <td><strong>onSubmit</strong></td>
+ <td>function</td>
+ <td>Callback function triggered when the color it is chosen</td>
+ </tr>
+ </table>
+ <h3>Set color</h3>
+ <p>If you want to set a new color.</p>
+ <pre>$('input').ColorPickerSetColor(color);</pre>
+ <p>The 'color' argument is the same format as the option color, string for hex color or hash for RGB and HSB ({r:255, r:0, b:0}).</p>
+ </div>
+ </div>
+ </div>
+</body>
+</html>
diff --git a/library/colorpicker/js/colorpicker.js b/library/colorpicker/js/colorpicker.js
new file mode 100644
index 000000000..10a2b2244
--- /dev/null
+++ b/library/colorpicker/js/colorpicker.js
@@ -0,0 +1,484 @@
+/**
+ *
+ * Color picker
+ * Author: Stefan Petre www.eyecon.ro
+ *
+ * Dual licensed under the MIT and GPL licenses
+ *
+ */
+(function ($) {
+ var ColorPicker = function () {
+ var
+ ids = {},
+ inAction,
+ charMin = 65,
+ visible,
+ tpl = '<div class="colorpicker"><div class="colorpicker_color"><div><div></div></div></div><div class="colorpicker_hue"><div></div></div><div class="colorpicker_new_color"></div><div class="colorpicker_current_color"></div><div class="colorpicker_hex"><input type="text" maxlength="6" size="6" /></div><div class="colorpicker_rgb_r colorpicker_field"><input type="text" maxlength="3" size="3" /><span></span></div><div class="colorpicker_rgb_g colorpicker_field"><input type="text" maxlength="3" size="3" /><span></span></div><div class="colorpicker_rgb_b colorpicker_field"><input type="text" maxlength="3" size="3" /><span></span></div><div class="colorpicker_hsb_h colorpicker_field"><input type="text" maxlength="3" size="3" /><span></span></div><div class="colorpicker_hsb_s colorpicker_field"><input type="text" maxlength="3" size="3" /><span></span></div><div class="colorpicker_hsb_b colorpicker_field"><input type="text" maxlength="3" size="3" /><span></span></div><div class="colorpicker_submit"></div></div>',
+ defaults = {
+ eventName: 'click',
+ onShow: function () {},
+ onBeforeShow: function(){},
+ onHide: function () {},
+ onChange: function () {},
+ onSubmit: function () {},
+ color: 'ff0000',
+ livePreview: true,
+ flat: false
+ },
+ fillRGBFields = function (hsb, cal) {
+ var rgb = HSBToRGB(hsb);
+ $(cal).data('colorpicker').fields
+ .eq(1).val(rgb.r).end()
+ .eq(2).val(rgb.g).end()
+ .eq(3).val(rgb.b).end();
+ },
+ fillHSBFields = function (hsb, cal) {
+ $(cal).data('colorpicker').fields
+ .eq(4).val(hsb.h).end()
+ .eq(5).val(hsb.s).end()
+ .eq(6).val(hsb.b).end();
+ },
+ fillHexFields = function (hsb, cal) {
+ $(cal).data('colorpicker').fields
+ .eq(0).val(HSBToHex(hsb)).end();
+ },
+ setSelector = function (hsb, cal) {
+ $(cal).data('colorpicker').selector.css('backgroundColor', '#' + HSBToHex({h: hsb.h, s: 100, b: 100}));
+ $(cal).data('colorpicker').selectorIndic.css({
+ left: parseInt(150 * hsb.s/100, 10),
+ top: parseInt(150 * (100-hsb.b)/100, 10)
+ });
+ },
+ setHue = function (hsb, cal) {
+ $(cal).data('colorpicker').hue.css('top', parseInt(150 - 150 * hsb.h/360, 10));
+ },
+ setCurrentColor = function (hsb, cal) {
+ $(cal).data('colorpicker').currentColor.css('backgroundColor', '#' + HSBToHex(hsb));
+ },
+ setNewColor = function (hsb, cal) {
+ $(cal).data('colorpicker').newColor.css('backgroundColor', '#' + HSBToHex(hsb));
+ },
+ keyDown = function (ev) {
+ var pressedKey = ev.charCode || ev.keyCode || -1;
+ if ((pressedKey > charMin && pressedKey <= 90) || pressedKey == 32) {
+ return false;
+ }
+ var cal = $(this).parent().parent();
+ if (cal.data('colorpicker').livePreview === true) {
+ change.apply(this);
+ }
+ },
+ change = function (ev) {
+ var cal = $(this).parent().parent(), col;
+ if (this.parentNode.className.indexOf('_hex') > 0) {
+ cal.data('colorpicker').color = col = HexToHSB(fixHex(this.value));
+ } else if (this.parentNode.className.indexOf('_hsb') > 0) {
+ cal.data('colorpicker').color = col = fixHSB({
+ h: parseInt(cal.data('colorpicker').fields.eq(4).val(), 10),
+ s: parseInt(cal.data('colorpicker').fields.eq(5).val(), 10),
+ b: parseInt(cal.data('colorpicker').fields.eq(6).val(), 10)
+ });
+ } else {
+ cal.data('colorpicker').color = col = RGBToHSB(fixRGB({
+ r: parseInt(cal.data('colorpicker').fields.eq(1).val(), 10),
+ g: parseInt(cal.data('colorpicker').fields.eq(2).val(), 10),
+ b: parseInt(cal.data('colorpicker').fields.eq(3).val(), 10)
+ }));
+ }
+ if (ev) {
+ fillRGBFields(col, cal.get(0));
+ fillHexFields(col, cal.get(0));
+ fillHSBFields(col, cal.get(0));
+ }
+ setSelector(col, cal.get(0));
+ setHue(col, cal.get(0));
+ setNewColor(col, cal.get(0));
+ cal.data('colorpicker').onChange.apply(cal, [col, HSBToHex(col), HSBToRGB(col)]);
+ },
+ blur = function (ev) {
+ var cal = $(this).parent().parent();
+ cal.data('colorpicker').fields.parent().removeClass('colorpicker_focus');
+ },
+ focus = function () {
+ charMin = this.parentNode.className.indexOf('_hex') > 0 ? 70 : 65;
+ $(this).parent().parent().data('colorpicker').fields.parent().removeClass('colorpicker_focus');
+ $(this).parent().addClass('colorpicker_focus');
+ },
+ downIncrement = function (ev) {
+ var field = $(this).parent().find('input').focus();
+ var current = {
+ el: $(this).parent().addClass('colorpicker_slider'),
+ max: this.parentNode.className.indexOf('_hsb_h') > 0 ? 360 : (this.parentNode.className.indexOf('_hsb') > 0 ? 100 : 255),
+ y: ev.pageY,
+ field: field,
+ val: parseInt(field.val(), 10),
+ preview: $(this).parent().parent().data('colorpicker').livePreview
+ };
+ $(document).bind('mouseup', current, upIncrement);
+ $(document).bind('mousemove', current, moveIncrement);
+ },
+ moveIncrement = function (ev) {
+ ev.data.field.val(Math.max(0, Math.min(ev.data.max, parseInt(ev.data.val + ev.pageY - ev.data.y, 10))));
+ if (ev.data.preview) {
+ change.apply(ev.data.field.get(0), [true]);
+ }
+ return false;
+ },
+ upIncrement = function (ev) {
+ change.apply(ev.data.field.get(0), [true]);
+ ev.data.el.removeClass('colorpicker_slider').find('input').focus();
+ $(document).unbind('mouseup', upIncrement);
+ $(document).unbind('mousemove', moveIncrement);
+ return false;
+ },
+ downHue = function (ev) {
+ var current = {
+ cal: $(this).parent(),
+ y: $(this).offset().top
+ };
+ current.preview = current.cal.data('colorpicker').livePreview;
+ $(document).bind('mouseup', current, upHue);
+ $(document).bind('mousemove', current, moveHue);
+ },
+ moveHue = function (ev) {
+ change.apply(
+ ev.data.cal.data('colorpicker')
+ .fields
+ .eq(4)
+ .val(parseInt(360*(150 - Math.max(0,Math.min(150,(ev.pageY - ev.data.y))))/150, 10))
+ .get(0),
+ [ev.data.preview]
+ );
+ return false;
+ },
+ upHue = function (ev) {
+ fillRGBFields(ev.data.cal.data('colorpicker').color, ev.data.cal.get(0));
+ fillHexFields(ev.data.cal.data('colorpicker').color, ev.data.cal.get(0));
+ $(document).unbind('mouseup', upHue);
+ $(document).unbind('mousemove', moveHue);
+ return false;
+ },
+ downSelector = function (ev) {
+ var current = {
+ cal: $(this).parent(),
+ pos: $(this).offset()
+ };
+ current.preview = current.cal.data('colorpicker').livePreview;
+ $(document).bind('mouseup', current, upSelector);
+ $(document).bind('mousemove', current, moveSelector);
+ },
+ moveSelector = function (ev) {
+ change.apply(
+ ev.data.cal.data('colorpicker')
+ .fields
+ .eq(6)
+ .val(parseInt(100*(150 - Math.max(0,Math.min(150,(ev.pageY - ev.data.pos.top))))/150, 10))
+ .end()
+ .eq(5)
+ .val(parseInt(100*(Math.max(0,Math.min(150,(ev.pageX - ev.data.pos.left))))/150, 10))
+ .get(0),
+ [ev.data.preview]
+ );
+ return false;
+ },
+ upSelector = function (ev) {
+ fillRGBFields(ev.data.cal.data('colorpicker').color, ev.data.cal.get(0));
+ fillHexFields(ev.data.cal.data('colorpicker').color, ev.data.cal.get(0));
+ $(document).unbind('mouseup', upSelector);
+ $(document).unbind('mousemove', moveSelector);
+ return false;
+ },
+ enterSubmit = function (ev) {
+ $(this).addClass('colorpicker_focus');
+ },
+ leaveSubmit = function (ev) {
+ $(this).removeClass('colorpicker_focus');
+ },
+ clickSubmit = function (ev) {
+ var cal = $(this).parent();
+ var col = cal.data('colorpicker').color;
+ cal.data('colorpicker').origColor = col;
+ setCurrentColor(col, cal.get(0));
+ cal.data('colorpicker').onSubmit(col, HSBToHex(col), HSBToRGB(col), cal.data('colorpicker').el);
+ },
+ show = function (ev) {
+ var cal = $('#' + $(this).data('colorpickerId'));
+ cal.data('colorpicker').onBeforeShow.apply(this, [cal.get(0)]);
+ var pos = $(this).offset();
+ var viewPort = getViewport();
+ var top = pos.top + this.offsetHeight;
+ var left = pos.left;
+ if (top + 176 > viewPort.t + viewPort.h) {
+ top -= this.offsetHeight + 176;
+ }
+ if (left + 356 > viewPort.l + viewPort.w) {
+ left -= 356;
+ }
+ cal.css({left: left + 'px', top: top + 'px'});
+ if (cal.data('colorpicker').onShow.apply(this, [cal.get(0)]) != false) {
+ cal.show();
+ }
+ $(document).bind('mousedown', {cal: cal}, hide);
+ return false;
+ },
+ hide = function (ev) {
+ if (!isChildOf(ev.data.cal.get(0), ev.target, ev.data.cal.get(0))) {
+ if (ev.data.cal.data('colorpicker').onHide.apply(this, [ev.data.cal.get(0)]) != false) {
+ ev.data.cal.hide();
+ }
+ $(document).unbind('mousedown', hide);
+ }
+ },
+ isChildOf = function(parentEl, el, container) {
+ if (parentEl == el) {
+ return true;
+ }
+ if (parentEl.contains) {
+ return parentEl.contains(el);
+ }
+ if ( parentEl.compareDocumentPosition ) {
+ return !!(parentEl.compareDocumentPosition(el) & 16);
+ }
+ var prEl = el.parentNode;
+ while(prEl && prEl != container) {
+ if (prEl == parentEl)
+ return true;
+ prEl = prEl.parentNode;
+ }
+ return false;
+ },
+ getViewport = function () {
+ var m = document.compatMode == 'CSS1Compat';
+ return {
+ l : window.pageXOffset || (m ? document.documentElement.scrollLeft : document.body.scrollLeft),
+ t : window.pageYOffset || (m ? document.documentElement.scrollTop : document.body.scrollTop),
+ w : window.innerWidth || (m ? document.documentElement.clientWidth : document.body.clientWidth),
+ h : window.innerHeight || (m ? document.documentElement.clientHeight : document.body.clientHeight)
+ };
+ },
+ fixHSB = function (hsb) {
+ return {
+ h: Math.min(360, Math.max(0, hsb.h)),
+ s: Math.min(100, Math.max(0, hsb.s)),
+ b: Math.min(100, Math.max(0, hsb.b))
+ };
+ },
+ fixRGB = function (rgb) {
+ return {
+ r: Math.min(255, Math.max(0, rgb.r)),
+ g: Math.min(255, Math.max(0, rgb.g)),
+ b: Math.min(255, Math.max(0, rgb.b))
+ };
+ },
+ fixHex = function (hex) {
+ var len = 6 - hex.length;
+ if (len > 0) {
+ var o = [];
+ for (var i=0; i<len; i++) {
+ o.push('0');
+ }
+ o.push(hex);
+ hex = o.join('');
+ }
+ return hex;
+ },
+ HexToRGB = function (hex) {
+ var hex = parseInt(((hex.indexOf('#') > -1) ? hex.substring(1) : hex), 16);
+ return {r: hex >> 16, g: (hex & 0x00FF00) >> 8, b: (hex & 0x0000FF)};
+ },
+ HexToHSB = function (hex) {
+ return RGBToHSB(HexToRGB(hex));
+ },
+ RGBToHSB = function (rgb) {
+ var hsb = {
+ h: 0,
+ s: 0,
+ b: 0
+ };
+ var min = Math.min(rgb.r, rgb.g, rgb.b);
+ var max = Math.max(rgb.r, rgb.g, rgb.b);
+ var delta = max - min;
+ hsb.b = max;
+ if (max != 0) {
+
+ }
+ hsb.s = max != 0 ? 255 * delta / max : 0;
+ if (hsb.s != 0) {
+ if (rgb.r == max) {
+ hsb.h = (rgb.g - rgb.b) / delta;
+ } else if (rgb.g == max) {
+ hsb.h = 2 + (rgb.b - rgb.r) / delta;
+ } else {
+ hsb.h = 4 + (rgb.r - rgb.g) / delta;
+ }
+ } else {
+ hsb.h = -1;
+ }
+ hsb.h *= 60;
+ if (hsb.h < 0) {
+ hsb.h += 360;
+ }
+ hsb.s *= 100/255;
+ hsb.b *= 100/255;
+ return hsb;
+ },
+ HSBToRGB = function (hsb) {
+ var rgb = {};
+ var h = Math.round(hsb.h);
+ var s = Math.round(hsb.s*255/100);
+ var v = Math.round(hsb.b*255/100);
+ if(s == 0) {
+ rgb.r = rgb.g = rgb.b = v;
+ } else {
+ var t1 = v;
+ var t2 = (255-s)*v/255;
+ var t3 = (t1-t2)*(h%60)/60;
+ if(h==360) h = 0;
+ if(h<60) {rgb.r=t1; rgb.b=t2; rgb.g=t2+t3}
+ else if(h<120) {rgb.g=t1; rgb.b=t2; rgb.r=t1-t3}
+ else if(h<180) {rgb.g=t1; rgb.r=t2; rgb.b=t2+t3}
+ else if(h<240) {rgb.b=t1; rgb.r=t2; rgb.g=t1-t3}
+ else if(h<300) {rgb.b=t1; rgb.g=t2; rgb.r=t2+t3}
+ else if(h<360) {rgb.r=t1; rgb.g=t2; rgb.b=t1-t3}
+ else {rgb.r=0; rgb.g=0; rgb.b=0}
+ }
+ return {r:Math.round(rgb.r), g:Math.round(rgb.g), b:Math.round(rgb.b)};
+ },
+ RGBToHex = function (rgb) {
+ var hex = [
+ rgb.r.toString(16),
+ rgb.g.toString(16),
+ rgb.b.toString(16)
+ ];
+ $.each(hex, function (nr, val) {
+ if (val.length == 1) {
+ hex[nr] = '0' + val;
+ }
+ });
+ return hex.join('');
+ },
+ HSBToHex = function (hsb) {
+ return RGBToHex(HSBToRGB(hsb));
+ },
+ restoreOriginal = function () {
+ var cal = $(this).parent();
+ var col = cal.data('colorpicker').origColor;
+ cal.data('colorpicker').color = col;
+ fillRGBFields(col, cal.get(0));
+ fillHexFields(col, cal.get(0));
+ fillHSBFields(col, cal.get(0));
+ setSelector(col, cal.get(0));
+ setHue(col, cal.get(0));
+ setNewColor(col, cal.get(0));
+ };
+ return {
+ init: function (opt) {
+ opt = $.extend({}, defaults, opt||{});
+ if (typeof opt.color == 'string') {
+ opt.color = HexToHSB(opt.color);
+ } else if (opt.color.r != undefined && opt.color.g != undefined && opt.color.b != undefined) {
+ opt.color = RGBToHSB(opt.color);
+ } else if (opt.color.h != undefined && opt.color.s != undefined && opt.color.b != undefined) {
+ opt.color = fixHSB(opt.color);
+ } else {
+ return this;
+ }
+ return this.each(function () {
+ if (!$(this).data('colorpickerId')) {
+ var options = $.extend({}, opt);
+ options.origColor = opt.color;
+ var id = 'collorpicker_' + parseInt(Math.random() * 1000);
+ $(this).data('colorpickerId', id);
+ var cal = $(tpl).attr('id', id);
+ if (options.flat) {
+ cal.appendTo(this).show();
+ } else {
+ cal.appendTo(document.body);
+ }
+ options.fields = cal
+ .find('input')
+ .bind('keyup', keyDown)
+ .bind('change', change)
+ .bind('blur', blur)
+ .bind('focus', focus);
+ cal
+ .find('span').bind('mousedown', downIncrement).end()
+ .find('>div.colorpicker_current_color').bind('click', restoreOriginal);
+ options.selector = cal.find('div.colorpicker_color').bind('mousedown', downSelector);
+ options.selectorIndic = options.selector.find('div div');
+ options.el = this;
+ options.hue = cal.find('div.colorpicker_hue div');
+ cal.find('div.colorpicker_hue').bind('mousedown', downHue);
+ options.newColor = cal.find('div.colorpicker_new_color');
+ options.currentColor = cal.find('div.colorpicker_current_color');
+ cal.data('colorpicker', options);
+ cal.find('div.colorpicker_submit')
+ .bind('mouseenter', enterSubmit)
+ .bind('mouseleave', leaveSubmit)
+ .bind('click', clickSubmit);
+ fillRGBFields(options.color, cal.get(0));
+ fillHSBFields(options.color, cal.get(0));
+ fillHexFields(options.color, cal.get(0));
+ setHue(options.color, cal.get(0));
+ setSelector(options.color, cal.get(0));
+ setCurrentColor(options.color, cal.get(0));
+ setNewColor(options.color, cal.get(0));
+ if (options.flat) {
+ cal.css({
+ position: 'relative',
+ display: 'block'
+ });
+ } else {
+ $(this).bind(options.eventName, show);
+ }
+ }
+ });
+ },
+ showPicker: function() {
+ return this.each( function () {
+ if ($(this).data('colorpickerId')) {
+ show.apply(this);
+ }
+ });
+ },
+ hidePicker: function() {
+ return this.each( function () {
+ if ($(this).data('colorpickerId')) {
+ $('#' + $(this).data('colorpickerId')).hide();
+ }
+ });
+ },
+ setColor: function(col) {
+ if (typeof col == 'string') {
+ col = HexToHSB(col);
+ } else if (col.r != undefined && col.g != undefined && col.b != undefined) {
+ col = RGBToHSB(col);
+ } else if (col.h != undefined && col.s != undefined && col.b != undefined) {
+ col = fixHSB(col);
+ } else {
+ return this;
+ }
+ return this.each(function(){
+ if ($(this).data('colorpickerId')) {
+ var cal = $('#' + $(this).data('colorpickerId'));
+ cal.data('colorpicker').color = col;
+ cal.data('colorpicker').origColor = col;
+ fillRGBFields(col, cal.get(0));
+ fillHSBFields(col, cal.get(0));
+ fillHexFields(col, cal.get(0));
+ setHue(col, cal.get(0));
+ setSelector(col, cal.get(0));
+ setCurrentColor(col, cal.get(0));
+ setNewColor(col, cal.get(0));
+ }
+ });
+ }
+ };
+ }();
+ $.fn.extend({
+ ColorPicker: ColorPicker.init,
+ ColorPickerHide: ColorPicker.hidePicker,
+ ColorPickerShow: ColorPicker.showPicker,
+ ColorPickerSetColor: ColorPicker.setColor
+ });
+})(jQuery) \ No newline at end of file
diff --git a/library/colorpicker/js/eye.js b/library/colorpicker/js/eye.js
new file mode 100644
index 000000000..ea70e643f
--- /dev/null
+++ b/library/colorpicker/js/eye.js
@@ -0,0 +1,34 @@
+/**
+ *
+ * Zoomimage
+ * Author: Stefan Petre www.eyecon.ro
+ *
+ */
+(function($){
+ var EYE = window.EYE = function() {
+ var _registered = {
+ init: []
+ };
+ return {
+ init: function() {
+ $.each(_registered.init, function(nr, fn){
+ fn.call();
+ });
+ },
+ extend: function(prop) {
+ for (var i in prop) {
+ if (prop[i] != undefined) {
+ this[i] = prop[i];
+ }
+ }
+ },
+ register: function(fn, type) {
+ if (!_registered[type]) {
+ _registered[type] = [];
+ }
+ _registered[type].push(fn);
+ }
+ };
+ }();
+ $(EYE.init);
+})(jQuery);
diff --git a/library/colorpicker/js/layout.js b/library/colorpicker/js/layout.js
new file mode 100644
index 000000000..e0dfb8f33
--- /dev/null
+++ b/library/colorpicker/js/layout.js
@@ -0,0 +1,67 @@
+(function($){
+ var initLayout = function() {
+ var hash = window.location.hash.replace('#', '');
+ var currentTab = $('ul.navigationTabs a')
+ .bind('click', showTab)
+ .filter('a[rel=' + hash + ']');
+ if (currentTab.size() == 0) {
+ currentTab = $('ul.navigationTabs a:first');
+ }
+ showTab.apply(currentTab.get(0));
+ $('#colorpickerHolder').ColorPicker({flat: true});
+ $('#colorpickerHolder2').ColorPicker({
+ flat: true,
+ color: '#00ff00',
+ onSubmit: function(hsb, hex, rgb) {
+ $('#colorSelector2 div').css('backgroundColor', '#' + hex);
+ }
+ });
+ $('#colorpickerHolder2>div').css('position', 'absolute');
+ var widt = false;
+ $('#colorSelector2').bind('click', function() {
+ $('#colorpickerHolder2').stop().animate({height: widt ? 0 : 173}, 500);
+ widt = !widt;
+ });
+ $('#colorpickerField1, #colorpickerField2, #colorpickerField3').ColorPicker({
+ onSubmit: function(hsb, hex, rgb, el) {
+ $(el).val(hex);
+ $(el).ColorPickerHide();
+ },
+ onBeforeShow: function () {
+ $(this).ColorPickerSetColor(this.value);
+ }
+ })
+ .bind('keyup', function(){
+ $(this).ColorPickerSetColor(this.value);
+ });
+ $('#colorSelector').ColorPicker({
+ color: '#0000ff',
+ onShow: function (colpkr) {
+ $(colpkr).fadeIn(500);
+ return false;
+ },
+ onHide: function (colpkr) {
+ $(colpkr).fadeOut(500);
+ return false;
+ },
+ onChange: function (hsb, hex, rgb) {
+ $('#colorSelector div').css('backgroundColor', '#' + hex);
+ }
+ });
+ };
+
+ var showTab = function(e) {
+ var tabIndex = $('ul.navigationTabs a')
+ .removeClass('active')
+ .index(this);
+ $(this)
+ .addClass('active')
+ .blur();
+ $('div.tab')
+ .hide()
+ .eq(tabIndex)
+ .show();
+ };
+
+ EYE.register(initLayout, 'init');
+})(jQuery) \ No newline at end of file
diff --git a/library/colorpicker/js/utils.js b/library/colorpicker/js/utils.js
new file mode 100644
index 000000000..cc7ce14ec
--- /dev/null
+++ b/library/colorpicker/js/utils.js
@@ -0,0 +1,252 @@
+/**
+ *
+ * Utilities
+ * Author: Stefan Petre www.eyecon.ro
+ *
+ */
+(function($) {
+EYE.extend({
+ getPosition : function(e, forceIt)
+ {
+ var x = 0;
+ var y = 0;
+ var es = e.style;
+ var restoreStyles = false;
+ if (forceIt && jQuery.curCSS(e,'display') == 'none') {
+ var oldVisibility = es.visibility;
+ var oldPosition = es.position;
+ restoreStyles = true;
+ es.visibility = 'hidden';
+ es.display = 'block';
+ es.position = 'absolute';
+ }
+ var el = e;
+ if (el.getBoundingClientRect) { // IE
+ var box = el.getBoundingClientRect();
+ x = box.left + Math.max(document.documentElement.scrollLeft, document.body.scrollLeft) - 2;
+ y = box.top + Math.max(document.documentElement.scrollTop, document.body.scrollTop) - 2;
+ } else {
+ x = el.offsetLeft;
+ y = el.offsetTop;
+ el = el.offsetParent;
+ if (e != el) {
+ while (el) {
+ x += el.offsetLeft;
+ y += el.offsetTop;
+ el = el.offsetParent;
+ }
+ }
+ if (jQuery.browser.safari && jQuery.curCSS(e, 'position') == 'absolute' ) {
+ x -= document.body.offsetLeft;
+ y -= document.body.offsetTop;
+ }
+ el = e.parentNode;
+ while (el && el.tagName.toUpperCase() != 'BODY' && el.tagName.toUpperCase() != 'HTML')
+ {
+ if (jQuery.curCSS(el, 'display') != 'inline') {
+ x -= el.scrollLeft;
+ y -= el.scrollTop;
+ }
+ el = el.parentNode;
+ }
+ }
+ if (restoreStyles == true) {
+ es.display = 'none';
+ es.position = oldPosition;
+ es.visibility = oldVisibility;
+ }
+ return {x:x, y:y};
+ },
+ getSize : function(e)
+ {
+ var w = parseInt(jQuery.curCSS(e,'width'), 10);
+ var h = parseInt(jQuery.curCSS(e,'height'), 10);
+ var wb = 0;
+ var hb = 0;
+ if (jQuery.curCSS(e, 'display') != 'none') {
+ wb = e.offsetWidth;
+ hb = e.offsetHeight;
+ } else {
+ var es = e.style;
+ var oldVisibility = es.visibility;
+ var oldPosition = es.position;
+ es.visibility = 'hidden';
+ es.display = 'block';
+ es.position = 'absolute';
+ wb = e.offsetWidth;
+ hb = e.offsetHeight;
+ es.display = 'none';
+ es.position = oldPosition;
+ es.visibility = oldVisibility;
+ }
+ return {w:w, h:h, wb:wb, hb:hb};
+ },
+ getClient : function(e)
+ {
+ var h, w;
+ if (e) {
+ w = e.clientWidth;
+ h = e.clientHeight;
+ } else {
+ var de = document.documentElement;
+ w = window.innerWidth || self.innerWidth || (de&&de.clientWidth) || document.body.clientWidth;
+ h = window.innerHeight || self.innerHeight || (de&&de.clientHeight) || document.body.clientHeight;
+ }
+ return {w:w,h:h};
+ },
+ getScroll : function (e)
+ {
+ var t=0, l=0, w=0, h=0, iw=0, ih=0;
+ if (e && e.nodeName.toLowerCase() != 'body') {
+ t = e.scrollTop;
+ l = e.scrollLeft;
+ w = e.scrollWidth;
+ h = e.scrollHeight;
+ } else {
+ if (document.documentElement) {
+ t = document.documentElement.scrollTop;
+ l = document.documentElement.scrollLeft;
+ w = document.documentElement.scrollWidth;
+ h = document.documentElement.scrollHeight;
+ } else if (document.body) {
+ t = document.body.scrollTop;
+ l = document.body.scrollLeft;
+ w = document.body.scrollWidth;
+ h = document.body.scrollHeight;
+ }
+ if (typeof pageYOffset != 'undefined') {
+ t = pageYOffset;
+ l = pageXOffset;
+ }
+ iw = self.innerWidth||document.documentElement.clientWidth||document.body.clientWidth||0;
+ ih = self.innerHeight||document.documentElement.clientHeight||document.body.clientHeight||0;
+ }
+ return { t: t, l: l, w: w, h: h, iw: iw, ih: ih };
+ },
+ getMargins : function(e, toInteger)
+ {
+ var t = jQuery.curCSS(e,'marginTop') || '';
+ var r = jQuery.curCSS(e,'marginRight') || '';
+ var b = jQuery.curCSS(e,'marginBottom') || '';
+ var l = jQuery.curCSS(e,'marginLeft') || '';
+ if (toInteger)
+ return {
+ t: parseInt(t, 10)||0,
+ r: parseInt(r, 10)||0,
+ b: parseInt(b, 10)||0,
+ l: parseInt(l, 10)
+ };
+ else
+ return {t: t, r: r, b: b, l: l};
+ },
+ getPadding : function(e, toInteger)
+ {
+ var t = jQuery.curCSS(e,'paddingTop') || '';
+ var r = jQuery.curCSS(e,'paddingRight') || '';
+ var b = jQuery.curCSS(e,'paddingBottom') || '';
+ var l = jQuery.curCSS(e,'paddingLeft') || '';
+ if (toInteger)
+ return {
+ t: parseInt(t, 10)||0,
+ r: parseInt(r, 10)||0,
+ b: parseInt(b, 10)||0,
+ l: parseInt(l, 10)
+ };
+ else
+ return {t: t, r: r, b: b, l: l};
+ },
+ getBorder : function(e, toInteger)
+ {
+ var t = jQuery.curCSS(e,'borderTopWidth') || '';
+ var r = jQuery.curCSS(e,'borderRightWidth') || '';
+ var b = jQuery.curCSS(e,'borderBottomWidth') || '';
+ var l = jQuery.curCSS(e,'borderLeftWidth') || '';
+ if (toInteger)
+ return {
+ t: parseInt(t, 10)||0,
+ r: parseInt(r, 10)||0,
+ b: parseInt(b, 10)||0,
+ l: parseInt(l, 10)||0
+ };
+ else
+ return {t: t, r: r, b: b, l: l};
+ },
+ traverseDOM : function(nodeEl, func)
+ {
+ func(nodeEl);
+ nodeEl = nodeEl.firstChild;
+ while(nodeEl){
+ EYE.traverseDOM(nodeEl, func);
+ nodeEl = nodeEl.nextSibling;
+ }
+ },
+ getInnerWidth : function(el, scroll) {
+ var offsetW = el.offsetWidth;
+ return scroll ? Math.max(el.scrollWidth,offsetW) - offsetW + el.clientWidth:el.clientWidth;
+ },
+ getInnerHeight : function(el, scroll) {
+ var offsetH = el.offsetHeight;
+ return scroll ? Math.max(el.scrollHeight,offsetH) - offsetH + el.clientHeight:el.clientHeight;
+ },
+ getExtraWidth : function(el) {
+ if($.boxModel)
+ return (parseInt($.curCSS(el, 'paddingLeft'))||0)
+ + (parseInt($.curCSS(el, 'paddingRight'))||0)
+ + (parseInt($.curCSS(el, 'borderLeftWidth'))||0)
+ + (parseInt($.curCSS(el, 'borderRightWidth'))||0);
+ return 0;
+ },
+ getExtraHeight : function(el) {
+ if($.boxModel)
+ return (parseInt($.curCSS(el, 'paddingTop'))||0)
+ + (parseInt($.curCSS(el, 'paddingBottom'))||0)
+ + (parseInt($.curCSS(el, 'borderTopWidth'))||0)
+ + (parseInt($.curCSS(el, 'borderBottomWidth'))||0);
+ return 0;
+ },
+ isChildOf: function(parentEl, el, container) {
+ if (parentEl == el) {
+ return true;
+ }
+ if (!el || !el.nodeType || el.nodeType != 1) {
+ return false;
+ }
+ if (parentEl.contains && !$.browser.safari) {
+ return parentEl.contains(el);
+ }
+ if ( parentEl.compareDocumentPosition ) {
+ return !!(parentEl.compareDocumentPosition(el) & 16);
+ }
+ var prEl = el.parentNode;
+ while(prEl && prEl != container) {
+ if (prEl == parentEl)
+ return true;
+ prEl = prEl.parentNode;
+ }
+ return false;
+ },
+ centerEl : function(el, axis)
+ {
+ var clientScroll = EYE.getScroll();
+ var size = EYE.getSize(el);
+ if (!axis || axis == 'vertically')
+ $(el).css(
+ {
+ top: clientScroll.t + ((Math.min(clientScroll.h,clientScroll.ih) - size.hb)/2) + 'px'
+ }
+ );
+ if (!axis || axis == 'horizontally')
+ $(el).css(
+ {
+ left: clientScroll.l + ((Math.min(clientScroll.w,clientScroll.iw) - size.wb)/2) + 'px'
+ }
+ );
+ }
+});
+if (!$.easing.easeout) {
+ $.easing.easeout = function(p, n, firstNum, delta, duration) {
+ return -delta * ((n=n/duration-1)*n*n*n - 1) + firstNum;
+ };
+}
+
+})(jQuery); \ No newline at end of file
diff --git a/library/cryptojs/README b/library/cryptojs/README
new file mode 100644
index 000000000..4fbf57034
--- /dev/null
+++ b/library/cryptojs/README
@@ -0,0 +1 @@
+http://code.google.com/p/crypto-js/
diff --git a/library/cryptojs/components/aes-min.js b/library/cryptojs/components/aes-min.js
new file mode 100644
index 000000000..8b34064d3
--- /dev/null
+++ b/library/cryptojs/components/aes-min.js
@@ -0,0 +1,10 @@
+/*
+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
+*/
+(function(){for(var q=CryptoJS,x=q.lib.BlockCipher,r=q.algo,j=[],y=[],z=[],A=[],B=[],C=[],s=[],u=[],v=[],w=[],g=[],k=0;256>k;k++)g[k]=128>k?k<<1:k<<1^283;for(var n=0,l=0,k=0;256>k;k++){var f=l^l<<1^l<<2^l<<3^l<<4,f=f>>>8^f&255^99;j[n]=f;y[f]=n;var t=g[n],D=g[t],E=g[D],b=257*g[f]^16843008*f;z[n]=b<<24|b>>>8;A[n]=b<<16|b>>>16;B[n]=b<<8|b>>>24;C[n]=b;b=16843009*E^65537*D^257*t^16843008*n;s[f]=b<<24|b>>>8;u[f]=b<<16|b>>>16;v[f]=b<<8|b>>>24;w[f]=b;n?(n=t^g[g[g[E^t]]],l^=g[g[l]]):n=l=1}var F=[0,1,2,4,8,
+16,32,64,128,27,54],r=r.AES=x.extend({_doReset:function(){for(var c=this._key,e=c.words,a=c.sigBytes/4,c=4*((this._nRounds=a+6)+1),b=this._keySchedule=[],h=0;h<c;h++)if(h<a)b[h]=e[h];else{var d=b[h-1];h%a?6<a&&4==h%a&&(d=j[d>>>24]<<24|j[d>>>16&255]<<16|j[d>>>8&255]<<8|j[d&255]):(d=d<<8|d>>>24,d=j[d>>>24]<<24|j[d>>>16&255]<<16|j[d>>>8&255]<<8|j[d&255],d^=F[h/a|0]<<24);b[h]=b[h-a]^d}e=this._invKeySchedule=[];for(a=0;a<c;a++)h=c-a,d=a%4?b[h]:b[h-4],e[a]=4>a||4>=h?d:s[j[d>>>24]]^u[j[d>>>16&255]]^v[j[d>>>
+8&255]]^w[j[d&255]]},encryptBlock:function(c,e){this._doCryptBlock(c,e,this._keySchedule,z,A,B,C,j)},decryptBlock:function(c,e){var a=c[e+1];c[e+1]=c[e+3];c[e+3]=a;this._doCryptBlock(c,e,this._invKeySchedule,s,u,v,w,y);a=c[e+1];c[e+1]=c[e+3];c[e+3]=a},_doCryptBlock:function(c,e,a,b,h,d,j,m){for(var n=this._nRounds,f=c[e]^a[0],g=c[e+1]^a[1],k=c[e+2]^a[2],p=c[e+3]^a[3],l=4,t=1;t<n;t++)var q=b[f>>>24]^h[g>>>16&255]^d[k>>>8&255]^j[p&255]^a[l++],r=b[g>>>24]^h[k>>>16&255]^d[p>>>8&255]^j[f&255]^a[l++],s=
+b[k>>>24]^h[p>>>16&255]^d[f>>>8&255]^j[g&255]^a[l++],p=b[p>>>24]^h[f>>>16&255]^d[g>>>8&255]^j[k&255]^a[l++],f=q,g=r,k=s;q=(m[f>>>24]<<24|m[g>>>16&255]<<16|m[k>>>8&255]<<8|m[p&255])^a[l++];r=(m[g>>>24]<<24|m[k>>>16&255]<<16|m[p>>>8&255]<<8|m[f&255])^a[l++];s=(m[k>>>24]<<24|m[p>>>16&255]<<16|m[f>>>8&255]<<8|m[g&255])^a[l++];p=(m[p>>>24]<<24|m[f>>>16&255]<<16|m[g>>>8&255]<<8|m[k&255])^a[l++];c[e]=q;c[e+1]=r;c[e+2]=s;c[e+3]=p},keySize:8});q.AES=x._createHelper(r)})();
diff --git a/library/cryptojs/components/aes.js b/library/cryptojs/components/aes.js
new file mode 100644
index 000000000..13bfd80a2
--- /dev/null
+++ b/library/cryptojs/components/aes.js
@@ -0,0 +1,213 @@
+/*
+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
+*/
+(function () {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var BlockCipher = C_lib.BlockCipher;
+ var C_algo = C.algo;
+
+ // Lookup tables
+ var SBOX = [];
+ var INV_SBOX = [];
+ var SUB_MIX_0 = [];
+ var SUB_MIX_1 = [];
+ var SUB_MIX_2 = [];
+ var SUB_MIX_3 = [];
+ var INV_SUB_MIX_0 = [];
+ var INV_SUB_MIX_1 = [];
+ var INV_SUB_MIX_2 = [];
+ var INV_SUB_MIX_3 = [];
+
+ // Compute lookup tables
+ (function () {
+ // Compute double table
+ var d = [];
+ for (var i = 0; i < 256; i++) {
+ if (i < 128) {
+ d[i] = i << 1;
+ } else {
+ d[i] = (i << 1) ^ 0x11b;
+ }
+ }
+
+ // Walk GF(2^8)
+ var x = 0;
+ var xi = 0;
+ for (var i = 0; i < 256; i++) {
+ // Compute sbox
+ var sx = xi ^ (xi << 1) ^ (xi << 2) ^ (xi << 3) ^ (xi << 4);
+ sx = (sx >>> 8) ^ (sx & 0xff) ^ 0x63;
+ SBOX[x] = sx;
+ INV_SBOX[sx] = x;
+
+ // Compute multiplication
+ var x2 = d[x];
+ var x4 = d[x2];
+ var x8 = d[x4];
+
+ // Compute sub bytes, mix columns tables
+ var t = (d[sx] * 0x101) ^ (sx * 0x1010100);
+ SUB_MIX_0[x] = (t << 24) | (t >>> 8);
+ SUB_MIX_1[x] = (t << 16) | (t >>> 16);
+ SUB_MIX_2[x] = (t << 8) | (t >>> 24);
+ SUB_MIX_3[x] = t;
+
+ // Compute inv sub bytes, inv mix columns tables
+ var t = (x8 * 0x1010101) ^ (x4 * 0x10001) ^ (x2 * 0x101) ^ (x * 0x1010100);
+ INV_SUB_MIX_0[sx] = (t << 24) | (t >>> 8);
+ INV_SUB_MIX_1[sx] = (t << 16) | (t >>> 16);
+ INV_SUB_MIX_2[sx] = (t << 8) | (t >>> 24);
+ INV_SUB_MIX_3[sx] = t;
+
+ // Compute next counter
+ if (!x) {
+ x = xi = 1;
+ } else {
+ x = x2 ^ d[d[d[x8 ^ x2]]];
+ xi ^= d[d[xi]];
+ }
+ }
+ }());
+
+ // Precomputed Rcon lookup
+ var RCON = [0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36];
+
+ /**
+ * AES block cipher algorithm.
+ */
+ var AES = C_algo.AES = BlockCipher.extend({
+ _doReset: function () {
+ // Shortcuts
+ var key = this._key;
+ var keyWords = key.words;
+ var keySize = key.sigBytes / 4;
+
+ // Compute number of rounds
+ var nRounds = this._nRounds = keySize + 6
+
+ // Compute number of key schedule rows
+ var ksRows = (nRounds + 1) * 4;
+
+ // Compute key schedule
+ var keySchedule = this._keySchedule = [];
+ for (var ksRow = 0; ksRow < ksRows; ksRow++) {
+ if (ksRow < keySize) {
+ keySchedule[ksRow] = keyWords[ksRow];
+ } else {
+ var t = keySchedule[ksRow - 1];
+
+ if (!(ksRow % keySize)) {
+ // Rot word
+ t = (t << 8) | (t >>> 24);
+
+ // Sub word
+ t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff];
+
+ // Mix Rcon
+ t ^= RCON[(ksRow / keySize) | 0] << 24;
+ } else if (keySize > 6 && ksRow % keySize == 4) {
+ // Sub word
+ t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff];
+ }
+
+ keySchedule[ksRow] = keySchedule[ksRow - keySize] ^ t;
+ }
+ }
+
+ // Compute inv key schedule
+ var invKeySchedule = this._invKeySchedule = [];
+ for (var invKsRow = 0; invKsRow < ksRows; invKsRow++) {
+ var ksRow = ksRows - invKsRow;
+
+ if (invKsRow % 4) {
+ var t = keySchedule[ksRow];
+ } else {
+ var t = keySchedule[ksRow - 4];
+ }
+
+ if (invKsRow < 4 || ksRow <= 4) {
+ invKeySchedule[invKsRow] = t;
+ } else {
+ invKeySchedule[invKsRow] = INV_SUB_MIX_0[SBOX[t >>> 24]] ^ INV_SUB_MIX_1[SBOX[(t >>> 16) & 0xff]] ^
+ INV_SUB_MIX_2[SBOX[(t >>> 8) & 0xff]] ^ INV_SUB_MIX_3[SBOX[t & 0xff]];
+ }
+ }
+ },
+
+ encryptBlock: function (M, offset) {
+ this._doCryptBlock(M, offset, this._keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX);
+ },
+
+ decryptBlock: function (M, offset) {
+ // Swap 2nd and 4th rows
+ var t = M[offset + 1];
+ M[offset + 1] = M[offset + 3];
+ M[offset + 3] = t;
+
+ this._doCryptBlock(M, offset, this._invKeySchedule, INV_SUB_MIX_0, INV_SUB_MIX_1, INV_SUB_MIX_2, INV_SUB_MIX_3, INV_SBOX);
+
+ // Inv swap 2nd and 4th rows
+ var t = M[offset + 1];
+ M[offset + 1] = M[offset + 3];
+ M[offset + 3] = t;
+ },
+
+ _doCryptBlock: function (M, offset, keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX) {
+ // Shortcut
+ var nRounds = this._nRounds;
+
+ // Get input, add round key
+ var s0 = M[offset] ^ keySchedule[0];
+ var s1 = M[offset + 1] ^ keySchedule[1];
+ var s2 = M[offset + 2] ^ keySchedule[2];
+ var s3 = M[offset + 3] ^ keySchedule[3];
+
+ // Key schedule row counter
+ var ksRow = 4;
+
+ // Rounds
+ for (var round = 1; round < nRounds; round++) {
+ // Shift rows, sub bytes, mix columns, add round key
+ var t0 = SUB_MIX_0[s0 >>> 24] ^ SUB_MIX_1[(s1 >>> 16) & 0xff] ^ SUB_MIX_2[(s2 >>> 8) & 0xff] ^ SUB_MIX_3[s3 & 0xff] ^ keySchedule[ksRow++];
+ var t1 = SUB_MIX_0[s1 >>> 24] ^ SUB_MIX_1[(s2 >>> 16) & 0xff] ^ SUB_MIX_2[(s3 >>> 8) & 0xff] ^ SUB_MIX_3[s0 & 0xff] ^ keySchedule[ksRow++];
+ var t2 = SUB_MIX_0[s2 >>> 24] ^ SUB_MIX_1[(s3 >>> 16) & 0xff] ^ SUB_MIX_2[(s0 >>> 8) & 0xff] ^ SUB_MIX_3[s1 & 0xff] ^ keySchedule[ksRow++];
+ var t3 = SUB_MIX_0[s3 >>> 24] ^ SUB_MIX_1[(s0 >>> 16) & 0xff] ^ SUB_MIX_2[(s1 >>> 8) & 0xff] ^ SUB_MIX_3[s2 & 0xff] ^ keySchedule[ksRow++];
+
+ // Update state
+ s0 = t0;
+ s1 = t1;
+ s2 = t2;
+ s3 = t3;
+ }
+
+ // Shift rows, sub bytes, add round key
+ var t0 = ((SBOX[s0 >>> 24] << 24) | (SBOX[(s1 >>> 16) & 0xff] << 16) | (SBOX[(s2 >>> 8) & 0xff] << 8) | SBOX[s3 & 0xff]) ^ keySchedule[ksRow++];
+ var t1 = ((SBOX[s1 >>> 24] << 24) | (SBOX[(s2 >>> 16) & 0xff] << 16) | (SBOX[(s3 >>> 8) & 0xff] << 8) | SBOX[s0 & 0xff]) ^ keySchedule[ksRow++];
+ var t2 = ((SBOX[s2 >>> 24] << 24) | (SBOX[(s3 >>> 16) & 0xff] << 16) | (SBOX[(s0 >>> 8) & 0xff] << 8) | SBOX[s1 & 0xff]) ^ keySchedule[ksRow++];
+ var t3 = ((SBOX[s3 >>> 24] << 24) | (SBOX[(s0 >>> 16) & 0xff] << 16) | (SBOX[(s1 >>> 8) & 0xff] << 8) | SBOX[s2 & 0xff]) ^ keySchedule[ksRow++];
+
+ // Set output
+ M[offset] = t0;
+ M[offset + 1] = t1;
+ M[offset + 2] = t2;
+ M[offset + 3] = t3;
+ },
+
+ keySize: 256/32
+ });
+
+ /**
+ * Shortcut functions to the cipher's object interface.
+ *
+ * @example
+ *
+ * var ciphertext = CryptoJS.AES.encrypt(message, key, cfg);
+ * var plaintext = CryptoJS.AES.decrypt(ciphertext, key, cfg);
+ */
+ C.AES = BlockCipher._createHelper(AES);
+}());
diff --git a/library/cryptojs/components/cipher-core-min.js b/library/cryptojs/components/cipher-core-min.js
new file mode 100644
index 000000000..917939c8b
--- /dev/null
+++ b/library/cryptojs/components/cipher-core-min.js
@@ -0,0 +1,14 @@
+/*
+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
+*/
+CryptoJS.lib.Cipher||function(u){var g=CryptoJS,f=g.lib,k=f.Base,l=f.WordArray,q=f.BufferedBlockAlgorithm,r=g.enc.Base64,v=g.algo.EvpKDF,n=f.Cipher=q.extend({cfg:k.extend(),createEncryptor:function(a,b){return this.create(this._ENC_XFORM_MODE,a,b)},createDecryptor:function(a,b){return this.create(this._DEC_XFORM_MODE,a,b)},init:function(a,b,c){this.cfg=this.cfg.extend(c);this._xformMode=a;this._key=b;this.reset()},reset:function(){q.reset.call(this);this._doReset()},process:function(a){this._append(a);
+return this._process()},finalize:function(a){a&&this._append(a);return this._doFinalize()},keySize:4,ivSize:4,_ENC_XFORM_MODE:1,_DEC_XFORM_MODE:2,_createHelper:function(a){return{encrypt:function(b,c,d){return("string"==typeof c?s:j).encrypt(a,b,c,d)},decrypt:function(b,c,d){return("string"==typeof c?s:j).decrypt(a,b,c,d)}}}});f.StreamCipher=n.extend({_doFinalize:function(){return this._process(!0)},blockSize:1});var m=g.mode={},t=function(a,b,c){var d=this._iv;d?this._iv=u:d=this._prevBlock;for(var e=
+0;e<c;e++)a[b+e]^=d[e]},h=(f.BlockCipherMode=k.extend({createEncryptor:function(a,b){return this.Encryptor.create(a,b)},createDecryptor:function(a,b){return this.Decryptor.create(a,b)},init:function(a,b){this._cipher=a;this._iv=b}})).extend();h.Encryptor=h.extend({processBlock:function(a,b){var c=this._cipher,d=c.blockSize;t.call(this,a,b,d);c.encryptBlock(a,b);this._prevBlock=a.slice(b,b+d)}});h.Decryptor=h.extend({processBlock:function(a,b){var c=this._cipher,d=c.blockSize,e=a.slice(b,b+d);c.decryptBlock(a,
+b);t.call(this,a,b,d);this._prevBlock=e}});m=m.CBC=h;h=(g.pad={}).Pkcs7={pad:function(a,b){for(var c=4*b,c=c-a.sigBytes%c,d=c<<24|c<<16|c<<8|c,e=[],f=0;f<c;f+=4)e.push(d);c=l.create(e,c);a.concat(c)},unpad:function(a){a.sigBytes-=a.words[a.sigBytes-1>>>2]&255}};f.BlockCipher=n.extend({cfg:n.cfg.extend({mode:m,padding:h}),reset:function(){n.reset.call(this);var a=this.cfg,b=a.iv,a=a.mode;if(this._xformMode==this._ENC_XFORM_MODE)var c=a.createEncryptor;else c=a.createDecryptor,this._minBufferSize=1;
+this._mode=c.call(a,this,b&&b.words)},_doProcessBlock:function(a,b){this._mode.processBlock(a,b)},_doFinalize:function(){var a=this.cfg.padding;if(this._xformMode==this._ENC_XFORM_MODE){a.pad(this._data,this.blockSize);var b=this._process(!0)}else b=this._process(!0),a.unpad(b);return b},blockSize:4});var p=f.CipherParams=k.extend({init:function(a){this.mixIn(a)},toString:function(a){return(a||this.formatter).stringify(this)}}),m=(g.format={}).OpenSSL={stringify:function(a){var b=a.ciphertext;a=a.salt;
+return(a?l.create([1398893684,1701076831]).concat(a).concat(b):b).toString(r)},parse:function(a){a=r.parse(a);var b=a.words;if(1398893684==b[0]&&1701076831==b[1]){var c=l.create(b.slice(2,4));b.splice(0,4);a.sigBytes-=16}return p.create({ciphertext:a,salt:c})}},j=f.SerializableCipher=k.extend({cfg:k.extend({format:m}),encrypt:function(a,b,c,d){d=this.cfg.extend(d);var e=a.createEncryptor(c,d);b=e.finalize(b);e=e.cfg;return p.create({ciphertext:b,key:c,iv:e.iv,algorithm:a,mode:e.mode,padding:e.padding,
+blockSize:a.blockSize,formatter:d.format})},decrypt:function(a,b,c,d){d=this.cfg.extend(d);b=this._parse(b,d.format);return a.createDecryptor(c,d).finalize(b.ciphertext)},_parse:function(a,b){return"string"==typeof a?b.parse(a,this):a}}),g=(g.kdf={}).OpenSSL={execute:function(a,b,c,d){d||(d=l.random(8));a=v.create({keySize:b+c}).compute(a,d);c=l.create(a.words.slice(b),4*c);a.sigBytes=4*b;return p.create({key:a,iv:c,salt:d})}},s=f.PasswordBasedCipher=j.extend({cfg:j.cfg.extend({kdf:g}),encrypt:function(a,
+b,c,d){d=this.cfg.extend(d);c=d.kdf.execute(c,a.keySize,a.ivSize);d.iv=c.iv;a=j.encrypt.call(this,a,b,c.key,d);a.mixIn(c);return a},decrypt:function(a,b,c,d){d=this.cfg.extend(d);b=this._parse(b,d.format);c=d.kdf.execute(c,a.keySize,a.ivSize,b.salt);d.iv=c.iv;return j.decrypt.call(this,a,b,c.key,d)}})}();
diff --git a/library/cryptojs/components/cipher-core.js b/library/cryptojs/components/cipher-core.js
new file mode 100644
index 000000000..09862098f
--- /dev/null
+++ b/library/cryptojs/components/cipher-core.js
@@ -0,0 +1,863 @@
+/*
+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
+*/
+/**
+ * Cipher core components.
+ */
+CryptoJS.lib.Cipher || (function (undefined) {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var Base = C_lib.Base;
+ var WordArray = C_lib.WordArray;
+ var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm;
+ var C_enc = C.enc;
+ var Utf8 = C_enc.Utf8;
+ var Base64 = C_enc.Base64;
+ var C_algo = C.algo;
+ var EvpKDF = C_algo.EvpKDF;
+
+ /**
+ * Abstract base cipher template.
+ *
+ * @property {number} keySize This cipher's key size. Default: 4 (128 bits)
+ * @property {number} ivSize This cipher's IV size. Default: 4 (128 bits)
+ * @property {number} _ENC_XFORM_MODE A constant representing encryption mode.
+ * @property {number} _DEC_XFORM_MODE A constant representing decryption mode.
+ */
+ var Cipher = C_lib.Cipher = BufferedBlockAlgorithm.extend({
+ /**
+ * Configuration options.
+ *
+ * @property {WordArray} iv The IV to use for this operation.
+ */
+ cfg: Base.extend(),
+
+ /**
+ * Creates this cipher in encryption mode.
+ *
+ * @param {WordArray} key The key.
+ * @param {Object} cfg (Optional) The configuration options to use for this operation.
+ *
+ * @return {Cipher} A cipher instance.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var cipher = CryptoJS.algo.AES.createEncryptor(keyWordArray, { iv: ivWordArray });
+ */
+ createEncryptor: function (key, cfg) {
+ return this.create(this._ENC_XFORM_MODE, key, cfg);
+ },
+
+ /**
+ * Creates this cipher in decryption mode.
+ *
+ * @param {WordArray} key The key.
+ * @param {Object} cfg (Optional) The configuration options to use for this operation.
+ *
+ * @return {Cipher} A cipher instance.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var cipher = CryptoJS.algo.AES.createDecryptor(keyWordArray, { iv: ivWordArray });
+ */
+ createDecryptor: function (key, cfg) {
+ return this.create(this._DEC_XFORM_MODE, key, cfg);
+ },
+
+ /**
+ * Initializes a newly created cipher.
+ *
+ * @param {number} xformMode Either the encryption or decryption transormation mode constant.
+ * @param {WordArray} key The key.
+ * @param {Object} cfg (Optional) The configuration options to use for this operation.
+ *
+ * @example
+ *
+ * var cipher = CryptoJS.algo.AES.create(CryptoJS.algo.AES._ENC_XFORM_MODE, keyWordArray, { iv: ivWordArray });
+ */
+ init: function (xformMode, key, cfg) {
+ // Apply config defaults
+ this.cfg = this.cfg.extend(cfg);
+
+ // Store transform mode and key
+ this._xformMode = xformMode;
+ this._key = key;
+
+ // Set initial values
+ this.reset();
+ },
+
+ /**
+ * Resets this cipher to its initial state.
+ *
+ * @example
+ *
+ * cipher.reset();
+ */
+ reset: function () {
+ // Reset data buffer
+ BufferedBlockAlgorithm.reset.call(this);
+
+ // Perform concrete-cipher logic
+ this._doReset();
+ },
+
+ /**
+ * Adds data to be encrypted or decrypted.
+ *
+ * @param {WordArray|string} dataUpdate The data to encrypt or decrypt.
+ *
+ * @return {WordArray} The data after processing.
+ *
+ * @example
+ *
+ * var encrypted = cipher.process('data');
+ * var encrypted = cipher.process(wordArray);
+ */
+ process: function (dataUpdate) {
+ // Append
+ this._append(dataUpdate);
+
+ // Process available blocks
+ return this._process();
+ },
+
+ /**
+ * Finalizes the encryption or decryption process.
+ * Note that the finalize operation is effectively a destructive, read-once operation.
+ *
+ * @param {WordArray|string} dataUpdate The final data to encrypt or decrypt.
+ *
+ * @return {WordArray} The data after final processing.
+ *
+ * @example
+ *
+ * var encrypted = cipher.finalize();
+ * var encrypted = cipher.finalize('data');
+ * var encrypted = cipher.finalize(wordArray);
+ */
+ finalize: function (dataUpdate) {
+ // Final data update
+ if (dataUpdate) {
+ this._append(dataUpdate);
+ }
+
+ // Perform concrete-cipher logic
+ var finalProcessedData = this._doFinalize();
+
+ return finalProcessedData;
+ },
+
+ keySize: 128/32,
+
+ ivSize: 128/32,
+
+ _ENC_XFORM_MODE: 1,
+
+ _DEC_XFORM_MODE: 2,
+
+ /**
+ * Creates shortcut functions to a cipher's object interface.
+ *
+ * @param {Cipher} cipher The cipher to create a helper for.
+ *
+ * @return {Object} An object with encrypt and decrypt shortcut functions.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var AES = CryptoJS.lib.Cipher._createHelper(CryptoJS.algo.AES);
+ */
+ _createHelper: (function () {
+ function selectCipherStrategy(key) {
+ if (typeof key == 'string') {
+ return PasswordBasedCipher;
+ } else {
+ return SerializableCipher;
+ }
+ }
+
+ return function (cipher) {
+ return {
+ encrypt: function (message, key, cfg) {
+ return selectCipherStrategy(key).encrypt(cipher, message, key, cfg);
+ },
+
+ decrypt: function (ciphertext, key, cfg) {
+ return selectCipherStrategy(key).decrypt(cipher, ciphertext, key, cfg);
+ }
+ };
+ };
+ }())
+ });
+
+ /**
+ * Abstract base stream cipher template.
+ *
+ * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 1 (32 bits)
+ */
+ var StreamCipher = C_lib.StreamCipher = Cipher.extend({
+ _doFinalize: function () {
+ // Process partial blocks
+ var finalProcessedBlocks = this._process(!!'flush');
+
+ return finalProcessedBlocks;
+ },
+
+ blockSize: 1
+ });
+
+ /**
+ * Mode namespace.
+ */
+ var C_mode = C.mode = {};
+
+ /**
+ * Abstract base block cipher mode template.
+ */
+ var BlockCipherMode = C_lib.BlockCipherMode = Base.extend({
+ /**
+ * Creates this mode for encryption.
+ *
+ * @param {Cipher} cipher A block cipher instance.
+ * @param {Array} iv The IV words.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var mode = CryptoJS.mode.CBC.createEncryptor(cipher, iv.words);
+ */
+ createEncryptor: function (cipher, iv) {
+ return this.Encryptor.create(cipher, iv);
+ },
+
+ /**
+ * Creates this mode for decryption.
+ *
+ * @param {Cipher} cipher A block cipher instance.
+ * @param {Array} iv The IV words.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var mode = CryptoJS.mode.CBC.createDecryptor(cipher, iv.words);
+ */
+ createDecryptor: function (cipher, iv) {
+ return this.Decryptor.create(cipher, iv);
+ },
+
+ /**
+ * Initializes a newly created mode.
+ *
+ * @param {Cipher} cipher A block cipher instance.
+ * @param {Array} iv The IV words.
+ *
+ * @example
+ *
+ * var mode = CryptoJS.mode.CBC.Encryptor.create(cipher, iv.words);
+ */
+ init: function (cipher, iv) {
+ this._cipher = cipher;
+ this._iv = iv;
+ }
+ });
+
+ /**
+ * Cipher Block Chaining mode.
+ */
+ var CBC = C_mode.CBC = (function () {
+ /**
+ * Abstract base CBC mode.
+ */
+ var CBC = BlockCipherMode.extend();
+
+ /**
+ * CBC encryptor.
+ */
+ CBC.Encryptor = CBC.extend({
+ /**
+ * Processes the data block at offset.
+ *
+ * @param {Array} words The data words to operate on.
+ * @param {number} offset The offset where the block starts.
+ *
+ * @example
+ *
+ * mode.processBlock(data.words, offset);
+ */
+ processBlock: function (words, offset) {
+ // Shortcuts
+ var cipher = this._cipher;
+ var blockSize = cipher.blockSize;
+
+ // XOR and encrypt
+ xorBlock.call(this, words, offset, blockSize);
+ cipher.encryptBlock(words, offset);
+
+ // Remember this block to use with next block
+ this._prevBlock = words.slice(offset, offset + blockSize);
+ }
+ });
+
+ /**
+ * CBC decryptor.
+ */
+ CBC.Decryptor = CBC.extend({
+ /**
+ * Processes the data block at offset.
+ *
+ * @param {Array} words The data words to operate on.
+ * @param {number} offset The offset where the block starts.
+ *
+ * @example
+ *
+ * mode.processBlock(data.words, offset);
+ */
+ processBlock: function (words, offset) {
+ // Shortcuts
+ var cipher = this._cipher;
+ var blockSize = cipher.blockSize;
+
+ // Remember this block to use with next block
+ var thisBlock = words.slice(offset, offset + blockSize);
+
+ // Decrypt and XOR
+ cipher.decryptBlock(words, offset);
+ xorBlock.call(this, words, offset, blockSize);
+
+ // This block becomes the previous block
+ this._prevBlock = thisBlock;
+ }
+ });
+
+ function xorBlock(words, offset, blockSize) {
+ // Shortcut
+ var iv = this._iv;
+
+ // Choose mixing block
+ if (iv) {
+ var block = iv;
+
+ // Remove IV for subsequent blocks
+ this._iv = undefined;
+ } else {
+ var block = this._prevBlock;
+ }
+
+ // XOR blocks
+ for (var i = 0; i < blockSize; i++) {
+ words[offset + i] ^= block[i];
+ }
+ }
+
+ return CBC;
+ }());
+
+ /**
+ * Padding namespace.
+ */
+ var C_pad = C.pad = {};
+
+ /**
+ * PKCS #5/7 padding strategy.
+ */
+ var Pkcs7 = C_pad.Pkcs7 = {
+ /**
+ * Pads data using the algorithm defined in PKCS #5/7.
+ *
+ * @param {WordArray} data The data to pad.
+ * @param {number} blockSize The multiple that the data should be padded to.
+ *
+ * @static
+ *
+ * @example
+ *
+ * CryptoJS.pad.Pkcs7.pad(wordArray, 4);
+ */
+ pad: function (data, blockSize) {
+ // Shortcut
+ var blockSizeBytes = blockSize * 4;
+
+ // Count padding bytes
+ var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes;
+
+ // Create padding word
+ var paddingWord = (nPaddingBytes << 24) | (nPaddingBytes << 16) | (nPaddingBytes << 8) | nPaddingBytes;
+
+ // Create padding
+ var paddingWords = [];
+ for (var i = 0; i < nPaddingBytes; i += 4) {
+ paddingWords.push(paddingWord);
+ }
+ var padding = WordArray.create(paddingWords, nPaddingBytes);
+
+ // Add padding
+ data.concat(padding);
+ },
+
+ /**
+ * Unpads data that had been padded using the algorithm defined in PKCS #5/7.
+ *
+ * @param {WordArray} data The data to unpad.
+ *
+ * @static
+ *
+ * @example
+ *
+ * CryptoJS.pad.Pkcs7.unpad(wordArray);
+ */
+ unpad: function (data) {
+ // Get number of padding bytes from last byte
+ var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff;
+
+ // Remove padding
+ data.sigBytes -= nPaddingBytes;
+ }
+ };
+
+ /**
+ * Abstract base block cipher template.
+ *
+ * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 4 (128 bits)
+ */
+ var BlockCipher = C_lib.BlockCipher = Cipher.extend({
+ /**
+ * Configuration options.
+ *
+ * @property {Mode} mode The block mode to use. Default: CBC
+ * @property {Padding} padding The padding strategy to use. Default: Pkcs7
+ */
+ cfg: Cipher.cfg.extend({
+ mode: CBC,
+ padding: Pkcs7
+ }),
+
+ reset: function () {
+ // Reset cipher
+ Cipher.reset.call(this);
+
+ // Shortcuts
+ var cfg = this.cfg;
+ var iv = cfg.iv;
+ var mode = cfg.mode;
+
+ // Reset block mode
+ if (this._xformMode == this._ENC_XFORM_MODE) {
+ var modeCreator = mode.createEncryptor;
+ } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ {
+ var modeCreator = mode.createDecryptor;
+
+ // Keep at least one block in the buffer for unpadding
+ this._minBufferSize = 1;
+ }
+ this._mode = modeCreator.call(mode, this, iv && iv.words);
+ },
+
+ _doProcessBlock: function (words, offset) {
+ this._mode.processBlock(words, offset);
+ },
+
+ _doFinalize: function () {
+ // Shortcut
+ var padding = this.cfg.padding;
+
+ // Finalize
+ if (this._xformMode == this._ENC_XFORM_MODE) {
+ // Pad data
+ padding.pad(this._data, this.blockSize);
+
+ // Process final blocks
+ var finalProcessedBlocks = this._process(!!'flush');
+ } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ {
+ // Process final blocks
+ var finalProcessedBlocks = this._process(!!'flush');
+
+ // Unpad data
+ padding.unpad(finalProcessedBlocks);
+ }
+
+ return finalProcessedBlocks;
+ },
+
+ blockSize: 128/32
+ });
+
+ /**
+ * A collection of cipher parameters.
+ *
+ * @property {WordArray} ciphertext The raw ciphertext.
+ * @property {WordArray} key The key to this ciphertext.
+ * @property {WordArray} iv The IV used in the ciphering operation.
+ * @property {WordArray} salt The salt used with a key derivation function.
+ * @property {Cipher} algorithm The cipher algorithm.
+ * @property {Mode} mode The block mode used in the ciphering operation.
+ * @property {Padding} padding The padding scheme used in the ciphering operation.
+ * @property {number} blockSize The block size of the cipher.
+ * @property {Format} formatter The default formatting strategy to convert this cipher params object to a string.
+ */
+ var CipherParams = C_lib.CipherParams = Base.extend({
+ /**
+ * Initializes a newly created cipher params object.
+ *
+ * @param {Object} cipherParams An object with any of the possible cipher parameters.
+ *
+ * @example
+ *
+ * var cipherParams = CryptoJS.lib.CipherParams.create({
+ * ciphertext: ciphertextWordArray,
+ * key: keyWordArray,
+ * iv: ivWordArray,
+ * salt: saltWordArray,
+ * algorithm: CryptoJS.algo.AES,
+ * mode: CryptoJS.mode.CBC,
+ * padding: CryptoJS.pad.PKCS7,
+ * blockSize: 4,
+ * formatter: CryptoJS.format.OpenSSL
+ * });
+ */
+ init: function (cipherParams) {
+ this.mixIn(cipherParams);
+ },
+
+ /**
+ * Converts this cipher params object to a string.
+ *
+ * @param {Format} formatter (Optional) The formatting strategy to use.
+ *
+ * @return {string} The stringified cipher params.
+ *
+ * @throws Error If neither the formatter nor the default formatter is set.
+ *
+ * @example
+ *
+ * var string = cipherParams + '';
+ * var string = cipherParams.toString();
+ * var string = cipherParams.toString(CryptoJS.format.OpenSSL);
+ */
+ toString: function (formatter) {
+ return (formatter || this.formatter).stringify(this);
+ }
+ });
+
+ /**
+ * Format namespace.
+ */
+ var C_format = C.format = {};
+
+ /**
+ * OpenSSL formatting strategy.
+ */
+ var OpenSSLFormatter = C_format.OpenSSL = {
+ /**
+ * Converts a cipher params object to an OpenSSL-compatible string.
+ *
+ * @param {CipherParams} cipherParams The cipher params object.
+ *
+ * @return {string} The OpenSSL-compatible string.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var openSSLString = CryptoJS.format.OpenSSL.stringify(cipherParams);
+ */
+ stringify: function (cipherParams) {
+ // Shortcuts
+ var ciphertext = cipherParams.ciphertext;
+ var salt = cipherParams.salt;
+
+ // Format
+ if (salt) {
+ var wordArray = WordArray.create([0x53616c74, 0x65645f5f]).concat(salt).concat(ciphertext);
+ } else {
+ var wordArray = ciphertext;
+ }
+
+ return wordArray.toString(Base64);
+ },
+
+ /**
+ * Converts an OpenSSL-compatible string to a cipher params object.
+ *
+ * @param {string} openSSLStr The OpenSSL-compatible string.
+ *
+ * @return {CipherParams} The cipher params object.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var cipherParams = CryptoJS.format.OpenSSL.parse(openSSLString);
+ */
+ parse: function (openSSLStr) {
+ // Parse base64
+ var ciphertext = Base64.parse(openSSLStr);
+
+ // Shortcut
+ var ciphertextWords = ciphertext.words;
+
+ // Test for salt
+ if (ciphertextWords[0] == 0x53616c74 && ciphertextWords[1] == 0x65645f5f) {
+ // Extract salt
+ var salt = WordArray.create(ciphertextWords.slice(2, 4));
+
+ // Remove salt from ciphertext
+ ciphertextWords.splice(0, 4);
+ ciphertext.sigBytes -= 16;
+ }
+
+ return CipherParams.create({ ciphertext: ciphertext, salt: salt });
+ }
+ };
+
+ /**
+ * A cipher wrapper that returns ciphertext as a serializable cipher params object.
+ */
+ var SerializableCipher = C_lib.SerializableCipher = Base.extend({
+ /**
+ * Configuration options.
+ *
+ * @property {Formatter} format The formatting strategy to convert cipher param objects to and from a string. Default: OpenSSL
+ */
+ cfg: Base.extend({
+ format: OpenSSLFormatter
+ }),
+
+ /**
+ * Encrypts a message.
+ *
+ * @param {Cipher} cipher The cipher algorithm to use.
+ * @param {WordArray|string} message The message to encrypt.
+ * @param {WordArray} key The key.
+ * @param {Object} cfg (Optional) The configuration options to use for this operation.
+ *
+ * @return {CipherParams} A cipher params object.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key);
+ * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv });
+ * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv, format: CryptoJS.format.OpenSSL });
+ */
+ encrypt: function (cipher, message, key, cfg) {
+ // Apply config defaults
+ cfg = this.cfg.extend(cfg);
+
+ // Encrypt
+ var encryptor = cipher.createEncryptor(key, cfg);
+ var ciphertext = encryptor.finalize(message);
+
+ // Shortcut
+ var cipherCfg = encryptor.cfg;
+
+ // Create and return serializable cipher params
+ return CipherParams.create({
+ ciphertext: ciphertext,
+ key: key,
+ iv: cipherCfg.iv,
+ algorithm: cipher,
+ mode: cipherCfg.mode,
+ padding: cipherCfg.padding,
+ blockSize: cipher.blockSize,
+ formatter: cfg.format
+ });
+ },
+
+ /**
+ * Decrypts serialized ciphertext.
+ *
+ * @param {Cipher} cipher The cipher algorithm to use.
+ * @param {CipherParams|string} ciphertext The ciphertext to decrypt.
+ * @param {WordArray} key The key.
+ * @param {Object} cfg (Optional) The configuration options to use for this operation.
+ *
+ * @return {WordArray} The plaintext.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, key, { iv: iv, format: CryptoJS.format.OpenSSL });
+ * var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, key, { iv: iv, format: CryptoJS.format.OpenSSL });
+ */
+ decrypt: function (cipher, ciphertext, key, cfg) {
+ // Apply config defaults
+ cfg = this.cfg.extend(cfg);
+
+ // Convert string to CipherParams
+ ciphertext = this._parse(ciphertext, cfg.format);
+
+ // Decrypt
+ var plaintext = cipher.createDecryptor(key, cfg).finalize(ciphertext.ciphertext);
+
+ return plaintext;
+ },
+
+ /**
+ * Converts serialized ciphertext to CipherParams,
+ * else assumed CipherParams already and returns ciphertext unchanged.
+ *
+ * @param {CipherParams|string} ciphertext The ciphertext.
+ * @param {Formatter} format The formatting strategy to use to parse serialized ciphertext.
+ *
+ * @return {CipherParams} The unserialized ciphertext.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var ciphertextParams = CryptoJS.lib.SerializableCipher._parse(ciphertextStringOrParams, format);
+ */
+ _parse: function (ciphertext, format) {
+ if (typeof ciphertext == 'string') {
+ return format.parse(ciphertext, this);
+ } else {
+ return ciphertext;
+ }
+ }
+ });
+
+ /**
+ * Key derivation function namespace.
+ */
+ var C_kdf = C.kdf = {};
+
+ /**
+ * OpenSSL key derivation function.
+ */
+ var OpenSSLKdf = C_kdf.OpenSSL = {
+ /**
+ * Derives a key and IV from a password.
+ *
+ * @param {string} password The password to derive from.
+ * @param {number} keySize The size in words of the key to generate.
+ * @param {number} ivSize The size in words of the IV to generate.
+ * @param {WordArray|string} salt (Optional) A 64-bit salt to use. If omitted, a salt will be generated randomly.
+ *
+ * @return {CipherParams} A cipher params object with the key, IV, and salt.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32);
+ * var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32, 'saltsalt');
+ */
+ execute: function (password, keySize, ivSize, salt) {
+ // Generate random salt
+ if (!salt) {
+ salt = WordArray.random(64/8);
+ }
+
+ // Derive key and IV
+ var key = EvpKDF.create({ keySize: keySize + ivSize }).compute(password, salt);
+
+ // Separate key and IV
+ var iv = WordArray.create(key.words.slice(keySize), ivSize * 4);
+ key.sigBytes = keySize * 4;
+
+ // Return params
+ return CipherParams.create({ key: key, iv: iv, salt: salt });
+ }
+ };
+
+ /**
+ * A serializable cipher wrapper that derives the key from a password,
+ * and returns ciphertext as a serializable cipher params object.
+ */
+ var PasswordBasedCipher = C_lib.PasswordBasedCipher = SerializableCipher.extend({
+ /**
+ * Configuration options.
+ *
+ * @property {KDF} kdf The key derivation function to use to generate a key and IV from a password. Default: OpenSSL
+ */
+ cfg: SerializableCipher.cfg.extend({
+ kdf: OpenSSLKdf
+ }),
+
+ /**
+ * Encrypts a message using a password.
+ *
+ * @param {Cipher} cipher The cipher algorithm to use.
+ * @param {WordArray|string} message The message to encrypt.
+ * @param {string} password The password.
+ * @param {Object} cfg (Optional) The configuration options to use for this operation.
+ *
+ * @return {CipherParams} A cipher params object.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password');
+ * var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password', { format: CryptoJS.format.OpenSSL });
+ */
+ encrypt: function (cipher, message, password, cfg) {
+ // Apply config defaults
+ cfg = this.cfg.extend(cfg);
+
+ // Derive key and other params
+ var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize);
+
+ // Add IV to config
+ cfg.iv = derivedParams.iv;
+
+ // Encrypt
+ var ciphertext = SerializableCipher.encrypt.call(this, cipher, message, derivedParams.key, cfg);
+
+ // Mix in derived params
+ ciphertext.mixIn(derivedParams);
+
+ return ciphertext;
+ },
+
+ /**
+ * Decrypts serialized ciphertext using a password.
+ *
+ * @param {Cipher} cipher The cipher algorithm to use.
+ * @param {CipherParams|string} ciphertext The ciphertext to decrypt.
+ * @param {string} password The password.
+ * @param {Object} cfg (Optional) The configuration options to use for this operation.
+ *
+ * @return {WordArray} The plaintext.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, 'password', { format: CryptoJS.format.OpenSSL });
+ * var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, 'password', { format: CryptoJS.format.OpenSSL });
+ */
+ decrypt: function (cipher, ciphertext, password, cfg) {
+ // Apply config defaults
+ cfg = this.cfg.extend(cfg);
+
+ // Convert string to CipherParams
+ ciphertext = this._parse(ciphertext, cfg.format);
+
+ // Derive key and other params
+ var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize, ciphertext.salt);
+
+ // Add IV to config
+ cfg.iv = derivedParams.iv;
+
+ // Decrypt
+ var plaintext = SerializableCipher.decrypt.call(this, cipher, ciphertext, derivedParams.key, cfg);
+
+ return plaintext;
+ }
+ });
+}());
diff --git a/library/cryptojs/components/core-min.js b/library/cryptojs/components/core-min.js
new file mode 100644
index 000000000..3f191b431
--- /dev/null
+++ b/library/cryptojs/components/core-min.js
@@ -0,0 +1,13 @@
+/*
+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
+*/
+var CryptoJS=CryptoJS||function(h,r){var k={},l=k.lib={},n=function(){},f=l.Base={extend:function(a){n.prototype=this;var b=new n;a&&b.mixIn(a);b.hasOwnProperty("init")||(b.init=function(){b.$super.init.apply(this,arguments)});b.init.prototype=b;b.$super=this;return b},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var b in a)a.hasOwnProperty(b)&&(this[b]=a[b]);a.hasOwnProperty("toString")&&(this.toString=a.toString)},clone:function(){return this.init.prototype.extend(this)}},
+j=l.WordArray=f.extend({init:function(a,b){a=this.words=a||[];this.sigBytes=b!=r?b:4*a.length},toString:function(a){return(a||s).stringify(this)},concat:function(a){var b=this.words,d=a.words,c=this.sigBytes;a=a.sigBytes;this.clamp();if(c%4)for(var e=0;e<a;e++)b[c+e>>>2]|=(d[e>>>2]>>>24-8*(e%4)&255)<<24-8*((c+e)%4);else if(65535<d.length)for(e=0;e<a;e+=4)b[c+e>>>2]=d[e>>>2];else b.push.apply(b,d);this.sigBytes+=a;return this},clamp:function(){var a=this.words,b=this.sigBytes;a[b>>>2]&=4294967295<<
+32-8*(b%4);a.length=h.ceil(b/4)},clone:function(){var a=f.clone.call(this);a.words=this.words.slice(0);return a},random:function(a){for(var b=[],d=0;d<a;d+=4)b.push(4294967296*h.random()|0);return new j.init(b,a)}}),m=k.enc={},s=m.Hex={stringify:function(a){var b=a.words;a=a.sigBytes;for(var d=[],c=0;c<a;c++){var e=b[c>>>2]>>>24-8*(c%4)&255;d.push((e>>>4).toString(16));d.push((e&15).toString(16))}return d.join("")},parse:function(a){for(var b=a.length,d=[],c=0;c<b;c+=2)d[c>>>3]|=parseInt(a.substr(c,
+2),16)<<24-4*(c%8);return new j.init(d,b/2)}},p=m.Latin1={stringify:function(a){var b=a.words;a=a.sigBytes;for(var d=[],c=0;c<a;c++)d.push(String.fromCharCode(b[c>>>2]>>>24-8*(c%4)&255));return d.join("")},parse:function(a){for(var b=a.length,d=[],c=0;c<b;c++)d[c>>>2]|=(a.charCodeAt(c)&255)<<24-8*(c%4);return new j.init(d,b)}},t=m.Utf8={stringify:function(a){try{return decodeURIComponent(escape(p.stringify(a)))}catch(b){throw Error("Malformed UTF-8 data");}},parse:function(a){return p.parse(unescape(encodeURIComponent(a)))}},
+q=l.BufferedBlockAlgorithm=f.extend({reset:function(){this._data=new j.init;this._nDataBytes=0},_append:function(a){"string"==typeof a&&(a=t.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(a){var b=this._data,d=b.words,c=b.sigBytes,e=this.blockSize,f=c/(4*e),f=a?h.ceil(f):h.max((f|0)-this._minBufferSize,0);a=f*e;c=h.min(4*a,c);if(a){for(var g=0;g<a;g+=e)this._doProcessBlock(d,g);g=d.splice(0,a);b.sigBytes-=c}return new j.init(g,c)},clone:function(){var a=f.clone.call(this);
+a._data=this._data.clone();return a},_minBufferSize:0});l.Hasher=q.extend({cfg:f.extend(),init:function(a){this.cfg=this.cfg.extend(a);this.reset()},reset:function(){q.reset.call(this);this._doReset()},update:function(a){this._append(a);this._process();return this},finalize:function(a){a&&this._append(a);return this._doFinalize()},blockSize:16,_createHelper:function(a){return function(b,d){return(new a.init(d)).finalize(b)}},_createHmacHelper:function(a){return function(b,d){return(new u.HMAC.init(a,
+d)).finalize(b)}}});var u=k.algo={};return k}(Math);
diff --git a/library/cryptojs/components/core.js b/library/cryptojs/components/core.js
new file mode 100644
index 000000000..996aa07c0
--- /dev/null
+++ b/library/cryptojs/components/core.js
@@ -0,0 +1,712 @@
+/*
+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
+*/
+/**
+ * CryptoJS core components.
+ */
+var CryptoJS = CryptoJS || (function (Math, undefined) {
+ /**
+ * CryptoJS namespace.
+ */
+ var C = {};
+
+ /**
+ * Library namespace.
+ */
+ var C_lib = C.lib = {};
+
+ /**
+ * Base object for prototypal inheritance.
+ */
+ var Base = C_lib.Base = (function () {
+ function F() {}
+
+ return {
+ /**
+ * Creates a new object that inherits from this object.
+ *
+ * @param {Object} overrides Properties to copy into the new object.
+ *
+ * @return {Object} The new object.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var MyType = CryptoJS.lib.Base.extend({
+ * field: 'value',
+ *
+ * method: function () {
+ * }
+ * });
+ */
+ extend: function (overrides) {
+ // Spawn
+ F.prototype = this;
+ var subtype = new F();
+
+ // Augment
+ if (overrides) {
+ subtype.mixIn(overrides);
+ }
+
+ // Create default initializer
+ if (!subtype.hasOwnProperty('init')) {
+ subtype.init = function () {
+ subtype.$super.init.apply(this, arguments);
+ };
+ }
+
+ // Initializer's prototype is the subtype object
+ subtype.init.prototype = subtype;
+
+ // Reference supertype
+ subtype.$super = this;
+
+ return subtype;
+ },
+
+ /**
+ * Extends this object and runs the init method.
+ * Arguments to create() will be passed to init().
+ *
+ * @return {Object} The new object.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var instance = MyType.create();
+ */
+ create: function () {
+ var instance = this.extend();
+ instance.init.apply(instance, arguments);
+
+ return instance;
+ },
+
+ /**
+ * Initializes a newly created object.
+ * Override this method to add some logic when your objects are created.
+ *
+ * @example
+ *
+ * var MyType = CryptoJS.lib.Base.extend({
+ * init: function () {
+ * // ...
+ * }
+ * });
+ */
+ init: function () {
+ },
+
+ /**
+ * Copies properties into this object.
+ *
+ * @param {Object} properties The properties to mix in.
+ *
+ * @example
+ *
+ * MyType.mixIn({
+ * field: 'value'
+ * });
+ */
+ mixIn: function (properties) {
+ for (var propertyName in properties) {
+ if (properties.hasOwnProperty(propertyName)) {
+ this[propertyName] = properties[propertyName];
+ }
+ }
+
+ // IE won't copy toString using the loop above
+ if (properties.hasOwnProperty('toString')) {
+ this.toString = properties.toString;
+ }
+ },
+
+ /**
+ * Creates a copy of this object.
+ *
+ * @return {Object} The clone.
+ *
+ * @example
+ *
+ * var clone = instance.clone();
+ */
+ clone: function () {
+ return this.init.prototype.extend(this);
+ }
+ };
+ }());
+
+ /**
+ * An array of 32-bit words.
+ *
+ * @property {Array} words The array of 32-bit words.
+ * @property {number} sigBytes The number of significant bytes in this word array.
+ */
+ var WordArray = C_lib.WordArray = Base.extend({
+ /**
+ * Initializes a newly created word array.
+ *
+ * @param {Array} words (Optional) An array of 32-bit words.
+ * @param {number} sigBytes (Optional) The number of significant bytes in the words.
+ *
+ * @example
+ *
+ * var wordArray = CryptoJS.lib.WordArray.create();
+ * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607]);
+ * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607], 6);
+ */
+ init: function (words, sigBytes) {
+ words = this.words = words || [];
+
+ if (sigBytes != undefined) {
+ this.sigBytes = sigBytes;
+ } else {
+ this.sigBytes = words.length * 4;
+ }
+ },
+
+ /**
+ * Converts this word array to a string.
+ *
+ * @param {Encoder} encoder (Optional) The encoding strategy to use. Default: CryptoJS.enc.Hex
+ *
+ * @return {string} The stringified word array.
+ *
+ * @example
+ *
+ * var string = wordArray + '';
+ * var string = wordArray.toString();
+ * var string = wordArray.toString(CryptoJS.enc.Utf8);
+ */
+ toString: function (encoder) {
+ return (encoder || Hex).stringify(this);
+ },
+
+ /**
+ * Concatenates a word array to this word array.
+ *
+ * @param {WordArray} wordArray The word array to append.
+ *
+ * @return {WordArray} This word array.
+ *
+ * @example
+ *
+ * wordArray1.concat(wordArray2);
+ */
+ concat: function (wordArray) {
+ // Shortcuts
+ var thisWords = this.words;
+ var thatWords = wordArray.words;
+ var thisSigBytes = this.sigBytes;
+ var thatSigBytes = wordArray.sigBytes;
+
+ // Clamp excess bits
+ this.clamp();
+
+ // Concat
+ if (thisSigBytes % 4) {
+ // Copy one byte at a time
+ for (var i = 0; i < thatSigBytes; i++) {
+ var thatByte = (thatWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
+ thisWords[(thisSigBytes + i) >>> 2] |= thatByte << (24 - ((thisSigBytes + i) % 4) * 8);
+ }
+ } else if (thatWords.length > 0xffff) {
+ // Copy one word at a time
+ for (var i = 0; i < thatSigBytes; i += 4) {
+ thisWords[(thisSigBytes + i) >>> 2] = thatWords[i >>> 2];
+ }
+ } else {
+ // Copy all words at once
+ thisWords.push.apply(thisWords, thatWords);
+ }
+ this.sigBytes += thatSigBytes;
+
+ // Chainable
+ return this;
+ },
+
+ /**
+ * Removes insignificant bits.
+ *
+ * @example
+ *
+ * wordArray.clamp();
+ */
+ clamp: function () {
+ // Shortcuts
+ var words = this.words;
+ var sigBytes = this.sigBytes;
+
+ // Clamp
+ words[sigBytes >>> 2] &= 0xffffffff << (32 - (sigBytes % 4) * 8);
+ words.length = Math.ceil(sigBytes / 4);
+ },
+
+ /**
+ * Creates a copy of this word array.
+ *
+ * @return {WordArray} The clone.
+ *
+ * @example
+ *
+ * var clone = wordArray.clone();
+ */
+ clone: function () {
+ var clone = Base.clone.call(this);
+ clone.words = this.words.slice(0);
+
+ return clone;
+ },
+
+ /**
+ * Creates a word array filled with random bytes.
+ *
+ * @param {number} nBytes The number of random bytes to generate.
+ *
+ * @return {WordArray} The random word array.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var wordArray = CryptoJS.lib.WordArray.random(16);
+ */
+ random: function (nBytes) {
+ var words = [];
+ for (var i = 0; i < nBytes; i += 4) {
+ words.push((Math.random() * 0x100000000) | 0);
+ }
+
+ return new WordArray.init(words, nBytes);
+ }
+ });
+
+ /**
+ * Encoder namespace.
+ */
+ var C_enc = C.enc = {};
+
+ /**
+ * Hex encoding strategy.
+ */
+ var Hex = C_enc.Hex = {
+ /**
+ * Converts a word array to a hex string.
+ *
+ * @param {WordArray} wordArray The word array.
+ *
+ * @return {string} The hex string.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var hexString = CryptoJS.enc.Hex.stringify(wordArray);
+ */
+ stringify: function (wordArray) {
+ // Shortcuts
+ var words = wordArray.words;
+ var sigBytes = wordArray.sigBytes;
+
+ // Convert
+ var hexChars = [];
+ for (var i = 0; i < sigBytes; i++) {
+ var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
+ hexChars.push((bite >>> 4).toString(16));
+ hexChars.push((bite & 0x0f).toString(16));
+ }
+
+ return hexChars.join('');
+ },
+
+ /**
+ * Converts a hex string to a word array.
+ *
+ * @param {string} hexStr The hex string.
+ *
+ * @return {WordArray} The word array.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var wordArray = CryptoJS.enc.Hex.parse(hexString);
+ */
+ parse: function (hexStr) {
+ // Shortcut
+ var hexStrLength = hexStr.length;
+
+ // Convert
+ var words = [];
+ for (var i = 0; i < hexStrLength; i += 2) {
+ words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4);
+ }
+
+ return new WordArray.init(words, hexStrLength / 2);
+ }
+ };
+
+ /**
+ * Latin1 encoding strategy.
+ */
+ var Latin1 = C_enc.Latin1 = {
+ /**
+ * Converts a word array to a Latin1 string.
+ *
+ * @param {WordArray} wordArray The word array.
+ *
+ * @return {string} The Latin1 string.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var latin1String = CryptoJS.enc.Latin1.stringify(wordArray);
+ */
+ stringify: function (wordArray) {
+ // Shortcuts
+ var words = wordArray.words;
+ var sigBytes = wordArray.sigBytes;
+
+ // Convert
+ var latin1Chars = [];
+ for (var i = 0; i < sigBytes; i++) {
+ var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
+ latin1Chars.push(String.fromCharCode(bite));
+ }
+
+ return latin1Chars.join('');
+ },
+
+ /**
+ * Converts a Latin1 string to a word array.
+ *
+ * @param {string} latin1Str The Latin1 string.
+ *
+ * @return {WordArray} The word array.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var wordArray = CryptoJS.enc.Latin1.parse(latin1String);
+ */
+ parse: function (latin1Str) {
+ // Shortcut
+ var latin1StrLength = latin1Str.length;
+
+ // Convert
+ var words = [];
+ for (var i = 0; i < latin1StrLength; i++) {
+ words[i >>> 2] |= (latin1Str.charCodeAt(i) & 0xff) << (24 - (i % 4) * 8);
+ }
+
+ return new WordArray.init(words, latin1StrLength);
+ }
+ };
+
+ /**
+ * UTF-8 encoding strategy.
+ */
+ var Utf8 = C_enc.Utf8 = {
+ /**
+ * Converts a word array to a UTF-8 string.
+ *
+ * @param {WordArray} wordArray The word array.
+ *
+ * @return {string} The UTF-8 string.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var utf8String = CryptoJS.enc.Utf8.stringify(wordArray);
+ */
+ stringify: function (wordArray) {
+ try {
+ return decodeURIComponent(escape(Latin1.stringify(wordArray)));
+ } catch (e) {
+ throw new Error('Malformed UTF-8 data');
+ }
+ },
+
+ /**
+ * Converts a UTF-8 string to a word array.
+ *
+ * @param {string} utf8Str The UTF-8 string.
+ *
+ * @return {WordArray} The word array.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var wordArray = CryptoJS.enc.Utf8.parse(utf8String);
+ */
+ parse: function (utf8Str) {
+ return Latin1.parse(unescape(encodeURIComponent(utf8Str)));
+ }
+ };
+
+ /**
+ * Abstract buffered block algorithm template.
+ *
+ * The property blockSize must be implemented in a concrete subtype.
+ *
+ * @property {number} _minBufferSize The number of blocks that should be kept unprocessed in the buffer. Default: 0
+ */
+ var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm = Base.extend({
+ /**
+ * Resets this block algorithm's data buffer to its initial state.
+ *
+ * @example
+ *
+ * bufferedBlockAlgorithm.reset();
+ */
+ reset: function () {
+ // Initial values
+ this._data = new WordArray.init();
+ this._nDataBytes = 0;
+ },
+
+ /**
+ * Adds new data to this block algorithm's buffer.
+ *
+ * @param {WordArray|string} data The data to append. Strings are converted to a WordArray using UTF-8.
+ *
+ * @example
+ *
+ * bufferedBlockAlgorithm._append('data');
+ * bufferedBlockAlgorithm._append(wordArray);
+ */
+ _append: function (data) {
+ // Convert string to WordArray, else assume WordArray already
+ if (typeof data == 'string') {
+ data = Utf8.parse(data);
+ }
+
+ // Append
+ this._data.concat(data);
+ this._nDataBytes += data.sigBytes;
+ },
+
+ /**
+ * Processes available data blocks.
+ *
+ * This method invokes _doProcessBlock(offset), which must be implemented by a concrete subtype.
+ *
+ * @param {boolean} doFlush Whether all blocks and partial blocks should be processed.
+ *
+ * @return {WordArray} The processed data.
+ *
+ * @example
+ *
+ * var processedData = bufferedBlockAlgorithm._process();
+ * var processedData = bufferedBlockAlgorithm._process(!!'flush');
+ */
+ _process: function (doFlush) {
+ // Shortcuts
+ var data = this._data;
+ var dataWords = data.words;
+ var dataSigBytes = data.sigBytes;
+ var blockSize = this.blockSize;
+ var blockSizeBytes = blockSize * 4;
+
+ // Count blocks ready
+ var nBlocksReady = dataSigBytes / blockSizeBytes;
+ if (doFlush) {
+ // Round up to include partial blocks
+ nBlocksReady = Math.ceil(nBlocksReady);
+ } else {
+ // Round down to include only full blocks,
+ // less the number of blocks that must remain in the buffer
+ nBlocksReady = Math.max((nBlocksReady | 0) - this._minBufferSize, 0);
+ }
+
+ // Count words ready
+ var nWordsReady = nBlocksReady * blockSize;
+
+ // Count bytes ready
+ var nBytesReady = Math.min(nWordsReady * 4, dataSigBytes);
+
+ // Process blocks
+ if (nWordsReady) {
+ for (var offset = 0; offset < nWordsReady; offset += blockSize) {
+ // Perform concrete-algorithm logic
+ this._doProcessBlock(dataWords, offset);
+ }
+
+ // Remove processed words
+ var processedWords = dataWords.splice(0, nWordsReady);
+ data.sigBytes -= nBytesReady;
+ }
+
+ // Return processed words
+ return new WordArray.init(processedWords, nBytesReady);
+ },
+
+ /**
+ * Creates a copy of this object.
+ *
+ * @return {Object} The clone.
+ *
+ * @example
+ *
+ * var clone = bufferedBlockAlgorithm.clone();
+ */
+ clone: function () {
+ var clone = Base.clone.call(this);
+ clone._data = this._data.clone();
+
+ return clone;
+ },
+
+ _minBufferSize: 0
+ });
+
+ /**
+ * Abstract hasher template.
+ *
+ * @property {number} blockSize The number of 32-bit words this hasher operates on. Default: 16 (512 bits)
+ */
+ var Hasher = C_lib.Hasher = BufferedBlockAlgorithm.extend({
+ /**
+ * Configuration options.
+ */
+ cfg: Base.extend(),
+
+ /**
+ * Initializes a newly created hasher.
+ *
+ * @param {Object} cfg (Optional) The configuration options to use for this hash computation.
+ *
+ * @example
+ *
+ * var hasher = CryptoJS.algo.SHA256.create();
+ */
+ init: function (cfg) {
+ // Apply config defaults
+ this.cfg = this.cfg.extend(cfg);
+
+ // Set initial values
+ this.reset();
+ },
+
+ /**
+ * Resets this hasher to its initial state.
+ *
+ * @example
+ *
+ * hasher.reset();
+ */
+ reset: function () {
+ // Reset data buffer
+ BufferedBlockAlgorithm.reset.call(this);
+
+ // Perform concrete-hasher logic
+ this._doReset();
+ },
+
+ /**
+ * Updates this hasher with a message.
+ *
+ * @param {WordArray|string} messageUpdate The message to append.
+ *
+ * @return {Hasher} This hasher.
+ *
+ * @example
+ *
+ * hasher.update('message');
+ * hasher.update(wordArray);
+ */
+ update: function (messageUpdate) {
+ // Append
+ this._append(messageUpdate);
+
+ // Update the hash
+ this._process();
+
+ // Chainable
+ return this;
+ },
+
+ /**
+ * Finalizes the hash computation.
+ * Note that the finalize operation is effectively a destructive, read-once operation.
+ *
+ * @param {WordArray|string} messageUpdate (Optional) A final message update.
+ *
+ * @return {WordArray} The hash.
+ *
+ * @example
+ *
+ * var hash = hasher.finalize();
+ * var hash = hasher.finalize('message');
+ * var hash = hasher.finalize(wordArray);
+ */
+ finalize: function (messageUpdate) {
+ // Final message update
+ if (messageUpdate) {
+ this._append(messageUpdate);
+ }
+
+ // Perform concrete-hasher logic
+ var hash = this._doFinalize();
+
+ return hash;
+ },
+
+ blockSize: 512/32,
+
+ /**
+ * Creates a shortcut function to a hasher's object interface.
+ *
+ * @param {Hasher} hasher The hasher to create a helper for.
+ *
+ * @return {Function} The shortcut function.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var SHA256 = CryptoJS.lib.Hasher._createHelper(CryptoJS.algo.SHA256);
+ */
+ _createHelper: function (hasher) {
+ return function (message, cfg) {
+ return new hasher.init(cfg).finalize(message);
+ };
+ },
+
+ /**
+ * Creates a shortcut function to the HMAC's object interface.
+ *
+ * @param {Hasher} hasher The hasher to use in this HMAC helper.
+ *
+ * @return {Function} The shortcut function.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var HmacSHA256 = CryptoJS.lib.Hasher._createHmacHelper(CryptoJS.algo.SHA256);
+ */
+ _createHmacHelper: function (hasher) {
+ return function (message, key) {
+ return new C_algo.HMAC.init(hasher, key).finalize(message);
+ };
+ }
+ });
+
+ /**
+ * Algorithm namespace.
+ */
+ var C_algo = C.algo = {};
+
+ return C;
+}(Math));
diff --git a/library/cryptojs/components/enc-base64-min.js b/library/cryptojs/components/enc-base64-min.js
new file mode 100644
index 000000000..7ab054d94
--- /dev/null
+++ b/library/cryptojs/components/enc-base64-min.js
@@ -0,0 +1,8 @@
+/*
+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
+*/
+(function(){var h=CryptoJS,j=h.lib.WordArray;h.enc.Base64={stringify:function(b){var e=b.words,f=b.sigBytes,c=this._map;b.clamp();b=[];for(var a=0;a<f;a+=3)for(var d=(e[a>>>2]>>>24-8*(a%4)&255)<<16|(e[a+1>>>2]>>>24-8*((a+1)%4)&255)<<8|e[a+2>>>2]>>>24-8*((a+2)%4)&255,g=0;4>g&&a+0.75*g<f;g++)b.push(c.charAt(d>>>6*(3-g)&63));if(e=c.charAt(64))for(;b.length%4;)b.push(e);return b.join("")},parse:function(b){var e=b.length,f=this._map,c=f.charAt(64);c&&(c=b.indexOf(c),-1!=c&&(e=c));for(var c=[],a=0,d=0;d<
+e;d++)if(d%4){var g=f.indexOf(b.charAt(d-1))<<2*(d%4),h=f.indexOf(b.charAt(d))>>>6-2*(d%4);c[a>>>2]|=(g|h)<<24-8*(a%4);a++}return j.create(c,a)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="}})();
diff --git a/library/cryptojs/components/enc-base64.js b/library/cryptojs/components/enc-base64.js
new file mode 100644
index 000000000..739f4a845
--- /dev/null
+++ b/library/cryptojs/components/enc-base64.js
@@ -0,0 +1,109 @@
+/*
+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
+*/
+(function () {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var WordArray = C_lib.WordArray;
+ var C_enc = C.enc;
+
+ /**
+ * Base64 encoding strategy.
+ */
+ var Base64 = C_enc.Base64 = {
+ /**
+ * Converts a word array to a Base64 string.
+ *
+ * @param {WordArray} wordArray The word array.
+ *
+ * @return {string} The Base64 string.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var base64String = CryptoJS.enc.Base64.stringify(wordArray);
+ */
+ stringify: function (wordArray) {
+ // Shortcuts
+ var words = wordArray.words;
+ var sigBytes = wordArray.sigBytes;
+ var map = this._map;
+
+ // Clamp excess bits
+ wordArray.clamp();
+
+ // Convert
+ var base64Chars = [];
+ for (var i = 0; i < sigBytes; i += 3) {
+ var byte1 = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
+ var byte2 = (words[(i + 1) >>> 2] >>> (24 - ((i + 1) % 4) * 8)) & 0xff;
+ var byte3 = (words[(i + 2) >>> 2] >>> (24 - ((i + 2) % 4) * 8)) & 0xff;
+
+ var triplet = (byte1 << 16) | (byte2 << 8) | byte3;
+
+ for (var j = 0; (j < 4) && (i + j * 0.75 < sigBytes); j++) {
+ base64Chars.push(map.charAt((triplet >>> (6 * (3 - j))) & 0x3f));
+ }
+ }
+
+ // Add padding
+ var paddingChar = map.charAt(64);
+ if (paddingChar) {
+ while (base64Chars.length % 4) {
+ base64Chars.push(paddingChar);
+ }
+ }
+
+ return base64Chars.join('');
+ },
+
+ /**
+ * Converts a Base64 string to a word array.
+ *
+ * @param {string} base64Str The Base64 string.
+ *
+ * @return {WordArray} The word array.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var wordArray = CryptoJS.enc.Base64.parse(base64String);
+ */
+ parse: function (base64Str) {
+ // Shortcuts
+ var base64StrLength = base64Str.length;
+ var map = this._map;
+
+ // Ignore padding
+ var paddingChar = map.charAt(64);
+ if (paddingChar) {
+ var paddingIndex = base64Str.indexOf(paddingChar);
+ if (paddingIndex != -1) {
+ base64StrLength = paddingIndex;
+ }
+ }
+
+ // Convert
+ var words = [];
+ var nBytes = 0;
+ for (var i = 0; i < base64StrLength; i++) {
+ if (i % 4) {
+ var bits1 = map.indexOf(base64Str.charAt(i - 1)) << ((i % 4) * 2);
+ var bits2 = map.indexOf(base64Str.charAt(i)) >>> (6 - (i % 4) * 2);
+ words[nBytes >>> 2] |= (bits1 | bits2) << (24 - (nBytes % 4) * 8);
+ nBytes++;
+ }
+ }
+
+ return WordArray.create(words, nBytes);
+ },
+
+ _map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='
+ };
+}());
diff --git a/library/cryptojs/components/enc-utf16-min.js b/library/cryptojs/components/enc-utf16-min.js
new file mode 100644
index 000000000..b84d40110
--- /dev/null
+++ b/library/cryptojs/components/enc-utf16-min.js
@@ -0,0 +1,8 @@
+/*
+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
+*/
+(function(){var e=CryptoJS,f=e.lib.WordArray,e=e.enc;e.Utf16=e.Utf16BE={stringify:function(b){var d=b.words;b=b.sigBytes;for(var c=[],a=0;a<b;a+=2)c.push(String.fromCharCode(d[a>>>2]>>>16-8*(a%4)&65535));return c.join("")},parse:function(b){for(var d=b.length,c=[],a=0;a<d;a++)c[a>>>1]|=b.charCodeAt(a)<<16-16*(a%2);return f.create(c,2*d)}};e.Utf16LE={stringify:function(b){var d=b.words;b=b.sigBytes;for(var c=[],a=0;a<b;a+=2)c.push(String.fromCharCode((d[a>>>2]>>>16-8*(a%4)&65535)<<8&4278255360|(d[a>>>
+2]>>>16-8*(a%4)&65535)>>>8&16711935));return c.join("")},parse:function(b){for(var d=b.length,c=[],a=0;a<d;a++){var e=c,g=a>>>1,j=e[g],h=b.charCodeAt(a)<<16-16*(a%2);e[g]=j|h<<8&4278255360|h>>>8&16711935}return f.create(c,2*d)}}})();
diff --git a/library/cryptojs/components/enc-utf16.js b/library/cryptojs/components/enc-utf16.js
new file mode 100644
index 000000000..295d24e5e
--- /dev/null
+++ b/library/cryptojs/components/enc-utf16.js
@@ -0,0 +1,135 @@
+/*
+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
+*/
+(function () {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var WordArray = C_lib.WordArray;
+ var C_enc = C.enc;
+
+ /**
+ * UTF-16 BE encoding strategy.
+ */
+ var Utf16BE = C_enc.Utf16 = C_enc.Utf16BE = {
+ /**
+ * Converts a word array to a UTF-16 BE string.
+ *
+ * @param {WordArray} wordArray The word array.
+ *
+ * @return {string} The UTF-16 BE string.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var utf16String = CryptoJS.enc.Utf16.stringify(wordArray);
+ */
+ stringify: function (wordArray) {
+ // Shortcuts
+ var words = wordArray.words;
+ var sigBytes = wordArray.sigBytes;
+
+ // Convert
+ var utf16Chars = [];
+ for (var i = 0; i < sigBytes; i += 2) {
+ var codePoint = (words[i >>> 2] >>> (16 - (i % 4) * 8)) & 0xffff;
+ utf16Chars.push(String.fromCharCode(codePoint));
+ }
+
+ return utf16Chars.join('');
+ },
+
+ /**
+ * Converts a UTF-16 BE string to a word array.
+ *
+ * @param {string} utf16Str The UTF-16 BE string.
+ *
+ * @return {WordArray} The word array.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var wordArray = CryptoJS.enc.Utf16.parse(utf16String);
+ */
+ parse: function (utf16Str) {
+ // Shortcut
+ var utf16StrLength = utf16Str.length;
+
+ // Convert
+ var words = [];
+ for (var i = 0; i < utf16StrLength; i++) {
+ words[i >>> 1] |= utf16Str.charCodeAt(i) << (16 - (i % 2) * 16);
+ }
+
+ return WordArray.create(words, utf16StrLength * 2);
+ }
+ };
+
+ /**
+ * UTF-16 LE encoding strategy.
+ */
+ C_enc.Utf16LE = {
+ /**
+ * Converts a word array to a UTF-16 LE string.
+ *
+ * @param {WordArray} wordArray The word array.
+ *
+ * @return {string} The UTF-16 LE string.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var utf16Str = CryptoJS.enc.Utf16LE.stringify(wordArray);
+ */
+ stringify: function (wordArray) {
+ // Shortcuts
+ var words = wordArray.words;
+ var sigBytes = wordArray.sigBytes;
+
+ // Convert
+ var utf16Chars = [];
+ for (var i = 0; i < sigBytes; i += 2) {
+ var codePoint = swapEndian((words[i >>> 2] >>> (16 - (i % 4) * 8)) & 0xffff);
+ utf16Chars.push(String.fromCharCode(codePoint));
+ }
+
+ return utf16Chars.join('');
+ },
+
+ /**
+ * Converts a UTF-16 LE string to a word array.
+ *
+ * @param {string} utf16Str The UTF-16 LE string.
+ *
+ * @return {WordArray} The word array.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var wordArray = CryptoJS.enc.Utf16LE.parse(utf16Str);
+ */
+ parse: function (utf16Str) {
+ // Shortcut
+ var utf16StrLength = utf16Str.length;
+
+ // Convert
+ var words = [];
+ for (var i = 0; i < utf16StrLength; i++) {
+ words[i >>> 1] |= swapEndian(utf16Str.charCodeAt(i) << (16 - (i % 2) * 16));
+ }
+
+ return WordArray.create(words, utf16StrLength * 2);
+ }
+ };
+
+ function swapEndian(word) {
+ return ((word << 8) & 0xff00ff00) | ((word >>> 8) & 0x00ff00ff);
+ }
+}());
diff --git a/library/cryptojs/components/evpkdf-min.js b/library/cryptojs/components/evpkdf-min.js
new file mode 100644
index 000000000..6c914b6a1
--- /dev/null
+++ b/library/cryptojs/components/evpkdf-min.js
@@ -0,0 +1,8 @@
+/*
+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
+*/
+(function(){var b=CryptoJS,a=b.lib,f=a.Base,k=a.WordArray,a=b.algo,l=a.EvpKDF=f.extend({cfg:f.extend({keySize:4,hasher:a.MD5,iterations:1}),init:function(a){this.cfg=this.cfg.extend(a)},compute:function(a,b){for(var c=this.cfg,d=c.hasher.create(),g=k.create(),f=g.words,h=c.keySize,c=c.iterations;f.length<h;){e&&d.update(e);var e=d.update(a).finalize(b);d.reset();for(var j=1;j<c;j++)e=d.finalize(e),d.reset();g.concat(e)}g.sigBytes=4*h;return g}});b.EvpKDF=function(a,b,c){return l.create(c).compute(a,
+b)}})();
diff --git a/library/cryptojs/components/evpkdf.js b/library/cryptojs/components/evpkdf.js
new file mode 100644
index 000000000..98dea85cd
--- /dev/null
+++ b/library/cryptojs/components/evpkdf.js
@@ -0,0 +1,118 @@
+/*
+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
+*/
+(function () {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var Base = C_lib.Base;
+ var WordArray = C_lib.WordArray;
+ var C_algo = C.algo;
+ var MD5 = C_algo.MD5;
+
+ /**
+ * This key derivation function is meant to conform with EVP_BytesToKey.
+ * www.openssl.org/docs/crypto/EVP_BytesToKey.html
+ */
+ var EvpKDF = C_algo.EvpKDF = Base.extend({
+ /**
+ * Configuration options.
+ *
+ * @property {number} keySize The key size in words to generate. Default: 4 (128 bits)
+ * @property {Hasher} hasher The hash algorithm to use. Default: MD5
+ * @property {number} iterations The number of iterations to perform. Default: 1
+ */
+ cfg: Base.extend({
+ keySize: 128/32,
+ hasher: MD5,
+ iterations: 1
+ }),
+
+ /**
+ * Initializes a newly created key derivation function.
+ *
+ * @param {Object} cfg (Optional) The configuration options to use for the derivation.
+ *
+ * @example
+ *
+ * var kdf = CryptoJS.algo.EvpKDF.create();
+ * var kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8 });
+ * var kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8, iterations: 1000 });
+ */
+ init: function (cfg) {
+ this.cfg = this.cfg.extend(cfg);
+ },
+
+ /**
+ * Derives a key from a password.
+ *
+ * @param {WordArray|string} password The password.
+ * @param {WordArray|string} salt A salt.
+ *
+ * @return {WordArray} The derived key.
+ *
+ * @example
+ *
+ * var key = kdf.compute(password, salt);
+ */
+ compute: function (password, salt) {
+ // Shortcut
+ var cfg = this.cfg;
+
+ // Init hasher
+ var hasher = cfg.hasher.create();
+
+ // Initial values
+ var derivedKey = WordArray.create();
+
+ // Shortcuts
+ var derivedKeyWords = derivedKey.words;
+ var keySize = cfg.keySize;
+ var iterations = cfg.iterations;
+
+ // Generate key
+ while (derivedKeyWords.length < keySize) {
+ if (block) {
+ hasher.update(block);
+ }
+ var block = hasher.update(password).finalize(salt);
+ hasher.reset();
+
+ // Iterations
+ for (var i = 1; i < iterations; i++) {
+ block = hasher.finalize(block);
+ hasher.reset();
+ }
+
+ derivedKey.concat(block);
+ }
+ derivedKey.sigBytes = keySize * 4;
+
+ return derivedKey;
+ }
+ });
+
+ /**
+ * Derives a key from a password.
+ *
+ * @param {WordArray|string} password The password.
+ * @param {WordArray|string} salt A salt.
+ * @param {Object} cfg (Optional) The configuration options to use for this computation.
+ *
+ * @return {WordArray} The derived key.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var key = CryptoJS.EvpKDF(password, salt);
+ * var key = CryptoJS.EvpKDF(password, salt, { keySize: 8 });
+ * var key = CryptoJS.EvpKDF(password, salt, { keySize: 8, iterations: 1000 });
+ */
+ C.EvpKDF = function (password, salt, cfg) {
+ return EvpKDF.create(cfg).compute(password, salt);
+ };
+}());
diff --git a/library/cryptojs/components/format-hex-min.js b/library/cryptojs/components/format-hex-min.js
new file mode 100644
index 000000000..1255678f3
--- /dev/null
+++ b/library/cryptojs/components/format-hex-min.js
@@ -0,0 +1,7 @@
+/*
+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
+*/
+(function(){var b=CryptoJS,d=b.lib.CipherParams,c=b.enc.Hex;b.format.Hex={stringify:function(a){return a.ciphertext.toString(c)},parse:function(a){a=c.parse(a);return d.create({ciphertext:a})}}})();
diff --git a/library/cryptojs/components/format-hex.js b/library/cryptojs/components/format-hex.js
new file mode 100644
index 000000000..1af5da60e
--- /dev/null
+++ b/library/cryptojs/components/format-hex.js
@@ -0,0 +1,52 @@
+/*
+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
+*/
+(function (undefined) {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var CipherParams = C_lib.CipherParams;
+ var C_enc = C.enc;
+ var Hex = C_enc.Hex;
+ var C_format = C.format;
+
+ var HexFormatter = C_format.Hex = {
+ /**
+ * Converts the ciphertext of a cipher params object to a hexadecimally encoded string.
+ *
+ * @param {CipherParams} cipherParams The cipher params object.
+ *
+ * @return {string} The hexadecimally encoded string.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var hexString = CryptoJS.format.Hex.stringify(cipherParams);
+ */
+ stringify: function (cipherParams) {
+ return cipherParams.ciphertext.toString(Hex);
+ },
+
+ /**
+ * Converts a hexadecimally encoded ciphertext string to a cipher params object.
+ *
+ * @param {string} input The hexadecimally encoded string.
+ *
+ * @return {CipherParams} The cipher params object.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var cipherParams = CryptoJS.format.Hex.parse(hexString);
+ */
+ parse: function (input) {
+ var ciphertext = Hex.parse(input);
+ return CipherParams.create({ ciphertext: ciphertext });
+ }
+ };
+}());
diff --git a/library/cryptojs/components/hmac-min.js b/library/cryptojs/components/hmac-min.js
new file mode 100644
index 000000000..c1a8974cd
--- /dev/null
+++ b/library/cryptojs/components/hmac-min.js
@@ -0,0 +1,8 @@
+/*
+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
+*/
+(function(){var c=CryptoJS,k=c.enc.Utf8;c.algo.HMAC=c.lib.Base.extend({init:function(a,b){a=this._hasher=new a.init;"string"==typeof b&&(b=k.parse(b));var c=a.blockSize,e=4*c;b.sigBytes>e&&(b=a.finalize(b));b.clamp();for(var f=this._oKey=b.clone(),g=this._iKey=b.clone(),h=f.words,j=g.words,d=0;d<c;d++)h[d]^=1549556828,j[d]^=909522486;f.sigBytes=g.sigBytes=e;this.reset()},reset:function(){var a=this._hasher;a.reset();a.update(this._iKey)},update:function(a){this._hasher.update(a);return this},finalize:function(a){var b=
+this._hasher;a=b.finalize(a);b.reset();return b.finalize(this._oKey.clone().concat(a))}})})();
diff --git a/library/cryptojs/components/hmac.js b/library/cryptojs/components/hmac.js
new file mode 100644
index 000000000..b75cd0bf9
--- /dev/null
+++ b/library/cryptojs/components/hmac.js
@@ -0,0 +1,131 @@
+/*
+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
+*/
+(function () {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var Base = C_lib.Base;
+ var C_enc = C.enc;
+ var Utf8 = C_enc.Utf8;
+ var C_algo = C.algo;
+
+ /**
+ * HMAC algorithm.
+ */
+ var HMAC = C_algo.HMAC = Base.extend({
+ /**
+ * Initializes a newly created HMAC.
+ *
+ * @param {Hasher} hasher The hash algorithm to use.
+ * @param {WordArray|string} key The secret key.
+ *
+ * @example
+ *
+ * var hmacHasher = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, key);
+ */
+ init: function (hasher, key) {
+ // Init hasher
+ hasher = this._hasher = new hasher.init();
+
+ // Convert string to WordArray, else assume WordArray already
+ if (typeof key == 'string') {
+ key = Utf8.parse(key);
+ }
+
+ // Shortcuts
+ var hasherBlockSize = hasher.blockSize;
+ var hasherBlockSizeBytes = hasherBlockSize * 4;
+
+ // Allow arbitrary length keys
+ if (key.sigBytes > hasherBlockSizeBytes) {
+ key = hasher.finalize(key);
+ }
+
+ // Clamp excess bits
+ key.clamp();
+
+ // Clone key for inner and outer pads
+ var oKey = this._oKey = key.clone();
+ var iKey = this._iKey = key.clone();
+
+ // Shortcuts
+ var oKeyWords = oKey.words;
+ var iKeyWords = iKey.words;
+
+ // XOR keys with pad constants
+ for (var i = 0; i < hasherBlockSize; i++) {
+ oKeyWords[i] ^= 0x5c5c5c5c;
+ iKeyWords[i] ^= 0x36363636;
+ }
+ oKey.sigBytes = iKey.sigBytes = hasherBlockSizeBytes;
+
+ // Set initial values
+ this.reset();
+ },
+
+ /**
+ * Resets this HMAC to its initial state.
+ *
+ * @example
+ *
+ * hmacHasher.reset();
+ */
+ reset: function () {
+ // Shortcut
+ var hasher = this._hasher;
+
+ // Reset
+ hasher.reset();
+ hasher.update(this._iKey);
+ },
+
+ /**
+ * Updates this HMAC with a message.
+ *
+ * @param {WordArray|string} messageUpdate The message to append.
+ *
+ * @return {HMAC} This HMAC instance.
+ *
+ * @example
+ *
+ * hmacHasher.update('message');
+ * hmacHasher.update(wordArray);
+ */
+ update: function (messageUpdate) {
+ this._hasher.update(messageUpdate);
+
+ // Chainable
+ return this;
+ },
+
+ /**
+ * Finalizes the HMAC computation.
+ * Note that the finalize operation is effectively a destructive, read-once operation.
+ *
+ * @param {WordArray|string} messageUpdate (Optional) A final message update.
+ *
+ * @return {WordArray} The HMAC.
+ *
+ * @example
+ *
+ * var hmac = hmacHasher.finalize();
+ * var hmac = hmacHasher.finalize('message');
+ * var hmac = hmacHasher.finalize(wordArray);
+ */
+ finalize: function (messageUpdate) {
+ // Shortcut
+ var hasher = this._hasher;
+
+ // Compute HMAC
+ var innerHash = hasher.finalize(messageUpdate);
+ hasher.reset();
+ var hmac = hasher.finalize(this._oKey.clone().concat(innerHash));
+
+ return hmac;
+ }
+ });
+}());
diff --git a/library/cryptojs/components/lib-typedarrays-min.js b/library/cryptojs/components/lib-typedarrays-min.js
new file mode 100644
index 000000000..7eee4b2ec
--- /dev/null
+++ b/library/cryptojs/components/lib-typedarrays-min.js
@@ -0,0 +1,8 @@
+/*
+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
+*/
+(function(){if("function"==typeof ArrayBuffer){var b=CryptoJS.lib.WordArray,e=b.init;(b.init=function(a){a instanceof ArrayBuffer&&(a=new Uint8Array(a));if(a instanceof Int8Array||a instanceof Uint8ClampedArray||a instanceof Int16Array||a instanceof Uint16Array||a instanceof Int32Array||a instanceof Uint32Array||a instanceof Float32Array||a instanceof Float64Array)a=new Uint8Array(a.buffer,a.byteOffset,a.byteLength);if(a instanceof Uint8Array){for(var b=a.byteLength,d=[],c=0;c<b;c++)d[c>>>2]|=a[c]<<
+24-8*(c%4);e.call(this,d,b)}else e.apply(this,arguments)}).prototype=b}})();
diff --git a/library/cryptojs/components/lib-typedarrays.js b/library/cryptojs/components/lib-typedarrays.js
new file mode 100644
index 000000000..a9ae5d4ed
--- /dev/null
+++ b/library/cryptojs/components/lib-typedarrays.js
@@ -0,0 +1,62 @@
+/*
+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
+*/
+(function () {
+ // Check if typed arrays are supported
+ if (typeof ArrayBuffer != 'function') {
+ return;
+ }
+
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var WordArray = C_lib.WordArray;
+
+ // Reference original init
+ var superInit = WordArray.init;
+
+ // Augment WordArray.init to handle typed arrays
+ var subInit = WordArray.init = function (typedArray) {
+ // Convert buffers to uint8
+ if (typedArray instanceof ArrayBuffer) {
+ typedArray = new Uint8Array(typedArray);
+ }
+
+ // Convert other array views to uint8
+ if (
+ typedArray instanceof Int8Array ||
+ typedArray instanceof Uint8ClampedArray ||
+ typedArray instanceof Int16Array ||
+ typedArray instanceof Uint16Array ||
+ typedArray instanceof Int32Array ||
+ typedArray instanceof Uint32Array ||
+ typedArray instanceof Float32Array ||
+ typedArray instanceof Float64Array
+ ) {
+ typedArray = new Uint8Array(typedArray.buffer, typedArray.byteOffset, typedArray.byteLength);
+ }
+
+ // Handle Uint8Array
+ if (typedArray instanceof Uint8Array) {
+ // Shortcut
+ var typedArrayByteLength = typedArray.byteLength;
+
+ // Extract bytes
+ var words = [];
+ for (var i = 0; i < typedArrayByteLength; i++) {
+ words[i >>> 2] |= typedArray[i] << (24 - (i % 4) * 8);
+ }
+
+ // Initialize this word array
+ superInit.call(this, words, typedArrayByteLength);
+ } else {
+ // Else call normal init
+ superInit.apply(this, arguments);
+ }
+ };
+
+ subInit.prototype = WordArray;
+}());
diff --git a/library/cryptojs/components/md5-min.js b/library/cryptojs/components/md5-min.js
new file mode 100644
index 000000000..ac725fce8
--- /dev/null
+++ b/library/cryptojs/components/md5-min.js
@@ -0,0 +1,12 @@
+/*
+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
+*/
+(function(E){function h(a,f,g,j,p,h,k){a=a+(f&g|~f&j)+p+k;return(a<<h|a>>>32-h)+f}function k(a,f,g,j,p,h,k){a=a+(f&j|g&~j)+p+k;return(a<<h|a>>>32-h)+f}function l(a,f,g,j,h,k,l){a=a+(f^g^j)+h+l;return(a<<k|a>>>32-k)+f}function n(a,f,g,j,h,k,l){a=a+(g^(f|~j))+h+l;return(a<<k|a>>>32-k)+f}for(var r=CryptoJS,q=r.lib,F=q.WordArray,s=q.Hasher,q=r.algo,a=[],t=0;64>t;t++)a[t]=4294967296*E.abs(E.sin(t+1))|0;q=q.MD5=s.extend({_doReset:function(){this._hash=new F.init([1732584193,4023233417,2562383102,271733878])},
+_doProcessBlock:function(m,f){for(var g=0;16>g;g++){var j=f+g,p=m[j];m[j]=(p<<8|p>>>24)&16711935|(p<<24|p>>>8)&4278255360}var g=this._hash.words,j=m[f+0],p=m[f+1],q=m[f+2],r=m[f+3],s=m[f+4],t=m[f+5],u=m[f+6],v=m[f+7],w=m[f+8],x=m[f+9],y=m[f+10],z=m[f+11],A=m[f+12],B=m[f+13],C=m[f+14],D=m[f+15],b=g[0],c=g[1],d=g[2],e=g[3],b=h(b,c,d,e,j,7,a[0]),e=h(e,b,c,d,p,12,a[1]),d=h(d,e,b,c,q,17,a[2]),c=h(c,d,e,b,r,22,a[3]),b=h(b,c,d,e,s,7,a[4]),e=h(e,b,c,d,t,12,a[5]),d=h(d,e,b,c,u,17,a[6]),c=h(c,d,e,b,v,22,a[7]),
+b=h(b,c,d,e,w,7,a[8]),e=h(e,b,c,d,x,12,a[9]),d=h(d,e,b,c,y,17,a[10]),c=h(c,d,e,b,z,22,a[11]),b=h(b,c,d,e,A,7,a[12]),e=h(e,b,c,d,B,12,a[13]),d=h(d,e,b,c,C,17,a[14]),c=h(c,d,e,b,D,22,a[15]),b=k(b,c,d,e,p,5,a[16]),e=k(e,b,c,d,u,9,a[17]),d=k(d,e,b,c,z,14,a[18]),c=k(c,d,e,b,j,20,a[19]),b=k(b,c,d,e,t,5,a[20]),e=k(e,b,c,d,y,9,a[21]),d=k(d,e,b,c,D,14,a[22]),c=k(c,d,e,b,s,20,a[23]),b=k(b,c,d,e,x,5,a[24]),e=k(e,b,c,d,C,9,a[25]),d=k(d,e,b,c,r,14,a[26]),c=k(c,d,e,b,w,20,a[27]),b=k(b,c,d,e,B,5,a[28]),e=k(e,b,
+c,d,q,9,a[29]),d=k(d,e,b,c,v,14,a[30]),c=k(c,d,e,b,A,20,a[31]),b=l(b,c,d,e,t,4,a[32]),e=l(e,b,c,d,w,11,a[33]),d=l(d,e,b,c,z,16,a[34]),c=l(c,d,e,b,C,23,a[35]),b=l(b,c,d,e,p,4,a[36]),e=l(e,b,c,d,s,11,a[37]),d=l(d,e,b,c,v,16,a[38]),c=l(c,d,e,b,y,23,a[39]),b=l(b,c,d,e,B,4,a[40]),e=l(e,b,c,d,j,11,a[41]),d=l(d,e,b,c,r,16,a[42]),c=l(c,d,e,b,u,23,a[43]),b=l(b,c,d,e,x,4,a[44]),e=l(e,b,c,d,A,11,a[45]),d=l(d,e,b,c,D,16,a[46]),c=l(c,d,e,b,q,23,a[47]),b=n(b,c,d,e,j,6,a[48]),e=n(e,b,c,d,v,10,a[49]),d=n(d,e,b,c,
+C,15,a[50]),c=n(c,d,e,b,t,21,a[51]),b=n(b,c,d,e,A,6,a[52]),e=n(e,b,c,d,r,10,a[53]),d=n(d,e,b,c,y,15,a[54]),c=n(c,d,e,b,p,21,a[55]),b=n(b,c,d,e,w,6,a[56]),e=n(e,b,c,d,D,10,a[57]),d=n(d,e,b,c,u,15,a[58]),c=n(c,d,e,b,B,21,a[59]),b=n(b,c,d,e,s,6,a[60]),e=n(e,b,c,d,z,10,a[61]),d=n(d,e,b,c,q,15,a[62]),c=n(c,d,e,b,x,21,a[63]);g[0]=g[0]+b|0;g[1]=g[1]+c|0;g[2]=g[2]+d|0;g[3]=g[3]+e|0},_doFinalize:function(){var a=this._data,f=a.words,g=8*this._nDataBytes,j=8*a.sigBytes;f[j>>>5]|=128<<24-j%32;var h=E.floor(g/
+4294967296);f[(j+64>>>9<<4)+15]=(h<<8|h>>>24)&16711935|(h<<24|h>>>8)&4278255360;f[(j+64>>>9<<4)+14]=(g<<8|g>>>24)&16711935|(g<<24|g>>>8)&4278255360;a.sigBytes=4*(f.length+1);this._process();a=this._hash;f=a.words;for(g=0;4>g;g++)j=f[g],f[g]=(j<<8|j>>>24)&16711935|(j<<24|j>>>8)&4278255360;return a},clone:function(){var a=s.clone.call(this);a._hash=this._hash.clone();return a}});r.MD5=s._createHelper(q);r.HmacMD5=s._createHmacHelper(q)})(Math);
diff --git a/library/cryptojs/components/md5.js b/library/cryptojs/components/md5.js
new file mode 100644
index 000000000..f4c46b968
--- /dev/null
+++ b/library/cryptojs/components/md5.js
@@ -0,0 +1,254 @@
+/*
+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
+*/
+(function (Math) {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var WordArray = C_lib.WordArray;
+ var Hasher = C_lib.Hasher;
+ var C_algo = C.algo;
+
+ // Constants table
+ var T = [];
+
+ // Compute constants
+ (function () {
+ for (var i = 0; i < 64; i++) {
+ T[i] = (Math.abs(Math.sin(i + 1)) * 0x100000000) | 0;
+ }
+ }());
+
+ /**
+ * MD5 hash algorithm.
+ */
+ var MD5 = C_algo.MD5 = Hasher.extend({
+ _doReset: function () {
+ this._hash = new WordArray.init([
+ 0x67452301, 0xefcdab89,
+ 0x98badcfe, 0x10325476
+ ]);
+ },
+
+ _doProcessBlock: function (M, offset) {
+ // Swap endian
+ for (var i = 0; i < 16; i++) {
+ // Shortcuts
+ var offset_i = offset + i;
+ var M_offset_i = M[offset_i];
+
+ M[offset_i] = (
+ (((M_offset_i << 8) | (M_offset_i >>> 24)) & 0x00ff00ff) |
+ (((M_offset_i << 24) | (M_offset_i >>> 8)) & 0xff00ff00)
+ );
+ }
+
+ // Shortcuts
+ var H = this._hash.words;
+
+ var M_offset_0 = M[offset + 0];
+ var M_offset_1 = M[offset + 1];
+ var M_offset_2 = M[offset + 2];
+ var M_offset_3 = M[offset + 3];
+ var M_offset_4 = M[offset + 4];
+ var M_offset_5 = M[offset + 5];
+ var M_offset_6 = M[offset + 6];
+ var M_offset_7 = M[offset + 7];
+ var M_offset_8 = M[offset + 8];
+ var M_offset_9 = M[offset + 9];
+ var M_offset_10 = M[offset + 10];
+ var M_offset_11 = M[offset + 11];
+ var M_offset_12 = M[offset + 12];
+ var M_offset_13 = M[offset + 13];
+ var M_offset_14 = M[offset + 14];
+ var M_offset_15 = M[offset + 15];
+
+ // Working varialbes
+ var a = H[0];
+ var b = H[1];
+ var c = H[2];
+ var d = H[3];
+
+ // Computation
+ a = FF(a, b, c, d, M_offset_0, 7, T[0]);
+ d = FF(d, a, b, c, M_offset_1, 12, T[1]);
+ c = FF(c, d, a, b, M_offset_2, 17, T[2]);
+ b = FF(b, c, d, a, M_offset_3, 22, T[3]);
+ a = FF(a, b, c, d, M_offset_4, 7, T[4]);
+ d = FF(d, a, b, c, M_offset_5, 12, T[5]);
+ c = FF(c, d, a, b, M_offset_6, 17, T[6]);
+ b = FF(b, c, d, a, M_offset_7, 22, T[7]);
+ a = FF(a, b, c, d, M_offset_8, 7, T[8]);
+ d = FF(d, a, b, c, M_offset_9, 12, T[9]);
+ c = FF(c, d, a, b, M_offset_10, 17, T[10]);
+ b = FF(b, c, d, a, M_offset_11, 22, T[11]);
+ a = FF(a, b, c, d, M_offset_12, 7, T[12]);
+ d = FF(d, a, b, c, M_offset_13, 12, T[13]);
+ c = FF(c, d, a, b, M_offset_14, 17, T[14]);
+ b = FF(b, c, d, a, M_offset_15, 22, T[15]);
+
+ a = GG(a, b, c, d, M_offset_1, 5, T[16]);
+ d = GG(d, a, b, c, M_offset_6, 9, T[17]);
+ c = GG(c, d, a, b, M_offset_11, 14, T[18]);
+ b = GG(b, c, d, a, M_offset_0, 20, T[19]);
+ a = GG(a, b, c, d, M_offset_5, 5, T[20]);
+ d = GG(d, a, b, c, M_offset_10, 9, T[21]);
+ c = GG(c, d, a, b, M_offset_15, 14, T[22]);
+ b = GG(b, c, d, a, M_offset_4, 20, T[23]);
+ a = GG(a, b, c, d, M_offset_9, 5, T[24]);
+ d = GG(d, a, b, c, M_offset_14, 9, T[25]);
+ c = GG(c, d, a, b, M_offset_3, 14, T[26]);
+ b = GG(b, c, d, a, M_offset_8, 20, T[27]);
+ a = GG(a, b, c, d, M_offset_13, 5, T[28]);
+ d = GG(d, a, b, c, M_offset_2, 9, T[29]);
+ c = GG(c, d, a, b, M_offset_7, 14, T[30]);
+ b = GG(b, c, d, a, M_offset_12, 20, T[31]);
+
+ a = HH(a, b, c, d, M_offset_5, 4, T[32]);
+ d = HH(d, a, b, c, M_offset_8, 11, T[33]);
+ c = HH(c, d, a, b, M_offset_11, 16, T[34]);
+ b = HH(b, c, d, a, M_offset_14, 23, T[35]);
+ a = HH(a, b, c, d, M_offset_1, 4, T[36]);
+ d = HH(d, a, b, c, M_offset_4, 11, T[37]);
+ c = HH(c, d, a, b, M_offset_7, 16, T[38]);
+ b = HH(b, c, d, a, M_offset_10, 23, T[39]);
+ a = HH(a, b, c, d, M_offset_13, 4, T[40]);
+ d = HH(d, a, b, c, M_offset_0, 11, T[41]);
+ c = HH(c, d, a, b, M_offset_3, 16, T[42]);
+ b = HH(b, c, d, a, M_offset_6, 23, T[43]);
+ a = HH(a, b, c, d, M_offset_9, 4, T[44]);
+ d = HH(d, a, b, c, M_offset_12, 11, T[45]);
+ c = HH(c, d, a, b, M_offset_15, 16, T[46]);
+ b = HH(b, c, d, a, M_offset_2, 23, T[47]);
+
+ a = II(a, b, c, d, M_offset_0, 6, T[48]);
+ d = II(d, a, b, c, M_offset_7, 10, T[49]);
+ c = II(c, d, a, b, M_offset_14, 15, T[50]);
+ b = II(b, c, d, a, M_offset_5, 21, T[51]);
+ a = II(a, b, c, d, M_offset_12, 6, T[52]);
+ d = II(d, a, b, c, M_offset_3, 10, T[53]);
+ c = II(c, d, a, b, M_offset_10, 15, T[54]);
+ b = II(b, c, d, a, M_offset_1, 21, T[55]);
+ a = II(a, b, c, d, M_offset_8, 6, T[56]);
+ d = II(d, a, b, c, M_offset_15, 10, T[57]);
+ c = II(c, d, a, b, M_offset_6, 15, T[58]);
+ b = II(b, c, d, a, M_offset_13, 21, T[59]);
+ a = II(a, b, c, d, M_offset_4, 6, T[60]);
+ d = II(d, a, b, c, M_offset_11, 10, T[61]);
+ c = II(c, d, a, b, M_offset_2, 15, T[62]);
+ b = II(b, c, d, a, M_offset_9, 21, T[63]);
+
+ // Intermediate hash value
+ H[0] = (H[0] + a) | 0;
+ H[1] = (H[1] + b) | 0;
+ H[2] = (H[2] + c) | 0;
+ H[3] = (H[3] + d) | 0;
+ },
+
+ _doFinalize: function () {
+ // Shortcuts
+ var data = this._data;
+ var dataWords = data.words;
+
+ var nBitsTotal = this._nDataBytes * 8;
+ var nBitsLeft = data.sigBytes * 8;
+
+ // Add padding
+ dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);
+
+ var nBitsTotalH = Math.floor(nBitsTotal / 0x100000000);
+ var nBitsTotalL = nBitsTotal;
+ dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = (
+ (((nBitsTotalH << 8) | (nBitsTotalH >>> 24)) & 0x00ff00ff) |
+ (((nBitsTotalH << 24) | (nBitsTotalH >>> 8)) & 0xff00ff00)
+ );
+ dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = (
+ (((nBitsTotalL << 8) | (nBitsTotalL >>> 24)) & 0x00ff00ff) |
+ (((nBitsTotalL << 24) | (nBitsTotalL >>> 8)) & 0xff00ff00)
+ );
+
+ data.sigBytes = (dataWords.length + 1) * 4;
+
+ // Hash final blocks
+ this._process();
+
+ // Shortcuts
+ var hash = this._hash;
+ var H = hash.words;
+
+ // Swap endian
+ for (var i = 0; i < 4; i++) {
+ // Shortcut
+ var H_i = H[i];
+
+ H[i] = (((H_i << 8) | (H_i >>> 24)) & 0x00ff00ff) |
+ (((H_i << 24) | (H_i >>> 8)) & 0xff00ff00);
+ }
+
+ // Return final computed hash
+ return hash;
+ },
+
+ clone: function () {
+ var clone = Hasher.clone.call(this);
+ clone._hash = this._hash.clone();
+
+ return clone;
+ }
+ });
+
+ function FF(a, b, c, d, x, s, t) {
+ var n = a + ((b & c) | (~b & d)) + x + t;
+ return ((n << s) | (n >>> (32 - s))) + b;
+ }
+
+ function GG(a, b, c, d, x, s, t) {
+ var n = a + ((b & d) | (c & ~d)) + x + t;
+ return ((n << s) | (n >>> (32 - s))) + b;
+ }
+
+ function HH(a, b, c, d, x, s, t) {
+ var n = a + (b ^ c ^ d) + x + t;
+ return ((n << s) | (n >>> (32 - s))) + b;
+ }
+
+ function II(a, b, c, d, x, s, t) {
+ var n = a + (c ^ (b | ~d)) + x + t;
+ return ((n << s) | (n >>> (32 - s))) + b;
+ }
+
+ /**
+ * Shortcut function to the hasher's object interface.
+ *
+ * @param {WordArray|string} message The message to hash.
+ *
+ * @return {WordArray} The hash.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var hash = CryptoJS.MD5('message');
+ * var hash = CryptoJS.MD5(wordArray);
+ */
+ C.MD5 = Hasher._createHelper(MD5);
+
+ /**
+ * Shortcut function to the HMAC's object interface.
+ *
+ * @param {WordArray|string} message The message to hash.
+ * @param {WordArray|string} key The secret key.
+ *
+ * @return {WordArray} The HMAC.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var hmac = CryptoJS.HmacMD5(message, key);
+ */
+ C.HmacMD5 = Hasher._createHmacHelper(MD5);
+}(Math));
diff --git a/library/cryptojs/components/mode-cfb-min.js b/library/cryptojs/components/mode-cfb-min.js
new file mode 100644
index 000000000..da0da2143
--- /dev/null
+++ b/library/cryptojs/components/mode-cfb-min.js
@@ -0,0 +1,7 @@
+/*
+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
+*/
+CryptoJS.mode.CFB=function(){function g(c,b,e,a){var d=this._iv;d?(d=d.slice(0),this._iv=void 0):d=this._prevBlock;a.encryptBlock(d,0);for(a=0;a<e;a++)c[b+a]^=d[a]}var f=CryptoJS.lib.BlockCipherMode.extend();f.Encryptor=f.extend({processBlock:function(c,b){var e=this._cipher,a=e.blockSize;g.call(this,c,b,a,e);this._prevBlock=c.slice(b,b+a)}});f.Decryptor=f.extend({processBlock:function(c,b){var e=this._cipher,a=e.blockSize,d=c.slice(b,b+a);g.call(this,c,b,a,e);this._prevBlock=d}});return f}();
diff --git a/library/cryptojs/components/mode-cfb.js b/library/cryptojs/components/mode-cfb.js
new file mode 100644
index 000000000..fee8829bd
--- /dev/null
+++ b/library/cryptojs/components/mode-cfb.js
@@ -0,0 +1,64 @@
+/*
+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
+*/
+/**
+ * Cipher Feedback block mode.
+ */
+CryptoJS.mode.CFB = (function () {
+ var CFB = CryptoJS.lib.BlockCipherMode.extend();
+
+ CFB.Encryptor = CFB.extend({
+ processBlock: function (words, offset) {
+ // Shortcuts
+ var cipher = this._cipher;
+ var blockSize = cipher.blockSize;
+
+ generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher);
+
+ // Remember this block to use with next block
+ this._prevBlock = words.slice(offset, offset + blockSize);
+ }
+ });
+
+ CFB.Decryptor = CFB.extend({
+ processBlock: function (words, offset) {
+ // Shortcuts
+ var cipher = this._cipher;
+ var blockSize = cipher.blockSize;
+
+ // Remember this block to use with next block
+ var thisBlock = words.slice(offset, offset + blockSize);
+
+ generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher);
+
+ // This block becomes the previous block
+ this._prevBlock = thisBlock;
+ }
+ });
+
+ function generateKeystreamAndEncrypt(words, offset, blockSize, cipher) {
+ // Shortcut
+ var iv = this._iv;
+
+ // Generate keystream
+ if (iv) {
+ var keystream = iv.slice(0);
+
+ // Remove IV for subsequent blocks
+ this._iv = undefined;
+ } else {
+ var keystream = this._prevBlock;
+ }
+ cipher.encryptBlock(keystream, 0);
+
+ // Encrypt
+ for (var i = 0; i < blockSize; i++) {
+ words[offset + i] ^= keystream[i];
+ }
+ }
+
+ return CFB;
+}());
diff --git a/library/cryptojs/components/mode-ctr-gladman-min.js b/library/cryptojs/components/mode-ctr-gladman-min.js
new file mode 100644
index 000000000..0eb7c0077
--- /dev/null
+++ b/library/cryptojs/components/mode-ctr-gladman-min.js
@@ -0,0 +1,14 @@
+/*
+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
+*/
+/*
+
+ Counter block mode compatible with Dr Brian Gladman fileenc.c
+ derived from CryptoJS.mode.CTR
+ Jan Hruby jhruby.web@gmail.com
+*/
+CryptoJS.mode.CTRGladman=function(){function h(a){if(255===(a>>24&255)){var c=a>>16&255,b=a>>8&255,e=a&255;255===c?(c=0,255===b?(b=0,255===e?e=0:++e):++b):++c;a=0+(c<<16)+(b<<8);a+=e}else a+=16777216;return a}var g=CryptoJS.lib.BlockCipherMode.extend(),j=g.Encryptor=g.extend({processBlock:function(a,c){var b=this._cipher,e=b.blockSize,d=this._iv,f=this._counter;d&&(f=this._counter=d.slice(0),this._iv=void 0);d=f;if(0===(d[0]=h(d[0])))d[1]=h(d[1]);f=f.slice(0);b.encryptBlock(f,0);for(b=0;b<e;b++)a[c+
+b]^=f[b]}});g.Decryptor=j;return g}();
diff --git a/library/cryptojs/components/mode-ctr-gladman.js b/library/cryptojs/components/mode-ctr-gladman.js
new file mode 100644
index 000000000..c5428c9cd
--- /dev/null
+++ b/library/cryptojs/components/mode-ctr-gladman.js
@@ -0,0 +1,102 @@
+/*
+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
+*/
+/** @preserve
+ * Counter block mode compatible with Dr Brian Gladman fileenc.c
+ * derived from CryptoJS.mode.CTR
+ * Jan Hruby jhruby.web@gmail.com
+ */
+CryptoJS.mode.CTRGladman = (function () {
+ var CTRGladman = CryptoJS.lib.BlockCipherMode.extend();
+
+ function incWord(word)
+ {
+ if (((word >> 24) & 0xff) === 0xff) { //overflow
+ var b1 = (word >> 16)&0xff;
+ var b2 = (word >> 8)&0xff;
+ var b3 = word & 0xff;
+
+ if (b1 === 0xff) // overflow b1
+ {
+ b1 = 0;
+ if (b2 === 0xff)
+ {
+ b2 = 0;
+ if (b3 === 0xff)
+ {
+ b3 = 0;
+ }
+ else
+ {
+ ++b3;
+ }
+ }
+ else
+ {
+ ++b2;
+ }
+ }
+ else
+ {
+ ++b1;
+ }
+
+ word = 0;
+ word += (b1 << 16);
+ word += (b2 << 8);
+ word += b3;
+ }
+ else
+ {
+ word += (0x01 << 24);
+ }
+ return word;
+ }
+
+ function incCounter(counter)
+ {
+ if ((counter[0] = incWord(counter[0])) === 0)
+ {
+ // encr_data in fileenc.c from Dr Brian Gladman's counts only with DWORD j < 8
+ counter[1] = incWord(counter[1]);
+ }
+ return counter;
+ }
+
+ var Encryptor = CTRGladman.Encryptor = CTRGladman.extend({
+ processBlock: function (words, offset) {
+ // Shortcuts
+ var cipher = this._cipher
+ var blockSize = cipher.blockSize;
+ var iv = this._iv;
+ var counter = this._counter;
+
+ // Generate keystream
+ if (iv) {
+ counter = this._counter = iv.slice(0);
+
+ // Remove IV for subsequent blocks
+ this._iv = undefined;
+ }
+
+ incCounter(counter);
+
+ var keystream = counter.slice(0);
+ cipher.encryptBlock(keystream, 0);
+
+ // Encrypt
+ for (var i = 0; i < blockSize; i++) {
+ words[offset + i] ^= keystream[i];
+ }
+ }
+ });
+
+ CTRGladman.Decryptor = Encryptor;
+
+ return CTRGladman;
+}());
+
+
diff --git a/library/cryptojs/components/mode-ctr-min.js b/library/cryptojs/components/mode-ctr-min.js
new file mode 100644
index 000000000..dfa8b1f9a
--- /dev/null
+++ b/library/cryptojs/components/mode-ctr-min.js
@@ -0,0 +1,7 @@
+/*
+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
+*/
+CryptoJS.mode.CTR=function(){var b=CryptoJS.lib.BlockCipherMode.extend(),g=b.Encryptor=b.extend({processBlock:function(b,f){var a=this._cipher,e=a.blockSize,c=this._iv,d=this._counter;c&&(d=this._counter=c.slice(0),this._iv=void 0);c=d.slice(0);a.encryptBlock(c,0);d[e-1]=d[e-1]+1|0;for(a=0;a<e;a++)b[f+a]^=c[a]}});b.Decryptor=g;return b}();
diff --git a/library/cryptojs/components/mode-ctr.js b/library/cryptojs/components/mode-ctr.js
new file mode 100644
index 000000000..f93e4abfb
--- /dev/null
+++ b/library/cryptojs/components/mode-ctr.js
@@ -0,0 +1,44 @@
+/*
+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
+*/
+/**
+ * Counter block mode.
+ */
+CryptoJS.mode.CTR = (function () {
+ var CTR = CryptoJS.lib.BlockCipherMode.extend();
+
+ var Encryptor = CTR.Encryptor = CTR.extend({
+ processBlock: function (words, offset) {
+ // Shortcuts
+ var cipher = this._cipher
+ var blockSize = cipher.blockSize;
+ var iv = this._iv;
+ var counter = this._counter;
+
+ // Generate keystream
+ if (iv) {
+ counter = this._counter = iv.slice(0);
+
+ // Remove IV for subsequent blocks
+ this._iv = undefined;
+ }
+ var keystream = counter.slice(0);
+ cipher.encryptBlock(keystream, 0);
+
+ // Increment counter
+ counter[blockSize - 1] = (counter[blockSize - 1] + 1) | 0
+
+ // Encrypt
+ for (var i = 0; i < blockSize; i++) {
+ words[offset + i] ^= keystream[i];
+ }
+ }
+ });
+
+ CTR.Decryptor = Encryptor;
+
+ return CTR;
+}());
diff --git a/library/cryptojs/components/mode-ecb-min.js b/library/cryptojs/components/mode-ecb-min.js
new file mode 100644
index 000000000..b764073d7
--- /dev/null
+++ b/library/cryptojs/components/mode-ecb-min.js
@@ -0,0 +1,7 @@
+/*
+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
+*/
+CryptoJS.mode.ECB=function(){var a=CryptoJS.lib.BlockCipherMode.extend();a.Encryptor=a.extend({processBlock:function(a,b){this._cipher.encryptBlock(a,b)}});a.Decryptor=a.extend({processBlock:function(a,b){this._cipher.decryptBlock(a,b)}});return a}();
diff --git a/library/cryptojs/components/mode-ecb.js b/library/cryptojs/components/mode-ecb.js
new file mode 100644
index 000000000..2fcc156d6
--- /dev/null
+++ b/library/cryptojs/components/mode-ecb.js
@@ -0,0 +1,26 @@
+/*
+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
+*/
+/**
+ * Electronic Codebook block mode.
+ */
+CryptoJS.mode.ECB = (function () {
+ var ECB = CryptoJS.lib.BlockCipherMode.extend();
+
+ ECB.Encryptor = ECB.extend({
+ processBlock: function (words, offset) {
+ this._cipher.encryptBlock(words, offset);
+ }
+ });
+
+ ECB.Decryptor = ECB.extend({
+ processBlock: function (words, offset) {
+ this._cipher.decryptBlock(words, offset);
+ }
+ });
+
+ return ECB;
+}());
diff --git a/library/cryptojs/components/mode-ofb-min.js b/library/cryptojs/components/mode-ofb-min.js
new file mode 100644
index 000000000..743248bfb
--- /dev/null
+++ b/library/cryptojs/components/mode-ofb-min.js
@@ -0,0 +1,7 @@
+/*
+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
+*/
+CryptoJS.mode.OFB=function(){var b=CryptoJS.lib.BlockCipherMode.extend(),d=b.Encryptor=b.extend({processBlock:function(b,e){var a=this._cipher,d=a.blockSize,f=this._iv,c=this._keystream;f&&(c=this._keystream=f.slice(0),this._iv=void 0);a.encryptBlock(c,0);for(a=0;a<d;a++)b[e+a]^=c[a]}});b.Decryptor=d;return b}();
diff --git a/library/cryptojs/components/mode-ofb.js b/library/cryptojs/components/mode-ofb.js
new file mode 100644
index 000000000..942074eb1
--- /dev/null
+++ b/library/cryptojs/components/mode-ofb.js
@@ -0,0 +1,40 @@
+/*
+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
+*/
+/**
+ * Output Feedback block mode.
+ */
+CryptoJS.mode.OFB = (function () {
+ var OFB = CryptoJS.lib.BlockCipherMode.extend();
+
+ var Encryptor = OFB.Encryptor = OFB.extend({
+ processBlock: function (words, offset) {
+ // Shortcuts
+ var cipher = this._cipher
+ var blockSize = cipher.blockSize;
+ var iv = this._iv;
+ var keystream = this._keystream;
+
+ // Generate keystream
+ if (iv) {
+ keystream = this._keystream = iv.slice(0);
+
+ // Remove IV for subsequent blocks
+ this._iv = undefined;
+ }
+ cipher.encryptBlock(keystream, 0);
+
+ // Encrypt
+ for (var i = 0; i < blockSize; i++) {
+ words[offset + i] ^= keystream[i];
+ }
+ }
+ });
+
+ OFB.Decryptor = Encryptor;
+
+ return OFB;
+}());
diff --git a/library/cryptojs/components/pad-ansix923-min.js b/library/cryptojs/components/pad-ansix923-min.js
new file mode 100644
index 000000000..046b45883
--- /dev/null
+++ b/library/cryptojs/components/pad-ansix923-min.js
@@ -0,0 +1,7 @@
+/*
+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
+*/
+CryptoJS.pad.AnsiX923={pad:function(a,d){var b=a.sigBytes,c=4*d,c=c-b%c,b=b+c-1;a.clamp();a.words[b>>>2]|=c<<24-8*(b%4);a.sigBytes+=c},unpad:function(a){a.sigBytes-=a.words[a.sigBytes-1>>>2]&255}};
diff --git a/library/cryptojs/components/pad-ansix923.js b/library/cryptojs/components/pad-ansix923.js
new file mode 100644
index 000000000..4da25d68e
--- /dev/null
+++ b/library/cryptojs/components/pad-ansix923.js
@@ -0,0 +1,35 @@
+/*
+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
+*/
+/**
+ * ANSI X.923 padding strategy.
+ */
+CryptoJS.pad.AnsiX923 = {
+ pad: function (data, blockSize) {
+ // Shortcuts
+ var dataSigBytes = data.sigBytes;
+ var blockSizeBytes = blockSize * 4;
+
+ // Count padding bytes
+ var nPaddingBytes = blockSizeBytes - dataSigBytes % blockSizeBytes;
+
+ // Compute last byte position
+ var lastBytePos = dataSigBytes + nPaddingBytes - 1;
+
+ // Pad
+ data.clamp();
+ data.words[lastBytePos >>> 2] |= nPaddingBytes << (24 - (lastBytePos % 4) * 8);
+ data.sigBytes += nPaddingBytes;
+ },
+
+ unpad: function (data) {
+ // Get number of padding bytes from last byte
+ var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff;
+
+ // Remove padding
+ data.sigBytes -= nPaddingBytes;
+ }
+};
diff --git a/library/cryptojs/components/pad-iso10126-min.js b/library/cryptojs/components/pad-iso10126-min.js
new file mode 100644
index 000000000..adef4b34d
--- /dev/null
+++ b/library/cryptojs/components/pad-iso10126-min.js
@@ -0,0 +1,7 @@
+/*
+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
+*/
+CryptoJS.pad.Iso10126={pad:function(a,c){var b=4*c,b=b-a.sigBytes%b;a.concat(CryptoJS.lib.WordArray.random(b-1)).concat(CryptoJS.lib.WordArray.create([b<<24],1))},unpad:function(a){a.sigBytes-=a.words[a.sigBytes-1>>>2]&255}};
diff --git a/library/cryptojs/components/pad-iso10126.js b/library/cryptojs/components/pad-iso10126.js
new file mode 100644
index 000000000..ce7e1bbcb
--- /dev/null
+++ b/library/cryptojs/components/pad-iso10126.js
@@ -0,0 +1,30 @@
+/*
+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
+*/
+/**
+ * ISO 10126 padding strategy.
+ */
+CryptoJS.pad.Iso10126 = {
+ pad: function (data, blockSize) {
+ // Shortcut
+ var blockSizeBytes = blockSize * 4;
+
+ // Count padding bytes
+ var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes;
+
+ // Pad
+ data.concat(CryptoJS.lib.WordArray.random(nPaddingBytes - 1)).
+ concat(CryptoJS.lib.WordArray.create([nPaddingBytes << 24], 1));
+ },
+
+ unpad: function (data) {
+ // Get number of padding bytes from last byte
+ var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff;
+
+ // Remove padding
+ data.sigBytes -= nPaddingBytes;
+ }
+};
diff --git a/library/cryptojs/components/pad-iso97971-min.js b/library/cryptojs/components/pad-iso97971-min.js
new file mode 100644
index 000000000..1edf02dc1
--- /dev/null
+++ b/library/cryptojs/components/pad-iso97971-min.js
@@ -0,0 +1,7 @@
+/*
+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
+*/
+CryptoJS.pad.Iso97971={pad:function(a,b){a.concat(CryptoJS.lib.WordArray.create([2147483648],1));CryptoJS.pad.ZeroPadding.pad(a,b)},unpad:function(a){CryptoJS.pad.ZeroPadding.unpad(a);a.sigBytes--}};
diff --git a/library/cryptojs/components/pad-iso97971.js b/library/cryptojs/components/pad-iso97971.js
new file mode 100644
index 000000000..a60e23192
--- /dev/null
+++ b/library/cryptojs/components/pad-iso97971.js
@@ -0,0 +1,26 @@
+/*
+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
+*/
+/**
+ * ISO/IEC 9797-1 Padding Method 2.
+ */
+CryptoJS.pad.Iso97971 = {
+ pad: function (data, blockSize) {
+ // Add 0x80 byte
+ data.concat(CryptoJS.lib.WordArray.create([0x80000000], 1));
+
+ // Zero pad the rest
+ CryptoJS.pad.ZeroPadding.pad(data, blockSize);
+ },
+
+ unpad: function (data) {
+ // Remove zero padding
+ CryptoJS.pad.ZeroPadding.unpad(data);
+
+ // Remove one more byte -- the 0x80 byte
+ data.sigBytes--;
+ }
+};
diff --git a/library/cryptojs/components/pad-nopadding-min.js b/library/cryptojs/components/pad-nopadding-min.js
new file mode 100644
index 000000000..6f5eb595c
--- /dev/null
+++ b/library/cryptojs/components/pad-nopadding-min.js
@@ -0,0 +1,7 @@
+/*
+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
+*/
+CryptoJS.pad.NoPadding={pad:function(){},unpad:function(){}};
diff --git a/library/cryptojs/components/pad-nopadding.js b/library/cryptojs/components/pad-nopadding.js
new file mode 100644
index 000000000..3bd587420
--- /dev/null
+++ b/library/cryptojs/components/pad-nopadding.js
@@ -0,0 +1,16 @@
+/*
+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
+*/
+/**
+ * A noop padding strategy.
+ */
+CryptoJS.pad.NoPadding = {
+ pad: function () {
+ },
+
+ unpad: function () {
+ }
+};
diff --git a/library/cryptojs/components/pad-zeropadding-min.js b/library/cryptojs/components/pad-zeropadding-min.js
new file mode 100644
index 000000000..18f43efca
--- /dev/null
+++ b/library/cryptojs/components/pad-zeropadding-min.js
@@ -0,0 +1,7 @@
+/*
+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
+*/
+CryptoJS.pad.ZeroPadding={pad:function(a,c){var b=4*c;a.clamp();a.sigBytes+=b-(a.sigBytes%b||b)},unpad:function(a){for(var c=a.words,b=a.sigBytes-1;!(c[b>>>2]>>>24-8*(b%4)&255);)b--;a.sigBytes=b+1}};
diff --git a/library/cryptojs/components/pad-zeropadding.js b/library/cryptojs/components/pad-zeropadding.js
new file mode 100644
index 000000000..e4b5acb99
--- /dev/null
+++ b/library/cryptojs/components/pad-zeropadding.js
@@ -0,0 +1,31 @@
+/*
+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
+*/
+/**
+ * Zero padding strategy.
+ */
+CryptoJS.pad.ZeroPadding = {
+ pad: function (data, blockSize) {
+ // Shortcut
+ var blockSizeBytes = blockSize * 4;
+
+ // Pad
+ data.clamp();
+ data.sigBytes += blockSizeBytes - ((data.sigBytes % blockSizeBytes) || blockSizeBytes);
+ },
+
+ unpad: function (data) {
+ // Shortcut
+ var dataWords = data.words;
+
+ // Unpad
+ var i = data.sigBytes - 1;
+ while (!((dataWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff)) {
+ i--;
+ }
+ data.sigBytes = i + 1;
+ }
+};
diff --git a/library/cryptojs/components/pbkdf2-min.js b/library/cryptojs/components/pbkdf2-min.js
new file mode 100644
index 000000000..2f0941c5d
--- /dev/null
+++ b/library/cryptojs/components/pbkdf2-min.js
@@ -0,0 +1,8 @@
+/*
+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
+*/
+(function(){var b=CryptoJS,a=b.lib,d=a.Base,m=a.WordArray,a=b.algo,q=a.HMAC,l=a.PBKDF2=d.extend({cfg:d.extend({keySize:4,hasher:a.SHA1,iterations:1}),init:function(a){this.cfg=this.cfg.extend(a)},compute:function(a,b){for(var c=this.cfg,f=q.create(c.hasher,a),g=m.create(),d=m.create([1]),l=g.words,r=d.words,n=c.keySize,c=c.iterations;l.length<n;){var h=f.update(b).finalize(d);f.reset();for(var j=h.words,s=j.length,k=h,p=1;p<c;p++){k=f.finalize(k);f.reset();for(var t=k.words,e=0;e<s;e++)j[e]^=t[e]}g.concat(h);
+r[0]++}g.sigBytes=4*n;return g}});b.PBKDF2=function(a,b,c){return l.create(c).compute(a,b)}})();
diff --git a/library/cryptojs/components/pbkdf2.js b/library/cryptojs/components/pbkdf2.js
new file mode 100644
index 000000000..3a1ff29f6
--- /dev/null
+++ b/library/cryptojs/components/pbkdf2.js
@@ -0,0 +1,131 @@
+/*
+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
+*/
+(function () {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var Base = C_lib.Base;
+ var WordArray = C_lib.WordArray;
+ var C_algo = C.algo;
+ var SHA1 = C_algo.SHA1;
+ var HMAC = C_algo.HMAC;
+
+ /**
+ * Password-Based Key Derivation Function 2 algorithm.
+ */
+ var PBKDF2 = C_algo.PBKDF2 = Base.extend({
+ /**
+ * Configuration options.
+ *
+ * @property {number} keySize The key size in words to generate. Default: 4 (128 bits)
+ * @property {Hasher} hasher The hasher to use. Default: SHA1
+ * @property {number} iterations The number of iterations to perform. Default: 1
+ */
+ cfg: Base.extend({
+ keySize: 128/32,
+ hasher: SHA1,
+ iterations: 1
+ }),
+
+ /**
+ * Initializes a newly created key derivation function.
+ *
+ * @param {Object} cfg (Optional) The configuration options to use for the derivation.
+ *
+ * @example
+ *
+ * var kdf = CryptoJS.algo.PBKDF2.create();
+ * var kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8 });
+ * var kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8, iterations: 1000 });
+ */
+ init: function (cfg) {
+ this.cfg = this.cfg.extend(cfg);
+ },
+
+ /**
+ * Computes the Password-Based Key Derivation Function 2.
+ *
+ * @param {WordArray|string} password The password.
+ * @param {WordArray|string} salt A salt.
+ *
+ * @return {WordArray} The derived key.
+ *
+ * @example
+ *
+ * var key = kdf.compute(password, salt);
+ */
+ compute: function (password, salt) {
+ // Shortcut
+ var cfg = this.cfg;
+
+ // Init HMAC
+ var hmac = HMAC.create(cfg.hasher, password);
+
+ // Initial values
+ var derivedKey = WordArray.create();
+ var blockIndex = WordArray.create([0x00000001]);
+
+ // Shortcuts
+ var derivedKeyWords = derivedKey.words;
+ var blockIndexWords = blockIndex.words;
+ var keySize = cfg.keySize;
+ var iterations = cfg.iterations;
+
+ // Generate key
+ while (derivedKeyWords.length < keySize) {
+ var block = hmac.update(salt).finalize(blockIndex);
+ hmac.reset();
+
+ // Shortcuts
+ var blockWords = block.words;
+ var blockWordsLength = blockWords.length;
+
+ // Iterations
+ var intermediate = block;
+ for (var i = 1; i < iterations; i++) {
+ intermediate = hmac.finalize(intermediate);
+ hmac.reset();
+
+ // Shortcut
+ var intermediateWords = intermediate.words;
+
+ // XOR intermediate with block
+ for (var j = 0; j < blockWordsLength; j++) {
+ blockWords[j] ^= intermediateWords[j];
+ }
+ }
+
+ derivedKey.concat(block);
+ blockIndexWords[0]++;
+ }
+ derivedKey.sigBytes = keySize * 4;
+
+ return derivedKey;
+ }
+ });
+
+ /**
+ * Computes the Password-Based Key Derivation Function 2.
+ *
+ * @param {WordArray|string} password The password.
+ * @param {WordArray|string} salt A salt.
+ * @param {Object} cfg (Optional) The configuration options to use for this computation.
+ *
+ * @return {WordArray} The derived key.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var key = CryptoJS.PBKDF2(password, salt);
+ * var key = CryptoJS.PBKDF2(password, salt, { keySize: 8 });
+ * var key = CryptoJS.PBKDF2(password, salt, { keySize: 8, iterations: 1000 });
+ */
+ C.PBKDF2 = function (password, salt, cfg) {
+ return PBKDF2.create(cfg).compute(password, salt);
+ };
+}());
diff --git a/library/cryptojs/components/rabbit-legacy-min.js b/library/cryptojs/components/rabbit-legacy-min.js
new file mode 100644
index 000000000..145078c98
--- /dev/null
+++ b/library/cryptojs/components/rabbit-legacy-min.js
@@ -0,0 +1,11 @@
+/*
+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
+*/
+(function(){function g(){for(var a=this._X,d=this._C,c=0;8>c;c++)f[c]=d[c];d[0]=d[0]+1295307597+this._b|0;d[1]=d[1]+3545052371+(d[0]>>>0<f[0]>>>0?1:0)|0;d[2]=d[2]+886263092+(d[1]>>>0<f[1]>>>0?1:0)|0;d[3]=d[3]+1295307597+(d[2]>>>0<f[2]>>>0?1:0)|0;d[4]=d[4]+3545052371+(d[3]>>>0<f[3]>>>0?1:0)|0;d[5]=d[5]+886263092+(d[4]>>>0<f[4]>>>0?1:0)|0;d[6]=d[6]+1295307597+(d[5]>>>0<f[5]>>>0?1:0)|0;d[7]=d[7]+3545052371+(d[6]>>>0<f[6]>>>0?1:0)|0;this._b=d[7]>>>0<f[7]>>>0?1:0;for(c=0;8>c;c++){var h=a[c]+d[c],e=h&65535,
+g=h>>>16;b[c]=((e*e>>>17)+e*g>>>15)+g*g^((h&4294901760)*h|0)+((h&65535)*h|0)}a[0]=b[0]+(b[7]<<16|b[7]>>>16)+(b[6]<<16|b[6]>>>16)|0;a[1]=b[1]+(b[0]<<8|b[0]>>>24)+b[7]|0;a[2]=b[2]+(b[1]<<16|b[1]>>>16)+(b[0]<<16|b[0]>>>16)|0;a[3]=b[3]+(b[2]<<8|b[2]>>>24)+b[1]|0;a[4]=b[4]+(b[3]<<16|b[3]>>>16)+(b[2]<<16|b[2]>>>16)|0;a[5]=b[5]+(b[4]<<8|b[4]>>>24)+b[3]|0;a[6]=b[6]+(b[5]<<16|b[5]>>>16)+(b[4]<<16|b[4]>>>16)|0;a[7]=b[7]+(b[6]<<8|b[6]>>>24)+b[5]|0}var j=CryptoJS,k=j.lib.StreamCipher,e=[],f=[],b=[],l=j.algo.RabbitLegacy=
+k.extend({_doReset:function(){for(var a=this._key.words,d=this.cfg.iv,c=this._X=[a[0],a[3]<<16|a[2]>>>16,a[1],a[0]<<16|a[3]>>>16,a[2],a[1]<<16|a[0]>>>16,a[3],a[2]<<16|a[1]>>>16],a=this._C=[a[2]<<16|a[2]>>>16,a[0]&4294901760|a[1]&65535,a[3]<<16|a[3]>>>16,a[1]&4294901760|a[2]&65535,a[0]<<16|a[0]>>>16,a[2]&4294901760|a[3]&65535,a[1]<<16|a[1]>>>16,a[3]&4294901760|a[0]&65535],b=this._b=0;4>b;b++)g.call(this);for(b=0;8>b;b++)a[b]^=c[b+4&7];if(d){var c=d.words,d=c[0],c=c[1],d=(d<<8|d>>>24)&16711935|(d<<
+24|d>>>8)&4278255360,c=(c<<8|c>>>24)&16711935|(c<<24|c>>>8)&4278255360,b=d>>>16|c&4294901760,e=c<<16|d&65535;a[0]^=d;a[1]^=b;a[2]^=c;a[3]^=e;a[4]^=d;a[5]^=b;a[6]^=c;a[7]^=e;for(b=0;4>b;b++)g.call(this)}},_doProcessBlock:function(a,b){var c=this._X;g.call(this);e[0]=c[0]^c[5]>>>16^c[3]<<16;e[1]=c[2]^c[7]>>>16^c[5]<<16;e[2]=c[4]^c[1]>>>16^c[7]<<16;e[3]=c[6]^c[3]>>>16^c[1]<<16;for(c=0;4>c;c++)e[c]=(e[c]<<8|e[c]>>>24)&16711935|(e[c]<<24|e[c]>>>8)&4278255360,a[b+c]^=e[c]},blockSize:4,ivSize:2});j.RabbitLegacy=
+k._createHelper(l)})();
diff --git a/library/cryptojs/components/rabbit-legacy.js b/library/cryptojs/components/rabbit-legacy.js
new file mode 100644
index 000000000..1766fefac
--- /dev/null
+++ b/library/cryptojs/components/rabbit-legacy.js
@@ -0,0 +1,176 @@
+/*
+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
+*/
+(function () {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var StreamCipher = C_lib.StreamCipher;
+ var C_algo = C.algo;
+
+ // Reusable objects
+ var S = [];
+ var C_ = [];
+ var G = [];
+
+ /**
+ * Rabbit stream cipher algorithm.
+ *
+ * This is a legacy version that neglected to convert the key to little-endian.
+ * This error doesn't affect the cipher's security,
+ * but it does affect its compatibility with other implementations.
+ */
+ var RabbitLegacy = C_algo.RabbitLegacy = StreamCipher.extend({
+ _doReset: function () {
+ // Shortcuts
+ var K = this._key.words;
+ var iv = this.cfg.iv;
+
+ // Generate initial state values
+ var X = this._X = [
+ K[0], (K[3] << 16) | (K[2] >>> 16),
+ K[1], (K[0] << 16) | (K[3] >>> 16),
+ K[2], (K[1] << 16) | (K[0] >>> 16),
+ K[3], (K[2] << 16) | (K[1] >>> 16)
+ ];
+
+ // Generate initial counter values
+ var C = this._C = [
+ (K[2] << 16) | (K[2] >>> 16), (K[0] & 0xffff0000) | (K[1] & 0x0000ffff),
+ (K[3] << 16) | (K[3] >>> 16), (K[1] & 0xffff0000) | (K[2] & 0x0000ffff),
+ (K[0] << 16) | (K[0] >>> 16), (K[2] & 0xffff0000) | (K[3] & 0x0000ffff),
+ (K[1] << 16) | (K[1] >>> 16), (K[3] & 0xffff0000) | (K[0] & 0x0000ffff)
+ ];
+
+ // Carry bit
+ this._b = 0;
+
+ // Iterate the system four times
+ for (var i = 0; i < 4; i++) {
+ nextState.call(this);
+ }
+
+ // Modify the counters
+ for (var i = 0; i < 8; i++) {
+ C[i] ^= X[(i + 4) & 7];
+ }
+
+ // IV setup
+ if (iv) {
+ // Shortcuts
+ var IV = iv.words;
+ var IV_0 = IV[0];
+ var IV_1 = IV[1];
+
+ // Generate four subvectors
+ var i0 = (((IV_0 << 8) | (IV_0 >>> 24)) & 0x00ff00ff) | (((IV_0 << 24) | (IV_0 >>> 8)) & 0xff00ff00);
+ var i2 = (((IV_1 << 8) | (IV_1 >>> 24)) & 0x00ff00ff) | (((IV_1 << 24) | (IV_1 >>> 8)) & 0xff00ff00);
+ var i1 = (i0 >>> 16) | (i2 & 0xffff0000);
+ var i3 = (i2 << 16) | (i0 & 0x0000ffff);
+
+ // Modify counter values
+ C[0] ^= i0;
+ C[1] ^= i1;
+ C[2] ^= i2;
+ C[3] ^= i3;
+ C[4] ^= i0;
+ C[5] ^= i1;
+ C[6] ^= i2;
+ C[7] ^= i3;
+
+ // Iterate the system four times
+ for (var i = 0; i < 4; i++) {
+ nextState.call(this);
+ }
+ }
+ },
+
+ _doProcessBlock: function (M, offset) {
+ // Shortcut
+ var X = this._X;
+
+ // Iterate the system
+ nextState.call(this);
+
+ // Generate four keystream words
+ S[0] = X[0] ^ (X[5] >>> 16) ^ (X[3] << 16);
+ S[1] = X[2] ^ (X[7] >>> 16) ^ (X[5] << 16);
+ S[2] = X[4] ^ (X[1] >>> 16) ^ (X[7] << 16);
+ S[3] = X[6] ^ (X[3] >>> 16) ^ (X[1] << 16);
+
+ for (var i = 0; i < 4; i++) {
+ // Swap endian
+ S[i] = (((S[i] << 8) | (S[i] >>> 24)) & 0x00ff00ff) |
+ (((S[i] << 24) | (S[i] >>> 8)) & 0xff00ff00);
+
+ // Encrypt
+ M[offset + i] ^= S[i];
+ }
+ },
+
+ blockSize: 128/32,
+
+ ivSize: 64/32
+ });
+
+ function nextState() {
+ // Shortcuts
+ var X = this._X;
+ var C = this._C;
+
+ // Save old counter values
+ for (var i = 0; i < 8; i++) {
+ C_[i] = C[i];
+ }
+
+ // Calculate new counter values
+ C[0] = (C[0] + 0x4d34d34d + this._b) | 0;
+ C[1] = (C[1] + 0xd34d34d3 + ((C[0] >>> 0) < (C_[0] >>> 0) ? 1 : 0)) | 0;
+ C[2] = (C[2] + 0x34d34d34 + ((C[1] >>> 0) < (C_[1] >>> 0) ? 1 : 0)) | 0;
+ C[3] = (C[3] + 0x4d34d34d + ((C[2] >>> 0) < (C_[2] >>> 0) ? 1 : 0)) | 0;
+ C[4] = (C[4] + 0xd34d34d3 + ((C[3] >>> 0) < (C_[3] >>> 0) ? 1 : 0)) | 0;
+ C[5] = (C[5] + 0x34d34d34 + ((C[4] >>> 0) < (C_[4] >>> 0) ? 1 : 0)) | 0;
+ C[6] = (C[6] + 0x4d34d34d + ((C[5] >>> 0) < (C_[5] >>> 0) ? 1 : 0)) | 0;
+ C[7] = (C[7] + 0xd34d34d3 + ((C[6] >>> 0) < (C_[6] >>> 0) ? 1 : 0)) | 0;
+ this._b = (C[7] >>> 0) < (C_[7] >>> 0) ? 1 : 0;
+
+ // Calculate the g-values
+ for (var i = 0; i < 8; i++) {
+ var gx = X[i] + C[i];
+
+ // Construct high and low argument for squaring
+ var ga = gx & 0xffff;
+ var gb = gx >>> 16;
+
+ // Calculate high and low result of squaring
+ var gh = ((((ga * ga) >>> 17) + ga * gb) >>> 15) + gb * gb;
+ var gl = (((gx & 0xffff0000) * gx) | 0) + (((gx & 0x0000ffff) * gx) | 0);
+
+ // High XOR low
+ G[i] = gh ^ gl;
+ }
+
+ // Calculate new state values
+ X[0] = (G[0] + ((G[7] << 16) | (G[7] >>> 16)) + ((G[6] << 16) | (G[6] >>> 16))) | 0;
+ X[1] = (G[1] + ((G[0] << 8) | (G[0] >>> 24)) + G[7]) | 0;
+ X[2] = (G[2] + ((G[1] << 16) | (G[1] >>> 16)) + ((G[0] << 16) | (G[0] >>> 16))) | 0;
+ X[3] = (G[3] + ((G[2] << 8) | (G[2] >>> 24)) + G[1]) | 0;
+ X[4] = (G[4] + ((G[3] << 16) | (G[3] >>> 16)) + ((G[2] << 16) | (G[2] >>> 16))) | 0;
+ X[5] = (G[5] + ((G[4] << 8) | (G[4] >>> 24)) + G[3]) | 0;
+ X[6] = (G[6] + ((G[5] << 16) | (G[5] >>> 16)) + ((G[4] << 16) | (G[4] >>> 16))) | 0;
+ X[7] = (G[7] + ((G[6] << 8) | (G[6] >>> 24)) + G[5]) | 0;
+ }
+
+ /**
+ * Shortcut functions to the cipher's object interface.
+ *
+ * @example
+ *
+ * var ciphertext = CryptoJS.RabbitLegacy.encrypt(message, key, cfg);
+ * var plaintext = CryptoJS.RabbitLegacy.decrypt(ciphertext, key, cfg);
+ */
+ C.RabbitLegacy = StreamCipher._createHelper(RabbitLegacy);
+}());
diff --git a/library/cryptojs/components/rabbit-min.js b/library/cryptojs/components/rabbit-min.js
new file mode 100644
index 000000000..128943174
--- /dev/null
+++ b/library/cryptojs/components/rabbit-min.js
@@ -0,0 +1,11 @@
+/*
+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
+*/
+(function(){function g(){for(var b=this._X,d=this._C,a=0;8>a;a++)f[a]=d[a];d[0]=d[0]+1295307597+this._b|0;d[1]=d[1]+3545052371+(d[0]>>>0<f[0]>>>0?1:0)|0;d[2]=d[2]+886263092+(d[1]>>>0<f[1]>>>0?1:0)|0;d[3]=d[3]+1295307597+(d[2]>>>0<f[2]>>>0?1:0)|0;d[4]=d[4]+3545052371+(d[3]>>>0<f[3]>>>0?1:0)|0;d[5]=d[5]+886263092+(d[4]>>>0<f[4]>>>0?1:0)|0;d[6]=d[6]+1295307597+(d[5]>>>0<f[5]>>>0?1:0)|0;d[7]=d[7]+3545052371+(d[6]>>>0<f[6]>>>0?1:0)|0;this._b=d[7]>>>0<f[7]>>>0?1:0;for(a=0;8>a;a++){var h=b[a]+d[a],e=h&65535,
+g=h>>>16;c[a]=((e*e>>>17)+e*g>>>15)+g*g^((h&4294901760)*h|0)+((h&65535)*h|0)}b[0]=c[0]+(c[7]<<16|c[7]>>>16)+(c[6]<<16|c[6]>>>16)|0;b[1]=c[1]+(c[0]<<8|c[0]>>>24)+c[7]|0;b[2]=c[2]+(c[1]<<16|c[1]>>>16)+(c[0]<<16|c[0]>>>16)|0;b[3]=c[3]+(c[2]<<8|c[2]>>>24)+c[1]|0;b[4]=c[4]+(c[3]<<16|c[3]>>>16)+(c[2]<<16|c[2]>>>16)|0;b[5]=c[5]+(c[4]<<8|c[4]>>>24)+c[3]|0;b[6]=c[6]+(c[5]<<16|c[5]>>>16)+(c[4]<<16|c[4]>>>16)|0;b[7]=c[7]+(c[6]<<8|c[6]>>>24)+c[5]|0}var j=CryptoJS,k=j.lib.StreamCipher,e=[],f=[],c=[],l=j.algo.Rabbit=
+k.extend({_doReset:function(){for(var b=this._key.words,d=this.cfg.iv,a=0;4>a;a++)b[a]=(b[a]<<8|b[a]>>>24)&16711935|(b[a]<<24|b[a]>>>8)&4278255360;for(var c=this._X=[b[0],b[3]<<16|b[2]>>>16,b[1],b[0]<<16|b[3]>>>16,b[2],b[1]<<16|b[0]>>>16,b[3],b[2]<<16|b[1]>>>16],b=this._C=[b[2]<<16|b[2]>>>16,b[0]&4294901760|b[1]&65535,b[3]<<16|b[3]>>>16,b[1]&4294901760|b[2]&65535,b[0]<<16|b[0]>>>16,b[2]&4294901760|b[3]&65535,b[1]<<16|b[1]>>>16,b[3]&4294901760|b[0]&65535],a=this._b=0;4>a;a++)g.call(this);for(a=0;8>
+a;a++)b[a]^=c[a+4&7];if(d){var a=d.words,d=a[0],a=a[1],d=(d<<8|d>>>24)&16711935|(d<<24|d>>>8)&4278255360,a=(a<<8|a>>>24)&16711935|(a<<24|a>>>8)&4278255360,c=d>>>16|a&4294901760,e=a<<16|d&65535;b[0]^=d;b[1]^=c;b[2]^=a;b[3]^=e;b[4]^=d;b[5]^=c;b[6]^=a;b[7]^=e;for(a=0;4>a;a++)g.call(this)}},_doProcessBlock:function(b,c){var a=this._X;g.call(this);e[0]=a[0]^a[5]>>>16^a[3]<<16;e[1]=a[2]^a[7]>>>16^a[5]<<16;e[2]=a[4]^a[1]>>>16^a[7]<<16;e[3]=a[6]^a[3]>>>16^a[1]<<16;for(a=0;4>a;a++)e[a]=(e[a]<<8|e[a]>>>24)&
+16711935|(e[a]<<24|e[a]>>>8)&4278255360,b[c+a]^=e[a]},blockSize:4,ivSize:2});j.Rabbit=k._createHelper(l)})();
diff --git a/library/cryptojs/components/rabbit.js b/library/cryptojs/components/rabbit.js
new file mode 100644
index 000000000..af8cec88e
--- /dev/null
+++ b/library/cryptojs/components/rabbit.js
@@ -0,0 +1,178 @@
+/*
+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
+*/
+(function () {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var StreamCipher = C_lib.StreamCipher;
+ var C_algo = C.algo;
+
+ // Reusable objects
+ var S = [];
+ var C_ = [];
+ var G = [];
+
+ /**
+ * Rabbit stream cipher algorithm
+ */
+ var Rabbit = C_algo.Rabbit = StreamCipher.extend({
+ _doReset: function () {
+ // Shortcuts
+ var K = this._key.words;
+ var iv = this.cfg.iv;
+
+ // Swap endian
+ for (var i = 0; i < 4; i++) {
+ K[i] = (((K[i] << 8) | (K[i] >>> 24)) & 0x00ff00ff) |
+ (((K[i] << 24) | (K[i] >>> 8)) & 0xff00ff00);
+ }
+
+ // Generate initial state values
+ var X = this._X = [
+ K[0], (K[3] << 16) | (K[2] >>> 16),
+ K[1], (K[0] << 16) | (K[3] >>> 16),
+ K[2], (K[1] << 16) | (K[0] >>> 16),
+ K[3], (K[2] << 16) | (K[1] >>> 16)
+ ];
+
+ // Generate initial counter values
+ var C = this._C = [
+ (K[2] << 16) | (K[2] >>> 16), (K[0] & 0xffff0000) | (K[1] & 0x0000ffff),
+ (K[3] << 16) | (K[3] >>> 16), (K[1] & 0xffff0000) | (K[2] & 0x0000ffff),
+ (K[0] << 16) | (K[0] >>> 16), (K[2] & 0xffff0000) | (K[3] & 0x0000ffff),
+ (K[1] << 16) | (K[1] >>> 16), (K[3] & 0xffff0000) | (K[0] & 0x0000ffff)
+ ];
+
+ // Carry bit
+ this._b = 0;
+
+ // Iterate the system four times
+ for (var i = 0; i < 4; i++) {
+ nextState.call(this);
+ }
+
+ // Modify the counters
+ for (var i = 0; i < 8; i++) {
+ C[i] ^= X[(i + 4) & 7];
+ }
+
+ // IV setup
+ if (iv) {
+ // Shortcuts
+ var IV = iv.words;
+ var IV_0 = IV[0];
+ var IV_1 = IV[1];
+
+ // Generate four subvectors
+ var i0 = (((IV_0 << 8) | (IV_0 >>> 24)) & 0x00ff00ff) | (((IV_0 << 24) | (IV_0 >>> 8)) & 0xff00ff00);
+ var i2 = (((IV_1 << 8) | (IV_1 >>> 24)) & 0x00ff00ff) | (((IV_1 << 24) | (IV_1 >>> 8)) & 0xff00ff00);
+ var i1 = (i0 >>> 16) | (i2 & 0xffff0000);
+ var i3 = (i2 << 16) | (i0 & 0x0000ffff);
+
+ // Modify counter values
+ C[0] ^= i0;
+ C[1] ^= i1;
+ C[2] ^= i2;
+ C[3] ^= i3;
+ C[4] ^= i0;
+ C[5] ^= i1;
+ C[6] ^= i2;
+ C[7] ^= i3;
+
+ // Iterate the system four times
+ for (var i = 0; i < 4; i++) {
+ nextState.call(this);
+ }
+ }
+ },
+
+ _doProcessBlock: function (M, offset) {
+ // Shortcut
+ var X = this._X;
+
+ // Iterate the system
+ nextState.call(this);
+
+ // Generate four keystream words
+ S[0] = X[0] ^ (X[5] >>> 16) ^ (X[3] << 16);
+ S[1] = X[2] ^ (X[7] >>> 16) ^ (X[5] << 16);
+ S[2] = X[4] ^ (X[1] >>> 16) ^ (X[7] << 16);
+ S[3] = X[6] ^ (X[3] >>> 16) ^ (X[1] << 16);
+
+ for (var i = 0; i < 4; i++) {
+ // Swap endian
+ S[i] = (((S[i] << 8) | (S[i] >>> 24)) & 0x00ff00ff) |
+ (((S[i] << 24) | (S[i] >>> 8)) & 0xff00ff00);
+
+ // Encrypt
+ M[offset + i] ^= S[i];
+ }
+ },
+
+ blockSize: 128/32,
+
+ ivSize: 64/32
+ });
+
+ function nextState() {
+ // Shortcuts
+ var X = this._X;
+ var C = this._C;
+
+ // Save old counter values
+ for (var i = 0; i < 8; i++) {
+ C_[i] = C[i];
+ }
+
+ // Calculate new counter values
+ C[0] = (C[0] + 0x4d34d34d + this._b) | 0;
+ C[1] = (C[1] + 0xd34d34d3 + ((C[0] >>> 0) < (C_[0] >>> 0) ? 1 : 0)) | 0;
+ C[2] = (C[2] + 0x34d34d34 + ((C[1] >>> 0) < (C_[1] >>> 0) ? 1 : 0)) | 0;
+ C[3] = (C[3] + 0x4d34d34d + ((C[2] >>> 0) < (C_[2] >>> 0) ? 1 : 0)) | 0;
+ C[4] = (C[4] + 0xd34d34d3 + ((C[3] >>> 0) < (C_[3] >>> 0) ? 1 : 0)) | 0;
+ C[5] = (C[5] + 0x34d34d34 + ((C[4] >>> 0) < (C_[4] >>> 0) ? 1 : 0)) | 0;
+ C[6] = (C[6] + 0x4d34d34d + ((C[5] >>> 0) < (C_[5] >>> 0) ? 1 : 0)) | 0;
+ C[7] = (C[7] + 0xd34d34d3 + ((C[6] >>> 0) < (C_[6] >>> 0) ? 1 : 0)) | 0;
+ this._b = (C[7] >>> 0) < (C_[7] >>> 0) ? 1 : 0;
+
+ // Calculate the g-values
+ for (var i = 0; i < 8; i++) {
+ var gx = X[i] + C[i];
+
+ // Construct high and low argument for squaring
+ var ga = gx & 0xffff;
+ var gb = gx >>> 16;
+
+ // Calculate high and low result of squaring
+ var gh = ((((ga * ga) >>> 17) + ga * gb) >>> 15) + gb * gb;
+ var gl = (((gx & 0xffff0000) * gx) | 0) + (((gx & 0x0000ffff) * gx) | 0);
+
+ // High XOR low
+ G[i] = gh ^ gl;
+ }
+
+ // Calculate new state values
+ X[0] = (G[0] + ((G[7] << 16) | (G[7] >>> 16)) + ((G[6] << 16) | (G[6] >>> 16))) | 0;
+ X[1] = (G[1] + ((G[0] << 8) | (G[0] >>> 24)) + G[7]) | 0;
+ X[2] = (G[2] + ((G[1] << 16) | (G[1] >>> 16)) + ((G[0] << 16) | (G[0] >>> 16))) | 0;
+ X[3] = (G[3] + ((G[2] << 8) | (G[2] >>> 24)) + G[1]) | 0;
+ X[4] = (G[4] + ((G[3] << 16) | (G[3] >>> 16)) + ((G[2] << 16) | (G[2] >>> 16))) | 0;
+ X[5] = (G[5] + ((G[4] << 8) | (G[4] >>> 24)) + G[3]) | 0;
+ X[6] = (G[6] + ((G[5] << 16) | (G[5] >>> 16)) + ((G[4] << 16) | (G[4] >>> 16))) | 0;
+ X[7] = (G[7] + ((G[6] << 8) | (G[6] >>> 24)) + G[5]) | 0;
+ }
+
+ /**
+ * Shortcut functions to the cipher's object interface.
+ *
+ * @example
+ *
+ * var ciphertext = CryptoJS.Rabbit.encrypt(message, key, cfg);
+ * var plaintext = CryptoJS.Rabbit.decrypt(ciphertext, key, cfg);
+ */
+ C.Rabbit = StreamCipher._createHelper(Rabbit);
+}());
diff --git a/library/cryptojs/components/rc4-min.js b/library/cryptojs/components/rc4-min.js
new file mode 100644
index 000000000..e14e018fc
--- /dev/null
+++ b/library/cryptojs/components/rc4-min.js
@@ -0,0 +1,8 @@
+/*
+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
+*/
+(function(){function l(){for(var a=this._S,d=this._i,c=this._j,b=0,e=0;4>e;e++){var d=(d+1)%256,c=(c+a[d])%256,f=a[d];a[d]=a[c];a[c]=f;b|=a[(a[d]+a[c])%256]<<24-8*e}this._i=d;this._j=c;return b}var g=CryptoJS,k=g.lib.StreamCipher,h=g.algo,j=h.RC4=k.extend({_doReset:function(){for(var a=this._key,d=a.words,a=a.sigBytes,c=this._S=[],b=0;256>b;b++)c[b]=b;for(var e=b=0;256>b;b++){var f=b%a,e=(e+c[b]+(d[f>>>2]>>>24-8*(f%4)&255))%256,f=c[b];c[b]=c[e];c[e]=f}this._i=this._j=0},_doProcessBlock:function(a,
+d){a[d]^=l.call(this)},keySize:8,ivSize:0});g.RC4=k._createHelper(j);h=h.RC4Drop=j.extend({cfg:j.cfg.extend({drop:192}),_doReset:function(){j._doReset.call(this);for(var a=this.cfg.drop;0<a;a--)l.call(this)}});g.RC4Drop=k._createHelper(h)})();
diff --git a/library/cryptojs/components/rc4.js b/library/cryptojs/components/rc4.js
new file mode 100644
index 000000000..69ccb1375
--- /dev/null
+++ b/library/cryptojs/components/rc4.js
@@ -0,0 +1,125 @@
+/*
+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
+*/
+(function () {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var StreamCipher = C_lib.StreamCipher;
+ var C_algo = C.algo;
+
+ /**
+ * RC4 stream cipher algorithm.
+ */
+ var RC4 = C_algo.RC4 = StreamCipher.extend({
+ _doReset: function () {
+ // Shortcuts
+ var key = this._key;
+ var keyWords = key.words;
+ var keySigBytes = key.sigBytes;
+
+ // Init sbox
+ var S = this._S = [];
+ for (var i = 0; i < 256; i++) {
+ S[i] = i;
+ }
+
+ // Key setup
+ for (var i = 0, j = 0; i < 256; i++) {
+ var keyByteIndex = i % keySigBytes;
+ var keyByte = (keyWords[keyByteIndex >>> 2] >>> (24 - (keyByteIndex % 4) * 8)) & 0xff;
+
+ j = (j + S[i] + keyByte) % 256;
+
+ // Swap
+ var t = S[i];
+ S[i] = S[j];
+ S[j] = t;
+ }
+
+ // Counters
+ this._i = this._j = 0;
+ },
+
+ _doProcessBlock: function (M, offset) {
+ M[offset] ^= generateKeystreamWord.call(this);
+ },
+
+ keySize: 256/32,
+
+ ivSize: 0
+ });
+
+ function generateKeystreamWord() {
+ // Shortcuts
+ var S = this._S;
+ var i = this._i;
+ var j = this._j;
+
+ // Generate keystream word
+ var keystreamWord = 0;
+ for (var n = 0; n < 4; n++) {
+ i = (i + 1) % 256;
+ j = (j + S[i]) % 256;
+
+ // Swap
+ var t = S[i];
+ S[i] = S[j];
+ S[j] = t;
+
+ keystreamWord |= S[(S[i] + S[j]) % 256] << (24 - n * 8);
+ }
+
+ // Update counters
+ this._i = i;
+ this._j = j;
+
+ return keystreamWord;
+ }
+
+ /**
+ * Shortcut functions to the cipher's object interface.
+ *
+ * @example
+ *
+ * var ciphertext = CryptoJS.RC4.encrypt(message, key, cfg);
+ * var plaintext = CryptoJS.RC4.decrypt(ciphertext, key, cfg);
+ */
+ C.RC4 = StreamCipher._createHelper(RC4);
+
+ /**
+ * Modified RC4 stream cipher algorithm.
+ */
+ var RC4Drop = C_algo.RC4Drop = RC4.extend({
+ /**
+ * Configuration options.
+ *
+ * @property {number} drop The number of keystream words to drop. Default 192
+ */
+ cfg: RC4.cfg.extend({
+ drop: 192
+ }),
+
+ _doReset: function () {
+ RC4._doReset.call(this);
+
+ // Drop
+ for (var i = this.cfg.drop; i > 0; i--) {
+ generateKeystreamWord.call(this);
+ }
+ }
+ });
+
+ /**
+ * Shortcut functions to the cipher's object interface.
+ *
+ * @example
+ *
+ * var ciphertext = CryptoJS.RC4Drop.encrypt(message, key, cfg);
+ * var plaintext = CryptoJS.RC4Drop.decrypt(ciphertext, key, cfg);
+ */
+ C.RC4Drop = StreamCipher._createHelper(RC4Drop);
+}());
diff --git a/library/cryptojs/components/ripemd160-min.js b/library/cryptojs/components/ripemd160-min.js
new file mode 100644
index 000000000..a29165119
--- /dev/null
+++ b/library/cryptojs/components/ripemd160-min.js
@@ -0,0 +1,22 @@
+/*
+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
+*/
+/*
+
+(c) 2012 by C?dric Mesnil. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+ - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+ - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 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.
+*/
+(function(){var q=CryptoJS,d=q.lib,n=d.WordArray,p=d.Hasher,d=q.algo,x=n.create([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,7,4,13,1,10,6,15,3,12,0,9,5,2,14,11,8,3,10,14,4,9,15,8,1,2,7,0,6,13,11,5,12,1,9,11,10,0,8,12,4,13,3,7,15,14,5,6,2,4,0,5,9,7,12,2,10,14,1,3,8,11,6,15,13]),y=n.create([5,14,7,0,9,2,11,4,13,6,15,8,1,10,3,12,6,11,3,7,0,13,5,10,14,15,8,12,4,9,1,2,15,5,1,3,7,14,6,9,11,8,12,2,10,0,4,13,8,6,4,1,3,11,15,0,5,12,2,13,9,7,10,14,12,15,10,4,1,5,8,7,6,2,13,14,0,3,9,11]),z=n.create([11,14,15,12,
+5,8,7,9,11,13,14,15,6,7,9,8,7,6,8,13,11,9,7,15,7,12,15,9,11,7,13,12,11,13,6,7,14,9,13,15,14,8,13,6,5,12,7,5,11,12,14,15,14,15,9,8,9,14,5,6,8,6,5,12,9,15,5,11,6,8,13,12,5,12,13,14,11,8,5,6]),A=n.create([8,9,9,11,13,15,15,5,7,7,8,11,14,14,12,6,9,13,15,7,12,8,9,11,7,7,12,7,6,15,13,11,9,7,15,11,8,6,6,14,12,13,5,14,13,13,7,5,15,5,8,11,14,14,6,14,6,9,12,9,12,5,15,8,8,5,12,9,12,5,14,6,8,13,6,5,15,13,11,11]),B=n.create([0,1518500249,1859775393,2400959708,2840853838]),C=n.create([1352829926,1548603684,1836072691,
+2053994217,0]),d=d.RIPEMD160=p.extend({_doReset:function(){this._hash=n.create([1732584193,4023233417,2562383102,271733878,3285377520])},_doProcessBlock:function(e,v){for(var b=0;16>b;b++){var c=v+b,f=e[c];e[c]=(f<<8|f>>>24)&16711935|(f<<24|f>>>8)&4278255360}var c=this._hash.words,f=B.words,d=C.words,n=x.words,q=y.words,p=z.words,w=A.words,t,g,h,j,r,u,k,l,m,s;u=t=c[0];k=g=c[1];l=h=c[2];m=j=c[3];s=r=c[4];for(var a,b=0;80>b;b+=1)a=t+e[v+n[b]]|0,a=16>b?a+((g^h^j)+f[0]):32>b?a+((g&h|~g&j)+f[1]):48>b?
+a+(((g|~h)^j)+f[2]):64>b?a+((g&j|h&~j)+f[3]):a+((g^(h|~j))+f[4]),a|=0,a=a<<p[b]|a>>>32-p[b],a=a+r|0,t=r,r=j,j=h<<10|h>>>22,h=g,g=a,a=u+e[v+q[b]]|0,a=16>b?a+((k^(l|~m))+d[0]):32>b?a+((k&m|l&~m)+d[1]):48>b?a+(((k|~l)^m)+d[2]):64>b?a+((k&l|~k&m)+d[3]):a+((k^l^m)+d[4]),a|=0,a=a<<w[b]|a>>>32-w[b],a=a+s|0,u=s,s=m,m=l<<10|l>>>22,l=k,k=a;a=c[1]+h+m|0;c[1]=c[2]+j+s|0;c[2]=c[3]+r+u|0;c[3]=c[4]+t+k|0;c[4]=c[0]+g+l|0;c[0]=a},_doFinalize:function(){var e=this._data,d=e.words,b=8*this._nDataBytes,c=8*e.sigBytes;
+d[c>>>5]|=128<<24-c%32;d[(c+64>>>9<<4)+14]=(b<<8|b>>>24)&16711935|(b<<24|b>>>8)&4278255360;e.sigBytes=4*(d.length+1);this._process();e=this._hash;d=e.words;for(b=0;5>b;b++)c=d[b],d[b]=(c<<8|c>>>24)&16711935|(c<<24|c>>>8)&4278255360;return e},clone:function(){var d=p.clone.call(this);d._hash=this._hash.clone();return d}});q.RIPEMD160=p._createHelper(d);q.HmacRIPEMD160=p._createHmacHelper(d)})(Math);
diff --git a/library/cryptojs/components/ripemd160.js b/library/cryptojs/components/ripemd160.js
new file mode 100644
index 000000000..4acab8b3c
--- /dev/null
+++ b/library/cryptojs/components/ripemd160.js
@@ -0,0 +1,253 @@
+/*
+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
+*/
+/** @preserve
+(c) 2012 by Cédric Mesnil. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+ - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+ - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 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.
+*/
+
+(function (Math) {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var WordArray = C_lib.WordArray;
+ var Hasher = C_lib.Hasher;
+ var C_algo = C.algo;
+
+ // Constants table
+ var _zl = WordArray.create([
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
+ 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8,
+ 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12,
+ 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2,
+ 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13]);
+ var _zr = WordArray.create([
+ 5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12,
+ 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2,
+ 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13,
+ 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14,
+ 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11]);
+ var _sl = WordArray.create([
+ 11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8,
+ 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12,
+ 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5,
+ 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12,
+ 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6 ]);
+ var _sr = WordArray.create([
+ 8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6,
+ 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11,
+ 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5,
+ 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8,
+ 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11 ]);
+
+ var _hl = WordArray.create([ 0x00000000, 0x5A827999, 0x6ED9EBA1, 0x8F1BBCDC, 0xA953FD4E]);
+ var _hr = WordArray.create([ 0x50A28BE6, 0x5C4DD124, 0x6D703EF3, 0x7A6D76E9, 0x00000000]);
+
+ /**
+ * RIPEMD160 hash algorithm.
+ */
+ var RIPEMD160 = C_algo.RIPEMD160 = Hasher.extend({
+ _doReset: function () {
+ this._hash = WordArray.create([0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0]);
+ },
+
+ _doProcessBlock: function (M, offset) {
+
+ // Swap endian
+ for (var i = 0; i < 16; i++) {
+ // Shortcuts
+ var offset_i = offset + i;
+ var M_offset_i = M[offset_i];
+
+ // Swap
+ M[offset_i] = (
+ (((M_offset_i << 8) | (M_offset_i >>> 24)) & 0x00ff00ff) |
+ (((M_offset_i << 24) | (M_offset_i >>> 8)) & 0xff00ff00)
+ );
+ }
+ // Shortcut
+ var H = this._hash.words;
+ var hl = _hl.words;
+ var hr = _hr.words;
+ var zl = _zl.words;
+ var zr = _zr.words;
+ var sl = _sl.words;
+ var sr = _sr.words;
+
+ // Working variables
+ var al, bl, cl, dl, el;
+ var ar, br, cr, dr, er;
+
+ ar = al = H[0];
+ br = bl = H[1];
+ cr = cl = H[2];
+ dr = dl = H[3];
+ er = el = H[4];
+ // Computation
+ var t;
+ for (var i = 0; i < 80; i += 1) {
+ t = (al + M[offset+zl[i]])|0;
+ if (i<16){
+ t += f1(bl,cl,dl) + hl[0];
+ } else if (i<32) {
+ t += f2(bl,cl,dl) + hl[1];
+ } else if (i<48) {
+ t += f3(bl,cl,dl) + hl[2];
+ } else if (i<64) {
+ t += f4(bl,cl,dl) + hl[3];
+ } else {// if (i<80) {
+ t += f5(bl,cl,dl) + hl[4];
+ }
+ t = t|0;
+ t = rotl(t,sl[i]);
+ t = (t+el)|0;
+ al = el;
+ el = dl;
+ dl = rotl(cl, 10);
+ cl = bl;
+ bl = t;
+
+ t = (ar + M[offset+zr[i]])|0;
+ if (i<16){
+ t += f5(br,cr,dr) + hr[0];
+ } else if (i<32) {
+ t += f4(br,cr,dr) + hr[1];
+ } else if (i<48) {
+ t += f3(br,cr,dr) + hr[2];
+ } else if (i<64) {
+ t += f2(br,cr,dr) + hr[3];
+ } else {// if (i<80) {
+ t += f1(br,cr,dr) + hr[4];
+ }
+ t = t|0;
+ t = rotl(t,sr[i]) ;
+ t = (t+er)|0;
+ ar = er;
+ er = dr;
+ dr = rotl(cr, 10);
+ cr = br;
+ br = t;
+ }
+ // Intermediate hash value
+ t = (H[1] + cl + dr)|0;
+ H[1] = (H[2] + dl + er)|0;
+ H[2] = (H[3] + el + ar)|0;
+ H[3] = (H[4] + al + br)|0;
+ H[4] = (H[0] + bl + cr)|0;
+ H[0] = t;
+ },
+
+ _doFinalize: function () {
+ // Shortcuts
+ var data = this._data;
+ var dataWords = data.words;
+
+ var nBitsTotal = this._nDataBytes * 8;
+ var nBitsLeft = data.sigBytes * 8;
+
+ // Add padding
+ dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);
+ dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = (
+ (((nBitsTotal << 8) | (nBitsTotal >>> 24)) & 0x00ff00ff) |
+ (((nBitsTotal << 24) | (nBitsTotal >>> 8)) & 0xff00ff00)
+ );
+ data.sigBytes = (dataWords.length + 1) * 4;
+
+ // Hash final blocks
+ this._process();
+
+ // Shortcuts
+ var hash = this._hash;
+ var H = hash.words;
+
+ // Swap endian
+ for (var i = 0; i < 5; i++) {
+ // Shortcut
+ var H_i = H[i];
+
+ // Swap
+ H[i] = (((H_i << 8) | (H_i >>> 24)) & 0x00ff00ff) |
+ (((H_i << 24) | (H_i >>> 8)) & 0xff00ff00);
+ }
+
+ // Return final computed hash
+ return hash;
+ },
+
+ clone: function () {
+ var clone = Hasher.clone.call(this);
+ clone._hash = this._hash.clone();
+
+ return clone;
+ }
+ });
+
+
+ function f1(x, y, z) {
+ return ((x) ^ (y) ^ (z));
+
+ }
+
+ function f2(x, y, z) {
+ return (((x)&(y)) | ((~x)&(z)));
+ }
+
+ function f3(x, y, z) {
+ return (((x) | (~(y))) ^ (z));
+ }
+
+ function f4(x, y, z) {
+ return (((x) & (z)) | ((y)&(~(z))));
+ }
+
+ function f5(x, y, z) {
+ return ((x) ^ ((y) |(~(z))));
+
+ }
+
+ function rotl(x,n) {
+ return (x<<n) | (x>>>(32-n));
+ }
+
+
+ /**
+ * Shortcut function to the hasher's object interface.
+ *
+ * @param {WordArray|string} message The message to hash.
+ *
+ * @return {WordArray} The hash.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var hash = CryptoJS.RIPEMD160('message');
+ * var hash = CryptoJS.RIPEMD160(wordArray);
+ */
+ C.RIPEMD160 = Hasher._createHelper(RIPEMD160);
+
+ /**
+ * Shortcut function to the HMAC's object interface.
+ *
+ * @param {WordArray|string} message The message to hash.
+ * @param {WordArray|string} key The secret key.
+ *
+ * @return {WordArray} The HMAC.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var hmac = CryptoJS.HmacRIPEMD160(message, key);
+ */
+ C.HmacRIPEMD160 = Hasher._createHmacHelper(RIPEMD160);
+}(Math));
diff --git a/library/cryptojs/components/sha1-min.js b/library/cryptojs/components/sha1-min.js
new file mode 100644
index 000000000..3ae0311e2
--- /dev/null
+++ b/library/cryptojs/components/sha1-min.js
@@ -0,0 +1,8 @@
+/*
+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
+*/
+(function(){var k=CryptoJS,b=k.lib,m=b.WordArray,l=b.Hasher,d=[],b=k.algo.SHA1=l.extend({_doReset:function(){this._hash=new m.init([1732584193,4023233417,2562383102,271733878,3285377520])},_doProcessBlock:function(n,p){for(var a=this._hash.words,e=a[0],f=a[1],h=a[2],j=a[3],b=a[4],c=0;80>c;c++){if(16>c)d[c]=n[p+c]|0;else{var g=d[c-3]^d[c-8]^d[c-14]^d[c-16];d[c]=g<<1|g>>>31}g=(e<<5|e>>>27)+b+d[c];g=20>c?g+((f&h|~f&j)+1518500249):40>c?g+((f^h^j)+1859775393):60>c?g+((f&h|f&j|h&j)-1894007588):g+((f^h^
+j)-899497514);b=j;j=h;h=f<<30|f>>>2;f=e;e=g}a[0]=a[0]+e|0;a[1]=a[1]+f|0;a[2]=a[2]+h|0;a[3]=a[3]+j|0;a[4]=a[4]+b|0},_doFinalize:function(){var b=this._data,d=b.words,a=8*this._nDataBytes,e=8*b.sigBytes;d[e>>>5]|=128<<24-e%32;d[(e+64>>>9<<4)+14]=Math.floor(a/4294967296);d[(e+64>>>9<<4)+15]=a;b.sigBytes=4*d.length;this._process();return this._hash},clone:function(){var b=l.clone.call(this);b._hash=this._hash.clone();return b}});k.SHA1=l._createHelper(b);k.HmacSHA1=l._createHmacHelper(b)})();
diff --git a/library/cryptojs/components/sha1.js b/library/cryptojs/components/sha1.js
new file mode 100644
index 000000000..01861f472
--- /dev/null
+++ b/library/cryptojs/components/sha1.js
@@ -0,0 +1,136 @@
+/*
+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
+*/
+(function () {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var WordArray = C_lib.WordArray;
+ var Hasher = C_lib.Hasher;
+ var C_algo = C.algo;
+
+ // Reusable object
+ var W = [];
+
+ /**
+ * SHA-1 hash algorithm.
+ */
+ var SHA1 = C_algo.SHA1 = Hasher.extend({
+ _doReset: function () {
+ this._hash = new WordArray.init([
+ 0x67452301, 0xefcdab89,
+ 0x98badcfe, 0x10325476,
+ 0xc3d2e1f0
+ ]);
+ },
+
+ _doProcessBlock: function (M, offset) {
+ // Shortcut
+ var H = this._hash.words;
+
+ // Working variables
+ var a = H[0];
+ var b = H[1];
+ var c = H[2];
+ var d = H[3];
+ var e = H[4];
+
+ // Computation
+ for (var i = 0; i < 80; i++) {
+ if (i < 16) {
+ W[i] = M[offset + i] | 0;
+ } else {
+ var n = W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16];
+ W[i] = (n << 1) | (n >>> 31);
+ }
+
+ var t = ((a << 5) | (a >>> 27)) + e + W[i];
+ if (i < 20) {
+ t += ((b & c) | (~b & d)) + 0x5a827999;
+ } else if (i < 40) {
+ t += (b ^ c ^ d) + 0x6ed9eba1;
+ } else if (i < 60) {
+ t += ((b & c) | (b & d) | (c & d)) - 0x70e44324;
+ } else /* if (i < 80) */ {
+ t += (b ^ c ^ d) - 0x359d3e2a;
+ }
+
+ e = d;
+ d = c;
+ c = (b << 30) | (b >>> 2);
+ b = a;
+ a = t;
+ }
+
+ // Intermediate hash value
+ H[0] = (H[0] + a) | 0;
+ H[1] = (H[1] + b) | 0;
+ H[2] = (H[2] + c) | 0;
+ H[3] = (H[3] + d) | 0;
+ H[4] = (H[4] + e) | 0;
+ },
+
+ _doFinalize: function () {
+ // Shortcuts
+ var data = this._data;
+ var dataWords = data.words;
+
+ var nBitsTotal = this._nDataBytes * 8;
+ var nBitsLeft = data.sigBytes * 8;
+
+ // Add padding
+ dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);
+ dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000);
+ dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal;
+ data.sigBytes = dataWords.length * 4;
+
+ // Hash final blocks
+ this._process();
+
+ // Return final computed hash
+ return this._hash;
+ },
+
+ clone: function () {
+ var clone = Hasher.clone.call(this);
+ clone._hash = this._hash.clone();
+
+ return clone;
+ }
+ });
+
+ /**
+ * Shortcut function to the hasher's object interface.
+ *
+ * @param {WordArray|string} message The message to hash.
+ *
+ * @return {WordArray} The hash.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var hash = CryptoJS.SHA1('message');
+ * var hash = CryptoJS.SHA1(wordArray);
+ */
+ C.SHA1 = Hasher._createHelper(SHA1);
+
+ /**
+ * Shortcut function to the HMAC's object interface.
+ *
+ * @param {WordArray|string} message The message to hash.
+ * @param {WordArray|string} key The secret key.
+ *
+ * @return {WordArray} The HMAC.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var hmac = CryptoJS.HmacSHA1(message, key);
+ */
+ C.HmacSHA1 = Hasher._createHmacHelper(SHA1);
+}());
diff --git a/library/cryptojs/components/sha224-min.js b/library/cryptojs/components/sha224-min.js
new file mode 100644
index 000000000..b0bc65dd5
--- /dev/null
+++ b/library/cryptojs/components/sha224-min.js
@@ -0,0 +1,7 @@
+/*
+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
+*/
+(function(){var b=CryptoJS,d=b.lib.WordArray,a=b.algo,c=a.SHA256,a=a.SHA224=c.extend({_doReset:function(){this._hash=new d.init([3238371032,914150663,812702999,4144912697,4290775857,1750603025,1694076839,3204075428])},_doFinalize:function(){var a=c._doFinalize.call(this);a.sigBytes-=4;return a}});b.SHA224=c._createHelper(a);b.HmacSHA224=c._createHmacHelper(a)})();
diff --git a/library/cryptojs/components/sha224.js b/library/cryptojs/components/sha224.js
new file mode 100644
index 000000000..289f31d55
--- /dev/null
+++ b/library/cryptojs/components/sha224.js
@@ -0,0 +1,66 @@
+/*
+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
+*/
+(function () {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var WordArray = C_lib.WordArray;
+ var C_algo = C.algo;
+ var SHA256 = C_algo.SHA256;
+
+ /**
+ * SHA-224 hash algorithm.
+ */
+ var SHA224 = C_algo.SHA224 = SHA256.extend({
+ _doReset: function () {
+ this._hash = new WordArray.init([
+ 0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939,
+ 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4
+ ]);
+ },
+
+ _doFinalize: function () {
+ var hash = SHA256._doFinalize.call(this);
+
+ hash.sigBytes -= 4;
+
+ return hash;
+ }
+ });
+
+ /**
+ * Shortcut function to the hasher's object interface.
+ *
+ * @param {WordArray|string} message The message to hash.
+ *
+ * @return {WordArray} The hash.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var hash = CryptoJS.SHA224('message');
+ * var hash = CryptoJS.SHA224(wordArray);
+ */
+ C.SHA224 = SHA256._createHelper(SHA224);
+
+ /**
+ * Shortcut function to the HMAC's object interface.
+ *
+ * @param {WordArray|string} message The message to hash.
+ * @param {WordArray|string} key The secret key.
+ *
+ * @return {WordArray} The HMAC.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var hmac = CryptoJS.HmacSHA224(message, key);
+ */
+ C.HmacSHA224 = SHA256._createHmacHelper(SHA224);
+}());
diff --git a/library/cryptojs/components/sha256-min.js b/library/cryptojs/components/sha256-min.js
new file mode 100644
index 000000000..e0fe20900
--- /dev/null
+++ b/library/cryptojs/components/sha256-min.js
@@ -0,0 +1,9 @@
+/*
+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
+*/
+(function(k){for(var g=CryptoJS,h=g.lib,v=h.WordArray,j=h.Hasher,h=g.algo,s=[],t=[],u=function(q){return 4294967296*(q-(q|0))|0},l=2,b=0;64>b;){var d;a:{d=l;for(var w=k.sqrt(d),r=2;r<=w;r++)if(!(d%r)){d=!1;break a}d=!0}d&&(8>b&&(s[b]=u(k.pow(l,0.5))),t[b]=u(k.pow(l,1/3)),b++);l++}var n=[],h=h.SHA256=j.extend({_doReset:function(){this._hash=new v.init(s.slice(0))},_doProcessBlock:function(q,h){for(var a=this._hash.words,c=a[0],d=a[1],b=a[2],k=a[3],f=a[4],g=a[5],j=a[6],l=a[7],e=0;64>e;e++){if(16>e)n[e]=
+q[h+e]|0;else{var m=n[e-15],p=n[e-2];n[e]=((m<<25|m>>>7)^(m<<14|m>>>18)^m>>>3)+n[e-7]+((p<<15|p>>>17)^(p<<13|p>>>19)^p>>>10)+n[e-16]}m=l+((f<<26|f>>>6)^(f<<21|f>>>11)^(f<<7|f>>>25))+(f&g^~f&j)+t[e]+n[e];p=((c<<30|c>>>2)^(c<<19|c>>>13)^(c<<10|c>>>22))+(c&d^c&b^d&b);l=j;j=g;g=f;f=k+m|0;k=b;b=d;d=c;c=m+p|0}a[0]=a[0]+c|0;a[1]=a[1]+d|0;a[2]=a[2]+b|0;a[3]=a[3]+k|0;a[4]=a[4]+f|0;a[5]=a[5]+g|0;a[6]=a[6]+j|0;a[7]=a[7]+l|0},_doFinalize:function(){var d=this._data,b=d.words,a=8*this._nDataBytes,c=8*d.sigBytes;
+b[c>>>5]|=128<<24-c%32;b[(c+64>>>9<<4)+14]=k.floor(a/4294967296);b[(c+64>>>9<<4)+15]=a;d.sigBytes=4*b.length;this._process();return this._hash},clone:function(){var b=j.clone.call(this);b._hash=this._hash.clone();return b}});g.SHA256=j._createHelper(h);g.HmacSHA256=j._createHmacHelper(h)})(Math);
diff --git a/library/cryptojs/components/sha256.js b/library/cryptojs/components/sha256.js
new file mode 100644
index 000000000..16cee0cfd
--- /dev/null
+++ b/library/cryptojs/components/sha256.js
@@ -0,0 +1,185 @@
+/*
+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
+*/
+(function (Math) {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var WordArray = C_lib.WordArray;
+ var Hasher = C_lib.Hasher;
+ var C_algo = C.algo;
+
+ // Initialization and round constants tables
+ var H = [];
+ var K = [];
+
+ // Compute constants
+ (function () {
+ function isPrime(n) {
+ var sqrtN = Math.sqrt(n);
+ for (var factor = 2; factor <= sqrtN; factor++) {
+ if (!(n % factor)) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ function getFractionalBits(n) {
+ return ((n - (n | 0)) * 0x100000000) | 0;
+ }
+
+ var n = 2;
+ var nPrime = 0;
+ while (nPrime < 64) {
+ if (isPrime(n)) {
+ if (nPrime < 8) {
+ H[nPrime] = getFractionalBits(Math.pow(n, 1 / 2));
+ }
+ K[nPrime] = getFractionalBits(Math.pow(n, 1 / 3));
+
+ nPrime++;
+ }
+
+ n++;
+ }
+ }());
+
+ // Reusable object
+ var W = [];
+
+ /**
+ * SHA-256 hash algorithm.
+ */
+ var SHA256 = C_algo.SHA256 = Hasher.extend({
+ _doReset: function () {
+ this._hash = new WordArray.init(H.slice(0));
+ },
+
+ _doProcessBlock: function (M, offset) {
+ // Shortcut
+ var H = this._hash.words;
+
+ // Working variables
+ var a = H[0];
+ var b = H[1];
+ var c = H[2];
+ var d = H[3];
+ var e = H[4];
+ var f = H[5];
+ var g = H[6];
+ var h = H[7];
+
+ // Computation
+ for (var i = 0; i < 64; i++) {
+ if (i < 16) {
+ W[i] = M[offset + i] | 0;
+ } else {
+ var gamma0x = W[i - 15];
+ var gamma0 = ((gamma0x << 25) | (gamma0x >>> 7)) ^
+ ((gamma0x << 14) | (gamma0x >>> 18)) ^
+ (gamma0x >>> 3);
+
+ var gamma1x = W[i - 2];
+ var gamma1 = ((gamma1x << 15) | (gamma1x >>> 17)) ^
+ ((gamma1x << 13) | (gamma1x >>> 19)) ^
+ (gamma1x >>> 10);
+
+ W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16];
+ }
+
+ var ch = (e & f) ^ (~e & g);
+ var maj = (a & b) ^ (a & c) ^ (b & c);
+
+ var sigma0 = ((a << 30) | (a >>> 2)) ^ ((a << 19) | (a >>> 13)) ^ ((a << 10) | (a >>> 22));
+ var sigma1 = ((e << 26) | (e >>> 6)) ^ ((e << 21) | (e >>> 11)) ^ ((e << 7) | (e >>> 25));
+
+ var t1 = h + sigma1 + ch + K[i] + W[i];
+ var t2 = sigma0 + maj;
+
+ h = g;
+ g = f;
+ f = e;
+ e = (d + t1) | 0;
+ d = c;
+ c = b;
+ b = a;
+ a = (t1 + t2) | 0;
+ }
+
+ // Intermediate hash value
+ H[0] = (H[0] + a) | 0;
+ H[1] = (H[1] + b) | 0;
+ H[2] = (H[2] + c) | 0;
+ H[3] = (H[3] + d) | 0;
+ H[4] = (H[4] + e) | 0;
+ H[5] = (H[5] + f) | 0;
+ H[6] = (H[6] + g) | 0;
+ H[7] = (H[7] + h) | 0;
+ },
+
+ _doFinalize: function () {
+ // Shortcuts
+ var data = this._data;
+ var dataWords = data.words;
+
+ var nBitsTotal = this._nDataBytes * 8;
+ var nBitsLeft = data.sigBytes * 8;
+
+ // Add padding
+ dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);
+ dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000);
+ dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal;
+ data.sigBytes = dataWords.length * 4;
+
+ // Hash final blocks
+ this._process();
+
+ // Return final computed hash
+ return this._hash;
+ },
+
+ clone: function () {
+ var clone = Hasher.clone.call(this);
+ clone._hash = this._hash.clone();
+
+ return clone;
+ }
+ });
+
+ /**
+ * Shortcut function to the hasher's object interface.
+ *
+ * @param {WordArray|string} message The message to hash.
+ *
+ * @return {WordArray} The hash.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var hash = CryptoJS.SHA256('message');
+ * var hash = CryptoJS.SHA256(wordArray);
+ */
+ C.SHA256 = Hasher._createHelper(SHA256);
+
+ /**
+ * Shortcut function to the HMAC's object interface.
+ *
+ * @param {WordArray|string} message The message to hash.
+ * @param {WordArray|string} key The secret key.
+ *
+ * @return {WordArray} The HMAC.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var hmac = CryptoJS.HmacSHA256(message, key);
+ */
+ C.HmacSHA256 = Hasher._createHmacHelper(SHA256);
+}(Math));
diff --git a/library/cryptojs/components/sha3-min.js b/library/cryptojs/components/sha3-min.js
new file mode 100644
index 000000000..9783779fe
--- /dev/null
+++ b/library/cryptojs/components/sha3-min.js
@@ -0,0 +1,11 @@
+/*
+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
+*/
+(function(y){for(var p=CryptoJS,m=p.lib,z=m.WordArray,q=m.Hasher,s=p.x64.Word,m=p.algo,v=[],w=[],x=[],c=1,d=0,l=0;24>l;l++){v[c+5*d]=(l+1)*(l+2)/2%64;var r=(2*c+3*d)%5,c=d%5,d=r}for(c=0;5>c;c++)for(d=0;5>d;d++)w[c+5*d]=d+5*((2*c+3*d)%5);c=1;for(d=0;24>d;d++){for(var t=r=l=0;7>t;t++){if(c&1){var u=(1<<t)-1;32>u?r^=1<<u:l^=1<<u-32}c=c&128?c<<1^113:c<<1}x[d]=s.create(l,r)}for(var j=[],c=0;25>c;c++)j[c]=s.create();m=m.SHA3=q.extend({cfg:q.cfg.extend({outputLength:512}),_doReset:function(){for(var c=this._state=
+[],n=0;25>n;n++)c[n]=new s.init;this.blockSize=(1600-2*this.cfg.outputLength)/32},_doProcessBlock:function(c,n){for(var h=this._state,d=this.blockSize/2,b=0;b<d;b++){var e=c[n+2*b],f=c[n+2*b+1],e=(e<<8|e>>>24)&16711935|(e<<24|e>>>8)&4278255360,f=(f<<8|f>>>24)&16711935|(f<<24|f>>>8)&4278255360,a=h[b];a.high^=f;a.low^=e}for(d=0;24>d;d++){for(b=0;5>b;b++){for(var k=e=0,g=0;5>g;g++)a=h[b+5*g],e^=a.high,k^=a.low;a=j[b];a.high=e;a.low=k}for(b=0;5>b;b++){a=j[(b+4)%5];e=j[(b+1)%5];f=e.high;g=e.low;e=a.high^
+(f<<1|g>>>31);k=a.low^(g<<1|f>>>31);for(g=0;5>g;g++)a=h[b+5*g],a.high^=e,a.low^=k}for(f=1;25>f;f++)a=h[f],b=a.high,a=a.low,g=v[f],32>g?(e=b<<g|a>>>32-g,k=a<<g|b>>>32-g):(e=a<<g-32|b>>>64-g,k=b<<g-32|a>>>64-g),a=j[w[f]],a.high=e,a.low=k;a=j[0];b=h[0];a.high=b.high;a.low=b.low;for(b=0;5>b;b++)for(g=0;5>g;g++)f=b+5*g,a=h[f],e=j[f],f=j[(b+1)%5+5*g],k=j[(b+2)%5+5*g],a.high=e.high^~f.high&k.high,a.low=e.low^~f.low&k.low;a=h[0];b=x[d];a.high^=b.high;a.low^=b.low}},_doFinalize:function(){var c=this._data,
+d=c.words,h=8*c.sigBytes,j=32*this.blockSize;d[h>>>5]|=1<<24-h%32;d[(y.ceil((h+1)/j)*j>>>5)-1]|=128;c.sigBytes=4*d.length;this._process();for(var c=this._state,d=this.cfg.outputLength/8,h=d/8,j=[],b=0;b<h;b++){var e=c[b],f=e.high,e=e.low,f=(f<<8|f>>>24)&16711935|(f<<24|f>>>8)&4278255360,e=(e<<8|e>>>24)&16711935|(e<<24|e>>>8)&4278255360;j.push(e);j.push(f)}return new z.init(j,d)},clone:function(){for(var c=q.clone.call(this),d=c._state=this._state.slice(0),h=0;25>h;h++)d[h]=d[h].clone();return c}});
+p.SHA3=q._createHelper(m);p.HmacSHA3=q._createHmacHelper(m)})(Math);
diff --git a/library/cryptojs/components/sha3.js b/library/cryptojs/components/sha3.js
new file mode 100644
index 000000000..1504bfb31
--- /dev/null
+++ b/library/cryptojs/components/sha3.js
@@ -0,0 +1,309 @@
+/*
+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
+*/
+(function (Math) {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var WordArray = C_lib.WordArray;
+ var Hasher = C_lib.Hasher;
+ var C_x64 = C.x64;
+ var X64Word = C_x64.Word;
+ var C_algo = C.algo;
+
+ // Constants tables
+ var RHO_OFFSETS = [];
+ var PI_INDEXES = [];
+ var ROUND_CONSTANTS = [];
+
+ // Compute Constants
+ (function () {
+ // Compute rho offset constants
+ var x = 1, y = 0;
+ for (var t = 0; t < 24; t++) {
+ RHO_OFFSETS[x + 5 * y] = ((t + 1) * (t + 2) / 2) % 64;
+
+ var newX = y % 5;
+ var newY = (2 * x + 3 * y) % 5;
+ x = newX;
+ y = newY;
+ }
+
+ // Compute pi index constants
+ for (var x = 0; x < 5; x++) {
+ for (var y = 0; y < 5; y++) {
+ PI_INDEXES[x + 5 * y] = y + ((2 * x + 3 * y) % 5) * 5;
+ }
+ }
+
+ // Compute round constants
+ var LFSR = 0x01;
+ for (var i = 0; i < 24; i++) {
+ var roundConstantMsw = 0;
+ var roundConstantLsw = 0;
+
+ for (var j = 0; j < 7; j++) {
+ if (LFSR & 0x01) {
+ var bitPosition = (1 << j) - 1;
+ if (bitPosition < 32) {
+ roundConstantLsw ^= 1 << bitPosition;
+ } else /* if (bitPosition >= 32) */ {
+ roundConstantMsw ^= 1 << (bitPosition - 32);
+ }
+ }
+
+ // Compute next LFSR
+ if (LFSR & 0x80) {
+ // Primitive polynomial over GF(2): x^8 + x^6 + x^5 + x^4 + 1
+ LFSR = (LFSR << 1) ^ 0x71;
+ } else {
+ LFSR <<= 1;
+ }
+ }
+
+ ROUND_CONSTANTS[i] = X64Word.create(roundConstantMsw, roundConstantLsw);
+ }
+ }());
+
+ // Reusable objects for temporary values
+ var T = [];
+ (function () {
+ for (var i = 0; i < 25; i++) {
+ T[i] = X64Word.create();
+ }
+ }());
+
+ /**
+ * SHA-3 hash algorithm.
+ */
+ var SHA3 = C_algo.SHA3 = Hasher.extend({
+ /**
+ * Configuration options.
+ *
+ * @property {number} outputLength
+ * The desired number of bits in the output hash.
+ * Only values permitted are: 224, 256, 384, 512.
+ * Default: 512
+ */
+ cfg: Hasher.cfg.extend({
+ outputLength: 512
+ }),
+
+ _doReset: function () {
+ var state = this._state = []
+ for (var i = 0; i < 25; i++) {
+ state[i] = new X64Word.init();
+ }
+
+ this.blockSize = (1600 - 2 * this.cfg.outputLength) / 32;
+ },
+
+ _doProcessBlock: function (M, offset) {
+ // Shortcuts
+ var state = this._state;
+ var nBlockSizeLanes = this.blockSize / 2;
+
+ // Absorb
+ for (var i = 0; i < nBlockSizeLanes; i++) {
+ // Shortcuts
+ var M2i = M[offset + 2 * i];
+ var M2i1 = M[offset + 2 * i + 1];
+
+ // Swap endian
+ M2i = (
+ (((M2i << 8) | (M2i >>> 24)) & 0x00ff00ff) |
+ (((M2i << 24) | (M2i >>> 8)) & 0xff00ff00)
+ );
+ M2i1 = (
+ (((M2i1 << 8) | (M2i1 >>> 24)) & 0x00ff00ff) |
+ (((M2i1 << 24) | (M2i1 >>> 8)) & 0xff00ff00)
+ );
+
+ // Absorb message into state
+ var lane = state[i];
+ lane.high ^= M2i1;
+ lane.low ^= M2i;
+ }
+
+ // Rounds
+ for (var round = 0; round < 24; round++) {
+ // Theta
+ for (var x = 0; x < 5; x++) {
+ // Mix column lanes
+ var tMsw = 0, tLsw = 0;
+ for (var y = 0; y < 5; y++) {
+ var lane = state[x + 5 * y];
+ tMsw ^= lane.high;
+ tLsw ^= lane.low;
+ }
+
+ // Temporary values
+ var Tx = T[x];
+ Tx.high = tMsw;
+ Tx.low = tLsw;
+ }
+ for (var x = 0; x < 5; x++) {
+ // Shortcuts
+ var Tx4 = T[(x + 4) % 5];
+ var Tx1 = T[(x + 1) % 5];
+ var Tx1Msw = Tx1.high;
+ var Tx1Lsw = Tx1.low;
+
+ // Mix surrounding columns
+ var tMsw = Tx4.high ^ ((Tx1Msw << 1) | (Tx1Lsw >>> 31));
+ var tLsw = Tx4.low ^ ((Tx1Lsw << 1) | (Tx1Msw >>> 31));
+ for (var y = 0; y < 5; y++) {
+ var lane = state[x + 5 * y];
+ lane.high ^= tMsw;
+ lane.low ^= tLsw;
+ }
+ }
+
+ // Rho Pi
+ for (var laneIndex = 1; laneIndex < 25; laneIndex++) {
+ // Shortcuts
+ var lane = state[laneIndex];
+ var laneMsw = lane.high;
+ var laneLsw = lane.low;
+ var rhoOffset = RHO_OFFSETS[laneIndex];
+
+ // Rotate lanes
+ if (rhoOffset < 32) {
+ var tMsw = (laneMsw << rhoOffset) | (laneLsw >>> (32 - rhoOffset));
+ var tLsw = (laneLsw << rhoOffset) | (laneMsw >>> (32 - rhoOffset));
+ } else /* if (rhoOffset >= 32) */ {
+ var tMsw = (laneLsw << (rhoOffset - 32)) | (laneMsw >>> (64 - rhoOffset));
+ var tLsw = (laneMsw << (rhoOffset - 32)) | (laneLsw >>> (64 - rhoOffset));
+ }
+
+ // Transpose lanes
+ var TPiLane = T[PI_INDEXES[laneIndex]];
+ TPiLane.high = tMsw;
+ TPiLane.low = tLsw;
+ }
+
+ // Rho pi at x = y = 0
+ var T0 = T[0];
+ var state0 = state[0];
+ T0.high = state0.high;
+ T0.low = state0.low;
+
+ // Chi
+ for (var x = 0; x < 5; x++) {
+ for (var y = 0; y < 5; y++) {
+ // Shortcuts
+ var laneIndex = x + 5 * y;
+ var lane = state[laneIndex];
+ var TLane = T[laneIndex];
+ var Tx1Lane = T[((x + 1) % 5) + 5 * y];
+ var Tx2Lane = T[((x + 2) % 5) + 5 * y];
+
+ // Mix rows
+ lane.high = TLane.high ^ (~Tx1Lane.high & Tx2Lane.high);
+ lane.low = TLane.low ^ (~Tx1Lane.low & Tx2Lane.low);
+ }
+ }
+
+ // Iota
+ var lane = state[0];
+ var roundConstant = ROUND_CONSTANTS[round];
+ lane.high ^= roundConstant.high;
+ lane.low ^= roundConstant.low;;
+ }
+ },
+
+ _doFinalize: function () {
+ // Shortcuts
+ var data = this._data;
+ var dataWords = data.words;
+ var nBitsTotal = this._nDataBytes * 8;
+ var nBitsLeft = data.sigBytes * 8;
+ var blockSizeBits = this.blockSize * 32;
+
+ // Add padding
+ dataWords[nBitsLeft >>> 5] |= 0x1 << (24 - nBitsLeft % 32);
+ dataWords[((Math.ceil((nBitsLeft + 1) / blockSizeBits) * blockSizeBits) >>> 5) - 1] |= 0x80;
+ data.sigBytes = dataWords.length * 4;
+
+ // Hash final blocks
+ this._process();
+
+ // Shortcuts
+ var state = this._state;
+ var outputLengthBytes = this.cfg.outputLength / 8;
+ var outputLengthLanes = outputLengthBytes / 8;
+
+ // Squeeze
+ var hashWords = [];
+ for (var i = 0; i < outputLengthLanes; i++) {
+ // Shortcuts
+ var lane = state[i];
+ var laneMsw = lane.high;
+ var laneLsw = lane.low;
+
+ // Swap endian
+ laneMsw = (
+ (((laneMsw << 8) | (laneMsw >>> 24)) & 0x00ff00ff) |
+ (((laneMsw << 24) | (laneMsw >>> 8)) & 0xff00ff00)
+ );
+ laneLsw = (
+ (((laneLsw << 8) | (laneLsw >>> 24)) & 0x00ff00ff) |
+ (((laneLsw << 24) | (laneLsw >>> 8)) & 0xff00ff00)
+ );
+
+ // Squeeze state to retrieve hash
+ hashWords.push(laneLsw);
+ hashWords.push(laneMsw);
+ }
+
+ // Return final computed hash
+ return new WordArray.init(hashWords, outputLengthBytes);
+ },
+
+ clone: function () {
+ var clone = Hasher.clone.call(this);
+
+ var state = clone._state = this._state.slice(0);
+ for (var i = 0; i < 25; i++) {
+ state[i] = state[i].clone();
+ }
+
+ return clone;
+ }
+ });
+
+ /**
+ * Shortcut function to the hasher's object interface.
+ *
+ * @param {WordArray|string} message The message to hash.
+ *
+ * @return {WordArray} The hash.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var hash = CryptoJS.SHA3('message');
+ * var hash = CryptoJS.SHA3(wordArray);
+ */
+ C.SHA3 = Hasher._createHelper(SHA3);
+
+ /**
+ * Shortcut function to the HMAC's object interface.
+ *
+ * @param {WordArray|string} message The message to hash.
+ * @param {WordArray|string} key The secret key.
+ *
+ * @return {WordArray} The HMAC.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var hmac = CryptoJS.HmacSHA3(message, key);
+ */
+ C.HmacSHA3 = Hasher._createHmacHelper(SHA3);
+}(Math));
diff --git a/library/cryptojs/components/sha384-min.js b/library/cryptojs/components/sha384-min.js
new file mode 100644
index 000000000..d29bb2046
--- /dev/null
+++ b/library/cryptojs/components/sha384-min.js
@@ -0,0 +1,8 @@
+/*
+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
+*/
+(function(){var c=CryptoJS,a=c.x64,b=a.Word,e=a.WordArray,a=c.algo,d=a.SHA512,a=a.SHA384=d.extend({_doReset:function(){this._hash=new e.init([new b.init(3418070365,3238371032),new b.init(1654270250,914150663),new b.init(2438529370,812702999),new b.init(355462360,4144912697),new b.init(1731405415,4290775857),new b.init(2394180231,1750603025),new b.init(3675008525,1694076839),new b.init(1203062813,3204075428)])},_doFinalize:function(){var a=d._doFinalize.call(this);a.sigBytes-=16;return a}});c.SHA384=
+d._createHelper(a);c.HmacSHA384=d._createHmacHelper(a)})();
diff --git a/library/cryptojs/components/sha384.js b/library/cryptojs/components/sha384.js
new file mode 100644
index 000000000..8106959bd
--- /dev/null
+++ b/library/cryptojs/components/sha384.js
@@ -0,0 +1,69 @@
+/*
+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
+*/
+(function () {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_x64 = C.x64;
+ var X64Word = C_x64.Word;
+ var X64WordArray = C_x64.WordArray;
+ var C_algo = C.algo;
+ var SHA512 = C_algo.SHA512;
+
+ /**
+ * SHA-384 hash algorithm.
+ */
+ var SHA384 = C_algo.SHA384 = SHA512.extend({
+ _doReset: function () {
+ this._hash = new X64WordArray.init([
+ new X64Word.init(0xcbbb9d5d, 0xc1059ed8), new X64Word.init(0x629a292a, 0x367cd507),
+ new X64Word.init(0x9159015a, 0x3070dd17), new X64Word.init(0x152fecd8, 0xf70e5939),
+ new X64Word.init(0x67332667, 0xffc00b31), new X64Word.init(0x8eb44a87, 0x68581511),
+ new X64Word.init(0xdb0c2e0d, 0x64f98fa7), new X64Word.init(0x47b5481d, 0xbefa4fa4)
+ ]);
+ },
+
+ _doFinalize: function () {
+ var hash = SHA512._doFinalize.call(this);
+
+ hash.sigBytes -= 16;
+
+ return hash;
+ }
+ });
+
+ /**
+ * Shortcut function to the hasher's object interface.
+ *
+ * @param {WordArray|string} message The message to hash.
+ *
+ * @return {WordArray} The hash.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var hash = CryptoJS.SHA384('message');
+ * var hash = CryptoJS.SHA384(wordArray);
+ */
+ C.SHA384 = SHA512._createHelper(SHA384);
+
+ /**
+ * Shortcut function to the HMAC's object interface.
+ *
+ * @param {WordArray|string} message The message to hash.
+ * @param {WordArray|string} key The secret key.
+ *
+ * @return {WordArray} The HMAC.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var hmac = CryptoJS.HmacSHA384(message, key);
+ */
+ C.HmacSHA384 = SHA512._createHmacHelper(SHA384);
+}());
diff --git a/library/cryptojs/components/sha512-min.js b/library/cryptojs/components/sha512-min.js
new file mode 100644
index 000000000..5df4b7076
--- /dev/null
+++ b/library/cryptojs/components/sha512-min.js
@@ -0,0 +1,15 @@
+/*
+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
+*/
+(function(){function a(){return d.create.apply(d,arguments)}for(var n=CryptoJS,r=n.lib.Hasher,e=n.x64,d=e.Word,T=e.WordArray,e=n.algo,ea=[a(1116352408,3609767458),a(1899447441,602891725),a(3049323471,3964484399),a(3921009573,2173295548),a(961987163,4081628472),a(1508970993,3053834265),a(2453635748,2937671579),a(2870763221,3664609560),a(3624381080,2734883394),a(310598401,1164996542),a(607225278,1323610764),a(1426881987,3590304994),a(1925078388,4068182383),a(2162078206,991336113),a(2614888103,633803317),
+a(3248222580,3479774868),a(3835390401,2666613458),a(4022224774,944711139),a(264347078,2341262773),a(604807628,2007800933),a(770255983,1495990901),a(1249150122,1856431235),a(1555081692,3175218132),a(1996064986,2198950837),a(2554220882,3999719339),a(2821834349,766784016),a(2952996808,2566594879),a(3210313671,3203337956),a(3336571891,1034457026),a(3584528711,2466948901),a(113926993,3758326383),a(338241895,168717936),a(666307205,1188179964),a(773529912,1546045734),a(1294757372,1522805485),a(1396182291,
+2643833823),a(1695183700,2343527390),a(1986661051,1014477480),a(2177026350,1206759142),a(2456956037,344077627),a(2730485921,1290863460),a(2820302411,3158454273),a(3259730800,3505952657),a(3345764771,106217008),a(3516065817,3606008344),a(3600352804,1432725776),a(4094571909,1467031594),a(275423344,851169720),a(430227734,3100823752),a(506948616,1363258195),a(659060556,3750685593),a(883997877,3785050280),a(958139571,3318307427),a(1322822218,3812723403),a(1537002063,2003034995),a(1747873779,3602036899),
+a(1955562222,1575990012),a(2024104815,1125592928),a(2227730452,2716904306),a(2361852424,442776044),a(2428436474,593698344),a(2756734187,3733110249),a(3204031479,2999351573),a(3329325298,3815920427),a(3391569614,3928383900),a(3515267271,566280711),a(3940187606,3454069534),a(4118630271,4000239992),a(116418474,1914138554),a(174292421,2731055270),a(289380356,3203993006),a(460393269,320620315),a(685471733,587496836),a(852142971,1086792851),a(1017036298,365543100),a(1126000580,2618297676),a(1288033470,
+3409855158),a(1501505948,4234509866),a(1607167915,987167468),a(1816402316,1246189591)],v=[],w=0;80>w;w++)v[w]=a();e=e.SHA512=r.extend({_doReset:function(){this._hash=new T.init([new d.init(1779033703,4089235720),new d.init(3144134277,2227873595),new d.init(1013904242,4271175723),new d.init(2773480762,1595750129),new d.init(1359893119,2917565137),new d.init(2600822924,725511199),new d.init(528734635,4215389547),new d.init(1541459225,327033209)])},_doProcessBlock:function(a,d){for(var f=this._hash.words,
+F=f[0],e=f[1],n=f[2],r=f[3],G=f[4],H=f[5],I=f[6],f=f[7],w=F.high,J=F.low,X=e.high,K=e.low,Y=n.high,L=n.low,Z=r.high,M=r.low,$=G.high,N=G.low,aa=H.high,O=H.low,ba=I.high,P=I.low,ca=f.high,Q=f.low,k=w,g=J,z=X,x=K,A=Y,y=L,U=Z,B=M,l=$,h=N,R=aa,C=O,S=ba,D=P,V=ca,E=Q,m=0;80>m;m++){var s=v[m];if(16>m)var j=s.high=a[d+2*m]|0,b=s.low=a[d+2*m+1]|0;else{var j=v[m-15],b=j.high,p=j.low,j=(b>>>1|p<<31)^(b>>>8|p<<24)^b>>>7,p=(p>>>1|b<<31)^(p>>>8|b<<24)^(p>>>7|b<<25),u=v[m-2],b=u.high,c=u.low,u=(b>>>19|c<<13)^(b<<
+3|c>>>29)^b>>>6,c=(c>>>19|b<<13)^(c<<3|b>>>29)^(c>>>6|b<<26),b=v[m-7],W=b.high,t=v[m-16],q=t.high,t=t.low,b=p+b.low,j=j+W+(b>>>0<p>>>0?1:0),b=b+c,j=j+u+(b>>>0<c>>>0?1:0),b=b+t,j=j+q+(b>>>0<t>>>0?1:0);s.high=j;s.low=b}var W=l&R^~l&S,t=h&C^~h&D,s=k&z^k&A^z&A,T=g&x^g&y^x&y,p=(k>>>28|g<<4)^(k<<30|g>>>2)^(k<<25|g>>>7),u=(g>>>28|k<<4)^(g<<30|k>>>2)^(g<<25|k>>>7),c=ea[m],fa=c.high,da=c.low,c=E+((h>>>14|l<<18)^(h>>>18|l<<14)^(h<<23|l>>>9)),q=V+((l>>>14|h<<18)^(l>>>18|h<<14)^(l<<23|h>>>9))+(c>>>0<E>>>0?1:
+0),c=c+t,q=q+W+(c>>>0<t>>>0?1:0),c=c+da,q=q+fa+(c>>>0<da>>>0?1:0),c=c+b,q=q+j+(c>>>0<b>>>0?1:0),b=u+T,s=p+s+(b>>>0<u>>>0?1:0),V=S,E=D,S=R,D=C,R=l,C=h,h=B+c|0,l=U+q+(h>>>0<B>>>0?1:0)|0,U=A,B=y,A=z,y=x,z=k,x=g,g=c+b|0,k=q+s+(g>>>0<c>>>0?1:0)|0}J=F.low=J+g;F.high=w+k+(J>>>0<g>>>0?1:0);K=e.low=K+x;e.high=X+z+(K>>>0<x>>>0?1:0);L=n.low=L+y;n.high=Y+A+(L>>>0<y>>>0?1:0);M=r.low=M+B;r.high=Z+U+(M>>>0<B>>>0?1:0);N=G.low=N+h;G.high=$+l+(N>>>0<h>>>0?1:0);O=H.low=O+C;H.high=aa+R+(O>>>0<C>>>0?1:0);P=I.low=P+D;
+I.high=ba+S+(P>>>0<D>>>0?1:0);Q=f.low=Q+E;f.high=ca+V+(Q>>>0<E>>>0?1:0)},_doFinalize:function(){var a=this._data,d=a.words,f=8*this._nDataBytes,e=8*a.sigBytes;d[e>>>5]|=128<<24-e%32;d[(e+128>>>10<<5)+30]=Math.floor(f/4294967296);d[(e+128>>>10<<5)+31]=f;a.sigBytes=4*d.length;this._process();return this._hash.toX32()},clone:function(){var a=r.clone.call(this);a._hash=this._hash.clone();return a},blockSize:32});n.SHA512=r._createHelper(e);n.HmacSHA512=r._createHmacHelper(e)})();
diff --git a/library/cryptojs/components/sha512.js b/library/cryptojs/components/sha512.js
new file mode 100644
index 000000000..4c6940cb7
--- /dev/null
+++ b/library/cryptojs/components/sha512.js
@@ -0,0 +1,309 @@
+/*
+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
+*/
+(function () {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var Hasher = C_lib.Hasher;
+ var C_x64 = C.x64;
+ var X64Word = C_x64.Word;
+ var X64WordArray = C_x64.WordArray;
+ var C_algo = C.algo;
+
+ function X64Word_create() {
+ return X64Word.create.apply(X64Word, arguments);
+ }
+
+ // Constants
+ var K = [
+ X64Word_create(0x428a2f98, 0xd728ae22), X64Word_create(0x71374491, 0x23ef65cd),
+ X64Word_create(0xb5c0fbcf, 0xec4d3b2f), X64Word_create(0xe9b5dba5, 0x8189dbbc),
+ X64Word_create(0x3956c25b, 0xf348b538), X64Word_create(0x59f111f1, 0xb605d019),
+ X64Word_create(0x923f82a4, 0xaf194f9b), X64Word_create(0xab1c5ed5, 0xda6d8118),
+ X64Word_create(0xd807aa98, 0xa3030242), X64Word_create(0x12835b01, 0x45706fbe),
+ X64Word_create(0x243185be, 0x4ee4b28c), X64Word_create(0x550c7dc3, 0xd5ffb4e2),
+ X64Word_create(0x72be5d74, 0xf27b896f), X64Word_create(0x80deb1fe, 0x3b1696b1),
+ X64Word_create(0x9bdc06a7, 0x25c71235), X64Word_create(0xc19bf174, 0xcf692694),
+ X64Word_create(0xe49b69c1, 0x9ef14ad2), X64Word_create(0xefbe4786, 0x384f25e3),
+ X64Word_create(0x0fc19dc6, 0x8b8cd5b5), X64Word_create(0x240ca1cc, 0x77ac9c65),
+ X64Word_create(0x2de92c6f, 0x592b0275), X64Word_create(0x4a7484aa, 0x6ea6e483),
+ X64Word_create(0x5cb0a9dc, 0xbd41fbd4), X64Word_create(0x76f988da, 0x831153b5),
+ X64Word_create(0x983e5152, 0xee66dfab), X64Word_create(0xa831c66d, 0x2db43210),
+ X64Word_create(0xb00327c8, 0x98fb213f), X64Word_create(0xbf597fc7, 0xbeef0ee4),
+ X64Word_create(0xc6e00bf3, 0x3da88fc2), X64Word_create(0xd5a79147, 0x930aa725),
+ X64Word_create(0x06ca6351, 0xe003826f), X64Word_create(0x14292967, 0x0a0e6e70),
+ X64Word_create(0x27b70a85, 0x46d22ffc), X64Word_create(0x2e1b2138, 0x5c26c926),
+ X64Word_create(0x4d2c6dfc, 0x5ac42aed), X64Word_create(0x53380d13, 0x9d95b3df),
+ X64Word_create(0x650a7354, 0x8baf63de), X64Word_create(0x766a0abb, 0x3c77b2a8),
+ X64Word_create(0x81c2c92e, 0x47edaee6), X64Word_create(0x92722c85, 0x1482353b),
+ X64Word_create(0xa2bfe8a1, 0x4cf10364), X64Word_create(0xa81a664b, 0xbc423001),
+ X64Word_create(0xc24b8b70, 0xd0f89791), X64Word_create(0xc76c51a3, 0x0654be30),
+ X64Word_create(0xd192e819, 0xd6ef5218), X64Word_create(0xd6990624, 0x5565a910),
+ X64Word_create(0xf40e3585, 0x5771202a), X64Word_create(0x106aa070, 0x32bbd1b8),
+ X64Word_create(0x19a4c116, 0xb8d2d0c8), X64Word_create(0x1e376c08, 0x5141ab53),
+ X64Word_create(0x2748774c, 0xdf8eeb99), X64Word_create(0x34b0bcb5, 0xe19b48a8),
+ X64Word_create(0x391c0cb3, 0xc5c95a63), X64Word_create(0x4ed8aa4a, 0xe3418acb),
+ X64Word_create(0x5b9cca4f, 0x7763e373), X64Word_create(0x682e6ff3, 0xd6b2b8a3),
+ X64Word_create(0x748f82ee, 0x5defb2fc), X64Word_create(0x78a5636f, 0x43172f60),
+ X64Word_create(0x84c87814, 0xa1f0ab72), X64Word_create(0x8cc70208, 0x1a6439ec),
+ X64Word_create(0x90befffa, 0x23631e28), X64Word_create(0xa4506ceb, 0xde82bde9),
+ X64Word_create(0xbef9a3f7, 0xb2c67915), X64Word_create(0xc67178f2, 0xe372532b),
+ X64Word_create(0xca273ece, 0xea26619c), X64Word_create(0xd186b8c7, 0x21c0c207),
+ X64Word_create(0xeada7dd6, 0xcde0eb1e), X64Word_create(0xf57d4f7f, 0xee6ed178),
+ X64Word_create(0x06f067aa, 0x72176fba), X64Word_create(0x0a637dc5, 0xa2c898a6),
+ X64Word_create(0x113f9804, 0xbef90dae), X64Word_create(0x1b710b35, 0x131c471b),
+ X64Word_create(0x28db77f5, 0x23047d84), X64Word_create(0x32caab7b, 0x40c72493),
+ X64Word_create(0x3c9ebe0a, 0x15c9bebc), X64Word_create(0x431d67c4, 0x9c100d4c),
+ X64Word_create(0x4cc5d4be, 0xcb3e42b6), X64Word_create(0x597f299c, 0xfc657e2a),
+ X64Word_create(0x5fcb6fab, 0x3ad6faec), X64Word_create(0x6c44198c, 0x4a475817)
+ ];
+
+ // Reusable objects
+ var W = [];
+ (function () {
+ for (var i = 0; i < 80; i++) {
+ W[i] = X64Word_create();
+ }
+ }());
+
+ /**
+ * SHA-512 hash algorithm.
+ */
+ var SHA512 = C_algo.SHA512 = Hasher.extend({
+ _doReset: function () {
+ this._hash = new X64WordArray.init([
+ new X64Word.init(0x6a09e667, 0xf3bcc908), new X64Word.init(0xbb67ae85, 0x84caa73b),
+ new X64Word.init(0x3c6ef372, 0xfe94f82b), new X64Word.init(0xa54ff53a, 0x5f1d36f1),
+ new X64Word.init(0x510e527f, 0xade682d1), new X64Word.init(0x9b05688c, 0x2b3e6c1f),
+ new X64Word.init(0x1f83d9ab, 0xfb41bd6b), new X64Word.init(0x5be0cd19, 0x137e2179)
+ ]);
+ },
+
+ _doProcessBlock: function (M, offset) {
+ // Shortcuts
+ var H = this._hash.words;
+
+ var H0 = H[0];
+ var H1 = H[1];
+ var H2 = H[2];
+ var H3 = H[3];
+ var H4 = H[4];
+ var H5 = H[5];
+ var H6 = H[6];
+ var H7 = H[7];
+
+ var H0h = H0.high;
+ var H0l = H0.low;
+ var H1h = H1.high;
+ var H1l = H1.low;
+ var H2h = H2.high;
+ var H2l = H2.low;
+ var H3h = H3.high;
+ var H3l = H3.low;
+ var H4h = H4.high;
+ var H4l = H4.low;
+ var H5h = H5.high;
+ var H5l = H5.low;
+ var H6h = H6.high;
+ var H6l = H6.low;
+ var H7h = H7.high;
+ var H7l = H7.low;
+
+ // Working variables
+ var ah = H0h;
+ var al = H0l;
+ var bh = H1h;
+ var bl = H1l;
+ var ch = H2h;
+ var cl = H2l;
+ var dh = H3h;
+ var dl = H3l;
+ var eh = H4h;
+ var el = H4l;
+ var fh = H5h;
+ var fl = H5l;
+ var gh = H6h;
+ var gl = H6l;
+ var hh = H7h;
+ var hl = H7l;
+
+ // Rounds
+ for (var i = 0; i < 80; i++) {
+ // Shortcut
+ var Wi = W[i];
+
+ // Extend message
+ if (i < 16) {
+ var Wih = Wi.high = M[offset + i * 2] | 0;
+ var Wil = Wi.low = M[offset + i * 2 + 1] | 0;
+ } else {
+ // Gamma0
+ var gamma0x = W[i - 15];
+ var gamma0xh = gamma0x.high;
+ var gamma0xl = gamma0x.low;
+ var gamma0h = ((gamma0xh >>> 1) | (gamma0xl << 31)) ^ ((gamma0xh >>> 8) | (gamma0xl << 24)) ^ (gamma0xh >>> 7);
+ var gamma0l = ((gamma0xl >>> 1) | (gamma0xh << 31)) ^ ((gamma0xl >>> 8) | (gamma0xh << 24)) ^ ((gamma0xl >>> 7) | (gamma0xh << 25));
+
+ // Gamma1
+ var gamma1x = W[i - 2];
+ var gamma1xh = gamma1x.high;
+ var gamma1xl = gamma1x.low;
+ var gamma1h = ((gamma1xh >>> 19) | (gamma1xl << 13)) ^ ((gamma1xh << 3) | (gamma1xl >>> 29)) ^ (gamma1xh >>> 6);
+ var gamma1l = ((gamma1xl >>> 19) | (gamma1xh << 13)) ^ ((gamma1xl << 3) | (gamma1xh >>> 29)) ^ ((gamma1xl >>> 6) | (gamma1xh << 26));
+
+ // W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16]
+ var Wi7 = W[i - 7];
+ var Wi7h = Wi7.high;
+ var Wi7l = Wi7.low;
+
+ var Wi16 = W[i - 16];
+ var Wi16h = Wi16.high;
+ var Wi16l = Wi16.low;
+
+ var Wil = gamma0l + Wi7l;
+ var Wih = gamma0h + Wi7h + ((Wil >>> 0) < (gamma0l >>> 0) ? 1 : 0);
+ var Wil = Wil + gamma1l;
+ var Wih = Wih + gamma1h + ((Wil >>> 0) < (gamma1l >>> 0) ? 1 : 0);
+ var Wil = Wil + Wi16l;
+ var Wih = Wih + Wi16h + ((Wil >>> 0) < (Wi16l >>> 0) ? 1 : 0);
+
+ Wi.high = Wih;
+ Wi.low = Wil;
+ }
+
+ var chh = (eh & fh) ^ (~eh & gh);
+ var chl = (el & fl) ^ (~el & gl);
+ var majh = (ah & bh) ^ (ah & ch) ^ (bh & ch);
+ var majl = (al & bl) ^ (al & cl) ^ (bl & cl);
+
+ var sigma0h = ((ah >>> 28) | (al << 4)) ^ ((ah << 30) | (al >>> 2)) ^ ((ah << 25) | (al >>> 7));
+ var sigma0l = ((al >>> 28) | (ah << 4)) ^ ((al << 30) | (ah >>> 2)) ^ ((al << 25) | (ah >>> 7));
+ var sigma1h = ((eh >>> 14) | (el << 18)) ^ ((eh >>> 18) | (el << 14)) ^ ((eh << 23) | (el >>> 9));
+ var sigma1l = ((el >>> 14) | (eh << 18)) ^ ((el >>> 18) | (eh << 14)) ^ ((el << 23) | (eh >>> 9));
+
+ // t1 = h + sigma1 + ch + K[i] + W[i]
+ var Ki = K[i];
+ var Kih = Ki.high;
+ var Kil = Ki.low;
+
+ var t1l = hl + sigma1l;
+ var t1h = hh + sigma1h + ((t1l >>> 0) < (hl >>> 0) ? 1 : 0);
+ var t1l = t1l + chl;
+ var t1h = t1h + chh + ((t1l >>> 0) < (chl >>> 0) ? 1 : 0);
+ var t1l = t1l + Kil;
+ var t1h = t1h + Kih + ((t1l >>> 0) < (Kil >>> 0) ? 1 : 0);
+ var t1l = t1l + Wil;
+ var t1h = t1h + Wih + ((t1l >>> 0) < (Wil >>> 0) ? 1 : 0);
+
+ // t2 = sigma0 + maj
+ var t2l = sigma0l + majl;
+ var t2h = sigma0h + majh + ((t2l >>> 0) < (sigma0l >>> 0) ? 1 : 0);
+
+ // Update working variables
+ hh = gh;
+ hl = gl;
+ gh = fh;
+ gl = fl;
+ fh = eh;
+ fl = el;
+ el = (dl + t1l) | 0;
+ eh = (dh + t1h + ((el >>> 0) < (dl >>> 0) ? 1 : 0)) | 0;
+ dh = ch;
+ dl = cl;
+ ch = bh;
+ cl = bl;
+ bh = ah;
+ bl = al;
+ al = (t1l + t2l) | 0;
+ ah = (t1h + t2h + ((al >>> 0) < (t1l >>> 0) ? 1 : 0)) | 0;
+ }
+
+ // Intermediate hash value
+ H0l = H0.low = (H0l + al);
+ H0.high = (H0h + ah + ((H0l >>> 0) < (al >>> 0) ? 1 : 0));
+ H1l = H1.low = (H1l + bl);
+ H1.high = (H1h + bh + ((H1l >>> 0) < (bl >>> 0) ? 1 : 0));
+ H2l = H2.low = (H2l + cl);
+ H2.high = (H2h + ch + ((H2l >>> 0) < (cl >>> 0) ? 1 : 0));
+ H3l = H3.low = (H3l + dl);
+ H3.high = (H3h + dh + ((H3l >>> 0) < (dl >>> 0) ? 1 : 0));
+ H4l = H4.low = (H4l + el);
+ H4.high = (H4h + eh + ((H4l >>> 0) < (el >>> 0) ? 1 : 0));
+ H5l = H5.low = (H5l + fl);
+ H5.high = (H5h + fh + ((H5l >>> 0) < (fl >>> 0) ? 1 : 0));
+ H6l = H6.low = (H6l + gl);
+ H6.high = (H6h + gh + ((H6l >>> 0) < (gl >>> 0) ? 1 : 0));
+ H7l = H7.low = (H7l + hl);
+ H7.high = (H7h + hh + ((H7l >>> 0) < (hl >>> 0) ? 1 : 0));
+ },
+
+ _doFinalize: function () {
+ // Shortcuts
+ var data = this._data;
+ var dataWords = data.words;
+
+ var nBitsTotal = this._nDataBytes * 8;
+ var nBitsLeft = data.sigBytes * 8;
+
+ // Add padding
+ dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);
+ dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 30] = Math.floor(nBitsTotal / 0x100000000);
+ dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 31] = nBitsTotal;
+ data.sigBytes = dataWords.length * 4;
+
+ // Hash final blocks
+ this._process();
+
+ // Convert hash to 32-bit word array before returning
+ var hash = this._hash.toX32();
+
+ // Return final computed hash
+ return hash;
+ },
+
+ clone: function () {
+ var clone = Hasher.clone.call(this);
+ clone._hash = this._hash.clone();
+
+ return clone;
+ },
+
+ blockSize: 1024/32
+ });
+
+ /**
+ * Shortcut function to the hasher's object interface.
+ *
+ * @param {WordArray|string} message The message to hash.
+ *
+ * @return {WordArray} The hash.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var hash = CryptoJS.SHA512('message');
+ * var hash = CryptoJS.SHA512(wordArray);
+ */
+ C.SHA512 = Hasher._createHelper(SHA512);
+
+ /**
+ * Shortcut function to the HMAC's object interface.
+ *
+ * @param {WordArray|string} message The message to hash.
+ * @param {WordArray|string} key The secret key.
+ *
+ * @return {WordArray} The HMAC.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var hmac = CryptoJS.HmacSHA512(message, key);
+ */
+ C.HmacSHA512 = Hasher._createHmacHelper(SHA512);
+}());
diff --git a/library/cryptojs/components/tripledes-min.js b/library/cryptojs/components/tripledes-min.js
new file mode 100644
index 000000000..a669dd326
--- /dev/null
+++ b/library/cryptojs/components/tripledes-min.js
@@ -0,0 +1,26 @@
+/*
+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
+*/
+(function(){function j(b,c){var a=(this._lBlock>>>b^this._rBlock)&c;this._rBlock^=a;this._lBlock^=a<<b}function l(b,c){var a=(this._rBlock>>>b^this._lBlock)&c;this._lBlock^=a;this._rBlock^=a<<b}var h=CryptoJS,e=h.lib,n=e.WordArray,e=e.BlockCipher,g=h.algo,q=[57,49,41,33,25,17,9,1,58,50,42,34,26,18,10,2,59,51,43,35,27,19,11,3,60,52,44,36,63,55,47,39,31,23,15,7,62,54,46,38,30,22,14,6,61,53,45,37,29,21,13,5,28,20,12,4],p=[14,17,11,24,1,5,3,28,15,6,21,10,23,19,12,4,26,8,16,7,27,20,13,2,41,52,31,37,47,
+55,30,40,51,45,33,48,44,49,39,56,34,53,46,42,50,36,29,32],r=[1,2,4,6,8,10,12,14,15,17,19,21,23,25,27,28],s=[{"0":8421888,268435456:32768,536870912:8421378,805306368:2,1073741824:512,1342177280:8421890,1610612736:8389122,1879048192:8388608,2147483648:514,2415919104:8389120,2684354560:33280,2952790016:8421376,3221225472:32770,3489660928:8388610,3758096384:0,4026531840:33282,134217728:0,402653184:8421890,671088640:33282,939524096:32768,1207959552:8421888,1476395008:512,1744830464:8421378,2013265920:2,
+2281701376:8389120,2550136832:33280,2818572288:8421376,3087007744:8389122,3355443200:8388610,3623878656:32770,3892314112:514,4160749568:8388608,1:32768,268435457:2,536870913:8421888,805306369:8388608,1073741825:8421378,1342177281:33280,1610612737:512,1879048193:8389122,2147483649:8421890,2415919105:8421376,2684354561:8388610,2952790017:33282,3221225473:514,3489660929:8389120,3758096385:32770,4026531841:0,134217729:8421890,402653185:8421376,671088641:8388608,939524097:512,1207959553:32768,1476395009:8388610,
+1744830465:2,2013265921:33282,2281701377:32770,2550136833:8389122,2818572289:514,3087007745:8421888,3355443201:8389120,3623878657:0,3892314113:33280,4160749569:8421378},{"0":1074282512,16777216:16384,33554432:524288,50331648:1074266128,67108864:1073741840,83886080:1074282496,100663296:1073758208,117440512:16,134217728:540672,150994944:1073758224,167772160:1073741824,184549376:540688,201326592:524304,218103808:0,234881024:16400,251658240:1074266112,8388608:1073758208,25165824:540688,41943040:16,58720256:1073758224,
+75497472:1074282512,92274688:1073741824,109051904:524288,125829120:1074266128,142606336:524304,159383552:0,176160768:16384,192937984:1074266112,209715200:1073741840,226492416:540672,243269632:1074282496,260046848:16400,268435456:0,285212672:1074266128,301989888:1073758224,318767104:1074282496,335544320:1074266112,352321536:16,369098752:540688,385875968:16384,402653184:16400,419430400:524288,436207616:524304,452984832:1073741840,469762048:540672,486539264:1073758208,503316480:1073741824,520093696:1074282512,
+276824064:540688,293601280:524288,310378496:1074266112,327155712:16384,343932928:1073758208,360710144:1074282512,377487360:16,394264576:1073741824,411041792:1074282496,427819008:1073741840,444596224:1073758224,461373440:524304,478150656:0,494927872:16400,511705088:1074266128,528482304:540672},{"0":260,1048576:0,2097152:67109120,3145728:65796,4194304:65540,5242880:67108868,6291456:67174660,7340032:67174400,8388608:67108864,9437184:67174656,10485760:65792,11534336:67174404,12582912:67109124,13631488:65536,
+14680064:4,15728640:256,524288:67174656,1572864:67174404,2621440:0,3670016:67109120,4718592:67108868,5767168:65536,6815744:65540,7864320:260,8912896:4,9961472:256,11010048:67174400,12058624:65796,13107200:65792,14155776:67109124,15204352:67174660,16252928:67108864,16777216:67174656,17825792:65540,18874368:65536,19922944:67109120,20971520:256,22020096:67174660,23068672:67108868,24117248:0,25165824:67109124,26214400:67108864,27262976:4,28311552:65792,29360128:67174400,30408704:260,31457280:65796,32505856:67174404,
+17301504:67108864,18350080:260,19398656:67174656,20447232:0,21495808:65540,22544384:67109120,23592960:256,24641536:67174404,25690112:65536,26738688:67174660,27787264:65796,28835840:67108868,29884416:67109124,30932992:67174400,31981568:4,33030144:65792},{"0":2151682048,65536:2147487808,131072:4198464,196608:2151677952,262144:0,327680:4198400,393216:2147483712,458752:4194368,524288:2147483648,589824:4194304,655360:64,720896:2147487744,786432:2151678016,851968:4160,917504:4096,983040:2151682112,32768:2147487808,
+98304:64,163840:2151678016,229376:2147487744,294912:4198400,360448:2151682112,425984:0,491520:2151677952,557056:4096,622592:2151682048,688128:4194304,753664:4160,819200:2147483648,884736:4194368,950272:4198464,1015808:2147483712,1048576:4194368,1114112:4198400,1179648:2147483712,1245184:0,1310720:4160,1376256:2151678016,1441792:2151682048,1507328:2147487808,1572864:2151682112,1638400:2147483648,1703936:2151677952,1769472:4198464,1835008:2147487744,1900544:4194304,1966080:64,2031616:4096,1081344:2151677952,
+1146880:2151682112,1212416:0,1277952:4198400,1343488:4194368,1409024:2147483648,1474560:2147487808,1540096:64,1605632:2147483712,1671168:4096,1736704:2147487744,1802240:2151678016,1867776:4160,1933312:2151682048,1998848:4194304,2064384:4198464},{"0":128,4096:17039360,8192:262144,12288:536870912,16384:537133184,20480:16777344,24576:553648256,28672:262272,32768:16777216,36864:537133056,40960:536871040,45056:553910400,49152:553910272,53248:0,57344:17039488,61440:553648128,2048:17039488,6144:553648256,
+10240:128,14336:17039360,18432:262144,22528:537133184,26624:553910272,30720:536870912,34816:537133056,38912:0,43008:553910400,47104:16777344,51200:536871040,55296:553648128,59392:16777216,63488:262272,65536:262144,69632:128,73728:536870912,77824:553648256,81920:16777344,86016:553910272,90112:537133184,94208:16777216,98304:553910400,102400:553648128,106496:17039360,110592:537133056,114688:262272,118784:536871040,122880:0,126976:17039488,67584:553648256,71680:16777216,75776:17039360,79872:537133184,
+83968:536870912,88064:17039488,92160:128,96256:553910272,100352:262272,104448:553910400,108544:0,112640:553648128,116736:16777344,120832:262144,124928:537133056,129024:536871040},{"0":268435464,256:8192,512:270532608,768:270540808,1024:268443648,1280:2097152,1536:2097160,1792:268435456,2048:0,2304:268443656,2560:2105344,2816:8,3072:270532616,3328:2105352,3584:8200,3840:270540800,128:270532608,384:270540808,640:8,896:2097152,1152:2105352,1408:268435464,1664:268443648,1920:8200,2176:2097160,2432:8192,
+2688:268443656,2944:270532616,3200:0,3456:270540800,3712:2105344,3968:268435456,4096:268443648,4352:270532616,4608:270540808,4864:8200,5120:2097152,5376:268435456,5632:268435464,5888:2105344,6144:2105352,6400:0,6656:8,6912:270532608,7168:8192,7424:268443656,7680:270540800,7936:2097160,4224:8,4480:2105344,4736:2097152,4992:268435464,5248:268443648,5504:8200,5760:270540808,6016:270532608,6272:270540800,6528:270532616,6784:8192,7040:2105352,7296:2097160,7552:0,7808:268435456,8064:268443656},{"0":1048576,
+16:33555457,32:1024,48:1049601,64:34604033,80:0,96:1,112:34603009,128:33555456,144:1048577,160:33554433,176:34604032,192:34603008,208:1025,224:1049600,240:33554432,8:34603009,24:0,40:33555457,56:34604032,72:1048576,88:33554433,104:33554432,120:1025,136:1049601,152:33555456,168:34603008,184:1048577,200:1024,216:34604033,232:1,248:1049600,256:33554432,272:1048576,288:33555457,304:34603009,320:1048577,336:33555456,352:34604032,368:1049601,384:1025,400:34604033,416:1049600,432:1,448:0,464:34603008,480:33554433,
+496:1024,264:1049600,280:33555457,296:34603009,312:1,328:33554432,344:1048576,360:1025,376:34604032,392:33554433,408:34603008,424:0,440:34604033,456:1049601,472:1024,488:33555456,504:1048577},{"0":134219808,1:131072,2:134217728,3:32,4:131104,5:134350880,6:134350848,7:2048,8:134348800,9:134219776,10:133120,11:134348832,12:2080,13:0,14:134217760,15:133152,2147483648:2048,2147483649:134350880,2147483650:134219808,2147483651:134217728,2147483652:134348800,2147483653:133120,2147483654:133152,2147483655:32,
+2147483656:134217760,2147483657:2080,2147483658:131104,2147483659:134350848,2147483660:0,2147483661:134348832,2147483662:134219776,2147483663:131072,16:133152,17:134350848,18:32,19:2048,20:134219776,21:134217760,22:134348832,23:131072,24:0,25:131104,26:134348800,27:134219808,28:134350880,29:133120,30:2080,31:134217728,2147483664:131072,2147483665:2048,2147483666:134348832,2147483667:133152,2147483668:32,2147483669:134348800,2147483670:134217728,2147483671:134219808,2147483672:134350880,2147483673:134217760,
+2147483674:134219776,2147483675:0,2147483676:133120,2147483677:2080,2147483678:131104,2147483679:134350848}],t=[4160749569,528482304,33030144,2064384,129024,8064,504,2147483679],m=g.DES=e.extend({_doReset:function(){for(var b=this._key.words,c=[],a=0;56>a;a++){var f=q[a]-1;c[a]=b[f>>>5]>>>31-f%32&1}b=this._subKeys=[];for(f=0;16>f;f++){for(var d=b[f]=[],e=r[f],a=0;24>a;a++)d[a/6|0]|=c[(p[a]-1+e)%28]<<31-a%6,d[4+(a/6|0)]|=c[28+(p[a+24]-1+e)%28]<<31-a%6;d[0]=d[0]<<1|d[0]>>>31;for(a=1;7>a;a++)d[a]>>>=
+4*(a-1)+3;d[7]=d[7]<<5|d[7]>>>27}c=this._invSubKeys=[];for(a=0;16>a;a++)c[a]=b[15-a]},encryptBlock:function(b,c){this._doCryptBlock(b,c,this._subKeys)},decryptBlock:function(b,c){this._doCryptBlock(b,c,this._invSubKeys)},_doCryptBlock:function(b,c,a){this._lBlock=b[c];this._rBlock=b[c+1];j.call(this,4,252645135);j.call(this,16,65535);l.call(this,2,858993459);l.call(this,8,16711935);j.call(this,1,1431655765);for(var f=0;16>f;f++){for(var d=a[f],e=this._lBlock,h=this._rBlock,g=0,k=0;8>k;k++)g|=s[k][((h^
+d[k])&t[k])>>>0];this._lBlock=h;this._rBlock=e^g}a=this._lBlock;this._lBlock=this._rBlock;this._rBlock=a;j.call(this,1,1431655765);l.call(this,8,16711935);l.call(this,2,858993459);j.call(this,16,65535);j.call(this,4,252645135);b[c]=this._lBlock;b[c+1]=this._rBlock},keySize:2,ivSize:2,blockSize:2});h.DES=e._createHelper(m);g=g.TripleDES=e.extend({_doReset:function(){var b=this._key.words;this._des1=m.createEncryptor(n.create(b.slice(0,2)));this._des2=m.createEncryptor(n.create(b.slice(2,4)));this._des3=
+m.createEncryptor(n.create(b.slice(4,6)))},encryptBlock:function(b,c){this._des1.encryptBlock(b,c);this._des2.decryptBlock(b,c);this._des3.encryptBlock(b,c)},decryptBlock:function(b,c){this._des3.decryptBlock(b,c);this._des2.encryptBlock(b,c);this._des1.decryptBlock(b,c)},keySize:6,ivSize:2,blockSize:2});h.TripleDES=e._createHelper(g)})();
diff --git a/library/cryptojs/components/tripledes.js b/library/cryptojs/components/tripledes.js
new file mode 100644
index 000000000..f52377294
--- /dev/null
+++ b/library/cryptojs/components/tripledes.js
@@ -0,0 +1,756 @@
+/*
+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
+*/
+(function () {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var WordArray = C_lib.WordArray;
+ var BlockCipher = C_lib.BlockCipher;
+ var C_algo = C.algo;
+
+ // Permuted Choice 1 constants
+ var PC1 = [
+ 57, 49, 41, 33, 25, 17, 9, 1,
+ 58, 50, 42, 34, 26, 18, 10, 2,
+ 59, 51, 43, 35, 27, 19, 11, 3,
+ 60, 52, 44, 36, 63, 55, 47, 39,
+ 31, 23, 15, 7, 62, 54, 46, 38,
+ 30, 22, 14, 6, 61, 53, 45, 37,
+ 29, 21, 13, 5, 28, 20, 12, 4
+ ];
+
+ // Permuted Choice 2 constants
+ var PC2 = [
+ 14, 17, 11, 24, 1, 5,
+ 3, 28, 15, 6, 21, 10,
+ 23, 19, 12, 4, 26, 8,
+ 16, 7, 27, 20, 13, 2,
+ 41, 52, 31, 37, 47, 55,
+ 30, 40, 51, 45, 33, 48,
+ 44, 49, 39, 56, 34, 53,
+ 46, 42, 50, 36, 29, 32
+ ];
+
+ // Cumulative bit shift constants
+ var BIT_SHIFTS = [1, 2, 4, 6, 8, 10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28];
+
+ // SBOXes and round permutation constants
+ var SBOX_P = [
+ {
+ 0x0: 0x808200,
+ 0x10000000: 0x8000,
+ 0x20000000: 0x808002,
+ 0x30000000: 0x2,
+ 0x40000000: 0x200,
+ 0x50000000: 0x808202,
+ 0x60000000: 0x800202,
+ 0x70000000: 0x800000,
+ 0x80000000: 0x202,
+ 0x90000000: 0x800200,
+ 0xa0000000: 0x8200,
+ 0xb0000000: 0x808000,
+ 0xc0000000: 0x8002,
+ 0xd0000000: 0x800002,
+ 0xe0000000: 0x0,
+ 0xf0000000: 0x8202,
+ 0x8000000: 0x0,
+ 0x18000000: 0x808202,
+ 0x28000000: 0x8202,
+ 0x38000000: 0x8000,
+ 0x48000000: 0x808200,
+ 0x58000000: 0x200,
+ 0x68000000: 0x808002,
+ 0x78000000: 0x2,
+ 0x88000000: 0x800200,
+ 0x98000000: 0x8200,
+ 0xa8000000: 0x808000,
+ 0xb8000000: 0x800202,
+ 0xc8000000: 0x800002,
+ 0xd8000000: 0x8002,
+ 0xe8000000: 0x202,
+ 0xf8000000: 0x800000,
+ 0x1: 0x8000,
+ 0x10000001: 0x2,
+ 0x20000001: 0x808200,
+ 0x30000001: 0x800000,
+ 0x40000001: 0x808002,
+ 0x50000001: 0x8200,
+ 0x60000001: 0x200,
+ 0x70000001: 0x800202,
+ 0x80000001: 0x808202,
+ 0x90000001: 0x808000,
+ 0xa0000001: 0x800002,
+ 0xb0000001: 0x8202,
+ 0xc0000001: 0x202,
+ 0xd0000001: 0x800200,
+ 0xe0000001: 0x8002,
+ 0xf0000001: 0x0,
+ 0x8000001: 0x808202,
+ 0x18000001: 0x808000,
+ 0x28000001: 0x800000,
+ 0x38000001: 0x200,
+ 0x48000001: 0x8000,
+ 0x58000001: 0x800002,
+ 0x68000001: 0x2,
+ 0x78000001: 0x8202,
+ 0x88000001: 0x8002,
+ 0x98000001: 0x800202,
+ 0xa8000001: 0x202,
+ 0xb8000001: 0x808200,
+ 0xc8000001: 0x800200,
+ 0xd8000001: 0x0,
+ 0xe8000001: 0x8200,
+ 0xf8000001: 0x808002
+ },
+ {
+ 0x0: 0x40084010,
+ 0x1000000: 0x4000,
+ 0x2000000: 0x80000,
+ 0x3000000: 0x40080010,
+ 0x4000000: 0x40000010,
+ 0x5000000: 0x40084000,
+ 0x6000000: 0x40004000,
+ 0x7000000: 0x10,
+ 0x8000000: 0x84000,
+ 0x9000000: 0x40004010,
+ 0xa000000: 0x40000000,
+ 0xb000000: 0x84010,
+ 0xc000000: 0x80010,
+ 0xd000000: 0x0,
+ 0xe000000: 0x4010,
+ 0xf000000: 0x40080000,
+ 0x800000: 0x40004000,
+ 0x1800000: 0x84010,
+ 0x2800000: 0x10,
+ 0x3800000: 0x40004010,
+ 0x4800000: 0x40084010,
+ 0x5800000: 0x40000000,
+ 0x6800000: 0x80000,
+ 0x7800000: 0x40080010,
+ 0x8800000: 0x80010,
+ 0x9800000: 0x0,
+ 0xa800000: 0x4000,
+ 0xb800000: 0x40080000,
+ 0xc800000: 0x40000010,
+ 0xd800000: 0x84000,
+ 0xe800000: 0x40084000,
+ 0xf800000: 0x4010,
+ 0x10000000: 0x0,
+ 0x11000000: 0x40080010,
+ 0x12000000: 0x40004010,
+ 0x13000000: 0x40084000,
+ 0x14000000: 0x40080000,
+ 0x15000000: 0x10,
+ 0x16000000: 0x84010,
+ 0x17000000: 0x4000,
+ 0x18000000: 0x4010,
+ 0x19000000: 0x80000,
+ 0x1a000000: 0x80010,
+ 0x1b000000: 0x40000010,
+ 0x1c000000: 0x84000,
+ 0x1d000000: 0x40004000,
+ 0x1e000000: 0x40000000,
+ 0x1f000000: 0x40084010,
+ 0x10800000: 0x84010,
+ 0x11800000: 0x80000,
+ 0x12800000: 0x40080000,
+ 0x13800000: 0x4000,
+ 0x14800000: 0x40004000,
+ 0x15800000: 0x40084010,
+ 0x16800000: 0x10,
+ 0x17800000: 0x40000000,
+ 0x18800000: 0x40084000,
+ 0x19800000: 0x40000010,
+ 0x1a800000: 0x40004010,
+ 0x1b800000: 0x80010,
+ 0x1c800000: 0x0,
+ 0x1d800000: 0x4010,
+ 0x1e800000: 0x40080010,
+ 0x1f800000: 0x84000
+ },
+ {
+ 0x0: 0x104,
+ 0x100000: 0x0,
+ 0x200000: 0x4000100,
+ 0x300000: 0x10104,
+ 0x400000: 0x10004,
+ 0x500000: 0x4000004,
+ 0x600000: 0x4010104,
+ 0x700000: 0x4010000,
+ 0x800000: 0x4000000,
+ 0x900000: 0x4010100,
+ 0xa00000: 0x10100,
+ 0xb00000: 0x4010004,
+ 0xc00000: 0x4000104,
+ 0xd00000: 0x10000,
+ 0xe00000: 0x4,
+ 0xf00000: 0x100,
+ 0x80000: 0x4010100,
+ 0x180000: 0x4010004,
+ 0x280000: 0x0,
+ 0x380000: 0x4000100,
+ 0x480000: 0x4000004,
+ 0x580000: 0x10000,
+ 0x680000: 0x10004,
+ 0x780000: 0x104,
+ 0x880000: 0x4,
+ 0x980000: 0x100,
+ 0xa80000: 0x4010000,
+ 0xb80000: 0x10104,
+ 0xc80000: 0x10100,
+ 0xd80000: 0x4000104,
+ 0xe80000: 0x4010104,
+ 0xf80000: 0x4000000,
+ 0x1000000: 0x4010100,
+ 0x1100000: 0x10004,
+ 0x1200000: 0x10000,
+ 0x1300000: 0x4000100,
+ 0x1400000: 0x100,
+ 0x1500000: 0x4010104,
+ 0x1600000: 0x4000004,
+ 0x1700000: 0x0,
+ 0x1800000: 0x4000104,
+ 0x1900000: 0x4000000,
+ 0x1a00000: 0x4,
+ 0x1b00000: 0x10100,
+ 0x1c00000: 0x4010000,
+ 0x1d00000: 0x104,
+ 0x1e00000: 0x10104,
+ 0x1f00000: 0x4010004,
+ 0x1080000: 0x4000000,
+ 0x1180000: 0x104,
+ 0x1280000: 0x4010100,
+ 0x1380000: 0x0,
+ 0x1480000: 0x10004,
+ 0x1580000: 0x4000100,
+ 0x1680000: 0x100,
+ 0x1780000: 0x4010004,
+ 0x1880000: 0x10000,
+ 0x1980000: 0x4010104,
+ 0x1a80000: 0x10104,
+ 0x1b80000: 0x4000004,
+ 0x1c80000: 0x4000104,
+ 0x1d80000: 0x4010000,
+ 0x1e80000: 0x4,
+ 0x1f80000: 0x10100
+ },
+ {
+ 0x0: 0x80401000,
+ 0x10000: 0x80001040,
+ 0x20000: 0x401040,
+ 0x30000: 0x80400000,
+ 0x40000: 0x0,
+ 0x50000: 0x401000,
+ 0x60000: 0x80000040,
+ 0x70000: 0x400040,
+ 0x80000: 0x80000000,
+ 0x90000: 0x400000,
+ 0xa0000: 0x40,
+ 0xb0000: 0x80001000,
+ 0xc0000: 0x80400040,
+ 0xd0000: 0x1040,
+ 0xe0000: 0x1000,
+ 0xf0000: 0x80401040,
+ 0x8000: 0x80001040,
+ 0x18000: 0x40,
+ 0x28000: 0x80400040,
+ 0x38000: 0x80001000,
+ 0x48000: 0x401000,
+ 0x58000: 0x80401040,
+ 0x68000: 0x0,
+ 0x78000: 0x80400000,
+ 0x88000: 0x1000,
+ 0x98000: 0x80401000,
+ 0xa8000: 0x400000,
+ 0xb8000: 0x1040,
+ 0xc8000: 0x80000000,
+ 0xd8000: 0x400040,
+ 0xe8000: 0x401040,
+ 0xf8000: 0x80000040,
+ 0x100000: 0x400040,
+ 0x110000: 0x401000,
+ 0x120000: 0x80000040,
+ 0x130000: 0x0,
+ 0x140000: 0x1040,
+ 0x150000: 0x80400040,
+ 0x160000: 0x80401000,
+ 0x170000: 0x80001040,
+ 0x180000: 0x80401040,
+ 0x190000: 0x80000000,
+ 0x1a0000: 0x80400000,
+ 0x1b0000: 0x401040,
+ 0x1c0000: 0x80001000,
+ 0x1d0000: 0x400000,
+ 0x1e0000: 0x40,
+ 0x1f0000: 0x1000,
+ 0x108000: 0x80400000,
+ 0x118000: 0x80401040,
+ 0x128000: 0x0,
+ 0x138000: 0x401000,
+ 0x148000: 0x400040,
+ 0x158000: 0x80000000,
+ 0x168000: 0x80001040,
+ 0x178000: 0x40,
+ 0x188000: 0x80000040,
+ 0x198000: 0x1000,
+ 0x1a8000: 0x80001000,
+ 0x1b8000: 0x80400040,
+ 0x1c8000: 0x1040,
+ 0x1d8000: 0x80401000,
+ 0x1e8000: 0x400000,
+ 0x1f8000: 0x401040
+ },
+ {
+ 0x0: 0x80,
+ 0x1000: 0x1040000,
+ 0x2000: 0x40000,
+ 0x3000: 0x20000000,
+ 0x4000: 0x20040080,
+ 0x5000: 0x1000080,
+ 0x6000: 0x21000080,
+ 0x7000: 0x40080,
+ 0x8000: 0x1000000,
+ 0x9000: 0x20040000,
+ 0xa000: 0x20000080,
+ 0xb000: 0x21040080,
+ 0xc000: 0x21040000,
+ 0xd000: 0x0,
+ 0xe000: 0x1040080,
+ 0xf000: 0x21000000,
+ 0x800: 0x1040080,
+ 0x1800: 0x21000080,
+ 0x2800: 0x80,
+ 0x3800: 0x1040000,
+ 0x4800: 0x40000,
+ 0x5800: 0x20040080,
+ 0x6800: 0x21040000,
+ 0x7800: 0x20000000,
+ 0x8800: 0x20040000,
+ 0x9800: 0x0,
+ 0xa800: 0x21040080,
+ 0xb800: 0x1000080,
+ 0xc800: 0x20000080,
+ 0xd800: 0x21000000,
+ 0xe800: 0x1000000,
+ 0xf800: 0x40080,
+ 0x10000: 0x40000,
+ 0x11000: 0x80,
+ 0x12000: 0x20000000,
+ 0x13000: 0x21000080,
+ 0x14000: 0x1000080,
+ 0x15000: 0x21040000,
+ 0x16000: 0x20040080,
+ 0x17000: 0x1000000,
+ 0x18000: 0x21040080,
+ 0x19000: 0x21000000,
+ 0x1a000: 0x1040000,
+ 0x1b000: 0x20040000,
+ 0x1c000: 0x40080,
+ 0x1d000: 0x20000080,
+ 0x1e000: 0x0,
+ 0x1f000: 0x1040080,
+ 0x10800: 0x21000080,
+ 0x11800: 0x1000000,
+ 0x12800: 0x1040000,
+ 0x13800: 0x20040080,
+ 0x14800: 0x20000000,
+ 0x15800: 0x1040080,
+ 0x16800: 0x80,
+ 0x17800: 0x21040000,
+ 0x18800: 0x40080,
+ 0x19800: 0x21040080,
+ 0x1a800: 0x0,
+ 0x1b800: 0x21000000,
+ 0x1c800: 0x1000080,
+ 0x1d800: 0x40000,
+ 0x1e800: 0x20040000,
+ 0x1f800: 0x20000080
+ },
+ {
+ 0x0: 0x10000008,
+ 0x100: 0x2000,
+ 0x200: 0x10200000,
+ 0x300: 0x10202008,
+ 0x400: 0x10002000,
+ 0x500: 0x200000,
+ 0x600: 0x200008,
+ 0x700: 0x10000000,
+ 0x800: 0x0,
+ 0x900: 0x10002008,
+ 0xa00: 0x202000,
+ 0xb00: 0x8,
+ 0xc00: 0x10200008,
+ 0xd00: 0x202008,
+ 0xe00: 0x2008,
+ 0xf00: 0x10202000,
+ 0x80: 0x10200000,
+ 0x180: 0x10202008,
+ 0x280: 0x8,
+ 0x380: 0x200000,
+ 0x480: 0x202008,
+ 0x580: 0x10000008,
+ 0x680: 0x10002000,
+ 0x780: 0x2008,
+ 0x880: 0x200008,
+ 0x980: 0x2000,
+ 0xa80: 0x10002008,
+ 0xb80: 0x10200008,
+ 0xc80: 0x0,
+ 0xd80: 0x10202000,
+ 0xe80: 0x202000,
+ 0xf80: 0x10000000,
+ 0x1000: 0x10002000,
+ 0x1100: 0x10200008,
+ 0x1200: 0x10202008,
+ 0x1300: 0x2008,
+ 0x1400: 0x200000,
+ 0x1500: 0x10000000,
+ 0x1600: 0x10000008,
+ 0x1700: 0x202000,
+ 0x1800: 0x202008,
+ 0x1900: 0x0,
+ 0x1a00: 0x8,
+ 0x1b00: 0x10200000,
+ 0x1c00: 0x2000,
+ 0x1d00: 0x10002008,
+ 0x1e00: 0x10202000,
+ 0x1f00: 0x200008,
+ 0x1080: 0x8,
+ 0x1180: 0x202000,
+ 0x1280: 0x200000,
+ 0x1380: 0x10000008,
+ 0x1480: 0x10002000,
+ 0x1580: 0x2008,
+ 0x1680: 0x10202008,
+ 0x1780: 0x10200000,
+ 0x1880: 0x10202000,
+ 0x1980: 0x10200008,
+ 0x1a80: 0x2000,
+ 0x1b80: 0x202008,
+ 0x1c80: 0x200008,
+ 0x1d80: 0x0,
+ 0x1e80: 0x10000000,
+ 0x1f80: 0x10002008
+ },
+ {
+ 0x0: 0x100000,
+ 0x10: 0x2000401,
+ 0x20: 0x400,
+ 0x30: 0x100401,
+ 0x40: 0x2100401,
+ 0x50: 0x0,
+ 0x60: 0x1,
+ 0x70: 0x2100001,
+ 0x80: 0x2000400,
+ 0x90: 0x100001,
+ 0xa0: 0x2000001,
+ 0xb0: 0x2100400,
+ 0xc0: 0x2100000,
+ 0xd0: 0x401,
+ 0xe0: 0x100400,
+ 0xf0: 0x2000000,
+ 0x8: 0x2100001,
+ 0x18: 0x0,
+ 0x28: 0x2000401,
+ 0x38: 0x2100400,
+ 0x48: 0x100000,
+ 0x58: 0x2000001,
+ 0x68: 0x2000000,
+ 0x78: 0x401,
+ 0x88: 0x100401,
+ 0x98: 0x2000400,
+ 0xa8: 0x2100000,
+ 0xb8: 0x100001,
+ 0xc8: 0x400,
+ 0xd8: 0x2100401,
+ 0xe8: 0x1,
+ 0xf8: 0x100400,
+ 0x100: 0x2000000,
+ 0x110: 0x100000,
+ 0x120: 0x2000401,
+ 0x130: 0x2100001,
+ 0x140: 0x100001,
+ 0x150: 0x2000400,
+ 0x160: 0x2100400,
+ 0x170: 0x100401,
+ 0x180: 0x401,
+ 0x190: 0x2100401,
+ 0x1a0: 0x100400,
+ 0x1b0: 0x1,
+ 0x1c0: 0x0,
+ 0x1d0: 0x2100000,
+ 0x1e0: 0x2000001,
+ 0x1f0: 0x400,
+ 0x108: 0x100400,
+ 0x118: 0x2000401,
+ 0x128: 0x2100001,
+ 0x138: 0x1,
+ 0x148: 0x2000000,
+ 0x158: 0x100000,
+ 0x168: 0x401,
+ 0x178: 0x2100400,
+ 0x188: 0x2000001,
+ 0x198: 0x2100000,
+ 0x1a8: 0x0,
+ 0x1b8: 0x2100401,
+ 0x1c8: 0x100401,
+ 0x1d8: 0x400,
+ 0x1e8: 0x2000400,
+ 0x1f8: 0x100001
+ },
+ {
+ 0x0: 0x8000820,
+ 0x1: 0x20000,
+ 0x2: 0x8000000,
+ 0x3: 0x20,
+ 0x4: 0x20020,
+ 0x5: 0x8020820,
+ 0x6: 0x8020800,
+ 0x7: 0x800,
+ 0x8: 0x8020000,
+ 0x9: 0x8000800,
+ 0xa: 0x20800,
+ 0xb: 0x8020020,
+ 0xc: 0x820,
+ 0xd: 0x0,
+ 0xe: 0x8000020,
+ 0xf: 0x20820,
+ 0x80000000: 0x800,
+ 0x80000001: 0x8020820,
+ 0x80000002: 0x8000820,
+ 0x80000003: 0x8000000,
+ 0x80000004: 0x8020000,
+ 0x80000005: 0x20800,
+ 0x80000006: 0x20820,
+ 0x80000007: 0x20,
+ 0x80000008: 0x8000020,
+ 0x80000009: 0x820,
+ 0x8000000a: 0x20020,
+ 0x8000000b: 0x8020800,
+ 0x8000000c: 0x0,
+ 0x8000000d: 0x8020020,
+ 0x8000000e: 0x8000800,
+ 0x8000000f: 0x20000,
+ 0x10: 0x20820,
+ 0x11: 0x8020800,
+ 0x12: 0x20,
+ 0x13: 0x800,
+ 0x14: 0x8000800,
+ 0x15: 0x8000020,
+ 0x16: 0x8020020,
+ 0x17: 0x20000,
+ 0x18: 0x0,
+ 0x19: 0x20020,
+ 0x1a: 0x8020000,
+ 0x1b: 0x8000820,
+ 0x1c: 0x8020820,
+ 0x1d: 0x20800,
+ 0x1e: 0x820,
+ 0x1f: 0x8000000,
+ 0x80000010: 0x20000,
+ 0x80000011: 0x800,
+ 0x80000012: 0x8020020,
+ 0x80000013: 0x20820,
+ 0x80000014: 0x20,
+ 0x80000015: 0x8020000,
+ 0x80000016: 0x8000000,
+ 0x80000017: 0x8000820,
+ 0x80000018: 0x8020820,
+ 0x80000019: 0x8000020,
+ 0x8000001a: 0x8000800,
+ 0x8000001b: 0x0,
+ 0x8000001c: 0x20800,
+ 0x8000001d: 0x820,
+ 0x8000001e: 0x20020,
+ 0x8000001f: 0x8020800
+ }
+ ];
+
+ // Masks that select the SBOX input
+ var SBOX_MASK = [
+ 0xf8000001, 0x1f800000, 0x01f80000, 0x001f8000,
+ 0x0001f800, 0x00001f80, 0x000001f8, 0x8000001f
+ ];
+
+ /**
+ * DES block cipher algorithm.
+ */
+ var DES = C_algo.DES = BlockCipher.extend({
+ _doReset: function () {
+ // Shortcuts
+ var key = this._key;
+ var keyWords = key.words;
+
+ // Select 56 bits according to PC1
+ var keyBits = [];
+ for (var i = 0; i < 56; i++) {
+ var keyBitPos = PC1[i] - 1;
+ keyBits[i] = (keyWords[keyBitPos >>> 5] >>> (31 - keyBitPos % 32)) & 1;
+ }
+
+ // Assemble 16 subkeys
+ var subKeys = this._subKeys = [];
+ for (var nSubKey = 0; nSubKey < 16; nSubKey++) {
+ // Create subkey
+ var subKey = subKeys[nSubKey] = [];
+
+ // Shortcut
+ var bitShift = BIT_SHIFTS[nSubKey];
+
+ // Select 48 bits according to PC2
+ for (var i = 0; i < 24; i++) {
+ // Select from the left 28 key bits
+ subKey[(i / 6) | 0] |= keyBits[((PC2[i] - 1) + bitShift) % 28] << (31 - i % 6);
+
+ // Select from the right 28 key bits
+ subKey[4 + ((i / 6) | 0)] |= keyBits[28 + (((PC2[i + 24] - 1) + bitShift) % 28)] << (31 - i % 6);
+ }
+
+ // Since each subkey is applied to an expanded 32-bit input,
+ // the subkey can be broken into 8 values scaled to 32-bits,
+ // which allows the key to be used without expansion
+ subKey[0] = (subKey[0] << 1) | (subKey[0] >>> 31);
+ for (var i = 1; i < 7; i++) {
+ subKey[i] = subKey[i] >>> ((i - 1) * 4 + 3);
+ }
+ subKey[7] = (subKey[7] << 5) | (subKey[7] >>> 27);
+ }
+
+ // Compute inverse subkeys
+ var invSubKeys = this._invSubKeys = [];
+ for (var i = 0; i < 16; i++) {
+ invSubKeys[i] = subKeys[15 - i];
+ }
+ },
+
+ encryptBlock: function (M, offset) {
+ this._doCryptBlock(M, offset, this._subKeys);
+ },
+
+ decryptBlock: function (M, offset) {
+ this._doCryptBlock(M, offset, this._invSubKeys);
+ },
+
+ _doCryptBlock: function (M, offset, subKeys) {
+ // Get input
+ this._lBlock = M[offset];
+ this._rBlock = M[offset + 1];
+
+ // Initial permutation
+ exchangeLR.call(this, 4, 0x0f0f0f0f);
+ exchangeLR.call(this, 16, 0x0000ffff);
+ exchangeRL.call(this, 2, 0x33333333);
+ exchangeRL.call(this, 8, 0x00ff00ff);
+ exchangeLR.call(this, 1, 0x55555555);
+
+ // Rounds
+ for (var round = 0; round < 16; round++) {
+ // Shortcuts
+ var subKey = subKeys[round];
+ var lBlock = this._lBlock;
+ var rBlock = this._rBlock;
+
+ // Feistel function
+ var f = 0;
+ for (var i = 0; i < 8; i++) {
+ f |= SBOX_P[i][((rBlock ^ subKey[i]) & SBOX_MASK[i]) >>> 0];
+ }
+ this._lBlock = rBlock;
+ this._rBlock = lBlock ^ f;
+ }
+
+ // Undo swap from last round
+ var t = this._lBlock;
+ this._lBlock = this._rBlock;
+ this._rBlock = t;
+
+ // Final permutation
+ exchangeLR.call(this, 1, 0x55555555);
+ exchangeRL.call(this, 8, 0x00ff00ff);
+ exchangeRL.call(this, 2, 0x33333333);
+ exchangeLR.call(this, 16, 0x0000ffff);
+ exchangeLR.call(this, 4, 0x0f0f0f0f);
+
+ // Set output
+ M[offset] = this._lBlock;
+ M[offset + 1] = this._rBlock;
+ },
+
+ keySize: 64/32,
+
+ ivSize: 64/32,
+
+ blockSize: 64/32
+ });
+
+ // Swap bits across the left and right words
+ function exchangeLR(offset, mask) {
+ var t = ((this._lBlock >>> offset) ^ this._rBlock) & mask;
+ this._rBlock ^= t;
+ this._lBlock ^= t << offset;
+ }
+
+ function exchangeRL(offset, mask) {
+ var t = ((this._rBlock >>> offset) ^ this._lBlock) & mask;
+ this._lBlock ^= t;
+ this._rBlock ^= t << offset;
+ }
+
+ /**
+ * Shortcut functions to the cipher's object interface.
+ *
+ * @example
+ *
+ * var ciphertext = CryptoJS.DES.encrypt(message, key, cfg);
+ * var plaintext = CryptoJS.DES.decrypt(ciphertext, key, cfg);
+ */
+ C.DES = BlockCipher._createHelper(DES);
+
+ /**
+ * Triple-DES block cipher algorithm.
+ */
+ var TripleDES = C_algo.TripleDES = BlockCipher.extend({
+ _doReset: function () {
+ // Shortcuts
+ var key = this._key;
+ var keyWords = key.words;
+
+ // Create DES instances
+ this._des1 = DES.createEncryptor(WordArray.create(keyWords.slice(0, 2)));
+ this._des2 = DES.createEncryptor(WordArray.create(keyWords.slice(2, 4)));
+ this._des3 = DES.createEncryptor(WordArray.create(keyWords.slice(4, 6)));
+ },
+
+ encryptBlock: function (M, offset) {
+ this._des1.encryptBlock(M, offset);
+ this._des2.decryptBlock(M, offset);
+ this._des3.encryptBlock(M, offset);
+ },
+
+ decryptBlock: function (M, offset) {
+ this._des3.decryptBlock(M, offset);
+ this._des2.encryptBlock(M, offset);
+ this._des1.decryptBlock(M, offset);
+ },
+
+ keySize: 192/32,
+
+ ivSize: 64/32,
+
+ blockSize: 64/32
+ });
+
+ /**
+ * Shortcut functions to the cipher's object interface.
+ *
+ * @example
+ *
+ * var ciphertext = CryptoJS.TripleDES.encrypt(message, key, cfg);
+ * var plaintext = CryptoJS.TripleDES.decrypt(ciphertext, key, cfg);
+ */
+ C.TripleDES = BlockCipher._createHelper(TripleDES);
+}());
diff --git a/library/cryptojs/components/x64-core-min.js b/library/cryptojs/components/x64-core-min.js
new file mode 100644
index 000000000..0566f06fd
--- /dev/null
+++ b/library/cryptojs/components/x64-core-min.js
@@ -0,0 +1,7 @@
+/*
+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
+*/
+(function(g){var a=CryptoJS,f=a.lib,e=f.Base,h=f.WordArray,a=a.x64={};a.Word=e.extend({init:function(b,c){this.high=b;this.low=c}});a.WordArray=e.extend({init:function(b,c){b=this.words=b||[];this.sigBytes=c!=g?c:8*b.length},toX32:function(){for(var b=this.words,c=b.length,a=[],d=0;d<c;d++){var e=b[d];a.push(e.high);a.push(e.low)}return h.create(a,this.sigBytes)},clone:function(){for(var b=e.clone.call(this),c=b.words=this.words.slice(0),a=c.length,d=0;d<a;d++)c[d]=c[d].clone();return b}})})();
diff --git a/library/cryptojs/components/x64-core.js b/library/cryptojs/components/x64-core.js
new file mode 100644
index 000000000..7a5be3315
--- /dev/null
+++ b/library/cryptojs/components/x64-core.js
@@ -0,0 +1,290 @@
+/*
+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
+*/
+(function (undefined) {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var Base = C_lib.Base;
+ var X32WordArray = C_lib.WordArray;
+
+ /**
+ * x64 namespace.
+ */
+ var C_x64 = C.x64 = {};
+
+ /**
+ * A 64-bit word.
+ */
+ var X64Word = C_x64.Word = Base.extend({
+ /**
+ * Initializes a newly created 64-bit word.
+ *
+ * @param {number} high The high 32 bits.
+ * @param {number} low The low 32 bits.
+ *
+ * @example
+ *
+ * var x64Word = CryptoJS.x64.Word.create(0x00010203, 0x04050607);
+ */
+ init: function (high, low) {
+ this.high = high;
+ this.low = low;
+ }
+
+ /**
+ * Bitwise NOTs this word.
+ *
+ * @return {X64Word} A new x64-Word object after negating.
+ *
+ * @example
+ *
+ * var negated = x64Word.not();
+ */
+ // not: function () {
+ // var high = ~this.high;
+ // var low = ~this.low;
+
+ // return X64Word.create(high, low);
+ // },
+
+ /**
+ * Bitwise ANDs this word with the passed word.
+ *
+ * @param {X64Word} word The x64-Word to AND with this word.
+ *
+ * @return {X64Word} A new x64-Word object after ANDing.
+ *
+ * @example
+ *
+ * var anded = x64Word.and(anotherX64Word);
+ */
+ // and: function (word) {
+ // var high = this.high & word.high;
+ // var low = this.low & word.low;
+
+ // return X64Word.create(high, low);
+ // },
+
+ /**
+ * Bitwise ORs this word with the passed word.
+ *
+ * @param {X64Word} word The x64-Word to OR with this word.
+ *
+ * @return {X64Word} A new x64-Word object after ORing.
+ *
+ * @example
+ *
+ * var ored = x64Word.or(anotherX64Word);
+ */
+ // or: function (word) {
+ // var high = this.high | word.high;
+ // var low = this.low | word.low;
+
+ // return X64Word.create(high, low);
+ // },
+
+ /**
+ * Bitwise XORs this word with the passed word.
+ *
+ * @param {X64Word} word The x64-Word to XOR with this word.
+ *
+ * @return {X64Word} A new x64-Word object after XORing.
+ *
+ * @example
+ *
+ * var xored = x64Word.xor(anotherX64Word);
+ */
+ // xor: function (word) {
+ // var high = this.high ^ word.high;
+ // var low = this.low ^ word.low;
+
+ // return X64Word.create(high, low);
+ // },
+
+ /**
+ * Shifts this word n bits to the left.
+ *
+ * @param {number} n The number of bits to shift.
+ *
+ * @return {X64Word} A new x64-Word object after shifting.
+ *
+ * @example
+ *
+ * var shifted = x64Word.shiftL(25);
+ */
+ // shiftL: function (n) {
+ // if (n < 32) {
+ // var high = (this.high << n) | (this.low >>> (32 - n));
+ // var low = this.low << n;
+ // } else {
+ // var high = this.low << (n - 32);
+ // var low = 0;
+ // }
+
+ // return X64Word.create(high, low);
+ // },
+
+ /**
+ * Shifts this word n bits to the right.
+ *
+ * @param {number} n The number of bits to shift.
+ *
+ * @return {X64Word} A new x64-Word object after shifting.
+ *
+ * @example
+ *
+ * var shifted = x64Word.shiftR(7);
+ */
+ // shiftR: function (n) {
+ // if (n < 32) {
+ // var low = (this.low >>> n) | (this.high << (32 - n));
+ // var high = this.high >>> n;
+ // } else {
+ // var low = this.high >>> (n - 32);
+ // var high = 0;
+ // }
+
+ // return X64Word.create(high, low);
+ // },
+
+ /**
+ * Rotates this word n bits to the left.
+ *
+ * @param {number} n The number of bits to rotate.
+ *
+ * @return {X64Word} A new x64-Word object after rotating.
+ *
+ * @example
+ *
+ * var rotated = x64Word.rotL(25);
+ */
+ // rotL: function (n) {
+ // return this.shiftL(n).or(this.shiftR(64 - n));
+ // },
+
+ /**
+ * Rotates this word n bits to the right.
+ *
+ * @param {number} n The number of bits to rotate.
+ *
+ * @return {X64Word} A new x64-Word object after rotating.
+ *
+ * @example
+ *
+ * var rotated = x64Word.rotR(7);
+ */
+ // rotR: function (n) {
+ // return this.shiftR(n).or(this.shiftL(64 - n));
+ // },
+
+ /**
+ * Adds this word with the passed word.
+ *
+ * @param {X64Word} word The x64-Word to add with this word.
+ *
+ * @return {X64Word} A new x64-Word object after adding.
+ *
+ * @example
+ *
+ * var added = x64Word.add(anotherX64Word);
+ */
+ // add: function (word) {
+ // var low = (this.low + word.low) | 0;
+ // var carry = (low >>> 0) < (this.low >>> 0) ? 1 : 0;
+ // var high = (this.high + word.high + carry) | 0;
+
+ // return X64Word.create(high, low);
+ // }
+ });
+
+ /**
+ * An array of 64-bit words.
+ *
+ * @property {Array} words The array of CryptoJS.x64.Word objects.
+ * @property {number} sigBytes The number of significant bytes in this word array.
+ */
+ var X64WordArray = C_x64.WordArray = Base.extend({
+ /**
+ * Initializes a newly created word array.
+ *
+ * @param {Array} words (Optional) An array of CryptoJS.x64.Word objects.
+ * @param {number} sigBytes (Optional) The number of significant bytes in the words.
+ *
+ * @example
+ *
+ * var wordArray = CryptoJS.x64.WordArray.create();
+ *
+ * var wordArray = CryptoJS.x64.WordArray.create([
+ * CryptoJS.x64.Word.create(0x00010203, 0x04050607),
+ * CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f)
+ * ]);
+ *
+ * var wordArray = CryptoJS.x64.WordArray.create([
+ * CryptoJS.x64.Word.create(0x00010203, 0x04050607),
+ * CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f)
+ * ], 10);
+ */
+ init: function (words, sigBytes) {
+ words = this.words = words || [];
+
+ if (sigBytes != undefined) {
+ this.sigBytes = sigBytes;
+ } else {
+ this.sigBytes = words.length * 8;
+ }
+ },
+
+ /**
+ * Converts this 64-bit word array to a 32-bit word array.
+ *
+ * @return {CryptoJS.lib.WordArray} This word array's data as a 32-bit word array.
+ *
+ * @example
+ *
+ * var x32WordArray = x64WordArray.toX32();
+ */
+ toX32: function () {
+ // Shortcuts
+ var x64Words = this.words;
+ var x64WordsLength = x64Words.length;
+
+ // Convert
+ var x32Words = [];
+ for (var i = 0; i < x64WordsLength; i++) {
+ var x64Word = x64Words[i];
+ x32Words.push(x64Word.high);
+ x32Words.push(x64Word.low);
+ }
+
+ return X32WordArray.create(x32Words, this.sigBytes);
+ },
+
+ /**
+ * Creates a copy of this word array.
+ *
+ * @return {X64WordArray} The clone.
+ *
+ * @example
+ *
+ * var clone = x64WordArray.clone();
+ */
+ clone: function () {
+ var clone = Base.clone.call(this);
+
+ // Clone "words" array
+ var words = clone.words = this.words.slice(0);
+
+ // Clone each X64Word object
+ var wordsLength = words.length;
+ for (var i = 0; i < wordsLength; i++) {
+ words[i] = words[i].clone();
+ }
+
+ return clone;
+ }
+ });
+}());
diff --git a/library/cryptojs/rollups/aes.js b/library/cryptojs/rollups/aes.js
new file mode 100644
index 000000000..827503cbd
--- /dev/null
+++ b/library/cryptojs/rollups/aes.js
@@ -0,0 +1,35 @@
+/*
+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
+*/
+var CryptoJS=CryptoJS||function(u,p){var d={},l=d.lib={},s=function(){},t=l.Base={extend:function(a){s.prototype=this;var c=new s;a&&c.mixIn(a);c.hasOwnProperty("init")||(c.init=function(){c.$super.init.apply(this,arguments)});c.init.prototype=c;c.$super=this;return c},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var c in a)a.hasOwnProperty(c)&&(this[c]=a[c]);a.hasOwnProperty("toString")&&(this.toString=a.toString)},clone:function(){return this.init.prototype.extend(this)}},
+r=l.WordArray=t.extend({init:function(a,c){a=this.words=a||[];this.sigBytes=c!=p?c:4*a.length},toString:function(a){return(a||v).stringify(this)},concat:function(a){var c=this.words,e=a.words,j=this.sigBytes;a=a.sigBytes;this.clamp();if(j%4)for(var k=0;k<a;k++)c[j+k>>>2]|=(e[k>>>2]>>>24-8*(k%4)&255)<<24-8*((j+k)%4);else if(65535<e.length)for(k=0;k<a;k+=4)c[j+k>>>2]=e[k>>>2];else c.push.apply(c,e);this.sigBytes+=a;return this},clamp:function(){var a=this.words,c=this.sigBytes;a[c>>>2]&=4294967295<<
+32-8*(c%4);a.length=u.ceil(c/4)},clone:function(){var a=t.clone.call(this);a.words=this.words.slice(0);return a},random:function(a){for(var c=[],e=0;e<a;e+=4)c.push(4294967296*u.random()|0);return new r.init(c,a)}}),w=d.enc={},v=w.Hex={stringify:function(a){var c=a.words;a=a.sigBytes;for(var e=[],j=0;j<a;j++){var k=c[j>>>2]>>>24-8*(j%4)&255;e.push((k>>>4).toString(16));e.push((k&15).toString(16))}return e.join("")},parse:function(a){for(var c=a.length,e=[],j=0;j<c;j+=2)e[j>>>3]|=parseInt(a.substr(j,
+2),16)<<24-4*(j%8);return new r.init(e,c/2)}},b=w.Latin1={stringify:function(a){var c=a.words;a=a.sigBytes;for(var e=[],j=0;j<a;j++)e.push(String.fromCharCode(c[j>>>2]>>>24-8*(j%4)&255));return e.join("")},parse:function(a){for(var c=a.length,e=[],j=0;j<c;j++)e[j>>>2]|=(a.charCodeAt(j)&255)<<24-8*(j%4);return new r.init(e,c)}},x=w.Utf8={stringify:function(a){try{return decodeURIComponent(escape(b.stringify(a)))}catch(c){throw Error("Malformed UTF-8 data");}},parse:function(a){return b.parse(unescape(encodeURIComponent(a)))}},
+q=l.BufferedBlockAlgorithm=t.extend({reset:function(){this._data=new r.init;this._nDataBytes=0},_append:function(a){"string"==typeof a&&(a=x.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(a){var c=this._data,e=c.words,j=c.sigBytes,k=this.blockSize,b=j/(4*k),b=a?u.ceil(b):u.max((b|0)-this._minBufferSize,0);a=b*k;j=u.min(4*a,j);if(a){for(var q=0;q<a;q+=k)this._doProcessBlock(e,q);q=e.splice(0,a);c.sigBytes-=j}return new r.init(q,j)},clone:function(){var a=t.clone.call(this);
+a._data=this._data.clone();return a},_minBufferSize:0});l.Hasher=q.extend({cfg:t.extend(),init:function(a){this.cfg=this.cfg.extend(a);this.reset()},reset:function(){q.reset.call(this);this._doReset()},update:function(a){this._append(a);this._process();return this},finalize:function(a){a&&this._append(a);return this._doFinalize()},blockSize:16,_createHelper:function(a){return function(b,e){return(new a.init(e)).finalize(b)}},_createHmacHelper:function(a){return function(b,e){return(new n.HMAC.init(a,
+e)).finalize(b)}}});var n=d.algo={};return d}(Math);
+(function(){var u=CryptoJS,p=u.lib.WordArray;u.enc.Base64={stringify:function(d){var l=d.words,p=d.sigBytes,t=this._map;d.clamp();d=[];for(var r=0;r<p;r+=3)for(var w=(l[r>>>2]>>>24-8*(r%4)&255)<<16|(l[r+1>>>2]>>>24-8*((r+1)%4)&255)<<8|l[r+2>>>2]>>>24-8*((r+2)%4)&255,v=0;4>v&&r+0.75*v<p;v++)d.push(t.charAt(w>>>6*(3-v)&63));if(l=t.charAt(64))for(;d.length%4;)d.push(l);return d.join("")},parse:function(d){var l=d.length,s=this._map,t=s.charAt(64);t&&(t=d.indexOf(t),-1!=t&&(l=t));for(var t=[],r=0,w=0;w<
+l;w++)if(w%4){var v=s.indexOf(d.charAt(w-1))<<2*(w%4),b=s.indexOf(d.charAt(w))>>>6-2*(w%4);t[r>>>2]|=(v|b)<<24-8*(r%4);r++}return p.create(t,r)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="}})();
+(function(u){function p(b,n,a,c,e,j,k){b=b+(n&a|~n&c)+e+k;return(b<<j|b>>>32-j)+n}function d(b,n,a,c,e,j,k){b=b+(n&c|a&~c)+e+k;return(b<<j|b>>>32-j)+n}function l(b,n,a,c,e,j,k){b=b+(n^a^c)+e+k;return(b<<j|b>>>32-j)+n}function s(b,n,a,c,e,j,k){b=b+(a^(n|~c))+e+k;return(b<<j|b>>>32-j)+n}for(var t=CryptoJS,r=t.lib,w=r.WordArray,v=r.Hasher,r=t.algo,b=[],x=0;64>x;x++)b[x]=4294967296*u.abs(u.sin(x+1))|0;r=r.MD5=v.extend({_doReset:function(){this._hash=new w.init([1732584193,4023233417,2562383102,271733878])},
+_doProcessBlock:function(q,n){for(var a=0;16>a;a++){var c=n+a,e=q[c];q[c]=(e<<8|e>>>24)&16711935|(e<<24|e>>>8)&4278255360}var a=this._hash.words,c=q[n+0],e=q[n+1],j=q[n+2],k=q[n+3],z=q[n+4],r=q[n+5],t=q[n+6],w=q[n+7],v=q[n+8],A=q[n+9],B=q[n+10],C=q[n+11],u=q[n+12],D=q[n+13],E=q[n+14],x=q[n+15],f=a[0],m=a[1],g=a[2],h=a[3],f=p(f,m,g,h,c,7,b[0]),h=p(h,f,m,g,e,12,b[1]),g=p(g,h,f,m,j,17,b[2]),m=p(m,g,h,f,k,22,b[3]),f=p(f,m,g,h,z,7,b[4]),h=p(h,f,m,g,r,12,b[5]),g=p(g,h,f,m,t,17,b[6]),m=p(m,g,h,f,w,22,b[7]),
+f=p(f,m,g,h,v,7,b[8]),h=p(h,f,m,g,A,12,b[9]),g=p(g,h,f,m,B,17,b[10]),m=p(m,g,h,f,C,22,b[11]),f=p(f,m,g,h,u,7,b[12]),h=p(h,f,m,g,D,12,b[13]),g=p(g,h,f,m,E,17,b[14]),m=p(m,g,h,f,x,22,b[15]),f=d(f,m,g,h,e,5,b[16]),h=d(h,f,m,g,t,9,b[17]),g=d(g,h,f,m,C,14,b[18]),m=d(m,g,h,f,c,20,b[19]),f=d(f,m,g,h,r,5,b[20]),h=d(h,f,m,g,B,9,b[21]),g=d(g,h,f,m,x,14,b[22]),m=d(m,g,h,f,z,20,b[23]),f=d(f,m,g,h,A,5,b[24]),h=d(h,f,m,g,E,9,b[25]),g=d(g,h,f,m,k,14,b[26]),m=d(m,g,h,f,v,20,b[27]),f=d(f,m,g,h,D,5,b[28]),h=d(h,f,
+m,g,j,9,b[29]),g=d(g,h,f,m,w,14,b[30]),m=d(m,g,h,f,u,20,b[31]),f=l(f,m,g,h,r,4,b[32]),h=l(h,f,m,g,v,11,b[33]),g=l(g,h,f,m,C,16,b[34]),m=l(m,g,h,f,E,23,b[35]),f=l(f,m,g,h,e,4,b[36]),h=l(h,f,m,g,z,11,b[37]),g=l(g,h,f,m,w,16,b[38]),m=l(m,g,h,f,B,23,b[39]),f=l(f,m,g,h,D,4,b[40]),h=l(h,f,m,g,c,11,b[41]),g=l(g,h,f,m,k,16,b[42]),m=l(m,g,h,f,t,23,b[43]),f=l(f,m,g,h,A,4,b[44]),h=l(h,f,m,g,u,11,b[45]),g=l(g,h,f,m,x,16,b[46]),m=l(m,g,h,f,j,23,b[47]),f=s(f,m,g,h,c,6,b[48]),h=s(h,f,m,g,w,10,b[49]),g=s(g,h,f,m,
+E,15,b[50]),m=s(m,g,h,f,r,21,b[51]),f=s(f,m,g,h,u,6,b[52]),h=s(h,f,m,g,k,10,b[53]),g=s(g,h,f,m,B,15,b[54]),m=s(m,g,h,f,e,21,b[55]),f=s(f,m,g,h,v,6,b[56]),h=s(h,f,m,g,x,10,b[57]),g=s(g,h,f,m,t,15,b[58]),m=s(m,g,h,f,D,21,b[59]),f=s(f,m,g,h,z,6,b[60]),h=s(h,f,m,g,C,10,b[61]),g=s(g,h,f,m,j,15,b[62]),m=s(m,g,h,f,A,21,b[63]);a[0]=a[0]+f|0;a[1]=a[1]+m|0;a[2]=a[2]+g|0;a[3]=a[3]+h|0},_doFinalize:function(){var b=this._data,n=b.words,a=8*this._nDataBytes,c=8*b.sigBytes;n[c>>>5]|=128<<24-c%32;var e=u.floor(a/
+4294967296);n[(c+64>>>9<<4)+15]=(e<<8|e>>>24)&16711935|(e<<24|e>>>8)&4278255360;n[(c+64>>>9<<4)+14]=(a<<8|a>>>24)&16711935|(a<<24|a>>>8)&4278255360;b.sigBytes=4*(n.length+1);this._process();b=this._hash;n=b.words;for(a=0;4>a;a++)c=n[a],n[a]=(c<<8|c>>>24)&16711935|(c<<24|c>>>8)&4278255360;return b},clone:function(){var b=v.clone.call(this);b._hash=this._hash.clone();return b}});t.MD5=v._createHelper(r);t.HmacMD5=v._createHmacHelper(r)})(Math);
+(function(){var u=CryptoJS,p=u.lib,d=p.Base,l=p.WordArray,p=u.algo,s=p.EvpKDF=d.extend({cfg:d.extend({keySize:4,hasher:p.MD5,iterations:1}),init:function(d){this.cfg=this.cfg.extend(d)},compute:function(d,r){for(var p=this.cfg,s=p.hasher.create(),b=l.create(),u=b.words,q=p.keySize,p=p.iterations;u.length<q;){n&&s.update(n);var n=s.update(d).finalize(r);s.reset();for(var a=1;a<p;a++)n=s.finalize(n),s.reset();b.concat(n)}b.sigBytes=4*q;return b}});u.EvpKDF=function(d,l,p){return s.create(p).compute(d,
+l)}})();
+CryptoJS.lib.Cipher||function(u){var p=CryptoJS,d=p.lib,l=d.Base,s=d.WordArray,t=d.BufferedBlockAlgorithm,r=p.enc.Base64,w=p.algo.EvpKDF,v=d.Cipher=t.extend({cfg:l.extend(),createEncryptor:function(e,a){return this.create(this._ENC_XFORM_MODE,e,a)},createDecryptor:function(e,a){return this.create(this._DEC_XFORM_MODE,e,a)},init:function(e,a,b){this.cfg=this.cfg.extend(b);this._xformMode=e;this._key=a;this.reset()},reset:function(){t.reset.call(this);this._doReset()},process:function(e){this._append(e);return this._process()},
+finalize:function(e){e&&this._append(e);return this._doFinalize()},keySize:4,ivSize:4,_ENC_XFORM_MODE:1,_DEC_XFORM_MODE:2,_createHelper:function(e){return{encrypt:function(b,k,d){return("string"==typeof k?c:a).encrypt(e,b,k,d)},decrypt:function(b,k,d){return("string"==typeof k?c:a).decrypt(e,b,k,d)}}}});d.StreamCipher=v.extend({_doFinalize:function(){return this._process(!0)},blockSize:1});var b=p.mode={},x=function(e,a,b){var c=this._iv;c?this._iv=u:c=this._prevBlock;for(var d=0;d<b;d++)e[a+d]^=
+c[d]},q=(d.BlockCipherMode=l.extend({createEncryptor:function(e,a){return this.Encryptor.create(e,a)},createDecryptor:function(e,a){return this.Decryptor.create(e,a)},init:function(e,a){this._cipher=e;this._iv=a}})).extend();q.Encryptor=q.extend({processBlock:function(e,a){var b=this._cipher,c=b.blockSize;x.call(this,e,a,c);b.encryptBlock(e,a);this._prevBlock=e.slice(a,a+c)}});q.Decryptor=q.extend({processBlock:function(e,a){var b=this._cipher,c=b.blockSize,d=e.slice(a,a+c);b.decryptBlock(e,a);x.call(this,
+e,a,c);this._prevBlock=d}});b=b.CBC=q;q=(p.pad={}).Pkcs7={pad:function(a,b){for(var c=4*b,c=c-a.sigBytes%c,d=c<<24|c<<16|c<<8|c,l=[],n=0;n<c;n+=4)l.push(d);c=s.create(l,c);a.concat(c)},unpad:function(a){a.sigBytes-=a.words[a.sigBytes-1>>>2]&255}};d.BlockCipher=v.extend({cfg:v.cfg.extend({mode:b,padding:q}),reset:function(){v.reset.call(this);var a=this.cfg,b=a.iv,a=a.mode;if(this._xformMode==this._ENC_XFORM_MODE)var c=a.createEncryptor;else c=a.createDecryptor,this._minBufferSize=1;this._mode=c.call(a,
+this,b&&b.words)},_doProcessBlock:function(a,b){this._mode.processBlock(a,b)},_doFinalize:function(){var a=this.cfg.padding;if(this._xformMode==this._ENC_XFORM_MODE){a.pad(this._data,this.blockSize);var b=this._process(!0)}else b=this._process(!0),a.unpad(b);return b},blockSize:4});var n=d.CipherParams=l.extend({init:function(a){this.mixIn(a)},toString:function(a){return(a||this.formatter).stringify(this)}}),b=(p.format={}).OpenSSL={stringify:function(a){var b=a.ciphertext;a=a.salt;return(a?s.create([1398893684,
+1701076831]).concat(a).concat(b):b).toString(r)},parse:function(a){a=r.parse(a);var b=a.words;if(1398893684==b[0]&&1701076831==b[1]){var c=s.create(b.slice(2,4));b.splice(0,4);a.sigBytes-=16}return n.create({ciphertext:a,salt:c})}},a=d.SerializableCipher=l.extend({cfg:l.extend({format:b}),encrypt:function(a,b,c,d){d=this.cfg.extend(d);var l=a.createEncryptor(c,d);b=l.finalize(b);l=l.cfg;return n.create({ciphertext:b,key:c,iv:l.iv,algorithm:a,mode:l.mode,padding:l.padding,blockSize:a.blockSize,formatter:d.format})},
+decrypt:function(a,b,c,d){d=this.cfg.extend(d);b=this._parse(b,d.format);return a.createDecryptor(c,d).finalize(b.ciphertext)},_parse:function(a,b){return"string"==typeof a?b.parse(a,this):a}}),p=(p.kdf={}).OpenSSL={execute:function(a,b,c,d){d||(d=s.random(8));a=w.create({keySize:b+c}).compute(a,d);c=s.create(a.words.slice(b),4*c);a.sigBytes=4*b;return n.create({key:a,iv:c,salt:d})}},c=d.PasswordBasedCipher=a.extend({cfg:a.cfg.extend({kdf:p}),encrypt:function(b,c,d,l){l=this.cfg.extend(l);d=l.kdf.execute(d,
+b.keySize,b.ivSize);l.iv=d.iv;b=a.encrypt.call(this,b,c,d.key,l);b.mixIn(d);return b},decrypt:function(b,c,d,l){l=this.cfg.extend(l);c=this._parse(c,l.format);d=l.kdf.execute(d,b.keySize,b.ivSize,c.salt);l.iv=d.iv;return a.decrypt.call(this,b,c,d.key,l)}})}();
+(function(){for(var u=CryptoJS,p=u.lib.BlockCipher,d=u.algo,l=[],s=[],t=[],r=[],w=[],v=[],b=[],x=[],q=[],n=[],a=[],c=0;256>c;c++)a[c]=128>c?c<<1:c<<1^283;for(var e=0,j=0,c=0;256>c;c++){var k=j^j<<1^j<<2^j<<3^j<<4,k=k>>>8^k&255^99;l[e]=k;s[k]=e;var z=a[e],F=a[z],G=a[F],y=257*a[k]^16843008*k;t[e]=y<<24|y>>>8;r[e]=y<<16|y>>>16;w[e]=y<<8|y>>>24;v[e]=y;y=16843009*G^65537*F^257*z^16843008*e;b[k]=y<<24|y>>>8;x[k]=y<<16|y>>>16;q[k]=y<<8|y>>>24;n[k]=y;e?(e=z^a[a[a[G^z]]],j^=a[a[j]]):e=j=1}var H=[0,1,2,4,8,
+16,32,64,128,27,54],d=d.AES=p.extend({_doReset:function(){for(var a=this._key,c=a.words,d=a.sigBytes/4,a=4*((this._nRounds=d+6)+1),e=this._keySchedule=[],j=0;j<a;j++)if(j<d)e[j]=c[j];else{var k=e[j-1];j%d?6<d&&4==j%d&&(k=l[k>>>24]<<24|l[k>>>16&255]<<16|l[k>>>8&255]<<8|l[k&255]):(k=k<<8|k>>>24,k=l[k>>>24]<<24|l[k>>>16&255]<<16|l[k>>>8&255]<<8|l[k&255],k^=H[j/d|0]<<24);e[j]=e[j-d]^k}c=this._invKeySchedule=[];for(d=0;d<a;d++)j=a-d,k=d%4?e[j]:e[j-4],c[d]=4>d||4>=j?k:b[l[k>>>24]]^x[l[k>>>16&255]]^q[l[k>>>
+8&255]]^n[l[k&255]]},encryptBlock:function(a,b){this._doCryptBlock(a,b,this._keySchedule,t,r,w,v,l)},decryptBlock:function(a,c){var d=a[c+1];a[c+1]=a[c+3];a[c+3]=d;this._doCryptBlock(a,c,this._invKeySchedule,b,x,q,n,s);d=a[c+1];a[c+1]=a[c+3];a[c+3]=d},_doCryptBlock:function(a,b,c,d,e,j,l,f){for(var m=this._nRounds,g=a[b]^c[0],h=a[b+1]^c[1],k=a[b+2]^c[2],n=a[b+3]^c[3],p=4,r=1;r<m;r++)var q=d[g>>>24]^e[h>>>16&255]^j[k>>>8&255]^l[n&255]^c[p++],s=d[h>>>24]^e[k>>>16&255]^j[n>>>8&255]^l[g&255]^c[p++],t=
+d[k>>>24]^e[n>>>16&255]^j[g>>>8&255]^l[h&255]^c[p++],n=d[n>>>24]^e[g>>>16&255]^j[h>>>8&255]^l[k&255]^c[p++],g=q,h=s,k=t;q=(f[g>>>24]<<24|f[h>>>16&255]<<16|f[k>>>8&255]<<8|f[n&255])^c[p++];s=(f[h>>>24]<<24|f[k>>>16&255]<<16|f[n>>>8&255]<<8|f[g&255])^c[p++];t=(f[k>>>24]<<24|f[n>>>16&255]<<16|f[g>>>8&255]<<8|f[h&255])^c[p++];n=(f[n>>>24]<<24|f[g>>>16&255]<<16|f[h>>>8&255]<<8|f[k&255])^c[p++];a[b]=q;a[b+1]=s;a[b+2]=t;a[b+3]=n},keySize:8});u.AES=p._createHelper(d)})();
diff --git a/library/cryptojs/rollups/hmac-md5.js b/library/cryptojs/rollups/hmac-md5.js
new file mode 100644
index 000000000..085eb4a1f
--- /dev/null
+++ b/library/cryptojs/rollups/hmac-md5.js
@@ -0,0 +1,21 @@
+/*
+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
+*/
+var CryptoJS=CryptoJS||function(q,r){var k={},g=k.lib={},p=function(){},t=g.Base={extend:function(b){p.prototype=this;var j=new p;b&&j.mixIn(b);j.hasOwnProperty("init")||(j.init=function(){j.$super.init.apply(this,arguments)});j.init.prototype=j;j.$super=this;return j},create:function(){var b=this.extend();b.init.apply(b,arguments);return b},init:function(){},mixIn:function(b){for(var j in b)b.hasOwnProperty(j)&&(this[j]=b[j]);b.hasOwnProperty("toString")&&(this.toString=b.toString)},clone:function(){return this.init.prototype.extend(this)}},
+n=g.WordArray=t.extend({init:function(b,j){b=this.words=b||[];this.sigBytes=j!=r?j:4*b.length},toString:function(b){return(b||u).stringify(this)},concat:function(b){var j=this.words,a=b.words,l=this.sigBytes;b=b.sigBytes;this.clamp();if(l%4)for(var h=0;h<b;h++)j[l+h>>>2]|=(a[h>>>2]>>>24-8*(h%4)&255)<<24-8*((l+h)%4);else if(65535<a.length)for(h=0;h<b;h+=4)j[l+h>>>2]=a[h>>>2];else j.push.apply(j,a);this.sigBytes+=b;return this},clamp:function(){var b=this.words,j=this.sigBytes;b[j>>>2]&=4294967295<<
+32-8*(j%4);b.length=q.ceil(j/4)},clone:function(){var b=t.clone.call(this);b.words=this.words.slice(0);return b},random:function(b){for(var j=[],a=0;a<b;a+=4)j.push(4294967296*q.random()|0);return new n.init(j,b)}}),v=k.enc={},u=v.Hex={stringify:function(b){var a=b.words;b=b.sigBytes;for(var h=[],l=0;l<b;l++){var m=a[l>>>2]>>>24-8*(l%4)&255;h.push((m>>>4).toString(16));h.push((m&15).toString(16))}return h.join("")},parse:function(b){for(var a=b.length,h=[],l=0;l<a;l+=2)h[l>>>3]|=parseInt(b.substr(l,
+2),16)<<24-4*(l%8);return new n.init(h,a/2)}},a=v.Latin1={stringify:function(b){var a=b.words;b=b.sigBytes;for(var h=[],l=0;l<b;l++)h.push(String.fromCharCode(a[l>>>2]>>>24-8*(l%4)&255));return h.join("")},parse:function(b){for(var a=b.length,h=[],l=0;l<a;l++)h[l>>>2]|=(b.charCodeAt(l)&255)<<24-8*(l%4);return new n.init(h,a)}},s=v.Utf8={stringify:function(b){try{return decodeURIComponent(escape(a.stringify(b)))}catch(h){throw Error("Malformed UTF-8 data");}},parse:function(b){return a.parse(unescape(encodeURIComponent(b)))}},
+h=g.BufferedBlockAlgorithm=t.extend({reset:function(){this._data=new n.init;this._nDataBytes=0},_append:function(b){"string"==typeof b&&(b=s.parse(b));this._data.concat(b);this._nDataBytes+=b.sigBytes},_process:function(b){var a=this._data,h=a.words,l=a.sigBytes,m=this.blockSize,k=l/(4*m),k=b?q.ceil(k):q.max((k|0)-this._minBufferSize,0);b=k*m;l=q.min(4*b,l);if(b){for(var g=0;g<b;g+=m)this._doProcessBlock(h,g);g=h.splice(0,b);a.sigBytes-=l}return new n.init(g,l)},clone:function(){var b=t.clone.call(this);
+b._data=this._data.clone();return b},_minBufferSize:0});g.Hasher=h.extend({cfg:t.extend(),init:function(b){this.cfg=this.cfg.extend(b);this.reset()},reset:function(){h.reset.call(this);this._doReset()},update:function(b){this._append(b);this._process();return this},finalize:function(b){b&&this._append(b);return this._doFinalize()},blockSize:16,_createHelper:function(b){return function(a,h){return(new b.init(h)).finalize(a)}},_createHmacHelper:function(b){return function(a,h){return(new m.HMAC.init(b,
+h)).finalize(a)}}});var m=k.algo={};return k}(Math);
+(function(q){function r(a,m,b,j,g,l,k){a=a+(m&b|~m&j)+g+k;return(a<<l|a>>>32-l)+m}function k(a,m,b,j,g,l,k){a=a+(m&j|b&~j)+g+k;return(a<<l|a>>>32-l)+m}function g(a,m,b,j,g,l,k){a=a+(m^b^j)+g+k;return(a<<l|a>>>32-l)+m}function p(a,g,b,j,k,l,p){a=a+(b^(g|~j))+k+p;return(a<<l|a>>>32-l)+g}for(var t=CryptoJS,n=t.lib,v=n.WordArray,u=n.Hasher,n=t.algo,a=[],s=0;64>s;s++)a[s]=4294967296*q.abs(q.sin(s+1))|0;n=n.MD5=u.extend({_doReset:function(){this._hash=new v.init([1732584193,4023233417,2562383102,271733878])},
+_doProcessBlock:function(h,m){for(var b=0;16>b;b++){var j=m+b,n=h[j];h[j]=(n<<8|n>>>24)&16711935|(n<<24|n>>>8)&4278255360}var b=this._hash.words,j=h[m+0],n=h[m+1],l=h[m+2],q=h[m+3],t=h[m+4],s=h[m+5],u=h[m+6],v=h[m+7],w=h[m+8],x=h[m+9],y=h[m+10],z=h[m+11],A=h[m+12],B=h[m+13],C=h[m+14],D=h[m+15],c=b[0],d=b[1],e=b[2],f=b[3],c=r(c,d,e,f,j,7,a[0]),f=r(f,c,d,e,n,12,a[1]),e=r(e,f,c,d,l,17,a[2]),d=r(d,e,f,c,q,22,a[3]),c=r(c,d,e,f,t,7,a[4]),f=r(f,c,d,e,s,12,a[5]),e=r(e,f,c,d,u,17,a[6]),d=r(d,e,f,c,v,22,a[7]),
+c=r(c,d,e,f,w,7,a[8]),f=r(f,c,d,e,x,12,a[9]),e=r(e,f,c,d,y,17,a[10]),d=r(d,e,f,c,z,22,a[11]),c=r(c,d,e,f,A,7,a[12]),f=r(f,c,d,e,B,12,a[13]),e=r(e,f,c,d,C,17,a[14]),d=r(d,e,f,c,D,22,a[15]),c=k(c,d,e,f,n,5,a[16]),f=k(f,c,d,e,u,9,a[17]),e=k(e,f,c,d,z,14,a[18]),d=k(d,e,f,c,j,20,a[19]),c=k(c,d,e,f,s,5,a[20]),f=k(f,c,d,e,y,9,a[21]),e=k(e,f,c,d,D,14,a[22]),d=k(d,e,f,c,t,20,a[23]),c=k(c,d,e,f,x,5,a[24]),f=k(f,c,d,e,C,9,a[25]),e=k(e,f,c,d,q,14,a[26]),d=k(d,e,f,c,w,20,a[27]),c=k(c,d,e,f,B,5,a[28]),f=k(f,c,
+d,e,l,9,a[29]),e=k(e,f,c,d,v,14,a[30]),d=k(d,e,f,c,A,20,a[31]),c=g(c,d,e,f,s,4,a[32]),f=g(f,c,d,e,w,11,a[33]),e=g(e,f,c,d,z,16,a[34]),d=g(d,e,f,c,C,23,a[35]),c=g(c,d,e,f,n,4,a[36]),f=g(f,c,d,e,t,11,a[37]),e=g(e,f,c,d,v,16,a[38]),d=g(d,e,f,c,y,23,a[39]),c=g(c,d,e,f,B,4,a[40]),f=g(f,c,d,e,j,11,a[41]),e=g(e,f,c,d,q,16,a[42]),d=g(d,e,f,c,u,23,a[43]),c=g(c,d,e,f,x,4,a[44]),f=g(f,c,d,e,A,11,a[45]),e=g(e,f,c,d,D,16,a[46]),d=g(d,e,f,c,l,23,a[47]),c=p(c,d,e,f,j,6,a[48]),f=p(f,c,d,e,v,10,a[49]),e=p(e,f,c,d,
+C,15,a[50]),d=p(d,e,f,c,s,21,a[51]),c=p(c,d,e,f,A,6,a[52]),f=p(f,c,d,e,q,10,a[53]),e=p(e,f,c,d,y,15,a[54]),d=p(d,e,f,c,n,21,a[55]),c=p(c,d,e,f,w,6,a[56]),f=p(f,c,d,e,D,10,a[57]),e=p(e,f,c,d,u,15,a[58]),d=p(d,e,f,c,B,21,a[59]),c=p(c,d,e,f,t,6,a[60]),f=p(f,c,d,e,z,10,a[61]),e=p(e,f,c,d,l,15,a[62]),d=p(d,e,f,c,x,21,a[63]);b[0]=b[0]+c|0;b[1]=b[1]+d|0;b[2]=b[2]+e|0;b[3]=b[3]+f|0},_doFinalize:function(){var a=this._data,g=a.words,b=8*this._nDataBytes,j=8*a.sigBytes;g[j>>>5]|=128<<24-j%32;var k=q.floor(b/
+4294967296);g[(j+64>>>9<<4)+15]=(k<<8|k>>>24)&16711935|(k<<24|k>>>8)&4278255360;g[(j+64>>>9<<4)+14]=(b<<8|b>>>24)&16711935|(b<<24|b>>>8)&4278255360;a.sigBytes=4*(g.length+1);this._process();a=this._hash;g=a.words;for(b=0;4>b;b++)j=g[b],g[b]=(j<<8|j>>>24)&16711935|(j<<24|j>>>8)&4278255360;return a},clone:function(){var a=u.clone.call(this);a._hash=this._hash.clone();return a}});t.MD5=u._createHelper(n);t.HmacMD5=u._createHmacHelper(n)})(Math);
+(function(){var q=CryptoJS,r=q.enc.Utf8;q.algo.HMAC=q.lib.Base.extend({init:function(k,g){k=this._hasher=new k.init;"string"==typeof g&&(g=r.parse(g));var p=k.blockSize,q=4*p;g.sigBytes>q&&(g=k.finalize(g));g.clamp();for(var n=this._oKey=g.clone(),v=this._iKey=g.clone(),u=n.words,a=v.words,s=0;s<p;s++)u[s]^=1549556828,a[s]^=909522486;n.sigBytes=v.sigBytes=q;this.reset()},reset:function(){var k=this._hasher;k.reset();k.update(this._iKey)},update:function(k){this._hasher.update(k);return this},finalize:function(k){var g=
+this._hasher;k=g.finalize(k);g.reset();return g.finalize(this._oKey.clone().concat(k))}})})();
diff --git a/library/cryptojs/rollups/hmac-ripemd160.js b/library/cryptojs/rollups/hmac-ripemd160.js
new file mode 100644
index 000000000..96578f7d4
--- /dev/null
+++ b/library/cryptojs/rollups/hmac-ripemd160.js
@@ -0,0 +1,31 @@
+/*
+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
+*/
+/*
+
+(c) 2012 by C?dric Mesnil. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+ - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+ - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 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.
+*/
+var CryptoJS=CryptoJS||function(h,j){var c={},e=c.lib={},A=function(){},l=e.Base={extend:function(a){A.prototype=this;var d=new A;a&&d.mixIn(a);d.hasOwnProperty("init")||(d.init=function(){d.$super.init.apply(this,arguments)});d.init.prototype=d;d.$super=this;return d},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var d in a)a.hasOwnProperty(d)&&(this[d]=a[d]);a.hasOwnProperty("toString")&&(this.toString=a.toString)},clone:function(){return this.init.prototype.extend(this)}},
+m=e.WordArray=l.extend({init:function(a,d){a=this.words=a||[];this.sigBytes=d!=j?d:4*a.length},toString:function(a){return(a||x).stringify(this)},concat:function(a){var d=this.words,B=a.words,f=this.sigBytes;a=a.sigBytes;this.clamp();if(f%4)for(var b=0;b<a;b++)d[f+b>>>2]|=(B[b>>>2]>>>24-8*(b%4)&255)<<24-8*((f+b)%4);else if(65535<B.length)for(b=0;b<a;b+=4)d[f+b>>>2]=B[b>>>2];else d.push.apply(d,B);this.sigBytes+=a;return this},clamp:function(){var a=this.words,d=this.sigBytes;a[d>>>2]&=4294967295<<
+32-8*(d%4);a.length=h.ceil(d/4)},clone:function(){var a=l.clone.call(this);a.words=this.words.slice(0);return a},random:function(a){for(var d=[],b=0;b<a;b+=4)d.push(4294967296*h.random()|0);return new m.init(d,a)}}),v=c.enc={},x=v.Hex={stringify:function(a){var d=a.words;a=a.sigBytes;for(var b=[],f=0;f<a;f++){var c=d[f>>>2]>>>24-8*(f%4)&255;b.push((c>>>4).toString(16));b.push((c&15).toString(16))}return b.join("")},parse:function(a){for(var d=a.length,b=[],f=0;f<d;f+=2)b[f>>>3]|=parseInt(a.substr(f,
+2),16)<<24-4*(f%8);return new m.init(b,d/2)}},w=v.Latin1={stringify:function(a){var d=a.words;a=a.sigBytes;for(var b=[],f=0;f<a;f++)b.push(String.fromCharCode(d[f>>>2]>>>24-8*(f%4)&255));return b.join("")},parse:function(a){for(var b=a.length,c=[],f=0;f<b;f++)c[f>>>2]|=(a.charCodeAt(f)&255)<<24-8*(f%4);return new m.init(c,b)}},k=v.Utf8={stringify:function(a){try{return decodeURIComponent(escape(w.stringify(a)))}catch(b){throw Error("Malformed UTF-8 data");}},parse:function(a){return w.parse(unescape(encodeURIComponent(a)))}},
+u=e.BufferedBlockAlgorithm=l.extend({reset:function(){this._data=new m.init;this._nDataBytes=0},_append:function(a){"string"==typeof a&&(a=k.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(a){var b=this._data,c=b.words,f=b.sigBytes,e=this.blockSize,k=f/(4*e),k=a?h.ceil(k):h.max((k|0)-this._minBufferSize,0);a=k*e;f=h.min(4*a,f);if(a){for(var u=0;u<a;u+=e)this._doProcessBlock(c,u);u=c.splice(0,a);b.sigBytes-=f}return new m.init(u,f)},clone:function(){var a=l.clone.call(this);
+a._data=this._data.clone();return a},_minBufferSize:0});e.Hasher=u.extend({cfg:l.extend(),init:function(a){this.cfg=this.cfg.extend(a);this.reset()},reset:function(){u.reset.call(this);this._doReset()},update:function(a){this._append(a);this._process();return this},finalize:function(a){a&&this._append(a);return this._doFinalize()},blockSize:16,_createHelper:function(a){return function(b,c){return(new a.init(c)).finalize(b)}},_createHmacHelper:function(a){return function(d,c){return(new b.HMAC.init(a,
+c)).finalize(d)}}});var b=c.algo={};return c}(Math);
+(function(){var h=CryptoJS,j=h.lib,c=j.WordArray,e=j.Hasher,j=h.algo,A=c.create([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,7,4,13,1,10,6,15,3,12,0,9,5,2,14,11,8,3,10,14,4,9,15,8,1,2,7,0,6,13,11,5,12,1,9,11,10,0,8,12,4,13,3,7,15,14,5,6,2,4,0,5,9,7,12,2,10,14,1,3,8,11,6,15,13]),l=c.create([5,14,7,0,9,2,11,4,13,6,15,8,1,10,3,12,6,11,3,7,0,13,5,10,14,15,8,12,4,9,1,2,15,5,1,3,7,14,6,9,11,8,12,2,10,0,4,13,8,6,4,1,3,11,15,0,5,12,2,13,9,7,10,14,12,15,10,4,1,5,8,7,6,2,13,14,0,3,9,11]),m=c.create([11,14,15,12,
+5,8,7,9,11,13,14,15,6,7,9,8,7,6,8,13,11,9,7,15,7,12,15,9,11,7,13,12,11,13,6,7,14,9,13,15,14,8,13,6,5,12,7,5,11,12,14,15,14,15,9,8,9,14,5,6,8,6,5,12,9,15,5,11,6,8,13,12,5,12,13,14,11,8,5,6]),v=c.create([8,9,9,11,13,15,15,5,7,7,8,11,14,14,12,6,9,13,15,7,12,8,9,11,7,7,12,7,6,15,13,11,9,7,15,11,8,6,6,14,12,13,5,14,13,13,7,5,15,5,8,11,14,14,6,14,6,9,12,9,12,5,15,8,8,5,12,9,12,5,14,6,8,13,6,5,15,13,11,11]),x=c.create([0,1518500249,1859775393,2400959708,2840853838]),w=c.create([1352829926,1548603684,1836072691,
+2053994217,0]),j=j.RIPEMD160=e.extend({_doReset:function(){this._hash=c.create([1732584193,4023233417,2562383102,271733878,3285377520])},_doProcessBlock:function(c,e){for(var b=0;16>b;b++){var a=e+b,d=c[a];c[a]=(d<<8|d>>>24)&16711935|(d<<24|d>>>8)&4278255360}var a=this._hash.words,d=x.words,h=w.words,f=A.words,j=l.words,E=m.words,F=v.words,C,n,p,q,y,D,r,s,t,z;D=C=a[0];r=n=a[1];s=p=a[2];t=q=a[3];z=y=a[4];for(var g,b=0;80>b;b+=1)g=C+c[e+f[b]]|0,g=16>b?g+((n^p^q)+d[0]):32>b?g+((n&p|~n&q)+d[1]):48>b?
+g+(((n|~p)^q)+d[2]):64>b?g+((n&q|p&~q)+d[3]):g+((n^(p|~q))+d[4]),g|=0,g=g<<E[b]|g>>>32-E[b],g=g+y|0,C=y,y=q,q=p<<10|p>>>22,p=n,n=g,g=D+c[e+j[b]]|0,g=16>b?g+((r^(s|~t))+h[0]):32>b?g+((r&t|s&~t)+h[1]):48>b?g+(((r|~s)^t)+h[2]):64>b?g+((r&s|~r&t)+h[3]):g+((r^s^t)+h[4]),g|=0,g=g<<F[b]|g>>>32-F[b],g=g+z|0,D=z,z=t,t=s<<10|s>>>22,s=r,r=g;g=a[1]+p+t|0;a[1]=a[2]+q+z|0;a[2]=a[3]+y+D|0;a[3]=a[4]+C+r|0;a[4]=a[0]+n+s|0;a[0]=g},_doFinalize:function(){var c=this._data,e=c.words,b=8*this._nDataBytes,a=8*c.sigBytes;
+e[a>>>5]|=128<<24-a%32;e[(a+64>>>9<<4)+14]=(b<<8|b>>>24)&16711935|(b<<24|b>>>8)&4278255360;c.sigBytes=4*(e.length+1);this._process();c=this._hash;e=c.words;for(b=0;5>b;b++)a=e[b],e[b]=(a<<8|a>>>24)&16711935|(a<<24|a>>>8)&4278255360;return c},clone:function(){var c=e.clone.call(this);c._hash=this._hash.clone();return c}});h.RIPEMD160=e._createHelper(j);h.HmacRIPEMD160=e._createHmacHelper(j)})(Math);
+(function(){var h=CryptoJS,j=h.enc.Utf8;h.algo.HMAC=h.lib.Base.extend({init:function(c,e){c=this._hasher=new c.init;"string"==typeof e&&(e=j.parse(e));var h=c.blockSize,l=4*h;e.sigBytes>l&&(e=c.finalize(e));e.clamp();for(var m=this._oKey=e.clone(),v=this._iKey=e.clone(),x=m.words,w=v.words,k=0;k<h;k++)x[k]^=1549556828,w[k]^=909522486;m.sigBytes=v.sigBytes=l;this.reset()},reset:function(){var c=this._hasher;c.reset();c.update(this._iKey)},update:function(c){this._hasher.update(c);return this},finalize:function(c){var e=
+this._hasher;c=e.finalize(c);e.reset();return e.finalize(this._oKey.clone().concat(c))}})})();
diff --git a/library/cryptojs/rollups/hmac-sha1.js b/library/cryptojs/rollups/hmac-sha1.js
new file mode 100644
index 000000000..0d50d81a1
--- /dev/null
+++ b/library/cryptojs/rollups/hmac-sha1.js
@@ -0,0 +1,17 @@
+/*
+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
+*/
+var CryptoJS=CryptoJS||function(g,l){var e={},d=e.lib={},m=function(){},k=d.Base={extend:function(a){m.prototype=this;var c=new m;a&&c.mixIn(a);c.hasOwnProperty("init")||(c.init=function(){c.$super.init.apply(this,arguments)});c.init.prototype=c;c.$super=this;return c},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var c in a)a.hasOwnProperty(c)&&(this[c]=a[c]);a.hasOwnProperty("toString")&&(this.toString=a.toString)},clone:function(){return this.init.prototype.extend(this)}},
+p=d.WordArray=k.extend({init:function(a,c){a=this.words=a||[];this.sigBytes=c!=l?c:4*a.length},toString:function(a){return(a||n).stringify(this)},concat:function(a){var c=this.words,q=a.words,f=this.sigBytes;a=a.sigBytes;this.clamp();if(f%4)for(var b=0;b<a;b++)c[f+b>>>2]|=(q[b>>>2]>>>24-8*(b%4)&255)<<24-8*((f+b)%4);else if(65535<q.length)for(b=0;b<a;b+=4)c[f+b>>>2]=q[b>>>2];else c.push.apply(c,q);this.sigBytes+=a;return this},clamp:function(){var a=this.words,c=this.sigBytes;a[c>>>2]&=4294967295<<
+32-8*(c%4);a.length=g.ceil(c/4)},clone:function(){var a=k.clone.call(this);a.words=this.words.slice(0);return a},random:function(a){for(var c=[],b=0;b<a;b+=4)c.push(4294967296*g.random()|0);return new p.init(c,a)}}),b=e.enc={},n=b.Hex={stringify:function(a){var c=a.words;a=a.sigBytes;for(var b=[],f=0;f<a;f++){var d=c[f>>>2]>>>24-8*(f%4)&255;b.push((d>>>4).toString(16));b.push((d&15).toString(16))}return b.join("")},parse:function(a){for(var c=a.length,b=[],f=0;f<c;f+=2)b[f>>>3]|=parseInt(a.substr(f,
+2),16)<<24-4*(f%8);return new p.init(b,c/2)}},j=b.Latin1={stringify:function(a){var c=a.words;a=a.sigBytes;for(var b=[],f=0;f<a;f++)b.push(String.fromCharCode(c[f>>>2]>>>24-8*(f%4)&255));return b.join("")},parse:function(a){for(var c=a.length,b=[],f=0;f<c;f++)b[f>>>2]|=(a.charCodeAt(f)&255)<<24-8*(f%4);return new p.init(b,c)}},h=b.Utf8={stringify:function(a){try{return decodeURIComponent(escape(j.stringify(a)))}catch(c){throw Error("Malformed UTF-8 data");}},parse:function(a){return j.parse(unescape(encodeURIComponent(a)))}},
+r=d.BufferedBlockAlgorithm=k.extend({reset:function(){this._data=new p.init;this._nDataBytes=0},_append:function(a){"string"==typeof a&&(a=h.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(a){var c=this._data,b=c.words,f=c.sigBytes,d=this.blockSize,e=f/(4*d),e=a?g.ceil(e):g.max((e|0)-this._minBufferSize,0);a=e*d;f=g.min(4*a,f);if(a){for(var k=0;k<a;k+=d)this._doProcessBlock(b,k);k=b.splice(0,a);c.sigBytes-=f}return new p.init(k,f)},clone:function(){var a=k.clone.call(this);
+a._data=this._data.clone();return a},_minBufferSize:0});d.Hasher=r.extend({cfg:k.extend(),init:function(a){this.cfg=this.cfg.extend(a);this.reset()},reset:function(){r.reset.call(this);this._doReset()},update:function(a){this._append(a);this._process();return this},finalize:function(a){a&&this._append(a);return this._doFinalize()},blockSize:16,_createHelper:function(a){return function(b,d){return(new a.init(d)).finalize(b)}},_createHmacHelper:function(a){return function(b,d){return(new s.HMAC.init(a,
+d)).finalize(b)}}});var s=e.algo={};return e}(Math);
+(function(){var g=CryptoJS,l=g.lib,e=l.WordArray,d=l.Hasher,m=[],l=g.algo.SHA1=d.extend({_doReset:function(){this._hash=new e.init([1732584193,4023233417,2562383102,271733878,3285377520])},_doProcessBlock:function(d,e){for(var b=this._hash.words,n=b[0],j=b[1],h=b[2],g=b[3],l=b[4],a=0;80>a;a++){if(16>a)m[a]=d[e+a]|0;else{var c=m[a-3]^m[a-8]^m[a-14]^m[a-16];m[a]=c<<1|c>>>31}c=(n<<5|n>>>27)+l+m[a];c=20>a?c+((j&h|~j&g)+1518500249):40>a?c+((j^h^g)+1859775393):60>a?c+((j&h|j&g|h&g)-1894007588):c+((j^h^
+g)-899497514);l=g;g=h;h=j<<30|j>>>2;j=n;n=c}b[0]=b[0]+n|0;b[1]=b[1]+j|0;b[2]=b[2]+h|0;b[3]=b[3]+g|0;b[4]=b[4]+l|0},_doFinalize:function(){var d=this._data,e=d.words,b=8*this._nDataBytes,g=8*d.sigBytes;e[g>>>5]|=128<<24-g%32;e[(g+64>>>9<<4)+14]=Math.floor(b/4294967296);e[(g+64>>>9<<4)+15]=b;d.sigBytes=4*e.length;this._process();return this._hash},clone:function(){var e=d.clone.call(this);e._hash=this._hash.clone();return e}});g.SHA1=d._createHelper(l);g.HmacSHA1=d._createHmacHelper(l)})();
+(function(){var g=CryptoJS,l=g.enc.Utf8;g.algo.HMAC=g.lib.Base.extend({init:function(e,d){e=this._hasher=new e.init;"string"==typeof d&&(d=l.parse(d));var g=e.blockSize,k=4*g;d.sigBytes>k&&(d=e.finalize(d));d.clamp();for(var p=this._oKey=d.clone(),b=this._iKey=d.clone(),n=p.words,j=b.words,h=0;h<g;h++)n[h]^=1549556828,j[h]^=909522486;p.sigBytes=b.sigBytes=k;this.reset()},reset:function(){var e=this._hasher;e.reset();e.update(this._iKey)},update:function(e){this._hasher.update(e);return this},finalize:function(e){var d=
+this._hasher;e=d.finalize(e);d.reset();return d.finalize(this._oKey.clone().concat(e))}})})();
diff --git a/library/cryptojs/rollups/hmac-sha224.js b/library/cryptojs/rollups/hmac-sha224.js
new file mode 100644
index 000000000..acc149ce9
--- /dev/null
+++ b/library/cryptojs/rollups/hmac-sha224.js
@@ -0,0 +1,19 @@
+/*
+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
+*/
+var CryptoJS=CryptoJS||function(j,k){var c={},e=c.lib={},p=function(){},m=e.Base={extend:function(a){p.prototype=this;var d=new p;a&&d.mixIn(a);d.hasOwnProperty("init")||(d.init=function(){d.$super.init.apply(this,arguments)});d.init.prototype=d;d.$super=this;return d},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var d in a)a.hasOwnProperty(d)&&(this[d]=a[d]);a.hasOwnProperty("toString")&&(this.toString=a.toString)},clone:function(){return this.init.prototype.extend(this)}},
+r=e.WordArray=m.extend({init:function(a,d){a=this.words=a||[];this.sigBytes=d!=k?d:4*a.length},toString:function(a){return(a||l).stringify(this)},concat:function(a){var d=this.words,f=a.words,b=this.sigBytes;a=a.sigBytes;this.clamp();if(b%4)for(var g=0;g<a;g++)d[b+g>>>2]|=(f[g>>>2]>>>24-8*(g%4)&255)<<24-8*((b+g)%4);else if(65535<f.length)for(g=0;g<a;g+=4)d[b+g>>>2]=f[g>>>2];else d.push.apply(d,f);this.sigBytes+=a;return this},clamp:function(){var a=this.words,d=this.sigBytes;a[d>>>2]&=4294967295<<
+32-8*(d%4);a.length=j.ceil(d/4)},clone:function(){var a=m.clone.call(this);a.words=this.words.slice(0);return a},random:function(a){for(var d=[],f=0;f<a;f+=4)d.push(4294967296*j.random()|0);return new r.init(d,a)}}),s=c.enc={},l=s.Hex={stringify:function(a){var d=a.words;a=a.sigBytes;for(var f=[],b=0;b<a;b++){var g=d[b>>>2]>>>24-8*(b%4)&255;f.push((g>>>4).toString(16));f.push((g&15).toString(16))}return f.join("")},parse:function(a){for(var d=a.length,f=[],b=0;b<d;b+=2)f[b>>>3]|=parseInt(a.substr(b,
+2),16)<<24-4*(b%8);return new r.init(f,d/2)}},n=s.Latin1={stringify:function(a){var d=a.words;a=a.sigBytes;for(var f=[],b=0;b<a;b++)f.push(String.fromCharCode(d[b>>>2]>>>24-8*(b%4)&255));return f.join("")},parse:function(a){for(var d=a.length,f=[],b=0;b<d;b++)f[b>>>2]|=(a.charCodeAt(b)&255)<<24-8*(b%4);return new r.init(f,d)}},h=s.Utf8={stringify:function(a){try{return decodeURIComponent(escape(n.stringify(a)))}catch(d){throw Error("Malformed UTF-8 data");}},parse:function(a){return n.parse(unescape(encodeURIComponent(a)))}},
+u=e.BufferedBlockAlgorithm=m.extend({reset:function(){this._data=new r.init;this._nDataBytes=0},_append:function(a){"string"==typeof a&&(a=h.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(a){var d=this._data,f=d.words,b=d.sigBytes,g=this.blockSize,c=b/(4*g),c=a?j.ceil(c):j.max((c|0)-this._minBufferSize,0);a=c*g;b=j.min(4*a,b);if(a){for(var e=0;e<a;e+=g)this._doProcessBlock(f,e);e=f.splice(0,a);d.sigBytes-=b}return new r.init(e,b)},clone:function(){var a=m.clone.call(this);
+a._data=this._data.clone();return a},_minBufferSize:0});e.Hasher=u.extend({cfg:m.extend(),init:function(a){this.cfg=this.cfg.extend(a);this.reset()},reset:function(){u.reset.call(this);this._doReset()},update:function(a){this._append(a);this._process();return this},finalize:function(a){a&&this._append(a);return this._doFinalize()},blockSize:16,_createHelper:function(a){return function(d,f){return(new a.init(f)).finalize(d)}},_createHmacHelper:function(a){return function(d,f){return(new t.HMAC.init(a,
+f)).finalize(d)}}});var t=c.algo={};return c}(Math);
+(function(j){for(var k=CryptoJS,c=k.lib,e=c.WordArray,p=c.Hasher,c=k.algo,m=[],r=[],s=function(a){return 4294967296*(a-(a|0))|0},l=2,n=0;64>n;){var h;a:{h=l;for(var u=j.sqrt(h),t=2;t<=u;t++)if(!(h%t)){h=!1;break a}h=!0}h&&(8>n&&(m[n]=s(j.pow(l,0.5))),r[n]=s(j.pow(l,1/3)),n++);l++}var a=[],c=c.SHA256=p.extend({_doReset:function(){this._hash=new e.init(m.slice(0))},_doProcessBlock:function(d,f){for(var b=this._hash.words,g=b[0],c=b[1],e=b[2],j=b[3],h=b[4],p=b[5],m=b[6],n=b[7],q=0;64>q;q++){if(16>q)a[q]=
+d[f+q]|0;else{var k=a[q-15],l=a[q-2];a[q]=((k<<25|k>>>7)^(k<<14|k>>>18)^k>>>3)+a[q-7]+((l<<15|l>>>17)^(l<<13|l>>>19)^l>>>10)+a[q-16]}k=n+((h<<26|h>>>6)^(h<<21|h>>>11)^(h<<7|h>>>25))+(h&p^~h&m)+r[q]+a[q];l=((g<<30|g>>>2)^(g<<19|g>>>13)^(g<<10|g>>>22))+(g&c^g&e^c&e);n=m;m=p;p=h;h=j+k|0;j=e;e=c;c=g;g=k+l|0}b[0]=b[0]+g|0;b[1]=b[1]+c|0;b[2]=b[2]+e|0;b[3]=b[3]+j|0;b[4]=b[4]+h|0;b[5]=b[5]+p|0;b[6]=b[6]+m|0;b[7]=b[7]+n|0},_doFinalize:function(){var a=this._data,c=a.words,b=8*this._nDataBytes,e=8*a.sigBytes;
+c[e>>>5]|=128<<24-e%32;c[(e+64>>>9<<4)+14]=j.floor(b/4294967296);c[(e+64>>>9<<4)+15]=b;a.sigBytes=4*c.length;this._process();return this._hash},clone:function(){var a=p.clone.call(this);a._hash=this._hash.clone();return a}});k.SHA256=p._createHelper(c);k.HmacSHA256=p._createHmacHelper(c)})(Math);
+(function(){var j=CryptoJS,k=j.lib.WordArray,c=j.algo,e=c.SHA256,c=c.SHA224=e.extend({_doReset:function(){this._hash=new k.init([3238371032,914150663,812702999,4144912697,4290775857,1750603025,1694076839,3204075428])},_doFinalize:function(){var c=e._doFinalize.call(this);c.sigBytes-=4;return c}});j.SHA224=e._createHelper(c);j.HmacSHA224=e._createHmacHelper(c)})();
+(function(){var j=CryptoJS,k=j.enc.Utf8;j.algo.HMAC=j.lib.Base.extend({init:function(c,e){c=this._hasher=new c.init;"string"==typeof e&&(e=k.parse(e));var j=c.blockSize,m=4*j;e.sigBytes>m&&(e=c.finalize(e));e.clamp();for(var r=this._oKey=e.clone(),s=this._iKey=e.clone(),l=r.words,n=s.words,h=0;h<j;h++)l[h]^=1549556828,n[h]^=909522486;r.sigBytes=s.sigBytes=m;this.reset()},reset:function(){var c=this._hasher;c.reset();c.update(this._iKey)},update:function(c){this._hasher.update(c);return this},finalize:function(c){var e=
+this._hasher;c=e.finalize(c);e.reset();return e.finalize(this._oKey.clone().concat(c))}})})();
diff --git a/library/cryptojs/rollups/hmac-sha256.js b/library/cryptojs/rollups/hmac-sha256.js
new file mode 100644
index 000000000..c822cfb1f
--- /dev/null
+++ b/library/cryptojs/rollups/hmac-sha256.js
@@ -0,0 +1,18 @@
+/*
+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
+*/
+var CryptoJS=CryptoJS||function(h,s){var f={},g=f.lib={},q=function(){},m=g.Base={extend:function(a){q.prototype=this;var c=new q;a&&c.mixIn(a);c.hasOwnProperty("init")||(c.init=function(){c.$super.init.apply(this,arguments)});c.init.prototype=c;c.$super=this;return c},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var c in a)a.hasOwnProperty(c)&&(this[c]=a[c]);a.hasOwnProperty("toString")&&(this.toString=a.toString)},clone:function(){return this.init.prototype.extend(this)}},
+r=g.WordArray=m.extend({init:function(a,c){a=this.words=a||[];this.sigBytes=c!=s?c:4*a.length},toString:function(a){return(a||k).stringify(this)},concat:function(a){var c=this.words,d=a.words,b=this.sigBytes;a=a.sigBytes;this.clamp();if(b%4)for(var e=0;e<a;e++)c[b+e>>>2]|=(d[e>>>2]>>>24-8*(e%4)&255)<<24-8*((b+e)%4);else if(65535<d.length)for(e=0;e<a;e+=4)c[b+e>>>2]=d[e>>>2];else c.push.apply(c,d);this.sigBytes+=a;return this},clamp:function(){var a=this.words,c=this.sigBytes;a[c>>>2]&=4294967295<<
+32-8*(c%4);a.length=h.ceil(c/4)},clone:function(){var a=m.clone.call(this);a.words=this.words.slice(0);return a},random:function(a){for(var c=[],d=0;d<a;d+=4)c.push(4294967296*h.random()|0);return new r.init(c,a)}}),l=f.enc={},k=l.Hex={stringify:function(a){var c=a.words;a=a.sigBytes;for(var d=[],b=0;b<a;b++){var e=c[b>>>2]>>>24-8*(b%4)&255;d.push((e>>>4).toString(16));d.push((e&15).toString(16))}return d.join("")},parse:function(a){for(var c=a.length,d=[],b=0;b<c;b+=2)d[b>>>3]|=parseInt(a.substr(b,
+2),16)<<24-4*(b%8);return new r.init(d,c/2)}},n=l.Latin1={stringify:function(a){var c=a.words;a=a.sigBytes;for(var d=[],b=0;b<a;b++)d.push(String.fromCharCode(c[b>>>2]>>>24-8*(b%4)&255));return d.join("")},parse:function(a){for(var c=a.length,d=[],b=0;b<c;b++)d[b>>>2]|=(a.charCodeAt(b)&255)<<24-8*(b%4);return new r.init(d,c)}},j=l.Utf8={stringify:function(a){try{return decodeURIComponent(escape(n.stringify(a)))}catch(c){throw Error("Malformed UTF-8 data");}},parse:function(a){return n.parse(unescape(encodeURIComponent(a)))}},
+u=g.BufferedBlockAlgorithm=m.extend({reset:function(){this._data=new r.init;this._nDataBytes=0},_append:function(a){"string"==typeof a&&(a=j.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(a){var c=this._data,d=c.words,b=c.sigBytes,e=this.blockSize,f=b/(4*e),f=a?h.ceil(f):h.max((f|0)-this._minBufferSize,0);a=f*e;b=h.min(4*a,b);if(a){for(var g=0;g<a;g+=e)this._doProcessBlock(d,g);g=d.splice(0,a);c.sigBytes-=b}return new r.init(g,b)},clone:function(){var a=m.clone.call(this);
+a._data=this._data.clone();return a},_minBufferSize:0});g.Hasher=u.extend({cfg:m.extend(),init:function(a){this.cfg=this.cfg.extend(a);this.reset()},reset:function(){u.reset.call(this);this._doReset()},update:function(a){this._append(a);this._process();return this},finalize:function(a){a&&this._append(a);return this._doFinalize()},blockSize:16,_createHelper:function(a){return function(c,d){return(new a.init(d)).finalize(c)}},_createHmacHelper:function(a){return function(c,d){return(new t.HMAC.init(a,
+d)).finalize(c)}}});var t=f.algo={};return f}(Math);
+(function(h){for(var s=CryptoJS,f=s.lib,g=f.WordArray,q=f.Hasher,f=s.algo,m=[],r=[],l=function(a){return 4294967296*(a-(a|0))|0},k=2,n=0;64>n;){var j;a:{j=k;for(var u=h.sqrt(j),t=2;t<=u;t++)if(!(j%t)){j=!1;break a}j=!0}j&&(8>n&&(m[n]=l(h.pow(k,0.5))),r[n]=l(h.pow(k,1/3)),n++);k++}var a=[],f=f.SHA256=q.extend({_doReset:function(){this._hash=new g.init(m.slice(0))},_doProcessBlock:function(c,d){for(var b=this._hash.words,e=b[0],f=b[1],g=b[2],j=b[3],h=b[4],m=b[5],n=b[6],q=b[7],p=0;64>p;p++){if(16>p)a[p]=
+c[d+p]|0;else{var k=a[p-15],l=a[p-2];a[p]=((k<<25|k>>>7)^(k<<14|k>>>18)^k>>>3)+a[p-7]+((l<<15|l>>>17)^(l<<13|l>>>19)^l>>>10)+a[p-16]}k=q+((h<<26|h>>>6)^(h<<21|h>>>11)^(h<<7|h>>>25))+(h&m^~h&n)+r[p]+a[p];l=((e<<30|e>>>2)^(e<<19|e>>>13)^(e<<10|e>>>22))+(e&f^e&g^f&g);q=n;n=m;m=h;h=j+k|0;j=g;g=f;f=e;e=k+l|0}b[0]=b[0]+e|0;b[1]=b[1]+f|0;b[2]=b[2]+g|0;b[3]=b[3]+j|0;b[4]=b[4]+h|0;b[5]=b[5]+m|0;b[6]=b[6]+n|0;b[7]=b[7]+q|0},_doFinalize:function(){var a=this._data,d=a.words,b=8*this._nDataBytes,e=8*a.sigBytes;
+d[e>>>5]|=128<<24-e%32;d[(e+64>>>9<<4)+14]=h.floor(b/4294967296);d[(e+64>>>9<<4)+15]=b;a.sigBytes=4*d.length;this._process();return this._hash},clone:function(){var a=q.clone.call(this);a._hash=this._hash.clone();return a}});s.SHA256=q._createHelper(f);s.HmacSHA256=q._createHmacHelper(f)})(Math);
+(function(){var h=CryptoJS,s=h.enc.Utf8;h.algo.HMAC=h.lib.Base.extend({init:function(f,g){f=this._hasher=new f.init;"string"==typeof g&&(g=s.parse(g));var h=f.blockSize,m=4*h;g.sigBytes>m&&(g=f.finalize(g));g.clamp();for(var r=this._oKey=g.clone(),l=this._iKey=g.clone(),k=r.words,n=l.words,j=0;j<h;j++)k[j]^=1549556828,n[j]^=909522486;r.sigBytes=l.sigBytes=m;this.reset()},reset:function(){var f=this._hasher;f.reset();f.update(this._iKey)},update:function(f){this._hasher.update(f);return this},finalize:function(f){var g=
+this._hasher;f=g.finalize(f);g.reset();return g.finalize(this._oKey.clone().concat(f))}})})();
diff --git a/library/cryptojs/rollups/hmac-sha3.js b/library/cryptojs/rollups/hmac-sha3.js
new file mode 100644
index 000000000..9f81d0465
--- /dev/null
+++ b/library/cryptojs/rollups/hmac-sha3.js
@@ -0,0 +1,21 @@
+/*
+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
+*/
+var CryptoJS=CryptoJS||function(q,f){var c={},d=c.lib={},v=function(){},s=d.Base={extend:function(a){v.prototype=this;var b=new v;a&&b.mixIn(a);b.hasOwnProperty("init")||(b.init=function(){b.$super.init.apply(this,arguments)});b.init.prototype=b;b.$super=this;return b},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var b in a)a.hasOwnProperty(b)&&(this[b]=a[b]);a.hasOwnProperty("toString")&&(this.toString=a.toString)},clone:function(){return this.init.prototype.extend(this)}},
+t=d.WordArray=s.extend({init:function(a,b){a=this.words=a||[];this.sigBytes=b!=f?b:4*a.length},toString:function(a){return(a||r).stringify(this)},concat:function(a){var b=this.words,e=a.words,j=this.sigBytes;a=a.sigBytes;this.clamp();if(j%4)for(var p=0;p<a;p++)b[j+p>>>2]|=(e[p>>>2]>>>24-8*(p%4)&255)<<24-8*((j+p)%4);else if(65535<e.length)for(p=0;p<a;p+=4)b[j+p>>>2]=e[p>>>2];else b.push.apply(b,e);this.sigBytes+=a;return this},clamp:function(){var a=this.words,b=this.sigBytes;a[b>>>2]&=4294967295<<
+32-8*(b%4);a.length=q.ceil(b/4)},clone:function(){var a=s.clone.call(this);a.words=this.words.slice(0);return a},random:function(a){for(var b=[],e=0;e<a;e+=4)b.push(4294967296*q.random()|0);return new t.init(b,a)}}),w=c.enc={},r=w.Hex={stringify:function(a){var b=a.words;a=a.sigBytes;for(var e=[],j=0;j<a;j++){var p=b[j>>>2]>>>24-8*(j%4)&255;e.push((p>>>4).toString(16));e.push((p&15).toString(16))}return e.join("")},parse:function(a){for(var b=a.length,e=[],j=0;j<b;j+=2)e[j>>>3]|=parseInt(a.substr(j,
+2),16)<<24-4*(j%8);return new t.init(e,b/2)}},g=w.Latin1={stringify:function(a){var b=a.words;a=a.sigBytes;for(var e=[],j=0;j<a;j++)e.push(String.fromCharCode(b[j>>>2]>>>24-8*(j%4)&255));return e.join("")},parse:function(a){for(var b=a.length,e=[],j=0;j<b;j++)e[j>>>2]|=(a.charCodeAt(j)&255)<<24-8*(j%4);return new t.init(e,b)}},n=w.Utf8={stringify:function(a){try{return decodeURIComponent(escape(g.stringify(a)))}catch(b){throw Error("Malformed UTF-8 data");}},parse:function(a){return g.parse(unescape(encodeURIComponent(a)))}},
+u=d.BufferedBlockAlgorithm=s.extend({reset:function(){this._data=new t.init;this._nDataBytes=0},_append:function(a){"string"==typeof a&&(a=n.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(a){var b=this._data,e=b.words,j=b.sigBytes,p=this.blockSize,c=j/(4*p),c=a?q.ceil(c):q.max((c|0)-this._minBufferSize,0);a=c*p;j=q.min(4*a,j);if(a){for(var g=0;g<a;g+=p)this._doProcessBlock(e,g);g=e.splice(0,a);b.sigBytes-=j}return new t.init(g,j)},clone:function(){var a=s.clone.call(this);
+a._data=this._data.clone();return a},_minBufferSize:0});d.Hasher=u.extend({cfg:s.extend(),init:function(a){this.cfg=this.cfg.extend(a);this.reset()},reset:function(){u.reset.call(this);this._doReset()},update:function(a){this._append(a);this._process();return this},finalize:function(a){a&&this._append(a);return this._doFinalize()},blockSize:16,_createHelper:function(a){return function(b,e){return(new a.init(e)).finalize(b)}},_createHmacHelper:function(a){return function(b,e){return(new x.HMAC.init(a,
+e)).finalize(b)}}});var x=c.algo={};return c}(Math);
+(function(q){var f=CryptoJS,c=f.lib,d=c.Base,v=c.WordArray,f=f.x64={};f.Word=d.extend({init:function(c,d){this.high=c;this.low=d}});f.WordArray=d.extend({init:function(c,d){c=this.words=c||[];this.sigBytes=d!=q?d:8*c.length},toX32:function(){for(var c=this.words,d=c.length,f=[],r=0;r<d;r++){var g=c[r];f.push(g.high);f.push(g.low)}return v.create(f,this.sigBytes)},clone:function(){for(var c=d.clone.call(this),f=c.words=this.words.slice(0),q=f.length,r=0;r<q;r++)f[r]=f[r].clone();return c}})})();
+(function(q){for(var f=CryptoJS,c=f.lib,d=c.WordArray,v=c.Hasher,s=f.x64.Word,c=f.algo,t=[],w=[],r=[],g=1,n=0,u=0;24>u;u++){t[g+5*n]=(u+1)*(u+2)/2%64;var x=(2*g+3*n)%5,g=n%5,n=x}for(g=0;5>g;g++)for(n=0;5>n;n++)w[g+5*n]=n+5*((2*g+3*n)%5);g=1;for(n=0;24>n;n++){for(var a=x=u=0;7>a;a++){if(g&1){var b=(1<<a)-1;32>b?x^=1<<b:u^=1<<b-32}g=g&128?g<<1^113:g<<1}r[n]=s.create(u,x)}for(var e=[],g=0;25>g;g++)e[g]=s.create();c=c.SHA3=v.extend({cfg:v.cfg.extend({outputLength:512}),_doReset:function(){for(var a=this._state=
+[],b=0;25>b;b++)a[b]=new s.init;this.blockSize=(1600-2*this.cfg.outputLength)/32},_doProcessBlock:function(a,b){for(var c=this._state,g=this.blockSize/2,k=0;k<g;k++){var d=a[b+2*k],l=a[b+2*k+1],d=(d<<8|d>>>24)&16711935|(d<<24|d>>>8)&4278255360,l=(l<<8|l>>>24)&16711935|(l<<24|l>>>8)&4278255360,h=c[k];h.high^=l;h.low^=d}for(g=0;24>g;g++){for(k=0;5>k;k++){for(var f=d=0,m=0;5>m;m++)h=c[k+5*m],d^=h.high,f^=h.low;h=e[k];h.high=d;h.low=f}for(k=0;5>k;k++){h=e[(k+4)%5];d=e[(k+1)%5];l=d.high;m=d.low;d=h.high^
+(l<<1|m>>>31);f=h.low^(m<<1|l>>>31);for(m=0;5>m;m++)h=c[k+5*m],h.high^=d,h.low^=f}for(l=1;25>l;l++)h=c[l],k=h.high,h=h.low,m=t[l],32>m?(d=k<<m|h>>>32-m,f=h<<m|k>>>32-m):(d=h<<m-32|k>>>64-m,f=k<<m-32|h>>>64-m),h=e[w[l]],h.high=d,h.low=f;h=e[0];k=c[0];h.high=k.high;h.low=k.low;for(k=0;5>k;k++)for(m=0;5>m;m++)l=k+5*m,h=c[l],d=e[l],l=e[(k+1)%5+5*m],f=e[(k+2)%5+5*m],h.high=d.high^~l.high&f.high,h.low=d.low^~l.low&f.low;h=c[0];k=r[g];h.high^=k.high;h.low^=k.low}},_doFinalize:function(){var a=this._data,
+b=a.words,c=8*a.sigBytes,e=32*this.blockSize;b[c>>>5]|=1<<24-c%32;b[(q.ceil((c+1)/e)*e>>>5)-1]|=128;a.sigBytes=4*b.length;this._process();for(var a=this._state,b=this.cfg.outputLength/8,c=b/8,e=[],g=0;g<c;g++){var f=a[g],l=f.high,f=f.low,l=(l<<8|l>>>24)&16711935|(l<<24|l>>>8)&4278255360,f=(f<<8|f>>>24)&16711935|(f<<24|f>>>8)&4278255360;e.push(f);e.push(l)}return new d.init(e,b)},clone:function(){for(var a=v.clone.call(this),b=a._state=this._state.slice(0),c=0;25>c;c++)b[c]=b[c].clone();return a}});
+f.SHA3=v._createHelper(c);f.HmacSHA3=v._createHmacHelper(c)})(Math);
+(function(){var q=CryptoJS,f=q.enc.Utf8;q.algo.HMAC=q.lib.Base.extend({init:function(c,d){c=this._hasher=new c.init;"string"==typeof d&&(d=f.parse(d));var q=c.blockSize,s=4*q;d.sigBytes>s&&(d=c.finalize(d));d.clamp();for(var t=this._oKey=d.clone(),w=this._iKey=d.clone(),r=t.words,g=w.words,n=0;n<q;n++)r[n]^=1549556828,g[n]^=909522486;t.sigBytes=w.sigBytes=s;this.reset()},reset:function(){var c=this._hasher;c.reset();c.update(this._iKey)},update:function(c){this._hasher.update(c);return this},finalize:function(c){var d=
+this._hasher;c=d.finalize(c);d.reset();return d.finalize(this._oKey.clone().concat(c))}})})();
diff --git a/library/cryptojs/rollups/hmac-sha384.js b/library/cryptojs/rollups/hmac-sha384.js
new file mode 100644
index 000000000..c9d4a0c72
--- /dev/null
+++ b/library/cryptojs/rollups/hmac-sha384.js
@@ -0,0 +1,27 @@
+/*
+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
+*/
+var CryptoJS=CryptoJS||function(a,d){var c={},b=c.lib={},f=function(){},l=b.Base={extend:function(a){f.prototype=this;var g=new f;a&&g.mixIn(a);g.hasOwnProperty("init")||(g.init=function(){g.$super.init.apply(this,arguments)});g.init.prototype=g;g.$super=this;return g},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var g in a)a.hasOwnProperty(g)&&(this[g]=a[g]);a.hasOwnProperty("toString")&&(this.toString=a.toString)},clone:function(){return this.init.prototype.extend(this)}},
+u=b.WordArray=l.extend({init:function(a,g){a=this.words=a||[];this.sigBytes=g!=d?g:4*a.length},toString:function(a){return(a||m).stringify(this)},concat:function(a){var g=this.words,c=a.words,e=this.sigBytes;a=a.sigBytes;this.clamp();if(e%4)for(var b=0;b<a;b++)g[e+b>>>2]|=(c[b>>>2]>>>24-8*(b%4)&255)<<24-8*((e+b)%4);else if(65535<c.length)for(b=0;b<a;b+=4)g[e+b>>>2]=c[b>>>2];else g.push.apply(g,c);this.sigBytes+=a;return this},clamp:function(){var C=this.words,g=this.sigBytes;C[g>>>2]&=4294967295<<
+32-8*(g%4);C.length=a.ceil(g/4)},clone:function(){var a=l.clone.call(this);a.words=this.words.slice(0);return a},random:function(C){for(var g=[],b=0;b<C;b+=4)g.push(4294967296*a.random()|0);return new u.init(g,C)}}),k=c.enc={},m=k.Hex={stringify:function(a){var g=a.words;a=a.sigBytes;for(var b=[],e=0;e<a;e++){var c=g[e>>>2]>>>24-8*(e%4)&255;b.push((c>>>4).toString(16));b.push((c&15).toString(16))}return b.join("")},parse:function(a){for(var b=a.length,c=[],e=0;e<b;e+=2)c[e>>>3]|=parseInt(a.substr(e,
+2),16)<<24-4*(e%8);return new u.init(c,b/2)}},x=k.Latin1={stringify:function(a){var b=a.words;a=a.sigBytes;for(var c=[],e=0;e<a;e++)c.push(String.fromCharCode(b[e>>>2]>>>24-8*(e%4)&255));return c.join("")},parse:function(a){for(var b=a.length,c=[],e=0;e<b;e++)c[e>>>2]|=(a.charCodeAt(e)&255)<<24-8*(e%4);return new u.init(c,b)}},y=k.Utf8={stringify:function(a){try{return decodeURIComponent(escape(x.stringify(a)))}catch(b){throw Error("Malformed UTF-8 data");}},parse:function(a){return x.parse(unescape(encodeURIComponent(a)))}},
+$=b.BufferedBlockAlgorithm=l.extend({reset:function(){this._data=new u.init;this._nDataBytes=0},_append:function(a){"string"==typeof a&&(a=y.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(b){var c=this._data,l=c.words,e=c.sigBytes,d=this.blockSize,f=e/(4*d),f=b?a.ceil(f):a.max((f|0)-this._minBufferSize,0);b=f*d;e=a.min(4*b,e);if(b){for(var k=0;k<b;k+=d)this._doProcessBlock(l,k);k=l.splice(0,b);c.sigBytes-=e}return new u.init(k,e)},clone:function(){var a=l.clone.call(this);
+a._data=this._data.clone();return a},_minBufferSize:0});b.Hasher=$.extend({cfg:l.extend(),init:function(a){this.cfg=this.cfg.extend(a);this.reset()},reset:function(){$.reset.call(this);this._doReset()},update:function(a){this._append(a);this._process();return this},finalize:function(a){a&&this._append(a);return this._doFinalize()},blockSize:16,_createHelper:function(a){return function(b,c){return(new a.init(c)).finalize(b)}},_createHmacHelper:function(a){return function(b,c){return(new ia.HMAC.init(a,
+c)).finalize(b)}}});var ia=c.algo={};return c}(Math);
+(function(a){var d=CryptoJS,c=d.lib,b=c.Base,f=c.WordArray,d=d.x64={};d.Word=b.extend({init:function(a,b){this.high=a;this.low=b}});d.WordArray=b.extend({init:function(b,c){b=this.words=b||[];this.sigBytes=c!=a?c:8*b.length},toX32:function(){for(var a=this.words,b=a.length,c=[],d=0;d<b;d++){var x=a[d];c.push(x.high);c.push(x.low)}return f.create(c,this.sigBytes)},clone:function(){for(var a=b.clone.call(this),c=a.words=this.words.slice(0),d=c.length,f=0;f<d;f++)c[f]=c[f].clone();return a}})})();
+(function(){function a(){return f.create.apply(f,arguments)}for(var d=CryptoJS,c=d.lib.Hasher,b=d.x64,f=b.Word,l=b.WordArray,b=d.algo,u=[a(1116352408,3609767458),a(1899447441,602891725),a(3049323471,3964484399),a(3921009573,2173295548),a(961987163,4081628472),a(1508970993,3053834265),a(2453635748,2937671579),a(2870763221,3664609560),a(3624381080,2734883394),a(310598401,1164996542),a(607225278,1323610764),a(1426881987,3590304994),a(1925078388,4068182383),a(2162078206,991336113),a(2614888103,633803317),
+a(3248222580,3479774868),a(3835390401,2666613458),a(4022224774,944711139),a(264347078,2341262773),a(604807628,2007800933),a(770255983,1495990901),a(1249150122,1856431235),a(1555081692,3175218132),a(1996064986,2198950837),a(2554220882,3999719339),a(2821834349,766784016),a(2952996808,2566594879),a(3210313671,3203337956),a(3336571891,1034457026),a(3584528711,2466948901),a(113926993,3758326383),a(338241895,168717936),a(666307205,1188179964),a(773529912,1546045734),a(1294757372,1522805485),a(1396182291,
+2643833823),a(1695183700,2343527390),a(1986661051,1014477480),a(2177026350,1206759142),a(2456956037,344077627),a(2730485921,1290863460),a(2820302411,3158454273),a(3259730800,3505952657),a(3345764771,106217008),a(3516065817,3606008344),a(3600352804,1432725776),a(4094571909,1467031594),a(275423344,851169720),a(430227734,3100823752),a(506948616,1363258195),a(659060556,3750685593),a(883997877,3785050280),a(958139571,3318307427),a(1322822218,3812723403),a(1537002063,2003034995),a(1747873779,3602036899),
+a(1955562222,1575990012),a(2024104815,1125592928),a(2227730452,2716904306),a(2361852424,442776044),a(2428436474,593698344),a(2756734187,3733110249),a(3204031479,2999351573),a(3329325298,3815920427),a(3391569614,3928383900),a(3515267271,566280711),a(3940187606,3454069534),a(4118630271,4000239992),a(116418474,1914138554),a(174292421,2731055270),a(289380356,3203993006),a(460393269,320620315),a(685471733,587496836),a(852142971,1086792851),a(1017036298,365543100),a(1126000580,2618297676),a(1288033470,
+3409855158),a(1501505948,4234509866),a(1607167915,987167468),a(1816402316,1246189591)],k=[],m=0;80>m;m++)k[m]=a();b=b.SHA512=c.extend({_doReset:function(){this._hash=new l.init([new f.init(1779033703,4089235720),new f.init(3144134277,2227873595),new f.init(1013904242,4271175723),new f.init(2773480762,1595750129),new f.init(1359893119,2917565137),new f.init(2600822924,725511199),new f.init(528734635,4215389547),new f.init(1541459225,327033209)])},_doProcessBlock:function(a,b){for(var c=this._hash.words,
+d=c[0],f=c[1],g=c[2],l=c[3],e=c[4],m=c[5],L=c[6],c=c[7],Z=d.high,M=d.low,aa=f.high,N=f.low,ba=g.high,O=g.low,ca=l.high,P=l.low,da=e.high,Q=e.low,ea=m.high,R=m.low,fa=L.high,S=L.low,ga=c.high,T=c.low,r=Z,n=M,F=aa,D=N,G=ba,E=O,W=ca,H=P,s=da,p=Q,U=ea,I=R,V=fa,J=S,X=ga,K=T,t=0;80>t;t++){var z=k[t];if(16>t)var q=z.high=a[b+2*t]|0,h=z.low=a[b+2*t+1]|0;else{var q=k[t-15],h=q.high,v=q.low,q=(h>>>1|v<<31)^(h>>>8|v<<24)^h>>>7,v=(v>>>1|h<<31)^(v>>>8|h<<24)^(v>>>7|h<<25),B=k[t-2],h=B.high,j=B.low,B=(h>>>19|j<<
+13)^(h<<3|j>>>29)^h>>>6,j=(j>>>19|h<<13)^(j<<3|h>>>29)^(j>>>6|h<<26),h=k[t-7],Y=h.high,A=k[t-16],w=A.high,A=A.low,h=v+h.low,q=q+Y+(h>>>0<v>>>0?1:0),h=h+j,q=q+B+(h>>>0<j>>>0?1:0),h=h+A,q=q+w+(h>>>0<A>>>0?1:0);z.high=q;z.low=h}var Y=s&U^~s&V,A=p&I^~p&J,z=r&F^r&G^F&G,ja=n&D^n&E^D&E,v=(r>>>28|n<<4)^(r<<30|n>>>2)^(r<<25|n>>>7),B=(n>>>28|r<<4)^(n<<30|r>>>2)^(n<<25|r>>>7),j=u[t],ka=j.high,ha=j.low,j=K+((p>>>14|s<<18)^(p>>>18|s<<14)^(p<<23|s>>>9)),w=X+((s>>>14|p<<18)^(s>>>18|p<<14)^(s<<23|p>>>9))+(j>>>0<
+K>>>0?1:0),j=j+A,w=w+Y+(j>>>0<A>>>0?1:0),j=j+ha,w=w+ka+(j>>>0<ha>>>0?1:0),j=j+h,w=w+q+(j>>>0<h>>>0?1:0),h=B+ja,z=v+z+(h>>>0<B>>>0?1:0),X=V,K=J,V=U,J=I,U=s,I=p,p=H+j|0,s=W+w+(p>>>0<H>>>0?1:0)|0,W=G,H=E,G=F,E=D,F=r,D=n,n=j+h|0,r=w+z+(n>>>0<j>>>0?1:0)|0}M=d.low=M+n;d.high=Z+r+(M>>>0<n>>>0?1:0);N=f.low=N+D;f.high=aa+F+(N>>>0<D>>>0?1:0);O=g.low=O+E;g.high=ba+G+(O>>>0<E>>>0?1:0);P=l.low=P+H;l.high=ca+W+(P>>>0<H>>>0?1:0);Q=e.low=Q+p;e.high=da+s+(Q>>>0<p>>>0?1:0);R=m.low=R+I;m.high=ea+U+(R>>>0<I>>>0?1:0);
+S=L.low=S+J;L.high=fa+V+(S>>>0<J>>>0?1:0);T=c.low=T+K;c.high=ga+X+(T>>>0<K>>>0?1:0)},_doFinalize:function(){var a=this._data,c=a.words,b=8*this._nDataBytes,d=8*a.sigBytes;c[d>>>5]|=128<<24-d%32;c[(d+128>>>10<<5)+30]=Math.floor(b/4294967296);c[(d+128>>>10<<5)+31]=b;a.sigBytes=4*c.length;this._process();return this._hash.toX32()},clone:function(){var a=c.clone.call(this);a._hash=this._hash.clone();return a},blockSize:32});d.SHA512=c._createHelper(b);d.HmacSHA512=c._createHmacHelper(b)})();
+(function(){var a=CryptoJS,d=a.x64,c=d.Word,b=d.WordArray,d=a.algo,f=d.SHA512,d=d.SHA384=f.extend({_doReset:function(){this._hash=new b.init([new c.init(3418070365,3238371032),new c.init(1654270250,914150663),new c.init(2438529370,812702999),new c.init(355462360,4144912697),new c.init(1731405415,4290775857),new c.init(2394180231,1750603025),new c.init(3675008525,1694076839),new c.init(1203062813,3204075428)])},_doFinalize:function(){var a=f._doFinalize.call(this);a.sigBytes-=16;return a}});a.SHA384=
+f._createHelper(d);a.HmacSHA384=f._createHmacHelper(d)})();
+(function(){var a=CryptoJS,d=a.enc.Utf8;a.algo.HMAC=a.lib.Base.extend({init:function(a,b){a=this._hasher=new a.init;"string"==typeof b&&(b=d.parse(b));var f=a.blockSize,l=4*f;b.sigBytes>l&&(b=a.finalize(b));b.clamp();for(var u=this._oKey=b.clone(),k=this._iKey=b.clone(),m=u.words,x=k.words,y=0;y<f;y++)m[y]^=1549556828,x[y]^=909522486;u.sigBytes=k.sigBytes=l;this.reset()},reset:function(){var a=this._hasher;a.reset();a.update(this._iKey)},update:function(a){this._hasher.update(a);return this},finalize:function(a){var b=
+this._hasher;a=b.finalize(a);b.reset();return b.finalize(this._oKey.clone().concat(a))}})})();
diff --git a/library/cryptojs/rollups/hmac-sha512.js b/library/cryptojs/rollups/hmac-sha512.js
new file mode 100644
index 000000000..5e5981fa9
--- /dev/null
+++ b/library/cryptojs/rollups/hmac-sha512.js
@@ -0,0 +1,25 @@
+/*
+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
+*/
+var CryptoJS=CryptoJS||function(a,j){var c={},b=c.lib={},f=function(){},l=b.Base={extend:function(a){f.prototype=this;var d=new f;a&&d.mixIn(a);d.hasOwnProperty("init")||(d.init=function(){d.$super.init.apply(this,arguments)});d.init.prototype=d;d.$super=this;return d},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var d in a)a.hasOwnProperty(d)&&(this[d]=a[d]);a.hasOwnProperty("toString")&&(this.toString=a.toString)},clone:function(){return this.init.prototype.extend(this)}},
+u=b.WordArray=l.extend({init:function(a,d){a=this.words=a||[];this.sigBytes=d!=j?d:4*a.length},toString:function(a){return(a||m).stringify(this)},concat:function(a){var d=this.words,M=a.words,e=this.sigBytes;a=a.sigBytes;this.clamp();if(e%4)for(var b=0;b<a;b++)d[e+b>>>2]|=(M[b>>>2]>>>24-8*(b%4)&255)<<24-8*((e+b)%4);else if(65535<M.length)for(b=0;b<a;b+=4)d[e+b>>>2]=M[b>>>2];else d.push.apply(d,M);this.sigBytes+=a;return this},clamp:function(){var D=this.words,d=this.sigBytes;D[d>>>2]&=4294967295<<
+32-8*(d%4);D.length=a.ceil(d/4)},clone:function(){var a=l.clone.call(this);a.words=this.words.slice(0);return a},random:function(D){for(var d=[],b=0;b<D;b+=4)d.push(4294967296*a.random()|0);return new u.init(d,D)}}),k=c.enc={},m=k.Hex={stringify:function(a){var d=a.words;a=a.sigBytes;for(var b=[],e=0;e<a;e++){var c=d[e>>>2]>>>24-8*(e%4)&255;b.push((c>>>4).toString(16));b.push((c&15).toString(16))}return b.join("")},parse:function(a){for(var d=a.length,b=[],e=0;e<d;e+=2)b[e>>>3]|=parseInt(a.substr(e,
+2),16)<<24-4*(e%8);return new u.init(b,d/2)}},y=k.Latin1={stringify:function(a){var b=a.words;a=a.sigBytes;for(var c=[],e=0;e<a;e++)c.push(String.fromCharCode(b[e>>>2]>>>24-8*(e%4)&255));return c.join("")},parse:function(a){for(var b=a.length,c=[],e=0;e<b;e++)c[e>>>2]|=(a.charCodeAt(e)&255)<<24-8*(e%4);return new u.init(c,b)}},z=k.Utf8={stringify:function(a){try{return decodeURIComponent(escape(y.stringify(a)))}catch(b){throw Error("Malformed UTF-8 data");}},parse:function(a){return y.parse(unescape(encodeURIComponent(a)))}},
+x=b.BufferedBlockAlgorithm=l.extend({reset:function(){this._data=new u.init;this._nDataBytes=0},_append:function(a){"string"==typeof a&&(a=z.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(b){var d=this._data,c=d.words,e=d.sigBytes,l=this.blockSize,k=e/(4*l),k=b?a.ceil(k):a.max((k|0)-this._minBufferSize,0);b=k*l;e=a.min(4*b,e);if(b){for(var x=0;x<b;x+=l)this._doProcessBlock(c,x);x=c.splice(0,b);d.sigBytes-=e}return new u.init(x,e)},clone:function(){var a=l.clone.call(this);
+a._data=this._data.clone();return a},_minBufferSize:0});b.Hasher=x.extend({cfg:l.extend(),init:function(a){this.cfg=this.cfg.extend(a);this.reset()},reset:function(){x.reset.call(this);this._doReset()},update:function(a){this._append(a);this._process();return this},finalize:function(a){a&&this._append(a);return this._doFinalize()},blockSize:16,_createHelper:function(a){return function(b,c){return(new a.init(c)).finalize(b)}},_createHmacHelper:function(a){return function(b,c){return(new ja.HMAC.init(a,
+c)).finalize(b)}}});var ja=c.algo={};return c}(Math);
+(function(a){var j=CryptoJS,c=j.lib,b=c.Base,f=c.WordArray,j=j.x64={};j.Word=b.extend({init:function(a,b){this.high=a;this.low=b}});j.WordArray=b.extend({init:function(b,c){b=this.words=b||[];this.sigBytes=c!=a?c:8*b.length},toX32:function(){for(var a=this.words,b=a.length,c=[],m=0;m<b;m++){var y=a[m];c.push(y.high);c.push(y.low)}return f.create(c,this.sigBytes)},clone:function(){for(var a=b.clone.call(this),c=a.words=this.words.slice(0),k=c.length,f=0;f<k;f++)c[f]=c[f].clone();return a}})})();
+(function(){function a(){return f.create.apply(f,arguments)}for(var j=CryptoJS,c=j.lib.Hasher,b=j.x64,f=b.Word,l=b.WordArray,b=j.algo,u=[a(1116352408,3609767458),a(1899447441,602891725),a(3049323471,3964484399),a(3921009573,2173295548),a(961987163,4081628472),a(1508970993,3053834265),a(2453635748,2937671579),a(2870763221,3664609560),a(3624381080,2734883394),a(310598401,1164996542),a(607225278,1323610764),a(1426881987,3590304994),a(1925078388,4068182383),a(2162078206,991336113),a(2614888103,633803317),
+a(3248222580,3479774868),a(3835390401,2666613458),a(4022224774,944711139),a(264347078,2341262773),a(604807628,2007800933),a(770255983,1495990901),a(1249150122,1856431235),a(1555081692,3175218132),a(1996064986,2198950837),a(2554220882,3999719339),a(2821834349,766784016),a(2952996808,2566594879),a(3210313671,3203337956),a(3336571891,1034457026),a(3584528711,2466948901),a(113926993,3758326383),a(338241895,168717936),a(666307205,1188179964),a(773529912,1546045734),a(1294757372,1522805485),a(1396182291,
+2643833823),a(1695183700,2343527390),a(1986661051,1014477480),a(2177026350,1206759142),a(2456956037,344077627),a(2730485921,1290863460),a(2820302411,3158454273),a(3259730800,3505952657),a(3345764771,106217008),a(3516065817,3606008344),a(3600352804,1432725776),a(4094571909,1467031594),a(275423344,851169720),a(430227734,3100823752),a(506948616,1363258195),a(659060556,3750685593),a(883997877,3785050280),a(958139571,3318307427),a(1322822218,3812723403),a(1537002063,2003034995),a(1747873779,3602036899),
+a(1955562222,1575990012),a(2024104815,1125592928),a(2227730452,2716904306),a(2361852424,442776044),a(2428436474,593698344),a(2756734187,3733110249),a(3204031479,2999351573),a(3329325298,3815920427),a(3391569614,3928383900),a(3515267271,566280711),a(3940187606,3454069534),a(4118630271,4000239992),a(116418474,1914138554),a(174292421,2731055270),a(289380356,3203993006),a(460393269,320620315),a(685471733,587496836),a(852142971,1086792851),a(1017036298,365543100),a(1126000580,2618297676),a(1288033470,
+3409855158),a(1501505948,4234509866),a(1607167915,987167468),a(1816402316,1246189591)],k=[],m=0;80>m;m++)k[m]=a();b=b.SHA512=c.extend({_doReset:function(){this._hash=new l.init([new f.init(1779033703,4089235720),new f.init(3144134277,2227873595),new f.init(1013904242,4271175723),new f.init(2773480762,1595750129),new f.init(1359893119,2917565137),new f.init(2600822924,725511199),new f.init(528734635,4215389547),new f.init(1541459225,327033209)])},_doProcessBlock:function(a,b){for(var c=this._hash.words,
+f=c[0],j=c[1],d=c[2],l=c[3],e=c[4],m=c[5],N=c[6],c=c[7],aa=f.high,O=f.low,ba=j.high,P=j.low,ca=d.high,Q=d.low,da=l.high,R=l.low,ea=e.high,S=e.low,fa=m.high,T=m.low,ga=N.high,U=N.low,ha=c.high,V=c.low,r=aa,n=O,G=ba,E=P,H=ca,F=Q,Y=da,I=R,s=ea,p=S,W=fa,J=T,X=ga,K=U,Z=ha,L=V,t=0;80>t;t++){var A=k[t];if(16>t)var q=A.high=a[b+2*t]|0,g=A.low=a[b+2*t+1]|0;else{var q=k[t-15],g=q.high,v=q.low,q=(g>>>1|v<<31)^(g>>>8|v<<24)^g>>>7,v=(v>>>1|g<<31)^(v>>>8|g<<24)^(v>>>7|g<<25),C=k[t-2],g=C.high,h=C.low,C=(g>>>19|
+h<<13)^(g<<3|h>>>29)^g>>>6,h=(h>>>19|g<<13)^(h<<3|g>>>29)^(h>>>6|g<<26),g=k[t-7],$=g.high,B=k[t-16],w=B.high,B=B.low,g=v+g.low,q=q+$+(g>>>0<v>>>0?1:0),g=g+h,q=q+C+(g>>>0<h>>>0?1:0),g=g+B,q=q+w+(g>>>0<B>>>0?1:0);A.high=q;A.low=g}var $=s&W^~s&X,B=p&J^~p&K,A=r&G^r&H^G&H,ka=n&E^n&F^E&F,v=(r>>>28|n<<4)^(r<<30|n>>>2)^(r<<25|n>>>7),C=(n>>>28|r<<4)^(n<<30|r>>>2)^(n<<25|r>>>7),h=u[t],la=h.high,ia=h.low,h=L+((p>>>14|s<<18)^(p>>>18|s<<14)^(p<<23|s>>>9)),w=Z+((s>>>14|p<<18)^(s>>>18|p<<14)^(s<<23|p>>>9))+(h>>>
+0<L>>>0?1:0),h=h+B,w=w+$+(h>>>0<B>>>0?1:0),h=h+ia,w=w+la+(h>>>0<ia>>>0?1:0),h=h+g,w=w+q+(h>>>0<g>>>0?1:0),g=C+ka,A=v+A+(g>>>0<C>>>0?1:0),Z=X,L=K,X=W,K=J,W=s,J=p,p=I+h|0,s=Y+w+(p>>>0<I>>>0?1:0)|0,Y=H,I=F,H=G,F=E,G=r,E=n,n=h+g|0,r=w+A+(n>>>0<h>>>0?1:0)|0}O=f.low=O+n;f.high=aa+r+(O>>>0<n>>>0?1:0);P=j.low=P+E;j.high=ba+G+(P>>>0<E>>>0?1:0);Q=d.low=Q+F;d.high=ca+H+(Q>>>0<F>>>0?1:0);R=l.low=R+I;l.high=da+Y+(R>>>0<I>>>0?1:0);S=e.low=S+p;e.high=ea+s+(S>>>0<p>>>0?1:0);T=m.low=T+J;m.high=fa+W+(T>>>0<J>>>0?1:
+0);U=N.low=U+K;N.high=ga+X+(U>>>0<K>>>0?1:0);V=c.low=V+L;c.high=ha+Z+(V>>>0<L>>>0?1:0)},_doFinalize:function(){var a=this._data,b=a.words,c=8*this._nDataBytes,f=8*a.sigBytes;b[f>>>5]|=128<<24-f%32;b[(f+128>>>10<<5)+30]=Math.floor(c/4294967296);b[(f+128>>>10<<5)+31]=c;a.sigBytes=4*b.length;this._process();return this._hash.toX32()},clone:function(){var a=c.clone.call(this);a._hash=this._hash.clone();return a},blockSize:32});j.SHA512=c._createHelper(b);j.HmacSHA512=c._createHmacHelper(b)})();
+(function(){var a=CryptoJS,j=a.enc.Utf8;a.algo.HMAC=a.lib.Base.extend({init:function(a,b){a=this._hasher=new a.init;"string"==typeof b&&(b=j.parse(b));var f=a.blockSize,l=4*f;b.sigBytes>l&&(b=a.finalize(b));b.clamp();for(var u=this._oKey=b.clone(),k=this._iKey=b.clone(),m=u.words,y=k.words,z=0;z<f;z++)m[z]^=1549556828,y[z]^=909522486;u.sigBytes=k.sigBytes=l;this.reset()},reset:function(){var a=this._hasher;a.reset();a.update(this._iKey)},update:function(a){this._hasher.update(a);return this},finalize:function(a){var b=
+this._hasher;a=b.finalize(a);b.reset();return b.finalize(this._oKey.clone().concat(a))}})})();
diff --git a/library/cryptojs/rollups/md5.js b/library/cryptojs/rollups/md5.js
new file mode 100644
index 000000000..0fae5ca1d
--- /dev/null
+++ b/library/cryptojs/rollups/md5.js
@@ -0,0 +1,19 @@
+/*
+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
+*/
+var CryptoJS=CryptoJS||function(s,p){var m={},l=m.lib={},n=function(){},r=l.Base={extend:function(b){n.prototype=this;var h=new n;b&&h.mixIn(b);h.hasOwnProperty("init")||(h.init=function(){h.$super.init.apply(this,arguments)});h.init.prototype=h;h.$super=this;return h},create:function(){var b=this.extend();b.init.apply(b,arguments);return b},init:function(){},mixIn:function(b){for(var h in b)b.hasOwnProperty(h)&&(this[h]=b[h]);b.hasOwnProperty("toString")&&(this.toString=b.toString)},clone:function(){return this.init.prototype.extend(this)}},
+q=l.WordArray=r.extend({init:function(b,h){b=this.words=b||[];this.sigBytes=h!=p?h:4*b.length},toString:function(b){return(b||t).stringify(this)},concat:function(b){var h=this.words,a=b.words,j=this.sigBytes;b=b.sigBytes;this.clamp();if(j%4)for(var g=0;g<b;g++)h[j+g>>>2]|=(a[g>>>2]>>>24-8*(g%4)&255)<<24-8*((j+g)%4);else if(65535<a.length)for(g=0;g<b;g+=4)h[j+g>>>2]=a[g>>>2];else h.push.apply(h,a);this.sigBytes+=b;return this},clamp:function(){var b=this.words,h=this.sigBytes;b[h>>>2]&=4294967295<<
+32-8*(h%4);b.length=s.ceil(h/4)},clone:function(){var b=r.clone.call(this);b.words=this.words.slice(0);return b},random:function(b){for(var h=[],a=0;a<b;a+=4)h.push(4294967296*s.random()|0);return new q.init(h,b)}}),v=m.enc={},t=v.Hex={stringify:function(b){var a=b.words;b=b.sigBytes;for(var g=[],j=0;j<b;j++){var k=a[j>>>2]>>>24-8*(j%4)&255;g.push((k>>>4).toString(16));g.push((k&15).toString(16))}return g.join("")},parse:function(b){for(var a=b.length,g=[],j=0;j<a;j+=2)g[j>>>3]|=parseInt(b.substr(j,
+2),16)<<24-4*(j%8);return new q.init(g,a/2)}},a=v.Latin1={stringify:function(b){var a=b.words;b=b.sigBytes;for(var g=[],j=0;j<b;j++)g.push(String.fromCharCode(a[j>>>2]>>>24-8*(j%4)&255));return g.join("")},parse:function(b){for(var a=b.length,g=[],j=0;j<a;j++)g[j>>>2]|=(b.charCodeAt(j)&255)<<24-8*(j%4);return new q.init(g,a)}},u=v.Utf8={stringify:function(b){try{return decodeURIComponent(escape(a.stringify(b)))}catch(g){throw Error("Malformed UTF-8 data");}},parse:function(b){return a.parse(unescape(encodeURIComponent(b)))}},
+g=l.BufferedBlockAlgorithm=r.extend({reset:function(){this._data=new q.init;this._nDataBytes=0},_append:function(b){"string"==typeof b&&(b=u.parse(b));this._data.concat(b);this._nDataBytes+=b.sigBytes},_process:function(b){var a=this._data,g=a.words,j=a.sigBytes,k=this.blockSize,m=j/(4*k),m=b?s.ceil(m):s.max((m|0)-this._minBufferSize,0);b=m*k;j=s.min(4*b,j);if(b){for(var l=0;l<b;l+=k)this._doProcessBlock(g,l);l=g.splice(0,b);a.sigBytes-=j}return new q.init(l,j)},clone:function(){var b=r.clone.call(this);
+b._data=this._data.clone();return b},_minBufferSize:0});l.Hasher=g.extend({cfg:r.extend(),init:function(b){this.cfg=this.cfg.extend(b);this.reset()},reset:function(){g.reset.call(this);this._doReset()},update:function(b){this._append(b);this._process();return this},finalize:function(b){b&&this._append(b);return this._doFinalize()},blockSize:16,_createHelper:function(b){return function(a,g){return(new b.init(g)).finalize(a)}},_createHmacHelper:function(b){return function(a,g){return(new k.HMAC.init(b,
+g)).finalize(a)}}});var k=m.algo={};return m}(Math);
+(function(s){function p(a,k,b,h,l,j,m){a=a+(k&b|~k&h)+l+m;return(a<<j|a>>>32-j)+k}function m(a,k,b,h,l,j,m){a=a+(k&h|b&~h)+l+m;return(a<<j|a>>>32-j)+k}function l(a,k,b,h,l,j,m){a=a+(k^b^h)+l+m;return(a<<j|a>>>32-j)+k}function n(a,k,b,h,l,j,m){a=a+(b^(k|~h))+l+m;return(a<<j|a>>>32-j)+k}for(var r=CryptoJS,q=r.lib,v=q.WordArray,t=q.Hasher,q=r.algo,a=[],u=0;64>u;u++)a[u]=4294967296*s.abs(s.sin(u+1))|0;q=q.MD5=t.extend({_doReset:function(){this._hash=new v.init([1732584193,4023233417,2562383102,271733878])},
+_doProcessBlock:function(g,k){for(var b=0;16>b;b++){var h=k+b,w=g[h];g[h]=(w<<8|w>>>24)&16711935|(w<<24|w>>>8)&4278255360}var b=this._hash.words,h=g[k+0],w=g[k+1],j=g[k+2],q=g[k+3],r=g[k+4],s=g[k+5],t=g[k+6],u=g[k+7],v=g[k+8],x=g[k+9],y=g[k+10],z=g[k+11],A=g[k+12],B=g[k+13],C=g[k+14],D=g[k+15],c=b[0],d=b[1],e=b[2],f=b[3],c=p(c,d,e,f,h,7,a[0]),f=p(f,c,d,e,w,12,a[1]),e=p(e,f,c,d,j,17,a[2]),d=p(d,e,f,c,q,22,a[3]),c=p(c,d,e,f,r,7,a[4]),f=p(f,c,d,e,s,12,a[5]),e=p(e,f,c,d,t,17,a[6]),d=p(d,e,f,c,u,22,a[7]),
+c=p(c,d,e,f,v,7,a[8]),f=p(f,c,d,e,x,12,a[9]),e=p(e,f,c,d,y,17,a[10]),d=p(d,e,f,c,z,22,a[11]),c=p(c,d,e,f,A,7,a[12]),f=p(f,c,d,e,B,12,a[13]),e=p(e,f,c,d,C,17,a[14]),d=p(d,e,f,c,D,22,a[15]),c=m(c,d,e,f,w,5,a[16]),f=m(f,c,d,e,t,9,a[17]),e=m(e,f,c,d,z,14,a[18]),d=m(d,e,f,c,h,20,a[19]),c=m(c,d,e,f,s,5,a[20]),f=m(f,c,d,e,y,9,a[21]),e=m(e,f,c,d,D,14,a[22]),d=m(d,e,f,c,r,20,a[23]),c=m(c,d,e,f,x,5,a[24]),f=m(f,c,d,e,C,9,a[25]),e=m(e,f,c,d,q,14,a[26]),d=m(d,e,f,c,v,20,a[27]),c=m(c,d,e,f,B,5,a[28]),f=m(f,c,
+d,e,j,9,a[29]),e=m(e,f,c,d,u,14,a[30]),d=m(d,e,f,c,A,20,a[31]),c=l(c,d,e,f,s,4,a[32]),f=l(f,c,d,e,v,11,a[33]),e=l(e,f,c,d,z,16,a[34]),d=l(d,e,f,c,C,23,a[35]),c=l(c,d,e,f,w,4,a[36]),f=l(f,c,d,e,r,11,a[37]),e=l(e,f,c,d,u,16,a[38]),d=l(d,e,f,c,y,23,a[39]),c=l(c,d,e,f,B,4,a[40]),f=l(f,c,d,e,h,11,a[41]),e=l(e,f,c,d,q,16,a[42]),d=l(d,e,f,c,t,23,a[43]),c=l(c,d,e,f,x,4,a[44]),f=l(f,c,d,e,A,11,a[45]),e=l(e,f,c,d,D,16,a[46]),d=l(d,e,f,c,j,23,a[47]),c=n(c,d,e,f,h,6,a[48]),f=n(f,c,d,e,u,10,a[49]),e=n(e,f,c,d,
+C,15,a[50]),d=n(d,e,f,c,s,21,a[51]),c=n(c,d,e,f,A,6,a[52]),f=n(f,c,d,e,q,10,a[53]),e=n(e,f,c,d,y,15,a[54]),d=n(d,e,f,c,w,21,a[55]),c=n(c,d,e,f,v,6,a[56]),f=n(f,c,d,e,D,10,a[57]),e=n(e,f,c,d,t,15,a[58]),d=n(d,e,f,c,B,21,a[59]),c=n(c,d,e,f,r,6,a[60]),f=n(f,c,d,e,z,10,a[61]),e=n(e,f,c,d,j,15,a[62]),d=n(d,e,f,c,x,21,a[63]);b[0]=b[0]+c|0;b[1]=b[1]+d|0;b[2]=b[2]+e|0;b[3]=b[3]+f|0},_doFinalize:function(){var a=this._data,k=a.words,b=8*this._nDataBytes,h=8*a.sigBytes;k[h>>>5]|=128<<24-h%32;var l=s.floor(b/
+4294967296);k[(h+64>>>9<<4)+15]=(l<<8|l>>>24)&16711935|(l<<24|l>>>8)&4278255360;k[(h+64>>>9<<4)+14]=(b<<8|b>>>24)&16711935|(b<<24|b>>>8)&4278255360;a.sigBytes=4*(k.length+1);this._process();a=this._hash;k=a.words;for(b=0;4>b;b++)h=k[b],k[b]=(h<<8|h>>>24)&16711935|(h<<24|h>>>8)&4278255360;return a},clone:function(){var a=t.clone.call(this);a._hash=this._hash.clone();return a}});r.MD5=t._createHelper(q);r.HmacMD5=t._createHmacHelper(q)})(Math);
diff --git a/library/cryptojs/rollups/pbkdf2.js b/library/cryptojs/rollups/pbkdf2.js
new file mode 100644
index 000000000..fdc7b4fe9
--- /dev/null
+++ b/library/cryptojs/rollups/pbkdf2.js
@@ -0,0 +1,19 @@
+/*
+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
+*/
+var CryptoJS=CryptoJS||function(g,j){var e={},d=e.lib={},m=function(){},n=d.Base={extend:function(a){m.prototype=this;var c=new m;a&&c.mixIn(a);c.hasOwnProperty("init")||(c.init=function(){c.$super.init.apply(this,arguments)});c.init.prototype=c;c.$super=this;return c},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var c in a)a.hasOwnProperty(c)&&(this[c]=a[c]);a.hasOwnProperty("toString")&&(this.toString=a.toString)},clone:function(){return this.init.prototype.extend(this)}},
+q=d.WordArray=n.extend({init:function(a,c){a=this.words=a||[];this.sigBytes=c!=j?c:4*a.length},toString:function(a){return(a||l).stringify(this)},concat:function(a){var c=this.words,p=a.words,f=this.sigBytes;a=a.sigBytes;this.clamp();if(f%4)for(var b=0;b<a;b++)c[f+b>>>2]|=(p[b>>>2]>>>24-8*(b%4)&255)<<24-8*((f+b)%4);else if(65535<p.length)for(b=0;b<a;b+=4)c[f+b>>>2]=p[b>>>2];else c.push.apply(c,p);this.sigBytes+=a;return this},clamp:function(){var a=this.words,c=this.sigBytes;a[c>>>2]&=4294967295<<
+32-8*(c%4);a.length=g.ceil(c/4)},clone:function(){var a=n.clone.call(this);a.words=this.words.slice(0);return a},random:function(a){for(var c=[],b=0;b<a;b+=4)c.push(4294967296*g.random()|0);return new q.init(c,a)}}),b=e.enc={},l=b.Hex={stringify:function(a){var c=a.words;a=a.sigBytes;for(var b=[],f=0;f<a;f++){var d=c[f>>>2]>>>24-8*(f%4)&255;b.push((d>>>4).toString(16));b.push((d&15).toString(16))}return b.join("")},parse:function(a){for(var c=a.length,b=[],f=0;f<c;f+=2)b[f>>>3]|=parseInt(a.substr(f,
+2),16)<<24-4*(f%8);return new q.init(b,c/2)}},k=b.Latin1={stringify:function(a){var c=a.words;a=a.sigBytes;for(var b=[],f=0;f<a;f++)b.push(String.fromCharCode(c[f>>>2]>>>24-8*(f%4)&255));return b.join("")},parse:function(a){for(var c=a.length,b=[],f=0;f<c;f++)b[f>>>2]|=(a.charCodeAt(f)&255)<<24-8*(f%4);return new q.init(b,c)}},h=b.Utf8={stringify:function(a){try{return decodeURIComponent(escape(k.stringify(a)))}catch(b){throw Error("Malformed UTF-8 data");}},parse:function(a){return k.parse(unescape(encodeURIComponent(a)))}},
+u=d.BufferedBlockAlgorithm=n.extend({reset:function(){this._data=new q.init;this._nDataBytes=0},_append:function(a){"string"==typeof a&&(a=h.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(a){var b=this._data,d=b.words,f=b.sigBytes,l=this.blockSize,e=f/(4*l),e=a?g.ceil(e):g.max((e|0)-this._minBufferSize,0);a=e*l;f=g.min(4*a,f);if(a){for(var h=0;h<a;h+=l)this._doProcessBlock(d,h);h=d.splice(0,a);b.sigBytes-=f}return new q.init(h,f)},clone:function(){var a=n.clone.call(this);
+a._data=this._data.clone();return a},_minBufferSize:0});d.Hasher=u.extend({cfg:n.extend(),init:function(a){this.cfg=this.cfg.extend(a);this.reset()},reset:function(){u.reset.call(this);this._doReset()},update:function(a){this._append(a);this._process();return this},finalize:function(a){a&&this._append(a);return this._doFinalize()},blockSize:16,_createHelper:function(a){return function(b,d){return(new a.init(d)).finalize(b)}},_createHmacHelper:function(a){return function(b,d){return(new w.HMAC.init(a,
+d)).finalize(b)}}});var w=e.algo={};return e}(Math);
+(function(){var g=CryptoJS,j=g.lib,e=j.WordArray,d=j.Hasher,m=[],j=g.algo.SHA1=d.extend({_doReset:function(){this._hash=new e.init([1732584193,4023233417,2562383102,271733878,3285377520])},_doProcessBlock:function(d,e){for(var b=this._hash.words,l=b[0],k=b[1],h=b[2],g=b[3],j=b[4],a=0;80>a;a++){if(16>a)m[a]=d[e+a]|0;else{var c=m[a-3]^m[a-8]^m[a-14]^m[a-16];m[a]=c<<1|c>>>31}c=(l<<5|l>>>27)+j+m[a];c=20>a?c+((k&h|~k&g)+1518500249):40>a?c+((k^h^g)+1859775393):60>a?c+((k&h|k&g|h&g)-1894007588):c+((k^h^
+g)-899497514);j=g;g=h;h=k<<30|k>>>2;k=l;l=c}b[0]=b[0]+l|0;b[1]=b[1]+k|0;b[2]=b[2]+h|0;b[3]=b[3]+g|0;b[4]=b[4]+j|0},_doFinalize:function(){var d=this._data,e=d.words,b=8*this._nDataBytes,l=8*d.sigBytes;e[l>>>5]|=128<<24-l%32;e[(l+64>>>9<<4)+14]=Math.floor(b/4294967296);e[(l+64>>>9<<4)+15]=b;d.sigBytes=4*e.length;this._process();return this._hash},clone:function(){var e=d.clone.call(this);e._hash=this._hash.clone();return e}});g.SHA1=d._createHelper(j);g.HmacSHA1=d._createHmacHelper(j)})();
+(function(){var g=CryptoJS,j=g.enc.Utf8;g.algo.HMAC=g.lib.Base.extend({init:function(e,d){e=this._hasher=new e.init;"string"==typeof d&&(d=j.parse(d));var g=e.blockSize,n=4*g;d.sigBytes>n&&(d=e.finalize(d));d.clamp();for(var q=this._oKey=d.clone(),b=this._iKey=d.clone(),l=q.words,k=b.words,h=0;h<g;h++)l[h]^=1549556828,k[h]^=909522486;q.sigBytes=b.sigBytes=n;this.reset()},reset:function(){var e=this._hasher;e.reset();e.update(this._iKey)},update:function(e){this._hasher.update(e);return this},finalize:function(e){var d=
+this._hasher;e=d.finalize(e);d.reset();return d.finalize(this._oKey.clone().concat(e))}})})();
+(function(){var g=CryptoJS,j=g.lib,e=j.Base,d=j.WordArray,j=g.algo,m=j.HMAC,n=j.PBKDF2=e.extend({cfg:e.extend({keySize:4,hasher:j.SHA1,iterations:1}),init:function(d){this.cfg=this.cfg.extend(d)},compute:function(e,b){for(var g=this.cfg,k=m.create(g.hasher,e),h=d.create(),j=d.create([1]),n=h.words,a=j.words,c=g.keySize,g=g.iterations;n.length<c;){var p=k.update(b).finalize(j);k.reset();for(var f=p.words,v=f.length,s=p,t=1;t<g;t++){s=k.finalize(s);k.reset();for(var x=s.words,r=0;r<v;r++)f[r]^=x[r]}h.concat(p);
+a[0]++}h.sigBytes=4*c;return h}});g.PBKDF2=function(d,b,e){return n.create(e).compute(d,b)}})();
diff --git a/library/cryptojs/rollups/rabbit-legacy.js b/library/cryptojs/rollups/rabbit-legacy.js
new file mode 100644
index 000000000..2697c3da0
--- /dev/null
+++ b/library/cryptojs/rollups/rabbit-legacy.js
@@ -0,0 +1,36 @@
+/*
+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
+*/
+var CryptoJS=CryptoJS||function(q,k){var e={},l=e.lib={},p=function(){},c=l.Base={extend:function(a){p.prototype=this;var b=new p;a&&b.mixIn(a);b.hasOwnProperty("init")||(b.init=function(){b.$super.init.apply(this,arguments)});b.init.prototype=b;b.$super=this;return b},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var b in a)a.hasOwnProperty(b)&&(this[b]=a[b]);a.hasOwnProperty("toString")&&(this.toString=a.toString)},clone:function(){return this.init.prototype.extend(this)}},
+s=l.WordArray=c.extend({init:function(a,b){a=this.words=a||[];this.sigBytes=b!=k?b:4*a.length},toString:function(a){return(a||d).stringify(this)},concat:function(a){var b=this.words,m=a.words,n=this.sigBytes;a=a.sigBytes;this.clamp();if(n%4)for(var r=0;r<a;r++)b[n+r>>>2]|=(m[r>>>2]>>>24-8*(r%4)&255)<<24-8*((n+r)%4);else if(65535<m.length)for(r=0;r<a;r+=4)b[n+r>>>2]=m[r>>>2];else b.push.apply(b,m);this.sigBytes+=a;return this},clamp:function(){var a=this.words,b=this.sigBytes;a[b>>>2]&=4294967295<<
+32-8*(b%4);a.length=q.ceil(b/4)},clone:function(){var a=c.clone.call(this);a.words=this.words.slice(0);return a},random:function(a){for(var b=[],m=0;m<a;m+=4)b.push(4294967296*q.random()|0);return new s.init(b,a)}}),b=e.enc={},d=b.Hex={stringify:function(a){var b=a.words;a=a.sigBytes;for(var m=[],n=0;n<a;n++){var r=b[n>>>2]>>>24-8*(n%4)&255;m.push((r>>>4).toString(16));m.push((r&15).toString(16))}return m.join("")},parse:function(a){for(var b=a.length,m=[],n=0;n<b;n+=2)m[n>>>3]|=parseInt(a.substr(n,
+2),16)<<24-4*(n%8);return new s.init(m,b/2)}},a=b.Latin1={stringify:function(a){var b=a.words;a=a.sigBytes;for(var m=[],n=0;n<a;n++)m.push(String.fromCharCode(b[n>>>2]>>>24-8*(n%4)&255));return m.join("")},parse:function(a){for(var b=a.length,m=[],n=0;n<b;n++)m[n>>>2]|=(a.charCodeAt(n)&255)<<24-8*(n%4);return new s.init(m,b)}},t=b.Utf8={stringify:function(b){try{return decodeURIComponent(escape(a.stringify(b)))}catch(c){throw Error("Malformed UTF-8 data");}},parse:function(b){return a.parse(unescape(encodeURIComponent(b)))}},
+u=l.BufferedBlockAlgorithm=c.extend({reset:function(){this._data=new s.init;this._nDataBytes=0},_append:function(a){"string"==typeof a&&(a=t.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(a){var b=this._data,m=b.words,n=b.sigBytes,r=this.blockSize,c=n/(4*r),c=a?q.ceil(c):q.max((c|0)-this._minBufferSize,0);a=c*r;n=q.min(4*a,n);if(a){for(var u=0;u<a;u+=r)this._doProcessBlock(m,u);u=m.splice(0,a);b.sigBytes-=n}return new s.init(u,n)},clone:function(){var a=c.clone.call(this);
+a._data=this._data.clone();return a},_minBufferSize:0});l.Hasher=u.extend({cfg:c.extend(),init:function(a){this.cfg=this.cfg.extend(a);this.reset()},reset:function(){u.reset.call(this);this._doReset()},update:function(a){this._append(a);this._process();return this},finalize:function(a){a&&this._append(a);return this._doFinalize()},blockSize:16,_createHelper:function(a){return function(b,m){return(new a.init(m)).finalize(b)}},_createHmacHelper:function(a){return function(b,m){return(new w.HMAC.init(a,
+m)).finalize(b)}}});var w=e.algo={};return e}(Math);
+(function(){var q=CryptoJS,k=q.lib.WordArray;q.enc.Base64={stringify:function(e){var l=e.words,p=e.sigBytes,c=this._map;e.clamp();e=[];for(var k=0;k<p;k+=3)for(var b=(l[k>>>2]>>>24-8*(k%4)&255)<<16|(l[k+1>>>2]>>>24-8*((k+1)%4)&255)<<8|l[k+2>>>2]>>>24-8*((k+2)%4)&255,d=0;4>d&&k+0.75*d<p;d++)e.push(c.charAt(b>>>6*(3-d)&63));if(l=c.charAt(64))for(;e.length%4;)e.push(l);return e.join("")},parse:function(e){var l=e.length,p=this._map,c=p.charAt(64);c&&(c=e.indexOf(c),-1!=c&&(l=c));for(var c=[],s=0,b=0;b<
+l;b++)if(b%4){var d=p.indexOf(e.charAt(b-1))<<2*(b%4),a=p.indexOf(e.charAt(b))>>>6-2*(b%4);c[s>>>2]|=(d|a)<<24-8*(s%4);s++}return k.create(c,s)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="}})();
+(function(q){function k(a,b,c,d,m,n,r){a=a+(b&c|~b&d)+m+r;return(a<<n|a>>>32-n)+b}function e(a,b,c,d,m,n,r){a=a+(b&d|c&~d)+m+r;return(a<<n|a>>>32-n)+b}function l(a,b,c,d,m,n,r){a=a+(b^c^d)+m+r;return(a<<n|a>>>32-n)+b}function p(a,b,c,d,m,n,r){a=a+(c^(b|~d))+m+r;return(a<<n|a>>>32-n)+b}for(var c=CryptoJS,s=c.lib,b=s.WordArray,d=s.Hasher,s=c.algo,a=[],t=0;64>t;t++)a[t]=4294967296*q.abs(q.sin(t+1))|0;s=s.MD5=d.extend({_doReset:function(){this._hash=new b.init([1732584193,4023233417,2562383102,271733878])},
+_doProcessBlock:function(b,c){for(var d=0;16>d;d++){var t=c+d,m=b[t];b[t]=(m<<8|m>>>24)&16711935|(m<<24|m>>>8)&4278255360}var d=this._hash.words,t=b[c+0],m=b[c+1],n=b[c+2],r=b[c+3],x=b[c+4],s=b[c+5],q=b[c+6],y=b[c+7],z=b[c+8],A=b[c+9],B=b[c+10],C=b[c+11],D=b[c+12],E=b[c+13],F=b[c+14],G=b[c+15],f=d[0],g=d[1],h=d[2],j=d[3],f=k(f,g,h,j,t,7,a[0]),j=k(j,f,g,h,m,12,a[1]),h=k(h,j,f,g,n,17,a[2]),g=k(g,h,j,f,r,22,a[3]),f=k(f,g,h,j,x,7,a[4]),j=k(j,f,g,h,s,12,a[5]),h=k(h,j,f,g,q,17,a[6]),g=k(g,h,j,f,y,22,a[7]),
+f=k(f,g,h,j,z,7,a[8]),j=k(j,f,g,h,A,12,a[9]),h=k(h,j,f,g,B,17,a[10]),g=k(g,h,j,f,C,22,a[11]),f=k(f,g,h,j,D,7,a[12]),j=k(j,f,g,h,E,12,a[13]),h=k(h,j,f,g,F,17,a[14]),g=k(g,h,j,f,G,22,a[15]),f=e(f,g,h,j,m,5,a[16]),j=e(j,f,g,h,q,9,a[17]),h=e(h,j,f,g,C,14,a[18]),g=e(g,h,j,f,t,20,a[19]),f=e(f,g,h,j,s,5,a[20]),j=e(j,f,g,h,B,9,a[21]),h=e(h,j,f,g,G,14,a[22]),g=e(g,h,j,f,x,20,a[23]),f=e(f,g,h,j,A,5,a[24]),j=e(j,f,g,h,F,9,a[25]),h=e(h,j,f,g,r,14,a[26]),g=e(g,h,j,f,z,20,a[27]),f=e(f,g,h,j,E,5,a[28]),j=e(j,f,
+g,h,n,9,a[29]),h=e(h,j,f,g,y,14,a[30]),g=e(g,h,j,f,D,20,a[31]),f=l(f,g,h,j,s,4,a[32]),j=l(j,f,g,h,z,11,a[33]),h=l(h,j,f,g,C,16,a[34]),g=l(g,h,j,f,F,23,a[35]),f=l(f,g,h,j,m,4,a[36]),j=l(j,f,g,h,x,11,a[37]),h=l(h,j,f,g,y,16,a[38]),g=l(g,h,j,f,B,23,a[39]),f=l(f,g,h,j,E,4,a[40]),j=l(j,f,g,h,t,11,a[41]),h=l(h,j,f,g,r,16,a[42]),g=l(g,h,j,f,q,23,a[43]),f=l(f,g,h,j,A,4,a[44]),j=l(j,f,g,h,D,11,a[45]),h=l(h,j,f,g,G,16,a[46]),g=l(g,h,j,f,n,23,a[47]),f=p(f,g,h,j,t,6,a[48]),j=p(j,f,g,h,y,10,a[49]),h=p(h,j,f,g,
+F,15,a[50]),g=p(g,h,j,f,s,21,a[51]),f=p(f,g,h,j,D,6,a[52]),j=p(j,f,g,h,r,10,a[53]),h=p(h,j,f,g,B,15,a[54]),g=p(g,h,j,f,m,21,a[55]),f=p(f,g,h,j,z,6,a[56]),j=p(j,f,g,h,G,10,a[57]),h=p(h,j,f,g,q,15,a[58]),g=p(g,h,j,f,E,21,a[59]),f=p(f,g,h,j,x,6,a[60]),j=p(j,f,g,h,C,10,a[61]),h=p(h,j,f,g,n,15,a[62]),g=p(g,h,j,f,A,21,a[63]);d[0]=d[0]+f|0;d[1]=d[1]+g|0;d[2]=d[2]+h|0;d[3]=d[3]+j|0},_doFinalize:function(){var a=this._data,b=a.words,c=8*this._nDataBytes,d=8*a.sigBytes;b[d>>>5]|=128<<24-d%32;var m=q.floor(c/
+4294967296);b[(d+64>>>9<<4)+15]=(m<<8|m>>>24)&16711935|(m<<24|m>>>8)&4278255360;b[(d+64>>>9<<4)+14]=(c<<8|c>>>24)&16711935|(c<<24|c>>>8)&4278255360;a.sigBytes=4*(b.length+1);this._process();a=this._hash;b=a.words;for(c=0;4>c;c++)d=b[c],b[c]=(d<<8|d>>>24)&16711935|(d<<24|d>>>8)&4278255360;return a},clone:function(){var a=d.clone.call(this);a._hash=this._hash.clone();return a}});c.MD5=d._createHelper(s);c.HmacMD5=d._createHmacHelper(s)})(Math);
+(function(){var q=CryptoJS,k=q.lib,e=k.Base,l=k.WordArray,k=q.algo,p=k.EvpKDF=e.extend({cfg:e.extend({keySize:4,hasher:k.MD5,iterations:1}),init:function(c){this.cfg=this.cfg.extend(c)},compute:function(c,e){for(var b=this.cfg,d=b.hasher.create(),a=l.create(),k=a.words,p=b.keySize,b=b.iterations;k.length<p;){q&&d.update(q);var q=d.update(c).finalize(e);d.reset();for(var v=1;v<b;v++)q=d.finalize(q),d.reset();a.concat(q)}a.sigBytes=4*p;return a}});q.EvpKDF=function(c,e,b){return p.create(b).compute(c,
+e)}})();
+CryptoJS.lib.Cipher||function(q){var k=CryptoJS,e=k.lib,l=e.Base,p=e.WordArray,c=e.BufferedBlockAlgorithm,s=k.enc.Base64,b=k.algo.EvpKDF,d=e.Cipher=c.extend({cfg:l.extend(),createEncryptor:function(a,b){return this.create(this._ENC_XFORM_MODE,a,b)},createDecryptor:function(a,b){return this.create(this._DEC_XFORM_MODE,a,b)},init:function(a,b,c){this.cfg=this.cfg.extend(c);this._xformMode=a;this._key=b;this.reset()},reset:function(){c.reset.call(this);this._doReset()},process:function(a){this._append(a);return this._process()},
+finalize:function(a){a&&this._append(a);return this._doFinalize()},keySize:4,ivSize:4,_ENC_XFORM_MODE:1,_DEC_XFORM_MODE:2,_createHelper:function(a){return{encrypt:function(b,c,d){return("string"==typeof c?H:v).encrypt(a,b,c,d)},decrypt:function(b,c,d){return("string"==typeof c?H:v).decrypt(a,b,c,d)}}}});e.StreamCipher=d.extend({_doFinalize:function(){return this._process(!0)},blockSize:1});var a=k.mode={},t=function(a,b,c){var d=this._iv;d?this._iv=q:d=this._prevBlock;for(var e=0;e<c;e++)a[b+e]^=
+d[e]},u=(e.BlockCipherMode=l.extend({createEncryptor:function(a,b){return this.Encryptor.create(a,b)},createDecryptor:function(a,b){return this.Decryptor.create(a,b)},init:function(a,b){this._cipher=a;this._iv=b}})).extend();u.Encryptor=u.extend({processBlock:function(a,b){var c=this._cipher,d=c.blockSize;t.call(this,a,b,d);c.encryptBlock(a,b);this._prevBlock=a.slice(b,b+d)}});u.Decryptor=u.extend({processBlock:function(a,b){var c=this._cipher,d=c.blockSize,e=a.slice(b,b+d);c.decryptBlock(a,b);t.call(this,
+a,b,d);this._prevBlock=e}});a=a.CBC=u;u=(k.pad={}).Pkcs7={pad:function(a,b){for(var c=4*b,c=c-a.sigBytes%c,d=c<<24|c<<16|c<<8|c,e=[],k=0;k<c;k+=4)e.push(d);c=p.create(e,c);a.concat(c)},unpad:function(a){a.sigBytes-=a.words[a.sigBytes-1>>>2]&255}};e.BlockCipher=d.extend({cfg:d.cfg.extend({mode:a,padding:u}),reset:function(){d.reset.call(this);var a=this.cfg,b=a.iv,a=a.mode;if(this._xformMode==this._ENC_XFORM_MODE)var c=a.createEncryptor;else c=a.createDecryptor,this._minBufferSize=1;this._mode=c.call(a,
+this,b&&b.words)},_doProcessBlock:function(a,b){this._mode.processBlock(a,b)},_doFinalize:function(){var a=this.cfg.padding;if(this._xformMode==this._ENC_XFORM_MODE){a.pad(this._data,this.blockSize);var b=this._process(!0)}else b=this._process(!0),a.unpad(b);return b},blockSize:4});var w=e.CipherParams=l.extend({init:function(a){this.mixIn(a)},toString:function(a){return(a||this.formatter).stringify(this)}}),a=(k.format={}).OpenSSL={stringify:function(a){var b=a.ciphertext;a=a.salt;return(a?p.create([1398893684,
+1701076831]).concat(a).concat(b):b).toString(s)},parse:function(a){a=s.parse(a);var b=a.words;if(1398893684==b[0]&&1701076831==b[1]){var c=p.create(b.slice(2,4));b.splice(0,4);a.sigBytes-=16}return w.create({ciphertext:a,salt:c})}},v=e.SerializableCipher=l.extend({cfg:l.extend({format:a}),encrypt:function(a,b,c,d){d=this.cfg.extend(d);var e=a.createEncryptor(c,d);b=e.finalize(b);e=e.cfg;return w.create({ciphertext:b,key:c,iv:e.iv,algorithm:a,mode:e.mode,padding:e.padding,blockSize:a.blockSize,formatter:d.format})},
+decrypt:function(a,b,c,d){d=this.cfg.extend(d);b=this._parse(b,d.format);return a.createDecryptor(c,d).finalize(b.ciphertext)},_parse:function(a,b){return"string"==typeof a?b.parse(a,this):a}}),k=(k.kdf={}).OpenSSL={execute:function(a,c,d,e){e||(e=p.random(8));a=b.create({keySize:c+d}).compute(a,e);d=p.create(a.words.slice(c),4*d);a.sigBytes=4*c;return w.create({key:a,iv:d,salt:e})}},H=e.PasswordBasedCipher=v.extend({cfg:v.cfg.extend({kdf:k}),encrypt:function(a,b,c,d){d=this.cfg.extend(d);c=d.kdf.execute(c,
+a.keySize,a.ivSize);d.iv=c.iv;a=v.encrypt.call(this,a,b,c.key,d);a.mixIn(c);return a},decrypt:function(a,b,c,d){d=this.cfg.extend(d);b=this._parse(b,d.format);c=d.kdf.execute(c,a.keySize,a.ivSize,b.salt);d.iv=c.iv;return v.decrypt.call(this,a,b,c.key,d)}})}();
+(function(){function q(){for(var b=this._X,d=this._C,a=0;8>a;a++)p[a]=d[a];d[0]=d[0]+1295307597+this._b|0;d[1]=d[1]+3545052371+(d[0]>>>0<p[0]>>>0?1:0)|0;d[2]=d[2]+886263092+(d[1]>>>0<p[1]>>>0?1:0)|0;d[3]=d[3]+1295307597+(d[2]>>>0<p[2]>>>0?1:0)|0;d[4]=d[4]+3545052371+(d[3]>>>0<p[3]>>>0?1:0)|0;d[5]=d[5]+886263092+(d[4]>>>0<p[4]>>>0?1:0)|0;d[6]=d[6]+1295307597+(d[5]>>>0<p[5]>>>0?1:0)|0;d[7]=d[7]+3545052371+(d[6]>>>0<p[6]>>>0?1:0)|0;this._b=d[7]>>>0<p[7]>>>0?1:0;for(a=0;8>a;a++){var e=b[a]+d[a],k=e&65535,
+l=e>>>16;c[a]=((k*k>>>17)+k*l>>>15)+l*l^((e&4294901760)*e|0)+((e&65535)*e|0)}b[0]=c[0]+(c[7]<<16|c[7]>>>16)+(c[6]<<16|c[6]>>>16)|0;b[1]=c[1]+(c[0]<<8|c[0]>>>24)+c[7]|0;b[2]=c[2]+(c[1]<<16|c[1]>>>16)+(c[0]<<16|c[0]>>>16)|0;b[3]=c[3]+(c[2]<<8|c[2]>>>24)+c[1]|0;b[4]=c[4]+(c[3]<<16|c[3]>>>16)+(c[2]<<16|c[2]>>>16)|0;b[5]=c[5]+(c[4]<<8|c[4]>>>24)+c[3]|0;b[6]=c[6]+(c[5]<<16|c[5]>>>16)+(c[4]<<16|c[4]>>>16)|0;b[7]=c[7]+(c[6]<<8|c[6]>>>24)+c[5]|0}var k=CryptoJS,e=k.lib.StreamCipher,l=[],p=[],c=[],s=k.algo.RabbitLegacy=
+e.extend({_doReset:function(){for(var b=this._key.words,c=this.cfg.iv,a=this._X=[b[0],b[3]<<16|b[2]>>>16,b[1],b[0]<<16|b[3]>>>16,b[2],b[1]<<16|b[0]>>>16,b[3],b[2]<<16|b[1]>>>16],b=this._C=[b[2]<<16|b[2]>>>16,b[0]&4294901760|b[1]&65535,b[3]<<16|b[3]>>>16,b[1]&4294901760|b[2]&65535,b[0]<<16|b[0]>>>16,b[2]&4294901760|b[3]&65535,b[1]<<16|b[1]>>>16,b[3]&4294901760|b[0]&65535],e=this._b=0;4>e;e++)q.call(this);for(e=0;8>e;e++)b[e]^=a[e+4&7];if(c){var a=c.words,c=a[0],a=a[1],c=(c<<8|c>>>24)&16711935|(c<<
+24|c>>>8)&4278255360,a=(a<<8|a>>>24)&16711935|(a<<24|a>>>8)&4278255360,e=c>>>16|a&4294901760,k=a<<16|c&65535;b[0]^=c;b[1]^=e;b[2]^=a;b[3]^=k;b[4]^=c;b[5]^=e;b[6]^=a;b[7]^=k;for(e=0;4>e;e++)q.call(this)}},_doProcessBlock:function(b,c){var a=this._X;q.call(this);l[0]=a[0]^a[5]>>>16^a[3]<<16;l[1]=a[2]^a[7]>>>16^a[5]<<16;l[2]=a[4]^a[1]>>>16^a[7]<<16;l[3]=a[6]^a[3]>>>16^a[1]<<16;for(a=0;4>a;a++)l[a]=(l[a]<<8|l[a]>>>24)&16711935|(l[a]<<24|l[a]>>>8)&4278255360,b[c+a]^=l[a]},blockSize:4,ivSize:2});k.RabbitLegacy=
+e._createHelper(s)})();
diff --git a/library/cryptojs/rollups/rabbit.js b/library/cryptojs/rollups/rabbit.js
new file mode 100644
index 000000000..5ea717ed4
--- /dev/null
+++ b/library/cryptojs/rollups/rabbit.js
@@ -0,0 +1,36 @@
+/*
+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
+*/
+var CryptoJS=CryptoJS||function(q,k){var e={},l=e.lib={},p=function(){},c=l.Base={extend:function(a){p.prototype=this;var b=new p;a&&b.mixIn(a);b.hasOwnProperty("init")||(b.init=function(){b.$super.init.apply(this,arguments)});b.init.prototype=b;b.$super=this;return b},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var b in a)a.hasOwnProperty(b)&&(this[b]=a[b]);a.hasOwnProperty("toString")&&(this.toString=a.toString)},clone:function(){return this.init.prototype.extend(this)}},
+s=l.WordArray=c.extend({init:function(a,b){a=this.words=a||[];this.sigBytes=b!=k?b:4*a.length},toString:function(a){return(a||d).stringify(this)},concat:function(a){var b=this.words,m=a.words,n=this.sigBytes;a=a.sigBytes;this.clamp();if(n%4)for(var r=0;r<a;r++)b[n+r>>>2]|=(m[r>>>2]>>>24-8*(r%4)&255)<<24-8*((n+r)%4);else if(65535<m.length)for(r=0;r<a;r+=4)b[n+r>>>2]=m[r>>>2];else b.push.apply(b,m);this.sigBytes+=a;return this},clamp:function(){var a=this.words,b=this.sigBytes;a[b>>>2]&=4294967295<<
+32-8*(b%4);a.length=q.ceil(b/4)},clone:function(){var a=c.clone.call(this);a.words=this.words.slice(0);return a},random:function(a){for(var b=[],m=0;m<a;m+=4)b.push(4294967296*q.random()|0);return new s.init(b,a)}}),b=e.enc={},d=b.Hex={stringify:function(a){var b=a.words;a=a.sigBytes;for(var m=[],n=0;n<a;n++){var r=b[n>>>2]>>>24-8*(n%4)&255;m.push((r>>>4).toString(16));m.push((r&15).toString(16))}return m.join("")},parse:function(a){for(var b=a.length,m=[],n=0;n<b;n+=2)m[n>>>3]|=parseInt(a.substr(n,
+2),16)<<24-4*(n%8);return new s.init(m,b/2)}},a=b.Latin1={stringify:function(a){var b=a.words;a=a.sigBytes;for(var m=[],n=0;n<a;n++)m.push(String.fromCharCode(b[n>>>2]>>>24-8*(n%4)&255));return m.join("")},parse:function(a){for(var b=a.length,m=[],n=0;n<b;n++)m[n>>>2]|=(a.charCodeAt(n)&255)<<24-8*(n%4);return new s.init(m,b)}},u=b.Utf8={stringify:function(b){try{return decodeURIComponent(escape(a.stringify(b)))}catch(c){throw Error("Malformed UTF-8 data");}},parse:function(b){return a.parse(unescape(encodeURIComponent(b)))}},
+t=l.BufferedBlockAlgorithm=c.extend({reset:function(){this._data=new s.init;this._nDataBytes=0},_append:function(a){"string"==typeof a&&(a=u.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(a){var b=this._data,m=b.words,n=b.sigBytes,r=this.blockSize,c=n/(4*r),c=a?q.ceil(c):q.max((c|0)-this._minBufferSize,0);a=c*r;n=q.min(4*a,n);if(a){for(var t=0;t<a;t+=r)this._doProcessBlock(m,t);t=m.splice(0,a);b.sigBytes-=n}return new s.init(t,n)},clone:function(){var a=c.clone.call(this);
+a._data=this._data.clone();return a},_minBufferSize:0});l.Hasher=t.extend({cfg:c.extend(),init:function(a){this.cfg=this.cfg.extend(a);this.reset()},reset:function(){t.reset.call(this);this._doReset()},update:function(a){this._append(a);this._process();return this},finalize:function(a){a&&this._append(a);return this._doFinalize()},blockSize:16,_createHelper:function(a){return function(b,m){return(new a.init(m)).finalize(b)}},_createHmacHelper:function(a){return function(b,m){return(new w.HMAC.init(a,
+m)).finalize(b)}}});var w=e.algo={};return e}(Math);
+(function(){var q=CryptoJS,k=q.lib.WordArray;q.enc.Base64={stringify:function(e){var l=e.words,p=e.sigBytes,c=this._map;e.clamp();e=[];for(var k=0;k<p;k+=3)for(var b=(l[k>>>2]>>>24-8*(k%4)&255)<<16|(l[k+1>>>2]>>>24-8*((k+1)%4)&255)<<8|l[k+2>>>2]>>>24-8*((k+2)%4)&255,d=0;4>d&&k+0.75*d<p;d++)e.push(c.charAt(b>>>6*(3-d)&63));if(l=c.charAt(64))for(;e.length%4;)e.push(l);return e.join("")},parse:function(e){var l=e.length,p=this._map,c=p.charAt(64);c&&(c=e.indexOf(c),-1!=c&&(l=c));for(var c=[],s=0,b=0;b<
+l;b++)if(b%4){var d=p.indexOf(e.charAt(b-1))<<2*(b%4),a=p.indexOf(e.charAt(b))>>>6-2*(b%4);c[s>>>2]|=(d|a)<<24-8*(s%4);s++}return k.create(c,s)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="}})();
+(function(q){function k(a,b,c,d,m,n,r){a=a+(b&c|~b&d)+m+r;return(a<<n|a>>>32-n)+b}function e(a,b,c,d,m,n,r){a=a+(b&d|c&~d)+m+r;return(a<<n|a>>>32-n)+b}function l(a,b,c,d,m,n,r){a=a+(b^c^d)+m+r;return(a<<n|a>>>32-n)+b}function p(a,b,c,d,m,n,r){a=a+(c^(b|~d))+m+r;return(a<<n|a>>>32-n)+b}for(var c=CryptoJS,s=c.lib,b=s.WordArray,d=s.Hasher,s=c.algo,a=[],u=0;64>u;u++)a[u]=4294967296*q.abs(q.sin(u+1))|0;s=s.MD5=d.extend({_doReset:function(){this._hash=new b.init([1732584193,4023233417,2562383102,271733878])},
+_doProcessBlock:function(b,c){for(var d=0;16>d;d++){var s=c+d,m=b[s];b[s]=(m<<8|m>>>24)&16711935|(m<<24|m>>>8)&4278255360}var d=this._hash.words,s=b[c+0],m=b[c+1],n=b[c+2],r=b[c+3],x=b[c+4],u=b[c+5],q=b[c+6],y=b[c+7],z=b[c+8],A=b[c+9],B=b[c+10],C=b[c+11],D=b[c+12],E=b[c+13],F=b[c+14],G=b[c+15],f=d[0],g=d[1],h=d[2],j=d[3],f=k(f,g,h,j,s,7,a[0]),j=k(j,f,g,h,m,12,a[1]),h=k(h,j,f,g,n,17,a[2]),g=k(g,h,j,f,r,22,a[3]),f=k(f,g,h,j,x,7,a[4]),j=k(j,f,g,h,u,12,a[5]),h=k(h,j,f,g,q,17,a[6]),g=k(g,h,j,f,y,22,a[7]),
+f=k(f,g,h,j,z,7,a[8]),j=k(j,f,g,h,A,12,a[9]),h=k(h,j,f,g,B,17,a[10]),g=k(g,h,j,f,C,22,a[11]),f=k(f,g,h,j,D,7,a[12]),j=k(j,f,g,h,E,12,a[13]),h=k(h,j,f,g,F,17,a[14]),g=k(g,h,j,f,G,22,a[15]),f=e(f,g,h,j,m,5,a[16]),j=e(j,f,g,h,q,9,a[17]),h=e(h,j,f,g,C,14,a[18]),g=e(g,h,j,f,s,20,a[19]),f=e(f,g,h,j,u,5,a[20]),j=e(j,f,g,h,B,9,a[21]),h=e(h,j,f,g,G,14,a[22]),g=e(g,h,j,f,x,20,a[23]),f=e(f,g,h,j,A,5,a[24]),j=e(j,f,g,h,F,9,a[25]),h=e(h,j,f,g,r,14,a[26]),g=e(g,h,j,f,z,20,a[27]),f=e(f,g,h,j,E,5,a[28]),j=e(j,f,
+g,h,n,9,a[29]),h=e(h,j,f,g,y,14,a[30]),g=e(g,h,j,f,D,20,a[31]),f=l(f,g,h,j,u,4,a[32]),j=l(j,f,g,h,z,11,a[33]),h=l(h,j,f,g,C,16,a[34]),g=l(g,h,j,f,F,23,a[35]),f=l(f,g,h,j,m,4,a[36]),j=l(j,f,g,h,x,11,a[37]),h=l(h,j,f,g,y,16,a[38]),g=l(g,h,j,f,B,23,a[39]),f=l(f,g,h,j,E,4,a[40]),j=l(j,f,g,h,s,11,a[41]),h=l(h,j,f,g,r,16,a[42]),g=l(g,h,j,f,q,23,a[43]),f=l(f,g,h,j,A,4,a[44]),j=l(j,f,g,h,D,11,a[45]),h=l(h,j,f,g,G,16,a[46]),g=l(g,h,j,f,n,23,a[47]),f=p(f,g,h,j,s,6,a[48]),j=p(j,f,g,h,y,10,a[49]),h=p(h,j,f,g,
+F,15,a[50]),g=p(g,h,j,f,u,21,a[51]),f=p(f,g,h,j,D,6,a[52]),j=p(j,f,g,h,r,10,a[53]),h=p(h,j,f,g,B,15,a[54]),g=p(g,h,j,f,m,21,a[55]),f=p(f,g,h,j,z,6,a[56]),j=p(j,f,g,h,G,10,a[57]),h=p(h,j,f,g,q,15,a[58]),g=p(g,h,j,f,E,21,a[59]),f=p(f,g,h,j,x,6,a[60]),j=p(j,f,g,h,C,10,a[61]),h=p(h,j,f,g,n,15,a[62]),g=p(g,h,j,f,A,21,a[63]);d[0]=d[0]+f|0;d[1]=d[1]+g|0;d[2]=d[2]+h|0;d[3]=d[3]+j|0},_doFinalize:function(){var a=this._data,b=a.words,c=8*this._nDataBytes,d=8*a.sigBytes;b[d>>>5]|=128<<24-d%32;var m=q.floor(c/
+4294967296);b[(d+64>>>9<<4)+15]=(m<<8|m>>>24)&16711935|(m<<24|m>>>8)&4278255360;b[(d+64>>>9<<4)+14]=(c<<8|c>>>24)&16711935|(c<<24|c>>>8)&4278255360;a.sigBytes=4*(b.length+1);this._process();a=this._hash;b=a.words;for(c=0;4>c;c++)d=b[c],b[c]=(d<<8|d>>>24)&16711935|(d<<24|d>>>8)&4278255360;return a},clone:function(){var a=d.clone.call(this);a._hash=this._hash.clone();return a}});c.MD5=d._createHelper(s);c.HmacMD5=d._createHmacHelper(s)})(Math);
+(function(){var q=CryptoJS,k=q.lib,e=k.Base,l=k.WordArray,k=q.algo,p=k.EvpKDF=e.extend({cfg:e.extend({keySize:4,hasher:k.MD5,iterations:1}),init:function(c){this.cfg=this.cfg.extend(c)},compute:function(c,e){for(var b=this.cfg,d=b.hasher.create(),a=l.create(),k=a.words,p=b.keySize,b=b.iterations;k.length<p;){q&&d.update(q);var q=d.update(c).finalize(e);d.reset();for(var v=1;v<b;v++)q=d.finalize(q),d.reset();a.concat(q)}a.sigBytes=4*p;return a}});q.EvpKDF=function(c,e,b){return p.create(b).compute(c,
+e)}})();
+CryptoJS.lib.Cipher||function(q){var k=CryptoJS,e=k.lib,l=e.Base,p=e.WordArray,c=e.BufferedBlockAlgorithm,s=k.enc.Base64,b=k.algo.EvpKDF,d=e.Cipher=c.extend({cfg:l.extend(),createEncryptor:function(a,b){return this.create(this._ENC_XFORM_MODE,a,b)},createDecryptor:function(a,b){return this.create(this._DEC_XFORM_MODE,a,b)},init:function(a,b,c){this.cfg=this.cfg.extend(c);this._xformMode=a;this._key=b;this.reset()},reset:function(){c.reset.call(this);this._doReset()},process:function(a){this._append(a);return this._process()},
+finalize:function(a){a&&this._append(a);return this._doFinalize()},keySize:4,ivSize:4,_ENC_XFORM_MODE:1,_DEC_XFORM_MODE:2,_createHelper:function(a){return{encrypt:function(b,c,d){return("string"==typeof c?H:v).encrypt(a,b,c,d)},decrypt:function(b,c,d){return("string"==typeof c?H:v).decrypt(a,b,c,d)}}}});e.StreamCipher=d.extend({_doFinalize:function(){return this._process(!0)},blockSize:1});var a=k.mode={},u=function(a,b,c){var d=this._iv;d?this._iv=q:d=this._prevBlock;for(var e=0;e<c;e++)a[b+e]^=
+d[e]},t=(e.BlockCipherMode=l.extend({createEncryptor:function(a,b){return this.Encryptor.create(a,b)},createDecryptor:function(a,b){return this.Decryptor.create(a,b)},init:function(a,b){this._cipher=a;this._iv=b}})).extend();t.Encryptor=t.extend({processBlock:function(a,b){var c=this._cipher,d=c.blockSize;u.call(this,a,b,d);c.encryptBlock(a,b);this._prevBlock=a.slice(b,b+d)}});t.Decryptor=t.extend({processBlock:function(a,b){var c=this._cipher,d=c.blockSize,e=a.slice(b,b+d);c.decryptBlock(a,b);u.call(this,
+a,b,d);this._prevBlock=e}});a=a.CBC=t;t=(k.pad={}).Pkcs7={pad:function(a,b){for(var c=4*b,c=c-a.sigBytes%c,d=c<<24|c<<16|c<<8|c,e=[],k=0;k<c;k+=4)e.push(d);c=p.create(e,c);a.concat(c)},unpad:function(a){a.sigBytes-=a.words[a.sigBytes-1>>>2]&255}};e.BlockCipher=d.extend({cfg:d.cfg.extend({mode:a,padding:t}),reset:function(){d.reset.call(this);var a=this.cfg,b=a.iv,a=a.mode;if(this._xformMode==this._ENC_XFORM_MODE)var c=a.createEncryptor;else c=a.createDecryptor,this._minBufferSize=1;this._mode=c.call(a,
+this,b&&b.words)},_doProcessBlock:function(a,b){this._mode.processBlock(a,b)},_doFinalize:function(){var a=this.cfg.padding;if(this._xformMode==this._ENC_XFORM_MODE){a.pad(this._data,this.blockSize);var b=this._process(!0)}else b=this._process(!0),a.unpad(b);return b},blockSize:4});var w=e.CipherParams=l.extend({init:function(a){this.mixIn(a)},toString:function(a){return(a||this.formatter).stringify(this)}}),a=(k.format={}).OpenSSL={stringify:function(a){var b=a.ciphertext;a=a.salt;return(a?p.create([1398893684,
+1701076831]).concat(a).concat(b):b).toString(s)},parse:function(a){a=s.parse(a);var b=a.words;if(1398893684==b[0]&&1701076831==b[1]){var c=p.create(b.slice(2,4));b.splice(0,4);a.sigBytes-=16}return w.create({ciphertext:a,salt:c})}},v=e.SerializableCipher=l.extend({cfg:l.extend({format:a}),encrypt:function(a,b,c,d){d=this.cfg.extend(d);var e=a.createEncryptor(c,d);b=e.finalize(b);e=e.cfg;return w.create({ciphertext:b,key:c,iv:e.iv,algorithm:a,mode:e.mode,padding:e.padding,blockSize:a.blockSize,formatter:d.format})},
+decrypt:function(a,b,c,d){d=this.cfg.extend(d);b=this._parse(b,d.format);return a.createDecryptor(c,d).finalize(b.ciphertext)},_parse:function(a,b){return"string"==typeof a?b.parse(a,this):a}}),k=(k.kdf={}).OpenSSL={execute:function(a,c,d,e){e||(e=p.random(8));a=b.create({keySize:c+d}).compute(a,e);d=p.create(a.words.slice(c),4*d);a.sigBytes=4*c;return w.create({key:a,iv:d,salt:e})}},H=e.PasswordBasedCipher=v.extend({cfg:v.cfg.extend({kdf:k}),encrypt:function(a,b,c,d){d=this.cfg.extend(d);c=d.kdf.execute(c,
+a.keySize,a.ivSize);d.iv=c.iv;a=v.encrypt.call(this,a,b,c.key,d);a.mixIn(c);return a},decrypt:function(a,b,c,d){d=this.cfg.extend(d);b=this._parse(b,d.format);c=d.kdf.execute(c,a.keySize,a.ivSize,b.salt);d.iv=c.iv;return v.decrypt.call(this,a,b,c.key,d)}})}();
+(function(){function q(){for(var b=this._X,d=this._C,a=0;8>a;a++)p[a]=d[a];d[0]=d[0]+1295307597+this._b|0;d[1]=d[1]+3545052371+(d[0]>>>0<p[0]>>>0?1:0)|0;d[2]=d[2]+886263092+(d[1]>>>0<p[1]>>>0?1:0)|0;d[3]=d[3]+1295307597+(d[2]>>>0<p[2]>>>0?1:0)|0;d[4]=d[4]+3545052371+(d[3]>>>0<p[3]>>>0?1:0)|0;d[5]=d[5]+886263092+(d[4]>>>0<p[4]>>>0?1:0)|0;d[6]=d[6]+1295307597+(d[5]>>>0<p[5]>>>0?1:0)|0;d[7]=d[7]+3545052371+(d[6]>>>0<p[6]>>>0?1:0)|0;this._b=d[7]>>>0<p[7]>>>0?1:0;for(a=0;8>a;a++){var e=b[a]+d[a],k=e&65535,
+l=e>>>16;c[a]=((k*k>>>17)+k*l>>>15)+l*l^((e&4294901760)*e|0)+((e&65535)*e|0)}b[0]=c[0]+(c[7]<<16|c[7]>>>16)+(c[6]<<16|c[6]>>>16)|0;b[1]=c[1]+(c[0]<<8|c[0]>>>24)+c[7]|0;b[2]=c[2]+(c[1]<<16|c[1]>>>16)+(c[0]<<16|c[0]>>>16)|0;b[3]=c[3]+(c[2]<<8|c[2]>>>24)+c[1]|0;b[4]=c[4]+(c[3]<<16|c[3]>>>16)+(c[2]<<16|c[2]>>>16)|0;b[5]=c[5]+(c[4]<<8|c[4]>>>24)+c[3]|0;b[6]=c[6]+(c[5]<<16|c[5]>>>16)+(c[4]<<16|c[4]>>>16)|0;b[7]=c[7]+(c[6]<<8|c[6]>>>24)+c[5]|0}var k=CryptoJS,e=k.lib.StreamCipher,l=[],p=[],c=[],s=k.algo.Rabbit=
+e.extend({_doReset:function(){for(var b=this._key.words,c=this.cfg.iv,a=0;4>a;a++)b[a]=(b[a]<<8|b[a]>>>24)&16711935|(b[a]<<24|b[a]>>>8)&4278255360;for(var e=this._X=[b[0],b[3]<<16|b[2]>>>16,b[1],b[0]<<16|b[3]>>>16,b[2],b[1]<<16|b[0]>>>16,b[3],b[2]<<16|b[1]>>>16],b=this._C=[b[2]<<16|b[2]>>>16,b[0]&4294901760|b[1]&65535,b[3]<<16|b[3]>>>16,b[1]&4294901760|b[2]&65535,b[0]<<16|b[0]>>>16,b[2]&4294901760|b[3]&65535,b[1]<<16|b[1]>>>16,b[3]&4294901760|b[0]&65535],a=this._b=0;4>a;a++)q.call(this);for(a=0;8>
+a;a++)b[a]^=e[a+4&7];if(c){var a=c.words,c=a[0],a=a[1],c=(c<<8|c>>>24)&16711935|(c<<24|c>>>8)&4278255360,a=(a<<8|a>>>24)&16711935|(a<<24|a>>>8)&4278255360,e=c>>>16|a&4294901760,k=a<<16|c&65535;b[0]^=c;b[1]^=e;b[2]^=a;b[3]^=k;b[4]^=c;b[5]^=e;b[6]^=a;b[7]^=k;for(a=0;4>a;a++)q.call(this)}},_doProcessBlock:function(b,c){var a=this._X;q.call(this);l[0]=a[0]^a[5]>>>16^a[3]<<16;l[1]=a[2]^a[7]>>>16^a[5]<<16;l[2]=a[4]^a[1]>>>16^a[7]<<16;l[3]=a[6]^a[3]>>>16^a[1]<<16;for(a=0;4>a;a++)l[a]=(l[a]<<8|l[a]>>>24)&
+16711935|(l[a]<<24|l[a]>>>8)&4278255360,b[c+a]^=l[a]},blockSize:4,ivSize:2});k.Rabbit=e._createHelper(s)})();
diff --git a/library/cryptojs/rollups/rc4.js b/library/cryptojs/rollups/rc4.js
new file mode 100644
index 000000000..aba420f5e
--- /dev/null
+++ b/library/cryptojs/rollups/rc4.js
@@ -0,0 +1,33 @@
+/*
+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
+*/
+var CryptoJS=CryptoJS||function(s,l){var e={},n=e.lib={},p=function(){},b=n.Base={extend:function(c){p.prototype=this;var a=new p;c&&a.mixIn(c);a.hasOwnProperty("init")||(a.init=function(){a.$super.init.apply(this,arguments)});a.init.prototype=a;a.$super=this;return a},create:function(){var c=this.extend();c.init.apply(c,arguments);return c},init:function(){},mixIn:function(c){for(var a in c)c.hasOwnProperty(a)&&(this[a]=c[a]);c.hasOwnProperty("toString")&&(this.toString=c.toString)},clone:function(){return this.init.prototype.extend(this)}},
+d=n.WordArray=b.extend({init:function(c,a){c=this.words=c||[];this.sigBytes=a!=l?a:4*c.length},toString:function(c){return(c||q).stringify(this)},concat:function(c){var a=this.words,m=c.words,f=this.sigBytes;c=c.sigBytes;this.clamp();if(f%4)for(var r=0;r<c;r++)a[f+r>>>2]|=(m[r>>>2]>>>24-8*(r%4)&255)<<24-8*((f+r)%4);else if(65535<m.length)for(r=0;r<c;r+=4)a[f+r>>>2]=m[r>>>2];else a.push.apply(a,m);this.sigBytes+=c;return this},clamp:function(){var c=this.words,a=this.sigBytes;c[a>>>2]&=4294967295<<
+32-8*(a%4);c.length=s.ceil(a/4)},clone:function(){var c=b.clone.call(this);c.words=this.words.slice(0);return c},random:function(c){for(var a=[],m=0;m<c;m+=4)a.push(4294967296*s.random()|0);return new d.init(a,c)}}),t=e.enc={},q=t.Hex={stringify:function(c){var a=c.words;c=c.sigBytes;for(var m=[],f=0;f<c;f++){var r=a[f>>>2]>>>24-8*(f%4)&255;m.push((r>>>4).toString(16));m.push((r&15).toString(16))}return m.join("")},parse:function(c){for(var a=c.length,m=[],f=0;f<a;f+=2)m[f>>>3]|=parseInt(c.substr(f,
+2),16)<<24-4*(f%8);return new d.init(m,a/2)}},a=t.Latin1={stringify:function(c){var a=c.words;c=c.sigBytes;for(var m=[],f=0;f<c;f++)m.push(String.fromCharCode(a[f>>>2]>>>24-8*(f%4)&255));return m.join("")},parse:function(c){for(var a=c.length,m=[],f=0;f<a;f++)m[f>>>2]|=(c.charCodeAt(f)&255)<<24-8*(f%4);return new d.init(m,a)}},v=t.Utf8={stringify:function(c){try{return decodeURIComponent(escape(a.stringify(c)))}catch(u){throw Error("Malformed UTF-8 data");}},parse:function(c){return a.parse(unescape(encodeURIComponent(c)))}},
+u=n.BufferedBlockAlgorithm=b.extend({reset:function(){this._data=new d.init;this._nDataBytes=0},_append:function(a){"string"==typeof a&&(a=v.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(a){var u=this._data,m=u.words,f=u.sigBytes,r=this.blockSize,e=f/(4*r),e=a?s.ceil(e):s.max((e|0)-this._minBufferSize,0);a=e*r;f=s.min(4*a,f);if(a){for(var b=0;b<a;b+=r)this._doProcessBlock(m,b);b=m.splice(0,a);u.sigBytes-=f}return new d.init(b,f)},clone:function(){var a=b.clone.call(this);
+a._data=this._data.clone();return a},_minBufferSize:0});n.Hasher=u.extend({cfg:b.extend(),init:function(a){this.cfg=this.cfg.extend(a);this.reset()},reset:function(){u.reset.call(this);this._doReset()},update:function(a){this._append(a);this._process();return this},finalize:function(a){a&&this._append(a);return this._doFinalize()},blockSize:16,_createHelper:function(a){return function(u,m){return(new a.init(m)).finalize(u)}},_createHmacHelper:function(a){return function(u,m){return(new w.HMAC.init(a,
+m)).finalize(u)}}});var w=e.algo={};return e}(Math);
+(function(){var s=CryptoJS,l=s.lib.WordArray;s.enc.Base64={stringify:function(e){var n=e.words,l=e.sigBytes,b=this._map;e.clamp();e=[];for(var d=0;d<l;d+=3)for(var t=(n[d>>>2]>>>24-8*(d%4)&255)<<16|(n[d+1>>>2]>>>24-8*((d+1)%4)&255)<<8|n[d+2>>>2]>>>24-8*((d+2)%4)&255,q=0;4>q&&d+0.75*q<l;q++)e.push(b.charAt(t>>>6*(3-q)&63));if(n=b.charAt(64))for(;e.length%4;)e.push(n);return e.join("")},parse:function(e){var n=e.length,p=this._map,b=p.charAt(64);b&&(b=e.indexOf(b),-1!=b&&(n=b));for(var b=[],d=0,t=0;t<
+n;t++)if(t%4){var q=p.indexOf(e.charAt(t-1))<<2*(t%4),a=p.indexOf(e.charAt(t))>>>6-2*(t%4);b[d>>>2]|=(q|a)<<24-8*(d%4);d++}return l.create(b,d)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="}})();
+(function(s){function l(a,b,c,e,m,f,r){a=a+(b&c|~b&e)+m+r;return(a<<f|a>>>32-f)+b}function e(a,b,c,e,m,f,r){a=a+(b&e|c&~e)+m+r;return(a<<f|a>>>32-f)+b}function n(a,b,c,e,m,f,r){a=a+(b^c^e)+m+r;return(a<<f|a>>>32-f)+b}function p(a,b,c,e,m,f,r){a=a+(c^(b|~e))+m+r;return(a<<f|a>>>32-f)+b}for(var b=CryptoJS,d=b.lib,t=d.WordArray,q=d.Hasher,d=b.algo,a=[],v=0;64>v;v++)a[v]=4294967296*s.abs(s.sin(v+1))|0;d=d.MD5=q.extend({_doReset:function(){this._hash=new t.init([1732584193,4023233417,2562383102,271733878])},
+_doProcessBlock:function(b,d){for(var c=0;16>c;c++){var q=d+c,m=b[q];b[q]=(m<<8|m>>>24)&16711935|(m<<24|m>>>8)&4278255360}var c=this._hash.words,q=b[d+0],m=b[d+1],f=b[d+2],r=b[d+3],x=b[d+4],t=b[d+5],s=b[d+6],v=b[d+7],y=b[d+8],z=b[d+9],A=b[d+10],B=b[d+11],C=b[d+12],D=b[d+13],E=b[d+14],F=b[d+15],g=c[0],h=c[1],j=c[2],k=c[3],g=l(g,h,j,k,q,7,a[0]),k=l(k,g,h,j,m,12,a[1]),j=l(j,k,g,h,f,17,a[2]),h=l(h,j,k,g,r,22,a[3]),g=l(g,h,j,k,x,7,a[4]),k=l(k,g,h,j,t,12,a[5]),j=l(j,k,g,h,s,17,a[6]),h=l(h,j,k,g,v,22,a[7]),
+g=l(g,h,j,k,y,7,a[8]),k=l(k,g,h,j,z,12,a[9]),j=l(j,k,g,h,A,17,a[10]),h=l(h,j,k,g,B,22,a[11]),g=l(g,h,j,k,C,7,a[12]),k=l(k,g,h,j,D,12,a[13]),j=l(j,k,g,h,E,17,a[14]),h=l(h,j,k,g,F,22,a[15]),g=e(g,h,j,k,m,5,a[16]),k=e(k,g,h,j,s,9,a[17]),j=e(j,k,g,h,B,14,a[18]),h=e(h,j,k,g,q,20,a[19]),g=e(g,h,j,k,t,5,a[20]),k=e(k,g,h,j,A,9,a[21]),j=e(j,k,g,h,F,14,a[22]),h=e(h,j,k,g,x,20,a[23]),g=e(g,h,j,k,z,5,a[24]),k=e(k,g,h,j,E,9,a[25]),j=e(j,k,g,h,r,14,a[26]),h=e(h,j,k,g,y,20,a[27]),g=e(g,h,j,k,D,5,a[28]),k=e(k,g,
+h,j,f,9,a[29]),j=e(j,k,g,h,v,14,a[30]),h=e(h,j,k,g,C,20,a[31]),g=n(g,h,j,k,t,4,a[32]),k=n(k,g,h,j,y,11,a[33]),j=n(j,k,g,h,B,16,a[34]),h=n(h,j,k,g,E,23,a[35]),g=n(g,h,j,k,m,4,a[36]),k=n(k,g,h,j,x,11,a[37]),j=n(j,k,g,h,v,16,a[38]),h=n(h,j,k,g,A,23,a[39]),g=n(g,h,j,k,D,4,a[40]),k=n(k,g,h,j,q,11,a[41]),j=n(j,k,g,h,r,16,a[42]),h=n(h,j,k,g,s,23,a[43]),g=n(g,h,j,k,z,4,a[44]),k=n(k,g,h,j,C,11,a[45]),j=n(j,k,g,h,F,16,a[46]),h=n(h,j,k,g,f,23,a[47]),g=p(g,h,j,k,q,6,a[48]),k=p(k,g,h,j,v,10,a[49]),j=p(j,k,g,h,
+E,15,a[50]),h=p(h,j,k,g,t,21,a[51]),g=p(g,h,j,k,C,6,a[52]),k=p(k,g,h,j,r,10,a[53]),j=p(j,k,g,h,A,15,a[54]),h=p(h,j,k,g,m,21,a[55]),g=p(g,h,j,k,y,6,a[56]),k=p(k,g,h,j,F,10,a[57]),j=p(j,k,g,h,s,15,a[58]),h=p(h,j,k,g,D,21,a[59]),g=p(g,h,j,k,x,6,a[60]),k=p(k,g,h,j,B,10,a[61]),j=p(j,k,g,h,f,15,a[62]),h=p(h,j,k,g,z,21,a[63]);c[0]=c[0]+g|0;c[1]=c[1]+h|0;c[2]=c[2]+j|0;c[3]=c[3]+k|0},_doFinalize:function(){var a=this._data,b=a.words,c=8*this._nDataBytes,d=8*a.sigBytes;b[d>>>5]|=128<<24-d%32;var m=s.floor(c/
+4294967296);b[(d+64>>>9<<4)+15]=(m<<8|m>>>24)&16711935|(m<<24|m>>>8)&4278255360;b[(d+64>>>9<<4)+14]=(c<<8|c>>>24)&16711935|(c<<24|c>>>8)&4278255360;a.sigBytes=4*(b.length+1);this._process();a=this._hash;b=a.words;for(c=0;4>c;c++)d=b[c],b[c]=(d<<8|d>>>24)&16711935|(d<<24|d>>>8)&4278255360;return a},clone:function(){var a=q.clone.call(this);a._hash=this._hash.clone();return a}});b.MD5=q._createHelper(d);b.HmacMD5=q._createHmacHelper(d)})(Math);
+(function(){var s=CryptoJS,l=s.lib,e=l.Base,n=l.WordArray,l=s.algo,p=l.EvpKDF=e.extend({cfg:e.extend({keySize:4,hasher:l.MD5,iterations:1}),init:function(b){this.cfg=this.cfg.extend(b)},compute:function(b,d){for(var e=this.cfg,q=e.hasher.create(),a=n.create(),l=a.words,p=e.keySize,e=e.iterations;l.length<p;){s&&q.update(s);var s=q.update(b).finalize(d);q.reset();for(var c=1;c<e;c++)s=q.finalize(s),q.reset();a.concat(s)}a.sigBytes=4*p;return a}});s.EvpKDF=function(b,d,e){return p.create(e).compute(b,
+d)}})();
+CryptoJS.lib.Cipher||function(s){var l=CryptoJS,e=l.lib,n=e.Base,p=e.WordArray,b=e.BufferedBlockAlgorithm,d=l.enc.Base64,t=l.algo.EvpKDF,q=e.Cipher=b.extend({cfg:n.extend(),createEncryptor:function(a,f){return this.create(this._ENC_XFORM_MODE,a,f)},createDecryptor:function(a,f){return this.create(this._DEC_XFORM_MODE,a,f)},init:function(a,f,c){this.cfg=this.cfg.extend(c);this._xformMode=a;this._key=f;this.reset()},reset:function(){b.reset.call(this);this._doReset()},process:function(a){this._append(a);return this._process()},
+finalize:function(a){a&&this._append(a);return this._doFinalize()},keySize:4,ivSize:4,_ENC_XFORM_MODE:1,_DEC_XFORM_MODE:2,_createHelper:function(a){return{encrypt:function(f,b,d){return("string"==typeof b?G:c).encrypt(a,f,b,d)},decrypt:function(f,b,d){return("string"==typeof b?G:c).decrypt(a,f,b,d)}}}});e.StreamCipher=q.extend({_doFinalize:function(){return this._process(!0)},blockSize:1});var a=l.mode={},v=function(a,f,b){var c=this._iv;c?this._iv=s:c=this._prevBlock;for(var d=0;d<b;d++)a[f+d]^=
+c[d]},u=(e.BlockCipherMode=n.extend({createEncryptor:function(a,f){return this.Encryptor.create(a,f)},createDecryptor:function(a,f){return this.Decryptor.create(a,f)},init:function(a,f){this._cipher=a;this._iv=f}})).extend();u.Encryptor=u.extend({processBlock:function(a,f){var b=this._cipher,c=b.blockSize;v.call(this,a,f,c);b.encryptBlock(a,f);this._prevBlock=a.slice(f,f+c)}});u.Decryptor=u.extend({processBlock:function(a,f){var b=this._cipher,c=b.blockSize,d=a.slice(f,f+c);b.decryptBlock(a,f);v.call(this,
+a,f,c);this._prevBlock=d}});a=a.CBC=u;u=(l.pad={}).Pkcs7={pad:function(a,f){for(var b=4*f,b=b-a.sigBytes%b,c=b<<24|b<<16|b<<8|b,d=[],e=0;e<b;e+=4)d.push(c);b=p.create(d,b);a.concat(b)},unpad:function(a){a.sigBytes-=a.words[a.sigBytes-1>>>2]&255}};e.BlockCipher=q.extend({cfg:q.cfg.extend({mode:a,padding:u}),reset:function(){q.reset.call(this);var a=this.cfg,b=a.iv,a=a.mode;if(this._xformMode==this._ENC_XFORM_MODE)var c=a.createEncryptor;else c=a.createDecryptor,this._minBufferSize=1;this._mode=c.call(a,
+this,b&&b.words)},_doProcessBlock:function(a,b){this._mode.processBlock(a,b)},_doFinalize:function(){var a=this.cfg.padding;if(this._xformMode==this._ENC_XFORM_MODE){a.pad(this._data,this.blockSize);var b=this._process(!0)}else b=this._process(!0),a.unpad(b);return b},blockSize:4});var w=e.CipherParams=n.extend({init:function(a){this.mixIn(a)},toString:function(a){return(a||this.formatter).stringify(this)}}),a=(l.format={}).OpenSSL={stringify:function(a){var b=a.ciphertext;a=a.salt;return(a?p.create([1398893684,
+1701076831]).concat(a).concat(b):b).toString(d)},parse:function(a){a=d.parse(a);var b=a.words;if(1398893684==b[0]&&1701076831==b[1]){var c=p.create(b.slice(2,4));b.splice(0,4);a.sigBytes-=16}return w.create({ciphertext:a,salt:c})}},c=e.SerializableCipher=n.extend({cfg:n.extend({format:a}),encrypt:function(a,b,c,d){d=this.cfg.extend(d);var e=a.createEncryptor(c,d);b=e.finalize(b);e=e.cfg;return w.create({ciphertext:b,key:c,iv:e.iv,algorithm:a,mode:e.mode,padding:e.padding,blockSize:a.blockSize,formatter:d.format})},
+decrypt:function(a,b,c,d){d=this.cfg.extend(d);b=this._parse(b,d.format);return a.createDecryptor(c,d).finalize(b.ciphertext)},_parse:function(a,b){return"string"==typeof a?b.parse(a,this):a}}),l=(l.kdf={}).OpenSSL={execute:function(a,b,c,d){d||(d=p.random(8));a=t.create({keySize:b+c}).compute(a,d);c=p.create(a.words.slice(b),4*c);a.sigBytes=4*b;return w.create({key:a,iv:c,salt:d})}},G=e.PasswordBasedCipher=c.extend({cfg:c.cfg.extend({kdf:l}),encrypt:function(a,b,d,e){e=this.cfg.extend(e);d=e.kdf.execute(d,
+a.keySize,a.ivSize);e.iv=d.iv;a=c.encrypt.call(this,a,b,d.key,e);a.mixIn(d);return a},decrypt:function(a,b,d,e){e=this.cfg.extend(e);b=this._parse(b,e.format);d=e.kdf.execute(d,a.keySize,a.ivSize,b.salt);e.iv=d.iv;return c.decrypt.call(this,a,b,d.key,e)}})}();
+(function(){function s(){for(var b=this._S,d=this._i,e=this._j,q=0,a=0;4>a;a++){var d=(d+1)%256,e=(e+b[d])%256,l=b[d];b[d]=b[e];b[e]=l;q|=b[(b[d]+b[e])%256]<<24-8*a}this._i=d;this._j=e;return q}var l=CryptoJS,e=l.lib.StreamCipher,n=l.algo,p=n.RC4=e.extend({_doReset:function(){for(var b=this._key,d=b.words,b=b.sigBytes,e=this._S=[],l=0;256>l;l++)e[l]=l;for(var a=l=0;256>l;l++){var n=l%b,a=(a+e[l]+(d[n>>>2]>>>24-8*(n%4)&255))%256,n=e[l];e[l]=e[a];e[a]=n}this._i=this._j=0},_doProcessBlock:function(b,
+d){b[d]^=s.call(this)},keySize:8,ivSize:0});l.RC4=e._createHelper(p);n=n.RC4Drop=p.extend({cfg:p.cfg.extend({drop:192}),_doReset:function(){p._doReset.call(this);for(var b=this.cfg.drop;0<b;b--)s.call(this)}});l.RC4Drop=e._createHelper(n)})();
diff --git a/library/cryptojs/rollups/ripemd160.js b/library/cryptojs/rollups/ripemd160.js
new file mode 100644
index 000000000..0f72d2865
--- /dev/null
+++ b/library/cryptojs/rollups/ripemd160.js
@@ -0,0 +1,29 @@
+/*
+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
+*/
+/*
+
+(c) 2012 by C?dric Mesnil. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+ - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+ - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 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.
+*/
+var CryptoJS=CryptoJS||function(j,k){var e={},l=e.lib={},z=function(){},t=l.Base={extend:function(a){z.prototype=this;var c=new z;a&&c.mixIn(a);c.hasOwnProperty("init")||(c.init=function(){c.$super.init.apply(this,arguments)});c.init.prototype=c;c.$super=this;return c},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var c in a)a.hasOwnProperty(c)&&(this[c]=a[c]);a.hasOwnProperty("toString")&&(this.toString=a.toString)},clone:function(){return this.init.prototype.extend(this)}},
+u=l.WordArray=t.extend({init:function(a,c){a=this.words=a||[];this.sigBytes=c!=k?c:4*a.length},toString:function(a){return(a||D).stringify(this)},concat:function(a){var c=this.words,h=a.words,d=this.sigBytes;a=a.sigBytes;this.clamp();if(d%4)for(var b=0;b<a;b++)c[d+b>>>2]|=(h[b>>>2]>>>24-8*(b%4)&255)<<24-8*((d+b)%4);else if(65535<h.length)for(b=0;b<a;b+=4)c[d+b>>>2]=h[b>>>2];else c.push.apply(c,h);this.sigBytes+=a;return this},clamp:function(){var a=this.words,c=this.sigBytes;a[c>>>2]&=4294967295<<
+32-8*(c%4);a.length=j.ceil(c/4)},clone:function(){var a=t.clone.call(this);a.words=this.words.slice(0);return a},random:function(a){for(var c=[],b=0;b<a;b+=4)c.push(4294967296*j.random()|0);return new u.init(c,a)}}),w=e.enc={},D=w.Hex={stringify:function(a){var c=a.words;a=a.sigBytes;for(var b=[],d=0;d<a;d++){var g=c[d>>>2]>>>24-8*(d%4)&255;b.push((g>>>4).toString(16));b.push((g&15).toString(16))}return b.join("")},parse:function(a){for(var c=a.length,b=[],d=0;d<c;d+=2)b[d>>>3]|=parseInt(a.substr(d,
+2),16)<<24-4*(d%8);return new u.init(b,c/2)}},A=w.Latin1={stringify:function(a){var c=a.words;a=a.sigBytes;for(var b=[],d=0;d<a;d++)b.push(String.fromCharCode(c[d>>>2]>>>24-8*(d%4)&255));return b.join("")},parse:function(a){for(var b=a.length,h=[],d=0;d<b;d++)h[d>>>2]|=(a.charCodeAt(d)&255)<<24-8*(d%4);return new u.init(h,b)}},g=w.Utf8={stringify:function(a){try{return decodeURIComponent(escape(A.stringify(a)))}catch(b){throw Error("Malformed UTF-8 data");}},parse:function(a){return A.parse(unescape(encodeURIComponent(a)))}},
+v=l.BufferedBlockAlgorithm=t.extend({reset:function(){this._data=new u.init;this._nDataBytes=0},_append:function(a){"string"==typeof a&&(a=g.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(a){var b=this._data,h=b.words,d=b.sigBytes,g=this.blockSize,v=d/(4*g),v=a?j.ceil(v):j.max((v|0)-this._minBufferSize,0);a=v*g;d=j.min(4*a,d);if(a){for(var e=0;e<a;e+=g)this._doProcessBlock(h,e);e=h.splice(0,a);b.sigBytes-=d}return new u.init(e,d)},clone:function(){var a=t.clone.call(this);
+a._data=this._data.clone();return a},_minBufferSize:0});l.Hasher=v.extend({cfg:t.extend(),init:function(a){this.cfg=this.cfg.extend(a);this.reset()},reset:function(){v.reset.call(this);this._doReset()},update:function(a){this._append(a);this._process();return this},finalize:function(a){a&&this._append(a);return this._doFinalize()},blockSize:16,_createHelper:function(a){return function(b,g){return(new a.init(g)).finalize(b)}},_createHmacHelper:function(a){return function(c,g){return(new b.HMAC.init(a,
+g)).finalize(c)}}});var b=e.algo={};return e}(Math);
+(function(){var j=CryptoJS,k=j.lib,e=k.WordArray,l=k.Hasher,k=j.algo,z=e.create([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,7,4,13,1,10,6,15,3,12,0,9,5,2,14,11,8,3,10,14,4,9,15,8,1,2,7,0,6,13,11,5,12,1,9,11,10,0,8,12,4,13,3,7,15,14,5,6,2,4,0,5,9,7,12,2,10,14,1,3,8,11,6,15,13]),t=e.create([5,14,7,0,9,2,11,4,13,6,15,8,1,10,3,12,6,11,3,7,0,13,5,10,14,15,8,12,4,9,1,2,15,5,1,3,7,14,6,9,11,8,12,2,10,0,4,13,8,6,4,1,3,11,15,0,5,12,2,13,9,7,10,14,12,15,10,4,1,5,8,7,6,2,13,14,0,3,9,11]),u=e.create([11,14,15,12,
+5,8,7,9,11,13,14,15,6,7,9,8,7,6,8,13,11,9,7,15,7,12,15,9,11,7,13,12,11,13,6,7,14,9,13,15,14,8,13,6,5,12,7,5,11,12,14,15,14,15,9,8,9,14,5,6,8,6,5,12,9,15,5,11,6,8,13,12,5,12,13,14,11,8,5,6]),w=e.create([8,9,9,11,13,15,15,5,7,7,8,11,14,14,12,6,9,13,15,7,12,8,9,11,7,7,12,7,6,15,13,11,9,7,15,11,8,6,6,14,12,13,5,14,13,13,7,5,15,5,8,11,14,14,6,14,6,9,12,9,12,5,15,8,8,5,12,9,12,5,14,6,8,13,6,5,15,13,11,11]),D=e.create([0,1518500249,1859775393,2400959708,2840853838]),A=e.create([1352829926,1548603684,1836072691,
+2053994217,0]),k=k.RIPEMD160=l.extend({_doReset:function(){this._hash=e.create([1732584193,4023233417,2562383102,271733878,3285377520])},_doProcessBlock:function(g,e){for(var b=0;16>b;b++){var a=e+b,c=g[a];g[a]=(c<<8|c>>>24)&16711935|(c<<24|c>>>8)&4278255360}var a=this._hash.words,c=D.words,h=A.words,d=z.words,j=t.words,k=u.words,l=w.words,B,m,n,p,x,C,q,r,s,y;C=B=a[0];q=m=a[1];r=n=a[2];s=p=a[3];y=x=a[4];for(var f,b=0;80>b;b+=1)f=B+g[e+d[b]]|0,f=16>b?f+((m^n^p)+c[0]):32>b?f+((m&n|~m&p)+c[1]):48>b?
+f+(((m|~n)^p)+c[2]):64>b?f+((m&p|n&~p)+c[3]):f+((m^(n|~p))+c[4]),f|=0,f=f<<k[b]|f>>>32-k[b],f=f+x|0,B=x,x=p,p=n<<10|n>>>22,n=m,m=f,f=C+g[e+j[b]]|0,f=16>b?f+((q^(r|~s))+h[0]):32>b?f+((q&s|r&~s)+h[1]):48>b?f+(((q|~r)^s)+h[2]):64>b?f+((q&r|~q&s)+h[3]):f+((q^r^s)+h[4]),f|=0,f=f<<l[b]|f>>>32-l[b],f=f+y|0,C=y,y=s,s=r<<10|r>>>22,r=q,q=f;f=a[1]+n+s|0;a[1]=a[2]+p+y|0;a[2]=a[3]+x+C|0;a[3]=a[4]+B+q|0;a[4]=a[0]+m+r|0;a[0]=f},_doFinalize:function(){var g=this._data,e=g.words,b=8*this._nDataBytes,a=8*g.sigBytes;
+e[a>>>5]|=128<<24-a%32;e[(a+64>>>9<<4)+14]=(b<<8|b>>>24)&16711935|(b<<24|b>>>8)&4278255360;g.sigBytes=4*(e.length+1);this._process();g=this._hash;e=g.words;for(b=0;5>b;b++)a=e[b],e[b]=(a<<8|a>>>24)&16711935|(a<<24|a>>>8)&4278255360;return g},clone:function(){var e=l.clone.call(this);e._hash=this._hash.clone();return e}});j.RIPEMD160=l._createHelper(k);j.HmacRIPEMD160=l._createHmacHelper(k)})(Math);
diff --git a/library/cryptojs/rollups/sha1.js b/library/cryptojs/rollups/sha1.js
new file mode 100644
index 000000000..d0d589f71
--- /dev/null
+++ b/library/cryptojs/rollups/sha1.js
@@ -0,0 +1,15 @@
+/*
+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
+*/
+var CryptoJS=CryptoJS||function(e,m){var p={},j=p.lib={},l=function(){},f=j.Base={extend:function(a){l.prototype=this;var c=new l;a&&c.mixIn(a);c.hasOwnProperty("init")||(c.init=function(){c.$super.init.apply(this,arguments)});c.init.prototype=c;c.$super=this;return c},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var c in a)a.hasOwnProperty(c)&&(this[c]=a[c]);a.hasOwnProperty("toString")&&(this.toString=a.toString)},clone:function(){return this.init.prototype.extend(this)}},
+n=j.WordArray=f.extend({init:function(a,c){a=this.words=a||[];this.sigBytes=c!=m?c:4*a.length},toString:function(a){return(a||h).stringify(this)},concat:function(a){var c=this.words,q=a.words,d=this.sigBytes;a=a.sigBytes;this.clamp();if(d%4)for(var b=0;b<a;b++)c[d+b>>>2]|=(q[b>>>2]>>>24-8*(b%4)&255)<<24-8*((d+b)%4);else if(65535<q.length)for(b=0;b<a;b+=4)c[d+b>>>2]=q[b>>>2];else c.push.apply(c,q);this.sigBytes+=a;return this},clamp:function(){var a=this.words,c=this.sigBytes;a[c>>>2]&=4294967295<<
+32-8*(c%4);a.length=e.ceil(c/4)},clone:function(){var a=f.clone.call(this);a.words=this.words.slice(0);return a},random:function(a){for(var c=[],b=0;b<a;b+=4)c.push(4294967296*e.random()|0);return new n.init(c,a)}}),b=p.enc={},h=b.Hex={stringify:function(a){var c=a.words;a=a.sigBytes;for(var b=[],d=0;d<a;d++){var f=c[d>>>2]>>>24-8*(d%4)&255;b.push((f>>>4).toString(16));b.push((f&15).toString(16))}return b.join("")},parse:function(a){for(var c=a.length,b=[],d=0;d<c;d+=2)b[d>>>3]|=parseInt(a.substr(d,
+2),16)<<24-4*(d%8);return new n.init(b,c/2)}},g=b.Latin1={stringify:function(a){var c=a.words;a=a.sigBytes;for(var b=[],d=0;d<a;d++)b.push(String.fromCharCode(c[d>>>2]>>>24-8*(d%4)&255));return b.join("")},parse:function(a){for(var c=a.length,b=[],d=0;d<c;d++)b[d>>>2]|=(a.charCodeAt(d)&255)<<24-8*(d%4);return new n.init(b,c)}},r=b.Utf8={stringify:function(a){try{return decodeURIComponent(escape(g.stringify(a)))}catch(c){throw Error("Malformed UTF-8 data");}},parse:function(a){return g.parse(unescape(encodeURIComponent(a)))}},
+k=j.BufferedBlockAlgorithm=f.extend({reset:function(){this._data=new n.init;this._nDataBytes=0},_append:function(a){"string"==typeof a&&(a=r.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(a){var c=this._data,b=c.words,d=c.sigBytes,f=this.blockSize,h=d/(4*f),h=a?e.ceil(h):e.max((h|0)-this._minBufferSize,0);a=h*f;d=e.min(4*a,d);if(a){for(var g=0;g<a;g+=f)this._doProcessBlock(b,g);g=b.splice(0,a);c.sigBytes-=d}return new n.init(g,d)},clone:function(){var a=f.clone.call(this);
+a._data=this._data.clone();return a},_minBufferSize:0});j.Hasher=k.extend({cfg:f.extend(),init:function(a){this.cfg=this.cfg.extend(a);this.reset()},reset:function(){k.reset.call(this);this._doReset()},update:function(a){this._append(a);this._process();return this},finalize:function(a){a&&this._append(a);return this._doFinalize()},blockSize:16,_createHelper:function(a){return function(c,b){return(new a.init(b)).finalize(c)}},_createHmacHelper:function(a){return function(b,f){return(new s.HMAC.init(a,
+f)).finalize(b)}}});var s=p.algo={};return p}(Math);
+(function(){var e=CryptoJS,m=e.lib,p=m.WordArray,j=m.Hasher,l=[],m=e.algo.SHA1=j.extend({_doReset:function(){this._hash=new p.init([1732584193,4023233417,2562383102,271733878,3285377520])},_doProcessBlock:function(f,n){for(var b=this._hash.words,h=b[0],g=b[1],e=b[2],k=b[3],j=b[4],a=0;80>a;a++){if(16>a)l[a]=f[n+a]|0;else{var c=l[a-3]^l[a-8]^l[a-14]^l[a-16];l[a]=c<<1|c>>>31}c=(h<<5|h>>>27)+j+l[a];c=20>a?c+((g&e|~g&k)+1518500249):40>a?c+((g^e^k)+1859775393):60>a?c+((g&e|g&k|e&k)-1894007588):c+((g^e^
+k)-899497514);j=k;k=e;e=g<<30|g>>>2;g=h;h=c}b[0]=b[0]+h|0;b[1]=b[1]+g|0;b[2]=b[2]+e|0;b[3]=b[3]+k|0;b[4]=b[4]+j|0},_doFinalize:function(){var f=this._data,e=f.words,b=8*this._nDataBytes,h=8*f.sigBytes;e[h>>>5]|=128<<24-h%32;e[(h+64>>>9<<4)+14]=Math.floor(b/4294967296);e[(h+64>>>9<<4)+15]=b;f.sigBytes=4*e.length;this._process();return this._hash},clone:function(){var e=j.clone.call(this);e._hash=this._hash.clone();return e}});e.SHA1=j._createHelper(m);e.HmacSHA1=j._createHmacHelper(m)})();
diff --git a/library/cryptojs/rollups/sha224.js b/library/cryptojs/rollups/sha224.js
new file mode 100644
index 000000000..e1653c988
--- /dev/null
+++ b/library/cryptojs/rollups/sha224.js
@@ -0,0 +1,17 @@
+/*
+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
+*/
+var CryptoJS=CryptoJS||function(g,l){var f={},k=f.lib={},h=function(){},m=k.Base={extend:function(a){h.prototype=this;var c=new h;a&&c.mixIn(a);c.hasOwnProperty("init")||(c.init=function(){c.$super.init.apply(this,arguments)});c.init.prototype=c;c.$super=this;return c},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var c in a)a.hasOwnProperty(c)&&(this[c]=a[c]);a.hasOwnProperty("toString")&&(this.toString=a.toString)},clone:function(){return this.init.prototype.extend(this)}},
+q=k.WordArray=m.extend({init:function(a,c){a=this.words=a||[];this.sigBytes=c!=l?c:4*a.length},toString:function(a){return(a||s).stringify(this)},concat:function(a){var c=this.words,d=a.words,b=this.sigBytes;a=a.sigBytes;this.clamp();if(b%4)for(var e=0;e<a;e++)c[b+e>>>2]|=(d[e>>>2]>>>24-8*(e%4)&255)<<24-8*((b+e)%4);else if(65535<d.length)for(e=0;e<a;e+=4)c[b+e>>>2]=d[e>>>2];else c.push.apply(c,d);this.sigBytes+=a;return this},clamp:function(){var a=this.words,c=this.sigBytes;a[c>>>2]&=4294967295<<
+32-8*(c%4);a.length=g.ceil(c/4)},clone:function(){var a=m.clone.call(this);a.words=this.words.slice(0);return a},random:function(a){for(var c=[],d=0;d<a;d+=4)c.push(4294967296*g.random()|0);return new q.init(c,a)}}),t=f.enc={},s=t.Hex={stringify:function(a){var c=a.words;a=a.sigBytes;for(var d=[],b=0;b<a;b++){var e=c[b>>>2]>>>24-8*(b%4)&255;d.push((e>>>4).toString(16));d.push((e&15).toString(16))}return d.join("")},parse:function(a){for(var c=a.length,d=[],b=0;b<c;b+=2)d[b>>>3]|=parseInt(a.substr(b,
+2),16)<<24-4*(b%8);return new q.init(d,c/2)}},n=t.Latin1={stringify:function(a){var c=a.words;a=a.sigBytes;for(var d=[],b=0;b<a;b++)d.push(String.fromCharCode(c[b>>>2]>>>24-8*(b%4)&255));return d.join("")},parse:function(a){for(var c=a.length,d=[],b=0;b<c;b++)d[b>>>2]|=(a.charCodeAt(b)&255)<<24-8*(b%4);return new q.init(d,c)}},j=t.Utf8={stringify:function(a){try{return decodeURIComponent(escape(n.stringify(a)))}catch(c){throw Error("Malformed UTF-8 data");}},parse:function(a){return n.parse(unescape(encodeURIComponent(a)))}},
+w=k.BufferedBlockAlgorithm=m.extend({reset:function(){this._data=new q.init;this._nDataBytes=0},_append:function(a){"string"==typeof a&&(a=j.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(a){var c=this._data,d=c.words,b=c.sigBytes,e=this.blockSize,f=b/(4*e),f=a?g.ceil(f):g.max((f|0)-this._minBufferSize,0);a=f*e;b=g.min(4*a,b);if(a){for(var u=0;u<a;u+=e)this._doProcessBlock(d,u);u=d.splice(0,a);c.sigBytes-=b}return new q.init(u,b)},clone:function(){var a=m.clone.call(this);
+a._data=this._data.clone();return a},_minBufferSize:0});k.Hasher=w.extend({cfg:m.extend(),init:function(a){this.cfg=this.cfg.extend(a);this.reset()},reset:function(){w.reset.call(this);this._doReset()},update:function(a){this._append(a);this._process();return this},finalize:function(a){a&&this._append(a);return this._doFinalize()},blockSize:16,_createHelper:function(a){return function(c,d){return(new a.init(d)).finalize(c)}},_createHmacHelper:function(a){return function(c,d){return(new v.HMAC.init(a,
+d)).finalize(c)}}});var v=f.algo={};return f}(Math);
+(function(g){for(var l=CryptoJS,f=l.lib,k=f.WordArray,h=f.Hasher,f=l.algo,m=[],q=[],t=function(a){return 4294967296*(a-(a|0))|0},s=2,n=0;64>n;){var j;a:{j=s;for(var w=g.sqrt(j),v=2;v<=w;v++)if(!(j%v)){j=!1;break a}j=!0}j&&(8>n&&(m[n]=t(g.pow(s,0.5))),q[n]=t(g.pow(s,1/3)),n++);s++}var a=[],f=f.SHA256=h.extend({_doReset:function(){this._hash=new k.init(m.slice(0))},_doProcessBlock:function(c,d){for(var b=this._hash.words,e=b[0],f=b[1],g=b[2],k=b[3],h=b[4],l=b[5],m=b[6],n=b[7],p=0;64>p;p++){if(16>p)a[p]=
+c[d+p]|0;else{var j=a[p-15],r=a[p-2];a[p]=((j<<25|j>>>7)^(j<<14|j>>>18)^j>>>3)+a[p-7]+((r<<15|r>>>17)^(r<<13|r>>>19)^r>>>10)+a[p-16]}j=n+((h<<26|h>>>6)^(h<<21|h>>>11)^(h<<7|h>>>25))+(h&l^~h&m)+q[p]+a[p];r=((e<<30|e>>>2)^(e<<19|e>>>13)^(e<<10|e>>>22))+(e&f^e&g^f&g);n=m;m=l;l=h;h=k+j|0;k=g;g=f;f=e;e=j+r|0}b[0]=b[0]+e|0;b[1]=b[1]+f|0;b[2]=b[2]+g|0;b[3]=b[3]+k|0;b[4]=b[4]+h|0;b[5]=b[5]+l|0;b[6]=b[6]+m|0;b[7]=b[7]+n|0},_doFinalize:function(){var a=this._data,d=a.words,b=8*this._nDataBytes,e=8*a.sigBytes;
+d[e>>>5]|=128<<24-e%32;d[(e+64>>>9<<4)+14]=g.floor(b/4294967296);d[(e+64>>>9<<4)+15]=b;a.sigBytes=4*d.length;this._process();return this._hash},clone:function(){var a=h.clone.call(this);a._hash=this._hash.clone();return a}});l.SHA256=h._createHelper(f);l.HmacSHA256=h._createHmacHelper(f)})(Math);
+(function(){var g=CryptoJS,l=g.lib.WordArray,f=g.algo,k=f.SHA256,f=f.SHA224=k.extend({_doReset:function(){this._hash=new l.init([3238371032,914150663,812702999,4144912697,4290775857,1750603025,1694076839,3204075428])},_doFinalize:function(){var f=k._doFinalize.call(this);f.sigBytes-=4;return f}});g.SHA224=k._createHelper(f);g.HmacSHA224=k._createHmacHelper(f)})();
diff --git a/library/cryptojs/rollups/sha256.js b/library/cryptojs/rollups/sha256.js
new file mode 100644
index 000000000..529db30cd
--- /dev/null
+++ b/library/cryptojs/rollups/sha256.js
@@ -0,0 +1,16 @@
+/*
+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
+*/
+var CryptoJS=CryptoJS||function(h,s){var f={},t=f.lib={},g=function(){},j=t.Base={extend:function(a){g.prototype=this;var c=new g;a&&c.mixIn(a);c.hasOwnProperty("init")||(c.init=function(){c.$super.init.apply(this,arguments)});c.init.prototype=c;c.$super=this;return c},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var c in a)a.hasOwnProperty(c)&&(this[c]=a[c]);a.hasOwnProperty("toString")&&(this.toString=a.toString)},clone:function(){return this.init.prototype.extend(this)}},
+q=t.WordArray=j.extend({init:function(a,c){a=this.words=a||[];this.sigBytes=c!=s?c:4*a.length},toString:function(a){return(a||u).stringify(this)},concat:function(a){var c=this.words,d=a.words,b=this.sigBytes;a=a.sigBytes;this.clamp();if(b%4)for(var e=0;e<a;e++)c[b+e>>>2]|=(d[e>>>2]>>>24-8*(e%4)&255)<<24-8*((b+e)%4);else if(65535<d.length)for(e=0;e<a;e+=4)c[b+e>>>2]=d[e>>>2];else c.push.apply(c,d);this.sigBytes+=a;return this},clamp:function(){var a=this.words,c=this.sigBytes;a[c>>>2]&=4294967295<<
+32-8*(c%4);a.length=h.ceil(c/4)},clone:function(){var a=j.clone.call(this);a.words=this.words.slice(0);return a},random:function(a){for(var c=[],d=0;d<a;d+=4)c.push(4294967296*h.random()|0);return new q.init(c,a)}}),v=f.enc={},u=v.Hex={stringify:function(a){var c=a.words;a=a.sigBytes;for(var d=[],b=0;b<a;b++){var e=c[b>>>2]>>>24-8*(b%4)&255;d.push((e>>>4).toString(16));d.push((e&15).toString(16))}return d.join("")},parse:function(a){for(var c=a.length,d=[],b=0;b<c;b+=2)d[b>>>3]|=parseInt(a.substr(b,
+2),16)<<24-4*(b%8);return new q.init(d,c/2)}},k=v.Latin1={stringify:function(a){var c=a.words;a=a.sigBytes;for(var d=[],b=0;b<a;b++)d.push(String.fromCharCode(c[b>>>2]>>>24-8*(b%4)&255));return d.join("")},parse:function(a){for(var c=a.length,d=[],b=0;b<c;b++)d[b>>>2]|=(a.charCodeAt(b)&255)<<24-8*(b%4);return new q.init(d,c)}},l=v.Utf8={stringify:function(a){try{return decodeURIComponent(escape(k.stringify(a)))}catch(c){throw Error("Malformed UTF-8 data");}},parse:function(a){return k.parse(unescape(encodeURIComponent(a)))}},
+x=t.BufferedBlockAlgorithm=j.extend({reset:function(){this._data=new q.init;this._nDataBytes=0},_append:function(a){"string"==typeof a&&(a=l.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(a){var c=this._data,d=c.words,b=c.sigBytes,e=this.blockSize,f=b/(4*e),f=a?h.ceil(f):h.max((f|0)-this._minBufferSize,0);a=f*e;b=h.min(4*a,b);if(a){for(var m=0;m<a;m+=e)this._doProcessBlock(d,m);m=d.splice(0,a);c.sigBytes-=b}return new q.init(m,b)},clone:function(){var a=j.clone.call(this);
+a._data=this._data.clone();return a},_minBufferSize:0});t.Hasher=x.extend({cfg:j.extend(),init:function(a){this.cfg=this.cfg.extend(a);this.reset()},reset:function(){x.reset.call(this);this._doReset()},update:function(a){this._append(a);this._process();return this},finalize:function(a){a&&this._append(a);return this._doFinalize()},blockSize:16,_createHelper:function(a){return function(c,d){return(new a.init(d)).finalize(c)}},_createHmacHelper:function(a){return function(c,d){return(new w.HMAC.init(a,
+d)).finalize(c)}}});var w=f.algo={};return f}(Math);
+(function(h){for(var s=CryptoJS,f=s.lib,t=f.WordArray,g=f.Hasher,f=s.algo,j=[],q=[],v=function(a){return 4294967296*(a-(a|0))|0},u=2,k=0;64>k;){var l;a:{l=u;for(var x=h.sqrt(l),w=2;w<=x;w++)if(!(l%w)){l=!1;break a}l=!0}l&&(8>k&&(j[k]=v(h.pow(u,0.5))),q[k]=v(h.pow(u,1/3)),k++);u++}var a=[],f=f.SHA256=g.extend({_doReset:function(){this._hash=new t.init(j.slice(0))},_doProcessBlock:function(c,d){for(var b=this._hash.words,e=b[0],f=b[1],m=b[2],h=b[3],p=b[4],j=b[5],k=b[6],l=b[7],n=0;64>n;n++){if(16>n)a[n]=
+c[d+n]|0;else{var r=a[n-15],g=a[n-2];a[n]=((r<<25|r>>>7)^(r<<14|r>>>18)^r>>>3)+a[n-7]+((g<<15|g>>>17)^(g<<13|g>>>19)^g>>>10)+a[n-16]}r=l+((p<<26|p>>>6)^(p<<21|p>>>11)^(p<<7|p>>>25))+(p&j^~p&k)+q[n]+a[n];g=((e<<30|e>>>2)^(e<<19|e>>>13)^(e<<10|e>>>22))+(e&f^e&m^f&m);l=k;k=j;j=p;p=h+r|0;h=m;m=f;f=e;e=r+g|0}b[0]=b[0]+e|0;b[1]=b[1]+f|0;b[2]=b[2]+m|0;b[3]=b[3]+h|0;b[4]=b[4]+p|0;b[5]=b[5]+j|0;b[6]=b[6]+k|0;b[7]=b[7]+l|0},_doFinalize:function(){var a=this._data,d=a.words,b=8*this._nDataBytes,e=8*a.sigBytes;
+d[e>>>5]|=128<<24-e%32;d[(e+64>>>9<<4)+14]=h.floor(b/4294967296);d[(e+64>>>9<<4)+15]=b;a.sigBytes=4*d.length;this._process();return this._hash},clone:function(){var a=g.clone.call(this);a._hash=this._hash.clone();return a}});s.SHA256=g._createHelper(f);s.HmacSHA256=g._createHmacHelper(f)})(Math);
diff --git a/library/cryptojs/rollups/sha3.js b/library/cryptojs/rollups/sha3.js
new file mode 100644
index 000000000..652505c6b
--- /dev/null
+++ b/library/cryptojs/rollups/sha3.js
@@ -0,0 +1,19 @@
+/*
+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
+*/
+var CryptoJS=CryptoJS||function(v,p){var d={},u=d.lib={},r=function(){},f=u.Base={extend:function(a){r.prototype=this;var b=new r;a&&b.mixIn(a);b.hasOwnProperty("init")||(b.init=function(){b.$super.init.apply(this,arguments)});b.init.prototype=b;b.$super=this;return b},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var b in a)a.hasOwnProperty(b)&&(this[b]=a[b]);a.hasOwnProperty("toString")&&(this.toString=a.toString)},clone:function(){return this.init.prototype.extend(this)}},
+s=u.WordArray=f.extend({init:function(a,b){a=this.words=a||[];this.sigBytes=b!=p?b:4*a.length},toString:function(a){return(a||y).stringify(this)},concat:function(a){var b=this.words,c=a.words,j=this.sigBytes;a=a.sigBytes;this.clamp();if(j%4)for(var n=0;n<a;n++)b[j+n>>>2]|=(c[n>>>2]>>>24-8*(n%4)&255)<<24-8*((j+n)%4);else if(65535<c.length)for(n=0;n<a;n+=4)b[j+n>>>2]=c[n>>>2];else b.push.apply(b,c);this.sigBytes+=a;return this},clamp:function(){var a=this.words,b=this.sigBytes;a[b>>>2]&=4294967295<<
+32-8*(b%4);a.length=v.ceil(b/4)},clone:function(){var a=f.clone.call(this);a.words=this.words.slice(0);return a},random:function(a){for(var b=[],c=0;c<a;c+=4)b.push(4294967296*v.random()|0);return new s.init(b,a)}}),x=d.enc={},y=x.Hex={stringify:function(a){var b=a.words;a=a.sigBytes;for(var c=[],j=0;j<a;j++){var n=b[j>>>2]>>>24-8*(j%4)&255;c.push((n>>>4).toString(16));c.push((n&15).toString(16))}return c.join("")},parse:function(a){for(var b=a.length,c=[],j=0;j<b;j+=2)c[j>>>3]|=parseInt(a.substr(j,
+2),16)<<24-4*(j%8);return new s.init(c,b/2)}},e=x.Latin1={stringify:function(a){var b=a.words;a=a.sigBytes;for(var c=[],j=0;j<a;j++)c.push(String.fromCharCode(b[j>>>2]>>>24-8*(j%4)&255));return c.join("")},parse:function(a){for(var b=a.length,c=[],j=0;j<b;j++)c[j>>>2]|=(a.charCodeAt(j)&255)<<24-8*(j%4);return new s.init(c,b)}},q=x.Utf8={stringify:function(a){try{return decodeURIComponent(escape(e.stringify(a)))}catch(b){throw Error("Malformed UTF-8 data");}},parse:function(a){return e.parse(unescape(encodeURIComponent(a)))}},
+t=u.BufferedBlockAlgorithm=f.extend({reset:function(){this._data=new s.init;this._nDataBytes=0},_append:function(a){"string"==typeof a&&(a=q.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(a){var b=this._data,c=b.words,j=b.sigBytes,n=this.blockSize,e=j/(4*n),e=a?v.ceil(e):v.max((e|0)-this._minBufferSize,0);a=e*n;j=v.min(4*a,j);if(a){for(var f=0;f<a;f+=n)this._doProcessBlock(c,f);f=c.splice(0,a);b.sigBytes-=j}return new s.init(f,j)},clone:function(){var a=f.clone.call(this);
+a._data=this._data.clone();return a},_minBufferSize:0});u.Hasher=t.extend({cfg:f.extend(),init:function(a){this.cfg=this.cfg.extend(a);this.reset()},reset:function(){t.reset.call(this);this._doReset()},update:function(a){this._append(a);this._process();return this},finalize:function(a){a&&this._append(a);return this._doFinalize()},blockSize:16,_createHelper:function(a){return function(b,c){return(new a.init(c)).finalize(b)}},_createHmacHelper:function(a){return function(b,c){return(new w.HMAC.init(a,
+c)).finalize(b)}}});var w=d.algo={};return d}(Math);
+(function(v){var p=CryptoJS,d=p.lib,u=d.Base,r=d.WordArray,p=p.x64={};p.Word=u.extend({init:function(f,s){this.high=f;this.low=s}});p.WordArray=u.extend({init:function(f,s){f=this.words=f||[];this.sigBytes=s!=v?s:8*f.length},toX32:function(){for(var f=this.words,s=f.length,d=[],p=0;p<s;p++){var e=f[p];d.push(e.high);d.push(e.low)}return r.create(d,this.sigBytes)},clone:function(){for(var f=u.clone.call(this),d=f.words=this.words.slice(0),p=d.length,r=0;r<p;r++)d[r]=d[r].clone();return f}})})();
+(function(v){for(var p=CryptoJS,d=p.lib,u=d.WordArray,r=d.Hasher,f=p.x64.Word,d=p.algo,s=[],x=[],y=[],e=1,q=0,t=0;24>t;t++){s[e+5*q]=(t+1)*(t+2)/2%64;var w=(2*e+3*q)%5,e=q%5,q=w}for(e=0;5>e;e++)for(q=0;5>q;q++)x[e+5*q]=q+5*((2*e+3*q)%5);e=1;for(q=0;24>q;q++){for(var a=w=t=0;7>a;a++){if(e&1){var b=(1<<a)-1;32>b?w^=1<<b:t^=1<<b-32}e=e&128?e<<1^113:e<<1}y[q]=f.create(t,w)}for(var c=[],e=0;25>e;e++)c[e]=f.create();d=d.SHA3=r.extend({cfg:r.cfg.extend({outputLength:512}),_doReset:function(){for(var a=this._state=
+[],b=0;25>b;b++)a[b]=new f.init;this.blockSize=(1600-2*this.cfg.outputLength)/32},_doProcessBlock:function(a,b){for(var e=this._state,f=this.blockSize/2,h=0;h<f;h++){var l=a[b+2*h],m=a[b+2*h+1],l=(l<<8|l>>>24)&16711935|(l<<24|l>>>8)&4278255360,m=(m<<8|m>>>24)&16711935|(m<<24|m>>>8)&4278255360,g=e[h];g.high^=m;g.low^=l}for(f=0;24>f;f++){for(h=0;5>h;h++){for(var d=l=0,k=0;5>k;k++)g=e[h+5*k],l^=g.high,d^=g.low;g=c[h];g.high=l;g.low=d}for(h=0;5>h;h++){g=c[(h+4)%5];l=c[(h+1)%5];m=l.high;k=l.low;l=g.high^
+(m<<1|k>>>31);d=g.low^(k<<1|m>>>31);for(k=0;5>k;k++)g=e[h+5*k],g.high^=l,g.low^=d}for(m=1;25>m;m++)g=e[m],h=g.high,g=g.low,k=s[m],32>k?(l=h<<k|g>>>32-k,d=g<<k|h>>>32-k):(l=g<<k-32|h>>>64-k,d=h<<k-32|g>>>64-k),g=c[x[m]],g.high=l,g.low=d;g=c[0];h=e[0];g.high=h.high;g.low=h.low;for(h=0;5>h;h++)for(k=0;5>k;k++)m=h+5*k,g=e[m],l=c[m],m=c[(h+1)%5+5*k],d=c[(h+2)%5+5*k],g.high=l.high^~m.high&d.high,g.low=l.low^~m.low&d.low;g=e[0];h=y[f];g.high^=h.high;g.low^=h.low}},_doFinalize:function(){var a=this._data,
+b=a.words,c=8*a.sigBytes,e=32*this.blockSize;b[c>>>5]|=1<<24-c%32;b[(v.ceil((c+1)/e)*e>>>5)-1]|=128;a.sigBytes=4*b.length;this._process();for(var a=this._state,b=this.cfg.outputLength/8,c=b/8,e=[],h=0;h<c;h++){var d=a[h],f=d.high,d=d.low,f=(f<<8|f>>>24)&16711935|(f<<24|f>>>8)&4278255360,d=(d<<8|d>>>24)&16711935|(d<<24|d>>>8)&4278255360;e.push(d);e.push(f)}return new u.init(e,b)},clone:function(){for(var a=r.clone.call(this),b=a._state=this._state.slice(0),c=0;25>c;c++)b[c]=b[c].clone();return a}});
+p.SHA3=r._createHelper(d);p.HmacSHA3=r._createHmacHelper(d)})(Math);
diff --git a/library/cryptojs/rollups/sha384.js b/library/cryptojs/rollups/sha384.js
new file mode 100644
index 000000000..dec5f581c
--- /dev/null
+++ b/library/cryptojs/rollups/sha384.js
@@ -0,0 +1,25 @@
+/*
+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
+*/
+var CryptoJS=CryptoJS||function(a,c){var d={},j=d.lib={},f=function(){},m=j.Base={extend:function(a){f.prototype=this;var b=new f;a&&b.mixIn(a);b.hasOwnProperty("init")||(b.init=function(){b.$super.init.apply(this,arguments)});b.init.prototype=b;b.$super=this;return b},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var b in a)a.hasOwnProperty(b)&&(this[b]=a[b]);a.hasOwnProperty("toString")&&(this.toString=a.toString)},clone:function(){return this.init.prototype.extend(this)}},
+B=j.WordArray=m.extend({init:function(a,b){a=this.words=a||[];this.sigBytes=b!=c?b:4*a.length},toString:function(a){return(a||y).stringify(this)},concat:function(a){var b=this.words,g=a.words,e=this.sigBytes;a=a.sigBytes;this.clamp();if(e%4)for(var k=0;k<a;k++)b[e+k>>>2]|=(g[k>>>2]>>>24-8*(k%4)&255)<<24-8*((e+k)%4);else if(65535<g.length)for(k=0;k<a;k+=4)b[e+k>>>2]=g[k>>>2];else b.push.apply(b,g);this.sigBytes+=a;return this},clamp:function(){var n=this.words,b=this.sigBytes;n[b>>>2]&=4294967295<<
+32-8*(b%4);n.length=a.ceil(b/4)},clone:function(){var a=m.clone.call(this);a.words=this.words.slice(0);return a},random:function(n){for(var b=[],g=0;g<n;g+=4)b.push(4294967296*a.random()|0);return new B.init(b,n)}}),v=d.enc={},y=v.Hex={stringify:function(a){var b=a.words;a=a.sigBytes;for(var g=[],e=0;e<a;e++){var k=b[e>>>2]>>>24-8*(e%4)&255;g.push((k>>>4).toString(16));g.push((k&15).toString(16))}return g.join("")},parse:function(a){for(var b=a.length,g=[],e=0;e<b;e+=2)g[e>>>3]|=parseInt(a.substr(e,
+2),16)<<24-4*(e%8);return new B.init(g,b/2)}},F=v.Latin1={stringify:function(a){var b=a.words;a=a.sigBytes;for(var g=[],e=0;e<a;e++)g.push(String.fromCharCode(b[e>>>2]>>>24-8*(e%4)&255));return g.join("")},parse:function(a){for(var b=a.length,g=[],e=0;e<b;e++)g[e>>>2]|=(a.charCodeAt(e)&255)<<24-8*(e%4);return new B.init(g,b)}},ha=v.Utf8={stringify:function(a){try{return decodeURIComponent(escape(F.stringify(a)))}catch(b){throw Error("Malformed UTF-8 data");}},parse:function(a){return F.parse(unescape(encodeURIComponent(a)))}},
+Z=j.BufferedBlockAlgorithm=m.extend({reset:function(){this._data=new B.init;this._nDataBytes=0},_append:function(a){"string"==typeof a&&(a=ha.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(n){var b=this._data,g=b.words,e=b.sigBytes,k=this.blockSize,m=e/(4*k),m=n?a.ceil(m):a.max((m|0)-this._minBufferSize,0);n=m*k;e=a.min(4*n,e);if(n){for(var c=0;c<n;c+=k)this._doProcessBlock(g,c);c=g.splice(0,n);b.sigBytes-=e}return new B.init(c,e)},clone:function(){var a=m.clone.call(this);
+a._data=this._data.clone();return a},_minBufferSize:0});j.Hasher=Z.extend({cfg:m.extend(),init:function(a){this.cfg=this.cfg.extend(a);this.reset()},reset:function(){Z.reset.call(this);this._doReset()},update:function(a){this._append(a);this._process();return this},finalize:function(a){a&&this._append(a);return this._doFinalize()},blockSize:16,_createHelper:function(a){return function(b,g){return(new a.init(g)).finalize(b)}},_createHmacHelper:function(a){return function(b,g){return(new ia.HMAC.init(a,
+g)).finalize(b)}}});var ia=d.algo={};return d}(Math);
+(function(a){var c=CryptoJS,d=c.lib,j=d.Base,f=d.WordArray,c=c.x64={};c.Word=j.extend({init:function(a,c){this.high=a;this.low=c}});c.WordArray=j.extend({init:function(c,d){c=this.words=c||[];this.sigBytes=d!=a?d:8*c.length},toX32:function(){for(var a=this.words,c=a.length,d=[],j=0;j<c;j++){var F=a[j];d.push(F.high);d.push(F.low)}return f.create(d,this.sigBytes)},clone:function(){for(var a=j.clone.call(this),c=a.words=this.words.slice(0),d=c.length,f=0;f<d;f++)c[f]=c[f].clone();return a}})})();
+(function(){function a(){return f.create.apply(f,arguments)}for(var c=CryptoJS,d=c.lib.Hasher,j=c.x64,f=j.Word,m=j.WordArray,j=c.algo,B=[a(1116352408,3609767458),a(1899447441,602891725),a(3049323471,3964484399),a(3921009573,2173295548),a(961987163,4081628472),a(1508970993,3053834265),a(2453635748,2937671579),a(2870763221,3664609560),a(3624381080,2734883394),a(310598401,1164996542),a(607225278,1323610764),a(1426881987,3590304994),a(1925078388,4068182383),a(2162078206,991336113),a(2614888103,633803317),
+a(3248222580,3479774868),a(3835390401,2666613458),a(4022224774,944711139),a(264347078,2341262773),a(604807628,2007800933),a(770255983,1495990901),a(1249150122,1856431235),a(1555081692,3175218132),a(1996064986,2198950837),a(2554220882,3999719339),a(2821834349,766784016),a(2952996808,2566594879),a(3210313671,3203337956),a(3336571891,1034457026),a(3584528711,2466948901),a(113926993,3758326383),a(338241895,168717936),a(666307205,1188179964),a(773529912,1546045734),a(1294757372,1522805485),a(1396182291,
+2643833823),a(1695183700,2343527390),a(1986661051,1014477480),a(2177026350,1206759142),a(2456956037,344077627),a(2730485921,1290863460),a(2820302411,3158454273),a(3259730800,3505952657),a(3345764771,106217008),a(3516065817,3606008344),a(3600352804,1432725776),a(4094571909,1467031594),a(275423344,851169720),a(430227734,3100823752),a(506948616,1363258195),a(659060556,3750685593),a(883997877,3785050280),a(958139571,3318307427),a(1322822218,3812723403),a(1537002063,2003034995),a(1747873779,3602036899),
+a(1955562222,1575990012),a(2024104815,1125592928),a(2227730452,2716904306),a(2361852424,442776044),a(2428436474,593698344),a(2756734187,3733110249),a(3204031479,2999351573),a(3329325298,3815920427),a(3391569614,3928383900),a(3515267271,566280711),a(3940187606,3454069534),a(4118630271,4000239992),a(116418474,1914138554),a(174292421,2731055270),a(289380356,3203993006),a(460393269,320620315),a(685471733,587496836),a(852142971,1086792851),a(1017036298,365543100),a(1126000580,2618297676),a(1288033470,
+3409855158),a(1501505948,4234509866),a(1607167915,987167468),a(1816402316,1246189591)],v=[],y=0;80>y;y++)v[y]=a();j=j.SHA512=d.extend({_doReset:function(){this._hash=new m.init([new f.init(1779033703,4089235720),new f.init(3144134277,2227873595),new f.init(1013904242,4271175723),new f.init(2773480762,1595750129),new f.init(1359893119,2917565137),new f.init(2600822924,725511199),new f.init(528734635,4215389547),new f.init(1541459225,327033209)])},_doProcessBlock:function(a,c){for(var d=this._hash.words,
+f=d[0],j=d[1],b=d[2],g=d[3],e=d[4],k=d[5],m=d[6],d=d[7],y=f.high,M=f.low,$=j.high,N=j.low,aa=b.high,O=b.low,ba=g.high,P=g.low,ca=e.high,Q=e.low,da=k.high,R=k.low,ea=m.high,S=m.low,fa=d.high,T=d.low,s=y,p=M,G=$,D=N,H=aa,E=O,W=ba,I=P,t=ca,q=Q,U=da,J=R,V=ea,K=S,X=fa,L=T,u=0;80>u;u++){var z=v[u];if(16>u)var r=z.high=a[c+2*u]|0,h=z.low=a[c+2*u+1]|0;else{var r=v[u-15],h=r.high,w=r.low,r=(h>>>1|w<<31)^(h>>>8|w<<24)^h>>>7,w=(w>>>1|h<<31)^(w>>>8|h<<24)^(w>>>7|h<<25),C=v[u-2],h=C.high,l=C.low,C=(h>>>19|l<<
+13)^(h<<3|l>>>29)^h>>>6,l=(l>>>19|h<<13)^(l<<3|h>>>29)^(l>>>6|h<<26),h=v[u-7],Y=h.high,A=v[u-16],x=A.high,A=A.low,h=w+h.low,r=r+Y+(h>>>0<w>>>0?1:0),h=h+l,r=r+C+(h>>>0<l>>>0?1:0),h=h+A,r=r+x+(h>>>0<A>>>0?1:0);z.high=r;z.low=h}var Y=t&U^~t&V,A=q&J^~q&K,z=s&G^s&H^G&H,ja=p&D^p&E^D&E,w=(s>>>28|p<<4)^(s<<30|p>>>2)^(s<<25|p>>>7),C=(p>>>28|s<<4)^(p<<30|s>>>2)^(p<<25|s>>>7),l=B[u],ka=l.high,ga=l.low,l=L+((q>>>14|t<<18)^(q>>>18|t<<14)^(q<<23|t>>>9)),x=X+((t>>>14|q<<18)^(t>>>18|q<<14)^(t<<23|q>>>9))+(l>>>0<
+L>>>0?1:0),l=l+A,x=x+Y+(l>>>0<A>>>0?1:0),l=l+ga,x=x+ka+(l>>>0<ga>>>0?1:0),l=l+h,x=x+r+(l>>>0<h>>>0?1:0),h=C+ja,z=w+z+(h>>>0<C>>>0?1:0),X=V,L=K,V=U,K=J,U=t,J=q,q=I+l|0,t=W+x+(q>>>0<I>>>0?1:0)|0,W=H,I=E,H=G,E=D,G=s,D=p,p=l+h|0,s=x+z+(p>>>0<l>>>0?1:0)|0}M=f.low=M+p;f.high=y+s+(M>>>0<p>>>0?1:0);N=j.low=N+D;j.high=$+G+(N>>>0<D>>>0?1:0);O=b.low=O+E;b.high=aa+H+(O>>>0<E>>>0?1:0);P=g.low=P+I;g.high=ba+W+(P>>>0<I>>>0?1:0);Q=e.low=Q+q;e.high=ca+t+(Q>>>0<q>>>0?1:0);R=k.low=R+J;k.high=da+U+(R>>>0<J>>>0?1:0);
+S=m.low=S+K;m.high=ea+V+(S>>>0<K>>>0?1:0);T=d.low=T+L;d.high=fa+X+(T>>>0<L>>>0?1:0)},_doFinalize:function(){var a=this._data,c=a.words,d=8*this._nDataBytes,f=8*a.sigBytes;c[f>>>5]|=128<<24-f%32;c[(f+128>>>10<<5)+30]=Math.floor(d/4294967296);c[(f+128>>>10<<5)+31]=d;a.sigBytes=4*c.length;this._process();return this._hash.toX32()},clone:function(){var a=d.clone.call(this);a._hash=this._hash.clone();return a},blockSize:32});c.SHA512=d._createHelper(j);c.HmacSHA512=d._createHmacHelper(j)})();
+(function(){var a=CryptoJS,c=a.x64,d=c.Word,j=c.WordArray,c=a.algo,f=c.SHA512,c=c.SHA384=f.extend({_doReset:function(){this._hash=new j.init([new d.init(3418070365,3238371032),new d.init(1654270250,914150663),new d.init(2438529370,812702999),new d.init(355462360,4144912697),new d.init(1731405415,4290775857),new d.init(2394180231,1750603025),new d.init(3675008525,1694076839),new d.init(1203062813,3204075428)])},_doFinalize:function(){var a=f._doFinalize.call(this);a.sigBytes-=16;return a}});a.SHA384=
+f._createHelper(c);a.HmacSHA384=f._createHmacHelper(c)})();
diff --git a/library/cryptojs/rollups/sha512.js b/library/cryptojs/rollups/sha512.js
new file mode 100644
index 000000000..ecbffee76
--- /dev/null
+++ b/library/cryptojs/rollups/sha512.js
@@ -0,0 +1,23 @@
+/*
+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
+*/
+var CryptoJS=CryptoJS||function(a,m){var r={},f=r.lib={},g=function(){},l=f.Base={extend:function(a){g.prototype=this;var b=new g;a&&b.mixIn(a);b.hasOwnProperty("init")||(b.init=function(){b.$super.init.apply(this,arguments)});b.init.prototype=b;b.$super=this;return b},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var b in a)a.hasOwnProperty(b)&&(this[b]=a[b]);a.hasOwnProperty("toString")&&(this.toString=a.toString)},clone:function(){return this.init.prototype.extend(this)}},
+p=f.WordArray=l.extend({init:function(a,b){a=this.words=a||[];this.sigBytes=b!=m?b:4*a.length},toString:function(a){return(a||q).stringify(this)},concat:function(a){var b=this.words,d=a.words,c=this.sigBytes;a=a.sigBytes;this.clamp();if(c%4)for(var j=0;j<a;j++)b[c+j>>>2]|=(d[j>>>2]>>>24-8*(j%4)&255)<<24-8*((c+j)%4);else if(65535<d.length)for(j=0;j<a;j+=4)b[c+j>>>2]=d[j>>>2];else b.push.apply(b,d);this.sigBytes+=a;return this},clamp:function(){var n=this.words,b=this.sigBytes;n[b>>>2]&=4294967295<<
+32-8*(b%4);n.length=a.ceil(b/4)},clone:function(){var a=l.clone.call(this);a.words=this.words.slice(0);return a},random:function(n){for(var b=[],d=0;d<n;d+=4)b.push(4294967296*a.random()|0);return new p.init(b,n)}}),y=r.enc={},q=y.Hex={stringify:function(a){var b=a.words;a=a.sigBytes;for(var d=[],c=0;c<a;c++){var j=b[c>>>2]>>>24-8*(c%4)&255;d.push((j>>>4).toString(16));d.push((j&15).toString(16))}return d.join("")},parse:function(a){for(var b=a.length,d=[],c=0;c<b;c+=2)d[c>>>3]|=parseInt(a.substr(c,
+2),16)<<24-4*(c%8);return new p.init(d,b/2)}},G=y.Latin1={stringify:function(a){var b=a.words;a=a.sigBytes;for(var d=[],c=0;c<a;c++)d.push(String.fromCharCode(b[c>>>2]>>>24-8*(c%4)&255));return d.join("")},parse:function(a){for(var b=a.length,d=[],c=0;c<b;c++)d[c>>>2]|=(a.charCodeAt(c)&255)<<24-8*(c%4);return new p.init(d,b)}},fa=y.Utf8={stringify:function(a){try{return decodeURIComponent(escape(G.stringify(a)))}catch(b){throw Error("Malformed UTF-8 data");}},parse:function(a){return G.parse(unescape(encodeURIComponent(a)))}},
+h=f.BufferedBlockAlgorithm=l.extend({reset:function(){this._data=new p.init;this._nDataBytes=0},_append:function(a){"string"==typeof a&&(a=fa.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(n){var b=this._data,d=b.words,c=b.sigBytes,j=this.blockSize,l=c/(4*j),l=n?a.ceil(l):a.max((l|0)-this._minBufferSize,0);n=l*j;c=a.min(4*n,c);if(n){for(var h=0;h<n;h+=j)this._doProcessBlock(d,h);h=d.splice(0,n);b.sigBytes-=c}return new p.init(h,c)},clone:function(){var a=l.clone.call(this);
+a._data=this._data.clone();return a},_minBufferSize:0});f.Hasher=h.extend({cfg:l.extend(),init:function(a){this.cfg=this.cfg.extend(a);this.reset()},reset:function(){h.reset.call(this);this._doReset()},update:function(a){this._append(a);this._process();return this},finalize:function(a){a&&this._append(a);return this._doFinalize()},blockSize:16,_createHelper:function(a){return function(b,d){return(new a.init(d)).finalize(b)}},_createHmacHelper:function(a){return function(b,d){return(new ga.HMAC.init(a,
+d)).finalize(b)}}});var ga=r.algo={};return r}(Math);
+(function(a){var m=CryptoJS,r=m.lib,f=r.Base,g=r.WordArray,m=m.x64={};m.Word=f.extend({init:function(a,p){this.high=a;this.low=p}});m.WordArray=f.extend({init:function(l,p){l=this.words=l||[];this.sigBytes=p!=a?p:8*l.length},toX32:function(){for(var a=this.words,p=a.length,f=[],q=0;q<p;q++){var G=a[q];f.push(G.high);f.push(G.low)}return g.create(f,this.sigBytes)},clone:function(){for(var a=f.clone.call(this),p=a.words=this.words.slice(0),g=p.length,q=0;q<g;q++)p[q]=p[q].clone();return a}})})();
+(function(){function a(){return g.create.apply(g,arguments)}for(var m=CryptoJS,r=m.lib.Hasher,f=m.x64,g=f.Word,l=f.WordArray,f=m.algo,p=[a(1116352408,3609767458),a(1899447441,602891725),a(3049323471,3964484399),a(3921009573,2173295548),a(961987163,4081628472),a(1508970993,3053834265),a(2453635748,2937671579),a(2870763221,3664609560),a(3624381080,2734883394),a(310598401,1164996542),a(607225278,1323610764),a(1426881987,3590304994),a(1925078388,4068182383),a(2162078206,991336113),a(2614888103,633803317),
+a(3248222580,3479774868),a(3835390401,2666613458),a(4022224774,944711139),a(264347078,2341262773),a(604807628,2007800933),a(770255983,1495990901),a(1249150122,1856431235),a(1555081692,3175218132),a(1996064986,2198950837),a(2554220882,3999719339),a(2821834349,766784016),a(2952996808,2566594879),a(3210313671,3203337956),a(3336571891,1034457026),a(3584528711,2466948901),a(113926993,3758326383),a(338241895,168717936),a(666307205,1188179964),a(773529912,1546045734),a(1294757372,1522805485),a(1396182291,
+2643833823),a(1695183700,2343527390),a(1986661051,1014477480),a(2177026350,1206759142),a(2456956037,344077627),a(2730485921,1290863460),a(2820302411,3158454273),a(3259730800,3505952657),a(3345764771,106217008),a(3516065817,3606008344),a(3600352804,1432725776),a(4094571909,1467031594),a(275423344,851169720),a(430227734,3100823752),a(506948616,1363258195),a(659060556,3750685593),a(883997877,3785050280),a(958139571,3318307427),a(1322822218,3812723403),a(1537002063,2003034995),a(1747873779,3602036899),
+a(1955562222,1575990012),a(2024104815,1125592928),a(2227730452,2716904306),a(2361852424,442776044),a(2428436474,593698344),a(2756734187,3733110249),a(3204031479,2999351573),a(3329325298,3815920427),a(3391569614,3928383900),a(3515267271,566280711),a(3940187606,3454069534),a(4118630271,4000239992),a(116418474,1914138554),a(174292421,2731055270),a(289380356,3203993006),a(460393269,320620315),a(685471733,587496836),a(852142971,1086792851),a(1017036298,365543100),a(1126000580,2618297676),a(1288033470,
+3409855158),a(1501505948,4234509866),a(1607167915,987167468),a(1816402316,1246189591)],y=[],q=0;80>q;q++)y[q]=a();f=f.SHA512=r.extend({_doReset:function(){this._hash=new l.init([new g.init(1779033703,4089235720),new g.init(3144134277,2227873595),new g.init(1013904242,4271175723),new g.init(2773480762,1595750129),new g.init(1359893119,2917565137),new g.init(2600822924,725511199),new g.init(528734635,4215389547),new g.init(1541459225,327033209)])},_doProcessBlock:function(a,f){for(var h=this._hash.words,
+g=h[0],n=h[1],b=h[2],d=h[3],c=h[4],j=h[5],l=h[6],h=h[7],q=g.high,m=g.low,r=n.high,N=n.low,Z=b.high,O=b.low,$=d.high,P=d.low,aa=c.high,Q=c.low,ba=j.high,R=j.low,ca=l.high,S=l.low,da=h.high,T=h.low,v=q,s=m,H=r,E=N,I=Z,F=O,W=$,J=P,w=aa,t=Q,U=ba,K=R,V=ca,L=S,X=da,M=T,x=0;80>x;x++){var B=y[x];if(16>x)var u=B.high=a[f+2*x]|0,e=B.low=a[f+2*x+1]|0;else{var u=y[x-15],e=u.high,z=u.low,u=(e>>>1|z<<31)^(e>>>8|z<<24)^e>>>7,z=(z>>>1|e<<31)^(z>>>8|e<<24)^(z>>>7|e<<25),D=y[x-2],e=D.high,k=D.low,D=(e>>>19|k<<13)^
+(e<<3|k>>>29)^e>>>6,k=(k>>>19|e<<13)^(k<<3|e>>>29)^(k>>>6|e<<26),e=y[x-7],Y=e.high,C=y[x-16],A=C.high,C=C.low,e=z+e.low,u=u+Y+(e>>>0<z>>>0?1:0),e=e+k,u=u+D+(e>>>0<k>>>0?1:0),e=e+C,u=u+A+(e>>>0<C>>>0?1:0);B.high=u;B.low=e}var Y=w&U^~w&V,C=t&K^~t&L,B=v&H^v&I^H&I,ha=s&E^s&F^E&F,z=(v>>>28|s<<4)^(v<<30|s>>>2)^(v<<25|s>>>7),D=(s>>>28|v<<4)^(s<<30|v>>>2)^(s<<25|v>>>7),k=p[x],ia=k.high,ea=k.low,k=M+((t>>>14|w<<18)^(t>>>18|w<<14)^(t<<23|w>>>9)),A=X+((w>>>14|t<<18)^(w>>>18|t<<14)^(w<<23|t>>>9))+(k>>>0<M>>>
+0?1:0),k=k+C,A=A+Y+(k>>>0<C>>>0?1:0),k=k+ea,A=A+ia+(k>>>0<ea>>>0?1:0),k=k+e,A=A+u+(k>>>0<e>>>0?1:0),e=D+ha,B=z+B+(e>>>0<D>>>0?1:0),X=V,M=L,V=U,L=K,U=w,K=t,t=J+k|0,w=W+A+(t>>>0<J>>>0?1:0)|0,W=I,J=F,I=H,F=E,H=v,E=s,s=k+e|0,v=A+B+(s>>>0<k>>>0?1:0)|0}m=g.low=m+s;g.high=q+v+(m>>>0<s>>>0?1:0);N=n.low=N+E;n.high=r+H+(N>>>0<E>>>0?1:0);O=b.low=O+F;b.high=Z+I+(O>>>0<F>>>0?1:0);P=d.low=P+J;d.high=$+W+(P>>>0<J>>>0?1:0);Q=c.low=Q+t;c.high=aa+w+(Q>>>0<t>>>0?1:0);R=j.low=R+K;j.high=ba+U+(R>>>0<K>>>0?1:0);S=l.low=
+S+L;l.high=ca+V+(S>>>0<L>>>0?1:0);T=h.low=T+M;h.high=da+X+(T>>>0<M>>>0?1:0)},_doFinalize:function(){var a=this._data,f=a.words,h=8*this._nDataBytes,g=8*a.sigBytes;f[g>>>5]|=128<<24-g%32;f[(g+128>>>10<<5)+30]=Math.floor(h/4294967296);f[(g+128>>>10<<5)+31]=h;a.sigBytes=4*f.length;this._process();return this._hash.toX32()},clone:function(){var a=r.clone.call(this);a._hash=this._hash.clone();return a},blockSize:32});m.SHA512=r._createHelper(f);m.HmacSHA512=r._createHmacHelper(f)})();
diff --git a/library/cryptojs/rollups/tripledes.js b/library/cryptojs/rollups/tripledes.js
new file mode 100644
index 000000000..ba24108e7
--- /dev/null
+++ b/library/cryptojs/rollups/tripledes.js
@@ -0,0 +1,51 @@
+/*
+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
+*/
+var CryptoJS=CryptoJS||function(u,l){var d={},n=d.lib={},p=function(){},s=n.Base={extend:function(a){p.prototype=this;var c=new p;a&&c.mixIn(a);c.hasOwnProperty("init")||(c.init=function(){c.$super.init.apply(this,arguments)});c.init.prototype=c;c.$super=this;return c},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var c in a)a.hasOwnProperty(c)&&(this[c]=a[c]);a.hasOwnProperty("toString")&&(this.toString=a.toString)},clone:function(){return this.init.prototype.extend(this)}},
+q=n.WordArray=s.extend({init:function(a,c){a=this.words=a||[];this.sigBytes=c!=l?c:4*a.length},toString:function(a){return(a||v).stringify(this)},concat:function(a){var c=this.words,m=a.words,f=this.sigBytes;a=a.sigBytes;this.clamp();if(f%4)for(var t=0;t<a;t++)c[f+t>>>2]|=(m[t>>>2]>>>24-8*(t%4)&255)<<24-8*((f+t)%4);else if(65535<m.length)for(t=0;t<a;t+=4)c[f+t>>>2]=m[t>>>2];else c.push.apply(c,m);this.sigBytes+=a;return this},clamp:function(){var a=this.words,c=this.sigBytes;a[c>>>2]&=4294967295<<
+32-8*(c%4);a.length=u.ceil(c/4)},clone:function(){var a=s.clone.call(this);a.words=this.words.slice(0);return a},random:function(a){for(var c=[],m=0;m<a;m+=4)c.push(4294967296*u.random()|0);return new q.init(c,a)}}),w=d.enc={},v=w.Hex={stringify:function(a){var c=a.words;a=a.sigBytes;for(var m=[],f=0;f<a;f++){var t=c[f>>>2]>>>24-8*(f%4)&255;m.push((t>>>4).toString(16));m.push((t&15).toString(16))}return m.join("")},parse:function(a){for(var c=a.length,m=[],f=0;f<c;f+=2)m[f>>>3]|=parseInt(a.substr(f,
+2),16)<<24-4*(f%8);return new q.init(m,c/2)}},b=w.Latin1={stringify:function(a){var c=a.words;a=a.sigBytes;for(var m=[],f=0;f<a;f++)m.push(String.fromCharCode(c[f>>>2]>>>24-8*(f%4)&255));return m.join("")},parse:function(a){for(var c=a.length,m=[],f=0;f<c;f++)m[f>>>2]|=(a.charCodeAt(f)&255)<<24-8*(f%4);return new q.init(m,c)}},x=w.Utf8={stringify:function(a){try{return decodeURIComponent(escape(b.stringify(a)))}catch(c){throw Error("Malformed UTF-8 data");}},parse:function(a){return b.parse(unescape(encodeURIComponent(a)))}},
+r=n.BufferedBlockAlgorithm=s.extend({reset:function(){this._data=new q.init;this._nDataBytes=0},_append:function(a){"string"==typeof a&&(a=x.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(a){var c=this._data,m=c.words,f=c.sigBytes,t=this.blockSize,b=f/(4*t),b=a?u.ceil(b):u.max((b|0)-this._minBufferSize,0);a=b*t;f=u.min(4*a,f);if(a){for(var e=0;e<a;e+=t)this._doProcessBlock(m,e);e=m.splice(0,a);c.sigBytes-=f}return new q.init(e,f)},clone:function(){var a=s.clone.call(this);
+a._data=this._data.clone();return a},_minBufferSize:0});n.Hasher=r.extend({cfg:s.extend(),init:function(a){this.cfg=this.cfg.extend(a);this.reset()},reset:function(){r.reset.call(this);this._doReset()},update:function(a){this._append(a);this._process();return this},finalize:function(a){a&&this._append(a);return this._doFinalize()},blockSize:16,_createHelper:function(a){return function(c,m){return(new a.init(m)).finalize(c)}},_createHmacHelper:function(a){return function(c,m){return(new e.HMAC.init(a,
+m)).finalize(c)}}});var e=d.algo={};return d}(Math);
+(function(){var u=CryptoJS,l=u.lib.WordArray;u.enc.Base64={stringify:function(d){var n=d.words,l=d.sigBytes,s=this._map;d.clamp();d=[];for(var q=0;q<l;q+=3)for(var w=(n[q>>>2]>>>24-8*(q%4)&255)<<16|(n[q+1>>>2]>>>24-8*((q+1)%4)&255)<<8|n[q+2>>>2]>>>24-8*((q+2)%4)&255,v=0;4>v&&q+0.75*v<l;v++)d.push(s.charAt(w>>>6*(3-v)&63));if(n=s.charAt(64))for(;d.length%4;)d.push(n);return d.join("")},parse:function(d){var n=d.length,p=this._map,s=p.charAt(64);s&&(s=d.indexOf(s),-1!=s&&(n=s));for(var s=[],q=0,w=0;w<
+n;w++)if(w%4){var v=p.indexOf(d.charAt(w-1))<<2*(w%4),b=p.indexOf(d.charAt(w))>>>6-2*(w%4);s[q>>>2]|=(v|b)<<24-8*(q%4);q++}return l.create(s,q)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="}})();
+(function(u){function l(b,e,a,c,m,f,t){b=b+(e&a|~e&c)+m+t;return(b<<f|b>>>32-f)+e}function d(b,e,a,c,m,f,t){b=b+(e&c|a&~c)+m+t;return(b<<f|b>>>32-f)+e}function n(b,e,a,c,m,f,t){b=b+(e^a^c)+m+t;return(b<<f|b>>>32-f)+e}function p(b,e,a,c,m,f,t){b=b+(a^(e|~c))+m+t;return(b<<f|b>>>32-f)+e}for(var s=CryptoJS,q=s.lib,w=q.WordArray,v=q.Hasher,q=s.algo,b=[],x=0;64>x;x++)b[x]=4294967296*u.abs(u.sin(x+1))|0;q=q.MD5=v.extend({_doReset:function(){this._hash=new w.init([1732584193,4023233417,2562383102,271733878])},
+_doProcessBlock:function(r,e){for(var a=0;16>a;a++){var c=e+a,m=r[c];r[c]=(m<<8|m>>>24)&16711935|(m<<24|m>>>8)&4278255360}var a=this._hash.words,c=r[e+0],m=r[e+1],f=r[e+2],t=r[e+3],y=r[e+4],q=r[e+5],s=r[e+6],w=r[e+7],v=r[e+8],u=r[e+9],x=r[e+10],z=r[e+11],A=r[e+12],B=r[e+13],C=r[e+14],D=r[e+15],g=a[0],h=a[1],j=a[2],k=a[3],g=l(g,h,j,k,c,7,b[0]),k=l(k,g,h,j,m,12,b[1]),j=l(j,k,g,h,f,17,b[2]),h=l(h,j,k,g,t,22,b[3]),g=l(g,h,j,k,y,7,b[4]),k=l(k,g,h,j,q,12,b[5]),j=l(j,k,g,h,s,17,b[6]),h=l(h,j,k,g,w,22,b[7]),
+g=l(g,h,j,k,v,7,b[8]),k=l(k,g,h,j,u,12,b[9]),j=l(j,k,g,h,x,17,b[10]),h=l(h,j,k,g,z,22,b[11]),g=l(g,h,j,k,A,7,b[12]),k=l(k,g,h,j,B,12,b[13]),j=l(j,k,g,h,C,17,b[14]),h=l(h,j,k,g,D,22,b[15]),g=d(g,h,j,k,m,5,b[16]),k=d(k,g,h,j,s,9,b[17]),j=d(j,k,g,h,z,14,b[18]),h=d(h,j,k,g,c,20,b[19]),g=d(g,h,j,k,q,5,b[20]),k=d(k,g,h,j,x,9,b[21]),j=d(j,k,g,h,D,14,b[22]),h=d(h,j,k,g,y,20,b[23]),g=d(g,h,j,k,u,5,b[24]),k=d(k,g,h,j,C,9,b[25]),j=d(j,k,g,h,t,14,b[26]),h=d(h,j,k,g,v,20,b[27]),g=d(g,h,j,k,B,5,b[28]),k=d(k,g,
+h,j,f,9,b[29]),j=d(j,k,g,h,w,14,b[30]),h=d(h,j,k,g,A,20,b[31]),g=n(g,h,j,k,q,4,b[32]),k=n(k,g,h,j,v,11,b[33]),j=n(j,k,g,h,z,16,b[34]),h=n(h,j,k,g,C,23,b[35]),g=n(g,h,j,k,m,4,b[36]),k=n(k,g,h,j,y,11,b[37]),j=n(j,k,g,h,w,16,b[38]),h=n(h,j,k,g,x,23,b[39]),g=n(g,h,j,k,B,4,b[40]),k=n(k,g,h,j,c,11,b[41]),j=n(j,k,g,h,t,16,b[42]),h=n(h,j,k,g,s,23,b[43]),g=n(g,h,j,k,u,4,b[44]),k=n(k,g,h,j,A,11,b[45]),j=n(j,k,g,h,D,16,b[46]),h=n(h,j,k,g,f,23,b[47]),g=p(g,h,j,k,c,6,b[48]),k=p(k,g,h,j,w,10,b[49]),j=p(j,k,g,h,
+C,15,b[50]),h=p(h,j,k,g,q,21,b[51]),g=p(g,h,j,k,A,6,b[52]),k=p(k,g,h,j,t,10,b[53]),j=p(j,k,g,h,x,15,b[54]),h=p(h,j,k,g,m,21,b[55]),g=p(g,h,j,k,v,6,b[56]),k=p(k,g,h,j,D,10,b[57]),j=p(j,k,g,h,s,15,b[58]),h=p(h,j,k,g,B,21,b[59]),g=p(g,h,j,k,y,6,b[60]),k=p(k,g,h,j,z,10,b[61]),j=p(j,k,g,h,f,15,b[62]),h=p(h,j,k,g,u,21,b[63]);a[0]=a[0]+g|0;a[1]=a[1]+h|0;a[2]=a[2]+j|0;a[3]=a[3]+k|0},_doFinalize:function(){var b=this._data,e=b.words,a=8*this._nDataBytes,c=8*b.sigBytes;e[c>>>5]|=128<<24-c%32;var m=u.floor(a/
+4294967296);e[(c+64>>>9<<4)+15]=(m<<8|m>>>24)&16711935|(m<<24|m>>>8)&4278255360;e[(c+64>>>9<<4)+14]=(a<<8|a>>>24)&16711935|(a<<24|a>>>8)&4278255360;b.sigBytes=4*(e.length+1);this._process();b=this._hash;e=b.words;for(a=0;4>a;a++)c=e[a],e[a]=(c<<8|c>>>24)&16711935|(c<<24|c>>>8)&4278255360;return b},clone:function(){var b=v.clone.call(this);b._hash=this._hash.clone();return b}});s.MD5=v._createHelper(q);s.HmacMD5=v._createHmacHelper(q)})(Math);
+(function(){var u=CryptoJS,l=u.lib,d=l.Base,n=l.WordArray,l=u.algo,p=l.EvpKDF=d.extend({cfg:d.extend({keySize:4,hasher:l.MD5,iterations:1}),init:function(d){this.cfg=this.cfg.extend(d)},compute:function(d,l){for(var p=this.cfg,v=p.hasher.create(),b=n.create(),u=b.words,r=p.keySize,p=p.iterations;u.length<r;){e&&v.update(e);var e=v.update(d).finalize(l);v.reset();for(var a=1;a<p;a++)e=v.finalize(e),v.reset();b.concat(e)}b.sigBytes=4*r;return b}});u.EvpKDF=function(d,l,n){return p.create(n).compute(d,
+l)}})();
+CryptoJS.lib.Cipher||function(u){var l=CryptoJS,d=l.lib,n=d.Base,p=d.WordArray,s=d.BufferedBlockAlgorithm,q=l.enc.Base64,w=l.algo.EvpKDF,v=d.Cipher=s.extend({cfg:n.extend(),createEncryptor:function(m,a){return this.create(this._ENC_XFORM_MODE,m,a)},createDecryptor:function(m,a){return this.create(this._DEC_XFORM_MODE,m,a)},init:function(m,a,b){this.cfg=this.cfg.extend(b);this._xformMode=m;this._key=a;this.reset()},reset:function(){s.reset.call(this);this._doReset()},process:function(a){this._append(a);return this._process()},
+finalize:function(a){a&&this._append(a);return this._doFinalize()},keySize:4,ivSize:4,_ENC_XFORM_MODE:1,_DEC_XFORM_MODE:2,_createHelper:function(m){return{encrypt:function(f,b,e){return("string"==typeof b?c:a).encrypt(m,f,b,e)},decrypt:function(f,b,e){return("string"==typeof b?c:a).decrypt(m,f,b,e)}}}});d.StreamCipher=v.extend({_doFinalize:function(){return this._process(!0)},blockSize:1});var b=l.mode={},x=function(a,f,b){var c=this._iv;c?this._iv=u:c=this._prevBlock;for(var e=0;e<b;e++)a[f+e]^=
+c[e]},r=(d.BlockCipherMode=n.extend({createEncryptor:function(a,f){return this.Encryptor.create(a,f)},createDecryptor:function(a,f){return this.Decryptor.create(a,f)},init:function(a,f){this._cipher=a;this._iv=f}})).extend();r.Encryptor=r.extend({processBlock:function(a,f){var b=this._cipher,c=b.blockSize;x.call(this,a,f,c);b.encryptBlock(a,f);this._prevBlock=a.slice(f,f+c)}});r.Decryptor=r.extend({processBlock:function(a,b){var c=this._cipher,e=c.blockSize,d=a.slice(b,b+e);c.decryptBlock(a,b);x.call(this,
+a,b,e);this._prevBlock=d}});b=b.CBC=r;r=(l.pad={}).Pkcs7={pad:function(a,b){for(var c=4*b,c=c-a.sigBytes%c,e=c<<24|c<<16|c<<8|c,d=[],l=0;l<c;l+=4)d.push(e);c=p.create(d,c);a.concat(c)},unpad:function(a){a.sigBytes-=a.words[a.sigBytes-1>>>2]&255}};d.BlockCipher=v.extend({cfg:v.cfg.extend({mode:b,padding:r}),reset:function(){v.reset.call(this);var a=this.cfg,c=a.iv,a=a.mode;if(this._xformMode==this._ENC_XFORM_MODE)var b=a.createEncryptor;else b=a.createDecryptor,this._minBufferSize=1;this._mode=b.call(a,
+this,c&&c.words)},_doProcessBlock:function(a,c){this._mode.processBlock(a,c)},_doFinalize:function(){var a=this.cfg.padding;if(this._xformMode==this._ENC_XFORM_MODE){a.pad(this._data,this.blockSize);var c=this._process(!0)}else c=this._process(!0),a.unpad(c);return c},blockSize:4});var e=d.CipherParams=n.extend({init:function(a){this.mixIn(a)},toString:function(a){return(a||this.formatter).stringify(this)}}),b=(l.format={}).OpenSSL={stringify:function(a){var c=a.ciphertext;a=a.salt;return(a?p.create([1398893684,
+1701076831]).concat(a).concat(c):c).toString(q)},parse:function(a){a=q.parse(a);var c=a.words;if(1398893684==c[0]&&1701076831==c[1]){var b=p.create(c.slice(2,4));c.splice(0,4);a.sigBytes-=16}return e.create({ciphertext:a,salt:b})}},a=d.SerializableCipher=n.extend({cfg:n.extend({format:b}),encrypt:function(a,c,b,d){d=this.cfg.extend(d);var l=a.createEncryptor(b,d);c=l.finalize(c);l=l.cfg;return e.create({ciphertext:c,key:b,iv:l.iv,algorithm:a,mode:l.mode,padding:l.padding,blockSize:a.blockSize,formatter:d.format})},
+decrypt:function(a,c,b,e){e=this.cfg.extend(e);c=this._parse(c,e.format);return a.createDecryptor(b,e).finalize(c.ciphertext)},_parse:function(a,c){return"string"==typeof a?c.parse(a,this):a}}),l=(l.kdf={}).OpenSSL={execute:function(a,c,b,d){d||(d=p.random(8));a=w.create({keySize:c+b}).compute(a,d);b=p.create(a.words.slice(c),4*b);a.sigBytes=4*c;return e.create({key:a,iv:b,salt:d})}},c=d.PasswordBasedCipher=a.extend({cfg:a.cfg.extend({kdf:l}),encrypt:function(c,b,e,d){d=this.cfg.extend(d);e=d.kdf.execute(e,
+c.keySize,c.ivSize);d.iv=e.iv;c=a.encrypt.call(this,c,b,e.key,d);c.mixIn(e);return c},decrypt:function(c,b,e,d){d=this.cfg.extend(d);b=this._parse(b,d.format);e=d.kdf.execute(e,c.keySize,c.ivSize,b.salt);d.iv=e.iv;return a.decrypt.call(this,c,b,e.key,d)}})}();
+(function(){function u(b,a){var c=(this._lBlock>>>b^this._rBlock)&a;this._rBlock^=c;this._lBlock^=c<<b}function l(b,a){var c=(this._rBlock>>>b^this._lBlock)&a;this._lBlock^=c;this._rBlock^=c<<b}var d=CryptoJS,n=d.lib,p=n.WordArray,n=n.BlockCipher,s=d.algo,q=[57,49,41,33,25,17,9,1,58,50,42,34,26,18,10,2,59,51,43,35,27,19,11,3,60,52,44,36,63,55,47,39,31,23,15,7,62,54,46,38,30,22,14,6,61,53,45,37,29,21,13,5,28,20,12,4],w=[14,17,11,24,1,5,3,28,15,6,21,10,23,19,12,4,26,8,16,7,27,20,13,2,41,52,31,37,47,
+55,30,40,51,45,33,48,44,49,39,56,34,53,46,42,50,36,29,32],v=[1,2,4,6,8,10,12,14,15,17,19,21,23,25,27,28],b=[{"0":8421888,268435456:32768,536870912:8421378,805306368:2,1073741824:512,1342177280:8421890,1610612736:8389122,1879048192:8388608,2147483648:514,2415919104:8389120,2684354560:33280,2952790016:8421376,3221225472:32770,3489660928:8388610,3758096384:0,4026531840:33282,134217728:0,402653184:8421890,671088640:33282,939524096:32768,1207959552:8421888,1476395008:512,1744830464:8421378,2013265920:2,
+2281701376:8389120,2550136832:33280,2818572288:8421376,3087007744:8389122,3355443200:8388610,3623878656:32770,3892314112:514,4160749568:8388608,1:32768,268435457:2,536870913:8421888,805306369:8388608,1073741825:8421378,1342177281:33280,1610612737:512,1879048193:8389122,2147483649:8421890,2415919105:8421376,2684354561:8388610,2952790017:33282,3221225473:514,3489660929:8389120,3758096385:32770,4026531841:0,134217729:8421890,402653185:8421376,671088641:8388608,939524097:512,1207959553:32768,1476395009:8388610,
+1744830465:2,2013265921:33282,2281701377:32770,2550136833:8389122,2818572289:514,3087007745:8421888,3355443201:8389120,3623878657:0,3892314113:33280,4160749569:8421378},{"0":1074282512,16777216:16384,33554432:524288,50331648:1074266128,67108864:1073741840,83886080:1074282496,100663296:1073758208,117440512:16,134217728:540672,150994944:1073758224,167772160:1073741824,184549376:540688,201326592:524304,218103808:0,234881024:16400,251658240:1074266112,8388608:1073758208,25165824:540688,41943040:16,58720256:1073758224,
+75497472:1074282512,92274688:1073741824,109051904:524288,125829120:1074266128,142606336:524304,159383552:0,176160768:16384,192937984:1074266112,209715200:1073741840,226492416:540672,243269632:1074282496,260046848:16400,268435456:0,285212672:1074266128,301989888:1073758224,318767104:1074282496,335544320:1074266112,352321536:16,369098752:540688,385875968:16384,402653184:16400,419430400:524288,436207616:524304,452984832:1073741840,469762048:540672,486539264:1073758208,503316480:1073741824,520093696:1074282512,
+276824064:540688,293601280:524288,310378496:1074266112,327155712:16384,343932928:1073758208,360710144:1074282512,377487360:16,394264576:1073741824,411041792:1074282496,427819008:1073741840,444596224:1073758224,461373440:524304,478150656:0,494927872:16400,511705088:1074266128,528482304:540672},{"0":260,1048576:0,2097152:67109120,3145728:65796,4194304:65540,5242880:67108868,6291456:67174660,7340032:67174400,8388608:67108864,9437184:67174656,10485760:65792,11534336:67174404,12582912:67109124,13631488:65536,
+14680064:4,15728640:256,524288:67174656,1572864:67174404,2621440:0,3670016:67109120,4718592:67108868,5767168:65536,6815744:65540,7864320:260,8912896:4,9961472:256,11010048:67174400,12058624:65796,13107200:65792,14155776:67109124,15204352:67174660,16252928:67108864,16777216:67174656,17825792:65540,18874368:65536,19922944:67109120,20971520:256,22020096:67174660,23068672:67108868,24117248:0,25165824:67109124,26214400:67108864,27262976:4,28311552:65792,29360128:67174400,30408704:260,31457280:65796,32505856:67174404,
+17301504:67108864,18350080:260,19398656:67174656,20447232:0,21495808:65540,22544384:67109120,23592960:256,24641536:67174404,25690112:65536,26738688:67174660,27787264:65796,28835840:67108868,29884416:67109124,30932992:67174400,31981568:4,33030144:65792},{"0":2151682048,65536:2147487808,131072:4198464,196608:2151677952,262144:0,327680:4198400,393216:2147483712,458752:4194368,524288:2147483648,589824:4194304,655360:64,720896:2147487744,786432:2151678016,851968:4160,917504:4096,983040:2151682112,32768:2147487808,
+98304:64,163840:2151678016,229376:2147487744,294912:4198400,360448:2151682112,425984:0,491520:2151677952,557056:4096,622592:2151682048,688128:4194304,753664:4160,819200:2147483648,884736:4194368,950272:4198464,1015808:2147483712,1048576:4194368,1114112:4198400,1179648:2147483712,1245184:0,1310720:4160,1376256:2151678016,1441792:2151682048,1507328:2147487808,1572864:2151682112,1638400:2147483648,1703936:2151677952,1769472:4198464,1835008:2147487744,1900544:4194304,1966080:64,2031616:4096,1081344:2151677952,
+1146880:2151682112,1212416:0,1277952:4198400,1343488:4194368,1409024:2147483648,1474560:2147487808,1540096:64,1605632:2147483712,1671168:4096,1736704:2147487744,1802240:2151678016,1867776:4160,1933312:2151682048,1998848:4194304,2064384:4198464},{"0":128,4096:17039360,8192:262144,12288:536870912,16384:537133184,20480:16777344,24576:553648256,28672:262272,32768:16777216,36864:537133056,40960:536871040,45056:553910400,49152:553910272,53248:0,57344:17039488,61440:553648128,2048:17039488,6144:553648256,
+10240:128,14336:17039360,18432:262144,22528:537133184,26624:553910272,30720:536870912,34816:537133056,38912:0,43008:553910400,47104:16777344,51200:536871040,55296:553648128,59392:16777216,63488:262272,65536:262144,69632:128,73728:536870912,77824:553648256,81920:16777344,86016:553910272,90112:537133184,94208:16777216,98304:553910400,102400:553648128,106496:17039360,110592:537133056,114688:262272,118784:536871040,122880:0,126976:17039488,67584:553648256,71680:16777216,75776:17039360,79872:537133184,
+83968:536870912,88064:17039488,92160:128,96256:553910272,100352:262272,104448:553910400,108544:0,112640:553648128,116736:16777344,120832:262144,124928:537133056,129024:536871040},{"0":268435464,256:8192,512:270532608,768:270540808,1024:268443648,1280:2097152,1536:2097160,1792:268435456,2048:0,2304:268443656,2560:2105344,2816:8,3072:270532616,3328:2105352,3584:8200,3840:270540800,128:270532608,384:270540808,640:8,896:2097152,1152:2105352,1408:268435464,1664:268443648,1920:8200,2176:2097160,2432:8192,
+2688:268443656,2944:270532616,3200:0,3456:270540800,3712:2105344,3968:268435456,4096:268443648,4352:270532616,4608:270540808,4864:8200,5120:2097152,5376:268435456,5632:268435464,5888:2105344,6144:2105352,6400:0,6656:8,6912:270532608,7168:8192,7424:268443656,7680:270540800,7936:2097160,4224:8,4480:2105344,4736:2097152,4992:268435464,5248:268443648,5504:8200,5760:270540808,6016:270532608,6272:270540800,6528:270532616,6784:8192,7040:2105352,7296:2097160,7552:0,7808:268435456,8064:268443656},{"0":1048576,
+16:33555457,32:1024,48:1049601,64:34604033,80:0,96:1,112:34603009,128:33555456,144:1048577,160:33554433,176:34604032,192:34603008,208:1025,224:1049600,240:33554432,8:34603009,24:0,40:33555457,56:34604032,72:1048576,88:33554433,104:33554432,120:1025,136:1049601,152:33555456,168:34603008,184:1048577,200:1024,216:34604033,232:1,248:1049600,256:33554432,272:1048576,288:33555457,304:34603009,320:1048577,336:33555456,352:34604032,368:1049601,384:1025,400:34604033,416:1049600,432:1,448:0,464:34603008,480:33554433,
+496:1024,264:1049600,280:33555457,296:34603009,312:1,328:33554432,344:1048576,360:1025,376:34604032,392:33554433,408:34603008,424:0,440:34604033,456:1049601,472:1024,488:33555456,504:1048577},{"0":134219808,1:131072,2:134217728,3:32,4:131104,5:134350880,6:134350848,7:2048,8:134348800,9:134219776,10:133120,11:134348832,12:2080,13:0,14:134217760,15:133152,2147483648:2048,2147483649:134350880,2147483650:134219808,2147483651:134217728,2147483652:134348800,2147483653:133120,2147483654:133152,2147483655:32,
+2147483656:134217760,2147483657:2080,2147483658:131104,2147483659:134350848,2147483660:0,2147483661:134348832,2147483662:134219776,2147483663:131072,16:133152,17:134350848,18:32,19:2048,20:134219776,21:134217760,22:134348832,23:131072,24:0,25:131104,26:134348800,27:134219808,28:134350880,29:133120,30:2080,31:134217728,2147483664:131072,2147483665:2048,2147483666:134348832,2147483667:133152,2147483668:32,2147483669:134348800,2147483670:134217728,2147483671:134219808,2147483672:134350880,2147483673:134217760,
+2147483674:134219776,2147483675:0,2147483676:133120,2147483677:2080,2147483678:131104,2147483679:134350848}],x=[4160749569,528482304,33030144,2064384,129024,8064,504,2147483679],r=s.DES=n.extend({_doReset:function(){for(var b=this._key.words,a=[],c=0;56>c;c++){var d=q[c]-1;a[c]=b[d>>>5]>>>31-d%32&1}b=this._subKeys=[];for(d=0;16>d;d++){for(var f=b[d]=[],l=v[d],c=0;24>c;c++)f[c/6|0]|=a[(w[c]-1+l)%28]<<31-c%6,f[4+(c/6|0)]|=a[28+(w[c+24]-1+l)%28]<<31-c%6;f[0]=f[0]<<1|f[0]>>>31;for(c=1;7>c;c++)f[c]>>>=
+4*(c-1)+3;f[7]=f[7]<<5|f[7]>>>27}a=this._invSubKeys=[];for(c=0;16>c;c++)a[c]=b[15-c]},encryptBlock:function(b,a){this._doCryptBlock(b,a,this._subKeys)},decryptBlock:function(b,a){this._doCryptBlock(b,a,this._invSubKeys)},_doCryptBlock:function(e,a,c){this._lBlock=e[a];this._rBlock=e[a+1];u.call(this,4,252645135);u.call(this,16,65535);l.call(this,2,858993459);l.call(this,8,16711935);u.call(this,1,1431655765);for(var d=0;16>d;d++){for(var f=c[d],n=this._lBlock,p=this._rBlock,q=0,r=0;8>r;r++)q|=b[r][((p^
+f[r])&x[r])>>>0];this._lBlock=p;this._rBlock=n^q}c=this._lBlock;this._lBlock=this._rBlock;this._rBlock=c;u.call(this,1,1431655765);l.call(this,8,16711935);l.call(this,2,858993459);u.call(this,16,65535);u.call(this,4,252645135);e[a]=this._lBlock;e[a+1]=this._rBlock},keySize:2,ivSize:2,blockSize:2});d.DES=n._createHelper(r);s=s.TripleDES=n.extend({_doReset:function(){var b=this._key.words;this._des1=r.createEncryptor(p.create(b.slice(0,2)));this._des2=r.createEncryptor(p.create(b.slice(2,4)));this._des3=
+r.createEncryptor(p.create(b.slice(4,6)))},encryptBlock:function(b,a){this._des1.encryptBlock(b,a);this._des2.decryptBlock(b,a);this._des3.encryptBlock(b,a)},decryptBlock:function(b,a){this._des3.decryptBlock(b,a);this._des2.encryptBlock(b,a);this._des1.decryptBlock(b,a)},keySize:6,ivSize:2,blockSize:2});d.TripleDES=n._createHelper(s)})();
diff --git a/library/fancybox/jquery.fancybox-1.3.4.js b/library/fancybox/jquery.fancybox-1.3.4.js
index be7727537..43e2cd56b 100644
--- a/library/fancybox/jquery.fancybox-1.3.4.js
+++ b/library/fancybox/jquery.fancybox-1.3.4.js
@@ -26,7 +26,8 @@
titleHeight = 0, titleStr = '', start_pos, final_pos, busy = false, fx = $.extend($('<div/>')[0], { prop: 0 }),
- isIE6 = $.browser.msie && $.browser.version < 7 && !window.XMLHttpRequest,
+ isIE6 = false,
+// $.browser.msie && $.browser.version < 7 && !window.XMLHttpRequest,
/*
* Private methods
@@ -612,7 +613,7 @@
}
if (currentOpts.type == 'iframe') {
- $('<iframe id="fancybox-frame" name="fancybox-frame' + new Date().getTime() + '" frameborder="0" hspace="0" ' + ($.browser.msie ? 'allowtransparency="true""' : '') + ' scrolling="' + selectedOpts.scrolling + '" src="' + currentOpts.href + '"></iframe>').appendTo(content);
+ $('<iframe id="fancybox-frame" name="fancybox-frame' + new Date().getTime() + '" frameborder="0" hspace="0" ' + ' scrolling="' + selectedOpts.scrolling + '" src="' + currentOpts.href + '"></iframe>').appendTo(content);
}
wrap.show();
diff --git a/library/font_awesome/.gitignore b/library/font_awesome/.gitignore
new file mode 100644
index 000000000..49c2a72c8
--- /dev/null
+++ b/library/font_awesome/.gitignore
@@ -0,0 +1,30 @@
+*.pyc
+*.egg-info
+*.db
+*.db.old
+*.swp
+*.db-journal
+
+.coverage
+.DS_Store
+.installed.cfg
+_gh_pages/*
+
+.idea/*
+.svn/*
+src/website/static/*
+src/website/media/*
+
+bin
+cfcache
+develop-eggs
+dist
+downloads
+eggs
+parts
+tmp
+.sass-cache
+node_modules
+
+src/website/settingslocal.py
+stunnel.log
diff --git a/library/font_awesome/.ruby-version b/library/font_awesome/.ruby-version
new file mode 100644
index 000000000..ae6d5b9cb
--- /dev/null
+++ b/library/font_awesome/.ruby-version
@@ -0,0 +1 @@
+1.9.3-p392
diff --git a/library/font_awesome/CONTRIBUTING.md b/library/font_awesome/CONTRIBUTING.md
new file mode 100644
index 000000000..cc2530cd8
--- /dev/null
+++ b/library/font_awesome/CONTRIBUTING.md
@@ -0,0 +1,75 @@
+# Contributing to Font Awesome
+
+Looking to contribute something to Font Awesome? **Here's how you can help.**
+
+
+
+## Reporting issues
+
+We only accept issues that are icon requests, bug reports, or feature requests. Bugs must be isolated and reproducible problems that we can fix within the Font Awesome core. Please read the following guidelines to ensure you are the paragon of bug reporting.
+
+1. **Search for existing issues.** We get a lot of duplicate issues, and you'd help us out a lot by first checking if someone else has reported the same issue. Moreover, the issue may have already been resolved with a fix available.
+2. **Create an isolated and reproducible test case.** Be sure the problem exists in Font Awesome's code with a [reduced test case](http://css-tricks.com/reduced-test-cases/) that should be included in each bug report.
+3. **Include a live example.** Make use of jsFiddle, jsBin, or Codepen to share your isolated test cases.
+4. **Share as much information as possible.** Include operating system and version, browser and version, version of Font Awesome, etc. where appropriate. Also include steps to reproduce the bug.
+
+
+
+## Key branches
+
+- `master` is the latest, deployed version (not to be used for pull requests)
+- `gh-pages` is the hosted docs (not to be used for pull requests)
+- `*-wip` branches are the official work in progress branches for the next releases. All pull requests should be submitted against the appropriate branch
+
+
+
+## Notes on the repo
+
+As of v3.2.0, Font Awesome's CSS, LESS, SCSS, and documentation are all powered by Jekyll templates and built before each commit and release.
+- `_config.yml` - much of the site is driven off variables from this file, including Font Awesome and Bootstrap versions
+- `src/` - All edits to documentation, LESS, SCSS, and CSS should be made to files and templates in this directory
+- `src/icons.yml` - all LESS, SCSS, and CSS icon definitions are driven off this single file
+
+
+
+## Pull requests
+
+- Submit all pull requests against the appropriate `*-wip` branch for easier merging
+- Any changes to the docs must be made to the Liquid templates in the `src` directory
+- CSS changes must be done in .less and .scss files first, never the compiled files
+- If modifying the .less and .scss files, always recompile and commit the compiled files
+- Try not to pollute your pull request with unintended changes--keep them simple and small
+- Try to share which browsers your code has been tested in before submitting a pull request
+
+
+
+## Coding standards: HTML
+
+- Two spaces for indentation, never tabs
+- Double quotes only, never single quotes
+- Always use proper indentation
+- Use tags and elements appropriate for an HTML5 doctype (e.g., self-closing tags)
+
+
+
+## Coding standards: CSS
+
+- Adhere to the [Recess CSS property order](http://markdotto.com/2011/11/29/css-property-order/)
+- Multiple-line approach (one property and value per line)
+- Always a space after a property's colon (.e.g, `display: block;` and not `display:block;`)
+- End all lines with a semi-colon
+- For multiple, comma-separated selectors, place each selector on it's own line
+- Attribute selectors, like `input[type="text"]` should always wrap the attribute's value in double quotes, for consistency and safety (see this [blog post on unquoted attribute values](http://mathiasbynens.be/notes/unquoted-attribute-values) that can lead to XSS attacks)
+
+
+
+## License
+
+By contributing your code, you agree to license your contribution under the terms of the MIT License:
+- http://opensource.org/licenses/mit-license.html
+
+
+
+## Thanks
+
+Thanks to Bootstrap for their wonderful CONTRIBUTING.MD doc. It was modified to create this one.
diff --git a/library/font_awesome/Gemfile b/library/font_awesome/Gemfile
new file mode 100644
index 000000000..499bcea70
--- /dev/null
+++ b/library/font_awesome/Gemfile
@@ -0,0 +1,4 @@
+source 'https://rubygems.org'
+
+gem 'jekyll', '~> 1.0'
+gem 'debugger'
diff --git a/library/font_awesome/Gemfile.lock b/library/font_awesome/Gemfile.lock
new file mode 100644
index 000000000..a00e13f1e
--- /dev/null
+++ b/library/font_awesome/Gemfile.lock
@@ -0,0 +1,46 @@
+GEM
+ remote: https://rubygems.org/
+ specs:
+ classifier (1.3.3)
+ fast-stemmer (>= 1.0.0)
+ colorator (0.1)
+ columnize (0.3.6)
+ commander (4.1.3)
+ highline (~> 1.6.11)
+ debugger (1.6.0)
+ columnize (>= 0.3.1)
+ debugger-linecache (~> 1.2.0)
+ debugger-ruby_core_source (~> 1.2.1)
+ debugger-linecache (1.2.0)
+ debugger-ruby_core_source (1.2.2)
+ directory_watcher (1.4.1)
+ fast-stemmer (1.0.2)
+ highline (1.6.19)
+ jekyll (1.0.0)
+ classifier (~> 1.3)
+ colorator (~> 0.1)
+ commander (~> 4.1.3)
+ directory_watcher (~> 1.4.1)
+ kramdown (~> 0.14)
+ liquid (~> 2.3)
+ maruku (~> 0.5)
+ pygments.rb (~> 0.4.2)
+ safe_yaml (~> 0.7.0)
+ kramdown (0.14.2)
+ liquid (2.5.0)
+ maruku (0.6.1)
+ syntax (>= 1.0.0)
+ posix-spawn (0.3.6)
+ pygments.rb (0.4.2)
+ posix-spawn (~> 0.3.6)
+ yajl-ruby (~> 1.1.0)
+ safe_yaml (0.7.1)
+ syntax (1.0.0)
+ yajl-ruby (1.1.0)
+
+PLATFORMS
+ ruby
+
+DEPENDENCIES
+ debugger
+ jekyll (= 1.0)
diff --git a/library/font_awesome/README.md b/library/font_awesome/README.md
new file mode 100644
index 000000000..6a1dc7f92
--- /dev/null
+++ b/library/font_awesome/README.md
@@ -0,0 +1,62 @@
+#[Font Awesome v3.2.1](http://fontawesome.io)
+###the iconic font designed for Bootstrap
+
+Font Awesome is a full suite of 361 pictographic icons for easy scalable vector graphics on websites, created and
+maintained by [Dave Gandy](http://twitter.com/davegandy). Stay up to date [@fontawesome](http://twitter.com/fontawesome).
+
+Get started at http://fontawesome.io!
+
+##License
+- The Font Awesome font is licensed under the SIL OFL 1.1:
+ - http://scripts.sil.org/OFL
+- Font Awesome CSS, LESS, and SASS files are licensed under the MIT License:
+ - http://opensource.org/licenses/mit-license.html
+- The Font Awesome documentation is licensed under the CC BY 3.0 License:
+ - http://creativecommons.org/licenses/by/3.0/
+- Attribution is no longer required as of Font Awesome 3.0, but much appreciated:
+ - `Font Awesome by Dave Gandy - http://fontawesome.io`
+- Full details: http://fontawesome.io/license
+
+##Changelog
+- v3.0.0 - all icons redesigned from scratch, optimized for Bootstrap's 14px default
+- v3.0.1 - much improved rendering in webkit, various bug fixes
+- v3.0.2 - much improved rendering and alignment in IE7
+- v3.1.0 - Added 54 icons, icon stacking styles, flipping and rotating icons, removed SASS support
+- [v3.1.1 GitHub milestones](https://github.com/FortAwesome/Font-Awesome/issues?milestone=4&page=1&state=closed)
+- [v3.2.0 GitHub milestones](https://github.com/FortAwesome/Font-Awesome/issues?milestone=3&page=1&state=closed)
+- [v3.2.1 GitHub milestones](https://github.com/FortAwesome/Font-Awesome/issues?milestone=5&page=1&state=closed)
+
+##Versioning
+
+Font Awesome will be maintained under the Semantic Versioning guidelines as much as possible. Releases will be numbered with the following format:
+
+`<major>.<minor>.<patch>`
+
+And constructed with the following guidelines:
+
+* Breaking backward compatibility bumps the major (and resets the minor and patch)
+* New additions, including new icons, without breaking backward compatibility bumps the minor (and resets the patch)
+* Bug fixes and misc changes bumps the patch
+
+For more information on SemVer, please visit http://semver.org.
+
+##Author
+- Email: dave@fontawesome.io
+- Twitter: http://twitter.com/davegandy
+- GitHub: https://github.com/davegandy
+- Work: Lead Product Designer @ http://kyru.us
+
+## Hacking on Font Awesome
+
+From the root of the repository, install the tools used to develop.
+
+ $ bundle install
+ $ npm install
+
+Build the project and documentation:
+
+ $ bundle exec jekyll build
+
+Or serve it on a local server on http://localhost:7998/Font-Awesome/:
+
+ $ bundle exec jekyll serve
diff --git a/library/font_awesome/_config.yml b/library/font_awesome/_config.yml
new file mode 100644
index 000000000..a51b5581f
--- /dev/null
+++ b/library/font_awesome/_config.yml
@@ -0,0 +1,54 @@
+safe: false
+port: 7998
+baseurl: /Font-Awesome/ # Where GitHub serves the project up from
+url: http://localhost:7998
+
+source: src
+destination: _gh_pages
+plugins: src/_plugins
+
+pygments: true
+permalink: pretty
+
+# ensures SCSS files are compiled
+include: [_bootstrap.scss, _core.scss, _extras.scss, _icons.scss, _mixins.scss, _path.scss, _variables.scss]
+
+# used in building icon pages
+icon_meta: src/icons.yml
+icon_layout: icon.html # Relative to _layouts directory
+icon_destination: icon # Relative to destination
+
+fontawesome:
+ version: 3.2.1
+ minor_version: 3.2
+ url: http://fontawesome.io
+ legacy_url: http://fortawesome.github.com/Font-Awesome/
+ blog_url: http://blog.fontawesome.io
+ twitter: fontawesome
+ tagline: The iconic font designed for Bootstrap
+ author:
+ name: Dave Gandy
+ email: dave@fontawesome.io
+ twitter: davegandy
+ work:
+ name: Kyruus
+ url: http://kyruus.com
+ title: Lead Product Designer
+ github:
+ url: https://github.com/FortAwesome/Font-Awesome
+ project: Font-Awesome
+ org: FortAwesome
+ license:
+ font:
+ version: SIL OFL 1.1
+ url: http://scripts.sil.org/OFL
+ code:
+ version: MIT License
+ url: http://opensource.org/licenses/mit-license.html
+ documentation:
+ version: CC BY 3.0
+ url: http://creativecommons.org/licenses/by/3.0/
+
+bootstrap:
+ version: 2.3.2
+ url: http://getbootstrap.com
diff --git a/library/font_awesome/composer.json b/library/font_awesome/composer.json
new file mode 100644
index 000000000..eb86b9710
--- /dev/null
+++ b/library/font_awesome/composer.json
@@ -0,0 +1,27 @@
+{
+ "name": "fortawesome/font-awesome",
+ "description": "The iconic font designed for Bootstrap",
+ "keywords": ["font", "awesome", "fontawesome", "icon", "font", "bootstrap"],
+ "homepage": "http://fontawesome.io/",
+ "authors": [
+ {
+ "name": "Dave Gandy",
+ "email": "dave@fontawesome.io",
+ "role": "Developer",
+ "homepage": "http://twitter.com/davegandy"
+ }
+ ],
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.2.x-dev"
+ }
+ },
+ "license": [
+ "OFL-1.1",
+ "MIT"
+ ],
+ "require-dev": {
+ "jekyll": "1.0.2",
+ "lessc": "1.3.3"
+ }
+}
diff --git a/library/font_awesome/css/font-awesome-ie7.css b/library/font_awesome/css/font-awesome-ie7.css
new file mode 100644
index 000000000..17f07766c
--- /dev/null
+++ b/library/font_awesome/css/font-awesome-ie7.css
@@ -0,0 +1,1203 @@
+/*!
+ * Font Awesome 3.2.1
+ * the iconic font designed for Bootstrap
+ * ------------------------------------------------------------------------------
+ * The full suite of pictographic icons, examples, and documentation can be
+ * found at http://fontawesome.io. Stay up to date on Twitter at
+ * http://twitter.com/fontawesome.
+ *
+ * License
+ * ------------------------------------------------------------------------------
+ * - The Font Awesome font is licensed under SIL OFL 1.1 -
+ * http://scripts.sil.org/OFL
+ * - Font Awesome CSS, LESS, and SASS files are licensed under MIT License -
+ * http://opensource.org/licenses/mit-license.html
+ * - Font Awesome documentation licensed under CC BY 3.0 -
+ * http://creativecommons.org/licenses/by/3.0/
+ * - Attribution is no longer required in Font Awesome 3.0, but much appreciated:
+ * "Font Awesome by Dave Gandy - http://fontawesome.io"
+ *
+ * Author - Dave Gandy
+ * ------------------------------------------------------------------------------
+ * Email: dave@fontawesome.io
+ * Twitter: http://twitter.com/davegandy
+ * Work: Lead Product Designer @ Kyruus - http://kyruus.com
+ */
+.icon-large {
+ font-size: 1.3333333333333333em;
+ margin-top: -4px;
+ padding-top: 3px;
+ margin-bottom: -4px;
+ padding-bottom: 3px;
+ vertical-align: middle;
+}
+.nav [class^="icon-"],
+.nav [class*=" icon-"] {
+ vertical-align: inherit;
+ margin-top: -4px;
+ padding-top: 3px;
+ margin-bottom: -4px;
+ padding-bottom: 3px;
+}
+.nav [class^="icon-"].icon-large,
+.nav [class*=" icon-"].icon-large {
+ vertical-align: -25%;
+}
+.nav-pills [class^="icon-"].icon-large,
+.nav-tabs [class^="icon-"].icon-large,
+.nav-pills [class*=" icon-"].icon-large,
+.nav-tabs [class*=" icon-"].icon-large {
+ line-height: .75em;
+ margin-top: -7px;
+ padding-top: 5px;
+ margin-bottom: -5px;
+ padding-bottom: 4px;
+}
+.btn [class^="icon-"].pull-left,
+.btn [class*=" icon-"].pull-left,
+.btn [class^="icon-"].pull-right,
+.btn [class*=" icon-"].pull-right {
+ vertical-align: inherit;
+}
+.btn [class^="icon-"].icon-large,
+.btn [class*=" icon-"].icon-large {
+ margin-top: -0.5em;
+}
+a [class^="icon-"],
+a [class*=" icon-"] {
+ cursor: pointer;
+}
+.icon-glass {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf000;');
+}
+.icon-music {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf001;');
+}
+.icon-search {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf002;');
+}
+.icon-envelope-alt {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf003;');
+}
+.icon-heart {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf004;');
+}
+.icon-star {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf005;');
+}
+.icon-star-empty {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf006;');
+}
+.icon-user {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf007;');
+}
+.icon-film {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf008;');
+}
+.icon-th-large {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf009;');
+}
+.icon-th {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf00a;');
+}
+.icon-th-list {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf00b;');
+}
+.icon-ok {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf00c;');
+}
+.icon-remove {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf00d;');
+}
+.icon-zoom-in {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf00e;');
+}
+.icon-zoom-out {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf010;');
+}
+.icon-off {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf011;');
+}
+.icon-power-off {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf011;');
+}
+.icon-signal {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf012;');
+}
+.icon-cog {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf013;');
+}
+.icon-gear {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf013;');
+}
+.icon-trash {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf014;');
+}
+.icon-home {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf015;');
+}
+.icon-file-alt {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf016;');
+}
+.icon-time {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf017;');
+}
+.icon-road {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf018;');
+}
+.icon-download-alt {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf019;');
+}
+.icon-download {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf01a;');
+}
+.icon-upload {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf01b;');
+}
+.icon-inbox {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf01c;');
+}
+.icon-play-circle {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf01d;');
+}
+.icon-repeat {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf01e;');
+}
+.icon-rotate-right {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf01e;');
+}
+.icon-refresh {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf021;');
+}
+.icon-list-alt {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf022;');
+}
+.icon-lock {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf023;');
+}
+.icon-flag {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf024;');
+}
+.icon-headphones {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf025;');
+}
+.icon-volume-off {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf026;');
+}
+.icon-volume-down {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf027;');
+}
+.icon-volume-up {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf028;');
+}
+.icon-qrcode {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf029;');
+}
+.icon-barcode {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf02a;');
+}
+.icon-tag {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf02b;');
+}
+.icon-tags {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf02c;');
+}
+.icon-book {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf02d;');
+}
+.icon-bookmark {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf02e;');
+}
+.icon-print {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf02f;');
+}
+.icon-camera {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf030;');
+}
+.icon-font {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf031;');
+}
+.icon-bold {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf032;');
+}
+.icon-italic {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf033;');
+}
+.icon-text-height {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf034;');
+}
+.icon-text-width {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf035;');
+}
+.icon-align-left {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf036;');
+}
+.icon-align-center {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf037;');
+}
+.icon-align-right {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf038;');
+}
+.icon-align-justify {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf039;');
+}
+.icon-list {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf03a;');
+}
+.icon-indent-left {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf03b;');
+}
+.icon-indent-right {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf03c;');
+}
+.icon-facetime-video {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf03d;');
+}
+.icon-picture {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf03e;');
+}
+.icon-pencil {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf040;');
+}
+.icon-map-marker {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf041;');
+}
+.icon-adjust {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf042;');
+}
+.icon-tint {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf043;');
+}
+.icon-edit {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf044;');
+}
+.icon-share {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf045;');
+}
+.icon-check {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf046;');
+}
+.icon-move {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf047;');
+}
+.icon-step-backward {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf048;');
+}
+.icon-fast-backward {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf049;');
+}
+.icon-backward {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf04a;');
+}
+.icon-play {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf04b;');
+}
+.icon-pause {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf04c;');
+}
+.icon-stop {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf04d;');
+}
+.icon-forward {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf04e;');
+}
+.icon-fast-forward {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf050;');
+}
+.icon-step-forward {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf051;');
+}
+.icon-eject {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf052;');
+}
+.icon-chevron-left {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf053;');
+}
+.icon-chevron-right {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf054;');
+}
+.icon-plus-sign {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf055;');
+}
+.icon-minus-sign {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf056;');
+}
+.icon-remove-sign {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf057;');
+}
+.icon-ok-sign {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf058;');
+}
+.icon-question-sign {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf059;');
+}
+.icon-info-sign {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf05a;');
+}
+.icon-screenshot {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf05b;');
+}
+.icon-remove-circle {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf05c;');
+}
+.icon-ok-circle {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf05d;');
+}
+.icon-ban-circle {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf05e;');
+}
+.icon-arrow-left {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf060;');
+}
+.icon-arrow-right {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf061;');
+}
+.icon-arrow-up {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf062;');
+}
+.icon-arrow-down {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf063;');
+}
+.icon-share-alt {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf064;');
+}
+.icon-mail-forward {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf064;');
+}
+.icon-resize-full {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf065;');
+}
+.icon-resize-small {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf066;');
+}
+.icon-plus {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf067;');
+}
+.icon-minus {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf068;');
+}
+.icon-asterisk {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf069;');
+}
+.icon-exclamation-sign {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf06a;');
+}
+.icon-gift {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf06b;');
+}
+.icon-leaf {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf06c;');
+}
+.icon-fire {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf06d;');
+}
+.icon-eye-open {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf06e;');
+}
+.icon-eye-close {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf070;');
+}
+.icon-warning-sign {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf071;');
+}
+.icon-plane {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf072;');
+}
+.icon-calendar {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf073;');
+}
+.icon-random {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf074;');
+}
+.icon-comment {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf075;');
+}
+.icon-magnet {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf076;');
+}
+.icon-chevron-up {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf077;');
+}
+.icon-chevron-down {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf078;');
+}
+.icon-retweet {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf079;');
+}
+.icon-shopping-cart {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf07a;');
+}
+.icon-folder-close {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf07b;');
+}
+.icon-folder-open {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf07c;');
+}
+.icon-resize-vertical {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf07d;');
+}
+.icon-resize-horizontal {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf07e;');
+}
+.icon-bar-chart {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf080;');
+}
+.icon-twitter-sign {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf081;');
+}
+.icon-facebook-sign {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf082;');
+}
+.icon-camera-retro {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf083;');
+}
+.icon-key {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf084;');
+}
+.icon-cogs {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf085;');
+}
+.icon-gears {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf085;');
+}
+.icon-comments {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf086;');
+}
+.icon-thumbs-up-alt {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf087;');
+}
+.icon-thumbs-down-alt {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf088;');
+}
+.icon-star-half {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf089;');
+}
+.icon-heart-empty {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf08a;');
+}
+.icon-signout {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf08b;');
+}
+.icon-linkedin-sign {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf08c;');
+}
+.icon-pushpin {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf08d;');
+}
+.icon-external-link {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf08e;');
+}
+.icon-signin {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf090;');
+}
+.icon-trophy {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf091;');
+}
+.icon-github-sign {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf092;');
+}
+.icon-upload-alt {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf093;');
+}
+.icon-lemon {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf094;');
+}
+.icon-phone {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf095;');
+}
+.icon-check-empty {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf096;');
+}
+.icon-unchecked {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf096;');
+}
+.icon-bookmark-empty {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf097;');
+}
+.icon-phone-sign {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf098;');
+}
+.icon-twitter {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf099;');
+}
+.icon-facebook {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf09a;');
+}
+.icon-github {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf09b;');
+}
+.icon-unlock {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf09c;');
+}
+.icon-credit-card {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf09d;');
+}
+.icon-rss {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf09e;');
+}
+.icon-hdd {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0a0;');
+}
+.icon-bullhorn {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0a1;');
+}
+.icon-bell {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0a2;');
+}
+.icon-certificate {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0a3;');
+}
+.icon-hand-right {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0a4;');
+}
+.icon-hand-left {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0a5;');
+}
+.icon-hand-up {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0a6;');
+}
+.icon-hand-down {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0a7;');
+}
+.icon-circle-arrow-left {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0a8;');
+}
+.icon-circle-arrow-right {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0a9;');
+}
+.icon-circle-arrow-up {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0aa;');
+}
+.icon-circle-arrow-down {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0ab;');
+}
+.icon-globe {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0ac;');
+}
+.icon-wrench {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0ad;');
+}
+.icon-tasks {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0ae;');
+}
+.icon-filter {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0b0;');
+}
+.icon-briefcase {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0b1;');
+}
+.icon-fullscreen {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0b2;');
+}
+.icon-group {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0c0;');
+}
+.icon-link {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0c1;');
+}
+.icon-cloud {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0c2;');
+}
+.icon-beaker {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0c3;');
+}
+.icon-cut {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0c4;');
+}
+.icon-copy {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0c5;');
+}
+.icon-paper-clip {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0c6;');
+}
+.icon-paperclip {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0c6;');
+}
+.icon-save {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0c7;');
+}
+.icon-sign-blank {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0c8;');
+}
+.icon-reorder {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0c9;');
+}
+.icon-list-ul {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0ca;');
+}
+.icon-list-ol {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0cb;');
+}
+.icon-strikethrough {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0cc;');
+}
+.icon-underline {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0cd;');
+}
+.icon-table {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0ce;');
+}
+.icon-magic {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0d0;');
+}
+.icon-truck {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0d1;');
+}
+.icon-pinterest {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0d2;');
+}
+.icon-pinterest-sign {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0d3;');
+}
+.icon-google-plus-sign {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0d4;');
+}
+.icon-google-plus {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0d5;');
+}
+.icon-money {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0d6;');
+}
+.icon-caret-down {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0d7;');
+}
+.icon-caret-up {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0d8;');
+}
+.icon-caret-left {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0d9;');
+}
+.icon-caret-right {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0da;');
+}
+.icon-columns {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0db;');
+}
+.icon-sort {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0dc;');
+}
+.icon-sort-down {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0dd;');
+}
+.icon-sort-up {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0de;');
+}
+.icon-envelope {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0e0;');
+}
+.icon-linkedin {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0e1;');
+}
+.icon-undo {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0e2;');
+}
+.icon-rotate-left {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0e2;');
+}
+.icon-legal {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0e3;');
+}
+.icon-dashboard {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0e4;');
+}
+.icon-comment-alt {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0e5;');
+}
+.icon-comments-alt {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0e6;');
+}
+.icon-bolt {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0e7;');
+}
+.icon-sitemap {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0e8;');
+}
+.icon-umbrella {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0e9;');
+}
+.icon-paste {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0ea;');
+}
+.icon-lightbulb {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0eb;');
+}
+.icon-exchange {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0ec;');
+}
+.icon-cloud-download {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0ed;');
+}
+.icon-cloud-upload {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0ee;');
+}
+.icon-user-md {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0f0;');
+}
+.icon-stethoscope {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0f1;');
+}
+.icon-suitcase {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0f2;');
+}
+.icon-bell-alt {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0f3;');
+}
+.icon-coffee {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0f4;');
+}
+.icon-food {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0f5;');
+}
+.icon-file-text-alt {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0f6;');
+}
+.icon-building {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0f7;');
+}
+.icon-hospital {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0f8;');
+}
+.icon-ambulance {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0f9;');
+}
+.icon-medkit {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0fa;');
+}
+.icon-fighter-jet {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0fb;');
+}
+.icon-beer {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0fc;');
+}
+.icon-h-sign {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0fd;');
+}
+.icon-plus-sign-alt {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0fe;');
+}
+.icon-double-angle-left {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf100;');
+}
+.icon-double-angle-right {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf101;');
+}
+.icon-double-angle-up {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf102;');
+}
+.icon-double-angle-down {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf103;');
+}
+.icon-angle-left {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf104;');
+}
+.icon-angle-right {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf105;');
+}
+.icon-angle-up {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf106;');
+}
+.icon-angle-down {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf107;');
+}
+.icon-desktop {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf108;');
+}
+.icon-laptop {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf109;');
+}
+.icon-tablet {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf10a;');
+}
+.icon-mobile-phone {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf10b;');
+}
+.icon-circle-blank {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf10c;');
+}
+.icon-quote-left {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf10d;');
+}
+.icon-quote-right {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf10e;');
+}
+.icon-spinner {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf110;');
+}
+.icon-circle {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf111;');
+}
+.icon-reply {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf112;');
+}
+.icon-mail-reply {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf112;');
+}
+.icon-github-alt {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf113;');
+}
+.icon-folder-close-alt {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf114;');
+}
+.icon-folder-open-alt {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf115;');
+}
+.icon-expand-alt {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf116;');
+}
+.icon-collapse-alt {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf117;');
+}
+.icon-smile {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf118;');
+}
+.icon-frown {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf119;');
+}
+.icon-meh {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf11a;');
+}
+.icon-gamepad {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf11b;');
+}
+.icon-keyboard {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf11c;');
+}
+.icon-flag-alt {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf11d;');
+}
+.icon-flag-checkered {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf11e;');
+}
+.icon-terminal {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf120;');
+}
+.icon-code {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf121;');
+}
+.icon-reply-all {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf122;');
+}
+.icon-mail-reply-all {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf122;');
+}
+.icon-star-half-empty {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf123;');
+}
+.icon-star-half-full {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf123;');
+}
+.icon-location-arrow {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf124;');
+}
+.icon-crop {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf125;');
+}
+.icon-code-fork {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf126;');
+}
+.icon-unlink {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf127;');
+}
+.icon-question {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf128;');
+}
+.icon-info {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf129;');
+}
+.icon-exclamation {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf12a;');
+}
+.icon-superscript {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf12b;');
+}
+.icon-subscript {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf12c;');
+}
+.icon-eraser {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf12d;');
+}
+.icon-puzzle-piece {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf12e;');
+}
+.icon-microphone {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf130;');
+}
+.icon-microphone-off {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf131;');
+}
+.icon-shield {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf132;');
+}
+.icon-calendar-empty {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf133;');
+}
+.icon-fire-extinguisher {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf134;');
+}
+.icon-rocket {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf135;');
+}
+.icon-maxcdn {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf136;');
+}
+.icon-chevron-sign-left {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf137;');
+}
+.icon-chevron-sign-right {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf138;');
+}
+.icon-chevron-sign-up {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf139;');
+}
+.icon-chevron-sign-down {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf13a;');
+}
+.icon-html5 {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf13b;');
+}
+.icon-css3 {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf13c;');
+}
+.icon-anchor {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf13d;');
+}
+.icon-unlock-alt {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf13e;');
+}
+.icon-bullseye {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf140;');
+}
+.icon-ellipsis-horizontal {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf141;');
+}
+.icon-ellipsis-vertical {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf142;');
+}
+.icon-rss-sign {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf143;');
+}
+.icon-play-sign {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf144;');
+}
+.icon-ticket {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf145;');
+}
+.icon-minus-sign-alt {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf146;');
+}
+.icon-check-minus {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf147;');
+}
+.icon-level-up {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf148;');
+}
+.icon-level-down {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf149;');
+}
+.icon-check-sign {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf14a;');
+}
+.icon-edit-sign {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf14b;');
+}
+.icon-external-link-sign {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf14c;');
+}
+.icon-share-sign {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf14d;');
+}
+.icon-compass {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf14e;');
+}
+.icon-collapse {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf150;');
+}
+.icon-collapse-top {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf151;');
+}
+.icon-expand {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf152;');
+}
+.icon-eur {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf153;');
+}
+.icon-euro {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf153;');
+}
+.icon-gbp {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf154;');
+}
+.icon-usd {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf155;');
+}
+.icon-dollar {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf155;');
+}
+.icon-inr {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf156;');
+}
+.icon-rupee {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf156;');
+}
+.icon-jpy {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf157;');
+}
+.icon-yen {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf157;');
+}
+.icon-cny {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf158;');
+}
+.icon-renminbi {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf158;');
+}
+.icon-krw {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf159;');
+}
+.icon-won {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf159;');
+}
+.icon-btc {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf15a;');
+}
+.icon-bitcoin {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf15a;');
+}
+.icon-file {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf15b;');
+}
+.icon-file-text {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf15c;');
+}
+.icon-sort-by-alphabet {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf15d;');
+}
+.icon-sort-by-alphabet-alt {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf15e;');
+}
+.icon-sort-by-attributes {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf160;');
+}
+.icon-sort-by-attributes-alt {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf161;');
+}
+.icon-sort-by-order {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf162;');
+}
+.icon-sort-by-order-alt {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf163;');
+}
+.icon-thumbs-up {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf164;');
+}
+.icon-thumbs-down {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf165;');
+}
+.icon-youtube-sign {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf166;');
+}
+.icon-youtube {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf167;');
+}
+.icon-xing {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf168;');
+}
+.icon-xing-sign {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf169;');
+}
+.icon-youtube-play {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf16a;');
+}
+.icon-dropbox {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf16b;');
+}
+.icon-stackexchange {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf16c;');
+}
+.icon-instagram {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf16d;');
+}
+.icon-flickr {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf16e;');
+}
+.icon-adn {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf170;');
+}
+.icon-bitbucket {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf171;');
+}
+.icon-bitbucket-sign {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf172;');
+}
+.icon-tumblr {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf173;');
+}
+.icon-tumblr-sign {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf174;');
+}
+.icon-long-arrow-down {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf175;');
+}
+.icon-long-arrow-up {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf176;');
+}
+.icon-long-arrow-left {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf177;');
+}
+.icon-long-arrow-right {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf178;');
+}
+.icon-apple {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf179;');
+}
+.icon-windows {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf17a;');
+}
+.icon-android {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf17b;');
+}
+.icon-linux {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf17c;');
+}
+.icon-dribbble {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf17d;');
+}
+.icon-skype {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf17e;');
+}
+.icon-foursquare {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf180;');
+}
+.icon-trello {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf181;');
+}
+.icon-female {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf182;');
+}
+.icon-male {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf183;');
+}
+.icon-gittip {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf184;');
+}
+.icon-sun {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf185;');
+}
+.icon-moon {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf186;');
+}
+.icon-archive {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf187;');
+}
+.icon-bug {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf188;');
+}
+.icon-vk {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf189;');
+}
+.icon-weibo {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf18a;');
+}
+.icon-renren {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf18b;');
+}
diff --git a/library/font_awesome/css/font-awesome-ie7.min.css b/library/font_awesome/css/font-awesome-ie7.min.css
new file mode 100644
index 000000000..d3dae63bd
--- /dev/null
+++ b/library/font_awesome/css/font-awesome-ie7.min.css
@@ -0,0 +1,384 @@
+.icon-large{font-size:1.3333333333333333em;margin-top:-4px;padding-top:3px;margin-bottom:-4px;padding-bottom:3px;vertical-align:middle;}
+.nav [class^="icon-"],.nav [class*=" icon-"]{vertical-align:inherit;margin-top:-4px;padding-top:3px;margin-bottom:-4px;padding-bottom:3px;}.nav [class^="icon-"].icon-large,.nav [class*=" icon-"].icon-large{vertical-align:-25%;}
+.nav-pills [class^="icon-"].icon-large,.nav-tabs [class^="icon-"].icon-large,.nav-pills [class*=" icon-"].icon-large,.nav-tabs [class*=" icon-"].icon-large{line-height:.75em;margin-top:-7px;padding-top:5px;margin-bottom:-5px;padding-bottom:4px;}
+.btn [class^="icon-"].pull-left,.btn [class*=" icon-"].pull-left,.btn [class^="icon-"].pull-right,.btn [class*=" icon-"].pull-right{vertical-align:inherit;}
+.btn [class^="icon-"].icon-large,.btn [class*=" icon-"].icon-large{margin-top:-0.5em;}
+a [class^="icon-"],a [class*=" icon-"]{cursor:pointer;}
+.icon-glass{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf000;');}
+.icon-music{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf001;');}
+.icon-search{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf002;');}
+.icon-envelope-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf003;');}
+.icon-heart{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf004;');}
+.icon-star{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf005;');}
+.icon-star-empty{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf006;');}
+.icon-user{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf007;');}
+.icon-film{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf008;');}
+.icon-th-large{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf009;');}
+.icon-th{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf00a;');}
+.icon-th-list{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf00b;');}
+.icon-ok{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf00c;');}
+.icon-remove{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf00d;');}
+.icon-zoom-in{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf00e;');}
+.icon-zoom-out{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf010;');}
+.icon-off{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf011;');}
+.icon-power-off{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf011;');}
+.icon-signal{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf012;');}
+.icon-cog{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf013;');}
+.icon-gear{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf013;');}
+.icon-trash{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf014;');}
+.icon-home{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf015;');}
+.icon-file-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf016;');}
+.icon-time{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf017;');}
+.icon-road{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf018;');}
+.icon-download-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf019;');}
+.icon-download{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf01a;');}
+.icon-upload{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf01b;');}
+.icon-inbox{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf01c;');}
+.icon-play-circle{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf01d;');}
+.icon-repeat{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf01e;');}
+.icon-rotate-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf01e;');}
+.icon-refresh{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf021;');}
+.icon-list-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf022;');}
+.icon-lock{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf023;');}
+.icon-flag{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf024;');}
+.icon-headphones{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf025;');}
+.icon-volume-off{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf026;');}
+.icon-volume-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf027;');}
+.icon-volume-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf028;');}
+.icon-qrcode{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf029;');}
+.icon-barcode{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf02a;');}
+.icon-tag{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf02b;');}
+.icon-tags{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf02c;');}
+.icon-book{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf02d;');}
+.icon-bookmark{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf02e;');}
+.icon-print{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf02f;');}
+.icon-camera{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf030;');}
+.icon-font{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf031;');}
+.icon-bold{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf032;');}
+.icon-italic{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf033;');}
+.icon-text-height{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf034;');}
+.icon-text-width{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf035;');}
+.icon-align-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf036;');}
+.icon-align-center{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf037;');}
+.icon-align-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf038;');}
+.icon-align-justify{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf039;');}
+.icon-list{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf03a;');}
+.icon-indent-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf03b;');}
+.icon-indent-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf03c;');}
+.icon-facetime-video{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf03d;');}
+.icon-picture{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf03e;');}
+.icon-pencil{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf040;');}
+.icon-map-marker{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf041;');}
+.icon-adjust{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf042;');}
+.icon-tint{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf043;');}
+.icon-edit{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf044;');}
+.icon-share{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf045;');}
+.icon-check{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf046;');}
+.icon-move{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf047;');}
+.icon-step-backward{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf048;');}
+.icon-fast-backward{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf049;');}
+.icon-backward{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf04a;');}
+.icon-play{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf04b;');}
+.icon-pause{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf04c;');}
+.icon-stop{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf04d;');}
+.icon-forward{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf04e;');}
+.icon-fast-forward{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf050;');}
+.icon-step-forward{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf051;');}
+.icon-eject{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf052;');}
+.icon-chevron-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf053;');}
+.icon-chevron-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf054;');}
+.icon-plus-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf055;');}
+.icon-minus-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf056;');}
+.icon-remove-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf057;');}
+.icon-ok-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf058;');}
+.icon-question-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf059;');}
+.icon-info-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf05a;');}
+.icon-screenshot{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf05b;');}
+.icon-remove-circle{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf05c;');}
+.icon-ok-circle{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf05d;');}
+.icon-ban-circle{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf05e;');}
+.icon-arrow-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf060;');}
+.icon-arrow-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf061;');}
+.icon-arrow-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf062;');}
+.icon-arrow-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf063;');}
+.icon-share-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf064;');}
+.icon-mail-forward{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf064;');}
+.icon-resize-full{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf065;');}
+.icon-resize-small{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf066;');}
+.icon-plus{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf067;');}
+.icon-minus{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf068;');}
+.icon-asterisk{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf069;');}
+.icon-exclamation-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf06a;');}
+.icon-gift{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf06b;');}
+.icon-leaf{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf06c;');}
+.icon-fire{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf06d;');}
+.icon-eye-open{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf06e;');}
+.icon-eye-close{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf070;');}
+.icon-warning-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf071;');}
+.icon-plane{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf072;');}
+.icon-calendar{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf073;');}
+.icon-random{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf074;');}
+.icon-comment{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf075;');}
+.icon-magnet{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf076;');}
+.icon-chevron-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf077;');}
+.icon-chevron-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf078;');}
+.icon-retweet{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf079;');}
+.icon-shopping-cart{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf07a;');}
+.icon-folder-close{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf07b;');}
+.icon-folder-open{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf07c;');}
+.icon-resize-vertical{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf07d;');}
+.icon-resize-horizontal{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf07e;');}
+.icon-bar-chart{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf080;');}
+.icon-twitter-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf081;');}
+.icon-facebook-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf082;');}
+.icon-camera-retro{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf083;');}
+.icon-key{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf084;');}
+.icon-cogs{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf085;');}
+.icon-gears{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf085;');}
+.icon-comments{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf086;');}
+.icon-thumbs-up-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf087;');}
+.icon-thumbs-down-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf088;');}
+.icon-star-half{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf089;');}
+.icon-heart-empty{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf08a;');}
+.icon-signout{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf08b;');}
+.icon-linkedin-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf08c;');}
+.icon-pushpin{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf08d;');}
+.icon-external-link{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf08e;');}
+.icon-signin{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf090;');}
+.icon-trophy{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf091;');}
+.icon-github-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf092;');}
+.icon-upload-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf093;');}
+.icon-lemon{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf094;');}
+.icon-phone{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf095;');}
+.icon-check-empty{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf096;');}
+.icon-unchecked{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf096;');}
+.icon-bookmark-empty{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf097;');}
+.icon-phone-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf098;');}
+.icon-twitter{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf099;');}
+.icon-facebook{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf09a;');}
+.icon-github{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf09b;');}
+.icon-unlock{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf09c;');}
+.icon-credit-card{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf09d;');}
+.icon-rss{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf09e;');}
+.icon-hdd{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0a0;');}
+.icon-bullhorn{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0a1;');}
+.icon-bell{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0a2;');}
+.icon-certificate{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0a3;');}
+.icon-hand-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0a4;');}
+.icon-hand-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0a5;');}
+.icon-hand-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0a6;');}
+.icon-hand-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0a7;');}
+.icon-circle-arrow-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0a8;');}
+.icon-circle-arrow-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0a9;');}
+.icon-circle-arrow-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0aa;');}
+.icon-circle-arrow-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0ab;');}
+.icon-globe{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0ac;');}
+.icon-wrench{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0ad;');}
+.icon-tasks{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0ae;');}
+.icon-filter{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0b0;');}
+.icon-briefcase{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0b1;');}
+.icon-fullscreen{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0b2;');}
+.icon-group{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0c0;');}
+.icon-link{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0c1;');}
+.icon-cloud{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0c2;');}
+.icon-beaker{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0c3;');}
+.icon-cut{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0c4;');}
+.icon-copy{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0c5;');}
+.icon-paper-clip{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0c6;');}
+.icon-paperclip{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0c6;');}
+.icon-save{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0c7;');}
+.icon-sign-blank{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0c8;');}
+.icon-reorder{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0c9;');}
+.icon-list-ul{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0ca;');}
+.icon-list-ol{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0cb;');}
+.icon-strikethrough{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0cc;');}
+.icon-underline{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0cd;');}
+.icon-table{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0ce;');}
+.icon-magic{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0d0;');}
+.icon-truck{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0d1;');}
+.icon-pinterest{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0d2;');}
+.icon-pinterest-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0d3;');}
+.icon-google-plus-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0d4;');}
+.icon-google-plus{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0d5;');}
+.icon-money{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0d6;');}
+.icon-caret-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0d7;');}
+.icon-caret-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0d8;');}
+.icon-caret-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0d9;');}
+.icon-caret-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0da;');}
+.icon-columns{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0db;');}
+.icon-sort{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0dc;');}
+.icon-sort-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0dd;');}
+.icon-sort-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0de;');}
+.icon-envelope{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0e0;');}
+.icon-linkedin{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0e1;');}
+.icon-undo{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0e2;');}
+.icon-rotate-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0e2;');}
+.icon-legal{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0e3;');}
+.icon-dashboard{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0e4;');}
+.icon-comment-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0e5;');}
+.icon-comments-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0e6;');}
+.icon-bolt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0e7;');}
+.icon-sitemap{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0e8;');}
+.icon-umbrella{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0e9;');}
+.icon-paste{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0ea;');}
+.icon-lightbulb{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0eb;');}
+.icon-exchange{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0ec;');}
+.icon-cloud-download{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0ed;');}
+.icon-cloud-upload{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0ee;');}
+.icon-user-md{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0f0;');}
+.icon-stethoscope{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0f1;');}
+.icon-suitcase{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0f2;');}
+.icon-bell-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0f3;');}
+.icon-coffee{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0f4;');}
+.icon-food{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0f5;');}
+.icon-file-text-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0f6;');}
+.icon-building{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0f7;');}
+.icon-hospital{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0f8;');}
+.icon-ambulance{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0f9;');}
+.icon-medkit{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0fa;');}
+.icon-fighter-jet{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0fb;');}
+.icon-beer{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0fc;');}
+.icon-h-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0fd;');}
+.icon-plus-sign-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0fe;');}
+.icon-double-angle-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf100;');}
+.icon-double-angle-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf101;');}
+.icon-double-angle-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf102;');}
+.icon-double-angle-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf103;');}
+.icon-angle-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf104;');}
+.icon-angle-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf105;');}
+.icon-angle-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf106;');}
+.icon-angle-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf107;');}
+.icon-desktop{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf108;');}
+.icon-laptop{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf109;');}
+.icon-tablet{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf10a;');}
+.icon-mobile-phone{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf10b;');}
+.icon-circle-blank{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf10c;');}
+.icon-quote-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf10d;');}
+.icon-quote-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf10e;');}
+.icon-spinner{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf110;');}
+.icon-circle{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf111;');}
+.icon-reply{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf112;');}
+.icon-mail-reply{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf112;');}
+.icon-github-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf113;');}
+.icon-folder-close-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf114;');}
+.icon-folder-open-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf115;');}
+.icon-expand-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf116;');}
+.icon-collapse-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf117;');}
+.icon-smile{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf118;');}
+.icon-frown{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf119;');}
+.icon-meh{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf11a;');}
+.icon-gamepad{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf11b;');}
+.icon-keyboard{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf11c;');}
+.icon-flag-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf11d;');}
+.icon-flag-checkered{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf11e;');}
+.icon-terminal{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf120;');}
+.icon-code{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf121;');}
+.icon-reply-all{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf122;');}
+.icon-mail-reply-all{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf122;');}
+.icon-star-half-empty{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf123;');}
+.icon-star-half-full{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf123;');}
+.icon-location-arrow{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf124;');}
+.icon-crop{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf125;');}
+.icon-code-fork{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf126;');}
+.icon-unlink{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf127;');}
+.icon-question{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf128;');}
+.icon-info{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf129;');}
+.icon-exclamation{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf12a;');}
+.icon-superscript{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf12b;');}
+.icon-subscript{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf12c;');}
+.icon-eraser{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf12d;');}
+.icon-puzzle-piece{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf12e;');}
+.icon-microphone{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf130;');}
+.icon-microphone-off{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf131;');}
+.icon-shield{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf132;');}
+.icon-calendar-empty{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf133;');}
+.icon-fire-extinguisher{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf134;');}
+.icon-rocket{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf135;');}
+.icon-maxcdn{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf136;');}
+.icon-chevron-sign-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf137;');}
+.icon-chevron-sign-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf138;');}
+.icon-chevron-sign-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf139;');}
+.icon-chevron-sign-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf13a;');}
+.icon-html5{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf13b;');}
+.icon-css3{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf13c;');}
+.icon-anchor{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf13d;');}
+.icon-unlock-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf13e;');}
+.icon-bullseye{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf140;');}
+.icon-ellipsis-horizontal{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf141;');}
+.icon-ellipsis-vertical{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf142;');}
+.icon-rss-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf143;');}
+.icon-play-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf144;');}
+.icon-ticket{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf145;');}
+.icon-minus-sign-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf146;');}
+.icon-check-minus{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf147;');}
+.icon-level-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf148;');}
+.icon-level-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf149;');}
+.icon-check-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf14a;');}
+.icon-edit-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf14b;');}
+.icon-external-link-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf14c;');}
+.icon-share-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf14d;');}
+.icon-compass{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf14e;');}
+.icon-collapse{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf150;');}
+.icon-collapse-top{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf151;');}
+.icon-expand{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf152;');}
+.icon-eur{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf153;');}
+.icon-euro{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf153;');}
+.icon-gbp{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf154;');}
+.icon-usd{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf155;');}
+.icon-dollar{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf155;');}
+.icon-inr{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf156;');}
+.icon-rupee{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf156;');}
+.icon-jpy{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf157;');}
+.icon-yen{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf157;');}
+.icon-cny{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf158;');}
+.icon-renminbi{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf158;');}
+.icon-krw{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf159;');}
+.icon-won{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf159;');}
+.icon-btc{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf15a;');}
+.icon-bitcoin{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf15a;');}
+.icon-file{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf15b;');}
+.icon-file-text{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf15c;');}
+.icon-sort-by-alphabet{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf15d;');}
+.icon-sort-by-alphabet-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf15e;');}
+.icon-sort-by-attributes{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf160;');}
+.icon-sort-by-attributes-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf161;');}
+.icon-sort-by-order{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf162;');}
+.icon-sort-by-order-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf163;');}
+.icon-thumbs-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf164;');}
+.icon-thumbs-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf165;');}
+.icon-youtube-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf166;');}
+.icon-youtube{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf167;');}
+.icon-xing{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf168;');}
+.icon-xing-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf169;');}
+.icon-youtube-play{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf16a;');}
+.icon-dropbox{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf16b;');}
+.icon-stackexchange{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf16c;');}
+.icon-instagram{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf16d;');}
+.icon-flickr{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf16e;');}
+.icon-adn{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf170;');}
+.icon-bitbucket{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf171;');}
+.icon-bitbucket-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf172;');}
+.icon-tumblr{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf173;');}
+.icon-tumblr-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf174;');}
+.icon-long-arrow-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf175;');}
+.icon-long-arrow-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf176;');}
+.icon-long-arrow-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf177;');}
+.icon-long-arrow-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf178;');}
+.icon-apple{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf179;');}
+.icon-windows{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf17a;');}
+.icon-android{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf17b;');}
+.icon-linux{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf17c;');}
+.icon-dribbble{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf17d;');}
+.icon-skype{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf17e;');}
+.icon-foursquare{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf180;');}
+.icon-trello{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf181;');}
+.icon-female{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf182;');}
+.icon-male{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf183;');}
+.icon-gittip{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf184;');}
+.icon-sun{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf185;');}
+.icon-moon{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf186;');}
+.icon-archive{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf187;');}
+.icon-bug{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf188;');}
+.icon-vk{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf189;');}
+.icon-weibo{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf18a;');}
+.icon-renren{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf18b;');}
diff --git a/library/font_awesome/css/font-awesome.css b/library/font_awesome/css/font-awesome.css
new file mode 100644
index 000000000..7ede1828a
--- /dev/null
+++ b/library/font_awesome/css/font-awesome.css
@@ -0,0 +1,1479 @@
+/*!
+ * Font Awesome 3.2.1
+ * the iconic font designed for Bootstrap
+ * ------------------------------------------------------------------------------
+ * The full suite of pictographic icons, examples, and documentation can be
+ * found at http://fontawesome.io. Stay up to date on Twitter at
+ * http://twitter.com/fontawesome.
+ *
+ * License
+ * ------------------------------------------------------------------------------
+ * - The Font Awesome font is licensed under SIL OFL 1.1 -
+ * http://scripts.sil.org/OFL
+ * - Font Awesome CSS, LESS, and SASS files are licensed under MIT License -
+ * http://opensource.org/licenses/mit-license.html
+ * - Font Awesome documentation licensed under CC BY 3.0 -
+ * http://creativecommons.org/licenses/by/3.0/
+ * - Attribution is no longer required in Font Awesome 3.0, but much appreciated:
+ * "Font Awesome by Dave Gandy - http://fontawesome.io"
+ *
+ * Author - Dave Gandy
+ * ------------------------------------------------------------------------------
+ * Email: dave@fontawesome.io
+ * Twitter: http://twitter.com/davegandy
+ * Work: Lead Product Designer @ Kyruus - http://kyruus.com
+ */
+/* FONT PATH
+ * -------------------------- */
+@font-face {
+ font-family: 'FontAwesome';
+ src: url('../font/fontawesome-webfont.eot?v=3.2.1');
+ src: url('../font/fontawesome-webfont.eot?#iefix&v=3.2.1') format('embedded-opentype'), url('../font/fontawesome-webfont.woff?v=3.2.1') format('woff'), url('../font/fontawesome-webfont.ttf?v=3.2.1') format('truetype'), url('../font/fontawesome-webfont.svg#fontawesomeregular?v=3.2.1') format('svg');
+ font-weight: normal;
+ font-style: normal;
+}
+/* FONT AWESOME CORE
+ * -------------------------- */
+[class^="icon-"],
+[class*=" icon-"] {
+ font-family: FontAwesome;
+ font-weight: normal;
+ font-style: normal;
+ text-decoration: inherit;
+ -webkit-font-smoothing: antialiased;
+ *margin-right: .3em;
+}
+[class^="icon-"]:before,
+[class*=" icon-"]:before {
+ text-decoration: inherit;
+ display: inline-block;
+ speak: none;
+}
+/* makes the font 33% larger relative to the icon container */
+.icon-large:before {
+ vertical-align: -10%;
+ font-size: 1.3333333333333333em;
+}
+/* makes sure icons active on rollover in links */
+a [class^="icon-"],
+a [class*=" icon-"] {
+ display: inline;
+}
+/* increased font size for icon-large */
+[class^="icon-"].icon-fixed-width,
+[class*=" icon-"].icon-fixed-width {
+ display: inline-block;
+ width: 1.1428571428571428em;
+ text-align: right;
+ padding-right: 0.2857142857142857em;
+}
+[class^="icon-"].icon-fixed-width.icon-large,
+[class*=" icon-"].icon-fixed-width.icon-large {
+ width: 1.4285714285714286em;
+}
+.icons-ul {
+ margin-left: 2.142857142857143em;
+ list-style-type: none;
+}
+.icons-ul > li {
+ position: relative;
+}
+.icons-ul .icon-li {
+ position: absolute;
+ left: -2.142857142857143em;
+ width: 2.142857142857143em;
+ text-align: center;
+ line-height: inherit;
+}
+[class^="icon-"].hide,
+[class*=" icon-"].hide {
+ display: none;
+}
+.icon-muted {
+ color: #eeeeee;
+}
+.icon-light {
+ color: #ffffff;
+}
+.icon-dark {
+ color: #333333;
+}
+.icon-border {
+ border: solid 1px #eeeeee;
+ padding: .2em .25em .15em;
+ -webkit-border-radius: 3px;
+ -moz-border-radius: 3px;
+ border-radius: 3px;
+}
+.icon-2x {
+ font-size: 2em;
+}
+.icon-2x.icon-border {
+ border-width: 2px;
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ border-radius: 4px;
+}
+.icon-3x {
+ font-size: 3em;
+}
+.icon-3x.icon-border {
+ border-width: 3px;
+ -webkit-border-radius: 5px;
+ -moz-border-radius: 5px;
+ border-radius: 5px;
+}
+.icon-4x {
+ font-size: 4em;
+}
+.icon-4x.icon-border {
+ border-width: 4px;
+ -webkit-border-radius: 6px;
+ -moz-border-radius: 6px;
+ border-radius: 6px;
+}
+.icon-5x {
+ font-size: 5em;
+}
+.icon-5x.icon-border {
+ border-width: 5px;
+ -webkit-border-radius: 7px;
+ -moz-border-radius: 7px;
+ border-radius: 7px;
+}
+.pull-right {
+ float: right;
+}
+.pull-left {
+ float: left;
+}
+[class^="icon-"].pull-left,
+[class*=" icon-"].pull-left {
+ margin-right: .3em;
+}
+[class^="icon-"].pull-right,
+[class*=" icon-"].pull-right {
+ margin-left: .3em;
+}
+/* BOOTSTRAP SPECIFIC CLASSES
+ * -------------------------- */
+/* Bootstrap 2.0 sprites.less reset */
+[class^="icon-"],
+[class*=" icon-"] {
+ display: inline;
+ width: auto;
+ height: auto;
+ line-height: normal;
+ vertical-align: baseline;
+ background-image: none;
+ background-position: 0% 0%;
+ background-repeat: repeat;
+ margin-top: 0;
+}
+/* more sprites.less reset */
+.icon-white,
+.nav-pills > .active > a > [class^="icon-"],
+.nav-pills > .active > a > [class*=" icon-"],
+.nav-list > .active > a > [class^="icon-"],
+.nav-list > .active > a > [class*=" icon-"],
+.navbar-inverse .nav > .active > a > [class^="icon-"],
+.navbar-inverse .nav > .active > a > [class*=" icon-"],
+.dropdown-menu > li > a:hover > [class^="icon-"],
+.dropdown-menu > li > a:hover > [class*=" icon-"],
+.dropdown-menu > .active > a > [class^="icon-"],
+.dropdown-menu > .active > a > [class*=" icon-"],
+.dropdown-submenu:hover > a > [class^="icon-"],
+.dropdown-submenu:hover > a > [class*=" icon-"] {
+ background-image: none;
+}
+/* keeps Bootstrap styles with and without icons the same */
+.btn [class^="icon-"].icon-large,
+.nav [class^="icon-"].icon-large,
+.btn [class*=" icon-"].icon-large,
+.nav [class*=" icon-"].icon-large {
+ line-height: .9em;
+}
+.btn [class^="icon-"].icon-spin,
+.nav [class^="icon-"].icon-spin,
+.btn [class*=" icon-"].icon-spin,
+.nav [class*=" icon-"].icon-spin {
+ display: inline-block;
+}
+.nav-tabs [class^="icon-"],
+.nav-pills [class^="icon-"],
+.nav-tabs [class*=" icon-"],
+.nav-pills [class*=" icon-"],
+.nav-tabs [class^="icon-"].icon-large,
+.nav-pills [class^="icon-"].icon-large,
+.nav-tabs [class*=" icon-"].icon-large,
+.nav-pills [class*=" icon-"].icon-large {
+ line-height: .9em;
+}
+.btn [class^="icon-"].pull-left.icon-2x,
+.btn [class*=" icon-"].pull-left.icon-2x,
+.btn [class^="icon-"].pull-right.icon-2x,
+.btn [class*=" icon-"].pull-right.icon-2x {
+ margin-top: .18em;
+}
+.btn [class^="icon-"].icon-spin.icon-large,
+.btn [class*=" icon-"].icon-spin.icon-large {
+ line-height: .8em;
+}
+.btn.btn-small [class^="icon-"].pull-left.icon-2x,
+.btn.btn-small [class*=" icon-"].pull-left.icon-2x,
+.btn.btn-small [class^="icon-"].pull-right.icon-2x,
+.btn.btn-small [class*=" icon-"].pull-right.icon-2x {
+ margin-top: .25em;
+}
+.btn.btn-large [class^="icon-"],
+.btn.btn-large [class*=" icon-"] {
+ margin-top: 0;
+}
+.btn.btn-large [class^="icon-"].pull-left.icon-2x,
+.btn.btn-large [class*=" icon-"].pull-left.icon-2x,
+.btn.btn-large [class^="icon-"].pull-right.icon-2x,
+.btn.btn-large [class*=" icon-"].pull-right.icon-2x {
+ margin-top: .05em;
+}
+.btn.btn-large [class^="icon-"].pull-left.icon-2x,
+.btn.btn-large [class*=" icon-"].pull-left.icon-2x {
+ margin-right: .2em;
+}
+.btn.btn-large [class^="icon-"].pull-right.icon-2x,
+.btn.btn-large [class*=" icon-"].pull-right.icon-2x {
+ margin-left: .2em;
+}
+/* Fixes alignment in nav lists */
+.nav-list [class^="icon-"],
+.nav-list [class*=" icon-"] {
+ line-height: inherit;
+}
+/* EXTRAS
+ * -------------------------- */
+/* Stacked and layered icon */
+.icon-stack {
+ position: relative;
+ display: inline-block;
+ width: 2em;
+ height: 2em;
+ line-height: 2em;
+ vertical-align: -35%;
+}
+.icon-stack [class^="icon-"],
+.icon-stack [class*=" icon-"] {
+ display: block;
+ text-align: center;
+ position: absolute;
+ width: 100%;
+ height: 100%;
+ font-size: 1em;
+ line-height: inherit;
+ *line-height: 2em;
+}
+.icon-stack .icon-stack-base {
+ font-size: 2em;
+ *line-height: 1em;
+}
+/* Animated rotating icon */
+.icon-spin {
+ display: inline-block;
+ -moz-animation: spin 2s infinite linear;
+ -o-animation: spin 2s infinite linear;
+ -webkit-animation: spin 2s infinite linear;
+ animation: spin 2s infinite linear;
+}
+/* Prevent stack and spinners from being taken inline when inside a link */
+a .icon-stack,
+a .icon-spin {
+ display: inline-block;
+ text-decoration: none;
+}
+@-moz-keyframes spin {
+ 0% {
+ -moz-transform: rotate(0deg);
+ }
+ 100% {
+ -moz-transform: rotate(359deg);
+ }
+}
+@-webkit-keyframes spin {
+ 0% {
+ -webkit-transform: rotate(0deg);
+ }
+ 100% {
+ -webkit-transform: rotate(359deg);
+ }
+}
+@-o-keyframes spin {
+ 0% {
+ -o-transform: rotate(0deg);
+ }
+ 100% {
+ -o-transform: rotate(359deg);
+ }
+}
+@-ms-keyframes spin {
+ 0% {
+ -ms-transform: rotate(0deg);
+ }
+ 100% {
+ -ms-transform: rotate(359deg);
+ }
+}
+@keyframes spin {
+ 0% {
+ transform: rotate(0deg);
+ }
+ 100% {
+ transform: rotate(359deg);
+ }
+}
+/* Icon rotations and mirroring */
+.icon-rotate-90:before {
+ -webkit-transform: rotate(90deg);
+ -moz-transform: rotate(90deg);
+ -ms-transform: rotate(90deg);
+ -o-transform: rotate(90deg);
+ transform: rotate(90deg);
+ filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1);
+}
+.icon-rotate-180:before {
+ -webkit-transform: rotate(180deg);
+ -moz-transform: rotate(180deg);
+ -ms-transform: rotate(180deg);
+ -o-transform: rotate(180deg);
+ transform: rotate(180deg);
+ filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2);
+}
+.icon-rotate-270:before {
+ -webkit-transform: rotate(270deg);
+ -moz-transform: rotate(270deg);
+ -ms-transform: rotate(270deg);
+ -o-transform: rotate(270deg);
+ transform: rotate(270deg);
+ filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3);
+}
+.icon-flip-horizontal:before {
+ -webkit-transform: scale(-1, 1);
+ -moz-transform: scale(-1, 1);
+ -ms-transform: scale(-1, 1);
+ -o-transform: scale(-1, 1);
+ transform: scale(-1, 1);
+}
+.icon-flip-vertical:before {
+ -webkit-transform: scale(1, -1);
+ -moz-transform: scale(1, -1);
+ -ms-transform: scale(1, -1);
+ -o-transform: scale(1, -1);
+ transform: scale(1, -1);
+}
+/* ensure rotation occurs inside anchor tags */
+a .icon-rotate-90:before,
+a .icon-rotate-180:before,
+a .icon-rotate-270:before,
+a .icon-flip-horizontal:before,
+a .icon-flip-vertical:before {
+ display: inline-block;
+}
+/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
+ readers do not read off random characters that represent icons */
+.icon-glass:before {
+ content: "\f000";
+}
+.icon-music:before {
+ content: "\f001";
+}
+.icon-search:before {
+ content: "\f002";
+}
+.icon-envelope-alt:before {
+ content: "\f003";
+}
+.icon-heart:before {
+ content: "\f004";
+}
+.icon-star:before {
+ content: "\f005";
+}
+.icon-star-empty:before {
+ content: "\f006";
+}
+.icon-user:before {
+ content: "\f007";
+}
+.icon-film:before {
+ content: "\f008";
+}
+.icon-th-large:before {
+ content: "\f009";
+}
+.icon-th:before {
+ content: "\f00a";
+}
+.icon-th-list:before {
+ content: "\f00b";
+}
+.icon-ok:before {
+ content: "\f00c";
+}
+.icon-remove:before {
+ content: "\f00d";
+}
+.icon-zoom-in:before {
+ content: "\f00e";
+}
+.icon-zoom-out:before {
+ content: "\f010";
+}
+.icon-power-off:before,
+.icon-off:before {
+ content: "\f011";
+}
+.icon-signal:before {
+ content: "\f012";
+}
+.icon-gear:before,
+.icon-cog:before {
+ content: "\f013";
+}
+.icon-trash:before {
+ content: "\f014";
+}
+.icon-home:before {
+ content: "\f015";
+}
+.icon-file-alt:before {
+ content: "\f016";
+}
+.icon-time:before {
+ content: "\f017";
+}
+.icon-road:before {
+ content: "\f018";
+}
+.icon-download-alt:before {
+ content: "\f019";
+}
+.icon-download:before {
+ content: "\f01a";
+}
+.icon-upload:before {
+ content: "\f01b";
+}
+.icon-inbox:before {
+ content: "\f01c";
+}
+.icon-play-circle:before {
+ content: "\f01d";
+}
+.icon-rotate-right:before,
+.icon-repeat:before {
+ content: "\f01e";
+}
+.icon-refresh:before {
+ content: "\f021";
+}
+.icon-list-alt:before {
+ content: "\f022";
+}
+.icon-lock:before {
+ content: "\f023";
+}
+.icon-flag:before {
+ content: "\f024";
+}
+.icon-headphones:before {
+ content: "\f025";
+}
+.icon-volume-off:before {
+ content: "\f026";
+}
+.icon-volume-down:before {
+ content: "\f027";
+}
+.icon-volume-up:before {
+ content: "\f028";
+}
+.icon-qrcode:before {
+ content: "\f029";
+}
+.icon-barcode:before {
+ content: "\f02a";
+}
+.icon-tag:before {
+ content: "\f02b";
+}
+.icon-tags:before {
+ content: "\f02c";
+}
+.icon-book:before {
+ content: "\f02d";
+}
+.icon-bookmark:before {
+ content: "\f02e";
+}
+.icon-print:before {
+ content: "\f02f";
+}
+.icon-camera:before {
+ content: "\f030";
+}
+.icon-font:before {
+ content: "\f031";
+}
+.icon-bold:before {
+ content: "\f032";
+}
+.icon-italic:before {
+ content: "\f033";
+}
+.icon-text-height:before {
+ content: "\f034";
+}
+.icon-text-width:before {
+ content: "\f035";
+}
+.icon-align-left:before {
+ content: "\f036";
+}
+.icon-align-center:before {
+ content: "\f037";
+}
+.icon-align-right:before {
+ content: "\f038";
+}
+.icon-align-justify:before {
+ content: "\f039";
+}
+.icon-list:before {
+ content: "\f03a";
+}
+.icon-indent-left:before {
+ content: "\f03b";
+}
+.icon-indent-right:before {
+ content: "\f03c";
+}
+.icon-facetime-video:before {
+ content: "\f03d";
+}
+.icon-picture:before {
+ content: "\f03e";
+}
+.icon-pencil:before {
+ content: "\f040";
+}
+.icon-map-marker:before {
+ content: "\f041";
+}
+.icon-adjust:before {
+ content: "\f042";
+}
+.icon-tint:before {
+ content: "\f043";
+}
+.icon-edit:before {
+ content: "\f044";
+}
+.icon-share:before {
+ content: "\f045";
+}
+.icon-check:before {
+ content: "\f046";
+}
+.icon-move:before {
+ content: "\f047";
+}
+.icon-step-backward:before {
+ content: "\f048";
+}
+.icon-fast-backward:before {
+ content: "\f049";
+}
+.icon-backward:before {
+ content: "\f04a";
+}
+.icon-play:before {
+ content: "\f04b";
+}
+.icon-pause:before {
+ content: "\f04c";
+}
+.icon-stop:before {
+ content: "\f04d";
+}
+.icon-forward:before {
+ content: "\f04e";
+}
+.icon-fast-forward:before {
+ content: "\f050";
+}
+.icon-step-forward:before {
+ content: "\f051";
+}
+.icon-eject:before {
+ content: "\f052";
+}
+.icon-chevron-left:before {
+ content: "\f053";
+}
+.icon-chevron-right:before {
+ content: "\f054";
+}
+.icon-plus-sign:before {
+ content: "\f055";
+}
+.icon-minus-sign:before {
+ content: "\f056";
+}
+.icon-remove-sign:before {
+ content: "\f057";
+}
+.icon-ok-sign:before {
+ content: "\f058";
+}
+.icon-question-sign:before {
+ content: "\f059";
+}
+.icon-info-sign:before {
+ content: "\f05a";
+}
+.icon-screenshot:before {
+ content: "\f05b";
+}
+.icon-remove-circle:before {
+ content: "\f05c";
+}
+.icon-ok-circle:before {
+ content: "\f05d";
+}
+.icon-ban-circle:before {
+ content: "\f05e";
+}
+.icon-arrow-left:before {
+ content: "\f060";
+}
+.icon-arrow-right:before {
+ content: "\f061";
+}
+.icon-arrow-up:before {
+ content: "\f062";
+}
+.icon-arrow-down:before {
+ content: "\f063";
+}
+.icon-mail-forward:before,
+.icon-share-alt:before {
+ content: "\f064";
+}
+.icon-resize-full:before {
+ content: "\f065";
+}
+.icon-resize-small:before {
+ content: "\f066";
+}
+.icon-plus:before {
+ content: "\f067";
+}
+.icon-minus:before {
+ content: "\f068";
+}
+.icon-asterisk:before {
+ content: "\f069";
+}
+.icon-exclamation-sign:before {
+ content: "\f06a";
+}
+.icon-gift:before {
+ content: "\f06b";
+}
+.icon-leaf:before {
+ content: "\f06c";
+}
+.icon-fire:before {
+ content: "\f06d";
+}
+.icon-eye-open:before {
+ content: "\f06e";
+}
+.icon-eye-close:before {
+ content: "\f070";
+}
+.icon-warning-sign:before {
+ content: "\f071";
+}
+.icon-plane:before {
+ content: "\f072";
+}
+.icon-calendar:before {
+ content: "\f073";
+}
+.icon-random:before {
+ content: "\f074";
+}
+.icon-comment:before {
+ content: "\f075";
+}
+.icon-magnet:before {
+ content: "\f076";
+}
+.icon-chevron-up:before {
+ content: "\f077";
+}
+.icon-chevron-down:before {
+ content: "\f078";
+}
+.icon-retweet:before {
+ content: "\f079";
+}
+.icon-shopping-cart:before {
+ content: "\f07a";
+}
+.icon-folder-close:before {
+ content: "\f07b";
+}
+.icon-folder-open:before {
+ content: "\f07c";
+}
+.icon-resize-vertical:before {
+ content: "\f07d";
+}
+.icon-resize-horizontal:before {
+ content: "\f07e";
+}
+.icon-bar-chart:before {
+ content: "\f080";
+}
+.icon-twitter-sign:before {
+ content: "\f081";
+}
+.icon-facebook-sign:before {
+ content: "\f082";
+}
+.icon-camera-retro:before {
+ content: "\f083";
+}
+.icon-key:before {
+ content: "\f084";
+}
+.icon-gears:before,
+.icon-cogs:before {
+ content: "\f085";
+}
+.icon-comments:before {
+ content: "\f086";
+}
+.icon-thumbs-up-alt:before {
+ content: "\f087";
+}
+.icon-thumbs-down-alt:before {
+ content: "\f088";
+}
+.icon-star-half:before {
+ content: "\f089";
+}
+.icon-heart-empty:before {
+ content: "\f08a";
+}
+.icon-signout:before {
+ content: "\f08b";
+}
+.icon-linkedin-sign:before {
+ content: "\f08c";
+}
+.icon-pushpin:before {
+ content: "\f08d";
+}
+.icon-external-link:before {
+ content: "\f08e";
+}
+.icon-signin:before {
+ content: "\f090";
+}
+.icon-trophy:before {
+ content: "\f091";
+}
+.icon-github-sign:before {
+ content: "\f092";
+}
+.icon-upload-alt:before {
+ content: "\f093";
+}
+.icon-lemon:before {
+ content: "\f094";
+}
+.icon-phone:before {
+ content: "\f095";
+}
+.icon-unchecked:before,
+.icon-check-empty:before {
+ content: "\f096";
+}
+.icon-bookmark-empty:before {
+ content: "\f097";
+}
+.icon-phone-sign:before {
+ content: "\f098";
+}
+.icon-twitter:before {
+ content: "\f099";
+}
+.icon-facebook:before {
+ content: "\f09a";
+}
+.icon-github:before {
+ content: "\f09b";
+}
+.icon-unlock:before {
+ content: "\f09c";
+}
+.icon-credit-card:before {
+ content: "\f09d";
+}
+.icon-rss:before {
+ content: "\f09e";
+}
+.icon-hdd:before {
+ content: "\f0a0";
+}
+.icon-bullhorn:before {
+ content: "\f0a1";
+}
+.icon-bell:before {
+ content: "\f0a2";
+}
+.icon-certificate:before {
+ content: "\f0a3";
+}
+.icon-hand-right:before {
+ content: "\f0a4";
+}
+.icon-hand-left:before {
+ content: "\f0a5";
+}
+.icon-hand-up:before {
+ content: "\f0a6";
+}
+.icon-hand-down:before {
+ content: "\f0a7";
+}
+.icon-circle-arrow-left:before {
+ content: "\f0a8";
+}
+.icon-circle-arrow-right:before {
+ content: "\f0a9";
+}
+.icon-circle-arrow-up:before {
+ content: "\f0aa";
+}
+.icon-circle-arrow-down:before {
+ content: "\f0ab";
+}
+.icon-globe:before {
+ content: "\f0ac";
+}
+.icon-wrench:before {
+ content: "\f0ad";
+}
+.icon-tasks:before {
+ content: "\f0ae";
+}
+.icon-filter:before {
+ content: "\f0b0";
+}
+.icon-briefcase:before {
+ content: "\f0b1";
+}
+.icon-fullscreen:before {
+ content: "\f0b2";
+}
+.icon-group:before {
+ content: "\f0c0";
+}
+.icon-link:before {
+ content: "\f0c1";
+}
+.icon-cloud:before {
+ content: "\f0c2";
+}
+.icon-beaker:before {
+ content: "\f0c3";
+}
+.icon-cut:before {
+ content: "\f0c4";
+}
+.icon-copy:before {
+ content: "\f0c5";
+}
+.icon-paperclip:before,
+.icon-paper-clip:before {
+ content: "\f0c6";
+}
+.icon-save:before {
+ content: "\f0c7";
+}
+.icon-sign-blank:before {
+ content: "\f0c8";
+}
+.icon-reorder:before {
+ content: "\f0c9";
+}
+.icon-list-ul:before {
+ content: "\f0ca";
+}
+.icon-list-ol:before {
+ content: "\f0cb";
+}
+.icon-strikethrough:before {
+ content: "\f0cc";
+}
+.icon-underline:before {
+ content: "\f0cd";
+}
+.icon-table:before {
+ content: "\f0ce";
+}
+.icon-magic:before {
+ content: "\f0d0";
+}
+.icon-truck:before {
+ content: "\f0d1";
+}
+.icon-pinterest:before {
+ content: "\f0d2";
+}
+.icon-pinterest-sign:before {
+ content: "\f0d3";
+}
+.icon-google-plus-sign:before {
+ content: "\f0d4";
+}
+.icon-google-plus:before {
+ content: "\f0d5";
+}
+.icon-money:before {
+ content: "\f0d6";
+}
+.icon-caret-down:before {
+ content: "\f0d7";
+}
+.icon-caret-up:before {
+ content: "\f0d8";
+}
+.icon-caret-left:before {
+ content: "\f0d9";
+}
+.icon-caret-right:before {
+ content: "\f0da";
+}
+.icon-columns:before {
+ content: "\f0db";
+}
+.icon-sort:before {
+ content: "\f0dc";
+}
+.icon-sort-down:before {
+ content: "\f0dd";
+}
+.icon-sort-up:before {
+ content: "\f0de";
+}
+.icon-envelope:before {
+ content: "\f0e0";
+}
+.icon-linkedin:before {
+ content: "\f0e1";
+}
+.icon-rotate-left:before,
+.icon-undo:before {
+ content: "\f0e2";
+}
+.icon-legal:before {
+ content: "\f0e3";
+}
+.icon-dashboard:before {
+ content: "\f0e4";
+}
+.icon-comment-alt:before {
+ content: "\f0e5";
+}
+.icon-comments-alt:before {
+ content: "\f0e6";
+}
+.icon-bolt:before {
+ content: "\f0e7";
+}
+.icon-sitemap:before {
+ content: "\f0e8";
+}
+.icon-umbrella:before {
+ content: "\f0e9";
+}
+.icon-paste:before {
+ content: "\f0ea";
+}
+.icon-lightbulb:before {
+ content: "\f0eb";
+}
+.icon-exchange:before {
+ content: "\f0ec";
+}
+.icon-cloud-download:before {
+ content: "\f0ed";
+}
+.icon-cloud-upload:before {
+ content: "\f0ee";
+}
+.icon-user-md:before {
+ content: "\f0f0";
+}
+.icon-stethoscope:before {
+ content: "\f0f1";
+}
+.icon-suitcase:before {
+ content: "\f0f2";
+}
+.icon-bell-alt:before {
+ content: "\f0f3";
+}
+.icon-coffee:before {
+ content: "\f0f4";
+}
+.icon-food:before {
+ content: "\f0f5";
+}
+.icon-file-text-alt:before {
+ content: "\f0f6";
+}
+.icon-building:before {
+ content: "\f0f7";
+}
+.icon-hospital:before {
+ content: "\f0f8";
+}
+.icon-ambulance:before {
+ content: "\f0f9";
+}
+.icon-medkit:before {
+ content: "\f0fa";
+}
+.icon-fighter-jet:before {
+ content: "\f0fb";
+}
+.icon-beer:before {
+ content: "\f0fc";
+}
+.icon-h-sign:before {
+ content: "\f0fd";
+}
+.icon-plus-sign-alt:before {
+ content: "\f0fe";
+}
+.icon-double-angle-left:before {
+ content: "\f100";
+}
+.icon-double-angle-right:before {
+ content: "\f101";
+}
+.icon-double-angle-up:before {
+ content: "\f102";
+}
+.icon-double-angle-down:before {
+ content: "\f103";
+}
+.icon-angle-left:before {
+ content: "\f104";
+}
+.icon-angle-right:before {
+ content: "\f105";
+}
+.icon-angle-up:before {
+ content: "\f106";
+}
+.icon-angle-down:before {
+ content: "\f107";
+}
+.icon-desktop:before {
+ content: "\f108";
+}
+.icon-laptop:before {
+ content: "\f109";
+}
+.icon-tablet:before {
+ content: "\f10a";
+}
+.icon-mobile-phone:before {
+ content: "\f10b";
+}
+.icon-circle-blank:before {
+ content: "\f10c";
+}
+.icon-quote-left:before {
+ content: "\f10d";
+}
+.icon-quote-right:before {
+ content: "\f10e";
+}
+.icon-spinner:before {
+ content: "\f110";
+}
+.icon-circle:before {
+ content: "\f111";
+}
+.icon-mail-reply:before,
+.icon-reply:before {
+ content: "\f112";
+}
+.icon-github-alt:before {
+ content: "\f113";
+}
+.icon-folder-close-alt:before {
+ content: "\f114";
+}
+.icon-folder-open-alt:before {
+ content: "\f115";
+}
+.icon-expand-alt:before {
+ content: "\f116";
+}
+.icon-collapse-alt:before {
+ content: "\f117";
+}
+.icon-smile:before {
+ content: "\f118";
+}
+.icon-frown:before {
+ content: "\f119";
+}
+.icon-meh:before {
+ content: "\f11a";
+}
+.icon-gamepad:before {
+ content: "\f11b";
+}
+.icon-keyboard:before {
+ content: "\f11c";
+}
+.icon-flag-alt:before {
+ content: "\f11d";
+}
+.icon-flag-checkered:before {
+ content: "\f11e";
+}
+.icon-terminal:before {
+ content: "\f120";
+}
+.icon-code:before {
+ content: "\f121";
+}
+.icon-reply-all:before {
+ content: "\f122";
+}
+.icon-mail-reply-all:before {
+ content: "\f122";
+}
+.icon-star-half-full:before,
+.icon-star-half-empty:before {
+ content: "\f123";
+}
+.icon-location-arrow:before {
+ content: "\f124";
+}
+.icon-crop:before {
+ content: "\f125";
+}
+.icon-code-fork:before {
+ content: "\f126";
+}
+.icon-unlink:before {
+ content: "\f127";
+}
+.icon-question:before {
+ content: "\f128";
+}
+.icon-info:before {
+ content: "\f129";
+}
+.icon-exclamation:before {
+ content: "\f12a";
+}
+.icon-superscript:before {
+ content: "\f12b";
+}
+.icon-subscript:before {
+ content: "\f12c";
+}
+.icon-eraser:before {
+ content: "\f12d";
+}
+.icon-puzzle-piece:before {
+ content: "\f12e";
+}
+.icon-microphone:before {
+ content: "\f130";
+}
+.icon-microphone-off:before {
+ content: "\f131";
+}
+.icon-shield:before {
+ content: "\f132";
+}
+.icon-calendar-empty:before {
+ content: "\f133";
+}
+.icon-fire-extinguisher:before {
+ content: "\f134";
+}
+.icon-rocket:before {
+ content: "\f135";
+}
+.icon-maxcdn:before {
+ content: "\f136";
+}
+.icon-chevron-sign-left:before {
+ content: "\f137";
+}
+.icon-chevron-sign-right:before {
+ content: "\f138";
+}
+.icon-chevron-sign-up:before {
+ content: "\f139";
+}
+.icon-chevron-sign-down:before {
+ content: "\f13a";
+}
+.icon-html5:before {
+ content: "\f13b";
+}
+.icon-css3:before {
+ content: "\f13c";
+}
+.icon-anchor:before {
+ content: "\f13d";
+}
+.icon-unlock-alt:before {
+ content: "\f13e";
+}
+.icon-bullseye:before {
+ content: "\f140";
+}
+.icon-ellipsis-horizontal:before {
+ content: "\f141";
+}
+.icon-ellipsis-vertical:before {
+ content: "\f142";
+}
+.icon-rss-sign:before {
+ content: "\f143";
+}
+.icon-play-sign:before {
+ content: "\f144";
+}
+.icon-ticket:before {
+ content: "\f145";
+}
+.icon-minus-sign-alt:before {
+ content: "\f146";
+}
+.icon-check-minus:before {
+ content: "\f147";
+}
+.icon-level-up:before {
+ content: "\f148";
+}
+.icon-level-down:before {
+ content: "\f149";
+}
+.icon-check-sign:before {
+ content: "\f14a";
+}
+.icon-edit-sign:before {
+ content: "\f14b";
+}
+.icon-external-link-sign:before {
+ content: "\f14c";
+}
+.icon-share-sign:before {
+ content: "\f14d";
+}
+.icon-compass:before {
+ content: "\f14e";
+}
+.icon-collapse:before {
+ content: "\f150";
+}
+.icon-collapse-top:before {
+ content: "\f151";
+}
+.icon-expand:before {
+ content: "\f152";
+}
+.icon-euro:before,
+.icon-eur:before {
+ content: "\f153";
+}
+.icon-gbp:before {
+ content: "\f154";
+}
+.icon-dollar:before,
+.icon-usd:before {
+ content: "\f155";
+}
+.icon-rupee:before,
+.icon-inr:before {
+ content: "\f156";
+}
+.icon-yen:before,
+.icon-jpy:before {
+ content: "\f157";
+}
+.icon-renminbi:before,
+.icon-cny:before {
+ content: "\f158";
+}
+.icon-won:before,
+.icon-krw:before {
+ content: "\f159";
+}
+.icon-bitcoin:before,
+.icon-btc:before {
+ content: "\f15a";
+}
+.icon-file:before {
+ content: "\f15b";
+}
+.icon-file-text:before {
+ content: "\f15c";
+}
+.icon-sort-by-alphabet:before {
+ content: "\f15d";
+}
+.icon-sort-by-alphabet-alt:before {
+ content: "\f15e";
+}
+.icon-sort-by-attributes:before {
+ content: "\f160";
+}
+.icon-sort-by-attributes-alt:before {
+ content: "\f161";
+}
+.icon-sort-by-order:before {
+ content: "\f162";
+}
+.icon-sort-by-order-alt:before {
+ content: "\f163";
+}
+.icon-thumbs-up:before {
+ content: "\f164";
+}
+.icon-thumbs-down:before {
+ content: "\f165";
+}
+.icon-youtube-sign:before {
+ content: "\f166";
+}
+.icon-youtube:before {
+ content: "\f167";
+}
+.icon-xing:before {
+ content: "\f168";
+}
+.icon-xing-sign:before {
+ content: "\f169";
+}
+.icon-youtube-play:before {
+ content: "\f16a";
+}
+.icon-dropbox:before {
+ content: "\f16b";
+}
+.icon-stackexchange:before {
+ content: "\f16c";
+}
+.icon-instagram:before {
+ content: "\f16d";
+}
+.icon-flickr:before {
+ content: "\f16e";
+}
+.icon-adn:before {
+ content: "\f170";
+}
+.icon-bitbucket:before {
+ content: "\f171";
+}
+.icon-bitbucket-sign:before {
+ content: "\f172";
+}
+.icon-tumblr:before {
+ content: "\f173";
+}
+.icon-tumblr-sign:before {
+ content: "\f174";
+}
+.icon-long-arrow-down:before {
+ content: "\f175";
+}
+.icon-long-arrow-up:before {
+ content: "\f176";
+}
+.icon-long-arrow-left:before {
+ content: "\f177";
+}
+.icon-long-arrow-right:before {
+ content: "\f178";
+}
+.icon-apple:before {
+ content: "\f179";
+}
+.icon-windows:before {
+ content: "\f17a";
+}
+.icon-android:before {
+ content: "\f17b";
+}
+.icon-linux:before {
+ content: "\f17c";
+}
+.icon-dribbble:before {
+ content: "\f17d";
+}
+.icon-skype:before {
+ content: "\f17e";
+}
+.icon-foursquare:before {
+ content: "\f180";
+}
+.icon-trello:before {
+ content: "\f181";
+}
+.icon-female:before {
+ content: "\f182";
+}
+.icon-male:before {
+ content: "\f183";
+}
+.icon-gittip:before {
+ content: "\f184";
+}
+.icon-sun:before {
+ content: "\f185";
+}
+.icon-moon:before {
+ content: "\f186";
+}
+.icon-archive:before {
+ content: "\f187";
+}
+.icon-bug:before {
+ content: "\f188";
+}
+.icon-vk:before {
+ content: "\f189";
+}
+.icon-weibo:before {
+ content: "\f18a";
+}
+.icon-renren:before {
+ content: "\f18b";
+}
diff --git a/library/font_awesome/css/font-awesome.min.css b/library/font_awesome/css/font-awesome.min.css
new file mode 100644
index 000000000..866437fa4
--- /dev/null
+++ b/library/font_awesome/css/font-awesome.min.css
@@ -0,0 +1,403 @@
+@font-face{font-family:'FontAwesome';src:url('../font/fontawesome-webfont.eot?v=3.2.1');src:url('../font/fontawesome-webfont.eot?#iefix&v=3.2.1') format('embedded-opentype'),url('../font/fontawesome-webfont.woff?v=3.2.1') format('woff'),url('../font/fontawesome-webfont.ttf?v=3.2.1') format('truetype'),url('../font/fontawesome-webfont.svg#fontawesomeregular?v=3.2.1') format('svg');font-weight:normal;font-style:normal;}[class^="icon-"],[class*=" icon-"]{font-family:FontAwesome;font-weight:normal;font-style:normal;text-decoration:inherit;-webkit-font-smoothing:antialiased;*margin-right:.3em;}
+[class^="icon-"]:before,[class*=" icon-"]:before{text-decoration:inherit;display:inline-block;speak:none;}
+.icon-large:before{vertical-align:-10%;font-size:1.3333333333333333em;}
+a [class^="icon-"],a [class*=" icon-"]{display:inline;}
+[class^="icon-"].icon-fixed-width,[class*=" icon-"].icon-fixed-width{display:inline-block;width:1.1428571428571428em;text-align:right;padding-right:0.2857142857142857em;}[class^="icon-"].icon-fixed-width.icon-large,[class*=" icon-"].icon-fixed-width.icon-large{width:1.4285714285714286em;}
+.icons-ul{margin-left:2.142857142857143em;list-style-type:none;}.icons-ul>li{position:relative;}
+.icons-ul .icon-li{position:absolute;left:-2.142857142857143em;width:2.142857142857143em;text-align:center;line-height:inherit;}
+[class^="icon-"].hide,[class*=" icon-"].hide{display:none;}
+.icon-muted{color:#eeeeee;}
+.icon-light{color:#ffffff;}
+.icon-dark{color:#333333;}
+.icon-border{border:solid 1px #eeeeee;padding:.2em .25em .15em;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}
+.icon-2x{font-size:2em;}.icon-2x.icon-border{border-width:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}
+.icon-3x{font-size:3em;}.icon-3x.icon-border{border-width:3px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;}
+.icon-4x{font-size:4em;}.icon-4x.icon-border{border-width:4px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}
+.icon-5x{font-size:5em;}.icon-5x.icon-border{border-width:5px;-webkit-border-radius:7px;-moz-border-radius:7px;border-radius:7px;}
+.pull-right{float:right;}
+.pull-left{float:left;}
+[class^="icon-"].pull-left,[class*=" icon-"].pull-left{margin-right:.3em;}
+[class^="icon-"].pull-right,[class*=" icon-"].pull-right{margin-left:.3em;}
+[class^="icon-"],[class*=" icon-"]{display:inline;width:auto;height:auto;line-height:normal;vertical-align:baseline;background-image:none;background-position:0% 0%;background-repeat:repeat;margin-top:0;}
+.icon-white,.nav-pills>.active>a>[class^="icon-"],.nav-pills>.active>a>[class*=" icon-"],.nav-list>.active>a>[class^="icon-"],.nav-list>.active>a>[class*=" icon-"],.navbar-inverse .nav>.active>a>[class^="icon-"],.navbar-inverse .nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"],.dropdown-submenu:hover>a>[class^="icon-"],.dropdown-submenu:hover>a>[class*=" icon-"]{background-image:none;}
+.btn [class^="icon-"].icon-large,.nav [class^="icon-"].icon-large,.btn [class*=" icon-"].icon-large,.nav [class*=" icon-"].icon-large{line-height:.9em;}
+.btn [class^="icon-"].icon-spin,.nav [class^="icon-"].icon-spin,.btn [class*=" icon-"].icon-spin,.nav [class*=" icon-"].icon-spin{display:inline-block;}
+.nav-tabs [class^="icon-"],.nav-pills [class^="icon-"],.nav-tabs [class*=" icon-"],.nav-pills [class*=" icon-"],.nav-tabs [class^="icon-"].icon-large,.nav-pills [class^="icon-"].icon-large,.nav-tabs [class*=" icon-"].icon-large,.nav-pills [class*=" icon-"].icon-large{line-height:.9em;}
+.btn [class^="icon-"].pull-left.icon-2x,.btn [class*=" icon-"].pull-left.icon-2x,.btn [class^="icon-"].pull-right.icon-2x,.btn [class*=" icon-"].pull-right.icon-2x{margin-top:.18em;}
+.btn [class^="icon-"].icon-spin.icon-large,.btn [class*=" icon-"].icon-spin.icon-large{line-height:.8em;}
+.btn.btn-small [class^="icon-"].pull-left.icon-2x,.btn.btn-small [class*=" icon-"].pull-left.icon-2x,.btn.btn-small [class^="icon-"].pull-right.icon-2x,.btn.btn-small [class*=" icon-"].pull-right.icon-2x{margin-top:.25em;}
+.btn.btn-large [class^="icon-"],.btn.btn-large [class*=" icon-"]{margin-top:0;}.btn.btn-large [class^="icon-"].pull-left.icon-2x,.btn.btn-large [class*=" icon-"].pull-left.icon-2x,.btn.btn-large [class^="icon-"].pull-right.icon-2x,.btn.btn-large [class*=" icon-"].pull-right.icon-2x{margin-top:.05em;}
+.btn.btn-large [class^="icon-"].pull-left.icon-2x,.btn.btn-large [class*=" icon-"].pull-left.icon-2x{margin-right:.2em;}
+.btn.btn-large [class^="icon-"].pull-right.icon-2x,.btn.btn-large [class*=" icon-"].pull-right.icon-2x{margin-left:.2em;}
+.nav-list [class^="icon-"],.nav-list [class*=" icon-"]{line-height:inherit;}
+.icon-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:-35%;}.icon-stack [class^="icon-"],.icon-stack [class*=" icon-"]{display:block;text-align:center;position:absolute;width:100%;height:100%;font-size:1em;line-height:inherit;*line-height:2em;}
+.icon-stack .icon-stack-base{font-size:2em;*line-height:1em;}
+.icon-spin{display:inline-block;-moz-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;-webkit-animation:spin 2s infinite linear;animation:spin 2s infinite linear;}
+a .icon-stack,a .icon-spin{display:inline-block;text-decoration:none;}
+@-moz-keyframes spin{0%{-moz-transform:rotate(0deg);} 100%{-moz-transform:rotate(359deg);}}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg);} 100%{-webkit-transform:rotate(359deg);}}@-o-keyframes spin{0%{-o-transform:rotate(0deg);} 100%{-o-transform:rotate(359deg);}}@-ms-keyframes spin{0%{-ms-transform:rotate(0deg);} 100%{-ms-transform:rotate(359deg);}}@keyframes spin{0%{transform:rotate(0deg);} 100%{transform:rotate(359deg);}}.icon-rotate-90:before{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg);filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);}
+.icon-rotate-180:before{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg);filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);}
+.icon-rotate-270:before{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg);filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);}
+.icon-flip-horizontal:before{-webkit-transform:scale(-1, 1);-moz-transform:scale(-1, 1);-ms-transform:scale(-1, 1);-o-transform:scale(-1, 1);transform:scale(-1, 1);}
+.icon-flip-vertical:before{-webkit-transform:scale(1, -1);-moz-transform:scale(1, -1);-ms-transform:scale(1, -1);-o-transform:scale(1, -1);transform:scale(1, -1);}
+a .icon-rotate-90:before,a .icon-rotate-180:before,a .icon-rotate-270:before,a .icon-flip-horizontal:before,a .icon-flip-vertical:before{display:inline-block;}
+.icon-glass:before{content:"\f000";}
+.icon-music:before{content:"\f001";}
+.icon-search:before{content:"\f002";}
+.icon-envelope-alt:before{content:"\f003";}
+.icon-heart:before{content:"\f004";}
+.icon-star:before{content:"\f005";}
+.icon-star-empty:before{content:"\f006";}
+.icon-user:before{content:"\f007";}
+.icon-film:before{content:"\f008";}
+.icon-th-large:before{content:"\f009";}
+.icon-th:before{content:"\f00a";}
+.icon-th-list:before{content:"\f00b";}
+.icon-ok:before{content:"\f00c";}
+.icon-remove:before{content:"\f00d";}
+.icon-zoom-in:before{content:"\f00e";}
+.icon-zoom-out:before{content:"\f010";}
+.icon-power-off:before,.icon-off:before{content:"\f011";}
+.icon-signal:before{content:"\f012";}
+.icon-gear:before,.icon-cog:before{content:"\f013";}
+.icon-trash:before{content:"\f014";}
+.icon-home:before{content:"\f015";}
+.icon-file-alt:before{content:"\f016";}
+.icon-time:before{content:"\f017";}
+.icon-road:before{content:"\f018";}
+.icon-download-alt:before{content:"\f019";}
+.icon-download:before{content:"\f01a";}
+.icon-upload:before{content:"\f01b";}
+.icon-inbox:before{content:"\f01c";}
+.icon-play-circle:before{content:"\f01d";}
+.icon-rotate-right:before,.icon-repeat:before{content:"\f01e";}
+.icon-refresh:before{content:"\f021";}
+.icon-list-alt:before{content:"\f022";}
+.icon-lock:before{content:"\f023";}
+.icon-flag:before{content:"\f024";}
+.icon-headphones:before{content:"\f025";}
+.icon-volume-off:before{content:"\f026";}
+.icon-volume-down:before{content:"\f027";}
+.icon-volume-up:before{content:"\f028";}
+.icon-qrcode:before{content:"\f029";}
+.icon-barcode:before{content:"\f02a";}
+.icon-tag:before{content:"\f02b";}
+.icon-tags:before{content:"\f02c";}
+.icon-book:before{content:"\f02d";}
+.icon-bookmark:before{content:"\f02e";}
+.icon-print:before{content:"\f02f";}
+.icon-camera:before{content:"\f030";}
+.icon-font:before{content:"\f031";}
+.icon-bold:before{content:"\f032";}
+.icon-italic:before{content:"\f033";}
+.icon-text-height:before{content:"\f034";}
+.icon-text-width:before{content:"\f035";}
+.icon-align-left:before{content:"\f036";}
+.icon-align-center:before{content:"\f037";}
+.icon-align-right:before{content:"\f038";}
+.icon-align-justify:before{content:"\f039";}
+.icon-list:before{content:"\f03a";}
+.icon-indent-left:before{content:"\f03b";}
+.icon-indent-right:before{content:"\f03c";}
+.icon-facetime-video:before{content:"\f03d";}
+.icon-picture:before{content:"\f03e";}
+.icon-pencil:before{content:"\f040";}
+.icon-map-marker:before{content:"\f041";}
+.icon-adjust:before{content:"\f042";}
+.icon-tint:before{content:"\f043";}
+.icon-edit:before{content:"\f044";}
+.icon-share:before{content:"\f045";}
+.icon-check:before{content:"\f046";}
+.icon-move:before{content:"\f047";}
+.icon-step-backward:before{content:"\f048";}
+.icon-fast-backward:before{content:"\f049";}
+.icon-backward:before{content:"\f04a";}
+.icon-play:before{content:"\f04b";}
+.icon-pause:before{content:"\f04c";}
+.icon-stop:before{content:"\f04d";}
+.icon-forward:before{content:"\f04e";}
+.icon-fast-forward:before{content:"\f050";}
+.icon-step-forward:before{content:"\f051";}
+.icon-eject:before{content:"\f052";}
+.icon-chevron-left:before{content:"\f053";}
+.icon-chevron-right:before{content:"\f054";}
+.icon-plus-sign:before{content:"\f055";}
+.icon-minus-sign:before{content:"\f056";}
+.icon-remove-sign:before{content:"\f057";}
+.icon-ok-sign:before{content:"\f058";}
+.icon-question-sign:before{content:"\f059";}
+.icon-info-sign:before{content:"\f05a";}
+.icon-screenshot:before{content:"\f05b";}
+.icon-remove-circle:before{content:"\f05c";}
+.icon-ok-circle:before{content:"\f05d";}
+.icon-ban-circle:before{content:"\f05e";}
+.icon-arrow-left:before{content:"\f060";}
+.icon-arrow-right:before{content:"\f061";}
+.icon-arrow-up:before{content:"\f062";}
+.icon-arrow-down:before{content:"\f063";}
+.icon-mail-forward:before,.icon-share-alt:before{content:"\f064";}
+.icon-resize-full:before{content:"\f065";}
+.icon-resize-small:before{content:"\f066";}
+.icon-plus:before{content:"\f067";}
+.icon-minus:before{content:"\f068";}
+.icon-asterisk:before{content:"\f069";}
+.icon-exclamation-sign:before{content:"\f06a";}
+.icon-gift:before{content:"\f06b";}
+.icon-leaf:before{content:"\f06c";}
+.icon-fire:before{content:"\f06d";}
+.icon-eye-open:before{content:"\f06e";}
+.icon-eye-close:before{content:"\f070";}
+.icon-warning-sign:before{content:"\f071";}
+.icon-plane:before{content:"\f072";}
+.icon-calendar:before{content:"\f073";}
+.icon-random:before{content:"\f074";}
+.icon-comment:before{content:"\f075";}
+.icon-magnet:before{content:"\f076";}
+.icon-chevron-up:before{content:"\f077";}
+.icon-chevron-down:before{content:"\f078";}
+.icon-retweet:before{content:"\f079";}
+.icon-shopping-cart:before{content:"\f07a";}
+.icon-folder-close:before{content:"\f07b";}
+.icon-folder-open:before{content:"\f07c";}
+.icon-resize-vertical:before{content:"\f07d";}
+.icon-resize-horizontal:before{content:"\f07e";}
+.icon-bar-chart:before{content:"\f080";}
+.icon-twitter-sign:before{content:"\f081";}
+.icon-facebook-sign:before{content:"\f082";}
+.icon-camera-retro:before{content:"\f083";}
+.icon-key:before{content:"\f084";}
+.icon-gears:before,.icon-cogs:before{content:"\f085";}
+.icon-comments:before{content:"\f086";}
+.icon-thumbs-up-alt:before{content:"\f087";}
+.icon-thumbs-down-alt:before{content:"\f088";}
+.icon-star-half:before{content:"\f089";}
+.icon-heart-empty:before{content:"\f08a";}
+.icon-signout:before{content:"\f08b";}
+.icon-linkedin-sign:before{content:"\f08c";}
+.icon-pushpin:before{content:"\f08d";}
+.icon-external-link:before{content:"\f08e";}
+.icon-signin:before{content:"\f090";}
+.icon-trophy:before{content:"\f091";}
+.icon-github-sign:before{content:"\f092";}
+.icon-upload-alt:before{content:"\f093";}
+.icon-lemon:before{content:"\f094";}
+.icon-phone:before{content:"\f095";}
+.icon-unchecked:before,.icon-check-empty:before{content:"\f096";}
+.icon-bookmark-empty:before{content:"\f097";}
+.icon-phone-sign:before{content:"\f098";}
+.icon-twitter:before{content:"\f099";}
+.icon-facebook:before{content:"\f09a";}
+.icon-github:before{content:"\f09b";}
+.icon-unlock:before{content:"\f09c";}
+.icon-credit-card:before{content:"\f09d";}
+.icon-rss:before{content:"\f09e";}
+.icon-hdd:before{content:"\f0a0";}
+.icon-bullhorn:before{content:"\f0a1";}
+.icon-bell:before{content:"\f0a2";}
+.icon-certificate:before{content:"\f0a3";}
+.icon-hand-right:before{content:"\f0a4";}
+.icon-hand-left:before{content:"\f0a5";}
+.icon-hand-up:before{content:"\f0a6";}
+.icon-hand-down:before{content:"\f0a7";}
+.icon-circle-arrow-left:before{content:"\f0a8";}
+.icon-circle-arrow-right:before{content:"\f0a9";}
+.icon-circle-arrow-up:before{content:"\f0aa";}
+.icon-circle-arrow-down:before{content:"\f0ab";}
+.icon-globe:before{content:"\f0ac";}
+.icon-wrench:before{content:"\f0ad";}
+.icon-tasks:before{content:"\f0ae";}
+.icon-filter:before{content:"\f0b0";}
+.icon-briefcase:before{content:"\f0b1";}
+.icon-fullscreen:before{content:"\f0b2";}
+.icon-group:before{content:"\f0c0";}
+.icon-link:before{content:"\f0c1";}
+.icon-cloud:before{content:"\f0c2";}
+.icon-beaker:before{content:"\f0c3";}
+.icon-cut:before{content:"\f0c4";}
+.icon-copy:before{content:"\f0c5";}
+.icon-paperclip:before,.icon-paper-clip:before{content:"\f0c6";}
+.icon-save:before{content:"\f0c7";}
+.icon-sign-blank:before{content:"\f0c8";}
+.icon-reorder:before{content:"\f0c9";}
+.icon-list-ul:before{content:"\f0ca";}
+.icon-list-ol:before{content:"\f0cb";}
+.icon-strikethrough:before{content:"\f0cc";}
+.icon-underline:before{content:"\f0cd";}
+.icon-table:before{content:"\f0ce";}
+.icon-magic:before{content:"\f0d0";}
+.icon-truck:before{content:"\f0d1";}
+.icon-pinterest:before{content:"\f0d2";}
+.icon-pinterest-sign:before{content:"\f0d3";}
+.icon-google-plus-sign:before{content:"\f0d4";}
+.icon-google-plus:before{content:"\f0d5";}
+.icon-money:before{content:"\f0d6";}
+.icon-caret-down:before{content:"\f0d7";}
+.icon-caret-up:before{content:"\f0d8";}
+.icon-caret-left:before{content:"\f0d9";}
+.icon-caret-right:before{content:"\f0da";}
+.icon-columns:before{content:"\f0db";}
+.icon-sort:before{content:"\f0dc";}
+.icon-sort-down:before{content:"\f0dd";}
+.icon-sort-up:before{content:"\f0de";}
+.icon-envelope:before{content:"\f0e0";}
+.icon-linkedin:before{content:"\f0e1";}
+.icon-rotate-left:before,.icon-undo:before{content:"\f0e2";}
+.icon-legal:before{content:"\f0e3";}
+.icon-dashboard:before{content:"\f0e4";}
+.icon-comment-alt:before{content:"\f0e5";}
+.icon-comments-alt:before{content:"\f0e6";}
+.icon-bolt:before{content:"\f0e7";}
+.icon-sitemap:before{content:"\f0e8";}
+.icon-umbrella:before{content:"\f0e9";}
+.icon-paste:before{content:"\f0ea";}
+.icon-lightbulb:before{content:"\f0eb";}
+.icon-exchange:before{content:"\f0ec";}
+.icon-cloud-download:before{content:"\f0ed";}
+.icon-cloud-upload:before{content:"\f0ee";}
+.icon-user-md:before{content:"\f0f0";}
+.icon-stethoscope:before{content:"\f0f1";}
+.icon-suitcase:before{content:"\f0f2";}
+.icon-bell-alt:before{content:"\f0f3";}
+.icon-coffee:before{content:"\f0f4";}
+.icon-food:before{content:"\f0f5";}
+.icon-file-text-alt:before{content:"\f0f6";}
+.icon-building:before{content:"\f0f7";}
+.icon-hospital:before{content:"\f0f8";}
+.icon-ambulance:before{content:"\f0f9";}
+.icon-medkit:before{content:"\f0fa";}
+.icon-fighter-jet:before{content:"\f0fb";}
+.icon-beer:before{content:"\f0fc";}
+.icon-h-sign:before{content:"\f0fd";}
+.icon-plus-sign-alt:before{content:"\f0fe";}
+.icon-double-angle-left:before{content:"\f100";}
+.icon-double-angle-right:before{content:"\f101";}
+.icon-double-angle-up:before{content:"\f102";}
+.icon-double-angle-down:before{content:"\f103";}
+.icon-angle-left:before{content:"\f104";}
+.icon-angle-right:before{content:"\f105";}
+.icon-angle-up:before{content:"\f106";}
+.icon-angle-down:before{content:"\f107";}
+.icon-desktop:before{content:"\f108";}
+.icon-laptop:before{content:"\f109";}
+.icon-tablet:before{content:"\f10a";}
+.icon-mobile-phone:before{content:"\f10b";}
+.icon-circle-blank:before{content:"\f10c";}
+.icon-quote-left:before{content:"\f10d";}
+.icon-quote-right:before{content:"\f10e";}
+.icon-spinner:before{content:"\f110";}
+.icon-circle:before{content:"\f111";}
+.icon-mail-reply:before,.icon-reply:before{content:"\f112";}
+.icon-github-alt:before{content:"\f113";}
+.icon-folder-close-alt:before{content:"\f114";}
+.icon-folder-open-alt:before{content:"\f115";}
+.icon-expand-alt:before{content:"\f116";}
+.icon-collapse-alt:before{content:"\f117";}
+.icon-smile:before{content:"\f118";}
+.icon-frown:before{content:"\f119";}
+.icon-meh:before{content:"\f11a";}
+.icon-gamepad:before{content:"\f11b";}
+.icon-keyboard:before{content:"\f11c";}
+.icon-flag-alt:before{content:"\f11d";}
+.icon-flag-checkered:before{content:"\f11e";}
+.icon-terminal:before{content:"\f120";}
+.icon-code:before{content:"\f121";}
+.icon-reply-all:before{content:"\f122";}
+.icon-mail-reply-all:before{content:"\f122";}
+.icon-star-half-full:before,.icon-star-half-empty:before{content:"\f123";}
+.icon-location-arrow:before{content:"\f124";}
+.icon-crop:before{content:"\f125";}
+.icon-code-fork:before{content:"\f126";}
+.icon-unlink:before{content:"\f127";}
+.icon-question:before{content:"\f128";}
+.icon-info:before{content:"\f129";}
+.icon-exclamation:before{content:"\f12a";}
+.icon-superscript:before{content:"\f12b";}
+.icon-subscript:before{content:"\f12c";}
+.icon-eraser:before{content:"\f12d";}
+.icon-puzzle-piece:before{content:"\f12e";}
+.icon-microphone:before{content:"\f130";}
+.icon-microphone-off:before{content:"\f131";}
+.icon-shield:before{content:"\f132";}
+.icon-calendar-empty:before{content:"\f133";}
+.icon-fire-extinguisher:before{content:"\f134";}
+.icon-rocket:before{content:"\f135";}
+.icon-maxcdn:before{content:"\f136";}
+.icon-chevron-sign-left:before{content:"\f137";}
+.icon-chevron-sign-right:before{content:"\f138";}
+.icon-chevron-sign-up:before{content:"\f139";}
+.icon-chevron-sign-down:before{content:"\f13a";}
+.icon-html5:before{content:"\f13b";}
+.icon-css3:before{content:"\f13c";}
+.icon-anchor:before{content:"\f13d";}
+.icon-unlock-alt:before{content:"\f13e";}
+.icon-bullseye:before{content:"\f140";}
+.icon-ellipsis-horizontal:before{content:"\f141";}
+.icon-ellipsis-vertical:before{content:"\f142";}
+.icon-rss-sign:before{content:"\f143";}
+.icon-play-sign:before{content:"\f144";}
+.icon-ticket:before{content:"\f145";}
+.icon-minus-sign-alt:before{content:"\f146";}
+.icon-check-minus:before{content:"\f147";}
+.icon-level-up:before{content:"\f148";}
+.icon-level-down:before{content:"\f149";}
+.icon-check-sign:before{content:"\f14a";}
+.icon-edit-sign:before{content:"\f14b";}
+.icon-external-link-sign:before{content:"\f14c";}
+.icon-share-sign:before{content:"\f14d";}
+.icon-compass:before{content:"\f14e";}
+.icon-collapse:before{content:"\f150";}
+.icon-collapse-top:before{content:"\f151";}
+.icon-expand:before{content:"\f152";}
+.icon-euro:before,.icon-eur:before{content:"\f153";}
+.icon-gbp:before{content:"\f154";}
+.icon-dollar:before,.icon-usd:before{content:"\f155";}
+.icon-rupee:before,.icon-inr:before{content:"\f156";}
+.icon-yen:before,.icon-jpy:before{content:"\f157";}
+.icon-renminbi:before,.icon-cny:before{content:"\f158";}
+.icon-won:before,.icon-krw:before{content:"\f159";}
+.icon-bitcoin:before,.icon-btc:before{content:"\f15a";}
+.icon-file:before{content:"\f15b";}
+.icon-file-text:before{content:"\f15c";}
+.icon-sort-by-alphabet:before{content:"\f15d";}
+.icon-sort-by-alphabet-alt:before{content:"\f15e";}
+.icon-sort-by-attributes:before{content:"\f160";}
+.icon-sort-by-attributes-alt:before{content:"\f161";}
+.icon-sort-by-order:before{content:"\f162";}
+.icon-sort-by-order-alt:before{content:"\f163";}
+.icon-thumbs-up:before{content:"\f164";}
+.icon-thumbs-down:before{content:"\f165";}
+.icon-youtube-sign:before{content:"\f166";}
+.icon-youtube:before{content:"\f167";}
+.icon-xing:before{content:"\f168";}
+.icon-xing-sign:before{content:"\f169";}
+.icon-youtube-play:before{content:"\f16a";}
+.icon-dropbox:before{content:"\f16b";}
+.icon-stackexchange:before{content:"\f16c";}
+.icon-instagram:before{content:"\f16d";}
+.icon-flickr:before{content:"\f16e";}
+.icon-adn:before{content:"\f170";}
+.icon-bitbucket:before{content:"\f171";}
+.icon-bitbucket-sign:before{content:"\f172";}
+.icon-tumblr:before{content:"\f173";}
+.icon-tumblr-sign:before{content:"\f174";}
+.icon-long-arrow-down:before{content:"\f175";}
+.icon-long-arrow-up:before{content:"\f176";}
+.icon-long-arrow-left:before{content:"\f177";}
+.icon-long-arrow-right:before{content:"\f178";}
+.icon-apple:before{content:"\f179";}
+.icon-windows:before{content:"\f17a";}
+.icon-android:before{content:"\f17b";}
+.icon-linux:before{content:"\f17c";}
+.icon-dribbble:before{content:"\f17d";}
+.icon-skype:before{content:"\f17e";}
+.icon-foursquare:before{content:"\f180";}
+.icon-trello:before{content:"\f181";}
+.icon-female:before{content:"\f182";}
+.icon-male:before{content:"\f183";}
+.icon-gittip:before{content:"\f184";}
+.icon-sun:before{content:"\f185";}
+.icon-moon:before{content:"\f186";}
+.icon-archive:before{content:"\f187";}
+.icon-bug:before{content:"\f188";}
+.icon-vk:before{content:"\f189";}
+.icon-weibo:before{content:"\f18a";}
+.icon-renren:before{content:"\f18b";}
diff --git a/library/font_awesome/font/FontAwesome.otf b/library/font_awesome/font/FontAwesome.otf
new file mode 100644
index 000000000..70125459f
--- /dev/null
+++ b/library/font_awesome/font/FontAwesome.otf
Binary files differ
diff --git a/library/font_awesome/font/fontawesome-webfont.eot b/library/font_awesome/font/fontawesome-webfont.eot
new file mode 100755
index 000000000..0662cb96b
--- /dev/null
+++ b/library/font_awesome/font/fontawesome-webfont.eot
Binary files differ
diff --git a/library/font_awesome/font/fontawesome-webfont.svg b/library/font_awesome/font/fontawesome-webfont.svg
new file mode 100755
index 000000000..2edb4ec34
--- /dev/null
+++ b/library/font_awesome/font/fontawesome-webfont.svg
@@ -0,0 +1,399 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
+<svg xmlns="http://www.w3.org/2000/svg">
+<metadata></metadata>
+<defs>
+<font id="fontawesomeregular" horiz-adv-x="1536" >
+<font-face units-per-em="1792" ascent="1536" descent="-256" />
+<missing-glyph horiz-adv-x="448" />
+<glyph unicode=" " horiz-adv-x="448" />
+<glyph unicode="&#x09;" horiz-adv-x="448" />
+<glyph unicode="&#xa0;" horiz-adv-x="448" />
+<glyph unicode="&#xa8;" horiz-adv-x="1792" />
+<glyph unicode="&#xa9;" horiz-adv-x="1792" />
+<glyph unicode="&#xae;" horiz-adv-x="1792" />
+<glyph unicode="&#xb4;" horiz-adv-x="1792" />
+<glyph unicode="&#xc6;" horiz-adv-x="1792" />
+<glyph unicode="&#x2000;" horiz-adv-x="768" />
+<glyph unicode="&#x2001;" />
+<glyph unicode="&#x2002;" horiz-adv-x="768" />
+<glyph unicode="&#x2003;" />
+<glyph unicode="&#x2004;" horiz-adv-x="512" />
+<glyph unicode="&#x2005;" horiz-adv-x="384" />
+<glyph unicode="&#x2006;" horiz-adv-x="256" />
+<glyph unicode="&#x2007;" horiz-adv-x="256" />
+<glyph unicode="&#x2008;" horiz-adv-x="192" />
+<glyph unicode="&#x2009;" horiz-adv-x="307" />
+<glyph unicode="&#x200a;" horiz-adv-x="85" />
+<glyph unicode="&#x202f;" horiz-adv-x="307" />
+<glyph unicode="&#x205f;" horiz-adv-x="384" />
+<glyph unicode="&#x2122;" horiz-adv-x="1792" />
+<glyph unicode="&#x221e;" horiz-adv-x="1792" />
+<glyph unicode="&#x2260;" horiz-adv-x="1792" />
+<glyph unicode="&#xe000;" horiz-adv-x="500" d="M0 0z" />
+<glyph unicode="&#xf000;" horiz-adv-x="1792" d="M1699 1350q0 -35 -43 -78l-632 -632v-768h320q26 0 45 -19t19 -45t-19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45t45 19h320v768l-632 632q-43 43 -43 78q0 23 18 36.5t38 17.5t43 4h1408q23 0 43 -4t38 -17.5t18 -36.5z" />
+<glyph unicode="&#xf001;" d="M1536 1312v-1120q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89t34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v537l-768 -237v-709q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89 t34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v967q0 31 19 56.5t49 35.5l832 256q12 4 28 4q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf002;" horiz-adv-x="1664" d="M1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1664 -128q0 -52 -38 -90t-90 -38q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5 t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z" />
+<glyph unicode="&#xf003;" horiz-adv-x="1792" d="M1664 32v768q-32 -36 -69 -66q-268 -206 -426 -338q-51 -43 -83 -67t-86.5 -48.5t-102.5 -24.5h-1h-1q-48 0 -102.5 24.5t-86.5 48.5t-83 67q-158 132 -426 338q-37 30 -69 66v-768q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1664 1083v11v13.5t-0.5 13 t-3 12.5t-5.5 9t-9 7.5t-14 2.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5q0 -168 147 -284q193 -152 401 -317q6 -5 35 -29.5t46 -37.5t44.5 -31.5t50.5 -27.5t43 -9h1h1q20 0 43 9t50.5 27.5t44.5 31.5t46 37.5t35 29.5q208 165 401 317q54 43 100.5 115.5t46.5 131.5z M1792 1120v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1472q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf004;" horiz-adv-x="1792" d="M896 -128q-26 0 -44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5q224 0 351 -124t127 -344q0 -221 -229 -450l-623 -600 q-18 -18 -44 -18z" />
+<glyph unicode="&#xf005;" horiz-adv-x="1664" d="M1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -21 -10.5 -35.5t-30.5 -14.5q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455 l502 -73q56 -9 56 -46z" />
+<glyph unicode="&#xf006;" horiz-adv-x="1664" d="M1137 532l306 297l-422 62l-189 382l-189 -382l-422 -62l306 -297l-73 -421l378 199l377 -199zM1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -50 -41 -50q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500 l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455l502 -73q56 -9 56 -46z" />
+<glyph unicode="&#xf007;" horiz-adv-x="1408" d="M1408 131q0 -120 -73 -189.5t-194 -69.5h-874q-121 0 -194 69.5t-73 189.5q0 53 3.5 103.5t14 109t26.5 108.5t43 97.5t62 81t85.5 53.5t111.5 20q9 0 42 -21.5t74.5 -48t108 -48t133.5 -21.5t133.5 21.5t108 48t74.5 48t42 21.5q61 0 111.5 -20t85.5 -53.5t62 -81 t43 -97.5t26.5 -108.5t14 -109t3.5 -103.5zM1088 1024q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5z" />
+<glyph unicode="&#xf008;" horiz-adv-x="1920" d="M384 -64v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM384 320v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM384 704v128q0 26 -19 45t-45 19h-128 q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1408 -64v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM384 1088v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45 t45 -19h128q26 0 45 19t19 45zM1792 -64v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1408 704v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM1792 320v128 q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1792 704v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1792 1088v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19 t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1920 1248v-1344q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1344q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf009;" horiz-adv-x="1664" d="M768 512v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM768 1280v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM1664 512v-384q0 -52 -38 -90t-90 -38 h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM1664 1280v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf00a;" horiz-adv-x="1792" d="M512 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 288v-192q0 -40 -28 -68t-68 -28h-320 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28 h320q40 0 68 -28t28 -68zM1792 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 800v-192 q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf00b;" horiz-adv-x="1792" d="M512 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 288v-192q0 -40 -28 -68t-68 -28h-960 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68zM512 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 800v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v192q0 40 28 68t68 28 h960q40 0 68 -28t28 -68zM1792 1312v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf00c;" horiz-adv-x="1792" d="M1671 970q0 -40 -28 -68l-724 -724l-136 -136q-28 -28 -68 -28t-68 28l-136 136l-362 362q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -295l656 657q28 28 68 28t68 -28l136 -136q28 -28 28 -68z" />
+<glyph unicode="&#xf00d;" horiz-adv-x="1408" d="M1298 214q0 -40 -28 -68l-136 -136q-28 -28 -68 -28t-68 28l-294 294l-294 -294q-28 -28 -68 -28t-68 28l-136 136q-28 28 -28 68t28 68l294 294l-294 294q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -294l294 294q28 28 68 28t68 -28l136 -136q28 -28 28 -68 t-28 -68l-294 -294l294 -294q28 -28 28 -68z" />
+<glyph unicode="&#xf00e;" horiz-adv-x="1664" d="M1024 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-224q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v224h-224q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h224v224q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-224h224 q13 0 22.5 -9.5t9.5 -22.5zM1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1664 -128q0 -53 -37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5 t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z" />
+<glyph unicode="&#xf010;" horiz-adv-x="1664" d="M1024 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-576q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h576q13 0 22.5 -9.5t9.5 -22.5zM1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5z M1664 -128q0 -53 -37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z " />
+<glyph unicode="&#xf011;" d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61t-298 61t-245 164t-164 245t-61 298q0 182 80.5 343t226.5 270q43 32 95.5 25t83.5 -50q32 -42 24.5 -94.5t-49.5 -84.5q-98 -74 -151.5 -181t-53.5 -228q0 -104 40.5 -198.5t109.5 -163.5t163.5 -109.5 t198.5 -40.5t198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5q0 121 -53.5 228t-151.5 181q-42 32 -49.5 84.5t24.5 94.5q31 43 84 50t95 -25q146 -109 226.5 -270t80.5 -343zM896 1408v-640q0 -52 -38 -90t-90 -38t-90 38t-38 90v640q0 52 38 90t90 38t90 -38t38 -90z" />
+<glyph unicode="&#xf012;" horiz-adv-x="1792" d="M256 96v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM640 224v-320q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v320q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1024 480v-576q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23 v576q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1408 864v-960q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v960q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 1376v-1472q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v1472q0 14 9 23t23 9h192q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf013;" d="M1024 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1536 749v-222q0 -12 -8 -23t-20 -13l-185 -28q-19 -54 -39 -91q35 -50 107 -138q10 -12 10 -25t-9 -23q-27 -37 -99 -108t-94 -71q-12 0 -26 9l-138 108q-44 -23 -91 -38 q-16 -136 -29 -186q-7 -28 -36 -28h-222q-14 0 -24.5 8.5t-11.5 21.5l-28 184q-49 16 -90 37l-141 -107q-10 -9 -25 -9q-14 0 -25 11q-126 114 -165 168q-7 10 -7 23q0 12 8 23q15 21 51 66.5t54 70.5q-27 50 -41 99l-183 27q-13 2 -21 12.5t-8 23.5v222q0 12 8 23t19 13 l186 28q14 46 39 92q-40 57 -107 138q-10 12 -10 24q0 10 9 23q26 36 98.5 107.5t94.5 71.5q13 0 26 -10l138 -107q44 23 91 38q16 136 29 186q7 28 36 28h222q14 0 24.5 -8.5t11.5 -21.5l28 -184q49 -16 90 -37l142 107q9 9 24 9q13 0 25 -10q129 -119 165 -170q7 -8 7 -22 q0 -12 -8 -23q-15 -21 -51 -66.5t-54 -70.5q26 -50 41 -98l183 -28q13 -2 21 -12.5t8 -23.5z" />
+<glyph unicode="&#xf014;" horiz-adv-x="1408" d="M512 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM768 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1024 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576 q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1152 76v948h-896v-948q0 -22 7 -40.5t14.5 -27t10.5 -8.5h832q3 0 10.5 8.5t14.5 27t7 40.5zM480 1152h448l-48 117q-7 9 -17 11h-317q-10 -2 -17 -11zM1408 1120v-64q0 -14 -9 -23t-23 -9h-96v-948q0 -83 -47 -143.5t-113 -60.5h-832 q-66 0 -113 58.5t-47 141.5v952h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h309l70 167q15 37 54 63t79 26h320q40 0 79 -26t54 -63l70 -167h309q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf015;" horiz-adv-x="1664" d="M1408 544v-480q0 -26 -19 -45t-45 -19h-384v384h-256v-384h-384q-26 0 -45 19t-19 45v480q0 1 0.5 3t0.5 3l575 474l575 -474q1 -2 1 -6zM1631 613l-62 -74q-8 -9 -21 -11h-3q-13 0 -21 7l-692 577l-692 -577q-12 -8 -24 -7q-13 2 -21 11l-62 74q-8 10 -7 23.5t11 21.5 l719 599q32 26 76 26t76 -26l244 -204v195q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-408l219 -182q10 -8 11 -21.5t-7 -23.5z" />
+<glyph unicode="&#xf016;" horiz-adv-x="1280" d="M128 0h1024v768h-416q-40 0 -68 28t-28 68v416h-512v-1280zM768 896h376q-10 29 -22 41l-313 313q-12 12 -41 22v-376zM1280 864v-896q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h640q40 0 88 -20t76 -48l312 -312q28 -28 48 -76t20 -88z " />
+<glyph unicode="&#xf017;" d="M896 992v-448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf018;" horiz-adv-x="1920" d="M1111 540v4l-24 320q-1 13 -11 22.5t-23 9.5h-186q-13 0 -23 -9.5t-11 -22.5l-24 -320v-4q-1 -12 8 -20t21 -8h244q12 0 21 8t8 20zM1870 73q0 -73 -46 -73h-704q13 0 22 9.5t8 22.5l-20 256q-1 13 -11 22.5t-23 9.5h-272q-13 0 -23 -9.5t-11 -22.5l-20 -256 q-1 -13 8 -22.5t22 -9.5h-704q-46 0 -46 73q0 54 26 116l417 1044q8 19 26 33t38 14h339q-13 0 -23 -9.5t-11 -22.5l-15 -192q-1 -14 8 -23t22 -9h166q13 0 22 9t8 23l-15 192q-1 13 -11 22.5t-23 9.5h339q20 0 38 -14t26 -33l417 -1044q26 -62 26 -116z" />
+<glyph unicode="&#xf019;" horiz-adv-x="1664" d="M1280 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 416v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h465l135 -136 q58 -56 136 -56t136 56l136 136h464q40 0 68 -28t28 -68zM1339 985q17 -41 -14 -70l-448 -448q-18 -19 -45 -19t-45 19l-448 448q-31 29 -14 70q17 39 59 39h256v448q0 26 19 45t45 19h256q26 0 45 -19t19 -45v-448h256q42 0 59 -39z" />
+<glyph unicode="&#xf01a;" d="M1120 608q0 -12 -10 -24l-319 -319q-11 -9 -23 -9t-23 9l-320 320q-15 16 -7 35q8 20 30 20h192v352q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-352h192q14 0 23 -9t9 -23zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273 t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf01b;" d="M1118 660q-8 -20 -30 -20h-192v-352q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v352h-192q-14 0 -23 9t-9 23q0 12 10 24l319 319q11 9 23 9t23 -9l320 -320q15 -16 7 -35zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198 t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf01c;" d="M1023 576h316q-1 3 -2.5 8t-2.5 8l-212 496h-708l-212 -496q-1 -2 -2.5 -8t-2.5 -8h316l95 -192h320zM1536 546v-482q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v482q0 62 25 123l238 552q10 25 36.5 42t52.5 17h832q26 0 52.5 -17t36.5 -42l238 -552 q25 -61 25 -123z" />
+<glyph unicode="&#xf01d;" d="M1184 640q0 -37 -32 -55l-544 -320q-15 -9 -32 -9q-16 0 -32 8q-32 19 -32 56v640q0 37 32 56q33 18 64 -1l544 -320q32 -18 32 -55zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf01e;" d="M1536 1280v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l138 138q-148 137 -349 137q-104 0 -198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5q119 0 225 52t179 147q7 10 23 12q14 0 25 -9 l137 -138q9 -8 9.5 -20.5t-7.5 -22.5q-109 -132 -264 -204.5t-327 -72.5q-156 0 -298 61t-245 164t-164 245t-61 298t61 298t164 245t245 164t298 61q147 0 284.5 -55.5t244.5 -156.5l130 129q29 31 70 14q39 -17 39 -59z" />
+<glyph unicode="&#xf021;" d="M1511 480q0 -5 -1 -7q-64 -268 -268 -434.5t-478 -166.5q-146 0 -282.5 55t-243.5 157l-129 -129q-19 -19 -45 -19t-45 19t-19 45v448q0 26 19 45t45 19h448q26 0 45 -19t19 -45t-19 -45l-137 -137q71 -66 161 -102t187 -36q134 0 250 65t186 179q11 17 53 117 q8 23 30 23h192q13 0 22.5 -9.5t9.5 -22.5zM1536 1280v-448q0 -26 -19 -45t-45 -19h-448q-26 0 -45 19t-19 45t19 45l138 138q-148 137 -349 137q-134 0 -250 -65t-186 -179q-11 -17 -53 -117q-8 -23 -30 -23h-199q-13 0 -22.5 9.5t-9.5 22.5v7q65 268 270 434.5t480 166.5 q146 0 284 -55.5t245 -156.5l130 129q19 19 45 19t45 -19t19 -45z" />
+<glyph unicode="&#xf022;" horiz-adv-x="1792" d="M384 352v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 608v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M384 864v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1536 352v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5z M1536 608v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5zM1536 864v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5 t9.5 -22.5zM1664 160v832q0 13 -9.5 22.5t-22.5 9.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5v-832q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1792 1248v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1472q66 0 113 -47 t47 -113z" />
+<glyph unicode="&#xf023;" horiz-adv-x="1152" d="M320 768h512v192q0 106 -75 181t-181 75t-181 -75t-75 -181v-192zM1152 672v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h32v192q0 184 132 316t316 132t316 -132t132 -316v-192h32q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf024;" horiz-adv-x="1792" d="M320 1280q0 -72 -64 -110v-1266q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v1266q-64 38 -64 110q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -25 -12.5 -38.5t-39.5 -27.5q-215 -116 -369 -116q-61 0 -123.5 22t-108.5 48 t-115.5 48t-142.5 22q-192 0 -464 -146q-17 -9 -33 -9q-26 0 -45 19t-19 45v742q0 32 31 55q21 14 79 43q236 120 421 120q107 0 200 -29t219 -88q38 -19 88 -19q54 0 117.5 21t110 47t88 47t54.5 21q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf025;" horiz-adv-x="1664" d="M1664 650q0 -166 -60 -314l-20 -49l-185 -33q-22 -83 -90.5 -136.5t-156.5 -53.5v-32q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-32q71 0 130 -35.5t93 -95.5l68 12q29 95 29 193q0 148 -88 279t-236.5 209t-315.5 78 t-315.5 -78t-236.5 -209t-88 -279q0 -98 29 -193l68 -12q34 60 93 95.5t130 35.5v32q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v32q-88 0 -156.5 53.5t-90.5 136.5l-185 33l-20 49q-60 148 -60 314q0 151 67 291t179 242.5 t266 163.5t320 61t320 -61t266 -163.5t179 -242.5t67 -291z" />
+<glyph unicode="&#xf026;" horiz-adv-x="768" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45z" />
+<glyph unicode="&#xf027;" horiz-adv-x="1152" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45zM1152 640q0 -76 -42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5q0 21 12 35.5t29 25t34 23t29 35.5 t12 57t-12 57t-29 35.5t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5q15 0 25 -5q70 -27 112.5 -93t42.5 -142z" />
+<glyph unicode="&#xf028;" horiz-adv-x="1664" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45zM1152 640q0 -76 -42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5q0 21 12 35.5t29 25t34 23t29 35.5 t12 57t-12 57t-29 35.5t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5q15 0 25 -5q70 -27 112.5 -93t42.5 -142zM1408 640q0 -153 -85 -282.5t-225 -188.5q-13 -5 -25 -5q-27 0 -46 19t-19 45q0 39 39 59q56 29 76 44q74 54 115.5 135.5t41.5 173.5t-41.5 173.5 t-115.5 135.5q-20 15 -76 44q-39 20 -39 59q0 26 19 45t45 19q13 0 26 -5q140 -59 225 -188.5t85 -282.5zM1664 640q0 -230 -127 -422.5t-338 -283.5q-13 -5 -26 -5q-26 0 -45 19t-19 45q0 36 39 59q7 4 22.5 10.5t22.5 10.5q46 25 82 51q123 91 192 227t69 289t-69 289 t-192 227q-36 26 -82 51q-7 4 -22.5 10.5t-22.5 10.5q-39 23 -39 59q0 26 19 45t45 19q13 0 26 -5q211 -91 338 -283.5t127 -422.5z" />
+<glyph unicode="&#xf029;" horiz-adv-x="1408" d="M384 384v-128h-128v128h128zM384 1152v-128h-128v128h128zM1152 1152v-128h-128v128h128zM128 129h384v383h-384v-383zM128 896h384v384h-384v-384zM896 896h384v384h-384v-384zM640 640v-640h-640v640h640zM1152 128v-128h-128v128h128zM1408 128v-128h-128v128h128z M1408 640v-384h-384v128h-128v-384h-128v640h384v-128h128v128h128zM640 1408v-640h-640v640h640zM1408 1408v-640h-640v640h640z" />
+<glyph unicode="&#xf02a;" horiz-adv-x="1792" d="M63 0h-63v1408h63v-1408zM126 1h-32v1407h32v-1407zM220 1h-31v1407h31v-1407zM377 1h-31v1407h31v-1407zM534 1h-62v1407h62v-1407zM660 1h-31v1407h31v-1407zM723 1h-31v1407h31v-1407zM786 1h-31v1407h31v-1407zM943 1h-63v1407h63v-1407zM1100 1h-63v1407h63v-1407z M1226 1h-63v1407h63v-1407zM1352 1h-63v1407h63v-1407zM1446 1h-63v1407h63v-1407zM1635 1h-94v1407h94v-1407zM1698 1h-32v1407h32v-1407zM1792 0h-63v1408h63v-1408z" />
+<glyph unicode="&#xf02b;" d="M448 1088q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1515 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5 l715 -714q37 -39 37 -91z" />
+<glyph unicode="&#xf02c;" horiz-adv-x="1920" d="M448 1088q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1515 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5 l715 -714q37 -39 37 -91zM1899 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-36 0 -59 14t-53 45l470 470q37 37 37 90q0 52 -37 91l-715 714q-38 38 -102 64.5t-117 26.5h224q53 0 117 -26.5t102 -64.5l715 -714q37 -39 37 -91z" />
+<glyph unicode="&#xf02d;" horiz-adv-x="1664" d="M1639 1058q40 -57 18 -129l-275 -906q-19 -64 -76.5 -107.5t-122.5 -43.5h-923q-77 0 -148.5 53.5t-99.5 131.5q-24 67 -2 127q0 4 3 27t4 37q1 8 -3 21.5t-3 19.5q2 11 8 21t16.5 23.5t16.5 23.5q23 38 45 91.5t30 91.5q3 10 0.5 30t-0.5 28q3 11 17 28t17 23 q21 36 42 92t25 90q1 9 -2.5 32t0.5 28q4 13 22 30.5t22 22.5q19 26 42.5 84.5t27.5 96.5q1 8 -3 25.5t-2 26.5q2 8 9 18t18 23t17 21q8 12 16.5 30.5t15 35t16 36t19.5 32t26.5 23.5t36 11.5t47.5 -5.5l-1 -3q38 9 51 9h761q74 0 114 -56t18 -130l-274 -906 q-36 -119 -71.5 -153.5t-128.5 -34.5h-869q-27 0 -38 -15q-11 -16 -1 -43q24 -70 144 -70h923q29 0 56 15.5t35 41.5l300 987q7 22 5 57q38 -15 59 -43zM575 1056q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5 t-16.5 -22.5zM492 800q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5t-16.5 -22.5z" />
+<glyph unicode="&#xf02e;" horiz-adv-x="1280" d="M1164 1408q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62v1289q0 34 19.5 62t52.5 41q21 9 44 9h1048z" />
+<glyph unicode="&#xf02f;" horiz-adv-x="1664" d="M384 0h896v256h-896v-256zM384 640h896v384h-160q-40 0 -68 28t-28 68v160h-640v-640zM1536 576q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 576v-416q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-160q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68 v160h-224q-13 0 -22.5 9.5t-9.5 22.5v416q0 79 56.5 135.5t135.5 56.5h64v544q0 40 28 68t68 28h672q40 0 88 -20t76 -48l152 -152q28 -28 48 -76t20 -88v-256h64q79 0 135.5 -56.5t56.5 -135.5z" />
+<glyph unicode="&#xf030;" horiz-adv-x="1920" d="M960 864q119 0 203.5 -84.5t84.5 -203.5t-84.5 -203.5t-203.5 -84.5t-203.5 84.5t-84.5 203.5t84.5 203.5t203.5 84.5zM1664 1280q106 0 181 -75t75 -181v-896q0 -106 -75 -181t-181 -75h-1408q-106 0 -181 75t-75 181v896q0 106 75 181t181 75h224l51 136 q19 49 69.5 84.5t103.5 35.5h512q53 0 103.5 -35.5t69.5 -84.5l51 -136h224zM960 128q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
+<glyph unicode="&#xf031;" horiz-adv-x="1664" d="M725 977l-170 -450q73 -1 153.5 -2t119 -1.5t52.5 -0.5l29 2q-32 95 -92 241q-53 132 -92 211zM21 -128h-21l2 79q22 7 80 18q89 16 110 31q20 16 48 68l237 616l280 724h75h53l11 -21l205 -480q103 -242 124 -297q39 -102 96 -235q26 -58 65 -164q24 -67 65 -149 q22 -49 35 -57q22 -19 69 -23q47 -6 103 -27q6 -39 6 -57q0 -14 -1 -26q-80 0 -192 8q-93 8 -189 8q-79 0 -135 -2l-200 -11l-58 -2q0 45 4 78l131 28q56 13 68 23q12 12 12 27t-6 32l-47 114l-92 228l-450 2q-29 -65 -104 -274q-23 -64 -23 -84q0 -31 17 -43 q26 -21 103 -32q3 0 13.5 -2t30 -5t40.5 -6q1 -28 1 -58q0 -17 -2 -27q-66 0 -349 20l-48 -8q-81 -14 -167 -14z" />
+<glyph unicode="&#xf032;" horiz-adv-x="1408" d="M555 15q76 -32 140 -32q131 0 216 41t122 113q38 70 38 181q0 114 -41 180q-58 94 -141 126q-80 32 -247 32q-74 0 -101 -10v-144l-1 -173l3 -270q0 -15 12 -44zM541 761q43 -7 109 -7q175 0 264 65t89 224q0 112 -85 187q-84 75 -255 75q-52 0 -130 -13q0 -44 2 -77 q7 -122 6 -279l-1 -98q0 -43 1 -77zM0 -128l2 94q45 9 68 12q77 12 123 31q17 27 21 51q9 66 9 194l-2 497q-5 256 -9 404q-1 87 -11 109q-1 4 -12 12q-18 12 -69 15q-30 2 -114 13l-4 83l260 6l380 13l45 1q5 0 14 0.5t14 0.5q1 0 21.5 -0.5t40.5 -0.5h74q88 0 191 -27 q43 -13 96 -39q57 -29 102 -76q44 -47 65 -104t21 -122q0 -70 -32 -128t-95 -105q-26 -20 -150 -77q177 -41 267 -146q92 -106 92 -236q0 -76 -29 -161q-21 -62 -71 -117q-66 -72 -140 -108q-73 -36 -203 -60q-82 -15 -198 -11l-197 4q-84 2 -298 -11q-33 -3 -272 -11z" />
+<glyph unicode="&#xf033;" horiz-adv-x="1024" d="M0 -126l17 85q4 1 77 20q76 19 116 39q29 37 41 101l27 139l56 268l12 64q8 44 17 84.5t16 67t12.5 46.5t9 30.5t3.5 11.5l29 157l16 63l22 135l8 50v38q-41 22 -144 28q-28 2 -38 4l19 103l317 -14q39 -2 73 -2q66 0 214 9q33 2 68 4.5t36 2.5q-2 -19 -6 -38 q-7 -29 -13 -51q-55 -19 -109 -31q-64 -16 -101 -31q-12 -31 -24 -88q-9 -44 -13 -82q-44 -199 -66 -306l-61 -311l-38 -158l-43 -235l-12 -45q-2 -7 1 -27q64 -15 119 -21q36 -5 66 -10q-1 -29 -7 -58q-7 -31 -9 -41q-18 0 -23 -1q-24 -2 -42 -2q-9 0 -28 3q-19 4 -145 17 l-198 2q-41 1 -174 -11q-74 -7 -98 -9z" />
+<glyph unicode="&#xf034;" horiz-adv-x="1792" d="M81 1407l54 -27q20 -5 211 -5h130l19 3l115 1l215 -1h293l34 -2q14 -1 28 7t21 16l7 8l42 1q15 0 28 -1v-104.5t1 -131.5l1 -100l-1 -58q0 -32 -4 -51q-39 -15 -68 -18q-25 43 -54 128q-8 24 -15.5 62.5t-11.5 65.5t-6 29q-13 15 -27 19q-7 2 -42.5 2t-103.5 -1t-111 -1 q-34 0 -67 -5q-10 -97 -8 -136l1 -152v-332l3 -359l-1 -147q-1 -46 11 -85q49 -25 89 -32q2 0 18 -5t44 -13t43 -12q30 -8 50 -18q5 -45 5 -50q0 -10 -3 -29q-14 -1 -34 -1q-110 0 -187 10q-72 8 -238 8q-88 0 -233 -14q-48 -4 -70 -4q-2 22 -2 26l-1 26v9q21 33 79 49 q139 38 159 50q9 21 12 56q8 192 6 433l-5 428q-1 62 -0.5 118.5t0.5 102.5t-2 57t-6 15q-6 5 -14 6q-38 6 -148 6q-43 0 -100 -13.5t-73 -24.5q-13 -9 -22 -33t-22 -75t-24 -84q-6 -19 -19.5 -32t-20.5 -13q-44 27 -56 44v297v86zM1744 128q33 0 42 -18.5t-11 -44.5 l-126 -162q-20 -26 -49 -26t-49 26l-126 162q-20 26 -11 44.5t42 18.5h80v1024h-80q-33 0 -42 18.5t11 44.5l126 162q20 26 49 26t49 -26l126 -162q20 -26 11 -44.5t-42 -18.5h-80v-1024h80z" />
+<glyph unicode="&#xf035;" d="M81 1407l54 -27q20 -5 211 -5h130l19 3l115 1l446 -1h318l34 -2q14 -1 28 7t21 16l7 8l42 1q15 0 28 -1v-104.5t1 -131.5l1 -100l-1 -58q0 -32 -4 -51q-39 -15 -68 -18q-25 43 -54 128q-8 24 -15.5 62.5t-11.5 65.5t-6 29q-13 15 -27 19q-7 2 -58.5 2t-138.5 -1t-128 -1 q-94 0 -127 -5q-10 -97 -8 -136l1 -152v52l3 -359l-1 -147q-1 -46 11 -85q49 -25 89 -32q2 0 18 -5t44 -13t43 -12q30 -8 50 -18q5 -45 5 -50q0 -10 -3 -29q-14 -1 -34 -1q-110 0 -187 10q-72 8 -238 8q-82 0 -233 -13q-45 -5 -70 -5q-2 22 -2 26l-1 26v9q21 33 79 49 q139 38 159 50q9 21 12 56q6 137 6 433l-5 44q0 265 -2 278q-2 11 -6 15q-6 5 -14 6q-38 6 -148 6q-50 0 -168.5 -14t-132.5 -24q-13 -9 -22 -33t-22 -75t-24 -84q-6 -19 -19.5 -32t-20.5 -13q-44 27 -56 44v297v86zM1505 113q26 -20 26 -49t-26 -49l-162 -126 q-26 -20 -44.5 -11t-18.5 42v80h-1024v-80q0 -33 -18.5 -42t-44.5 11l-162 126q-26 20 -26 49t26 49l162 126q26 20 44.5 11t18.5 -42v-80h1024v80q0 33 18.5 42t44.5 -11z" />
+<glyph unicode="&#xf036;" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1408 576v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45zM1664 960v-128q0 -26 -19 -45 t-45 -19h-1536q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45zM1280 1344v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf037;" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1408 576v-128q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h896q26 0 45 -19t19 -45zM1664 960v-128q0 -26 -19 -45t-45 -19 h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1280 1344v-128q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h640q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf038;" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 576v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45zM1792 960v-128q0 -26 -19 -45 t-45 -19h-1536q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45zM1792 1344v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf039;" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 576v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 960v-128q0 -26 -19 -45 t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 1344v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf03a;" horiz-adv-x="1792" d="M256 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM256 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5 t9.5 -22.5zM256 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1344 q13 0 22.5 -9.5t9.5 -22.5zM256 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5 t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192 q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5z" />
+<glyph unicode="&#xf03b;" horiz-adv-x="1792" d="M384 992v-576q0 -13 -9.5 -22.5t-22.5 -9.5q-14 0 -23 9l-288 288q-9 9 -9 23t9 23l288 288q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5 t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088 q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5z" />
+<glyph unicode="&#xf03c;" horiz-adv-x="1792" d="M352 704q0 -14 -9 -23l-288 -288q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v576q0 13 9.5 22.5t22.5 9.5q14 0 23 -9l288 -288q9 -9 9 -23zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5 t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088 q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5z" />
+<glyph unicode="&#xf03d;" horiz-adv-x="1792" d="M1792 1184v-1088q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-403 403v-166q0 -119 -84.5 -203.5t-203.5 -84.5h-704q-119 0 -203.5 84.5t-84.5 203.5v704q0 119 84.5 203.5t203.5 84.5h704q119 0 203.5 -84.5t84.5 -203.5v-165l403 402q18 19 45 19q12 0 25 -5 q39 -17 39 -59z" />
+<glyph unicode="&#xf03e;" horiz-adv-x="1920" d="M640 960q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1664 576v-448h-1408v192l320 320l160 -160l512 512zM1760 1280h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-1216q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5v1216 q0 13 -9.5 22.5t-22.5 9.5zM1920 1248v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf040;" d="M363 0l91 91l-235 235l-91 -91v-107h128v-128h107zM886 928q0 22 -22 22q-10 0 -17 -7l-542 -542q-7 -7 -7 -17q0 -22 22 -22q10 0 17 7l542 542q7 7 7 17zM832 1120l416 -416l-832 -832h-416v416zM1515 1024q0 -53 -37 -90l-166 -166l-416 416l166 165q36 38 90 38 q53 0 91 -38l235 -234q37 -39 37 -91z" />
+<glyph unicode="&#xf041;" horiz-adv-x="1024" d="M768 896q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1024 896q0 -109 -33 -179l-364 -774q-16 -33 -47.5 -52t-67.5 -19t-67.5 19t-46.5 52l-365 774q-33 70 -33 179q0 212 150 362t362 150t362 -150t150 -362z" />
+<glyph unicode="&#xf042;" d="M768 96v1088q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf043;" horiz-adv-x="1024" d="M512 384q0 36 -20 69q-1 1 -15.5 22.5t-25.5 38t-25 44t-21 50.5q-4 16 -21 16t-21 -16q-7 -23 -21 -50.5t-25 -44t-25.5 -38t-15.5 -22.5q-20 -33 -20 -69q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 512q0 -212 -150 -362t-362 -150t-362 150t-150 362 q0 145 81 275q6 9 62.5 90.5t101 151t99.5 178t83 201.5q9 30 34 47t51 17t51.5 -17t33.5 -47q28 -93 83 -201.5t99.5 -178t101 -151t62.5 -90.5q81 -127 81 -275z" />
+<glyph unicode="&#xf044;" horiz-adv-x="1792" d="M888 352l116 116l-152 152l-116 -116v-56h96v-96h56zM1328 1072q-16 16 -33 -1l-350 -350q-17 -17 -1 -33t33 1l350 350q17 17 1 33zM1408 478v-190q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832 q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-14 -14 -32 -8q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v126q0 13 9 22l64 64q15 15 35 7t20 -29zM1312 1216l288 -288l-672 -672h-288v288zM1756 1084l-92 -92 l-288 288l92 92q28 28 68 28t68 -28l152 -152q28 -28 28 -68t-28 -68z" />
+<glyph unicode="&#xf045;" horiz-adv-x="1664" d="M1408 547v-259q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h255v0q13 0 22.5 -9.5t9.5 -22.5q0 -27 -26 -32q-77 -26 -133 -60q-10 -4 -16 -4h-112q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832 q66 0 113 47t47 113v214q0 19 18 29q28 13 54 37q16 16 35 8q21 -9 21 -29zM1645 1043l-384 -384q-18 -19 -45 -19q-12 0 -25 5q-39 17 -39 59v192h-160q-323 0 -438 -131q-119 -137 -74 -473q3 -23 -20 -34q-8 -2 -12 -2q-16 0 -26 13q-10 14 -21 31t-39.5 68.5t-49.5 99.5 t-38.5 114t-17.5 122q0 49 3.5 91t14 90t28 88t47 81.5t68.5 74t94.5 61.5t124.5 48.5t159.5 30.5t196.5 11h160v192q0 42 39 59q13 5 25 5q26 0 45 -19l384 -384q19 -19 19 -45t-19 -45z" />
+<glyph unicode="&#xf046;" horiz-adv-x="1664" d="M1408 606v-318q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-10 -10 -23 -10q-3 0 -9 2q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832 q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v254q0 13 9 22l64 64q10 10 23 10q6 0 12 -3q20 -8 20 -29zM1639 1095l-814 -814q-24 -24 -57 -24t-57 24l-430 430q-24 24 -24 57t24 57l110 110q24 24 57 24t57 -24l263 -263l647 647q24 24 57 24t57 -24l110 -110 q24 -24 24 -57t-24 -57z" />
+<glyph unicode="&#xf047;" horiz-adv-x="1792" d="M1792 640q0 -26 -19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-384v-384h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v384h-384v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45 t19 45l256 256q19 19 45 19t45 -19t19 -45v-128h384v384h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45t-19 -45t-45 -19h-128v-384h384v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45z" />
+<glyph unicode="&#xf048;" horiz-adv-x="1024" d="M979 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 11 13 19z" />
+<glyph unicode="&#xf049;" horiz-adv-x="1792" d="M1747 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 11 13 19l710 710 q19 19 32 13t13 -32v-710q4 11 13 19z" />
+<glyph unicode="&#xf04a;" horiz-adv-x="1664" d="M1619 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-8 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-19 19 -19 45t19 45l710 710q19 19 32 13t13 -32v-710q5 11 13 19z" />
+<glyph unicode="&#xf04b;" horiz-adv-x="1408" d="M1384 609l-1328 -738q-23 -13 -39.5 -3t-16.5 36v1472q0 26 16.5 36t39.5 -3l1328 -738q23 -13 23 -31t-23 -31z" />
+<glyph unicode="&#xf04c;" d="M1536 1344v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45zM640 1344v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf04d;" d="M1536 1344v-1408q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf04e;" horiz-adv-x="1664" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v710q0 26 13 32t32 -13l710 -710q19 -19 19 -45t-19 -45l-710 -710q-19 -19 -32 -13t-13 32v710q-5 -10 -13 -19z" />
+<glyph unicode="&#xf050;" horiz-adv-x="1792" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v710q0 26 13 32t32 -13l710 -710q8 -8 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-5 -10 -13 -19l-710 -710 q-19 -19 -32 -13t-13 32v710q-5 -10 -13 -19z" />
+<glyph unicode="&#xf051;" horiz-adv-x="1024" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-5 -10 -13 -19z" />
+<glyph unicode="&#xf052;" horiz-adv-x="1538" d="M14 557l710 710q19 19 45 19t45 -19l710 -710q19 -19 13 -32t-32 -13h-1472q-26 0 -32 13t13 32zM1473 0h-1408q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19z" />
+<glyph unicode="&#xf053;" horiz-adv-x="1152" d="M742 -37l-652 651q-37 37 -37 90.5t37 90.5l652 651q37 37 90.5 37t90.5 -37l75 -75q37 -37 37 -90.5t-37 -90.5l-486 -486l486 -485q37 -38 37 -91t-37 -90l-75 -75q-37 -37 -90.5 -37t-90.5 37z" />
+<glyph unicode="&#xf054;" horiz-adv-x="1152" d="M1099 704q0 -52 -37 -91l-652 -651q-37 -37 -90 -37t-90 37l-76 75q-37 39 -37 91q0 53 37 90l486 486l-486 485q-37 39 -37 91q0 53 37 90l76 75q36 38 90 38t90 -38l652 -651q37 -37 37 -90z" />
+<glyph unicode="&#xf055;" d="M1216 576v128q0 26 -19 45t-45 19h-256v256q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-256h-256q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h256v-256q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v256h256q26 0 45 19t19 45zM1536 640q0 -209 -103 -385.5 t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf056;" d="M1216 576v128q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5 t103 -385.5z" />
+<glyph unicode="&#xf057;" d="M1149 414q0 26 -19 45l-181 181l181 181q19 19 19 45q0 27 -19 46l-90 90q-19 19 -46 19q-26 0 -45 -19l-181 -181l-181 181q-19 19 -45 19q-27 0 -46 -19l-90 -90q-19 -19 -19 -46q0 -26 19 -45l181 -181l-181 -181q-19 -19 -19 -45q0 -27 19 -46l90 -90q19 -19 46 -19 q26 0 45 19l181 181l181 -181q19 -19 45 -19q27 0 46 19l90 90q19 19 19 46zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf058;" d="M1284 802q0 28 -18 46l-91 90q-19 19 -45 19t-45 -19l-408 -407l-226 226q-19 19 -45 19t-45 -19l-91 -90q-18 -18 -18 -46q0 -27 18 -45l362 -362q19 -19 45 -19q27 0 46 19l543 543q18 18 18 45zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf059;" d="M896 160v192q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h192q14 0 23 9t9 23zM1152 832q0 88 -55.5 163t-138.5 116t-170 41q-243 0 -371 -213q-15 -24 8 -42l132 -100q7 -6 19 -6q16 0 25 12q53 68 86 92q34 24 86 24q48 0 85.5 -26t37.5 -59 q0 -38 -20 -61t-68 -45q-63 -28 -115.5 -86.5t-52.5 -125.5v-36q0 -14 9 -23t23 -9h192q14 0 23 9t9 23q0 19 21.5 49.5t54.5 49.5q32 18 49 28.5t46 35t44.5 48t28 60.5t12.5 81zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf05a;" d="M1024 160v160q0 14 -9 23t-23 9h-96v512q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h96v-320h-96q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h448q14 0 23 9t9 23zM896 1056v160q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23 t23 -9h192q14 0 23 9t9 23zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf05b;" d="M1197 512h-109q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h109q-32 108 -112.5 188.5t-188.5 112.5v-109q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v109q-108 -32 -188.5 -112.5t-112.5 -188.5h109q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-109 q32 -108 112.5 -188.5t188.5 -112.5v109q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-109q108 32 188.5 112.5t112.5 188.5zM1536 704v-128q0 -26 -19 -45t-45 -19h-143q-37 -161 -154.5 -278.5t-278.5 -154.5v-143q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v143 q-161 37 -278.5 154.5t-154.5 278.5h-143q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h143q37 161 154.5 278.5t278.5 154.5v143q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-143q161 -37 278.5 -154.5t154.5 -278.5h143q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf05c;" d="M1097 457l-146 -146q-10 -10 -23 -10t-23 10l-137 137l-137 -137q-10 -10 -23 -10t-23 10l-146 146q-10 10 -10 23t10 23l137 137l-137 137q-10 10 -10 23t10 23l146 146q10 10 23 10t23 -10l137 -137l137 137q10 10 23 10t23 -10l146 -146q10 -10 10 -23t-10 -23 l-137 -137l137 -137q10 -10 10 -23t-10 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5 t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf05d;" d="M1171 723l-422 -422q-19 -19 -45 -19t-45 19l-294 294q-19 19 -19 45t19 45l102 102q19 19 45 19t45 -19l147 -147l275 275q19 19 45 19t45 -19l102 -102q19 -19 19 -45t-19 -45zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198 t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf05e;" d="M1312 643q0 161 -87 295l-754 -753q137 -89 297 -89q111 0 211.5 43.5t173.5 116.5t116 174.5t43 212.5zM313 344l755 754q-135 91 -300 91q-148 0 -273 -73t-198 -199t-73 -274q0 -162 89 -299zM1536 643q0 -157 -61 -300t-163.5 -246t-245 -164t-298.5 -61t-298.5 61 t-245 164t-163.5 246t-61 300t61 299.5t163.5 245.5t245 164t298.5 61t298.5 -61t245 -164t163.5 -245.5t61 -299.5z" />
+<glyph unicode="&#xf060;" d="M1536 640v-128q0 -53 -32.5 -90.5t-84.5 -37.5h-704l293 -294q38 -36 38 -90t-38 -90l-75 -76q-37 -37 -90 -37q-52 0 -91 37l-651 652q-37 37 -37 90q0 52 37 91l651 650q38 38 91 38q52 0 90 -38l75 -74q38 -38 38 -91t-38 -91l-293 -293h704q52 0 84.5 -37.5 t32.5 -90.5z" />
+<glyph unicode="&#xf061;" d="M1472 576q0 -54 -37 -91l-651 -651q-39 -37 -91 -37q-51 0 -90 37l-75 75q-38 38 -38 91t38 91l293 293h-704q-52 0 -84.5 37.5t-32.5 90.5v128q0 53 32.5 90.5t84.5 37.5h704l-293 294q-38 36 -38 90t38 90l75 75q38 38 90 38q53 0 91 -38l651 -651q37 -35 37 -90z" />
+<glyph unicode="&#xf062;" horiz-adv-x="1664" d="M1611 565q0 -51 -37 -90l-75 -75q-38 -38 -91 -38q-54 0 -90 38l-294 293v-704q0 -52 -37.5 -84.5t-90.5 -32.5h-128q-53 0 -90.5 32.5t-37.5 84.5v704l-294 -293q-36 -38 -90 -38t-90 38l-75 75q-38 38 -38 90q0 53 38 91l651 651q35 37 90 37q54 0 91 -37l651 -651 q37 -39 37 -91z" />
+<glyph unicode="&#xf063;" horiz-adv-x="1664" d="M1611 704q0 -53 -37 -90l-651 -652q-39 -37 -91 -37q-53 0 -90 37l-651 652q-38 36 -38 90q0 53 38 91l74 75q39 37 91 37q53 0 90 -37l294 -294v704q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-704l294 294q37 37 90 37q52 0 91 -37l75 -75q37 -39 37 -91z" />
+<glyph unicode="&#xf064;" horiz-adv-x="1792" d="M1792 896q0 -26 -19 -45l-512 -512q-19 -19 -45 -19t-45 19t-19 45v256h-224q-98 0 -175.5 -6t-154 -21.5t-133 -42.5t-105.5 -69.5t-80 -101t-48.5 -138.5t-17.5 -181q0 -55 5 -123q0 -6 2.5 -23.5t2.5 -26.5q0 -15 -8.5 -25t-23.5 -10q-16 0 -28 17q-7 9 -13 22 t-13.5 30t-10.5 24q-127 285 -127 451q0 199 53 333q162 403 875 403h224v256q0 26 19 45t45 19t45 -19l512 -512q19 -19 19 -45z" />
+<glyph unicode="&#xf065;" d="M755 480q0 -13 -10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45t-45 -19h-448q-26 0 -45 19t-19 45v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23zM1536 1344v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332 q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf066;" d="M768 576v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45zM1523 1248q0 -13 -10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45 t-45 -19h-448q-26 0 -45 19t-19 45v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23z" />
+<glyph unicode="&#xf067;" horiz-adv-x="1408" d="M1408 800v-192q0 -40 -28 -68t-68 -28h-416v-416q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v416h-416q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h416v416q0 40 28 68t68 28h192q40 0 68 -28t28 -68v-416h416q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf068;" horiz-adv-x="1408" d="M1408 800v-192q0 -40 -28 -68t-68 -28h-1216q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h1216q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf069;" horiz-adv-x="1664" d="M1482 486q46 -26 59.5 -77.5t-12.5 -97.5l-64 -110q-26 -46 -77.5 -59.5t-97.5 12.5l-266 153v-307q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v307l-266 -153q-46 -26 -97.5 -12.5t-77.5 59.5l-64 110q-26 46 -12.5 97.5t59.5 77.5l266 154l-266 154 q-46 26 -59.5 77.5t12.5 97.5l64 110q26 46 77.5 59.5t97.5 -12.5l266 -153v307q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-307l266 153q46 26 97.5 12.5t77.5 -59.5l64 -110q26 -46 12.5 -97.5t-59.5 -77.5l-266 -154z" />
+<glyph unicode="&#xf06a;" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM896 161v190q0 14 -9 23.5t-22 9.5h-192q-13 0 -23 -10t-10 -23v-190q0 -13 10 -23t23 -10h192 q13 0 22 9.5t9 23.5zM894 505l18 621q0 12 -10 18q-10 8 -24 8h-220q-14 0 -24 -8q-10 -6 -10 -18l17 -621q0 -10 10 -17.5t24 -7.5h185q14 0 23.5 7.5t10.5 17.5z" />
+<glyph unicode="&#xf06b;" d="M928 180v56v468v192h-320v-192v-468v-56q0 -25 18 -38.5t46 -13.5h192q28 0 46 13.5t18 38.5zM472 1024h195l-126 161q-26 31 -69 31q-40 0 -68 -28t-28 -68t28 -68t68 -28zM1160 1120q0 40 -28 68t-68 28q-43 0 -69 -31l-125 -161h194q40 0 68 28t28 68zM1536 864v-320 q0 -14 -9 -23t-23 -9h-96v-416q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28t-28 68v416h-96q-14 0 -23 9t-9 23v320q0 14 9 23t23 9h440q-93 0 -158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5q107 0 168 -77l128 -165l128 165q61 77 168 77q93 0 158.5 -65.5t65.5 -158.5 t-65.5 -158.5t-158.5 -65.5h440q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf06c;" horiz-adv-x="1792" d="M1280 832q0 26 -19 45t-45 19q-172 0 -318 -49.5t-259.5 -134t-235.5 -219.5q-19 -21 -19 -45q0 -26 19 -45t45 -19q24 0 45 19q27 24 74 71t67 66q137 124 268.5 176t313.5 52q26 0 45 19t19 45zM1792 1030q0 -95 -20 -193q-46 -224 -184.5 -383t-357.5 -268 q-214 -108 -438 -108q-148 0 -286 47q-15 5 -88 42t-96 37q-16 0 -39.5 -32t-45 -70t-52.5 -70t-60 -32q-30 0 -51 11t-31 24t-27 42q-2 4 -6 11t-5.5 10t-3 9.5t-1.5 13.5q0 35 31 73.5t68 65.5t68 56t31 48q0 4 -14 38t-16 44q-9 51 -9 104q0 115 43.5 220t119 184.5 t170.5 139t204 95.5q55 18 145 25.5t179.5 9t178.5 6t163.5 24t113.5 56.5l29.5 29.5t29.5 28t27 20t36.5 16t43.5 4.5q39 0 70.5 -46t47.5 -112t24 -124t8 -96z" />
+<glyph unicode="&#xf06d;" horiz-adv-x="1408" d="M1408 -160v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1152 896q0 -78 -24.5 -144t-64 -112.5t-87.5 -88t-96 -77.5t-87.5 -72t-64 -81.5t-24.5 -96.5q0 -96 67 -224l-4 1l1 -1 q-90 41 -160 83t-138.5 100t-113.5 122.5t-72.5 150.5t-27.5 184q0 78 24.5 144t64 112.5t87.5 88t96 77.5t87.5 72t64 81.5t24.5 96.5q0 94 -66 224l3 -1l-1 1q90 -41 160 -83t138.5 -100t113.5 -122.5t72.5 -150.5t27.5 -184z" />
+<glyph unicode="&#xf06e;" horiz-adv-x="1792" d="M1664 576q-152 236 -381 353q61 -104 61 -225q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 121 61 225q-229 -117 -381 -353q133 -205 333.5 -326.5t434.5 -121.5t434.5 121.5t333.5 326.5zM944 960q0 20 -14 34t-34 14q-125 0 -214.5 -89.5 t-89.5 -214.5q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34zM1792 576q0 -34 -20 -69q-140 -230 -376.5 -368.5t-499.5 -138.5t-499.5 139t-376.5 368q-20 35 -20 69t20 69q140 229 376.5 368t499.5 139t499.5 -139t376.5 -368q20 -35 20 -69z" />
+<glyph unicode="&#xf070;" horiz-adv-x="1792" d="M555 201l78 141q-87 63 -136 159t-49 203q0 121 61 225q-229 -117 -381 -353q167 -258 427 -375zM944 960q0 20 -14 34t-34 14q-125 0 -214.5 -89.5t-89.5 -214.5q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34zM1307 1151q0 -7 -1 -9 q-105 -188 -315 -566t-316 -567l-49 -89q-10 -16 -28 -16q-12 0 -134 70q-16 10 -16 28q0 12 44 87q-143 65 -263.5 173t-208.5 245q-20 31 -20 69t20 69q153 235 380 371t496 136q89 0 180 -17l54 97q10 16 28 16q5 0 18 -6t31 -15.5t33 -18.5t31.5 -18.5t19.5 -11.5 q16 -10 16 -27zM1344 704q0 -139 -79 -253.5t-209 -164.5l280 502q8 -45 8 -84zM1792 576q0 -35 -20 -69q-39 -64 -109 -145q-150 -172 -347.5 -267t-419.5 -95l74 132q212 18 392.5 137t301.5 307q-115 179 -282 294l63 112q95 -64 182.5 -153t144.5 -184q20 -34 20 -69z " />
+<glyph unicode="&#xf071;" horiz-adv-x="1792" d="M1024 161v190q0 14 -9.5 23.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -23.5v-190q0 -14 9.5 -23.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 23.5zM1022 535l18 459q0 12 -10 19q-13 11 -24 11h-220q-11 0 -24 -11q-10 -7 -10 -21l17 -457q0 -10 10 -16.5t24 -6.5h185 q14 0 23.5 6.5t10.5 16.5zM1008 1469l768 -1408q35 -63 -2 -126q-17 -29 -46.5 -46t-63.5 -17h-1536q-34 0 -63.5 17t-46.5 46q-37 63 -2 126l768 1408q17 31 47 49t65 18t65 -18t47 -49z" />
+<glyph unicode="&#xf072;" horiz-adv-x="1408" d="M1376 1376q44 -52 12 -148t-108 -172l-161 -161l160 -696q5 -19 -12 -33l-128 -96q-7 -6 -19 -6q-4 0 -7 1q-15 3 -21 16l-279 508l-259 -259l53 -194q5 -17 -8 -31l-96 -96q-9 -9 -23 -9h-2q-15 2 -24 13l-189 252l-252 189q-11 7 -13 23q-1 13 9 25l96 97q9 9 23 9 q6 0 8 -1l194 -53l259 259l-508 279q-14 8 -17 24q-2 16 9 27l128 128q14 13 30 8l665 -159l160 160q76 76 172 108t148 -12z" />
+<glyph unicode="&#xf073;" horiz-adv-x="1664" d="M128 -128h288v288h-288v-288zM480 -128h320v288h-320v-288zM128 224h288v320h-288v-320zM480 224h320v320h-320v-320zM128 608h288v288h-288v-288zM864 -128h320v288h-320v-288zM480 608h320v288h-320v-288zM1248 -128h288v288h-288v-288zM864 224h320v320h-320v-320z M512 1088v288q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-288q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1248 224h288v320h-288v-320zM864 608h320v288h-320v-288zM1248 608h288v288h-288v-288zM1280 1088v288q0 13 -9.5 22.5t-22.5 9.5h-64 q-13 0 -22.5 -9.5t-9.5 -22.5v-288q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1664 1152v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47 h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf074;" horiz-adv-x="1792" d="M666 1055q-60 -92 -137 -273q-22 45 -37 72.5t-40.5 63.5t-51 56.5t-63 35t-81.5 14.5h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224q250 0 410 -225zM1792 256q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192q-32 0 -85 -0.5t-81 -1t-73 1 t-71 5t-64 10.5t-63 18.5t-58 28.5t-59 40t-55 53.5t-56 69.5q59 93 136 273q22 -45 37 -72.5t40.5 -63.5t51 -56.5t63 -35t81.5 -14.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23zM1792 1152q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5 v192h-256q-48 0 -87 -15t-69 -45t-51 -61.5t-45 -77.5q-32 -62 -78 -171q-29 -66 -49.5 -111t-54 -105t-64 -100t-74 -83t-90 -68.5t-106.5 -42t-128 -16.5h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224q48 0 87 15t69 45t51 61.5t45 77.5q32 62 78 171q29 66 49.5 111 t54 105t64 100t74 83t90 68.5t106.5 42t128 16.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23z" />
+<glyph unicode="&#xf075;" horiz-adv-x="1792" d="M1792 640q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22q-17 -2 -30.5 9t-17.5 29v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281 q0 130 71 248.5t191 204.5t286 136.5t348 50.5q244 0 450 -85.5t326 -233t120 -321.5z" />
+<glyph unicode="&#xf076;" d="M1536 704v-128q0 -201 -98.5 -362t-274 -251.5t-395.5 -90.5t-395.5 90.5t-274 251.5t-98.5 362v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-128q0 -52 23.5 -90t53.5 -57t71 -30t64 -13t44 -2t44 2t64 13t71 30t53.5 57t23.5 90v128q0 26 19 45t45 19h384 q26 0 45 -19t19 -45zM512 1344v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45zM1536 1344v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf077;" horiz-adv-x="1664" d="M1611 320q0 -53 -37 -90l-75 -75q-38 -38 -91 -38q-54 0 -90 38l-486 485l-486 -485q-36 -38 -90 -38t-90 38l-75 75q-38 36 -38 90q0 53 38 91l651 651q37 37 90 37q52 0 91 -37l650 -651q38 -38 38 -91z" />
+<glyph unicode="&#xf078;" horiz-adv-x="1664" d="M1611 832q0 -53 -37 -90l-651 -651q-38 -38 -91 -38q-54 0 -90 38l-651 651q-38 36 -38 90q0 53 38 91l74 75q39 37 91 37q53 0 90 -37l486 -486l486 486q37 37 90 37q52 0 91 -37l75 -75q37 -39 37 -91z" />
+<glyph unicode="&#xf079;" horiz-adv-x="1920" d="M1280 32q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-8 0 -13.5 2t-9 7t-5.5 8t-3 11.5t-1 11.5v13v11v160v416h-192q-26 0 -45 19t-19 45q0 24 15 41l320 384q19 22 49 22t49 -22l320 -384q15 -17 15 -41q0 -26 -19 -45t-45 -19h-192v-384h576q16 0 25 -11l160 -192q7 -11 7 -21 zM1920 448q0 -24 -15 -41l-320 -384q-20 -23 -49 -23t-49 23l-320 384q-15 17 -15 41q0 26 19 45t45 19h192v384h-576q-16 0 -25 12l-160 192q-7 9 -7 20q0 13 9.5 22.5t22.5 9.5h960q8 0 13.5 -2t9 -7t5.5 -8t3 -11.5t1 -11.5v-13v-11v-160v-416h192q26 0 45 -19t19 -45z " />
+<glyph unicode="&#xf07a;" horiz-adv-x="1664" d="M640 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1536 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1664 1088v-512q0 -24 -16 -42.5t-41 -21.5 l-1044 -122q1 -7 4.5 -21.5t6 -26.5t2.5 -22q0 -16 -24 -64h920q26 0 45 -19t19 -45t-19 -45t-45 -19h-1024q-26 0 -45 19t-19 45q0 14 11 39.5t29.5 59.5t20.5 38l-177 823h-204q-26 0 -45 19t-19 45t19 45t45 19h256q16 0 28.5 -6.5t20 -15.5t13 -24.5t7.5 -26.5 t5.5 -29.5t4.5 -25.5h1201q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf07b;" horiz-adv-x="1664" d="M1664 928v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158z" />
+<glyph unicode="&#xf07c;" horiz-adv-x="1920" d="M1879 584q0 -31 -31 -66l-336 -396q-43 -51 -120.5 -86.5t-143.5 -35.5h-1088q-34 0 -60.5 13t-26.5 43q0 31 31 66l336 396q43 51 120.5 86.5t143.5 35.5h1088q34 0 60.5 -13t26.5 -43zM1536 928v-160h-832q-94 0 -197 -47.5t-164 -119.5l-337 -396l-5 -6q0 4 -0.5 12.5 t-0.5 12.5v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158z" />
+<glyph unicode="&#xf07d;" horiz-adv-x="768" d="M704 1216q0 -26 -19 -45t-45 -19h-128v-1024h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v1024h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45z" />
+<glyph unicode="&#xf07e;" horiz-adv-x="1792" d="M1792 640q0 -26 -19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-1024v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45t19 45l256 256q19 19 45 19t45 -19t19 -45v-128h1024v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45z" />
+<glyph unicode="&#xf080;" horiz-adv-x="1920" d="M512 512v-384h-256v384h256zM896 1024v-896h-256v896h256zM1280 768v-640h-256v640h256zM1664 1152v-1024h-256v1024h256zM1792 32v1216q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-1216q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5z M1920 1248v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf081;" d="M1280 926q-56 -25 -121 -34q68 40 93 117q-65 -38 -134 -51q-61 66 -153 66q-87 0 -148.5 -61.5t-61.5 -148.5q0 -29 5 -48q-129 7 -242 65t-192 155q-29 -50 -29 -106q0 -114 91 -175q-47 1 -100 26v-2q0 -75 50 -133.5t123 -72.5q-29 -8 -51 -8q-13 0 -39 4 q21 -63 74.5 -104t121.5 -42q-116 -90 -261 -90q-26 0 -50 3q148 -94 322 -94q112 0 210 35.5t168 95t120.5 137t75 162t24.5 168.5q0 18 -1 27q63 45 105 109zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5 t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf082;" d="M1307 618l23 219h-198v109q0 49 15.5 68.5t71.5 19.5h110v219h-175q-152 0 -218 -72t-66 -213v-131h-131v-219h131v-635h262v635h175zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960 q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf083;" horiz-adv-x="1792" d="M928 704q0 14 -9 23t-23 9q-66 0 -113 -47t-47 -113q0 -14 9 -23t23 -9t23 9t9 23q0 40 28 68t68 28q14 0 23 9t9 23zM1152 574q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM128 0h1536v128h-1536v-128zM1280 574q0 159 -112.5 271.5 t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM256 1216h384v128h-384v-128zM128 1024h1536v118v138h-828l-64 -128h-644v-128zM1792 1280v-1280q0 -53 -37.5 -90.5t-90.5 -37.5h-1536q-53 0 -90.5 37.5t-37.5 90.5v1280 q0 53 37.5 90.5t90.5 37.5h1536q53 0 90.5 -37.5t37.5 -90.5z" />
+<glyph unicode="&#xf084;" horiz-adv-x="1792" d="M832 1024q0 80 -56 136t-136 56t-136 -56t-56 -136q0 -42 19 -83q-41 19 -83 19q-80 0 -136 -56t-56 -136t56 -136t136 -56t136 56t56 136q0 42 -19 83q41 -19 83 -19q80 0 136 56t56 136zM1683 320q0 -17 -49 -66t-66 -49q-9 0 -28.5 16t-36.5 33t-38.5 40t-24.5 26 l-96 -96l220 -220q28 -28 28 -68q0 -42 -39 -81t-81 -39q-40 0 -68 28l-671 671q-176 -131 -365 -131q-163 0 -265.5 102.5t-102.5 265.5q0 160 95 313t248 248t313 95q163 0 265.5 -102.5t102.5 -265.5q0 -189 -131 -365l355 -355l96 96q-3 3 -26 24.5t-40 38.5t-33 36.5 t-16 28.5q0 17 49 66t66 49q13 0 23 -10q6 -6 46 -44.5t82 -79.5t86.5 -86t73 -78t28.5 -41z" />
+<glyph unicode="&#xf085;" horiz-adv-x="1920" d="M896 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1664 128q0 52 -38 90t-90 38t-90 -38t-38 -90q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 1152q0 52 -38 90t-90 38t-90 -38t-38 -90q0 -53 37.5 -90.5t90.5 -37.5 t90.5 37.5t37.5 90.5zM1280 731v-185q0 -10 -7 -19.5t-16 -10.5l-155 -24q-11 -35 -32 -76q34 -48 90 -115q7 -10 7 -20q0 -12 -7 -19q-23 -30 -82.5 -89.5t-78.5 -59.5q-11 0 -21 7l-115 90q-37 -19 -77 -31q-11 -108 -23 -155q-7 -24 -30 -24h-186q-11 0 -20 7.5t-10 17.5 l-23 153q-34 10 -75 31l-118 -89q-7 -7 -20 -7q-11 0 -21 8q-144 133 -144 160q0 9 7 19q10 14 41 53t47 61q-23 44 -35 82l-152 24q-10 1 -17 9.5t-7 19.5v185q0 10 7 19.5t16 10.5l155 24q11 35 32 76q-34 48 -90 115q-7 11 -7 20q0 12 7 20q22 30 82 89t79 59q11 0 21 -7 l115 -90q34 18 77 32q11 108 23 154q7 24 30 24h186q11 0 20 -7.5t10 -17.5l23 -153q34 -10 75 -31l118 89q8 7 20 7q11 0 21 -8q144 -133 144 -160q0 -9 -7 -19q-12 -16 -42 -54t-45 -60q23 -48 34 -82l152 -23q10 -2 17 -10.5t7 -19.5zM1920 198v-140q0 -16 -149 -31 q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20 t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31zM1920 1222v-140q0 -16 -149 -31q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68 q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70 q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31z" />
+<glyph unicode="&#xf086;" horiz-adv-x="1792" d="M1408 768q0 -139 -94 -257t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224 q0 139 94 257t256.5 186.5t353.5 68.5t353.5 -68.5t256.5 -186.5t94 -257zM1792 512q0 -120 -71 -224.5t-195 -176.5q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7 q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132q58 -4 88 -4q161 0 309 45t264 129q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230z" />
+<glyph unicode="&#xf087;" d="M256 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 768q0 51 -39 89.5t-89 38.5h-352q0 58 48 159.5t48 160.5q0 98 -32 145t-128 47q-26 -26 -38 -85t-30.5 -125.5t-59.5 -109.5q-22 -23 -77 -91q-4 -5 -23 -30t-31.5 -41t-34.5 -42.5 t-40 -44t-38.5 -35.5t-40 -27t-35.5 -9h-32v-640h32q13 0 31.5 -3t33 -6.5t38 -11t35 -11.5t35.5 -12.5t29 -10.5q211 -73 342 -73h121q192 0 192 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5q32 1 53.5 47t21.5 81zM1536 769 q0 -89 -49 -163q9 -33 9 -69q0 -77 -38 -144q3 -21 3 -43q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5h-36h-93q-96 0 -189.5 22.5t-216.5 65.5q-116 40 -138 40h-288q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5h274q36 24 137 155q58 75 107 128 q24 25 35.5 85.5t30.5 126.5t62 108q39 37 90 37q84 0 151 -32.5t102 -101.5t35 -186q0 -93 -48 -192h176q104 0 180 -76t76 -179z" />
+<glyph unicode="&#xf088;" d="M256 1088q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 512q0 35 -21.5 81t-53.5 47q15 17 25 47.5t10 55.5q0 69 -53 119q18 32 18 69t-17.5 73.5t-47.5 52.5q5 30 5 56q0 85 -49 126t-136 41h-128q-131 0 -342 -73q-5 -2 -29 -10.5 t-35.5 -12.5t-35 -11.5t-38 -11t-33 -6.5t-31.5 -3h-32v-640h32q16 0 35.5 -9t40 -27t38.5 -35.5t40 -44t34.5 -42.5t31.5 -41t23 -30q55 -68 77 -91q41 -43 59.5 -109.5t30.5 -125.5t38 -85q96 0 128 47t32 145q0 59 -48 160.5t-48 159.5h352q50 0 89 38.5t39 89.5z M1536 511q0 -103 -76 -179t-180 -76h-176q48 -99 48 -192q0 -118 -35 -186q-35 -69 -102 -101.5t-151 -32.5q-51 0 -90 37q-34 33 -54 82t-25.5 90.5t-17.5 84.5t-31 64q-48 50 -107 127q-101 131 -137 155h-274q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5 h288q22 0 138 40q128 44 223 66t200 22h112q140 0 226.5 -79t85.5 -216v-5q60 -77 60 -178q0 -22 -3 -43q38 -67 38 -144q0 -36 -9 -69q49 -74 49 -163z" />
+<glyph unicode="&#xf089;" horiz-adv-x="896" d="M832 1504v-1339l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41z" />
+<glyph unicode="&#xf08a;" horiz-adv-x="1792" d="M1664 940q0 81 -21.5 143t-55 98.5t-81.5 59.5t-94 31t-98 8t-112 -25.5t-110.5 -64t-86.5 -72t-60 -61.5q-18 -22 -49 -22t-49 22q-24 28 -60 61.5t-86.5 72t-110.5 64t-112 25.5t-98 -8t-94 -31t-81.5 -59.5t-55 -98.5t-21.5 -143q0 -168 187 -355l581 -560l580 559 q188 188 188 356zM1792 940q0 -221 -229 -450l-623 -600q-18 -18 -44 -18t-44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5 q224 0 351 -124t127 -344z" />
+<glyph unicode="&#xf08b;" horiz-adv-x="1664" d="M640 96q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-119 0 -203.5 84.5t-84.5 203.5v704q0 119 84.5 203.5t203.5 84.5h320q13 0 22.5 -9.5t9.5 -22.5q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-66 0 -113 -47t-47 -113v-704 q0 -66 47 -113t113 -47h288h11h13t11.5 -1t11.5 -3t8 -5.5t7 -9t2 -13.5zM1568 640q0 -26 -19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45z" />
+<glyph unicode="&#xf08c;" d="M237 122h231v694h-231v-694zM483 1030q-1 52 -36 86t-93 34t-94.5 -34t-36.5 -86q0 -51 35.5 -85.5t92.5 -34.5h1q59 0 95 34.5t36 85.5zM1068 122h231v398q0 154 -73 233t-193 79q-136 0 -209 -117h2v101h-231q3 -66 0 -694h231v388q0 38 7 56q15 35 45 59.5t74 24.5 q116 0 116 -157v-371zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf08d;" horiz-adv-x="1152" d="M480 672v448q0 14 -9 23t-23 9t-23 -9t-9 -23v-448q0 -14 9 -23t23 -9t23 9t9 23zM1152 320q0 -26 -19 -45t-45 -19h-429l-51 -483q-2 -12 -10.5 -20.5t-20.5 -8.5h-1q-27 0 -32 27l-76 485h-404q-26 0 -45 19t-19 45q0 123 78.5 221.5t177.5 98.5v512q-52 0 -90 38 t-38 90t38 90t90 38h640q52 0 90 -38t38 -90t-38 -90t-90 -38v-512q99 0 177.5 -98.5t78.5 -221.5z" />
+<glyph unicode="&#xf08e;" horiz-adv-x="1792" d="M1408 608v-320q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v320 q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1792 1472v-512q0 -26 -19 -45t-45 -19t-45 19l-176 176l-652 -652q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l652 652l-176 176q-19 19 -19 45t19 45t45 19h512q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf090;" d="M1184 640q0 -26 -19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45zM1536 992v-704q0 -119 -84.5 -203.5t-203.5 -84.5h-320q-13 0 -22.5 9.5t-9.5 22.5 q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q66 0 113 47t47 113v704q0 66 -47 113t-113 47h-288h-11h-13t-11.5 1t-11.5 3t-8 5.5t-7 9t-2 13.5q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf091;" horiz-adv-x="1664" d="M458 653q-74 162 -74 371h-256v-96q0 -78 94.5 -162t235.5 -113zM1536 928v96h-256q0 -209 -74 -371q141 29 235.5 113t94.5 162zM1664 1056v-128q0 -71 -41.5 -143t-112 -130t-173 -97.5t-215.5 -44.5q-42 -54 -95 -95q-38 -34 -52.5 -72.5t-14.5 -89.5q0 -54 30.5 -91 t97.5 -37q75 0 133.5 -45.5t58.5 -114.5v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 69 58.5 114.5t133.5 45.5q67 0 97.5 37t30.5 91q0 51 -14.5 89.5t-52.5 72.5q-53 41 -95 95q-113 5 -215.5 44.5t-173 97.5t-112 130t-41.5 143v128q0 40 28 68t68 28h288v96 q0 66 47 113t113 47h576q66 0 113 -47t47 -113v-96h288q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf092;" d="M394 184q-8 -9 -20 3q-13 11 -4 19q8 9 20 -3q12 -11 4 -19zM352 245q9 -12 0 -19q-8 -6 -17 7t0 18q9 7 17 -6zM291 305q-5 -7 -13 -2q-10 5 -7 12q3 5 13 2q10 -5 7 -12zM322 271q-6 -7 -16 3q-9 11 -2 16q6 6 16 -3q9 -11 2 -16zM451 159q-4 -12 -19 -6q-17 4 -13 15 t19 7q16 -5 13 -16zM514 154q0 -11 -16 -11q-17 -2 -17 11q0 11 16 11q17 2 17 -11zM572 164q2 -10 -14 -14t-18 8t14 15q16 2 18 -9zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-224q-16 0 -24.5 1t-19.5 5t-16 14.5t-5 27.5v239q0 97 -52 142q57 6 102.5 18t94 39 t81 66.5t53 105t20.5 150.5q0 121 -79 206q37 91 -8 204q-28 9 -81 -11t-92 -44l-38 -24q-93 26 -192 26t-192 -26q-16 11 -42.5 27t-83.5 38.5t-86 13.5q-44 -113 -7 -204q-79 -85 -79 -206q0 -85 20.5 -150t52.5 -105t80.5 -67t94 -39t102.5 -18q-40 -36 -49 -103 q-21 -10 -45 -15t-57 -5t-65.5 21.5t-55.5 62.5q-19 32 -48.5 52t-49.5 24l-20 3q-21 0 -29 -4.5t-5 -11.5t9 -14t13 -12l7 -5q22 -10 43.5 -38t31.5 -51l10 -23q13 -38 44 -61.5t67 -30t69.5 -7t55.5 3.5l23 4q0 -38 0.5 -103t0.5 -68q0 -22 -11 -33.5t-22 -13t-33 -1.5 h-224q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf093;" horiz-adv-x="1664" d="M1280 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 288v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h427q21 -56 70.5 -92 t110.5 -36h256q61 0 110.5 36t70.5 92h427q40 0 68 -28t28 -68zM1339 936q-17 -40 -59 -40h-256v-448q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v448h-256q-42 0 -59 40q-17 39 14 69l448 448q18 19 45 19t45 -19l448 -448q31 -30 14 -69z" />
+<glyph unicode="&#xf094;" d="M1407 710q0 44 -7 113.5t-18 96.5q-12 30 -17 44t-9 36.5t-4 48.5q0 23 5 68.5t5 67.5q0 37 -10 55q-4 1 -13 1q-19 0 -58 -4.5t-59 -4.5q-60 0 -176 24t-175 24q-43 0 -94.5 -11.5t-85 -23.5t-89.5 -34q-137 -54 -202 -103q-96 -73 -159.5 -189.5t-88 -236t-24.5 -248.5 q0 -40 12.5 -120t12.5 -121q0 -23 -11 -66.5t-11 -65.5t12 -36.5t34 -14.5q24 0 72.5 11t73.5 11q57 0 169.5 -15.5t169.5 -15.5q181 0 284 36q129 45 235.5 152.5t166 245.5t59.5 275zM1535 712q0 -165 -70 -327.5t-196 -288t-281 -180.5q-124 -44 -326 -44 q-57 0 -170 14.5t-169 14.5q-24 0 -72.5 -14.5t-73.5 -14.5q-73 0 -123.5 55.5t-50.5 128.5q0 24 11 68t11 67q0 40 -12.5 120.5t-12.5 121.5q0 111 18 217.5t54.5 209.5t100.5 194t150 156q78 59 232 120q194 78 316 78q60 0 175.5 -24t173.5 -24q19 0 57 5t58 5 q81 0 118 -50.5t37 -134.5q0 -23 -5 -68t-5 -68q0 -10 1 -18.5t3 -17t4 -13.5t6.5 -16t6.5 -17q16 -40 25 -118.5t9 -136.5z" />
+<glyph unicode="&#xf095;" horiz-adv-x="1408" d="M1408 296q0 -27 -10 -70.5t-21 -68.5q-21 -50 -122 -106q-94 -51 -186 -51q-27 0 -52.5 3.5t-57.5 12.5t-47.5 14.5t-55.5 20.5t-49 18q-98 35 -175 83q-128 79 -264.5 215.5t-215.5 264.5q-48 77 -83 175q-3 9 -18 49t-20.5 55.5t-14.5 47.5t-12.5 57.5t-3.5 52.5 q0 92 51 186q56 101 106 122q25 11 68.5 21t70.5 10q14 0 21 -3q18 -6 53 -76q11 -19 30 -54t35 -63.5t31 -53.5q3 -4 17.5 -25t21.5 -35.5t7 -28.5q0 -20 -28.5 -50t-62 -55t-62 -53t-28.5 -46q0 -9 5 -22.5t8.5 -20.5t14 -24t11.5 -19q76 -137 174 -235t235 -174 q2 -1 19 -11.5t24 -14t20.5 -8.5t22.5 -5q18 0 46 28.5t53 62t55 62t50 28.5q14 0 28.5 -7t35.5 -21.5t25 -17.5q25 -15 53.5 -31t63.5 -35t54 -30q70 -35 76 -53q3 -7 3 -21z" />
+<glyph unicode="&#xf096;" horiz-adv-x="1408" d="M1120 1280h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v832q0 66 -47 113t-113 47zM1408 1120v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832 q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf097;" horiz-adv-x="1280" d="M1152 1280h-1024v-1242l423 406l89 85l89 -85l423 -406v1242zM1164 1408q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62v1289 q0 34 19.5 62t52.5 41q21 9 44 9h1048z" />
+<glyph unicode="&#xf098;" d="M1280 343q0 11 -2 16q-3 8 -38.5 29.5t-88.5 49.5l-53 29q-5 3 -19 13t-25 15t-21 5q-18 0 -47 -32.5t-57 -65.5t-44 -33q-7 0 -16.5 3.5t-15.5 6.5t-17 9.5t-14 8.5q-99 55 -170.5 126.5t-126.5 170.5q-2 3 -8.5 14t-9.5 17t-6.5 15.5t-3.5 16.5q0 13 20.5 33.5t45 38.5 t45 39.5t20.5 36.5q0 10 -5 21t-15 25t-13 19q-3 6 -15 28.5t-25 45.5t-26.5 47.5t-25 40.5t-16.5 18t-16 2q-48 0 -101 -22q-46 -21 -80 -94.5t-34 -130.5q0 -16 2.5 -34t5 -30.5t9 -33t10 -29.5t12.5 -33t11 -30q60 -164 216.5 -320.5t320.5 -216.5q6 -2 30 -11t33 -12.5 t29.5 -10t33 -9t30.5 -5t34 -2.5q57 0 130.5 34t94.5 80q22 53 22 101zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf099;" horiz-adv-x="1664" d="M1620 1128q-67 -98 -162 -167q1 -14 1 -42q0 -130 -38 -259.5t-115.5 -248.5t-184.5 -210.5t-258 -146t-323 -54.5q-271 0 -496 145q35 -4 78 -4q225 0 401 138q-105 2 -188 64.5t-114 159.5q33 -5 61 -5q43 0 85 11q-112 23 -185.5 111.5t-73.5 205.5v4q68 -38 146 -41 q-66 44 -105 115t-39 154q0 88 44 163q121 -149 294.5 -238.5t371.5 -99.5q-8 38 -8 74q0 134 94.5 228.5t228.5 94.5q140 0 236 -102q109 21 205 78q-37 -115 -142 -178q93 10 186 50z" />
+<glyph unicode="&#xf09a;" horiz-adv-x="768" d="M511 980h257l-30 -284h-227v-824h-341v824h-170v284h170v171q0 182 86 275.5t283 93.5h227v-284h-142q-39 0 -62.5 -6.5t-34 -23.5t-13.5 -34.5t-3 -49.5v-142z" />
+<glyph unicode="&#xf09b;" d="M1536 640q0 -251 -146.5 -451.5t-378.5 -277.5q-27 -5 -39.5 7t-12.5 30v211q0 97 -52 142q57 6 102.5 18t94 39t81 66.5t53 105t20.5 150.5q0 121 -79 206q37 91 -8 204q-28 9 -81 -11t-92 -44l-38 -24q-93 26 -192 26t-192 -26q-16 11 -42.5 27t-83.5 38.5t-86 13.5 q-44 -113 -7 -204q-79 -85 -79 -206q0 -85 20.5 -150t52.5 -105t80.5 -67t94 -39t102.5 -18q-40 -36 -49 -103q-21 -10 -45 -15t-57 -5t-65.5 21.5t-55.5 62.5q-19 32 -48.5 52t-49.5 24l-20 3q-21 0 -29 -4.5t-5 -11.5t9 -14t13 -12l7 -5q22 -10 43.5 -38t31.5 -51l10 -23 q13 -38 44 -61.5t67 -30t69.5 -7t55.5 3.5l23 4q0 -38 0.5 -89t0.5 -54q0 -18 -13 -30t-40 -7q-232 77 -378.5 277.5t-146.5 451.5q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf09c;" horiz-adv-x="1664" d="M1664 960v-256q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45v256q0 106 -75 181t-181 75t-181 -75t-75 -181v-192h96q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h672v192q0 185 131.5 316.5t316.5 131.5 t316.5 -131.5t131.5 -316.5z" />
+<glyph unicode="&#xf09d;" horiz-adv-x="1920" d="M1760 1408q66 0 113 -47t47 -113v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600zM160 1280q-13 0 -22.5 -9.5t-9.5 -22.5v-224h1664v224q0 13 -9.5 22.5t-22.5 9.5h-1600zM1760 0q13 0 22.5 9.5t9.5 22.5v608h-1664v-608 q0 -13 9.5 -22.5t22.5 -9.5h1600zM256 128v128h256v-128h-256zM640 128v128h384v-128h-384z" />
+<glyph unicode="&#xf09e;" horiz-adv-x="1408" d="M384 192q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM896 69q2 -28 -17 -48q-18 -21 -47 -21h-135q-25 0 -43 16.5t-20 41.5q-22 229 -184.5 391.5t-391.5 184.5q-25 2 -41.5 20t-16.5 43v135q0 29 21 47q17 17 43 17h5q160 -13 306 -80.5 t259 -181.5q114 -113 181.5 -259t80.5 -306zM1408 67q2 -27 -18 -47q-18 -20 -46 -20h-143q-26 0 -44.5 17.5t-19.5 42.5q-12 215 -101 408.5t-231.5 336t-336 231.5t-408.5 102q-25 1 -42.5 19.5t-17.5 43.5v143q0 28 20 46q18 18 44 18h3q262 -13 501.5 -120t425.5 -294 q187 -186 294 -425.5t120 -501.5z" />
+<glyph unicode="&#xf0a0;" d="M1040 320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5zM1296 320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5zM1408 160v320q0 13 -9.5 22.5t-22.5 9.5 h-1216q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h1216q13 0 22.5 9.5t9.5 22.5zM178 640h1180l-157 482q-4 13 -16 21.5t-26 8.5h-782q-14 0 -26 -8.5t-16 -21.5zM1536 480v-320q0 -66 -47 -113t-113 -47h-1216q-66 0 -113 47t-47 113v320q0 25 16 75 l197 606q17 53 63 86t101 33h782q55 0 101 -33t63 -86l197 -606q16 -50 16 -75z" />
+<glyph unicode="&#xf0a1;" horiz-adv-x="1792" d="M1664 896q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5v-384q0 -52 -38 -90t-90 -38q-417 347 -812 380q-58 -19 -91 -66t-31 -100.5t40 -92.5q-20 -33 -23 -65.5t6 -58t33.5 -55t48 -50t61.5 -50.5q-29 -58 -111.5 -83t-168.5 -11.5t-132 55.5q-7 23 -29.5 87.5 t-32 94.5t-23 89t-15 101t3.5 98.5t22 110.5h-122q-66 0 -113 47t-47 113v192q0 66 47 113t113 47h480q435 0 896 384q52 0 90 -38t38 -90v-384zM1536 292v954q-394 -302 -768 -343v-270q377 -42 768 -341z" />
+<glyph unicode="&#xf0a2;" horiz-adv-x="1664" d="M848 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM183 128h1298q-164 181 -246.5 411.5t-82.5 484.5q0 256 -320 256t-320 -256q0 -254 -82.5 -484.5t-246.5 -411.5zM1664 128q0 -52 -38 -90t-90 -38 h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38t-38 90q190 161 287 397.5t97 498.5q0 165 96 262t264 117q-8 18 -8 37q0 40 28 68t68 28t68 -28t28 -68q0 -19 -8 -37q168 -20 264 -117t96 -262q0 -262 97 -498.5t287 -397.5z" />
+<glyph unicode="&#xf0a3;" d="M1376 640l138 -135q30 -28 20 -70q-12 -41 -52 -51l-188 -48l53 -186q12 -41 -19 -70q-29 -31 -70 -19l-186 53l-48 -188q-10 -40 -51 -52q-12 -2 -19 -2q-31 0 -51 22l-135 138l-135 -138q-28 -30 -70 -20q-41 11 -51 52l-48 188l-186 -53q-41 -12 -70 19q-31 29 -19 70 l53 186l-188 48q-40 10 -52 51q-10 42 20 70l138 135l-138 135q-30 28 -20 70q12 41 52 51l188 48l-53 186q-12 41 19 70q29 31 70 19l186 -53l48 188q10 41 51 51q41 12 70 -19l135 -139l135 139q29 30 70 19q41 -10 51 -51l48 -188l186 53q41 12 70 -19q31 -29 19 -70 l-53 -186l188 -48q40 -10 52 -51q10 -42 -20 -70z" />
+<glyph unicode="&#xf0a4;" horiz-adv-x="1792" d="M256 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 768q0 51 -39 89.5t-89 38.5h-576q0 20 15 48.5t33 55t33 68t15 84.5q0 67 -44.5 97.5t-115.5 30.5q-24 0 -90 -139q-24 -44 -37 -65q-40 -64 -112 -145q-71 -81 -101 -106 q-69 -57 -140 -57h-32v-640h32q72 0 167 -32t193.5 -64t179.5 -32q189 0 189 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5h331q52 0 90 38t38 90zM1792 769q0 -105 -75.5 -181t-180.5 -76h-169q-4 -62 -37 -119q3 -21 3 -43 q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5q-133 0 -322 69q-164 59 -223 59h-288q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5h288q10 0 21.5 4.5t23.5 14t22.5 18t24 22.5t20.5 21.5t19 21.5t14 17q65 74 100 129q13 21 33 62t37 72t40.5 63t55 49.5 t69.5 17.5q125 0 206.5 -67t81.5 -189q0 -68 -22 -128h374q104 0 180 -76t76 -179z" />
+<glyph unicode="&#xf0a5;" horiz-adv-x="1792" d="M1376 128h32v640h-32q-35 0 -67.5 12t-62.5 37t-50 46t-49 54q-2 3 -3.5 4.5t-4 4.5t-4.5 5q-72 81 -112 145q-14 22 -38 68q-1 3 -10.5 22.5t-18.5 36t-20 35.5t-21.5 30.5t-18.5 11.5q-71 0 -115.5 -30.5t-44.5 -97.5q0 -43 15 -84.5t33 -68t33 -55t15 -48.5h-576 q-50 0 -89 -38.5t-39 -89.5q0 -52 38 -90t90 -38h331q-15 -17 -25 -47.5t-10 -55.5q0 -69 53 -119q-18 -32 -18 -69t17.5 -73.5t47.5 -52.5q-4 -24 -4 -56q0 -85 48.5 -126t135.5 -41q84 0 183 32t194 64t167 32zM1664 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45 t45 -19t45 19t19 45zM1792 768v-640q0 -53 -37.5 -90.5t-90.5 -37.5h-288q-59 0 -223 -59q-190 -69 -317 -69q-142 0 -230 77.5t-87 217.5l1 5q-61 76 -61 178q0 22 3 43q-33 57 -37 119h-169q-105 0 -180.5 76t-75.5 181q0 103 76 179t180 76h374q-22 60 -22 128 q0 122 81.5 189t206.5 67q38 0 69.5 -17.5t55 -49.5t40.5 -63t37 -72t33 -62q35 -55 100 -129q2 -3 14 -17t19 -21.5t20.5 -21.5t24 -22.5t22.5 -18t23.5 -14t21.5 -4.5h288q53 0 90.5 -37.5t37.5 -90.5z" />
+<glyph unicode="&#xf0a6;" d="M1280 -64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 700q0 189 -167 189q-26 0 -56 -5q-16 30 -52.5 47.5t-73.5 17.5t-69 -18q-50 53 -119 53q-25 0 -55.5 -10t-47.5 -25v331q0 52 -38 90t-90 38q-51 0 -89.5 -39t-38.5 -89v-576 q-20 0 -48.5 15t-55 33t-68 33t-84.5 15q-67 0 -97.5 -44.5t-30.5 -115.5q0 -24 139 -90q44 -24 65 -37q64 -40 145 -112q81 -71 106 -101q57 -69 57 -140v-32h640v32q0 72 32 167t64 193.5t32 179.5zM1536 705q0 -133 -69 -322q-59 -164 -59 -223v-288q0 -53 -37.5 -90.5 t-90.5 -37.5h-640q-53 0 -90.5 37.5t-37.5 90.5v288q0 10 -4.5 21.5t-14 23.5t-18 22.5t-22.5 24t-21.5 20.5t-21.5 19t-17 14q-74 65 -129 100q-21 13 -62 33t-72 37t-63 40.5t-49.5 55t-17.5 69.5q0 125 67 206.5t189 81.5q68 0 128 -22v374q0 104 76 180t179 76 q105 0 181 -75.5t76 -180.5v-169q62 -4 119 -37q21 3 43 3q101 0 178 -60q139 1 219.5 -85t80.5 -227z" />
+<glyph unicode="&#xf0a7;" d="M1408 576q0 84 -32 183t-64 194t-32 167v32h-640v-32q0 -35 -12 -67.5t-37 -62.5t-46 -50t-54 -49q-9 -8 -14 -12q-81 -72 -145 -112q-22 -14 -68 -38q-3 -1 -22.5 -10.5t-36 -18.5t-35.5 -20t-30.5 -21.5t-11.5 -18.5q0 -71 30.5 -115.5t97.5 -44.5q43 0 84.5 15t68 33 t55 33t48.5 15v-576q0 -50 38.5 -89t89.5 -39q52 0 90 38t38 90v331q46 -35 103 -35q69 0 119 53q32 -18 69 -18t73.5 17.5t52.5 47.5q24 -4 56 -4q85 0 126 48.5t41 135.5zM1280 1344q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 580 q0 -142 -77.5 -230t-217.5 -87l-5 1q-76 -61 -178 -61q-22 0 -43 3q-54 -30 -119 -37v-169q0 -105 -76 -180.5t-181 -75.5q-103 0 -179 76t-76 180v374q-54 -22 -128 -22q-121 0 -188.5 81.5t-67.5 206.5q0 38 17.5 69.5t49.5 55t63 40.5t72 37t62 33q55 35 129 100 q3 2 17 14t21.5 19t21.5 20.5t22.5 24t18 22.5t14 23.5t4.5 21.5v288q0 53 37.5 90.5t90.5 37.5h640q53 0 90.5 -37.5t37.5 -90.5v-288q0 -59 59 -223q69 -190 69 -317z" />
+<glyph unicode="&#xf0a8;" d="M1280 576v128q0 26 -19 45t-45 19h-502l189 189q19 19 19 45t-19 45l-91 91q-18 18 -45 18t-45 -18l-362 -362l-91 -91q-18 -18 -18 -45t18 -45l91 -91l362 -362q18 -18 45 -18t45 18l91 91q18 18 18 45t-18 45l-189 189h502q26 0 45 19t19 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf0a9;" d="M1285 640q0 27 -18 45l-91 91l-362 362q-18 18 -45 18t-45 -18l-91 -91q-18 -18 -18 -45t18 -45l189 -189h-502q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h502l-189 -189q-19 -19 -19 -45t19 -45l91 -91q18 -18 45 -18t45 18l362 362l91 91q18 18 18 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf0aa;" d="M1284 641q0 27 -18 45l-362 362l-91 91q-18 18 -45 18t-45 -18l-91 -91l-362 -362q-18 -18 -18 -45t18 -45l91 -91q18 -18 45 -18t45 18l189 189v-502q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v502l189 -189q19 -19 45 -19t45 19l91 91q18 18 18 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf0ab;" d="M1284 639q0 27 -18 45l-91 91q-18 18 -45 18t-45 -18l-189 -189v502q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-502l-189 189q-19 19 -45 19t-45 -19l-91 -91q-18 -18 -18 -45t18 -45l362 -362l91 -91q18 -18 45 -18t45 18l91 91l362 362q18 18 18 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf0ac;" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM1042 887q-2 -1 -9.5 -9.5t-13.5 -9.5q2 0 4.5 5t5 11t3.5 7q6 7 22 15q14 6 52 12q34 8 51 -11 q-2 2 9.5 13t14.5 12q3 2 15 4.5t15 7.5l2 22q-12 -1 -17.5 7t-6.5 21q0 -2 -6 -8q0 7 -4.5 8t-11.5 -1t-9 -1q-10 3 -15 7.5t-8 16.5t-4 15q-2 5 -9.5 10.5t-9.5 10.5q-1 2 -2.5 5.5t-3 6.5t-4 5.5t-5.5 2.5t-7 -5t-7.5 -10t-4.5 -5q-3 2 -6 1.5t-4.5 -1t-4.5 -3t-5 -3.5 q-3 -2 -8.5 -3t-8.5 -2q15 5 -1 11q-10 4 -16 3q9 4 7.5 12t-8.5 14h5q-1 4 -8.5 8.5t-17.5 8.5t-13 6q-8 5 -34 9.5t-33 0.5q-5 -6 -4.5 -10.5t4 -14t3.5 -12.5q1 -6 -5.5 -13t-6.5 -12q0 -7 14 -15.5t10 -21.5q-3 -8 -16 -16t-16 -12q-5 -8 -1.5 -18.5t10.5 -16.5 q2 -2 1.5 -4t-3.5 -4.5t-5.5 -4t-6.5 -3.5l-3 -2q-11 -5 -20.5 6t-13.5 26q-7 25 -16 30q-23 8 -29 -1q-5 13 -41 26q-25 9 -58 4q6 1 0 15q-7 15 -19 12q3 6 4 17.5t1 13.5q3 13 12 23q1 1 7 8.5t9.5 13.5t0.5 6q35 -4 50 11q5 5 11.5 17t10.5 17q9 6 14 5.5t14.5 -5.5 t14.5 -5q14 -1 15.5 11t-7.5 20q12 -1 3 17q-5 7 -8 9q-12 4 -27 -5q-8 -4 2 -8q-1 1 -9.5 -10.5t-16.5 -17.5t-16 5q-1 1 -5.5 13.5t-9.5 13.5q-8 0 -16 -15q3 8 -11 15t-24 8q19 12 -8 27q-7 4 -20.5 5t-19.5 -4q-5 -7 -5.5 -11.5t5 -8t10.5 -5.5t11.5 -4t8.5 -3 q14 -10 8 -14q-2 -1 -8.5 -3.5t-11.5 -4.5t-6 -4q-3 -4 0 -14t-2 -14q-5 5 -9 17.5t-7 16.5q7 -9 -25 -6l-10 1q-4 0 -16 -2t-20.5 -1t-13.5 8q-4 8 0 20q1 4 4 2q-4 3 -11 9.5t-10 8.5q-46 -15 -94 -41q6 -1 12 1q5 2 13 6.5t10 5.5q34 14 42 7l5 5q14 -16 20 -25 q-7 4 -30 1q-20 -6 -22 -12q7 -12 5 -18q-4 3 -11.5 10t-14.5 11t-15 5q-16 0 -22 -1q-146 -80 -235 -222q7 -7 12 -8q4 -1 5 -9t2.5 -11t11.5 3q9 -8 3 -19q1 1 44 -27q19 -17 21 -21q3 -11 -10 -18q-1 2 -9 9t-9 4q-3 -5 0.5 -18.5t10.5 -12.5q-7 0 -9.5 -16t-2.5 -35.5 t-1 -23.5l2 -1q-3 -12 5.5 -34.5t21.5 -19.5q-13 -3 20 -43q6 -8 8 -9q3 -2 12 -7.5t15 -10t10 -10.5q4 -5 10 -22.5t14 -23.5q-2 -6 9.5 -20t10.5 -23q-1 0 -2.5 -1t-2.5 -1q3 -7 15.5 -14t15.5 -13q1 -3 2 -10t3 -11t8 -2q2 20 -24 62q-15 25 -17 29q-3 5 -5.5 15.5 t-4.5 14.5q2 0 6 -1.5t8.5 -3.5t7.5 -4t2 -3q-3 -7 2 -17.5t12 -18.5t17 -19t12 -13q6 -6 14 -19.5t0 -13.5q9 0 20 -10t17 -20q5 -8 8 -26t5 -24q2 -7 8.5 -13.5t12.5 -9.5l16 -8t13 -7q5 -2 18.5 -10.5t21.5 -11.5q10 -4 16 -4t14.5 2.5t13.5 3.5q15 2 29 -15t21 -21 q36 -19 55 -11q-2 -1 0.5 -7.5t8 -15.5t9 -14.5t5.5 -8.5q5 -6 18 -15t18 -15q6 4 7 9q-3 -8 7 -20t18 -10q14 3 14 32q-31 -15 -49 18q0 1 -2.5 5.5t-4 8.5t-2.5 8.5t0 7.5t5 3q9 0 10 3.5t-2 12.5t-4 13q-1 8 -11 20t-12 15q-5 -9 -16 -8t-16 9q0 -1 -1.5 -5.5t-1.5 -6.5 q-13 0 -15 1q1 3 2.5 17.5t3.5 22.5q1 4 5.5 12t7.5 14.5t4 12.5t-4.5 9.5t-17.5 2.5q-19 -1 -26 -20q-1 -3 -3 -10.5t-5 -11.5t-9 -7q-7 -3 -24 -2t-24 5q-13 8 -22.5 29t-9.5 37q0 10 2.5 26.5t3 25t-5.5 24.5q3 2 9 9.5t10 10.5q2 1 4.5 1.5t4.5 0t4 1.5t3 6q-1 1 -4 3 q-3 3 -4 3q7 -3 28.5 1.5t27.5 -1.5q15 -11 22 2q0 1 -2.5 9.5t-0.5 13.5q5 -27 29 -9q3 -3 15.5 -5t17.5 -5q3 -2 7 -5.5t5.5 -4.5t5 0.5t8.5 6.5q10 -14 12 -24q11 -40 19 -44q7 -3 11 -2t4.5 9.5t0 14t-1.5 12.5l-1 8v18l-1 8q-15 3 -18.5 12t1.5 18.5t15 18.5q1 1 8 3.5 t15.5 6.5t12.5 8q21 19 15 35q7 0 11 9q-1 0 -5 3t-7.5 5t-4.5 2q9 5 2 16q5 3 7.5 11t7.5 10q9 -12 21 -2q7 8 1 16q5 7 20.5 10.5t18.5 9.5q7 -2 8 2t1 12t3 12q4 5 15 9t13 5l17 11q3 4 0 4q18 -2 31 11q10 11 -6 20q3 6 -3 9.5t-15 5.5q3 1 11.5 0.5t10.5 1.5 q15 10 -7 16q-17 5 -43 -12zM879 10q206 36 351 189q-3 3 -12.5 4.5t-12.5 3.5q-18 7 -24 8q1 7 -2.5 13t-8 9t-12.5 8t-11 7q-2 2 -7 6t-7 5.5t-7.5 4.5t-8.5 2t-10 -1l-3 -1q-3 -1 -5.5 -2.5t-5.5 -3t-4 -3t0 -2.5q-21 17 -36 22q-5 1 -11 5.5t-10.5 7t-10 1.5t-11.5 -7 q-5 -5 -6 -15t-2 -13q-7 5 0 17.5t2 18.5q-3 6 -10.5 4.5t-12 -4.5t-11.5 -8.5t-9 -6.5t-8.5 -5.5t-8.5 -7.5q-3 -4 -6 -12t-5 -11q-2 4 -11.5 6.5t-9.5 5.5q2 -10 4 -35t5 -38q7 -31 -12 -48q-27 -25 -29 -40q-4 -22 12 -26q0 -7 -8 -20.5t-7 -21.5q0 -6 2 -16z" />
+<glyph unicode="&#xf0ad;" horiz-adv-x="1664" d="M384 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1028 484l-682 -682q-37 -37 -90 -37q-52 0 -91 37l-106 108q-38 36 -38 90q0 53 38 91l681 681q39 -98 114.5 -173.5t173.5 -114.5zM1662 919q0 -39 -23 -106q-47 -134 -164.5 -217.5 t-258.5 -83.5q-185 0 -316.5 131.5t-131.5 316.5t131.5 316.5t316.5 131.5q58 0 121.5 -16.5t107.5 -46.5q16 -11 16 -28t-16 -28l-293 -169v-224l193 -107q5 3 79 48.5t135.5 81t70.5 35.5q15 0 23.5 -10t8.5 -25z" />
+<glyph unicode="&#xf0ae;" horiz-adv-x="1792" d="M1024 128h640v128h-640v-128zM640 640h1024v128h-1024v-128zM1280 1152h384v128h-384v-128zM1792 320v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 832v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19 t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 1344v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0b0;" horiz-adv-x="1408" d="M1403 1241q17 -41 -14 -70l-493 -493v-742q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-256 256q-19 19 -19 45v486l-493 493q-31 29 -14 70q17 39 59 39h1280q42 0 59 -39z" />
+<glyph unicode="&#xf0b1;" horiz-adv-x="1792" d="M640 1280h512v128h-512v-128zM1792 640v-480q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v480h672v-160q0 -26 19 -45t45 -19h320q26 0 45 19t19 45v160h672zM1024 640v-128h-256v128h256zM1792 1120v-384h-1792v384q0 66 47 113t113 47h352v160q0 40 28 68 t68 28h576q40 0 68 -28t28 -68v-160h352q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf0b2;" d="M1283 995l-355 -355l355 -355l144 144q29 31 70 14q39 -17 39 -59v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l144 144l-355 355l-355 -355l144 -144q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l144 -144 l355 355l-355 355l-144 -144q-19 -19 -45 -19q-12 0 -24 5q-40 17 -40 59v448q0 26 19 45t45 19h448q42 0 59 -40q17 -39 -14 -69l-144 -144l355 -355l355 355l-144 144q-31 30 -14 69q17 40 59 40h448q26 0 45 -19t19 -45v-448q0 -42 -39 -59q-13 -5 -25 -5q-26 0 -45 19z " />
+<glyph unicode="&#xf0c0;" horiz-adv-x="1920" d="M593 640q-162 -5 -265 -128h-134q-82 0 -138 40.5t-56 118.5q0 353 124 353q6 0 43.5 -21t97.5 -42.5t119 -21.5q67 0 133 23q-5 -37 -5 -66q0 -139 81 -256zM1664 3q0 -120 -73 -189.5t-194 -69.5h-874q-121 0 -194 69.5t-73 189.5q0 53 3.5 103.5t14 109t26.5 108.5 t43 97.5t62 81t85.5 53.5t111.5 20q10 0 43 -21.5t73 -48t107 -48t135 -21.5t135 21.5t107 48t73 48t43 21.5q61 0 111.5 -20t85.5 -53.5t62 -81t43 -97.5t26.5 -108.5t14 -109t3.5 -103.5zM640 1280q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75 t75 -181zM1344 896q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5zM1920 671q0 -78 -56 -118.5t-138 -40.5h-134q-103 123 -265 128q81 117 81 256q0 29 -5 66q66 -23 133 -23q59 0 119 21.5t97.5 42.5 t43.5 21q124 0 124 -353zM1792 1280q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181z" />
+<glyph unicode="&#xf0c1;" horiz-adv-x="1664" d="M1456 320q0 40 -28 68l-208 208q-28 28 -68 28q-42 0 -72 -32q3 -3 19 -18.5t21.5 -21.5t15 -19t13 -25.5t3.5 -27.5q0 -40 -28 -68t-68 -28q-15 0 -27.5 3.5t-25.5 13t-19 15t-21.5 21.5t-18.5 19q-33 -31 -33 -73q0 -40 28 -68l206 -207q27 -27 68 -27q40 0 68 26 l147 146q28 28 28 67zM753 1025q0 40 -28 68l-206 207q-28 28 -68 28q-39 0 -68 -27l-147 -146q-28 -28 -28 -67q0 -40 28 -68l208 -208q27 -27 68 -27q42 0 72 31q-3 3 -19 18.5t-21.5 21.5t-15 19t-13 25.5t-3.5 27.5q0 40 28 68t68 28q15 0 27.5 -3.5t25.5 -13t19 -15 t21.5 -21.5t18.5 -19q33 31 33 73zM1648 320q0 -120 -85 -203l-147 -146q-83 -83 -203 -83q-121 0 -204 85l-206 207q-83 83 -83 203q0 123 88 209l-88 88q-86 -88 -208 -88q-120 0 -204 84l-208 208q-84 84 -84 204t85 203l147 146q83 83 203 83q121 0 204 -85l206 -207 q83 -83 83 -203q0 -123 -88 -209l88 -88q86 88 208 88q120 0 204 -84l208 -208q84 -84 84 -204z" />
+<glyph unicode="&#xf0c2;" horiz-adv-x="1920" d="M1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088q-185 0 -316.5 131.5t-131.5 316.5q0 132 71 241.5t187 163.5q-2 28 -2 43q0 212 150 362t362 150q158 0 286.5 -88t187.5 -230q70 62 166 62q106 0 181 -75t75 -181q0 -75 -41 -138q129 -30 213 -134.5t84 -239.5z " />
+<glyph unicode="&#xf0c3;" horiz-adv-x="1664" d="M1527 88q56 -89 21.5 -152.5t-140.5 -63.5h-1152q-106 0 -140.5 63.5t21.5 152.5l503 793v399h-64q-26 0 -45 19t-19 45t19 45t45 19h512q26 0 45 -19t19 -45t-19 -45t-45 -19h-64v-399zM748 813l-272 -429h712l-272 429l-20 31v37v399h-128v-399v-37z" />
+<glyph unicode="&#xf0c4;" horiz-adv-x="1792" d="M960 640q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1260 576l507 -398q28 -20 25 -56q-5 -35 -35 -51l-128 -64q-13 -7 -29 -7q-17 0 -31 8l-690 387l-110 -66q-8 -4 -12 -5q14 -49 10 -97q-7 -77 -56 -147.5t-132 -123.5q-132 -84 -277 -84 q-136 0 -222 78q-90 84 -79 207q7 76 56 147t131 124q132 84 278 84q83 0 151 -31q9 13 22 22l122 73l-122 73q-13 9 -22 22q-68 -31 -151 -31q-146 0 -278 84q-82 53 -131 124t-56 147q-5 59 15.5 113t63.5 93q85 79 222 79q145 0 277 -84q83 -52 132 -123t56 -148 q4 -48 -10 -97q4 -1 12 -5l110 -66l690 387q14 8 31 8q16 0 29 -7l128 -64q30 -16 35 -51q3 -36 -25 -56zM579 836q46 42 21 108t-106 117q-92 59 -192 59q-74 0 -113 -36q-46 -42 -21 -108t106 -117q92 -59 192 -59q74 0 113 36zM494 91q81 51 106 117t-21 108 q-39 36 -113 36q-100 0 -192 -59q-81 -51 -106 -117t21 -108q39 -36 113 -36q100 0 192 59zM672 704l96 -58v11q0 36 33 56l14 8l-79 47l-26 -26q-3 -3 -10 -11t-12 -12q-2 -2 -4 -3.5t-3 -2.5zM896 480l96 -32l736 576l-128 64l-768 -431v-113l-160 -96l9 -8q2 -2 7 -6 q4 -4 11 -12t11 -12l26 -26zM1600 64l128 64l-520 408l-177 -138q-2 -3 -13 -7z" />
+<glyph unicode="&#xf0c5;" horiz-adv-x="1792" d="M1696 1152q40 0 68 -28t28 -68v-1216q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v288h-544q-40 0 -68 28t-28 68v672q0 40 20 88t48 76l408 408q28 28 76 48t88 20h416q40 0 68 -28t28 -68v-328q68 40 128 40h416zM1152 939l-299 -299h299v299zM512 1323l-299 -299 h299v299zM708 676l316 316v416h-384v-416q0 -40 -28 -68t-68 -28h-416v-640h512v256q0 40 20 88t48 76zM1664 -128v1152h-384v-416q0 -40 -28 -68t-68 -28h-416v-640h896z" />
+<glyph unicode="&#xf0c6;" horiz-adv-x="1408" d="M1404 151q0 -117 -79 -196t-196 -79q-135 0 -235 100l-777 776q-113 115 -113 271q0 159 110 270t269 111q158 0 273 -113l605 -606q10 -10 10 -22q0 -16 -30.5 -46.5t-46.5 -30.5q-13 0 -23 10l-606 607q-79 77 -181 77q-106 0 -179 -75t-73 -181q0 -105 76 -181 l776 -777q63 -63 145 -63q64 0 106 42t42 106q0 82 -63 145l-581 581q-26 24 -60 24q-29 0 -48 -19t-19 -48q0 -32 25 -59l410 -410q10 -10 10 -22q0 -16 -31 -47t-47 -31q-12 0 -22 10l-410 410q-63 61 -63 149q0 82 57 139t139 57q88 0 149 -63l581 -581q100 -98 100 -235 z" />
+<glyph unicode="&#xf0c7;" d="M384 0h768v384h-768v-384zM1280 0h128v896q0 14 -10 38.5t-20 34.5l-281 281q-10 10 -34 20t-39 10v-416q0 -40 -28 -68t-68 -28h-576q-40 0 -68 28t-28 68v416h-128v-1280h128v416q0 40 28 68t68 28h832q40 0 68 -28t28 -68v-416zM896 928v320q0 13 -9.5 22.5t-22.5 9.5 h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5zM1536 896v-928q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h928q40 0 88 -20t76 -48l280 -280q28 -28 48 -76t20 -88z" />
+<glyph unicode="&#xf0c8;" d="M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf0c9;" d="M1536 192v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1536 704v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1536 1216v-128q0 -26 -19 -45 t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0ca;" horiz-adv-x="1792" d="M384 128q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM384 640q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5 t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5zM384 1152q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1792 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z M1792 1248v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z" />
+<glyph unicode="&#xf0cb;" horiz-adv-x="1792" d="M381 -84q0 -80 -54.5 -126t-135.5 -46q-106 0 -172 66l57 88q49 -45 106 -45q29 0 50.5 14.5t21.5 42.5q0 64 -105 56l-26 56q8 10 32.5 43.5t42.5 54t37 38.5v1q-16 0 -48.5 -1t-48.5 -1v-53h-106v152h333v-88l-95 -115q51 -12 81 -49t30 -88zM383 543v-159h-362 q-6 36 -6 54q0 51 23.5 93t56.5 68t66 47.5t56.5 43.5t23.5 45q0 25 -14.5 38.5t-39.5 13.5q-46 0 -81 -58l-85 59q24 51 71.5 79.5t105.5 28.5q73 0 123 -41.5t50 -112.5q0 -50 -34 -91.5t-75 -64.5t-75.5 -50.5t-35.5 -52.5h127v60h105zM1792 224v-192q0 -13 -9.5 -22.5 t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 14 9 23t23 9h1216q13 0 22.5 -9.5t9.5 -22.5zM384 1123v-99h-335v99h107q0 41 0.5 122t0.5 121v12h-2q-8 -17 -50 -54l-71 76l136 127h106v-404h108zM1792 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5 t-9.5 22.5v192q0 14 9 23t23 9h1216q13 0 22.5 -9.5t9.5 -22.5zM1792 1248v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z" />
+<glyph unicode="&#xf0cc;" horiz-adv-x="1792" d="M1760 640q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1728q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h1728zM483 704q-28 35 -51 80q-48 97 -48 188q0 181 134 309q133 127 393 127q50 0 167 -19q66 -12 177 -48q10 -38 21 -118q14 -123 14 -183q0 -18 -5 -45l-12 -3l-84 6 l-14 2q-50 149 -103 205q-88 91 -210 91q-114 0 -182 -59q-67 -58 -67 -146q0 -73 66 -140t279 -129q69 -20 173 -66q58 -28 95 -52h-743zM990 448h411q7 -39 7 -92q0 -111 -41 -212q-23 -55 -71 -104q-37 -35 -109 -81q-80 -48 -153 -66q-80 -21 -203 -21q-114 0 -195 23 l-140 40q-57 16 -72 28q-8 8 -8 22v13q0 108 -2 156q-1 30 0 68l2 37v44l102 2q15 -34 30 -71t22.5 -56t12.5 -27q35 -57 80 -94q43 -36 105 -57q59 -22 132 -22q64 0 139 27q77 26 122 86q47 61 47 129q0 84 -81 157q-34 29 -137 71z" />
+<glyph unicode="&#xf0cd;" d="M48 1313q-37 2 -45 4l-3 88q13 1 40 1q60 0 112 -4q132 -7 166 -7q86 0 168 3q116 4 146 5q56 0 86 2l-1 -14l2 -64v-9q-60 -9 -124 -9q-60 0 -79 -25q-13 -14 -13 -132q0 -13 0.5 -32.5t0.5 -25.5l1 -229l14 -280q6 -124 51 -202q35 -59 96 -92q88 -47 177 -47 q104 0 191 28q56 18 99 51q48 36 65 64q36 56 53 114q21 73 21 229q0 79 -3.5 128t-11 122.5t-13.5 159.5l-4 59q-5 67 -24 88q-34 35 -77 34l-100 -2l-14 3l2 86h84l205 -10q76 -3 196 10l18 -2q6 -38 6 -51q0 -7 -4 -31q-45 -12 -84 -13q-73 -11 -79 -17q-15 -15 -15 -41 q0 -7 1.5 -27t1.5 -31q8 -19 22 -396q6 -195 -15 -304q-15 -76 -41 -122q-38 -65 -112 -123q-75 -57 -182 -89q-109 -33 -255 -33q-167 0 -284 46q-119 47 -179 122q-61 76 -83 195q-16 80 -16 237v333q0 188 -17 213q-25 36 -147 39zM1536 -96v64q0 14 -9 23t-23 9h-1472 q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h1472q14 0 23 9t9 23z" />
+<glyph unicode="&#xf0ce;" horiz-adv-x="1664" d="M512 160v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM512 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 160v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23 v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM512 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 160v192 q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192 q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1664 1248v-1088q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1344q66 0 113 -47t47 -113 z" />
+<glyph unicode="&#xf0d0;" horiz-adv-x="1664" d="M1190 955l293 293l-107 107l-293 -293zM1637 1248q0 -27 -18 -45l-1286 -1286q-18 -18 -45 -18t-45 18l-198 198q-18 18 -18 45t18 45l1286 1286q18 18 45 18t45 -18l198 -198q18 -18 18 -45zM286 1438l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98zM636 1276 l196 -60l-196 -60l-60 -196l-60 196l-196 60l196 60l60 196zM1566 798l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98zM926 1438l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98z" />
+<glyph unicode="&#xf0d1;" horiz-adv-x="1792" d="M640 128q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM256 640h384v256h-158q-13 0 -22 -9l-195 -195q-9 -9 -9 -22v-30zM1536 128q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM1792 1216v-1024q0 -15 -4 -26.5t-13.5 -18.5 t-16.5 -11.5t-23.5 -6t-22.5 -2t-25.5 0t-22.5 0.5q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-64q-3 0 -22.5 -0.5t-25.5 0t-22.5 2t-23.5 6t-16.5 11.5t-13.5 18.5t-4 26.5q0 26 19 45t45 19v320q0 8 -0.5 35t0 38 t2.5 34.5t6.5 37t14 30.5t22.5 30l198 198q19 19 50.5 32t58.5 13h160v192q0 26 19 45t45 19h1024q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0d2;" d="M1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103q-111 0 -218 32q59 93 78 164q9 34 54 211q20 -39 73 -67.5t114 -28.5q121 0 216 68.5t147 188.5t52 270q0 114 -59.5 214t-172.5 163t-255 63q-105 0 -196 -29t-154.5 -77t-109 -110.5t-67 -129.5t-21.5 -134 q0 -104 40 -183t117 -111q30 -12 38 20q2 7 8 31t8 30q6 23 -11 43q-51 61 -51 151q0 151 104.5 259.5t273.5 108.5q151 0 235.5 -82t84.5 -213q0 -170 -68.5 -289t-175.5 -119q-61 0 -98 43.5t-23 104.5q8 35 26.5 93.5t30 103t11.5 75.5q0 50 -27 83t-77 33 q-62 0 -105 -57t-43 -142q0 -73 25 -122l-99 -418q-17 -70 -13 -177q-206 91 -333 281t-127 423q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf0d3;" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-725q85 122 108 210q9 34 53 209q21 -39 73.5 -67t112.5 -28q181 0 295.5 147.5t114.5 373.5q0 84 -35 162.5t-96.5 139t-152.5 97t-197 36.5q-104 0 -194.5 -28.5t-153 -76.5 t-107.5 -109.5t-66.5 -128t-21.5 -132.5q0 -102 39.5 -180t116.5 -110q13 -5 23.5 0t14.5 19q10 44 15 61q6 23 -11 42q-50 62 -50 150q0 150 103.5 256.5t270.5 106.5q149 0 232.5 -81t83.5 -210q0 -168 -67.5 -286t-173.5 -118q-60 0 -97 43.5t-23 103.5q8 34 26.5 92.5 t29.5 102t11 74.5q0 49 -26.5 81.5t-75.5 32.5q-61 0 -103.5 -56.5t-42.5 -139.5q0 -72 24 -121l-98 -414q-24 -100 -7 -254h-183q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960z" />
+<glyph unicode="&#xf0d4;" d="M678 -57q0 -38 -10 -71h-380q-95 0 -171.5 56.5t-103.5 147.5q24 45 69 77.5t100 49.5t107 24t107 7q32 0 49 -2q6 -4 30.5 -21t33 -23t31 -23t32 -25.5t27.5 -25.5t26.5 -29.5t21 -30.5t17.5 -34.5t9.5 -36t4.5 -40.5zM385 294q-234 -7 -385 -85v433q103 -118 273 -118 q32 0 70 5q-21 -61 -21 -86q0 -67 63 -149zM558 805q0 -100 -43.5 -160.5t-140.5 -60.5q-51 0 -97 26t-78 67.5t-56 93.5t-35.5 104t-11.5 99q0 96 51.5 165t144.5 69q66 0 119 -41t84 -104t47 -130t16 -128zM1536 896v-736q0 -119 -84.5 -203.5t-203.5 -84.5h-468 q39 73 39 157q0 66 -22 122.5t-55.5 93t-72 71t-72 59.5t-55.5 54.5t-22 59.5q0 36 23 68t56 61.5t65.5 64.5t55.5 93t23 131t-26.5 145.5t-75.5 118.5q-6 6 -14 11t-12.5 7.5t-10 9.5t-10.5 17h135l135 64h-437q-138 0 -244.5 -38.5t-182.5 -133.5q0 126 81 213t207 87h960 q119 0 203.5 -84.5t84.5 -203.5v-96h-256v256h-128v-256h-256v-128h256v-256h128v256h256z" />
+<glyph unicode="&#xf0d5;" horiz-adv-x="1664" d="M876 71q0 21 -4.5 40.5t-9.5 36t-17.5 34.5t-21 30.5t-26.5 29.5t-27.5 25.5t-32 25.5t-31 23t-33 23t-30.5 21q-17 2 -50 2q-54 0 -106 -7t-108 -25t-98 -46t-69 -75t-27 -107q0 -68 35.5 -121.5t93 -84t120.5 -45.5t127 -15q59 0 112.5 12.5t100.5 39t74.5 73.5 t27.5 110zM756 933q0 60 -16.5 127.5t-47 130.5t-84 104t-119.5 41q-93 0 -144 -69t-51 -165q0 -47 11.5 -99t35.5 -104t56 -93.5t78 -67.5t97 -26q97 0 140.5 60.5t43.5 160.5zM625 1408h437l-135 -79h-135q71 -45 110 -126t39 -169q0 -74 -23 -131.5t-56 -92.5t-66 -64.5 t-56 -61t-23 -67.5q0 -26 16.5 -51t43 -48t58.5 -48t64 -55.5t58.5 -66t43 -85t16.5 -106.5q0 -160 -140 -282q-152 -131 -420 -131q-59 0 -119.5 10t-122 33.5t-108.5 58t-77 89t-30 121.5q0 61 37 135q32 64 96 110.5t145 71t155 36t150 13.5q-64 83 -64 149q0 12 2 23.5 t5 19.5t8 21.5t7 21.5q-40 -5 -70 -5q-149 0 -255.5 98t-106.5 246q0 140 95 250.5t234 141.5q94 20 187 20zM1664 1152v-128h-256v-256h-128v256h-256v128h256v256h128v-256h256z" />
+<glyph unicode="&#xf0d6;" horiz-adv-x="1920" d="M768 384h384v96h-128v448h-114l-148 -137l77 -80q42 37 55 57h2v-288h-128v-96zM1280 640q0 -70 -21 -142t-59.5 -134t-101.5 -101t-138 -39t-138 39t-101.5 101t-59.5 134t-21 142t21 142t59.5 134t101.5 101t138 39t138 -39t101.5 -101t59.5 -134t21 -142zM1792 384 v512q-106 0 -181 75t-75 181h-1152q0 -106 -75 -181t-181 -75v-512q106 0 181 -75t75 -181h1152q0 106 75 181t181 75zM1920 1216v-1152q0 -26 -19 -45t-45 -19h-1792q-26 0 -45 19t-19 45v1152q0 26 19 45t45 19h1792q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0d7;" horiz-adv-x="1024" d="M1024 832q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0d8;" horiz-adv-x="1024" d="M1024 320q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" />
+<glyph unicode="&#xf0d9;" horiz-adv-x="640" d="M640 1088v-896q0 -26 -19 -45t-45 -19t-45 19l-448 448q-19 19 -19 45t19 45l448 448q19 19 45 19t45 -19t19 -45z" />
+<glyph unicode="&#xf0da;" horiz-adv-x="640" d="M576 640q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19t-19 45v896q0 26 19 45t45 19t45 -19l448 -448q19 -19 19 -45z" />
+<glyph unicode="&#xf0db;" horiz-adv-x="1664" d="M160 0h608v1152h-640v-1120q0 -13 9.5 -22.5t22.5 -9.5zM1536 32v1120h-640v-1152h608q13 0 22.5 9.5t9.5 22.5zM1664 1248v-1216q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1344q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf0dc;" horiz-adv-x="1024" d="M1024 448q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45zM1024 832q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" />
+<glyph unicode="&#xf0dd;" horiz-adv-x="1024" d="M1024 448q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0de;" horiz-adv-x="1024" d="M1024 832q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" />
+<glyph unicode="&#xf0e0;" horiz-adv-x="1792" d="M1792 826v-794q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v794q44 -49 101 -87q362 -246 497 -345q57 -42 92.5 -65.5t94.5 -48t110 -24.5h1h1q51 0 110 24.5t94.5 48t92.5 65.5q170 123 498 345q57 39 100 87zM1792 1120q0 -79 -49 -151t-122 -123 q-376 -261 -468 -325q-10 -7 -42.5 -30.5t-54 -38t-52 -32.5t-57.5 -27t-50 -9h-1h-1q-23 0 -50 9t-57.5 27t-52 32.5t-54 38t-42.5 30.5q-91 64 -262 182.5t-205 142.5q-62 42 -117 115.5t-55 136.5q0 78 41.5 130t118.5 52h1472q65 0 112.5 -47t47.5 -113z" />
+<glyph unicode="&#xf0e1;" d="M349 911v-991h-330v991h330zM370 1217q1 -73 -50.5 -122t-135.5 -49h-2q-82 0 -132 49t-50 122q0 74 51.5 122.5t134.5 48.5t133 -48.5t51 -122.5zM1536 488v-568h-329v530q0 105 -40.5 164.5t-126.5 59.5q-63 0 -105.5 -34.5t-63.5 -85.5q-11 -30 -11 -81v-553h-329 q2 399 2 647t-1 296l-1 48h329v-144h-2q20 32 41 56t56.5 52t87 43.5t114.5 15.5q171 0 275 -113.5t104 -332.5z" />
+<glyph unicode="&#xf0e2;" d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61q-172 0 -327 72.5t-264 204.5q-7 10 -6.5 22.5t8.5 20.5l137 138q10 9 25 9q16 -2 23 -12q73 -95 179 -147t225 -52q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5 t-163.5 109.5t-198.5 40.5q-98 0 -188 -35.5t-160 -101.5l137 -138q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l130 -129q107 101 244.5 156.5t284.5 55.5q156 0 298 -61t245 -164t164 -245t61 -298z" />
+<glyph unicode="&#xf0e3;" horiz-adv-x="1792" d="M1771 0q0 -53 -37 -90l-107 -108q-39 -37 -91 -37q-53 0 -90 37l-363 364q-38 36 -38 90q0 53 43 96l-256 256l-126 -126q-14 -14 -34 -14t-34 14q2 -2 12.5 -12t12.5 -13t10 -11.5t10 -13.5t6 -13.5t5.5 -16.5t1.5 -18q0 -38 -28 -68q-3 -3 -16.5 -18t-19 -20.5 t-18.5 -16.5t-22 -15.5t-22 -9t-26 -4.5q-40 0 -68 28l-408 408q-28 28 -28 68q0 13 4.5 26t9 22t15.5 22t16.5 18.5t20.5 19t18 16.5q30 28 68 28q10 0 18 -1.5t16.5 -5.5t13.5 -6t13.5 -10t11.5 -10t13 -12.5t12 -12.5q-14 14 -14 34t14 34l348 348q14 14 34 14t34 -14 q-2 2 -12.5 12t-12.5 13t-10 11.5t-10 13.5t-6 13.5t-5.5 16.5t-1.5 18q0 38 28 68q3 3 16.5 18t19 20.5t18.5 16.5t22 15.5t22 9t26 4.5q40 0 68 -28l408 -408q28 -28 28 -68q0 -13 -4.5 -26t-9 -22t-15.5 -22t-16.5 -18.5t-20.5 -19t-18 -16.5q-30 -28 -68 -28 q-10 0 -18 1.5t-16.5 5.5t-13.5 6t-13.5 10t-11.5 10t-13 12.5t-12 12.5q14 -14 14 -34t-14 -34l-126 -126l256 -256q43 43 96 43q52 0 91 -37l363 -363q37 -39 37 -91z" />
+<glyph unicode="&#xf0e4;" horiz-adv-x="1792" d="M384 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM576 832q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1004 351l101 382q6 26 -7.5 48.5t-38.5 29.5 t-48 -6.5t-30 -39.5l-101 -382q-60 -5 -107 -43.5t-63 -98.5q-20 -77 20 -146t117 -89t146 20t89 117q16 60 -6 117t-72 91zM1664 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 1024q0 53 -37.5 90.5 t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1472 832q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1792 384q0 -261 -141 -483q-19 -29 -54 -29h-1402q-35 0 -54 29 q-141 221 -141 483q0 182 71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
+<glyph unicode="&#xf0e5;" horiz-adv-x="1792" d="M896 1152q-204 0 -381.5 -69.5t-282 -187.5t-104.5 -255q0 -112 71.5 -213.5t201.5 -175.5l87 -50l-27 -96q-24 -91 -70 -172q152 63 275 171l43 38l57 -6q69 -8 130 -8q204 0 381.5 69.5t282 187.5t104.5 255t-104.5 255t-282 187.5t-381.5 69.5zM1792 640 q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22h-5q-15 0 -27 10.5t-16 27.5v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281q0 174 120 321.5 t326 233t450 85.5t450 -85.5t326 -233t120 -321.5z" />
+<glyph unicode="&#xf0e6;" horiz-adv-x="1792" d="M704 1152q-153 0 -286 -52t-211.5 -141t-78.5 -191q0 -82 53 -158t149 -132l97 -56l-35 -84q34 20 62 39l44 31l53 -10q78 -14 153 -14q153 0 286 52t211.5 141t78.5 191t-78.5 191t-211.5 141t-286 52zM704 1280q191 0 353.5 -68.5t256.5 -186.5t94 -257t-94 -257 t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224q0 139 94 257t256.5 186.5 t353.5 68.5zM1526 111q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132q58 -4 88 -4q161 0 309 45t264 129 q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230q0 -120 -71 -224.5t-195 -176.5z" />
+<glyph unicode="&#xf0e7;" horiz-adv-x="896" d="M885 970q18 -20 7 -44l-540 -1157q-13 -25 -42 -25q-4 0 -14 2q-17 5 -25.5 19t-4.5 30l197 808l-406 -101q-4 -1 -12 -1q-18 0 -31 11q-18 15 -13 39l201 825q4 14 16 23t28 9h328q19 0 32 -12.5t13 -29.5q0 -8 -5 -18l-171 -463l396 98q8 2 12 2q19 0 34 -15z" />
+<glyph unicode="&#xf0e8;" horiz-adv-x="1792" d="M1792 288v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320 q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192q0 52 38 90t90 38h512v192h-96q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-96v-192h512q52 0 90 -38t38 -90v-192h96q40 0 68 -28t28 -68 z" />
+<glyph unicode="&#xf0e9;" horiz-adv-x="1664" d="M896 708v-580q0 -104 -76 -180t-180 -76t-180 76t-76 180q0 26 19 45t45 19t45 -19t19 -45q0 -50 39 -89t89 -39t89 39t39 89v580q33 11 64 11t64 -11zM1664 681q0 -13 -9.5 -22.5t-22.5 -9.5q-11 0 -23 10q-49 46 -93 69t-102 23q-68 0 -128 -37t-103 -97 q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -28 -17q-18 0 -29 17q-4 6 -14.5 24t-17.5 28q-43 60 -102.5 97t-127.5 37t-127.5 -37t-102.5 -97q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -29 -17q-17 0 -28 17q-4 6 -14.5 24t-17.5 28q-43 60 -103 97t-128 37q-58 0 -102 -23t-93 -69 q-12 -10 -23 -10q-13 0 -22.5 9.5t-9.5 22.5q0 5 1 7q45 183 172.5 319.5t298 204.5t360.5 68q140 0 274.5 -40t246.5 -113.5t194.5 -187t115.5 -251.5q1 -2 1 -7zM896 1408v-98q-42 2 -64 2t-64 -2v98q0 26 19 45t45 19t45 -19t19 -45z" />
+<glyph unicode="&#xf0ea;" horiz-adv-x="1792" d="M768 -128h896v640h-416q-40 0 -68 28t-28 68v416h-384v-1152zM1024 1312v64q0 13 -9.5 22.5t-22.5 9.5h-704q-13 0 -22.5 -9.5t-9.5 -22.5v-64q0 -13 9.5 -22.5t22.5 -9.5h704q13 0 22.5 9.5t9.5 22.5zM1280 640h299l-299 299v-299zM1792 512v-672q0 -40 -28 -68t-68 -28 h-960q-40 0 -68 28t-28 68v160h-544q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h1088q40 0 68 -28t28 -68v-328q21 -13 36 -28l408 -408q28 -28 48 -76t20 -88z" />
+<glyph unicode="&#xf0eb;" horiz-adv-x="1024" d="M736 960q0 -13 -9.5 -22.5t-22.5 -9.5t-22.5 9.5t-9.5 22.5q0 46 -54 71t-106 25q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5q50 0 99.5 -16t87 -54t37.5 -90zM896 960q0 72 -34.5 134t-90 101.5t-123 62t-136.5 22.5t-136.5 -22.5t-123 -62t-90 -101.5t-34.5 -134 q0 -101 68 -180q10 -11 30.5 -33t30.5 -33q128 -153 141 -298h228q13 145 141 298q10 11 30.5 33t30.5 33q68 79 68 180zM1024 960q0 -155 -103 -268q-45 -49 -74.5 -87t-59.5 -95.5t-34 -107.5q47 -28 47 -82q0 -37 -25 -64q25 -27 25 -64q0 -52 -45 -81q13 -23 13 -47 q0 -46 -31.5 -71t-77.5 -25q-20 -44 -60 -70t-87 -26t-87 26t-60 70q-46 0 -77.5 25t-31.5 71q0 24 13 47q-45 29 -45 81q0 37 25 64q-25 27 -25 64q0 54 47 82q-4 50 -34 107.5t-59.5 95.5t-74.5 87q-103 113 -103 268q0 99 44.5 184.5t117 142t164 89t186.5 32.5 t186.5 -32.5t164 -89t117 -142t44.5 -184.5z" />
+<glyph unicode="&#xf0ec;" horiz-adv-x="1792" d="M1792 352v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5q-12 0 -24 10l-319 320q-9 9 -9 22q0 14 9 23l320 320q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-192h1376q13 0 22.5 -9.5t9.5 -22.5zM1792 896q0 -14 -9 -23l-320 -320q-9 -9 -23 -9 q-13 0 -22.5 9.5t-9.5 22.5v192h-1376q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1376v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23z" />
+<glyph unicode="&#xf0ed;" horiz-adv-x="1920" d="M1280 608q0 14 -9 23t-23 9h-224v352q0 13 -9.5 22.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-352h-224q-13 0 -22.5 -9.5t-9.5 -22.5q0 -14 9 -23l352 -352q9 -9 23 -9t23 9l351 351q10 12 10 24zM1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088 q-185 0 -316.5 131.5t-131.5 316.5q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5z" />
+<glyph unicode="&#xf0ee;" horiz-adv-x="1920" d="M1280 672q0 14 -9 23l-352 352q-9 9 -23 9t-23 -9l-351 -351q-10 -12 -10 -24q0 -14 9 -23t23 -9h224v-352q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5v352h224q13 0 22.5 9.5t9.5 22.5zM1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088 q-185 0 -316.5 131.5t-131.5 316.5q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5z" />
+<glyph unicode="&#xf0f0;" horiz-adv-x="1408" d="M384 192q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45t45 19t45 -19t19 -45zM1408 131q0 -121 -73 -190t-194 -69h-874q-121 0 -194 69t-73 190q0 68 5.5 131t24 138t47.5 132.5t81 103t120 60.5q-22 -52 -22 -120v-203q-58 -20 -93 -70t-35 -111q0 -80 56 -136t136 -56 t136 56t56 136q0 61 -35.5 111t-92.5 70v203q0 62 25 93q132 -104 295 -104t295 104q25 -31 25 -93v-64q-106 0 -181 -75t-75 -181v-89q-32 -29 -32 -71q0 -40 28 -68t68 -28t68 28t28 68q0 42 -32 71v89q0 52 38 90t90 38t90 -38t38 -90v-89q-32 -29 -32 -71q0 -40 28 -68 t68 -28t68 28t28 68q0 42 -32 71v89q0 68 -34.5 127.5t-93.5 93.5q0 10 0.5 42.5t0 48t-2.5 41.5t-7 47t-13 40q68 -15 120 -60.5t81 -103t47.5 -132.5t24 -138t5.5 -131zM1088 1024q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5 t271.5 -112.5t112.5 -271.5z" />
+<glyph unicode="&#xf0f1;" horiz-adv-x="1408" d="M1280 832q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 832q0 -62 -35.5 -111t-92.5 -70v-395q0 -159 -131.5 -271.5t-316.5 -112.5t-316.5 112.5t-131.5 271.5v132q-164 20 -274 128t-110 252v512q0 26 19 45t45 19q6 0 16 -2q17 30 47 48 t65 18q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5q-33 0 -64 18v-402q0 -106 94 -181t226 -75t226 75t94 181v402q-31 -18 -64 -18q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5q35 0 65 -18t47 -48q10 2 16 2q26 0 45 -19t19 -45v-512q0 -144 -110 -252 t-274 -128v-132q0 -106 94 -181t226 -75t226 75t94 181v395q-57 21 -92.5 70t-35.5 111q0 80 56 136t136 56t136 -56t56 -136z" />
+<glyph unicode="&#xf0f2;" horiz-adv-x="1792" d="M640 1152h512v128h-512v-128zM288 1152v-1280h-64q-92 0 -158 66t-66 158v832q0 92 66 158t158 66h64zM1408 1152v-1280h-1024v1280h128v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h128zM1792 928v-832q0 -92 -66 -158t-158 -66h-64v1280h64q92 0 158 -66 t66 -158z" />
+<glyph unicode="&#xf0f3;" horiz-adv-x="1664" d="M848 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM1664 128q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38t-38 90q190 161 287 397.5t97 498.5 q0 165 96 262t264 117q-8 18 -8 37q0 40 28 68t68 28t68 -28t28 -68q0 -19 -8 -37q168 -20 264 -117t96 -262q0 -262 97 -498.5t287 -397.5z" />
+<glyph unicode="&#xf0f4;" horiz-adv-x="1920" d="M1664 896q0 80 -56 136t-136 56h-64v-384h64q80 0 136 56t56 136zM0 128h1792q0 -106 -75 -181t-181 -75h-1280q-106 0 -181 75t-75 181zM1856 896q0 -159 -112.5 -271.5t-271.5 -112.5h-64v-32q0 -92 -66 -158t-158 -66h-704q-92 0 -158 66t-66 158v736q0 26 19 45 t45 19h1152q159 0 271.5 -112.5t112.5 -271.5z" />
+<glyph unicode="&#xf0f5;" horiz-adv-x="1408" d="M640 1472v-640q0 -61 -35.5 -111t-92.5 -70v-779q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v779q-57 20 -92.5 70t-35.5 111v640q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45 t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45zM1408 1472v-1600q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v512h-224q-13 0 -22.5 9.5t-9.5 22.5v800q0 132 94 226t226 94h256q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0f6;" horiz-adv-x="1280" d="M1024 352v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704q14 0 23 -9t9 -23zM1024 608v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704q14 0 23 -9t9 -23zM128 0h1024v768h-416q-40 0 -68 28t-28 68v416h-512v-1280z M768 896h376q-10 29 -22 41l-313 313q-12 12 -41 22v-376zM1280 864v-896q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h640q40 0 88 -20t76 -48l312 -312q28 -28 48 -76t20 -88z" />
+<glyph unicode="&#xf0f7;" horiz-adv-x="1408" d="M384 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 -128h384v1536h-1152v-1536h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224zM1408 1472v-1664q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1664q0 26 19 45t45 19h1280q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0f8;" horiz-adv-x="1408" d="M384 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 -128h384v1152h-256v-32q0 -40 -28 -68t-68 -28h-448q-40 0 -68 28t-28 68v32h-256v-1152h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224zM896 1056v320q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-96h-128v96q0 13 -9.5 22.5 t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5v96h128v-96q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1408 1088v-1280q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1280q0 26 19 45t45 19h320 v288q0 40 28 68t68 28h448q40 0 68 -28t28 -68v-288h320q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0f9;" horiz-adv-x="1920" d="M640 128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM256 640h384v256h-158q-14 -2 -22 -9l-195 -195q-7 -12 -9 -22v-30zM1536 128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5 t90.5 37.5t37.5 90.5zM1664 800v192q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v224h224q14 0 23 9t9 23zM1920 1344v-1152 q0 -26 -19 -45t-45 -19h-192q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-128q-26 0 -45 19t-19 45t19 45t45 19v416q0 26 13 58t32 51l198 198q19 19 51 32t58 13h160v320q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0fa;" horiz-adv-x="1792" d="M1280 416v192q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v224h224q14 0 23 9t9 23zM640 1152h512v128h-512v-128zM256 1152v-1280h-32 q-92 0 -158 66t-66 158v832q0 92 66 158t158 66h32zM1440 1152v-1280h-1088v1280h160v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h160zM1792 928v-832q0 -92 -66 -158t-158 -66h-32v1280h32q92 0 158 -66t66 -158z" />
+<glyph unicode="&#xf0fb;" horiz-adv-x="1920" d="M1920 576q-1 -32 -288 -96l-352 -32l-224 -64h-64l-293 -352h69q26 0 45 -4.5t19 -11.5t-19 -11.5t-45 -4.5h-96h-160h-64v32h64v416h-160l-192 -224h-96l-32 32v192h32v32h128v8l-192 24v128l192 24v8h-128v32h-32v192l32 32h96l192 -224h160v416h-64v32h64h160h96 q26 0 45 -4.5t19 -11.5t-19 -11.5t-45 -4.5h-69l293 -352h64l224 -64l352 -32q261 -58 287 -93z" />
+<glyph unicode="&#xf0fc;" horiz-adv-x="1664" d="M640 640v384h-256v-256q0 -53 37.5 -90.5t90.5 -37.5h128zM1664 192v-192h-1152v192l128 192h-128q-159 0 -271.5 112.5t-112.5 271.5v320l-64 64l32 128h480l32 128h960l32 -192l-64 -32v-800z" />
+<glyph unicode="&#xf0fd;" d="M1280 192v896q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-512v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-896q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h512v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf0fe;" d="M1280 576v128q0 26 -19 45t-45 19h-320v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-320q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h320v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h320q26 0 45 19t19 45zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf100;" horiz-adv-x="1024" d="M627 160q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23zM1011 160q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23 t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23z" />
+<glyph unicode="&#xf101;" horiz-adv-x="1024" d="M595 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23zM979 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23 l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
+<glyph unicode="&#xf102;" horiz-adv-x="1152" d="M1075 224q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23zM1075 608q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393 q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
+<glyph unicode="&#xf103;" horiz-adv-x="1152" d="M1075 672q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23zM1075 1056q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23 t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" />
+<glyph unicode="&#xf104;" horiz-adv-x="640" d="M627 992q0 -13 -10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" />
+<glyph unicode="&#xf105;" horiz-adv-x="640" d="M595 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
+<glyph unicode="&#xf106;" horiz-adv-x="1152" d="M1075 352q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
+<glyph unicode="&#xf107;" horiz-adv-x="1152" d="M1075 800q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" />
+<glyph unicode="&#xf108;" horiz-adv-x="1920" d="M1792 544v832q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-832q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5zM1920 1376v-1088q0 -66 -47 -113t-113 -47h-544q0 -37 16 -77.5t32 -71t16 -43.5q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19 t-19 45q0 14 16 44t32 70t16 78h-544q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf109;" horiz-adv-x="1920" d="M416 256q-66 0 -113 47t-47 113v704q0 66 47 113t113 47h1088q66 0 113 -47t47 -113v-704q0 -66 -47 -113t-113 -47h-1088zM384 1120v-704q0 -13 9.5 -22.5t22.5 -9.5h1088q13 0 22.5 9.5t9.5 22.5v704q0 13 -9.5 22.5t-22.5 9.5h-1088q-13 0 -22.5 -9.5t-9.5 -22.5z M1760 192h160v-96q0 -40 -47 -68t-113 -28h-1600q-66 0 -113 28t-47 68v96h160h1600zM1040 96q16 0 16 16t-16 16h-160q-16 0 -16 -16t16 -16h160z" />
+<glyph unicode="&#xf10a;" horiz-adv-x="1152" d="M640 128q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1024 288v960q0 13 -9.5 22.5t-22.5 9.5h-832q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h832q13 0 22.5 9.5t9.5 22.5zM1152 1248v-1088q0 -66 -47 -113t-113 -47h-832 q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h832q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf10b;" horiz-adv-x="768" d="M464 128q0 33 -23.5 56.5t-56.5 23.5t-56.5 -23.5t-23.5 -56.5t23.5 -56.5t56.5 -23.5t56.5 23.5t23.5 56.5zM672 288v704q0 13 -9.5 22.5t-22.5 9.5h-512q-13 0 -22.5 -9.5t-9.5 -22.5v-704q0 -13 9.5 -22.5t22.5 -9.5h512q13 0 22.5 9.5t9.5 22.5zM480 1136 q0 16 -16 16h-160q-16 0 -16 -16t16 -16h160q16 0 16 16zM768 1152v-1024q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v1024q0 52 38 90t90 38h512q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf10c;" d="M768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103 t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf10d;" horiz-adv-x="1664" d="M768 576v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136z M1664 576v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136z" />
+<glyph unicode="&#xf10e;" horiz-adv-x="1664" d="M768 1216v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136v384q0 80 56 136t136 56h384q80 0 136 -56t56 -136zM1664 1216 v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136v384q0 80 56 136t136 56h384q80 0 136 -56t56 -136z" />
+<glyph unicode="&#xf110;" horiz-adv-x="1568" d="M496 192q0 -60 -42.5 -102t-101.5 -42q-60 0 -102 42t-42 102t42 102t102 42q59 0 101.5 -42t42.5 -102zM928 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM320 640q0 -66 -47 -113t-113 -47t-113 47t-47 113 t47 113t113 47t113 -47t47 -113zM1360 192q0 -46 -33 -79t-79 -33t-79 33t-33 79t33 79t79 33t79 -33t33 -79zM528 1088q0 -73 -51.5 -124.5t-124.5 -51.5t-124.5 51.5t-51.5 124.5t51.5 124.5t124.5 51.5t124.5 -51.5t51.5 -124.5zM992 1280q0 -80 -56 -136t-136 -56 t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1536 640q0 -40 -28 -68t-68 -28t-68 28t-28 68t28 68t68 28t68 -28t28 -68zM1328 1088q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5z" />
+<glyph unicode="&#xf111;" d="M1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf112;" horiz-adv-x="1792" d="M1792 416q0 -166 -127 -451q-3 -7 -10.5 -24t-13.5 -30t-13 -22q-12 -17 -28 -17q-15 0 -23.5 10t-8.5 25q0 9 2.5 26.5t2.5 23.5q5 68 5 123q0 101 -17.5 181t-48.5 138.5t-80 101t-105.5 69.5t-133 42.5t-154 21.5t-175.5 6h-224v-256q0 -26 -19 -45t-45 -19t-45 19 l-512 512q-19 19 -19 45t19 45l512 512q19 19 45 19t45 -19t19 -45v-256h224q713 0 875 -403q53 -134 53 -333z" />
+<glyph unicode="&#xf113;" horiz-adv-x="1664" d="M640 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1280 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1440 320 q0 120 -69 204t-187 84q-41 0 -195 -21q-71 -11 -157 -11t-157 11q-152 21 -195 21q-118 0 -187 -84t-69 -204q0 -88 32 -153.5t81 -103t122 -60t140 -29.5t149 -7h168q82 0 149 7t140 29.5t122 60t81 103t32 153.5zM1664 496q0 -207 -61 -331q-38 -77 -105.5 -133t-141 -86 t-170 -47.5t-171.5 -22t-167 -4.5q-78 0 -142 3t-147.5 12.5t-152.5 30t-137 51.5t-121 81t-86 115q-62 123 -62 331q0 237 136 396q-27 82 -27 170q0 116 51 218q108 0 190 -39.5t189 -123.5q147 35 309 35q148 0 280 -32q105 82 187 121t189 39q51 -102 51 -218 q0 -87 -27 -168q136 -160 136 -398z" />
+<glyph unicode="&#xf114;" horiz-adv-x="1664" d="M1536 224v704q0 40 -28 68t-68 28h-704q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68v-960q0 -40 28 -68t68 -28h1216q40 0 68 28t28 68zM1664 928v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320 q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158z" />
+<glyph unicode="&#xf115;" horiz-adv-x="1920" d="M1781 605q0 35 -53 35h-1088q-40 0 -85.5 -21.5t-71.5 -52.5l-294 -363q-18 -24 -18 -40q0 -35 53 -35h1088q40 0 86 22t71 53l294 363q18 22 18 39zM640 768h768v160q0 40 -28 68t-68 28h-576q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68 v-853l256 315q44 53 116 87.5t140 34.5zM1909 605q0 -62 -46 -120l-295 -363q-43 -53 -116 -87.5t-140 -34.5h-1088q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158v-160h192q54 0 99 -24.5t67 -70.5q15 -32 15 -68z " />
+<glyph unicode="&#xf116;" horiz-adv-x="1152" d="M896 608v-64q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-224q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v224q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-224h224q14 0 23 -9t9 -23zM1024 224v704q0 40 -28 68t-68 28h-704q-40 0 -68 -28 t-28 -68v-704q0 -40 28 -68t68 -28h704q40 0 68 28t28 68zM1152 928v-704q0 -92 -65.5 -158t-158.5 -66h-704q-93 0 -158.5 66t-65.5 158v704q0 93 65.5 158.5t158.5 65.5h704q93 0 158.5 -65.5t65.5 -158.5z" />
+<glyph unicode="&#xf117;" horiz-adv-x="1152" d="M928 1152q93 0 158.5 -65.5t65.5 -158.5v-704q0 -92 -65.5 -158t-158.5 -66h-704q-93 0 -158.5 66t-65.5 158v704q0 93 65.5 158.5t158.5 65.5h704zM1024 224v704q0 40 -28 68t-68 28h-704q-40 0 -68 -28t-28 -68v-704q0 -40 28 -68t68 -28h704q40 0 68 28t28 68z M864 640q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-576q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h576z" />
+<glyph unicode="&#xf118;" d="M1134 461q-37 -121 -138 -195t-228 -74t-228 74t-138 195q-8 25 4 48.5t38 31.5q25 8 48.5 -4t31.5 -38q25 -80 92.5 -129.5t151.5 -49.5t151.5 49.5t92.5 129.5q8 26 32 38t49 4t37 -31.5t4 -48.5zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5 t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5 t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf119;" d="M1134 307q8 -25 -4 -48.5t-37 -31.5t-49 4t-32 38q-25 80 -92.5 129.5t-151.5 49.5t-151.5 -49.5t-92.5 -129.5q-8 -26 -31.5 -38t-48.5 -4q-26 8 -38 31.5t-4 48.5q37 121 138 195t228 74t228 -74t138 -195zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204 t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf11a;" d="M1152 448q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h640q26 0 45 -19t19 -45zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf11b;" horiz-adv-x="1920" d="M832 448v128q0 14 -9 23t-23 9h-192v192q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-192h-192q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h192v-192q0 -14 9 -23t23 -9h128q14 0 23 9t9 23v192h192q14 0 23 9t9 23zM1408 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5 t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 640q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1920 512q0 -212 -150 -362t-362 -150q-192 0 -338 128h-220q-146 -128 -338 -128q-212 0 -362 150 t-150 362t150 362t362 150h896q212 0 362 -150t150 -362z" />
+<glyph unicode="&#xf11c;" horiz-adv-x="1920" d="M384 368v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM512 624v-96q0 -16 -16 -16h-224q-16 0 -16 16v96q0 16 16 16h224q16 0 16 -16zM384 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1408 368v-96q0 -16 -16 -16 h-864q-16 0 -16 16v96q0 16 16 16h864q16 0 16 -16zM768 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM640 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1024 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16 h96q16 0 16 -16zM896 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1280 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1664 368v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1152 880v-96 q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1408 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1664 880v-352q0 -16 -16 -16h-224q-16 0 -16 16v96q0 16 16 16h112v240q0 16 16 16h96q16 0 16 -16zM1792 128v896h-1664v-896 h1664zM1920 1024v-896q0 -53 -37.5 -90.5t-90.5 -37.5h-1664q-53 0 -90.5 37.5t-37.5 90.5v896q0 53 37.5 90.5t90.5 37.5h1664q53 0 90.5 -37.5t37.5 -90.5z" />
+<glyph unicode="&#xf11d;" horiz-adv-x="1792" d="M1664 491v616q-169 -91 -306 -91q-82 0 -145 32q-100 49 -184 76.5t-178 27.5q-173 0 -403 -127v-599q245 113 433 113q55 0 103.5 -7.5t98 -26t77 -31t82.5 -39.5l28 -14q44 -22 101 -22q120 0 293 92zM320 1280q0 -35 -17.5 -64t-46.5 -46v-1266q0 -14 -9 -23t-23 -9 h-64q-14 0 -23 9t-9 23v1266q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -39 -35 -57q-10 -5 -17 -9q-218 -116 -369 -116q-88 0 -158 35l-28 14q-64 33 -99 48t-91 29t-114 14q-102 0 -235.5 -44t-228.5 -102 q-15 -9 -33 -9q-16 0 -32 8q-32 19 -32 56v742q0 35 31 55q35 21 78.5 42.5t114 52t152.5 49.5t155 19q112 0 209 -31t209 -86q38 -19 89 -19q122 0 310 112q22 12 31 17q31 16 62 -2q31 -20 31 -55z" />
+<glyph unicode="&#xf11e;" horiz-adv-x="1792" d="M832 536v192q-181 -16 -384 -117v-185q205 96 384 110zM832 954v197q-172 -8 -384 -126v-189q215 111 384 118zM1664 491v184q-235 -116 -384 -71v224q-20 6 -39 15q-5 3 -33 17t-34.5 17t-31.5 15t-34.5 15.5t-32.5 13t-36 12.5t-35 8.5t-39.5 7.5t-39.5 4t-44 2 q-23 0 -49 -3v-222h19q102 0 192.5 -29t197.5 -82q19 -9 39 -15v-188q42 -17 91 -17q120 0 293 92zM1664 918v189q-169 -91 -306 -91q-45 0 -78 8v-196q148 -42 384 90zM320 1280q0 -35 -17.5 -64t-46.5 -46v-1266q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v1266 q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -39 -35 -57q-10 -5 -17 -9q-218 -116 -369 -116q-88 0 -158 35l-28 14q-64 33 -99 48t-91 29t-114 14q-102 0 -235.5 -44t-228.5 -102q-15 -9 -33 -9q-16 0 -32 8 q-32 19 -32 56v742q0 35 31 55q35 21 78.5 42.5t114 52t152.5 49.5t155 19q112 0 209 -31t209 -86q38 -19 89 -19q122 0 310 112q22 12 31 17q31 16 62 -2q31 -20 31 -55z" />
+<glyph unicode="&#xf120;" horiz-adv-x="1664" d="M585 553l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23zM1664 96v-64q0 -14 -9 -23t-23 -9h-960q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h960q14 0 23 -9 t9 -23z" />
+<glyph unicode="&#xf121;" horiz-adv-x="1920" d="M617 137l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23zM1208 1204l-373 -1291q-4 -13 -15.5 -19.5t-23.5 -2.5l-62 17q-13 4 -19.5 15.5t-2.5 24.5 l373 1291q4 13 15.5 19.5t23.5 2.5l62 -17q13 -4 19.5 -15.5t2.5 -24.5zM1865 553l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23z" />
+<glyph unicode="&#xf122;" horiz-adv-x="1792" d="M640 454v-70q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-512 512q-19 19 -19 45t19 45l512 512q29 31 70 14q39 -17 39 -59v-69l-397 -398q-19 -19 -19 -45t19 -45zM1792 416q0 -58 -17 -133.5t-38.5 -138t-48 -125t-40.5 -90.5l-20 -40q-8 -17 -28 -17q-6 0 -9 1 q-25 8 -23 34q43 400 -106 565q-64 71 -170.5 110.5t-267.5 52.5v-251q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-512 512q-19 19 -19 45t19 45l512 512q29 31 70 14q39 -17 39 -59v-262q411 -28 599 -221q169 -173 169 -509z" />
+<glyph unicode="&#xf123;" horiz-adv-x="1664" d="M1186 579l257 250l-356 52l-66 10l-30 60l-159 322v-963l59 -31l318 -168l-60 355l-12 66zM1638 841l-363 -354l86 -500q5 -33 -6 -51.5t-34 -18.5q-17 0 -40 12l-449 236l-449 -236q-23 -12 -40 -12q-23 0 -34 18.5t-6 51.5l86 500l-364 354q-32 32 -23 59.5t54 34.5 l502 73l225 455q20 41 49 41q28 0 49 -41l225 -455l502 -73q45 -7 54 -34.5t-24 -59.5z" />
+<glyph unicode="&#xf124;" horiz-adv-x="1408" d="M1401 1187l-640 -1280q-17 -35 -57 -35q-5 0 -15 2q-22 5 -35.5 22.5t-13.5 39.5v576h-576q-22 0 -39.5 13.5t-22.5 35.5t4 42t29 30l1280 640q13 7 29 7q27 0 45 -19q15 -14 18.5 -34.5t-6.5 -39.5z" />
+<glyph unicode="&#xf125;" horiz-adv-x="1664" d="M557 256h595v595zM512 301l595 595h-595v-595zM1664 224v-192q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v224h-864q-14 0 -23 9t-9 23v864h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224v224q0 14 9 23t23 9h192q14 0 23 -9t9 -23 v-224h851l246 247q10 9 23 9t23 -9q9 -10 9 -23t-9 -23l-247 -246v-851h224q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf126;" horiz-adv-x="1024" d="M288 64q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM288 1216q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM928 1088q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1024 1088q0 -52 -26 -96.5t-70 -69.5 q-2 -287 -226 -414q-68 -38 -203 -81q-128 -40 -169.5 -71t-41.5 -100v-26q44 -25 70 -69.5t26 -96.5q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 52 26 96.5t70 69.5v820q-44 25 -70 69.5t-26 96.5q0 80 56 136t136 56t136 -56t56 -136q0 -52 -26 -96.5t-70 -69.5v-497 q54 26 154 57q55 17 87.5 29.5t70.5 31t59 39.5t40.5 51t28 69.5t8.5 91.5q-44 25 -70 69.5t-26 96.5q0 80 56 136t136 56t136 -56t56 -136z" />
+<glyph unicode="&#xf127;" horiz-adv-x="1664" d="M439 265l-256 -256q-10 -9 -23 -9q-12 0 -23 9q-9 10 -9 23t9 23l256 256q10 9 23 9t23 -9q9 -10 9 -23t-9 -23zM608 224v-320q0 -14 -9 -23t-23 -9t-23 9t-9 23v320q0 14 9 23t23 9t23 -9t9 -23zM384 448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23t9 23t23 9h320 q14 0 23 -9t9 -23zM1648 320q0 -120 -85 -203l-147 -146q-83 -83 -203 -83q-121 0 -204 85l-334 335q-21 21 -42 56l239 18l273 -274q27 -27 68 -27.5t68 26.5l147 146q28 28 28 67q0 40 -28 68l-274 275l18 239q35 -21 56 -42l336 -336q84 -86 84 -204zM1031 1044l-239 -18 l-273 274q-28 28 -68 28q-39 0 -68 -27l-147 -146q-28 -28 -28 -67q0 -40 28 -68l274 -274l-18 -240q-35 21 -56 42l-336 336q-84 86 -84 204q0 120 85 203l147 146q83 83 203 83q121 0 204 -85l334 -335q21 -21 42 -56zM1664 960q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9 t-9 23t9 23t23 9h320q14 0 23 -9t9 -23zM1120 1504v-320q0 -14 -9 -23t-23 -9t-23 9t-9 23v320q0 14 9 23t23 9t23 -9t9 -23zM1527 1353l-256 -256q-11 -9 -23 -9t-23 9q-9 10 -9 23t9 23l256 256q10 9 23 9t23 -9q9 -10 9 -23t-9 -23z" />
+<glyph unicode="&#xf128;" horiz-adv-x="1024" d="M704 280v-240q0 -16 -12 -28t-28 -12h-240q-16 0 -28 12t-12 28v240q0 16 12 28t28 12h240q16 0 28 -12t12 -28zM1020 880q0 -54 -15.5 -101t-35 -76.5t-55 -59.5t-57.5 -43.5t-61 -35.5q-41 -23 -68.5 -65t-27.5 -67q0 -17 -12 -32.5t-28 -15.5h-240q-15 0 -25.5 18.5 t-10.5 37.5v45q0 83 65 156.5t143 108.5q59 27 84 56t25 76q0 42 -46.5 74t-107.5 32q-65 0 -108 -29q-35 -25 -107 -115q-13 -16 -31 -16q-12 0 -25 8l-164 125q-13 10 -15.5 25t5.5 28q160 266 464 266q80 0 161 -31t146 -83t106 -127.5t41 -158.5z" />
+<glyph unicode="&#xf129;" horiz-adv-x="640" d="M640 192v-128q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64v384h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-576h64q26 0 45 -19t19 -45zM512 1344v-192q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v192 q0 26 19 45t45 19h256q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf12a;" horiz-adv-x="640" d="M512 288v-224q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v224q0 26 19 45t45 19h256q26 0 45 -19t19 -45zM542 1344l-28 -768q-1 -26 -20.5 -45t-45.5 -19h-256q-26 0 -45.5 19t-20.5 45l-28 768q-1 26 17.5 45t44.5 19h320q26 0 44.5 -19t17.5 -45z" />
+<glyph unicode="&#xf12b;" d="M897 167v-167h-248l-159 252l-24 42q-8 9 -11 21h-3l-9 -21q-10 -20 -25 -44l-155 -250h-258v167h128l197 291l-185 272h-137v168h276l139 -228q2 -4 23 -42q8 -9 11 -21h3q3 9 11 21l25 42l140 228h257v-168h-125l-184 -267l204 -296h109zM1534 846v-206h-514l-3 27 q-4 28 -4 46q0 64 26 117t65 86.5t84 65t84 54.5t65 54t26 64q0 38 -29.5 62.5t-70.5 24.5q-51 0 -97 -39q-14 -11 -36 -38l-105 92q26 37 63 66q83 65 188 65q110 0 178 -59.5t68 -158.5q0 -56 -24.5 -103t-62 -76.5t-81.5 -58.5t-82 -50.5t-65.5 -51.5t-30.5 -63h232v80 h126z" />
+<glyph unicode="&#xf12c;" d="M897 167v-167h-248l-159 252l-24 42q-8 9 -11 21h-3l-9 -21q-10 -20 -25 -44l-155 -250h-258v167h128l197 291l-185 272h-137v168h276l139 -228q2 -4 23 -42q8 -9 11 -21h3q3 9 11 21l25 42l140 228h257v-168h-125l-184 -267l204 -296h109zM1536 -50v-206h-514l-4 27 q-3 45 -3 46q0 64 26 117t65 86.5t84 65t84 54.5t65 54t26 64q0 38 -29.5 62.5t-70.5 24.5q-51 0 -97 -39q-14 -11 -36 -38l-105 92q26 37 63 66q80 65 188 65q110 0 178 -59.5t68 -158.5q0 -66 -34.5 -118.5t-84 -86t-99.5 -62.5t-87 -63t-41 -73h232v80h126z" />
+<glyph unicode="&#xf12d;" horiz-adv-x="1920" d="M896 128l336 384h-768l-336 -384h768zM1909 1205q15 -34 9.5 -71.5t-30.5 -65.5l-896 -1024q-38 -44 -96 -44h-768q-38 0 -69.5 20.5t-47.5 54.5q-15 34 -9.5 71.5t30.5 65.5l896 1024q38 44 96 44h768q38 0 69.5 -20.5t47.5 -54.5z" />
+<glyph unicode="&#xf12e;" horiz-adv-x="1664" d="M1664 438q0 -81 -44.5 -135t-123.5 -54q-41 0 -77.5 17.5t-59 38t-56.5 38t-71 17.5q-110 0 -110 -124q0 -39 16 -115t15 -115v-5q-22 0 -33 -1q-34 -3 -97.5 -11.5t-115.5 -13.5t-98 -5q-61 0 -103 26.5t-42 83.5q0 37 17.5 71t38 56.5t38 59t17.5 77.5q0 79 -54 123.5 t-135 44.5q-84 0 -143 -45.5t-59 -127.5q0 -43 15 -83t33.5 -64.5t33.5 -53t15 -50.5q0 -45 -46 -89q-37 -35 -117 -35q-95 0 -245 24q-9 2 -27.5 4t-27.5 4l-13 2q-1 0 -3 1q-2 0 -2 1v1024q2 -1 17.5 -3.5t34 -5t21.5 -3.5q150 -24 245 -24q80 0 117 35q46 44 46 89 q0 22 -15 50.5t-33.5 53t-33.5 64.5t-15 83q0 82 59 127.5t144 45.5q80 0 134 -44.5t54 -123.5q0 -41 -17.5 -77.5t-38 -59t-38 -56.5t-17.5 -71q0 -57 42 -83.5t103 -26.5q64 0 180 15t163 17v-2q-1 -2 -3.5 -17.5t-5 -34t-3.5 -21.5q-24 -150 -24 -245q0 -80 35 -117 q44 -46 89 -46q22 0 50.5 15t53 33.5t64.5 33.5t83 15q82 0 127.5 -59t45.5 -143z" />
+<glyph unicode="&#xf130;" horiz-adv-x="1152" d="M1152 832v-128q0 -221 -147.5 -384.5t-364.5 -187.5v-132h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h256v132q-217 24 -364.5 187.5t-147.5 384.5v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -185 131.5 -316.5t316.5 -131.5 t316.5 131.5t131.5 316.5v128q0 26 19 45t45 19t45 -19t19 -45zM896 1216v-512q0 -132 -94 -226t-226 -94t-226 94t-94 226v512q0 132 94 226t226 94t226 -94t94 -226z" />
+<glyph unicode="&#xf131;" horiz-adv-x="1408" d="M271 591l-101 -101q-42 103 -42 214v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -53 15 -113zM1385 1193l-361 -361v-128q0 -132 -94 -226t-226 -94q-55 0 -109 19l-96 -96q97 -51 205 -51q185 0 316.5 131.5t131.5 316.5v128q0 26 19 45t45 19t45 -19t19 -45v-128 q0 -221 -147.5 -384.5t-364.5 -187.5v-132h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h256v132q-125 13 -235 81l-254 -254q-10 -10 -23 -10t-23 10l-82 82q-10 10 -10 23t10 23l1234 1234q10 10 23 10t23 -10l82 -82q10 -10 10 -23 t-10 -23zM1005 1325l-621 -621v512q0 132 94 226t226 94q102 0 184.5 -59t116.5 -152z" />
+<glyph unicode="&#xf132;" horiz-adv-x="1280" d="M1088 576v640h-448v-1137q119 63 213 137q235 184 235 360zM1280 1344v-768q0 -86 -33.5 -170.5t-83 -150t-118 -127.5t-126.5 -103t-121 -77.5t-89.5 -49.5t-42.5 -20q-12 -6 -26 -6t-26 6q-16 7 -42.5 20t-89.5 49.5t-121 77.5t-126.5 103t-118 127.5t-83 150 t-33.5 170.5v768q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf133;" horiz-adv-x="1664" d="M128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280 q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf134;" horiz-adv-x="1408" d="M512 1344q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 1376v-320q0 -16 -12 -25q-8 -7 -20 -7q-4 0 -7 1l-448 96q-11 2 -18 11t-7 20h-256v-102q111 -23 183.5 -111t72.5 -203v-800q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v800 q0 106 62.5 190.5t161.5 114.5v111h-32q-59 0 -115 -23.5t-91.5 -53t-66 -66.5t-40.5 -53.5t-14 -24.5q-17 -35 -57 -35q-16 0 -29 7q-23 12 -31.5 37t3.5 49q5 10 14.5 26t37.5 53.5t60.5 70t85 67t108.5 52.5q-25 42 -25 86q0 66 47 113t113 47t113 -47t47 -113 q0 -33 -14 -64h302q0 11 7 20t18 11l448 96q3 1 7 1q12 0 20 -7q12 -9 12 -25z" />
+<glyph unicode="&#xf135;" horiz-adv-x="1664" d="M1440 1088q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1664 1376q0 -249 -75.5 -430.5t-253.5 -360.5q-81 -80 -195 -176l-20 -379q-2 -16 -16 -26l-384 -224q-7 -4 -16 -4q-12 0 -23 9l-64 64q-13 14 -8 32l85 276l-281 281l-276 -85q-3 -1 -9 -1 q-14 0 -23 9l-64 64q-17 19 -5 39l224 384q10 14 26 16l379 20q96 114 176 195q188 187 358 258t431 71q14 0 24 -9.5t10 -22.5z" />
+<glyph unicode="&#xf136;" horiz-adv-x="1792" d="M1708 881l-188 -881h-304l181 849q4 21 1 43q-4 20 -16 35q-10 14 -28 24q-18 9 -40 9h-197l-205 -960h-303l204 960h-304l-205 -960h-304l272 1280h1139q157 0 245 -118q86 -116 52 -281z" />
+<glyph unicode="&#xf137;" d="M909 141l102 102q19 19 19 45t-19 45l-307 307l307 307q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45t19 -45l454 -454q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf138;" d="M717 141l454 454q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l307 -307l-307 -307q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf139;" d="M1165 397l102 102q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19l307 307l307 -307q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf13a;" d="M813 237l454 454q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-307 -307l-307 307q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l454 -454q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf13b;" horiz-adv-x="1408" d="M1130 939l16 175h-884l47 -534h612l-22 -228l-197 -53l-196 53l-13 140h-175l22 -278l362 -100h4v1l359 99l50 544h-644l-15 181h674zM0 1408h1408l-128 -1438l-578 -162l-574 162z" />
+<glyph unicode="&#xf13c;" horiz-adv-x="1792" d="M275 1408h1505l-266 -1333l-804 -267l-698 267l71 356h297l-29 -147l422 -161l486 161l68 339h-1208l58 297h1209l38 191h-1208z" />
+<glyph unicode="&#xf13d;" horiz-adv-x="1792" d="M960 1280q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1792 352v-352q0 -22 -20 -30q-8 -2 -12 -2q-13 0 -23 9l-93 93q-119 -143 -318.5 -226.5t-429.5 -83.5t-429.5 83.5t-318.5 226.5l-93 -93q-9 -9 -23 -9q-4 0 -12 2q-20 8 -20 30v352 q0 14 9 23t23 9h352q22 0 30 -20q8 -19 -7 -35l-100 -100q67 -91 189.5 -153.5t271.5 -82.5v647h-192q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h192v163q-58 34 -93 92.5t-35 128.5q0 106 75 181t181 75t181 -75t75 -181q0 -70 -35 -128.5t-93 -92.5v-163h192q26 0 45 -19 t19 -45v-128q0 -26 -19 -45t-45 -19h-192v-647q149 20 271.5 82.5t189.5 153.5l-100 100q-15 16 -7 35q8 20 30 20h352q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf13e;" horiz-adv-x="1152" d="M1056 768q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h32v320q0 185 131.5 316.5t316.5 131.5t316.5 -131.5t131.5 -316.5q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45q0 106 -75 181t-181 75t-181 -75t-75 -181 v-320h736z" />
+<glyph unicode="&#xf140;" d="M1024 640q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM1152 640q0 159 -112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM1280 640q0 -212 -150 -362t-362 -150t-362 150 t-150 362t150 362t362 150t362 -150t150 -362zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf141;" horiz-adv-x="1408" d="M384 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM896 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM1408 800v-192q0 -40 -28 -68t-68 -28h-192 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf142;" horiz-adv-x="384" d="M384 288v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM384 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM384 1312v-192q0 -40 -28 -68t-68 -28h-192 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf143;" d="M512 256q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM863 162q-13 232 -177 396t-396 177q-14 1 -24 -9t-10 -23v-128q0 -13 8.5 -22t21.5 -10q154 -11 264 -121t121 -264q1 -13 10 -21.5t22 -8.5h128q13 0 23 10 t9 24zM1247 161q-5 154 -56 297.5t-139.5 260t-205 205t-260 139.5t-297.5 56q-14 1 -23 -9q-10 -10 -10 -23v-128q0 -13 9 -22t22 -10q204 -7 378 -111.5t278.5 -278.5t111.5 -378q1 -13 10 -22t22 -9h128q13 0 23 10q11 9 9 23zM1536 1120v-960q0 -119 -84.5 -203.5 t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf144;" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM1152 585q32 18 32 55t-32 55l-544 320q-31 19 -64 1q-32 -19 -32 -56v-640q0 -37 32 -56 q16 -8 32 -8q17 0 32 9z" />
+<glyph unicode="&#xf145;" horiz-adv-x="1792" d="M1024 1084l316 -316l-572 -572l-316 316zM813 105l618 618q19 19 19 45t-19 45l-362 362q-18 18 -45 18t-45 -18l-618 -618q-19 -19 -19 -45t19 -45l362 -362q18 -18 45 -18t45 18zM1702 742l-907 -908q-37 -37 -90.5 -37t-90.5 37l-126 126q56 56 56 136t-56 136 t-136 56t-136 -56l-125 126q-37 37 -37 90.5t37 90.5l907 906q37 37 90.5 37t90.5 -37l125 -125q-56 -56 -56 -136t56 -136t136 -56t136 56l126 -125q37 -37 37 -90.5t-37 -90.5z" />
+<glyph unicode="&#xf146;" d="M1280 576v128q0 26 -19 45t-45 19h-896q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h896q26 0 45 19t19 45zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5 t84.5 -203.5z" />
+<glyph unicode="&#xf147;" horiz-adv-x="1408" d="M1152 736v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h832q14 0 23 -9t9 -23zM1280 288v832q0 66 -47 113t-113 47h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113zM1408 1120v-832q0 -119 -84.5 -203.5 t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf148;" horiz-adv-x="1024" d="M1018 933q-18 -37 -58 -37h-192v-864q0 -14 -9 -23t-23 -9h-704q-21 0 -29 18q-8 20 4 35l160 192q9 11 25 11h320v640h-192q-40 0 -58 37q-17 37 9 68l320 384q18 22 49 22t49 -22l320 -384q27 -32 9 -68z" />
+<glyph unicode="&#xf149;" horiz-adv-x="1024" d="M32 1280h704q13 0 22.5 -9.5t9.5 -23.5v-863h192q40 0 58 -37t-9 -69l-320 -384q-18 -22 -49 -22t-49 22l-320 384q-26 31 -9 69q18 37 58 37h192v640h-320q-14 0 -25 11l-160 192q-13 14 -4 34q9 19 29 19z" />
+<glyph unicode="&#xf14a;" d="M685 237l614 614q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-467 -467l-211 211q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l358 -358q19 -19 45 -19t45 19zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5 t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf14b;" d="M404 428l152 -152l-52 -52h-56v96h-96v56zM818 818q14 -13 -3 -30l-291 -291q-17 -17 -30 -3q-14 13 3 30l291 291q17 17 30 3zM544 128l544 544l-288 288l-544 -544v-288h288zM1152 736l92 92q28 28 28 68t-28 68l-152 152q-28 28 -68 28t-68 -28l-92 -92zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf14c;" d="M1280 608v480q0 26 -19 45t-45 19h-480q-42 0 -59 -39q-17 -41 14 -70l144 -144l-534 -534q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19l534 534l144 -144q18 -19 45 -19q12 0 25 5q39 17 39 59zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960 q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf14d;" d="M1005 435l352 352q19 19 19 45t-19 45l-352 352q-30 31 -69 14q-40 -17 -40 -59v-160q-119 0 -216 -19.5t-162.5 -51t-114 -79t-76.5 -95.5t-44.5 -109t-21.5 -111.5t-5 -110.5q0 -181 167 -404q10 -12 25 -12q7 0 13 3q22 9 19 33q-44 354 62 473q46 52 130 75.5 t224 23.5v-160q0 -42 40 -59q12 -5 24 -5q26 0 45 19zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf14e;" d="M640 448l256 128l-256 128v-256zM1024 1039v-542l-512 -256v542zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf150;" d="M1145 861q18 -35 -5 -66l-320 -448q-19 -27 -52 -27t-52 27l-320 448q-23 31 -5 66q17 35 57 35h640q40 0 57 -35zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf151;" d="M1145 419q-17 -35 -57 -35h-640q-40 0 -57 35q-18 35 5 66l320 448q19 27 52 27t52 -27l320 -448q23 -31 5 -66zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf152;" d="M1088 640q0 -33 -27 -52l-448 -320q-31 -23 -66 -5q-35 17 -35 57v640q0 40 35 57q35 18 66 -5l448 -320q27 -19 27 -52zM1280 160v960q0 14 -9 23t-23 9h-960q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h960q14 0 23 9t9 23zM1536 1120v-960q0 -119 -84.5 -203.5 t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf153;" horiz-adv-x="1024" d="M976 229l35 -159q3 -12 -3 -22.5t-17 -14.5l-5 -1q-4 -2 -10.5 -3.5t-16 -4.5t-21.5 -5.5t-25.5 -5t-30 -5t-33.5 -4.5t-36.5 -3t-38.5 -1q-234 0 -409 130.5t-238 351.5h-95q-13 0 -22.5 9.5t-9.5 22.5v113q0 13 9.5 22.5t22.5 9.5h66q-2 57 1 105h-67q-14 0 -23 9 t-9 23v114q0 14 9 23t23 9h98q67 210 243.5 338t400.5 128q102 0 194 -23q11 -3 20 -15q6 -11 3 -24l-43 -159q-3 -13 -14 -19.5t-24 -2.5l-4 1q-4 1 -11.5 2.5l-17.5 3.5t-22.5 3.5t-26 3t-29 2.5t-29.5 1q-126 0 -226 -64t-150 -176h468q16 0 25 -12q10 -12 7 -26 l-24 -114q-5 -26 -32 -26h-488q-3 -37 0 -105h459q15 0 25 -12q9 -12 6 -27l-24 -112q-2 -11 -11 -18.5t-20 -7.5h-387q48 -117 149.5 -185.5t228.5 -68.5q18 0 36 1.5t33.5 3.5t29.5 4.5t24.5 5t18.5 4.5l12 3l5 2q13 5 26 -2q12 -7 15 -21z" />
+<glyph unicode="&#xf154;" horiz-adv-x="1024" d="M1020 399v-367q0 -14 -9 -23t-23 -9h-956q-14 0 -23 9t-9 23v150q0 13 9.5 22.5t22.5 9.5h97v383h-95q-14 0 -23 9.5t-9 22.5v131q0 14 9 23t23 9h95v223q0 171 123.5 282t314.5 111q185 0 335 -125q9 -8 10 -20.5t-7 -22.5l-103 -127q-9 -11 -22 -12q-13 -2 -23 7 q-5 5 -26 19t-69 32t-93 18q-85 0 -137 -47t-52 -123v-215h305q13 0 22.5 -9t9.5 -23v-131q0 -13 -9.5 -22.5t-22.5 -9.5h-305v-379h414v181q0 13 9 22.5t23 9.5h162q14 0 23 -9.5t9 -22.5z" />
+<glyph unicode="&#xf155;" horiz-adv-x="1024" d="M978 351q0 -153 -99.5 -263.5t-258.5 -136.5v-175q0 -14 -9 -23t-23 -9h-135q-13 0 -22.5 9.5t-9.5 22.5v175q-66 9 -127.5 31t-101.5 44.5t-74 48t-46.5 37.5t-17.5 18q-17 21 -2 41l103 135q7 10 23 12q15 2 24 -9l2 -2q113 -99 243 -125q37 -8 74 -8q81 0 142.5 43 t61.5 122q0 28 -15 53t-33.5 42t-58.5 37.5t-66 32t-80 32.5q-39 16 -61.5 25t-61.5 26.5t-62.5 31t-56.5 35.5t-53.5 42.5t-43.5 49t-35.5 58t-21 66.5t-8.5 78q0 138 98 242t255 134v180q0 13 9.5 22.5t22.5 9.5h135q14 0 23 -9t9 -23v-176q57 -6 110.5 -23t87 -33.5 t63.5 -37.5t39 -29t15 -14q17 -18 5 -38l-81 -146q-8 -15 -23 -16q-14 -3 -27 7q-3 3 -14.5 12t-39 26.5t-58.5 32t-74.5 26t-85.5 11.5q-95 0 -155 -43t-60 -111q0 -26 8.5 -48t29.5 -41.5t39.5 -33t56 -31t60.5 -27t70 -27.5q53 -20 81 -31.5t76 -35t75.5 -42.5t62 -50 t53 -63.5t31.5 -76.5t13 -94z" />
+<glyph unicode="&#xf156;" horiz-adv-x="898" d="M898 1066v-102q0 -14 -9 -23t-23 -9h-168q-23 -144 -129 -234t-276 -110q167 -178 459 -536q14 -16 4 -34q-8 -18 -29 -18h-195q-16 0 -25 12q-306 367 -498 571q-9 9 -9 22v127q0 13 9.5 22.5t22.5 9.5h112q132 0 212.5 43t102.5 125h-427q-14 0 -23 9t-9 23v102 q0 14 9 23t23 9h413q-57 113 -268 113h-145q-13 0 -22.5 9.5t-9.5 22.5v133q0 14 9 23t23 9h832q14 0 23 -9t9 -23v-102q0 -14 -9 -23t-23 -9h-233q47 -61 64 -144h171q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf157;" horiz-adv-x="1027" d="M603 0h-172q-13 0 -22.5 9t-9.5 23v330h-288q-13 0 -22.5 9t-9.5 23v103q0 13 9.5 22.5t22.5 9.5h288v85h-288q-13 0 -22.5 9t-9.5 23v104q0 13 9.5 22.5t22.5 9.5h214l-321 578q-8 16 0 32q10 16 28 16h194q19 0 29 -18l215 -425q19 -38 56 -125q10 24 30.5 68t27.5 61 l191 420q8 19 29 19h191q17 0 27 -16q9 -14 1 -31l-313 -579h215q13 0 22.5 -9.5t9.5 -22.5v-104q0 -14 -9.5 -23t-22.5 -9h-290v-85h290q13 0 22.5 -9.5t9.5 -22.5v-103q0 -14 -9.5 -23t-22.5 -9h-290v-330q0 -13 -9.5 -22.5t-22.5 -9.5z" />
+<glyph unicode="&#xf158;" horiz-adv-x="1664" d="M1664 352v-32q0 -132 -94 -226t-226 -94h-128q-132 0 -226 94t-94 226v480h-224q-2 -102 -14.5 -190.5t-30.5 -156t-48.5 -126.5t-57 -99.5t-67.5 -77.5t-69.5 -58.5t-74 -44t-69 -32t-65.5 -25.5q-4 -2 -32 -13q-8 -2 -12 -2q-22 0 -30 20l-71 178q-5 13 0 25t17 17 q7 3 20 7.5t18 6.5q31 12 46.5 18.5t44.5 20t45.5 26t42 32.5t40.5 42.5t34.5 53.5t30.5 68.5t22.5 83.5t17 103t6.5 123h-256q-14 0 -23 9t-9 23v160q0 14 9 23t23 9h1216q14 0 23 -9t9 -23v-160q0 -14 -9 -23t-23 -9h-224v-512q0 -26 19 -45t45 -19h128q26 0 45 19t19 45 v64q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1280 1376v-160q0 -14 -9 -23t-23 -9h-960q-14 0 -23 9t-9 23v160q0 14 9 23t23 9h960q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf159;" horiz-adv-x="1792" d="M514 341l81 299h-159l75 -300q1 -1 1 -3t1 -3q0 1 0.5 3.5t0.5 3.5zM630 768l35 128h-292l32 -128h225zM822 768h139l-35 128h-70zM1271 340l78 300h-162l81 -299q0 -1 0.5 -3.5t1.5 -3.5q0 1 0.5 3t0.5 3zM1382 768l33 128h-297l34 -128h230zM1792 736v-64q0 -14 -9 -23 t-23 -9h-213l-164 -616q-7 -24 -31 -24h-159q-24 0 -31 24l-166 616h-209l-167 -616q-7 -24 -31 -24h-159q-11 0 -19.5 7t-10.5 17l-160 616h-208q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h175l-33 128h-142q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h109l-89 344q-5 15 5 28 q10 12 26 12h137q26 0 31 -24l90 -360h359l97 360q7 24 31 24h126q24 0 31 -24l98 -360h365l93 360q5 24 31 24h137q16 0 26 -12q10 -13 5 -28l-91 -344h111q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-145l-34 -128h179q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf15a;" horiz-adv-x="1280" d="M1167 896q18 -182 -131 -258q117 -28 175 -103t45 -214q-7 -71 -32.5 -125t-64.5 -89t-97 -58.5t-121.5 -34.5t-145.5 -15v-255h-154v251q-80 0 -122 1v-252h-154v255q-18 0 -54 0.5t-55 0.5h-200l31 183h111q50 0 58 51v402h16q-6 1 -16 1v287q-13 68 -89 68h-111v164 l212 -1q64 0 97 1v252h154v-247q82 2 122 2v245h154v-252q79 -7 140 -22.5t113 -45t82.5 -78t36.5 -114.5zM952 351q0 36 -15 64t-37 46t-57.5 30.5t-65.5 18.5t-74 9t-69 3t-64.5 -1t-47.5 -1v-338q8 0 37 -0.5t48 -0.5t53 1.5t58.5 4t57 8.5t55.5 14t47.5 21t39.5 30 t24.5 40t9.5 51zM881 827q0 33 -12.5 58.5t-30.5 42t-48 28t-55 16.5t-61.5 8t-58 2.5t-54 -1t-39.5 -0.5v-307q5 0 34.5 -0.5t46.5 0t50 2t55 5.5t51.5 11t48.5 18.5t37 27t27 38.5t9 51z" />
+<glyph unicode="&#xf15b;" horiz-adv-x="1280" d="M1280 768v-800q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h544v-544q0 -40 28 -68t68 -28h544zM1277 896h-509v509q82 -15 132 -65l312 -312q50 -50 65 -132z" />
+<glyph unicode="&#xf15c;" horiz-adv-x="1280" d="M1024 160v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23zM1024 416v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23zM1280 768v-800q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28 t-28 68v1344q0 40 28 68t68 28h544v-544q0 -40 28 -68t68 -28h544zM1277 896h-509v509q82 -15 132 -65l312 -312q50 -50 65 -132z" />
+<glyph unicode="&#xf15d;" horiz-adv-x="1664" d="M1191 1128h177l-72 218l-12 47q-2 16 -2 20h-4l-3 -20q0 -1 -3.5 -18t-7.5 -29zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1572 -23 v-233h-584v90l369 529q12 18 21 27l11 9v3q-2 0 -6.5 -0.5t-7.5 -0.5q-12 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530q-6 -8 -21 -26l-11 -11v-2l14 2q9 2 30 2h248v119h121zM1661 874v-106h-288v106h75l-47 144h-243l-47 -144h75v-106h-287v106h70l230 662h162 l230 -662h70z" />
+<glyph unicode="&#xf15e;" horiz-adv-x="1664" d="M1191 104h177l-72 218l-12 47q-2 16 -2 20h-4l-3 -20q0 -1 -3.5 -18t-7.5 -29zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1661 -150 v-106h-288v106h75l-47 144h-243l-47 -144h75v-106h-287v106h70l230 662h162l230 -662h70zM1572 1001v-233h-584v90l369 529q12 18 21 27l11 9v3q-2 0 -6.5 -0.5t-7.5 -0.5q-12 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530q-6 -8 -21 -26l-11 -10v-3l14 3q9 1 30 1h248 v119h121z" />
+<glyph unicode="&#xf160;" horiz-adv-x="1792" d="M736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1792 -32v-192q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h832 q14 0 23 -9t9 -23zM1600 480v-192q0 -14 -9 -23t-23 -9h-640q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h640q14 0 23 -9t9 -23zM1408 992v-192q0 -14 -9 -23t-23 -9h-448q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h448q14 0 23 -9t9 -23zM1216 1504v-192q0 -14 -9 -23t-23 -9h-256 q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h256q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf161;" horiz-adv-x="1792" d="M1216 -32v-192q0 -14 -9 -23t-23 -9h-256q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h256q14 0 23 -9t9 -23zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192 q14 0 23 -9t9 -23zM1408 480v-192q0 -14 -9 -23t-23 -9h-448q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h448q14 0 23 -9t9 -23zM1600 992v-192q0 -14 -9 -23t-23 -9h-640q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h640q14 0 23 -9t9 -23zM1792 1504v-192q0 -14 -9 -23t-23 -9h-832 q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h832q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf162;" d="M1346 223q0 63 -44 116t-103 53q-52 0 -83 -37t-31 -94t36.5 -95t104.5 -38q50 0 85 27t35 68zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23 zM1486 165q0 -62 -13 -121.5t-41 -114t-68 -95.5t-98.5 -65.5t-127.5 -24.5q-62 0 -108 16q-24 8 -42 15l39 113q15 -7 31 -11q37 -13 75 -13q84 0 134.5 58.5t66.5 145.5h-2q-21 -23 -61.5 -37t-84.5 -14q-106 0 -173 71.5t-67 172.5q0 105 72 178t181 73q123 0 205 -94.5 t82 -252.5zM1456 882v-114h-469v114h167v432q0 7 0.5 19t0.5 17v16h-2l-7 -12q-8 -13 -26 -31l-62 -58l-82 86l192 185h123v-654h165z" />
+<glyph unicode="&#xf163;" d="M1346 1247q0 63 -44 116t-103 53q-52 0 -83 -37t-31 -94t36.5 -95t104.5 -38q50 0 85 27t35 68zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9 t9 -23zM1456 -142v-114h-469v114h167v432q0 7 0.5 19t0.5 17v16h-2l-7 -12q-8 -13 -26 -31l-62 -58l-82 86l192 185h123v-654h165zM1486 1189q0 -62 -13 -121.5t-41 -114t-68 -95.5t-98.5 -65.5t-127.5 -24.5q-62 0 -108 16q-24 8 -42 15l39 113q15 -7 31 -11q37 -13 75 -13 q84 0 134.5 58.5t66.5 145.5h-2q-21 -23 -61.5 -37t-84.5 -14q-106 0 -173 71.5t-67 172.5q0 105 72 178t181 73q123 0 205 -94.5t82 -252.5z" />
+<glyph unicode="&#xf164;" horiz-adv-x="1664" d="M256 192q0 26 -19 45t-45 19q-27 0 -45.5 -19t-18.5 -45q0 -27 18.5 -45.5t45.5 -18.5q26 0 45 18.5t19 45.5zM416 704v-640q0 -26 -19 -45t-45 -19h-288q-26 0 -45 19t-19 45v640q0 26 19 45t45 19h288q26 0 45 -19t19 -45zM1600 704q0 -86 -55 -149q15 -44 15 -76 q3 -76 -43 -137q17 -56 0 -117q-15 -57 -54 -94q9 -112 -49 -181q-64 -76 -197 -78h-36h-76h-17q-66 0 -144 15.5t-121.5 29t-120.5 39.5q-123 43 -158 44q-26 1 -45 19.5t-19 44.5v641q0 25 18 43.5t43 20.5q24 2 76 59t101 121q68 87 101 120q18 18 31 48t17.5 48.5 t13.5 60.5q7 39 12.5 61t19.5 52t34 50q19 19 45 19q46 0 82.5 -10.5t60 -26t40 -40.5t24 -45t12 -50t5 -45t0.5 -39q0 -38 -9.5 -76t-19 -60t-27.5 -56q-3 -6 -10 -18t-11 -22t-8 -24h277q78 0 135 -57t57 -135z" />
+<glyph unicode="&#xf165;" horiz-adv-x="1664" d="M256 960q0 -26 -19 -45t-45 -19q-27 0 -45.5 19t-18.5 45q0 27 18.5 45.5t45.5 18.5q26 0 45 -18.5t19 -45.5zM416 448v640q0 26 -19 45t-45 19h-288q-26 0 -45 -19t-19 -45v-640q0 -26 19 -45t45 -19h288q26 0 45 19t19 45zM1545 597q55 -61 55 -149q-1 -78 -57.5 -135 t-134.5 -57h-277q4 -14 8 -24t11 -22t10 -18q18 -37 27 -57t19 -58.5t10 -76.5q0 -24 -0.5 -39t-5 -45t-12 -50t-24 -45t-40 -40.5t-60 -26t-82.5 -10.5q-26 0 -45 19q-20 20 -34 50t-19.5 52t-12.5 61q-9 42 -13.5 60.5t-17.5 48.5t-31 48q-33 33 -101 120q-49 64 -101 121 t-76 59q-25 2 -43 20.5t-18 43.5v641q0 26 19 44.5t45 19.5q35 1 158 44q77 26 120.5 39.5t121.5 29t144 15.5h17h76h36q133 -2 197 -78q58 -69 49 -181q39 -37 54 -94q17 -61 0 -117q46 -61 43 -137q0 -32 -15 -76z" />
+<glyph unicode="&#xf166;" d="M919 233v157q0 50 -29 50q-17 0 -33 -16v-224q16 -16 33 -16q29 0 29 49zM1103 355h66v34q0 51 -33 51t-33 -51v-34zM532 621v-70h-80v-423h-74v423h-78v70h232zM733 495v-367h-67v40q-39 -45 -76 -45q-33 0 -42 28q-6 16 -6 54v290h66v-270q0 -24 1 -26q1 -15 15 -15 q20 0 42 31v280h67zM985 384v-146q0 -52 -7 -73q-12 -42 -53 -42q-35 0 -68 41v-36h-67v493h67v-161q32 40 68 40q41 0 53 -42q7 -21 7 -74zM1236 255v-9q0 -29 -2 -43q-3 -22 -15 -40q-27 -40 -80 -40q-52 0 -81 38q-21 27 -21 86v129q0 59 20 86q29 38 80 38t78 -38 q21 -28 21 -86v-76h-133v-65q0 -51 34 -51q24 0 30 26q0 1 0.5 7t0.5 16.5v21.5h68zM785 1079v-156q0 -51 -32 -51t-32 51v156q0 52 32 52t32 -52zM1318 366q0 177 -19 260q-10 44 -43 73.5t-76 34.5q-136 15 -412 15q-275 0 -411 -15q-44 -5 -76.5 -34.5t-42.5 -73.5 q-20 -87 -20 -260q0 -176 20 -260q10 -43 42.5 -73t75.5 -35q137 -15 412 -15t412 15q43 5 75.5 35t42.5 73q20 84 20 260zM563 1017l90 296h-75l-51 -195l-53 195h-78l24 -69t23 -69q35 -103 46 -158v-201h74v201zM852 936v130q0 58 -21 87q-29 38 -78 38q-51 0 -78 -38 q-21 -29 -21 -87v-130q0 -58 21 -87q27 -38 78 -38q49 0 78 38q21 27 21 87zM1033 816h67v370h-67v-283q-22 -31 -42 -31q-15 0 -16 16q-1 2 -1 26v272h-67v-293q0 -37 6 -55q11 -27 43 -27q36 0 77 45v-40zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960 q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf167;" d="M971 292v-211q0 -67 -39 -67q-23 0 -45 22v301q22 22 45 22q39 0 39 -67zM1309 291v-46h-90v46q0 68 45 68t45 -68zM343 509h107v94h-312v-94h105v-569h100v569zM631 -60h89v494h-89v-378q-30 -42 -57 -42q-18 0 -21 21q-1 3 -1 35v364h-89v-391q0 -49 8 -73 q12 -37 58 -37q48 0 102 61v-54zM1060 88v197q0 73 -9 99q-17 56 -71 56q-50 0 -93 -54v217h-89v-663h89v48q45 -55 93 -55q54 0 71 55q9 27 9 100zM1398 98v13h-91q0 -51 -2 -61q-7 -36 -40 -36q-46 0 -46 69v87h179v103q0 79 -27 116q-39 51 -106 51q-68 0 -107 -51 q-28 -37 -28 -116v-173q0 -79 29 -116q39 -51 108 -51q72 0 108 53q18 27 21 54q2 9 2 58zM790 1011v210q0 69 -43 69t-43 -69v-210q0 -70 43 -70t43 70zM1509 260q0 -234 -26 -350q-14 -59 -58 -99t-102 -46q-184 -21 -555 -21t-555 21q-58 6 -102.5 46t-57.5 99 q-26 112 -26 350q0 234 26 350q14 59 58 99t103 47q183 20 554 20t555 -20q58 -7 102.5 -47t57.5 -99q26 -112 26 -350zM511 1536h102l-121 -399v-271h-100v271q-14 74 -61 212q-37 103 -65 187h106l71 -263zM881 1203v-175q0 -81 -28 -118q-37 -51 -106 -51q-67 0 -105 51 q-28 38 -28 118v175q0 80 28 117q38 51 105 51q69 0 106 -51q28 -37 28 -117zM1216 1365v-499h-91v55q-53 -62 -103 -62q-46 0 -59 37q-8 24 -8 75v394h91v-367q0 -33 1 -35q3 -22 21 -22q27 0 57 43v381h91z" />
+<glyph unicode="&#xf168;" horiz-adv-x="1408" d="M597 869q-10 -18 -257 -456q-27 -46 -65 -46h-239q-21 0 -31 17t0 36l253 448q1 0 0 1l-161 279q-12 22 -1 37q9 15 32 15h239q40 0 66 -45zM1403 1511q11 -16 0 -37l-528 -934v-1l336 -615q11 -20 1 -37q-10 -15 -32 -15h-239q-42 0 -66 45l-339 622q18 32 531 942 q25 45 64 45h241q22 0 31 -15z" />
+<glyph unicode="&#xf169;" d="M685 771q0 1 -126 222q-21 34 -52 34h-184q-18 0 -26 -11q-7 -12 1 -29l125 -216v-1l-196 -346q-9 -14 0 -28q8 -13 24 -13h185q31 0 50 36zM1309 1268q-7 12 -24 12h-187q-30 0 -49 -35l-411 -729q1 -2 262 -481q20 -35 52 -35h184q18 0 25 12q8 13 -1 28l-260 476v1 l409 723q8 16 0 28zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf16a;" horiz-adv-x="1792" d="M1280 640q0 37 -30 54l-512 320q-31 20 -65 2q-33 -18 -33 -56v-640q0 -38 33 -56q16 -8 31 -8q20 0 34 10l512 320q30 17 30 54zM1792 640q0 -96 -1 -150t-8.5 -136.5t-22.5 -147.5q-16 -73 -69 -123t-124 -58q-222 -25 -671 -25t-671 25q-71 8 -124.5 58t-69.5 123 q-14 65 -21.5 147.5t-8.5 136.5t-1 150t1 150t8.5 136.5t22.5 147.5q16 73 69 123t124 58q222 25 671 25t671 -25q71 -8 124.5 -58t69.5 -123q14 -65 21.5 -147.5t8.5 -136.5t1 -150z" />
+<glyph unicode="&#xf16b;" horiz-adv-x="1792" d="M402 829l494 -305l-342 -285l-490 319zM1388 274v-108l-490 -293v-1l-1 1l-1 -1v1l-489 293v108l147 -96l342 284v2l1 -1l1 1v-2l343 -284zM554 1418l342 -285l-494 -304l-338 270zM1390 829l338 -271l-489 -319l-343 285zM1239 1418l489 -319l-338 -270l-494 304z" />
+<glyph unicode="&#xf16c;" horiz-adv-x="1408" d="M928 135v-151l-707 -1v151zM1169 481v-701l-1 -35v-1h-1132l-35 1h-1v736h121v-618h928v618h120zM241 393l704 -65l-13 -150l-705 65zM309 709l683 -183l-39 -146l-683 183zM472 1058l609 -360l-77 -130l-609 360zM832 1389l398 -585l-124 -85l-399 584zM1285 1536 l121 -697l-149 -26l-121 697z" />
+<glyph unicode="&#xf16d;" d="M1362 110v648h-135q20 -63 20 -131q0 -126 -64 -232.5t-174 -168.5t-240 -62q-197 0 -337 135.5t-140 327.5q0 68 20 131h-141v-648q0 -26 17.5 -43.5t43.5 -17.5h1069q25 0 43 17.5t18 43.5zM1078 643q0 124 -90.5 211.5t-218.5 87.5q-127 0 -217.5 -87.5t-90.5 -211.5 t90.5 -211.5t217.5 -87.5q128 0 218.5 87.5t90.5 211.5zM1362 1003v165q0 28 -20 48.5t-49 20.5h-174q-29 0 -49 -20.5t-20 -48.5v-165q0 -29 20 -49t49 -20h174q29 0 49 20t20 49zM1536 1211v-1142q0 -81 -58 -139t-139 -58h-1142q-81 0 -139 58t-58 139v1142q0 81 58 139 t139 58h1142q81 0 139 -58t58 -139z" />
+<glyph unicode="&#xf16e;" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM698 640q0 88 -62 150t-150 62t-150 -62t-62 -150t62 -150t150 -62t150 62t62 150zM1262 640q0 88 -62 150 t-150 62t-150 -62t-62 -150t62 -150t150 -62t150 62t62 150z" />
+<glyph unicode="&#xf170;" d="M768 914l201 -306h-402zM1133 384h94l-459 691l-459 -691h94l104 160h522zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf171;" horiz-adv-x="1408" d="M815 677q8 -63 -50.5 -101t-111.5 -6q-39 17 -53.5 58t-0.5 82t52 58q36 18 72.5 12t64 -35.5t27.5 -67.5zM926 698q-14 107 -113 164t-197 13q-63 -28 -100.5 -88.5t-34.5 -129.5q4 -91 77.5 -155t165.5 -56q91 8 152 84t50 168zM1165 1240q-20 27 -56 44.5t-58 22 t-71 12.5q-291 47 -566 -2q-43 -7 -66 -12t-55 -22t-50 -43q30 -28 76 -45.5t73.5 -22t87.5 -11.5q228 -29 448 -1q63 8 89.5 12t72.5 21.5t75 46.5zM1222 205q-8 -26 -15.5 -76.5t-14 -84t-28.5 -70t-58 -56.5q-86 -48 -189.5 -71.5t-202 -22t-201.5 18.5q-46 8 -81.5 18 t-76.5 27t-73 43.5t-52 61.5q-25 96 -57 292l6 16l18 9q223 -148 506.5 -148t507.5 148q21 -6 24 -23t-5 -45t-8 -37zM1403 1166q-26 -167 -111 -655q-5 -30 -27 -56t-43.5 -40t-54.5 -31q-252 -126 -610 -88q-248 27 -394 139q-15 12 -25.5 26.5t-17 35t-9 34t-6 39.5 t-5.5 35q-9 50 -26.5 150t-28 161.5t-23.5 147.5t-22 158q3 26 17.5 48.5t31.5 37.5t45 30t46 22.5t48 18.5q125 46 313 64q379 37 676 -50q155 -46 215 -122q16 -20 16.5 -51t-5.5 -54z" />
+<glyph unicode="&#xf172;" d="M848 666q0 43 -41 66t-77 1q-43 -20 -42.5 -72.5t43.5 -70.5q39 -23 81 4t36 72zM928 682q8 -66 -36 -121t-110 -61t-119 40t-56 113q-2 49 25.5 93t72.5 64q70 31 141.5 -10t81.5 -118zM1100 1073q-20 -21 -53.5 -34t-53 -16t-63.5 -8q-155 -20 -324 0q-44 6 -63 9.5 t-52.5 16t-54.5 32.5q13 19 36 31t40 15.5t47 8.5q198 35 408 1q33 -5 51 -8.5t43 -16t39 -31.5zM1142 327q0 7 5.5 26.5t3 32t-17.5 16.5q-161 -106 -365 -106t-366 106l-12 -6l-5 -12q26 -154 41 -210q47 -81 204 -108q249 -46 428 53q34 19 49 51.5t22.5 85.5t12.5 71z M1272 1020q9 53 -8 75q-43 55 -155 88q-216 63 -487 36q-132 -12 -226 -46q-38 -15 -59.5 -25t-47 -34t-29.5 -54q8 -68 19 -138t29 -171t24 -137q1 -5 5 -31t7 -36t12 -27t22 -28q105 -80 284 -100q259 -28 440 63q24 13 39.5 23t31 29t19.5 40q48 267 80 473zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf173;" horiz-adv-x="1024" d="M390 1408h219v-388h364v-241h-364v-394q0 -136 14 -172q13 -37 52 -60q50 -31 117 -31q117 0 232 76v-242q-102 -48 -178 -65q-77 -19 -173 -19q-105 0 -186 27q-78 25 -138 75q-58 51 -79 105q-22 54 -22 161v539h-170v217q91 30 155 84q64 55 103 132q39 78 54 196z " />
+<glyph unicode="&#xf174;" d="M1123 127v181q-88 -56 -174 -56q-51 0 -88 23q-29 17 -39 45q-11 30 -11 129v295h274v181h-274v291h-164q-11 -90 -40 -147t-78 -99q-48 -40 -116 -63v-163h127v-404q0 -78 17 -121q17 -42 59 -78q43 -37 104 -57q62 -20 140 -20q67 0 129 14q57 13 134 49zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf175;" horiz-adv-x="768" d="M765 237q8 -19 -5 -35l-350 -384q-10 -10 -23 -10q-14 0 -24 10l-355 384q-13 16 -5 35q9 19 29 19h224v1248q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1248h224q21 0 29 -19z" />
+<glyph unicode="&#xf176;" horiz-adv-x="768" d="M765 1043q-9 -19 -29 -19h-224v-1248q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v1248h-224q-21 0 -29 19t5 35l350 384q10 10 23 10q14 0 24 -10l355 -384q13 -16 5 -35z" />
+<glyph unicode="&#xf177;" horiz-adv-x="1792" d="M1792 736v-192q0 -14 -9 -23t-23 -9h-1248v-224q0 -21 -19 -29t-35 5l-384 350q-10 10 -10 23q0 14 10 24l384 354q16 14 35 6q19 -9 19 -29v-224h1248q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf178;" horiz-adv-x="1792" d="M1728 643q0 -14 -10 -24l-384 -354q-16 -14 -35 -6q-19 9 -19 29v224h-1248q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h1248v224q0 21 19 29t35 -5l384 -350q10 -10 10 -23z" />
+<glyph unicode="&#xf179;" horiz-adv-x="1408" d="M1393 321q-39 -125 -123 -250q-129 -196 -257 -196q-49 0 -140 32q-86 32 -151 32q-61 0 -142 -33q-81 -34 -132 -34q-152 0 -301 259q-147 261 -147 503q0 228 113 374q112 144 284 144q72 0 177 -30q104 -30 138 -30q45 0 143 34q102 34 173 34q119 0 213 -65 q52 -36 104 -100q-79 -67 -114 -118q-65 -94 -65 -207q0 -124 69 -223t158 -126zM1017 1494q0 -61 -29 -136q-30 -75 -93 -138q-54 -54 -108 -72q-37 -11 -104 -17q3 149 78 257q74 107 250 148q1 -3 2.5 -11t2.5 -11q0 -4 0.5 -10t0.5 -10z" />
+<glyph unicode="&#xf17a;" horiz-adv-x="1664" d="M682 530v-651l-682 94v557h682zM682 1273v-659h-682v565zM1664 530v-786l-907 125v661h907zM1664 1408v-794h-907v669z" />
+<glyph unicode="&#xf17b;" horiz-adv-x="1408" d="M493 1053q16 0 27.5 11.5t11.5 27.5t-11.5 27.5t-27.5 11.5t-27 -11.5t-11 -27.5t11 -27.5t27 -11.5zM915 1053q16 0 27 11.5t11 27.5t-11 27.5t-27 11.5t-27.5 -11.5t-11.5 -27.5t11.5 -27.5t27.5 -11.5zM103 869q42 0 72 -30t30 -72v-430q0 -43 -29.5 -73t-72.5 -30 t-73 30t-30 73v430q0 42 30 72t73 30zM1163 850v-666q0 -46 -32 -78t-77 -32h-75v-227q0 -43 -30 -73t-73 -30t-73 30t-30 73v227h-138v-227q0 -43 -30 -73t-73 -30q-42 0 -72 30t-30 73l-1 227h-74q-46 0 -78 32t-32 78v666h918zM931 1255q107 -55 171 -153.5t64 -215.5 h-925q0 117 64 215.5t172 153.5l-71 131q-7 13 5 20q13 6 20 -6l72 -132q95 42 201 42t201 -42l72 132q7 12 20 6q12 -7 5 -20zM1408 767v-430q0 -43 -30 -73t-73 -30q-42 0 -72 30t-30 73v430q0 43 30 72.5t72 29.5q43 0 73 -29.5t30 -72.5z" />
+<glyph unicode="&#xf17c;" d="M663 1125q-11 -1 -15.5 -10.5t-8.5 -9.5q-5 -1 -5 5q0 12 19 15h10zM750 1111q-4 -1 -11.5 6.5t-17.5 4.5q24 11 32 -2q3 -6 -3 -9zM399 684q-4 1 -6 -3t-4.5 -12.5t-5.5 -13.5t-10 -13q-7 -10 -1 -12q4 -1 12.5 7t12.5 18q1 3 2 7t2 6t1.5 4.5t0.5 4v3t-1 2.5t-3 2z M1254 325q0 18 -55 42q4 15 7.5 27.5t5 26t3 21.5t0.5 22.5t-1 19.5t-3.5 22t-4 20.5t-5 25t-5.5 26.5q-10 48 -47 103t-72 75q24 -20 57 -83q87 -162 54 -278q-11 -40 -50 -42q-31 -4 -38.5 18.5t-8 83.5t-11.5 107q-9 39 -19.5 69t-19.5 45.5t-15.5 24.5t-13 15t-7.5 7 q-14 62 -31 103t-29.5 56t-23.5 33t-15 40q-4 21 6 53.5t4.5 49.5t-44.5 25q-15 3 -44.5 18t-35.5 16q-8 1 -11 26t8 51t36 27q37 3 51 -30t4 -58q-11 -19 -2 -26.5t30 -0.5q13 4 13 36v37q-5 30 -13.5 50t-21 30.5t-23.5 15t-27 7.5q-107 -8 -89 -134q0 -15 -1 -15 q-9 9 -29.5 10.5t-33 -0.5t-15.5 5q1 57 -16 90t-45 34q-27 1 -41.5 -27.5t-16.5 -59.5q-1 -15 3.5 -37t13 -37.5t15.5 -13.5q10 3 16 14q4 9 -7 8q-7 0 -15.5 14.5t-9.5 33.5q-1 22 9 37t34 14q17 0 27 -21t9.5 -39t-1.5 -22q-22 -15 -31 -29q-8 -12 -27.5 -23.5 t-20.5 -12.5q-13 -14 -15.5 -27t7.5 -18q14 -8 25 -19.5t16 -19t18.5 -13t35.5 -6.5q47 -2 102 15q2 1 23 7t34.5 10.5t29.5 13t21 17.5q9 14 20 8q5 -3 6.5 -8.5t-3 -12t-16.5 -9.5q-20 -6 -56.5 -21.5t-45.5 -19.5q-44 -19 -70 -23q-25 -5 -79 2q-10 2 -9 -2t17 -19 q25 -23 67 -22q17 1 36 7t36 14t33.5 17.5t30 17t24.5 12t17.5 2.5t8.5 -11q0 -2 -1 -4.5t-4 -5t-6 -4.5t-8.5 -5t-9 -4.5t-10 -5t-9.5 -4.5q-28 -14 -67.5 -44t-66.5 -43t-49 -1q-21 11 -63 73q-22 31 -25 22q-1 -3 -1 -10q0 -25 -15 -56.5t-29.5 -55.5t-21 -58t11.5 -63 q-23 -6 -62.5 -90t-47.5 -141q-2 -18 -1.5 -69t-5.5 -59q-8 -24 -29 -3q-32 31 -36 94q-2 28 4 56q4 19 -1 18l-4 -5q-36 -65 10 -166q5 -12 25 -28t24 -20q20 -23 104 -90.5t93 -76.5q16 -15 17.5 -38t-14 -43t-45.5 -23q8 -15 29 -44.5t28 -54t7 -70.5q46 24 7 92 q-4 8 -10.5 16t-9.5 12t-2 6q3 5 13 9.5t20 -2.5q46 -52 166 -36q133 15 177 87q23 38 34 30q12 -6 10 -52q-1 -25 -23 -92q-9 -23 -6 -37.5t24 -15.5q3 19 14.5 77t13.5 90q2 21 -6.5 73.5t-7.5 97t23 70.5q15 18 51 18q1 37 34.5 53t72.5 10.5t60 -22.5zM626 1152 q3 17 -2.5 30t-11.5 15q-9 2 -9 -7q2 -5 5 -6q10 0 7 -15q-3 -20 8 -20q3 0 3 3zM1045 955q-2 8 -6.5 11.5t-13 5t-14.5 5.5q-5 3 -9.5 8t-7 8t-5.5 6.5t-4 4t-4 -1.5q-14 -16 7 -43.5t39 -31.5q9 -1 14.5 8t3.5 20zM867 1168q0 11 -5 19.5t-11 12.5t-9 3q-14 -1 -7 -7l4 -2 q14 -4 18 -31q0 -3 8 2zM921 1401q0 2 -2.5 5t-9 7t-9.5 6q-15 15 -24 15q-9 -1 -11.5 -7.5t-1 -13t-0.5 -12.5q-1 -4 -6 -10.5t-6 -9t3 -8.5q4 -3 8 0t11 9t15 9q1 1 9 1t15 2t9 7zM1486 60q20 -12 31 -24.5t12 -24t-2.5 -22.5t-15.5 -22t-23.5 -19.5t-30 -18.5 t-31.5 -16.5t-32 -15.5t-27 -13q-38 -19 -85.5 -56t-75.5 -64q-17 -16 -68 -19.5t-89 14.5q-18 9 -29.5 23.5t-16.5 25.5t-22 19.5t-47 9.5q-44 1 -130 1q-19 0 -57 -1.5t-58 -2.5q-44 -1 -79.5 -15t-53.5 -30t-43.5 -28.5t-53.5 -11.5q-29 1 -111 31t-146 43q-19 4 -51 9.5 t-50 9t-39.5 9.5t-33.5 14.5t-17 19.5q-10 23 7 66.5t18 54.5q1 16 -4 40t-10 42.5t-4.5 36.5t10.5 27q14 12 57 14t60 12q30 18 42 35t12 51q21 -73 -32 -106q-32 -20 -83 -15q-34 3 -43 -10q-13 -15 5 -57q2 -6 8 -18t8.5 -18t4.5 -17t1 -22q0 -15 -17 -49t-14 -48 q3 -17 37 -26q20 -6 84.5 -18.5t99.5 -20.5q24 -6 74 -22t82.5 -23t55.5 -4q43 6 64.5 28t23 48t-7.5 58.5t-19 52t-20 36.5q-121 190 -169 242q-68 74 -113 40q-11 -9 -15 15q-3 16 -2 38q1 29 10 52t24 47t22 42q8 21 26.5 72t29.5 78t30 61t39 54q110 143 124 195 q-12 112 -16 310q-2 90 24 151.5t106 104.5q39 21 104 21q53 1 106 -13.5t89 -41.5q57 -42 91.5 -121.5t29.5 -147.5q-5 -95 30 -214q34 -113 133 -218q55 -59 99.5 -163t59.5 -191q8 -49 5 -84.5t-12 -55.5t-20 -22q-10 -2 -23.5 -19t-27 -35.5t-40.5 -33.5t-61 -14 q-18 1 -31.5 5t-22.5 13.5t-13.5 15.5t-11.5 20.5t-9 19.5q-22 37 -41 30t-28 -49t7 -97q20 -70 1 -195q-10 -65 18 -100.5t73 -33t85 35.5q59 49 89.5 66.5t103.5 42.5q53 18 77 36.5t18.5 34.5t-25 28.5t-51.5 23.5q-33 11 -49.5 48t-15 72.5t15.5 47.5q1 -31 8 -56.5 t14.5 -40.5t20.5 -28.5t21 -19t21.5 -13t16.5 -9.5z" />
+<glyph unicode="&#xf17d;" d="M1024 36q-42 241 -140 498h-2l-2 -1q-16 -6 -43 -16.5t-101 -49t-137 -82t-131 -114.5t-103 -148l-15 11q184 -150 418 -150q132 0 256 52zM839 643q-21 49 -53 111q-311 -93 -673 -93q-1 -7 -1 -21q0 -124 44 -236.5t124 -201.5q50 89 123.5 166.5t142.5 124.5t130.5 81 t99.5 48l37 13q4 1 13 3.5t13 4.5zM732 855q-120 213 -244 378q-138 -65 -234 -186t-128 -272q302 0 606 80zM1416 536q-210 60 -409 29q87 -239 128 -469q111 75 185 189.5t96 250.5zM611 1277q-1 0 -2 -1q1 1 2 1zM1201 1132q-185 164 -433 164q-76 0 -155 -19 q131 -170 246 -382q69 26 130 60.5t96.5 61.5t65.5 57t37.5 40.5zM1424 647q-3 232 -149 410l-1 -1q-9 -12 -19 -24.5t-43.5 -44.5t-71 -60.5t-100 -65t-131.5 -64.5q25 -53 44 -95q2 -6 6.5 -17.5t7.5 -16.5q36 5 74.5 7t73.5 2t69 -1.5t64 -4t56.5 -5.5t48 -6.5t36.5 -6 t25 -4.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf17e;" d="M1173 473q0 50 -19.5 91.5t-48.5 68.5t-73 49t-82.5 34t-87.5 23l-104 24q-30 7 -44 10.5t-35 11.5t-30 16t-16.5 21t-7.5 30q0 77 144 77q43 0 77 -12t54 -28.5t38 -33.5t40 -29t48 -12q47 0 75.5 32t28.5 77q0 55 -56 99.5t-142 67.5t-182 23q-68 0 -132 -15.5 t-119.5 -47t-89 -87t-33.5 -128.5q0 -61 19 -106.5t56 -75.5t80 -48.5t103 -32.5l146 -36q90 -22 112 -36q32 -20 32 -60q0 -39 -40 -64.5t-105 -25.5q-51 0 -91.5 16t-65 38.5t-45.5 45t-46 38.5t-54 16q-50 0 -75.5 -30t-25.5 -75q0 -92 122 -157.5t291 -65.5 q73 0 140 18.5t122.5 53.5t88.5 93.5t33 131.5zM1536 256q0 -159 -112.5 -271.5t-271.5 -112.5q-130 0 -234 80q-77 -16 -150 -16q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5q0 73 16 150q-80 104 -80 234q0 159 112.5 271.5t271.5 112.5q130 0 234 -80 q77 16 150 16q143 0 273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -73 -16 -150q80 -104 80 -234z" />
+<glyph unicode="&#xf180;" horiz-adv-x="1664" d="M1483 512l-587 -587q-52 -53 -127.5 -53t-128.5 53l-587 587q-53 53 -53 128t53 128l587 587q53 53 128 53t128 -53l265 -265l-398 -399l-188 188q-42 42 -99 42q-59 0 -100 -41l-120 -121q-42 -40 -42 -99q0 -58 42 -100l406 -408q30 -28 67 -37l6 -4h28q60 0 99 41 l619 619l2 -3q53 -53 53 -128t-53 -128zM1406 1138l120 -120q14 -15 14 -36t-14 -36l-730 -730q-17 -15 -37 -15v0q-4 0 -6 1q-18 2 -30 14l-407 408q-14 15 -14 36t14 35l121 120q13 15 35 15t36 -15l252 -252l574 575q15 15 36 15t36 -15z" />
+<glyph unicode="&#xf181;" d="M704 192v1024q0 14 -9 23t-23 9h-480q-14 0 -23 -9t-9 -23v-1024q0 -14 9 -23t23 -9h480q14 0 23 9t9 23zM1376 576v640q0 14 -9 23t-23 9h-480q-14 0 -23 -9t-9 -23v-640q0 -14 9 -23t23 -9h480q14 0 23 9t9 23zM1536 1344v-1408q0 -26 -19 -45t-45 -19h-1408 q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf182;" horiz-adv-x="1280" d="M1280 480q0 -40 -28 -68t-68 -28q-51 0 -80 43l-227 341h-45v-132l247 -411q9 -15 9 -33q0 -26 -19 -45t-45 -19h-192v-272q0 -46 -33 -79t-79 -33h-160q-46 0 -79 33t-33 79v272h-192q-26 0 -45 19t-19 45q0 18 9 33l247 411v132h-45l-227 -341q-29 -43 -80 -43 q-40 0 -68 28t-28 68q0 29 16 53l256 384q73 107 176 107h384q103 0 176 -107l256 -384q16 -24 16 -53zM864 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" />
+<glyph unicode="&#xf183;" horiz-adv-x="1024" d="M1024 832v-416q0 -40 -28 -68t-68 -28t-68 28t-28 68v352h-64v-912q0 -46 -33 -79t-79 -33t-79 33t-33 79v464h-64v-464q0 -46 -33 -79t-79 -33t-79 33t-33 79v912h-64v-352q0 -40 -28 -68t-68 -28t-68 28t-28 68v416q0 80 56 136t136 56h640q80 0 136 -56t56 -136z M736 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" />
+<glyph unicode="&#xf184;" d="M773 234l350 473q16 22 24.5 59t-6 85t-61.5 79q-40 26 -83 25.5t-73.5 -17.5t-54.5 -45q-36 -40 -96 -40q-59 0 -95 40q-24 28 -54.5 45t-73.5 17.5t-84 -25.5q-46 -31 -60.5 -79t-6 -85t24.5 -59zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf185;" horiz-adv-x="1792" d="M1472 640q0 117 -45.5 223.5t-123 184t-184 123t-223.5 45.5t-223.5 -45.5t-184 -123t-123 -184t-45.5 -223.5t45.5 -223.5t123 -184t184 -123t223.5 -45.5t223.5 45.5t184 123t123 184t45.5 223.5zM1748 363q-4 -15 -20 -20l-292 -96v-306q0 -16 -13 -26q-15 -10 -29 -4 l-292 94l-180 -248q-10 -13 -26 -13t-26 13l-180 248l-292 -94q-14 -6 -29 4q-13 10 -13 26v306l-292 96q-16 5 -20 20q-5 17 4 29l180 248l-180 248q-9 13 -4 29q4 15 20 20l292 96v306q0 16 13 26q15 10 29 4l292 -94l180 248q9 12 26 12t26 -12l180 -248l292 94 q14 6 29 -4q13 -10 13 -26v-306l292 -96q16 -5 20 -20q5 -16 -4 -29l-180 -248l180 -248q9 -12 4 -29z" />
+<glyph unicode="&#xf186;" d="M1262 233q-54 -9 -110 -9q-182 0 -337 90t-245 245t-90 337q0 192 104 357q-201 -60 -328.5 -229t-127.5 -384q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51q144 0 273.5 61.5t220.5 171.5zM1465 318q-94 -203 -283.5 -324.5t-413.5 -121.5q-156 0 -298 61 t-245 164t-164 245t-61 298q0 153 57.5 292.5t156 241.5t235.5 164.5t290 68.5q44 2 61 -39q18 -41 -15 -72q-86 -78 -131.5 -181.5t-45.5 -218.5q0 -148 73 -273t198 -198t273 -73q118 0 228 51q41 18 72 -13q14 -14 17.5 -34t-4.5 -38z" />
+<glyph unicode="&#xf187;" horiz-adv-x="1792" d="M1088 704q0 26 -19 45t-45 19h-256q-26 0 -45 -19t-19 -45t19 -45t45 -19h256q26 0 45 19t19 45zM1664 896v-960q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v960q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1728 1344v-256q0 -26 -19 -45t-45 -19h-1536 q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1536q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf188;" horiz-adv-x="1664" d="M1632 576q0 -26 -19 -45t-45 -19h-224q0 -171 -67 -290l208 -209q19 -19 19 -45t-19 -45q-18 -19 -45 -19t-45 19l-198 197q-5 -5 -15 -13t-42 -28.5t-65 -36.5t-82 -29t-97 -13v896h-128v-896q-51 0 -101.5 13.5t-87 33t-66 39t-43.5 32.5l-15 14l-183 -207 q-20 -21 -48 -21q-24 0 -43 16q-19 18 -20.5 44.5t15.5 46.5l202 227q-58 114 -58 274h-224q-26 0 -45 19t-19 45t19 45t45 19h224v294l-173 173q-19 19 -19 45t19 45t45 19t45 -19l173 -173h844l173 173q19 19 45 19t45 -19t19 -45t-19 -45l-173 -173v-294h224q26 0 45 -19 t19 -45zM1152 1152h-640q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5z" />
+<glyph unicode="&#xf189;" horiz-adv-x="1920" d="M1917 1016q23 -64 -150 -294q-24 -32 -65 -85q-78 -100 -90 -131q-17 -41 14 -81q17 -21 81 -82h1l1 -1l1 -1l2 -2q141 -131 191 -221q3 -5 6.5 -12.5t7 -26.5t-0.5 -34t-25 -27.5t-59 -12.5l-256 -4q-24 -5 -56 5t-52 22l-20 12q-30 21 -70 64t-68.5 77.5t-61 58 t-56.5 15.5q-3 -1 -8 -3.5t-17 -14.5t-21.5 -29.5t-17 -52t-6.5 -77.5q0 -15 -3.5 -27.5t-7.5 -18.5l-4 -5q-18 -19 -53 -22h-115q-71 -4 -146 16.5t-131.5 53t-103 66t-70.5 57.5l-25 24q-10 10 -27.5 30t-71.5 91t-106 151t-122.5 211t-130.5 272q-6 16 -6 27t3 16l4 6 q15 19 57 19l274 2q12 -2 23 -6.5t16 -8.5l5 -3q16 -11 24 -32q20 -50 46 -103.5t41 -81.5l16 -29q29 -60 56 -104t48.5 -68.5t41.5 -38.5t34 -14t27 5q2 1 5 5t12 22t13.5 47t9.5 81t0 125q-2 40 -9 73t-14 46l-6 12q-25 34 -85 43q-13 2 5 24q17 19 38 30q53 26 239 24 q82 -1 135 -13q20 -5 33.5 -13.5t20.5 -24t10.5 -32t3.5 -45.5t-1 -55t-2.5 -70.5t-1.5 -82.5q0 -11 -1 -42t-0.5 -48t3.5 -40.5t11.5 -39t22.5 -24.5q8 -2 17 -4t26 11t38 34.5t52 67t68 107.5q60 104 107 225q4 10 10 17.5t11 10.5l4 3l5 2.5t13 3t20 0.5l288 2 q39 5 64 -2.5t31 -16.5z" />
+<glyph unicode="&#xf18a;" horiz-adv-x="1792" d="M675 252q21 34 11 69t-45 50q-34 14 -73 1t-60 -46q-22 -34 -13 -68.5t43 -50.5t74.5 -2.5t62.5 47.5zM769 373q8 13 3.5 26.5t-17.5 18.5q-14 5 -28.5 -0.5t-21.5 -18.5q-17 -31 13 -45q14 -5 29 0.5t22 18.5zM943 266q-45 -102 -158 -150t-224 -12 q-107 34 -147.5 126.5t6.5 187.5q47 93 151.5 139t210.5 19q111 -29 158.5 -119.5t2.5 -190.5zM1255 426q-9 96 -89 170t-208.5 109t-274.5 21q-223 -23 -369.5 -141.5t-132.5 -264.5q9 -96 89 -170t208.5 -109t274.5 -21q223 23 369.5 141.5t132.5 264.5zM1563 422 q0 -68 -37 -139.5t-109 -137t-168.5 -117.5t-226 -83t-270.5 -31t-275 33.5t-240.5 93t-171.5 151t-65 199.5q0 115 69.5 245t197.5 258q169 169 341.5 236t246.5 -7q65 -64 20 -209q-4 -14 -1 -20t10 -7t14.5 0.5t13.5 3.5l6 2q139 59 246 59t153 -61q45 -63 0 -178 q-2 -13 -4.5 -20t4.5 -12.5t12 -7.5t17 -6q57 -18 103 -47t80 -81.5t34 -116.5zM1489 1046q42 -47 54.5 -108.5t-6.5 -117.5q-8 -23 -29.5 -34t-44.5 -4q-23 8 -34 29.5t-4 44.5q20 63 -24 111t-107 35q-24 -5 -45 8t-25 37q-5 24 8 44.5t37 25.5q60 13 119 -5.5t101 -65.5z M1670 1209q87 -96 112.5 -222.5t-13.5 -241.5q-9 -27 -34 -40t-52 -4t-40 34t-5 52q28 82 10 172t-80 158q-62 69 -148 95.5t-173 8.5q-28 -6 -52 9.5t-30 43.5t9.5 51.5t43.5 29.5q123 26 244 -11.5t208 -134.5z" />
+<glyph unicode="&#xf18b;" horiz-adv-x="1920" d="M805 163q-122 -67 -261 -67q-141 0 -261 67q98 61 167 149t94 191q25 -103 94 -191t167 -149zM453 1176v-344q0 -179 -89.5 -326t-234.5 -217q-129 152 -129 351q0 200 129.5 352t323.5 184zM958 991q-128 -152 -128 -351q0 -201 128 -351q-145 70 -234.5 218t-89.5 328 v341q196 -33 324 -185zM1638 163q-122 -67 -261 -67q-141 0 -261 67q98 61 167 149t94 191q25 -103 94 -191t167 -149zM1286 1176v-344q0 -179 -91 -326t-237 -217v0q133 154 133 351q0 195 -133 351q129 151 328 185zM1920 640q0 -201 -129 -351q-145 70 -234.5 218 t-89.5 328v341q194 -32 323.5 -184t129.5 -352z" />
+<glyph unicode="&#xf18c;" horiz-adv-x="1792" />
+<glyph unicode="&#xf18d;" horiz-adv-x="1792" />
+<glyph unicode="&#xf18e;" horiz-adv-x="1792" />
+<glyph unicode="&#xf500;" horiz-adv-x="1792" />
+</font>
+</defs></svg> \ No newline at end of file
diff --git a/library/font_awesome/font/fontawesome-webfont.ttf b/library/font_awesome/font/fontawesome-webfont.ttf
new file mode 100755
index 000000000..d36592469
--- /dev/null
+++ b/library/font_awesome/font/fontawesome-webfont.ttf
Binary files differ
diff --git a/library/font_awesome/font/fontawesome-webfont.woff b/library/font_awesome/font/fontawesome-webfont.woff
new file mode 100755
index 000000000..b9bd17e15
--- /dev/null
+++ b/library/font_awesome/font/fontawesome-webfont.woff
Binary files differ
diff --git a/library/font_awesome/less/bootstrap.less b/library/font_awesome/less/bootstrap.less
new file mode 100644
index 000000000..a2c96046b
--- /dev/null
+++ b/library/font_awesome/less/bootstrap.less
@@ -0,0 +1,84 @@
+/* BOOTSTRAP SPECIFIC CLASSES
+ * -------------------------- */
+
+/* Bootstrap 2.0 sprites.less reset */
+[class^="icon-"],
+[class*=" icon-"] {
+ display: inline;
+ width: auto;
+ height: auto;
+ line-height: normal;
+ vertical-align: baseline;
+ background-image: none;
+ background-position: 0% 0%;
+ background-repeat: repeat;
+ margin-top: 0;
+}
+
+/* more sprites.less reset */
+.icon-white,
+.nav-pills > .active > a > [class^="icon-"],
+.nav-pills > .active > a > [class*=" icon-"],
+.nav-list > .active > a > [class^="icon-"],
+.nav-list > .active > a > [class*=" icon-"],
+.navbar-inverse .nav > .active > a > [class^="icon-"],
+.navbar-inverse .nav > .active > a > [class*=" icon-"],
+.dropdown-menu > li > a:hover > [class^="icon-"],
+.dropdown-menu > li > a:hover > [class*=" icon-"],
+.dropdown-menu > .active > a > [class^="icon-"],
+.dropdown-menu > .active > a > [class*=" icon-"],
+.dropdown-submenu:hover > a > [class^="icon-"],
+.dropdown-submenu:hover > a > [class*=" icon-"] {
+ background-image: none;
+}
+
+
+/* keeps Bootstrap styles with and without icons the same */
+.btn, .nav {
+ [class^="icon-"],
+ [class*=" icon-"] {
+// display: inline;
+ &.icon-large { line-height: .9em; }
+ &.icon-spin { display: inline-block; }
+ }
+}
+.nav-tabs, .nav-pills {
+ [class^="icon-"],
+ [class*=" icon-"] {
+ &, &.icon-large { line-height: .9em; }
+ }
+}
+.btn {
+ [class^="icon-"],
+ [class*=" icon-"] {
+ &.pull-left, &.pull-right {
+ &.icon-2x { margin-top: .18em; }
+ }
+ &.icon-spin.icon-large { line-height: .8em; }
+ }
+}
+.btn.btn-small {
+ [class^="icon-"],
+ [class*=" icon-"] {
+ &.pull-left, &.pull-right {
+ &.icon-2x { margin-top: .25em; }
+ }
+ }
+}
+.btn.btn-large {
+ [class^="icon-"],
+ [class*=" icon-"] {
+ margin-top: 0; // overrides bootstrap default
+ &.pull-left, &.pull-right {
+ &.icon-2x { margin-top: .05em; }
+ }
+ &.pull-left.icon-2x { margin-right: .2em; }
+ &.pull-right.icon-2x { margin-left: .2em; }
+ }
+}
+
+/* Fixes alignment in nav lists */
+.nav-list [class^="icon-"],
+.nav-list [class*=" icon-"] {
+ line-height: inherit;
+}
diff --git a/library/font_awesome/less/core.less b/library/font_awesome/less/core.less
new file mode 100644
index 000000000..1ef7e2235
--- /dev/null
+++ b/library/font_awesome/less/core.less
@@ -0,0 +1,129 @@
+/* FONT AWESOME CORE
+ * -------------------------- */
+
+[class^="icon-"],
+[class*=" icon-"] {
+ .icon-FontAwesome();
+}
+
+[class^="icon-"]:before,
+[class*=" icon-"]:before {
+ text-decoration: inherit;
+ display: inline-block;
+ speak: none;
+}
+
+/* makes the font 33% larger relative to the icon container */
+.icon-large:before {
+ vertical-align: -10%;
+ font-size: 4/3em;
+}
+
+/* makes sure icons active on rollover in links */
+a {
+ [class^="icon-"],
+ [class*=" icon-"] {
+ display: inline;
+ }
+}
+
+/* increased font size for icon-large */
+[class^="icon-"],
+[class*=" icon-"] {
+ &.icon-fixed-width {
+ display: inline-block;
+ width: 16/14em;
+ text-align: right;
+ padding-right: 4/14em;
+ &.icon-large {
+ width: 20/14em;
+ }
+ }
+}
+
+.icons-ul {
+ margin-left: @icons-li-width;
+ list-style-type: none;
+
+ > li { position: relative; }
+
+ .icon-li {
+ position: absolute;
+ left: -@icons-li-width;
+ width: @icons-li-width;
+ text-align: center;
+ line-height: inherit;
+ }
+}
+
+// allows usage of the hide class directly on font awesome icons
+[class^="icon-"],
+[class*=" icon-"] {
+ &.hide {
+ display: none;
+ }
+}
+
+.icon-muted { color: @iconMuted; }
+.icon-light { color: @iconLight; }
+.icon-dark { color: @iconDark; }
+
+// Icon Borders
+// -------------------------
+
+.icon-border {
+ border: solid 1px @borderColor;
+ padding: .2em .25em .15em;
+ .border-radius(3px);
+}
+
+// Icon Sizes
+// -------------------------
+
+.icon-2x {
+ font-size: 2em;
+ &.icon-border {
+ border-width: 2px;
+ .border-radius(4px);
+ }
+}
+.icon-3x {
+ font-size: 3em;
+ &.icon-border {
+ border-width: 3px;
+ .border-radius(5px);
+ }
+}
+.icon-4x {
+ font-size: 4em;
+ &.icon-border {
+ border-width: 4px;
+ .border-radius(6px);
+ }
+}
+
+.icon-5x {
+ font-size: 5em;
+ &.icon-border {
+ border-width: 5px;
+ .border-radius(7px);
+ }
+}
+
+
+// Floats & Margins
+// -------------------------
+
+// Quick floats
+.pull-right { float: right; }
+.pull-left { float: left; }
+
+[class^="icon-"],
+[class*=" icon-"] {
+ &.pull-left {
+ margin-right: .3em;
+ }
+ &.pull-right {
+ margin-left: .3em;
+ }
+}
diff --git a/library/font_awesome/less/extras.less b/library/font_awesome/less/extras.less
new file mode 100644
index 000000000..c93c260c8
--- /dev/null
+++ b/library/font_awesome/less/extras.less
@@ -0,0 +1,93 @@
+/* EXTRAS
+ * -------------------------- */
+
+/* Stacked and layered icon */
+.icon-stack();
+
+/* Animated rotating icon */
+.icon-spin {
+ display: inline-block;
+ -moz-animation: spin 2s infinite linear;
+ -o-animation: spin 2s infinite linear;
+ -webkit-animation: spin 2s infinite linear;
+ animation: spin 2s infinite linear;
+}
+
+/* Prevent stack and spinners from being taken inline when inside a link */
+a .icon-stack,
+a .icon-spin {
+ display: inline-block;
+ text-decoration: none;
+}
+
+@-moz-keyframes spin {
+ 0% { -moz-transform: rotate(0deg); }
+ 100% { -moz-transform: rotate(359deg); }
+}
+@-webkit-keyframes spin {
+ 0% { -webkit-transform: rotate(0deg); }
+ 100% { -webkit-transform: rotate(359deg); }
+}
+@-o-keyframes spin {
+ 0% { -o-transform: rotate(0deg); }
+ 100% { -o-transform: rotate(359deg); }
+}
+@-ms-keyframes spin {
+ 0% { -ms-transform: rotate(0deg); }
+ 100% { -ms-transform: rotate(359deg); }
+}
+@keyframes spin {
+ 0% { transform: rotate(0deg); }
+ 100% { transform: rotate(359deg); }
+}
+
+/* Icon rotations and mirroring */
+.icon-rotate-90:before {
+ -webkit-transform: rotate(90deg);
+ -moz-transform: rotate(90deg);
+ -ms-transform: rotate(90deg);
+ -o-transform: rotate(90deg);
+ transform: rotate(90deg);
+ filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1);
+}
+
+.icon-rotate-180:before {
+ -webkit-transform: rotate(180deg);
+ -moz-transform: rotate(180deg);
+ -ms-transform: rotate(180deg);
+ -o-transform: rotate(180deg);
+ transform: rotate(180deg);
+ filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2);
+}
+
+.icon-rotate-270:before {
+ -webkit-transform: rotate(270deg);
+ -moz-transform: rotate(270deg);
+ -ms-transform: rotate(270deg);
+ -o-transform: rotate(270deg);
+ transform: rotate(270deg);
+ filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3);
+}
+
+.icon-flip-horizontal:before {
+ -webkit-transform: scale(-1, 1);
+ -moz-transform: scale(-1, 1);
+ -ms-transform: scale(-1, 1);
+ -o-transform: scale(-1, 1);
+ transform: scale(-1, 1);
+}
+
+.icon-flip-vertical:before {
+ -webkit-transform: scale(1, -1);
+ -moz-transform: scale(1, -1);
+ -ms-transform: scale(1, -1);
+ -o-transform: scale(1, -1);
+ transform: scale(1, -1);
+}
+
+/* ensure rotation occurs inside anchor tags */
+a {
+ .icon-rotate-90, .icon-rotate-180, .icon-rotate-270, .icon-flip-horizontal, .icon-flip-vertical {
+ &:before { display: inline-block; }
+ }
+}
diff --git a/library/font_awesome/less/font-awesome-ie7.less b/library/font_awesome/less/font-awesome-ie7.less
new file mode 100644
index 000000000..6675c4989
--- /dev/null
+++ b/library/font_awesome/less/font-awesome-ie7.less
@@ -0,0 +1,1953 @@
+/*!
+ * Font Awesome 3.2.1
+ * the iconic font designed for Bootstrap
+ * ------------------------------------------------------------------------------
+ * The full suite of pictographic icons, examples, and documentation can be
+ * found at http://fontawesome.io. Stay up to date on Twitter at
+ * http://twitter.com/fontawesome.
+ *
+ * License
+ * ------------------------------------------------------------------------------
+ * - The Font Awesome font is licensed under SIL OFL 1.1 -
+ * http://scripts.sil.org/OFL
+ * - Font Awesome CSS, LESS, and SASS files are licensed under MIT License -
+ * http://opensource.org/licenses/mit-license.html
+ * - Font Awesome documentation licensed under CC BY 3.0 -
+ * http://creativecommons.org/licenses/by/3.0/
+ * - Attribution is no longer required in Font Awesome 3.0, but much appreciated:
+ * "Font Awesome by Dave Gandy - http://fontawesome.io"
+ *
+ * Author - Dave Gandy
+ * ------------------------------------------------------------------------------
+ * Email: dave@fontawesome.io
+ * Twitter: http://twitter.com/davegandy
+ * Work: Lead Product Designer @ Kyruus - http://kyruus.com
+ */
+
+.icon-large {
+ font-size: 4/3em;
+ margin-top: -4px;
+ padding-top: 3px;
+ margin-bottom: -4px;
+ padding-bottom: 3px;
+ vertical-align: middle;
+}
+
+.nav {
+ [class^="icon-"],
+ [class*=" icon-"] {
+ vertical-align: inherit;
+ margin-top: -4px;
+ padding-top: 3px;
+ margin-bottom: -4px;
+ padding-bottom: 3px;
+ &.icon-large {
+ vertical-align: -25%;
+ }
+ }
+}
+
+.nav-pills, .nav-tabs {
+ [class^="icon-"],
+ [class*=" icon-"] {
+ &.icon-large {
+ line-height: .75em;
+ margin-top: -7px;
+ padding-top: 5px;
+ margin-bottom: -5px;
+ padding-bottom: 4px;
+ }
+ }
+}
+
+.btn {
+ [class^="icon-"],
+ [class*=" icon-"] {
+ &.pull-left, &.pull-right { vertical-align: inherit; }
+ &.icon-large {
+ margin-top: -.5em;
+ }
+ }
+}
+
+a [class^="icon-"],
+a [class*=" icon-"] {
+ cursor: pointer;
+}
+
+.ie7icon(@inner) { *zoom: ~"expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '@{inner}')"; }
+
+
+.icon-glass {
+ .ie7icon('&#xf000;');
+}
+
+
+.icon-music {
+ .ie7icon('&#xf001;');
+}
+
+
+.icon-search {
+ .ie7icon('&#xf002;');
+}
+
+
+.icon-envelope-alt {
+ .ie7icon('&#xf003;');
+}
+
+
+.icon-heart {
+ .ie7icon('&#xf004;');
+}
+
+
+.icon-star {
+ .ie7icon('&#xf005;');
+}
+
+
+.icon-star-empty {
+ .ie7icon('&#xf006;');
+}
+
+
+.icon-user {
+ .ie7icon('&#xf007;');
+}
+
+
+.icon-film {
+ .ie7icon('&#xf008;');
+}
+
+
+.icon-th-large {
+ .ie7icon('&#xf009;');
+}
+
+
+.icon-th {
+ .ie7icon('&#xf00a;');
+}
+
+
+.icon-th-list {
+ .ie7icon('&#xf00b;');
+}
+
+
+.icon-ok {
+ .ie7icon('&#xf00c;');
+}
+
+
+.icon-remove {
+ .ie7icon('&#xf00d;');
+}
+
+
+.icon-zoom-in {
+ .ie7icon('&#xf00e;');
+}
+
+
+.icon-zoom-out {
+ .ie7icon('&#xf010;');
+}
+
+
+.icon-off {
+ .ie7icon('&#xf011;');
+}
+
+.icon-power-off {
+ .ie7icon('&#xf011;');
+}
+
+
+.icon-signal {
+ .ie7icon('&#xf012;');
+}
+
+
+.icon-cog {
+ .ie7icon('&#xf013;');
+}
+
+.icon-gear {
+ .ie7icon('&#xf013;');
+}
+
+
+.icon-trash {
+ .ie7icon('&#xf014;');
+}
+
+
+.icon-home {
+ .ie7icon('&#xf015;');
+}
+
+
+.icon-file-alt {
+ .ie7icon('&#xf016;');
+}
+
+
+.icon-time {
+ .ie7icon('&#xf017;');
+}
+
+
+.icon-road {
+ .ie7icon('&#xf018;');
+}
+
+
+.icon-download-alt {
+ .ie7icon('&#xf019;');
+}
+
+
+.icon-download {
+ .ie7icon('&#xf01a;');
+}
+
+
+.icon-upload {
+ .ie7icon('&#xf01b;');
+}
+
+
+.icon-inbox {
+ .ie7icon('&#xf01c;');
+}
+
+
+.icon-play-circle {
+ .ie7icon('&#xf01d;');
+}
+
+
+.icon-repeat {
+ .ie7icon('&#xf01e;');
+}
+
+.icon-rotate-right {
+ .ie7icon('&#xf01e;');
+}
+
+
+.icon-refresh {
+ .ie7icon('&#xf021;');
+}
+
+
+.icon-list-alt {
+ .ie7icon('&#xf022;');
+}
+
+
+.icon-lock {
+ .ie7icon('&#xf023;');
+}
+
+
+.icon-flag {
+ .ie7icon('&#xf024;');
+}
+
+
+.icon-headphones {
+ .ie7icon('&#xf025;');
+}
+
+
+.icon-volume-off {
+ .ie7icon('&#xf026;');
+}
+
+
+.icon-volume-down {
+ .ie7icon('&#xf027;');
+}
+
+
+.icon-volume-up {
+ .ie7icon('&#xf028;');
+}
+
+
+.icon-qrcode {
+ .ie7icon('&#xf029;');
+}
+
+
+.icon-barcode {
+ .ie7icon('&#xf02a;');
+}
+
+
+.icon-tag {
+ .ie7icon('&#xf02b;');
+}
+
+
+.icon-tags {
+ .ie7icon('&#xf02c;');
+}
+
+
+.icon-book {
+ .ie7icon('&#xf02d;');
+}
+
+
+.icon-bookmark {
+ .ie7icon('&#xf02e;');
+}
+
+
+.icon-print {
+ .ie7icon('&#xf02f;');
+}
+
+
+.icon-camera {
+ .ie7icon('&#xf030;');
+}
+
+
+.icon-font {
+ .ie7icon('&#xf031;');
+}
+
+
+.icon-bold {
+ .ie7icon('&#xf032;');
+}
+
+
+.icon-italic {
+ .ie7icon('&#xf033;');
+}
+
+
+.icon-text-height {
+ .ie7icon('&#xf034;');
+}
+
+
+.icon-text-width {
+ .ie7icon('&#xf035;');
+}
+
+
+.icon-align-left {
+ .ie7icon('&#xf036;');
+}
+
+
+.icon-align-center {
+ .ie7icon('&#xf037;');
+}
+
+
+.icon-align-right {
+ .ie7icon('&#xf038;');
+}
+
+
+.icon-align-justify {
+ .ie7icon('&#xf039;');
+}
+
+
+.icon-list {
+ .ie7icon('&#xf03a;');
+}
+
+
+.icon-indent-left {
+ .ie7icon('&#xf03b;');
+}
+
+
+.icon-indent-right {
+ .ie7icon('&#xf03c;');
+}
+
+
+.icon-facetime-video {
+ .ie7icon('&#xf03d;');
+}
+
+
+.icon-picture {
+ .ie7icon('&#xf03e;');
+}
+
+
+.icon-pencil {
+ .ie7icon('&#xf040;');
+}
+
+
+.icon-map-marker {
+ .ie7icon('&#xf041;');
+}
+
+
+.icon-adjust {
+ .ie7icon('&#xf042;');
+}
+
+
+.icon-tint {
+ .ie7icon('&#xf043;');
+}
+
+
+.icon-edit {
+ .ie7icon('&#xf044;');
+}
+
+
+.icon-share {
+ .ie7icon('&#xf045;');
+}
+
+
+.icon-check {
+ .ie7icon('&#xf046;');
+}
+
+
+.icon-move {
+ .ie7icon('&#xf047;');
+}
+
+
+.icon-step-backward {
+ .ie7icon('&#xf048;');
+}
+
+
+.icon-fast-backward {
+ .ie7icon('&#xf049;');
+}
+
+
+.icon-backward {
+ .ie7icon('&#xf04a;');
+}
+
+
+.icon-play {
+ .ie7icon('&#xf04b;');
+}
+
+
+.icon-pause {
+ .ie7icon('&#xf04c;');
+}
+
+
+.icon-stop {
+ .ie7icon('&#xf04d;');
+}
+
+
+.icon-forward {
+ .ie7icon('&#xf04e;');
+}
+
+
+.icon-fast-forward {
+ .ie7icon('&#xf050;');
+}
+
+
+.icon-step-forward {
+ .ie7icon('&#xf051;');
+}
+
+
+.icon-eject {
+ .ie7icon('&#xf052;');
+}
+
+
+.icon-chevron-left {
+ .ie7icon('&#xf053;');
+}
+
+
+.icon-chevron-right {
+ .ie7icon('&#xf054;');
+}
+
+
+.icon-plus-sign {
+ .ie7icon('&#xf055;');
+}
+
+
+.icon-minus-sign {
+ .ie7icon('&#xf056;');
+}
+
+
+.icon-remove-sign {
+ .ie7icon('&#xf057;');
+}
+
+
+.icon-ok-sign {
+ .ie7icon('&#xf058;');
+}
+
+
+.icon-question-sign {
+ .ie7icon('&#xf059;');
+}
+
+
+.icon-info-sign {
+ .ie7icon('&#xf05a;');
+}
+
+
+.icon-screenshot {
+ .ie7icon('&#xf05b;');
+}
+
+
+.icon-remove-circle {
+ .ie7icon('&#xf05c;');
+}
+
+
+.icon-ok-circle {
+ .ie7icon('&#xf05d;');
+}
+
+
+.icon-ban-circle {
+ .ie7icon('&#xf05e;');
+}
+
+
+.icon-arrow-left {
+ .ie7icon('&#xf060;');
+}
+
+
+.icon-arrow-right {
+ .ie7icon('&#xf061;');
+}
+
+
+.icon-arrow-up {
+ .ie7icon('&#xf062;');
+}
+
+
+.icon-arrow-down {
+ .ie7icon('&#xf063;');
+}
+
+
+.icon-share-alt {
+ .ie7icon('&#xf064;');
+}
+
+.icon-mail-forward {
+ .ie7icon('&#xf064;');
+}
+
+
+.icon-resize-full {
+ .ie7icon('&#xf065;');
+}
+
+
+.icon-resize-small {
+ .ie7icon('&#xf066;');
+}
+
+
+.icon-plus {
+ .ie7icon('&#xf067;');
+}
+
+
+.icon-minus {
+ .ie7icon('&#xf068;');
+}
+
+
+.icon-asterisk {
+ .ie7icon('&#xf069;');
+}
+
+
+.icon-exclamation-sign {
+ .ie7icon('&#xf06a;');
+}
+
+
+.icon-gift {
+ .ie7icon('&#xf06b;');
+}
+
+
+.icon-leaf {
+ .ie7icon('&#xf06c;');
+}
+
+
+.icon-fire {
+ .ie7icon('&#xf06d;');
+}
+
+
+.icon-eye-open {
+ .ie7icon('&#xf06e;');
+}
+
+
+.icon-eye-close {
+ .ie7icon('&#xf070;');
+}
+
+
+.icon-warning-sign {
+ .ie7icon('&#xf071;');
+}
+
+
+.icon-plane {
+ .ie7icon('&#xf072;');
+}
+
+
+.icon-calendar {
+ .ie7icon('&#xf073;');
+}
+
+
+.icon-random {
+ .ie7icon('&#xf074;');
+}
+
+
+.icon-comment {
+ .ie7icon('&#xf075;');
+}
+
+
+.icon-magnet {
+ .ie7icon('&#xf076;');
+}
+
+
+.icon-chevron-up {
+ .ie7icon('&#xf077;');
+}
+
+
+.icon-chevron-down {
+ .ie7icon('&#xf078;');
+}
+
+
+.icon-retweet {
+ .ie7icon('&#xf079;');
+}
+
+
+.icon-shopping-cart {
+ .ie7icon('&#xf07a;');
+}
+
+
+.icon-folder-close {
+ .ie7icon('&#xf07b;');
+}
+
+
+.icon-folder-open {
+ .ie7icon('&#xf07c;');
+}
+
+
+.icon-resize-vertical {
+ .ie7icon('&#xf07d;');
+}
+
+
+.icon-resize-horizontal {
+ .ie7icon('&#xf07e;');
+}
+
+
+.icon-bar-chart {
+ .ie7icon('&#xf080;');
+}
+
+
+.icon-twitter-sign {
+ .ie7icon('&#xf081;');
+}
+
+
+.icon-facebook-sign {
+ .ie7icon('&#xf082;');
+}
+
+
+.icon-camera-retro {
+ .ie7icon('&#xf083;');
+}
+
+
+.icon-key {
+ .ie7icon('&#xf084;');
+}
+
+
+.icon-cogs {
+ .ie7icon('&#xf085;');
+}
+
+.icon-gears {
+ .ie7icon('&#xf085;');
+}
+
+
+.icon-comments {
+ .ie7icon('&#xf086;');
+}
+
+
+.icon-thumbs-up-alt {
+ .ie7icon('&#xf087;');
+}
+
+
+.icon-thumbs-down-alt {
+ .ie7icon('&#xf088;');
+}
+
+
+.icon-star-half {
+ .ie7icon('&#xf089;');
+}
+
+
+.icon-heart-empty {
+ .ie7icon('&#xf08a;');
+}
+
+
+.icon-signout {
+ .ie7icon('&#xf08b;');
+}
+
+
+.icon-linkedin-sign {
+ .ie7icon('&#xf08c;');
+}
+
+
+.icon-pushpin {
+ .ie7icon('&#xf08d;');
+}
+
+
+.icon-external-link {
+ .ie7icon('&#xf08e;');
+}
+
+
+.icon-signin {
+ .ie7icon('&#xf090;');
+}
+
+
+.icon-trophy {
+ .ie7icon('&#xf091;');
+}
+
+
+.icon-github-sign {
+ .ie7icon('&#xf092;');
+}
+
+
+.icon-upload-alt {
+ .ie7icon('&#xf093;');
+}
+
+
+.icon-lemon {
+ .ie7icon('&#xf094;');
+}
+
+
+.icon-phone {
+ .ie7icon('&#xf095;');
+}
+
+
+.icon-check-empty {
+ .ie7icon('&#xf096;');
+}
+
+.icon-unchecked {
+ .ie7icon('&#xf096;');
+}
+
+
+.icon-bookmark-empty {
+ .ie7icon('&#xf097;');
+}
+
+
+.icon-phone-sign {
+ .ie7icon('&#xf098;');
+}
+
+
+.icon-twitter {
+ .ie7icon('&#xf099;');
+}
+
+
+.icon-facebook {
+ .ie7icon('&#xf09a;');
+}
+
+
+.icon-github {
+ .ie7icon('&#xf09b;');
+}
+
+
+.icon-unlock {
+ .ie7icon('&#xf09c;');
+}
+
+
+.icon-credit-card {
+ .ie7icon('&#xf09d;');
+}
+
+
+.icon-rss {
+ .ie7icon('&#xf09e;');
+}
+
+
+.icon-hdd {
+ .ie7icon('&#xf0a0;');
+}
+
+
+.icon-bullhorn {
+ .ie7icon('&#xf0a1;');
+}
+
+
+.icon-bell {
+ .ie7icon('&#xf0a2;');
+}
+
+
+.icon-certificate {
+ .ie7icon('&#xf0a3;');
+}
+
+
+.icon-hand-right {
+ .ie7icon('&#xf0a4;');
+}
+
+
+.icon-hand-left {
+ .ie7icon('&#xf0a5;');
+}
+
+
+.icon-hand-up {
+ .ie7icon('&#xf0a6;');
+}
+
+
+.icon-hand-down {
+ .ie7icon('&#xf0a7;');
+}
+
+
+.icon-circle-arrow-left {
+ .ie7icon('&#xf0a8;');
+}
+
+
+.icon-circle-arrow-right {
+ .ie7icon('&#xf0a9;');
+}
+
+
+.icon-circle-arrow-up {
+ .ie7icon('&#xf0aa;');
+}
+
+
+.icon-circle-arrow-down {
+ .ie7icon('&#xf0ab;');
+}
+
+
+.icon-globe {
+ .ie7icon('&#xf0ac;');
+}
+
+
+.icon-wrench {
+ .ie7icon('&#xf0ad;');
+}
+
+
+.icon-tasks {
+ .ie7icon('&#xf0ae;');
+}
+
+
+.icon-filter {
+ .ie7icon('&#xf0b0;');
+}
+
+
+.icon-briefcase {
+ .ie7icon('&#xf0b1;');
+}
+
+
+.icon-fullscreen {
+ .ie7icon('&#xf0b2;');
+}
+
+
+.icon-group {
+ .ie7icon('&#xf0c0;');
+}
+
+
+.icon-link {
+ .ie7icon('&#xf0c1;');
+}
+
+
+.icon-cloud {
+ .ie7icon('&#xf0c2;');
+}
+
+
+.icon-beaker {
+ .ie7icon('&#xf0c3;');
+}
+
+
+.icon-cut {
+ .ie7icon('&#xf0c4;');
+}
+
+
+.icon-copy {
+ .ie7icon('&#xf0c5;');
+}
+
+
+.icon-paper-clip {
+ .ie7icon('&#xf0c6;');
+}
+
+.icon-paperclip {
+ .ie7icon('&#xf0c6;');
+}
+
+
+.icon-save {
+ .ie7icon('&#xf0c7;');
+}
+
+
+.icon-sign-blank {
+ .ie7icon('&#xf0c8;');
+}
+
+
+.icon-reorder {
+ .ie7icon('&#xf0c9;');
+}
+
+
+.icon-list-ul {
+ .ie7icon('&#xf0ca;');
+}
+
+
+.icon-list-ol {
+ .ie7icon('&#xf0cb;');
+}
+
+
+.icon-strikethrough {
+ .ie7icon('&#xf0cc;');
+}
+
+
+.icon-underline {
+ .ie7icon('&#xf0cd;');
+}
+
+
+.icon-table {
+ .ie7icon('&#xf0ce;');
+}
+
+
+.icon-magic {
+ .ie7icon('&#xf0d0;');
+}
+
+
+.icon-truck {
+ .ie7icon('&#xf0d1;');
+}
+
+
+.icon-pinterest {
+ .ie7icon('&#xf0d2;');
+}
+
+
+.icon-pinterest-sign {
+ .ie7icon('&#xf0d3;');
+}
+
+
+.icon-google-plus-sign {
+ .ie7icon('&#xf0d4;');
+}
+
+
+.icon-google-plus {
+ .ie7icon('&#xf0d5;');
+}
+
+
+.icon-money {
+ .ie7icon('&#xf0d6;');
+}
+
+
+.icon-caret-down {
+ .ie7icon('&#xf0d7;');
+}
+
+
+.icon-caret-up {
+ .ie7icon('&#xf0d8;');
+}
+
+
+.icon-caret-left {
+ .ie7icon('&#xf0d9;');
+}
+
+
+.icon-caret-right {
+ .ie7icon('&#xf0da;');
+}
+
+
+.icon-columns {
+ .ie7icon('&#xf0db;');
+}
+
+
+.icon-sort {
+ .ie7icon('&#xf0dc;');
+}
+
+
+.icon-sort-down {
+ .ie7icon('&#xf0dd;');
+}
+
+
+.icon-sort-up {
+ .ie7icon('&#xf0de;');
+}
+
+
+.icon-envelope {
+ .ie7icon('&#xf0e0;');
+}
+
+
+.icon-linkedin {
+ .ie7icon('&#xf0e1;');
+}
+
+
+.icon-undo {
+ .ie7icon('&#xf0e2;');
+}
+
+.icon-rotate-left {
+ .ie7icon('&#xf0e2;');
+}
+
+
+.icon-legal {
+ .ie7icon('&#xf0e3;');
+}
+
+
+.icon-dashboard {
+ .ie7icon('&#xf0e4;');
+}
+
+
+.icon-comment-alt {
+ .ie7icon('&#xf0e5;');
+}
+
+
+.icon-comments-alt {
+ .ie7icon('&#xf0e6;');
+}
+
+
+.icon-bolt {
+ .ie7icon('&#xf0e7;');
+}
+
+
+.icon-sitemap {
+ .ie7icon('&#xf0e8;');
+}
+
+
+.icon-umbrella {
+ .ie7icon('&#xf0e9;');
+}
+
+
+.icon-paste {
+ .ie7icon('&#xf0ea;');
+}
+
+
+.icon-lightbulb {
+ .ie7icon('&#xf0eb;');
+}
+
+
+.icon-exchange {
+ .ie7icon('&#xf0ec;');
+}
+
+
+.icon-cloud-download {
+ .ie7icon('&#xf0ed;');
+}
+
+
+.icon-cloud-upload {
+ .ie7icon('&#xf0ee;');
+}
+
+
+.icon-user-md {
+ .ie7icon('&#xf0f0;');
+}
+
+
+.icon-stethoscope {
+ .ie7icon('&#xf0f1;');
+}
+
+
+.icon-suitcase {
+ .ie7icon('&#xf0f2;');
+}
+
+
+.icon-bell-alt {
+ .ie7icon('&#xf0f3;');
+}
+
+
+.icon-coffee {
+ .ie7icon('&#xf0f4;');
+}
+
+
+.icon-food {
+ .ie7icon('&#xf0f5;');
+}
+
+
+.icon-file-text-alt {
+ .ie7icon('&#xf0f6;');
+}
+
+
+.icon-building {
+ .ie7icon('&#xf0f7;');
+}
+
+
+.icon-hospital {
+ .ie7icon('&#xf0f8;');
+}
+
+
+.icon-ambulance {
+ .ie7icon('&#xf0f9;');
+}
+
+
+.icon-medkit {
+ .ie7icon('&#xf0fa;');
+}
+
+
+.icon-fighter-jet {
+ .ie7icon('&#xf0fb;');
+}
+
+
+.icon-beer {
+ .ie7icon('&#xf0fc;');
+}
+
+
+.icon-h-sign {
+ .ie7icon('&#xf0fd;');
+}
+
+
+.icon-plus-sign-alt {
+ .ie7icon('&#xf0fe;');
+}
+
+
+.icon-double-angle-left {
+ .ie7icon('&#xf100;');
+}
+
+
+.icon-double-angle-right {
+ .ie7icon('&#xf101;');
+}
+
+
+.icon-double-angle-up {
+ .ie7icon('&#xf102;');
+}
+
+
+.icon-double-angle-down {
+ .ie7icon('&#xf103;');
+}
+
+
+.icon-angle-left {
+ .ie7icon('&#xf104;');
+}
+
+
+.icon-angle-right {
+ .ie7icon('&#xf105;');
+}
+
+
+.icon-angle-up {
+ .ie7icon('&#xf106;');
+}
+
+
+.icon-angle-down {
+ .ie7icon('&#xf107;');
+}
+
+
+.icon-desktop {
+ .ie7icon('&#xf108;');
+}
+
+
+.icon-laptop {
+ .ie7icon('&#xf109;');
+}
+
+
+.icon-tablet {
+ .ie7icon('&#xf10a;');
+}
+
+
+.icon-mobile-phone {
+ .ie7icon('&#xf10b;');
+}
+
+
+.icon-circle-blank {
+ .ie7icon('&#xf10c;');
+}
+
+
+.icon-quote-left {
+ .ie7icon('&#xf10d;');
+}
+
+
+.icon-quote-right {
+ .ie7icon('&#xf10e;');
+}
+
+
+.icon-spinner {
+ .ie7icon('&#xf110;');
+}
+
+
+.icon-circle {
+ .ie7icon('&#xf111;');
+}
+
+
+.icon-reply {
+ .ie7icon('&#xf112;');
+}
+
+.icon-mail-reply {
+ .ie7icon('&#xf112;');
+}
+
+
+.icon-github-alt {
+ .ie7icon('&#xf113;');
+}
+
+
+.icon-folder-close-alt {
+ .ie7icon('&#xf114;');
+}
+
+
+.icon-folder-open-alt {
+ .ie7icon('&#xf115;');
+}
+
+
+.icon-expand-alt {
+ .ie7icon('&#xf116;');
+}
+
+
+.icon-collapse-alt {
+ .ie7icon('&#xf117;');
+}
+
+
+.icon-smile {
+ .ie7icon('&#xf118;');
+}
+
+
+.icon-frown {
+ .ie7icon('&#xf119;');
+}
+
+
+.icon-meh {
+ .ie7icon('&#xf11a;');
+}
+
+
+.icon-gamepad {
+ .ie7icon('&#xf11b;');
+}
+
+
+.icon-keyboard {
+ .ie7icon('&#xf11c;');
+}
+
+
+.icon-flag-alt {
+ .ie7icon('&#xf11d;');
+}
+
+
+.icon-flag-checkered {
+ .ie7icon('&#xf11e;');
+}
+
+
+.icon-terminal {
+ .ie7icon('&#xf120;');
+}
+
+
+.icon-code {
+ .ie7icon('&#xf121;');
+}
+
+
+.icon-reply-all {
+ .ie7icon('&#xf122;');
+}
+
+
+.icon-mail-reply-all {
+ .ie7icon('&#xf122;');
+}
+
+
+.icon-star-half-empty {
+ .ie7icon('&#xf123;');
+}
+
+.icon-star-half-full {
+ .ie7icon('&#xf123;');
+}
+
+
+.icon-location-arrow {
+ .ie7icon('&#xf124;');
+}
+
+
+.icon-crop {
+ .ie7icon('&#xf125;');
+}
+
+
+.icon-code-fork {
+ .ie7icon('&#xf126;');
+}
+
+
+.icon-unlink {
+ .ie7icon('&#xf127;');
+}
+
+
+.icon-question {
+ .ie7icon('&#xf128;');
+}
+
+
+.icon-info {
+ .ie7icon('&#xf129;');
+}
+
+
+.icon-exclamation {
+ .ie7icon('&#xf12a;');
+}
+
+
+.icon-superscript {
+ .ie7icon('&#xf12b;');
+}
+
+
+.icon-subscript {
+ .ie7icon('&#xf12c;');
+}
+
+
+.icon-eraser {
+ .ie7icon('&#xf12d;');
+}
+
+
+.icon-puzzle-piece {
+ .ie7icon('&#xf12e;');
+}
+
+
+.icon-microphone {
+ .ie7icon('&#xf130;');
+}
+
+
+.icon-microphone-off {
+ .ie7icon('&#xf131;');
+}
+
+
+.icon-shield {
+ .ie7icon('&#xf132;');
+}
+
+
+.icon-calendar-empty {
+ .ie7icon('&#xf133;');
+}
+
+
+.icon-fire-extinguisher {
+ .ie7icon('&#xf134;');
+}
+
+
+.icon-rocket {
+ .ie7icon('&#xf135;');
+}
+
+
+.icon-maxcdn {
+ .ie7icon('&#xf136;');
+}
+
+
+.icon-chevron-sign-left {
+ .ie7icon('&#xf137;');
+}
+
+
+.icon-chevron-sign-right {
+ .ie7icon('&#xf138;');
+}
+
+
+.icon-chevron-sign-up {
+ .ie7icon('&#xf139;');
+}
+
+
+.icon-chevron-sign-down {
+ .ie7icon('&#xf13a;');
+}
+
+
+.icon-html5 {
+ .ie7icon('&#xf13b;');
+}
+
+
+.icon-css3 {
+ .ie7icon('&#xf13c;');
+}
+
+
+.icon-anchor {
+ .ie7icon('&#xf13d;');
+}
+
+
+.icon-unlock-alt {
+ .ie7icon('&#xf13e;');
+}
+
+
+.icon-bullseye {
+ .ie7icon('&#xf140;');
+}
+
+
+.icon-ellipsis-horizontal {
+ .ie7icon('&#xf141;');
+}
+
+
+.icon-ellipsis-vertical {
+ .ie7icon('&#xf142;');
+}
+
+
+.icon-rss-sign {
+ .ie7icon('&#xf143;');
+}
+
+
+.icon-play-sign {
+ .ie7icon('&#xf144;');
+}
+
+
+.icon-ticket {
+ .ie7icon('&#xf145;');
+}
+
+
+.icon-minus-sign-alt {
+ .ie7icon('&#xf146;');
+}
+
+
+.icon-check-minus {
+ .ie7icon('&#xf147;');
+}
+
+
+.icon-level-up {
+ .ie7icon('&#xf148;');
+}
+
+
+.icon-level-down {
+ .ie7icon('&#xf149;');
+}
+
+
+.icon-check-sign {
+ .ie7icon('&#xf14a;');
+}
+
+
+.icon-edit-sign {
+ .ie7icon('&#xf14b;');
+}
+
+
+.icon-external-link-sign {
+ .ie7icon('&#xf14c;');
+}
+
+
+.icon-share-sign {
+ .ie7icon('&#xf14d;');
+}
+
+
+.icon-compass {
+ .ie7icon('&#xf14e;');
+}
+
+
+.icon-collapse {
+ .ie7icon('&#xf150;');
+}
+
+
+.icon-collapse-top {
+ .ie7icon('&#xf151;');
+}
+
+
+.icon-expand {
+ .ie7icon('&#xf152;');
+}
+
+
+.icon-eur {
+ .ie7icon('&#xf153;');
+}
+
+.icon-euro {
+ .ie7icon('&#xf153;');
+}
+
+
+.icon-gbp {
+ .ie7icon('&#xf154;');
+}
+
+
+.icon-usd {
+ .ie7icon('&#xf155;');
+}
+
+.icon-dollar {
+ .ie7icon('&#xf155;');
+}
+
+
+.icon-inr {
+ .ie7icon('&#xf156;');
+}
+
+.icon-rupee {
+ .ie7icon('&#xf156;');
+}
+
+
+.icon-jpy {
+ .ie7icon('&#xf157;');
+}
+
+.icon-yen {
+ .ie7icon('&#xf157;');
+}
+
+
+.icon-cny {
+ .ie7icon('&#xf158;');
+}
+
+.icon-renminbi {
+ .ie7icon('&#xf158;');
+}
+
+
+.icon-krw {
+ .ie7icon('&#xf159;');
+}
+
+.icon-won {
+ .ie7icon('&#xf159;');
+}
+
+
+.icon-btc {
+ .ie7icon('&#xf15a;');
+}
+
+.icon-bitcoin {
+ .ie7icon('&#xf15a;');
+}
+
+
+.icon-file {
+ .ie7icon('&#xf15b;');
+}
+
+
+.icon-file-text {
+ .ie7icon('&#xf15c;');
+}
+
+
+.icon-sort-by-alphabet {
+ .ie7icon('&#xf15d;');
+}
+
+
+.icon-sort-by-alphabet-alt {
+ .ie7icon('&#xf15e;');
+}
+
+
+.icon-sort-by-attributes {
+ .ie7icon('&#xf160;');
+}
+
+
+.icon-sort-by-attributes-alt {
+ .ie7icon('&#xf161;');
+}
+
+
+.icon-sort-by-order {
+ .ie7icon('&#xf162;');
+}
+
+
+.icon-sort-by-order-alt {
+ .ie7icon('&#xf163;');
+}
+
+
+.icon-thumbs-up {
+ .ie7icon('&#xf164;');
+}
+
+
+.icon-thumbs-down {
+ .ie7icon('&#xf165;');
+}
+
+
+.icon-youtube-sign {
+ .ie7icon('&#xf166;');
+}
+
+
+.icon-youtube {
+ .ie7icon('&#xf167;');
+}
+
+
+.icon-xing {
+ .ie7icon('&#xf168;');
+}
+
+
+.icon-xing-sign {
+ .ie7icon('&#xf169;');
+}
+
+
+.icon-youtube-play {
+ .ie7icon('&#xf16a;');
+}
+
+
+.icon-dropbox {
+ .ie7icon('&#xf16b;');
+}
+
+
+.icon-stackexchange {
+ .ie7icon('&#xf16c;');
+}
+
+
+.icon-instagram {
+ .ie7icon('&#xf16d;');
+}
+
+
+.icon-flickr {
+ .ie7icon('&#xf16e;');
+}
+
+
+.icon-adn {
+ .ie7icon('&#xf170;');
+}
+
+
+.icon-bitbucket {
+ .ie7icon('&#xf171;');
+}
+
+
+.icon-bitbucket-sign {
+ .ie7icon('&#xf172;');
+}
+
+
+.icon-tumblr {
+ .ie7icon('&#xf173;');
+}
+
+
+.icon-tumblr-sign {
+ .ie7icon('&#xf174;');
+}
+
+
+.icon-long-arrow-down {
+ .ie7icon('&#xf175;');
+}
+
+
+.icon-long-arrow-up {
+ .ie7icon('&#xf176;');
+}
+
+
+.icon-long-arrow-left {
+ .ie7icon('&#xf177;');
+}
+
+
+.icon-long-arrow-right {
+ .ie7icon('&#xf178;');
+}
+
+
+.icon-apple {
+ .ie7icon('&#xf179;');
+}
+
+
+.icon-windows {
+ .ie7icon('&#xf17a;');
+}
+
+
+.icon-android {
+ .ie7icon('&#xf17b;');
+}
+
+
+.icon-linux {
+ .ie7icon('&#xf17c;');
+}
+
+
+.icon-dribbble {
+ .ie7icon('&#xf17d;');
+}
+
+
+.icon-skype {
+ .ie7icon('&#xf17e;');
+}
+
+
+.icon-foursquare {
+ .ie7icon('&#xf180;');
+}
+
+
+.icon-trello {
+ .ie7icon('&#xf181;');
+}
+
+
+.icon-female {
+ .ie7icon('&#xf182;');
+}
+
+
+.icon-male {
+ .ie7icon('&#xf183;');
+}
+
+
+.icon-gittip {
+ .ie7icon('&#xf184;');
+}
+
+
+.icon-sun {
+ .ie7icon('&#xf185;');
+}
+
+
+.icon-moon {
+ .ie7icon('&#xf186;');
+}
+
+
+.icon-archive {
+ .ie7icon('&#xf187;');
+}
+
+
+.icon-bug {
+ .ie7icon('&#xf188;');
+}
+
+
+.icon-vk {
+ .ie7icon('&#xf189;');
+}
+
+
+.icon-weibo {
+ .ie7icon('&#xf18a;');
+}
+
+
+.icon-renren {
+ .ie7icon('&#xf18b;');
+}
+
+
diff --git a/library/font_awesome/less/font-awesome.less b/library/font_awesome/less/font-awesome.less
new file mode 100644
index 000000000..0f454612b
--- /dev/null
+++ b/library/font_awesome/less/font-awesome.less
@@ -0,0 +1,33 @@
+/*!
+ * Font Awesome 3.2.1
+ * the iconic font designed for Bootstrap
+ * ------------------------------------------------------------------------------
+ * The full suite of pictographic icons, examples, and documentation can be
+ * found at http://fontawesome.io. Stay up to date on Twitter at
+ * http://twitter.com/fontawesome.
+ *
+ * License
+ * ------------------------------------------------------------------------------
+ * - The Font Awesome font is licensed under SIL OFL 1.1 -
+ * http://scripts.sil.org/OFL
+ * - Font Awesome CSS, LESS, and SASS files are licensed under MIT License -
+ * http://opensource.org/licenses/mit-license.html
+ * - Font Awesome documentation licensed under CC BY 3.0 -
+ * http://creativecommons.org/licenses/by/3.0/
+ * - Attribution is no longer required in Font Awesome 3.0, but much appreciated:
+ * "Font Awesome by Dave Gandy - http://fontawesome.io"
+ *
+ * Author - Dave Gandy
+ * ------------------------------------------------------------------------------
+ * Email: dave@fontawesome.io
+ * Twitter: http://twitter.com/davegandy
+ * Work: Lead Product Designer @ Kyruus - http://kyruus.com
+ */
+
+@import "variables.less";
+@import "mixins.less";
+@import "path.less";
+@import "core.less";
+@import "bootstrap.less";
+@import "extras.less";
+@import "icons.less";
diff --git a/library/font_awesome/less/icons.less b/library/font_awesome/less/icons.less
new file mode 100644
index 000000000..476d201ec
--- /dev/null
+++ b/library/font_awesome/less/icons.less
@@ -0,0 +1,381 @@
+/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
+ readers do not read off random characters that represent icons */
+
+.icon-glass:before { content: @glass; }
+.icon-music:before { content: @music; }
+.icon-search:before { content: @search; }
+.icon-envelope-alt:before { content: @envelope-alt; }
+.icon-heart:before { content: @heart; }
+.icon-star:before { content: @star; }
+.icon-star-empty:before { content: @star-empty; }
+.icon-user:before { content: @user; }
+.icon-film:before { content: @film; }
+.icon-th-large:before { content: @th-large; }
+.icon-th:before { content: @th; }
+.icon-th-list:before { content: @th-list; }
+.icon-ok:before { content: @ok; }
+.icon-remove:before { content: @remove; }
+.icon-zoom-in:before { content: @zoom-in; }
+.icon-zoom-out:before { content: @zoom-out; }
+.icon-power-off:before,
+.icon-off:before { content: @off; }
+.icon-signal:before { content: @signal; }
+.icon-gear:before,
+.icon-cog:before { content: @cog; }
+.icon-trash:before { content: @trash; }
+.icon-home:before { content: @home; }
+.icon-file-alt:before { content: @file-alt; }
+.icon-time:before { content: @time; }
+.icon-road:before { content: @road; }
+.icon-download-alt:before { content: @download-alt; }
+.icon-download:before { content: @download; }
+.icon-upload:before { content: @upload; }
+.icon-inbox:before { content: @inbox; }
+.icon-play-circle:before { content: @play-circle; }
+.icon-rotate-right:before,
+.icon-repeat:before { content: @repeat; }
+.icon-refresh:before { content: @refresh; }
+.icon-list-alt:before { content: @list-alt; }
+.icon-lock:before { content: @lock; }
+.icon-flag:before { content: @flag; }
+.icon-headphones:before { content: @headphones; }
+.icon-volume-off:before { content: @volume-off; }
+.icon-volume-down:before { content: @volume-down; }
+.icon-volume-up:before { content: @volume-up; }
+.icon-qrcode:before { content: @qrcode; }
+.icon-barcode:before { content: @barcode; }
+.icon-tag:before { content: @tag; }
+.icon-tags:before { content: @tags; }
+.icon-book:before { content: @book; }
+.icon-bookmark:before { content: @bookmark; }
+.icon-print:before { content: @print; }
+.icon-camera:before { content: @camera; }
+.icon-font:before { content: @font; }
+.icon-bold:before { content: @bold; }
+.icon-italic:before { content: @italic; }
+.icon-text-height:before { content: @text-height; }
+.icon-text-width:before { content: @text-width; }
+.icon-align-left:before { content: @align-left; }
+.icon-align-center:before { content: @align-center; }
+.icon-align-right:before { content: @align-right; }
+.icon-align-justify:before { content: @align-justify; }
+.icon-list:before { content: @list; }
+.icon-indent-left:before { content: @indent-left; }
+.icon-indent-right:before { content: @indent-right; }
+.icon-facetime-video:before { content: @facetime-video; }
+.icon-picture:before { content: @picture; }
+.icon-pencil:before { content: @pencil; }
+.icon-map-marker:before { content: @map-marker; }
+.icon-adjust:before { content: @adjust; }
+.icon-tint:before { content: @tint; }
+.icon-edit:before { content: @edit; }
+.icon-share:before { content: @share; }
+.icon-check:before { content: @check; }
+.icon-move:before { content: @move; }
+.icon-step-backward:before { content: @step-backward; }
+.icon-fast-backward:before { content: @fast-backward; }
+.icon-backward:before { content: @backward; }
+.icon-play:before { content: @play; }
+.icon-pause:before { content: @pause; }
+.icon-stop:before { content: @stop; }
+.icon-forward:before { content: @forward; }
+.icon-fast-forward:before { content: @fast-forward; }
+.icon-step-forward:before { content: @step-forward; }
+.icon-eject:before { content: @eject; }
+.icon-chevron-left:before { content: @chevron-left; }
+.icon-chevron-right:before { content: @chevron-right; }
+.icon-plus-sign:before { content: @plus-sign; }
+.icon-minus-sign:before { content: @minus-sign; }
+.icon-remove-sign:before { content: @remove-sign; }
+.icon-ok-sign:before { content: @ok-sign; }
+.icon-question-sign:before { content: @question-sign; }
+.icon-info-sign:before { content: @info-sign; }
+.icon-screenshot:before { content: @screenshot; }
+.icon-remove-circle:before { content: @remove-circle; }
+.icon-ok-circle:before { content: @ok-circle; }
+.icon-ban-circle:before { content: @ban-circle; }
+.icon-arrow-left:before { content: @arrow-left; }
+.icon-arrow-right:before { content: @arrow-right; }
+.icon-arrow-up:before { content: @arrow-up; }
+.icon-arrow-down:before { content: @arrow-down; }
+.icon-mail-forward:before,
+.icon-share-alt:before { content: @share-alt; }
+.icon-resize-full:before { content: @resize-full; }
+.icon-resize-small:before { content: @resize-small; }
+.icon-plus:before { content: @plus; }
+.icon-minus:before { content: @minus; }
+.icon-asterisk:before { content: @asterisk; }
+.icon-exclamation-sign:before { content: @exclamation-sign; }
+.icon-gift:before { content: @gift; }
+.icon-leaf:before { content: @leaf; }
+.icon-fire:before { content: @fire; }
+.icon-eye-open:before { content: @eye-open; }
+.icon-eye-close:before { content: @eye-close; }
+.icon-warning-sign:before { content: @warning-sign; }
+.icon-plane:before { content: @plane; }
+.icon-calendar:before { content: @calendar; }
+.icon-random:before { content: @random; }
+.icon-comment:before { content: @comment; }
+.icon-magnet:before { content: @magnet; }
+.icon-chevron-up:before { content: @chevron-up; }
+.icon-chevron-down:before { content: @chevron-down; }
+.icon-retweet:before { content: @retweet; }
+.icon-shopping-cart:before { content: @shopping-cart; }
+.icon-folder-close:before { content: @folder-close; }
+.icon-folder-open:before { content: @folder-open; }
+.icon-resize-vertical:before { content: @resize-vertical; }
+.icon-resize-horizontal:before { content: @resize-horizontal; }
+.icon-bar-chart:before { content: @bar-chart; }
+.icon-twitter-sign:before { content: @twitter-sign; }
+.icon-facebook-sign:before { content: @facebook-sign; }
+.icon-camera-retro:before { content: @camera-retro; }
+.icon-key:before { content: @key; }
+.icon-gears:before,
+.icon-cogs:before { content: @cogs; }
+.icon-comments:before { content: @comments; }
+.icon-thumbs-up-alt:before { content: @thumbs-up-alt; }
+.icon-thumbs-down-alt:before { content: @thumbs-down-alt; }
+.icon-star-half:before { content: @star-half; }
+.icon-heart-empty:before { content: @heart-empty; }
+.icon-signout:before { content: @signout; }
+.icon-linkedin-sign:before { content: @linkedin-sign; }
+.icon-pushpin:before { content: @pushpin; }
+.icon-external-link:before { content: @external-link; }
+.icon-signin:before { content: @signin; }
+.icon-trophy:before { content: @trophy; }
+.icon-github-sign:before { content: @github-sign; }
+.icon-upload-alt:before { content: @upload-alt; }
+.icon-lemon:before { content: @lemon; }
+.icon-phone:before { content: @phone; }
+.icon-unchecked:before,
+.icon-check-empty:before { content: @check-empty; }
+.icon-bookmark-empty:before { content: @bookmark-empty; }
+.icon-phone-sign:before { content: @phone-sign; }
+.icon-twitter:before { content: @twitter; }
+.icon-facebook:before { content: @facebook; }
+.icon-github:before { content: @github; }
+.icon-unlock:before { content: @unlock; }
+.icon-credit-card:before { content: @credit-card; }
+.icon-rss:before { content: @rss; }
+.icon-hdd:before { content: @hdd; }
+.icon-bullhorn:before { content: @bullhorn; }
+.icon-bell:before { content: @bell; }
+.icon-certificate:before { content: @certificate; }
+.icon-hand-right:before { content: @hand-right; }
+.icon-hand-left:before { content: @hand-left; }
+.icon-hand-up:before { content: @hand-up; }
+.icon-hand-down:before { content: @hand-down; }
+.icon-circle-arrow-left:before { content: @circle-arrow-left; }
+.icon-circle-arrow-right:before { content: @circle-arrow-right; }
+.icon-circle-arrow-up:before { content: @circle-arrow-up; }
+.icon-circle-arrow-down:before { content: @circle-arrow-down; }
+.icon-globe:before { content: @globe; }
+.icon-wrench:before { content: @wrench; }
+.icon-tasks:before { content: @tasks; }
+.icon-filter:before { content: @filter; }
+.icon-briefcase:before { content: @briefcase; }
+.icon-fullscreen:before { content: @fullscreen; }
+.icon-group:before { content: @group; }
+.icon-link:before { content: @link; }
+.icon-cloud:before { content: @cloud; }
+.icon-beaker:before { content: @beaker; }
+.icon-cut:before { content: @cut; }
+.icon-copy:before { content: @copy; }
+.icon-paperclip:before,
+.icon-paper-clip:before { content: @paper-clip; }
+.icon-save:before { content: @save; }
+.icon-sign-blank:before { content: @sign-blank; }
+.icon-reorder:before { content: @reorder; }
+.icon-list-ul:before { content: @list-ul; }
+.icon-list-ol:before { content: @list-ol; }
+.icon-strikethrough:before { content: @strikethrough; }
+.icon-underline:before { content: @underline; }
+.icon-table:before { content: @table; }
+.icon-magic:before { content: @magic; }
+.icon-truck:before { content: @truck; }
+.icon-pinterest:before { content: @pinterest; }
+.icon-pinterest-sign:before { content: @pinterest-sign; }
+.icon-google-plus-sign:before { content: @google-plus-sign; }
+.icon-google-plus:before { content: @google-plus; }
+.icon-money:before { content: @money; }
+.icon-caret-down:before { content: @caret-down; }
+.icon-caret-up:before { content: @caret-up; }
+.icon-caret-left:before { content: @caret-left; }
+.icon-caret-right:before { content: @caret-right; }
+.icon-columns:before { content: @columns; }
+.icon-sort:before { content: @sort; }
+.icon-sort-down:before { content: @sort-down; }
+.icon-sort-up:before { content: @sort-up; }
+.icon-envelope:before { content: @envelope; }
+.icon-linkedin:before { content: @linkedin; }
+.icon-rotate-left:before,
+.icon-undo:before { content: @undo; }
+.icon-legal:before { content: @legal; }
+.icon-dashboard:before { content: @dashboard; }
+.icon-comment-alt:before { content: @comment-alt; }
+.icon-comments-alt:before { content: @comments-alt; }
+.icon-bolt:before { content: @bolt; }
+.icon-sitemap:before { content: @sitemap; }
+.icon-umbrella:before { content: @umbrella; }
+.icon-paste:before { content: @paste; }
+.icon-lightbulb:before { content: @lightbulb; }
+.icon-exchange:before { content: @exchange; }
+.icon-cloud-download:before { content: @cloud-download; }
+.icon-cloud-upload:before { content: @cloud-upload; }
+.icon-user-md:before { content: @user-md; }
+.icon-stethoscope:before { content: @stethoscope; }
+.icon-suitcase:before { content: @suitcase; }
+.icon-bell-alt:before { content: @bell-alt; }
+.icon-coffee:before { content: @coffee; }
+.icon-food:before { content: @food; }
+.icon-file-text-alt:before { content: @file-text-alt; }
+.icon-building:before { content: @building; }
+.icon-hospital:before { content: @hospital; }
+.icon-ambulance:before { content: @ambulance; }
+.icon-medkit:before { content: @medkit; }
+.icon-fighter-jet:before { content: @fighter-jet; }
+.icon-beer:before { content: @beer; }
+.icon-h-sign:before { content: @h-sign; }
+.icon-plus-sign-alt:before { content: @plus-sign-alt; }
+.icon-double-angle-left:before { content: @double-angle-left; }
+.icon-double-angle-right:before { content: @double-angle-right; }
+.icon-double-angle-up:before { content: @double-angle-up; }
+.icon-double-angle-down:before { content: @double-angle-down; }
+.icon-angle-left:before { content: @angle-left; }
+.icon-angle-right:before { content: @angle-right; }
+.icon-angle-up:before { content: @angle-up; }
+.icon-angle-down:before { content: @angle-down; }
+.icon-desktop:before { content: @desktop; }
+.icon-laptop:before { content: @laptop; }
+.icon-tablet:before { content: @tablet; }
+.icon-mobile-phone:before { content: @mobile-phone; }
+.icon-circle-blank:before { content: @circle-blank; }
+.icon-quote-left:before { content: @quote-left; }
+.icon-quote-right:before { content: @quote-right; }
+.icon-spinner:before { content: @spinner; }
+.icon-circle:before { content: @circle; }
+.icon-mail-reply:before,
+.icon-reply:before { content: @reply; }
+.icon-github-alt:before { content: @github-alt; }
+.icon-folder-close-alt:before { content: @folder-close-alt; }
+.icon-folder-open-alt:before { content: @folder-open-alt; }
+.icon-expand-alt:before { content: @expand-alt; }
+.icon-collapse-alt:before { content: @collapse-alt; }
+.icon-smile:before { content: @smile; }
+.icon-frown:before { content: @frown; }
+.icon-meh:before { content: @meh; }
+.icon-gamepad:before { content: @gamepad; }
+.icon-keyboard:before { content: @keyboard; }
+.icon-flag-alt:before { content: @flag-alt; }
+.icon-flag-checkered:before { content: @flag-checkered; }
+.icon-terminal:before { content: @terminal; }
+.icon-code:before { content: @code; }
+.icon-reply-all:before { content: @reply-all; }
+.icon-mail-reply-all:before { content: @mail-reply-all; }
+.icon-star-half-full:before,
+.icon-star-half-empty:before { content: @star-half-empty; }
+.icon-location-arrow:before { content: @location-arrow; }
+.icon-crop:before { content: @crop; }
+.icon-code-fork:before { content: @code-fork; }
+.icon-unlink:before { content: @unlink; }
+.icon-question:before { content: @question; }
+.icon-info:before { content: @info; }
+.icon-exclamation:before { content: @exclamation; }
+.icon-superscript:before { content: @superscript; }
+.icon-subscript:before { content: @subscript; }
+.icon-eraser:before { content: @eraser; }
+.icon-puzzle-piece:before { content: @puzzle-piece; }
+.icon-microphone:before { content: @microphone; }
+.icon-microphone-off:before { content: @microphone-off; }
+.icon-shield:before { content: @shield; }
+.icon-calendar-empty:before { content: @calendar-empty; }
+.icon-fire-extinguisher:before { content: @fire-extinguisher; }
+.icon-rocket:before { content: @rocket; }
+.icon-maxcdn:before { content: @maxcdn; }
+.icon-chevron-sign-left:before { content: @chevron-sign-left; }
+.icon-chevron-sign-right:before { content: @chevron-sign-right; }
+.icon-chevron-sign-up:before { content: @chevron-sign-up; }
+.icon-chevron-sign-down:before { content: @chevron-sign-down; }
+.icon-html5:before { content: @html5; }
+.icon-css3:before { content: @css3; }
+.icon-anchor:before { content: @anchor; }
+.icon-unlock-alt:before { content: @unlock-alt; }
+.icon-bullseye:before { content: @bullseye; }
+.icon-ellipsis-horizontal:before { content: @ellipsis-horizontal; }
+.icon-ellipsis-vertical:before { content: @ellipsis-vertical; }
+.icon-rss-sign:before { content: @rss-sign; }
+.icon-play-sign:before { content: @play-sign; }
+.icon-ticket:before { content: @ticket; }
+.icon-minus-sign-alt:before { content: @minus-sign-alt; }
+.icon-check-minus:before { content: @check-minus; }
+.icon-level-up:before { content: @level-up; }
+.icon-level-down:before { content: @level-down; }
+.icon-check-sign:before { content: @check-sign; }
+.icon-edit-sign:before { content: @edit-sign; }
+.icon-external-link-sign:before { content: @external-link-sign; }
+.icon-share-sign:before { content: @share-sign; }
+.icon-compass:before { content: @compass; }
+.icon-collapse:before { content: @collapse; }
+.icon-collapse-top:before { content: @collapse-top; }
+.icon-expand:before { content: @expand; }
+.icon-euro:before,
+.icon-eur:before { content: @eur; }
+.icon-gbp:before { content: @gbp; }
+.icon-dollar:before,
+.icon-usd:before { content: @usd; }
+.icon-rupee:before,
+.icon-inr:before { content: @inr; }
+.icon-yen:before,
+.icon-jpy:before { content: @jpy; }
+.icon-renminbi:before,
+.icon-cny:before { content: @cny; }
+.icon-won:before,
+.icon-krw:before { content: @krw; }
+.icon-bitcoin:before,
+.icon-btc:before { content: @btc; }
+.icon-file:before { content: @file; }
+.icon-file-text:before { content: @file-text; }
+.icon-sort-by-alphabet:before { content: @sort-by-alphabet; }
+.icon-sort-by-alphabet-alt:before { content: @sort-by-alphabet-alt; }
+.icon-sort-by-attributes:before { content: @sort-by-attributes; }
+.icon-sort-by-attributes-alt:before { content: @sort-by-attributes-alt; }
+.icon-sort-by-order:before { content: @sort-by-order; }
+.icon-sort-by-order-alt:before { content: @sort-by-order-alt; }
+.icon-thumbs-up:before { content: @thumbs-up; }
+.icon-thumbs-down:before { content: @thumbs-down; }
+.icon-youtube-sign:before { content: @youtube-sign; }
+.icon-youtube:before { content: @youtube; }
+.icon-xing:before { content: @xing; }
+.icon-xing-sign:before { content: @xing-sign; }
+.icon-youtube-play:before { content: @youtube-play; }
+.icon-dropbox:before { content: @dropbox; }
+.icon-stackexchange:before { content: @stackexchange; }
+.icon-instagram:before { content: @instagram; }
+.icon-flickr:before { content: @flickr; }
+.icon-adn:before { content: @adn; }
+.icon-bitbucket:before { content: @bitbucket; }
+.icon-bitbucket-sign:before { content: @bitbucket-sign; }
+.icon-tumblr:before { content: @tumblr; }
+.icon-tumblr-sign:before { content: @tumblr-sign; }
+.icon-long-arrow-down:before { content: @long-arrow-down; }
+.icon-long-arrow-up:before { content: @long-arrow-up; }
+.icon-long-arrow-left:before { content: @long-arrow-left; }
+.icon-long-arrow-right:before { content: @long-arrow-right; }
+.icon-apple:before { content: @apple; }
+.icon-windows:before { content: @windows; }
+.icon-android:before { content: @android; }
+.icon-linux:before { content: @linux; }
+.icon-dribbble:before { content: @dribbble; }
+.icon-skype:before { content: @skype; }
+.icon-foursquare:before { content: @foursquare; }
+.icon-trello:before { content: @trello; }
+.icon-female:before { content: @female; }
+.icon-male:before { content: @male; }
+.icon-gittip:before { content: @gittip; }
+.icon-sun:before { content: @sun; }
+.icon-moon:before { content: @moon; }
+.icon-archive:before { content: @archive; }
+.icon-bug:before { content: @bug; }
+.icon-vk:before { content: @vk; }
+.icon-weibo:before { content: @weibo; }
+.icon-renren:before { content: @renren; }
diff --git a/library/font_awesome/less/mixins.less b/library/font_awesome/less/mixins.less
new file mode 100644
index 000000000..f7fdda590
--- /dev/null
+++ b/library/font_awesome/less/mixins.less
@@ -0,0 +1,48 @@
+// Mixins
+// --------------------------
+
+.icon(@icon) {
+ .icon-FontAwesome();
+ content: @icon;
+}
+
+.icon-FontAwesome() {
+ font-family: FontAwesome;
+ font-weight: normal;
+ font-style: normal;
+ text-decoration: inherit;
+ -webkit-font-smoothing: antialiased;
+ *margin-right: .3em; // fixes ie7 issues
+}
+
+.border-radius(@radius) {
+ -webkit-border-radius: @radius;
+ -moz-border-radius: @radius;
+ border-radius: @radius;
+}
+
+.icon-stack(@width: 2em, @height: 2em, @top-font-size: 1em, @base-font-size: 2em) {
+ .icon-stack {
+ position: relative;
+ display: inline-block;
+ width: @width;
+ height: @height;
+ line-height: @width;
+ vertical-align: -35%;
+ [class^="icon-"],
+ [class*=" icon-"] {
+ display: block;
+ text-align: center;
+ position: absolute;
+ width: 100%;
+ height: 100%;
+ font-size: @top-font-size;
+ line-height: inherit;
+ *line-height: @height;
+ }
+ .icon-stack-base {
+ font-size: @base-font-size;
+ *line-height: @height / @base-font-size;
+ }
+ }
+}
diff --git a/library/font_awesome/less/path.less b/library/font_awesome/less/path.less
new file mode 100644
index 000000000..8ccef8cf0
--- /dev/null
+++ b/library/font_awesome/less/path.less
@@ -0,0 +1,14 @@
+/* FONT PATH
+ * -------------------------- */
+
+@font-face {
+ font-family: 'FontAwesome';
+ src: url('@{FontAwesomePath}/fontawesome-webfont.eot?v=@{FontAwesomeVersion}');
+ src: url('@{FontAwesomePath}/fontawesome-webfont.eot?#iefix&v=@{FontAwesomeVersion}') format('embedded-opentype'),
+ url('@{FontAwesomePath}/fontawesome-webfont.woff?v=@{FontAwesomeVersion}') format('woff'),
+ url('@{FontAwesomePath}/fontawesome-webfont.ttf?v=@{FontAwesomeVersion}') format('truetype'),
+ url('@{FontAwesomePath}/fontawesome-webfont.svg#fontawesomeregular?v=@{FontAwesomeVersion}') format('svg');
+// src: url('@{FontAwesomePath}/FontAwesome.otf') format('opentype'); // used when developing fonts
+ font-weight: normal;
+ font-style: normal;
+}
diff --git a/library/font_awesome/less/variables.less b/library/font_awesome/less/variables.less
new file mode 100644
index 000000000..9d0879b0d
--- /dev/null
+++ b/library/font_awesome/less/variables.less
@@ -0,0 +1,735 @@
+// Variables
+// --------------------------
+
+@FontAwesomePath: "../font";
+//@FontAwesomePath: "//netdna.bootstrapcdn.com/font-awesome/3.2.1/font"; // for referencing Bootstrap CDN font files directly
+@FontAwesomeVersion: "3.2.1";
+@borderColor: #eee;
+@iconMuted: #eee;
+@iconLight: #fff;
+@iconDark: #333;
+@icons-li-width: 30/14em;
+
+
+ @glass: "\f000";
+
+ @music: "\f001";
+
+ @search: "\f002";
+
+ @envelope-alt: "\f003";
+
+ @heart: "\f004";
+
+ @star: "\f005";
+
+ @star-empty: "\f006";
+
+ @user: "\f007";
+
+ @film: "\f008";
+
+ @th-large: "\f009";
+
+ @th: "\f00a";
+
+ @th-list: "\f00b";
+
+ @ok: "\f00c";
+
+ @remove: "\f00d";
+
+ @zoom-in: "\f00e";
+
+ @zoom-out: "\f010";
+
+ @off: "\f011";
+
+ @signal: "\f012";
+
+ @cog: "\f013";
+
+ @trash: "\f014";
+
+ @home: "\f015";
+
+ @file-alt: "\f016";
+
+ @time: "\f017";
+
+ @road: "\f018";
+
+ @download-alt: "\f019";
+
+ @download: "\f01a";
+
+ @upload: "\f01b";
+
+ @inbox: "\f01c";
+
+ @play-circle: "\f01d";
+
+ @repeat: "\f01e";
+
+ @refresh: "\f021";
+
+ @list-alt: "\f022";
+
+ @lock: "\f023";
+
+ @flag: "\f024";
+
+ @headphones: "\f025";
+
+ @volume-off: "\f026";
+
+ @volume-down: "\f027";
+
+ @volume-up: "\f028";
+
+ @qrcode: "\f029";
+
+ @barcode: "\f02a";
+
+ @tag: "\f02b";
+
+ @tags: "\f02c";
+
+ @book: "\f02d";
+
+ @bookmark: "\f02e";
+
+ @print: "\f02f";
+
+ @camera: "\f030";
+
+ @font: "\f031";
+
+ @bold: "\f032";
+
+ @italic: "\f033";
+
+ @text-height: "\f034";
+
+ @text-width: "\f035";
+
+ @align-left: "\f036";
+
+ @align-center: "\f037";
+
+ @align-right: "\f038";
+
+ @align-justify: "\f039";
+
+ @list: "\f03a";
+
+ @indent-left: "\f03b";
+
+ @indent-right: "\f03c";
+
+ @facetime-video: "\f03d";
+
+ @picture: "\f03e";
+
+ @pencil: "\f040";
+
+ @map-marker: "\f041";
+
+ @adjust: "\f042";
+
+ @tint: "\f043";
+
+ @edit: "\f044";
+
+ @share: "\f045";
+
+ @check: "\f046";
+
+ @move: "\f047";
+
+ @step-backward: "\f048";
+
+ @fast-backward: "\f049";
+
+ @backward: "\f04a";
+
+ @play: "\f04b";
+
+ @pause: "\f04c";
+
+ @stop: "\f04d";
+
+ @forward: "\f04e";
+
+ @fast-forward: "\f050";
+
+ @step-forward: "\f051";
+
+ @eject: "\f052";
+
+ @chevron-left: "\f053";
+
+ @chevron-right: "\f054";
+
+ @plus-sign: "\f055";
+
+ @minus-sign: "\f056";
+
+ @remove-sign: "\f057";
+
+ @ok-sign: "\f058";
+
+ @question-sign: "\f059";
+
+ @info-sign: "\f05a";
+
+ @screenshot: "\f05b";
+
+ @remove-circle: "\f05c";
+
+ @ok-circle: "\f05d";
+
+ @ban-circle: "\f05e";
+
+ @arrow-left: "\f060";
+
+ @arrow-right: "\f061";
+
+ @arrow-up: "\f062";
+
+ @arrow-down: "\f063";
+
+ @share-alt: "\f064";
+
+ @resize-full: "\f065";
+
+ @resize-small: "\f066";
+
+ @plus: "\f067";
+
+ @minus: "\f068";
+
+ @asterisk: "\f069";
+
+ @exclamation-sign: "\f06a";
+
+ @gift: "\f06b";
+
+ @leaf: "\f06c";
+
+ @fire: "\f06d";
+
+ @eye-open: "\f06e";
+
+ @eye-close: "\f070";
+
+ @warning-sign: "\f071";
+
+ @plane: "\f072";
+
+ @calendar: "\f073";
+
+ @random: "\f074";
+
+ @comment: "\f075";
+
+ @magnet: "\f076";
+
+ @chevron-up: "\f077";
+
+ @chevron-down: "\f078";
+
+ @retweet: "\f079";
+
+ @shopping-cart: "\f07a";
+
+ @folder-close: "\f07b";
+
+ @folder-open: "\f07c";
+
+ @resize-vertical: "\f07d";
+
+ @resize-horizontal: "\f07e";
+
+ @bar-chart: "\f080";
+
+ @twitter-sign: "\f081";
+
+ @facebook-sign: "\f082";
+
+ @camera-retro: "\f083";
+
+ @key: "\f084";
+
+ @cogs: "\f085";
+
+ @comments: "\f086";
+
+ @thumbs-up-alt: "\f087";
+
+ @thumbs-down-alt: "\f088";
+
+ @star-half: "\f089";
+
+ @heart-empty: "\f08a";
+
+ @signout: "\f08b";
+
+ @linkedin-sign: "\f08c";
+
+ @pushpin: "\f08d";
+
+ @external-link: "\f08e";
+
+ @signin: "\f090";
+
+ @trophy: "\f091";
+
+ @github-sign: "\f092";
+
+ @upload-alt: "\f093";
+
+ @lemon: "\f094";
+
+ @phone: "\f095";
+
+ @check-empty: "\f096";
+
+ @bookmark-empty: "\f097";
+
+ @phone-sign: "\f098";
+
+ @twitter: "\f099";
+
+ @facebook: "\f09a";
+
+ @github: "\f09b";
+
+ @unlock: "\f09c";
+
+ @credit-card: "\f09d";
+
+ @rss: "\f09e";
+
+ @hdd: "\f0a0";
+
+ @bullhorn: "\f0a1";
+
+ @bell: "\f0a2";
+
+ @certificate: "\f0a3";
+
+ @hand-right: "\f0a4";
+
+ @hand-left: "\f0a5";
+
+ @hand-up: "\f0a6";
+
+ @hand-down: "\f0a7";
+
+ @circle-arrow-left: "\f0a8";
+
+ @circle-arrow-right: "\f0a9";
+
+ @circle-arrow-up: "\f0aa";
+
+ @circle-arrow-down: "\f0ab";
+
+ @globe: "\f0ac";
+
+ @wrench: "\f0ad";
+
+ @tasks: "\f0ae";
+
+ @filter: "\f0b0";
+
+ @briefcase: "\f0b1";
+
+ @fullscreen: "\f0b2";
+
+ @group: "\f0c0";
+
+ @link: "\f0c1";
+
+ @cloud: "\f0c2";
+
+ @beaker: "\f0c3";
+
+ @cut: "\f0c4";
+
+ @copy: "\f0c5";
+
+ @paper-clip: "\f0c6";
+
+ @save: "\f0c7";
+
+ @sign-blank: "\f0c8";
+
+ @reorder: "\f0c9";
+
+ @list-ul: "\f0ca";
+
+ @list-ol: "\f0cb";
+
+ @strikethrough: "\f0cc";
+
+ @underline: "\f0cd";
+
+ @table: "\f0ce";
+
+ @magic: "\f0d0";
+
+ @truck: "\f0d1";
+
+ @pinterest: "\f0d2";
+
+ @pinterest-sign: "\f0d3";
+
+ @google-plus-sign: "\f0d4";
+
+ @google-plus: "\f0d5";
+
+ @money: "\f0d6";
+
+ @caret-down: "\f0d7";
+
+ @caret-up: "\f0d8";
+
+ @caret-left: "\f0d9";
+
+ @caret-right: "\f0da";
+
+ @columns: "\f0db";
+
+ @sort: "\f0dc";
+
+ @sort-down: "\f0dd";
+
+ @sort-up: "\f0de";
+
+ @envelope: "\f0e0";
+
+ @linkedin: "\f0e1";
+
+ @undo: "\f0e2";
+
+ @legal: "\f0e3";
+
+ @dashboard: "\f0e4";
+
+ @comment-alt: "\f0e5";
+
+ @comments-alt: "\f0e6";
+
+ @bolt: "\f0e7";
+
+ @sitemap: "\f0e8";
+
+ @umbrella: "\f0e9";
+
+ @paste: "\f0ea";
+
+ @lightbulb: "\f0eb";
+
+ @exchange: "\f0ec";
+
+ @cloud-download: "\f0ed";
+
+ @cloud-upload: "\f0ee";
+
+ @user-md: "\f0f0";
+
+ @stethoscope: "\f0f1";
+
+ @suitcase: "\f0f2";
+
+ @bell-alt: "\f0f3";
+
+ @coffee: "\f0f4";
+
+ @food: "\f0f5";
+
+ @file-text-alt: "\f0f6";
+
+ @building: "\f0f7";
+
+ @hospital: "\f0f8";
+
+ @ambulance: "\f0f9";
+
+ @medkit: "\f0fa";
+
+ @fighter-jet: "\f0fb";
+
+ @beer: "\f0fc";
+
+ @h-sign: "\f0fd";
+
+ @plus-sign-alt: "\f0fe";
+
+ @double-angle-left: "\f100";
+
+ @double-angle-right: "\f101";
+
+ @double-angle-up: "\f102";
+
+ @double-angle-down: "\f103";
+
+ @angle-left: "\f104";
+
+ @angle-right: "\f105";
+
+ @angle-up: "\f106";
+
+ @angle-down: "\f107";
+
+ @desktop: "\f108";
+
+ @laptop: "\f109";
+
+ @tablet: "\f10a";
+
+ @mobile-phone: "\f10b";
+
+ @circle-blank: "\f10c";
+
+ @quote-left: "\f10d";
+
+ @quote-right: "\f10e";
+
+ @spinner: "\f110";
+
+ @circle: "\f111";
+
+ @reply: "\f112";
+
+ @github-alt: "\f113";
+
+ @folder-close-alt: "\f114";
+
+ @folder-open-alt: "\f115";
+
+ @expand-alt: "\f116";
+
+ @collapse-alt: "\f117";
+
+ @smile: "\f118";
+
+ @frown: "\f119";
+
+ @meh: "\f11a";
+
+ @gamepad: "\f11b";
+
+ @keyboard: "\f11c";
+
+ @flag-alt: "\f11d";
+
+ @flag-checkered: "\f11e";
+
+ @terminal: "\f120";
+
+ @code: "\f121";
+
+ @reply-all: "\f122";
+
+ @mail-reply-all: "\f122";
+
+ @star-half-empty: "\f123";
+
+ @location-arrow: "\f124";
+
+ @crop: "\f125";
+
+ @code-fork: "\f126";
+
+ @unlink: "\f127";
+
+ @question: "\f128";
+
+ @info: "\f129";
+
+ @exclamation: "\f12a";
+
+ @superscript: "\f12b";
+
+ @subscript: "\f12c";
+
+ @eraser: "\f12d";
+
+ @puzzle-piece: "\f12e";
+
+ @microphone: "\f130";
+
+ @microphone-off: "\f131";
+
+ @shield: "\f132";
+
+ @calendar-empty: "\f133";
+
+ @fire-extinguisher: "\f134";
+
+ @rocket: "\f135";
+
+ @maxcdn: "\f136";
+
+ @chevron-sign-left: "\f137";
+
+ @chevron-sign-right: "\f138";
+
+ @chevron-sign-up: "\f139";
+
+ @chevron-sign-down: "\f13a";
+
+ @html5: "\f13b";
+
+ @css3: "\f13c";
+
+ @anchor: "\f13d";
+
+ @unlock-alt: "\f13e";
+
+ @bullseye: "\f140";
+
+ @ellipsis-horizontal: "\f141";
+
+ @ellipsis-vertical: "\f142";
+
+ @rss-sign: "\f143";
+
+ @play-sign: "\f144";
+
+ @ticket: "\f145";
+
+ @minus-sign-alt: "\f146";
+
+ @check-minus: "\f147";
+
+ @level-up: "\f148";
+
+ @level-down: "\f149";
+
+ @check-sign: "\f14a";
+
+ @edit-sign: "\f14b";
+
+ @external-link-sign: "\f14c";
+
+ @share-sign: "\f14d";
+
+ @compass: "\f14e";
+
+ @collapse: "\f150";
+
+ @collapse-top: "\f151";
+
+ @expand: "\f152";
+
+ @eur: "\f153";
+
+ @gbp: "\f154";
+
+ @usd: "\f155";
+
+ @inr: "\f156";
+
+ @jpy: "\f157";
+
+ @cny: "\f158";
+
+ @krw: "\f159";
+
+ @btc: "\f15a";
+
+ @file: "\f15b";
+
+ @file-text: "\f15c";
+
+ @sort-by-alphabet: "\f15d";
+
+ @sort-by-alphabet-alt: "\f15e";
+
+ @sort-by-attributes: "\f160";
+
+ @sort-by-attributes-alt: "\f161";
+
+ @sort-by-order: "\f162";
+
+ @sort-by-order-alt: "\f163";
+
+ @thumbs-up: "\f164";
+
+ @thumbs-down: "\f165";
+
+ @youtube-sign: "\f166";
+
+ @youtube: "\f167";
+
+ @xing: "\f168";
+
+ @xing-sign: "\f169";
+
+ @youtube-play: "\f16a";
+
+ @dropbox: "\f16b";
+
+ @stackexchange: "\f16c";
+
+ @instagram: "\f16d";
+
+ @flickr: "\f16e";
+
+ @adn: "\f170";
+
+ @bitbucket: "\f171";
+
+ @bitbucket-sign: "\f172";
+
+ @tumblr: "\f173";
+
+ @tumblr-sign: "\f174";
+
+ @long-arrow-down: "\f175";
+
+ @long-arrow-up: "\f176";
+
+ @long-arrow-left: "\f177";
+
+ @long-arrow-right: "\f178";
+
+ @apple: "\f179";
+
+ @windows: "\f17a";
+
+ @android: "\f17b";
+
+ @linux: "\f17c";
+
+ @dribbble: "\f17d";
+
+ @skype: "\f17e";
+
+ @foursquare: "\f180";
+
+ @trello: "\f181";
+
+ @female: "\f182";
+
+ @male: "\f183";
+
+ @gittip: "\f184";
+
+ @sun: "\f185";
+
+ @moon: "\f186";
+
+ @archive: "\f187";
+
+ @bug: "\f188";
+
+ @vk: "\f189";
+
+ @weibo: "\f18a";
+
+ @renren: "\f18b";
+
diff --git a/library/font_awesome/package.json b/library/font_awesome/package.json
new file mode 100644
index 000000000..c25c3322e
--- /dev/null
+++ b/library/font_awesome/package.json
@@ -0,0 +1,44 @@
+{
+ "name": "font-awesome",
+ "description": "The iconic font designed for Bootstrap",
+ "version": "3.2.1",
+ "keywords": ["font", "awesome", "fontawesome", "icon", "font", "bootstrap"],
+ "homepage": "http://fontawesome.io/",
+ "author": {
+ "name": "Dave Gandy",
+ "email": "dave@fontawesome.io",
+ "web": "http://twitter.com/davegandy"
+ },
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/FortAwesome/Font-Awesome.git"
+ },
+ "contributors": [
+ {
+ "name": "Rob Madole",
+ "web": "http://twitter.com/robmadole"
+ },
+ {
+ "name": "Geremia Taglialatela",
+ "web": "http://twitter.com/gtagliala"
+ },
+ {
+ "name": "Travis Chase",
+ "web": "http://twitter.com/supercodepoet"
+ }
+ ],
+ "licenses": [
+ {
+ "type": "SIL OFL 1.1",
+ "url": "http://scripts.sil.org/OFL"
+ },
+ {
+ "type": "MIT License",
+ "url": "http://opensource.org/licenses/mit-license.html"
+ }
+ ],
+ "dependencies": {
+ "jekyll": "1.0.2",
+ "lessc": "1.3.3"
+ }
+}
diff --git a/library/font_awesome/scss/_bootstrap.scss b/library/font_awesome/scss/_bootstrap.scss
new file mode 100644
index 000000000..837d2df65
--- /dev/null
+++ b/library/font_awesome/scss/_bootstrap.scss
@@ -0,0 +1,84 @@
+/* BOOTSTRAP SPECIFIC CLASSES
+ * -------------------------- */
+
+/* Bootstrap 2.0 sprites.less reset */
+[class^="icon-"],
+[class*=" icon-"] {
+ display: inline;
+ width: auto;
+ height: auto;
+ line-height: normal;
+ vertical-align: baseline;
+ background-image: none;
+ background-position: 0% 0%;
+ background-repeat: repeat;
+ margin-top: 0;
+}
+
+/* more sprites.less reset */
+.icon-white,
+.nav-pills > .active > a > [class^="icon-"],
+.nav-pills > .active > a > [class*=" icon-"],
+.nav-list > .active > a > [class^="icon-"],
+.nav-list > .active > a > [class*=" icon-"],
+.navbar-inverse .nav > .active > a > [class^="icon-"],
+.navbar-inverse .nav > .active > a > [class*=" icon-"],
+.dropdown-menu > li > a:hover > [class^="icon-"],
+.dropdown-menu > li > a:hover > [class*=" icon-"],
+.dropdown-menu > .active > a > [class^="icon-"],
+.dropdown-menu > .active > a > [class*=" icon-"],
+.dropdown-submenu:hover > a > [class^="icon-"],
+.dropdown-submenu:hover > a > [class*=" icon-"] {
+ background-image: none;
+}
+
+
+/* keeps Bootstrap styles with and without icons the same */
+.btn, .nav {
+ [class^="icon-"],
+ [class*=" icon-"] {
+ // display: inline;
+ &.icon-large { line-height: .9em; }
+ &.icon-spin { display: inline-block; }
+ }
+}
+.nav-tabs, .nav-pills {
+ [class^="icon-"],
+ [class*=" icon-"] {
+ &, &.icon-large { line-height: .9em; }
+ }
+}
+.btn {
+ [class^="icon-"],
+ [class*=" icon-"] {
+ &.pull-left, &.pull-right {
+ &.icon-2x { margin-top: .18em; }
+ }
+ &.icon-spin.icon-large { line-height: .8em; }
+ }
+}
+.btn.btn-small {
+ [class^="icon-"],
+ [class*=" icon-"] {
+ &.pull-left, &.pull-right {
+ &.icon-2x { margin-top: .25em; }
+ }
+ }
+}
+.btn.btn-large {
+ [class^="icon-"],
+ [class*=" icon-"] {
+ margin-top: 0; // overrides bootstrap default
+ &.pull-left, &.pull-right {
+ &.icon-2x { margin-top: .05em; }
+ }
+ &.pull-left.icon-2x { margin-right: .2em; }
+ &.pull-right.icon-2x { margin-left: .2em; }
+ }
+}
+
+/* Fixes alignment in nav lists */
+.nav-list [class^="icon-"],
+.nav-list [class*=" icon-"] {
+ line-height: inherit;
+}
diff --git a/library/font_awesome/scss/_core.scss b/library/font_awesome/scss/_core.scss
new file mode 100644
index 000000000..0189c73df
--- /dev/null
+++ b/library/font_awesome/scss/_core.scss
@@ -0,0 +1,129 @@
+/* FONT AWESOME CORE
+ * -------------------------- */
+
+[class^="icon-"],
+[class*=" icon-"] {
+ @include icon-FontAwesome();
+}
+
+[class^="icon-"]:before,
+[class*=" icon-"]:before {
+ text-decoration: inherit;
+ display: inline-block;
+ speak: none;
+}
+
+/* makes the font 33% larger relative to the icon container */
+.icon-large:before {
+ vertical-align: -10%;
+ font-size: (4em/3);
+}
+
+/* makes sure icons active on rollover in links */
+a {
+ [class^="icon-"],
+ [class*=" icon-"] {
+ display: inline;
+ }
+}
+
+/* increased font size for icon-large */
+[class^="icon-"],
+[class*=" icon-"] {
+ &.icon-fixed-width {
+ display: inline-block;
+ width: (16em/14);
+ text-align: right;
+ padding-right: (4em/14);
+ &.icon-large {
+ width: (20em/14);
+ }
+ }
+}
+
+.icons-ul {
+ margin-left: $icons-li-width;
+ list-style-type: none;
+
+ > li { position: relative; }
+
+ .icon-li {
+ position: absolute;
+ left: -$icons-li-width;
+ width: $icons-li-width;
+ text-align: center;
+ line-height: inherit;
+ }
+}
+
+// allows usage of the hide class directly on font awesome icons
+[class^="icon-"],
+[class*=" icon-"] {
+ &.hide {
+ display: none;
+ }
+}
+
+.icon-muted { color: $iconMuted; }
+.icon-light { color: $iconLight; }
+.icon-dark { color: $iconDark; }
+
+// Icon Borders
+// -------------------------
+
+.icon-border {
+ border: solid 1px $borderColor;
+ padding: .2em .25em .15em;
+ @include border-radius(3px);
+}
+
+// Icon Sizes
+// -------------------------
+
+.icon-2x {
+ font-size: 2em;
+ &.icon-border {
+ border-width: 2px;
+ @include border-radius(4px);
+ }
+}
+.icon-3x {
+ font-size: 3em;
+ &.icon-border {
+ border-width: 3px;
+ @include border-radius(5px);
+ }
+}
+.icon-4x {
+ font-size: 4em;
+ &.icon-border {
+ border-width: 4px;
+ @include border-radius(6px);
+ }
+}
+
+.icon-5x {
+ font-size: 5em;
+ &.icon-border {
+ border-width: 5px;
+ @include border-radius(7px);
+ }
+}
+
+
+// Floats & Margins
+// -------------------------
+
+// Quick floats
+.pull-right { float: right; }
+.pull-left { float: left; }
+
+[class^="icon-"],
+[class*=" icon-"] {
+ &.pull-left {
+ margin-right: .3em;
+ }
+ &.pull-right {
+ margin-left: .3em;
+ }
+}
diff --git a/library/font_awesome/scss/_extras.scss b/library/font_awesome/scss/_extras.scss
new file mode 100644
index 000000000..9a25845d8
--- /dev/null
+++ b/library/font_awesome/scss/_extras.scss
@@ -0,0 +1,93 @@
+/* EXTRAS
+ * -------------------------- */
+
+/* Stacked and layered icon */
+@include icon-stack();
+
+/* Animated rotating icon */
+.icon-spin {
+ display: inline-block;
+ -moz-animation: spin 2s infinite linear;
+ -o-animation: spin 2s infinite linear;
+ -webkit-animation: spin 2s infinite linear;
+ animation: spin 2s infinite linear;
+}
+
+/* Prevent stack and spinners from being taken inline when inside a link */
+a .icon-stack,
+a .icon-spin {
+ display: inline-block;
+ text-decoration: none;
+}
+
+@-moz-keyframes spin {
+ 0% { -moz-transform: rotate(0deg); }
+ 100% { -moz-transform: rotate(359deg); }
+}
+@-webkit-keyframes spin {
+ 0% { -webkit-transform: rotate(0deg); }
+ 100% { -webkit-transform: rotate(359deg); }
+}
+@-o-keyframes spin {
+ 0% { -o-transform: rotate(0deg); }
+ 100% { -o-transform: rotate(359deg); }
+}
+@-ms-keyframes spin {
+ 0% { -ms-transform: rotate(0deg); }
+ 100% { -ms-transform: rotate(359deg); }
+}
+@keyframes spin {
+ 0% { transform: rotate(0deg); }
+ 100% { transform: rotate(359deg); }
+}
+
+/* Icon rotations and mirroring */
+.icon-rotate-90:before {
+ -webkit-transform: rotate(90deg);
+ -moz-transform: rotate(90deg);
+ -ms-transform: rotate(90deg);
+ -o-transform: rotate(90deg);
+ transform: rotate(90deg);
+ filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1);
+}
+
+.icon-rotate-180:before {
+ -webkit-transform: rotate(180deg);
+ -moz-transform: rotate(180deg);
+ -ms-transform: rotate(180deg);
+ -o-transform: rotate(180deg);
+ transform: rotate(180deg);
+ filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2);
+}
+
+.icon-rotate-270:before {
+ -webkit-transform: rotate(270deg);
+ -moz-transform: rotate(270deg);
+ -ms-transform: rotate(270deg);
+ -o-transform: rotate(270deg);
+ transform: rotate(270deg);
+ filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3);
+}
+
+.icon-flip-horizontal:before {
+ -webkit-transform: scale(-1, 1);
+ -moz-transform: scale(-1, 1);
+ -ms-transform: scale(-1, 1);
+ -o-transform: scale(-1, 1);
+ transform: scale(-1, 1);
+}
+
+.icon-flip-vertical:before {
+ -webkit-transform: scale(1, -1);
+ -moz-transform: scale(1, -1);
+ -ms-transform: scale(1, -1);
+ -o-transform: scale(1, -1);
+ transform: scale(1, -1);
+}
+
+/* ensure rotation occurs inside anchor tags */
+a {
+ .icon-rotate-90, .icon-rotate-180, .icon-rotate-270, .icon-flip-horizontal, .icon-flip-vertical {
+ &:before { display: inline-block; }
+ }
+}
diff --git a/library/font_awesome/scss/_icons.scss b/library/font_awesome/scss/_icons.scss
new file mode 100644
index 000000000..eefda0c9e
--- /dev/null
+++ b/library/font_awesome/scss/_icons.scss
@@ -0,0 +1,381 @@
+/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
+ * readers do not read off random characters that represent icons */
+
+.icon-glass:before { content: $glass; }
+.icon-music:before { content: $music; }
+.icon-search:before { content: $search; }
+.icon-envelope-alt:before { content: $envelope-alt; }
+.icon-heart:before { content: $heart; }
+.icon-star:before { content: $star; }
+.icon-star-empty:before { content: $star-empty; }
+.icon-user:before { content: $user; }
+.icon-film:before { content: $film; }
+.icon-th-large:before { content: $th-large; }
+.icon-th:before { content: $th; }
+.icon-th-list:before { content: $th-list; }
+.icon-ok:before { content: $ok; }
+.icon-remove:before { content: $remove; }
+.icon-zoom-in:before { content: $zoom-in; }
+.icon-zoom-out:before { content: $zoom-out; }
+.icon-power-off:before,
+.icon-off:before { content: $off; }
+.icon-signal:before { content: $signal; }
+.icon-gear:before,
+.icon-cog:before { content: $cog; }
+.icon-trash:before { content: $trash; }
+.icon-home:before { content: $home; }
+.icon-file-alt:before { content: $file-alt; }
+.icon-time:before { content: $time; }
+.icon-road:before { content: $road; }
+.icon-download-alt:before { content: $download-alt; }
+.icon-download:before { content: $download; }
+.icon-upload:before { content: $upload; }
+.icon-inbox:before { content: $inbox; }
+.icon-play-circle:before { content: $play-circle; }
+.icon-rotate-right:before,
+.icon-repeat:before { content: $repeat; }
+.icon-refresh:before { content: $refresh; }
+.icon-list-alt:before { content: $list-alt; }
+.icon-lock:before { content: $lock; }
+.icon-flag:before { content: $flag; }
+.icon-headphones:before { content: $headphones; }
+.icon-volume-off:before { content: $volume-off; }
+.icon-volume-down:before { content: $volume-down; }
+.icon-volume-up:before { content: $volume-up; }
+.icon-qrcode:before { content: $qrcode; }
+.icon-barcode:before { content: $barcode; }
+.icon-tag:before { content: $tag; }
+.icon-tags:before { content: $tags; }
+.icon-book:before { content: $book; }
+.icon-bookmark:before { content: $bookmark; }
+.icon-print:before { content: $print; }
+.icon-camera:before { content: $camera; }
+.icon-font:before { content: $font; }
+.icon-bold:before { content: $bold; }
+.icon-italic:before { content: $italic; }
+.icon-text-height:before { content: $text-height; }
+.icon-text-width:before { content: $text-width; }
+.icon-align-left:before { content: $align-left; }
+.icon-align-center:before { content: $align-center; }
+.icon-align-right:before { content: $align-right; }
+.icon-align-justify:before { content: $align-justify; }
+.icon-list:before { content: $list; }
+.icon-indent-left:before { content: $indent-left; }
+.icon-indent-right:before { content: $indent-right; }
+.icon-facetime-video:before { content: $facetime-video; }
+.icon-picture:before { content: $picture; }
+.icon-pencil:before { content: $pencil; }
+.icon-map-marker:before { content: $map-marker; }
+.icon-adjust:before { content: $adjust; }
+.icon-tint:before { content: $tint; }
+.icon-edit:before { content: $edit; }
+.icon-share:before { content: $share; }
+.icon-check:before { content: $check; }
+.icon-move:before { content: $move; }
+.icon-step-backward:before { content: $step-backward; }
+.icon-fast-backward:before { content: $fast-backward; }
+.icon-backward:before { content: $backward; }
+.icon-play:before { content: $play; }
+.icon-pause:before { content: $pause; }
+.icon-stop:before { content: $stop; }
+.icon-forward:before { content: $forward; }
+.icon-fast-forward:before { content: $fast-forward; }
+.icon-step-forward:before { content: $step-forward; }
+.icon-eject:before { content: $eject; }
+.icon-chevron-left:before { content: $chevron-left; }
+.icon-chevron-right:before { content: $chevron-right; }
+.icon-plus-sign:before { content: $plus-sign; }
+.icon-minus-sign:before { content: $minus-sign; }
+.icon-remove-sign:before { content: $remove-sign; }
+.icon-ok-sign:before { content: $ok-sign; }
+.icon-question-sign:before { content: $question-sign; }
+.icon-info-sign:before { content: $info-sign; }
+.icon-screenshot:before { content: $screenshot; }
+.icon-remove-circle:before { content: $remove-circle; }
+.icon-ok-circle:before { content: $ok-circle; }
+.icon-ban-circle:before { content: $ban-circle; }
+.icon-arrow-left:before { content: $arrow-left; }
+.icon-arrow-right:before { content: $arrow-right; }
+.icon-arrow-up:before { content: $arrow-up; }
+.icon-arrow-down:before { content: $arrow-down; }
+.icon-mail-forward:before,
+.icon-share-alt:before { content: $share-alt; }
+.icon-resize-full:before { content: $resize-full; }
+.icon-resize-small:before { content: $resize-small; }
+.icon-plus:before { content: $plus; }
+.icon-minus:before { content: $minus; }
+.icon-asterisk:before { content: $asterisk; }
+.icon-exclamation-sign:before { content: $exclamation-sign; }
+.icon-gift:before { content: $gift; }
+.icon-leaf:before { content: $leaf; }
+.icon-fire:before { content: $fire; }
+.icon-eye-open:before { content: $eye-open; }
+.icon-eye-close:before { content: $eye-close; }
+.icon-warning-sign:before { content: $warning-sign; }
+.icon-plane:before { content: $plane; }
+.icon-calendar:before { content: $calendar; }
+.icon-random:before { content: $random; }
+.icon-comment:before { content: $comment; }
+.icon-magnet:before { content: $magnet; }
+.icon-chevron-up:before { content: $chevron-up; }
+.icon-chevron-down:before { content: $chevron-down; }
+.icon-retweet:before { content: $retweet; }
+.icon-shopping-cart:before { content: $shopping-cart; }
+.icon-folder-close:before { content: $folder-close; }
+.icon-folder-open:before { content: $folder-open; }
+.icon-resize-vertical:before { content: $resize-vertical; }
+.icon-resize-horizontal:before { content: $resize-horizontal; }
+.icon-bar-chart:before { content: $bar-chart; }
+.icon-twitter-sign:before { content: $twitter-sign; }
+.icon-facebook-sign:before { content: $facebook-sign; }
+.icon-camera-retro:before { content: $camera-retro; }
+.icon-key:before { content: $key; }
+.icon-gears:before,
+.icon-cogs:before { content: $cogs; }
+.icon-comments:before { content: $comments; }
+.icon-thumbs-up-alt:before { content: $thumbs-up-alt; }
+.icon-thumbs-down-alt:before { content: $thumbs-down-alt; }
+.icon-star-half:before { content: $star-half; }
+.icon-heart-empty:before { content: $heart-empty; }
+.icon-signout:before { content: $signout; }
+.icon-linkedin-sign:before { content: $linkedin-sign; }
+.icon-pushpin:before { content: $pushpin; }
+.icon-external-link:before { content: $external-link; }
+.icon-signin:before { content: $signin; }
+.icon-trophy:before { content: $trophy; }
+.icon-github-sign:before { content: $github-sign; }
+.icon-upload-alt:before { content: $upload-alt; }
+.icon-lemon:before { content: $lemon; }
+.icon-phone:before { content: $phone; }
+.icon-unchecked:before,
+.icon-check-empty:before { content: $check-empty; }
+.icon-bookmark-empty:before { content: $bookmark-empty; }
+.icon-phone-sign:before { content: $phone-sign; }
+.icon-twitter:before { content: $twitter; }
+.icon-facebook:before { content: $facebook; }
+.icon-github:before { content: $github; }
+.icon-unlock:before { content: $unlock; }
+.icon-credit-card:before { content: $credit-card; }
+.icon-rss:before { content: $rss; }
+.icon-hdd:before { content: $hdd; }
+.icon-bullhorn:before { content: $bullhorn; }
+.icon-bell:before { content: $bell; }
+.icon-certificate:before { content: $certificate; }
+.icon-hand-right:before { content: $hand-right; }
+.icon-hand-left:before { content: $hand-left; }
+.icon-hand-up:before { content: $hand-up; }
+.icon-hand-down:before { content: $hand-down; }
+.icon-circle-arrow-left:before { content: $circle-arrow-left; }
+.icon-circle-arrow-right:before { content: $circle-arrow-right; }
+.icon-circle-arrow-up:before { content: $circle-arrow-up; }
+.icon-circle-arrow-down:before { content: $circle-arrow-down; }
+.icon-globe:before { content: $globe; }
+.icon-wrench:before { content: $wrench; }
+.icon-tasks:before { content: $tasks; }
+.icon-filter:before { content: $filter; }
+.icon-briefcase:before { content: $briefcase; }
+.icon-fullscreen:before { content: $fullscreen; }
+.icon-group:before { content: $group; }
+.icon-link:before { content: $link; }
+.icon-cloud:before { content: $cloud; }
+.icon-beaker:before { content: $beaker; }
+.icon-cut:before { content: $cut; }
+.icon-copy:before { content: $copy; }
+.icon-paperclip:before,
+.icon-paper-clip:before { content: $paper-clip; }
+.icon-save:before { content: $save; }
+.icon-sign-blank:before { content: $sign-blank; }
+.icon-reorder:before { content: $reorder; }
+.icon-list-ul:before { content: $list-ul; }
+.icon-list-ol:before { content: $list-ol; }
+.icon-strikethrough:before { content: $strikethrough; }
+.icon-underline:before { content: $underline; }
+.icon-table:before { content: $table; }
+.icon-magic:before { content: $magic; }
+.icon-truck:before { content: $truck; }
+.icon-pinterest:before { content: $pinterest; }
+.icon-pinterest-sign:before { content: $pinterest-sign; }
+.icon-google-plus-sign:before { content: $google-plus-sign; }
+.icon-google-plus:before { content: $google-plus; }
+.icon-money:before { content: $money; }
+.icon-caret-down:before { content: $caret-down; }
+.icon-caret-up:before { content: $caret-up; }
+.icon-caret-left:before { content: $caret-left; }
+.icon-caret-right:before { content: $caret-right; }
+.icon-columns:before { content: $columns; }
+.icon-sort:before { content: $sort; }
+.icon-sort-down:before { content: $sort-down; }
+.icon-sort-up:before { content: $sort-up; }
+.icon-envelope:before { content: $envelope; }
+.icon-linkedin:before { content: $linkedin; }
+.icon-rotate-left:before,
+.icon-undo:before { content: $undo; }
+.icon-legal:before { content: $legal; }
+.icon-dashboard:before { content: $dashboard; }
+.icon-comment-alt:before { content: $comment-alt; }
+.icon-comments-alt:before { content: $comments-alt; }
+.icon-bolt:before { content: $bolt; }
+.icon-sitemap:before { content: $sitemap; }
+.icon-umbrella:before { content: $umbrella; }
+.icon-paste:before { content: $paste; }
+.icon-lightbulb:before { content: $lightbulb; }
+.icon-exchange:before { content: $exchange; }
+.icon-cloud-download:before { content: $cloud-download; }
+.icon-cloud-upload:before { content: $cloud-upload; }
+.icon-user-md:before { content: $user-md; }
+.icon-stethoscope:before { content: $stethoscope; }
+.icon-suitcase:before { content: $suitcase; }
+.icon-bell-alt:before { content: $bell-alt; }
+.icon-coffee:before { content: $coffee; }
+.icon-food:before { content: $food; }
+.icon-file-text-alt:before { content: $file-text-alt; }
+.icon-building:before { content: $building; }
+.icon-hospital:before { content: $hospital; }
+.icon-ambulance:before { content: $ambulance; }
+.icon-medkit:before { content: $medkit; }
+.icon-fighter-jet:before { content: $fighter-jet; }
+.icon-beer:before { content: $beer; }
+.icon-h-sign:before { content: $h-sign; }
+.icon-plus-sign-alt:before { content: $plus-sign-alt; }
+.icon-double-angle-left:before { content: $double-angle-left; }
+.icon-double-angle-right:before { content: $double-angle-right; }
+.icon-double-angle-up:before { content: $double-angle-up; }
+.icon-double-angle-down:before { content: $double-angle-down; }
+.icon-angle-left:before { content: $angle-left; }
+.icon-angle-right:before { content: $angle-right; }
+.icon-angle-up:before { content: $angle-up; }
+.icon-angle-down:before { content: $angle-down; }
+.icon-desktop:before { content: $desktop; }
+.icon-laptop:before { content: $laptop; }
+.icon-tablet:before { content: $tablet; }
+.icon-mobile-phone:before { content: $mobile-phone; }
+.icon-circle-blank:before { content: $circle-blank; }
+.icon-quote-left:before { content: $quote-left; }
+.icon-quote-right:before { content: $quote-right; }
+.icon-spinner:before { content: $spinner; }
+.icon-circle:before { content: $circle; }
+.icon-mail-reply:before,
+.icon-reply:before { content: $reply; }
+.icon-github-alt:before { content: $github-alt; }
+.icon-folder-close-alt:before { content: $folder-close-alt; }
+.icon-folder-open-alt:before { content: $folder-open-alt; }
+.icon-expand-alt:before { content: $expand-alt; }
+.icon-collapse-alt:before { content: $collapse-alt; }
+.icon-smile:before { content: $smile; }
+.icon-frown:before { content: $frown; }
+.icon-meh:before { content: $meh; }
+.icon-gamepad:before { content: $gamepad; }
+.icon-keyboard:before { content: $keyboard; }
+.icon-flag-alt:before { content: $flag-alt; }
+.icon-flag-checkered:before { content: $flag-checkered; }
+.icon-terminal:before { content: $terminal; }
+.icon-code:before { content: $code; }
+.icon-reply-all:before { content: $reply-all; }
+.icon-mail-reply-all:before { content: $mail-reply-all; }
+.icon-star-half-full:before,
+.icon-star-half-empty:before { content: $star-half-empty; }
+.icon-location-arrow:before { content: $location-arrow; }
+.icon-crop:before { content: $crop; }
+.icon-code-fork:before { content: $code-fork; }
+.icon-unlink:before { content: $unlink; }
+.icon-question:before { content: $question; }
+.icon-info:before { content: $info; }
+.icon-exclamation:before { content: $exclamation; }
+.icon-superscript:before { content: $superscript; }
+.icon-subscript:before { content: $subscript; }
+.icon-eraser:before { content: $eraser; }
+.icon-puzzle-piece:before { content: $puzzle-piece; }
+.icon-microphone:before { content: $microphone; }
+.icon-microphone-off:before { content: $microphone-off; }
+.icon-shield:before { content: $shield; }
+.icon-calendar-empty:before { content: $calendar-empty; }
+.icon-fire-extinguisher:before { content: $fire-extinguisher; }
+.icon-rocket:before { content: $rocket; }
+.icon-maxcdn:before { content: $maxcdn; }
+.icon-chevron-sign-left:before { content: $chevron-sign-left; }
+.icon-chevron-sign-right:before { content: $chevron-sign-right; }
+.icon-chevron-sign-up:before { content: $chevron-sign-up; }
+.icon-chevron-sign-down:before { content: $chevron-sign-down; }
+.icon-html5:before { content: $html5; }
+.icon-css3:before { content: $css3; }
+.icon-anchor:before { content: $anchor; }
+.icon-unlock-alt:before { content: $unlock-alt; }
+.icon-bullseye:before { content: $bullseye; }
+.icon-ellipsis-horizontal:before { content: $ellipsis-horizontal; }
+.icon-ellipsis-vertical:before { content: $ellipsis-vertical; }
+.icon-rss-sign:before { content: $rss-sign; }
+.icon-play-sign:before { content: $play-sign; }
+.icon-ticket:before { content: $ticket; }
+.icon-minus-sign-alt:before { content: $minus-sign-alt; }
+.icon-check-minus:before { content: $check-minus; }
+.icon-level-up:before { content: $level-up; }
+.icon-level-down:before { content: $level-down; }
+.icon-check-sign:before { content: $check-sign; }
+.icon-edit-sign:before { content: $edit-sign; }
+.icon-external-link-sign:before { content: $external-link-sign; }
+.icon-share-sign:before { content: $share-sign; }
+.icon-compass:before { content: $compass; }
+.icon-collapse:before { content: $collapse; }
+.icon-collapse-top:before { content: $collapse-top; }
+.icon-expand:before { content: $expand; }
+.icon-euro:before,
+.icon-eur:before { content: $eur; }
+.icon-gbp:before { content: $gbp; }
+.icon-dollar:before,
+.icon-usd:before { content: $usd; }
+.icon-rupee:before,
+.icon-inr:before { content: $inr; }
+.icon-yen:before,
+.icon-jpy:before { content: $jpy; }
+.icon-renminbi:before,
+.icon-cny:before { content: $cny; }
+.icon-won:before,
+.icon-krw:before { content: $krw; }
+.icon-bitcoin:before,
+.icon-btc:before { content: $btc; }
+.icon-file:before { content: $file; }
+.icon-file-text:before { content: $file-text; }
+.icon-sort-by-alphabet:before { content: $sort-by-alphabet; }
+.icon-sort-by-alphabet-alt:before { content: $sort-by-alphabet-alt; }
+.icon-sort-by-attributes:before { content: $sort-by-attributes; }
+.icon-sort-by-attributes-alt:before { content: $sort-by-attributes-alt; }
+.icon-sort-by-order:before { content: $sort-by-order; }
+.icon-sort-by-order-alt:before { content: $sort-by-order-alt; }
+.icon-thumbs-up:before { content: $thumbs-up; }
+.icon-thumbs-down:before { content: $thumbs-down; }
+.icon-youtube-sign:before { content: $youtube-sign; }
+.icon-youtube:before { content: $youtube; }
+.icon-xing:before { content: $xing; }
+.icon-xing-sign:before { content: $xing-sign; }
+.icon-youtube-play:before { content: $youtube-play; }
+.icon-dropbox:before { content: $dropbox; }
+.icon-stackexchange:before { content: $stackexchange; }
+.icon-instagram:before { content: $instagram; }
+.icon-flickr:before { content: $flickr; }
+.icon-adn:before { content: $adn; }
+.icon-bitbucket:before { content: $bitbucket; }
+.icon-bitbucket-sign:before { content: $bitbucket-sign; }
+.icon-tumblr:before { content: $tumblr; }
+.icon-tumblr-sign:before { content: $tumblr-sign; }
+.icon-long-arrow-down:before { content: $long-arrow-down; }
+.icon-long-arrow-up:before { content: $long-arrow-up; }
+.icon-long-arrow-left:before { content: $long-arrow-left; }
+.icon-long-arrow-right:before { content: $long-arrow-right; }
+.icon-apple:before { content: $apple; }
+.icon-windows:before { content: $windows; }
+.icon-android:before { content: $android; }
+.icon-linux:before { content: $linux; }
+.icon-dribbble:before { content: $dribbble; }
+.icon-skype:before { content: $skype; }
+.icon-foursquare:before { content: $foursquare; }
+.icon-trello:before { content: $trello; }
+.icon-female:before { content: $female; }
+.icon-male:before { content: $male; }
+.icon-gittip:before { content: $gittip; }
+.icon-sun:before { content: $sun; }
+.icon-moon:before { content: $moon; }
+.icon-archive:before { content: $archive; }
+.icon-bug:before { content: $bug; }
+.icon-vk:before { content: $vk; }
+.icon-weibo:before { content: $weibo; }
+.icon-renren:before { content: $renren; }
diff --git a/library/font_awesome/scss/_mixins.scss b/library/font_awesome/scss/_mixins.scss
new file mode 100644
index 000000000..ca9c5931b
--- /dev/null
+++ b/library/font_awesome/scss/_mixins.scss
@@ -0,0 +1,48 @@
+// Mixins
+// --------------------------
+
+@mixin icon($icon) {
+ @include icon-FontAwesome();
+ content: $icon;
+}
+
+@mixin icon-FontAwesome() {
+ font-family: FontAwesome;
+ font-weight: normal;
+ font-style: normal;
+ text-decoration: inherit;
+ -webkit-font-smoothing: antialiased;
+ *margin-right: .3em; // fixes ie7 issues
+}
+
+@mixin border-radius($radius) {
+ -webkit-border-radius: $radius;
+ -moz-border-radius: $radius;
+ border-radius: $radius;
+}
+
+@mixin icon-stack($width: 2em, $height: 2em, $top-font-size: 1em, $base-font-size: 2em) {
+ .icon-stack {
+ position: relative;
+ display: inline-block;
+ width: $width;
+ height: $height;
+ line-height: $width;
+ vertical-align: -35%;
+ [class^="icon-"],
+ [class*=" icon-"] {
+ display: block;
+ text-align: center;
+ position: absolute;
+ width: 100%;
+ height: 100%;
+ font-size: $top-font-size;
+ line-height: inherit;
+ *line-height: $height;
+ }
+ .icon-stack-base {
+ font-size: $base-font-size;
+ *line-height: #{$height / $base-font-size}em;
+ }
+ }
+}
diff --git a/library/font_awesome/scss/_path.scss b/library/font_awesome/scss/_path.scss
new file mode 100644
index 000000000..bb3f36b70
--- /dev/null
+++ b/library/font_awesome/scss/_path.scss
@@ -0,0 +1,14 @@
+/* FONT PATH
+ * -------------------------- */
+
+@font-face {
+ font-family: 'FontAwesome';
+ src: url('#{$FontAwesomePath}/fontawesome-webfont.eot?v=#{$FontAwesomeVersion}');
+ src: url('#{$FontAwesomePath}/fontawesome-webfont.eot?#iefix&v=#{$FontAwesomeVersion}') format('embedded-opentype'),
+ url('#{$FontAwesomePath}/fontawesome-webfont.woff?v=#{$FontAwesomeVersion}') format('woff'),
+ url('#{$FontAwesomePath}/fontawesome-webfont.ttf?v=#{$FontAwesomeVersion}') format('truetype'),
+ url('#{$FontAwesomePath}/fontawesome-webfont.svg#fontawesomeregular?v=#{$FontAwesomeVersion}') format('svg');
+// src: url('#{$FontAwesomePath}/FontAwesome.otf') format('opentype'); // used when developing fonts
+ font-weight: normal;
+ font-style: normal;
+}
diff --git a/library/font_awesome/scss/_variables.scss b/library/font_awesome/scss/_variables.scss
new file mode 100644
index 000000000..7d6bbc5b1
--- /dev/null
+++ b/library/font_awesome/scss/_variables.scss
@@ -0,0 +1,734 @@
+// Variables
+// --------------------------
+
+$FontAwesomePath: "../font" !default;
+$FontAwesomeVersion: "3.2.1" !default;
+$borderColor: #eeeeee !default;
+$iconMuted: #eeeeee !default;
+$iconLight: white !default;
+$iconDark: #333333 !default;
+$icons-li-width: (30em/14);
+
+
+$glass: "\f000";
+
+$music: "\f001";
+
+$search: "\f002";
+
+$envelope-alt: "\f003";
+
+$heart: "\f004";
+
+$star: "\f005";
+
+$star-empty: "\f006";
+
+$user: "\f007";
+
+$film: "\f008";
+
+$th-large: "\f009";
+
+$th: "\f00a";
+
+$th-list: "\f00b";
+
+$ok: "\f00c";
+
+$remove: "\f00d";
+
+$zoom-in: "\f00e";
+
+$zoom-out: "\f010";
+
+$off: "\f011";
+
+$signal: "\f012";
+
+$cog: "\f013";
+
+$trash: "\f014";
+
+$home: "\f015";
+
+$file-alt: "\f016";
+
+$time: "\f017";
+
+$road: "\f018";
+
+$download-alt: "\f019";
+
+$download: "\f01a";
+
+$upload: "\f01b";
+
+$inbox: "\f01c";
+
+$play-circle: "\f01d";
+
+$repeat: "\f01e";
+
+$refresh: "\f021";
+
+$list-alt: "\f022";
+
+$lock: "\f023";
+
+$flag: "\f024";
+
+$headphones: "\f025";
+
+$volume-off: "\f026";
+
+$volume-down: "\f027";
+
+$volume-up: "\f028";
+
+$qrcode: "\f029";
+
+$barcode: "\f02a";
+
+$tag: "\f02b";
+
+$tags: "\f02c";
+
+$book: "\f02d";
+
+$bookmark: "\f02e";
+
+$print: "\f02f";
+
+$camera: "\f030";
+
+$font: "\f031";
+
+$bold: "\f032";
+
+$italic: "\f033";
+
+$text-height: "\f034";
+
+$text-width: "\f035";
+
+$align-left: "\f036";
+
+$align-center: "\f037";
+
+$align-right: "\f038";
+
+$align-justify: "\f039";
+
+$list: "\f03a";
+
+$indent-left: "\f03b";
+
+$indent-right: "\f03c";
+
+$facetime-video: "\f03d";
+
+$picture: "\f03e";
+
+$pencil: "\f040";
+
+$map-marker: "\f041";
+
+$adjust: "\f042";
+
+$tint: "\f043";
+
+$edit: "\f044";
+
+$share: "\f045";
+
+$check: "\f046";
+
+$move: "\f047";
+
+$step-backward: "\f048";
+
+$fast-backward: "\f049";
+
+$backward: "\f04a";
+
+$play: "\f04b";
+
+$pause: "\f04c";
+
+$stop: "\f04d";
+
+$forward: "\f04e";
+
+$fast-forward: "\f050";
+
+$step-forward: "\f051";
+
+$eject: "\f052";
+
+$chevron-left: "\f053";
+
+$chevron-right: "\f054";
+
+$plus-sign: "\f055";
+
+$minus-sign: "\f056";
+
+$remove-sign: "\f057";
+
+$ok-sign: "\f058";
+
+$question-sign: "\f059";
+
+$info-sign: "\f05a";
+
+$screenshot: "\f05b";
+
+$remove-circle: "\f05c";
+
+$ok-circle: "\f05d";
+
+$ban-circle: "\f05e";
+
+$arrow-left: "\f060";
+
+$arrow-right: "\f061";
+
+$arrow-up: "\f062";
+
+$arrow-down: "\f063";
+
+$share-alt: "\f064";
+
+$resize-full: "\f065";
+
+$resize-small: "\f066";
+
+$plus: "\f067";
+
+$minus: "\f068";
+
+$asterisk: "\f069";
+
+$exclamation-sign: "\f06a";
+
+$gift: "\f06b";
+
+$leaf: "\f06c";
+
+$fire: "\f06d";
+
+$eye-open: "\f06e";
+
+$eye-close: "\f070";
+
+$warning-sign: "\f071";
+
+$plane: "\f072";
+
+$calendar: "\f073";
+
+$random: "\f074";
+
+$comment: "\f075";
+
+$magnet: "\f076";
+
+$chevron-up: "\f077";
+
+$chevron-down: "\f078";
+
+$retweet: "\f079";
+
+$shopping-cart: "\f07a";
+
+$folder-close: "\f07b";
+
+$folder-open: "\f07c";
+
+$resize-vertical: "\f07d";
+
+$resize-horizontal: "\f07e";
+
+$bar-chart: "\f080";
+
+$twitter-sign: "\f081";
+
+$facebook-sign: "\f082";
+
+$camera-retro: "\f083";
+
+$key: "\f084";
+
+$cogs: "\f085";
+
+$comments: "\f086";
+
+$thumbs-up-alt: "\f087";
+
+$thumbs-down-alt: "\f088";
+
+$star-half: "\f089";
+
+$heart-empty: "\f08a";
+
+$signout: "\f08b";
+
+$linkedin-sign: "\f08c";
+
+$pushpin: "\f08d";
+
+$external-link: "\f08e";
+
+$signin: "\f090";
+
+$trophy: "\f091";
+
+$github-sign: "\f092";
+
+$upload-alt: "\f093";
+
+$lemon: "\f094";
+
+$phone: "\f095";
+
+$check-empty: "\f096";
+
+$bookmark-empty: "\f097";
+
+$phone-sign: "\f098";
+
+$twitter: "\f099";
+
+$facebook: "\f09a";
+
+$github: "\f09b";
+
+$unlock: "\f09c";
+
+$credit-card: "\f09d";
+
+$rss: "\f09e";
+
+$hdd: "\f0a0";
+
+$bullhorn: "\f0a1";
+
+$bell: "\f0a2";
+
+$certificate: "\f0a3";
+
+$hand-right: "\f0a4";
+
+$hand-left: "\f0a5";
+
+$hand-up: "\f0a6";
+
+$hand-down: "\f0a7";
+
+$circle-arrow-left: "\f0a8";
+
+$circle-arrow-right: "\f0a9";
+
+$circle-arrow-up: "\f0aa";
+
+$circle-arrow-down: "\f0ab";
+
+$globe: "\f0ac";
+
+$wrench: "\f0ad";
+
+$tasks: "\f0ae";
+
+$filter: "\f0b0";
+
+$briefcase: "\f0b1";
+
+$fullscreen: "\f0b2";
+
+$group: "\f0c0";
+
+$link: "\f0c1";
+
+$cloud: "\f0c2";
+
+$beaker: "\f0c3";
+
+$cut: "\f0c4";
+
+$copy: "\f0c5";
+
+$paper-clip: "\f0c6";
+
+$save: "\f0c7";
+
+$sign-blank: "\f0c8";
+
+$reorder: "\f0c9";
+
+$list-ul: "\f0ca";
+
+$list-ol: "\f0cb";
+
+$strikethrough: "\f0cc";
+
+$underline: "\f0cd";
+
+$table: "\f0ce";
+
+$magic: "\f0d0";
+
+$truck: "\f0d1";
+
+$pinterest: "\f0d2";
+
+$pinterest-sign: "\f0d3";
+
+$google-plus-sign: "\f0d4";
+
+$google-plus: "\f0d5";
+
+$money: "\f0d6";
+
+$caret-down: "\f0d7";
+
+$caret-up: "\f0d8";
+
+$caret-left: "\f0d9";
+
+$caret-right: "\f0da";
+
+$columns: "\f0db";
+
+$sort: "\f0dc";
+
+$sort-down: "\f0dd";
+
+$sort-up: "\f0de";
+
+$envelope: "\f0e0";
+
+$linkedin: "\f0e1";
+
+$undo: "\f0e2";
+
+$legal: "\f0e3";
+
+$dashboard: "\f0e4";
+
+$comment-alt: "\f0e5";
+
+$comments-alt: "\f0e6";
+
+$bolt: "\f0e7";
+
+$sitemap: "\f0e8";
+
+$umbrella: "\f0e9";
+
+$paste: "\f0ea";
+
+$lightbulb: "\f0eb";
+
+$exchange: "\f0ec";
+
+$cloud-download: "\f0ed";
+
+$cloud-upload: "\f0ee";
+
+$user-md: "\f0f0";
+
+$stethoscope: "\f0f1";
+
+$suitcase: "\f0f2";
+
+$bell-alt: "\f0f3";
+
+$coffee: "\f0f4";
+
+$food: "\f0f5";
+
+$file-text-alt: "\f0f6";
+
+$building: "\f0f7";
+
+$hospital: "\f0f8";
+
+$ambulance: "\f0f9";
+
+$medkit: "\f0fa";
+
+$fighter-jet: "\f0fb";
+
+$beer: "\f0fc";
+
+$h-sign: "\f0fd";
+
+$plus-sign-alt: "\f0fe";
+
+$double-angle-left: "\f100";
+
+$double-angle-right: "\f101";
+
+$double-angle-up: "\f102";
+
+$double-angle-down: "\f103";
+
+$angle-left: "\f104";
+
+$angle-right: "\f105";
+
+$angle-up: "\f106";
+
+$angle-down: "\f107";
+
+$desktop: "\f108";
+
+$laptop: "\f109";
+
+$tablet: "\f10a";
+
+$mobile-phone: "\f10b";
+
+$circle-blank: "\f10c";
+
+$quote-left: "\f10d";
+
+$quote-right: "\f10e";
+
+$spinner: "\f110";
+
+$circle: "\f111";
+
+$reply: "\f112";
+
+$github-alt: "\f113";
+
+$folder-close-alt: "\f114";
+
+$folder-open-alt: "\f115";
+
+$expand-alt: "\f116";
+
+$collapse-alt: "\f117";
+
+$smile: "\f118";
+
+$frown: "\f119";
+
+$meh: "\f11a";
+
+$gamepad: "\f11b";
+
+$keyboard: "\f11c";
+
+$flag-alt: "\f11d";
+
+$flag-checkered: "\f11e";
+
+$terminal: "\f120";
+
+$code: "\f121";
+
+$reply-all: "\f122";
+
+$mail-reply-all: "\f122";
+
+$star-half-empty: "\f123";
+
+$location-arrow: "\f124";
+
+$crop: "\f125";
+
+$code-fork: "\f126";
+
+$unlink: "\f127";
+
+$question: "\f128";
+
+$info: "\f129";
+
+$exclamation: "\f12a";
+
+$superscript: "\f12b";
+
+$subscript: "\f12c";
+
+$eraser: "\f12d";
+
+$puzzle-piece: "\f12e";
+
+$microphone: "\f130";
+
+$microphone-off: "\f131";
+
+$shield: "\f132";
+
+$calendar-empty: "\f133";
+
+$fire-extinguisher: "\f134";
+
+$rocket: "\f135";
+
+$maxcdn: "\f136";
+
+$chevron-sign-left: "\f137";
+
+$chevron-sign-right: "\f138";
+
+$chevron-sign-up: "\f139";
+
+$chevron-sign-down: "\f13a";
+
+$html5: "\f13b";
+
+$css3: "\f13c";
+
+$anchor: "\f13d";
+
+$unlock-alt: "\f13e";
+
+$bullseye: "\f140";
+
+$ellipsis-horizontal: "\f141";
+
+$ellipsis-vertical: "\f142";
+
+$rss-sign: "\f143";
+
+$play-sign: "\f144";
+
+$ticket: "\f145";
+
+$minus-sign-alt: "\f146";
+
+$check-minus: "\f147";
+
+$level-up: "\f148";
+
+$level-down: "\f149";
+
+$check-sign: "\f14a";
+
+$edit-sign: "\f14b";
+
+$external-link-sign: "\f14c";
+
+$share-sign: "\f14d";
+
+$compass: "\f14e";
+
+$collapse: "\f150";
+
+$collapse-top: "\f151";
+
+$expand: "\f152";
+
+$eur: "\f153";
+
+$gbp: "\f154";
+
+$usd: "\f155";
+
+$inr: "\f156";
+
+$jpy: "\f157";
+
+$cny: "\f158";
+
+$krw: "\f159";
+
+$btc: "\f15a";
+
+$file: "\f15b";
+
+$file-text: "\f15c";
+
+$sort-by-alphabet: "\f15d";
+
+$sort-by-alphabet-alt: "\f15e";
+
+$sort-by-attributes: "\f160";
+
+$sort-by-attributes-alt: "\f161";
+
+$sort-by-order: "\f162";
+
+$sort-by-order-alt: "\f163";
+
+$thumbs-up: "\f164";
+
+$thumbs-down: "\f165";
+
+$youtube-sign: "\f166";
+
+$youtube: "\f167";
+
+$xing: "\f168";
+
+$xing-sign: "\f169";
+
+$youtube-play: "\f16a";
+
+$dropbox: "\f16b";
+
+$stackexchange: "\f16c";
+
+$instagram: "\f16d";
+
+$flickr: "\f16e";
+
+$adn: "\f170";
+
+$bitbucket: "\f171";
+
+$bitbucket-sign: "\f172";
+
+$tumblr: "\f173";
+
+$tumblr-sign: "\f174";
+
+$long-arrow-down: "\f175";
+
+$long-arrow-up: "\f176";
+
+$long-arrow-left: "\f177";
+
+$long-arrow-right: "\f178";
+
+$apple: "\f179";
+
+$windows: "\f17a";
+
+$android: "\f17b";
+
+$linux: "\f17c";
+
+$dribbble: "\f17d";
+
+$skype: "\f17e";
+
+$foursquare: "\f180";
+
+$trello: "\f181";
+
+$female: "\f182";
+
+$male: "\f183";
+
+$gittip: "\f184";
+
+$sun: "\f185";
+
+$moon: "\f186";
+
+$archive: "\f187";
+
+$bug: "\f188";
+
+$vk: "\f189";
+
+$weibo: "\f18a";
+
+$renren: "\f18b";
+
diff --git a/library/font_awesome/scss/font-awesome-ie7.scss b/library/font_awesome/scss/font-awesome-ie7.scss
new file mode 100644
index 000000000..0e236f61e
--- /dev/null
+++ b/library/font_awesome/scss/font-awesome-ie7.scss
@@ -0,0 +1,1953 @@
+/*!
+ * Font Awesome 3.2.1
+ * the iconic font designed for Bootstrap
+ * ------------------------------------------------------------------------------
+ * The full suite of pictographic icons, examples, and documentation can be
+ * found at http://fontawesome.io. Stay up to date on Twitter at
+ * http://twitter.com/fontawesome.
+ *
+ * License
+ * ------------------------------------------------------------------------------
+ * - The Font Awesome font is licensed under SIL OFL 1.1 -
+ * http://scripts.sil.org/OFL
+ * - Font Awesome CSS, LESS, and SASS files are licensed under MIT License -
+ * http://opensource.org/licenses/mit-license.html
+ * - Font Awesome documentation licensed under CC BY 3.0 -
+ * http://creativecommons.org/licenses/by/3.0/
+ * - Attribution is no longer required in Font Awesome 3.0, but much appreciated:
+ * "Font Awesome by Dave Gandy - http://fontawesome.io"
+ *
+ * Author - Dave Gandy
+ * ------------------------------------------------------------------------------
+ * Email: dave@fontawesome.io
+ * Twitter: http://twitter.com/davegandy
+ * Work: Lead Product Designer @ Kyruus - http://kyruus.com
+ */
+
+.icon-large {
+ font-size: (4em/3);
+ margin-top: -4px;
+ padding-top: 3px;
+ margin-bottom: -4px;
+ padding-bottom: 3px;
+ vertical-align: middle;
+}
+
+.nav {
+ [class^="icon-"],
+ [class*=" icon-"] {
+ vertical-align: inherit;
+ margin-top: -4px;
+ padding-top: 3px;
+ margin-bottom: -4px;
+ padding-bottom: 3px;
+ &.icon-large {
+ vertical-align: -25%;
+ }
+ }
+}
+
+.nav-pills, .nav-tabs {
+ [class^="icon-"],
+ [class*=" icon-"] {
+ &.icon-large {
+ line-height: .75em;
+ margin-top: -7px;
+ padding-top: 5px;
+ margin-bottom: -5px;
+ padding-bottom: 4px;
+ }
+ }
+}
+
+.btn {
+ [class^="icon-"],
+ [class*=" icon-"] {
+ &.pull-left, &.pull-right { vertical-align: inherit; }
+ &.icon-large {
+ margin-top: -.5em;
+ }
+ }
+}
+
+a [class^="icon-"],
+a [class*=" icon-"] {
+ cursor: pointer;
+}
+
+@mixin ie7icon($inner) { *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = '#{$inner}'); }
+
+
+.icon-glass {
+ @include ie7icon('&#xf000;');
+}
+
+
+.icon-music {
+ @include ie7icon('&#xf001;');
+}
+
+
+.icon-search {
+ @include ie7icon('&#xf002;');
+}
+
+
+.icon-envelope-alt {
+ @include ie7icon('&#xf003;');
+}
+
+
+.icon-heart {
+ @include ie7icon('&#xf004;');
+}
+
+
+.icon-star {
+ @include ie7icon('&#xf005;');
+}
+
+
+.icon-star-empty {
+ @include ie7icon('&#xf006;');
+}
+
+
+.icon-user {
+ @include ie7icon('&#xf007;');
+}
+
+
+.icon-film {
+ @include ie7icon('&#xf008;');
+}
+
+
+.icon-th-large {
+ @include ie7icon('&#xf009;');
+}
+
+
+.icon-th {
+ @include ie7icon('&#xf00a;');
+}
+
+
+.icon-th-list {
+ @include ie7icon('&#xf00b;');
+}
+
+
+.icon-ok {
+ @include ie7icon('&#xf00c;');
+}
+
+
+.icon-remove {
+ @include ie7icon('&#xf00d;');
+}
+
+
+.icon-zoom-in {
+ @include ie7icon('&#xf00e;');
+}
+
+
+.icon-zoom-out {
+ @include ie7icon('&#xf010;');
+}
+
+
+.icon-off {
+ @include ie7icon('&#xf011;');
+}
+
+.icon-power-off {
+ @include ie7icon('&#xf011;');
+}
+
+
+.icon-signal {
+ @include ie7icon('&#xf012;');
+}
+
+
+.icon-cog {
+ @include ie7icon('&#xf013;');
+}
+
+.icon-gear {
+ @include ie7icon('&#xf013;');
+}
+
+
+.icon-trash {
+ @include ie7icon('&#xf014;');
+}
+
+
+.icon-home {
+ @include ie7icon('&#xf015;');
+}
+
+
+.icon-file-alt {
+ @include ie7icon('&#xf016;');
+}
+
+
+.icon-time {
+ @include ie7icon('&#xf017;');
+}
+
+
+.icon-road {
+ @include ie7icon('&#xf018;');
+}
+
+
+.icon-download-alt {
+ @include ie7icon('&#xf019;');
+}
+
+
+.icon-download {
+ @include ie7icon('&#xf01a;');
+}
+
+
+.icon-upload {
+ @include ie7icon('&#xf01b;');
+}
+
+
+.icon-inbox {
+ @include ie7icon('&#xf01c;');
+}
+
+
+.icon-play-circle {
+ @include ie7icon('&#xf01d;');
+}
+
+
+.icon-repeat {
+ @include ie7icon('&#xf01e;');
+}
+
+.icon-rotate-right {
+ @include ie7icon('&#xf01e;');
+}
+
+
+.icon-refresh {
+ @include ie7icon('&#xf021;');
+}
+
+
+.icon-list-alt {
+ @include ie7icon('&#xf022;');
+}
+
+
+.icon-lock {
+ @include ie7icon('&#xf023;');
+}
+
+
+.icon-flag {
+ @include ie7icon('&#xf024;');
+}
+
+
+.icon-headphones {
+ @include ie7icon('&#xf025;');
+}
+
+
+.icon-volume-off {
+ @include ie7icon('&#xf026;');
+}
+
+
+.icon-volume-down {
+ @include ie7icon('&#xf027;');
+}
+
+
+.icon-volume-up {
+ @include ie7icon('&#xf028;');
+}
+
+
+.icon-qrcode {
+ @include ie7icon('&#xf029;');
+}
+
+
+.icon-barcode {
+ @include ie7icon('&#xf02a;');
+}
+
+
+.icon-tag {
+ @include ie7icon('&#xf02b;');
+}
+
+
+.icon-tags {
+ @include ie7icon('&#xf02c;');
+}
+
+
+.icon-book {
+ @include ie7icon('&#xf02d;');
+}
+
+
+.icon-bookmark {
+ @include ie7icon('&#xf02e;');
+}
+
+
+.icon-print {
+ @include ie7icon('&#xf02f;');
+}
+
+
+.icon-camera {
+ @include ie7icon('&#xf030;');
+}
+
+
+.icon-font {
+ @include ie7icon('&#xf031;');
+}
+
+
+.icon-bold {
+ @include ie7icon('&#xf032;');
+}
+
+
+.icon-italic {
+ @include ie7icon('&#xf033;');
+}
+
+
+.icon-text-height {
+ @include ie7icon('&#xf034;');
+}
+
+
+.icon-text-width {
+ @include ie7icon('&#xf035;');
+}
+
+
+.icon-align-left {
+ @include ie7icon('&#xf036;');
+}
+
+
+.icon-align-center {
+ @include ie7icon('&#xf037;');
+}
+
+
+.icon-align-right {
+ @include ie7icon('&#xf038;');
+}
+
+
+.icon-align-justify {
+ @include ie7icon('&#xf039;');
+}
+
+
+.icon-list {
+ @include ie7icon('&#xf03a;');
+}
+
+
+.icon-indent-left {
+ @include ie7icon('&#xf03b;');
+}
+
+
+.icon-indent-right {
+ @include ie7icon('&#xf03c;');
+}
+
+
+.icon-facetime-video {
+ @include ie7icon('&#xf03d;');
+}
+
+
+.icon-picture {
+ @include ie7icon('&#xf03e;');
+}
+
+
+.icon-pencil {
+ @include ie7icon('&#xf040;');
+}
+
+
+.icon-map-marker {
+ @include ie7icon('&#xf041;');
+}
+
+
+.icon-adjust {
+ @include ie7icon('&#xf042;');
+}
+
+
+.icon-tint {
+ @include ie7icon('&#xf043;');
+}
+
+
+.icon-edit {
+ @include ie7icon('&#xf044;');
+}
+
+
+.icon-share {
+ @include ie7icon('&#xf045;');
+}
+
+
+.icon-check {
+ @include ie7icon('&#xf046;');
+}
+
+
+.icon-move {
+ @include ie7icon('&#xf047;');
+}
+
+
+.icon-step-backward {
+ @include ie7icon('&#xf048;');
+}
+
+
+.icon-fast-backward {
+ @include ie7icon('&#xf049;');
+}
+
+
+.icon-backward {
+ @include ie7icon('&#xf04a;');
+}
+
+
+.icon-play {
+ @include ie7icon('&#xf04b;');
+}
+
+
+.icon-pause {
+ @include ie7icon('&#xf04c;');
+}
+
+
+.icon-stop {
+ @include ie7icon('&#xf04d;');
+}
+
+
+.icon-forward {
+ @include ie7icon('&#xf04e;');
+}
+
+
+.icon-fast-forward {
+ @include ie7icon('&#xf050;');
+}
+
+
+.icon-step-forward {
+ @include ie7icon('&#xf051;');
+}
+
+
+.icon-eject {
+ @include ie7icon('&#xf052;');
+}
+
+
+.icon-chevron-left {
+ @include ie7icon('&#xf053;');
+}
+
+
+.icon-chevron-right {
+ @include ie7icon('&#xf054;');
+}
+
+
+.icon-plus-sign {
+ @include ie7icon('&#xf055;');
+}
+
+
+.icon-minus-sign {
+ @include ie7icon('&#xf056;');
+}
+
+
+.icon-remove-sign {
+ @include ie7icon('&#xf057;');
+}
+
+
+.icon-ok-sign {
+ @include ie7icon('&#xf058;');
+}
+
+
+.icon-question-sign {
+ @include ie7icon('&#xf059;');
+}
+
+
+.icon-info-sign {
+ @include ie7icon('&#xf05a;');
+}
+
+
+.icon-screenshot {
+ @include ie7icon('&#xf05b;');
+}
+
+
+.icon-remove-circle {
+ @include ie7icon('&#xf05c;');
+}
+
+
+.icon-ok-circle {
+ @include ie7icon('&#xf05d;');
+}
+
+
+.icon-ban-circle {
+ @include ie7icon('&#xf05e;');
+}
+
+
+.icon-arrow-left {
+ @include ie7icon('&#xf060;');
+}
+
+
+.icon-arrow-right {
+ @include ie7icon('&#xf061;');
+}
+
+
+.icon-arrow-up {
+ @include ie7icon('&#xf062;');
+}
+
+
+.icon-arrow-down {
+ @include ie7icon('&#xf063;');
+}
+
+
+.icon-share-alt {
+ @include ie7icon('&#xf064;');
+}
+
+.icon-mail-forward {
+ @include ie7icon('&#xf064;');
+}
+
+
+.icon-resize-full {
+ @include ie7icon('&#xf065;');
+}
+
+
+.icon-resize-small {
+ @include ie7icon('&#xf066;');
+}
+
+
+.icon-plus {
+ @include ie7icon('&#xf067;');
+}
+
+
+.icon-minus {
+ @include ie7icon('&#xf068;');
+}
+
+
+.icon-asterisk {
+ @include ie7icon('&#xf069;');
+}
+
+
+.icon-exclamation-sign {
+ @include ie7icon('&#xf06a;');
+}
+
+
+.icon-gift {
+ @include ie7icon('&#xf06b;');
+}
+
+
+.icon-leaf {
+ @include ie7icon('&#xf06c;');
+}
+
+
+.icon-fire {
+ @include ie7icon('&#xf06d;');
+}
+
+
+.icon-eye-open {
+ @include ie7icon('&#xf06e;');
+}
+
+
+.icon-eye-close {
+ @include ie7icon('&#xf070;');
+}
+
+
+.icon-warning-sign {
+ @include ie7icon('&#xf071;');
+}
+
+
+.icon-plane {
+ @include ie7icon('&#xf072;');
+}
+
+
+.icon-calendar {
+ @include ie7icon('&#xf073;');
+}
+
+
+.icon-random {
+ @include ie7icon('&#xf074;');
+}
+
+
+.icon-comment {
+ @include ie7icon('&#xf075;');
+}
+
+
+.icon-magnet {
+ @include ie7icon('&#xf076;');
+}
+
+
+.icon-chevron-up {
+ @include ie7icon('&#xf077;');
+}
+
+
+.icon-chevron-down {
+ @include ie7icon('&#xf078;');
+}
+
+
+.icon-retweet {
+ @include ie7icon('&#xf079;');
+}
+
+
+.icon-shopping-cart {
+ @include ie7icon('&#xf07a;');
+}
+
+
+.icon-folder-close {
+ @include ie7icon('&#xf07b;');
+}
+
+
+.icon-folder-open {
+ @include ie7icon('&#xf07c;');
+}
+
+
+.icon-resize-vertical {
+ @include ie7icon('&#xf07d;');
+}
+
+
+.icon-resize-horizontal {
+ @include ie7icon('&#xf07e;');
+}
+
+
+.icon-bar-chart {
+ @include ie7icon('&#xf080;');
+}
+
+
+.icon-twitter-sign {
+ @include ie7icon('&#xf081;');
+}
+
+
+.icon-facebook-sign {
+ @include ie7icon('&#xf082;');
+}
+
+
+.icon-camera-retro {
+ @include ie7icon('&#xf083;');
+}
+
+
+.icon-key {
+ @include ie7icon('&#xf084;');
+}
+
+
+.icon-cogs {
+ @include ie7icon('&#xf085;');
+}
+
+.icon-gears {
+ @include ie7icon('&#xf085;');
+}
+
+
+.icon-comments {
+ @include ie7icon('&#xf086;');
+}
+
+
+.icon-thumbs-up-alt {
+ @include ie7icon('&#xf087;');
+}
+
+
+.icon-thumbs-down-alt {
+ @include ie7icon('&#xf088;');
+}
+
+
+.icon-star-half {
+ @include ie7icon('&#xf089;');
+}
+
+
+.icon-heart-empty {
+ @include ie7icon('&#xf08a;');
+}
+
+
+.icon-signout {
+ @include ie7icon('&#xf08b;');
+}
+
+
+.icon-linkedin-sign {
+ @include ie7icon('&#xf08c;');
+}
+
+
+.icon-pushpin {
+ @include ie7icon('&#xf08d;');
+}
+
+
+.icon-external-link {
+ @include ie7icon('&#xf08e;');
+}
+
+
+.icon-signin {
+ @include ie7icon('&#xf090;');
+}
+
+
+.icon-trophy {
+ @include ie7icon('&#xf091;');
+}
+
+
+.icon-github-sign {
+ @include ie7icon('&#xf092;');
+}
+
+
+.icon-upload-alt {
+ @include ie7icon('&#xf093;');
+}
+
+
+.icon-lemon {
+ @include ie7icon('&#xf094;');
+}
+
+
+.icon-phone {
+ @include ie7icon('&#xf095;');
+}
+
+
+.icon-check-empty {
+ @include ie7icon('&#xf096;');
+}
+
+.icon-unchecked {
+ @include ie7icon('&#xf096;');
+}
+
+
+.icon-bookmark-empty {
+ @include ie7icon('&#xf097;');
+}
+
+
+.icon-phone-sign {
+ @include ie7icon('&#xf098;');
+}
+
+
+.icon-twitter {
+ @include ie7icon('&#xf099;');
+}
+
+
+.icon-facebook {
+ @include ie7icon('&#xf09a;');
+}
+
+
+.icon-github {
+ @include ie7icon('&#xf09b;');
+}
+
+
+.icon-unlock {
+ @include ie7icon('&#xf09c;');
+}
+
+
+.icon-credit-card {
+ @include ie7icon('&#xf09d;');
+}
+
+
+.icon-rss {
+ @include ie7icon('&#xf09e;');
+}
+
+
+.icon-hdd {
+ @include ie7icon('&#xf0a0;');
+}
+
+
+.icon-bullhorn {
+ @include ie7icon('&#xf0a1;');
+}
+
+
+.icon-bell {
+ @include ie7icon('&#xf0a2;');
+}
+
+
+.icon-certificate {
+ @include ie7icon('&#xf0a3;');
+}
+
+
+.icon-hand-right {
+ @include ie7icon('&#xf0a4;');
+}
+
+
+.icon-hand-left {
+ @include ie7icon('&#xf0a5;');
+}
+
+
+.icon-hand-up {
+ @include ie7icon('&#xf0a6;');
+}
+
+
+.icon-hand-down {
+ @include ie7icon('&#xf0a7;');
+}
+
+
+.icon-circle-arrow-left {
+ @include ie7icon('&#xf0a8;');
+}
+
+
+.icon-circle-arrow-right {
+ @include ie7icon('&#xf0a9;');
+}
+
+
+.icon-circle-arrow-up {
+ @include ie7icon('&#xf0aa;');
+}
+
+
+.icon-circle-arrow-down {
+ @include ie7icon('&#xf0ab;');
+}
+
+
+.icon-globe {
+ @include ie7icon('&#xf0ac;');
+}
+
+
+.icon-wrench {
+ @include ie7icon('&#xf0ad;');
+}
+
+
+.icon-tasks {
+ @include ie7icon('&#xf0ae;');
+}
+
+
+.icon-filter {
+ @include ie7icon('&#xf0b0;');
+}
+
+
+.icon-briefcase {
+ @include ie7icon('&#xf0b1;');
+}
+
+
+.icon-fullscreen {
+ @include ie7icon('&#xf0b2;');
+}
+
+
+.icon-group {
+ @include ie7icon('&#xf0c0;');
+}
+
+
+.icon-link {
+ @include ie7icon('&#xf0c1;');
+}
+
+
+.icon-cloud {
+ @include ie7icon('&#xf0c2;');
+}
+
+
+.icon-beaker {
+ @include ie7icon('&#xf0c3;');
+}
+
+
+.icon-cut {
+ @include ie7icon('&#xf0c4;');
+}
+
+
+.icon-copy {
+ @include ie7icon('&#xf0c5;');
+}
+
+
+.icon-paper-clip {
+ @include ie7icon('&#xf0c6;');
+}
+
+.icon-paperclip {
+ @include ie7icon('&#xf0c6;');
+}
+
+
+.icon-save {
+ @include ie7icon('&#xf0c7;');
+}
+
+
+.icon-sign-blank {
+ @include ie7icon('&#xf0c8;');
+}
+
+
+.icon-reorder {
+ @include ie7icon('&#xf0c9;');
+}
+
+
+.icon-list-ul {
+ @include ie7icon('&#xf0ca;');
+}
+
+
+.icon-list-ol {
+ @include ie7icon('&#xf0cb;');
+}
+
+
+.icon-strikethrough {
+ @include ie7icon('&#xf0cc;');
+}
+
+
+.icon-underline {
+ @include ie7icon('&#xf0cd;');
+}
+
+
+.icon-table {
+ @include ie7icon('&#xf0ce;');
+}
+
+
+.icon-magic {
+ @include ie7icon('&#xf0d0;');
+}
+
+
+.icon-truck {
+ @include ie7icon('&#xf0d1;');
+}
+
+
+.icon-pinterest {
+ @include ie7icon('&#xf0d2;');
+}
+
+
+.icon-pinterest-sign {
+ @include ie7icon('&#xf0d3;');
+}
+
+
+.icon-google-plus-sign {
+ @include ie7icon('&#xf0d4;');
+}
+
+
+.icon-google-plus {
+ @include ie7icon('&#xf0d5;');
+}
+
+
+.icon-money {
+ @include ie7icon('&#xf0d6;');
+}
+
+
+.icon-caret-down {
+ @include ie7icon('&#xf0d7;');
+}
+
+
+.icon-caret-up {
+ @include ie7icon('&#xf0d8;');
+}
+
+
+.icon-caret-left {
+ @include ie7icon('&#xf0d9;');
+}
+
+
+.icon-caret-right {
+ @include ie7icon('&#xf0da;');
+}
+
+
+.icon-columns {
+ @include ie7icon('&#xf0db;');
+}
+
+
+.icon-sort {
+ @include ie7icon('&#xf0dc;');
+}
+
+
+.icon-sort-down {
+ @include ie7icon('&#xf0dd;');
+}
+
+
+.icon-sort-up {
+ @include ie7icon('&#xf0de;');
+}
+
+
+.icon-envelope {
+ @include ie7icon('&#xf0e0;');
+}
+
+
+.icon-linkedin {
+ @include ie7icon('&#xf0e1;');
+}
+
+
+.icon-undo {
+ @include ie7icon('&#xf0e2;');
+}
+
+.icon-rotate-left {
+ @include ie7icon('&#xf0e2;');
+}
+
+
+.icon-legal {
+ @include ie7icon('&#xf0e3;');
+}
+
+
+.icon-dashboard {
+ @include ie7icon('&#xf0e4;');
+}
+
+
+.icon-comment-alt {
+ @include ie7icon('&#xf0e5;');
+}
+
+
+.icon-comments-alt {
+ @include ie7icon('&#xf0e6;');
+}
+
+
+.icon-bolt {
+ @include ie7icon('&#xf0e7;');
+}
+
+
+.icon-sitemap {
+ @include ie7icon('&#xf0e8;');
+}
+
+
+.icon-umbrella {
+ @include ie7icon('&#xf0e9;');
+}
+
+
+.icon-paste {
+ @include ie7icon('&#xf0ea;');
+}
+
+
+.icon-lightbulb {
+ @include ie7icon('&#xf0eb;');
+}
+
+
+.icon-exchange {
+ @include ie7icon('&#xf0ec;');
+}
+
+
+.icon-cloud-download {
+ @include ie7icon('&#xf0ed;');
+}
+
+
+.icon-cloud-upload {
+ @include ie7icon('&#xf0ee;');
+}
+
+
+.icon-user-md {
+ @include ie7icon('&#xf0f0;');
+}
+
+
+.icon-stethoscope {
+ @include ie7icon('&#xf0f1;');
+}
+
+
+.icon-suitcase {
+ @include ie7icon('&#xf0f2;');
+}
+
+
+.icon-bell-alt {
+ @include ie7icon('&#xf0f3;');
+}
+
+
+.icon-coffee {
+ @include ie7icon('&#xf0f4;');
+}
+
+
+.icon-food {
+ @include ie7icon('&#xf0f5;');
+}
+
+
+.icon-file-text-alt {
+ @include ie7icon('&#xf0f6;');
+}
+
+
+.icon-building {
+ @include ie7icon('&#xf0f7;');
+}
+
+
+.icon-hospital {
+ @include ie7icon('&#xf0f8;');
+}
+
+
+.icon-ambulance {
+ @include ie7icon('&#xf0f9;');
+}
+
+
+.icon-medkit {
+ @include ie7icon('&#xf0fa;');
+}
+
+
+.icon-fighter-jet {
+ @include ie7icon('&#xf0fb;');
+}
+
+
+.icon-beer {
+ @include ie7icon('&#xf0fc;');
+}
+
+
+.icon-h-sign {
+ @include ie7icon('&#xf0fd;');
+}
+
+
+.icon-plus-sign-alt {
+ @include ie7icon('&#xf0fe;');
+}
+
+
+.icon-double-angle-left {
+ @include ie7icon('&#xf100;');
+}
+
+
+.icon-double-angle-right {
+ @include ie7icon('&#xf101;');
+}
+
+
+.icon-double-angle-up {
+ @include ie7icon('&#xf102;');
+}
+
+
+.icon-double-angle-down {
+ @include ie7icon('&#xf103;');
+}
+
+
+.icon-angle-left {
+ @include ie7icon('&#xf104;');
+}
+
+
+.icon-angle-right {
+ @include ie7icon('&#xf105;');
+}
+
+
+.icon-angle-up {
+ @include ie7icon('&#xf106;');
+}
+
+
+.icon-angle-down {
+ @include ie7icon('&#xf107;');
+}
+
+
+.icon-desktop {
+ @include ie7icon('&#xf108;');
+}
+
+
+.icon-laptop {
+ @include ie7icon('&#xf109;');
+}
+
+
+.icon-tablet {
+ @include ie7icon('&#xf10a;');
+}
+
+
+.icon-mobile-phone {
+ @include ie7icon('&#xf10b;');
+}
+
+
+.icon-circle-blank {
+ @include ie7icon('&#xf10c;');
+}
+
+
+.icon-quote-left {
+ @include ie7icon('&#xf10d;');
+}
+
+
+.icon-quote-right {
+ @include ie7icon('&#xf10e;');
+}
+
+
+.icon-spinner {
+ @include ie7icon('&#xf110;');
+}
+
+
+.icon-circle {
+ @include ie7icon('&#xf111;');
+}
+
+
+.icon-reply {
+ @include ie7icon('&#xf112;');
+}
+
+.icon-mail-reply {
+ @include ie7icon('&#xf112;');
+}
+
+
+.icon-github-alt {
+ @include ie7icon('&#xf113;');
+}
+
+
+.icon-folder-close-alt {
+ @include ie7icon('&#xf114;');
+}
+
+
+.icon-folder-open-alt {
+ @include ie7icon('&#xf115;');
+}
+
+
+.icon-expand-alt {
+ @include ie7icon('&#xf116;');
+}
+
+
+.icon-collapse-alt {
+ @include ie7icon('&#xf117;');
+}
+
+
+.icon-smile {
+ @include ie7icon('&#xf118;');
+}
+
+
+.icon-frown {
+ @include ie7icon('&#xf119;');
+}
+
+
+.icon-meh {
+ @include ie7icon('&#xf11a;');
+}
+
+
+.icon-gamepad {
+ @include ie7icon('&#xf11b;');
+}
+
+
+.icon-keyboard {
+ @include ie7icon('&#xf11c;');
+}
+
+
+.icon-flag-alt {
+ @include ie7icon('&#xf11d;');
+}
+
+
+.icon-flag-checkered {
+ @include ie7icon('&#xf11e;');
+}
+
+
+.icon-terminal {
+ @include ie7icon('&#xf120;');
+}
+
+
+.icon-code {
+ @include ie7icon('&#xf121;');
+}
+
+
+.icon-reply-all {
+ @include ie7icon('&#xf122;');
+}
+
+
+.icon-mail-reply-all {
+ @include ie7icon('&#xf122;');
+}
+
+
+.icon-star-half-empty {
+ @include ie7icon('&#xf123;');
+}
+
+.icon-star-half-full {
+ @include ie7icon('&#xf123;');
+}
+
+
+.icon-location-arrow {
+ @include ie7icon('&#xf124;');
+}
+
+
+.icon-crop {
+ @include ie7icon('&#xf125;');
+}
+
+
+.icon-code-fork {
+ @include ie7icon('&#xf126;');
+}
+
+
+.icon-unlink {
+ @include ie7icon('&#xf127;');
+}
+
+
+.icon-question {
+ @include ie7icon('&#xf128;');
+}
+
+
+.icon-info {
+ @include ie7icon('&#xf129;');
+}
+
+
+.icon-exclamation {
+ @include ie7icon('&#xf12a;');
+}
+
+
+.icon-superscript {
+ @include ie7icon('&#xf12b;');
+}
+
+
+.icon-subscript {
+ @include ie7icon('&#xf12c;');
+}
+
+
+.icon-eraser {
+ @include ie7icon('&#xf12d;');
+}
+
+
+.icon-puzzle-piece {
+ @include ie7icon('&#xf12e;');
+}
+
+
+.icon-microphone {
+ @include ie7icon('&#xf130;');
+}
+
+
+.icon-microphone-off {
+ @include ie7icon('&#xf131;');
+}
+
+
+.icon-shield {
+ @include ie7icon('&#xf132;');
+}
+
+
+.icon-calendar-empty {
+ @include ie7icon('&#xf133;');
+}
+
+
+.icon-fire-extinguisher {
+ @include ie7icon('&#xf134;');
+}
+
+
+.icon-rocket {
+ @include ie7icon('&#xf135;');
+}
+
+
+.icon-maxcdn {
+ @include ie7icon('&#xf136;');
+}
+
+
+.icon-chevron-sign-left {
+ @include ie7icon('&#xf137;');
+}
+
+
+.icon-chevron-sign-right {
+ @include ie7icon('&#xf138;');
+}
+
+
+.icon-chevron-sign-up {
+ @include ie7icon('&#xf139;');
+}
+
+
+.icon-chevron-sign-down {
+ @include ie7icon('&#xf13a;');
+}
+
+
+.icon-html5 {
+ @include ie7icon('&#xf13b;');
+}
+
+
+.icon-css3 {
+ @include ie7icon('&#xf13c;');
+}
+
+
+.icon-anchor {
+ @include ie7icon('&#xf13d;');
+}
+
+
+.icon-unlock-alt {
+ @include ie7icon('&#xf13e;');
+}
+
+
+.icon-bullseye {
+ @include ie7icon('&#xf140;');
+}
+
+
+.icon-ellipsis-horizontal {
+ @include ie7icon('&#xf141;');
+}
+
+
+.icon-ellipsis-vertical {
+ @include ie7icon('&#xf142;');
+}
+
+
+.icon-rss-sign {
+ @include ie7icon('&#xf143;');
+}
+
+
+.icon-play-sign {
+ @include ie7icon('&#xf144;');
+}
+
+
+.icon-ticket {
+ @include ie7icon('&#xf145;');
+}
+
+
+.icon-minus-sign-alt {
+ @include ie7icon('&#xf146;');
+}
+
+
+.icon-check-minus {
+ @include ie7icon('&#xf147;');
+}
+
+
+.icon-level-up {
+ @include ie7icon('&#xf148;');
+}
+
+
+.icon-level-down {
+ @include ie7icon('&#xf149;');
+}
+
+
+.icon-check-sign {
+ @include ie7icon('&#xf14a;');
+}
+
+
+.icon-edit-sign {
+ @include ie7icon('&#xf14b;');
+}
+
+
+.icon-external-link-sign {
+ @include ie7icon('&#xf14c;');
+}
+
+
+.icon-share-sign {
+ @include ie7icon('&#xf14d;');
+}
+
+
+.icon-compass {
+ @include ie7icon('&#xf14e;');
+}
+
+
+.icon-collapse {
+ @include ie7icon('&#xf150;');
+}
+
+
+.icon-collapse-top {
+ @include ie7icon('&#xf151;');
+}
+
+
+.icon-expand {
+ @include ie7icon('&#xf152;');
+}
+
+
+.icon-eur {
+ @include ie7icon('&#xf153;');
+}
+
+.icon-euro {
+ @include ie7icon('&#xf153;');
+}
+
+
+.icon-gbp {
+ @include ie7icon('&#xf154;');
+}
+
+
+.icon-usd {
+ @include ie7icon('&#xf155;');
+}
+
+.icon-dollar {
+ @include ie7icon('&#xf155;');
+}
+
+
+.icon-inr {
+ @include ie7icon('&#xf156;');
+}
+
+.icon-rupee {
+ @include ie7icon('&#xf156;');
+}
+
+
+.icon-jpy {
+ @include ie7icon('&#xf157;');
+}
+
+.icon-yen {
+ @include ie7icon('&#xf157;');
+}
+
+
+.icon-cny {
+ @include ie7icon('&#xf158;');
+}
+
+.icon-renminbi {
+ @include ie7icon('&#xf158;');
+}
+
+
+.icon-krw {
+ @include ie7icon('&#xf159;');
+}
+
+.icon-won {
+ @include ie7icon('&#xf159;');
+}
+
+
+.icon-btc {
+ @include ie7icon('&#xf15a;');
+}
+
+.icon-bitcoin {
+ @include ie7icon('&#xf15a;');
+}
+
+
+.icon-file {
+ @include ie7icon('&#xf15b;');
+}
+
+
+.icon-file-text {
+ @include ie7icon('&#xf15c;');
+}
+
+
+.icon-sort-by-alphabet {
+ @include ie7icon('&#xf15d;');
+}
+
+
+.icon-sort-by-alphabet-alt {
+ @include ie7icon('&#xf15e;');
+}
+
+
+.icon-sort-by-attributes {
+ @include ie7icon('&#xf160;');
+}
+
+
+.icon-sort-by-attributes-alt {
+ @include ie7icon('&#xf161;');
+}
+
+
+.icon-sort-by-order {
+ @include ie7icon('&#xf162;');
+}
+
+
+.icon-sort-by-order-alt {
+ @include ie7icon('&#xf163;');
+}
+
+
+.icon-thumbs-up {
+ @include ie7icon('&#xf164;');
+}
+
+
+.icon-thumbs-down {
+ @include ie7icon('&#xf165;');
+}
+
+
+.icon-youtube-sign {
+ @include ie7icon('&#xf166;');
+}
+
+
+.icon-youtube {
+ @include ie7icon('&#xf167;');
+}
+
+
+.icon-xing {
+ @include ie7icon('&#xf168;');
+}
+
+
+.icon-xing-sign {
+ @include ie7icon('&#xf169;');
+}
+
+
+.icon-youtube-play {
+ @include ie7icon('&#xf16a;');
+}
+
+
+.icon-dropbox {
+ @include ie7icon('&#xf16b;');
+}
+
+
+.icon-stackexchange {
+ @include ie7icon('&#xf16c;');
+}
+
+
+.icon-instagram {
+ @include ie7icon('&#xf16d;');
+}
+
+
+.icon-flickr {
+ @include ie7icon('&#xf16e;');
+}
+
+
+.icon-adn {
+ @include ie7icon('&#xf170;');
+}
+
+
+.icon-bitbucket {
+ @include ie7icon('&#xf171;');
+}
+
+
+.icon-bitbucket-sign {
+ @include ie7icon('&#xf172;');
+}
+
+
+.icon-tumblr {
+ @include ie7icon('&#xf173;');
+}
+
+
+.icon-tumblr-sign {
+ @include ie7icon('&#xf174;');
+}
+
+
+.icon-long-arrow-down {
+ @include ie7icon('&#xf175;');
+}
+
+
+.icon-long-arrow-up {
+ @include ie7icon('&#xf176;');
+}
+
+
+.icon-long-arrow-left {
+ @include ie7icon('&#xf177;');
+}
+
+
+.icon-long-arrow-right {
+ @include ie7icon('&#xf178;');
+}
+
+
+.icon-apple {
+ @include ie7icon('&#xf179;');
+}
+
+
+.icon-windows {
+ @include ie7icon('&#xf17a;');
+}
+
+
+.icon-android {
+ @include ie7icon('&#xf17b;');
+}
+
+
+.icon-linux {
+ @include ie7icon('&#xf17c;');
+}
+
+
+.icon-dribbble {
+ @include ie7icon('&#xf17d;');
+}
+
+
+.icon-skype {
+ @include ie7icon('&#xf17e;');
+}
+
+
+.icon-foursquare {
+ @include ie7icon('&#xf180;');
+}
+
+
+.icon-trello {
+ @include ie7icon('&#xf181;');
+}
+
+
+.icon-female {
+ @include ie7icon('&#xf182;');
+}
+
+
+.icon-male {
+ @include ie7icon('&#xf183;');
+}
+
+
+.icon-gittip {
+ @include ie7icon('&#xf184;');
+}
+
+
+.icon-sun {
+ @include ie7icon('&#xf185;');
+}
+
+
+.icon-moon {
+ @include ie7icon('&#xf186;');
+}
+
+
+.icon-archive {
+ @include ie7icon('&#xf187;');
+}
+
+
+.icon-bug {
+ @include ie7icon('&#xf188;');
+}
+
+
+.icon-vk {
+ @include ie7icon('&#xf189;');
+}
+
+
+.icon-weibo {
+ @include ie7icon('&#xf18a;');
+}
+
+
+.icon-renren {
+ @include ie7icon('&#xf18b;');
+}
+
+
diff --git a/library/font_awesome/scss/font-awesome.scss b/library/font_awesome/scss/font-awesome.scss
new file mode 100644
index 000000000..e5903d856
--- /dev/null
+++ b/library/font_awesome/scss/font-awesome.scss
@@ -0,0 +1,33 @@
+/*!
+ * Font Awesome 3.2.1
+ * the iconic font designed for Bootstrap
+ * ------------------------------------------------------------------------------
+ * The full suite of pictographic icons, examples, and documentation can be
+ * found at http://fontawesome.io. Stay up to date on Twitter at
+ * http://twitter.com/fontawesome.
+ *
+ * License
+ * ------------------------------------------------------------------------------
+ * - The Font Awesome font is licensed under SIL OFL 1.1 -
+ * http://scripts.sil.org/OFL
+ * - Font Awesome CSS, LESS, and SASS files are licensed under MIT License -
+ * http://opensource.org/licenses/mit-license.html
+ * - Font Awesome documentation licensed under CC BY 3.0 -
+ * http://creativecommons.org/licenses/by/3.0/
+ * - Attribution is no longer required in Font Awesome 3.0, but much appreciated:
+ * "Font Awesome by Dave Gandy - http://fontawesome.io"
+ *
+ * Author - Dave Gandy
+ * ------------------------------------------------------------------------------
+ * Email: dave@fontawesome.io
+ * Twitter: http://twitter.com/davegandy
+ * Work: Lead Product Designer @ Kyruus - http://kyruus.com
+ */
+
+@import "variables";
+@import "mixins";
+@import "path";
+@import "core";
+@import "bootstrap";
+@import "extras";
+@import "icons";
diff --git a/library/font_awesome/src/CNAME b/library/font_awesome/src/CNAME
new file mode 100644
index 000000000..f13145254
--- /dev/null
+++ b/library/font_awesome/src/CNAME
@@ -0,0 +1 @@
+fontawesome.io \ No newline at end of file
diff --git a/library/font_awesome/src/Makefile b/library/font_awesome/src/Makefile
new file mode 100644
index 000000000..7359665af
--- /dev/null
+++ b/library/font_awesome/src/Makefile
@@ -0,0 +1,36 @@
+PATH := ../node_modules/.bin:$(PATH)
+
+FA_ROOT_DIRECTORY = assets/font-awesome
+FA_LESS_DIRECTORY = assets/font-awesome/less
+FA_CSS_DIRECTORY = assets/font-awesome/css
+
+FA_LESS_MODERN = ${FA_LESS_DIRECTORY}/font-awesome.less
+FA_LESS_IE7 = ${FA_LESS_DIRECTORY}/font-awesome-ie7.less
+
+FA_CSS_MODERN = ${FA_CSS_DIRECTORY}/font-awesome.css
+FA_CSS_MODERN_MIN = ${FA_CSS_DIRECTORY}/font-awesome.min.css
+FA_CSS_IE7 = ${FA_CSS_DIRECTORY}/font-awesome-ie7.css
+FA_CSS_IE7_MIN = ${FA_CSS_DIRECTORY}/font-awesome-ie7.min.css
+
+SITE_LESS_DIRECTORY = assets/less
+SITE_CSS_DIRECTORY = assets/css
+
+SITE_LESS = ${SITE_LESS_DIRECTORY}/site.less
+SITE_CSS_MIN = ${SITE_CSS_DIRECTORY}/site.css
+
+build:
+ @echo "Compiling Less files"
+ @mkdir -p ${FA_CSS_DIRECTORY}
+ lessc ${FA_LESS_MODERN} > ${FA_CSS_MODERN}
+ lessc --compress ${FA_LESS_MODERN} > ${FA_CSS_MODERN_MIN}
+ lessc ${FA_LESS_IE7} > ${FA_CSS_IE7}
+ lessc --compress ${FA_LESS_IE7} > ${FA_CSS_IE7_MIN}
+ lessc --compress ${SITE_LESS} > ${SITE_CSS_MIN}
+ cp -r ${FA_ROOT_DIRECTORY}/* ../
+ cd assets && zip -r9 font-awesome.zip font-awesome
+
+
+default: build
+
+
+.PHONY: build
diff --git a/library/font_awesome/src/_includes/ads/carbon-dark-vertical.html b/library/font_awesome/src/_includes/ads/carbon-dark-vertical.html
new file mode 100644
index 000000000..15804e73a
--- /dev/null
+++ b/library/font_awesome/src/_includes/ads/carbon-dark-vertical.html
@@ -0,0 +1 @@
+<div id="carbonads-container"><div class="carbonad"><div id="azcarbon"></div><script type="text/javascript">var z = document.createElement("script"); z.type = "text/javascript"; z.async = true; z.src = "http://engine.carbonads.com/z/32291/azcarbon_2_1_0_VERTDARK"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(z, s);</script></div></div>
diff --git a/library/font_awesome/src/_includes/ads/carbon-light-horizontal.html b/library/font_awesome/src/_includes/ads/carbon-light-horizontal.html
new file mode 100644
index 000000000..8dcfb61b6
--- /dev/null
+++ b/library/font_awesome/src/_includes/ads/carbon-light-horizontal.html
@@ -0,0 +1 @@
+<div id="carbonads-container"><div class="carbonad"><div id="azcarbon"></div><script type="text/javascript">var z = document.createElement("script"); z.type = "text/javascript"; z.async = true; z.src = "http://engine.carbonads.com/z/32291/azcarbon_2_1_0_HORIZ"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(z, s);</script></div></div>
diff --git a/library/font_awesome/src/_includes/ads/carbon-light-vertical.html b/library/font_awesome/src/_includes/ads/carbon-light-vertical.html
new file mode 100644
index 000000000..e6fce26a9
--- /dev/null
+++ b/library/font_awesome/src/_includes/ads/carbon-light-vertical.html
@@ -0,0 +1 @@
+<div id="carbonads-container"><div class="carbonad"><div id="azcarbon"></div><script type="text/javascript">var z = document.createElement("script"); z.type = "text/javascript"; z.async = true; z.src = "http://engine.carbonads.com/z/32291/azcarbon_2_1_0_VERT"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(z, s);</script></div></div>
diff --git a/library/font_awesome/src/_includes/brand-license.html b/library/font_awesome/src/_includes/brand-license.html
new file mode 100644
index 000000000..07dea295a
--- /dev/null
+++ b/library/font_awesome/src/_includes/brand-license.html
@@ -0,0 +1,4 @@
+<ul class="margin-bottom-none">
+ <li>All brand icons are trademarks of their respective owners.</li>
+ <li>The use of these trademarks does not indicate endorsement of the trademark holder by Font Awesome, nor vice versa.</li>
+</ul>
diff --git a/library/font_awesome/src/_includes/cheatsheet.html b/library/font_awesome/src/_includes/cheatsheet.html
new file mode 100644
index 000000000..81e508c45
--- /dev/null
+++ b/library/font_awesome/src/_includes/cheatsheet.html
@@ -0,0 +1,19 @@
+{% capture stripe_ad_content %}
+<p class="lead">
+ Print this page to PDF for the complete set of vectors. Or to use on the desktop, install FontAwesome.otf and copy
+ and paste the icons (not the unicode) directly into your designs.
+</p>
+{% endcapture %}
+{% include stripe-ad.html %}
+
+<h2 class="page-header">Every Font Awesome {{ site.fontawesome.version }} Icon, CSS Class, &amp; Unicode</h2>
+
+<div class="row">
+{% for icon in icons %}
+ <div class="span4">
+ <i class="icon-fixed-width">&#x{{ icon.unicode }}</i>
+ icon-{{ icon.id }}
+ <span class="muted">(&amp;#x{{ icon.unicode }};)</span>
+ </div>
+{% endfor %}
+</div>
diff --git a/library/font_awesome/src/_includes/community.html b/library/font_awesome/src/_includes/community.html
new file mode 100644
index 000000000..f6ba9f060
--- /dev/null
+++ b/library/font_awesome/src/_includes/community.html
@@ -0,0 +1,20 @@
+{% capture stripe_ad_content %}
+<p class="lead">
+ Font Awesome has a vibrant community of folks helping each other out. You can
+ <a href="#getting-support">get support</a>,
+ <a href="#reporting-bugs">report bugs</a>,
+ <a href="#requesting-new-icons">request new icons</a>,
+ <a href="#submitting-pull-requests">submit pull requests</a>, and
+ <a href="#project-milestones">check upcoming milestones</a>.
+</p>
+{% endcapture %}
+{% include stripe-ad.html %}
+
+{% include community/getting-support.html %}
+{% include community/reporting-bugs.html %}
+{% include community/requesting-new-icons.html %}
+{% include community/submitting-pull-requests.html %}
+{% include community/project-milestones.html %}
+
+{% include thanks-to.html %}
+{% include tell-me-thanks.html %}
diff --git a/library/font_awesome/src/_includes/community/getting-support.html b/library/font_awesome/src/_includes/community/getting-support.html
new file mode 100644
index 000000000..8ae311adc
--- /dev/null
+++ b/library/font_awesome/src/_includes/community/getting-support.html
@@ -0,0 +1,22 @@
+<div id="getting-support">
+ <h2 class="page-header">Getting Support</h2>
+ <p>
+ Having trouble getting Font Awesome up and running? Something not working the way you think it should? I hate that
+ I don't have time to answer Font Awesome support emails anymore. So here are some things you might wanna do:
+ </p>
+ <ol>
+ <li>
+ Make sure you've read the latest version of how to <a href="{{ page.relative_path }}get-started/">get started</a>.
+ It's been updated recently to make Font Awesome even easier to use.
+ </li>
+ <li>
+ Check out the <a href="http://stackoverflow.com/questions/tagged/font-awesome">existing questions tagged as
+ Font Awesome</a> over on Stack Overflow. Other folks might have had the same question you've had.
+ </li>
+ <li>
+ Can't find the answer to your question on Stack Overflow?
+ <a href="http://stackoverflow.com/questions/ask?tags=font-awesome">Ask a new question</a>, then
+ <a href="mailto:{{ site.fontawesome.author.email }}">send me an email</a> and I might be able to take a look.
+ </li>
+ </ol>
+</div>
diff --git a/library/font_awesome/src/_includes/community/project-milestones.html b/library/font_awesome/src/_includes/community/project-milestones.html
new file mode 100644
index 000000000..ba2a4e493
--- /dev/null
+++ b/library/font_awesome/src/_includes/community/project-milestones.html
@@ -0,0 +1,7 @@
+<section id="project-milestones">
+ <h2 class="page-header">Project Milestones</h2>
+ <p>
+ Want to keep up with what's planned for Font Awesome? Check out our
+ <a href="{{ site.fontawesome.github.url }}/issues/milestones">milestones</a> on the GitHub project.
+ </p>
+</section>
diff --git a/library/font_awesome/src/_includes/community/reporting-bugs.html b/library/font_awesome/src/_includes/community/reporting-bugs.html
new file mode 100644
index 000000000..3dde63fa5
--- /dev/null
+++ b/library/font_awesome/src/_includes/community/reporting-bugs.html
@@ -0,0 +1,18 @@
+<section id="reporting-bugs">
+ <h2 class="page-header">Reporting Bugs</h2>
+ <p>
+ Found a problem with Font Awesome? Feel free to submit an issue on the GitHub project. But please keep the following in mind:
+ </p>
+ <ol>
+ <li>Please be nice. Font Awesome is a happy place.</li>
+ <li>Please <a href="{{ site.fontawesome.github.url }}/search?type=Issues">search</a> to see if your icon request already exists.</li>
+ <li>
+ Before opening any issue, please read the generic <a href="https://github.com/necolas/issue-guidelines">issue
+ guidelines</a>, by <a href="https://github.com/necolas/">Nicolas Gallagher</a>.
+ </li>
+ <li>
+ After doing everything above, feel free to
+ <a href="{{ site.fontawesome.github.url }}/issues/new">submit an issue</a>.
+ </li>
+ </ol>
+</section>
diff --git a/library/font_awesome/src/_includes/community/requesting-new-icons.html b/library/font_awesome/src/_includes/community/requesting-new-icons.html
new file mode 100644
index 000000000..d710e2bb1
--- /dev/null
+++ b/library/font_awesome/src/_includes/community/requesting-new-icons.html
@@ -0,0 +1,27 @@
+<section id="requesting-new-icons">
+ <h2 class="page-header">Requesting New Icons</h2>
+ <p>
+ New icons mostly start as requests by the
+ <a href="{{ site.fontawesome.github.url }}/issues">Font Awesome community on GitHub</a>. Want to request a new
+ icon? Here are some things to keep in mind:
+ </p>
+ <ol>
+ <li>Please be nice. Font Awesome is a happy place.</li>
+ <li>Please <a href="{{ site.fontawesome.github.url }}/search?type=Issues">search</a> to see if your icon request already exists.</li>
+ <li>
+ Please and thank you if you include the following:
+ <ul>
+ <li>
+ Title your <a href="{{ site.fontawesome.github.url }}/issues/new?title=Icon%20Request:%20icon-name">new issue</a>
+ <code>Icon request: icon-name</code>.
+ </li>
+ <li>Include a few use cases for your requested icon. How do you plan on using it?</li>
+ <li>Attach a single color image or two that represent the idea you're going for.</li>
+ </ul>
+ </li>
+ <li>
+ Concrete objects make good icons, since abstract concepts are, well, abstract. It's harder to make an icon
+ to represent happiness. It's easier to make a smiley face. <i class="icon-smile"></i>
+ </li>
+ </ol>
+</section>
diff --git a/library/font_awesome/src/_includes/community/submitting-pull-requests.html b/library/font_awesome/src/_includes/community/submitting-pull-requests.html
new file mode 100644
index 000000000..de79930e6
--- /dev/null
+++ b/library/font_awesome/src/_includes/community/submitting-pull-requests.html
@@ -0,0 +1,12 @@
+<section id="submitting-pull-requests">
+ <h2 class="page-header">Submitting Pull Requests</h2>
+ Found a way to solve a bug in Font Awesome? Want to contribute new features? Here are a few things to remember:
+ <ol>
+ <li>Please submit all pull requests against *-wip branches.</li>
+ <li>All pull requests submitted against master will be sumarily closed and this guide referenced.</li>
+ <li>
+ After doing everything above, feel free to
+ <a href="{{ site.fontawesome.github.url }}/issues/new">submit a pull request</a>.
+ </li>
+ </ol>
+</section>
diff --git a/library/font_awesome/src/_includes/examples.html b/library/font_awesome/src/_includes/examples.html
new file mode 100644
index 000000000..0598e28be
--- /dev/null
+++ b/library/font_awesome/src/_includes/examples.html
@@ -0,0 +1,24 @@
+{% capture stripe_ad_content %}
+<p class="lead">
+ After you <a href="{{ page.relative_path }}get-started/">get up and running</a>, you can place Font Awesome icons just about
+ anywhere with the <code>&lt;i&gt;</code> tag.
+ Many examples appreciatively re-used from the <a href="{{ site.bootstrap.url }}">Bootstrap documentation</a>.
+</p>
+{% endcapture %}
+{% include stripe-ad.html %}
+
+{% include examples/new.html %}
+
+{% include examples/inline-icons.html %}
+{% include examples/larger-icons.html %}
+{% include examples/bordered-pulled.html %}
+{% include examples/buttons.html %}
+{% include examples/button-groups.html %}
+{% include examples/button-dropdowns.html %}
+{% include examples/bulleted-lists.html %}
+{% include examples/navigation.html %}
+{% include examples/form-inputs.html %}
+{% include examples/animated-spinner.html %}
+{% include examples/rotated-flipped.html %}
+{% include examples/stacked.html %}
+{% include examples/custom.html %}
diff --git a/library/font_awesome/src/_includes/examples/animated-spinner.html b/library/font_awesome/src/_includes/examples/animated-spinner.html
new file mode 100644
index 000000000..eee013a11
--- /dev/null
+++ b/library/font_awesome/src/_includes/examples/animated-spinner.html
@@ -0,0 +1,20 @@
+<section id="animated-spinner">
+ <h2 class="page-header">Animated Spinner</h2>
+ <div class="row">
+ <div class="span3">
+ Use the <code>icon-spin</code> class to get any icon to rotate. Works well with <code>icon-spinner</code> and
+ <code>icon-refresh</code>.
+ </div>
+ <div class="span9">
+ <div class="well well-large well-transparent lead">
+ <i class="icon-spinner icon-spin icon-large"></i> Spinner icon when loading content...
+ </div>
+{% highlight html %}
+<i class="icon-spinner icon-spin icon-large"></i> Spinner icon when loading content...
+{% endhighlight %}
+ <p class="alert alert-info">
+ <i class="icon-info-sign"></i> CSS3 animations aren't supported in IE7 - IE9.
+ </p>
+ </div>
+ </div>
+</section>
diff --git a/library/font_awesome/src/_includes/examples/bordered-pulled.html b/library/font_awesome/src/_includes/examples/bordered-pulled.html
new file mode 100644
index 000000000..b5aa2bf17
--- /dev/null
+++ b/library/font_awesome/src/_includes/examples/bordered-pulled.html
@@ -0,0 +1,33 @@
+<section id="bordered-pulled">
+ <h2 class="page-header">Bordered & Pulled Icons</h2>
+ <div class="row">
+ <div class="span3">
+ <p>
+ Use <code>icon-border</code> and <code>pull-right</code> or <code>pull-left</code> for easy pull quotes or
+ article graphics.
+ </p>
+ </div>
+ <div class="span9">
+ <div class="well well-large well-transparent">
+ <i class="icon-quote-left icon-4x pull-left icon-muted"></i>
+ Use a few of the new styles together, and you've got easy pull quotes or a great introductory article image.
+ Or spinning icons for loading and refreshing content. Or fun big icons in multi-line buttons. You can combine all
+ of them in any combination to get lots of new possibilities.
+ </div>
+{% highlight html %}
+<i class="icon-quote-left icon-4x pull-left icon-muted"></i>
+Use a few of the new styles together ... lots of new possibilities.
+{% endhighlight %}
+ <div class="well well-large well-transparent clearfix">
+ <i class="icon-flag icon-4x pull-left icon-border"></i>
+ Use a few of the new styles together, and you've got easy pull quotes or a great introductory article image.
+ Or spinning icons for loading and refreshing content. Or fun big icons in multi-line buttons. You can combine all
+ of them in any combination to get lots of new possibilities.
+ </div>
+{% highlight html %}
+<i class="icon-flag icon-4x pull-left icon-border"></i>
+Use a few of the new styles together ... lots of new possibilities.
+{% endhighlight %}
+ </div>
+ </div>
+</section>
diff --git a/library/font_awesome/src/_includes/examples/bulleted-lists.html b/library/font_awesome/src/_includes/examples/bulleted-lists.html
new file mode 100644
index 000000000..73db34e47
--- /dev/null
+++ b/library/font_awesome/src/_includes/examples/bulleted-lists.html
@@ -0,0 +1,31 @@
+<section id="bulleted-lists">
+ <h2 class="page-header">Bulleted Lists</h2>
+ <div class="row">
+ <div class="span12">
+ </div>
+ <div class="span3">
+ <ul class="icons-ul">
+ <li><i class="icon-li icon-ok"></i>Bulleted lists (like this one)</li>
+ <li><i class="icon-li icon-ok"></i>Buttons</li>
+ <li><i class="icon-li icon-ok"></i>Button groups</li>
+ <li><i class="icon-li icon-ok"></i>Navigation</li>
+ <li><i class="icon-li icon-ok"></i>Prepended form inputs</li>
+ <li><i class="icon-li icon-ok"></i>&hellip;and many more with custom CSS</li>
+ </ul>
+ </div>
+ <div class="span9">
+ <p>Easily replace individual bullets.</p>
+{% highlight html %}
+<ul class="icons-ul">
+ <li><i class="icon-li icon-ok"></i>Bulleted lists (like this one)</li>
+ <li><i class="icon-li icon-ok"></i>Buttons</li>
+ <li><i class="icon-li icon-ok"></i>Button groups</li>
+ <li><i class="icon-li icon-ok"></i>Navigation</li>
+ <li><i class="icon-li icon-ok"></i>Prepended form inputs</li>
+ <li><i class="icon-li icon-ok"></i>&hellip;and many more with custom CSS</li>
+</ul>
+{% endhighlight %}
+ <div class="alert alert-info"><i class="icon-info-sign"></i> Make sure to NOT include any whitespace after the icon declaration.</div>
+ </div>
+ </div>
+</section>
diff --git a/library/font_awesome/src/_includes/examples/button-dropdowns.html b/library/font_awesome/src/_includes/examples/button-dropdowns.html
new file mode 100644
index 000000000..201eb1cd4
--- /dev/null
+++ b/library/font_awesome/src/_includes/examples/button-dropdowns.html
@@ -0,0 +1,36 @@
+<section id="button-dropdowns">
+ <h2 class="page-header">Button Dropdowns</h2>
+ <div class="row">
+ <div class="span3">
+ <div class="btn-group open">
+ <a class="btn btn-primary" href="#"><i class="icon-user"></i> User</a>
+ <a class="btn btn-primary dropdown-toggle" data-toggle="dropdown" href="#">
+ <span class="icon-caret-down"></span></a>
+ <ul class="dropdown-menu">
+ <li><a href="#"><i class="icon-fixed-width icon-pencil"></i> Edit</a></li>
+ <li><a href="#"><i class="icon-fixed-width icon-trash"></i> Delete</a></li>
+ <li><a href="#"><i class="icon-fixed-width icon-ban-circle"></i> Ban</a></li>
+ <li class="divider"></li>
+ <li><a href="#"><i class="i"></i> Make admin</a></li>
+ </ul>
+ </div>
+ </div>
+ <div class="span9">
+{% highlight html %}
+<div class="btn-group open">
+ <a class="btn btn-primary" href="#"><i class="icon-user"></i> User</a>
+ <a class="btn btn-primary dropdown-toggle" data-toggle="dropdown" href="#">
+ <span class="icon-caret-down"></span></a>
+ <ul class="dropdown-menu">
+ <li><a href="#"><i class="icon-fixed-width icon-pencil"></i> Edit</a></li>
+ <li><a href="#"><i class="icon-fixed-width icon-trash"></i> Delete</a></li>
+ <li><a href="#"><i class="icon-fixed-width icon-ban-circle"></i> Ban</a></li>
+ <li class="divider"></li>
+ <li><a href="#"><i class="i"></i> Make admin</a></li>
+ </ul>
+</div>
+{% endhighlight %}
+ <div class="alert alert-info"><i class="icon-info-sign"></i> Don't forget to add the appropriate JavaScript to enable button dropdowns.</div>
+ </div>
+ </div>
+</section>
diff --git a/library/font_awesome/src/_includes/examples/button-groups.html b/library/font_awesome/src/_includes/examples/button-groups.html
new file mode 100644
index 000000000..ce4892309
--- /dev/null
+++ b/library/font_awesome/src/_includes/examples/button-groups.html
@@ -0,0 +1,25 @@
+<section id="button-groups">
+ <h2 class="page-header">Button Groups</h2>
+ <div class="row">
+ <div class="span3">
+ <p>
+ <div class="btn-group">
+ <a class="btn" href="#"><i class="icon-align-left"></i></a>
+ <a class="btn" href="#"><i class="icon-align-center"></i></a>
+ <a class="btn" href="#"><i class="icon-align-right"></i></a>
+ <a class="btn" href="#"><i class="icon-align-justify"></i></a>
+ </div>
+ </p>
+ </div>
+ <div class="span9">
+{% highlight html %}
+<div class="btn-group">
+ <a class="btn" href="#"><i class="icon-align-left"></i></a>
+ <a class="btn" href="#"><i class="icon-align-center"></i></a>
+ <a class="btn" href="#"><i class="icon-align-right"></i></a>
+ <a class="btn" href="#"><i class="icon-align-justify"></i></a>
+</div>
+{% endhighlight %}
+ </div>
+ </div>
+</section>
diff --git a/library/font_awesome/src/_includes/examples/buttons.html b/library/font_awesome/src/_includes/examples/buttons.html
new file mode 100644
index 000000000..b8d147c07
--- /dev/null
+++ b/library/font_awesome/src/_includes/examples/buttons.html
@@ -0,0 +1,57 @@
+<section id="buttons">
+ <h2 class="page-header">Buttons</h2>
+ <div class="row">
+ <div class="span3">
+ <p>
+ <a class="btn" href="#">
+ <i class="icon-repeat"></i> Reload</a>
+ <a class="btn btn-success" href="#">
+ <i class="icon-shopping-cart icon-large"></i> Checkout</a>
+ </p>
+ <p>
+ <a class="btn btn-large btn-primary" href="#">
+ <i class="icon-comment"></i> Comment</a>
+ <a class="btn btn-small btn-info" href="#">
+ <i class="icon-info-sign"></i> Info</a>
+ </p>
+ <p>
+ <a class="btn btn-danger" href="#">
+ <i class="icon-trash icon-large"></i> Delete</a>
+ <a class="btn btn-small" href="#">
+ <i class="icon-cog"></i> Settings</a>
+ </p>
+ <p>
+ <a class="btn btn-large btn-danger" href="#">
+ <i class="icon-flag icon-2x pull-left"></i> Font Awesome<br>Version {{ site.fontawesome.version }}</a>
+ </p>
+ <p>
+ <a class="btn btn-primary" href="#">
+ <i class="icon-refresh icon-spin"></i> Synchronizing Content...</a>
+ </p>
+ </div>
+ <div class="span9">
+ <p>
+ Font Awesome icons work great in buttons. You can even combine them with larger icon styles,
+ <code>pull-right</code> and <code>pull-left</code>, and <code>icon-spin</code>.
+ </p>
+{% highlight html %}
+<a class="btn" href="#">
+ <i class="icon-repeat"></i> Reload</a>
+<a class="btn btn-success" href="#">
+ <i class="icon-shopping-cart icon-large"></i> Checkout</a>
+<a class="btn btn-large btn-primary" href="#">
+ <i class="icon-comment"></i> Comment</a>
+<a class="btn btn-small btn-info" href="#">
+ <i class="icon-info-sign"></i> Info</a>
+<a class="btn btn-danger" href="#">
+ <i class="icon-trash icon-large"></i> Delete</a>
+<a class="btn btn-small" href="#">
+ <i class="icon-cog"></i> Settings</a>
+<a class="btn btn-large btn-danger" href="#">
+ <i class="icon-flag icon-2x pull-left"></i> Font Awesome<br>Version {{ site.fontawesome.version }}</a>
+<a class="btn btn-primary" href="#">
+ <i class="icon-refresh icon-spin"></i> Synchronizing Content...</a>
+{% endhighlight %}
+ </div>
+ </div>
+</section>
diff --git a/library/font_awesome/src/_includes/examples/custom.html b/library/font_awesome/src/_includes/examples/custom.html
new file mode 100644
index 000000000..dfad1900c
--- /dev/null
+++ b/library/font_awesome/src/_includes/examples/custom.html
@@ -0,0 +1,16 @@
+<section id="custom">
+ <h2 class="page-header">Custom CSS</h2>
+ <div class="row">
+ <div class="span3">
+ <p>Anything you can do with CSS font styles, you can do with Font Awesome.</p>
+ </div>
+ <div class="span9">
+ <p>Star Ratings (inspired by <a href="http://css-tricks.com/star-ratings/" target="_blank">CSS Tricks</a>)</p>
+ <div class="well">
+ <span class="rating">
+ <span class="star"></span><span class="star"></span><span class="star"></span><span class="star"></span><span class="star"></span>
+ </span>
+ </div>
+ </div>
+ </div>
+</section>
diff --git a/library/font_awesome/src/_includes/examples/form-inputs.html b/library/font_awesome/src/_includes/examples/form-inputs.html
new file mode 100644
index 000000000..dcb39a8f2
--- /dev/null
+++ b/library/font_awesome/src/_includes/examples/form-inputs.html
@@ -0,0 +1,31 @@
+<section id="form-inputs">
+ <h2 class="page-header">Prepended & Appended Form Inputs</h2>
+ <div class="row">
+ <div class="span3">
+ <form>
+ <div class="input-prepend">
+ <span class="add-on"><i class="icon-envelope"></i></span>
+ <input class="span2" type="text" placeholder="Email address">
+ </div>
+ <div class="input-prepend">
+ <span class="add-on"><i class="icon-key"></i></span>
+ <input class="span2" type="password" placeholder="Password">
+ </div>
+ </form>
+ </div>
+ <div class="span9">
+{% highlight html %}
+<form>
+ <div class="input-prepend">
+ <span class="add-on"><i class="icon-envelope"></i></span>
+ <input class="span2" type="text" placeholder="Email address">
+ </div>
+ <div class="input-prepend">
+ <span class="add-on"><i class="icon-key"></i></span>
+ <input class="span2" type="password" placeholder="Password">
+ </div>
+</form>
+{% endhighlight %}
+ </div>
+ </div>
+</section>
diff --git a/library/font_awesome/src/_includes/examples/inline-icons.html b/library/font_awesome/src/_includes/examples/inline-icons.html
new file mode 100644
index 000000000..3965e7c2a
--- /dev/null
+++ b/library/font_awesome/src/_includes/examples/inline-icons.html
@@ -0,0 +1,19 @@
+<section id="inline-icons">
+ <h2 class="page-header">Inline Icons</h2>
+ <div class="row">
+ <div class="span3">
+ <p>Place Font Awesome icons just about anywhere with the <code>&lt;i&gt;</code> tag.</p>
+ </div>
+ <div class="span9">
+ <div class="well well-transparent">
+ <div style="font-size: 24px; line-height: 1.5em;">
+ <i class="icon-camera-retro"></i> icon-camera-retro
+ </div>
+ </div>
+{% highlight html %}
+<i class="icon-camera-retro"></i> icon-camera-retro
+{% endhighlight %}
+ <div class="alert alert-info"><i class="icon-info-sign"></i> Icon classes are echoed via CSS :before.</div>
+ </div>
+ </div>
+</section>
diff --git a/library/font_awesome/src/_includes/examples/larger-icons.html b/library/font_awesome/src/_includes/examples/larger-icons.html
new file mode 100644
index 000000000..95f1ee13b
--- /dev/null
+++ b/library/font_awesome/src/_includes/examples/larger-icons.html
@@ -0,0 +1,35 @@
+<section id="larger-icons">
+ <h2 class="page-header">Larger Icons</h2>
+ <div class="row">
+ <div class="span3">
+ <p>
+ To increase the size of icons relative to its container, use <code>icon-large</code>, <code>icon-2x</code>,
+ <code>icon-3x</code>, or <code>icon-4x</code>.
+ </p>
+ </div>
+ <div class="span9">
+ <p>
+ Increase the icon size by using the <code>icon-large</code> (33% increase), <code>icon-2x</code>,
+ <code>icon-3x</code>, or <code>icon-4x</code> classes.
+ </p>
+ <div class="well well-transparent">
+ <div style="font-size: 24px; line-height: 1.5em;">
+ <p><i class="icon-camera-retro icon-large"></i> icon-camera-retro</p>
+ <p><i class="icon-camera-retro icon-2x"></i> icon-camera-retro</p>
+ <p><i class="icon-camera-retro icon-3x"></i> icon-camera-retro</p>
+ <p><i class="icon-camera-retro icon-4x"></i> icon-camera-retro</p>
+ </div>
+ </div>
+{% highlight html %}
+<p><i class="icon-camera-retro icon-large"></i> icon-camera-retro</p>
+<p><i class="icon-camera-retro icon-2x"></i> icon-camera-retro</p>
+<p><i class="icon-camera-retro icon-3x"></i> icon-camera-retro</p>
+<p><i class="icon-camera-retro icon-4x"></i> icon-camera-retro</p>
+{% endhighlight %}
+ <div class="alert alert-info">
+ <i class="icon-info-sign"></i> If your icons are getting chopped off on top and bottom, make sure you have
+ sufficient line-height.
+ </div>
+ </div>
+ </div>
+</section>
diff --git a/library/font_awesome/src/_includes/examples/navigation.html b/library/font_awesome/src/_includes/examples/navigation.html
new file mode 100644
index 000000000..850e64442
--- /dev/null
+++ b/library/font_awesome/src/_includes/examples/navigation.html
@@ -0,0 +1,26 @@
+<section id="navigation">
+ <h2 class="page-header">Navigation</h2>
+ <div class="row">
+ <div class="span3">
+ <div class="well" style="padding: 8px 0;">
+ <ul class="nav nav-list">
+ <li class="active"><a href="#"><i class="icon-fixed-width icon-home"></i> Home</a></li>
+ <li><a href="#"><i class="icon-fixed-width icon-book"></i> Library</a></li>
+ <li><a href="#"><i class="icon-fixed-width icon-pencil"></i> Applications</a></li>
+ <li><a href="#"><i class="icon-fixed-width icon-cogs"></i> Settings</a></li>
+ </ul>
+ </div>
+ </div>
+ <div class="span9">
+ <p>Use Font Awesome icons in navigation to provide helpful visual cues.</p>
+{% highlight html %}
+<ul class="nav nav-list">
+ <li class="active"><a href="#"><i class="icon-fixed-width icon-home"></i> Home</a></li>
+ <li><a href="#"><i class="icon-fixed-width icon-book"></i> Library</a></li>
+ <li><a href="#"><i class="icon-fixed-width icon-pencil"></i> Applications</a></li>
+ <li><a href="#"><i class="icon-fixed-width icon-cogs"></i> Settings</a></li>
+</ul>
+{% endhighlight %}
+ </div>
+ </div>
+</section>
diff --git a/library/font_awesome/src/_includes/examples/new.html b/library/font_awesome/src/_includes/examples/new.html
new file mode 100644
index 000000000..8393f7d36
--- /dev/null
+++ b/library/font_awesome/src/_includes/examples/new.html
@@ -0,0 +1,47 @@
+<{% if page.navbar_active == "examples" %}div{% else %}section{% endif %} id="new-styles">
+ <h2 class="page-header">New Styles in {{ site.fontawesome.minor_version }}</h2>
+ <div class="row">
+ <div class="span4">
+ <h4><a href="#rotated-flipped">Rotated and Flipped Icons</a></h4>
+ <div class="well well-transparent">
+ <i class="icon-shield"></i>&nbsp; normal<br>
+ <i class="icon-shield icon-rotate-90"></i>&nbsp; icon-rotate-90<br>
+ <i class="icon-shield icon-rotate-180"></i>&nbsp; icon-rotate-180<br>
+ <i class="icon-shield icon-rotate-270"></i>&nbsp; icon-rotate-270<br>
+ <i class="icon-shield icon-flip-horizontal"></i>&nbsp; icon-flip-horizontal<br>
+ <i class="icon-shield icon-flip-vertical"></i>&nbsp; icon-flip-vertical
+ </div>
+ </div>
+ <div class="span4">
+ <h4><a href="#stacked">Stacked Icons</a></h4>
+ <div class="well well-transparent stacked">
+ <span class="icon-stack">
+ <i class="icon-check-empty icon-stack-base"></i>
+ <i class="icon-twitter"></i>
+ </span>
+ icon-twitter on icon-check-empty<br>
+ <span class="icon-stack">
+ <i class="icon-circle icon-stack-base"></i>
+ <i class="icon-flag icon-light"></i>
+ </span>
+ icon-flag on icon-circle<br>
+ <span class="icon-stack">
+ <i class="icon-sign-blank icon-stack-base"></i>
+ <i class="icon-terminal icon-light"></i>
+ </span>
+ icon-terminal on icon-sign-blank
+ </div>
+ </div>
+ <div class="span4">
+ <h4><a href="#bulleted-lists">Better Bulleted Lists</a></h4>
+ <div class="well well-transparent">
+ <ul class="icons-ul">
+ <li><i class="icon-li icon-chevron-sign-right"></i>New bulleted lists</li>
+ <li><i class="icon-li icon-bullseye"></i>Fix some old bugs</li>
+ <li><i class="icon-li icon-play-sign"></i>And deal with arbitrary</li>
+ <li><i class="icon-li icon-ok-sign"></i>Font sizes better</li>
+ </ul>
+ </div>
+ </div>
+ </div>
+</{% if page.navbar_active == "examples" %}div{% else %}section{% endif %}>
diff --git a/library/font_awesome/src/_includes/examples/rotated-flipped.html b/library/font_awesome/src/_includes/examples/rotated-flipped.html
new file mode 100644
index 000000000..cf061cd59
--- /dev/null
+++ b/library/font_awesome/src/_includes/examples/rotated-flipped.html
@@ -0,0 +1,29 @@
+<section id="rotated-flipped">
+ <h2 class="page-header">Rotated &amp; Flipped</h2>
+ <div class="row">
+ <div class="span3">
+ A set of classes that can be used to arbitrarily rotate and flip icons.
+ </div>
+ <div class="span9">
+ <div class="well well-large well-transparent lead">
+ <i class="icon-shield"></i>&nbsp; normal<br>
+ <i class="icon-shield icon-rotate-90"></i>&nbsp; icon-rotate-90<br>
+ <i class="icon-shield icon-rotate-180"></i>&nbsp; icon-rotate-180<br>
+ <i class="icon-shield icon-rotate-270"></i>&nbsp; icon-rotate-270<br>
+ <i class="icon-shield icon-flip-horizontal"></i>&nbsp; icon-flip-horizontal<br>
+ <i class="icon-shield icon-flip-vertical"></i>&nbsp; icon-flip-vertical
+ </div>
+{% highlight html %}
+<i class="icon-shield"></i>&nbsp; normal<br>
+<i class="icon-shield icon-rotate-90"></i>&nbsp; icon-rotate-90<br>
+<i class="icon-shield icon-rotate-180"></i>&nbsp; icon-rotate-180<br>
+<i class="icon-shield icon-rotate-270"></i>&nbsp; icon-rotate-270<br>
+<i class="icon-shield icon-flip-horizontal"></i>&nbsp; icon-flip-horizontal<br>
+<i class="icon-shield icon-flip-vertical"></i>&nbsp; icon-flip-vertical
+{% endhighlight %}
+ <p class="alert alert-info">
+ <i class="icon-info-sign"></i> Rotating and flipping icons aren't yet supported in IE7.
+ </p>
+ </div>
+ </div>
+</section>
diff --git a/library/font_awesome/src/_includes/examples/stacked.html b/library/font_awesome/src/_includes/examples/stacked.html
new file mode 100644
index 000000000..3e7240c12
--- /dev/null
+++ b/library/font_awesome/src/_includes/examples/stacked.html
@@ -0,0 +1,55 @@
+<section id="stacked">
+ <h2 class="page-header">Stacked Icons</h2>
+ <div class="row">
+ <div class="span3">
+ A method for easily stacking multiple icons. Use the <code>icon-stack</code> class on the parent and
+ <code>icon-stack-base</code> for the bottom icon.
+ </div>
+ <div class="span9">
+ <div class="well well-large well-transparent lead">
+ <span class="icon-stack">
+ <i class="icon-check-empty icon-stack-base"></i>
+ <i class="icon-twitter"></i>
+ </span>
+ icon-twitter on icon-check-empty<br>
+ <span class="icon-stack">
+ <i class="icon-circle icon-stack-base"></i>
+ <i class="icon-flag icon-light"></i>
+ </span>
+ icon-flag on icon-circle<br>
+ <span class="icon-stack">
+ <i class="icon-sign-blank icon-stack-base"></i>
+ <i class="icon-terminal icon-light"></i>
+ </span>
+ icon-terminal on icon-sign-blank<br>
+ <span class="icon-stack">
+ <i class="icon-camera"></i>
+ <i class="icon-ban-circle icon-stack-base text-error"></i>
+ </span>
+ icon-camera on icon-ban-circle
+ </div>
+{% highlight html %}
+<span class="icon-stack">
+ <i class="icon-check-empty icon-stack-base"></i>
+ <i class="icon-twitter"></i>
+</span>
+icon-twitter on icon-check-empty<br>
+<span class="icon-stack">
+ <i class="icon-circle icon-stack-base"></i>
+ <i class="icon-flag icon-light"></i>
+</span>
+icon-flag on icon-circle<br>
+<span class="icon-stack">
+ <i class="icon-sign-blank icon-stack-base"></i>
+ <i class="icon-terminal icon-light"></i>
+</span>
+icon-terminal on icon-sign-blank<br>
+<span class="icon-stack">
+ <i class="icon-camera"></i>
+ <i class="icon-ban-circle icon-stack-base text-error"></i>
+</span>
+icon-camera on icon-ban-circle
+{% endhighlight %}
+ </div>
+ </div>
+</section>
diff --git a/library/font_awesome/src/_includes/footer.html b/library/font_awesome/src/_includes/footer.html
new file mode 100644
index 000000000..186b1524d
--- /dev/null
+++ b/library/font_awesome/src/_includes/footer.html
@@ -0,0 +1,23 @@
+<footer class="footer hidden-print">
+ <div class="container text-center">
+ <div>
+ <i class="icon-flag"></i> Font Awesome {{ site.fontawesome.version }}
+ <span class="hidden-phone">&middot;</span><br class="visible-phone">
+ Created and Maintained by <a href="http://twitter.com/{{ site.fontawesome.author.twitter }}">Dave Gandy</a>
+ </div>
+ <div>
+ Font Awesome licensed under <a href="{{ site.fontawesome.license.font.url }}">{{ site.fontawesome.license.font.version }}</a>
+ <span class="hidden-phone">&middot;</span><br class="visible-phone">
+ Code licensed under <a href="{{ site.fontawesome.license.code.url }}">{{ site.fontawesome.license.code.version }}</a>
+ <span class="hidden-phone hidden-tablet">&middot;</span><br class="visible-phone visible-tablet">
+ Documentation licensed under <a href="{{ site.fontawesome.license.documentation.url }}">{{ site.fontawesome.license.documentation.version }}</a>
+ </div>
+ <div>
+ Thanks to <a href="http://maxcdn.com"><i class="icon-maxcdn"></i> MaxCDN</a> for providing the excellent <a href="http://www.bootstrapcdn.com/#tab_fontawesome">BootstrapCDN for Font Awesome</a>
+ </div>
+ <div class="project">
+ <a href="{{ site.fontawesome.github.url }}">GitHub Project</a> &middot;
+ <a href="{{ site.fontawesome.github.url }}/issues">Issues</a>
+ </div>
+ </div>
+</footer>
diff --git a/library/font_awesome/src/_includes/get-started.html b/library/font_awesome/src/_includes/get-started.html
new file mode 100644
index 000000000..34b970fd4
--- /dev/null
+++ b/library/font_awesome/src/_includes/get-started.html
@@ -0,0 +1,105 @@
+{% capture stripe_ad_content %}
+<p class="lead">
+ Setting up Font Awesome can be as simple as adding two lines of code to your website, or you can be a pro and
+ customize the LESS yourself! Font Awesome even plays nicely with
+ <a href="{{ site.bootstrap.url }}">Bootstrap</a>!
+</p>
+{% endcapture %}
+{% include stripe-ad.html %}
+
+<div id="bootstrapcdn">
+ <h2 class="page-header">EASIEST: <a href="http://www.bootstrapcdn.com/#tab_fontawesome">BootstrapCDN</a></h2>
+ <p>Add Font Awesome + Bootstrap into your website with two lines of code. You don't even have to download or install anything!</p>
+ <ol>
+ <li>
+ Paste the following code into the <code>&lt;head&gt;</code> section of your site's HTML.
+{% highlight html %}
+<link href="//netdna.bootstrapcdn.com/twitter-bootstrap/{{ site.bootstrap.version }}/css/bootstrap-combined.no-icons.min.css" rel="stylesheet">
+<link href="//netdna.bootstrapcdn.com/font-awesome/{{ site.fontawesome.version }}/css/font-awesome.css" rel="stylesheet">
+{% endhighlight %}
+ <div class="alert alert-info margin-top">
+ <i class="icon-info-sign"></i> Want to use Font Awesome by itself without Bootstrap? Just don't include the first line.
+ </div>
+ </li>
+ <li>
+ Pat yourself on the back for your scalable-vector-icons-on-the-website
+ <a href="http://37signals.com/svn/posts/312-lingo-judo">judo solution</a> in two lines of code.
+ </li>
+ <li>
+ Check out the <a href="{{ page.relative_path }}examples/">examples</a> to start using Font Awesome!
+ </li>
+ </ol>
+</div>
+
+<section id="default-css">
+ <h2 class="page-header">EASY: Default CSS</h2>
+ <p>Use this method to get the default Font Awesome CSS with the default Bootstrap CSS.</p>
+ <ol>
+ <li>Copy the <code>font-awesome</code> directory into your project.</li>
+ <li>
+ In the <code>&lt;head&gt;</code> of your html, reference the location to your font-awesome.min.css.
+{% highlight html %}
+<link rel="stylesheet" href="path/to/bootstrap/css/bootstrap.min.css">
+<link rel="stylesheet" href="path/to/font-awesome/css/font-awesome.min.css">
+{% endhighlight %}
+ </li>
+ <li>Check out the <a href="{{ page.relative_path }}examples/">examples</a> to start using Font Awesome!</li>
+ </ol>
+</section>
+
+<section id="custom-less">
+ <h2 class="page-header">PRO: Custom LESS</h2>
+ <p>Use this method to customize Font Awesome and Bootstrap {{ site.bootstrap.version }} using LESS.</p>
+ <ol>
+ <li>Copy the <code>font-awesome</code> directory into your project.</li>
+ <li>Open your project's bootstrap/bootstrap.less and replace
+{% highlight html %}
+@import "sprites.less";
+{% endhighlight %}
+ with
+{% highlight html %}
+@import "path/to/font-awesome/less/font-awesome.less";
+{% endhighlight %}
+ </li>
+ <li>
+ Open your project's font-awesome/variables.less and edit the <code>@FontAwesomePath</code> variable to point to your font directory.
+{% highlight html %}
+@FontAwesomePath: "../font";
+{% endhighlight %}
+ <p class="alert alert-info"><i class="icon-info-sign"></i> The font path is relative from your compiled CSS directory.</p>
+ </li>
+ <li>Re-compile your LESS if using a static compiler. Otherwise, you should be good to go.</li>
+ <li>Check out the <a href="{{ page.relative_path }}examples/">examples</a> to start using Font Awesome!</li>
+ </ol>
+</section>
+
+<section id="not-using-bootstrap">
+ <h2 class="page-header">Not using Bootstrap?</h2>
+ <p>Font Awesome works just as well without Bootstrap.</p>
+ <ol>
+ <li>Copy the <code>font-awesome</code> directory into your project.</li>
+ <li>Follow the above directions and skip the Bootstrap parts.</li>
+ <li>Open your project's font-awesome.less or font-awesome.min.css and edit the font location to point it to your font directory (see above examples).</li>
+ <li>Check out the <a href="{{ page.relative_path }}examples/">examples</a> to start using Font Awesome!</li>
+ </ol>
+</section>
+
+<section class="need-ie7">
+ <h2 class="page-header">Need IE7 Support?</h2>
+ <p>Font Awesome supports IE7. If you need it, you have my condolences.</p>
+ <ol>
+ <li>Get Font Awesome working properly in a modern browser.</li>
+ <li>Copy font-awesome-ie7.min.css into your project.</li>
+ <li>
+ In the <code>&lt;head&gt;</code> of your html, reference the location to your font-awesome-ie7.min.css.
+{% highlight html %}
+<link rel="stylesheet" href="path/to/bootstrap/css/bootstrap.min.css">
+<link rel="stylesheet" href="path/to/font-awesome/css/font-awesome.min.css">
+<!--[if IE 7]>
+ <link rel="stylesheet" href="path/to/font-awesome/css/font-awesome-ie7.min.css">
+<![endif]-->
+{% endhighlight %}
+ </li>
+ <li>Go complain to whoever decided your project needs IE7 support.</li>
+ </ol>
+</section>
diff --git a/library/font_awesome/src/_includes/icons.html b/library/font_awesome/src/_includes/icons.html
new file mode 100644
index 000000000..aeb802805
--- /dev/null
+++ b/library/font_awesome/src/_includes/icons.html
@@ -0,0 +1,18 @@
+{% capture stripe_ad_content %}
+<p class="lead">
+ You asked, Font Awesome delivers with {{ icons | version:site.fontawesome.minor_version | size }} shiny new icons in version {{ site.fontawesome.minor_version }}.
+ Want to request new icons? <a href="{{ page.relative_path }}community/#requesting-new-icons">Here's how</a>.
+ <!--The ever-expanding list of Font Awesome {{ site.fontawesome.version }} icons.-->
+ Need vectors or want to use on the desktop? Check the <a href="{{ page.relative_path }}cheatsheet/">cheatsheet</a>.
+</p>
+{% endcapture %}
+{% include stripe-ad.html %}
+
+{% include icons/new.html %}
+{% include icons/web-application.html %}
+{% include icons/currency.html %}
+{% include icons/text-editor.html %}
+{% include icons/directional.html %}
+{% include icons/video-player.html %}
+{% include icons/brand.html %}
+{% include icons/medical.html %}
diff --git a/library/font_awesome/src/_includes/icons/brand.html b/library/font_awesome/src/_includes/icons/brand.html
new file mode 100644
index 000000000..feb6032e8
--- /dev/null
+++ b/library/font_awesome/src/_includes/icons/brand.html
@@ -0,0 +1,15 @@
+<section id="brand">
+ <h2 class="page-header">Brand Icons</h2>
+
+ <div class="alert alert-info">
+ {% include brand-license.html %}
+ </div>
+
+ <div class="row the-icons">
+ {% assign icons_brand = icons | expand_aliases | category:"Brand Icons" | sort_by:'class' %}
+
+ {% for icon in icons_brand %}
+ <div class="span3"><a href="{{ page.relative_path }}icon/{{ icon.id }}"><i class="icon-{{ icon.class }}"></i> icon-{{ icon.class }}{% if icon.alias_of %} <span class="muted">(alias)</span>{% endif %}</a></div>
+ {% endfor %}
+ </div>
+</section>
diff --git a/library/font_awesome/src/_includes/icons/currency.html b/library/font_awesome/src/_includes/icons/currency.html
new file mode 100644
index 000000000..c451d5211
--- /dev/null
+++ b/library/font_awesome/src/_includes/icons/currency.html
@@ -0,0 +1,12 @@
+<section id="currency">
+ <h2 class="page-header">Currency Icons</h2>
+
+ <div class="row the-icons">
+ {% assign icons_currency = icons | expand_aliases | category:"Currency Icons" | sort_by:'class' %}
+
+ {% for icon in icons_currency %}
+ <div class="span3"><a href="{{ page.relative_path }}icon/{{ icon.id }}"><i class="icon-{{ icon.class }}"></i> icon-{{ icon.class }}{% if icon.alias_of %} <span class="muted">(alias)</span>{% endif %}</a></div>
+ {% endfor %}
+ </div>
+
+</section>
diff --git a/library/font_awesome/src/_includes/icons/directional.html b/library/font_awesome/src/_includes/icons/directional.html
new file mode 100644
index 000000000..6b4170a1b
--- /dev/null
+++ b/library/font_awesome/src/_includes/icons/directional.html
@@ -0,0 +1,12 @@
+<section id="directional">
+ <h2 class="page-header">Directional Icons</h2>
+
+ <div class="row the-icons">
+ {% assign icons_directional = icons | expand_aliases | category:"Directional Icons" | sort_by:'class' %}
+
+ {% for icon in icons_directional %}
+ <div class="span3"><a href="{{ page.relative_path }}icon/{{ icon.id }}"><i class="icon-{{ icon.class }}"></i> icon-{{ icon.class }}{% if icon.alias_of %} <span class="muted">(alias)</span>{% endif %}</a></div>
+ {% endfor %}
+ </div>
+
+</section>
diff --git a/library/font_awesome/src/_includes/icons/medical.html b/library/font_awesome/src/_includes/icons/medical.html
new file mode 100644
index 000000000..7d4cd7f97
--- /dev/null
+++ b/library/font_awesome/src/_includes/icons/medical.html
@@ -0,0 +1,12 @@
+<section id="medical">
+ <h2 class="page-header">Medical Icons</h2>
+
+ <div class="row the-icons">
+ {% assign icons_medical = icons | expand_aliases | category:"Medical Icons" | sort_by:'class' %}
+
+ {% for icon in icons_medical %}
+ <div class="span3"><a href="{{ page.relative_path }}icon/{{ icon.id }}"><i class="icon-{{ icon.class }}"></i> icon-{{ icon.class }}{% if icon.alias_of %} <span class="muted">(alias)</span>{% endif %}</a></div>
+ {% endfor %}
+ </div>
+
+</section>
diff --git a/library/font_awesome/src/_includes/icons/new.html b/library/font_awesome/src/_includes/icons/new.html
new file mode 100644
index 000000000..52c5e3fa6
--- /dev/null
+++ b/library/font_awesome/src/_includes/icons/new.html
@@ -0,0 +1,18 @@
+<{% if page.navbar_active == "icons" %}div{% else %}section{% endif %} id="new">
+ <h2 class="page-header">New Icons in {{ site.fontawesome.minor_version }}</h2>
+ {% if page.navbar_active != "icons" %}
+ <div class="margin-botom-large">
+ You asked, Font Awesome delivers with {{ icons | version:site.fontawesome.minor_version | size }} shiny new icons in version {{ site.fontawesome.minor_version }}.
+ Want to request new icons? <a href="{{ page.relative_path }}community/#requesting-new-icons">Here's how</a>.
+ </div>
+ {% endif %}
+
+ <div class="row the-icons">
+ {% assign icons_new = icons | expand_aliases | version:site.fontawesome.minor_version %}
+
+ {% for icon in icons_new %}
+ <div class="span3"><a href="{{ page.relative_path }}icon/{{ icon.id }}"><i class="icon-{{ icon.class }}"></i> icon-{{ icon.class }}{% if icon.alias_of %} <span class="muted">(alias)</span>{% endif %}</a></div>
+ {% endfor %}
+ </div>
+
+</{% if page.navbar_active == "icons" %}div{% else %}section{% endif %}>
diff --git a/library/font_awesome/src/_includes/icons/text-editor.html b/library/font_awesome/src/_includes/icons/text-editor.html
new file mode 100644
index 000000000..2c2d4955c
--- /dev/null
+++ b/library/font_awesome/src/_includes/icons/text-editor.html
@@ -0,0 +1,12 @@
+<section id="text-editor">
+ <h2 class="page-header">Text Editor Icons</h2>
+
+ <div class="row the-icons">
+ {% assign icons_text_editor = icons | expand_aliases | category:"Text Editor Icons" | sort_by:'class' %}
+
+ {% for icon in icons_text_editor %}
+ <div class="span3"><a href="{{ page.relative_path }}icon/{{ icon.id }}"><i class="icon-{{ icon.class }}"></i> icon-{{ icon.class }}{% if icon.alias_of %} <span class="muted">(alias)</span>{% endif %}</a></div>
+ {% endfor %}
+ </div>
+
+</section>
diff --git a/library/font_awesome/src/_includes/icons/video-player.html b/library/font_awesome/src/_includes/icons/video-player.html
new file mode 100644
index 000000000..5fcbe133b
--- /dev/null
+++ b/library/font_awesome/src/_includes/icons/video-player.html
@@ -0,0 +1,12 @@
+<section id="video-player">
+ <h2 class="page-header">Video Player Icons</h2>
+
+ <div class="row the-icons">
+ {% assign icons_video_player = icons | expand_aliases | category:"Video Player Icons" | sort_by:'class' %}
+
+ {% for icon in icons_video_player %}
+ <div class="span3"><a href="{{ page.relative_path }}icon/{{ icon.id }}"><i class="icon-{{ icon.class }}"></i> icon-{{ icon.class }}{% if icon.alias_of %} <span class="muted">(alias)</span>{% endif %}</a></div>
+ {% endfor %}
+ </div>
+
+</section>
diff --git a/library/font_awesome/src/_includes/icons/web-application.html b/library/font_awesome/src/_includes/icons/web-application.html
new file mode 100644
index 000000000..f70d727f7
--- /dev/null
+++ b/library/font_awesome/src/_includes/icons/web-application.html
@@ -0,0 +1,12 @@
+<section id="web-application">
+ <h2 class="page-header">Web Application Icons</h2>
+
+ <div class="row the-icons">
+ {% assign icons_web_application = icons | expand_aliases | category:"Web Application Icons" | sort_by:'class' %}
+
+ {% for icon in icons_web_application %}
+ <div class="span3"><a href="{{ page.relative_path }}icon/{{ icon.id }}"><i class="icon-{{ icon.class }}"></i> icon-{{ icon.class }}{% if icon.alias_of %} <span class="muted">(alias)</span>{% endif %}</a></div>
+ {% endfor %}
+ </div>
+
+</section>
diff --git a/library/font_awesome/src/_includes/jumbotron-slider.html b/library/font_awesome/src/_includes/jumbotron-slider.html
new file mode 100644
index 000000000..362eeac70
--- /dev/null
+++ b/library/font_awesome/src/_includes/jumbotron-slider.html
@@ -0,0 +1,53 @@
+<div class="jumbotron jumbotron-index hidden-print">
+ <div class="container">
+ <div class="row">
+ <div class="span8">
+ <div class="hero-content">
+ <h1>Font Awesome</h1>
+ <p>The iconic font designed for Bootstrap</p>
+ <div class="actions">
+ <a class="btn btn-primary btn-large" href="{{ page.relative_path }}assets/font-awesome.zip"
+ onClick="_gaq.push(['_trackEvent', 'Outbound Link', 'Download on GitHub']);">
+ <i class="icon-download-alt icon-large"></i>&nbsp;&nbsp;
+ Download
+ </a>
+ </div>
+ <div class="shameless-self-promotion">
+ <a href="{{ site.fontawesome.github.url }}"
+ onClick="_gaq.push(['_trackEvent', 'Outbound Link', 'View Project on GitHub']);">
+ GitHub Project</a> &nbsp;&nbsp;&middot;&nbsp;&nbsp;
+ Version {{ site.fontawesome.version }} &nbsp;&nbsp;&middot;&nbsp;&nbsp;
+ Created &amp; Maintained by <a href="http://twitter.com/{{ site.fontawesome.author.twitter }}">Dave Gandy</a>
+ </div>
+ </div>
+ </div>
+ <div class="span4">
+ <div id="iconCarousel" class="carousel slide">
+ <!-- Carousel items -->
+ <div class="carousel-inner">
+ <div class="active item"><div><i class="icon-flag"></i></div></div>
+ <div class="item"><div><i class="icon-compass"></i></div></div>
+ <div class="item"><div><i class="icon-rocket"></i></div></div>
+ <div class="item"><div><i class="icon-shield"></i></div></div>
+ <div class="item"><div><i class="icon-star-half-empty"></i></div></div>
+ <div class="item"><div><i class="icon-envelope-alt"></i></div></div>
+ <div class="item"><div><i class="icon-medkit"></i></div></div>
+ <div class="item"><div><i class="icon-book"></i></div></div>
+ <div class="item"><div><i class="icon-fighter-jet"></i></div></div>
+ <div class="item"><div><i class="icon-beer"></i></div></div>
+ <div class="item"><div><i class="icon-heart-empty"></i></div></div>
+ <div class="item"><div><i class="icon-thumbs-up"></i></div></div>
+ </div>
+ <!-- Carousel nav -->
+ <a class="carousel-control left" href="#iconCarousel" data-slide="prev"
+ onClick="_gaq.push(['_trackEvent', 'iconCarousel', 'Prev']);">
+ <i class="icon-circle-arrow-left"></i></a>
+ <a class="carousel-control right" href="#iconCarousel" data-slide="next"
+ onClick="_gaq.push(['_trackEvent', 'iconCarousel', 'Next']);">
+ <i class="icon-circle-arrow-right"></i></a>
+ </div>
+ </div>
+ </div>
+
+ </div>
+</div>
diff --git a/library/font_awesome/src/_includes/jumbotron.html b/library/font_awesome/src/_includes/jumbotron.html
new file mode 100644
index 000000000..747b32ded
--- /dev/null
+++ b/library/font_awesome/src/_includes/jumbotron.html
@@ -0,0 +1,6 @@
+<div class="jumbotron jumbotron-ad hidden-print">
+ <div class="container">
+ <h1>{{ jumbotron_h1 }}</h1>
+ <p>{{ jumbotron_p }}</p>
+ </div>
+</div>
diff --git a/library/font_awesome/src/_includes/license-code.less b/library/font_awesome/src/_includes/license-code.less
new file mode 100644
index 000000000..940e9a586
--- /dev/null
+++ b/library/font_awesome/src/_includes/license-code.less
@@ -0,0 +1,25 @@
+/*!
+ * Font Awesome {{ site.fontawesome.version }}
+ * the iconic font designed for Bootstrap
+ * ------------------------------------------------------------------------------
+ * The full suite of pictographic icons, examples, and documentation can be
+ * found at {{ site.fontawesome.url }}. Stay up to date on Twitter at
+ * http://twitter.com/{{ site.fontawesome.twitter }}.
+ *
+ * License
+ * ------------------------------------------------------------------------------
+ * - The Font Awesome font is licensed under {{ site.fontawesome.license.font.version }} -
+ * {{ site.fontawesome.license.font.url }}
+ * - Font Awesome CSS, LESS, and SASS files are licensed under {{ site.fontawesome.license.code.version }} -
+ * {{ site.fontawesome.license.code.url }}
+ * - Font Awesome documentation licensed under {{ site.fontawesome.license.documentation.version }} -
+ * {{ site.fontawesome.license.documentation.url }}
+ * - Attribution is no longer required in Font Awesome 3.0, but much appreciated:
+ * "Font Awesome by Dave Gandy - {{ site.fontawesome.url }}"
+ *
+ * Author - Dave Gandy
+ * ------------------------------------------------------------------------------
+ * Email: {{ site.fontawesome.author.email }}
+ * Twitter: http://twitter.com/{{ site.fontawesome.author.twitter }}
+ * Work: {{ site.fontawesome.author.work.title }} @ {{ site.fontawesome.author.work.name }} - {{ site.fontawesome.author.work.url }}
+ */ \ No newline at end of file
diff --git a/library/font_awesome/src/_includes/license.html b/library/font_awesome/src/_includes/license.html
new file mode 100644
index 000000000..8b2948095
--- /dev/null
+++ b/library/font_awesome/src/_includes/license.html
@@ -0,0 +1,57 @@
+{% capture stripe_ad_content %}
+<p class="lead">
+ Font Awesome is fully open source and is GPL compatible. You can use it for commercial projects, open source
+ projects, or really just about whatever you want.
+</p>
+{% endcapture %}
+{% include stripe-ad.html %}
+
+<div>
+ <div class="alert alert-info">
+ <ul class="icons-ul margin-bottom-none">
+ <li>
+ <i class="icon-li icon-info-sign icon-large"></i>Attribution is no longer required as of Font Awesome 3.0 but is much appreciated:
+ "Font Awesome by Dave Gandy - http://fontawesome.io".
+ </li>
+ </ul>
+ </div>
+</div>
+
+<section>
+ <h2 class="page-header">Font License</h2>
+ <ul>
+ <li>
+ Applies to all desktop and webfont files in the following directory:
+ <code>font-awesome/font/</code>.
+ </li>
+ <li>License: {{ site.fontawesome.license.font.version }}</li>
+ <li>URL: <a href="{{ site.fontawesome.license.font.url }}">{{ site.fontawesome.license.font.url }}</a></li>
+ </ul>
+</section>
+
+<section>
+ <h2 class="page-header">Code License</h2>
+ <ul>
+ <li>
+ Applies to all CSS and LESS files in the following directories:
+ <code>font-awesome/css/</code> and
+ <code>font-awesome/less/</code>.
+ </li>
+ <li>License: {{ site.fontawesome.license.code.version }}</li>
+ <li>URL: <a href="{{ site.fontawesome.license.code.url }}">{{ site.fontawesome.license.code.url }}</a></li>
+ </ul>
+</section>
+
+<section>
+ <h2 class="page-header">Documentation License</h2>
+ <ul>
+ <li>Applies to all Font Awesome project files that are not a part of the Font or Code licenses.</li>
+ <li>License: {{ site.fontawesome.license.documentation.version }}</li>
+ <li>URL: <a href="{{ site.fontawesome.license.documentation.url }}">{{ site.fontawesome.license.documentation.url }}</a></li>
+ </ul>
+</section>
+
+<section>
+ <h2 class="page-header">Brand Icons</h2>
+ {% include brand-license.html %}
+</section>
diff --git a/library/font_awesome/src/_includes/navbar.html b/library/font_awesome/src/_includes/navbar.html
new file mode 100644
index 000000000..99e1f5819
--- /dev/null
+++ b/library/font_awesome/src/_includes/navbar.html
@@ -0,0 +1,69 @@
+<div class="navbar navbar-inverse navbar-static-top hidden-print">
+ <div class="navbar-inner">
+ <div class="container">
+ <a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
+ <span class="icon-bar"></span>
+ <span class="icon-bar"></span>
+ <span class="icon-bar"></span>
+ </a>
+
+ <a class="brand" href="{{ page.relative_path }}"><i class="icon-flag"></i> Font Awesome</a>
+ <div class="nav-collapse collapse">
+ <ul class="nav">
+ <li class="hidden-tablet {% if page.navbar_active == "home" %} active{% endif %}"><a href="{{ page.relative_path }}">Home</a></li>
+ <li{% if page.navbar_active == "get-started" %} class="active"{% endif %}><a href="{{ page.relative_path }}get-started/">Get Started</a></li>
+ <li class="dropdown-split-left{% if page.navbar_active == "icons" %} active{% endif %}"><a href="{{ page.relative_path }}icons/">Icons</a></li>
+ <li class="dropdown dropdown-split-right hidden-phone{% if page.navbar_active == "icons" %} active{% endif %}">
+ <a href="#" class="dropdown-toggle" data-toggle="dropdown">
+ <i class="icon-caret-down"></i>
+ </a>
+ <ul class="dropdown-menu pull-right">
+ <li><a href="{{ page.relative_path }}icons/"><i class="icon-flag icon-fixed-width"></i>&nbsp; Icons</a></li>
+ <li class="divider"></li>
+ <li><a href="{{ page.relative_path }}icons/#new"><i class="icon-shield icon-fixed-width"></i>&nbsp; New Icons in {{ site.fontawesome.version }}</a></li>
+ <li><a href="{{ page.relative_path }}icons/#web-application"><i class="icon-camera-retro icon-fixed-width"></i>&nbsp; Web Application Icons</a></li>
+ <li><a href="{{ page.relative_path }}icons/#currency"><i class="icon-won icon-fixed-width"></i>&nbsp; Currency Icons</a></li>
+ <li><a href="{{ page.relative_path }}icons/#text-editor"><i class="icon-file-text-alt icon-fixed-width"></i>&nbsp; Text Editor Icons</a></li>
+ <li><a href="{{ page.relative_path }}icons/#directional"><i class="icon-hand-right icon-fixed-width"></i>&nbsp; Directional Icons</a></li>
+ <li><a href="{{ page.relative_path }}icons/#video-player"><i class="icon-play-sign icon-fixed-width"></i>&nbsp; Video Player Icons</a></li>
+ <li><a href="{{ page.relative_path }}icons/#brand"><i class="icon-github icon-fixed-width"></i>&nbsp; Brand Icons</a></li>
+ <li><a href="{{ page.relative_path }}icons/#medical"><i class="icon-medkit icon-fixed-width"></i>&nbsp; Medical Icons</a></li>
+ </ul>
+ </li>
+ <li class="dropdown-split-left{% if page.navbar_active == "examples" %} active{% endif %}"><a href="{{ page.relative_path }}examples/">Examples</a></li>
+ <li class="dropdown dropdown-split-right hidden-phone{% if page.navbar_active == "examples" %} active{% endif %}">
+ <a href="#" class="dropdown-toggle" data-toggle="dropdown">
+ <i class="icon-caret-down"></i>
+ </a>
+ <ul class="dropdown-menu pull-right">
+ <li><a href="{{ page.relative_path }}examples/">Examples</a></li>
+ <li class="divider"></li>
+ <li><a href="{{ page.relative_path }}examples/#new-styles">New Styles</a></li>
+ <li><a href="{{ page.relative_path }}examples/#inline-icons">Inline Icons</a></li>
+ <li><a href="{{ page.relative_path }}examples/#larger-icons">Larger Icons</a></li>
+ <li><a href="{{ page.relative_path }}examples/#bordered-pulled">Bordered & Pulled</a></li>
+ <li><a href="{{ page.relative_path }}examples/#buttons">Buttons</a></li>
+ <li><a href="{{ page.relative_path }}examples/#button-groups">Button Groups</a></li>
+ <li><a href="{{ page.relative_path }}examples/#button-dropdowns">Button Dropdowns</a></li>
+ <li><a href="{{ page.relative_path }}examples/#bulleted-lists">Bulleted Lists</a></li>
+ <li><a href="{{ page.relative_path }}examples/#navigation">Navigation</a></li>
+ <li><a href="{{ page.relative_path }}examples/#form-inputs">Form Inputs</a></li>
+ <li><a href="{{ page.relative_path }}examples/#animated-spinner">Animated Spinner</a></li>
+ <li><a href="{{ page.relative_path }}examples/#rotated-flipped">Rotated &amp; Flipped</a></li>
+ <li><a href="{{ page.relative_path }}examples/#stacked">Stacked</a></li>
+ <li><a href="{{ page.relative_path }}examples/#custom">Custom CSS</a></li>
+ </ul>
+ </li>
+ <li{% if page.navbar_active == "whats-new" %} class="active"{% endif %}><a href="{{ page.relative_path }}whats-new/">
+ <span class="hidden-tablet">What's </span>New</a>
+ </li>
+ <li{% if page.navbar_active == "community" %} class="active"{% endif %}><a href="{{ page.relative_path }}community/">Community</a></li>
+ <li{% if page.navbar_active == "license" %} class="active"{% endif %}><a href="{{ page.relative_path }}license/">License</a></li>
+ </ul>
+ <ul class="nav pull-right">
+ <li><a href="{{ site.fontawesome.blog_url }}">Blog</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+</div>
diff --git a/library/font_awesome/src/_includes/stripe-ad.html b/library/font_awesome/src/_includes/stripe-ad.html
new file mode 100644
index 000000000..64a278609
--- /dev/null
+++ b/library/font_awesome/src/_includes/stripe-ad.html
@@ -0,0 +1,10 @@
+<section class="hidden-print">
+ <div class="row stripe-ad">
+ <div class="span8">
+ {{ stripe_ad_content }}
+ </div>
+ <div class="span4">
+ {% include ads/carbon-light-horizontal.html %}
+ </div>
+ </div>
+</section>
diff --git a/library/font_awesome/src/_includes/stripe-social.html b/library/font_awesome/src/_includes/stripe-social.html
new file mode 100644
index 000000000..6c303e385
--- /dev/null
+++ b/library/font_awesome/src/_includes/stripe-social.html
@@ -0,0 +1,18 @@
+<div id="social-buttons" class="hidden-print">
+ <div class="container">
+ <ul class="unstyled inline">
+ <li>
+ <iframe class="github-btn" src="http://ghbtns.com/github-btn.html?user=FortAwesome&repo=Font-Awesome&type=watch&count=true" allowtransparency="true" frameborder="0" scrolling="0" width="100px" height="20px"></iframe>
+ </li>
+ <li>
+ <iframe class="github-btn" src="http://ghbtns.com/github-btn.html?user=FortAwesome&repo=Font-Awesome&type=fork&count=true" allowtransparency="true" frameborder="0" scrolling="0" width="102px" height="20px"></iframe>
+ </li>
+ <li class="follow-btn">
+ <a href="https://twitter.com/{{ site.fontawesome.twitter }}" class="twitter-follow-button" data-link-color="#0069D6" data-show-count="true">Follow @{{ site.fontawesome.twitter }}</a>
+ </li>
+ <li class="tweet-btn hidden-phone">
+ <a href="https://twitter.com/share" class="twitter-share-button" data-url="{{ site.fontawesome.url }}" data-text="Font Awesome, the iconic font designed for Bootstrap" data-counturl="{{ site.fontawesome.legacy_url }}" data-count="horizontal" data-via="{{ site.fontawesome.twitter }}" data-related="{{ site.fontawesome.author.twitter }}:Creator of Font Awesome">Tweet</a>
+ </li>
+ </ul>
+ </div>
+</div>
diff --git a/library/font_awesome/src/_includes/tell-me-thanks.html b/library/font_awesome/src/_includes/tell-me-thanks.html
new file mode 100644
index 000000000..94be6b209
--- /dev/null
+++ b/library/font_awesome/src/_includes/tell-me-thanks.html
@@ -0,0 +1,22 @@
+<section id="tell-me-thanks">
+ <h2 class="page-header">Tell Me Thanks</h2>
+ <p class="lead">
+ Hopefully you think Font Awesome <em>is</em> awesome. I've put hundreds of hours into the project to give back to the
+ open source community. If you'd like, here are a couple of ways you can tell me thanks for all my hard work.
+ </p>
+ <div class="row">
+ <div class="span6">
+ <h3><a href="https://www.gittip.com/davegandy/"><i class="icon-gittip"></i> Tip me on Gittip</a></h3>
+ <p>
+ Gittip is a great way to let developers know you appreciate their work.
+ </p>
+ </div>
+ <div class="span6">
+ <h3><a href="http://amzn.com/w/G64X58AY416W" target="_blank">My Amazon Wish List</a></h3>
+ <p>
+ Or pick something straight
+ from <a href="http://amzn.com/w/G64X58AY416W" target="_blank">my wish list</a>. Gift cards are great.
+ </p>
+ </div>
+ </div>
+</section>
diff --git a/library/font_awesome/src/_includes/tests/rotated-flipped-inside-anchor.html b/library/font_awesome/src/_includes/tests/rotated-flipped-inside-anchor.html
new file mode 100644
index 000000000..df11b37b4
--- /dev/null
+++ b/library/font_awesome/src/_includes/tests/rotated-flipped-inside-anchor.html
@@ -0,0 +1,6 @@
+<a href="#"><i class="icon-flag"></i>&nbsp; normal</a><br>
+<a href="#"><i class="icon-flag icon-rotate-90"></i>&nbsp; icon-rotate-90</a><br>
+<a href="#"><i class="icon-flag icon-rotate-180"></i>&nbsp; icon-rotate-180</a><br>
+<a href="#"><i class="icon-flag icon-rotate-270"></i>&nbsp; icon-rotate-270</a><br>
+<a href="#"><i class="icon-flag icon-flip-horizontal"></i>&nbsp; icon-flip-horizontal</a><br>
+<a href="#"><i class="icon-flag icon-flip-vertical"></i>&nbsp; icon-flip-vertical</a>
diff --git a/library/font_awesome/src/_includes/tests/rotated-flipped-inside-btn.html b/library/font_awesome/src/_includes/tests/rotated-flipped-inside-btn.html
new file mode 100644
index 000000000..c8c9993fd
--- /dev/null
+++ b/library/font_awesome/src/_includes/tests/rotated-flipped-inside-btn.html
@@ -0,0 +1,6 @@
+<a class="btn" href="#"><i class="icon-flag"></i>&nbsp; normal</a><br>
+<a class="btn" href="#"><i class="icon-flag icon-rotate-90"></i>&nbsp; icon-rotate-90</a><br>
+<a class="btn" href="#"><i class="icon-flag icon-rotate-180"></i>&nbsp; icon-rotate-180</a><br>
+<a class="btn" href="#"><i class="icon-flag icon-rotate-270"></i>&nbsp; icon-rotate-270</a><br>
+<a class="btn" href="#"><i class="icon-flag icon-flip-horizontal"></i>&nbsp; icon-flip-horizontal</a><br>
+<a class="btn" href="#"><i class="icon-flag icon-flip-vertical"></i>&nbsp; icon-flip-vertical</a>
diff --git a/library/font_awesome/src/_includes/tests/rotated-flipped.html b/library/font_awesome/src/_includes/tests/rotated-flipped.html
new file mode 100644
index 000000000..a6620cd3f
--- /dev/null
+++ b/library/font_awesome/src/_includes/tests/rotated-flipped.html
@@ -0,0 +1,6 @@
+<i class="icon-flag"></i>&nbsp; normal<br>
+<i class="icon-flag icon-rotate-90"></i>&nbsp; icon-rotate-90<br>
+<i class="icon-flag icon-rotate-180"></i>&nbsp; icon-rotate-180<br>
+<i class="icon-flag icon-rotate-270"></i>&nbsp; icon-rotate-270<br>
+<i class="icon-flag icon-flip-horizontal"></i>&nbsp; icon-flip-horizontal<br>
+<i class="icon-flag icon-flip-vertical"></i>&nbsp; icon-flip-vertical
diff --git a/library/font_awesome/src/_includes/tests/stacked-inside-anchor.html b/library/font_awesome/src/_includes/tests/stacked-inside-anchor.html
new file mode 100644
index 000000000..d034a9959
--- /dev/null
+++ b/library/font_awesome/src/_includes/tests/stacked-inside-anchor.html
@@ -0,0 +1,69 @@
+<p>
+ <a href="#">
+ <span class="icon-stack">
+ <i class="icon-sign-blank icon-stack-base"></i>
+ <i class="icon-twitter icon-light"></i>
+ </span>
+ Twitter Icon
+ </a>
+ <a href="#">
+ <span class="icon-stack">
+ <i class="icon-sign-blank icon-stack-base"></i>
+ <i class="icon-facebook icon-light"></i>
+ </span>
+ Facebook Icon
+ </a>
+ <a href="#">
+ <span class="icon-stack">
+ <i class="icon-sign-blank icon-stack-base"></i>
+ <i class="icon-github icon-light"></i>
+ </span>
+ GitHub Icon
+ </a>
+</p>
+<p>
+ <a href="#">
+ <span class="icon-stack">
+ <i class="icon-circle icon-stack-base"></i>
+ <i class="icon-twitter icon-light"></i>
+ </span>
+ Twitter Icon
+ </a>
+ <a href="#">
+ <span class="icon-stack">
+ <i class="icon-circle icon-stack-base"></i>
+ <i class="icon-facebook icon-light"></i>
+ </span>
+ Facebook Icon
+ </a>
+ <a href="#">
+ <span class="icon-stack">
+ <i class="icon-circle icon-stack-base"></i>
+ <i class="icon-github icon-light"></i>
+ </span>
+ GitHub Icon
+ </a>
+</p>
+<p>
+ <a href="#">
+ <span class="icon-stack">
+ <i class="icon-circle-blank icon-stack-base"></i>
+ <i class="icon-twitter"></i>
+ </span>
+ Twitter Icon
+ </a>
+ <a href="#">
+ <span class="icon-stack">
+ <i class="icon-circle-blank icon-stack-base"></i>
+ <i class="icon-facebook"></i>
+ </span>
+ Facebook Icon
+ </a>
+ <a href="#">
+ <span class="icon-stack">
+ <i class="icon-circle-blank icon-stack-base"></i>
+ <i class="icon-github"></i>
+ </span>
+ GitHub Icon
+ </a>
+</p> \ No newline at end of file
diff --git a/library/font_awesome/src/_includes/tests/stacked.html b/library/font_awesome/src/_includes/tests/stacked.html
new file mode 100644
index 000000000..36e427f78
--- /dev/null
+++ b/library/font_awesome/src/_includes/tests/stacked.html
@@ -0,0 +1,51 @@
+<p>
+ <span class="icon-stack">
+ <i class="icon-sign-blank icon-stack-base"></i>
+ <i class="icon-twitter icon-light"></i>
+ </span>
+ Twitter Icon
+ <span class="icon-stack">
+ <i class="icon-sign-blank icon-stack-base"></i>
+ <i class="icon-facebook icon-light"></i>
+ </span>
+ Facebook Icon
+ <span class="icon-stack">
+ <i class="icon-sign-blank icon-stack-base"></i>
+ <i class="icon-github icon-light"></i>
+ </span>
+ GitHub Icon
+</p>
+<p>
+ <span class="icon-stack">
+ <i class="icon-circle icon-stack-base"></i>
+ <i class="icon-twitter icon-light"></i>
+ </span>
+ Twitter Icon
+ <span class="icon-stack">
+ <i class="icon-circle icon-stack-base"></i>
+ <i class="icon-facebook icon-light"></i>
+ </span>
+ Facebook Icon
+ <span class="icon-stack">
+ <i class="icon-circle icon-stack-base"></i>
+ <i class="icon-github icon-light"></i>
+ </span>
+ GitHub Icon
+</p>
+<p>
+ <span class="icon-stack">
+ <i class="icon-circle-blank icon-stack-base"></i>
+ <i class="icon-twitter"></i>
+ </span>
+ Twitter Icon
+ <span class="icon-stack">
+ <i class="icon-circle-blank icon-stack-base"></i>
+ <i class="icon-facebook"></i>
+ </span>
+ Facebook Icon
+ <span class="icon-stack">
+ <i class="icon-circle-blank icon-stack-base"></i>
+ <i class="icon-github"></i>
+ </span>
+ GitHub Icon
+</p> \ No newline at end of file
diff --git a/library/font_awesome/src/_includes/thanks-to.html b/library/font_awesome/src/_includes/thanks-to.html
new file mode 100644
index 000000000..8a2d15208
--- /dev/null
+++ b/library/font_awesome/src/_includes/thanks-to.html
@@ -0,0 +1,26 @@
+<section id="thanks-to">
+ <h2 class="page-header">Thanks To</h2>
+ <div class="row">
+ <div class="span4">
+ <p>
+ Thanks to <a href="https://twitter.com/robmadole/">@robmadole</a> and
+ <a href="https://twitter.com/supercodepoet/">@supercodepoet</a> for icon design
+ review, advice, some Jekyll help, and being all around badass coders.
+ </p>
+ </div>
+ <div class="span4">
+ <p>
+ Thanks to <a href="https://twitter.com/grantgordon">@grantgordon</a> and
+ <a href="https://twitter.com/johnsmclay">@johnsmclay</a> for developing and hosting
+ <a href="http://icnfnt.com/">icnfnt</a>, the best way to subset Font Awesome.
+ </p>
+ </div>
+ <div class="span4">
+ <p>
+ Thanks to <a href="http://maxcdn.com"><i class="icon-maxcdn"></i> MaxCDN</a> for providing the excellent
+ <a href="http://www.bootstrapcdn.com/#tab_fontawesome">BootstrapCDN</a>, the fastest and easiest way to
+ <a href="{{ page.relative_path }}get-started/#bootstrapcdn">get started</a> with Font Awesome.
+ </p>
+ </div>
+ </div>
+</section>
diff --git a/library/font_awesome/src/_includes/whats-new.html b/library/font_awesome/src/_includes/whats-new.html
new file mode 100644
index 000000000..d413d0dec
--- /dev/null
+++ b/library/font_awesome/src/_includes/whats-new.html
@@ -0,0 +1,38 @@
+{% capture stripe_ad_content %}
+<p class="lead">
+ Font Awesome is always getting a little awesome-er. So here's what's new in the latest version, Font Awesome
+ {{ site.fontawesome.minor_version }}. Have some ideas for new features?
+ <a href="{{ page.relative_path }}community/">Help contribute</a>.
+</p>
+{% endcapture %}
+{% include stripe-ad.html %}
+
+<div id="whats-new">
+ <div class="row">
+ <div class="span4">
+ <h4><i class="icon-compass"></i> {{ icons | version:site.fontawesome.minor_version | size }} New Icons in {{ site.fontawesome.minor_version }}</h4>
+ Requested by the active community on the <a href="{{ site.fontawesome.github.url }}">Font Awesome GitHub project</a>.
+ </div>
+ <div class="span4">
+ <h4><i class="icon-terminal"></i> SCSS Support</h4>
+ A long term solution is now in place for SCSS support. Need SASS? Try <a href="http://sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#syntax">sass-convert</a>.
+ </div>
+ <div class="span4">
+ <h4><i class="icon-legal"></i> <a href="{{ page.relative_path }}license/">Better & Simpler License</a></h4>
+ SIL OFL 1.1 for font, MIT license for code. No more attribution required, but much appreciated.
+ </div>
+ <div class="span4 margin-bottom-large">
+ <h4><i class="icon-magic"></i> Pixel Perfection at 14px</h4>
+ Version 3 was re-created from the ground up to be razor sharp at Bootstrap's default 14px.
+ </div>
+ <div class="span4">
+ <h4><i class="icon-th-large"></i> <a href="http://icnfnt.com/">Font Subsetting</a></h4>
+ Thanks to <a href="https://twitter.com/grantgordon">@grantgordon</a> and <a href="https://twitter.com/johnsmclay">@johnsmclay</a>, you can <a href="http://icnfnt.com/">subset</a> to get just the icons you need.
+ </div>
+ <div class="span4">
+ <h4><i class="icon-question-sign"></i> Want More Details?</h4>
+ Check out the <a href="{{ site.fontawesome.github.url }}#changelog">CHANGELOG on the GitHub project</a> to see
+ what's new and changed.
+ </div>
+ </div>
+</div>
diff --git a/library/font_awesome/src/_includes/why.html b/library/font_awesome/src/_includes/why.html
new file mode 100644
index 000000000..ce3b87d13
--- /dev/null
+++ b/library/font_awesome/src/_includes/why.html
@@ -0,0 +1,41 @@
+<div id="why">
+ <div class="row">
+ <div class="span4">
+ <h4><i class="icon-flag"></i> One Font, {{ icons | size }} Icons</h4>
+ In a single collection, Font Awesome is a pictographic language of web-related actions.
+ </div>
+ <div class="span4">
+ <h4><i class="icon-pencil"></i> CSS Control</h4>
+ Easily style icon color, size, shadow, and anything that's possible with CSS.
+ </div>
+ <div class="span4">
+ <h4><i class="icon-fullscreen"></i> Infinite Scalability</h4>
+ Scalable vector graphics means every icon looks awesome at any size.
+ </div>
+ <div class="span4">
+ <h4><i class="icon-microphone"></i> Free, as in Speech</h4>
+ Font Awesome is completely free for commercial use. Check out the <a href="{{ page.relative_path }}license/">license</a>.
+ </div>
+ <div class="span4">
+ <h4><i class="icon-ok"></i> IE7 Support</h4>
+ Font Awesome supports IE7. If you need it, you have my condolences.
+ </div>
+ <div class="span4">
+ <h4><i class="icon-eye-open"></i> Perfect on Retina Displays</h4>
+ Font Awesome icons are vectors, which mean they're gorgeous on high-resolution displays.
+ </div>
+ <div class="span4">
+ <h4><i class="icon-thumbs-up-alt"></i> Made for Bootstrap</h4>
+ Designed from scratch to be fully compatible with <a href="{{ site.bootstrap.url }}">Bootstrap {{ site.bootstrap.version }}</a>.
+ </div>
+ <div class="span4">
+ <h4><i class="icon-desktop"></i> Desktop Friendly</h4>
+ To use on the desktop or for a complete set of vectors,
+ check out the <a href="{{ page.relative_path }}cheatsheet/">cheatsheet</a>.
+ </div>
+ <div class="span4">
+ <h4><i class="icon-search"></i> Screen Reader Compatible</h4>
+ Font Awesome won't trip up screen readers, unlike other icon fonts.
+ </div>
+ </div>
+</div>
diff --git a/library/font_awesome/src/_layouts/base.html b/library/font_awesome/src/_layouts/base.html
new file mode 100644
index 000000000..76de7cb41
--- /dev/null
+++ b/library/font_awesome/src/_layouts/base.html
@@ -0,0 +1,64 @@
+<!DOCTYPE html>
+<!--[if lt IE 7 ]><html class="ie ie6" lang="en"> <![endif]-->
+<!--[if IE 7 ]><html class="ie ie7" lang="en"> <![endif]-->
+<!--[if IE 8 ]><html class="ie ie8" lang="en"> <![endif]-->
+<!--[if (gte IE 9)|!(IE)]><!-->
+<html lang="en" xmlns="http://www.w3.org/1999/html"> <!--<![endif]-->
+<head>
+ <!-- Basic Page Needs
+ ================================================== -->
+ <meta charset="utf-8" />
+ <title>{% if page.title %}{{ page.title }}{% endif %}</title>
+ <meta name="description" content="Font Awesome, the iconic font designed for Bootstrap">
+ <meta name="author" content="Dave Gandy">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <!--<meta name="viewport" content="initial-scale=1; maximum-scale=1">-->
+
+ <!--[if lt IE 9]>
+ <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
+ <![endif]-->
+
+ <!-- CSS
+ ================================================== -->
+
+ <link rel="stylesheet" href="{{ page.relative_path }}assets/css/site.css">
+ <link rel="stylesheet" href="{{ page.relative_path }}assets/css/pygments.css">
+ <link rel="stylesheet" href="{{ page.relative_path }}assets/font-awesome/css/font-awesome.css">
+ <!--[if IE 7]>
+ <link rel="stylesheet" href="{{ page.relative_path }}assets/font-awesome/css/font-awesome-ie7.css">
+ <![endif]-->
+ <!-- Le fav and touch icons -->
+ <link rel="shortcut icon" href="{{ page.relative_path }}assets/ico/favicon.ico">
+
+ <script type="text/javascript" src="//use.typekit.net/wnc7ioh.js"></script>
+ <script type="text/javascript">try{Typekit.load();}catch(e){}</script>
+
+ <script type="text/javascript">
+ var _gaq = _gaq || [];
+ _gaq.push(['_setAccount', 'UA-30136587-1']);
+ _gaq.push(['_trackPageview']);
+
+ (function() {
+ var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
+ ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
+ var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
+ })();
+ </script>
+</head>
+<body data-spy="scroll" data-target=".navbar">
+<div class="wrapper"> <!-- necessary for sticky footer. wrap all content except footer -->
+ {% include navbar.html %}
+
+ {{ content }}
+ <div class="push"><!-- necessary for sticky footer --></div>
+</div>
+{% include footer.html %}
+
+<script src="http://platform.twitter.com/widgets.js"></script>
+<script src="{{ page.relative_path }}assets/js/jquery-1.7.1.min.js"></script>
+<script src="{{ page.relative_path }}assets/js/ZeroClipboard-1.1.7.min.js"></script>
+<script src="{{ page.relative_path }}assets/js/bootstrap-2.3.1.min.js"></script>
+<script src="{{ page.relative_path }}assets/js/site.js"></script>
+
+</body>
+</html>
diff --git a/library/font_awesome/src/_layouts/icon.html b/library/font_awesome/src/_layouts/icon.html
new file mode 100644
index 000000000..83723acde
--- /dev/null
+++ b/library/font_awesome/src/_layouts/icon.html
@@ -0,0 +1,62 @@
+---
+layout: base
+title_suffix: Font Awesome Icons
+relative_path: ../../
+---
+<div class="jumbotron jumbotron-icon">
+ <div class="container">
+ <div class="info-icons">
+ <i class="icon-{{ page.icon.id }} icon-6"></i>&nbsp;&nbsp;
+ <span class="hidden-phone">
+ <i class="icon-{{ page.icon.id }} icon-5"></i>&nbsp;&nbsp;
+ <span class="hidden-tablet"><i class="icon-{{ page.icon.id }} icon-4"></i>&nbsp;&nbsp;</span>
+ <i class="icon-{{ page.icon.id }} icon-3"></i>&nbsp;&nbsp;
+ <i class="icon-{{ page.icon.id }} icon-2"></i>&nbsp;
+ </span>
+ <i class="icon-{{ page.icon.id }} icon-1"></i>
+ </div>
+ <h1 class="info-class">
+ icon-{{ page.icon.id }}
+ <small>
+ <i class="icon-{{ page.icon.id }}"></i> &middot;
+ Unicode: <span class="upper">{{ page.icon.unicode }}</span> &middot;
+ Created: v{{ page.icon.created }} &middot;
+ Categories:
+ {% for category in page.icon.categories %}
+ {{ category }}{% unless forloop.last %},{% endunless %}
+ {% endfor %}
+ {% assign icon_alias_count = page.icon.aliases | size %}
+ {% if icon_alias_count > 0 %}
+ &middot; Aliases:
+ {% for alias in page.icon.aliases %}
+ icon-{{ alias }}{% unless forloop.last %},{% endunless %}
+ {% endfor %}
+ {% endif %}
+ </small>
+ </h1>
+ </div>
+</div>
+
+
+<div class="container">
+ <section>
+ <div class="row-fluid">
+ <div class="span9">
+ <p>After you get <a href="{{ page.relative_path }}integration/">up and running</a>, you can place Font Awesome icons just about anywhere with the <code>&lt;i&gt;</code> tag:</p>
+ <div class="well well-transparent">
+ <div style="font-size: 24px; line-height: 1.5em;">
+ <i class="icon-{{ page.icon.id }}"></i> icon-{{ page.icon.id }}
+ </div>
+ </div>
+{% highlight html %}
+<i class="icon-{{ page.icon.id }}"></i> icon-{{ page.icon.id }}
+{% endhighlight %}
+ <br>
+ <div class="lead"><i class="icon-info-sign"></i> Looking for more? Check out the <a href="{{ page.relative_path }}examples/">examples</a>.</div>
+ </div>
+ <div class="span3">
+ <div class="info-ad">{% include ads/carbon-light-vertical.html %}</div>
+ </div>
+ </div>
+ </section>
+</div>
diff --git a/library/font_awesome/src/_plugins/icon_page_generator.rb b/library/font_awesome/src/_plugins/icon_page_generator.rb
new file mode 100644
index 000000000..51475e540
--- /dev/null
+++ b/library/font_awesome/src/_plugins/icon_page_generator.rb
@@ -0,0 +1,46 @@
+##
+# Create individual pages for each icon in the FontAwesome set
+
+require 'yaml'
+require 'debugger'
+
+module Jekyll
+
+ class IconPage < Page
+
+ ##
+ # Take a single icon and render a page for it.
+
+ def initialize(site, base, dir, icon)
+ @site = site
+ @base = base
+ @dir = dir
+ @name = "#{icon.id}.html"
+ @icon = icon
+
+ self.process(@name)
+
+ self.read_yaml(File.join(base, site.config['layouts']), site.config['icon_layout'])
+
+ self.data['icon'] = icon
+ self.data['title'] = "icon-#{icon.id}: " + self.data['title_suffix']
+ end
+
+ end
+
+ class IconGenerator < Generator
+
+ ##
+ # Iterate over every described icon in a YAML file and create a page for it
+
+ safe true
+
+ def generate(site)
+ site.icons.each do |icon|
+ site.pages << IconPage.new(site, site.source, site.config['icon_destination'], icon)
+ end
+ end
+
+ end
+
+end
diff --git a/library/font_awesome/src/_plugins/site.rb b/library/font_awesome/src/_plugins/site.rb
new file mode 100644
index 000000000..a6a74b7bb
--- /dev/null
+++ b/library/font_awesome/src/_plugins/site.rb
@@ -0,0 +1,142 @@
+##
+# Provide an icons attribute on the site object
+
+require 'yaml'
+require 'forwardable'
+
+module Jekyll
+
+ class Icon
+
+ attr_reader :name, :id, :unicode, :created, :categories
+
+ def initialize(icon_object)
+ @icon_object = icon_object
+
+ # Class name used in CSS and HTML
+ @icon_object['class'] = icon_object['id']
+ # Normalize the aliases
+ @icon_object['aliases'] ||= []
+
+ @name = icon_object['name']
+ @id = icon_object['id']
+ @class = icon_object['class']
+ @aliases = icon_object['aliases']
+ @unicode = icon_object['unicode']
+ @created = icon_object['created']
+ @categories = icon_object['categories']
+ end
+
+ def to_liquid
+ return @icon_object
+ end
+
+ end
+
+ class IconList
+ ##
+ # A list of icons
+ #
+ include Enumerable
+ extend Forwardable
+
+ def_delegators :@icon_array, :each, :<<
+
+ def initialize(icon_array)
+ @original_icon_array = icon_array
+ @icon_array = []
+
+ icon_array.each { |icon_object|
+ @icon_array << Icon.new(icon_object)
+ }
+ end
+
+ def [](k)
+ @icon_array[k]
+ end
+
+ def to_liquid
+ @original_icon_array
+ end
+
+ end
+
+ module IconFilters
+ def expand_aliases(icons)
+ expanded = []
+
+ icons.each { |icon|
+ # Remove the aliases since we are expanding them
+ expanded << icon.reject{ |k| k == 'aliases'}
+
+ icon['aliases'].each { |alias_id|
+ alias_icon = expanded[-1].dup
+ alias_icon['class'] = alias_id
+ alias_icon['alias_of'] = icon
+
+ expanded << alias_icon
+ }
+ }
+
+ return expanded
+ end
+
+ def category(icons, cat)
+ icons.select { |icon| icon['categories'].include?(cat) }
+ end
+
+ def version(icons, version)
+ icons.select { |icon| icon['created'] == version }
+ end
+
+ def sort_by(icons, sort_key)
+ icons.sort_by! { |icon| icon[sort_key] }
+ end
+ end
+
+ Liquid::Template.register_filter(IconFilters)
+
+ class Site
+
+ attr_reader :icons
+
+ def process
+ self.reset_icons
+ self.reset
+ self.read
+ self.generate
+ self.render
+ self.cleanup
+ self.write
+
+ self.build
+ end
+
+ ##
+ # Reads the YAML file that stores all data about icons
+ def reset_icons
+ @icons = IconList.new(YAML.load_file(self.config['icon_meta'])['icons'])
+ end
+
+ ##
+ # After generation, runs a build of Font-Awesome
+ def build
+ system("make build", :chdir => self.config['destination'], :out => :err)
+ end
+
+ def site_payload
+ {
+ "site" => self.config.merge({
+ "time" => self.time,
+ "posts" => self.posts.sort { |a, b| b <=> a },
+ "pages" => self.pages,
+ "html_pages" => self.pages.reject { |page| !page.html? },
+ "categories" => post_attr_hash('categories'),
+ "tags" => post_attr_hash('tags')}),
+ "icons" => @icons,
+ }
+ end
+
+ end
+
+end
diff --git a/library/font_awesome/src/assets/css/prettify.css b/library/font_awesome/src/assets/css/prettify.css
new file mode 100755
index 000000000..aedd8d1a9
--- /dev/null
+++ b/library/font_awesome/src/assets/css/prettify.css
@@ -0,0 +1,30 @@
+.com { color: #93a1a1; }
+.lit { color: #195f91; }
+.pun, .opn, .clo { color: #93a1a1; }
+.fun { color: #dc322f; }
+.str, .atv { color: #D14; }
+.kwd, .linenums .tag { color: #1e347b; }
+.typ, .atn, .dec, .var { color: teal; }
+.pln { color: #48484c; }
+
+.prettyprint {
+ padding: 8px;
+ background-color: #f7f7f9;
+ border: 1px solid #e1e1e8;
+}
+.prettyprint.linenums {
+ -webkit-box-shadow: inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0;
+ -moz-box-shadow: inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0;
+ box-shadow: inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0;
+}
+
+/* Specify class=linenums on a pre to get line numbering */
+ol.linenums {
+ margin: 0 0 0 33px; /* IE indents via margin-left */
+}
+ol.linenums li {
+ padding-left: 12px;
+ color: #bebec5;
+ line-height: 18px;
+ text-shadow: 0 1px 0 #fff;
+} \ No newline at end of file
diff --git a/library/font_awesome/src/assets/css/pygments.css b/library/font_awesome/src/assets/css/pygments.css
new file mode 100644
index 000000000..5af20ee5e
--- /dev/null
+++ b/library/font_awesome/src/assets/css/pygments.css
@@ -0,0 +1,71 @@
+.hll { background-color: #ffffcc }
+/*{ background: #f0f3f3; }*/
+.c { color: #999; } /* Comment */
+.err { color: #AA0000; background-color: #FFAAAA } /* Error */
+.k { color: #006699; } /* Keyword */
+.o { color: #555555 } /* Operator */
+.cm { color: #0099FF; font-style: italic } /* Comment.Multiline */
+.cp { color: #009999 } /* Comment.Preproc */
+.c1 { color: #999; } /* Comment.Single */
+.cs { color: #999; } /* Comment.Special */
+.gd { background-color: #FFCCCC; border: 1px solid #CC0000 } /* Generic.Deleted */
+.ge { font-style: italic } /* Generic.Emph */
+.gr { color: #FF0000 } /* Generic.Error */
+.gh { color: #003300; } /* Generic.Heading */
+.gi { background-color: #CCFFCC; border: 1px solid #00CC00 } /* Generic.Inserted */
+.go { color: #AAAAAA } /* Generic.Output */
+.gp { color: #000099; } /* Generic.Prompt */
+.gs { } /* Generic.Strong */
+.gu { color: #003300; } /* Generic.Subheading */
+.gt { color: #99CC66 } /* Generic.Traceback */
+.kc { color: #006699; } /* Keyword.Constant */
+.kd { color: #006699; } /* Keyword.Declaration */
+.kn { color: #006699; } /* Keyword.Namespace */
+.kp { color: #006699 } /* Keyword.Pseudo */
+.kr { color: #006699; } /* Keyword.Reserved */
+.kt { color: #007788; } /* Keyword.Type */
+.m { color: #FF6600 } /* Literal.Number */
+.s { color: #d44950 } /* Literal.String */
+.na { color: #4f9fcf } /* Name.Attribute */
+.nb { color: #336666 } /* Name.Builtin */
+.nc { color: #00AA88; } /* Name.Class */
+.no { color: #336600 } /* Name.Constant */
+.nd { color: #9999FF } /* Name.Decorator */
+.ni { color: #999999; } /* Name.Entity */
+.ne { color: #CC0000; } /* Name.Exception */
+.nf { color: #CC00FF } /* Name.Function */
+.nl { color: #9999FF } /* Name.Label */
+.nn { color: #00CCFF; } /* Name.Namespace */
+.nt { color: #2f6f9f; } /* Name.Tag */
+.nv { color: #003333 } /* Name.Variable */
+.ow { color: #000000; } /* Operator.Word */
+.w { color: #bbbbbb } /* Text.Whitespace */
+.mf { color: #FF6600 } /* Literal.Number.Float */
+.mh { color: #FF6600 } /* Literal.Number.Hex */
+.mi { color: #FF6600 } /* Literal.Number.Integer */
+.mo { color: #FF6600 } /* Literal.Number.Oct */
+.sb { color: #CC3300 } /* Literal.String.Backtick */
+.sc { color: #CC3300 } /* Literal.String.Char */
+.sd { color: #CC3300; font-style: italic } /* Literal.String.Doc */
+.s2 { color: #CC3300 } /* Literal.String.Double */
+.se { color: #CC3300; } /* Literal.String.Escape */
+.sh { color: #CC3300 } /* Literal.String.Heredoc */
+.si { color: #AA0000 } /* Literal.String.Interpol */
+.sx { color: #CC3300 } /* Literal.String.Other */
+.sr { color: #33AAAA } /* Literal.String.Regex */
+.s1 { color: #CC3300 } /* Literal.String.Single */
+.ss { color: #FFCC33 } /* Literal.String.Symbol */
+.bp { color: #336666 } /* Name.Builtin.Pseudo */
+.vc { color: #003333 } /* Name.Variable.Class */
+.vg { color: #003333 } /* Name.Variable.Global */
+.vi { color: #003333 } /* Name.Variable.Instance */
+.il { color: #FF6600 } /* Literal.Number.Integer.Long */
+
+.css .o,
+.css .o + .nt,
+.css .nt + .nt { color: #999; }
+
+pre {
+ background-color: #fafafa;
+ padding: 8px 15px;
+}
diff --git a/library/font_awesome/src/assets/font-awesome/font/FontAwesome.otf b/library/font_awesome/src/assets/font-awesome/font/FontAwesome.otf
new file mode 100644
index 000000000..70125459f
--- /dev/null
+++ b/library/font_awesome/src/assets/font-awesome/font/FontAwesome.otf
Binary files differ
diff --git a/library/font_awesome/src/assets/font-awesome/font/fontawesome-webfont.eot b/library/font_awesome/src/assets/font-awesome/font/fontawesome-webfont.eot
new file mode 100755
index 000000000..0662cb96b
--- /dev/null
+++ b/library/font_awesome/src/assets/font-awesome/font/fontawesome-webfont.eot
Binary files differ
diff --git a/library/font_awesome/src/assets/font-awesome/font/fontawesome-webfont.svg b/library/font_awesome/src/assets/font-awesome/font/fontawesome-webfont.svg
new file mode 100755
index 000000000..2edb4ec34
--- /dev/null
+++ b/library/font_awesome/src/assets/font-awesome/font/fontawesome-webfont.svg
@@ -0,0 +1,399 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
+<svg xmlns="http://www.w3.org/2000/svg">
+<metadata></metadata>
+<defs>
+<font id="fontawesomeregular" horiz-adv-x="1536" >
+<font-face units-per-em="1792" ascent="1536" descent="-256" />
+<missing-glyph horiz-adv-x="448" />
+<glyph unicode=" " horiz-adv-x="448" />
+<glyph unicode="&#x09;" horiz-adv-x="448" />
+<glyph unicode="&#xa0;" horiz-adv-x="448" />
+<glyph unicode="&#xa8;" horiz-adv-x="1792" />
+<glyph unicode="&#xa9;" horiz-adv-x="1792" />
+<glyph unicode="&#xae;" horiz-adv-x="1792" />
+<glyph unicode="&#xb4;" horiz-adv-x="1792" />
+<glyph unicode="&#xc6;" horiz-adv-x="1792" />
+<glyph unicode="&#x2000;" horiz-adv-x="768" />
+<glyph unicode="&#x2001;" />
+<glyph unicode="&#x2002;" horiz-adv-x="768" />
+<glyph unicode="&#x2003;" />
+<glyph unicode="&#x2004;" horiz-adv-x="512" />
+<glyph unicode="&#x2005;" horiz-adv-x="384" />
+<glyph unicode="&#x2006;" horiz-adv-x="256" />
+<glyph unicode="&#x2007;" horiz-adv-x="256" />
+<glyph unicode="&#x2008;" horiz-adv-x="192" />
+<glyph unicode="&#x2009;" horiz-adv-x="307" />
+<glyph unicode="&#x200a;" horiz-adv-x="85" />
+<glyph unicode="&#x202f;" horiz-adv-x="307" />
+<glyph unicode="&#x205f;" horiz-adv-x="384" />
+<glyph unicode="&#x2122;" horiz-adv-x="1792" />
+<glyph unicode="&#x221e;" horiz-adv-x="1792" />
+<glyph unicode="&#x2260;" horiz-adv-x="1792" />
+<glyph unicode="&#xe000;" horiz-adv-x="500" d="M0 0z" />
+<glyph unicode="&#xf000;" horiz-adv-x="1792" d="M1699 1350q0 -35 -43 -78l-632 -632v-768h320q26 0 45 -19t19 -45t-19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45t45 19h320v768l-632 632q-43 43 -43 78q0 23 18 36.5t38 17.5t43 4h1408q23 0 43 -4t38 -17.5t18 -36.5z" />
+<glyph unicode="&#xf001;" d="M1536 1312v-1120q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89t34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v537l-768 -237v-709q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89 t34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v967q0 31 19 56.5t49 35.5l832 256q12 4 28 4q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf002;" horiz-adv-x="1664" d="M1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1664 -128q0 -52 -38 -90t-90 -38q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5 t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z" />
+<glyph unicode="&#xf003;" horiz-adv-x="1792" d="M1664 32v768q-32 -36 -69 -66q-268 -206 -426 -338q-51 -43 -83 -67t-86.5 -48.5t-102.5 -24.5h-1h-1q-48 0 -102.5 24.5t-86.5 48.5t-83 67q-158 132 -426 338q-37 30 -69 66v-768q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1664 1083v11v13.5t-0.5 13 t-3 12.5t-5.5 9t-9 7.5t-14 2.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5q0 -168 147 -284q193 -152 401 -317q6 -5 35 -29.5t46 -37.5t44.5 -31.5t50.5 -27.5t43 -9h1h1q20 0 43 9t50.5 27.5t44.5 31.5t46 37.5t35 29.5q208 165 401 317q54 43 100.5 115.5t46.5 131.5z M1792 1120v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1472q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf004;" horiz-adv-x="1792" d="M896 -128q-26 0 -44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5q224 0 351 -124t127 -344q0 -221 -229 -450l-623 -600 q-18 -18 -44 -18z" />
+<glyph unicode="&#xf005;" horiz-adv-x="1664" d="M1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -21 -10.5 -35.5t-30.5 -14.5q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455 l502 -73q56 -9 56 -46z" />
+<glyph unicode="&#xf006;" horiz-adv-x="1664" d="M1137 532l306 297l-422 62l-189 382l-189 -382l-422 -62l306 -297l-73 -421l378 199l377 -199zM1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -50 -41 -50q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500 l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455l502 -73q56 -9 56 -46z" />
+<glyph unicode="&#xf007;" horiz-adv-x="1408" d="M1408 131q0 -120 -73 -189.5t-194 -69.5h-874q-121 0 -194 69.5t-73 189.5q0 53 3.5 103.5t14 109t26.5 108.5t43 97.5t62 81t85.5 53.5t111.5 20q9 0 42 -21.5t74.5 -48t108 -48t133.5 -21.5t133.5 21.5t108 48t74.5 48t42 21.5q61 0 111.5 -20t85.5 -53.5t62 -81 t43 -97.5t26.5 -108.5t14 -109t3.5 -103.5zM1088 1024q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5z" />
+<glyph unicode="&#xf008;" horiz-adv-x="1920" d="M384 -64v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM384 320v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM384 704v128q0 26 -19 45t-45 19h-128 q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1408 -64v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM384 1088v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45 t45 -19h128q26 0 45 19t19 45zM1792 -64v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1408 704v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM1792 320v128 q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1792 704v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1792 1088v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19 t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1920 1248v-1344q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1344q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf009;" horiz-adv-x="1664" d="M768 512v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM768 1280v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM1664 512v-384q0 -52 -38 -90t-90 -38 h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM1664 1280v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf00a;" horiz-adv-x="1792" d="M512 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 288v-192q0 -40 -28 -68t-68 -28h-320 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28 h320q40 0 68 -28t28 -68zM1792 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 800v-192 q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf00b;" horiz-adv-x="1792" d="M512 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 288v-192q0 -40 -28 -68t-68 -28h-960 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68zM512 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 800v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v192q0 40 28 68t68 28 h960q40 0 68 -28t28 -68zM1792 1312v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf00c;" horiz-adv-x="1792" d="M1671 970q0 -40 -28 -68l-724 -724l-136 -136q-28 -28 -68 -28t-68 28l-136 136l-362 362q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -295l656 657q28 28 68 28t68 -28l136 -136q28 -28 28 -68z" />
+<glyph unicode="&#xf00d;" horiz-adv-x="1408" d="M1298 214q0 -40 -28 -68l-136 -136q-28 -28 -68 -28t-68 28l-294 294l-294 -294q-28 -28 -68 -28t-68 28l-136 136q-28 28 -28 68t28 68l294 294l-294 294q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -294l294 294q28 28 68 28t68 -28l136 -136q28 -28 28 -68 t-28 -68l-294 -294l294 -294q28 -28 28 -68z" />
+<glyph unicode="&#xf00e;" horiz-adv-x="1664" d="M1024 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-224q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v224h-224q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h224v224q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-224h224 q13 0 22.5 -9.5t9.5 -22.5zM1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1664 -128q0 -53 -37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5 t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z" />
+<glyph unicode="&#xf010;" horiz-adv-x="1664" d="M1024 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-576q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h576q13 0 22.5 -9.5t9.5 -22.5zM1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5z M1664 -128q0 -53 -37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z " />
+<glyph unicode="&#xf011;" d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61t-298 61t-245 164t-164 245t-61 298q0 182 80.5 343t226.5 270q43 32 95.5 25t83.5 -50q32 -42 24.5 -94.5t-49.5 -84.5q-98 -74 -151.5 -181t-53.5 -228q0 -104 40.5 -198.5t109.5 -163.5t163.5 -109.5 t198.5 -40.5t198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5q0 121 -53.5 228t-151.5 181q-42 32 -49.5 84.5t24.5 94.5q31 43 84 50t95 -25q146 -109 226.5 -270t80.5 -343zM896 1408v-640q0 -52 -38 -90t-90 -38t-90 38t-38 90v640q0 52 38 90t90 38t90 -38t38 -90z" />
+<glyph unicode="&#xf012;" horiz-adv-x="1792" d="M256 96v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM640 224v-320q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v320q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1024 480v-576q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23 v576q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1408 864v-960q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v960q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 1376v-1472q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v1472q0 14 9 23t23 9h192q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf013;" d="M1024 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1536 749v-222q0 -12 -8 -23t-20 -13l-185 -28q-19 -54 -39 -91q35 -50 107 -138q10 -12 10 -25t-9 -23q-27 -37 -99 -108t-94 -71q-12 0 -26 9l-138 108q-44 -23 -91 -38 q-16 -136 -29 -186q-7 -28 -36 -28h-222q-14 0 -24.5 8.5t-11.5 21.5l-28 184q-49 16 -90 37l-141 -107q-10 -9 -25 -9q-14 0 -25 11q-126 114 -165 168q-7 10 -7 23q0 12 8 23q15 21 51 66.5t54 70.5q-27 50 -41 99l-183 27q-13 2 -21 12.5t-8 23.5v222q0 12 8 23t19 13 l186 28q14 46 39 92q-40 57 -107 138q-10 12 -10 24q0 10 9 23q26 36 98.5 107.5t94.5 71.5q13 0 26 -10l138 -107q44 23 91 38q16 136 29 186q7 28 36 28h222q14 0 24.5 -8.5t11.5 -21.5l28 -184q49 -16 90 -37l142 107q9 9 24 9q13 0 25 -10q129 -119 165 -170q7 -8 7 -22 q0 -12 -8 -23q-15 -21 -51 -66.5t-54 -70.5q26 -50 41 -98l183 -28q13 -2 21 -12.5t8 -23.5z" />
+<glyph unicode="&#xf014;" horiz-adv-x="1408" d="M512 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM768 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1024 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576 q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1152 76v948h-896v-948q0 -22 7 -40.5t14.5 -27t10.5 -8.5h832q3 0 10.5 8.5t14.5 27t7 40.5zM480 1152h448l-48 117q-7 9 -17 11h-317q-10 -2 -17 -11zM1408 1120v-64q0 -14 -9 -23t-23 -9h-96v-948q0 -83 -47 -143.5t-113 -60.5h-832 q-66 0 -113 58.5t-47 141.5v952h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h309l70 167q15 37 54 63t79 26h320q40 0 79 -26t54 -63l70 -167h309q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf015;" horiz-adv-x="1664" d="M1408 544v-480q0 -26 -19 -45t-45 -19h-384v384h-256v-384h-384q-26 0 -45 19t-19 45v480q0 1 0.5 3t0.5 3l575 474l575 -474q1 -2 1 -6zM1631 613l-62 -74q-8 -9 -21 -11h-3q-13 0 -21 7l-692 577l-692 -577q-12 -8 -24 -7q-13 2 -21 11l-62 74q-8 10 -7 23.5t11 21.5 l719 599q32 26 76 26t76 -26l244 -204v195q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-408l219 -182q10 -8 11 -21.5t-7 -23.5z" />
+<glyph unicode="&#xf016;" horiz-adv-x="1280" d="M128 0h1024v768h-416q-40 0 -68 28t-28 68v416h-512v-1280zM768 896h376q-10 29 -22 41l-313 313q-12 12 -41 22v-376zM1280 864v-896q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h640q40 0 88 -20t76 -48l312 -312q28 -28 48 -76t20 -88z " />
+<glyph unicode="&#xf017;" d="M896 992v-448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf018;" horiz-adv-x="1920" d="M1111 540v4l-24 320q-1 13 -11 22.5t-23 9.5h-186q-13 0 -23 -9.5t-11 -22.5l-24 -320v-4q-1 -12 8 -20t21 -8h244q12 0 21 8t8 20zM1870 73q0 -73 -46 -73h-704q13 0 22 9.5t8 22.5l-20 256q-1 13 -11 22.5t-23 9.5h-272q-13 0 -23 -9.5t-11 -22.5l-20 -256 q-1 -13 8 -22.5t22 -9.5h-704q-46 0 -46 73q0 54 26 116l417 1044q8 19 26 33t38 14h339q-13 0 -23 -9.5t-11 -22.5l-15 -192q-1 -14 8 -23t22 -9h166q13 0 22 9t8 23l-15 192q-1 13 -11 22.5t-23 9.5h339q20 0 38 -14t26 -33l417 -1044q26 -62 26 -116z" />
+<glyph unicode="&#xf019;" horiz-adv-x="1664" d="M1280 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 416v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h465l135 -136 q58 -56 136 -56t136 56l136 136h464q40 0 68 -28t28 -68zM1339 985q17 -41 -14 -70l-448 -448q-18 -19 -45 -19t-45 19l-448 448q-31 29 -14 70q17 39 59 39h256v448q0 26 19 45t45 19h256q26 0 45 -19t19 -45v-448h256q42 0 59 -39z" />
+<glyph unicode="&#xf01a;" d="M1120 608q0 -12 -10 -24l-319 -319q-11 -9 -23 -9t-23 9l-320 320q-15 16 -7 35q8 20 30 20h192v352q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-352h192q14 0 23 -9t9 -23zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273 t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf01b;" d="M1118 660q-8 -20 -30 -20h-192v-352q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v352h-192q-14 0 -23 9t-9 23q0 12 10 24l319 319q11 9 23 9t23 -9l320 -320q15 -16 7 -35zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198 t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf01c;" d="M1023 576h316q-1 3 -2.5 8t-2.5 8l-212 496h-708l-212 -496q-1 -2 -2.5 -8t-2.5 -8h316l95 -192h320zM1536 546v-482q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v482q0 62 25 123l238 552q10 25 36.5 42t52.5 17h832q26 0 52.5 -17t36.5 -42l238 -552 q25 -61 25 -123z" />
+<glyph unicode="&#xf01d;" d="M1184 640q0 -37 -32 -55l-544 -320q-15 -9 -32 -9q-16 0 -32 8q-32 19 -32 56v640q0 37 32 56q33 18 64 -1l544 -320q32 -18 32 -55zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf01e;" d="M1536 1280v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l138 138q-148 137 -349 137q-104 0 -198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5q119 0 225 52t179 147q7 10 23 12q14 0 25 -9 l137 -138q9 -8 9.5 -20.5t-7.5 -22.5q-109 -132 -264 -204.5t-327 -72.5q-156 0 -298 61t-245 164t-164 245t-61 298t61 298t164 245t245 164t298 61q147 0 284.5 -55.5t244.5 -156.5l130 129q29 31 70 14q39 -17 39 -59z" />
+<glyph unicode="&#xf021;" d="M1511 480q0 -5 -1 -7q-64 -268 -268 -434.5t-478 -166.5q-146 0 -282.5 55t-243.5 157l-129 -129q-19 -19 -45 -19t-45 19t-19 45v448q0 26 19 45t45 19h448q26 0 45 -19t19 -45t-19 -45l-137 -137q71 -66 161 -102t187 -36q134 0 250 65t186 179q11 17 53 117 q8 23 30 23h192q13 0 22.5 -9.5t9.5 -22.5zM1536 1280v-448q0 -26 -19 -45t-45 -19h-448q-26 0 -45 19t-19 45t19 45l138 138q-148 137 -349 137q-134 0 -250 -65t-186 -179q-11 -17 -53 -117q-8 -23 -30 -23h-199q-13 0 -22.5 9.5t-9.5 22.5v7q65 268 270 434.5t480 166.5 q146 0 284 -55.5t245 -156.5l130 129q19 19 45 19t45 -19t19 -45z" />
+<glyph unicode="&#xf022;" horiz-adv-x="1792" d="M384 352v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 608v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M384 864v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1536 352v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5z M1536 608v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5zM1536 864v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5 t9.5 -22.5zM1664 160v832q0 13 -9.5 22.5t-22.5 9.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5v-832q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1792 1248v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1472q66 0 113 -47 t47 -113z" />
+<glyph unicode="&#xf023;" horiz-adv-x="1152" d="M320 768h512v192q0 106 -75 181t-181 75t-181 -75t-75 -181v-192zM1152 672v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h32v192q0 184 132 316t316 132t316 -132t132 -316v-192h32q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf024;" horiz-adv-x="1792" d="M320 1280q0 -72 -64 -110v-1266q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v1266q-64 38 -64 110q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -25 -12.5 -38.5t-39.5 -27.5q-215 -116 -369 -116q-61 0 -123.5 22t-108.5 48 t-115.5 48t-142.5 22q-192 0 -464 -146q-17 -9 -33 -9q-26 0 -45 19t-19 45v742q0 32 31 55q21 14 79 43q236 120 421 120q107 0 200 -29t219 -88q38 -19 88 -19q54 0 117.5 21t110 47t88 47t54.5 21q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf025;" horiz-adv-x="1664" d="M1664 650q0 -166 -60 -314l-20 -49l-185 -33q-22 -83 -90.5 -136.5t-156.5 -53.5v-32q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-32q71 0 130 -35.5t93 -95.5l68 12q29 95 29 193q0 148 -88 279t-236.5 209t-315.5 78 t-315.5 -78t-236.5 -209t-88 -279q0 -98 29 -193l68 -12q34 60 93 95.5t130 35.5v32q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v32q-88 0 -156.5 53.5t-90.5 136.5l-185 33l-20 49q-60 148 -60 314q0 151 67 291t179 242.5 t266 163.5t320 61t320 -61t266 -163.5t179 -242.5t67 -291z" />
+<glyph unicode="&#xf026;" horiz-adv-x="768" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45z" />
+<glyph unicode="&#xf027;" horiz-adv-x="1152" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45zM1152 640q0 -76 -42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5q0 21 12 35.5t29 25t34 23t29 35.5 t12 57t-12 57t-29 35.5t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5q15 0 25 -5q70 -27 112.5 -93t42.5 -142z" />
+<glyph unicode="&#xf028;" horiz-adv-x="1664" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45zM1152 640q0 -76 -42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5q0 21 12 35.5t29 25t34 23t29 35.5 t12 57t-12 57t-29 35.5t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5q15 0 25 -5q70 -27 112.5 -93t42.5 -142zM1408 640q0 -153 -85 -282.5t-225 -188.5q-13 -5 -25 -5q-27 0 -46 19t-19 45q0 39 39 59q56 29 76 44q74 54 115.5 135.5t41.5 173.5t-41.5 173.5 t-115.5 135.5q-20 15 -76 44q-39 20 -39 59q0 26 19 45t45 19q13 0 26 -5q140 -59 225 -188.5t85 -282.5zM1664 640q0 -230 -127 -422.5t-338 -283.5q-13 -5 -26 -5q-26 0 -45 19t-19 45q0 36 39 59q7 4 22.5 10.5t22.5 10.5q46 25 82 51q123 91 192 227t69 289t-69 289 t-192 227q-36 26 -82 51q-7 4 -22.5 10.5t-22.5 10.5q-39 23 -39 59q0 26 19 45t45 19q13 0 26 -5q211 -91 338 -283.5t127 -422.5z" />
+<glyph unicode="&#xf029;" horiz-adv-x="1408" d="M384 384v-128h-128v128h128zM384 1152v-128h-128v128h128zM1152 1152v-128h-128v128h128zM128 129h384v383h-384v-383zM128 896h384v384h-384v-384zM896 896h384v384h-384v-384zM640 640v-640h-640v640h640zM1152 128v-128h-128v128h128zM1408 128v-128h-128v128h128z M1408 640v-384h-384v128h-128v-384h-128v640h384v-128h128v128h128zM640 1408v-640h-640v640h640zM1408 1408v-640h-640v640h640z" />
+<glyph unicode="&#xf02a;" horiz-adv-x="1792" d="M63 0h-63v1408h63v-1408zM126 1h-32v1407h32v-1407zM220 1h-31v1407h31v-1407zM377 1h-31v1407h31v-1407zM534 1h-62v1407h62v-1407zM660 1h-31v1407h31v-1407zM723 1h-31v1407h31v-1407zM786 1h-31v1407h31v-1407zM943 1h-63v1407h63v-1407zM1100 1h-63v1407h63v-1407z M1226 1h-63v1407h63v-1407zM1352 1h-63v1407h63v-1407zM1446 1h-63v1407h63v-1407zM1635 1h-94v1407h94v-1407zM1698 1h-32v1407h32v-1407zM1792 0h-63v1408h63v-1408z" />
+<glyph unicode="&#xf02b;" d="M448 1088q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1515 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5 l715 -714q37 -39 37 -91z" />
+<glyph unicode="&#xf02c;" horiz-adv-x="1920" d="M448 1088q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1515 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5 l715 -714q37 -39 37 -91zM1899 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-36 0 -59 14t-53 45l470 470q37 37 37 90q0 52 -37 91l-715 714q-38 38 -102 64.5t-117 26.5h224q53 0 117 -26.5t102 -64.5l715 -714q37 -39 37 -91z" />
+<glyph unicode="&#xf02d;" horiz-adv-x="1664" d="M1639 1058q40 -57 18 -129l-275 -906q-19 -64 -76.5 -107.5t-122.5 -43.5h-923q-77 0 -148.5 53.5t-99.5 131.5q-24 67 -2 127q0 4 3 27t4 37q1 8 -3 21.5t-3 19.5q2 11 8 21t16.5 23.5t16.5 23.5q23 38 45 91.5t30 91.5q3 10 0.5 30t-0.5 28q3 11 17 28t17 23 q21 36 42 92t25 90q1 9 -2.5 32t0.5 28q4 13 22 30.5t22 22.5q19 26 42.5 84.5t27.5 96.5q1 8 -3 25.5t-2 26.5q2 8 9 18t18 23t17 21q8 12 16.5 30.5t15 35t16 36t19.5 32t26.5 23.5t36 11.5t47.5 -5.5l-1 -3q38 9 51 9h761q74 0 114 -56t18 -130l-274 -906 q-36 -119 -71.5 -153.5t-128.5 -34.5h-869q-27 0 -38 -15q-11 -16 -1 -43q24 -70 144 -70h923q29 0 56 15.5t35 41.5l300 987q7 22 5 57q38 -15 59 -43zM575 1056q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5 t-16.5 -22.5zM492 800q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5t-16.5 -22.5z" />
+<glyph unicode="&#xf02e;" horiz-adv-x="1280" d="M1164 1408q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62v1289q0 34 19.5 62t52.5 41q21 9 44 9h1048z" />
+<glyph unicode="&#xf02f;" horiz-adv-x="1664" d="M384 0h896v256h-896v-256zM384 640h896v384h-160q-40 0 -68 28t-28 68v160h-640v-640zM1536 576q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 576v-416q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-160q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68 v160h-224q-13 0 -22.5 9.5t-9.5 22.5v416q0 79 56.5 135.5t135.5 56.5h64v544q0 40 28 68t68 28h672q40 0 88 -20t76 -48l152 -152q28 -28 48 -76t20 -88v-256h64q79 0 135.5 -56.5t56.5 -135.5z" />
+<glyph unicode="&#xf030;" horiz-adv-x="1920" d="M960 864q119 0 203.5 -84.5t84.5 -203.5t-84.5 -203.5t-203.5 -84.5t-203.5 84.5t-84.5 203.5t84.5 203.5t203.5 84.5zM1664 1280q106 0 181 -75t75 -181v-896q0 -106 -75 -181t-181 -75h-1408q-106 0 -181 75t-75 181v896q0 106 75 181t181 75h224l51 136 q19 49 69.5 84.5t103.5 35.5h512q53 0 103.5 -35.5t69.5 -84.5l51 -136h224zM960 128q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
+<glyph unicode="&#xf031;" horiz-adv-x="1664" d="M725 977l-170 -450q73 -1 153.5 -2t119 -1.5t52.5 -0.5l29 2q-32 95 -92 241q-53 132 -92 211zM21 -128h-21l2 79q22 7 80 18q89 16 110 31q20 16 48 68l237 616l280 724h75h53l11 -21l205 -480q103 -242 124 -297q39 -102 96 -235q26 -58 65 -164q24 -67 65 -149 q22 -49 35 -57q22 -19 69 -23q47 -6 103 -27q6 -39 6 -57q0 -14 -1 -26q-80 0 -192 8q-93 8 -189 8q-79 0 -135 -2l-200 -11l-58 -2q0 45 4 78l131 28q56 13 68 23q12 12 12 27t-6 32l-47 114l-92 228l-450 2q-29 -65 -104 -274q-23 -64 -23 -84q0 -31 17 -43 q26 -21 103 -32q3 0 13.5 -2t30 -5t40.5 -6q1 -28 1 -58q0 -17 -2 -27q-66 0 -349 20l-48 -8q-81 -14 -167 -14z" />
+<glyph unicode="&#xf032;" horiz-adv-x="1408" d="M555 15q76 -32 140 -32q131 0 216 41t122 113q38 70 38 181q0 114 -41 180q-58 94 -141 126q-80 32 -247 32q-74 0 -101 -10v-144l-1 -173l3 -270q0 -15 12 -44zM541 761q43 -7 109 -7q175 0 264 65t89 224q0 112 -85 187q-84 75 -255 75q-52 0 -130 -13q0 -44 2 -77 q7 -122 6 -279l-1 -98q0 -43 1 -77zM0 -128l2 94q45 9 68 12q77 12 123 31q17 27 21 51q9 66 9 194l-2 497q-5 256 -9 404q-1 87 -11 109q-1 4 -12 12q-18 12 -69 15q-30 2 -114 13l-4 83l260 6l380 13l45 1q5 0 14 0.5t14 0.5q1 0 21.5 -0.5t40.5 -0.5h74q88 0 191 -27 q43 -13 96 -39q57 -29 102 -76q44 -47 65 -104t21 -122q0 -70 -32 -128t-95 -105q-26 -20 -150 -77q177 -41 267 -146q92 -106 92 -236q0 -76 -29 -161q-21 -62 -71 -117q-66 -72 -140 -108q-73 -36 -203 -60q-82 -15 -198 -11l-197 4q-84 2 -298 -11q-33 -3 -272 -11z" />
+<glyph unicode="&#xf033;" horiz-adv-x="1024" d="M0 -126l17 85q4 1 77 20q76 19 116 39q29 37 41 101l27 139l56 268l12 64q8 44 17 84.5t16 67t12.5 46.5t9 30.5t3.5 11.5l29 157l16 63l22 135l8 50v38q-41 22 -144 28q-28 2 -38 4l19 103l317 -14q39 -2 73 -2q66 0 214 9q33 2 68 4.5t36 2.5q-2 -19 -6 -38 q-7 -29 -13 -51q-55 -19 -109 -31q-64 -16 -101 -31q-12 -31 -24 -88q-9 -44 -13 -82q-44 -199 -66 -306l-61 -311l-38 -158l-43 -235l-12 -45q-2 -7 1 -27q64 -15 119 -21q36 -5 66 -10q-1 -29 -7 -58q-7 -31 -9 -41q-18 0 -23 -1q-24 -2 -42 -2q-9 0 -28 3q-19 4 -145 17 l-198 2q-41 1 -174 -11q-74 -7 -98 -9z" />
+<glyph unicode="&#xf034;" horiz-adv-x="1792" d="M81 1407l54 -27q20 -5 211 -5h130l19 3l115 1l215 -1h293l34 -2q14 -1 28 7t21 16l7 8l42 1q15 0 28 -1v-104.5t1 -131.5l1 -100l-1 -58q0 -32 -4 -51q-39 -15 -68 -18q-25 43 -54 128q-8 24 -15.5 62.5t-11.5 65.5t-6 29q-13 15 -27 19q-7 2 -42.5 2t-103.5 -1t-111 -1 q-34 0 -67 -5q-10 -97 -8 -136l1 -152v-332l3 -359l-1 -147q-1 -46 11 -85q49 -25 89 -32q2 0 18 -5t44 -13t43 -12q30 -8 50 -18q5 -45 5 -50q0 -10 -3 -29q-14 -1 -34 -1q-110 0 -187 10q-72 8 -238 8q-88 0 -233 -14q-48 -4 -70 -4q-2 22 -2 26l-1 26v9q21 33 79 49 q139 38 159 50q9 21 12 56q8 192 6 433l-5 428q-1 62 -0.5 118.5t0.5 102.5t-2 57t-6 15q-6 5 -14 6q-38 6 -148 6q-43 0 -100 -13.5t-73 -24.5q-13 -9 -22 -33t-22 -75t-24 -84q-6 -19 -19.5 -32t-20.5 -13q-44 27 -56 44v297v86zM1744 128q33 0 42 -18.5t-11 -44.5 l-126 -162q-20 -26 -49 -26t-49 26l-126 162q-20 26 -11 44.5t42 18.5h80v1024h-80q-33 0 -42 18.5t11 44.5l126 162q20 26 49 26t49 -26l126 -162q20 -26 11 -44.5t-42 -18.5h-80v-1024h80z" />
+<glyph unicode="&#xf035;" d="M81 1407l54 -27q20 -5 211 -5h130l19 3l115 1l446 -1h318l34 -2q14 -1 28 7t21 16l7 8l42 1q15 0 28 -1v-104.5t1 -131.5l1 -100l-1 -58q0 -32 -4 -51q-39 -15 -68 -18q-25 43 -54 128q-8 24 -15.5 62.5t-11.5 65.5t-6 29q-13 15 -27 19q-7 2 -58.5 2t-138.5 -1t-128 -1 q-94 0 -127 -5q-10 -97 -8 -136l1 -152v52l3 -359l-1 -147q-1 -46 11 -85q49 -25 89 -32q2 0 18 -5t44 -13t43 -12q30 -8 50 -18q5 -45 5 -50q0 -10 -3 -29q-14 -1 -34 -1q-110 0 -187 10q-72 8 -238 8q-82 0 -233 -13q-45 -5 -70 -5q-2 22 -2 26l-1 26v9q21 33 79 49 q139 38 159 50q9 21 12 56q6 137 6 433l-5 44q0 265 -2 278q-2 11 -6 15q-6 5 -14 6q-38 6 -148 6q-50 0 -168.5 -14t-132.5 -24q-13 -9 -22 -33t-22 -75t-24 -84q-6 -19 -19.5 -32t-20.5 -13q-44 27 -56 44v297v86zM1505 113q26 -20 26 -49t-26 -49l-162 -126 q-26 -20 -44.5 -11t-18.5 42v80h-1024v-80q0 -33 -18.5 -42t-44.5 11l-162 126q-26 20 -26 49t26 49l162 126q26 20 44.5 11t18.5 -42v-80h1024v80q0 33 18.5 42t44.5 -11z" />
+<glyph unicode="&#xf036;" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1408 576v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45zM1664 960v-128q0 -26 -19 -45 t-45 -19h-1536q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45zM1280 1344v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf037;" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1408 576v-128q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h896q26 0 45 -19t19 -45zM1664 960v-128q0 -26 -19 -45t-45 -19 h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1280 1344v-128q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h640q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf038;" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 576v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45zM1792 960v-128q0 -26 -19 -45 t-45 -19h-1536q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45zM1792 1344v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf039;" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 576v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 960v-128q0 -26 -19 -45 t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 1344v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf03a;" horiz-adv-x="1792" d="M256 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM256 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5 t9.5 -22.5zM256 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1344 q13 0 22.5 -9.5t9.5 -22.5zM256 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5 t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192 q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5z" />
+<glyph unicode="&#xf03b;" horiz-adv-x="1792" d="M384 992v-576q0 -13 -9.5 -22.5t-22.5 -9.5q-14 0 -23 9l-288 288q-9 9 -9 23t9 23l288 288q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5 t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088 q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5z" />
+<glyph unicode="&#xf03c;" horiz-adv-x="1792" d="M352 704q0 -14 -9 -23l-288 -288q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v576q0 13 9.5 22.5t22.5 9.5q14 0 23 -9l288 -288q9 -9 9 -23zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5 t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088 q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5z" />
+<glyph unicode="&#xf03d;" horiz-adv-x="1792" d="M1792 1184v-1088q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-403 403v-166q0 -119 -84.5 -203.5t-203.5 -84.5h-704q-119 0 -203.5 84.5t-84.5 203.5v704q0 119 84.5 203.5t203.5 84.5h704q119 0 203.5 -84.5t84.5 -203.5v-165l403 402q18 19 45 19q12 0 25 -5 q39 -17 39 -59z" />
+<glyph unicode="&#xf03e;" horiz-adv-x="1920" d="M640 960q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1664 576v-448h-1408v192l320 320l160 -160l512 512zM1760 1280h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-1216q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5v1216 q0 13 -9.5 22.5t-22.5 9.5zM1920 1248v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf040;" d="M363 0l91 91l-235 235l-91 -91v-107h128v-128h107zM886 928q0 22 -22 22q-10 0 -17 -7l-542 -542q-7 -7 -7 -17q0 -22 22 -22q10 0 17 7l542 542q7 7 7 17zM832 1120l416 -416l-832 -832h-416v416zM1515 1024q0 -53 -37 -90l-166 -166l-416 416l166 165q36 38 90 38 q53 0 91 -38l235 -234q37 -39 37 -91z" />
+<glyph unicode="&#xf041;" horiz-adv-x="1024" d="M768 896q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1024 896q0 -109 -33 -179l-364 -774q-16 -33 -47.5 -52t-67.5 -19t-67.5 19t-46.5 52l-365 774q-33 70 -33 179q0 212 150 362t362 150t362 -150t150 -362z" />
+<glyph unicode="&#xf042;" d="M768 96v1088q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf043;" horiz-adv-x="1024" d="M512 384q0 36 -20 69q-1 1 -15.5 22.5t-25.5 38t-25 44t-21 50.5q-4 16 -21 16t-21 -16q-7 -23 -21 -50.5t-25 -44t-25.5 -38t-15.5 -22.5q-20 -33 -20 -69q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 512q0 -212 -150 -362t-362 -150t-362 150t-150 362 q0 145 81 275q6 9 62.5 90.5t101 151t99.5 178t83 201.5q9 30 34 47t51 17t51.5 -17t33.5 -47q28 -93 83 -201.5t99.5 -178t101 -151t62.5 -90.5q81 -127 81 -275z" />
+<glyph unicode="&#xf044;" horiz-adv-x="1792" d="M888 352l116 116l-152 152l-116 -116v-56h96v-96h56zM1328 1072q-16 16 -33 -1l-350 -350q-17 -17 -1 -33t33 1l350 350q17 17 1 33zM1408 478v-190q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832 q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-14 -14 -32 -8q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v126q0 13 9 22l64 64q15 15 35 7t20 -29zM1312 1216l288 -288l-672 -672h-288v288zM1756 1084l-92 -92 l-288 288l92 92q28 28 68 28t68 -28l152 -152q28 -28 28 -68t-28 -68z" />
+<glyph unicode="&#xf045;" horiz-adv-x="1664" d="M1408 547v-259q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h255v0q13 0 22.5 -9.5t9.5 -22.5q0 -27 -26 -32q-77 -26 -133 -60q-10 -4 -16 -4h-112q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832 q66 0 113 47t47 113v214q0 19 18 29q28 13 54 37q16 16 35 8q21 -9 21 -29zM1645 1043l-384 -384q-18 -19 -45 -19q-12 0 -25 5q-39 17 -39 59v192h-160q-323 0 -438 -131q-119 -137 -74 -473q3 -23 -20 -34q-8 -2 -12 -2q-16 0 -26 13q-10 14 -21 31t-39.5 68.5t-49.5 99.5 t-38.5 114t-17.5 122q0 49 3.5 91t14 90t28 88t47 81.5t68.5 74t94.5 61.5t124.5 48.5t159.5 30.5t196.5 11h160v192q0 42 39 59q13 5 25 5q26 0 45 -19l384 -384q19 -19 19 -45t-19 -45z" />
+<glyph unicode="&#xf046;" horiz-adv-x="1664" d="M1408 606v-318q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-10 -10 -23 -10q-3 0 -9 2q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832 q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v254q0 13 9 22l64 64q10 10 23 10q6 0 12 -3q20 -8 20 -29zM1639 1095l-814 -814q-24 -24 -57 -24t-57 24l-430 430q-24 24 -24 57t24 57l110 110q24 24 57 24t57 -24l263 -263l647 647q24 24 57 24t57 -24l110 -110 q24 -24 24 -57t-24 -57z" />
+<glyph unicode="&#xf047;" horiz-adv-x="1792" d="M1792 640q0 -26 -19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-384v-384h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v384h-384v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45 t19 45l256 256q19 19 45 19t45 -19t19 -45v-128h384v384h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45t-19 -45t-45 -19h-128v-384h384v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45z" />
+<glyph unicode="&#xf048;" horiz-adv-x="1024" d="M979 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 11 13 19z" />
+<glyph unicode="&#xf049;" horiz-adv-x="1792" d="M1747 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 11 13 19l710 710 q19 19 32 13t13 -32v-710q4 11 13 19z" />
+<glyph unicode="&#xf04a;" horiz-adv-x="1664" d="M1619 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-8 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-19 19 -19 45t19 45l710 710q19 19 32 13t13 -32v-710q5 11 13 19z" />
+<glyph unicode="&#xf04b;" horiz-adv-x="1408" d="M1384 609l-1328 -738q-23 -13 -39.5 -3t-16.5 36v1472q0 26 16.5 36t39.5 -3l1328 -738q23 -13 23 -31t-23 -31z" />
+<glyph unicode="&#xf04c;" d="M1536 1344v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45zM640 1344v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf04d;" d="M1536 1344v-1408q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf04e;" horiz-adv-x="1664" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v710q0 26 13 32t32 -13l710 -710q19 -19 19 -45t-19 -45l-710 -710q-19 -19 -32 -13t-13 32v710q-5 -10 -13 -19z" />
+<glyph unicode="&#xf050;" horiz-adv-x="1792" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v710q0 26 13 32t32 -13l710 -710q8 -8 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-5 -10 -13 -19l-710 -710 q-19 -19 -32 -13t-13 32v710q-5 -10 -13 -19z" />
+<glyph unicode="&#xf051;" horiz-adv-x="1024" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-5 -10 -13 -19z" />
+<glyph unicode="&#xf052;" horiz-adv-x="1538" d="M14 557l710 710q19 19 45 19t45 -19l710 -710q19 -19 13 -32t-32 -13h-1472q-26 0 -32 13t13 32zM1473 0h-1408q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19z" />
+<glyph unicode="&#xf053;" horiz-adv-x="1152" d="M742 -37l-652 651q-37 37 -37 90.5t37 90.5l652 651q37 37 90.5 37t90.5 -37l75 -75q37 -37 37 -90.5t-37 -90.5l-486 -486l486 -485q37 -38 37 -91t-37 -90l-75 -75q-37 -37 -90.5 -37t-90.5 37z" />
+<glyph unicode="&#xf054;" horiz-adv-x="1152" d="M1099 704q0 -52 -37 -91l-652 -651q-37 -37 -90 -37t-90 37l-76 75q-37 39 -37 91q0 53 37 90l486 486l-486 485q-37 39 -37 91q0 53 37 90l76 75q36 38 90 38t90 -38l652 -651q37 -37 37 -90z" />
+<glyph unicode="&#xf055;" d="M1216 576v128q0 26 -19 45t-45 19h-256v256q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-256h-256q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h256v-256q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v256h256q26 0 45 19t19 45zM1536 640q0 -209 -103 -385.5 t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf056;" d="M1216 576v128q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5 t103 -385.5z" />
+<glyph unicode="&#xf057;" d="M1149 414q0 26 -19 45l-181 181l181 181q19 19 19 45q0 27 -19 46l-90 90q-19 19 -46 19q-26 0 -45 -19l-181 -181l-181 181q-19 19 -45 19q-27 0 -46 -19l-90 -90q-19 -19 -19 -46q0 -26 19 -45l181 -181l-181 -181q-19 -19 -19 -45q0 -27 19 -46l90 -90q19 -19 46 -19 q26 0 45 19l181 181l181 -181q19 -19 45 -19q27 0 46 19l90 90q19 19 19 46zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf058;" d="M1284 802q0 28 -18 46l-91 90q-19 19 -45 19t-45 -19l-408 -407l-226 226q-19 19 -45 19t-45 -19l-91 -90q-18 -18 -18 -46q0 -27 18 -45l362 -362q19 -19 45 -19q27 0 46 19l543 543q18 18 18 45zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf059;" d="M896 160v192q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h192q14 0 23 9t9 23zM1152 832q0 88 -55.5 163t-138.5 116t-170 41q-243 0 -371 -213q-15 -24 8 -42l132 -100q7 -6 19 -6q16 0 25 12q53 68 86 92q34 24 86 24q48 0 85.5 -26t37.5 -59 q0 -38 -20 -61t-68 -45q-63 -28 -115.5 -86.5t-52.5 -125.5v-36q0 -14 9 -23t23 -9h192q14 0 23 9t9 23q0 19 21.5 49.5t54.5 49.5q32 18 49 28.5t46 35t44.5 48t28 60.5t12.5 81zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf05a;" d="M1024 160v160q0 14 -9 23t-23 9h-96v512q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h96v-320h-96q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h448q14 0 23 9t9 23zM896 1056v160q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23 t23 -9h192q14 0 23 9t9 23zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf05b;" d="M1197 512h-109q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h109q-32 108 -112.5 188.5t-188.5 112.5v-109q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v109q-108 -32 -188.5 -112.5t-112.5 -188.5h109q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-109 q32 -108 112.5 -188.5t188.5 -112.5v109q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-109q108 32 188.5 112.5t112.5 188.5zM1536 704v-128q0 -26 -19 -45t-45 -19h-143q-37 -161 -154.5 -278.5t-278.5 -154.5v-143q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v143 q-161 37 -278.5 154.5t-154.5 278.5h-143q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h143q37 161 154.5 278.5t278.5 154.5v143q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-143q161 -37 278.5 -154.5t154.5 -278.5h143q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf05c;" d="M1097 457l-146 -146q-10 -10 -23 -10t-23 10l-137 137l-137 -137q-10 -10 -23 -10t-23 10l-146 146q-10 10 -10 23t10 23l137 137l-137 137q-10 10 -10 23t10 23l146 146q10 10 23 10t23 -10l137 -137l137 137q10 10 23 10t23 -10l146 -146q10 -10 10 -23t-10 -23 l-137 -137l137 -137q10 -10 10 -23t-10 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5 t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf05d;" d="M1171 723l-422 -422q-19 -19 -45 -19t-45 19l-294 294q-19 19 -19 45t19 45l102 102q19 19 45 19t45 -19l147 -147l275 275q19 19 45 19t45 -19l102 -102q19 -19 19 -45t-19 -45zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198 t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf05e;" d="M1312 643q0 161 -87 295l-754 -753q137 -89 297 -89q111 0 211.5 43.5t173.5 116.5t116 174.5t43 212.5zM313 344l755 754q-135 91 -300 91q-148 0 -273 -73t-198 -199t-73 -274q0 -162 89 -299zM1536 643q0 -157 -61 -300t-163.5 -246t-245 -164t-298.5 -61t-298.5 61 t-245 164t-163.5 246t-61 300t61 299.5t163.5 245.5t245 164t298.5 61t298.5 -61t245 -164t163.5 -245.5t61 -299.5z" />
+<glyph unicode="&#xf060;" d="M1536 640v-128q0 -53 -32.5 -90.5t-84.5 -37.5h-704l293 -294q38 -36 38 -90t-38 -90l-75 -76q-37 -37 -90 -37q-52 0 -91 37l-651 652q-37 37 -37 90q0 52 37 91l651 650q38 38 91 38q52 0 90 -38l75 -74q38 -38 38 -91t-38 -91l-293 -293h704q52 0 84.5 -37.5 t32.5 -90.5z" />
+<glyph unicode="&#xf061;" d="M1472 576q0 -54 -37 -91l-651 -651q-39 -37 -91 -37q-51 0 -90 37l-75 75q-38 38 -38 91t38 91l293 293h-704q-52 0 -84.5 37.5t-32.5 90.5v128q0 53 32.5 90.5t84.5 37.5h704l-293 294q-38 36 -38 90t38 90l75 75q38 38 90 38q53 0 91 -38l651 -651q37 -35 37 -90z" />
+<glyph unicode="&#xf062;" horiz-adv-x="1664" d="M1611 565q0 -51 -37 -90l-75 -75q-38 -38 -91 -38q-54 0 -90 38l-294 293v-704q0 -52 -37.5 -84.5t-90.5 -32.5h-128q-53 0 -90.5 32.5t-37.5 84.5v704l-294 -293q-36 -38 -90 -38t-90 38l-75 75q-38 38 -38 90q0 53 38 91l651 651q35 37 90 37q54 0 91 -37l651 -651 q37 -39 37 -91z" />
+<glyph unicode="&#xf063;" horiz-adv-x="1664" d="M1611 704q0 -53 -37 -90l-651 -652q-39 -37 -91 -37q-53 0 -90 37l-651 652q-38 36 -38 90q0 53 38 91l74 75q39 37 91 37q53 0 90 -37l294 -294v704q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-704l294 294q37 37 90 37q52 0 91 -37l75 -75q37 -39 37 -91z" />
+<glyph unicode="&#xf064;" horiz-adv-x="1792" d="M1792 896q0 -26 -19 -45l-512 -512q-19 -19 -45 -19t-45 19t-19 45v256h-224q-98 0 -175.5 -6t-154 -21.5t-133 -42.5t-105.5 -69.5t-80 -101t-48.5 -138.5t-17.5 -181q0 -55 5 -123q0 -6 2.5 -23.5t2.5 -26.5q0 -15 -8.5 -25t-23.5 -10q-16 0 -28 17q-7 9 -13 22 t-13.5 30t-10.5 24q-127 285 -127 451q0 199 53 333q162 403 875 403h224v256q0 26 19 45t45 19t45 -19l512 -512q19 -19 19 -45z" />
+<glyph unicode="&#xf065;" d="M755 480q0 -13 -10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45t-45 -19h-448q-26 0 -45 19t-19 45v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23zM1536 1344v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332 q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf066;" d="M768 576v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45zM1523 1248q0 -13 -10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45 t-45 -19h-448q-26 0 -45 19t-19 45v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23z" />
+<glyph unicode="&#xf067;" horiz-adv-x="1408" d="M1408 800v-192q0 -40 -28 -68t-68 -28h-416v-416q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v416h-416q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h416v416q0 40 28 68t68 28h192q40 0 68 -28t28 -68v-416h416q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf068;" horiz-adv-x="1408" d="M1408 800v-192q0 -40 -28 -68t-68 -28h-1216q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h1216q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf069;" horiz-adv-x="1664" d="M1482 486q46 -26 59.5 -77.5t-12.5 -97.5l-64 -110q-26 -46 -77.5 -59.5t-97.5 12.5l-266 153v-307q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v307l-266 -153q-46 -26 -97.5 -12.5t-77.5 59.5l-64 110q-26 46 -12.5 97.5t59.5 77.5l266 154l-266 154 q-46 26 -59.5 77.5t12.5 97.5l64 110q26 46 77.5 59.5t97.5 -12.5l266 -153v307q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-307l266 153q46 26 97.5 12.5t77.5 -59.5l64 -110q26 -46 12.5 -97.5t-59.5 -77.5l-266 -154z" />
+<glyph unicode="&#xf06a;" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM896 161v190q0 14 -9 23.5t-22 9.5h-192q-13 0 -23 -10t-10 -23v-190q0 -13 10 -23t23 -10h192 q13 0 22 9.5t9 23.5zM894 505l18 621q0 12 -10 18q-10 8 -24 8h-220q-14 0 -24 -8q-10 -6 -10 -18l17 -621q0 -10 10 -17.5t24 -7.5h185q14 0 23.5 7.5t10.5 17.5z" />
+<glyph unicode="&#xf06b;" d="M928 180v56v468v192h-320v-192v-468v-56q0 -25 18 -38.5t46 -13.5h192q28 0 46 13.5t18 38.5zM472 1024h195l-126 161q-26 31 -69 31q-40 0 -68 -28t-28 -68t28 -68t68 -28zM1160 1120q0 40 -28 68t-68 28q-43 0 -69 -31l-125 -161h194q40 0 68 28t28 68zM1536 864v-320 q0 -14 -9 -23t-23 -9h-96v-416q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28t-28 68v416h-96q-14 0 -23 9t-9 23v320q0 14 9 23t23 9h440q-93 0 -158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5q107 0 168 -77l128 -165l128 165q61 77 168 77q93 0 158.5 -65.5t65.5 -158.5 t-65.5 -158.5t-158.5 -65.5h440q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf06c;" horiz-adv-x="1792" d="M1280 832q0 26 -19 45t-45 19q-172 0 -318 -49.5t-259.5 -134t-235.5 -219.5q-19 -21 -19 -45q0 -26 19 -45t45 -19q24 0 45 19q27 24 74 71t67 66q137 124 268.5 176t313.5 52q26 0 45 19t19 45zM1792 1030q0 -95 -20 -193q-46 -224 -184.5 -383t-357.5 -268 q-214 -108 -438 -108q-148 0 -286 47q-15 5 -88 42t-96 37q-16 0 -39.5 -32t-45 -70t-52.5 -70t-60 -32q-30 0 -51 11t-31 24t-27 42q-2 4 -6 11t-5.5 10t-3 9.5t-1.5 13.5q0 35 31 73.5t68 65.5t68 56t31 48q0 4 -14 38t-16 44q-9 51 -9 104q0 115 43.5 220t119 184.5 t170.5 139t204 95.5q55 18 145 25.5t179.5 9t178.5 6t163.5 24t113.5 56.5l29.5 29.5t29.5 28t27 20t36.5 16t43.5 4.5q39 0 70.5 -46t47.5 -112t24 -124t8 -96z" />
+<glyph unicode="&#xf06d;" horiz-adv-x="1408" d="M1408 -160v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1152 896q0 -78 -24.5 -144t-64 -112.5t-87.5 -88t-96 -77.5t-87.5 -72t-64 -81.5t-24.5 -96.5q0 -96 67 -224l-4 1l1 -1 q-90 41 -160 83t-138.5 100t-113.5 122.5t-72.5 150.5t-27.5 184q0 78 24.5 144t64 112.5t87.5 88t96 77.5t87.5 72t64 81.5t24.5 96.5q0 94 -66 224l3 -1l-1 1q90 -41 160 -83t138.5 -100t113.5 -122.5t72.5 -150.5t27.5 -184z" />
+<glyph unicode="&#xf06e;" horiz-adv-x="1792" d="M1664 576q-152 236 -381 353q61 -104 61 -225q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 121 61 225q-229 -117 -381 -353q133 -205 333.5 -326.5t434.5 -121.5t434.5 121.5t333.5 326.5zM944 960q0 20 -14 34t-34 14q-125 0 -214.5 -89.5 t-89.5 -214.5q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34zM1792 576q0 -34 -20 -69q-140 -230 -376.5 -368.5t-499.5 -138.5t-499.5 139t-376.5 368q-20 35 -20 69t20 69q140 229 376.5 368t499.5 139t499.5 -139t376.5 -368q20 -35 20 -69z" />
+<glyph unicode="&#xf070;" horiz-adv-x="1792" d="M555 201l78 141q-87 63 -136 159t-49 203q0 121 61 225q-229 -117 -381 -353q167 -258 427 -375zM944 960q0 20 -14 34t-34 14q-125 0 -214.5 -89.5t-89.5 -214.5q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34zM1307 1151q0 -7 -1 -9 q-105 -188 -315 -566t-316 -567l-49 -89q-10 -16 -28 -16q-12 0 -134 70q-16 10 -16 28q0 12 44 87q-143 65 -263.5 173t-208.5 245q-20 31 -20 69t20 69q153 235 380 371t496 136q89 0 180 -17l54 97q10 16 28 16q5 0 18 -6t31 -15.5t33 -18.5t31.5 -18.5t19.5 -11.5 q16 -10 16 -27zM1344 704q0 -139 -79 -253.5t-209 -164.5l280 502q8 -45 8 -84zM1792 576q0 -35 -20 -69q-39 -64 -109 -145q-150 -172 -347.5 -267t-419.5 -95l74 132q212 18 392.5 137t301.5 307q-115 179 -282 294l63 112q95 -64 182.5 -153t144.5 -184q20 -34 20 -69z " />
+<glyph unicode="&#xf071;" horiz-adv-x="1792" d="M1024 161v190q0 14 -9.5 23.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -23.5v-190q0 -14 9.5 -23.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 23.5zM1022 535l18 459q0 12 -10 19q-13 11 -24 11h-220q-11 0 -24 -11q-10 -7 -10 -21l17 -457q0 -10 10 -16.5t24 -6.5h185 q14 0 23.5 6.5t10.5 16.5zM1008 1469l768 -1408q35 -63 -2 -126q-17 -29 -46.5 -46t-63.5 -17h-1536q-34 0 -63.5 17t-46.5 46q-37 63 -2 126l768 1408q17 31 47 49t65 18t65 -18t47 -49z" />
+<glyph unicode="&#xf072;" horiz-adv-x="1408" d="M1376 1376q44 -52 12 -148t-108 -172l-161 -161l160 -696q5 -19 -12 -33l-128 -96q-7 -6 -19 -6q-4 0 -7 1q-15 3 -21 16l-279 508l-259 -259l53 -194q5 -17 -8 -31l-96 -96q-9 -9 -23 -9h-2q-15 2 -24 13l-189 252l-252 189q-11 7 -13 23q-1 13 9 25l96 97q9 9 23 9 q6 0 8 -1l194 -53l259 259l-508 279q-14 8 -17 24q-2 16 9 27l128 128q14 13 30 8l665 -159l160 160q76 76 172 108t148 -12z" />
+<glyph unicode="&#xf073;" horiz-adv-x="1664" d="M128 -128h288v288h-288v-288zM480 -128h320v288h-320v-288zM128 224h288v320h-288v-320zM480 224h320v320h-320v-320zM128 608h288v288h-288v-288zM864 -128h320v288h-320v-288zM480 608h320v288h-320v-288zM1248 -128h288v288h-288v-288zM864 224h320v320h-320v-320z M512 1088v288q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-288q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1248 224h288v320h-288v-320zM864 608h320v288h-320v-288zM1248 608h288v288h-288v-288zM1280 1088v288q0 13 -9.5 22.5t-22.5 9.5h-64 q-13 0 -22.5 -9.5t-9.5 -22.5v-288q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1664 1152v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47 h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf074;" horiz-adv-x="1792" d="M666 1055q-60 -92 -137 -273q-22 45 -37 72.5t-40.5 63.5t-51 56.5t-63 35t-81.5 14.5h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224q250 0 410 -225zM1792 256q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192q-32 0 -85 -0.5t-81 -1t-73 1 t-71 5t-64 10.5t-63 18.5t-58 28.5t-59 40t-55 53.5t-56 69.5q59 93 136 273q22 -45 37 -72.5t40.5 -63.5t51 -56.5t63 -35t81.5 -14.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23zM1792 1152q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5 v192h-256q-48 0 -87 -15t-69 -45t-51 -61.5t-45 -77.5q-32 -62 -78 -171q-29 -66 -49.5 -111t-54 -105t-64 -100t-74 -83t-90 -68.5t-106.5 -42t-128 -16.5h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224q48 0 87 15t69 45t51 61.5t45 77.5q32 62 78 171q29 66 49.5 111 t54 105t64 100t74 83t90 68.5t106.5 42t128 16.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23z" />
+<glyph unicode="&#xf075;" horiz-adv-x="1792" d="M1792 640q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22q-17 -2 -30.5 9t-17.5 29v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281 q0 130 71 248.5t191 204.5t286 136.5t348 50.5q244 0 450 -85.5t326 -233t120 -321.5z" />
+<glyph unicode="&#xf076;" d="M1536 704v-128q0 -201 -98.5 -362t-274 -251.5t-395.5 -90.5t-395.5 90.5t-274 251.5t-98.5 362v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-128q0 -52 23.5 -90t53.5 -57t71 -30t64 -13t44 -2t44 2t64 13t71 30t53.5 57t23.5 90v128q0 26 19 45t45 19h384 q26 0 45 -19t19 -45zM512 1344v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45zM1536 1344v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf077;" horiz-adv-x="1664" d="M1611 320q0 -53 -37 -90l-75 -75q-38 -38 -91 -38q-54 0 -90 38l-486 485l-486 -485q-36 -38 -90 -38t-90 38l-75 75q-38 36 -38 90q0 53 38 91l651 651q37 37 90 37q52 0 91 -37l650 -651q38 -38 38 -91z" />
+<glyph unicode="&#xf078;" horiz-adv-x="1664" d="M1611 832q0 -53 -37 -90l-651 -651q-38 -38 -91 -38q-54 0 -90 38l-651 651q-38 36 -38 90q0 53 38 91l74 75q39 37 91 37q53 0 90 -37l486 -486l486 486q37 37 90 37q52 0 91 -37l75 -75q37 -39 37 -91z" />
+<glyph unicode="&#xf079;" horiz-adv-x="1920" d="M1280 32q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-8 0 -13.5 2t-9 7t-5.5 8t-3 11.5t-1 11.5v13v11v160v416h-192q-26 0 -45 19t-19 45q0 24 15 41l320 384q19 22 49 22t49 -22l320 -384q15 -17 15 -41q0 -26 -19 -45t-45 -19h-192v-384h576q16 0 25 -11l160 -192q7 -11 7 -21 zM1920 448q0 -24 -15 -41l-320 -384q-20 -23 -49 -23t-49 23l-320 384q-15 17 -15 41q0 26 19 45t45 19h192v384h-576q-16 0 -25 12l-160 192q-7 9 -7 20q0 13 9.5 22.5t22.5 9.5h960q8 0 13.5 -2t9 -7t5.5 -8t3 -11.5t1 -11.5v-13v-11v-160v-416h192q26 0 45 -19t19 -45z " />
+<glyph unicode="&#xf07a;" horiz-adv-x="1664" d="M640 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1536 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1664 1088v-512q0 -24 -16 -42.5t-41 -21.5 l-1044 -122q1 -7 4.5 -21.5t6 -26.5t2.5 -22q0 -16 -24 -64h920q26 0 45 -19t19 -45t-19 -45t-45 -19h-1024q-26 0 -45 19t-19 45q0 14 11 39.5t29.5 59.5t20.5 38l-177 823h-204q-26 0 -45 19t-19 45t19 45t45 19h256q16 0 28.5 -6.5t20 -15.5t13 -24.5t7.5 -26.5 t5.5 -29.5t4.5 -25.5h1201q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf07b;" horiz-adv-x="1664" d="M1664 928v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158z" />
+<glyph unicode="&#xf07c;" horiz-adv-x="1920" d="M1879 584q0 -31 -31 -66l-336 -396q-43 -51 -120.5 -86.5t-143.5 -35.5h-1088q-34 0 -60.5 13t-26.5 43q0 31 31 66l336 396q43 51 120.5 86.5t143.5 35.5h1088q34 0 60.5 -13t26.5 -43zM1536 928v-160h-832q-94 0 -197 -47.5t-164 -119.5l-337 -396l-5 -6q0 4 -0.5 12.5 t-0.5 12.5v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158z" />
+<glyph unicode="&#xf07d;" horiz-adv-x="768" d="M704 1216q0 -26 -19 -45t-45 -19h-128v-1024h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v1024h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45z" />
+<glyph unicode="&#xf07e;" horiz-adv-x="1792" d="M1792 640q0 -26 -19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-1024v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45t19 45l256 256q19 19 45 19t45 -19t19 -45v-128h1024v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45z" />
+<glyph unicode="&#xf080;" horiz-adv-x="1920" d="M512 512v-384h-256v384h256zM896 1024v-896h-256v896h256zM1280 768v-640h-256v640h256zM1664 1152v-1024h-256v1024h256zM1792 32v1216q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-1216q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5z M1920 1248v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf081;" d="M1280 926q-56 -25 -121 -34q68 40 93 117q-65 -38 -134 -51q-61 66 -153 66q-87 0 -148.5 -61.5t-61.5 -148.5q0 -29 5 -48q-129 7 -242 65t-192 155q-29 -50 -29 -106q0 -114 91 -175q-47 1 -100 26v-2q0 -75 50 -133.5t123 -72.5q-29 -8 -51 -8q-13 0 -39 4 q21 -63 74.5 -104t121.5 -42q-116 -90 -261 -90q-26 0 -50 3q148 -94 322 -94q112 0 210 35.5t168 95t120.5 137t75 162t24.5 168.5q0 18 -1 27q63 45 105 109zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5 t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf082;" d="M1307 618l23 219h-198v109q0 49 15.5 68.5t71.5 19.5h110v219h-175q-152 0 -218 -72t-66 -213v-131h-131v-219h131v-635h262v635h175zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960 q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf083;" horiz-adv-x="1792" d="M928 704q0 14 -9 23t-23 9q-66 0 -113 -47t-47 -113q0 -14 9 -23t23 -9t23 9t9 23q0 40 28 68t68 28q14 0 23 9t9 23zM1152 574q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM128 0h1536v128h-1536v-128zM1280 574q0 159 -112.5 271.5 t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM256 1216h384v128h-384v-128zM128 1024h1536v118v138h-828l-64 -128h-644v-128zM1792 1280v-1280q0 -53 -37.5 -90.5t-90.5 -37.5h-1536q-53 0 -90.5 37.5t-37.5 90.5v1280 q0 53 37.5 90.5t90.5 37.5h1536q53 0 90.5 -37.5t37.5 -90.5z" />
+<glyph unicode="&#xf084;" horiz-adv-x="1792" d="M832 1024q0 80 -56 136t-136 56t-136 -56t-56 -136q0 -42 19 -83q-41 19 -83 19q-80 0 -136 -56t-56 -136t56 -136t136 -56t136 56t56 136q0 42 -19 83q41 -19 83 -19q80 0 136 56t56 136zM1683 320q0 -17 -49 -66t-66 -49q-9 0 -28.5 16t-36.5 33t-38.5 40t-24.5 26 l-96 -96l220 -220q28 -28 28 -68q0 -42 -39 -81t-81 -39q-40 0 -68 28l-671 671q-176 -131 -365 -131q-163 0 -265.5 102.5t-102.5 265.5q0 160 95 313t248 248t313 95q163 0 265.5 -102.5t102.5 -265.5q0 -189 -131 -365l355 -355l96 96q-3 3 -26 24.5t-40 38.5t-33 36.5 t-16 28.5q0 17 49 66t66 49q13 0 23 -10q6 -6 46 -44.5t82 -79.5t86.5 -86t73 -78t28.5 -41z" />
+<glyph unicode="&#xf085;" horiz-adv-x="1920" d="M896 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1664 128q0 52 -38 90t-90 38t-90 -38t-38 -90q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 1152q0 52 -38 90t-90 38t-90 -38t-38 -90q0 -53 37.5 -90.5t90.5 -37.5 t90.5 37.5t37.5 90.5zM1280 731v-185q0 -10 -7 -19.5t-16 -10.5l-155 -24q-11 -35 -32 -76q34 -48 90 -115q7 -10 7 -20q0 -12 -7 -19q-23 -30 -82.5 -89.5t-78.5 -59.5q-11 0 -21 7l-115 90q-37 -19 -77 -31q-11 -108 -23 -155q-7 -24 -30 -24h-186q-11 0 -20 7.5t-10 17.5 l-23 153q-34 10 -75 31l-118 -89q-7 -7 -20 -7q-11 0 -21 8q-144 133 -144 160q0 9 7 19q10 14 41 53t47 61q-23 44 -35 82l-152 24q-10 1 -17 9.5t-7 19.5v185q0 10 7 19.5t16 10.5l155 24q11 35 32 76q-34 48 -90 115q-7 11 -7 20q0 12 7 20q22 30 82 89t79 59q11 0 21 -7 l115 -90q34 18 77 32q11 108 23 154q7 24 30 24h186q11 0 20 -7.5t10 -17.5l23 -153q34 -10 75 -31l118 89q8 7 20 7q11 0 21 -8q144 -133 144 -160q0 -9 -7 -19q-12 -16 -42 -54t-45 -60q23 -48 34 -82l152 -23q10 -2 17 -10.5t7 -19.5zM1920 198v-140q0 -16 -149 -31 q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20 t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31zM1920 1222v-140q0 -16 -149 -31q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68 q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70 q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31z" />
+<glyph unicode="&#xf086;" horiz-adv-x="1792" d="M1408 768q0 -139 -94 -257t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224 q0 139 94 257t256.5 186.5t353.5 68.5t353.5 -68.5t256.5 -186.5t94 -257zM1792 512q0 -120 -71 -224.5t-195 -176.5q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7 q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132q58 -4 88 -4q161 0 309 45t264 129q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230z" />
+<glyph unicode="&#xf087;" d="M256 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 768q0 51 -39 89.5t-89 38.5h-352q0 58 48 159.5t48 160.5q0 98 -32 145t-128 47q-26 -26 -38 -85t-30.5 -125.5t-59.5 -109.5q-22 -23 -77 -91q-4 -5 -23 -30t-31.5 -41t-34.5 -42.5 t-40 -44t-38.5 -35.5t-40 -27t-35.5 -9h-32v-640h32q13 0 31.5 -3t33 -6.5t38 -11t35 -11.5t35.5 -12.5t29 -10.5q211 -73 342 -73h121q192 0 192 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5q32 1 53.5 47t21.5 81zM1536 769 q0 -89 -49 -163q9 -33 9 -69q0 -77 -38 -144q3 -21 3 -43q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5h-36h-93q-96 0 -189.5 22.5t-216.5 65.5q-116 40 -138 40h-288q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5h274q36 24 137 155q58 75 107 128 q24 25 35.5 85.5t30.5 126.5t62 108q39 37 90 37q84 0 151 -32.5t102 -101.5t35 -186q0 -93 -48 -192h176q104 0 180 -76t76 -179z" />
+<glyph unicode="&#xf088;" d="M256 1088q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 512q0 35 -21.5 81t-53.5 47q15 17 25 47.5t10 55.5q0 69 -53 119q18 32 18 69t-17.5 73.5t-47.5 52.5q5 30 5 56q0 85 -49 126t-136 41h-128q-131 0 -342 -73q-5 -2 -29 -10.5 t-35.5 -12.5t-35 -11.5t-38 -11t-33 -6.5t-31.5 -3h-32v-640h32q16 0 35.5 -9t40 -27t38.5 -35.5t40 -44t34.5 -42.5t31.5 -41t23 -30q55 -68 77 -91q41 -43 59.5 -109.5t30.5 -125.5t38 -85q96 0 128 47t32 145q0 59 -48 160.5t-48 159.5h352q50 0 89 38.5t39 89.5z M1536 511q0 -103 -76 -179t-180 -76h-176q48 -99 48 -192q0 -118 -35 -186q-35 -69 -102 -101.5t-151 -32.5q-51 0 -90 37q-34 33 -54 82t-25.5 90.5t-17.5 84.5t-31 64q-48 50 -107 127q-101 131 -137 155h-274q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5 h288q22 0 138 40q128 44 223 66t200 22h112q140 0 226.5 -79t85.5 -216v-5q60 -77 60 -178q0 -22 -3 -43q38 -67 38 -144q0 -36 -9 -69q49 -74 49 -163z" />
+<glyph unicode="&#xf089;" horiz-adv-x="896" d="M832 1504v-1339l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41z" />
+<glyph unicode="&#xf08a;" horiz-adv-x="1792" d="M1664 940q0 81 -21.5 143t-55 98.5t-81.5 59.5t-94 31t-98 8t-112 -25.5t-110.5 -64t-86.5 -72t-60 -61.5q-18 -22 -49 -22t-49 22q-24 28 -60 61.5t-86.5 72t-110.5 64t-112 25.5t-98 -8t-94 -31t-81.5 -59.5t-55 -98.5t-21.5 -143q0 -168 187 -355l581 -560l580 559 q188 188 188 356zM1792 940q0 -221 -229 -450l-623 -600q-18 -18 -44 -18t-44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5 q224 0 351 -124t127 -344z" />
+<glyph unicode="&#xf08b;" horiz-adv-x="1664" d="M640 96q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-119 0 -203.5 84.5t-84.5 203.5v704q0 119 84.5 203.5t203.5 84.5h320q13 0 22.5 -9.5t9.5 -22.5q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-66 0 -113 -47t-47 -113v-704 q0 -66 47 -113t113 -47h288h11h13t11.5 -1t11.5 -3t8 -5.5t7 -9t2 -13.5zM1568 640q0 -26 -19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45z" />
+<glyph unicode="&#xf08c;" d="M237 122h231v694h-231v-694zM483 1030q-1 52 -36 86t-93 34t-94.5 -34t-36.5 -86q0 -51 35.5 -85.5t92.5 -34.5h1q59 0 95 34.5t36 85.5zM1068 122h231v398q0 154 -73 233t-193 79q-136 0 -209 -117h2v101h-231q3 -66 0 -694h231v388q0 38 7 56q15 35 45 59.5t74 24.5 q116 0 116 -157v-371zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf08d;" horiz-adv-x="1152" d="M480 672v448q0 14 -9 23t-23 9t-23 -9t-9 -23v-448q0 -14 9 -23t23 -9t23 9t9 23zM1152 320q0 -26 -19 -45t-45 -19h-429l-51 -483q-2 -12 -10.5 -20.5t-20.5 -8.5h-1q-27 0 -32 27l-76 485h-404q-26 0 -45 19t-19 45q0 123 78.5 221.5t177.5 98.5v512q-52 0 -90 38 t-38 90t38 90t90 38h640q52 0 90 -38t38 -90t-38 -90t-90 -38v-512q99 0 177.5 -98.5t78.5 -221.5z" />
+<glyph unicode="&#xf08e;" horiz-adv-x="1792" d="M1408 608v-320q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v320 q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1792 1472v-512q0 -26 -19 -45t-45 -19t-45 19l-176 176l-652 -652q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l652 652l-176 176q-19 19 -19 45t19 45t45 19h512q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf090;" d="M1184 640q0 -26 -19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45zM1536 992v-704q0 -119 -84.5 -203.5t-203.5 -84.5h-320q-13 0 -22.5 9.5t-9.5 22.5 q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q66 0 113 47t47 113v704q0 66 -47 113t-113 47h-288h-11h-13t-11.5 1t-11.5 3t-8 5.5t-7 9t-2 13.5q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf091;" horiz-adv-x="1664" d="M458 653q-74 162 -74 371h-256v-96q0 -78 94.5 -162t235.5 -113zM1536 928v96h-256q0 -209 -74 -371q141 29 235.5 113t94.5 162zM1664 1056v-128q0 -71 -41.5 -143t-112 -130t-173 -97.5t-215.5 -44.5q-42 -54 -95 -95q-38 -34 -52.5 -72.5t-14.5 -89.5q0 -54 30.5 -91 t97.5 -37q75 0 133.5 -45.5t58.5 -114.5v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 69 58.5 114.5t133.5 45.5q67 0 97.5 37t30.5 91q0 51 -14.5 89.5t-52.5 72.5q-53 41 -95 95q-113 5 -215.5 44.5t-173 97.5t-112 130t-41.5 143v128q0 40 28 68t68 28h288v96 q0 66 47 113t113 47h576q66 0 113 -47t47 -113v-96h288q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf092;" d="M394 184q-8 -9 -20 3q-13 11 -4 19q8 9 20 -3q12 -11 4 -19zM352 245q9 -12 0 -19q-8 -6 -17 7t0 18q9 7 17 -6zM291 305q-5 -7 -13 -2q-10 5 -7 12q3 5 13 2q10 -5 7 -12zM322 271q-6 -7 -16 3q-9 11 -2 16q6 6 16 -3q9 -11 2 -16zM451 159q-4 -12 -19 -6q-17 4 -13 15 t19 7q16 -5 13 -16zM514 154q0 -11 -16 -11q-17 -2 -17 11q0 11 16 11q17 2 17 -11zM572 164q2 -10 -14 -14t-18 8t14 15q16 2 18 -9zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-224q-16 0 -24.5 1t-19.5 5t-16 14.5t-5 27.5v239q0 97 -52 142q57 6 102.5 18t94 39 t81 66.5t53 105t20.5 150.5q0 121 -79 206q37 91 -8 204q-28 9 -81 -11t-92 -44l-38 -24q-93 26 -192 26t-192 -26q-16 11 -42.5 27t-83.5 38.5t-86 13.5q-44 -113 -7 -204q-79 -85 -79 -206q0 -85 20.5 -150t52.5 -105t80.5 -67t94 -39t102.5 -18q-40 -36 -49 -103 q-21 -10 -45 -15t-57 -5t-65.5 21.5t-55.5 62.5q-19 32 -48.5 52t-49.5 24l-20 3q-21 0 -29 -4.5t-5 -11.5t9 -14t13 -12l7 -5q22 -10 43.5 -38t31.5 -51l10 -23q13 -38 44 -61.5t67 -30t69.5 -7t55.5 3.5l23 4q0 -38 0.5 -103t0.5 -68q0 -22 -11 -33.5t-22 -13t-33 -1.5 h-224q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf093;" horiz-adv-x="1664" d="M1280 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 288v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h427q21 -56 70.5 -92 t110.5 -36h256q61 0 110.5 36t70.5 92h427q40 0 68 -28t28 -68zM1339 936q-17 -40 -59 -40h-256v-448q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v448h-256q-42 0 -59 40q-17 39 14 69l448 448q18 19 45 19t45 -19l448 -448q31 -30 14 -69z" />
+<glyph unicode="&#xf094;" d="M1407 710q0 44 -7 113.5t-18 96.5q-12 30 -17 44t-9 36.5t-4 48.5q0 23 5 68.5t5 67.5q0 37 -10 55q-4 1 -13 1q-19 0 -58 -4.5t-59 -4.5q-60 0 -176 24t-175 24q-43 0 -94.5 -11.5t-85 -23.5t-89.5 -34q-137 -54 -202 -103q-96 -73 -159.5 -189.5t-88 -236t-24.5 -248.5 q0 -40 12.5 -120t12.5 -121q0 -23 -11 -66.5t-11 -65.5t12 -36.5t34 -14.5q24 0 72.5 11t73.5 11q57 0 169.5 -15.5t169.5 -15.5q181 0 284 36q129 45 235.5 152.5t166 245.5t59.5 275zM1535 712q0 -165 -70 -327.5t-196 -288t-281 -180.5q-124 -44 -326 -44 q-57 0 -170 14.5t-169 14.5q-24 0 -72.5 -14.5t-73.5 -14.5q-73 0 -123.5 55.5t-50.5 128.5q0 24 11 68t11 67q0 40 -12.5 120.5t-12.5 121.5q0 111 18 217.5t54.5 209.5t100.5 194t150 156q78 59 232 120q194 78 316 78q60 0 175.5 -24t173.5 -24q19 0 57 5t58 5 q81 0 118 -50.5t37 -134.5q0 -23 -5 -68t-5 -68q0 -10 1 -18.5t3 -17t4 -13.5t6.5 -16t6.5 -17q16 -40 25 -118.5t9 -136.5z" />
+<glyph unicode="&#xf095;" horiz-adv-x="1408" d="M1408 296q0 -27 -10 -70.5t-21 -68.5q-21 -50 -122 -106q-94 -51 -186 -51q-27 0 -52.5 3.5t-57.5 12.5t-47.5 14.5t-55.5 20.5t-49 18q-98 35 -175 83q-128 79 -264.5 215.5t-215.5 264.5q-48 77 -83 175q-3 9 -18 49t-20.5 55.5t-14.5 47.5t-12.5 57.5t-3.5 52.5 q0 92 51 186q56 101 106 122q25 11 68.5 21t70.5 10q14 0 21 -3q18 -6 53 -76q11 -19 30 -54t35 -63.5t31 -53.5q3 -4 17.5 -25t21.5 -35.5t7 -28.5q0 -20 -28.5 -50t-62 -55t-62 -53t-28.5 -46q0 -9 5 -22.5t8.5 -20.5t14 -24t11.5 -19q76 -137 174 -235t235 -174 q2 -1 19 -11.5t24 -14t20.5 -8.5t22.5 -5q18 0 46 28.5t53 62t55 62t50 28.5q14 0 28.5 -7t35.5 -21.5t25 -17.5q25 -15 53.5 -31t63.5 -35t54 -30q70 -35 76 -53q3 -7 3 -21z" />
+<glyph unicode="&#xf096;" horiz-adv-x="1408" d="M1120 1280h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v832q0 66 -47 113t-113 47zM1408 1120v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832 q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf097;" horiz-adv-x="1280" d="M1152 1280h-1024v-1242l423 406l89 85l89 -85l423 -406v1242zM1164 1408q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62v1289 q0 34 19.5 62t52.5 41q21 9 44 9h1048z" />
+<glyph unicode="&#xf098;" d="M1280 343q0 11 -2 16q-3 8 -38.5 29.5t-88.5 49.5l-53 29q-5 3 -19 13t-25 15t-21 5q-18 0 -47 -32.5t-57 -65.5t-44 -33q-7 0 -16.5 3.5t-15.5 6.5t-17 9.5t-14 8.5q-99 55 -170.5 126.5t-126.5 170.5q-2 3 -8.5 14t-9.5 17t-6.5 15.5t-3.5 16.5q0 13 20.5 33.5t45 38.5 t45 39.5t20.5 36.5q0 10 -5 21t-15 25t-13 19q-3 6 -15 28.5t-25 45.5t-26.5 47.5t-25 40.5t-16.5 18t-16 2q-48 0 -101 -22q-46 -21 -80 -94.5t-34 -130.5q0 -16 2.5 -34t5 -30.5t9 -33t10 -29.5t12.5 -33t11 -30q60 -164 216.5 -320.5t320.5 -216.5q6 -2 30 -11t33 -12.5 t29.5 -10t33 -9t30.5 -5t34 -2.5q57 0 130.5 34t94.5 80q22 53 22 101zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf099;" horiz-adv-x="1664" d="M1620 1128q-67 -98 -162 -167q1 -14 1 -42q0 -130 -38 -259.5t-115.5 -248.5t-184.5 -210.5t-258 -146t-323 -54.5q-271 0 -496 145q35 -4 78 -4q225 0 401 138q-105 2 -188 64.5t-114 159.5q33 -5 61 -5q43 0 85 11q-112 23 -185.5 111.5t-73.5 205.5v4q68 -38 146 -41 q-66 44 -105 115t-39 154q0 88 44 163q121 -149 294.5 -238.5t371.5 -99.5q-8 38 -8 74q0 134 94.5 228.5t228.5 94.5q140 0 236 -102q109 21 205 78q-37 -115 -142 -178q93 10 186 50z" />
+<glyph unicode="&#xf09a;" horiz-adv-x="768" d="M511 980h257l-30 -284h-227v-824h-341v824h-170v284h170v171q0 182 86 275.5t283 93.5h227v-284h-142q-39 0 -62.5 -6.5t-34 -23.5t-13.5 -34.5t-3 -49.5v-142z" />
+<glyph unicode="&#xf09b;" d="M1536 640q0 -251 -146.5 -451.5t-378.5 -277.5q-27 -5 -39.5 7t-12.5 30v211q0 97 -52 142q57 6 102.5 18t94 39t81 66.5t53 105t20.5 150.5q0 121 -79 206q37 91 -8 204q-28 9 -81 -11t-92 -44l-38 -24q-93 26 -192 26t-192 -26q-16 11 -42.5 27t-83.5 38.5t-86 13.5 q-44 -113 -7 -204q-79 -85 -79 -206q0 -85 20.5 -150t52.5 -105t80.5 -67t94 -39t102.5 -18q-40 -36 -49 -103q-21 -10 -45 -15t-57 -5t-65.5 21.5t-55.5 62.5q-19 32 -48.5 52t-49.5 24l-20 3q-21 0 -29 -4.5t-5 -11.5t9 -14t13 -12l7 -5q22 -10 43.5 -38t31.5 -51l10 -23 q13 -38 44 -61.5t67 -30t69.5 -7t55.5 3.5l23 4q0 -38 0.5 -89t0.5 -54q0 -18 -13 -30t-40 -7q-232 77 -378.5 277.5t-146.5 451.5q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf09c;" horiz-adv-x="1664" d="M1664 960v-256q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45v256q0 106 -75 181t-181 75t-181 -75t-75 -181v-192h96q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h672v192q0 185 131.5 316.5t316.5 131.5 t316.5 -131.5t131.5 -316.5z" />
+<glyph unicode="&#xf09d;" horiz-adv-x="1920" d="M1760 1408q66 0 113 -47t47 -113v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600zM160 1280q-13 0 -22.5 -9.5t-9.5 -22.5v-224h1664v224q0 13 -9.5 22.5t-22.5 9.5h-1600zM1760 0q13 0 22.5 9.5t9.5 22.5v608h-1664v-608 q0 -13 9.5 -22.5t22.5 -9.5h1600zM256 128v128h256v-128h-256zM640 128v128h384v-128h-384z" />
+<glyph unicode="&#xf09e;" horiz-adv-x="1408" d="M384 192q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM896 69q2 -28 -17 -48q-18 -21 -47 -21h-135q-25 0 -43 16.5t-20 41.5q-22 229 -184.5 391.5t-391.5 184.5q-25 2 -41.5 20t-16.5 43v135q0 29 21 47q17 17 43 17h5q160 -13 306 -80.5 t259 -181.5q114 -113 181.5 -259t80.5 -306zM1408 67q2 -27 -18 -47q-18 -20 -46 -20h-143q-26 0 -44.5 17.5t-19.5 42.5q-12 215 -101 408.5t-231.5 336t-336 231.5t-408.5 102q-25 1 -42.5 19.5t-17.5 43.5v143q0 28 20 46q18 18 44 18h3q262 -13 501.5 -120t425.5 -294 q187 -186 294 -425.5t120 -501.5z" />
+<glyph unicode="&#xf0a0;" d="M1040 320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5zM1296 320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5zM1408 160v320q0 13 -9.5 22.5t-22.5 9.5 h-1216q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h1216q13 0 22.5 9.5t9.5 22.5zM178 640h1180l-157 482q-4 13 -16 21.5t-26 8.5h-782q-14 0 -26 -8.5t-16 -21.5zM1536 480v-320q0 -66 -47 -113t-113 -47h-1216q-66 0 -113 47t-47 113v320q0 25 16 75 l197 606q17 53 63 86t101 33h782q55 0 101 -33t63 -86l197 -606q16 -50 16 -75z" />
+<glyph unicode="&#xf0a1;" horiz-adv-x="1792" d="M1664 896q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5v-384q0 -52 -38 -90t-90 -38q-417 347 -812 380q-58 -19 -91 -66t-31 -100.5t40 -92.5q-20 -33 -23 -65.5t6 -58t33.5 -55t48 -50t61.5 -50.5q-29 -58 -111.5 -83t-168.5 -11.5t-132 55.5q-7 23 -29.5 87.5 t-32 94.5t-23 89t-15 101t3.5 98.5t22 110.5h-122q-66 0 -113 47t-47 113v192q0 66 47 113t113 47h480q435 0 896 384q52 0 90 -38t38 -90v-384zM1536 292v954q-394 -302 -768 -343v-270q377 -42 768 -341z" />
+<glyph unicode="&#xf0a2;" horiz-adv-x="1664" d="M848 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM183 128h1298q-164 181 -246.5 411.5t-82.5 484.5q0 256 -320 256t-320 -256q0 -254 -82.5 -484.5t-246.5 -411.5zM1664 128q0 -52 -38 -90t-90 -38 h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38t-38 90q190 161 287 397.5t97 498.5q0 165 96 262t264 117q-8 18 -8 37q0 40 28 68t68 28t68 -28t28 -68q0 -19 -8 -37q168 -20 264 -117t96 -262q0 -262 97 -498.5t287 -397.5z" />
+<glyph unicode="&#xf0a3;" d="M1376 640l138 -135q30 -28 20 -70q-12 -41 -52 -51l-188 -48l53 -186q12 -41 -19 -70q-29 -31 -70 -19l-186 53l-48 -188q-10 -40 -51 -52q-12 -2 -19 -2q-31 0 -51 22l-135 138l-135 -138q-28 -30 -70 -20q-41 11 -51 52l-48 188l-186 -53q-41 -12 -70 19q-31 29 -19 70 l53 186l-188 48q-40 10 -52 51q-10 42 20 70l138 135l-138 135q-30 28 -20 70q12 41 52 51l188 48l-53 186q-12 41 19 70q29 31 70 19l186 -53l48 188q10 41 51 51q41 12 70 -19l135 -139l135 139q29 30 70 19q41 -10 51 -51l48 -188l186 53q41 12 70 -19q31 -29 19 -70 l-53 -186l188 -48q40 -10 52 -51q10 -42 -20 -70z" />
+<glyph unicode="&#xf0a4;" horiz-adv-x="1792" d="M256 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 768q0 51 -39 89.5t-89 38.5h-576q0 20 15 48.5t33 55t33 68t15 84.5q0 67 -44.5 97.5t-115.5 30.5q-24 0 -90 -139q-24 -44 -37 -65q-40 -64 -112 -145q-71 -81 -101 -106 q-69 -57 -140 -57h-32v-640h32q72 0 167 -32t193.5 -64t179.5 -32q189 0 189 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5h331q52 0 90 38t38 90zM1792 769q0 -105 -75.5 -181t-180.5 -76h-169q-4 -62 -37 -119q3 -21 3 -43 q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5q-133 0 -322 69q-164 59 -223 59h-288q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5h288q10 0 21.5 4.5t23.5 14t22.5 18t24 22.5t20.5 21.5t19 21.5t14 17q65 74 100 129q13 21 33 62t37 72t40.5 63t55 49.5 t69.5 17.5q125 0 206.5 -67t81.5 -189q0 -68 -22 -128h374q104 0 180 -76t76 -179z" />
+<glyph unicode="&#xf0a5;" horiz-adv-x="1792" d="M1376 128h32v640h-32q-35 0 -67.5 12t-62.5 37t-50 46t-49 54q-2 3 -3.5 4.5t-4 4.5t-4.5 5q-72 81 -112 145q-14 22 -38 68q-1 3 -10.5 22.5t-18.5 36t-20 35.5t-21.5 30.5t-18.5 11.5q-71 0 -115.5 -30.5t-44.5 -97.5q0 -43 15 -84.5t33 -68t33 -55t15 -48.5h-576 q-50 0 -89 -38.5t-39 -89.5q0 -52 38 -90t90 -38h331q-15 -17 -25 -47.5t-10 -55.5q0 -69 53 -119q-18 -32 -18 -69t17.5 -73.5t47.5 -52.5q-4 -24 -4 -56q0 -85 48.5 -126t135.5 -41q84 0 183 32t194 64t167 32zM1664 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45 t45 -19t45 19t19 45zM1792 768v-640q0 -53 -37.5 -90.5t-90.5 -37.5h-288q-59 0 -223 -59q-190 -69 -317 -69q-142 0 -230 77.5t-87 217.5l1 5q-61 76 -61 178q0 22 3 43q-33 57 -37 119h-169q-105 0 -180.5 76t-75.5 181q0 103 76 179t180 76h374q-22 60 -22 128 q0 122 81.5 189t206.5 67q38 0 69.5 -17.5t55 -49.5t40.5 -63t37 -72t33 -62q35 -55 100 -129q2 -3 14 -17t19 -21.5t20.5 -21.5t24 -22.5t22.5 -18t23.5 -14t21.5 -4.5h288q53 0 90.5 -37.5t37.5 -90.5z" />
+<glyph unicode="&#xf0a6;" d="M1280 -64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 700q0 189 -167 189q-26 0 -56 -5q-16 30 -52.5 47.5t-73.5 17.5t-69 -18q-50 53 -119 53q-25 0 -55.5 -10t-47.5 -25v331q0 52 -38 90t-90 38q-51 0 -89.5 -39t-38.5 -89v-576 q-20 0 -48.5 15t-55 33t-68 33t-84.5 15q-67 0 -97.5 -44.5t-30.5 -115.5q0 -24 139 -90q44 -24 65 -37q64 -40 145 -112q81 -71 106 -101q57 -69 57 -140v-32h640v32q0 72 32 167t64 193.5t32 179.5zM1536 705q0 -133 -69 -322q-59 -164 -59 -223v-288q0 -53 -37.5 -90.5 t-90.5 -37.5h-640q-53 0 -90.5 37.5t-37.5 90.5v288q0 10 -4.5 21.5t-14 23.5t-18 22.5t-22.5 24t-21.5 20.5t-21.5 19t-17 14q-74 65 -129 100q-21 13 -62 33t-72 37t-63 40.5t-49.5 55t-17.5 69.5q0 125 67 206.5t189 81.5q68 0 128 -22v374q0 104 76 180t179 76 q105 0 181 -75.5t76 -180.5v-169q62 -4 119 -37q21 3 43 3q101 0 178 -60q139 1 219.5 -85t80.5 -227z" />
+<glyph unicode="&#xf0a7;" d="M1408 576q0 84 -32 183t-64 194t-32 167v32h-640v-32q0 -35 -12 -67.5t-37 -62.5t-46 -50t-54 -49q-9 -8 -14 -12q-81 -72 -145 -112q-22 -14 -68 -38q-3 -1 -22.5 -10.5t-36 -18.5t-35.5 -20t-30.5 -21.5t-11.5 -18.5q0 -71 30.5 -115.5t97.5 -44.5q43 0 84.5 15t68 33 t55 33t48.5 15v-576q0 -50 38.5 -89t89.5 -39q52 0 90 38t38 90v331q46 -35 103 -35q69 0 119 53q32 -18 69 -18t73.5 17.5t52.5 47.5q24 -4 56 -4q85 0 126 48.5t41 135.5zM1280 1344q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 580 q0 -142 -77.5 -230t-217.5 -87l-5 1q-76 -61 -178 -61q-22 0 -43 3q-54 -30 -119 -37v-169q0 -105 -76 -180.5t-181 -75.5q-103 0 -179 76t-76 180v374q-54 -22 -128 -22q-121 0 -188.5 81.5t-67.5 206.5q0 38 17.5 69.5t49.5 55t63 40.5t72 37t62 33q55 35 129 100 q3 2 17 14t21.5 19t21.5 20.5t22.5 24t18 22.5t14 23.5t4.5 21.5v288q0 53 37.5 90.5t90.5 37.5h640q53 0 90.5 -37.5t37.5 -90.5v-288q0 -59 59 -223q69 -190 69 -317z" />
+<glyph unicode="&#xf0a8;" d="M1280 576v128q0 26 -19 45t-45 19h-502l189 189q19 19 19 45t-19 45l-91 91q-18 18 -45 18t-45 -18l-362 -362l-91 -91q-18 -18 -18 -45t18 -45l91 -91l362 -362q18 -18 45 -18t45 18l91 91q18 18 18 45t-18 45l-189 189h502q26 0 45 19t19 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf0a9;" d="M1285 640q0 27 -18 45l-91 91l-362 362q-18 18 -45 18t-45 -18l-91 -91q-18 -18 -18 -45t18 -45l189 -189h-502q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h502l-189 -189q-19 -19 -19 -45t19 -45l91 -91q18 -18 45 -18t45 18l362 362l91 91q18 18 18 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf0aa;" d="M1284 641q0 27 -18 45l-362 362l-91 91q-18 18 -45 18t-45 -18l-91 -91l-362 -362q-18 -18 -18 -45t18 -45l91 -91q18 -18 45 -18t45 18l189 189v-502q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v502l189 -189q19 -19 45 -19t45 19l91 91q18 18 18 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf0ab;" d="M1284 639q0 27 -18 45l-91 91q-18 18 -45 18t-45 -18l-189 -189v502q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-502l-189 189q-19 19 -45 19t-45 -19l-91 -91q-18 -18 -18 -45t18 -45l362 -362l91 -91q18 -18 45 -18t45 18l91 91l362 362q18 18 18 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf0ac;" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM1042 887q-2 -1 -9.5 -9.5t-13.5 -9.5q2 0 4.5 5t5 11t3.5 7q6 7 22 15q14 6 52 12q34 8 51 -11 q-2 2 9.5 13t14.5 12q3 2 15 4.5t15 7.5l2 22q-12 -1 -17.5 7t-6.5 21q0 -2 -6 -8q0 7 -4.5 8t-11.5 -1t-9 -1q-10 3 -15 7.5t-8 16.5t-4 15q-2 5 -9.5 10.5t-9.5 10.5q-1 2 -2.5 5.5t-3 6.5t-4 5.5t-5.5 2.5t-7 -5t-7.5 -10t-4.5 -5q-3 2 -6 1.5t-4.5 -1t-4.5 -3t-5 -3.5 q-3 -2 -8.5 -3t-8.5 -2q15 5 -1 11q-10 4 -16 3q9 4 7.5 12t-8.5 14h5q-1 4 -8.5 8.5t-17.5 8.5t-13 6q-8 5 -34 9.5t-33 0.5q-5 -6 -4.5 -10.5t4 -14t3.5 -12.5q1 -6 -5.5 -13t-6.5 -12q0 -7 14 -15.5t10 -21.5q-3 -8 -16 -16t-16 -12q-5 -8 -1.5 -18.5t10.5 -16.5 q2 -2 1.5 -4t-3.5 -4.5t-5.5 -4t-6.5 -3.5l-3 -2q-11 -5 -20.5 6t-13.5 26q-7 25 -16 30q-23 8 -29 -1q-5 13 -41 26q-25 9 -58 4q6 1 0 15q-7 15 -19 12q3 6 4 17.5t1 13.5q3 13 12 23q1 1 7 8.5t9.5 13.5t0.5 6q35 -4 50 11q5 5 11.5 17t10.5 17q9 6 14 5.5t14.5 -5.5 t14.5 -5q14 -1 15.5 11t-7.5 20q12 -1 3 17q-5 7 -8 9q-12 4 -27 -5q-8 -4 2 -8q-1 1 -9.5 -10.5t-16.5 -17.5t-16 5q-1 1 -5.5 13.5t-9.5 13.5q-8 0 -16 -15q3 8 -11 15t-24 8q19 12 -8 27q-7 4 -20.5 5t-19.5 -4q-5 -7 -5.5 -11.5t5 -8t10.5 -5.5t11.5 -4t8.5 -3 q14 -10 8 -14q-2 -1 -8.5 -3.5t-11.5 -4.5t-6 -4q-3 -4 0 -14t-2 -14q-5 5 -9 17.5t-7 16.5q7 -9 -25 -6l-10 1q-4 0 -16 -2t-20.5 -1t-13.5 8q-4 8 0 20q1 4 4 2q-4 3 -11 9.5t-10 8.5q-46 -15 -94 -41q6 -1 12 1q5 2 13 6.5t10 5.5q34 14 42 7l5 5q14 -16 20 -25 q-7 4 -30 1q-20 -6 -22 -12q7 -12 5 -18q-4 3 -11.5 10t-14.5 11t-15 5q-16 0 -22 -1q-146 -80 -235 -222q7 -7 12 -8q4 -1 5 -9t2.5 -11t11.5 3q9 -8 3 -19q1 1 44 -27q19 -17 21 -21q3 -11 -10 -18q-1 2 -9 9t-9 4q-3 -5 0.5 -18.5t10.5 -12.5q-7 0 -9.5 -16t-2.5 -35.5 t-1 -23.5l2 -1q-3 -12 5.5 -34.5t21.5 -19.5q-13 -3 20 -43q6 -8 8 -9q3 -2 12 -7.5t15 -10t10 -10.5q4 -5 10 -22.5t14 -23.5q-2 -6 9.5 -20t10.5 -23q-1 0 -2.5 -1t-2.5 -1q3 -7 15.5 -14t15.5 -13q1 -3 2 -10t3 -11t8 -2q2 20 -24 62q-15 25 -17 29q-3 5 -5.5 15.5 t-4.5 14.5q2 0 6 -1.5t8.5 -3.5t7.5 -4t2 -3q-3 -7 2 -17.5t12 -18.5t17 -19t12 -13q6 -6 14 -19.5t0 -13.5q9 0 20 -10t17 -20q5 -8 8 -26t5 -24q2 -7 8.5 -13.5t12.5 -9.5l16 -8t13 -7q5 -2 18.5 -10.5t21.5 -11.5q10 -4 16 -4t14.5 2.5t13.5 3.5q15 2 29 -15t21 -21 q36 -19 55 -11q-2 -1 0.5 -7.5t8 -15.5t9 -14.5t5.5 -8.5q5 -6 18 -15t18 -15q6 4 7 9q-3 -8 7 -20t18 -10q14 3 14 32q-31 -15 -49 18q0 1 -2.5 5.5t-4 8.5t-2.5 8.5t0 7.5t5 3q9 0 10 3.5t-2 12.5t-4 13q-1 8 -11 20t-12 15q-5 -9 -16 -8t-16 9q0 -1 -1.5 -5.5t-1.5 -6.5 q-13 0 -15 1q1 3 2.5 17.5t3.5 22.5q1 4 5.5 12t7.5 14.5t4 12.5t-4.5 9.5t-17.5 2.5q-19 -1 -26 -20q-1 -3 -3 -10.5t-5 -11.5t-9 -7q-7 -3 -24 -2t-24 5q-13 8 -22.5 29t-9.5 37q0 10 2.5 26.5t3 25t-5.5 24.5q3 2 9 9.5t10 10.5q2 1 4.5 1.5t4.5 0t4 1.5t3 6q-1 1 -4 3 q-3 3 -4 3q7 -3 28.5 1.5t27.5 -1.5q15 -11 22 2q0 1 -2.5 9.5t-0.5 13.5q5 -27 29 -9q3 -3 15.5 -5t17.5 -5q3 -2 7 -5.5t5.5 -4.5t5 0.5t8.5 6.5q10 -14 12 -24q11 -40 19 -44q7 -3 11 -2t4.5 9.5t0 14t-1.5 12.5l-1 8v18l-1 8q-15 3 -18.5 12t1.5 18.5t15 18.5q1 1 8 3.5 t15.5 6.5t12.5 8q21 19 15 35q7 0 11 9q-1 0 -5 3t-7.5 5t-4.5 2q9 5 2 16q5 3 7.5 11t7.5 10q9 -12 21 -2q7 8 1 16q5 7 20.5 10.5t18.5 9.5q7 -2 8 2t1 12t3 12q4 5 15 9t13 5l17 11q3 4 0 4q18 -2 31 11q10 11 -6 20q3 6 -3 9.5t-15 5.5q3 1 11.5 0.5t10.5 1.5 q15 10 -7 16q-17 5 -43 -12zM879 10q206 36 351 189q-3 3 -12.5 4.5t-12.5 3.5q-18 7 -24 8q1 7 -2.5 13t-8 9t-12.5 8t-11 7q-2 2 -7 6t-7 5.5t-7.5 4.5t-8.5 2t-10 -1l-3 -1q-3 -1 -5.5 -2.5t-5.5 -3t-4 -3t0 -2.5q-21 17 -36 22q-5 1 -11 5.5t-10.5 7t-10 1.5t-11.5 -7 q-5 -5 -6 -15t-2 -13q-7 5 0 17.5t2 18.5q-3 6 -10.5 4.5t-12 -4.5t-11.5 -8.5t-9 -6.5t-8.5 -5.5t-8.5 -7.5q-3 -4 -6 -12t-5 -11q-2 4 -11.5 6.5t-9.5 5.5q2 -10 4 -35t5 -38q7 -31 -12 -48q-27 -25 -29 -40q-4 -22 12 -26q0 -7 -8 -20.5t-7 -21.5q0 -6 2 -16z" />
+<glyph unicode="&#xf0ad;" horiz-adv-x="1664" d="M384 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1028 484l-682 -682q-37 -37 -90 -37q-52 0 -91 37l-106 108q-38 36 -38 90q0 53 38 91l681 681q39 -98 114.5 -173.5t173.5 -114.5zM1662 919q0 -39 -23 -106q-47 -134 -164.5 -217.5 t-258.5 -83.5q-185 0 -316.5 131.5t-131.5 316.5t131.5 316.5t316.5 131.5q58 0 121.5 -16.5t107.5 -46.5q16 -11 16 -28t-16 -28l-293 -169v-224l193 -107q5 3 79 48.5t135.5 81t70.5 35.5q15 0 23.5 -10t8.5 -25z" />
+<glyph unicode="&#xf0ae;" horiz-adv-x="1792" d="M1024 128h640v128h-640v-128zM640 640h1024v128h-1024v-128zM1280 1152h384v128h-384v-128zM1792 320v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 832v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19 t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 1344v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0b0;" horiz-adv-x="1408" d="M1403 1241q17 -41 -14 -70l-493 -493v-742q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-256 256q-19 19 -19 45v486l-493 493q-31 29 -14 70q17 39 59 39h1280q42 0 59 -39z" />
+<glyph unicode="&#xf0b1;" horiz-adv-x="1792" d="M640 1280h512v128h-512v-128zM1792 640v-480q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v480h672v-160q0 -26 19 -45t45 -19h320q26 0 45 19t19 45v160h672zM1024 640v-128h-256v128h256zM1792 1120v-384h-1792v384q0 66 47 113t113 47h352v160q0 40 28 68 t68 28h576q40 0 68 -28t28 -68v-160h352q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf0b2;" d="M1283 995l-355 -355l355 -355l144 144q29 31 70 14q39 -17 39 -59v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l144 144l-355 355l-355 -355l144 -144q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l144 -144 l355 355l-355 355l-144 -144q-19 -19 -45 -19q-12 0 -24 5q-40 17 -40 59v448q0 26 19 45t45 19h448q42 0 59 -40q17 -39 -14 -69l-144 -144l355 -355l355 355l-144 144q-31 30 -14 69q17 40 59 40h448q26 0 45 -19t19 -45v-448q0 -42 -39 -59q-13 -5 -25 -5q-26 0 -45 19z " />
+<glyph unicode="&#xf0c0;" horiz-adv-x="1920" d="M593 640q-162 -5 -265 -128h-134q-82 0 -138 40.5t-56 118.5q0 353 124 353q6 0 43.5 -21t97.5 -42.5t119 -21.5q67 0 133 23q-5 -37 -5 -66q0 -139 81 -256zM1664 3q0 -120 -73 -189.5t-194 -69.5h-874q-121 0 -194 69.5t-73 189.5q0 53 3.5 103.5t14 109t26.5 108.5 t43 97.5t62 81t85.5 53.5t111.5 20q10 0 43 -21.5t73 -48t107 -48t135 -21.5t135 21.5t107 48t73 48t43 21.5q61 0 111.5 -20t85.5 -53.5t62 -81t43 -97.5t26.5 -108.5t14 -109t3.5 -103.5zM640 1280q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75 t75 -181zM1344 896q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5zM1920 671q0 -78 -56 -118.5t-138 -40.5h-134q-103 123 -265 128q81 117 81 256q0 29 -5 66q66 -23 133 -23q59 0 119 21.5t97.5 42.5 t43.5 21q124 0 124 -353zM1792 1280q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181z" />
+<glyph unicode="&#xf0c1;" horiz-adv-x="1664" d="M1456 320q0 40 -28 68l-208 208q-28 28 -68 28q-42 0 -72 -32q3 -3 19 -18.5t21.5 -21.5t15 -19t13 -25.5t3.5 -27.5q0 -40 -28 -68t-68 -28q-15 0 -27.5 3.5t-25.5 13t-19 15t-21.5 21.5t-18.5 19q-33 -31 -33 -73q0 -40 28 -68l206 -207q27 -27 68 -27q40 0 68 26 l147 146q28 28 28 67zM753 1025q0 40 -28 68l-206 207q-28 28 -68 28q-39 0 -68 -27l-147 -146q-28 -28 -28 -67q0 -40 28 -68l208 -208q27 -27 68 -27q42 0 72 31q-3 3 -19 18.5t-21.5 21.5t-15 19t-13 25.5t-3.5 27.5q0 40 28 68t68 28q15 0 27.5 -3.5t25.5 -13t19 -15 t21.5 -21.5t18.5 -19q33 31 33 73zM1648 320q0 -120 -85 -203l-147 -146q-83 -83 -203 -83q-121 0 -204 85l-206 207q-83 83 -83 203q0 123 88 209l-88 88q-86 -88 -208 -88q-120 0 -204 84l-208 208q-84 84 -84 204t85 203l147 146q83 83 203 83q121 0 204 -85l206 -207 q83 -83 83 -203q0 -123 -88 -209l88 -88q86 88 208 88q120 0 204 -84l208 -208q84 -84 84 -204z" />
+<glyph unicode="&#xf0c2;" horiz-adv-x="1920" d="M1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088q-185 0 -316.5 131.5t-131.5 316.5q0 132 71 241.5t187 163.5q-2 28 -2 43q0 212 150 362t362 150q158 0 286.5 -88t187.5 -230q70 62 166 62q106 0 181 -75t75 -181q0 -75 -41 -138q129 -30 213 -134.5t84 -239.5z " />
+<glyph unicode="&#xf0c3;" horiz-adv-x="1664" d="M1527 88q56 -89 21.5 -152.5t-140.5 -63.5h-1152q-106 0 -140.5 63.5t21.5 152.5l503 793v399h-64q-26 0 -45 19t-19 45t19 45t45 19h512q26 0 45 -19t19 -45t-19 -45t-45 -19h-64v-399zM748 813l-272 -429h712l-272 429l-20 31v37v399h-128v-399v-37z" />
+<glyph unicode="&#xf0c4;" horiz-adv-x="1792" d="M960 640q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1260 576l507 -398q28 -20 25 -56q-5 -35 -35 -51l-128 -64q-13 -7 -29 -7q-17 0 -31 8l-690 387l-110 -66q-8 -4 -12 -5q14 -49 10 -97q-7 -77 -56 -147.5t-132 -123.5q-132 -84 -277 -84 q-136 0 -222 78q-90 84 -79 207q7 76 56 147t131 124q132 84 278 84q83 0 151 -31q9 13 22 22l122 73l-122 73q-13 9 -22 22q-68 -31 -151 -31q-146 0 -278 84q-82 53 -131 124t-56 147q-5 59 15.5 113t63.5 93q85 79 222 79q145 0 277 -84q83 -52 132 -123t56 -148 q4 -48 -10 -97q4 -1 12 -5l110 -66l690 387q14 8 31 8q16 0 29 -7l128 -64q30 -16 35 -51q3 -36 -25 -56zM579 836q46 42 21 108t-106 117q-92 59 -192 59q-74 0 -113 -36q-46 -42 -21 -108t106 -117q92 -59 192 -59q74 0 113 36zM494 91q81 51 106 117t-21 108 q-39 36 -113 36q-100 0 -192 -59q-81 -51 -106 -117t21 -108q39 -36 113 -36q100 0 192 59zM672 704l96 -58v11q0 36 33 56l14 8l-79 47l-26 -26q-3 -3 -10 -11t-12 -12q-2 -2 -4 -3.5t-3 -2.5zM896 480l96 -32l736 576l-128 64l-768 -431v-113l-160 -96l9 -8q2 -2 7 -6 q4 -4 11 -12t11 -12l26 -26zM1600 64l128 64l-520 408l-177 -138q-2 -3 -13 -7z" />
+<glyph unicode="&#xf0c5;" horiz-adv-x="1792" d="M1696 1152q40 0 68 -28t28 -68v-1216q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v288h-544q-40 0 -68 28t-28 68v672q0 40 20 88t48 76l408 408q28 28 76 48t88 20h416q40 0 68 -28t28 -68v-328q68 40 128 40h416zM1152 939l-299 -299h299v299zM512 1323l-299 -299 h299v299zM708 676l316 316v416h-384v-416q0 -40 -28 -68t-68 -28h-416v-640h512v256q0 40 20 88t48 76zM1664 -128v1152h-384v-416q0 -40 -28 -68t-68 -28h-416v-640h896z" />
+<glyph unicode="&#xf0c6;" horiz-adv-x="1408" d="M1404 151q0 -117 -79 -196t-196 -79q-135 0 -235 100l-777 776q-113 115 -113 271q0 159 110 270t269 111q158 0 273 -113l605 -606q10 -10 10 -22q0 -16 -30.5 -46.5t-46.5 -30.5q-13 0 -23 10l-606 607q-79 77 -181 77q-106 0 -179 -75t-73 -181q0 -105 76 -181 l776 -777q63 -63 145 -63q64 0 106 42t42 106q0 82 -63 145l-581 581q-26 24 -60 24q-29 0 -48 -19t-19 -48q0 -32 25 -59l410 -410q10 -10 10 -22q0 -16 -31 -47t-47 -31q-12 0 -22 10l-410 410q-63 61 -63 149q0 82 57 139t139 57q88 0 149 -63l581 -581q100 -98 100 -235 z" />
+<glyph unicode="&#xf0c7;" d="M384 0h768v384h-768v-384zM1280 0h128v896q0 14 -10 38.5t-20 34.5l-281 281q-10 10 -34 20t-39 10v-416q0 -40 -28 -68t-68 -28h-576q-40 0 -68 28t-28 68v416h-128v-1280h128v416q0 40 28 68t68 28h832q40 0 68 -28t28 -68v-416zM896 928v320q0 13 -9.5 22.5t-22.5 9.5 h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5zM1536 896v-928q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h928q40 0 88 -20t76 -48l280 -280q28 -28 48 -76t20 -88z" />
+<glyph unicode="&#xf0c8;" d="M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf0c9;" d="M1536 192v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1536 704v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1536 1216v-128q0 -26 -19 -45 t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0ca;" horiz-adv-x="1792" d="M384 128q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM384 640q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5 t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5zM384 1152q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1792 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z M1792 1248v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z" />
+<glyph unicode="&#xf0cb;" horiz-adv-x="1792" d="M381 -84q0 -80 -54.5 -126t-135.5 -46q-106 0 -172 66l57 88q49 -45 106 -45q29 0 50.5 14.5t21.5 42.5q0 64 -105 56l-26 56q8 10 32.5 43.5t42.5 54t37 38.5v1q-16 0 -48.5 -1t-48.5 -1v-53h-106v152h333v-88l-95 -115q51 -12 81 -49t30 -88zM383 543v-159h-362 q-6 36 -6 54q0 51 23.5 93t56.5 68t66 47.5t56.5 43.5t23.5 45q0 25 -14.5 38.5t-39.5 13.5q-46 0 -81 -58l-85 59q24 51 71.5 79.5t105.5 28.5q73 0 123 -41.5t50 -112.5q0 -50 -34 -91.5t-75 -64.5t-75.5 -50.5t-35.5 -52.5h127v60h105zM1792 224v-192q0 -13 -9.5 -22.5 t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 14 9 23t23 9h1216q13 0 22.5 -9.5t9.5 -22.5zM384 1123v-99h-335v99h107q0 41 0.5 122t0.5 121v12h-2q-8 -17 -50 -54l-71 76l136 127h106v-404h108zM1792 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5 t-9.5 22.5v192q0 14 9 23t23 9h1216q13 0 22.5 -9.5t9.5 -22.5zM1792 1248v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z" />
+<glyph unicode="&#xf0cc;" horiz-adv-x="1792" d="M1760 640q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1728q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h1728zM483 704q-28 35 -51 80q-48 97 -48 188q0 181 134 309q133 127 393 127q50 0 167 -19q66 -12 177 -48q10 -38 21 -118q14 -123 14 -183q0 -18 -5 -45l-12 -3l-84 6 l-14 2q-50 149 -103 205q-88 91 -210 91q-114 0 -182 -59q-67 -58 -67 -146q0 -73 66 -140t279 -129q69 -20 173 -66q58 -28 95 -52h-743zM990 448h411q7 -39 7 -92q0 -111 -41 -212q-23 -55 -71 -104q-37 -35 -109 -81q-80 -48 -153 -66q-80 -21 -203 -21q-114 0 -195 23 l-140 40q-57 16 -72 28q-8 8 -8 22v13q0 108 -2 156q-1 30 0 68l2 37v44l102 2q15 -34 30 -71t22.5 -56t12.5 -27q35 -57 80 -94q43 -36 105 -57q59 -22 132 -22q64 0 139 27q77 26 122 86q47 61 47 129q0 84 -81 157q-34 29 -137 71z" />
+<glyph unicode="&#xf0cd;" d="M48 1313q-37 2 -45 4l-3 88q13 1 40 1q60 0 112 -4q132 -7 166 -7q86 0 168 3q116 4 146 5q56 0 86 2l-1 -14l2 -64v-9q-60 -9 -124 -9q-60 0 -79 -25q-13 -14 -13 -132q0 -13 0.5 -32.5t0.5 -25.5l1 -229l14 -280q6 -124 51 -202q35 -59 96 -92q88 -47 177 -47 q104 0 191 28q56 18 99 51q48 36 65 64q36 56 53 114q21 73 21 229q0 79 -3.5 128t-11 122.5t-13.5 159.5l-4 59q-5 67 -24 88q-34 35 -77 34l-100 -2l-14 3l2 86h84l205 -10q76 -3 196 10l18 -2q6 -38 6 -51q0 -7 -4 -31q-45 -12 -84 -13q-73 -11 -79 -17q-15 -15 -15 -41 q0 -7 1.5 -27t1.5 -31q8 -19 22 -396q6 -195 -15 -304q-15 -76 -41 -122q-38 -65 -112 -123q-75 -57 -182 -89q-109 -33 -255 -33q-167 0 -284 46q-119 47 -179 122q-61 76 -83 195q-16 80 -16 237v333q0 188 -17 213q-25 36 -147 39zM1536 -96v64q0 14 -9 23t-23 9h-1472 q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h1472q14 0 23 9t9 23z" />
+<glyph unicode="&#xf0ce;" horiz-adv-x="1664" d="M512 160v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM512 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 160v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23 v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM512 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 160v192 q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192 q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1664 1248v-1088q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1344q66 0 113 -47t47 -113 z" />
+<glyph unicode="&#xf0d0;" horiz-adv-x="1664" d="M1190 955l293 293l-107 107l-293 -293zM1637 1248q0 -27 -18 -45l-1286 -1286q-18 -18 -45 -18t-45 18l-198 198q-18 18 -18 45t18 45l1286 1286q18 18 45 18t45 -18l198 -198q18 -18 18 -45zM286 1438l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98zM636 1276 l196 -60l-196 -60l-60 -196l-60 196l-196 60l196 60l60 196zM1566 798l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98zM926 1438l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98z" />
+<glyph unicode="&#xf0d1;" horiz-adv-x="1792" d="M640 128q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM256 640h384v256h-158q-13 0 -22 -9l-195 -195q-9 -9 -9 -22v-30zM1536 128q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM1792 1216v-1024q0 -15 -4 -26.5t-13.5 -18.5 t-16.5 -11.5t-23.5 -6t-22.5 -2t-25.5 0t-22.5 0.5q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-64q-3 0 -22.5 -0.5t-25.5 0t-22.5 2t-23.5 6t-16.5 11.5t-13.5 18.5t-4 26.5q0 26 19 45t45 19v320q0 8 -0.5 35t0 38 t2.5 34.5t6.5 37t14 30.5t22.5 30l198 198q19 19 50.5 32t58.5 13h160v192q0 26 19 45t45 19h1024q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0d2;" d="M1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103q-111 0 -218 32q59 93 78 164q9 34 54 211q20 -39 73 -67.5t114 -28.5q121 0 216 68.5t147 188.5t52 270q0 114 -59.5 214t-172.5 163t-255 63q-105 0 -196 -29t-154.5 -77t-109 -110.5t-67 -129.5t-21.5 -134 q0 -104 40 -183t117 -111q30 -12 38 20q2 7 8 31t8 30q6 23 -11 43q-51 61 -51 151q0 151 104.5 259.5t273.5 108.5q151 0 235.5 -82t84.5 -213q0 -170 -68.5 -289t-175.5 -119q-61 0 -98 43.5t-23 104.5q8 35 26.5 93.5t30 103t11.5 75.5q0 50 -27 83t-77 33 q-62 0 -105 -57t-43 -142q0 -73 25 -122l-99 -418q-17 -70 -13 -177q-206 91 -333 281t-127 423q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf0d3;" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-725q85 122 108 210q9 34 53 209q21 -39 73.5 -67t112.5 -28q181 0 295.5 147.5t114.5 373.5q0 84 -35 162.5t-96.5 139t-152.5 97t-197 36.5q-104 0 -194.5 -28.5t-153 -76.5 t-107.5 -109.5t-66.5 -128t-21.5 -132.5q0 -102 39.5 -180t116.5 -110q13 -5 23.5 0t14.5 19q10 44 15 61q6 23 -11 42q-50 62 -50 150q0 150 103.5 256.5t270.5 106.5q149 0 232.5 -81t83.5 -210q0 -168 -67.5 -286t-173.5 -118q-60 0 -97 43.5t-23 103.5q8 34 26.5 92.5 t29.5 102t11 74.5q0 49 -26.5 81.5t-75.5 32.5q-61 0 -103.5 -56.5t-42.5 -139.5q0 -72 24 -121l-98 -414q-24 -100 -7 -254h-183q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960z" />
+<glyph unicode="&#xf0d4;" d="M678 -57q0 -38 -10 -71h-380q-95 0 -171.5 56.5t-103.5 147.5q24 45 69 77.5t100 49.5t107 24t107 7q32 0 49 -2q6 -4 30.5 -21t33 -23t31 -23t32 -25.5t27.5 -25.5t26.5 -29.5t21 -30.5t17.5 -34.5t9.5 -36t4.5 -40.5zM385 294q-234 -7 -385 -85v433q103 -118 273 -118 q32 0 70 5q-21 -61 -21 -86q0 -67 63 -149zM558 805q0 -100 -43.5 -160.5t-140.5 -60.5q-51 0 -97 26t-78 67.5t-56 93.5t-35.5 104t-11.5 99q0 96 51.5 165t144.5 69q66 0 119 -41t84 -104t47 -130t16 -128zM1536 896v-736q0 -119 -84.5 -203.5t-203.5 -84.5h-468 q39 73 39 157q0 66 -22 122.5t-55.5 93t-72 71t-72 59.5t-55.5 54.5t-22 59.5q0 36 23 68t56 61.5t65.5 64.5t55.5 93t23 131t-26.5 145.5t-75.5 118.5q-6 6 -14 11t-12.5 7.5t-10 9.5t-10.5 17h135l135 64h-437q-138 0 -244.5 -38.5t-182.5 -133.5q0 126 81 213t207 87h960 q119 0 203.5 -84.5t84.5 -203.5v-96h-256v256h-128v-256h-256v-128h256v-256h128v256h256z" />
+<glyph unicode="&#xf0d5;" horiz-adv-x="1664" d="M876 71q0 21 -4.5 40.5t-9.5 36t-17.5 34.5t-21 30.5t-26.5 29.5t-27.5 25.5t-32 25.5t-31 23t-33 23t-30.5 21q-17 2 -50 2q-54 0 -106 -7t-108 -25t-98 -46t-69 -75t-27 -107q0 -68 35.5 -121.5t93 -84t120.5 -45.5t127 -15q59 0 112.5 12.5t100.5 39t74.5 73.5 t27.5 110zM756 933q0 60 -16.5 127.5t-47 130.5t-84 104t-119.5 41q-93 0 -144 -69t-51 -165q0 -47 11.5 -99t35.5 -104t56 -93.5t78 -67.5t97 -26q97 0 140.5 60.5t43.5 160.5zM625 1408h437l-135 -79h-135q71 -45 110 -126t39 -169q0 -74 -23 -131.5t-56 -92.5t-66 -64.5 t-56 -61t-23 -67.5q0 -26 16.5 -51t43 -48t58.5 -48t64 -55.5t58.5 -66t43 -85t16.5 -106.5q0 -160 -140 -282q-152 -131 -420 -131q-59 0 -119.5 10t-122 33.5t-108.5 58t-77 89t-30 121.5q0 61 37 135q32 64 96 110.5t145 71t155 36t150 13.5q-64 83 -64 149q0 12 2 23.5 t5 19.5t8 21.5t7 21.5q-40 -5 -70 -5q-149 0 -255.5 98t-106.5 246q0 140 95 250.5t234 141.5q94 20 187 20zM1664 1152v-128h-256v-256h-128v256h-256v128h256v256h128v-256h256z" />
+<glyph unicode="&#xf0d6;" horiz-adv-x="1920" d="M768 384h384v96h-128v448h-114l-148 -137l77 -80q42 37 55 57h2v-288h-128v-96zM1280 640q0 -70 -21 -142t-59.5 -134t-101.5 -101t-138 -39t-138 39t-101.5 101t-59.5 134t-21 142t21 142t59.5 134t101.5 101t138 39t138 -39t101.5 -101t59.5 -134t21 -142zM1792 384 v512q-106 0 -181 75t-75 181h-1152q0 -106 -75 -181t-181 -75v-512q106 0 181 -75t75 -181h1152q0 106 75 181t181 75zM1920 1216v-1152q0 -26 -19 -45t-45 -19h-1792q-26 0 -45 19t-19 45v1152q0 26 19 45t45 19h1792q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0d7;" horiz-adv-x="1024" d="M1024 832q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0d8;" horiz-adv-x="1024" d="M1024 320q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" />
+<glyph unicode="&#xf0d9;" horiz-adv-x="640" d="M640 1088v-896q0 -26 -19 -45t-45 -19t-45 19l-448 448q-19 19 -19 45t19 45l448 448q19 19 45 19t45 -19t19 -45z" />
+<glyph unicode="&#xf0da;" horiz-adv-x="640" d="M576 640q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19t-19 45v896q0 26 19 45t45 19t45 -19l448 -448q19 -19 19 -45z" />
+<glyph unicode="&#xf0db;" horiz-adv-x="1664" d="M160 0h608v1152h-640v-1120q0 -13 9.5 -22.5t22.5 -9.5zM1536 32v1120h-640v-1152h608q13 0 22.5 9.5t9.5 22.5zM1664 1248v-1216q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1344q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf0dc;" horiz-adv-x="1024" d="M1024 448q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45zM1024 832q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" />
+<glyph unicode="&#xf0dd;" horiz-adv-x="1024" d="M1024 448q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0de;" horiz-adv-x="1024" d="M1024 832q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" />
+<glyph unicode="&#xf0e0;" horiz-adv-x="1792" d="M1792 826v-794q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v794q44 -49 101 -87q362 -246 497 -345q57 -42 92.5 -65.5t94.5 -48t110 -24.5h1h1q51 0 110 24.5t94.5 48t92.5 65.5q170 123 498 345q57 39 100 87zM1792 1120q0 -79 -49 -151t-122 -123 q-376 -261 -468 -325q-10 -7 -42.5 -30.5t-54 -38t-52 -32.5t-57.5 -27t-50 -9h-1h-1q-23 0 -50 9t-57.5 27t-52 32.5t-54 38t-42.5 30.5q-91 64 -262 182.5t-205 142.5q-62 42 -117 115.5t-55 136.5q0 78 41.5 130t118.5 52h1472q65 0 112.5 -47t47.5 -113z" />
+<glyph unicode="&#xf0e1;" d="M349 911v-991h-330v991h330zM370 1217q1 -73 -50.5 -122t-135.5 -49h-2q-82 0 -132 49t-50 122q0 74 51.5 122.5t134.5 48.5t133 -48.5t51 -122.5zM1536 488v-568h-329v530q0 105 -40.5 164.5t-126.5 59.5q-63 0 -105.5 -34.5t-63.5 -85.5q-11 -30 -11 -81v-553h-329 q2 399 2 647t-1 296l-1 48h329v-144h-2q20 32 41 56t56.5 52t87 43.5t114.5 15.5q171 0 275 -113.5t104 -332.5z" />
+<glyph unicode="&#xf0e2;" d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61q-172 0 -327 72.5t-264 204.5q-7 10 -6.5 22.5t8.5 20.5l137 138q10 9 25 9q16 -2 23 -12q73 -95 179 -147t225 -52q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5 t-163.5 109.5t-198.5 40.5q-98 0 -188 -35.5t-160 -101.5l137 -138q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l130 -129q107 101 244.5 156.5t284.5 55.5q156 0 298 -61t245 -164t164 -245t61 -298z" />
+<glyph unicode="&#xf0e3;" horiz-adv-x="1792" d="M1771 0q0 -53 -37 -90l-107 -108q-39 -37 -91 -37q-53 0 -90 37l-363 364q-38 36 -38 90q0 53 43 96l-256 256l-126 -126q-14 -14 -34 -14t-34 14q2 -2 12.5 -12t12.5 -13t10 -11.5t10 -13.5t6 -13.5t5.5 -16.5t1.5 -18q0 -38 -28 -68q-3 -3 -16.5 -18t-19 -20.5 t-18.5 -16.5t-22 -15.5t-22 -9t-26 -4.5q-40 0 -68 28l-408 408q-28 28 -28 68q0 13 4.5 26t9 22t15.5 22t16.5 18.5t20.5 19t18 16.5q30 28 68 28q10 0 18 -1.5t16.5 -5.5t13.5 -6t13.5 -10t11.5 -10t13 -12.5t12 -12.5q-14 14 -14 34t14 34l348 348q14 14 34 14t34 -14 q-2 2 -12.5 12t-12.5 13t-10 11.5t-10 13.5t-6 13.5t-5.5 16.5t-1.5 18q0 38 28 68q3 3 16.5 18t19 20.5t18.5 16.5t22 15.5t22 9t26 4.5q40 0 68 -28l408 -408q28 -28 28 -68q0 -13 -4.5 -26t-9 -22t-15.5 -22t-16.5 -18.5t-20.5 -19t-18 -16.5q-30 -28 -68 -28 q-10 0 -18 1.5t-16.5 5.5t-13.5 6t-13.5 10t-11.5 10t-13 12.5t-12 12.5q14 -14 14 -34t-14 -34l-126 -126l256 -256q43 43 96 43q52 0 91 -37l363 -363q37 -39 37 -91z" />
+<glyph unicode="&#xf0e4;" horiz-adv-x="1792" d="M384 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM576 832q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1004 351l101 382q6 26 -7.5 48.5t-38.5 29.5 t-48 -6.5t-30 -39.5l-101 -382q-60 -5 -107 -43.5t-63 -98.5q-20 -77 20 -146t117 -89t146 20t89 117q16 60 -6 117t-72 91zM1664 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 1024q0 53 -37.5 90.5 t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1472 832q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1792 384q0 -261 -141 -483q-19 -29 -54 -29h-1402q-35 0 -54 29 q-141 221 -141 483q0 182 71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
+<glyph unicode="&#xf0e5;" horiz-adv-x="1792" d="M896 1152q-204 0 -381.5 -69.5t-282 -187.5t-104.5 -255q0 -112 71.5 -213.5t201.5 -175.5l87 -50l-27 -96q-24 -91 -70 -172q152 63 275 171l43 38l57 -6q69 -8 130 -8q204 0 381.5 69.5t282 187.5t104.5 255t-104.5 255t-282 187.5t-381.5 69.5zM1792 640 q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22h-5q-15 0 -27 10.5t-16 27.5v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281q0 174 120 321.5 t326 233t450 85.5t450 -85.5t326 -233t120 -321.5z" />
+<glyph unicode="&#xf0e6;" horiz-adv-x="1792" d="M704 1152q-153 0 -286 -52t-211.5 -141t-78.5 -191q0 -82 53 -158t149 -132l97 -56l-35 -84q34 20 62 39l44 31l53 -10q78 -14 153 -14q153 0 286 52t211.5 141t78.5 191t-78.5 191t-211.5 141t-286 52zM704 1280q191 0 353.5 -68.5t256.5 -186.5t94 -257t-94 -257 t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224q0 139 94 257t256.5 186.5 t353.5 68.5zM1526 111q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132q58 -4 88 -4q161 0 309 45t264 129 q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230q0 -120 -71 -224.5t-195 -176.5z" />
+<glyph unicode="&#xf0e7;" horiz-adv-x="896" d="M885 970q18 -20 7 -44l-540 -1157q-13 -25 -42 -25q-4 0 -14 2q-17 5 -25.5 19t-4.5 30l197 808l-406 -101q-4 -1 -12 -1q-18 0 -31 11q-18 15 -13 39l201 825q4 14 16 23t28 9h328q19 0 32 -12.5t13 -29.5q0 -8 -5 -18l-171 -463l396 98q8 2 12 2q19 0 34 -15z" />
+<glyph unicode="&#xf0e8;" horiz-adv-x="1792" d="M1792 288v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320 q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192q0 52 38 90t90 38h512v192h-96q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-96v-192h512q52 0 90 -38t38 -90v-192h96q40 0 68 -28t28 -68 z" />
+<glyph unicode="&#xf0e9;" horiz-adv-x="1664" d="M896 708v-580q0 -104 -76 -180t-180 -76t-180 76t-76 180q0 26 19 45t45 19t45 -19t19 -45q0 -50 39 -89t89 -39t89 39t39 89v580q33 11 64 11t64 -11zM1664 681q0 -13 -9.5 -22.5t-22.5 -9.5q-11 0 -23 10q-49 46 -93 69t-102 23q-68 0 -128 -37t-103 -97 q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -28 -17q-18 0 -29 17q-4 6 -14.5 24t-17.5 28q-43 60 -102.5 97t-127.5 37t-127.5 -37t-102.5 -97q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -29 -17q-17 0 -28 17q-4 6 -14.5 24t-17.5 28q-43 60 -103 97t-128 37q-58 0 -102 -23t-93 -69 q-12 -10 -23 -10q-13 0 -22.5 9.5t-9.5 22.5q0 5 1 7q45 183 172.5 319.5t298 204.5t360.5 68q140 0 274.5 -40t246.5 -113.5t194.5 -187t115.5 -251.5q1 -2 1 -7zM896 1408v-98q-42 2 -64 2t-64 -2v98q0 26 19 45t45 19t45 -19t19 -45z" />
+<glyph unicode="&#xf0ea;" horiz-adv-x="1792" d="M768 -128h896v640h-416q-40 0 -68 28t-28 68v416h-384v-1152zM1024 1312v64q0 13 -9.5 22.5t-22.5 9.5h-704q-13 0 -22.5 -9.5t-9.5 -22.5v-64q0 -13 9.5 -22.5t22.5 -9.5h704q13 0 22.5 9.5t9.5 22.5zM1280 640h299l-299 299v-299zM1792 512v-672q0 -40 -28 -68t-68 -28 h-960q-40 0 -68 28t-28 68v160h-544q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h1088q40 0 68 -28t28 -68v-328q21 -13 36 -28l408 -408q28 -28 48 -76t20 -88z" />
+<glyph unicode="&#xf0eb;" horiz-adv-x="1024" d="M736 960q0 -13 -9.5 -22.5t-22.5 -9.5t-22.5 9.5t-9.5 22.5q0 46 -54 71t-106 25q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5q50 0 99.5 -16t87 -54t37.5 -90zM896 960q0 72 -34.5 134t-90 101.5t-123 62t-136.5 22.5t-136.5 -22.5t-123 -62t-90 -101.5t-34.5 -134 q0 -101 68 -180q10 -11 30.5 -33t30.5 -33q128 -153 141 -298h228q13 145 141 298q10 11 30.5 33t30.5 33q68 79 68 180zM1024 960q0 -155 -103 -268q-45 -49 -74.5 -87t-59.5 -95.5t-34 -107.5q47 -28 47 -82q0 -37 -25 -64q25 -27 25 -64q0 -52 -45 -81q13 -23 13 -47 q0 -46 -31.5 -71t-77.5 -25q-20 -44 -60 -70t-87 -26t-87 26t-60 70q-46 0 -77.5 25t-31.5 71q0 24 13 47q-45 29 -45 81q0 37 25 64q-25 27 -25 64q0 54 47 82q-4 50 -34 107.5t-59.5 95.5t-74.5 87q-103 113 -103 268q0 99 44.5 184.5t117 142t164 89t186.5 32.5 t186.5 -32.5t164 -89t117 -142t44.5 -184.5z" />
+<glyph unicode="&#xf0ec;" horiz-adv-x="1792" d="M1792 352v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5q-12 0 -24 10l-319 320q-9 9 -9 22q0 14 9 23l320 320q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-192h1376q13 0 22.5 -9.5t9.5 -22.5zM1792 896q0 -14 -9 -23l-320 -320q-9 -9 -23 -9 q-13 0 -22.5 9.5t-9.5 22.5v192h-1376q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1376v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23z" />
+<glyph unicode="&#xf0ed;" horiz-adv-x="1920" d="M1280 608q0 14 -9 23t-23 9h-224v352q0 13 -9.5 22.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-352h-224q-13 0 -22.5 -9.5t-9.5 -22.5q0 -14 9 -23l352 -352q9 -9 23 -9t23 9l351 351q10 12 10 24zM1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088 q-185 0 -316.5 131.5t-131.5 316.5q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5z" />
+<glyph unicode="&#xf0ee;" horiz-adv-x="1920" d="M1280 672q0 14 -9 23l-352 352q-9 9 -23 9t-23 -9l-351 -351q-10 -12 -10 -24q0 -14 9 -23t23 -9h224v-352q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5v352h224q13 0 22.5 9.5t9.5 22.5zM1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088 q-185 0 -316.5 131.5t-131.5 316.5q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5z" />
+<glyph unicode="&#xf0f0;" horiz-adv-x="1408" d="M384 192q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45t45 19t45 -19t19 -45zM1408 131q0 -121 -73 -190t-194 -69h-874q-121 0 -194 69t-73 190q0 68 5.5 131t24 138t47.5 132.5t81 103t120 60.5q-22 -52 -22 -120v-203q-58 -20 -93 -70t-35 -111q0 -80 56 -136t136 -56 t136 56t56 136q0 61 -35.5 111t-92.5 70v203q0 62 25 93q132 -104 295 -104t295 104q25 -31 25 -93v-64q-106 0 -181 -75t-75 -181v-89q-32 -29 -32 -71q0 -40 28 -68t68 -28t68 28t28 68q0 42 -32 71v89q0 52 38 90t90 38t90 -38t38 -90v-89q-32 -29 -32 -71q0 -40 28 -68 t68 -28t68 28t28 68q0 42 -32 71v89q0 68 -34.5 127.5t-93.5 93.5q0 10 0.5 42.5t0 48t-2.5 41.5t-7 47t-13 40q68 -15 120 -60.5t81 -103t47.5 -132.5t24 -138t5.5 -131zM1088 1024q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5 t271.5 -112.5t112.5 -271.5z" />
+<glyph unicode="&#xf0f1;" horiz-adv-x="1408" d="M1280 832q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 832q0 -62 -35.5 -111t-92.5 -70v-395q0 -159 -131.5 -271.5t-316.5 -112.5t-316.5 112.5t-131.5 271.5v132q-164 20 -274 128t-110 252v512q0 26 19 45t45 19q6 0 16 -2q17 30 47 48 t65 18q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5q-33 0 -64 18v-402q0 -106 94 -181t226 -75t226 75t94 181v402q-31 -18 -64 -18q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5q35 0 65 -18t47 -48q10 2 16 2q26 0 45 -19t19 -45v-512q0 -144 -110 -252 t-274 -128v-132q0 -106 94 -181t226 -75t226 75t94 181v395q-57 21 -92.5 70t-35.5 111q0 80 56 136t136 56t136 -56t56 -136z" />
+<glyph unicode="&#xf0f2;" horiz-adv-x="1792" d="M640 1152h512v128h-512v-128zM288 1152v-1280h-64q-92 0 -158 66t-66 158v832q0 92 66 158t158 66h64zM1408 1152v-1280h-1024v1280h128v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h128zM1792 928v-832q0 -92 -66 -158t-158 -66h-64v1280h64q92 0 158 -66 t66 -158z" />
+<glyph unicode="&#xf0f3;" horiz-adv-x="1664" d="M848 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM1664 128q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38t-38 90q190 161 287 397.5t97 498.5 q0 165 96 262t264 117q-8 18 -8 37q0 40 28 68t68 28t68 -28t28 -68q0 -19 -8 -37q168 -20 264 -117t96 -262q0 -262 97 -498.5t287 -397.5z" />
+<glyph unicode="&#xf0f4;" horiz-adv-x="1920" d="M1664 896q0 80 -56 136t-136 56h-64v-384h64q80 0 136 56t56 136zM0 128h1792q0 -106 -75 -181t-181 -75h-1280q-106 0 -181 75t-75 181zM1856 896q0 -159 -112.5 -271.5t-271.5 -112.5h-64v-32q0 -92 -66 -158t-158 -66h-704q-92 0 -158 66t-66 158v736q0 26 19 45 t45 19h1152q159 0 271.5 -112.5t112.5 -271.5z" />
+<glyph unicode="&#xf0f5;" horiz-adv-x="1408" d="M640 1472v-640q0 -61 -35.5 -111t-92.5 -70v-779q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v779q-57 20 -92.5 70t-35.5 111v640q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45 t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45zM1408 1472v-1600q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v512h-224q-13 0 -22.5 9.5t-9.5 22.5v800q0 132 94 226t226 94h256q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0f6;" horiz-adv-x="1280" d="M1024 352v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704q14 0 23 -9t9 -23zM1024 608v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704q14 0 23 -9t9 -23zM128 0h1024v768h-416q-40 0 -68 28t-28 68v416h-512v-1280z M768 896h376q-10 29 -22 41l-313 313q-12 12 -41 22v-376zM1280 864v-896q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h640q40 0 88 -20t76 -48l312 -312q28 -28 48 -76t20 -88z" />
+<glyph unicode="&#xf0f7;" horiz-adv-x="1408" d="M384 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 -128h384v1536h-1152v-1536h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224zM1408 1472v-1664q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1664q0 26 19 45t45 19h1280q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0f8;" horiz-adv-x="1408" d="M384 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 -128h384v1152h-256v-32q0 -40 -28 -68t-68 -28h-448q-40 0 -68 28t-28 68v32h-256v-1152h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224zM896 1056v320q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-96h-128v96q0 13 -9.5 22.5 t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5v96h128v-96q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1408 1088v-1280q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1280q0 26 19 45t45 19h320 v288q0 40 28 68t68 28h448q40 0 68 -28t28 -68v-288h320q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0f9;" horiz-adv-x="1920" d="M640 128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM256 640h384v256h-158q-14 -2 -22 -9l-195 -195q-7 -12 -9 -22v-30zM1536 128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5 t90.5 37.5t37.5 90.5zM1664 800v192q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v224h224q14 0 23 9t9 23zM1920 1344v-1152 q0 -26 -19 -45t-45 -19h-192q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-128q-26 0 -45 19t-19 45t19 45t45 19v416q0 26 13 58t32 51l198 198q19 19 51 32t58 13h160v320q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0fa;" horiz-adv-x="1792" d="M1280 416v192q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v224h224q14 0 23 9t9 23zM640 1152h512v128h-512v-128zM256 1152v-1280h-32 q-92 0 -158 66t-66 158v832q0 92 66 158t158 66h32zM1440 1152v-1280h-1088v1280h160v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h160zM1792 928v-832q0 -92 -66 -158t-158 -66h-32v1280h32q92 0 158 -66t66 -158z" />
+<glyph unicode="&#xf0fb;" horiz-adv-x="1920" d="M1920 576q-1 -32 -288 -96l-352 -32l-224 -64h-64l-293 -352h69q26 0 45 -4.5t19 -11.5t-19 -11.5t-45 -4.5h-96h-160h-64v32h64v416h-160l-192 -224h-96l-32 32v192h32v32h128v8l-192 24v128l192 24v8h-128v32h-32v192l32 32h96l192 -224h160v416h-64v32h64h160h96 q26 0 45 -4.5t19 -11.5t-19 -11.5t-45 -4.5h-69l293 -352h64l224 -64l352 -32q261 -58 287 -93z" />
+<glyph unicode="&#xf0fc;" horiz-adv-x="1664" d="M640 640v384h-256v-256q0 -53 37.5 -90.5t90.5 -37.5h128zM1664 192v-192h-1152v192l128 192h-128q-159 0 -271.5 112.5t-112.5 271.5v320l-64 64l32 128h480l32 128h960l32 -192l-64 -32v-800z" />
+<glyph unicode="&#xf0fd;" d="M1280 192v896q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-512v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-896q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h512v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf0fe;" d="M1280 576v128q0 26 -19 45t-45 19h-320v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-320q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h320v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h320q26 0 45 19t19 45zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf100;" horiz-adv-x="1024" d="M627 160q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23zM1011 160q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23 t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23z" />
+<glyph unicode="&#xf101;" horiz-adv-x="1024" d="M595 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23zM979 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23 l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
+<glyph unicode="&#xf102;" horiz-adv-x="1152" d="M1075 224q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23zM1075 608q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393 q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
+<glyph unicode="&#xf103;" horiz-adv-x="1152" d="M1075 672q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23zM1075 1056q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23 t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" />
+<glyph unicode="&#xf104;" horiz-adv-x="640" d="M627 992q0 -13 -10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" />
+<glyph unicode="&#xf105;" horiz-adv-x="640" d="M595 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
+<glyph unicode="&#xf106;" horiz-adv-x="1152" d="M1075 352q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
+<glyph unicode="&#xf107;" horiz-adv-x="1152" d="M1075 800q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" />
+<glyph unicode="&#xf108;" horiz-adv-x="1920" d="M1792 544v832q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-832q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5zM1920 1376v-1088q0 -66 -47 -113t-113 -47h-544q0 -37 16 -77.5t32 -71t16 -43.5q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19 t-19 45q0 14 16 44t32 70t16 78h-544q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf109;" horiz-adv-x="1920" d="M416 256q-66 0 -113 47t-47 113v704q0 66 47 113t113 47h1088q66 0 113 -47t47 -113v-704q0 -66 -47 -113t-113 -47h-1088zM384 1120v-704q0 -13 9.5 -22.5t22.5 -9.5h1088q13 0 22.5 9.5t9.5 22.5v704q0 13 -9.5 22.5t-22.5 9.5h-1088q-13 0 -22.5 -9.5t-9.5 -22.5z M1760 192h160v-96q0 -40 -47 -68t-113 -28h-1600q-66 0 -113 28t-47 68v96h160h1600zM1040 96q16 0 16 16t-16 16h-160q-16 0 -16 -16t16 -16h160z" />
+<glyph unicode="&#xf10a;" horiz-adv-x="1152" d="M640 128q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1024 288v960q0 13 -9.5 22.5t-22.5 9.5h-832q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h832q13 0 22.5 9.5t9.5 22.5zM1152 1248v-1088q0 -66 -47 -113t-113 -47h-832 q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h832q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf10b;" horiz-adv-x="768" d="M464 128q0 33 -23.5 56.5t-56.5 23.5t-56.5 -23.5t-23.5 -56.5t23.5 -56.5t56.5 -23.5t56.5 23.5t23.5 56.5zM672 288v704q0 13 -9.5 22.5t-22.5 9.5h-512q-13 0 -22.5 -9.5t-9.5 -22.5v-704q0 -13 9.5 -22.5t22.5 -9.5h512q13 0 22.5 9.5t9.5 22.5zM480 1136 q0 16 -16 16h-160q-16 0 -16 -16t16 -16h160q16 0 16 16zM768 1152v-1024q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v1024q0 52 38 90t90 38h512q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf10c;" d="M768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103 t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf10d;" horiz-adv-x="1664" d="M768 576v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136z M1664 576v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136z" />
+<glyph unicode="&#xf10e;" horiz-adv-x="1664" d="M768 1216v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136v384q0 80 56 136t136 56h384q80 0 136 -56t56 -136zM1664 1216 v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136v384q0 80 56 136t136 56h384q80 0 136 -56t56 -136z" />
+<glyph unicode="&#xf110;" horiz-adv-x="1568" d="M496 192q0 -60 -42.5 -102t-101.5 -42q-60 0 -102 42t-42 102t42 102t102 42q59 0 101.5 -42t42.5 -102zM928 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM320 640q0 -66 -47 -113t-113 -47t-113 47t-47 113 t47 113t113 47t113 -47t47 -113zM1360 192q0 -46 -33 -79t-79 -33t-79 33t-33 79t33 79t79 33t79 -33t33 -79zM528 1088q0 -73 -51.5 -124.5t-124.5 -51.5t-124.5 51.5t-51.5 124.5t51.5 124.5t124.5 51.5t124.5 -51.5t51.5 -124.5zM992 1280q0 -80 -56 -136t-136 -56 t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1536 640q0 -40 -28 -68t-68 -28t-68 28t-28 68t28 68t68 28t68 -28t28 -68zM1328 1088q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5z" />
+<glyph unicode="&#xf111;" d="M1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf112;" horiz-adv-x="1792" d="M1792 416q0 -166 -127 -451q-3 -7 -10.5 -24t-13.5 -30t-13 -22q-12 -17 -28 -17q-15 0 -23.5 10t-8.5 25q0 9 2.5 26.5t2.5 23.5q5 68 5 123q0 101 -17.5 181t-48.5 138.5t-80 101t-105.5 69.5t-133 42.5t-154 21.5t-175.5 6h-224v-256q0 -26 -19 -45t-45 -19t-45 19 l-512 512q-19 19 -19 45t19 45l512 512q19 19 45 19t45 -19t19 -45v-256h224q713 0 875 -403q53 -134 53 -333z" />
+<glyph unicode="&#xf113;" horiz-adv-x="1664" d="M640 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1280 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1440 320 q0 120 -69 204t-187 84q-41 0 -195 -21q-71 -11 -157 -11t-157 11q-152 21 -195 21q-118 0 -187 -84t-69 -204q0 -88 32 -153.5t81 -103t122 -60t140 -29.5t149 -7h168q82 0 149 7t140 29.5t122 60t81 103t32 153.5zM1664 496q0 -207 -61 -331q-38 -77 -105.5 -133t-141 -86 t-170 -47.5t-171.5 -22t-167 -4.5q-78 0 -142 3t-147.5 12.5t-152.5 30t-137 51.5t-121 81t-86 115q-62 123 -62 331q0 237 136 396q-27 82 -27 170q0 116 51 218q108 0 190 -39.5t189 -123.5q147 35 309 35q148 0 280 -32q105 82 187 121t189 39q51 -102 51 -218 q0 -87 -27 -168q136 -160 136 -398z" />
+<glyph unicode="&#xf114;" horiz-adv-x="1664" d="M1536 224v704q0 40 -28 68t-68 28h-704q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68v-960q0 -40 28 -68t68 -28h1216q40 0 68 28t28 68zM1664 928v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320 q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158z" />
+<glyph unicode="&#xf115;" horiz-adv-x="1920" d="M1781 605q0 35 -53 35h-1088q-40 0 -85.5 -21.5t-71.5 -52.5l-294 -363q-18 -24 -18 -40q0 -35 53 -35h1088q40 0 86 22t71 53l294 363q18 22 18 39zM640 768h768v160q0 40 -28 68t-68 28h-576q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68 v-853l256 315q44 53 116 87.5t140 34.5zM1909 605q0 -62 -46 -120l-295 -363q-43 -53 -116 -87.5t-140 -34.5h-1088q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158v-160h192q54 0 99 -24.5t67 -70.5q15 -32 15 -68z " />
+<glyph unicode="&#xf116;" horiz-adv-x="1152" d="M896 608v-64q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-224q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v224q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-224h224q14 0 23 -9t9 -23zM1024 224v704q0 40 -28 68t-68 28h-704q-40 0 -68 -28 t-28 -68v-704q0 -40 28 -68t68 -28h704q40 0 68 28t28 68zM1152 928v-704q0 -92 -65.5 -158t-158.5 -66h-704q-93 0 -158.5 66t-65.5 158v704q0 93 65.5 158.5t158.5 65.5h704q93 0 158.5 -65.5t65.5 -158.5z" />
+<glyph unicode="&#xf117;" horiz-adv-x="1152" d="M928 1152q93 0 158.5 -65.5t65.5 -158.5v-704q0 -92 -65.5 -158t-158.5 -66h-704q-93 0 -158.5 66t-65.5 158v704q0 93 65.5 158.5t158.5 65.5h704zM1024 224v704q0 40 -28 68t-68 28h-704q-40 0 -68 -28t-28 -68v-704q0 -40 28 -68t68 -28h704q40 0 68 28t28 68z M864 640q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-576q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h576z" />
+<glyph unicode="&#xf118;" d="M1134 461q-37 -121 -138 -195t-228 -74t-228 74t-138 195q-8 25 4 48.5t38 31.5q25 8 48.5 -4t31.5 -38q25 -80 92.5 -129.5t151.5 -49.5t151.5 49.5t92.5 129.5q8 26 32 38t49 4t37 -31.5t4 -48.5zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5 t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5 t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf119;" d="M1134 307q8 -25 -4 -48.5t-37 -31.5t-49 4t-32 38q-25 80 -92.5 129.5t-151.5 49.5t-151.5 -49.5t-92.5 -129.5q-8 -26 -31.5 -38t-48.5 -4q-26 8 -38 31.5t-4 48.5q37 121 138 195t228 74t228 -74t138 -195zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204 t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf11a;" d="M1152 448q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h640q26 0 45 -19t19 -45zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf11b;" horiz-adv-x="1920" d="M832 448v128q0 14 -9 23t-23 9h-192v192q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-192h-192q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h192v-192q0 -14 9 -23t23 -9h128q14 0 23 9t9 23v192h192q14 0 23 9t9 23zM1408 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5 t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 640q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1920 512q0 -212 -150 -362t-362 -150q-192 0 -338 128h-220q-146 -128 -338 -128q-212 0 -362 150 t-150 362t150 362t362 150h896q212 0 362 -150t150 -362z" />
+<glyph unicode="&#xf11c;" horiz-adv-x="1920" d="M384 368v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM512 624v-96q0 -16 -16 -16h-224q-16 0 -16 16v96q0 16 16 16h224q16 0 16 -16zM384 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1408 368v-96q0 -16 -16 -16 h-864q-16 0 -16 16v96q0 16 16 16h864q16 0 16 -16zM768 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM640 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1024 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16 h96q16 0 16 -16zM896 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1280 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1664 368v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1152 880v-96 q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1408 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1664 880v-352q0 -16 -16 -16h-224q-16 0 -16 16v96q0 16 16 16h112v240q0 16 16 16h96q16 0 16 -16zM1792 128v896h-1664v-896 h1664zM1920 1024v-896q0 -53 -37.5 -90.5t-90.5 -37.5h-1664q-53 0 -90.5 37.5t-37.5 90.5v896q0 53 37.5 90.5t90.5 37.5h1664q53 0 90.5 -37.5t37.5 -90.5z" />
+<glyph unicode="&#xf11d;" horiz-adv-x="1792" d="M1664 491v616q-169 -91 -306 -91q-82 0 -145 32q-100 49 -184 76.5t-178 27.5q-173 0 -403 -127v-599q245 113 433 113q55 0 103.5 -7.5t98 -26t77 -31t82.5 -39.5l28 -14q44 -22 101 -22q120 0 293 92zM320 1280q0 -35 -17.5 -64t-46.5 -46v-1266q0 -14 -9 -23t-23 -9 h-64q-14 0 -23 9t-9 23v1266q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -39 -35 -57q-10 -5 -17 -9q-218 -116 -369 -116q-88 0 -158 35l-28 14q-64 33 -99 48t-91 29t-114 14q-102 0 -235.5 -44t-228.5 -102 q-15 -9 -33 -9q-16 0 -32 8q-32 19 -32 56v742q0 35 31 55q35 21 78.5 42.5t114 52t152.5 49.5t155 19q112 0 209 -31t209 -86q38 -19 89 -19q122 0 310 112q22 12 31 17q31 16 62 -2q31 -20 31 -55z" />
+<glyph unicode="&#xf11e;" horiz-adv-x="1792" d="M832 536v192q-181 -16 -384 -117v-185q205 96 384 110zM832 954v197q-172 -8 -384 -126v-189q215 111 384 118zM1664 491v184q-235 -116 -384 -71v224q-20 6 -39 15q-5 3 -33 17t-34.5 17t-31.5 15t-34.5 15.5t-32.5 13t-36 12.5t-35 8.5t-39.5 7.5t-39.5 4t-44 2 q-23 0 -49 -3v-222h19q102 0 192.5 -29t197.5 -82q19 -9 39 -15v-188q42 -17 91 -17q120 0 293 92zM1664 918v189q-169 -91 -306 -91q-45 0 -78 8v-196q148 -42 384 90zM320 1280q0 -35 -17.5 -64t-46.5 -46v-1266q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v1266 q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -39 -35 -57q-10 -5 -17 -9q-218 -116 -369 -116q-88 0 -158 35l-28 14q-64 33 -99 48t-91 29t-114 14q-102 0 -235.5 -44t-228.5 -102q-15 -9 -33 -9q-16 0 -32 8 q-32 19 -32 56v742q0 35 31 55q35 21 78.5 42.5t114 52t152.5 49.5t155 19q112 0 209 -31t209 -86q38 -19 89 -19q122 0 310 112q22 12 31 17q31 16 62 -2q31 -20 31 -55z" />
+<glyph unicode="&#xf120;" horiz-adv-x="1664" d="M585 553l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23zM1664 96v-64q0 -14 -9 -23t-23 -9h-960q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h960q14 0 23 -9 t9 -23z" />
+<glyph unicode="&#xf121;" horiz-adv-x="1920" d="M617 137l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23zM1208 1204l-373 -1291q-4 -13 -15.5 -19.5t-23.5 -2.5l-62 17q-13 4 -19.5 15.5t-2.5 24.5 l373 1291q4 13 15.5 19.5t23.5 2.5l62 -17q13 -4 19.5 -15.5t2.5 -24.5zM1865 553l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23z" />
+<glyph unicode="&#xf122;" horiz-adv-x="1792" d="M640 454v-70q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-512 512q-19 19 -19 45t19 45l512 512q29 31 70 14q39 -17 39 -59v-69l-397 -398q-19 -19 -19 -45t19 -45zM1792 416q0 -58 -17 -133.5t-38.5 -138t-48 -125t-40.5 -90.5l-20 -40q-8 -17 -28 -17q-6 0 -9 1 q-25 8 -23 34q43 400 -106 565q-64 71 -170.5 110.5t-267.5 52.5v-251q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-512 512q-19 19 -19 45t19 45l512 512q29 31 70 14q39 -17 39 -59v-262q411 -28 599 -221q169 -173 169 -509z" />
+<glyph unicode="&#xf123;" horiz-adv-x="1664" d="M1186 579l257 250l-356 52l-66 10l-30 60l-159 322v-963l59 -31l318 -168l-60 355l-12 66zM1638 841l-363 -354l86 -500q5 -33 -6 -51.5t-34 -18.5q-17 0 -40 12l-449 236l-449 -236q-23 -12 -40 -12q-23 0 -34 18.5t-6 51.5l86 500l-364 354q-32 32 -23 59.5t54 34.5 l502 73l225 455q20 41 49 41q28 0 49 -41l225 -455l502 -73q45 -7 54 -34.5t-24 -59.5z" />
+<glyph unicode="&#xf124;" horiz-adv-x="1408" d="M1401 1187l-640 -1280q-17 -35 -57 -35q-5 0 -15 2q-22 5 -35.5 22.5t-13.5 39.5v576h-576q-22 0 -39.5 13.5t-22.5 35.5t4 42t29 30l1280 640q13 7 29 7q27 0 45 -19q15 -14 18.5 -34.5t-6.5 -39.5z" />
+<glyph unicode="&#xf125;" horiz-adv-x="1664" d="M557 256h595v595zM512 301l595 595h-595v-595zM1664 224v-192q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v224h-864q-14 0 -23 9t-9 23v864h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224v224q0 14 9 23t23 9h192q14 0 23 -9t9 -23 v-224h851l246 247q10 9 23 9t23 -9q9 -10 9 -23t-9 -23l-247 -246v-851h224q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf126;" horiz-adv-x="1024" d="M288 64q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM288 1216q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM928 1088q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1024 1088q0 -52 -26 -96.5t-70 -69.5 q-2 -287 -226 -414q-68 -38 -203 -81q-128 -40 -169.5 -71t-41.5 -100v-26q44 -25 70 -69.5t26 -96.5q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 52 26 96.5t70 69.5v820q-44 25 -70 69.5t-26 96.5q0 80 56 136t136 56t136 -56t56 -136q0 -52 -26 -96.5t-70 -69.5v-497 q54 26 154 57q55 17 87.5 29.5t70.5 31t59 39.5t40.5 51t28 69.5t8.5 91.5q-44 25 -70 69.5t-26 96.5q0 80 56 136t136 56t136 -56t56 -136z" />
+<glyph unicode="&#xf127;" horiz-adv-x="1664" d="M439 265l-256 -256q-10 -9 -23 -9q-12 0 -23 9q-9 10 -9 23t9 23l256 256q10 9 23 9t23 -9q9 -10 9 -23t-9 -23zM608 224v-320q0 -14 -9 -23t-23 -9t-23 9t-9 23v320q0 14 9 23t23 9t23 -9t9 -23zM384 448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23t9 23t23 9h320 q14 0 23 -9t9 -23zM1648 320q0 -120 -85 -203l-147 -146q-83 -83 -203 -83q-121 0 -204 85l-334 335q-21 21 -42 56l239 18l273 -274q27 -27 68 -27.5t68 26.5l147 146q28 28 28 67q0 40 -28 68l-274 275l18 239q35 -21 56 -42l336 -336q84 -86 84 -204zM1031 1044l-239 -18 l-273 274q-28 28 -68 28q-39 0 -68 -27l-147 -146q-28 -28 -28 -67q0 -40 28 -68l274 -274l-18 -240q-35 21 -56 42l-336 336q-84 86 -84 204q0 120 85 203l147 146q83 83 203 83q121 0 204 -85l334 -335q21 -21 42 -56zM1664 960q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9 t-9 23t9 23t23 9h320q14 0 23 -9t9 -23zM1120 1504v-320q0 -14 -9 -23t-23 -9t-23 9t-9 23v320q0 14 9 23t23 9t23 -9t9 -23zM1527 1353l-256 -256q-11 -9 -23 -9t-23 9q-9 10 -9 23t9 23l256 256q10 9 23 9t23 -9q9 -10 9 -23t-9 -23z" />
+<glyph unicode="&#xf128;" horiz-adv-x="1024" d="M704 280v-240q0 -16 -12 -28t-28 -12h-240q-16 0 -28 12t-12 28v240q0 16 12 28t28 12h240q16 0 28 -12t12 -28zM1020 880q0 -54 -15.5 -101t-35 -76.5t-55 -59.5t-57.5 -43.5t-61 -35.5q-41 -23 -68.5 -65t-27.5 -67q0 -17 -12 -32.5t-28 -15.5h-240q-15 0 -25.5 18.5 t-10.5 37.5v45q0 83 65 156.5t143 108.5q59 27 84 56t25 76q0 42 -46.5 74t-107.5 32q-65 0 -108 -29q-35 -25 -107 -115q-13 -16 -31 -16q-12 0 -25 8l-164 125q-13 10 -15.5 25t5.5 28q160 266 464 266q80 0 161 -31t146 -83t106 -127.5t41 -158.5z" />
+<glyph unicode="&#xf129;" horiz-adv-x="640" d="M640 192v-128q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64v384h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-576h64q26 0 45 -19t19 -45zM512 1344v-192q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v192 q0 26 19 45t45 19h256q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf12a;" horiz-adv-x="640" d="M512 288v-224q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v224q0 26 19 45t45 19h256q26 0 45 -19t19 -45zM542 1344l-28 -768q-1 -26 -20.5 -45t-45.5 -19h-256q-26 0 -45.5 19t-20.5 45l-28 768q-1 26 17.5 45t44.5 19h320q26 0 44.5 -19t17.5 -45z" />
+<glyph unicode="&#xf12b;" d="M897 167v-167h-248l-159 252l-24 42q-8 9 -11 21h-3l-9 -21q-10 -20 -25 -44l-155 -250h-258v167h128l197 291l-185 272h-137v168h276l139 -228q2 -4 23 -42q8 -9 11 -21h3q3 9 11 21l25 42l140 228h257v-168h-125l-184 -267l204 -296h109zM1534 846v-206h-514l-3 27 q-4 28 -4 46q0 64 26 117t65 86.5t84 65t84 54.5t65 54t26 64q0 38 -29.5 62.5t-70.5 24.5q-51 0 -97 -39q-14 -11 -36 -38l-105 92q26 37 63 66q83 65 188 65q110 0 178 -59.5t68 -158.5q0 -56 -24.5 -103t-62 -76.5t-81.5 -58.5t-82 -50.5t-65.5 -51.5t-30.5 -63h232v80 h126z" />
+<glyph unicode="&#xf12c;" d="M897 167v-167h-248l-159 252l-24 42q-8 9 -11 21h-3l-9 -21q-10 -20 -25 -44l-155 -250h-258v167h128l197 291l-185 272h-137v168h276l139 -228q2 -4 23 -42q8 -9 11 -21h3q3 9 11 21l25 42l140 228h257v-168h-125l-184 -267l204 -296h109zM1536 -50v-206h-514l-4 27 q-3 45 -3 46q0 64 26 117t65 86.5t84 65t84 54.5t65 54t26 64q0 38 -29.5 62.5t-70.5 24.5q-51 0 -97 -39q-14 -11 -36 -38l-105 92q26 37 63 66q80 65 188 65q110 0 178 -59.5t68 -158.5q0 -66 -34.5 -118.5t-84 -86t-99.5 -62.5t-87 -63t-41 -73h232v80h126z" />
+<glyph unicode="&#xf12d;" horiz-adv-x="1920" d="M896 128l336 384h-768l-336 -384h768zM1909 1205q15 -34 9.5 -71.5t-30.5 -65.5l-896 -1024q-38 -44 -96 -44h-768q-38 0 -69.5 20.5t-47.5 54.5q-15 34 -9.5 71.5t30.5 65.5l896 1024q38 44 96 44h768q38 0 69.5 -20.5t47.5 -54.5z" />
+<glyph unicode="&#xf12e;" horiz-adv-x="1664" d="M1664 438q0 -81 -44.5 -135t-123.5 -54q-41 0 -77.5 17.5t-59 38t-56.5 38t-71 17.5q-110 0 -110 -124q0 -39 16 -115t15 -115v-5q-22 0 -33 -1q-34 -3 -97.5 -11.5t-115.5 -13.5t-98 -5q-61 0 -103 26.5t-42 83.5q0 37 17.5 71t38 56.5t38 59t17.5 77.5q0 79 -54 123.5 t-135 44.5q-84 0 -143 -45.5t-59 -127.5q0 -43 15 -83t33.5 -64.5t33.5 -53t15 -50.5q0 -45 -46 -89q-37 -35 -117 -35q-95 0 -245 24q-9 2 -27.5 4t-27.5 4l-13 2q-1 0 -3 1q-2 0 -2 1v1024q2 -1 17.5 -3.5t34 -5t21.5 -3.5q150 -24 245 -24q80 0 117 35q46 44 46 89 q0 22 -15 50.5t-33.5 53t-33.5 64.5t-15 83q0 82 59 127.5t144 45.5q80 0 134 -44.5t54 -123.5q0 -41 -17.5 -77.5t-38 -59t-38 -56.5t-17.5 -71q0 -57 42 -83.5t103 -26.5q64 0 180 15t163 17v-2q-1 -2 -3.5 -17.5t-5 -34t-3.5 -21.5q-24 -150 -24 -245q0 -80 35 -117 q44 -46 89 -46q22 0 50.5 15t53 33.5t64.5 33.5t83 15q82 0 127.5 -59t45.5 -143z" />
+<glyph unicode="&#xf130;" horiz-adv-x="1152" d="M1152 832v-128q0 -221 -147.5 -384.5t-364.5 -187.5v-132h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h256v132q-217 24 -364.5 187.5t-147.5 384.5v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -185 131.5 -316.5t316.5 -131.5 t316.5 131.5t131.5 316.5v128q0 26 19 45t45 19t45 -19t19 -45zM896 1216v-512q0 -132 -94 -226t-226 -94t-226 94t-94 226v512q0 132 94 226t226 94t226 -94t94 -226z" />
+<glyph unicode="&#xf131;" horiz-adv-x="1408" d="M271 591l-101 -101q-42 103 -42 214v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -53 15 -113zM1385 1193l-361 -361v-128q0 -132 -94 -226t-226 -94q-55 0 -109 19l-96 -96q97 -51 205 -51q185 0 316.5 131.5t131.5 316.5v128q0 26 19 45t45 19t45 -19t19 -45v-128 q0 -221 -147.5 -384.5t-364.5 -187.5v-132h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h256v132q-125 13 -235 81l-254 -254q-10 -10 -23 -10t-23 10l-82 82q-10 10 -10 23t10 23l1234 1234q10 10 23 10t23 -10l82 -82q10 -10 10 -23 t-10 -23zM1005 1325l-621 -621v512q0 132 94 226t226 94q102 0 184.5 -59t116.5 -152z" />
+<glyph unicode="&#xf132;" horiz-adv-x="1280" d="M1088 576v640h-448v-1137q119 63 213 137q235 184 235 360zM1280 1344v-768q0 -86 -33.5 -170.5t-83 -150t-118 -127.5t-126.5 -103t-121 -77.5t-89.5 -49.5t-42.5 -20q-12 -6 -26 -6t-26 6q-16 7 -42.5 20t-89.5 49.5t-121 77.5t-126.5 103t-118 127.5t-83 150 t-33.5 170.5v768q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf133;" horiz-adv-x="1664" d="M128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280 q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf134;" horiz-adv-x="1408" d="M512 1344q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 1376v-320q0 -16 -12 -25q-8 -7 -20 -7q-4 0 -7 1l-448 96q-11 2 -18 11t-7 20h-256v-102q111 -23 183.5 -111t72.5 -203v-800q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v800 q0 106 62.5 190.5t161.5 114.5v111h-32q-59 0 -115 -23.5t-91.5 -53t-66 -66.5t-40.5 -53.5t-14 -24.5q-17 -35 -57 -35q-16 0 -29 7q-23 12 -31.5 37t3.5 49q5 10 14.5 26t37.5 53.5t60.5 70t85 67t108.5 52.5q-25 42 -25 86q0 66 47 113t113 47t113 -47t47 -113 q0 -33 -14 -64h302q0 11 7 20t18 11l448 96q3 1 7 1q12 0 20 -7q12 -9 12 -25z" />
+<glyph unicode="&#xf135;" horiz-adv-x="1664" d="M1440 1088q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1664 1376q0 -249 -75.5 -430.5t-253.5 -360.5q-81 -80 -195 -176l-20 -379q-2 -16 -16 -26l-384 -224q-7 -4 -16 -4q-12 0 -23 9l-64 64q-13 14 -8 32l85 276l-281 281l-276 -85q-3 -1 -9 -1 q-14 0 -23 9l-64 64q-17 19 -5 39l224 384q10 14 26 16l379 20q96 114 176 195q188 187 358 258t431 71q14 0 24 -9.5t10 -22.5z" />
+<glyph unicode="&#xf136;" horiz-adv-x="1792" d="M1708 881l-188 -881h-304l181 849q4 21 1 43q-4 20 -16 35q-10 14 -28 24q-18 9 -40 9h-197l-205 -960h-303l204 960h-304l-205 -960h-304l272 1280h1139q157 0 245 -118q86 -116 52 -281z" />
+<glyph unicode="&#xf137;" d="M909 141l102 102q19 19 19 45t-19 45l-307 307l307 307q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45t19 -45l454 -454q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf138;" d="M717 141l454 454q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l307 -307l-307 -307q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf139;" d="M1165 397l102 102q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19l307 307l307 -307q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf13a;" d="M813 237l454 454q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-307 -307l-307 307q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l454 -454q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf13b;" horiz-adv-x="1408" d="M1130 939l16 175h-884l47 -534h612l-22 -228l-197 -53l-196 53l-13 140h-175l22 -278l362 -100h4v1l359 99l50 544h-644l-15 181h674zM0 1408h1408l-128 -1438l-578 -162l-574 162z" />
+<glyph unicode="&#xf13c;" horiz-adv-x="1792" d="M275 1408h1505l-266 -1333l-804 -267l-698 267l71 356h297l-29 -147l422 -161l486 161l68 339h-1208l58 297h1209l38 191h-1208z" />
+<glyph unicode="&#xf13d;" horiz-adv-x="1792" d="M960 1280q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1792 352v-352q0 -22 -20 -30q-8 -2 -12 -2q-13 0 -23 9l-93 93q-119 -143 -318.5 -226.5t-429.5 -83.5t-429.5 83.5t-318.5 226.5l-93 -93q-9 -9 -23 -9q-4 0 -12 2q-20 8 -20 30v352 q0 14 9 23t23 9h352q22 0 30 -20q8 -19 -7 -35l-100 -100q67 -91 189.5 -153.5t271.5 -82.5v647h-192q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h192v163q-58 34 -93 92.5t-35 128.5q0 106 75 181t181 75t181 -75t75 -181q0 -70 -35 -128.5t-93 -92.5v-163h192q26 0 45 -19 t19 -45v-128q0 -26 -19 -45t-45 -19h-192v-647q149 20 271.5 82.5t189.5 153.5l-100 100q-15 16 -7 35q8 20 30 20h352q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf13e;" horiz-adv-x="1152" d="M1056 768q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h32v320q0 185 131.5 316.5t316.5 131.5t316.5 -131.5t131.5 -316.5q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45q0 106 -75 181t-181 75t-181 -75t-75 -181 v-320h736z" />
+<glyph unicode="&#xf140;" d="M1024 640q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM1152 640q0 159 -112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM1280 640q0 -212 -150 -362t-362 -150t-362 150 t-150 362t150 362t362 150t362 -150t150 -362zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf141;" horiz-adv-x="1408" d="M384 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM896 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM1408 800v-192q0 -40 -28 -68t-68 -28h-192 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf142;" horiz-adv-x="384" d="M384 288v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM384 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM384 1312v-192q0 -40 -28 -68t-68 -28h-192 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf143;" d="M512 256q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM863 162q-13 232 -177 396t-396 177q-14 1 -24 -9t-10 -23v-128q0 -13 8.5 -22t21.5 -10q154 -11 264 -121t121 -264q1 -13 10 -21.5t22 -8.5h128q13 0 23 10 t9 24zM1247 161q-5 154 -56 297.5t-139.5 260t-205 205t-260 139.5t-297.5 56q-14 1 -23 -9q-10 -10 -10 -23v-128q0 -13 9 -22t22 -10q204 -7 378 -111.5t278.5 -278.5t111.5 -378q1 -13 10 -22t22 -9h128q13 0 23 10q11 9 9 23zM1536 1120v-960q0 -119 -84.5 -203.5 t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf144;" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM1152 585q32 18 32 55t-32 55l-544 320q-31 19 -64 1q-32 -19 -32 -56v-640q0 -37 32 -56 q16 -8 32 -8q17 0 32 9z" />
+<glyph unicode="&#xf145;" horiz-adv-x="1792" d="M1024 1084l316 -316l-572 -572l-316 316zM813 105l618 618q19 19 19 45t-19 45l-362 362q-18 18 -45 18t-45 -18l-618 -618q-19 -19 -19 -45t19 -45l362 -362q18 -18 45 -18t45 18zM1702 742l-907 -908q-37 -37 -90.5 -37t-90.5 37l-126 126q56 56 56 136t-56 136 t-136 56t-136 -56l-125 126q-37 37 -37 90.5t37 90.5l907 906q37 37 90.5 37t90.5 -37l125 -125q-56 -56 -56 -136t56 -136t136 -56t136 56l126 -125q37 -37 37 -90.5t-37 -90.5z" />
+<glyph unicode="&#xf146;" d="M1280 576v128q0 26 -19 45t-45 19h-896q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h896q26 0 45 19t19 45zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5 t84.5 -203.5z" />
+<glyph unicode="&#xf147;" horiz-adv-x="1408" d="M1152 736v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h832q14 0 23 -9t9 -23zM1280 288v832q0 66 -47 113t-113 47h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113zM1408 1120v-832q0 -119 -84.5 -203.5 t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf148;" horiz-adv-x="1024" d="M1018 933q-18 -37 -58 -37h-192v-864q0 -14 -9 -23t-23 -9h-704q-21 0 -29 18q-8 20 4 35l160 192q9 11 25 11h320v640h-192q-40 0 -58 37q-17 37 9 68l320 384q18 22 49 22t49 -22l320 -384q27 -32 9 -68z" />
+<glyph unicode="&#xf149;" horiz-adv-x="1024" d="M32 1280h704q13 0 22.5 -9.5t9.5 -23.5v-863h192q40 0 58 -37t-9 -69l-320 -384q-18 -22 -49 -22t-49 22l-320 384q-26 31 -9 69q18 37 58 37h192v640h-320q-14 0 -25 11l-160 192q-13 14 -4 34q9 19 29 19z" />
+<glyph unicode="&#xf14a;" d="M685 237l614 614q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-467 -467l-211 211q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l358 -358q19 -19 45 -19t45 19zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5 t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf14b;" d="M404 428l152 -152l-52 -52h-56v96h-96v56zM818 818q14 -13 -3 -30l-291 -291q-17 -17 -30 -3q-14 13 3 30l291 291q17 17 30 3zM544 128l544 544l-288 288l-544 -544v-288h288zM1152 736l92 92q28 28 28 68t-28 68l-152 152q-28 28 -68 28t-68 -28l-92 -92zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf14c;" d="M1280 608v480q0 26 -19 45t-45 19h-480q-42 0 -59 -39q-17 -41 14 -70l144 -144l-534 -534q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19l534 534l144 -144q18 -19 45 -19q12 0 25 5q39 17 39 59zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960 q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf14d;" d="M1005 435l352 352q19 19 19 45t-19 45l-352 352q-30 31 -69 14q-40 -17 -40 -59v-160q-119 0 -216 -19.5t-162.5 -51t-114 -79t-76.5 -95.5t-44.5 -109t-21.5 -111.5t-5 -110.5q0 -181 167 -404q10 -12 25 -12q7 0 13 3q22 9 19 33q-44 354 62 473q46 52 130 75.5 t224 23.5v-160q0 -42 40 -59q12 -5 24 -5q26 0 45 19zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf14e;" d="M640 448l256 128l-256 128v-256zM1024 1039v-542l-512 -256v542zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf150;" d="M1145 861q18 -35 -5 -66l-320 -448q-19 -27 -52 -27t-52 27l-320 448q-23 31 -5 66q17 35 57 35h640q40 0 57 -35zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf151;" d="M1145 419q-17 -35 -57 -35h-640q-40 0 -57 35q-18 35 5 66l320 448q19 27 52 27t52 -27l320 -448q23 -31 5 -66zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf152;" d="M1088 640q0 -33 -27 -52l-448 -320q-31 -23 -66 -5q-35 17 -35 57v640q0 40 35 57q35 18 66 -5l448 -320q27 -19 27 -52zM1280 160v960q0 14 -9 23t-23 9h-960q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h960q14 0 23 9t9 23zM1536 1120v-960q0 -119 -84.5 -203.5 t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf153;" horiz-adv-x="1024" d="M976 229l35 -159q3 -12 -3 -22.5t-17 -14.5l-5 -1q-4 -2 -10.5 -3.5t-16 -4.5t-21.5 -5.5t-25.5 -5t-30 -5t-33.5 -4.5t-36.5 -3t-38.5 -1q-234 0 -409 130.5t-238 351.5h-95q-13 0 -22.5 9.5t-9.5 22.5v113q0 13 9.5 22.5t22.5 9.5h66q-2 57 1 105h-67q-14 0 -23 9 t-9 23v114q0 14 9 23t23 9h98q67 210 243.5 338t400.5 128q102 0 194 -23q11 -3 20 -15q6 -11 3 -24l-43 -159q-3 -13 -14 -19.5t-24 -2.5l-4 1q-4 1 -11.5 2.5l-17.5 3.5t-22.5 3.5t-26 3t-29 2.5t-29.5 1q-126 0 -226 -64t-150 -176h468q16 0 25 -12q10 -12 7 -26 l-24 -114q-5 -26 -32 -26h-488q-3 -37 0 -105h459q15 0 25 -12q9 -12 6 -27l-24 -112q-2 -11 -11 -18.5t-20 -7.5h-387q48 -117 149.5 -185.5t228.5 -68.5q18 0 36 1.5t33.5 3.5t29.5 4.5t24.5 5t18.5 4.5l12 3l5 2q13 5 26 -2q12 -7 15 -21z" />
+<glyph unicode="&#xf154;" horiz-adv-x="1024" d="M1020 399v-367q0 -14 -9 -23t-23 -9h-956q-14 0 -23 9t-9 23v150q0 13 9.5 22.5t22.5 9.5h97v383h-95q-14 0 -23 9.5t-9 22.5v131q0 14 9 23t23 9h95v223q0 171 123.5 282t314.5 111q185 0 335 -125q9 -8 10 -20.5t-7 -22.5l-103 -127q-9 -11 -22 -12q-13 -2 -23 7 q-5 5 -26 19t-69 32t-93 18q-85 0 -137 -47t-52 -123v-215h305q13 0 22.5 -9t9.5 -23v-131q0 -13 -9.5 -22.5t-22.5 -9.5h-305v-379h414v181q0 13 9 22.5t23 9.5h162q14 0 23 -9.5t9 -22.5z" />
+<glyph unicode="&#xf155;" horiz-adv-x="1024" d="M978 351q0 -153 -99.5 -263.5t-258.5 -136.5v-175q0 -14 -9 -23t-23 -9h-135q-13 0 -22.5 9.5t-9.5 22.5v175q-66 9 -127.5 31t-101.5 44.5t-74 48t-46.5 37.5t-17.5 18q-17 21 -2 41l103 135q7 10 23 12q15 2 24 -9l2 -2q113 -99 243 -125q37 -8 74 -8q81 0 142.5 43 t61.5 122q0 28 -15 53t-33.5 42t-58.5 37.5t-66 32t-80 32.5q-39 16 -61.5 25t-61.5 26.5t-62.5 31t-56.5 35.5t-53.5 42.5t-43.5 49t-35.5 58t-21 66.5t-8.5 78q0 138 98 242t255 134v180q0 13 9.5 22.5t22.5 9.5h135q14 0 23 -9t9 -23v-176q57 -6 110.5 -23t87 -33.5 t63.5 -37.5t39 -29t15 -14q17 -18 5 -38l-81 -146q-8 -15 -23 -16q-14 -3 -27 7q-3 3 -14.5 12t-39 26.5t-58.5 32t-74.5 26t-85.5 11.5q-95 0 -155 -43t-60 -111q0 -26 8.5 -48t29.5 -41.5t39.5 -33t56 -31t60.5 -27t70 -27.5q53 -20 81 -31.5t76 -35t75.5 -42.5t62 -50 t53 -63.5t31.5 -76.5t13 -94z" />
+<glyph unicode="&#xf156;" horiz-adv-x="898" d="M898 1066v-102q0 -14 -9 -23t-23 -9h-168q-23 -144 -129 -234t-276 -110q167 -178 459 -536q14 -16 4 -34q-8 -18 -29 -18h-195q-16 0 -25 12q-306 367 -498 571q-9 9 -9 22v127q0 13 9.5 22.5t22.5 9.5h112q132 0 212.5 43t102.5 125h-427q-14 0 -23 9t-9 23v102 q0 14 9 23t23 9h413q-57 113 -268 113h-145q-13 0 -22.5 9.5t-9.5 22.5v133q0 14 9 23t23 9h832q14 0 23 -9t9 -23v-102q0 -14 -9 -23t-23 -9h-233q47 -61 64 -144h171q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf157;" horiz-adv-x="1027" d="M603 0h-172q-13 0 -22.5 9t-9.5 23v330h-288q-13 0 -22.5 9t-9.5 23v103q0 13 9.5 22.5t22.5 9.5h288v85h-288q-13 0 -22.5 9t-9.5 23v104q0 13 9.5 22.5t22.5 9.5h214l-321 578q-8 16 0 32q10 16 28 16h194q19 0 29 -18l215 -425q19 -38 56 -125q10 24 30.5 68t27.5 61 l191 420q8 19 29 19h191q17 0 27 -16q9 -14 1 -31l-313 -579h215q13 0 22.5 -9.5t9.5 -22.5v-104q0 -14 -9.5 -23t-22.5 -9h-290v-85h290q13 0 22.5 -9.5t9.5 -22.5v-103q0 -14 -9.5 -23t-22.5 -9h-290v-330q0 -13 -9.5 -22.5t-22.5 -9.5z" />
+<glyph unicode="&#xf158;" horiz-adv-x="1664" d="M1664 352v-32q0 -132 -94 -226t-226 -94h-128q-132 0 -226 94t-94 226v480h-224q-2 -102 -14.5 -190.5t-30.5 -156t-48.5 -126.5t-57 -99.5t-67.5 -77.5t-69.5 -58.5t-74 -44t-69 -32t-65.5 -25.5q-4 -2 -32 -13q-8 -2 -12 -2q-22 0 -30 20l-71 178q-5 13 0 25t17 17 q7 3 20 7.5t18 6.5q31 12 46.5 18.5t44.5 20t45.5 26t42 32.5t40.5 42.5t34.5 53.5t30.5 68.5t22.5 83.5t17 103t6.5 123h-256q-14 0 -23 9t-9 23v160q0 14 9 23t23 9h1216q14 0 23 -9t9 -23v-160q0 -14 -9 -23t-23 -9h-224v-512q0 -26 19 -45t45 -19h128q26 0 45 19t19 45 v64q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1280 1376v-160q0 -14 -9 -23t-23 -9h-960q-14 0 -23 9t-9 23v160q0 14 9 23t23 9h960q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf159;" horiz-adv-x="1792" d="M514 341l81 299h-159l75 -300q1 -1 1 -3t1 -3q0 1 0.5 3.5t0.5 3.5zM630 768l35 128h-292l32 -128h225zM822 768h139l-35 128h-70zM1271 340l78 300h-162l81 -299q0 -1 0.5 -3.5t1.5 -3.5q0 1 0.5 3t0.5 3zM1382 768l33 128h-297l34 -128h230zM1792 736v-64q0 -14 -9 -23 t-23 -9h-213l-164 -616q-7 -24 -31 -24h-159q-24 0 -31 24l-166 616h-209l-167 -616q-7 -24 -31 -24h-159q-11 0 -19.5 7t-10.5 17l-160 616h-208q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h175l-33 128h-142q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h109l-89 344q-5 15 5 28 q10 12 26 12h137q26 0 31 -24l90 -360h359l97 360q7 24 31 24h126q24 0 31 -24l98 -360h365l93 360q5 24 31 24h137q16 0 26 -12q10 -13 5 -28l-91 -344h111q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-145l-34 -128h179q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf15a;" horiz-adv-x="1280" d="M1167 896q18 -182 -131 -258q117 -28 175 -103t45 -214q-7 -71 -32.5 -125t-64.5 -89t-97 -58.5t-121.5 -34.5t-145.5 -15v-255h-154v251q-80 0 -122 1v-252h-154v255q-18 0 -54 0.5t-55 0.5h-200l31 183h111q50 0 58 51v402h16q-6 1 -16 1v287q-13 68 -89 68h-111v164 l212 -1q64 0 97 1v252h154v-247q82 2 122 2v245h154v-252q79 -7 140 -22.5t113 -45t82.5 -78t36.5 -114.5zM952 351q0 36 -15 64t-37 46t-57.5 30.5t-65.5 18.5t-74 9t-69 3t-64.5 -1t-47.5 -1v-338q8 0 37 -0.5t48 -0.5t53 1.5t58.5 4t57 8.5t55.5 14t47.5 21t39.5 30 t24.5 40t9.5 51zM881 827q0 33 -12.5 58.5t-30.5 42t-48 28t-55 16.5t-61.5 8t-58 2.5t-54 -1t-39.5 -0.5v-307q5 0 34.5 -0.5t46.5 0t50 2t55 5.5t51.5 11t48.5 18.5t37 27t27 38.5t9 51z" />
+<glyph unicode="&#xf15b;" horiz-adv-x="1280" d="M1280 768v-800q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h544v-544q0 -40 28 -68t68 -28h544zM1277 896h-509v509q82 -15 132 -65l312 -312q50 -50 65 -132z" />
+<glyph unicode="&#xf15c;" horiz-adv-x="1280" d="M1024 160v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23zM1024 416v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23zM1280 768v-800q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28 t-28 68v1344q0 40 28 68t68 28h544v-544q0 -40 28 -68t68 -28h544zM1277 896h-509v509q82 -15 132 -65l312 -312q50 -50 65 -132z" />
+<glyph unicode="&#xf15d;" horiz-adv-x="1664" d="M1191 1128h177l-72 218l-12 47q-2 16 -2 20h-4l-3 -20q0 -1 -3.5 -18t-7.5 -29zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1572 -23 v-233h-584v90l369 529q12 18 21 27l11 9v3q-2 0 -6.5 -0.5t-7.5 -0.5q-12 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530q-6 -8 -21 -26l-11 -11v-2l14 2q9 2 30 2h248v119h121zM1661 874v-106h-288v106h75l-47 144h-243l-47 -144h75v-106h-287v106h70l230 662h162 l230 -662h70z" />
+<glyph unicode="&#xf15e;" horiz-adv-x="1664" d="M1191 104h177l-72 218l-12 47q-2 16 -2 20h-4l-3 -20q0 -1 -3.5 -18t-7.5 -29zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1661 -150 v-106h-288v106h75l-47 144h-243l-47 -144h75v-106h-287v106h70l230 662h162l230 -662h70zM1572 1001v-233h-584v90l369 529q12 18 21 27l11 9v3q-2 0 -6.5 -0.5t-7.5 -0.5q-12 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530q-6 -8 -21 -26l-11 -10v-3l14 3q9 1 30 1h248 v119h121z" />
+<glyph unicode="&#xf160;" horiz-adv-x="1792" d="M736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1792 -32v-192q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h832 q14 0 23 -9t9 -23zM1600 480v-192q0 -14 -9 -23t-23 -9h-640q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h640q14 0 23 -9t9 -23zM1408 992v-192q0 -14 -9 -23t-23 -9h-448q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h448q14 0 23 -9t9 -23zM1216 1504v-192q0 -14 -9 -23t-23 -9h-256 q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h256q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf161;" horiz-adv-x="1792" d="M1216 -32v-192q0 -14 -9 -23t-23 -9h-256q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h256q14 0 23 -9t9 -23zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192 q14 0 23 -9t9 -23zM1408 480v-192q0 -14 -9 -23t-23 -9h-448q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h448q14 0 23 -9t9 -23zM1600 992v-192q0 -14 -9 -23t-23 -9h-640q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h640q14 0 23 -9t9 -23zM1792 1504v-192q0 -14 -9 -23t-23 -9h-832 q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h832q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf162;" d="M1346 223q0 63 -44 116t-103 53q-52 0 -83 -37t-31 -94t36.5 -95t104.5 -38q50 0 85 27t35 68zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23 zM1486 165q0 -62 -13 -121.5t-41 -114t-68 -95.5t-98.5 -65.5t-127.5 -24.5q-62 0 -108 16q-24 8 -42 15l39 113q15 -7 31 -11q37 -13 75 -13q84 0 134.5 58.5t66.5 145.5h-2q-21 -23 -61.5 -37t-84.5 -14q-106 0 -173 71.5t-67 172.5q0 105 72 178t181 73q123 0 205 -94.5 t82 -252.5zM1456 882v-114h-469v114h167v432q0 7 0.5 19t0.5 17v16h-2l-7 -12q-8 -13 -26 -31l-62 -58l-82 86l192 185h123v-654h165z" />
+<glyph unicode="&#xf163;" d="M1346 1247q0 63 -44 116t-103 53q-52 0 -83 -37t-31 -94t36.5 -95t104.5 -38q50 0 85 27t35 68zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9 t9 -23zM1456 -142v-114h-469v114h167v432q0 7 0.5 19t0.5 17v16h-2l-7 -12q-8 -13 -26 -31l-62 -58l-82 86l192 185h123v-654h165zM1486 1189q0 -62 -13 -121.5t-41 -114t-68 -95.5t-98.5 -65.5t-127.5 -24.5q-62 0 -108 16q-24 8 -42 15l39 113q15 -7 31 -11q37 -13 75 -13 q84 0 134.5 58.5t66.5 145.5h-2q-21 -23 -61.5 -37t-84.5 -14q-106 0 -173 71.5t-67 172.5q0 105 72 178t181 73q123 0 205 -94.5t82 -252.5z" />
+<glyph unicode="&#xf164;" horiz-adv-x="1664" d="M256 192q0 26 -19 45t-45 19q-27 0 -45.5 -19t-18.5 -45q0 -27 18.5 -45.5t45.5 -18.5q26 0 45 18.5t19 45.5zM416 704v-640q0 -26 -19 -45t-45 -19h-288q-26 0 -45 19t-19 45v640q0 26 19 45t45 19h288q26 0 45 -19t19 -45zM1600 704q0 -86 -55 -149q15 -44 15 -76 q3 -76 -43 -137q17 -56 0 -117q-15 -57 -54 -94q9 -112 -49 -181q-64 -76 -197 -78h-36h-76h-17q-66 0 -144 15.5t-121.5 29t-120.5 39.5q-123 43 -158 44q-26 1 -45 19.5t-19 44.5v641q0 25 18 43.5t43 20.5q24 2 76 59t101 121q68 87 101 120q18 18 31 48t17.5 48.5 t13.5 60.5q7 39 12.5 61t19.5 52t34 50q19 19 45 19q46 0 82.5 -10.5t60 -26t40 -40.5t24 -45t12 -50t5 -45t0.5 -39q0 -38 -9.5 -76t-19 -60t-27.5 -56q-3 -6 -10 -18t-11 -22t-8 -24h277q78 0 135 -57t57 -135z" />
+<glyph unicode="&#xf165;" horiz-adv-x="1664" d="M256 960q0 -26 -19 -45t-45 -19q-27 0 -45.5 19t-18.5 45q0 27 18.5 45.5t45.5 18.5q26 0 45 -18.5t19 -45.5zM416 448v640q0 26 -19 45t-45 19h-288q-26 0 -45 -19t-19 -45v-640q0 -26 19 -45t45 -19h288q26 0 45 19t19 45zM1545 597q55 -61 55 -149q-1 -78 -57.5 -135 t-134.5 -57h-277q4 -14 8 -24t11 -22t10 -18q18 -37 27 -57t19 -58.5t10 -76.5q0 -24 -0.5 -39t-5 -45t-12 -50t-24 -45t-40 -40.5t-60 -26t-82.5 -10.5q-26 0 -45 19q-20 20 -34 50t-19.5 52t-12.5 61q-9 42 -13.5 60.5t-17.5 48.5t-31 48q-33 33 -101 120q-49 64 -101 121 t-76 59q-25 2 -43 20.5t-18 43.5v641q0 26 19 44.5t45 19.5q35 1 158 44q77 26 120.5 39.5t121.5 29t144 15.5h17h76h36q133 -2 197 -78q58 -69 49 -181q39 -37 54 -94q17 -61 0 -117q46 -61 43 -137q0 -32 -15 -76z" />
+<glyph unicode="&#xf166;" d="M919 233v157q0 50 -29 50q-17 0 -33 -16v-224q16 -16 33 -16q29 0 29 49zM1103 355h66v34q0 51 -33 51t-33 -51v-34zM532 621v-70h-80v-423h-74v423h-78v70h232zM733 495v-367h-67v40q-39 -45 -76 -45q-33 0 -42 28q-6 16 -6 54v290h66v-270q0 -24 1 -26q1 -15 15 -15 q20 0 42 31v280h67zM985 384v-146q0 -52 -7 -73q-12 -42 -53 -42q-35 0 -68 41v-36h-67v493h67v-161q32 40 68 40q41 0 53 -42q7 -21 7 -74zM1236 255v-9q0 -29 -2 -43q-3 -22 -15 -40q-27 -40 -80 -40q-52 0 -81 38q-21 27 -21 86v129q0 59 20 86q29 38 80 38t78 -38 q21 -28 21 -86v-76h-133v-65q0 -51 34 -51q24 0 30 26q0 1 0.5 7t0.5 16.5v21.5h68zM785 1079v-156q0 -51 -32 -51t-32 51v156q0 52 32 52t32 -52zM1318 366q0 177 -19 260q-10 44 -43 73.5t-76 34.5q-136 15 -412 15q-275 0 -411 -15q-44 -5 -76.5 -34.5t-42.5 -73.5 q-20 -87 -20 -260q0 -176 20 -260q10 -43 42.5 -73t75.5 -35q137 -15 412 -15t412 15q43 5 75.5 35t42.5 73q20 84 20 260zM563 1017l90 296h-75l-51 -195l-53 195h-78l24 -69t23 -69q35 -103 46 -158v-201h74v201zM852 936v130q0 58 -21 87q-29 38 -78 38q-51 0 -78 -38 q-21 -29 -21 -87v-130q0 -58 21 -87q27 -38 78 -38q49 0 78 38q21 27 21 87zM1033 816h67v370h-67v-283q-22 -31 -42 -31q-15 0 -16 16q-1 2 -1 26v272h-67v-293q0 -37 6 -55q11 -27 43 -27q36 0 77 45v-40zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960 q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf167;" d="M971 292v-211q0 -67 -39 -67q-23 0 -45 22v301q22 22 45 22q39 0 39 -67zM1309 291v-46h-90v46q0 68 45 68t45 -68zM343 509h107v94h-312v-94h105v-569h100v569zM631 -60h89v494h-89v-378q-30 -42 -57 -42q-18 0 -21 21q-1 3 -1 35v364h-89v-391q0 -49 8 -73 q12 -37 58 -37q48 0 102 61v-54zM1060 88v197q0 73 -9 99q-17 56 -71 56q-50 0 -93 -54v217h-89v-663h89v48q45 -55 93 -55q54 0 71 55q9 27 9 100zM1398 98v13h-91q0 -51 -2 -61q-7 -36 -40 -36q-46 0 -46 69v87h179v103q0 79 -27 116q-39 51 -106 51q-68 0 -107 -51 q-28 -37 -28 -116v-173q0 -79 29 -116q39 -51 108 -51q72 0 108 53q18 27 21 54q2 9 2 58zM790 1011v210q0 69 -43 69t-43 -69v-210q0 -70 43 -70t43 70zM1509 260q0 -234 -26 -350q-14 -59 -58 -99t-102 -46q-184 -21 -555 -21t-555 21q-58 6 -102.5 46t-57.5 99 q-26 112 -26 350q0 234 26 350q14 59 58 99t103 47q183 20 554 20t555 -20q58 -7 102.5 -47t57.5 -99q26 -112 26 -350zM511 1536h102l-121 -399v-271h-100v271q-14 74 -61 212q-37 103 -65 187h106l71 -263zM881 1203v-175q0 -81 -28 -118q-37 -51 -106 -51q-67 0 -105 51 q-28 38 -28 118v175q0 80 28 117q38 51 105 51q69 0 106 -51q28 -37 28 -117zM1216 1365v-499h-91v55q-53 -62 -103 -62q-46 0 -59 37q-8 24 -8 75v394h91v-367q0 -33 1 -35q3 -22 21 -22q27 0 57 43v381h91z" />
+<glyph unicode="&#xf168;" horiz-adv-x="1408" d="M597 869q-10 -18 -257 -456q-27 -46 -65 -46h-239q-21 0 -31 17t0 36l253 448q1 0 0 1l-161 279q-12 22 -1 37q9 15 32 15h239q40 0 66 -45zM1403 1511q11 -16 0 -37l-528 -934v-1l336 -615q11 -20 1 -37q-10 -15 -32 -15h-239q-42 0 -66 45l-339 622q18 32 531 942 q25 45 64 45h241q22 0 31 -15z" />
+<glyph unicode="&#xf169;" d="M685 771q0 1 -126 222q-21 34 -52 34h-184q-18 0 -26 -11q-7 -12 1 -29l125 -216v-1l-196 -346q-9 -14 0 -28q8 -13 24 -13h185q31 0 50 36zM1309 1268q-7 12 -24 12h-187q-30 0 -49 -35l-411 -729q1 -2 262 -481q20 -35 52 -35h184q18 0 25 12q8 13 -1 28l-260 476v1 l409 723q8 16 0 28zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf16a;" horiz-adv-x="1792" d="M1280 640q0 37 -30 54l-512 320q-31 20 -65 2q-33 -18 -33 -56v-640q0 -38 33 -56q16 -8 31 -8q20 0 34 10l512 320q30 17 30 54zM1792 640q0 -96 -1 -150t-8.5 -136.5t-22.5 -147.5q-16 -73 -69 -123t-124 -58q-222 -25 -671 -25t-671 25q-71 8 -124.5 58t-69.5 123 q-14 65 -21.5 147.5t-8.5 136.5t-1 150t1 150t8.5 136.5t22.5 147.5q16 73 69 123t124 58q222 25 671 25t671 -25q71 -8 124.5 -58t69.5 -123q14 -65 21.5 -147.5t8.5 -136.5t1 -150z" />
+<glyph unicode="&#xf16b;" horiz-adv-x="1792" d="M402 829l494 -305l-342 -285l-490 319zM1388 274v-108l-490 -293v-1l-1 1l-1 -1v1l-489 293v108l147 -96l342 284v2l1 -1l1 1v-2l343 -284zM554 1418l342 -285l-494 -304l-338 270zM1390 829l338 -271l-489 -319l-343 285zM1239 1418l489 -319l-338 -270l-494 304z" />
+<glyph unicode="&#xf16c;" horiz-adv-x="1408" d="M928 135v-151l-707 -1v151zM1169 481v-701l-1 -35v-1h-1132l-35 1h-1v736h121v-618h928v618h120zM241 393l704 -65l-13 -150l-705 65zM309 709l683 -183l-39 -146l-683 183zM472 1058l609 -360l-77 -130l-609 360zM832 1389l398 -585l-124 -85l-399 584zM1285 1536 l121 -697l-149 -26l-121 697z" />
+<glyph unicode="&#xf16d;" d="M1362 110v648h-135q20 -63 20 -131q0 -126 -64 -232.5t-174 -168.5t-240 -62q-197 0 -337 135.5t-140 327.5q0 68 20 131h-141v-648q0 -26 17.5 -43.5t43.5 -17.5h1069q25 0 43 17.5t18 43.5zM1078 643q0 124 -90.5 211.5t-218.5 87.5q-127 0 -217.5 -87.5t-90.5 -211.5 t90.5 -211.5t217.5 -87.5q128 0 218.5 87.5t90.5 211.5zM1362 1003v165q0 28 -20 48.5t-49 20.5h-174q-29 0 -49 -20.5t-20 -48.5v-165q0 -29 20 -49t49 -20h174q29 0 49 20t20 49zM1536 1211v-1142q0 -81 -58 -139t-139 -58h-1142q-81 0 -139 58t-58 139v1142q0 81 58 139 t139 58h1142q81 0 139 -58t58 -139z" />
+<glyph unicode="&#xf16e;" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM698 640q0 88 -62 150t-150 62t-150 -62t-62 -150t62 -150t150 -62t150 62t62 150zM1262 640q0 88 -62 150 t-150 62t-150 -62t-62 -150t62 -150t150 -62t150 62t62 150z" />
+<glyph unicode="&#xf170;" d="M768 914l201 -306h-402zM1133 384h94l-459 691l-459 -691h94l104 160h522zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf171;" horiz-adv-x="1408" d="M815 677q8 -63 -50.5 -101t-111.5 -6q-39 17 -53.5 58t-0.5 82t52 58q36 18 72.5 12t64 -35.5t27.5 -67.5zM926 698q-14 107 -113 164t-197 13q-63 -28 -100.5 -88.5t-34.5 -129.5q4 -91 77.5 -155t165.5 -56q91 8 152 84t50 168zM1165 1240q-20 27 -56 44.5t-58 22 t-71 12.5q-291 47 -566 -2q-43 -7 -66 -12t-55 -22t-50 -43q30 -28 76 -45.5t73.5 -22t87.5 -11.5q228 -29 448 -1q63 8 89.5 12t72.5 21.5t75 46.5zM1222 205q-8 -26 -15.5 -76.5t-14 -84t-28.5 -70t-58 -56.5q-86 -48 -189.5 -71.5t-202 -22t-201.5 18.5q-46 8 -81.5 18 t-76.5 27t-73 43.5t-52 61.5q-25 96 -57 292l6 16l18 9q223 -148 506.5 -148t507.5 148q21 -6 24 -23t-5 -45t-8 -37zM1403 1166q-26 -167 -111 -655q-5 -30 -27 -56t-43.5 -40t-54.5 -31q-252 -126 -610 -88q-248 27 -394 139q-15 12 -25.5 26.5t-17 35t-9 34t-6 39.5 t-5.5 35q-9 50 -26.5 150t-28 161.5t-23.5 147.5t-22 158q3 26 17.5 48.5t31.5 37.5t45 30t46 22.5t48 18.5q125 46 313 64q379 37 676 -50q155 -46 215 -122q16 -20 16.5 -51t-5.5 -54z" />
+<glyph unicode="&#xf172;" d="M848 666q0 43 -41 66t-77 1q-43 -20 -42.5 -72.5t43.5 -70.5q39 -23 81 4t36 72zM928 682q8 -66 -36 -121t-110 -61t-119 40t-56 113q-2 49 25.5 93t72.5 64q70 31 141.5 -10t81.5 -118zM1100 1073q-20 -21 -53.5 -34t-53 -16t-63.5 -8q-155 -20 -324 0q-44 6 -63 9.5 t-52.5 16t-54.5 32.5q13 19 36 31t40 15.5t47 8.5q198 35 408 1q33 -5 51 -8.5t43 -16t39 -31.5zM1142 327q0 7 5.5 26.5t3 32t-17.5 16.5q-161 -106 -365 -106t-366 106l-12 -6l-5 -12q26 -154 41 -210q47 -81 204 -108q249 -46 428 53q34 19 49 51.5t22.5 85.5t12.5 71z M1272 1020q9 53 -8 75q-43 55 -155 88q-216 63 -487 36q-132 -12 -226 -46q-38 -15 -59.5 -25t-47 -34t-29.5 -54q8 -68 19 -138t29 -171t24 -137q1 -5 5 -31t7 -36t12 -27t22 -28q105 -80 284 -100q259 -28 440 63q24 13 39.5 23t31 29t19.5 40q48 267 80 473zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf173;" horiz-adv-x="1024" d="M390 1408h219v-388h364v-241h-364v-394q0 -136 14 -172q13 -37 52 -60q50 -31 117 -31q117 0 232 76v-242q-102 -48 -178 -65q-77 -19 -173 -19q-105 0 -186 27q-78 25 -138 75q-58 51 -79 105q-22 54 -22 161v539h-170v217q91 30 155 84q64 55 103 132q39 78 54 196z " />
+<glyph unicode="&#xf174;" d="M1123 127v181q-88 -56 -174 -56q-51 0 -88 23q-29 17 -39 45q-11 30 -11 129v295h274v181h-274v291h-164q-11 -90 -40 -147t-78 -99q-48 -40 -116 -63v-163h127v-404q0 -78 17 -121q17 -42 59 -78q43 -37 104 -57q62 -20 140 -20q67 0 129 14q57 13 134 49zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf175;" horiz-adv-x="768" d="M765 237q8 -19 -5 -35l-350 -384q-10 -10 -23 -10q-14 0 -24 10l-355 384q-13 16 -5 35q9 19 29 19h224v1248q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1248h224q21 0 29 -19z" />
+<glyph unicode="&#xf176;" horiz-adv-x="768" d="M765 1043q-9 -19 -29 -19h-224v-1248q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v1248h-224q-21 0 -29 19t5 35l350 384q10 10 23 10q14 0 24 -10l355 -384q13 -16 5 -35z" />
+<glyph unicode="&#xf177;" horiz-adv-x="1792" d="M1792 736v-192q0 -14 -9 -23t-23 -9h-1248v-224q0 -21 -19 -29t-35 5l-384 350q-10 10 -10 23q0 14 10 24l384 354q16 14 35 6q19 -9 19 -29v-224h1248q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf178;" horiz-adv-x="1792" d="M1728 643q0 -14 -10 -24l-384 -354q-16 -14 -35 -6q-19 9 -19 29v224h-1248q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h1248v224q0 21 19 29t35 -5l384 -350q10 -10 10 -23z" />
+<glyph unicode="&#xf179;" horiz-adv-x="1408" d="M1393 321q-39 -125 -123 -250q-129 -196 -257 -196q-49 0 -140 32q-86 32 -151 32q-61 0 -142 -33q-81 -34 -132 -34q-152 0 -301 259q-147 261 -147 503q0 228 113 374q112 144 284 144q72 0 177 -30q104 -30 138 -30q45 0 143 34q102 34 173 34q119 0 213 -65 q52 -36 104 -100q-79 -67 -114 -118q-65 -94 -65 -207q0 -124 69 -223t158 -126zM1017 1494q0 -61 -29 -136q-30 -75 -93 -138q-54 -54 -108 -72q-37 -11 -104 -17q3 149 78 257q74 107 250 148q1 -3 2.5 -11t2.5 -11q0 -4 0.5 -10t0.5 -10z" />
+<glyph unicode="&#xf17a;" horiz-adv-x="1664" d="M682 530v-651l-682 94v557h682zM682 1273v-659h-682v565zM1664 530v-786l-907 125v661h907zM1664 1408v-794h-907v669z" />
+<glyph unicode="&#xf17b;" horiz-adv-x="1408" d="M493 1053q16 0 27.5 11.5t11.5 27.5t-11.5 27.5t-27.5 11.5t-27 -11.5t-11 -27.5t11 -27.5t27 -11.5zM915 1053q16 0 27 11.5t11 27.5t-11 27.5t-27 11.5t-27.5 -11.5t-11.5 -27.5t11.5 -27.5t27.5 -11.5zM103 869q42 0 72 -30t30 -72v-430q0 -43 -29.5 -73t-72.5 -30 t-73 30t-30 73v430q0 42 30 72t73 30zM1163 850v-666q0 -46 -32 -78t-77 -32h-75v-227q0 -43 -30 -73t-73 -30t-73 30t-30 73v227h-138v-227q0 -43 -30 -73t-73 -30q-42 0 -72 30t-30 73l-1 227h-74q-46 0 -78 32t-32 78v666h918zM931 1255q107 -55 171 -153.5t64 -215.5 h-925q0 117 64 215.5t172 153.5l-71 131q-7 13 5 20q13 6 20 -6l72 -132q95 42 201 42t201 -42l72 132q7 12 20 6q12 -7 5 -20zM1408 767v-430q0 -43 -30 -73t-73 -30q-42 0 -72 30t-30 73v430q0 43 30 72.5t72 29.5q43 0 73 -29.5t30 -72.5z" />
+<glyph unicode="&#xf17c;" d="M663 1125q-11 -1 -15.5 -10.5t-8.5 -9.5q-5 -1 -5 5q0 12 19 15h10zM750 1111q-4 -1 -11.5 6.5t-17.5 4.5q24 11 32 -2q3 -6 -3 -9zM399 684q-4 1 -6 -3t-4.5 -12.5t-5.5 -13.5t-10 -13q-7 -10 -1 -12q4 -1 12.5 7t12.5 18q1 3 2 7t2 6t1.5 4.5t0.5 4v3t-1 2.5t-3 2z M1254 325q0 18 -55 42q4 15 7.5 27.5t5 26t3 21.5t0.5 22.5t-1 19.5t-3.5 22t-4 20.5t-5 25t-5.5 26.5q-10 48 -47 103t-72 75q24 -20 57 -83q87 -162 54 -278q-11 -40 -50 -42q-31 -4 -38.5 18.5t-8 83.5t-11.5 107q-9 39 -19.5 69t-19.5 45.5t-15.5 24.5t-13 15t-7.5 7 q-14 62 -31 103t-29.5 56t-23.5 33t-15 40q-4 21 6 53.5t4.5 49.5t-44.5 25q-15 3 -44.5 18t-35.5 16q-8 1 -11 26t8 51t36 27q37 3 51 -30t4 -58q-11 -19 -2 -26.5t30 -0.5q13 4 13 36v37q-5 30 -13.5 50t-21 30.5t-23.5 15t-27 7.5q-107 -8 -89 -134q0 -15 -1 -15 q-9 9 -29.5 10.5t-33 -0.5t-15.5 5q1 57 -16 90t-45 34q-27 1 -41.5 -27.5t-16.5 -59.5q-1 -15 3.5 -37t13 -37.5t15.5 -13.5q10 3 16 14q4 9 -7 8q-7 0 -15.5 14.5t-9.5 33.5q-1 22 9 37t34 14q17 0 27 -21t9.5 -39t-1.5 -22q-22 -15 -31 -29q-8 -12 -27.5 -23.5 t-20.5 -12.5q-13 -14 -15.5 -27t7.5 -18q14 -8 25 -19.5t16 -19t18.5 -13t35.5 -6.5q47 -2 102 15q2 1 23 7t34.5 10.5t29.5 13t21 17.5q9 14 20 8q5 -3 6.5 -8.5t-3 -12t-16.5 -9.5q-20 -6 -56.5 -21.5t-45.5 -19.5q-44 -19 -70 -23q-25 -5 -79 2q-10 2 -9 -2t17 -19 q25 -23 67 -22q17 1 36 7t36 14t33.5 17.5t30 17t24.5 12t17.5 2.5t8.5 -11q0 -2 -1 -4.5t-4 -5t-6 -4.5t-8.5 -5t-9 -4.5t-10 -5t-9.5 -4.5q-28 -14 -67.5 -44t-66.5 -43t-49 -1q-21 11 -63 73q-22 31 -25 22q-1 -3 -1 -10q0 -25 -15 -56.5t-29.5 -55.5t-21 -58t11.5 -63 q-23 -6 -62.5 -90t-47.5 -141q-2 -18 -1.5 -69t-5.5 -59q-8 -24 -29 -3q-32 31 -36 94q-2 28 4 56q4 19 -1 18l-4 -5q-36 -65 10 -166q5 -12 25 -28t24 -20q20 -23 104 -90.5t93 -76.5q16 -15 17.5 -38t-14 -43t-45.5 -23q8 -15 29 -44.5t28 -54t7 -70.5q46 24 7 92 q-4 8 -10.5 16t-9.5 12t-2 6q3 5 13 9.5t20 -2.5q46 -52 166 -36q133 15 177 87q23 38 34 30q12 -6 10 -52q-1 -25 -23 -92q-9 -23 -6 -37.5t24 -15.5q3 19 14.5 77t13.5 90q2 21 -6.5 73.5t-7.5 97t23 70.5q15 18 51 18q1 37 34.5 53t72.5 10.5t60 -22.5zM626 1152 q3 17 -2.5 30t-11.5 15q-9 2 -9 -7q2 -5 5 -6q10 0 7 -15q-3 -20 8 -20q3 0 3 3zM1045 955q-2 8 -6.5 11.5t-13 5t-14.5 5.5q-5 3 -9.5 8t-7 8t-5.5 6.5t-4 4t-4 -1.5q-14 -16 7 -43.5t39 -31.5q9 -1 14.5 8t3.5 20zM867 1168q0 11 -5 19.5t-11 12.5t-9 3q-14 -1 -7 -7l4 -2 q14 -4 18 -31q0 -3 8 2zM921 1401q0 2 -2.5 5t-9 7t-9.5 6q-15 15 -24 15q-9 -1 -11.5 -7.5t-1 -13t-0.5 -12.5q-1 -4 -6 -10.5t-6 -9t3 -8.5q4 -3 8 0t11 9t15 9q1 1 9 1t15 2t9 7zM1486 60q20 -12 31 -24.5t12 -24t-2.5 -22.5t-15.5 -22t-23.5 -19.5t-30 -18.5 t-31.5 -16.5t-32 -15.5t-27 -13q-38 -19 -85.5 -56t-75.5 -64q-17 -16 -68 -19.5t-89 14.5q-18 9 -29.5 23.5t-16.5 25.5t-22 19.5t-47 9.5q-44 1 -130 1q-19 0 -57 -1.5t-58 -2.5q-44 -1 -79.5 -15t-53.5 -30t-43.5 -28.5t-53.5 -11.5q-29 1 -111 31t-146 43q-19 4 -51 9.5 t-50 9t-39.5 9.5t-33.5 14.5t-17 19.5q-10 23 7 66.5t18 54.5q1 16 -4 40t-10 42.5t-4.5 36.5t10.5 27q14 12 57 14t60 12q30 18 42 35t12 51q21 -73 -32 -106q-32 -20 -83 -15q-34 3 -43 -10q-13 -15 5 -57q2 -6 8 -18t8.5 -18t4.5 -17t1 -22q0 -15 -17 -49t-14 -48 q3 -17 37 -26q20 -6 84.5 -18.5t99.5 -20.5q24 -6 74 -22t82.5 -23t55.5 -4q43 6 64.5 28t23 48t-7.5 58.5t-19 52t-20 36.5q-121 190 -169 242q-68 74 -113 40q-11 -9 -15 15q-3 16 -2 38q1 29 10 52t24 47t22 42q8 21 26.5 72t29.5 78t30 61t39 54q110 143 124 195 q-12 112 -16 310q-2 90 24 151.5t106 104.5q39 21 104 21q53 1 106 -13.5t89 -41.5q57 -42 91.5 -121.5t29.5 -147.5q-5 -95 30 -214q34 -113 133 -218q55 -59 99.5 -163t59.5 -191q8 -49 5 -84.5t-12 -55.5t-20 -22q-10 -2 -23.5 -19t-27 -35.5t-40.5 -33.5t-61 -14 q-18 1 -31.5 5t-22.5 13.5t-13.5 15.5t-11.5 20.5t-9 19.5q-22 37 -41 30t-28 -49t7 -97q20 -70 1 -195q-10 -65 18 -100.5t73 -33t85 35.5q59 49 89.5 66.5t103.5 42.5q53 18 77 36.5t18.5 34.5t-25 28.5t-51.5 23.5q-33 11 -49.5 48t-15 72.5t15.5 47.5q1 -31 8 -56.5 t14.5 -40.5t20.5 -28.5t21 -19t21.5 -13t16.5 -9.5z" />
+<glyph unicode="&#xf17d;" d="M1024 36q-42 241 -140 498h-2l-2 -1q-16 -6 -43 -16.5t-101 -49t-137 -82t-131 -114.5t-103 -148l-15 11q184 -150 418 -150q132 0 256 52zM839 643q-21 49 -53 111q-311 -93 -673 -93q-1 -7 -1 -21q0 -124 44 -236.5t124 -201.5q50 89 123.5 166.5t142.5 124.5t130.5 81 t99.5 48l37 13q4 1 13 3.5t13 4.5zM732 855q-120 213 -244 378q-138 -65 -234 -186t-128 -272q302 0 606 80zM1416 536q-210 60 -409 29q87 -239 128 -469q111 75 185 189.5t96 250.5zM611 1277q-1 0 -2 -1q1 1 2 1zM1201 1132q-185 164 -433 164q-76 0 -155 -19 q131 -170 246 -382q69 26 130 60.5t96.5 61.5t65.5 57t37.5 40.5zM1424 647q-3 232 -149 410l-1 -1q-9 -12 -19 -24.5t-43.5 -44.5t-71 -60.5t-100 -65t-131.5 -64.5q25 -53 44 -95q2 -6 6.5 -17.5t7.5 -16.5q36 5 74.5 7t73.5 2t69 -1.5t64 -4t56.5 -5.5t48 -6.5t36.5 -6 t25 -4.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf17e;" d="M1173 473q0 50 -19.5 91.5t-48.5 68.5t-73 49t-82.5 34t-87.5 23l-104 24q-30 7 -44 10.5t-35 11.5t-30 16t-16.5 21t-7.5 30q0 77 144 77q43 0 77 -12t54 -28.5t38 -33.5t40 -29t48 -12q47 0 75.5 32t28.5 77q0 55 -56 99.5t-142 67.5t-182 23q-68 0 -132 -15.5 t-119.5 -47t-89 -87t-33.5 -128.5q0 -61 19 -106.5t56 -75.5t80 -48.5t103 -32.5l146 -36q90 -22 112 -36q32 -20 32 -60q0 -39 -40 -64.5t-105 -25.5q-51 0 -91.5 16t-65 38.5t-45.5 45t-46 38.5t-54 16q-50 0 -75.5 -30t-25.5 -75q0 -92 122 -157.5t291 -65.5 q73 0 140 18.5t122.5 53.5t88.5 93.5t33 131.5zM1536 256q0 -159 -112.5 -271.5t-271.5 -112.5q-130 0 -234 80q-77 -16 -150 -16q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5q0 73 16 150q-80 104 -80 234q0 159 112.5 271.5t271.5 112.5q130 0 234 -80 q77 16 150 16q143 0 273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -73 -16 -150q80 -104 80 -234z" />
+<glyph unicode="&#xf180;" horiz-adv-x="1664" d="M1483 512l-587 -587q-52 -53 -127.5 -53t-128.5 53l-587 587q-53 53 -53 128t53 128l587 587q53 53 128 53t128 -53l265 -265l-398 -399l-188 188q-42 42 -99 42q-59 0 -100 -41l-120 -121q-42 -40 -42 -99q0 -58 42 -100l406 -408q30 -28 67 -37l6 -4h28q60 0 99 41 l619 619l2 -3q53 -53 53 -128t-53 -128zM1406 1138l120 -120q14 -15 14 -36t-14 -36l-730 -730q-17 -15 -37 -15v0q-4 0 -6 1q-18 2 -30 14l-407 408q-14 15 -14 36t14 35l121 120q13 15 35 15t36 -15l252 -252l574 575q15 15 36 15t36 -15z" />
+<glyph unicode="&#xf181;" d="M704 192v1024q0 14 -9 23t-23 9h-480q-14 0 -23 -9t-9 -23v-1024q0 -14 9 -23t23 -9h480q14 0 23 9t9 23zM1376 576v640q0 14 -9 23t-23 9h-480q-14 0 -23 -9t-9 -23v-640q0 -14 9 -23t23 -9h480q14 0 23 9t9 23zM1536 1344v-1408q0 -26 -19 -45t-45 -19h-1408 q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf182;" horiz-adv-x="1280" d="M1280 480q0 -40 -28 -68t-68 -28q-51 0 -80 43l-227 341h-45v-132l247 -411q9 -15 9 -33q0 -26 -19 -45t-45 -19h-192v-272q0 -46 -33 -79t-79 -33h-160q-46 0 -79 33t-33 79v272h-192q-26 0 -45 19t-19 45q0 18 9 33l247 411v132h-45l-227 -341q-29 -43 -80 -43 q-40 0 -68 28t-28 68q0 29 16 53l256 384q73 107 176 107h384q103 0 176 -107l256 -384q16 -24 16 -53zM864 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" />
+<glyph unicode="&#xf183;" horiz-adv-x="1024" d="M1024 832v-416q0 -40 -28 -68t-68 -28t-68 28t-28 68v352h-64v-912q0 -46 -33 -79t-79 -33t-79 33t-33 79v464h-64v-464q0 -46 -33 -79t-79 -33t-79 33t-33 79v912h-64v-352q0 -40 -28 -68t-68 -28t-68 28t-28 68v416q0 80 56 136t136 56h640q80 0 136 -56t56 -136z M736 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" />
+<glyph unicode="&#xf184;" d="M773 234l350 473q16 22 24.5 59t-6 85t-61.5 79q-40 26 -83 25.5t-73.5 -17.5t-54.5 -45q-36 -40 -96 -40q-59 0 -95 40q-24 28 -54.5 45t-73.5 17.5t-84 -25.5q-46 -31 -60.5 -79t-6 -85t24.5 -59zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf185;" horiz-adv-x="1792" d="M1472 640q0 117 -45.5 223.5t-123 184t-184 123t-223.5 45.5t-223.5 -45.5t-184 -123t-123 -184t-45.5 -223.5t45.5 -223.5t123 -184t184 -123t223.5 -45.5t223.5 45.5t184 123t123 184t45.5 223.5zM1748 363q-4 -15 -20 -20l-292 -96v-306q0 -16 -13 -26q-15 -10 -29 -4 l-292 94l-180 -248q-10 -13 -26 -13t-26 13l-180 248l-292 -94q-14 -6 -29 4q-13 10 -13 26v306l-292 96q-16 5 -20 20q-5 17 4 29l180 248l-180 248q-9 13 -4 29q4 15 20 20l292 96v306q0 16 13 26q15 10 29 4l292 -94l180 248q9 12 26 12t26 -12l180 -248l292 94 q14 6 29 -4q13 -10 13 -26v-306l292 -96q16 -5 20 -20q5 -16 -4 -29l-180 -248l180 -248q9 -12 4 -29z" />
+<glyph unicode="&#xf186;" d="M1262 233q-54 -9 -110 -9q-182 0 -337 90t-245 245t-90 337q0 192 104 357q-201 -60 -328.5 -229t-127.5 -384q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51q144 0 273.5 61.5t220.5 171.5zM1465 318q-94 -203 -283.5 -324.5t-413.5 -121.5q-156 0 -298 61 t-245 164t-164 245t-61 298q0 153 57.5 292.5t156 241.5t235.5 164.5t290 68.5q44 2 61 -39q18 -41 -15 -72q-86 -78 -131.5 -181.5t-45.5 -218.5q0 -148 73 -273t198 -198t273 -73q118 0 228 51q41 18 72 -13q14 -14 17.5 -34t-4.5 -38z" />
+<glyph unicode="&#xf187;" horiz-adv-x="1792" d="M1088 704q0 26 -19 45t-45 19h-256q-26 0 -45 -19t-19 -45t19 -45t45 -19h256q26 0 45 19t19 45zM1664 896v-960q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v960q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1728 1344v-256q0 -26 -19 -45t-45 -19h-1536 q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1536q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf188;" horiz-adv-x="1664" d="M1632 576q0 -26 -19 -45t-45 -19h-224q0 -171 -67 -290l208 -209q19 -19 19 -45t-19 -45q-18 -19 -45 -19t-45 19l-198 197q-5 -5 -15 -13t-42 -28.5t-65 -36.5t-82 -29t-97 -13v896h-128v-896q-51 0 -101.5 13.5t-87 33t-66 39t-43.5 32.5l-15 14l-183 -207 q-20 -21 -48 -21q-24 0 -43 16q-19 18 -20.5 44.5t15.5 46.5l202 227q-58 114 -58 274h-224q-26 0 -45 19t-19 45t19 45t45 19h224v294l-173 173q-19 19 -19 45t19 45t45 19t45 -19l173 -173h844l173 173q19 19 45 19t45 -19t19 -45t-19 -45l-173 -173v-294h224q26 0 45 -19 t19 -45zM1152 1152h-640q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5z" />
+<glyph unicode="&#xf189;" horiz-adv-x="1920" d="M1917 1016q23 -64 -150 -294q-24 -32 -65 -85q-78 -100 -90 -131q-17 -41 14 -81q17 -21 81 -82h1l1 -1l1 -1l2 -2q141 -131 191 -221q3 -5 6.5 -12.5t7 -26.5t-0.5 -34t-25 -27.5t-59 -12.5l-256 -4q-24 -5 -56 5t-52 22l-20 12q-30 21 -70 64t-68.5 77.5t-61 58 t-56.5 15.5q-3 -1 -8 -3.5t-17 -14.5t-21.5 -29.5t-17 -52t-6.5 -77.5q0 -15 -3.5 -27.5t-7.5 -18.5l-4 -5q-18 -19 -53 -22h-115q-71 -4 -146 16.5t-131.5 53t-103 66t-70.5 57.5l-25 24q-10 10 -27.5 30t-71.5 91t-106 151t-122.5 211t-130.5 272q-6 16 -6 27t3 16l4 6 q15 19 57 19l274 2q12 -2 23 -6.5t16 -8.5l5 -3q16 -11 24 -32q20 -50 46 -103.5t41 -81.5l16 -29q29 -60 56 -104t48.5 -68.5t41.5 -38.5t34 -14t27 5q2 1 5 5t12 22t13.5 47t9.5 81t0 125q-2 40 -9 73t-14 46l-6 12q-25 34 -85 43q-13 2 5 24q17 19 38 30q53 26 239 24 q82 -1 135 -13q20 -5 33.5 -13.5t20.5 -24t10.5 -32t3.5 -45.5t-1 -55t-2.5 -70.5t-1.5 -82.5q0 -11 -1 -42t-0.5 -48t3.5 -40.5t11.5 -39t22.5 -24.5q8 -2 17 -4t26 11t38 34.5t52 67t68 107.5q60 104 107 225q4 10 10 17.5t11 10.5l4 3l5 2.5t13 3t20 0.5l288 2 q39 5 64 -2.5t31 -16.5z" />
+<glyph unicode="&#xf18a;" horiz-adv-x="1792" d="M675 252q21 34 11 69t-45 50q-34 14 -73 1t-60 -46q-22 -34 -13 -68.5t43 -50.5t74.5 -2.5t62.5 47.5zM769 373q8 13 3.5 26.5t-17.5 18.5q-14 5 -28.5 -0.5t-21.5 -18.5q-17 -31 13 -45q14 -5 29 0.5t22 18.5zM943 266q-45 -102 -158 -150t-224 -12 q-107 34 -147.5 126.5t6.5 187.5q47 93 151.5 139t210.5 19q111 -29 158.5 -119.5t2.5 -190.5zM1255 426q-9 96 -89 170t-208.5 109t-274.5 21q-223 -23 -369.5 -141.5t-132.5 -264.5q9 -96 89 -170t208.5 -109t274.5 -21q223 23 369.5 141.5t132.5 264.5zM1563 422 q0 -68 -37 -139.5t-109 -137t-168.5 -117.5t-226 -83t-270.5 -31t-275 33.5t-240.5 93t-171.5 151t-65 199.5q0 115 69.5 245t197.5 258q169 169 341.5 236t246.5 -7q65 -64 20 -209q-4 -14 -1 -20t10 -7t14.5 0.5t13.5 3.5l6 2q139 59 246 59t153 -61q45 -63 0 -178 q-2 -13 -4.5 -20t4.5 -12.5t12 -7.5t17 -6q57 -18 103 -47t80 -81.5t34 -116.5zM1489 1046q42 -47 54.5 -108.5t-6.5 -117.5q-8 -23 -29.5 -34t-44.5 -4q-23 8 -34 29.5t-4 44.5q20 63 -24 111t-107 35q-24 -5 -45 8t-25 37q-5 24 8 44.5t37 25.5q60 13 119 -5.5t101 -65.5z M1670 1209q87 -96 112.5 -222.5t-13.5 -241.5q-9 -27 -34 -40t-52 -4t-40 34t-5 52q28 82 10 172t-80 158q-62 69 -148 95.5t-173 8.5q-28 -6 -52 9.5t-30 43.5t9.5 51.5t43.5 29.5q123 26 244 -11.5t208 -134.5z" />
+<glyph unicode="&#xf18b;" horiz-adv-x="1920" d="M805 163q-122 -67 -261 -67q-141 0 -261 67q98 61 167 149t94 191q25 -103 94 -191t167 -149zM453 1176v-344q0 -179 -89.5 -326t-234.5 -217q-129 152 -129 351q0 200 129.5 352t323.5 184zM958 991q-128 -152 -128 -351q0 -201 128 -351q-145 70 -234.5 218t-89.5 328 v341q196 -33 324 -185zM1638 163q-122 -67 -261 -67q-141 0 -261 67q98 61 167 149t94 191q25 -103 94 -191t167 -149zM1286 1176v-344q0 -179 -91 -326t-237 -217v0q133 154 133 351q0 195 -133 351q129 151 328 185zM1920 640q0 -201 -129 -351q-145 70 -234.5 218 t-89.5 328v341q194 -32 323.5 -184t129.5 -352z" />
+<glyph unicode="&#xf18c;" horiz-adv-x="1792" />
+<glyph unicode="&#xf18d;" horiz-adv-x="1792" />
+<glyph unicode="&#xf18e;" horiz-adv-x="1792" />
+<glyph unicode="&#xf500;" horiz-adv-x="1792" />
+</font>
+</defs></svg> \ No newline at end of file
diff --git a/library/font_awesome/src/assets/font-awesome/font/fontawesome-webfont.ttf b/library/font_awesome/src/assets/font-awesome/font/fontawesome-webfont.ttf
new file mode 100755
index 000000000..d36592469
--- /dev/null
+++ b/library/font_awesome/src/assets/font-awesome/font/fontawesome-webfont.ttf
Binary files differ
diff --git a/library/font_awesome/src/assets/font-awesome/font/fontawesome-webfont.woff b/library/font_awesome/src/assets/font-awesome/font/fontawesome-webfont.woff
new file mode 100755
index 000000000..b9bd17e15
--- /dev/null
+++ b/library/font_awesome/src/assets/font-awesome/font/fontawesome-webfont.woff
Binary files differ
diff --git a/library/font_awesome/src/assets/font-awesome/less/bootstrap.less b/library/font_awesome/src/assets/font-awesome/less/bootstrap.less
new file mode 100644
index 000000000..a2c96046b
--- /dev/null
+++ b/library/font_awesome/src/assets/font-awesome/less/bootstrap.less
@@ -0,0 +1,84 @@
+/* BOOTSTRAP SPECIFIC CLASSES
+ * -------------------------- */
+
+/* Bootstrap 2.0 sprites.less reset */
+[class^="icon-"],
+[class*=" icon-"] {
+ display: inline;
+ width: auto;
+ height: auto;
+ line-height: normal;
+ vertical-align: baseline;
+ background-image: none;
+ background-position: 0% 0%;
+ background-repeat: repeat;
+ margin-top: 0;
+}
+
+/* more sprites.less reset */
+.icon-white,
+.nav-pills > .active > a > [class^="icon-"],
+.nav-pills > .active > a > [class*=" icon-"],
+.nav-list > .active > a > [class^="icon-"],
+.nav-list > .active > a > [class*=" icon-"],
+.navbar-inverse .nav > .active > a > [class^="icon-"],
+.navbar-inverse .nav > .active > a > [class*=" icon-"],
+.dropdown-menu > li > a:hover > [class^="icon-"],
+.dropdown-menu > li > a:hover > [class*=" icon-"],
+.dropdown-menu > .active > a > [class^="icon-"],
+.dropdown-menu > .active > a > [class*=" icon-"],
+.dropdown-submenu:hover > a > [class^="icon-"],
+.dropdown-submenu:hover > a > [class*=" icon-"] {
+ background-image: none;
+}
+
+
+/* keeps Bootstrap styles with and without icons the same */
+.btn, .nav {
+ [class^="icon-"],
+ [class*=" icon-"] {
+// display: inline;
+ &.icon-large { line-height: .9em; }
+ &.icon-spin { display: inline-block; }
+ }
+}
+.nav-tabs, .nav-pills {
+ [class^="icon-"],
+ [class*=" icon-"] {
+ &, &.icon-large { line-height: .9em; }
+ }
+}
+.btn {
+ [class^="icon-"],
+ [class*=" icon-"] {
+ &.pull-left, &.pull-right {
+ &.icon-2x { margin-top: .18em; }
+ }
+ &.icon-spin.icon-large { line-height: .8em; }
+ }
+}
+.btn.btn-small {
+ [class^="icon-"],
+ [class*=" icon-"] {
+ &.pull-left, &.pull-right {
+ &.icon-2x { margin-top: .25em; }
+ }
+ }
+}
+.btn.btn-large {
+ [class^="icon-"],
+ [class*=" icon-"] {
+ margin-top: 0; // overrides bootstrap default
+ &.pull-left, &.pull-right {
+ &.icon-2x { margin-top: .05em; }
+ }
+ &.pull-left.icon-2x { margin-right: .2em; }
+ &.pull-right.icon-2x { margin-left: .2em; }
+ }
+}
+
+/* Fixes alignment in nav lists */
+.nav-list [class^="icon-"],
+.nav-list [class*=" icon-"] {
+ line-height: inherit;
+}
diff --git a/library/font_awesome/src/assets/font-awesome/less/core.less b/library/font_awesome/src/assets/font-awesome/less/core.less
new file mode 100644
index 000000000..1ef7e2235
--- /dev/null
+++ b/library/font_awesome/src/assets/font-awesome/less/core.less
@@ -0,0 +1,129 @@
+/* FONT AWESOME CORE
+ * -------------------------- */
+
+[class^="icon-"],
+[class*=" icon-"] {
+ .icon-FontAwesome();
+}
+
+[class^="icon-"]:before,
+[class*=" icon-"]:before {
+ text-decoration: inherit;
+ display: inline-block;
+ speak: none;
+}
+
+/* makes the font 33% larger relative to the icon container */
+.icon-large:before {
+ vertical-align: -10%;
+ font-size: 4/3em;
+}
+
+/* makes sure icons active on rollover in links */
+a {
+ [class^="icon-"],
+ [class*=" icon-"] {
+ display: inline;
+ }
+}
+
+/* increased font size for icon-large */
+[class^="icon-"],
+[class*=" icon-"] {
+ &.icon-fixed-width {
+ display: inline-block;
+ width: 16/14em;
+ text-align: right;
+ padding-right: 4/14em;
+ &.icon-large {
+ width: 20/14em;
+ }
+ }
+}
+
+.icons-ul {
+ margin-left: @icons-li-width;
+ list-style-type: none;
+
+ > li { position: relative; }
+
+ .icon-li {
+ position: absolute;
+ left: -@icons-li-width;
+ width: @icons-li-width;
+ text-align: center;
+ line-height: inherit;
+ }
+}
+
+// allows usage of the hide class directly on font awesome icons
+[class^="icon-"],
+[class*=" icon-"] {
+ &.hide {
+ display: none;
+ }
+}
+
+.icon-muted { color: @iconMuted; }
+.icon-light { color: @iconLight; }
+.icon-dark { color: @iconDark; }
+
+// Icon Borders
+// -------------------------
+
+.icon-border {
+ border: solid 1px @borderColor;
+ padding: .2em .25em .15em;
+ .border-radius(3px);
+}
+
+// Icon Sizes
+// -------------------------
+
+.icon-2x {
+ font-size: 2em;
+ &.icon-border {
+ border-width: 2px;
+ .border-radius(4px);
+ }
+}
+.icon-3x {
+ font-size: 3em;
+ &.icon-border {
+ border-width: 3px;
+ .border-radius(5px);
+ }
+}
+.icon-4x {
+ font-size: 4em;
+ &.icon-border {
+ border-width: 4px;
+ .border-radius(6px);
+ }
+}
+
+.icon-5x {
+ font-size: 5em;
+ &.icon-border {
+ border-width: 5px;
+ .border-radius(7px);
+ }
+}
+
+
+// Floats & Margins
+// -------------------------
+
+// Quick floats
+.pull-right { float: right; }
+.pull-left { float: left; }
+
+[class^="icon-"],
+[class*=" icon-"] {
+ &.pull-left {
+ margin-right: .3em;
+ }
+ &.pull-right {
+ margin-left: .3em;
+ }
+}
diff --git a/library/font_awesome/src/assets/font-awesome/less/extras.less b/library/font_awesome/src/assets/font-awesome/less/extras.less
new file mode 100644
index 000000000..c93c260c8
--- /dev/null
+++ b/library/font_awesome/src/assets/font-awesome/less/extras.less
@@ -0,0 +1,93 @@
+/* EXTRAS
+ * -------------------------- */
+
+/* Stacked and layered icon */
+.icon-stack();
+
+/* Animated rotating icon */
+.icon-spin {
+ display: inline-block;
+ -moz-animation: spin 2s infinite linear;
+ -o-animation: spin 2s infinite linear;
+ -webkit-animation: spin 2s infinite linear;
+ animation: spin 2s infinite linear;
+}
+
+/* Prevent stack and spinners from being taken inline when inside a link */
+a .icon-stack,
+a .icon-spin {
+ display: inline-block;
+ text-decoration: none;
+}
+
+@-moz-keyframes spin {
+ 0% { -moz-transform: rotate(0deg); }
+ 100% { -moz-transform: rotate(359deg); }
+}
+@-webkit-keyframes spin {
+ 0% { -webkit-transform: rotate(0deg); }
+ 100% { -webkit-transform: rotate(359deg); }
+}
+@-o-keyframes spin {
+ 0% { -o-transform: rotate(0deg); }
+ 100% { -o-transform: rotate(359deg); }
+}
+@-ms-keyframes spin {
+ 0% { -ms-transform: rotate(0deg); }
+ 100% { -ms-transform: rotate(359deg); }
+}
+@keyframes spin {
+ 0% { transform: rotate(0deg); }
+ 100% { transform: rotate(359deg); }
+}
+
+/* Icon rotations and mirroring */
+.icon-rotate-90:before {
+ -webkit-transform: rotate(90deg);
+ -moz-transform: rotate(90deg);
+ -ms-transform: rotate(90deg);
+ -o-transform: rotate(90deg);
+ transform: rotate(90deg);
+ filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1);
+}
+
+.icon-rotate-180:before {
+ -webkit-transform: rotate(180deg);
+ -moz-transform: rotate(180deg);
+ -ms-transform: rotate(180deg);
+ -o-transform: rotate(180deg);
+ transform: rotate(180deg);
+ filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2);
+}
+
+.icon-rotate-270:before {
+ -webkit-transform: rotate(270deg);
+ -moz-transform: rotate(270deg);
+ -ms-transform: rotate(270deg);
+ -o-transform: rotate(270deg);
+ transform: rotate(270deg);
+ filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3);
+}
+
+.icon-flip-horizontal:before {
+ -webkit-transform: scale(-1, 1);
+ -moz-transform: scale(-1, 1);
+ -ms-transform: scale(-1, 1);
+ -o-transform: scale(-1, 1);
+ transform: scale(-1, 1);
+}
+
+.icon-flip-vertical:before {
+ -webkit-transform: scale(1, -1);
+ -moz-transform: scale(1, -1);
+ -ms-transform: scale(1, -1);
+ -o-transform: scale(1, -1);
+ transform: scale(1, -1);
+}
+
+/* ensure rotation occurs inside anchor tags */
+a {
+ .icon-rotate-90, .icon-rotate-180, .icon-rotate-270, .icon-flip-horizontal, .icon-flip-vertical {
+ &:before { display: inline-block; }
+ }
+}
diff --git a/library/font_awesome/src/assets/font-awesome/less/font-awesome-ie7.less b/library/font_awesome/src/assets/font-awesome/less/font-awesome-ie7.less
new file mode 100644
index 000000000..2822fdee6
--- /dev/null
+++ b/library/font_awesome/src/assets/font-awesome/less/font-awesome-ie7.less
@@ -0,0 +1,67 @@
+---
+---
+{% include license-code.less %}
+
+.icon-large {
+ font-size: 4/3em;
+ margin-top: -4px;
+ padding-top: 3px;
+ margin-bottom: -4px;
+ padding-bottom: 3px;
+ vertical-align: middle;
+}
+
+.nav {
+ [class^="icon-"],
+ [class*=" icon-"] {
+ vertical-align: inherit;
+ margin-top: -4px;
+ padding-top: 3px;
+ margin-bottom: -4px;
+ padding-bottom: 3px;
+ &.icon-large {
+ vertical-align: -25%;
+ }
+ }
+}
+
+.nav-pills, .nav-tabs {
+ [class^="icon-"],
+ [class*=" icon-"] {
+ &.icon-large {
+ line-height: .75em;
+ margin-top: -7px;
+ padding-top: 5px;
+ margin-bottom: -5px;
+ padding-bottom: 4px;
+ }
+ }
+}
+
+.btn {
+ [class^="icon-"],
+ [class*=" icon-"] {
+ &.pull-left, &.pull-right { vertical-align: inherit; }
+ &.icon-large {
+ margin-top: -.5em;
+ }
+ }
+}
+
+a [class^="icon-"],
+a [class*=" icon-"] {
+ cursor: pointer;
+}
+
+.ie7icon(@inner) { *zoom: ~"expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '@{inner}')"; }
+
+{% for icon in icons %}
+.icon-{{ icon.id }} {
+ .ie7icon('&#x{{ icon.unicode }};');
+}
+{% for alias in icon.aliases %}
+.icon-{{ alias }} {
+ .ie7icon('&#x{{ icon.unicode }};');
+}
+{% endfor %}
+{% endfor %}
diff --git a/library/font_awesome/src/assets/font-awesome/less/font-awesome.less b/library/font_awesome/src/assets/font-awesome/less/font-awesome.less
new file mode 100644
index 000000000..fa87c2752
--- /dev/null
+++ b/library/font_awesome/src/assets/font-awesome/less/font-awesome.less
@@ -0,0 +1,11 @@
+---
+---
+{% include license-code.less %}
+
+@import "variables.less";
+@import "mixins.less";
+@import "path.less";
+@import "core.less";
+@import "bootstrap.less";
+@import "extras.less";
+@import "icons.less";
diff --git a/library/font_awesome/src/assets/font-awesome/less/icons.less b/library/font_awesome/src/assets/font-awesome/less/icons.less
new file mode 100644
index 000000000..faf238b5e
--- /dev/null
+++ b/library/font_awesome/src/assets/font-awesome/less/icons.less
@@ -0,0 +1,7 @@
+---
+---
+/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
+ readers do not read off random characters that represent icons */
+{% for icon in icons %}{% for alias in icon.aliases %}
+.icon-{{ alias }}:before,{% endfor %}
+.icon-{{ icon.id }}:before { content: @{{ icon.id }}; }{% endfor %}
diff --git a/library/font_awesome/src/assets/font-awesome/less/mixins.less b/library/font_awesome/src/assets/font-awesome/less/mixins.less
new file mode 100644
index 000000000..f7fdda590
--- /dev/null
+++ b/library/font_awesome/src/assets/font-awesome/less/mixins.less
@@ -0,0 +1,48 @@
+// Mixins
+// --------------------------
+
+.icon(@icon) {
+ .icon-FontAwesome();
+ content: @icon;
+}
+
+.icon-FontAwesome() {
+ font-family: FontAwesome;
+ font-weight: normal;
+ font-style: normal;
+ text-decoration: inherit;
+ -webkit-font-smoothing: antialiased;
+ *margin-right: .3em; // fixes ie7 issues
+}
+
+.border-radius(@radius) {
+ -webkit-border-radius: @radius;
+ -moz-border-radius: @radius;
+ border-radius: @radius;
+}
+
+.icon-stack(@width: 2em, @height: 2em, @top-font-size: 1em, @base-font-size: 2em) {
+ .icon-stack {
+ position: relative;
+ display: inline-block;
+ width: @width;
+ height: @height;
+ line-height: @width;
+ vertical-align: -35%;
+ [class^="icon-"],
+ [class*=" icon-"] {
+ display: block;
+ text-align: center;
+ position: absolute;
+ width: 100%;
+ height: 100%;
+ font-size: @top-font-size;
+ line-height: inherit;
+ *line-height: @height;
+ }
+ .icon-stack-base {
+ font-size: @base-font-size;
+ *line-height: @height / @base-font-size;
+ }
+ }
+}
diff --git a/library/font_awesome/src/assets/font-awesome/less/path.less b/library/font_awesome/src/assets/font-awesome/less/path.less
new file mode 100644
index 000000000..8ccef8cf0
--- /dev/null
+++ b/library/font_awesome/src/assets/font-awesome/less/path.less
@@ -0,0 +1,14 @@
+/* FONT PATH
+ * -------------------------- */
+
+@font-face {
+ font-family: 'FontAwesome';
+ src: url('@{FontAwesomePath}/fontawesome-webfont.eot?v=@{FontAwesomeVersion}');
+ src: url('@{FontAwesomePath}/fontawesome-webfont.eot?#iefix&v=@{FontAwesomeVersion}') format('embedded-opentype'),
+ url('@{FontAwesomePath}/fontawesome-webfont.woff?v=@{FontAwesomeVersion}') format('woff'),
+ url('@{FontAwesomePath}/fontawesome-webfont.ttf?v=@{FontAwesomeVersion}') format('truetype'),
+ url('@{FontAwesomePath}/fontawesome-webfont.svg#fontawesomeregular?v=@{FontAwesomeVersion}') format('svg');
+// src: url('@{FontAwesomePath}/FontAwesome.otf') format('opentype'); // used when developing fonts
+ font-weight: normal;
+ font-style: normal;
+}
diff --git a/library/font_awesome/src/assets/font-awesome/less/variables.less b/library/font_awesome/src/assets/font-awesome/less/variables.less
new file mode 100644
index 000000000..4d5271896
--- /dev/null
+++ b/library/font_awesome/src/assets/font-awesome/less/variables.less
@@ -0,0 +1,17 @@
+---
+---
+// Variables
+// --------------------------
+
+@FontAwesomePath: "../font";
+//@FontAwesomePath: "//netdna.bootstrapcdn.com/font-awesome/{{ site.fontawesome.version}}/font"; // for referencing Bootstrap CDN font files directly
+@FontAwesomeVersion: "{{ site.fontawesome.version }}";
+@borderColor: #eee;
+@iconMuted: #eee;
+@iconLight: #fff;
+@iconDark: #333;
+@icons-li-width: 30/14em;
+
+{% for icon in icons %}
+ @{{ icon.id }}: "\{{ icon.unicode }}";
+{% endfor %}
diff --git a/library/font_awesome/src/assets/font-awesome/scss/_bootstrap.scss b/library/font_awesome/src/assets/font-awesome/scss/_bootstrap.scss
new file mode 100644
index 000000000..837d2df65
--- /dev/null
+++ b/library/font_awesome/src/assets/font-awesome/scss/_bootstrap.scss
@@ -0,0 +1,84 @@
+/* BOOTSTRAP SPECIFIC CLASSES
+ * -------------------------- */
+
+/* Bootstrap 2.0 sprites.less reset */
+[class^="icon-"],
+[class*=" icon-"] {
+ display: inline;
+ width: auto;
+ height: auto;
+ line-height: normal;
+ vertical-align: baseline;
+ background-image: none;
+ background-position: 0% 0%;
+ background-repeat: repeat;
+ margin-top: 0;
+}
+
+/* more sprites.less reset */
+.icon-white,
+.nav-pills > .active > a > [class^="icon-"],
+.nav-pills > .active > a > [class*=" icon-"],
+.nav-list > .active > a > [class^="icon-"],
+.nav-list > .active > a > [class*=" icon-"],
+.navbar-inverse .nav > .active > a > [class^="icon-"],
+.navbar-inverse .nav > .active > a > [class*=" icon-"],
+.dropdown-menu > li > a:hover > [class^="icon-"],
+.dropdown-menu > li > a:hover > [class*=" icon-"],
+.dropdown-menu > .active > a > [class^="icon-"],
+.dropdown-menu > .active > a > [class*=" icon-"],
+.dropdown-submenu:hover > a > [class^="icon-"],
+.dropdown-submenu:hover > a > [class*=" icon-"] {
+ background-image: none;
+}
+
+
+/* keeps Bootstrap styles with and without icons the same */
+.btn, .nav {
+ [class^="icon-"],
+ [class*=" icon-"] {
+ // display: inline;
+ &.icon-large { line-height: .9em; }
+ &.icon-spin { display: inline-block; }
+ }
+}
+.nav-tabs, .nav-pills {
+ [class^="icon-"],
+ [class*=" icon-"] {
+ &, &.icon-large { line-height: .9em; }
+ }
+}
+.btn {
+ [class^="icon-"],
+ [class*=" icon-"] {
+ &.pull-left, &.pull-right {
+ &.icon-2x { margin-top: .18em; }
+ }
+ &.icon-spin.icon-large { line-height: .8em; }
+ }
+}
+.btn.btn-small {
+ [class^="icon-"],
+ [class*=" icon-"] {
+ &.pull-left, &.pull-right {
+ &.icon-2x { margin-top: .25em; }
+ }
+ }
+}
+.btn.btn-large {
+ [class^="icon-"],
+ [class*=" icon-"] {
+ margin-top: 0; // overrides bootstrap default
+ &.pull-left, &.pull-right {
+ &.icon-2x { margin-top: .05em; }
+ }
+ &.pull-left.icon-2x { margin-right: .2em; }
+ &.pull-right.icon-2x { margin-left: .2em; }
+ }
+}
+
+/* Fixes alignment in nav lists */
+.nav-list [class^="icon-"],
+.nav-list [class*=" icon-"] {
+ line-height: inherit;
+}
diff --git a/library/font_awesome/src/assets/font-awesome/scss/_core.scss b/library/font_awesome/src/assets/font-awesome/scss/_core.scss
new file mode 100644
index 000000000..0189c73df
--- /dev/null
+++ b/library/font_awesome/src/assets/font-awesome/scss/_core.scss
@@ -0,0 +1,129 @@
+/* FONT AWESOME CORE
+ * -------------------------- */
+
+[class^="icon-"],
+[class*=" icon-"] {
+ @include icon-FontAwesome();
+}
+
+[class^="icon-"]:before,
+[class*=" icon-"]:before {
+ text-decoration: inherit;
+ display: inline-block;
+ speak: none;
+}
+
+/* makes the font 33% larger relative to the icon container */
+.icon-large:before {
+ vertical-align: -10%;
+ font-size: (4em/3);
+}
+
+/* makes sure icons active on rollover in links */
+a {
+ [class^="icon-"],
+ [class*=" icon-"] {
+ display: inline;
+ }
+}
+
+/* increased font size for icon-large */
+[class^="icon-"],
+[class*=" icon-"] {
+ &.icon-fixed-width {
+ display: inline-block;
+ width: (16em/14);
+ text-align: right;
+ padding-right: (4em/14);
+ &.icon-large {
+ width: (20em/14);
+ }
+ }
+}
+
+.icons-ul {
+ margin-left: $icons-li-width;
+ list-style-type: none;
+
+ > li { position: relative; }
+
+ .icon-li {
+ position: absolute;
+ left: -$icons-li-width;
+ width: $icons-li-width;
+ text-align: center;
+ line-height: inherit;
+ }
+}
+
+// allows usage of the hide class directly on font awesome icons
+[class^="icon-"],
+[class*=" icon-"] {
+ &.hide {
+ display: none;
+ }
+}
+
+.icon-muted { color: $iconMuted; }
+.icon-light { color: $iconLight; }
+.icon-dark { color: $iconDark; }
+
+// Icon Borders
+// -------------------------
+
+.icon-border {
+ border: solid 1px $borderColor;
+ padding: .2em .25em .15em;
+ @include border-radius(3px);
+}
+
+// Icon Sizes
+// -------------------------
+
+.icon-2x {
+ font-size: 2em;
+ &.icon-border {
+ border-width: 2px;
+ @include border-radius(4px);
+ }
+}
+.icon-3x {
+ font-size: 3em;
+ &.icon-border {
+ border-width: 3px;
+ @include border-radius(5px);
+ }
+}
+.icon-4x {
+ font-size: 4em;
+ &.icon-border {
+ border-width: 4px;
+ @include border-radius(6px);
+ }
+}
+
+.icon-5x {
+ font-size: 5em;
+ &.icon-border {
+ border-width: 5px;
+ @include border-radius(7px);
+ }
+}
+
+
+// Floats & Margins
+// -------------------------
+
+// Quick floats
+.pull-right { float: right; }
+.pull-left { float: left; }
+
+[class^="icon-"],
+[class*=" icon-"] {
+ &.pull-left {
+ margin-right: .3em;
+ }
+ &.pull-right {
+ margin-left: .3em;
+ }
+}
diff --git a/library/font_awesome/src/assets/font-awesome/scss/_extras.scss b/library/font_awesome/src/assets/font-awesome/scss/_extras.scss
new file mode 100644
index 000000000..9a25845d8
--- /dev/null
+++ b/library/font_awesome/src/assets/font-awesome/scss/_extras.scss
@@ -0,0 +1,93 @@
+/* EXTRAS
+ * -------------------------- */
+
+/* Stacked and layered icon */
+@include icon-stack();
+
+/* Animated rotating icon */
+.icon-spin {
+ display: inline-block;
+ -moz-animation: spin 2s infinite linear;
+ -o-animation: spin 2s infinite linear;
+ -webkit-animation: spin 2s infinite linear;
+ animation: spin 2s infinite linear;
+}
+
+/* Prevent stack and spinners from being taken inline when inside a link */
+a .icon-stack,
+a .icon-spin {
+ display: inline-block;
+ text-decoration: none;
+}
+
+@-moz-keyframes spin {
+ 0% { -moz-transform: rotate(0deg); }
+ 100% { -moz-transform: rotate(359deg); }
+}
+@-webkit-keyframes spin {
+ 0% { -webkit-transform: rotate(0deg); }
+ 100% { -webkit-transform: rotate(359deg); }
+}
+@-o-keyframes spin {
+ 0% { -o-transform: rotate(0deg); }
+ 100% { -o-transform: rotate(359deg); }
+}
+@-ms-keyframes spin {
+ 0% { -ms-transform: rotate(0deg); }
+ 100% { -ms-transform: rotate(359deg); }
+}
+@keyframes spin {
+ 0% { transform: rotate(0deg); }
+ 100% { transform: rotate(359deg); }
+}
+
+/* Icon rotations and mirroring */
+.icon-rotate-90:before {
+ -webkit-transform: rotate(90deg);
+ -moz-transform: rotate(90deg);
+ -ms-transform: rotate(90deg);
+ -o-transform: rotate(90deg);
+ transform: rotate(90deg);
+ filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1);
+}
+
+.icon-rotate-180:before {
+ -webkit-transform: rotate(180deg);
+ -moz-transform: rotate(180deg);
+ -ms-transform: rotate(180deg);
+ -o-transform: rotate(180deg);
+ transform: rotate(180deg);
+ filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2);
+}
+
+.icon-rotate-270:before {
+ -webkit-transform: rotate(270deg);
+ -moz-transform: rotate(270deg);
+ -ms-transform: rotate(270deg);
+ -o-transform: rotate(270deg);
+ transform: rotate(270deg);
+ filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3);
+}
+
+.icon-flip-horizontal:before {
+ -webkit-transform: scale(-1, 1);
+ -moz-transform: scale(-1, 1);
+ -ms-transform: scale(-1, 1);
+ -o-transform: scale(-1, 1);
+ transform: scale(-1, 1);
+}
+
+.icon-flip-vertical:before {
+ -webkit-transform: scale(1, -1);
+ -moz-transform: scale(1, -1);
+ -ms-transform: scale(1, -1);
+ -o-transform: scale(1, -1);
+ transform: scale(1, -1);
+}
+
+/* ensure rotation occurs inside anchor tags */
+a {
+ .icon-rotate-90, .icon-rotate-180, .icon-rotate-270, .icon-flip-horizontal, .icon-flip-vertical {
+ &:before { display: inline-block; }
+ }
+}
diff --git a/library/font_awesome/src/assets/font-awesome/scss/_icons.scss b/library/font_awesome/src/assets/font-awesome/scss/_icons.scss
new file mode 100644
index 000000000..5febd993f
--- /dev/null
+++ b/library/font_awesome/src/assets/font-awesome/scss/_icons.scss
@@ -0,0 +1,7 @@
+---
+---
+/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
+ * readers do not read off random characters that represent icons */
+{% for icon in icons %}{% for alias in icon.aliases %}
+.icon-{{ alias }}:before,{% endfor %}
+.icon-{{ icon.id }}:before { content: ${{ icon.id }}; }{% endfor %}
diff --git a/library/font_awesome/src/assets/font-awesome/scss/_mixins.scss b/library/font_awesome/src/assets/font-awesome/scss/_mixins.scss
new file mode 100644
index 000000000..ca9c5931b
--- /dev/null
+++ b/library/font_awesome/src/assets/font-awesome/scss/_mixins.scss
@@ -0,0 +1,48 @@
+// Mixins
+// --------------------------
+
+@mixin icon($icon) {
+ @include icon-FontAwesome();
+ content: $icon;
+}
+
+@mixin icon-FontAwesome() {
+ font-family: FontAwesome;
+ font-weight: normal;
+ font-style: normal;
+ text-decoration: inherit;
+ -webkit-font-smoothing: antialiased;
+ *margin-right: .3em; // fixes ie7 issues
+}
+
+@mixin border-radius($radius) {
+ -webkit-border-radius: $radius;
+ -moz-border-radius: $radius;
+ border-radius: $radius;
+}
+
+@mixin icon-stack($width: 2em, $height: 2em, $top-font-size: 1em, $base-font-size: 2em) {
+ .icon-stack {
+ position: relative;
+ display: inline-block;
+ width: $width;
+ height: $height;
+ line-height: $width;
+ vertical-align: -35%;
+ [class^="icon-"],
+ [class*=" icon-"] {
+ display: block;
+ text-align: center;
+ position: absolute;
+ width: 100%;
+ height: 100%;
+ font-size: $top-font-size;
+ line-height: inherit;
+ *line-height: $height;
+ }
+ .icon-stack-base {
+ font-size: $base-font-size;
+ *line-height: #{$height / $base-font-size}em;
+ }
+ }
+}
diff --git a/library/font_awesome/src/assets/font-awesome/scss/_path.scss b/library/font_awesome/src/assets/font-awesome/scss/_path.scss
new file mode 100644
index 000000000..bb3f36b70
--- /dev/null
+++ b/library/font_awesome/src/assets/font-awesome/scss/_path.scss
@@ -0,0 +1,14 @@
+/* FONT PATH
+ * -------------------------- */
+
+@font-face {
+ font-family: 'FontAwesome';
+ src: url('#{$FontAwesomePath}/fontawesome-webfont.eot?v=#{$FontAwesomeVersion}');
+ src: url('#{$FontAwesomePath}/fontawesome-webfont.eot?#iefix&v=#{$FontAwesomeVersion}') format('embedded-opentype'),
+ url('#{$FontAwesomePath}/fontawesome-webfont.woff?v=#{$FontAwesomeVersion}') format('woff'),
+ url('#{$FontAwesomePath}/fontawesome-webfont.ttf?v=#{$FontAwesomeVersion}') format('truetype'),
+ url('#{$FontAwesomePath}/fontawesome-webfont.svg#fontawesomeregular?v=#{$FontAwesomeVersion}') format('svg');
+// src: url('#{$FontAwesomePath}/FontAwesome.otf') format('opentype'); // used when developing fonts
+ font-weight: normal;
+ font-style: normal;
+}
diff --git a/library/font_awesome/src/assets/font-awesome/scss/_variables.scss b/library/font_awesome/src/assets/font-awesome/scss/_variables.scss
new file mode 100644
index 000000000..30bab220a
--- /dev/null
+++ b/library/font_awesome/src/assets/font-awesome/scss/_variables.scss
@@ -0,0 +1,16 @@
+---
+---
+// Variables
+// --------------------------
+
+$FontAwesomePath: "../font" !default;
+$FontAwesomeVersion: "{{ site.fontawesome.version }}" !default;
+$borderColor: #eeeeee !default;
+$iconMuted: #eeeeee !default;
+$iconLight: white !default;
+$iconDark: #333333 !default;
+$icons-li-width: (30em/14);
+
+{% for icon in icons %}
+${{ icon.id }}: "\{{ icon.unicode }}";
+{% endfor %}
diff --git a/library/font_awesome/src/assets/font-awesome/scss/font-awesome-ie7.scss b/library/font_awesome/src/assets/font-awesome/scss/font-awesome-ie7.scss
new file mode 100644
index 000000000..3ba99da60
--- /dev/null
+++ b/library/font_awesome/src/assets/font-awesome/scss/font-awesome-ie7.scss
@@ -0,0 +1,67 @@
+---
+---
+{% include license-code.less %}
+
+.icon-large {
+ font-size: (4em/3);
+ margin-top: -4px;
+ padding-top: 3px;
+ margin-bottom: -4px;
+ padding-bottom: 3px;
+ vertical-align: middle;
+}
+
+.nav {
+ [class^="icon-"],
+ [class*=" icon-"] {
+ vertical-align: inherit;
+ margin-top: -4px;
+ padding-top: 3px;
+ margin-bottom: -4px;
+ padding-bottom: 3px;
+ &.icon-large {
+ vertical-align: -25%;
+ }
+ }
+}
+
+.nav-pills, .nav-tabs {
+ [class^="icon-"],
+ [class*=" icon-"] {
+ &.icon-large {
+ line-height: .75em;
+ margin-top: -7px;
+ padding-top: 5px;
+ margin-bottom: -5px;
+ padding-bottom: 4px;
+ }
+ }
+}
+
+.btn {
+ [class^="icon-"],
+ [class*=" icon-"] {
+ &.pull-left, &.pull-right { vertical-align: inherit; }
+ &.icon-large {
+ margin-top: -.5em;
+ }
+ }
+}
+
+a [class^="icon-"],
+a [class*=" icon-"] {
+ cursor: pointer;
+}
+
+@mixin ie7icon($inner) { *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = '#{$inner}'); }
+
+{% for icon in icons %}
+.icon-{{ icon.id }} {
+ @include ie7icon('&#x{{ icon.unicode }};');
+}
+{% for alias in icon.aliases %}
+.icon-{{ alias }} {
+ @include ie7icon('&#x{{ icon.unicode }};');
+}
+{% endfor %}
+{% endfor %}
diff --git a/library/font_awesome/src/assets/font-awesome/scss/font-awesome.scss b/library/font_awesome/src/assets/font-awesome/scss/font-awesome.scss
new file mode 100644
index 000000000..c7507de06
--- /dev/null
+++ b/library/font_awesome/src/assets/font-awesome/scss/font-awesome.scss
@@ -0,0 +1,11 @@
+---
+---
+{% include license-code.less %}
+
+@import "variables";
+@import "mixins";
+@import "path";
+@import "core";
+@import "bootstrap";
+@import "extras";
+@import "icons";
diff --git a/library/font_awesome/src/assets/img/contribution-sample.png b/library/font_awesome/src/assets/img/contribution-sample.png
new file mode 100644
index 000000000..fe7647f0b
--- /dev/null
+++ b/library/font_awesome/src/assets/img/contribution-sample.png
Binary files differ
diff --git a/library/font_awesome/src/assets/img/fort_awesome.jpg b/library/font_awesome/src/assets/img/fort_awesome.jpg
new file mode 100644
index 000000000..3542fae0f
--- /dev/null
+++ b/library/font_awesome/src/assets/img/fort_awesome.jpg
Binary files differ
diff --git a/library/font_awesome/src/assets/img/glyphicons-halflings-white.png b/library/font_awesome/src/assets/img/glyphicons-halflings-white.png
new file mode 100644
index 000000000..3bf6484a2
--- /dev/null
+++ b/library/font_awesome/src/assets/img/glyphicons-halflings-white.png
Binary files differ
diff --git a/library/font_awesome/src/assets/img/glyphicons-halflings.png b/library/font_awesome/src/assets/img/glyphicons-halflings.png
new file mode 100644
index 000000000..a99699932
--- /dev/null
+++ b/library/font_awesome/src/assets/img/glyphicons-halflings.png
Binary files differ
diff --git a/library/font_awesome/src/assets/img/icon-flag.pdf b/library/font_awesome/src/assets/img/icon-flag.pdf
new file mode 100644
index 000000000..1c8913d14
--- /dev/null
+++ b/library/font_awesome/src/assets/img/icon-flag.pdf
@@ -0,0 +1,1355 @@
+%PDF-1.5 %âãÏÓ
+1 0 obj <</Metadata 2 0 R/OCProperties<</D<</ON[5 0 R 29 0 R 51 0 R 73 0 R 95 0 R 117 0 R 140 0 R 163 0 R]/Order 164 0 R/RBGroups[]>>/OCGs[5 0 R 29 0 R 51 0 R 73 0 R 95 0 R 117 0 R 140 0 R 163 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <</Length 42946/Subtype/XML/Type/Metadata>>stream
+<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
+<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.3-c011 66.145661, 2012/02/06-14:56:27 ">
+ <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+ <rdf:Description rdf:about=""
+ xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <dc:format>application/pdf</dc:format>
+ <dc:title>
+ <rdf:Alt>
+ <rdf:li xml:lang="x-default">Web</rdf:li>
+ </rdf:Alt>
+ </dc:title>
+ </rdf:Description>
+ <rdf:Description rdf:about=""
+ xmlns:xmp="http://ns.adobe.com/xap/1.0/"
+ xmlns:xmpGImg="http://ns.adobe.com/xap/1.0/g/img/">
+ <xmp:CreatorTool>Adobe Illustrator CS6 (Macintosh)</xmp:CreatorTool>
+ <xmp:CreateDate>2012-12-10T10:41:19-05:00</xmp:CreateDate>
+ <xmp:ModifyDate>2013-01-02T00:01:34-05:00</xmp:ModifyDate>
+ <xmp:MetadataDate>2013-01-02T00:01:34-05:00</xmp:MetadataDate>
+ <xmp:Thumbnails>
+ <rdf:Alt>
+ <rdf:li rdf:parseType="Resource">
+ <xmpGImg:width>256</xmpGImg:width>
+ <xmpGImg:height>128</xmpGImg:height>
+ <xmpGImg:format>JPEG</xmpGImg:format>
+ <xmpGImg:image>/9j/4AAQSkZJRgABAgEAyADIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAAyAAAAAEA&#xA;AQDIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK&#xA;DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f&#xA;Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAgAEAAwER&#xA;AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA&#xA;AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB&#xA;UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE&#xA;1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ&#xA;qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy&#xA;obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp&#xA;0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo&#xA;+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYqw&#xA;/wDNP8zdE/Lnys2varG9wXlW3s7OKgeadwWC8jsoCoWZj0A7mgKrE/yX/wCcitD/ADM1G60n9Gya&#xA;PrFtEblLd5RcRywqwVikoSL4lLLVSvfau+KvXMVdirsVdirsVdirsVfOtx/zml5Ni80nTk0a5k0F&#xA;ZjE2tiVeXENx9VbYISyd/wC85U/Zrtir6HhminhjmhcSRSqHjddwysKgg+4xVfirsVdirsVdirsV&#xA;fP8A+fP/ADk5d+Q/Mf8Ahjy5p9ve6rbxpLqFxe82hiMqh44ljieNmYowYnkAKjr2VZH+QP58r+Zt&#xA;rfWeoWUen69pqpJNHCxaGaFzx9SMNV14tsyknqN96BV67irsVdirsVdirsVeD3f/ADmJ+W1v5pbS&#xA;Ba3kumRzeg+toEMNQ3EyLHy9Ro+9etP2cVe7RyRyxrJGweNwGR1IKspFQQR1BxVqaeCBPUmkWJOn&#xA;JyFFT7nFW45I5EEkbB0bdWUggj2IxVdirsVdiryr/nJjyZYeZfyn1Sa5kaGfQlbVbR0ANZII3BRg&#xA;f2XRyPY0PamKvA/+ca7vyl5H8t6/+avmG5mJs5BotlYQKC0jzLHOeFWUM7BdgSAqhia9lUH58/5y&#xA;9/MTXJZYPLix+XNNNVUxBZ7tl6VaaReK1/yEBHicVeP6n5v82apMZtT1q+vZSa87i5mlP3uxxVMv&#xA;L35p/mN5dlSTR/Md/ahKUh9d5ITTYcoZC8TU91xV7t5I/wCc1dQt7f6v500YXrqPgv8ATSsUjUH+&#xA;7IZDwJPirKP8nFVDzr/zmprl3BJa+T9HTTOQoNRvWFxMK90hAESsP8ouPbFUj/5xi88ebtV/PCB9&#xA;T1e6vW1a2ulv/rEjSCQRxGVNmqBwZBxp0Gw2xV9sEAih3B6jFXwDrf5Q6Xaf85B/8q3gvZRpct9b&#xA;xpdFQZUguYEueG5ILIsnDl3pWnbFX0z+cH/OQnlv8rfQ8uWFi2p65HbIYbQOEgt4qcY/Wk+Jq0Wo&#xA;QCpHUioxV8vecP8AnI783PM8sgk1uTSrN60stLJtEAJ6eoh9ZvD4nOKsBfzBrzz/AFh9SumnqD6p&#xA;nkL1HQ8i1cVZn5Q/P781/Ks0ZstenvLVCK2OoMbuAr140kJdB/qMuKvdNE/5zd0Y6aP075buU1JV&#xA;ofqMqPA7U6/vSjxgnt8XzxVh3nn/AJzK86atDJaeVrCHy/A44m7dvrV3T/ILKsSV/wBRiOxxVH/8&#xA;4d+a/MuqfmZrsGp6nc30d3pUl3cC5leUvPFcwIkhLljyCzMPpxVv/nMf8sDp+rx/mJb3CmDV5oLC&#xA;+tGrzW5jt2EciHoUaG2ow7Ed67Kp5/zj75f0X8rPy5v/AM1/NF5WLVreNLS2thzdYDJ8KANw5Syy&#xA;AbVooFSetFWHefv+cxPPOsSS23lSCPy9p52S4IW4vWHiXcGJKjsqVH82KvGdX88ec9ZlMuq67f3z&#xA;k1rPczSAfIMxA+jFVbQvzD896DMkuj+YL+yZOiRXEgjO9aNGSUYV7MMVe4eRP+cz/M2notr5x01N&#xA;ZiAp9fteNtc/N4wPRf8A2ITFU/8AMf8Azm9aCBk8t+WpGuCPgn1GZVRT7ww8i/8AyMXFXg3mv86f&#xA;zL80axBqupa3Ok1pIJbKC2PoQQspqCkSUWv+U1Se5xVONZ/J+C0/Pk/lpFqDfVJL6CGO+KVdYLmF&#xA;LkVWtC6RycfAkV2xVmn5mf8AOVPmh5pvLnkYDRdD08mzg1CnqXs0cP7sMGcUiDBaii8/8rFXhOq6&#xA;1rGr3TXerX1xqF01S091K80hruficscVRHl/zV5l8u3a3ehapdaZcKa87aV46/6wU0YexxV7l5b/&#xA;AOc0fPdhp31bWtKtNaulFEvuRtXPvIkatG3+xVcVYj58/wCcm/zT83RPaC9XRNNcUe00wNCzj/Ln&#xA;LNMfcBgp8MVfT3/OK+tarq35P2M2p3Ul5NBc3MEc0zF39NHqqljuePLavbbFWUfnX/5KPzf/ANsq&#xA;6/5NHFXxXH/6zbcf+BlB/wB0ubFXmmKuxV2KuxV2KvYP+cT/APyduj/8YLz/AKhpMVfemKvkDzN/&#xA;621D/wAx2n/90yHFWFf85Yf+Tt1j/jBZ/wDUNHirx/FXYq7FXYq7FX0B/wA4Vf8Ak09V/wC2Hcf9&#xA;Rlpir1X/AJzV/wDJWaV/23Lf/qDu8VYp5+/9Y28uf9GX/J18VfKuKuxV2KuxV2KuxV9K+Zv/AFtq&#xA;H/mO0/8A7pkOKvnXVv8Ajq3n/GeT/iZxVCYq7FXYq7FX3V/ziF/5Ju2/5jrv/iQxVmv51/8Ako/N&#xA;/wD2yrr/AJNHFXxXH/6zbcf+BlB/3S5sVeaYq7FXYq7FXYq9g/5xP/8AJ26P/wAYLz/qGkxV96Yq&#xA;+QPM3/rbUP8AzHaf/wB0yHFWFf8AOWH/AJO3WP8AjBZ/9Q0eKvH8VdirsVdirsVfQH/OFX/k09V/&#xA;7Ydx/wBRlpir1X/nNX/yVmlf9ty3/wCoO7xVinn7/wBY28uf9GX/ACdfFXyrirsVdirsVdirsVfS&#xA;vmb/ANbah/5jtP8A+6ZDir511b/jq3n/ABnk/wCJnFUJirsVdirsVfdX/OIX/km7b/mOu/8AiQxV&#xA;mv51/wDko/N//bKuv+TRxV8Vx/8ArNtx/wCBlB/3S5sVYLoXl3XtfvlsNE0641K8bcQWsTSsB0qQ&#xA;oNB7nbFXrOh/84i/nFqcSy3NvZaQG3C31z8QFO4tluKfrxVB+av+cV/zg8v273KafDrMEYJkbS5T&#xA;M4A8IZFimb/YocVeSTQzQSvDMjRTRsVkjcFWVgaEMDuCMVWgEkACpOwA61xV9L/84p/k752s/Odv&#xA;501exk0vSLW3mFqLleEtw86GMcYmIdUCuW5kUO1K9lX15ir5A8zf+ttQ/wDMdp//AHTIcVYV/wA5&#xA;Yf8Ak7dY/wCMFn/1DR4qw/yX+Uf5jec6P5e0O4urUmhvXCwWw8f30xRGp3Ckn2xV6RF/zhl+bL23&#xA;rNd6RHJ/yztczmT71gZP+GxVgHnb8lPzN8mRtPrmiTLYrWuoW5W4twB3aSIt6f8As+OKsGxVUggm&#xA;nmSGCNpZpCFjjQFmZj0AA3JxV9Zf84lflB518t65qHmzzDZPpdvdWDWNnZ3A4XEnqzRStI0f2owv&#xA;oUo4BNemKp//AM5q/wDkrNK/7blv/wBQd3irFPP3/rG3lz/oy/5Ovir5k0XQdb1y/TT9GsLjUb2T&#xA;7NvaxtK9OleKA0A7npir1vQv+cRfzi1SFZbi3stIDioS/ufjp2qtstwR8jviqH8yf84ofnFotu9x&#xA;FY22sRRir/o2f1Hp7RSrDI3yVScVeSXtje2F3LZ31vJa3cDcJredGjkRh1VkYBlPzxVQxVm35efk&#xA;/wCe/Pl7DHo2mTfo55Ak+rSqUtYlrR29RuIcqN+CVb2xV6/5m/8AW2of+Y7T/wDumQ4qs0r/AJw1&#xA;84ah5rvzrmo2+n6AtzI0N1CfWuLiMsShSLZY6jrzbY9mxV7f5c/5xl/JvRLdIzoa6pcLTndajI87&#xA;uR4pVYR/sUGKoHzd/wA4q/lJr1qwsbB9BvqH07qwdgte3OGQvGR40Cn3xV4bqv8Azhb+ZNveOmm6&#xA;lpl9aVPpzySTW8hH+XH6cgU/JzirKPJv/OE0izxz+ctdRolIL2Glqx5jwNxMq8fekX0jFX0x5a8t&#xA;aJ5Z0O10PQ7VbPTLJSlvApZqVJZiWYszMzEkkmpOKsd/Ov8A8lH5v/7ZV1/yaOKvEv8AnFHyh5c8&#xA;2/lN5i0TzFZLf6ZNq6u8DM6HlHBEysrxsjqQe6sPDpir6N8t+VPLfljTU03QNOg02yT/AHVboF5H&#xA;pydvtO3+UxJxVNcVdirGvMv5afl/5muBc695fsdQuhQfWZYV9YgbAGVaOR7E4qt8vflh+Xfl2dbn&#xA;RfLmn2V0u6XMcCGZe+0rAuPoOKsnxV2KvkDzN/621D/zHaf/AN0yHFX0p5h/Kn8vPMfmG28w65oV&#xA;vqGrWiCKKefmyFFJKiSHl6UlORpzU4qymOOOKNY41CRoAqIoAVVAoAAOgGKrsVcQGBBFQdiD0IxV&#xA;hOo/kl+UuoXT3V15U04zvu7RwrECfErHwFfemKp15d8i+TPLY/3AaJY6Y5HFpbaCOORh/lSAc2+k&#xA;4qnmKvAP+c1f/JWaV/23Lf8A6g7vFWV/lP5X0HzR+QHlvRNes1vtLurCMT27llrxkLKQyFXUhhUF&#xA;SDirOvKnkryp5S08af5c0uDTLXbmsK/G5HQySNykkb3dicVTrFXYqkXmXyJ5M80Ko8w6LZ6m0YpH&#xA;JcQo8iDwWSnNR8jiqUaX+S/5T6ZcC4s/KmmrOKFXkt0mKkdCvq8+J9xirM0RI0WONQiIAqIooABs&#xA;AAMVfMuvflv54uP+ct7fzNDo9w/l9rizuf0oAPq4jhsY4n5PWgYPGw4nf23GKvpvFXYq7FXYq7FX&#xA;Yqxb81NJ1HWPy28zaXpsJuL+8065htYFIBeRoyFUVIFScVeb/wDOJXk7zP5Y8jarB5h02bTLi61F&#xA;poILleEhjEMacuB+IDkp64q9xxV2KuxV2KuxV2KuxV8ya9+W/ni4/wCct7fzNDo9w/l9rizuf0oA&#xA;Pq4jhsY4n5PWgYPGw4nf23GKvpvFXYq7FXYq7FXYq7FXi/8Azlh5R8y+Z/y2srPy/p82p3drq0F1&#xA;Nb2685BELeeIsEG7UeVenz6Yqzb8m9F1PRPyu8taXqlu1rqFrZItxbvTkjEluLUruAdxirMsVdir&#xA;sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs&#xA;VdirsVdirsVdirsVdirsVdirsVdirsVfLH/OS/51/mb5M/MWPR/LWs/UNObT4LgwfVrSb947yBm5&#xA;TRSPuEG1aYq8n/6Gj/Pb/qZv+nHT/wDsnxV3/Q0f57f9TN/046f/ANk+Ku/6Gj/Pb/qZv+nHT/8A&#xA;snxV3/Q0f57f9TN/046f/wBk+Ku/6Gj/AD2/6mb/AKcdP/7J8Vd/0NH+e3/Uzf8ATjp//ZPirv8A&#xA;oaP89v8AqZv+nHT/APsnxV9j/kn5k1nzJ+Vmg67rdz9a1S9ile6ueEcXIrPIgPCNUQfCo6DFXgV1&#xA;/wA5tawvmljbaBav5WWUqEZpBfPEDT1BJy9JWI34emfDl3xV9X2d3BeWcF5bnlBcxpNExBBKOoZT&#xA;Q9Njiq2/1LTtPgM9/dQ2kA6yzyLEn/BOQMVS+y85+T76YQWWu6fdTHpFDdQSMf8AYq5OKpxirsVQ&#xA;2oappmmwrNqN3DZwuwjSS4kSJS7fZUFyBU9hiqJxV8u/mV/zl9rvl/z5qGhaFo1nPpmj3Ulndy3h&#xA;l9aaSBik3pmN0WMB1KrVXr19sVfRPkzzPaeavKuleYrSNobfVLdLhYX3ZCw+JCe/FqivfFU0ubq1&#xA;tYWnupkghX7UsrBFHzZiBiqUweevJNxMsEHmHTZZmNFiS8gZifAKHriqdghgCDUHcEdCMVdiqhe3&#xA;9jYWsl3fXEVpaxCstxO6xxqOlWdiFGKqkM0M8Mc8EiywyqHilQhlZWFVZWGxBHQ4qvxV2KuxV2Ku&#xA;xV2KuxV8Qf8AOZP/AJNyH/tlW3/J2bFXhWKuxV2KuxV2KuxV2Kv0K/5xu/8AJJeVv+ME3/UTLir5&#xA;f1/8svKsH/OUA8jxQuvl2bULXlah6ER3FtHdPCrKAQnKQovcL3rvirIvzT/5yz80XF5daF5Hij0T&#xA;SbSRraPUQoe6lSI8A0YYcIVIGw4lv8odMVeA6vres6zeNe6vf3Go3j/auLqV5pD/ALJyxxVA4qz/&#xA;AMifnp+ZnkqSNdK1eS4sEI5aZek3FsQP2QrnlH/zzZTir07VP+c2fO89iItO0LT7K7K0e5kaWcV8&#xA;UjrHT/ZFsVeH+b/PPm3zhqR1HzJqc2o3IqI/UNI4wdysUS8Y419lUYq/RryDLLL5F8uSyu0ksml2&#xA;TSSMSzMzW6Ekk7kk4q+P/wDnJvyVoVh+edhbWUbQQ+ZIrW91FVb/AHfdXcsEzx1B48xFyPX4iT7Y&#xA;qyz81/8AnI288j3Mv5dfl1ZRafa+X1XT21SYetIrRKFZYY3HGqtsXk5cjU07lV85eYfNfmbzHd/W&#xA;9e1S61O434vdSvLxr2QMaKPZdsVSnFWXeSvzY/MHyXMjeX9auLe3U1awdvVtW33rBJyTfxADe+Kv&#xA;Yn/5zc85nThHH5e05dRpRrpnnaEnxEIZW/5KYq8a89/ml5689XQn8yapJdRI3KCyX93axHp8EKUS&#xA;tNuRq3icVfcP/OOUkkn5J+VWkYuwt5FBYknitxIqjfsAKDFXpGKuxV2KuxV2KuxV2KviD/nMn/yb&#xA;kP8A2yrb/k7NirwrFXYq7FXYq7FXYq7FX6Ff843f+SS8rf8AGCb/AKiZcVeFeZv/AFtqH/mO0/8A&#xA;7pkOKvnXVv8Ajq3n/GeT/iZxVCYq7FXYq7FXYq/TT8vP+UA8s/8AbKsf+oZMVfMH/OVP/k/fKP8A&#xA;zA6d/wB1G4xV4/8AnX/5Nzzf/wBtW6/5OnFWFYq7FXYq7FXYq/Qr/nG7/wAkl5W/4wTf9RMuKvSs&#xA;VdirsVdirsVdirsVfEH/ADmT/wCTch/7ZVt/ydmxV4VirsVdirsVdirsVdir9Cv+cbv/ACSXlb/j&#xA;BN/1Ey4q8K8zf+ttQ/8AMdp//dMhxV866t/x1bz/AIzyf8TOKoTFXYq7FXYq7FX6afl5/wAoB5Z/&#xA;7ZVj/wBQyYq+YP8AnKn/AMn75R/5gdO/7qNxirx/86//ACbnm/8A7at1/wAnTirCsVdirsVdirsV&#xA;foV/zjd/5JLyt/xgm/6iZcVelYq7FXYq7FXYq7FXYq+IP+cyf/JuQ/8AbKtv+Ts2KvCsVdirsVdi&#xA;rsVdirsVfoV/zjd/5JLyt/xgm/6iZcVeFeZv/W2of+Y7T/8AumQ4q8Ck0TWdU8zXWmabY3F5qL3M&#xA;qLZwRPJMWDkEcFBbbvir13yp/wA4e/mfq8aT6vJaaBA25juHM9xTt+7h5J9DSA4qy27/AOcG9QW1&#xA;LWfnCGa6ptFNYtFHWn+/Fnlbr/kYq8Z/MH8kvzG8hs0mt6Y0mnA0XVbMme0PzcAGOvYSKpxVggBJ&#xA;AAqTsAOtcVem/l7/AM47fmb50miki019K0lzV9U1BTDHx8Y4z+9l9uK0r1IxV986JpcWk6NYaVC7&#xA;SQ6fbQ2sbtTkywxiME07kLir5N/5yp/8n75R/wCYHTv+6jcYq8n/ADksL64/ObzVZwW0s13Pq1wI&#xA;beNGaRy8hZOKAcm5AginXFWVeT/+cTvzY8wJHcX1tD5ftHAYNqDkTFT4QRh3U+0nHFWet/zg3efV&#xA;Sy+cYzdU2iOnsI6+HqfWC3/CYq8o/ML/AJx2/M3yQj3V3YDU9JSpbUtO5Txqo7ypxWWP3LLx98Ve&#xA;ZYqzryL+Sf5k+dpYzo2jypYuRXVLsG3tAD+0JHHx08Iwx9sVfev5beT/APBvkXR/LJuPrT6bB6ct&#xA;xSgeR2MkhUfy83PGvbFWS4q7FXYq7FXYq7FXYq+IP+cyf/JuQ/8AbKtv+Ts2KvCsVdirsVdirsVd&#xA;irsVfoV/zjd/5JLyt/xgm/6iZcVeFeZv/W2of+Y7T/8AumQ4q+sLDQNC0+8u76w021tL2/b1L66g&#xA;hjilneteUrooZzU9WOKo/FXYq4gMCCKg7EHoRiqBt9A0K2uPrNtp1rDcbn1o4Y0ep6/EFBxVHYq7&#xA;FXyB/wA5U/8Ak/fKP/MDp3/dRuMVfWCaBoSavJrSabarrEqCOXUhDGLlkAoEabj6hUAdK4qj8Vdi&#xA;rsVQB8vaAbn60dNtTck8jP6EfqV8eXGuKo/FXYq7FXYq7FXYq7FXYq7FXxB/zmT/AOTch/7ZVt/y&#xA;dmxV4VirsVdirsVdirsVdir9Cv8AnG7/AMkl5W/4wTf9RMuKsG1r8lfO93/zk3B59hjtz5a9a2uX&#xA;uTModfq9mkDRmL7fIvFtQUoRv1xV9B4q7FXYq7FXYq7FXYq+fPz1/JXzv5y/Nnyz5j0WO3fSrOC1&#xA;t72WWZY2iNvdyTsxQ/EylJduFTsfbFX0HirsVdirsVdirsVdirsVdirsVdirsVdirsVfOn5/f845&#xA;+d/zD88x6/ot9plvZrZQ2pjvZbhJecbyMTSKCZafGP2sVebf9CVfmn/1ddD/AOki8/7JMVd/0JV+&#xA;af8A1ddD/wCki8/7JMVd/wBCVfmn/wBXXQ/+ki8/7JMVd/0JV+af/V10P/pIvP8AskxV3/QlX5p/&#xA;9XXQ/wDpIvP+yTFXf9CVfmn/ANXXQ/8ApIvP+yTFXf8AQlX5p/8AV10P/pIvP+yTFX1N+UnlDUvJ&#xA;35d6L5a1OWGa+06ORJ5LZnaIl5nkHAusbHZx1UYqy7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq&#xA;7FXYq//Z</xmpGImg:image>
+ </rdf:li>
+ </rdf:Alt>
+ </xmp:Thumbnails>
+ </rdf:Description>
+ <rdf:Description rdf:about=""
+ xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/"
+ xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#"
+ xmlns:stEvt="http://ns.adobe.com/xap/1.0/sType/ResourceEvent#">
+ <xmpMM:RenditionClass>proof:pdf</xmpMM:RenditionClass>
+ <xmpMM:OriginalDocumentID>uuid:65E6390686CF11DBA6E2D887CEACB407</xmpMM:OriginalDocumentID>
+ <xmpMM:DocumentID>xmp.did:5FCFF6CD6B2068118083DDCF5AC233CF</xmpMM:DocumentID>
+ <xmpMM:InstanceID>uuid:ce683a68-df29-fd49-91a3-fb4d92bfa24e</xmpMM:InstanceID>
+ <xmpMM:DerivedFrom rdf:parseType="Resource">
+ <stRef:instanceID>xmp.iid:5ECFF6CD6B2068118083DDCF5AC233CF</stRef:instanceID>
+ <stRef:documentID>xmp.did:5ECFF6CD6B2068118083DDCF5AC233CF</stRef:documentID>
+ <stRef:originalDocumentID>uuid:65E6390686CF11DBA6E2D887CEACB407</stRef:originalDocumentID>
+ <stRef:renditionClass>proof:pdf</stRef:renditionClass>
+ </xmpMM:DerivedFrom>
+ <xmpMM:History>
+ <rdf:Seq>
+ <rdf:li rdf:parseType="Resource">
+ <stEvt:action>saved</stEvt:action>
+ <stEvt:instanceID>xmp.iid:FA7F117407206811822AEAA5B991C736</stEvt:instanceID>
+ <stEvt:when>2012-09-06T13:08:53-04:00</stEvt:when>
+ <stEvt:softwareAgent>Adobe Illustrator CS6 (Macintosh)</stEvt:softwareAgent>
+ <stEvt:changed>/</stEvt:changed>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <stEvt:action>saved</stEvt:action>
+ <stEvt:instanceID>xmp.iid:5FCFF6CD6B2068118083DDCF5AC233CF</stEvt:instanceID>
+ <stEvt:when>2012-12-10T10:41:19-05:00</stEvt:when>
+ <stEvt:softwareAgent>Adobe Illustrator CS6 (Macintosh)</stEvt:softwareAgent>
+ <stEvt:changed>/</stEvt:changed>
+ </rdf:li>
+ </rdf:Seq>
+ </xmpMM:History>
+ </rdf:Description>
+ <rdf:Description rdf:about=""
+ xmlns:illustrator="http://ns.adobe.com/illustrator/1.0/">
+ <illustrator:StartupProfile>Web</illustrator:StartupProfile>
+ </rdf:Description>
+ <rdf:Description rdf:about=""
+ xmlns:xmpTPg="http://ns.adobe.com/xap/1.0/t/pg/"
+ xmlns:stDim="http://ns.adobe.com/xap/1.0/sType/Dimensions#"
+ xmlns:xmpG="http://ns.adobe.com/xap/1.0/g/">
+ <xmpTPg:NPages>1</xmpTPg:NPages>
+ <xmpTPg:HasVisibleTransparency>False</xmpTPg:HasVisibleTransparency>
+ <xmpTPg:HasVisibleOverprint>False</xmpTPg:HasVisibleOverprint>
+ <xmpTPg:MaxPageSize rdf:parseType="Resource">
+ <stDim:w>60.000000</stDim:w>
+ <stDim:h>56.000000</stDim:h>
+ <stDim:unit>Points</stDim:unit>
+ </xmpTPg:MaxPageSize>
+ <xmpTPg:PlateNames>
+ <rdf:Seq>
+ <rdf:li>Cyan</rdf:li>
+ <rdf:li>Magenta</rdf:li>
+ <rdf:li>Yellow</rdf:li>
+ <rdf:li>Black</rdf:li>
+ </rdf:Seq>
+ </xmpTPg:PlateNames>
+ <xmpTPg:SwatchGroups>
+ <rdf:Seq>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:groupName>Default Swatch Group</xmpG:groupName>
+ <xmpG:groupType>0</xmpG:groupType>
+ <xmpG:Colorants>
+ <rdf:Seq>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>White</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>255</xmpG:red>
+ <xmpG:green>255</xmpG:green>
+ <xmpG:blue>255</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>Black</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>0</xmpG:red>
+ <xmpG:green>0</xmpG:green>
+ <xmpG:blue>0</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>RGB Red</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>255</xmpG:red>
+ <xmpG:green>0</xmpG:green>
+ <xmpG:blue>0</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>RGB Yellow</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>255</xmpG:red>
+ <xmpG:green>255</xmpG:green>
+ <xmpG:blue>0</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>RGB Green</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>0</xmpG:red>
+ <xmpG:green>255</xmpG:green>
+ <xmpG:blue>0</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>RGB Cyan</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>0</xmpG:red>
+ <xmpG:green>255</xmpG:green>
+ <xmpG:blue>255</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>RGB Blue</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>0</xmpG:red>
+ <xmpG:green>0</xmpG:green>
+ <xmpG:blue>255</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>RGB Magenta</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>255</xmpG:red>
+ <xmpG:green>0</xmpG:green>
+ <xmpG:blue>255</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=193 G=39 B=45</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>193</xmpG:red>
+ <xmpG:green>39</xmpG:green>
+ <xmpG:blue>45</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=237 G=28 B=36</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>237</xmpG:red>
+ <xmpG:green>28</xmpG:green>
+ <xmpG:blue>36</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=241 G=90 B=36</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>241</xmpG:red>
+ <xmpG:green>90</xmpG:green>
+ <xmpG:blue>36</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=247 G=147 B=30</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>247</xmpG:red>
+ <xmpG:green>147</xmpG:green>
+ <xmpG:blue>30</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=251 G=176 B=59</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>251</xmpG:red>
+ <xmpG:green>176</xmpG:green>
+ <xmpG:blue>59</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=252 G=238 B=33</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>252</xmpG:red>
+ <xmpG:green>238</xmpG:green>
+ <xmpG:blue>33</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=217 G=224 B=33</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>217</xmpG:red>
+ <xmpG:green>224</xmpG:green>
+ <xmpG:blue>33</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=140 G=198 B=63</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>140</xmpG:red>
+ <xmpG:green>198</xmpG:green>
+ <xmpG:blue>63</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=57 G=181 B=74</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>57</xmpG:red>
+ <xmpG:green>181</xmpG:green>
+ <xmpG:blue>74</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=0 G=146 B=69</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>0</xmpG:red>
+ <xmpG:green>146</xmpG:green>
+ <xmpG:blue>69</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=0 G=104 B=55</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>0</xmpG:red>
+ <xmpG:green>104</xmpG:green>
+ <xmpG:blue>55</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=34 G=181 B=115</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>34</xmpG:red>
+ <xmpG:green>181</xmpG:green>
+ <xmpG:blue>115</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=0 G=169 B=157</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>0</xmpG:red>
+ <xmpG:green>169</xmpG:green>
+ <xmpG:blue>157</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=41 G=171 B=226</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>41</xmpG:red>
+ <xmpG:green>171</xmpG:green>
+ <xmpG:blue>226</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=0 G=113 B=188</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>0</xmpG:red>
+ <xmpG:green>113</xmpG:green>
+ <xmpG:blue>188</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=46 G=49 B=146</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>46</xmpG:red>
+ <xmpG:green>49</xmpG:green>
+ <xmpG:blue>146</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=27 G=20 B=100</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>27</xmpG:red>
+ <xmpG:green>20</xmpG:green>
+ <xmpG:blue>100</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=102 G=45 B=145</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>102</xmpG:red>
+ <xmpG:green>45</xmpG:green>
+ <xmpG:blue>145</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=147 G=39 B=143</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>147</xmpG:red>
+ <xmpG:green>39</xmpG:green>
+ <xmpG:blue>143</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=158 G=0 B=93</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>158</xmpG:red>
+ <xmpG:green>0</xmpG:green>
+ <xmpG:blue>93</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=212 G=20 B=90</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>212</xmpG:red>
+ <xmpG:green>20</xmpG:green>
+ <xmpG:blue>90</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=237 G=30 B=121</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>237</xmpG:red>
+ <xmpG:green>30</xmpG:green>
+ <xmpG:blue>121</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=199 G=178 B=153</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>199</xmpG:red>
+ <xmpG:green>178</xmpG:green>
+ <xmpG:blue>153</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=153 G=134 B=117</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>153</xmpG:red>
+ <xmpG:green>134</xmpG:green>
+ <xmpG:blue>117</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=115 G=99 B=87</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>115</xmpG:red>
+ <xmpG:green>99</xmpG:green>
+ <xmpG:blue>87</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=83 G=71 B=65</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>83</xmpG:red>
+ <xmpG:green>71</xmpG:green>
+ <xmpG:blue>65</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=198 G=156 B=109</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>198</xmpG:red>
+ <xmpG:green>156</xmpG:green>
+ <xmpG:blue>109</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=166 G=124 B=82</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>166</xmpG:red>
+ <xmpG:green>124</xmpG:green>
+ <xmpG:blue>82</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=140 G=98 B=57</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>140</xmpG:red>
+ <xmpG:green>98</xmpG:green>
+ <xmpG:blue>57</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=117 G=76 B=36</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>117</xmpG:red>
+ <xmpG:green>76</xmpG:green>
+ <xmpG:blue>36</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=96 G=56 B=19</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>96</xmpG:red>
+ <xmpG:green>56</xmpG:green>
+ <xmpG:blue>19</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=66 G=33 B=11</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>66</xmpG:red>
+ <xmpG:green>33</xmpG:green>
+ <xmpG:blue>11</xmpG:blue>
+ </rdf:li>
+ </rdf:Seq>
+ </xmpG:Colorants>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:groupName>Grays</xmpG:groupName>
+ <xmpG:groupType>1</xmpG:groupType>
+ <xmpG:Colorants>
+ <rdf:Seq>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=0 G=0 B=0</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>0</xmpG:red>
+ <xmpG:green>0</xmpG:green>
+ <xmpG:blue>0</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=26 G=26 B=26</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>26</xmpG:red>
+ <xmpG:green>26</xmpG:green>
+ <xmpG:blue>26</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=51 G=51 B=51</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>51</xmpG:red>
+ <xmpG:green>51</xmpG:green>
+ <xmpG:blue>51</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=77 G=77 B=77</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>77</xmpG:red>
+ <xmpG:green>77</xmpG:green>
+ <xmpG:blue>77</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=102 G=102 B=102</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>102</xmpG:red>
+ <xmpG:green>102</xmpG:green>
+ <xmpG:blue>102</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=128 G=128 B=128</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>128</xmpG:red>
+ <xmpG:green>128</xmpG:green>
+ <xmpG:blue>128</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=153 G=153 B=153</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>153</xmpG:red>
+ <xmpG:green>153</xmpG:green>
+ <xmpG:blue>153</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=179 G=179 B=179</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>179</xmpG:red>
+ <xmpG:green>179</xmpG:green>
+ <xmpG:blue>179</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=204 G=204 B=204</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>204</xmpG:red>
+ <xmpG:green>204</xmpG:green>
+ <xmpG:blue>204</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=230 G=230 B=230</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>230</xmpG:red>
+ <xmpG:green>230</xmpG:green>
+ <xmpG:blue>230</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=242 G=242 B=242</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>242</xmpG:red>
+ <xmpG:green>242</xmpG:green>
+ <xmpG:blue>242</xmpG:blue>
+ </rdf:li>
+ </rdf:Seq>
+ </xmpG:Colorants>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:groupName>Web Color Group</xmpG:groupName>
+ <xmpG:groupType>1</xmpG:groupType>
+ <xmpG:Colorants>
+ <rdf:Seq>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=63 G=169 B=245</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>63</xmpG:red>
+ <xmpG:green>169</xmpG:green>
+ <xmpG:blue>245</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=122 G=201 B=67</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>122</xmpG:red>
+ <xmpG:green>201</xmpG:green>
+ <xmpG:blue>67</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=255 G=147 B=30</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>255</xmpG:red>
+ <xmpG:green>147</xmpG:green>
+ <xmpG:blue>30</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=255 G=29 B=37</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>255</xmpG:red>
+ <xmpG:green>29</xmpG:green>
+ <xmpG:blue>37</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=255 G=123 B=172</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>255</xmpG:red>
+ <xmpG:green>123</xmpG:green>
+ <xmpG:blue>172</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=189 G=204 B=212</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>189</xmpG:red>
+ <xmpG:green>204</xmpG:green>
+ <xmpG:blue>212</xmpG:blue>
+ </rdf:li>
+ </rdf:Seq>
+ </xmpG:Colorants>
+ </rdf:li>
+ </rdf:Seq>
+ </xmpTPg:SwatchGroups>
+ </rdf:Description>
+ <rdf:Description rdf:about=""
+ xmlns:pdf="http://ns.adobe.com/pdf/1.3/">
+ <pdf:Producer>Adobe PDF library 10.01</pdf:Producer>
+ </rdf:Description>
+ </rdf:RDF>
+</x:xmpmeta>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+<?xpacket end="w"?> endstream endobj 3 0 obj <</Count 1/Kids[7 0 R]/Type/Pages>> endobj 7 0 obj <</ArtBox[0.0 0.0 56.0 56.0]/BleedBox[0.0 0.0 60.0 56.0]/Contents 165 0 R/LastModified(D:20130102000134-05'00')/MediaBox[0.0 0.0 60.0 56.0]/Parent 3 0 R/PieceInfo<</Illustrator 166 0 R>>/Resources<</ExtGState<</GS0 167 0 R>>/Properties<</MC0 163 0 R>>>>/Thumb 168 0 R/TrimBox[0.0 0.0 60.0 56.0]/Type/Page>> endobj 165 0 obj <</Filter/FlateDecode/Length 537>>stream
+H‰TTËnU1 Üç+ò7ŸI¶ĪB >à
+º)H-ÿ/1vî=§¨ROÇqlόӇoõáé±×OŸky+½šWïõ‚ÏûÏò£þA(~Þ_ÊÃ×ï½¾ü-o•2DÕ¬u•Uu´Ñêõwfÿ.—Þ„Ví–U
+%n›Û0BÍü£…
+8;Ue`\B]'l3Wi]-*=SST5_&k8\Fg9!~> endstream endobj 169 0 obj [/Indexed/DeviceRGB 255 170 0 R] endobj 170 0 obj <</Filter[/ASCII85Decode/FlateDecode]/Length 428>>stream
+8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0
+b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup`
+E1r!/,*0[*9.aFIR2&b-C#s<Xl5FH@[<=!#6V)uDBXnIr.F>oRZ7Dl%MLY\.?d>Mn
+6%Q2oYfNRF$$+ON<+]RUJmC0I<jlL.oXisZ;SYU[/7#<&37rclQKqeJe#,UF7Rgb1
+VNWFKf>nDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j<etJICj7e7nPMb=O6S7UOH<
+PO7r\I.Hu&e0d&E<.')fERr/l+*W,)q^D*ai5<uuLX.7g/>$XKrcYp0n+Xl_nU*O(
+l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> endstream endobj 163 0 obj <</Intent 171 0 R/Name(Layer 1)/Type/OCG/Usage 172 0 R>> endobj 171 0 obj [/View/Design] endobj 172 0 obj <</CreatorInfo<</Creator(Adobe Illustrator 16.0)/Subtype/Artwork>>>> endobj 167 0 obj <</AIS false/BM/Normal/CA 1.0/OP false/OPM 1/SA true/SMask/None/Type/ExtGState/ca 1.0/op false>> endobj 166 0 obj <</LastModified(D:20130102000134-05'00')/Private 173 0 R>> endobj 173 0 obj <</AIMetaData 174 0 R/AIPDFPrivateData1 175 0 R/AIPDFPrivateData10 176 0 R/AIPDFPrivateData2 177 0 R/AIPDFPrivateData3 178 0 R/AIPDFPrivateData4 179 0 R/AIPDFPrivateData5 180 0 R/AIPDFPrivateData6 181 0 R/AIPDFPrivateData7 182 0 R/AIPDFPrivateData8 183 0 R/AIPDFPrivateData9 184 0 R/ContainerVersion 11/CreatorVersion 16/NumBlock 10/RoundtripVersion 16>> endobj 174 0 obj <</Length 927>>stream
+%!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 16.0 %%AI8_CreatorVersion: 16.0.3 %%For: (Dave Gandy) () %%Title: (icon-flag.pdf) %%CreationDate: 1/2/13 12:01 AM %%Canvassize: 16383 %%BoundingBox: -56 -119 188 0 %%HiResBoundingBox: -56 -119 188 0 %%DocumentProcessColors: Cyan Magenta Yellow Black %AI5_FileFormat 12.0 %AI12_BuildNumber: 690 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%RGBProcessColor: 0 0 0 ([Registration]) %AI3_Cropmarks: 0 -56 60 0 %AI3_TemplateBox: 7.5 -7.5 7.5 -7.5 %AI3_TileBox: -366 -334 426 278 %AI3_DocumentPreview: None %AI5_ArtSize: 14400 14400 %AI5_RulerUnits: 2 %AI9_ColorModel: 1 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 1 %AI9_OpenToView: -58.6665 18.333 6 1261 742 18 0 0 134 133 1 1 0 0 1 0 1 1 0 1 %AI5_OpenViewLayers: 7 %%PageOrigin:-393 -307 %AI7_GridSettings: 4 4 4 4 1 0 0.8 0.8 0.8 0.9 0.9 0.9 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 175 0 obj <</Length 6064>>stream
+%%BoundingBox: -56 -119 188 0 %%HiResBoundingBox: -56 -119 188 0 %AI7_Thumbnail: 128 64 8 %%BeginData: 5936 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45FDA0FFA8FD41FF7D527DFD3AFF27F827FD1EFFA8F8277DFD1DFF7D %F8F8F827FD38FF52F8F8F852FD07FFA8FD15FFFD04F8A8FD09FFA8FD12FF %FD05F87DFD37FF52F8F8F852FD04FFA87DFD0427527DA8FD08FF7D277DFD %05FFFD04F8A8FD05FFA85252272727527DFD09FFA85227FFFFFFFD05F87D %FD04FFA87D52522727277DA8FD09FF7D2752FD1EFF7DF8F8F87DFFFF7DFD %0AF8277DFD04FF7D27F8F8F8FD05FF52F8F827FFFFFFA85227FD09F8527D %FD04FFA852F8F8F852FFFF52FD04F8A8FFFF7D27FD0AF87DA8FFFFFFA87D %27F8F8F8FF27527DFD1BFF52F852FF7D27FD0DF8275252FD05F827FD06FF %F8F87DFFFF52FD0EF827522727FD05F87DFFFFFF52F827A8FF7D27FD0EF8 %27522727FD09F8A8FD05FFA8A8A8FD12FF52F87D7DFD18F8FD05FFA8F8F8 %A8FF52FD18F852FFFFFF52F827FFA8FD1DF8A8FFFFA87D2727F827F8527D %FD06FFA85252FD06FF52F8527DFD17F827FD06FFF8F8A8FF27FD18F87DFF %FFFF7DF852FFA8FD19F827F8F827A8A827FD0AF87DA8A87D52F8F8F8A8FD %05FF52F87D7DFD17F827FD05FFA8F8F8A8FF27FD18F852FFFFFF52F827FF %7DFD19F8FFF8F8A87DFD14F87DFD05FF52F8527DFD17F827FD06FFF8F8A8 %FF27FD18F87DFFFFFF7DF852FFA8FD19F8FFF8F8A827FD14F8A8FD05FF52 %F85252FD18F8FD05FFA8F8F8A8FF27FD18F852FFFFFF52F827FF7DFD19F8 %FFF8F87D27FD14F87DFD05FF52F8527DFD17F827FD06FFF8F8A8FF27FD18 %F87DFFFFFF7DF852FFA8FD19F8A8F8F8A827FD14F8A8FD05FF52F87D52FD %18F8FD05FFA8F8F8A8FF27FD18F852FFFFFF52F827FF7DFD19F8FFF8F87D %52FD14F8A8FD05FF52F8527DFD17F827FD06FFF8F87DFF27FD18F87DFFFF %FF7DF852FFA8FD19F8A8F8F8A827FD14F8A8FD05FF52F87D52FD18F8FD05 %FFA8F8F8A8FF27FD18F852FFFFFF52F827FF7DFD19F8FFF8F87D52FD14F8 %A8FD05FF52F8527DFD17F827FD06FFF8F8A8FF27FD18F87DFFFFFF7DF852 %FFA8FD19F8A8F8F8A827FD14F8A8FD05FF52F87D7DFD18F8FD05FFA8F8F8 %A8FF27FD18F852FFFFFF52F827FF7DFD19F8FFF8F87D27FD14F87DFD05FF %52F8527DFD06F82752527D2727FD0BF8A8FD06FFF8F8A8FF27FD05F82752 %527D5227FD0DF8FD04FF7DF852FFA8FD06F82752527D2727FD0CF852A8F8 %F8A827FD14F8A8FD05FF52F87D52F8F8F8277DA8FD05FFA87DFD08F852A8 %FD06FFA8F8F8A8FF27F8F8F8527DFD06FFA85227FD07F8277DFD05FF52F8 %27FF7DFD04F87DA8FD05FFA8A827FD08F8527DFFFFF8F87D27FD05F85252 %5227FD0AF827FD06FF52F852FFF852A8FD0BFF7D522752527DA8FD09FFF8 %F8A8FF52F852FD0CFF7D2752275252A8FD07FF7DF852FFFF27277DFD0BFF %A87D2752277D7DFD04FFA8F8F8A827F8F8277DFD05FF7D52FD07F87DFD07 %FF52F852FD1EFFA8F8F8A8FFFFA8FD1BFF52F827FD1CFFF8F8A8A8277DFD %09FFA85252527DA8FD09FF52F852FD1FFFF8F87DFD1EFF7DF852FD1BFFA8 %F8F8A8FD1BFF52F852FD1EFFA8F8F8A8FD1EFF52F827FD1CFFF8F87DFD1B %FF52F852FD1FFFF8F87DFD1EFF7DF852FD1BFFA8F8F8A8FD1BFF52F852FD %1EFFA8F8F8A8FD1EFF52F827FD1CFFF8F8A8FD1BFF52F852FD1FFFF8F8A8 %FD1EFF7DF852FD1CFFA87DFD1DFF7DA8FD1FFFA87DFD1FFFA87DA8FDFCFF %FDFCFFFDC0FF52FD1EF827FFFFFFA87D52FD1EFFA8527DFD39FF52FD1EF8 %27FFFFFF52F8F827FD1CFFA8F8F8F87DFD38FF52FD1FF8FFFFFFFD04F87D %FD05FFA8A87D7D7DA8FD0AFFA87DFD04FF52F8F8F827FD05FFA8A87D7D7D %A8A8FD09FFA87DA8FD20FF52FD1EF827FFFFFF27F8F8F8FFFFFFA87D27FD %06F82752FD07FF52F8F8A8FFFFFF7DF8F8F852FFFFFFA82727FD05F82727 %A8FD06FF7D27F827FD20FF52FD1EF827FFFFFF7DF8F87DFFA827FD0CF852 %7DA87D52FD04F87DFD04FF52F827FFFF5227FD0BF8277DA87D7D27FD04F8 %FD20FF52FD1EF827FD04FFF8F8A8A8FD17F87DFD04FF7DF827FF27FD16F8 %27FD20FF52FD1FF8FFFFFFA8F8F8A827FD17F87DFD04FF7DF8527DFD18F8 %FD20FF52FD1EF827FD04FFF8F87D52FD17F8A8FD04FF52F852A8FD17F827 %FD20FF52FD1FF8FFFFFFA8F8F8A827FD17F87DFD04FF7DF8527DFD18F8FD %20FF52FD1EF827FD04FFF8F87D27FD17F87DFD04FF52F8527DFD17F827FD %20FF52FD1FF8FFFFFFA8F8F8A827FD17F87DFD04FF7DF8527DFD18F8FD20 %FF52FD1EF827FD04FFF8F87D27FD17F87DFD04FF52F852A8FD17F827FD20 %FF52FD1EF827FFFFFFA8F8F8A827FD17F87DFD04FF7DF8527DFD17F827FD %20FF52FD1EF827FD04FFF8F87D52FD17F87DFD04FF52F852A8FD17F827FD %20FF52FD1FF8FFFFFFA8F8F8A827FD17F87DFD04FF7DF8527DFD18F8FD20 %FF52FD1EF827FD04FFF8F87D52FD17F87DFD04FF52F852A8FD17F827FD20 %FF52FD1FF8FFFFFFA8F8F8A827FD08F827FD0EF87DFD04FF7DF8527DFD08 %F827FD0EF827FD20FF52FD1EF827FD04FFF8F87D27FD04F8277DA8FFFFFF %7D52FD09F8277DFD05FF52F8527DFD05F8527DFFFFFFA87D27FD09F827FD %21FF52FD1FF8FFFFFFA8F8F8A827F8F87DA8FD08FFA852FD05F8277DA8FD %06FF7DF8527DF8F8277DFD09FF7D27FD05F852A8FD22FF52FD1EF827FD04 %FFF8F8A8FF52FD0EFFA87DA8FD0AFF52F827FF7DA8FD0EFF7DA8A8FD25FF %52FD1EF827FFFFFFA8F8F8A8FD1DFF7DF852FD39FF52FD1EF827FD04FFF8 %F87DFD1DFF52F827FD39FF52FD1FF8FFFFFFA8F8F8A8FD1DFF7DF827FD39 %FF52FD1EF827FD04FFF8F87DFD1DFF52F827FD39FF52FD1FF8FFFFFFA8F8 %F8A8FD1DFF7DF827FD39FF52FD1EF827FD04FF2727A8FD1DFF7D2752FD39 %FF52FD1FF8FD60FF52FD1EF827FD60FF52FD1FF8FD60FF7D7D527D527D52 %7D527D527D527D527D527D527D527D527D527D527D527D527DFD5FFFA8FD %62FFFF %%EndData endstream endobj 176 0 obj <</Filter[/FlateDecode]/Length 391>>stream
+H‰TA1 …AþC.#Á¡VÛq|\Ð"!U‚nhCA‚M+ÿ;Óî.§ñû&Ïy/ØÌ2ŠAo†yg [ÆFPP›3Æü2ë¦â¬µ¼w&@¢ìÌ
+iŽ%Ôy£&þ+Ha²AªQ\õ5a¾;&¤prþ™°Ú5$Öîß[ö!zä“k—ÀÐK”Tï&¾©¸@`ö~ž/$ú[íF¶瀥Ô@žŽpÂAÛÚ_ÏðþM ?^.4䧙ړÈCŒ&cº$†ŠÅ¶ê×yx¢÷Éò³çùㇴ‘¦»×òéþøe?ÿ]ÖÝ.MÓÛù°¼[çï?–5Îóï%ÏÇãé2_–_þ'Öå|9­K>;ý â–Ûñiºó*ý`
+H‰ÌWkoܸýüê‡
+Ì7MwÙ¢5 yDZ
+¡ß îÇÇODý öTçô¿êU‹„‚êëM¿^5w®Ã;[¼!}%žZ±ß˜o"ïÕ•Ø_™¿{p‹ÈBÐoD¬ 7Éé§ d[J¿b~5b±0÷
+pÑ€Ñ- b ¡»t.jB>A0¾ /%5AåÂU-n¼¸ƒÈc fnaâ@†)`þ3Ê€ýí—±É|F«3·
+Ö0Ò6Ï£\äX@žæY®ò</ò
+Æ Q!Š¸Àâ
+Y¤…*ò¢,ªÒ/¼ŒÊ¸LJY¦%æ*ó²`eYVÚ"*(¬vZaíU`Ê
+_V{¸ôÁæô^:(äÔ™ƒtßt8ˆ"Ü Uá7„ÍÁ×w—^ºW±@nÀè¦dÒ¤ƒÄAì@°RLˆàBß…Q9³ºwWï^¹e@ž¹àqÉÞ’³‘­%EKZ@sØXR°TüRÝVÍ{º%}²I¥KE.µ·ÔØžž–ªa{1ÚÈ,R‚´H,b‚°ˆÜ"dä{6ešÐ?™ÿ¸33×x)Bf‘¤|›á/¶[˜Ð;zDБ˒øSÄ—$~¢IðIí©9#­&¤ÇˆôžJRŒ"EHF;´W½AŸ6TÐ2ZrB+ŒhEX¬¥„2sÄ­ ñK"ŽÅˆf¢Zˆhî3R -çzŸÌB€È‘QdØ
+ŒP‡J3„M™& ”#ÈÇ ¡€š¢m*%Cà€#ÉŠ$î
+R@‡*ɪe’ h oŽ ÑW°ŠUð)}‚p/ö9‚û f\‚ã‰!C‚H±H‰#@íPÁÜ
+p¡TR$—$Š‘f"¤›ILJݗ°Š‰(CB’ ™)æ9Š#W¨U*XhútÕiU'Zä¦qúŽ²SAkGéqã(‡2I]×o:ó§T˜JµÙÃ#Ó‘0~>¬ËŽp •êMHHaTÀ˜™Rhse}™ _ê,$È{ÇLds‘NEÈ6(hnï¦dÃÊätǧt§“]¦'¤§ŠÛ4«*J*[8ˆ©tÈ\µk-è:ͯŒH¼P1WЫöã+cBœ²(õÓÎi׆†Œª’’/˜¥’0˜ŠSá™ÂÇTr9â%D¶È6Û«f[%Ó±‚D‚f1$„´a>>¨ ³d—(CÒ¢X Jƒù ÈöªƒQÂ&€1â¸1g6•9‡bQñp´ŒFÏÅ"£ú=oüŸQMåïˆù #GœÄ{ ÄâddOKÌ>Œ—)ÈgÔålÌ1Ómªô Š-v9UÐã¡@ßÓ=È=̇Hó³ñ˜9!z
+æ‡/Ä!
+I†2’f!IC­¦!æ¡©ä¡y(3I"粦„¢… Wb‘#‰F™ÑH‘g8²,¥… idB’Œ$))á¯ÊW„ ‚’£ZD% K—&Ä% L™$4IlJ>08Itrtª†ñi°‰•· ¹ »%ò[”ï;9,ùiwqaZ]‹Ò”Ì2”țͩo¨«b,uâÕ‘k®‰<d*:˜êqÈåà‘G4&¼í®­=!ˆ[bxM<´ïYÇ%-ªÆJõ1´ìš›ƒJ_5å¢=Èä
+'Ń’WÔÊ'u'õ' gØÐQÓnåVë3u§^ìµwåî
+•kGáâC¥Uf¿,ÊOÕ}E½¡Ñ?×ðJÑÜž^¡éu2wÞ¼·ˆ¯–yøÑÛ&úÖ¤#ÓÔVšU+vE¾ˆ­S•ŠrQWÔ« z­h=VoØËf]ÕY‹}¯?•f2y•ÁK(Š›RQÞÔõ›†;…ÃÜÔ=kÚ€ÿU>d˜Ð#÷yä:•ÓÈé™×<ñ˜ƒ©c1O=厓|ÍBÌsßx…eœ¬ÁÔ.ñfk¨êý‘1¼Òn+ÿq?×ÿ©Ž±° 0FB¬.E¦Ý45 ¤…²P…З#‹0Y¡uÀ×Å>aO/ KÎrÞ^ñeÐ_OQŒ3öBƒ¬Ú’}@HAÉê—#ªtfsi
+G‚D`a<Ë; º@º¸ÖÄ*\ÈqÖ€ã[ò¼HßÇ>‘ô厞ì/7±\e;
+ZWr¯ÌR——ç1þŒÜ…l12cL¬oÙ©«í®†»íj±«µª­G5›•îºZçnš»Wî¹{cíˆôÂÊÞ·;Þ‘¸js;fÅT>v´®“YÝ!Ÿ[?ª˜æ>·<r™vÔ2Ï\ã«6ñÊÿÖ:ö—w†/æWÓ\T–jq/¹¹z”Ë%¹+
+¤•¯¾7ï>¼æ«Ã·#^¾šK¶WäÀøp¸ó÷d¬«©óZI·-¾‰{®(ËÜz\¤Ð–[bw‘/è íÕ5Áoì›âÓ4H¦!â[ Š<Ê}9§ØyŽÕùÐtYÞƒ)ú€‹VζË]ØÊþPßi<}¶ØÀPe¬`›x_†ëXˆˆYÇoá¨2Ö-t‡±BÓtÕ³}ŸñÞ¾Šmºfç:)‡Ô}ãRžG»³SË“wÝ~þh›¿„Q†É¼ë æÏ/?ùÇ˧ŸÿÔ7†¿}ú¼¾õÓ凿ùç¿>½ühÖ Š‚y‘"ÄÅhÑ'e]›RÄ{ÿñœ^ùXVþP¶åŽËzŸq½ãRî(eŠ¶MSý¤7ܬöÚeš|¼:'Ûû øxÿ_™æ÷ÿþ/æX^q£× þÛÚ–ÒuÚÒo´Ïh‡Ñ΢ E‰¶[š…vv’z’Ø…ˆÐõ¢Á(° "a 'Ìì_ú¾öü}wè'Ù쇅ÚÆSAè¥É éÅ ö6(ˋ锿e{; CËOS<œ‡|vØ“ÚMŽ*‚!ùéå
+‡i™™˜Fá€PŽà,0à t©Y[ƒö*S?1ñ |NÌûú
+̃ éˆÍÖCás
+ TdÅ /K8—W9ëkÇ×מ徿Š—‹F¾ª%ÀŒ<$1f¦=ë#»¶¥å{\ž#ÎâÎûFÎìÉ©mO²†Fj·.:Ü^jè¾(—s™qÇ ¼ÉÏ{ gýÎõ±ãÜÜcøæþ¡¥¡­mé¶E[Õª–ý“×æð_ß>ü¯>Ÿ¯ë÷Äc½ÙÞ
+Õ«œÃv½ÿÿÞ§îp'ÜÿãCìƒÈ»êòä·Aƒ9ý̵-¬Wm5«û ï‹Ð°HWÇÍÑÕÕûâìûçêïêðâñ«ËŸ_ž=ÞÐz6zmõÒìµÝ{úJËí/M_Ú¾6~iýrt„¦D³Rp† °’ÀÚö´ñ­­ok~[û[ ´ÀÌ&ˆ6hJ¬;aÝ K7$9% ÿôöùé{ô$I[Asñh4-ì£Aë™Ñ‚F¶£œÑ"zGãja7 Ú,"سée<Fd­:T®Å/¨è‰EÞ³ô ÁÓ(,–öÁÊk»]Nš+ÕǸiØÔ« ^º¢\”6Å¢Ò5 
+ª¶ÈRô}C®PÍ…/T_Û•º/ugV{ÓlT·¨nRnÓ²Qu«Îå—éøögu×vìuÜ»¦lßÈV¸obÇ6©[ÙjëÜ6ô\¦k,[·¶lnÈ”žÊ. Dµ^:¸6
+F‚²ígn}n~®-Ë=¹'j;Æ,ö¤æV’™Nº=Êž2ÕONêOêNÊ"£'(O
+ùƒ\-3·•ìA+çQÝ rÌÝâÙʇê*åƒXE;0ÿjškÈtáÒ\c|Ç……Qd‹‹Æ¬ð.]€9\„®µ!]Ú‹½ÄKh.]wÅ·[ï½y÷á»7ügË1vVîô@8˼ۇœ[:ùÐty¿;Ç+ø)ïOóæø÷“w°>|«u Ö_îµ6ûåÊ•üÔìá™Õ·Ú¸?Æ·ħA+qŽó\—£\ ÏfDZ²üKr?.:Ý2Lw ¡Á×÷Çùæ‘ð<ÃdÞõ¿„óç—Ÿ¿üãåÓÇÏêÃÇß>}^ßúéòÃûÿüþûÇ/?šõCay_dóÕä·YMUÂ"‘’°ƒì*Ž¥v(Ž[Ø~ÅóÂW¼C§”W6µMœPXEXÆ=#Žœ6VV{žØ&g¶ËÇ™30u„MEÂ9»Šˆ‡ÒÊæ5y"{ZR\»¥OÇô) 9Ñxæ?O<ñÅçÙý‡µ?o*ö]`¯Õ¸nP•QC0L«‰ŠŒ«YU¥K…ÒÃÖŒW;ŒeÍf)¡•Û6íGÚ”7õ›†]&Ž•6,
+Ýù¤îŽz“ú4=ѲÊì—Gåæ/‹Ùèé[Uç7[ê×—ºM¬X­Ö­J!)QǼ«‘¶/åȶ(¥hJ ŒŸZpËììWKoä6üýæb ¹|ŠT‹žAÎAN9 ØXì!>lòÿñUw“zÌȳcÇø°ÀZ…D‰dWuռɗQRe. RæÌ ¦„Êà–
+'æ{dÔ½Cͳon°Í\àì’†RÈs)`Ïæ[jT«²sÞ7#WàTjÌIEÜ¡åÁ{Ý×ý〜<7DÔ4W ­XÀA ÇL,m˜)φyÖ wdɽ˜Rîæ5±lNLO*
+9Øî±÷ã£O8¬
+â; u´¢¢rezwí¿)¨1‡ŠË:îTÔ «“ðy
+Ãdm@Óž)
+‚z¡fJNBGfb
+A¡¢€,?x™ŠaÑLL‚!ê`FX¥¶É¢ic9a© V³5 ÁMpa–;aeÙºDXµ,¶­ƒ`å&¢{+^ÀÃä¨ón`ÔøÆV\!gN ì9XÌÄYCò§vjh4Äh¨Ñ£¡§Æ 5[Ô£Ä'ÎQ5TÕ5í°„±Ï
+ì1hIu+ü! ˆ{ÐÙ…æ&¤—A/þ”ßzÅÍáïtÛm·ãcÀƒ—P]X³¨ˆz/'N@•¤Gûg·Å­?Â¥pÓ¤á¯&+ûŽPØcö#ÜÞ;U8++á‚mU×;Tó€Ì4‰¾T…Ø"p±ÊôЙTj 6,5~›„4×
+Ç‹ä
+Óö¦›PÁ=ÌN†Ž¨w®iÐ]Gð¢C2èÑÓ=:½A÷Ÿ@¬Þ …GH ]
+”$`U’wzÅëáä­@$ÖÍ‚I0T6õUZªaÊ Ä·‘üiÄ Â~‡óî ùc.aç0]ÅHè ·b¸tÛm¶¿tû­?Ì€
+ò¡ 
+òýòóûðCA>äCA¾_~~ÿBAÂéî¡ÿJ¦À
+^}ñ/2÷É…lÛ“¹ošÐ&Ï'5ÆWRŠQN¬‰9»ƒ9mNÍ)š“5†GýƒîÞyÔþ²'4'ëOÑÞhX}×Á/õ~¼?4öÞâ8ùpßØvÏß±>aÔèš“3÷Þµéàùó;–çSÒI˜ýCëeÜÙt×ý¦çÇß¾~züòôü¯^èŸ>y®—~9ýôçó󧿟OŸË%,û™Ž/chê±Á¿Ú„bZ0î0| Ò±ÐTÎ1¼:L/ØíäsÈ0Sƒ> ùn2è•hžè—h2#þ¸V¤sÈ0Æ,ä>˜h“€lZ z`Œ ¦s|wÃjcßu÷ê.ëΗZЭØïÏnoõ†¼Ù‡õ”°Ž«Üaüë?ã ö$`ov_ S‚YdÌ)r·æ†e̻ܰ2ßdUšä£Í¢=&Ä'9XßòCkÜÁ‰;Ù#{·!At ³2¼’kÐàqÒÛ2Sžsš3?¿~ÎÛž×w¿ËTÞ}mþ£
+ ÈŸ«ògôX‰¥ÔªÄê…P“5h
+™C(B‡,’‘Fö
+ÃOPï d#°îUF€× ë «, c^dNÞùΩ"›­îžØ’ÆZØü¡Õ"‹U¬sþKžHwdDaí©KB Zb5ÏH`
+siÎäKr"‚À…fžÑTÞ༩àHp$,‰hd:ö"«¸î€èÞ„MâœÆ:§/jÜ“ÐW€•8å‘ ép›dE~,1I²cTÈ‘%W⥬…ù8‰ôU­A4I#ÑT*—°*ê¾i…Zå|çÊ+@Çä(•«+3ò%QÒ-‚ÂPHeUËÀ‹àʼnã¨EÆ/I²«!J¢” g =˜·Lmésgž?1‹ªó)Ì‹ä/Vì/®Wªõ~·±'vÙا…›Ø¼Êì3¯+²±ž-¶H(ðEm§T­
+=¡M?øS\x£pêå8¾ênÕ"î†ÈÞZŸÓq'l•
+Nþ®Þüš›ÞÖgån£é´°wÚèÇ
+q¦[¥a5r\˜®1J6n²ÒM<ÑÚîÄ/ψwŸäö'é³ÚÓöçO»0›9=ëBný‰Jpm ˆ
+m¡à6DH$ˆ¾ø>÷h'åe°héPDZNV‹Ëή Mšj5Ú_tÚ¤Ööè¿Ö­3Cw ±»Ô;¹t7Ò8‹
+NAi+WÌ*Ág¼åÍ—ÌÉêŒöÄõíi‘¾wÖ¾ÐÔ{¼œ—Ûfætn2»¨³ËjÎó{DÐ/)ZghŽ-XŽ9^f9³¼g¼ÌVgvÆ$E¡%áµ
+wHl” ÞhJWƒ…ñ,2³¸¹¬,Æ3y™ö\Wfæ˜Gâ½LlýÆ.{v4³”I|$ÒÁ!mf<AÌ›3Gç¯Úûs¨Ì$«¼/õ¥$ˆ øÅP÷/£²\â& t†£C·Ñ- ]3ñÊ*]”é¦HWyºËºÁntÛB×MÌìU3;ÙÄD黢Vk¨1ÉÉ0q|Ï´‡•H WvçäpeµàÜB:ºw¶Ë0@~\“µОy}¼Zuê•WƒuwNŽ!“{®ÎúÓLßuXiv¡XYaJØg;E¶@¾AK£žØAœô“ËöYÄ÷2Ó÷¶½Óaðê»…UtaѾêî ©´Å×4ärç䮑§ßdòÃ=ÄâûÝâC‹þOÊú|¿Áðþ ÇzÜ”½ÒsQ¥l¹vQô*Ie¯tšfXÞœ6˜“Vƒ==üj’n³„NtLŒ+—Îrùv+ñn[`4²!ù BGT¤£Ké¨'ˆˆOw0›e¾ÂùX_ÍYß? ’¶0È(ÿ8ÌlÊf Ù =¨×ë.owxS÷vÍÙ%˜¹ÀÑspg?'nnU7'^ÎÁÿrd±ªç³ªÄ¦ªnQ‡‚„$GV…GãZ.)©U…S¤ßçÔQr;êéÀrÉÛÅÞÀ?@¼‹`Ô\Ý"½æõ·¾Ó€­4ÊþÖõ,¬¿Û7¥_(¡Ë÷r•VàÇóIŘÁñK~v¸«Oùmõ·U Ç™œïÇéÜ ï|ü1à/¸á¯f 8Øá•ž)šÆhe±{•ö£çÔä‰Åƒ'öNÌ¥6¸BœÝÙ×9ó[w2v‡µSsF+ºÊB!¢¼ÌX®·í¢ÙÀªé™-ôµØR;^–|Úa´žw„ü ÜØ3ÌõŸ7øú{ùî*o ô#Ÿ¡÷€)°Ó†I˜1 ïparlÝ0®È÷ŒÏq߉gbÙH¹àK&É›µè\ô H½†SËVY ®â
+f²#ö¦j¸•+L¦ „¾©'¥÷Áèþ
+û¯Š& ³¢ÉÅر I9p9Ò†
+ÏF ¥V_`saòw»ÒtåÃ]ñ[¼ƒLч¹‰ 7aå:ÌœsÎ)ý‰Ètí*‡v‰…®.ÍïhÌRbœ¢»riR£4¥‰Ñ"µÅÅ¨ë› sµ;¿æý.lÓè7«®5 }pø¥UàØý_ Iºnþ&sø>u|Ý牿W'6NÌÛ¨YC|˜oQå£Ïï{Àë|ÖàÌñGs¾{Ä»Ž}— Øþ7ÝRc|‘4«9EÍò"jæ«ÚÑ£Ê_ÌÍñ› øåhp›œaúÉm09Ç–sœ9RÎÍ[ÔTdøh1©E¦æxD-Z¤"\éTÚ!Á‹FÇJ²X4©šÚf£r³ÚM'jiuOÈâH4FBàŒ0­ncâ†$ÅcDb‚?¿± §„ .»5gTmcEŠR%’ÎqeeîJPñ³­¹Iʇ»â· ø ;<@Oæ&‚܆•ë0sÊ9§ôs$"s¨Ëššæ4‡Ý”¨Å,ô©•(—¤1Q´]E$e¼b}‰q£FºY=Ì*Q:´ý<!0jÌ\X1b!Sl”¨ÅTx’dÄbdŒÆh03æc¥r-Ñ3`KcW¬ÊŒmÙ003™pÅæÌZƀ_ÌæÁ?˜õ^æ¹$"ÓO®cÓ9P]bVè¸d±–Íö¤¦¹Íô×][S;Ä«¶ð‡{^R7+¾Vü­8]q½â¥ ‹úcJ°>¹wQǽAeBqT¼ ´AÝ «T£/—¨ò/3<— #…§áÚ
+Ñ> Ï!@X™ÚËÅøäžìSzÊå¹8Ÿrx¶1{ææ›ïÞ:ÌôfW‹çÒÁº”¢œxkcmãøêlâ¤ðCÿëúXÖ?…ü -_&óæ‘t>¿nI%?¹ðœ¯æñêx>µüÍø÷øÝúùÓß~þþÓO?|þoûbúáÇŸ>ï_}ûô§~þüý¿øôôcÿê)þÙÜû’'»§é›þs¥W»Z½Ô«¦Xþ¤Y¢Zc×­µ+—í2ÈWÄg˜PlÄ0‹Š­ªc"¡.zÔLô, !_¯íFaè6`ÿtýól ü•Åò/ÿ6WÖ ¨ ‡;›1\˜-5Wb¯4vM˜Q¥dÉA3¤äÇ©ÇÜCc‹Œ{`”¸xÑ´¸ó",ž50ŒVCãJÏ0ÿ¨ïc³
+9´§•Y1¢¶r¥¥K“$Í:Q¡a…Æ÷´?0Êjn– ´ÑäP®QfU—/fÓž¹¤S¤|Wr®½xÓ@9éŸÿ±_®½•GþóæK$@0ô}º‰iÎe„‚X)Š,kׇ]{å5BûïóTwÏÍ>ö‚òi=ÚõqŸ©¾ÕSUo9Ú—º_¯Z¼¸Àÿ.Æ9î4!a´X*åL_-£wI‰er^¥¸¶\-ú¶ïköd°ÙM´åš-UÛBG©ÜZb®ßБkø>W©±›©°¸ZF¤x”ªÁ‹M.¹P¬ÊĺDHyˆ¹<ÔÚù"u–•:KK›ƒQf@¼ FüÀb»\¹¨Ý«DûfáiƒÏüô(—Ø Cå,RäaEšEI­*0*‚JªÖX#Nb.£/ðƒ’Ÿ˜%˜H"8rH$IJ¢¸•H'€—SI Ý!¬ä•üˆÞ
+¢¾D˜ä(e:wWcŽYwŸåÜ%žXôY úu#Áv äîÆaL,Ôaô£íh$s$r9îúo.G™Î¡uÈÁTsHóöIäAE!iaØ¥>ĸT £‘ˆê ŧÃî¬sÜa§”Kj¥íÃl´GØž ¸·1z¯H éT¤1ºŽ´¹í4¹&”„ß×pÈMí^móLmïBm줭ÛOÝR þ”Ÿ¹Ò¼!mçY;N´MðŽ¹Zä?îó³Ë“yY"æed¡óyAYÒæeeaý0÷¿u&ÝPøNÖBaHççpç¾/¶ú“’©÷ÙR3[§é:R¾Ç³t­ø2zK˜®gÑ.ẫéM^Š¸Z9=©ÝL×»'ûÝfx¡{ÞóÉrƒðùìû¦ù÷w¢âÍRúYMéÛFFÒ¹»€Yë2¢BJñšfgÖcûçâä½ç‚|#b)›±·‰Žÿs}õi»{~ùôÂbóçïÄÃé\{>öëXN¤©­ÈÃ6DoZô ý°«ÎcÛu˜&·¥ám³U“õŒAË8” ¹1d s@F‘0 #& "’Aä˾?4¨‰‘øÑYcXô†ÃEA# I²Cœ* Ç-è,`,RFÔU@|Èk ¹#¢1 HÄ<Œ\Mg§=°ÒAÑ*x† êIä-„<ò“E#Å>«÷ÜH¶ß)‘šElÁi²è´UxŠôôU~Š
+5+†
+E G§HêgšRæ¢%\Aª™™Ò+®
+Y […®Âך°aÅY}š Üú9lŸ7Ga·”³õg“#šU’Xƒ œ¡`pgš L˜ŠÁÁ`¡`0ð(L0L©dJ&㇒OhdBîjbFbâ¸BÏP,X„ŠÅŠC3S±¤5cñ ¿ÂcAdJ³¢eKLeæOVÏåçÿ8¡^=¦>¶>‹ô 7Ù­9‘ÜNô5§ È’Ï
+Ä‚pXð-…îÐØc­r¬à*YkÌËiÄQ‚ç˜6´‡øÓça.AÚÆ,dõ15t„ /=”ìÓ‘½ðãŽ0É¿–ì×ÏNòý^Ѩ:ØîÉ/¥`O;{$kZ\×=É*‘
+]Ò6´²€Ž)oˆ™+:׳²íj ÉLFœ&_Ùgº#EÉUÛØ)uë¸CÒìBxÐ9øbÇqˆîë1)%Éžñ¸\.»^\€¿Su˜ò¹OŽš½)³ä°`M8§uÅ_Îwì´úËêŽÏ0¸W͹0´mpøͳ¤3,¼Åpm19Íŵ=kP_ò%’˜Q‘ (­×Ì L÷3TDI¹¼VlMq „ߣÃϸ ð3Á I¾/c[]PÜ9:¹kd1N±ö0e¡-#Ý›B]6ÃÁ46¦ ¦ÃJó¯³{WÞšöQ”‰ÕO9 Ù屋”y?ÇÉ‹õ `QZB¦%Ñmµ`%'0ùÔüw‡mQª—wˆšºÕ$u`Zj¢» Ân
+òVÖòÁ浦™TÙÐòÖtŽyž›Îmµ\né-1W/6ƒ®pe¡’zœd€òJ† Õz¼8§A™&2–·\Yu™g¨«³iÐtt¬8mžGwï¯V«ÅlÚÓüÖ´ëyžg›ýÉü÷ȯ^Q^^]Þ_=»À Ô…Óï}sIíÝß¾|}qûS.,_ÞÝþúrSIRûÑÇí“OÔÀðAI>Qä•äù
+L­&.v}òF WÈ]™I
+£)©d²ɱÜryLÑT… MZ12,ÅŒhä-®Ú—ÉçTßÈfÓ V©Ú©ÒTf­C!÷“V#ÙÒÕ
+¾¼¸å=ËÆæ‘K‘Ï†Ó I&s>Ÿ8JÂKí£kÙÆ»vr$‘h¸V²Ê‹Í úC2–&:Dï”±´”¼Rÿ,' è šçWä
+-Uižc¨+Í5ÎŒ²Ò4*a:/¥–°]¶3¿4mxžæÁ±6ào³VE®ä¨)+ºÎĉtˆœötò!9*vÎP;ózN¨HY9UJäRNÚÿq_æºveE~•vKà^ó
+ð68þš3€¬’];¸>ÐYŸXé@çB'U­<ð-²ë jmÜ!Ÿ[‡Pcš€ËuÀ࿯Á>у»àðÈ8¤÷0éˆ`Ímð¨s Ò68&½&bN†7ä¨ábšÓ&ntƒó.Ì6+ é
+ÌÝÆ´¬¤:>ë ™3é?»ÍÀ˜¶Î´G­Sïuî¶_ox+{½oîUO©dé]• ¨h( Ò-ä½érÄ«Í× NfH‘Z·«1F=PdZ€7«ÊQ¾¯‚ú‰ò/ŽÆð§ ;`!­/ѳÑ5†Û1.¼ŸËÝgñR
+Ýï%, ÍÓœ†jU¤
+8Óñ:ªh—ÃPéÊmË‘õPawNòßó]¤—5ò±£ê¬–o—µè¯Œœ=gdÌŒ¯P~Ë&çYkGîöÜÑ}¶½Ö>ÿã=÷ Ð%ö6Ys¦OwAWÔKèë•“Ž‚Bòxƒ¨*\FI½ºG•6Òº×Ù¹Û»Yn#)ÉܽN˜Ú»ÍÀèïu¦=jz­óx·¯«5z';~çCÖXÒñ`¢€*ÊôWM½9Äèà
+÷uµxgˆ[©;tüT¤\Ö%»#v¾ku ¶šU[<ŽÝ$Áôåc8ÚŠ9LZ
+ó{XEv pýqCÊÙ™'N0³Y! ǦMÄ4ÕrÜ£œ Ó¡€Áó ljñxKÀ@ªƒ0x4.BjãÄC¤5 m˜Ú9µH!Ø@tW¡QÔ¾XoÈÛq>th¡»è¢]”
+™M-z)bÔqØ£ë Ž63¨fi#£àñt’uˆ­¦ÎãH‘Ì)Ö‰‘úƒvnbþæ'~³«µ”
+¬­VI ×—rÛËdÄð|öZUŸv 3jÝc­óx±+V£‡’4¶—,yº ¦QPÂň`à»;ê͉›C®ÀÈl)pF¹±éYfæfK  ÉßÎ:üOö/»ÍÀ‚j;Ҵμ—y¸ÙRë߯?¿üéû—Ïß~þåö;ÃîþðüüïÛw¯üÛÛ——÷Ÿ?¾ùñ?oþþþÓû·/ïzÄïo¿ù긿¾ýðñÍŸ?ýòæù_oþüÓ‡—¿|~þùÓ˜ñ{þ©Uoß}ûç?øõó#_üjÇhðÐ …ÀÏä§_]QZ¹ˆ7×x˜ ¯fR¹†r]d)È éðWÐC£5-Ç"hŸTÌhcN“ŽXLTmÊ
+ø÷YÎbCóuú3îPÌÊBÐHÅ›ÊÉ¢]i|E@?‹,£ÉzݪeS"
+:¬!_µMõ’;³¦8=vðyÔÀÓ]Ôµ™_
+'6q’“¤†óÅ°#M¡–©„ÖF~é1°*hŒ*Û‘˜/5µ£iÕ¯™ W8{!#lÕ¸#£E¥wã ã1Î: ^#,±‹êD•J“>ûæ°˜Ë3G÷/ôPŽI/#ö’F¹ÌÜQò(Æ”H™òÚŒéÓ¨‚—A•r¦'’.{©™[î§Q•„UáZKú8[›Î-W`l¹Nv†íÓï¥oùõrüõ
+=úa»D*ß
+%SB‡,è…_B½s‰ò~îb%Y2'Šy™Äõ}õˆ+¶-¢Gr•&ø]Þ§Áôrï1¯jÒÙö¸ýrË#~ù–e+Ñ{¿÷ˆ'º|©ªª¶÷Ós½÷ˆºDŽ)\Æy¡÷—µväê×.ÑéëÎZËû=¯ñœíŒÛ·Úk=Þó®pýíõ§oõ‡>åS,Œ`e»£ušž$&.åLæ ÔUNšeGF?B€NŒxƉÑ}¹®µ#sÏ3JUëÛµDŠ•Ëž+2f®³qûü{­Ç{î§üù¿´WIv%! »Q˜ÁÔy²îûo[òDågÙ¯WIœÂ€‘eÉpe¥ügöé÷p&ïMµÃ6<Úź߄ƒà¤ðô¤ÆÉê¨>ÇF?4sX4¬t+<„Ó¦K.‰ÎŽ”o—ÅÏ0°Mre cë3FI…bå
+T¦^r:ÆdAÓ5x8{'\–Òæe¨¯ÔÊ\ua†l'0}(‡x+Ì}ÔDMø˱¨Nš @›‹(øÃpw°ph‚…zð;º5cŒ¹®}šL_¤0¨°ž£“Víi÷ pò
+.
+ˆ=À"ìâÍW!·à_¤¾Œø0XŽ9™ûúUÖ\‰=seDÕEìÍ…†ç{ÏŒøÊ<Ûý®Î_¹>ïYÀÃ<‹#æ¯é
+EWQŽfå,g›c-¾¤ÍB4$˜ìøö~†A7©*UErK_YQÊðÿÍ…æíwÇøÛ‰"Ï•Ý ež_WÌËCS¡>mØûîñˆ7ÀNª_ª
+H‰´W=Ž¥¹ <ïð'|©ÿp_ÁÀf†Ñ€³œlàÛ»Š”(õëuâ™Áô¼®GñG"‹ä|‰¤§Í6^šÓ“Z Èè/Õñä4å ùë?TÛSk—[®>’k¾T’Æ3Këd ý‘™æëèJõéøÿ˜\€ÛŽm¡,O:/=¹ìý ÿ~ù;üŽòú~¦'ç4J{QåÈ°„ð
+ÕÔ,º7ì"/4ãÝðHƨ–SH”†4<?‹s#v°>™qË•GZ–KU
+d[ܤä(\“°ú¶.&T™·ÍØÉåYH…ï¡é[Œ‘F¿[EYýiB“Jèê•UëºJxFñz*5Áщt/¥Y¡ÔLK¨9cbÐm&ox}€½&㟹K½I%ãH“gv‡ ¸PšÄ2¢ÍGðØG¬6péDft þ SœóíàFK\* )7k±|ö“ Ô)
+Íu3R(‹¹×'Äer¸ý½6è߶¹ÑžWp¥ÔúL£ !¸ÇÂèò3³ÊAìdGq–CÈAE¯…º ~؄αN
+¦¯¼)Ô‡¹o @z{Ä®¢ ‹ÂYXÊLtp¾x›Ê%¦µà«VÃýk;¤ /¥lA-aj·ÇNFœT:î8­«€ö'™|NÍh^”g›Öî/`¼*s<}X£²È¢”I*Ÿät`à‡uÈá>|OÙ¯mFpku DI¨®Ï¯hy¦ridøÞ=f¾uCÖ'’×v’ë†!…‚F–ÞŠYý` ¨
+‹¼×!‹•ý""}À3¯K²¦.› ñ“ùQfê%‡S˜GGW _l¾…®ðÿ=θTŠÝ s§SÍçWVɬ=û=c€Eƒ$I59!£ÙÔTX³G® Û£ë ËæÇJº…‚ÕtèëÒ•VdÇæB¼Ú÷ ÿ·®oqþFƾIĶP:˜Ë:Dçh!÷´QæH˜¼E4&@ë–­¡Ôí:AxÂÔD§ŠÆ/è Ý ÌÀ¾‹Q±j±Ç«µ-,HáÌ9,Ž¸q2O$ugàØJ¶¦Y<Ö†ÔX'Qp±,𜽳»Mø8¦zï7þ`iuœð“9yûb#h½ãkì!µÓ²ùFDéV_\gµø,Ì+–ÎbÇ›•ëÊÀœ2ójþ“»ÉXîNãÂR®Ð[¼ÙãÙÐ8!²«† ^{Íë$F¢2®Ó,ÿæL3”c
+„ý*ûÖà¾b¶e½„µ–=Añ†1˜#ŒFÉ8 àåÚÖí€æÑexyèò’Ê ï… ëömœ
+ÎÕ&²çtåÔxä³åÒuesçÿB‘Û•)·u‘ÝSJõØ dç±ùvÉ…ÿ[×·8oòGMÛ^+§Ï¯¨zÒ1û¸Ùpñrîø"s_€¿¥€­Ë¼¤’Û½ô²ìí1o¡‘T±E/ƒ Ø´o^…PøzÞãû£õ’› Ò¨›xEø†tP¤¦l›²ª
+¼™6ÎcÌbÕ¸›çt³ü‘Kå"·®@–M?(*ŠT~éZ-ÿ²y —o[îø¿u}‹3ê5W¹FâÃlwʆçÙZæå®õny]ؽ套P
+ûÏÞ³¥(–ÿùÅKÇi0I×镲»ÖíñµQ÷2rì‰&ªY&ýd `èiW¢g1K¾ª†Í…øÉíZˆ…÷¡ê=Ês—ÿÿ~‰Ý³¿ï˜×4zP õ 
+°+ؼ±CÉ6ø×´VÉøægtÜrhIÝö¡ÐueÓ}£ÓÆ¡ö:º€ôI¢ ›q›Û·#·ý?ºÞã BÂðë“ åó+ÊÛå €®=+ýC×î± †¤yÄjãß‘C§ISn],›»§:X,G8·ŒË¢ÿ_[æŠgiyð‡¡¼!&°Â†RØï1Ì~~E1EpdET®œ4A¸bµ4sÒƒD-5Õ[p¸t²l~, Ô6£
+£xì²èÀ.ûåØ–º"r=ï!ž‹üü›ùúÆI
+
+†Ÿ|-ˆ†¢ÕÕ\lÐʺžXC.6€oÄ—5ëâ—J e˘­ê ˤ<b¯›s¶*dTY#À²¸µâ.ÏB.¼UïQþ”¤ÄX42Ä1ú£Ž|Ó<`ñ.%Ý|fyq‰¾3Ó®ß=&ÌzöB’ðR²eÊOm…\¸9…šþä‘Êek~l;´ÀãòÒó-° 3®
+ÂÇøµÔ#> n+5ΩanL&,3 ­5vN¬Óت†o
+=¬ŽÜamv,|
+©íõÖóÛÏ(?k³Y¸n4üv† G9ß5&ªöá‹JRŸ&ÒHí ›ÇXÿ–cô6E†®@–ÍÍc EÑôäD¶t5V› ÙÓÄò-äÂÿÐõç'ÞîR¹kí¹¼–5˜Ú&¤ XŠ²ÚðùÌdëÝ|àD#.´!E­#ߊ6² úÁ@Õ"yU†ò¸,nÄOnÇŽ\„ºÞƒü3.‰Ó–³†œ™sÕu€œ¹¨iÃ|ÊN×X"Ý=µ|
+y“Yˆ¨,®5—¦¬ÉÌ;ºY&ýäFqgà-(]@¦µÙ°¹‘åìY/×Þ:‹+
+ÿþÃùR‰ Ê™û…~
+—¶ ¢¨ˆHUe¹ÎÜ;2Qþ}Ÿµgæ}ORªRµÁ~—göìû^{趟›êï¢î¹\÷ ÿ>º½ûìêòîêæúâöÍác˯‡ŸÜÜüxøðÑã¯/î×ç:ÿêâêúüÓ›—oÎo¾;ÿüùÕÝŸno^½|pø=7þÀ?þß>8<û–ß^ñï£WVñ^šÈÏ~[Îc»‹1ضà0ÂÕD¢UuâÎv‹¡®R0–³È„±A,qˆê}d ×BhÙj3ªj+þ±â¦ža&áP }wN¦A9É}H
+°ibayÄAûÇØíï¦IØÖ†aªÁd4èiº¯o+]Fÿ)F)SÉÉÚ°÷0ü4…h'XÚ'qÖ0¾óð©XíðiÔZÄwß+ÿàeFt1º¨õ™&ìöªòȱmi²8zÖº5
+›!š¡7òKœ¼G/Ó
+ ë/[36Ïo³?¦v÷¼ßÅìÀ|Ì®m`æÚÚ.‡¬l Ôí±ùmnÚ4šà®óóŽeËpÒ.B«,Mm"¼x ì“»jß ¶fæ FC,CÝ¿ÍíÍêûÉ!Z/§R6`¾5¶ÔV TQ¸)À•º?¶¾íÖTha»ÆSÊ;v-ƒ#‚f¥ï´ó¾85ñj V[Ö6²¢ÅС ÙíÊX}zZ];9¤ ¥y»‰YÀzÌnm`Ö ó‡%†$4íí©ù={ÒÐgÙ¬X2ìÅ!Õ¡&òÌc³wEôh³ò#MÛªÑ÷ÔL$¦@Üñ™9cûâ:E'ì¶U.90_³k4¸¶É bíùäµ \%§NëÔ¦õ’s߶etS÷ↆ=Txl%è5kJÓléQ ƒç@{}íu.ÇlO¡ž€°s¹ŸÈYÀzmNÛ ÖÑY79NœËïÍïËÁ4‡FëÌfÇrß°·&´Ÿ„×Á¼ª= ã1e7”dÊNõèPÁ(SŠÌ jÓ·ÕÖw@â;í”]hé2Yz´ë=³eÔ*„"·äxí§ý䵌Zè®ø’ô®ÿÓVñôøòxqw|~Î…±Kü¶÷h_ß
+– ›Ûó¯o?__#ÿÇŸÞ«Ä<ûÙÕ équüéüËã›_;ýäøÝÝ9šÿñöæúýöÍýyyÿ,›D,!>=^üâ•«ç>^}ÿüñ«6>½y½l¤ÑËþíÕó»¦l÷Þ£òÊ×ÇÛËãõÝî–ô>]ôãâ·€>¹¹ÜïÜ‹åçüîÑãxþùõó)b|rüþêz">üâêçãƒÆÛ¯ÊÈOúÑX}Z'Å©šc+µÿ>{=wÕ¹¦Â Ežùß³7öù¿þð5ò_þöwwx>n>5ÒfO-Á£Äï?wxrŠnj=ÙïÿöÖíëÿº¢¦ƒ?¹¸ü×Õõ÷#‚O—wo9÷Õ½EâðûòËD`„2YW´Y4ŒMƒåÖ‚þ˜z¢Ï="jSƒ¼B
+{ÊÓE/+?KʶêÂ@ª
+]Ô1ȼŸ'““j+—Ü‘‚-rd‰©ÏÂéž¹C1°çøÆ_ÒÒ’BÊhïÒU,&ª^ð¡ÛžªÅÈ<Ä‚@
+Cå«â"„±ó3°®…XÙ0O<i £]
+¡¦ö­”×kVm€´8NivÐ3ƒ&GÀÉ-W£‰rfHkˆÎÄV h8ÖĦeû[æ[Ø»ÕP»,ujˆšhIsðÌDé=Uñ•úY@—ÎÚi0ÍZ6±®½q ä"£Ø|-À^àÔ:ŠþÒ ¨} WÀªZØ4¯ŠÍùlתŸ€½Fµö¶þÊ€$²L-[æ°Ñ(AÕ~ÆÌm©¥dl4bk Špí6ï¡=ÞÈãÞ›«š-Y^á„TÑbLå:³†q ÞÏä ³<ÆÈL¤g÷B›ÒcþF:¾…Èu;<ª)†b Àõb1ó>·‘ ê`öíF¤©¾6
+
+@W®óÍ­Šì5 Ãf§¢sòÙY a y&V߀ËIæ£
+l;…K-/CVÏEN†ý1!ÃýYV38!ôQÜÊ¥s]&‰ã8 ½JŽ QóºÎÓ÷ß6(9©Z%Æ—l
+Œ´ïíR ø²]u{ã<º4÷ßö È=ëÝêÆU (DÌ|˜Ïó~§(Í´žÁ\:JîuŠÌpÚùå#æsÔÜ·ýÓ» 2D‡ŠN¶rX>'oTúÆÜE5[+fó¡rlW©¨Í6EÚ|u§­Ãl%® ;Ï SÀˆnP9±»%\êd‘W±¢šŠ΃ËH*nÖ¦äœ]{ €1²}S`ehD°7«Ñ‰ò*µÉ{Ù¤/#öÄç»O¬jÍ0+{oÅ7¤p ×þiî‹2 XštH*˜¬
+¤KòßHÜɪÐฉœr²
+1éµ®1ò€@ Ùñ¨Øú(€#(Q_aÒÓΙߴ‚ȆSÓÏêzGÎR.ˆßj©¨­ÀŠ°/Q•;1ö>M|U
+Bñie³¸õ=-Ng»©Y$œ€@éÃCÑ;í™*·"»í:GM韜Èh%-DÎÜ(ØäÌUîÖAeîýß3†ævÎ"-㈿p8,ÒÜ¢IÀãƒPëp'*ð…ü#9ø€wÙøÒJ#§Õ`žŠŸµâ
+Ù,wÀu *¢X"]î RK™ç¶BѸ†z_7Š¶Ô\Y¹¥ÑZ$Ò÷zîùûÅ qáƒè;Ú™áµÒ@©&£AQÊnŸ·Öš©)ã‚&És^9nP
+Ö€ àçño-ƒ)S€-‹2oÑ~
+ž”xï
+š*{°Š%øžr*Q`ÈtO§ê7Ka *iå¨)O
+^½QàB·¤B™³ÌDê·3R³û"u§¢½·²ð}D§ð=:Ç`•3Câ‹tqJj\šÌÐÁ;ÛHEK¥ÅP”mc¥–Ÿ]®EŒjea£€1«¹_M`8Q‰Z ú¾ÑKý¦a—)Ù^ù‹êîù¾¨Ð©Ëý•Ý_`n'”v$tÖÈ1ã^ ú/SœMºƒabGl³Óuˆ¤M
+>3Èæ"HÆ•¥Þ¨M Ó´¨•Cý¦lÜláº}€ãÀ–— ëߨÕó,&)—vÒ§Å6ióíÀ
+ÿiåx”Ze Ô\ã™ÊgL+ïðW† é¿’+:㎰gÔc§Ô(Á©K ÿ¹<ìAkæ·þÏu™ìZV\AôWî,²oìP_`ËST«R©ð÷^;ó¼B`ßx™y²Ù;U)Õ«H$‰2@lõ}´Û')le“.·ƒ°ÊðÁ’-œ~ï·I…p% ×<&w¤Kƒzü„¨½(Š“à”(Ž
+e,EÞ¦J(±µfÜ©_Y9õ˜Cîö;<ü¨A
+*óÄ%ùçíf¨Z°ãÊ·w‹66]îÎÓP=5<£|gy xÜ—
+ü2²AÑîÂe@V´¹ÛûuºÃa|­ûe5Ín>ÊjÜyzkÿçYzv‰¥uçùÞˆ3Èó—^Tòu€è{ñ¤
+úŽ"!9ƒÁˆÌær?ŠL¨Ì¬­=CNÒÍ` ~'‘«,q €¡‹lŽŠwRÇð?DêA­‹Èxø×€©¿Ú÷_>£A›OÅ¡A|‰ ì‚.Àk×yc×Åh®,/ä ´\ÃSnNŠàøRÌ—ÇW'¶ ŒBÞO)Ï®t1dÂøHß.yâF_O8qÌ
+¦E>”Õ¨2Ù<דðtE!ƒw¾Fî¤ðu¤zL¹ò– þ6[œ¶Ì8Öv™@®”–vOº¦(ì$‡|ß#ÄCÅ…>Þ¦I5ŠšéØð±5Ÿ?´v¾&Poâ‚ ‹4§kÔf @ËÑÍæû»G)D; Ô–ª„WNÓQ”óë²êM+æòh–²-o=ý’ Ô‹¾ÉÝ>evù“¥{ͦo?ëõm&9Ýc³øÑ
+yWaA€ZC¿×U³¥J+n¿xLkÅL˜L¨¤Ô¥ÆEßY©xXu´Ôx ðzz{B)n£}UÕi\/¥iÙdÔ.y2þÕ¬Zup”R?êo~H­˜½‡DP>n¯êQ!gÓ.¯™ß×5F%gµÇÉ´¶Š¯’€ûìs²9Ãj«=á<¼†dèdU†H®Þ}æƒ.(^ÊVÒZê ì0‘P
+5BùNkê}ö­ý˜9-.«f@NÔ°Ÿ1 {CŠu[£+ù 4ÌÕàìaÈprEìÚmgÃJÛÙ£¹Îú¬Fui¯|é ¿AŠ¯‘ßÅ”(˜ûÊ¿·;ÙjÓž€uëJû­Ø#@\aö(˜óÏÓà©ë–òx`z^Q±kÛ×è# ëê:³àv³ÖM,9¾ÕÅ»œDÁy¨ƒ‘B)ôª ŽàܾÏK»Ë
+ð×E6*u¤
+ ?,ÅžËQT!ògIf°Ï7’³i[pº@/^|Á»8ìþÅü}<fóû¾|ýðéã×O¿ýúË—?^ÿúæì}ÚõÛ×÷ÿùúåÓ¯ÿ{}óã?|üøûçÿöõýöõwFþ‹m5?\·PiF"-'ƒ½>”zj†‡š(ô
+õRS»5%~‚®F‚mÅz®1ÓnUÅXÒ–ú+ÃŒ¢øfÒ. åÝ1<¾v‚ëQÛ¾·£Ü3‹ŽM¸Ó†w xW×>JІc“¼#± Ö)߬[ñÝ ã7nå(f¡3…£˜[
+!Æ-â<KýÁÉgìq…K@•x覇^áêqM¥ÕðöêƦ‚)a¦ÄU@ë¶d¦õL[.b9ÿt¦ùðlòÙ^Ø$CJ÷öåÄkÐÁ¤ûeGÂ&=
+ŠdI8— ² qš’Ý¥ž¡ÚŠˆ6#l³šÉÍ{„ìÞ¶à¯å!4ßz”è…u­í[©Ã¡Ԯݮʲ¾è.,¿sX5ÞnjŽŸÎCã ²Mõ‡ª©Ä¤èuTç¼LzÀEʘ|øx"_úm§+Öžô—fõRŸCñ¼^
+¥Ž»À4OÕì- y@{úE÷LÇb®—
+ºG¥³uÞ™KÕÒea³|òÍ zæmo¬·=²-šÝ'7TkW½¤ݵÃ1]¡]›\§«™Ö’Ì å­›¥ð¦R¢±¸@£—SŒ,ORÎ1 ó-$ß¼æÕ˜6Ë•UÅ”ù >¢J½µcÎnëÅ%šÚ‘½U¶9>Fº" AAF(úá‘‹¡ ìwËÝ»ŠÇÓEÙϵèÇû¹('¡;Fe=Œ€ MÍSâ w':aµ[×½ïLm‰MÁxF0ýÇ›C¿¢¦l·`élÁ9#ªPp[Mi¼2çUSóu&qtŸ §ä”•YÔ£7ð±p iJû TÎ!¸jZÓð÷ÈÿY/—^;Ž*
+ÿ•3 ‘€z?†à ”BBxve#E‚Ø
+ö ÿžõ­]Ýç†À̉”ÜZ§«»{¯¹`¯kâªý™èT¤©^jÔß/|÷—ôöTA'€åÅŒ©Ï²•]ÇãöÎ]áàÅa·†÷µåyBöëĽYÙ*xú倜nÈ–Ü¥jÍÒD 8P ê:ª~JÛÔÐ}Ãp‘¿´µê=iËN¾šälÔîW ¾¨Øãý­á_#Èf•Ù"X]‹ÜªÚ@´Þ–‹FUÜÂœÉìÊþ+Ä8Íêzå¢à9ŸÕÕ™ú¸g àÆæ9†Nž’’êyg„€Üßxâ^¢@ض’|è8«ˆçÊ-* sõ5Kßí‡æg6eô\!5Ø›yN ãU: ùíuo|BEÁ·ˆØ#2ÛG1ô:u’lË8i)úx·‰ŠÅSð»®±´k–8~Ð÷"\Ž²Ÿ˜DÌpÅì«Quš¯ÞkFbG­3*sÈá7£"T•mYµeÄELƒôºós&'©ŽílÙ ëq;©véî¿kƒþk}ó!ÒËã¼]G¢ ‘©
+Ô¶þºµ~uˆˆ¥Âçh]¡UD¯M”#^ ÅõQ§¬WLØqÌ;æ`&±n¶q+°Dsæç´I !éab (Pñ51Q
+Eíœ'…¡÷ÕòL¼€‘j°¬í§dA
+À,¸
+²À;aŠó+…8ÕUI·&âºu
+iÕ³ÖØIé£þC[Ô ò Ñ ’Oáצ¡¦Ø8e„9äkÖ/žÈsÜÚPp&€-t§¢g¼»_
+OQÄ
+aPcل͸Þ.@ ½
+í¹:6ê „wS%KxŸOmŒÓ¤_E¹™ÃÝö}úµ¢5©ºÂ%†¿Ò+IþÞ:iü
+C,ì
+IŸGŒ‹¼Æú™-¨s,å<5)Ù´ÆÇfL3ÓTR^ƒ »¾ÕXºÖ¸×à²Å8[ʦ'gÊGÐbu¶«Œâ‡Ä°LŠhÇÁÀ;Ú»æãŠl”d^‚°lÉ&À¸Û“>±,± í0{Üé M€I~`*éØ%7×Òpå‹UµÔÔêíÓ¯êlí½±T=.¼†ØKÂ)zñª~/0$ù>|îÌ Ü# ÝÓZ÷SÜ
+` 0^MÛ:'ƒ£›¼¿ec¨Ãg<dÏ$3ÆC;2ó–¤
+õ Ë«²Ñ˜B¹·~Ï´&g—“c™Q‚¯^#:»N“e™sÅ'F9µLÅ ƒNf‡. öÇÍôXAñö’O3+L†…¡Ï Ö R€JɈ÷sJ]Žt¶Nø³¹"†±Î½.îRÁ¥FÝJ¦Ó@1§%³Q]¶˜¹1óHùÎ7{mh0b|–F a‚„X(üÌ.§‡Äw;Ÿ=N¼Zè-Γ I¸z"R}ª*tçu ^˜4Áýpv„€ôŽÚ©ô%1çP'õ¤UÈ’& ¼-Œ|ô\O&Š­|§ ÇPý¼ý\-ž>h!áO@Ú)ÐÒñ¹=¿ Î\F܆~
+Ƶ¥í(¹õ]TQ’,ÊÞ\Ðh*Õô¼åLÅ[`›t¡1KÅeÊõx¬øɸֱŸsÔœÂZ×o¼wÊÞiÜ%¬Œ-Y k0lÃmûžBäjâ"¥V/…Qý6D’ß!Uz ,°ü
+ÅK%D¶Õ¢xŠü#@>âÅmÄ 5Q“Ä ^ )Ž.+V?2ª_;ÂÀ …‘n5£8ôu´Vd5{7P¢á!÷|¦ÍpMÎn¤×
+ÎLxÕõèZpãź¤1¦q…ã€ÜKgóe0ïÀ–fˆçZ¤ÀŠ©¸‰5¼‡ÃÈâ5Õˆ?Ö‰R
+cE-©ò¥Q$¶ßtÏŒ‡—Œyj9jÇ_{\¢µsb–»‰¸¶(øä´J®½\“¥zQÏ¢Ò×*€›î…À8KXÉGmTQd^Ü{Ꭻéõˆ;î–žô­úźÕPPs’­9tUÌcµ›R¥j—9éÅRîÿp]&I¶+ÝJm@fÑ7ã¿ÿþ§:2³ž4ª‚›Ñã8Áëi³iß®©cåÝðCªðQÛo®eÈSšÑ…»}K \Š&7nW9šËé$Ì‘¡B7Š\ßØòMÏ©“ÖrˉiëŽ\Ú·PÈïèG»9 TêÐRáQ=z«îÊb„-ÛÕ¶N&?ºžr(Ïe«'Lúªý[6-r‚§o»MÌ“:Ê 0}5s6%7½dîÒhv‘ð¨[•W¶œãY<¹×ÞÊ# â…Ú¹OG†p~¶uYß“jJgœQ?:Jãb“œKIrÓ±¾hØûQ:{,S¶ìù¯eàwG~•ñ”cn5…ð'È;‰mj†t2”ŽO#’ñ®–'©‚G‹ô;
+€{ ¶Ð|Wì4p•]%7­ª4ì9K¬hÐa¨[gF0O¯5Á3|ò*z¥_£¥>j|ÁAÎRKyFžæM¥<bf‘\SâØ¿ 4­}~ePçÉCµ ~l5ò°
+žö‡kPeã{¦Z™S\áT©§P…·µ—çÎk›èšÚ)`ÀòŠ…åqzªnÞ
+{®»ã“»ÔžÞ@i—Ž>³QNÌŽ`D¨f}R¿É{¾&¥¨Üxä!IªÊ@Êsþ0(µ»³Þ¨C+Íç×QÖ›™Æü¦ã¶ßôE¦´íAªP£îš²Ç»Ý®½cÉ’ß±{…uüÙ,ô‘+–”]©ÿR)jl¤B²Oð€-Ñ–³ÚCYQ’ñÔ6êØçò*éc”èhw=Â]Áåm© ¼=W¢ †=ÕŸŒ~h×°ßæ0n‚f­$`†@ø7·¼cQ–ž(
+Y!¸37ø8¹…oß!h¨3ìYc 9Õʆ¯f¯ïZô‡i‘jMÂ|c ^Ìõ¢€×æûíé}€}‚ѧ‹?âÑÄèºýa!2Ü ½m+(¤?÷¢ÈQ$ ]ïgGâÖ?/[1ÕævÉ*HåÄŸ.“ L5)óö¸ÌÐÓêi³ «üW ~;ðõ¢@¥zJÚâL{Rì±Ë~×,F5}‘=íÛîcRÐœ¦²5 C5á„@›?CÁUÑ¢ñ×rh âoÙ¦c`‰]GQÖ»¢«¹ìQ ç¥3|œ“mØÂjDm„u8L+ºÑ-_5—ìŠÈ»‡ÍÀ°<åî<µ7d4ÍHeg2³wg 5DÄgÓt×Óí>ßÉ!Š}w¥Ë­j¿ÛJ3n¦Nßï!þ‡»V²ýÙô3QKìŠýÖrרHµß³l£<BRLz%>TE*Q¨>@\£âuÓ혋ŠÃL4išAY
+A|ž­™ÂÁ“À”¦±ØAŒ] =A˜‡ Ô)oÕM565ïX‰n®OûÔrw<·
+©Ûmά¡9Ë;d¹r{r¨e{bð,ÎnÒÔÉD’ãê쉿ñ ¼ þæÕR
+P‰š›«„}jœ(ág ¥¸SÑ
+Úª”q:  ©ÿ‡—' .¼É¾DÅö²‹ä”ÍñðKD('ú?êTÒªÖ¯–™h3€V­u0DÄE©×œâ\FIG½ F‚`„§8*„§<¯&J4yzÍ+­Îxð=džg¼à~Í1®D]
+X}Š¸.ûD·H
+÷&£ç#‹Ò›«]ºÇBÆÕßïns€Ê®'¯åVq¤^ES>ÞõŸ³W^?Jü³fþ´î3y„1û³ß,ÏëÎ}þé=W®Zò©â]xÁΕœ­§0â²õIÍÝ7’¶Î}/ÛRñ™pŧq*ãôp´."óÛÔ±/Á‚@Nó¤–PÔs®²ƒKX~î°o ‚=Õé¹Úö†²9d÷á¦-<A®±ååP*"¾~Wíú¯F³‡§ÏS{`Þ-€ýûH¤T8ç T¶œô@jùŠzÌŒž{Ú÷È}¥‡
+5pÓ1g|q¾ÑŒò¥ÑÖŸã8[’^¯Õ€ #LÐG³%ðÔÉù2¸±zÚ‘Nnöžè^›å}fŠ’ÓÞÑ'ÓC<å„ÊÆA‡›qÉæ@§Äï­ÿ.
+-¡s®¤m*(vùΚ"ݹöuX¤4~R#!ꃫjfKÂάÊE8‘ÿétòÓ1J"`B©éh/gõS¿e£Rˆ×¡³åW½ïp„ÓÑêGÿN‚eÔÛÄNQ _ÅÈŠJ8ážD앨‡<^Û™½zôlÚ”Zª¢c¥þCv™ìÚqAôWîR2l¨æÁ^I_`À¶’
+êdr”f¢$9-J7áo"yDùª‘—gfIôZE+©êw‘Ý1Ÿ8y/c*‡¿‰ òÒTè'è~lBrG&o¦:Ð˹A™ §9›´3a^®-Z…Ý.1IÞ­<½—¨3Þ¥î¼PAJ,…HïÕ«:Fi„بÌ>+ZšyJQËŠ"Ñ,ý܉¨Y7GæM
+×ìóô ]¿±Ñã 8«¿}V,a>6«=sé+!ÿÝ„†Yj1÷y7Eäh²ï&‘RœG" ¼îrð˜a/H wf^­¼+1é9#ÚÚhzPÈ -t¦ë &Ž÷12qvþ„HmNçô\Y%3‰šˆ]éû´HWmáy¬ÑÚu gqÇRÇÝ÷=àéâ„
+œtQIB cŸt&G))¶¶D•qãé}A¯Ø*m†—Z"lbê ›GÆÖJ»ùÎSF)þÝÕï”9„ 91U—Û’6aú ¸yª«Û¤mo‘f‰+/À¦žø½Uçe\2¡h'ùK b£É*Æ”9=.C»ÑØLÆø¨×Pr*Myi¸t7~¢3Òt$˜Ñ¶ºiTe•jsIåºLa«ÐƒÆR’y<aÃ[ÌSýæ¡üg
+c„ÇN0¬¡ªnüèYl¢Âñ—noó„χ¡ÒìEÚ^=UÌ]P``a I6'Y{E·‡ó”º…IÀ„jí=I;ÓSÄ) ©ÄUŸ5cqBÂB±ú +ªzÇNxi›ÝÉ}f‡]Zð½ªvµp8ª¾YÛñXÚË\œÑpÁk8|Fš¡,b
+MÁípí;e#2;r Ôw1§ª«Oƨt5¦G)nZ¿w’r—ôà6§~£šA•;ÖmÖ9‡êä)1Þ0@r^Nˆ ÈÏиQu¶™J¼­œ-à[öa.W=”¤žV:mJ0ûzL„Ý€‚iÅC­Ã“œš¸•k’êñ™4fŽ yB­'°>û *Ô6aµ§…Yµ‹r3ãw”7•â’õ›lÊ7^¥¿©÷»)©‹Ž›«É5V“â!ß‘9¤ãh°©á„
+ì” ]*0!9`KC`cßx¢\: T¨qÌ”V³BSÄ䮾J Ìüt ÕôÂSh+¸dé©JÞ1‚ þ„o‡Eþòoþø—¼>èO]³îSEʨkƒþÓkûÐ)H‡LX×?Ô Û̯Ÿ?2KãO¾~þÃ(·¨zÓ‹jmâJUU”i4ÒE
+ˆSL¶²qµ¨ŽÄß«IVXyÓÊÄÛ.£· §*\ò{@aa§<ÚÎJš€<€‘ºç; o‰5ÕšŒÀ«Æ6' ±ÎyøwÖs¸r­…€Ùñ^‹1>j¢çl.ÎZÚš~“¿‘´úý:L;À$•b­®\“2×È­÷éšãgôŽDJwù§¥”¾.Úå¡KjEã•‚|¸ÉÞBů“8ŠI> qb9ÏÙyöoç¨Ã×xg)—T§ºkê¬÷BxÇJ¨¢ÇŽþÙŸ."d‡5©OàØfUÓÕ>­ùz§]¬îÞåx¾ãÒQ¬MŒßi/K´ãxÇ
+?s$~Õ¥¡Ð×#XD_†N¿ávvvº·W²K¶í0buJJËDµ¥¸x|ìzÄã¸jDéÝM©Ks.ËêĘ-اœ9tžT  ¸FÆ|Ø$+¤³©”÷y¥W—ïÈÐ/¨3_á äãû•‘磅 ÔÖ%¤©$Ûõ4iÁѱž‚ŠMôv­k:H{OVQÒ©Û+mÖòÒeèCNœŽííôÈ~2C&tÓ¥”‰7ó£éªE>lšf´-õ²"o Ì\"ЦÝÁªZzŸ¶[‰«v÷È€¶ÇmÓ ëœ?§×½¿iŸÃ¯NcÚñ¥FÏ̸PT¨lPÌMlÀ[r2ÂLUq¯ó]´L^­;“ãååt1Õ†ßÿØ>@üáÇ/_?|þôõóo¿~üòÇëï
+}÷7bSS«ß¿~ø××/ŸýÏ뻟~úñÓ§ßùço_?òì÷¯¿êÉèãá‡ÓÞ96¦OV3¡‚]¦$‚hŸ6yÀÅ´tºý0/*¦K‘ "+z®1mÔxBùâ°¬ ê† ð±R†á°¡tp舴…ýp"ÏcÊ'g·]†­>£k˜®œ:/ª ÷Ú R°*ØìÌaèþÑmHæ‘´Þõ †ó—èäVYW­=ùDfõ’ÿg"M ä5¾<òšÁjÀΘ3¾XÕÎÄ¡#ÒSÕ€(9)$Úc’·3K;_xÝl¢WáU ív‹›¦Ö†éíñ£í&Á·”‹Ÿ*… aw&2å77Ã4ðýNùëÒ{noÓf4VGiAVÜ“ŽTNná"¼±†ò:·>¾µÑÁM<ç‘NQû&ÎS–MÓçínUKÀ¤»>´Çº žÕïfjÙñÄmZ6•Öþz•TøÀ1Î×Q‡¥:™˜ývM&§¶èSxSåµ#š«>ùZp¡[ç]”doÇc
+$¢wd§nîÖÇZ­¸°š2@ÒqîLÁ®¾D0´°ÀhñïPã9B¯ÔKÖ3KäãY;QÖêtOOh#³ÀVó“ÅâÞ8ë~ìBFݘ™îÎsÐT'é’+ïLF¨õ؈œ³iÜMÇ’e£ªìÁð·1âŸòþä@¯J+«-òc¶w4ù/ëe’d;¬[Á­Ôì{rìýïÉ™‡Ò}?ÂSª€+R"œÆ$—Oç#»é{dTä
+Ô¢üøÓ¨¸/q—½¢ë÷T½†~˜M°úbz`~¶ïÍÑý©ž£Þůø5#‰s^1n­a÷!èÆAUÚóoCϪÙ Ô>Ô1y®<»<Æu%$XÕ“è7ŽÊÿV~‹?òÄ|fö˜õý£÷õéQ¯†åú)í¬ÍrJ„„°€L«¯f¡Ê õ˜gÖ \É]s‡ÅaXô3&&# "øzš 3VÇšˆÒqÕ¨í·j ¯¾¿J€&Â5”"¸mâ¹ûô³BµmêÛ®‹v
+ 9Þ©`ðªZ5„ò¹
+’L42îY椲 i 7Fë¬_/Ž:òCӲϽÈ£{IF•m¦|þ+ûõH_:0½ÕžÛ$ÉÜ3òÏ3_5ö5r» 1ãm‹GUÂÈ*H¡W.¿0òåÔ7{*7$£3ïgÝ ´V»]¼/¬oK™=÷±-”š¸°é#š+ã[ý·07D6êÜLz8™T•L/Dþ+Æa±Inœ—9ç…
+9¶|Ò¿EaRù8ÉLƒ×rÏÈ¡D±R¶F@ƮϹßÄkž0©ÿrô"úÐE\¿˜òKÈ|g¿«~É)ln›ìaï|eÚïÿhìÿWO%ú¶söme<b¢MoIX§ßUëqX`l˜z
++Ýß9ñ«‹ùì3íÿ¾ka­Î¥ ­£E§ÓÊÚÝß>$·xwKï4Ÿi‡É±þ¹Yäé³]óô½Û·fÖùŸKÖC‘¾mWãöO÷±m]6Ýu¨t‹üEJtP¨‰Ç\}Tª S;ÂGw@XR+Žn+Vy¤¢í¸g_ËX^N1·‹¯†¿WžYO>¾èU-?_Fî´'Û<:Vã3Ü‚®VQkžæG]Õâ3#,ÀW«œ)øïÓÀ¤7¢¹…nZe1SÇü6•©ÓÞ8¯mšZ „t8/-t e0ç*Ì|
+Ù §]©ý.PATí§V¿4ǘ™‰Äæ,Ðpë䙩žDYWþÝxÛñ)º·’h§û¥¥CÿìýAw|ËÊÞ.ãóköƺ¹ê™á0ýi¾ü™ª¬¢Ùôï¿xÛ_WO·ök”N©ËAGE
+µ$§:7–bÛ람‡xsîg|kè,sM;7tž\ ñà}Oˆ?…ÍDÅ4)²æ8Q+¼74 PÄì©»+óžã(ùnŽ5”/½ÝÁѬ8äT`á>˜µŸw¤ÉA 抜ÒTQ=1»ãG‡âïÎQÖ¨ZØÞ¬ýgü
+r$šbõ ˆ¿Ä;ÜGSòKbb⊜È15~ßÙ/ô\Ïô!°AÛiBK©“ÄúC©öµ»ä†@b.:]4šû®Š"!Lϧޡ
+uä&>ôA\bš Læ%ø—£üú-:ô¥ð£þ~ý£…¶dS•ä)0©8ÖÊÐhaTl 
+¿erz©ý*º¡5ýªŒñÄiòÆï?©Ë}ÝNa¦fµé><Šd˜JiRµÙØÁg¦$¡PåßÆ™ØQBuBÊ\‰X¸$rš[ö²ò$k©¦Š,oÁ}ç4¬2Èz¬Ê…ÖØçš]
+¶+P ÝÏ¡š—UÁ p„NÈžlz©÷|EéÜ5gÖ¶ Iˆš`M¤–×™c´«G‚Ì [ÅZ› ƒH=‘=ÑD¹+ü:Û`^:-ħ³^µlÖdL‘\dºØYË]äQŸgX†'öÓÞQ‘>ÂФ¬—S™$PãˆØEÉœ)ž#UB!‚;F Ôbݨc7x …D6'¿·üÞÊz¦¹OöÖs˜lуŸ ·bodÔrf*ßt£sôò©Ö6èuŒrfÚ^”'G¤=¥³{H+ój¾ÍÈöá•mÕ$Å‚a™5|U5±"å)uÏK«ýfbT½ôn~B‡Û{‚®VóaÑD V ͵ºN))÷iQ}gÞ.¹þ*sçú›ŽÁƒ”ulu´"~Ö×-Ç^ΊJŠäèBÈG¨³8·Äý¨ÍRÕå¥ÎP/±ˆRžŠ²¤„Ëf®Ó¬AuˆšhÝÕ㬌@ËÕ
+lÁS.’LHl^d’Æ ¶7B®ý™J‘.ž‰Ò
+Œ\„§^GŒX÷
+™sÝ2¥óE#dÀ]yŽ¨jÜ5u„ÌÓ~ERR©P\“Ï8=sæo¹ÐŠüPWïÑÓê¾}ÞÒQÅ)¦Ö¸•Ì@ÂuœŸúZ™%tƒ(¯*éçé…fb
+ŽÎ¦£µŸ"*ˆrfÞ=Uîú*bË[Õ«…5ÿ”YÑ?:¿"|*¾ÓGá1¹?”òì)WKWgm°Ì+ÔòHdÔ‹çjùko-3y5n7(Í‘‹Ï·Ô³‘Ñ%ת‡InÌD–KY×p”˜x×@tT"çD ÀvÂ1ÏQSDÜpóŽ ¯Hh:¡²7?ÖÍN*"3©( RE;eSo-ð=ÒB#ª½lË£ÜfÔçÍ){V.¯»†™Ú3¤?`ž´ƒÞ’›çaKê§%7­SêðAò|yÜCÙÇÉ­Á³*~2ŽE“¤ì‡P^yĪÆkdVîÕ3€Ý¯=÷àɕˇ<hµûDRhT²Ð\³"Eê·)!%{³„ûnó™yÍ3ågŠÇÉd6#µã›˜‰ˆ‰§HZ¹C0Ž³Q¬§IC @øgœ7Ó#W-•Œ¨Üèëôç¨ã.ääÈÖÑ`A![®Ä[JRíÎížq¸*wAqµÒ¦ÉüŸÉÕ‚4‚0û>¥¤¥RH(yéBÖСæëVF 3\RZ~"hÊ:zÐã" ìL)ìúÌÜ®8¡sµ©±k͈Î<êOIPBu±û¡![ó(#Äÿ,¥´°[ô»JÒžL¯/‚ÎõÕ·ó®vj#ÈräÁC±±rG@WoNŒG3!08£ÿL3€:„ÊÇ•3®$²†i[kQ#v½ß5Æ!ÅŽçYŽ÷¨¦ +õÓgˆX꺩ç]Ç´jýË,6¯è4ž£’‰~k¶×qÇ]Y4ušÓ+RP0gâ *S6VŠî—Pê6¼Oºª„+""#©^VD1x<YÓ9 +Qµèo:[“Ÿx/B”Ùº8k¾Ùð û#Wi AÞÓêl¤µ‘& Êù мÒÆÛé`)¶U»9l’$ÍÒ‡A3‘ÖHFiÒ¦­Ÿ¤Óó€5nde)¤dwµu ò’Â4í1G®Gk¡24Ýãbq3Sª(7TÆ3ó2]s 39ÈHઔ ®G4»_ëJ¿xsWGÖqÒ:Ž°ÒÃ4«“iÉ« ?¦ƒ/1O~‰XŽNm`Ýܧ©+'&â7©ŽöÙbó«)¤$›´‰ÔÍ^Ii¥,ÜOºÖŠ¬—#E2Ddß*)Yš{EtD&¶ÙŽæ#édöX^©afáÅ@ˆYòùuhF?kX÷å¶ýd–@u?šãèˆñσêN=hô·ý”J?/VQ?zbuŒõôÌ2ÐË:žC’>¢ˆd\˜i ï™iN‚â…ä„df ÉÎ.DµÑrÌ“z¤¸†`ì«gTÔH`"Žw×ÎÄænÏÛÜŠ¡¨×5”.MÝ$ð”ô¹â‹ßÈíÊ¢—þù8 Œ嶹çADî2·ž|P:•ÏT"ÿUy™Œ?ù·ˆfSôN™“ÿ2zašP¨\é´¨ËãDªôíÈÜãÍ€®èó%ÿ!N
+ 5ª §©j 5@Ôdöo<¹çaðÑlÖ«~6¢àHJå<…q>%ÚO'¹ëõK~)°l9Õãå%Du~½_(g‚ìÞ3üA«âˆo<;‰¯¨UÆô0­/„~œ´¢±˜8#1ó,å-…VÄ`^ .ÅïH¤\gH=nM¯K[9Ëmnkͼ’î¼i+‡˜nž£,?¾Ûã*¹‘gåEVß—UÝG-©ÊˆwWrêjw„?¬Iˆÿ[¨&xA‰ý¬^Eþ©y=§cD3Ûs†¥–ädÅò’’u•d€*k_-#³Á+åtT³t#«Í“•÷çgPÍãæÛSO - ÈÞ(e—ÿ0]FY¶¥ Q/
+êü'ÖÙAo½ÏJÉõ$„_ Me·ôìás^AƸ‘îKçv«ž$1j[ ·ˆ–Ÿ¸MFzD[íéLOŒ¹#¿ˆ´‚ô0ç”xç³Åj"åéad]ÿ˜8lÀ—‰l¸\K¯*ƒ÷{q¤¦Ã>y+Ÿé³éÉu]ö= éW=5°_uõïARùÐsJ+Îà ßK.1ÞÁiëÒA9Ñ°•EN¾âÃ,nïÒ]g4EKÉÆì•LmŸÍΣA<¸6UÀ+3þ^d?ÔÏÞ›Ùp®Ñ$»ˆù­H1ðЮ²Ð^³xf[H˜ÜÀþj•6]R+±ŸÉãÃY`í9ÍÊv ‘TGÕîÔJ_±ÛKm§Ef¡‰‚´zÖ¹ÄÙ´&ÎîÇgP¹£s~uC»"/@ÓªûkžOòEy ge®–ÕÞq]£–÷‘*µZŒ4²jœjëDgôS­»XíJ¾nözøn\8 £1ê’A¢g Ñs²Ä”}¹Gkì þ)lŸ‘ÆÈrÚZéÔÚÁ·’¥þÕ+Ç©oØiEµ¦òõ±”®ª¤½w¸O·)Ñ[qRæòj<é¡7¿=Ê®”Ä] …v†àåb!j¹bÕÖÎTg é‹¼{ªPµ¬çh“,Ö '‹þçŒ:oá„k[|È°ÙN ói‡æo%å¬y0[k鸥TwúƘð1<í‡Êƺs ŠûFÍÊß©õFèÄúƒdb,@Æ—FVÄErþE–=5ÞŽúµ.xWJBêÊÌ75j =C\¡?ñ[»Jî%BDüñ¾Í« `‰<èó~e/èRhu&×Y¿@íw•2ñ´ÎåÊB¬qÜ£n<7¢|&,ž‘¾Õ‡n+”Yþ@ð5ºÏ”URµú(&mìL×ÊçÙ/N–wÒ:¹¾S‚"¯uÉ,t,½Q1‡Ï¶K¢G³_ Ö»;\^ç
+ÂæüÍfÐÇ+¥„éØK±ºÁ,uÙi¸%!+Ïÿ
+H‰dWÍÎe5|‚y‡» sIÇqfVÐý ‘Ø¡Ö'zH­fÁÛOU9ç|߀­ÛÕvNâŸry>,ÆÓ×ì3{Ž1/ÿøçOg¶h{§Ìb¯<fYц·gš•Ý4wÙeÏBŸ*OÏ)déòü™Þ½=Óq‰îëÙcôǯB'÷~ô¹øg-û£Ç„C⢽ãëÑW<­ãžº À±­ cÊÊVýÝ› øÖ.‹…—_3?è4:¶ç˜w+À=…ôv;Θ°cT7£Úÿœ¸Øô§Gß@xbâ ;ïè³Äï>a~þÜ{Oœ¿žwÞ‘ÕÂ/öD‚ÆÊ7v˯Ølœ9pèBÊ‚wˆöî«<‰*Ö@ÍŽ·]v½µB¦ÅÒæŠÛ3œa%ÚmÉn-{cG$™ZÅL–'2 C xž1|‰+q‘8‹qɉ’CÌoDž5y^v©gR¯çTouÒz\ž7Šâ2E¹k ßt^‡×N”›Å|E*¶¨ùÜoÍìÙ’Bî|³n‡Cv%å H: ojyn¶"øJœæÊøŠë•@göY(ûŽ
+j Ù·!¢èÏýl>öíf!´Ç±›}•E[Bª„Ø©ƒô§¥¯B“…ƒœdw]Öc¾xGT}ŸdªY¢¾;U¿‡ì<ÏeÇâÃ×Æ}+IÞ¯ÊÛÕ«LÜp“Õ@ß Ák ±å·pÜíØcUÊQFSvmxµÀBºÃŽæué¦<ñpUŸh—©ÎžÈ¸ã„èu•§Å ŸÞç…“Àécà:ú^CC°¼£€ùƒÈfU16iW‹°z¡‰Ž(»> ÙMoD7n/`¼q´Å )«>ùƒ'í…ôVÈZY”r¶ÆÒñÁžuuJOfÍqæëg@Çáy^‰ôµ5„;ÁKI>ƒ×
+SwÔYë÷eñ¤]èœCvM„A¤éùÈ!d^ŽÅ4
+¤fl.ÎÚè<×+™4¯5Øu–A'§¼P­çܯ(Z*XH8*vVõ#À5‚Vgoiìøš]ì ø>æs®É/ìÃS
+bU”
+Ç`Œ hAbÖè…¿{Y>~ü“WB¼1œ¨ ¼¿ÒuDk:(Ϩz€tÑfPgÎQOŽÁëïõ@ÔíÒ
+È‹)uI@="zwš£ UÊbW©29Q½]¤€)JèöÙ󮜃f$!½"ñDd‰èˆ°õ.Ï ¹]©­
+¸©Ý&õ¢„¦p½W¬¢OYoÁ¦S**Í¥›Äv›…PÈ_ž.Ê *e=/ɳ(;…h7á7)˪jP"<7Ëk"hÃäÉìp»] ÙœEõN0J­"àí08¢ìÀëàé ‰Á«|½n?D•þ^](`€–:—y‘°.?ȵa£Ð)G¹9ÿâ9ZØ9|ä-Ô;ƒ†Üpï&Áj`jîë\V¿Ö­~¾$qN‹XTagGàâ™IÒb1ï3.ª)±!1&³z@0w\“ô•µéÜWÍ2mŸAÝÕ0£€²¸wòðK‚h]«n6cÔ·K$âÛcjßÂ\èší˜
+gViA—]fu…MéIÕdD»[÷bÇS÷nn,ª±ú$íXÀ5EÎ'Á$ãfæ¡ÅoC–0áš]ò¨ֻ¹SÛÛ¬@Á"ÚI‰rå»<A*•ò4
+Î(•k»¯3ÚýT”Ö%¯Ý®N:ƒŒ)Uá°¯ÍÖ£8aæXý”m¶ºþÑ¡¨iÉqÚ¤Ù-C,Û) 8 cFUD­]§7ÔÄíyÎC½5É<³ÍêAHŽöÍzÛz”ä‘ÛPñ•<¢êÌØuSáHÖµb£4e ÞT)™£d}a\ÃÈäÒòw5úräï7ß~úüþãËç¿ÿöáÓŸúâ_ƒÛ"
+âËÇ7?|þôñ·__|÷Ý·//üúýïŸ?ÐöËÇ×°üþ—ø}‰“ÁrÅ7&P)^ ¨5z:5rªø¬‰&O«ØØ^Vú«‘…„L~Ê«<¥ž‰Ø̼Ŏ£ÑN™-}“JÔÂ!Õ§lR¢ËÕ’
+¼ív5ÿiÔb—Ô=¡zÅ°¼$(BósŒ;jWm‚œüæØ››Ò±üZÑzU8Ñ1[ÔÝ–Ôï*æŠ_üæÿ{¶ÃDÁ+%± f§¦6£'ªûcÚßˤFÙYºQ”êÕÚ·G¼"}³»üÚîäÇM‰ËÀw
+ n­èç¾O61†*è6¯ý(ضP#e§¤˜'½®$Ñ‘«Êå· ÅbPjcHËú¢™Ñä®GbCd%ùê‘èë s¤æ˜š™\Òòf¹ÿ±^&W$7 uE&ľœeŠü÷Aø #«çéªSw!c' €Yþ²fµä°5U3+œú>Ð÷ϸrй~‘³Xª»%²VúžO!I‘š2’åÀÛiöÊCÀ$Öé79¼¡ør²‹ ¶ëaÕfðvÔ¿»á›Ö–ÔÜ%Žy×Ä"j¦û¡è¾,Ï"â=iE{RÐÆeï ¥ÐsPPӨܵ*ôâà
+©fÚ‚©}L%ðÔ˜8)€=cØ:D•lÄ…ì/Ñ1ùñþ#û#Õç´ >²åB´7L´‹(.n©œ²ë5å× Ç鳊hçÑ?bx¥0a{ˆ÷”P‘à¿aò6JÊc«Q. ŽÛi$
+fþù¤†ý:(ú•°]jŠwïÈÄê©Ü´Ñ¾Z«½k
+}­@]½BÂYzL0Ñ9)êÅľ™š 19Y·ÅZ‘³ ô%1Ù¶Óàò>Súcs&Ãmï$)Q'ÇRÊ‹3$ö~YÉûšP" KÜã°ÇþƒÊCÂYpÂiÌ' ë
+Jýª¥ý¨(5ȘinÊS:ÐHv‘–Ãüڳ﵃ Øú…dÌ EsY#
+dwÿV‚Wÿ>îAn¾!è]Êö?óDe#¯H™F¤Xí·£ûG…^퇶VÞ­%?Îk`¤âäÃÁ6ûŽ
+ª”tzÙZäìùÌתÒÒ|m(gu&gæP7÷xí)}~¹½šÎµ¡êAêTØcÌ;©P»(VDK@GI}E»`os链¹We¹ÕÑüÎypDŒP%—‘¡@½˜‚-³ª ,óàÊóéÓP0d»ýxz‘“3y7Ì¥3ƒ”ŽAÓ´”–?ÐûÆ¥И!ðäØHøæBEgO®ÄVV’z”¡¤9gòöh%èàvÃÊ´ŒzAq–jhÿ&úU –Ëá®Ñ~)ê‰@ö@ªé$n²7wRÈ»Q q<Ô{~L\¥~Ìé»nLÕ¯ŒTú¼œ£Ëuréi¥}¢c>Q9cfL„N{uP\9ˆ¬wVØ¥¯ñi…H:~3·;,ZŒ³‘>Y³²z‹=]
+1s¾ï¤´~Õ  1¶š!o.ÖµB2êQÔ¤Nÿ%î½.ŒYÖ±árטOŠAÕÁõ@g ;$‰¢'’­à p‚7ï®êK dK!ê:ÃbG xhϤT-¸î¢Ö1
+ë7Ë[±ÜËHÒù¿3–§KŠè¶±tU\>Óîêl–uÊwÝ´T;膗„ÈÔ4#}hÒšVÈø
+ô¸ •p´EFZ‹™®`¯^9È/* êqù¹S­4@µ¿™%jZ¦dF”šÂà{ª#Y‹g€
+µ?Ý`lO(X-VÚÇÍæÛrNš@çºÒC`šðŽ ¹¦“§ú&njb –D“õ7—ÓaJ/±VG¡ ´W^;Üh­#.i£åšu*2ᘙ&æüf0yOz ):3Ïš…©" tÛHÎ%In¬ì.…žêè/„.‘1âîÅ3)Õ7³Wrt2Aˆ¬ù2²ú=ÛÚ1f¾ÞU4'/Ió'ÏÛǤ1g›
+W&§½Ê#nsu§Íµ •P;wÜb<••Uê ¾n¸2;`½Êä! QŦ»í³1ý|šÐuRUÝã,¼lW "B•¾‰_Øpÿœ`´@"”ÿÓü_ÛøÜmNéˆrtsaôô·ç!„„ˆŸŽÂ;‚‘nd=£¤WºiDA®»…=5[AæýiT³=)eÝBÉZÏbó‚Wx;¬KÝœmÉÃô(#´÷]áøêFïÆv÷ç’ sÔ‘xí6ßÚkfÜ­g¤^åTL
+ùÛÛ]9 ‹Êt÷{]lÀ†W)~}€ýEL¼iú…†>1Î9~ñù#fÊÜ@>³qoÊõ¥ˆ¨&!Ã4÷Æ1 ±ºD1g®ìNöµÜµTjà¨Z‰O¡X ƒsÒB}ã6DooÞÿ wü™h+*.›÷A#(°Y$¥ù!ájuþŒ»ø3ϔ⌿¿ Ìš_DŒú¶6eBÝ>XO_§[œ‚]¹8½–3…¥€Ú`ƒä0‘c  a:î?ì±ÐÎg¡gå¸í\²Mˆl¹s¦‘˜©lÙ<
+(œ­¿c¬(6YÕëÆuL¥‰£¥ajª·V[ãMf—–uÇ%ŽÙê8_ò¨ .T¡³ÔÌvˆZ€9_À==æõ¯”µ|¹˜¡r+³9žBn¼n÷£2Åb"± ¿sáJ±î!ZVF¨õ )½YÛ’_½ÂN VüÑ•ˆov”ÎC§d6²u#kÑèñ63ãhtÞ¨EûÏ3ÆIñ „ÿ(&ª×;F˾ՙVK¼½‹ÙÀÀ@°ö\''ÊŠfõys·2XAäȶ C½>*»•«fJ½@£»Ù‚èÌÕ‡U®1¿ºsË> °Ë¼úh ¶ð°^‚ß™idöU¿™VyÐ5j\ªã©Aœ›ÿX뼇åh¦Ò&sª "Y†rPHMï÷øãCâšjrµ9ÿe½\Zí:® üWöÐ „ôû1L”<„@ˆf!+`ˆ}…# üïS_­ÞçÈ(™ƒÑ©ÛÝ»{=jUymªÈ©ÐI«V¾‘ HX湎 ƒõ,(Q‹ñ¹Â+±Qn²›2­Ed§7
+`"
+n1wÆ-%Æš™ŽŽè(ø‘!sƲèh€ÝâðáÙéÝê—§32Étf¾¾ÒYo~E÷ÛüJýŸsòõû?¾¾þûúæßþíݧO~úñåÛÿ¼üýÃÇï>}øîEâ”ÿ½î¯ï¾ÿñåÍëÇŸ_^ÿõòçï¾ÿô—Ÿ^?üÅw÷õÍo®·ÿÔ¿>óœÏ>ëOþ¿sÒ”FÕ†èX-«Š’ÔVÒX_«ðǶ›æõõöv¥+óGý÷ögèo ¾šÄFèÎÌ]UêV´Wr¬Bè÷nHÿ>¡ªöé\-¼‹jkÐhÒ/än6Û‰Ò
+2T,ª
+œª;ØgRˆ‹m`×Ö%ê¢5mkÊÎ’m6Ù6
+GhÔã&4–AFq«áØ|9 :’¾Û2M&Š†oô%WLµ~Ï[­(gÉòˆ“«»Ú–§¯³W(Î(Á°È&Ñ”Õdl뤰Y”‰‡P¥³kwãÜ¢sGŠI"P§uÞn)&EÿÝ?Ûñ€`•*Ö[÷¢B0
+,Ç—úØŒ”Ü[ø@©@çUJa@s÷7Ï¥µbÛÀìÔX•°¬`XÞž†”³~_XyVÃi¦UdµÓÁd0é$¨¸A#:å3¼nuåA>Zqhd ÈÃi]º½>;Ý;€|î(°b»¼mgÎÈæè­Åþ¹#7š:óÞd]HVãh¦¨¬$±–üèü–Ò“d(ñ0y¹TC˜VÚEŽf{”&šK•¢»ÔGqCÜÂ"e€ÒJ¬Ú5 ‘ ?cJ !×zlÚ±ÇòŠ“]v
+@] VºHº½S쵄œJ©ìÇÎNóÍ8t†½¿`Û
+’ê‘žc¦tI9Ñe÷›ªz«ÉRvIU6éÂô  ¹½[Ý{×|ì!î#§t–‰‘«Ä‘éˆÄ?&}[ïæÐà î1TVˆM?:úw~ိp æX§²ë_îS…ÏçÉN½bš¡n•×"³bgÕfÌ„¬²,Ç^®©¡âyå|L]KUz|Jk …_IV¶5§›ù}dÞM—'ä¬ùº™Rä[ÀJjnÃ1úm{vnhïbP Ì¢‘|¶
+‹¢ØÑílƒÃnêêØP
+S`¬‰OëgSÌ
+ߌ®ª[kXŒèå< S· 0JH^*7[Mýƒ¿ ÖØÓX‰&+‡S ¶íUd¡ñÄëúJ ¾?*<Ym2ñ—Æd®
+©l•…¢Àd︊çåîÜ
+v>Øvš5ZêbÖ Z²«kXàü(úÞ…{!j6‹ÊMG¶ÑÀ’RÁ1êòÒ‡bN#¢„Ôå
+œí¡í5Ý<@¨väL .P Î’loÖF<°jWÛ$ç ï6o›¤‰mmkXþ]»ž]5N)wéSàñ°š¨¨$€!:.šÔ3òO«¾ÁgJIýÌÈjbªqCQ}G …%ï'àq§o•úÄ’¦Õ“>Ò¶Wþ¡ÓTã ½˜mÏ(¬áƒa(4+ Ig¤Ž2žž%dl–gkšB½ÄªÀ$Ì2÷:ÛF±Êy(q¶r²¼ËmØB\»¨Äi ç9K|^¾…ôf
+å!s]¬-œA¤¼¯R¤Eª>ºUxX5%‚ÄSšÉCû¦F»¦þ^´‰9^J÷Ϲò/ç8&,I0[M³°¬¡cg =àóý-qö 1†.´móªÒuØã ®°~ÅŒ¨U8,‡K>9¹ß±‡x®:˜Z˜]µð²+Ù»n¬÷¨ÓRÎÙjÄlA{—¢è¨2Ø-×4.;ò Õ¡$`•pTЫ¨kª›4G`Ù`'”ÎSÓ¸è¤E¤ßúîECK ¨±Ø—êÈ5Ô•{ùw‚ÄÌ#5§ºI™;ìf,ÄÇ@b‰jw[n­…BPubÈšµƒ›Oƒ#·Õ¥†
+QÀQ
+ÌÝ:Š»\_̇R1¨èåh‚Šäg„?¤=b¾
+(elâ³ti
+@5YöŽ¡»Ô;+&ÓoªYŒ [ÿïKìáš×+ÏÈëÄ‘;E÷“bÿQjäêª"8…_InTé j§õ]¶‹eÝ+»cH“ ÁøÕ\æƒ8¿_Iq6
+;¡˜šÏ”Úɳ6eÁƒ¶Fן¸†|¦š¸)Äõœ+¨º¯îséœ
+´ nto¯sùƒ¤!“Ü>Û2~{ßÔ+S§©_F³a{ãs¬Ì×Èw+Å7™Ò@î
+Pèt‘ñoͪüà;€ÏÀ¾îhÕˆý½AAªss¥sæ ®«‰§ïÔ2åà¿V(aë~O9úæÂA`Œ‚‡¾™j^‚È|“"4 Î;‰‚9çó—1w¬ømpøbƒ£çÀëk.gX’Fînìl¤õÊÉŠÔ¾ rõ°¥ÖŽÔ(næàs«c¶ÎoPñ¸Q¹J[ü„
+¿ó}9¶>Æuo#9 '
+]iÓû4ë¼RÌw,Ùñi-&D€CÜêiÕz¾mÑ2£¹ª¢ÖlµË-wm½§êܪ±ÕîŒ×%GYígáuÔ÷PVœ‘] åvA
+Sˆ ëê:ÅPSB)ýqì‘úq½¦Eb?KÕX\²HonkæT=LU-Ì6ŠÆ¾¤f°'¸UëÞ¦»&Í=L€õ Ç…À_‰é±ú¹+FSŽº;œÀZ;©– $ˆ¦µæÚøQâö ?r>³Kä¯ëR«f ¯_sÐ0½*Òyù÷V¸ º¡²ï†VB`Sƒž
+ñSêÂy™PÊy5åP¯˜¥ëþõx€ëä2Ô+Î’Uý±‰wFó–v3ƒ?ÀÍ"þÄQý^uÒã!|5–çÏéˈϨ×âI¯1ìfqƒØd¼Ë³èá»í˜t ŽÈK#aYëëãÀcÁ .ç´ƒ_FìUKRÎu‘güäùãwC½ìkÓ>P
+Ý[Çô(YÑí‡ÄÇ:—0jìHÓ+jmD®J½]/± éÔTm“„(f
+ñø¬O¡Ë6DȘ{ bk{¹ÇòöŪ÷4ëšÂ‘‰ò$ð7ºÔMßÍñ Q»¦þóŒ¿,êTª6ž—!y+ò­ïy"+z†2¥£¸’£«¾n”¹¦Õc^Ç# âG õ€ÙHb#Õ%£,bCĬäò8€Y@. 3d§Û-’¶ó(kß^K¸Þ Ü.¥g*Óøiäòÿé _W!ýíøë_óówýÍTo4#ŤÑÑ~
+äÿºÐ?¶æ€ÊT´«ù£hýãÙ¥ß#Wþüãß–—rwu$W…þ ê8ÐOfRæXÏu j ©ÀßH¾q¢ì¶Ñê1ïÉ/(šJ,yÍÑð4!üºÊkb‚6ÙTËçf!aë{÷ôÎÚ16éã*+¡íÌdˆî룪b1"ä6F} éQ²då1¦‰®D’>@âÕjEÈÎÜJ}*Ó]<Ä“É_T5Ÿ‰ç×íŽjè‹EWQžËVK¤ 1‡uµ:^êìEw•S"Ö< ÃÜBï½] ‘NA°×Ùïx]7c·K/œ>vû*¶LÖ©™Ü:HrÙ¼lKM°éüÚœ±Æ·0[ÉVd¬JÝTº6W©»EŒª‚¥d•isO3ä“[µ¥âGF›:z}-ÓÒŸÔ®“_"vÓ5 IȈ6Œ˜-Œ˜½:]ò^h”Ù#tœ«ïûDß é{ÞOR‡
+  b‚<ÈîS_5Ïhš€û—H>ºë“õ4UÓr&š&CdÍ›œ[Ý"/;Òÿ¸ßm9õ¢™™ª2-GMX¼ ÐClüþªï‰ÐD ;KÀ°w êö´äB<bÜÂB&Nï Žœv*¯ûÕ4¹‰vnû±ÓkÒøvüº)¶xx|°Š-U:m&Nà¯MèXŒHXk¨;A1ÑÂcÐ2*p·ðýZvšS=ŒJõ »Õî:;ȶ;Ì-°Ñ"R´î,LzÕp'¬û8 Ìû9¹¥1›ƒSº¼IžÕÚJ„}ó1±µœuž¦é]¥)K¹Ú¶iÝc’^Nš’èv}àAØÐŒCÔÕ}øã5#Ò.¨»*ÿBG"öØeèÞßb
+ð|«—Ö^¬Zœ t\½Èy;í±&êÊÉägŽ Òg7=.òârAJÿ:£ì•O«z>—•5!åuÅxܺÑ-Æv%xóé’+•d¯¸€<§0
+Ý'÷éúY5¹îQNÀš1;Þgž· ,L2åÖ…\úJ@ÓH‘‘zM¼Ë X*SW™+›L¦o8bæ—nö‘$›Éçd1ØY× \/ÒêÅþ®Ñ°jøõÙö‘®/¿¦M¬?›üÆA~¼–õÇ_>ùíÓÇ/Ÿþüã÷ÏÿyûIÐwo„¹qÚ÷o?þóËçOüëí»_ýåãÇ¿þý?¿üÎØïßþ¦‘?ëŸ ëo×MpEQõN2»6©L‡AÓ§
+(›VHN)‡ÚÊÈZáÝŸqiYÙ"¡?ö¢Ð86ròDû8;^DÆâóèÓë
+6¯¬Žl¢ M$·"ŸZ¡wÕ,‹Çx…L9*ù£ºŠíq!c˜HZ@½§Ÿˆ™$Šgf‰²ï<äA©
+í~QnRX\¢ÄDZÇ®•d7´)V—4§2Hˆ\7%U9±AzÇY‘L˜Å‡Ä¸¤³°Ã뾤Ð1 ZPóf`
+ï0?­€eá^ÔBô×Dù«œ8z®¿Q-€¹¹9&Ú5 Y¯2úÜ¿Fü¶®²¨Ú!kÕ{a{£?‘§„2æCñ\^ÈAì$Ö±a¾#þ¢¼—\V|5ñ²fÊC”Ã[áa\<»¿[PU‚ä;Pk4TˆÖc¹íûi!~N)Tmµuï
+I˜‚=©Øoiúa;9…B%Pz´ÓȤj„Ìw-—,9"wûøBUÁá~F½iGªmWä é¥T»ë¾XyZY£í#oþ@us¨ðæb7MÉq1ëº.ÀûE¹yÔÈ ¨3ˆÎ}Æ£lB»‹à!"‡å]È÷¹þX;ÙIHy^„tS÷%²`CzóØ~‘b¯õlã³ÕŠÝÇvê
+˧.á€Õ®i|œù¸»×¸¸ÑJµ"Kпô‘òDÔ<<V»yÎË£yŽ¶O½BÔ³ÝTÀåË/H0ào6&SwdŽ
+NzâvÖCZ çzÁìz!™–@r^~žò>môû*‘éa
+‘¹P8Û1ƉsúâºiÆaë’-H^CPÚ‰u”CáACréúp  © <¬eg rjNÌ΢ûà0Ï|2h¡òñÓãfCˆA0Ò ¶SFN;¯™ºöz…Ik?Ø¢XÓ E÷j,]? 3 rûêmbcijÎwµM=}Y¶¯XB L|‹@•.—épó»HQQSÓ©
+;’—%Åw©žÉXŸ…QBš¯Z|ÜjØ`õÇ`UºÑ‘e]î# ™d*#ø|õäC¯×í7TŸ®;!®[¸<¦t¾Ìkûx·<fK¢Á©èìÓ:u›œ¼£S(’ üºžá¡žªS²w*Ü™wo~MîLþÄîÏ­›ßŒ[hBó›䙢_Îe ±Äáñ5ÓO%ÔÉ
+tÌ«ÌSmÃ>/€pÐËÍ/pbò:¹±,Š_'s)~ãêÿ¯ÁÁ×]2±¸ªÉ Í—«ºâRŠŸn;ŸøXùÑ33ªFÔ/êàŒ’¨N£yPªÇi¶Ê­WÙU¿–ÀÅ°U¾ò}©FÀœøÝýÔœ€soNàŒù?³V™õ}m‘€+žYÍÿ©:Йt­Tˆ}—†Ÿ·ƒCÜMu‚?æ`2HAL„&äK'“”¦&˜“’ŸWFÙÍÉOíZï®eàwý›öÖoY™vì׬ÓÊ]©“¯œqÏåRÇp·<ù!Ýi“qÕŒ‘¤.^ðµÁs“)ÝZzÞ¼;Ž­£þ¨êŽ†%æu@µ{¼I%’ãá¹vÕ¤‹ÆεL¾’GK‚Y‚¯hu¼Aœ¦?5)Ѽ5Ò†V¹Î^[mÒzÉ '?™Çj\4ì ØõGcc`uþ0æýÜÆ
+`ëðª4 P$za [¿”Ü9ÍòÚa£ÖÞ+¨ëê%¬¾Ö—»êtGO‹%yF· QÚ±Å5S›o%=» ‰iî«™„µkäãÈæMoK « ŸiÝA‰D€fgt  tYøôüšKœicñ3--Í&ƒ³©îݵãªT¥LçLޢ͠ ê§kžšFó|EB³8sþÿKM²JöÐÓñI«"¢ÕïÉå'_¾sfôSiç@¿€F—0«i[
+¡+£YÁÀ–Eî
+}Bo
+kTE6ú"\$€TÖøԅѕ¹
+ºº>y}½ÿïÅþò?|*"¿¢D=û׋ÿP‹ý§“î¿|ëôÑþíÍ 4ÿÛõÕåÍ·ÿëêcvÌ¥%>y³?ýê'ö'ÿØ_¼{_¿ø¦o®nWQ ªþ ÿõâüæ}•=Þy”^y½¿>Û_Þ¨[ü]ºðÏé¿!\ztu¦ßt±|¾ûáé‹ùäùåyÁ÷…ï'¯®._#ÉngøÙþüg~ؽúÈ_RùåÙõçOïW9^ío‡ú2¸‡»qxŠÿÇ·»Ïøã†QþÁËOxøÐíà‡—Ão¿Ã9O¾Ù=ÂBJ*—¸I¬/h„9aÞáK@ï»NYåí.!ûçÉuä⋇¸Låë炇8çí »Ò HÄ¡A¦]ãø”2ÁÔœG—ÄrJ:Ž>#Zb,NÎY˜ ‡:@È_¦[dëdÏjat݈ ¡
+«²*ÔZuà³Ýۿɤ˜˜|Xž÷Õ˜\fA´A½ðcIàX=h¼êÆáå@²XLQŒbPSq-6®L­0A°Ô0ALhÌŽäv8ÏÅ2Ïd
+ih¥bö0Z *xöuÅ>Àâõ‡À=û
+¥7Ï®ZpaÈM"¸ĨžÖ`˜Œ`
+C+ì~žç¡Õ ‚g_W¬jüÿô½+}}òð325Œ $xH` 5dxÏÌE™ÞaŒÉ3ƒçÒ(J_Øw#¦s,(î‚ñݪb]‡Œ®Š5fX] B³TƱ¤¹\9Ú ¸ÇȬԅKÁ&´l²`j­:ðÀwö…G¢ ×AºRk„©½ŸöchU¬±ÉÀj¿
+5žR¯òræ6ÄsêÒÕ€M\7ؤÀ&ÔZuà{IW¶7.}çb»‰ÞÂJgq~n;—mç2°v.#U;—ÑÀv.^á£ëÎB™1ôRl4PØh«R]>8+M’Óîw§Ç8wB8(¼”‡¹Î€V5«Fªl4°Î‘m4Äî,fÒ¼äNª‚
+mUª±ëÀÕ9êµfJkŒÍ”Öl0SÚ€vJX§´‘ªSÚh`§´Æ؞ݲÁJU°Ñ@a£­J5vøà sçhŒÍs­jV3ŒT5Øh`£1¶g·l°Rl4PØh«R]>8ë¹gJ: mè'Í{:‚I“¥¶0Æâ⧖zp€fŸ»É_ÁŽz˜³†N¨TZ 6ÚªTcVï€ï:t­O• èåÊ$Œ–†‰X‹ ¬Ö*£~2CßúÔãe&R
+6QÝ`››TcVï€{:u­[•!èýJ%Œ¢†ŠX£ ¬0\F]e¦¾u«a&J%L°l»Á6 6©Æ¬Þߟªšý,˜8/}ý¯pSÔ
+ZÛFYÓ¬aV'˜æ¢î2eh]k*Ö„AkÛLÁ&¸la“jí:ðÁ}®_µdÍýZÜFSÓ¬UV˜î¢¾2uhýjJÖÄ@‹ÛDKÁ&²l³`“jí:ðAçi~œs> ‚€Çà:"˜¦Çóè:®c@Ë4 ¬¬ÄHUþb4°\çP±UcßSz;wûŽ(P–%É´„ÚÀJ¾T¥éårËæu¨â/»ž¾H'Ï/ÏŸ]þôþõéÍÍþú²€Ïöï..øÁ«ýíP_†ùánžâÿñíî3þ8¦7þÁËOxøÐíà‡—Ão¿Ã9O¾Ù”(«.‘­Ö?Îi8’\壻¬Ÿõ²Žv—¸ãçï)@7/×ÁÊØt‡äÙÇäë0^’‡7»C.kkR…£™,QªÝÜ¿‚ÛØÈ1¶gY#Kð­TUUU¦µéÀþ{ü½s«ˆ¹SAè†d´êª˜µÊ ê
+¸bÉ©; e‚T 6ÚªTc×ê–áY¨®uŽ Ï¥"s2¸ö:ZÕ ¬f©j°ÑÀ:‡£>¥ÜÅHö½s Øh °ÑV¥»|pûÊ–©²ƒÈ„o³e¥M¬V°Ë{vË
+d“¥3—ª¿Õ·öì#T1ßgKUð‹~½­+únÜ#&dßÕÜΕ«kZ©Ê/–_jíÙ-dVª‚
+mUª±ëÀEÿ'ëÕ²bÙq¿`þ¡7Ûà¦*ë½”/lÚØd$Œ1‚ü€ž…¬AøïY•Q•çÞ+y¡FîD×ÉÊÊGdä%8'ÙÎÈI»ÎÞ5Ÿg8«çÁÎœSBþì.oõ€ì¼=VÝ»îbð\…mº‹k)ÏCÂÍý¥>W-싧ô¯rð‰€³zbå<ðq½wÌX@ÿÐM{úWÛQ<l^Ô^®„ê@O¾>Dí¬Jwxú¿wìmha«á¥ôn—C/
+꿵HºÁôßÍ6°´ª\·ªÚ«7ðfpgÄ?Vè=8°óöXuϺ Àϯú#…}Lj?—yï¼tÛ‘ƒÏëÝzqâ䤸©“í.þGß»Lð’Õ û
+ØVݳnð&²õ¨aÖ#ÜÏýGá;GÝ‚àåà
+É.ìb~
+ÁÀƒc˜G‡9\ëþ¤oXùéáýÿ/A%Ï*1w†JeA@qTKF^­gÕµŸÈÔ‚X£¡¶ŒêÎÕªZ—QÃ67ä¾ÊA"–µb=‘s³8èÙ(bp•L™­š[Ž;™å4º¢ûþpNöíÓ
+î½ÿ|êÞŠ5R¢RáPªƒ_ ®:ô͵¡›ìÂzíX‰V ˜sÙü½»LØPv=Ú¾|58†`p×B0P¢µÅä/saŠ‡u€¢‘‡©Üìh¨¤D?ŒÁèwÖmÀ’©¡©æÙÆàh2¾à”Bilš¢ÇÒÁ³RM¥e‹0à]Á©¦´v¾8!ßÛekDh%Ú>¢ 7…SçKslÌS*‹XòÚ$ƒ[´K•ý½õ2ÆÓC–gúO­Ç9Õhf:¶Ðl½1zR ´É0Z”Uk‚QòrlÂð‡ßÏ&Z EH¼Üo~ ‚²qaEÅQ†QÉ{±T”<¶À`U’Çòö
+B—,oïî²Èå9ÅdAK¨ecZÀ¡WÂm±¢‚->
+¶6è’Ê9G^ ƒ-ÂI&O #l+
+6J
+]1›°$žm‘gÁ fyzè
+.ÌÄHRyV¶Ä”5` d’!+÷~½ØX@n1SA¼C4^okøO0%SW c˜àb €5Ú0aïËn,ÃÎæZyYoòôЯûxÝÓ¤ˆ…ì䜲AÊ‚{Š04Uê>!]be~¿)æGt_ë[NÆ­[#Ž½>à”?´%‡áhm—?X·\Øo€mÎ+ÜY”Õ‚`šµûzÆÊ$ö:´¡©Àg/íòB8äæb&Z¦‰º„ß½]>0C#¹{`Á°©T kRlËè‘—a€±rŒÌ†aÇV¬T†®ƒÙVêb)£®i…ý}ç×iÔè®â”N¸âžÛ샊ÿæ§Ï^ìþþúóü@s8,‡S®¼ ?á©BÌ9Y¤,L•7¶ÀÎD![Õ!ˆü>¶È µÁïƒô´nŠ¶ê÷­&Vá=
+–­ e K5[6Z¶O8KrUx6òûY)–ÊG…|8½™Æ@i›:6!IˆV©&N,è‹D^Ão‚Ô¯Åâw—~.‘±Ê‹W8̦¤‘öýv0r_ - s5¬mŠ‚Þ’aVæSÔŠYß«À&uÂìà÷S ™¯¡Øõ¨ŸóyOÜA¡OûÏ€ëQ"Œ@¨Ì€Œ<îÀRbßvm]Ñ°$+![MöÖ)–8_³¬–ý9ja'`d;YÂ,&ÚäçµVw½½ª$ |6ÏÈbÀ*C2ô ›ÌpiUBµï±Ïnÿ3k¥>e`ePÕ·¹k
+PW–a-vz´u‹T3É¢'+“]’eKFßœ[ÇR'
+Ý·ÑÈ­|ÕNRdÅ—¼ÁPCt |Çwu¦£b”³ŽLÍ‚È°·­4</(R®â
+¾ŠÕF®áÄnG0 ilvä2&’S­Kö Œø«´»P§¾Ø× çÁ‘Ýt8¼N\¦Ú˜jXí”pC–NуyÊK ¹í.b
+êLÛPš^Ö
+tPá|-fLª‹Ò`äà ¬%¿W†ÖüAR1…ƒuŽ>t
+a/3g&a‡h½­aI¡WíOÂs4N«}YÁ0uŠ *ËÃGˆ¶5Áa$‰£$EŸ.Jld è™U;î7tÿ»{+&vo§£¼Ø½ªªJút€PBeÇÐRžƒ–ö¸þü$Ü+…hQ!ìñ(o€­ÑüöIó§¯:÷‚‚>n.•0» ‰­æQùÔøÊDæ$?Ý]-ìP¶ÍÙ£¡‡¯ržz2!3Õ Ü2K0-ºÂkMDʳãƒqñ ùÎXÝΩü¯ƒ{N,ýÕ“t’ñî’ç°ñ÷Žƒ­Çd>
+ÆKìFõ†EÌŽ[‹Ò»wÐW$àLÐë©K±L–^Y\˜'®•ƒüî+ŸÁî½ö#–òÛÁúKÑØEbþ@bÆÑ9¼Ï²Ê:9‡Áõ¥ZKO#hF§·“láûµd÷„çØÒ­ùS‚`^U)%k!•éŒ»|êÅ¢™þ…êgÿü2€xúi±}~ põñ×{[¥ÌS—€”ÛÃH9rÜ5f8½¸¤È½&MÀš˜ pÎÍA)Ug9cŽÊ,™ 0oöIø¨™2}N‚äüû²±¦,9¨Ç|ë`ÿ´Ñ=J€ª“e„é2¸ÖPáŒ=€é¦Ñê¸w$\¸8;9z¨OÇÚàö4 XšYm>âpj˜&äk“ö
+wX–Jîýe;‹ä™–Ñ•î‡õrm|€òF:=‰­É¹S"÷œ‹b°ŸIÕÝvo%¨wÛå:oàmTÝðº…8Àˆï£*!òÀÝ_Ci¸`®šKš <CºÞöuêó-¹Ñ¿µFM”cgTc¦°ù®#Ù æ¶ÕÃBž´lmÒ ¬Ï
+áRî×>ç_ kùôÅrãYÝŽ•íHvñ u+;ò¼1ªÞí0Ùx 8
+–n!E€­•÷9 HM=wÀ.XÅ̓ÁÚ΃©\[Yñ.J
+bEÛ)Ö¨O–=ÌûÛoü~o›ZÝ{¿LTy¼bD­aÓýX½QíΦE°ƒëµø25€\c°ëq7…í‘ ëNÛç`<kÉ`P(qž\ ²¬êÊ—5
+¦ËžëÂøÁ”kÓÆCaÚ¥kL{vKžu t]]køåyá”
+|ò 0µÊ­».ã©Öbed™Äf°·Õé<ÂÿØ®–+bÖ’ øC=Û+ b&ûö‹Á ’8í¹Áäj{ʸkÑ…›Ñœ1R¬Nrch2š†N³†·Ìë–_ï§4¶°]‡ã$} À%tˆ ’\â$£Š;”­ð–npóJðpÚ®wDä{ôy±€7™rãaâ|‡)²JpÍä«@ç§!Ð$Eèoðqn¶^ˆ (’°’RÀ:H•ï´Íi#Ÿ!"EèZ(æÕ^?ÇWÅÚ3cå\Ì*1ïLP~â¾äà7€÷™uË䵚Öoá:±Š´d
+±nch O¾BÔ#AKÿ;üW€
+H‰|WKŽ$» <ïÐpA~×ÞöÚ€ï“I³æ=Ë¢©H‰¢‚ÁÏ=¢?ÿ¤så£NþCwùg íŸý£`¾º¶û>kF·b×^ à»
+YéâTv iÑ‹’cÙCëÊC÷ÿ­¹OF‘•·!Á¸–º—n^×6/I")³\èHJÎéP¶=åºé‘Ê»•yáÙëE¬ï®•ø|}ÿÆ¥ØnP㦰žå€Öëy&)Ñ÷(ì§OYßÈ‹*QÇê>ŽWp°~ŸÎ
+¿p_M«»×S”2x/7å×™ÞZNù÷þÒvE]Ð'îbC2†5^€<Þ`ˆÖ†—¯mìÖ_^aÆ!H­)4?ðx¼d2¼6U¸îlA&(âtÇÓ| –?‹‘ëÌðç*dÄ
+‰âru}6%Èë}Ë%÷Š&õ4H¬¸îlCnnª7Ö«Ý>غG;–çÁ‰ö®äKHŸ§ gÚ_eX±ûàÅGó> ¼Ø›ŠSë“öÀ­x±~£Ç+xe¡ŽÞ°¬Q <ùj\ææ Æ2‡â{ öBed þÖi]xõaŽ úÙ©»ÕÏ"+ɯN?‹:¶Œ°<tœ¡ôç«ûcùkÖçÂ
+$Å“í®“–Àå«“€À#ÐBGèAߌþ¥?Ü—0"¸Ù¬‘í8áOƒº w7¦ûEgÓ¬‡}ùºÄøyŒ‚j0LzÁ}×öq/Ò×’ç6…ÿ‰ÒLáIþ´EÉ (n‹‚hpg_iá¿öž–¼®Øí õÿÓ%k{„“Ë Ïдë-óráˆëóiMàΚdû—ù‘4b¿ ó½xÉÔ&Á«_Ô *…Þg.K`l¾oiäÅýö浪¶#™ÄÜ_ énCû¤³hײuïpJ¶8üˆÂ»Èæ„e¤Ý:ä Ý‹Öh
+ œ²Íá)DË&Œ-»œàݨÍTæ"¸!u`Äðb(C­2 ÷øí,pFT¾Ô@ kA¶ŒA¶¥sRóî
+è´ ÊHÝ])Kà‚Þ0}'žyÇò†l>³]Šò;þµ><Pß
+«í9W´ZL:Ü·`5¦iˆž£€o̯Eð;*nçN—¦ðmL ‘ЇbÇ OÛ—7¨ ãÒ5˜0 ýÞÖ±–b'‘nƒâÓÒRx‹ œbVŒšzbïè•vhÐÇÇÖúû¥yázvø?"÷Ï5h¸˜ 9‡J >͉fz)^JóÓë'¯˜¸ä"±é‡4m2`¸œ!Ê›2´X +áÈ,ŒÒ×Û¤—:Uº(í]Åj_á¢f:ã*.•èM ê$ðfüg÷H»!fm–7Ô˜sê£GÂQ<ýýԉ߆íØ_ &úœ¬­Æ&”¬f¯(^¯9¢?W#¬­jm£Z‰í%l6f¾Zð%<Ð[ï3C»Oç¨ZR lxÓRõ:wPC’xókÙcC‚ºgò™Ï¼ìûü6¼iA6ò(2†¤{6¾õ8·>ô=`;°ýžºioy†zöZºk4ï0U²¦$ãhø>ŠÇÕ¼‡‡ý™!œrÆì„Ì8„;áÙG*jcY\„[¼^ç ߎ‹Ye×,ª(¦RT^\D:ánžÁ£X£#Íøµ¹Š+À§9¾Ž¯@ñ;“j>à¨jT}ÌAÍûÈãAyqñ¦Æ°‡©#„zc»ìPÔD•°>¼?BY »æ$ó7®<Ë•¶B§«ûú
+­ñ.¤½«:$RÃÿ$ÌäGÛ :µá6ø4šq¦öW«cj‰ñ=V8GP£€3€zI—ÃüÅxÐŒùf`ãwX·Ôv7¡£c9Íú˜ æK¨×ï¹Õ(ìÝ ³É×—@ðÌ¡ý-oð[ÆÆ^kÎÚHlqNXE{s4ƒ-ÖšÜ$!CjH §ÃÄ“õ!`Æw?Ú±z6Æ9/
+0üãý«ÛIxF?¸mO[:¾2[_ƒ#_©¥PHy[ßSí²#‹§ç…
+Ј¦P†Rñ>¢
+ËâŠG Jm€Pk& \!OX«LfÎè¶Ò8¨!Ϥ¤`gú¹Ü¤‚Æ¢Ç÷ «%P±*`Æ,ld=Ä*¤CÅ0•¸±Êr §
+ N3:ò_su[3DJ"˜œ(Ûq ›Ü!ž‡9áxRÒ86‡9-SXÁDèçà * ÈäÓõŽ ÷y.ödÇëàGȬ_uFÅ’8m-fT%oÉ¡:¸¥ƒ-b–ñ,R°ºŒQ$› T¾%Ü‹GY¸cD#³ö6¸èzÔ@{]Ij½¤7"
+£úeðÊeë½6U Ã+gNM•eM¢Éb ù@Ê°Öõ"l,(8±T‰¿¢¹
+™–8Û×ØãòŽ÷‹áB…­ÀS}¹'e"è*æLïä7µØtP
+ÜL©V`
+{®‹ç<0
+ '%„Ëpà²bôƒ®\Yꓺƒ¹i'%{ZE¾/½s9Œz’˘”¦$Ý-Á÷¥ÑËÓ‰d)¥êõcÛä±ËP1–µh)°¯u«®]BIØÔM÷P;ÏŠm¤ª ¥¨Ù"…ÞtbKIMo¹k¾ô<”á€6¨£ÜŠoÚÂN3æ•È4Œ£j_šºe$[õqê®q =ñáÀ5œU¬=sZE¦‹©½yZ´O}Ç
+™š3 †2(I-y›³
+&…mån*À°Á6ID[´¢è=m&
+º¨ˆiÔ¸˜[|æH
+}"g¥ ´øw  ÍCL„'ð•â6¤6ÄÒ0ΪìºÂQ0DiQ
+zˆöÎ@¯ŽöÂæ7@6óP÷³;`éÔµ'\Í£òPÅÔ×ïÒ`¼$–i(0+ eÐ]óá<´-î
+¤5b”fnà2S°`’†:ø@ÀžbúÕÖa‚¾*s`Nkí;_“¼EÌçÀ\+ü00tzˆs…YL€Uht–€çñ~¶×/̼ß`ôMÃAàdNX0Ï
+Ø®€_Zí
+Ø®€¡¯€½v¬ÛëJ»†¶ÆŠoWÜI®Û°ÝÃÒ¿vlwÀ&í€ý¦l6$Á/G#¶db–H>?Àî3ÜiиÉ‚è ¬H;[p#²„4ÅÀ „6Ñ„-9Ù\ÈÂa—ƒœÃÍE^1½¾ÃÆçÉ!LI®5'騒1Dƒ —]„Ï°ÈÇÃAp[ùð6½º¨É8ÖÌTwF}»ÿ~KX¿¾ïuáy“1š ¢~]e2e)ž›×îm“-äX¦Ú¯€<:‡¹Š e3J¼Î¾r'6洸ߕBªÿ?'ÜTܽì”Ö6 »Ó­Þ˦îóŠîq"ö¡èìE¿[üA_È'ø]|òÝ‹ž n³|¸¬‹¡
+n}W­È{ÉSóûF/q;r–‹Ìö3ñ÷½v×ÏYêXè²<“¹¢ìFd Á‘úL}PU/ýÈ"3¦ˆ‘S¶t xÃô,Ò0–‹LêJ¢&À»ÄÞ9O>{Od4HEîÊ ½×Ô§+äÊÛ ™*’%œ6ezZ›Ð''QÜ$ fðÕi‚
+nÞ“Â ·#´z„V#„2}ekfF"¯¨ÁoOù¼eê‘mÞdý,‘m«58%织ß;pa,û—w®¸œý1}· H@.Ýÿ uº†ËtíaÀÉùŸŒš‘ÌÓ¨¸ÚH®P¬]2‹£FÀ'1ÎQ/†pÎ*ÞB iåäæ·‡±”b¤ûTÑÑ%¹Œ~ür–u2ò±¯ôð^zæ‘IàÜìO»'²P‡„ñÇ7Œ‡ãÈ4 E,{?Wì0%ûL"žãzr8îi5½YBš²˜F\ª5 ž;œ¢¯^ÞBÚj>Xs‘O‹,U–H!a¯ÎÚÒ@uk5-xM›7MÓ` VÓ\¬·h6"|»|¬·xY.eó^ã:&ªKËßDZfð›§Ý-2x—tq36'š½S쯜¥±Qî›7›5‘!
+”æ‹{jÈ’áºâ,•3à MP>½=ý‘ À“˜€‹ÑZÁ“ÄŠu"î$×𺰠©Ÿäi2}ÌÕ<…fÁ7g:Ý  Y’¦L̘`Ôf{è¼
+–BJÞ[ûÓ!ØÀm“…§GOPú>Xà*«‹C‰ê²(M¸Î¡lÁRsK²úͤnçðÕyõØ;yDS·}ÂßáxÈźè '0Qè~|AŠ_µj¢K!Õ-€¢ìYXàÍ[7m¢ [r²¹îHO‚ÜëÀ°qÊÁ…Ò}pÍÆJ.à·°;ì<£x_¹>üÝöú à‹(礩L+.["¤4_ä‚ ¼Rˆs6Ŷ>Æ‹"nøÒîs€s4"žÉºÂŸ©!ÊJIwçsÁJj$89Q®`”íYç,]˜eÎ-¼Õþ´sÁSF*^ú‘‰Ao‹ŸÀXÇ
+“Y¢*‡8'KåÌpC”OoOäÂð$&àj´Öpçv˜u"î$×°)Þ£«åþ“<ͦ¹šç¢- gÊ|ºA²'$M™˜1Á¨‘°óþB óü€B®¾òu sHx¯Ð”¼·ö§C¶°' !O+Žž ô}°\5Í"áDuY•&\g‚P¶`©¹%YýfR·søÚëýÓ#šºínüÇC.ÆÐEoÐ8¡€‰B÷ã RüªUøX
+©n¼eÏ¢Ào~غiMØ’“Í…pGzä^†S6˜¨.hJr­9IG"‡w¸ozíÁhžJ[ ñ”Ê[¦Ùæ ÖOÐçm2ÂIisqÆ{ø½†Á:9aqçú‡ËÙÓwÛÀ€äûæ·‡ Ä°|ÜŒäï4‹Cy 0¼"Ï5î°öÇ;¬™ÌeSE²„Ó¦¸üh[©(̘"FÂmZ
+ð'±ReI±R>®[}ûÎúöß·¬o0|«o­¾µúV+}ûU?hí[+o¡ËÛj«n­ºÙ«[kÞZukÕ­U·¦©Û”äZs’ŽD®oYä`xm¢ [r²¹Ü>§AÞZ¨œî¶‰ÎÒD¿¼å&‚áÛ&j›¨T7ÃngØEkg‡ýáF³áÜ–ÉùŸŒš‘ÌÓ¨¸âH®ì0‹£ÆtãµÂ÷|ÅÄ{AÖ½·¬ƒ<XÌ‹4À†\±Œ3Á¥á<Ó` ñ>öÝ
+¼}ÂÌá¸Y\È*•;ñhÂÆœ ok IùÂb6ýË{wœ™Ìe7"Kì(qµð"¿  § /ˆtän.ªFÏÉèÍ…ÕäÝši»Î€Ån5gƒ˜MI®5'騒-DU°ÊHàr°S¸©"YÂ)Õ· ê{ÀªzíG™1EŒÄë1À9•‹LjnØ}^!\ßAæ<IÃøÀX?]è¡9yÂÛçÉG÷ta2¤"wež5¹ÚŸü[€
+H‰ì—ÑR¹†Ÿ ïà›­
+UKl“MÅW(ª¤ŽsrÎ%K=%iV£ÁxŸ~å1Æ3„ g-ßl%D½è›nýýÿŠÁØh.§×w™ŠÁáâ?’dpÐùýÕ óúûÛźÿ»üteÿ¡óñUwÄ©áJ=·¬ ‰±ÿ§Ii ¨*N´&NД ¦A.þý¨Ó½¦ùkÍ<¯~íkª²\ÜÀui:ÝÿHNÕÓ7½%¢\ÖpùüÉ—˜ÆªÔNDž<Ò‘ÓQ(¢¹I30œb™Tš¥Ñ`남cØÇj(Já˜ÚÞêøï/gè?ÃÐé>ÛNWØ+ÿ_møié6´Ö[b"µôôßÒÍÝ#î¸0€Öšî’ÎàUwüõü¬*lÑÀ÷:Ç=ì .±ÿ½øµÈy­U—Y5ùÔ U)™½âPÝùaÚ£Æô¾&8êÉÅÍg~â³ óÇr¯é;xzÐë‚Ãp‚Ó–yæ’AÂ¥sïÔkÄŒJ¼u¨Uï4ò ®ñ~÷U€D|TS*‰n ¡´ÌJAðV£QœÍŽ Ç7üÖî¡ ¼o32G¦õ¨†h/O»<œ«ßCC1!aQ$Ï2©‡7½?œGp ÄñÑ×L”z©ð¶Vœ¬2gƒ£^ç¨7ð2jÕŸðæeu<‚fÊ¥l _&| ™ˆ–•ˆä™Ç>zæ»nÈX•šÂ‰ÈS²±ôé,HaØn9Y\Ô,
+7®uÓX·¥ðÚ¶ÕñV3U9|È$³9Hàœ”EÁ‰:ÙÚ¨
+}¿Û•‰ß¯šàÃ6!Ô Ë'ø45öß©
+ïó—…÷¯h÷Ê“¤,àTIkµ%^,~¨ ï•Ð2_êÄÆ/¿!mµ[[¾ïGe׶–'ÖW[¶— .¹ËÿÖ{œ1#üj¬WDÈ›ø%P‹« \UHÎGUÁY¥’è.Jˬ¹§Q!|æÂj:1n¸+­Öá
+‚£1#óÂCb Ñ^»<ÞÇ£¡˜‡š°(:ÒC³L`ê±ÕïOGÐE ­‡ÖIÑKû4Öº RHL5€X/»ãøT n¹`Ø@i"§h1©þäè}u<‚FfÊ%yµœË…@3-cŒÍO.Þæâ®CÌ%Ï<Õ3ß=´~è¡Ö_<+MŠßW«óÁ§ì=š „ýËâ:hªZE¤YK`Äí”æÓÂ8âGnCW©bʧ{»…à;+EÔzKý¯»ÜºX‰÷7?†7:豺쩒ÕyS® #l†Åô ]5ÈÇe+º‘¥Nl[Ÿƒ7EÍ¢àtÖ ¡ Ÿ‡ƒb_Wïáºt¼¡Fp*…WnªŽcöP[äÖ]H¸ä.¯Tÿ(93òˆ_µŠ¡¯+5kµºÀUE5Xͪà¬Òn34!¥efŸÞ#7J"¬’\X!Dã1Æ w%›:ÜCAp4"fdîÈŠ M2D{‰Òò|„Õˆ†bj¢èHÍ2©Ç*¼?A%´ZûA/íOÐXë‚àdv£ñ©L5€ÌA5Xƒ[®˜5¥¥‰œ¢Å¤ú“£ÿ5öÕñ™)—äÕ²"Í´<Œ16HµDòÌcQµ(Ë~@Ç<òÏJ“â÷Õê|ð){faÿ²¸šªVÇ)¢ÃŽ#ØÖËöpq»ý¥ùäf«¿Ÿ\e|Ÿ¿>Ý;òí{Î/HN Š «RS8yJðHGLGQ
+¾«½¿ã_Ï÷òò.FüDƒ8NÖAú­îÈ[<ÈÛhËæ\“<åtW6(ãIRèÔÕþíI47iߢmÚ¢‚›Ï„Ëý
+mß
+Å ö~…¶ ¤å+?Z-_¡¾òÕöíù‚P³ß íØ è7õ+¯P7B[¶¯w[½¥%R;/AOañ!ñíÜÜ=âÞ héŽ é ^uÇ_ÏϪ «š|j†ª”Ì Õvh—ŸÀ5zz5Áåöäâfœ¦f7ø—Éž…ú“d¸'Ù–ŽU©)œˆ<%»â}6f R6‚[NB#5‹‚ÃMDéPší5ç¤,
+NäÐɈò;ãÈœkPæPÕZKGƒdŽ™·ü­´]ÔT’`/Có’ëmSëŠô—Ê/o¶4géÎ5ÉSN÷}Ù‡¸¶‡¸ÃþñoØ9Åoð üŠ£>MÃûÇöñäâfœ¦f7è ÆÙÁÓϳ.“,Kÿ]Ý•g&Ewæþtx¢·x¢ø4Å;ÇÕqÌ2k‹V.—ûf-W`¤÷X°Ür²¸©YÔêH·mÁ眔EÁ‰:Ûh“?`ÛÂðë‹ÅØ_x¼yb1Ü“Ï[i»¨©$)À,^†æ%×Û¦×é?ðþ·g ¿¼¹Þc©©U¼]|ÑíÓõ¥C:×$O9Ý÷eƒ÷ˆ{.  mGwIgðª;þz~V¶IM&߀š¡*%³Cå°?=j
+ôô6j‚oÅ“‹›±±Vÿ.ÙÁÓƒPl»"íïŠÉé½9Æ¢LHgþ,AR¼ }Tmܵ&ê÷°D²Ì®©!·€—zIp2©Æ†šbùŠêô.<
+»E=.ÒÏæaÈ%ÞË3>V¥¦p"ò”à‘ô ¦£P®¾fQ9hb^cבo§*ËUáÌ ›~À\@·î’ÎàUwüõü¬*lQ
+¢[æø5¢»'7ë5xó­ÀìàéçYW^§ßÃwfÆ™IÑݹ?Ýj¢ø4Å'©ÕqÌ"iV¾éc?Ç„p¦áÏÒ7^9Uo¸±ïK¨¡(¾á«ãÁ™>`d™]SCn¿ê%ÁÁ¤n¨CFÖ|Euú €š(ãˆIIkÆe)nõ{"YÙm΀>B±Oûø?}
+ܧÀ}
+ÜÁˆö×ûØJ¢_"¾Û‡Àm è–íC`ÛB`¢‰ýºâJñb÷1p÷1p73-‡ý}ܺ èÓ´ÖGÁÿ*Ŧšàe«½9ðxçr Ñ/—~á\“<åtWL:'†à–“Å…<‚D½(8ÜD”Ž5½}ÁÖ‡©ÒJä𱈶EÁ‰:ÙÚ˜‰ÐOˆá·1‹±Žñ x/Èb˜A¯7ÒrVIR€Y¼ Ì+¬n‹¢- wMÓ®TmT³DXG~H•PúãDú}ÐYþHå„r3ÿØ{ãáæ<ÌBu:øüU¬»ö¨¼ ¶åM-qûž”_/vvqyävÍõí×,*MŒ««5 uÁul[Ä®H S³Ó]”¼S•åªà½FÛ#{}¿1Sâa5Án–:;²Æ|šû=P#|\Ý?Æ“¤,ì¨Ê‰׋ê‚#£l©BÁoF›E³_v=mÃPþ+üP¿¶{(ko€N+švë&ÎbÕ‰ƒ?Û¯_Rš$ŸDرӈ›¶ÊÁy|Žß÷µs¸]©øCIõ¨ ͸ZbY0-oÌb>‹è/É”LÁ[ñö¼óö~@™0-¿è×S5*œsUÖdóáE­[RÙІƒ§-K¯RéÂ]Ì~àÉŽEüÛKÁrÜ"=¼/ô7!ÞµuDz_8fÝ1žq<ˆ2¢OƒczÓ“­ô4†'kái[KD¸é©ƒÈù®Û[¦x„¯i‘"8’áŠqÂ4ëÊ´éGV`Žd‹Dt,8s‹µ"K–Ls­Ú
+çÑ0ÕUÎß)Z.n˜·OðO×|[ÈU¶‰$zÖ‹©š%ÎÉr¶•DF)”OTO?Úð¤Æ9aÂQ¹»ôžË×b Þa¥žŒzê|TùéŤþûèÓÛ/жUŸàsyx<
+œS-YVè~é‹ÒPåA32A$øÂàBtiï"1½džx³eM ÷H…Àç»zæ~%˜¯3Y9_ú<»˜@wC¢Å?õWÞ’“ç=¯VãUUP®z‰ž´e¥òè‡CQù'À
+H‰ìWmoÛ8þúü -N
+ß%Þ~ŠÓm±·iwÑlö†k«Yl9Pì¾üû›RmYŽãK7YàZĤ†äp^žÎL?®–åÝKö·äô¬®GßØß“Ø‹¯óYµ˜”éøélR—®KvúSµl×ðgùí¶ÄµYÎ8{ÉN¯ªéè—ËzZÝlîý<š­üæåèã¬ü?ïö©Fs:mœa¯ß]¼‡ îéëéx9]T£zKøÑX>ŽztûÁêÑ©Cõ
+W-·Ø#7;Ý/é§òͪ¿=TØ=fÿ“ý‘ Æÿ¶¿$Ú‡£í»Èp¾˜ß.ª²ZþVª»Oeý×C?ªp ’¿™ÖÃdZ ’iõ˜¿\¬êqù¶Ýþ1®”|€Vò ÔºÏì­.‹Û²-Ã1:ð§k…
+z>pw\µ zÅ7 9…w®÷ðV![­@MmŒUfhìÆ>06Ï[¢;Œ’­Ï“5©qÇ‘´#+Œ¤cÊX"p ˆA‚Dß8F|/ð®Lqc‰ËœÓ6&)ÄšÖèÜ"wL‰LåtÏÁ(ÖHhäQRJqM©]¡´çàõ&#šEÁy7
+l!r¼)G¯a
+Ä£pNJ$ØaøKd ˜Q± M:O>%W %¯IbÙ‹—ìúŸÉÉpWªê‘É
+NîHWH=.ayIŽIYxò˜¤[$J['Ãnâ:>8u J^pì˜ôu2Ü‘À<ñÁ)ŒŽm'1 vÓØÉð¨DǺ©Œx=<™½ŽIg'Ã#€æ¨”æá}DRóuLZƒ“;RHmàÿ‡&·“a7½»: îdxLŠ;VP½¾8«sÒRŽ ÅwN905q¾ƒšŽ˜Ñ
+¸ÔiEÑy
+ÜK†G›ê‹Õ1ª/bv)a¼Æ+̆G—º/^TO¼¨û⥣÷Ø’BÒ#Š¯‡Ç¢7éNtá±O¶öoÉ/I|ªn M<ü>"¤xOTðž¨à=Q±CzCÒ’ÞÛÜÿ>–x_8ðžpà}áБžòÏ< éǬÔ ä¦GÀŽ»ÖELGfÿ¶õ‰¾%?bÇR ¡F…ßÇÃΦôzKú.ò7¥×{¥7$½¯!½ÍýïcaçûYþjÝP¼Zœ¯©¦wR
+Q4ð— '…êËnż/·æÍ£ÞDʺ¾œnôÊÌ›w¥yeD3ȦQìì–®Öl]Ôc á›*ìçÛ…}(÷{ì›ï¯×·²²È7kMë1±]TPYÚÝ*yîKÛønW=\E^l8êû¶²Xœ Þü(
+«g×ÐÖ‹ÛÉâKÕígW_Ž òþe³?Œ;S½nL ËœÝ$.sÎA» žà\;€Ú6åbMIm¦iò_ö«®·mc‰ú¹€ÿ_ $iMs—är™ ²|úBI´A àÄJª9…óÇû˜;³»óARJœ8¸è"ˆ<äÎΜݙ=£ Ÿ›Ú5UæsW×°t»mzÇÑŒa×â2ƒIÆ`'ã@4À”{|­Û‚8±E˜¸ù)ˆMÑtmz‡}"`¼Mž·l†‚#„¢'«}ÊÆ°s×nÙ{X´›¢iÝýlï7ØZ‹·Ù½ýýÑë××çÏ–«°GÔþe„ô¼BHLQ·Ž!à.¾Óä.<`@<bH­¢`80° ÃEZ ^2ÏÔ;Y{2„ãl\²*1ÓÒx4ìû;h¼íÛŒ
+‚ŒR”ŽYç˜úÜl,‰¥®ˆø
+±q¥7¹+V ²-\*&,¨T%¾°e¨PUŽ7paC8¡VÚ-”ÕEîLáÕ(,š_:Óþ-f‚C±3Iª¢ßbC>ØPŠoofOÌöž.WÏf¯——§°X?…š¾qiúõx<:zœ–÷÷7ËËóø(9 øtùj6µSp÷·ÕÍÙl*Swr já)îû¹}³F¨
+ë' .Bƒ2ÕO×µÜOs©.„ E¿ün¨ö˪@³)7£N©)7KUÌÆÜ ƒê’«@©ªÀδ‹™Ú²;É·©ÿgékoŸ¾Ò @¡n+oÁqWB+
+§=S±˜Y¬žŸêPQ“=)Ñy‹öƒëàËè"ø_Ãÿ· tÅÎt²P 2|-¨‡¿ &úB¢'ÀÂ@c&*cg
+:£úR¥Ró«µhЯW;Ó;èéÇ-Ý^«9v¦‡a¿„ŽîÁó´å×)ŽÑ%õ¡oe£ëÕ2‹6ÿ0“þaÐuýúêjvù~v:I>/]©¼€-–‹¬µmØѬ¡a7 [ƒ˜šliàÂÖì'¹€Ë¶j ;øöS›sn×`‹æq«C+f¡Ï=ïb…i÷/â÷•w˜-&>!`5uQV‚MfMUé6‡Åñʶ‚ÑTÂlnpá&]¬lš*ãpQWM´] mž'@“m GrÄl\!Á…ñ®b‹ëúŒ&¯Jã*rÞÅ¢á6¯©õäÆÖ§![ç}Çëbs^‡ÛæRM©Œk„¼Œ½î`i“q^(vA-1yªV˜Ãár²­ZáWHånÏ+g: j,YAý­êRQaA¨š…u^ûVÓ5AÌE£h¤m
+½î
+ þBdÃÌO¯èc7 ”€“q ¦¸Õ›ÚwøÓXÚÚ¹ñ”Iiûƒ¾êæ ¦œŒþàª-µUi\é4!
+5ÂdãÌ» « ¹ª« $U†ƒ¦*£
+cþ:†(ƉqAøcO…>Ž† ‰7ZÖ÷‰»KHÀ­ëR§¡^ jÍŠ‘ÊuªÑeaÍ\ ¡¥"Îó
+4”Ö@¢M fMCÛ¥Øyn¡Œ=Ê8
+‚$ÎhWß'Êì e*‚­;G††Bd^•Ê»“ÆyMY“Û²)5c è„F….÷ ×j±«Ä˜@̘†02¶K¡ÓÔBû'„q I”Ѭ¾O„ ¸ §-nàÖiÂ4€î˜ž(}çx0˜?U‡1œ¹ÔE]s¥bL‰1˜1 ahl—bç¹UZ’‡BGÁÃ8ÎdWÝ'ÊìÄS!Éø6µo´Â5_ù¤‚$jsÐ^Ý+}G’w2*‰4±›
+ Êúìt´›¢Œ ÄOŠHqFÂIqFꊇ%ùÅvÓ½bŒ!LåÈibŹ§£xÇM†@„õ¹éˆ5– ’ôIç¬$X’?Š0RIŠ0’R<ŒÄ&@QÆp¦ æèir—ÉE˜) ILŠS
+q±aŠœ'ÂÈCá‹b Ä
+}ÁªºOdõyÑrL¸"„‚"CQ“Ò®H U¤˜!EE6é^xb„iRHˆ‡lR¼4«pDž Gä;!m²©îG}>´þŽ¡x<—ý/‰á( ¡ˆ$!$¡È$Ý EŒ0E
+ áM
+7M* ‘_—ÂŽ5™T÷‰¡>Zp C„P8$T8ã’–†HðE¤‰xLÒLl3Ý EŒ0E
+ ñMŠ—fU™–<ŽÈwCÑ’M¹Oõù@Ž<ß~¾½3Ý]®æ¯Wóåâäò&{ˆÐ““«wáªÈöö—˳ìÞÑâýìr5;½Ÿý¤áñÙüâb¾xÛƒæW'¯ÎèíãŸáßux>º€¯ÑQ==œŸÍÒÍþìí|ñìäj5»èÞýÌdÇÑ‘ƒÙûùëÙãË“›ìø)
+ðñ³íPN·]šôyà›þÓé¬Ü×á…µm 'WÅî‘{FèŸ@@9”ر¯d`Æ¥þ“ÑIBC›ª§NVì+ ¸Aæ
+Ê͹šÍ1Z6M•ÉpH´!$Ú3<[
+šÔ,+0ÀÆ™'v¢C2;Üa™ãÑ|š@Âò€¹O°Lh—e¦$JÝ—J4pÏWý,ÅôÆf°Ë2\·e£¶> +¦Y#³ šh"xæŠéÖ8rº[ã(8©qL
+Éɲh3¥Sž>/_%£„QØ$õˆÒƒ’QŽ’PR—„‘ú$»Ô–l2&ÈXŠ˜ì#4·d’|”LR„qìÙ®h3“S~>¯W%“„QÄ‘­‘’€’É,%‘$' #¹If©-‰dL)°0Ù%BòÔ’GòPò˱“0Ž<›mæqÊÎçªä‘0
+˜Äïñ¬ø$$ %‘¤y\Ö—l7·%‘Œ "–"&»ÄÍ]ííì£d’âàq;Ù-mfrÊÏq&¿{ ?'§÷»7W»›íÝêþSóýݯÆ×g§gÍéÃnÛœ¯>îÖ÷7¿¯Ÿ7'»û›»÷Í_àû`ôzûv}yz6\¾zûq}ÿËúúòïëO—c§ÏÇnð7ÓŽÌžúͳÑÉÓ3­.¼»¾ø´y»½Mmw9_¿¿¹Ëȳ¿n7ëç3ÕœÂß›_g³ï°õ~^Àß«”Ö¡7PPµ‹pØ+übäòÛ+j Êm (~³‚AzìÕ¼ù¿ÁË
+«þÄ–ýƒÿDÝGQ8ÏæóÓ««‡Íùv—Šª(¨-¤ 6<Õx]:í™zÄG}>èÁ=ÉÇo}¶¹‡¥lýáÓLÿ¡Óìÿ(Àow\o?¼þ0Ô—ÛéIMJø ŽjEGµ W°‡Z¨›ÔJ¯°¥ly5üÚŠ­]¯S£u
+aÐ**nâEe|íÓÀ·ÔOÜq0ŽM&áe1£·%»56 «Š©QÙȦ3šn9~ àÍÑE(õH@k‡de“ß’™ü
+·UïMŸœÕ A`°jˆf23ŠHJo9 •)JÓ8´I|äiÑö€{@]M#ÞEÙõ4e1ž2TÞF7ع¥H­ILö°U¢CW(ì9òõrÎû6z:Pð”ÖNclzðSÁát5p"ÕçÙ£VçO³ŠÚã1Ù!IÛH6Ç…ø’ ‘£Â5QM)¥”—…6É„Ì‘päëÅp9=á©s2!À°Å
+x¸³1±óÓ¤<fyþT˨7JZÊÛÌ&{o²/y鶼v§ûLîÀœ®…Ø­b ·"ÝG×_Bx©ÅHýp€p¬¸0w6Æ$ü¨åùS-ׄ•˜K‹¢5¸]ÆãºÖãê5Í-GÁ3JÇ<V§É\²Ígÿà®KßËÛøù]É$ Óe˜®2=Íù»còBÿ¯ä…í†Þ…&À„#ëϨ-@aî°<zL¾vÑåbÙé úèp­ôÊG\41·º}±_p^I‹e¡SÞÔÿØò]ÐÚÚÆ U:ݸzeA/›PÞ˜ùú‚,Ñ žA`K¥7,bXAVY|½)>.“ÐÛ'£cTCÞ÷:5ø>í£!ôé:vÙÈÓYÚ©íÔU(_ûñ´2`lN i%]­dê6á¦áñ&‹ pÆ–ÿgú†Þã5+Û„ ð+N™_9²Ü¤@Kà‡šÜ¹Ø÷z1}qk1“þÊP~ÉR î=Þ 5ˆ;ð&Ùq~(È’ÓwQ x ܆;Þ—nÉû #)©—î9­¢-Òq ›Ë½YRùÃ>eÚ¶j“ Töš'4¥9 <DsÉË­œŽš“7msï¶JÎ;;`šz§Îç4VùiÓ+eøÄr™U0h±o}ÓÓ¡qPƒA¯G¯"xóç«ÈçU=Χæ·,Ä-œ¤°ß,=XΛÁvux„A±é­·x‹R‹AX3
+ QçjW×ÅÁ` ¶Ì
+÷‡Ce1c ‹gBH›|ÑK=,vãà„gßÃ^ìB:¦,öBÃJÒ0^„ êE/¨•aP¸cHÙ‚è£þË~Õö´­dá_ÿà/Õ‚´I<3Û£~"i»ºZn© ]]iµB!1%{C‚’ÐÞþû}ž3c;ÆJzÙ.¥`Ïñœ3gÎësLF ÚÓYʦˆí‰±B1™Âý½ÞžÆ8К ^¡x¦FÂ'Óe”Oéøb i*4l©x¶{º‚pçL„ÑÒeNÉ3Çu…Œ»=¿ÊrRŒ–ã‹Fqñ?;®.h]LqZ‰-Õ(@ ÈYĶb„ Å€<YÂ:­àYe}qQI‚Cˆ:eè4H4WÈrºaf¤è±#!‹s 4‹¤qÌ/´Q©QxÅÜ LŽ“s—S Ø¡«R¢C¾d&†Ê#ÉätN‚Ed
+È‚¦™Ã”MãD\P[Ô=*+b<â\¤¤hœ,âåÜ°ÎLBWì:é¤Á»Ÿ*?·>½:½¿t#þ>Ô‘¯N·xˆÄ‡û\m/ø?«í)ã+^¦å-á¯-Ö¢,v—OâqΫÓÚ=ßá\E ºÛ <—Þ”0TÄéÁYâ91Š±Ú²Ûåq,øÐß.5±#âM±)ò6¯£ª|Ù;˜/æ\*´0&î²lØžÊ3ç$Ìài#mÇÚXo
+N‡4Ç0²™„ón/IS=S@8Ñ°…;c˜ (•§Â'9ñÒ?áÄ@’3ƒÀÇÉLŨ
+f[:$­L ¥„)ôJ<)õÅŽ…FÕi9mØöãá#ÔÑ©1@äûQÿ`dþ9Ú ÆãëËãÅZPÅ¢H¢_ÛígÇP
+¸ð Ó™qˆÓY†¸à©­zŽXêbquECGËuRIa|³ãâhT/“˜‹c%x*Cбü9çb>3Žb‡&gTÂìË ¾v s¤ø¹Â°##.èÊ.÷”¡Ëžj3ɯŠÄ¶‚L8
+³Y£€ÒiÚ…5û °86ÂA‚äN©\I9Ü ¤¸RlK’ÒäsÕLT GRf´ `ÉÙÞ4‚ R õ¹¦u
+|âD²3"°$d´ ÀÍŠX@j1:)Åø£Ê5—WU“+Êi¹ÕQc¤·Ð±4™”óƒ‘[òNÒÒœ·8}í—0wP#‚šÈÌ=iµ4rè¸S®qzJ‡–Ì>ra4DaÖFêvì¡‚ UýMÌæ‚8JŠ¸(g¸U|mJ%‰E* ³l¹ï’Å7ËÚà¬)€—¹±bCÖ¨Xg“V1BýÁ‰Žx5 {;äçAÚj– ŠT+[òµ)¥$Šg±—6T«_‘˜Vºˈm´ŠÍd¬Å·$…
+ÞÍCv
+Íä
+ø‰Q’Ý$V†5m¬‰~;ØÞÔONÔˆVoË
+4TÕ¨ÄwY?*èŸ~$èNÕΪО¼ÿ¨ÛÜ’Èr#ŸÄáåæH5—¦µäÓ,1@’;Ì7‹Æ´æ<6N{Ä·Úài=êüxïdý ×êôÿ>_|Ërï`ömµþíd?꿇ÇÐtúè¤_ŠrK¸¸¼bè¿›ÎpQ2ÁéÓyä7xªïý°å¯À®ýLWS´[
+lK8YÆ¿?@Â`´šŽ7Ù—‹ß‹ûókù0;ZFHÜÄ ¸úb}\Œhk~ôÛ‚¢­pI'¡ü4€’l™@vq½Ž:ÑÞ†¶óב½îDý£åzË͆‹ùäzº¾Ï¥îÂË>ÀºwÚ‚²jK•!³ßÜ蟪—…‰Ä¿¥±Ë{¹ÆÄ€7Í{κEWÛñçvƒª¦A+ehθÄxŸVÅÛ/Åüh2¹§•wivÙ8'ïÅØAyl3%ø·—Z˜„`\ÁÜ“»DXÊüöƒ­r‡³b>y* ‰°'S}½šÿÖ‹túoÿ(Æ×ÔA>o«ÖÍóç]æ¾_‡~ôÝ.T½£óóU$§nçËïì¦
+ÞeáÙZ6Ž)3.–ób¹º»lÈÖ[ëÅ AU¸Óþ8à¸! –£Éôzu[j=yÉ õêÞü,t»Â³?AÙy¬%^êÈýëHâ\úRH^
+ÉK!y)$ß[H²—Qè?ìWÉRÛ@ýáe¶ž%7–"É!r‘T®„-"l—%àëÓ=’HdÁ á%:P¤ÑHýúõë~½ê­Po…ÞWyœèt‚y»ðt4Eíªtµ4·¼]‹¶­dÚÕÖyÛ­,kgHƒ¹²Êè†\3cU¡Ð`-.¬ÕÂÀZÄygèµC1­Òe:oŸTø{»LáýÖFi_8èAΗâÏC.GHïYt•Ì³&j·>—ýåÅϯؘºj:;0ᾉ~d]ELìf¬}5nH5Ò`äaÊáðÂ0«ÿYåTŽ‰G¿f>‹vv2¿¿¿ ¾EÙïå½Ìï+¬GcG;‰£|D8¿¬—±P9°U/,íeÿ‘
+¹^…zÚª™`”Ä
+-{%©+I§ãÌ&z£ÞõØÛ¢ödä0ÇÁ÷x2î'’%åˆü
+¥`Æ
+I pIhä’i„D†bw0±FJK²X7Æ•Ñ"DÀ±ËK
+ÕÕãôxû­_ÇyyÈ ÆoBþOÝ:Ž§HþìÔŸïêï¦Kµ >þ'—“+äñ,é…Ù4îŠ÷½0Á}—qÚJ¿`BrŒkUUëBÓ©Jg]¡¸ó¼Zï©â¬`©…ÊA{èÅÛþ䇻µ£×ÞóÀ¾gÓ[Ϭ ‚Ñ4£Œs`ü'rqÅ ¹K¥$—æ‰E3ÑÀâ“+Óì]Lg¡&§××YœgQ>Z®„ÅFÚ×(‚µ³Ôoi*TU·irK¡@³è=ËË“ë,ß/2ìËãfœO_X­ªþ
+H‰ìWÛnÛHýý_Dêû%,'cLf'6äL&‹ h‰±9aH¢“ñ|ýVUwS”‰•Ë ›…-X¦ÉîêSU§ªW{Ùô¤º</ëŸÊªxš¿+²{£ña^Uåy›¯.ÊE6k/×°ìYÙUøTdSX[·§]Û¼Å;ÓGå¢+›:o¯²ÙôiÓÍ‹EÓ.‹%><:>ûc^¼'c­ºIöS•w{Ùø`ÙœÙÍWeÏš¦êÍ‚ÍÅ¢Ëfãhǽ˦ó"¯
+–gŒpwüžÆ%÷À¹éór]žU·ç%b¦üM‰?¶Mà†¹ Äß80ôå°y·BÇ7î^äeýî\c«ê[‘X›$;þxN}Œ \Ù4;ƒªÿV×Ë êsYjÎX0ê¾ 7|ÏÎa÷l6à³·"fË *P×Åã÷E}¼\þO¤‰½Ë’ož%"õÿ“$zGb¾0K~¼K÷χø»D{g~>+Ô£éã?‹Å%Ú@hïhúKÝ|¨ã›GãGm³ÊN/òeóF‰8ŒM8™¤Eß@Pn"œvùâí—KRwÞÿ¹äõ™içþô`´ƒ¨6õò²ìvqê»”ó—2ñí 2Ló[ÌÿÞGJõ°n’—«B¶«!>>ÉOž\®‹“ÓϪKõmcßm‡7t?Ø.óöí^ØI£ìbÝ.†ÿŸU5‘¡Ó†³ˆÙ¿j•—Û/¹hÚ¿ˆÖ‰íw5«œ`oª1,b˜šë“tÁ„Àžã7*8ÿláÞD{½¨‚Í&l(Xß¼Á£Õã?W9hé¬xÓ´Eö¼h×q¼ÿ®M÷;ÊðÛ×G§w|'Á;MT”0{qøIÄàç%ܘ(›Ý§o–I­äDi«<ûD î_e«¯¨ìo4;ÿ£óædÌK‚Ƽ0%¼×(zè÷Äø±_«qw#æNÚv|‰¦U͇Lg«îNãî4î37YüÕSæ꫆LqÛÄx7þ šùîæ—U÷j –§å»UÕ«%E.šÇéCñ™ï΃ÝÃÉc8O@Ž»Õÿ:øÙ¿~\/ÚŽìZãw^?mê“V—õùýûáö¬€B8É«¢ë
+²ýälgkÇ/ç°{ݵ9÷j¼~ñ×èúýÑÉâ&-ãß/Ê®ÏvOv&ôŽ„„ôÎe¼O \2?šeób¡™áÞ‰ŒVÍ•ëdz´ö?E…e–aò=ÞpÝQ[u\¦¹õÒ*Zzß;—V^åi±sÒ K­ñÜl&ÃÍbD…0Þ3ôÜãLöVlÿšŸu—Çõ0T‡èuÞÒT%¬Pø:f¬¢ «3øˆkáÍÁK!÷¹—ÙѾôÙl_éDƒ­†(æJ(—BâƘWôÁÐTμc¸†+ÈV
+„Io EHʉ‹Ì9‹&Þ€ã ã
+MÙ#À.€
+©ŠV ‘ªÉY-‰-ŒÒ½PM”Â4G%Ю‡†p‰†8—ØöP,¡ºµ¢×3©<qËÔ(zÃA
+nÐ>zDEІÊ$‰¦äÚkI9Ã]n Ý‹ÒÇ;Ï(*‘d­˜¾E,cN-ljk„ ùo#X§\S‡0œ‚:L½6öŽaç¡ÆÓ‹Ÿ„¡ŠÂeÈ5õE 9o)¡5‘cŽm'æߦ(õí~²€IÚ ØZHý0W)ZÓŒÐwÇXPJj=2ˆM¼*kƒZèF&¡åT–j›hÉVžÊŠù ¨Ä«$Õ Å4;ƒ3g˜¦ïea<ÌÚi|ÄïÙ9”ðl6Ú^¼Á8}{uëV\³ÙqÜ..Ê孛Ⲹ/¿³ zéå»wéxø©÷†e…8jªeQgs8ÖÜŠ3\‹`ã'åûbokOø¼
+Ú÷1¡C1cHŽáhã9Õ;œx莔ü#Q–1fgßþWA `NÅ?PÏTòÎ/”ˆ›ß8·á¡Q‘tv£¥¥¦¢aЧ†
+=Ô’¸©d˜Lö\¿ –j‡rÛK'ˆ/ š£à³–À´[êfªÿvküFaK
+M_‘£¸x=¼`VǦŸÌº~)&kà;U¶
+j{vké 02dÒɵ¿þ¬É rénûØžµ$yךõ®ûdRYŸõ/3‘ »]ÈrépÅN…‹tü¤æ_+³n]¸{Ž?¨µ` HyƒTñV(wfká4Óîü
+hÙk–üR𾔸h‹GŠÄkÛ«¸‡*nwÖ¶«œYJ{€ vO—ŽÀ”Ý+YÅð¦L¬\`fÂïÊ€³VNI@áŸü,[}礽ôo÷·{.X8uj`vÔÈx|±õjÒûÔ~u•jþ9B0³ÃÆrÈm_¡nñ¸@Ýð ~%ŽQ§ÇtdžMf][ÓR’50Ÿ›ÈÄ´S¡ÌÆðÒÇ!kS#
+ÔFØ`Z‹uÁ³rà>]f"þè>'•D #ª@,16®˜uƒ ¨;ÊÞÌ·–Œjäk6ø
+ÑE´…-‡Ú ù9Ù2¿"™|hbn[ŒãNŒÎ Á÷@©
+d‘©øì<¸kV é¸döéRt÷ž‚ó0ñ÷vçÊ4¸^Ïʶ’žsž¨ÜZ– éˆNÜY‡(Ì@®MâëËÎuJ2Æ/-¤ñècç{P’<~80sÔõ^ +>\$ž7Ô5â„cìÇ:^N[„-O’e¡±SÄ õ«ó,àˆKÜÕëÙX¬hj ~LçæNSZaÎÄ«¸ØÌ·sB>5Ÿý)Tü7fžb·eºh‹éjCCÓs•JCÛä›úÓŠO”8ìÏîÏC¸7`zŠ´8ózÕv¿ú’Ï# rúp@Û¥XžêÓŸÃæêÑòMÜV3û0Aw”D[pÙ·‡¥zÍ¡4h]7
+àëâRrÓy•¬sSi·(C\t$ïdˆ²‹°a¦Û ŒßtuUT`àÈ¡TrµÌøþi
+üRjù”’J<›‹hlazÅZž6¯³1›„ý/\YDõc ƒ¿Ë`*ð"½OgÂ.³*´°ÌXX·1™`ƒÌ ‘| *&hªÓ¶˜p—Ús8Ë÷ï‡óÆ<=ëaPù0¢&|Ž#¦uaó±gãò‹Uüý”> ÔàA5|•Ĥ7M»3FÜ>Œ”d:ž$±ûÞžƒ3#±
+€{¼wºÄ4€ªº‚sÀ‰mì§ìrEÑ?)Iÿ-G“™óLŽò£LÊ^·œ[€üIáÿAöêBö+Å•È)·Jâ/äŸTèã•K]B_8‹%=¸çÁÝãe;Ù¯ËÃ,ضà®­cÕtüåuÑ–‹÷ocÊÿC•Ú½ûßx¿pØ”èz/Ž«j!XËçñ|\%²Áíí嘉iºRŠ¾4‘ð2F— ˜-òZ\»–³š•yY’©LfY´î‰!«pó/µåu4À¤?XeB…Èß`Ö»M®Í®ã2sLãŇ=Œ¤—6a„2`÷ùQ;
+?hǺÁtg„Í•r*žê2¥ºšTzr ›˜+Ç6æc¬°1æèöbKљ܎ûPp¾„–õù=‘àȘÇÇXŒ+]D‘©”>žcƒ8#¥…mFY½·r HUª>v,ÇRj¡Þ¦4](“›¬šM5Yª”sl”–{8ù†¤îÈ1žD:9%qéËKd’–3Æ5ÙwP+Mf9–‡Ï„øB`¼$÷ÎA”ˆG¥Ç˜†šC—ç"D¦
+ Ñ’Ð0GPbbÅœ ƒ¦‘\øÁO‘§ý3X Æm#dŸ¼²-&ž¼£ƒäÚ©a‘ýiÇèŒò0mKu¥äÆ
+, *})´ÏqÐT–b9öc—ËfÓÙùH5bÀRhÄ€¥ØÐ
+rF±a£ ŠJ·GÅ5–X°×èýŸ]И™oÎœ_ç°×^å]½`c=3¶ýFMK9üüK—SÞ``&mØê[Ð)‚œçm5Àž_ò=Æ™fåý€ä[Ó^"2vöÛôŽ
+ˆ "y!¨ñk>ŠÞÉ´Æ_ßø¶ZÄär@af‘N$B÷ƒ"Ói5Q2óÔ•O;Å'§«÷ò¤©0àW‘bW)€H*˜
+ô-hoJ‡D³(úsHÊA­Ì¾3Q¦Ë¬&bCY‘Š.Õ¯/KbÆÍW%>šbE–ªŠQ_…c?1!¤h§1Ä`v™iWÒdKŠ~ˆMYµ‡òrÅ„“Æ–˜k²á§€éËêÓ½%/^?n‹b¥ä/jŠoZÄØ܀Ʊ¼>„jd¦õuÄ¥™ø—lœ_ÅFá|ùiÚ²6nŽø89n¬ê s*2(ÿjwJÌ##>£PÚ§ð†B€ñš¢Ã ¥=7xôÕ=²vÇÞ#'³ø¾ ”€-vœ
+¥¬8,Ð(bxòi^£)¾Ñø\+rsѹ™æu|ò‚Ñ×*Y
+iV¤‚èìa…©«S¡Hª­˜æôÉó…úÍ&'M]d»‘ö£ª¹MëŽ÷kV ÆÜ3—pëYQ~!ÄFyJ‚
+“æ©ÔY?ÓQÚè²Ö
+”Üݽ Åú¥µN1¨càÇV8Mnì-{~†;|¦"ïXݘ{éñ )¾¹.Æ´Lgå’
+EŸ&¿úUŠyÝIÂsdFÆ‚‘#õ0Š»y²fBPGxšRø×ïß;ê‰kÿ G<¸á*ß`Y¼‘§{8RÈ*ë13%gŸè <µ%ý÷.Á*£7“#zÿ‰ÃTþßã×°€Ä%Ó*+Tž‚…@$ÿ+…mE™sƒ#eÙ ‰+Ï@}ÈTÀFìÁL„IâžEæ^Ù”ŒcúA("¶²D²å­;¯¦­¨Eä ñIª$M «fñÀAŠ®¹Øþs¨ÿ:^äEÄùcÏ
+ 2ÍL͆Ø%fáj‰tÔ™8í« 7 ?4)ÝûÑÏ/6ZÅ&xf 0é{ÃàÄè•ó’6*wšÃ] Ú¿uû  L.ÊZh;›sy9
+êd}tãVf'bçêïëŒ}ì Ûh»ØýBƒUæA_~Õ¼ïÓêqwÛåZ/'/.zW)’Ý i8õRêƒÓL°aKßK!Ñîx§6C>8Òö§áW_,¡­ƒ: 4ˆm{#-çÊ̯æ¬Ù
+NJ… gsÂ>ãÛêf"Àj
+w[n£í <žý`ðׂûpYÿ¡^`RÓz¬ûo–“?XMà¤ô/—“?XM®SŸ¡AhÚÏ¿.–3ØV­÷)6äÁÚÚPâ›Ð)wõA“X_磂„ÆX '‹Õÿ×fÁž–®ÑmŸÊ}*E‰ñ
+ Wï÷¼Št×NyñéH
+«î(8iÞò̈\ìÑc Bì ¼`©"™Þ6èO¹lµV¯­>½ayðR'5¥šÍ°üˆÝz ôÃùi¼8éƒìÌv"h2ºçåǘ¹ËÑU2Ã+æÞq#ôî¡šÏ)€½—ÜÝ"ÔƒT°·q–Yê,keJÊ`žRÔú”±Ê>LÃÞ3%†?¢ñÌOgj:qÒ‘ÇŒãRñæ”ñ¬‡‚%-cÀA&µlOÐJ ÆwÓØßtAx¶äÂo¤K°Oïãwêb’ç,M^§ ‹™O¬Õg7Š©Q6íÂ]lÔäà.N5–ñØ
+ßêB2ÎÜvåqšÜ:3° OŸRñU×n ^§$päZëX—§Œ ¶Ÿe/¹Ëoðõ Ü|;t‰ÒC–çCQ;Ô ÐÒëîÒš‡d‘K…å8_ŠŽš$‘‹6l~îâôêY}—ùSqŽ
+1EòD»Yç`J#;É«#u<0Ä"7ÔÖ°½Æ鵡óšLOßW} œØè†ùë·?ÖG†ya>¿õÍ„Ì¢FóX(C¶B!9«6:°YéqÌ­‰Áæ~‹
+n¾– 47_G µzÿÆ̃“¤Ý ŸÔóý½ïä{6-6Úõ.Vxï/à."s”ˆ
+Þ VLpG!DÊ­b<»ý,ËÙlÜX¦o$"›B—ÈägºÉC×E¢ÐC¬Aó•:¸êûwù>ýñ—†úNVOÛ ;%ØoÚgü_åÎ7+"A¢‘H"ÏÚiïLYS „âL.„Dáiœ’yû?Nÿ) ñWÍ슼¦ ¢à<F‘xWä$çLS—–)qp—x£˜©ˆ¢ð".̓«o¨æ¦iÛ”ÒxÇ:tòzËÒqÊêò¶Åé#ôË°ÚîG¯ÉƒWn·ûMøš¦h:ÉéÆwrLÛÿˆúN—Uóï^ß8Il¨KíïN9•ÕÍo¯Oj¦©mÿmwºh„þ‹óvEÉUƒ » át1W""ˆKÎRLÄMSV%ùw%ªˆÁý?NEŠb¦Î™šŽ,e^4ì¿ A[ˆxG·¶¢j>"}Ãq Ÿ×ÎþÓ,d§ÀKšŠˆ‚l?qBÜIœ¬"òU (ÁίªÄÔl¼ˆÈ¦mÌ!
+ÏL€ È<gƒ1,~e¯¡BÊ’zqsˆ¦Bê-8¶¼„— ÄR7ªö¯úBâ}Uæ5AìA
+áŒ7±®y]v:ïÇ29Æ=“SNÿRÎ0‡âb ‹ÿþ+]YZýܬÎÚÖÿ9¯ò¶´.ú øA¥âawÁE
+ˆ@íëîH I: þ´Ÿþ½“…œLÒþÑç±äÌœ¹Û¹÷šúÜ„Ï£ѨÕm4à üöžiH3LÞ±/<—v /Ž²c'µr"ÏÄ–¦jÒ„h3\wh¦+¸‹ M™{Î,؈ÂH_°Š‰@ÀU˜ì½c‰æä
+M’òD:%B&îO泊dň „ö¡Ç«†]Ju‰²ž+h
+]kÿØC`Ä´ÊÚÕii|C•`hX‘‚sRc­Cɘü‹»|]ò±£ò|æ³'dŽYÑOønµpó_§š¥U¤„6&!!€ì×\,¦­E)žkšB·ÚzÇ-˜×d(!xÃ@ƒÁÙkM6ªýG§çßqÈÃמŠVf/ú¦ª³’=lÎuAG*V–QMx°ËѨÚßÒUÙz"ŸÂ¡nkfKÂöA? i–×iƒ” ÝjÌé;ŒÊ,R>ʘÊú
+’ét“R]"hº‹çu6’xäœ7ÚØOè’zÐö‡ÂàS¨P½ŋ+óùÒŠÏ‚A¡.³¯Ò,¥½lö%äʤS6_?†ØÇö¨ìŒ[<5hsuÈY(@«óò™my1²9sU>‚~-…ã«Õ
+IÑjä#$kÓ1 ]39Þ¡H̉m¸‚$G³KY&š S‘¡-¡¥öÇŽYŸhä* tÍ—îbä‚Å:Nq“ÏÁ¼û¦P6Ê‚Ý»Bqï| IWx‹—‘Tƒ—Ä€1}›K°}'éá~ppœ·ëãÙ4…U4P0Ou)Ê0?•h‚Û*íF”3ò¦l.J)`°  ðt§YÖ"öÃÁ¶Pã$âÊq „NF24ÿ±§þº°Ié67@ÄàÄѳ
+þqŸCK“w,Í>§œÁÀjæÄÝð‚&M{Äd”EXðï´Úg®aK—Ï \Õ¤sú_'îGB²ÒÈd„8…Š{P¨Ê’é+zû€Ì
+•†P'hHÇN©C¡…‰/Ï¿È{¨ ƒ‚P!ö¡>(À—CËLá²Óûk*ûT8—7ëød>£$=lÎu¡‰Ôñæ ¡£és}áÛsM³8USº «z:8cnõ»Yì:¤æ” çC^™BÛ/
+³WÝ#õ2Ù¦}%ϵ@z†Š¥ÚF†IúrúÖ "½Š%6rÉ£'¶­åø³±>Á]6éíÅÖÉïY“Eºs¤žx¤—åTÚ>}8»a“æïïÅÚØf’®ÕÆ¥î,{Ã"%ÄÚós-ÀÖâzbª¶.‚H‘Xß}»c“ÖÅÊ&N–î-ÒXbÕÁæúî©Cz¿—\qði;ì¸÷òiZ["}(‹ÍÒ^†’n¯ÆÆÚÖŠ]´—Ú’¾š¿ÍÇ@Z\/M‡µ— ÒªØÚ~>°HiŽ­ØÚø}xö‹´»LÒÞÑf.ô÷r"‹”*þqOì½n­±l5Ö®¯pûña+É$½ÛTǤ½ÉíÛÀ"%¾ÚúXï®õ2›´™Kü¨•Ù¤ú÷5)h2¥½û?ëUÚ–8EAD -[Ùq@Yd“QTTdðu`¡ðÿß$ ]BÒ¦2_òø{—“{Ï=wX“¶ €_nOÅV…î´]¨ß:ƒÕéàfÑ@Ná|9ÌuÞ?™^1œ¾ž'Úß(Ýé¯ù×çMö<M8^Ûa#ºd¼‘ï#"Ãi¿›¨þùlRžÿŠJâÅ
+x ¸Í­É¦Ù φØé$"š&ô|=#§©@!X·gz…s—Щj:^ [`v¾Þ“~~C:ÕVJ;Ý#D¦âëø%¤;-õ“ ;ª­[à6vÈJ(Ê8-o¨°.êN‹ÉV” Bõ+óKŸ4i®ÜBN¡ìÖ¿ÙŒ'Kè4A8Ýl.g«}ý6E©v2ÏáISÌub¼Òj6z°~˜‡§ö ê]åm•cÞö;ÉÏGÖíG¢>’wæíóê­(Œ¯Á(‘ò>®ù쌸==Oð­¶8?èÊÓå‡Ô£Ýë¤xÛȽ2oÏSá»ûöcü0;¼¿L)Ï¿™·×‘e1žܼÿ0o ÄN}7ÒïIñõy]©ÿìjúí{`%¾íFþìÅé{RÊ Ö4ï—´{å*‘ņyû$Oâ"ûöµ’Ëï£Üä·3?óv¾½ýª3o©RǼ=@ìsqUxc} Bêü8aÞ6S™B˜ü{9¹¿f}­ˆJã5̼­^¶'3æm3U”’lÄ.Å”?”cÜžÔÕ|xŸs.øƒ¸<t´"¾-Ç~’]YÕ—æ}F˨wö ¬œ˜^ʘFò_xû…×Ñ«á‰N=¥•öKÿËÆc©­n˜e1ÚÌöÁ†9€G þv%ª•»2<žÐþflo:G`ã»Òžù6R*¿b>{ŽM|é
+¿Úm0¹(÷DÇÇÿørªy¾‚S0ük¢¢sU _¡Ÿ_†Å 2QÈÖýsE![{©
+´»ð]·c:¶dp«Ø¬,L
+1:äg°àamÜtŒ,q¡\¶5jd…ÚDc%y‘˜m»ñvø$æÆ׎>É´æ¦Âx©gq® 2s0qhFóŸšyÙ2Ç’ {yßĤî]=ÑzZ³ó4¬öʼ!m‹M欼¹ÃñðH:[ÐíŸNù^0ëwnšßö‚KÙQXxx¿Úí§iJ¯ä#ŒÝ/9â]ÉeÌ>P¼Æ¥3¿a¬ï¼ÄxIÒªêŽFl¸ù‡ˆÙÍc\h¾˜T1:Û,®Û‚öMulÆ
+¼€xê´e%h©:Uê}ˆ.<fØô®Ü¥Ö•¥ÞÚï.÷e]!t—“*å%ë‘b²umb#ÈßA§/)¼Ë‡¡-It
+š1––4¤)è°Nµ_ÜŸ© 9¯xD ¸’Cqa®@mù=L\ÚÞD,saŒ¨ÿê‰÷rì…³‘`çÖ–ÔôòöàߤÚ$£øeÄÓ€5_õà ³¢b” è a¨ôÁh†³ìd/Aù¾I
+ÜyHA~›ÆU~ÞìGƒŒùòX³iˆS™•AŸßliÍ óL³ÀØ£è‰d™I³ÀX_:–f¡n#¥tŒ@¯F^—ƒaÜíðI{¦˜ ´^¿w|VïI©O³f¥7;¹à3£s$¹¡.cì6tÓ÷ä,ùE º°OCðkô}o)Ò±t§½ñõžhúž6 Ù}>yÒ÷´YhnÐØñúþuM›…^§|5g}Ï7Å cô½ÅŠ1 ¿?ÅŠ¾§Y1¶W†Þiè< ü®ž†¶Y8ܳy¿; qö¹`‚ÖÑxVÆ?V‘<°SUõÃM 7Ob…RÏV2‘¿µ!{¼ÝíÜÛˆ“±c»Û¥·ÍÞwåZ;b\rwÿ’Ð k#oãêsdŒ¡k
+r@ä+áµB[‚X,âGETÐJËÅB÷ÿîn’Íî²›,Ð?yü!;3gfÎœó#g~+'pCu&eﯡ+ÜÍfN{GÛ)j6yÅT3 ~ÖžçòÎq«7*eØ}å|çø#YÈŸ>¬mû$®ƒx¿Np<‚šf'Þ°×£\–œ*hæÄø}ÍEœŒÂ©êÝâÏ€´ÔuâÍiQ´ÐüuuC»W¢Ö#U/¶‡?EAßÉ ¥›ôøªvC}×uî¾ÖQ'ã@&˜ ÀÕebŽ+µþPAÓ}aP
+PrýKØcÎìÇÞõ)¬0ËT¸k}ÀïöC÷Eôüö)¹·r3©óÜ`Gœh®I£W`->Û€'^4×pd³ ×4`d+HtŸï!Ó:š¾Xî®Â%)C­PÃPäJô ñt)SDþôÜÒ¾¾5x¥A†Ùô´Û––UÃKó½Ø¸›ÓE luçÑUénUœ9G“ zÎ,ßN½ZÐ'Aè’¬Kämª‹ýi`Cx°l ÚRÖ4ʆ4g žryl«Çd‘£â"voÆ’©yGN~mnezÑVŠlï›—iüx\ÓM&œüï圜—ø¿ÊR—±4jå6S$Öc‡5€ÓiçÐûxpdHÄ<­çÛÙñÞà<H üöŽ_L€IÞVNXBÙö½ÇÉ5E(%º¿ïV¤ìbPuwv¼Q"nR˜n¥Àz‹ñÀBP)ˆ cèä#“*Ç…)…KiÊ‹yIMTQR_pë¤ú‡ÙoåÆÍM2öÏ<»¿í„÷OÑ$;hcù¹Ã0:Ù{,ÊcHO–]<¨M›è)Ÿ“÷y,zâå+¾&’­…͵{0ÚNˆ¹çÔ4£öÐÏÂѽÂCÜ‚«Ò ôØn¼ý¾.;½ê=P ÿ‰‰˜/˜'ÌâôEæ<12^Šð3
+Ýî–„ÙÃŽ/ÂìýnI›=ÑŠIQOƯûpƒ h^§ù²ËÍÇž¢ï‹/iøk±ª:‘»ßù«hpˆLÜÆØ‹ÁÚŠ& G˜rÑÊ…-HÙ°W!:²â°:ò,U_I@®h˜¸D“<½@žH“c•\¥tudKÞ®
+$¤ñ쬸×|=v!»ñÁ¾ õØôBzãÃ,%H©rÝÝߧI>|ÆJˆG€5…Û¤Dú˜”!K)ÑË}ÅBp*ɦä:¾°¤ÎsƒqòX_±z§Zn%¦þó6­Ì8žŽš±ÆӬə±6<é5c¸tjðÓ:|.…%œ7…Hœ+š„m0•œNî4Þ!£5üéñÖÇWJ¨8¬Ñ÷(-Å+ Ý}ÊñŽ»0oþµ
+H‰¬WéZâL½‚\„`¶
+b:TL]ÃÏe;DÙXÛf± 5?áWÚö¬àÿ&¡‘ÊÈ9ÖXè±¢\õy^%D[
+šÉNN¤òÖ†¢ACÑÑßc•È艔NèÃL]¦<|Ü |ŸFÙPšuš¡ùâ"´hÔ|ÏÊÔt3€éõT¶{ÙÌeöZôÑ6[$Jc|W. âš'Æ[|ˆ!Æ÷ìn½£ÆŒÅ­|9ŒÙL½ìJuËì1R7Ú
+ôw$eb»^éBçÐØ0àIæ
+ÀC‚×cå„ËYt`L;‘Èu)'~¸!f=ÈX3¢;;–†I—É}k©ÃCÏŬ¥Öüä5FáçxCZy–Æz ·X7\ Bu!­‹¿©du#ùC5NËëuá~¦}ôFÃJp²S«¹Ó«¿ÕN¡©^%·!0ù«âÏAå±:èTÕõÕïÚYç¦\JüW.—’u{Xîבø‡|güUfBà{7Ÿ‰äæW-Ø]~<Y$¿¾BðJºìïÖë‹“§DæöíÂD9s
+‹²ÖÿB}žçüÞ9é{/ŽofŸo¹,f#Mã{huÞž„èÝþJ*TwÎ…:‘.×Ô!eÍ;ÚI…+XùËÈ¥mŸ«MiÁ¾TùöõSE‰–Þ«6u‘&Kø ?—äQß”V!A¾¸…‰àÀp²íBõy^uìBãz­8õoíõ¦È¡I!¥_v¥º#$X:N٧Љ§Ò!î“‚Â¥ï7pB(5/ˆ´“«„v¼M`Ò[`¨0R©! žúia5§§ül“ßÌp°<N~N5îôáš#$§té1ws¾hÓ-'NmKË"1…~ѽrµÓ÷}§þUõ¶0æå²â‚Meènà‘ôKŽŒØ ¶õ}@/àë ÐõB±$²þ´Ô¢¿Ç*1µ¢R¿¥êd”œkjñ Ç)‘š6’%|Q9…¿ddEžN æ¸ðˆªå^«¥¢¾l4FçèV—ô®„
+öðÆeª$½s â,œÉ®çóRSõÛˆ}É"Ó.”åH§Wn}η‘GUó+4öª1ãAþ”/G9Í]9Îx
+D¾f(D¬é(ÐP¦@õÍÏ“³…|yY~En4
+à±!†]ªÙXÛVäÂü×Ò! Á¯».C߆èzÅ¥¡Õ@¦J7÷m+Z¶¸{?§M4œc„ âV_ôåù¯IÜ iÉ;\÷`O<,må˘c„ rªâ²¢á i¤+%io¯ŸcÞãâ"Æ-O'š«$×Ïœ–ö
+®õq|”fX;÷¾/cl9(x4ö½Ž'#æz°ðÇ¥ûXˆ±…¡+b†ÌÛ7ZºÔÄaëÞ™M\ƒTQ™VT0ÄbÖ &2«ÔŸì¼+OË
+ ÎÐz +$cŽqå‰w 5Î
+êyõMœ,§1~mùÀ ¿0]' §ôË®T÷42áÃ/¢¢r³q\D™ÓÜÛû¦r„?—”»´;×]9m&$ÚL¾§Âµí·&£õ+É.œ’üóG,s€˜ù¸N¥òŸZ1ßjè¿uÁ“ÃIDÒIJ äf‡S˜’•V—‘ºÅAÍWé#ÔJ,ñiyÐ;ú ”ŒiI+“s‘`x€Á9KÆ·ãLÄ Ò03tûÜÌoiGûõjCjã&ß:a;°$üu”‚ݲŽÏ æoz3»
+»ˆA%ÖUbðyrHnƒ/VOÔ¢›ÜâdÑíH͒܆‚¥w:+µËoÚô˜3§òþqAÅ•hé½j»+¿—˜åhMMÝúÁ®üq—uàå-~tʶ€†èàšÚÉþâú7<C0—;3«2ø_ø“š³ r¬:T+­ùIå»’ûɯW 4UÜm
+ðéVh*i™BJ‰8ÑáÃÖ›ÐXÊ•õÙç³Çú0€·o;ÉJ¬>§Áò›ÑXW’nÇ7u+ø kNK‡ ¹Kd–1\­’C2Ls 3†KÍ‚öðåØ|úÿܶtLì@àe")_cžEóëÑò 3ûî¢BÙ!AI¬‹ýdˆˆHTÿJ!W;}7½tá<P[=fˆeìÂÄÃdÆoæ.“È!m»ÒÆxpUÙ DW‡¦nw<ÚÒ å ƒÆš'þ¹ßµ¼w°¿’àò/' +›ùfõ9í¼…V}OÑÀ»’dÇUÆsE³'¡¹+_oŠ{;÷-³bî­{@C¹‘6 •šn» .hÉòhùˆL aDC ‘‡†  ?W𢷻ú|¿= ÕçÞÿY¯ÎµD’(úýÄn‚dQ™fÈ1aVVF÷ߪêTUTjñO~Žsê¦sî¹4s¤:Æ¥aýaäßÛƒzïAC{ÐFˆ„„Sú*Î. ½^¯Ç3 Y[ âìOCˆBîB‡„@“=Y{¬š¸gq¡Ì»Ò3-´=0¿XêY¿¯âÌIû¥Vº85Ɉb×+5^·ŸÍ= ø°rmïz%ŒŽÈæ
+'ù-Y¥Ôn1)Nšˆ¦¶pQ’óe¬hÏPoi;¥Ò4a¯@Lå.ÖøxÅ€—o~’LFÃa€{ߥaÁˆïа`HÁ¢!EB¤0ሆ¸ p·¹¹±R‚¬þ¡/Ql‹™FÀ²à#+eÁÈÈ’´¡œ¾4}aXNeäàÇ‚êë:•C…•<¯CVì6ß_½+A'›ý7õ»’#\ãµhÓz3†C´+V¼ ˆ‰P2† †1¡WdÖPÉVincáý‚‰»P¸yºIO‚z‹½p)ÀJÉ÷cÀl,NN…Iê$˜Á…‚¯õŽtûÂؾ,«œîtYPÞ=Ìt“-ß\õd[Óí$çJÚéeÒ ^
+ÆY™Êpl.À}ÆLPëA¦h $ñDh!…õÛäâ»Ý#ö{¶õK$7‡­âUm‘®V’íÛZ`Ö¾ÔBµrìòª¸|ŠåÁOÍþ¯ä§^m Ͻ䯙‹§õбð쟩p|øë›ã³ò
+Õû‘;JÉÞñ»žJ‡Ûõ:&²Ý—Ÿ¬G×Û§BšÔdâÙT#íqÍ‚GƒÈ#çÑÑ÷Q‹¿ñ‘åæšjê§ÓÄûÑæ_üÑŸ¾ˆû(È F/pÿ0ƒ=úÜG7úQxí<š%=œGŒòý_Ö£ZøÏ•|Ôߘ$¸¦Ÿ}Σù@(wV{BZ~Œ,ðXðh3˜ç?Ú¼ܱÕBh”Bçÿõ&ìçFþ£Çgþ£õúu=jodðlþ{ÜùÉüËõ6ZL’Ýçü]¶šâþâ¾ýöS´ð[1VX~ÖÝ5 råhÓiÿ¤£Ú@MÆ—gÕ= vÉ^tÜó‰<AQ#P7Ï0S£w3}•ªíf€]üÀ}D¬—a:%ô˜N¢þ°h0d½F{^aHp’ùAU×TPdHBÊ>Ø{¯Þh!î By]±Ó!u·Ü´³NÑßÓ:³NÔfWlåaˆ .ýßR§¥»ÒíîÓKă™Iþ4/ß…!™UÒÔæ©y³Ü'?¨üv†éúã¦É>½åGún_”‹Nj„$$-$
+jºùž9
+Óˆ•'§‚Œ·ºuaY¼28íœ4h…á4~¬êä–lòM3+.¡»
+¾7ÀC^¯½û0cŒY ¹¢ÿ‹-xtTct·‰|›uYð‰bŸ›$Í襦y×ʼnOV,{Q!ÁŠAe*w'mÎR“ºq"¤€ª”Û<G 깊—6ê˜1…– ½}úgå‚Š•šMÆ×ß3 ©Ùëì†Øû{m·
+qÁ‹OFm•ý*ö’ö¾©b/ãîÛ*F)Úžëæ8`çJiYîЪX¦2þ°õ=Ç,@~ÞÚ»Rê„™;@Ì}
+
+urC‚:&3(Šuš'¹# …®ŸšÜN0C‚¹ì•ñbT!9zàÜ•_®SN!$lï‹‚’™IHPǬ òÜ ¬íÊ6yå&v¯Ü·6ºrÍIV¹syWnÝA‚+ù±Hq‡y"”Ó ‘¤S6щǮX6XH„qYphh‹BÈù „ løºTj®ƒueA’š!NÍüÌú0j[ÙµÐN•›ý7yVa3+öT‚ž“ìctKšP{K.‚ÝÉAŸf'Œ¦Þ•»lËOV9ï…Ù-‹µÈ¡Â
+p8ãW‡â,g’!uY¾À±ìèÿdËWŸ)Ò°whÃN?`‹‚íÆy–=[¾Žö†¦c<¨ÇÍ•nú=… ÛIk¿¸±ƒÔ
+†÷ÔàŒÉ‘¦[2¡œ@Bi*+g¿¨O(ìùÍÒSB&÷én¥^ôÕP<œ2â.|éIPo¡L§ôÅÂ䈋VRK¾ë…Õ™näÕá°7Þj$íÑïàªÛwÑUÑKxëån'‡—±Òâä”ÛISat¸ÔãNÖŒò­ì±Ø9uY3Áv÷·ƒÕv©÷åƒ÷nÄ YBa0cBœt´òÚØG
+Šò´ôøÑ8 d¡hÊ82í¶Û’Ûi6âB:†ÀˆÖi5u04qí=ìƒRQ\ ™£z©A¨ê§ …9Xï‚e
+b¦»‹È/åë,ªTJøaXg’mVB¿êu_Å_Ù,b2³Œ_NQJ<\;¼V0ïRÆß,Y³ûâÙI °Çm¥£Z@ä`sK.X6ø£Óݳ›EV íkT«`DÅ(š*N|Ÿh@.6ÎÁ·dŤu‹yÁIò¯Üù2V´g!öeBÒ0ƒ7>^1¬íZì%œ<Èx¯(MCð;I#Ä4tHxƒHh9¥¯Ópô¡`çµ ˜R$tn1l‚jÓ×âÜx˜»šD<)˜ çèP®Ží…“TÛbRœ—†”µç{[a
+ÿh…{ç«Ááj1º×BG‡‰Ü¿Ç½Æ0ÑI¬}‡Ýfî©2X\—Ÿ/{ùÛùÕììpucÌ^‚·¿#¹Ú«ÿjÐYþþ.geã}5þŸôê\O\¢O‡0`ÀظP˜bBè º÷¿#¹²©wóÇŸeÉG3gF£3·GRKï"DçñÞç‘üÅù2(•¨ËÊ=í‡Ë;ãì³Ü)¬¤ZÍç6ÁÒã4!¾ÛtBò¥ùB¶œå /ó¾ñ64mók§h§tr#ê)¬ê<—ì^4-D5é$ì°R%æÂðùü§†û8úæƪïƒbê#lC¼_™Ä2ó§,?Œ%“¥¬]¦Ȥ+‘…É
+:pŠ‡;}ã }~„aÝ»”HEDCQÇVǤ…ýDëKÔƒ€úS' RtÕ#úR~}eõEóˆŒpžxP¡9M˜+5<4`çý`ĪW ¹êóZ‚Ù&ƒgE*r·07m²æ.<å‰òâæ™Ì31
+²ƒo{p"š äßâêm$ƒ-ýÐC/ÇèD"§'ûxø¼ü"ï@8÷)A·âZ$Õ
+=fnG ?:uY‘ê?8Uc½h~*y‰iaB Ê"uY¬M×;Œ01§$QNwX¢\¿$ ‹Ü#ææµ°ñ¶i‰ÆÛe06´¥˜§fãM| #ˆ°1é§bª¸'›
+¯ÿ=¹4 ì)Õµ²­/:¬™Æox3ÖY§Ruø2í2ºiâÒ}óÜÈnØ×@¦>©äÊ%âÙ.$ø@b%„6õZ,TÆ]‰)”ÈKiiÚ3â°’Wl…°µ’7>o¹Ùkd¬ko3[S“›£BnãšgÍ¡ï†Ì«Át]Ö qtZqÆÙ?"úY¼–zn˜uÓ{U7­²ö¾nš·ªœÕÍ»QmïÏw²Õ‡,µÑêPA#J6ϳÍ÷uÓ*ÌFÝôaÇ¡¬E}¨€Q7f®Bù7Üè®i=ªÙîøÄskËýqÕ½’'¶=ó¼Ÿ=u ª%,éAËá ía¢
+‹uÀQu¦¼¨õÑw­Aøâ‚ú>úh¢ì§SçÔêÃï¦f@˽†02©Zßã[K@9]†Ü¸m+òtY\UÕ
+χÕ2
+DYpVÃì1‚uòk Õ>Ø ·ÇW r}˜AßSžUn &Š… ^\ãÃ
+gb£ZŠ¬Zjk½ò/PRƒ?N%]áYŠÙ\"Š±pÙ8;C$@´$÷†O¥."~é
+s¶¬ÄßÈÐcî‰_»,×h§ÌÁ‰ûg@iÈ°×
+ l,³˜‰C¹$ÒLæÌ£-×dËwC¡ñTŽjVŒ ¾»3"I¥¨÷ô¿iO\ë¿ÈEnžç»‹ÝãâqõKðœxäÓªªvWwëÒn>¿œÿÇ(¬g‡—ùÊø•ø%ŸvòÕj<Z˜ÏÖwsøÏz³iC4³ÕÌïˆmhÙwÄpÉ\¹ÂýqyYñ·S7…{ev•U)›Ë­Wxxª@Cågéª×^A+u¼le/àã€vy
+R$Ð"Ë[z–±X)ì/Ìw¹C‘¯×®
+çUoDz–’¼VŽ§—ehūܼ•÷‹¤\9ž†¥^'+Êšôdø§™7!D @wÚ_ÆhÈJ zgî´¶!c½\²¡{E9Ôƒ8—ØK —½—ÍâÛ3/ßò5p 4d¼âiäUCÅÞúA–Ýlãnªj¼YrN«+M&Öq7ׄfɹt6ª°X`Åô¶&_bùáßvùÉäQ™ßLXóîiNÄgªÐ–ÇGÞ|L°"2ø‰x_ÓM÷Ý„aUrU±häæñtŒs î¤S¼Ë€ÍÚ2ä!ÝÓ«¢ªÊŽáÇ2V±…Âß“ Æ
+O&x˜ÏÛú¿#Pèüÿ§L
+§?`KÞdËfðÅÍ–f+i¡¬wDŽÙ2/
+ø¹P(yº»ÜÕÈAÀ…_™”ÝÎ’%Oß‘N÷%‰t²$½^õ}’mþ«-“¤
+ÇQЭmzó¾YrŸ„UÜ{/ÂÛø~œÅÏq• — ¯ÁîmMâÂí@—%½rú¢Ü1«Ân—Z‡I¬Àü4¼É<¿Û%Å:II¢>4öxX÷uK‘ù½L.P°\Ì‚n]Cäd—µÔ/«ú^ÚÆÂË2Hvù1Ý-q€‰–&yn½ëm­wƒüx±â#drJ–¤Ü+¹{ֹ߆Ê.„ƒOž¼´Q‚xÑÔGƒŸNž» v”ÂpC‡iJ#Š
+ƒg¯Â7P‹| DG7×Äàa86sýì
+?ÛF^’"ˆýãmtò7N㳪ŽðOrZò ÿƉØw‘P…®*~µ›dÃq¹~V©·]lòÊ»Ûø&”ª¨ªÄÁÞW®ä,G~¾ÞE¶®/˹-g~YzR/½Q˜ºóüfúaŽ@a–c5]r|˜cŸºg•ŸæXèýYŽ)+îƒû¶‹/|™ nd¯sl“~rª°HÉï9€û®‹rÍ÷u¹¾ï€œ>ºè²ßæ¾÷cKïC‰1x˜ïœÌ/+þ³`•ò&ñ³Ó@Uû9”¤¿|¶ŠXúgµñG G5Õøj£’ik_Ä°K˪«#WtCê&].nÇÌÏzÀí‚ç­ŽüiŸÄ°Q?Nª71˜µÿ6ŠY &þ(#fbJr t±åÈíâ(ÿn‰ƒÍ– ÿ9ª²D$j¡´¯`ÍÑJ\ôÎôB†Ÿô ‡›r-?:y†ºþÈŠæŒØWüd=Kë±0CèVå—±ª¾Ô`lM‰õ•=WNøb¯_Á»)Ÿn>“±¦Àòy t\• [çÄ c­•BÖ
+ÌX2±â*ÑX˜Œnæ¸M ävu sn4/Y?–äRQ«ÇÁmEá s(±•j{ÅÄf9·áظ!r.ç¼ÛTãgö?¢Û0ŽÍmƒì6lò Û º ÐÜÃð®†U\o»ì­õyCpúmÈ”„¼¢ÈóB
+SÑáËÏo öymøø-Üôr¿ßûÈJ ðïéŠ+õïþæ?Ï›g¸Ì ¢Ó¯Vçß\ü{}x³¼»¾X­›'OÀy{±¾{Ïáôàâòjµ8»¿¸m¨Õ?ƒ?þŸJK6·6,sß73‘mi«] »œîîß®¯–ë«›ÕÙí}»Ç¬ãW‹£‡í^«²§}ÖÎ`9…4~Új·! OÓîãsü‡ï¿õº1]
+Æâü.¦³ÂXkACÑ‹}Ð9kL5‹{,^‚ø¬-™öUû݉iÏyó7M4íQi¯›J,˜ˆßqJèO?°1«†ïn B™¿ò½"SvJñoÿÃ3ב§PÜV»ûv}{µºlgûKÄâÍÍúŒE'¾SïØ%í‰Ûo;Ÿ½‡ÉXv”¬yÌqÞ[åx£_rŽ Û¥èe“u/lP@$|¨Ëžò°ç,-©ò¢.aZ $»g2$œƒ0‚¡ Ÿár>Îu¶Çç.:ƒã\†Qfn=ôëñO=z¶tÑò¦ƒ”Åq%0'Õ [ßã‹ì3âƒ-Î3Ä»—ÎÆØjk;›Jž„+YI8Å5Ù˜œGlÀÑ.ÙXyì²]ˆÙ‹ ž¼á]Ž)!‰Âêë K.*»—9†¼p¼w^8Ù¡Uϧz)rŒÀ¡@*•œ½q•‚ˆwøÍ9§Œ,3<.õ¤ì³ªQʉÔê˜XMh—sêiÙå¥.'q¥ÆÏ ¼±Õ'vbw„
+JrIã
+ t¥3”%K‰º„0¯8ÃRž3šï&ú2â z§ !Ù㣔…íDduJ±¦ {N‚$Iã;¸Š3ØtÙÂiœ4©‹Þb |ç%¯7±¹L·çÀr‰Q
+¦ct÷¨'”@ÒŸœ×ƒ£W¯+A¤Ôs“
+óÄ>»k&”´Z®¥‚ÂÈò‰Éj!ò]Q)Ññð#%Àâ\*ŧEž"Z)À$eÿ°Rzôœ-M¤@’ëà8g|ª™;¦/ǼqÎF¹½lɆ#Lã]9óFÍãÒ¥ø
+Oˆ%ûv¼¨7j
+ëõÞàLe-qìyØÊ
+È¢y›ÆÀ¢4qIþćè¢g/<¡\·Ò=‡0mDrÞ|]›U{8 tÍWp4²s“b ÜmÔ2®TbT%Rdi*&iÓè|Mgé<^lQ—¸a”ã(iæHNAÑüvŒY} c\çÇÇ~å¦ùíF÷II¸©@@ƒ­›8÷8ªêY²’Å\û%kê øµ_$R#\ÆK~؉”E1¹~ŠžË ðON¬>|)ÚQ‚ ¢:)y†tø2†’ÄÎÇéì†tæ¤!O¤PNÔÍ ÆØ”¹u124Y†hÈ)O›;.à’F²Y ™´ãƒCüÄ¥LÍ_pƒ¬`.‡údѱvýÊ°?PÝA@ÝÅ >Õ½ÏÊ1Á­ÊÌ.h—²Y“vÒØÂú^8
+Tôä=ŒÕÆ‘QÅÚ<©pÀŒach)A;"Ò"
+Ç›¤Z‰<úz‰±^Ëm¸‘²Âåã !¸‡¨¢ß="´|§3Iò¼¶oæðzaRB”Á
+Õž%ÒïNþ䕳ø<éSJuÁs¿˜ƒ©[s»²=×)¨wLõ’,৪²ÐKq(DZë¦nÙ«riå‹´ŒÉ"Ý.fª*)&Òj÷;\g£ŠŽš2PvW?Oüÿÿ#Š\œ5пè.–ê&ô¯ºŒ¥z§õô/»¥zljU¿êºñ¬ñ>GâñÓ“Ó)ýFÙê!/ôb¼I¥ÍCºÊ°%4~4”aɺûØ
+4-õ‹{,^‚ø¬-pêUû݉iÏÁ>~Ó
++ÆFô¯ã›*aiY3uÅ#¾Xd)­i\‡Û8Ë°©l¡¥zgJv$h8žË%ÏQ3" eµï"«¤âz*ÊFë::öŸV-¸à
+Ô†pàèØšŠrñ×l‘Ío´¦Ð@îݦαYZIsi©JµéÉÖZ´/¨qÔYed»µJèPq´ Z¥ZÊpž–Xn¬Ý•7ä1Ú79pvÝ ä‘«õŠ#e9ÉHÕ’MÁÙÈIà‰L´a*å쀛Œt/ŠÎŠ›ôÛnKWºÙ<sàÈ( 7uæù®èæQ%X4õÆÄ
+‹¥KÅà`¨/°©Çy«z?œtíÑ$']_Ö;‚%„<
+Ϭ8¯p§7gæîÅÒªmµýÌZê^÷VJf`¾QâAžÊÑÆÁ‡ûjóuV„£Ò`M7Çã†3§—|0áxJ]-;¢d´KOúQO¶n‘lðÚ>„£Øæ‘×ÎUàe_"ñ¬ÇãFK5 m{B|4­PF¹‘–[9p ÆÑ%{N‡^¼zå 6tŸ·u>}ã)uye'NÞ¼+ vöX¿"à³®ø†€5ã$àžÌ²#p®J‰±Ý"0·ÀûÓ¶C¸Æ ‡v‹À8½s¨®¹wâ)Mó¢ú~Ý\dò/²ÂñidŽ+ú…›Ôkømug_o;ú¶êäk /G¹ï×Ø˼vC½[ÊÝÒIs·îÈ‹öñ¯€÷,w¾â]lú
+w÷Ð)3t >7°Â-ì†õv!ww°‹;»]Üë5ìîJ16¥Àa^Ã.|ív©÷W°{V¸]Xn`—é
+v•}n`7åvÕÞa7å »)`ŸØ`|4dÙa7_ßu±ªjŪEêy†ìeâ×à@Õ›Su|öÜÏ\ÂÞ¡y«nwòw'‘u«£÷J{¯Çã 1\PÎÊåa²[v<&3¹B]ÔžÝpä“ý“‘e âNA5õÒdø¨Ïì|Ôî;a?êþy?M.êùüåÓoO βíþWA8›ú6–W_Z²'–±´ Çã©28‡´n¡ÄÎÎ’[þÎ’ƒ] L[߬ñâæùM˜òÞÓ¦g9ñAÿÄòÍê¡wÞ°š¦Å½Ø!Á-j¨ñö„"v«•s”µÙ¦ŽËWÕúnc°àÁÿ±ÊÈçÛÓ6V˜¶lŠQl}o±ê;¿ß ¢O„Äÿãáÿ/¿%Üü<“ÙüÌ©<{ØÎÍ?;v±³±Öÿ?LíçÃÖçNh[/»þŒ¿×ÚµŽ³4âïDÒATÛ÷e.\-­fkùÏ\BÜf}} z 8gúˆ—oÑø¦?æËwË?…å Ì?|¯‹}wBZ¦R0;«´ ÛóŸPáàn&ÄhÇ
+ÁÁ‚gÕ€|8:²7 ke!Ó—âX$z—Þ£¹²šCï–Rã{Rã‹b0ôF¦ªÕˆ«°Àêb²’8 ÊB ´Ò7
+dµY×+qÉÕmrUFí”ÉzÓðxÊàAÐè¡Ox‘›Ê] W…~Båkcb¥æZòP¹” ôFx­(®‚v°$bn÷M3s”äP3Iß"N´aX««TÉp0¬j%ú¥Ó?(Ó
+5p‰”Eß‹5…Õ¹‰é›Ûb<ª¢=XR¾XYG™øœ&›áøÈ…¸zûjÌÜ(òV !yu"¬J’ÎQ ?äý‡È\&:sóeV2Ùw¢0ØÆû<ŸÐê£YY—‘±nµ4‡¬‚›Ì‡=‹Ÿpë@ö¸pë“.§©F¢Í=:0ˆÜ»•¥
+¼ÛxŠYˆnߢqGæö#ÐíiHÚ%¢¥´bç4¨
+
+ÂÚ%”êˆÀv°¢ã« "-wÑ÷8a©2¾;­ž
+{ö ô`¥(7‚mè*•R¢ê7hͺÜlÌÚ(ÁX7±4€AÌÂÉtzZ([ÔFœÐÞ+zi¶Ðhö¦¦µ°¡a‘ÄR ¦u`Õ´H˜`@¶é2”œm”\͆Y¶‚-¬5ª—â”ûŒ”-í-œ&kJ3{Ú㨬o+]ÙwbVj£­Ça½Ö4øm_rÁX½´ B¹Ìåá⯸‡›>Ü:E –R[–%
+8,mÅ}ÚTkd
+)f‹-á)Ç O‡ã)2¡Úp<eÞr<Ž§[FÄÎä¢|ž÷À5óŒ='ÔÖœP‡ê™nl„:œP{sBå:`Ê ú³uëÑœP‡*…ËulˆJ›1êØ•e:Ry½ÛÖoÅalâ@ §n½àaªÃAU/RNªg龡êpTU¾«gUZ V‡Ãª2ŽÓêpZB O´ö²ñª^ÛZÕ• Ì‘µ:³ÒbÐZZ}‰V3V+ÙÓ£·ZØY벩ðk Ÿê ˜×ðÙC@t?{p {‡æ¸Ý‰ß<>bȽ„ÞŠì½s\ ¸é6ìšrÖŽëÌrÙåï˜.ÎäútQ{v81OoŸ„o§ÖÖO觖|+³W|Pgv>*÷­ª5ÿ¼Ÿ$WGé|þòé·§è±÷_ÅÝìÊÛŒIõ µÏ¯( AÇSmæ³|«uï\å,ìÀ†;öÖsñ BÌí³4æ½³¯%Äý·7Š BêÝlYùÒü í‰É‡µÞžj÷Šˆ¯µ†ú {Óy›:£QmÀ6áçOœ·§m^¼µ´R»iwöõ·ØÆ]$ìUÑ'‚äƒÿñêðÿ—_üa;¤­ýÙczö°Ú_pTìå‡åÍÏV1ŒÍ?9²}ýìþ3þ^ët>˜í #ód’N¦ú9\¶-¨ikÚš³×·©_Â,Ã,ÎÙ>âå[4~…éÂòÝòãOayóßC„«*[° 1Y5®ZV÷êçCS¿?aÞ¯_¾ÿýÕ/,lÿûþãòo˜žCÿr,cý×òõ~ÿËÓÿ(­{„a
+ÀWéCÝ´I*&zn€:0!¸?ï¥Ôoc¨”Xqÿ”Øß½;,Ëe]ßëóuãÒcwÂÂ3®­*׳ôgQ
+0000000016 00000 n
+0000000250 00000 n
+0000043273 00000 n
+0000000006 00000 f
+0000179331 00000 n
+0000000008 00000 f
+0000043324 00000 n
+0000000009 00000 f
+0000000010 00000 f
+0000000011 00000 f
+0000000012 00000 f
+0000000013 00000 f
+0000000016 00000 f
+0000180537 00000 n
+0000180568 00000 n
+0000000017 00000 f
+0000000018 00000 f
+0000000019 00000 f
+0000000020 00000 f
+0000000021 00000 f
+0000000022 00000 f
+0000000023 00000 f
+0000000024 00000 f
+0000000025 00000 f
+0000000026 00000 f
+0000000027 00000 f
+0000000028 00000 f
+0000000030 00000 f
+0000179401 00000 n
+0000000031 00000 f
+0000000032 00000 f
+0000000033 00000 f
+0000000034 00000 f
+0000000035 00000 f
+0000000036 00000 f
+0000000039 00000 f
+0000180421 00000 n
+0000180452 00000 n
+0000000040 00000 f
+0000000041 00000 f
+0000000042 00000 f
+0000000043 00000 f
+0000000044 00000 f
+0000000045 00000 f
+0000000046 00000 f
+0000000047 00000 f
+0000000048 00000 f
+0000000049 00000 f
+0000000050 00000 f
+0000000052 00000 f
+0000179472 00000 n
+0000000053 00000 f
+0000000054 00000 f
+0000000055 00000 f
+0000000056 00000 f
+0000000057 00000 f
+0000000058 00000 f
+0000000061 00000 f
+0000180305 00000 n
+0000180336 00000 n
+0000000062 00000 f
+0000000063 00000 f
+0000000064 00000 f
+0000000065 00000 f
+0000000066 00000 f
+0000000067 00000 f
+0000000068 00000 f
+0000000069 00000 f
+0000000070 00000 f
+0000000071 00000 f
+0000000072 00000 f
+0000000074 00000 f
+0000179543 00000 n
+0000000075 00000 f
+0000000076 00000 f
+0000000077 00000 f
+0000000078 00000 f
+0000000079 00000 f
+0000000080 00000 f
+0000000083 00000 f
+0000180189 00000 n
+0000180220 00000 n
+0000000084 00000 f
+0000000085 00000 f
+0000000086 00000 f
+0000000087 00000 f
+0000000088 00000 f
+0000000089 00000 f
+0000000090 00000 f
+0000000091 00000 f
+0000000092 00000 f
+0000000093 00000 f
+0000000094 00000 f
+0000000096 00000 f
+0000179614 00000 n
+0000000097 00000 f
+0000000098 00000 f
+0000000099 00000 f
+0000000100 00000 f
+0000000101 00000 f
+0000000102 00000 f
+0000000105 00000 f
+0000180071 00000 n
+0000180103 00000 n
+0000000106 00000 f
+0000000107 00000 f
+0000000108 00000 f
+0000000109 00000 f
+0000000110 00000 f
+0000000111 00000 f
+0000000112 00000 f
+0000000113 00000 f
+0000000114 00000 f
+0000000115 00000 f
+0000000116 00000 f
+0000000118 00000 f
+0000179687 00000 n
+0000000119 00000 f
+0000000120 00000 f
+0000000121 00000 f
+0000000122 00000 f
+0000000123 00000 f
+0000000124 00000 f
+0000000127 00000 f
+0000179953 00000 n
+0000179985 00000 n
+0000000128 00000 f
+0000000129 00000 f
+0000000130 00000 f
+0000000131 00000 f
+0000000132 00000 f
+0000000133 00000 f
+0000000134 00000 f
+0000000135 00000 f
+0000000136 00000 f
+0000000137 00000 f
+0000000138 00000 f
+0000000139 00000 f
+0000000000 00000 f
+0000179761 00000 n
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000179835 00000 n
+0000179867 00000 n
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000044989 00000 n
+0000180653 00000 n
+0000043646 00000 n
+0000045295 00000 n
+0000045181 00000 n
+0000044253 00000 n
+0000044425 00000 n
+0000044475 00000 n
+0000045063 00000 n
+0000045095 00000 n
+0000045371 00000 n
+0000045743 00000 n
+0000046721 00000 n
+0000052837 00000 n
+0000053300 00000 n
+0000071520 00000 n
+0000098254 00000 n
+0000121507 00000 n
+0000129082 00000 n
+0000132781 00000 n
+0000145416 00000 n
+0000162249 00000 n
+0000180680 00000 n
+trailer <</Size 186/Root 1 0 R/Info 185 0 R/ID[<259D0C76573D48B7BC25A2F8F6E260DC><ADFA96586C954C3C9C4D87EC541C2C59>]>> startxref 180863 %%EOF \ No newline at end of file
diff --git a/library/font_awesome/src/assets/js/ZeroClipboard-1.1.7.min.js b/library/font_awesome/src/assets/js/ZeroClipboard-1.1.7.min.js
new file mode 100755
index 000000000..32535fddf
--- /dev/null
+++ b/library/font_awesome/src/assets/js/ZeroClipboard-1.1.7.min.js
@@ -0,0 +1,8 @@
+/*!
+ * zeroclipboard
+ * The Zero Clipboard library provides an easy way to copy text to the clipboard using an invisible Adobe Flash movie, and a JavaScript interface.
+ * Copyright 2012 Jon Rohan, James M. Greene, .
+ * Released under the MIT license
+ * http://jonrohan.github.com/ZeroClipboard/
+ * v1.1.7
+ */(function(){"use strict";var a=function(a,b){var c=a.style[b];a.currentStyle?c=a.currentStyle[b]:window.getComputedStyle&&(c=document.defaultView.getComputedStyle(a,null).getPropertyValue(b));if(c=="auto"&&b=="cursor"){var d=["a"];for(var e=0;e<d.length;e++)if(a.tagName.toLowerCase()==d[e])return"pointer"}return c},b=function(a){if(!l.prototype._singleton)return;a||(a=window.event);var b;this!==window?b=this:a.target?b=a.target:a.srcElement&&(b=a.srcElement),l.prototype._singleton.setCurrent(b)},c=function(a,b,c){a.addEventListener?a.addEventListener(b,c,!1):a.attachEvent&&a.attachEvent("on"+b,c)},d=function(a,b,c){a.removeEventListener?a.removeEventListener(b,c,!1):a.detachEvent&&a.detachEvent("on"+b,c)},e=function(a,b){if(a.addClass)return a.addClass(b),a;if(b&&typeof b=="string"){var c=(b||"").split(/\s+/);if(a.nodeType===1)if(!a.className)a.className=b;else{var d=" "+a.className+" ",e=a.className;for(var f=0,g=c.length;f<g;f++)d.indexOf(" "+c[f]+" ")<0&&(e+=" "+c[f]);a.className=e.replace(/^\s+|\s+$/g,"")}}return a},f=function(a,b){if(a.removeClass)return a.removeClass(b),a;if(b&&typeof b=="string"||b===undefined){var c=(b||"").split(/\s+/);if(a.nodeType===1&&a.className)if(b){var d=(" "+a.className+" ").replace(/[\n\t]/g," ");for(var e=0,f=c.length;e<f;e++)d=d.replace(" "+c[e]+" "," ");a.className=d.replace(/^\s+|\s+$/g,"")}else a.className=""}return a},g=function(b){var c={left:0,top:0,width:b.width||b.offsetWidth||0,height:b.height||b.offsetHeight||0,zIndex:9999},d=a(b,"zIndex");d&&d!="auto"&&(c.zIndex=parseInt(d,10));while(b){var e=parseInt(a(b,"borderLeftWidth"),10),f=parseInt(a(b,"borderTopWidth"),10);c.left+=isNaN(b.offsetLeft)?0:b.offsetLeft,c.left+=isNaN(e)?0:e,c.top+=isNaN(b.offsetTop)?0:b.offsetTop,c.top+=isNaN(f)?0:f,b=b.offsetParent}return c},h=function(a){return(a.indexOf("?")>=0?"&":"?")+"nocache="+(new Date).getTime()},i=function(a){var b=[];return a.trustedDomains&&(typeof a.trustedDomains=="string"?b.push("trustedDomain="+a.trustedDomains):b.push("trustedDomain="+a.trustedDomains.join(","))),b.join("&")},j=function(a,b){if(b.indexOf)return b.indexOf(a);for(var c=0,d=b.length;c<d;c++)if(b[c]===a)return c;return-1},k=function(a){if(typeof a=="string")throw new TypeError("ZeroClipboard doesn't accept query strings.");return a.length?a:[a]},l=function(a,b){a&&(l.prototype._singleton||this).glue(a);if(l.prototype._singleton)return l.prototype._singleton;l.prototype._singleton=this,this.options={};for(var c in o)this.options[c]=o[c];for(var d in b)this.options[d]=b[d];this.handlers={},l.detectFlashSupport()&&p()},m,n=[];l.prototype.setCurrent=function(b){m=b,this.reposition(),b.getAttribute("title")&&this.setTitle(b.getAttribute("title")),this.setHandCursor(a(b,"cursor")=="pointer")},l.prototype.setText=function(a){a&&a!==""&&(this.options.text=a,this.ready()&&this.flashBridge.setText(a))},l.prototype.setTitle=function(a){a&&a!==""&&this.htmlBridge.setAttribute("title",a)},l.prototype.setSize=function(a,b){this.ready()&&this.flashBridge.setSize(a,b)},l.prototype.setHandCursor=function(a){this.ready()&&this.flashBridge.setHandCursor(a)},l.version="1.1.7";var o={moviePath:"ZeroClipboard.swf",trustedDomains:null,text:null,hoverClass:"zeroclipboard-is-hover",activeClass:"zeroclipboard-is-active",allowScriptAccess:"sameDomain"};l.setDefaults=function(a){for(var b in a)o[b]=a[b]},l.destroy=function(){l.prototype._singleton.unglue(n);var a=l.prototype._singleton.htmlBridge;a.parentNode.removeChild(a),delete l.prototype._singleton},l.detectFlashSupport=function(){var a=!1;try{new ActiveXObject("ShockwaveFlash.ShockwaveFlash")&&(a=!0)}catch(b){navigator.mimeTypes["application/x-shockwave-flash"]&&(a=!0)}return a};var p=function(){var a=l.prototype._singleton,b=document.getElementById("global-zeroclipboard-html-bridge");if(!b){var c=' <object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" id="global-zeroclipboard-flash-bridge" width="100%" height="100%"> <param name="movie" value="'+a.options.moviePath+h(a.options.moviePath)+'"/> <param name="allowScriptAccess" value="'+a.options.allowScriptAccess+'"/> <param name="scale" value="exactfit"/> <param name="loop" value="false"/> <param name="menu" value="false"/> <param name="quality" value="best" /> <param name="bgcolor" value="#ffffff"/> <param name="wmode" value="transparent"/> <param name="flashvars" value="'+i(a.options)+'"/> <embed src="'+a.options.moviePath+h(a.options.moviePath)+'" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="100%" height="100%" name="global-zeroclipboard-flash-bridge" allowScriptAccess="always" allowFullScreen="false" type="application/x-shockwave-flash" wmode="transparent" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="'+i(a.options)+'" scale="exactfit"> </embed> </object>';b=document.createElement("div"),b.id="global-zeroclipboard-html-bridge",b.setAttribute("class","global-zeroclipboard-container"),b.setAttribute("data-clipboard-ready",!1),b.style.position="absolute",b.style.left="-9999px",b.style.top="-9999px",b.style.width="15px",b.style.height="15px",b.style.zIndex="9999",b.innerHTML=c,document.body.appendChild(b)}a.htmlBridge=b,a.flashBridge=document["global-zeroclipboard-flash-bridge"]||b.children[0].lastElementChild};l.prototype.resetBridge=function(){this.htmlBridge.style.left="-9999px",this.htmlBridge.style.top="-9999px",this.htmlBridge.removeAttribute("title"),this.htmlBridge.removeAttribute("data-clipboard-text"),f(m,this.options.activeClass),m=null,this.options.text=null},l.prototype.ready=function(){var a=this.htmlBridge.getAttribute("data-clipboard-ready");return a==="true"||a===!0},l.prototype.reposition=function(){if(!m)return!1;var a=g(m);this.htmlBridge.style.top=a.top+"px",this.htmlBridge.style.left=a.left+"px",this.htmlBridge.style.width=a.width+"px",this.htmlBridge.style.height=a.height+"px",this.htmlBridge.style.zIndex=a.zIndex+1,this.setSize(a.width,a.height)},l.dispatch=function(a,b){l.prototype._singleton.receiveEvent(a,b)},l.prototype.on=function(a,b){var c=a.toString().split(/\s/g);for(var d=0;d<c.length;d++)a=c[d].toLowerCase().replace(/^on/,""),this.handlers[a]||(this.handlers[a]=b);this.handlers.noflash&&!l.detectFlashSupport()&&this.receiveEvent("onNoFlash",null)},l.prototype.addEventListener=l.prototype.on,l.prototype.off=function(a,b){var c=a.toString().split(/\s/g);for(var d=0;d<c.length;d++){a=c[d].toLowerCase().replace(/^on/,"");for(var e in this.handlers)e===a&&this.handlers[e]===b&&delete this.handlers[e]}},l.prototype.removeEventListener=l.prototype.off,l.prototype.receiveEvent=function(a,b){a=a.toString().toLowerCase().replace(/^on/,"");var c=m;switch(a){case"load":if(b&&parseFloat(b.flashVersion.replace(",",".").replace(/[^0-9\.]/gi,""))<10){this.receiveEvent("onWrongFlash",{flashVersion:b.flashVersion});return}this.htmlBridge.setAttribute("data-clipboard-ready",!0);break;case"mouseover":e(c,this.options.hoverClass);break;case"mouseout":f(c,this.options.hoverClass),this.resetBridge();break;case"mousedown":e(c,this.options.activeClass);break;case"mouseup":f(c,this.options.activeClass);break;case"datarequested":var d=c.getAttribute("data-clipboard-target"),g=d?document.getElementById(d):null;if(g){var h=g.value||g.textContent||g.innerText;h&&this.setText(h)}else{var i=c.getAttribute("data-clipboard-text");i&&this.setText(i)}break;case"complete":this.options.text=null}if(this.handlers[a]){var j=this.handlers[a];typeof j=="function"?j.call(c,this,b):typeof j=="string"&&window[j].call(c,this,b)}},l.prototype.glue=function(a){a=k(a);for(var d=0;d<a.length;d++)j(a[d],n)==-1&&(n.push(a[d]),c(a[d],"mouseover",b))},l.prototype.unglue=function(a){a=k(a);for(var c=0;c<a.length;c++){d(a[c],"mouseover",b);var e=j(a[c],n);e!=-1&&n.splice(e,1)}},typeof module!="undefined"?module.exports=l:typeof define=="function"&&define.amd?define(function(){return l}):window.ZeroClipboard=l})(); \ No newline at end of file
diff --git a/library/font_awesome/src/assets/js/ZeroClipboard-1.1.7.swf b/library/font_awesome/src/assets/js/ZeroClipboard-1.1.7.swf
new file mode 100755
index 000000000..880e64ee7
--- /dev/null
+++ b/library/font_awesome/src/assets/js/ZeroClipboard-1.1.7.swf
Binary files differ
diff --git a/library/font_awesome/src/assets/js/backbone.min.js b/library/font_awesome/src/assets/js/backbone.min.js
new file mode 100644
index 000000000..5846b325d
--- /dev/null
+++ b/library/font_awesome/src/assets/js/backbone.min.js
@@ -0,0 +1,37 @@
+// Backbone.js 0.9.1
+
+// (c) 2010-2012 Jeremy Ashkenas, DocumentCloud Inc.
+// Backbone may be freely distributed under the MIT license.
+// For all details and documentation:
+// http://backbonejs.org
+(function(){var i=this,r=i.Backbone,s=Array.prototype.slice,t=Array.prototype.splice,g;g="undefined"!==typeof exports?exports:i.Backbone={};g.VERSION="0.9.1";var f=i._;!f&&"undefined"!==typeof require&&(f=require("underscore"));var h=i.jQuery||i.Zepto||i.ender;g.setDomLibrary=function(a){h=a};g.noConflict=function(){i.Backbone=r;return this};g.emulateHTTP=!1;g.emulateJSON=!1;g.Events={on:function(a,b,c){for(var d,a=a.split(/\s+/),e=this._callbacks||(this._callbacks={});d=a.shift();){d=e[d]||(e[d]=
+{});var f=d.tail||(d.tail=d.next={});f.callback=b;f.context=c;d.tail=f.next={}}return this},off:function(a,b,c){var d,e,f;if(a){if(e=this._callbacks)for(a=a.split(/\s+/);d=a.shift();)if(f=e[d],delete e[d],b&&f)for(;(f=f.next)&&f.next;)if(!(f.callback===b&&(!c||f.context===c)))this.on(d,f.callback,f.context)}else delete this._callbacks;return this},trigger:function(a){var b,c,d,e;if(!(d=this._callbacks))return this;e=d.all;for((a=a.split(/\s+/)).push(null);b=a.shift();)e&&a.push({next:e.next,tail:e.tail,
+event:b}),(c=d[b])&&a.push({next:c.next,tail:c.tail});for(e=s.call(arguments,1);c=a.pop();){b=c.tail;for(d=c.event?[c.event].concat(e):e;(c=c.next)!==b;)c.callback.apply(c.context||this,d)}return this}};g.Events.bind=g.Events.on;g.Events.unbind=g.Events.off;g.Model=function(a,b){var c;a||(a={});b&&b.parse&&(a=this.parse(a));if(c=j(this,"defaults"))a=f.extend({},c,a);b&&b.collection&&(this.collection=b.collection);this.attributes={};this._escapedAttributes={};this.cid=f.uniqueId("c");if(!this.set(a,
+{silent:!0}))throw Error("Can't create an invalid model");delete this._changed;this._previousAttributes=f.clone(this.attributes);this.initialize.apply(this,arguments)};f.extend(g.Model.prototype,g.Events,{idAttribute:"id",initialize:function(){},toJSON:function(){return f.clone(this.attributes)},get:function(a){return this.attributes[a]},escape:function(a){var b;if(b=this._escapedAttributes[a])return b;b=this.attributes[a];return this._escapedAttributes[a]=f.escape(null==b?"":""+b)},has:function(a){return null!=
+this.attributes[a]},set:function(a,b,c){var d,e;f.isObject(a)||null==a?(d=a,c=b):(d={},d[a]=b);c||(c={});if(!d)return this;d instanceof g.Model&&(d=d.attributes);if(c.unset)for(e in d)d[e]=void 0;if(!this._validate(d,c))return!1;this.idAttribute in d&&(this.id=d[this.idAttribute]);var b=this.attributes,k=this._escapedAttributes,n=this._previousAttributes||{},h=this._setting;this._changed||(this._changed={});this._setting=!0;for(e in d)if(a=d[e],f.isEqual(b[e],a)||delete k[e],c.unset?delete b[e]:b[e]=
+a,this._changing&&!f.isEqual(this._changed[e],a)&&(this.trigger("change:"+e,this,a,c),this._moreChanges=!0),delete this._changed[e],!f.isEqual(n[e],a)||f.has(b,e)!=f.has(n,e))this._changed[e]=a;h||(!c.silent&&this.hasChanged()&&this.change(c),this._setting=!1);return this},unset:function(a,b){(b||(b={})).unset=!0;return this.set(a,null,b)},clear:function(a){(a||(a={})).unset=!0;return this.set(f.clone(this.attributes),a)},fetch:function(a){var a=a?f.clone(a):{},b=this,c=a.success;a.success=function(d,
+e,f){if(!b.set(b.parse(d,f),a))return!1;c&&c(b,d)};a.error=g.wrapError(a.error,b,a);return(this.sync||g.sync).call(this,"read",this,a)},save:function(a,b,c){var d,e;f.isObject(a)||null==a?(d=a,c=b):(d={},d[a]=b);c=c?f.clone(c):{};c.wait&&(e=f.clone(this.attributes));a=f.extend({},c,{silent:!0});if(d&&!this.set(d,c.wait?a:c))return!1;var k=this,h=c.success;c.success=function(a,b,e){b=k.parse(a,e);c.wait&&(b=f.extend(d||{},b));if(!k.set(b,c))return!1;h?h(k,a):k.trigger("sync",k,a,c)};c.error=g.wrapError(c.error,
+k,c);b=this.isNew()?"create":"update";b=(this.sync||g.sync).call(this,b,this,c);c.wait&&this.set(e,a);return b},destroy:function(a){var a=a?f.clone(a):{},b=this,c=a.success,d=function(){b.trigger("destroy",b,b.collection,a)};if(this.isNew())return d();a.success=function(e){a.wait&&d();c?c(b,e):b.trigger("sync",b,e,a)};a.error=g.wrapError(a.error,b,a);var e=(this.sync||g.sync).call(this,"delete",this,a);a.wait||d();return e},url:function(){var a=j(this.collection,"url")||j(this,"urlRoot")||o();return this.isNew()?
+a:a+("/"==a.charAt(a.length-1)?"":"/")+encodeURIComponent(this.id)},parse:function(a){return a},clone:function(){return new this.constructor(this.attributes)},isNew:function(){return null==this.id},change:function(a){if(this._changing||!this.hasChanged())return this;this._moreChanges=this._changing=!0;for(var b in this._changed)this.trigger("change:"+b,this,this._changed[b],a);for(;this._moreChanges;)this._moreChanges=!1,this.trigger("change",this,a);this._previousAttributes=f.clone(this.attributes);
+delete this._changed;this._changing=!1;return this},hasChanged:function(a){return!arguments.length?!f.isEmpty(this._changed):this._changed&&f.has(this._changed,a)},changedAttributes:function(a){if(!a)return this.hasChanged()?f.clone(this._changed):!1;var b,c=!1,d=this._previousAttributes,e;for(e in a)if(!f.isEqual(d[e],b=a[e]))(c||(c={}))[e]=b;return c},previous:function(a){return!arguments.length||!this._previousAttributes?null:this._previousAttributes[a]},previousAttributes:function(){return f.clone(this._previousAttributes)},
+isValid:function(){return!this.validate(this.attributes)},_validate:function(a,b){if(b.silent||!this.validate)return!0;var a=f.extend({},this.attributes,a),c=this.validate(a,b);if(!c)return!0;b&&b.error?b.error(this,c,b):this.trigger("error",this,c,b);return!1}});g.Collection=function(a,b){b||(b={});b.comparator&&(this.comparator=b.comparator);this._reset();this.initialize.apply(this,arguments);a&&this.reset(a,{silent:!0,parse:b.parse})};f.extend(g.Collection.prototype,g.Events,{model:g.Model,initialize:function(){},
+toJSON:function(){return this.map(function(a){return a.toJSON()})},add:function(a,b){var c,d,e,g,h,i={},j={};b||(b={});a=f.isArray(a)?a.slice():[a];for(c=0,d=a.length;c<d;c++){if(!(e=a[c]=this._prepareModel(a[c],b)))throw Error("Can't add an invalid model to a collection");if(i[g=e.cid]||this._byCid[g]||null!=(h=e.id)&&(j[h]||this._byId[h]))throw Error("Can't add the same model to a collection twice");i[g]=j[h]=e}for(c=0;c<d;c++)(e=a[c]).on("all",this._onModelEvent,this),this._byCid[e.cid]=e,null!=
+e.id&&(this._byId[e.id]=e);this.length+=d;t.apply(this.models,[null!=b.at?b.at:this.models.length,0].concat(a));this.comparator&&this.sort({silent:!0});if(b.silent)return this;for(c=0,d=this.models.length;c<d;c++)if(i[(e=this.models[c]).cid])b.index=c,e.trigger("add",e,this,b);return this},remove:function(a,b){var c,d,e,g;b||(b={});a=f.isArray(a)?a.slice():[a];for(c=0,d=a.length;c<d;c++)if(g=this.getByCid(a[c])||this.get(a[c]))delete this._byId[g.id],delete this._byCid[g.cid],e=this.indexOf(g),this.models.splice(e,
+1),this.length--,b.silent||(b.index=e,g.trigger("remove",g,this,b)),this._removeReference(g);return this},get:function(a){return null==a?null:this._byId[null!=a.id?a.id:a]},getByCid:function(a){return a&&this._byCid[a.cid||a]},at:function(a){return this.models[a]},sort:function(a){a||(a={});if(!this.comparator)throw Error("Cannot sort a set without a comparator");var b=f.bind(this.comparator,this);1==this.comparator.length?this.models=this.sortBy(b):this.models.sort(b);a.silent||this.trigger("reset",
+this,a);return this},pluck:function(a){return f.map(this.models,function(b){return b.get(a)})},reset:function(a,b){a||(a=[]);b||(b={});for(var c=0,d=this.models.length;c<d;c++)this._removeReference(this.models[c]);this._reset();this.add(a,{silent:!0,parse:b.parse});b.silent||this.trigger("reset",this,b);return this},fetch:function(a){a=a?f.clone(a):{};void 0===a.parse&&(a.parse=!0);var b=this,c=a.success;a.success=function(d,e,f){b[a.add?"add":"reset"](b.parse(d,f),a);c&&c(b,d)};a.error=g.wrapError(a.error,
+b,a);return(this.sync||g.sync).call(this,"read",this,a)},create:function(a,b){var c=this,b=b?f.clone(b):{},a=this._prepareModel(a,b);if(!a)return!1;b.wait||c.add(a,b);var d=b.success;b.success=function(e,f){b.wait&&c.add(e,b);d?d(e,f):e.trigger("sync",a,f,b)};a.save(null,b);return a},parse:function(a){return a},chain:function(){return f(this.models).chain()},_reset:function(){this.length=0;this.models=[];this._byId={};this._byCid={}},_prepareModel:function(a,b){a instanceof g.Model?a.collection||
+(a.collection=this):(b.collection=this,a=new this.model(a,b),a._validate(a.attributes,b)||(a=!1));return a},_removeReference:function(a){this==a.collection&&delete a.collection;a.off("all",this._onModelEvent,this)},_onModelEvent:function(a,b,c,d){("add"==a||"remove"==a)&&c!=this||("destroy"==a&&this.remove(b,d),b&&a==="change:"+b.idAttribute&&(delete this._byId[b.previous(b.idAttribute)],this._byId[b.id]=b),this.trigger.apply(this,arguments))}});f.each("forEach,each,map,reduce,reduceRight,find,detect,filter,select,reject,every,all,some,any,include,contains,invoke,max,min,sortBy,sortedIndex,toArray,size,first,initial,rest,last,without,indexOf,shuffle,lastIndexOf,isEmpty,groupBy".split(","),
+function(a){g.Collection.prototype[a]=function(){return f[a].apply(f,[this.models].concat(f.toArray(arguments)))}});g.Router=function(a){a||(a={});a.routes&&(this.routes=a.routes);this._bindRoutes();this.initialize.apply(this,arguments)};var u=/:\w+/g,v=/\*\w+/g,w=/[-[\]{}()+?.,\\^$|#\s]/g;f.extend(g.Router.prototype,g.Events,{initialize:function(){},route:function(a,b,c){g.history||(g.history=new g.History);f.isRegExp(a)||(a=this._routeToRegExp(a));c||(c=this[b]);g.history.route(a,f.bind(function(d){d=
+this._extractParameters(a,d);c&&c.apply(this,d);this.trigger.apply(this,["route:"+b].concat(d));g.history.trigger("route",this,b,d)},this));return this},navigate:function(a,b){g.history.navigate(a,b)},_bindRoutes:function(){if(this.routes){var a=[],b;for(b in this.routes)a.unshift([b,this.routes[b]]);b=0;for(var c=a.length;b<c;b++)this.route(a[b][0],a[b][1],this[a[b][1]])}},_routeToRegExp:function(a){a=a.replace(w,"\\$&").replace(u,"([^/]+)").replace(v,"(.*?)");return RegExp("^"+a+"$")},_extractParameters:function(a,
+b){return a.exec(b).slice(1)}});g.History=function(){this.handlers=[];f.bindAll(this,"checkUrl")};var m=/^[#\/]/,x=/msie [\w.]+/,l=!1;f.extend(g.History.prototype,g.Events,{interval:50,getFragment:function(a,b){if(null==a)if(this._hasPushState||b){var a=window.location.pathname,c=window.location.search;c&&(a+=c)}else a=window.location.hash;a=decodeURIComponent(a);a.indexOf(this.options.root)||(a=a.substr(this.options.root.length));return a.replace(m,"")},start:function(a){if(l)throw Error("Backbone.history has already been started");
+this.options=f.extend({},{root:"/"},this.options,a);this._wantsHashChange=!1!==this.options.hashChange;this._wantsPushState=!!this.options.pushState;this._hasPushState=!(!this.options.pushState||!window.history||!window.history.pushState);var a=this.getFragment(),b=document.documentMode;if(b=x.exec(navigator.userAgent.toLowerCase())&&(!b||7>=b))this.iframe=h('<iframe src="javascript:0" tabindex="-1" />').hide().appendTo("body")[0].contentWindow,this.navigate(a);this._hasPushState?h(window).bind("popstate",
+this.checkUrl):this._wantsHashChange&&"onhashchange"in window&&!b?h(window).bind("hashchange",this.checkUrl):this._wantsHashChange&&(this._checkUrlInterval=setInterval(this.checkUrl,this.interval));this.fragment=a;l=!0;a=window.location;b=a.pathname==this.options.root;if(this._wantsHashChange&&this._wantsPushState&&!this._hasPushState&&!b)return this.fragment=this.getFragment(null,!0),window.location.replace(this.options.root+"#"+this.fragment),!0;this._wantsPushState&&this._hasPushState&&b&&a.hash&&
+(this.fragment=a.hash.replace(m,""),window.history.replaceState({},document.title,a.protocol+"//"+a.host+this.options.root+this.fragment));if(!this.options.silent)return this.loadUrl()},stop:function(){h(window).unbind("popstate",this.checkUrl).unbind("hashchange",this.checkUrl);clearInterval(this._checkUrlInterval);l=!1},route:function(a,b){this.handlers.unshift({route:a,callback:b})},checkUrl:function(){var a=this.getFragment();a==this.fragment&&this.iframe&&(a=this.getFragment(this.iframe.location.hash));
+if(a==this.fragment||a==decodeURIComponent(this.fragment))return!1;this.iframe&&this.navigate(a);this.loadUrl()||this.loadUrl(window.location.hash)},loadUrl:function(a){var b=this.fragment=this.getFragment(a);return f.any(this.handlers,function(a){if(a.route.test(b))return a.callback(b),!0})},navigate:function(a,b){if(!l)return!1;if(!b||!0===b)b={trigger:b};var c=(a||"").replace(m,"");this.fragment==c||this.fragment==decodeURIComponent(c)||(this._hasPushState?(0!=c.indexOf(this.options.root)&&(c=
+this.options.root+c),this.fragment=c,window.history[b.replace?"replaceState":"pushState"]({},document.title,c)):this._wantsHashChange?(this.fragment=c,this._updateHash(window.location,c,b.replace),this.iframe&&c!=this.getFragment(this.iframe.location.hash)&&(b.replace||this.iframe.document.open().close(),this._updateHash(this.iframe.location,c,b.replace))):window.location.assign(this.options.root+a),b.trigger&&this.loadUrl(a))},_updateHash:function(a,b,c){c?a.replace(a.toString().replace(/(javascript:|#).*$/,
+"")+"#"+b):a.hash=b}});g.View=function(a){this.cid=f.uniqueId("view");this._configure(a||{});this._ensureElement();this.initialize.apply(this,arguments);this.delegateEvents()};var y=/^(\S+)\s*(.*)$/,p="model,collection,el,id,attributes,className,tagName".split(",");f.extend(g.View.prototype,g.Events,{tagName:"div",$:function(a){return this.$el.find(a)},initialize:function(){},render:function(){return this},remove:function(){this.$el.remove();return this},make:function(a,b,c){a=document.createElement(a);
+b&&h(a).attr(b);c&&h(a).html(c);return a},setElement:function(a,b){this.$el=h(a);this.el=this.$el[0];!1!==b&&this.delegateEvents();return this},delegateEvents:function(a){if(a||(a=j(this,"events"))){this.undelegateEvents();for(var b in a){var c=a[b];f.isFunction(c)||(c=this[a[b]]);if(!c)throw Error('Event "'+a[b]+'" does not exist');var d=b.match(y),e=d[1],d=d[2],c=f.bind(c,this),e=e+(".delegateEvents"+this.cid);""===d?this.$el.bind(e,c):this.$el.delegate(d,e,c)}}},undelegateEvents:function(){this.$el.unbind(".delegateEvents"+
+this.cid)},_configure:function(a){this.options&&(a=f.extend({},this.options,a));for(var b=0,c=p.length;b<c;b++){var d=p[b];a[d]&&(this[d]=a[d])}this.options=a},_ensureElement:function(){if(this.el)this.setElement(this.el,!1);else{var a=j(this,"attributes")||{};this.id&&(a.id=this.id);this.className&&(a["class"]=this.className);this.setElement(this.make(this.tagName,a),!1)}}});g.Model.extend=g.Collection.extend=g.Router.extend=g.View.extend=function(a,b){var c=z(this,a,b);c.extend=this.extend;return c};
+var A={create:"POST",update:"PUT","delete":"DELETE",read:"GET"};g.sync=function(a,b,c){var d=A[a],e={type:d,dataType:"json"};c.url||(e.url=j(b,"url")||o());if(!c.data&&b&&("create"==a||"update"==a))e.contentType="application/json",e.data=JSON.stringify(b.toJSON());g.emulateJSON&&(e.contentType="application/x-www-form-urlencoded",e.data=e.data?{model:e.data}:{});if(g.emulateHTTP&&("PUT"===d||"DELETE"===d))g.emulateJSON&&(e.data._method=d),e.type="POST",e.beforeSend=function(a){a.setRequestHeader("X-HTTP-Method-Override",
+d)};"GET"!==e.type&&!g.emulateJSON&&(e.processData=!1);return h.ajax(f.extend(e,c))};g.wrapError=function(a,b,c){return function(d,e){e=d===b?e:d;a?a(b,e,c):b.trigger("error",b,e,c)}};var q=function(){},z=function(a,b,c){var d;d=b&&b.hasOwnProperty("constructor")?b.constructor:function(){a.apply(this,arguments)};f.extend(d,a);q.prototype=a.prototype;d.prototype=new q;b&&f.extend(d.prototype,b);c&&f.extend(d,c);d.prototype.constructor=d;d.__super__=a.prototype;return d},j=function(a,b){return!a||!a[b]?
+null:f.isFunction(a[b])?a[b]():a[b]},o=function(){throw Error('A "url" property or function must be specified');}}).call(this);
diff --git a/library/font_awesome/src/assets/js/bootstrap-2.3.1.min.js b/library/font_awesome/src/assets/js/bootstrap-2.3.1.min.js
new file mode 100644
index 000000000..95c5ac5ee
--- /dev/null
+++ b/library/font_awesome/src/assets/js/bootstrap-2.3.1.min.js
@@ -0,0 +1,6 @@
+/*!
+* Bootstrap.js by @fat & @mdo
+* Copyright 2012 Twitter, Inc.
+* http://www.apache.org/licenses/LICENSE-2.0.txt
+*/
+!function(e){"use strict";e(function(){e.support.transition=function(){var e=function(){var e=document.createElement("bootstrap"),t={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},n;for(n in t)if(e.style[n]!==undefined)return t[n]}();return e&&{end:e}}()})}(window.jQuery),!function(e){"use strict";var t='[data-dismiss="alert"]',n=function(n){e(n).on("click",t,this.close)};n.prototype.close=function(t){function s(){i.trigger("closed").remove()}var n=e(this),r=n.attr("data-target"),i;r||(r=n.attr("href"),r=r&&r.replace(/.*(?=#[^\s]*$)/,"")),i=e(r),t&&t.preventDefault(),i.length||(i=n.hasClass("alert")?n:n.parent()),i.trigger(t=e.Event("close"));if(t.isDefaultPrevented())return;i.removeClass("in"),e.support.transition&&i.hasClass("fade")?i.on(e.support.transition.end,s):s()};var r=e.fn.alert;e.fn.alert=function(t){return this.each(function(){var r=e(this),i=r.data("alert");i||r.data("alert",i=new n(this)),typeof t=="string"&&i[t].call(r)})},e.fn.alert.Constructor=n,e.fn.alert.noConflict=function(){return e.fn.alert=r,this},e(document).on("click.alert.data-api",t,n.prototype.close)}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.button.defaults,n)};t.prototype.setState=function(e){var t="disabled",n=this.$element,r=n.data(),i=n.is("input")?"val":"html";e+="Text",r.resetText||n.data("resetText",n[i]()),n[i](r[e]||this.options[e]),setTimeout(function(){e=="loadingText"?n.addClass(t).attr(t,t):n.removeClass(t).removeAttr(t)},0)},t.prototype.toggle=function(){var e=this.$element.closest('[data-toggle="buttons-radio"]');e&&e.find(".active").removeClass("active"),this.$element.toggleClass("active")};var n=e.fn.button;e.fn.button=function(n){return this.each(function(){var r=e(this),i=r.data("button"),s=typeof n=="object"&&n;i||r.data("button",i=new t(this,s)),n=="toggle"?i.toggle():n&&i.setState(n)})},e.fn.button.defaults={loadingText:"loading..."},e.fn.button.Constructor=t,e.fn.button.noConflict=function(){return e.fn.button=n,this},e(document).on("click.button.data-api","[data-toggle^=button]",function(t){var n=e(t.target);n.hasClass("btn")||(n=n.closest(".btn")),n.button("toggle")})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.$indicators=this.$element.find(".carousel-indicators"),this.options=n,this.options.pause=="hover"&&this.$element.on("mouseenter",e.proxy(this.pause,this)).on("mouseleave",e.proxy(this.cycle,this))};t.prototype={cycle:function(t){return t||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(e.proxy(this.next,this),this.options.interval)),this},getActiveIndex:function(){return this.$active=this.$element.find(".item.active"),this.$items=this.$active.parent().children(),this.$items.index(this.$active)},to:function(t){var n=this.getActiveIndex(),r=this;if(t>this.$items.length-1||t<0)return;return this.sliding?this.$element.one("slid",function(){r.to(t)}):n==t?this.pause().cycle():this.slide(t>n?"next":"prev",e(this.$items[t]))},pause:function(t){return t||(this.paused=!0),this.$element.find(".next, .prev").length&&e.support.transition.end&&(this.$element.trigger(e.support.transition.end),this.cycle(!0)),clearInterval(this.interval),this.interval=null,this},next:function(){if(this.sliding)return;return this.slide("next")},prev:function(){if(this.sliding)return;return this.slide("prev")},slide:function(t,n){var r=this.$element.find(".item.active"),i=n||r[t](),s=this.interval,o=t=="next"?"left":"right",u=t=="next"?"first":"last",a=this,f;this.sliding=!0,s&&this.pause(),i=i.length?i:this.$element.find(".item")[u](),f=e.Event("slide",{relatedTarget:i[0],direction:o});if(i.hasClass("active"))return;this.$indicators.length&&(this.$indicators.find(".active").removeClass("active"),this.$element.one("slid",function(){var t=e(a.$indicators.children()[a.getActiveIndex()]);t&&t.addClass("active")}));if(e.support.transition&&this.$element.hasClass("slide")){this.$element.trigger(f);if(f.isDefaultPrevented())return;i.addClass(t),i[0].offsetWidth,r.addClass(o),i.addClass(o),this.$element.one(e.support.transition.end,function(){i.removeClass([t,o].join(" ")).addClass("active"),r.removeClass(["active",o].join(" ")),a.sliding=!1,setTimeout(function(){a.$element.trigger("slid")},0)})}else{this.$element.trigger(f);if(f.isDefaultPrevented())return;r.removeClass("active"),i.addClass("active"),this.sliding=!1,this.$element.trigger("slid")}return s&&this.cycle(),this}};var n=e.fn.carousel;e.fn.carousel=function(n){return this.each(function(){var r=e(this),i=r.data("carousel"),s=e.extend({},e.fn.carousel.defaults,typeof n=="object"&&n),o=typeof n=="string"?n:s.slide;i||r.data("carousel",i=new t(this,s)),typeof n=="number"?i.to(n):o?i[o]():s.interval&&i.pause().cycle()})},e.fn.carousel.defaults={interval:5e3,pause:"hover"},e.fn.carousel.Constructor=t,e.fn.carousel.noConflict=function(){return e.fn.carousel=n,this},e(document).on("click.carousel.data-api","[data-slide], [data-slide-to]",function(t){var n=e(this),r,i=e(n.attr("data-target")||(r=n.attr("href"))&&r.replace(/.*(?=#[^\s]+$)/,"")),s=e.extend({},i.data(),n.data()),o;i.carousel(s),(o=n.attr("data-slide-to"))&&i.data("carousel").pause().to(o).cycle(),t.preventDefault()})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.collapse.defaults,n),this.options.parent&&(this.$parent=e(this.options.parent)),this.options.toggle&&this.toggle()};t.prototype={constructor:t,dimension:function(){var e=this.$element.hasClass("width");return e?"width":"height"},show:function(){var t,n,r,i;if(this.transitioning||this.$element.hasClass("in"))return;t=this.dimension(),n=e.camelCase(["scroll",t].join("-")),r=this.$parent&&this.$parent.find("> .accordion-group > .in");if(r&&r.length){i=r.data("collapse");if(i&&i.transitioning)return;r.collapse("hide"),i||r.data("collapse",null)}this.$element[t](0),this.transition("addClass",e.Event("show"),"shown"),e.support.transition&&this.$element[t](this.$element[0][n])},hide:function(){var t;if(this.transitioning||!this.$element.hasClass("in"))return;t=this.dimension(),this.reset(this.$element[t]()),this.transition("removeClass",e.Event("hide"),"hidden"),this.$element[t](0)},reset:function(e){var t=this.dimension();return this.$element.removeClass("collapse")[t](e||"auto")[0].offsetWidth,this.$element[e!==null?"addClass":"removeClass"]("collapse"),this},transition:function(t,n,r){var i=this,s=function(){n.type=="show"&&i.reset(),i.transitioning=0,i.$element.trigger(r)};this.$element.trigger(n);if(n.isDefaultPrevented())return;this.transitioning=1,this.$element[t]("in"),e.support.transition&&this.$element.hasClass("collapse")?this.$element.one(e.support.transition.end,s):s()},toggle:function(){this[this.$element.hasClass("in")?"hide":"show"]()}};var n=e.fn.collapse;e.fn.collapse=function(n){return this.each(function(){var r=e(this),i=r.data("collapse"),s=e.extend({},e.fn.collapse.defaults,r.data(),typeof n=="object"&&n);i||r.data("collapse",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.collapse.defaults={toggle:!0},e.fn.collapse.Constructor=t,e.fn.collapse.noConflict=function(){return e.fn.collapse=n,this},e(document).on("click.collapse.data-api","[data-toggle=collapse]",function(t){var n=e(this),r,i=n.attr("data-target")||t.preventDefault()||(r=n.attr("href"))&&r.replace(/.*(?=#[^\s]+$)/,""),s=e(i).data("collapse")?"toggle":n.data();n[e(i).hasClass("in")?"addClass":"removeClass"]("collapsed"),e(i).collapse(s)})}(window.jQuery),!function(e){"use strict";function r(){e(t).each(function(){i(e(this)).removeClass("open")})}function i(t){var n=t.attr("data-target"),r;n||(n=t.attr("href"),n=n&&/#/.test(n)&&n.replace(/.*(?=#[^\s]*$)/,"")),r=n&&e(n);if(!r||!r.length)r=t.parent();return r}var t="[data-toggle=dropdown]",n=function(t){var n=e(t).on("click.dropdown.data-api",this.toggle);e("html").on("click.dropdown.data-api",function(){n.parent().removeClass("open")})};n.prototype={constructor:n,toggle:function(t){var n=e(this),s,o;if(n.is(".disabled, :disabled"))return;return s=i(n),o=s.hasClass("open"),r(),o||s.toggleClass("open"),n.focus(),!1},keydown:function(n){var r,s,o,u,a,f;if(!/(38|40|27)/.test(n.keyCode))return;r=e(this),n.preventDefault(),n.stopPropagation();if(r.is(".disabled, :disabled"))return;u=i(r),a=u.hasClass("open");if(!a||a&&n.keyCode==27)return n.which==27&&u.find(t).focus(),r.click();s=e("[role=menu] li:not(.divider):visible a",u);if(!s.length)return;f=s.index(s.filter(":focus")),n.keyCode==38&&f>0&&f--,n.keyCode==40&&f<s.length-1&&f++,~f||(f=0),s.eq(f).focus()}};var s=e.fn.dropdown;e.fn.dropdown=function(t){return this.each(function(){var r=e(this),i=r.data("dropdown");i||r.data("dropdown",i=new n(this)),typeof t=="string"&&i[t].call(r)})},e.fn.dropdown.Constructor=n,e.fn.dropdown.noConflict=function(){return e.fn.dropdown=s,this},e(document).on("click.dropdown.data-api",r).on("click.dropdown.data-api",".dropdown form",function(e){e.stopPropagation()}).on("click.dropdown-menu",function(e){e.stopPropagation()}).on("click.dropdown.data-api",t,n.prototype.toggle).on("keydown.dropdown.data-api",t+", [role=menu]",n.prototype.keydown)}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.options=n,this.$element=e(t).delegate('[data-dismiss="modal"]',"click.dismiss.modal",e.proxy(this.hide,this)),this.options.remote&&this.$element.find(".modal-body").load(this.options.remote)};t.prototype={constructor:t,toggle:function(){return this[this.isShown?"hide":"show"]()},show:function(){var t=this,n=e.Event("show");this.$element.trigger(n);if(this.isShown||n.isDefaultPrevented())return;this.isShown=!0,this.escape(),this.backdrop(function(){var n=e.support.transition&&t.$element.hasClass("fade");t.$element.parent().length||t.$element.appendTo(document.body),t.$element.show(),n&&t.$element[0].offsetWidth,t.$element.addClass("in").attr("aria-hidden",!1),t.enforceFocus(),n?t.$element.one(e.support.transition.end,function(){t.$element.focus().trigger("shown")}):t.$element.focus().trigger("shown")})},hide:function(t){t&&t.preventDefault();var n=this;t=e.Event("hide"),this.$element.trigger(t);if(!this.isShown||t.isDefaultPrevented())return;this.isShown=!1,this.escape(),e(document).off("focusin.modal"),this.$element.removeClass("in").attr("aria-hidden",!0),e.support.transition&&this.$element.hasClass("fade")?this.hideWithTransition():this.hideModal()},enforceFocus:function(){var t=this;e(document).on("focusin.modal",function(e){t.$element[0]!==e.target&&!t.$element.has(e.target).length&&t.$element.focus()})},escape:function(){var e=this;this.isShown&&this.options.keyboard?this.$element.on("keyup.dismiss.modal",function(t){t.which==27&&e.hide()}):this.isShown||this.$element.off("keyup.dismiss.modal")},hideWithTransition:function(){var t=this,n=setTimeout(function(){t.$element.off(e.support.transition.end),t.hideModal()},500);this.$element.one(e.support.transition.end,function(){clearTimeout(n),t.hideModal()})},hideModal:function(){var e=this;this.$element.hide(),this.backdrop(function(){e.removeBackdrop(),e.$element.trigger("hidden")})},removeBackdrop:function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},backdrop:function(t){var n=this,r=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var i=e.support.transition&&r;this.$backdrop=e('<div class="modal-backdrop '+r+'" />').appendTo(document.body),this.$backdrop.click(this.options.backdrop=="static"?e.proxy(this.$element[0].focus,this.$element[0]):e.proxy(this.hide,this)),i&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in");if(!t)return;i?this.$backdrop.one(e.support.transition.end,t):t()}else!this.isShown&&this.$backdrop?(this.$backdrop.removeClass("in"),e.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one(e.support.transition.end,t):t()):t&&t()}};var n=e.fn.modal;e.fn.modal=function(n){return this.each(function(){var r=e(this),i=r.data("modal"),s=e.extend({},e.fn.modal.defaults,r.data(),typeof n=="object"&&n);i||r.data("modal",i=new t(this,s)),typeof n=="string"?i[n]():s.show&&i.show()})},e.fn.modal.defaults={backdrop:!0,keyboard:!0,show:!0},e.fn.modal.Constructor=t,e.fn.modal.noConflict=function(){return e.fn.modal=n,this},e(document).on("click.modal.data-api",'[data-toggle="modal"]',function(t){var n=e(this),r=n.attr("href"),i=e(n.attr("data-target")||r&&r.replace(/.*(?=#[^\s]+$)/,"")),s=i.data("modal")?"toggle":e.extend({remote:!/#/.test(r)&&r},i.data(),n.data());t.preventDefault(),i.modal(s).one("hide",function(){n.focus()})})}(window.jQuery),!function(e){"use strict";var t=function(e,t){this.init("tooltip",e,t)};t.prototype={constructor:t,init:function(t,n,r){var i,s,o,u,a;this.type=t,this.$element=e(n),this.options=this.getOptions(r),this.enabled=!0,o=this.options.trigger.split(" ");for(a=o.length;a--;)u=o[a],u=="click"?this.$element.on("click."+this.type,this.options.selector,e.proxy(this.toggle,this)):u!="manual"&&(i=u=="hover"?"mouseenter":"focus",s=u=="hover"?"mouseleave":"blur",this.$element.on(i+"."+this.type,this.options.selector,e.proxy(this.enter,this)),this.$element.on(s+"."+this.type,this.options.selector,e.proxy(this.leave,this)));this.options.selector?this._options=e.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},getOptions:function(t){return t=e.extend({},e.fn[this.type].defaults,this.$element.data(),t),t.delay&&typeof t.delay=="number"&&(t.delay={show:t.delay,hide:t.delay}),t},enter:function(t){var n=e.fn[this.type].defaults,r={},i;this._options&&e.each(this._options,function(e,t){n[e]!=t&&(r[e]=t)},this),i=e(t.currentTarget)[this.type](r).data(this.type);if(!i.options.delay||!i.options.delay.show)return i.show();clearTimeout(this.timeout),i.hoverState="in",this.timeout=setTimeout(function(){i.hoverState=="in"&&i.show()},i.options.delay.show)},leave:function(t){var n=e(t.currentTarget)[this.type](this._options).data(this.type);this.timeout&&clearTimeout(this.timeout);if(!n.options.delay||!n.options.delay.hide)return n.hide();n.hoverState="out",this.timeout=setTimeout(function(){n.hoverState=="out"&&n.hide()},n.options.delay.hide)},show:function(){var t,n,r,i,s,o,u=e.Event("show");if(this.hasContent()&&this.enabled){this.$element.trigger(u);if(u.isDefaultPrevented())return;t=this.tip(),this.setContent(),this.options.animation&&t.addClass("fade"),s=typeof this.options.placement=="function"?this.options.placement.call(this,t[0],this.$element[0]):this.options.placement,t.detach().css({top:0,left:0,display:"block"}),this.options.container?t.appendTo(this.options.container):t.insertAfter(this.$element),n=this.getPosition(),r=t[0].offsetWidth,i=t[0].offsetHeight;switch(s){case"bottom":o={top:n.top+n.height,left:n.left+n.width/2-r/2};break;case"top":o={top:n.top-i,left:n.left+n.width/2-r/2};break;case"left":o={top:n.top+n.height/2-i/2,left:n.left-r};break;case"right":o={top:n.top+n.height/2-i/2,left:n.left+n.width}}this.applyPlacement(o,s),this.$element.trigger("shown")}},applyPlacement:function(e,t){var n=this.tip(),r=n[0].offsetWidth,i=n[0].offsetHeight,s,o,u,a;n.offset(e).addClass(t).addClass("in"),s=n[0].offsetWidth,o=n[0].offsetHeight,t=="top"&&o!=i&&(e.top=e.top+i-o,a=!0),t=="bottom"||t=="top"?(u=0,e.left<0&&(u=e.left*-2,e.left=0,n.offset(e),s=n[0].offsetWidth,o=n[0].offsetHeight),this.replaceArrow(u-r+s,s,"left")):this.replaceArrow(o-i,o,"top"),a&&n.offset(e)},replaceArrow:function(e,t,n){this.arrow().css(n,e?50*(1-e/t)+"%":"")},setContent:function(){var e=this.tip(),t=this.getTitle();e.find(".tooltip-inner")[this.options.html?"html":"text"](t),e.removeClass("fade in top bottom left right")},hide:function(){function i(){var t=setTimeout(function(){n.off(e.support.transition.end).detach()},500);n.one(e.support.transition.end,function(){clearTimeout(t),n.detach()})}var t=this,n=this.tip(),r=e.Event("hide");this.$element.trigger(r);if(r.isDefaultPrevented())return;return n.removeClass("in"),e.support.transition&&this.$tip.hasClass("fade")?i():n.detach(),this.$element.trigger("hidden"),this},fixTitle:function(){var e=this.$element;(e.attr("title")||typeof e.attr("data-original-title")!="string")&&e.attr("data-original-title",e.attr("title")||"").attr("title","")},hasContent:function(){return this.getTitle()},getPosition:function(){var t=this.$element[0];return e.extend({},typeof t.getBoundingClientRect=="function"?t.getBoundingClientRect():{width:t.offsetWidth,height:t.offsetHeight},this.$element.offset())},getTitle:function(){var e,t=this.$element,n=this.options;return e=t.attr("data-original-title")||(typeof n.title=="function"?n.title.call(t[0]):n.title),e},tip:function(){return this.$tip=this.$tip||e(this.options.template)},arrow:function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},validate:function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},enable:function(){this.enabled=!0},disable:function(){this.enabled=!1},toggleEnabled:function(){this.enabled=!this.enabled},toggle:function(t){var n=t?e(t.currentTarget)[this.type](this._options).data(this.type):this;n.tip().hasClass("in")?n.hide():n.show()},destroy:function(){this.hide().$element.off("."+this.type).removeData(this.type)}};var n=e.fn.tooltip;e.fn.tooltip=function(n){return this.each(function(){var r=e(this),i=r.data("tooltip"),s=typeof n=="object"&&n;i||r.data("tooltip",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.tooltip.Constructor=t,e.fn.tooltip.defaults={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1},e.fn.tooltip.noConflict=function(){return e.fn.tooltip=n,this}}(window.jQuery),!function(e){"use strict";var t=function(e,t){this.init("popover",e,t)};t.prototype=e.extend({},e.fn.tooltip.Constructor.prototype,{constructor:t,setContent:function(){var e=this.tip(),t=this.getTitle(),n=this.getContent();e.find(".popover-title")[this.options.html?"html":"text"](t),e.find(".popover-content")[this.options.html?"html":"text"](n),e.removeClass("fade top bottom left right in")},hasContent:function(){return this.getTitle()||this.getContent()},getContent:function(){var e,t=this.$element,n=this.options;return e=(typeof n.content=="function"?n.content.call(t[0]):n.content)||t.attr("data-content"),e},tip:function(){return this.$tip||(this.$tip=e(this.options.template)),this.$tip},destroy:function(){this.hide().$element.off("."+this.type).removeData(this.type)}});var n=e.fn.popover;e.fn.popover=function(n){return this.each(function(){var r=e(this),i=r.data("popover"),s=typeof n=="object"&&n;i||r.data("popover",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.popover.Constructor=t,e.fn.popover.defaults=e.extend({},e.fn.tooltip.defaults,{placement:"right",trigger:"click",content:"",template:'<div class="popover"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),e.fn.popover.noConflict=function(){return e.fn.popover=n,this}}(window.jQuery),!function(e){"use strict";function t(t,n){var r=e.proxy(this.process,this),i=e(t).is("body")?e(window):e(t),s;this.options=e.extend({},e.fn.scrollspy.defaults,n),this.$scrollElement=i.on("scroll.scroll-spy.data-api",r),this.selector=(this.options.target||(s=e(t).attr("href"))&&s.replace(/.*(?=#[^\s]+$)/,"")||"")+" .nav li > a",this.$body=e("body"),this.refresh(),this.process()}t.prototype={constructor:t,refresh:function(){var t=this,n;this.offsets=e([]),this.targets=e([]),n=this.$body.find(this.selector).map(function(){var n=e(this),r=n.data("target")||n.attr("href"),i=/^#\w/.test(r)&&e(r);return i&&i.length&&[[i.position().top+(!e.isWindow(t.$scrollElement.get(0))&&t.$scrollElement.scrollTop()),r]]||null}).sort(function(e,t){return e[0]-t[0]}).each(function(){t.offsets.push(this[0]),t.targets.push(this[1])})},process:function(){var e=this.$scrollElement.scrollTop()+this.options.offset,t=this.$scrollElement[0].scrollHeight||this.$body[0].scrollHeight,n=t-this.$scrollElement.height(),r=this.offsets,i=this.targets,s=this.activeTarget,o;if(e>=n)return s!=(o=i.last()[0])&&this.activate(o);for(o=r.length;o--;)s!=i[o]&&e>=r[o]&&(!r[o+1]||e<=r[o+1])&&this.activate(i[o])},activate:function(t){var n,r;this.activeTarget=t,e(this.selector).parent(".active").removeClass("active"),r=this.selector+'[data-target="'+t+'"],'+this.selector+'[href="'+t+'"]',n=e(r).parent("li").addClass("active"),n.parent(".dropdown-menu").length&&(n=n.closest("li.dropdown").addClass("active")),n.trigger("activate")}};var n=e.fn.scrollspy;e.fn.scrollspy=function(n){return this.each(function(){var r=e(this),i=r.data("scrollspy"),s=typeof n=="object"&&n;i||r.data("scrollspy",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.scrollspy.Constructor=t,e.fn.scrollspy.defaults={offset:10},e.fn.scrollspy.noConflict=function(){return e.fn.scrollspy=n,this},e(window).on("load",function(){e('[data-spy="scroll"]').each(function(){var t=e(this);t.scrollspy(t.data())})})}(window.jQuery),!function(e){"use strict";var t=function(t){this.element=e(t)};t.prototype={constructor:t,show:function(){var t=this.element,n=t.closest("ul:not(.dropdown-menu)"),r=t.attr("data-target"),i,s,o;r||(r=t.attr("href"),r=r&&r.replace(/.*(?=#[^\s]*$)/,""));if(t.parent("li").hasClass("active"))return;i=n.find(".active:last a")[0],o=e.Event("show",{relatedTarget:i}),t.trigger(o);if(o.isDefaultPrevented())return;s=e(r),this.activate(t.parent("li"),n),this.activate(s,s.parent(),function(){t.trigger({type:"shown",relatedTarget:i})})},activate:function(t,n,r){function o(){i.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),t.addClass("active"),s?(t[0].offsetWidth,t.addClass("in")):t.removeClass("fade"),t.parent(".dropdown-menu")&&t.closest("li.dropdown").addClass("active"),r&&r()}var i=n.find("> .active"),s=r&&e.support.transition&&i.hasClass("fade");s?i.one(e.support.transition.end,o):o(),i.removeClass("in")}};var n=e.fn.tab;e.fn.tab=function(n){return this.each(function(){var r=e(this),i=r.data("tab");i||r.data("tab",i=new t(this)),typeof n=="string"&&i[n]()})},e.fn.tab.Constructor=t,e.fn.tab.noConflict=function(){return e.fn.tab=n,this},e(document).on("click.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(t){t.preventDefault(),e(this).tab("show")})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.typeahead.defaults,n),this.matcher=this.options.matcher||this.matcher,this.sorter=this.options.sorter||this.sorter,this.highlighter=this.options.highlighter||this.highlighter,this.updater=this.options.updater||this.updater,this.source=this.options.source,this.$menu=e(this.options.menu),this.shown=!1,this.listen()};t.prototype={constructor:t,select:function(){var e=this.$menu.find(".active").attr("data-value");return this.$element.val(this.updater(e)).change(),this.hide()},updater:function(e){return e},show:function(){var t=e.extend({},this.$element.position(),{height:this.$element[0].offsetHeight});return this.$menu.insertAfter(this.$element).css({top:t.top+t.height,left:t.left}).show(),this.shown=!0,this},hide:function(){return this.$menu.hide(),this.shown=!1,this},lookup:function(t){var n;return this.query=this.$element.val(),!this.query||this.query.length<this.options.minLength?this.shown?this.hide():this:(n=e.isFunction(this.source)?this.source(this.query,e.proxy(this.process,this)):this.source,n?this.process(n):this)},process:function(t){var n=this;return t=e.grep(t,function(e){return n.matcher(e)}),t=this.sorter(t),t.length?this.render(t.slice(0,this.options.items)).show():this.shown?this.hide():this},matcher:function(e){return~e.toLowerCase().indexOf(this.query.toLowerCase())},sorter:function(e){var t=[],n=[],r=[],i;while(i=e.shift())i.toLowerCase().indexOf(this.query.toLowerCase())?~i.indexOf(this.query)?n.push(i):r.push(i):t.push(i);return t.concat(n,r)},highlighter:function(e){var t=this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&");return e.replace(new RegExp("("+t+")","ig"),function(e,t){return"<strong>"+t+"</strong>"})},render:function(t){var n=this;return t=e(t).map(function(t,r){return t=e(n.options.item).attr("data-value",r),t.find("a").html(n.highlighter(r)),t[0]}),t.first().addClass("active"),this.$menu.html(t),this},next:function(t){var n=this.$menu.find(".active").removeClass("active"),r=n.next();r.length||(r=e(this.$menu.find("li")[0])),r.addClass("active")},prev:function(e){var t=this.$menu.find(".active").removeClass("active"),n=t.prev();n.length||(n=this.$menu.find("li").last()),n.addClass("active")},listen:function(){this.$element.on("focus",e.proxy(this.focus,this)).on("blur",e.proxy(this.blur,this)).on("keypress",e.proxy(this.keypress,this)).on("keyup",e.proxy(this.keyup,this)),this.eventSupported("keydown")&&this.$element.on("keydown",e.proxy(this.keydown,this)),this.$menu.on("click",e.proxy(this.click,this)).on("mouseenter","li",e.proxy(this.mouseenter,this)).on("mouseleave","li",e.proxy(this.mouseleave,this))},eventSupported:function(e){var t=e in this.$element;return t||(this.$element.setAttribute(e,"return;"),t=typeof this.$element[e]=="function"),t},move:function(e){if(!this.shown)return;switch(e.keyCode){case 9:case 13:case 27:e.preventDefault();break;case 38:e.preventDefault(),this.prev();break;case 40:e.preventDefault(),this.next()}e.stopPropagation()},keydown:function(t){this.suppressKeyPressRepeat=~e.inArray(t.keyCode,[40,38,9,13,27]),this.move(t)},keypress:function(e){if(this.suppressKeyPressRepeat)return;this.move(e)},keyup:function(e){switch(e.keyCode){case 40:case 38:case 16:case 17:case 18:break;case 9:case 13:if(!this.shown)return;this.select();break;case 27:if(!this.shown)return;this.hide();break;default:this.lookup()}e.stopPropagation(),e.preventDefault()},focus:function(e){this.focused=!0},blur:function(e){this.focused=!1,!this.mousedover&&this.shown&&this.hide()},click:function(e){e.stopPropagation(),e.preventDefault(),this.select(),this.$element.focus()},mouseenter:function(t){this.mousedover=!0,this.$menu.find(".active").removeClass("active"),e(t.currentTarget).addClass("active")},mouseleave:function(e){this.mousedover=!1,!this.focused&&this.shown&&this.hide()}};var n=e.fn.typeahead;e.fn.typeahead=function(n){return this.each(function(){var r=e(this),i=r.data("typeahead"),s=typeof n=="object"&&n;i||r.data("typeahead",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.typeahead.defaults={source:[],items:8,menu:'<ul class="typeahead dropdown-menu"></ul>',item:'<li><a href="#"></a></li>',minLength:1},e.fn.typeahead.Constructor=t,e.fn.typeahead.noConflict=function(){return e.fn.typeahead=n,this},e(document).on("focus.typeahead.data-api",'[data-provide="typeahead"]',function(t){var n=e(this);if(n.data("typeahead"))return;n.typeahead(n.data())})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.options=e.extend({},e.fn.affix.defaults,n),this.$window=e(window).on("scroll.affix.data-api",e.proxy(this.checkPosition,this)).on("click.affix.data-api",e.proxy(function(){setTimeout(e.proxy(this.checkPosition,this),1)},this)),this.$element=e(t),this.checkPosition()};t.prototype.checkPosition=function(){if(!this.$element.is(":visible"))return;var t=e(document).height(),n=this.$window.scrollTop(),r=this.$element.offset(),i=this.options.offset,s=i.bottom,o=i.top,u="affix affix-top affix-bottom",a;typeof i!="object"&&(s=o=i),typeof o=="function"&&(o=i.top()),typeof s=="function"&&(s=i.bottom()),a=this.unpin!=null&&n+this.unpin<=r.top?!1:s!=null&&r.top+this.$element.height()>=t-s?"bottom":o!=null&&n<=o?"top":!1;if(this.affixed===a)return;this.affixed=a,this.unpin=a=="bottom"?r.top-n:null,this.$element.removeClass(u).addClass("affix"+(a?"-"+a:""))};var n=e.fn.affix;e.fn.affix=function(n){return this.each(function(){var r=e(this),i=r.data("affix"),s=typeof n=="object"&&n;i||r.data("affix",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.affix.Constructor=t,e.fn.affix.defaults={offset:0},e.fn.affix.noConflict=function(){return e.fn.affix=n,this},e(window).on("load",function(){e('[data-spy="affix"]').each(function(){var t=e(this),n=t.data();n.offset=n.offset||{},n.offsetBottom&&(n.offset.bottom=n.offsetBottom),n.offsetTop&&(n.offset.top=n.offsetTop),t.affix(n)})})}(window.jQuery); \ No newline at end of file
diff --git a/library/font_awesome/src/assets/js/bootstrap-222.min.js b/library/font_awesome/src/assets/js/bootstrap-222.min.js
new file mode 100644
index 000000000..6eeb15ce3
--- /dev/null
+++ b/library/font_awesome/src/assets/js/bootstrap-222.min.js
@@ -0,0 +1,6 @@
+/*!
+* Bootstrap.js by @fat & @mdo
+* Copyright 2012 Twitter, Inc.
+* http://www.apache.org/licenses/LICENSE-2.0.txt
+*/
+!function($){"use strict";$(function(){$.support.transition=function(){var transitionEnd=function(){var name,el=document.createElement("bootstrap"),transEndEventNames={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(name in transEndEventNames)if(void 0!==el.style[name])return transEndEventNames[name]}();return transitionEnd&&{end:transitionEnd}}()})}(window.jQuery),!function($){"use strict";var dismiss='[data-dismiss="alert"]',Alert=function(el){$(el).on("click",dismiss,this.close)};Alert.prototype.close=function(e){function removeElement(){$parent.trigger("closed").remove()}var $parent,$this=$(this),selector=$this.attr("data-target");selector||(selector=$this.attr("href"),selector=selector&&selector.replace(/.*(?=#[^\s]*$)/,"")),$parent=$(selector),e&&e.preventDefault(),$parent.length||($parent=$this.hasClass("alert")?$this:$this.parent()),$parent.trigger(e=$.Event("close")),e.isDefaultPrevented()||($parent.removeClass("in"),$.support.transition&&$parent.hasClass("fade")?$parent.on($.support.transition.end,removeElement):removeElement())};var old=$.fn.alert;$.fn.alert=function(option){return this.each(function(){var $this=$(this),data=$this.data("alert");data||$this.data("alert",data=new Alert(this)),"string"==typeof option&&data[option].call($this)})},$.fn.alert.Constructor=Alert,$.fn.alert.noConflict=function(){return $.fn.alert=old,this},$(document).on("click.alert.data-api",dismiss,Alert.prototype.close)}(window.jQuery),!function($){"use strict";var Button=function(element,options){this.$element=$(element),this.options=$.extend({},$.fn.button.defaults,options)};Button.prototype.setState=function(state){var d="disabled",$el=this.$element,data=$el.data(),val=$el.is("input")?"val":"html";state+="Text",data.resetText||$el.data("resetText",$el[val]()),$el[val](data[state]||this.options[state]),setTimeout(function(){"loadingText"==state?$el.addClass(d).attr(d,d):$el.removeClass(d).removeAttr(d)},0)},Button.prototype.toggle=function(){var $parent=this.$element.closest('[data-toggle="buttons-radio"]');$parent&&$parent.find(".active").removeClass("active"),this.$element.toggleClass("active")};var old=$.fn.button;$.fn.button=function(option){return this.each(function(){var $this=$(this),data=$this.data("button"),options="object"==typeof option&&option;data||$this.data("button",data=new Button(this,options)),"toggle"==option?data.toggle():option&&data.setState(option)})},$.fn.button.defaults={loadingText:"loading..."},$.fn.button.Constructor=Button,$.fn.button.noConflict=function(){return $.fn.button=old,this},$(document).on("click.button.data-api","[data-toggle^=button]",function(e){var $btn=$(e.target);$btn.hasClass("btn")||($btn=$btn.closest(".btn")),$btn.button("toggle")})}(window.jQuery),!function($){"use strict";var Carousel=function(element,options){this.$element=$(element),this.options=options,"hover"==this.options.pause&&this.$element.on("mouseenter",$.proxy(this.pause,this)).on("mouseleave",$.proxy(this.cycle,this))};Carousel.prototype={cycle:function(e){return e||(this.paused=!1),this.options.interval&&!this.paused&&(this.interval=setInterval($.proxy(this.next,this),this.options.interval)),this},to:function(pos){var $active=this.$element.find(".item.active"),children=$active.parent().children(),activePos=children.index($active),that=this;if(!(pos>children.length-1||0>pos))return this.sliding?this.$element.one("slid",function(){that.to(pos)}):activePos==pos?this.pause().cycle():this.slide(pos>activePos?"next":"prev",$(children[pos]))},pause:function(e){return e||(this.paused=!0),this.$element.find(".next, .prev").length&&$.support.transition.end&&(this.$element.trigger($.support.transition.end),this.cycle()),clearInterval(this.interval),this.interval=null,this},next:function(){return this.sliding?void 0:this.slide("next")},prev:function(){return this.sliding?void 0:this.slide("prev")},slide:function(type,next){var e,$active=this.$element.find(".item.active"),$next=next||$active[type](),isCycling=this.interval,direction="next"==type?"left":"right",fallback="next"==type?"first":"last",that=this;if(this.sliding=!0,isCycling&&this.pause(),$next=$next.length?$next:this.$element.find(".item")[fallback](),e=$.Event("slide",{relatedTarget:$next[0]}),!$next.hasClass("active")){if($.support.transition&&this.$element.hasClass("slide")){if(this.$element.trigger(e),e.isDefaultPrevented())return;$next.addClass(type),$next[0].offsetWidth,$active.addClass(direction),$next.addClass(direction),this.$element.one($.support.transition.end,function(){$next.removeClass([type,direction].join(" ")).addClass("active"),$active.removeClass(["active",direction].join(" ")),that.sliding=!1,setTimeout(function(){that.$element.trigger("slid")},0)})}else{if(this.$element.trigger(e),e.isDefaultPrevented())return;$active.removeClass("active"),$next.addClass("active"),this.sliding=!1,this.$element.trigger("slid")}return isCycling&&this.cycle(),this}}};var old=$.fn.carousel;$.fn.carousel=function(option){return this.each(function(){var $this=$(this),data=$this.data("carousel"),options=$.extend({},$.fn.carousel.defaults,"object"==typeof option&&option),action="string"==typeof option?option:options.slide;data||$this.data("carousel",data=new Carousel(this,options)),"number"==typeof option?data.to(option):action?data[action]():options.interval&&data.cycle()})},$.fn.carousel.defaults={interval:5e3,pause:"hover"},$.fn.carousel.Constructor=Carousel,$.fn.carousel.noConflict=function(){return $.fn.carousel=old,this},$(document).on("click.carousel.data-api","[data-slide]",function(e){var href,$this=$(this),$target=$($this.attr("data-target")||(href=$this.attr("href"))&&href.replace(/.*(?=#[^\s]+$)/,"")),options=$.extend({},$target.data(),$this.data());$target.carousel(options),e.preventDefault()})}(window.jQuery),!function($){"use strict";var Collapse=function(element,options){this.$element=$(element),this.options=$.extend({},$.fn.collapse.defaults,options),this.options.parent&&(this.$parent=$(this.options.parent)),this.options.toggle&&this.toggle()};Collapse.prototype={constructor:Collapse,dimension:function(){var hasWidth=this.$element.hasClass("width");return hasWidth?"width":"height"},show:function(){var dimension,scroll,actives,hasData;if(!this.transitioning){if(dimension=this.dimension(),scroll=$.camelCase(["scroll",dimension].join("-")),actives=this.$parent&&this.$parent.find("> .accordion-group > .in"),actives&&actives.length){if(hasData=actives.data("collapse"),hasData&&hasData.transitioning)return;actives.collapse("hide"),hasData||actives.data("collapse",null)}this.$element[dimension](0),this.transition("addClass",$.Event("show"),"shown"),$.support.transition&&this.$element[dimension](this.$element[0][scroll])}},hide:function(){var dimension;this.transitioning||(dimension=this.dimension(),this.reset(this.$element[dimension]()),this.transition("removeClass",$.Event("hide"),"hidden"),this.$element[dimension](0))},reset:function(size){var dimension=this.dimension();return this.$element.removeClass("collapse")[dimension](size||"auto")[0].offsetWidth,this.$element[null!==size?"addClass":"removeClass"]("collapse"),this},transition:function(method,startEvent,completeEvent){var that=this,complete=function(){"show"==startEvent.type&&that.reset(),that.transitioning=0,that.$element.trigger(completeEvent)};this.$element.trigger(startEvent),startEvent.isDefaultPrevented()||(this.transitioning=1,this.$element[method]("in"),$.support.transition&&this.$element.hasClass("collapse")?this.$element.one($.support.transition.end,complete):complete())},toggle:function(){this[this.$element.hasClass("in")?"hide":"show"]()}};var old=$.fn.collapse;$.fn.collapse=function(option){return this.each(function(){var $this=$(this),data=$this.data("collapse"),options="object"==typeof option&&option;data||$this.data("collapse",data=new Collapse(this,options)),"string"==typeof option&&data[option]()})},$.fn.collapse.defaults={toggle:!0},$.fn.collapse.Constructor=Collapse,$.fn.collapse.noConflict=function(){return $.fn.collapse=old,this},$(document).on("click.collapse.data-api","[data-toggle=collapse]",function(e){var href,$this=$(this),target=$this.attr("data-target")||e.preventDefault()||(href=$this.attr("href"))&&href.replace(/.*(?=#[^\s]+$)/,""),option=$(target).data("collapse")?"toggle":$this.data();$this[$(target).hasClass("in")?"addClass":"removeClass"]("collapsed"),$(target).collapse(option)})}(window.jQuery),!function($){"use strict";function clearMenus(){$(toggle).each(function(){getParent($(this)).removeClass("open")})}function getParent($this){var $parent,selector=$this.attr("data-target");return selector||(selector=$this.attr("href"),selector=selector&&/#/.test(selector)&&selector.replace(/.*(?=#[^\s]*$)/,"")),$parent=$(selector),$parent.length||($parent=$this.parent()),$parent}var toggle="[data-toggle=dropdown]",Dropdown=function(element){var $el=$(element).on("click.dropdown.data-api",this.toggle);$("html").on("click.dropdown.data-api",function(){$el.parent().removeClass("open")})};Dropdown.prototype={constructor:Dropdown,toggle:function(){var $parent,isActive,$this=$(this);if(!$this.is(".disabled, :disabled"))return $parent=getParent($this),isActive=$parent.hasClass("open"),clearMenus(),isActive||$parent.toggleClass("open"),$this.focus(),!1},keydown:function(e){var $this,$items,$parent,isActive,index;if(/(38|40|27)/.test(e.keyCode)&&($this=$(this),e.preventDefault(),e.stopPropagation(),!$this.is(".disabled, :disabled"))){if($parent=getParent($this),isActive=$parent.hasClass("open"),!isActive||isActive&&27==e.keyCode)return $this.click();$items=$("[role=menu] li:not(.divider):visible a",$parent),$items.length&&(index=$items.index($items.filter(":focus")),38==e.keyCode&&index>0&&index--,40==e.keyCode&&$items.length-1>index&&index++,~index||(index=0),$items.eq(index).focus())}}};var old=$.fn.dropdown;$.fn.dropdown=function(option){return this.each(function(){var $this=$(this),data=$this.data("dropdown");data||$this.data("dropdown",data=new Dropdown(this)),"string"==typeof option&&data[option].call($this)})},$.fn.dropdown.Constructor=Dropdown,$.fn.dropdown.noConflict=function(){return $.fn.dropdown=old,this},$(document).on("click.dropdown.data-api touchstart.dropdown.data-api",clearMenus).on("click.dropdown touchstart.dropdown.data-api",".dropdown form",function(e){e.stopPropagation()}).on("touchstart.dropdown.data-api",".dropdown-menu",function(e){e.stopPropagation()}).on("click.dropdown.data-api touchstart.dropdown.data-api",toggle,Dropdown.prototype.toggle).on("keydown.dropdown.data-api touchstart.dropdown.data-api",toggle+", [role=menu]",Dropdown.prototype.keydown)}(window.jQuery),!function($){"use strict";var Modal=function(element,options){this.options=options,this.$element=$(element).delegate('[data-dismiss="modal"]',"click.dismiss.modal",$.proxy(this.hide,this)),this.options.remote&&this.$element.find(".modal-body").load(this.options.remote)};Modal.prototype={constructor:Modal,toggle:function(){return this[this.isShown?"hide":"show"]()},show:function(){var that=this,e=$.Event("show");this.$element.trigger(e),this.isShown||e.isDefaultPrevented()||(this.isShown=!0,this.escape(),this.backdrop(function(){var transition=$.support.transition&&that.$element.hasClass("fade");that.$element.parent().length||that.$element.appendTo(document.body),that.$element.show(),transition&&that.$element[0].offsetWidth,that.$element.addClass("in").attr("aria-hidden",!1),that.enforceFocus(),transition?that.$element.one($.support.transition.end,function(){that.$element.focus().trigger("shown")}):that.$element.focus().trigger("shown")}))},hide:function(e){e&&e.preventDefault(),e=$.Event("hide"),this.$element.trigger(e),this.isShown&&!e.isDefaultPrevented()&&(this.isShown=!1,this.escape(),$(document).off("focusin.modal"),this.$element.removeClass("in").attr("aria-hidden",!0),$.support.transition&&this.$element.hasClass("fade")?this.hideWithTransition():this.hideModal())},enforceFocus:function(){var that=this;$(document).on("focusin.modal",function(e){that.$element[0]===e.target||that.$element.has(e.target).length||that.$element.focus()})},escape:function(){var that=this;this.isShown&&this.options.keyboard?this.$element.on("keyup.dismiss.modal",function(e){27==e.which&&that.hide()}):this.isShown||this.$element.off("keyup.dismiss.modal")},hideWithTransition:function(){var that=this,timeout=setTimeout(function(){that.$element.off($.support.transition.end),that.hideModal()},500);this.$element.one($.support.transition.end,function(){clearTimeout(timeout),that.hideModal()})},hideModal:function(){this.$element.hide().trigger("hidden"),this.backdrop()},removeBackdrop:function(){this.$backdrop.remove(),this.$backdrop=null},backdrop:function(callback){var animate=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var doAnimate=$.support.transition&&animate;this.$backdrop=$('<div class="modal-backdrop '+animate+'" />').appendTo(document.body),this.$backdrop.click("static"==this.options.backdrop?$.proxy(this.$element[0].focus,this.$element[0]):$.proxy(this.hide,this)),doAnimate&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),doAnimate?this.$backdrop.one($.support.transition.end,callback):callback()}else!this.isShown&&this.$backdrop?(this.$backdrop.removeClass("in"),$.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one($.support.transition.end,$.proxy(this.removeBackdrop,this)):this.removeBackdrop()):callback&&callback()}};var old=$.fn.modal;$.fn.modal=function(option){return this.each(function(){var $this=$(this),data=$this.data("modal"),options=$.extend({},$.fn.modal.defaults,$this.data(),"object"==typeof option&&option);data||$this.data("modal",data=new Modal(this,options)),"string"==typeof option?data[option]():options.show&&data.show()})},$.fn.modal.defaults={backdrop:!0,keyboard:!0,show:!0},$.fn.modal.Constructor=Modal,$.fn.modal.noConflict=function(){return $.fn.modal=old,this},$(document).on("click.modal.data-api",'[data-toggle="modal"]',function(e){var $this=$(this),href=$this.attr("href"),$target=$($this.attr("data-target")||href&&href.replace(/.*(?=#[^\s]+$)/,"")),option=$target.data("modal")?"toggle":$.extend({remote:!/#/.test(href)&&href},$target.data(),$this.data());e.preventDefault(),$target.modal(option).one("hide",function(){$this.focus()})})}(window.jQuery),!function($){"use strict";var Tooltip=function(element,options){this.init("tooltip",element,options)};Tooltip.prototype={constructor:Tooltip,init:function(type,element,options){var eventIn,eventOut;this.type=type,this.$element=$(element),this.options=this.getOptions(options),this.enabled=!0,"click"==this.options.trigger?this.$element.on("click."+this.type,this.options.selector,$.proxy(this.toggle,this)):"manual"!=this.options.trigger&&(eventIn="hover"==this.options.trigger?"mouseenter":"focus",eventOut="hover"==this.options.trigger?"mouseleave":"blur",this.$element.on(eventIn+"."+this.type,this.options.selector,$.proxy(this.enter,this)),this.$element.on(eventOut+"."+this.type,this.options.selector,$.proxy(this.leave,this))),this.options.selector?this._options=$.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},getOptions:function(options){return options=$.extend({},$.fn[this.type].defaults,options,this.$element.data()),options.delay&&"number"==typeof options.delay&&(options.delay={show:options.delay,hide:options.delay}),options},enter:function(e){var self=$(e.currentTarget)[this.type](this._options).data(this.type);return self.options.delay&&self.options.delay.show?(clearTimeout(this.timeout),self.hoverState="in",this.timeout=setTimeout(function(){"in"==self.hoverState&&self.show()},self.options.delay.show),void 0):self.show()},leave:function(e){var self=$(e.currentTarget)[this.type](this._options).data(this.type);return this.timeout&&clearTimeout(this.timeout),self.options.delay&&self.options.delay.hide?(self.hoverState="out",this.timeout=setTimeout(function(){"out"==self.hoverState&&self.hide()},self.options.delay.hide),void 0):self.hide()},show:function(){var $tip,inside,pos,actualWidth,actualHeight,placement,tp;if(this.hasContent()&&this.enabled){switch($tip=this.tip(),this.setContent(),this.options.animation&&$tip.addClass("fade"),placement="function"==typeof this.options.placement?this.options.placement.call(this,$tip[0],this.$element[0]):this.options.placement,inside=/in/.test(placement),$tip.detach().css({top:0,left:0,display:"block"}).insertAfter(this.$element),pos=this.getPosition(inside),actualWidth=$tip[0].offsetWidth,actualHeight=$tip[0].offsetHeight,inside?placement.split(" ")[1]:placement){case"bottom":tp={top:pos.top+pos.height,left:pos.left+pos.width/2-actualWidth/2};break;case"top":tp={top:pos.top-actualHeight,left:pos.left+pos.width/2-actualWidth/2};break;case"left":tp={top:pos.top+pos.height/2-actualHeight/2,left:pos.left-actualWidth};break;case"right":tp={top:pos.top+pos.height/2-actualHeight/2,left:pos.left+pos.width}}$tip.offset(tp).addClass(placement).addClass("in")}},setContent:function(){var $tip=this.tip(),title=this.getTitle();$tip.find(".tooltip-inner")[this.options.html?"html":"text"](title),$tip.removeClass("fade in top bottom left right")},hide:function(){function removeWithAnimation(){var timeout=setTimeout(function(){$tip.off($.support.transition.end).detach()},500);$tip.one($.support.transition.end,function(){clearTimeout(timeout),$tip.detach()})}var $tip=this.tip();return $tip.removeClass("in"),$.support.transition&&this.$tip.hasClass("fade")?removeWithAnimation():$tip.detach(),this},fixTitle:function(){var $e=this.$element;($e.attr("title")||"string"!=typeof $e.attr("data-original-title"))&&$e.attr("data-original-title",$e.attr("title")||"").removeAttr("title")},hasContent:function(){return this.getTitle()},getPosition:function(inside){return $.extend({},inside?{top:0,left:0}:this.$element.offset(),{width:this.$element[0].offsetWidth,height:this.$element[0].offsetHeight})},getTitle:function(){var title,$e=this.$element,o=this.options;return title=$e.attr("data-original-title")||("function"==typeof o.title?o.title.call($e[0]):o.title)},tip:function(){return this.$tip=this.$tip||$(this.options.template)},validate:function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},enable:function(){this.enabled=!0},disable:function(){this.enabled=!1},toggleEnabled:function(){this.enabled=!this.enabled},toggle:function(e){var self=$(e.currentTarget)[this.type](this._options).data(this.type);self[self.tip().hasClass("in")?"hide":"show"]()},destroy:function(){this.hide().$element.off("."+this.type).removeData(this.type)}};var old=$.fn.tooltip;$.fn.tooltip=function(option){return this.each(function(){var $this=$(this),data=$this.data("tooltip"),options="object"==typeof option&&option;data||$this.data("tooltip",data=new Tooltip(this,options)),"string"==typeof option&&data[option]()})},$.fn.tooltip.Constructor=Tooltip,$.fn.tooltip.defaults={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover",title:"",delay:0,html:!1},$.fn.tooltip.noConflict=function(){return $.fn.tooltip=old,this}}(window.jQuery),!function($){"use strict";var Popover=function(element,options){this.init("popover",element,options)};Popover.prototype=$.extend({},$.fn.tooltip.Constructor.prototype,{constructor:Popover,setContent:function(){var $tip=this.tip(),title=this.getTitle(),content=this.getContent();$tip.find(".popover-title")[this.options.html?"html":"text"](title),$tip.find(".popover-content")[this.options.html?"html":"text"](content),$tip.removeClass("fade top bottom left right in")},hasContent:function(){return this.getTitle()||this.getContent()},getContent:function(){var content,$e=this.$element,o=this.options;return content=$e.attr("data-content")||("function"==typeof o.content?o.content.call($e[0]):o.content)},tip:function(){return this.$tip||(this.$tip=$(this.options.template)),this.$tip},destroy:function(){this.hide().$element.off("."+this.type).removeData(this.type)}});var old=$.fn.popover;$.fn.popover=function(option){return this.each(function(){var $this=$(this),data=$this.data("popover"),options="object"==typeof option&&option;data||$this.data("popover",data=new Popover(this,options)),"string"==typeof option&&data[option]()})},$.fn.popover.Constructor=Popover,$.fn.popover.defaults=$.extend({},$.fn.tooltip.defaults,{placement:"right",trigger:"click",content:"",template:'<div class="popover"><div class="arrow"></div><div class="popover-inner"><h3 class="popover-title"></h3><div class="popover-content"></div></div></div>'}),$.fn.popover.noConflict=function(){return $.fn.popover=old,this}}(window.jQuery),!function($){"use strict";function ScrollSpy(element,options){var href,process=$.proxy(this.process,this),$element=$(element).is("body")?$(window):$(element);this.options=$.extend({},$.fn.scrollspy.defaults,options),this.$scrollElement=$element.on("scroll.scroll-spy.data-api",process),this.selector=(this.options.target||(href=$(element).attr("href"))&&href.replace(/.*(?=#[^\s]+$)/,"")||"")+" .nav li > a",this.$body=$("body"),this.refresh(),this.process()}ScrollSpy.prototype={constructor:ScrollSpy,refresh:function(){var $targets,self=this;this.offsets=$([]),this.targets=$([]),$targets=this.$body.find(this.selector).map(function(){var $el=$(this),href=$el.data("target")||$el.attr("href"),$href=/^#\w/.test(href)&&$(href);return $href&&$href.length&&[[$href.position().top+self.$scrollElement.scrollTop(),href]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){self.offsets.push(this[0]),self.targets.push(this[1])})},process:function(){var i,scrollTop=this.$scrollElement.scrollTop()+this.options.offset,scrollHeight=this.$scrollElement[0].scrollHeight||this.$body[0].scrollHeight,maxScroll=scrollHeight-this.$scrollElement.height(),offsets=this.offsets,targets=this.targets,activeTarget=this.activeTarget;if(scrollTop>=maxScroll)return activeTarget!=(i=targets.last()[0])&&this.activate(i);for(i=offsets.length;i--;)activeTarget!=targets[i]&&scrollTop>=offsets[i]&&(!offsets[i+1]||offsets[i+1]>=scrollTop)&&this.activate(targets[i])},activate:function(target){var active,selector;this.activeTarget=target,$(this.selector).parent(".active").removeClass("active"),selector=this.selector+'[data-target="'+target+'"],'+this.selector+'[href="'+target+'"]',active=$(selector).parent("li").addClass("active"),active.parent(".dropdown-menu").length&&(active=active.closest("li.dropdown").addClass("active")),active.trigger("activate")}};var old=$.fn.scrollspy;$.fn.scrollspy=function(option){return this.each(function(){var $this=$(this),data=$this.data("scrollspy"),options="object"==typeof option&&option;data||$this.data("scrollspy",data=new ScrollSpy(this,options)),"string"==typeof option&&data[option]()})},$.fn.scrollspy.Constructor=ScrollSpy,$.fn.scrollspy.defaults={offset:10},$.fn.scrollspy.noConflict=function(){return $.fn.scrollspy=old,this},$(window).on("load",function(){$('[data-spy="scroll"]').each(function(){var $spy=$(this);$spy.scrollspy($spy.data())})})}(window.jQuery),!function($){"use strict";var Tab=function(element){this.element=$(element)};Tab.prototype={constructor:Tab,show:function(){var previous,$target,e,$this=this.element,$ul=$this.closest("ul:not(.dropdown-menu)"),selector=$this.attr("data-target");selector||(selector=$this.attr("href"),selector=selector&&selector.replace(/.*(?=#[^\s]*$)/,"")),$this.parent("li").hasClass("active")||(previous=$ul.find(".active:last a")[0],e=$.Event("show",{relatedTarget:previous}),$this.trigger(e),e.isDefaultPrevented()||($target=$(selector),this.activate($this.parent("li"),$ul),this.activate($target,$target.parent(),function(){$this.trigger({type:"shown",relatedTarget:previous})})))},activate:function(element,container,callback){function next(){$active.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),element.addClass("active"),transition?(element[0].offsetWidth,element.addClass("in")):element.removeClass("fade"),element.parent(".dropdown-menu")&&element.closest("li.dropdown").addClass("active"),callback&&callback()}var $active=container.find("> .active"),transition=callback&&$.support.transition&&$active.hasClass("fade");transition?$active.one($.support.transition.end,next):next(),$active.removeClass("in")}};var old=$.fn.tab;$.fn.tab=function(option){return this.each(function(){var $this=$(this),data=$this.data("tab");data||$this.data("tab",data=new Tab(this)),"string"==typeof option&&data[option]()})},$.fn.tab.Constructor=Tab,$.fn.tab.noConflict=function(){return $.fn.tab=old,this},$(document).on("click.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(e){e.preventDefault(),$(this).tab("show")})}(window.jQuery),!function($){"use strict";var Typeahead=function(element,options){this.$element=$(element),this.options=$.extend({},$.fn.typeahead.defaults,options),this.matcher=this.options.matcher||this.matcher,this.sorter=this.options.sorter||this.sorter,this.highlighter=this.options.highlighter||this.highlighter,this.updater=this.options.updater||this.updater,this.source=this.options.source,this.$menu=$(this.options.menu),this.shown=!1,this.listen()};Typeahead.prototype={constructor:Typeahead,select:function(){var val=this.$menu.find(".active").attr("data-value");return this.$element.val(this.updater(val)).change(),this.hide()},updater:function(item){return item},show:function(){var pos=$.extend({},this.$element.position(),{height:this.$element[0].offsetHeight});return this.$menu.insertAfter(this.$element).css({top:pos.top+pos.height,left:pos.left}).show(),this.shown=!0,this},hide:function(){return this.$menu.hide(),this.shown=!1,this},lookup:function(){var items;return this.query=this.$element.val(),!this.query||this.query.length<this.options.minLength?this.shown?this.hide():this:(items=$.isFunction(this.source)?this.source(this.query,$.proxy(this.process,this)):this.source,items?this.process(items):this)},process:function(items){var that=this;return items=$.grep(items,function(item){return that.matcher(item)}),items=this.sorter(items),items.length?this.render(items.slice(0,this.options.items)).show():this.shown?this.hide():this},matcher:function(item){return~item.toLowerCase().indexOf(this.query.toLowerCase())},sorter:function(items){for(var item,beginswith=[],caseSensitive=[],caseInsensitive=[];item=items.shift();)item.toLowerCase().indexOf(this.query.toLowerCase())?~item.indexOf(this.query)?caseSensitive.push(item):caseInsensitive.push(item):beginswith.push(item);return beginswith.concat(caseSensitive,caseInsensitive)},highlighter:function(item){var query=this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&");return item.replace(RegExp("("+query+")","ig"),function($1,match){return"<strong>"+match+"</strong>"})},render:function(items){var that=this;return items=$(items).map(function(i,item){return i=$(that.options.item).attr("data-value",item),i.find("a").html(that.highlighter(item)),i[0]}),items.first().addClass("active"),this.$menu.html(items),this},next:function(){var active=this.$menu.find(".active").removeClass("active"),next=active.next();next.length||(next=$(this.$menu.find("li")[0])),next.addClass("active")},prev:function(){var active=this.$menu.find(".active").removeClass("active"),prev=active.prev();prev.length||(prev=this.$menu.find("li").last()),prev.addClass("active")},listen:function(){this.$element.on("blur",$.proxy(this.blur,this)).on("keypress",$.proxy(this.keypress,this)).on("keyup",$.proxy(this.keyup,this)),this.eventSupported("keydown")&&this.$element.on("keydown",$.proxy(this.keydown,this)),this.$menu.on("click",$.proxy(this.click,this)).on("mouseenter","li",$.proxy(this.mouseenter,this))},eventSupported:function(eventName){var isSupported=eventName in this.$element;return isSupported||(this.$element.setAttribute(eventName,"return;"),isSupported="function"==typeof this.$element[eventName]),isSupported},move:function(e){if(this.shown){switch(e.keyCode){case 9:case 13:case 27:e.preventDefault();break;case 38:e.preventDefault(),this.prev();break;case 40:e.preventDefault(),this.next()}e.stopPropagation()}},keydown:function(e){this.suppressKeyPressRepeat=~$.inArray(e.keyCode,[40,38,9,13,27]),this.move(e)},keypress:function(e){this.suppressKeyPressRepeat||this.move(e)},keyup:function(e){switch(e.keyCode){case 40:case 38:case 16:case 17:case 18:break;case 9:case 13:if(!this.shown)return;this.select();break;case 27:if(!this.shown)return;this.hide();break;default:this.lookup()}e.stopPropagation(),e.preventDefault()},blur:function(){var that=this;setTimeout(function(){that.hide()},150)},click:function(e){e.stopPropagation(),e.preventDefault(),this.select()},mouseenter:function(e){this.$menu.find(".active").removeClass("active"),$(e.currentTarget).addClass("active")}};var old=$.fn.typeahead;$.fn.typeahead=function(option){return this.each(function(){var $this=$(this),data=$this.data("typeahead"),options="object"==typeof option&&option;data||$this.data("typeahead",data=new Typeahead(this,options)),"string"==typeof option&&data[option]()})},$.fn.typeahead.defaults={source:[],items:8,menu:'<ul class="typeahead dropdown-menu"></ul>',item:'<li><a href="#"></a></li>',minLength:1},$.fn.typeahead.Constructor=Typeahead,$.fn.typeahead.noConflict=function(){return $.fn.typeahead=old,this},$(document).on("focus.typeahead.data-api",'[data-provide="typeahead"]',function(e){var $this=$(this);$this.data("typeahead")||(e.preventDefault(),$this.typeahead($this.data()))})}(window.jQuery),!function($){"use strict";var Affix=function(element,options){this.options=$.extend({},$.fn.affix.defaults,options),this.$window=$(window).on("scroll.affix.data-api",$.proxy(this.checkPosition,this)).on("click.affix.data-api",$.proxy(function(){setTimeout($.proxy(this.checkPosition,this),1)},this)),this.$element=$(element),this.checkPosition()};Affix.prototype.checkPosition=function(){if(this.$element.is(":visible")){var affix,scrollHeight=$(document).height(),scrollTop=this.$window.scrollTop(),position=this.$element.offset(),offset=this.options.offset,offsetBottom=offset.bottom,offsetTop=offset.top,reset="affix affix-top affix-bottom";"object"!=typeof offset&&(offsetBottom=offsetTop=offset),"function"==typeof offsetTop&&(offsetTop=offset.top()),"function"==typeof offsetBottom&&(offsetBottom=offset.bottom()),affix=null!=this.unpin&&scrollTop+this.unpin<=position.top?!1:null!=offsetBottom&&position.top+this.$element.height()>=scrollHeight-offsetBottom?"bottom":null!=offsetTop&&offsetTop>=scrollTop?"top":!1,this.affixed!==affix&&(this.affixed=affix,this.unpin="bottom"==affix?position.top-scrollTop:null,this.$element.removeClass(reset).addClass("affix"+(affix?"-"+affix:"")))}};var old=$.fn.affix;$.fn.affix=function(option){return this.each(function(){var $this=$(this),data=$this.data("affix"),options="object"==typeof option&&option;data||$this.data("affix",data=new Affix(this,options)),"string"==typeof option&&data[option]()})},$.fn.affix.Constructor=Affix,$.fn.affix.defaults={offset:0},$.fn.affix.noConflict=function(){return $.fn.affix=old,this},$(window).on("load",function(){$('[data-spy="affix"]').each(function(){var $spy=$(this),data=$spy.data();data.offset=data.offset||{},data.offsetBottom&&(data.offset.bottom=data.offsetBottom),data.offsetTop&&(data.offset.top=data.offsetTop),$spy.affix(data)})})}(window.jQuery); \ No newline at end of file
diff --git a/library/font_awesome/src/assets/js/jquery-1.7.1.min.js b/library/font_awesome/src/assets/js/jquery-1.7.1.min.js
new file mode 100644
index 000000000..198b3ff07
--- /dev/null
+++ b/library/font_awesome/src/assets/js/jquery-1.7.1.min.js
@@ -0,0 +1,4 @@
+/*! jQuery v1.7.1 jquery.com | jquery.org/license */
+(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cv(a){if(!ck[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){cl||(cl=c.createElement("iframe"),cl.frameBorder=cl.width=cl.height=0),b.appendChild(cl);if(!cm||!cl.createElement)cm=(cl.contentWindow||cl.contentDocument).document,cm.write((c.compatMode==="CSS1Compat"?"<!doctype html>":"")+"<html><body>"),cm.close();d=cm.createElement(a),cm.body.appendChild(d),e=f.css(d,"display"),b.removeChild(cl)}ck[a]=e}return ck[a]}function cu(a,b){var c={};f.each(cq.concat.apply([],cq.slice(0,b)),function(){c[this]=a});return c}function ct(){cr=b}function cs(){setTimeout(ct,0);return cr=f.now()}function cj(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ci(){try{return new a.XMLHttpRequest}catch(b){}}function cc(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g<i;g++){if(g===1)for(h in a.converters)typeof h=="string"&&(e[h.toLowerCase()]=a.converters[h]);l=k,k=d[g];if(k==="*")k=l;else if(l!=="*"&&l!==k){m=l+" "+k,n=e[m]||e["* "+k];if(!n){p=b;for(o in e){j=o.split(" ");if(j[0]===l||j[0]==="*"){p=e[j[1]+" "+k];if(p){o=e[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&f.error("No conversion from "+m.replace(" "," to ")),n!==!0&&(c=n?n(c):p(o(c)))}}return c}function cb(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]==="*")f.shift(),h===b&&(h=a.mimeType||c.getResponseHeader("content-type"));if(h)for(i in e)if(e[i]&&e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+" "+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j);return d[j]}}function ca(a,b,c,d){if(f.isArray(b))f.each(b,function(b,e){c||bE.test(a)?d(a,e):ca(a+"["+(typeof e=="object"||f.isArray(e)?b:"")+"]",e,c,d)});else if(!c&&b!=null&&typeof b=="object")for(var e in b)ca(a+"["+e+"]",b[e],c,d);else d(a,b)}function b_(a,c){var d,e,g=f.ajaxSettings.flatOptions||{};for(d in c)c[d]!==b&&((g[d]?a:e||(e={}))[d]=c[d]);e&&f.extend(!0,a,e)}function b$(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bT,l;for(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l=="string"&&(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=b$(a,c,d,e,l,g)));(k||!l)&&!g["*"]&&(l=b$(a,c,d,e,"*",g));return l}function bZ(a){return function(b,c){typeof b!="string"&&(c=b,b="*");if(f.isFunction(c)){var d=b.toLowerCase().split(bP),e=0,g=d.length,h,i,j;for(;e<g;e++)h=d[e],j=/^\+/.test(h),j&&(h=h.substr(1)||"*"),i=a[h]=a[h]||[],i[j?"unshift":"push"](c)}}}function bC(a,b,c){var d=b==="width"?a.offsetWidth:a.offsetHeight,e=b==="width"?bx:by,g=0,h=e.length;if(d>0){if(c!=="border")for(;g<h;g++)c||(d-=parseFloat(f.css(a,"padding"+e[g]))||0),c==="margin"?d+=parseFloat(f.css(a,c+e[g]))||0:d-=parseFloat(f.css(a,"border"+e[g]+"Width"))||0;return d+"px"}d=bz(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0;if(c)for(;g<h;g++)d+=parseFloat(f.css(a,"padding"+e[g]))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+e[g]+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+e[g]))||0);return d+"px"}function bp(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(bf,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bo(a){var b=c.createElement("div");bh.appendChild(b),b.innerHTML=a.outerHTML;return b.firstChild}function bn(a){var b=(a.nodeName||"").toLowerCase();b==="input"?bm(a):b!=="script"&&typeof a.getElementsByTagName!="undefined"&&f.grep(a.getElementsByTagName("input"),bm)}function bm(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bl(a){return typeof a.getElementsByTagName!="undefined"?a.getElementsByTagName("*"):typeof a.querySelectorAll!="undefined"?a.querySelectorAll("*"):[]}function bk(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bj(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c,d,e,g=f._data(a),h=f._data(b,g),i=g.events;if(i){delete h.handle,h.events={};for(c in i)for(d=0,e=i[c].length;d<e;d++)f.event.add(b,c+(i[c][d].namespace?".":"")+i[c][d].namespace,i[c][d],i[c][d].data)}h.data&&(h.data=f.extend({},h.data))}}function bi(a,b){return f.nodeName(a,"table")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function U(a){var b=V.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}function T(a,b,c){b=b||0;if(f.isFunction(b))return f.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return f.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=f.grep(a,function(a){return a.nodeType===1});if(O.test(b))return f.filter(b,d,!c);b=f.filter(b,d)}return f.grep(a,function(a,d){return f.inArray(a,b)>=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?parseFloat(d):j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c<d;c++)b[a[c]]=!0;return b}var c=a.document,d=a.navigator,e=a.location,f=function(){function J(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(J,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.1",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j<k;j++)if((a=arguments[j])!=null)for(c in a){d=i[c],f=a[c];if(i===f)continue;l&&f&&(e.isPlainObject(f)||(g=e.isArray(f)))?(g?(g=!1,h=d&&e.isArray(d)?d:[]):h=d&&e.isPlainObject(d)?d:{},i[c]=e.extend(l,h,f)):f!==b&&(i[c]=f)}return i},e.extend({noConflict:function(b){a.$===e&&(a.$=g),b&&a.jQuery===e&&(a.jQuery=f);return e},isReady:!1,readyWait:1,holdReady:function(a){a?e.readyWait++:e.ready(!0)},ready:function(a){if(a===!0&&!--e.readyWait||a!==!0&&!e.isReady){if(!c.body)return setTimeout(e.ready,1);e.isReady=!0;if(a!==!0&&--e.readyWait>0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g<h;)if(c.apply(a[g++],d)===!1)break}else if(i){for(f in a)if(c.call(a[f],f,a[f])===!1)break}else for(;g<h;)if(c.call(a[g],g,a[g++])===!1)break;return a},trim:G?function(a){return a==null?"":G.call(a)}:function(a){return a==null?"":(a+"").replace(k,"").replace(l,"")},makeArray:function(a,b){var c=b||[];if(a!=null){var d=e.type(a);a.length==null||d==="string"||d==="function"||d==="regexp"||e.isWindow(a)?E.call(c,a):e.merge(c,a)}return c},inArray:function(a,b,c){var d;if(b){if(H)return H.call(b,a,c);d=b.length,c=c?c<0?Math.max(0,d+c):c:0;for(;c<d;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,c){var d=a.length,e=0;if(typeof c.length=="number")for(var f=c.length;e<f;e++)a[d++]=c[e];else while(c[e]!==b)a[d++]=c[e++];a.length=d;return a},grep:function(a,b,c){var d=[],e;c=!!c;for(var f=0,g=a.length;f<g;f++)e=!!b(a[f],f),c!==e&&d.push(a[f]);return d},map:function(a,c,d){var f,g,h=[],i=0,j=a.length,k=a instanceof e||j!==b&&typeof j=="number"&&(j>0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i<j;i++)f=c(a[i],i,d),f!=null&&(h[h.length]=f);else for(g in a)f=c(a[g],g,d),f!=null&&(h[h.length]=f);return h.concat.apply([],h)},guid:1,proxy:function(a,c){if(typeof c=="string"){var d=a[c];c=a,a=d}if(!e.isFunction(a))return b;var f=F.call(arguments,2),g=function(){return a.apply(c,f.concat(F.call(arguments)))};g.guid=a.guid=a.guid||g.guid||e.guid++;return g},access:function(a,c,d,f,g,h){var i=a.length;if(typeof c=="object"){for(var j in c)e.access(a,j,c[j],f,g,d);return a}if(d!==b){f=!h&&f&&e.isFunction(d);for(var k=0;k<i;k++)g(a[k],c,f?d.call(a[k],k,g(a[k],c)):d,h);return a}return i?g(a[0],c):b},now:function(){return(new Date).getTime()},uaMatch:function(a){a=a.toLowerCase();var b=r.exec(a)||s.exec(a)||t.exec(a)||a.indexOf("compatible")<0&&u.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},sub:function(){function a(b,c){return new a.fn.init(b,c)}e.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function(d,f){f&&f instanceof e&&!(f instanceof a)&&(f=a(f));return e.fn.init.call(this,d,f,b)},a.fn.init.prototype=a.fn;var b=a(c);return a},browser:{}}),e.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){I["[object "+b+"]"]=b.toLowerCase()}),z=e.uaMatch(y),z.browser&&(e.browser[z.browser]=!0,e.browser.version=z.version),e.browser.webkit&&(e.browser.safari=!0),j.test(" ")&&(k=/^[\s\xA0]+/,l=/[\s\xA0]+$/),h=e(c),c.addEventListener?B=function(){c.removeEventListener("DOMContentLoaded",B,!1),e.ready()}:c.attachEvent&&(B=function(){c.readyState==="complete"&&(c.detachEvent("onreadystatechange",B),e.ready())});return e}(),g={};f.Callbacks=function(a){a=a?g[a]||h(a):{};var c=[],d=[],e,i,j,k,l,m=function(b){var d,e,g,h,i;for(d=0,e=b.length;d<e;d++)g=b[d],h=f.type(g),h==="array"?m(g):h==="function"&&(!a.unique||!o.has(g))&&c.push(g)},n=function(b,f){f=f||[],e=!a.memory||[b,f],i=!0,l=j||0,j=0,k=c.length;for(;c&&l<k;l++)if(c[l].apply(b,f)===!1&&a.stopOnFalse){e=!0;break}i=!1,c&&(a.once?e===!0?o.disable():c=[]:d&&d.length&&(e=d.shift(),o.fireWith(e[0],e[1])))},o={add:function(){if(c){var a=c.length;m(arguments),i?k=c.length:e&&e!==!0&&(j=a,n(e[0],e[1]))}return this},remove:function(){if(c){var b=arguments,d=0,e=b.length;for(;d<e;d++)for(var f=0;f<c.length;f++)if(b[d]===c[f]){i&&f<=k&&(k--,f<=l&&l--),c.splice(f--,1);if(a.unique)break}}return this},has:function(a){if(c){var b=0,d=c.length;for(;b<d;b++)if(a===c[b])return!0}return!1},empty:function(){c=[];return this},disable:function(){c=d=e=b;return this},disabled:function(){return!c},lock:function(){d=b,(!e||e===!0)&&o.disable();return this},locked:function(){return!d},fireWith:function(b,c){d&&(i?a.once||d.push([b,c]):(!a.once||!e)&&n(b,c));return this},fire:function(){o.fireWith(this,arguments);return this},fired:function(){return!!e}};return o};var i=[].slice;f.extend({Deferred:function(a){var b=f.Callbacks("once memory"),c=f.Callbacks("once memory"),d=f.Callbacks("memory"),e="pending",g={resolve:b,reject:c,notify:d},h={done:b.add,fail:c.add,progress:d.add,state:function(){return e},isResolved:b.fired,isRejected:c.fired,then:function(a,b,c){i.done(a).fail(b).progress(c);return this},always:function(){i.done.apply(i,arguments).fail.apply(i,arguments);return this},pipe:function(a,b,c){return f.Deferred(function(d){f.each({done:[a,"resolve"],fail:[b,"reject"],progress:[c,"notify"]},function(a,b){var c=b[0],e=b[1],g;f.isFunction(c)?i[a](function(){g=c.apply(this,arguments),g&&f.isFunction(g.promise)?g.promise().then(d.resolve,d.reject,d.notify):d[e+"With"](this===i?d:this,[g])}):i[a](d[e])})}).promise()},promise:function(a){if(a==null)a=h;else for(var b in h)a[b]=h[b];return a}},i=h.promise({}),j;for(j in g)i[j]=g[j].fire,i[j+"With"]=g[j].fireWith;i.done(function(){e="resolved"},c.disable,d.lock).fail(function(){e="rejected"},b.disable,d.lock),a&&a.call(i,i);return i},when:function(a){function m(a){return function(b){e[a]=arguments.length>1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c<d;c++)b[c]&&b[c].promise&&f.isFunction(b[c].promise)?b[c].promise().then(l(c),j.reject,m(c)):--g;g||j.resolveWith(j,b)}else j!==a&&j.resolveWith(j,d?[a]:[]);return k}}),f.support=function(){var b,d,e,g,h,i,j,k,l,m,n,o,p,q=c.createElement("div"),r=c.documentElement;q.setAttribute("className","t"),q.innerHTML=" <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>",d=q.getElementsByTagName("*"),e=q.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=q.getElementsByTagName("input")[0],b={leadingWhitespace:q.firstChild.nodeType===3,tbody:!q.getElementsByTagName("tbody").length,htmlSerialize:!!q.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:q.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav></:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete q.test}catch(s){b.deleteExpando=!1}!q.addEventListener&&q.attachEvent&&q.fireEvent&&(q.attachEvent("onclick",function(){b.noCloneEvent=!1}),q.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),q.appendChild(i),k=c.createDocumentFragment(),k.appendChild(q.lastChild),b.checkClone=k.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,k.removeChild(i),k.appendChild(q),q.innerHTML="",a.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",q.style.width="2px",q.appendChild(j),b.reliableMarginRight=(parseInt((a.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0);if(q.attachEvent)for(o in{submit:1,change:1,focusin:1})n="on"+o,p=n in q,p||(q.setAttribute(n,"return;"),p=typeof q[n]=="function"),b[o+"Bubbles"]=p;k.removeChild(q),k=g=h=j=q=i=null,f(function(){var a,d,e,g,h,i,j,k,m,n,o,r=c.getElementsByTagName("body")[0];!r||(j=1,k="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;",m="visibility:hidden;border:0;",n="style='"+k+"border:5px solid #000;padding:0;'",o="<div "+n+"><div></div></div>"+"<table "+n+" cellpadding='0' cellspacing='0'>"+"<tr><td></td></tr></table>",a=c.createElement("div"),a.style.cssText=m+"width:0;height:0;position:static;top:0;margin-top:"+j+"px",r.insertBefore(a,r.firstChild),q=c.createElement("div"),a.appendChild(q),q.innerHTML="<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>",l=q.getElementsByTagName("td"),p=l[0].offsetHeight===0,l[0].style.display="",l[1].style.display="none",b.reliableHiddenOffsets=p&&l[0].offsetHeight===0,q.innerHTML="",q.style.width=q.style.paddingLeft="1px",f.boxModel=b.boxModel=q.offsetWidth===2,typeof q.style.zoom!="undefined"&&(q.style.display="inline",q.style.zoom=1,b.inlineBlockNeedsLayout=q.offsetWidth===2,q.style.display="",q.innerHTML="<div style='width:4px;'></div>",b.shrinkWrapBlocks=q.offsetWidth!==2),q.style.cssText=k+m,q.innerHTML=o,d=q.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,i={doesNotAddBorder:e.offsetTop!==5,doesAddBorderForTableAndCells:h.offsetTop===5},e.style.position="fixed",e.style.top="20px",i.fixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",i.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,i.doesNotIncludeMarginInBodyOffset=r.offsetTop!==j,r.removeChild(a),q=a=null,f.extend(b,i))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e<g;e++)delete d[b[e]];if(!(c?m:f.isEmptyObject)(d))return}}if(!c){delete j[k].data;if(!m(j[k]))return}f.support.deleteExpando||!j.setInterval?delete j[k]:j[k]=null,i&&(f.support.deleteExpando?delete a[h]:a.removeAttribute?a.removeAttribute(h):a[h]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d,e,g,h=null;if(typeof a=="undefined"){if(this.length){h=f.data(this[0]);if(this[0].nodeType===1&&!f._data(this[0],"parsedAttrs")){e=this[0].attributes;for(var i=0,j=e.length;i<j;i++)g=e[i].name,g.indexOf("data-")===0&&(g=f.camelCase(g.substring(5)),l(this[0],g,h[g]));f._data(this[0],"parsedAttrs",!0)}}return h}if(typeof a=="object")return this.each(function(){f.data(this,a)});d=a.split("."),d[1]=d[1]?"."+d[1]:"";if(c===b){h=this.triggerHandler("getData"+d[1]+"!",[d[0]]),h===b&&this.length&&(h=f.data(this[0],a),h=l(this[0],a,h));return h===b&&d[1]?this.data(d[0]):h}return this.each(function(){var b=f(this),e=[d[0],c];b.triggerHandler("setData"+d[1]+"!",e),f.data(this,a,c),b.triggerHandler("changeData"+d[1]+"!",e)})},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,b){a&&(b=(b||"fx")+"mark",f._data(a,b,(f._data(a,b)||0)+1))},_unmark:function(a,b,c){a!==!0&&(c=b,b=a,a=!1);if(b){c=c||"fx";var d=c+"mark",e=a?0:(f._data(b,d)||1)-1;e?f._data(b,d,e):(f.removeData(b,d,!0),n(b,c,"mark"))}},queue:function(a,b,c){var d;if(a){b=(b||"fx")+"queue",d=f._data(a,b),c&&(!d||f.isArray(c)?d=f._data(a,b,f.makeArray(c)):d.push(c));return d||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e={};d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),f._data(a,b+".run",e),d.call(a,function(){f.dequeue(a,b)},e)),c.length||(f.removeData(a,b+"queue "+b+".run",!0),n(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){typeof a!="string"&&(c=a,a="fx");if(c===b)return f.queue(this[0],a);return this.each(function(){var b=f.queue(this,a,c);a==="fx"&&b[0]!=="inprogress"&&f.dequeue(this,a)})},dequeue:function(a){return this.each(function(){f.dequeue(this,a)})},delay:function(a,b){a=f.fx?f.fx.speeds[a]||a:a,b=b||"fx";return this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,c){function m(){--h||d.resolveWith(e,[e])}typeof a!="string"&&(c=a,a=b),a=a||"fx";var d=f.Deferred(),e=this,g=e.length,h=1,i=a+"defer",j=a+"queue",k=a+"mark",l;while(g--)if(l=f.data(e[g],i,b,!0)||(f.data(e[g],j,b,!0)||f.data(e[g],k,b,!0))&&f.data(e[g],i,f.Callbacks("once memory"),!0))h++,l.add(m);m();return d.promise()}});var o=/[\n\t\r]/g,p=/\s+/,q=/\r/g,r=/^(?:button|input)$/i,s=/^(?:button|input|object|select|textarea)$/i,t=/^a(?:rea)?$/i,u=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,v=f.support.getSetAttribute,w,x,y;f.fn.extend({attr:function(a,b){return f.access(this,a,b,!0,f.attr)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,a,b,!0,f.prop)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(p);for(c=0,d=this.length;c<d;c++){e=this[c];if(e.nodeType===1)if(!e.className&&b.length===1)e.className=a;else{g=" "+e.className+" ";for(h=0,i=b.length;h<i;h++)~g.indexOf(" "+b[h]+" ")||(g+=b[h]+" ");e.className=f.trim(g)}}}return this},removeClass:function(a){var c,d,e,g,h,i,j;if(f.isFunction(a))return this.each(function(b){f(this).removeClass(a.call(this,b,this.className))});if(a&&typeof a=="string"||a===b){c=(a||"").split(p);for(d=0,e=this.length;d<e;d++){g=this[d];if(g.nodeType===1&&g.className)if(a){h=(" "+g.className+" ").replace(o," ");for(i=0,j=c.length;i<j;i++)h=h.replace(" "+c[i]+" "," ");g.className=f.trim(h)}else g.className=""}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b=="boolean";if(f.isFunction(a))return this.each(function(c){f(this).toggleClass(a.call(this,c,this.className,b),b)});return this.each(function(){if(c==="string"){var e,g=0,h=f(this),i=b,j=a.split(p);while(e=j[g++])i=d?i:!h.hasClass(e),h[i?"addClass":"removeClass"](e)}else if(c==="undefined"||c==="boolean")this.className&&f._data(this,"__className__",this.className),this.className=this.className||a===!1?"":f._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ",c=0,d=this.length;for(;c<d;c++)if(this[c].nodeType===1&&(" "+this[c].className+" ").replace(o," ").indexOf(b)>-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.nodeName.toLowerCase()]||f.valHooks[g.type];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c<d;c++){e=i[c];if(e.selected&&(f.support.optDisabled?!e.disabled:e.getAttribute("disabled")===null)&&(!e.parentNode.disabled||!f.nodeName(e.parentNode,"optgroup"))){b=f(e).val();if(j)return b;h.push(b)}}if(j&&!h.length&&i.length)return f(i[g]).val();return h},set:function(a,b){var c=f.makeArray(b);f(a).find("option").each(function(){this.selected=f.inArray(f(this).val(),c)>=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;h<g;h++)e=d[h],e&&(c=f.propFix[e]||e,f.attr(a,e,""),a.removeAttribute(v?e:c),u.test(e)&&c in a&&(a[c]=!1))}},attrHooks:{type:{set:function(a,b){if(r.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},value:{get:function(a,b){if(w&&f.nodeName(a,"button"))return w.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(w&&f.nodeName(a,"button"))return w.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e,g,h,i=a.nodeType;if(!!a&&i!==3&&i!==8&&i!==2){h=i!==1||!f.isXMLDoc(a),h&&(c=f.propFix[c]||c,g=f.propHooks[c]);return d!==b?g&&"set"in g&&(e=g.set(a,d,c))!==b?e:a[c]=d:g&&"get"in g&&(e=g.get(a,c))!==null?e:a[c]}},propHooks:{tabIndex:{get:function(a){var c=a.getAttributeNode("tabindex");return c&&c.specified?parseInt(c.value,10):s.test(a.nodeName)||t.test(a.nodeName)&&a.href?0:b}}}}),f.attrHooks.tabindex=f.propHooks.tabIndex,x={get:function(a,c){var d,e=f.prop(a,c);return e===!0||typeof e!="boolean"&&(d=a.getAttributeNode(c))&&d.nodeValue!==!1?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},v||(y={name:!0,id:!0},w=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&(y[c]?d.nodeValue!=="":d.specified)?d.nodeValue:b},set:function(a,b,d){var e=a.getAttributeNode(d);e||(e=c.createAttribute(d),a.setAttributeNode(e));return e.nodeValue=b+""}},f.attrHooks.tabindex.set=w.set,f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})}),f.attrHooks.contenteditable={get:w.get,set:function(a,b,c){b===""&&(b="false"),w.set(a,b,c)}}),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex);return null}})),f.support.enctype||(f.propFix.enctype="encoding"),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/\bhover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function(a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")};
+f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k<c.length;k++){l=A.exec(c[k])||[],m=l[1],n=(l[2]||"").split(".").sort(),s=f.event.special[m]||{},m=(g?s.delegateType:s.bindType)||m,s=f.event.special[m]||{},o=f.extend({type:m,origType:l[1],data:e,handler:d,guid:d.guid,selector:g,quick:G(g),namespace:n.join(".")},p),r=j[m];if(!r){r=j[m]=[],r.delegateCount=0;if(!s.setup||s.setup.call(a,e,n,i)===!1)a.addEventListener?a.addEventListener(m,i,!1):a.attachEvent&&a.attachEvent("on"+m,i)}s.add&&(s.add.call(a,o),o.handler.guid||(o.handler.guid=d.guid)),g?r.splice(r.delegateCount++,0,o):r.push(o),f.event.global[m]=!0}a=null}},global:{},remove:function(a,b,c,d,e){var g=f.hasData(a)&&f._data(a),h,i,j,k,l,m,n,o,p,q,r,s;if(!!g&&!!(o=g.events)){b=f.trim(I(b||"")).split(" ");for(h=0;h<b.length;h++){i=A.exec(b[h])||[],j=k=i[1],l=i[2];if(!j){for(j in o)f.event.remove(a,j+b[h],c,d,!0);continue}p=f.event.special[j]||{},j=(d?p.delegateType:p.bindType)||j,r=o[j]||[],m=r.length,l=l?new RegExp("(^|\\.)"+l.split(".").sort().join("\\.(?:.*\\.)?")+"(\\.|$)"):null;for(n=0;n<r.length;n++)s=r[n],(e||k===s.origType)&&(!c||c.guid===s.guid)&&(!l||l.test(s.namespace))&&(!d||d===s.selector||d==="**"&&s.selector)&&(r.splice(n--,1),s.selector&&r.delegateCount--,p.remove&&p.remove.call(a,s));r.length===0&&m!==r.length&&((!p.teardown||p.teardown.call(a,l)===!1)&&f.removeEvent(a,j,g.handle),delete o[j])}f.isEmptyObject(o)&&(q=g.handle,q&&(q.elem=null),f.removeData(a,["events","handle"],!0))}},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(c,d,e,g){if(!e||e.nodeType!==3&&e.nodeType!==8){var h=c.type||c,i=[],j,k,l,m,n,o,p,q,r,s;if(E.test(h+f.event.triggered))return;h.indexOf("!")>=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;l<r.length&&!c.isPropagationStopped();l++)m=r[l][0],c.type=r[l][1],q=(f._data(m,"events")||{})[c.type]&&f._data(m,"handle"),q&&q.apply(m,d),q=o&&m[o],q&&f.acceptData(m)&&q.apply(m,d)===!1&&c.preventDefault();c.type=h,!g&&!c.isDefaultPrevented()&&(!p._default||p._default.apply(e.ownerDocument,d)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)&&o&&e[h]&&(h!=="focus"&&h!=="blur"||c.target.offsetWidth!==0)&&!f.isWindow(e)&&(n=e[o],n&&(e[o]=null),f.event.triggered=h,e[h](),f.event.triggered=b,n&&(e[o]=n));return c.result}},dispatch:function(c){c=f.event.fix(c||a.event);var d=(f._data(this,"events")||{})[c.type]||[],e=d.delegateCount,g=[].slice.call(arguments,0),h=!c.exclusive&&!c.namespace,i=[],j,k,l,m,n,o,p,q,r,s,t;g[0]=c,c.delegateTarget=this;if(e&&!c.target.disabled&&(!c.button||c.type!=="click")){m=f(this),m.context=this.ownerDocument||this;for(l=c.target;l!=this;l=l.parentNode||this){o={},q=[],m[0]=l;for(j=0;j<e;j++)r=d[j],s=r.selector,o[s]===b&&(o[s]=r.quick?H(l,r.quick):m.is(s)),o[s]&&q.push(r);q.length&&i.push({elem:l,matches:q})}}d.length>e&&i.push({elem:this,matches:d.slice(e)});for(j=0;j<i.length&&!c.isPropagationStopped();j++){p=i[j],c.currentTarget=p.elem;for(k=0;k<p.matches.length&&!c.isImmediatePropagationStopped();k++){r=p.matches[k];if(h||!c.namespace&&!r.namespace||c.namespace_re&&c.namespace_re.test(r.namespace))c.data=r.data,c.handleObj=r,n=((f.event.special[r.origType]||{}).handle||r.handler).apply(p.elem,g),n!==b&&(c.result=n,n===!1&&(c.preventDefault(),c.stopPropagation()))}}return c.result},props:"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){a.which==null&&(a.which=b.charCode!=null?b.charCode:b.keyCode);return a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,d){var e,f,g,h=d.button,i=d.fromElement;a.pageX==null&&d.clientX!=null&&(e=a.target.ownerDocument||c,f=e.documentElement,g=e.body,a.pageX=d.clientX+(f&&f.scrollLeft||g&&g.scrollLeft||0)-(f&&f.clientLeft||g&&g.clientLeft||0),a.pageY=d.clientY+(f&&f.scrollTop||g&&g.scrollTop||0)-(f&&f.clientTop||g&&g.clientTop||0)),!a.relatedTarget&&i&&(a.relatedTarget=i===a.target?d.toElement:i),!a.which&&h!==b&&(a.which=h&1?1:h&2?3:h&4?2:0);return a}},fix:function(a){if(a[f.expando])return a;var d,e,g=a,h=f.event.fixHooks[a.type]||{},i=h.props?this.props.concat(h.props):this.props;a=f.Event(g);for(d=i.length;d;)e=i[--d],a[e]=g[e];a.target||(a.target=g.srcElement||c),a.target.nodeType===3&&(a.target=a.target.parentNode),a.metaKey===b&&(a.metaKey=a.ctrlKey);return h.filter?h.filter(a,g):a},special:{ready:{setup:f.bindReady},load:{noBubble:!0},focus:{delegateType:"focusin"},blur:{delegateType:"focusout"},beforeunload:{setup:function(a,b,c){f.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}},simulate:function(a,b,c,d){var e=f.extend(new f.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?f.event.trigger(e,null,b):f.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},f.event.handle=f.event.dispatch,f.removeEvent=c.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){a.detachEvent&&a.detachEvent("on"+b,c)},f.Event=function(a,b){if(!(this instanceof f.Event))return new f.Event(a,b);a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?K:J):this.type=a,b&&f.extend(this,b),this.timeStamp=a&&a.timeStamp||f.now(),this[f.expando]=!0},f.Event.prototype={preventDefault:function(){this.isDefaultPrevented=K;var a=this.originalEvent;!a||(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){this.isPropagationStopped=K;var a=this.originalEvent;!a||(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=K,this.stopPropagation()},isDefaultPrevented:J,isPropagationStopped:J,isImmediatePropagationStopped:J},f.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){f.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c=this,d=a.relatedTarget,e=a.handleObj,g=e.selector,h;if(!d||d!==c&&!f.contains(c,d))a.type=e.origType,h=e.handler.apply(this,arguments),a.type=b;return h}}}),f.support.submitBubbles||(f.event.special.submit={setup:function(){if(f.nodeName(this,"form"))return!1;f.event.add(this,"click._submit keypress._submit",function(a){var c=a.target,d=f.nodeName(c,"input")||f.nodeName(c,"button")?c.form:b;d&&!d._submit_attached&&(f.event.add(d,"submit._submit",function(a){this.parentNode&&!a.isTrigger&&f.event.simulate("submit",this.parentNode,a,!0)}),d._submit_attached=!0)})},teardown:function(){if(f.nodeName(this,"form"))return!1;f.event.remove(this,"._submit")}}),f.support.changeBubbles||(f.event.special.change={setup:function(){if(z.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio")f.event.add(this,"propertychange._change",function(a){a.originalEvent.propertyName==="checked"&&(this._just_changed=!0)}),f.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1,f.event.simulate("change",this,a,!0))});return!1}f.event.add(this,"beforeactivate._change",function(a){var b=a.target;z.test(b.nodeName)&&!b._change_attached&&(f.event.add(b,"change._change",function(a){this.parentNode&&!a.isSimulated&&!a.isTrigger&&f.event.simulate("change",this.parentNode,a,!0)}),b._change_attached=!0)})},handle:function(a){var b=a.target;if(this!==b||a.isSimulated||a.isTrigger||b.type!=="radio"&&b.type!=="checkbox")return a.handleObj.handler.apply(this,arguments)},teardown:function(){f.event.remove(this,"._change");return z.test(this.nodeName)}}),f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){var d=0,e=function(a){f.event.simulate(b,a.target,f.event.fix(a),!0)};f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.fn.extend({on:function(a,c,d,e,g){var h,i;if(typeof a=="object"){typeof c!="string"&&(d=c,c=b);for(i in a)this.on(i,c,d,a[i],g);return this}d==null&&e==null?(e=c,d=c=b):e==null&&(typeof c=="string"?(e=d,d=b):(e=d,d=c,c=b));if(e===!1)e=J;else if(!e)return this;g===1&&(h=e,e=function(a){f().off(a);return h.apply(this,arguments)},e.guid=h.guid||(h.guid=f.guid++));return this.each(function(){f.event.add(this,a,e,d,c)})},one:function(a,b,c,d){return this.on.call(this,a,b,c,d,1)},off:function(a,c,d){if(a&&a.preventDefault&&a.handleObj){var e=a.handleObj;f(a.delegateTarget).off(e.namespace?e.type+"."+e.namespace:e.type,e.selector,e.handler);return this}if(typeof a=="object"){for(var g in a)this.off(g,c,a[g]);return this}if(c===!1||typeof c=="function")d=c,c=b;d===!1&&(d=J);return this.each(function(){f.event.remove(this,a,d,c)})},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},live:function(a,b,c){f(this.context).on(a,this.selector,b,c);return this},die:function(a,b){f(this.context).off(a,this.selector||"**",b);return this},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return arguments.length==1?this.off(a,"**"):this.off(b,a,c)},trigger:function(a,b){return this.each(function(){f.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0])return f.event.trigger(a,b,this[0],!0)},toggle:function(a){var b=arguments,c=a.guid||f.guid++,d=0,e=function(c){var e=(f._data(this,"lastToggle"+a.guid)||0)%d;f._data(this,"lastToggle"+a.guid,e+1),c.preventDefault();return b[e].apply(this,arguments)||!1};e.guid=c;while(d<b.length)b[d++].guid=c;return this.click(e)},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),f.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(a,b){f.fn[b]=function(a,c){c==null&&(c=a,a=null);return arguments.length>0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}if(j.nodeType===1){g||(j[d]=c,j.sizset=h);if(typeof b!="string"){if(j===b){k=!0;break}}else if(m.filter(b,[j]).length>0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}j.nodeType===1&&!g&&(j[d]=c,j.sizset=h);if(j.nodeName.toLowerCase()===b){k=j;break}j=j[a]}e[h]=k}}}var a=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b<a.length;b++)a[b]===a[b-1]&&a.splice(b--,1)}return a},m.matches=function(a,b){return m(a,null,null,b)},m.matchesSelector=function(a,b){return m(b,null,null,[a]).length>0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e<f;e++){h=o.order[e];if(g=o.leftMatch[h].exec(a)){i=g[1],g.splice(1,1);if(i.substr(i.length-1)!=="\\"){g[1]=(g[1]||"").replace(j,""),d=o.find[h](g,b,c);if(d!=null){a=a.replace(o.match[h],"");break}}}}d||(d=typeof b.getElementsByTagName!="undefined"?b.getElementsByTagName("*"):[]);return{set:d,expr:a}},m.filter=function(a,c,d,e){var f,g,h,i,j,k,l,n,p,q=a,r=[],s=c,t=c&&c[0]&&m.isXML(c[0]);while(a&&c.length){for(h in o.filter)if((f=o.leftMatch[h].exec(a))!=null&&f[2]){k=o.filter[h],l=f[1],g=!1,f.splice(1,1);if(l.substr(l.length-1)==="\\")continue;s===r&&(r=[]);if(o.preFilter[h]){f=o.preFilter[h](f,s,d,r,e,t);if(!f)g=i=!0;else if(f===!0)continue}if(f)for(n=0;(j=s[n])!=null;n++)j&&(i=k(j,f,n,s),p=e^i,d&&i!=null?p?g=!0:s[n]=!1:p&&(r.push(j),g=!0));if(i!==b){d||(s=r),a=a.replace(o.match[h],"");if(!g)return[];break}}if(a===q)if(g==null)m.error(a);else break;q=a}return s},m.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)};var n=m.getText=function(a){var b,c,d=a.nodeType,e="";if(d){if(d===1||d===9){if(typeof a.textContent=="string")return a.textContent;if(typeof a.innerText=="string")return a.innerText.replace(k,"");for(a=a.firstChild;a;a=a.nextSibling)e+=n(a)}else if(d===3||d===4)return a.nodeValue}else for(b=0;c=a[b];b++)c.nodeType!==8&&(e+=n(c));return e},o=m.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(a){return a.getAttribute("href")},type:function(a){return a.getAttribute("type")}},relative:{"+":function(a,b){var c=typeof b=="string",d=c&&!l.test(b),e=c&&!d;d&&(b=b.toLowerCase());for(var f=0,g=a.length,h;f<g;f++)if(h=a[f]){while((h=h.previousSibling)&&h.nodeType!==1);a[f]=e||h&&h.nodeName.toLowerCase()===b?h||!1:h===b}e&&m.filter(b,a,!0)},">":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e<f;e++){c=a[e];if(c){var g=c.parentNode;a[e]=g.nodeName.toLowerCase()===b?g:!1}}}else{for(;e<f;e++)c=a[e],c&&(a[e]=d?c.parentNode:c.parentNode===b);d&&m.filter(b,a,!0)}},"":function(a,b,c){var d,f=e++,g=x;typeof b=="string"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g("parentNode",b,f,a,d,c)},"~":function(a,b,c){var d,f=e++,g=x;typeof b=="string"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g("previousSibling",b,f,a,d,c)}},find:{ID:function(a,b,c){if(typeof b.getElementById!="undefined"&&!c){var d=b.getElementById(a[1]);return d&&d.parentNode?[d]:[]}},NAME:function(a,b){if(typeof b.getElementsByName!="undefined"){var c=[],d=b.getElementsByName(a[1]);for(var e=0,f=d.length;e<f;e++)d[e].getAttribute("name")===a[1]&&c.push(d[e]);return c.length===0?null:c}},TAG:function(a,b){if(typeof b.getElementsByTagName!="undefined")return b.getElementsByTagName(a[1])}},preFilter:{CLASS:function(a,b,c,d,e,f){a=" "+a[1].replace(j,"")+" ";if(f)return a;for(var g=0,h;(h=b[g])!=null;g++)h&&(e^(h.className&&(" "+h.className+" ").replace(/[\t\n\r]/g," ").indexOf(a)>=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return b<c[3]-0},gt:function(a,b,c){return b>c[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h<i;h++)if(g[h]===a)return!1;return!0}m.error(e)},CHILD:function(a,b){var c,e,f,g,h,i,j,k=b[1],l=a;switch(k){case"only":case"first":while(l=l.previousSibling)if(l.nodeType===1)return!1;if(k==="first")return!0;l=a;case"last":while(l=l.nextSibling)if(l.nodeType===1)return!1;return!0;case"nth":c=b[2],e=b[3];if(c===1&&e===0)return!0;f=b[0],g=a.parentNode;if(g&&(g[d]!==f||!a.nodeIndex)){i=0;for(l=g.firstChild;l;l=l.nextSibling)l.nodeType===1&&(l.nodeIndex=++i);g[d]=f}j=a.nodeIndex-e;return c===0?j===0:j%c===0&&j/c>=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c<e;c++)d.push(a[c]);else for(;a[c];c++)d.push(a[c]);return d}}var u,v;c.documentElement.compareDocumentPosition?u=function(a,b){if(a===b){h=!0;return 0}if(!a.compareDocumentPosition||!b.compareDocumentPosition)return a.compareDocumentPosition?-1:1;return a.compareDocumentPosition(b)&4?-1:1}:(u=function(a,b){if(a===b){h=!0;return 0}if(a.sourceIndex&&b.sourceIndex)return a.sourceIndex-b.sourceIndex;var c,d,e=[],f=[],g=a.parentNode,i=b.parentNode,j=g;if(g===i)return v(a,b);if(!g)return-1;if(!i)return 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)f.unshift(j),j=j.parentNode;c=e.length,d=f.length;for(var k=0;k<c&&k<d;k++)if(e[k]!==f[k])return v(e[k],f[k]);return k===c?v(a,f[k],-1):v(e[k],b,1)},v=function(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),function(){var a=c.createElement("div"),d="script"+(new Date).getTime(),e=c.documentElement;a.innerHTML="<a name='"+d+"'/>",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="<p class='TEST'></p>";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="<div class='test e'></div><div class='test'></div>";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h<i;h++)m(a,g[h],e,c);return m.filter(f,e)};m.attr=f.attr,m.selectors.attrMap={},f.find=m,f.expr=m.selectors,f.expr[":"]=f.expr.filters,f.unique=m.uniqueSort,f.text=m.getText,f.isXMLDoc=m.isXML,f.contains=m.contains}();var L=/Until$/,M=/^(?:parents|prevUntil|prevAll)/,N=/,/,O=/^.[^:#\[\.,]*$/,P=Array.prototype.slice,Q=f.expr.match.POS,R={children:!0,contents:!0,next:!0,prev:!0};f.fn.extend({find:function(a){var b=this,c,d;if(typeof a!="string")return f(a).filter(function(){for(c=0,d=b.length;c<d;c++)if(f.contains(b[c],this))return!0});var e=this.pushStack("","find",a),g,h,i;for(c=0,d=this.length;c<d;c++){g=e.length,f.find(a,this[c],e);if(c>0)for(h=g;h<e.length;h++)for(i=0;i<g;i++)if(e[i]===e[h]){e.splice(h--,1);break}}return e},has:function(a){var b=f(a);return this.filter(function(){for(var a=0,c=b.length;a<c;a++)if(f.contains(this,b[a]))return!0})},not:function(a){return this.pushStack(T(this,a,!1),"not",a)},filter:function(a){return this.pushStack(T(this,a,!0),"filter",a)},is:function(a){return!!a&&(typeof a=="string"?Q.test(a)?f(a,this.context).index(this[0])>=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d<a.length;d++)f(g).is(a[d])&&c.push({selector:a[d],elem:g,level:h});g=g.parentNode,h++}return c}var i=Q.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d<e;d++){g=this[d];while(g){if(i?i.index(g)>-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/<tbody/i,_=/<|&#?\w+;/,ba=/<(?:script|style)/i,bb=/<(?:script|object|embed|option|style)/i,bc=new RegExp("<(?:"+V+")","i"),bd=/checked\s*(?:[^=]|=\s*.checked.)/i,be=/\/(java|ecma)script/i,bf=/^\s*<!(?:\[CDATA\[|\-\-)/,bg={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div<div>","</div>"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function()
+{for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1></$2>");try{for(var c=0,d=this.length;c<d;c++)this[c].nodeType===1&&(f.cleanData(this[c].getElementsByTagName("*")),this[c].innerHTML=a)}catch(e){this.empty().append(a)}}else f.isFunction(a)?this.each(function(b){var c=f(this);c.html(a.call(this,b,c.html()))}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(f.isFunction(a))return this.each(function(b){var c=f(this),d=c.html();c.replaceWith(a.call(this,b,d))});typeof a!="string"&&(a=f(a).detach());return this.each(function(){var b=this.nextSibling,c=this.parentNode;f(this).remove(),b?f(b).before(a):f(c).append(a)})}return this.length?this.pushStack(f(f.isFunction(a)?a():a),"replaceWith",a):this},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,d){var e,g,h,i,j=a[0],k=[];if(!f.support.checkClone&&arguments.length===3&&typeof j=="string"&&bd.test(j))return this.each(function(){f(this).domManip(a,c,d,!0)});if(f.isFunction(j))return this.each(function(e){var g=f(this);a[0]=j.call(this,e,c?g.html():b),g.domManip(a,c,d)});if(this[0]){i=j&&j.parentNode,f.support.parentNode&&i&&i.nodeType===11&&i.childNodes.length===this.length?e={fragment:i}:e=f.buildFragment(a,this,k),h=e.fragment,h.childNodes.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&&f.nodeName(g,"tr");for(var l=0,m=this.length,n=m-1;l<m;l++)d.call(c?bi(this[l],g):this[l],e.cacheable||m>1&&l<n?f.clone(h,!0,!0):h)}k.length&&f.each(k,bp)}return this}}),f.buildFragment=function(a,b,d){var e,g,h,i,j=a[0];b&&b[0]&&(i=b[0].ownerDocument||b[0]),i.createDocumentFragment||(i=c),a.length===1&&typeof j=="string"&&j.length<512&&i===c&&j.charAt(0)==="<"&&!bb.test(j)&&(f.support.checkClone||!bd.test(j))&&(f.support.html5Clone||!bc.test(j))&&(g=!0,h=f.fragments[j],h&&h!==1&&(e=h)),e||(e=i.createDocumentFragment(),f.clean(a,i,e,d)),g&&(f.fragments[j]=h?e:1);return{fragment:e,cacheable:g}},f.fragments={},f.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){f.fn[a]=function(c){var d=[],e=f(c),g=this.length===1&&this[0].parentNode;if(g&&g.nodeType===11&&g.childNodes.length===1&&e.length===1){e[b](this[0]);return this}for(var h=0,i=e.length;h<i;h++){var j=(h>0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||!bc.test("<"+a.nodeName)?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!_.test(k))k=b.createTextNode(k);else{k=k.replace(Y,"<$1></$2>");var l=(Z.exec(k)||["",""])[1].toLowerCase(),m=bg[l]||bg._default,n=m[0],o=b.createElement("div");b===c?bh.appendChild(o):U(b).appendChild(o),o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=$.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]==="<table>"&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&X.test(k)&&o.insertBefore(b.createTextNode(X.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i<r;i++)bn(k[i]);else bn(k);k.nodeType?h.push(k):h=f.merge(h,k)}if(d){g=function(a){return!a.type||be.test(a.type)};for(j=0;h[j];j++)if(e&&f.nodeName(h[j],"script")&&(!h[j].type||h[j].type.toLowerCase()==="text/javascript"))e.push(h[j].parentNode?h[j].parentNode.removeChild(h[j]):h[j]);else{if(h[j].nodeType===1){var s=f.grep(h[j].getElementsByTagName("script"),g);h.splice.apply(h,[j+1,0].concat(s))}d.appendChild(h[j])}}return h},cleanData:function(a){var b,c,d=f.cache,e=f.event.special,g=f.support.deleteExpando;for(var h=0,i;(i=a[h])!=null;h++){if(i.nodeName&&f.noData[i.nodeName.toLowerCase()])continue;c=i[f.expando];if(c){b=d[c];if(b&&b.events){for(var j in b.events)e[j]?f.event.remove(i,j):f.removeEvent(i,j,b.handle);b.handle&&(b.handle.elem=null)}g?delete i[f.expando]:i.removeAttribute&&i.removeAttribute(f.expando),delete d[c]}}}});var bq=/alpha\([^)]*\)/i,br=/opacity=([^)]*)/,bs=/([A-Z]|^ms)/g,bt=/^-?\d+(?:px)?$/i,bu=/^-?\d/,bv=/^([\-+])=([\-+.\de]+)/,bw={position:"absolute",visibility:"hidden",display:"block"},bx=["Left","Right"],by=["Top","Bottom"],bz,bA,bB;f.fn.css=function(a,c){if(arguments.length===2&&c===b)return this;return f.access(this,a,c,!0,function(a,c,d){return d!==b?f.style(a,c,d):f.css(a,c)})},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bz(a,"opacity","opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h==="string"&&(g=bv.exec(d))&&(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h="number");if(d==null||h==="number"&&isNaN(d))return;h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(bz)return bz(a,c)},swap:function(a,b,c){var d={};for(var e in b)d[e]=a.style[e],a.style[e]=b[e];c.call(a);for(e in b)a.style[e]=d[e]}}),f.curCSS=f.css,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){var e;if(c){if(a.offsetWidth!==0)return bC(a,b,d);f.swap(a,bw,function(){e=bC(a,b,d)});return e}},set:function(a,b){if(!bt.test(b))return b;b=parseFloat(b);if(b>=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return br.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bq,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bq.test(g)?g.replace(bq,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bz(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bA=function(a,b){var c,d,e;b=b.replace(bs,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b)));return c}),c.documentElement.currentStyle&&(bB=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f===null&&g&&(e=g[b])&&(f=e),!bt.test(f)&&bu.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f||0,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),bz=bA||bB,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bD=/%20/g,bE=/\[\]$/,bF=/\r?\n/g,bG=/#.*$/,bH=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bI=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bJ=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bK=/^(?:GET|HEAD)$/,bL=/^\/\//,bM=/\?/,bN=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bO=/^(?:select|textarea)/i,bP=/\s+/,bQ=/([?&])_=[^&]*/,bR=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bS=f.fn.load,bT={},bU={},bV,bW,bX=["*/"]+["*"];try{bV=e.href}catch(bY){bV=c.createElement("a"),bV.href="",bV=bV.href}bW=bR.exec(bV.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bS)return bS.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("<div>").append(c.replace(bN,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bO.test(this.nodeName)||bI.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bF,"\r\n")}}):{name:b.name,value:c.replace(bF,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b_(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b_(a,b);return a},ajaxSettings:{url:bV,isLocal:bJ.test(bW[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bX},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bZ(bT),ajaxTransport:bZ(bU),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?cb(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cc(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bH.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bG,"").replace(bL,bW[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bP),d.crossDomain==null&&(r=bR.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bW[1]&&r[2]==bW[2]&&(r[3]||(r[1]==="http:"?80:443))==(bW[3]||(bW[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),b$(bT,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bK.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bM.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bQ,"$1_="+x);d.url=y+(y===d.url?(bM.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bX+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=b$(bU,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)ca(g,a[g],c,e);return d.join("&").replace(bD,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cd=f.now(),ce=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cd++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ce.test(b.url)||e&&ce.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ce,l),b.url===j&&(e&&(k=k.replace(ce,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cf=a.ActiveXObject?function(){for(var a in ch)ch[a](0,1)}:!1,cg=0,ch;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ci()||cj()}:ci,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cf&&delete ch[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cg,cf&&(ch||(ch={},f(a).unload(cf)),ch[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var ck={},cl,cm,cn=/^(?:toggle|show|hide)$/,co=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cp,cq=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cr;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cu("show",3),a,b,c);for(var g=0,h=this.length;g<h;g++)d=this[g],d.style&&(e=d.style.display,!f._data(d,"olddisplay")&&e==="none"&&(e=d.style.display=""),e===""&&f.css(d,"display")==="none"&&f._data(d,"olddisplay",cv(d.nodeName)));for(g=0;g<h;g++){d=this[g];if(d.style){e=d.style.display;if(e===""||e==="none")d.style.display=f._data(d,"olddisplay")||""}}return this},hide:function(a,b,c){if(a||a===0)return this.animate(cu("hide",3),a,b,c);var d,e,g=0,h=this.length;for(;g<h;g++)d=this[g],d.style&&(e=f.css(d,"display"),e!=="none"&&!f._data(d,"olddisplay")&&f._data(d,"olddisplay",e));for(g=0;g<h;g++)this[g].style&&(this[g].style.display="none");return this},_toggle:f.fn.toggle,toggle:function(a,b,c){var d=typeof a=="boolean";f.isFunction(a)&&f.isFunction(b)?this._toggle.apply(this,arguments):a==null||d?this.each(function(){var b=d?a:f(this).is(":hidden");f(this)[b?"show":"hide"]()}):this.animate(cu("toggle",3),a,b,c);return this},fadeTo:function(a,b,c,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){function g(){e.queue===!1&&f._mark(this);var b=f.extend({},e),c=this.nodeType===1,d=c&&f(this).is(":hidden"),g,h,i,j,k,l,m,n,o;b.animatedProperties={};for(i in a){g=f.camelCase(i),i!==g&&(a[g]=a[i],delete a[i]),h=a[g],f.isArray(h)?(b.animatedProperties[g]=h[1],h=a[g]=h[0]):b.animatedProperties[g]=b.specialEasing&&b.specialEasing[g]||b.easing||"swing";if(h==="hide"&&d||h==="show"&&!d)return b.complete.call(this);c&&(g==="height"||g==="width")&&(b.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY],f.css(this,"display")==="inline"&&f.css(this,"float")==="none"&&(!f.support.inlineBlockNeedsLayout||cv(this.nodeName)==="inline"?this.style.display="inline-block":this.style.zoom=1))}b.overflow!=null&&(this.style.overflow="hidden");for(i in a)j=new f.fx(this,b,i),h=a[i],cn.test(h)?(o=f._data(this,"toggle"+i)||(h==="toggle"?d?"show":"hide":0),o?(f._data(this,"toggle"+i,o==="show"?"hide":"show"),j[o]()):j[h]()):(k=co.exec(h),l=j.cur(),k?(m=parseFloat(k[2]),n=k[3]||(f.cssNumber[i]?"":"px"),n!=="px"&&(f.style(this,i,(m||1)+n),l=(m||1)/j.cur()*l,f.style(this,i,l+n)),k[1]&&(m=(k[1]==="-="?-1:1)*m+l),j.custom(l,m,n)):j.custom(l,h,""));return!0}var e=f.speed(b,c,d);if(f.isEmptyObject(a))return this.each(e.complete,[!1]);a=f.extend({},a);return e.queue===!1?this.each(g):this.queue(e.queue,g)},stop:function(a,c,d){typeof a!="string"&&(d=c,c=a,a=b),c&&a!==!1&&this.queue(a||"fx",[]);return this.each(function(){function h(a,b,c){var e=b[c];f.removeData(a,c,!0),e.stop(d)}var b,c=!1,e=f.timers,g=f._data(this);d||f._unmark(!0,this);if(a==null)for(b in g)g[b]&&g[b].stop&&b.indexOf(".run")===b.length-4&&h(this,g,b);else g[b=a+".run"]&&g[b].stop&&h(this,g,b);for(b=e.length;b--;)e[b].elem===this&&(a==null||e[b].queue===a)&&(d?e[b](!0):e[b].saveState(),c=!0,e.splice(b,1));(!d||!c)&&f.dequeue(this,a)})}}),f.each({slideDown:cu("show",1),slideUp:cu("hide",1),slideToggle:cu("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){f.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),f.extend({speed:function(a,b,c){var d=a&&typeof a=="object"?f.extend({},a):{complete:c||!c&&b||f.isFunction(a)&&a,duration:a,easing:c&&b||b&&!f.isFunction(b)&&b};d.duration=f.fx.off?0:typeof d.duration=="number"?d.duration:d.duration in f.fx.speeds?f.fx.speeds[d.duration]:f.fx.speeds._default;if(d.queue==null||d.queue===!0)d.queue="fx";d.old=d.complete,d.complete=function(a){f.isFunction(d.old)&&d.old.call(this),d.queue?f.dequeue(this,d.queue):a!==!1&&f._unmark(this)};return d},easing:{linear:function(a,b,c,d){return c+d*a},swing:function(a,b,c,d){return(-Math.cos(a*Math.PI)/2+.5)*d+c}},timers:[],fx:function(a,b,c){this.options=b,this.elem=a,this.prop=c,b.orig=b.orig||{}}}),f.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this),(f.fx.step[this.prop]||f.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a,b=f.css(this.elem,this.prop);return isNaN(a=parseFloat(b))?!b||b==="auto"?0:b:a},custom:function(a,c,d){function h(a){return e.step(a)}var e=this,g=f.fx;this.startTime=cr||cs(),this.end=c,this.now=this.start=a,this.pos=this.state=0,this.unit=d||this.unit||(f.cssNumber[this.prop]?"":"px"),h.queue=this.options.queue,h.elem=this.elem,h.saveState=function(){e.options.hide&&f._data(e.elem,"fxshow"+e.prop)===b&&f._data(e.elem,"fxshow"+e.prop,e.start)},h()&&f.timers.push(h)&&!cp&&(cp=setInterval(g.tick,g.interval))},show:function(){var a=f._data(this.elem,"fxshow"+this.prop);this.options.orig[this.prop]=a||f.style(this.elem,this.prop),this.options.show=!0,a!==b?this.custom(this.cur(),a):this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur()),f(this.elem).show()},hide:function(){this.options.orig[this.prop]=f._data(this.elem,"fxshow"+this.prop)||f.style(this.elem,this.prop),this.options.hide=!0,this.custom(this.cur(),0)},step:function(a){var b,c,d,e=cr||cs(),g=!0,h=this.elem,i=this.options;if(a||e>=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c<b.length;c++)a=b[c],!a()&&b[c]===a&&b.splice(c--,1);b.length||f.fx.stop()},interval:13,stop:function(){clearInterval(cp),cp=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){f.style(a.elem,"opacity",a.now)},_default:function(a){a.elem.style&&a.elem.style[a.prop]!=null?a.elem.style[a.prop]=a.now+a.unit:a.elem[a.prop]=a.now}}}),f.each(["width","height"],function(a,b){f.fx.step[b]=function(a){f.style(a.elem,b,Math.max(0,a.now)+a.unit)}}),f.expr&&f.expr.filters&&(f.expr.filters.animated=function(a){return f.grep(f.timers,function(b){return a===b.elem}).length});var cw=/^t(?:able|d|h)$/i,cx=/^(?:body|html)$/i;"getBoundingClientRect"in c.documentElement?f.fn.offset=function(a){var b=this[0],c;if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);try{c=b.getBoundingClientRect()}catch(d){}var e=b.ownerDocument,g=e.documentElement;if(!c||!f.contains(g,b))return c?{top:c.top,left:c.left}:{top:0,left:0};var h=e.body,i=cy(e),j=g.clientTop||h.clientTop||0,k=g.clientLeft||h.clientLeft||0,l=i.pageYOffset||f.support.boxModel&&g.scrollTop||h.scrollTop,m=i.pageXOffset||f.support.boxModel&&g.scrollLeft||h.scrollLeft,n=c.top+l-j,o=c.left+m-k;return{top:n,left:o}}:f.fn.offset=function(a){var b=this[0];if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);var c,d=b.offsetParent,e=b,g=b.ownerDocument,h=g.documentElement,i=g.body,j=g.defaultView,k=j?j.getComputedStyle(b,null):b.currentStyle,l=b.offsetTop,m=b.offsetLeft;while((b=b.parentNode)&&b!==i&&b!==h){if(f.support.fixedPosition&&k.position==="fixed")break;c=j?j.getComputedStyle(b,null):b.currentStyle,l-=b.scrollTop,m-=b.scrollLeft,b===d&&(l+=b.offsetTop,m+=b.offsetLeft,f.support.doesNotAddBorder&&(!f.support.doesAddBorderForTableAndCells||!cw.test(b.nodeName))&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),e=d,d=b.offsetParent),f.support.subtractsBorderForOverflowNotVisible&&c.overflow!=="visible"&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),k=c}if(k.position==="relative"||k.position==="static")l+=i.offsetTop,m+=i.offsetLeft;f.support.fixedPosition&&k.position==="fixed"&&(l+=Math.max(h.scrollTop,i.scrollTop),m+=Math.max(h.scrollLeft,i.scrollLeft));return{top:l,left:m}},f.offset={bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.support.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cy(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cy(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,d,"padding")):this[d]():null},f.fn["outer"+c]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,d,a?"margin":"border")):this[d]():null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c],h=e.document.body;return e.document.compatMode==="CSS1Compat"&&g||h&&h["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var i=f.css(e,d),j=parseFloat(i);return f.isNumeric(j)?j:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window); \ No newline at end of file
diff --git a/library/font_awesome/src/assets/js/prettify.min.js b/library/font_awesome/src/assets/js/prettify.min.js
new file mode 100644
index 000000000..eef5ad7e6
--- /dev/null
+++ b/library/font_awesome/src/assets/js/prettify.min.js
@@ -0,0 +1,28 @@
+var q=null;window.PR_SHOULD_USE_CONTINUATION=!0;
+(function(){function L(a){function m(a){var f=a.charCodeAt(0);if(f!==92)return f;var b=a.charAt(1);return(f=r[b])?f:"0"<=b&&b<="7"?parseInt(a.substring(1),8):b==="u"||b==="x"?parseInt(a.substring(2),16):a.charCodeAt(1)}function e(a){if(a<32)return(a<16?"\\x0":"\\x")+a.toString(16);a=String.fromCharCode(a);if(a==="\\"||a==="-"||a==="["||a==="]")a="\\"+a;return a}function h(a){for(var f=a.substring(1,a.length-1).match(/\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\[0-3][0-7]{0,2}|\\[0-7]{1,2}|\\[\S\s]|[^\\]/g),a=
+[],b=[],o=f[0]==="^",c=o?1:0,i=f.length;c<i;++c){var j=f[c];if(/\\[bdsw]/i.test(j))a.push(j);else{var j=m(j),d;c+2<i&&"-"===f[c+1]?(d=m(f[c+2]),c+=2):d=j;b.push([j,d]);d<65||j>122||(d<65||j>90||b.push([Math.max(65,j)|32,Math.min(d,90)|32]),d<97||j>122||b.push([Math.max(97,j)&-33,Math.min(d,122)&-33]))}}b.sort(function(a,f){return a[0]-f[0]||f[1]-a[1]});f=[];j=[NaN,NaN];for(c=0;c<b.length;++c)i=b[c],i[0]<=j[1]+1?j[1]=Math.max(j[1],i[1]):f.push(j=i);b=["["];o&&b.push("^");b.push.apply(b,a);for(c=0;c<
+f.length;++c)i=f[c],b.push(e(i[0])),i[1]>i[0]&&(i[1]+1>i[0]&&b.push("-"),b.push(e(i[1])));b.push("]");return b.join("")}function y(a){for(var f=a.source.match(/\[(?:[^\\\]]|\\[\S\s])*]|\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\\d+|\\[^\dux]|\(\?[!:=]|[()^]|[^()[\\^]+/g),b=f.length,d=[],c=0,i=0;c<b;++c){var j=f[c];j==="("?++i:"\\"===j.charAt(0)&&(j=+j.substring(1))&&j<=i&&(d[j]=-1)}for(c=1;c<d.length;++c)-1===d[c]&&(d[c]=++t);for(i=c=0;c<b;++c)j=f[c],j==="("?(++i,d[i]===void 0&&(f[c]="(?:")):"\\"===j.charAt(0)&&
+(j=+j.substring(1))&&j<=i&&(f[c]="\\"+d[i]);for(i=c=0;c<b;++c)"^"===f[c]&&"^"!==f[c+1]&&(f[c]="");if(a.ignoreCase&&s)for(c=0;c<b;++c)j=f[c],a=j.charAt(0),j.length>=2&&a==="["?f[c]=h(j):a!=="\\"&&(f[c]=j.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return"["+String.fromCharCode(a&-33,a|32)+"]"}));return f.join("")}for(var t=0,s=!1,l=!1,p=0,d=a.length;p<d;++p){var g=a[p];if(g.ignoreCase)l=!0;else if(/[a-z]/i.test(g.source.replace(/\\u[\da-f]{4}|\\x[\da-f]{2}|\\[^UXux]/gi,""))){s=!0;l=!1;break}}for(var r=
+{b:8,t:9,n:10,v:11,f:12,r:13},n=[],p=0,d=a.length;p<d;++p){g=a[p];if(g.global||g.multiline)throw Error(""+g);n.push("(?:"+y(g)+")")}return RegExp(n.join("|"),l?"gi":"g")}function M(a){function m(a){switch(a.nodeType){case 1:if(e.test(a.className))break;for(var g=a.firstChild;g;g=g.nextSibling)m(g);g=a.nodeName;if("BR"===g||"LI"===g)h[s]="\n",t[s<<1]=y++,t[s++<<1|1]=a;break;case 3:case 4:g=a.nodeValue,g.length&&(g=p?g.replace(/\r\n?/g,"\n"):g.replace(/[\t\n\r ]+/g," "),h[s]=g,t[s<<1]=y,y+=g.length,
+t[s++<<1|1]=a)}}var e=/(?:^|\s)nocode(?:\s|$)/,h=[],y=0,t=[],s=0,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=document.defaultView.getComputedStyle(a,q).getPropertyValue("white-space"));var p=l&&"pre"===l.substring(0,3);m(a);return{a:h.join("").replace(/\n$/,""),c:t}}function B(a,m,e,h){m&&(a={a:m,d:a},e(a),h.push.apply(h,a.e))}function x(a,m){function e(a){for(var l=a.d,p=[l,"pln"],d=0,g=a.a.match(y)||[],r={},n=0,z=g.length;n<z;++n){var f=g[n],b=r[f],o=void 0,c;if(typeof b===
+"string")c=!1;else{var i=h[f.charAt(0)];if(i)o=f.match(i[1]),b=i[0];else{for(c=0;c<t;++c)if(i=m[c],o=f.match(i[1])){b=i[0];break}o||(b="pln")}if((c=b.length>=5&&"lang-"===b.substring(0,5))&&!(o&&typeof o[1]==="string"))c=!1,b="src";c||(r[f]=b)}i=d;d+=f.length;if(c){c=o[1];var j=f.indexOf(c),k=j+c.length;o[2]&&(k=f.length-o[2].length,j=k-c.length);b=b.substring(5);B(l+i,f.substring(0,j),e,p);B(l+i+j,c,C(b,c),p);B(l+i+k,f.substring(k),e,p)}else p.push(l+i,b)}a.e=p}var h={},y;(function(){for(var e=a.concat(m),
+l=[],p={},d=0,g=e.length;d<g;++d){var r=e[d],n=r[3];if(n)for(var k=n.length;--k>=0;)h[n.charAt(k)]=r;r=r[1];n=""+r;p.hasOwnProperty(n)||(l.push(r),p[n]=q)}l.push(/[\S\s]/);y=L(l)})();var t=m.length;return e}function u(a){var m=[],e=[];a.tripleQuotedStrings?m.push(["str",/^(?:'''(?:[^'\\]|\\[\S\s]|''?(?=[^']))*(?:'''|$)|"""(?:[^"\\]|\\[\S\s]|""?(?=[^"]))*(?:"""|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$))/,q,"'\""]):a.multiLineStrings?m.push(["str",/^(?:'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$)|`(?:[^\\`]|\\[\S\s])*(?:`|$))/,
+q,"'\"`"]):m.push(["str",/^(?:'(?:[^\n\r'\\]|\\.)*(?:'|$)|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,q,"\"'"]);a.verbatimStrings&&e.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,q]);var h=a.hashComments;h&&(a.cStyleComments?(h>1?m.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,q,"#"]):m.push(["com",/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\n\r]*)/,q,"#"]),e.push(["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,q])):m.push(["com",/^#[^\n\r]*/,
+q,"#"]));a.cStyleComments&&(e.push(["com",/^\/\/[^\n\r]*/,q]),e.push(["com",/^\/\*[\S\s]*?(?:\*\/|$)/,q]));a.regexLiterals&&e.push(["lang-regex",/^(?:^^\.?|[!+-]|!=|!==|#|%|%=|&|&&|&&=|&=|\(|\*|\*=|\+=|,|-=|->|\/|\/=|:|::|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|[?@[^]|\^=|\^\^|\^\^=|{|\||\|=|\|\||\|\|=|~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\s*(\/(?=[^*/])(?:[^/[\\]|\\[\S\s]|\[(?:[^\\\]]|\\[\S\s])*(?:]|$))+\/)/]);(h=a.types)&&e.push(["typ",h]);a=(""+a.keywords).replace(/^ | $/g,
+"");a.length&&e.push(["kwd",RegExp("^(?:"+a.replace(/[\s,]+/g,"|")+")\\b"),q]);m.push(["pln",/^\s+/,q," \r\n\t\xa0"]);e.push(["lit",/^@[$_a-z][\w$@]*/i,q],["typ",/^(?:[@_]?[A-Z]+[a-z][\w$@]*|\w+_t\b)/,q],["pln",/^[$_a-z][\w$@]*/i,q],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,q,"0123456789"],["pln",/^\\[\S\s]?/,q],["pun",/^.[^\s\w"-$'./@\\`]*/,q]);return x(m,e)}function D(a,m){function e(a){switch(a.nodeType){case 1:if(k.test(a.className))break;if("BR"===a.nodeName)h(a),
+a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)e(a);break;case 3:case 4:if(p){var b=a.nodeValue,d=b.match(t);if(d){var c=b.substring(0,d.index);a.nodeValue=c;(b=b.substring(d.index+d[0].length))&&a.parentNode.insertBefore(s.createTextNode(b),a.nextSibling);h(a);c||a.parentNode.removeChild(a)}}}}function h(a){function b(a,d){var e=d?a.cloneNode(!1):a,f=a.parentNode;if(f){var f=b(f,1),g=a.nextSibling;f.appendChild(e);for(var h=g;h;h=g)g=h.nextSibling,f.appendChild(h)}return e}
+for(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var a=b(a.nextSibling,0),e;(e=a.parentNode)&&e.nodeType===1;)a=e;d.push(a)}var k=/(?:^|\s)nocode(?:\s|$)/,t=/\r\n?|\n/,s=a.ownerDocument,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=s.defaultView.getComputedStyle(a,q).getPropertyValue("white-space"));var p=l&&"pre"===l.substring(0,3);for(l=s.createElement("LI");a.firstChild;)l.appendChild(a.firstChild);for(var d=[l],g=0;g<d.length;++g)e(d[g]);m===(m|0)&&d[0].setAttribute("value",
+m);var r=s.createElement("OL");r.className="linenums";for(var n=Math.max(0,m-1|0)||0,g=0,z=d.length;g<z;++g)l=d[g],l.className="L"+(g+n)%10,l.firstChild||l.appendChild(s.createTextNode("\xa0")),r.appendChild(l);a.appendChild(r)}function k(a,m){for(var e=m.length;--e>=0;){var h=m[e];A.hasOwnProperty(h)?window.console&&console.warn("cannot override language handler %s",h):A[h]=a}}function C(a,m){if(!a||!A.hasOwnProperty(a))a=/^\s*</.test(m)?"default-markup":"default-code";return A[a]}function E(a){var m=
+a.g;try{var e=M(a.h),h=e.a;a.a=h;a.c=e.c;a.d=0;C(m,h)(a);var k=/\bMSIE\b/.test(navigator.userAgent),m=/\n/g,t=a.a,s=t.length,e=0,l=a.c,p=l.length,h=0,d=a.e,g=d.length,a=0;d[g]=s;var r,n;for(n=r=0;n<g;)d[n]!==d[n+2]?(d[r++]=d[n++],d[r++]=d[n++]):n+=2;g=r;for(n=r=0;n<g;){for(var z=d[n],f=d[n+1],b=n+2;b+2<=g&&d[b+1]===f;)b+=2;d[r++]=z;d[r++]=f;n=b}for(d.length=r;h<p;){var o=l[h+2]||s,c=d[a+2]||s,b=Math.min(o,c),i=l[h+1],j;if(i.nodeType!==1&&(j=t.substring(e,b))){k&&(j=j.replace(m,"\r"));i.nodeValue=
+j;var u=i.ownerDocument,v=u.createElement("SPAN");v.className=d[a+1];var x=i.parentNode;x.replaceChild(v,i);v.appendChild(i);e<o&&(l[h+1]=i=u.createTextNode(t.substring(b,o)),x.insertBefore(i,v.nextSibling))}e=b;e>=o&&(h+=2);e>=c&&(a+=2)}}catch(w){"console"in window&&console.log(w&&w.stack?w.stack:w)}}var v=["break,continue,do,else,for,if,return,while"],w=[[v,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"],
+"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],F=[w,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],G=[w,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"],
+H=[G,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"],w=[w,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],I=[v,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"],
+J=[v,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],v=[v,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],K=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/,N=/\S/,O=u({keywords:[F,H,w,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END"+
+I,J,v],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),A={};k(O,["default-code"]);k(x([],[["pln",/^[^<?]+/],["dec",/^<!\w[^>]*(?:>|$)/],["com",/^<\!--[\S\s]*?(?:--\>|$)/],["lang-",/^<\?([\S\s]+?)(?:\?>|$)/],["lang-",/^<%([\S\s]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?]>)/],["lang-",/^<xmp\b[^>]*>([\S\s]+?)<\/xmp\b[^>]*>/i],["lang-js",/^<script\b[^>]*>([\S\s]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\S\s]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),
+["default-markup","htm","html","mxml","xhtml","xml","xsl"]);k(x([["pln",/^\s+/,q," \t\r\n"],["atv",/^(?:"[^"]*"?|'[^']*'?)/,q,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w-.:]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^\s"'>]*(?:[^\s"'/>]|\/(?=\s)))/],["pun",/^[/<->]+/],["lang-js",/^on\w+\s*=\s*"([^"]+)"/i],["lang-js",/^on\w+\s*=\s*'([^']+)'/i],["lang-js",/^on\w+\s*=\s*([^\s"'>]+)/i],["lang-css",/^style\s*=\s*"([^"]+)"/i],["lang-css",/^style\s*=\s*'([^']+)'/i],["lang-css",
+/^style\s*=\s*([^\s"'>]+)/i]]),["in.tag"]);k(x([],[["atv",/^[\S\s]+/]]),["uq.val"]);k(u({keywords:F,hashComments:!0,cStyleComments:!0,types:K}),["c","cc","cpp","cxx","cyc","m"]);k(u({keywords:"null,true,false"}),["json"]);k(u({keywords:H,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:K}),["cs"]);k(u({keywords:G,cStyleComments:!0}),["java"]);k(u({keywords:v,hashComments:!0,multiLineStrings:!0}),["bsh","csh","sh"]);k(u({keywords:I,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}),
+["cv","py"]);k(u({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["perl","pl","pm"]);k(u({keywords:J,hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb"]);k(u({keywords:w,cStyleComments:!0,regexLiterals:!0}),["js"]);k(u({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes",
+hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]);k(x([],[["str",/^[\S\s]+/]]),["regex"]);window.prettyPrintOne=function(a,m,e){var h=document.createElement("PRE");h.innerHTML=a;e&&D(h,e);E({g:m,i:e,h:h});return h.innerHTML};window.prettyPrint=function(a){function m(){for(var e=window.PR_SHOULD_USE_CONTINUATION?l.now()+250:Infinity;p<h.length&&l.now()<e;p++){var n=h[p],k=n.className;if(k.indexOf("prettyprint")>=0){var k=k.match(g),f,b;if(b=
+!k){b=n;for(var o=void 0,c=b.firstChild;c;c=c.nextSibling)var i=c.nodeType,o=i===1?o?b:c:i===3?N.test(c.nodeValue)?b:o:o;b=(f=o===b?void 0:o)&&"CODE"===f.tagName}b&&(k=f.className.match(g));k&&(k=k[1]);b=!1;for(o=n.parentNode;o;o=o.parentNode)if((o.tagName==="pre"||o.tagName==="code"||o.tagName==="xmp")&&o.className&&o.className.indexOf("prettyprint")>=0){b=!0;break}b||((b=(b=n.className.match(/\blinenums\b(?::(\d+))?/))?b[1]&&b[1].length?+b[1]:!0:!1)&&D(n,b),d={g:k,h:n,i:b},E(d))}}p<h.length?setTimeout(m,
+250):a&&a()}for(var e=[document.getElementsByTagName("pre"),document.getElementsByTagName("code"),document.getElementsByTagName("xmp")],h=[],k=0;k<e.length;++k)for(var t=0,s=e[k].length;t<s;++t)h.push(e[k][t]);var e=q,l=Date;l.now||(l={now:function(){return+new Date}});var p=0,d,g=/\blang(?:uage)?-([\w.]+)(?!\S)/;m()};window.PR={createSimpleLexer:x,registerLangHandler:k,sourceDecorator:u,PR_ATTRIB_NAME:"atn",PR_ATTRIB_VALUE:"atv",PR_COMMENT:"com",PR_DECLARATION:"dec",PR_KEYWORD:"kwd",PR_LITERAL:"lit",
+PR_NOCODE:"nocode",PR_PLAIN:"pln",PR_PUNCTUATION:"pun",PR_SOURCE:"src",PR_STRING:"str",PR_TAG:"tag",PR_TYPE:"typ"}})();
diff --git a/library/font_awesome/src/assets/js/site.js b/library/font_awesome/src/assets/js/site.js
new file mode 100644
index 000000000..16fa261a6
--- /dev/null
+++ b/library/font_awesome/src/assets/js/site.js
@@ -0,0 +1,38 @@
+$(function() {
+ // start the icon carousel
+ $('#iconCarousel').carousel({
+ interval: 5000
+ });
+
+
+
+
+ // make code pretty
+// $('pre').addClass('prettyprint');
+// window.prettyPrint && prettyPrint();
+
+ // Disable links with href="#" inside <section>, so users can click on them
+ // to preview :active state without being scrolled up to the top of the page.
+// $('section a[href="#"]').click(function(e) {
+// e.preventDefault();
+// e.stopPropagation();
+// });
+
+// // inject twitter & github counts
+// $.ajax({
+// url: 'http://api.twitter.com/1/users/show.json',
+// data: {screen_name: 'fortaweso_me'},
+// dataType: 'jsonp',
+// success: function(data) {
+// $('#followers').html(data.followers_count);
+// }
+// });
+// $.ajax({
+// url: 'https://api.github.com/repos/fortawesome/Font-Awesome',
+// dataType: 'jsonp',
+// success: function(data) {
+// $('#watchers').html(data.data.watchers);
+// $('#forks').html(data.data.forks);
+// }
+// });
+});
diff --git a/library/font_awesome/src/assets/js/underscore.min.js b/library/font_awesome/src/assets/js/underscore.min.js
new file mode 100644
index 000000000..5b55f32be
--- /dev/null
+++ b/library/font_awesome/src/assets/js/underscore.min.js
@@ -0,0 +1,31 @@
+// Underscore.js 1.3.1
+// (c) 2009-2012 Jeremy Ashkenas, DocumentCloud Inc.
+// Underscore is freely distributable under the MIT license.
+// Portions of Underscore are inspired or borrowed from Prototype,
+// Oliver Steele's Functional, and John Resig's Micro-Templating.
+// For all details and documentation:
+// http://documentcloud.github.com/underscore
+(function(){function q(a,c,d){if(a===c)return a!==0||1/a==1/c;if(a==null||c==null)return a===c;if(a._chain)a=a._wrapped;if(c._chain)c=c._wrapped;if(a.isEqual&&b.isFunction(a.isEqual))return a.isEqual(c);if(c.isEqual&&b.isFunction(c.isEqual))return c.isEqual(a);var e=l.call(a);if(e!=l.call(c))return false;switch(e){case "[object String]":return a==String(c);case "[object Number]":return a!=+a?c!=+c:a==0?1/a==1/c:a==+c;case "[object Date]":case "[object Boolean]":return+a==+c;case "[object RegExp]":return a.source==
+c.source&&a.global==c.global&&a.multiline==c.multiline&&a.ignoreCase==c.ignoreCase}if(typeof a!="object"||typeof c!="object")return false;for(var f=d.length;f--;)if(d[f]==a)return true;d.push(a);var f=0,g=true;if(e=="[object Array]"){if(f=a.length,g=f==c.length)for(;f--;)if(!(g=f in a==f in c&&q(a[f],c[f],d)))break}else{if("constructor"in a!="constructor"in c||a.constructor!=c.constructor)return false;for(var h in a)if(b.has(a,h)&&(f++,!(g=b.has(c,h)&&q(a[h],c[h],d))))break;if(g){for(h in c)if(b.has(c,
+h)&&!f--)break;g=!f}}d.pop();return g}var r=this,G=r._,n={},k=Array.prototype,o=Object.prototype,i=k.slice,H=k.unshift,l=o.toString,I=o.hasOwnProperty,w=k.forEach,x=k.map,y=k.reduce,z=k.reduceRight,A=k.filter,B=k.every,C=k.some,p=k.indexOf,D=k.lastIndexOf,o=Array.isArray,J=Object.keys,s=Function.prototype.bind,b=function(a){return new m(a)};if(typeof exports!=="undefined"){if(typeof module!=="undefined"&&module.exports)exports=module.exports=b;exports._=b}else r._=b;b.VERSION="1.3.1";var j=b.each=
+b.forEach=function(a,c,d){if(a!=null)if(w&&a.forEach===w)a.forEach(c,d);else if(a.length===+a.length)for(var e=0,f=a.length;e<f;e++){if(e in a&&c.call(d,a[e],e,a)===n)break}else for(e in a)if(b.has(a,e)&&c.call(d,a[e],e,a)===n)break};b.map=b.collect=function(a,c,b){var e=[];if(a==null)return e;if(x&&a.map===x)return a.map(c,b);j(a,function(a,g,h){e[e.length]=c.call(b,a,g,h)});if(a.length===+a.length)e.length=a.length;return e};b.reduce=b.foldl=b.inject=function(a,c,d,e){var f=arguments.length>2;a==
+null&&(a=[]);if(y&&a.reduce===y)return e&&(c=b.bind(c,e)),f?a.reduce(c,d):a.reduce(c);j(a,function(a,b,i){f?d=c.call(e,d,a,b,i):(d=a,f=true)});if(!f)throw new TypeError("Reduce of empty array with no initial value");return d};b.reduceRight=b.foldr=function(a,c,d,e){var f=arguments.length>2;a==null&&(a=[]);if(z&&a.reduceRight===z)return e&&(c=b.bind(c,e)),f?a.reduceRight(c,d):a.reduceRight(c);var g=b.toArray(a).reverse();e&&!f&&(c=b.bind(c,e));return f?b.reduce(g,c,d,e):b.reduce(g,c)};b.find=b.detect=
+function(a,c,b){var e;E(a,function(a,g,h){if(c.call(b,a,g,h))return e=a,true});return e};b.filter=b.select=function(a,c,b){var e=[];if(a==null)return e;if(A&&a.filter===A)return a.filter(c,b);j(a,function(a,g,h){c.call(b,a,g,h)&&(e[e.length]=a)});return e};b.reject=function(a,c,b){var e=[];if(a==null)return e;j(a,function(a,g,h){c.call(b,a,g,h)||(e[e.length]=a)});return e};b.every=b.all=function(a,c,b){var e=true;if(a==null)return e;if(B&&a.every===B)return a.every(c,b);j(a,function(a,g,h){if(!(e=
+e&&c.call(b,a,g,h)))return n});return e};var E=b.some=b.any=function(a,c,d){c||(c=b.identity);var e=false;if(a==null)return e;if(C&&a.some===C)return a.some(c,d);j(a,function(a,b,h){if(e||(e=c.call(d,a,b,h)))return n});return!!e};b.include=b.contains=function(a,c){var b=false;if(a==null)return b;return p&&a.indexOf===p?a.indexOf(c)!=-1:b=E(a,function(a){return a===c})};b.invoke=function(a,c){var d=i.call(arguments,2);return b.map(a,function(a){return(b.isFunction(c)?c||a:a[c]).apply(a,d)})};b.pluck=
+function(a,c){return b.map(a,function(a){return a[c]})};b.max=function(a,c,d){if(!c&&b.isArray(a))return Math.max.apply(Math,a);if(!c&&b.isEmpty(a))return-Infinity;var e={computed:-Infinity};j(a,function(a,b,h){b=c?c.call(d,a,b,h):a;b>=e.computed&&(e={value:a,computed:b})});return e.value};b.min=function(a,c,d){if(!c&&b.isArray(a))return Math.min.apply(Math,a);if(!c&&b.isEmpty(a))return Infinity;var e={computed:Infinity};j(a,function(a,b,h){b=c?c.call(d,a,b,h):a;b<e.computed&&(e={value:a,computed:b})});
+return e.value};b.shuffle=function(a){var b=[],d;j(a,function(a,f){f==0?b[0]=a:(d=Math.floor(Math.random()*(f+1)),b[f]=b[d],b[d]=a)});return b};b.sortBy=function(a,c,d){return b.pluck(b.map(a,function(a,b,g){return{value:a,criteria:c.call(d,a,b,g)}}).sort(function(a,b){var c=a.criteria,d=b.criteria;return c<d?-1:c>d?1:0}),"value")};b.groupBy=function(a,c){var d={},e=b.isFunction(c)?c:function(a){return a[c]};j(a,function(a,b){var c=e(a,b);(d[c]||(d[c]=[])).push(a)});return d};b.sortedIndex=function(a,
+c,d){d||(d=b.identity);for(var e=0,f=a.length;e<f;){var g=e+f>>1;d(a[g])<d(c)?e=g+1:f=g}return e};b.toArray=function(a){return!a?[]:a.toArray?a.toArray():b.isArray(a)?i.call(a):b.isArguments(a)?i.call(a):b.values(a)};b.size=function(a){return b.toArray(a).length};b.first=b.head=function(a,b,d){return b!=null&&!d?i.call(a,0,b):a[0]};b.initial=function(a,b,d){return i.call(a,0,a.length-(b==null||d?1:b))};b.last=function(a,b,d){return b!=null&&!d?i.call(a,Math.max(a.length-b,0)):a[a.length-1]};b.rest=
+b.tail=function(a,b,d){return i.call(a,b==null||d?1:b)};b.compact=function(a){return b.filter(a,function(a){return!!a})};b.flatten=function(a,c){return b.reduce(a,function(a,e){if(b.isArray(e))return a.concat(c?e:b.flatten(e));a[a.length]=e;return a},[])};b.without=function(a){return b.difference(a,i.call(arguments,1))};b.uniq=b.unique=function(a,c,d){var d=d?b.map(a,d):a,e=[];b.reduce(d,function(d,g,h){if(0==h||(c===true?b.last(d)!=g:!b.include(d,g)))d[d.length]=g,e[e.length]=a[h];return d},[]);
+return e};b.union=function(){return b.uniq(b.flatten(arguments,true))};b.intersection=b.intersect=function(a){var c=i.call(arguments,1);return b.filter(b.uniq(a),function(a){return b.every(c,function(c){return b.indexOf(c,a)>=0})})};b.difference=function(a){var c=b.flatten(i.call(arguments,1));return b.filter(a,function(a){return!b.include(c,a)})};b.zip=function(){for(var a=i.call(arguments),c=b.max(b.pluck(a,"length")),d=Array(c),e=0;e<c;e++)d[e]=b.pluck(a,""+e);return d};b.indexOf=function(a,c,
+d){if(a==null)return-1;var e;if(d)return d=b.sortedIndex(a,c),a[d]===c?d:-1;if(p&&a.indexOf===p)return a.indexOf(c);for(d=0,e=a.length;d<e;d++)if(d in a&&a[d]===c)return d;return-1};b.lastIndexOf=function(a,b){if(a==null)return-1;if(D&&a.lastIndexOf===D)return a.lastIndexOf(b);for(var d=a.length;d--;)if(d in a&&a[d]===b)return d;return-1};b.range=function(a,b,d){arguments.length<=1&&(b=a||0,a=0);for(var d=arguments[2]||1,e=Math.max(Math.ceil((b-a)/d),0),f=0,g=Array(e);f<e;)g[f++]=a,a+=d;return g};
+var F=function(){};b.bind=function(a,c){var d,e;if(a.bind===s&&s)return s.apply(a,i.call(arguments,1));if(!b.isFunction(a))throw new TypeError;e=i.call(arguments,2);return d=function(){if(!(this instanceof d))return a.apply(c,e.concat(i.call(arguments)));F.prototype=a.prototype;var b=new F,g=a.apply(b,e.concat(i.call(arguments)));return Object(g)===g?g:b}};b.bindAll=function(a){var c=i.call(arguments,1);c.length==0&&(c=b.functions(a));j(c,function(c){a[c]=b.bind(a[c],a)});return a};b.memoize=function(a,
+c){var d={};c||(c=b.identity);return function(){var e=c.apply(this,arguments);return b.has(d,e)?d[e]:d[e]=a.apply(this,arguments)}};b.delay=function(a,b){var d=i.call(arguments,2);return setTimeout(function(){return a.apply(a,d)},b)};b.defer=function(a){return b.delay.apply(b,[a,1].concat(i.call(arguments,1)))};b.throttle=function(a,c){var d,e,f,g,h,i=b.debounce(function(){h=g=false},c);return function(){d=this;e=arguments;var b;f||(f=setTimeout(function(){f=null;h&&a.apply(d,e);i()},c));g?h=true:
+a.apply(d,e);i();g=true}};b.debounce=function(a,b){var d;return function(){var e=this,f=arguments;clearTimeout(d);d=setTimeout(function(){d=null;a.apply(e,f)},b)}};b.once=function(a){var b=false,d;return function(){if(b)return d;b=true;return d=a.apply(this,arguments)}};b.wrap=function(a,b){return function(){var d=[a].concat(i.call(arguments,0));return b.apply(this,d)}};b.compose=function(){var a=arguments;return function(){for(var b=arguments,d=a.length-1;d>=0;d--)b=[a[d].apply(this,b)];return b[0]}};
+b.after=function(a,b){return a<=0?b():function(){if(--a<1)return b.apply(this,arguments)}};b.keys=J||function(a){if(a!==Object(a))throw new TypeError("Invalid object");var c=[],d;for(d in a)b.has(a,d)&&(c[c.length]=d);return c};b.values=function(a){return b.map(a,b.identity)};b.functions=b.methods=function(a){var c=[],d;for(d in a)b.isFunction(a[d])&&c.push(d);return c.sort()};b.extend=function(a){j(i.call(arguments,1),function(b){for(var d in b)a[d]=b[d]});return a};b.defaults=function(a){j(i.call(arguments,
+1),function(b){for(var d in b)a[d]==null&&(a[d]=b[d])});return a};b.clone=function(a){return!b.isObject(a)?a:b.isArray(a)?a.slice():b.extend({},a)};b.tap=function(a,b){b(a);return a};b.isEqual=function(a,b){return q(a,b,[])};b.isEmpty=function(a){if(b.isArray(a)||b.isString(a))return a.length===0;for(var c in a)if(b.has(a,c))return false;return true};b.isElement=function(a){return!!(a&&a.nodeType==1)};b.isArray=o||function(a){return l.call(a)=="[object Array]"};b.isObject=function(a){return a===Object(a)};
+b.isArguments=function(a){return l.call(a)=="[object Arguments]"};if(!b.isArguments(arguments))b.isArguments=function(a){return!(!a||!b.has(a,"callee"))};b.isFunction=function(a){return l.call(a)=="[object Function]"};b.isString=function(a){return l.call(a)=="[object String]"};b.isNumber=function(a){return l.call(a)=="[object Number]"};b.isNaN=function(a){return a!==a};b.isBoolean=function(a){return a===true||a===false||l.call(a)=="[object Boolean]"};b.isDate=function(a){return l.call(a)=="[object Date]"};
+b.isRegExp=function(a){return l.call(a)=="[object RegExp]"};b.isNull=function(a){return a===null};b.isUndefined=function(a){return a===void 0};b.has=function(a,b){return I.call(a,b)};b.noConflict=function(){r._=G;return this};b.identity=function(a){return a};b.times=function(a,b,d){for(var e=0;e<a;e++)b.call(d,e)};b.escape=function(a){return(""+a).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#x27;").replace(/\//g,"&#x2F;")};b.mixin=function(a){j(b.functions(a),
+function(c){K(c,b[c]=a[c])})};var L=0;b.uniqueId=function(a){var b=L++;return a?a+b:b};b.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var t=/.^/,u=function(a){return a.replace(/\\\\/g,"\\").replace(/\\'/g,"'")};b.template=function(a,c){var d=b.templateSettings,d="var __p=[],print=function(){__p.push.apply(__p,arguments);};with(obj||{}){__p.push('"+a.replace(/\\/g,"\\\\").replace(/'/g,"\\'").replace(d.escape||t,function(a,b){return"',_.escape("+
+u(b)+"),'"}).replace(d.interpolate||t,function(a,b){return"',"+u(b)+",'"}).replace(d.evaluate||t,function(a,b){return"');"+u(b).replace(/[\r\n\t]/g," ")+";__p.push('"}).replace(/\r/g,"\\r").replace(/\n/g,"\\n").replace(/\t/g,"\\t")+"');}return __p.join('');",e=new Function("obj","_",d);return c?e(c,b):function(a){return e.call(this,a,b)}};b.chain=function(a){return b(a).chain()};var m=function(a){this._wrapped=a};b.prototype=m.prototype;var v=function(a,c){return c?b(a).chain():a},K=function(a,c){m.prototype[a]=
+function(){var a=i.call(arguments);H.call(a,this._wrapped);return v(c.apply(b,a),this._chain)}};b.mixin(b);j("pop,push,reverse,shift,sort,splice,unshift".split(","),function(a){var b=k[a];m.prototype[a]=function(){var d=this._wrapped;b.apply(d,arguments);var e=d.length;(a=="shift"||a=="splice")&&e===0&&delete d[0];return v(d,this._chain)}});j(["concat","join","slice"],function(a){var b=k[a];m.prototype[a]=function(){return v(b.apply(this._wrapped,arguments),this._chain)}});m.prototype.chain=function(){this._chain=
+true;return this};m.prototype.value=function(){return this._wrapped}}).call(this);
diff --git a/library/font_awesome/src/assets/less/bootstrap-2.3.2/accordion.less b/library/font_awesome/src/assets/less/bootstrap-2.3.2/accordion.less
new file mode 100755
index 000000000..d63523bc8
--- /dev/null
+++ b/library/font_awesome/src/assets/less/bootstrap-2.3.2/accordion.less
@@ -0,0 +1,34 @@
+//
+// Accordion
+// --------------------------------------------------
+
+
+// Parent container
+.accordion {
+ margin-bottom: @baseLineHeight;
+}
+
+// Group == heading + body
+.accordion-group {
+ margin-bottom: 2px;
+ border: 1px solid #e5e5e5;
+ .border-radius(@baseBorderRadius);
+}
+.accordion-heading {
+ border-bottom: 0;
+}
+.accordion-heading .accordion-toggle {
+ display: block;
+ padding: 8px 15px;
+}
+
+// General toggle styles
+.accordion-toggle {
+ cursor: pointer;
+}
+
+// Inner needs the styles because you can't animate properly with any styles on the element
+.accordion-inner {
+ padding: 9px 15px;
+ border-top: 1px solid #e5e5e5;
+}
diff --git a/library/font_awesome/src/assets/less/bootstrap-2.3.2/alerts.less b/library/font_awesome/src/assets/less/bootstrap-2.3.2/alerts.less
new file mode 100755
index 000000000..0116b191b
--- /dev/null
+++ b/library/font_awesome/src/assets/less/bootstrap-2.3.2/alerts.less
@@ -0,0 +1,79 @@
+//
+// Alerts
+// --------------------------------------------------
+
+
+// Base styles
+// -------------------------
+
+.alert {
+ padding: 8px 35px 8px 14px;
+ margin-bottom: @baseLineHeight;
+ text-shadow: 0 1px 0 rgba(255,255,255,.5);
+ background-color: @warningBackground;
+ border: 1px solid @warningBorder;
+ .border-radius(@baseBorderRadius);
+}
+.alert,
+.alert h4 {
+ // Specified for the h4 to prevent conflicts of changing @headingsColor
+ color: @warningText;
+}
+.alert h4 {
+ margin: 0;
+}
+
+// Adjust close link position
+.alert .close {
+ position: relative;
+ top: -2px;
+ right: -21px;
+ line-height: @baseLineHeight;
+}
+
+
+// Alternate styles
+// -------------------------
+
+.alert-success {
+ background-color: @successBackground;
+ border-color: @successBorder;
+ color: @successText;
+}
+.alert-success h4 {
+ color: @successText;
+}
+.alert-danger,
+.alert-error {
+ background-color: @errorBackground;
+ border-color: @errorBorder;
+ color: @errorText;
+}
+.alert-danger h4,
+.alert-error h4 {
+ color: @errorText;
+}
+.alert-info {
+ background-color: @infoBackground;
+ border-color: @infoBorder;
+ color: @infoText;
+}
+.alert-info h4 {
+ color: @infoText;
+}
+
+
+// Block alerts
+// -------------------------
+
+.alert-block {
+ padding-top: 14px;
+ padding-bottom: 14px;
+}
+.alert-block > p,
+.alert-block > ul {
+ margin-bottom: 0;
+}
+.alert-block p + p {
+ margin-top: 5px;
+}
diff --git a/library/font_awesome/src/assets/less/bootstrap-2.3.2/bootstrap.less b/library/font_awesome/src/assets/less/bootstrap-2.3.2/bootstrap.less
new file mode 100755
index 000000000..d4ebf37ac
--- /dev/null
+++ b/library/font_awesome/src/assets/less/bootstrap-2.3.2/bootstrap.less
@@ -0,0 +1,63 @@
+/*!
+ * Bootstrap v2.3.2
+ *
+ * Copyright 2012 Twitter, Inc
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Designed and built with all the love in the world @twitter by @mdo and @fat.
+ */
+
+// Core variables and mixins
+@import "variables.less"; // Modify this for custom colors, font-sizes, etc
+@import "mixins.less";
+
+// CSS Reset
+@import "reset.less";
+
+// Grid system and page structure
+@import "scaffolding.less";
+@import "grid.less";
+@import "layouts.less";
+
+// Base CSS
+@import "type.less";
+@import "code.less";
+@import "forms.less";
+@import "tables.less";
+
+// Components: common
+@import "sprites.less";
+@import "dropdowns.less";
+@import "wells.less";
+@import "component-animations.less";
+@import "close.less";
+
+// Components: Buttons & Alerts
+@import "buttons.less";
+@import "button-groups.less";
+@import "alerts.less"; // Note: alerts share common CSS with buttons and thus have styles in buttons.less
+
+// Components: Nav
+@import "navs.less";
+@import "navbar.less";
+@import "breadcrumbs.less";
+@import "pagination.less";
+@import "pager.less";
+
+// Components: Popovers
+@import "modals.less";
+@import "tooltip.less";
+@import "popovers.less";
+
+// Components: Misc
+@import "thumbnails.less";
+@import "media.less";
+@import "labels-badges.less";
+@import "progress-bars.less";
+@import "accordion.less";
+@import "carousel.less";
+@import "hero-unit.less";
+
+// Utility classes
+@import "utilities.less"; // Has to be last to override when necessary
diff --git a/library/font_awesome/src/assets/less/bootstrap-2.3.2/breadcrumbs.less b/library/font_awesome/src/assets/less/bootstrap-2.3.2/breadcrumbs.less
new file mode 100755
index 000000000..f753df6be
--- /dev/null
+++ b/library/font_awesome/src/assets/less/bootstrap-2.3.2/breadcrumbs.less
@@ -0,0 +1,24 @@
+//
+// Breadcrumbs
+// --------------------------------------------------
+
+
+.breadcrumb {
+ padding: 8px 15px;
+ margin: 0 0 @baseLineHeight;
+ list-style: none;
+ background-color: #f5f5f5;
+ .border-radius(@baseBorderRadius);
+ > li {
+ display: inline-block;
+ .ie7-inline-block();
+ text-shadow: 0 1px 0 @white;
+ > .divider {
+ padding: 0 5px;
+ color: #ccc;
+ }
+ }
+ > .active {
+ color: @grayLight;
+ }
+}
diff --git a/library/font_awesome/src/assets/less/bootstrap-2.3.2/button-groups.less b/library/font_awesome/src/assets/less/bootstrap-2.3.2/button-groups.less
new file mode 100755
index 000000000..55cdc6033
--- /dev/null
+++ b/library/font_awesome/src/assets/less/bootstrap-2.3.2/button-groups.less
@@ -0,0 +1,229 @@
+//
+// Button groups
+// --------------------------------------------------
+
+
+// Make the div behave like a button
+.btn-group {
+ position: relative;
+ display: inline-block;
+ .ie7-inline-block();
+ font-size: 0; // remove as part 1 of font-size inline-block hack
+ vertical-align: middle; // match .btn alignment given font-size hack above
+ white-space: nowrap; // prevent buttons from wrapping when in tight spaces (e.g., the table on the tests page)
+ .ie7-restore-left-whitespace();
+}
+
+// Space out series of button groups
+.btn-group + .btn-group {
+ margin-left: 5px;
+}
+
+// Optional: Group multiple button groups together for a toolbar
+.btn-toolbar {
+ font-size: 0; // Hack to remove whitespace that results from using inline-block
+ margin-top: @baseLineHeight / 2;
+ margin-bottom: @baseLineHeight / 2;
+ > .btn + .btn,
+ > .btn-group + .btn,
+ > .btn + .btn-group {
+ margin-left: 5px;
+ }
+}
+
+// Float them, remove border radius, then re-add to first and last elements
+.btn-group > .btn {
+ position: relative;
+ .border-radius(0);
+}
+.btn-group > .btn + .btn {
+ margin-left: -1px;
+}
+.btn-group > .btn,
+.btn-group > .dropdown-menu,
+.btn-group > .popover {
+ font-size: @baseFontSize; // redeclare as part 2 of font-size inline-block hack
+}
+
+// Reset fonts for other sizes
+.btn-group > .btn-mini {
+ font-size: @fontSizeMini;
+}
+.btn-group > .btn-small {
+ font-size: @fontSizeSmall;
+}
+.btn-group > .btn-large {
+ font-size: @fontSizeLarge;
+}
+
+// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match
+.btn-group > .btn:first-child {
+ margin-left: 0;
+ .border-top-left-radius(@baseBorderRadius);
+ .border-bottom-left-radius(@baseBorderRadius);
+}
+// Need .dropdown-toggle since :last-child doesn't apply given a .dropdown-menu immediately after it
+.btn-group > .btn:last-child,
+.btn-group > .dropdown-toggle {
+ .border-top-right-radius(@baseBorderRadius);
+ .border-bottom-right-radius(@baseBorderRadius);
+}
+// Reset corners for large buttons
+.btn-group > .btn.large:first-child {
+ margin-left: 0;
+ .border-top-left-radius(@borderRadiusLarge);
+ .border-bottom-left-radius(@borderRadiusLarge);
+}
+.btn-group > .btn.large:last-child,
+.btn-group > .large.dropdown-toggle {
+ .border-top-right-radius(@borderRadiusLarge);
+ .border-bottom-right-radius(@borderRadiusLarge);
+}
+
+// On hover/focus/active, bring the proper btn to front
+.btn-group > .btn:hover,
+.btn-group > .btn:focus,
+.btn-group > .btn:active,
+.btn-group > .btn.active {
+ z-index: 2;
+}
+
+// On active and open, don't show outline
+.btn-group .dropdown-toggle:active,
+.btn-group.open .dropdown-toggle {
+ outline: 0;
+}
+
+
+
+// Split button dropdowns
+// ----------------------
+
+// Give the line between buttons some depth
+.btn-group > .btn + .dropdown-toggle {
+ padding-left: 8px;
+ padding-right: 8px;
+ .box-shadow(~"inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05)");
+ *padding-top: 5px;
+ *padding-bottom: 5px;
+}
+.btn-group > .btn-mini + .dropdown-toggle {
+ padding-left: 5px;
+ padding-right: 5px;
+ *padding-top: 2px;
+ *padding-bottom: 2px;
+}
+.btn-group > .btn-small + .dropdown-toggle {
+ *padding-top: 5px;
+ *padding-bottom: 4px;
+}
+.btn-group > .btn-large + .dropdown-toggle {
+ padding-left: 12px;
+ padding-right: 12px;
+ *padding-top: 7px;
+ *padding-bottom: 7px;
+}
+
+.btn-group.open {
+
+ // The clickable button for toggling the menu
+ // Remove the gradient and set the same inset shadow as the :active state
+ .dropdown-toggle {
+ background-image: none;
+ .box-shadow(~"inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05)");
+ }
+
+ // Keep the hover's background when dropdown is open
+ .btn.dropdown-toggle {
+ background-color: @btnBackgroundHighlight;
+ }
+ .btn-primary.dropdown-toggle {
+ background-color: @btnPrimaryBackgroundHighlight;
+ }
+ .btn-warning.dropdown-toggle {
+ background-color: @btnWarningBackgroundHighlight;
+ }
+ .btn-danger.dropdown-toggle {
+ background-color: @btnDangerBackgroundHighlight;
+ }
+ .btn-success.dropdown-toggle {
+ background-color: @btnSuccessBackgroundHighlight;
+ }
+ .btn-info.dropdown-toggle {
+ background-color: @btnInfoBackgroundHighlight;
+ }
+ .btn-inverse.dropdown-toggle {
+ background-color: @btnInverseBackgroundHighlight;
+ }
+}
+
+
+// Reposition the caret
+.btn .caret {
+ margin-top: 8px;
+ margin-left: 0;
+}
+// Carets in other button sizes
+.btn-large .caret {
+ margin-top: 6px;
+}
+.btn-large .caret {
+ border-left-width: 5px;
+ border-right-width: 5px;
+ border-top-width: 5px;
+}
+.btn-mini .caret,
+.btn-small .caret {
+ margin-top: 8px;
+}
+// Upside down carets for .dropup
+.dropup .btn-large .caret {
+ border-bottom-width: 5px;
+}
+
+
+
+// Account for other colors
+.btn-primary,
+.btn-warning,
+.btn-danger,
+.btn-info,
+.btn-success,
+.btn-inverse {
+ .caret {
+ border-top-color: @white;
+ border-bottom-color: @white;
+ }
+}
+
+
+
+// Vertical button groups
+// ----------------------
+
+.btn-group-vertical {
+ display: inline-block; // makes buttons only take up the width they need
+ .ie7-inline-block();
+}
+.btn-group-vertical > .btn {
+ display: block;
+ float: none;
+ max-width: 100%;
+ .border-radius(0);
+}
+.btn-group-vertical > .btn + .btn {
+ margin-left: 0;
+ margin-top: -1px;
+}
+.btn-group-vertical > .btn:first-child {
+ .border-radius(@baseBorderRadius @baseBorderRadius 0 0);
+}
+.btn-group-vertical > .btn:last-child {
+ .border-radius(0 0 @baseBorderRadius @baseBorderRadius);
+}
+.btn-group-vertical > .btn-large:first-child {
+ .border-radius(@borderRadiusLarge @borderRadiusLarge 0 0);
+}
+.btn-group-vertical > .btn-large:last-child {
+ .border-radius(0 0 @borderRadiusLarge @borderRadiusLarge);
+}
diff --git a/library/font_awesome/src/assets/less/bootstrap-2.3.2/buttons.less b/library/font_awesome/src/assets/less/bootstrap-2.3.2/buttons.less
new file mode 100755
index 000000000..4cd4d862b
--- /dev/null
+++ b/library/font_awesome/src/assets/less/bootstrap-2.3.2/buttons.less
@@ -0,0 +1,228 @@
+//
+// Buttons
+// --------------------------------------------------
+
+
+// Base styles
+// --------------------------------------------------
+
+// Core
+.btn {
+ display: inline-block;
+ .ie7-inline-block();
+ padding: 4px 12px;
+ margin-bottom: 0; // For input.btn
+ font-size: @baseFontSize;
+ line-height: @baseLineHeight;
+ text-align: center;
+ vertical-align: middle;
+ cursor: pointer;
+ .buttonBackground(@btnBackground, @btnBackgroundHighlight, @grayDark, 0 1px 1px rgba(255,255,255,.75));
+ border: 1px solid @btnBorder;
+ *border: 0; // Remove the border to prevent IE7's black border on input:focus
+ border-bottom-color: darken(@btnBorder, 10%);
+ .border-radius(@baseBorderRadius);
+ .ie7-restore-left-whitespace(); // Give IE7 some love
+ .box-shadow(~"inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05)");
+
+ // Hover/focus state
+ &:hover,
+ &:focus {
+ color: @grayDark;
+ text-decoration: none;
+ background-position: 0 -15px;
+
+ // transition is only when going to hover/focus, otherwise the background
+ // behind the gradient (there for IE<=9 fallback) gets mismatched
+ .transition(background-position .1s linear);
+ }
+
+ // Focus state for keyboard and accessibility
+ &:focus {
+ .tab-focus();
+ }
+
+ // Active state
+ &.active,
+ &:active {
+ background-image: none;
+ outline: 0;
+ .box-shadow(~"inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05)");
+ }
+
+ // Disabled state
+ &.disabled,
+ &[disabled] {
+ cursor: default;
+ background-image: none;
+ .opacity(65);
+ .box-shadow(none);
+ }
+
+}
+
+
+
+// Button Sizes
+// --------------------------------------------------
+
+// Large
+.btn-large {
+ padding: @paddingLarge;
+ font-size: @fontSizeLarge;
+ .border-radius(@borderRadiusLarge);
+}
+.btn-large [class^="icon-"],
+.btn-large [class*=" icon-"] {
+ margin-top: 4px;
+}
+
+// Small
+.btn-small {
+ padding: @paddingSmall;
+ font-size: @fontSizeSmall;
+ .border-radius(@borderRadiusSmall);
+}
+.btn-small [class^="icon-"],
+.btn-small [class*=" icon-"] {
+ margin-top: 0;
+}
+.btn-mini [class^="icon-"],
+.btn-mini [class*=" icon-"] {
+ margin-top: -1px;
+}
+
+// Mini
+.btn-mini {
+ padding: @paddingMini;
+ font-size: @fontSizeMini;
+ .border-radius(@borderRadiusSmall);
+}
+
+
+// Block button
+// -------------------------
+
+.btn-block {
+ display: block;
+ width: 100%;
+ padding-left: 0;
+ padding-right: 0;
+ .box-sizing(border-box);
+}
+
+// Vertically space out multiple block buttons
+.btn-block + .btn-block {
+ margin-top: 5px;
+}
+
+// Specificity overrides
+input[type="submit"],
+input[type="reset"],
+input[type="button"] {
+ &.btn-block {
+ width: 100%;
+ }
+}
+
+
+
+// Alternate buttons
+// --------------------------------------------------
+
+// Provide *some* extra contrast for those who can get it
+.btn-primary.active,
+.btn-warning.active,
+.btn-danger.active,
+.btn-success.active,
+.btn-info.active,
+.btn-inverse.active {
+ color: rgba(255,255,255,.75);
+}
+
+// Set the backgrounds
+// -------------------------
+.btn-primary {
+ .buttonBackground(@btnPrimaryBackground, @btnPrimaryBackgroundHighlight);
+}
+// Warning appears are orange
+.btn-warning {
+ .buttonBackground(@btnWarningBackground, @btnWarningBackgroundHighlight);
+}
+// Danger and error appear as red
+.btn-danger {
+ .buttonBackground(@btnDangerBackground, @btnDangerBackgroundHighlight);
+}
+// Success appears as green
+.btn-success {
+ .buttonBackground(@btnSuccessBackground, @btnSuccessBackgroundHighlight);
+}
+// Info appears as a neutral blue
+.btn-info {
+ .buttonBackground(@btnInfoBackground, @btnInfoBackgroundHighlight);
+}
+// Inverse appears as dark gray
+.btn-inverse {
+ .buttonBackground(@btnInverseBackground, @btnInverseBackgroundHighlight);
+}
+
+
+// Cross-browser Jank
+// --------------------------------------------------
+
+button.btn,
+input[type="submit"].btn {
+
+ // Firefox 3.6 only I believe
+ &::-moz-focus-inner {
+ padding: 0;
+ border: 0;
+ }
+
+ // IE7 has some default padding on button controls
+ *padding-top: 3px;
+ *padding-bottom: 3px;
+
+ &.btn-large {
+ *padding-top: 7px;
+ *padding-bottom: 7px;
+ }
+ &.btn-small {
+ *padding-top: 3px;
+ *padding-bottom: 3px;
+ }
+ &.btn-mini {
+ *padding-top: 1px;
+ *padding-bottom: 1px;
+ }
+}
+
+
+// Link buttons
+// --------------------------------------------------
+
+// Make a button look and behave like a link
+.btn-link,
+.btn-link:active,
+.btn-link[disabled] {
+ background-color: transparent;
+ background-image: none;
+ .box-shadow(none);
+}
+.btn-link {
+ border-color: transparent;
+ cursor: pointer;
+ color: @linkColor;
+ .border-radius(0);
+}
+.btn-link:hover,
+.btn-link:focus {
+ color: @linkColorHover;
+ text-decoration: underline;
+ background-color: transparent;
+}
+.btn-link[disabled]:hover,
+.btn-link[disabled]:focus {
+ color: @grayDark;
+ text-decoration: none;
+}
diff --git a/library/font_awesome/src/assets/less/bootstrap-2.3.2/carousel.less b/library/font_awesome/src/assets/less/bootstrap-2.3.2/carousel.less
new file mode 100755
index 000000000..55bc05014
--- /dev/null
+++ b/library/font_awesome/src/assets/less/bootstrap-2.3.2/carousel.less
@@ -0,0 +1,158 @@
+//
+// Carousel
+// --------------------------------------------------
+
+
+.carousel {
+ position: relative;
+ margin-bottom: @baseLineHeight;
+ line-height: 1;
+}
+
+.carousel-inner {
+ overflow: hidden;
+ width: 100%;
+ position: relative;
+}
+
+.carousel-inner {
+
+ > .item {
+ display: none;
+ position: relative;
+ .transition(.6s ease-in-out left);
+
+ // Account for jankitude on images
+ > img,
+ > a > img {
+ display: block;
+ line-height: 1;
+ }
+ }
+
+ > .active,
+ > .next,
+ > .prev { display: block; }
+
+ > .active {
+ left: 0;
+ }
+
+ > .next,
+ > .prev {
+ position: absolute;
+ top: 0;
+ width: 100%;
+ }
+
+ > .next {
+ left: 100%;
+ }
+ > .prev {
+ left: -100%;
+ }
+ > .next.left,
+ > .prev.right {
+ left: 0;
+ }
+
+ > .active.left {
+ left: -100%;
+ }
+ > .active.right {
+ left: 100%;
+ }
+
+}
+
+// Left/right controls for nav
+// ---------------------------
+
+.carousel-control {
+ position: absolute;
+ top: 40%;
+ left: 15px;
+ width: 40px;
+ height: 40px;
+ margin-top: -20px;
+ font-size: 60px;
+ font-weight: 100;
+ line-height: 30px;
+ color: @white;
+ text-align: center;
+ background: @grayDarker;
+ border: 3px solid @white;
+ .border-radius(23px);
+ .opacity(50);
+
+ // we can't have this transition here
+ // because webkit cancels the carousel
+ // animation if you trip this while
+ // in the middle of another animation
+ // ;_;
+ // .transition(opacity .2s linear);
+
+ // Reposition the right one
+ &.right {
+ left: auto;
+ right: 15px;
+ }
+
+ // Hover/focus state
+ &:hover,
+ &:focus {
+ color: @white;
+ text-decoration: none;
+ .opacity(90);
+ }
+}
+
+// Carousel indicator pips
+// -----------------------------
+.carousel-indicators {
+ position: absolute;
+ top: 15px;
+ right: 15px;
+ z-index: 5;
+ margin: 0;
+ list-style: none;
+
+ li {
+ display: block;
+ float: left;
+ width: 10px;
+ height: 10px;
+ margin-left: 5px;
+ text-indent: -999px;
+ background-color: #ccc;
+ background-color: rgba(255,255,255,.25);
+ border-radius: 5px;
+ }
+ .active {
+ background-color: #fff;
+ }
+}
+
+// Caption for text below images
+// -----------------------------
+
+.carousel-caption {
+ position: absolute;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ padding: 15px;
+ background: @grayDark;
+ background: rgba(0,0,0,.75);
+}
+.carousel-caption h4,
+.carousel-caption p {
+ color: @white;
+ line-height: @baseLineHeight;
+}
+.carousel-caption h4 {
+ margin: 0 0 5px;
+}
+.carousel-caption p {
+ margin-bottom: 0;
+}
diff --git a/library/font_awesome/src/assets/less/bootstrap-2.3.2/close.less b/library/font_awesome/src/assets/less/bootstrap-2.3.2/close.less
new file mode 100755
index 000000000..4c626bda6
--- /dev/null
+++ b/library/font_awesome/src/assets/less/bootstrap-2.3.2/close.less
@@ -0,0 +1,32 @@
+//
+// Close icons
+// --------------------------------------------------
+
+
+.close {
+ float: right;
+ font-size: 20px;
+ font-weight: bold;
+ line-height: @baseLineHeight;
+ color: @black;
+ text-shadow: 0 1px 0 rgba(255,255,255,1);
+ .opacity(20);
+ &:hover,
+ &:focus {
+ color: @black;
+ text-decoration: none;
+ cursor: pointer;
+ .opacity(40);
+ }
+}
+
+// Additional properties for button version
+// iOS requires the button element instead of an anchor tag.
+// If you want the anchor version, it requires `href="#"`.
+button.close {
+ padding: 0;
+ cursor: pointer;
+ background: transparent;
+ border: 0;
+ -webkit-appearance: none;
+} \ No newline at end of file
diff --git a/library/font_awesome/src/assets/less/bootstrap-2.3.2/code.less b/library/font_awesome/src/assets/less/bootstrap-2.3.2/code.less
new file mode 100755
index 000000000..266a926e7
--- /dev/null
+++ b/library/font_awesome/src/assets/less/bootstrap-2.3.2/code.less
@@ -0,0 +1,61 @@
+//
+// Code (inline and blocK)
+// --------------------------------------------------
+
+
+// Inline and block code styles
+code,
+pre {
+ padding: 0 3px 2px;
+ #font > #family > .monospace;
+ font-size: @baseFontSize - 2;
+ color: @grayDark;
+ .border-radius(3px);
+}
+
+// Inline code
+code {
+ padding: 2px 4px;
+ color: #d14;
+ background-color: #f7f7f9;
+ border: 1px solid #e1e1e8;
+ white-space: nowrap;
+}
+
+// Blocks of code
+pre {
+ display: block;
+ padding: (@baseLineHeight - 1) / 2;
+ margin: 0 0 @baseLineHeight / 2;
+ font-size: @baseFontSize - 1; // 14px to 13px
+ line-height: @baseLineHeight;
+ word-break: break-all;
+ word-wrap: break-word;
+ white-space: pre;
+ white-space: pre-wrap;
+ background-color: #f5f5f5;
+ border: 1px solid #ccc; // fallback for IE7-8
+ border: 1px solid rgba(0,0,0,.15);
+ .border-radius(@baseBorderRadius);
+
+ // Make prettyprint styles more spaced out for readability
+ &.prettyprint {
+ margin-bottom: @baseLineHeight;
+ }
+
+ // Account for some code outputs that place code tags in pre tags
+ code {
+ padding: 0;
+ color: inherit;
+ white-space: pre;
+ white-space: pre-wrap;
+ background-color: transparent;
+ border: 0;
+ }
+}
+
+// Enable scrollable blocks of code
+.pre-scrollable {
+ max-height: 340px;
+ overflow-y: scroll;
+} \ No newline at end of file
diff --git a/library/font_awesome/src/assets/less/bootstrap-2.3.2/component-animations.less b/library/font_awesome/src/assets/less/bootstrap-2.3.2/component-animations.less
new file mode 100755
index 000000000..d614263a7
--- /dev/null
+++ b/library/font_awesome/src/assets/less/bootstrap-2.3.2/component-animations.less
@@ -0,0 +1,22 @@
+//
+// Component animations
+// --------------------------------------------------
+
+
+.fade {
+ opacity: 0;
+ .transition(opacity .15s linear);
+ &.in {
+ opacity: 1;
+ }
+}
+
+.collapse {
+ position: relative;
+ height: 0;
+ overflow: hidden;
+ .transition(height .35s ease);
+ &.in {
+ height: auto;
+ }
+}
diff --git a/library/font_awesome/src/assets/less/bootstrap-2.3.2/dropdowns.less b/library/font_awesome/src/assets/less/bootstrap-2.3.2/dropdowns.less
new file mode 100755
index 000000000..9e47b4715
--- /dev/null
+++ b/library/font_awesome/src/assets/less/bootstrap-2.3.2/dropdowns.less
@@ -0,0 +1,248 @@
+//
+// Dropdown menus
+// --------------------------------------------------
+
+
+// Use the .menu class on any <li> element within the topbar or ul.tabs and you'll get some superfancy dropdowns
+.dropup,
+.dropdown {
+ position: relative;
+}
+.dropdown-toggle {
+ // The caret makes the toggle a bit too tall in IE7
+ *margin-bottom: -3px;
+}
+.dropdown-toggle:active,
+.open .dropdown-toggle {
+ outline: 0;
+}
+
+// Dropdown arrow/caret
+// --------------------
+.caret {
+ display: inline-block;
+ width: 0;
+ height: 0;
+ vertical-align: top;
+ border-top: 4px solid @black;
+ border-right: 4px solid transparent;
+ border-left: 4px solid transparent;
+ content: "";
+}
+
+// Place the caret
+.dropdown .caret {
+ margin-top: 8px;
+ margin-left: 2px;
+}
+
+// The dropdown menu (ul)
+// ----------------------
+.dropdown-menu {
+ position: absolute;
+ top: 100%;
+ left: 0;
+ z-index: @zindexDropdown;
+ display: none; // none by default, but block on "open" of the menu
+ float: left;
+ min-width: 160px;
+ padding: 5px 0;
+ margin: 2px 0 0; // override default ul
+ list-style: none;
+ background-color: @dropdownBackground;
+ border: 1px solid #ccc; // Fallback for IE7-8
+ border: 1px solid @dropdownBorder;
+ *border-right-width: 2px;
+ *border-bottom-width: 2px;
+ .border-radius(6px);
+ .box-shadow(0 5px 10px rgba(0,0,0,.2));
+ -webkit-background-clip: padding-box;
+ -moz-background-clip: padding;
+ background-clip: padding-box;
+
+ // Aligns the dropdown menu to right
+ &.pull-right {
+ right: 0;
+ left: auto;
+ }
+
+ // Dividers (basically an hr) within the dropdown
+ .divider {
+ .nav-divider(@dropdownDividerTop, @dropdownDividerBottom);
+ }
+
+ // Links within the dropdown menu
+ > li > a {
+ display: block;
+ padding: 3px 20px;
+ clear: both;
+ font-weight: normal;
+ line-height: @baseLineHeight;
+ color: @dropdownLinkColor;
+ white-space: nowrap;
+ }
+}
+
+// Hover/Focus state
+// -----------
+.dropdown-menu > li > a:hover,
+.dropdown-menu > li > a:focus,
+.dropdown-submenu:hover > a,
+.dropdown-submenu:focus > a {
+ text-decoration: none;
+ color: @dropdownLinkColorHover;
+ #gradient > .vertical(@dropdownLinkBackgroundHover, darken(@dropdownLinkBackgroundHover, 5%));
+}
+
+// Active state
+// ------------
+.dropdown-menu > .active > a,
+.dropdown-menu > .active > a:hover,
+.dropdown-menu > .active > a:focus {
+ color: @dropdownLinkColorActive;
+ text-decoration: none;
+ outline: 0;
+ #gradient > .vertical(@dropdownLinkBackgroundActive, darken(@dropdownLinkBackgroundActive, 5%));
+}
+
+// Disabled state
+// --------------
+// Gray out text and ensure the hover/focus state remains gray
+.dropdown-menu > .disabled > a,
+.dropdown-menu > .disabled > a:hover,
+.dropdown-menu > .disabled > a:focus {
+ color: @grayLight;
+}
+// Nuke hover/focus effects
+.dropdown-menu > .disabled > a:hover,
+.dropdown-menu > .disabled > a:focus {
+ text-decoration: none;
+ background-color: transparent;
+ background-image: none; // Remove CSS gradient
+ .reset-filter();
+ cursor: default;
+}
+
+// Open state for the dropdown
+// ---------------------------
+.open {
+ // IE7's z-index only goes to the nearest positioned ancestor, which would
+ // make the menu appear below buttons that appeared later on the page
+ *z-index: @zindexDropdown;
+
+ & > .dropdown-menu {
+ display: block;
+ }
+}
+
+// Backdrop to catch body clicks on mobile, etc.
+// ---------------------------
+.dropdown-backdrop {
+ position: fixed;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ top: 0;
+ z-index: @zindexDropdown - 10;
+}
+
+// Right aligned dropdowns
+// ---------------------------
+.pull-right > .dropdown-menu {
+ right: 0;
+ left: auto;
+}
+
+// Allow for dropdowns to go bottom up (aka, dropup-menu)
+// ------------------------------------------------------
+// Just add .dropup after the standard .dropdown class and you're set, bro.
+// TODO: abstract this so that the navbar fixed styles are not placed here?
+.dropup,
+.navbar-fixed-bottom .dropdown {
+ // Reverse the caret
+ .caret {
+ border-top: 0;
+ border-bottom: 4px solid @black;
+ content: "";
+ }
+ // Different positioning for bottom up menu
+ .dropdown-menu {
+ top: auto;
+ bottom: 100%;
+ margin-bottom: 1px;
+ }
+}
+
+// Sub menus
+// ---------------------------
+.dropdown-submenu {
+ position: relative;
+}
+// Default dropdowns
+.dropdown-submenu > .dropdown-menu {
+ top: 0;
+ left: 100%;
+ margin-top: -6px;
+ margin-left: -1px;
+ .border-radius(0 6px 6px 6px);
+}
+.dropdown-submenu:hover > .dropdown-menu {
+ display: block;
+}
+
+// Dropups
+.dropup .dropdown-submenu > .dropdown-menu {
+ top: auto;
+ bottom: 0;
+ margin-top: 0;
+ margin-bottom: -2px;
+ .border-radius(5px 5px 5px 0);
+}
+
+// Caret to indicate there is a submenu
+.dropdown-submenu > a:after {
+ display: block;
+ content: " ";
+ float: right;
+ width: 0;
+ height: 0;
+ border-color: transparent;
+ border-style: solid;
+ border-width: 5px 0 5px 5px;
+ border-left-color: darken(@dropdownBackground, 20%);
+ margin-top: 5px;
+ margin-right: -10px;
+}
+.dropdown-submenu:hover > a:after {
+ border-left-color: @dropdownLinkColorHover;
+}
+
+// Left aligned submenus
+.dropdown-submenu.pull-left {
+ // Undo the float
+ // Yes, this is awkward since .pull-left adds a float, but it sticks to our conventions elsewhere.
+ float: none;
+
+ // Positioning the submenu
+ > .dropdown-menu {
+ left: -100%;
+ margin-left: 10px;
+ .border-radius(6px 0 6px 6px);
+ }
+}
+
+// Tweak nav headers
+// -----------------
+// Increase padding from 15px to 20px on sides
+.dropdown .dropdown-menu .nav-header {
+ padding-left: 20px;
+ padding-right: 20px;
+}
+
+// Typeahead
+// ---------
+.typeahead {
+ z-index: 1051;
+ margin-top: 2px; // give it some space to breathe
+ .border-radius(@baseBorderRadius);
+}
diff --git a/library/font_awesome/src/assets/less/bootstrap-2.3.2/forms.less b/library/font_awesome/src/assets/less/bootstrap-2.3.2/forms.less
new file mode 100755
index 000000000..06767bdd3
--- /dev/null
+++ b/library/font_awesome/src/assets/less/bootstrap-2.3.2/forms.less
@@ -0,0 +1,690 @@
+//
+// Forms
+// --------------------------------------------------
+
+
+// GENERAL STYLES
+// --------------
+
+// Make all forms have space below them
+form {
+ margin: 0 0 @baseLineHeight;
+}
+
+fieldset {
+ padding: 0;
+ margin: 0;
+ border: 0;
+}
+
+// Groups of fields with labels on top (legends)
+legend {
+ display: block;
+ width: 100%;
+ padding: 0;
+ margin-bottom: @baseLineHeight;
+ font-size: @baseFontSize * 1.5;
+ line-height: @baseLineHeight * 2;
+ color: @grayDark;
+ border: 0;
+ border-bottom: 1px solid #e5e5e5;
+
+ // Small
+ small {
+ font-size: @baseLineHeight * .75;
+ color: @grayLight;
+ }
+}
+
+// Set font for forms
+label,
+input,
+button,
+select,
+textarea {
+ #font > .shorthand(@baseFontSize,normal,@baseLineHeight); // Set size, weight, line-height here
+}
+input,
+button,
+select,
+textarea {
+ font-family: @baseFontFamily; // And only set font-family here for those that need it (note the missing label element)
+}
+
+// Identify controls by their labels
+label {
+ display: block;
+ margin-bottom: 5px;
+}
+
+// Form controls
+// -------------------------
+
+// Shared size and type resets
+select,
+textarea,
+input[type="text"],
+input[type="password"],
+input[type="datetime"],
+input[type="datetime-local"],
+input[type="date"],
+input[type="month"],
+input[type="time"],
+input[type="week"],
+input[type="number"],
+input[type="email"],
+input[type="url"],
+input[type="search"],
+input[type="tel"],
+input[type="color"],
+.uneditable-input {
+ display: inline-block;
+ height: @baseLineHeight;
+ padding: 4px 6px;
+ margin-bottom: @baseLineHeight / 2;
+ font-size: @baseFontSize;
+ line-height: @baseLineHeight;
+ color: @gray;
+ .border-radius(@inputBorderRadius);
+ vertical-align: middle;
+}
+
+// Reset appearance properties for textual inputs and textarea
+// Declare width for legacy (can't be on input[type=*] selectors or it's too specific)
+input,
+textarea,
+.uneditable-input {
+ width: 206px; // plus 12px padding and 2px border
+}
+// Reset height since textareas have rows
+textarea {
+ height: auto;
+}
+// Everything else
+textarea,
+input[type="text"],
+input[type="password"],
+input[type="datetime"],
+input[type="datetime-local"],
+input[type="date"],
+input[type="month"],
+input[type="time"],
+input[type="week"],
+input[type="number"],
+input[type="email"],
+input[type="url"],
+input[type="search"],
+input[type="tel"],
+input[type="color"],
+.uneditable-input {
+ background-color: @inputBackground;
+ border: 1px solid @inputBorder;
+ .box-shadow(inset 0 1px 1px rgba(0,0,0,.075));
+ .transition(~"border linear .2s, box-shadow linear .2s");
+
+ // Focus state
+ &:focus {
+ border-color: rgba(82,168,236,.8);
+ outline: 0;
+ outline: thin dotted \9; /* IE6-9 */
+ .box-shadow(~"inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6)");
+ }
+}
+
+// Position radios and checkboxes better
+input[type="radio"],
+input[type="checkbox"] {
+ margin: 4px 0 0;
+ *margin-top: 0; /* IE7 */
+ margin-top: 1px \9; /* IE8-9 */
+ line-height: normal;
+}
+
+// Reset width of input images, buttons, radios, checkboxes
+input[type="file"],
+input[type="image"],
+input[type="submit"],
+input[type="reset"],
+input[type="button"],
+input[type="radio"],
+input[type="checkbox"] {
+ width: auto; // Override of generic input selector
+}
+
+// Set the height of select and file controls to match text inputs
+select,
+input[type="file"] {
+ height: @inputHeight; /* In IE7, the height of the select element cannot be changed by height, only font-size */
+ *margin-top: 4px; /* For IE7, add top margin to align select with labels */
+ line-height: @inputHeight;
+}
+
+// Make select elements obey height by applying a border
+select {
+ width: 220px; // default input width + 10px of padding that doesn't get applied
+ border: 1px solid @inputBorder;
+ background-color: @inputBackground; // Chrome on Linux and Mobile Safari need background-color
+}
+
+// Make multiple select elements height not fixed
+select[multiple],
+select[size] {
+ height: auto;
+}
+
+// Focus for select, file, radio, and checkbox
+select:focus,
+input[type="file"]:focus,
+input[type="radio"]:focus,
+input[type="checkbox"]:focus {
+ .tab-focus();
+}
+
+
+// Uneditable inputs
+// -------------------------
+
+// Make uneditable inputs look inactive
+.uneditable-input,
+.uneditable-textarea {
+ color: @grayLight;
+ background-color: darken(@inputBackground, 1%);
+ border-color: @inputBorder;
+ .box-shadow(inset 0 1px 2px rgba(0,0,0,.025));
+ cursor: not-allowed;
+}
+
+// For text that needs to appear as an input but should not be an input
+.uneditable-input {
+ overflow: hidden; // prevent text from wrapping, but still cut it off like an input does
+ white-space: nowrap;
+}
+
+// Make uneditable textareas behave like a textarea
+.uneditable-textarea {
+ width: auto;
+ height: auto;
+}
+
+
+// Placeholder
+// -------------------------
+
+// Placeholder text gets special styles because when browsers invalidate entire lines if it doesn't understand a selector
+input,
+textarea {
+ .placeholder();
+}
+
+
+// CHECKBOXES & RADIOS
+// -------------------
+
+// Indent the labels to position radios/checkboxes as hanging
+.radio,
+.checkbox {
+ min-height: @baseLineHeight; // clear the floating input if there is no label text
+ padding-left: 20px;
+}
+.radio input[type="radio"],
+.checkbox input[type="checkbox"] {
+ float: left;
+ margin-left: -20px;
+}
+
+// Move the options list down to align with labels
+.controls > .radio:first-child,
+.controls > .checkbox:first-child {
+ padding-top: 5px; // has to be padding because margin collaspes
+}
+
+// Radios and checkboxes on same line
+// TODO v3: Convert .inline to .control-inline
+.radio.inline,
+.checkbox.inline {
+ display: inline-block;
+ padding-top: 5px;
+ margin-bottom: 0;
+ vertical-align: middle;
+}
+.radio.inline + .radio.inline,
+.checkbox.inline + .checkbox.inline {
+ margin-left: 10px; // space out consecutive inline controls
+}
+
+
+
+// INPUT SIZES
+// -----------
+
+// General classes for quick sizes
+.input-mini { width: 60px; }
+.input-small { width: 90px; }
+.input-medium { width: 150px; }
+.input-large { width: 210px; }
+.input-xlarge { width: 270px; }
+.input-xxlarge { width: 530px; }
+
+// Grid style input sizes
+input[class*="span"],
+select[class*="span"],
+textarea[class*="span"],
+.uneditable-input[class*="span"],
+// Redeclare since the fluid row class is more specific
+.row-fluid input[class*="span"],
+.row-fluid select[class*="span"],
+.row-fluid textarea[class*="span"],
+.row-fluid .uneditable-input[class*="span"] {
+ float: none;
+ margin-left: 0;
+}
+// Ensure input-prepend/append never wraps
+.input-append input[class*="span"],
+.input-append .uneditable-input[class*="span"],
+.input-prepend input[class*="span"],
+.input-prepend .uneditable-input[class*="span"],
+.row-fluid input[class*="span"],
+.row-fluid select[class*="span"],
+.row-fluid textarea[class*="span"],
+.row-fluid .uneditable-input[class*="span"],
+.row-fluid .input-prepend [class*="span"],
+.row-fluid .input-append [class*="span"] {
+ display: inline-block;
+}
+
+
+
+// GRID SIZING FOR INPUTS
+// ----------------------
+
+// Grid sizes
+#grid > .input(@gridColumnWidth, @gridGutterWidth);
+
+// Control row for multiple inputs per line
+.controls-row {
+ .clearfix(); // Clear the float from controls
+}
+
+// Float to collapse white-space for proper grid alignment
+.controls-row [class*="span"],
+// Redeclare the fluid grid collapse since we undo the float for inputs
+.row-fluid .controls-row [class*="span"] {
+ float: left;
+}
+// Explicity set top padding on all checkboxes/radios, not just first-child
+.controls-row .checkbox[class*="span"],
+.controls-row .radio[class*="span"] {
+ padding-top: 5px;
+}
+
+
+
+
+// DISABLED STATE
+// --------------
+
+// Disabled and read-only inputs
+input[disabled],
+select[disabled],
+textarea[disabled],
+input[readonly],
+select[readonly],
+textarea[readonly] {
+ cursor: not-allowed;
+ background-color: @inputDisabledBackground;
+}
+// Explicitly reset the colors here
+input[type="radio"][disabled],
+input[type="checkbox"][disabled],
+input[type="radio"][readonly],
+input[type="checkbox"][readonly] {
+ background-color: transparent;
+}
+
+
+
+
+// FORM FIELD FEEDBACK STATES
+// --------------------------
+
+// Warning
+.control-group.warning {
+ .formFieldState(@warningText, @warningText, @warningBackground);
+}
+// Error
+.control-group.error {
+ .formFieldState(@errorText, @errorText, @errorBackground);
+}
+// Success
+.control-group.success {
+ .formFieldState(@successText, @successText, @successBackground);
+}
+// Success
+.control-group.info {
+ .formFieldState(@infoText, @infoText, @infoBackground);
+}
+
+// HTML5 invalid states
+// Shares styles with the .control-group.error above
+input:focus:invalid,
+textarea:focus:invalid,
+select:focus:invalid {
+ color: #b94a48;
+ border-color: #ee5f5b;
+ &:focus {
+ border-color: darken(#ee5f5b, 10%);
+ @shadow: 0 0 6px lighten(#ee5f5b, 20%);
+ .box-shadow(@shadow);
+ }
+}
+
+
+
+// FORM ACTIONS
+// ------------
+
+.form-actions {
+ padding: (@baseLineHeight - 1) 20px @baseLineHeight;
+ margin-top: @baseLineHeight;
+ margin-bottom: @baseLineHeight;
+ background-color: @formActionsBackground;
+ border-top: 1px solid #e5e5e5;
+ .clearfix(); // Adding clearfix to allow for .pull-right button containers
+}
+
+
+
+// HELP TEXT
+// ---------
+
+.help-block,
+.help-inline {
+ color: lighten(@textColor, 15%); // lighten the text some for contrast
+}
+
+.help-block {
+ display: block; // account for any element using help-block
+ margin-bottom: @baseLineHeight / 2;
+}
+
+.help-inline {
+ display: inline-block;
+ .ie7-inline-block();
+ vertical-align: middle;
+ padding-left: 5px;
+}
+
+
+
+// INPUT GROUPS
+// ------------
+
+// Allow us to put symbols and text within the input field for a cleaner look
+.input-append,
+.input-prepend {
+ display: inline-block;
+ margin-bottom: @baseLineHeight / 2;
+ vertical-align: middle;
+ font-size: 0; // white space collapse hack
+ white-space: nowrap; // Prevent span and input from separating
+
+ // Reset the white space collapse hack
+ input,
+ select,
+ .uneditable-input,
+ .dropdown-menu,
+ .popover {
+ font-size: @baseFontSize;
+ }
+
+ input,
+ select,
+ .uneditable-input {
+ position: relative; // placed here by default so that on :focus we can place the input above the .add-on for full border and box-shadow goodness
+ margin-bottom: 0; // prevent bottom margin from screwing up alignment in stacked forms
+ *margin-left: 0;
+ vertical-align: top;
+ .border-radius(0 @inputBorderRadius @inputBorderRadius 0);
+ // Make input on top when focused so blue border and shadow always show
+ &:focus {
+ z-index: 2;
+ }
+ }
+ .add-on {
+ display: inline-block;
+ width: auto;
+ height: @baseLineHeight;
+ min-width: 16px;
+ padding: 4px 5px;
+ font-size: @baseFontSize;
+ font-weight: normal;
+ line-height: @baseLineHeight;
+ text-align: center;
+ text-shadow: 0 1px 0 @white;
+ background-color: @grayLighter;
+ border: 1px solid #ccc;
+ }
+ .add-on,
+ .btn,
+ .btn-group > .dropdown-toggle {
+ vertical-align: top;
+ .border-radius(0);
+ }
+ .active {
+ background-color: lighten(@green, 30);
+ border-color: @green;
+ }
+}
+
+.input-prepend {
+ .add-on,
+ .btn {
+ margin-right: -1px;
+ }
+ .add-on:first-child,
+ .btn:first-child {
+ // FYI, `.btn:first-child` accounts for a button group that's prepended
+ .border-radius(@inputBorderRadius 0 0 @inputBorderRadius);
+ }
+}
+
+.input-append {
+ input,
+ select,
+ .uneditable-input {
+ .border-radius(@inputBorderRadius 0 0 @inputBorderRadius);
+ + .btn-group .btn:last-child {
+ .border-radius(0 @inputBorderRadius @inputBorderRadius 0);
+ }
+ }
+ .add-on,
+ .btn,
+ .btn-group {
+ margin-left: -1px;
+ }
+ .add-on:last-child,
+ .btn:last-child,
+ .btn-group:last-child > .dropdown-toggle {
+ .border-radius(0 @inputBorderRadius @inputBorderRadius 0);
+ }
+}
+
+// Remove all border-radius for inputs with both prepend and append
+.input-prepend.input-append {
+ input,
+ select,
+ .uneditable-input {
+ .border-radius(0);
+ + .btn-group .btn {
+ .border-radius(0 @inputBorderRadius @inputBorderRadius 0);
+ }
+ }
+ .add-on:first-child,
+ .btn:first-child {
+ margin-right: -1px;
+ .border-radius(@inputBorderRadius 0 0 @inputBorderRadius);
+ }
+ .add-on:last-child,
+ .btn:last-child {
+ margin-left: -1px;
+ .border-radius(0 @inputBorderRadius @inputBorderRadius 0);
+ }
+ .btn-group:first-child {
+ margin-left: 0;
+ }
+}
+
+
+
+
+// SEARCH FORM
+// -----------
+
+input.search-query {
+ padding-right: 14px;
+ padding-right: 4px \9;
+ padding-left: 14px;
+ padding-left: 4px \9; /* IE7-8 doesn't have border-radius, so don't indent the padding */
+ margin-bottom: 0; // Remove the default margin on all inputs
+ .border-radius(15px);
+}
+
+/* Allow for input prepend/append in search forms */
+.form-search .input-append .search-query,
+.form-search .input-prepend .search-query {
+ .border-radius(0); // Override due to specificity
+}
+.form-search .input-append .search-query {
+ .border-radius(14px 0 0 14px);
+}
+.form-search .input-append .btn {
+ .border-radius(0 14px 14px 0);
+}
+.form-search .input-prepend .search-query {
+ .border-radius(0 14px 14px 0);
+}
+.form-search .input-prepend .btn {
+ .border-radius(14px 0 0 14px);
+}
+
+
+
+
+// HORIZONTAL & VERTICAL FORMS
+// ---------------------------
+
+// Common properties
+// -----------------
+
+.form-search,
+.form-inline,
+.form-horizontal {
+ input,
+ textarea,
+ select,
+ .help-inline,
+ .uneditable-input,
+ .input-prepend,
+ .input-append {
+ display: inline-block;
+ .ie7-inline-block();
+ margin-bottom: 0;
+ vertical-align: middle;
+ }
+ // Re-hide hidden elements due to specifity
+ .hide {
+ display: none;
+ }
+}
+.form-search label,
+.form-inline label,
+.form-search .btn-group,
+.form-inline .btn-group {
+ display: inline-block;
+}
+// Remove margin for input-prepend/-append
+.form-search .input-append,
+.form-inline .input-append,
+.form-search .input-prepend,
+.form-inline .input-prepend {
+ margin-bottom: 0;
+}
+// Inline checkbox/radio labels (remove padding on left)
+.form-search .radio,
+.form-search .checkbox,
+.form-inline .radio,
+.form-inline .checkbox {
+ padding-left: 0;
+ margin-bottom: 0;
+ vertical-align: middle;
+}
+// Remove float and margin, set to inline-block
+.form-search .radio input[type="radio"],
+.form-search .checkbox input[type="checkbox"],
+.form-inline .radio input[type="radio"],
+.form-inline .checkbox input[type="checkbox"] {
+ float: left;
+ margin-right: 3px;
+ margin-left: 0;
+}
+
+
+// Margin to space out fieldsets
+.control-group {
+ margin-bottom: @baseLineHeight / 2;
+}
+
+// Legend collapses margin, so next element is responsible for spacing
+legend + .control-group {
+ margin-top: @baseLineHeight;
+ -webkit-margin-top-collapse: separate;
+}
+
+// Horizontal-specific styles
+// --------------------------
+
+.form-horizontal {
+ // Increase spacing between groups
+ .control-group {
+ margin-bottom: @baseLineHeight;
+ .clearfix();
+ }
+ // Float the labels left
+ .control-label {
+ float: left;
+ width: @horizontalComponentOffset - 20;
+ padding-top: 5px;
+ text-align: right;
+ }
+ // Move over all input controls and content
+ .controls {
+ // Super jank IE7 fix to ensure the inputs in .input-append and input-prepend
+ // don't inherit the margin of the parent, in this case .controls
+ *display: inline-block;
+ *padding-left: 20px;
+ margin-left: @horizontalComponentOffset;
+ *margin-left: 0;
+ &:first-child {
+ *padding-left: @horizontalComponentOffset;
+ }
+ }
+ // Remove bottom margin on block level help text since that's accounted for on .control-group
+ .help-block {
+ margin-bottom: 0;
+ }
+ // And apply it only to .help-block instances that follow a form control
+ input,
+ select,
+ textarea,
+ .uneditable-input,
+ .input-prepend,
+ .input-append {
+ + .help-block {
+ margin-top: @baseLineHeight / 2;
+ }
+ }
+ // Move over buttons in .form-actions to align with .controls
+ .form-actions {
+ padding-left: @horizontalComponentOffset;
+ }
+}
diff --git a/library/font_awesome/src/assets/less/bootstrap-2.3.2/grid.less b/library/font_awesome/src/assets/less/bootstrap-2.3.2/grid.less
new file mode 100755
index 000000000..750d20351
--- /dev/null
+++ b/library/font_awesome/src/assets/less/bootstrap-2.3.2/grid.less
@@ -0,0 +1,21 @@
+//
+// Grid system
+// --------------------------------------------------
+
+
+// Fixed (940px)
+#grid > .core(@gridColumnWidth, @gridGutterWidth);
+
+// Fluid (940px)
+#grid > .fluid(@fluidGridColumnWidth, @fluidGridGutterWidth);
+
+// Reset utility classes due to specificity
+[class*="span"].hide,
+.row-fluid [class*="span"].hide {
+ display: none;
+}
+
+[class*="span"].pull-right,
+.row-fluid [class*="span"].pull-right {
+ float: right;
+}
diff --git a/library/font_awesome/src/assets/less/bootstrap-2.3.2/hero-unit.less b/library/font_awesome/src/assets/less/bootstrap-2.3.2/hero-unit.less
new file mode 100755
index 000000000..763d86aee
--- /dev/null
+++ b/library/font_awesome/src/assets/less/bootstrap-2.3.2/hero-unit.less
@@ -0,0 +1,25 @@
+//
+// Hero unit
+// --------------------------------------------------
+
+
+.hero-unit {
+ padding: 60px;
+ margin-bottom: 30px;
+ font-size: 18px;
+ font-weight: 200;
+ line-height: @baseLineHeight * 1.5;
+ color: @heroUnitLeadColor;
+ background-color: @heroUnitBackground;
+ .border-radius(6px);
+ h1 {
+ margin-bottom: 0;
+ font-size: 60px;
+ line-height: 1;
+ color: @heroUnitHeadingColor;
+ letter-spacing: -1px;
+ }
+ li {
+ line-height: @baseLineHeight * 1.5; // Reset since we specify in type.less
+ }
+}
diff --git a/library/font_awesome/src/assets/less/bootstrap-2.3.2/labels-badges.less b/library/font_awesome/src/assets/less/bootstrap-2.3.2/labels-badges.less
new file mode 100755
index 000000000..bc321fe5c
--- /dev/null
+++ b/library/font_awesome/src/assets/less/bootstrap-2.3.2/labels-badges.less
@@ -0,0 +1,84 @@
+//
+// Labels and badges
+// --------------------------------------------------
+
+
+// Base classes
+.label,
+.badge {
+ display: inline-block;
+ padding: 2px 4px;
+ font-size: @baseFontSize * .846;
+ font-weight: bold;
+ line-height: 14px; // ensure proper line-height if floated
+ color: @white;
+ vertical-align: baseline;
+ white-space: nowrap;
+ text-shadow: 0 -1px 0 rgba(0,0,0,.25);
+ background-color: @grayLight;
+}
+// Set unique padding and border-radii
+.label {
+ .border-radius(3px);
+}
+.badge {
+ padding-left: 9px;
+ padding-right: 9px;
+ .border-radius(9px);
+}
+
+// Empty labels/badges collapse
+.label,
+.badge {
+ &:empty {
+ display: none;
+ }
+}
+
+// Hover/focus state, but only for links
+a {
+ &.label:hover,
+ &.label:focus,
+ &.badge:hover,
+ &.badge:focus {
+ color: @white;
+ text-decoration: none;
+ cursor: pointer;
+ }
+}
+
+// Colors
+// Only give background-color difference to links (and to simplify, we don't qualifty with `a` but [href] attribute)
+.label,
+.badge {
+ // Important (red)
+ &-important { background-color: @errorText; }
+ &-important[href] { background-color: darken(@errorText, 10%); }
+ // Warnings (orange)
+ &-warning { background-color: @orange; }
+ &-warning[href] { background-color: darken(@orange, 10%); }
+ // Success (green)
+ &-success { background-color: @successText; }
+ &-success[href] { background-color: darken(@successText, 10%); }
+ // Info (turquoise)
+ &-info { background-color: @infoText; }
+ &-info[href] { background-color: darken(@infoText, 10%); }
+ // Inverse (black)
+ &-inverse { background-color: @grayDark; }
+ &-inverse[href] { background-color: darken(@grayDark, 10%); }
+}
+
+// Quick fix for labels/badges in buttons
+.btn {
+ .label,
+ .badge {
+ position: relative;
+ top: -1px;
+ }
+}
+.btn-mini {
+ .label,
+ .badge {
+ top: 0;
+ }
+}
diff --git a/library/font_awesome/src/assets/less/bootstrap-2.3.2/layouts.less b/library/font_awesome/src/assets/less/bootstrap-2.3.2/layouts.less
new file mode 100755
index 000000000..24a206211
--- /dev/null
+++ b/library/font_awesome/src/assets/less/bootstrap-2.3.2/layouts.less
@@ -0,0 +1,16 @@
+//
+// Layouts
+// --------------------------------------------------
+
+
+// Container (centered, fixed-width layouts)
+.container {
+ .container-fixed();
+}
+
+// Fluid layouts (left aligned, with sidebar, min- & max-width content)
+.container-fluid {
+ padding-right: @gridGutterWidth;
+ padding-left: @gridGutterWidth;
+ .clearfix();
+} \ No newline at end of file
diff --git a/library/font_awesome/src/assets/less/bootstrap-2.3.2/media.less b/library/font_awesome/src/assets/less/bootstrap-2.3.2/media.less
new file mode 100755
index 000000000..e461e446d
--- /dev/null
+++ b/library/font_awesome/src/assets/less/bootstrap-2.3.2/media.less
@@ -0,0 +1,55 @@
+// Media objects
+// Source: http://stubbornella.org/content/?p=497
+// --------------------------------------------------
+
+
+// Common styles
+// -------------------------
+
+// Clear the floats
+.media,
+.media-body {
+ overflow: hidden;
+ *overflow: visible;
+ zoom: 1;
+}
+
+// Proper spacing between instances of .media
+.media,
+.media .media {
+ margin-top: 15px;
+}
+.media:first-child {
+ margin-top: 0;
+}
+
+// For images and videos, set to block
+.media-object {
+ display: block;
+}
+
+// Reset margins on headings for tighter default spacing
+.media-heading {
+ margin: 0 0 5px;
+}
+
+
+// Media image alignment
+// -------------------------
+
+.media > .pull-left {
+ margin-right: 10px;
+}
+.media > .pull-right {
+ margin-left: 10px;
+}
+
+
+// Media list variation
+// -------------------------
+
+// Undo default ul/ol styles
+.media-list {
+ margin-left: 0;
+ list-style: none;
+}
diff --git a/library/font_awesome/src/assets/less/bootstrap-2.3.2/mixins.less b/library/font_awesome/src/assets/less/bootstrap-2.3.2/mixins.less
new file mode 100755
index 000000000..79d889219
--- /dev/null
+++ b/library/font_awesome/src/assets/less/bootstrap-2.3.2/mixins.less
@@ -0,0 +1,702 @@
+//
+// Mixins
+// --------------------------------------------------
+
+
+// UTILITY MIXINS
+// --------------------------------------------------
+
+// Clearfix
+// --------
+// For clearing floats like a boss h5bp.com/q
+.clearfix {
+ *zoom: 1;
+ &:before,
+ &:after {
+ display: table;
+ content: "";
+ // Fixes Opera/contenteditable bug:
+ // http://nicolasgallagher.com/micro-clearfix-hack/#comment-36952
+ line-height: 0;
+ }
+ &:after {
+ clear: both;
+ }
+}
+
+// Webkit-style focus
+// ------------------
+.tab-focus() {
+ // Default
+ outline: thin dotted #333;
+ // Webkit
+ outline: 5px auto -webkit-focus-ring-color;
+ outline-offset: -2px;
+}
+
+// Center-align a block level element
+// ----------------------------------
+.center-block() {
+ display: block;
+ margin-left: auto;
+ margin-right: auto;
+}
+
+// IE7 inline-block
+// ----------------
+.ie7-inline-block() {
+ *display: inline; /* IE7 inline-block hack */
+ *zoom: 1;
+}
+
+// IE7 likes to collapse whitespace on either side of the inline-block elements.
+// Ems because we're attempting to match the width of a space character. Left
+// version is for form buttons, which typically come after other elements, and
+// right version is for icons, which come before. Applying both is ok, but it will
+// mean that space between those elements will be .6em (~2 space characters) in IE7,
+// instead of the 1 space in other browsers.
+.ie7-restore-left-whitespace() {
+ *margin-left: .3em;
+
+ &:first-child {
+ *margin-left: 0;
+ }
+}
+
+.ie7-restore-right-whitespace() {
+ *margin-right: .3em;
+}
+
+// Sizing shortcuts
+// -------------------------
+.size(@height, @width) {
+ width: @width;
+ height: @height;
+}
+.square(@size) {
+ .size(@size, @size);
+}
+
+// Placeholder text
+// -------------------------
+.placeholder(@color: @placeholderText) {
+ &:-moz-placeholder {
+ color: @color;
+ }
+ &:-ms-input-placeholder {
+ color: @color;
+ }
+ &::-webkit-input-placeholder {
+ color: @color;
+ }
+}
+
+// Text overflow
+// -------------------------
+// Requires inline-block or block for proper styling
+.text-overflow() {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+// CSS image replacement
+// -------------------------
+// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757
+.hide-text {
+ font: 0/0 a;
+ color: transparent;
+ text-shadow: none;
+ background-color: transparent;
+ border: 0;
+}
+
+
+// FONTS
+// --------------------------------------------------
+
+#font {
+ #family {
+ .serif() {
+ font-family: @serifFontFamily;
+ }
+ .sans-serif() {
+ font-family: @sansFontFamily;
+ }
+ .monospace() {
+ font-family: @monoFontFamily;
+ }
+ }
+ .shorthand(@size: @baseFontSize, @weight: normal, @lineHeight: @baseLineHeight) {
+ font-size: @size;
+ font-weight: @weight;
+ line-height: @lineHeight;
+ }
+ .serif(@size: @baseFontSize, @weight: normal, @lineHeight: @baseLineHeight) {
+ #font > #family > .serif;
+ #font > .shorthand(@size, @weight, @lineHeight);
+ }
+ .sans-serif(@size: @baseFontSize, @weight: normal, @lineHeight: @baseLineHeight) {
+ #font > #family > .sans-serif;
+ #font > .shorthand(@size, @weight, @lineHeight);
+ }
+ .monospace(@size: @baseFontSize, @weight: normal, @lineHeight: @baseLineHeight) {
+ #font > #family > .monospace;
+ #font > .shorthand(@size, @weight, @lineHeight);
+ }
+}
+
+
+// FORMS
+// --------------------------------------------------
+
+// Block level inputs
+.input-block-level {
+ display: block;
+ width: 100%;
+ min-height: @inputHeight; // Make inputs at least the height of their button counterpart (base line-height + padding + border)
+ .box-sizing(border-box); // Makes inputs behave like true block-level elements
+}
+
+
+
+// Mixin for form field states
+.formFieldState(@textColor: #555, @borderColor: #ccc, @backgroundColor: #f5f5f5) {
+ // Set the text color
+ .control-label,
+ .help-block,
+ .help-inline {
+ color: @textColor;
+ }
+ // Style inputs accordingly
+ .checkbox,
+ .radio,
+ input,
+ select,
+ textarea {
+ color: @textColor;
+ }
+ input,
+ select,
+ textarea {
+ border-color: @borderColor;
+ .box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); // Redeclare so transitions work
+ &:focus {
+ border-color: darken(@borderColor, 10%);
+ @shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten(@borderColor, 20%);
+ .box-shadow(@shadow);
+ }
+ }
+ // Give a small background color for input-prepend/-append
+ .input-prepend .add-on,
+ .input-append .add-on {
+ color: @textColor;
+ background-color: @backgroundColor;
+ border-color: @textColor;
+ }
+}
+
+
+
+// CSS3 PROPERTIES
+// --------------------------------------------------
+
+// Border Radius
+.border-radius(@radius) {
+ -webkit-border-radius: @radius;
+ -moz-border-radius: @radius;
+ border-radius: @radius;
+}
+
+// Single Corner Border Radius
+.border-top-left-radius(@radius) {
+ -webkit-border-top-left-radius: @radius;
+ -moz-border-radius-topleft: @radius;
+ border-top-left-radius: @radius;
+}
+.border-top-right-radius(@radius) {
+ -webkit-border-top-right-radius: @radius;
+ -moz-border-radius-topright: @radius;
+ border-top-right-radius: @radius;
+}
+.border-bottom-right-radius(@radius) {
+ -webkit-border-bottom-right-radius: @radius;
+ -moz-border-radius-bottomright: @radius;
+ border-bottom-right-radius: @radius;
+}
+.border-bottom-left-radius(@radius) {
+ -webkit-border-bottom-left-radius: @radius;
+ -moz-border-radius-bottomleft: @radius;
+ border-bottom-left-radius: @radius;
+}
+
+// Single Side Border Radius
+.border-top-radius(@radius) {
+ .border-top-right-radius(@radius);
+ .border-top-left-radius(@radius);
+}
+.border-right-radius(@radius) {
+ .border-top-right-radius(@radius);
+ .border-bottom-right-radius(@radius);
+}
+.border-bottom-radius(@radius) {
+ .border-bottom-right-radius(@radius);
+ .border-bottom-left-radius(@radius);
+}
+.border-left-radius(@radius) {
+ .border-top-left-radius(@radius);
+ .border-bottom-left-radius(@radius);
+}
+
+// Drop shadows
+.box-shadow(@shadow) {
+ -webkit-box-shadow: @shadow;
+ -moz-box-shadow: @shadow;
+ box-shadow: @shadow;
+}
+
+// Transitions
+.transition(@transition) {
+ -webkit-transition: @transition;
+ -moz-transition: @transition;
+ -o-transition: @transition;
+ transition: @transition;
+}
+.transition-delay(@transition-delay) {
+ -webkit-transition-delay: @transition-delay;
+ -moz-transition-delay: @transition-delay;
+ -o-transition-delay: @transition-delay;
+ transition-delay: @transition-delay;
+}
+.transition-duration(@transition-duration) {
+ -webkit-transition-duration: @transition-duration;
+ -moz-transition-duration: @transition-duration;
+ -o-transition-duration: @transition-duration;
+ transition-duration: @transition-duration;
+}
+
+// Transformations
+.rotate(@degrees) {
+ -webkit-transform: rotate(@degrees);
+ -moz-transform: rotate(@degrees);
+ -ms-transform: rotate(@degrees);
+ -o-transform: rotate(@degrees);
+ transform: rotate(@degrees);
+}
+.scale(@ratio) {
+ -webkit-transform: scale(@ratio);
+ -moz-transform: scale(@ratio);
+ -ms-transform: scale(@ratio);
+ -o-transform: scale(@ratio);
+ transform: scale(@ratio);
+}
+.translate(@x, @y) {
+ -webkit-transform: translate(@x, @y);
+ -moz-transform: translate(@x, @y);
+ -ms-transform: translate(@x, @y);
+ -o-transform: translate(@x, @y);
+ transform: translate(@x, @y);
+}
+.skew(@x, @y) {
+ -webkit-transform: skew(@x, @y);
+ -moz-transform: skew(@x, @y);
+ -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twitter/bootstrap/issues/4885
+ -o-transform: skew(@x, @y);
+ transform: skew(@x, @y);
+ -webkit-backface-visibility: hidden; // See https://github.com/twitter/bootstrap/issues/5319
+}
+.translate3d(@x, @y, @z) {
+ -webkit-transform: translate3d(@x, @y, @z);
+ -moz-transform: translate3d(@x, @y, @z);
+ -o-transform: translate3d(@x, @y, @z);
+ transform: translate3d(@x, @y, @z);
+}
+
+// Backface visibility
+// Prevent browsers from flickering when using CSS 3D transforms.
+// Default value is `visible`, but can be changed to `hidden
+// See git pull https://github.com/dannykeane/bootstrap.git backface-visibility for examples
+.backface-visibility(@visibility){
+ -webkit-backface-visibility: @visibility;
+ -moz-backface-visibility: @visibility;
+ backface-visibility: @visibility;
+}
+
+// Background clipping
+// Heads up: FF 3.6 and under need "padding" instead of "padding-box"
+.background-clip(@clip) {
+ -webkit-background-clip: @clip;
+ -moz-background-clip: @clip;
+ background-clip: @clip;
+}
+
+// Background sizing
+.background-size(@size) {
+ -webkit-background-size: @size;
+ -moz-background-size: @size;
+ -o-background-size: @size;
+ background-size: @size;
+}
+
+
+// Box sizing
+.box-sizing(@boxmodel) {
+ -webkit-box-sizing: @boxmodel;
+ -moz-box-sizing: @boxmodel;
+ box-sizing: @boxmodel;
+}
+
+// User select
+// For selecting text on the page
+.user-select(@select) {
+ -webkit-user-select: @select;
+ -moz-user-select: @select;
+ -ms-user-select: @select;
+ -o-user-select: @select;
+ user-select: @select;
+}
+
+// Resize anything
+.resizable(@direction) {
+ resize: @direction; // Options: horizontal, vertical, both
+ overflow: auto; // Safari fix
+}
+
+// CSS3 Content Columns
+.content-columns(@columnCount, @columnGap: @gridGutterWidth) {
+ -webkit-column-count: @columnCount;
+ -moz-column-count: @columnCount;
+ column-count: @columnCount;
+ -webkit-column-gap: @columnGap;
+ -moz-column-gap: @columnGap;
+ column-gap: @columnGap;
+}
+
+// Optional hyphenation
+.hyphens(@mode: auto) {
+ word-wrap: break-word;
+ -webkit-hyphens: @mode;
+ -moz-hyphens: @mode;
+ -ms-hyphens: @mode;
+ -o-hyphens: @mode;
+ hyphens: @mode;
+}
+
+// Opacity
+.opacity(@opacity) {
+ opacity: @opacity / 100;
+ filter: ~"alpha(opacity=@{opacity})";
+}
+
+
+
+// BACKGROUNDS
+// --------------------------------------------------
+
+// Add an alphatransparency value to any background or border color (via Elyse Holladay)
+#translucent {
+ .background(@color: @white, @alpha: 1) {
+ background-color: hsla(hue(@color), saturation(@color), lightness(@color), @alpha);
+ }
+ .border(@color: @white, @alpha: 1) {
+ border-color: hsla(hue(@color), saturation(@color), lightness(@color), @alpha);
+ .background-clip(padding-box);
+ }
+}
+
+// Gradient Bar Colors for buttons and alerts
+.gradientBar(@primaryColor, @secondaryColor, @textColor: #fff, @textShadow: 0 -1px 0 rgba(0,0,0,.25)) {
+ color: @textColor;
+ text-shadow: @textShadow;
+ #gradient > .vertical(@primaryColor, @secondaryColor);
+ border-color: @secondaryColor @secondaryColor darken(@secondaryColor, 15%);
+ border-color: rgba(0,0,0,.1) rgba(0,0,0,.1) fadein(rgba(0,0,0,.1), 15%);
+}
+
+// Gradients
+#gradient {
+ .horizontal(@startColor: #555, @endColor: #333) {
+ background-color: @endColor;
+ background-image: -moz-linear-gradient(left, @startColor, @endColor); // FF 3.6+
+ background-image: -webkit-gradient(linear, 0 0, 100% 0, from(@startColor), to(@endColor)); // Safari 4+, Chrome 2+
+ background-image: -webkit-linear-gradient(left, @startColor, @endColor); // Safari 5.1+, Chrome 10+
+ background-image: -o-linear-gradient(left, @startColor, @endColor); // Opera 11.10
+ background-image: linear-gradient(to right, @startColor, @endColor); // Standard, IE10
+ background-repeat: repeat-x;
+ filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)",argb(@startColor),argb(@endColor))); // IE9 and down
+ }
+ .vertical(@startColor: #555, @endColor: #333) {
+ background-color: mix(@startColor, @endColor, 60%);
+ background-image: -moz-linear-gradient(top, @startColor, @endColor); // FF 3.6+
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(@startColor), to(@endColor)); // Safari 4+, Chrome 2+
+ background-image: -webkit-linear-gradient(top, @startColor, @endColor); // Safari 5.1+, Chrome 10+
+ background-image: -o-linear-gradient(top, @startColor, @endColor); // Opera 11.10
+ background-image: linear-gradient(to bottom, @startColor, @endColor); // Standard, IE10
+ background-repeat: repeat-x;
+ filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)",argb(@startColor),argb(@endColor))); // IE9 and down
+ }
+ .directional(@startColor: #555, @endColor: #333, @deg: 45deg) {
+ background-color: @endColor;
+ background-repeat: repeat-x;
+ background-image: -moz-linear-gradient(@deg, @startColor, @endColor); // FF 3.6+
+ background-image: -webkit-linear-gradient(@deg, @startColor, @endColor); // Safari 5.1+, Chrome 10+
+ background-image: -o-linear-gradient(@deg, @startColor, @endColor); // Opera 11.10
+ background-image: linear-gradient(@deg, @startColor, @endColor); // Standard, IE10
+ }
+ .horizontal-three-colors(@startColor: #00b3ee, @midColor: #7a43b6, @colorStop: 50%, @endColor: #c3325f) {
+ background-color: mix(@midColor, @endColor, 80%);
+ background-image: -webkit-gradient(left, linear, 0 0, 0 100%, from(@startColor), color-stop(@colorStop, @midColor), to(@endColor));
+ background-image: -webkit-linear-gradient(left, @startColor, @midColor @colorStop, @endColor);
+ background-image: -moz-linear-gradient(left, @startColor, @midColor @colorStop, @endColor);
+ background-image: -o-linear-gradient(left, @startColor, @midColor @colorStop, @endColor);
+ background-image: linear-gradient(to right, @startColor, @midColor @colorStop, @endColor);
+ background-repeat: no-repeat;
+ filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)",argb(@startColor),argb(@endColor))); // IE9 and down, gets no color-stop at all for proper fallback
+ }
+
+ .vertical-three-colors(@startColor: #00b3ee, @midColor: #7a43b6, @colorStop: 50%, @endColor: #c3325f) {
+ background-color: mix(@midColor, @endColor, 80%);
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(@startColor), color-stop(@colorStop, @midColor), to(@endColor));
+ background-image: -webkit-linear-gradient(@startColor, @midColor @colorStop, @endColor);
+ background-image: -moz-linear-gradient(top, @startColor, @midColor @colorStop, @endColor);
+ background-image: -o-linear-gradient(@startColor, @midColor @colorStop, @endColor);
+ background-image: linear-gradient(@startColor, @midColor @colorStop, @endColor);
+ background-repeat: no-repeat;
+ filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)",argb(@startColor),argb(@endColor))); // IE9 and down, gets no color-stop at all for proper fallback
+ }
+ .radial(@innerColor: #555, @outerColor: #333) {
+ background-color: @outerColor;
+ background-image: -webkit-gradient(radial, center center, 0, center center, 460, from(@innerColor), to(@outerColor));
+ background-image: -webkit-radial-gradient(circle, @innerColor, @outerColor);
+ background-image: -moz-radial-gradient(circle, @innerColor, @outerColor);
+ background-image: -o-radial-gradient(circle, @innerColor, @outerColor);
+ background-repeat: no-repeat;
+ }
+ .striped(@color: #555, @angle: 45deg) {
+ background-color: @color;
+ background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(.25, rgba(255,255,255,.15)), color-stop(.25, transparent), color-stop(.5, transparent), color-stop(.5, rgba(255,255,255,.15)), color-stop(.75, rgba(255,255,255,.15)), color-stop(.75, transparent), to(transparent));
+ background-image: -webkit-linear-gradient(@angle, rgba(255,255,255,.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.15) 75%, transparent 75%, transparent);
+ background-image: -moz-linear-gradient(@angle, rgba(255,255,255,.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.15) 75%, transparent 75%, transparent);
+ background-image: -o-linear-gradient(@angle, rgba(255,255,255,.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.15) 75%, transparent 75%, transparent);
+ background-image: linear-gradient(@angle, rgba(255,255,255,.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.15) 75%, transparent 75%, transparent);
+ }
+}
+// Reset filters for IE
+.reset-filter() {
+ filter: e(%("progid:DXImageTransform.Microsoft.gradient(enabled = false)"));
+}
+
+
+
+// COMPONENT MIXINS
+// --------------------------------------------------
+
+// Horizontal dividers
+// -------------------------
+// Dividers (basically an hr) within dropdowns and nav lists
+.nav-divider(@top: #e5e5e5, @bottom: @white) {
+ // IE7 needs a set width since we gave a height. Restricting just
+ // to IE7 to keep the 1px left/right space in other browsers.
+ // It is unclear where IE is getting the extra space that we need
+ // to negative-margin away, but so it goes.
+ *width: 100%;
+ height: 1px;
+ margin: ((@baseLineHeight / 2) - 1) 1px; // 8px 1px
+ *margin: -5px 0 5px;
+ overflow: hidden;
+ background-color: @top;
+ border-bottom: 1px solid @bottom;
+}
+
+// Button backgrounds
+// ------------------
+.buttonBackground(@startColor, @endColor, @textColor: #fff, @textShadow: 0 -1px 0 rgba(0,0,0,.25)) {
+ // gradientBar will set the background to a pleasing blend of these, to support IE<=9
+ .gradientBar(@startColor, @endColor, @textColor, @textShadow);
+ *background-color: @endColor; /* Darken IE7 buttons by default so they stand out more given they won't have borders */
+ .reset-filter();
+
+ // in these cases the gradient won't cover the background, so we override
+ &:hover, &:focus, &:active, &.active, &.disabled, &[disabled] {
+ color: @textColor;
+ background-color: @endColor;
+ *background-color: darken(@endColor, 5%);
+ }
+
+ // IE 7 + 8 can't handle box-shadow to show active, so we darken a bit ourselves
+ &:active,
+ &.active {
+ background-color: darken(@endColor, 10%) e("\9");
+ }
+}
+
+// Navbar vertical align
+// -------------------------
+// Vertically center elements in the navbar.
+// Example: an element has a height of 30px, so write out `.navbarVerticalAlign(30px);` to calculate the appropriate top margin.
+.navbarVerticalAlign(@elementHeight) {
+ margin-top: (@navbarHeight - @elementHeight) / 2;
+}
+
+
+
+// Grid System
+// -----------
+
+// Centered container element
+.container-fixed() {
+ margin-right: auto;
+ margin-left: auto;
+ .clearfix();
+}
+
+// Table columns
+.tableColumns(@columnSpan: 1) {
+ float: none; // undo default grid column styles
+ width: ((@gridColumnWidth) * @columnSpan) + (@gridGutterWidth * (@columnSpan - 1)) - 16; // 16 is total padding on left and right of table cells
+ margin-left: 0; // undo default grid column styles
+}
+
+// Make a Grid
+// Use .makeRow and .makeColumn to assign semantic layouts grid system behavior
+.makeRow() {
+ margin-left: @gridGutterWidth * -1;
+ .clearfix();
+}
+.makeColumn(@columns: 1, @offset: 0) {
+ float: left;
+ margin-left: (@gridColumnWidth * @offset) + (@gridGutterWidth * (@offset - 1)) + (@gridGutterWidth * 2);
+ width: (@gridColumnWidth * @columns) + (@gridGutterWidth * (@columns - 1));
+}
+
+// The Grid
+#grid {
+
+ .core (@gridColumnWidth, @gridGutterWidth) {
+
+ .spanX (@index) when (@index > 0) {
+ .span@{index} { .span(@index); }
+ .spanX(@index - 1);
+ }
+ .spanX (0) {}
+
+ .offsetX (@index) when (@index > 0) {
+ .offset@{index} { .offset(@index); }
+ .offsetX(@index - 1);
+ }
+ .offsetX (0) {}
+
+ .offset (@columns) {
+ margin-left: (@gridColumnWidth * @columns) + (@gridGutterWidth * (@columns + 1));
+ }
+
+ .span (@columns) {
+ width: (@gridColumnWidth * @columns) + (@gridGutterWidth * (@columns - 1));
+ }
+
+ .row {
+ margin-left: @gridGutterWidth * -1;
+ .clearfix();
+ }
+
+ [class*="span"] {
+ float: left;
+ min-height: 1px; // prevent collapsing columns
+ margin-left: @gridGutterWidth;
+ }
+
+ // Set the container width, and override it for fixed navbars in media queries
+ .container,
+ .navbar-static-top .container,
+ .navbar-fixed-top .container,
+ .navbar-fixed-bottom .container { .span(@gridColumns); }
+
+ // generate .spanX and .offsetX
+ .spanX (@gridColumns);
+ .offsetX (@gridColumns);
+
+ }
+
+ .fluid (@fluidGridColumnWidth, @fluidGridGutterWidth) {
+
+ .spanX (@index) when (@index > 0) {
+ .span@{index} { .span(@index); }
+ .spanX(@index - 1);
+ }
+ .spanX (0) {}
+
+ .offsetX (@index) when (@index > 0) {
+ .offset@{index} { .offset(@index); }
+ .offset@{index}:first-child { .offsetFirstChild(@index); }
+ .offsetX(@index - 1);
+ }
+ .offsetX (0) {}
+
+ .offset (@columns) {
+ margin-left: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1)) + (@fluidGridGutterWidth*2);
+ *margin-left: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1)) - (.5 / @gridRowWidth * 100 * 1%) + (@fluidGridGutterWidth*2) - (.5 / @gridRowWidth * 100 * 1%);
+ }
+
+ .offsetFirstChild (@columns) {
+ margin-left: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1)) + (@fluidGridGutterWidth);
+ *margin-left: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1)) - (.5 / @gridRowWidth * 100 * 1%) + @fluidGridGutterWidth - (.5 / @gridRowWidth * 100 * 1%);
+ }
+
+ .span (@columns) {
+ width: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1));
+ *width: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1)) - (.5 / @gridRowWidth * 100 * 1%);
+ }
+
+ .row-fluid {
+ width: 100%;
+ .clearfix();
+ [class*="span"] {
+ .input-block-level();
+ float: left;
+ margin-left: @fluidGridGutterWidth;
+ *margin-left: @fluidGridGutterWidth - (.5 / @gridRowWidth * 100 * 1%);
+ }
+ [class*="span"]:first-child {
+ margin-left: 0;
+ }
+
+ // Space grid-sized controls properly if multiple per line
+ .controls-row [class*="span"] + [class*="span"] {
+ margin-left: @fluidGridGutterWidth;
+ }
+
+ // generate .spanX and .offsetX
+ .spanX (@gridColumns);
+ .offsetX (@gridColumns);
+ }
+
+ }
+
+ .input(@gridColumnWidth, @gridGutterWidth) {
+
+ .spanX (@index) when (@index > 0) {
+ input.span@{index}, textarea.span@{index}, .uneditable-input.span@{index} { .span(@index); }
+ .spanX(@index - 1);
+ }
+ .spanX (0) {}
+
+ .span(@columns) {
+ width: ((@gridColumnWidth) * @columns) + (@gridGutterWidth * (@columns - 1)) - 14;
+ }
+
+ input,
+ textarea,
+ .uneditable-input {
+ margin-left: 0; // override margin-left from core grid system
+ }
+
+ // Space grid-sized controls properly if multiple per line
+ .controls-row [class*="span"] + [class*="span"] {
+ margin-left: @gridGutterWidth;
+ }
+
+ // generate .spanX
+ .spanX (@gridColumns);
+
+ }
+}
diff --git a/library/font_awesome/src/assets/less/bootstrap-2.3.2/modals.less b/library/font_awesome/src/assets/less/bootstrap-2.3.2/modals.less
new file mode 100755
index 000000000..8e272d409
--- /dev/null
+++ b/library/font_awesome/src/assets/less/bootstrap-2.3.2/modals.less
@@ -0,0 +1,95 @@
+//
+// Modals
+// --------------------------------------------------
+
+// Background
+.modal-backdrop {
+ position: fixed;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: @zindexModalBackdrop;
+ background-color: @black;
+ // Fade for backdrop
+ &.fade { opacity: 0; }
+}
+
+.modal-backdrop,
+.modal-backdrop.fade.in {
+ .opacity(80);
+}
+
+// Base modal
+.modal {
+ position: fixed;
+ top: 10%;
+ left: 50%;
+ z-index: @zindexModal;
+ width: 560px;
+ margin-left: -280px;
+ background-color: @white;
+ border: 1px solid #999;
+ border: 1px solid rgba(0,0,0,.3);
+ *border: 1px solid #999; /* IE6-7 */
+ .border-radius(6px);
+ .box-shadow(0 3px 7px rgba(0,0,0,0.3));
+ .background-clip(padding-box);
+ // Remove focus outline from opened modal
+ outline: none;
+
+ &.fade {
+ .transition(e('opacity .3s linear, top .3s ease-out'));
+ top: -25%;
+ }
+ &.fade.in { top: 10%; }
+}
+.modal-header {
+ padding: 9px 15px;
+ border-bottom: 1px solid #eee;
+ // Close icon
+ .close { margin-top: 2px; }
+ // Heading
+ h3 {
+ margin: 0;
+ line-height: 30px;
+ }
+}
+
+// Body (where all modal content resides)
+.modal-body {
+ position: relative;
+ overflow-y: auto;
+ max-height: 400px;
+ padding: 15px;
+}
+// Remove bottom margin if need be
+.modal-form {
+ margin-bottom: 0;
+}
+
+// Footer (for actions)
+.modal-footer {
+ padding: 14px 15px 15px;
+ margin-bottom: 0;
+ text-align: right; // right align buttons
+ background-color: #f5f5f5;
+ border-top: 1px solid #ddd;
+ .border-radius(0 0 6px 6px);
+ .box-shadow(inset 0 1px 0 @white);
+ .clearfix(); // clear it in case folks use .pull-* classes on buttons
+
+ // Properly space out buttons
+ .btn + .btn {
+ margin-left: 5px;
+ margin-bottom: 0; // account for input[type="submit"] which gets the bottom margin like all other inputs
+ }
+ // but override that for button groups
+ .btn-group .btn + .btn {
+ margin-left: -1px;
+ }
+ // and override it for block buttons as well
+ .btn-block + .btn-block {
+ margin-left: 0;
+ }
+}
diff --git a/library/font_awesome/src/assets/less/bootstrap-2.3.2/navbar.less b/library/font_awesome/src/assets/less/bootstrap-2.3.2/navbar.less
new file mode 100755
index 000000000..93d09bcad
--- /dev/null
+++ b/library/font_awesome/src/assets/less/bootstrap-2.3.2/navbar.less
@@ -0,0 +1,497 @@
+//
+// Navbars (Redux)
+// --------------------------------------------------
+
+
+// COMMON STYLES
+// -------------
+
+// Base class and wrapper
+.navbar {
+ overflow: visible;
+ margin-bottom: @baseLineHeight;
+
+ // Fix for IE7's bad z-indexing so dropdowns don't appear below content that follows the navbar
+ *position: relative;
+ *z-index: 2;
+}
+
+// Inner for background effects
+// Gradient is applied to its own element because overflow visible is not honored by IE when filter is present
+.navbar-inner {
+ min-height: @navbarHeight;
+ padding-left: 20px;
+ padding-right: 20px;
+ #gradient > .vertical(@navbarBackgroundHighlight, @navbarBackground);
+ border: 1px solid @navbarBorder;
+ .border-radius(@baseBorderRadius);
+ .box-shadow(0 1px 4px rgba(0,0,0,.065));
+
+ // Prevent floats from breaking the navbar
+ .clearfix();
+}
+
+// Set width to auto for default container
+// We then reset it for fixed navbars in the #gridSystem mixin
+.navbar .container {
+ width: auto;
+}
+
+// Override the default collapsed state
+.nav-collapse.collapse {
+ height: auto;
+ overflow: visible;
+}
+
+
+// Brand: website or project name
+// -------------------------
+.navbar .brand {
+ float: left;
+ display: block;
+ // Vertically center the text given @navbarHeight
+ padding: ((@navbarHeight - @baseLineHeight) / 2) 20px ((@navbarHeight - @baseLineHeight) / 2);
+ margin-left: -20px; // negative indent to left-align the text down the page
+ font-size: 20px;
+ font-weight: 200;
+ color: @navbarBrandColor;
+ text-shadow: 0 1px 0 @navbarBackgroundHighlight;
+ &:hover,
+ &:focus {
+ text-decoration: none;
+ }
+}
+
+// Plain text in topbar
+// -------------------------
+.navbar-text {
+ margin-bottom: 0;
+ line-height: @navbarHeight;
+ color: @navbarText;
+}
+
+// Janky solution for now to account for links outside the .nav
+// -------------------------
+.navbar-link {
+ color: @navbarLinkColor;
+ &:hover,
+ &:focus {
+ color: @navbarLinkColorHover;
+ }
+}
+
+// Dividers in navbar
+// -------------------------
+.navbar .divider-vertical {
+ height: @navbarHeight;
+ margin: 0 9px;
+ border-left: 1px solid @navbarBackground;
+ border-right: 1px solid @navbarBackgroundHighlight;
+}
+
+// Buttons in navbar
+// -------------------------
+.navbar .btn,
+.navbar .btn-group {
+ .navbarVerticalAlign(30px); // Vertically center in navbar
+}
+.navbar .btn-group .btn,
+.navbar .input-prepend .btn,
+.navbar .input-append .btn,
+.navbar .input-prepend .btn-group,
+.navbar .input-append .btn-group {
+ margin-top: 0; // then undo the margin here so we don't accidentally double it
+}
+
+// Navbar forms
+// -------------------------
+.navbar-form {
+ margin-bottom: 0; // remove default bottom margin
+ .clearfix();
+ input,
+ select,
+ .radio,
+ .checkbox {
+ .navbarVerticalAlign(30px); // Vertically center in navbar
+ }
+ input,
+ select,
+ .btn {
+ display: inline-block;
+ margin-bottom: 0;
+ }
+ input[type="image"],
+ input[type="checkbox"],
+ input[type="radio"] {
+ margin-top: 3px;
+ }
+ .input-append,
+ .input-prepend {
+ margin-top: 5px;
+ white-space: nowrap; // preven two items from separating within a .navbar-form that has .pull-left
+ input {
+ margin-top: 0; // remove the margin on top since it's on the parent
+ }
+ }
+}
+
+// Navbar search
+// -------------------------
+.navbar-search {
+ position: relative;
+ float: left;
+ .navbarVerticalAlign(30px); // Vertically center in navbar
+ margin-bottom: 0;
+ .search-query {
+ margin-bottom: 0;
+ padding: 4px 14px;
+ #font > .sans-serif(13px, normal, 1);
+ .border-radius(15px); // redeclare because of specificity of the type attribute
+ }
+}
+
+
+
+// Static navbar
+// -------------------------
+
+.navbar-static-top {
+ position: static;
+ margin-bottom: 0; // remove 18px margin for default navbar
+ .navbar-inner {
+ .border-radius(0);
+ }
+}
+
+
+
+// Fixed navbar
+// -------------------------
+
+// Shared (top/bottom) styles
+.navbar-fixed-top,
+.navbar-fixed-bottom {
+ position: fixed;
+ right: 0;
+ left: 0;
+ z-index: @zindexFixedNavbar;
+ margin-bottom: 0; // remove 18px margin for default navbar
+}
+.navbar-fixed-top .navbar-inner,
+.navbar-static-top .navbar-inner {
+ border-width: 0 0 1px;
+}
+.navbar-fixed-bottom .navbar-inner {
+ border-width: 1px 0 0;
+}
+.navbar-fixed-top .navbar-inner,
+.navbar-fixed-bottom .navbar-inner {
+ padding-left: 0;
+ padding-right: 0;
+ .border-radius(0);
+}
+
+// Reset container width
+// Required here as we reset the width earlier on and the grid mixins don't override early enough
+.navbar-static-top .container,
+.navbar-fixed-top .container,
+.navbar-fixed-bottom .container {
+ #grid > .core > .span(@gridColumns);
+}
+
+// Fixed to top
+.navbar-fixed-top {
+ top: 0;
+}
+.navbar-fixed-top,
+.navbar-static-top {
+ .navbar-inner {
+ .box-shadow(~"0 1px 10px rgba(0,0,0,.1)");
+ }
+}
+
+// Fixed to bottom
+.navbar-fixed-bottom {
+ bottom: 0;
+ .navbar-inner {
+ .box-shadow(~"0 -1px 10px rgba(0,0,0,.1)");
+ }
+}
+
+
+
+// NAVIGATION
+// ----------
+
+.navbar .nav {
+ position: relative;
+ left: 0;
+ display: block;
+ float: left;
+ margin: 0 10px 0 0;
+}
+.navbar .nav.pull-right {
+ float: right; // redeclare due to specificity
+ margin-right: 0; // remove margin on float right nav
+}
+.navbar .nav > li {
+ float: left;
+}
+
+// Links
+.navbar .nav > li > a {
+ float: none;
+ // Vertically center the text given @navbarHeight
+ padding: ((@navbarHeight - @baseLineHeight) / 2) 15px ((@navbarHeight - @baseLineHeight) / 2);
+ color: @navbarLinkColor;
+ text-decoration: none;
+ text-shadow: 0 1px 0 @navbarBackgroundHighlight;
+}
+.navbar .nav .dropdown-toggle .caret {
+ margin-top: 8px;
+}
+
+// Hover/focus
+.navbar .nav > li > a:focus,
+.navbar .nav > li > a:hover {
+ background-color: @navbarLinkBackgroundHover; // "transparent" is default to differentiate :hover/:focus from .active
+ color: @navbarLinkColorHover;
+ text-decoration: none;
+}
+
+// Active nav items
+.navbar .nav > .active > a,
+.navbar .nav > .active > a:hover,
+.navbar .nav > .active > a:focus {
+ color: @navbarLinkColorActive;
+ text-decoration: none;
+ background-color: @navbarLinkBackgroundActive;
+ .box-shadow(inset 0 3px 8px rgba(0,0,0,.125));
+}
+
+// Navbar button for toggling navbar items in responsive layouts
+// These definitions need to come after '.navbar .btn'
+.navbar .btn-navbar {
+ display: none;
+ float: right;
+ padding: 7px 10px;
+ margin-left: 5px;
+ margin-right: 5px;
+ .buttonBackground(darken(@navbarBackgroundHighlight, 5%), darken(@navbarBackground, 5%));
+ .box-shadow(~"inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075)");
+}
+.navbar .btn-navbar .icon-bar {
+ display: block;
+ width: 18px;
+ height: 2px;
+ background-color: #f5f5f5;
+ .border-radius(1px);
+ .box-shadow(0 1px 0 rgba(0,0,0,.25));
+}
+.btn-navbar .icon-bar + .icon-bar {
+ margin-top: 3px;
+}
+
+
+
+// Dropdown menus
+// --------------
+
+// Menu position and menu carets
+.navbar .nav > li > .dropdown-menu {
+ &:before {
+ content: '';
+ display: inline-block;
+ border-left: 7px solid transparent;
+ border-right: 7px solid transparent;
+ border-bottom: 7px solid #ccc;
+ border-bottom-color: @dropdownBorder;
+ position: absolute;
+ top: -7px;
+ left: 9px;
+ }
+ &:after {
+ content: '';
+ display: inline-block;
+ border-left: 6px solid transparent;
+ border-right: 6px solid transparent;
+ border-bottom: 6px solid @dropdownBackground;
+ position: absolute;
+ top: -6px;
+ left: 10px;
+ }
+}
+// Menu position and menu caret support for dropups via extra dropup class
+.navbar-fixed-bottom .nav > li > .dropdown-menu {
+ &:before {
+ border-top: 7px solid #ccc;
+ border-top-color: @dropdownBorder;
+ border-bottom: 0;
+ bottom: -7px;
+ top: auto;
+ }
+ &:after {
+ border-top: 6px solid @dropdownBackground;
+ border-bottom: 0;
+ bottom: -6px;
+ top: auto;
+ }
+}
+
+// Caret should match text color on hover/focus
+.navbar .nav li.dropdown > a:hover .caret,
+.navbar .nav li.dropdown > a:focus .caret {
+ border-top-color: @navbarLinkColorHover;
+ border-bottom-color: @navbarLinkColorHover;
+}
+
+// Remove background color from open dropdown
+.navbar .nav li.dropdown.open > .dropdown-toggle,
+.navbar .nav li.dropdown.active > .dropdown-toggle,
+.navbar .nav li.dropdown.open.active > .dropdown-toggle {
+ background-color: @navbarLinkBackgroundActive;
+ color: @navbarLinkColorActive;
+}
+.navbar .nav li.dropdown > .dropdown-toggle .caret {
+ border-top-color: @navbarLinkColor;
+ border-bottom-color: @navbarLinkColor;
+}
+.navbar .nav li.dropdown.open > .dropdown-toggle .caret,
+.navbar .nav li.dropdown.active > .dropdown-toggle .caret,
+.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret {
+ border-top-color: @navbarLinkColorActive;
+ border-bottom-color: @navbarLinkColorActive;
+}
+
+// Right aligned menus need alt position
+.navbar .pull-right > li > .dropdown-menu,
+.navbar .nav > li > .dropdown-menu.pull-right {
+ left: auto;
+ right: 0;
+ &:before {
+ left: auto;
+ right: 12px;
+ }
+ &:after {
+ left: auto;
+ right: 13px;
+ }
+ .dropdown-menu {
+ left: auto;
+ right: 100%;
+ margin-left: 0;
+ margin-right: -1px;
+ .border-radius(6px 0 6px 6px);
+ }
+}
+
+
+// Inverted navbar
+// -------------------------
+
+.navbar-inverse {
+
+ .navbar-inner {
+ #gradient > .vertical(@navbarInverseBackgroundHighlight, @navbarInverseBackground);
+ border-color: @navbarInverseBorder;
+ }
+
+ .brand,
+ .nav > li > a {
+ color: @navbarInverseLinkColor;
+ text-shadow: 0 -1px 0 rgba(0,0,0,.25);
+ &:hover,
+ &:focus {
+ color: @navbarInverseLinkColorHover;
+ }
+ }
+
+ .brand {
+ color: @navbarInverseBrandColor;
+ }
+
+ .navbar-text {
+ color: @navbarInverseText;
+ }
+
+ .nav > li > a:focus,
+ .nav > li > a:hover {
+ background-color: @navbarInverseLinkBackgroundHover;
+ color: @navbarInverseLinkColorHover;
+ }
+
+ .nav .active > a,
+ .nav .active > a:hover,
+ .nav .active > a:focus {
+ color: @navbarInverseLinkColorActive;
+ background-color: @navbarInverseLinkBackgroundActive;
+ }
+
+ // Inline text links
+ .navbar-link {
+ color: @navbarInverseLinkColor;
+ &:hover,
+ &:focus {
+ color: @navbarInverseLinkColorHover;
+ }
+ }
+
+ // Dividers in navbar
+ .divider-vertical {
+ border-left-color: @navbarInverseBackground;
+ border-right-color: @navbarInverseBackgroundHighlight;
+ }
+
+ // Dropdowns
+ .nav li.dropdown.open > .dropdown-toggle,
+ .nav li.dropdown.active > .dropdown-toggle,
+ .nav li.dropdown.open.active > .dropdown-toggle {
+ background-color: @navbarInverseLinkBackgroundActive;
+ color: @navbarInverseLinkColorActive;
+ }
+ .nav li.dropdown > a:hover .caret,
+ .nav li.dropdown > a:focus .caret {
+ border-top-color: @navbarInverseLinkColorActive;
+ border-bottom-color: @navbarInverseLinkColorActive;
+ }
+ .nav li.dropdown > .dropdown-toggle .caret {
+ border-top-color: @navbarInverseLinkColor;
+ border-bottom-color: @navbarInverseLinkColor;
+ }
+ .nav li.dropdown.open > .dropdown-toggle .caret,
+ .nav li.dropdown.active > .dropdown-toggle .caret,
+ .nav li.dropdown.open.active > .dropdown-toggle .caret {
+ border-top-color: @navbarInverseLinkColorActive;
+ border-bottom-color: @navbarInverseLinkColorActive;
+ }
+
+ // Navbar search
+ .navbar-search {
+ .search-query {
+ color: @white;
+ background-color: @navbarInverseSearchBackground;
+ border-color: @navbarInverseSearchBorder;
+ .box-shadow(~"inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15)");
+ .transition(none);
+ .placeholder(@navbarInverseSearchPlaceholderColor);
+
+ // Focus states (we use .focused since IE7-8 and down doesn't support :focus)
+ &:focus,
+ &.focused {
+ padding: 5px 15px;
+ color: @grayDark;
+ text-shadow: 0 1px 0 @white;
+ background-color: @navbarInverseSearchBackgroundFocus;
+ border: 0;
+ .box-shadow(0 0 3px rgba(0,0,0,.15));
+ outline: 0;
+ }
+ }
+ }
+
+ // Navbar collapse button
+ .btn-navbar {
+ .buttonBackground(darken(@navbarInverseBackgroundHighlight, 5%), darken(@navbarInverseBackground, 5%));
+ }
+
+}
diff --git a/library/font_awesome/src/assets/less/bootstrap-2.3.2/navs.less b/library/font_awesome/src/assets/less/bootstrap-2.3.2/navs.less
new file mode 100755
index 000000000..01cd805bd
--- /dev/null
+++ b/library/font_awesome/src/assets/less/bootstrap-2.3.2/navs.less
@@ -0,0 +1,409 @@
+//
+// Navs
+// --------------------------------------------------
+
+
+// BASE CLASS
+// ----------
+
+.nav {
+ margin-left: 0;
+ margin-bottom: @baseLineHeight;
+ list-style: none;
+}
+
+// Make links block level
+.nav > li > a {
+ display: block;
+}
+.nav > li > a:hover,
+.nav > li > a:focus {
+ text-decoration: none;
+ background-color: @grayLighter;
+}
+
+// Prevent IE8 from misplacing imgs
+// See https://github.com/h5bp/html5-boilerplate/issues/984#issuecomment-3985989
+.nav > li > a > img {
+ max-width: none;
+}
+
+// Redeclare pull classes because of specifity
+.nav > .pull-right {
+ float: right;
+}
+
+// Nav headers (for dropdowns and lists)
+.nav-header {
+ display: block;
+ padding: 3px 15px;
+ font-size: 11px;
+ font-weight: bold;
+ line-height: @baseLineHeight;
+ color: @grayLight;
+ text-shadow: 0 1px 0 rgba(255,255,255,.5);
+ text-transform: uppercase;
+}
+// Space them out when they follow another list item (link)
+.nav li + .nav-header {
+ margin-top: 9px;
+}
+
+
+
+// NAV LIST
+// --------
+
+.nav-list {
+ padding-left: 15px;
+ padding-right: 15px;
+ margin-bottom: 0;
+}
+.nav-list > li > a,
+.nav-list .nav-header {
+ margin-left: -15px;
+ margin-right: -15px;
+ text-shadow: 0 1px 0 rgba(255,255,255,.5);
+}
+.nav-list > li > a {
+ padding: 3px 15px;
+}
+.nav-list > .active > a,
+.nav-list > .active > a:hover,
+.nav-list > .active > a:focus {
+ color: @white;
+ text-shadow: 0 -1px 0 rgba(0,0,0,.2);
+ background-color: @linkColor;
+}
+.nav-list [class^="icon-"],
+.nav-list [class*=" icon-"] {
+ margin-right: 2px;
+}
+// Dividers (basically an hr) within the dropdown
+.nav-list .divider {
+ .nav-divider();
+}
+
+
+
+// TABS AND PILLS
+// -------------
+
+// Common styles
+.nav-tabs,
+.nav-pills {
+ .clearfix();
+}
+.nav-tabs > li,
+.nav-pills > li {
+ float: left;
+}
+.nav-tabs > li > a,
+.nav-pills > li > a {
+ padding-right: 12px;
+ padding-left: 12px;
+ margin-right: 2px;
+ line-height: 14px; // keeps the overall height an even number
+}
+
+// TABS
+// ----
+
+// Give the tabs something to sit on
+.nav-tabs {
+ border-bottom: 1px solid #ddd;
+}
+// Make the list-items overlay the bottom border
+.nav-tabs > li {
+ margin-bottom: -1px;
+}
+// Actual tabs (as links)
+.nav-tabs > li > a {
+ padding-top: 8px;
+ padding-bottom: 8px;
+ line-height: @baseLineHeight;
+ border: 1px solid transparent;
+ .border-radius(4px 4px 0 0);
+ &:hover,
+ &:focus {
+ border-color: @grayLighter @grayLighter #ddd;
+ }
+}
+// Active state, and it's :hover/:focus to override normal :hover/:focus
+.nav-tabs > .active > a,
+.nav-tabs > .active > a:hover,
+.nav-tabs > .active > a:focus {
+ color: @gray;
+ background-color: @bodyBackground;
+ border: 1px solid #ddd;
+ border-bottom-color: transparent;
+ cursor: default;
+}
+
+
+// PILLS
+// -----
+
+// Links rendered as pills
+.nav-pills > li > a {
+ padding-top: 8px;
+ padding-bottom: 8px;
+ margin-top: 2px;
+ margin-bottom: 2px;
+ .border-radius(5px);
+}
+
+// Active state
+.nav-pills > .active > a,
+.nav-pills > .active > a:hover,
+.nav-pills > .active > a:focus {
+ color: @white;
+ background-color: @linkColor;
+}
+
+
+
+// STACKED NAV
+// -----------
+
+// Stacked tabs and pills
+.nav-stacked > li {
+ float: none;
+}
+.nav-stacked > li > a {
+ margin-right: 0; // no need for the gap between nav items
+}
+
+// Tabs
+.nav-tabs.nav-stacked {
+ border-bottom: 0;
+}
+.nav-tabs.nav-stacked > li > a {
+ border: 1px solid #ddd;
+ .border-radius(0);
+}
+.nav-tabs.nav-stacked > li:first-child > a {
+ .border-top-radius(4px);
+}
+.nav-tabs.nav-stacked > li:last-child > a {
+ .border-bottom-radius(4px);
+}
+.nav-tabs.nav-stacked > li > a:hover,
+.nav-tabs.nav-stacked > li > a:focus {
+ border-color: #ddd;
+ z-index: 2;
+}
+
+// Pills
+.nav-pills.nav-stacked > li > a {
+ margin-bottom: 3px;
+}
+.nav-pills.nav-stacked > li:last-child > a {
+ margin-bottom: 1px; // decrease margin to match sizing of stacked tabs
+}
+
+
+
+// DROPDOWNS
+// ---------
+
+.nav-tabs .dropdown-menu {
+ .border-radius(0 0 6px 6px); // remove the top rounded corners here since there is a hard edge above the menu
+}
+.nav-pills .dropdown-menu {
+ .border-radius(6px); // make rounded corners match the pills
+}
+
+// Default dropdown links
+// -------------------------
+// Make carets use linkColor to start
+.nav .dropdown-toggle .caret {
+ border-top-color: @linkColor;
+ border-bottom-color: @linkColor;
+ margin-top: 6px;
+}
+.nav .dropdown-toggle:hover .caret,
+.nav .dropdown-toggle:focus .caret {
+ border-top-color: @linkColorHover;
+ border-bottom-color: @linkColorHover;
+}
+/* move down carets for tabs */
+.nav-tabs .dropdown-toggle .caret {
+ margin-top: 8px;
+}
+
+// Active dropdown links
+// -------------------------
+.nav .active .dropdown-toggle .caret {
+ border-top-color: #fff;
+ border-bottom-color: #fff;
+}
+.nav-tabs .active .dropdown-toggle .caret {
+ border-top-color: @gray;
+ border-bottom-color: @gray;
+}
+
+// Active:hover/:focus dropdown links
+// -------------------------
+.nav > .dropdown.active > a:hover,
+.nav > .dropdown.active > a:focus {
+ cursor: pointer;
+}
+
+// Open dropdowns
+// -------------------------
+.nav-tabs .open .dropdown-toggle,
+.nav-pills .open .dropdown-toggle,
+.nav > li.dropdown.open.active > a:hover,
+.nav > li.dropdown.open.active > a:focus {
+ color: @white;
+ background-color: @grayLight;
+ border-color: @grayLight;
+}
+.nav li.dropdown.open .caret,
+.nav li.dropdown.open.active .caret,
+.nav li.dropdown.open a:hover .caret,
+.nav li.dropdown.open a:focus .caret {
+ border-top-color: @white;
+ border-bottom-color: @white;
+ .opacity(100);
+}
+
+// Dropdowns in stacked tabs
+.tabs-stacked .open > a:hover,
+.tabs-stacked .open > a:focus {
+ border-color: @grayLight;
+}
+
+
+
+// TABBABLE
+// --------
+
+
+// COMMON STYLES
+// -------------
+
+// Clear any floats
+.tabbable {
+ .clearfix();
+}
+.tab-content {
+ overflow: auto; // prevent content from running below tabs
+}
+
+// Remove border on bottom, left, right
+.tabs-below > .nav-tabs,
+.tabs-right > .nav-tabs,
+.tabs-left > .nav-tabs {
+ border-bottom: 0;
+}
+
+// Show/hide tabbable areas
+.tab-content > .tab-pane,
+.pill-content > .pill-pane {
+ display: none;
+}
+.tab-content > .active,
+.pill-content > .active {
+ display: block;
+}
+
+
+// BOTTOM
+// ------
+
+.tabs-below > .nav-tabs {
+ border-top: 1px solid #ddd;
+}
+.tabs-below > .nav-tabs > li {
+ margin-top: -1px;
+ margin-bottom: 0;
+}
+.tabs-below > .nav-tabs > li > a {
+ .border-radius(0 0 4px 4px);
+ &:hover,
+ &:focus {
+ border-bottom-color: transparent;
+ border-top-color: #ddd;
+ }
+}
+.tabs-below > .nav-tabs > .active > a,
+.tabs-below > .nav-tabs > .active > a:hover,
+.tabs-below > .nav-tabs > .active > a:focus {
+ border-color: transparent #ddd #ddd #ddd;
+}
+
+// LEFT & RIGHT
+// ------------
+
+// Common styles
+.tabs-left > .nav-tabs > li,
+.tabs-right > .nav-tabs > li {
+ float: none;
+}
+.tabs-left > .nav-tabs > li > a,
+.tabs-right > .nav-tabs > li > a {
+ min-width: 74px;
+ margin-right: 0;
+ margin-bottom: 3px;
+}
+
+// Tabs on the left
+.tabs-left > .nav-tabs {
+ float: left;
+ margin-right: 19px;
+ border-right: 1px solid #ddd;
+}
+.tabs-left > .nav-tabs > li > a {
+ margin-right: -1px;
+ .border-radius(4px 0 0 4px);
+}
+.tabs-left > .nav-tabs > li > a:hover,
+.tabs-left > .nav-tabs > li > a:focus {
+ border-color: @grayLighter #ddd @grayLighter @grayLighter;
+}
+.tabs-left > .nav-tabs .active > a,
+.tabs-left > .nav-tabs .active > a:hover,
+.tabs-left > .nav-tabs .active > a:focus {
+ border-color: #ddd transparent #ddd #ddd;
+ *border-right-color: @white;
+}
+
+// Tabs on the right
+.tabs-right > .nav-tabs {
+ float: right;
+ margin-left: 19px;
+ border-left: 1px solid #ddd;
+}
+.tabs-right > .nav-tabs > li > a {
+ margin-left: -1px;
+ .border-radius(0 4px 4px 0);
+}
+.tabs-right > .nav-tabs > li > a:hover,
+.tabs-right > .nav-tabs > li > a:focus {
+ border-color: @grayLighter @grayLighter @grayLighter #ddd;
+}
+.tabs-right > .nav-tabs .active > a,
+.tabs-right > .nav-tabs .active > a:hover,
+.tabs-right > .nav-tabs .active > a:focus {
+ border-color: #ddd #ddd #ddd transparent;
+ *border-left-color: @white;
+}
+
+
+
+// DISABLED STATES
+// ---------------
+
+// Gray out text
+.nav > .disabled > a {
+ color: @grayLight;
+}
+// Nuke hover/focus effects
+.nav > .disabled > a:hover,
+.nav > .disabled > a:focus {
+ text-decoration: none;
+ background-color: transparent;
+ cursor: default;
+}
diff --git a/library/font_awesome/src/assets/less/bootstrap-2.3.2/pager.less b/library/font_awesome/src/assets/less/bootstrap-2.3.2/pager.less
new file mode 100755
index 000000000..147618829
--- /dev/null
+++ b/library/font_awesome/src/assets/less/bootstrap-2.3.2/pager.less
@@ -0,0 +1,43 @@
+//
+// Pager pagination
+// --------------------------------------------------
+
+
+.pager {
+ margin: @baseLineHeight 0;
+ list-style: none;
+ text-align: center;
+ .clearfix();
+}
+.pager li {
+ display: inline;
+}
+.pager li > a,
+.pager li > span {
+ display: inline-block;
+ padding: 5px 14px;
+ background-color: #fff;
+ border: 1px solid #ddd;
+ .border-radius(15px);
+}
+.pager li > a:hover,
+.pager li > a:focus {
+ text-decoration: none;
+ background-color: #f5f5f5;
+}
+.pager .next > a,
+.pager .next > span {
+ float: right;
+}
+.pager .previous > a,
+.pager .previous > span {
+ float: left;
+}
+.pager .disabled > a,
+.pager .disabled > a:hover,
+.pager .disabled > a:focus,
+.pager .disabled > span {
+ color: @grayLight;
+ background-color: #fff;
+ cursor: default;
+} \ No newline at end of file
diff --git a/library/font_awesome/src/assets/less/bootstrap-2.3.2/pagination.less b/library/font_awesome/src/assets/less/bootstrap-2.3.2/pagination.less
new file mode 100755
index 000000000..a789db2d2
--- /dev/null
+++ b/library/font_awesome/src/assets/less/bootstrap-2.3.2/pagination.less
@@ -0,0 +1,123 @@
+//
+// Pagination (multiple pages)
+// --------------------------------------------------
+
+// Space out pagination from surrounding content
+.pagination {
+ margin: @baseLineHeight 0;
+}
+
+.pagination ul {
+ // Allow for text-based alignment
+ display: inline-block;
+ .ie7-inline-block();
+ // Reset default ul styles
+ margin-left: 0;
+ margin-bottom: 0;
+ // Visuals
+ .border-radius(@baseBorderRadius);
+ .box-shadow(0 1px 2px rgba(0,0,0,.05));
+}
+.pagination ul > li {
+ display: inline; // Remove list-style and block-level defaults
+}
+.pagination ul > li > a,
+.pagination ul > li > span {
+ float: left; // Collapse white-space
+ padding: 4px 12px;
+ line-height: @baseLineHeight;
+ text-decoration: none;
+ background-color: @paginationBackground;
+ border: 1px solid @paginationBorder;
+ border-left-width: 0;
+}
+.pagination ul > li > a:hover,
+.pagination ul > li > a:focus,
+.pagination ul > .active > a,
+.pagination ul > .active > span {
+ background-color: @paginationActiveBackground;
+}
+.pagination ul > .active > a,
+.pagination ul > .active > span {
+ color: @grayLight;
+ cursor: default;
+}
+.pagination ul > .disabled > span,
+.pagination ul > .disabled > a,
+.pagination ul > .disabled > a:hover,
+.pagination ul > .disabled > a:focus {
+ color: @grayLight;
+ background-color: transparent;
+ cursor: default;
+}
+.pagination ul > li:first-child > a,
+.pagination ul > li:first-child > span {
+ border-left-width: 1px;
+ .border-left-radius(@baseBorderRadius);
+}
+.pagination ul > li:last-child > a,
+.pagination ul > li:last-child > span {
+ .border-right-radius(@baseBorderRadius);
+}
+
+
+// Alignment
+// --------------------------------------------------
+
+.pagination-centered {
+ text-align: center;
+}
+.pagination-right {
+ text-align: right;
+}
+
+
+// Sizing
+// --------------------------------------------------
+
+// Large
+.pagination-large {
+ ul > li > a,
+ ul > li > span {
+ padding: @paddingLarge;
+ font-size: @fontSizeLarge;
+ }
+ ul > li:first-child > a,
+ ul > li:first-child > span {
+ .border-left-radius(@borderRadiusLarge);
+ }
+ ul > li:last-child > a,
+ ul > li:last-child > span {
+ .border-right-radius(@borderRadiusLarge);
+ }
+}
+
+// Small and mini
+.pagination-mini,
+.pagination-small {
+ ul > li:first-child > a,
+ ul > li:first-child > span {
+ .border-left-radius(@borderRadiusSmall);
+ }
+ ul > li:last-child > a,
+ ul > li:last-child > span {
+ .border-right-radius(@borderRadiusSmall);
+ }
+}
+
+// Small
+.pagination-small {
+ ul > li > a,
+ ul > li > span {
+ padding: @paddingSmall;
+ font-size: @fontSizeSmall;
+ }
+}
+// Mini
+.pagination-mini {
+ ul > li > a,
+ ul > li > span {
+ padding: @paddingMini;
+ font-size: @fontSizeMini;
+ }
+}
diff --git a/library/font_awesome/src/assets/less/bootstrap-2.3.2/popovers.less b/library/font_awesome/src/assets/less/bootstrap-2.3.2/popovers.less
new file mode 100755
index 000000000..aae35c8cd
--- /dev/null
+++ b/library/font_awesome/src/assets/less/bootstrap-2.3.2/popovers.less
@@ -0,0 +1,133 @@
+//
+// Popovers
+// --------------------------------------------------
+
+
+.popover {
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: @zindexPopover;
+ display: none;
+ max-width: 276px;
+ padding: 1px;
+ text-align: left; // Reset given new insertion method
+ background-color: @popoverBackground;
+ -webkit-background-clip: padding-box;
+ -moz-background-clip: padding;
+ background-clip: padding-box;
+ border: 1px solid #ccc;
+ border: 1px solid rgba(0,0,0,.2);
+ .border-radius(6px);
+ .box-shadow(0 5px 10px rgba(0,0,0,.2));
+
+ // Overrides for proper insertion
+ white-space: normal;
+
+ // Offset the popover to account for the popover arrow
+ &.top { margin-top: -10px; }
+ &.right { margin-left: 10px; }
+ &.bottom { margin-top: 10px; }
+ &.left { margin-left: -10px; }
+}
+
+.popover-title {
+ margin: 0; // reset heading margin
+ padding: 8px 14px;
+ font-size: 14px;
+ font-weight: normal;
+ line-height: 18px;
+ background-color: @popoverTitleBackground;
+ border-bottom: 1px solid darken(@popoverTitleBackground, 5%);
+ .border-radius(5px 5px 0 0);
+
+ &:empty {
+ display: none;
+ }
+}
+
+.popover-content {
+ padding: 9px 14px;
+}
+
+// Arrows
+//
+// .arrow is outer, .arrow:after is inner
+
+.popover .arrow,
+.popover .arrow:after {
+ position: absolute;
+ display: block;
+ width: 0;
+ height: 0;
+ border-color: transparent;
+ border-style: solid;
+}
+.popover .arrow {
+ border-width: @popoverArrowOuterWidth;
+}
+.popover .arrow:after {
+ border-width: @popoverArrowWidth;
+ content: "";
+}
+
+.popover {
+ &.top .arrow {
+ left: 50%;
+ margin-left: -@popoverArrowOuterWidth;
+ border-bottom-width: 0;
+ border-top-color: #999; // IE8 fallback
+ border-top-color: @popoverArrowOuterColor;
+ bottom: -@popoverArrowOuterWidth;
+ &:after {
+ bottom: 1px;
+ margin-left: -@popoverArrowWidth;
+ border-bottom-width: 0;
+ border-top-color: @popoverArrowColor;
+ }
+ }
+ &.right .arrow {
+ top: 50%;
+ left: -@popoverArrowOuterWidth;
+ margin-top: -@popoverArrowOuterWidth;
+ border-left-width: 0;
+ border-right-color: #999; // IE8 fallback
+ border-right-color: @popoverArrowOuterColor;
+ &:after {
+ left: 1px;
+ bottom: -@popoverArrowWidth;
+ border-left-width: 0;
+ border-right-color: @popoverArrowColor;
+ }
+ }
+ &.bottom .arrow {
+ left: 50%;
+ margin-left: -@popoverArrowOuterWidth;
+ border-top-width: 0;
+ border-bottom-color: #999; // IE8 fallback
+ border-bottom-color: @popoverArrowOuterColor;
+ top: -@popoverArrowOuterWidth;
+ &:after {
+ top: 1px;
+ margin-left: -@popoverArrowWidth;
+ border-top-width: 0;
+ border-bottom-color: @popoverArrowColor;
+ }
+ }
+
+ &.left .arrow {
+ top: 50%;
+ right: -@popoverArrowOuterWidth;
+ margin-top: -@popoverArrowOuterWidth;
+ border-right-width: 0;
+ border-left-color: #999; // IE8 fallback
+ border-left-color: @popoverArrowOuterColor;
+ &:after {
+ right: 1px;
+ border-right-width: 0;
+ border-left-color: @popoverArrowColor;
+ bottom: -@popoverArrowWidth;
+ }
+ }
+
+}
diff --git a/library/font_awesome/src/assets/less/bootstrap-2.3.2/progress-bars.less b/library/font_awesome/src/assets/less/bootstrap-2.3.2/progress-bars.less
new file mode 100755
index 000000000..5e0c3dda0
--- /dev/null
+++ b/library/font_awesome/src/assets/less/bootstrap-2.3.2/progress-bars.less
@@ -0,0 +1,122 @@
+//
+// Progress bars
+// --------------------------------------------------
+
+
+// ANIMATIONS
+// ----------
+
+// Webkit
+@-webkit-keyframes progress-bar-stripes {
+ from { background-position: 40px 0; }
+ to { background-position: 0 0; }
+}
+
+// Firefox
+@-moz-keyframes progress-bar-stripes {
+ from { background-position: 40px 0; }
+ to { background-position: 0 0; }
+}
+
+// IE9
+@-ms-keyframes progress-bar-stripes {
+ from { background-position: 40px 0; }
+ to { background-position: 0 0; }
+}
+
+// Opera
+@-o-keyframes progress-bar-stripes {
+ from { background-position: 0 0; }
+ to { background-position: 40px 0; }
+}
+
+// Spec
+@keyframes progress-bar-stripes {
+ from { background-position: 40px 0; }
+ to { background-position: 0 0; }
+}
+
+
+
+// THE BARS
+// --------
+
+// Outer container
+.progress {
+ overflow: hidden;
+ height: @baseLineHeight;
+ margin-bottom: @baseLineHeight;
+ #gradient > .vertical(#f5f5f5, #f9f9f9);
+ .box-shadow(inset 0 1px 2px rgba(0,0,0,.1));
+ .border-radius(@baseBorderRadius);
+}
+
+// Bar of progress
+.progress .bar {
+ width: 0%;
+ height: 100%;
+ color: @white;
+ float: left;
+ font-size: 12px;
+ text-align: center;
+ text-shadow: 0 -1px 0 rgba(0,0,0,.25);
+ #gradient > .vertical(#149bdf, #0480be);
+ .box-shadow(inset 0 -1px 0 rgba(0,0,0,.15));
+ .box-sizing(border-box);
+ .transition(width .6s ease);
+}
+.progress .bar + .bar {
+ .box-shadow(~"inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15)");
+}
+
+// Striped bars
+.progress-striped .bar {
+ #gradient > .striped(#149bdf);
+ .background-size(40px 40px);
+}
+
+// Call animation for the active one
+.progress.active .bar {
+ -webkit-animation: progress-bar-stripes 2s linear infinite;
+ -moz-animation: progress-bar-stripes 2s linear infinite;
+ -ms-animation: progress-bar-stripes 2s linear infinite;
+ -o-animation: progress-bar-stripes 2s linear infinite;
+ animation: progress-bar-stripes 2s linear infinite;
+}
+
+
+
+// COLORS
+// ------
+
+// Danger (red)
+.progress-danger .bar, .progress .bar-danger {
+ #gradient > .vertical(#ee5f5b, #c43c35);
+}
+.progress-danger.progress-striped .bar, .progress-striped .bar-danger {
+ #gradient > .striped(#ee5f5b);
+}
+
+// Success (green)
+.progress-success .bar, .progress .bar-success {
+ #gradient > .vertical(#62c462, #57a957);
+}
+.progress-success.progress-striped .bar, .progress-striped .bar-success {
+ #gradient > .striped(#62c462);
+}
+
+// Info (teal)
+.progress-info .bar, .progress .bar-info {
+ #gradient > .vertical(#5bc0de, #339bb9);
+}
+.progress-info.progress-striped .bar, .progress-striped .bar-info {
+ #gradient > .striped(#5bc0de);
+}
+
+// Warning (orange)
+.progress-warning .bar, .progress .bar-warning {
+ #gradient > .vertical(lighten(@orange, 15%), @orange);
+}
+.progress-warning.progress-striped .bar, .progress-striped .bar-warning {
+ #gradient > .striped(lighten(@orange, 15%));
+}
diff --git a/library/font_awesome/src/assets/less/bootstrap-2.3.2/reset.less b/library/font_awesome/src/assets/less/bootstrap-2.3.2/reset.less
new file mode 100755
index 000000000..4806bd5e5
--- /dev/null
+++ b/library/font_awesome/src/assets/less/bootstrap-2.3.2/reset.less
@@ -0,0 +1,216 @@
+//
+// Reset CSS
+// Adapted from http://github.com/necolas/normalize.css
+// --------------------------------------------------
+
+
+// Display in IE6-9 and FF3
+// -------------------------
+
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+nav,
+section {
+ display: block;
+}
+
+// Display block in IE6-9 and FF3
+// -------------------------
+
+audio,
+canvas,
+video {
+ display: inline-block;
+ *display: inline;
+ *zoom: 1;
+}
+
+// Prevents modern browsers from displaying 'audio' without controls
+// -------------------------
+
+audio:not([controls]) {
+ display: none;
+}
+
+// Base settings
+// -------------------------
+
+html {
+ font-size: 100%;
+ -webkit-text-size-adjust: 100%;
+ -ms-text-size-adjust: 100%;
+}
+// Focus states
+a:focus {
+ .tab-focus();
+}
+// Hover & Active
+a:hover,
+a:active {
+ outline: 0;
+}
+
+// Prevents sub and sup affecting line-height in all browsers
+// -------------------------
+
+sub,
+sup {
+ position: relative;
+ font-size: 75%;
+ line-height: 0;
+ vertical-align: baseline;
+}
+sup {
+ top: -0.5em;
+}
+sub {
+ bottom: -0.25em;
+}
+
+// Img border in a's and image quality
+// -------------------------
+
+img {
+ /* Responsive images (ensure images don't scale beyond their parents) */
+ max-width: 100%; /* Part 1: Set a maxium relative to the parent */
+ width: auto\9; /* IE7-8 need help adjusting responsive images */
+ height: auto; /* Part 2: Scale the height according to the width, otherwise you get stretching */
+
+ vertical-align: middle;
+ border: 0;
+ -ms-interpolation-mode: bicubic;
+}
+
+// Prevent max-width from affecting Google Maps
+#map_canvas img,
+.google-maps img {
+ max-width: none;
+}
+
+// Forms
+// -------------------------
+
+// Font size in all browsers, margin changes, misc consistency
+button,
+input,
+select,
+textarea {
+ margin: 0;
+ font-size: 100%;
+ vertical-align: middle;
+}
+button,
+input {
+ *overflow: visible; // Inner spacing ie IE6/7
+ line-height: normal; // FF3/4 have !important on line-height in UA stylesheet
+}
+button::-moz-focus-inner,
+input::-moz-focus-inner { // Inner padding and border oddities in FF3/4
+ padding: 0;
+ border: 0;
+}
+button,
+html input[type="button"], // Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` and `video` controls.
+input[type="reset"],
+input[type="submit"] {
+ -webkit-appearance: button; // Corrects inability to style clickable `input` types in iOS.
+ cursor: pointer; // Improves usability and consistency of cursor style between image-type `input` and others.
+}
+label,
+select,
+button,
+input[type="button"],
+input[type="reset"],
+input[type="submit"],
+input[type="radio"],
+input[type="checkbox"] {
+ cursor: pointer; // Improves usability and consistency of cursor style between image-type `input` and others.
+}
+input[type="search"] { // Appearance in Safari/Chrome
+ .box-sizing(content-box);
+ -webkit-appearance: textfield;
+}
+input[type="search"]::-webkit-search-decoration,
+input[type="search"]::-webkit-search-cancel-button {
+ -webkit-appearance: none; // Inner-padding issues in Chrome OSX, Safari 5
+}
+textarea {
+ overflow: auto; // Remove vertical scrollbar in IE6-9
+ vertical-align: top; // Readability and alignment cross-browser
+}
+
+
+// Printing
+// -------------------------
+// Source: https://github.com/h5bp/html5-boilerplate/blob/master/css/main.css
+
+@media print {
+
+ * {
+ text-shadow: none !important;
+ color: #000 !important; // Black prints faster: h5bp.com/s
+ background: transparent !important;
+ box-shadow: none !important;
+ }
+
+ a,
+ a:visited {
+ text-decoration: underline;
+ }
+
+ a[href]:after {
+ content: " (" attr(href) ")";
+ }
+
+ abbr[title]:after {
+ content: " (" attr(title) ")";
+ }
+
+ // Don't show links for images, or javascript/internal links
+ .ir a:after,
+ a[href^="javascript:"]:after,
+ a[href^="#"]:after {
+ content: "";
+ }
+
+ pre,
+ blockquote {
+ border: 1px solid #999;
+ page-break-inside: avoid;
+ }
+
+ thead {
+ display: table-header-group; // h5bp.com/t
+ }
+
+ tr,
+ img {
+ page-break-inside: avoid;
+ }
+
+ img {
+ max-width: 100% !important;
+ }
+
+ @page {
+ margin: 0.5cm;
+ }
+
+ p,
+ h2,
+ h3 {
+ orphans: 3;
+ widows: 3;
+ }
+
+ h2,
+ h3 {
+ page-break-after: avoid;
+ }
+}
diff --git a/library/font_awesome/src/assets/less/bootstrap-2.3.2/responsive-1200px-min.less b/library/font_awesome/src/assets/less/bootstrap-2.3.2/responsive-1200px-min.less
new file mode 100755
index 000000000..4f35ba6ca
--- /dev/null
+++ b/library/font_awesome/src/assets/less/bootstrap-2.3.2/responsive-1200px-min.less
@@ -0,0 +1,28 @@
+//
+// Responsive: Large desktop and up
+// --------------------------------------------------
+
+
+@media (min-width: 1200px) {
+
+ // Fixed grid
+ #grid > .core(@gridColumnWidth1200, @gridGutterWidth1200);
+
+ // Fluid grid
+ #grid > .fluid(@fluidGridColumnWidth1200, @fluidGridGutterWidth1200);
+
+ // Input grid
+ #grid > .input(@gridColumnWidth1200, @gridGutterWidth1200);
+
+ // Thumbnails
+ .thumbnails {
+ margin-left: -@gridGutterWidth1200;
+ }
+ .thumbnails > li {
+ margin-left: @gridGutterWidth1200;
+ }
+ .row-fluid .thumbnails {
+ margin-left: 0;
+ }
+
+}
diff --git a/library/font_awesome/src/assets/less/bootstrap-2.3.2/responsive-767px-max.less b/library/font_awesome/src/assets/less/bootstrap-2.3.2/responsive-767px-max.less
new file mode 100755
index 000000000..128f4ce30
--- /dev/null
+++ b/library/font_awesome/src/assets/less/bootstrap-2.3.2/responsive-767px-max.less
@@ -0,0 +1,193 @@
+//
+// Responsive: Landscape phone to desktop/tablet
+// --------------------------------------------------
+
+
+@media (max-width: 767px) {
+
+ // Padding to set content in a bit
+ body {
+ padding-left: 20px;
+ padding-right: 20px;
+ }
+ // Negative indent the now static "fixed" navbar
+ .navbar-fixed-top,
+ .navbar-fixed-bottom,
+ .navbar-static-top {
+ margin-left: -20px;
+ margin-right: -20px;
+ }
+ // Remove padding on container given explicit padding set on body
+ .container-fluid {
+ padding: 0;
+ }
+
+ // TYPOGRAPHY
+ // ----------
+ // Reset horizontal dl
+ .dl-horizontal {
+ dt {
+ float: none;
+ clear: none;
+ width: auto;
+ text-align: left;
+ }
+ dd {
+ margin-left: 0;
+ }
+ }
+
+ // GRID & CONTAINERS
+ // -----------------
+ // Remove width from containers
+ .container {
+ width: auto;
+ }
+ // Fluid rows
+ .row-fluid {
+ width: 100%;
+ }
+ // Undo negative margin on rows and thumbnails
+ .row,
+ .thumbnails {
+ margin-left: 0;
+ }
+ .thumbnails > li {
+ float: none;
+ margin-left: 0; // Reset the default margin for all li elements when no .span* classes are present
+ }
+ // Make all grid-sized elements block level again
+ [class*="span"],
+ .uneditable-input[class*="span"], // Makes uneditable inputs full-width when using grid sizing
+ .row-fluid [class*="span"] {
+ float: none;
+ display: block;
+ width: 100%;
+ margin-left: 0;
+ .box-sizing(border-box);
+ }
+ .span12,
+ .row-fluid .span12 {
+ width: 100%;
+ .box-sizing(border-box);
+ }
+ .row-fluid [class*="offset"]:first-child {
+ margin-left: 0;
+ }
+
+ // FORM FIELDS
+ // -----------
+ // Make span* classes full width
+ .input-large,
+ .input-xlarge,
+ .input-xxlarge,
+ input[class*="span"],
+ select[class*="span"],
+ textarea[class*="span"],
+ .uneditable-input {
+ .input-block-level();
+ }
+ // But don't let it screw up prepend/append inputs
+ .input-prepend input,
+ .input-append input,
+ .input-prepend input[class*="span"],
+ .input-append input[class*="span"] {
+ display: inline-block; // redeclare so they don't wrap to new lines
+ width: auto;
+ }
+ .controls-row [class*="span"] + [class*="span"] {
+ margin-left: 0;
+ }
+
+ // Modals
+ .modal {
+ position: fixed;
+ top: 20px;
+ left: 20px;
+ right: 20px;
+ width: auto;
+ margin: 0;
+ &.fade { top: -100px; }
+ &.fade.in { top: 20px; }
+ }
+
+}
+
+
+
+// UP TO LANDSCAPE PHONE
+// ---------------------
+
+@media (max-width: 480px) {
+
+ // Smooth out the collapsing/expanding nav
+ .nav-collapse {
+ -webkit-transform: translate3d(0, 0, 0); // activate the GPU
+ }
+
+ // Block level the page header small tag for readability
+ .page-header h1 small {
+ display: block;
+ line-height: @baseLineHeight;
+ }
+
+ // Update checkboxes for iOS
+ input[type="checkbox"],
+ input[type="radio"] {
+ border: 1px solid #ccc;
+ }
+
+ // Remove the horizontal form styles
+ .form-horizontal {
+ .control-label {
+ float: none;
+ width: auto;
+ padding-top: 0;
+ text-align: left;
+ }
+ // Move over all input controls and content
+ .controls {
+ margin-left: 0;
+ }
+ // Move the options list down to align with labels
+ .control-list {
+ padding-top: 0; // has to be padding because margin collaspes
+ }
+ // Move over buttons in .form-actions to align with .controls
+ .form-actions {
+ padding-left: 10px;
+ padding-right: 10px;
+ }
+ }
+
+ // Medias
+ // Reset float and spacing to stack
+ .media .pull-left,
+ .media .pull-right {
+ float: none;
+ display: block;
+ margin-bottom: 10px;
+ }
+ // Remove side margins since we stack instead of indent
+ .media-object {
+ margin-right: 0;
+ margin-left: 0;
+ }
+
+ // Modals
+ .modal {
+ top: 10px;
+ left: 10px;
+ right: 10px;
+ }
+ .modal-header .close {
+ padding: 10px;
+ margin: -10px;
+ }
+
+ // Carousel
+ .carousel-caption {
+ position: static;
+ }
+
+}
diff --git a/library/font_awesome/src/assets/less/bootstrap-2.3.2/responsive-768px-979px.less b/library/font_awesome/src/assets/less/bootstrap-2.3.2/responsive-768px-979px.less
new file mode 100755
index 000000000..8e8c486a0
--- /dev/null
+++ b/library/font_awesome/src/assets/less/bootstrap-2.3.2/responsive-768px-979px.less
@@ -0,0 +1,19 @@
+//
+// Responsive: Tablet to desktop
+// --------------------------------------------------
+
+
+@media (min-width: 768px) and (max-width: 979px) {
+
+ // Fixed grid
+ #grid > .core(@gridColumnWidth768, @gridGutterWidth768);
+
+ // Fluid grid
+ #grid > .fluid(@fluidGridColumnWidth768, @fluidGridGutterWidth768);
+
+ // Input grid
+ #grid > .input(@gridColumnWidth768, @gridGutterWidth768);
+
+ // No need to reset .thumbnails here since it's the same @gridGutterWidth
+
+}
diff --git a/library/font_awesome/src/assets/less/bootstrap-2.3.2/responsive-navbar.less b/library/font_awesome/src/assets/less/bootstrap-2.3.2/responsive-navbar.less
new file mode 100755
index 000000000..21cd3ba67
--- /dev/null
+++ b/library/font_awesome/src/assets/less/bootstrap-2.3.2/responsive-navbar.less
@@ -0,0 +1,189 @@
+//
+// Responsive: Navbar
+// --------------------------------------------------
+
+
+// TABLETS AND BELOW
+// -----------------
+@media (max-width: @navbarCollapseWidth) {
+
+ // UNFIX THE TOPBAR
+ // ----------------
+ // Remove any padding from the body
+ body {
+ padding-top: 0;
+ }
+ // Unfix the navbars
+ .navbar-fixed-top,
+ .navbar-fixed-bottom {
+ position: static;
+ }
+ .navbar-fixed-top {
+ margin-bottom: @baseLineHeight;
+ }
+ .navbar-fixed-bottom {
+ margin-top: @baseLineHeight;
+ }
+ .navbar-fixed-top .navbar-inner,
+ .navbar-fixed-bottom .navbar-inner {
+ padding: 5px;
+ }
+ .navbar .container {
+ width: auto;
+ padding: 0;
+ }
+ // Account for brand name
+ .navbar .brand {
+ padding-left: 10px;
+ padding-right: 10px;
+ margin: 0 0 0 -5px;
+ }
+
+ // COLLAPSIBLE NAVBAR
+ // ------------------
+ // Nav collapse clears brand
+ .nav-collapse {
+ clear: both;
+ }
+ // Block-level the nav
+ .nav-collapse .nav {
+ float: none;
+ margin: 0 0 (@baseLineHeight / 2);
+ }
+ .nav-collapse .nav > li {
+ float: none;
+ }
+ .nav-collapse .nav > li > a {
+ margin-bottom: 2px;
+ }
+ .nav-collapse .nav > .divider-vertical {
+ display: none;
+ }
+ .nav-collapse .nav .nav-header {
+ color: @navbarText;
+ text-shadow: none;
+ }
+ // Nav and dropdown links in navbar
+ .nav-collapse .nav > li > a,
+ .nav-collapse .dropdown-menu a {
+ padding: 9px 15px;
+ font-weight: bold;
+ color: @navbarLinkColor;
+ .border-radius(3px);
+ }
+ // Buttons
+ .nav-collapse .btn {
+ padding: 4px 10px 4px;
+ font-weight: normal;
+ .border-radius(@baseBorderRadius);
+ }
+ .nav-collapse .dropdown-menu li + li a {
+ margin-bottom: 2px;
+ }
+ .nav-collapse .nav > li > a:hover,
+ .nav-collapse .nav > li > a:focus,
+ .nav-collapse .dropdown-menu a:hover,
+ .nav-collapse .dropdown-menu a:focus {
+ background-color: @navbarBackground;
+ }
+ .navbar-inverse .nav-collapse .nav > li > a,
+ .navbar-inverse .nav-collapse .dropdown-menu a {
+ color: @navbarInverseLinkColor;
+ }
+ .navbar-inverse .nav-collapse .nav > li > a:hover,
+ .navbar-inverse .nav-collapse .nav > li > a:focus,
+ .navbar-inverse .nav-collapse .dropdown-menu a:hover,
+ .navbar-inverse .nav-collapse .dropdown-menu a:focus {
+ background-color: @navbarInverseBackground;
+ }
+ // Buttons in the navbar
+ .nav-collapse.in .btn-group {
+ margin-top: 5px;
+ padding: 0;
+ }
+ // Dropdowns in the navbar
+ .nav-collapse .dropdown-menu {
+ position: static;
+ top: auto;
+ left: auto;
+ float: none;
+ display: none;
+ max-width: none;
+ margin: 0 15px;
+ padding: 0;
+ background-color: transparent;
+ border: none;
+ .border-radius(0);
+ .box-shadow(none);
+ }
+ .nav-collapse .open > .dropdown-menu {
+ display: block;
+ }
+
+ .nav-collapse .dropdown-menu:before,
+ .nav-collapse .dropdown-menu:after {
+ display: none;
+ }
+ .nav-collapse .dropdown-menu .divider {
+ display: none;
+ }
+ .nav-collapse .nav > li > .dropdown-menu {
+ &:before,
+ &:after {
+ display: none;
+ }
+ }
+ // Forms in navbar
+ .nav-collapse .navbar-form,
+ .nav-collapse .navbar-search {
+ float: none;
+ padding: (@baseLineHeight / 2) 15px;
+ margin: (@baseLineHeight / 2) 0;
+ border-top: 1px solid @navbarBackground;
+ border-bottom: 1px solid @navbarBackground;
+ .box-shadow(~"inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1)");
+ }
+ .navbar-inverse .nav-collapse .navbar-form,
+ .navbar-inverse .nav-collapse .navbar-search {
+ border-top-color: @navbarInverseBackground;
+ border-bottom-color: @navbarInverseBackground;
+ }
+ // Pull right (secondary) nav content
+ .navbar .nav-collapse .nav.pull-right {
+ float: none;
+ margin-left: 0;
+ }
+ // Hide everything in the navbar save .brand and toggle button */
+ .nav-collapse,
+ .nav-collapse.collapse {
+ overflow: hidden;
+ height: 0;
+ }
+ // Navbar button
+ .navbar .btn-navbar {
+ display: block;
+ }
+
+ // STATIC NAVBAR
+ // -------------
+ .navbar-static .navbar-inner {
+ padding-left: 10px;
+ padding-right: 10px;
+ }
+
+
+}
+
+
+// DEFAULT DESKTOP
+// ---------------
+
+@media (min-width: @navbarCollapseDesktopWidth) {
+
+ // Required to make the collapsing navbar work on regular desktops
+ .nav-collapse.collapse {
+ height: auto !important;
+ overflow: visible !important;
+ }
+
+}
diff --git a/library/font_awesome/src/assets/less/bootstrap-2.3.2/responsive-utilities.less b/library/font_awesome/src/assets/less/bootstrap-2.3.2/responsive-utilities.less
new file mode 100755
index 000000000..bf43e8ef7
--- /dev/null
+++ b/library/font_awesome/src/assets/less/bootstrap-2.3.2/responsive-utilities.less
@@ -0,0 +1,59 @@
+//
+// Responsive: Utility classes
+// --------------------------------------------------
+
+
+// IE10 Metro responsive
+// Required for Windows 8 Metro split-screen snapping with IE10
+// Source: http://timkadlec.com/2012/10/ie10-snap-mode-and-responsive-design/
+@-ms-viewport{
+ width: device-width;
+}
+
+// Hide from screenreaders and browsers
+// Credit: HTML5 Boilerplate
+.hidden {
+ display: none;
+ visibility: hidden;
+}
+
+// Visibility utilities
+
+// For desktops
+.visible-phone { display: none !important; }
+.visible-tablet { display: none !important; }
+.hidden-phone { }
+.hidden-tablet { }
+.hidden-desktop { display: none !important; }
+.visible-desktop { display: inherit !important; }
+
+// Tablets & small desktops only
+@media (min-width: 768px) and (max-width: 979px) {
+ // Hide everything else
+ .hidden-desktop { display: inherit !important; }
+ .visible-desktop { display: none !important ; }
+ // Show
+ .visible-tablet { display: inherit !important; }
+ // Hide
+ .hidden-tablet { display: none !important; }
+}
+
+// Phones only
+@media (max-width: 767px) {
+ // Hide everything else
+ .hidden-desktop { display: inherit !important; }
+ .visible-desktop { display: none !important; }
+ // Show
+ .visible-phone { display: inherit !important; } // Use inherit to restore previous behavior
+ // Hide
+ .hidden-phone { display: none !important; }
+}
+
+// Print utilities
+.visible-print { display: none !important; }
+.hidden-print { }
+
+@media print {
+ .visible-print { display: inherit !important; }
+ .hidden-print { display: none !important; }
+}
diff --git a/library/font_awesome/src/assets/less/bootstrap-2.3.2/responsive.less b/library/font_awesome/src/assets/less/bootstrap-2.3.2/responsive.less
new file mode 100755
index 000000000..9e5f9b1f4
--- /dev/null
+++ b/library/font_awesome/src/assets/less/bootstrap-2.3.2/responsive.less
@@ -0,0 +1,48 @@
+/*!
+ * Bootstrap Responsive v2.3.2
+ *
+ * Copyright 2012 Twitter, Inc
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Designed and built with all the love in the world @twitter by @mdo and @fat.
+ */
+
+
+// Responsive.less
+// For phone and tablet devices
+// -------------------------------------------------------------
+
+
+// REPEAT VARIABLES & MIXINS
+// -------------------------
+// Required since we compile the responsive stuff separately
+
+@import "variables.less"; // Modify this for custom colors, font-sizes, etc
+@import "mixins.less";
+
+
+// RESPONSIVE CLASSES
+// ------------------
+
+@import "responsive-utilities.less";
+
+
+// MEDIA QUERIES
+// ------------------
+
+// Large desktops
+@import "responsive-1200px-min.less";
+
+// Tablets to regular desktops
+@import "responsive-768px-979px.less";
+
+// Phones to portrait tablets and narrow desktops
+@import "responsive-767px-max.less";
+
+
+// RESPONSIVE NAVBAR
+// ------------------
+
+// From 979px and below, show a button to toggle navbar contents
+@import "responsive-navbar.less";
diff --git a/library/font_awesome/src/assets/less/bootstrap-2.3.2/scaffolding.less b/library/font_awesome/src/assets/less/bootstrap-2.3.2/scaffolding.less
new file mode 100755
index 000000000..f17e8cadb
--- /dev/null
+++ b/library/font_awesome/src/assets/less/bootstrap-2.3.2/scaffolding.less
@@ -0,0 +1,53 @@
+//
+// Scaffolding
+// --------------------------------------------------
+
+
+// Body reset
+// -------------------------
+
+body {
+ margin: 0;
+ font-family: @baseFontFamily;
+ font-size: @baseFontSize;
+ line-height: @baseLineHeight;
+ color: @textColor;
+ background-color: @bodyBackground;
+}
+
+
+// Links
+// -------------------------
+
+a {
+ color: @linkColor;
+ text-decoration: none;
+}
+a:hover,
+a:focus {
+ color: @linkColorHover;
+ text-decoration: underline;
+}
+
+
+// Images
+// -------------------------
+
+// Rounded corners
+.img-rounded {
+ .border-radius(6px);
+}
+
+// Add polaroid-esque trim
+.img-polaroid {
+ padding: 4px;
+ background-color: #fff;
+ border: 1px solid #ccc;
+ border: 1px solid rgba(0,0,0,.2);
+ .box-shadow(0 1px 3px rgba(0,0,0,.1));
+}
+
+// Perfect circle
+.img-circle {
+ .border-radius(500px); // crank the border-radius so it works with most reasonably sized images
+}
diff --git a/library/font_awesome/src/assets/less/bootstrap-2.3.2/sprites.less b/library/font_awesome/src/assets/less/bootstrap-2.3.2/sprites.less
new file mode 100755
index 000000000..1812bf71a
--- /dev/null
+++ b/library/font_awesome/src/assets/less/bootstrap-2.3.2/sprites.less
@@ -0,0 +1,197 @@
+//
+// Sprites
+// --------------------------------------------------
+
+
+// ICONS
+// -----
+
+// All icons receive the styles of the <i> tag with a base class
+// of .i and are then given a unique class to add width, height,
+// and background-position. Your resulting HTML will look like
+// <i class="icon-inbox"></i>.
+
+// For the white version of the icons, just add the .icon-white class:
+// <i class="icon-inbox icon-white"></i>
+
+[class^="icon-"],
+[class*=" icon-"] {
+ display: inline-block;
+ width: 14px;
+ height: 14px;
+ .ie7-restore-right-whitespace();
+ line-height: 14px;
+ vertical-align: text-top;
+ background-image: url("@{iconSpritePath}");
+ background-position: 14px 14px;
+ background-repeat: no-repeat;
+ margin-top: 1px;
+}
+
+/* White icons with optional class, or on hover/focus/active states of certain elements */
+.icon-white,
+.nav-pills > .active > a > [class^="icon-"],
+.nav-pills > .active > a > [class*=" icon-"],
+.nav-list > .active > a > [class^="icon-"],
+.nav-list > .active > a > [class*=" icon-"],
+.navbar-inverse .nav > .active > a > [class^="icon-"],
+.navbar-inverse .nav > .active > a > [class*=" icon-"],
+.dropdown-menu > li > a:hover > [class^="icon-"],
+.dropdown-menu > li > a:focus > [class^="icon-"],
+.dropdown-menu > li > a:hover > [class*=" icon-"],
+.dropdown-menu > li > a:focus > [class*=" icon-"],
+.dropdown-menu > .active > a > [class^="icon-"],
+.dropdown-menu > .active > a > [class*=" icon-"],
+.dropdown-submenu:hover > a > [class^="icon-"],
+.dropdown-submenu:focus > a > [class^="icon-"],
+.dropdown-submenu:hover > a > [class*=" icon-"],
+.dropdown-submenu:focus > a > [class*=" icon-"] {
+ background-image: url("@{iconWhiteSpritePath}");
+}
+
+.icon-glass { background-position: 0 0; }
+.icon-music { background-position: -24px 0; }
+.icon-search { background-position: -48px 0; }
+.icon-envelope { background-position: -72px 0; }
+.icon-heart { background-position: -96px 0; }
+.icon-star { background-position: -120px 0; }
+.icon-star-empty { background-position: -144px 0; }
+.icon-user { background-position: -168px 0; }
+.icon-film { background-position: -192px 0; }
+.icon-th-large { background-position: -216px 0; }
+.icon-th { background-position: -240px 0; }
+.icon-th-list { background-position: -264px 0; }
+.icon-ok { background-position: -288px 0; }
+.icon-remove { background-position: -312px 0; }
+.icon-zoom-in { background-position: -336px 0; }
+.icon-zoom-out { background-position: -360px 0; }
+.icon-off { background-position: -384px 0; }
+.icon-signal { background-position: -408px 0; }
+.icon-cog { background-position: -432px 0; }
+.icon-trash { background-position: -456px 0; }
+
+.icon-home { background-position: 0 -24px; }
+.icon-file { background-position: -24px -24px; }
+.icon-time { background-position: -48px -24px; }
+.icon-road { background-position: -72px -24px; }
+.icon-download-alt { background-position: -96px -24px; }
+.icon-download { background-position: -120px -24px; }
+.icon-upload { background-position: -144px -24px; }
+.icon-inbox { background-position: -168px -24px; }
+.icon-play-circle { background-position: -192px -24px; }
+.icon-repeat { background-position: -216px -24px; }
+.icon-refresh { background-position: -240px -24px; }
+.icon-list-alt { background-position: -264px -24px; }
+.icon-lock { background-position: -287px -24px; } // 1px off
+.icon-flag { background-position: -312px -24px; }
+.icon-headphones { background-position: -336px -24px; }
+.icon-volume-off { background-position: -360px -24px; }
+.icon-volume-down { background-position: -384px -24px; }
+.icon-volume-up { background-position: -408px -24px; }
+.icon-qrcode { background-position: -432px -24px; }
+.icon-barcode { background-position: -456px -24px; }
+
+.icon-tag { background-position: 0 -48px; }
+.icon-tags { background-position: -25px -48px; } // 1px off
+.icon-book { background-position: -48px -48px; }
+.icon-bookmark { background-position: -72px -48px; }
+.icon-print { background-position: -96px -48px; }
+.icon-camera { background-position: -120px -48px; }
+.icon-font { background-position: -144px -48px; }
+.icon-bold { background-position: -167px -48px; } // 1px off
+.icon-italic { background-position: -192px -48px; }
+.icon-text-height { background-position: -216px -48px; }
+.icon-text-width { background-position: -240px -48px; }
+.icon-align-left { background-position: -264px -48px; }
+.icon-align-center { background-position: -288px -48px; }
+.icon-align-right { background-position: -312px -48px; }
+.icon-align-justify { background-position: -336px -48px; }
+.icon-list { background-position: -360px -48px; }
+.icon-indent-left { background-position: -384px -48px; }
+.icon-indent-right { background-position: -408px -48px; }
+.icon-facetime-video { background-position: -432px -48px; }
+.icon-picture { background-position: -456px -48px; }
+
+.icon-pencil { background-position: 0 -72px; }
+.icon-map-marker { background-position: -24px -72px; }
+.icon-adjust { background-position: -48px -72px; }
+.icon-tint { background-position: -72px -72px; }
+.icon-edit { background-position: -96px -72px; }
+.icon-share { background-position: -120px -72px; }
+.icon-check { background-position: -144px -72px; }
+.icon-move { background-position: -168px -72px; }
+.icon-step-backward { background-position: -192px -72px; }
+.icon-fast-backward { background-position: -216px -72px; }
+.icon-backward { background-position: -240px -72px; }
+.icon-play { background-position: -264px -72px; }
+.icon-pause { background-position: -288px -72px; }
+.icon-stop { background-position: -312px -72px; }
+.icon-forward { background-position: -336px -72px; }
+.icon-fast-forward { background-position: -360px -72px; }
+.icon-step-forward { background-position: -384px -72px; }
+.icon-eject { background-position: -408px -72px; }
+.icon-chevron-left { background-position: -432px -72px; }
+.icon-chevron-right { background-position: -456px -72px; }
+
+.icon-plus-sign { background-position: 0 -96px; }
+.icon-minus-sign { background-position: -24px -96px; }
+.icon-remove-sign { background-position: -48px -96px; }
+.icon-ok-sign { background-position: -72px -96px; }
+.icon-question-sign { background-position: -96px -96px; }
+.icon-info-sign { background-position: -120px -96px; }
+.icon-screenshot { background-position: -144px -96px; }
+.icon-remove-circle { background-position: -168px -96px; }
+.icon-ok-circle { background-position: -192px -96px; }
+.icon-ban-circle { background-position: -216px -96px; }
+.icon-arrow-left { background-position: -240px -96px; }
+.icon-arrow-right { background-position: -264px -96px; }
+.icon-arrow-up { background-position: -289px -96px; } // 1px off
+.icon-arrow-down { background-position: -312px -96px; }
+.icon-share-alt { background-position: -336px -96px; }
+.icon-resize-full { background-position: -360px -96px; }
+.icon-resize-small { background-position: -384px -96px; }
+.icon-plus { background-position: -408px -96px; }
+.icon-minus { background-position: -433px -96px; }
+.icon-asterisk { background-position: -456px -96px; }
+
+.icon-exclamation-sign { background-position: 0 -120px; }
+.icon-gift { background-position: -24px -120px; }
+.icon-leaf { background-position: -48px -120px; }
+.icon-fire { background-position: -72px -120px; }
+.icon-eye-open { background-position: -96px -120px; }
+.icon-eye-close { background-position: -120px -120px; }
+.icon-warning-sign { background-position: -144px -120px; }
+.icon-plane { background-position: -168px -120px; }
+.icon-calendar { background-position: -192px -120px; }
+.icon-random { background-position: -216px -120px; width: 16px; }
+.icon-comment { background-position: -240px -120px; }
+.icon-magnet { background-position: -264px -120px; }
+.icon-chevron-up { background-position: -288px -120px; }
+.icon-chevron-down { background-position: -313px -119px; } // 1px, 1px off
+.icon-retweet { background-position: -336px -120px; }
+.icon-shopping-cart { background-position: -360px -120px; }
+.icon-folder-close { background-position: -384px -120px; width: 16px; }
+.icon-folder-open { background-position: -408px -120px; width: 16px; }
+.icon-resize-vertical { background-position: -432px -119px; } // 1px, 1px off
+.icon-resize-horizontal { background-position: -456px -118px; } // 1px, 2px off
+
+.icon-hdd { background-position: 0 -144px; }
+.icon-bullhorn { background-position: -24px -144px; }
+.icon-bell { background-position: -48px -144px; }
+.icon-certificate { background-position: -72px -144px; }
+.icon-thumbs-up { background-position: -96px -144px; }
+.icon-thumbs-down { background-position: -120px -144px; }
+.icon-hand-right { background-position: -144px -144px; }
+.icon-hand-left { background-position: -168px -144px; }
+.icon-hand-up { background-position: -192px -144px; }
+.icon-hand-down { background-position: -216px -144px; }
+.icon-circle-arrow-right { background-position: -240px -144px; }
+.icon-circle-arrow-left { background-position: -264px -144px; }
+.icon-circle-arrow-up { background-position: -288px -144px; }
+.icon-circle-arrow-down { background-position: -312px -144px; }
+.icon-globe { background-position: -336px -144px; }
+.icon-wrench { background-position: -360px -144px; }
+.icon-tasks { background-position: -384px -144px; }
+.icon-filter { background-position: -408px -144px; }
+.icon-briefcase { background-position: -432px -144px; }
+.icon-fullscreen { background-position: -456px -144px; }
diff --git a/library/font_awesome/src/assets/less/bootstrap-2.3.2/tables.less b/library/font_awesome/src/assets/less/bootstrap-2.3.2/tables.less
new file mode 100755
index 000000000..0e35271e1
--- /dev/null
+++ b/library/font_awesome/src/assets/less/bootstrap-2.3.2/tables.less
@@ -0,0 +1,244 @@
+//
+// Tables
+// --------------------------------------------------
+
+
+// BASE TABLES
+// -----------------
+
+table {
+ max-width: 100%;
+ background-color: @tableBackground;
+ border-collapse: collapse;
+ border-spacing: 0;
+}
+
+// BASELINE STYLES
+// ---------------
+
+.table {
+ width: 100%;
+ margin-bottom: @baseLineHeight;
+ // Cells
+ th,
+ td {
+ padding: 8px;
+ line-height: @baseLineHeight;
+ text-align: left;
+ vertical-align: top;
+ border-top: 1px solid @tableBorder;
+ }
+ th {
+ font-weight: bold;
+ }
+ // Bottom align for column headings
+ thead th {
+ vertical-align: bottom;
+ }
+ // Remove top border from thead by default
+ caption + thead tr:first-child th,
+ caption + thead tr:first-child td,
+ colgroup + thead tr:first-child th,
+ colgroup + thead tr:first-child td,
+ thead:first-child tr:first-child th,
+ thead:first-child tr:first-child td {
+ border-top: 0;
+ }
+ // Account for multiple tbody instances
+ tbody + tbody {
+ border-top: 2px solid @tableBorder;
+ }
+
+ // Nesting
+ .table {
+ background-color: @bodyBackground;
+ }
+}
+
+
+
+// CONDENSED TABLE W/ HALF PADDING
+// -------------------------------
+
+.table-condensed {
+ th,
+ td {
+ padding: 4px 5px;
+ }
+}
+
+
+// BORDERED VERSION
+// ----------------
+
+.table-bordered {
+ border: 1px solid @tableBorder;
+ border-collapse: separate; // Done so we can round those corners!
+ *border-collapse: collapse; // IE7 can't round corners anyway
+ border-left: 0;
+ .border-radius(@baseBorderRadius);
+ th,
+ td {
+ border-left: 1px solid @tableBorder;
+ }
+ // Prevent a double border
+ caption + thead tr:first-child th,
+ caption + tbody tr:first-child th,
+ caption + tbody tr:first-child td,
+ colgroup + thead tr:first-child th,
+ colgroup + tbody tr:first-child th,
+ colgroup + tbody tr:first-child td,
+ thead:first-child tr:first-child th,
+ tbody:first-child tr:first-child th,
+ tbody:first-child tr:first-child td {
+ border-top: 0;
+ }
+ // For first th/td in the first row in the first thead or tbody
+ thead:first-child tr:first-child > th:first-child,
+ tbody:first-child tr:first-child > td:first-child,
+ tbody:first-child tr:first-child > th:first-child {
+ .border-top-left-radius(@baseBorderRadius);
+ }
+ // For last th/td in the first row in the first thead or tbody
+ thead:first-child tr:first-child > th:last-child,
+ tbody:first-child tr:first-child > td:last-child,
+ tbody:first-child tr:first-child > th:last-child {
+ .border-top-right-radius(@baseBorderRadius);
+ }
+ // For first th/td (can be either) in the last row in the last thead, tbody, and tfoot
+ thead:last-child tr:last-child > th:first-child,
+ tbody:last-child tr:last-child > td:first-child,
+ tbody:last-child tr:last-child > th:first-child,
+ tfoot:last-child tr:last-child > td:first-child,
+ tfoot:last-child tr:last-child > th:first-child {
+ .border-bottom-left-radius(@baseBorderRadius);
+ }
+ // For last th/td (can be either) in the last row in the last thead, tbody, and tfoot
+ thead:last-child tr:last-child > th:last-child,
+ tbody:last-child tr:last-child > td:last-child,
+ tbody:last-child tr:last-child > th:last-child,
+ tfoot:last-child tr:last-child > td:last-child,
+ tfoot:last-child tr:last-child > th:last-child {
+ .border-bottom-right-radius(@baseBorderRadius);
+ }
+
+ // Clear border-radius for first and last td in the last row in the last tbody for table with tfoot
+ tfoot + tbody:last-child tr:last-child td:first-child {
+ .border-bottom-left-radius(0);
+ }
+ tfoot + tbody:last-child tr:last-child td:last-child {
+ .border-bottom-right-radius(0);
+ }
+
+ // Special fixes to round the left border on the first td/th
+ caption + thead tr:first-child th:first-child,
+ caption + tbody tr:first-child td:first-child,
+ colgroup + thead tr:first-child th:first-child,
+ colgroup + tbody tr:first-child td:first-child {
+ .border-top-left-radius(@baseBorderRadius);
+ }
+ caption + thead tr:first-child th:last-child,
+ caption + tbody tr:first-child td:last-child,
+ colgroup + thead tr:first-child th:last-child,
+ colgroup + tbody tr:first-child td:last-child {
+ .border-top-right-radius(@baseBorderRadius);
+ }
+
+}
+
+
+
+
+// ZEBRA-STRIPING
+// --------------
+
+// Default zebra-stripe styles (alternating gray and transparent backgrounds)
+.table-striped {
+ tbody {
+ > tr:nth-child(odd) > td,
+ > tr:nth-child(odd) > th {
+ background-color: @tableBackgroundAccent;
+ }
+ }
+}
+
+
+// HOVER EFFECT
+// ------------
+// Placed here since it has to come after the potential zebra striping
+.table-hover {
+ tbody {
+ tr:hover > td,
+ tr:hover > th {
+ background-color: @tableBackgroundHover;
+ }
+ }
+}
+
+
+// TABLE CELL SIZING
+// -----------------
+
+// Reset default grid behavior
+table td[class*="span"],
+table th[class*="span"],
+.row-fluid table td[class*="span"],
+.row-fluid table th[class*="span"] {
+ display: table-cell;
+ float: none; // undo default grid column styles
+ margin-left: 0; // undo default grid column styles
+}
+
+// Change the column widths to account for td/th padding
+.table td,
+.table th {
+ &.span1 { .tableColumns(1); }
+ &.span2 { .tableColumns(2); }
+ &.span3 { .tableColumns(3); }
+ &.span4 { .tableColumns(4); }
+ &.span5 { .tableColumns(5); }
+ &.span6 { .tableColumns(6); }
+ &.span7 { .tableColumns(7); }
+ &.span8 { .tableColumns(8); }
+ &.span9 { .tableColumns(9); }
+ &.span10 { .tableColumns(10); }
+ &.span11 { .tableColumns(11); }
+ &.span12 { .tableColumns(12); }
+}
+
+
+
+// TABLE BACKGROUNDS
+// -----------------
+// Exact selectors below required to override .table-striped
+
+.table tbody tr {
+ &.success > td {
+ background-color: @successBackground;
+ }
+ &.error > td {
+ background-color: @errorBackground;
+ }
+ &.warning > td {
+ background-color: @warningBackground;
+ }
+ &.info > td {
+ background-color: @infoBackground;
+ }
+}
+
+// Hover states for .table-hover
+.table-hover tbody tr {
+ &.success:hover > td {
+ background-color: darken(@successBackground, 5%);
+ }
+ &.error:hover > td {
+ background-color: darken(@errorBackground, 5%);
+ }
+ &.warning:hover > td {
+ background-color: darken(@warningBackground, 5%);
+ }
+ &.info:hover > td {
+ background-color: darken(@infoBackground, 5%);
+ }
+}
diff --git a/library/font_awesome/src/assets/less/bootstrap-2.3.2/thumbnails.less b/library/font_awesome/src/assets/less/bootstrap-2.3.2/thumbnails.less
new file mode 100755
index 000000000..4fd07d253
--- /dev/null
+++ b/library/font_awesome/src/assets/less/bootstrap-2.3.2/thumbnails.less
@@ -0,0 +1,53 @@
+//
+// Thumbnails
+// --------------------------------------------------
+
+
+// Note: `.thumbnails` and `.thumbnails > li` are overriden in responsive files
+
+// Make wrapper ul behave like the grid
+.thumbnails {
+ margin-left: -@gridGutterWidth;
+ list-style: none;
+ .clearfix();
+}
+// Fluid rows have no left margin
+.row-fluid .thumbnails {
+ margin-left: 0;
+}
+
+// Float li to make thumbnails appear in a row
+.thumbnails > li {
+ float: left; // Explicity set the float since we don't require .span* classes
+ margin-bottom: @baseLineHeight;
+ margin-left: @gridGutterWidth;
+}
+
+// The actual thumbnail (can be `a` or `div`)
+.thumbnail {
+ display: block;
+ padding: 4px;
+ line-height: @baseLineHeight;
+ border: 1px solid #ddd;
+ .border-radius(@baseBorderRadius);
+ .box-shadow(0 1px 3px rgba(0,0,0,.055));
+ .transition(all .2s ease-in-out);
+}
+// Add a hover/focus state for linked versions only
+a.thumbnail:hover,
+a.thumbnail:focus {
+ border-color: @linkColor;
+ .box-shadow(0 1px 4px rgba(0,105,214,.25));
+}
+
+// Images and captions
+.thumbnail > img {
+ display: block;
+ max-width: 100%;
+ margin-left: auto;
+ margin-right: auto;
+}
+.thumbnail .caption {
+ padding: 9px;
+ color: @gray;
+}
diff --git a/library/font_awesome/src/assets/less/bootstrap-2.3.2/tooltip.less b/library/font_awesome/src/assets/less/bootstrap-2.3.2/tooltip.less
new file mode 100755
index 000000000..83d5f2bd7
--- /dev/null
+++ b/library/font_awesome/src/assets/less/bootstrap-2.3.2/tooltip.less
@@ -0,0 +1,70 @@
+//
+// Tooltips
+// --------------------------------------------------
+
+
+// Base class
+.tooltip {
+ position: absolute;
+ z-index: @zindexTooltip;
+ display: block;
+ visibility: visible;
+ font-size: 11px;
+ line-height: 1.4;
+ .opacity(0);
+ &.in { .opacity(80); }
+ &.top { margin-top: -3px; padding: 5px 0; }
+ &.right { margin-left: 3px; padding: 0 5px; }
+ &.bottom { margin-top: 3px; padding: 5px 0; }
+ &.left { margin-left: -3px; padding: 0 5px; }
+}
+
+// Wrapper for the tooltip content
+.tooltip-inner {
+ max-width: 200px;
+ padding: 8px;
+ color: @tooltipColor;
+ text-align: center;
+ text-decoration: none;
+ background-color: @tooltipBackground;
+ .border-radius(@baseBorderRadius);
+}
+
+// Arrows
+.tooltip-arrow {
+ position: absolute;
+ width: 0;
+ height: 0;
+ border-color: transparent;
+ border-style: solid;
+}
+.tooltip {
+ &.top .tooltip-arrow {
+ bottom: 0;
+ left: 50%;
+ margin-left: -@tooltipArrowWidth;
+ border-width: @tooltipArrowWidth @tooltipArrowWidth 0;
+ border-top-color: @tooltipArrowColor;
+ }
+ &.right .tooltip-arrow {
+ top: 50%;
+ left: 0;
+ margin-top: -@tooltipArrowWidth;
+ border-width: @tooltipArrowWidth @tooltipArrowWidth @tooltipArrowWidth 0;
+ border-right-color: @tooltipArrowColor;
+ }
+ &.left .tooltip-arrow {
+ top: 50%;
+ right: 0;
+ margin-top: -@tooltipArrowWidth;
+ border-width: @tooltipArrowWidth 0 @tooltipArrowWidth @tooltipArrowWidth;
+ border-left-color: @tooltipArrowColor;
+ }
+ &.bottom .tooltip-arrow {
+ top: 0;
+ left: 50%;
+ margin-left: -@tooltipArrowWidth;
+ border-width: 0 @tooltipArrowWidth @tooltipArrowWidth;
+ border-bottom-color: @tooltipArrowColor;
+ }
+}
diff --git a/library/font_awesome/src/assets/less/bootstrap-2.3.2/type.less b/library/font_awesome/src/assets/less/bootstrap-2.3.2/type.less
new file mode 100755
index 000000000..337138ac8
--- /dev/null
+++ b/library/font_awesome/src/assets/less/bootstrap-2.3.2/type.less
@@ -0,0 +1,247 @@
+//
+// Typography
+// --------------------------------------------------
+
+
+// Body text
+// -------------------------
+
+p {
+ margin: 0 0 @baseLineHeight / 2;
+}
+.lead {
+ margin-bottom: @baseLineHeight;
+ font-size: @baseFontSize * 1.5;
+ font-weight: 200;
+ line-height: @baseLineHeight * 1.5;
+}
+
+
+// Emphasis & misc
+// -------------------------
+
+// Ex: 14px base font * 85% = about 12px
+small { font-size: 85%; }
+
+strong { font-weight: bold; }
+em { font-style: italic; }
+cite { font-style: normal; }
+
+// Utility classes
+.muted { color: @grayLight; }
+a.muted:hover,
+a.muted:focus { color: darken(@grayLight, 10%); }
+
+.text-warning { color: @warningText; }
+a.text-warning:hover,
+a.text-warning:focus { color: darken(@warningText, 10%); }
+
+.text-error { color: @errorText; }
+a.text-error:hover,
+a.text-error:focus { color: darken(@errorText, 10%); }
+
+.text-info { color: @infoText; }
+a.text-info:hover,
+a.text-info:focus { color: darken(@infoText, 10%); }
+
+.text-success { color: @successText; }
+a.text-success:hover,
+a.text-success:focus { color: darken(@successText, 10%); }
+
+.text-left { text-align: left; }
+.text-right { text-align: right; }
+.text-center { text-align: center; }
+
+
+// Headings
+// -------------------------
+
+h1, h2, h3, h4, h5, h6 {
+ margin: (@baseLineHeight / 2) 0;
+ font-family: @headingsFontFamily;
+ font-weight: @headingsFontWeight;
+ line-height: @baseLineHeight;
+ color: @headingsColor;
+ text-rendering: optimizelegibility; // Fix the character spacing for headings
+ small {
+ font-weight: normal;
+ line-height: 1;
+ color: @grayLight;
+ }
+}
+
+h1,
+h2,
+h3 { line-height: @baseLineHeight * 2; }
+
+h1 { font-size: @baseFontSize * 2.75; } // ~38px
+h2 { font-size: @baseFontSize * 2.25; } // ~32px
+h3 { font-size: @baseFontSize * 1.75; } // ~24px
+h4 { font-size: @baseFontSize * 1.25; } // ~18px
+h5 { font-size: @baseFontSize; }
+h6 { font-size: @baseFontSize * 0.85; } // ~12px
+
+h1 small { font-size: @baseFontSize * 1.75; } // ~24px
+h2 small { font-size: @baseFontSize * 1.25; } // ~18px
+h3 small { font-size: @baseFontSize; }
+h4 small { font-size: @baseFontSize; }
+
+
+// Page header
+// -------------------------
+
+.page-header {
+ padding-bottom: (@baseLineHeight / 2) - 1;
+ margin: @baseLineHeight 0 (@baseLineHeight * 1.5);
+ border-bottom: 1px solid @grayLighter;
+}
+
+
+
+// Lists
+// --------------------------------------------------
+
+// Unordered and Ordered lists
+ul, ol {
+ padding: 0;
+ margin: 0 0 @baseLineHeight / 2 25px;
+}
+ul ul,
+ul ol,
+ol ol,
+ol ul {
+ margin-bottom: 0;
+}
+li {
+ line-height: @baseLineHeight;
+}
+
+// Remove default list styles
+ul.unstyled,
+ol.unstyled {
+ margin-left: 0;
+ list-style: none;
+}
+
+// Single-line list items
+ul.inline,
+ol.inline {
+ margin-left: 0;
+ list-style: none;
+ > li {
+ display: inline-block;
+ .ie7-inline-block();
+ padding-left: 5px;
+ padding-right: 5px;
+ }
+}
+
+// Description Lists
+dl {
+ margin-bottom: @baseLineHeight;
+}
+dt,
+dd {
+ line-height: @baseLineHeight;
+}
+dt {
+ font-weight: bold;
+}
+dd {
+ margin-left: @baseLineHeight / 2;
+}
+// Horizontal layout (like forms)
+.dl-horizontal {
+ .clearfix(); // Ensure dl clears floats if empty dd elements present
+ dt {
+ float: left;
+ width: @horizontalComponentOffset - 20;
+ clear: left;
+ text-align: right;
+ .text-overflow();
+ }
+ dd {
+ margin-left: @horizontalComponentOffset;
+ }
+}
+
+// MISC
+// ----
+
+// Horizontal rules
+hr {
+ margin: @baseLineHeight 0;
+ border: 0;
+ border-top: 1px solid @hrBorder;
+ border-bottom: 1px solid @white;
+}
+
+// Abbreviations and acronyms
+abbr[title],
+// Added data-* attribute to help out our tooltip plugin, per https://github.com/twitter/bootstrap/issues/5257
+abbr[data-original-title] {
+ cursor: help;
+ border-bottom: 1px dotted @grayLight;
+}
+abbr.initialism {
+ font-size: 90%;
+ text-transform: uppercase;
+}
+
+// Blockquotes
+blockquote {
+ padding: 0 0 0 15px;
+ margin: 0 0 @baseLineHeight;
+ border-left: 5px solid @grayLighter;
+ p {
+ margin-bottom: 0;
+ font-size: @baseFontSize * 1.25;
+ font-weight: 300;
+ line-height: 1.25;
+ }
+ small {
+ display: block;
+ line-height: @baseLineHeight;
+ color: @grayLight;
+ &:before {
+ content: '\2014 \00A0';
+ }
+ }
+
+ // Float right with text-align: right
+ &.pull-right {
+ float: right;
+ padding-right: 15px;
+ padding-left: 0;
+ border-right: 5px solid @grayLighter;
+ border-left: 0;
+ p,
+ small {
+ text-align: right;
+ }
+ small {
+ &:before {
+ content: '';
+ }
+ &:after {
+ content: '\00A0 \2014';
+ }
+ }
+ }
+}
+
+// Quotes
+q:before,
+q:after,
+blockquote:before,
+blockquote:after {
+ content: "";
+}
+
+// Addresses
+address {
+ display: block;
+ margin-bottom: @baseLineHeight;
+ font-style: normal;
+ line-height: @baseLineHeight;
+}
diff --git a/library/font_awesome/src/assets/less/bootstrap-2.3.2/utilities.less b/library/font_awesome/src/assets/less/bootstrap-2.3.2/utilities.less
new file mode 100755
index 000000000..314b4ffdb
--- /dev/null
+++ b/library/font_awesome/src/assets/less/bootstrap-2.3.2/utilities.less
@@ -0,0 +1,30 @@
+//
+// Utility classes
+// --------------------------------------------------
+
+
+// Quick floats
+.pull-right {
+ float: right;
+}
+.pull-left {
+ float: left;
+}
+
+// Toggling content
+.hide {
+ display: none;
+}
+.show {
+ display: block;
+}
+
+// Visibility
+.invisible {
+ visibility: hidden;
+}
+
+// For Affix plugin
+.affix {
+ position: fixed;
+}
diff --git a/library/font_awesome/src/assets/less/bootstrap-2.3.2/variables.less b/library/font_awesome/src/assets/less/bootstrap-2.3.2/variables.less
new file mode 100755
index 000000000..31c131b1e
--- /dev/null
+++ b/library/font_awesome/src/assets/less/bootstrap-2.3.2/variables.less
@@ -0,0 +1,301 @@
+//
+// Variables
+// --------------------------------------------------
+
+
+// Global values
+// --------------------------------------------------
+
+
+// Grays
+// -------------------------
+@black: #000;
+@grayDarker: #222;
+@grayDark: #333;
+@gray: #555;
+@grayLight: #999;
+@grayLighter: #eee;
+@white: #fff;
+
+
+// Accent colors
+// -------------------------
+@blue: #049cdb;
+@blueDark: #0064cd;
+@green: #46a546;
+@red: #9d261d;
+@yellow: #ffc40d;
+@orange: #f89406;
+@pink: #c3325f;
+@purple: #7a43b6;
+
+
+// Scaffolding
+// -------------------------
+@bodyBackground: @white;
+@textColor: @grayDark;
+
+
+// Links
+// -------------------------
+@linkColor: #08c;
+@linkColorHover: darken(@linkColor, 15%);
+
+
+// Typography
+// -------------------------
+@sansFontFamily: "Helvetica Neue", Helvetica, Arial, sans-serif;
+@serifFontFamily: Georgia, "Times New Roman", Times, serif;
+@monoFontFamily: Monaco, Menlo, Consolas, "Courier New", monospace;
+
+@baseFontSize: 14px;
+@baseFontFamily: @sansFontFamily;
+@baseLineHeight: 20px;
+@altFontFamily: @serifFontFamily;
+
+@headingsFontFamily: inherit; // empty to use BS default, @baseFontFamily
+@headingsFontWeight: bold; // instead of browser default, bold
+@headingsColor: inherit; // empty to use BS default, @textColor
+
+
+// Component sizing
+// -------------------------
+// Based on 14px font-size and 20px line-height
+
+@fontSizeLarge: @baseFontSize * 1.25; // ~18px
+@fontSizeSmall: @baseFontSize * 0.85; // ~12px
+@fontSizeMini: @baseFontSize * 0.75; // ~11px
+
+@paddingLarge: 11px 19px; // 44px
+@paddingSmall: 2px 10px; // 26px
+@paddingMini: 0 6px; // 22px
+
+@baseBorderRadius: 4px;
+@borderRadiusLarge: 6px;
+@borderRadiusSmall: 3px;
+
+
+// Tables
+// -------------------------
+@tableBackground: transparent; // overall background-color
+@tableBackgroundAccent: #f9f9f9; // for striping
+@tableBackgroundHover: #f5f5f5; // for hover
+@tableBorder: #ddd; // table and cell border
+
+// Buttons
+// -------------------------
+@btnBackground: @white;
+@btnBackgroundHighlight: darken(@white, 10%);
+@btnBorder: #ccc;
+
+@btnPrimaryBackground: @linkColor;
+@btnPrimaryBackgroundHighlight: spin(@btnPrimaryBackground, 20%);
+
+@btnInfoBackground: #5bc0de;
+@btnInfoBackgroundHighlight: #2f96b4;
+
+@btnSuccessBackground: #62c462;
+@btnSuccessBackgroundHighlight: #51a351;
+
+@btnWarningBackground: lighten(@orange, 15%);
+@btnWarningBackgroundHighlight: @orange;
+
+@btnDangerBackground: #ee5f5b;
+@btnDangerBackgroundHighlight: #bd362f;
+
+@btnInverseBackground: #444;
+@btnInverseBackgroundHighlight: @grayDarker;
+
+
+// Forms
+// -------------------------
+@inputBackground: @white;
+@inputBorder: #ccc;
+@inputBorderRadius: @baseBorderRadius;
+@inputDisabledBackground: @grayLighter;
+@formActionsBackground: #f5f5f5;
+@inputHeight: @baseLineHeight + 10px; // base line-height + 8px vertical padding + 2px top/bottom border
+
+
+// Dropdowns
+// -------------------------
+@dropdownBackground: @white;
+@dropdownBorder: rgba(0,0,0,.2);
+@dropdownDividerTop: #e5e5e5;
+@dropdownDividerBottom: @white;
+
+@dropdownLinkColor: @grayDark;
+@dropdownLinkColorHover: @white;
+@dropdownLinkColorActive: @white;
+
+@dropdownLinkBackgroundActive: @linkColor;
+@dropdownLinkBackgroundHover: @dropdownLinkBackgroundActive;
+
+
+
+// COMPONENT VARIABLES
+// --------------------------------------------------
+
+
+// Z-index master list
+// -------------------------
+// Used for a bird's eye view of components dependent on the z-axis
+// Try to avoid customizing these :)
+@zindexDropdown: 1000;
+@zindexPopover: 1010;
+@zindexTooltip: 1030;
+@zindexFixedNavbar: 1030;
+@zindexModalBackdrop: 1040;
+@zindexModal: 1050;
+
+
+// Sprite icons path
+// -------------------------
+@iconSpritePath: "../img/glyphicons-halflings.png";
+@iconWhiteSpritePath: "../img/glyphicons-halflings-white.png";
+
+
+// Input placeholder text color
+// -------------------------
+@placeholderText: @grayLight;
+
+
+// Hr border color
+// -------------------------
+@hrBorder: @grayLighter;
+
+
+// Horizontal forms & lists
+// -------------------------
+@horizontalComponentOffset: 180px;
+
+
+// Wells
+// -------------------------
+@wellBackground: #f5f5f5;
+
+
+// Navbar
+// -------------------------
+@navbarCollapseWidth: 979px;
+@navbarCollapseDesktopWidth: @navbarCollapseWidth + 1;
+
+@navbarHeight: 40px;
+@navbarBackgroundHighlight: #ffffff;
+@navbarBackground: darken(@navbarBackgroundHighlight, 5%);
+@navbarBorder: darken(@navbarBackground, 12%);
+
+@navbarText: #777;
+@navbarLinkColor: #777;
+@navbarLinkColorHover: @grayDark;
+@navbarLinkColorActive: @gray;
+@navbarLinkBackgroundHover: transparent;
+@navbarLinkBackgroundActive: darken(@navbarBackground, 5%);
+
+@navbarBrandColor: @navbarLinkColor;
+
+// Inverted navbar
+@navbarInverseBackground: #111111;
+@navbarInverseBackgroundHighlight: #222222;
+@navbarInverseBorder: #252525;
+
+@navbarInverseText: @grayLight;
+@navbarInverseLinkColor: @grayLight;
+@navbarInverseLinkColorHover: @white;
+@navbarInverseLinkColorActive: @navbarInverseLinkColorHover;
+@navbarInverseLinkBackgroundHover: transparent;
+@navbarInverseLinkBackgroundActive: @navbarInverseBackground;
+
+@navbarInverseSearchBackground: lighten(@navbarInverseBackground, 25%);
+@navbarInverseSearchBackgroundFocus: @white;
+@navbarInverseSearchBorder: @navbarInverseBackground;
+@navbarInverseSearchPlaceholderColor: #ccc;
+
+@navbarInverseBrandColor: @navbarInverseLinkColor;
+
+
+// Pagination
+// -------------------------
+@paginationBackground: #fff;
+@paginationBorder: #ddd;
+@paginationActiveBackground: #f5f5f5;
+
+
+// Hero unit
+// -------------------------
+@heroUnitBackground: @grayLighter;
+@heroUnitHeadingColor: inherit;
+@heroUnitLeadColor: inherit;
+
+
+// Form states and alerts
+// -------------------------
+@warningText: #c09853;
+@warningBackground: #fcf8e3;
+@warningBorder: darken(spin(@warningBackground, -10), 3%);
+
+@errorText: #b94a48;
+@errorBackground: #f2dede;
+@errorBorder: darken(spin(@errorBackground, -10), 3%);
+
+@successText: #468847;
+@successBackground: #dff0d8;
+@successBorder: darken(spin(@successBackground, -10), 5%);
+
+@infoText: #3a87ad;
+@infoBackground: #d9edf7;
+@infoBorder: darken(spin(@infoBackground, -10), 7%);
+
+
+// Tooltips and popovers
+// -------------------------
+@tooltipColor: #fff;
+@tooltipBackground: #000;
+@tooltipArrowWidth: 5px;
+@tooltipArrowColor: @tooltipBackground;
+
+@popoverBackground: #fff;
+@popoverArrowWidth: 10px;
+@popoverArrowColor: #fff;
+@popoverTitleBackground: darken(@popoverBackground, 3%);
+
+// Special enhancement for popovers
+@popoverArrowOuterWidth: @popoverArrowWidth + 1;
+@popoverArrowOuterColor: rgba(0,0,0,.25);
+
+
+
+// GRID
+// --------------------------------------------------
+
+
+// Default 940px grid
+// -------------------------
+@gridColumns: 12;
+@gridColumnWidth: 60px;
+@gridGutterWidth: 20px;
+@gridRowWidth: (@gridColumns * @gridColumnWidth) + (@gridGutterWidth * (@gridColumns - 1));
+
+// 1200px min
+@gridColumnWidth1200: 70px;
+@gridGutterWidth1200: 30px;
+@gridRowWidth1200: (@gridColumns * @gridColumnWidth1200) + (@gridGutterWidth1200 * (@gridColumns - 1));
+
+// 768px-979px
+@gridColumnWidth768: 42px;
+@gridGutterWidth768: 20px;
+@gridRowWidth768: (@gridColumns * @gridColumnWidth768) + (@gridGutterWidth768 * (@gridColumns - 1));
+
+
+// Fluid grid
+// -------------------------
+@fluidGridColumnWidth: percentage(@gridColumnWidth/@gridRowWidth);
+@fluidGridGutterWidth: percentage(@gridGutterWidth/@gridRowWidth);
+
+// 1200px min
+@fluidGridColumnWidth1200: percentage(@gridColumnWidth1200/@gridRowWidth1200);
+@fluidGridGutterWidth1200: percentage(@gridGutterWidth1200/@gridRowWidth1200);
+
+// 768px-979px
+@fluidGridColumnWidth768: percentage(@gridColumnWidth768/@gridRowWidth768);
+@fluidGridGutterWidth768: percentage(@gridGutterWidth768/@gridRowWidth768);
diff --git a/library/font_awesome/src/assets/less/bootstrap-2.3.2/wells.less b/library/font_awesome/src/assets/less/bootstrap-2.3.2/wells.less
new file mode 100755
index 000000000..84a744b1c
--- /dev/null
+++ b/library/font_awesome/src/assets/less/bootstrap-2.3.2/wells.less
@@ -0,0 +1,29 @@
+//
+// Wells
+// --------------------------------------------------
+
+
+// Base class
+.well {
+ min-height: 20px;
+ padding: 19px;
+ margin-bottom: 20px;
+ background-color: @wellBackground;
+ border: 1px solid darken(@wellBackground, 7%);
+ .border-radius(@baseBorderRadius);
+ .box-shadow(inset 0 1px 1px rgba(0,0,0,.05));
+ blockquote {
+ border-color: #ddd;
+ border-color: rgba(0,0,0,.15);
+ }
+}
+
+// Sizes
+.well-large {
+ padding: 24px;
+ .border-radius(@borderRadiusLarge);
+}
+.well-small {
+ padding: 9px;
+ .border-radius(@borderRadiusSmall);
+}
diff --git a/library/font_awesome/src/assets/less/lazy.less b/library/font_awesome/src/assets/less/lazy.less
new file mode 100644
index 000000000..3c914de8c
--- /dev/null
+++ b/library/font_awesome/src/assets/less/lazy.less
@@ -0,0 +1,85 @@
+.padding-none { padding: 0 !important; }
+.padding { padding: 10px !important; }
+.padding-small { padding: 5px !important; }
+.padding-large { padding: 22px !important; }
+
+.padding-top-none { padding-top: 0 !important; }
+.padding-top { padding-top: 10px !important; }
+.padding-top-small { padding-top: 5px !important; }
+.padding-top-large { padding-top: 22px !important; }
+
+.padding-right-none { padding-right: 0 !important; }
+.padding-right { padding-right: 10px !important; }
+.padding-right-small { padding-right: 5px !important; }
+.padding-right-large { padding-right: 22px !important; }
+
+.padding-bottom-none { padding-bottom: 0 !important; }
+.padding-bottom { padding-bottom: 10px !important; }
+.padding-bottom-small { padding-bottom: 5px !important; }
+.padding-bottom-large { padding-bottom: 22px !important; }
+
+.padding-left-none { padding-left: 0 !important; }
+.padding-left { padding-left: 10px !important; }
+.padding-left-small { padding-left: 5px !important; }
+.padding-left-large { padding-left: 22px !important; }
+
+.margin-none { margin: 0 !important; }
+.margin { margin: 10px !important; }
+.margin-small { margin: 5px !important; }
+.margin-large { margin: 22px !important; }
+
+.margin-top-none { margin-top: 0 !important; }
+.margin-top { margin-top: 10px !important; }
+.margin-top-large { margin-top: 22px !important; }
+.margin-top-small { margin-top: 5px !important; }
+
+.margin-right-none { margin-right: 0 !important; }
+.margin-right { margin-right: 10px !important; }
+.margin-right-large { margin-right: 22px !important; }
+.margin-right-small { margin-right: 5px !important; }
+
+.margin-bottom-none { margin-bottom: 0 !important; }
+.margin-bottom { margin-bottom: 10px !important; }
+.margin-bottom-large { margin-bottom: 22px !important; }
+.margin-bottom-small { margin-bottom: 5px !important; }
+
+.margin-left-none { margin-left: 0 !important; }
+.margin-left { margin-left: 10px !important; }
+.margin-left-large { margin-left: 22px !important; }
+.margin-left-small { margin-left: 5px !important; }
+
+.border-left-none { border-left: none !important; }
+.border-right-none { border-right: none !important; }
+.border-bottom-none { border-bottom: none !important; }
+.border-top-none { border-top: none !important; }
+
+.display-block { display: block; } // use to swap an anchor tag to span a whole row to make click target larger
+.no-underline:hover { text-decoration: none; }
+.clickable { cursor: pointer; }
+.strong { font-weight: bold; }
+.em { font-style: italic; }
+.small { font-size: 85%; } // Ex: 14px base font * 85% = about 12px
+.no-link { color: @grayDark; }
+.text-sans-serif { font-family: @sansFontFamily; }
+.text-ellipsis { .text-overflow(); } // truncates text to a single line with an ellipsis at the end
+.text-default {
+ font-family: @sansFontFamily;
+ font-size: @baseFontSize;
+ line-height: @baseLineHeight;
+ font-weight: normal;
+}
+.hilite {
+ color: @linkColor;
+ &:hover {
+ color: @linkColorHover;
+ text-decoration: underline;
+ }
+ [class^="icon-"], [class*=" icon-"] {
+ &:before {
+ display: inline;
+ }
+ }
+}
+.strike { text-decoration: line-through; }
+.upper { text-transform: uppercase; }
+.lower { text-transform: lowercase; }
diff --git a/library/font_awesome/src/assets/less/mixins.less b/library/font_awesome/src/assets/less/mixins.less
new file mode 100644
index 000000000..2ae1efc89
--- /dev/null
+++ b/library/font_awesome/src/assets/less/mixins.less
@@ -0,0 +1,58 @@
+.gradient-text (@color: #808080, @color1: #999, @color2: #B3B3B3, @color3: #B3B3B3, @color4: #666) {
+ // fallback for browsers that don't support this
+// color: @color;
+
+ // makes simple gradient text in webkit browsers
+// background: -webkit-gradient(linear, left top, left bottom, from(@colorTop), to(@colorBottom));
+
+ // makes a more complex background, allowing iPhone-like text gradients
+ background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, @color1), color-stop(55%, @color2), color-stop(55%, @color3), color-stop(100%, @color4)); // Safari 4+, Chrome 2+
+ background-image: -webkit-linear-gradient(top, @color1 0%, @color2 55%, @color3 55%, @color4 100%); // Safari 5.1+, Chrome 10+
+
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+}
+
+// Mixin for generating button backgrounds
+// ---------------------------------------
+.buttonBackgroundThreeColors(@startColor, @midColor, @colorStop, @endColor) {
+ // gradientBar will set the background to a pleasing blend of these, to support IE<=9
+ #gradient > .vertical-three-colors(@startColor, @midColor, @colorStop, @endColor);
+ border-color: @startColor @startColor darken(@endColor, 15%);
+ border-color: rgba(0,0,0,.1) rgba(0,0,0,.1) fadein(rgba(0,0,0,.1), 15%);
+
+ .reset-filter();
+
+ // in these cases the gradient won't cover the background, so we override
+ &:hover, &:active, &.active, &.disabled, &[disabled] {
+ background-color: @endColor;
+ }
+
+ // IE 7 + 8 can't handle box-shadow to show active, so we darken a bit ourselves
+ &:active,
+ &.active {
+ background-color: darken(@endColor, 10%) e("\9");
+ }
+}
+
+.icon-size (@size: 14px, @width-multiplier: .9, @height-multiplier: 1) {
+ i { font-size: @size; }
+ line-height: @size * 1.1;
+ height: @size * @height-multiplier * 1.05;
+ text-align: center;
+}
+
+.sticky-footer (@footer-height: @baseLineHeight * 4, @footer-padding-top: 70px, @footer-padding-bottom: 70px, @footer-margin-top: 70px) {
+ .wrapper {
+ margin: 0 auto -(@footer-height + @footer-padding-bottom + @footer-padding-top + @footer-margin-top + 1);
+ }
+ .push {
+ height: @footer-height + @footer-padding-bottom + @footer-padding-top + @footer-margin-top + 1;
+ }
+
+ .footer {
+ margin-top: @footer-margin-top;
+ height: @footer-height;
+ padding: @footer-padding-top 0 @footer-padding-bottom;
+ }
+}
diff --git a/library/font_awesome/src/assets/less/responsive-1200px-min.less b/library/font_awesome/src/assets/less/responsive-1200px-min.less
new file mode 100755
index 000000000..6599595c1
--- /dev/null
+++ b/library/font_awesome/src/assets/less/responsive-1200px-min.less
@@ -0,0 +1,56 @@
+//
+// Responsive: Large desktop and up
+// --------------------------------------------------
+
+
+@media (min-width: 1200px) {
+
+ #iconCarousel {
+ @size: 290px;
+ font-size: @size;
+ line-height: @size + 5;
+ .carousel-control {
+ top: @size + 20px;
+ .square(30px);
+ font-size: 40px;
+ line-height: 35px;
+ left: 370/2 - 40px;
+ &.right {
+ right: 370/2 - 40px;
+ }
+ }
+ }
+
+ .jumbotron-index {
+ padding: 50px 0;
+ h1 { font-size: 100px; }
+ p {
+ font-size: 40px;
+ margin: 20px 0;
+ }
+ .btn-large {
+ font-size: 30px;
+ padding: 21px 35px;
+ }
+ .shameless-self-promotion {
+ margin-top: 30px;
+ }
+ }
+
+ .jumbotron-ad {
+ padding: 50px 0;
+ h1 { font-size: 90px; }
+ p {
+ font-size: 35px;
+ margin: 20px 0;
+ }
+ }
+
+ .stripe-ad .lead { margin-top: 7px; }
+
+ .lead {
+ font-size: 26px;
+ line-height: 36px;
+ }
+
+}
diff --git a/library/font_awesome/src/assets/less/responsive-767px-max.less b/library/font_awesome/src/assets/less/responsive-767px-max.less
new file mode 100755
index 000000000..38484c786
--- /dev/null
+++ b/library/font_awesome/src/assets/less/responsive-767px-max.less
@@ -0,0 +1,83 @@
+//
+// Responsive: Landscape phone to desktop/tablet
+// --------------------------------------------------
+
+
+@media (max-width: 767px) {
+ .jumbotron, footer, #social-buttons {
+ padding-left: 20px;
+ padding-right: 20px;
+ margin-right: -20px;
+ margin-left: -20px;
+ }
+
+ #iconCarousel {
+ @size: 180px;
+ font-size: @size;
+ line-height: @size;
+ width: 280px;
+ margin: 30px auto 0;
+ .carousel-control {
+ top: @size / 2;
+ .square(44px);
+ font-size: 44px;
+ line-height: 44px;
+ left: -7px;
+ &.right { right: -7px; }
+ }
+ }
+
+ .jumbotron-index {
+ h1 { font-size: 58px; }
+ p { font-size: 24px; }
+ .btn-large {
+ font-size: 20px;
+ padding: 14px 26px;
+ }
+ .shameless-self-promotion { font-size: 12px; }
+ }
+
+ .jumbotron-ad {
+ h1 { font-size: 39px; }
+ p {
+ font-size: 20px;
+ margin-bottom: 20px;
+ }
+ }
+
+ .jumbotron-icon {
+ .icon-1, .icon-2, .icon-3, .icon-4, .icon-5, .icon-6 { margin-right: 0; }
+ .icon-6 { font-size: 16em; }
+ h1 small {
+ display: block;
+ margin-top: 15px;
+ margin-left: 0;
+ line-height: 20px;
+ }
+ }
+
+ .stripe-ad .lead {
+ margin: 0 0 30px;
+ }
+
+ #carbonads-container {
+ margin-right: -20px;
+ margin-left: -20px;
+ .carbonad {
+ width: 100%;
+ height: 120px;
+ border-right: none;
+ border-left: none;
+ }
+ }
+ #azcarbon {
+ width: 300px;
+ margin: 0 auto;
+ }
+
+ .sticky-footer(170px, 40px, 40px, 60px); // sets default values for sticky footer
+ .footer {
+ padding-left: 20px;
+ padding-right: 20px;
+ }
+}
diff --git a/library/font_awesome/src/assets/less/responsive-768px-979px.less b/library/font_awesome/src/assets/less/responsive-768px-979px.less
new file mode 100755
index 000000000..e46a45c57
--- /dev/null
+++ b/library/font_awesome/src/assets/less/responsive-768px-979px.less
@@ -0,0 +1,67 @@
+//
+// Responsive: Tablet to desktop
+// --------------------------------------------------
+
+
+@media (min-width: 768px) and (max-width: 979px) {
+
+ #iconCarousel {
+ @size: 200px;
+ font-size: @size;
+ line-height: @size + 5;
+ .carousel-control {
+ top: @size + 30px;
+ .square(30px);
+ font-size: 40px;
+ line-height: 40px;
+ left: 228/2 - 40px;
+ &.right {
+ right: 228/2 - 40px;
+ }
+ }
+ }
+
+ .jumbotron-index {
+ padding: 50px 0;
+ h1 { font-size: 65px; }
+ p { font-size: 25px; }
+ .shameless-self-promotion { font-size: 12px; }
+ }
+
+ .jumbotron-ad {
+ p { font-size: 28px; }
+ }
+
+ .jumbotron-icon {
+ h1 small {
+ display: block;
+ margin-top: 15px;
+ margin-left: 0;
+ line-height: 20px;
+ }
+ }
+
+ .stripe-ad {
+ .lead {
+ margin: 0;
+ font-size: 19px;
+ }
+ @ad-width: 302px;
+ .span8 { width: 476px + 228px - @ad-width; }
+ .span4 { width: @ad-width; }
+ }
+
+ #why, #whats-new, #new-styles {
+ .span4 { width: 352px; }
+ }
+
+ .the-icons {
+ .span3 { width: 228px; }
+ }
+
+ .sticky-footer(110px, 40px, 40px, 60px); // sets default values for sticky footer
+ .footer {
+ padding-left: 20px;
+ padding-right: 20px;
+ }
+}
diff --git a/library/font_awesome/src/assets/less/responsive-navbar.less b/library/font_awesome/src/assets/less/responsive-navbar.less
new file mode 100755
index 000000000..b15033ed9
--- /dev/null
+++ b/library/font_awesome/src/assets/less/responsive-navbar.less
@@ -0,0 +1,11 @@
+//
+// Responsive: Navbar
+// --------------------------------------------------
+
+
+// TABLETS AND BELOW
+// -----------------
+@media (max-width: @navbarCollapseWidth) {
+
+
+}
diff --git a/library/font_awesome/src/assets/less/responsive.less b/library/font_awesome/src/assets/less/responsive.less
new file mode 100755
index 000000000..1838f2161
--- /dev/null
+++ b/library/font_awesome/src/assets/less/responsive.less
@@ -0,0 +1,55 @@
+---
+---
+/*!
+ * Bootstrap Responsive v2.3.2
+ *
+ * Copyright 2012 Twitter, Inc
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Designed and built with all the love in the world @twitter by @mdo and @fat.
+ */
+
+
+// Responsive.less
+// For phone and tablet devices
+// -------------------------------------------------------------
+
+
+// REPEAT VARIABLES & MIXINS
+// -------------------------
+// Required since we compile the responsive stuff separately
+
+@import "bootstrap-{{ site.bootstrap.version }}/variables.less"; // Modify this for custom colors, font-sizes, etc
+@import "bootstrap-{{ site.bootstrap.version }}/mixins.less";
+
+@import "variables.less"; // Modify this for custom colors, font-sizes, etc
+
+// RESPONSIVE CLASSES
+// ------------------
+
+@import "bootstrap-{{ site.bootstrap.version }}/responsive-utilities.less";
+
+
+// MEDIA QUERIES
+// ------------------
+
+// Large desktops
+@import "bootstrap-{{ site.bootstrap.version }}/responsive-1200px-min.less";
+@import "responsive-1200px-min.less";
+
+// Tablets to regular desktops
+@import "bootstrap-{{ site.bootstrap.version }}/responsive-768px-979px.less";
+@import "responsive-768px-979px.less";
+
+// Phones to portrait tablets and narrow desktops
+@import "bootstrap-{{ site.bootstrap.version }}/responsive-767px-max.less";
+@import "responsive-767px-max.less";
+
+
+// RESPONSIVE NAVBAR
+// ------------------
+
+// From 979px and below, show a button to toggle navbar contents
+@import "bootstrap-{{ site.bootstrap.version }}/responsive-navbar.less";
+@import "responsive-navbar.less";
diff --git a/library/font_awesome/src/assets/less/site.less b/library/font_awesome/src/assets/less/site.less
new file mode 100644
index 000000000..04b0beaa3
--- /dev/null
+++ b/library/font_awesome/src/assets/less/site.less
@@ -0,0 +1,354 @@
+---
+---
+@import "bootstrap-{{ site.bootstrap.version }}/bootstrap.less";
+@import "bootstrap-{{ site.bootstrap.version }}/responsive-utilities.less";
+@import "sticky-footer.less";
+
+@import "mixins.less";
+@import "variables.less";
+@import "lazy.less";
+
+.navbar .brand {
+ font-family: @serifFontFamily;
+ .icon-flag { padding-right: 3px; }
+}
+
+.navbar .nav > li > a { padding: 12px 10px 9px; }
+.navbar .nav.pull-right { margin-right: -10px; }
+//.navbar, .jumbotron, #social-buttons { min-width: 990px; } // necessary fix for non-responsive layouts
+
+h1, h2, h3, h4, h5, h6 { font-family: @serifFontFamily; }
+
+#iconCarousel {
+ a { color: @white; }
+ @size: 220px;
+ font-size: @size;
+ text-align: center;
+ line-height: @size + 5;
+ text-shadow: 2px 2px 3px @grayDarker;
+ .carousel-control {
+ top: @size + 33px;
+ .square(30px);
+ background: none;
+ border-width: 0;
+ font-size: 30px;
+ line-height: 25px;
+ left: 300/2 - 33px;
+ &.right {
+ left: auto;
+ right: 300/2 - 33px;
+ }
+ }
+}
+
+.jumbotron {
+ background: @red;
+ border-bottom: 1px solid @redDark;
+ &, h1 { color: @white; }
+ #gradient > .directional(@red, mix(@red, @redDark, 90%), -40deg);
+// background-color: @red;
+
+// &:after {
+// content:'';
+// display:block;
+// position:absolute;
+// top:0;
+// right:0;
+// bottom:0;
+// left:0;
+// background:url(../img/grain-tm400.png);
+// opacity:.5;
+// }
+
+ h1 {
+ font-size: 80px;
+ letter-spacing: -2px;
+ line-height: 1;
+ }
+ p {
+ margin-top: 15px;
+ margin-bottom: 15px;
+ font-size: 30px;
+ line-height: 1.3;
+ font-weight: lighter;
+ }
+ .actions { margin-top: 25px;}
+ text-shadow: 2px 2px 2px @grayDark;
+ ul {
+ margin-left: 50px;
+ li {
+ &.icon-large:before {
+ text-indent: -2em;
+ vertical-align: baseline;
+ }
+ font-size: 15px;
+ line-height: 30px;
+ text-shadow: 1px 1px 1px @grayDark;
+ }
+ }
+ .btn-large {
+ font-family: @serifFontFamily;
+ font-weight: 500;
+ font-size: 24px;
+ padding: 17px 30px;
+ letter-spacing: -1px;
+ }
+ .hero-content {
+ text-align: center;
+ }
+ .shameless-self-promotion {
+ font-size: 14px;
+ margin-top: 25px;
+ color: mix(@white, @red, 40%);
+ text-shadow: none;
+ a { color: mix(@white, @red, 70%); }
+ a:hover { color: mix(@white, @red, 100%); }
+ }
+}
+
+.jumbotron-index {
+ padding: 40px 0;
+ h1 {
+ font-size: 80px;
+ letter-spacing: -2px;
+ line-height: 1;
+ margin: 0 0 15px;
+ }
+ p {
+ margin-top: 15px;
+ margin-bottom: 15px;
+ font-size: 30px;
+ line-height: 1.3;
+ }
+}
+
+.jumbotron-ad {
+ padding: 20px 0;
+ h1 { margin-top: 25px; }
+ p { margin-bottom: 35px; }
+}
+
+.jumbotron-icon {
+ padding: 20px 0 30px;
+ #gradient > .directional(@grayLighter, mix(@grayLighter, @grayLight, 90%), -40deg);
+ color: @grayDarker;
+ text-shadow: 1px 1px 1px @white;
+ border-bottom: solid 1px mix(@grayLight, @grayLighter, 50%);
+
+ h1 {
+ color: @grayDarker;
+ font-size: 40px;
+ small {
+ letter-spacing: normal;
+ font-family: @sansFontFamily;
+ font-size: @baseFontSize;
+ margin-left: 20px;
+ }
+ }
+
+ .info-details {
+ float: left;
+ p {
+ margin: 25px 0;
+ font-weight: bold;
+ }
+ .dl-horizontal {
+ dt { width: @horizontalComponentOffset - 100; }
+ dd { margin-left: @horizontalComponentOffset - 85; }
+ }
+ }
+ .icon-2 { font-size: 2em; }
+ .icon-3 { font-size: 4em; }
+ .icon-4 { font-size: 7em; }
+ .icon-5 { font-size: 12em; }
+ .icon-6 { font-size: 20em; }
+
+ .icon-1, .icon-2, .icon-3, .icon-4, .icon-5, .icon-6 { margin-right: 1/14em; }
+}
+
+//.info-ad {
+// float: right;
+// width: 154px;
+// height: 219px;
+// margin-left: 15px;
+//}
+
+.stripe-ad {
+ margin-bottom: 22px;
+ .lead {
+ margin-top: 10px;
+ margin-right: 30px;
+ }
+}
+
+.btn-primary {
+ color: @grayDark;
+ text-shadow: 0 -1px 0 rgba(255,255,255,.25);
+ &:hover {
+ text-shadow: 0 -1px 0 rgba(255,255,255,.25);
+ color: @grayDark;
+ }
+}
+
+section { margin-top: 40px; }
+
+.stacked {
+ padding-top: 35px;
+ height: 105px;
+}
+
+#social-buttons {
+ ul.unstyled { margin: 0; }
+
+ padding: 22px 0 17px;
+ text-align: center;
+ background-color: #f5f5f5;
+ border-top: 1px solid #fff;
+ border-bottom: 1px solid #ddd;
+ .btn {
+// font-family: @serifFontFamily;
+ font-weight: bold;
+// font-size: @baseFontSize;
+ padding: 0px 5px;
+ line-height: @baseLineHeight - 3;
+ margin: 0;
+ }
+ .count.btn {
+ background: @white;
+ font-weight: normal;
+ }
+}
+
+.the-icons {
+ margin-top: 22px;
+ .span3 {
+ a {
+ display: block;
+ &, &:hover { color: @grayDarker; }
+
+ cursor: pointer;
+ line-height: 32px;
+ height: 32px;
+ padding-left: 10px;
+ .border-radius(6px);
+
+ [class^="icon-"],
+ [class*=" icon-"] {
+ width: 32px;
+ font-size: 14px;
+ display: inline-block;
+ text-align: right;
+ margin-right: 10px;
+ }
+
+ &:hover {
+ background-color: @errorBackground;
+ text-decoration: none;
+ [class^="icon-"], [class*=" icon-"] {
+ *font-size: 28px;
+ *vertical-align: middle;
+ }
+
+ [class^="icon-"]:before,
+ [class*=" icon-"]:before {
+ font-size: 28px;
+ vertical-align: -5px;
+ }
+ }
+ }
+ }
+}
+
+#why, #whats-new {
+ .span4 { margin-bottom: 20px; }
+ h4 {
+ [class^="icon-"]:before,
+ [class*=" icon-"]:before {
+ vertical-align: -10%;
+ font-size: 28px;
+ display: inline-block;
+ width: 30/28em;
+ text-align: center;
+ margin-right: 5px;
+// color: mix(@grayLight, @grayLighter, 70%);
+
+ // Gradient on the icons
+// background: -webkit-linear-gradient(mix(@grayLight, @grayLighter, 50%), mix(@gray, @grayLight, 50%));
+// -webkit-background-clip: text;
+// -webkit-text-fill-color: transparent;
+ }
+ }
+}
+
+
+.rating {
+ unicode-bidi: bidi-override;
+ direction: rtl;
+
+ font-size: 30px;
+ span.star {
+ font-family: FontAwesome;
+ font-weight: normal;
+ font-style: normal;
+ display: inline-block;
+ &:hover {
+ cursor: pointer;
+ }
+ }
+ span.star:before {
+ content: "\f006"; // empty star
+ padding-right: 5px;
+ color: @grayLight;
+ }
+
+ span.star:hover:before, span.star:hover ~ span.star:before {
+ content: "\f005"; // solid star
+ color: #e3cf7a;
+ }
+}
+
+
+.label,
+.badge {
+ background-color: @grayLighter;
+}
+
+.well.well-transparent {
+ background-color: transparent;
+}
+
+footer {
+// #gradient > .vertical(@navbarInverseBackgroundHighlight, @navbarInverseBackground);
+ background-color: @red;
+ border-top: 1px solid mix(@red, @redDark, 50%);
+ a {
+ color: @white;
+ text-shadow: 0 -1px 0 rgba(0,0,0,.25);
+ &:hover {
+ color: @white;
+ }
+
+ }
+
+ color: mix(@red, @white, 35%);
+ text-shadow: 0 -1px 0 rgba(0,0,0,.25);
+ margin-top: 60px;
+ padding-top: 45px;
+ padding-bottom: 60px;
+ *zoom: 1; // ie7 hack
+ ul {
+// margin-left: 30px;
+ line-height: 25px;
+ }
+
+ .project { margin-top: 10px; }
+}
+
+// makes dropdowns closer for split dropdown
+// Links
+.navbar .nav > li {
+ &.dropdown-split-right > a { padding-left: 7px; }
+ &.dropdown-split-left > a { padding-right: 0; }
+}
+
+@import "responsive.less";
diff --git a/library/font_awesome/src/assets/less/sticky-footer.less b/library/font_awesome/src/assets/less/sticky-footer.less
new file mode 100755
index 000000000..3b71ee3a9
--- /dev/null
+++ b/library/font_awesome/src/assets/less/sticky-footer.less
@@ -0,0 +1,17 @@
+//
+// Sticky Footer
+// --------------------------------------------------
+// make sure to set .sticky-footer()
+
+html, body {
+ height: 100%;
+}
+.wrapper {
+ min-height: 100%;
+ height: auto !important;
+ height: 100%;
+}
+
+//.footer { min-width: 990px; } // necessary fix for non-responsive layouts
+
+.sticky-footer(90px, 40px, 40px, 60px); // sets default values for sticky footer
diff --git a/library/font_awesome/src/assets/less/variables.less b/library/font_awesome/src/assets/less/variables.less
new file mode 100755
index 000000000..5b692ae1a
--- /dev/null
+++ b/library/font_awesome/src/assets/less/variables.less
@@ -0,0 +1,347 @@
+//
+// Variables
+// --------------------------------------------------
+
+
+// Global values
+// --------------------------------------------------
+
+
+// Grays
+// -------------------------
+@black: #000;
+@grayDarker: #222;
+@grayDark: #333;
+@gray: #555;
+@grayLight: #999;
+@grayLighter: #eee;
+@white: #fff;
+
+// Blues
+// -------------------------
+@blueDarker: #003366;
+@blueDark: #005f9b; // Pantone 3015 C;
+@blue: #009add; // Pantone 2925 C;
+@blueLight: #b8dcf2;
+@blueLighter: #f0f9ff;
+
+// Greens
+// -------------------------
+@greenDarker: #41683b;
+@greenDark: #678943;
+@green: #95bf52;
+@greenLight: #ddefbd;
+@greenLighter: #f3f9e8;
+
+// Reds
+// -------------------------
+@redDarker: #702222;
+@redDark: #ba4a4a;
+@red: #dd7373;
+@redLight: #f2adb1;
+@redLighter: #fff0f0;
+
+// Yellows
+// -------------------------
+@yellowDarker: #5b4411;
+@yellowDark: #cc9600;
+@yellow: #f9e27d;
+@yellowLight: #fff5bd;
+@yellowLighter: #fffcee;
+
+// Oranges
+// -------------------------
+@orangeDarker: #8c3900;
+@orangeDark: #cc5d11;
+@orange: #f4914e;
+@orangeLight: #ffd0a6;
+@orangeLighter: #fff4e6;
+
+// Purples
+// -------------------------
+@purpleDarker: #4a226d;
+@purpleDark: #7457ad;
+@purple: #9780d6;
+@purpleLight: #c3b8f4;
+@purpleLighter: #fbf5ff;
+
+
+// Accent colors
+// -------------------------
+@red: #9d261d;
+@redDark: darken(@red, 10%);
+
+
+// Scaffolding
+// -------------------------
+@bodyBackground: @white;
+@textColor: @grayDark;
+
+
+// Links
+// -------------------------
+@linkColor: lighten(@red, 10%);
+@linkColorHover: @red;
+
+
+// Typography
+// -------------------------
+@sansFontFamily: proxima-nova, "Helvetica Neue", Helvetica, Arial, sans-serif;
+@serifFontFamily: museo-slab, "Helvetica Neue", Helvetica, Arial, sans-serif;
+@monoFontFamily: Menlo, Monaco, Consolas, "Courier New", monospace;
+
+@baseFontSize: 14px;
+@baseFontFamily: @sansFontFamily;
+@baseLineHeight: 20px;
+@altFontFamily: @serifFontFamily;
+
+@headingsFontFamily: inherit; // empty to use BS default, @baseFontFamily
+@headingsFontWeight: 500; // instead of browser default, bold
+@headingsColor: inherit; // empty to use BS default, @textColor
+
+
+// Component sizing
+// -------------------------
+// Based on 14px font-size and 20px line-height
+
+@fontSizeLarge: @baseFontSize * 1.25; // ~18px
+@fontSizeSmall: @baseFontSize * 0.85; // ~12px
+@fontSizeMini: @baseFontSize * 0.75; // ~11px
+
+@paddingLarge: 11px 19px; // 44px
+@paddingSmall: 2px 10px; // 26px
+@paddingMini: 0 6px; // 22px
+
+@baseBorderRadius: 4px;
+@borderRadiusLarge: 6px;
+@borderRadiusSmall: 3px;
+
+
+// Tables
+// -------------------------
+@tableBackground: transparent; // overall background-color
+@tableBackgroundAccent: #f9f9f9; // for striping
+@tableBackgroundHover: #f5f5f5; // for hover
+@tableBorder: #ddd; // table and cell border
+
+// Buttons
+// -------------------------
+@btnBackground: @white;
+@btnBackgroundHighlight: darken(@white, 10%);
+@btnBorder: #bbb;
+
+@btnPrimaryBackground: #fffeb8;
+@btnPrimaryBackgroundHighlight: #c49c38;
+
+@btnInfoBackground: @blue;
+@btnInfoBackgroundHighlight: mix(@blue, @blueDark, 50%);
+
+@btnSuccessBackground: @green;
+@btnSuccessBackgroundHighlight: @greenDark;
+
+@btnWarningBackground: @yellow;
+@btnWarningBackgroundHighlight: @yellowDark;
+
+@btnDangerBackground: lighten(@red, 20%);
+@btnDangerBackgroundHighlight: lighten(@red, 5%);
+
+@btnInverseBackground: #444;
+@btnInverseBackgroundHighlight: @grayDarker;
+
+
+// Forms
+// -------------------------
+@inputBackground: @white;
+@inputBorder: #ccc;
+@inputBorderRadius: @baseBorderRadius;
+@inputDisabledBackground: @grayLighter;
+@formActionsBackground: #f5f5f5;
+@inputHeight: @baseLineHeight + 10px; // base line-height + 8px vertical padding + 2px top/bottom border
+
+
+// Dropdowns
+// -------------------------
+@dropdownBackground: @white;
+@dropdownBorder: rgba(0,0,0,.2);
+@dropdownDividerTop: #e5e5e5;
+@dropdownDividerBottom: @white;
+
+@dropdownLinkColor: @grayDark;
+@dropdownLinkColorHover: @white;
+@dropdownLinkColorActive: @white;
+
+@dropdownLinkBackgroundActive: @linkColor;
+@dropdownLinkBackgroundHover: @dropdownLinkBackgroundActive;
+
+
+
+// COMPONENT VARIABLES
+// --------------------------------------------------
+
+
+// Z-index master list
+// -------------------------
+// Used for a bird's eye view of components dependent on the z-axis
+// Try to avoid customizing these :)
+@zindexDropdown: 1000;
+@zindexPopover: 1010;
+@zindexTooltip: 1030;
+@zindexFixedNavbar: 1030;
+@zindexModalBackdrop: 1040;
+@zindexModal: 1050;
+
+
+// Sprite icons path
+// -------------------------
+@iconSpritePath: "../img/glyphicons-halflings.png";
+@iconWhiteSpritePath: "../img/glyphicons-halflings-white.png";
+
+
+// Input placeholder text color
+// -------------------------
+@placeholderText: @grayLight;
+
+
+// Hr border color
+// -------------------------
+@hrBorder: @grayLighter;
+
+
+// Horizontal forms & lists
+// -------------------------
+@horizontalComponentOffset: 180px;
+
+
+// Wells
+// -------------------------
+@wellBackground: #f5f5f5;
+
+
+// Navbar
+// -------------------------
+@navbarCollapseWidth: 767px;
+@navbarCollapseDesktopWidth: @navbarCollapseWidth + 1;
+
+@navbarHeight: 40px;
+@navbarBackgroundHighlight: #ffffff;
+@navbarBackground: darken(@navbarBackgroundHighlight, 5%);
+@navbarBorder: darken(@navbarBackground, 12%);
+
+@navbarText: #777;
+@navbarLinkColor: #777;
+@navbarLinkColorHover: @grayDark;
+@navbarLinkColorActive: @gray;
+@navbarLinkBackgroundHover: transparent;
+@navbarLinkBackgroundActive: darken(@navbarBackground, 5%);
+
+@navbarBrandColor: @navbarLinkColor;
+
+// Inverted navbar
+@navbarInverseBackground: #111111;
+@navbarInverseBackgroundHighlight: #222222;
+@navbarInverseBorder: #252525;
+
+@navbarInverseText: @grayLight;
+@navbarInverseLinkColor: @grayLight;
+@navbarInverseLinkColorHover: @white;
+@navbarInverseLinkColorActive: @navbarInverseLinkColorHover;
+@navbarInverseLinkBackgroundHover: transparent;
+@navbarInverseLinkBackgroundActive: @navbarInverseBackground;
+
+@navbarInverseSearchBackground: lighten(@navbarInverseBackground, 25%);
+@navbarInverseSearchBackgroundFocus: @white;
+@navbarInverseSearchBorder: @navbarInverseBackground;
+@navbarInverseSearchPlaceholderColor: #ccc;
+
+@navbarInverseBrandColor: @navbarInverseLinkColor;
+
+
+// Pagination
+// -------------------------
+@paginationBackground: #fff;
+@paginationBorder: #ddd;
+@paginationActiveBackground: #f5f5f5;
+
+
+// Hero unit
+// -------------------------
+@heroUnitBackground: @grayLighter;
+@heroUnitHeadingColor: inherit;
+@heroUnitLeadColor: inherit;
+
+
+// Form states and alerts
+// -------------------------
+@warningText: mix(@yellowDark, @yellowDarker, 80%);
+@warningBackground: @yellowLighter;
+@warningBorder: darken(spin(@warningBackground, -10), 7%);
+
+@errorText: @red;
+@errorBackground: @redLighter;
+@errorBorder: darken(spin(@errorBackground, -10), 4%);
+
+@successText: mix(@greenDarker, @greenDark, 30%);
+@successBackground: @greenLighter;
+@successBorder: darken(spin(@successBackground, -10), 13%);
+
+@infoText: mix(@blueDark, @blue, 50%);
+@infoBackground: @blueLighter;
+@infoBorder: darken(spin(@infoBackground, -10), 7%);
+
+@inverseText: @white;
+@inverseBackground: @gray;
+@inverseBorder: darken(spin(@inverseBackground, -10), 7%);
+
+
+// Tooltips and popovers
+// -------------------------
+@tooltipColor: #fff;
+@tooltipBackground: #000;
+@tooltipArrowWidth: 5px;
+@tooltipArrowColor: @tooltipBackground;
+
+@popoverBackground: #fff;
+@popoverArrowWidth: 10px;
+@popoverArrowColor: #fff;
+@popoverTitleBackground: darken(@popoverBackground, 3%);
+
+// Special enhancement for popovers
+@popoverArrowOuterWidth: @popoverArrowWidth + 1;
+@popoverArrowOuterColor: rgba(0,0,0,.25);
+
+
+
+// GRID
+// --------------------------------------------------
+
+
+// Default 940px grid
+// -------------------------
+@gridColumns: 12;
+@gridColumnWidth: 60px;
+@gridGutterWidth: 20px;
+@gridRowWidth: (@gridColumns * @gridColumnWidth) + (@gridGutterWidth * (@gridColumns - 1));
+
+// 1200px min
+@gridColumnWidth1200: 70px;
+@gridGutterWidth1200: 30px;
+@gridRowWidth1200: (@gridColumns * @gridColumnWidth1200) + (@gridGutterWidth1200 * (@gridColumns - 1));
+
+// 768px-979px
+@gridColumnWidth768: 42px;
+@gridGutterWidth768: 20px;
+@gridRowWidth768: (@gridColumns * @gridColumnWidth768) + (@gridGutterWidth768 * (@gridColumns - 1));
+
+
+// Fluid grid
+// -------------------------
+@fluidGridColumnWidth: percentage(@gridColumnWidth/@gridRowWidth);
+@fluidGridGutterWidth: percentage(@gridGutterWidth/@gridRowWidth);
+
+// 1200px min
+@fluidGridColumnWidth1200: percentage(@gridColumnWidth1200/@gridRowWidth1200);
+@fluidGridGutterWidth1200: percentage(@gridGutterWidth1200/@gridRowWidth1200);
+
+// 768px-979px
+@fluidGridColumnWidth768: percentage(@gridColumnWidth768/@gridRowWidth768);
+@fluidGridGutterWidth768: percentage(@gridGutterWidth768/@gridRowWidth768);
diff --git a/library/font_awesome/src/cheatsheet.html b/library/font_awesome/src/cheatsheet.html
new file mode 100644
index 000000000..7a843b971
--- /dev/null
+++ b/library/font_awesome/src/cheatsheet.html
@@ -0,0 +1,14 @@
+---
+layout: base
+title: Font Awesome Cheatsheet
+relative_path: ../
+---
+{% capture jumbotron_h1 %}<i class="icon-list-ul icon-large"></i>&nbsp; Cheatsheet{% endcapture %}
+{% capture jumbotron_p %}The complete Font Awesome {{ site.fontawesome.version }} icon reference{% endcapture %}
+
+{% include jumbotron.html %}
+{% include stripe-social.html %}
+
+<div class="container">
+ {% include cheatsheet.html %}
+</div>
diff --git a/library/font_awesome/src/community.html b/library/font_awesome/src/community.html
new file mode 100644
index 000000000..c3c466e47
--- /dev/null
+++ b/library/font_awesome/src/community.html
@@ -0,0 +1,15 @@
+---
+layout: base
+title: The Font Awesome Community
+navbar_active: community
+relative_path: ../
+---
+{% capture jumbotron_h1 %}<i class="icon-thumbs-up-alt icon-large"></i>&nbsp; Community{% endcapture %}
+{% capture jumbotron_p %}Lots of ways to get involved with Font Awesome{% endcapture %}
+
+{% include jumbotron.html %}
+{% include stripe-social.html %}
+
+<div class="container">
+ {% include community.html %}
+</div>
diff --git a/library/font_awesome/src/design.html b/library/font_awesome/src/design.html
new file mode 100644
index 000000000..9c5830d74
--- /dev/null
+++ b/library/font_awesome/src/design.html
@@ -0,0 +1 @@
+<META HTTP-EQUIV=REFRESH CONTENT="0; URL=cheatsheet/">
diff --git a/library/font_awesome/src/examples.html b/library/font_awesome/src/examples.html
new file mode 100644
index 000000000..07253b267
--- /dev/null
+++ b/library/font_awesome/src/examples.html
@@ -0,0 +1,15 @@
+---
+layout: base
+title: Font Awesome Examples
+navbar_active: examples
+relative_path: ../
+---
+{% capture jumbotron_h1 %}<i class="icon-magic icon-large"></i>&nbsp; Examples{% endcapture %}
+{% capture jumbotron_p %}Lots of easy ways to use Font Awesome{% endcapture %}
+
+{% include jumbotron.html %}
+{% include stripe-social.html %}
+
+<div class="container">
+ {% include examples.html %}
+</div>
diff --git a/library/font_awesome/src/get-started.html b/library/font_awesome/src/get-started.html
new file mode 100644
index 000000000..31e204932
--- /dev/null
+++ b/library/font_awesome/src/get-started.html
@@ -0,0 +1,15 @@
+---
+layout: base
+title: Get Started with Font Awesome
+navbar_active: get-started
+relative_path: ../
+---
+{% capture jumbotron_h1 %}<i class="icon-cogs icon-large"></i>&nbsp; Get Started{% endcapture %}
+{% capture jumbotron_p %}Easy ways to get Font Awesome {{ site.fontawesome.version }} onto your website{% endcapture %}
+
+{% include jumbotron.html %}
+{% include stripe-social.html %}
+
+<div class="container">
+ {% include get-started.html %}
+</div>
diff --git a/library/font_awesome/src/icons.html b/library/font_awesome/src/icons.html
new file mode 100644
index 000000000..6dc589d8c
--- /dev/null
+++ b/library/font_awesome/src/icons.html
@@ -0,0 +1,15 @@
+---
+layout: base
+title: Font Awesome Icons
+navbar_active: icons
+relative_path: ../
+---
+{% capture jumbotron_h1 %}<i class="icon-flag icon-large"></i>&nbsp; The Icons{% endcapture %}
+{% capture jumbotron_p %}The complete set of {{ icons | size }} icons in Font Awesome {{ site.fontawesome.version }}{% endcapture %}
+
+{% include jumbotron.html %}
+{% include stripe-social.html %}
+
+<div class="container">
+ {% include icons.html %}
+</div>
diff --git a/library/font_awesome/src/icons.yml b/library/font_awesome/src/icons.yml
new file mode 100644
index 000000000..c3c8f531a
--- /dev/null
+++ b/library/font_awesome/src/icons.yml
@@ -0,0 +1,2590 @@
+icons:
+ - name: Glass
+ id: glass
+ unicode: f000
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: Music
+ id: music
+ unicode: f001
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: Search
+ id: search
+ unicode: f002
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: Envelope Alt
+ id: envelope-alt
+ unicode: f003
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: Heart
+ id: heart
+ unicode: f004
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: Star
+ id: star
+ unicode: f005
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: Star Empty
+ id: star-empty
+ unicode: f006
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: User
+ id: user
+ unicode: f007
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: Film
+ id: film
+ unicode: f008
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: th-large
+ id: th-large
+ unicode: f009
+ created: 1.0
+ categories:
+ - Text Editor Icons
+
+ - name: th
+ id: th
+ unicode: f00a
+ created: 1.0
+ categories:
+ - Text Editor Icons
+
+ - name: th-list
+ id: th-list
+ unicode: f00b
+ created: 1.0
+ categories:
+ - Text Editor Icons
+
+ - name: OK
+ id: ok
+ unicode: f00c
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: Remove
+ id: remove
+ unicode: f00d
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: Zoom In
+ id: zoom-in
+ unicode: f00e
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+
+ - name: Zoom Out
+ id: zoom-out
+ unicode: f010
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: Off
+ id: 'off'
+ unicode: f011
+ created: 1.0
+ aliases:
+ - power-off
+ categories:
+ - Web Application Icons
+
+ - name: signal
+ id: signal
+ unicode: f012
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: cog
+ id: cog
+ unicode: f013
+ created: 1.0
+ aliases:
+ - gear
+ categories:
+ - Web Application Icons
+
+ - name: trash
+ id: trash
+ unicode: f014
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: home
+ id: home
+ unicode: f015
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: file-alt
+ id: file-alt
+ unicode: f016
+ created: 1.0
+ categories:
+ - Text Editor Icons
+
+ - name: time
+ id: time
+ unicode: f017
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: road
+ id: road
+ unicode: f018
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: download-alt
+ id: download-alt
+ unicode: f019
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: download
+ id: download
+ unicode: f01a
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: upload
+ id: upload
+ unicode: f01b
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: inbox
+ id: inbox
+ unicode: f01c
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: play-circle
+ id: play-circle
+ unicode: f01d
+ created: 1.0
+ categories:
+ - Video Player Icons
+
+ - name: repeat
+ id: repeat
+ unicode: f01e
+ created: 1.0
+ aliases:
+ - rotate-right
+ categories:
+ - Text Editor Icons
+
+
+ - name: refresh
+ id: refresh
+ unicode: f021
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: list-alt
+ id: list-alt
+ unicode: f022
+ created: 1.0
+ categories:
+ - Text Editor Icons
+
+ - name: lock
+ id: lock
+ unicode: f023
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: flag
+ id: flag
+ unicode: f024
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: headphones
+ id: headphones
+ unicode: f025
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: volume-off
+ id: volume-off
+ unicode: f026
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: volume-down
+ id: volume-down
+ unicode: f027
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: volume-up
+ id: volume-up
+ unicode: f028
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: qrcode
+ id: qrcode
+ unicode: f029
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: barcode
+ id: barcode
+ unicode: f02a
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: tag
+ id: tag
+ unicode: f02b
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: tags
+ id: tags
+ unicode: f02c
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: book
+ id: book
+ unicode: f02d
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: bookmark
+ id: bookmark
+ unicode: f02e
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: print
+ id: print
+ unicode: f02f
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+
+ - name: camera
+ id: camera
+ unicode: f030
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: font
+ id: font
+ unicode: f031
+ created: 1.0
+ categories:
+ - Text Editor Icons
+
+ - name: bold
+ id: bold
+ unicode: f032
+ created: 1.0
+ categories:
+ - Text Editor Icons
+
+ - name: italic
+ id: italic
+ unicode: f033
+ created: 1.0
+ categories:
+ - Text Editor Icons
+
+ - name: text-height
+ id: text-height
+ unicode: f034
+ created: 1.0
+ categories:
+ - Text Editor Icons
+
+ - name: text-width
+ id: text-width
+ unicode: f035
+ created: 1.0
+ categories:
+ - Text Editor Icons
+
+ - name: align-left
+ id: align-left
+ unicode: f036
+ created: 1.0
+ categories:
+ - Text Editor Icons
+
+ - name: align-center
+ id: align-center
+ unicode: f037
+ created: 1.0
+ categories:
+ - Text Editor Icons
+
+ - name: align-right
+ id: align-right
+ unicode: f038
+ created: 1.0
+ categories:
+ - Text Editor Icons
+
+ - name: align-justify
+ id: align-justify
+ unicode: f039
+ created: 1.0
+ categories:
+ - Text Editor Icons
+
+ - name: list
+ id: list
+ unicode: f03a
+ created: 1.0
+ categories:
+ - Text Editor Icons
+
+ - name: indent-left
+ id: indent-left
+ unicode: f03b
+ created: 1.0
+ categories:
+ - Text Editor Icons
+
+ - name: indent-right
+ id: indent-right
+ unicode: f03c
+ created: 1.0
+ categories:
+ - Text Editor Icons
+
+ - name: facetime-video
+ id: facetime-video
+ unicode: f03d
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: picture
+ id: picture
+ unicode: f03e
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+
+ - name: pencil
+ id: pencil
+ unicode: f040
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: map-marker
+ id: map-marker
+ unicode: f041
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: adjust
+ id: adjust
+ unicode: f042
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: tint
+ id: tint
+ unicode: f043
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: edit
+ id: edit
+ unicode: f044
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: share
+ id: share
+ unicode: f045
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: check
+ id: check
+ unicode: f046
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: move
+ id: move
+ unicode: f047
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: step-backward
+ id: step-backward
+ unicode: f048
+ created: 1.0
+ categories:
+ - Video Player Icons
+
+ - name: fast-backward
+ id: fast-backward
+ unicode: f049
+ created: 1.0
+ categories:
+ - Video Player Icons
+
+ - name: backward
+ id: backward
+ unicode: f04a
+ created: 1.0
+ categories:
+ - Video Player Icons
+
+ - name: play
+ id: play
+ unicode: f04b
+ created: 1.0
+ categories:
+ - Video Player Icons
+
+ - name: pause
+ id: pause
+ unicode: f04c
+ created: 1.0
+ categories:
+ - Video Player Icons
+
+ - name: stop
+ id: stop
+ unicode: f04d
+ created: 1.0
+ categories:
+ - Video Player Icons
+
+ - name: forward
+ id: forward
+ unicode: f04e
+ created: 1.0
+ categories:
+ - Video Player Icons
+
+
+ - name: fast-forward
+ id: fast-forward
+ unicode: f050
+ created: 1.0
+ categories:
+ - Video Player Icons
+
+ - name: step-forward
+ id: step-forward
+ unicode: f051
+ created: 1.0
+ categories:
+ - Video Player Icons
+
+ - name: eject
+ id: eject
+ unicode: f052
+ created: 1.0
+ categories:
+ - Video Player Icons
+
+ - name: chevron-left
+ id: chevron-left
+ unicode: f053
+ created: 1.0
+ categories:
+ - Directional Icons
+
+ - name: chevron-right
+ id: chevron-right
+ unicode: f054
+ created: 1.0
+ categories:
+ - Directional Icons
+
+ - name: plus-sign
+ id: plus-sign
+ unicode: f055
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: minus-sign
+ id: minus-sign
+ unicode: f056
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: remove-sign
+ id: remove-sign
+ unicode: f057
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: ok-sign
+ id: ok-sign
+ unicode: f058
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: question-sign
+ id: question-sign
+ unicode: f059
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: info-sign
+ id: info-sign
+ unicode: f05a
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: screenshot
+ id: screenshot
+ unicode: f05b
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: remove-circle
+ id: remove-circle
+ unicode: f05c
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: ok-circle
+ id: ok-circle
+ unicode: f05d
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: ban-circle
+ id: ban-circle
+ unicode: f05e
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+
+ - name: arrow-left
+ id: arrow-left
+ unicode: f060
+ created: 1.0
+ categories:
+ - Directional Icons
+
+ - name: arrow-right
+ id: arrow-right
+ unicode: f061
+ created: 1.0
+ categories:
+ - Directional Icons
+
+ - name: arrow-up
+ id: arrow-up
+ unicode: f062
+ created: 1.0
+ categories:
+ - Directional Icons
+
+ - name: arrow-down
+ id: arrow-down
+ unicode: f063
+ created: 1.0
+ categories:
+ - Directional Icons
+
+ - name: share-alt
+ id: share-alt
+ unicode: f064
+ created: 1.0
+ aliases:
+ - mail-forward
+ categories:
+ - Web Application Icons
+
+ - name: resize-full
+ id: resize-full
+ unicode: f065
+ created: 1.0
+ categories:
+ - Video Player Icons
+
+ - name: resize-small
+ id: resize-small
+ unicode: f066
+ created: 1.0
+ categories:
+ - Video Player Icons
+
+ - name: plus
+ id: plus
+ unicode: f067
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: minus
+ id: minus
+ unicode: f068
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: asterisk
+ id: asterisk
+ unicode: f069
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: exclamation-sign
+ id: exclamation-sign
+ unicode: f06a
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: gift
+ id: gift
+ unicode: f06b
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: leaf
+ id: leaf
+ unicode: f06c
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: fire
+ id: fire
+ unicode: f06d
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: eye-open
+ id: eye-open
+ unicode: f06e
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+
+ - name: eye-close
+ id: eye-close
+ unicode: f070
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: warning-sign
+ id: warning-sign
+ unicode: f071
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: plane
+ id: plane
+ unicode: f072
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: calendar
+ id: calendar
+ unicode: f073
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: random
+ id: random
+ unicode: f074
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: comment
+ id: comment
+ unicode: f075
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: magnet
+ id: magnet
+ unicode: f076
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: chevron-up
+ id: chevron-up
+ unicode: f077
+ created: 1.0
+ categories:
+ - Directional Icons
+
+ - name: chevron-down
+ id: chevron-down
+ unicode: f078
+ created: 1.0
+ categories:
+ - Directional Icons
+
+ - name: retweet
+ id: retweet
+ unicode: f079
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: shopping-cart
+ id: shopping-cart
+ unicode: f07a
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: folder-close
+ id: folder-close
+ unicode: f07b
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: folder-open
+ id: folder-open
+ unicode: f07c
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: resize-vertical
+ id: resize-vertical
+ unicode: f07d
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: resize-horizontal
+ id: resize-horizontal
+ unicode: f07e
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+
+ - name: bar-chart
+ id: bar-chart
+ unicode: f080
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: twitter-sign
+ id: twitter-sign
+ unicode: f081
+ created: 1.0
+ categories:
+ - Brand Icons
+
+ - name: facebook-sign
+ id: facebook-sign
+ unicode: f082
+ created: 1.0
+ categories:
+ - Brand Icons
+
+ - name: camera-retro
+ id: camera-retro
+ unicode: f083
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: key
+ id: key
+ unicode: f084
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: cogs
+ id: cogs
+ unicode: f085
+ created: 1.0
+ aliases:
+ - gears
+ categories:
+ - Web Application Icons
+
+ - name: comments
+ id: comments
+ unicode: f086
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: thumbs-up-alt
+ id: thumbs-up-alt
+ unicode: f087
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: thumbs-down-alt
+ id: thumbs-down-alt
+ unicode: f088
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: star-half
+ id: star-half
+ unicode: f089
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: heart-empty
+ id: heart-empty
+ unicode: f08a
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: signout
+ id: signout
+ unicode: f08b
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: linkedin-sign
+ id: linkedin-sign
+ unicode: f08c
+ created: 1.0
+ categories:
+ - Brand Icons
+
+ - name: pushpin
+ id: pushpin
+ unicode: f08d
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: external-link
+ id: external-link
+ unicode: f08e
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+
+ - name: signin
+ id: signin
+ unicode: f090
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: trophy
+ id: trophy
+ unicode: f091
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: github-sign
+ id: github-sign
+ unicode: f092
+ created: 1.0
+ categories:
+ - Brand Icons
+
+ - name: upload-alt
+ id: upload-alt
+ unicode: f093
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: lemon
+ id: lemon
+ unicode: f094
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: phone
+ id: phone
+ unicode: f095
+ created: 2.0
+ categories:
+ - Web Application Icons
+
+ - name: check-empty
+ id: check-empty
+ unicode: f096
+ created: 2.0
+ aliases:
+ - unchecked
+ categories:
+ - Web Application Icons
+
+ - name: bookmark-empty
+ id: bookmark-empty
+ unicode: f097
+ created: 2.0
+ categories:
+ - Web Application Icons
+
+ - name: phone-sign
+ id: phone-sign
+ unicode: f098
+ created: 2.0
+ categories:
+ - Web Application Icons
+
+ - name: twitter
+ id: twitter
+ unicode: f099
+ created: 2.0
+ categories:
+ - Brand Icons
+
+ - name: facebook
+ id: facebook
+ unicode: f09a
+ created: 2.0
+ categories:
+ - Brand Icons
+
+ - name: github
+ id: github
+ unicode: f09b
+ created: 2.0
+ categories:
+ - Brand Icons
+
+ - name: unlock
+ id: unlock
+ unicode: f09c
+ created: 2.0
+ categories:
+ - Web Application Icons
+
+ - name: credit-card
+ id: credit-card
+ unicode: f09d
+ created: 2.0
+ categories:
+ - Web Application Icons
+
+ - name: rss
+ id: rss
+ unicode: f09e
+ created: 2.0
+ categories:
+ - Web Application Icons
+
+
+ - name: hdd
+ id: hdd
+ unicode: f0a0
+ created: 2.0
+ categories:
+ - Web Application Icons
+
+ - name: bullhorn
+ id: bullhorn
+ unicode: f0a1
+ created: 2.0
+ categories:
+ - Web Application Icons
+
+ - name: bell
+ id: bell
+ unicode: f0a2
+ created: 2.0
+ categories:
+ - Web Application Icons
+
+ - name: certificate
+ id: certificate
+ unicode: f0a3
+ created: 2.0
+ categories:
+ - Web Application Icons
+
+ - name: hand-right
+ id: hand-right
+ unicode: f0a4
+ created: 2.0
+ categories:
+ - Directional Icons
+
+ - name: hand-left
+ id: hand-left
+ unicode: f0a5
+ created: 2.0
+ categories:
+ - Directional Icons
+
+ - name: hand-up
+ id: hand-up
+ unicode: f0a6
+ created: 2.0
+ categories:
+ - Directional Icons
+
+ - name: hand-down
+ id: hand-down
+ unicode: f0a7
+ created: 2.0
+ categories:
+ - Directional Icons
+
+ - name: circle-arrow-left
+ id: circle-arrow-left
+ unicode: f0a8
+ created: 2.0
+ categories:
+ - Directional Icons
+
+ - name: circle-arrow-right
+ id: circle-arrow-right
+ unicode: f0a9
+ created: 2.0
+ categories:
+ - Directional Icons
+
+ - name: circle-arrow-up
+ id: circle-arrow-up
+ unicode: f0aa
+ created: 2.0
+ categories:
+ - Directional Icons
+
+ - name: circle-arrow-down
+ id: circle-arrow-down
+ unicode: f0ab
+ created: 2.0
+ categories:
+ - Directional Icons
+
+ - name: globe
+ id: globe
+ unicode: f0ac
+ created: 2.0
+ categories:
+ - Web Application Icons
+
+ - name: wrench
+ id: wrench
+ unicode: f0ad
+ created: 2.0
+ categories:
+ - Web Application Icons
+
+ - name: tasks
+ id: tasks
+ unicode: f0ae
+ created: 2.0
+ categories:
+ - Web Application Icons
+
+
+ - name: filter
+ id: filter
+ unicode: f0b0
+ created: 2.0
+ categories:
+ - Web Application Icons
+
+ - name: briefcase
+ id: briefcase
+ unicode: f0b1
+ created: 2.0
+ categories:
+ - Web Application Icons
+
+ - name: fullscreen
+ id: fullscreen
+ unicode: f0b2
+ created: 2.0
+ categories:
+ - Video Player Icons
+
+
+ - name: group
+ id: group
+ unicode: f0c0
+ created: 2.0
+ categories:
+ - Web Application Icons
+
+ - name: link
+ id: link
+ unicode: f0c1
+ created: 2.0
+ categories:
+ - Text Editor Icons
+
+ - name: cloud
+ id: cloud
+ unicode: f0c2
+ created: 2.0
+ categories:
+ - Web Application Icons
+
+ - name: beaker
+ id: beaker
+ unicode: f0c3
+ created: 2.0
+ categories:
+ - Web Application Icons
+
+ - name: cut
+ id: cut
+ unicode: f0c4
+ created: 2.0
+ categories:
+ - Text Editor Icons
+
+ - name: copy
+ id: copy
+ unicode: f0c5
+ created: 2.0
+ categories:
+ - Text Editor Icons
+
+ - name: paper-clip
+ id: paper-clip
+ unicode: f0c6
+ created: 2.0
+ aliases:
+ - paperclip
+ categories:
+ - Text Editor Icons
+
+ - name: save
+ id: save
+ unicode: f0c7
+ created: 2.0
+ categories:
+ - Text Editor Icons
+
+ - name: sign-blank
+ id: sign-blank
+ unicode: f0c8
+ created: 2.0
+ categories:
+ - Web Application Icons
+
+ - name: reorder
+ id: reorder
+ unicode: f0c9
+ created: 2.0
+ categories:
+ - Web Application Icons
+
+ - name: list-ul
+ id: list-ul
+ unicode: f0ca
+ created: 2.0
+ categories:
+ - Text Editor Icons
+
+ - name: list-ol
+ id: list-ol
+ unicode: f0cb
+ created: 2.0
+ categories:
+ - Text Editor Icons
+
+ - name: strikethrough
+ id: strikethrough
+ unicode: f0cc
+ created: 2.0
+ categories:
+ - Text Editor Icons
+
+ - name: underline
+ id: underline
+ unicode: f0cd
+ created: 2.0
+ categories:
+ - Text Editor Icons
+
+ - name: table
+ id: table
+ unicode: f0ce
+ created: 2.0
+ categories:
+ - Text Editor Icons
+
+
+ - name: magic
+ id: magic
+ unicode: f0d0
+ created: 2.0
+ categories:
+ - Web Application Icons
+
+ - name: truck
+ id: truck
+ unicode: f0d1
+ created: 2.0
+ categories:
+ - Web Application Icons
+
+ - name: pinterest
+ id: pinterest
+ unicode: f0d2
+ created: 2.0
+ categories:
+ - Brand Icons
+
+ - name: pinterest-sign
+ id: pinterest-sign
+ unicode: f0d3
+ created: 2.0
+ categories:
+ - Brand Icons
+
+ - name: google-plus-sign
+ id: google-plus-sign
+ unicode: f0d4
+ created: 2.0
+ categories:
+ - Brand Icons
+
+ - name: google-plus
+ id: google-plus
+ unicode: f0d5
+ created: 2.0
+ categories:
+ - Brand Icons
+
+ - name: money
+ id: money
+ unicode: f0d6
+ created: 2.0
+ categories:
+ - Web Application Icons
+
+ - name: caret-down
+ id: caret-down
+ unicode: f0d7
+ created: 2.0
+ categories:
+ - Directional Icons
+
+ - name: caret-up
+ id: caret-up
+ unicode: f0d8
+ created: 2.0
+ categories:
+ - Directional Icons
+
+ - name: caret-left
+ id: caret-left
+ unicode: f0d9
+ created: 2.0
+ categories:
+ - Directional Icons
+
+ - name: caret-right
+ id: caret-right
+ unicode: f0da
+ created: 2.0
+ categories:
+ - Directional Icons
+
+ - name: columns
+ id: columns
+ unicode: f0db
+ created: 2.0
+ categories:
+ - Text Editor Icons
+
+ - name: sort
+ id: sort
+ unicode: f0dc
+ created: 2.0
+ categories:
+ - Web Application Icons
+
+ - name: sort-down
+ id: sort-down
+ unicode: f0dd
+ created: 2.0
+ categories:
+ - Web Application Icons
+
+ - name: sort-up
+ id: sort-up
+ unicode: f0de
+ created: 2.0
+ categories:
+ - Web Application Icons
+
+
+ - name: Envelope
+ id: envelope
+ unicode: f0e0
+ created: 2.0
+ categories:
+ - Web Application Icons
+
+ - name: linkedin
+ id: linkedin
+ unicode: f0e1
+ created: 2.0
+ categories:
+ - Brand Icons
+
+
+ - name: undo
+ id: undo
+ unicode: f0e2
+ created: 2.0
+ aliases:
+ - rotate-left
+ categories:
+ - Text Editor Icons
+
+ - name: legal
+ id: legal
+ unicode: f0e3
+ created: 2.0
+ categories:
+ - Web Application Icons
+
+ - name: dashboard
+ id: dashboard
+ unicode: f0e4
+ created: 2.0
+ categories:
+ - Web Application Icons
+
+ - name: comment-alt
+ id: comment-alt
+ unicode: f0e5
+ created: 2.0
+ categories:
+ - Web Application Icons
+
+ - name: comments-alt
+ id: comments-alt
+ unicode: f0e6
+ created: 2.0
+ categories:
+ - Web Application Icons
+
+ - name: bolt
+ id: bolt
+ unicode: f0e7
+ created: 2.0
+ categories:
+ - Web Application Icons
+
+ - name: sitemap
+ id: sitemap
+ unicode: f0e8
+ created: 2.0
+ categories:
+ - Web Application Icons
+
+ - name: umbrella
+ id: umbrella
+ unicode: f0e9
+ created: 2.0
+ categories:
+ - Web Application Icons
+
+ - name: paste
+ id: paste
+ unicode: f0ea
+ created: 2.0
+ categories:
+ - Text Editor Icons
+
+ - name: lightbulb
+ id: lightbulb
+ unicode: f0eb
+ created: 3.0
+ categories:
+ - Web Application Icons
+
+ - name: exchange
+ id: exchange
+ unicode: f0ec
+ created: 3.0
+ categories:
+ - Web Application Icons
+
+ - name: cloud-download
+ id: cloud-download
+ unicode: f0ed
+ created: 3.0
+ categories:
+ - Web Application Icons
+
+ - name: cloud-upload
+ id: cloud-upload
+ unicode: f0ee
+ created: 3.0
+ categories:
+ - Web Application Icons
+
+
+ - name: user-md
+ id: user-md
+ unicode: f0f0
+ created: 2.0
+ categories:
+ - Medical Icons
+
+ - name: stethoscope
+ id: stethoscope
+ unicode: f0f1
+ created: 3.0
+ categories:
+ - Medical Icons
+
+ - name: suitcase
+ id: suitcase
+ unicode: f0f2
+ created: 3.0
+ categories:
+ - Web Application Icons
+
+ - name: bell-alt
+ id: bell-alt
+ unicode: f0f3
+ created: 3.0
+ categories:
+ - Web Application Icons
+
+ - name: coffee
+ id: coffee
+ unicode: f0f4
+ created: 3.0
+ categories:
+ - Web Application Icons
+
+ - name: food
+ id: food
+ unicode: f0f5
+ created: 3.0
+ categories:
+ - Web Application Icons
+
+ - name: file-text-alt
+ id: file-text-alt
+ unicode: f0f6
+ created: 3.0
+ categories:
+ - Text Editor Icons
+
+ - name: building
+ id: building
+ unicode: f0f7
+ created: 3.0
+ categories:
+ - Web Application Icons
+
+ - name: hospital
+ id: hospital
+ unicode: f0f8
+ created: 3.0
+ categories:
+ - Medical Icons
+
+ - name: ambulance
+ id: ambulance
+ unicode: f0f9
+ created: 3.0
+ categories:
+ - Medical Icons
+
+ - name: medkit
+ id: medkit
+ unicode: f0fa
+ created: 3.0
+ categories:
+ - Medical Icons
+
+ - name: fighter-jet
+ id: fighter-jet
+ unicode: f0fb
+ created: 3.0
+ categories:
+ - Web Application Icons
+
+ - name: beer
+ id: beer
+ unicode: f0fc
+ created: 3.0
+ categories:
+ - Web Application Icons
+
+ - name: h-sign
+ id: h-sign
+ unicode: f0fd
+ created: 3.0
+ categories:
+ - Medical Icons
+
+ - name: plus-sign-alt
+ id: plus-sign-alt
+ unicode: f0fe
+ created: 3.0
+ categories:
+ - Medical Icons
+ - Web Application Icons
+
+
+ - name: double-angle-left
+ id: double-angle-left
+ unicode: f100
+ created: 3.0
+ categories:
+ - Directional Icons
+
+ - name: double-angle-right
+ id: double-angle-right
+ unicode: f101
+ created: 3.0
+ categories:
+ - Directional Icons
+
+ - name: double-angle-up
+ id: double-angle-up
+ unicode: f102
+ created: 3.0
+ categories:
+ - Directional Icons
+
+ - name: double-angle-down
+ id: double-angle-down
+ unicode: f103
+ created: 3.0
+ categories:
+ - Directional Icons
+
+ - name: angle-left
+ id: angle-left
+ unicode: f104
+ created: 3.0
+ categories:
+ - Directional Icons
+
+ - name: angle-right
+ id: angle-right
+ unicode: f105
+ created: 3.0
+ categories:
+ - Directional Icons
+
+ - name: angle-up
+ id: angle-up
+ unicode: f106
+ created: 3.0
+ categories:
+ - Directional Icons
+
+ - name: angle-down
+ id: angle-down
+ unicode: f107
+ created: 3.0
+ categories:
+ - Directional Icons
+
+ - name: desktop
+ id: desktop
+ unicode: f108
+ created: 3.0
+ categories:
+ - Web Application Icons
+
+ - name: laptop
+ id: laptop
+ unicode: f109
+ created: 3.0
+ categories:
+ - Web Application Icons
+
+ - name: tablet
+ id: tablet
+ unicode: f10a
+ created: 3.0
+ categories:
+ - Web Application Icons
+
+ - name: mobile-phone
+ id: mobile-phone
+ unicode: f10b
+ created: 3.0
+ categories:
+ - Web Application Icons
+
+ - name: circle-blank
+ id: circle-blank
+ unicode: f10c
+ created: 3.0
+ categories:
+ - Web Application Icons
+
+ - name: quote-left
+ id: quote-left
+ unicode: f10d
+ created: 3.0
+ categories:
+ - Web Application Icons
+
+ - name: quote-right
+ id: quote-right
+ unicode: f10e
+ created: 3.0
+ categories:
+ - Web Application Icons
+
+
+ - name: spinner
+ id: spinner
+ unicode: f110
+ created: 3.0
+ categories:
+ - Web Application Icons
+
+ - name: circle
+ id: circle
+ unicode: f111
+ created: 3.0
+ categories:
+ - Web Application Icons
+
+ - name: reply
+ id: reply
+ unicode: f112
+ created: 3.0
+ aliases:
+ - mail-reply
+ categories:
+ - Web Application Icons
+
+ - name: github-alt
+ id: github-alt
+ unicode: f113
+ created: 3.0
+ categories:
+ - Brand Icons
+
+ - name: folder-close-alt
+ id: folder-close-alt
+ unicode: f114
+ created: 3.0
+ categories:
+ - Web Application Icons
+
+ - name: folder-open-alt
+ id: folder-open-alt
+ unicode: f115
+ created: 3.0
+ categories:
+ - Web Application Icons
+
+ - name: expand-alt
+ id: expand-alt
+ unicode: f116
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+ - name: collapse-alt
+ id: collapse-alt
+ unicode: f117
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+ - name: smile
+ id: smile
+ unicode: f118
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+ - name: frown
+ id: frown
+ unicode: f119
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+ - name: meh
+ id: meh
+ unicode: f11a
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+ - name: gamepad
+ id: gamepad
+ unicode: f11b
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+ - name: keyboard
+ id: keyboard
+ unicode: f11c
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+ - name: flag-alt
+ id: flag-alt
+ unicode: f11d
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+ - name: flag-checkered
+ id: flag-checkered
+ unicode: f11e
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+
+ - name: terminal
+ id: terminal
+ unicode: f120
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+ - name: code
+ id: code
+ unicode: f121
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+ - name: reply-all
+ id: reply-all
+ unicode: f122
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+ - name: mail-reply-all
+ id: mail-reply-all
+ unicode: f122
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+ - name: star-half-empty
+ id: star-half-empty
+ unicode: f123
+ created: 3.1
+ aliases:
+ - star-half-full
+ categories:
+ - Web Application Icons
+
+ - name: location-arrow
+ id: location-arrow
+ unicode: f124
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+ - name: crop
+ id: crop
+ unicode: f125
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+ - name: code-fork
+ id: code-fork
+ unicode: f126
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+ - name: unlink
+ id: unlink
+ unicode: f127
+ created: 3.1
+ categories:
+ - Text Editor Icons
+
+ - name: question
+ id: question
+ unicode: f128
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+ - name: info
+ id: info
+ unicode: f129
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+ - name: exclamation
+ id: exclamation
+ unicode: f12a
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+ - name: superscript
+ id: superscript
+ unicode: f12b
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+ - name: subscript
+ id: subscript
+ unicode: f12c
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+ - name: eraser
+ id: eraser
+ unicode: f12d
+ created: 3.1
+ categories:
+ - Text Editor Icons
+ - Web Application Icons
+
+ - name: puzzle-piece
+ id: puzzle-piece
+ unicode: f12e
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+
+ - name: microphone
+ id: microphone
+ unicode: f130
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+ - name: microphone-off
+ id: microphone-off
+ unicode: f131
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+ - name: shield
+ id: shield
+ unicode: f132
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+ - name: calendar-empty
+ id: calendar-empty
+ unicode: f133
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+ - name: fire-extinguisher
+ id: fire-extinguisher
+ unicode: f134
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+ - name: rocket
+ id: rocket
+ unicode: f135
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+ - name: MaxCDN
+ id: maxcdn
+ unicode: f136
+ created: 3.1
+ categories:
+ - Brand Icons
+
+ - name: Chevron Sign Left
+ id: chevron-sign-left
+ unicode: f137
+ created: 3.1
+ categories:
+ - Directional Icons
+
+ - name: Chevron Sign Right
+ id: chevron-sign-right
+ unicode: f138
+ created: 3.1
+ categories:
+ - Directional Icons
+
+ - name: Chevron Sign Up
+ id: chevron-sign-up
+ unicode: f139
+ created: 3.1
+ categories:
+ - Directional Icons
+
+ - name: Chevron Sign Down
+ id: chevron-sign-down
+ unicode: f13a
+ created: 3.1
+ categories:
+ - Directional Icons
+
+ - name: HTML 5 Logo
+ id: html5
+ unicode: f13b
+ created: 3.1
+ categories:
+ - Brand Icons
+
+ - name: CSS 3 Logo
+ id: css3
+ unicode: f13c
+ created: 3.1
+ categories:
+ - Brand Icons
+
+ - name: Anchor
+ id: anchor
+ unicode: f13d
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+ - name: Unlock Alt
+ id: unlock-alt
+ unicode: f13e
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+
+ - name: Bullseye
+ id: bullseye
+ unicode: f140
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+ - name: Horizontal Ellipsis
+ id: ellipsis-horizontal
+ unicode: f141
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+ - name: Vertical Ellipsis
+ id: ellipsis-vertical
+ unicode: f142
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+ - name: RSS Sign
+ id: rss-sign
+ unicode: f143
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+ - name: Play Sign
+ id: play-sign
+ unicode: f144
+ created: 3.1
+ categories:
+ - Video Player Icons
+
+ - name: Ticket
+ id: ticket
+ unicode: f145
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+ - name: Minus Sign Alt
+ id: minus-sign-alt
+ unicode: f146
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+ - name: Check Minus
+ id: check-minus
+ unicode: f147
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+ - name: Level Up
+ id: level-up
+ unicode: f148
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+ - name: Level Down
+ id: level-down
+ unicode: f149
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+ - name: Check Sign
+ id: check-sign
+ unicode: f14a
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+ - name: Edit Sign
+ id: edit-sign
+ unicode: f14b
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+ - name: Exteral Link Sign
+ id: external-link-sign
+ unicode: f14c
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+ - name: Share Sign
+ id: share-sign
+ unicode: f14d
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+ - name: Compass
+ id: compass
+ unicode: f14e
+ created: 3.2
+ categories:
+ - Web Application Icons
+
+
+ - name: Collapse
+ id: collapse
+ unicode: f150
+ created: 3.2
+ categories:
+ - Web Application Icons
+
+ - name: Collapse Top
+ id: collapse-top
+ unicode: f151
+ created: 3.2
+ categories:
+ - Web Application Icons
+
+ - name: Expand
+ id: expand
+ unicode: f152
+ created: 3.2
+ categories:
+ - Web Application Icons
+
+ - name: Euro (EUR)
+ id: eur
+ unicode: f153
+ created: 3.2
+ aliases:
+ - euro
+ categories:
+ - Currency Icons
+
+ - name: GBP
+ id: gbp
+ unicode: f154
+ created: 3.2
+ categories:
+ - Currency Icons
+
+ - name: US Dollar
+ id: usd
+ unicode: f155
+ created: 3.2
+ aliases:
+ - dollar
+ categories:
+ - Currency Icons
+
+ - name: Indian Rupee (INR)
+ id: inr
+ unicode: f156
+ created: 3.2
+ aliases:
+ - rupee
+ categories:
+ - Currency Icons
+
+ - name: Japanese Yen (JPY)
+ id: jpy
+ unicode: f157
+ created: 3.2
+ aliases:
+ - yen
+ categories:
+ - Currency Icons
+
+ - name: Renminbi (CNY)
+ id: cny
+ unicode: f158
+ created: 3.2
+ aliases:
+ - renminbi
+ categories:
+ - Currency Icons
+
+ - name: Korean Won (KRW)
+ id: krw
+ unicode: f159
+ created: 3.2
+ aliases:
+ - won
+ categories:
+ - Currency Icons
+
+ - name: Bitcoin (BTC)
+ id: btc
+ unicode: f15a
+ created: 3.2
+ aliases:
+ - bitcoin
+ categories:
+ - Currency Icons
+ - Brand Icons
+
+ - name: File
+ id: file
+ unicode: f15b
+ created: 3.2
+ categories:
+ - Text Editor Icons
+
+ - name: File Text
+ id: file-text
+ unicode: f15c
+ created: 3.2
+ categories:
+ - Text Editor Icons
+
+ - name: Sort By Alphabet
+ id: sort-by-alphabet
+ unicode: f15d
+ created: 3.2
+ categories:
+ - Web Application Icons
+
+ - name: Sort By Alphabet Alt
+ id: sort-by-alphabet-alt
+ unicode: f15e
+ created: 3.2
+ categories:
+ - Web Application Icons
+
+
+ - name: Sort By Attributes
+ id: sort-by-attributes
+ unicode: f160
+ created: 3.2
+ categories:
+ - Web Application Icons
+
+ - name: Sort By Attributes Alt
+ id: sort-by-attributes-alt
+ unicode: f161
+ created: 3.2
+ categories:
+ - Web Application Icons
+
+ - name: Sort By Order
+ id: sort-by-order
+ unicode: f162
+ created: 3.2
+ categories:
+ - Web Application Icons
+
+ - name: Sort By Order Alt
+ id: sort-by-order-alt
+ unicode: f163
+ created: 3.2
+ categories:
+ - Web Application Icons
+
+
+ - name: thumbs-up
+ id: thumbs-up
+ unicode: f164
+ created: 3.2
+ categories:
+ - Web Application Icons
+
+ - name: thumbs-down
+ id: thumbs-down
+ unicode: f165
+ created: 3.2
+ categories:
+ - Web Application Icons
+
+ - name: YouTube Sign
+ id: youtube-sign
+ unicode: f166
+ created: 3.2
+ categories:
+ - Brand Icons
+
+ - name: YouTube
+ id: youtube
+ unicode: f167
+ created: 3.2
+ categories:
+ - Brand Icons
+
+ - name: Xing
+ id: xing
+ unicode: f168
+ created: 3.2
+ categories:
+ - Brand Icons
+
+ - name: Xing Sign
+ id: xing-sign
+ unicode: f169
+ created: 3.2
+ categories:
+ - Brand Icons
+
+ - name: YouTube Play
+ id: youtube-play
+ unicode: f16a
+ created: 3.2
+ categories:
+ - Brand Icons
+ - Video Player Icons
+
+ - name: Dropbox
+ id: dropbox
+ unicode: f16b
+ created: 3.2
+ categories:
+ - Brand Icons
+
+ - name: Stack Exchange
+ id: stackexchange
+ unicode: f16c
+ created: 3.2
+ categories:
+ - Brand Icons
+
+ - name: Instagram
+ id: instagram
+ unicode: f16d
+ created: 3.2
+ categories:
+ - Brand Icons
+
+ - name: Flickr
+ id: flickr
+ unicode: f16e
+ created: 3.2
+ categories:
+ - Brand Icons
+
+ - name: App.net
+ id: adn
+ unicode: f170
+ created: 3.2
+ categories:
+ - Brand Icons
+
+ - name: Bitbucket
+ id: bitbucket
+ unicode: f171
+ created: 3.2
+ categories:
+ - Brand Icons
+
+ - name: Bitbucket Sign
+ id: bitbucket-sign
+ unicode: f172
+ created: 3.2
+ categories:
+ - Brand Icons
+
+ - name: Tumblr
+ id: tumblr
+ unicode: f173
+ created: 3.2
+ categories:
+ - Brand Icons
+
+ - name: Tumblr Sign
+ id: tumblr-sign
+ unicode: f174
+ created: 3.2
+ categories:
+ - Brand Icons
+
+ - name: Long Arrow Down
+ id: long-arrow-down
+ unicode: f175
+ created: 3.2
+ categories:
+ - Directional Icons
+
+ - name: Long Arrow Up
+ id: long-arrow-up
+ unicode: f176
+ created: 3.2
+ categories:
+ - Directional Icons
+
+ - name: Long Arrow Left
+ id: long-arrow-left
+ unicode: f177
+ created: 3.2
+ categories:
+ - Directional Icons
+
+ - name: Long Arrow Right
+ id: long-arrow-right
+ unicode: f178
+ created: 3.2
+ categories:
+ - Directional Icons
+
+ - name: Apple
+ id: apple
+ unicode: f179
+ created: 3.2
+ categories:
+ - Brand Icons
+
+ - name: Windows
+ id: windows
+ unicode: f17a
+ created: 3.2
+ categories:
+ - Brand Icons
+
+ - name: Android
+ id: android
+ unicode: f17b
+ created: 3.2
+ categories:
+ - Brand Icons
+
+ - name: Linux
+ id: linux
+ unicode: f17c
+ created: 3.2
+ categories:
+ - Brand Icons
+
+ - name: Dribbble
+ id: dribbble
+ unicode: f17d
+ created: 3.2
+ categories:
+ - Brand Icons
+
+ - name: Skype
+ id: skype
+ unicode: f17e
+ created: 3.2
+ categories:
+ - Brand Icons
+
+
+ - name: Foursquare
+ id: foursquare
+ unicode: f180
+ created: 3.2
+ categories:
+ - Brand Icons
+
+ - name: Trello
+ id: trello
+ unicode: f181
+ created: 3.2
+ categories:
+ - Brand Icons
+
+ - name: Female
+ id: female
+ unicode: f182
+ created: 3.2
+ categories:
+ - Web Application Icons
+
+ - name: Male
+ id: male
+ unicode: f183
+ created: 3.2
+ categories:
+ - Web Application Icons
+
+ - name: Gittip
+ id: gittip
+ unicode: f184
+ created: 3.2
+ categories:
+ - Brand Icons
+
+ - name: Sun
+ id: sun
+ unicode: f185
+ created: 3.2
+ categories:
+ - Web Application Icons
+
+ - name: Moon
+ id: moon
+ unicode: f186
+ created: 3.2
+ categories:
+ - Web Application Icons
+
+ - name: Archive
+ id: archive
+ unicode: f187
+ created: 3.2
+ categories:
+ - Web Application Icons
+
+ - name: Bug
+ id: bug
+ unicode: f188
+ created: 3.2
+ categories:
+ - Web Application Icons
+
+ - name: VK
+ id: vk
+ unicode: f189
+ created: 3.2
+ categories:
+ - Brand Icons
+
+ - name: Weibo
+ id: weibo
+ unicode: f18a
+ created: 3.2
+ categories:
+ - Brand Icons
+
+ - name: Renren
+ id: renren
+ unicode: f18b
+ created: 3.2
+ categories:
+ - Brand Icons
diff --git a/library/font_awesome/src/index.html b/library/font_awesome/src/index.html
new file mode 100644
index 000000000..d2303c525
--- /dev/null
+++ b/library/font_awesome/src/index.html
@@ -0,0 +1,22 @@
+---
+layout: base
+title: Font Awesome, the iconic font designed for Bootstrap
+navbar_active: home
+relative_path: ./
+---
+
+{% include jumbotron-slider.html %}
+{% include stripe-social.html %}
+
+<div class="container">
+ {% capture stripe_ad_content %}
+ <p class="lead">
+ Font Awesome gives you scalable vector icons that can instantly be customized &mdash; size, color, drop shadow,
+ and anything that can be done with the power of CSS.
+ </p>
+ {% endcapture %}
+ {% include stripe-ad.html %}
+
+ {% include why.html %}
+ {% include thanks-to.html %}
+</div>
diff --git a/library/font_awesome/src/license.html b/library/font_awesome/src/license.html
new file mode 100644
index 000000000..990071460
--- /dev/null
+++ b/library/font_awesome/src/license.html
@@ -0,0 +1,15 @@
+---
+layout: base
+title: Font Awesome License
+navbar_active: license
+relative_path: ../
+---
+{% capture jumbotron_h1 %}<i class="icon-legal icon-large"></i>&nbsp; License{% endcapture %}
+{% capture jumbotron_p %}The full details of how Font Awesome is licensed{% endcapture %}
+
+{% include jumbotron.html %}
+{% include stripe-social.html %}
+
+<div class="container">
+ {% include license.html %}
+</div>
diff --git a/library/font_awesome/src/test.html b/library/font_awesome/src/test.html
new file mode 100644
index 000000000..540df0323
--- /dev/null
+++ b/library/font_awesome/src/test.html
@@ -0,0 +1,714 @@
+---
+layout: base
+title: Font Awesome Visual Test Cases
+relative_path: ../
+---
+
+<section class="container">
+ <h1 class="page-header">Visual Test Cases</h1>
+
+ <h3>Icons <small>Icons should have proper alignment and not be clipped</small></h3>
+ <div class="row">
+ <div class="span3">
+ <div class="well">
+ <i class="icon-building"></i> Building
+ </div>
+ </div>
+ <div class="span3">
+ <div class="well">
+ <i class="icon-building icon-large"></i> Building Large
+ </div>
+ </div>
+ <div class="span3">
+ <i class="icon-building"></i> Building
+ </div>
+ <div class="span3">
+ <i class="icon-building icon-large"></i> Building Large
+ </div>
+ </div>
+ <div class="row" style="font-size: 24px; line-height: 1.5em;">
+ <div class="span4">
+ <div class="well">
+ <i class="icon-building"></i> Building
+ </div>
+ </div>
+ <div class="span4">
+ <div class="well">
+ <i class="icon-building icon-large"></i> Building Large
+ </div>
+ </div>
+ <div class="span4">
+ <i class="icon-building icon-large"></i> Building Large
+ </div>
+ </div>
+ <div class="row">
+ <div class="span3">
+ <div class="well">
+ <i class="icon-circle"></i> Circle
+ </div>
+ </div>
+ <div class="span3">
+ <div class="well">
+ <i class="icon-circle icon-large"></i> Circle Large
+ </div>
+ </div>
+ <div class="span3">
+ <i class="icon-circle"></i> Circle
+ </div>
+ <div class="span3">
+ <i class="icon-circle icon-large"></i> Circle Large
+ </div>
+ </div>
+ <div class="row" style="font-size: 24px; line-height: 1.5em;">
+ <div class="span4">
+ <div class="well">
+ <i class="icon-circle"></i> Circle
+ </div>
+ </div>
+ <div class="span4">
+ <div class="well">
+ <i class="icon-circle icon-large"></i> Circle Large
+ </div>
+ </div>
+ <div class="span4">
+ <i class="icon-circle icon-large"></i> Circle Large
+ </div>
+ </div>
+
+
+ <h3>Links with Icons <small>icon should activate link & underline</small></h3>
+ <div class="row lead">
+ <div class="span2">
+ <a href="#"><i class="icon-building"></i> Link Here</a>
+ </div>
+ <div class="span2">
+ <a href="#"><i class="icon-building icon-large"></i> Link Here</a>
+ </div>
+ <div class="span2">
+ <a href="#"><i class="icon-caret-down"></i> Link Here</a>
+ </div>
+ <div class="span2">
+ <a href="#">Link Here <i class="icon-double-angle-right"></i></a>
+ </div>
+ <div class="span2">
+ <a href="#">Link Here <i class="icon-double-angle-right icon-large"></i></a>
+ </div>
+ <div class="span2">
+ <a href="#">Link Here <i class="icon-caret-down"></i></a>
+ </div>
+ </div>
+ <div class="row">
+ <div class="span2">
+ <a href="#"><i class="icon-building"></i> Link Here</a>
+ </div>
+ <div class="span2">
+ <a href="#"><i class="icon-building icon-large"></i> Link Here</a>
+ </div>
+ <div class="span2">
+ <a href="#"><i class="icon-caret-down"></i> Link Here</a>
+ </div>
+ <div class="span2">
+ <a href="#">Link Here <i class="icon-double-angle-right"></i></a>
+ </div>
+ <div class="span2">
+ <a href="#">Link Here <i class="icon-double-angle-right icon-large"></i></a>
+ </div>
+ <div class="span2">
+ <a href="#">Link Here <i class="icon-caret-down"></i></a>
+ </div>
+ </div>
+
+
+ <h3>Navbar <small>should stay same height </small></h3>
+ <div class="navbar navbar-inverse navbar-static-top">
+ <div class="navbar-inner">
+ <div class="container">
+ <a class="brand" href="#"><i class="icon-flag"></i> Font Awesome</a>
+ <ul class="nav">
+ <li style="border: solid 1px white;"><a href="#">Nav Item 1</a></li>
+ <li class="dropdown" style="border: solid 1px white;">
+ <a href="#" role="button" class="dropdown-toggle" data-toggle="dropdown">
+ Nav Item 2
+ <i class="icon-caret-down"></i>
+ </a>
+ <ul class="dropdown-menu" role="menu">
+ <li><a href="#"><i class="icon-building"></i> Menu Item 1</a></li>
+ <li><a href="#"><i class="icon-building icon-large"></i> Menu Item 2</a></li>
+ </ul>
+ </li>
+ <li style="border: solid 1px white;"><a href="#examples"><i class="icon-building icon-large"></i> Nav Item 3</a></li>
+ <li style="border: solid 1px white;"><a href="#examples"><i class="icon-envelope"></i> Nav Item 4</a></li>
+ <li style="border: solid 1px white;"><a href="#examples"><i class="icon-circle icon-large"></i> Nav Item 5</a></li>
+ <li style="border: solid 1px white;"><a href="#examples"><i class="icon-circle"></i> Nav Item 6</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+
+
+ <h3>Plain buttons next to buttons w/icons <small>should be same height, icons not clipped</small></h3>
+ <h4>Buttons</h4>
+ <div class="row">
+ <div class="span6">
+ <div style="border: solid 1px #d3d3d3; text-align: center;">
+ <div>
+ <button class="btn btn-mini">Button</button>
+ <button class="btn btn-mini"><i class="icon-building"></i> Button</button>
+ <button class="btn btn-mini"><i class="icon-building"></i></button>
+ </div>
+ <div>
+ <button class="btn btn-small">Button</button>
+ <button class="btn btn-small"><i class="icon-building"></i> Button</button>
+ <button class="btn btn-small"><i class="icon-building"></i></button>
+ </div>
+ <div>
+ <button class="btn">Button</button>
+ <button class="btn"><i class="icon-building"></i> Button</button>
+ <button class="btn"><i class="icon-building"></i></button>
+ </div>
+ <div>
+ <button class="btn btn-large">Button</button>
+ <button class="btn btn-large"><i class="icon-building"></i> Button</button>
+ <button class="btn btn-large"><i class="icon-building"></i></button>
+ </div>
+ </div>
+ </div>
+ <div class="span6">
+ <div style="border: solid 1px #d3d3d3; text-align: center;">
+ <div>
+ <button class="btn btn-mini">Button</button>
+ <button class="btn btn-mini"><i class="icon-building icon-large"></i> Button</button>
+ <button class="btn btn-mini"><i class="icon-building icon-large"></i></button>
+ </div>
+ <div>
+ <button class="btn btn-small">Button</button>
+ <button class="btn btn-small"><i class="icon-building icon-large"></i> Button</button>
+ <button class="btn btn-small"><i class="icon-building icon-large"></i></button>
+ </div>
+ <div>
+ <button class="btn">Button</button>
+ <button class="btn"><i class="icon-building icon-large"></i> Button</button>
+ <button class="btn"><i class="icon-building icon-large"></i></button>
+ </div>
+ <div>
+ <button class="btn btn-large">Button</button>
+ <button class="btn btn-large"><i class="icon-building icon-large"></i> Button</button>
+ <button class="btn btn-large"><i class="icon-building icon-large"></i></button>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="row">
+ <div class="span6">
+ <div style="border: solid 1px #d3d3d3; text-align: center;">
+ <div>
+ <button class="btn btn-mini">Button</button>
+ <button class="btn btn-mini"><i class="icon-circle"></i> Button</button>
+ <button class="btn btn-mini"><i class="icon-circle"></i></button>
+ </div>
+ <div>
+ <button class="btn btn-small">Button</button>
+ <button class="btn btn-small"><i class="icon-circle"></i> Button</button>
+ <button class="btn btn-small"><i class="icon-circle"></i></button>
+ </div>
+ <div>
+ <button class="btn">Button</button>
+ <button class="btn"><i class="icon-circle"></i> Button</button>
+ <button class="btn"><i class="icon-circle"></i></button>
+ </div>
+ <div>
+ <button class="btn btn-large">Button</button>
+ <button class="btn btn-large"><i class="icon-circle"></i> Button</button>
+ <button class="btn btn-large"><i class="icon-circle"></i></button>
+ </div>
+ </div>
+ </div>
+ <div class="span6">
+ <div style="border: solid 1px #d3d3d3; text-align: center;">
+ <div>
+ <button class="btn btn-mini">Button</button>
+ <button class="btn btn-mini"><i class="icon-circle icon-large"></i> Button</button>
+ <button class="btn btn-mini"><i class="icon-circle icon-large"></i></button>
+ </div>
+ <div>
+ <button class="btn btn-small">Button</button>
+ <button class="btn btn-small"><i class="icon-circle icon-large"></i> Button</button>
+ <button class="btn btn-small"><i class="icon-circle icon-large"></i></button>
+ </div>
+ <div>
+ <button class="btn">Button</button>
+ <button class="btn"><i class="icon-circle icon-large"></i> Button</button>
+ <button class="btn"><i class="icon-circle icon-large"></i></button>
+ </div>
+ <div>
+ <button class="btn btn-large">Button</button>
+ <button class="btn btn-large"><i class="icon-circle icon-large"></i> Button</button>
+ <button class="btn btn-large"><i class="icon-circle icon-large"></i></button>
+ </div>
+ </div>
+ </div>
+ </div>
+
+
+ <h4>Anchors</h4>
+ <div class="row">
+ <div class="span6">
+ <div style="border: solid 1px #d3d3d3; text-align: center;">
+ <div>
+ <a class="btn btn-mini">Button</a>
+ <a class="btn btn-mini"><i class="icon-building"></i> Button</a>
+ <a class="btn btn-mini"><i class="icon-building"></i></a>
+ </div>
+ <div>
+ <a class="btn btn-small">Button</a>
+ <a class="btn btn-small"><i class="icon-building"></i> Button</a>
+ <a class="btn btn-small"><i class="icon-building"></i></a>
+ </div>
+ <div>
+ <a class="btn">Button</a>
+ <a class="btn"><i class="icon-building"></i> Button</a>
+ <a class="btn"><i class="icon-building"></i></a>
+ </div>
+ <div>
+ <a class="btn btn-large">Button</a>
+ <a class="btn btn-large"><i class="icon-building"></i> Button</a>
+ <a class="btn btn-large"><i class="icon-building"></i></a>
+ </div>
+ </div>
+ </div>
+ <div class="span6">
+ <div style="border: solid 1px #d3d3d3; text-align: center;">
+ <div>
+ <a class="btn btn-mini">Button</a>
+ <a class="btn btn-mini"><i class="icon-building icon-large"></i> Button</a>
+ <a class="btn btn-mini"><i class="icon-building icon-large"></i></a>
+ </div>
+ <div>
+ <a class="btn btn-small">Button</a>
+ <a class="btn btn-small"><i class="icon-building icon-large"></i> Button</a>
+ <a class="btn btn-small"><i class="icon-building icon-large"></i></a>
+ </div>
+ <div>
+ <a class="btn">Button</a>
+ <a class="btn"><i class="icon-building icon-large"></i> Button</a>
+ <a class="btn"><i class="icon-building icon-large"></i></a>
+ </div>
+ <div>
+ <a class="btn btn-large">Button</a>
+ <a class="btn btn-large"><i class="icon-building icon-large"></i> Button</a>
+ <a class="btn btn-large"><i class="icon-building icon-large"></i></a>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="row">
+ <div class="span6">
+ <div style="border: solid 1px #d3d3d3; text-align: center;">
+ <div>
+ <a class="btn btn-mini">Button</a>
+ <a class="btn btn-mini"><i class="icon-circle"></i> Button</a>
+ <a class="btn btn-mini"><i class="icon-circle"></i></a>
+ </div>
+ <div>
+ <a class="btn btn-small">Button</a>
+ <a class="btn btn-small"><i class="icon-circle"></i> Button</a>
+ <a class="btn btn-small"><i class="icon-circle"></i></a>
+ </div>
+ <div>
+ <a class="btn">Button</a>
+ <a class="btn"><i class="icon-circle"></i> Button</a>
+ <a class="btn"><i class="icon-circle"></i></a>
+ </div>
+ <div>
+ <a class="btn btn-large">Button</a>
+ <a class="btn btn-large"><i class="icon-circle"></i> Button</a>
+ <a class="btn btn-large"><i class="icon-circle"></i></a>
+ </div>
+ </div>
+ </div>
+ <div class="span6">
+ <div style="border: solid 1px #d3d3d3; text-align: center;">
+ <div>
+ <a class="btn btn-mini">Button</a>
+ <a class="btn btn-mini"><i class="icon-circle icon-large"></i> Button</a>
+ <a class="btn btn-mini"><i class="icon-circle icon-large"></i></a>
+ </div>
+ <div>
+ <a class="btn btn-small">Button</a>
+ <a class="btn btn-small"><i class="icon-circle icon-large"></i> Button</a>
+ <a class="btn btn-small"><i class="icon-circle icon-large"></i></a>
+ </div>
+ <div>
+ <a class="btn">Button</a>
+ <a class="btn"><i class="icon-circle icon-large"></i> Button</a>
+ <a class="btn"><i class="icon-circle icon-large"></i></a>
+ </div>
+ <div>
+ <a class="btn btn-large">Button</a>
+ <a class="btn btn-large"><i class="icon-circle icon-large"></i> Button</a>
+ <a class="btn btn-large"><i class="icon-circle icon-large"></i></a>
+ </div>
+ </div>
+ </div>
+ </div>
+
+
+ <h3>Buttons with pulled 2x, 3x, 4x <small>should be same height, have correct line height</small></h3>
+ <div class="row">
+ <div class="span4">
+ <div style="border: solid 1px #d3d3d3;">
+ <a class="btn btn-large" href="#">
+ <i class="icon-github icon-2x pull-left"></i>
+ Longer<br>Button</a>
+ <a class="btn btn-large" href="#">
+ Longer<br>Button</a>
+ </div>
+ </div>
+ <div class="span4">
+ <div style="border: solid 1px #d3d3d3;">
+ <a class="btn" href="#">
+ <i class="icon-github icon-2x pull-left"></i>
+ Longer<br>Button</a>
+ <a class="btn" href="#">
+ Longer<br>Button</a>
+ </div>
+ </div>
+ <div class="span4">
+ <div style="border: solid 1px #d3d3d3;">
+ <a class="btn btn-small" href="#">
+ <i class="icon-github icon-2x pull-left"></i>
+ Longer<br>Button</a>
+ <a class="btn btn-small" href="#">
+ Longer<br>Button</a>
+ </div>
+ </div>
+ </div>
+
+
+ <h3>Nav pills & nav tabs <small>should be same height and properly vertically aligned</small></h3>
+ <div class="row">
+ <div class="span9">
+ <ul class="nav nav-pills" style="border: solid 1px #d3d3d3;">
+ <li class="active"><a href="#">Nav Item 1</a></li>
+ <li class="dropdown active">
+ <a href="#" role="button" class="dropdown-toggle" data-toggle="dropdown">
+ Nav Item 2
+ <span class="caret"></span>
+ </a>
+ <ul class="dropdown-menu" role="menu">
+ <li><a href="#"><i class="icon-building"></i> Menu Item 1</a></li>
+ <li><a href="#"><i class="icon-building icon-large"></i> Menu Item 2</a></li>
+ </ul>
+ </li>
+ <li class="dropdown active">
+ <a href="#" role="button" class="dropdown-toggle" data-toggle="dropdown">
+ Nav Item 3
+ <i class="icon-caret-down"></i>
+ </a>
+ <ul class="dropdown-menu" role="menu">
+ <li><a href="#"><i class="icon-building"></i> Menu Item 1</a></li>
+ <li><a href="#"><i class="icon-building icon-large"></i> Menu Item 2</a></li>
+ </ul>
+ </li>
+ <li class="active"><a href="#examples"><i class="icon-building icon-large"></i> Nav Item 4</a></li>
+ <li class="active"><a href="#examples"><i class="icon-spinner icon-spin"></i> Nav Item 5</a></li>
+ <li class="active"><a href="#examples"><i class="icon-circle icon-large"></i> Nav Item 6</a></li>
+ <li class="active"><a href="#examples"><i class="icon-circle"></i> Nav Item 7</a></li>
+ </ul>
+ <ul class="nav nav-tabs">
+ <li class="active"><a href="#">Nav Item 1</a></li>
+ <li class="dropdown active">
+ <a href="#" role="button" class="dropdown-toggle" data-toggle="dropdown">
+ Nav Item 2
+ <span class="caret"></span>
+ </a>
+ <ul class="dropdown-menu" role="menu">
+ <li><a href="#"><i class="icon-building"></i> Menu Item 1</a></li>
+ <li><a href="#"><i class="icon-building icon-large"></i> Menu Item 2</a></li>
+ </ul>
+ </li>
+ <li class="dropdown active">
+ <a href="#" role="button" class="dropdown-toggle" data-toggle="dropdown">
+ Nav Item 3
+ <i class="icon-caret-down"></i>
+ </a>
+ <ul class="dropdown-menu" role="menu">
+ <li><a href="#"><i class="icon-building"></i> Menu Item 1</a></li>
+ <li><a href="#"><i class="icon-building icon-large"></i> Menu Item 2</a></li>
+ </ul>
+ </li>
+ <li class="active"><a href="#examples"><i class="icon-building icon-large"></i> Nav Item 4</a></li>
+ <li class="active"><a href="#examples"><i class="icon-spinner icon-spin"></i> Nav Item 5</a></li>
+ <li class="active"><a href="#examples"><i class="icon-circle icon-large"></i> Nav Item 6</a></li>
+ <li class="active"><a href="#examples"><i class="icon-circle"></i> Nav Item 7</a></li>
+ </ul>
+ </div>
+ <div class="span3">
+ <ul class="nav nav-list">
+ <li>
+ <a href="#c1">
+ <i class="icon-chevron-right icon-fixed-width pull-right"></i> Overview
+ </a>
+ </li>
+ <li>
+ <a href="#c1">
+ Overview
+ <i class="icon-chevron-right icon-fixed-width pull-right"></i>
+ </a>
+ </li>
+ </ul>
+ </div>
+ </div>
+
+
+
+ <h3>2x, 3x, 4x icons in text <small>should have margins next to and below text</small></h3>
+ <div class="row">
+ <div class="span6">
+ <p class="lead">
+ <i class="icon-stethoscope icon-3x pull-left icon-border"></i>
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam et lectus id nisl hendrerit varius. Aliquam erat volutpat. Suspendisse potenti. Aliquam erat volutpat. Aliquam ut dolor lectus.
+ </p>
+ </div>
+ <div class="span6">
+ <p class="lead">
+ <i class="icon-ambulance icon-4x pull-right icon-border"></i>
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam et lectus id nisl hendrerit varius. Aliquam erat volutpat. Suspendisse potenti. Aliquam erat volutpat. Aliquam ut dolor lectus.
+ </p>
+ </div>
+ </div>
+ <div class="row">
+ <div class="span4">
+ <i class="icon-building icon-2x pull-left icon-border"></i>
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam et lectus id nisl hendrerit varius. Aliquam erat volutpat. Suspendisse potenti. Aliquam erat volutpat. Aliquam ut dolor lectus.
+ </div>
+ <div class="span4">
+ <i class="icon-stethoscope icon-3x pull-right icon-border"></i>
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam et lectus id nisl hendrerit varius. Aliquam erat volutpat. Suspendisse potenti. Aliquam erat volutpat. Aliquam ut dolor lectus.
+ </div>
+ <div class="span4">
+ <i class="icon-ambulance icon-4x pull-left"></i>
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam et lectus id nisl hendrerit varius. Aliquam erat volutpat. Suspendisse potenti. Aliquam erat volutpat. Aliquam ut dolor lectus.
+ </div>
+ </div>
+
+
+ <h3>Bullets <small>should wrap appropriately, have proper spacing</small></h3>
+ <div class="row">
+ <div class="span6">
+ <div style="border: solid 1px #d3d3d3;">
+ <ul class="icons-ul">
+ <li><i class="icon-li icon-double-angle-right"></i>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</li>
+ <li><i class="icon-li icon-arrow-right"></i>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam et lectus id nisl hendrerit varius. Aliquam erat volutpat. Suspendisse potenti. Aliquam erat volutpat. Aliquam ut dolor lectus.</li>
+ <li><i class="icon-li icon-building"></i>Lorem ipsum dolor sit amet, consectetur adipiscing elit.
+ <i class="icon-building"></i>
+ <span class="label">foo</span>
+ <a class="btn">foo</a>
+ </li>
+ </ul>
+ </div>
+ </div>
+ <div class="span6">
+ <div style="border: solid 1px #d3d3d3;">
+ <ul class="icons-ul">
+ <li><i class="icon-li icon-double-angle-right icon-large"></i>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</li>
+ <li><i class="icon-li icon-arrow-right icon-large"></i>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam et lectus id nisl hendrerit varius. Aliquam erat volutpat. Suspendisse potenti. Aliquam erat volutpat. Aliquam ut dolor lectus.</li>
+ <li><i class="icon-li icon-building icon-large"></i>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="row">
+ <div class="span6">
+ <div style="border: solid 1px #d3d3d3;">
+ <ul class="icons-ul lead">
+ <li><i class="icon-li icon-double-angle-right"></i>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</li>
+ <li><i class="icon-li icon-arrow-right"></i>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam et lectus id nisl hendrerit varius. Aliquam erat volutpat. Suspendisse potenti. Aliquam erat volutpat. Aliquam ut dolor lectus.</li>
+ <li><i class="icon-li icon-building"></i>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</li>
+ </ul>
+ </div>
+ </div>
+ <div class="span6">
+ <div style="border: solid 1px #d3d3d3;">
+ <ul class="icons-ul lead">
+ <li><i class="icon-li icon-double-angle-right icon-large"></i>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</li>
+ <li><i class="icon-li icon-arrow-right icon-large"></i>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam et lectus id nisl hendrerit varius. Aliquam erat volutpat. Suspendisse potenti. Aliquam erat volutpat. Aliquam ut dolor lectus.</li>
+ <li><i class="icon-li icon-building icon-large"></i>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="row">
+ <div class="span6">
+ <div style="border: solid 1px #d3d3d3;">
+ <ul class="icons-ul">
+ <li><a href="#"><i class="icon-li icon-double-angle-right"></i></a>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</li>
+ <li><a href="#"><i class="icon-li icon-arrow-right"></i></a>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam et lectus id nisl hendrerit varius. Aliquam erat volutpat. Suspendisse potenti. Aliquam erat volutpat. Aliquam ut dolor lectus.</li>
+ <li><a href="#"><i class="icon-li icon-building"></i></a>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</li>
+ </ul>
+ </div>
+ </div>
+ <div class="span6">
+ <div style="border: solid 1px #d3d3d3;">
+ <ul class="icons-ul">
+ <li><a href="#"><i class="icon-li icon-double-angle-right icon-large"></i></a>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</li>
+ <li><a href="#"><i class="icon-li icon-arrow-right icon-large"></i></a>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam et lectus id nisl hendrerit varius. Aliquam erat volutpat. Suspendisse potenti. Aliquam erat volutpat. Aliquam ut dolor lectus.</li>
+ <li><a href="#"><i class="icon-li icon-building icon-large"></i></a>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="row">
+ <div class="span6">
+ <div style="border: solid 1px #d3d3d3;">
+ <ul class="icons-ul">
+ <li><i class="icon-li icon-refresh icon-spin"></i>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</li>
+ <li><i class="icon-li icon-spinner icon-spin"></i>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam et lectus id nisl hendrerit varius. Aliquam erat volutpat. Suspendisse potenti. Aliquam erat volutpat. Aliquam ut dolor lectus.</li>
+ <li><i class="icon-li icon-spinner icon-spin"></i>Lorem ipsum dolor sit amet, consectetur adipiscing elit.
+ <i class="icon-building"></i>
+ <span class="label">foo</span>
+ <a class="btn">foo</a>
+ </li>
+ </ul>
+ </div>
+ </div>
+ <div class="span6">
+ <div style="border: solid 1px #d3d3d3;">
+ <ul class="icons-ul">
+ <li><i class="icon-li icon-refresh icon-spin icon-large"></i>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</li>
+ <li><i class="icon-li icon-spinner icon-spin icon-large"></i>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam et lectus id nisl hendrerit varius. Aliquam erat volutpat. Suspendisse potenti. Aliquam erat volutpat. Aliquam ut dolor lectus.</li>
+ <li><i class="icon-li icon-spinner icon-spin icon-large"></i>Lorem ipsum dolor sit amet, consectetur adipiscing elit.
+ <i class="icon-building"></i>
+ <span class="label">foo</span>
+ <a class="btn">foo</a>
+ </li>
+ </ul>
+ </div>
+ </div>
+ </div>
+
+
+ <div class="row">
+ <div class="span6">
+ <div style="border: solid 1px #d3d3d3;">
+ <ul>
+ <li>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</li>
+ <li>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam et lectus id nisl hendrerit varius. Aliquam erat volutpat. Suspendisse potenti. Aliquam erat volutpat. Aliquam ut dolor lectus.</li>
+ <li>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</li>
+ </ul>
+ </div>
+ </div>
+ <div class="span6">
+ <div style="border: solid 1px #d3d3d3;">
+ <ul>
+ <li>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</li>
+ <li>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam et lectus id nisl hendrerit varius. Aliquam erat volutpat. Suspendisse potenti. Aliquam erat volutpat. Aliquam ut dolor lectus.</li>
+ <li>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</li>
+ </ul>
+ </div>
+ </div>
+ </div>
+
+
+ <h3>Spinning icons <small>icons should be aligned well and on center, buttons should be same height, won't work in ie7</small></h3>
+ <div style="border: solid 1px #d3d3d3;">
+ <i class="icon-refresh icon-spin"></i> Loading...
+ <button class="btn btn-small"><i class="icon-refresh icon-spin"></i> Loading...</button>
+ <button class="btn btn-small">Loading...</button>
+ <i class="icon-circle-blank icon-spin"></i> Loading...
+ <button class="btn btn-small"><i class="icon-circle-blank icon-spin"></i> Loading...</button>
+ <a href="#"><i class="icon-refresh icon-spin"></i> Loading...</a>
+ </div>
+ <div style="border: solid 1px #d3d3d3;">
+ <i class="icon-refresh icon-spin"></i> Loading...
+ <button class="btn"><i class="icon-refresh icon-spin"></i> Loading...</button>
+ <button class="btn">Loading...</button>
+ <i class="icon-circle-blank icon-spin"></i> Loading...
+ <button class="btn"><i class="icon-circle-blank icon-spin"></i> Loading...</button>
+ </div>
+ <div style="border: solid 1px #d3d3d3;">
+ <i class="icon-spinner icon-spin"></i> Loading...
+ <button class="btn btn-large"><i class="icon-spinner icon-spin"></i> Loading...</button>
+ <button class="btn btn-large">Loading...</button>
+ <i class="icon-circle-blank icon-spin"></i> Loading...
+ <button class="btn btn-large"><i class="icon-circle-blank icon-spin"></i> Loading...</button>
+ </div>
+ <h4>icon-large</h4>
+ <div style="border: solid 1px #d3d3d3;">
+ <i class="icon-refresh icon-large icon-spin"></i> Loading...
+ <button class="btn btn-small"><i class="icon-refresh icon-large icon-spin"></i> Loading...</button>
+ <button class="btn btn-small">Loading...</button>
+ <i class="icon-circle-blank icon-large icon-spin"></i> Loading...
+ <button class="btn btn-small"><i class="icon-circle-blank icon-large icon-spin"></i> Loading...</button>
+ </div>
+ <div style="border: solid 1px #d3d3d3;">
+ <i class="icon-refresh icon-large icon-spin"></i> Loading...
+ <button class="btn"><i class="icon-refresh icon-large icon-spin"></i> Loading...</button>
+ <button class="btn">Loading...</button>
+ <i class="icon-circle-blank icon-large icon-spin"></i> Loading...
+ <button class="btn"><i class="icon-circle-blank icon-large icon-spin"></i> Loading...</button>
+ </div>
+ <div style="border: solid 1px #d3d3d3;">
+ <i class="icon-spinner icon-large icon-spin"></i> Loading...
+ <button class="btn btn-large"><i class="icon-spinner icon-large icon-spin"></i> Loading...</button>
+ <button class="btn btn-large">Loading...</button>
+ <i class="icon-circle-blank icon-large icon-spin"></i> Loading...
+ <button class="btn btn-large"><i class="icon-circle-blank icon-large icon-spin"></i> Loading...</button>
+ </div>
+ <h4>Bootstrap Prepend and Append</h4>
+ <div class="row">
+ <div class="span6">
+ <div class="input-prepend">
+ <span class="add-on"><i class="icon-spinner icon-spin"></i></span>
+ <input class="span2" id="prependedInput" type="text" placeholder="Username">
+ </div>
+ </div>
+ <div class="span6">
+ <div class="input-append">
+ <input class="span2" id="appendedInput" type="text">
+ <span class="add-on"><i class="icon-spinner icon-spin"></i></span>
+ </div>
+ </div>
+ </div>
+
+ <h3>Stacked icons</h3>
+ <div class="well">
+ {% include tests/stacked.html %}
+ </div>
+ <div class="well lead">
+ {% include tests/stacked.html %}
+ </div>
+ <h4>Stacked icons inside anchor</h4>
+ <div class="well">
+ {% include tests/stacked-inside-anchor.html %}
+ </div>
+
+
+ <h3>Mirrored and rotated icons</h3>
+ <div class="row">
+ <div class="span6">
+ <div class="well">
+ {% include tests/rotated-flipped.html %}
+ </div>
+ </div>
+ <div class="span6">
+ <div class="well lead">
+ {% include tests/rotated-flipped.html %}
+ </div>
+ </div>
+ </div>
+ <h4>Mirrored and rotated icons inside anchors and buttons</h4>
+ <div class="row">
+ <div class="span6">
+ <div class="well">
+ {% include tests/rotated-flipped-inside-anchor.html %}
+ </div>
+ </div>
+ <div class="span6">
+ <div class="well">
+ {% include tests/rotated-flipped-inside-btn.html %}
+ </div>
+ </div>
+ </div>
+
+</section>
diff --git a/library/font_awesome/src/whats-new.html b/library/font_awesome/src/whats-new.html
new file mode 100644
index 000000000..f6c1da17e
--- /dev/null
+++ b/library/font_awesome/src/whats-new.html
@@ -0,0 +1,17 @@
+---
+layout: base
+title: What's New
+navbar_active: whats-new
+relative_path: ../
+---
+{% capture jumbotron_h1 %}<i class="icon-lightbulb icon-large"></i>&nbsp; What's New{% endcapture %}
+{% capture jumbotron_p %}What's New in the latest version &mdash; Font Awesome {{ site.fontawesome.minor_version }}{% endcapture %}
+
+{% include jumbotron.html %}
+{% include stripe-social.html %}
+
+<div class="container">
+ {% include whats-new.html %}
+ {% include examples/new.html %}
+ {% include icons/new.html %}
+</div>
diff --git a/library/fullcalendar/changelog.txt b/library/fullcalendar/changelog.txt
index 17b31f862..549631ad0 100644
--- a/library/fullcalendar/changelog.txt
+++ b/library/fullcalendar/changelog.txt
@@ -1,4 +1,28 @@
+version 1.6.0 (3/18/13)
+ - visual facelift, with bootstrap-inspired buttons and colors
+ - simplified HTML/CSS for events and buttons
+ - dayRender, for modifying a day cell (issue 191, thx althaus)
+ - week numbers on side of calendar (issue 295)
+ - weekNumber
+ - weekNumberCalculation
+ - weekNumberTitle
+ - "W" formatting variable
+ - finer snapping granularity for agenda view events (issue 495, thx ms-doodle-com)
+ - eventAfterAllRender (issue 753, thx pdrakeweb)
+ - eventDataTransform (thx joeyspo)
+ - data-date attributes on cells (thx Jae)
+ - expose $.fullCalendar.dateFormatters
+ - when clicking fast on buttons, prevent text selection
+ - bundled with latest jQuery (1.9.1) and jQuery UI (1.10.2)
+ - Grunt/Lumbar build system for internal development
+ - build for Bower package manager
+ - build for jQuery plugin site
+
+version 1.5.4 (9/5/12)
+ - made compatible with jQuery 1.8.* (thx archaeron)
+ - bundled with jQuery 1.8.1 and jQuery UI 1.8.23
+
version 1.5.3 (2/6/12)
- fixed dragging issue with jQuery UI 1.8.16 (issue 1168)
- bundled with jQuery 1.7.1 and jQuery UI 1.8.17
diff --git a/library/fullcalendar/fullcalendar.css b/library/fullcalendar/fullcalendar.css
index 04f118493..db0544543 100644
--- a/library/fullcalendar/fullcalendar.css
+++ b/library/fullcalendar/fullcalendar.css
@@ -1,12 +1,7 @@
-/*
- * FullCalendar v1.5.3 Stylesheet
- *
- * Copyright (c) 2011 Adam Shaw
- * Dual licensed under the MIT and GPL licenses, located in
- * MIT-LICENSE.txt and GPL-LICENSE.txt respectively.
- *
- * Date: Mon Feb 6 22:40:40 2012 -0800
- *
+/*!
+ * FullCalendar v1.6.0 Stylesheet
+ * Docs & License: http://arshaw.com/fullcalendar/
+ * (c) 2013 Adam Shaw
*/
@@ -79,11 +74,8 @@ html .fc,
margin-right: -1px;
}
-.fc-header .fc-corner-right {
- margin-right: 1px; /* back to normal */
- }
-
-.fc-header .ui-corner-right {
+.fc-header .fc-corner-right, /* non-theme */
+.fc-header .ui-corner-right { /* theme */
margin-right: 0; /* back to normal */
}
@@ -124,17 +116,17 @@ html .fc,
.fc-widget-header, /* <th>, usually */
.fc-widget-content { /* <td>, usually */
- border: 1px solid #ccc;
+ border: 1px solid #ddd;
}
.fc-state-highlight { /* <td> today cell */ /* TODO: add .fc-today to <th> */
- background: #ffc;
+ background: #fcf8e3;
}
.fc-cell-overlay { /* semi-transparent rectangle while dragging */
- background: #9cf;
- opacity: .2;
- filter: alpha(opacity=20); /* for IE */
+ background: #bce8f1;
+ opacity: .3;
+ filter: alpha(opacity=30); /* for IE */
}
@@ -145,43 +137,54 @@ html .fc,
.fc-button {
position: relative;
display: inline-block;
+ padding: 0 .6em;
+ overflow: hidden;
+ height: 1.9em;
+ line-height: 1.9em;
+ white-space: nowrap;
cursor: pointer;
}
.fc-state-default { /* non-theme */
- border-style: solid;
- border-width: 1px 0;
+ border: 1px solid;
}
-
-.fc-button-inner {
- position: relative;
- float: left;
- overflow: hidden;
+
+.fc-state-default.fc-corner-left { /* non-theme */
+ border-top-left-radius: 4px;
+ border-bottom-left-radius: 4px;
}
-
-.fc-state-default .fc-button-inner { /* non-theme */
- border-style: solid;
- border-width: 0 1px;
+
+.fc-state-default.fc-corner-right { /* non-theme */
+ border-top-right-radius: 4px;
+ border-bottom-right-radius: 4px;
}
-
-.fc-button-content {
- position: relative;
- float: left;
- height: 1.9em;
- line-height: 1.9em;
- padding: 0 .6em;
- white-space: nowrap;
+
+/*
+ Our default prev/next buttons use HTML entities like &lsaquo; &rsaquo; &laquo; &raquo;
+ and we'll try to make them look good cross-browser.
+*/
+
+.fc-text-arrow {
+ margin: 0 .1em;
+ font-size: 2em;
+ font-family: "Courier New", Courier, monospace;
+ vertical-align: baseline; /* for IE7 */
+ }
+
+.fc-button-prev .fc-text-arrow,
+.fc-button-next .fc-text-arrow { /* for &lsaquo; &rsaquo; */
+ font-weight: bold;
}
/* icon (for jquery ui) */
-.fc-button-content .fc-icon-wrap {
+.fc-button .fc-icon-wrap {
position: relative;
float: left;
top: 50%;
}
-.fc-button-content .ui-icon {
+.fc-button .ui-icon {
position: relative;
float: left;
margin-top: -50%;
@@ -189,107 +192,89 @@ html .fc,
*top: -50%;
}
-/* gloss effect */
-
-.fc-state-default .fc-button-effect {
- position: absolute;
- top: 50%;
- left: 0;
- }
-
-.fc-state-default .fc-button-effect span {
- position: absolute;
- top: -100px;
- left: 0;
- width: 500px;
- height: 100px;
- border-width: 100px 0 0 1px;
- border-style: solid;
- border-color: #fff;
- background: #444;
- opacity: .09;
- filter: alpha(opacity=9);
- }
-
-/* button states (determines colors) */
-
-.fc-state-default,
-.fc-state-default .fc-button-inner {
- border-style: solid;
- border-color: #ccc #bbb #aaa;
- background: #F3F3F3;
- color: #000;
+/*
+ button states
+ borrowed from twitter bootstrap (http://twitter.github.com/bootstrap/)
+*/
+
+.fc-state-default {
+ background-color: #f5f5f5;
+ background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6);
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));
+ background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6);
+ background-image: -o-linear-gradient(top, #ffffff, #e6e6e6);
+ background-image: linear-gradient(to bottom, #ffffff, #e6e6e6);
+ background-repeat: repeat-x;
+ border-color: #e6e6e6 #e6e6e6 #bfbfbf;
+ border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+ color: #333;
+ text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
}
-
+
.fc-state-hover,
-.fc-state-hover .fc-button-inner {
- border-color: #999;
- }
-
.fc-state-down,
-.fc-state-down .fc-button-inner {
- border-color: #555;
- background: #777;
- }
-
.fc-state-active,
-.fc-state-active .fc-button-inner {
- border-color: #555;
- background: #777;
- color: #fff;
+.fc-state-disabled {
+ color: #333333;
+ background-color: #e6e6e6;
}
-
-.fc-state-disabled,
-.fc-state-disabled .fc-button-inner {
- color: #999;
- border-color: #ddd;
+
+.fc-state-hover {
+ color: #333333;
+ text-decoration: none;
+ background-position: 0 -15px;
+ -webkit-transition: background-position 0.1s linear;
+ -moz-transition: background-position 0.1s linear;
+ -o-transition: background-position 0.1s linear;
+ transition: background-position 0.1s linear;
}
-
+
+.fc-state-down,
+.fc-state-active {
+ background-color: #cccccc;
+ background-image: none;
+ outline: 0;
+ box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+ }
+
.fc-state-disabled {
cursor: default;
+ background-image: none;
+ opacity: 0.65;
+ filter: alpha(opacity=65);
+ box-shadow: none;
}
-
-.fc-state-disabled .fc-button-effect {
- display: none;
- }
-
+
/* Global Event Styles
------------------------------------------------------------------------*/
.fc-event {
- border-style: solid;
- border-width: 0;
+ border: 1px solid #3a87ad; /* default BORDER color */
+ background-color: #3a87ad; /* default BACKGROUND color */
+ color: #fff; /* default TEXT color */
+ text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
font-size: .85em;
cursor: default;
}
+
+a.fc-event {
+ text-decoration: none;
+ }
a.fc-event,
.fc-event-draggable {
cursor: pointer;
}
-a.fc-event {
- text-decoration: none;
- }
-
.fc-rtl .fc-event {
text-align: right;
}
-
-.fc-event-skin {
- border-color: #36c; /* default BORDER color */
- background-color: #36c; /* default BACKGROUND color */
- color: #fff; /* default TEXT color */
- }
-
+
.fc-event-inner {
- position: relative;
width: 100%;
- height: 100%;
- border-style: solid;
- border-width: 0;
overflow: hidden;
}
@@ -298,7 +283,7 @@ a.fc-event {
padding: 0 1px;
}
-.fc .ui-resizable-handle { /*** TODO: don't use ui-resizable anymore, change class ***/
+.fc .ui-resizable-handle {
display: block;
position: absolute;
z-index: 99999;
@@ -316,6 +301,20 @@ a.fc-event {
border-width: 1px 0;
margin-bottom: 1px;
}
+
+.fc-ltr .fc-event-hori.fc-event-start,
+.fc-rtl .fc-event-hori.fc-event-end {
+ border-left-width: 1px;
+ border-top-left-radius: 3px;
+ border-bottom-left-radius: 3px;
+ }
+
+.fc-ltr .fc-event-hori.fc-event-end,
+.fc-rtl .fc-event-hori.fc-event-start {
+ border-right-width: 1px;
+ border-top-right-radius: 3px;
+ border-bottom-right-radius: 3px;
+ }
/* resizable */
@@ -341,66 +340,6 @@ a.fc-event {
-/* Fake Rounded Corners (for buttons and events)
-------------------------------------------------------------*/
-
-.fc-corner-left {
- margin-left: 1px;
- }
-
-.fc-corner-left .fc-button-inner,
-.fc-corner-left .fc-event-inner {
- margin-left: -1px;
- }
-
-.fc-corner-right {
- margin-right: 1px;
- }
-
-.fc-corner-right .fc-button-inner,
-.fc-corner-right .fc-event-inner {
- margin-right: -1px;
- }
-
-.fc-corner-top {
- margin-top: 1px;
- }
-
-.fc-corner-top .fc-event-inner {
- margin-top: -1px;
- }
-
-.fc-corner-bottom {
- margin-bottom: 1px;
- }
-
-.fc-corner-bottom .fc-event-inner {
- margin-bottom: -1px;
- }
-
-
-
-/* Fake Rounded Corners SPECIFICALLY FOR EVENTS
------------------------------------------------------------------*/
-
-.fc-corner-left .fc-event-inner {
- border-left-width: 1px;
- }
-
-.fc-corner-right .fc-event-inner {
- border-right-width: 1px;
- }
-
-.fc-corner-top .fc-event-inner {
- border-top-width: 1px;
- }
-
-.fc-corner-bottom .fc-event-inner {
- border-bottom-width: 1px;
- }
-
-
-
/* Reusable Separate-border Table
------------------------------------------------------------*/
@@ -436,6 +375,15 @@ table.fc-border-separate {
.fc-grid th {
text-align: center;
}
+
+.fc .fc-week-number {
+ width: 22px;
+ text-align: center;
+ }
+
+.fc .fc-week-number div {
+ padding: 0 2px;
+ }
.fc-grid .fc-day-number {
float: right;
@@ -492,6 +440,10 @@ table.fc-border-separate {
white-space: nowrap;
font-weight: normal;
}
+
+.fc-agenda .fc-week-number {
+ font-weight: bold;
+ }
.fc-agenda .fc-day-content {
padding: 2px 2px 1px;
@@ -566,19 +518,28 @@ table.fc-border-separate {
.fc-event-vert {
border-width: 0 1px;
}
-
-.fc-event-vert .fc-event-head,
-.fc-event-vert .fc-event-content {
- position: relative;
- z-index: 2;
- width: 100%;
- overflow: hidden;
+
+.fc-event-vert.fc-event-start {
+ border-top-width: 1px;
+ border-top-left-radius: 3px;
+ border-top-right-radius: 3px;
+ }
+
+.fc-event-vert.fc-event-end {
+ border-bottom-width: 1px;
+ border-bottom-left-radius: 3px;
+ border-bottom-right-radius: 3px;
}
.fc-event-vert .fc-event-time {
white-space: nowrap;
font-size: 10px;
}
+
+.fc-event-vert .fc-event-inner {
+ position: relative;
+ z-index: 2;
+ }
.fc-event-vert .fc-event-bg { /* makes the event lighter w/ a semi-transparent overlay */
position: absolute;
diff --git a/library/fullcalendar/fullcalendar.js b/library/fullcalendar/fullcalendar.js
index 779a313c7..648938fee 100644
--- a/library/fullcalendar/fullcalendar.js
+++ b/library/fullcalendar/fullcalendar.js
@@ -1,23 +1,20 @@
-/**
- * @preserve
- * FullCalendar v1.5.3
- * http://arshaw.com/fullcalendar/
- *
+/*!
+ * FullCalendar v1.6.0
+ * Docs & License: http://arshaw.com/fullcalendar/
+ * (c) 2013 Adam Shaw
+ */
+
+/*
* Use fullcalendar.css for basic styling.
* For event drag & drop, requires jQuery UI draggable.
* For event resizing, requires jQuery UI resizable.
- *
- * Copyright (c) 2011 Adam Shaw
- * Dual licensed under the MIT and GPL licenses, located in
- * MIT-LICENSE.txt and GPL-LICENSE.txt respectively.
- *
- * Date: Mon Feb 6 22:40:40 2012 -0800
- *
*/
(function($, undefined) {
+;;
+
var defaults = {
// display
@@ -29,6 +26,9 @@ var defaults = {
right: 'today prev,next'
},
weekends: true,
+ weekNumbers: false,
+ weekNumberCalculation: 'iso',
+ weekNumberTitle: 'W',
// editing
//editable: false,
@@ -66,10 +66,10 @@ var defaults = {
dayNames: ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'],
dayNamesShort: ['Sun','Mon','Tue','Wed','Thu','Fri','Sat'],
buttonText: {
- prev: '&nbsp;&#9668;&nbsp;',
- next: '&nbsp;&#9658;&nbsp;',
- prevYear: '&nbsp;&lt;&lt;&nbsp;',
- nextYear: '&nbsp;&gt;&gt;&nbsp;',
+ prev: "<span class='fc-text-arrow'>&lsaquo;</span>",
+ next: "<span class='fc-text-arrow'>&rsaquo;</span>",
+ prevYear: "<span class='fc-text-arrow'>&laquo;</span>",
+ nextYear: "<span class='fc-text-arrow'>&raquo;</span>",
today: 'today',
month: 'month',
week: 'week',
@@ -98,10 +98,10 @@ var rtlDefaults = {
right: 'title'
},
buttonText: {
- prev: '&nbsp;&#9658;&nbsp;',
- next: '&nbsp;&#9668;&nbsp;',
- prevYear: '&nbsp;&gt;&gt;&nbsp;',
- nextYear: '&nbsp;&lt;&lt;&nbsp;'
+ prev: "<span class='fc-text-arrow'>&rsaquo;</span>",
+ next: "<span class='fc-text-arrow'>&lsaquo;</span>",
+ prevYear: "<span class='fc-text-arrow'>&raquo;</span>",
+ nextYear: "<span class='fc-text-arrow'>&laquo;</span>"
},
buttonIcons: {
prev: 'circle-triangle-e',
@@ -111,7 +111,9 @@ var rtlDefaults = {
-var fc = $.fullCalendar = { version: "1.5.3" };
+;;
+
+var fc = $.fullCalendar = { version: "1.6.0" };
var fcViews = fc.views = {};
@@ -177,6 +179,8 @@ function setDefaults(d) {
+;;
+
function Calendar(element, options, eventSources) {
var t = this;
@@ -258,6 +262,9 @@ function Calendar(element, options, eventSources) {
if (options.isRTL) {
element.addClass('fc-rtl');
}
+ else {
+ element.addClass('fc-ltr');
+ }
if (options.theme) {
element.addClass('ui-widget');
}
@@ -674,6 +681,8 @@ function Calendar(element, options, eventSources) {
}
+;;
+
function Header(calendar, options) {
var t = this;
@@ -747,54 +756,47 @@ function Header(calendar, options) {
var text = smartProperty(options.buttonText, buttonName); // why are we using smartProperty here?
var button = $(
"<span class='fc-button fc-button-" + buttonName + " " + tm + "-state-default'>" +
- "<span class='fc-button-inner'>" +
- "<span class='fc-button-content'>" +
- (icon ?
- "<span class='fc-icon-wrap'>" +
- "<span class='ui-icon ui-icon-" + icon + "'/>" +
- "</span>" :
- text
- ) +
- "</span>" +
- "<span class='fc-button-effect'><span></span></span>" +
- "</span>" +
+ (icon ?
+ "<span class='fc-icon-wrap'>" +
+ "<span class='ui-icon ui-icon-" + icon + "'/>" +
+ "</span>" :
+ text
+ ) +
"</span>"
- );
- if (button) {
- button
- .click(function() {
- if (!button.hasClass(tm + '-state-disabled')) {
- buttonClick();
- }
- })
- .mousedown(function() {
+ )
+ .click(function() {
+ if (!button.hasClass(tm + '-state-disabled')) {
+ buttonClick();
+ }
+ })
+ .mousedown(function() {
+ button
+ .not('.' + tm + '-state-active')
+ .not('.' + tm + '-state-disabled')
+ .addClass(tm + '-state-down');
+ })
+ .mouseup(function() {
+ button.removeClass(tm + '-state-down');
+ })
+ .hover(
+ function() {
button
.not('.' + tm + '-state-active')
.not('.' + tm + '-state-disabled')
- .addClass(tm + '-state-down');
- })
- .mouseup(function() {
- button.removeClass(tm + '-state-down');
- })
- .hover(
- function() {
- button
- .not('.' + tm + '-state-active')
- .not('.' + tm + '-state-disabled')
- .addClass(tm + '-state-hover');
- },
- function() {
- button
- .removeClass(tm + '-state-hover')
- .removeClass(tm + '-state-down');
- }
- )
- .appendTo(e);
- if (!prevButton) {
- button.addClass(tm + '-corner-left');
- }
- prevButton = button;
+ .addClass(tm + '-state-hover');
+ },
+ function() {
+ button
+ .removeClass(tm + '-state-hover')
+ .removeClass(tm + '-state-down');
+ }
+ )
+ .appendTo(e);
+ disableTextSelection(button);
+ if (!prevButton) {
+ button.addClass(tm + '-corner-left');
}
+ prevButton = button;
}
}
});
@@ -839,6 +841,8 @@ function Header(calendar, options) {
}
+;;
+
fc.sourceNormalizers = [];
fc.sourceFetchers = [];
@@ -914,6 +918,16 @@ function EventManager(options, _sources) {
_fetchEventSource(source, function(events) {
if (fetchID == currentFetchID) {
if (events) {
+
+ if (options.eventDataTransform) {
+ events = $.map(events, options.eventDataTransform);
+ }
+ if (source.eventDataTransform) {
+ events = $.map(events, source.eventDataTransform);
+ }
+ // TODO: this technique is not ideal for static array event sources.
+ // For arrays, we'll want to process all events right in the beginning, then never again.
+
for (var i=0; i<events.length; i++) {
events[i].source = source;
normalizeEvent(events[i]);
@@ -1227,6 +1241,8 @@ function EventManager(options, _sources) {
}
+;;
+
fc.addDays = addDays;
fc.cloneDate = cloneDate;
@@ -1581,10 +1597,38 @@ var dateFormatters = {
return 'th';
}
return ['st', 'nd', 'rd'][date%10-1] || 'th';
+ },
+ w : function(d, o) { // local
+ return o.weekNumberCalculation(d);
+ },
+ W : function(d) { // ISO
+ return iso8601Week(d);
}
};
+fc.dateFormatters = dateFormatters;
+
+
+/* thanks jQuery UI (https://github.com/jquery/jquery-ui/blob/master/ui/jquery.ui.datepicker.js)
+ *
+ * Set as calculateWeek to determine the week of the year based on the ISO 8601 definition.
+ * @param date Date - the date to get the week for
+ * @return number - the number of the week within the year that contains this date
+ */
+function iso8601Week(date) {
+ var time;
+ var checkDate = new Date(date.getTime());
+
+ // Find Thursday of this week starting on Monday
+ checkDate.setDate(checkDate.getDate() + 4 - (checkDate.getDay() || 7));
+
+ time = checkDate.getTime();
+ checkDate.setMonth(0); // Compare with Jan 1
+ checkDate.setDate(1);
+ return Math.floor(Math.round((time - checkDate) / 86400000) / 7) + 1;
+}
+;;
fc.applyAll = applyAll;
@@ -1658,7 +1702,7 @@ function sliceSegs(events, visEventEnds, start, end) {
msLength: segEnd - segStart
});
}
- }
+ }
return segs.sort(segCmp);
}
@@ -1742,29 +1786,26 @@ function setOuterHeight(element, height, includeMargins) {
}
-// TODO: curCSS has been deprecated (jQuery 1.4.3 - 10/16/2010)
-
-
function hsides(element, includeMargins) {
return hpadding(element) + hborders(element) + (includeMargins ? hmargins(element) : 0);
}
function hpadding(element) {
- return (parseFloat($.curCSS(element[0], 'paddingLeft', true)) || 0) +
- (parseFloat($.curCSS(element[0], 'paddingRight', true)) || 0);
+ return (parseFloat($.css(element[0], 'paddingLeft', true)) || 0) +
+ (parseFloat($.css(element[0], 'paddingRight', true)) || 0);
}
function hmargins(element) {
- return (parseFloat($.curCSS(element[0], 'marginLeft', true)) || 0) +
- (parseFloat($.curCSS(element[0], 'marginRight', true)) || 0);
+ return (parseFloat($.css(element[0], 'marginLeft', true)) || 0) +
+ (parseFloat($.css(element[0], 'marginRight', true)) || 0);
}
function hborders(element) {
- return (parseFloat($.curCSS(element[0], 'borderLeftWidth', true)) || 0) +
- (parseFloat($.curCSS(element[0], 'borderRightWidth', true)) || 0);
+ return (parseFloat($.css(element[0], 'borderLeftWidth', true)) || 0) +
+ (parseFloat($.css(element[0], 'borderRightWidth', true)) || 0);
}
@@ -1774,20 +1815,20 @@ function vsides(element, includeMargins) {
function vpadding(element) {
- return (parseFloat($.curCSS(element[0], 'paddingTop', true)) || 0) +
- (parseFloat($.curCSS(element[0], 'paddingBottom', true)) || 0);
+ return (parseFloat($.css(element[0], 'paddingTop', true)) || 0) +
+ (parseFloat($.css(element[0], 'paddingBottom', true)) || 0);
}
function vmargins(element) {
- return (parseFloat($.curCSS(element[0], 'marginTop', true)) || 0) +
- (parseFloat($.curCSS(element[0], 'marginBottom', true)) || 0);
+ return (parseFloat($.css(element[0], 'marginTop', true)) || 0) +
+ (parseFloat($.css(element[0], 'marginBottom', true)) || 0);
}
function vborders(element) {
- return (parseFloat($.curCSS(element[0], 'borderTopWidth', true)) || 0) +
- (parseFloat($.curCSS(element[0], 'borderBottomWidth', true)) || 0);
+ return (parseFloat($.css(element[0], 'borderTopWidth', true)) || 0) +
+ (parseFloat($.css(element[0], 'borderBottomWidth', true)) || 0);
}
@@ -1956,6 +1997,7 @@ function firstDefined() {
}
+;;
fcViews.month = MonthView;
@@ -2003,12 +2045,14 @@ function MonthView(element, calendar) {
t.end = end;
t.visStart = visStart;
t.visEnd = visEnd;
- renderBasic(6, rowCnt, nwe ? 5 : 7, true);
+ renderBasic(rowCnt, nwe ? 5 : 7, true);
}
}
+;;
+
fcViews.basicWeek = BasicWeekView;
function BasicWeekView(element, calendar) {
@@ -2049,12 +2093,14 @@ function BasicWeekView(element, calendar) {
t.end = end;
t.visStart = visStart;
t.visEnd = visEnd;
- renderBasic(1, 1, weekends ? 7 : 5, false);
+ renderBasic(1, weekends ? 7 : 5, false);
}
}
+;;
+
fcViews.basicDay = BasicDayView;
//TODO: when calendar's date starts out on a weekend, shouldn't happen
@@ -2086,12 +2132,14 @@ function BasicDayView(element, calendar) {
t.title = formatDate(date, opt('titleFormat'));
t.start = t.visStart = cloneDate(date, true);
t.end = t.visEnd = addDays(cloneDate(t.start), 1);
- renderBasic(1, 1, 1, false);
+ renderBasic(1, 1, false);
}
}
+;;
+
setDefaults({
weekMode: 'fixed'
});
@@ -2144,6 +2192,7 @@ function BasicView(element, calendar, viewName) {
// locals
+ var table;
var head;
var headCells;
var body;
@@ -2156,6 +2205,7 @@ function BasicView(element, calendar, viewName) {
var viewWidth;
var viewHeight;
var colWidth;
+ var weekNumberWidth;
var rowCnt, colCnt;
var coordinateGrid;
@@ -2164,9 +2214,12 @@ function BasicView(element, calendar, viewName) {
var rtl, dis, dit;
var firstDay;
- var nwe;
+ var nwe; // no weekends? a 0 or 1 for easy computations
var tm;
var colFormat;
+ var showWeekNumbers;
+ var weekNumberTitle;
+ var weekNumberFormat;
@@ -2177,17 +2230,17 @@ function BasicView(element, calendar, viewName) {
disableTextSelection(element.addClass('fc-grid'));
- function renderBasic(maxr, r, c, showNumbers) {
+ function renderBasic(r, c, showNumbers) {
rowCnt = r;
colCnt = c;
updateOptions();
var firstTime = !body;
if (firstTime) {
- buildSkeleton(maxr, showNumbers);
+ buildEventContainer();
}else{
clearEvents();
}
- updateCells(firstTime);
+ buildTable(showNumbers);
}
@@ -2205,124 +2258,141 @@ function BasicView(element, calendar, viewName) {
nwe = opt('weekends') ? 0 : 1;
tm = opt('theme') ? 'ui' : 'fc';
colFormat = opt('columnFormat');
+
+ // week # options. (TODO: bad, logic also in other views)
+ showWeekNumbers = opt('weekNumbers');
+ weekNumberTitle = opt('weekNumberTitle');
+ if (opt('weekNumberCalculation') != 'iso') {
+ weekNumberFormat = "w";
+ }
+ else {
+ weekNumberFormat = "W";
+ }
}
- function buildSkeleton(maxRowCnt, showNumbers) {
- var s;
+ function buildEventContainer() {
+ daySegmentContainer =
+ $("<div style='position:absolute;z-index:8;top:0;left:0'/>")
+ .appendTo(element);
+ }
+
+
+
+ function buildTable(showNumbers) {
+ var html = '';
+ var i, j;
var headerClass = tm + "-widget-header";
var contentClass = tm + "-widget-content";
- var i, j;
- var table;
-
- s =
- "<table class='fc-border-separate' style='width:100%' cellspacing='0'>" +
- "<thead>" +
- "<tr>";
+ var month = t.start.getMonth();
+ var today = clearTime(new Date());
+ var cellDate; // not to be confused with local function. TODO: better names
+ var cellClasses;
+ var cell;
+
+ html += "<table class='fc-border-separate' style='width:100%' cellspacing='0'>" +
+ "<thead>" +
+ "<tr>";
+
+ if (showWeekNumbers) {
+ html += "<th class='fc-week-number " + headerClass + "'/>";
+ }
+
for (i=0; i<colCnt; i++) {
- s +=
- "<th class='fc- " + headerClass + "'/>"; // need fc- for setDayID
+ html += "<th class='fc-day-header fc-" + dayIDs[i] + " " + headerClass + "'/>";
}
- s +=
- "</tr>" +
- "</thead>" +
- "<tbody>";
- for (i=0; i<maxRowCnt; i++) {
- s +=
- "<tr class='fc-week" + i + "'>";
+
+ html += "</tr>" +
+ "</thead>" +
+ "<tbody>";
+
+ for (i=0; i<rowCnt; i++) {
+ html += "<tr class='fc-week'>";
+
+ if (showWeekNumbers) {
+ html += "<td class='fc-week-number " + contentClass + "'>" +
+ "<div/>" +
+ "</td>";
+ }
+
for (j=0; j<colCnt; j++) {
- s +=
- "<td class='fc- " + contentClass + " fc-day" + (i*colCnt+j) + "'>" + // need fc- for setDayID
- "<div>" +
- (showNumbers ?
- "<div class='fc-day-number'/>" :
- ''
- ) +
- "<div class='fc-day-content'>" +
- "<div style='position:relative'>&nbsp;</div>" +
- "</div>" +
- "</div>" +
- "</td>";
+ cellDate = _cellDate(i, j); // a little confusing. cellDate is local variable. _cellDate is private function
+
+ cellClasses = [
+ 'fc-day',
+ 'fc-' + dayIDs[cellDate.getDay()],
+ contentClass
+ ];
+ if (cellDate.getMonth() != month) {
+ cellClasses.push('fc-other-month');
+ }
+ if (+cellDate == +today) {
+ cellClasses.push('fc-today');
+ cellClasses.push(tm + '-state-highlight');
+ }
+
+ html += "<td" +
+ " class='" + cellClasses.join(' ') + "'" +
+ " data-date='" + formatDate(cellDate, 'yyyy-MM-dd') + "'" +
+ ">" +
+ "<div>";
+ if (showNumbers) {
+ html += "<div class='fc-day-number'>" + cellDate.getDate() + "</div>";
+ }
+ html += "<div class='fc-day-content'>" +
+ "<div style='position:relative'>&nbsp;</div>" +
+ "</div>" +
+ "</div>" +
+ "</td>";
}
- s +=
- "</tr>";
+
+ html += "</tr>";
}
- s +=
- "</tbody>" +
- "</table>";
- table = $(s).appendTo(element);
-
+ html += "</tbody>" +
+ "</table>";
+
+ lockHeight(); // the unlock happens later, in setHeight()...
+ if (table) {
+ table.remove();
+ }
+ table = $(html).appendTo(element);
+
head = table.find('thead');
- headCells = head.find('th');
+ headCells = head.find('.fc-day-header');
body = table.find('tbody');
bodyRows = body.find('tr');
- bodyCells = body.find('td');
- bodyFirstCells = bodyCells.filter(':first-child');
- bodyCellTopInners = bodyRows.eq(0).find('div.fc-day-content div');
+ bodyCells = body.find('.fc-day');
+ bodyFirstCells = bodyRows.find('td:first-child');
+ bodyCellTopInners = bodyRows.eq(0).find('.fc-day-content > div');
markFirstLast(head.add(head.find('tr'))); // marks first+last tr/th's
markFirstLast(bodyRows); // marks first+last td's
- bodyRows.eq(0).addClass('fc-first'); // fc-last is done in updateCells
-
- dayBind(bodyCells);
-
- daySegmentContainer =
- $("<div style='position:absolute;z-index:8;top:0;left:0'/>")
- .appendTo(element);
- }
+ bodyRows.eq(0).addClass('fc-first');
+ bodyRows.filter(':last').addClass('fc-last');
-
-
- function updateCells(firstTime) {
- var dowDirty = firstTime || rowCnt == 1; // could the cells' day-of-weeks need updating?
- var month = t.start.getMonth();
- var today = clearTime(new Date());
- var cell;
- var date;
- var row;
-
- if (dowDirty) {
- headCells.each(function(i, _cell) {
- cell = $(_cell);
- date = indexDate(i);
- cell.html(formatDate(date, colFormat));
- setDayID(cell, date);
+ if (showWeekNumbers) {
+ head.find('.fc-week-number').text(weekNumberTitle);
+ }
+
+ headCells.each(function(i, _cell) {
+ var date = indexDate(i);
+ $(_cell).text(formatDate(date, colFormat));
+ });
+
+ if (showWeekNumbers) {
+ body.find('.fc-week-number > div').each(function(i, _cell) {
+ var weekStart = _cellDate(i, 0);
+ $(_cell).text(formatDate(weekStart, weekNumberFormat));
});
}
bodyCells.each(function(i, _cell) {
- cell = $(_cell);
- date = indexDate(i);
- if (date.getMonth() == month) {
- cell.removeClass('fc-other-month');
- }else{
- cell.addClass('fc-other-month');
- }
- if (+date == +today) {
- cell.addClass(tm + '-state-highlight fc-today');
- }else{
- cell.removeClass(tm + '-state-highlight fc-today');
- }
- cell.find('div.fc-day-number').text(date.getDate());
- if (dowDirty) {
- setDayID(cell, date);
- }
- });
-
- bodyRows.each(function(i, _row) {
- row = $(_row);
- if (i < rowCnt) {
- row.show();
- if (i == rowCnt-1) {
- row.addClass('fc-last');
- }else{
- row.removeClass('fc-last');
- }
- }else{
- row.hide();
- }
+ var date = indexDate(i);
+ trigger('dayRender', t, date, $(_cell));
});
+
+ dayBind(bodyCells);
}
@@ -2352,13 +2422,20 @@ function BasicView(element, calendar, viewName) {
}
});
+ unlockHeight();
}
function setWidth(width) {
viewWidth = width;
colContentPositions.clear();
- colWidth = Math.floor(viewWidth / colCnt);
+
+ weekNumberWidth = 0;
+ if (showWeekNumbers) {
+ weekNumberWidth = head.find('th.fc-week-number').outerWidth();
+ }
+
+ colWidth = Math.floor((viewWidth - weekNumberWidth) / colCnt);
setOuterWidth(headCells.slice(0, -1), colWidth);
}
@@ -2376,8 +2453,7 @@ function BasicView(element, calendar, viewName) {
function dayClick(ev) {
if (!opt('selectable')) { // if selectable, SelectionManager will worry about dayClick
- var index = parseInt(this.className.match(/fc\-day(\d+)/)[1]); // TODO: maybe use .data
- var date = indexDate(index);
+ var date = parseISO8601($(this).data('date'));
trigger('dayClick', this, date, true, ev);
}
}
@@ -2568,15 +2644,34 @@ function BasicView(element, calendar, viewName) {
function allDayBounds(i) {
+ var left = 0;
+ if (showWeekNumbers) {
+ left += weekNumberWidth;
+ }
return {
- left: 0,
+ left: left,
right: viewWidth
};
}
-
+
+
+
+ // makes sure height doesn't collapse while we destroy/render new cells
+ // (this causes a bad end-user scrollbar jump)
+ // TODO: generalize this for all view rendering. (also in Calendar.js)
+
+ function lockHeight() {
+ setMinHeight(element, element.height());
+ }
+
+ function unlockHeight() {
+ setMinHeight(element, 1);
+ }
}
+;;
+
function BasicEventRenderer() {
var t = this;
@@ -2619,6 +2714,7 @@ function BasicEventRenderer() {
function renderEvents(events, modifiedEventId) {
reportEvents(events);
renderDaySegs(compileSegs(events), modifiedEventId);
+ trigger('eventAfterAllRender');
}
@@ -2718,6 +2814,8 @@ function BasicEventRenderer() {
}
+;;
+
fcViews.agendaWeek = AgendaWeekView;
function AgendaWeekView(element, calendar) {
@@ -2764,6 +2862,8 @@ function AgendaWeekView(element, calendar) {
}
+;;
+
fcViews.agendaDay = AgendaDayView;
function AgendaDayView(element, calendar) {
@@ -2800,6 +2900,8 @@ function AgendaDayView(element, calendar) {
}
+;;
+
setDefaults({
allDaySlot: true,
allDayText: 'all-day',
@@ -2851,7 +2953,8 @@ function AgendaView(element, calendar, viewName) {
t.getRowCnt = function() { return 1 };
t.getColCnt = function() { return colCnt };
t.getColWidth = function() { return colWidth };
- t.getSlotHeight = function() { return slotHeight };
+ t.getSnapHeight = function() { return snapHeight };
+ t.getSnapMinutes = function() { return snapMinutes };
t.defaultSelectionEnd = defaultSelectionEnd;
t.renderDayOverlay = renderDayOverlay;
t.renderSelection = renderSelection;
@@ -2907,7 +3010,10 @@ function AgendaView(element, calendar, viewName) {
var colWidth;
var gutterWidth;
var slotHeight; // TODO: what if slotHeight changes? (see issue 650)
- var savedScrollTop;
+
+ var snapMinutes;
+ var snapRatio; // ratio of number of "selection" slots to normal slots. (ex: 1, 2, 4)
+ var snapHeight; // holds the pixel hight of a "selection" slot
var colCnt;
var slotCnt;
@@ -2915,6 +3021,7 @@ function AgendaView(element, calendar, viewName) {
var hoverListener;
var colContentPositions;
var slotTopCache = {};
+ var savedScrollTop;
var tm;
var firstDay;
@@ -2922,6 +3029,9 @@ function AgendaView(element, calendar, viewName) {
var rtl, dis, dit; // day index sign / translate
var minMinute, maxMinute;
var colFormat;
+ var showWeekNumbers;
+ var weekNumberTitle;
+ var weekNumberFormat;
@@ -2959,6 +3069,18 @@ function AgendaView(element, calendar, viewName) {
minMinute = parseTime(opt('minTime'));
maxMinute = parseTime(opt('maxTime'));
colFormat = opt('columnFormat');
+
+ // week # options. (TODO: bad, logic also in other views)
+ showWeekNumbers = opt('weekNumbers');
+ weekNumberTitle = opt('weekNumberTitle');
+ if (opt('weekNumberCalculation') != 'iso') {
+ weekNumberFormat = "w";
+ }
+ else {
+ weekNumberFormat = "W";
+ }
+
+ snapMinutes = opt('snapMinutes') || opt('slotMinutes');
}
@@ -2976,8 +3098,15 @@ function AgendaView(element, calendar, viewName) {
s =
"<table style='width:100%' class='fc-agenda-days fc-border-separate' cellspacing='0'>" +
"<thead>" +
- "<tr>" +
- "<th class='fc-agenda-axis " + headerClass + "'>&nbsp;</th>";
+ "<tr>";
+
+ if (showWeekNumbers) {
+ s += "<th class='fc-agenda-axis fc-week-number " + headerClass + "'/>";
+ }
+ else {
+ s += "<th class='fc-agenda-axis " + headerClass + "'>&nbsp;</th>";
+ }
+
for (i=0; i<colCnt; i++) {
s +=
"<th class='fc- fc-col" + i + ' ' + headerClass + "'/>"; // fc- needed for setDayID
@@ -3111,6 +3240,18 @@ function AgendaView(element, calendar, viewName) {
var bodyCell;
var date;
var today = clearTime(new Date());
+
+ if (showWeekNumbers) {
+ var weekText = formatDate(colDate(0), weekNumberFormat);
+ if (rtl) {
+ weekText = weekText + weekNumberTitle;
+ }
+ else {
+ weekText = weekNumberTitle + weekText;
+ }
+ dayHead.find('.fc-week-number').text(weekText);
+ }
+
for (i=0; i<colCnt; i++) {
date = colDate(i);
headCell = dayHeadCells.eq(i);
@@ -3149,6 +3290,9 @@ function AgendaView(element, calendar, viewName) {
slotScroller.height(bodyHeight - allDayHeight - 1);
slotHeight = slotTableFirstInner.height() + 1; // +1 for border
+
+ snapRatio = opt('slotMinutes') / snapMinutes;
+ snapHeight = slotHeight / snapRatio;
if (dateChanged) {
resetScroll();
@@ -3337,10 +3481,10 @@ function AgendaView(element, calendar, viewName) {
function constrain(n) {
return Math.max(slotScrollerTop, Math.min(slotScrollerBottom, n));
}
- for (var i=0; i<slotCnt; i++) {
+ for (var i=0; i<slotCnt*snapRatio; i++) { // adapt slot count to increased/decreased selection slot count
rows.push([
- constrain(slotTableTop + slotHeight*i),
- constrain(slotTableTop + slotHeight*(i+1))
+ constrain(slotTableTop + snapHeight*i),
+ constrain(slotTableTop + snapHeight*(i+1))
]);
}
});
@@ -3381,7 +3525,7 @@ function AgendaView(element, calendar, viewName) {
slotIndex--;
}
if (slotIndex >= 0) {
- addMinutes(d, minMinute + slotIndex * opt('slotMinutes'));
+ addMinutes(d, minMinute + slotIndex * snapMinutes);
}
return d;
}
@@ -3544,9 +3688,9 @@ function AgendaView(element, calendar, viewName) {
var d2 = cellDate(cell);
dates = [
d1,
- addMinutes(cloneDate(d1), opt('slotMinutes')),
+ addMinutes(cloneDate(d1), snapMinutes), // calculate minutes depending on selection slot minutes
d2,
- addMinutes(cloneDate(d2), opt('slotMinutes'))
+ addMinutes(cloneDate(d2), snapMinutes)
].sort(cmp);
renderSlotSelection(dates[0], dates[3]);
}else{
@@ -3603,6 +3747,8 @@ function AgendaView(element, calendar, viewName) {
}
+;;
+
function AgendaEventRenderer() {
var t = this;
@@ -3639,7 +3785,8 @@ function AgendaEventRenderer() {
var resizableDayEvent = t.resizableDayEvent; // TODO: streamline binding architecture
var getColCnt = t.getColCnt;
var getColWidth = t.getColWidth;
- var getSlotHeight = t.getSlotHeight;
+ var getSnapHeight = t.getSnapHeight;
+ var getSnapMinutes = t.getSnapMinutes;
var getBodyContent = t.getBodyContent;
var reportEventElement = t.reportEventElement;
var showEvents = t.showEvents;
@@ -3675,6 +3822,7 @@ function AgendaEventRenderer() {
setHeight(); // no params means set to viewHeight
}
renderSlotSegs(compileSlotSegs(slotEvents), modifiedEventId);
+ trigger('eventAfterAllRender');
}
@@ -3760,7 +3908,7 @@ function AgendaEventRenderer() {
vsideCache={},
hsideCache={},
key, val,
- contentElement,
+ titleElement,
height,
slotSegmentContainer = getSlotSegmentContainer(),
rtl, dis, dit,
@@ -3849,9 +3997,9 @@ function AgendaEventRenderer() {
seg.vsides = val === undefined ? (vsideCache[key] = vsides(eventElement, true)) : val;
val = hsideCache[key];
seg.hsides = val === undefined ? (hsideCache[key] = hsides(eventElement, true)) : val;
- contentElement = eventElement.find('div.fc-event-content');
- if (contentElement.length) {
- seg.contentTop = contentElement[0].offsetTop;
+ titleElement = eventElement.find('.fc-event-title');
+ if (titleElement.length) {
+ seg.contentTop = titleElement[0].offsetTop;
}
}
}
@@ -3865,7 +4013,7 @@ function AgendaEventRenderer() {
eventElement[0].style.height = height + 'px';
event = seg.event;
if (seg.contentTop !== undefined && height - seg.contentTop < 10) {
- // not enough room for title, put it in the time header
+ // not enough room for title, put it in the time (TODO: maybe make both display:inline instead)
eventElement.find('div.fc-event-time')
.text(formatDate(event.start, opt('timeFormat')) + ' - ' + event.title);
eventElement.find('div.fc-event-title')
@@ -3882,16 +4030,15 @@ function AgendaEventRenderer() {
var html = "<";
var url = event.url;
var skinCss = getSkinCss(event, opt);
- var skinCssAttr = (skinCss ? " style='" + skinCss + "'" : '');
- var classes = ['fc-event', 'fc-event-skin', 'fc-event-vert'];
+ var classes = ['fc-event', 'fc-event-vert'];
if (isEventDraggable(event)) {
classes.push('fc-event-draggable');
}
if (seg.isStart) {
- classes.push('fc-corner-top');
+ classes.push('fc-event-start');
}
if (seg.isEnd) {
- classes.push('fc-corner-bottom');
+ classes.push('fc-event-end');
}
classes = classes.concat(event.className);
if (event.source) {
@@ -3906,19 +4053,15 @@ function AgendaEventRenderer() {
" class='" + classes.join(' ') + "'" +
" style='position:absolute;z-index:8;top:" + seg.top + "px;left:" + seg.left + "px;" + skinCss + "'" +
">" +
- "<div class='fc-event-inner fc-event-skin'" + skinCssAttr + ">" +
- "<div class='fc-event-head fc-event-skin'" + skinCssAttr + ">" +
+ "<div class='fc-event-inner'>" +
"<div class='fc-event-time'>" +
htmlEscape(formatDates(event.start, event.end, opt('timeFormat'))) +
"</div>" +
- "</div>" +
- "<div class='fc-event-content'>" +
"<div class='fc-event-title'>" +
htmlEscape(event.title) +
"</div>" +
"</div>" +
- "<div class='fc-event-bg'></div>" +
- "</div>"; // close inner
+ "<div class='fc-event-bg'></div>";
if (seg.isEnd && isEventResizable(event)) {
html +=
"<div class='ui-resizable-handle ui-resizable-s'>=</div>";
@@ -3968,7 +4111,8 @@ function AgendaEventRenderer() {
var dis = opt('isRTL') ? -1 : 1;
var hoverListener = getHoverListener();
var colWidth = getColWidth();
- var slotHeight = getSlotHeight();
+ var snapHeight = getSnapHeight();
+ var snapMinutes = getSnapMinutes();
var minMinute = getMinMinute();
eventElement.draggable({
zIndex: 9,
@@ -3999,9 +4143,9 @@ function AgendaEventRenderer() {
eventElement.width(colWidth - 10); // don't use entire width
setOuterHeight(
eventElement,
- slotHeight * Math.round(
- (event.end ? ((event.end - event.start) / MINUTE_MS) : opt('defaultEventMinutes'))
- / opt('slotMinutes')
+ snapHeight * Math.round(
+ (event.end ? ((event.end - event.start) / MINUTE_MS) : opt('defaultEventMinutes')) /
+ snapMinutes
)
);
eventElement.draggable('option', 'grid', [colWidth, 1]);
@@ -4033,8 +4177,8 @@ function AgendaEventRenderer() {
// changed!
var minuteDelta = 0;
if (!allDay) {
- minuteDelta = Math.round((eventElement.offset().top - getBodyContent().offset().top) / slotHeight)
- * opt('slotMinutes')
+ minuteDelta = Math.round((eventElement.offset().top - getBodyContent().offset().top) / snapHeight)
+ * snapMinutes
+ minMinute
- (event.start.getHours() * 60 + event.start.getMinutes());
}
@@ -4067,11 +4211,12 @@ function AgendaEventRenderer() {
var hoverListener = getHoverListener();
var colCnt = getColCnt();
var colWidth = getColWidth();
- var slotHeight = getSlotHeight();
+ var snapHeight = getSnapHeight();
+ var snapMinutes = getSnapMinutes();
eventElement.draggable({
zIndex: 9,
scroll: false,
- grid: [colWidth, slotHeight],
+ grid: [colWidth, snapHeight],
axis: colCnt==1 ? 'y' : false,
opacity: opt('dragOpacity'),
revertDuration: opt('dragRevertDuration'),
@@ -4105,7 +4250,7 @@ function AgendaEventRenderer() {
}, ev, 'drag');
},
drag: function(ev, ui) {
- minuteDelta = Math.round((ui.position.top - origPosition.top) / slotHeight) * opt('slotMinutes');
+ minuteDelta = Math.round((ui.position.top - origPosition.top) / snapHeight) * snapMinutes;
if (minuteDelta != prevMinuteDelta) {
if (!allDay) {
updateTimeText(minuteDelta);
@@ -4142,7 +4287,7 @@ function AgendaEventRenderer() {
// convert back to original slot-event
if (allDay) {
timeElement.css('display', ''); // show() was causing display=inline
- eventElement.draggable('option', 'grid', [colWidth, slotHeight]);
+ eventElement.draggable('option', 'grid', [colWidth, snapHeight]);
allDay = false;
}
}
@@ -4155,38 +4300,39 @@ function AgendaEventRenderer() {
function resizableSlotEvent(event, eventElement, timeElement) {
- var slotDelta, prevSlotDelta;
- var slotHeight = getSlotHeight();
+ var snapDelta, prevSnapDelta;
+ var snapHeight = getSnapHeight();
+ var snapMinutes = getSnapMinutes();
eventElement.resizable({
handles: {
- s: 'div.ui-resizable-s'
+ s: '.ui-resizable-handle'
},
- grid: slotHeight,
+ grid: snapHeight,
start: function(ev, ui) {
- slotDelta = prevSlotDelta = 0;
+ snapDelta = prevSnapDelta = 0;
hideEvents(event, eventElement);
eventElement.css('z-index', 9);
trigger('eventResizeStart', this, event, ev, ui);
},
resize: function(ev, ui) {
// don't rely on ui.size.height, doesn't take grid into account
- slotDelta = Math.round((Math.max(slotHeight, eventElement.height()) - ui.originalSize.height) / slotHeight);
- if (slotDelta != prevSlotDelta) {
+ snapDelta = Math.round((Math.max(snapHeight, eventElement.height()) - ui.originalSize.height) / snapHeight);
+ if (snapDelta != prevSnapDelta) {
timeElement.text(
formatDates(
event.start,
- (!slotDelta && !event.end) ? null : // no change, so don't display time range
- addMinutes(eventEnd(event), opt('slotMinutes')*slotDelta),
+ (!snapDelta && !event.end) ? null : // no change, so don't display time range
+ addMinutes(eventEnd(event), snapMinutes*snapDelta),
opt('timeFormat')
)
);
- prevSlotDelta = slotDelta;
+ prevSnapDelta = snapDelta;
}
},
stop: function(ev, ui) {
trigger('eventResizeStop', this, event, ev, ui);
- if (slotDelta) {
- eventResize(this, event, 0, opt('slotMinutes')*slotDelta, ev, ui);
+ if (snapDelta) {
+ eventResize(this, event, 0, snapMinutes*snapDelta, ev, ui);
}else{
eventElement.css('z-index', 8);
showEvents(event, eventElement);
@@ -4218,6 +4364,8 @@ function countForwardSegs(levels) {
+;;
+
function View(element, calendar, viewName) {
var t = this;
@@ -4472,6 +4620,8 @@ function View(element, calendar, viewName) {
}
+;;
+
function DayEventRenderer() {
var t = this;
@@ -4609,28 +4759,22 @@ function DayEventRenderer() {
for (i=0; i<segCnt; i++) {
seg = segs[i];
event = seg.event;
- classes = ['fc-event', 'fc-event-skin', 'fc-event-hori'];
+ classes = ['fc-event', 'fc-event-hori'];
if (isEventDraggable(event)) {
classes.push('fc-event-draggable');
}
+ if (seg.isStart) {
+ classes.push('fc-event-start');
+ }
+ if (seg.isEnd) {
+ classes.push('fc-event-end');
+ }
if (rtl) {
- if (seg.isStart) {
- classes.push('fc-corner-right');
- }
- if (seg.isEnd) {
- classes.push('fc-corner-left');
- }
leftCol = dayOfWeekCol(seg.end.getDay()-1);
rightCol = dayOfWeekCol(seg.start.getDay());
left = seg.isEnd ? colContentLeft(leftCol) : minLeft;
right = seg.isStart ? colContentRight(rightCol) : maxLeft;
}else{
- if (seg.isStart) {
- classes.push('fc-corner-left');
- }
- if (seg.isEnd) {
- classes.push('fc-corner-right');
- }
leftCol = dayOfWeekCol(seg.start.getDay());
rightCol = dayOfWeekCol(seg.end.getDay()-1);
left = seg.isStart ? colContentLeft(leftCol) : minLeft;
@@ -4651,10 +4795,7 @@ function DayEventRenderer() {
" class='" + classes.join(' ') + "'" +
" style='position:absolute;z-index:8;left:"+left+"px;" + skinCss + "'" +
">" +
- "<div" +
- " class='fc-event-inner fc-event-skin'" +
- (skinCss ? " style='" + skinCss + "'" : '') +
- ">";
+ "<div class='fc-event-inner'>";
if (!event.allDay && seg.isStart) {
html +=
"<span class='fc-event-time'>" +
@@ -4816,7 +4957,7 @@ function DayEventRenderer() {
var rowDivs = [];
for (i=0; i<rowCnt; i++) {
rowDivs[i] = allDayRow(i)
- .find('td:first div.fc-day-content > div'); // optimal selector?
+ .find('div.fc-day-content > div'); // optimal selector?
}
return rowDivs;
}
@@ -4859,7 +5000,7 @@ function DayEventRenderer() {
function resizableDayEvent(event, element, seg) {
var rtl = opt('isRTL');
var direction = rtl ? 'w' : 'e';
- var handle = element.find('div.ui-resizable-' + direction);
+ var handle = element.find('.ui-resizable-' + direction); // TODO: stop using this class because we aren't using jqui for this
var isResizing = false;
// TODO: look into using jquery-ui mouse widget for this stuff
@@ -4955,6 +5096,8 @@ function DayEventRenderer() {
}
+;;
+
//BUG: unselect needs to be triggered when events are dragged+dropped
function SelectionManager() {
@@ -5052,6 +5195,8 @@ function SelectionManager() {
}
+
+;;
function OverlayManager() {
var t = this;
@@ -5090,6 +5235,8 @@ function OverlayManager() {
}
+;;
+
function CoordinateGrid(buildFunc) {
var t = this;
@@ -5136,6 +5283,8 @@ function CoordinateGrid(buildFunc) {
}
+;;
+
function HoverListener(coordinateGrid) {
@@ -5194,6 +5343,8 @@ function _fixUIEvent(event) { // for issue 1168
event.pageY = event.originalEvent.pageY;
}
}
+;;
+
function HorizontalPositionCache(getElement) {
var t = this,
@@ -5220,5 +5371,7 @@ function HorizontalPositionCache(getElement) {
};
}
-
-})(jQuery);
+
+;;
+
+})(jQuery); \ No newline at end of file
diff --git a/library/fullcalendar/fullcalendar.min.js b/library/fullcalendar/fullcalendar.min.js
index df37bdfd8..2f07418e3 100644
--- a/library/fullcalendar/fullcalendar.min.js
+++ b/library/fullcalendar/fullcalendar.min.js
@@ -1,114 +1,7 @@
-/*
-
- FullCalendar v1.5.3
- http://arshaw.com/fullcalendar/
-
- Use fullcalendar.css for basic styling.
- For event drag & drop, requires jQuery UI draggable.
- For event resizing, requires jQuery UI resizable.
-
- Copyright (c) 2011 Adam Shaw
- Dual licensed under the MIT and GPL licenses, located in
- MIT-LICENSE.txt and GPL-LICENSE.txt respectively.
-
- Date: Mon Feb 6 22:40:40 2012 -0800
-
-*/
-(function(m,ma){function wb(a){m.extend(true,Ya,a)}function Yb(a,b,e){function d(k){if(E){u();q();na();S(k)}else f()}function f(){B=b.theme?"ui":"fc";a.addClass("fc");b.isRTL&&a.addClass("fc-rtl");b.theme&&a.addClass("ui-widget");E=m("<div class='fc-content' style='position:relative'/>").prependTo(a);C=new Zb(X,b);(P=C.render())&&a.prepend(P);y(b.defaultView);m(window).resize(oa);t()||g()}function g(){setTimeout(function(){!n.start&&t()&&S()},0)}function l(){m(window).unbind("resize",oa);C.destroy();
-E.remove();a.removeClass("fc fc-rtl ui-widget")}function j(){return i.offsetWidth!==0}function t(){return m("body")[0].offsetWidth!==0}function y(k){if(!n||k!=n.name){F++;pa();var D=n,Z;if(D){(D.beforeHide||xb)();Za(E,E.height());D.element.hide()}else Za(E,1);E.css("overflow","hidden");if(n=Y[k])n.element.show();else n=Y[k]=new Ja[k](Z=s=m("<div class='fc-view fc-view-"+k+"' style='position:absolute'/>").appendTo(E),X);D&&C.deactivateButton(D.name);C.activateButton(k);S();E.css("overflow","");D&&
-Za(E,1);Z||(n.afterShow||xb)();F--}}function S(k){if(j()){F++;pa();o===ma&&u();var D=false;if(!n.start||k||r<n.start||r>=n.end){n.render(r,k||0);fa(true);D=true}else if(n.sizeDirty){n.clearEvents();fa();D=true}else if(n.eventsDirty){n.clearEvents();D=true}n.sizeDirty=false;n.eventsDirty=false;ga(D);W=a.outerWidth();C.updateTitle(n.title);k=new Date;k>=n.start&&k<n.end?C.disableButton("today"):C.enableButton("today");F--;n.trigger("viewDisplay",i)}}function Q(){q();if(j()){u();fa();pa();n.clearEvents();
-n.renderEvents(J);n.sizeDirty=false}}function q(){m.each(Y,function(k,D){D.sizeDirty=true})}function u(){o=b.contentHeight?b.contentHeight:b.height?b.height-(P?P.height():0)-Sa(E):Math.round(E.width()/Math.max(b.aspectRatio,0.5))}function fa(k){F++;n.setHeight(o,k);if(s){s.css("position","relative");s=null}n.setWidth(E.width(),k);F--}function oa(){if(!F)if(n.start){var k=++v;setTimeout(function(){if(k==v&&!F&&j())if(W!=(W=a.outerWidth())){F++;Q();n.trigger("windowResize",i);F--}},200)}else g()}function ga(k){if(!b.lazyFetching||
-ya(n.visStart,n.visEnd))ra();else k&&da()}function ra(){K(n.visStart,n.visEnd)}function sa(k){J=k;da()}function ha(k){da(k)}function da(k){na();if(j()){n.clearEvents();n.renderEvents(J,k);n.eventsDirty=false}}function na(){m.each(Y,function(k,D){D.eventsDirty=true})}function ua(k,D,Z){n.select(k,D,Z===ma?true:Z)}function pa(){n&&n.unselect()}function U(){S(-1)}function ca(){S(1)}function ka(){gb(r,-1);S()}function qa(){gb(r,1);S()}function G(){r=new Date;S()}function p(k,D,Z){if(k instanceof Date)r=
-N(k);else yb(r,k,D,Z);S()}function L(k,D,Z){k!==ma&&gb(r,k);D!==ma&&hb(r,D);Z!==ma&&ba(r,Z);S()}function c(){return N(r)}function z(){return n}function H(k,D){if(D===ma)return b[k];if(k=="height"||k=="contentHeight"||k=="aspectRatio"){b[k]=D;Q()}}function T(k,D){if(b[k])return b[k].apply(D||i,Array.prototype.slice.call(arguments,2))}var X=this;X.options=b;X.render=d;X.destroy=l;X.refetchEvents=ra;X.reportEvents=sa;X.reportEventChange=ha;X.rerenderEvents=da;X.changeView=y;X.select=ua;X.unselect=pa;
-X.prev=U;X.next=ca;X.prevYear=ka;X.nextYear=qa;X.today=G;X.gotoDate=p;X.incrementDate=L;X.formatDate=function(k,D){return Oa(k,D,b)};X.formatDates=function(k,D,Z){return ib(k,D,Z,b)};X.getDate=c;X.getView=z;X.option=H;X.trigger=T;$b.call(X,b,e);var ya=X.isFetchNeeded,K=X.fetchEvents,i=a[0],C,P,E,B,n,Y={},W,o,s,v=0,F=0,r=new Date,J=[],M;yb(r,b.year,b.month,b.date);b.droppable&&m(document).bind("dragstart",function(k,D){var Z=k.target,ja=m(Z);if(!ja.parents(".fc").length){var ia=b.dropAccept;if(m.isFunction(ia)?
-ia.call(Z,ja):ja.is(ia)){M=Z;n.dragStart(M,k,D)}}}).bind("dragstop",function(k,D){if(M){n.dragStop(M,k,D);M=null}})}function Zb(a,b){function e(){q=b.theme?"ui":"fc";if(b.header)return Q=m("<table class='fc-header' style='width:100%'/>").append(m("<tr/>").append(f("left")).append(f("center")).append(f("right")))}function d(){Q.remove()}function f(u){var fa=m("<td class='fc-header-"+u+"'/>");(u=b.header[u])&&m.each(u.split(" "),function(oa){oa>0&&fa.append("<span class='fc-header-space'/>");var ga;
-m.each(this.split(","),function(ra,sa){if(sa=="title"){fa.append("<span class='fc-header-title'><h2>&nbsp;</h2></span>");ga&&ga.addClass(q+"-corner-right");ga=null}else{var ha;if(a[sa])ha=a[sa];else if(Ja[sa])ha=function(){na.removeClass(q+"-state-hover");a.changeView(sa)};if(ha){ra=b.theme?jb(b.buttonIcons,sa):null;var da=jb(b.buttonText,sa),na=m("<span class='fc-button fc-button-"+sa+" "+q+"-state-default'><span class='fc-button-inner'><span class='fc-button-content'>"+(ra?"<span class='fc-icon-wrap'><span class='ui-icon ui-icon-"+
-ra+"'/></span>":da)+"</span><span class='fc-button-effect'><span></span></span></span></span>");if(na){na.click(function(){na.hasClass(q+"-state-disabled")||ha()}).mousedown(function(){na.not("."+q+"-state-active").not("."+q+"-state-disabled").addClass(q+"-state-down")}).mouseup(function(){na.removeClass(q+"-state-down")}).hover(function(){na.not("."+q+"-state-active").not("."+q+"-state-disabled").addClass(q+"-state-hover")},function(){na.removeClass(q+"-state-hover").removeClass(q+"-state-down")}).appendTo(fa);
-ga||na.addClass(q+"-corner-left");ga=na}}}});ga&&ga.addClass(q+"-corner-right")});return fa}function g(u){Q.find("h2").html(u)}function l(u){Q.find("span.fc-button-"+u).addClass(q+"-state-active")}function j(u){Q.find("span.fc-button-"+u).removeClass(q+"-state-active")}function t(u){Q.find("span.fc-button-"+u).addClass(q+"-state-disabled")}function y(u){Q.find("span.fc-button-"+u).removeClass(q+"-state-disabled")}var S=this;S.render=e;S.destroy=d;S.updateTitle=g;S.activateButton=l;S.deactivateButton=
-j;S.disableButton=t;S.enableButton=y;var Q=m([]),q}function $b(a,b){function e(c,z){return!ca||c<ca||z>ka}function d(c,z){ca=c;ka=z;L=[];c=++qa;G=z=U.length;for(var H=0;H<z;H++)f(U[H],c)}function f(c,z){g(c,function(H){if(z==qa){if(H){for(var T=0;T<H.length;T++){H[T].source=c;oa(H[T])}L=L.concat(H)}G--;G||ua(L)}})}function g(c,z){var H,T=Aa.sourceFetchers,X;for(H=0;H<T.length;H++){X=T[H](c,ca,ka,z);if(X===true)return;else if(typeof X=="object"){g(X,z);return}}if(H=c.events)if(m.isFunction(H)){u();
-H(N(ca),N(ka),function(C){z(C);fa()})}else m.isArray(H)?z(H):z();else if(c.url){var ya=c.success,K=c.error,i=c.complete;H=m.extend({},c.data||{});T=Ta(c.startParam,a.startParam);X=Ta(c.endParam,a.endParam);if(T)H[T]=Math.round(+ca/1E3);if(X)H[X]=Math.round(+ka/1E3);u();m.ajax(m.extend({},ac,c,{data:H,success:function(C){C=C||[];var P=$a(ya,this,arguments);if(m.isArray(P))C=P;z(C)},error:function(){$a(K,this,arguments);z()},complete:function(){$a(i,this,arguments);fa()}}))}else z()}function l(c){if(c=
-j(c)){G++;f(c,qa)}}function j(c){if(m.isFunction(c)||m.isArray(c))c={events:c};else if(typeof c=="string")c={url:c};if(typeof c=="object"){ga(c);U.push(c);return c}}function t(c){U=m.grep(U,function(z){return!ra(z,c)});L=m.grep(L,function(z){return!ra(z.source,c)});ua(L)}function y(c){var z,H=L.length,T,X=na().defaultEventEnd,ya=c.start-c._start,K=c.end?c.end-(c._end||X(c)):0;for(z=0;z<H;z++){T=L[z];if(T._id==c._id&&T!=c){T.start=new Date(+T.start+ya);T.end=c.end?T.end?new Date(+T.end+K):new Date(+X(T)+
-K):null;T.title=c.title;T.url=c.url;T.allDay=c.allDay;T.className=c.className;T.editable=c.editable;T.color=c.color;T.backgroudColor=c.backgroudColor;T.borderColor=c.borderColor;T.textColor=c.textColor;oa(T)}}oa(c);ua(L)}function S(c,z){oa(c);if(!c.source){if(z){pa.events.push(c);c.source=pa}L.push(c)}ua(L)}function Q(c){if(c){if(!m.isFunction(c)){var z=c+"";c=function(T){return T._id==z}}L=m.grep(L,c,true);for(H=0;H<U.length;H++)if(m.isArray(U[H].events))U[H].events=m.grep(U[H].events,c,true)}else{L=
-[];for(var H=0;H<U.length;H++)if(m.isArray(U[H].events))U[H].events=[]}ua(L)}function q(c){if(m.isFunction(c))return m.grep(L,c);else if(c){c+="";return m.grep(L,function(z){return z._id==c})}return L}function u(){p++||da("loading",null,true)}function fa(){--p||da("loading",null,false)}function oa(c){var z=c.source||{},H=Ta(z.ignoreTimezone,a.ignoreTimezone);c._id=c._id||(c.id===ma?"_fc"+bc++:c.id+"");if(c.date){if(!c.start)c.start=c.date;delete c.date}c._start=N(c.start=kb(c.start,H));c.end=kb(c.end,
-H);if(c.end&&c.end<=c.start)c.end=null;c._end=c.end?N(c.end):null;if(c.allDay===ma)c.allDay=Ta(z.allDayDefault,a.allDayDefault);if(c.className){if(typeof c.className=="string")c.className=c.className.split(/\s+/)}else c.className=[]}function ga(c){if(c.className){if(typeof c.className=="string")c.className=c.className.split(/\s+/)}else c.className=[];for(var z=Aa.sourceNormalizers,H=0;H<z.length;H++)z[H](c)}function ra(c,z){return c&&z&&sa(c)==sa(z)}function sa(c){return(typeof c=="object"?c.events||
-c.url:"")||c}var ha=this;ha.isFetchNeeded=e;ha.fetchEvents=d;ha.addEventSource=l;ha.removeEventSource=t;ha.updateEvent=y;ha.renderEvent=S;ha.removeEvents=Q;ha.clientEvents=q;ha.normalizeEvent=oa;var da=ha.trigger,na=ha.getView,ua=ha.reportEvents,pa={events:[]},U=[pa],ca,ka,qa=0,G=0,p=0,L=[];for(ha=0;ha<b.length;ha++)j(b[ha])}function gb(a,b,e){a.setFullYear(a.getFullYear()+b);e||Ka(a);return a}function hb(a,b,e){if(+a){b=a.getMonth()+b;var d=N(a);d.setDate(1);d.setMonth(b);a.setMonth(b);for(e||Ka(a);a.getMonth()!=
-d.getMonth();)a.setDate(a.getDate()+(a<d?1:-1))}return a}function ba(a,b,e){if(+a){b=a.getDate()+b;var d=N(a);d.setHours(9);d.setDate(b);a.setDate(b);e||Ka(a);lb(a,d)}return a}function lb(a,b){if(+a)for(;a.getDate()!=b.getDate();)a.setTime(+a+(a<b?1:-1)*cc)}function xa(a,b){a.setMinutes(a.getMinutes()+b);return a}function Ka(a){a.setHours(0);a.setMinutes(0);a.setSeconds(0);a.setMilliseconds(0);return a}function N(a,b){if(b)return Ka(new Date(+a));return new Date(+a)}function zb(){var a=0,b;do b=new Date(1970,
-a++,1);while(b.getHours());return b}function Fa(a,b,e){for(b=b||1;!a.getDay()||e&&a.getDay()==1||!e&&a.getDay()==6;)ba(a,b);return a}function Ca(a,b){return Math.round((N(a,true)-N(b,true))/Ab)}function yb(a,b,e,d){if(b!==ma&&b!=a.getFullYear()){a.setDate(1);a.setMonth(0);a.setFullYear(b)}if(e!==ma&&e!=a.getMonth()){a.setDate(1);a.setMonth(e)}d!==ma&&a.setDate(d)}function kb(a,b){if(typeof a=="object")return a;if(typeof a=="number")return new Date(a*1E3);if(typeof a=="string"){if(a.match(/^\d+(\.\d+)?$/))return new Date(parseFloat(a)*
-1E3);if(b===ma)b=true;return Bb(a,b)||(a?new Date(a):null)}return null}function Bb(a,b){a=a.match(/^([0-9]{4})(-([0-9]{2})(-([0-9]{2})([T ]([0-9]{2}):([0-9]{2})(:([0-9]{2})(\.([0-9]+))?)?(Z|(([-+])([0-9]{2})(:?([0-9]{2}))?))?)?)?)?$/);if(!a)return null;var e=new Date(a[1],0,1);if(b||!a[13]){b=new Date(a[1],0,1,9,0);if(a[3]){e.setMonth(a[3]-1);b.setMonth(a[3]-1)}if(a[5]){e.setDate(a[5]);b.setDate(a[5])}lb(e,b);a[7]&&e.setHours(a[7]);a[8]&&e.setMinutes(a[8]);a[10]&&e.setSeconds(a[10]);a[12]&&e.setMilliseconds(Number("0."+
-a[12])*1E3);lb(e,b)}else{e.setUTCFullYear(a[1],a[3]?a[3]-1:0,a[5]||1);e.setUTCHours(a[7]||0,a[8]||0,a[10]||0,a[12]?Number("0."+a[12])*1E3:0);if(a[14]){b=Number(a[16])*60+(a[18]?Number(a[18]):0);b*=a[15]=="-"?1:-1;e=new Date(+e+b*60*1E3)}}return e}function mb(a){if(typeof a=="number")return a*60;if(typeof a=="object")return a.getHours()*60+a.getMinutes();if(a=a.match(/(\d+)(?::(\d+))?\s*(\w+)?/)){var b=parseInt(a[1],10);if(a[3]){b%=12;if(a[3].toLowerCase().charAt(0)=="p")b+=12}return b*60+(a[2]?parseInt(a[2],
-10):0)}}function Oa(a,b,e){return ib(a,null,b,e)}function ib(a,b,e,d){d=d||Ya;var f=a,g=b,l,j=e.length,t,y,S,Q="";for(l=0;l<j;l++){t=e.charAt(l);if(t=="'")for(y=l+1;y<j;y++){if(e.charAt(y)=="'"){if(f){Q+=y==l+1?"'":e.substring(l+1,y);l=y}break}}else if(t=="(")for(y=l+1;y<j;y++){if(e.charAt(y)==")"){l=Oa(f,e.substring(l+1,y),d);if(parseInt(l.replace(/\D/,""),10))Q+=l;l=y;break}}else if(t=="[")for(y=l+1;y<j;y++){if(e.charAt(y)=="]"){t=e.substring(l+1,y);l=Oa(f,t,d);if(l!=Oa(g,t,d))Q+=l;l=y;break}}else if(t==
-"{"){f=b;g=a}else if(t=="}"){f=a;g=b}else{for(y=j;y>l;y--)if(S=dc[e.substring(l,y)]){if(f)Q+=S(f,d);l=y-1;break}if(y==l)if(f)Q+=t}}return Q}function Ua(a){return a.end?ec(a.end,a.allDay):ba(N(a.start),1)}function ec(a,b){a=N(a);return b||a.getHours()||a.getMinutes()?ba(a,1):Ka(a)}function fc(a,b){return(b.msLength-a.msLength)*100+(a.event.start-b.event.start)}function Cb(a,b){return a.end>b.start&&a.start<b.end}function nb(a,b,e,d){var f=[],g,l=a.length,j,t,y,S,Q;for(g=0;g<l;g++){j=a[g];t=j.start;
-y=b[g];if(y>e&&t<d){if(t<e){t=N(e);S=false}else{t=t;S=true}if(y>d){y=N(d);Q=false}else{y=y;Q=true}f.push({event:j,start:t,end:y,isStart:S,isEnd:Q,msLength:y-t})}}return f.sort(fc)}function ob(a){var b=[],e,d=a.length,f,g,l,j;for(e=0;e<d;e++){f=a[e];for(g=0;;){l=false;if(b[g])for(j=0;j<b[g].length;j++)if(Cb(b[g][j],f)){l=true;break}if(l)g++;else break}if(b[g])b[g].push(f);else b[g]=[f]}return b}function Db(a,b,e){a.unbind("mouseover").mouseover(function(d){for(var f=d.target,g;f!=this;){g=f;f=f.parentNode}if((f=
-g._fci)!==ma){g._fci=ma;g=b[f];e(g.event,g.element,g);m(d.target).trigger(d)}d.stopPropagation()})}function Va(a,b,e){for(var d=0,f;d<a.length;d++){f=m(a[d]);f.width(Math.max(0,b-pb(f,e)))}}function Eb(a,b,e){for(var d=0,f;d<a.length;d++){f=m(a[d]);f.height(Math.max(0,b-Sa(f,e)))}}function pb(a,b){return gc(a)+hc(a)+(b?ic(a):0)}function gc(a){return(parseFloat(m.curCSS(a[0],"paddingLeft",true))||0)+(parseFloat(m.curCSS(a[0],"paddingRight",true))||0)}function ic(a){return(parseFloat(m.curCSS(a[0],
-"marginLeft",true))||0)+(parseFloat(m.curCSS(a[0],"marginRight",true))||0)}function hc(a){return(parseFloat(m.curCSS(a[0],"borderLeftWidth",true))||0)+(parseFloat(m.curCSS(a[0],"borderRightWidth",true))||0)}function Sa(a,b){return jc(a)+kc(a)+(b?Fb(a):0)}function jc(a){return(parseFloat(m.curCSS(a[0],"paddingTop",true))||0)+(parseFloat(m.curCSS(a[0],"paddingBottom",true))||0)}function Fb(a){return(parseFloat(m.curCSS(a[0],"marginTop",true))||0)+(parseFloat(m.curCSS(a[0],"marginBottom",true))||0)}
-function kc(a){return(parseFloat(m.curCSS(a[0],"borderTopWidth",true))||0)+(parseFloat(m.curCSS(a[0],"borderBottomWidth",true))||0)}function Za(a,b){b=typeof b=="number"?b+"px":b;a.each(function(e,d){d.style.cssText+=";min-height:"+b+";_height:"+b})}function xb(){}function Gb(a,b){return a-b}function Hb(a){return Math.max.apply(Math,a)}function Pa(a){return(a<10?"0":"")+a}function jb(a,b){if(a[b]!==ma)return a[b];b=b.split(/(?=[A-Z])/);for(var e=b.length-1,d;e>=0;e--){d=a[b[e].toLowerCase()];if(d!==
-ma)return d}return a[""]}function Qa(a){return a.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/'/g,"&#039;").replace(/"/g,"&quot;").replace(/\n/g,"<br />")}function Ib(a){return a.id+"/"+a.className+"/"+a.style.cssText.replace(/(^|;)\s*(top|left|width|height)\s*:[^;]*/ig,"")}function qb(a){a.attr("unselectable","on").css("MozUserSelect","none").bind("selectstart.ui",function(){return false})}function ab(a){a.children().removeClass("fc-first fc-last").filter(":first-child").addClass("fc-first").end().filter(":last-child").addClass("fc-last")}
-function rb(a,b){a.each(function(e,d){d.className=d.className.replace(/^fc-\w*/,"fc-"+lc[b.getDay()])})}function Jb(a,b){var e=a.source||{},d=a.color,f=e.color,g=b("eventColor"),l=a.backgroundColor||d||e.backgroundColor||f||b("eventBackgroundColor")||g;d=a.borderColor||d||e.borderColor||f||b("eventBorderColor")||g;a=a.textColor||e.textColor||b("eventTextColor");b=[];l&&b.push("background-color:"+l);d&&b.push("border-color:"+d);a&&b.push("color:"+a);return b.join(";")}function $a(a,b,e){if(m.isFunction(a))a=
-[a];if(a){var d,f;for(d=0;d<a.length;d++)f=a[d].apply(b,e)||f;return f}}function Ta(){for(var a=0;a<arguments.length;a++)if(arguments[a]!==ma)return arguments[a]}function mc(a,b){function e(j,t){if(t){hb(j,t);j.setDate(1)}j=N(j,true);j.setDate(1);t=hb(N(j),1);var y=N(j),S=N(t),Q=f("firstDay"),q=f("weekends")?0:1;if(q){Fa(y);Fa(S,-1,true)}ba(y,-((y.getDay()-Math.max(Q,q)+7)%7));ba(S,(7-S.getDay()+Math.max(Q,q))%7);Q=Math.round((S-y)/(Ab*7));if(f("weekMode")=="fixed"){ba(S,(6-Q)*7);Q=6}d.title=l(j,
-f("titleFormat"));d.start=j;d.end=t;d.visStart=y;d.visEnd=S;g(6,Q,q?5:7,true)}var d=this;d.render=e;sb.call(d,a,b,"month");var f=d.opt,g=d.renderBasic,l=b.formatDate}function nc(a,b){function e(j,t){t&&ba(j,t*7);j=ba(N(j),-((j.getDay()-f("firstDay")+7)%7));t=ba(N(j),7);var y=N(j),S=N(t),Q=f("weekends");if(!Q){Fa(y);Fa(S,-1,true)}d.title=l(y,ba(N(S),-1),f("titleFormat"));d.start=j;d.end=t;d.visStart=y;d.visEnd=S;g(1,1,Q?7:5,false)}var d=this;d.render=e;sb.call(d,a,b,"basicWeek");var f=d.opt,g=d.renderBasic,
-l=b.formatDates}function oc(a,b){function e(j,t){if(t){ba(j,t);f("weekends")||Fa(j,t<0?-1:1)}d.title=l(j,f("titleFormat"));d.start=d.visStart=N(j,true);d.end=d.visEnd=ba(N(d.start),1);g(1,1,1,false)}var d=this;d.render=e;sb.call(d,a,b,"basicDay");var f=d.opt,g=d.renderBasic,l=b.formatDate}function sb(a,b,e){function d(w,I,R,V){v=I;F=R;f();(I=!C)?g(w,V):z();l(I)}function f(){if(k=L("isRTL")){D=-1;Z=F-1}else{D=1;Z=0}ja=L("firstDay");ia=L("weekends")?0:1;la=L("theme")?"ui":"fc";$=L("columnFormat")}function g(w,
-I){var R,V=la+"-widget-header",ea=la+"-widget-content",aa;R="<table class='fc-border-separate' style='width:100%' cellspacing='0'><thead><tr>";for(aa=0;aa<F;aa++)R+="<th class='fc- "+V+"'/>";R+="</tr></thead><tbody>";for(aa=0;aa<w;aa++){R+="<tr class='fc-week"+aa+"'>";for(V=0;V<F;V++)R+="<td class='fc- "+ea+" fc-day"+(aa*F+V)+"'><div>"+(I?"<div class='fc-day-number'/>":"")+"<div class='fc-day-content'><div style='position:relative'>&nbsp;</div></div></div></td>";R+="</tr>"}R+="</tbody></table>";w=
-m(R).appendTo(a);K=w.find("thead");i=K.find("th");C=w.find("tbody");P=C.find("tr");E=C.find("td");B=E.filter(":first-child");n=P.eq(0).find("div.fc-day-content div");ab(K.add(K.find("tr")));ab(P);P.eq(0).addClass("fc-first");y(E);Y=m("<div style='position:absolute;z-index:8;top:0;left:0'/>").appendTo(a)}function l(w){var I=w||v==1,R=p.start.getMonth(),V=Ka(new Date),ea,aa,va;I&&i.each(function(wa,Ga){ea=m(Ga);aa=ca(wa);ea.html(ya(aa,$));rb(ea,aa)});E.each(function(wa,Ga){ea=m(Ga);aa=ca(wa);aa.getMonth()==
-R?ea.removeClass("fc-other-month"):ea.addClass("fc-other-month");+aa==+V?ea.addClass(la+"-state-highlight fc-today"):ea.removeClass(la+"-state-highlight fc-today");ea.find("div.fc-day-number").text(aa.getDate());I&&rb(ea,aa)});P.each(function(wa,Ga){va=m(Ga);if(wa<v){va.show();wa==v-1?va.addClass("fc-last"):va.removeClass("fc-last")}else va.hide()})}function j(w){o=w;w=o-K.height();var I,R,V;if(L("weekMode")=="variable")I=R=Math.floor(w/(v==1?2:6));else{I=Math.floor(w/v);R=w-I*(v-1)}B.each(function(ea,
-aa){if(ea<v){V=m(aa);Za(V.find("> div"),(ea==v-1?R:I)-Sa(V))}})}function t(w){W=w;M.clear();s=Math.floor(W/F);Va(i.slice(0,-1),s)}function y(w){w.click(S).mousedown(X)}function S(w){if(!L("selectable")){var I=parseInt(this.className.match(/fc\-day(\d+)/)[1]);I=ca(I);c("dayClick",this,I,true,w)}}function Q(w,I,R){R&&r.build();R=N(p.visStart);for(var V=ba(N(R),F),ea=0;ea<v;ea++){var aa=new Date(Math.max(R,w)),va=new Date(Math.min(V,I));if(aa<va){var wa;if(k){wa=Ca(va,R)*D+Z+1;aa=Ca(aa,R)*D+Z+1}else{wa=
-Ca(aa,R);aa=Ca(va,R)}y(q(ea,wa,ea,aa-1))}ba(R,7);ba(V,7)}}function q(w,I,R,V){w=r.rect(w,I,R,V,a);return H(w,a)}function u(w){return N(w)}function fa(w,I){Q(w,ba(N(I),1),true)}function oa(){T()}function ga(w,I,R){var V=ua(w);c("dayClick",E[V.row*F+V.col],w,I,R)}function ra(w,I){J.start(function(R){T();R&&q(R.row,R.col,R.row,R.col)},I)}function sa(w,I,R){var V=J.stop();T();if(V){V=pa(V);c("drop",w,V,true,I,R)}}function ha(w){return N(w.start)}function da(w){return M.left(w)}function na(w){return M.right(w)}
-function ua(w){return{row:Math.floor(Ca(w,p.visStart)/7),col:ka(w.getDay())}}function pa(w){return U(w.row,w.col)}function U(w,I){return ba(N(p.visStart),w*7+I*D+Z)}function ca(w){return U(Math.floor(w/F),w%F)}function ka(w){return(w-Math.max(ja,ia)+F)%F*D+Z}function qa(w){return P.eq(w)}function G(){return{left:0,right:W}}var p=this;p.renderBasic=d;p.setHeight=j;p.setWidth=t;p.renderDayOverlay=Q;p.defaultSelectionEnd=u;p.renderSelection=fa;p.clearSelection=oa;p.reportDayClick=ga;p.dragStart=ra;p.dragStop=
-sa;p.defaultEventEnd=ha;p.getHoverListener=function(){return J};p.colContentLeft=da;p.colContentRight=na;p.dayOfWeekCol=ka;p.dateCell=ua;p.cellDate=pa;p.cellIsAllDay=function(){return true};p.allDayRow=qa;p.allDayBounds=G;p.getRowCnt=function(){return v};p.getColCnt=function(){return F};p.getColWidth=function(){return s};p.getDaySegmentContainer=function(){return Y};Kb.call(p,a,b,e);Lb.call(p);Mb.call(p);pc.call(p);var L=p.opt,c=p.trigger,z=p.clearEvents,H=p.renderOverlay,T=p.clearOverlays,X=p.daySelectionMousedown,
-ya=b.formatDate,K,i,C,P,E,B,n,Y,W,o,s,v,F,r,J,M,k,D,Z,ja,ia,la,$;qb(a.addClass("fc-grid"));r=new Nb(function(w,I){var R,V,ea;i.each(function(aa,va){R=m(va);V=R.offset().left;if(aa)ea[1]=V;ea=[V];I[aa]=ea});ea[1]=V+R.outerWidth();P.each(function(aa,va){if(aa<v){R=m(va);V=R.offset().top;if(aa)ea[1]=V;ea=[V];w[aa]=ea}});ea[1]=V+R.outerHeight()});J=new Ob(r);M=new Pb(function(w){return n.eq(w)})}function pc(){function a(U,ca){S(U);ua(e(U),ca)}function b(){Q();ga().empty()}function e(U){var ca=da(),ka=
-na(),qa=N(g.visStart);ka=ba(N(qa),ka);var G=m.map(U,Ua),p,L,c,z,H,T,X=[];for(p=0;p<ca;p++){L=ob(nb(U,G,qa,ka));for(c=0;c<L.length;c++){z=L[c];for(H=0;H<z.length;H++){T=z[H];T.row=p;T.level=c;X.push(T)}}ba(qa,7);ba(ka,7)}return X}function d(U,ca,ka){t(U)&&f(U,ca);ka.isEnd&&y(U)&&pa(U,ca,ka);q(U,ca)}function f(U,ca){var ka=ra(),qa;ca.draggable({zIndex:9,delay:50,opacity:l("dragOpacity"),revertDuration:l("dragRevertDuration"),start:function(G,p){j("eventDragStart",ca,U,G,p);fa(U,ca);ka.start(function(L,
-c,z,H){ca.draggable("option","revert",!L||!z&&!H);ha();if(L){qa=z*7+H*(l("isRTL")?-1:1);sa(ba(N(U.start),qa),ba(Ua(U),qa))}else qa=0},G,"drag")},stop:function(G,p){ka.stop();ha();j("eventDragStop",ca,U,G,p);if(qa)oa(this,U,qa,0,U.allDay,G,p);else{ca.css("filter","");u(U,ca)}}})}var g=this;g.renderEvents=a;g.compileDaySegs=e;g.clearEvents=b;g.bindDaySeg=d;Qb.call(g);var l=g.opt,j=g.trigger,t=g.isEventDraggable,y=g.isEventResizable,S=g.reportEvents,Q=g.reportEventClear,q=g.eventElementHandlers,u=g.showEvents,
-fa=g.hideEvents,oa=g.eventDrop,ga=g.getDaySegmentContainer,ra=g.getHoverListener,sa=g.renderDayOverlay,ha=g.clearOverlays,da=g.getRowCnt,na=g.getColCnt,ua=g.renderDaySegs,pa=g.resizableDayEvent}function qc(a,b){function e(j,t){t&&ba(j,t*7);j=ba(N(j),-((j.getDay()-f("firstDay")+7)%7));t=ba(N(j),7);var y=N(j),S=N(t),Q=f("weekends");if(!Q){Fa(y);Fa(S,-1,true)}d.title=l(y,ba(N(S),-1),f("titleFormat"));d.start=j;d.end=t;d.visStart=y;d.visEnd=S;g(Q?7:5)}var d=this;d.render=e;Rb.call(d,a,b,"agendaWeek");
-var f=d.opt,g=d.renderAgenda,l=b.formatDates}function rc(a,b){function e(j,t){if(t){ba(j,t);f("weekends")||Fa(j,t<0?-1:1)}t=N(j,true);var y=ba(N(t),1);d.title=l(j,f("titleFormat"));d.start=d.visStart=t;d.end=d.visEnd=y;g(1)}var d=this;d.render=e;Rb.call(d,a,b,"agendaDay");var f=d.opt,g=d.renderAgenda,l=b.formatDate}function Rb(a,b,e){function d(h){Ba=h;f();v?P():g();l()}function f(){Wa=i("theme")?"ui":"fc";Sb=i("weekends")?0:1;Tb=i("firstDay");if(Ub=i("isRTL")){Ha=-1;Ia=Ba-1}else{Ha=1;Ia=0}La=mb(i("minTime"));
-bb=mb(i("maxTime"));Vb=i("columnFormat")}function g(){var h=Wa+"-widget-header",O=Wa+"-widget-content",x,A,ta,za,Da,Ea=i("slotMinutes")%15==0;x="<table style='width:100%' class='fc-agenda-days fc-border-separate' cellspacing='0'><thead><tr><th class='fc-agenda-axis "+h+"'>&nbsp;</th>";for(A=0;A<Ba;A++)x+="<th class='fc- fc-col"+A+" "+h+"'/>";x+="<th class='fc-agenda-gutter "+h+"'>&nbsp;</th></tr></thead><tbody><tr><th class='fc-agenda-axis "+h+"'>&nbsp;</th>";for(A=0;A<Ba;A++)x+="<td class='fc- fc-col"+
-A+" "+O+"'><div><div class='fc-day-content'><div style='position:relative'>&nbsp;</div></div></div></td>";x+="<td class='fc-agenda-gutter "+O+"'>&nbsp;</td></tr></tbody></table>";v=m(x).appendTo(a);F=v.find("thead");r=F.find("th").slice(1,-1);J=v.find("tbody");M=J.find("td").slice(0,-1);k=M.find("div.fc-day-content div");D=M.eq(0);Z=D.find("> div");ab(F.add(F.find("tr")));ab(J.add(J.find("tr")));aa=F.find("th:first");va=v.find(".fc-agenda-gutter");ja=m("<div style='position:absolute;z-index:2;left:0;width:100%'/>").appendTo(a);
-if(i("allDaySlot")){ia=m("<div style='position:absolute;z-index:8;top:0;left:0'/>").appendTo(ja);x="<table style='width:100%' class='fc-agenda-allday' cellspacing='0'><tr><th class='"+h+" fc-agenda-axis'>"+i("allDayText")+"</th><td><div class='fc-day-content'><div style='position:relative'/></div></td><th class='"+h+" fc-agenda-gutter'>&nbsp;</th></tr></table>";la=m(x).appendTo(ja);$=la.find("tr");q($.find("td"));aa=aa.add(la.find("th:first"));va=va.add(la.find("th.fc-agenda-gutter"));ja.append("<div class='fc-agenda-divider "+
-h+"'><div class='fc-agenda-divider-inner'/></div>")}else ia=m([]);w=m("<div style='position:absolute;width:100%;overflow-x:hidden;overflow-y:auto'/>").appendTo(ja);I=m("<div style='position:relative;width:100%;overflow:hidden'/>").appendTo(w);R=m("<div style='position:absolute;z-index:8;top:0;left:0'/>").appendTo(I);x="<table class='fc-agenda-slots' style='width:100%' cellspacing='0'><tbody>";ta=zb();za=xa(N(ta),bb);xa(ta,La);for(A=tb=0;ta<za;A++){Da=ta.getMinutes();x+="<tr class='fc-slot"+A+" "+
-(!Da?"":"fc-minor")+"'><th class='fc-agenda-axis "+h+"'>"+(!Ea||!Da?s(ta,i("axisFormat")):"&nbsp;")+"</th><td class='"+O+"'><div style='position:relative'>&nbsp;</div></td></tr>";xa(ta,i("slotMinutes"));tb++}x+="</tbody></table>";V=m(x).appendTo(I);ea=V.find("div:first");u(V.find("td"));aa=aa.add(V.find("th:first"))}function l(){var h,O,x,A,ta=Ka(new Date);for(h=0;h<Ba;h++){A=ua(h);O=r.eq(h);O.html(s(A,Vb));x=M.eq(h);+A==+ta?x.addClass(Wa+"-state-highlight fc-today"):x.removeClass(Wa+"-state-highlight fc-today");
-rb(O.add(x),A)}}function j(h,O){if(h===ma)h=Wb;Wb=h;ub={};var x=J.position().top,A=w.position().top;h=Math.min(h-x,V.height()+A+1);Z.height(h-Sa(D));ja.css("top",x);w.height(h-A-1);Xa=ea.height()+1;O&&y()}function t(h){Ga=h;cb.clear();Ma=0;Va(aa.width("").each(function(O,x){Ma=Math.max(Ma,m(x).outerWidth())}),Ma);h=w[0].clientWidth;if(vb=w.width()-h){Va(va,vb);va.show().prev().removeClass("fc-last")}else va.hide().prev().addClass("fc-last");db=Math.floor((h-Ma)/Ba);Va(r.slice(0,-1),db)}function y(){function h(){w.scrollTop(A)}
-var O=zb(),x=N(O);x.setHours(i("firstHour"));var A=ca(O,x)+1;h();setTimeout(h,0)}function S(){Xb=w.scrollTop()}function Q(){w.scrollTop(Xb)}function q(h){h.click(fa).mousedown(W)}function u(h){h.click(fa).mousedown(H)}function fa(h){if(!i("selectable")){var O=Math.min(Ba-1,Math.floor((h.pageX-v.offset().left-Ma)/db)),x=ua(O),A=this.parentNode.className.match(/fc-slot(\d+)/);if(A){A=parseInt(A[1])*i("slotMinutes");var ta=Math.floor(A/60);x.setHours(ta);x.setMinutes(A%60+La);C("dayClick",M[O],x,false,
-h)}else C("dayClick",M[O],x,true,h)}}function oa(h,O,x){x&&Na.build();var A=N(K.visStart);if(Ub){x=Ca(O,A)*Ha+Ia+1;h=Ca(h,A)*Ha+Ia+1}else{x=Ca(h,A);h=Ca(O,A)}x=Math.max(0,x);h=Math.min(Ba,h);x<h&&q(ga(0,x,0,h-1))}function ga(h,O,x,A){h=Na.rect(h,O,x,A,ja);return E(h,ja)}function ra(h,O){for(var x=N(K.visStart),A=ba(N(x),1),ta=0;ta<Ba;ta++){var za=new Date(Math.max(x,h)),Da=new Date(Math.min(A,O));if(za<Da){var Ea=ta*Ha+Ia;Ea=Na.rect(0,Ea,0,Ea,I);za=ca(x,za);Da=ca(x,Da);Ea.top=za;Ea.height=Da-za;u(E(Ea,
-I))}ba(x,1);ba(A,1)}}function sa(h){return cb.left(h)}function ha(h){return cb.right(h)}function da(h){return{row:Math.floor(Ca(h,K.visStart)/7),col:U(h.getDay())}}function na(h){var O=ua(h.col);h=h.row;i("allDaySlot")&&h--;h>=0&&xa(O,La+h*i("slotMinutes"));return O}function ua(h){return ba(N(K.visStart),h*Ha+Ia)}function pa(h){return i("allDaySlot")&&!h.row}function U(h){return(h-Math.max(Tb,Sb)+Ba)%Ba*Ha+Ia}function ca(h,O){h=N(h,true);if(O<xa(N(h),La))return 0;if(O>=xa(N(h),bb))return V.height();
-h=i("slotMinutes");O=O.getHours()*60+O.getMinutes()-La;var x=Math.floor(O/h),A=ub[x];if(A===ma)A=ub[x]=V.find("tr:eq("+x+") td div")[0].offsetTop;return Math.max(0,Math.round(A-1+Xa*(O%h/h)))}function ka(){return{left:Ma,right:Ga-vb}}function qa(){return $}function G(h){var O=N(h.start);if(h.allDay)return O;return xa(O,i("defaultEventMinutes"))}function p(h,O){if(O)return N(h);return xa(N(h),i("slotMinutes"))}function L(h,O,x){if(x)i("allDaySlot")&&oa(h,ba(N(O),1),true);else c(h,O)}function c(h,O){var x=
-i("selectHelper");Na.build();if(x){var A=Ca(h,K.visStart)*Ha+Ia;if(A>=0&&A<Ba){A=Na.rect(0,A,0,A,I);var ta=ca(h,h),za=ca(h,O);if(za>ta){A.top=ta;A.height=za-ta;A.left+=2;A.width-=5;if(m.isFunction(x)){if(h=x(h,O)){A.position="absolute";A.zIndex=8;wa=m(h).css(A).appendTo(I)}}else{A.isStart=true;A.isEnd=true;wa=m(o({title:"",start:h,end:O,className:["fc-select-helper"],editable:false},A));wa.css("opacity",i("dragOpacity"))}if(wa){u(wa);I.append(wa);Va(wa,A.width,true);Eb(wa,A.height,true)}}}}else ra(h,
-O)}function z(){B();if(wa){wa.remove();wa=null}}function H(h){if(h.which==1&&i("selectable")){Y(h);var O;Ra.start(function(x,A){z();if(x&&x.col==A.col&&!pa(x)){A=na(A);x=na(x);O=[A,xa(N(A),i("slotMinutes")),x,xa(N(x),i("slotMinutes"))].sort(Gb);c(O[0],O[3])}else O=null},h);m(document).one("mouseup",function(x){Ra.stop();if(O){+O[0]==+O[1]&&T(O[0],false,x);n(O[0],O[3],false,x)}})}}function T(h,O,x){C("dayClick",M[U(h.getDay())],h,O,x)}function X(h,O){Ra.start(function(x){B();if(x)if(pa(x))ga(x.row,
-x.col,x.row,x.col);else{x=na(x);var A=xa(N(x),i("defaultEventMinutes"));ra(x,A)}},O)}function ya(h,O,x){var A=Ra.stop();B();A&&C("drop",h,na(A),pa(A),O,x)}var K=this;K.renderAgenda=d;K.setWidth=t;K.setHeight=j;K.beforeHide=S;K.afterShow=Q;K.defaultEventEnd=G;K.timePosition=ca;K.dayOfWeekCol=U;K.dateCell=da;K.cellDate=na;K.cellIsAllDay=pa;K.allDayRow=qa;K.allDayBounds=ka;K.getHoverListener=function(){return Ra};K.colContentLeft=sa;K.colContentRight=ha;K.getDaySegmentContainer=function(){return ia};
-K.getSlotSegmentContainer=function(){return R};K.getMinMinute=function(){return La};K.getMaxMinute=function(){return bb};K.getBodyContent=function(){return I};K.getRowCnt=function(){return 1};K.getColCnt=function(){return Ba};K.getColWidth=function(){return db};K.getSlotHeight=function(){return Xa};K.defaultSelectionEnd=p;K.renderDayOverlay=oa;K.renderSelection=L;K.clearSelection=z;K.reportDayClick=T;K.dragStart=X;K.dragStop=ya;Kb.call(K,a,b,e);Lb.call(K);Mb.call(K);sc.call(K);var i=K.opt,C=K.trigger,
-P=K.clearEvents,E=K.renderOverlay,B=K.clearOverlays,n=K.reportSelection,Y=K.unselect,W=K.daySelectionMousedown,o=K.slotSegHtml,s=b.formatDate,v,F,r,J,M,k,D,Z,ja,ia,la,$,w,I,R,V,ea,aa,va,wa,Ga,Wb,Ma,db,vb,Xa,Xb,Ba,tb,Na,Ra,cb,ub={},Wa,Tb,Sb,Ub,Ha,Ia,La,bb,Vb;qb(a.addClass("fc-agenda"));Na=new Nb(function(h,O){function x(eb){return Math.max(Ea,Math.min(tc,eb))}var A,ta,za;r.each(function(eb,uc){A=m(uc);ta=A.offset().left;if(eb)za[1]=ta;za=[ta];O[eb]=za});za[1]=ta+A.outerWidth();if(i("allDaySlot")){A=
-$;ta=A.offset().top;h[0]=[ta,ta+A.outerHeight()]}for(var Da=I.offset().top,Ea=w.offset().top,tc=Ea+w.outerHeight(),fb=0;fb<tb;fb++)h.push([x(Da+Xa*fb),x(Da+Xa*(fb+1))])});Ra=new Ob(Na);cb=new Pb(function(h){return k.eq(h)})}function sc(){function a(o,s){sa(o);var v,F=o.length,r=[],J=[];for(v=0;v<F;v++)o[v].allDay?r.push(o[v]):J.push(o[v]);if(u("allDaySlot")){L(e(r),s);na()}g(d(J),s)}function b(){ha();ua().empty();pa().empty()}function e(o){o=ob(nb(o,m.map(o,Ua),q.visStart,q.visEnd));var s,v=o.length,
-F,r,J,M=[];for(s=0;s<v;s++){F=o[s];for(r=0;r<F.length;r++){J=F[r];J.row=0;J.level=s;M.push(J)}}return M}function d(o){var s=z(),v=ka(),F=ca(),r=xa(N(q.visStart),v),J=m.map(o,f),M,k,D,Z,ja,ia,la=[];for(M=0;M<s;M++){k=ob(nb(o,J,r,xa(N(r),F-v)));vc(k);for(D=0;D<k.length;D++){Z=k[D];for(ja=0;ja<Z.length;ja++){ia=Z[ja];ia.col=M;ia.level=D;la.push(ia)}}ba(r,1,true)}return la}function f(o){return o.end?N(o.end):xa(N(o.start),u("defaultEventMinutes"))}function g(o,s){var v,F=o.length,r,J,M,k,D,Z,ja,ia,la,
-$="",w,I,R={},V={},ea=pa(),aa;v=z();if(w=u("isRTL")){I=-1;aa=v-1}else{I=1;aa=0}for(v=0;v<F;v++){r=o[v];J=r.event;M=qa(r.start,r.start);k=qa(r.start,r.end);D=r.col;Z=r.level;ja=r.forward||0;ia=G(D*I+aa);la=p(D*I+aa)-ia;la=Math.min(la-6,la*0.95);D=Z?la/(Z+ja+1):ja?(la/(ja+1)-6)*2:la;Z=ia+la/(Z+ja+1)*Z*I+(w?la-D:0);r.top=M;r.left=Z;r.outerWidth=D;r.outerHeight=k-M;$+=l(J,r)}ea[0].innerHTML=$;w=ea.children();for(v=0;v<F;v++){r=o[v];J=r.event;$=m(w[v]);I=fa("eventRender",J,J,$);if(I===false)$.remove();
-else{if(I&&I!==true){$.remove();$=m(I).css({position:"absolute",top:r.top,left:r.left}).appendTo(ea)}r.element=$;if(J._id===s)t(J,$,r);else $[0]._fci=v;ya(J,$)}}Db(ea,o,t);for(v=0;v<F;v++){r=o[v];if($=r.element){J=R[s=r.key=Ib($[0])];r.vsides=J===ma?(R[s]=Sa($,true)):J;J=V[s];r.hsides=J===ma?(V[s]=pb($,true)):J;s=$.find("div.fc-event-content");if(s.length)r.contentTop=s[0].offsetTop}}for(v=0;v<F;v++){r=o[v];if($=r.element){$[0].style.width=Math.max(0,r.outerWidth-r.hsides)+"px";R=Math.max(0,r.outerHeight-
-r.vsides);$[0].style.height=R+"px";J=r.event;if(r.contentTop!==ma&&R-r.contentTop<10){$.find("div.fc-event-time").text(Y(J.start,u("timeFormat"))+" - "+J.title);$.find("div.fc-event-title").remove()}fa("eventAfterRender",J,J,$)}}}function l(o,s){var v="<",F=o.url,r=Jb(o,u),J=r?" style='"+r+"'":"",M=["fc-event","fc-event-skin","fc-event-vert"];oa(o)&&M.push("fc-event-draggable");s.isStart&&M.push("fc-corner-top");s.isEnd&&M.push("fc-corner-bottom");M=M.concat(o.className);if(o.source)M=M.concat(o.source.className||
-[]);v+=F?"a href='"+Qa(o.url)+"'":"div";v+=" class='"+M.join(" ")+"' style='position:absolute;z-index:8;top:"+s.top+"px;left:"+s.left+"px;"+r+"'><div class='fc-event-inner fc-event-skin'"+J+"><div class='fc-event-head fc-event-skin'"+J+"><div class='fc-event-time'>"+Qa(W(o.start,o.end,u("timeFormat")))+"</div></div><div class='fc-event-content'><div class='fc-event-title'>"+Qa(o.title)+"</div></div><div class='fc-event-bg'></div></div>";if(s.isEnd&&ga(o))v+="<div class='ui-resizable-handle ui-resizable-s'>=</div>";
-v+="</"+(F?"a":"div")+">";return v}function j(o,s,v){oa(o)&&y(o,s,v.isStart);v.isEnd&&ga(o)&&c(o,s,v);da(o,s)}function t(o,s,v){var F=s.find("div.fc-event-time");oa(o)&&S(o,s,F);v.isEnd&&ga(o)&&Q(o,s,F);da(o,s)}function y(o,s,v){function F(){if(!M){s.width(r).height("").draggable("option","grid",null);M=true}}var r,J,M=true,k,D=u("isRTL")?-1:1,Z=U(),ja=H(),ia=T(),la=ka();s.draggable({zIndex:9,opacity:u("dragOpacity","month"),revertDuration:u("dragRevertDuration"),start:function($,w){fa("eventDragStart",
-s,o,$,w);i(o,s);r=s.width();Z.start(function(I,R,V,ea){B();if(I){J=false;k=ea*D;if(I.row)if(v){if(M){s.width(ja-10);Eb(s,ia*Math.round((o.end?(o.end-o.start)/wc:u("defaultEventMinutes"))/u("slotMinutes")));s.draggable("option","grid",[ja,1]);M=false}}else J=true;else{E(ba(N(o.start),k),ba(Ua(o),k));F()}J=J||M&&!k}else{F();J=true}s.draggable("option","revert",J)},$,"drag")},stop:function($,w){Z.stop();B();fa("eventDragStop",s,o,$,w);if(J){F();s.css("filter","");K(o,s)}else{var I=0;M||(I=Math.round((s.offset().top-
-X().offset().top)/ia)*u("slotMinutes")+la-(o.start.getHours()*60+o.start.getMinutes()));C(this,o,k,I,M,$,w)}}})}function S(o,s,v){function F(I){var R=xa(N(o.start),I),V;if(o.end)V=xa(N(o.end),I);v.text(W(R,V,u("timeFormat")))}function r(){if(M){v.css("display","");s.draggable("option","grid",[$,w]);M=false}}var J,M=false,k,D,Z,ja=u("isRTL")?-1:1,ia=U(),la=z(),$=H(),w=T();s.draggable({zIndex:9,scroll:false,grid:[$,w],axis:la==1?"y":false,opacity:u("dragOpacity"),revertDuration:u("dragRevertDuration"),
-start:function(I,R){fa("eventDragStart",s,o,I,R);i(o,s);J=s.position();D=Z=0;ia.start(function(V,ea,aa,va){s.draggable("option","revert",!V);B();if(V){k=va*ja;if(u("allDaySlot")&&!V.row){if(!M){M=true;v.hide();s.draggable("option","grid",null)}E(ba(N(o.start),k),ba(Ua(o),k))}else r()}},I,"drag")},drag:function(I,R){D=Math.round((R.position.top-J.top)/w)*u("slotMinutes");if(D!=Z){M||F(D);Z=D}},stop:function(I,R){var V=ia.stop();B();fa("eventDragStop",s,o,I,R);if(V&&(k||D||M))C(this,o,k,M?0:D,M,I,R);
-else{r();s.css("filter","");s.css(J);F(0);K(o,s)}}})}function Q(o,s,v){var F,r,J=T();s.resizable({handles:{s:"div.ui-resizable-s"},grid:J,start:function(M,k){F=r=0;i(o,s);s.css("z-index",9);fa("eventResizeStart",this,o,M,k)},resize:function(M,k){F=Math.round((Math.max(J,s.height())-k.originalSize.height)/J);if(F!=r){v.text(W(o.start,!F&&!o.end?null:xa(ra(o),u("slotMinutes")*F),u("timeFormat")));r=F}},stop:function(M,k){fa("eventResizeStop",this,o,M,k);if(F)P(this,o,0,u("slotMinutes")*F,M,k);else{s.css("z-index",
-8);K(o,s)}}})}var q=this;q.renderEvents=a;q.compileDaySegs=e;q.clearEvents=b;q.slotSegHtml=l;q.bindDaySeg=j;Qb.call(q);var u=q.opt,fa=q.trigger,oa=q.isEventDraggable,ga=q.isEventResizable,ra=q.eventEnd,sa=q.reportEvents,ha=q.reportEventClear,da=q.eventElementHandlers,na=q.setHeight,ua=q.getDaySegmentContainer,pa=q.getSlotSegmentContainer,U=q.getHoverListener,ca=q.getMaxMinute,ka=q.getMinMinute,qa=q.timePosition,G=q.colContentLeft,p=q.colContentRight,L=q.renderDaySegs,c=q.resizableDayEvent,z=q.getColCnt,
-H=q.getColWidth,T=q.getSlotHeight,X=q.getBodyContent,ya=q.reportEventElement,K=q.showEvents,i=q.hideEvents,C=q.eventDrop,P=q.eventResize,E=q.renderDayOverlay,B=q.clearOverlays,n=q.calendar,Y=n.formatDate,W=n.formatDates}function vc(a){var b,e,d,f,g,l;for(b=a.length-1;b>0;b--){f=a[b];for(e=0;e<f.length;e++){g=f[e];for(d=0;d<a[b-1].length;d++){l=a[b-1][d];if(Cb(g,l))l.forward=Math.max(l.forward||0,(g.forward||0)+1)}}}}function Kb(a,b,e){function d(G,p){G=qa[G];if(typeof G=="object")return jb(G,p||e);
-return G}function f(G,p){return b.trigger.apply(b,[G,p||da].concat(Array.prototype.slice.call(arguments,2),[da]))}function g(G){return j(G)&&!d("disableDragging")}function l(G){return j(G)&&!d("disableResizing")}function j(G){return Ta(G.editable,(G.source||{}).editable,d("editable"))}function t(G){U={};var p,L=G.length,c;for(p=0;p<L;p++){c=G[p];if(U[c._id])U[c._id].push(c);else U[c._id]=[c]}}function y(G){return G.end?N(G.end):na(G)}function S(G,p){ca.push(p);if(ka[G._id])ka[G._id].push(p);else ka[G._id]=
-[p]}function Q(){ca=[];ka={}}function q(G,p){p.click(function(L){if(!p.hasClass("ui-draggable-dragging")&&!p.hasClass("ui-resizable-resizing"))return f("eventClick",this,G,L)}).hover(function(L){f("eventMouseover",this,G,L)},function(L){f("eventMouseout",this,G,L)})}function u(G,p){oa(G,p,"show")}function fa(G,p){oa(G,p,"hide")}function oa(G,p,L){G=ka[G._id];var c,z=G.length;for(c=0;c<z;c++)if(!p||G[c][0]!=p[0])G[c][L]()}function ga(G,p,L,c,z,H,T){var X=p.allDay,ya=p._id;sa(U[ya],L,c,z);f("eventDrop",
-G,p,L,c,z,function(){sa(U[ya],-L,-c,X);pa(ya)},H,T);pa(ya)}function ra(G,p,L,c,z,H){var T=p._id;ha(U[T],L,c);f("eventResize",G,p,L,c,function(){ha(U[T],-L,-c);pa(T)},z,H);pa(T)}function sa(G,p,L,c){L=L||0;for(var z,H=G.length,T=0;T<H;T++){z=G[T];if(c!==ma)z.allDay=c;xa(ba(z.start,p,true),L);if(z.end)z.end=xa(ba(z.end,p,true),L);ua(z,qa)}}function ha(G,p,L){L=L||0;for(var c,z=G.length,H=0;H<z;H++){c=G[H];c.end=xa(ba(y(c),p,true),L);ua(c,qa)}}var da=this;da.element=a;da.calendar=b;da.name=e;da.opt=
-d;da.trigger=f;da.isEventDraggable=g;da.isEventResizable=l;da.reportEvents=t;da.eventEnd=y;da.reportEventElement=S;da.reportEventClear=Q;da.eventElementHandlers=q;da.showEvents=u;da.hideEvents=fa;da.eventDrop=ga;da.eventResize=ra;var na=da.defaultEventEnd,ua=b.normalizeEvent,pa=b.reportEventChange,U={},ca=[],ka={},qa=b.options}function Qb(){function a(i,C){var P=z(),E=pa(),B=U(),n=0,Y,W,o=i.length,s,v;P[0].innerHTML=e(i);d(i,P.children());f(i);g(i,P,C);l(i);j(i);t(i);C=y();for(P=0;P<E;P++){Y=[];for(W=
-0;W<B;W++)Y[W]=0;for(;n<o&&(s=i[n]).row==P;){W=Hb(Y.slice(s.startCol,s.endCol));s.top=W;W+=s.outerHeight;for(v=s.startCol;v<s.endCol;v++)Y[v]=W;n++}C[P].height(Hb(Y))}Q(i,S(C))}function b(i,C,P){var E=m("<div/>"),B=z(),n=i.length,Y;E[0].innerHTML=e(i);E=E.children();B.append(E);d(i,E);l(i);j(i);t(i);Q(i,S(y()));E=[];for(B=0;B<n;B++)if(Y=i[B].element){i[B].row===C&&Y.css("top",P);E.push(Y[0])}return m(E)}function e(i){var C=fa("isRTL"),P,E=i.length,B,n,Y,W;P=ka();var o=P.left,s=P.right,v,F,r,J,M,k=
-"";for(P=0;P<E;P++){B=i[P];n=B.event;W=["fc-event","fc-event-skin","fc-event-hori"];ga(n)&&W.push("fc-event-draggable");if(C){B.isStart&&W.push("fc-corner-right");B.isEnd&&W.push("fc-corner-left");v=p(B.end.getDay()-1);F=p(B.start.getDay());r=B.isEnd?qa(v):o;J=B.isStart?G(F):s}else{B.isStart&&W.push("fc-corner-left");B.isEnd&&W.push("fc-corner-right");v=p(B.start.getDay());F=p(B.end.getDay()-1);r=B.isStart?qa(v):o;J=B.isEnd?G(F):s}W=W.concat(n.className);if(n.source)W=W.concat(n.source.className||
-[]);Y=n.url;M=Jb(n,fa);k+=Y?"<a href='"+Qa(Y)+"'":"<div";k+=" class='"+W.join(" ")+"' style='position:absolute;z-index:8;left:"+r+"px;"+M+"'><div class='fc-event-inner fc-event-skin'"+(M?" style='"+M+"'":"")+">";if(!n.allDay&&B.isStart)k+="<span class='fc-event-time'>"+Qa(T(n.start,n.end,fa("timeFormat")))+"</span>";k+="<span class='fc-event-title'>"+Qa(n.title)+"</span></div>";if(B.isEnd&&ra(n))k+="<div class='ui-resizable-handle ui-resizable-"+(C?"w":"e")+"'>&nbsp;&nbsp;&nbsp;</div>";k+="</"+(Y?
-"a":"div")+">";B.left=r;B.outerWidth=J-r;B.startCol=v;B.endCol=F+1}return k}function d(i,C){var P,E=i.length,B,n,Y;for(P=0;P<E;P++){B=i[P];n=B.event;Y=m(C[P]);n=oa("eventRender",n,n,Y);if(n===false)Y.remove();else{if(n&&n!==true){n=m(n).css({position:"absolute",left:B.left});Y.replaceWith(n);Y=n}B.element=Y}}}function f(i){var C,P=i.length,E,B;for(C=0;C<P;C++){E=i[C];(B=E.element)&&ha(E.event,B)}}function g(i,C,P){var E,B=i.length,n,Y,W;for(E=0;E<B;E++){n=i[E];if(Y=n.element){W=n.event;if(W._id===
-P)H(W,Y,n);else Y[0]._fci=E}}Db(C,i,H)}function l(i){var C,P=i.length,E,B,n,Y,W={};for(C=0;C<P;C++){E=i[C];if(B=E.element){n=E.key=Ib(B[0]);Y=W[n];if(Y===ma)Y=W[n]=pb(B,true);E.hsides=Y}}}function j(i){var C,P=i.length,E,B;for(C=0;C<P;C++){E=i[C];if(B=E.element)B[0].style.width=Math.max(0,E.outerWidth-E.hsides)+"px"}}function t(i){var C,P=i.length,E,B,n,Y,W={};for(C=0;C<P;C++){E=i[C];if(B=E.element){n=E.key;Y=W[n];if(Y===ma)Y=W[n]=Fb(B);E.outerHeight=B[0].offsetHeight+Y}}}function y(){var i,C=pa(),
-P=[];for(i=0;i<C;i++)P[i]=ca(i).find("td:first div.fc-day-content > div");return P}function S(i){var C,P=i.length,E=[];for(C=0;C<P;C++)E[C]=i[C][0].offsetTop;return E}function Q(i,C){var P,E=i.length,B,n;for(P=0;P<E;P++){B=i[P];if(n=B.element){n[0].style.top=C[B.row]+(B.top||0)+"px";B=B.event;oa("eventAfterRender",B,B,n)}}}function q(i,C,P){var E=fa("isRTL"),B=E?"w":"e",n=C.find("div.ui-resizable-"+B),Y=false;qb(C);C.mousedown(function(W){W.preventDefault()}).click(function(W){if(Y){W.preventDefault();
-W.stopImmediatePropagation()}});n.mousedown(function(W){function o(ia){oa("eventResizeStop",this,i,ia);m("body").css("cursor","");s.stop();ya();k&&ua(this,i,k,0,ia);setTimeout(function(){Y=false},0)}if(W.which==1){Y=true;var s=u.getHoverListener(),v=pa(),F=U(),r=E?-1:1,J=E?F-1:0,M=C.css("top"),k,D,Z=m.extend({},i),ja=L(i.start);K();m("body").css("cursor",B+"-resize").one("mouseup",o);oa("eventResizeStart",this,i,W);s.start(function(ia,la){if(ia){var $=Math.max(ja.row,ia.row);ia=ia.col;if(v==1)$=0;
-if($==ja.row)ia=E?Math.min(ja.col,ia):Math.max(ja.col,ia);k=$*7+ia*r+J-(la.row*7+la.col*r+J);la=ba(sa(i),k,true);if(k){Z.end=la;$=D;D=b(c([Z]),P.row,M);D.find("*").css("cursor",B+"-resize");$&&$.remove();na(i)}else if(D){da(i);D.remove();D=null}ya();X(i.start,ba(N(la),1))}},W)}})}var u=this;u.renderDaySegs=a;u.resizableDayEvent=q;var fa=u.opt,oa=u.trigger,ga=u.isEventDraggable,ra=u.isEventResizable,sa=u.eventEnd,ha=u.reportEventElement,da=u.showEvents,na=u.hideEvents,ua=u.eventResize,pa=u.getRowCnt,
-U=u.getColCnt,ca=u.allDayRow,ka=u.allDayBounds,qa=u.colContentLeft,G=u.colContentRight,p=u.dayOfWeekCol,L=u.dateCell,c=u.compileDaySegs,z=u.getDaySegmentContainer,H=u.bindDaySeg,T=u.calendar.formatDates,X=u.renderDayOverlay,ya=u.clearOverlays,K=u.clearSelection}function Mb(){function a(Q,q,u){b();q||(q=j(Q,u));t(Q,q,u);e(Q,q,u)}function b(Q){if(S){S=false;y();l("unselect",null,Q)}}function e(Q,q,u,fa){S=true;l("select",null,Q,q,u,fa)}function d(Q){var q=f.cellDate,u=f.cellIsAllDay,fa=f.getHoverListener(),
-oa=f.reportDayClick;if(Q.which==1&&g("selectable")){b(Q);var ga;fa.start(function(ra,sa){y();if(ra&&u(ra)){ga=[q(sa),q(ra)].sort(Gb);t(ga[0],ga[1],true)}else ga=null},Q);m(document).one("mouseup",function(ra){fa.stop();if(ga){+ga[0]==+ga[1]&&oa(ga[0],true,ra);e(ga[0],ga[1],true,ra)}})}}var f=this;f.select=a;f.unselect=b;f.reportSelection=e;f.daySelectionMousedown=d;var g=f.opt,l=f.trigger,j=f.defaultSelectionEnd,t=f.renderSelection,y=f.clearSelection,S=false;g("selectable")&&g("unselectAuto")&&m(document).mousedown(function(Q){var q=
-g("unselectCancel");if(q)if(m(Q.target).parents(q).length)return;b(Q)})}function Lb(){function a(g,l){var j=f.shift();j||(j=m("<div class='fc-cell-overlay' style='position:absolute;z-index:3'/>"));j[0].parentNode!=l[0]&&j.appendTo(l);d.push(j.css(g).show());return j}function b(){for(var g;g=d.shift();)f.push(g.hide().unbind())}var e=this;e.renderOverlay=a;e.clearOverlays=b;var d=[],f=[]}function Nb(a){var b=this,e,d;b.build=function(){e=[];d=[];a(e,d)};b.cell=function(f,g){var l=e.length,j=d.length,
-t,y=-1,S=-1;for(t=0;t<l;t++)if(g>=e[t][0]&&g<e[t][1]){y=t;break}for(t=0;t<j;t++)if(f>=d[t][0]&&f<d[t][1]){S=t;break}return y>=0&&S>=0?{row:y,col:S}:null};b.rect=function(f,g,l,j,t){t=t.offset();return{top:e[f][0]-t.top,left:d[g][0]-t.left,width:d[j][1]-d[g][0],height:e[l][1]-e[f][0]}}}function Ob(a){function b(j){xc(j);j=a.cell(j.pageX,j.pageY);if(!j!=!l||j&&(j.row!=l.row||j.col!=l.col)){if(j){g||(g=j);f(j,g,j.row-g.row,j.col-g.col)}else f(j,g);l=j}}var e=this,d,f,g,l;e.start=function(j,t,y){f=j;
-g=l=null;a.build();b(t);d=y||"mousemove";m(document).bind(d,b)};e.stop=function(){m(document).unbind(d,b);return l}}function xc(a){if(a.pageX===ma){a.pageX=a.originalEvent.pageX;a.pageY=a.originalEvent.pageY}}function Pb(a){function b(l){return d[l]=d[l]||a(l)}var e=this,d={},f={},g={};e.left=function(l){return f[l]=f[l]===ma?b(l).position().left:f[l]};e.right=function(l){return g[l]=g[l]===ma?e.left(l)+b(l).width():g[l]};e.clear=function(){d={};f={};g={}}}var Ya={defaultView:"month",aspectRatio:1.35,
-header:{left:"title",center:"",right:"today prev,next"},weekends:true,allDayDefault:true,ignoreTimezone:true,lazyFetching:true,startParam:"start",endParam:"end",titleFormat:{month:"MMMM yyyy",week:"MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}",day:"dddd, MMM d, yyyy"},columnFormat:{month:"ddd",week:"ddd M/d",day:"dddd M/d"},timeFormat:{"":"h(:mm)t"},isRTL:false,firstDay:0,monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan",
-"Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],buttonText:{prev:"&nbsp;&#9668;&nbsp;",next:"&nbsp;&#9658;&nbsp;",prevYear:"&nbsp;&lt;&lt;&nbsp;",nextYear:"&nbsp;&gt;&gt;&nbsp;",today:"today",month:"month",week:"week",day:"day"},theme:false,buttonIcons:{prev:"circle-triangle-w",next:"circle-triangle-e"},unselectAuto:true,dropAccept:"*"},yc=
-{header:{left:"next,prev today",center:"",right:"title"},buttonText:{prev:"&nbsp;&#9658;&nbsp;",next:"&nbsp;&#9668;&nbsp;",prevYear:"&nbsp;&gt;&gt;&nbsp;",nextYear:"&nbsp;&lt;&lt;&nbsp;"},buttonIcons:{prev:"circle-triangle-e",next:"circle-triangle-w"}},Aa=m.fullCalendar={version:"1.5.3"},Ja=Aa.views={};m.fn.fullCalendar=function(a){if(typeof a=="string"){var b=Array.prototype.slice.call(arguments,1),e;this.each(function(){var f=m.data(this,"fullCalendar");if(f&&m.isFunction(f[a])){f=f[a].apply(f,
-b);if(e===ma)e=f;a=="destroy"&&m.removeData(this,"fullCalendar")}});if(e!==ma)return e;return this}var d=a.eventSources||[];delete a.eventSources;if(a.events){d.push(a.events);delete a.events}a=m.extend(true,{},Ya,a.isRTL||a.isRTL===ma&&Ya.isRTL?yc:{},a);this.each(function(f,g){f=m(g);g=new Yb(f,a,d);f.data("fullCalendar",g);g.render()});return this};Aa.sourceNormalizers=[];Aa.sourceFetchers=[];var ac={dataType:"json",cache:false},bc=1;Aa.addDays=ba;Aa.cloneDate=N;Aa.parseDate=kb;Aa.parseISO8601=
-Bb;Aa.parseTime=mb;Aa.formatDate=Oa;Aa.formatDates=ib;var lc=["sun","mon","tue","wed","thu","fri","sat"],Ab=864E5,cc=36E5,wc=6E4,dc={s:function(a){return a.getSeconds()},ss:function(a){return Pa(a.getSeconds())},m:function(a){return a.getMinutes()},mm:function(a){return Pa(a.getMinutes())},h:function(a){return a.getHours()%12||12},hh:function(a){return Pa(a.getHours()%12||12)},H:function(a){return a.getHours()},HH:function(a){return Pa(a.getHours())},d:function(a){return a.getDate()},dd:function(a){return Pa(a.getDate())},
-ddd:function(a,b){return b.dayNamesShort[a.getDay()]},dddd:function(a,b){return b.dayNames[a.getDay()]},M:function(a){return a.getMonth()+1},MM:function(a){return Pa(a.getMonth()+1)},MMM:function(a,b){return b.monthNamesShort[a.getMonth()]},MMMM:function(a,b){return b.monthNames[a.getMonth()]},yy:function(a){return(a.getFullYear()+"").substring(2)},yyyy:function(a){return a.getFullYear()},t:function(a){return a.getHours()<12?"a":"p"},tt:function(a){return a.getHours()<12?"am":"pm"},T:function(a){return a.getHours()<
-12?"A":"P"},TT:function(a){return a.getHours()<12?"AM":"PM"},u:function(a){return Oa(a,"yyyy-MM-dd'T'HH:mm:ss'Z'")},S:function(a){a=a.getDate();if(a>10&&a<20)return"th";return["st","nd","rd"][a%10-1]||"th"}};Aa.applyAll=$a;Ja.month=mc;Ja.basicWeek=nc;Ja.basicDay=oc;wb({weekMode:"fixed"});Ja.agendaWeek=qc;Ja.agendaDay=rc;wb({allDaySlot:true,allDayText:"all-day",firstHour:6,slotMinutes:30,defaultEventMinutes:120,axisFormat:"h(:mm)tt",timeFormat:{agenda:"h:mm{ - h:mm}"},dragOpacity:{agenda:0.5},minTime:0,
-maxTime:24})})(jQuery);
+/*!
+ * FullCalendar v1.6.0
+ * Docs & License: http://arshaw.com/fullcalendar/
+ * (c) 2013 Adam Shaw
+ */
+(function(t,e){function n(e){t.extend(!0,ye,e)}function r(n,r,l){function u(t){G?(S(),C(),R(),b(t)):f()}function f(){K=r.theme?"ui":"fc",n.addClass("fc"),r.isRTL?n.addClass("fc-rtl"):n.addClass("fc-ltr"),r.theme&&n.addClass("ui-widget"),G=t("<div class='fc-content' style='position:relative'/>").prependTo(n),$=new a(Z,r),Q=$.render(),Q&&n.prepend(Q),y(r.defaultView),t(window).resize(x),m()||v()}function v(){setTimeout(function(){!te.start&&m()&&b()},0)}function h(){t(window).unbind("resize",x),$.destroy(),G.remove(),n.removeClass("fc fc-rtl ui-widget")}function g(){return 0!==se.offsetWidth}function m(){return 0!==t("body")[0].offsetWidth}function y(e){if(!te||e!=te.name){ue++,W();var n,r=te;r?((r.beforeHide||I)(),q(G,G.height()),r.element.hide()):q(G,1),G.css("overflow","hidden"),te=ce[e],te?te.element.show():te=ce[e]=new De[e](n=re=t("<div class='fc-view fc-view-"+e+"' style='position:absolute'/>").appendTo(G),Z),r&&$.deactivateButton(r.name),$.activateButton(e),b(),G.css("overflow",""),r&&q(G,1),n||(te.afterShow||I)(),ue--}}function b(t){if(g()){ue++,W(),ne===e&&S();var r=!1;!te.start||t||te.start>fe||fe>=te.end?(te.render(fe,t||0),E(!0),r=!0):te.sizeDirty?(te.clearEvents(),E(),r=!0):te.eventsDirty&&(te.clearEvents(),r=!0),te.sizeDirty=!1,te.eventsDirty=!1,T(r),ee=n.outerWidth(),$.updateTitle(te.title);var a=new Date;a>=te.start&&te.end>a?$.disableButton("today"):$.enableButton("today"),ue--,te.trigger("viewDisplay",se)}}function M(){C(),g()&&(S(),E(),W(),te.clearEvents(),te.renderEvents(de),te.sizeDirty=!1)}function C(){t.each(ce,function(t,e){e.sizeDirty=!0})}function S(){ne=r.contentHeight?r.contentHeight:r.height?r.height-(Q?Q.height():0)-L(G):Math.round(G.width()/Math.max(r.aspectRatio,.5))}function E(t){ue++,te.setHeight(ne,t),re&&(re.css("position","relative"),re=null),te.setWidth(G.width(),t),ue--}function x(){if(!ue)if(te.start){var t=++le;setTimeout(function(){t==le&&!ue&&g()&&ee!=(ee=n.outerWidth())&&(ue++,M(),te.trigger("windowResize",se),ue--)},200)}else v()}function T(t){!r.lazyFetching||oe(te.visStart,te.visEnd)?k():t&&F()}function k(){ie(te.visStart,te.visEnd)}function H(t){de=t,F()}function z(t){F(t)}function F(t){R(),g()&&(te.clearEvents(),te.renderEvents(de,t),te.eventsDirty=!1)}function R(){t.each(ce,function(t,e){e.eventsDirty=!0})}function N(t,n,r){te.select(t,n,r===e?!0:r)}function W(){te&&te.unselect()}function A(){b(-1)}function _(){b(1)}function O(){i(fe,-1),b()}function B(){i(fe,1),b()}function Y(){fe=new Date,b()}function j(t,e,n){t instanceof Date?fe=d(t):p(fe,t,e,n),b()}function P(t,n,r){t!==e&&i(fe,t),n!==e&&s(fe,n),r!==e&&c(fe,r),b()}function J(){return d(fe)}function V(){return te}function X(t,n){return n===e?r[t]:(("height"==t||"contentHeight"==t||"aspectRatio"==t)&&(r[t]=n,M()),e)}function U(t,n){return r[t]?r[t].apply(n||se,Array.prototype.slice.call(arguments,2)):e}var Z=this;Z.options=r,Z.render=u,Z.destroy=h,Z.refetchEvents=k,Z.reportEvents=H,Z.reportEventChange=z,Z.rerenderEvents=F,Z.changeView=y,Z.select=N,Z.unselect=W,Z.prev=A,Z.next=_,Z.prevYear=O,Z.nextYear=B,Z.today=Y,Z.gotoDate=j,Z.incrementDate=P,Z.formatDate=function(t,e){return w(t,e,r)},Z.formatDates=function(t,e,n){return D(t,e,n,r)},Z.getDate=J,Z.getView=V,Z.option=X,Z.trigger=U,o.call(Z,r,l);var $,Q,G,K,te,ee,ne,re,ae,oe=Z.isFetchNeeded,ie=Z.fetchEvents,se=n[0],ce={},le=0,ue=0,fe=new Date,de=[];p(fe,r.year,r.month,r.date),r.droppable&&t(document).bind("dragstart",function(e,n){var a=e.target,o=t(a);if(!o.parents(".fc").length){var i=r.dropAccept;(t.isFunction(i)?i.call(a,o):o.is(i))&&(ae=a,te.dragStart(ae,e,n))}}).bind("dragstop",function(t,e){ae&&(te.dragStop(ae,t,e),ae=null)})}function a(n,r){function a(){v=r.theme?"ui":"fc";var n=r.header;return n?h=t("<table class='fc-header' style='width:100%'/>").append(t("<tr/>").append(i("left")).append(i("center")).append(i("right"))):e}function o(){h.remove()}function i(e){var a=t("<td class='fc-header-"+e+"'/>"),o=r.header[e];return o&&t.each(o.split(" "),function(e){e>0&&a.append("<span class='fc-header-space'/>");var o;t.each(this.split(","),function(e,i){if("title"==i)a.append("<span class='fc-header-title'><h2>&nbsp;</h2></span>"),o&&o.addClass(v+"-corner-right"),o=null;else{var s;if(n[i]?s=n[i]:De[i]&&(s=function(){u.removeClass(v+"-state-hover"),n.changeView(i)}),s){var c=r.theme?J(r.buttonIcons,i):null,l=J(r.buttonText,i),u=t("<span class='fc-button fc-button-"+i+" "+v+"-state-default'>"+(c?"<span class='fc-icon-wrap'><span class='ui-icon ui-icon-"+c+"'/>"+"</span>":l)+"</span>").click(function(){u.hasClass(v+"-state-disabled")||s()}).mousedown(function(){u.not("."+v+"-state-active").not("."+v+"-state-disabled").addClass(v+"-state-down")}).mouseup(function(){u.removeClass(v+"-state-down")}).hover(function(){u.not("."+v+"-state-active").not("."+v+"-state-disabled").addClass(v+"-state-hover")},function(){u.removeClass(v+"-state-hover").removeClass(v+"-state-down")}).appendTo(a);U(u),o||u.addClass(v+"-corner-left"),o=u}}}),o&&o.addClass(v+"-corner-right")}),a}function s(t){h.find("h2").html(t)}function c(t){h.find("span.fc-button-"+t).addClass(v+"-state-active")}function l(t){h.find("span.fc-button-"+t).removeClass(v+"-state-active")}function u(t){h.find("span.fc-button-"+t).addClass(v+"-state-disabled")}function f(t){h.find("span.fc-button-"+t).removeClass(v+"-state-disabled")}var d=this;d.render=a,d.destroy=o,d.updateTitle=s,d.activateButton=c,d.deactivateButton=l,d.disableButton=u,d.enableButton=f;var v,h=t([])}function o(n,r){function a(t,e){return!S||S>t||e>E}function o(t,e){S=t,E=e,W=[];var n=++F,r=z.length;R=r;for(var a=0;r>a;a++)i(z[a],n)}function i(e,r){s(e,function(a){if(r==F){if(a){n.eventDataTransform&&(a=t.map(a,n.eventDataTransform)),e.eventDataTransform&&(a=t.map(a,e.eventDataTransform));for(var o=0;a.length>o;o++)a[o].source=e,b(a[o]);W=W.concat(a)}R--,R||k(W)}})}function s(r,a){var o,i,c=we.sourceFetchers;for(o=0;c.length>o;o++){if(i=c[o](r,S,E,a),i===!0)return;if("object"==typeof i)return s(i,a),e}var l=r.events;if(l)t.isFunction(l)?(p(),l(d(S),d(E),function(t){a(t),y()})):t.isArray(l)?a(l):a();else{var u=r.url;if(u){var f=r.success,v=r.error,h=r.complete,g=t.extend({},r.data||{}),m=K(r.startParam,n.startParam),b=K(r.endParam,n.endParam);m&&(g[m]=Math.round(+S/1e3)),b&&(g[b]=Math.round(+E/1e3)),p(),t.ajax(t.extend({},Me,r,{data:g,success:function(e){e=e||[];var n=G(f,this,arguments);t.isArray(n)&&(e=n),a(e)},error:function(){G(v,this,arguments),a()},complete:function(){G(h,this,arguments),y()}}))}else a()}}function c(t){t=l(t),t&&(R++,i(t,F))}function l(n){return t.isFunction(n)||t.isArray(n)?n={events:n}:"string"==typeof n&&(n={url:n}),"object"==typeof n?(w(n),z.push(n),n):e}function u(e){z=t.grep(z,function(t){return!D(t,e)}),W=t.grep(W,function(t){return!D(t.source,e)}),k(W)}function f(t){var e,n,r=W.length,a=T().defaultEventEnd,o=t.start-t._start,i=t.end?t.end-(t._end||a(t)):0;for(e=0;r>e;e++)n=W[e],n._id==t._id&&n!=t&&(n.start=new Date(+n.start+o),n.end=t.end?n.end?new Date(+n.end+i):new Date(+a(n)+i):null,n.title=t.title,n.url=t.url,n.allDay=t.allDay,n.className=t.className,n.editable=t.editable,n.color=t.color,n.backgroudColor=t.backgroudColor,n.borderColor=t.borderColor,n.textColor=t.textColor,b(n));b(t),k(W)}function v(t,e){b(t),t.source||(e&&(H.events.push(t),t.source=H),W.push(t)),k(W)}function h(e){if(e){if(!t.isFunction(e)){var n=e+"";e=function(t){return t._id==n}}W=t.grep(W,e,!0);for(var r=0;z.length>r;r++)t.isArray(z[r].events)&&(z[r].events=t.grep(z[r].events,e,!0))}else{W=[];for(var r=0;z.length>r;r++)t.isArray(z[r].events)&&(z[r].events=[])}k(W)}function g(e){return t.isFunction(e)?t.grep(W,e):e?(e+="",t.grep(W,function(t){return t._id==e})):W}function p(){N++||x("loading",null,!0)}function y(){--N||x("loading",null,!1)}function b(t){var r=t.source||{},a=K(r.ignoreTimezone,n.ignoreTimezone);t._id=t._id||(t.id===e?"_fc"+Ce++:t.id+""),t.date&&(t.start||(t.start=t.date),delete t.date),t._start=d(t.start=m(t.start,a)),t.end=m(t.end,a),t.end&&t.end<=t.start&&(t.end=null),t._end=t.end?d(t.end):null,t.allDay===e&&(t.allDay=K(r.allDayDefault,n.allDayDefault)),t.className?"string"==typeof t.className&&(t.className=t.className.split(/\s+/)):t.className=[]}function w(t){t.className?"string"==typeof t.className&&(t.className=t.className.split(/\s+/)):t.className=[];for(var e=we.sourceNormalizers,n=0;e.length>n;n++)e[n](t)}function D(t,e){return t&&e&&M(t)==M(e)}function M(t){return("object"==typeof t?t.events||t.url:"")||t}var C=this;C.isFetchNeeded=a,C.fetchEvents=o,C.addEventSource=c,C.removeEventSource=u,C.updateEvent=f,C.renderEvent=v,C.removeEvents=h,C.clientEvents=g,C.normalizeEvent=b;for(var S,E,x=C.trigger,T=C.getView,k=C.reportEvents,H={events:[]},z=[H],F=0,R=0,N=0,W=[],A=0;r.length>A;A++)l(r[A])}function i(t,e,n){return t.setFullYear(t.getFullYear()+e),n||f(t),t}function s(t,e,n){if(+t){var r=t.getMonth()+e,a=d(t);for(a.setDate(1),a.setMonth(r),t.setMonth(r),n||f(t);t.getMonth()!=a.getMonth();)t.setDate(t.getDate()+(a>t?1:-1))}return t}function c(t,e,n){if(+t){var r=t.getDate()+e,a=d(t);a.setHours(9),a.setDate(r),t.setDate(r),n||f(t),l(t,a)}return t}function l(t,e){if(+t)for(;t.getDate()!=e.getDate();)t.setTime(+t+(e>t?1:-1)*xe)}function u(t,e){return t.setMinutes(t.getMinutes()+e),t}function f(t){return t.setHours(0),t.setMinutes(0),t.setSeconds(0),t.setMilliseconds(0),t}function d(t,e){return e?f(new Date(+t)):new Date(+t)}function v(){var t,e=0;do t=new Date(1970,e++,1);while(t.getHours());return t}function h(t,e,n){for(e=e||1;!t.getDay()||n&&1==t.getDay()||!n&&6==t.getDay();)c(t,e);return t}function g(t,e){return Math.round((d(t,!0)-d(e,!0))/Ee)}function p(t,n,r,a){n!==e&&n!=t.getFullYear()&&(t.setDate(1),t.setMonth(0),t.setFullYear(n)),r!==e&&r!=t.getMonth()&&(t.setDate(1),t.setMonth(r)),a!==e&&t.setDate(a)}function m(t,n){return"object"==typeof t?t:"number"==typeof t?new Date(1e3*t):"string"==typeof t?t.match(/^\d+(\.\d+)?$/)?new Date(1e3*parseFloat(t)):(n===e&&(n=!0),y(t,n)||(t?new Date(t):null)):null}function y(t,e){var n=t.match(/^([0-9]{4})(-([0-9]{2})(-([0-9]{2})([T ]([0-9]{2}):([0-9]{2})(:([0-9]{2})(\.([0-9]+))?)?(Z|(([-+])([0-9]{2})(:?([0-9]{2}))?))?)?)?)?$/);if(!n)return null;var r=new Date(n[1],0,1);if(e||!n[13]){var a=new Date(n[1],0,1,9,0);n[3]&&(r.setMonth(n[3]-1),a.setMonth(n[3]-1)),n[5]&&(r.setDate(n[5]),a.setDate(n[5])),l(r,a),n[7]&&r.setHours(n[7]),n[8]&&r.setMinutes(n[8]),n[10]&&r.setSeconds(n[10]),n[12]&&r.setMilliseconds(1e3*Number("0."+n[12])),l(r,a)}else if(r.setUTCFullYear(n[1],n[3]?n[3]-1:0,n[5]||1),r.setUTCHours(n[7]||0,n[8]||0,n[10]||0,n[12]?1e3*Number("0."+n[12]):0),n[14]){var o=60*Number(n[16])+(n[18]?Number(n[18]):0);o*="-"==n[15]?1:-1,r=new Date(+r+1e3*60*o)}return r}function b(t){if("number"==typeof t)return 60*t;if("object"==typeof t)return 60*t.getHours()+t.getMinutes();var e=t.match(/(\d+)(?::(\d+))?\s*(\w+)?/);if(e){var n=parseInt(e[1],10);return e[3]&&(n%=12,"p"==e[3].toLowerCase().charAt(0)&&(n+=12)),60*n+(e[2]?parseInt(e[2],10):0)}}function w(t,e,n){return D(t,null,e,n)}function D(t,e,n,r){r=r||ye;var a,o,i,s,c=t,l=e,u=n.length,f="";for(a=0;u>a;a++)if(o=n.charAt(a),"'"==o){for(i=a+1;u>i;i++)if("'"==n.charAt(i)){c&&(f+=i==a+1?"'":n.substring(a+1,i),a=i);break}}else if("("==o){for(i=a+1;u>i;i++)if(")"==n.charAt(i)){var d=w(c,n.substring(a+1,i),r);parseInt(d.replace(/\D/,""),10)&&(f+=d),a=i;break}}else if("["==o){for(i=a+1;u>i;i++)if("]"==n.charAt(i)){var v=n.substring(a+1,i),d=w(c,v,r);d!=w(l,v,r)&&(f+=d),a=i;break}}else if("{"==o)c=e,l=t;else if("}"==o)c=t,l=e;else{for(i=u;i>a;i--)if(s=ke[n.substring(a,i)]){c&&(f+=s(c,r)),a=i-1;break}i==a&&c&&(f+=o)}return f}function M(t){var e,n=new Date(t.getTime());return n.setDate(n.getDate()+4-(n.getDay()||7)),e=n.getTime(),n.setMonth(0),n.setDate(1),Math.floor(Math.round((e-n)/864e5)/7)+1}function C(t){return t.end?S(t.end,t.allDay):c(d(t.start),1)}function S(t,e){return t=d(t),e||t.getHours()||t.getMinutes()?c(t,1):f(t)}function E(t,e){return 100*(e.msLength-t.msLength)+(t.event.start-e.event.start)}function x(t,e){return t.end>e.start&&t.start<e.end}function T(t,e,n,r){var a,o,i,s,c,l,u,f,v=[],h=t.length;for(a=0;h>a;a++)o=t[a],i=o.start,s=e[a],s>n&&r>i&&(n>i?(c=d(n),u=!1):(c=i,u=!0),s>r?(l=d(r),f=!1):(l=s,f=!0),v.push({event:o,start:c,end:l,isStart:u,isEnd:f,msLength:l-c}));return v.sort(E)}function k(t){var e,n,r,a,o,i=[],s=t.length;for(e=0;s>e;e++){for(n=t[e],r=0;;){if(a=!1,i[r])for(o=0;i[r].length>o;o++)if(x(i[r][o],n)){a=!0;break}if(!a)break;r++}i[r]?i[r].push(n):i[r]=[n]}return i}function H(n,r,a){n.unbind("mouseover").mouseover(function(n){for(var o,i,s,c=n.target;c!=this;)o=c,c=c.parentNode;(i=o._fci)!==e&&(o._fci=e,s=r[i],a(s.event,s.element,s),t(n.target).trigger(n)),n.stopPropagation()})}function z(e,n,r){for(var a,o=0;e.length>o;o++)a=t(e[o]),a.width(Math.max(0,n-R(a,r)))}function F(e,n,r){for(var a,o=0;e.length>o;o++)a=t(e[o]),a.height(Math.max(0,n-L(a,r)))}function R(t,e){return N(t)+A(t)+(e?W(t):0)}function N(e){return(parseFloat(t.css(e[0],"paddingLeft",!0))||0)+(parseFloat(t.css(e[0],"paddingRight",!0))||0)}function W(e){return(parseFloat(t.css(e[0],"marginLeft",!0))||0)+(parseFloat(t.css(e[0],"marginRight",!0))||0)}function A(e){return(parseFloat(t.css(e[0],"borderLeftWidth",!0))||0)+(parseFloat(t.css(e[0],"borderRightWidth",!0))||0)}function L(t,e){return _(t)+B(t)+(e?O(t):0)}function _(e){return(parseFloat(t.css(e[0],"paddingTop",!0))||0)+(parseFloat(t.css(e[0],"paddingBottom",!0))||0)}function O(e){return(parseFloat(t.css(e[0],"marginTop",!0))||0)+(parseFloat(t.css(e[0],"marginBottom",!0))||0)}function B(e){return(parseFloat(t.css(e[0],"borderTopWidth",!0))||0)+(parseFloat(t.css(e[0],"borderBottomWidth",!0))||0)}function q(t,e){e="number"==typeof e?e+"px":e,t.each(function(t,n){n.style.cssText+=";min-height:"+e+";_height:"+e})}function I(){}function Y(t,e){return t-e}function j(t){return Math.max.apply(Math,t)}function P(t){return(10>t?"0":"")+t}function J(t,n){if(t[n]!==e)return t[n];for(var r,a=n.split(/(?=[A-Z])/),o=a.length-1;o>=0;o--)if(r=t[a[o].toLowerCase()],r!==e)return r;return t[""]}function V(t){return t.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/'/g,"&#039;").replace(/"/g,"&quot;").replace(/\n/g,"<br />")}function X(t){return t.id+"/"+t.className+"/"+t.style.cssText.replace(/(^|;)\s*(top|left|width|height)\s*:[^;]*/gi,"")}function U(t){t.attr("unselectable","on").css("MozUserSelect","none").bind("selectstart.ui",function(){return!1})}function Z(t){t.children().removeClass("fc-first fc-last").filter(":first-child").addClass("fc-first").end().filter(":last-child").addClass("fc-last")}function $(t,e){t.each(function(t,n){n.className=n.className.replace(/^fc-\w*/,"fc-"+Se[e.getDay()])})}function Q(t,e){var n=t.source||{},r=t.color,a=n.color,o=e("eventColor"),i=t.backgroundColor||r||n.backgroundColor||a||e("eventBackgroundColor")||o,s=t.borderColor||r||n.borderColor||a||e("eventBorderColor")||o,c=t.textColor||n.textColor||e("eventTextColor"),l=[];return i&&l.push("background-color:"+i),s&&l.push("border-color:"+s),c&&l.push("color:"+c),l.join(";")}function G(e,n,r){if(t.isFunction(e)&&(e=[e]),e){var a,o;for(a=0;e.length>a;a++)o=e[a].apply(n,r)||o;return o}}function K(){for(var t=0;arguments.length>t;t++)if(arguments[t]!==e)return arguments[t]}function te(t,e){function n(t,e){e&&(s(t,e),t.setDate(1));var n=d(t,!0);n.setDate(1);var l=s(d(n),1),u=d(n),f=d(l),v=a("firstDay"),g=a("weekends")?0:1;g&&(h(u),h(f,-1,!0)),c(u,-((u.getDay()-Math.max(v,g)+7)%7)),c(f,(7-f.getDay()+Math.max(v,g))%7);var p=Math.round((f-u)/(7*Ee));"fixed"==a("weekMode")&&(c(f,7*(6-p)),p=6),r.title=i(n,a("titleFormat")),r.start=n,r.end=l,r.visStart=u,r.visEnd=f,o(p,g?5:7,!0)}var r=this;r.render=n,re.call(r,t,e,"month");var a=r.opt,o=r.renderBasic,i=e.formatDate}function ee(t,e){function n(t,e){e&&c(t,7*e);var n=c(d(t),-((t.getDay()-a("firstDay")+7)%7)),s=c(d(n),7),l=d(n),u=d(s),f=a("weekends");f||(h(l),h(u,-1,!0)),r.title=i(l,c(d(u),-1),a("titleFormat")),r.start=n,r.end=s,r.visStart=l,r.visEnd=u,o(1,f?7:5,!1)}var r=this;r.render=n,re.call(r,t,e,"basicWeek");var a=r.opt,o=r.renderBasic,i=e.formatDates}function ne(t,e){function n(t,e){e&&(c(t,e),a("weekends")||h(t,0>e?-1:1)),r.title=i(t,a("titleFormat")),r.start=r.visStart=d(t,!0),r.end=r.visEnd=c(d(r.start),1),o(1,1,!1)}var r=this;r.render=n,re.call(r,t,e,"basicDay");var a=r.opt,o=r.renderBasic,i=e.formatDate}function re(e,n,r){function a(t,e,n){ne=t,re=e,o();var r=!P;r?i():Te(),s(n)}function o(){ce=Ee("isRTL"),ce?(le=-1,fe=re-1):(le=1,fe=0),pe=Ee("firstDay"),ye=Ee("weekends")?0:1,be=Ee("theme")?"ui":"fc",we=Ee("columnFormat"),De=Ee("weekNumbers"),Me=Ee("weekNumberTitle"),Ce="iso"!=Ee("weekNumberCalculation")?"w":"W"}function i(){Q=t("<div style='position:absolute;z-index:8;top:0;left:0'/>").appendTo(e)}function s(n){var r,a,o,i,s="",c=be+"-widget-header",l=be+"-widget-content",u=B.start.getMonth(),d=f(new Date);for(s+="<table class='fc-border-separate' style='width:100%' cellspacing='0'><thead><tr>",De&&(s+="<th class='fc-week-number "+c+"'/>"),r=0;re>r;r++)s+="<th class='fc-day-header fc-"+Se[r]+" "+c+"'/>";for(s+="</tr></thead><tbody>",r=0;ne>r;r++){for(s+="<tr class='fc-week'>",De&&(s+="<td class='fc-week-number "+l+"'>"+"<div/>"+"</td>"),a=0;re>a;a++)o=F(r,a),i=["fc-day","fc-"+Se[o.getDay()],l],o.getMonth()!=u&&i.push("fc-other-month"),+o==+d&&(i.push("fc-today"),i.push(be+"-state-highlight")),s+="<td class='"+i.join(" ")+"'"+" data-date='"+Fe(o,"yyyy-MM-dd")+"'"+">"+"<div>",n&&(s+="<div class='fc-day-number'>"+o.getDate()+"</div>"),s+="<div class='fc-day-content'><div style='position:relative'>&nbsp;</div></div></div></td>";s+="</tr>"}s+="</tbody></table>",_(),I&&I.remove(),I=t(s).appendTo(e),Y=I.find("thead"),j=Y.find(".fc-day-header"),P=I.find("tbody"),J=P.find("tr"),V=P.find(".fc-day"),X=J.find("td:first-child"),$=J.eq(0).find(".fc-day-content > div"),Z(Y.add(Y.find("tr"))),Z(J),J.eq(0).addClass("fc-first"),J.filter(":last").addClass("fc-last"),De&&Y.find(".fc-week-number").text(Me),j.each(function(e,n){var r=R(e);t(n).text(Fe(r,we))}),De&&P.find(".fc-week-number > div").each(function(e,n){var r=F(e,0);t(n).text(Fe(r,Ce))}),V.each(function(e,n){var r=R(e);xe("dayRender",B,r,t(n))}),v(V)}function l(e){K=e;var n,r,a,o=K-Y.height();"variable"==Ee("weekMode")?n=r=Math.floor(o/(1==ne?2:6)):(n=Math.floor(o/ne),r=o-n*(ne-1)),X.each(function(e,o){ne>e&&(a=t(o),q(a.find("> div"),(e==ne-1?r:n)-L(a)))}),O()}function u(t){G=t,se.clear(),ee=0,De&&(ee=Y.find("th.fc-week-number").outerWidth()),te=Math.floor((G-ee)/re),z(j.slice(0,-1),te)}function v(t){t.click(h).mousedown(ze)}function h(e){if(!Ee("selectable")){var n=y(t(this).data("date"));xe("dayClick",this,n,!0,e)}}function p(t,e,n){n&&oe.build();for(var r=d(B.visStart),a=c(d(r),re),o=0;ne>o;o++){var i=new Date(Math.max(r,t)),s=new Date(Math.min(a,e));if(s>i){var l,u;ce?(l=g(s,r)*le+fe+1,u=g(i,r)*le+fe+1):(l=g(i,r),u=g(s,r)),v(m(o,l,o,u-1))}c(r,7),c(a,7)}}function m(t,n,r,a){var o=oe.rect(t,n,r,a,e);return ke(o,e)}function b(t){return d(t)}function w(t,e){p(t,c(d(e),1),!0)}function D(){He()}function M(t,e,n){var r=k(t),a=V[r.row*re+r.col];xe("dayClick",a,t,e,n)}function C(t,e){ie.start(function(t){He(),t&&m(t.row,t.col,t.row,t.col)},e)}function S(t,e,n){var r=ie.stop();if(He(),r){var a=H(r);xe("drop",t,a,!0,e,n)}}function E(t){return d(t.start)}function x(t){return se.left(t)}function T(t){return se.right(t)}function k(t){return{row:Math.floor(g(t,B.visStart)/7),col:N(t.getDay())}}function H(t){return F(t.row,t.col)}function F(t,e){return c(d(B.visStart),7*t+e*le+fe)}function R(t){return F(Math.floor(t/re),t%re)}function N(t){return(t-Math.max(pe,ye)+re)%re*le+fe}function W(t){return J.eq(t)}function A(){var t=0;return De&&(t+=ee),{left:t,right:G}}function _(){q(e,e.height())}function O(){q(e,1)}var B=this;B.renderBasic=a,B.setHeight=l,B.setWidth=u,B.renderDayOverlay=p,B.defaultSelectionEnd=b,B.renderSelection=w,B.clearSelection=D,B.reportDayClick=M,B.dragStart=C,B.dragStop=S,B.defaultEventEnd=E,B.getHoverListener=function(){return ie},B.colContentLeft=x,B.colContentRight=T,B.dayOfWeekCol=N,B.dateCell=k,B.cellDate=H,B.cellIsAllDay=function(){return!0},B.allDayRow=W,B.allDayBounds=A,B.getRowCnt=function(){return ne},B.getColCnt=function(){return re},B.getColWidth=function(){return te},B.getDaySegmentContainer=function(){return Q},ue.call(B,e,n,r),ve.call(B),de.call(B),ae.call(B);var I,Y,j,P,J,V,X,$,Q,G,K,te,ee,ne,re,oe,ie,se,ce,le,fe,pe,ye,be,we,De,Me,Ce,Ee=B.opt,xe=B.trigger,Te=B.clearEvents,ke=B.renderOverlay,He=B.clearOverlays,ze=B.daySelectionMousedown,Fe=n.formatDate;U(e.addClass("fc-grid")),oe=new he(function(e,n){var r,a,o;j.each(function(e,i){r=t(i),a=r.offset().left,e&&(o[1]=a),o=[a],n[e]=o}),o[1]=a+r.outerWidth(),J.each(function(n,i){ne>n&&(r=t(i),a=r.offset().top,n&&(o[1]=a),o=[a],e[n]=o)}),o[1]=a+r.outerHeight()}),ie=new ge(oe),se=new me(function(t){return $.eq(t)})}function ae(){function e(t,e){v(t),x(r(t),e),l("eventAfterAllRender")}function n(){h(),b().empty()}function r(e){var n,r,a,o,s,l,u=S(),f=E(),v=d(i.visStart),h=c(d(v),f),g=t.map(e,C),p=[];for(n=0;u>n;n++){for(r=k(T(e,g,v,h)),a=0;r.length>a;a++)for(o=r[a],s=0;o.length>s;s++)l=o[s],l.row=n,l.level=a,p.push(l);c(v,7),c(h,7)}return p}function a(t,e,n){u(t)&&o(t,e),n.isEnd&&f(t)&&H(t,e,n),g(t,e)}function o(t,e){var n,r=w();e.draggable({zIndex:9,delay:50,opacity:s("dragOpacity"),revertDuration:s("dragRevertDuration"),start:function(a,o){l("eventDragStart",e,t,a,o),m(t,e),r.start(function(r,a,o,i){e.draggable("option","revert",!r||!o&&!i),M(),r?(n=7*o+i*(s("isRTL")?-1:1),D(c(d(t.start),n),c(C(t),n))):n=0},a,"drag")},stop:function(a,o){r.stop(),M(),l("eventDragStop",e,t,a,o),n?y(this,t,n,0,t.allDay,a,o):(e.css("filter",""),p(t,e))}})}var i=this;i.renderEvents=e,i.compileDaySegs=r,i.clearEvents=n,i.bindDaySeg=a,fe.call(i);var s=i.opt,l=i.trigger,u=i.isEventDraggable,f=i.isEventResizable,v=i.reportEvents,h=i.reportEventClear,g=i.eventElementHandlers,p=i.showEvents,m=i.hideEvents,y=i.eventDrop,b=i.getDaySegmentContainer,w=i.getHoverListener,D=i.renderDayOverlay,M=i.clearOverlays,S=i.getRowCnt,E=i.getColCnt,x=i.renderDaySegs,H=i.resizableDayEvent}function oe(t,e){function n(t,e){e&&c(t,7*e);var n=c(d(t),-((t.getDay()-a("firstDay")+7)%7)),s=c(d(n),7),l=d(n),u=d(s),f=a("weekends");f||(h(l),h(u,-1,!0)),r.title=i(l,c(d(u),-1),a("titleFormat")),r.start=n,r.end=s,r.visStart=l,r.visEnd=u,o(f?7:5)}var r=this;r.render=n,se.call(r,t,e,"agendaWeek");var a=r.opt,o=r.renderAgenda,i=e.formatDates}function ie(t,e){function n(t,e){e&&(c(t,e),a("weekends")||h(t,0>e?-1:1));var n=d(t,!0),s=c(d(n),1);r.title=i(t,a("titleFormat")),r.start=r.visStart=n,r.end=r.visEnd=s,o(1)}var r=this;r.render=n,se.call(r,t,e,"agendaDay");var a=r.opt,o=r.renderAgenda,i=e.formatDate}function se(n,r,a){function o(t){Le=t,i(),te?nn():s(),l()}function i(){Ye=tn("theme")?"ui":"fc",Pe=tn("weekends")?0:1,je=tn("firstDay"),(Je=tn("isRTL"))?(Ve=-1,Xe=Le-1):(Ve=1,Xe=0),Ue=b(tn("minTime")),Ze=b(tn("maxTime")),$e=tn("columnFormat"),Qe=tn("weekNumbers"),Ge=tn("weekNumberTitle"),Ke="iso"!=tn("weekNumberCalculation")?"w":"W",Ne=tn("snapMinutes")||tn("slotMinutes")}function s(){var e,r,a,o,i,s=Ye+"-widget-header",c=Ye+"-widget-content",l=0==tn("slotMinutes")%15;for(e="<table style='width:100%' class='fc-agenda-days fc-border-separate' cellspacing='0'><thead><tr>",e+=Qe?"<th class='fc-agenda-axis fc-week-number "+s+"'/>":"<th class='fc-agenda-axis "+s+"'>&nbsp;</th>",r=0;Le>r;r++)e+="<th class='fc- fc-col"+r+" "+s+"'/>";for(e+="<th class='fc-agenda-gutter "+s+"'>&nbsp;</th>"+"</tr>"+"</thead>"+"<tbody>"+"<tr>"+"<th class='fc-agenda-axis "+s+"'>&nbsp;</th>",r=0;Le>r;r++)e+="<td class='fc- fc-col"+r+" "+c+"'>"+"<div>"+"<div class='fc-day-content'>"+"<div style='position:relative'>&nbsp;</div>"+"</div>"+"</div>"+"</td>";for(e+="<td class='fc-agenda-gutter "+c+"'>&nbsp;</td>"+"</tr>"+"</tbody>"+"</table>",te=t(e).appendTo(n),ee=te.find("thead"),ne=ee.find("th").slice(1,-1),re=te.find("tbody"),ae=re.find("td").slice(0,-1),oe=ae.find("div.fc-day-content div"),ie=ae.eq(0),se=ie.find("> div"),Z(ee.add(ee.find("tr"))),Z(re.add(re.find("tr"))),Se=ee.find("th:first"),Ee=te.find(".fc-agenda-gutter"),le=t("<div style='position:absolute;z-index:2;left:0;width:100%'/>").appendTo(n),tn("allDaySlot")?(fe=t("<div style='position:absolute;z-index:8;top:0;left:0'/>").appendTo(le),e="<table style='width:100%' class='fc-agenda-allday' cellspacing='0'><tr><th class='"+s+" fc-agenda-axis'>"+tn("allDayText")+"</th>"+"<td>"+"<div class='fc-day-content'><div style='position:relative'/></div>"+"</td>"+"<th class='"+s+" fc-agenda-gutter'>&nbsp;</th>"+"</tr>"+"</table>",pe=t(e).appendTo(le),ye=pe.find("tr"),D(ye.find("td")),Se=Se.add(pe.find("th:first")),Ee=Ee.add(pe.find("th.fc-agenda-gutter")),le.append("<div class='fc-agenda-divider "+s+"'>"+"<div class='fc-agenda-divider-inner'/>"+"</div>")):fe=t([]),be=t("<div style='position:absolute;width:100%;overflow-x:hidden;overflow-y:auto'/>").appendTo(le),we=t("<div style='position:relative;width:100%;overflow:hidden'/>").appendTo(be),De=t("<div style='position:absolute;z-index:8;top:0;left:0'/>").appendTo(we),e="<table class='fc-agenda-slots' style='width:100%' cellspacing='0'><tbody>",a=v(),o=u(d(a),Ze),u(a,Ue),_e=0,r=0;o>a;r++)i=a.getMinutes(),e+="<tr class='fc-slot"+r+" "+(i?"fc-minor":"")+"'>"+"<th class='fc-agenda-axis "+s+"'>"+(l&&i?"&nbsp;":un(a,tn("axisFormat")))+"</th>"+"<td class='"+c+"'>"+"<div style='position:relative'>&nbsp;</div>"+"</td>"+"</tr>",u(a,tn("slotMinutes")),_e++;e+="</tbody></table>",Me=t(e).appendTo(we),Ce=Me.find("div:first"),M(Me.find("td")),Se=Se.add(Me.find("th:first"))}function l(){var t,e,n,r,a=f(new Date);if(Qe){var o=un(N(0),Ke);Je?o+=Ge:o=Ge+o,ee.find(".fc-week-number").text(o)}for(t=0;Le>t;t++)r=N(t),e=ne.eq(t),e.html(un(r,$e)),n=ae.eq(t),+r==+a?n.addClass(Ye+"-state-highlight fc-today"):n.removeClass(Ye+"-state-highlight fc-today"),$(e.add(n),r)}function h(t,n){t===e&&(t=ke),ke=t,fn={};var r=re.position().top,a=be.position().top,o=Math.min(t-r,Me.height()+a+1);se.height(o-L(ie)),le.css("top",r),be.height(o-a-1),Re=Ce.height()+1,We=tn("slotMinutes")/Ne,Ae=Re/We,n&&m()}function p(e){Te=e,qe.clear(),He=0,z(Se.width("").each(function(e,n){He=Math.max(He,t(n).outerWidth())}),He);var n=be[0].clientWidth;Fe=be.width()-n,Fe?(z(Ee,Fe),Ee.show().prev().removeClass("fc-last")):Ee.hide().prev().addClass("fc-last"),ze=Math.floor((n-He)/Le),z(ne.slice(0,-1),ze)}function m(){function t(){be.scrollTop(r)}var e=v(),n=d(e);n.setHours(tn("firstHour"));var r=_(e,n)+1;t(),setTimeout(t,0)}function y(){Ie=be.scrollTop()}function w(){be.scrollTop(Ie)}function D(t){t.click(C).mousedown(cn)}function M(t){t.click(C).mousedown(V)}function C(t){if(!tn("selectable")){var e=Math.min(Le-1,Math.floor((t.pageX-te.offset().left-He)/ze)),n=N(e),r=this.parentNode.className.match(/fc-slot(\d+)/);if(r){var a=parseInt(r[1])*tn("slotMinutes"),o=Math.floor(a/60);n.setHours(o),n.setMinutes(a%60+Ue),en("dayClick",ae[e],n,!1,t)}else en("dayClick",ae[e],n,!0,t)}}function S(t,e,n){n&&Oe.build();var r,a,o=d(K.visStart);Je?(r=g(e,o)*Ve+Xe+1,a=g(t,o)*Ve+Xe+1):(r=g(t,o),a=g(e,o)),r=Math.max(0,r),a=Math.min(Le,a),a>r&&D(E(0,r,0,a-1))}function E(t,e,n,r){var a=Oe.rect(t,e,n,r,le);return rn(a,le)}function x(t,e){for(var n=d(K.visStart),r=c(d(n),1),a=0;Le>a;a++){var o=new Date(Math.max(n,t)),i=new Date(Math.min(r,e));if(i>o){var s=a*Ve+Xe,l=Oe.rect(0,s,0,s,we),u=_(n,o),f=_(n,i);l.top=u,l.height=f-u,M(rn(l,we))}c(n,1),c(r,1)}}function T(t){return qe.left(t)}function k(t){return qe.right(t)}function H(t){return{row:Math.floor(g(t,K.visStart)/7),col:A(t.getDay())}}function R(t){var e=N(t.col),n=t.row;return tn("allDaySlot")&&n--,n>=0&&u(e,Ue+n*Ne),e}function N(t){return c(d(K.visStart),t*Ve+Xe)}function W(t){return tn("allDaySlot")&&!t.row}function A(t){return(t-Math.max(je,Pe)+Le)%Le*Ve+Xe}function _(t,n){if(t=d(t,!0),u(d(t),Ue)>n)return 0;if(n>=u(d(t),Ze))return Me.height();var r=tn("slotMinutes"),a=60*n.getHours()+n.getMinutes()-Ue,o=Math.floor(a/r),i=fn[o];return i===e&&(i=fn[o]=Me.find("tr:eq("+o+") td div")[0].offsetTop),Math.max(0,Math.round(i-1+Re*(a%r/r)))}function O(){return{left:He,right:Te-Fe}}function B(){return ye}function q(t){var e=d(t.start);return t.allDay?e:u(e,tn("defaultEventMinutes"))}function I(t,e){return e?d(t):u(d(t),tn("slotMinutes"))}function j(t,e,n){n?tn("allDaySlot")&&S(t,c(d(e),1),!0):P(t,e)}function P(e,n){var r=tn("selectHelper");if(Oe.build(),r){var a=g(e,K.visStart)*Ve+Xe;if(a>=0&&Le>a){var o=Oe.rect(0,a,0,a,we),i=_(e,e),s=_(e,n);if(s>i){if(o.top=i,o.height=s-i,o.left+=2,o.width-=5,t.isFunction(r)){var c=r(e,n);c&&(o.position="absolute",o.zIndex=8,xe=t(c).css(o).appendTo(we))}else o.isStart=!0,o.isEnd=!0,xe=t(ln({title:"",start:e,end:n,className:["fc-select-helper"],editable:!1},o)),xe.css("opacity",tn("dragOpacity"));xe&&(M(xe),we.append(xe),z(xe,o.width,!0),F(xe,o.height,!0))}}}else x(e,n)}function J(){an(),xe&&(xe.remove(),xe=null)}function V(e){if(1==e.which&&tn("selectable")){sn(e);var n;Be.start(function(t,e){if(J(),t&&t.col==e.col&&!W(t)){var r=R(e),a=R(t);n=[r,u(d(r),Ne),a,u(d(a),Ne)].sort(Y),P(n[0],n[3])}else n=null},e),t(document).one("mouseup",function(t){Be.stop(),n&&(+n[0]==+n[1]&&X(n[0],!1,t),on(n[0],n[3],!1,t))})}}function X(t,e,n){en("dayClick",ae[A(t.getDay())],t,e,n)}function Q(t,e){Be.start(function(t){if(an(),t)if(W(t))E(t.row,t.col,t.row,t.col);else{var e=R(t),n=u(d(e),tn("defaultEventMinutes"));x(e,n)}},e)}function G(t,e,n){var r=Be.stop();an(),r&&en("drop",t,R(r),W(r),e,n)}var K=this;K.renderAgenda=o,K.setWidth=p,K.setHeight=h,K.beforeHide=y,K.afterShow=w,K.defaultEventEnd=q,K.timePosition=_,K.dayOfWeekCol=A,K.dateCell=H,K.cellDate=R,K.cellIsAllDay=W,K.allDayRow=B,K.allDayBounds=O,K.getHoverListener=function(){return Be},K.colContentLeft=T,K.colContentRight=k,K.getDaySegmentContainer=function(){return fe},K.getSlotSegmentContainer=function(){return De},K.getMinMinute=function(){return Ue},K.getMaxMinute=function(){return Ze},K.getBodyContent=function(){return we},K.getRowCnt=function(){return 1},K.getColCnt=function(){return Le},K.getColWidth=function(){return ze},K.getSnapHeight=function(){return Ae},K.getSnapMinutes=function(){return Ne},K.defaultSelectionEnd=I,K.renderDayOverlay=S,K.renderSelection=j,K.clearSelection=J,K.reportDayClick=X,K.dragStart=Q,K.dragStop=G,ue.call(K,n,r,a),ve.call(K),de.call(K),ce.call(K);var te,ee,ne,re,ae,oe,ie,se,le,fe,pe,ye,be,we,De,Me,Ce,Se,Ee,xe,Te,ke,He,ze,Fe,Re,Ne,We,Ae,Le,_e,Oe,Be,qe,Ie,Ye,je,Pe,Je,Ve,Xe,Ue,Ze,$e,Qe,Ge,Ke,tn=K.opt,en=K.trigger,nn=K.clearEvents,rn=K.renderOverlay,an=K.clearOverlays,on=K.reportSelection,sn=K.unselect,cn=K.daySelectionMousedown,ln=K.slotSegHtml,un=r.formatDate,fn={};U(n.addClass("fc-agenda")),Oe=new he(function(e,n){function r(t){return Math.max(c,Math.min(l,t))}var a,o,i;ne.each(function(e,r){a=t(r),o=a.offset().left,e&&(i[1]=o),i=[o],n[e]=i}),i[1]=o+a.outerWidth(),tn("allDaySlot")&&(a=ye,o=a.offset().top,e[0]=[o,o+a.outerHeight()]);for(var s=we.offset().top,c=be.offset().top,l=c+be.outerHeight(),u=0;_e*We>u;u++)e.push([r(s+Ae*u),r(s+Ae*(u+1))])}),Be=new ge(Oe),qe=new me(function(t){return oe.eq(t)})}function ce(){function n(t,e){S(t);var n,r=t.length,i=[],c=[];for(n=0;r>n;n++)t[n].allDay?i.push(t[n]):c.push(t[n]);y("allDaySlot")&&(Y(a(i),e),z()),s(o(c),e),b("eventAfterAllRender")}function r(){E(),N().empty(),W().empty()}function a(e){var n,r,a,o,i=k(T(e,t.map(e,C),m.visStart,m.visEnd)),s=i.length,c=[];for(n=0;s>n;n++)for(r=i[n],a=0;r.length>a;a++)o=r[a],o.row=0,o.level=n,c.push(o);return c}function o(e){var n,r,a,o,s,l,f=P(),v=O(),h=_(),g=u(d(m.visStart),v),p=t.map(e,i),y=[];for(n=0;f>n;n++){for(r=k(T(e,p,g,u(d(g),h-v))),le(r),a=0;r.length>a;a++)for(o=r[a],s=0;o.length>s;s++)l=o[s],l.col=n,l.level=a,y.push(l);c(g,1,!0)}return y}function i(t){return t.end?d(t.end):u(d(t.start),y("defaultEventMinutes"))}function s(n,r){var a,o,i,s,c,u,f,d,h,g,p,m,w,D,M,C,S,E,x,T,k,z,F=n.length,N="",A={},_={},O=W(),Y=P();for((T=y("isRTL"))?(k=-1,z=Y-1):(k=1,z=0),a=0;F>a;a++)o=n[a],i=o.event,s=B(o.start,o.start),c=B(o.start,o.end),u=o.col,f=o.level,d=o.forward||0,h=q(u*k+z),g=I(u*k+z)-h,g=Math.min(g-6,.95*g),p=f?g/(f+d+1):d?2*(g/(d+1)-6):g,m=h+g/(f+d+1)*f*k+(T?g-p:0),o.top=s,o.left=m,o.outerWidth=p,o.outerHeight=c-s,N+=l(i,o);
+for(O[0].innerHTML=N,w=O.children(),a=0;F>a;a++)o=n[a],i=o.event,D=t(w[a]),M=b("eventRender",i,i,D),M===!1?D.remove():(M&&M!==!0&&(D.remove(),D=t(M).css({position:"absolute",top:o.top,left:o.left}).appendTo(O)),o.element=D,i._id===r?v(i,D,o):D[0]._fci=a,G(i,D));for(H(O,n,v),a=0;F>a;a++)o=n[a],(D=o.element)&&(S=A[C=o.key=X(D[0])],o.vsides=S===e?A[C]=L(D,!0):S,S=_[C],o.hsides=S===e?_[C]=R(D,!0):S,E=D.find(".fc-event-title"),E.length&&(o.contentTop=E[0].offsetTop));for(a=0;F>a;a++)o=n[a],(D=o.element)&&(D[0].style.width=Math.max(0,o.outerWidth-o.hsides)+"px",x=Math.max(0,o.outerHeight-o.vsides),D[0].style.height=x+"px",i=o.event,o.contentTop!==e&&10>x-o.contentTop&&(D.find("div.fc-event-time").text(ie(i.start,y("timeFormat"))+" - "+i.title),D.find("div.fc-event-title").remove()),b("eventAfterRender",i,i,D))}function l(t,e){var n="<",r=t.url,a=Q(t,y),o=["fc-event","fc-event-vert"];return w(t)&&o.push("fc-event-draggable"),e.isStart&&o.push("fc-event-start"),e.isEnd&&o.push("fc-event-end"),o=o.concat(t.className),t.source&&(o=o.concat(t.source.className||[])),n+=r?"a href='"+V(t.url)+"'":"div",n+=" class='"+o.join(" ")+"'"+" style='position:absolute;z-index:8;top:"+e.top+"px;left:"+e.left+"px;"+a+"'"+">"+"<div class='fc-event-inner'>"+"<div class='fc-event-time'>"+V(se(t.start,t.end,y("timeFormat")))+"</div>"+"<div class='fc-event-title'>"+V(t.title)+"</div>"+"</div>"+"<div class='fc-event-bg'></div>",e.isEnd&&D(t)&&(n+="<div class='ui-resizable-handle ui-resizable-s'>=</div>"),n+="</"+(r?"a":"div")+">"}function f(t,e,n){w(t)&&h(t,e,n.isStart),n.isEnd&&D(t)&&j(t,e,n),x(t,e)}function v(t,e,n){var r=e.find("div.fc-event-time");w(t)&&g(t,e,r),n.isEnd&&D(t)&&p(t,e,r),x(t,e)}function h(t,e,n){function r(){s||(e.width(a).height("").draggable("option","grid",null),s=!0)}var a,o,i,s=!0,l=y("isRTL")?-1:1,u=A(),f=J(),v=U(),h=Z(),g=O();e.draggable({zIndex:9,opacity:y("dragOpacity","month"),revertDuration:y("dragRevertDuration"),start:function(g,p){b("eventDragStart",e,t,g,p),te(t,e),a=e.width(),u.start(function(a,u,g,p){ae(),a?(o=!1,i=p*l,a.row?n?s&&(e.width(f-10),F(e,v*Math.round((t.end?(t.end-t.start)/Te:y("defaultEventMinutes"))/h)),e.draggable("option","grid",[f,1]),s=!1):o=!0:(re(c(d(t.start),i),c(C(t),i)),r()),o=o||s&&!i):(r(),o=!0),e.draggable("option","revert",o)},g,"drag")},stop:function(n,a){if(u.stop(),ae(),b("eventDragStop",e,t,n,a),o)r(),e.css("filter",""),K(t,e);else{var c=0;s||(c=Math.round((e.offset().top-$().offset().top)/v)*h+g-(60*t.start.getHours()+t.start.getMinutes())),ee(this,t,i,c,s,n,a)}}})}function g(t,e,n){function r(e){var r,a=u(d(t.start),e);t.end&&(r=u(d(t.end),e)),n.text(se(a,r,y("timeFormat")))}function a(){f&&(n.css("display",""),e.draggable("option","grid",[p,m]),f=!1)}var o,i,s,l,f=!1,v=y("isRTL")?-1:1,h=A(),g=P(),p=J(),m=U(),w=Z();e.draggable({zIndex:9,scroll:!1,grid:[p,m],axis:1==g?"y":!1,opacity:y("dragOpacity"),revertDuration:y("dragRevertDuration"),start:function(r,u){b("eventDragStart",e,t,r,u),te(t,e),o=e.position(),s=l=0,h.start(function(r,o,s,l){e.draggable("option","revert",!r),ae(),r&&(i=l*v,y("allDaySlot")&&!r.row?(f||(f=!0,n.hide(),e.draggable("option","grid",null)),re(c(d(t.start),i),c(C(t),i))):a())},r,"drag")},drag:function(t,e){s=Math.round((e.position.top-o.top)/m)*w,s!=l&&(f||r(s),l=s)},stop:function(n,c){var l=h.stop();ae(),b("eventDragStop",e,t,n,c),l&&(i||s||f)?ee(this,t,i,f?0:s,f,n,c):(a(),e.css("filter",""),e.css(o),r(0),K(t,e))}})}function p(t,e,n){var r,a,o=U(),i=Z();e.resizable({handles:{s:".ui-resizable-handle"},grid:o,start:function(n,o){r=a=0,te(t,e),e.css("z-index",9),b("eventResizeStart",this,t,n,o)},resize:function(s,c){r=Math.round((Math.max(o,e.height())-c.originalSize.height)/o),r!=a&&(n.text(se(t.start,r||t.end?u(M(t),i*r):null,y("timeFormat"))),a=r)},stop:function(n,a){b("eventResizeStop",this,t,n,a),r?ne(this,t,0,i*r,n,a):(e.css("z-index",8),K(t,e))}})}var m=this;m.renderEvents=n,m.compileDaySegs=a,m.clearEvents=r,m.slotSegHtml=l,m.bindDaySeg=f,fe.call(m);var y=m.opt,b=m.trigger,w=m.isEventDraggable,D=m.isEventResizable,M=m.eventEnd,S=m.reportEvents,E=m.reportEventClear,x=m.eventElementHandlers,z=m.setHeight,N=m.getDaySegmentContainer,W=m.getSlotSegmentContainer,A=m.getHoverListener,_=m.getMaxMinute,O=m.getMinMinute,B=m.timePosition,q=m.colContentLeft,I=m.colContentRight,Y=m.renderDaySegs,j=m.resizableDayEvent,P=m.getColCnt,J=m.getColWidth,U=m.getSnapHeight,Z=m.getSnapMinutes,$=m.getBodyContent,G=m.reportEventElement,K=m.showEvents,te=m.hideEvents,ee=m.eventDrop,ne=m.eventResize,re=m.renderDayOverlay,ae=m.clearOverlays,oe=m.calendar,ie=oe.formatDate,se=oe.formatDates}function le(t){var e,n,r,a,o,i;for(e=t.length-1;e>0;e--)for(a=t[e],n=0;a.length>n;n++)for(o=a[n],r=0;t[e-1].length>r;r++)i=t[e-1][r],x(o,i)&&(i.forward=Math.max(i.forward||0,(o.forward||0)+1))}function ue(t,n,r){function a(t,e){var n=F[t];return"object"==typeof n?J(n,e||r):n}function o(t,e){return n.trigger.apply(n,[t,e||S].concat(Array.prototype.slice.call(arguments,2),[S]))}function i(t){return l(t)&&!a("disableDragging")}function s(t){return l(t)&&!a("disableResizing")}function l(t){return K(t.editable,(t.source||{}).editable,a("editable"))}function f(t){k={};var e,n,r=t.length;for(e=0;r>e;e++)n=t[e],k[n._id]?k[n._id].push(n):k[n._id]=[n]}function v(t){return t.end?d(t.end):E(t)}function h(t,e){H.push(e),z[t._id]?z[t._id].push(e):z[t._id]=[e]}function g(){H=[],z={}}function p(t,n){n.click(function(r){return n.hasClass("ui-draggable-dragging")||n.hasClass("ui-resizable-resizing")?e:o("eventClick",this,t,r)}).hover(function(e){o("eventMouseover",this,t,e)},function(e){o("eventMouseout",this,t,e)})}function m(t,e){b(t,e,"show")}function y(t,e){b(t,e,"hide")}function b(t,e,n){var r,a=z[t._id],o=a.length;for(r=0;o>r;r++)e&&a[r][0]==e[0]||a[r][n]()}function w(t,e,n,r,a,i,s){var c=e.allDay,l=e._id;M(k[l],n,r,a),o("eventDrop",t,e,n,r,a,function(){M(k[l],-n,-r,c),T(l)},i,s),T(l)}function D(t,e,n,r,a,i){var s=e._id;C(k[s],n,r),o("eventResize",t,e,n,r,function(){C(k[s],-n,-r),T(s)},a,i),T(s)}function M(t,n,r,a){r=r||0;for(var o,i=t.length,s=0;i>s;s++)o=t[s],a!==e&&(o.allDay=a),u(c(o.start,n,!0),r),o.end&&(o.end=u(c(o.end,n,!0),r)),x(o,F)}function C(t,e,n){n=n||0;for(var r,a=t.length,o=0;a>o;o++)r=t[o],r.end=u(c(v(r),e,!0),n),x(r,F)}var S=this;S.element=t,S.calendar=n,S.name=r,S.opt=a,S.trigger=o,S.isEventDraggable=i,S.isEventResizable=s,S.reportEvents=f,S.eventEnd=v,S.reportEventElement=h,S.reportEventClear=g,S.eventElementHandlers=p,S.showEvents=m,S.hideEvents=y,S.eventDrop=w,S.eventResize=D;var E=S.defaultEventEnd,x=n.normalizeEvent,T=n.reportEventChange,k={},H=[],z={},F=n.options}function fe(){function n(t,e){var n,r,c,d,p,m,y,b,w=B(),D=T(),M=k(),C=0,S=t.length;for(w[0].innerHTML=a(t),o(t,w.children()),i(t),s(t,w,e),l(t),u(t),f(t),n=v(),r=0;D>r;r++){for(c=0,d=[],p=0;M>p;p++)d[p]=0;for(;S>C&&(m=t[C]).row==r;){for(y=j(d.slice(m.startCol,m.endCol)),m.top=y,y+=m.outerHeight,b=m.startCol;m.endCol>b;b++)d[b]=y;C++}n[r].height(j(d))}g(t,h(n))}function r(e,n,r){var i,s,c,d=t("<div/>"),p=B(),m=e.length;for(d[0].innerHTML=a(e),i=d.children(),p.append(i),o(e,i),l(e),u(e),f(e),g(e,h(v())),i=[],s=0;m>s;s++)c=e[s].element,c&&(e[s].row===n&&c.css("top",r),i.push(c[0]));return t(i)}function a(t){var e,n,r,a,o,i,s,c,l,u,f=y("isRTL"),d=t.length,v=F(),h=v.left,g=v.right,p="";for(e=0;d>e;e++)n=t[e],r=n.event,o=["fc-event","fc-event-hori"],w(r)&&o.push("fc-event-draggable"),n.isStart&&o.push("fc-event-start"),n.isEnd&&o.push("fc-event-end"),f?(i=A(n.end.getDay()-1),s=A(n.start.getDay()),c=n.isEnd?N(i):h,l=n.isStart?W(s):g):(i=A(n.start.getDay()),s=A(n.end.getDay()-1),c=n.isStart?N(i):h,l=n.isEnd?W(s):g),o=o.concat(r.className),r.source&&(o=o.concat(r.source.className||[])),a=r.url,u=Q(r,y),p+=a?"<a href='"+V(a)+"'":"<div",p+=" class='"+o.join(" ")+"'"+" style='position:absolute;z-index:8;left:"+c+"px;"+u+"'"+">"+"<div class='fc-event-inner'>",!r.allDay&&n.isStart&&(p+="<span class='fc-event-time'>"+V(I(r.start,r.end,y("timeFormat")))+"</span>"),p+="<span class='fc-event-title'>"+V(r.title)+"</span>"+"</div>",n.isEnd&&D(r)&&(p+="<div class='ui-resizable-handle ui-resizable-"+(f?"w":"e")+"'>"+"&nbsp;&nbsp;&nbsp;"+"</div>"),p+="</"+(a?"a":"div")+">",n.left=c,n.outerWidth=l-c,n.startCol=i,n.endCol=s+1;return p}function o(e,n){var r,a,o,i,s,c=e.length;for(r=0;c>r;r++)a=e[r],o=a.event,i=t(n[r]),s=b("eventRender",o,o,i),s===!1?i.remove():(s&&s!==!0&&(s=t(s).css({position:"absolute",left:a.left}),i.replaceWith(s),i=s),a.element=i)}function i(t){var e,n,r,a=t.length;for(e=0;a>e;e++)n=t[e],r=n.element,r&&C(n.event,r)}function s(t,e,n){var r,a,o,i,s=t.length;for(r=0;s>r;r++)a=t[r],o=a.element,o&&(i=a.event,i._id===n?q(i,o,a):o[0]._fci=r);H(e,t,q)}function l(t){var n,r,a,o,i,s=t.length,c={};for(n=0;s>n;n++)r=t[n],a=r.element,a&&(o=r.key=X(a[0]),i=c[o],i===e&&(i=c[o]=R(a,!0)),r.hsides=i)}function u(t){var e,n,r,a=t.length;for(e=0;a>e;e++)n=t[e],r=n.element,r&&(r[0].style.width=Math.max(0,n.outerWidth-n.hsides)+"px")}function f(t){var n,r,a,o,i,s=t.length,c={};for(n=0;s>n;n++)r=t[n],a=r.element,a&&(o=r.key,i=c[o],i===e&&(i=c[o]=O(a)),r.outerHeight=a[0].offsetHeight+i)}function v(){var t,e=T(),n=[];for(t=0;e>t;t++)n[t]=z(t).find("div.fc-day-content > div");return n}function h(t){var e,n=t.length,r=[];for(e=0;n>e;e++)r[e]=t[e][0].offsetTop;return r}function g(t,e){var n,r,a,o,i=t.length;for(n=0;i>n;n++)r=t[n],a=r.element,a&&(a[0].style.top=e[r.row]+(r.top||0)+"px",o=r.event,b("eventAfterRender",o,o,a))}function p(e,n,a){var o=y("isRTL"),i=o?"w":"e",s=n.find(".ui-resizable-"+i),l=!1;U(n),n.mousedown(function(t){t.preventDefault()}).click(function(t){l&&(t.preventDefault(),t.stopImmediatePropagation())}),s.mousedown(function(s){function u(n){b("eventResizeStop",this,e,n),t("body").css("cursor",""),h.stop(),P(),f&&x(this,e,f,0,n),setTimeout(function(){l=!1},0)}if(1==s.which){l=!0;var f,v,h=m.getHoverListener(),g=T(),p=k(),y=o?-1:1,w=o?p-1:0,D=n.css("top"),C=t.extend({},e),H=L(e.start);J(),t("body").css("cursor",i+"-resize").one("mouseup",u),b("eventResizeStart",this,e,s),h.start(function(t,n){if(t){var s=Math.max(H.row,t.row),l=t.col;1==g&&(s=0),s==H.row&&(l=o?Math.min(H.col,l):Math.max(H.col,l)),f=7*s+l*y+w-(7*n.row+n.col*y+w);var u=c(M(e),f,!0);if(f){C.end=u;var h=v;v=r(_([C]),a.row,D),v.find("*").css("cursor",i+"-resize"),h&&h.remove(),E(e)}else v&&(S(e),v.remove(),v=null);P(),Y(e.start,c(d(u),1))}},s)}})}var m=this;m.renderDaySegs=n,m.resizableDayEvent=p;var y=m.opt,b=m.trigger,w=m.isEventDraggable,D=m.isEventResizable,M=m.eventEnd,C=m.reportEventElement,S=m.showEvents,E=m.hideEvents,x=m.eventResize,T=m.getRowCnt,k=m.getColCnt;m.getColWidth;var z=m.allDayRow,F=m.allDayBounds,N=m.colContentLeft,W=m.colContentRight,A=m.dayOfWeekCol,L=m.dateCell,_=m.compileDaySegs,B=m.getDaySegmentContainer,q=m.bindDaySeg,I=m.calendar.formatDates,Y=m.renderDayOverlay,P=m.clearOverlays,J=m.clearSelection}function de(){function e(t,e,a){n(),e||(e=c(t,a)),l(t,e,a),r(t,e,a)}function n(t){f&&(f=!1,u(),s("unselect",null,t))}function r(t,e,n,r){f=!0,s("select",null,t,e,n,r)}function a(e){var a=o.cellDate,s=o.cellIsAllDay,c=o.getHoverListener(),f=o.reportDayClick;if(1==e.which&&i("selectable")){n(e);var d;c.start(function(t,e){u(),t&&s(t)?(d=[a(e),a(t)].sort(Y),l(d[0],d[1],!0)):d=null},e),t(document).one("mouseup",function(t){c.stop(),d&&(+d[0]==+d[1]&&f(d[0],!0,t),r(d[0],d[1],!0,t))})}}var o=this;o.select=e,o.unselect=n,o.reportSelection=r,o.daySelectionMousedown=a;var i=o.opt,s=o.trigger,c=o.defaultSelectionEnd,l=o.renderSelection,u=o.clearSelection,f=!1;i("selectable")&&i("unselectAuto")&&t(document).mousedown(function(e){var r=i("unselectCancel");r&&t(e.target).parents(r).length||n(e)})}function ve(){function e(e,n){var r=o.shift();return r||(r=t("<div class='fc-cell-overlay' style='position:absolute;z-index:3'/>")),r[0].parentNode!=n[0]&&r.appendTo(n),a.push(r.css(e).show()),r}function n(){for(var t;t=a.shift();)o.push(t.hide().unbind())}var r=this;r.renderOverlay=e,r.clearOverlays=n;var a=[],o=[]}function he(t){var e,n,r=this;r.build=function(){e=[],n=[],t(e,n)},r.cell=function(t,r){var a,o=e.length,i=n.length,s=-1,c=-1;for(a=0;o>a;a++)if(r>=e[a][0]&&e[a][1]>r){s=a;break}for(a=0;i>a;a++)if(t>=n[a][0]&&n[a][1]>t){c=a;break}return s>=0&&c>=0?{row:s,col:c}:null},r.rect=function(t,r,a,o,i){var s=i.offset();return{top:e[t][0]-s.top,left:n[r][0]-s.left,width:n[o][1]-n[r][0],height:e[a][1]-e[t][0]}}}function ge(e){function n(t){pe(t);var n=e.cell(t.pageX,t.pageY);(!n!=!i||n&&(n.row!=i.row||n.col!=i.col))&&(n?(o||(o=n),a(n,o,n.row-o.row,n.col-o.col)):a(n,o),i=n)}var r,a,o,i,s=this;s.start=function(s,c,l){a=s,o=i=null,e.build(),n(c),r=l||"mousemove",t(document).bind(r,n)},s.stop=function(){return t(document).unbind(r,n),i}}function pe(t){t.pageX===e&&(t.pageX=t.originalEvent.pageX,t.pageY=t.originalEvent.pageY)}function me(t){function n(e){return a[e]=a[e]||t(e)}var r=this,a={},o={},i={};r.left=function(t){return o[t]=o[t]===e?n(t).position().left:o[t]},r.right=function(t){return i[t]=i[t]===e?r.left(t)+n(t).width():i[t]},r.clear=function(){a={},o={},i={}}}var ye={defaultView:"month",aspectRatio:1.35,header:{left:"title",center:"",right:"today prev,next"},weekends:!0,weekNumbers:!1,weekNumberCalculation:"iso",weekNumberTitle:"W",allDayDefault:!0,ignoreTimezone:!0,lazyFetching:!0,startParam:"start",endParam:"end",titleFormat:{month:"MMMM yyyy",week:"MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}",day:"dddd, MMM d, yyyy"},columnFormat:{month:"ddd",week:"ddd M/d",day:"dddd M/d"},timeFormat:{"":"h(:mm)t"},isRTL:!1,firstDay:0,monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],buttonText:{prev:"<span class='fc-text-arrow'>&lsaquo;</span>",next:"<span class='fc-text-arrow'>&rsaquo;</span>",prevYear:"<span class='fc-text-arrow'>&laquo;</span>",nextYear:"<span class='fc-text-arrow'>&raquo;</span>",today:"today",month:"month",week:"week",day:"day"},theme:!1,buttonIcons:{prev:"circle-triangle-w",next:"circle-triangle-e"},unselectAuto:!0,dropAccept:"*"},be={header:{left:"next,prev today",center:"",right:"title"},buttonText:{prev:"<span class='fc-text-arrow'>&rsaquo;</span>",next:"<span class='fc-text-arrow'>&lsaquo;</span>",prevYear:"<span class='fc-text-arrow'>&raquo;</span>",nextYear:"<span class='fc-text-arrow'>&laquo;</span>"},buttonIcons:{prev:"circle-triangle-e",next:"circle-triangle-w"}},we=t.fullCalendar={version:"1.6.0"},De=we.views={};t.fn.fullCalendar=function(n){if("string"==typeof n){var a,o=Array.prototype.slice.call(arguments,1);return this.each(function(){var r=t.data(this,"fullCalendar");if(r&&t.isFunction(r[n])){var i=r[n].apply(r,o);a===e&&(a=i),"destroy"==n&&t.removeData(this,"fullCalendar")}}),a!==e?a:this}var i=n.eventSources||[];return delete n.eventSources,n.events&&(i.push(n.events),delete n.events),n=t.extend(!0,{},ye,n.isRTL||n.isRTL===e&&ye.isRTL?be:{},n),this.each(function(e,a){var o=t(a),s=new r(o,n,i);o.data("fullCalendar",s),s.render()}),this},we.sourceNormalizers=[],we.sourceFetchers=[];var Me={dataType:"json",cache:!1},Ce=1;we.addDays=c,we.cloneDate=d,we.parseDate=m,we.parseISO8601=y,we.parseTime=b,we.formatDate=w,we.formatDates=D;var Se=["sun","mon","tue","wed","thu","fri","sat"],Ee=864e5,xe=36e5,Te=6e4,ke={s:function(t){return t.getSeconds()},ss:function(t){return P(t.getSeconds())},m:function(t){return t.getMinutes()},mm:function(t){return P(t.getMinutes())},h:function(t){return t.getHours()%12||12},hh:function(t){return P(t.getHours()%12||12)},H:function(t){return t.getHours()},HH:function(t){return P(t.getHours())},d:function(t){return t.getDate()},dd:function(t){return P(t.getDate())},ddd:function(t,e){return e.dayNamesShort[t.getDay()]},dddd:function(t,e){return e.dayNames[t.getDay()]},M:function(t){return t.getMonth()+1},MM:function(t){return P(t.getMonth()+1)},MMM:function(t,e){return e.monthNamesShort[t.getMonth()]},MMMM:function(t,e){return e.monthNames[t.getMonth()]},yy:function(t){return(t.getFullYear()+"").substring(2)},yyyy:function(t){return t.getFullYear()},t:function(t){return 12>t.getHours()?"a":"p"},tt:function(t){return 12>t.getHours()?"am":"pm"},T:function(t){return 12>t.getHours()?"A":"P"},TT:function(t){return 12>t.getHours()?"AM":"PM"},u:function(t){return w(t,"yyyy-MM-dd'T'HH:mm:ss'Z'")},S:function(t){var e=t.getDate();return e>10&&20>e?"th":["st","nd","rd"][e%10-1]||"th"},w:function(t,e){return e.weekNumberCalculation(t)},W:function(t){return M(t)}};we.dateFormatters=ke,we.applyAll=G,De.month=te,De.basicWeek=ee,De.basicDay=ne,n({weekMode:"fixed"}),De.agendaWeek=oe,De.agendaDay=ie,n({allDaySlot:!0,allDayText:"all-day",firstHour:6,slotMinutes:30,defaultEventMinutes:120,axisFormat:"h(:mm)tt",timeFormat:{agenda:"h:mm{ - h:mm}"},dragOpacity:{agenda:.5},minTime:0,maxTime:24})})(jQuery); \ No newline at end of file
diff --git a/library/fullcalendar/fullcalendar.print.css b/library/fullcalendar/fullcalendar.print.css
index e11c18163..e92f900cd 100644
--- a/library/fullcalendar/fullcalendar.print.css
+++ b/library/fullcalendar/fullcalendar.print.css
@@ -1,54 +1,25 @@
+/*!
+ * FullCalendar v1.6.0 Print Stylesheet
+ * Docs & License: http://arshaw.com/fullcalendar/
+ * (c) 2013 Adam Shaw
+ */
+
/*
- * FullCalendar v1.5.3 Print Stylesheet
- *
* Include this stylesheet on your page to get a more printer-friendly calendar.
* When including this stylesheet, use the media='print' attribute of the <link> tag.
* Make sure to include this stylesheet IN ADDITION to the regular fullcalendar.css.
- *
- * Copyright (c) 2011 Adam Shaw
- * Dual licensed under the MIT and GPL licenses, located in
- * MIT-LICENSE.txt and GPL-LICENSE.txt respectively.
- *
- * Date: Mon Feb 6 22:40:40 2012 -0800
- *
*/
/* Events
-----------------------------------------------------*/
-.fc-event-skin {
- background: none !important;
+.fc-event {
+ background: #fff !important;
color: #000 !important;
}
-/* horizontal events */
-
-.fc-event-hori {
- border-width: 0 0 1px 0 !important;
- border-bottom-style: dotted !important;
- border-bottom-color: #000 !important;
- padding: 1px 0 0 0 !important;
- }
-
-.fc-event-hori .fc-event-inner {
- border-width: 0 !important;
- padding: 0 1px !important;
- }
-
-/* vertical events */
-
-.fc-event-vert {
- border-width: 0 0 0 1px !important;
- border-left-style: dotted !important;
- border-left-color: #000 !important;
- padding: 0 1px 0 0 !important;
- }
-
-.fc-event-vert .fc-event-inner {
- border-width: 0 !important;
- padding: 1px 0 !important;
- }
+/* for vertical events */
.fc-event-bg {
display: none !important;
diff --git a/library/fullcalendar/gcal.js b/library/fullcalendar/gcal.js
index e9bbe26d8..64263fcf3 100644
--- a/library/fullcalendar/gcal.js
+++ b/library/fullcalendar/gcal.js
@@ -1,12 +1,7 @@
-/*
- * FullCalendar v1.5.3 Google Calendar Plugin
- *
- * Copyright (c) 2011 Adam Shaw
- * Dual licensed under the MIT and GPL licenses, located in
- * MIT-LICENSE.txt and GPL-LICENSE.txt respectively.
- *
- * Date: Mon Feb 6 22:40:40 2012 -0800
- *
+/*!
+ * FullCalendar v1.6.0 Google Calendar Plugin
+ * Docs & License: http://arshaw.com/fullcalendar/
+ * (c) 2013 Adam Shaw
*/
(function($) {
diff --git a/library/fullcalendar/license.txt b/library/fullcalendar/license.txt
new file mode 100644
index 000000000..dd7b48e8b
--- /dev/null
+++ b/library/fullcalendar/license.txt
@@ -0,0 +1,20 @@
+Copyright (c) 2013 Adam Shaw
+
+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/library/jquery_ac/friendica.complete.js b/library/jquery_ac/friendica.complete.js
index c8a28c0a7..190625e87 100644
--- a/library/jquery_ac/friendica.complete.js
+++ b/library/jquery_ac/friendica.complete.js
@@ -35,6 +35,7 @@
this.ignoreValueChange = false;
this.serviceUrl = options.serviceUrl;
this.isLocal = false;
+ this.id = options.id;
this.options = {
autoSubmit: false,
minChars: 1,
@@ -77,7 +78,7 @@
if (!this.options.width) { this.options.width = this.el.width(); }
this.mainContainerId = 'AutocompleteContainter_' + uid;
- $('<div id="' + this.mainContainerId + '" style="position:absolute;z-index:9999;"><div class="autocomplete-w1"><div class="autocomplete" id="' + autocompleteElId + '" style="display:none; width:300px;"></div></div></div>').appendTo('body');
+ $('<div id="' + this.mainContainerId + '" style="position:absolute;z-index:9999;"><div class="autocomplete-w1" id="'+this.id+'"><div class="autocomplete" id="' + autocompleteElId + '" style="display:none; width:300px;"></div></div></div>').appendTo('body');
this.container = $('#' + autocompleteElId);
this.fixPosition();
@@ -242,7 +243,7 @@
} else if (!this.isBadQuery(q)) {
me = this;
me.options.params.query = q;
- $('#nav-search-spinner').show();
+ $('#nav-search-spinner').spin('tiny');
$.get(this.serviceUrl, me.options.params, function(txt) { me.processResponse(txt); }, 'text');
}
},
@@ -305,7 +306,7 @@
this.data = response.data;
this.suggest();
}
- $('#nav-search-spinner').hide();
+ $('#nav-search-spinner').spin(false);
},
activate: function(index) {
diff --git a/library/jslider/css/jslider.css b/library/jslider/css/jslider.css
index c982e1306..fe943dc0a 100644
--- a/library/jslider/css/jslider.css
+++ b/library/jslider/css/jslider.css
@@ -12,9 +12,9 @@
.jslider .jslider-bg { position: relative; }
.jslider .jslider-bg i { height: 5px; position: absolute; font-size: 0; top: 0; }
- .jslider .jslider-bg .l { width: 50%; background-position: 0 0; left: 0; }
- .jslider .jslider-bg .r { width: 50%; left: 50%; background-position: right 0; }
- .jslider .jslider-bg .v { position: absolute; width: 60%; left: 20%; top: 0; height: 5px; background-position: 0 -20px; }
+ .jslider .jslider-bg .l { width: 50%; background-position: 0 0; left: 0; background: #888; }
+ .jslider .jslider-bg .r { width: 50%; left: 50%; background-position: right 0; background: #888;}
+ .jslider .jslider-bg .v { position: absolute; background: url(../img/jslider.png) repeat-x 0 0; width: 60%; left: 20%; top: 0; height: 5px; background-position: 0 -20px; }
.jslider .jslider-pointer { width: 13px; height: 15px; background-position: 0 -40px; position: absolute; left: 20%; top: -4px; margin-left: -6px; cursor: pointer; cursor: hand; }
.jslider .jslider-pointer-hover { background-position: -20px -40px; }
@@ -23,7 +23,7 @@
.jslider .jslider-label { font-size: 9px; line-height: 12px; color: black; opacity: 0.4; white-space: nowrap; padding: 0px 2px; position: absolute; top: -18px; left: 0px; }
.jslider .jslider-label-to { left: auto; right: 0; }
- .jslider .jslider-value { font-size: 9px; white-space: nowrap; padding: 1px 2px 0; position: absolute; top: -19px; left: 20%; background: white; line-height: 12px; -moz-border-radius: 2px; -webkit-border-radius: 2px; -o-border-radius: 2px; border-radius: 2px; }
+ .jslider .jslider-value { font-size: 9px; white-space: nowrap; padding: 1px 2px 0; position: absolute; top: -19px; left: 20%; line-height: 12px; }
.jslider .jslider-value-to { left: 80%; }
.jslider .jslider-label small,
diff --git a/library/jslider/img/jslider.png b/library/jslider/img/jslider.png
index 12d26ccad..280eb7188 100644
--- a/library/jslider/img/jslider.png
+++ b/library/jslider/img/jslider.png
Binary files differ
diff --git a/library/phpqrcode/CHANGELOG b/library/phpqrcode/CHANGELOG
new file mode 100644
index 000000000..1088530c3
--- /dev/null
+++ b/library/phpqrcode/CHANGELOG
@@ -0,0 +1,38 @@
+* 1.0.0 build 2010031920
+
+ - first public release
+ - help in readme, install
+ - cleanup ans separation of QRtools and QRspec
+ - now TCPDF binding requires minimal changes in TCPDF, having most of job
+ done in QRtools tcpdfBarcodeArray
+ - nicer QRtools::timeBenchmark output
+ - license and copyright notices in files
+ - indent cleanup - from tab to 4spc, keep it that way please :)
+ - sf project, repository, wiki
+ - simple code generator in index.php
+
+* 1.1.0 build 2010032113
+
+ - added merge tool wich generate merged version of code
+ located in phpqrcode.php
+ - splited qrconst.php from qrlib.php
+
+* 1.1.1 build 2010032405
+
+ - patch by Rick Seymour allowing saving PNG and displaying it at the same time
+ - added version info in VERSION file
+ - modified merge tool to include version info into generated file
+ - fixed e-mail in almost all head comments
+
+* 1.1.2 build 2010032722
+
+ - full integration with TCPDF thanks to Nicola Asuni, it's author
+ - fixed bug with alphanumeric encoding detection
+
+* 1.1.3 build 2010081807
+
+ - short opening tags replaced with standard ones
+
+* 1.1.4 build 2010100721
+
+ - added missing static keyword QRinput::check (found by Luke Brookhart, Onjax LLC)
diff --git a/library/phpqrcode/INSTALL b/library/phpqrcode/INSTALL
new file mode 100644
index 000000000..eac6b072b
--- /dev/null
+++ b/library/phpqrcode/INSTALL
@@ -0,0 +1,67 @@
+== REQUIREMENTS ==
+
+ * PHP5
+ * PHP GD2 extension with JPEG and PNG support
+
+== INSTALLATION ==
+
+If you want to recreate cache by yourself make sure cache directory is
+writable and you have permisions to write into it. Also make sure you are
+able to read files in it if you have cache option enabled
+
+== CONFIGURATION ==
+
+Feel free to modify config constants in qrconfig.php file. Read about it in
+provided comments and project wiki page (links in README file)
+
+== QUICK START ==
+
+Notice: probably you should'nt use all of this in same script :)
+
+<?phpb
+
+//include only that one, rest required files will be included from it
+include "qrlib.php"
+
+//write code into file, Error corection lecer is lowest, L (one form: L,M,Q,H)
+//each code square will be 4x4 pixels (4x zoom)
+//code will have 2 code squares white boundary around
+
+QRcode::png('PHP QR Code :)', 'test.png', 'L', 4, 2);
+
+//same as above but outputs file directly into browser (with appr. header etc.)
+//all other settings are default
+//WARNING! it should be FIRST and ONLY output generated by script, otherwise
+//rest of output will land inside PNG binary, breaking it for sure
+QRcode::png('PHP QR Code :)');
+
+//show benchmark
+QRtools::timeBenchmark();
+
+//rebuild cache
+QRtools::buildCache();
+
+//code generated in text mode - as a binary table
+//then displayed out as HTML using Unicode block building chars :)
+$tab = $qr->encode('PHP QR Code :)');
+QRspec::debug($tab, true);
+
+== TCPDF INTEGRATION ==
+
+Inside bindings/tcpdf you will find slightly modified 2dbarcodes.php.
+Instal phpqrcode liblaty inside tcpdf folder, then overwrite (or merge)
+2dbarcodes.php
+
+Then use similar as example #50 from TCPDF examples:
+
+<?php
+
+$style = array(
+ 'border' => true,
+ 'padding' => 4,
+ 'fgcolor' => array(0,0,0),
+ 'bgcolor' => false, //array(255,255,255)
+);
+
+//code name: QR, specify error correction level after semicolon (L,M,Q,H)
+$pdf->write2DBarcode('PHP QR Code :)', 'QR,L', '', '', 30, 30, $style, 'N');
diff --git a/library/phpqrcode/LICENSE b/library/phpqrcode/LICENSE
new file mode 100644
index 000000000..188330326
--- /dev/null
+++ b/library/phpqrcode/LICENSE
@@ -0,0 +1,165 @@
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+ This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+ 0. Additional Definitions.
+
+ As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+ "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+ An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+ A "Combined Work" is a work produced by combining or linking an
+Application with the Library. The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+ The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+ The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+ 1. Exception to Section 3 of the GNU GPL.
+
+ You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+ 2. Conveying Modified Versions.
+
+ If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+ a) under this License, provided that you make a good faith effort to
+ ensure that, in the event an Application does not supply the
+ function or data, the facility still operates, and performs
+ whatever part of its purpose remains meaningful, or
+
+ b) under the GNU GPL, with none of the additional permissions of
+ this License applicable to that copy.
+
+ 3. Object Code Incorporating Material from Library Header Files.
+
+ The object code form of an Application may incorporate material from
+a header file that is part of the Library. You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+ a) Give prominent notice with each copy of the object code that the
+ Library is used in it and that the Library and its use are
+ covered by this License.
+
+ b) Accompany the object code with a copy of the GNU GPL and this license
+ document.
+
+ 4. Combined Works.
+
+ You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+ a) Give prominent notice with each copy of the Combined Work that
+ the Library is used in it and that the Library and its use are
+ covered by this License.
+
+ b) Accompany the Combined Work with a copy of the GNU GPL and this license
+ document.
+
+ c) For a Combined Work that displays copyright notices during
+ execution, include the copyright notice for the Library among
+ these notices, as well as a reference directing the user to the
+ copies of the GNU GPL and this license document.
+
+ d) Do one of the following:
+
+ 0) Convey the Minimal Corresponding Source under the terms of this
+ License, and the Corresponding Application Code in a form
+ suitable for, and under terms that permit, the user to
+ recombine or relink the Application with a modified version of
+ the Linked Version to produce a modified Combined Work, in the
+ manner specified by section 6 of the GNU GPL for conveying
+ Corresponding Source.
+
+ 1) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (a) uses at run time
+ a copy of the Library already present on the user's computer
+ system, and (b) will operate properly with a modified version
+ of the Library that is interface-compatible with the Linked
+ Version.
+
+ e) Provide Installation Information, but only if you would otherwise
+ be required to provide such information under section 6 of the
+ GNU GPL, and only to the extent that such information is
+ necessary to install and execute a modified version of the
+ Combined Work produced by recombining or relinking the
+ Application with a modified version of the Linked Version. (If
+ you use option 4d0, the Installation Information must accompany
+ the Minimal Corresponding Source and Corresponding Application
+ Code. If you use option 4d1, you must provide the Installation
+ Information in the manner specified by section 6 of the GNU GPL
+ for conveying Corresponding Source.)
+
+ 5. Combined Libraries.
+
+ You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+ a) Accompany the combined library with a copy of the same work based
+ on the Library, uncombined with any other library facilities,
+ conveyed under the terms of this License.
+
+ b) Give prominent notice with the combined library that part of it
+ is a work based on the Library, and explaining where to find the
+ accompanying uncombined form of the same work.
+
+ 6. Revised Versions of the GNU Lesser General Public License.
+
+ The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+ If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
diff --git a/library/phpqrcode/README b/library/phpqrcode/README
new file mode 100644
index 000000000..a022fb5e7
--- /dev/null
+++ b/library/phpqrcode/README
@@ -0,0 +1,45 @@
+This is PHP implementation of QR Code 2-D barcode generator. It is pure-php
+LGPL-licensed implementation based on C libqrencode by Kentaro Fukuchi.
+
+== LICENSING ==
+
+Copyright (C) 2010 by Dominik Dzienia
+
+This library is free software; you can redistribute it and/or modify it under
+the terms of the GNU Lesser General Public License as published by the Free
+Software Foundation; either version 3 of the License, or any later version.
+
+This library is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+PARTICULAR PURPOSE. See the GNU Lesser General Public License (LICENSE file)
+for more details.
+
+You should have received a copy of the GNU Lesser General Public License along
+with this library; if not, write to the Free Software Foundation, Inc., 51
+Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+== INSTALATION AND USAGE ==
+
+ * INSTALL file
+ * http://sourceforge.net/apps/mediawiki/phpqrcode/index.php?title=Main_Page
+
+== CONTACT ==
+
+Fell free to contact me via e-mail (deltalab at poczta dot fm) or using
+folowing project pages:
+
+ * http://sourceforge.net/projects/phpqrcode/
+ * http://phpqrcode.sourceforge.net/
+
+== ACKNOWLEDGMENTS ==
+
+Based on C libqrencode library (ver. 3.1.1)
+Copyright (C) 2006-2010 by Kentaro Fukuchi
+http://megaui.net/fukuchi/works/qrencode/index.en.html
+
+QR Code is registered trademarks of DENSO WAVE INCORPORATED in JAPAN and other
+countries.
+
+Reed-Solomon code encoder is written by Phil Karn, KA9Q.
+Copyright (C) 2002, 2003, 2004, 2006 Phil Karn, KA9Q
+ \ No newline at end of file
diff --git a/library/phpqrcode/VERSION b/library/phpqrcode/VERSION
new file mode 100644
index 000000000..9f99279ea
--- /dev/null
+++ b/library/phpqrcode/VERSION
@@ -0,0 +1,2 @@
+1.1.4
+2010100721 \ No newline at end of file
diff --git a/library/phpqrcode/bindings/tcpdf/qrcode.php b/library/phpqrcode/bindings/tcpdf/qrcode.php
new file mode 100644
index 000000000..7995460b5
--- /dev/null
+++ b/library/phpqrcode/bindings/tcpdf/qrcode.php
@@ -0,0 +1,2875 @@
+<?php
+//============================================================+
+// File name : qrcode.php
+// Begin : 2010-03-22
+// Last Update : 2010-03-29
+// Version : 1.0.002
+// License : GNU LGPL v.3 (http://www.gnu.org/copyleft/lesser.html)
+// ----------------------------------------------------------------------------
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 3 of the License, or any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+// or browse http://www.gnu.org/copyleft/lesser.html
+//
+// ----------------------------------------------------------------------------
+//
+// DESCRIPTION :
+//
+// Class to create QR-code arrays for TCPDF class.
+// QR Code symbol is a 2D barcode that can be scanned by
+// handy terminals such as a mobile phone with CCD.
+// The capacity of QR Code is up to 7000 digits or 4000
+// characters, and has high robustness.
+// This class supports QR Code model 2, described in
+// JIS (Japanese Industrial Standards) X0510:2004
+// or ISO/IEC 18004.
+// Currently the following features are not supported:
+// ECI and FNC1 mode, Micro QR Code, QR Code model 1,
+// Structured mode.
+//
+// This class is derived from the following projects:
+// ---------------------------------------------------------
+// "PHP QR Code encoder"
+// License: GNU-LGPLv3
+// Copyright (C) 2010 by Dominik Dzienia <deltalab at poczta dot fm>
+// http://phpqrcode.sourceforge.net/
+// https://sourceforge.net/projects/phpqrcode/
+//
+// The "PHP QR Code encoder" is based on
+// "C libqrencode library" (ver. 3.1.1)
+// License: GNU-LGPL 2.1
+// Copyright (C) 2006-2010 by Kentaro Fukuchi
+// http://megaui.net/fukuchi/works/qrencode/index.en.html
+//
+// Reed-Solomon code encoder is written by Phil Karn, KA9Q.
+// Copyright (C) 2002-2006 Phil Karn, KA9Q
+//
+// QR Code is registered trademark of DENSO WAVE INCORPORATED
+// http://www.denso-wave.com/qrcode/index-e.html
+// ---------------------------------------------------------
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright 2010:
+// Nicola Asuni
+// Tecnick.com S.r.l.
+// Via della Pace, 11
+// 09044 Quartucciu (CA)
+// ITALY
+// www.tecnick.com
+// info@tecnick.com
+//============================================================+
+
+/**
+ * Class to create QR-code arrays for TCPDF class.
+ * QR Code symbol is a 2D barcode that can be scanned by handy terminals such as a mobile phone with CCD.
+ * The capacity of QR Code is up to 7000 digits or 4000 characters, and has high robustness.
+ * This class supports QR Code model 2, described in JIS (Japanese Industrial Standards) X0510:2004 or ISO/IEC 18004.
+ * Currently the following features are not supported: ECI and FNC1 mode, Micro QR Code, QR Code model 1, Structured mode.
+ *
+ * This class is derived from "PHP QR Code encoder" by Dominik Dzienia (http://phpqrcode.sourceforge.net/) based on "libqrencode C library 3.1.1." by Kentaro Fukuchi (http://megaui.net/fukuchi/works/qrencode/index.en.html), contains Reed-Solomon code written by Phil Karn, KA9Q. QR Code is registered trademark of DENSO WAVE INCORPORATED (http://www.denso-wave.com/qrcode/index-e.html).
+ * Please read comments on this class source file for full copyright and license information.
+ *
+ * @package com.tecnick.tcpdf
+ * @abstract Class for generating QR-code array for TCPDF.
+ * @author Nicola Asuni
+ * @copyright 2010 Nicola Asuni - Tecnick.com S.r.l (www.tecnick.com) Via Della Pace, 11 - 09044 - Quartucciu (CA) - ITALY - www.tecnick.com - info@tecnick.com
+ * @link http://www.tcpdf.org
+ * @license http://www.gnu.org/copyleft/lesser.html LGPL
+ * @version 1.0.002
+ */
+
+// definitions
+if (!defined('QRCODEDEFS')) {
+
+ /**
+ * Indicate that definitions for this class are set
+ */
+ define('QRCODEDEFS', true);
+
+ // -----------------------------------------------------
+
+ // Encoding modes (characters which can be encoded in QRcode)
+
+ /**
+ * Encoding mode
+ */
+ define('QR_MODE_NL', -1);
+
+ /**
+ * Encoding mode numeric (0-9). 3 characters are encoded to 10bit length. In theory, 7089 characters or less can be stored in a QRcode.
+ */
+ define('QR_MODE_NM', 0);
+
+ /**
+ * Encoding mode alphanumeric (0-9A-Z $%*+-./:) 45characters. 2 characters are encoded to 11bit length. In theory, 4296 characters or less can be stored in a QRcode.
+ */
+ define('QR_MODE_AN', 1);
+
+ /**
+ * Encoding mode 8bit byte data. In theory, 2953 characters or less can be stored in a QRcode.
+ */
+ define('QR_MODE_8B', 2);
+
+ /**
+ * Encoding mode KANJI. A KANJI character (multibyte character) is encoded to 13bit length. In theory, 1817 characters or less can be stored in a QRcode.
+ */
+ define('QR_MODE_KJ', 3);
+
+ /**
+ * Encoding mode STRUCTURED (currently unsupported)
+ */
+ define('QR_MODE_ST', 4);
+
+ // -----------------------------------------------------
+
+ // Levels of error correction.
+ // QRcode has a function of an error correcting for miss reading that white is black.
+ // Error correcting is defined in 4 level as below.
+
+ /**
+ * Error correction level L : About 7% or less errors can be corrected.
+ */
+ define('QR_ECLEVEL_L', 0);
+
+ /**
+ * Error correction level M : About 15% or less errors can be corrected.
+ */
+ define('QR_ECLEVEL_M', 1);
+
+ /**
+ * Error correction level Q : About 25% or less errors can be corrected.
+ */
+ define('QR_ECLEVEL_Q', 2);
+
+ /**
+ * Error correction level H : About 30% or less errors can be corrected.
+ */
+ define('QR_ECLEVEL_H', 3);
+
+ // -----------------------------------------------------
+
+ // Version. Size of QRcode is defined as version.
+ // Version is from 1 to 40.
+ // Version 1 is 21*21 matrix. And 4 modules increases whenever 1 version increases.
+ // So version 40 is 177*177 matrix.
+
+ /**
+ * Maximum QR Code version.
+ */
+ define('QRSPEC_VERSION_MAX', 40);
+
+ /**
+ * Maximum matrix size for maximum version (version 40 is 177*177 matrix).
+ */
+ define('QRSPEC_WIDTH_MAX', 177);
+
+ // -----------------------------------------------------
+
+ /**
+ * Matrix index to get width from $capacity array.
+ */
+ define('QRCAP_WIDTH', 0);
+
+ /**
+ * Matrix index to get number of words from $capacity array.
+ */
+ define('QRCAP_WORDS', 1);
+
+ /**
+ * Matrix index to get remainder from $capacity array.
+ */
+ define('QRCAP_REMINDER', 2);
+
+ /**
+ * Matrix index to get error correction level from $capacity array.
+ */
+ define('QRCAP_EC', 3);
+
+ // -----------------------------------------------------
+
+ // Structure (currently usupported)
+
+ /**
+ * Number of header bits for structured mode
+ */
+ define('STRUCTURE_HEADER_BITS', 20);
+
+ /**
+ * Max number of symbols for structured mode
+ */
+ define('MAX_STRUCTURED_SYMBOLS', 16);
+
+ // -----------------------------------------------------
+
+ // Masks
+
+ /**
+ * Down point base value for case 1 mask pattern (concatenation of same color in a line or a column)
+ */
+ define('N1', 3);
+
+ /**
+ * Down point base value for case 2 mask pattern (module block of same color)
+ */
+ define('N2', 3);
+
+ /**
+ * Down point base value for case 3 mask pattern (1:1:3:1:1(dark:bright:dark:bright:dark)pattern in a line or a column)
+ */
+ define('N3', 40);
+
+ /**
+ * Down point base value for case 4 mask pattern (ration of dark modules in whole)
+ */
+ define('N4', 10);
+
+ // -----------------------------------------------------
+
+ // Optimization settings
+
+ /**
+ * if true, estimates best mask (spec. default, but extremally slow; set to false to significant performance boost but (propably) worst quality code
+ */
+ define('QR_FIND_BEST_MASK', true);
+
+ /**
+ * if false, checks all masks available, otherwise value tells count of masks need to be checked, mask id are got randomly
+ */
+ define('QR_FIND_FROM_RANDOM', 2);
+
+ /**
+ * when QR_FIND_BEST_MASK === false
+ */
+ define('QR_DEFAULT_MASK', 2);
+
+ // -----------------------------------------------------
+
+} // end of definitions
+
+// #*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#
+
+if (!class_exists('QRcode', false)) {
+
+ // for compaibility with PHP4
+ if (!function_exists('str_split')) {
+ /**
+ * Convert a string to an array (needed for PHP4 compatibility)
+ * @param string $string The input string.
+ * @param int $split_length Maximum length of the chunk.
+ * @return If the optional split_length parameter is specified, the returned array will be broken down into chunks with each being split_length in length, otherwise each chunk will be one character in length. FALSE is returned if split_length is less than 1. If the split_length length exceeds the length of string , the entire string is returned as the first (and only) array element.
+ */
+ function str_split($string, $split_length=1) {
+ if ((strlen($string) > $split_length) OR (!$split_length)) {
+ do {
+ $c = strlen($string);
+ $parts[] = substr($string, 0, $split_length);
+ $string = substr($string, $split_length);
+ } while ($string !== false);
+ } else {
+ $parts = array($string);
+ }
+ return $parts;
+ }
+ }
+
+ // #####################################################
+
+ /**
+ * Class to create QR-code arrays for TCPDF class.
+ * QR Code symbol is a 2D barcode that can be scanned by handy terminals such as a mobile phone with CCD.
+ * The capacity of QR Code is up to 7000 digits or 4000 characters, and has high robustness.
+ * This class supports QR Code model 2, described in JIS (Japanese Industrial Standards) X0510:2004 or ISO/IEC 18004.
+ * Currently the following features are not supported: ECI and FNC1 mode, Micro QR Code, QR Code model 1, Structured mode.
+ *
+ * This class is derived from "PHP QR Code encoder" by Dominik Dzienia (http://phpqrcode.sourceforge.net/) based on "libqrencode C library 3.1.1." by Kentaro Fukuchi (http://megaui.net/fukuchi/works/qrencode/index.en.html), contains Reed-Solomon code written by Phil Karn, KA9Q. QR Code is registered trademark of DENSO WAVE INCORPORATED (http://www.denso-wave.com/qrcode/index-e.html).
+ * Please read comments on this class source file for full copyright and license information.
+ *
+ * @name QRcode
+ * @package com.tecnick.tcpdf
+ * @abstract Class for generating QR-code array for TCPDF.
+ * @author Nicola Asuni
+ * @copyright 2010 Nicola Asuni - Tecnick.com S.r.l (www.tecnick.com) Via Della Pace, 11 - 09044 - Quartucciu (CA) - ITALY - www.tecnick.com - info@tecnick.com
+ * @link http://www.tcpdf.org
+ * @license http://www.gnu.org/copyleft/lesser.html LGPL
+ * @version 1.0.002
+ */
+ class QRcode {
+
+ /**
+ * @var barcode array to be returned which is readable by TCPDF
+ * @access protected
+ */
+ protected $barcode_array = array();
+
+ /**
+ * @var QR code version. Size of QRcode is defined as version. Version is from 1 to 40. Version 1 is 21*21 matrix. And 4 modules increases whenever 1 version increases. So version 40 is 177*177 matrix.
+ * @access protected
+ */
+ protected $version = 0;
+
+ /**
+ * @var Levels of error correction. See definitions for possible values.
+ * @access protected
+ */
+ protected $level = QR_ECLEVEL_L;
+
+ /**
+ * @var Encoding mode
+ * @access protected
+ */
+ protected $hint = QR_MODE_8B;
+
+ /**
+ * @var if true the input string will be converted to uppercase
+ * @access protected
+ */
+ protected $casesensitive = true;
+
+ /**
+ * @var structured QR code (not supported yet)
+ * @access protected
+ */
+ protected $structured = 0;
+
+ /**
+ * @var mask data
+ * @access protected
+ */
+ protected $data;
+
+ // FrameFiller
+
+ /**
+ * @var width
+ * @access protected
+ */
+ protected $width;
+
+ /**
+ * @var frame
+ * @access protected
+ */
+ protected $frame;
+
+ /**
+ * @var X position of bit
+ * @access protected
+ */
+ protected $x;
+
+ /**
+ * @var Y position of bit
+ * @access protected
+ */
+ protected $y;
+
+ /**
+ * @var direction
+ * @access protected
+ */
+ protected $dir;
+
+ /**
+ * @var single bit
+ * @access protected
+ */
+ protected $bit;
+
+ // ---- QRrawcode ----
+
+ /**
+ * @var data code
+ * @access protected
+ */
+ protected $datacode = array();
+
+ /**
+ * @var error correction code
+ * @access protected
+ */
+ protected $ecccode = array();
+
+ /**
+ * @var blocks
+ * @access protected
+ */
+ protected $blocks;
+
+ /**
+ * @var Reed-Solomon blocks
+ * @access protected
+ */
+ protected $rsblocks = array(); //of RSblock
+
+ /**
+ * @var counter
+ * @access protected
+ */
+ protected $count;
+
+ /**
+ * @var data length
+ * @access protected
+ */
+ protected $dataLength;
+
+ /**
+ * @var error correction length
+ * @access protected
+ */
+ protected $eccLength;
+
+ /**
+ * @var b1
+ * @access protected
+ */
+ protected $b1;
+
+ // ---- QRmask ----
+
+ /**
+ * @var run length
+ * @access protected
+ */
+ protected $runLength = array();
+
+ // ---- QRsplit ----
+
+ /**
+ * @var input data string
+ * @access protected
+ */
+ protected $dataStr = '';
+
+ /**
+ * @var input items
+ * @access protected
+ */
+ protected $items;
+
+ // Reed-Solomon items
+
+ /**
+ * @var Reed-Solomon items
+ * @access protected
+ */
+ protected $rsitems = array();
+
+ /**
+ * @var array of frames
+ * @access protected
+ */
+ protected $frames = array();
+
+ /**
+ * @var alphabet-numeric convesion table
+ * @access protected
+ */
+ protected $anTable = array(
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, //
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, //
+ 36, -1, -1, -1, 37, 38, -1, -1, -1, -1, 39, 40, -1, 41, 42, 43, //
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 44, -1, -1, -1, -1, -1, //
+ -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, //
+ 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, //
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, //
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 //
+ );
+
+ /**
+ * @var array Table of the capacity of symbols
+ * See Table 1 (pp.13) and Table 12-16 (pp.30-36), JIS X0510:2004.
+ * @access protected
+ */
+ protected $capacity = array(
+ array( 0, 0, 0, array( 0, 0, 0, 0)), //
+ array( 21, 26, 0, array( 7, 10, 13, 17)), // 1
+ array( 25, 44, 7, array( 10, 16, 22, 28)), //
+ array( 29, 70, 7, array( 15, 26, 36, 44)), //
+ array( 33, 100, 7, array( 20, 36, 52, 64)), //
+ array( 37, 134, 7, array( 26, 48, 72, 88)), // 5
+ array( 41, 172, 7, array( 36, 64, 96, 112)), //
+ array( 45, 196, 0, array( 40, 72, 108, 130)), //
+ array( 49, 242, 0, array( 48, 88, 132, 156)), //
+ array( 53, 292, 0, array( 60, 110, 160, 192)), //
+ array( 57, 346, 0, array( 72, 130, 192, 224)), // 10
+ array( 61, 404, 0, array( 80, 150, 224, 264)), //
+ array( 65, 466, 0, array( 96, 176, 260, 308)), //
+ array( 69, 532, 0, array( 104, 198, 288, 352)), //
+ array( 73, 581, 3, array( 120, 216, 320, 384)), //
+ array( 77, 655, 3, array( 132, 240, 360, 432)), // 15
+ array( 81, 733, 3, array( 144, 280, 408, 480)), //
+ array( 85, 815, 3, array( 168, 308, 448, 532)), //
+ array( 89, 901, 3, array( 180, 338, 504, 588)), //
+ array( 93, 991, 3, array( 196, 364, 546, 650)), //
+ array( 97, 1085, 3, array( 224, 416, 600, 700)), // 20
+ array(101, 1156, 4, array( 224, 442, 644, 750)), //
+ array(105, 1258, 4, array( 252, 476, 690, 816)), //
+ array(109, 1364, 4, array( 270, 504, 750, 900)), //
+ array(113, 1474, 4, array( 300, 560, 810, 960)), //
+ array(117, 1588, 4, array( 312, 588, 870, 1050)), // 25
+ array(121, 1706, 4, array( 336, 644, 952, 1110)), //
+ array(125, 1828, 4, array( 360, 700, 1020, 1200)), //
+ array(129, 1921, 3, array( 390, 728, 1050, 1260)), //
+ array(133, 2051, 3, array( 420, 784, 1140, 1350)), //
+ array(137, 2185, 3, array( 450, 812, 1200, 1440)), // 30
+ array(141, 2323, 3, array( 480, 868, 1290, 1530)), //
+ array(145, 2465, 3, array( 510, 924, 1350, 1620)), //
+ array(149, 2611, 3, array( 540, 980, 1440, 1710)), //
+ array(153, 2761, 3, array( 570, 1036, 1530, 1800)), //
+ array(157, 2876, 0, array( 570, 1064, 1590, 1890)), // 35
+ array(161, 3034, 0, array( 600, 1120, 1680, 1980)), //
+ array(165, 3196, 0, array( 630, 1204, 1770, 2100)), //
+ array(169, 3362, 0, array( 660, 1260, 1860, 2220)), //
+ array(173, 3532, 0, array( 720, 1316, 1950, 2310)), //
+ array(177, 3706, 0, array( 750, 1372, 2040, 2430)) // 40
+ );
+
+ /**
+ * @var array Length indicator
+ * @access protected
+ */
+ protected $lengthTableBits = array(
+ array(10, 12, 14),
+ array( 9, 11, 13),
+ array( 8, 16, 16),
+ array( 8, 10, 12)
+ );
+
+ /**
+ * @var array Table of the error correction code (Reed-Solomon block)
+ * See Table 12-16 (pp.30-36), JIS X0510:2004.
+ * @access protected
+ */
+ protected $eccTable = array(
+ array(array( 0, 0), array( 0, 0), array( 0, 0), array( 0, 0)), //
+ array(array( 1, 0), array( 1, 0), array( 1, 0), array( 1, 0)), // 1
+ array(array( 1, 0), array( 1, 0), array( 1, 0), array( 1, 0)), //
+ array(array( 1, 0), array( 1, 0), array( 2, 0), array( 2, 0)), //
+ array(array( 1, 0), array( 2, 0), array( 2, 0), array( 4, 0)), //
+ array(array( 1, 0), array( 2, 0), array( 2, 2), array( 2, 2)), // 5
+ array(array( 2, 0), array( 4, 0), array( 4, 0), array( 4, 0)), //
+ array(array( 2, 0), array( 4, 0), array( 2, 4), array( 4, 1)), //
+ array(array( 2, 0), array( 2, 2), array( 4, 2), array( 4, 2)), //
+ array(array( 2, 0), array( 3, 2), array( 4, 4), array( 4, 4)), //
+ array(array( 2, 2), array( 4, 1), array( 6, 2), array( 6, 2)), // 10
+ array(array( 4, 0), array( 1, 4), array( 4, 4), array( 3, 8)), //
+ array(array( 2, 2), array( 6, 2), array( 4, 6), array( 7, 4)), //
+ array(array( 4, 0), array( 8, 1), array( 8, 4), array(12, 4)), //
+ array(array( 3, 1), array( 4, 5), array(11, 5), array(11, 5)), //
+ array(array( 5, 1), array( 5, 5), array( 5, 7), array(11, 7)), // 15
+ array(array( 5, 1), array( 7, 3), array(15, 2), array( 3, 13)), //
+ array(array( 1, 5), array(10, 1), array( 1, 15), array( 2, 17)), //
+ array(array( 5, 1), array( 9, 4), array(17, 1), array( 2, 19)), //
+ array(array( 3, 4), array( 3, 11), array(17, 4), array( 9, 16)), //
+ array(array( 3, 5), array( 3, 13), array(15, 5), array(15, 10)), // 20
+ array(array( 4, 4), array(17, 0), array(17, 6), array(19, 6)), //
+ array(array( 2, 7), array(17, 0), array( 7, 16), array(34, 0)), //
+ array(array( 4, 5), array( 4, 14), array(11, 14), array(16, 14)), //
+ array(array( 6, 4), array( 6, 14), array(11, 16), array(30, 2)), //
+ array(array( 8, 4), array( 8, 13), array( 7, 22), array(22, 13)), // 25
+ array(array(10, 2), array(19, 4), array(28, 6), array(33, 4)), //
+ array(array( 8, 4), array(22, 3), array( 8, 26), array(12, 28)), //
+ array(array( 3, 10), array( 3, 23), array( 4, 31), array(11, 31)), //
+ array(array( 7, 7), array(21, 7), array( 1, 37), array(19, 26)), //
+ array(array( 5, 10), array(19, 10), array(15, 25), array(23, 25)), // 30
+ array(array(13, 3), array( 2, 29), array(42, 1), array(23, 28)), //
+ array(array(17, 0), array(10, 23), array(10, 35), array(19, 35)), //
+ array(array(17, 1), array(14, 21), array(29, 19), array(11, 46)), //
+ array(array(13, 6), array(14, 23), array(44, 7), array(59, 1)), //
+ array(array(12, 7), array(12, 26), array(39, 14), array(22, 41)), // 35
+ array(array( 6, 14), array( 6, 34), array(46, 10), array( 2, 64)), //
+ array(array(17, 4), array(29, 14), array(49, 10), array(24, 46)), //
+ array(array( 4, 18), array(13, 32), array(48, 14), array(42, 32)), //
+ array(array(20, 4), array(40, 7), array(43, 22), array(10, 67)), //
+ array(array(19, 6), array(18, 31), array(34, 34), array(20, 61)) // 40
+ );
+
+ /**
+ * @var array Positions of alignment patterns.
+ * This array includes only the second and the third position of the alignment patterns. Rest of them can be calculated from the distance between them.
+ * See Table 1 in Appendix E (pp.71) of JIS X0510:2004.
+ * @access protected
+ */
+ protected $alignmentPattern = array(
+ array( 0, 0),
+ array( 0, 0), array(18, 0), array(22, 0), array(26, 0), array(30, 0), // 1- 5
+ array(34, 0), array(22, 38), array(24, 42), array(26, 46), array(28, 50), // 6-10
+ array(30, 54), array(32, 58), array(34, 62), array(26, 46), array(26, 48), // 11-15
+ array(26, 50), array(30, 54), array(30, 56), array(30, 58), array(34, 62), // 16-20
+ array(28, 50), array(26, 50), array(30, 54), array(28, 54), array(32, 58), // 21-25
+ array(30, 58), array(34, 62), array(26, 50), array(30, 54), array(26, 52), // 26-30
+ array(30, 56), array(34, 60), array(30, 58), array(34, 62), array(30, 54), // 31-35
+ array(24, 50), array(28, 54), array(32, 58), array(26, 54), array(30, 58) // 35-40
+ );
+
+ /**
+ * @var array Version information pattern (BCH coded).
+ * See Table 1 in Appendix D (pp.68) of JIS X0510:2004.
+ * size: [QRSPEC_VERSION_MAX - 6]
+ * @access protected
+ */
+ protected $versionPattern = array(
+ 0x07c94, 0x085bc, 0x09a99, 0x0a4d3, 0x0bbf6, 0x0c762, 0x0d847, 0x0e60d, //
+ 0x0f928, 0x10b78, 0x1145d, 0x12a17, 0x13532, 0x149a6, 0x15683, 0x168c9, //
+ 0x177ec, 0x18ec4, 0x191e1, 0x1afab, 0x1b08e, 0x1cc1a, 0x1d33f, 0x1ed75, //
+ 0x1f250, 0x209d5, 0x216f0, 0x228ba, 0x2379f, 0x24b0b, 0x2542e, 0x26a64, //
+ 0x27541, 0x28c69
+ );
+
+ /**
+ * @var array Format information
+ * @access protected
+ */
+ protected $formatInfo = array(
+ array(0x77c4, 0x72f3, 0x7daa, 0x789d, 0x662f, 0x6318, 0x6c41, 0x6976), //
+ array(0x5412, 0x5125, 0x5e7c, 0x5b4b, 0x45f9, 0x40ce, 0x4f97, 0x4aa0), //
+ array(0x355f, 0x3068, 0x3f31, 0x3a06, 0x24b4, 0x2183, 0x2eda, 0x2bed), //
+ array(0x1689, 0x13be, 0x1ce7, 0x19d0, 0x0762, 0x0255, 0x0d0c, 0x083b) //
+ );
+
+
+ // -------------------------------------------------
+ // -------------------------------------------------
+
+
+ /**
+ * This is the class constructor.
+ * Creates a QRcode object
+ * @param string $code code to represent using QRcode
+ * @param string $eclevel error level: <ul><li>L : About 7% or less errors can be corrected.</li><li>M : About 15% or less errors can be corrected.</li><li>Q : About 25% or less errors can be corrected.</li><li>H : About 30% or less errors can be corrected.</li></ul>
+ * @access public
+ * @since 1.0.000
+ */
+ public function __construct($code, $eclevel = 'L') {
+ $barcode_array = array();
+ if ((is_null($code)) OR ($code == '\0') OR ($code == '')) {
+ return false;
+ }
+ // set error correction level
+ $this->level = array_search($eclevel, array('L', 'M', 'Q', 'H'));
+ if ($this->level === false) {
+ $this->level = QR_ECLEVEL_L;
+ }
+ if (($this->hint != QR_MODE_8B) AND ($this->hint != QR_MODE_KJ)) {
+ return false;
+ }
+ if (($this->version < 0) OR ($this->version > QRSPEC_VERSION_MAX)) {
+ return false;
+ }
+ $this->items = array();
+ $this->encodeString($code);
+ $qrTab = $this->binarize($this->data);
+ $size = count($qrTab);
+ $barcode_array['num_rows'] = $size;
+ $barcode_array['num_cols'] = $size;
+ $barcode_array['bcode'] = array();
+ foreach ($qrTab as $line) {
+ $arrAdd = array();
+ foreach (str_split($line) as $char) {
+ $arrAdd[] = ($char=='1')?1:0;
+ }
+ $barcode_array['bcode'][] = $arrAdd;
+ }
+ $this->barcode_array = $barcode_array;
+ }
+
+ /**
+ * Returns a barcode array which is readable by TCPDF
+ * @return array barcode array readable by TCPDF;
+ * @access public
+ */
+ public function getBarcodeArray() {
+ return $this->barcode_array;
+ }
+
+ /**
+ * Convert the frame in binary form
+ * @param array $frame array to binarize
+ * @return array frame in binary form
+ */
+ protected function binarize($frame) {
+ $len = count($frame);
+ // the frame is square (width = height)
+ foreach ($frame as &$frameLine) {
+ for ($i=0; $i<$len; $i++) {
+ $frameLine[$i] = (ord($frameLine[$i])&1)?'1':'0';
+ }
+ }
+ return $frame;
+ }
+
+ /**
+ * Encode the input string to QR code
+ * @param string $string input string to encode
+ */
+ protected function encodeString($string) {
+ $this->dataStr = $string;
+ if (!$this->casesensitive) {
+ $this->toUpper();
+ }
+ $ret = $this->splitString();
+ if ($ret < 0) {
+ return NULL;
+ }
+ $this->encodeMask(-1);
+ }
+
+ /**
+ * Encode mask
+ * @param int $mask masking mode
+ */
+ protected function encodeMask($mask) {
+ $spec = array(0, 0, 0, 0, 0);
+ $this->datacode = $this->getByteStream($this->items);
+ if (is_null($this->datacode)) {
+ return NULL;
+ }
+ $spec = $this->getEccSpec($this->version, $this->level, $spec);
+ $this->b1 = $this->rsBlockNum1($spec);
+ $this->dataLength = $this->rsDataLength($spec);
+ $this->eccLength = $this->rsEccLength($spec);
+ $this->ecccode = array_fill(0, $this->eccLength, 0);
+ $this->blocks = $this->rsBlockNum($spec);
+ $ret = $this->init($spec);
+ if ($ret < 0) {
+ return NULL;
+ }
+ $this->count = 0;
+ $this->width = $this->getWidth($this->version);
+ $this->frame = $this->newFrame($this->version);
+ $this->x = $this->width - 1;
+ $this->y = $this->width - 1;
+ $this->dir = -1;
+ $this->bit = -1;
+ // inteleaved data and ecc codes
+ for ($i=0; $i < ($this->dataLength + $this->eccLength); $i++) {
+ $code = $this->getCode();
+ $bit = 0x80;
+ for ($j=0; $j<8; $j++) {
+ $addr = $this->getNextPosition();
+ $this->setFrameAt($addr, 0x02 | (($bit & $code) != 0));
+ $bit = $bit >> 1;
+ }
+ }
+ // remainder bits
+ $j = $this->getRemainder($this->version);
+ for ($i=0; $i<$j; $i++) {
+ $addr = $this->getNextPosition();
+ $this->setFrameAt($addr, 0x02);
+ }
+ // masking
+ $this->runLength = array_fill(0, QRSPEC_WIDTH_MAX + 1, 0);
+ if ($mask < 0) {
+ if (QR_FIND_BEST_MASK) {
+ $masked = $this->mask($this->width, $this->frame, $this->level);
+ } else {
+ $masked = $this->makeMask($this->width, $this->frame, (intval(QR_DEFAULT_MASK) % 8), $this->level);
+ }
+ } else {
+ $masked = $this->makeMask($this->width, $this->frame, $mask, $this->level);
+ }
+ if ($masked == NULL) {
+ return NULL;
+ }
+ $this->data = $masked;
+ }
+
+ // - - - - - - - - - - - - - - - - - - - - - - - - -
+
+ // FrameFiller
+
+ /**
+ * Set frame value at specified position
+ * @param array $at x,y position
+ * @param int $val value of the character to set
+ */
+ protected function setFrameAt($at, $val) {
+ $this->frame[$at['y']][$at['x']] = chr($val);
+ }
+
+ /**
+ * Get frame value at specified position
+ * @param array $at x,y position
+ * @return value at specified position
+ */
+ protected function getFrameAt($at) {
+ return ord($this->frame[$at['y']][$at['x']]);
+ }
+
+ /**
+ * Return the next frame position
+ * @return array of x,y coordinates
+ */
+ protected function getNextPosition() {
+ do {
+ if ($this->bit == -1) {
+ $this->bit = 0;
+ return array('x'=>$this->x, 'y'=>$this->y);
+ }
+ $x = $this->x;
+ $y = $this->y;
+ $w = $this->width;
+ if ($this->bit == 0) {
+ $x--;
+ $this->bit++;
+ } else {
+ $x++;
+ $y += $this->dir;
+ $this->bit--;
+ }
+ if ($this->dir < 0) {
+ if ($y < 0) {
+ $y = 0;
+ $x -= 2;
+ $this->dir = 1;
+ if ($x == 6) {
+ $x--;
+ $y = 9;
+ }
+ }
+ } else {
+ if ($y == $w) {
+ $y = $w - 1;
+ $x -= 2;
+ $this->dir = -1;
+ if ($x == 6) {
+ $x--;
+ $y -= 8;
+ }
+ }
+ }
+ if (($x < 0) OR ($y < 0)) {
+ return NULL;
+ }
+ $this->x = $x;
+ $this->y = $y;
+ } while(ord($this->frame[$y][$x]) & 0x80);
+ return array('x'=>$x, 'y'=>$y);
+ }
+
+ // - - - - - - - - - - - - - - - - - - - - - - - - -
+
+ // QRrawcode
+
+ /**
+ * Initialize code.
+ * @param array $spec array of ECC specification
+ * @return 0 in case of success, -1 in case of error
+ */
+ protected function init($spec) {
+ $dl = $this->rsDataCodes1($spec);
+ $el = $this->rsEccCodes1($spec);
+ $rs = $this->init_rs(8, 0x11d, 0, 1, $el, 255 - $dl - $el);
+ $blockNo = 0;
+ $dataPos = 0;
+ $eccPos = 0;
+ $endfor = $this->rsBlockNum1($spec);
+ for ($i=0; $i < $endfor; ++$i) {
+ $ecc = array_slice($this->ecccode, $eccPos);
+ $this->rsblocks[$blockNo] = array();
+ $this->rsblocks[$blockNo]['dataLength'] = $dl;
+ $this->rsblocks[$blockNo]['data'] = array_slice($this->datacode, $dataPos);
+ $this->rsblocks[$blockNo]['eccLength'] = $el;
+ $ecc = $this->encode_rs_char($rs, $this->rsblocks[$blockNo]['data'], $ecc);
+ $this->rsblocks[$blockNo]['ecc'] = $ecc;
+ $this->ecccode = array_merge(array_slice($this->ecccode,0, $eccPos), $ecc);
+ $dataPos += $dl;
+ $eccPos += $el;
+ $blockNo++;
+ }
+ if ($this->rsBlockNum2($spec) == 0) {
+ return 0;
+ }
+ $dl = $this->rsDataCodes2($spec);
+ $el = $this->rsEccCodes2($spec);
+ $rs = $this->init_rs(8, 0x11d, 0, 1, $el, 255 - $dl - $el);
+ if ($rs == NULL) {
+ return -1;
+ }
+ $endfor = $this->rsBlockNum2($spec);
+ for ($i=0; $i < $endfor; ++$i) {
+ $ecc = array_slice($this->ecccode, $eccPos);
+ $this->rsblocks[$blockNo] = array();
+ $this->rsblocks[$blockNo]['dataLength'] = $dl;
+ $this->rsblocks[$blockNo]['data'] = array_slice($this->datacode, $dataPos);
+ $this->rsblocks[$blockNo]['eccLength'] = $el;
+ $ecc = $this->encode_rs_char($rs, $this->rsblocks[$blockNo]['data'], $ecc);
+ $this->rsblocks[$blockNo]['ecc'] = $ecc;
+ $this->ecccode = array_merge(array_slice($this->ecccode, 0, $eccPos), $ecc);
+ $dataPos += $dl;
+ $eccPos += $el;
+ $blockNo++;
+ }
+ return 0;
+ }
+
+ /**
+ * Return Reed-Solomon block code.
+ * @return array rsblocks
+ */
+ protected function getCode() {
+ if ($this->count < $this->dataLength) {
+ $row = $this->count % $this->blocks;
+ $col = $this->count / $this->blocks;
+ if ($col >= $this->rsblocks[0]['dataLength']) {
+ $row += $this->b1;
+ }
+ $ret = $this->rsblocks[$row]['data'][$col];
+ } elseif ($this->count < $this->dataLength + $this->eccLength) {
+ $row = ($this->count - $this->dataLength) % $this->blocks;
+ $col = ($this->count - $this->dataLength) / $this->blocks;
+ $ret = $this->rsblocks[$row]['ecc'][$col];
+ } else {
+ return 0;
+ }
+ $this->count++;
+ return $ret;
+ }
+
+ // - - - - - - - - - - - - - - - - - - - - - - - - -
+
+ // QRmask
+
+ /**
+ * Write Format Information on frame and returns the number of black bits
+ * @param int $width frame width
+ * @param array $frame frame
+ * @param array $mask masking mode
+ * @param int $level error correction level
+ * @return int blacks
+ */
+ protected function writeFormatInformation($width, &$frame, $mask, $level) {
+ $blacks = 0;
+ $format = $this->getFormatInfo($mask, $level);
+ for ($i=0; $i<8; ++$i) {
+ if ($format & 1) {
+ $blacks += 2;
+ $v = 0x85;
+ } else {
+ $v = 0x84;
+ }
+ $frame[8][$width - 1 - $i] = chr($v);
+ if ($i < 6) {
+ $frame[$i][8] = chr($v);
+ } else {
+ $frame[$i + 1][8] = chr($v);
+ }
+ $format = $format >> 1;
+ }
+ for ($i=0; $i<7; ++$i) {
+ if ($format & 1) {
+ $blacks += 2;
+ $v = 0x85;
+ } else {
+ $v = 0x84;
+ }
+ $frame[$width - 7 + $i][8] = chr($v);
+ if ($i == 0) {
+ $frame[8][7] = chr($v);
+ } else {
+ $frame[8][6 - $i] = chr($v);
+ }
+ $format = $format >> 1;
+ }
+ return $blacks;
+ }
+
+ /**
+ * mask0
+ * @param int $x X position
+ * @param int $y Y position
+ * @return int mask
+ */
+ protected function mask0($x, $y) {
+ return ($x + $y) & 1;
+ }
+
+ /**
+ * mask1
+ * @param int $x X position
+ * @param int $y Y position
+ * @return int mask
+ */
+ protected function mask1($x, $y) {
+ return ($y & 1);
+ }
+
+ /**
+ * mask2
+ * @param int $x X position
+ * @param int $y Y position
+ * @return int mask
+ */
+ protected function mask2($x, $y) {
+ return ($x % 3);
+ }
+
+ /**
+ * mask3
+ * @param int $x X position
+ * @param int $y Y position
+ * @return int mask
+ */
+ protected function mask3($x, $y) {
+ return ($x + $y) % 3;
+ }
+
+ /**
+ * mask4
+ * @param int $x X position
+ * @param int $y Y position
+ * @return int mask
+ */
+ protected function mask4($x, $y) {
+ return (((int)($y / 2)) + ((int)($x / 3))) & 1;
+ }
+
+ /**
+ * mask5
+ * @param int $x X position
+ * @param int $y Y position
+ * @return int mask
+ */
+ protected function mask5($x, $y) {
+ return (($x * $y) & 1) + ($x * $y) % 3;
+ }
+
+ /**
+ * mask6
+ * @param int $x X position
+ * @param int $y Y position
+ * @return int mask
+ */
+ protected function mask6($x, $y) {
+ return ((($x * $y) & 1) + ($x * $y) % 3) & 1;
+ }
+
+ /**
+ * mask7
+ * @param int $x X position
+ * @param int $y Y position
+ * @return int mask
+ */
+ protected function mask7($x, $y) {
+ return ((($x * $y) % 3) + (($x + $y) & 1)) & 1;
+ }
+
+ /**
+ * Return bitmask
+ * @param int $maskNo mask number
+ * @param int $width width
+ * @param array $frame frame
+ * @return array bitmask
+ */
+ protected function generateMaskNo($maskNo, $width, $frame) {
+ $bitMask = array_fill(0, $width, array_fill(0, $width, 0));
+ for ($y=0; $y<$width; ++$y) {
+ for ($x=0; $x<$width; ++$x) {
+ if (ord($frame[$y][$x]) & 0x80) {
+ $bitMask[$y][$x] = 0;
+ } else {
+ $maskFunc = call_user_func(array($this, 'mask'.$maskNo), $x, $y);
+ $bitMask[$y][$x] = ($maskFunc == 0)?1:0;
+ }
+ }
+ }
+ return $bitMask;
+ }
+
+ /**
+ * makeMaskNo
+ * @param int $maskNo
+ * @param int $width
+ * @param int $s
+ * @param int $d
+ * @param boolean $maskGenOnly
+ * @return int b
+ */
+ protected function makeMaskNo($maskNo, $width, $s, &$d, $maskGenOnly=false) {
+ $b = 0;
+ $bitMask = array();
+ $bitMask = $this->generateMaskNo($maskNo, $width, $s, $d);
+ if ($maskGenOnly) {
+ return;
+ }
+ $d = $s;
+ for ($y=0; $y<$width; ++$y) {
+ for ($x=0; $x<$width; ++$x) {
+ if ($bitMask[$y][$x] == 1) {
+ $d[$y][$x] = chr(ord($s[$y][$x]) ^ (int)$bitMask[$y][$x]);
+ }
+ $b += (int)(ord($d[$y][$x]) & 1);
+ }
+ }
+ return $b;
+ }
+
+ /**
+ * makeMask
+ * @param int $width
+ * @param array $frame
+ * @param int $maskNo
+ * @param int $level
+ * @return array mask
+ */
+ protected function makeMask($width, $frame, $maskNo, $level) {
+ $masked = array_fill(0, $width, str_repeat("\0", $width));
+ $this->makeMaskNo($maskNo, $width, $frame, $masked);
+ $this->writeFormatInformation($width, $masked, $maskNo, $level);
+ return $masked;
+ }
+
+ /**
+ * calcN1N3
+ * @param int $length
+ * @return int demerit
+ */
+ protected function calcN1N3($length) {
+ $demerit = 0;
+ for ($i=0; $i<$length; ++$i) {
+ if ($this->runLength[$i] >= 5) {
+ $demerit += (N1 + ($this->runLength[$i] - 5));
+ }
+ if ($i & 1) {
+ if (($i >= 3) AND ($i < ($length-2)) AND ($this->runLength[$i] % 3 == 0)) {
+ $fact = (int)($this->runLength[$i] / 3);
+ if (($this->runLength[$i-2] == $fact)
+ AND ($this->runLength[$i-1] == $fact)
+ AND ($this->runLength[$i+1] == $fact)
+ AND ($this->runLength[$i+2] == $fact)) {
+ if (($this->runLength[$i-3] < 0) OR ($this->runLength[$i-3] >= (4 * $fact))) {
+ $demerit += N3;
+ } elseif ((($i+3) >= $length) OR ($this->runLength[$i+3] >= (4 * $fact))) {
+ $demerit += N3;
+ }
+ }
+ }
+ }
+ }
+ return $demerit;
+ }
+
+ /**
+ * evaluateSymbol
+ * @param int $width
+ * @param array $frame
+ * @return int demerit
+ */
+ protected function evaluateSymbol($width, $frame) {
+ $head = 0;
+ $demerit = 0;
+ for ($y=0; $y<$width; ++$y) {
+ $head = 0;
+ $this->runLength[0] = 1;
+ $frameY = $frame[$y];
+ if ($y > 0) {
+ $frameYM = $frame[$y-1];
+ }
+ for ($x=0; $x<$width; ++$x) {
+ if (($x > 0) AND ($y > 0)) {
+ $b22 = ord($frameY[$x]) & ord($frameY[$x-1]) & ord($frameYM[$x]) & ord($frameYM[$x-1]);
+ $w22 = ord($frameY[$x]) | ord($frameY[$x-1]) | ord($frameYM[$x]) | ord($frameYM[$x-1]);
+ if (($b22 | ($w22 ^ 1)) & 1) {
+ $demerit += N2;
+ }
+ }
+ if (($x == 0) AND (ord($frameY[$x]) & 1)) {
+ $this->runLength[0] = -1;
+ $head = 1;
+ $this->runLength[$head] = 1;
+ } elseif ($x > 0) {
+ if ((ord($frameY[$x]) ^ ord($frameY[$x-1])) & 1) {
+ $head++;
+ $this->runLength[$head] = 1;
+ } else {
+ $this->runLength[$head]++;
+ }
+ }
+ }
+ $demerit += $this->calcN1N3($head+1);
+ }
+ for ($x=0; $x<$width; ++$x) {
+ $head = 0;
+ $this->runLength[0] = 1;
+ for ($y=0; $y<$width; ++$y) {
+ if (($y == 0) AND (ord($frame[$y][$x]) & 1)) {
+ $this->runLength[0] = -1;
+ $head = 1;
+ $this->runLength[$head] = 1;
+ } elseif ($y > 0) {
+ if ((ord($frame[$y][$x]) ^ ord($frame[$y-1][$x])) & 1) {
+ $head++;
+ $this->runLength[$head] = 1;
+ } else {
+ $this->runLength[$head]++;
+ }
+ }
+ }
+ $demerit += $this->calcN1N3($head+1);
+ }
+ return $demerit;
+ }
+
+ /**
+ * mask
+ * @param int $width
+ * @param array $frame
+ * @param int $level
+ * @return array best mask
+ */
+ protected function mask($width, $frame, $level) {
+ $minDemerit = PHP_INT_MAX;
+ $bestMaskNum = 0;
+ $bestMask = array();
+ $checked_masks = array(0, 1, 2, 3, 4, 5, 6, 7);
+ if (QR_FIND_FROM_RANDOM !== false) {
+ $howManuOut = 8 - (QR_FIND_FROM_RANDOM % 9);
+ for ($i = 0; $i < $howManuOut; ++$i) {
+ $remPos = rand (0, count($checked_masks)-1);
+ unset($checked_masks[$remPos]);
+ $checked_masks = array_values($checked_masks);
+ }
+ }
+ $bestMask = $frame;
+ foreach ($checked_masks as $i) {
+ $mask = array_fill(0, $width, str_repeat("\0", $width));
+ $demerit = 0;
+ $blacks = 0;
+ $blacks = $this->makeMaskNo($i, $width, $frame, $mask);
+ $blacks += $this->writeFormatInformation($width, $mask, $i, $level);
+ $blacks = (int)(100 * $blacks / ($width * $width));
+ $demerit = (int)((int)(abs($blacks - 50) / 5) * N4);
+ $demerit += $this->evaluateSymbol($width, $mask);
+ if ($demerit < $minDemerit) {
+ $minDemerit = $demerit;
+ $bestMask = $mask;
+ $bestMaskNum = $i;
+ }
+ }
+ return $bestMask;
+ }
+
+ // - - - - - - - - - - - - - - - - - - - - - - - - -
+
+ // QRsplit
+
+ /**
+ * Return true if the character at specified position is a number
+ * @param string $str string
+ * @param int $pos characted position
+ * @return boolean true of false
+ */
+ protected function isdigitat($str, $pos) {
+ if ($pos >= strlen($str)) {
+ return false;
+ }
+ return ((ord($str[$pos]) >= ord('0'))&&(ord($str[$pos]) <= ord('9')));
+ }
+
+ /**
+ * Return true if the character at specified position is an alphanumeric character
+ * @param string $str string
+ * @param int $pos characted position
+ * @return boolean true of false
+ */
+ protected function isalnumat($str, $pos) {
+ if ($pos >= strlen($str)) {
+ return false;
+ }
+ return ($this->lookAnTable(ord($str[$pos])) >= 0);
+ }
+
+ /**
+ * identifyMode
+ * @param int $pos
+ * @return int mode
+ */
+ protected function identifyMode($pos) {
+ if ($pos >= strlen($this->dataStr)) {
+ return QR_MODE_NL;
+ }
+ $c = $this->dataStr[$pos];
+ if ($this->isdigitat($this->dataStr, $pos)) {
+ return QR_MODE_NM;
+ } elseif ($this->isalnumat($this->dataStr, $pos)) {
+ return QR_MODE_AN;
+ } elseif ($this->hint == QR_MODE_KJ) {
+ if ($pos+1 < strlen($this->dataStr)) {
+ $d = $this->dataStr[$pos+1];
+ $word = (ord($c) << 8) | ord($d);
+ if (($word >= 0x8140 && $word <= 0x9ffc) OR ($word >= 0xe040 && $word <= 0xebbf)) {
+ return QR_MODE_KJ;
+ }
+ }
+ }
+ return QR_MODE_8B;
+ }
+
+ /**
+ * eatNum
+ * @return int run
+ */
+ protected function eatNum() {
+ $ln = $this->lengthIndicator(QR_MODE_NM, $this->version);
+ $p = 0;
+ while($this->isdigitat($this->dataStr, $p)) {
+ $p++;
+ }
+ $run = $p;
+ $mode = $this->identifyMode($p);
+ if ($mode == QR_MODE_8B) {
+ $dif = $this->estimateBitsModeNum($run) + 4 + $ln
+ + $this->estimateBitsMode8(1) // + 4 + l8
+ - $this->estimateBitsMode8($run + 1); // - 4 - l8
+ if ($dif > 0) {
+ return $this->eat8();
+ }
+ }
+ if ($mode == QR_MODE_AN) {
+ $dif = $this->estimateBitsModeNum($run) + 4 + $ln
+ + $this->estimateBitsModeAn(1) // + 4 + la
+ - $this->estimateBitsModeAn($run + 1);// - 4 - la
+ if ($dif > 0) {
+ return $this->eatAn();
+ }
+ }
+ $this->items = $this->appendNewInputItem($this->items, QR_MODE_NM, $run, str_split($this->dataStr));
+ return $run;
+ }
+
+ /**
+ * eatAn
+ * @return int run
+ */
+ protected function eatAn() {
+ $la = $this->lengthIndicator(QR_MODE_AN, $this->version);
+ $ln = $this->lengthIndicator(QR_MODE_NM, $this->version);
+ $p = 0;
+ while($this->isalnumat($this->dataStr, $p)) {
+ if ($this->isdigitat($this->dataStr, $p)) {
+ $q = $p;
+ while($this->isdigitat($this->dataStr, $q)) {
+ $q++;
+ }
+ $dif = $this->estimateBitsModeAn($p) // + 4 + la
+ + $this->estimateBitsModeNum($q - $p) + 4 + $ln
+ - $this->estimateBitsModeAn($q); // - 4 - la
+ if ($dif < 0) {
+ break;
+ } else {
+ $p = $q;
+ }
+ } else {
+ $p++;
+ }
+ }
+ $run = $p;
+ if (!$this->isalnumat($this->dataStr, $p)) {
+ $dif = $this->estimateBitsModeAn($run) + 4 + $la
+ + $this->estimateBitsMode8(1) // + 4 + l8
+ - $this->estimateBitsMode8($run + 1); // - 4 - l8
+ if ($dif > 0) {
+ return $this->eat8();
+ }
+ }
+ $this->items = $this->appendNewInputItem($this->items, QR_MODE_AN, $run, str_split($this->dataStr));
+ return $run;
+ }
+
+ /**
+ * eatKanji
+ * @return int run
+ */
+ protected function eatKanji() {
+ $p = 0;
+ while($this->identifyMode($p) == QR_MODE_KJ) {
+ $p += 2;
+ }
+ $this->items = $this->appendNewInputItem($this->items, QR_MODE_KJ, $p, str_split($this->dataStr));
+ return $run;
+ }
+
+ /**
+ * eat8
+ * @return int run
+ */
+ protected function eat8() {
+ $la = $this->lengthIndicator(QR_MODE_AN, $this->version);
+ $ln = $this->lengthIndicator(QR_MODE_NM, $this->version);
+ $p = 1;
+ $dataStrLen = strlen($this->dataStr);
+ while($p < $dataStrLen) {
+ $mode = $this->identifyMode($p);
+ if ($mode == QR_MODE_KJ) {
+ break;
+ }
+ if ($mode == QR_MODE_NM) {
+ $q = $p;
+ while($this->isdigitat($this->dataStr, $q)) {
+ $q++;
+ }
+ $dif = $this->estimateBitsMode8($p) // + 4 + l8
+ + $this->estimateBitsModeNum($q - $p) + 4 + $ln
+ - $this->estimateBitsMode8($q); // - 4 - l8
+ if ($dif < 0) {
+ break;
+ } else {
+ $p = $q;
+ }
+ } elseif ($mode == QR_MODE_AN) {
+ $q = $p;
+ while($this->isalnumat($this->dataStr, $q)) {
+ $q++;
+ }
+ $dif = $this->estimateBitsMode8($p) // + 4 + l8
+ + $this->estimateBitsModeAn($q - $p) + 4 + $la
+ - $this->estimateBitsMode8($q); // - 4 - l8
+ if ($dif < 0) {
+ break;
+ } else {
+ $p = $q;
+ }
+ } else {
+ $p++;
+ }
+ }
+ $run = $p;
+ $this->items = $this->appendNewInputItem($this->items, QR_MODE_8B, $run, str_split($this->dataStr));
+ return $run;
+ }
+
+ /**
+ * splitString
+ */
+ protected function splitString() {
+ while (strlen($this->dataStr) > 0) {
+ if ($this->dataStr == '') {
+ return 0;
+ }
+ $mode = $this->identifyMode(0);
+ switch ($mode) {
+ case QR_MODE_NM: {
+ $length = $this->eatNum();
+ break;
+ }
+ case QR_MODE_AN: {
+ $length = $this->eatAn();
+ break;
+ }
+ case QR_MODE_KJ: {
+ if ($hint == QR_MODE_KJ) {
+ $length = $this->eatKanji();
+ } else {
+ $length = $this->eat8();
+ }
+ break;
+ }
+ default: {
+ $length = $this->eat8();
+ break;
+ }
+ }
+ if ($length == 0) {
+ return 0;
+ }
+ if ($length < 0) {
+ return -1;
+ }
+ $this->dataStr = substr($this->dataStr, $length);
+ }
+ }
+
+ /**
+ * toUpper
+ */
+ protected function toUpper() {
+ $stringLen = strlen($this->dataStr);
+ $p = 0;
+ while ($p < $stringLen) {
+ $mode = $this->identifyMode(substr($this->dataStr, $p), $this->hint);
+ if ($mode == QR_MODE_KJ) {
+ $p += 2;
+ } else {
+ if ((ord($this->dataStr[$p]) >= ord('a')) AND (ord($this->dataStr[$p]) <= ord('z'))) {
+ $this->dataStr[$p] = chr(ord($this->dataStr[$p]) - 32);
+ }
+ $p++;
+ }
+ }
+ return $this->dataStr;
+ }
+
+ // - - - - - - - - - - - - - - - - - - - - - - - - -
+
+ // QRinputItem
+
+ /**
+ * newInputItem
+ * @param int $mode
+ * @param int $size
+ * @param array $data
+ * @param array $bstream
+ * @return array input item
+ */
+ protected function newInputItem($mode, $size, $data, $bstream=null) {
+ $setData = array_slice($data, 0, $size);
+ if (count($setData) < $size) {
+ $setData = array_merge($setData, array_fill(0, ($size - count($setData)), 0));
+ }
+ if (!$this->check($mode, $size, $setData)) {
+ return NULL;
+ }
+ $inputitem = array();
+ $inputitem['mode'] = $mode;
+ $inputitem['size'] = $size;
+ $inputitem['data'] = $setData;
+ $inputitem['bstream'] = $bstream;
+ return $inputitem;
+ }
+
+ /**
+ * encodeModeNum
+ * @param array $inputitem
+ * @param int $version
+ * @return array input item
+ */
+ protected function encodeModeNum($inputitem, $version) {
+ $words = (int)($inputitem['size'] / 3);
+ $inputitem['bstream'] = array();
+ $val = 0x1;
+ $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, $val);
+ $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], $this->lengthIndicator(QR_MODE_NM, $version), $inputitem['size']);
+ for ($i=0; $i < $words; ++$i) {
+ $val = (ord($inputitem['data'][$i*3 ]) - ord('0')) * 100;
+ $val += (ord($inputitem['data'][$i*3+1]) - ord('0')) * 10;
+ $val += (ord($inputitem['data'][$i*3+2]) - ord('0'));
+ $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 10, $val);
+ }
+ if ($inputitem['size'] - $words * 3 == 1) {
+ $val = ord($inputitem['data'][$words*3]) - ord('0');
+ $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, $val);
+ } elseif (($inputitem['size'] - ($words * 3)) == 2) {
+ $val = (ord($inputitem['data'][$words*3 ]) - ord('0')) * 10;
+ $val += (ord($inputitem['data'][$words*3+1]) - ord('0'));
+ $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 7, $val);
+ }
+ return $inputitem;
+ }
+
+ /**
+ * encodeModeAn
+ * @param array $inputitem
+ * @param int $version
+ * @return array input item
+ */
+ protected function encodeModeAn($inputitem, $version) {
+ $words = (int)($inputitem['size'] / 2);
+ $inputitem['bstream'] = array();
+ $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, 0x02);
+ $inputitem['bstream'] = $this->appendNum(v, $this->lengthIndicator(QR_MODE_AN, $version), $inputitem['size']);
+ for ($i=0; $i < $words; ++$i) {
+ $val = (int)$this->lookAnTable(ord($inputitem['data'][$i*2 ])) * 45;
+ $val += (int)$this->lookAnTable(ord($inputitem['data'][$i*2+1]));
+ $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 11, $val);
+ }
+ if ($inputitem['size'] & 1) {
+ $val = $this->lookAnTable(ord($inputitem['data'][($words * 2)]));
+ $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 6, $val);
+ }
+ return $inputitem;
+ }
+
+ /**
+ * encodeMode8
+ * @param array $inputitem
+ * @param int $version
+ * @return array input item
+ */
+ protected function encodeMode8($inputitem, $version) {
+ $inputitem['bstream'] = array();
+ $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, 0x4);
+ $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], $this->lengthIndicator(QR_MODE_8B, $version), $inputitem['size']);
+ for ($i=0; $i < $inputitem['size']; ++$i) {
+ $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 8, ord($inputitem['data'][$i]));
+ }
+ return $inputitem;
+ }
+
+ /**
+ * encodeModeKanji
+ * @param array $inputitem
+ * @param int $version
+ * @return array input item
+ */
+ protected function encodeModeKanji($inputitem, $version) {
+ $inputitem['bstream'] = array();
+ $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, 0x8);
+ $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], $this->lengthIndicator(QR_MODE_KJ, $version), (int)($inputitem['size'] / 2));
+ for ($i=0; $i<$inputitem['size']; $i+=2) {
+ $val = (ord($inputitem['data'][$i]) << 8) | ord($inputitem['data'][$i+1]);
+ if ($val <= 0x9ffc) {
+ $val -= 0x8140;
+ } else {
+ $val -= 0xc140;
+ }
+ $h = ($val >> 8) * 0xc0;
+ $val = ($val & 0xff) + $h;
+ $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 13, $val);
+ }
+ return $inputitem;
+ }
+
+ /**
+ * encodeModeStructure
+ * @param array $inputitem
+ * @return array input item
+ */
+ protected function encodeModeStructure($inputitem) {
+ $inputitem['bstream'] = array();
+ $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, 0x03);
+ $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, ord($inputitem['data'][1]) - 1);
+ $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, ord($inputitem['data'][0]) - 1);
+ $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 8, ord($inputitem['data'][2]));
+ return $inputitem;
+ }
+
+ /**
+ * encodeBitStream
+ * @param array $inputitem
+ * @param int $version
+ * @return array input item
+ */
+ protected function encodeBitStream($inputitem, $version) {
+ $inputitem['bstream'] = array();
+ $words = $this->maximumWords($inputitem['mode'], $version);
+ if ($inputitem['size'] > $words) {
+ $st1 = $this->newInputItem($inputitem['mode'], $words, $inputitem['data']);
+ $st2 = $this->newInputItem($inputitem['mode'], $inputitem['size'] - $words, array_slice($inputitem['data'], $words));
+ $st1 = $this->encodeBitStream($st1, $version);
+ $st2 = $this->encodeBitStream($st2, $version);
+ $inputitem['bstream'] = array();
+ $inputitem['bstream'] = $this->appendBitstream($inputitem['bstream'], $st1['bstream']);
+ $inputitem['bstream'] = $this->appendBitstream($inputitem['bstream'], $st2['bstream']);
+ } else {
+ switch($inputitem['mode']) {
+ case QR_MODE_NM: {
+ $inputitem = $this->encodeModeNum($inputitem, $version);
+ break;
+ }
+ case QR_MODE_AN: {
+ $inputitem = $this->encodeModeAn($inputitem, $version);
+ break;
+ }
+ case QR_MODE_8B: {
+ $inputitem = $this->encodeMode8($inputitem, $version);
+ break;
+ }
+ case QR_MODE_KJ: {
+ $inputitem = $this->encodeModeKanji($inputitem, $version);
+ break;
+ }
+ case QR_MODE_ST: {
+ $inputitem = $this->encodeModeStructure($inputitem);
+ break;
+ }
+ default: {
+ break;
+ }
+ }
+ }
+ return $inputitem;
+ }
+
+ // - - - - - - - - - - - - - - - - - - - - - - - - -
+
+ // QRinput
+
+ /**
+ * Append data to an input object.
+ * The data is copied and appended to the input object.
+ * @param array items input items
+ * @param int $mode encoding mode.
+ * @param int $size size of data (byte).
+ * @param array $data array of input data.
+ * @return items
+ *
+ */
+ protected function appendNewInputItem($items, $mode, $size, $data) {
+ $items[] = $this->newInputItem($mode, $size, $data);
+ return $items;
+ }
+
+ /**
+ * insertStructuredAppendHeader
+ * @param array $items
+ * @param int $size
+ * @param int $index
+ * @param int $parity
+ * @return array items
+ */
+ protected function insertStructuredAppendHeader($items, $size, $index, $parity) {
+ if ($size > MAX_STRUCTURED_SYMBOLS) {
+ return -1;
+ }
+ if (($index <= 0) OR ($index > MAX_STRUCTURED_SYMBOLS)) {
+ return -1;
+ }
+ $buf = array($size, $index, $parity);
+ $entry = $this->newInputItem(QR_MODE_ST, 3, buf);
+ array_unshift($items, $entry);
+ return $items;
+ }
+
+ /**
+ * calcParity
+ * @param array $items
+ * @return int parity
+ */
+ protected function calcParity($items) {
+ $parity = 0;
+ foreach ($items as $item) {
+ if ($item['mode'] != QR_MODE_ST) {
+ for ($i=$item['size']-1; $i>=0; --$i) {
+ $parity ^= $item['data'][$i];
+ }
+ }
+ }
+ return $parity;
+ }
+
+ /**
+ * checkModeNum
+ * @param int $size
+ * @param array $data
+ * @return boolean true or false
+ */
+ protected function checkModeNum($size, $data) {
+ for ($i=0; $i<$size; ++$i) {
+ if ((ord($data[$i]) < ord('0')) OR (ord($data[$i]) > ord('9'))){
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * estimateBitsModeNum
+ * @param int $size
+ * @return int number of bits
+ */
+ protected function estimateBitsModeNum($size) {
+ $w = (int)$size / 3;
+ $bits = $w * 10;
+ switch($size - $w * 3) {
+ case 1: {
+ $bits += 4;
+ break;
+ }
+ case 2: {
+ $bits += 7;
+ break;
+ }
+ default: {
+ break;
+ }
+ }
+ return $bits;
+ }
+
+ /**
+ * Look up the alphabet-numeric convesion table (see JIS X0510:2004, pp.19).
+ * @param int $c character value
+ * @return value
+ */
+ protected function lookAnTable($c) {
+ return (($c > 127)?-1:$this->anTable[$c]);
+ }
+
+ /**
+ * checkModeAn
+ * @param int $size
+ * @param array $data
+ * @return boolean true or false
+ */
+ protected function checkModeAn($size, $data) {
+ for ($i=0; $i<$size; ++$i) {
+ if ($this->lookAnTable(ord($data[$i])) == -1) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * estimateBitsModeAn
+ * @param int $size
+ * @return int number of bits
+ */
+ protected function estimateBitsModeAn($size) {
+ $w = (int)($size / 2);
+ $bits = $w * 11;
+ if ($size & 1) {
+ $bits += 6;
+ }
+ return $bits;
+ }
+
+ /**
+ * estimateBitsMode8
+ * @param int $size
+ * @return int number of bits
+ */
+ protected function estimateBitsMode8($size) {
+ return $size * 8;
+ }
+
+ /**
+ * estimateBitsModeKanji
+ * @param int $size
+ * @return int number of bits
+ */
+ protected function estimateBitsModeKanji($size) {
+ return (int)(($size / 2) * 13);
+ }
+
+ /**
+ * checkModeKanji
+ * @param int $size
+ * @param array $data
+ * @return boolean true or false
+ */
+ protected function checkModeKanji($size, $data) {
+ if ($size & 1) {
+ return false;
+ }
+ for ($i=0; $i<$size; $i+=2) {
+ $val = (ord($data[$i]) << 8) | ord($data[$i+1]);
+ if (($val < 0x8140) OR (($val > 0x9ffc) AND ($val < 0xe040)) OR ($val > 0xebbf)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Validate the input data.
+ * @param int $mode encoding mode.
+ * @param int $size size of data (byte).
+ * @param array data data to validate
+ * @return boolean true in case of valid data, false otherwise
+ */
+ protected function check($mode, $size, $data) {
+ if ($size <= 0) {
+ return false;
+ }
+ switch($mode) {
+ case QR_MODE_NM: {
+ return $this->checkModeNum($size, $data);
+ }
+ case QR_MODE_AN: {
+ return $this->checkModeAn($size, $data);
+ }
+ case QR_MODE_KJ: {
+ return $this->checkModeKanji($size, $data);
+ }
+ case QR_MODE_8B: {
+ return true;
+ }
+ case QR_MODE_ST: {
+ return true;
+ }
+ default: {
+ break;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * estimateBitStreamSize
+ * @param array $items
+ * @param int $version
+ * @return int bits
+ */
+ protected function estimateBitStreamSize($items, $version) {
+ $bits = 0;
+ if ($version == 0) {
+ $version = 1;
+ }
+ foreach ($items as $item) {
+ switch($item['mode']) {
+ case QR_MODE_NM: {
+ $bits = $this->estimateBitsModeNum($item['size']);
+ break;
+ }
+ case QR_MODE_AN: {
+ $bits = $this->estimateBitsModeAn($item['size']);
+ break;
+ }
+ case QR_MODE_8B: {
+ $bits = $this->estimateBitsMode8($item['size']);
+ break;
+ }
+ case QR_MODE_KJ: {
+ $bits = $this->estimateBitsModeKanji($item['size']);
+ break;
+ }
+ case QR_MODE_ST: {
+ return STRUCTURE_HEADER_BITS;
+ }
+ default: {
+ return 0;
+ }
+ }
+ $l = $this->lengthIndicator($item['mode'], $version);
+ $m = 1 << $l;
+ $num = (int)(($item['size'] + $m - 1) / $m);
+ $bits += $num * (4 + $l);
+ }
+ return $bits;
+ }
+
+ /**
+ * estimateVersion
+ * @param array $items
+ * @return int version
+ */
+ protected function estimateVersion($items) {
+ $version = 0;
+ $prev = 0;
+ do {
+ $prev = $version;
+ $bits = $this->estimateBitStreamSize($items, $prev);
+ $version = $this->getMinimumVersion((int)(($bits + 7) / 8), $this->level);
+ if ($version < 0) {
+ return -1;
+ }
+ } while ($version > $prev);
+ return $version;
+ }
+
+ /**
+ * lengthOfCode
+ * @param int $mode
+ * @param int $version
+ * @param int $bits
+ * @return int size
+ */
+ protected function lengthOfCode($mode, $version, $bits) {
+ $payload = $bits - 4 - $this->lengthIndicator($mode, $version);
+ switch($mode) {
+ case QR_MODE_NM: {
+ $chunks = (int)($payload / 10);
+ $remain = $payload - $chunks * 10;
+ $size = $chunks * 3;
+ if ($remain >= 7) {
+ $size += 2;
+ } elseif ($remain >= 4) {
+ $size += 1;
+ }
+ break;
+ }
+ case QR_MODE_AN: {
+ $chunks = (int)($payload / 11);
+ $remain = $payload - $chunks * 11;
+ $size = $chunks * 2;
+ if ($remain >= 6) {
+ ++$size;
+ }
+ break;
+ }
+ case QR_MODE_8B: {
+ $size = (int)($payload / 8);
+ break;
+ }
+ case QR_MODE_KJ: {
+ $size = (int)(($payload / 13) * 2);
+ break;
+ }
+ case QR_MODE_ST: {
+ $size = (int)($payload / 8);
+ break;
+ }
+ default: {
+ $size = 0;
+ break;
+ }
+ }
+ $maxsize = $this->maximumWords($mode, $version);
+ if ($size < 0) {
+ $size = 0;
+ }
+ if ($size > $maxsize) {
+ $size = $maxsize;
+ }
+ return $size;
+ }
+
+ /**
+ * createBitStream
+ * @param array $items
+ * @return array of items and total bits
+ */
+ protected function createBitStream($items) {
+ $total = 0;
+ foreach ($items as $key => $item) {
+ $items[$key] = $this->encodeBitStream($item, $this->version);
+ $bits = count($items[$key]['bstream']);
+ $total += $bits;
+ }
+ return array($items, $total);
+ }
+
+ /**
+ * convertData
+ * @param array $items
+ * @return array items
+ */
+ protected function convertData($items) {
+ $ver = $this->estimateVersion($items);
+ if ($ver > $this->version) {
+ $this->version = $ver;
+ }
+ for (;;) {
+ $cbs = $this->createBitStream($items);
+ $items = $cbs[0];
+ $bits = $cbs[1];
+ if ($bits < 0) {
+ return -1;
+ }
+ $ver = $this->getMinimumVersion((int)(($bits + 7) / 8), $this->level);
+ if ($ver < 0) {
+ return -1;
+ } elseif ($ver > $this->version) {
+ $this->version = $ver;
+ } else {
+ break;
+ }
+ }
+ return $items;
+ }
+
+ /**
+ * Append Padding Bit to bitstream
+ * @param array $bstream
+ * @return array bitstream
+ */
+ protected function appendPaddingBit($bstream) {
+ $bits = count($bstream);
+ $maxwords = $this->getDataLength($this->version, $this->level);
+ $maxbits = $maxwords * 8;
+ if ($maxbits == $bits) {
+ return 0;
+ }
+ if ($maxbits - $bits < 5) {
+ return $this->appendNum($bstream, $maxbits - $bits, 0);
+ }
+ $bits += 4;
+ $words = (int)(($bits + 7) / 8);
+ $padding = array();
+ $padding = $this->appendNum($padding, $words * 8 - $bits + 4, 0);
+ $padlen = $maxwords - $words;
+ if ($padlen > 0) {
+ $padbuf = array();
+ for ($i=0; $i<$padlen; ++$i) {
+ $padbuf[$i] = ($i&1)?0x11:0xec;
+ }
+ $padding = $this->appendBytes($padding, $padlen, $padbuf);
+ }
+ return $this->appendBitstream($bstream, $padding);
+ }
+
+ /**
+ * mergeBitStream
+ * @param array $bstream
+ * @return array bitstream
+ */
+ protected function mergeBitStream($items) {
+ $items = $this->convertData($items);
+ $bstream = array();
+ foreach ($items as $item) {
+ $bstream = $this->appendBitstream($bstream, $item['bstream']);
+ }
+ return $bstream;
+ }
+
+ /**
+ * Returns a stream of bits.
+ * @param int $items
+ * @return array padded merged byte stream
+ */
+ protected function getBitStream($items) {
+ $bstream = $this->mergeBitStream($items);
+ return $this->appendPaddingBit($bstream);
+ }
+
+ /**
+ * Pack all bit streams padding bits into a byte array.
+ * @param int $items
+ * @return array padded merged byte stream
+ */
+ protected function getByteStream($items) {
+ $bstream = $this->getBitStream($items);
+ return $this->bitstreamToByte($bstream);
+ }
+
+ // - - - - - - - - - - - - - - - - - - - - - - - - -
+
+ // QRbitstream
+
+ /**
+ * Return an array with zeros
+ * @param int $setLength array size
+ * @return array
+ */
+ protected function allocate($setLength) {
+ return array_fill(0, $setLength, 0);
+ }
+
+ /**
+ * Return new bitstream from number
+ * @param int $bits number of bits
+ * @param int $num number
+ * @return array bitstream
+ */
+ protected function newFromNum($bits, $num) {
+ $bstream = $this->allocate($bits);
+ $mask = 1 << ($bits - 1);
+ for ($i=0; $i<$bits; ++$i) {
+ if ($num & $mask) {
+ $bstream[$i] = 1;
+ } else {
+ $bstream[$i] = 0;
+ }
+ $mask = $mask >> 1;
+ }
+ return $bstream;
+ }
+
+ /**
+ * Return new bitstream from bytes
+ * @param int $size size
+ * @param array $data bytes
+ * @return array bitstream
+ */
+ protected function newFromBytes($size, $data) {
+ $bstream = $this->allocate($size * 8);
+ $p=0;
+ for ($i=0; $i<$size; ++$i) {
+ $mask = 0x80;
+ for ($j=0; $j<8; ++$j) {
+ if ($data[$i] & $mask) {
+ $bstream[$p] = 1;
+ } else {
+ $bstream[$p] = 0;
+ }
+ $p++;
+ $mask = $mask >> 1;
+ }
+ }
+ return $bstream;
+ }
+
+ /**
+ * Append one bitstream to another
+ * @param array $bitstream original bitstream
+ * @param array $append bitstream to append
+ * @return array bitstream
+ */
+ protected function appendBitstream($bitstream, $append) {
+ if ((!is_array($append)) OR (count($append) == 0)) {
+ return $bitstream;
+ }
+ if (count($bitstream) == 0) {
+ return $append;
+ }
+ return array_values(array_merge($bitstream, $append));
+ }
+
+ /**
+ * Append one bitstream created from number to another
+ * @param array $bitstream original bitstream
+ * @param int $bits number of bits
+ * @param int $num number
+ * @return array bitstream
+ */
+ protected function appendNum($bitstream, $bits, $num) {
+ if ($bits == 0) {
+ return 0;
+ }
+ $b = $this->newFromNum($bits, $num);
+ return $this->appendBitstream($bitstream, $b);
+ }
+
+ /**
+ * Append one bitstream created from bytes to another
+ * @param array $bitstream original bitstream
+ * @param int $size size
+ * @param array $data bytes
+ * @return array bitstream
+ */
+ protected function appendBytes($bitstream, $size, $data) {
+ if ($size == 0) {
+ return 0;
+ }
+ $b = $this->newFromBytes($size, $data);
+ return $this->appendBitstream($bitstream, $b);
+ }
+
+ /**
+ * Convert bitstream to bytes
+ * @param array $bitstream original bitstream
+ * @return array of bytes
+ */
+ protected function bitstreamToByte($bstream) {
+ $size = count($bstream);
+ if ($size == 0) {
+ return array();
+ }
+ $data = array_fill(0, (int)(($size + 7) / 8), 0);
+ $bytes = (int)($size / 8);
+ $p = 0;
+ for ($i=0; $i<$bytes; $i++) {
+ $v = 0;
+ for ($j=0; $j<8; $j++) {
+ $v = $v << 1;
+ $v |= $bstream[$p];
+ $p++;
+ }
+ $data[$i] = $v;
+ }
+ if ($size & 7) {
+ $v = 0;
+ for ($j=0; $j<($size & 7); $j++) {
+ $v = $v << 1;
+ $v |= $bstream[$p];
+ $p++;
+ }
+ $data[$bytes] = $v;
+ }
+ return $data;
+ }
+
+ // - - - - - - - - - - - - - - - - - - - - - - - - -
+
+ // QRspec
+
+ /**
+ * Replace a value on the array at the specified position
+ * @param array $srctab
+ * @param int $x X position
+ * @param int $y Y position
+ * @param string $repl value to replace
+ * @param int $replLen length of the repl string
+ * @return array srctab
+ */
+ protected function qrstrset($srctab, $x, $y, $repl, $replLen=false) {
+ $srctab[$y] = substr_replace($srctab[$y], ($replLen !== false)?substr($repl,0,$replLen):$repl, $x, ($replLen !== false)?$replLen:strlen($repl));
+ return $srctab;
+ }
+
+ /**
+ * Return maximum data code length (bytes) for the version.
+ * @param int $version version
+ * @param int $level error correction level
+ * @return int maximum size (bytes)
+ */
+ protected function getDataLength($version, $level) {
+ return $this->capacity[$version][QRCAP_WORDS] - $this->capacity[$version][QRCAP_EC][$level];
+ }
+
+ /**
+ * Return maximum error correction code length (bytes) for the version.
+ * @param int $version version
+ * @param int $level error correction level
+ * @return int ECC size (bytes)
+ */
+ protected function getECCLength($version, $level){
+ return $this->capacity[$version][QRCAP_EC][$level];
+ }
+
+ /**
+ * Return the width of the symbol for the version.
+ * @param int $version version
+ * @return int width
+ */
+ protected function getWidth($version) {
+ return $this->capacity[$version][QRCAP_WIDTH];
+ }
+
+ /**
+ * Return the numer of remainder bits.
+ * @param int $version version
+ * @return int number of remainder bits
+ */
+ protected function getRemainder($version) {
+ return $this->capacity[$version][QRCAP_REMINDER];
+ }
+
+ /**
+ * Return a version number that satisfies the input code length.
+ * @param int $size input code length (byte)
+ * @param int $level error correction level
+ * @return int version number
+ */
+ protected function getMinimumVersion($size, $level) {
+ for ($i=1; $i <= QRSPEC_VERSION_MAX; ++$i) {
+ $words = $this->capacity[$i][QRCAP_WORDS] - $this->capacity[$i][QRCAP_EC][$level];
+ if ($words >= $size) {
+ return $i;
+ }
+ }
+ return -1;
+ }
+
+ /**
+ * Return the size of length indicator for the mode and version.
+ * @param int $mode encoding mode
+ * @param int $version version
+ * @return int the size of the appropriate length indicator (bits).
+ */
+ protected function lengthIndicator($mode, $version) {
+ if ($mode == QR_MODE_ST) {
+ return 0;
+ }
+ if ($version <= 9) {
+ $l = 0;
+ } elseif ($version <= 26) {
+ $l = 1;
+ } else {
+ $l = 2;
+ }
+ return $this->lengthTableBits[$mode][$l];
+ }
+
+ /**
+ * Return the maximum length for the mode and version.
+ * @param int $mode encoding mode
+ * @param int $version version
+ * @return int the maximum length (bytes)
+ */
+ protected function maximumWords($mode, $version) {
+ if ($mode == QR_MODE_ST) {
+ return 3;
+ }
+ if ($version <= 9) {
+ $l = 0;
+ } else if ($version <= 26) {
+ $l = 1;
+ } else {
+ $l = 2;
+ }
+ $bits = $this->lengthTableBits[$mode][$l];
+ $words = (1 << $bits) - 1;
+ if ($mode == QR_MODE_KJ) {
+ $words *= 2; // the number of bytes is required
+ }
+ return $words;
+ }
+
+ /**
+ * Return an array of ECC specification.
+ * @param int $version version
+ * @param int $level error correction level
+ * @param array $spec an array of ECC specification contains as following: {# of type1 blocks, # of data code, # of ecc code, # of type2 blocks, # of data code}
+ * @return array spec
+ */
+ protected function getEccSpec($version, $level, $spec) {
+ if (count($spec) < 5) {
+ $spec = array(0, 0, 0, 0, 0);
+ }
+ $b1 = $this->eccTable[$version][$level][0];
+ $b2 = $this->eccTable[$version][$level][1];
+ $data = $this->getDataLength($version, $level);
+ $ecc = $this->getECCLength($version, $level);
+ if ($b2 == 0) {
+ $spec[0] = $b1;
+ $spec[1] = (int)($data / $b1);
+ $spec[2] = (int)($ecc / $b1);
+ $spec[3] = 0;
+ $spec[4] = 0;
+ } else {
+ $spec[0] = $b1;
+ $spec[1] = (int)($data / ($b1 + $b2));
+ $spec[2] = (int)($ecc / ($b1 + $b2));
+ $spec[3] = $b2;
+ $spec[4] = $spec[1] + 1;
+ }
+ return $spec;
+ }
+
+ /**
+ * Put an alignment marker.
+ * @param array $frame frame
+ * @param int $width width
+ * @param int $ox X center coordinate of the pattern
+ * @param int $oy Y center coordinate of the pattern
+ * @return array frame
+ */
+ protected function putAlignmentMarker($frame, $ox, $oy) {
+ $finder = array(
+ "\xa1\xa1\xa1\xa1\xa1",
+ "\xa1\xa0\xa0\xa0\xa1",
+ "\xa1\xa0\xa1\xa0\xa1",
+ "\xa1\xa0\xa0\xa0\xa1",
+ "\xa1\xa1\xa1\xa1\xa1"
+ );
+ $yStart = $oy - 2;
+ $xStart = $ox - 2;
+ for ($y=0; $y < 5; $y++) {
+ $frame = $this->qrstrset($frame, $xStart, $yStart+$y, $finder[$y]);
+ }
+ return $frame;
+ }
+
+ /**
+ * Put an alignment pattern.
+ * @param int $version version
+ * @param array $fram frame
+ * @param int $width width
+ * @return array frame
+ */
+ protected function putAlignmentPattern($version, $frame, $width) {
+ if ($version < 2) {
+ return $frame;
+ }
+ $d = $this->alignmentPattern[$version][1] - $this->alignmentPattern[$version][0];
+ if ($d < 0) {
+ $w = 2;
+ } else {
+ $w = (int)(($width - $this->alignmentPattern[$version][0]) / $d + 2);
+ }
+ if ($w * $w - 3 == 1) {
+ $x = $this->alignmentPattern[$version][0];
+ $y = $this->alignmentPattern[$version][0];
+ $frame = $this->putAlignmentMarker($frame, $x, $y);
+ return $frame;
+ }
+ $cx = $this->alignmentPattern[$version][0];
+ $wo = $w - 1;
+ for ($x=1; $x < $wo; ++$x) {
+ $frame = $this->putAlignmentMarker($frame, 6, $cx);
+ $frame = $this->putAlignmentMarker($frame, $cx, 6);
+ $cx += $d;
+ }
+ $cy = $this->alignmentPattern[$version][0];
+ for ($y=0; $y < $wo; ++$y) {
+ $cx = $this->alignmentPattern[$version][0];
+ for ($x=0; $x < $wo; ++$x) {
+ $frame = $this->putAlignmentMarker($frame, $cx, $cy);
+ $cx += $d;
+ }
+ $cy += $d;
+ }
+ return $frame;
+ }
+
+ /**
+ * Return BCH encoded version information pattern that is used for the symbol of version 7 or greater. Use lower 18 bits.
+ * @param int $version version
+ * @return BCH encoded version information pattern
+ */
+ protected function getVersionPattern($version) {
+ if (($version < 7) OR ($version > QRSPEC_VERSION_MAX)) {
+ return 0;
+ }
+ return $this->versionPattern[($version - 7)];
+ }
+
+ /**
+ * Return BCH encoded format information pattern.
+ * @param array $mask
+ * @param int $level error correction level
+ * @return BCH encoded format information pattern
+ */
+ protected function getFormatInfo($mask, $level) {
+ if (($mask < 0) OR ($mask > 7)) {
+ return 0;
+ }
+ if (($level < 0) OR ($level > 3)) {
+ return 0;
+ }
+ return $this->formatInfo[$level][$mask];
+ }
+
+ /**
+ * Put a finder pattern.
+ * @param array $frame frame
+ * @param int $width width
+ * @param int $ox X center coordinate of the pattern
+ * @param int $oy Y center coordinate of the pattern
+ * @return array frame
+ */
+ protected function putFinderPattern($frame, $ox, $oy) {
+ $finder = array(
+ "\xc1\xc1\xc1\xc1\xc1\xc1\xc1",
+ "\xc1\xc0\xc0\xc0\xc0\xc0\xc1",
+ "\xc1\xc0\xc1\xc1\xc1\xc0\xc1",
+ "\xc1\xc0\xc1\xc1\xc1\xc0\xc1",
+ "\xc1\xc0\xc1\xc1\xc1\xc0\xc1",
+ "\xc1\xc0\xc0\xc0\xc0\xc0\xc1",
+ "\xc1\xc1\xc1\xc1\xc1\xc1\xc1"
+ );
+ for ($y=0; $y < 7; $y++) {
+ $frame = $this->qrstrset($frame, $ox, ($oy + $y), $finder[$y]);
+ }
+ return $frame;
+ }
+
+ /**
+ * Return a copy of initialized frame.
+ * @param int $version version
+ * @return Array of unsigned char.
+ */
+ protected function createFrame($version) {
+ $width = $this->capacity[$version][QRCAP_WIDTH];
+ $frameLine = str_repeat ("\0", $width);
+ $frame = array_fill(0, $width, $frameLine);
+ // Finder pattern
+ $frame = $this->putFinderPattern($frame, 0, 0);
+ $frame = $this->putFinderPattern($frame, $width - 7, 0);
+ $frame = $this->putFinderPattern($frame, 0, $width - 7);
+ // Separator
+ $yOffset = $width - 7;
+ for ($y=0; $y < 7; ++$y) {
+ $frame[$y][7] = "\xc0";
+ $frame[$y][$width - 8] = "\xc0";
+ $frame[$yOffset][7] = "\xc0";
+ ++$yOffset;
+ }
+ $setPattern = str_repeat("\xc0", 8);
+ $frame = $this->qrstrset($frame, 0, 7, $setPattern);
+ $frame = $this->qrstrset($frame, $width-8, 7, $setPattern);
+ $frame = $this->qrstrset($frame, 0, $width - 8, $setPattern);
+ // Format info
+ $setPattern = str_repeat("\x84", 9);
+ $frame = $this->qrstrset($frame, 0, 8, $setPattern);
+ $frame = $this->qrstrset($frame, $width - 8, 8, $setPattern, 8);
+ $yOffset = $width - 8;
+ for ($y=0; $y < 8; ++$y,++$yOffset) {
+ $frame[$y][8] = "\x84";
+ $frame[$yOffset][8] = "\x84";
+ }
+ // Timing pattern
+ $wo = $width - 15;
+ for ($i=1; $i < $wo; ++$i) {
+ $frame[6][7+$i] = chr(0x90 | ($i & 1));
+ $frame[7+$i][6] = chr(0x90 | ($i & 1));
+ }
+ // Alignment pattern
+ $frame = $this->putAlignmentPattern($version, $frame, $width);
+ // Version information
+ if ($version >= 7) {
+ $vinf = $this->getVersionPattern($version);
+ $v = $vinf;
+ for ($x=0; $x<6; ++$x) {
+ for ($y=0; $y<3; ++$y) {
+ $frame[($width - 11)+$y][$x] = chr(0x88 | ($v & 1));
+ $v = $v >> 1;
+ }
+ }
+ $v = $vinf;
+ for ($y=0; $y<6; ++$y) {
+ for ($x=0; $x<3; ++$x) {
+ $frame[$y][$x+($width - 11)] = chr(0x88 | ($v & 1));
+ $v = $v >> 1;
+ }
+ }
+ }
+ // and a little bit...
+ $frame[$width - 8][8] = "\x81";
+ return $frame;
+ }
+
+ /**
+ * Set new frame for the specified version.
+ * @param int $version version
+ * @return Array of unsigned char.
+ */
+ protected function newFrame($version) {
+ if (($version < 1) OR ($version > QRSPEC_VERSION_MAX)) {
+ return NULL;
+ }
+ if (!isset($this->frames[$version])) {
+ $this->frames[$version] = $this->createFrame($version);
+ }
+ if (is_null($this->frames[$version])) {
+ return NULL;
+ }
+ return $this->frames[$version];
+ }
+
+ /**
+ * Return block number 0
+ * @param array $spec
+ * @return int value
+ */
+ protected function rsBlockNum($spec) {
+ return ($spec[0] + $spec[3]);
+ }
+
+ /**
+ * Return block number 1
+ * @param array $spec
+ * @return int value
+ */
+ protected function rsBlockNum1($spec) {
+ return $spec[0];
+ }
+
+ /**
+ * Return data codes 1
+ * @param array $spec
+ * @return int value
+ */
+ protected function rsDataCodes1($spec) {
+ return $spec[1];
+ }
+
+ /**
+ * Return ecc codes 1
+ * @param array $spec
+ * @return int value
+ */
+ protected function rsEccCodes1($spec) {
+ return $spec[2];
+ }
+
+ /**
+ * Return block number 2
+ * @param array $spec
+ * @return int value
+ */
+ protected function rsBlockNum2($spec) {
+ return $spec[3];
+ }
+
+ /**
+ * Return data codes 2
+ * @param array $spec
+ * @return int value
+ */
+ protected function rsDataCodes2($spec) {
+ return $spec[4];
+ }
+
+ /**
+ * Return ecc codes 2
+ * @param array $spec
+ * @return int value
+ */
+ protected function rsEccCodes2($spec) {
+ return $spec[2];
+ }
+
+ /**
+ * Return data length
+ * @param array $spec
+ * @return int value
+ */
+ protected function rsDataLength($spec) {
+ return ($spec[0] * $spec[1]) + ($spec[3] * $spec[4]);
+ }
+
+ /**
+ * Return ecc length
+ * @param array $spec
+ * @return int value
+ */
+ protected function rsEccLength($spec) {
+ return ($spec[0] + $spec[3]) * $spec[2];
+ }
+
+ // - - - - - - - - - - - - - - - - - - - - - - - - -
+
+ // QRrs
+
+ /**
+ * Initialize a Reed-Solomon codec and add it to existing rsitems
+ * @param int $symsize symbol size, bits
+ * @param int $gfpoly Field generator polynomial coefficients
+ * @param int $fcr first root of RS code generator polynomial, index form
+ * @param int $prim primitive element to generate polynomial roots
+ * @param int $nroots RS code generator polynomial degree (number of roots)
+ * @param int $pad padding bytes at front of shortened block
+ * @return array Array of RS values:<ul><li>mm = Bits per symbol;</li><li>nn = Symbols per block;</li><li>alpha_to = log lookup table array;</li><li>index_of = Antilog lookup table array;</li><li>genpoly = Generator polynomial array;</li><li>nroots = Number of generator;</li><li>roots = number of parity symbols;</li><li>fcr = First consecutive root, index form;</li><li>prim = Primitive element, index form;</li><li>iprim = prim-th root of 1, index form;</li><li>pad = Padding bytes in shortened block;</li><li>gfpoly</ul>.
+ */
+ protected function init_rs($symsize, $gfpoly, $fcr, $prim, $nroots, $pad) {
+ foreach ($this->rsitems as $rs) {
+ if (($rs['pad'] != $pad) OR ($rs['nroots'] != $nroots) OR ($rs['mm'] != $symsize)
+ OR ($rs['gfpoly'] != $gfpoly) OR ($rs['fcr'] != $fcr) OR ($rs['prim'] != $prim)) {
+ continue;
+ }
+ return $rs;
+ }
+ $rs = $this->init_rs_char($symsize, $gfpoly, $fcr, $prim, $nroots, $pad);
+ array_unshift($this->rsitems, $rs);
+ return $rs;
+ }
+
+ // - - - - - - - - - - - - - - - - - - - - - - - - -
+
+ // QRrsItem
+
+ /**
+ * modnn
+ * @param array RS values
+ * @param int $x X position
+ * @return int X osition
+ */
+ protected function modnn($rs, $x) {
+ while ($x >= $rs['nn']) {
+ $x -= $rs['nn'];
+ $x = ($x >> $rs['mm']) + ($x & $rs['nn']);
+ }
+ return $x;
+ }
+
+ /**
+ * Initialize a Reed-Solomon codec and returns an array of values.
+ * @param int $symsize symbol size, bits
+ * @param int $gfpoly Field generator polynomial coefficients
+ * @param int $fcr first root of RS code generator polynomial, index form
+ * @param int $prim primitive element to generate polynomial roots
+ * @param int $nroots RS code generator polynomial degree (number of roots)
+ * @param int $pad padding bytes at front of shortened block
+ * @return array Array of RS values:<ul><li>mm = Bits per symbol;</li><li>nn = Symbols per block;</li><li>alpha_to = log lookup table array;</li><li>index_of = Antilog lookup table array;</li><li>genpoly = Generator polynomial array;</li><li>nroots = Number of generator;</li><li>roots = number of parity symbols;</li><li>fcr = First consecutive root, index form;</li><li>prim = Primitive element, index form;</li><li>iprim = prim-th root of 1, index form;</li><li>pad = Padding bytes in shortened block;</li><li>gfpoly</ul>.
+ */
+ protected function init_rs_char($symsize, $gfpoly, $fcr, $prim, $nroots, $pad) {
+ // Based on Reed solomon encoder by Phil Karn, KA9Q (GNU-LGPLv2)
+ $rs = null;
+ // Check parameter ranges
+ if (($symsize < 0) OR ($symsize > 8)) {
+ return $rs;
+ }
+ if (($fcr < 0) OR ($fcr >= (1<<$symsize))) {
+ return $rs;
+ }
+ if (($prim <= 0) OR ($prim >= (1<<$symsize))) {
+ return $rs;
+ }
+ if (($nroots < 0) OR ($nroots >= (1<<$symsize))) {
+ return $rs;
+ }
+ if (($pad < 0) OR ($pad >= ((1<<$symsize) -1 - $nroots))) {
+ return $rs;
+ }
+ $rs = array();
+ $rs['mm'] = $symsize;
+ $rs['nn'] = (1 << $symsize) - 1;
+ $rs['pad'] = $pad;
+ $rs['alpha_to'] = array_fill(0, ($rs['nn'] + 1), 0);
+ $rs['index_of'] = array_fill(0, ($rs['nn'] + 1), 0);
+ // PHP style macro replacement ;)
+ $NN =& $rs['nn'];
+ $A0 =& $NN;
+ // Generate Galois field lookup tables
+ $rs['index_of'][0] = $A0; // log(zero) = -inf
+ $rs['alpha_to'][$A0] = 0; // alpha**-inf = 0
+ $sr = 1;
+ for ($i=0; $i<$rs['nn']; ++$i) {
+ $rs['index_of'][$sr] = $i;
+ $rs['alpha_to'][$i] = $sr;
+ $sr <<= 1;
+ if ($sr & (1 << $symsize)) {
+ $sr ^= $gfpoly;
+ }
+ $sr &= $rs['nn'];
+ }
+ if ($sr != 1) {
+ // field generator polynomial is not primitive!
+ return NULL;
+ }
+ // Form RS code generator polynomial from its roots
+ $rs['genpoly'] = array_fill(0, ($nroots + 1), 0);
+ $rs['fcr'] = $fcr;
+ $rs['prim'] = $prim;
+ $rs['nroots'] = $nroots;
+ $rs['gfpoly'] = $gfpoly;
+ // Find prim-th root of 1, used in decoding
+ for ($iprim=1; ($iprim % $prim) != 0; $iprim += $rs['nn']) {
+ ; // intentional empty-body loop!
+ }
+ $rs['iprim'] = (int)($iprim / $prim);
+ $rs['genpoly'][0] = 1;
+
+
+ for ($i = 0,$root=$fcr*$prim; $i < $nroots; $i++, $root += $prim) {
+ $rs['genpoly'][$i+1] = 1;
+ // Multiply rs->genpoly[] by @**(root + x)
+ for ($j = $i; $j > 0; --$j) {
+ if ($rs['genpoly'][$j] != 0) {
+ $rs['genpoly'][$j] = $rs['genpoly'][$j-1] ^ $rs['alpha_to'][$this->modnn($rs, $rs['index_of'][$rs['genpoly'][$j]] + $root)];
+ } else {
+ $rs['genpoly'][$j] = $rs['genpoly'][$j-1];
+ }
+ }
+ // rs->genpoly[0] can never be zero
+ $rs['genpoly'][0] = $rs['alpha_to'][$this->modnn($rs, $rs['index_of'][$rs['genpoly'][0]] + $root)];
+ }
+ // convert rs->genpoly[] to index form for quicker encoding
+ for ($i = 0; $i <= $nroots; ++$i) {
+ $rs['genpoly'][$i] = $rs['index_of'][$rs['genpoly'][$i]];
+ }
+ return $rs;
+ }
+
+ /**
+ * Encode a Reed-Solomon codec and returns the parity array
+ * @param array $rs RS values
+ * @param array $data data
+ * @param array $parity parity
+ * @return parity array
+ */
+ protected function encode_rs_char($rs, $data, $parity) {
+ $MM =& $rs['mm']; // bits per symbol
+ $NN =& $rs['nn']; // the total number of symbols in a RS block
+ $ALPHA_TO =& $rs['alpha_to']; // the address of an array of NN elements to convert Galois field elements in index (log) form to polynomial form
+ $INDEX_OF =& $rs['index_of']; // the address of an array of NN elements to convert Galois field elements in polynomial form to index (log) form
+ $GENPOLY =& $rs['genpoly']; // an array of NROOTS+1 elements containing the generator polynomial in index form
+ $NROOTS =& $rs['nroots']; // the number of roots in the RS code generator polynomial, which is the same as the number of parity symbols in a block
+ $FCR =& $rs['fcr']; // first consecutive root, index form
+ $PRIM =& $rs['prim']; // primitive element, index form
+ $IPRIM =& $rs['iprim']; // prim-th root of 1, index form
+ $PAD =& $rs['pad']; // the number of pad symbols in a block
+ $A0 =& $NN;
+ $parity = array_fill(0, $NROOTS, 0);
+ for ($i=0; $i < ($NN - $NROOTS - $PAD); $i++) {
+ $feedback = $INDEX_OF[$data[$i] ^ $parity[0]];
+ if ($feedback != $A0) {
+ // feedback term is non-zero
+ // This line is unnecessary when GENPOLY[NROOTS] is unity, as it must
+ // always be for the polynomials constructed by init_rs()
+ $feedback = $this->modnn($rs, $NN - $GENPOLY[$NROOTS] + $feedback);
+ for ($j=1; $j < $NROOTS; ++$j) {
+ $parity[$j] ^= $ALPHA_TO[$this->modnn($rs, $feedback + $GENPOLY[($NROOTS - $j)])];
+ }
+ }
+ // Shift
+ array_shift($parity);
+ if ($feedback != $A0) {
+ array_push($parity, $ALPHA_TO[$this->modnn($rs, $feedback + $GENPOLY[0])]);
+ } else {
+ array_push($parity, 0);
+ }
+ }
+ return $parity;
+ }
+
+ } // end QRcode class
+
+} // END OF "class_exists QRcode"
+?>
diff --git a/library/phpqrcode/cache/frame_1.dat b/library/phpqrcode/cache/frame_1.dat
new file mode 100644
index 000000000..be28feac4
--- /dev/null
+++ b/library/phpqrcode/cache/frame_1.dat
@@ -0,0 +1,2 @@
+xÚÁ À E9³u`³"PÅ„CÛ牗T!0$
+E•É²Q™Ém½úhÛ¾9{kI"› 9Ln)Ap¤åÖ¾Ë>ß^‡Õz³mënÅ–;ü´mßn†ú¦Ë \ No newline at end of file
diff --git a/library/phpqrcode/cache/frame_1.png b/library/phpqrcode/cache/frame_1.png
new file mode 100644
index 000000000..86ce6e98d
--- /dev/null
+++ b/library/phpqrcode/cache/frame_1.png
Binary files differ
diff --git a/library/phpqrcode/cache/frame_10.dat b/library/phpqrcode/cache/frame_10.dat
new file mode 100644
index 000000000..aff163f68
--- /dev/null
+++ b/library/phpqrcode/cache/frame_10.dat
Binary files differ
diff --git a/library/phpqrcode/cache/frame_10.png b/library/phpqrcode/cache/frame_10.png
new file mode 100644
index 000000000..dbfcd70b5
--- /dev/null
+++ b/library/phpqrcode/cache/frame_10.png
Binary files differ
diff --git a/library/phpqrcode/cache/frame_11.dat b/library/phpqrcode/cache/frame_11.dat
new file mode 100644
index 000000000..95af68a47
--- /dev/null
+++ b/library/phpqrcode/cache/frame_11.dat
Binary files differ
diff --git a/library/phpqrcode/cache/frame_11.png b/library/phpqrcode/cache/frame_11.png
new file mode 100644
index 000000000..c07c761f1
--- /dev/null
+++ b/library/phpqrcode/cache/frame_11.png
Binary files differ
diff --git a/library/phpqrcode/cache/frame_12.dat b/library/phpqrcode/cache/frame_12.dat
new file mode 100644
index 000000000..73228b362
--- /dev/null
+++ b/library/phpqrcode/cache/frame_12.dat
Binary files differ
diff --git a/library/phpqrcode/cache/frame_12.png b/library/phpqrcode/cache/frame_12.png
new file mode 100644
index 000000000..8ba67822c
--- /dev/null
+++ b/library/phpqrcode/cache/frame_12.png
Binary files differ
diff --git a/library/phpqrcode/cache/frame_13.dat b/library/phpqrcode/cache/frame_13.dat
new file mode 100644
index 000000000..2256f0e34
--- /dev/null
+++ b/library/phpqrcode/cache/frame_13.dat
Binary files differ
diff --git a/library/phpqrcode/cache/frame_13.png b/library/phpqrcode/cache/frame_13.png
new file mode 100644
index 000000000..6e49d35a0
--- /dev/null
+++ b/library/phpqrcode/cache/frame_13.png
Binary files differ
diff --git a/library/phpqrcode/cache/frame_14.dat b/library/phpqrcode/cache/frame_14.dat
new file mode 100644
index 000000000..e9ae09329
--- /dev/null
+++ b/library/phpqrcode/cache/frame_14.dat
Binary files differ
diff --git a/library/phpqrcode/cache/frame_14.png b/library/phpqrcode/cache/frame_14.png
new file mode 100644
index 000000000..efc36c034
--- /dev/null
+++ b/library/phpqrcode/cache/frame_14.png
Binary files differ
diff --git a/library/phpqrcode/cache/frame_15.dat b/library/phpqrcode/cache/frame_15.dat
new file mode 100644
index 000000000..18727818d
--- /dev/null
+++ b/library/phpqrcode/cache/frame_15.dat
Binary files differ
diff --git a/library/phpqrcode/cache/frame_15.png b/library/phpqrcode/cache/frame_15.png
new file mode 100644
index 000000000..a9f416c7c
--- /dev/null
+++ b/library/phpqrcode/cache/frame_15.png
Binary files differ
diff --git a/library/phpqrcode/cache/frame_16.dat b/library/phpqrcode/cache/frame_16.dat
new file mode 100644
index 000000000..60af67845
--- /dev/null
+++ b/library/phpqrcode/cache/frame_16.dat
@@ -0,0 +1 @@
+xÚí™A„ E]sëIX´;¸Ün6€È`‚q”êêW6ñ奚`Œ%A/3!¢°‚¢Š!g–ÈÌ¡’1N) éE¢Ï|;®—>6â¸Þ97$ëÄôëc]kköwé1Öü[·m­CÍœcÊRºÄê¹>¦èµ¾šE,•hʼnp„#áxFyWÏÇVWGçòÕ3¼Õ+шþàË“úSŽâ}Äž#áG8b^c^cÏÀŽp„c&3YQ"ñŽ÷çÌvµù›…ñàÎþþ¼–¹kÞ9ŠÜ‡÷}”¹³ï×ú ¢Ä¿QäÿL—/ÝÔÀÏ \ No newline at end of file
diff --git a/library/phpqrcode/cache/frame_16.png b/library/phpqrcode/cache/frame_16.png
new file mode 100644
index 000000000..6ac8fe890
--- /dev/null
+++ b/library/phpqrcode/cache/frame_16.png
Binary files differ
diff --git a/library/phpqrcode/cache/frame_17.dat b/library/phpqrcode/cache/frame_17.dat
new file mode 100644
index 000000000..87f0cf593
--- /dev/null
+++ b/library/phpqrcode/cache/frame_17.dat
Binary files differ
diff --git a/library/phpqrcode/cache/frame_17.png b/library/phpqrcode/cache/frame_17.png
new file mode 100644
index 000000000..5b929ac73
--- /dev/null
+++ b/library/phpqrcode/cache/frame_17.png
Binary files differ
diff --git a/library/phpqrcode/cache/frame_18.dat b/library/phpqrcode/cache/frame_18.dat
new file mode 100644
index 000000000..bb7138c1d
--- /dev/null
+++ b/library/phpqrcode/cache/frame_18.dat
@@ -0,0 +1,2 @@
+xÚí™A
+ƒ0E]çÖ…,2;sƒä&ÉÍšh¥ÛêO¡ôÝÈàã1&09OIv@DDÒ Ì&§Ù‰KXÈÕFv•<Ádqò9Ö<%h•¹ Yïs !(d¥²ës;~||b(ÏøYůg#µ`œK ±S¼Åô¹Ä¶˜ùsàidßLg:Ó™Îtþ/gmª™ƒkÅMâ3³{­4rTÈQýÿe¥·s·>ó<Ó™Ît¦3éÌ;ïH¼#Ñ™Ît¦3ÍYœ+og©hù¶óµÙ½¬lnðûF>Øi^»#awm;gè~pÛgìNs{6z’‘»ãºïÞäp¾Ê' \ No newline at end of file
diff --git a/library/phpqrcode/cache/frame_18.png b/library/phpqrcode/cache/frame_18.png
new file mode 100644
index 000000000..ee0d6a35e
--- /dev/null
+++ b/library/phpqrcode/cache/frame_18.png
Binary files differ
diff --git a/library/phpqrcode/cache/frame_19.dat b/library/phpqrcode/cache/frame_19.dat
new file mode 100644
index 000000000..95e26adc1
--- /dev/null
+++ b/library/phpqrcode/cache/frame_19.dat
@@ -0,0 +1,3 @@
+xÚíšA
+Ä E»öÖ.ÌNo 7Ñ›¶iiRÚN2‹áW%ðxÁ@ÚÚœê'­
+u6×êˆ.*S;}˜«ÒàÏT úèÌzrt¹ï%ç,ÒÅÚâÎ}ç;“âç)¹Ÿ˜âÝZÚîLåè¹÷¬Pçç$¯×÷ÏqËgœLÂôdJ‡;Üáw¸Ãý.]z#Ÿ¾«[ͽïOg‚­Æô"ÐË áBíî¦}Ç}‡;Üáw¸Ãî˜#1GbŽ„;Üáw¸Ãý_ÝC+w¢@Dfî÷ïç™uø2™ÅÚÉNþû9R7|pWßkïû®¿“ßßkºö¿ºú»¼ÎÓ \ No newline at end of file
diff --git a/library/phpqrcode/cache/frame_19.png b/library/phpqrcode/cache/frame_19.png
new file mode 100644
index 000000000..20fddd84c
--- /dev/null
+++ b/library/phpqrcode/cache/frame_19.png
Binary files differ
diff --git a/library/phpqrcode/cache/frame_2.dat b/library/phpqrcode/cache/frame_2.dat
new file mode 100644
index 000000000..7e42f31ca
--- /dev/null
+++ b/library/phpqrcode/cache/frame_2.dat
@@ -0,0 +1 @@
+xÚÍ’Í À F{vë&  à&°Y+?Z1öÐSŸ'y!¢ŸÌÁa815&£•Û´ŽÙHå£Ùžc³•l«ÏFÆè1º#é6 fÊÖü©§6Äø•O7ˆ¨†C¦«›ðÖžÏ8gI®ÏöfB¦ÃÄÿæ\DÔ»( \ No newline at end of file
diff --git a/library/phpqrcode/cache/frame_2.png b/library/phpqrcode/cache/frame_2.png
new file mode 100644
index 000000000..9c150ebe3
--- /dev/null
+++ b/library/phpqrcode/cache/frame_2.png
Binary files differ
diff --git a/library/phpqrcode/cache/frame_20.dat b/library/phpqrcode/cache/frame_20.dat
new file mode 100644
index 000000000..d5ecc1d8a
--- /dev/null
+++ b/library/phpqrcode/cache/frame_20.dat
Binary files differ
diff --git a/library/phpqrcode/cache/frame_20.png b/library/phpqrcode/cache/frame_20.png
new file mode 100644
index 000000000..23a061d54
--- /dev/null
+++ b/library/phpqrcode/cache/frame_20.png
Binary files differ
diff --git a/library/phpqrcode/cache/frame_21.dat b/library/phpqrcode/cache/frame_21.dat
new file mode 100644
index 000000000..1974dd9d4
--- /dev/null
+++ b/library/phpqrcode/cache/frame_21.dat
@@ -0,0 +1 @@
+xÚíšA„ E]sëIX´;¹Ün6Up‚“в™ÿ]Ù˜þ< i-eWö‹¶˜)×äÅ•¼ÉÂ…H\jvqÙHL\6–šÝÐ…rI›¢LܹÜÕ%ÅÓ@´þ±V—vÆÂúý¤(ÏP4|ÎXnÒgÉß¼~]D¾ÉÕ×u1Us S\À°€,ÿÅ2Þ¢N§Ã?D›KºüF-:“eJ]p_À°€,˜a0Ã`†ÁÝ XÀ°`†Á ƒw,` X´]˜ˆ™‚¹‹˜°5 ‰®Y4{å±æñ2íûåvçJs†±Ûí9±˜í)õu±Û¹êÏØ,«]¸“‹Ù^_§7$ƒ_Í \ No newline at end of file
diff --git a/library/phpqrcode/cache/frame_21.png b/library/phpqrcode/cache/frame_21.png
new file mode 100644
index 000000000..291598c72
--- /dev/null
+++ b/library/phpqrcode/cache/frame_21.png
Binary files differ
diff --git a/library/phpqrcode/cache/frame_22.dat b/library/phpqrcode/cache/frame_22.dat
new file mode 100644
index 000000000..0f01802d2
--- /dev/null
+++ b/library/phpqrcode/cache/frame_22.dat
@@ -0,0 +1,3 @@
+xÚíšA
+„0 E]{ë.’]{{{³©Z¥BepÆÞwe@V›ERZ3»Á"*2o€4¦y‰)i#dÒbdFÒ…´ŒI"ú‘—4ž½W­IíuŠÓ45ßx«.Z­SÙ{ÁŸ¯8åËÿk={o.±qÊÙ£[œÍ:帒q»õƒy
+)t#á„N8ádCj-OOG}¼:/Ÿ:sz!Å)^<ùe½·S·uâ{ 'œp 'ú=ú=ú=¾'œp 'œp¢ß£ß£ßãN8á„Óÿ9©ªˆôpQQõ]HÔpz¾ØGœ^æ½Qº˜I|¾ß³u;9™ÎïÕëd;“X~$ËÙÑÉt¶ÊÛédy \ No newline at end of file
diff --git a/library/phpqrcode/cache/frame_22.png b/library/phpqrcode/cache/frame_22.png
new file mode 100644
index 000000000..bc97bd01b
--- /dev/null
+++ b/library/phpqrcode/cache/frame_22.png
Binary files differ
diff --git a/library/phpqrcode/cache/frame_23.dat b/library/phpqrcode/cache/frame_23.dat
new file mode 100644
index 000000000..ee3b37073
--- /dev/null
+++ b/library/phpqrcode/cache/frame_23.dat
@@ -0,0 +1,3 @@
+xÚíšA
+à E³öÖfo 7Ñ›U) %M!ΔÂûYu(<šð“sK²“Tœ›Ó
+É&§IÚ\i+¥Ðª™(m®´FQ¡¹¯h±æöüèv~n1„oÏ]sëçÖï¤_ÞŸÊ3`î_w2õȹ•lc[¼•;·Ûc֟ˤ’Nóª4Üpà 7ÜpÃímTÿ¸œ›‘ÝêrÞiñä_ƒç¿pS=7Þ7Üpà 7ÜpÃ>IŸ¤Oò-Á 7Üpà 7ú$}’>É·7Üpà ·tss‰Órs §åVÍÎÜÆ÷’mýï¡Ò¹ò‡Þñ}R~7ôà&¾÷º?7ùÞýÔ¦Iïbhâ{æ»<ÀMi- \ No newline at end of file
diff --git a/library/phpqrcode/cache/frame_23.png b/library/phpqrcode/cache/frame_23.png
new file mode 100644
index 000000000..b8f16ae23
--- /dev/null
+++ b/library/phpqrcode/cache/frame_23.png
Binary files differ
diff --git a/library/phpqrcode/cache/frame_24.dat b/library/phpqrcode/cache/frame_24.dat
new file mode 100644
index 000000000..7b92e29c4
--- /dev/null
+++ b/library/phpqrcode/cache/frame_24.dat
@@ -0,0 +1 @@
+xÚí›Aƒ E»öÖMX0;¸ÜnVP4ÚHSS»xßU3±/O´ý LiJ4ž±Vâ JCŠ%ý‰6VR&ÃÞD‘BœHjDù‚JÏ??™¯êBl­cDZñ½§'óU­ëXïUïÞ0æÃywÍį÷j¬é똳€3Å›¾ë˜cj†ù£{¨¥½:GqÄGÿÝñøŸûÚ°N†v;¹¶ç¬“J ‡ÄÐ<û‡É]ŽêëÈóˆ#Ž8âˆ#Ž8âH'§“ÓÉùÍÁGqÄGéätr:9Ï#Ž8âˆ#Ž8âØ“h­ˆ¯NÔt”Œ´Ö_ÝØ>t¹eëìS­¯¦æžù^\g¯õÎQe?ùvuöÌoïÕ;ˆï>ìˆ*ïwlò×mÑ \ No newline at end of file
diff --git a/library/phpqrcode/cache/frame_24.png b/library/phpqrcode/cache/frame_24.png
new file mode 100644
index 000000000..397c64f85
--- /dev/null
+++ b/library/phpqrcode/cache/frame_24.png
Binary files differ
diff --git a/library/phpqrcode/cache/frame_25.dat b/library/phpqrcode/cache/frame_25.dat
new file mode 100644
index 000000000..ba125182e
--- /dev/null
+++ b/library/phpqrcode/cache/frame_25.dat
@@ -0,0 +1,3 @@
+xÚíÛA
+à …á¬së‚‹™]rƒx½Y51mMÈBG
+ÿ¸*Sx|Ua5Ƶ‚Z—Š„-,Ž1ä²HÑPÒRj–šX5§®i†©’áG©>W¥ŽžRïöÕ/Ëâ+uT廯å Ïӯ嗴ªuæÏ¥Ú[Sía£[kví÷5•+5n§Á´JêÜ%+V¬X±bÅŠõ߬u'Á±þÔû SRýå÷štzZ»ì+÷+V¬X±bÅŠ•ÙŸÙŸÙŸûŠ+V¬X±bÅÊìÏìÏìÏ}ÅŠ+V¬X±ö±ª¤¥ÖVI©¢ÖÖ‘+k«qÿ[úËtŽ·oVZÍþvoNV³wÇ}µ{³r<ýR­Þ"RÍÞ]ê W«r} \ No newline at end of file
diff --git a/library/phpqrcode/cache/frame_25.png b/library/phpqrcode/cache/frame_25.png
new file mode 100644
index 000000000..25bc4454a
--- /dev/null
+++ b/library/phpqrcode/cache/frame_25.png
Binary files differ
diff --git a/library/phpqrcode/cache/frame_26.dat b/library/phpqrcode/cache/frame_26.dat
new file mode 100644
index 000000000..d34a73f15
--- /dev/null
+++ b/library/phpqrcode/cache/frame_26.dat
@@ -0,0 +1,2 @@
+xÚí›A
+à E³öÖ…,t§7ˆ7Ñ›U E)i7ï»*~cÃüÅÄXÖEBÆè°FC–˜³6¡:&çL,å¬Mv.ŽÂÎæKgŸÕ¸ãYMç>ŸÎí>ûmÛš·?ª•vô¹¾mg?ßÒ±Îþ³æηªd˜“Cµ¹U¦ÏIk•ÚÚE\ÕÙMs†f˜a†f˜a>œ[sÓˆ9쬩ެ8bö<kÕÙ7œ}ç†k³™§õ™ÿ3Ì0à 3Ì0à 3Ìä*r¹Š\Å7 f˜a†f˜a†fr¹Š\Å7 f˜a†f˜a†YÆÙÎ æd›4ƒ9kíÆÌÔÝyûX y‰gŒØÙ)›«dwnÌ¢ûU×>Ëî”]ßöLgÉÝÁ›³è¾äEo‚ w1 \ No newline at end of file
diff --git a/library/phpqrcode/cache/frame_26.png b/library/phpqrcode/cache/frame_26.png
new file mode 100644
index 000000000..f4a6b3938
--- /dev/null
+++ b/library/phpqrcode/cache/frame_26.png
Binary files differ
diff --git a/library/phpqrcode/cache/frame_27.dat b/library/phpqrcode/cache/frame_27.dat
new file mode 100644
index 000000000..b4d9ffd4f
--- /dev/null
+++ b/library/phpqrcode/cache/frame_27.dat
Binary files differ
diff --git a/library/phpqrcode/cache/frame_27.png b/library/phpqrcode/cache/frame_27.png
new file mode 100644
index 000000000..8419ec230
--- /dev/null
+++ b/library/phpqrcode/cache/frame_27.png
Binary files differ
diff --git a/library/phpqrcode/cache/frame_28.dat b/library/phpqrcode/cache/frame_28.dat
new file mode 100644
index 000000000..8cbaa1961
--- /dev/null
+++ b/library/phpqrcode/cache/frame_28.dat
Binary files differ
diff --git a/library/phpqrcode/cache/frame_28.png b/library/phpqrcode/cache/frame_28.png
new file mode 100644
index 000000000..7609d8e1f
--- /dev/null
+++ b/library/phpqrcode/cache/frame_28.png
Binary files differ
diff --git a/library/phpqrcode/cache/frame_29.dat b/library/phpqrcode/cache/frame_29.dat
new file mode 100644
index 000000000..5e4a71103
--- /dev/null
+++ b/library/phpqrcode/cache/frame_29.dat
@@ -0,0 +1,2 @@
+xÚíÜAƒ …a×Þº ‹™Ü@n7+*¶šÖÚ4‘!Í?®Jšðò ³”抮«]ª—ÉSŸâTf)–ÙsŠIÂ"…È”bžÝ0…Š|•"LuÙ¸î,Ž×EÇ1\6®*ÏuQÞ?¼>aÌÏ…ãþñŽÄRõ-r­“÷n.ïꯋ\®T¿ü:Ó*)|)°À ,°À ,þÑâêóåéx_ã¬}:^R„ƒUoÉ¢‰uÁ~ÁÞ‰X`XÐÐÐа_`X`XÐÐа_`X`XÐÐÐаwbX`¿¥PUõö)DÔÞ"cÈ{‹zçÎõ3ê›é<}¸ó¡^?b÷mÿÎÂìžƒíº°»óaûŽ´’Âê.]
+³{Q6uáT,9 \ No newline at end of file
diff --git a/library/phpqrcode/cache/frame_29.png b/library/phpqrcode/cache/frame_29.png
new file mode 100644
index 000000000..ffe072c86
--- /dev/null
+++ b/library/phpqrcode/cache/frame_29.png
Binary files differ
diff --git a/library/phpqrcode/cache/frame_3.dat b/library/phpqrcode/cache/frame_3.dat
new file mode 100644
index 000000000..188d531c2
--- /dev/null
+++ b/library/phpqrcode/cache/frame_3.dat
@@ -0,0 +1 @@
+xÚí“Á À E{vë&  à&°Y+¢b¤öÐkŸ'yù‘¤¿ÌÁa :äÀTXlÞ¶$W+Óvû®îœ¢9}gRæ¬@H0YPB½ÆÃEmÚÚ?ûœÍ±ísœÖ"bµìt2cnÖé†É:½ﺭë;¿Y§“ÃzÿQã«7¿Ô \ No newline at end of file
diff --git a/library/phpqrcode/cache/frame_3.png b/library/phpqrcode/cache/frame_3.png
new file mode 100644
index 000000000..945ee7cb9
--- /dev/null
+++ b/library/phpqrcode/cache/frame_3.png
Binary files differ
diff --git a/library/phpqrcode/cache/frame_30.dat b/library/phpqrcode/cache/frame_30.dat
new file mode 100644
index 000000000..44cf3d317
--- /dev/null
+++ b/library/phpqrcode/cache/frame_30.dat
Binary files differ
diff --git a/library/phpqrcode/cache/frame_30.png b/library/phpqrcode/cache/frame_30.png
new file mode 100644
index 000000000..75dbddd24
--- /dev/null
+++ b/library/phpqrcode/cache/frame_30.png
Binary files differ
diff --git a/library/phpqrcode/cache/frame_31.dat b/library/phpqrcode/cache/frame_31.dat
new file mode 100644
index 000000000..ce429d0a6
--- /dev/null
+++ b/library/phpqrcode/cache/frame_31.dat
@@ -0,0 +1 @@
+xÚíÜAƒ …a×Þº ØÉ à&r³‚ Á´¸ªÎ4ù§«†´yù‚Ä·!¥mV3Iµv­!ÒœÖ2¢i\NSSä4EF2+65Å¥‰e¾þÃ/Wœs]šñ¾‰!„Á?ÿpÅõû¦=S~ùüÄ?Ëý+þx¦Ö6r6yö³Ùƹ}“Ç´™ë×eR1-W•l°Ál°Á›ûÒŒÞXŸz/>Væ«·ù§:ñÒÒÄAš8üý-+mTíÎÎbl°Ál°ÁlèštMº&]“³l°Ál°Áº&]“®I×ä¼Ál°Ál°Áº&]“®Éyƒ 6Ø`ƒ 6Ø`ƒÍÝi¬uy´ØXWòè±Éi¬²\t†ýz•—Š>•.î”z¾kÊß t²¿7©ß7òwJõÏ”¶4Òw‘ÒˆßÓÖÍ85‰ \ No newline at end of file
diff --git a/library/phpqrcode/cache/frame_31.png b/library/phpqrcode/cache/frame_31.png
new file mode 100644
index 000000000..b14d1fa26
--- /dev/null
+++ b/library/phpqrcode/cache/frame_31.png
Binary files differ
diff --git a/library/phpqrcode/cache/frame_32.dat b/library/phpqrcode/cache/frame_32.dat
new file mode 100644
index 000000000..aaa0808e2
--- /dev/null
+++ b/library/phpqrcode/cache/frame_32.dat
@@ -0,0 +1,2 @@
+xÚíÜÁ
+„ …áÖ¾õ€‹ë.ß ßDßl¬, ¦šMz‰ÿ6›†Ã‡ gcJËD;ô'.®A’IqžÞ‰ÄI,Ir¢Y¨»‘ËFk%‰DþOæy|EDªD×û(LÓ_YÊ>*ßš?aÊOƒ¿k±L_£<[c—ñ¶ï>Êc˘õuÔLIäÕ%Â#Œ0Â#Œ0Â#ŒÞotÑ¢šõµ}ÅÜ4Ífv_)‰ÂE¢pú¬h5R·88³1Â#Œ0Â#Œ0¢ÓÒié´tZÎ#Œ0Â#Œ0Â#Œ0¢ÓÒié´tZÎ#Œ0Â#Œ0Â#Œ0¢ÓÒié´tZÎlŒ0Â#Œ0£÷9q"¢ÉHÜœH™Qþµï"ÛÕL5}-ÝÜY×¾Óê¸kì`¤â>¶z鸳®þÖ4&Òp÷á!‘Šû!«ù`¿:5 \ No newline at end of file
diff --git a/library/phpqrcode/cache/frame_32.png b/library/phpqrcode/cache/frame_32.png
new file mode 100644
index 000000000..58d42db3c
--- /dev/null
+++ b/library/phpqrcode/cache/frame_32.png
Binary files differ
diff --git a/library/phpqrcode/cache/frame_33.dat b/library/phpqrcode/cache/frame_33.dat
new file mode 100644
index 000000000..a2613755a
--- /dev/null
+++ b/library/phpqrcode/cache/frame_33.dat
@@ -0,0 +1,14 @@
+xÚíÜAƒ …a×Þº‰‹™Ü@n7+*L++Ó柮óò‰ÌbbÜ*LCï‘°‡‰c k™H¥rš”j•²J5Yíi~0•_«òŒû×TÊTõ}å—e©>ýö5‘b_åwÐÍŸ?¿¤ßìæ§ÖÜù†\ý­RaÆi+7õßW©¦\ãþwLUNåL¦Â
++¬°Â
++¬°Âêÿ­jßÒO·ŸkcëÞñôç\Ë©|%•o<á‹k–­Lî+Î+Îv¬°Â
++¬°Â
++¬°ÂŠ>}ú ô8¯°Â
++¬°Â
++¬°Â
++ú ôè3Ðgà¼Â
++¬°Â
++¬°Â
++¬è3Ðg Ï@Ÿó
++¬°Â
++¬°Â
++¬°:R‰¨ªX³ÚB‰9«”IÔ=çkÞ±o/Swçؘ™Ù¯Ï`g¶áÅÊÌÈr_Ù™™Y¾ƒVSY™ÅzIefnmQoz >á \ No newline at end of file
diff --git a/library/phpqrcode/cache/frame_33.png b/library/phpqrcode/cache/frame_33.png
new file mode 100644
index 000000000..924c728e0
--- /dev/null
+++ b/library/phpqrcode/cache/frame_33.png
Binary files differ
diff --git a/library/phpqrcode/cache/frame_34.dat b/library/phpqrcode/cache/frame_34.dat
new file mode 100644
index 000000000..7ceb0259d
--- /dev/null
+++ b/library/phpqrcode/cache/frame_34.dat
Binary files differ
diff --git a/library/phpqrcode/cache/frame_34.png b/library/phpqrcode/cache/frame_34.png
new file mode 100644
index 000000000..a477042d8
--- /dev/null
+++ b/library/phpqrcode/cache/frame_34.png
Binary files differ
diff --git a/library/phpqrcode/cache/frame_35.dat b/library/phpqrcode/cache/frame_35.dat
new file mode 100644
index 000000000..56bc3e28e
--- /dev/null
+++ b/library/phpqrcode/cache/frame_35.dat
Binary files differ
diff --git a/library/phpqrcode/cache/frame_35.png b/library/phpqrcode/cache/frame_35.png
new file mode 100644
index 000000000..d29806c60
--- /dev/null
+++ b/library/phpqrcode/cache/frame_35.png
Binary files differ
diff --git a/library/phpqrcode/cache/frame_36.dat b/library/phpqrcode/cache/frame_36.dat
new file mode 100644
index 000000000..282c60d23
--- /dev/null
+++ b/library/phpqrcode/cache/frame_36.dat
Binary files differ
diff --git a/library/phpqrcode/cache/frame_36.png b/library/phpqrcode/cache/frame_36.png
new file mode 100644
index 000000000..96ecb4213
--- /dev/null
+++ b/library/phpqrcode/cache/frame_36.png
Binary files differ
diff --git a/library/phpqrcode/cache/frame_37.dat b/library/phpqrcode/cache/frame_37.dat
new file mode 100644
index 000000000..015c0f24b
--- /dev/null
+++ b/library/phpqrcode/cache/frame_37.dat
Binary files differ
diff --git a/library/phpqrcode/cache/frame_37.png b/library/phpqrcode/cache/frame_37.png
new file mode 100644
index 000000000..fcc51627d
--- /dev/null
+++ b/library/phpqrcode/cache/frame_37.png
Binary files differ
diff --git a/library/phpqrcode/cache/frame_38.dat b/library/phpqrcode/cache/frame_38.dat
new file mode 100644
index 000000000..71cf53eb5
--- /dev/null
+++ b/library/phpqrcode/cache/frame_38.dat
@@ -0,0 +1 @@
+xÚíÝAªƒ0ÐŽÝuÁA2«;ÐèÎkü(üg¾Ày•tp9Äï$Ëò™¹Dœ”ò¼\ºe^'tÒ-aIºŠFMšSškÂðIóŤÓ:7®¤|LúkŸNã8N7®œöi}ö‡×Ÿi,Ÿ[W†¿g®Ó´Ì°ë?3ô1÷i™¾N·}}=ÂOM:4“”)S¦L™2eÊ”)S¦L#$½ÿ ôÂJã­þÂJM:}ý]˜•ÖL›Ù§ÎSÿQL™2eÊ”)S¦L™2Õ¡èPt(:Šó”)S¦L™2eÊ”)S¦:ŠE‡¢Cqž2eÊ”)S¦L™2eÊ”©E‡¢CÑ¡8O™2eÊ”)S¦L™2eÊT‡¢CÑ¡èPœ§L™2eÊ”)S¦L™2Ý“¦”sJCIKÖÔ‚iÍ93ônº_Ñò ÿ¾¿ü¼“+R‡û®£“ièû£Žû4ö\Çg¿¥¤‘ïŽ;% }ßaÞnŽ£ \ No newline at end of file
diff --git a/library/phpqrcode/cache/frame_38.png b/library/phpqrcode/cache/frame_38.png
new file mode 100644
index 000000000..89238f3c5
--- /dev/null
+++ b/library/phpqrcode/cache/frame_38.png
Binary files differ
diff --git a/library/phpqrcode/cache/frame_39.dat b/library/phpqrcode/cache/frame_39.dat
new file mode 100644
index 000000000..53511f736
--- /dev/null
+++ b/library/phpqrcode/cache/frame_39.dat
Binary files differ
diff --git a/library/phpqrcode/cache/frame_39.png b/library/phpqrcode/cache/frame_39.png
new file mode 100644
index 000000000..1dc9cd1bc
--- /dev/null
+++ b/library/phpqrcode/cache/frame_39.png
Binary files differ
diff --git a/library/phpqrcode/cache/frame_4.dat b/library/phpqrcode/cache/frame_4.dat
new file mode 100644
index 000000000..67b30e82a
--- /dev/null
+++ b/library/phpqrcode/cache/frame_4.dat
@@ -0,0 +1 @@
+xÚí”Á À E=»uÐ pجQ•ØCOMŸ'ÃË$ ³@à¨Ø3e–F©\FNXRyÉؾC{‰a8­Ræ Ńa2@ñ圉qküßÉH1ê(£ˆÅ`cç¦j³~Ë0ö¥¿ÃܨÖËÃعnXÿGåÿÄ€ \ No newline at end of file
diff --git a/library/phpqrcode/cache/frame_4.png b/library/phpqrcode/cache/frame_4.png
new file mode 100644
index 000000000..b72f9e70d
--- /dev/null
+++ b/library/phpqrcode/cache/frame_4.png
Binary files differ
diff --git a/library/phpqrcode/cache/frame_40.dat b/library/phpqrcode/cache/frame_40.dat
new file mode 100644
index 000000000..90d36dd13
--- /dev/null
+++ b/library/phpqrcode/cache/frame_40.dat
@@ -0,0 +1,2 @@
+xÚíÝAŠƒ@Ь½õ€‹îÞ@o¢7“˜`“Qfeºä•«PA>¦ÀÚô<?jjo5WNiz›yºWý‰ó´&]ß…C?“IœrþWâñ^;ï8·—
+ãýs<ðûöS{Å9^gEß}>ã°<]ßÕÐëß³bZ«nã¥^A›öQ}[÷9^ª]«yþìnajM܇K̘1cÆŒ3f̘1ã¸Æ{ßW5}ç½{ÍÑ7lMßÒïÞšxÜI<¼áK½¨Æáαyl3f̘1cÆŒ3f̘1ã«Û»Ù»={·“αyl3f̘1cÆŒ3f̘1ã«Û»Ù»={·“αyl3f̘1cÆŒ3f̘1ã«Û»Ù»={·“αyl3f̘1cÆŒ3f̘1ã«Û»Ù»={·“αyl3f̘1cÆŒ3f̘ñ÷çœSÊ‘ŒÓ’7¥HÆKÞ¼g\ç¾âuõßÏ_ÿªr'4Ü[çÞ-Æ]›…qˆûL·ç8ƱÛY1q„»‹Ä!î—ÞÔ/(%û \ No newline at end of file
diff --git a/library/phpqrcode/cache/frame_40.png b/library/phpqrcode/cache/frame_40.png
new file mode 100644
index 000000000..8034d862d
--- /dev/null
+++ b/library/phpqrcode/cache/frame_40.png
Binary files differ
diff --git a/library/phpqrcode/cache/frame_5.dat b/library/phpqrcode/cache/frame_5.dat
new file mode 100644
index 000000000..d5dafe186
--- /dev/null
+++ b/library/phpqrcode/cache/frame_5.dat
@@ -0,0 +1 @@
+xÚí”1À E½u 7ЛÀÍZµ‡|N†—üD B0@R$l,-™>VKZ[<ýØÚz—qÆŽ¨ØYJ&ƒiåš‚‹ZyË:Y'ë¯YµÁVÿ&—e•RÄ"§sj©Ýrþö+Ëé‰ù.·MÆŽ»–Ó9ÓòzµsŽ”É, \ No newline at end of file
diff --git a/library/phpqrcode/cache/frame_5.png b/library/phpqrcode/cache/frame_5.png
new file mode 100644
index 000000000..96b6494f3
--- /dev/null
+++ b/library/phpqrcode/cache/frame_5.png
Binary files differ
diff --git a/library/phpqrcode/cache/frame_6.dat b/library/phpqrcode/cache/frame_6.dat
new file mode 100644
index 000000000..0fc3d039e
--- /dev/null
+++ b/library/phpqrcode/cache/frame_6.dat
Binary files differ
diff --git a/library/phpqrcode/cache/frame_6.png b/library/phpqrcode/cache/frame_6.png
new file mode 100644
index 000000000..05ca358b0
--- /dev/null
+++ b/library/phpqrcode/cache/frame_6.png
Binary files differ
diff --git a/library/phpqrcode/cache/frame_7.dat b/library/phpqrcode/cache/frame_7.dat
new file mode 100644
index 000000000..43375960f
--- /dev/null
+++ b/library/phpqrcode/cache/frame_7.dat
Binary files differ
diff --git a/library/phpqrcode/cache/frame_7.png b/library/phpqrcode/cache/frame_7.png
new file mode 100644
index 000000000..7d2ff4f3e
--- /dev/null
+++ b/library/phpqrcode/cache/frame_7.png
Binary files differ
diff --git a/library/phpqrcode/cache/frame_8.dat b/library/phpqrcode/cache/frame_8.dat
new file mode 100644
index 000000000..669b325f3
--- /dev/null
+++ b/library/phpqrcode/cache/frame_8.dat
Binary files differ
diff --git a/library/phpqrcode/cache/frame_8.png b/library/phpqrcode/cache/frame_8.png
new file mode 100644
index 000000000..db1f1877a
--- /dev/null
+++ b/library/phpqrcode/cache/frame_8.png
Binary files differ
diff --git a/library/phpqrcode/cache/frame_9.dat b/library/phpqrcode/cache/frame_9.dat
new file mode 100644
index 000000000..d79295ee0
--- /dev/null
+++ b/library/phpqrcode/cache/frame_9.dat
Binary files differ
diff --git a/library/phpqrcode/cache/frame_9.png b/library/phpqrcode/cache/frame_9.png
new file mode 100644
index 000000000..74ddf08da
--- /dev/null
+++ b/library/phpqrcode/cache/frame_9.png
Binary files differ
diff --git a/library/phpqrcode/cache/mask_0/mask_101_0.dat b/library/phpqrcode/cache/mask_0/mask_101_0.dat
new file mode 100644
index 000000000..51deabaef
--- /dev/null
+++ b/library/phpqrcode/cache/mask_0/mask_101_0.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_0/mask_105_0.dat b/library/phpqrcode/cache/mask_0/mask_105_0.dat
new file mode 100644
index 000000000..97e9e5dff
--- /dev/null
+++ b/library/phpqrcode/cache/mask_0/mask_105_0.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_0/mask_109_0.dat b/library/phpqrcode/cache/mask_0/mask_109_0.dat
new file mode 100644
index 000000000..eadf83a2c
--- /dev/null
+++ b/library/phpqrcode/cache/mask_0/mask_109_0.dat
@@ -0,0 +1,2 @@
+xÚíÚ=
+€0 н§iï9'Åb‡$ ¾tËýáÚû^#iª¥Ëi?³ÅôÛbúK[AUØFå¾ÆµÄ³x]mŸ]2Ž-Ä–KŽ~ ÏVw}¶X›ûÆÆÆÆÆÆÆ&O²É“Þ666666yRž”'½%lllll/´åhœl…Ãîm ¹¤êádël™¶´3Ù+ïÛmÍ« \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_0/mask_113_0.dat b/library/phpqrcode/cache/mask_0/mask_113_0.dat
new file mode 100644
index 000000000..5eb7f5de2
--- /dev/null
+++ b/library/phpqrcode/cache/mask_0/mask_113_0.dat
@@ -0,0 +1,2 @@
+xÚíÚ;
+…0Ð>«Iö¿9+Eñƒ‚sá=ϤL1Ì„[¤÷¹FáZU‹4‡?i<ÿç;7çòç;‡ÆP¥Œ#ýW-[ñݯ6÷µddddddüc",;í"¼Ÿskæ‘‘‘‘‘‘‘‘Q&—Éerw######£L.¯Êäæ‘‘‘‘‘‘‘±Ð˜y¼1†^˲\òîÆØ3Æâ³ÚÓóøÏÆ ‘Ñv \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_0/mask_117_0.dat b/library/phpqrcode/cache/mask_0/mask_117_0.dat
new file mode 100644
index 000000000..781c7f875
--- /dev/null
+++ b/library/phpqrcode/cache/mask_0/mask_117_0.dat
@@ -0,0 +1,2 @@
+xÚíÚA
+„0 Ð}OÓÞÿr³R,#3öñ¥Ë,âÃþ¢½o5ŸCµØÐq:õõÖ;;¬wvN­ÁJZGÅ=Œm»û}Úö ѱ¬¬¬¬¬¬¬¬µ¦2âÞi‹RïïkÆj_YYYYYYYYeÙ_ö·¯¬¬¬¬¬¬¬¬²¿ì/ûÛWVVVVVVÖkîáýd-úϺ,#¦ßÀOÖÎZc]|‡{ž¾Áúˆ­$™ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_0/mask_121_0.dat b/library/phpqrcode/cache/mask_0/mask_121_0.dat
new file mode 100644
index 000000000..68810c347
--- /dev/null
+++ b/library/phpqrcode/cache/mask_0/mask_121_0.dat
@@ -0,0 +1 @@
+xÚíÛ1„ ОÓÀý/·•w YMüSø Ä8>2SÐûÖF O­EÓÈÌÓc«W\ûÛ¼š‹{c§æpK›GÕžB·ÐšþímûŽxhfffffffæ/s2ÛÇÚ2W|*÷d®1ÛÏÌÌÌÌÌÌÌÌÌê*5³ºÊÆÌÌÌÌÌÌÌ̬®RW©«œaÌÌÌÌÌÌÌÌsöòËÁ\xm~8ß®¸ƒr0wæjsdm÷ªýü&óâyÙ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_0/mask_125_0.dat b/library/phpqrcode/cache/mask_0/mask_125_0.dat
new file mode 100644
index 000000000..2c73ef1a8
--- /dev/null
+++ b/library/phpqrcode/cache/mask_0/mask_125_0.dat
@@ -0,0 +1,2 @@
+xÚíÛA
+€ н§Ñû_®•‘TH`3AO—L4ü kí£ÍÃ(áÍÛewö›GWÖÙ××.í #ÃÞ2¿û¡} \ëçYú»¤´gggggggggg_d>Ïïµòj^™ÕØsíö;;;;;;;;;;»'ÇÉqö;;;;;;;;;»'Ë°ËqþuììììììììµÇ_Pì‰Íçö—ÏóYwÄ{eÿš=dÍ×ÌýþGû/ý“¸ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_0/mask_129_0.dat b/library/phpqrcode/cache/mask_0/mask_129_0.dat
new file mode 100644
index 000000000..812ee8a66
--- /dev/null
+++ b/library/phpqrcode/cache/mask_0/mask_129_0.dat
@@ -0,0 +1,2 @@
+xÚíÛ1
+Å ÀÞÓèý/—*Ÿ„DøEØ'ÉhgõtÙ-ì}_£pV‹· \"Ìb=sþ—ÁÌå™ó[ƒÐJŒô=8DhÅoàºÛž' 0XÐ ÑüÎÛ´©è‘¬e 0`À€ ˜ôÊ Ì j" 0`ÀÀ¼ Wf`^P0`À€æ½2ó‚šÈ€ ¼Ò óÉôd07(ì“<OÁŠåo¡§ëÁ— 6 ÎSÞ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_0/mask_133_0.dat b/library/phpqrcode/cache/mask_0/mask_133_0.dat
new file mode 100644
index 000000000..03b41d36d
--- /dev/null
+++ b/library/phpqrcode/cache/mask_0/mask_133_0.dat
@@ -0,0 +1,2 @@
+xÚíÛ1
+€0 н§Iï9§Š¢ÚTyí–)<4äh§N¾‡SÒš¨·]°èZŒ­?¶[¿µH<™u…ïâÐFIø7®·´žRÛ`Á‚ ,X°ø±EÖÞ¹×Ë´]»Wg±¦…yÁ‚ ,X°`!ØÁYÈ#æ ,X°`Á‚…<"È#æ ,X°`Á‚…<bg!˜,X°`Á‚‹WyÉO 4Ñ·˜¸wf¿á>Y‹/XLÿGb…yÁ"êpT \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_0/mask_137_0.dat b/library/phpqrcode/cache/mask_0/mask_137_0.dat
new file mode 100644
index 000000000..f6d993b03
--- /dev/null
+++ b/library/phpqrcode/cache/mask_0/mask_137_0.dat
@@ -0,0 +1 @@
+xÚíÜ1„ ОÓÀý/·•+FÉZ?®JšÉ Læ7Ôº¬ØÝ*ÑBÚa%L~šŒË»òä”ÉØéÊ“C“ðJ›´YîIWJ ½™ý.K]ñR˜0a„ “›$ç“ïINTwÎlLža¢Ÿè±L˜0a„ &Ld@PÔO˜0a„ &L˜0‘e@P?a„ &L˜0aÂD”e@ý„ &L˜0aÂäÏM²ŸIlL&)dl˜ígøÃacR™<É$övê,ý„ɺ?U2ç] \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_0/mask_141_0.dat b/library/phpqrcode/cache/mask_0/mask_141_0.dat
new file mode 100644
index 000000000..8c685c8ea
--- /dev/null
+++ b/library/phpqrcode/cache/mask_0/mask_141_0.dat
@@ -0,0 +1,2 @@
+xÚíÜ=
+€0 н§iï9'EÑúÖDx͘%<lð[Zë|ZP­N ¦NÃæ‘MÌ7;·múfovmœ 6-Ów³§Þ¥}•y¶ã°aÆ 6lØ°ný_¼tÊeÒivØüËƾ±‹Ù°aÆ 6lØÈšòYÓ.fÆ 6lØ°a#kÊSldMû† 6lØ°aÆ YSÖ”5í6lØ°aÆ 6ƒmâœÙØ$æÜ& 3dyãecSÙüÙ&ìNÕLû†Í¾&ëîº< \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_0/mask_145_0.dat b/library/phpqrcode/cache/mask_0/mask_145_0.dat
new file mode 100644
index 000000000..9c9c1ae19
--- /dev/null
+++ b/library/phpqrcode/cache/mask_0/mask_145_0.dat
@@ -0,0 +1,2 @@
+xÚíÜ;
+…0Ð>«Iö¿9+EñÇ{ˆõ$åm†ƒ^˜&µŽ§u¼³S"µÍDŒþ6ÚŸ]9ùÉè8ìU“M£“bÔÒ¾£Y¤Òù[ß2拉Ĉ#FŒ1bĈ£Ï%ôµiRNšæ½–ѳì#;›#FŒ1bĈ‘N«¯1Òií#FŒ1bĈ#FŒtZ}‘Nk1bĈ#FŒ1b¤ÓêkŒtZ;›#FŒ1bÄèõFV-ŒÂuè"IoD-Œ*£7uû×jÚ>b´MV“+ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_0/mask_149_0.dat b/library/phpqrcode/cache/mask_0/mask_149_0.dat
new file mode 100644
index 000000000..d25835029
--- /dev/null
+++ b/library/phpqrcode/cache/mask_0/mask_149_0.dat
@@ -0,0 +1,3 @@
+xÚíÜA
+€ н§Ñû_®MEQXP৞.Ý|94³°ÖeµÁ{³JL¨všŠÕ#«^Ü÷Ïn[õ ß?;µ
+ZIV-ñ»ÚÄ*wï¸Ë’1*+V¬X±bÅŠ«ßX¥ü·¯g¥ÛwŒèqX}ÇJ½RÛY±bÅŠ+V¬X±beΠwfeΠ^±bÅŠ+V¬X±bÅÊœAïÌÊœA½bÅŠ+V¬X±bÅŠ•9ƒÞÙœÁœA½bÅŠ+V¬X±bÅŠÕl•ó0ÞÎ*0Tßj`?˜öÝΪ²ú¢Õð;Xë«ë=zZr* \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_0/mask_153_0.dat b/library/phpqrcode/cache/mask_0/mask_153_0.dat
new file mode 100644
index 000000000..fc79e9ede
--- /dev/null
+++ b/library/phpqrcode/cache/mask_0/mask_153_0.dat
@@ -0,0 +1 @@
+xÚíÜ1€ ÐÓÀý/礑h¢&F¾ú`ìÒ¼@I;Pë¼ZÀ^­•XÛÍŒÙmfÏÆ.™=Û5 [if-õœ­R+!wr»Ëœg\j̘1cÆŒ3f̘1cf–Ôo.±2¬?Š1ûž™zæ `ÆŒ3f̘1cÆŒ™¹†™¹†zÆŒ3f̘1cÆŒ3fæztfæê3f̘1cÆŒ3f̘™k˜k03×ð0cÆŒ3f̘1cö³¬Ï9;³ÐÄŽÍö›‰`vf•Ù̆ßÍšZϘ߶W9 \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_0/mask_157_0.dat b/library/phpqrcode/cache/mask_0/mask_157_0.dat
new file mode 100644
index 000000000..ad749f305
--- /dev/null
+++ b/library/phpqrcode/cache/mask_0/mask_157_0.dat
@@ -0,0 +1,2 @@
+xÚíÜA
+€ н§Ñû_®•QRù©§»Y ùkí«…ìÍ*q͵ÓîØ=j7§~ÙnNýÔ.p%Úµäs·i¯ÝÕã.½×ÈöرcÇŽ;vìر{Ù.-W¬õ2={êì¾mgÞy+رcÇŽ;vìØɳ2;yÖ¼cÇŽ;vìرcÇNž•ÉØɳæ;vìرcÇŽ;v2™<ËNžõV°cÇŽ;vìر“ge2vò¬yÇŽ;vìرcÇî¦]ÞÂ;»àæÆv¹"õÞ]e÷'»˜;[“ç»û{¾|Aµ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_0/mask_161_0.dat b/library/phpqrcode/cache/mask_0/mask_161_0.dat
new file mode 100644
index 000000000..4bdc5fdd3
--- /dev/null
+++ b/library/phpqrcode/cache/mask_0/mask_161_0.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_0/mask_165_0.dat b/library/phpqrcode/cache/mask_0/mask_165_0.dat
new file mode 100644
index 000000000..3a17a0510
--- /dev/null
+++ b/library/phpqrcode/cache/mask_0/mask_165_0.dat
@@ -0,0 +1,2 @@
+xÚíÝ;
+€0À>§Iî9+ÅàDyÁIÊ4Ë ÷5Ö:¯¶W«ÄÙv«dù¢åqñߜܴ<þæd×2x%[¶žËU™%ðÝÞî2×]&K–,Y²dÉ’%Ë¡,S¿Õ—“r2ydÌ=,ÿk©_º{X²dÉ’%K–,Y²d)Û0³”mè—,Y²dÉ’%K–,Y²d)Û0³”mè—,Y²dÉ’%K–,Y²”m˜Çe,eú%K–,Y²dÉ’%K–,eæq–² ýÒÝÃ’%K–,Y²dÉ’å…eî:ËŠ<³Œš!Óÿ¡ÐYV–,ßñ:B¿dù|O¨$*# \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_0/mask_169_0.dat b/library/phpqrcode/cache/mask_0/mask_169_0.dat
new file mode 100644
index 000000000..c4787d9db
--- /dev/null
+++ b/library/phpqrcode/cache/mask_0/mask_169_0.dat
@@ -0,0 +1,2 @@
+xÚíÝ1
+€0À>¯Iþÿ9EQÑ=˜¤Ls æä¶IïË{³Zt¡ã´R¦™þ}òÀôï“SÓð•n:ª|§›R[è?î¶Ô_*S¦L™2eÊ”)S¦L™™&ϦëI šê¯O˜2ÕOý£˜2eÊ”)S¦L™2e*C1ïËP˜ÊPôS¦L™2eÊ”)S¦L™ÊPÌû2¦2ý”)S¦L™2eÊ”)S¦Le(æ}¦2ý”)S¦L™2eÊ”)S¦Le(æ}¦2ý”)S¦L™2eÊ”)S¦³iöc7;Ó"…Þ™FͦÞÙ™v¦L Üý^¥Ÿ2}oOäß'r \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_0/mask_173_0.dat b/library/phpqrcode/cache/mask_0/mask_173_0.dat
new file mode 100644
index 000000000..5ef85e7ad
--- /dev/null
+++ b/library/phpqrcode/cache/mask_0/mask_173_0.dat
@@ -0,0 +1 @@
+xÚíÝ1ƒ0ÀÞ¯±ÿÿ¹T ¥ˆ¬[4véæ2ŠØƽok݇ÕÊ;¦Ó²]fûôÖžýdûä½ölj°lGÒÿö0n+œß»m³GŒË–-[¶lÙ²eû"Ûêï·ûY»}o¯öíÀ–íÕVÞÊ[¶lÙ²eË–-[¶lÙ²e«ÓÕ°ÕƒÉ[Ï2¶lÙ²eË–-[¶lÙ²e«ÓÕ°ÕƒÉ[Ï2¶lÙ²eË–-[¶lÙ²e«ÓÕ°ÕƒÉ[¶lÙ²eË–-[¶lÙ²eËV¦«a«“·lÙ²eË–-[¶lÙ²ef[ÿB°“mа÷¶Eû„”;¶N¶-ÛœT¸/r’·lÿ¿?ØÔ*Ñ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_0/mask_177_0.dat b/library/phpqrcode/cache/mask_0/mask_177_0.dat
new file mode 100644
index 000000000..78a26a77b
--- /dev/null
+++ b/library/phpqrcode/cache/mask_0/mask_177_0.dat
@@ -0,0 +1,2 @@
+xÚíÝ1
+…0Ð>§Iî9+?Š²Øèß—”iÖ‡ dšÌ¹¯ÕxÖˆxÝNÌø/ÆÕ§|{öظ²ÿöìÖ8d¥¯´ÿø0òhž×=öùcFf̘1cÆŒ3f̘q¼qÂ=ïw6Ê;l·»4cÆ•±<–ÇŒ3f̘1cÆŒ3fÌXï¦Ò»1Ö»ÉcÆŒ3f̘1cÆŒ3fÌXï¦b¬w“ÇŒ3f̘1cÆŒ3f̘±ÞM'ÄXï&å1cÆŒ3f̘1cÆŒ3Ö»é„ônŒõnò˜1cÆŒ3f̘1cÆŒÃ3U<‡ \7í+’Þ(<OÆŒŸ·ÎŠ™–ÇŒßÛÕä4@ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_0/mask_21_0.dat b/library/phpqrcode/cache/mask_0/mask_21_0.dat
new file mode 100644
index 000000000..368c9941f
--- /dev/null
+++ b/library/phpqrcode/cache/mask_0/mask_21_0.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_0/mask_25_0.dat b/library/phpqrcode/cache/mask_0/mask_25_0.dat
new file mode 100644
index 000000000..e4a5b6d8a
--- /dev/null
+++ b/library/phpqrcode/cache/mask_0/mask_25_0.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_0/mask_29_0.dat b/library/phpqrcode/cache/mask_0/mask_29_0.dat
new file mode 100644
index 000000000..74a216b4f
--- /dev/null
+++ b/library/phpqrcode/cache/mask_0/mask_29_0.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_0/mask_33_0.dat b/library/phpqrcode/cache/mask_0/mask_33_0.dat
new file mode 100644
index 000000000..2ec712a7a
--- /dev/null
+++ b/library/phpqrcode/cache/mask_0/mask_33_0.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_0/mask_37_0.dat b/library/phpqrcode/cache/mask_0/mask_37_0.dat
new file mode 100644
index 000000000..1588cfce1
--- /dev/null
+++ b/library/phpqrcode/cache/mask_0/mask_37_0.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_0/mask_41_0.dat b/library/phpqrcode/cache/mask_0/mask_41_0.dat
new file mode 100644
index 000000000..e369027e3
--- /dev/null
+++ b/library/phpqrcode/cache/mask_0/mask_41_0.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_0/mask_45_0.dat b/library/phpqrcode/cache/mask_0/mask_45_0.dat
new file mode 100644
index 000000000..452f126c8
--- /dev/null
+++ b/library/phpqrcode/cache/mask_0/mask_45_0.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_0/mask_49_0.dat b/library/phpqrcode/cache/mask_0/mask_49_0.dat
new file mode 100644
index 000000000..fdd2aac15
--- /dev/null
+++ b/library/phpqrcode/cache/mask_0/mask_49_0.dat
@@ -0,0 +1,2 @@
+xÚíÕKÀ EÑ9«ýo®#?H/›6g$Ï-ª­,X]
+˜›xݘ;Àð·˜ XÔ°ì9ºˆ<ÜѺ¤åq¤Œ2 Af÷îHð7ø/5We„{Ô#ØáìfÞ¨ÁÐ?à®4û=N >Çæ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_0/mask_53_0.dat b/library/phpqrcode/cache/mask_0/mask_53_0.dat
new file mode 100644
index 000000000..572d279ef
--- /dev/null
+++ b/library/phpqrcode/cache/mask_0/mask_53_0.dat
@@ -0,0 +1,2 @@
+xÚíÖK
+@!й«Ñýo®QÑϺ:(m&ܯžs-¹¬®É6õÑZ{¥m4Y†²Xâù®.FÀÙ­‹ê¦XZi·Ðùj=:έ֋bå¿‘VH 8 –#¤[—ù²¾‹ãYвç¾^XÔ÷e \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_0/mask_57_0.dat b/library/phpqrcode/cache/mask_0/mask_57_0.dat
new file mode 100644
index 000000000..ea81e6dc6
--- /dev/null
+++ b/library/phpqrcode/cache/mask_0/mask_57_0.dat
@@ -0,0 +1,4 @@
+xÚíÖA
+À À{^“üÿs=YLÕš (
+ou¨– j) ¬ª
+Z7y„ÙëÍñv,Ô´ìwVQ ži»¤ìGiÒ¤¹ÅDfÂÛ•ÉÄwo4ùѤ¹ÐÄoÎLÿÌéLȼÁœ©·›Á³Õì}î4 hå \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_0/mask_61_0.dat b/library/phpqrcode/cache/mask_0/mask_61_0.dat
new file mode 100644
index 000000000..93d2444d8
--- /dev/null
+++ b/library/phpqrcode/cache/mask_0/mask_61_0.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_0/mask_65_0.dat b/library/phpqrcode/cache/mask_0/mask_65_0.dat
new file mode 100644
index 000000000..df29d7bfb
--- /dev/null
+++ b/library/phpqrcode/cache/mask_0/mask_65_0.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_0/mask_69_0.dat b/library/phpqrcode/cache/mask_0/mask_69_0.dat
new file mode 100644
index 000000000..8a2cfbd7c
--- /dev/null
+++ b/library/phpqrcode/cache/mask_0/mask_69_0.dat
@@ -0,0 +1 @@
+xÚí×KÀ Ð=§û_®+­mÏBìà’d|Q"s+1®®È"¯),ß=“EÛàa TÄ"çÒÅãnæE-3 ,°ÀKY‹wÝ=ZšZïT Þ.,°ÀK1‹ÿ#<XBtËâ<Šþa ÿÇbº#Îx/;X.®‡Ô \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_0/mask_73_0.dat b/library/phpqrcode/cache/mask_0/mask_73_0.dat
new file mode 100644
index 000000000..3de460662
--- /dev/null
+++ b/library/phpqrcode/cache/mask_0/mask_73_0.dat
@@ -0,0 +1 @@
+xÚíØ1À …áÓÀý/×ÉFSM(´Æ7†—/JTmeÓ•¤‚lš´É×s™|½©)YY“UÝS%Á7{i¹é(L˜0moÊ짻'¯÷ãªw‚‰Ç„ {œ=ÎŒcÂô)÷2˜Š‚Ö¦À~ªøÃLz–)üvZ5O2]=Œó? \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_0/mask_77_0.dat b/library/phpqrcode/cache/mask_0/mask_77_0.dat
new file mode 100644
index 000000000..2717fd86b
--- /dev/null
+++ b/library/phpqrcode/cache/mask_0/mask_77_0.dat
@@ -0,0 +1,2 @@
+xÚíØA€ DÑ}OÓÞÿr®0  ÎBÃ/;b†Hp/‹­*K‡E7íG¶þã/_l}ïxˆ‹MP
+[(ç­Š³ÄZÞ›•lI6lض´eÏ·³×Oû˜ìÝÍÆ^À† 6î,î,ö6lØ&lù³Æ& ÛÏ^ÕWcó}m©5uåÿöEÛ;âe \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_0/mask_81_0.dat b/library/phpqrcode/cache/mask_0/mask_81_0.dat
new file mode 100644
index 000000000..2d9a052fc
--- /dev/null
+++ b/library/phpqrcode/cache/mask_0/mask_81_0.dat
@@ -0,0 +1,2 @@
+xÚíØ1€ …ὧiï9'•Bß ñ‡áñE¤Mpo#
+³& ŒaâÙ6ãõ)cæ~Úèb •1Ôß±‹´âߧµ|Y$FŒ1Nõq_·´.¯Ôð¿¹31bĈ‘~M¿æÎ`Ĉco{B£807úŒòôdtŒ’³võÿøfãßØÜþ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_0/mask_85_0.dat b/library/phpqrcode/cache/mask_0/mask_85_0.dat
new file mode 100644
index 000000000..eb8197b20
--- /dev/null
+++ b/library/phpqrcode/cache/mask_0/mask_85_0.dat
@@ -0,0 +1,2 @@
+xÚíØ1
+À …á=§Iî¹NE‘Z_†À· ¯m E÷Vqyº2Yh,S‹[ÏúŸ­gý¥UXJkd¼×.Öß~>Öž!ÅŠ+V¬å¬ª½õöí÷.Ýõ±2¯X±bÅŠ•ÿ¬Ì+V¬X±–²ê.ökBèÞz±·ÔwðƒÕ±¦Ì€gÌkë¡YZý \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_0/mask_89_0.dat b/library/phpqrcode/cache/mask_0/mask_89_0.dat
new file mode 100644
index 000000000..aaa4c5267
--- /dev/null
+++ b/library/phpqrcode/cache/mask_0/mask_89_0.dat
@@ -0,0 +1 @@
+xÚíÙ1€ …ὧiï9'Œˆ€Ñ×ýËHl?Lšà^"ë&M—™?bî—qÃÜ?˸äÉ,µ9²þó!µ‰z¢]VêÈScÆŒ3æ_š•÷à¾cÓé!î`nÍô3f̘1cÆÌŒ„™ 3f̘1/fÖ>.Uæ¤ÄcóË»;ã ¨2;æ™YÒžÕÏ+™7Þý \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_0/mask_93_0.dat b/library/phpqrcode/cache/mask_0/mask_93_0.dat
new file mode 100644
index 000000000..e218fa0ef
--- /dev/null
+++ b/library/phpqrcode/cache/mask_0/mask_93_0.dat
@@ -0,0 +1,3 @@
+xÚíÙK
+À EÑyV÷¿¹Ž,ÚO¬mÞ rãPHŽ0 {’´š°ôäå2ûbö¨ìýÞc{t¦Qáƒ]
+{QÞ{“Þ{弬֒¤ÇŽ;vìØ_Ú³ßÕ}ÏÂ÷ýËL€}l§ß±cÇŽ;vì̑̑̑رcÇŽû¢öüÐÎ.LÛæÕegwì3ö´žqe¿ÿѾ@i \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_0/mask_97_0.dat b/library/phpqrcode/cache/mask_0/mask_97_0.dat
new file mode 100644
index 000000000..74ac719d0
--- /dev/null
+++ b/library/phpqrcode/cache/mask_0/mask_97_0.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_1/mask_101_1.dat b/library/phpqrcode/cache/mask_1/mask_101_1.dat
new file mode 100644
index 000000000..ec939b521
--- /dev/null
+++ b/library/phpqrcode/cache/mask_1/mask_101_1.dat
@@ -0,0 +1,2 @@
+xÚíÖ1
+À н§‰÷¿\Q÷ªEóþ¢d  1¢¦ÌNô<±#½ËÕ–¯Õ-7u™þ.ÃÓl²Ô¦eiXXXXXRZVíÊVeIo1û,,,,,v%‹?ŒÙgaaaa±÷YÌ K&K=/·œ·+Ûå˱ó²Öò¼ÞŽã \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_1/mask_105_1.dat b/library/phpqrcode/cache/mask_1/mask_105_1.dat
new file mode 100644
index 000000000..e1f5c99b4
--- /dev/null
+++ b/library/phpqrcode/cache/mask_1/mask_105_1.dat
@@ -0,0 +1 @@
+xÚíÖ1€ ÐÝÓ”û_Î¥‡b€÷ KóB¬?"Ó*#WÌʘt€éÍùíügÓŽ“JîéqUM9¸•‡‰‰‰‰©ÔTùêçLLv“¾Ç¤ïÙLLLLLLz“¾gG01111šòy„iåÑߘ–4mð=Õ›n§¥+2 \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_1/mask_109_1.dat b/library/phpqrcode/cache/mask_1/mask_109_1.dat
new file mode 100644
index 000000000..7e0d6d164
--- /dev/null
+++ b/library/phpqrcode/cache/mask_1/mask_109_1.dat
@@ -0,0 +1 @@
+xÚíÖ± À À>Ó˜ý—Kƒ€°•À}“ˆÆ:!£èiY‰™'*3§]fÛsþÛÉÓÒîm¹ºb[ÞJÂÆÆÆÆÆƶŖÝKÆ9›}ccccccÓ'u.6ûÆÆÆÆÆÆƦs±é“Þ6666¶R[ÿ^gû{/lÇØÙ·Û Þ7Í‚ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_1/mask_113_1.dat b/library/phpqrcode/cache/mask_1/mask_113_1.dat
new file mode 100644
index 000000000..1dd666d9b
--- /dev/null
+++ b/library/phpqrcode/cache/mask_1/mask_113_1.dat
@@ -0,0 +1 @@
+xÚíÖ1€ ÀÞ×ÿÿœ -8fL(pBŽlDM™è9";ýÄ-÷ò÷;?1îpâÐ{¼\åÆú%-ŒŒŒŒŒŒ“3:@Ûad4ŒŒŒŒŒŒŒŒú*£NîÍaddddddÔÉÍ#######ã#c]75®ÓåÚã¢Æåæ1ÏxYuñ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_1/mask_117_1.dat b/library/phpqrcode/cache/mask_1/mask_117_1.dat
new file mode 100644
index 000000000..8921f6437
--- /dev/null
+++ b/library/phpqrcode/cache/mask_1/mask_117_1.dat
@@ -0,0 +1,2 @@
+xÚíÖ» À À>Ó˜ý—Kƒ€ø$ø^’ 8Y–QSV'zž8‘þjzëÌʇ¬™^]Þסµ‡¬õekXYYYYYYYjݵ#¶
++«yeeeeeeeeµ#²²šWVVVVVVVV;"+«yeeeeeeel­'ëe;b»±&²^9¯{­/ÊJ$p \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_1/mask_121_1.dat b/library/phpqrcode/cache/mask_1/mask_121_1.dat
new file mode 100644
index 000000000..64bd8ba04
--- /dev/null
+++ b/library/phpqrcode/cache/mask_1/mask_121_1.dat
@@ -0,0 +1,2 @@
+xÚí×1
+À н§‰÷¿\— ¥C¡PbÑ—EÁÁ<DñGdµŠŠQG̪±3óèð©û×k?3ï¸sÉ9_Žz¢9iåÅÌÌÌÌÌÌÌ|3WþÃú3³ûÌÌÌÌÌÌÌÌÌ,WÉÌr•7Œ™™™™™™™™YÆ`–«¼aÌÌÌÌÌÌÌÌ›sd^ü¿ÝgÌÛš¿Ïõæ4Øð \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_1/mask_125_1.dat b/library/phpqrcode/cache/mask_1/mask_125_1.dat
new file mode 100644
index 000000000..d5881dd5d
--- /dev/null
+++ b/library/phpqrcode/cache/mask_1/mask_125_1.dat
@@ -0,0 +1,2 @@
+xÚí×1
+À н§‰÷¿\— :ŠòþÒ‚ƒ>$’DdÆ©ÄÊ•Y»³ÿŸtëÚ…öλ»÷ÏÕÛó0£$ìììììììììì›ì§ûù¹ÆήÞÙÙÙÙÙÙÙÙÙÙõóììêÝg–a7ÇyëØÙÙÙÙÙÙÙ¯³ç—½Y??ÿØÙ{Õ{ý¾D“ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_1/mask_129_1.dat b/library/phpqrcode/cache/mask_1/mask_129_1.dat
new file mode 100644
index 000000000..62cd1c9a1
--- /dev/null
+++ b/library/phpqrcode/cache/mask_1/mask_129_1.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_1/mask_133_1.dat b/library/phpqrcode/cache/mask_1/mask_133_1.dat
new file mode 100644
index 000000000..18d68dce8
--- /dev/null
+++ b/library/phpqrcode/cache/mask_1/mask_133_1.dat
@@ -0,0 +1 @@
+xÚí×1€ ÐÝÓ”û_Î…€“ºh«¼¿h˜šÒ|"zÚÛ‰™-*dNÁâÔâÙó¦H¼‡«QÄ¢ÕR ,X°`ñc‹¬Þ9ÎY°(na_°`Á‚ ,Xè,XØ,X°`Á‚ Þ#:8 ﻓ ,X°`ÁBïdÁ¾`Á‚ ,X|Ï¢Y\X¬Ö;Ç 7-ݹ; ` \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_1/mask_137_1.dat b/library/phpqrcode/cache/mask_1/mask_137_1.dat
new file mode 100644
index 000000000..284d7beab
--- /dev/null
+++ b/library/phpqrcode/cache/mask_1/mask_137_1.dat
@@ -0,0 +1,3 @@
+xÚí×1
+€0 ÐÝÓ¤÷¿œKh]D¥‘¾,-t ò#²ÚŒŠQ[T©Ñ “K“s§7_Š›è¤È?9|•B&ÙX›^L˜0a„ÉÂ&3÷“þ„ÉMÌ&L˜0a„ &2 ¼ÃD4c™0a„ &L˜È€òÐŒe„ &L˜0ab·—w˜È€f,&L˜0a„É7&y2¹a²ònßoL˜<01O
+˜ì¾ç \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_1/mask_141_1.dat b/library/phpqrcode/cache/mask_1/mask_141_1.dat
new file mode 100644
index 000000000..83220ddb4
--- /dev/null
+++ b/library/phpqrcode/cache/mask_1/mask_141_1.dat
@@ -0,0 +1,2 @@
+xÚí×1
+À À>¯9ÿÿ¹4¢6)ƒ3×$`s ²¸uÊ®‰>Wdš¾ ›)›g³•'°±MÂ{3\d6u¹’bØ°aÆ 6lؼn³û]ÜNØ°9ÄFÞ°aÆ 6lØ°a£3°a#oØ°aÆ 6lØ°ÑØ°Ñ5e16lØ°aÆ ]SŸb£kÊ6lØ°aÆ ›mê—ͤÍß;CûcÃf‘¼IdsG¹ÿ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_1/mask_145_1.dat b/library/phpqrcode/cache/mask_1/mask_145_1.dat
new file mode 100644
index 000000000..6a9950f7a
--- /dev/null
+++ b/library/phpqrcode/cache/mask_1/mask_145_1.dat
@@ -0,0 +1 @@
+xÚíÜ!€0@Ïk®ÿÿ¦¡ 4a)³qæ2i.YCUO{35²UZÆFŒn]ÏfN>bd£ðwtzJF}ÁFŒ1bĈ#FŒýÆ(¡¯FŒ6r1bĈ#FŒ1ÒE1ÒiÝlFŒ1bĈ#FŒtFŒÜ#FŒ1bĈ#FŒtZ}#÷ˆ#FŒ1bĈÑl£þeôÀHÉùG£µÜ£@£Ù’î \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_1/mask_149_1.dat b/library/phpqrcode/cache/mask_1/mask_149_1.dat
new file mode 100644
index 000000000..02a3cdc6e
--- /dev/null
+++ b/library/phpqrcode/cache/mask_1/mask_149_1.dat
@@ -0,0 +1 @@
+xÚíØ1€ ÐÝÓ”û_Î…ˆƒqÁHÞ_Xšòc‰èi«#Gd̘ŠÕ”Õ›á÷g…¬LUè^Ý®VR«>dKV¬X±bÅŠ+VÛXeùo¿ÎX±ÚÌJ_±bÅŠ+V¬X±bÅÊ;ƒÝ™+}ÅŠ+V¬X±bÅŠ+VöAV¬ô•ngÅŠ+V¬X±bÅŠ•}+ï úŠ+V¬X±bÅŠ«VýËjÒÊ>øhewfõ›•¾*`uTqí \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_1/mask_153_1.dat b/library/phpqrcode/cache/mask_1/mask_153_1.dat
new file mode 100644
index 000000000..2abfca20b
--- /dev/null
+++ b/library/phpqrcode/cache/mask_1/mask_153_1.dat
@@ -0,0 +1,2 @@
+xÚíØ1
+€0ÀÞ×\þÿ9›Ãbt³Ešc'›ªÎHHÍ•š9³efßžmff²MïÙíª›õ #.̘1cÆŒ3f̘1cf–Ô7¯3f̘Ùg̘1cÆŒ3f̘1c¦o2cæ]Ã?€3f̘1cÆŒ3fÞ5ôMfÌì3f̘1cÆŒ3f̘1Ó7utfÌì3f̘1cÆŒ3f̘=ÌúËl¡™¾ùj¦£3ûÕÌ>ÛÈì¤ÐVü \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_1/mask_157_1.dat b/library/phpqrcode/cache/mask_1/mask_157_1.dat
new file mode 100644
index 000000000..17344b891
--- /dev/null
+++ b/library/phpqrcode/cache/mask_1/mask_157_1.dat
@@ -0,0 +1,2 @@
+xÚí×1
+À À>¯9ÿÿ¹4S¦d/Ì5‚Õ1ÈÊVÍ)SkŽJžµ»­vßÜ7´³ÝÞÝíé…ÛÍeGä°cÇŽ;vìرc÷²]Z¯¸îÙ±c'ïرcÇŽ;vìرÓ+رÓgå;vìرcÇŽ;}V¯`ÇNÞù+رcÇŽ;vìØé:;vòŽ;vìرcÇŽ;½‚;}VÞ±cÇŽ;vìص±›'»ÍvzÅ#;Œ]Œ¼klw¯oA` \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_1/mask_161_1.dat b/library/phpqrcode/cache/mask_1/mask_161_1.dat
new file mode 100644
index 000000000..669ade1b8
--- /dev/null
+++ b/library/phpqrcode/cache/mask_1/mask_161_1.dat
@@ -0,0 +1 @@
+xÚíØ1€0ÐÝÓÐû_Î…XӨš yi~…ˆ¬Q©bÖÕkvÈp±á³ê7'M u¸Ù=¼]ņÙð([ 2dÈáÏ +þÛ\' 2”‡ 2dÈ!C† 2´s0/3d(½) 2dÈ!C† 24ë1dhç 2dÈ!C† 2dhÖcÈ¡<dÈ!C† 2dÈ¡ƒy™!CyèMaÈ!C† 2dØÞ0¿ —šõ^š—4”‡[ž‹E2 \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_1/mask_165_1.dat b/library/phpqrcode/cache/mask_1/mask_165_1.dat
new file mode 100644
index 000000000..abb48f0b1
--- /dev/null
+++ b/library/phpqrcode/cache/mask_1/mask_165_1.dat
@@ -0,0 +1 @@
+xÚíØ1€ ÐÝÓ”û_Î¥LK^–æ…#²FµŠYWt¨Ù%Ë–ïÂÿœ4¶ÔåÁ÷r¹šM,³éQºX²dÉ’%K–,Y¶²¬ú¯þœ°dÉÒ¼dÉ’%K–,Y²dÉ’%K’%K» ó’%K–,Y²dÉ’%K–v2$K–vÞ–,Y²dÉ’%K–,YÊò8K–楷‡%K–,Y²dÉ’%K–2$K–,ÍK–,Y²dÉ’%K–,ÛZæ—åVKò£¥<≥yy¤å ™ó)Î \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_1/mask_169_1.dat b/library/phpqrcode/cache/mask_1/mask_169_1.dat
new file mode 100644
index 000000000..ba21b710b
--- /dev/null
+++ b/library/phpqrcode/cache/mask_1/mask_169_1.dat
@@ -0,0 +1 @@
+xÚíØ1À н§Áû_® ÑîM,ØÇâàB^ æ‘5*V¬º¢K­N™n2ýú¦¹©NòNOµ‘i6>ÊS¦L™2eÊ”)S¦L™2­œMç S¦LÍS¦L™2eÊ”)S¦L™2•Må}¦LÍSS¦L™2eÊ”)S¦LeSyŸ)SóÔÅ”)S¦L™2eÊ”)S;Ù”)S;ó”)S¦L™2eÊ”)S¦v(²)S¦v(æ)S¦L™2eÊ”)S¦íLódºÍT6}a*ï3mljžmzC' \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_1/mask_173_1.dat b/library/phpqrcode/cache/mask_1/mask_173_1.dat
new file mode 100644
index 000000000..436918c0b
--- /dev/null
+++ b/library/phpqrcode/cache/mask_1/mask_173_1.dat
@@ -0,0 +1 @@
+xÚíØ1€ ÐÝÓ”û_Î¥''Ó@y]Xšò1?"g¬:1çŠfn˶ÌöË»ö¬­m¼·¯«»™m.?¶¶lÙ²eË–-ÛF¶«ÿß>glÙ²•·Þ2¶lÙ²eË–-[¶lÙ²e«O`Ë–­¼eË–-[¶lÙ²eË–-[¶lõ lÙ²•·lÙ²eË–-[¶lÙ²eËV¦O`Ë–­¼eË–-[¶lÙ²eË–-[¶z0}[¶z0yË–-[¶lÙ²eË–-[¶E¶ùe[h«OøÍVWö…­¼=Ìötÿ*| \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_1/mask_177_1.dat b/library/phpqrcode/cache/mask_1/mask_177_1.dat
new file mode 100644
index 000000000..12e2e522f
--- /dev/null
+++ b/library/phpqrcode/cache/mask_1/mask_177_1.dat
@@ -0,0 +1 @@
+xÚíØ1€ ÀÞ×ÿÿœÍE¨¬Œp0×XÐà„,a#rÚÊ}®¨6}ÇŒ§¿Ùÿ»¶‰±~Ž‡£\Ð8 •ÆŒ3f̘1cÆŒ—7®ðÎ{Ö3f,ÝyŒ3f̘1cÆŒ3fÌX_¡¯`ÌXï&3f̘1cÆŒ3f̘±ÞM_Á˜1cy̘1cÆŒ3f̘1cÆŒë+3f,ÝyŒ3f̘1cÆŒ3fÌX_¡bÌXï&3f̘1cÆŒ3fÌxãü2žd¬¯øÔX'Äx[cy|¨ñ ¸•3ë \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_1/mask_21_1.dat b/library/phpqrcode/cache/mask_1/mask_21_1.dat
new file mode 100644
index 000000000..f87e0a112
--- /dev/null
+++ b/library/phpqrcode/cache/mask_1/mask_21_1.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_1/mask_25_1.dat b/library/phpqrcode/cache/mask_1/mask_25_1.dat
new file mode 100644
index 000000000..3a225e30f
--- /dev/null
+++ b/library/phpqrcode/cache/mask_1/mask_25_1.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_1/mask_29_1.dat b/library/phpqrcode/cache/mask_1/mask_29_1.dat
new file mode 100644
index 000000000..0a1cb3b5d
--- /dev/null
+++ b/library/phpqrcode/cache/mask_1/mask_29_1.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_1/mask_33_1.dat b/library/phpqrcode/cache/mask_1/mask_33_1.dat
new file mode 100644
index 000000000..318949df0
--- /dev/null
+++ b/library/phpqrcode/cache/mask_1/mask_33_1.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_1/mask_37_1.dat b/library/phpqrcode/cache/mask_1/mask_37_1.dat
new file mode 100644
index 000000000..5bd9e3aa0
--- /dev/null
+++ b/library/phpqrcode/cache/mask_1/mask_37_1.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_1/mask_41_1.dat b/library/phpqrcode/cache/mask_1/mask_41_1.dat
new file mode 100644
index 000000000..52e9e58f4
--- /dev/null
+++ b/library/phpqrcode/cache/mask_1/mask_41_1.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_1/mask_45_1.dat b/library/phpqrcode/cache/mask_1/mask_45_1.dat
new file mode 100644
index 000000000..b35c567dc
--- /dev/null
+++ b/library/phpqrcode/cache/mask_1/mask_45_1.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_1/mask_49_1.dat b/library/phpqrcode/cache/mask_1/mask_49_1.dat
new file mode 100644
index 000000000..d20d71710
--- /dev/null
+++ b/library/phpqrcode/cache/mask_1/mask_49_1.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_1/mask_53_1.dat b/library/phpqrcode/cache/mask_1/mask_53_1.dat
new file mode 100644
index 000000000..a676d7dfa
--- /dev/null
+++ b/library/phpqrcode/cache/mask_1/mask_53_1.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_1/mask_57_1.dat b/library/phpqrcode/cache/mask_1/mask_57_1.dat
new file mode 100644
index 000000000..896ed4357
--- /dev/null
+++ b/library/phpqrcode/cache/mask_1/mask_57_1.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_1/mask_61_1.dat b/library/phpqrcode/cache/mask_1/mask_61_1.dat
new file mode 100644
index 000000000..4165a4bd2
--- /dev/null
+++ b/library/phpqrcode/cache/mask_1/mask_61_1.dat
@@ -0,0 +1 @@
+xÚ30€CbpPº™ÝØÅi`÷@ê&ÚßH^§Ðn¨a†dQ»Gíµ{Ôn<v“Z®ÁÅGíMk£vÚ=j7¶¶â ³›Öå9mäán7â›<»ª³Âh \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_1/mask_65_1.dat b/library/phpqrcode/cache/mask_1/mask_65_1.dat
new file mode 100644
index 000000000..db8db88a8
--- /dev/null
+++ b/library/phpqrcode/cache/mask_1/mask_65_1.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_1/mask_69_1.dat b/library/phpqrcode/cache/mask_1/mask_69_1.dat
new file mode 100644
index 000000000..03bba657f
--- /dev/null
+++ b/library/phpqrcode/cache/mask_1/mask_69_1.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_1/mask_73_1.dat b/library/phpqrcode/cache/mask_1/mask_73_1.dat
new file mode 100644
index 000000000..a729fdf04
--- /dev/null
+++ b/library/phpqrcode/cache/mask_1/mask_73_1.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_1/mask_77_1.dat b/library/phpqrcode/cache/mask_1/mask_77_1.dat
new file mode 100644
index 000000000..0fe0b03e8
--- /dev/null
+++ b/library/phpqrcode/cache/mask_1/mask_77_1.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_1/mask_81_1.dat b/library/phpqrcode/cache/mask_1/mask_81_1.dat
new file mode 100644
index 000000000..eacbdb1a2
--- /dev/null
+++ b/library/phpqrcode/cache/mask_1/mask_81_1.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_1/mask_85_1.dat b/library/phpqrcode/cache/mask_1/mask_85_1.dat
new file mode 100644
index 000000000..b8a20c754
--- /dev/null
+++ b/library/phpqrcode/cache/mask_1/mask_85_1.dat
@@ -0,0 +1,2 @@
+xÚíÙ1
+À н§‰÷¿\©]‹‰4ðþ˜AA hÄÌØM¬\Q‘µjsë·úAk§U·ûújm‘un2RÃÊÊÊÊÚΚ5·ž:k;«»ÅÊÊÊÊjƲº[¬¬¬¬eoÅí­›[™oð¬ÿ[ÇÎk®õ¨ðZä \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_1/mask_89_1.dat b/library/phpqrcode/cache/mask_1/mask_89_1.dat
new file mode 100644
index 000000000..e9d226f35
--- /dev/null
+++ b/library/phpqrcode/cache/mask_1/mask_89_1.dat
@@ -0,0 +1 @@
+xÚíÙ1€ ÐÝÓ”û_Î…‹N…h}%Àƒ@ iDOËHŒ±*cä"æûµ<öØgþâÈ)û<mõBsŸ¨¥‡™™™™ù—æÌwðja.av™™™™™ý‘ü7˜ÝAffff極‰2æ·¾ÝÙ5 æuØ­ç9ß|²Þä \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_1/mask_93_1.dat b/library/phpqrcode/cache/mask_1/mask_93_1.dat
new file mode 100644
index 000000000..f37836c61
--- /dev/null
+++ b/library/phpqrcode/cache/mask_1/mask_93_1.dat
@@ -0,0 +1,2 @@
+xÚíÙ;
+À À>§Ñû_.Ä4I‘ìâ‡yí‚Ž¢¸`)-5*¥ç(™é£of[Ósm€}åÑÃöý¶õÉö6YM ;;;;;ûG{ô»zÕØ·µ»«ìììììììz1vw•}œ=úwuûìýLÆ%û?û"ç=Ç~e—i \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_1/mask_97_1.dat b/library/phpqrcode/cache/mask_1/mask_97_1.dat
new file mode 100644
index 000000000..24fa60fc3
--- /dev/null
+++ b/library/phpqrcode/cache/mask_1/mask_97_1.dat
@@ -0,0 +1,2 @@
+xÚíÙ1
+À0н§1÷¿\—ÐtncKÌû«ƒ<DŒèi3#Gdgt(lxVûÉP¡ÃÔ9ÜFñ¡7lia``````ØÞq/]5†­ všÁ½Äàne``````xùÛ-mXá^Êú±3Ì5,´y†-†ù# \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_2/mask_101_2.dat b/library/phpqrcode/cache/mask_2/mask_101_2.dat
new file mode 100644
index 000000000..e39fd2cf1
--- /dev/null
+++ b/library/phpqrcode/cache/mask_2/mask_101_2.dat
@@ -0,0 +1,3 @@
+xÚíÚ1
+À н§‰÷¿œ‹C‡â ‰Ux!“’?1ªe÷«ž ä)Ÿç“ás”Ê*¼KÛ®LfòšB¡P(”ÝJÖ®¤Ü¨x/
+…B‘a(2 …B¡P(2 E†¡P(ʲR÷Så(%qWR®S¼—ÿ”iY‰ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_2/mask_105_2.dat b/library/phpqrcode/cache/mask_2/mask_105_2.dat
new file mode 100644
index 000000000..7b63e31ba
--- /dev/null
+++ b/library/phpqrcode/cache/mask_2/mask_105_2.dat
@@ -0,0 +1 @@
+xÚíÚ!À @ß×ÿÿ\Mƒ«iØp4sÁ€™ 6¬ ê™‘Ys®"¤7þÛù&)=ñ; ÒÜŒð"‘H$Ò¥µ¯;é|IžH$‰DÒ÷t#}OžH$‰DÒ÷Húžä’H$©·”þ­ÕIZß#HgKòÔJºt”$• \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_2/mask_109_2.dat b/library/phpqrcode/cache/mask_2/mask_109_2.dat
new file mode 100644
index 000000000..252f6d807
--- /dev/null
+++ b/library/phpqrcode/cache/mask_2/mask_109_2.dat
@@ -0,0 +1,2 @@
+xÚíÚ1
+À0н§1÷¿\—@¶NÖˆ<q’À#ƒð#v­ßúÔ´-e~_«¨Š¿­[Ú÷«ä¦Ñh46JKžÓFjöF£Ñh4šÌE“'i4F£É“4y’F£Ñh´¾ZÁEcS-;—Ð&jö­©öŒ³Æñ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_2/mask_113_2.dat b/library/phpqrcode/cache/mask_2/mask_113_2.dat
new file mode 100644
index 000000000..26b5d7eab
--- /dev/null
+++ b/library/phpqrcode/cache/mask_2/mask_113_2.dat
@@ -0,0 +1 @@
+xÚíÚ1€0ÐÝÓÐû_ÎÅ¡‰‰Ðª0óÚäD\5*{ª#ˆ½bò’H'o+vUÓÇR1ŸPÐD"‘H$øÑ>‰D"‘H$ÊäD™œH$‰D"Q&—WerûH$‰D"ñ±ç*x[±(Ë?/ÚÇ÷ˆ'ŸŠnd \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_2/mask_117_2.dat b/library/phpqrcode/cache/mask_2/mask_117_2.dat
new file mode 100644
index 000000000..b4dcce46f
--- /dev/null
+++ b/library/phpqrcode/cache/mask_2/mask_117_2.dat
@@ -0,0 +1,2 @@
+xÚíÚ1
+À À>¯9ÿÿ¹4!m dOƒs\§0X,laÕ5#¿÷Eª¾>Z[íœÖ·ŽÉêã½ÄR©T*•J¥R?Q-œº«*¯T*•J¥R©º?U÷—W*•J¥R©TÝŸªûË+•J¥R©Ô¤Úùó~m5Õ©;ªòúSõ&+ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_2/mask_121_2.dat b/library/phpqrcode/cache/mask_2/mask_121_2.dat
new file mode 100644
index 000000000..a2a0097b1
--- /dev/null
+++ b/library/phpqrcode/cache/mask_2/mask_121_2.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_2/mask_125_2.dat b/library/phpqrcode/cache/mask_2/mask_125_2.dat
new file mode 100644
index 000000000..0ea40fdae
--- /dev/null
+++ b/library/phpqrcode/cache/mask_2/mask_125_2.dat
@@ -0,0 +1 @@
+xÚíÛ!À P¿Ó”û_ƒ@ U(Ûkp@^Mú£Ú®5ÕôªúËîòâ-ú‰:ðöVF_žÌ\t:N§Óétú÷õ¼yžN×qt:N§ÓétºG—ãô;N§Óét:.ËÐå8:N§ÓétzA}ÿµ‹ôÔyžN×q¿Ñ;+nŠ& \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_2/mask_129_2.dat b/library/phpqrcode/cache/mask_2/mask_129_2.dat
new file mode 100644
index 000000000..bf048394b
--- /dev/null
+++ b/library/phpqrcode/cache/mask_2/mask_129_2.dat
@@ -0,0 +1,2 @@
+xÚíÛ1
+À0н§Ñû_®KÈVÚ¡¨'.Éôþ!«²¶w]A0XðÄú÷~˜ «ÚÞ  ö!›š€€€€€€à£ fK# x˜Fy€À4È vey€€€€€€€@^°+È ç º~™ž ¨Û L#ÁêveI \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_2/mask_133_2.dat b/library/phpqrcode/cache/mask_2/mask_133_2.dat
new file mode 100644
index 000000000..9e78b6de5
--- /dev/null
+++ b/library/phpqrcode/cache/mask_2/mask_133_2.dat
@@ -0,0 +1,10 @@
+xÚíÛ1
+À н§‰÷¿œ‹à&´`¢ô…Lâð”üÁˆQ-½g=Aq•bëú¹ŠÊª<‹všb½+©)((((((((ÊIën*…<b§G(((((((((ä
+yÄ{AAAAAAAA!˜Á)ä
+
+
+
+
+
+
+Š•¢ð'ùeŠ¬¹“‚â½ÂMý©¢fv{ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_2/mask_137_2.dat b/library/phpqrcode/cache/mask_2/mask_137_2.dat
new file mode 100644
index 000000000..95c3c48cd
--- /dev/null
+++ b/library/phpqrcode/cache/mask_2/mask_137_2.dat
@@ -0,0 +1,2 @@
+xÚíÜ1
+À н§‰÷¿\—N‚I,/d+Ê£`ð/F|5*zª'H.”,xëO[KšKª«øŸŒ–’õ‰MBBBBBBÒT’|?!!9”8Å$$$$$$$$$$2 ‰ hžÈ€$2 yBBBBBBBBBB"eÈ€æ ÉŸ$µ¯IÜ%É¿Û“œHœb’©_xêÛë \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_2/mask_141_2.dat b/library/phpqrcode/cache/mask_2/mask_141_2.dat
new file mode 100644
index 000000000..da07da2e8
--- /dev/null
+++ b/library/phpqrcode/cache/mask_2/mask_141_2.dat
@@ -0,0 +1,2 @@
+xÚíÜ=
+À н§‰÷¿œ‹t*-ˆ?±¼M…‡á[ŒhUöõ]WÐüB¯ç;–ÎÔd¨wS’j>÷­lš ††fŽÆ„ÓÐÐÐÐÐÐÐÐÐÈš44²& ¬)OÑÈšÞY“FÖ4á444444444c4~œ9S³:3ÐЌטpšÇ®>® \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_2/mask_145_2.dat b/library/phpqrcode/cache/mask_2/mask_145_2.dat
new file mode 100644
index 000000000..9ff2bbf3f
--- /dev/null
+++ b/library/phpqrcode/cache/mask_2/mask_145_2.dat
@@ -0,0 +1,4 @@
+xÚíÜ1
+À н§ùÞÿr]
+Ý,tˆQ^È&ÊCˆð“§ÆÒ~ë
+щ¢Éj~mɾ¢.ÕåŽFgÑüìMDDDDDDDDDDDÔST™×ˆˆêD¦ŸˆˆˆˆˆˆˆˆˆH¦•ŽˆdZï‘L+¯É´DDDDDDDDDDD2-‘é'"""""""":BÔäת½EåY„ˆ¨Ddú‰¾û† †Š \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_2/mask_149_2.dat b/library/phpqrcode/cache/mask_2/mask_149_2.dat
new file mode 100644
index 000000000..d52e0484b
--- /dev/null
+++ b/library/phpqrcode/cache/mask_2/mask_149_2.dat
@@ -0,0 +1 @@
+xÚíÜ;€@ÀÞÓÀý/gcaGÖBXBç'“-ˆ¼Âˆ«²»ouÕ§UQ½dõRVOm¡šTƒÎ*Ç«Ê;;šŠŠŠŠŠŠŠŠŠj¨ªå»ŠªEe2PQQQQQQQQQQQɨ¨ä TTTTTTTTTTTTr»3•œÁ¼¢¢¢¢¢¢¢¢¢¢¢’3ØR©ä &ÕßTsþŒ·»ªk¤¢z_e2P=ê ïd™ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_2/mask_153_2.dat b/library/phpqrcode/cache/mask_2/mask_153_2.dat
new file mode 100644
index 000000000..3b0604101
--- /dev/null
+++ b/library/phpqrcode/cache/mask_2/mask_153_2.dat
@@ -0,0 +1,2 @@
+xÚíÜ1
+€0 ÐÝÓ¤÷¿œ‹8ZP!¿úB¶ÒòèèZuÔÈ賶"û“ìbuºñö™‹ÈÒ*îÎƲé)]MFFFFFFFFFFFFö†¬%= #‹‘™ddddddddddddr ot2¹†yFFFFFFFFFFFF&× #“k‘‘‘‘‘‘‘‘‘‘‘‘É5ÈÈL 2222222222²(YÚµ½7ÉÈ"d¦ÙóÞ@H— \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_2/mask_157_2.dat b/library/phpqrcode/cache/mask_2/mask_157_2.dat
new file mode 100644
index 000000000..2baf535e2
--- /dev/null
+++ b/library/phpqrcode/cache/mask_2/mask_157_2.dat
@@ -0,0 +1,3 @@
+xÚíÜ1
+€0À>¯¹üÿs6‚M¹ÎqUH1¤XØ&Uç̘½fÝ/u-çûé'ñíæ.ºû[ÍKGGGGGGGGGG÷H×|NG¨“(ttttttttttú¬NF§ÏÊ;::::::::::}–ŽNŸ¥££££££££££Ózèè$
+>«“Ñé³…ŽŽŽŽŽŽŽŽn­ üAø#ºî^AG—§“(t¯ì =3{ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_2/mask_161_2.dat b/library/phpqrcode/cache/mask_2/mask_161_2.dat
new file mode 100644
index 000000000..d2df7594e
--- /dev/null
+++ b/library/phpqrcode/cache/mask_2/mask_161_2.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_2/mask_165_2.dat b/library/phpqrcode/cache/mask_2/mask_165_2.dat
new file mode 100644
index 000000000..2e6cd7c6f
--- /dev/null
+++ b/library/phpqrcode/cache/mask_2/mask_165_2.dat
@@ -0,0 +1,2 @@
+xÚíÝ1
+€0 ÐÝÓ¤÷¿œ‹Šè ?òBÆVü¥UG¼žµ%åùÐêþ¸åÙ×*“+ú_ŽfÊËs MIIIIIIIIIù–2d;£¤l¨4‰()))))))))))eöqJÙ†IDIIIIIIIIIII)Û ¤”mPRRRRRRRRRRRÊ6lº””² JJJJJJJJJJJJÙ†}œR¶aQRRRRRRRRRRNeòK?R픔͔&åW½3U \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_2/mask_169_2.dat b/library/phpqrcode/cache/mask_2/mask_169_2.dat
new file mode 100644
index 000000000..4052062b8
--- /dev/null
+++ b/library/phpqrcode/cache/mask_2/mask_169_2.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_2/mask_173_2.dat b/library/phpqrcode/cache/mask_2/mask_173_2.dat
new file mode 100644
index 000000000..0a30ba530
--- /dev/null
+++ b/library/phpqrcode/cache/mask_2/mask_173_2.dat
@@ -0,0 +1 @@
+xÚíÝ+€@ PÏiº÷¿ÚfÝtóš:>y &d U߬ÔýÍS´´[íþª»ùé¡Õ]5Z;a¼Û5VÛž™´´´´´´´´´´AÚÀï[ZÚË´Œ–––––––––––––V¦«¡ÕƒI0ZZZZZZZZZZZZZZ=-­L‚ÑÒÒÒÒÒÒÒÒÒÒÒÒÒêÁhiõ`Œ–––––––––––––VFK«“·´´´´´´´´´´´´ÉÚü?‚ݧÍìhioÒJ0Úà}³¢o \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_2/mask_177_2.dat b/library/phpqrcode/cache/mask_2/mask_177_2.dat
new file mode 100644
index 000000000..d2c52f990
--- /dev/null
+++ b/library/phpqrcode/cache/mask_2/mask_177_2.dat
@@ -0,0 +1,2 @@
+xÚíÝ1
+À EÁ>§Yï¹4’V$Í~± ,CŠ…¼&UóŒÞ÷;OoŠk5b÷ÑÏ™áâ”óŽG°x9¥Û%&&&&&&&&&&&n$îöõOL|‡Øv#&&&&&&&&&&&&&ÖÝbbݘ˜˜˜˜˜˜˜˜˜˜˜˜˜Xw#&ÖÝl7bbbbbbbbbbbbbbÝM"ÖÝl7bbbbbbbbbbbbbbÝMa!&Ö݈‰‰‰‰‰‰‰‰‰‰‰‰3Ä)U<WܱWŸ/¶Ýˆ#î n  \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_2/mask_21_2.dat b/library/phpqrcode/cache/mask_2/mask_21_2.dat
new file mode 100644
index 000000000..7466be4bb
--- /dev/null
+++ b/library/phpqrcode/cache/mask_2/mask_21_2.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_2/mask_25_2.dat b/library/phpqrcode/cache/mask_2/mask_25_2.dat
new file mode 100644
index 000000000..0bc44c034
--- /dev/null
+++ b/library/phpqrcode/cache/mask_2/mask_25_2.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_2/mask_29_2.dat b/library/phpqrcode/cache/mask_2/mask_29_2.dat
new file mode 100644
index 000000000..5112d11ef
--- /dev/null
+++ b/library/phpqrcode/cache/mask_2/mask_29_2.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_2/mask_33_2.dat b/library/phpqrcode/cache/mask_2/mask_33_2.dat
new file mode 100644
index 000000000..5bac0c80d
--- /dev/null
+++ b/library/phpqrcode/cache/mask_2/mask_33_2.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_2/mask_37_2.dat b/library/phpqrcode/cache/mask_2/mask_37_2.dat
new file mode 100644
index 000000000..bdfc0bd43
--- /dev/null
+++ b/library/phpqrcode/cache/mask_2/mask_37_2.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_2/mask_41_2.dat b/library/phpqrcode/cache/mask_2/mask_41_2.dat
new file mode 100644
index 000000000..c55c63e8c
--- /dev/null
+++ b/library/phpqrcode/cache/mask_2/mask_41_2.dat
@@ -0,0 +1 @@
+xÚ30€C¸ †¯JB€&¶Ã¹†ШÊQ•£*‡ªJXi@lÉ0øUÂý> *F™>– \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_2/mask_45_2.dat b/library/phpqrcode/cache/mask_2/mask_45_2.dat
new file mode 100644
index 000000000..ad44ff188
--- /dev/null
+++ b/library/phpqrcode/cache/mask_2/mask_45_2.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_2/mask_49_2.dat b/library/phpqrcode/cache/mask_2/mask_49_2.dat
new file mode 100644
index 000000000..6e8edff24
--- /dev/null
+++ b/library/phpqrcode/cache/mask_2/mask_49_2.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_2/mask_53_2.dat b/library/phpqrcode/cache/mask_2/mask_53_2.dat
new file mode 100644
index 000000000..682cae2aa
--- /dev/null
+++ b/library/phpqrcode/cache/mask_2/mask_53_2.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_2/mask_57_2.dat b/library/phpqrcode/cache/mask_2/mask_57_2.dat
new file mode 100644
index 000000000..66a5c056b
--- /dev/null
+++ b/library/phpqrcode/cache/mask_2/mask_57_2.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_2/mask_61_2.dat b/library/phpqrcode/cache/mask_2/mask_61_2.dat
new file mode 100644
index 000000000..77d3815eb
--- /dev/null
+++ b/library/phpqrcode/cache/mask_2/mask_61_2.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_2/mask_65_2.dat b/library/phpqrcode/cache/mask_2/mask_65_2.dat
new file mode 100644
index 000000000..caf184ada
--- /dev/null
+++ b/library/phpqrcode/cache/mask_2/mask_65_2.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_2/mask_69_2.dat b/library/phpqrcode/cache/mask_2/mask_69_2.dat
new file mode 100644
index 000000000..6a3801bf5
--- /dev/null
+++ b/library/phpqrcode/cache/mask_2/mask_69_2.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_2/mask_73_2.dat b/library/phpqrcode/cache/mask_2/mask_73_2.dat
new file mode 100644
index 000000000..74945b718
--- /dev/null
+++ b/library/phpqrcode/cache/mask_2/mask_73_2.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_2/mask_77_2.dat b/library/phpqrcode/cache/mask_2/mask_77_2.dat
new file mode 100644
index 000000000..903cba4a0
--- /dev/null
+++ b/library/phpqrcode/cache/mask_2/mask_77_2.dat
@@ -0,0 +1 @@
+xÚíØ1À н§Áû_®‹CMŠØ>òGót Ñ«eó¨+Ž×FWÄZE¼­mÓ&gÞ‡F£Ñ¶h‰ùF+×t/F£ÙYvF£´õ³ïµÜì¥Õjçô[*7òÕa¶ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_2/mask_81_2.dat b/library/phpqrcode/cache/mask_2/mask_81_2.dat
new file mode 100644
index 000000000..17a9ac2a1
--- /dev/null
+++ b/library/phpqrcode/cache/mask_2/mask_81_2.dat
@@ -0,0 +1,2 @@
+xÚíØ1
+À0н§Ñû_®KÉÒ©Vi!O\"á‘Aøˆ«ò]¯:‚x»‘çÃbWµ½1ÅuȦ&‰Ä_‰µT ΋6œH$‰ÒU^‰Dâ~bׯëb=gˆ³âžûXî­ÛÙ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_2/mask_85_2.dat b/library/phpqrcode/cache/mask_2/mask_85_2.dat
new file mode 100644
index 000000000..72c74ff9a
--- /dev/null
+++ b/library/phpqrcode/cache/mask_2/mask_85_2.dat
@@ -0,0 +1,2 @@
+xÚíØ1
+À0Ð=§1÷¿\—B7¡ÖÖOþ$á‘A0$â¬ý8W­ ¦ê­þwjguÞu¿­æ§Š¡R©T*u•÷SÖ§Ž¨æ•J¥R©ÞTóJ¥R©ÿRö‡ÕêÞ¢N¨æµ˜çVû \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_2/mask_89_2.dat b/library/phpqrcode/cache/mask_2/mask_89_2.dat
new file mode 100644
index 000000000..06c9a4fe3
--- /dev/null
+++ b/library/phpqrcode/cache/mask_2/mask_89_2.dat
@@ -0,0 +1 @@
+xÚíÙ± À0 À>ÓÈû/—&E*câÇQqâëÃŃ ªzf$òš«ÈËrM…ßåô„ß<ŽÈsa#d2™L&’?ïArYŸÉd2™LöG"ë3™L&“{ÊÙëRygw“;ÈúÊ ƒñÚI \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_2/mask_93_2.dat b/library/phpqrcode/cache/mask_2/mask_93_2.dat
new file mode 100644
index 000000000..f5202963d
--- /dev/null
+++ b/library/phpqrcode/cache/mask_2/mask_93_2.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_2/mask_97_2.dat b/library/phpqrcode/cache/mask_2/mask_97_2.dat
new file mode 100644
index 000000000..38842b989
--- /dev/null
+++ b/library/phpqrcode/cache/mask_2/mask_97_2.dat
@@ -0,0 +1,2 @@
+xÚíÙ1
+À0н§Ñû_®Ki·vH4 <q  Â#®Ê©ýÔ„ÂËôsÔ-TUÕ²S¸_YÔ@ k…‘¼DØI°@ äV‚ÜJ a©PtÅÿ—0œ—›ö¡C8%ó¬ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_3/mask_101_3.dat b/library/phpqrcode/cache/mask_3/mask_101_3.dat
new file mode 100644
index 000000000..fa9925121
--- /dev/null
+++ b/library/phpqrcode/cache/mask_3/mask_101_3.dat
@@ -0,0 +1 @@
+xÚíÚK€ EÑyWSö¿9'D1ñŸ¾ªp ã /9±Ðîu•èÝ,kžu9–Ò¤¼$¶îû%‰Ý­wAL¹¤b%ClA³ƒzqÛ´å붌‚bˆ!†ØÇĤwå™XÜ4`Áõ¶_ö'FWrŽ!†bˆõ&Æt1Ä<FWrŽ!†bˆýXŒé‚yŒ®äC 1ĆÓý©²Ó‡Ì)E{WúÙ¯AÓ…gLž1]¼-&øƼ§®”æLqn‰ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_3/mask_105_3.dat b/library/phpqrcode/cache/mask_3/mask_105_3.dat
new file mode 100644
index 000000000..d8a28ce98
--- /dev/null
+++ b/library/phpqrcode/cache/mask_3/mask_105_3.dat
@@ -0,0 +1 @@
+xÚíÚ1€ DÑ~O3Üÿr6„Ð@(œ1ê'†„¬ûâÂJ}4Ï£¦gk 9’7ÐéA=­÷ž¯Ÿèi»÷p}‘“w¸õZJo¬ýûÜ8Ë¢ÏJB=ôÐCÏs= =÷;ô”Hê³zT.çz衇zô{ô{ô{T.çz衇zô{ô{ô{T.z衇zoÔS$P«T õhŽŽE©Ž%•Ô¿ôbßž¯r•ª\RåL$Ý \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_3/mask_109_3.dat b/library/phpqrcode/cache/mask_3/mask_109_3.dat
new file mode 100644
index 000000000..48d94040e
--- /dev/null
+++ b/library/phpqrcode/cache/mask_3/mask_109_3.dat
@@ -0,0 +1 @@
+xÚíÚ1€ DÑ~O3Üÿr6Ñ‹Ý ÁO(‹Í¾™©V6ïÓsy±¹š¡¹Ð>’)ë_%s×_½Õƒd3KŽO1^ša†§LŸá,†$’H"‰$’KzRP—t[I&¯ÿX’ÝÍ9‰$’H"‰$’äIò$y’sI$‘DI$É“äIò$»I$‘DÉ%eëÌsò!¹¼=—™‚äLAZ5—œ'åÌ“IVý“rîn¸»/2oÆ… \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_3/mask_113_3.dat b/library/phpqrcode/cache/mask_3/mask_113_3.dat
new file mode 100644
index 000000000..023b27304
--- /dev/null
+++ b/library/phpqrcode/cache/mask_3/mask_113_3.dat
@@ -0,0 +1,2 @@
+xÚíÚA
+€0 DÑ}N“ÞÿrnDëÂFj2úK‚ÂÈCÂt?W«ÜݲîZ“iêÀ.qÕÁ‹ŒoýP ô¯ªª%SmjÕÖÂ7ËÞ¦‹:·©ª¨¢Š*ª¨N©Ê:@¤:݇·ìýÁŠ¾º•*€¹Š*ª¨¢Š*ª¨f©ÒW9dª2˜«¨¢Š*ª¨¢Šj–*}•S@ Ê`®¢Š*ª¨¢Šj½ªæ¯à§ª6ðJlº¾êÑ¿Ã}ÕÕ}ÕÕ§€•T‹¿UßaÈ24hnt \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_3/mask_117_3.dat b/library/phpqrcode/cache/mask_3/mask_117_3.dat
new file mode 100644
index 000000000..79cc04d14
--- /dev/null
+++ b/library/phpqrcode/cache/mask_3/mask_117_3.dat
@@ -0,0 +1,4 @@
+xÚíÛ1
+Ã0 Ð]§Qî¹.¡xIÚB$úŒ‡€Á?~!É<ÇQ?ß#–ç¶Ð5µ/tIÝJ8owøié{áßçâ¬}£Sø˜^ã~‡¢½q猉P„ &L˜0áJá¢î1ÊúϻݢðD×K'¬J¨Ã„ &L˜0á…õÃn
+«ê0a„ &Lxgaý°Gƒ°*¡&L˜0aÂ{
+g{è¡Ÿþ2¨ë‡s¢Ή~˜ðì7\]%r¢Jôö9nZ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_3/mask_121_3.dat b/library/phpqrcode/cache/mask_3/mask_121_3.dat
new file mode 100644
index 000000000..aff5a7be5
--- /dev/null
+++ b/library/phpqrcode/cache/mask_3/mask_121_3.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_3/mask_125_3.dat b/library/phpqrcode/cache/mask_3/mask_125_3.dat
new file mode 100644
index 000000000..e2febdbdd
--- /dev/null
+++ b/library/phpqrcode/cache/mask_3/mask_125_3.dat
@@ -0,0 +1,2 @@
+xÚíÛ1
+Ä Ð~N3ÞÿrÛ„]·‰BБÝ'?<Âà/̼VÛµ»Ýóþü¨ ïÒ”¿ÿ´…<–’0-_±Jä[¥ü?† +wÔÄ^;*ÃyòäÉ“'Ož<ù’/9ÏÏɯì9±<áîyÓÆœ'Ož<yòäÉ“'¿J^“Òa—È›6¦ yòäÉ“'Ož<ùGòš”{–¼icΓ'Ož<yòäÉå÷ßPû–¯ §·šó|Î]¨ZÖ¤²²Iee“:[~Ë?Ÿÿ<mJò_¶NŠ: \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_3/mask_129_3.dat b/library/phpqrcode/cache/mask_3/mask_129_3.dat
new file mode 100644
index 000000000..b1ce63b74
--- /dev/null
+++ b/library/phpqrcode/cache/mask_3/mask_129_3.dat
@@ -0,0 +1,8 @@
+xÚíÛA
+€ н§ï¹6!n” ðG<q‚4øhð/ªºG?;ÇhÓs¤€¹‚LST¨õÞ÷ëOj»÷åúâ 2#¥ÐÓ
+DÛ×y`¶Ü«ïÙÒP @
+ÏÎ\†BêŽ4*yt$‰
+(P  /È ò‚¼ #Q @
+äyA^t$
+(P @‚¼ /È ò‚ŽD
+(ü\¡¢ô–.`ý§íÉ›j¥oªéC °Sˆ ç;R¥;Rî.€Iõ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_3/mask_133_3.dat b/library/phpqrcode/cache/mask_3/mask_133_3.dat
new file mode 100644
index 000000000..f4181507a
--- /dev/null
+++ b/library/phpqrcode/cache/mask_3/mask_133_3.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_3/mask_137_3.dat b/library/phpqrcode/cache/mask_3/mask_137_3.dat
new file mode 100644
index 000000000..e24ac5b51
--- /dev/null
+++ b/library/phpqrcode/cache/mask_3/mask_137_3.dat
@@ -0,0 +1,2 @@
+xÚíÜA
+Â0Ð}N“ÞÿrnªFÔHSš™à YQ|øé‡ÒZ÷µEìf•æuì,%Ë Í$‰uj÷ÓG£:Ãßzèèóo»Âu¶,:O òsâY»Ä°ï’e:tèÐI¡sÅÕj÷¨|ãÌ+ê»Nø5ŽŽd“ltèСC‡:tÎèè;Úèb:’M²Ñ¡C‡:tèÐ9££ïh£ËëH6ÉF‡:tèСCǽ Ú¨{A%›d£C‡:tèü³NìÓ$^ur ò˜dV—èô±'\Ówj–¾S³´Ñt‚þ;U²½'[ø,7ÃÜ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_3/mask_141_3.dat b/library/phpqrcode/cache/mask_3/mask_141_3.dat
new file mode 100644
index 000000000..a3f6a2480
--- /dev/null
+++ b/library/phpqrcode/cache/mask_3/mask_141_3.dat
@@ -0,0 +1,2 @@
+xÚíÜA
+Â0Ð}Nó{ÿ˹)%]ØjÀf /d!ˆuÈÃOŠUûÚæícµîõô0}šùaº4ùR9ëòÊ_½õ¡T~é`˜ÓÙÌ_ R[’T‡Õ®¯ððn1öÝ’Â"EŠ)R¤H-*•p—~H…Ü¥ßJýäÞ„Ô°”égú‘"EŠ)R¤H‘J“Ò§4ß‘2ýL?R¤H‘"EŠ)RiRú”滀”égú‘"EŠ)R¤H‘ò ­>¥ùz†Öô#EŠ)R¤H‘Z@ªbÂl-)ÌÝ¿ñ<ߧ*©OURŸ"5&•ö›š5ý*iúeÎ J]®+ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_3/mask_145_3.dat b/library/phpqrcode/cache/mask_3/mask_145_3.dat
new file mode 100644
index 000000000..338b7e7a8
--- /dev/null
+++ b/library/phpqrcode/cache/mask_3/mask_145_3.dat
@@ -0,0 +1,3 @@
+xÚíÜÁ
+‚@Ðý|Íóÿ®”•:Œ^ñ ³JyÌ¡¤ªyM§î×j‹×-'
+9¤V—SÛýÖ¦K¶©9ëÇe¬µ)PíyUûû¹£wËeÞ-m jÔ¨Q£F5jÔ¨RËiÙ«ÔF4×_wk}·0+µµjRBR£F5jÔ¨Q»ƒš¾¦eßOMBJHjÔ¨Q£F5jwPÓ×´ì˪IH I5jÔ¨Q£FͳÇúš–íÙc éw5jÔ¨Q£FíµŠ:¡œÿÑzS«Ž*2¤¯UZ_«¾CÒ×*­e_Oí´ïZ¥%dIȯûâ†b \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_3/mask_149_3.dat b/library/phpqrcode/cache/mask_3/mask_149_3.dat
new file mode 100644
index 000000000..30bc5fabc
--- /dev/null
+++ b/library/phpqrcode/cache/mask_3/mask_149_3.dat
@@ -0,0 +1 @@
+xÚíÜA‚0Ð}Oó¹ÿåÜ â¦Hé ¯éÂô“'¬Z×2{oVÛ|Ι«%µ™ê>‚yû·R{‡!8îäÂI+JpI|#¶Ýfì–5κ[âP A‚ $H Á‚Q}ð)Õ&<¹÷E‚§ JQ)J A‚ $H Ás5zþ¥¨%H A‚ $Hà4A^£ÿ5A)*E $H A‚ $è½ Þ3ïMHQ‚ $H A‚ç æü3Þ§`ÞP¯©®o¢Ý>X{טÔè+±ÑWb£¿¡àìß`IÑã)5׈%dš \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_3/mask_153_3.dat b/library/phpqrcode/cache/mask_3/mask_153_3.dat
new file mode 100644
index 000000000..89cdec031
--- /dev/null
+++ b/library/phpqrcode/cache/mask_3/mask_153_3.dat
@@ -0,0 +1,2 @@
+xÚíÜA
+Â0Ð}Nósÿ˹)7mJ¦õ…,Å}8µêX=c¿W^G“e’ÝNó<v]]bí­Iͯ_½Ïû¸gY+M³§j íò“»vË‹tì–Œ&Mš4iÒ¤I“&MšÿªxÞœÑÜu~o[¯~ö4W55­¦¥I“&Mš4iÒ¤I“æS5ML¯©i5-Mš4iÒ¤I“&Mš4o­iz`z@SÓjZš4iÒ¤I“&Mš4izÅôÀôÀs(šVÓÒ¤I“&Mš4iÒ¤¹¬Y‘ÁzK 6ñ¦Ï›•:=¨ÔéÍ_hÆþ6·7m¥6mÞM{üHã \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_3/mask_157_3.dat b/library/phpqrcode/cache/mask_3/mask_157_3.dat
new file mode 100644
index 000000000..167e6f844
--- /dev/null
+++ b/library/phpqrcode/cache/mask_3/mask_157_3.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_3/mask_161_3.dat b/library/phpqrcode/cache/mask_3/mask_161_3.dat
new file mode 100644
index 000000000..72a26a4fc
--- /dev/null
+++ b/library/phpqrcode/cache/mask_3/mask_161_3.dat
@@ -0,0 +1,3 @@
+xÚíÜA
+Â0Ð}N“ÜÿrnªF±ÑTká…,„€NûðÛ ÄZ—Ñ’f7J÷:³Æ’^`WáÙ”U×á»nXÚ¤¼Ç§M-½¾‡™#V¹¥+ß¡ËÛ+9z–ÜÒ–YÒ l”)S¦L™òo•cŸ±¯Ê±O_Cå?ß©õ%Ê;*Kl‰M™2eÊ”)S¦L™2åYeý²]ÊÏÊ[bS¦L™2eÊ”)S¦LyVY¿lW„òGÊ[bS¦L™2eÊ”)S¦LÙÙ
+ý²]g+$¶ßeÊ”)S¦L™2eÊ”­Ð/Ûq¶BbKlÊ”)S¦L™2eÊqÊ™ÿ‚þ¨œ]à­Â£{ÎA¿¼¦œÔ/×ô~¹¦ïŠœV9ï»\%ö÷‰[ãP¯#' \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_3/mask_165_3.dat b/library/phpqrcode/cache/mask_3/mask_165_3.dat
new file mode 100644
index 000000000..870af8f4f
--- /dev/null
+++ b/library/phpqrcode/cache/mask_3/mask_165_3.dat
@@ -0,0 +1,2 @@
+xÚíÝA
+Â0Ð}N3¹ÿåÜT‰ #ØZþÀ Y¥uÈí:ÆÌ›¯1–ϱE®Uæ¹TÙT|SüþÒ·Ô ñ ¿qž)òm-sG²øì ¾ ýBæÈ.C‘ĉ'Nœ8qâÄŸâáÿÕ÷âwv7û[Æç'„tgÄÿ!.Õ¥:qâĉ'Nœ8qâÄÄõãv`ˆ_+.Õ¥:qâĉ'Nœ8qâÄÄõãv`ˆ—êR8qâĉ'Nœ8qâΤèÇíÀ8“"Õ¥:qâĉ'Nœ8qâÄIÑÛq&EªKuâĉ'Nœ8qâ½Ä+¾È9:¹}kFT?^úñêпG¼Åo<0Õ«Cªg/æ_ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_3/mask_169_3.dat b/library/phpqrcode/cache/mask_3/mask_169_3.dat
new file mode 100644
index 000000000..943109526
--- /dev/null
+++ b/library/phpqrcode/cache/mask_3/mask_169_3.dat
@@ -0,0 +1 @@
+xÚíÝA‚0Ð}O3Üÿrnˆ¢‰ñ·¾¦ ¨)}á'3ªæ1EÎÇh‹ßÑ]î4üP[ £_«ñÁ¥]Kvè‡<ÃË™fpý©#ýûª¶y_Êlù[œgëe£ôéÓ§OŸ>}úôéÓÿoý ªµ%uJV/µ°“{¿„þ—ô%¿ä§OŸ>}úôéÓ§OŸþ¨úê}Ýú§êK~ÉOŸ>}úôéÓ§OŸ>ýQõÕûº=ô/Ñ—ü’Ÿ>}úôéÓ§OŸ>}ú£ê«÷u{èï×—ü’Ÿ>}úôéÓ§OŸ>}ú£ê«÷u{蟪/ù%?}úôéÓ§OŸ>}ú¿×¯.N4ÿ»<Oúµõ±‘”z¿z©÷lôêz¿zéö ¢ŸøîW/É_’ÿ´yp \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_3/mask_173_3.dat b/library/phpqrcode/cache/mask_3/mask_173_3.dat
new file mode 100644
index 000000000..746698627
--- /dev/null
+++ b/library/phpqrcode/cache/mask_3/mask_173_3.dat
@@ -0,0 +1 @@
+xÚíÝA‚0Ð}O3ÜÿrnPkŒTTèŒyM$&e/|ù"ÖµdÝÝjÝuþy[¥a»i‹KˆÑ{úòÌM S&z[B…UBÂRIÂCÞ!Ón5Æ\w«4ìB $@ $°[”ÿ°£3Ûëc²½E^%”xw á ÒA:@ $@ $@ $B‚fI³D ÒA:@ $@ $@ $p¶Í’f‰„Ã%Hé@ $@ $@ $@BR š%Í ¿” ¤ $@ $@ $@ )$h–4K$L ¤ $@ $@ $@³„ü_{”PgØÛ´yŽÍ>áƒVMm–¢R³•š¥‘ø™Òá¸t(1ï…¢| \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_3/mask_177_3.dat b/library/phpqrcode/cache/mask_3/mask_177_3.dat
new file mode 100644
index 000000000..9586979a1
--- /dev/null
+++ b/library/phpqrcode/cache/mask_3/mask_177_3.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_3/mask_21_3.dat b/library/phpqrcode/cache/mask_3/mask_21_3.dat
new file mode 100644
index 000000000..bcb4eec49
--- /dev/null
+++ b/library/phpqrcode/cache/mask_3/mask_21_3.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_3/mask_25_3.dat b/library/phpqrcode/cache/mask_3/mask_25_3.dat
new file mode 100644
index 000000000..0ffc375fc
--- /dev/null
+++ b/library/phpqrcode/cache/mask_3/mask_25_3.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_3/mask_29_3.dat b/library/phpqrcode/cache/mask_3/mask_29_3.dat
new file mode 100644
index 000000000..6150ac128
--- /dev/null
+++ b/library/phpqrcode/cache/mask_3/mask_29_3.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_3/mask_33_3.dat b/library/phpqrcode/cache/mask_3/mask_33_3.dat
new file mode 100644
index 000000000..6053b5e39
--- /dev/null
+++ b/library/phpqrcode/cache/mask_3/mask_33_3.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_3/mask_37_3.dat b/library/phpqrcode/cache/mask_3/mask_37_3.dat
new file mode 100644
index 000000000..5dea5b9cb
--- /dev/null
+++ b/library/phpqrcode/cache/mask_3/mask_37_3.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_3/mask_41_3.dat b/library/phpqrcode/cache/mask_3/mask_41_3.dat
new file mode 100644
index 000000000..ca9ddc2aa
--- /dev/null
+++ b/library/phpqrcode/cache/mask_3/mask_41_3.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_3/mask_45_3.dat b/library/phpqrcode/cache/mask_3/mask_45_3.dat
new file mode 100644
index 000000000..3daad97f8
--- /dev/null
+++ b/library/phpqrcode/cache/mask_3/mask_45_3.dat
@@ -0,0 +1,2 @@
+xÚí”K
+À D÷sšñþ—ëFJ(&™)ô³0d¡øЇ’³FÞg!Œ[8Ò=èÛ&ËiaÂÎD)Åd8&AËÕ¬¡a³áÀÛä 1'™I–I”«×³ž7Ù9ù­ exÀ“ß¾È ÄÒIìû&Ö´¯Cçu´ÍJy‚ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_3/mask_49_3.dat b/library/phpqrcode/cache/mask_3/mask_49_3.dat
new file mode 100644
index 000000000..7f6508ddd
--- /dev/null
+++ b/library/phpqrcode/cache/mask_3/mask_49_3.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_3/mask_53_3.dat b/library/phpqrcode/cache/mask_3/mask_53_3.dat
new file mode 100644
index 000000000..8800beab1
--- /dev/null
+++ b/library/phpqrcode/cache/mask_3/mask_53_3.dat
@@ -0,0 +1,2 @@
+xÚí–K
+À0D÷s½ÿåº ­¥‰Ñ! -(.Bp&|ˆ"-t–&`Æq‘Q-"†ð9Ù_+)Be/H8¾ãD®¼%‘a~šÐ}spKFN˜úöœ¶Ö=,ÂÆ;‡;a^tª4÷–‰Ï\™ÞF™ÎáÂÀÊÎSNé§éâ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_3/mask_57_3.dat b/library/phpqrcode/cache/mask_3/mask_57_3.dat
new file mode 100644
index 000000000..4e1e5da38
--- /dev/null
+++ b/library/phpqrcode/cache/mask_3/mask_57_3.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_3/mask_61_3.dat b/library/phpqrcode/cache/mask_3/mask_61_3.dat
new file mode 100644
index 000000000..bf1a3cc7f
--- /dev/null
+++ b/library/phpqrcode/cache/mask_3/mask_61_3.dat
@@ -0,0 +1,2 @@
+xÚí–A
+À0ï¾fýÿçz‘4-%š•Ò*Ãâd°Ðpž!ÝyZÜ«‰æ‚uäõ(ù¸~ë=¹&ÉÛ“´‹)œÌR2â"/ò"ÿ<9çŠFΊ=r§þbòšó"/ò“ƒîÌíçrw¹"2®¯¹ãçÈøùBòèŸ#3-Ø0-KÀW \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_3/mask_65_3.dat b/library/phpqrcode/cache/mask_3/mask_65_3.dat
new file mode 100644
index 000000000..85892089b
--- /dev/null
+++ b/library/phpqrcode/cache/mask_3/mask_65_3.dat
@@ -0,0 +1,2 @@
+xÚí—Q
+€ Dÿç4»÷¿\?R•Û …Å,û!¨OŠ²-òNv®Í1 :Âc¡Zœuï Ú"U‹MÕF ~jK¨€´…-la‹[^q^³Q\éœ=…o”-la‹ÿZpUÒÞB¬„äÿ ±@IµÖKµJzÉ¢|1â ÷¹ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_3/mask_69_3.dat b/library/phpqrcode/cache/mask_3/mask_69_3.dat
new file mode 100644
index 000000000..55318a87b
--- /dev/null
+++ b/library/phpqrcode/cache/mask_3/mask_69_3.dat
@@ -0,0 +1,2 @@
+xÚí×Á
+€0 Ð{¿&ûÿŸó2¤'—®dô l†=,¹F½îéy;$§ì‡¤”WEË-R„Š¨³:¢¡%T,O2½×g…"Ä"‹,²È¢/DÍyĈ˜¹ôɧ{þO䮳È"‹,:N„vÈEñWNÎ#(&,ö,‘䕺Š®ë]æxØ… \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_3/mask_73_3.dat b/library/phpqrcode/cache/mask_3/mask_73_3.dat
new file mode 100644
index 000000000..15be77f64
--- /dev/null
+++ b/library/phpqrcode/cache/mask_3/mask_73_3.dat
@@ -0,0 +1,2 @@
+xÚí˜Q
+€0 Cÿ{šìþ—ógè;è¥JJ?dÔ¬K„=ÚRaÃsJhTJ6exÎkaºú¥§\$é‘n¯´IE,-/ÑÓXB¢è*Ñ…=ËâžíÚÒýweeé4™¢è¸tÿöÌ’tšLщî«t t”ß«œèà¯bž –gF…fž ÖáqºõoÖd¢Ðdn-ð? \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_3/mask_77_3.dat b/library/phpqrcode/cache/mask_3/mask_77_3.dat
new file mode 100644
index 000000000..ec7828044
--- /dev/null
+++ b/library/phpqrcode/cache/mask_3/mask_77_3.dat
@@ -0,0 +1,2 @@
+xÚíØA
+€0 Àû¾&ùÿç¼­BŠiÖRaK"té`I@³¶|¶º…fX—ö±Ôâ­yiöåólõE‘:Sza18G¾À‰if˜K*©¤?–:YÜC1쌞졘(ቷ—êöJ*©¤’¾’jÊl*Õí•TRI×KëÌîR^Ø™æœÞksûÂ)cÌ)cÌ)³JZø¦¶óí¥äãa· \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_3/mask_81_3.dat b/library/phpqrcode/cache/mask_3/mask_81_3.dat
new file mode 100644
index 000000000..47bc0f793
--- /dev/null
+++ b/library/phpqrcode/cache/mask_3/mask_81_3.dat
@@ -0,0 +1,2 @@
+xÚíØ1
+À Fá=§‰÷¿\‘,JÑGAúÄ¡‹ýhjÀÌ>ÚÙ#Ê3X™À’ø:çk÷Ô¹\ûFM JÝhuÇú½3¸¨>ƒT­ZõŸÔ{ÇãPSgøP'¹ÉkÔV¸jÕªU«¶_Û¯ý¯U«V­º•»=P Îo†O:WÒ‹ÞäÝjü[ŸWxÒÎmò Ù5 \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_3/mask_85_3.dat b/library/phpqrcode/cache/mask_3/mask_85_3.dat
new file mode 100644
index 000000000..02c4f8cdb
--- /dev/null
+++ b/library/phpqrcode/cache/mask_3/mask_85_3.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_3/mask_89_3.dat b/library/phpqrcode/cache/mask_3/mask_89_3.dat
new file mode 100644
index 000000000..2b4cb59fc
--- /dev/null
+++ b/library/phpqrcode/cache/mask_3/mask_89_3.dat
@@ -0,0 +1,2 @@
+xÚíÙ1€ …ὧ)÷¿œ *.@àUÁü ƒÓÓ|±¶‰î¹’âeŵ6Û¢‚‹äw5*÷ô) oôi¨K®‘¢4nk>Áè1}d>œÐ@ 4ÐXYC¾oœò Û¡1<º©A§ h F„ûÆt
+ß 4Ð@µ5´—ž1ÁWrÒï>7û«û†Gíµ}}¤¡x7|ÇN‘gÆîÚN \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_3/mask_93_3.dat b/library/phpqrcode/cache/mask_3/mask_93_3.dat
new file mode 100644
index 000000000..b4cc8a971
--- /dev/null
+++ b/library/phpqrcode/cache/mask_3/mask_93_3.dat
@@ -0,0 +1,2 @@
+xÚíÙA
+€0 DÑ}N“ÞÿrnJɪQš~éB¨Œú06 û£n®aá¸<<¦×‡‡ôÿe6×M—R™ýCùÅPÈ ¥LÀ±ôÌ“išØ9MŽ 2È ƒLkÅ®½dD»v*ó"a·ÔX†jBdAdªdèôZöÀTßdAd®qYø0exö÷ö¼Ÿqe§çÊN¯«Œú©ª&WV“ææQvcô \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_3/mask_97_3.dat b/library/phpqrcode/cache/mask_3/mask_97_3.dat
new file mode 100644
index 000000000..7adc9ebaa
--- /dev/null
+++ b/library/phpqrcode/cache/mask_3/mask_97_3.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_4/mask_101_4.dat b/library/phpqrcode/cache/mask_4/mask_101_4.dat
new file mode 100644
index 000000000..1c97dc048
--- /dev/null
+++ b/library/phpqrcode/cache/mask_4/mask_101_4.dat
@@ -0,0 +1,2 @@
+xÚíšA€ Füÿs^1 b¤‹ÆáИª]ÃØÖ4šm+Æ8Ð+˜Ve¬Ä^H­R]–\Íc‡®ŠÛ
+·oõWN#¸îXáéØá+lð ž­HE³cp \à—^.Î9qñW9ø¼ïç"ò…:¸À.ŸæBßÿó÷ùBƒ \àæ0Ìa˜ÃPǨcp \ÞÍÅïO•’‹N¥qjpGÖô}“ô}¥Ê$.äË…Š§ÐŠ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_4/mask_105_4.dat b/library/phpqrcode/cache/mask_4/mask_105_4.dat
new file mode 100644
index 000000000..0211cdb3a
--- /dev/null
+++ b/library/phpqrcode/cache/mask_4/mask_105_4.dat
@@ -0,0 +1,2 @@
+xÚíšK
+€0 D÷=Mrÿ˹‘øA …ÎTáe‘EFóL2 #ŽÈÌé¹¢…_I!“‹•ßú­£ç딤Ѻ““Î-Õ«km¿Oñá]sS T6*ùª'8Á NŸâ$Þî'N¥Z‹Êí^œ<JvNôsNp‚œà„ßÃïá÷è'æœà'8Á ¿‡ßÃï1÷˜{p‚œàô?N¿µnœ¼JóüBÏ…ùü^Øüž[i'úiHI-¶¢m+W \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_4/mask_109_4.dat b/library/phpqrcode/cache/mask_4/mask_109_4.dat
new file mode 100644
index 000000000..2cc0c815d
--- /dev/null
+++ b/library/phpqrcode/cache/mask_4/mask_109_4.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_4/mask_113_4.dat b/library/phpqrcode/cache/mask_4/mask_113_4.dat
new file mode 100644
index 000000000..99bd73f69
--- /dev/null
+++ b/library/phpqrcode/cache/mask_4/mask_113_4.dat
@@ -0,0 +1,2 @@
+xÚíÚA
+à н§Ñû_®‹Jb)t&„çBBÒøK_•‰¤Ö³µÖ6õC+5/q_Üghfâ×Çú©Éíÿž¿CbH+¾p›º¿¯§;WK?ÞüGútô ‰ñ¿*GŽ9r|‚c`ÕÑc¾¶Î9FKHÌq4­«9räÈ‘#Ç…ŽêUÏ×ÍGë*GŽ9räÈÑ>¹}rûäÖUë*GŽ9r|ºcÌ[Á£cNâ¬Þ[_=Æ׫5¼^ÍJ¼£ù¸ 1*ôq›v \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_4/mask_117_4.dat b/library/phpqrcode/cache/mask_4/mask_117_4.dat
new file mode 100644
index 000000000..386725918
--- /dev/null
+++ b/library/phpqrcode/cache/mask_4/mask_117_4.dat
@@ -0,0 +1,2 @@
+xÚíÚË
+à н_£ÿÿs]4Ø¥©Dg¤nò¸à‰2Jj}´ÖÚÒ¾·RsSWG¶R¿ŒÉ§†žÚ)5¬»ÞE†áämá#ܯ•ã¾Õðk_"ÃzŸ”š3Â\¹råÊ•+×r ­L»k|ê/{„¹;Ž'×àÔ<WóÕ:Ì•+W®\¹rÝÜU=lŸ3ÏÕ|µsåÊ•+W®\û;÷wîo¾Z‡¹råÊ•+×ý\ƒþ¼sÍKýÃûzešS×”z83u#Wóubjdð àÝ$Ÿ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_4/mask_121_4.dat b/library/phpqrcode/cache/mask_4/mask_121_4.dat
new file mode 100644
index 000000000..84957eb7b
--- /dev/null
+++ b/library/phpqrcode/cache/mask_4/mask_121_4.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_4/mask_125_4.dat b/library/phpqrcode/cache/mask_4/mask_125_4.dat
new file mode 100644
index 000000000..b98dc813a
--- /dev/null
+++ b/library/phpqrcode/cache/mask_4/mask_125_4.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_4/mask_129_4.dat b/library/phpqrcode/cache/mask_4/mask_129_4.dat
new file mode 100644
index 000000000..8ecfa2508
--- /dev/null
+++ b/library/phpqrcode/cache/mask_4/mask_129_4.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_4/mask_133_4.dat b/library/phpqrcode/cache/mask_4/mask_133_4.dat
new file mode 100644
index 000000000..69f83acbd
--- /dev/null
+++ b/library/phpqrcode/cache/mask_4/mask_133_4.dat
@@ -0,0 +1,3 @@
+xÚíÛA
+à н§Ñû_®›Òš…BþÂËB¨2à‹f™ó{­µ
+ÇíÆcf¥¨°gÈKqøã=óÙ)Ú®£‹»çWÀŠlK2Þ¿ÊË8:oþCRd¬\pÁ\pñ@­ï+$EÅÿÏùQ.ìÎç\pÁ\è#úˆ>¢Ø/œ#\pÁ\pÁ…>¢è#ö ç\pÁ\p¡è#úˆ>âqŽpÁ\pÁÅ.º¾$¿ºÈIqü𽤠dô‘ÑG’R»°_4¦è ò€˜ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_4/mask_137_4.dat b/library/phpqrcode/cache/mask_4/mask_137_4.dat
new file mode 100644
index 000000000..0c09c487c
--- /dev/null
+++ b/library/phpqrcode/cache/mask_4/mask_137_4.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_4/mask_141_4.dat b/library/phpqrcode/cache/mask_4/mask_141_4.dat
new file mode 100644
index 000000000..62b03f243
--- /dev/null
+++ b/library/phpqrcode/cache/mask_4/mask_141_4.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_4/mask_145_4.dat b/library/phpqrcode/cache/mask_4/mask_145_4.dat
new file mode 100644
index 000000000..33fb21124
--- /dev/null
+++ b/library/phpqrcode/cache/mask_4/mask_145_4.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_4/mask_149_4.dat b/library/phpqrcode/cache/mask_4/mask_149_4.dat
new file mode 100644
index 000000000..de99310f3
--- /dev/null
+++ b/library/phpqrcode/cache/mask_4/mask_149_4.dat
@@ -0,0 +1,2 @@
+xÚíÜÁ
+!н_£ÿÿsmœÉ Œ„Á+XÓ‹9=ó.ªõ=Zkça”š]ÕÞ’> K¯jò´oé ¾ªý|¯SªŠSWKùZmË׌ºƒÃjé¾€Ã\’Š¹çЪ2ï W\qÅW\qÅÕñ®"~·ß× ­jvÚtòê®òªŠv¥_Ùíƒ\qÅW\qÅW\q%g3Èä ú•}+®¸âŠ+®¸âŠ+®ä r9ƒœA¿²rÅW\qÅW\qÅ•œAÎ g3èWöAû W\qÅW\qÅW—«œÆ]åVµ~v{êDŸ™3ÔÈœ!¹ªƒ\éWÇô«¬Â^<ír/ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_4/mask_153_4.dat b/library/phpqrcode/cache/mask_4/mask_153_4.dat
new file mode 100644
index 000000000..e827dd16f
--- /dev/null
+++ b/library/phpqrcode/cache/mask_4/mask_153_4.dat
@@ -0,0 +1,2 @@
+xÚíØ1ƒ0ÀÞ¯ñýÿsi,')p!äµ4.ÜГ;±½¿WUmßçj=¿²„²ê°Ê.NO¾þ>úûšçTµÚ[÷¾S7vÜÛœg¶q•„?æ÷ÞÒ
+š{pe¹o“3Î8ãŒ3Î8ãŒ3Î8{ØYXzðá,°²Û_úO¤ÓYfeñÎô3sÓÜäŒ3Î8ãŒ3Î8ãŒ3¹†\C®!×ÐÏÌMs“3Î8ãŒ3Î8ãŒ3Îär ¹†\C?379ãŒ3Î8ãŒ3Î8ãŒ3¹†\C®!×07ÍMÎ8ãŒ3Î8ãŒ3ÎÎq¶þÚé,»²ËmMrs›k¤Wvœ3ýìÀ~–WÜ €WB \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_4/mask_157_4.dat b/library/phpqrcode/cache/mask_4/mask_157_4.dat
new file mode 100644
index 000000000..ad5fcf69d
--- /dev/null
+++ b/library/phpqrcode/cache/mask_4/mask_157_4.dat
@@ -0,0 +1 @@
+xÚíÜ1Â0ÀÞ¯ñýÿs4˜"FPà=iRX¢XÉÛ0ç멪€u 4ftÑÖl}Òm¾øßýžéâž­»Sû|²ËÑŽëSÌ û¶ŽÄPÏ5<]öÉrÇwÜqÇwÜq÷£»È^QáéN6ÃûáéZ¸sß™³æ,wÜqÇwÜqÇ>«Ïê³ú¬ûÎœ5g¹ãŽ;î¸ãŽ;îôY}VŸÕgÝwæ,wÜqÇwÜqÇwú¬>«Ïê³æ¬9ËwÜqÇwÜq§Ïê³ú¬>ë¾3gÍYî¸ãŽ;î¸ãî[ww?P3Üå§ÛþòÑƘÝggtŸí®¡;÷]ûû.3àw4A¯ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_4/mask_161_4.dat b/library/phpqrcode/cache/mask_4/mask_161_4.dat
new file mode 100644
index 000000000..7604c4540
--- /dev/null
+++ b/library/phpqrcode/cache/mask_4/mask_161_4.dat
@@ -0,0 +1 @@
+xÚíÚA‚@ Ðýœfæþ—s!AL€Ä_|,ˆ™4òl)iï¯mŒ²ßl­×‰0'¼÷ +E¸û…£ ÷–]N\ºêüxÅ#·‡§2Ÿç/ü¼_¬{—7gÛò9ì¼Ù·ÔÀÖ}óï2‡rÈ!‡•?}-³#<Zü×χëj"¬áP>T—Õe9äC9äC9üÀ¡~ùöý²÷6Sʇ겺Ì!‡rÈ!‡rÈ!‡æôËÞÛ˜sÕe9äC9äC94ç _öÞÆœƒ|¨.«ËrÈ!‡rÈ!‡šsÐ/›s0ç ªËê2‡rÈ!‡rÈá8ì§}D‚ÃÎìçw£ùýrï—«DXΡ|xÃ|˜ä!à2ð \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_4/mask_165_4.dat b/library/phpqrcode/cache/mask_4/mask_165_4.dat
new file mode 100644
index 000000000..d83d63165
--- /dev/null
+++ b/library/phpqrcode/cache/mask_4/mask_165_4.dat
@@ -0,0 +1,3 @@
+xÚíÚA
+1 Ð}OÓÞÿr.ª"Ñ*?úfÑÅÌP‚óLHIï—kŒµÎ«õZQ¦…8
+Gy÷êqkñ-ž¿ÿÎn5£Œ½Ú+?ÌÒñùù¾Ýâ¿ø|ÖŽ÷Òþà·kKn®E¢¬ñŹä’K.¹ä’K.?ï2º£˜.ó£|¼EJ§{å2<Ê:.åKu\ç’K.¹ä’K.¹ä’Ë—úñ¿êÇmu)_ªãê8—\rÉ%—\rÉ%—\šÛÐ;'2·!_ªãê8—\rÉ%—\rÉ%—\šÛÐ;'2·!_ªã\rÉ%—\rÉ%—\rinC?nnÃ9‘¹ ùRç’K.¹ä’K.¹äò;.û²óHqY'ÊݽéþN·F?ÞKôã•¢,êR¾üé|™è My*3 \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_4/mask_169_4.dat b/library/phpqrcode/cache/mask_4/mask_169_4.dat
new file mode 100644
index 000000000..4aac95c1e
--- /dev/null
+++ b/library/phpqrcode/cache/mask_4/mask_169_4.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_4/mask_173_4.dat b/library/phpqrcode/cache/mask_4/mask_173_4.dat
new file mode 100644
index 000000000..9df4d865d
--- /dev/null
+++ b/library/phpqrcode/cache/mask_4/mask_173_4.dat
@@ -0,0 +1,2 @@
+xÚíØK
+1À}N“ÜÿrnÂa øÃ~ZY!ÎÐJÑt^ï×5Æ(¸/«õÌjk–z[pjµ§_Ø?~v:|jwúÕ–_mû£îXzòoõ–Ó6?nËÞŠ<ö°j³$pË-·ÜrË-·_p[z¾=ÞVíæ–Qí¦3ÝæTéV¿ÕoÍ ÜrË-·ÜrË-·ÜrË-·r09˜L¦ßšÌ ÜrË-·ÜrË-·ÜrË-·r09˜L¦ßšÌ ÜrË-·ÜrË-·ÜrË-·r09˜L¦ßšÌ ÜrË-·ÜrË-·ÜrË-·r09˜L¦ßšÌ ÜrË-·ÜrË-·Ür›æv­æ6¯Ú÷ßý?•,eå`=*K¬6Ú­~û§ý6£à ´*× \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_4/mask_177_4.dat b/library/phpqrcode/cache/mask_4/mask_177_4.dat
new file mode 100644
index 000000000..6437d2511
--- /dev/null
+++ b/library/phpqrcode/cache/mask_4/mask_177_4.dat
@@ -0,0 +1,2 @@
+xÚíØA
+!À»¯Ñÿ.1B„éMyð”![ c÷þ\cŒ²ûZ­çV\¹Üq“Š7ßâÝEó‡Oýzg~ÅkëøË¿jž;pg”Šu²Í[*7Š×½¥ºöÀŠóTpÌ1ÇsÌ1ÇsÌñqÇ!¯ÿ‹ã Šw/òr¯ÿå8«âXÇú±~l®à˜cŽ9æ˜cŽ9æ˜cŽ9–»ÉÝänr7¹›~l®0WpÌ1ÇsÌ1ÇsÌ1ÇËÝänr7¹›~l®0WpÌ1ÇsÌ1ÇsÌ1ÇËÝänr7¹›~¬›+8æ˜cŽ9æ˜cŽ9æ˜cŽånr7¹›ÜM+8æ˜cŽ9æ˜cŽ9æ˜ãtÇû§oEÇ™ŸÉN¥Xy¹[ËÝR+¾‰cýø¯ûqNÑ\,4J \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_4/mask_21_4.dat b/library/phpqrcode/cache/mask_4/mask_21_4.dat
new file mode 100644
index 000000000..e006b67e4
--- /dev/null
+++ b/library/phpqrcode/cache/mask_4/mask_21_4.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_4/mask_25_4.dat b/library/phpqrcode/cache/mask_4/mask_25_4.dat
new file mode 100644
index 000000000..0c7c44bbb
--- /dev/null
+++ b/library/phpqrcode/cache/mask_4/mask_25_4.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_4/mask_29_4.dat b/library/phpqrcode/cache/mask_4/mask_29_4.dat
new file mode 100644
index 000000000..c28dc20e8
--- /dev/null
+++ b/library/phpqrcode/cache/mask_4/mask_29_4.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_4/mask_33_4.dat b/library/phpqrcode/cache/mask_4/mask_33_4.dat
new file mode 100644
index 000000000..5834b6fb5
--- /dev/null
+++ b/library/phpqrcode/cache/mask_4/mask_33_4.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_4/mask_37_4.dat b/library/phpqrcode/cache/mask_4/mask_37_4.dat
new file mode 100644
index 000000000..4bf2e26ed
--- /dev/null
+++ b/library/phpqrcode/cache/mask_4/mask_37_4.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_4/mask_41_4.dat b/library/phpqrcode/cache/mask_4/mask_41_4.dat
new file mode 100644
index 000000000..b75b7d052
--- /dev/null
+++ b/library/phpqrcode/cache/mask_4/mask_41_4.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_4/mask_45_4.dat b/library/phpqrcode/cache/mask_4/mask_45_4.dat
new file mode 100644
index 000000000..1b921f300
--- /dev/null
+++ b/library/phpqrcode/cache/mask_4/mask_45_4.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_4/mask_49_4.dat b/library/phpqrcode/cache/mask_4/mask_49_4.dat
new file mode 100644
index 000000000..e417f9476
--- /dev/null
+++ b/library/phpqrcode/cache/mask_4/mask_49_4.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_4/mask_53_4.dat b/library/phpqrcode/cache/mask_4/mask_53_4.dat
new file mode 100644
index 000000000..7e88826dd
--- /dev/null
+++ b/library/phpqrcode/cache/mask_4/mask_53_4.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_4/mask_57_4.dat b/library/phpqrcode/cache/mask_4/mask_57_4.dat
new file mode 100644
index 000000000..84669c7d6
--- /dev/null
+++ b/library/phpqrcode/cache/mask_4/mask_57_4.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_4/mask_61_4.dat b/library/phpqrcode/cache/mask_4/mask_61_4.dat
new file mode 100644
index 000000000..d127c3be2
--- /dev/null
+++ b/library/phpqrcode/cache/mask_4/mask_61_4.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_4/mask_65_4.dat b/library/phpqrcode/cache/mask_4/mask_65_4.dat
new file mode 100644
index 000000000..c24343d94
--- /dev/null
+++ b/library/phpqrcode/cache/mask_4/mask_65_4.dat
@@ -0,0 +1,2 @@
+xÚí—K€ D÷œ¦½ÿåtX£Ð™.4ÓE1^ÂãÓhv†»OæÍx„ùéW“ð0 ñ°JHÅ»‡½­ðz[ÿ^܈[vâȾ
+yy‡ZÀkß=`„™êv·cíǃî…<ȃ<üÚCî/)zàÜ‘×¯× ¡ÈÃÇÎC²Œš"" \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_4/mask_69_4.dat b/library/phpqrcode/cache/mask_4/mask_69_4.dat
new file mode 100644
index 000000000..a73b1144d
--- /dev/null
+++ b/library/phpqrcode/cache/mask_4/mask_69_4.dat
@@ -0,0 +1 @@
+xÚí—;À0CwN÷¿\—ˆ~¤¨;C$3°$<)/m­ºß¥žeÎ¥T±‘2  —:¥]ÿ^VV¡%ƲzAïnÈpv…s"y‘y‘y)zöá¤dÄu6½àª½Gú¾È‹¼ÈËi^šÂ/<ÊtÓrÂrrÚ)9ͤlõrìó‚.¶‡Ö \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_4/mask_73_4.dat b/library/phpqrcode/cache/mask_4/mask_73_4.dat
new file mode 100644
index 000000000..72f89227e
--- /dev/null
+++ b/library/phpqrcode/cache/mask_4/mask_73_4.dat
@@ -0,0 +1,3 @@
+xÚí˜A
+€0 ïyMòÿÏé¡´)1Ý-‚lE3š=Ô}¬ˆ(Öô°9ŸTÇdÎÒò–E/eO ZOžîãÛÅ»KíY;ÛúpS5Ð+‘ÄëNžäIžŠžà|
+"©eìvúö+DÝ“æNs'Oò¤WŽkîäIž¾ð„ì†Ìž¸¤FúòrÜi9Î&óô«ÿ ‡]?ÃóA \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_4/mask_77_4.dat b/library/phpqrcode/cache/mask_4/mask_77_4.dat
new file mode 100644
index 000000000..993c48608
--- /dev/null
+++ b/library/phpqrcode/cache/mask_4/mask_77_4.dat
@@ -0,0 +1,2 @@
+xÚí˜Ñ
+€0Eßý÷ÿ?×ËjFe8¯0êú uØN©0Õ­µ‰lB´†6‡:«h·<½õ–§¥CÜe\,¹ †ìÔÜ—~ø & rd0 »Sz£7z+ô–êoº»ÓÜþëäÝŽVâuÊ:¥7z£·Wo¿š ËÎSÖ)ë”Þèmoù3ë O‹y;:*h¥Þ>û¿a€ïCe \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_4/mask_81_4.dat b/library/phpqrcode/cache/mask_4/mask_81_4.dat
new file mode 100644
index 000000000..dd6521613
--- /dev/null
+++ b/library/phpqrcode/cache/mask_4/mask_81_4.dat
@@ -0,0 +1,3 @@
+xÚí˜A
+€0 ïyMòÿÏy‘XE m7"89ä 2’Ѹ ûQ1ݳÌëˆ+¸x‰x;ÅÓt35DIY÷¶1x\:už³ýº•}î¦e/ ê§Æ#ñø¢Th<
+‰ùùU¤BzÔË<²×ì5ñˆG<’×ä5{G<⢿®5Äñ<饫>¯]ž×UÄr¿xuÐ ” Üû \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_4/mask_85_4.dat b/library/phpqrcode/cache/mask_4/mask_85_4.dat
new file mode 100644
index 000000000..c8d5123e2
--- /dev/null
+++ b/library/phpqrcode/cache/mask_4/mask_85_4.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_4/mask_89_4.dat b/library/phpqrcode/cache/mask_4/mask_89_4.dat
new file mode 100644
index 000000000..5b9bd7ec3
--- /dev/null
+++ b/library/phpqrcode/cache/mask_4/mask_89_4.dat
@@ -0,0 +1,2 @@
+xÚíÙ1
+€0 …ὧIî9«Æ% Í Š‡ VÞðÚ€f×r÷ÅÖ0}òzì=¼#9ùìéûÎäÒ•:§þû~›sØó¹¨1BÕg&ë4pÆgœq.p.»í°&g·ÿÂT05Érgú™sgœqÆçrgæ¯Ïuô3çÎ8ãŒóëkÿ.Egm²»b*ÐÍ&›7ÔÉÍÎ?íçúð ¯:Þü \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_4/mask_93_4.dat b/library/phpqrcode/cache/mask_4/mask_93_4.dat
new file mode 100644
index 000000000..be7f5e525
--- /dev/null
+++ b/library/phpqrcode/cache/mask_4/mask_93_4.dat
@@ -0,0 +1,2 @@
+xÚíÙK
+À „ὧIî¹n$}P‚ÅŒBù]¸‘Né§È@ÍÎáî%sŒfkÒ«¢}CzòoA}aʽ2½|¤îé~ØÀªD&žl=¥êÀÜç¦Yœ®•ÁwÜqÇ}³» q\ÜEéY³˜já®K_âÎyçžÁwÜqÇwz$=’É=ƒ;î¸ãŽû_Ý‹ÿ€>ÜõéŸ+ÑpÓÓöH“öÈéÜ9ï¢DÞi \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_4/mask_97_4.dat b/library/phpqrcode/cache/mask_4/mask_97_4.dat
new file mode 100644
index 000000000..5d848caad
--- /dev/null
+++ b/library/phpqrcode/cache/mask_4/mask_97_4.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_5/mask_101_5.dat b/library/phpqrcode/cache/mask_5/mask_101_5.dat
new file mode 100644
index 000000000..c21869e83
--- /dev/null
+++ b/library/phpqrcode/cache/mask_5/mask_101_5.dat
@@ -0,0 +1,2 @@
+xÚíšÑ
+€ Eßýšíÿ®+£%=ÜM¢3Cbvó¸ Ѭ›«ÍNkû¹´gqõkqq{©%ôO¿ÒòüoçžùÈû,i–¨ÅKÖeœeçÁ3[›|‰îiž¶÷‡¾õ˜ã©V¥¥h]` Æ` Æ0¦Ê•±¸zË´TÔ0Gu×ì/qŒ8F®„1ƒ±3¶:WÊò>õ˜´#ŽÇÈ•0c0öQÆ8»øE=F#Ž‘+a ÆþÄXÖÍž+cV©%9W>ßíQž]Tk©¹“Y-gL¸÷óîq¬DËè‰‹Ï \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_5/mask_105_5.dat b/library/phpqrcode/cache/mask_5/mask_105_5.dat
new file mode 100644
index 000000000..bc8798c64
--- /dev/null
+++ b/library/phpqrcode/cache/mask_5/mask_105_5.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_5/mask_109_5.dat b/library/phpqrcode/cache/mask_5/mask_109_5.dat
new file mode 100644
index 000000000..25a394402
--- /dev/null
+++ b/library/phpqrcode/cache/mask_5/mask_109_5.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_5/mask_113_5.dat b/library/phpqrcode/cache/mask_5/mask_113_5.dat
new file mode 100644
index 000000000..25f42b8b2
--- /dev/null
+++ b/library/phpqrcode/cache/mask_5/mask_113_5.dat
@@ -0,0 +1,9 @@
+xÚí›Á
+ƒ0DïùšÝÿÿ¹^Ò6¥I63[è[EDqÌc˜ÅÑ+•ÏjÃy¤ì81•û\c
+·‹7Úc«åªÆõû?uý}DK™4¦}Çï,¥kkûgì--ž3[÷½´U…Æ‚y„UX…UXýSV ³:Ï«ëûÕî,÷è|æýкSúô¾Š¯â«°
+«°
+«°
+«VÉ«¢¼*ÑXÒ[á«ø*¾
+«°
+«°
+«°zŠUò*ßN÷Vø*¾J€UX…UX…ÕSóèXiýÊjTi4f¹õZkU^­Ôè_‡ìê­~ŠU‘çxþ }Õ®ñZ/r \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_5/mask_117_5.dat b/library/phpqrcode/cache/mask_5/mask_117_5.dat
new file mode 100644
index 000000000..f236940de
--- /dev/null
+++ b/library/phpqrcode/cache/mask_5/mask_117_5.dat
@@ -0,0 +1 @@
+xÚí›Á„ Dï|Mçÿn/*{ÁM¦ÕÍ+„˜pÐI_&mˆ-äŽèѾžCæõä­òÏ3­2u­?o-kgB7wc=¯™‘ªU%yíoÝùRæhÓ¯șDo:Ö¶y¤R£JkQ^a†a†a†ÿáqOgÚiJ¯ýç ;úœáqOgÚ)ÓŠãÃø0 Ã0 Ã0 Ãð[¦v×ö>ç=>ŒãÃ0 Ã0 Ã0 ÃOf˜z˜3Ž»=>ŒãÃ0 Ã0 Ã0ü.†3ÿ÷ïZ£$¯×·8\õp”ÔÃùw4½Çá:ã¨ÖZÀp¤:q¹ÖÄù§X 7 \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_5/mask_121_5.dat b/library/phpqrcode/cache/mask_5/mask_121_5.dat
new file mode 100644
index 000000000..9bb5c4158
--- /dev/null
+++ b/library/phpqrcode/cache/mask_5/mask_121_5.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_5/mask_125_5.dat b/library/phpqrcode/cache/mask_5/mask_125_5.dat
new file mode 100644
index 000000000..2161c50a4
--- /dev/null
+++ b/library/phpqrcode/cache/mask_5/mask_125_5.dat
@@ -0,0 +1,2 @@
+xÚí›A
+Ä E÷ž&¹ÿåfc;S´¶$?‹‹”ŠØQ4ëáYaßhûyJ}9ºg=×Ú=©liŸ´.;nh_ÍÔýïwzýží.÷qôƒCW”¶üÏȧyº× uëÞë’PkÏ;ÌÃ<ÌÃ<ÌÃ<ÌÃ|*óqëùÎü,‡ m“kWæqçNÊl—%ª ŸÇçñy˜‡y˜‡y˜‡y˜‡ù×Ì×^Ïæ2ä°…sX|ŸÇçaæaæaæaæ3Ï™9lH‹Ïãóø<ÌÃ<ÌÃ<ÌÃ<Ì¿›÷웿Ì[í¢õüên`ì™TíÚûqŠ¶8ó¡^—vôy©öŽ« \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_5/mask_129_5.dat b/library/phpqrcode/cache/mask_5/mask_129_5.dat
new file mode 100644
index 000000000..f0c1d6502
--- /dev/null
+++ b/library/phpqrcode/cache/mask_5/mask_129_5.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_5/mask_133_5.dat b/library/phpqrcode/cache/mask_5/mask_133_5.dat
new file mode 100644
index 000000000..46be8b094
--- /dev/null
+++ b/library/phpqrcode/cache/mask_5/mask_133_5.dat
@@ -0,0 +1,2 @@
+xÚíÜA
+Ã0 DѽOcÝÿr]4%1mCTåÉƯ„Ð÷xÎœ[DvÌ=Æá{Fúú–E¤Ïµˆäq½?Ý¿Ü9ûkeÑ­ù}±'2^ý•cœçš4G”žÛ:¶3=J£K-šôF0‚Œ`#ÿÍHÒþˆwð'#ß<{Ú~—Z4é :BG舻F0‚Œ`„áGø~„ŽÐ:‚Œ`#Á?Âð#t„ŽÐw-Œ`#Á?Âð#ü¡#t#ÁF0r·…ïÙ}Qõš}e¤üÝòR‹Ú;ø<ùçCžéV‹}Ñ—‘ìó¢ËÙY-Hž \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_5/mask_137_5.dat b/library/phpqrcode/cache/mask_5/mask_137_5.dat
new file mode 100644
index 000000000..064e7f2f3
--- /dev/null
+++ b/library/phpqrcode/cache/mask_5/mask_137_5.dat
@@ -0,0 +1,3 @@
+x򒆄
+ƒ0 …áû>Móþ/·ÇkÅ1mÂøªÈXº³ü=‰–ö¾µÈhýÕÚîså×áH"ãk ÇM„:îúê–3qÒOü¿W}ÿ9’Ô–¬I”‰“ýHž1ÙG;þ- Ï©sìîÚ¶ù?Ò[%M
+Å v°ƒìü#;£zg^ÝÔ3Õd}Î6‹“Å9ÛÆΨޙ×@7õ”Ò„ïð¾#gÃv°ƒì`;׳£Þ©\ï$ÔÅåŸð¾ÃwälØÁv°ƒì`çvÔ;ÞÖ}7Êwøß‘³a;ØÁv°ƒkA­µ”ïð¾#gÃv°ƒì`ç=N2wúxg§WÓ¤@n?Ûëc}½SQ“:ûZd?+¨ÏÎú9vÆÎzß)£ÉæÝáP \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_5/mask_141_5.dat b/library/phpqrcode/cache/mask_5/mask_141_5.dat
new file mode 100644
index 000000000..60c1a8e81
--- /dev/null
+++ b/library/phpqrcode/cache/mask_5/mask_141_5.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_5/mask_145_5.dat b/library/phpqrcode/cache/mask_5/mask_145_5.dat
new file mode 100644
index 000000000..9303c07f9
--- /dev/null
+++ b/library/phpqrcode/cache/mask_5/mask_145_5.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_5/mask_149_5.dat b/library/phpqrcode/cache/mask_5/mask_149_5.dat
new file mode 100644
index 000000000..4256cefd0
--- /dev/null
+++ b/library/phpqrcode/cache/mask_5/mask_149_5.dat
@@ -0,0 +1,3 @@
+xÚíÜ[
+Â0Ðÿ®&³ÿÍùcµ }-s+'Š‡œ^;AÇxŽêã=¦ÅëQ­Ï_gUÝﵪæãx­ÆÞGûõTí½ëȺV¹ïúœU̪UE®«å¬æõ_IÇ´;ÿŽÇT1×öÅóôÌ Š©µ
+]W 2È ƒ 2Èà ¶|oß5ØuóꆬuI¶:(WK­U躒ƒrPÊAdAdA; vÞ®íÑoíÝ_zNOæÏ{2rPÊA9È ƒ 2È ƒ 2Èà9íÑß}^O挞Œ”ƒrÐwQdAdAýn½žŒßMÈA9(dAdA¯^Wó„² ŽäZ…Ý.+•³GŸ^«ÌÿëKêÉÜÑ`×µ}Ë`_FÖê÷k \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_5/mask_153_5.dat b/library/phpqrcode/cache/mask_5/mask_153_5.dat
new file mode 100644
index 000000000..deea09d77
--- /dev/null
+++ b/library/phpqrcode/cache/mask_5/mask_153_5.dat
@@ -0,0 +1,2 @@
+x򒆄
+‚@Ðw¿fæÿ®—¬¨Ð¬`ïÖÙD"I¶ÁÃe­ê<:aÔu,7ï«öOfÖÛ³šuÀëPÍ6Žî~ñís¾zÕÁÏûãsÞÏ,jÄÕ¬c¯³ëÌVöZvߨmé° ¸ì—s^uÜH®YðuÆ&›l²É&›l²É&›_±9¤¯±ÚÜê ;]³Ä^Ðjs«O;ì˜Ü”›rSn²É&›l²É&›l²9½Íy×›ƒÖèzAÖ ’›rSnÊM6Ùd“M6Ùd“M6§µéÞƒ»÷@/è±$7å¦Ü”›l²É&›l²É&›lzŽzAžC‘›rSnÊM6Ùd“M6Ùd“ÍOlîþ7á°šUìu¶NªãÖ›»F¯Úcú·óÌêÍP³P›—œSÔ,l;HûO§ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_5/mask_157_5.dat b/library/phpqrcode/cache/mask_5/mask_157_5.dat
new file mode 100644
index 000000000..176e2a69f
--- /dev/null
+++ b/library/phpqrcode/cache/mask_5/mask_157_5.dat
@@ -0,0 +1 @@
+xÚíØ1ƒ0DÑÞ§ñÞÿriœ˜( r*¥· „\™Õ~>Cï£*¥ú¬v¹ïsýØ]Åœ_{W!Çzﶬ/ÏÝÞõ÷ÝÅÕ)½Ë™»¹Áöä¤vÿ ›ÏV‘®×6ÜV‘•Þ»ð¹Ã,f1‹YÌb³˜Ê Ìn^o¯¿>¿þí\Oï]øÜñ,Ïò,Ïb³˜Å,f1‹YyVž•gåYžåYžåYÌb³˜Å,f1+Ïʳò¬<˳<˳¾1‹YÌb³˜Å¬<+Ïʳò,Ïò,Ïb³˜Å,f1‹YyVž•gåYžåYžåYÌb³˜Å,fÿïÝukys77—Èì}ïvçŠÉæmbž=¥wÙsw³)ï»tWÖ†Ó:® \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_5/mask_161_5.dat b/library/phpqrcode/cache/mask_5/mask_161_5.dat
new file mode 100644
index 000000000..70d5fb008
--- /dev/null
+++ b/library/phpqrcode/cache/mask_5/mask_161_5.dat
@@ -0,0 +1,2 @@
+xÚíÜI
+ƒ@н§éºÿå²ÑDp@ èo|m ˜¢ßrHk㨤Ñ~c˜½o³^ÝÃJz­×°‚–#5l»¿î¦S_92Ûî ©“[¯}¾ÜÃÈZÊŸ‡ó=œìTê2ìÿÆ€×P‘™2[cVì衆ÌC–Yf™å'-‡ÛìXÎ9>üv§Ë~u»“½sK5ì`Êe¹,—å2Ë,³Ì2Ë,³Ì2Ëç-ë—ßÐ//¯/o_q¾}KÇç¾ä²\–Ër™e–Yf™e–Yf™å³–õËoè—Ý+òÿ¹/¹,—å²\f™e–Yf™e–YfÙ³úe÷Šx¶B.Ëe¹Ì2Ë,³Ì2Ë,³Ì²g+ôËîñl…\–ËrÙ16Ë,³Ì2Ë,³üì<œv.×r륆Á½Þ¼‚™ýrO5ÌÿŸöÔs_ýZÎÉ”uËI¹_ÃìÞ*Ÿ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_5/mask_165_5.dat b/library/phpqrcode/cache/mask_5/mask_165_5.dat
new file mode 100644
index 000000000..94af813d9
--- /dev/null
+++ b/library/phpqrcode/cache/mask_5/mask_165_5.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_5/mask_169_5.dat b/library/phpqrcode/cache/mask_5/mask_169_5.dat
new file mode 100644
index 000000000..921a77076
--- /dev/null
+++ b/library/phpqrcode/cache/mask_5/mask_169_5.dat
@@ -0,0 +1 @@
+xÚíÛÑj„0Ð÷|Íäÿ®/¶niµ¢K¹£'ŠÈÊ.rö:ÁT-m&¶ZÛx9¯yüq§3rÿµOgàv¼OO_zׯ§u`]ÿüÈ·¾ßitëا™ãt½Ùñil¦oc¿‚ö1ã3j9Ž%_g|ëÔ§Æ)ûì³Ï>ûì³Ï>ûÏ°¿=×teÌ&õþ_ã4¤Þÿ²¿=×t¥UŸÊ}¹/÷å>ûì³Ï>ûì³Ï>ûO´¯Þr½5/u“¹>¹/÷å¾ÜgŸ}öÙgŸ}öÙgÿ®öÕûO®÷½Ûsv®OîË}¹/÷ÙgŸ}öÙgŸ}öÙ·–G½o-w{¬å‘ûr_î{ægŸ}öÙgŸ}öÙg_½¯Þ÷nµ<r_îË}Ïüì³Ï>ûì³Ïþ=ì×n]˜4Nk§Öβ_Êðÿ­÷«M½¿ž¦×ûû´Ï8ím?ñÿ´SF…·<· \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_5/mask_173_5.dat b/library/phpqrcode/cache/mask_5/mask_173_5.dat
new file mode 100644
index 000000000..f9a674136
--- /dev/null
+++ b/library/phpqrcode/cache/mask_5/mask_173_5.dat
@@ -0,0 +1,4 @@
+xÚíÛ[
+ƒ0Ðÿ¬&³ÿÍõG1Ðø¢gäD)[°Cz¼±÷eDÖѷц÷=R¾NÏ6²îóÚFÒíJm ÞÏJq÷Pœ}ëxÞö séîÑ_¾õ}¶éGÚF©y;žíú¿‹
+[;ý]™öé¯eÃk[®ÅQbT«m±yË&0 L`ÂÌ„Y?á¨ÇðرÝÚæ¼wØ›· ïfý„£ÃcÇÊÕVNä9Á½˜À&0 L`˜×„Zý„¤}0=F=F9ANä÷L`˜À&0 L`Bz¬Y²fIñß=F9ANä&0 L`˜À&0 ž‹´fIÑs‘r‚œ 'È L`˜À&0 L`<iÍ’£ç"å9AN˜À&0 L`˜ðVÖ­aB¯XÛ"ý„±²ù×,U­m…>Øö±
+=Æw˜óZ¶gBÎœPª¶” !8 \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_5/mask_177_5.dat b/library/phpqrcode/cache/mask_5/mask_177_5.dat
new file mode 100644
index 000000000..b07c636b6
--- /dev/null
+++ b/library/phpqrcode/cache/mask_5/mask_177_5.dat
@@ -0,0 +1,11 @@
+xÚíÝÑŠÂ0Ð÷~ÍÌÿÿܾحˆšŠ ÎuO,"% ñô:$Xui=¹ÕѶ«×ÕƒŸïô¸g÷Ƹ?Îq­.úÕSo~æz׉¹õWï:ó™·=Žh1cÜqóøèñþ]ì”Ƕ¼îiÇÖ!÷¼ßçírß8Æó˜¬`+XÁ
+V°‚ õŠµÓê»j›Ïjž;—8ÆóX®+ä
+¹ÂoV°‚¬`+XÁ
+V°â?[1µ^ñh-Ö³5Z;§¶©¶ùrmS®+ä
+¹ÂoV°‚¬`+XÁ
+V°â;¬°ËZ,µÍYµM¹B®+ä
+V°‚¬`+XÁ
+V°‚ö™Z‹eŸ©Ú¦}¦r…\!WȬ`+XÁ
+V°‚¬`+ì3µKmÓ>S¹B®+ä
+V°‚¬`+XÁ
+V°¢cþò㊛Ç{g;¦^Qq5¡ZU»ÆÕÝ®ûŸQÛLã0+*&YDqÈñéô*6 \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_5/mask_21_5.dat b/library/phpqrcode/cache/mask_5/mask_21_5.dat
new file mode 100644
index 000000000..04f97ea69
--- /dev/null
+++ b/library/phpqrcode/cache/mask_5/mask_21_5.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_5/mask_25_5.dat b/library/phpqrcode/cache/mask_5/mask_25_5.dat
new file mode 100644
index 000000000..c20b59b1f
--- /dev/null
+++ b/library/phpqrcode/cache/mask_5/mask_25_5.dat
@@ -0,0 +1,2 @@
+xÚ‘a
+@!ƒÿï4îþ— ޳ʢš™ ?,"ÅÔÌ"j½¦¡Ž?n<¶OÕÛäa ¬w, l}rG‹M;ϦÏ9[ží ¤¢_ú±x|ŸÊÖ=´l4lK¨ýv½ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_5/mask_29_5.dat b/library/phpqrcode/cache/mask_5/mask_29_5.dat
new file mode 100644
index 000000000..217ec1b8a
--- /dev/null
+++ b/library/phpqrcode/cache/mask_5/mask_29_5.dat
@@ -0,0 +1,2 @@
+xÚÕ’]
+À ƒß=M¿û_n0W .«Ž=-ÁŸ4¡mÄy×B€ìÓ+² ‰·ÜR×á“çôˆ‹†$¼­Æƒ.=s/,+îB÷7žó³q®zÄ~§q>=GéÙêŽZùyÎ:—ÜDRŸ« \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_5/mask_33_5.dat b/library/phpqrcode/cache/mask_5/mask_33_5.dat
new file mode 100644
index 000000000..726d7fd75
--- /dev/null
+++ b/library/phpqrcode/cache/mask_5/mask_33_5.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_5/mask_37_5.dat b/library/phpqrcode/cache/mask_5/mask_37_5.dat
new file mode 100644
index 000000000..6d32ca6fa
--- /dev/null
+++ b/library/phpqrcode/cache/mask_5/mask_37_5.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_5/mask_41_5.dat b/library/phpqrcode/cache/mask_5/mask_41_5.dat
new file mode 100644
index 000000000..e07c6172a
--- /dev/null
+++ b/library/phpqrcode/cache/mask_5/mask_41_5.dat
@@ -0,0 +1,2 @@
+xÚíTA
+À »÷5Íÿ?7˜«ÈXMtxÒ´x©¤ …¸?@‚˜›7@ò¾~"éN$õ‡SÖÉ°Ä{ø+C³¨ÛA'Êör\PŒpè<Þ÷-¼ ͺ:S3s¹Ô‰ùÛ»ËÞ©Îz#žóqw™ó› >þ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_5/mask_45_5.dat b/library/phpqrcode/cache/mask_5/mask_45_5.dat
new file mode 100644
index 000000000..5168a17f9
--- /dev/null
+++ b/library/phpqrcode/cache/mask_5/mask_45_5.dat
@@ -0,0 +1 @@
+xÚíUA€ »ï5íÿ?ç„U:N&Z"†”:;4P1=ƒbNvSGÆM1¶ÜË›½n<ëv`q³¤{ìîßMg§ã¶4þå=Gó-T¹‹º?›“Ôß='kíÈu™Û­ž“õ>‘ëß'¯®çþÜ(éκŽö Jô{EßѵsÊ]È ,§sqð \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_5/mask_49_5.dat b/library/phpqrcode/cache/mask_5/mask_49_5.dat
new file mode 100644
index 000000000..9f3f3cd7d
--- /dev/null
+++ b/library/phpqrcode/cache/mask_5/mask_49_5.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_5/mask_53_5.dat b/library/phpqrcode/cache/mask_5/mask_53_5.dat
new file mode 100644
index 000000000..449807bae
--- /dev/null
+++ b/library/phpqrcode/cache/mask_5/mask_53_5.dat
@@ -0,0 +1 @@
+xÚíVAÀ »óúÿÏíâ"Ë zYf5ƘJC ª ˜A;ÄÜáé¾Âlû\˜,†ëdòR.¯ \(åe_Ýú ³æôеaNi5†ª\żŽ†ÿÐÐë‡aLPòò(¯ÐàÒ;×ý±2שÃãå¯jÈN6O u…+é¯Ñl{y•«6odúá^ ãÚàçC[‡%® „ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_5/mask_57_5.dat b/library/phpqrcode/cache/mask_5/mask_57_5.dat
new file mode 100644
index 000000000..c7dd81f39
--- /dev/null
+++ b/library/phpqrcode/cache/mask_5/mask_57_5.dat
@@ -0,0 +1,2 @@
+xÚíVA
+À »÷5Éÿ?·‹NÝlªƒZ‹HAbB‰Z0aÓ ìÎMÆÒÃd`1Ýz”'"<Õ1™æ9nvͨ.ãô )bÝ»µ~¤;˜<KÛÒö‡Ú¾x_×Ö÷ÛEu 3ã·][ÿ/[T«oËJÛϵU羉4Ïçévå HûPnÖäë|»òÛ˜Im!wîL1/8,gã \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_5/mask_61_5.dat b/library/phpqrcode/cache/mask_5/mask_61_5.dat
new file mode 100644
index 000000000..dee749fbf
--- /dev/null
+++ b/library/phpqrcode/cache/mask_5/mask_61_5.dat
@@ -0,0 +1 @@
+xÚí—Q€ Cÿwšíþ—óC ÁÕ–ÏB ‰¾´.Ý›•wÙpí¯¯»žKv€g;ÌÞû|3:ÅÆ}÷Ø“c0þÉ´ j­­Öj7(©lÑwe^™WæJæɾ…ÐSïÌwßÐt_e‹¾«Î«·Tæ•ùŠMœÏßOçsæô9ubs=Õ?þ‰ò~~Š­ù>Ÿ9ú¾ÕZ#tõBÁ~ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_5/mask_65_5.dat b/library/phpqrcode/cache/mask_5/mask_65_5.dat
new file mode 100644
index 000000000..ecd938068
--- /dev/null
+++ b/library/phpqrcode/cache/mask_5/mask_65_5.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_5/mask_69_5.dat b/library/phpqrcode/cache/mask_5/mask_69_5.dat
new file mode 100644
index 000000000..ead4edc1f
--- /dev/null
+++ b/library/phpqrcode/cache/mask_5/mask_69_5.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_5/mask_73_5.dat b/library/phpqrcode/cache/mask_5/mask_73_5.dat
new file mode 100644
index 000000000..00001176d
--- /dev/null
+++ b/library/phpqrcode/cache/mask_5/mask_73_5.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_5/mask_77_5.dat b/library/phpqrcode/cache/mask_5/mask_77_5.dat
new file mode 100644
index 000000000..1652cdc2d
--- /dev/null
+++ b/library/phpqrcode/cache/mask_5/mask_77_5.dat
@@ -0,0 +1 @@
+xÚí˜Q€ Cÿwšõþ—ó#&C`T£±ÃÃ6¼”ƹ—B¶ü(«Þ©9Ü Ù'Ö†äÑÖìƒÚ¢ÓÀÀzk·å"hõÜêÝv.` »øâücXöB5[ñ(ÅÖF>71Ó/3ò4ÎØΪz÷^'ÑÔÝ[˜Fyglg•®M>•OÅTLÅ4Ï”{÷&3ëWy*ŸÊ§b*¦ï`ºÚ<3õ;´‘îÞVo0÷/s—6nÿ‘§Ï0Íya½ß[û”ªmácE \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_5/mask_81_5.dat b/library/phpqrcode/cache/mask_5/mask_81_5.dat
new file mode 100644
index 000000000..71215e952
--- /dev/null
+++ b/library/phpqrcode/cache/mask_5/mask_81_5.dat
@@ -0,0 +1,3 @@
+xÚí˜Á
+À Cï~Móÿ?·Ãtz°U4½ŒÔ"£ }tšÕÀMX2|.îÉ‹¸Ë™F\œžð¸õÑÂ~mõ‘4 ÷±¿ØXu
+Ù”, ÍÌw—:— E†Æ„>ŠµXÿõ̯=_Ö]g>±>óÂÆzæמ‡/ë)5ךk±k±kùµüZs­¸X‹µX¿¬Y{Ü®Ñè}ô¶áç~mt¿æîšìÃÏý:S#™µÑ&;U#)ñÚä \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_5/mask_85_5.dat b/library/phpqrcode/cache/mask_5/mask_85_5.dat
new file mode 100644
index 000000000..09cf0e281
--- /dev/null
+++ b/library/phpqrcode/cache/mask_5/mask_85_5.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_5/mask_89_5.dat b/library/phpqrcode/cache/mask_5/mask_89_5.dat
new file mode 100644
index 000000000..5fff53069
--- /dev/null
+++ b/library/phpqrcode/cache/mask_5/mask_89_5.dat
@@ -0,0 +1,2 @@
+x򒪇
+à „ÿû4Éû¿Üþ¸5eÆÙå®npQ¤´ Gú™cÖÍf‡µðl^^‡;;bŽ5;`¬k¶©¶U͹߮¾ßj`ÍNósÜùùO=Ú\[a6‡žÁ°¶~ÞnLÍD?‹ ±!6ÄÆ°ñuüÈF%w¿*Ȭ²ÌkÎù¦f¢Ÿ77”SĆØbƒÃ†êXodw_ùØ—mµ¨â†â†ØbClüÈNÛ™ ck&äîY¯­VoÜ¡™×·B×¢»Ø¨œAl6Æ šæJjÜx \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_5/mask_93_5.dat b/library/phpqrcode/cache/mask_5/mask_93_5.dat
new file mode 100644
index 000000000..ec4240bd3
--- /dev/null
+++ b/library/phpqrcode/cache/mask_5/mask_93_5.dat
@@ -0,0 +1,2 @@
+xÚí™K
+Ã0 D÷>æþ—ë&©»ð¯µ& áÉÆ fP^”ÁŠ8BY5ÊÇs(imœ®¼ÙÒ®¤±®=f—µ÷3¨/wÛ§§‡E»¬y¯§ŸïYŽQ¦wf‘á[}¯å¨ ²„[»9ï0303ÏefÇÏÌ™Ùñ3'3=<òÆK{níæ¼Sg¨3ü›`f`f`æ¿Ìdø™ÞÞè®oiü£¦ÎPgø7Á ÌÀ Ì܇GµjkÞG]í}?V/æë kÒ×Þ÷ÀWi72–Js™vÃ|*"f^ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_5/mask_97_5.dat b/library/phpqrcode/cache/mask_5/mask_97_5.dat
new file mode 100644
index 000000000..509d1174f
--- /dev/null
+++ b/library/phpqrcode/cache/mask_5/mask_97_5.dat
@@ -0,0 +1 @@
+xÚíšA„ E÷œ¦½ÿåf!3bf5í¯Æ¼Bˆ‘ùé£|#f=<3l6<›§Ž_+xjÿ©ÁÛ) “ÙÝ©Ãy°“ïÿ¯ ‰J ¹yXiïÜ»ª5¤IzsÙžîcëuÄeQ¡¡ °K°K°K·d)â—>,ͼwx®DƒÖ·.,;ãÂsÔ%êg,Á,Á,=€¥ëýRÐóὓ¼7u‰ºÄK°K°ôT–D÷†<(n lY’þŸÞhÐùVÛ¹s÷Þ•ôy¸Œ¥´ýP±§Eñ<¸öq \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_6/mask_101_6.dat b/library/phpqrcode/cache/mask_6/mask_101_6.dat
new file mode 100644
index 000000000..13f97a0fd
--- /dev/null
+++ b/library/phpqrcode/cache/mask_6/mask_101_6.dat
@@ -0,0 +1,2 @@
+xÚíšk
+„0 „ÿç4Éý/·Ën_.‰Ê2#ˆS‹H”6±_“PâÞZ ›Ïf˳_¡îé,ï7ØžÛà+·%×åWÇÂîd„–âÏnå}–“_&«Ok;Œ×úP¾Çfµ>³t‚yY×¾]Öns °;s·æs‚Ú,º!Lk¬ÁÔ…cbLŒ‰12cÔX9Ëó1 ÔÀZç#XÐò±En#;ÏsvŒT~L~L±RŒ‰11vsÆ.‹•”³‹1‚ò±¿ò1ù1ù1ÅJ1&ÆÄØÓÙŃó1ù1ù1ÅJ1&ƞī²gËØ KLƪjl¬¬k{g¼Úž5óKò1/ëÇù¯~,aŒ»ù‰õc««ö$“Þ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_6/mask_105_6.dat b/library/phpqrcode/cache/mask_6/mask_105_6.dat
new file mode 100644
index 000000000..a58fec749
--- /dev/null
+++ b/library/phpqrcode/cache/mask_6/mask_105_6.dat
@@ -0,0 +1,3 @@
+xÚíšQ
+ƒ@ Dÿsšäþ—k¡®ÙBÒZ»#o)Sd}ÌGÜ·Šå¹lú쯯Ö^‹žúú³®)G]Sñ4ÝS×ëšÞÞñ¸ó?½#BºZö:Õã+{þñÅ×s§ÁH¨KþNóiIŽÂ!¦«mþòe1
+RWe9!ÿ¡`ö`ï¶ìUy¯Ë€§uë:檞»ëÖåšU=w×-ûo•ÔºwB·}cMÞKßÃ÷è¹°{°{ä=òyßÃ÷è¹°{°{ä=òyßÃ÷è¹°{°wSö¤caoìi'Ýföºé½õyO=C•yO=C•y¯›ß[Ÿ÷Äó{SÞ»œ=—;Ÿ|v4}ϯ2‰¨¸0§ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_6/mask_109_6.dat b/library/phpqrcode/cache/mask_6/mask_109_6.dat
new file mode 100644
index 000000000..be7b4749e
--- /dev/null
+++ b/library/phpqrcode/cache/mask_6/mask_109_6.dat
@@ -0,0 +1 @@
+xÚíšAÂ0 ï~ýÿÏDBHÓC½HãV2‡Æ0Ùn¥uoªò£lø쯯²¯Ë»=Û¢s9[ˆŽõl'«ºÝ?™íë7ÏíR"¯ &“§Û2™ÕßÏ:7QqX_•n» §û]£$ÓÕš–EIYôÁ*¦³ÆL”üq0 “0 “0ù{LJýäз(s\ɳwœô¾‰¦X÷-Ó7^öÑIt„I˜„I˜„Iü$~?‰N¢“0 “0 “0‰ŸÄOâ'ÑIt’g7LÂ$Lþ-“›„¡€Iuzrfr M÷“^ê'}“éÍ÷“•ùÉ(ÉO~RŸé]1Y²ãLÄžuÒå9ó¡QÍÓ• \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_6/mask_113_6.dat b/library/phpqrcode/cache/mask_6/mask_113_6.dat
new file mode 100644
index 000000000..397f52741
--- /dev/null
+++ b/library/phpqrcode/cache/mask_6/mask_113_6.dat
@@ -0,0 +1,3 @@
+xÚí›Ñ Eßû5ôÿN£°¤Õ‰ëõÁÃÈbF6¨on´¶¯,m›>·gSÅ9ìñÞRWã½ðˆcŒÇ•9Œ&»%‰1ùöÏ_÷Þcx= GR^°šw-z?Ãêdzõvî=î,¹ê°}Ô¥?ǹژ³:Å9œmÓ=—ó=@U”¶ä²‰„UX…UXýVe ³ûÕÜÅ~Õby4WúÕéiæ¿:Ýe=ó‰ó¡<SZmAWÑUtVaVaVaõZVñ«5~µüÿÕþ´åVè*ºŠ®Â*¬Â*¬Â*¬^Å*~•wk¹ºŠ®¢«°
+«°
+«°ZϪb¥õ‘ÕayT¬f«ëüj¾ÖºÊ¯jÖZÏ~µÉß´t_@Un¥Ù°ªѾ€YWsV‹ê ¶[|H \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_6/mask_117_6.dat b/library/phpqrcode/cache/mask_6/mask_117_6.dat
new file mode 100644
index 000000000..99108bef7
--- /dev/null
+++ b/library/phpqrcode/cache/mask_6/mask_117_6.dat
@@ -0,0 +1 @@
+xÚí›a Fÿ÷4íý/§‰#EœŒv3¾nŸŒŽ·/m ª›Y´©›T¿õÑwm<õ~?ölûjÁGÛ×îøšC×qSÿ/¯¾6f£tÝŸ¥oï¿Ó”f^ûl'ó7`ÁŸZø²ÌCÊ Â?×úŸ¥heª®²i¤¥šXq4Ó[Ù€´Ô‰…a†a†aþ†û9]P‹ÌÅñ³YžÍìéM<6îçaË[äð¸gÞ:Œ£Ã0 Ã0 Ã0 ×g˜x8:ÎYã¨z;7§C‡Ñat†a†a†aøº ³Æ±,§C‡Ñat†a†a†‹á´íþO çU6Ô «8¢âáÌ=ðgî÷xx\ǵƑXÇQåt§2¬©JœZ‹ä:¬gˆÓ C+\ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_6/mask_121_6.dat b/library/phpqrcode/cache/mask_6/mask_121_6.dat
new file mode 100644
index 000000000..f3c329945
--- /dev/null
+++ b/library/phpqrcode/cache/mask_6/mask_121_6.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_6/mask_125_6.dat b/library/phpqrcode/cache/mask_6/mask_125_6.dat
new file mode 100644
index 000000000..ff64d44fc
--- /dev/null
+++ b/library/phpqrcode/cache/mask_6/mask_125_6.dat
@@ -0,0 +1 @@
+xÚí›A„0E÷œ¦Üÿr3™±¶&H °yØb+öùSlhí0Ͳ6L¦ëöwEŸÍÑ¿žœfÇ®I‡»÷¤vî;»íó&vwž,oýÅ]ué¶dþ]|½k棘øÞ9ÔŠCú“¦}îs“1»9Jw9Ë¡½Zb¢=ðŠèå€PK&æaæaæaæa>€ù’õüɼ—Æú$<>¯OÑôvòÊù'ÅûËåCçÑytæaæaæaæa~›ùòõ|êžÔÙ'9li‹Î£óè<ÌÃ<ÌÃ<ÌÃ<ÌÃüóìI‘æç°è<:ÎÃ<ÌÃ<ÌÃ<ÌÃüóÙ•WæDz¸‚y¿:.z=¿ª ŒÝ“ʯ œsØVšÃ¶E=ll›_k0_#võ°³Î¯˜mÝ÷›j \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_6/mask_129_6.dat b/library/phpqrcode/cache/mask_6/mask_129_6.dat
new file mode 100644
index 000000000..b4695c3ff
--- /dev/null
+++ b/library/phpqrcode/cache/mask_6/mask_129_6.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_6/mask_133_6.dat b/library/phpqrcode/cache/mask_6/mask_133_6.dat
new file mode 100644
index 000000000..40911dc57
--- /dev/null
+++ b/library/phpqrcode/cache/mask_6/mask_133_6.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_6/mask_137_6.dat b/library/phpqrcode/cache/mask_6/mask_137_6.dat
new file mode 100644
index 000000000..43ccb68c6
--- /dev/null
+++ b/library/phpqrcode/cache/mask_6/mask_137_6.dat
@@ -0,0 +1,2 @@
+xÚíœÑƒ Eßû5ðÿ?·e…¥ÕÍÍ^²4fHåp[1-e)UQÊV¬û]žU™W÷Nî5ù§o“*8|›Œ÷Û©ìW¹£š6žbk?Ý÷ÿ{‹f¬´„ì|>¾sÖª‡ìür6öö¸“6‡«ú°6ÉrÒŸ¶=ûüv¸Ú²þWy±Ú ¢¶Š-¸Ê'
+ìÀìÀΟ²ãÅ;q tQE>U–϶öf‘¯•ê³­ìxñN]TcÑ(sâ®7tÝAwðÙ`v`v`v`çkvˆwfŽwtû;]«ùÞ ;躃Ï;°;°;°;çÙ!Þ™;Þaoôå]ºƒî ;øl°;°;°;°Ã· | Ê· èºƒîà³ÁìÀìÀìŒì(3}Œìl.­š?«…"Þ‰r}äÇ;Ú\}¼S¦Ù-AžœüwÚ<9;úEVœ'§×ˆôó¡ð \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_6/mask_141_6.dat b/library/phpqrcode/cache/mask_6/mask_141_6.dat
new file mode 100644
index 000000000..0340409a4
--- /dev/null
+++ b/library/phpqrcode/cache/mask_6/mask_141_6.dat
@@ -0,0 +1,10 @@
+xÚíœa Fÿ÷4íý/§‰c Òêâ¤]òزÈ…¥ª[²¬¤=Éð[E럓ÖÜósî¹m,éšÛfÒn/ß|kj\ä¿òj§?g½ÝþòÈ[qþû(NO˜Zc5ûŠ©SGGP[oM×Vá’Ö¸´éf¼¥÷vÖL<<eÓ
++‘Äša*XG6¬ÄÀ)˜‚)˜‚)˜‚©cLåúS½6±tj¨Mö]o÷ÀßW8¿D~ñO·šD£`•?µ×†N¡Sèk?˜‚)˜‚)˜‚)˜*ÉþÔUü)ïÌ×? þSIÁ=
+t
+B§XûÁLÁLÁLÁT5¦ð§®âOqæîQ Sè:ÅÚ¦`
+¦`
+¦`
+¦ø†Š3_¾¡E§Ð)t
+¦`
+¦`
+¦`êâL¥‡¿yb*?2ÐÈT5i½?U!ÆK÷§*ÄxéþT7iý™o¸IÃEI¦´„R•ˆEÖuJ+MÆ7 ºÄ' \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_6/mask_145_6.dat b/library/phpqrcode/cache/mask_6/mask_145_6.dat
new file mode 100644
index 000000000..6c1421513
--- /dev/null
+++ b/library/phpqrcode/cache/mask_6/mask_145_6.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_6/mask_149_6.dat b/library/phpqrcode/cache/mask_6/mask_149_6.dat
new file mode 100644
index 000000000..69e988350
--- /dev/null
+++ b/library/phpqrcode/cache/mask_6/mask_149_6.dat
@@ -0,0 +1,2 @@
+xÚíœÑ
+ƒ0 Eßó5ÍÿÿÜÆfµƒ47ÍÝ8UD“6Ëñ’ÓÚ2¼z´mØpßž¦ªk8«»¥öŒ}åÅGì«ÉôÓ•ÅëN}?}æÄW“:ƒÈÚguàWA´ËŒ7 ~Û;­)ƒÇâãØ{̪ǿ+ÖWPþºOÛ¢¤öÍþrµEƒ\j˜wG)yË–àw©À‚A„A„A„AM%òÁá™æ2ùà`µµ2«’d”³l–¯àÚ|p}¦eqP’¢ƒè :ˆ    Âàe j想=úlïþT5™©É ƒè :ˆ    Âà© ²Gÿë{ôÔdö×dÐAtDaaaaaï&Ø£§&Ãwè :ˆ    Ö1¨ÒÙð•Á-MRb0éÖW˜f½ ëöèuzŽ5™&Y“iIѺšŒNÑ€A­—»PÑQS«ÎþL}4 \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_6/mask_153_6.dat b/library/phpqrcode/cache/mask_6/mask_153_6.dat
new file mode 100644
index 000000000..3ab6130ed
--- /dev/null
+++ b/library/phpqrcode/cache/mask_6/mask_153_6.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_6/mask_157_6.dat b/library/phpqrcode/cache/mask_6/mask_157_6.dat
new file mode 100644
index 000000000..b45c0ceec
--- /dev/null
+++ b/library/phpqrcode/cache/mask_6/mask_157_6.dat
@@ -0,0 +1 @@
+xÚíÝA‚@DÑ}Ÿfæþ—ÓDÐN%¾Ón Ã§ü,ÚÖ–ÕSVÛVí>·ÇW³Ã³»—CöaïzÈ6îÝÉUü¼~Ò»·{`ný•Š¸õÙÉÝ»dvVýy~µrÒ·Z¯"çq·Ûk{>g$ÅáXK¶õÈU}m\b÷ja¤GÞx˜Å,f1‹YÌbö¿™òÙ]½z¬‘­Ìž½ƒš^¯.ë5Ó[?Ö嬜•³r³˜Å,f1‹YÌòY>Ëgù¬œ•³rVÎb³˜Å,f1‹Y>Ëgù,Ÿ•³rVÎúmŒYÌb³˜Å,fù,Ÿå³|VÎÊY9‹YÌb³˜Å,fù,Ÿå³|VÎÊY9+g1‹YÌb³˜ýŠÙ‹ ½̦M7>2{9zºÏ¶hŸm3Éçûlò|ã9ßxóÙ¼™ä#f#Ÿx•6 ÿ˜³-îvë%…N' \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_6/mask_161_6.dat b/library/phpqrcode/cache/mask_6/mask_161_6.dat
new file mode 100644
index 000000000..ecec68b1a
--- /dev/null
+++ b/library/phpqrcode/cache/mask_6/mask_161_6.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_6/mask_165_6.dat b/library/phpqrcode/cache/mask_6/mask_165_6.dat
new file mode 100644
index 000000000..d641dfa3d
--- /dev/null
+++ b/library/phpqrcode/cache/mask_6/mask_165_6.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_6/mask_169_6.dat b/library/phpqrcode/cache/mask_6/mask_169_6.dat
new file mode 100644
index 000000000..ae689723d
--- /dev/null
+++ b/library/phpqrcode/cache/mask_6/mask_169_6.dat
@@ -0,0 +1 @@
+xÚíÝáJÃ0Ðÿ÷i’÷9[ÛJÓɘók{²1Äb˜!gßnhHkS뉭-­V?·¯KI¯»ïôó×ÏÝ1íý1Ýû§Æ£ÝŽ/½¨·Á˜ŽæÉ`þê/zû)*º=°Ÿ3Úì¿g6õöý^k6ÖÓ5CæÇéêYË<ÉK¨ÍkMùÚã[õy@ÓGµ&_=~¢²Ï>ûì³Ï>ûì³ûãµ¾ +õþõ'{«„Õ§_õVËŠÚx­-âJýËø<ӛܗûr_î³Ï>ûì³Ï>ûì³iûêý;×ûù÷öœr­OîË}¹/÷ÙgŸ}öÙgŸ}öÙ¿¦}õþ½ë}÷ö¼x­OîË}¹/÷ÙgŸ}öÙgŸ}öÙ·—G½o/{{ìå‘ûr_îûÎÏ>ûì³Ï>ûì³o/zß^÷öØË#÷å¾Ü÷Ÿ}öÙgŸ}öÙ¿†ý£d²ì'ŸÊ³µ|ÔQR½ßNSï·Ã3¹’êý³œËÓãÏåYÖú²ÏäÚ³ÿ‰ZÉ'Çms¿EŸÇ·j›5ø \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_6/mask_173_6.dat b/library/phpqrcode/cache/mask_6/mask_173_6.dat
new file mode 100644
index 000000000..95fa97c7b
--- /dev/null
+++ b/library/phpqrcode/cache/mask_6/mask_173_6.dat
@@ -0,0 +1 @@
+xÚíÝaŠÂ0Ðÿ9MrÿËí¢­M SÜ*:a_-²5hh_¿)©uÛZÖ­[éþ®÷¦lïÓoûÛ’sŸmKúšíø›NÇ{òÿãHÌ?x­Ï`l‡#fï9>’ÚŸ[¯õeé·Ð„ÏŽß“­¡ ï?þ^ìóöm÷ó®­ð*û/KËm¿—ãhËy%ÞËv-nKl¥í»Âè–í¤kK¸L`˜À&&Ìê g5†¯µ•(·gºwxôY¢ÜžîÞáa¬žpVcøZ[‰Æ#O=¡ëSNä9Á½˜À&0 L`˜Ç„¥ê ¹ç't­jŒjŒ]QNä9Á½˜À&0 L`˜Ás–ÌYRcü@QNä9 L`˜À&0 L`‚ç"ÍYRcô\¤œ 'È r˜À&0 L`˜ÀÏEš³¤Æè¹H9ANä&0 L`˜À&ü²¯ 7špÜ6¯`Â|õ²¬õ„hm¸œs–ò¯ ××ëR5Ƭ™³Æ˜½È‰ k\ÌX/²Ï ‘ )÷g9È \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_6/mask_177_6.dat b/library/phpqrcode/cache/mask_6/mask_177_6.dat
new file mode 100644
index 000000000..e9f0476f0
--- /dev/null
+++ b/library/phpqrcode/cache/mask_6/mask_177_6.dat
@@ -0,0 +1,14 @@
+xÚíÝÑn„ …á{žÞÿåÚ¤*4vÛ´u¦û¡1‰£²ø{<L­Gi‘Kí¥ ¿ëGUÌíäŠß÷Ç]çmÜ/ó6žÜÛjÿõ?mZ¤müzÌy/úξgÍjÏÿ\ÌÕ“—¢<`Å_¶ã>f{Š¿Ð¿³_ñù,¶,K9o 4ŽÇµôù7lËñÞniJiggiår<¤-MGÆ
+¬À
+¬À
+¬À
+¬xuVÄ÷+zÌÒRøCÌr9‡+Gqç6ÞQWžñb"ø×Qe×ï"ùWLº‚® +è
+ß XXXXX/ÁŠ|~Åj,ÖnŒÖmu¼MÞæÚÛ¤+è
+º‚®ð ‚XXXXXñ¯Ya,–±X¼Í;¼Mº‚® +è
+ß XXXXX晋ež)oÓ<Sº‚® +è
+¬À
+¬À
+¬À
+¬À
+¬À
+¬0ÏÔX,Þ¦y¦t]AWÐXXXXX;V¤Hù‰92mŽ¬Øe3éWdÉQØÇbeÉQؽÍ]>Ó˜Þf’|¦ƒ·™–5²H“û¸ëŠší¥÷7/D \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_6/mask_21_6.dat b/library/phpqrcode/cache/mask_6/mask_21_6.dat
new file mode 100644
index 000000000..6bd505b4a
--- /dev/null
+++ b/library/phpqrcode/cache/mask_6/mask_21_6.dat
@@ -0,0 +1 @@
+xÚQÀ Cÿ9M{ÿËi]èÒýX‰1¤À Å-½ C!»É³Dìû7 W ìÙœ§Ø&rDñ)~Î]<MÎ ·3(>{ƒïA ¡«ÿíŽa²¼Sý \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_6/mask_25_6.dat b/library/phpqrcode/cache/mask_6/mask_25_6.dat
new file mode 100644
index 000000000..d45083aab
--- /dev/null
+++ b/library/phpqrcode/cache/mask_6/mask_25_6.dat
@@ -0,0 +1 @@
+xÚQAÀ »÷5öÿŸÛ2)êe+Ä(XmÊZtÆ*(õÚ¹«;ÃçtJã<峂†_Ú¤‡3°oŠÜ½Ú´"Ì¢a²zh}Ñ&qv€µSGÊÖ™,ó-÷‡™J›Í4}³™¦oS[âü}w \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_6/mask_29_6.dat b/library/phpqrcode/cache/mask_6/mask_29_6.dat
new file mode 100644
index 000000000..0408e2240
--- /dev/null
+++ b/library/phpqrcode/cache/mask_6/mask_29_6.dat
@@ -0,0 +1,3 @@
+xÚÕRA
+À0 ºûšäÿŸÛXcÔõ²ÓL(4E”ÔˆB
+8CÖܾ޳nÃM©+lǪÃÕ†Ožé1]&•Ú¥4UëD-6-$:6ÊdZá?yæÛlôÝf£?í˜ åŽ8?žß²±<Ûlôž}ž¹g›göí * \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_6/mask_33_6.dat b/library/phpqrcode/cache/mask_6/mask_33_6.dat
new file mode 100644
index 000000000..8de4ba5c9
--- /dev/null
+++ b/library/phpqrcode/cache/mask_6/mask_33_6.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_6/mask_37_6.dat b/library/phpqrcode/cache/mask_6/mask_37_6.dat
new file mode 100644
index 000000000..b37ff0ab6
--- /dev/null
+++ b/library/phpqrcode/cache/mask_6/mask_37_6.dat
@@ -0,0 +1 @@
+xÚí”AÀ &ýÿçÚT `½ôèj<PÜ0¡¢jB#ÿ&š´âù,Yo´îê…fU¯Ùjó*UõÕú•ÑYÀ–¬[ƒ•oY5 Œ~Š5 T7bnb, …]Æ˘ûñü‚³¦‘ƒ-‹¹Ñ÷ñÃÌqF:s¢tæDcèØhÙ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_6/mask_41_6.dat b/library/phpqrcode/cache/mask_6/mask_41_6.dat
new file mode 100644
index 000000000..c1535f785
--- /dev/null
+++ b/library/phpqrcode/cache/mask_6/mask_41_6.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_6/mask_45_6.dat b/library/phpqrcode/cache/mask_6/mask_45_6.dat
new file mode 100644
index 000000000..a7da7ee02
--- /dev/null
+++ b/library/phpqrcode/cache/mask_6/mask_45_6.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_6/mask_49_6.dat b/library/phpqrcode/cache/mask_6/mask_49_6.dat
new file mode 100644
index 000000000..64ded7093
--- /dev/null
+++ b/library/phpqrcode/cache/mask_6/mask_49_6.dat
@@ -0,0 +1,2 @@
+xÚíVQÅ ûïiàþ—{K&·ÂêÇûYX¤³ØÙ0ï̦!=ÛýŠ­tÇån&ÅðfpŒWL
+±`¤/¯<Ï“KVrU¢\1öbGpáê@ÄìÓ‘&fNëŒ/+ƽqÙà ¢`ðàòAWÿçêSƒÉßRGpõþ_5|Æ|zÀ×xν:¸¢ªåJ©‚+WE©m4hÛ4Ú3tÜ­ƒ.×Á©A­g`\ÉÒù¬÷ʤþ*ÙÅFÈô \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_6/mask_53_6.dat b/library/phpqrcode/cache/mask_6/mask_53_6.dat
new file mode 100644
index 000000000..9139e3259
--- /dev/null
+++ b/library/phpqrcode/cache/mask_6/mask_53_6.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_6/mask_57_6.dat b/library/phpqrcode/cache/mask_6/mask_57_6.dat
new file mode 100644
index 000000000..61e7e2428
--- /dev/null
+++ b/library/phpqrcode/cache/mask_6/mask_57_6.dat
@@ -0,0 +1,2 @@
+xÚíWÑà |çkàÿ®K¦ÂÜQ¹-Ë^@cª"Wr^U‡YÅÔM³>_Ý`åÃî8¦Ž¹€GÁ1“œ`–B”Ý`;»ù+ØÂì}åÄÌØ&s£ÒçŒ]<§J…QF=mb3 UŒF'ÚØ6¶Æ–á„E âü€¹5õJa÷wZØÖù60¢¬
+ß[¹·ë¶9¡±ý9¶”ì{Á–SšÛ\Ýž8Õ`k&­Áœos}{â[Rß¾ý[¥+—þwðºÕO‹èd^jW \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_6/mask_61_6.dat b/library/phpqrcode/cache/mask_6/mask_61_6.dat
new file mode 100644
index 000000000..f2d3f10df
--- /dev/null
+++ b/library/phpqrcode/cache/mask_6/mask_61_6.dat
@@ -0,0 +1,2 @@
+xÚí—KÀ D÷s¸ÿåÚ¤µE~Ý‚ihÌÄ'™
+ÑŽÍÀòNÏ'oVWßéà£jspèÚCzÓþìÑο©¥ÃaÌÏg!«…#WD%~Ü˃Y?±JÛfŒÚåR€E¸¢ŽÁKoæͼ™Ç˜§ü|Ƀˎ*ÌOÿP7 Šž‡åÛn¾ë¼½¥™7ósã†`ž½ïÌÍÖÀõsúåçdôD¾Ÿÿ¹Ÿsé~>ý<ßiÌK'Žl'¸×9¥ûÐ%.ÆîÄ7 \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_6/mask_65_6.dat b/library/phpqrcode/cache/mask_6/mask_65_6.dat
new file mode 100644
index 000000000..550fc8fe7
--- /dev/null
+++ b/library/phpqrcode/cache/mask_6/mask_65_6.dat
@@ -0,0 +1 @@
+xÚíWQÅ ûïiäþ—{KžNLk?˜e$ŒQ´ikÝìÆÚ4¸çö1{˜á‰ð×`+®!úÚ®ºM Á? áû “’°È1b°8†ž £·¦.ŒÞ^ƒwÌÞò¹ìèsn²ÁFjè5¹…EaQX|‹=wä¼@°2v<òÅ‹Åž»‰–|4w»êê\ÔUXÇBQz+óÊT±ÈTǹÖcøBÓzž/4­ç8Õë,‘»5Ý`¡¥¨»ý¹È± üOV$ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_6/mask_69_6.dat b/library/phpqrcode/cache/mask_6/mask_69_6.dat
new file mode 100644
index 000000000..a3e4fa0f2
--- /dev/null
+++ b/library/phpqrcode/cache/mask_6/mask_69_6.dat
@@ -0,0 +1 @@
+xÚí˜KÄ @÷œî¹™dThÃðí¦ hLSSEžq eY@<ã¯+Þ*£|ß窮 %‹®‹>¥¡¨®‹¹zÃ*7ë–Åe´¤öÆ6ãQ¶½©S`šÞ.²¯>»sE Ë'¨%@[‘Ž6°@PË0Ãh £aôFÕxtpl²2§Âóý ‡Q-g1N†feo^ßøÑüë†Ñ0F¯dT>N_ÕOö’‘wË‹G3ìùªu†åœÁ»gˆå {‘3<Ê[žÔº b?Â'6ï^ºŠ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_6/mask_73_6.dat b/library/phpqrcode/cache/mask_6/mask_73_6.dat
new file mode 100644
index 000000000..ab71b70ae
--- /dev/null
+++ b/library/phpqrcode/cache/mask_6/mask_73_6.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_6/mask_77_6.dat b/library/phpqrcode/cache/mask_6/mask_77_6.dat
new file mode 100644
index 000000000..ad5a660e3
--- /dev/null
+++ b/library/phpqrcode/cache/mask_6/mask_77_6.dat
@@ -0,0 +1 @@
+xÚí˜Ñà EßùøÿŸÛ²i‹ÙÅVäaË.š¦±F©§pST›YÖô4q÷ú~´z…«=Ÿä:öÍ’ û6îøÍüôm8‘¾:#0PضiDy:2Å '§ùZ­s±Š&}Ïôç滜\r‘0\¥Åš•˜Xw¬Â;iP¬äàÈ”Lœ)ÒS¬±£eÔ•Ü{hˆDu9÷L‘žb½•©JÞÒS÷ŒSÆ)™’)™ÞgZš{÷þeÜøŸé)ã”qJ¦dúLw+ƒ#Ó3-V0ÅÕ·lîjƒ¹™ýÚ ×S-ÕS ê½9=ݯ÷¦5ÁPPïõq1Mõ?ågÓ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_6/mask_81_6.dat b/library/phpqrcode/cache/mask_6/mask_81_6.dat
new file mode 100644
index 000000000..28a6d0752
--- /dev/null
+++ b/library/phpqrcode/cache/mask_6/mask_81_6.dat
@@ -0,0 +1,3 @@
+xÚí™Q„0Dÿ9 Üÿr»ÉÚR³LÕvök‡šÆ`´¤¯0 º;æi6ÜûçÑÚ\|ñí_¿êccÔ1«¢h¾ýuŒ§½ioÞó#2ƒ¬}x*.YûtÃ&¸­±
+Ö°¶ÀÖq/K‚;3ÌväeÐ̢Ȋ҂AÛH±ë?`]é5ÒðK¿¡Êü´†w¿!}{Zû߲žW
+Œ”yâ·¾Àž^§_y­¼k±k±–^K¯•×ªáb-ÖbÝYSÚ¸'ÖœNóÈuÃ×õšÕ#M½fõHS¯Q?|]¯IýðA¯ÆÚi™Mû÷‘yíì¤yuWà \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_6/mask_85_6.dat b/library/phpqrcode/cache/mask_6/mask_85_6.dat
new file mode 100644
index 000000000..d5403e49a
--- /dev/null
+++ b/library/phpqrcode/cache/mask_6/mask_85_6.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_6/mask_89_6.dat b/library/phpqrcode/cache/mask_6/mask_89_6.dat
new file mode 100644
index 000000000..eeeb5d197
--- /dev/null
+++ b/library/phpqrcode/cache/mask_6/mask_89_6.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_6/mask_93_6.dat b/library/phpqrcode/cache/mask_6/mask_93_6.dat
new file mode 100644
index 000000000..6ff38db68
--- /dev/null
+++ b/library/phpqrcode/cache/mask_6/mask_93_6.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_6/mask_97_6.dat b/library/phpqrcode/cache/mask_6/mask_97_6.dat
new file mode 100644
index 000000000..3a2072efd
--- /dev/null
+++ b/library/phpqrcode/cache/mask_6/mask_97_6.dat
@@ -0,0 +1,2 @@
+xÚíšaƒ0…ÿs¸ÿå¶dÅêÒÒFx[²=4ÆH–ùŠoŠj3«4í&§s}¹*ŽÃž— ÷a V¸cˆ&3žêÜ5‰arWç^aþ«÷LClÉÒzžqì,ÝÌÑ1†xî µ‰SQ»N»ô»]·¢/GiuÄ`&æ ¢–wƒ%‚,‘%²D–ÈYú"K½t¸¤+åHE'|R2Ï(v1¨öv–¢ÿqiëëŸqd‰,‘%²D–~€¥è%Ø»Jjï}íͺĺÄgY"Kd‰,ý+Kñö
+–]W–të+sF/)ü]¥.zNòÚÝ'`°>®½1='#–`+bƒ¥l]Z±”¶­¬ýð \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_7/mask_101_7.dat b/library/phpqrcode/cache/mask_7/mask_101_7.dat
new file mode 100644
index 000000000..1f6bc5129
--- /dev/null
+++ b/library/phpqrcode/cache/mask_7/mask_101_7.dat
@@ -0,0 +1 @@
+xÚíšQà Cÿ}rÿËm“Ê`éÚÊfªjòTé#±¥ÔäÞ54'tûí…îf¼aÈЇo°–$±c<ÙËêãÝÓÕñHÝ Ìh8„lÕÛûþÁëo=½Ä„ŽÅ§àHvº©;‹z€¤!ƒ|/‹FŽÐ3cfÌŒ‰S×Ê…±±ゼêñ 8©KŽ)4©9 ”Qç1ç1×J3fÆÌØÅ›S+ÅwÖcçõ˜ó˜ó˜k¥3cf캌ùîâ¾zÌyÌy̵Ҍ™±1¦{¨²bL÷¶çÍX™S+óï.to{>ô˜îmO§ÇJ2²û3cÄ<6ãXn0F´ ) \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_7/mask_105_7.dat b/library/phpqrcode/cache/mask_7/mask_105_7.dat
new file mode 100644
index 000000000..6b0cacfe9
--- /dev/null
+++ b/library/phpqrcode/cache/mask_7/mask_105_7.dat
@@ -0,0 +1,2 @@
+xÚíšA
+Ä0E÷žFï¹a MÒ™˜N¾Px)¸pQ£¼è_è~ž|ñ(b¿F’„šç$.Ÿa¿o“ÝòWÿGNÚPæUÇ–·‰Mþ%{‡ëoôHQôÙUñl¯Ö´¿¬L^>+Éçm­“#{°{eo&Y2sÛoM•)gncO9s›ßZŠ³´3wÇo™„Ú+Âè{ô=f.ìÁìÁz½‡Þ£ïÑ÷˜¹°{°{è=ôz¾GßcæÂìÁÞsÙkCQÏžpÓíÊ^¶€&Ñ{^£÷¼Nï­Ê·UïÕìï ìe5°ç}¯æE‰wGûßn+o \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_7/mask_109_7.dat b/library/phpqrcode/cache/mask_7/mask_109_7.dat
new file mode 100644
index 000000000..9875cbe8c
--- /dev/null
+++ b/library/phpqrcode/cache/mask_7/mask_109_7.dat
@@ -0,0 +1,2 @@
+xÚíšA
+…0 D÷9MrÿË}µÚ*˜ _x-d˜ú:Î"îÇŠ¢Ý-kÅ"Šâ¨š¢œ•dŒ{›¿Õ»ü¤·ñã¯ó³ÞÊגɬ|<b2+ßU á¶ý­ÊîÚ%Z}‰.Úq%Gi²¾¶h QA9˜„I˜„I˜üG&‹Éž·<ßø oÍ:Ï,ubÞ2}ãmÞ„_ D'ÑI˜„I˜„I˜ÄOâ'ñ“è$: “0 “0 “øIü$~D'ùwÃ$LÂ䇙TÌOvLVOO^˜<ÓøÉòùÉÞOúbµÄOºÎOºÖOºÊ›™Þt\3™¬“®<ÊG¼Í« \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_7/mask_113_7.dat b/library/phpqrcode/cache/mask_7/mask_113_7.dat
new file mode 100644
index 000000000..b6e215982
--- /dev/null
+++ b/library/phpqrcode/cache/mask_7/mask_113_7.dat
@@ -0,0 +1,11 @@
+xÚíšQƒ Dÿ÷4pÿ˵M´PeQ‘6éÃd?Ô¸°>'ƒÒÚràQ5+ sûŒ¡)Ûc•Õê7úÕ-ÑÕó»1nní–ºqÿÉ”–ÔÍJtgô¬^îʉwÿ̘Ň-ùƒ?ÿ*š&Mmý@ee5éø^Ñ
+c¢”°
+«°
+«ÀªÒ,¬¶ýªïbï\1¿×3ýjõ4óØT¿ZžfÅ¢·»o鯠«è*º
+«°
+«°
+«°:›Uüêt¿*ü¿ú½¹ºŠ®¢«°
+«°
+«°
+«“Xů²0<·BWÑUtVaVaVƒYÕl
+Þ°ªÙkýf5éýª_Ö ¿ªÙkýáW5{­«µ€ä–5pnõC¬éªZ:¬Å bv \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_7/mask_117_7.dat b/library/phpqrcode/cache/mask_7/mask_117_7.dat
new file mode 100644
index 000000000..cde78c10d
--- /dev/null
+++ b/library/phpqrcode/cache/mask_7/mask_117_7.dat
@@ -0,0 +1,2 @@
+xÚí›Yà Dÿç4pÿËU•²ÈêIª>"ù%6æed ‘Ò8rðS ÍNsŽµU¯ánëk5¦Xe­øjѻު®u—Ûî¦ô¿ö±VÛXgøê,l`øøîuÝÊÀî÷£!‚h‰XZù\VãlM±ìë|[ͬÝÂ0 Ã0 Ã0 ÿÃí–#hF'ëøc]²±ž¾¦iéí>ìúŽûHÐat†a†a†a~<ÃÔÆzØyÆqkO‡£Ãè0 Ã0 Ã0 ÃðææŒãªžF‡Ña†a†aþ)†§2ÇË°éfÃ’áþ%ƒÀz8ùëátO=¼žâ€3ÿ=Ž‚áÖî3œÜ:ìÿcw‘
+ûV$¢ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_7/mask_121_7.dat b/library/phpqrcode/cache/mask_7/mask_121_7.dat
new file mode 100644
index 000000000..d5d577f7e
--- /dev/null
+++ b/library/phpqrcode/cache/mask_7/mask_121_7.dat
@@ -0,0 +1,2 @@
+xÚí›[
+Ä Eÿ³šdÿ›ú°ŒÆi;^az,ø#6Æž^rÝׂ§h¶ŽôµÈêÐ&Ýì¨çÜ^amýËÀ•YŸ9×_Òغô5C·r–6ë®ðt^ù^ÅWlûÅÐEä˜ôز~É¿|èM®èmýÁåÛmSò}÷¶Ó( Û° Û° Û°}ŽmQ½]ŒZ§Vüq½]¼ÓvËѲ"™M¹1fÙúGÔÛÛ, q½½ÍB·Ñmt¶a¶a¶a¶ÂöÄz»eF²3»cxI¹—D·Ñmt¶a¶a¶a¶ÿŸmÎnð’ý$ºn£Û° Û° Û° Ûa[}ï¦`[yëæÀö–°¾Þ–Þ»)Ïn<¹æ4ÜKú/éó¼¤O¢»s§l¨nçlÔmŸµÝ/GëÙ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_7/mask_125_7.dat b/library/phpqrcode/cache/mask_7/mask_125_7.dat
new file mode 100644
index 000000000..f9ec0887b
--- /dev/null
+++ b/library/phpqrcode/cache/mask_7/mask_125_7.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_7/mask_129_7.dat b/library/phpqrcode/cache/mask_7/mask_129_7.dat
new file mode 100644
index 000000000..9bf51d529
--- /dev/null
+++ b/library/phpqrcode/cache/mask_7/mask_129_7.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_7/mask_133_7.dat b/library/phpqrcode/cache/mask_7/mask_133_7.dat
new file mode 100644
index 000000000..b643ffeda
--- /dev/null
+++ b/library/phpqrcode/cache/mask_7/mask_133_7.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_7/mask_137_7.dat b/library/phpqrcode/cache/mask_7/mask_137_7.dat
new file mode 100644
index 000000000..11d212bf4
--- /dev/null
+++ b/library/phpqrcode/cache/mask_7/mask_137_7.dat
@@ -0,0 +1,5 @@
+xÚíœÝ
+à Fïó4úþ/· úc§‹«_Ç‚+¸{üSÚK<E±Óœ%um‰Ä”¶OÄÃcåPÕNsûÑuõÝß+Ÿ šÒʺQS,E)Öµ÷^ÿf¼Õaç—_ÃHkoKrÇ6»DÓZQ›öï‹Úö F><ŸÚÎo[l
+ìÀìÀΟ²Ó
+©ý0û¡7Ö‰µVÆl;b¶–ëüè™7æõfM¾S´†î ;è1ìÀìÀìÀìL³C¾<ßQí[+@wÐt‡˜ v`v`v`v&Ù!ß ›ï°7ÚX+@wÐt‡˜ v`v`v`v8 ÊYP΂¢;èºCÌ;°;°;°saG{™Ä;Ú»>vRœ|ÇžåùŽö®K¾£½ë£ØMÎðHÖ
+‚³#Ð(S›ËÎòúqÌçd \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_7/mask_141_7.dat b/library/phpqrcode/cache/mask_7/mask_141_7.dat
new file mode 100644
index 000000000..98dffab00
--- /dev/null
+++ b/library/phpqrcode/cache/mask_7/mask_141_7.dat
@@ -0,0 +1 @@
+xÚíœA„ E÷= Üÿr“IëŒTY@¿ÉÄÅ0!µøø|1”²—št¹bG0µæԗѤ…s¡2Z/îç¿oa‚ìøÜ\ÿq¬ãzÜÛOnÒ‹MºÏñÞn™šñt„áX"Kÿ—m‘eM}çÚòCpµíÄP™L^¾µŒ„S0S0S0S£L ø)Ç”‚ŸÚ˜êYß¾%žÔbÑý,õS©l?ÕzC§Ð)tŠµLÁLÁLÁLI2…ŸzŸŠRX¶h¾£@§Ð)tŠµLÁLÁLÁLI1…Ÿz‘ŸbÏ·óŽB§Ð)Ö~0S0S0S0Å7´ø)ö|ù†B§Ð)˜‚)˜‚)˜‚©÷3Õ–«L%Ÿ tfª¬wM±Ÿ*:~ªhù©»¡Zºç«sn’cª÷$1UTtJgÆ8‹ÌÕOYºE \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_7/mask_145_7.dat b/library/phpqrcode/cache/mask_7/mask_145_7.dat
new file mode 100644
index 000000000..4aa2bac11
--- /dev/null
+++ b/library/phpqrcode/cache/mask_7/mask_145_7.dat
@@ -0,0 +1,2 @@
+xÚíœÑ
+à Eßó5úÿ?W6Zµ ¦-›^é±àƒ2‰q§×ÄbG‰Ÿ¢X6(ƉuÍ"“LbÑbÝGuû÷ŽÎ¼®··Gkø¨:HwA[¿jšÔm¯øH¢ø¬Ýžï3ïŬýîßâOðkQ{l·|ê»èT›†EmÇ JfÙLÊ?ŸÚ2"&Á¬Á¬Á¬Á¬ÁÚ¬)Äk©ÝRf¢—µÙcï“Ñ̉ÓåFŠÑ,§“z©¦=躆®±‡„5Xƒ5Xƒ5Xƒµ7±F¼¶\¼¦p–ÚUs#躆®±‡„5Xƒ5Xƒ5Xƒµ°F¼¶d¼ÆYö•Üº†®¡kì!a Ö` Ö` Ö`o‰×8ËæÛct ]C×ØC¬Á¬Á¬ gMå­‚5…[´N¬%éÄk÷h•ñZp®?›¯IÜ£•Ï²ƒ^n$ˆÑæÞY7A×ÖÆëZP[¶ fÈ“0 \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_7/mask_149_7.dat b/library/phpqrcode/cache/mask_7/mask_149_7.dat
new file mode 100644
index 000000000..809f00554
--- /dev/null
+++ b/library/phpqrcode/cache/mask_7/mask_149_7.dat
@@ -0,0 +1 @@
+xÚíÜÑnà …á{? ¼ÿËu“Ú†­…´2»ÕG$nˆˆcççÈF¡µKëÉ×Ðb3ª÷ôþÖªt³îûªPc çÌ¥Ó7[¢?9:ñÕý['éÁë9'¾*Ó– àGæÜa°½hÖ_¿¹/«zÁ+Î6XB‡>ê˜2ôqYÀJ…0Êù黚BfaƒÄ 1ˆÁª ȇ9c7Gë ùOl©ô,Å^¥ßÅ꽓òÁ3ƒÕòA:Hé Ä 1ˆA bƒÄàÿ0X4œ%Ù«½û#ÇÔd>¢&Cé ¤ƒÄ 1ˆA bƒ<šA{ôo¿G¯&óLM†ÒA:H1ˆA bƒÄ 1è¿ {ôj2þ› ƒtbƒÄ 1ˆA &1Xç`¼_ Ö9ÛðÊ`«™®B˜¶G_çlÃ5™:g5™¶ajMæÍLÔÁŠËèƒIý <|r. \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_7/mask_153_7.dat b/library/phpqrcode/cache/mask_7/mask_153_7.dat
new file mode 100644
index 000000000..c1ab27664
--- /dev/null
+++ b/library/phpqrcode/cache/mask_7/mask_153_7.dat
@@ -0,0 +1,2 @@
+xÚíÜQ‚0„á÷= ½ÿ匉B5ˆ
+ю惤/ͲåïØIÙiº^-àî®Zkm|»YDhë9 ›ÎêÃ\{’KÇƶ·{Ÿy—³Ç3ßv†¶Ì»œE]u`RÚÇrý"›ß}ÛY ½ëeÂ2{ÛVV8][×.n:+2_ç¶ÊÂBÃ&6±‰Mlb›ØÄ&6ß`3i¿9Y³³åΌ諡yÙúU}ÔŸ82f-vÚ–Õ6 nÒMºI7±‰Mlb›ØÄ&6±ùólæî7ãÎð‚þÕ ¢›t“nÒMlb›ØÄ&6±‰Mlþ2›ÎüÍÙ^Ð/ˆnÒMºI7±‰Mlb›ØÄ&6±é;gxA¾C¡›t“núO‹Mlb›ØÄ&6±y€Íy•ÇfP¥Õ[6Ÿ4ºßÌ«Ùk`v^Ð+Ó9Ä Ê¬OÛ±ùð}Ï攨›™+ZXíè®=:iWE \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_7/mask_157_7.dat b/library/phpqrcode/cache/mask_7/mask_157_7.dat
new file mode 100644
index 000000000..2db27f685
--- /dev/null
+++ b/library/phpqrcode/cache/mask_7/mask_157_7.dat
@@ -0,0 +1,2 @@
+xÚíÜM
+ƒ0Eáù[M²ÿÍ•‚­ü£s¡_„ ž‰ÇÛã ­}F¹†Qks½‡Ì{Ý%¶WqÛ÷×îø.ž­¬Ýþϯ­]Ü8evV½ßbvV}è®_µÜEÌ»n3W^KÃ\Ÿ`äÖV캽çZl³˜Å,f1‹YÌþ;³af±Ôkž·Þ¨×úiàè“ÁÄzÍôÖËz?urVÎÊY9‹YÌb³˜Å,fù,Ÿå³|VÎÊY9+g1‹YÌb³˜Å,Ÿå³|–ÏÊY9+gý7Æ,f1‹YÌb³|–ÏòY>+g嬜Å,f1‹YÌb³|–ÏòY>+g嬜•³˜Å,f1‹YÌþÈlâùƳi§o˜ý.\¦ÏÆo<úl;9º:Âg[®Ï¶lŸmÁÔ^œI>=gÏ™œ³-yk_TAµ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_7/mask_161_7.dat b/library/phpqrcode/cache/mask_7/mask_161_7.dat
new file mode 100644
index 000000000..35ba8ff48
--- /dev/null
+++ b/library/phpqrcode/cache/mask_7/mask_161_7.dat
@@ -0,0 +1 @@
+xÚíÜÑŽÂ …áûyšòþ/皨E)Æ®›î1~4áÂœý93,˵´ «+µØZT=Zeâ¶C»¹ú.<sþô¹ŸvÙÞÏ>~ißµ§¯ÊÞÖ&>Œ,–ÿÔï´6eù˜·í•Ö~,láW]ì ®»º2Íê꺱Ý\Ñþ;×µ2j"–±Œe,ËrXŒÝµVÓ(ícìµµZÓ–1‘™§8Þ©í§‰±/,'ÇØt™.ÓeºŒe,cËXÆ2–±Œåß±,_þŠ|ytõüç£ï|ÎÜ]¦Ët™.cËXÆ2–±Œe,cyËòå/É—­ysî‹.ÓeºL—±Œe,cËXÆ2–±lo…|ÙZ{+è2]¦Ëbl,cËXÆ2–±Œe{+äËÖŠØ[A—é2]¦ËXÆ2–±Œe,c9åÌCÐXÎ<ëþÆò’Ÿ/owsP¾œyÖý]¾œyÖ}·VdÙìæ°¹¯d9J—Ó‡ì)Ë1õ jI2ë \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_7/mask_165_7.dat b/library/phpqrcode/cache/mask_7/mask_165_7.dat
new file mode 100644
index 000000000..e27fb8edf
--- /dev/null
+++ b/library/phpqrcode/cache/mask_7/mask_165_7.dat
@@ -0,0 +1 @@
+xÚíÝQŽ‚0Ðÿ·š²ÿÍM&A,NĘ̈!—x0é‡&XZׇZ»-KØ«[êÞÉeÉj‡½Œëæx,ƒ§¼ú.ï·g}ë`;ÿþþ+k{ËÑ~1ŸŽÿ}á+k{ËØ¥ž™¾SGùWãgî}‡Ý¬@Û?_µö8í¾o+·k][·hô”Wü8~·u·ÜMÆgœqÆg|j<õ·ú¶¶Ú*ßq=<¯”Ïü¤æÛ“RwÆ“ëñÕøøÌüÄÌéŸÈq9.Çå8ãŒ3Î8ãŒ3Î8ãIÆÕãUGÿ?~µsnr\ŽËq9Î8ãŒ3Î8ãŒ3Îx€qõøÇÕã®yç979.Çå¸gœqÆgœqÆgÜ=)êq×À¸'EŽËq9.ÇgœqÆgœqÆwOŠzÜ50îI‘ãr\Žû­Î8ãŒ3Î8ãŒ_ÆøVvd}²ÇÞøü¡aõx˯ÇÛ5êñã)¹&ÿ9)ñÙÞf¼¥çxþ3øYH]ûS^*/ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_7/mask_169_7.dat b/library/phpqrcode/cache/mask_7/mask_169_7.dat
new file mode 100644
index 000000000..ef1a181f2
--- /dev/null
+++ b/library/phpqrcode/cache/mask_7/mask_169_7.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_7/mask_173_7.dat b/library/phpqrcode/cache/mask_7/mask_173_7.dat
new file mode 100644
index 000000000..3b5137125
--- /dev/null
+++ b/library/phpqrcode/cache/mask_7/mask_173_7.dat
@@ -0,0 +1 @@
+xÚíÝÝjÃ0 Ð{=Mòþ/· RbÖH¬û«´rj\Ç=ý,ºm·coúZŽ8;»ïmÏ÷½mÛÝë±0b÷ƒ_ßšt$~Wu5ÛÇšNnÜ'?dÕf2¶í(oÁïßGÚ,Løþù÷õ6_{»zÅÑ÷Æ? Ë9úwq9Ç àS!ÆŒëÛ9Îoë€î2 L`˜˜pµŒ¬––O»Enï¶v8L˜²v8L¸º UáY×"ûd}ê K›r‚œ 'È ÖL`˜À&0 L`B'fÕ:ïO8ÛTcTc\kŒr‚œ 'È ÖL`˜À&0 L`BìY²gIñ§kŒr‚œ 'È ÖL`˜À&0 L`‚ç"íYRcô\¤œ 'È r˜À&0 L`˜ÀÏEÚ³¤Æè¹H9ANä&0 L`˜À&ü'úÿ!Ø;êÅq+¶Yõ„l*´Ü³´þ=Ø€ã9¶jŒ[2ÚÖÿ€ Ms¤Ÿ‡Ô„–ç­ë*Ø \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_7/mask_177_7.dat b/library/phpqrcode/cache/mask_7/mask_177_7.dat
new file mode 100644
index 000000000..068477c92
--- /dev/null
+++ b/library/phpqrcode/cache/mask_7/mask_177_7.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_7/mask_21_7.dat b/library/phpqrcode/cache/mask_7/mask_21_7.dat
new file mode 100644
index 000000000..4f9f1386d
--- /dev/null
+++ b/library/phpqrcode/cache/mask_7/mask_21_7.dat
@@ -0,0 +1,4 @@
+xÚQ
+À0 Bÿ=Þÿr]š˜-?]Rl‡ä݃2•¦¹nc
+ð[Ž¹öÝnùAÃ".–j+êi
+~‹x3<úaXÚ{H†ÖC1xÉÀ)â„á¤üSå \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_7/mask_25_7.dat b/library/phpqrcode/cache/mask_7/mask_25_7.dat
new file mode 100644
index 000000000..cefe1b972
--- /dev/null
+++ b/library/phpqrcode/cache/mask_7/mask_25_7.dat
@@ -0,0 +1 @@
+xÚQAÀ »÷5ôÿŸ[F@©àaƒ„ÄÔÖZ̲… >;’ÐÀQ±ÊIÖÀQH8Rÿ¼ñÒˆGÉ"èz,ù½&‡ñþ;±­Ð'oñ»97”%P8%÷6oǽ;]ÞúNWnÝ[äf7¹ÌÕvÔ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_7/mask_29_7.dat b/library/phpqrcode/cache/mask_7/mask_29_7.dat
new file mode 100644
index 000000000..e3d7391b7
--- /dev/null
+++ b/library/phpqrcode/cache/mask_7/mask_29_7.dat
@@ -0,0 +1,2 @@
+xÚÕR9À ÛýšøÿŸ«ŠÈQpX˜$læŲf!I2pgSãªêªMZj·ºóÌÃÂ<K.êØ·
+ÂÇ—­Ñê^DŽ/è_yž/ßgcxVÙ0ŸBf#ŽÖÿ]BÇϽʳhí9Þ¹ËóÀ›^Ÿä \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_7/mask_33_7.dat b/library/phpqrcode/cache/mask_7/mask_33_7.dat
new file mode 100644
index 000000000..1763f4286
--- /dev/null
+++ b/library/phpqrcode/cache/mask_7/mask_33_7.dat
@@ -0,0 +1 @@
+xÚíSAÀ@¼Ïkøÿçš6¨¨á²Ç’8Èì0 7-n† ZbE0¶"™£°t]…£µ3Ztqúó>"útŠðï¡e0¾¿#Ô›`_Ë1-±ÞóŽé´câÝÍ÷òha÷~/¡Eh™4¦Åæ"ä˜~Ï \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_7/mask_37_7.dat b/library/phpqrcode/cache/mask_7/mask_37_7.dat
new file mode 100644
index 000000000..87d9a1a9d
--- /dev/null
+++ b/library/phpqrcode/cache/mask_7/mask_37_7.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_7/mask_41_7.dat b/library/phpqrcode/cache/mask_7/mask_41_7.dat
new file mode 100644
index 000000000..8acec04f0
--- /dev/null
+++ b/library/phpqrcode/cache/mask_7/mask_41_7.dat
@@ -0,0 +1 @@
+xÚíTAÀ »÷5ôÿŸ[fDYæ(O’^¬ÅbR3/~t/L"¹Ä7SQQ5…jÔ\S—šiíñÎb£ß#Õ†ÈÂ×+Ç£¤w#æzõx?Þ㽧A-ëšw•u曑Y7$b.%AËÇ;•w«Rµ÷ñï•œoxG}?ƒ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_7/mask_45_7.dat b/library/phpqrcode/cache/mask_7/mask_45_7.dat
new file mode 100644
index 000000000..dbba31d0b
--- /dev/null
+++ b/library/phpqrcode/cache/mask_7/mask_45_7.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_7/mask_49_7.dat b/library/phpqrcode/cache/mask_7/mask_49_7.dat
new file mode 100644
index 000000000..be5dce8b7
--- /dev/null
+++ b/library/phpqrcode/cache/mask_7/mask_49_7.dat
@@ -0,0 +1 @@
+xÚíVË€0»÷kàÿÎhœC-X.žÆ<ì¨h6Ì‹ 3À½ð,B Ô”ó,ç@’Ï€d5$K¸"T|p•%9"¼ypæ,ïâæ¡=<ÆÉm¡•÷˜Ô‰!‹«?¸¦÷DÀW"˜²(®¸Aó-Ö\- J\©{0p¥lÁWW]ƒÒŒ4ºž?4h= Z_ƒÖd+ýg(æ*ã*+붵(ÏÇæ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_7/mask_53_7.dat b/library/phpqrcode/cache/mask_7/mask_53_7.dat
new file mode 100644
index 000000000..7028ef6d7
--- /dev/null
+++ b/library/phpqrcode/cache/mask_7/mask_53_7.dat
@@ -0,0 +1 @@
+xÚí–KÀ D÷s¼ÿåš&´Råkºiª&,H)øtD×jÁ =¨µÐÎQa˜ž«P"d¹s1ZyC®|hey ­üCvéaH°›7ø‰+ùO…Åu¥QÎsZtb…°Íð7 µvãúÀŠ­h™VµÌ µ~èùà·1#ÿ~‡[Ëf˜†ùÙæfHkZ¶JtµœŸmZÎÏ6½—ÉsÕúá‹ ƒw¸rÍ&C×߶f \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_7/mask_57_7.dat b/library/phpqrcode/cache/mask_7/mask_57_7.dat
new file mode 100644
index 000000000..ee3107a3c
--- /dev/null
+++ b/library/phpqrcode/cache/mask_7/mask_57_7.dat
@@ -0,0 +1 @@
+xÚí—A€0ïûšöÿŸ3&•ÒH)Kb¼Ð&ˆqÅÖžÕ[-ÌÀÞÏÖŒ …Ú9Ér¡Ys ×.«ÎiÝÓ¾`´ìòØú~—­ëGé{cœiƒÕ‚»\Y<˜.©|·Åì2´ØÛŸÙ2š ŠQQ[[÷^N·ë€88½líÏÃÁ[}[šPl?g+o*Ï–˜4W¶û1  ü Õ33˜Ò[¿\Gosó­bkèm”mËômÿÊ^¬¢hë \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_7/mask_61_7.dat b/library/phpqrcode/cache/mask_7/mask_61_7.dat
new file mode 100644
index 000000000..76f8d7271
--- /dev/null
+++ b/library/phpqrcode/cache/mask_7/mask_61_7.dat
@@ -0,0 +1,2 @@
+xÚí—K
+À D÷sšäþ—+-µ*5ÿm²¤cŸaT¢1Ø9—YÌ쌧êL9 糶¬²çísù//i‡‡Ê\„éb®ö©æÂÄ«âÞë-"^²DŒH-iÝ;bnA¢¼™7ófîet¶7Ù·yÌ£E:r”<4ß6ó(üu÷y{K3oæ"óÌý|a½oÌ?ᜟ‡ïç«Ÿ“ò´pù9åýœj~NêÆ›Èìs¹ÑçTYú¡ Âu \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_7/mask_65_7.dat b/library/phpqrcode/cache/mask_7/mask_65_7.dat
new file mode 100644
index 000000000..d8b920626
--- /dev/null
+++ b/library/phpqrcode/cache/mask_7/mask_65_7.dat
@@ -0,0 +1 @@
+xÚí—A€ ïûøÿçŒI‘*í6^L!é…°¶ ¸i)mTÇT] VW\ï9e@—4Ku^Â#N%:ö,ÖÙmYÈÂJNã„è9¯“Šà¶©ˆvAè2úþÑÏœ”HÉ"YüšÅÜö +?`ýBXDüBX̽{¿‹Á.³Ëw‘ÿ¨d‘,~΂k’,¸^ïbQâ~±.Ãà\¯wó ®×ë^«Ï÷îOY˜ÞEôJmXâÑÏ"% \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_7/mask_69_7.dat b/library/phpqrcode/cache/mask_7/mask_69_7.dat
new file mode 100644
index 000000000..c2db0204a
--- /dev/null
+++ b/library/phpqrcode/cache/mask_7/mask_69_7.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_7/mask_73_7.dat b/library/phpqrcode/cache/mask_7/mask_73_7.dat
new file mode 100644
index 000000000..f414e4a58
--- /dev/null
+++ b/library/phpqrcode/cache/mask_7/mask_73_7.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_7/mask_77_7.dat b/library/phpqrcode/cache/mask_7/mask_77_7.dat
new file mode 100644
index 000000000..3e52bfd3f
--- /dev/null
+++ b/library/phpqrcode/cache/mask_7/mask_77_7.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_7/mask_81_7.dat b/library/phpqrcode/cache/mask_7/mask_81_7.dat
new file mode 100644
index 000000000..78e08dfc6
--- /dev/null
+++ b/library/phpqrcode/cache/mask_7/mask_81_7.dat
@@ -0,0 +1 @@
+xÚí™ÁÄ Dïó5ðÿ?×lÒ"ÍŠÝ•¹u4áÀa„>ukv oÌ40Ý÷ãT±%9¯‘Ô6²ü÷ªU5‹*sI{`¹ªÿ™_²>S?ç}(:yâTïlï{G&E\”Ö6¨õ}"A’¤X‹õ XϬ«²³Ç<Âmwx°fÜá‘G”<k£ræU•eεεX‹µX‹µüZ~­s­;\¬ÅZ¬3ë¸|y¬ /ÍwÖÕÃp˯ë×Æ÷ëUÛ[~Í}O¬«oÓ`mÌsÍÝ‘¤)~,Ý \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_7/mask_85_7.dat b/library/phpqrcode/cache/mask_7/mask_85_7.dat
new file mode 100644
index 000000000..a53824aee
--- /dev/null
+++ b/library/phpqrcode/cache/mask_7/mask_85_7.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_7/mask_89_7.dat b/library/phpqrcode/cache/mask_7/mask_89_7.dat
new file mode 100644
index 000000000..32934a441
--- /dev/null
+++ b/library/phpqrcode/cache/mask_7/mask_89_7.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_7/mask_93_7.dat b/library/phpqrcode/cache/mask_7/mask_93_7.dat
new file mode 100644
index 000000000..1955f6b7d
--- /dev/null
+++ b/library/phpqrcode/cache/mask_7/mask_93_7.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_7/mask_97_7.dat b/library/phpqrcode/cache/mask_7/mask_97_7.dat
new file mode 100644
index 000000000..b277368bd
--- /dev/null
+++ b/library/phpqrcode/cache/mask_7/mask_97_7.dat
@@ -0,0 +1,2 @@
+xÚíšáƒ0„ÿßÓÀû¿Ü²D[ÌÚâV.K¶«Iÿ`…â'ž³sxáº÷Âyäå”$ùxãxÃ"Îéª×= O^&pêb¶ÊÈYʬž$êKŸÝ£àÁÉŽ8KŸ…Ë ÎeÃŒó¡¥ ÔøŸ3:$bI,‰%±$–ÄÒYb襶
+M)¯TôŽ %q®¬Èô綦EÿœX}jlØT—T—ôŽKbI,‰%±ô,ñõã_e[%íýŽöV]R]Ò;N,‰%±$–þ’%VŸ@`‰Ñ%pa©m€§—(}ñ_¥%í%ÚÛ¸ÚÛøÚÛÈ4¥='u)ai¿.;M¾ù> \ No newline at end of file
diff --git a/library/phpqrcode/index.php b/library/phpqrcode/index.php
new file mode 100644
index 000000000..9e14b7eaa
--- /dev/null
+++ b/library/phpqrcode/index.php
@@ -0,0 +1,94 @@
+<?php
+/*
+ * PHP QR Code encoder
+ *
+ * Exemplatory usage
+ *
+ * PHP QR Code is distributed under LGPL 3
+ * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+ echo "<h1>PHP QR Code</h1><hr/>";
+
+ //set it to writable location, a place for temp generated PNG files
+ $PNG_TEMP_DIR = dirname(__FILE__).DIRECTORY_SEPARATOR.'temp'.DIRECTORY_SEPARATOR;
+
+ //html PNG location prefix
+ $PNG_WEB_DIR = 'temp/';
+
+ include "qrlib.php";
+
+ //ofcourse we need rights to create temp dir
+ if (!file_exists($PNG_TEMP_DIR))
+ mkdir($PNG_TEMP_DIR);
+
+
+ $filename = $PNG_TEMP_DIR.'test.png';
+
+ //processing form input
+ //remember to sanitize user input in real-life solution !!!
+ $errorCorrectionLevel = 'L';
+ if (isset($_REQUEST['level']) && in_array($_REQUEST['level'], array('L','M','Q','H')))
+ $errorCorrectionLevel = $_REQUEST['level'];
+
+ $matrixPointSize = 4;
+ if (isset($_REQUEST['size']))
+ $matrixPointSize = min(max((int)$_REQUEST['size'], 1), 10);
+
+
+ if (isset($_REQUEST['data'])) {
+
+ //it's very important!
+ if (trim($_REQUEST['data']) == '')
+ die('data cannot be empty! <a href="?">back</a>');
+
+ // user data
+ $filename = $PNG_TEMP_DIR.'test'.md5($_REQUEST['data'].'|'.$errorCorrectionLevel.'|'.$matrixPointSize).'.png';
+ QRcode::png($_REQUEST['data'], $filename, $errorCorrectionLevel, $matrixPointSize, 2);
+
+ } else {
+
+ //default data
+ echo 'You can provide data in GET parameter: <a href="?data=like_that">like that</a><hr/>';
+ QRcode::png('PHP QR Code :)', $filename, $errorCorrectionLevel, $matrixPointSize, 2);
+
+ }
+
+ //display generated file
+ echo '<img src="'.$PNG_WEB_DIR.basename($filename).'" /><hr/>';
+
+ //config form
+ echo '<form action="index.php" method="post">
+ Data:&nbsp;<input name="data" value="'.(isset($_REQUEST['data'])?htmlspecialchars($_REQUEST['data']):'PHP QR Code :)').'" />&nbsp;
+ ECC:&nbsp;<select name="level">
+ <option value="L"'.(($errorCorrectionLevel=='L')?' selected':'').'>L - smallest</option>
+ <option value="M"'.(($errorCorrectionLevel=='M')?' selected':'').'>M</option>
+ <option value="Q"'.(($errorCorrectionLevel=='Q')?' selected':'').'>Q</option>
+ <option value="H"'.(($errorCorrectionLevel=='H')?' selected':'').'>H - best</option>
+ </select>&nbsp;
+ Size:&nbsp;<select name="size">';
+
+ for($i=1;$i<=10;$i++)
+ echo '<option value="'.$i.'"'.(($matrixPointSize==$i)?' selected':'').'>'.$i.'</option>';
+
+ echo '</select>&nbsp;
+ <input type="submit" value="GENERATE"></form><hr/>';
+
+ // benchmark
+ QRtools::timeBenchmark();
+
+ \ No newline at end of file
diff --git a/library/phpqrcode/phpqrcode.php b/library/phpqrcode/phpqrcode.php
new file mode 100644
index 000000000..80adb9df2
--- /dev/null
+++ b/library/phpqrcode/phpqrcode.php
@@ -0,0 +1,3312 @@
+<?php
+
+/*
+ * PHP QR Code encoder
+ *
+ * This file contains MERGED version of PHP QR Code library.
+ * It was auto-generated from full version for your convenience.
+ *
+ * This merged version was configured to not requre any external files,
+ * with disabled cache, error loging and weker but faster mask matching.
+ * If you need tune it up please use non-merged version.
+ *
+ * For full version, documentation, examples of use please visit:
+ *
+ * http://phpqrcode.sourceforge.net/
+ * https://sourceforge.net/projects/phpqrcode/
+ *
+ * PHP QR Code is distributed under LGPL 3
+ * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+
+
+/*
+ * Version: 1.1.4
+ * Build: 2010100721
+ */
+
+
+
+//---- qrconst.php -----------------------------
+
+
+
+
+
+/*
+ * PHP QR Code encoder
+ *
+ * Common constants
+ *
+ * Based on libqrencode C library distributed under LGPL 2.1
+ * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi <fukuchi@megaui.net>
+ *
+ * PHP QR Code is distributed under LGPL 3
+ * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+ // Encoding modes
+
+ define('QR_MODE_NUL', -1);
+ define('QR_MODE_NUM', 0);
+ define('QR_MODE_AN', 1);
+ define('QR_MODE_8', 2);
+ define('QR_MODE_KANJI', 3);
+ define('QR_MODE_STRUCTURE', 4);
+
+ // Levels of error correction.
+
+ define('QR_ECLEVEL_L', 0);
+ define('QR_ECLEVEL_M', 1);
+ define('QR_ECLEVEL_Q', 2);
+ define('QR_ECLEVEL_H', 3);
+
+ // Supported output formats
+
+ define('QR_FORMAT_TEXT', 0);
+ define('QR_FORMAT_PNG', 1);
+
+ class qrstr {
+ public static function set(&$srctab, $x, $y, $repl, $replLen = false) {
+ $srctab[$y] = substr_replace($srctab[$y], ($replLen !== false)?substr($repl,0,$replLen):$repl, $x, ($replLen !== false)?$replLen:strlen($repl));
+ }
+ }
+
+
+
+//---- merged_config.php -----------------------------
+
+
+
+
+/*
+ * PHP QR Code encoder
+ *
+ * Config file, tuned-up for merged verion
+ */
+
+ define('QR_CACHEABLE', false); // use cache - more disk reads but less CPU power, masks and format templates are stored there
+ define('QR_CACHE_DIR', false); // used when QR_CACHEABLE === true
+ define('QR_LOG_DIR', false); // default error logs dir
+
+ define('QR_FIND_BEST_MASK', true); // if true, estimates best mask (spec. default, but extremally slow; set to false to significant performance boost but (propably) worst quality code
+ define('QR_FIND_FROM_RANDOM', 2); // if false, checks all masks available, otherwise value tells count of masks need to be checked, mask id are got randomly
+ define('QR_DEFAULT_MASK', 2); // when QR_FIND_BEST_MASK === false
+
+ define('QR_PNG_MAXIMUM_SIZE', 1024); // maximum allowed png image width (in pixels), tune to make sure GD and PHP can handle such big images
+
+
+
+
+//---- qrtools.php -----------------------------
+
+
+
+
+/*
+ * PHP QR Code encoder
+ *
+ * Toolset, handy and debug utilites.
+ *
+ * PHP QR Code is distributed under LGPL 3
+ * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+ class QRtools {
+
+ //----------------------------------------------------------------------
+ public static function binarize($frame)
+ {
+ $len = count($frame);
+ foreach ($frame as &$frameLine) {
+
+ for($i=0; $i<$len; $i++) {
+ $frameLine[$i] = (ord($frameLine[$i])&1)?'1':'0';
+ }
+ }
+
+ return $frame;
+ }
+
+ //----------------------------------------------------------------------
+ public static function tcpdfBarcodeArray($code, $mode = 'QR,L', $tcPdfVersion = '4.5.037')
+ {
+ $barcode_array = array();
+
+ if (!is_array($mode))
+ $mode = explode(',', $mode);
+
+ $eccLevel = 'L';
+
+ if (count($mode) > 1) {
+ $eccLevel = $mode[1];
+ }
+
+ $qrTab = QRcode::text($code, false, $eccLevel);
+ $size = count($qrTab);
+
+ $barcode_array['num_rows'] = $size;
+ $barcode_array['num_cols'] = $size;
+ $barcode_array['bcode'] = array();
+
+ foreach ($qrTab as $line) {
+ $arrAdd = array();
+ foreach(str_split($line) as $char)
+ $arrAdd[] = ($char=='1')?1:0;
+ $barcode_array['bcode'][] = $arrAdd;
+ }
+
+ return $barcode_array;
+ }
+
+ //----------------------------------------------------------------------
+ public static function clearCache()
+ {
+ self::$frames = array();
+ }
+
+ //----------------------------------------------------------------------
+ public static function buildCache()
+ {
+ QRtools::markTime('before_build_cache');
+
+ $mask = new QRmask();
+ for ($a=1; $a <= QRSPEC_VERSION_MAX; $a++) {
+ $frame = QRspec::newFrame($a);
+ if (QR_IMAGE) {
+ $fileName = QR_CACHE_DIR.'frame_'.$a.'.png';
+ QRimage::png(self::binarize($frame), $fileName, 1, 0);
+ }
+
+ $width = count($frame);
+ $bitMask = array_fill(0, $width, array_fill(0, $width, 0));
+ for ($maskNo=0; $maskNo<8; $maskNo++)
+ $mask->makeMaskNo($maskNo, $width, $frame, $bitMask, true);
+ }
+
+ QRtools::markTime('after_build_cache');
+ }
+
+ //----------------------------------------------------------------------
+ public static function log($outfile, $err)
+ {
+ if (QR_LOG_DIR !== false) {
+ if ($err != '') {
+ if ($outfile !== false) {
+ file_put_contents(QR_LOG_DIR.basename($outfile).'-errors.txt', date('Y-m-d H:i:s').': '.$err, FILE_APPEND);
+ } else {
+ file_put_contents(QR_LOG_DIR.'errors.txt', date('Y-m-d H:i:s').': '.$err, FILE_APPEND);
+ }
+ }
+ }
+ }
+
+ //----------------------------------------------------------------------
+ public static function dumpMask($frame)
+ {
+ $width = count($frame);
+ for($y=0;$y<$width;$y++) {
+ for($x=0;$x<$width;$x++) {
+ echo ord($frame[$y][$x]).',';
+ }
+ }
+ }
+
+ //----------------------------------------------------------------------
+ public static function markTime($markerId)
+ {
+ list($usec, $sec) = explode(" ", microtime());
+ $time = ((float)$usec + (float)$sec);
+
+ if (!isset($GLOBALS['qr_time_bench']))
+ $GLOBALS['qr_time_bench'] = array();
+
+ $GLOBALS['qr_time_bench'][$markerId] = $time;
+ }
+
+ //----------------------------------------------------------------------
+ public static function timeBenchmark()
+ {
+ self::markTime('finish');
+
+ $lastTime = 0;
+ $startTime = 0;
+ $p = 0;
+
+ echo '<table cellpadding="3" cellspacing="1">
+ <thead><tr style="border-bottom:1px solid silver"><td colspan="2" style="text-align:center">BENCHMARK</td></tr></thead>
+ <tbody>';
+
+ foreach($GLOBALS['qr_time_bench'] as $markerId=>$thisTime) {
+ if ($p > 0) {
+ echo '<tr><th style="text-align:right">till '.$markerId.': </th><td>'.number_format($thisTime-$lastTime, 6).'s</td></tr>';
+ } else {
+ $startTime = $thisTime;
+ }
+
+ $p++;
+ $lastTime = $thisTime;
+ }
+
+ echo '</tbody><tfoot>
+ <tr style="border-top:2px solid black"><th style="text-align:right">TOTAL: </th><td>'.number_format($lastTime-$startTime, 6).'s</td></tr>
+ </tfoot>
+ </table>';
+ }
+
+ }
+
+ //##########################################################################
+
+ QRtools::markTime('start');
+
+
+
+
+//---- qrspec.php -----------------------------
+
+
+
+
+/*
+ * PHP QR Code encoder
+ *
+ * QR Code specifications
+ *
+ * Based on libqrencode C library distributed under LGPL 2.1
+ * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi <fukuchi@megaui.net>
+ *
+ * PHP QR Code is distributed under LGPL 3
+ * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
+ *
+ * The following data / specifications are taken from
+ * "Two dimensional symbol -- QR-code -- Basic Specification" (JIS X0510:2004)
+ * or
+ * "Automatic identification and data capture techniques --
+ * QR Code 2005 bar code symbology specification" (ISO/IEC 18004:2006)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+ define('QRSPEC_VERSION_MAX', 40);
+ define('QRSPEC_WIDTH_MAX', 177);
+
+ define('QRCAP_WIDTH', 0);
+ define('QRCAP_WORDS', 1);
+ define('QRCAP_REMINDER', 2);
+ define('QRCAP_EC', 3);
+
+ class QRspec {
+
+ public static $capacity = array(
+ array( 0, 0, 0, array( 0, 0, 0, 0)),
+ array( 21, 26, 0, array( 7, 10, 13, 17)), // 1
+ array( 25, 44, 7, array( 10, 16, 22, 28)),
+ array( 29, 70, 7, array( 15, 26, 36, 44)),
+ array( 33, 100, 7, array( 20, 36, 52, 64)),
+ array( 37, 134, 7, array( 26, 48, 72, 88)), // 5
+ array( 41, 172, 7, array( 36, 64, 96, 112)),
+ array( 45, 196, 0, array( 40, 72, 108, 130)),
+ array( 49, 242, 0, array( 48, 88, 132, 156)),
+ array( 53, 292, 0, array( 60, 110, 160, 192)),
+ array( 57, 346, 0, array( 72, 130, 192, 224)), //10
+ array( 61, 404, 0, array( 80, 150, 224, 264)),
+ array( 65, 466, 0, array( 96, 176, 260, 308)),
+ array( 69, 532, 0, array( 104, 198, 288, 352)),
+ array( 73, 581, 3, array( 120, 216, 320, 384)),
+ array( 77, 655, 3, array( 132, 240, 360, 432)), //15
+ array( 81, 733, 3, array( 144, 280, 408, 480)),
+ array( 85, 815, 3, array( 168, 308, 448, 532)),
+ array( 89, 901, 3, array( 180, 338, 504, 588)),
+ array( 93, 991, 3, array( 196, 364, 546, 650)),
+ array( 97, 1085, 3, array( 224, 416, 600, 700)), //20
+ array(101, 1156, 4, array( 224, 442, 644, 750)),
+ array(105, 1258, 4, array( 252, 476, 690, 816)),
+ array(109, 1364, 4, array( 270, 504, 750, 900)),
+ array(113, 1474, 4, array( 300, 560, 810, 960)),
+ array(117, 1588, 4, array( 312, 588, 870, 1050)), //25
+ array(121, 1706, 4, array( 336, 644, 952, 1110)),
+ array(125, 1828, 4, array( 360, 700, 1020, 1200)),
+ array(129, 1921, 3, array( 390, 728, 1050, 1260)),
+ array(133, 2051, 3, array( 420, 784, 1140, 1350)),
+ array(137, 2185, 3, array( 450, 812, 1200, 1440)), //30
+ array(141, 2323, 3, array( 480, 868, 1290, 1530)),
+ array(145, 2465, 3, array( 510, 924, 1350, 1620)),
+ array(149, 2611, 3, array( 540, 980, 1440, 1710)),
+ array(153, 2761, 3, array( 570, 1036, 1530, 1800)),
+ array(157, 2876, 0, array( 570, 1064, 1590, 1890)), //35
+ array(161, 3034, 0, array( 600, 1120, 1680, 1980)),
+ array(165, 3196, 0, array( 630, 1204, 1770, 2100)),
+ array(169, 3362, 0, array( 660, 1260, 1860, 2220)),
+ array(173, 3532, 0, array( 720, 1316, 1950, 2310)),
+ array(177, 3706, 0, array( 750, 1372, 2040, 2430)) //40
+ );
+
+ //----------------------------------------------------------------------
+ public static function getDataLength($version, $level)
+ {
+ return self::$capacity[$version][QRCAP_WORDS] - self::$capacity[$version][QRCAP_EC][$level];
+ }
+
+ //----------------------------------------------------------------------
+ public static function getECCLength($version, $level)
+ {
+ return self::$capacity[$version][QRCAP_EC][$level];
+ }
+
+ //----------------------------------------------------------------------
+ public static function getWidth($version)
+ {
+ return self::$capacity[$version][QRCAP_WIDTH];
+ }
+
+ //----------------------------------------------------------------------
+ public static function getRemainder($version)
+ {
+ return self::$capacity[$version][QRCAP_REMINDER];
+ }
+
+ //----------------------------------------------------------------------
+ public static function getMinimumVersion($size, $level)
+ {
+
+ for($i=1; $i<= QRSPEC_VERSION_MAX; $i++) {
+ $words = self::$capacity[$i][QRCAP_WORDS] - self::$capacity[$i][QRCAP_EC][$level];
+ if($words >= $size)
+ return $i;
+ }
+
+ return -1;
+ }
+
+ //######################################################################
+
+ public static $lengthTableBits = array(
+ array(10, 12, 14),
+ array( 9, 11, 13),
+ array( 8, 16, 16),
+ array( 8, 10, 12)
+ );
+
+ //----------------------------------------------------------------------
+ public static function lengthIndicator($mode, $version)
+ {
+ if ($mode == QR_MODE_STRUCTURE)
+ return 0;
+
+ if ($version <= 9) {
+ $l = 0;
+ } else if ($version <= 26) {
+ $l = 1;
+ } else {
+ $l = 2;
+ }
+
+ return self::$lengthTableBits[$mode][$l];
+ }
+
+ //----------------------------------------------------------------------
+ public static function maximumWords($mode, $version)
+ {
+ if($mode == QR_MODE_STRUCTURE)
+ return 3;
+
+ if($version <= 9) {
+ $l = 0;
+ } else if($version <= 26) {
+ $l = 1;
+ } else {
+ $l = 2;
+ }
+
+ $bits = self::$lengthTableBits[$mode][$l];
+ $words = (1 << $bits) - 1;
+
+ if($mode == QR_MODE_KANJI) {
+ $words *= 2; // the number of bytes is required
+ }
+
+ return $words;
+ }
+
+ // Error correction code -----------------------------------------------
+ // Table of the error correction code (Reed-Solomon block)
+ // See Table 12-16 (pp.30-36), JIS X0510:2004.
+
+ public static $eccTable = array(
+ array(array( 0, 0), array( 0, 0), array( 0, 0), array( 0, 0)),
+ array(array( 1, 0), array( 1, 0), array( 1, 0), array( 1, 0)), // 1
+ array(array( 1, 0), array( 1, 0), array( 1, 0), array( 1, 0)),
+ array(array( 1, 0), array( 1, 0), array( 2, 0), array( 2, 0)),
+ array(array( 1, 0), array( 2, 0), array( 2, 0), array( 4, 0)),
+ array(array( 1, 0), array( 2, 0), array( 2, 2), array( 2, 2)), // 5
+ array(array( 2, 0), array( 4, 0), array( 4, 0), array( 4, 0)),
+ array(array( 2, 0), array( 4, 0), array( 2, 4), array( 4, 1)),
+ array(array( 2, 0), array( 2, 2), array( 4, 2), array( 4, 2)),
+ array(array( 2, 0), array( 3, 2), array( 4, 4), array( 4, 4)),
+ array(array( 2, 2), array( 4, 1), array( 6, 2), array( 6, 2)), //10
+ array(array( 4, 0), array( 1, 4), array( 4, 4), array( 3, 8)),
+ array(array( 2, 2), array( 6, 2), array( 4, 6), array( 7, 4)),
+ array(array( 4, 0), array( 8, 1), array( 8, 4), array(12, 4)),
+ array(array( 3, 1), array( 4, 5), array(11, 5), array(11, 5)),
+ array(array( 5, 1), array( 5, 5), array( 5, 7), array(11, 7)), //15
+ array(array( 5, 1), array( 7, 3), array(15, 2), array( 3, 13)),
+ array(array( 1, 5), array(10, 1), array( 1, 15), array( 2, 17)),
+ array(array( 5, 1), array( 9, 4), array(17, 1), array( 2, 19)),
+ array(array( 3, 4), array( 3, 11), array(17, 4), array( 9, 16)),
+ array(array( 3, 5), array( 3, 13), array(15, 5), array(15, 10)), //20
+ array(array( 4, 4), array(17, 0), array(17, 6), array(19, 6)),
+ array(array( 2, 7), array(17, 0), array( 7, 16), array(34, 0)),
+ array(array( 4, 5), array( 4, 14), array(11, 14), array(16, 14)),
+ array(array( 6, 4), array( 6, 14), array(11, 16), array(30, 2)),
+ array(array( 8, 4), array( 8, 13), array( 7, 22), array(22, 13)), //25
+ array(array(10, 2), array(19, 4), array(28, 6), array(33, 4)),
+ array(array( 8, 4), array(22, 3), array( 8, 26), array(12, 28)),
+ array(array( 3, 10), array( 3, 23), array( 4, 31), array(11, 31)),
+ array(array( 7, 7), array(21, 7), array( 1, 37), array(19, 26)),
+ array(array( 5, 10), array(19, 10), array(15, 25), array(23, 25)), //30
+ array(array(13, 3), array( 2, 29), array(42, 1), array(23, 28)),
+ array(array(17, 0), array(10, 23), array(10, 35), array(19, 35)),
+ array(array(17, 1), array(14, 21), array(29, 19), array(11, 46)),
+ array(array(13, 6), array(14, 23), array(44, 7), array(59, 1)),
+ array(array(12, 7), array(12, 26), array(39, 14), array(22, 41)), //35
+ array(array( 6, 14), array( 6, 34), array(46, 10), array( 2, 64)),
+ array(array(17, 4), array(29, 14), array(49, 10), array(24, 46)),
+ array(array( 4, 18), array(13, 32), array(48, 14), array(42, 32)),
+ array(array(20, 4), array(40, 7), array(43, 22), array(10, 67)),
+ array(array(19, 6), array(18, 31), array(34, 34), array(20, 61)),//40
+ );
+
+ //----------------------------------------------------------------------
+ // CACHEABLE!!!
+
+ public static function getEccSpec($version, $level, array &$spec)
+ {
+ if (count($spec) < 5) {
+ $spec = array(0,0,0,0,0);
+ }
+
+ $b1 = self::$eccTable[$version][$level][0];
+ $b2 = self::$eccTable[$version][$level][1];
+ $data = self::getDataLength($version, $level);
+ $ecc = self::getECCLength($version, $level);
+
+ if($b2 == 0) {
+ $spec[0] = $b1;
+ $spec[1] = (int)($data / $b1);
+ $spec[2] = (int)($ecc / $b1);
+ $spec[3] = 0;
+ $spec[4] = 0;
+ } else {
+ $spec[0] = $b1;
+ $spec[1] = (int)($data / ($b1 + $b2));
+ $spec[2] = (int)($ecc / ($b1 + $b2));
+ $spec[3] = $b2;
+ $spec[4] = $spec[1] + 1;
+ }
+ }
+
+ // Alignment pattern ---------------------------------------------------
+
+ // Positions of alignment patterns.
+ // This array includes only the second and the third position of the
+ // alignment patterns. Rest of them can be calculated from the distance
+ // between them.
+
+ // See Table 1 in Appendix E (pp.71) of JIS X0510:2004.
+
+ public static $alignmentPattern = array(
+ array( 0, 0),
+ array( 0, 0), array(18, 0), array(22, 0), array(26, 0), array(30, 0), // 1- 5
+ array(34, 0), array(22, 38), array(24, 42), array(26, 46), array(28, 50), // 6-10
+ array(30, 54), array(32, 58), array(34, 62), array(26, 46), array(26, 48), //11-15
+ array(26, 50), array(30, 54), array(30, 56), array(30, 58), array(34, 62), //16-20
+ array(28, 50), array(26, 50), array(30, 54), array(28, 54), array(32, 58), //21-25
+ array(30, 58), array(34, 62), array(26, 50), array(30, 54), array(26, 52), //26-30
+ array(30, 56), array(34, 60), array(30, 58), array(34, 62), array(30, 54), //31-35
+ array(24, 50), array(28, 54), array(32, 58), array(26, 54), array(30, 58), //35-40
+ );
+
+
+ /** --------------------------------------------------------------------
+ * Put an alignment marker.
+ * @param frame
+ * @param width
+ * @param ox,oy center coordinate of the pattern
+ */
+ public static function putAlignmentMarker(array &$frame, $ox, $oy)
+ {
+ $finder = array(
+ "\xa1\xa1\xa1\xa1\xa1",
+ "\xa1\xa0\xa0\xa0\xa1",
+ "\xa1\xa0\xa1\xa0\xa1",
+ "\xa1\xa0\xa0\xa0\xa1",
+ "\xa1\xa1\xa1\xa1\xa1"
+ );
+
+ $yStart = $oy-2;
+ $xStart = $ox-2;
+
+ for($y=0; $y<5; $y++) {
+ QRstr::set($frame, $xStart, $yStart+$y, $finder[$y]);
+ }
+ }
+
+ //----------------------------------------------------------------------
+ public static function putAlignmentPattern($version, &$frame, $width)
+ {
+ if($version < 2)
+ return;
+
+ $d = self::$alignmentPattern[$version][1] - self::$alignmentPattern[$version][0];
+ if($d < 0) {
+ $w = 2;
+ } else {
+ $w = (int)(($width - self::$alignmentPattern[$version][0]) / $d + 2);
+ }
+
+ if($w * $w - 3 == 1) {
+ $x = self::$alignmentPattern[$version][0];
+ $y = self::$alignmentPattern[$version][0];
+ self::putAlignmentMarker($frame, $x, $y);
+ return;
+ }
+
+ $cx = self::$alignmentPattern[$version][0];
+ for($x=1; $x<$w - 1; $x++) {
+ self::putAlignmentMarker($frame, 6, $cx);
+ self::putAlignmentMarker($frame, $cx, 6);
+ $cx += $d;
+ }
+
+ $cy = self::$alignmentPattern[$version][0];
+ for($y=0; $y<$w-1; $y++) {
+ $cx = self::$alignmentPattern[$version][0];
+ for($x=0; $x<$w-1; $x++) {
+ self::putAlignmentMarker($frame, $cx, $cy);
+ $cx += $d;
+ }
+ $cy += $d;
+ }
+ }
+
+ // Version information pattern -----------------------------------------
+
+ // Version information pattern (BCH coded).
+ // See Table 1 in Appendix D (pp.68) of JIS X0510:2004.
+
+ // size: [QRSPEC_VERSION_MAX - 6]
+
+ public static $versionPattern = array(
+ 0x07c94, 0x085bc, 0x09a99, 0x0a4d3, 0x0bbf6, 0x0c762, 0x0d847, 0x0e60d,
+ 0x0f928, 0x10b78, 0x1145d, 0x12a17, 0x13532, 0x149a6, 0x15683, 0x168c9,
+ 0x177ec, 0x18ec4, 0x191e1, 0x1afab, 0x1b08e, 0x1cc1a, 0x1d33f, 0x1ed75,
+ 0x1f250, 0x209d5, 0x216f0, 0x228ba, 0x2379f, 0x24b0b, 0x2542e, 0x26a64,
+ 0x27541, 0x28c69
+ );
+
+ //----------------------------------------------------------------------
+ public static function getVersionPattern($version)
+ {
+ if($version < 7 || $version > QRSPEC_VERSION_MAX)
+ return 0;
+
+ return self::$versionPattern[$version -7];
+ }
+
+ // Format information --------------------------------------------------
+ // See calcFormatInfo in tests/test_qrspec.c (orginal qrencode c lib)
+
+ public static $formatInfo = array(
+ array(0x77c4, 0x72f3, 0x7daa, 0x789d, 0x662f, 0x6318, 0x6c41, 0x6976),
+ array(0x5412, 0x5125, 0x5e7c, 0x5b4b, 0x45f9, 0x40ce, 0x4f97, 0x4aa0),
+ array(0x355f, 0x3068, 0x3f31, 0x3a06, 0x24b4, 0x2183, 0x2eda, 0x2bed),
+ array(0x1689, 0x13be, 0x1ce7, 0x19d0, 0x0762, 0x0255, 0x0d0c, 0x083b)
+ );
+
+ public static function getFormatInfo($mask, $level)
+ {
+ if($mask < 0 || $mask > 7)
+ return 0;
+
+ if($level < 0 || $level > 3)
+ return 0;
+
+ return self::$formatInfo[$level][$mask];
+ }
+
+ // Frame ---------------------------------------------------------------
+ // Cache of initial frames.
+
+ public static $frames = array();
+
+ /** --------------------------------------------------------------------
+ * Put a finder pattern.
+ * @param frame
+ * @param width
+ * @param ox,oy upper-left coordinate of the pattern
+ */
+ public static function putFinderPattern(&$frame, $ox, $oy)
+ {
+ $finder = array(
+ "\xc1\xc1\xc1\xc1\xc1\xc1\xc1",
+ "\xc1\xc0\xc0\xc0\xc0\xc0\xc1",
+ "\xc1\xc0\xc1\xc1\xc1\xc0\xc1",
+ "\xc1\xc0\xc1\xc1\xc1\xc0\xc1",
+ "\xc1\xc0\xc1\xc1\xc1\xc0\xc1",
+ "\xc1\xc0\xc0\xc0\xc0\xc0\xc1",
+ "\xc1\xc1\xc1\xc1\xc1\xc1\xc1"
+ );
+
+ for($y=0; $y<7; $y++) {
+ QRstr::set($frame, $ox, $oy+$y, $finder[$y]);
+ }
+ }
+
+ //----------------------------------------------------------------------
+ public static function createFrame($version)
+ {
+ $width = self::$capacity[$version][QRCAP_WIDTH];
+ $frameLine = str_repeat ("\0", $width);
+ $frame = array_fill(0, $width, $frameLine);
+
+ // Finder pattern
+ self::putFinderPattern($frame, 0, 0);
+ self::putFinderPattern($frame, $width - 7, 0);
+ self::putFinderPattern($frame, 0, $width - 7);
+
+ // Separator
+ $yOffset = $width - 7;
+
+ for($y=0; $y<7; $y++) {
+ $frame[$y][7] = "\xc0";
+ $frame[$y][$width - 8] = "\xc0";
+ $frame[$yOffset][7] = "\xc0";
+ $yOffset++;
+ }
+
+ $setPattern = str_repeat("\xc0", 8);
+
+ QRstr::set($frame, 0, 7, $setPattern);
+ QRstr::set($frame, $width-8, 7, $setPattern);
+ QRstr::set($frame, 0, $width - 8, $setPattern);
+
+ // Format info
+ $setPattern = str_repeat("\x84", 9);
+ QRstr::set($frame, 0, 8, $setPattern);
+ QRstr::set($frame, $width - 8, 8, $setPattern, 8);
+
+ $yOffset = $width - 8;
+
+ for($y=0; $y<8; $y++,$yOffset++) {
+ $frame[$y][8] = "\x84";
+ $frame[$yOffset][8] = "\x84";
+ }
+
+ // Timing pattern
+
+ for($i=1; $i<$width-15; $i++) {
+ $frame[6][7+$i] = chr(0x90 | ($i & 1));
+ $frame[7+$i][6] = chr(0x90 | ($i & 1));
+ }
+
+ // Alignment pattern
+ self::putAlignmentPattern($version, $frame, $width);
+
+ // Version information
+ if($version >= 7) {
+ $vinf = self::getVersionPattern($version);
+
+ $v = $vinf;
+
+ for($x=0; $x<6; $x++) {
+ for($y=0; $y<3; $y++) {
+ $frame[($width - 11)+$y][$x] = chr(0x88 | ($v & 1));
+ $v = $v >> 1;
+ }
+ }
+
+ $v = $vinf;
+ for($y=0; $y<6; $y++) {
+ for($x=0; $x<3; $x++) {
+ $frame[$y][$x+($width - 11)] = chr(0x88 | ($v & 1));
+ $v = $v >> 1;
+ }
+ }
+ }
+
+ // and a little bit...
+ $frame[$width - 8][8] = "\x81";
+
+ return $frame;
+ }
+
+ //----------------------------------------------------------------------
+ public static function debug($frame, $binary_mode = false)
+ {
+ if ($binary_mode) {
+
+ foreach ($frame as &$frameLine) {
+ $frameLine = join('<span class="m">&nbsp;&nbsp;</span>', explode('0', $frameLine));
+ $frameLine = join('&#9608;&#9608;', explode('1', $frameLine));
+ }
+
+ ?>
+ <style>
+ .m { background-color: white; }
+ </style>
+ <?php
+ echo '<pre><tt><br/ ><br/ ><br/ >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;';
+ echo join("<br/ >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;", $frame);
+ echo '</tt></pre><br/ ><br/ ><br/ ><br/ ><br/ ><br/ >';
+
+ } else {
+
+ foreach ($frame as &$frameLine) {
+ $frameLine = join('<span class="m">&nbsp;</span>', explode("\xc0", $frameLine));
+ $frameLine = join('<span class="m">&#9618;</span>', explode("\xc1", $frameLine));
+ $frameLine = join('<span class="p">&nbsp;</span>', explode("\xa0", $frameLine));
+ $frameLine = join('<span class="p">&#9618;</span>', explode("\xa1", $frameLine));
+ $frameLine = join('<span class="s">&#9671;</span>', explode("\x84", $frameLine)); //format 0
+ $frameLine = join('<span class="s">&#9670;</span>', explode("\x85", $frameLine)); //format 1
+ $frameLine = join('<span class="x">&#9762;</span>', explode("\x81", $frameLine)); //special bit
+ $frameLine = join('<span class="c">&nbsp;</span>', explode("\x90", $frameLine)); //clock 0
+ $frameLine = join('<span class="c">&#9719;</span>', explode("\x91", $frameLine)); //clock 1
+ $frameLine = join('<span class="f">&nbsp;</span>', explode("\x88", $frameLine)); //version
+ $frameLine = join('<span class="f">&#9618;</span>', explode("\x89", $frameLine)); //version
+ $frameLine = join('&#9830;', explode("\x01", $frameLine));
+ $frameLine = join('&#8901;', explode("\0", $frameLine));
+ }
+
+ ?>
+ <style>
+ .p { background-color: yellow; }
+ .m { background-color: #00FF00; }
+ .s { background-color: #FF0000; }
+ .c { background-color: aqua; }
+ .x { background-color: pink; }
+ .f { background-color: gold; }
+ </style>
+ <?php
+ echo "<pre><tt>";
+ echo join("<br/ >", $frame);
+ echo "</tt></pre>";
+
+ }
+ }
+
+ //----------------------------------------------------------------------
+ public static function serial($frame)
+ {
+ return gzcompress(join("\n", $frame), 9);
+ }
+
+ //----------------------------------------------------------------------
+ public static function unserial($code)
+ {
+ return explode("\n", gzuncompress($code));
+ }
+
+ //----------------------------------------------------------------------
+ public static function newFrame($version)
+ {
+ if($version < 1 || $version > QRSPEC_VERSION_MAX)
+ return null;
+
+ if(!isset(self::$frames[$version])) {
+
+ $fileName = QR_CACHE_DIR.'frame_'.$version.'.dat';
+
+ if (QR_CACHEABLE) {
+ if (file_exists($fileName)) {
+ self::$frames[$version] = self::unserial(file_get_contents($fileName));
+ } else {
+ self::$frames[$version] = self::createFrame($version);
+ file_put_contents($fileName, self::serial(self::$frames[$version]));
+ }
+ } else {
+ self::$frames[$version] = self::createFrame($version);
+ }
+ }
+
+ if(is_null(self::$frames[$version]))
+ return null;
+
+ return self::$frames[$version];
+ }
+
+ //----------------------------------------------------------------------
+ public static function rsBlockNum($spec) { return $spec[0] + $spec[3]; }
+ public static function rsBlockNum1($spec) { return $spec[0]; }
+ public static function rsDataCodes1($spec) { return $spec[1]; }
+ public static function rsEccCodes1($spec) { return $spec[2]; }
+ public static function rsBlockNum2($spec) { return $spec[3]; }
+ public static function rsDataCodes2($spec) { return $spec[4]; }
+ public static function rsEccCodes2($spec) { return $spec[2]; }
+ public static function rsDataLength($spec) { return ($spec[0] * $spec[1]) + ($spec[3] * $spec[4]); }
+ public static function rsEccLength($spec) { return ($spec[0] + $spec[3]) * $spec[2]; }
+
+ }
+
+
+
+//---- qrimage.php -----------------------------
+
+
+
+
+/*
+ * PHP QR Code encoder
+ *
+ * Image output of code using GD2
+ *
+ * PHP QR Code is distributed under LGPL 3
+ * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+ define('QR_IMAGE', true);
+
+ class QRimage {
+
+ //----------------------------------------------------------------------
+ public static function png($frame, $filename = false, $pixelPerPoint = 4, $outerFrame = 4,$saveandprint=FALSE)
+ {
+ $image = self::image($frame, $pixelPerPoint, $outerFrame);
+
+ if ($filename === false) {
+ Header("Content-type: image/png");
+ ImagePng($image);
+ } else {
+ if($saveandprint===TRUE){
+ ImagePng($image, $filename);
+ header("Content-type: image/png");
+ ImagePng($image);
+ }else{
+ ImagePng($image, $filename);
+ }
+ }
+
+ ImageDestroy($image);
+ }
+
+ //----------------------------------------------------------------------
+ public static function jpg($frame, $filename = false, $pixelPerPoint = 8, $outerFrame = 4, $q = 85)
+ {
+ $image = self::image($frame, $pixelPerPoint, $outerFrame);
+
+ if ($filename === false) {
+ Header("Content-type: image/jpeg");
+ ImageJpeg($image, null, $q);
+ } else {
+ ImageJpeg($image, $filename, $q);
+ }
+
+ ImageDestroy($image);
+ }
+
+ //----------------------------------------------------------------------
+ private static function image($frame, $pixelPerPoint = 4, $outerFrame = 4)
+ {
+ $h = count($frame);
+ $w = strlen($frame[0]);
+
+ $imgW = $w + 2*$outerFrame;
+ $imgH = $h + 2*$outerFrame;
+
+ $base_image =ImageCreate($imgW, $imgH);
+
+ $col[0] = ImageColorAllocate($base_image,255,255,255);
+ $col[1] = ImageColorAllocate($base_image,0,0,0);
+
+ imagefill($base_image, 0, 0, $col[0]);
+
+ for($y=0; $y<$h; $y++) {
+ for($x=0; $x<$w; $x++) {
+ if ($frame[$y][$x] == '1') {
+ ImageSetPixel($base_image,$x+$outerFrame,$y+$outerFrame,$col[1]);
+ }
+ }
+ }
+
+ $target_image =ImageCreate($imgW * $pixelPerPoint, $imgH * $pixelPerPoint);
+ ImageCopyResized($target_image, $base_image, 0, 0, 0, 0, $imgW * $pixelPerPoint, $imgH * $pixelPerPoint, $imgW, $imgH);
+ ImageDestroy($base_image);
+
+ return $target_image;
+ }
+ }
+
+
+
+//---- qrinput.php -----------------------------
+
+
+
+
+/*
+ * PHP QR Code encoder
+ *
+ * Input encoding class
+ *
+ * Based on libqrencode C library distributed under LGPL 2.1
+ * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi <fukuchi@megaui.net>
+ *
+ * PHP QR Code is distributed under LGPL 3
+ * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+ define('STRUCTURE_HEADER_BITS', 20);
+ define('MAX_STRUCTURED_SYMBOLS', 16);
+
+ class QRinputItem {
+
+ public $mode;
+ public $size;
+ public $data;
+ public $bstream;
+
+ public function __construct($mode, $size, $data, $bstream = null)
+ {
+ $setData = array_slice($data, 0, $size);
+
+ if (count($setData) < $size) {
+ $setData = array_merge($setData, array_fill(0,$size-count($setData),0));
+ }
+
+ if(!QRinput::check($mode, $size, $setData)) {
+ throw new Exception('Error m:'.$mode.',s:'.$size.',d:'.join(',',$setData));
+ return null;
+ }
+
+ $this->mode = $mode;
+ $this->size = $size;
+ $this->data = $setData;
+ $this->bstream = $bstream;
+ }
+
+ //----------------------------------------------------------------------
+ public function encodeModeNum($version)
+ {
+ try {
+
+ $words = (int)($this->size / 3);
+ $bs = new QRbitstream();
+
+ $val = 0x1;
+ $bs->appendNum(4, $val);
+ $bs->appendNum(QRspec::lengthIndicator(QR_MODE_NUM, $version), $this->size);
+
+ for($i=0; $i<$words; $i++) {
+ $val = (ord($this->data[$i*3 ]) - ord('0')) * 100;
+ $val += (ord($this->data[$i*3+1]) - ord('0')) * 10;
+ $val += (ord($this->data[$i*3+2]) - ord('0'));
+ $bs->appendNum(10, $val);
+ }
+
+ if($this->size - $words * 3 == 1) {
+ $val = ord($this->data[$words*3]) - ord('0');
+ $bs->appendNum(4, $val);
+ } else if($this->size - $words * 3 == 2) {
+ $val = (ord($this->data[$words*3 ]) - ord('0')) * 10;
+ $val += (ord($this->data[$words*3+1]) - ord('0'));
+ $bs->appendNum(7, $val);
+ }
+
+ $this->bstream = $bs;
+ return 0;
+
+ } catch (Exception $e) {
+ return -1;
+ }
+ }
+
+ //----------------------------------------------------------------------
+ public function encodeModeAn($version)
+ {
+ try {
+ $words = (int)($this->size / 2);
+ $bs = new QRbitstream();
+
+ $bs->appendNum(4, 0x02);
+ $bs->appendNum(QRspec::lengthIndicator(QR_MODE_AN, $version), $this->size);
+
+ for($i=0; $i<$words; $i++) {
+ $val = (int)QRinput::lookAnTable(ord($this->data[$i*2 ])) * 45;
+ $val += (int)QRinput::lookAnTable(ord($this->data[$i*2+1]));
+
+ $bs->appendNum(11, $val);
+ }
+
+ if($this->size & 1) {
+ $val = QRinput::lookAnTable(ord($this->data[$words * 2]));
+ $bs->appendNum(6, $val);
+ }
+
+ $this->bstream = $bs;
+ return 0;
+
+ } catch (Exception $e) {
+ return -1;
+ }
+ }
+
+ //----------------------------------------------------------------------
+ public function encodeMode8($version)
+ {
+ try {
+ $bs = new QRbitstream();
+
+ $bs->appendNum(4, 0x4);
+ $bs->appendNum(QRspec::lengthIndicator(QR_MODE_8, $version), $this->size);
+
+ for($i=0; $i<$this->size; $i++) {
+ $bs->appendNum(8, ord($this->data[$i]));
+ }
+
+ $this->bstream = $bs;
+ return 0;
+
+ } catch (Exception $e) {
+ return -1;
+ }
+ }
+
+ //----------------------------------------------------------------------
+ public function encodeModeKanji($version)
+ {
+ try {
+
+ $bs = new QRbitrtream();
+
+ $bs->appendNum(4, 0x8);
+ $bs->appendNum(QRspec::lengthIndicator(QR_MODE_KANJI, $version), (int)($this->size / 2));
+
+ for($i=0; $i<$this->size; $i+=2) {
+ $val = (ord($this->data[$i]) << 8) | ord($this->data[$i+1]);
+ if($val <= 0x9ffc) {
+ $val -= 0x8140;
+ } else {
+ $val -= 0xc140;
+ }
+
+ $h = ($val >> 8) * 0xc0;
+ $val = ($val & 0xff) + $h;
+
+ $bs->appendNum(13, $val);
+ }
+
+ $this->bstream = $bs;
+ return 0;
+
+ } catch (Exception $e) {
+ return -1;
+ }
+ }
+
+ //----------------------------------------------------------------------
+ public function encodeModeStructure()
+ {
+ try {
+ $bs = new QRbitstream();
+
+ $bs->appendNum(4, 0x03);
+ $bs->appendNum(4, ord($this->data[1]) - 1);
+ $bs->appendNum(4, ord($this->data[0]) - 1);
+ $bs->appendNum(8, ord($this->data[2]));
+
+ $this->bstream = $bs;
+ return 0;
+
+ } catch (Exception $e) {
+ return -1;
+ }
+ }
+
+ //----------------------------------------------------------------------
+ public function estimateBitStreamSizeOfEntry($version)
+ {
+ $bits = 0;
+
+ if($version == 0)
+ $version = 1;
+
+ switch($this->mode) {
+ case QR_MODE_NUM: $bits = QRinput::estimateBitsModeNum($this->size); break;
+ case QR_MODE_AN: $bits = QRinput::estimateBitsModeAn($this->size); break;
+ case QR_MODE_8: $bits = QRinput::estimateBitsMode8($this->size); break;
+ case QR_MODE_KANJI: $bits = QRinput::estimateBitsModeKanji($this->size);break;
+ case QR_MODE_STRUCTURE: return STRUCTURE_HEADER_BITS;
+ default:
+ return 0;
+ }
+
+ $l = QRspec::lengthIndicator($this->mode, $version);
+ $m = 1 << $l;
+ $num = (int)(($this->size + $m - 1) / $m);
+
+ $bits += $num * (4 + $l);
+
+ return $bits;
+ }
+
+ //----------------------------------------------------------------------
+ public function encodeBitStream($version)
+ {
+ try {
+
+ unset($this->bstream);
+ $words = QRspec::maximumWords($this->mode, $version);
+
+ if($this->size > $words) {
+
+ $st1 = new QRinputItem($this->mode, $words, $this->data);
+ $st2 = new QRinputItem($this->mode, $this->size - $words, array_slice($this->data, $words));
+
+ $st1->encodeBitStream($version);
+ $st2->encodeBitStream($version);
+
+ $this->bstream = new QRbitstream();
+ $this->bstream->append($st1->bstream);
+ $this->bstream->append($st2->bstream);
+
+ unset($st1);
+ unset($st2);
+
+ } else {
+
+ $ret = 0;
+
+ switch($this->mode) {
+ case QR_MODE_NUM: $ret = $this->encodeModeNum($version); break;
+ case QR_MODE_AN: $ret = $this->encodeModeAn($version); break;
+ case QR_MODE_8: $ret = $this->encodeMode8($version); break;
+ case QR_MODE_KANJI: $ret = $this->encodeModeKanji($version);break;
+ case QR_MODE_STRUCTURE: $ret = $this->encodeModeStructure(); break;
+
+ default:
+ break;
+ }
+
+ if($ret < 0)
+ return -1;
+ }
+
+ return $this->bstream->size();
+
+ } catch (Exception $e) {
+ return -1;
+ }
+ }
+ };
+
+ //##########################################################################
+
+ class QRinput {
+
+ public $items;
+
+ private $version;
+ private $level;
+
+ //----------------------------------------------------------------------
+ public function __construct($version = 0, $level = QR_ECLEVEL_L)
+ {
+ if ($version < 0 || $version > QRSPEC_VERSION_MAX || $level > QR_ECLEVEL_H) {
+ throw new Exception('Invalid version no');
+ return NULL;
+ }
+
+ $this->version = $version;
+ $this->level = $level;
+ }
+
+ //----------------------------------------------------------------------
+ public function getVersion()
+ {
+ return $this->version;
+ }
+
+ //----------------------------------------------------------------------
+ public function setVersion($version)
+ {
+ if($version < 0 || $version > QRSPEC_VERSION_MAX) {
+ throw new Exception('Invalid version no');
+ return -1;
+ }
+
+ $this->version = $version;
+
+ return 0;
+ }
+
+ //----------------------------------------------------------------------
+ public function getErrorCorrectionLevel()
+ {
+ return $this->level;
+ }
+
+ //----------------------------------------------------------------------
+ public function setErrorCorrectionLevel($level)
+ {
+ if($level > QR_ECLEVEL_H) {
+ throw new Exception('Invalid ECLEVEL');
+ return -1;
+ }
+
+ $this->level = $level;
+
+ return 0;
+ }
+
+ //----------------------------------------------------------------------
+ public function appendEntry(QRinputItem $entry)
+ {
+ $this->items[] = $entry;
+ }
+
+ //----------------------------------------------------------------------
+ public function append($mode, $size, $data)
+ {
+ try {
+ $entry = new QRinputItem($mode, $size, $data);
+ $this->items[] = $entry;
+ return 0;
+ } catch (Exception $e) {
+ return -1;
+ }
+ }
+
+ //----------------------------------------------------------------------
+
+ public function insertStructuredAppendHeader($size, $index, $parity)
+ {
+ if( $size > MAX_STRUCTURED_SYMBOLS ) {
+ throw new Exception('insertStructuredAppendHeader wrong size');
+ }
+
+ if( $index <= 0 || $index > MAX_STRUCTURED_SYMBOLS ) {
+ throw new Exception('insertStructuredAppendHeader wrong index');
+ }
+
+ $buf = array($size, $index, $parity);
+
+ try {
+ $entry = new QRinputItem(QR_MODE_STRUCTURE, 3, buf);
+ array_unshift($this->items, $entry);
+ return 0;
+ } catch (Exception $e) {
+ return -1;
+ }
+ }
+
+ //----------------------------------------------------------------------
+ public function calcParity()
+ {
+ $parity = 0;
+
+ foreach($this->items as $item) {
+ if($item->mode != QR_MODE_STRUCTURE) {
+ for($i=$item->size-1; $i>=0; $i--) {
+ $parity ^= $item->data[$i];
+ }
+ }
+ }
+
+ return $parity;
+ }
+
+ //----------------------------------------------------------------------
+ public static function checkModeNum($size, $data)
+ {
+ for($i=0; $i<$size; $i++) {
+ if((ord($data[$i]) < ord('0')) || (ord($data[$i]) > ord('9'))){
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ //----------------------------------------------------------------------
+ public static function estimateBitsModeNum($size)
+ {
+ $w = (int)$size / 3;
+ $bits = $w * 10;
+
+ switch($size - $w * 3) {
+ case 1:
+ $bits += 4;
+ break;
+ case 2:
+ $bits += 7;
+ break;
+ default:
+ break;
+ }
+
+ return $bits;
+ }
+
+ //----------------------------------------------------------------------
+ public static $anTable = array(
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 36, -1, -1, -1, 37, 38, -1, -1, -1, -1, 39, 40, -1, 41, 42, 43,
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 44, -1, -1, -1, -1, -1,
+ -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
+ 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
+ );
+
+ //----------------------------------------------------------------------
+ public static function lookAnTable($c)
+ {
+ return (($c > 127)?-1:self::$anTable[$c]);
+ }
+
+ //----------------------------------------------------------------------
+ public static function checkModeAn($size, $data)
+ {
+ for($i=0; $i<$size; $i++) {
+ if (self::lookAnTable(ord($data[$i])) == -1) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ //----------------------------------------------------------------------
+ public static function estimateBitsModeAn($size)
+ {
+ $w = (int)($size / 2);
+ $bits = $w * 11;
+
+ if($size & 1) {
+ $bits += 6;
+ }
+
+ return $bits;
+ }
+
+ //----------------------------------------------------------------------
+ public static function estimateBitsMode8($size)
+ {
+ return $size * 8;
+ }
+
+ //----------------------------------------------------------------------
+ public function estimateBitsModeKanji($size)
+ {
+ return (int)(($size / 2) * 13);
+ }
+
+ //----------------------------------------------------------------------
+ public static function checkModeKanji($size, $data)
+ {
+ if($size & 1)
+ return false;
+
+ for($i=0; $i<$size; $i+=2) {
+ $val = (ord($data[$i]) << 8) | ord($data[$i+1]);
+ if( $val < 0x8140
+ || ($val > 0x9ffc && $val < 0xe040)
+ || $val > 0xebbf) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ /***********************************************************************
+ * Validation
+ **********************************************************************/
+
+ public static function check($mode, $size, $data)
+ {
+ if($size <= 0)
+ return false;
+
+ switch($mode) {
+ case QR_MODE_NUM: return self::checkModeNum($size, $data); break;
+ case QR_MODE_AN: return self::checkModeAn($size, $data); break;
+ case QR_MODE_KANJI: return self::checkModeKanji($size, $data); break;
+ case QR_MODE_8: return true; break;
+ case QR_MODE_STRUCTURE: return true; break;
+
+ default:
+ break;
+ }
+
+ return false;
+ }
+
+
+ //----------------------------------------------------------------------
+ public function estimateBitStreamSize($version)
+ {
+ $bits = 0;
+
+ foreach($this->items as $item) {
+ $bits += $item->estimateBitStreamSizeOfEntry($version);
+ }
+
+ return $bits;
+ }
+
+ //----------------------------------------------------------------------
+ public function estimateVersion()
+ {
+ $version = 0;
+ $prev = 0;
+ do {
+ $prev = $version;
+ $bits = $this->estimateBitStreamSize($prev);
+ $version = QRspec::getMinimumVersion((int)(($bits + 7) / 8), $this->level);
+ if ($version < 0) {
+ return -1;
+ }
+ } while ($version > $prev);
+
+ return $version;
+ }
+
+ //----------------------------------------------------------------------
+ public static function lengthOfCode($mode, $version, $bits)
+ {
+ $payload = $bits - 4 - QRspec::lengthIndicator($mode, $version);
+ switch($mode) {
+ case QR_MODE_NUM:
+ $chunks = (int)($payload / 10);
+ $remain = $payload - $chunks * 10;
+ $size = $chunks * 3;
+ if($remain >= 7) {
+ $size += 2;
+ } else if($remain >= 4) {
+ $size += 1;
+ }
+ break;
+ case QR_MODE_AN:
+ $chunks = (int)($payload / 11);
+ $remain = $payload - $chunks * 11;
+ $size = $chunks * 2;
+ if($remain >= 6)
+ $size++;
+ break;
+ case QR_MODE_8:
+ $size = (int)($payload / 8);
+ break;
+ case QR_MODE_KANJI:
+ $size = (int)(($payload / 13) * 2);
+ break;
+ case QR_MODE_STRUCTURE:
+ $size = (int)($payload / 8);
+ break;
+ default:
+ $size = 0;
+ break;
+ }
+
+ $maxsize = QRspec::maximumWords($mode, $version);
+ if($size < 0) $size = 0;
+ if($size > $maxsize) $size = $maxsize;
+
+ return $size;
+ }
+
+ //----------------------------------------------------------------------
+ public function createBitStream()
+ {
+ $total = 0;
+
+ foreach($this->items as $item) {
+ $bits = $item->encodeBitStream($this->version);
+
+ if($bits < 0)
+ return -1;
+
+ $total += $bits;
+ }
+
+ return $total;
+ }
+
+ //----------------------------------------------------------------------
+ public function convertData()
+ {
+ $ver = $this->estimateVersion();
+ if($ver > $this->getVersion()) {
+ $this->setVersion($ver);
+ }
+
+ for(;;) {
+ $bits = $this->createBitStream();
+
+ if($bits < 0)
+ return -1;
+
+ $ver = QRspec::getMinimumVersion((int)(($bits + 7) / 8), $this->level);
+ if($ver < 0) {
+ throw new Exception('WRONG VERSION');
+ return -1;
+ } else if($ver > $this->getVersion()) {
+ $this->setVersion($ver);
+ } else {
+ break;
+ }
+ }
+
+ return 0;
+ }
+
+ //----------------------------------------------------------------------
+ public function appendPaddingBit(&$bstream)
+ {
+ $bits = $bstream->size();
+ $maxwords = QRspec::getDataLength($this->version, $this->level);
+ $maxbits = $maxwords * 8;
+
+ if ($maxbits == $bits) {
+ return 0;
+ }
+
+ if ($maxbits - $bits < 5) {
+ return $bstream->appendNum($maxbits - $bits, 0);
+ }
+
+ $bits += 4;
+ $words = (int)(($bits + 7) / 8);
+
+ $padding = new QRbitstream();
+ $ret = $padding->appendNum($words * 8 - $bits + 4, 0);
+
+ if($ret < 0)
+ return $ret;
+
+ $padlen = $maxwords - $words;
+
+ if($padlen > 0) {
+
+ $padbuf = array();
+ for($i=0; $i<$padlen; $i++) {
+ $padbuf[$i] = ($i&1)?0x11:0xec;
+ }
+
+ $ret = $padding->appendBytes($padlen, $padbuf);
+
+ if($ret < 0)
+ return $ret;
+
+ }
+
+ $ret = $bstream->append($padding);
+
+ return $ret;
+ }
+
+ //----------------------------------------------------------------------
+ public function mergeBitStream()
+ {
+ if($this->convertData() < 0) {
+ return null;
+ }
+
+ $bstream = new QRbitstream();
+
+ foreach($this->items as $item) {
+ $ret = $bstream->append($item->bstream);
+ if($ret < 0) {
+ return null;
+ }
+ }
+
+ return $bstream;
+ }
+
+ //----------------------------------------------------------------------
+ public function getBitStream()
+ {
+
+ $bstream = $this->mergeBitStream();
+
+ if($bstream == null) {
+ return null;
+ }
+
+ $ret = $this->appendPaddingBit($bstream);
+ if($ret < 0) {
+ return null;
+ }
+
+ return $bstream;
+ }
+
+ //----------------------------------------------------------------------
+ public function getByteStream()
+ {
+ $bstream = $this->getBitStream();
+ if($bstream == null) {
+ return null;
+ }
+
+ return $bstream->toByte();
+ }
+ }
+
+
+
+
+
+
+//---- qrbitstream.php -----------------------------
+
+
+
+
+/*
+ * PHP QR Code encoder
+ *
+ * Bitstream class
+ *
+ * Based on libqrencode C library distributed under LGPL 2.1
+ * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi <fukuchi@megaui.net>
+ *
+ * PHP QR Code is distributed under LGPL 3
+ * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+ class QRbitstream {
+
+ public $data = array();
+
+ //----------------------------------------------------------------------
+ public function size()
+ {
+ return count($this->data);
+ }
+
+ //----------------------------------------------------------------------
+ public function allocate($setLength)
+ {
+ $this->data = array_fill(0, $setLength, 0);
+ return 0;
+ }
+
+ //----------------------------------------------------------------------
+ public static function newFromNum($bits, $num)
+ {
+ $bstream = new QRbitstream();
+ $bstream->allocate($bits);
+
+ $mask = 1 << ($bits - 1);
+ for($i=0; $i<$bits; $i++) {
+ if($num & $mask) {
+ $bstream->data[$i] = 1;
+ } else {
+ $bstream->data[$i] = 0;
+ }
+ $mask = $mask >> 1;
+ }
+
+ return $bstream;
+ }
+
+ //----------------------------------------------------------------------
+ public static function newFromBytes($size, $data)
+ {
+ $bstream = new QRbitstream();
+ $bstream->allocate($size * 8);
+ $p=0;
+
+ for($i=0; $i<$size; $i++) {
+ $mask = 0x80;
+ for($j=0; $j<8; $j++) {
+ if($data[$i] & $mask) {
+ $bstream->data[$p] = 1;
+ } else {
+ $bstream->data[$p] = 0;
+ }
+ $p++;
+ $mask = $mask >> 1;
+ }
+ }
+
+ return $bstream;
+ }
+
+ //----------------------------------------------------------------------
+ public function append(QRbitstream $arg)
+ {
+ if (is_null($arg)) {
+ return -1;
+ }
+
+ if($arg->size() == 0) {
+ return 0;
+ }
+
+ if($this->size() == 0) {
+ $this->data = $arg->data;
+ return 0;
+ }
+
+ $this->data = array_values(array_merge($this->data, $arg->data));
+
+ return 0;
+ }
+
+ //----------------------------------------------------------------------
+ public function appendNum($bits, $num)
+ {
+ if ($bits == 0)
+ return 0;
+
+ $b = QRbitstream::newFromNum($bits, $num);
+
+ if(is_null($b))
+ return -1;
+
+ $ret = $this->append($b);
+ unset($b);
+
+ return $ret;
+ }
+
+ //----------------------------------------------------------------------
+ public function appendBytes($size, $data)
+ {
+ if ($size == 0)
+ return 0;
+
+ $b = QRbitstream::newFromBytes($size, $data);
+
+ if(is_null($b))
+ return -1;
+
+ $ret = $this->append($b);
+ unset($b);
+
+ return $ret;
+ }
+
+ //----------------------------------------------------------------------
+ public function toByte()
+ {
+
+ $size = $this->size();
+
+ if($size == 0) {
+ return array();
+ }
+
+ $data = array_fill(0, (int)(($size + 7) / 8), 0);
+ $bytes = (int)($size / 8);
+
+ $p = 0;
+
+ for($i=0; $i<$bytes; $i++) {
+ $v = 0;
+ for($j=0; $j<8; $j++) {
+ $v = $v << 1;
+ $v |= $this->data[$p];
+ $p++;
+ }
+ $data[$i] = $v;
+ }
+
+ if($size & 7) {
+ $v = 0;
+ for($j=0; $j<($size & 7); $j++) {
+ $v = $v << 1;
+ $v |= $this->data[$p];
+ $p++;
+ }
+ $data[$bytes] = $v;
+ }
+
+ return $data;
+ }
+
+ }
+
+
+
+
+//---- qrsplit.php -----------------------------
+
+
+
+
+/*
+ * PHP QR Code encoder
+ *
+ * Input splitting classes
+ *
+ * Based on libqrencode C library distributed under LGPL 2.1
+ * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi <fukuchi@megaui.net>
+ *
+ * PHP QR Code is distributed under LGPL 3
+ * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
+ *
+ * The following data / specifications are taken from
+ * "Two dimensional symbol -- QR-code -- Basic Specification" (JIS X0510:2004)
+ * or
+ * "Automatic identification and data capture techniques --
+ * QR Code 2005 bar code symbology specification" (ISO/IEC 18004:2006)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+ class QRsplit {
+
+ public $dataStr = '';
+ public $input;
+ public $modeHint;
+
+ //----------------------------------------------------------------------
+ public function __construct($dataStr, $input, $modeHint)
+ {
+ $this->dataStr = $dataStr;
+ $this->input = $input;
+ $this->modeHint = $modeHint;
+ }
+
+ //----------------------------------------------------------------------
+ public static function isdigitat($str, $pos)
+ {
+ if ($pos >= strlen($str))
+ return false;
+
+ return ((ord($str[$pos]) >= ord('0'))&&(ord($str[$pos]) <= ord('9')));
+ }
+
+ //----------------------------------------------------------------------
+ public static function isalnumat($str, $pos)
+ {
+ if ($pos >= strlen($str))
+ return false;
+
+ return (QRinput::lookAnTable(ord($str[$pos])) >= 0);
+ }
+
+ //----------------------------------------------------------------------
+ public function identifyMode($pos)
+ {
+ if ($pos >= strlen($this->dataStr))
+ return QR_MODE_NUL;
+
+ $c = $this->dataStr[$pos];
+
+ if(self::isdigitat($this->dataStr, $pos)) {
+ return QR_MODE_NUM;
+ } else if(self::isalnumat($this->dataStr, $pos)) {
+ return QR_MODE_AN;
+ } else if($this->modeHint == QR_MODE_KANJI) {
+
+ if ($pos+1 < strlen($this->dataStr))
+ {
+ $d = $this->dataStr[$pos+1];
+ $word = (ord($c) << 8) | ord($d);
+ if(($word >= 0x8140 && $word <= 0x9ffc) || ($word >= 0xe040 && $word <= 0xebbf)) {
+ return QR_MODE_KANJI;
+ }
+ }
+ }
+
+ return QR_MODE_8;
+ }
+
+ //----------------------------------------------------------------------
+ public function eatNum()
+ {
+ $ln = QRspec::lengthIndicator(QR_MODE_NUM, $this->input->getVersion());
+
+ $p = 0;
+ while(self::isdigitat($this->dataStr, $p)) {
+ $p++;
+ }
+
+ $run = $p;
+ $mode = $this->identifyMode($p);
+
+ if($mode == QR_MODE_8) {
+ $dif = QRinput::estimateBitsModeNum($run) + 4 + $ln
+ + QRinput::estimateBitsMode8(1) // + 4 + l8
+ - QRinput::estimateBitsMode8($run + 1); // - 4 - l8
+ if($dif > 0) {
+ return $this->eat8();
+ }
+ }
+ if($mode == QR_MODE_AN) {
+ $dif = QRinput::estimateBitsModeNum($run) + 4 + $ln
+ + QRinput::estimateBitsModeAn(1) // + 4 + la
+ - QRinput::estimateBitsModeAn($run + 1);// - 4 - la
+ if($dif > 0) {
+ return $this->eatAn();
+ }
+ }
+
+ $ret = $this->input->append(QR_MODE_NUM, $run, str_split($this->dataStr));
+ if($ret < 0)
+ return -1;
+
+ return $run;
+ }
+
+ //----------------------------------------------------------------------
+ public function eatAn()
+ {
+ $la = QRspec::lengthIndicator(QR_MODE_AN, $this->input->getVersion());
+ $ln = QRspec::lengthIndicator(QR_MODE_NUM, $this->input->getVersion());
+
+ $p = 0;
+
+ while(self::isalnumat($this->dataStr, $p)) {
+ if(self::isdigitat($this->dataStr, $p)) {
+ $q = $p;
+ while(self::isdigitat($this->dataStr, $q)) {
+ $q++;
+ }
+
+ $dif = QRinput::estimateBitsModeAn($p) // + 4 + la
+ + QRinput::estimateBitsModeNum($q - $p) + 4 + $ln
+ - QRinput::estimateBitsModeAn($q); // - 4 - la
+
+ if($dif < 0) {
+ break;
+ } else {
+ $p = $q;
+ }
+ } else {
+ $p++;
+ }
+ }
+
+ $run = $p;
+
+ if(!self::isalnumat($this->dataStr, $p)) {
+ $dif = QRinput::estimateBitsModeAn($run) + 4 + $la
+ + QRinput::estimateBitsMode8(1) // + 4 + l8
+ - QRinput::estimateBitsMode8($run + 1); // - 4 - l8
+ if($dif > 0) {
+ return $this->eat8();
+ }
+ }
+
+ $ret = $this->input->append(QR_MODE_AN, $run, str_split($this->dataStr));
+ if($ret < 0)
+ return -1;
+
+ return $run;
+ }
+
+ //----------------------------------------------------------------------
+ public function eatKanji()
+ {
+ $p = 0;
+
+ while($this->identifyMode($p) == QR_MODE_KANJI) {
+ $p += 2;
+ }
+
+ $ret = $this->input->append(QR_MODE_KANJI, $p, str_split($this->dataStr));
+ if($ret < 0)
+ return -1;
+
+ return $run;
+ }
+
+ //----------------------------------------------------------------------
+ public function eat8()
+ {
+ $la = QRspec::lengthIndicator(QR_MODE_AN, $this->input->getVersion());
+ $ln = QRspec::lengthIndicator(QR_MODE_NUM, $this->input->getVersion());
+
+ $p = 1;
+ $dataStrLen = strlen($this->dataStr);
+
+ while($p < $dataStrLen) {
+
+ $mode = $this->identifyMode($p);
+ if($mode == QR_MODE_KANJI) {
+ break;
+ }
+ if($mode == QR_MODE_NUM) {
+ $q = $p;
+ while(self::isdigitat($this->dataStr, $q)) {
+ $q++;
+ }
+ $dif = QRinput::estimateBitsMode8($p) // + 4 + l8
+ + QRinput::estimateBitsModeNum($q - $p) + 4 + $ln
+ - QRinput::estimateBitsMode8($q); // - 4 - l8
+ if($dif < 0) {
+ break;
+ } else {
+ $p = $q;
+ }
+ } else if($mode == QR_MODE_AN) {
+ $q = $p;
+ while(self::isalnumat($this->dataStr, $q)) {
+ $q++;
+ }
+ $dif = QRinput::estimateBitsMode8($p) // + 4 + l8
+ + QRinput::estimateBitsModeAn($q - $p) + 4 + $la
+ - QRinput::estimateBitsMode8($q); // - 4 - l8
+ if($dif < 0) {
+ break;
+ } else {
+ $p = $q;
+ }
+ } else {
+ $p++;
+ }
+ }
+
+ $run = $p;
+ $ret = $this->input->append(QR_MODE_8, $run, str_split($this->dataStr));
+
+ if($ret < 0)
+ return -1;
+
+ return $run;
+ }
+
+ //----------------------------------------------------------------------
+ public function splitString()
+ {
+ while (strlen($this->dataStr) > 0)
+ {
+ if($this->dataStr == '')
+ return 0;
+
+ $mode = $this->identifyMode(0);
+
+ switch ($mode) {
+ case QR_MODE_NUM: $length = $this->eatNum(); break;
+ case QR_MODE_AN: $length = $this->eatAn(); break;
+ case QR_MODE_KANJI:
+ if ($hint == QR_MODE_KANJI)
+ $length = $this->eatKanji();
+ else $length = $this->eat8();
+ break;
+ default: $length = $this->eat8(); break;
+
+ }
+
+ if($length == 0) return 0;
+ if($length < 0) return -1;
+
+ $this->dataStr = substr($this->dataStr, $length);
+ }
+ }
+
+ //----------------------------------------------------------------------
+ public function toUpper()
+ {
+ $stringLen = strlen($this->dataStr);
+ $p = 0;
+
+ while ($p<$stringLen) {
+ $mode = self::identifyMode(substr($this->dataStr, $p), $this->modeHint);
+ if($mode == QR_MODE_KANJI) {
+ $p += 2;
+ } else {
+ if (ord($this->dataStr[$p]) >= ord('a') && ord($this->dataStr[$p]) <= ord('z')) {
+ $this->dataStr[$p] = chr(ord($this->dataStr[$p]) - 32);
+ }
+ $p++;
+ }
+ }
+
+ return $this->dataStr;
+ }
+
+ //----------------------------------------------------------------------
+ public static function splitStringToQRinput($string, QRinput $input, $modeHint, $casesensitive = true)
+ {
+ if(is_null($string) || $string == '\0' || $string == '') {
+ throw new Exception('empty string!!!');
+ }
+
+ $split = new QRsplit($string, $input, $modeHint);
+
+ if(!$casesensitive)
+ $split->toUpper();
+
+ return $split->splitString();
+ }
+ }
+
+
+
+//---- qrrscode.php -----------------------------
+
+
+
+
+/*
+ * PHP QR Code encoder
+ *
+ * Reed-Solomon error correction support
+ *
+ * Copyright (C) 2002, 2003, 2004, 2006 Phil Karn, KA9Q
+ * (libfec is released under the GNU Lesser General Public License.)
+ *
+ * Based on libqrencode C library distributed under LGPL 2.1
+ * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi <fukuchi@megaui.net>
+ *
+ * PHP QR Code is distributed under LGPL 3
+ * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+ class QRrsItem {
+
+ public $mm; // Bits per symbol
+ public $nn; // Symbols per block (= (1<<mm)-1)
+ public $alpha_to = array(); // log lookup table
+ public $index_of = array(); // Antilog lookup table
+ public $genpoly = array(); // Generator polynomial
+ public $nroots; // Number of generator roots = number of parity symbols
+ public $fcr; // First consecutive root, index form
+ public $prim; // Primitive element, index form
+ public $iprim; // prim-th root of 1, index form
+ public $pad; // Padding bytes in shortened block
+ public $gfpoly;
+
+ //----------------------------------------------------------------------
+ public function modnn($x)
+ {
+ while ($x >= $this->nn) {
+ $x -= $this->nn;
+ $x = ($x >> $this->mm) + ($x & $this->nn);
+ }
+
+ return $x;
+ }
+
+ //----------------------------------------------------------------------
+ public static function init_rs_char($symsize, $gfpoly, $fcr, $prim, $nroots, $pad)
+ {
+ // Common code for intializing a Reed-Solomon control block (char or int symbols)
+ // Copyright 2004 Phil Karn, KA9Q
+ // May be used under the terms of the GNU Lesser General Public License (LGPL)
+
+ $rs = null;
+
+ // Check parameter ranges
+ if($symsize < 0 || $symsize > 8) return $rs;
+ if($fcr < 0 || $fcr >= (1<<$symsize)) return $rs;
+ if($prim <= 0 || $prim >= (1<<$symsize)) return $rs;
+ if($nroots < 0 || $nroots >= (1<<$symsize)) return $rs; // Can't have more roots than symbol values!
+ if($pad < 0 || $pad >= ((1<<$symsize) -1 - $nroots)) return $rs; // Too much padding
+
+ $rs = new QRrsItem();
+ $rs->mm = $symsize;
+ $rs->nn = (1<<$symsize)-1;
+ $rs->pad = $pad;
+
+ $rs->alpha_to = array_fill(0, $rs->nn+1, 0);
+ $rs->index_of = array_fill(0, $rs->nn+1, 0);
+
+ // PHP style macro replacement ;)
+ $NN =& $rs->nn;
+ $A0 =& $NN;
+
+ // Generate Galois field lookup tables
+ $rs->index_of[0] = $A0; // log(zero) = -inf
+ $rs->alpha_to[$A0] = 0; // alpha**-inf = 0
+ $sr = 1;
+
+ for($i=0; $i<$rs->nn; $i++) {
+ $rs->index_of[$sr] = $i;
+ $rs->alpha_to[$i] = $sr;
+ $sr <<= 1;
+ if($sr & (1<<$symsize)) {
+ $sr ^= $gfpoly;
+ }
+ $sr &= $rs->nn;
+ }
+
+ if($sr != 1){
+ // field generator polynomial is not primitive!
+ $rs = NULL;
+ return $rs;
+ }
+
+ /* Form RS code generator polynomial from its roots */
+ $rs->genpoly = array_fill(0, $nroots+1, 0);
+
+ $rs->fcr = $fcr;
+ $rs->prim = $prim;
+ $rs->nroots = $nroots;
+ $rs->gfpoly = $gfpoly;
+
+ /* Find prim-th root of 1, used in decoding */
+ for($iprim=1;($iprim % $prim) != 0;$iprim += $rs->nn)
+ ; // intentional empty-body loop!
+
+ $rs->iprim = (int)($iprim / $prim);
+ $rs->genpoly[0] = 1;
+
+ for ($i = 0,$root=$fcr*$prim; $i < $nroots; $i++, $root += $prim) {
+ $rs->genpoly[$i+1] = 1;
+
+ // Multiply rs->genpoly[] by @**(root + x)
+ for ($j = $i; $j > 0; $j--) {
+ if ($rs->genpoly[$j] != 0) {
+ $rs->genpoly[$j] = $rs->genpoly[$j-1] ^ $rs->alpha_to[$rs->modnn($rs->index_of[$rs->genpoly[$j]] + $root)];
+ } else {
+ $rs->genpoly[$j] = $rs->genpoly[$j-1];
+ }
+ }
+ // rs->genpoly[0] can never be zero
+ $rs->genpoly[0] = $rs->alpha_to[$rs->modnn($rs->index_of[$rs->genpoly[0]] + $root)];
+ }
+
+ // convert rs->genpoly[] to index form for quicker encoding
+ for ($i = 0; $i <= $nroots; $i++)
+ $rs->genpoly[$i] = $rs->index_of[$rs->genpoly[$i]];
+
+ return $rs;
+ }
+
+ //----------------------------------------------------------------------
+ public function encode_rs_char($data, &$parity)
+ {
+ $MM =& $this->mm;
+ $NN =& $this->nn;
+ $ALPHA_TO =& $this->alpha_to;
+ $INDEX_OF =& $this->index_of;
+ $GENPOLY =& $this->genpoly;
+ $NROOTS =& $this->nroots;
+ $FCR =& $this->fcr;
+ $PRIM =& $this->prim;
+ $IPRIM =& $this->iprim;
+ $PAD =& $this->pad;
+ $A0 =& $NN;
+
+ $parity = array_fill(0, $NROOTS, 0);
+
+ for($i=0; $i< ($NN-$NROOTS-$PAD); $i++) {
+
+ $feedback = $INDEX_OF[$data[$i] ^ $parity[0]];
+ if($feedback != $A0) {
+ // feedback term is non-zero
+
+ // This line is unnecessary when GENPOLY[NROOTS] is unity, as it must
+ // always be for the polynomials constructed by init_rs()
+ $feedback = $this->modnn($NN - $GENPOLY[$NROOTS] + $feedback);
+
+ for($j=1;$j<$NROOTS;$j++) {
+ $parity[$j] ^= $ALPHA_TO[$this->modnn($feedback + $GENPOLY[$NROOTS-$j])];
+ }
+ }
+
+ // Shift
+ array_shift($parity);
+ if($feedback != $A0) {
+ array_push($parity, $ALPHA_TO[$this->modnn($feedback + $GENPOLY[0])]);
+ } else {
+ array_push($parity, 0);
+ }
+ }
+ }
+ }
+
+ //##########################################################################
+
+ class QRrs {
+
+ public static $items = array();
+
+ //----------------------------------------------------------------------
+ public static function init_rs($symsize, $gfpoly, $fcr, $prim, $nroots, $pad)
+ {
+ foreach(self::$items as $rs) {
+ if($rs->pad != $pad) continue;
+ if($rs->nroots != $nroots) continue;
+ if($rs->mm != $symsize) continue;
+ if($rs->gfpoly != $gfpoly) continue;
+ if($rs->fcr != $fcr) continue;
+ if($rs->prim != $prim) continue;
+
+ return $rs;
+ }
+
+ $rs = QRrsItem::init_rs_char($symsize, $gfpoly, $fcr, $prim, $nroots, $pad);
+ array_unshift(self::$items, $rs);
+
+ return $rs;
+ }
+ }
+
+
+
+//---- qrmask.php -----------------------------
+
+
+
+
+/*
+ * PHP QR Code encoder
+ *
+ * Masking
+ *
+ * Based on libqrencode C library distributed under LGPL 2.1
+ * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi <fukuchi@megaui.net>
+ *
+ * PHP QR Code is distributed under LGPL 3
+ * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+ define('N1', 3);
+ define('N2', 3);
+ define('N3', 40);
+ define('N4', 10);
+
+ class QRmask {
+
+ public $runLength = array();
+
+ //----------------------------------------------------------------------
+ public function __construct()
+ {
+ $this->runLength = array_fill(0, QRSPEC_WIDTH_MAX + 1, 0);
+ }
+
+ //----------------------------------------------------------------------
+ public function writeFormatInformation($width, &$frame, $mask, $level)
+ {
+ $blacks = 0;
+ $format = QRspec::getFormatInfo($mask, $level);
+
+ for($i=0; $i<8; $i++) {
+ if($format & 1) {
+ $blacks += 2;
+ $v = 0x85;
+ } else {
+ $v = 0x84;
+ }
+
+ $frame[8][$width - 1 - $i] = chr($v);
+ if($i < 6) {
+ $frame[$i][8] = chr($v);
+ } else {
+ $frame[$i + 1][8] = chr($v);
+ }
+ $format = $format >> 1;
+ }
+
+ for($i=0; $i<7; $i++) {
+ if($format & 1) {
+ $blacks += 2;
+ $v = 0x85;
+ } else {
+ $v = 0x84;
+ }
+
+ $frame[$width - 7 + $i][8] = chr($v);
+ if($i == 0) {
+ $frame[8][7] = chr($v);
+ } else {
+ $frame[8][6 - $i] = chr($v);
+ }
+
+ $format = $format >> 1;
+ }
+
+ return $blacks;
+ }
+
+ //----------------------------------------------------------------------
+ public function mask0($x, $y) { return ($x+$y)&1; }
+ public function mask1($x, $y) { return ($y&1); }
+ public function mask2($x, $y) { return ($x%3); }
+ public function mask3($x, $y) { return ($x+$y)%3; }
+ public function mask4($x, $y) { return (((int)($y/2))+((int)($x/3)))&1; }
+ public function mask5($x, $y) { return (($x*$y)&1)+($x*$y)%3; }
+ public function mask6($x, $y) { return ((($x*$y)&1)+($x*$y)%3)&1; }
+ public function mask7($x, $y) { return ((($x*$y)%3)+(($x+$y)&1))&1; }
+
+ //----------------------------------------------------------------------
+ private function generateMaskNo($maskNo, $width, $frame)
+ {
+ $bitMask = array_fill(0, $width, array_fill(0, $width, 0));
+
+ for($y=0; $y<$width; $y++) {
+ for($x=0; $x<$width; $x++) {
+ if(ord($frame[$y][$x]) & 0x80) {
+ $bitMask[$y][$x] = 0;
+ } else {
+ $maskFunc = call_user_func(array($this, 'mask'.$maskNo), $x, $y);
+ $bitMask[$y][$x] = ($maskFunc == 0)?1:0;
+ }
+
+ }
+ }
+
+ return $bitMask;
+ }
+
+ //----------------------------------------------------------------------
+ public static function serial($bitFrame)
+ {
+ $codeArr = array();
+
+ foreach ($bitFrame as $line)
+ $codeArr[] = join('', $line);
+
+ return gzcompress(join("\n", $codeArr), 9);
+ }
+
+ //----------------------------------------------------------------------
+ public static function unserial($code)
+ {
+ $codeArr = array();
+
+ $codeLines = explode("\n", gzuncompress($code));
+ foreach ($codeLines as $line)
+ $codeArr[] = str_split($line);
+
+ return $codeArr;
+ }
+
+ //----------------------------------------------------------------------
+ public function makeMaskNo($maskNo, $width, $s, &$d, $maskGenOnly = false)
+ {
+ $b = 0;
+ $bitMask = array();
+
+ $fileName = QR_CACHE_DIR.'mask_'.$maskNo.DIRECTORY_SEPARATOR.'mask_'.$width.'_'.$maskNo.'.dat';
+
+ if (QR_CACHEABLE) {
+ if (file_exists($fileName)) {
+ $bitMask = self::unserial(file_get_contents($fileName));
+ } else {
+ $bitMask = $this->generateMaskNo($maskNo, $width, $s, $d);
+ if (!file_exists(QR_CACHE_DIR.'mask_'.$maskNo))
+ mkdir(QR_CACHE_DIR.'mask_'.$maskNo);
+ file_put_contents($fileName, self::serial($bitMask));
+ }
+ } else {
+ $bitMask = $this->generateMaskNo($maskNo, $width, $s, $d);
+ }
+
+ if ($maskGenOnly)
+ return;
+
+ $d = $s;
+
+ for($y=0; $y<$width; $y++) {
+ for($x=0; $x<$width; $x++) {
+ if($bitMask[$y][$x] == 1) {
+ $d[$y][$x] = chr(ord($s[$y][$x]) ^ (int)$bitMask[$y][$x]);
+ }
+ $b += (int)(ord($d[$y][$x]) & 1);
+ }
+ }
+
+ return $b;
+ }
+
+ //----------------------------------------------------------------------
+ public function makeMask($width, $frame, $maskNo, $level)
+ {
+ $masked = array_fill(0, $width, str_repeat("\0", $width));
+ $this->makeMaskNo($maskNo, $width, $frame, $masked);
+ $this->writeFormatInformation($width, $masked, $maskNo, $level);
+
+ return $masked;
+ }
+
+ //----------------------------------------------------------------------
+ public function calcN1N3($length)
+ {
+ $demerit = 0;
+
+ for($i=0; $i<$length; $i++) {
+
+ if($this->runLength[$i] >= 5) {
+ $demerit += (N1 + ($this->runLength[$i] - 5));
+ }
+ if($i & 1) {
+ if(($i >= 3) && ($i < ($length-2)) && ($this->runLength[$i] % 3 == 0)) {
+ $fact = (int)($this->runLength[$i] / 3);
+ if(($this->runLength[$i-2] == $fact) &&
+ ($this->runLength[$i-1] == $fact) &&
+ ($this->runLength[$i+1] == $fact) &&
+ ($this->runLength[$i+2] == $fact)) {
+ if(($this->runLength[$i-3] < 0) || ($this->runLength[$i-3] >= (4 * $fact))) {
+ $demerit += N3;
+ } else if((($i+3) >= $length) || ($this->runLength[$i+3] >= (4 * $fact))) {
+ $demerit += N3;
+ }
+ }
+ }
+ }
+ }
+ return $demerit;
+ }
+
+ //----------------------------------------------------------------------
+ public function evaluateSymbol($width, $frame)
+ {
+ $head = 0;
+ $demerit = 0;
+
+ for($y=0; $y<$width; $y++) {
+ $head = 0;
+ $this->runLength[0] = 1;
+
+ $frameY = $frame[$y];
+
+ if ($y>0)
+ $frameYM = $frame[$y-1];
+
+ for($x=0; $x<$width; $x++) {
+ if(($x > 0) && ($y > 0)) {
+ $b22 = ord($frameY[$x]) & ord($frameY[$x-1]) & ord($frameYM[$x]) & ord($frameYM[$x-1]);
+ $w22 = ord($frameY[$x]) | ord($frameY[$x-1]) | ord($frameYM[$x]) | ord($frameYM[$x-1]);
+
+ if(($b22 | ($w22 ^ 1))&1) {
+ $demerit += N2;
+ }
+ }
+ if(($x == 0) && (ord($frameY[$x]) & 1)) {
+ $this->runLength[0] = -1;
+ $head = 1;
+ $this->runLength[$head] = 1;
+ } else if($x > 0) {
+ if((ord($frameY[$x]) ^ ord($frameY[$x-1])) & 1) {
+ $head++;
+ $this->runLength[$head] = 1;
+ } else {
+ $this->runLength[$head]++;
+ }
+ }
+ }
+
+ $demerit += $this->calcN1N3($head+1);
+ }
+
+ for($x=0; $x<$width; $x++) {
+ $head = 0;
+ $this->runLength[0] = 1;
+
+ for($y=0; $y<$width; $y++) {
+ if($y == 0 && (ord($frame[$y][$x]) & 1)) {
+ $this->runLength[0] = -1;
+ $head = 1;
+ $this->runLength[$head] = 1;
+ } else if($y > 0) {
+ if((ord($frame[$y][$x]) ^ ord($frame[$y-1][$x])) & 1) {
+ $head++;
+ $this->runLength[$head] = 1;
+ } else {
+ $this->runLength[$head]++;
+ }
+ }
+ }
+
+ $demerit += $this->calcN1N3($head+1);
+ }
+
+ return $demerit;
+ }
+
+
+ //----------------------------------------------------------------------
+ public function mask($width, $frame, $level)
+ {
+ $minDemerit = PHP_INT_MAX;
+ $bestMaskNum = 0;
+ $bestMask = array();
+
+ $checked_masks = array(0,1,2,3,4,5,6,7);
+
+ if (QR_FIND_FROM_RANDOM !== false) {
+
+ $howManuOut = 8-(QR_FIND_FROM_RANDOM % 9);
+ for ($i = 0; $i < $howManuOut; $i++) {
+ $remPos = rand (0, count($checked_masks)-1);
+ unset($checked_masks[$remPos]);
+ $checked_masks = array_values($checked_masks);
+ }
+
+ }
+
+ $bestMask = $frame;
+
+ foreach($checked_masks as $i) {
+ $mask = array_fill(0, $width, str_repeat("\0", $width));
+
+ $demerit = 0;
+ $blacks = 0;
+ $blacks = $this->makeMaskNo($i, $width, $frame, $mask);
+ $blacks += $this->writeFormatInformation($width, $mask, $i, $level);
+ $blacks = (int)(100 * $blacks / ($width * $width));
+ $demerit = (int)((int)(abs($blacks - 50) / 5) * N4);
+ $demerit += $this->evaluateSymbol($width, $mask);
+
+ if($demerit < $minDemerit) {
+ $minDemerit = $demerit;
+ $bestMask = $mask;
+ $bestMaskNum = $i;
+ }
+ }
+
+ return $bestMask;
+ }
+
+ //----------------------------------------------------------------------
+ }
+
+
+
+
+//---- qrencode.php -----------------------------
+
+
+
+
+/*
+ * PHP QR Code encoder
+ *
+ * Main encoder classes.
+ *
+ * Based on libqrencode C library distributed under LGPL 2.1
+ * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi <fukuchi@megaui.net>
+ *
+ * PHP QR Code is distributed under LGPL 3
+ * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+ class QRrsblock {
+ public $dataLength;
+ public $data = array();
+ public $eccLength;
+ public $ecc = array();
+
+ public function __construct($dl, $data, $el, &$ecc, QRrsItem $rs)
+ {
+ $rs->encode_rs_char($data, $ecc);
+
+ $this->dataLength = $dl;
+ $this->data = $data;
+ $this->eccLength = $el;
+ $this->ecc = $ecc;
+ }
+ };
+
+ //##########################################################################
+
+ class QRrawcode {
+ public $version;
+ public $datacode = array();
+ public $ecccode = array();
+ public $blocks;
+ public $rsblocks = array(); //of RSblock
+ public $count;
+ public $dataLength;
+ public $eccLength;
+ public $b1;
+
+ //----------------------------------------------------------------------
+ public function __construct(QRinput $input)
+ {
+ $spec = array(0,0,0,0,0);
+
+ $this->datacode = $input->getByteStream();
+ if(is_null($this->datacode)) {
+ throw new Exception('null imput string');
+ }
+
+ QRspec::getEccSpec($input->getVersion(), $input->getErrorCorrectionLevel(), $spec);
+
+ $this->version = $input->getVersion();
+ $this->b1 = QRspec::rsBlockNum1($spec);
+ $this->dataLength = QRspec::rsDataLength($spec);
+ $this->eccLength = QRspec::rsEccLength($spec);
+ $this->ecccode = array_fill(0, $this->eccLength, 0);
+ $this->blocks = QRspec::rsBlockNum($spec);
+
+ $ret = $this->init($spec);
+ if($ret < 0) {
+ throw new Exception('block alloc error');
+ return null;
+ }
+
+ $this->count = 0;
+ }
+
+ //----------------------------------------------------------------------
+ public function init(array $spec)
+ {
+ $dl = QRspec::rsDataCodes1($spec);
+ $el = QRspec::rsEccCodes1($spec);
+ $rs = QRrs::init_rs(8, 0x11d, 0, 1, $el, 255 - $dl - $el);
+
+
+ $blockNo = 0;
+ $dataPos = 0;
+ $eccPos = 0;
+ for($i=0; $i<QRspec::rsBlockNum1($spec); $i++) {
+ $ecc = array_slice($this->ecccode,$eccPos);
+ $this->rsblocks[$blockNo] = new QRrsblock($dl, array_slice($this->datacode, $dataPos), $el, $ecc, $rs);
+ $this->ecccode = array_merge(array_slice($this->ecccode,0, $eccPos), $ecc);
+
+ $dataPos += $dl;
+ $eccPos += $el;
+ $blockNo++;
+ }
+
+ if(QRspec::rsBlockNum2($spec) == 0)
+ return 0;
+
+ $dl = QRspec::rsDataCodes2($spec);
+ $el = QRspec::rsEccCodes2($spec);
+ $rs = QRrs::init_rs(8, 0x11d, 0, 1, $el, 255 - $dl - $el);
+
+ if($rs == NULL) return -1;
+
+ for($i=0; $i<QRspec::rsBlockNum2($spec); $i++) {
+ $ecc = array_slice($this->ecccode,$eccPos);
+ $this->rsblocks[$blockNo] = new QRrsblock($dl, array_slice($this->datacode, $dataPos), $el, $ecc, $rs);
+ $this->ecccode = array_merge(array_slice($this->ecccode,0, $eccPos), $ecc);
+
+ $dataPos += $dl;
+ $eccPos += $el;
+ $blockNo++;
+ }
+
+ return 0;
+ }
+
+ //----------------------------------------------------------------------
+ public function getCode()
+ {
+ $ret;
+
+ if($this->count < $this->dataLength) {
+ $row = $this->count % $this->blocks;
+ $col = $this->count / $this->blocks;
+ if($col >= $this->rsblocks[0]->dataLength) {
+ $row += $this->b1;
+ }
+ $ret = $this->rsblocks[$row]->data[$col];
+ } else if($this->count < $this->dataLength + $this->eccLength) {
+ $row = ($this->count - $this->dataLength) % $this->blocks;
+ $col = ($this->count - $this->dataLength) / $this->blocks;
+ $ret = $this->rsblocks[$row]->ecc[$col];
+ } else {
+ return 0;
+ }
+ $this->count++;
+
+ return $ret;
+ }
+ }
+
+ //##########################################################################
+
+ class QRcode {
+
+ public $version;
+ public $width;
+ public $data;
+
+ //----------------------------------------------------------------------
+ public function encodeMask(QRinput $input, $mask)
+ {
+ if($input->getVersion() < 0 || $input->getVersion() > QRSPEC_VERSION_MAX) {
+ throw new Exception('wrong version');
+ }
+ if($input->getErrorCorrectionLevel() > QR_ECLEVEL_H) {
+ throw new Exception('wrong level');
+ }
+
+ $raw = new QRrawcode($input);
+
+ QRtools::markTime('after_raw');
+
+ $version = $raw->version;
+ $width = QRspec::getWidth($version);
+ $frame = QRspec::newFrame($version);
+
+ $filler = new FrameFiller($width, $frame);
+ if(is_null($filler)) {
+ return NULL;
+ }
+
+ // inteleaved data and ecc codes
+ for($i=0; $i<$raw->dataLength + $raw->eccLength; $i++) {
+ $code = $raw->getCode();
+ $bit = 0x80;
+ for($j=0; $j<8; $j++) {
+ $addr = $filler->next();
+ $filler->setFrameAt($addr, 0x02 | (($bit & $code) != 0));
+ $bit = $bit >> 1;
+ }
+ }
+
+ QRtools::markTime('after_filler');
+
+ unset($raw);
+
+ // remainder bits
+ $j = QRspec::getRemainder($version);
+ for($i=0; $i<$j; $i++) {
+ $addr = $filler->next();
+ $filler->setFrameAt($addr, 0x02);
+ }
+
+ $frame = $filler->frame;
+ unset($filler);
+
+
+ // masking
+ $maskObj = new QRmask();
+ if($mask < 0) {
+
+ if (QR_FIND_BEST_MASK) {
+ $masked = $maskObj->mask($width, $frame, $input->getErrorCorrectionLevel());
+ } else {
+ $masked = $maskObj->makeMask($width, $frame, (intval(QR_DEFAULT_MASK) % 8), $input->getErrorCorrectionLevel());
+ }
+ } else {
+ $masked = $maskObj->makeMask($width, $frame, $mask, $input->getErrorCorrectionLevel());
+ }
+
+ if($masked == NULL) {
+ return NULL;
+ }
+
+ QRtools::markTime('after_mask');
+
+ $this->version = $version;
+ $this->width = $width;
+ $this->data = $masked;
+
+ return $this;
+ }
+
+ //----------------------------------------------------------------------
+ public function encodeInput(QRinput $input)
+ {
+ return $this->encodeMask($input, -1);
+ }
+
+ //----------------------------------------------------------------------
+ public function encodeString8bit($string, $version, $level)
+ {
+ if(string == NULL) {
+ throw new Exception('empty string!');
+ return NULL;
+ }
+
+ $input = new QRinput($version, $level);
+ if($input == NULL) return NULL;
+
+ $ret = $input->append($input, QR_MODE_8, strlen($string), str_split($string));
+ if($ret < 0) {
+ unset($input);
+ return NULL;
+ }
+ return $this->encodeInput($input);
+ }
+
+ //----------------------------------------------------------------------
+ public function encodeString($string, $version, $level, $hint, $casesensitive)
+ {
+
+ if($hint != QR_MODE_8 && $hint != QR_MODE_KANJI) {
+ throw new Exception('bad hint');
+ return NULL;
+ }
+
+ $input = new QRinput($version, $level);
+ if($input == NULL) return NULL;
+
+ $ret = QRsplit::splitStringToQRinput($string, $input, $hint, $casesensitive);
+ if($ret < 0) {
+ return NULL;
+ }
+
+ return $this->encodeInput($input);
+ }
+
+ //----------------------------------------------------------------------
+ public static function png($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4, $saveandprint=false)
+ {
+ $enc = QRencode::factory($level, $size, $margin);
+ return $enc->encodePNG($text, $outfile, $saveandprint=false);
+ }
+
+ //----------------------------------------------------------------------
+ public static function text($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4)
+ {
+ $enc = QRencode::factory($level, $size, $margin);
+ return $enc->encode($text, $outfile);
+ }
+
+ //----------------------------------------------------------------------
+ public static function raw($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4)
+ {
+ $enc = QRencode::factory($level, $size, $margin);
+ return $enc->encodeRAW($text, $outfile);
+ }
+ }
+
+ //##########################################################################
+
+ class FrameFiller {
+
+ public $width;
+ public $frame;
+ public $x;
+ public $y;
+ public $dir;
+ public $bit;
+
+ //----------------------------------------------------------------------
+ public function __construct($width, &$frame)
+ {
+ $this->width = $width;
+ $this->frame = $frame;
+ $this->x = $width - 1;
+ $this->y = $width - 1;
+ $this->dir = -1;
+ $this->bit = -1;
+ }
+
+ //----------------------------------------------------------------------
+ public function setFrameAt($at, $val)
+ {
+ $this->frame[$at['y']][$at['x']] = chr($val);
+ }
+
+ //----------------------------------------------------------------------
+ public function getFrameAt($at)
+ {
+ return ord($this->frame[$at['y']][$at['x']]);
+ }
+
+ //----------------------------------------------------------------------
+ public function next()
+ {
+ do {
+
+ if($this->bit == -1) {
+ $this->bit = 0;
+ return array('x'=>$this->x, 'y'=>$this->y);
+ }
+
+ $x = $this->x;
+ $y = $this->y;
+ $w = $this->width;
+
+ if($this->bit == 0) {
+ $x--;
+ $this->bit++;
+ } else {
+ $x++;
+ $y += $this->dir;
+ $this->bit--;
+ }
+
+ if($this->dir < 0) {
+ if($y < 0) {
+ $y = 0;
+ $x -= 2;
+ $this->dir = 1;
+ if($x == 6) {
+ $x--;
+ $y = 9;
+ }
+ }
+ } else {
+ if($y == $w) {
+ $y = $w - 1;
+ $x -= 2;
+ $this->dir = -1;
+ if($x == 6) {
+ $x--;
+ $y -= 8;
+ }
+ }
+ }
+ if($x < 0 || $y < 0) return null;
+
+ $this->x = $x;
+ $this->y = $y;
+
+ } while(ord($this->frame[$y][$x]) & 0x80);
+
+ return array('x'=>$x, 'y'=>$y);
+ }
+
+ } ;
+
+ //##########################################################################
+
+ class QRencode {
+
+ public $casesensitive = true;
+ public $eightbit = false;
+
+ public $version = 0;
+ public $size = 3;
+ public $margin = 4;
+
+ public $structured = 0; // not supported yet
+
+ public $level = QR_ECLEVEL_L;
+ public $hint = QR_MODE_8;
+
+ //----------------------------------------------------------------------
+ public static function factory($level = QR_ECLEVEL_L, $size = 3, $margin = 4)
+ {
+ $enc = new QRencode();
+ $enc->size = $size;
+ $enc->margin = $margin;
+
+ switch ($level.'') {
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ $enc->level = $level;
+ break;
+ case 'l':
+ case 'L':
+ $enc->level = QR_ECLEVEL_L;
+ break;
+ case 'm':
+ case 'M':
+ $enc->level = QR_ECLEVEL_M;
+ break;
+ case 'q':
+ case 'Q':
+ $enc->level = QR_ECLEVEL_Q;
+ break;
+ case 'h':
+ case 'H':
+ $enc->level = QR_ECLEVEL_H;
+ break;
+ }
+
+ return $enc;
+ }
+
+ //----------------------------------------------------------------------
+ public function encodeRAW($intext, $outfile = false)
+ {
+ $code = new QRcode();
+
+ if($this->eightbit) {
+ $code->encodeString8bit($intext, $this->version, $this->level);
+ } else {
+ $code->encodeString($intext, $this->version, $this->level, $this->hint, $this->casesensitive);
+ }
+
+ return $code->data;
+ }
+
+ //----------------------------------------------------------------------
+ public function encode($intext, $outfile = false)
+ {
+ $code = new QRcode();
+
+ if($this->eightbit) {
+ $code->encodeString8bit($intext, $this->version, $this->level);
+ } else {
+ $code->encodeString($intext, $this->version, $this->level, $this->hint, $this->casesensitive);
+ }
+
+ QRtools::markTime('after_encode');
+
+ if ($outfile!== false) {
+ file_put_contents($outfile, join("\n", QRtools::binarize($code->data)));
+ } else {
+ return QRtools::binarize($code->data);
+ }
+ }
+
+ //----------------------------------------------------------------------
+ public function encodePNG($intext, $outfile = false,$saveandprint=false)
+ {
+ try {
+
+ ob_start();
+ $tab = $this->encode($intext);
+ $err = ob_get_contents();
+ ob_end_clean();
+
+ if ($err != '')
+ QRtools::log($outfile, $err);
+
+ $maxSize = (int)(QR_PNG_MAXIMUM_SIZE / (count($tab)+2*$this->margin));
+
+ QRimage::png($tab, $outfile, min(max(1, $this->size), $maxSize), $this->margin,$saveandprint);
+
+ } catch (Exception $e) {
+
+ QRtools::log($outfile, $e->getMessage());
+
+ }
+ }
+ }
+
+
diff --git a/library/phpqrcode/qrbitstream.php b/library/phpqrcode/qrbitstream.php
new file mode 100644
index 000000000..7d4ec4a6c
--- /dev/null
+++ b/library/phpqrcode/qrbitstream.php
@@ -0,0 +1,180 @@
+<?php
+/*
+ * PHP QR Code encoder
+ *
+ * Bitstream class
+ *
+ * Based on libqrencode C library distributed under LGPL 2.1
+ * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi <fukuchi@megaui.net>
+ *
+ * PHP QR Code is distributed under LGPL 3
+ * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+ class QRbitstream {
+
+ public $data = array();
+
+ //----------------------------------------------------------------------
+ public function size()
+ {
+ return count($this->data);
+ }
+
+ //----------------------------------------------------------------------
+ public function allocate($setLength)
+ {
+ $this->data = array_fill(0, $setLength, 0);
+ return 0;
+ }
+
+ //----------------------------------------------------------------------
+ public static function newFromNum($bits, $num)
+ {
+ $bstream = new QRbitstream();
+ $bstream->allocate($bits);
+
+ $mask = 1 << ($bits - 1);
+ for($i=0; $i<$bits; $i++) {
+ if($num & $mask) {
+ $bstream->data[$i] = 1;
+ } else {
+ $bstream->data[$i] = 0;
+ }
+ $mask = $mask >> 1;
+ }
+
+ return $bstream;
+ }
+
+ //----------------------------------------------------------------------
+ public static function newFromBytes($size, $data)
+ {
+ $bstream = new QRbitstream();
+ $bstream->allocate($size * 8);
+ $p=0;
+
+ for($i=0; $i<$size; $i++) {
+ $mask = 0x80;
+ for($j=0; $j<8; $j++) {
+ if($data[$i] & $mask) {
+ $bstream->data[$p] = 1;
+ } else {
+ $bstream->data[$p] = 0;
+ }
+ $p++;
+ $mask = $mask >> 1;
+ }
+ }
+
+ return $bstream;
+ }
+
+ //----------------------------------------------------------------------
+ public function append(QRbitstream $arg)
+ {
+ if (is_null($arg)) {
+ return -1;
+ }
+
+ if($arg->size() == 0) {
+ return 0;
+ }
+
+ if($this->size() == 0) {
+ $this->data = $arg->data;
+ return 0;
+ }
+
+ $this->data = array_values(array_merge($this->data, $arg->data));
+
+ return 0;
+ }
+
+ //----------------------------------------------------------------------
+ public function appendNum($bits, $num)
+ {
+ if ($bits == 0)
+ return 0;
+
+ $b = QRbitstream::newFromNum($bits, $num);
+
+ if(is_null($b))
+ return -1;
+
+ $ret = $this->append($b);
+ unset($b);
+
+ return $ret;
+ }
+
+ //----------------------------------------------------------------------
+ public function appendBytes($size, $data)
+ {
+ if ($size == 0)
+ return 0;
+
+ $b = QRbitstream::newFromBytes($size, $data);
+
+ if(is_null($b))
+ return -1;
+
+ $ret = $this->append($b);
+ unset($b);
+
+ return $ret;
+ }
+
+ //----------------------------------------------------------------------
+ public function toByte()
+ {
+
+ $size = $this->size();
+
+ if($size == 0) {
+ return array();
+ }
+
+ $data = array_fill(0, (int)(($size + 7) / 8), 0);
+ $bytes = (int)($size / 8);
+
+ $p = 0;
+
+ for($i=0; $i<$bytes; $i++) {
+ $v = 0;
+ for($j=0; $j<8; $j++) {
+ $v = $v << 1;
+ $v |= $this->data[$p];
+ $p++;
+ }
+ $data[$i] = $v;
+ }
+
+ if($size & 7) {
+ $v = 0;
+ for($j=0; $j<($size & 7); $j++) {
+ $v = $v << 1;
+ $v |= $this->data[$p];
+ $p++;
+ }
+ $data[$bytes] = $v;
+ }
+
+ return $data;
+ }
+
+ }
diff --git a/library/phpqrcode/qrconfig.php b/library/phpqrcode/qrconfig.php
new file mode 100644
index 000000000..e53dff8c2
--- /dev/null
+++ b/library/phpqrcode/qrconfig.php
@@ -0,0 +1,17 @@
+<?php
+/*
+ * PHP QR Code encoder
+ *
+ * Config file, feel free to modify
+ */
+
+ define('QR_CACHEABLE', true); // use cache - more disk reads but less CPU power, masks and format templates are stored there
+ define('QR_CACHE_DIR', dirname(__FILE__).DIRECTORY_SEPARATOR.'cache'.DIRECTORY_SEPARATOR); // used when QR_CACHEABLE === true
+ define('QR_LOG_DIR', dirname(__FILE__).DIRECTORY_SEPARATOR); // default error logs dir
+
+ define('QR_FIND_BEST_MASK', true); // if true, estimates best mask (spec. default, but extremally slow; set to false to significant performance boost but (propably) worst quality code
+ define('QR_FIND_FROM_RANDOM', false); // if false, checks all masks available, otherwise value tells count of masks need to be checked, mask id are got randomly
+ define('QR_DEFAULT_MASK', 2); // when QR_FIND_BEST_MASK === false
+
+ define('QR_PNG_MAXIMUM_SIZE', 1024); // maximum allowed png image width (in pixels), tune to make sure GD and PHP can handle such big images
+ \ No newline at end of file
diff --git a/library/phpqrcode/qrconst.php b/library/phpqrcode/qrconst.php
new file mode 100644
index 000000000..9fac9fdc1
--- /dev/null
+++ b/library/phpqrcode/qrconst.php
@@ -0,0 +1,54 @@
+<?php
+
+/*
+ * PHP QR Code encoder
+ *
+ * Common constants
+ *
+ * Based on libqrencode C library distributed under LGPL 2.1
+ * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi <fukuchi@megaui.net>
+ *
+ * PHP QR Code is distributed under LGPL 3
+ * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+ // Encoding modes
+
+ define('QR_MODE_NUL', -1);
+ define('QR_MODE_NUM', 0);
+ define('QR_MODE_AN', 1);
+ define('QR_MODE_8', 2);
+ define('QR_MODE_KANJI', 3);
+ define('QR_MODE_STRUCTURE', 4);
+
+ // Levels of error correction.
+
+ define('QR_ECLEVEL_L', 0);
+ define('QR_ECLEVEL_M', 1);
+ define('QR_ECLEVEL_Q', 2);
+ define('QR_ECLEVEL_H', 3);
+
+ // Supported output formats
+
+ define('QR_FORMAT_TEXT', 0);
+ define('QR_FORMAT_PNG', 1);
+
+ class qrstr {
+ public static function set(&$srctab, $x, $y, $repl, $replLen = false) {
+ $srctab[$y] = substr_replace($srctab[$y], ($replLen !== false)?substr($repl,0,$replLen):$repl, $x, ($replLen !== false)?$replLen:strlen($repl));
+ }
+ } \ No newline at end of file
diff --git a/library/phpqrcode/qrencode.php b/library/phpqrcode/qrencode.php
new file mode 100644
index 000000000..4b77a5bdd
--- /dev/null
+++ b/library/phpqrcode/qrencode.php
@@ -0,0 +1,502 @@
+<?php
+/*
+ * PHP QR Code encoder
+ *
+ * Main encoder classes.
+ *
+ * Based on libqrencode C library distributed under LGPL 2.1
+ * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi <fukuchi@megaui.net>
+ *
+ * PHP QR Code is distributed under LGPL 3
+ * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+ class QRrsblock {
+ public $dataLength;
+ public $data = array();
+ public $eccLength;
+ public $ecc = array();
+
+ public function __construct($dl, $data, $el, &$ecc, QRrsItem $rs)
+ {
+ $rs->encode_rs_char($data, $ecc);
+
+ $this->dataLength = $dl;
+ $this->data = $data;
+ $this->eccLength = $el;
+ $this->ecc = $ecc;
+ }
+ };
+
+ //##########################################################################
+
+ class QRrawcode {
+ public $version;
+ public $datacode = array();
+ public $ecccode = array();
+ public $blocks;
+ public $rsblocks = array(); //of RSblock
+ public $count;
+ public $dataLength;
+ public $eccLength;
+ public $b1;
+
+ //----------------------------------------------------------------------
+ public function __construct(QRinput $input)
+ {
+ $spec = array(0,0,0,0,0);
+
+ $this->datacode = $input->getByteStream();
+ if(is_null($this->datacode)) {
+ throw new Exception('null imput string');
+ }
+
+ QRspec::getEccSpec($input->getVersion(), $input->getErrorCorrectionLevel(), $spec);
+
+ $this->version = $input->getVersion();
+ $this->b1 = QRspec::rsBlockNum1($spec);
+ $this->dataLength = QRspec::rsDataLength($spec);
+ $this->eccLength = QRspec::rsEccLength($spec);
+ $this->ecccode = array_fill(0, $this->eccLength, 0);
+ $this->blocks = QRspec::rsBlockNum($spec);
+
+ $ret = $this->init($spec);
+ if($ret < 0) {
+ throw new Exception('block alloc error');
+ return null;
+ }
+
+ $this->count = 0;
+ }
+
+ //----------------------------------------------------------------------
+ public function init(array $spec)
+ {
+ $dl = QRspec::rsDataCodes1($spec);
+ $el = QRspec::rsEccCodes1($spec);
+ $rs = QRrs::init_rs(8, 0x11d, 0, 1, $el, 255 - $dl - $el);
+
+
+ $blockNo = 0;
+ $dataPos = 0;
+ $eccPos = 0;
+ for($i=0; $i<QRspec::rsBlockNum1($spec); $i++) {
+ $ecc = array_slice($this->ecccode,$eccPos);
+ $this->rsblocks[$blockNo] = new QRrsblock($dl, array_slice($this->datacode, $dataPos), $el, $ecc, $rs);
+ $this->ecccode = array_merge(array_slice($this->ecccode,0, $eccPos), $ecc);
+
+ $dataPos += $dl;
+ $eccPos += $el;
+ $blockNo++;
+ }
+
+ if(QRspec::rsBlockNum2($spec) == 0)
+ return 0;
+
+ $dl = QRspec::rsDataCodes2($spec);
+ $el = QRspec::rsEccCodes2($spec);
+ $rs = QRrs::init_rs(8, 0x11d, 0, 1, $el, 255 - $dl - $el);
+
+ if($rs == NULL) return -1;
+
+ for($i=0; $i<QRspec::rsBlockNum2($spec); $i++) {
+ $ecc = array_slice($this->ecccode,$eccPos);
+ $this->rsblocks[$blockNo] = new QRrsblock($dl, array_slice($this->datacode, $dataPos), $el, $ecc, $rs);
+ $this->ecccode = array_merge(array_slice($this->ecccode,0, $eccPos), $ecc);
+
+ $dataPos += $dl;
+ $eccPos += $el;
+ $blockNo++;
+ }
+
+ return 0;
+ }
+
+ //----------------------------------------------------------------------
+ public function getCode()
+ {
+ $ret;
+
+ if($this->count < $this->dataLength) {
+ $row = $this->count % $this->blocks;
+ $col = $this->count / $this->blocks;
+ if($col >= $this->rsblocks[0]->dataLength) {
+ $row += $this->b1;
+ }
+ $ret = $this->rsblocks[$row]->data[$col];
+ } else if($this->count < $this->dataLength + $this->eccLength) {
+ $row = ($this->count - $this->dataLength) % $this->blocks;
+ $col = ($this->count - $this->dataLength) / $this->blocks;
+ $ret = $this->rsblocks[$row]->ecc[$col];
+ } else {
+ return 0;
+ }
+ $this->count++;
+
+ return $ret;
+ }
+ }
+
+ //##########################################################################
+
+ class QRcode {
+
+ public $version;
+ public $width;
+ public $data;
+
+ //----------------------------------------------------------------------
+ public function encodeMask(QRinput $input, $mask)
+ {
+ if($input->getVersion() < 0 || $input->getVersion() > QRSPEC_VERSION_MAX) {
+ throw new Exception('wrong version');
+ }
+ if($input->getErrorCorrectionLevel() > QR_ECLEVEL_H) {
+ throw new Exception('wrong level');
+ }
+
+ $raw = new QRrawcode($input);
+
+ QRtools::markTime('after_raw');
+
+ $version = $raw->version;
+ $width = QRspec::getWidth($version);
+ $frame = QRspec::newFrame($version);
+
+ $filler = new FrameFiller($width, $frame);
+ if(is_null($filler)) {
+ return NULL;
+ }
+
+ // inteleaved data and ecc codes
+ for($i=0; $i<$raw->dataLength + $raw->eccLength; $i++) {
+ $code = $raw->getCode();
+ $bit = 0x80;
+ for($j=0; $j<8; $j++) {
+ $addr = $filler->next();
+ $filler->setFrameAt($addr, 0x02 | (($bit & $code) != 0));
+ $bit = $bit >> 1;
+ }
+ }
+
+ QRtools::markTime('after_filler');
+
+ unset($raw);
+
+ // remainder bits
+ $j = QRspec::getRemainder($version);
+ for($i=0; $i<$j; $i++) {
+ $addr = $filler->next();
+ $filler->setFrameAt($addr, 0x02);
+ }
+
+ $frame = $filler->frame;
+ unset($filler);
+
+
+ // masking
+ $maskObj = new QRmask();
+ if($mask < 0) {
+
+ if (QR_FIND_BEST_MASK) {
+ $masked = $maskObj->mask($width, $frame, $input->getErrorCorrectionLevel());
+ } else {
+ $masked = $maskObj->makeMask($width, $frame, (intval(QR_DEFAULT_MASK) % 8), $input->getErrorCorrectionLevel());
+ }
+ } else {
+ $masked = $maskObj->makeMask($width, $frame, $mask, $input->getErrorCorrectionLevel());
+ }
+
+ if($masked == NULL) {
+ return NULL;
+ }
+
+ QRtools::markTime('after_mask');
+
+ $this->version = $version;
+ $this->width = $width;
+ $this->data = $masked;
+
+ return $this;
+ }
+
+ //----------------------------------------------------------------------
+ public function encodeInput(QRinput $input)
+ {
+ return $this->encodeMask($input, -1);
+ }
+
+ //----------------------------------------------------------------------
+ public function encodeString8bit($string, $version, $level)
+ {
+ if(string == NULL) {
+ throw new Exception('empty string!');
+ return NULL;
+ }
+
+ $input = new QRinput($version, $level);
+ if($input == NULL) return NULL;
+
+ $ret = $input->append($input, QR_MODE_8, strlen($string), str_split($string));
+ if($ret < 0) {
+ unset($input);
+ return NULL;
+ }
+ return $this->encodeInput($input);
+ }
+
+ //----------------------------------------------------------------------
+ public function encodeString($string, $version, $level, $hint, $casesensitive)
+ {
+
+ if($hint != QR_MODE_8 && $hint != QR_MODE_KANJI) {
+ throw new Exception('bad hint');
+ return NULL;
+ }
+
+ $input = new QRinput($version, $level);
+ if($input == NULL) return NULL;
+
+ $ret = QRsplit::splitStringToQRinput($string, $input, $hint, $casesensitive);
+ if($ret < 0) {
+ return NULL;
+ }
+
+ return $this->encodeInput($input);
+ }
+
+ //----------------------------------------------------------------------
+ public static function png($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4, $saveandprint=false)
+ {
+ $enc = QRencode::factory($level, $size, $margin);
+ return $enc->encodePNG($text, $outfile, $saveandprint=false);
+ }
+
+ //----------------------------------------------------------------------
+ public static function text($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4)
+ {
+ $enc = QRencode::factory($level, $size, $margin);
+ return $enc->encode($text, $outfile);
+ }
+
+ //----------------------------------------------------------------------
+ public static function raw($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4)
+ {
+ $enc = QRencode::factory($level, $size, $margin);
+ return $enc->encodeRAW($text, $outfile);
+ }
+ }
+
+ //##########################################################################
+
+ class FrameFiller {
+
+ public $width;
+ public $frame;
+ public $x;
+ public $y;
+ public $dir;
+ public $bit;
+
+ //----------------------------------------------------------------------
+ public function __construct($width, &$frame)
+ {
+ $this->width = $width;
+ $this->frame = $frame;
+ $this->x = $width - 1;
+ $this->y = $width - 1;
+ $this->dir = -1;
+ $this->bit = -1;
+ }
+
+ //----------------------------------------------------------------------
+ public function setFrameAt($at, $val)
+ {
+ $this->frame[$at['y']][$at['x']] = chr($val);
+ }
+
+ //----------------------------------------------------------------------
+ public function getFrameAt($at)
+ {
+ return ord($this->frame[$at['y']][$at['x']]);
+ }
+
+ //----------------------------------------------------------------------
+ public function next()
+ {
+ do {
+
+ if($this->bit == -1) {
+ $this->bit = 0;
+ return array('x'=>$this->x, 'y'=>$this->y);
+ }
+
+ $x = $this->x;
+ $y = $this->y;
+ $w = $this->width;
+
+ if($this->bit == 0) {
+ $x--;
+ $this->bit++;
+ } else {
+ $x++;
+ $y += $this->dir;
+ $this->bit--;
+ }
+
+ if($this->dir < 0) {
+ if($y < 0) {
+ $y = 0;
+ $x -= 2;
+ $this->dir = 1;
+ if($x == 6) {
+ $x--;
+ $y = 9;
+ }
+ }
+ } else {
+ if($y == $w) {
+ $y = $w - 1;
+ $x -= 2;
+ $this->dir = -1;
+ if($x == 6) {
+ $x--;
+ $y -= 8;
+ }
+ }
+ }
+ if($x < 0 || $y < 0) return null;
+
+ $this->x = $x;
+ $this->y = $y;
+
+ } while(ord($this->frame[$y][$x]) & 0x80);
+
+ return array('x'=>$x, 'y'=>$y);
+ }
+
+ } ;
+
+ //##########################################################################
+
+ class QRencode {
+
+ public $casesensitive = true;
+ public $eightbit = false;
+
+ public $version = 0;
+ public $size = 3;
+ public $margin = 4;
+
+ public $structured = 0; // not supported yet
+
+ public $level = QR_ECLEVEL_L;
+ public $hint = QR_MODE_8;
+
+ //----------------------------------------------------------------------
+ public static function factory($level = QR_ECLEVEL_L, $size = 3, $margin = 4)
+ {
+ $enc = new QRencode();
+ $enc->size = $size;
+ $enc->margin = $margin;
+
+ switch ($level.'') {
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ $enc->level = $level;
+ break;
+ case 'l':
+ case 'L':
+ $enc->level = QR_ECLEVEL_L;
+ break;
+ case 'm':
+ case 'M':
+ $enc->level = QR_ECLEVEL_M;
+ break;
+ case 'q':
+ case 'Q':
+ $enc->level = QR_ECLEVEL_Q;
+ break;
+ case 'h':
+ case 'H':
+ $enc->level = QR_ECLEVEL_H;
+ break;
+ }
+
+ return $enc;
+ }
+
+ //----------------------------------------------------------------------
+ public function encodeRAW($intext, $outfile = false)
+ {
+ $code = new QRcode();
+
+ if($this->eightbit) {
+ $code->encodeString8bit($intext, $this->version, $this->level);
+ } else {
+ $code->encodeString($intext, $this->version, $this->level, $this->hint, $this->casesensitive);
+ }
+
+ return $code->data;
+ }
+
+ //----------------------------------------------------------------------
+ public function encode($intext, $outfile = false)
+ {
+ $code = new QRcode();
+
+ if($this->eightbit) {
+ $code->encodeString8bit($intext, $this->version, $this->level);
+ } else {
+ $code->encodeString($intext, $this->version, $this->level, $this->hint, $this->casesensitive);
+ }
+
+ QRtools::markTime('after_encode');
+
+ if ($outfile!== false) {
+ file_put_contents($outfile, join("\n", QRtools::binarize($code->data)));
+ } else {
+ return QRtools::binarize($code->data);
+ }
+ }
+
+ //----------------------------------------------------------------------
+ public function encodePNG($intext, $outfile = false,$saveandprint=false)
+ {
+ try {
+
+ ob_start();
+ $tab = $this->encode($intext);
+ $err = ob_get_contents();
+ ob_end_clean();
+
+ if ($err != '')
+ QRtools::log($outfile, $err);
+
+ $maxSize = (int)(QR_PNG_MAXIMUM_SIZE / (count($tab)+2*$this->margin));
+
+ QRimage::png($tab, $outfile, min(max(1, $this->size), $maxSize), $this->margin,$saveandprint);
+
+ } catch (Exception $e) {
+
+ QRtools::log($outfile, $e->getMessage());
+
+ }
+ }
+ }
diff --git a/library/phpqrcode/qrimage.php b/library/phpqrcode/qrimage.php
new file mode 100644
index 000000000..10b0a6e1b
--- /dev/null
+++ b/library/phpqrcode/qrimage.php
@@ -0,0 +1,95 @@
+<?php
+/*
+ * PHP QR Code encoder
+ *
+ * Image output of code using GD2
+ *
+ * PHP QR Code is distributed under LGPL 3
+ * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+ define('QR_IMAGE', true);
+
+ class QRimage {
+
+ //----------------------------------------------------------------------
+ public static function png($frame, $filename = false, $pixelPerPoint = 4, $outerFrame = 4,$saveandprint=FALSE)
+ {
+ $image = self::image($frame, $pixelPerPoint, $outerFrame);
+
+ if ($filename === false) {
+ Header("Content-type: image/png");
+ ImagePng($image);
+ } else {
+ if($saveandprint===TRUE){
+ ImagePng($image, $filename);
+ header("Content-type: image/png");
+ ImagePng($image);
+ }else{
+ ImagePng($image, $filename);
+ }
+ }
+
+ ImageDestroy($image);
+ }
+
+ //----------------------------------------------------------------------
+ public static function jpg($frame, $filename = false, $pixelPerPoint = 8, $outerFrame = 4, $q = 85)
+ {
+ $image = self::image($frame, $pixelPerPoint, $outerFrame);
+
+ if ($filename === false) {
+ Header("Content-type: image/jpeg");
+ ImageJpeg($image, null, $q);
+ } else {
+ ImageJpeg($image, $filename, $q);
+ }
+
+ ImageDestroy($image);
+ }
+
+ //----------------------------------------------------------------------
+ private static function image($frame, $pixelPerPoint = 4, $outerFrame = 4)
+ {
+ $h = count($frame);
+ $w = strlen($frame[0]);
+
+ $imgW = $w + 2*$outerFrame;
+ $imgH = $h + 2*$outerFrame;
+
+ $base_image =ImageCreate($imgW, $imgH);
+
+ $col[0] = ImageColorAllocate($base_image,255,255,255);
+ $col[1] = ImageColorAllocate($base_image,0,0,0);
+
+ imagefill($base_image, 0, 0, $col[0]);
+
+ for($y=0; $y<$h; $y++) {
+ for($x=0; $x<$w; $x++) {
+ if ($frame[$y][$x] == '1') {
+ ImageSetPixel($base_image,$x+$outerFrame,$y+$outerFrame,$col[1]);
+ }
+ }
+ }
+
+ $target_image =ImageCreate($imgW * $pixelPerPoint, $imgH * $pixelPerPoint);
+ ImageCopyResized($target_image, $base_image, 0, 0, 0, 0, $imgW * $pixelPerPoint, $imgH * $pixelPerPoint, $imgW, $imgH);
+ ImageDestroy($base_image);
+
+ return $target_image;
+ }
+ } \ No newline at end of file
diff --git a/library/phpqrcode/qrinput.php b/library/phpqrcode/qrinput.php
new file mode 100644
index 000000000..0f6d7f944
--- /dev/null
+++ b/library/phpqrcode/qrinput.php
@@ -0,0 +1,729 @@
+<?php
+/*
+ * PHP QR Code encoder
+ *
+ * Input encoding class
+ *
+ * Based on libqrencode C library distributed under LGPL 2.1
+ * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi <fukuchi@megaui.net>
+ *
+ * PHP QR Code is distributed under LGPL 3
+ * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+ define('STRUCTURE_HEADER_BITS', 20);
+ define('MAX_STRUCTURED_SYMBOLS', 16);
+
+ class QRinputItem {
+
+ public $mode;
+ public $size;
+ public $data;
+ public $bstream;
+
+ public function __construct($mode, $size, $data, $bstream = null)
+ {
+ $setData = array_slice($data, 0, $size);
+
+ if (count($setData) < $size) {
+ $setData = array_merge($setData, array_fill(0,$size-count($setData),0));
+ }
+
+ if(!QRinput::check($mode, $size, $setData)) {
+ throw new Exception('Error m:'.$mode.',s:'.$size.',d:'.join(',',$setData));
+ return null;
+ }
+
+ $this->mode = $mode;
+ $this->size = $size;
+ $this->data = $setData;
+ $this->bstream = $bstream;
+ }
+
+ //----------------------------------------------------------------------
+ public function encodeModeNum($version)
+ {
+ try {
+
+ $words = (int)($this->size / 3);
+ $bs = new QRbitstream();
+
+ $val = 0x1;
+ $bs->appendNum(4, $val);
+ $bs->appendNum(QRspec::lengthIndicator(QR_MODE_NUM, $version), $this->size);
+
+ for($i=0; $i<$words; $i++) {
+ $val = (ord($this->data[$i*3 ]) - ord('0')) * 100;
+ $val += (ord($this->data[$i*3+1]) - ord('0')) * 10;
+ $val += (ord($this->data[$i*3+2]) - ord('0'));
+ $bs->appendNum(10, $val);
+ }
+
+ if($this->size - $words * 3 == 1) {
+ $val = ord($this->data[$words*3]) - ord('0');
+ $bs->appendNum(4, $val);
+ } else if($this->size - $words * 3 == 2) {
+ $val = (ord($this->data[$words*3 ]) - ord('0')) * 10;
+ $val += (ord($this->data[$words*3+1]) - ord('0'));
+ $bs->appendNum(7, $val);
+ }
+
+ $this->bstream = $bs;
+ return 0;
+
+ } catch (Exception $e) {
+ return -1;
+ }
+ }
+
+ //----------------------------------------------------------------------
+ public function encodeModeAn($version)
+ {
+ try {
+ $words = (int)($this->size / 2);
+ $bs = new QRbitstream();
+
+ $bs->appendNum(4, 0x02);
+ $bs->appendNum(QRspec::lengthIndicator(QR_MODE_AN, $version), $this->size);
+
+ for($i=0; $i<$words; $i++) {
+ $val = (int)QRinput::lookAnTable(ord($this->data[$i*2 ])) * 45;
+ $val += (int)QRinput::lookAnTable(ord($this->data[$i*2+1]));
+
+ $bs->appendNum(11, $val);
+ }
+
+ if($this->size & 1) {
+ $val = QRinput::lookAnTable(ord($this->data[$words * 2]));
+ $bs->appendNum(6, $val);
+ }
+
+ $this->bstream = $bs;
+ return 0;
+
+ } catch (Exception $e) {
+ return -1;
+ }
+ }
+
+ //----------------------------------------------------------------------
+ public function encodeMode8($version)
+ {
+ try {
+ $bs = new QRbitstream();
+
+ $bs->appendNum(4, 0x4);
+ $bs->appendNum(QRspec::lengthIndicator(QR_MODE_8, $version), $this->size);
+
+ for($i=0; $i<$this->size; $i++) {
+ $bs->appendNum(8, ord($this->data[$i]));
+ }
+
+ $this->bstream = $bs;
+ return 0;
+
+ } catch (Exception $e) {
+ return -1;
+ }
+ }
+
+ //----------------------------------------------------------------------
+ public function encodeModeKanji($version)
+ {
+ try {
+
+ $bs = new QRbitrtream();
+
+ $bs->appendNum(4, 0x8);
+ $bs->appendNum(QRspec::lengthIndicator(QR_MODE_KANJI, $version), (int)($this->size / 2));
+
+ for($i=0; $i<$this->size; $i+=2) {
+ $val = (ord($this->data[$i]) << 8) | ord($this->data[$i+1]);
+ if($val <= 0x9ffc) {
+ $val -= 0x8140;
+ } else {
+ $val -= 0xc140;
+ }
+
+ $h = ($val >> 8) * 0xc0;
+ $val = ($val & 0xff) + $h;
+
+ $bs->appendNum(13, $val);
+ }
+
+ $this->bstream = $bs;
+ return 0;
+
+ } catch (Exception $e) {
+ return -1;
+ }
+ }
+
+ //----------------------------------------------------------------------
+ public function encodeModeStructure()
+ {
+ try {
+ $bs = new QRbitstream();
+
+ $bs->appendNum(4, 0x03);
+ $bs->appendNum(4, ord($this->data[1]) - 1);
+ $bs->appendNum(4, ord($this->data[0]) - 1);
+ $bs->appendNum(8, ord($this->data[2]));
+
+ $this->bstream = $bs;
+ return 0;
+
+ } catch (Exception $e) {
+ return -1;
+ }
+ }
+
+ //----------------------------------------------------------------------
+ public function estimateBitStreamSizeOfEntry($version)
+ {
+ $bits = 0;
+
+ if($version == 0)
+ $version = 1;
+
+ switch($this->mode) {
+ case QR_MODE_NUM: $bits = QRinput::estimateBitsModeNum($this->size); break;
+ case QR_MODE_AN: $bits = QRinput::estimateBitsModeAn($this->size); break;
+ case QR_MODE_8: $bits = QRinput::estimateBitsMode8($this->size); break;
+ case QR_MODE_KANJI: $bits = QRinput::estimateBitsModeKanji($this->size);break;
+ case QR_MODE_STRUCTURE: return STRUCTURE_HEADER_BITS;
+ default:
+ return 0;
+ }
+
+ $l = QRspec::lengthIndicator($this->mode, $version);
+ $m = 1 << $l;
+ $num = (int)(($this->size + $m - 1) / $m);
+
+ $bits += $num * (4 + $l);
+
+ return $bits;
+ }
+
+ //----------------------------------------------------------------------
+ public function encodeBitStream($version)
+ {
+ try {
+
+ unset($this->bstream);
+ $words = QRspec::maximumWords($this->mode, $version);
+
+ if($this->size > $words) {
+
+ $st1 = new QRinputItem($this->mode, $words, $this->data);
+ $st2 = new QRinputItem($this->mode, $this->size - $words, array_slice($this->data, $words));
+
+ $st1->encodeBitStream($version);
+ $st2->encodeBitStream($version);
+
+ $this->bstream = new QRbitstream();
+ $this->bstream->append($st1->bstream);
+ $this->bstream->append($st2->bstream);
+
+ unset($st1);
+ unset($st2);
+
+ } else {
+
+ $ret = 0;
+
+ switch($this->mode) {
+ case QR_MODE_NUM: $ret = $this->encodeModeNum($version); break;
+ case QR_MODE_AN: $ret = $this->encodeModeAn($version); break;
+ case QR_MODE_8: $ret = $this->encodeMode8($version); break;
+ case QR_MODE_KANJI: $ret = $this->encodeModeKanji($version);break;
+ case QR_MODE_STRUCTURE: $ret = $this->encodeModeStructure(); break;
+
+ default:
+ break;
+ }
+
+ if($ret < 0)
+ return -1;
+ }
+
+ return $this->bstream->size();
+
+ } catch (Exception $e) {
+ return -1;
+ }
+ }
+ };
+
+ //##########################################################################
+
+ class QRinput {
+
+ public $items;
+
+ private $version;
+ private $level;
+
+ //----------------------------------------------------------------------
+ public function __construct($version = 0, $level = QR_ECLEVEL_L)
+ {
+ if ($version < 0 || $version > QRSPEC_VERSION_MAX || $level > QR_ECLEVEL_H) {
+ throw new Exception('Invalid version no');
+ return NULL;
+ }
+
+ $this->version = $version;
+ $this->level = $level;
+ }
+
+ //----------------------------------------------------------------------
+ public function getVersion()
+ {
+ return $this->version;
+ }
+
+ //----------------------------------------------------------------------
+ public function setVersion($version)
+ {
+ if($version < 0 || $version > QRSPEC_VERSION_MAX) {
+ throw new Exception('Invalid version no');
+ return -1;
+ }
+
+ $this->version = $version;
+
+ return 0;
+ }
+
+ //----------------------------------------------------------------------
+ public function getErrorCorrectionLevel()
+ {
+ return $this->level;
+ }
+
+ //----------------------------------------------------------------------
+ public function setErrorCorrectionLevel($level)
+ {
+ if($level > QR_ECLEVEL_H) {
+ throw new Exception('Invalid ECLEVEL');
+ return -1;
+ }
+
+ $this->level = $level;
+
+ return 0;
+ }
+
+ //----------------------------------------------------------------------
+ public function appendEntry(QRinputItem $entry)
+ {
+ $this->items[] = $entry;
+ }
+
+ //----------------------------------------------------------------------
+ public function append($mode, $size, $data)
+ {
+ try {
+ $entry = new QRinputItem($mode, $size, $data);
+ $this->items[] = $entry;
+ return 0;
+ } catch (Exception $e) {
+ return -1;
+ }
+ }
+
+ //----------------------------------------------------------------------
+
+ public function insertStructuredAppendHeader($size, $index, $parity)
+ {
+ if( $size > MAX_STRUCTURED_SYMBOLS ) {
+ throw new Exception('insertStructuredAppendHeader wrong size');
+ }
+
+ if( $index <= 0 || $index > MAX_STRUCTURED_SYMBOLS ) {
+ throw new Exception('insertStructuredAppendHeader wrong index');
+ }
+
+ $buf = array($size, $index, $parity);
+
+ try {
+ $entry = new QRinputItem(QR_MODE_STRUCTURE, 3, buf);
+ array_unshift($this->items, $entry);
+ return 0;
+ } catch (Exception $e) {
+ return -1;
+ }
+ }
+
+ //----------------------------------------------------------------------
+ public function calcParity()
+ {
+ $parity = 0;
+
+ foreach($this->items as $item) {
+ if($item->mode != QR_MODE_STRUCTURE) {
+ for($i=$item->size-1; $i>=0; $i--) {
+ $parity ^= $item->data[$i];
+ }
+ }
+ }
+
+ return $parity;
+ }
+
+ //----------------------------------------------------------------------
+ public static function checkModeNum($size, $data)
+ {
+ for($i=0; $i<$size; $i++) {
+ if((ord($data[$i]) < ord('0')) || (ord($data[$i]) > ord('9'))){
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ //----------------------------------------------------------------------
+ public static function estimateBitsModeNum($size)
+ {
+ $w = (int)$size / 3;
+ $bits = $w * 10;
+
+ switch($size - $w * 3) {
+ case 1:
+ $bits += 4;
+ break;
+ case 2:
+ $bits += 7;
+ break;
+ default:
+ break;
+ }
+
+ return $bits;
+ }
+
+ //----------------------------------------------------------------------
+ public static $anTable = array(
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 36, -1, -1, -1, 37, 38, -1, -1, -1, -1, 39, 40, -1, 41, 42, 43,
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 44, -1, -1, -1, -1, -1,
+ -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
+ 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
+ );
+
+ //----------------------------------------------------------------------
+ public static function lookAnTable($c)
+ {
+ return (($c > 127)?-1:self::$anTable[$c]);
+ }
+
+ //----------------------------------------------------------------------
+ public static function checkModeAn($size, $data)
+ {
+ for($i=0; $i<$size; $i++) {
+ if (self::lookAnTable(ord($data[$i])) == -1) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ //----------------------------------------------------------------------
+ public static function estimateBitsModeAn($size)
+ {
+ $w = (int)($size / 2);
+ $bits = $w * 11;
+
+ if($size & 1) {
+ $bits += 6;
+ }
+
+ return $bits;
+ }
+
+ //----------------------------------------------------------------------
+ public static function estimateBitsMode8($size)
+ {
+ return $size * 8;
+ }
+
+ //----------------------------------------------------------------------
+ public function estimateBitsModeKanji($size)
+ {
+ return (int)(($size / 2) * 13);
+ }
+
+ //----------------------------------------------------------------------
+ public static function checkModeKanji($size, $data)
+ {
+ if($size & 1)
+ return false;
+
+ for($i=0; $i<$size; $i+=2) {
+ $val = (ord($data[$i]) << 8) | ord($data[$i+1]);
+ if( $val < 0x8140
+ || ($val > 0x9ffc && $val < 0xe040)
+ || $val > 0xebbf) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ /***********************************************************************
+ * Validation
+ **********************************************************************/
+
+ public static function check($mode, $size, $data)
+ {
+ if($size <= 0)
+ return false;
+
+ switch($mode) {
+ case QR_MODE_NUM: return self::checkModeNum($size, $data); break;
+ case QR_MODE_AN: return self::checkModeAn($size, $data); break;
+ case QR_MODE_KANJI: return self::checkModeKanji($size, $data); break;
+ case QR_MODE_8: return true; break;
+ case QR_MODE_STRUCTURE: return true; break;
+
+ default:
+ break;
+ }
+
+ return false;
+ }
+
+
+ //----------------------------------------------------------------------
+ public function estimateBitStreamSize($version)
+ {
+ $bits = 0;
+
+ foreach($this->items as $item) {
+ $bits += $item->estimateBitStreamSizeOfEntry($version);
+ }
+
+ return $bits;
+ }
+
+ //----------------------------------------------------------------------
+ public function estimateVersion()
+ {
+ $version = 0;
+ $prev = 0;
+ do {
+ $prev = $version;
+ $bits = $this->estimateBitStreamSize($prev);
+ $version = QRspec::getMinimumVersion((int)(($bits + 7) / 8), $this->level);
+ if ($version < 0) {
+ return -1;
+ }
+ } while ($version > $prev);
+
+ return $version;
+ }
+
+ //----------------------------------------------------------------------
+ public static function lengthOfCode($mode, $version, $bits)
+ {
+ $payload = $bits - 4 - QRspec::lengthIndicator($mode, $version);
+ switch($mode) {
+ case QR_MODE_NUM:
+ $chunks = (int)($payload / 10);
+ $remain = $payload - $chunks * 10;
+ $size = $chunks * 3;
+ if($remain >= 7) {
+ $size += 2;
+ } else if($remain >= 4) {
+ $size += 1;
+ }
+ break;
+ case QR_MODE_AN:
+ $chunks = (int)($payload / 11);
+ $remain = $payload - $chunks * 11;
+ $size = $chunks * 2;
+ if($remain >= 6)
+ $size++;
+ break;
+ case QR_MODE_8:
+ $size = (int)($payload / 8);
+ break;
+ case QR_MODE_KANJI:
+ $size = (int)(($payload / 13) * 2);
+ break;
+ case QR_MODE_STRUCTURE:
+ $size = (int)($payload / 8);
+ break;
+ default:
+ $size = 0;
+ break;
+ }
+
+ $maxsize = QRspec::maximumWords($mode, $version);
+ if($size < 0) $size = 0;
+ if($size > $maxsize) $size = $maxsize;
+
+ return $size;
+ }
+
+ //----------------------------------------------------------------------
+ public function createBitStream()
+ {
+ $total = 0;
+
+ foreach($this->items as $item) {
+ $bits = $item->encodeBitStream($this->version);
+
+ if($bits < 0)
+ return -1;
+
+ $total += $bits;
+ }
+
+ return $total;
+ }
+
+ //----------------------------------------------------------------------
+ public function convertData()
+ {
+ $ver = $this->estimateVersion();
+ if($ver > $this->getVersion()) {
+ $this->setVersion($ver);
+ }
+
+ for(;;) {
+ $bits = $this->createBitStream();
+
+ if($bits < 0)
+ return -1;
+
+ $ver = QRspec::getMinimumVersion((int)(($bits + 7) / 8), $this->level);
+ if($ver < 0) {
+ throw new Exception('WRONG VERSION');
+ return -1;
+ } else if($ver > $this->getVersion()) {
+ $this->setVersion($ver);
+ } else {
+ break;
+ }
+ }
+
+ return 0;
+ }
+
+ //----------------------------------------------------------------------
+ public function appendPaddingBit(&$bstream)
+ {
+ $bits = $bstream->size();
+ $maxwords = QRspec::getDataLength($this->version, $this->level);
+ $maxbits = $maxwords * 8;
+
+ if ($maxbits == $bits) {
+ return 0;
+ }
+
+ if ($maxbits - $bits < 5) {
+ return $bstream->appendNum($maxbits - $bits, 0);
+ }
+
+ $bits += 4;
+ $words = (int)(($bits + 7) / 8);
+
+ $padding = new QRbitstream();
+ $ret = $padding->appendNum($words * 8 - $bits + 4, 0);
+
+ if($ret < 0)
+ return $ret;
+
+ $padlen = $maxwords - $words;
+
+ if($padlen > 0) {
+
+ $padbuf = array();
+ for($i=0; $i<$padlen; $i++) {
+ $padbuf[$i] = ($i&1)?0x11:0xec;
+ }
+
+ $ret = $padding->appendBytes($padlen, $padbuf);
+
+ if($ret < 0)
+ return $ret;
+
+ }
+
+ $ret = $bstream->append($padding);
+
+ return $ret;
+ }
+
+ //----------------------------------------------------------------------
+ public function mergeBitStream()
+ {
+ if($this->convertData() < 0) {
+ return null;
+ }
+
+ $bstream = new QRbitstream();
+
+ foreach($this->items as $item) {
+ $ret = $bstream->append($item->bstream);
+ if($ret < 0) {
+ return null;
+ }
+ }
+
+ return $bstream;
+ }
+
+ //----------------------------------------------------------------------
+ public function getBitStream()
+ {
+
+ $bstream = $this->mergeBitStream();
+
+ if($bstream == null) {
+ return null;
+ }
+
+ $ret = $this->appendPaddingBit($bstream);
+ if($ret < 0) {
+ return null;
+ }
+
+ return $bstream;
+ }
+
+ //----------------------------------------------------------------------
+ public function getByteStream()
+ {
+ $bstream = $this->getBitStream();
+ if($bstream == null) {
+ return null;
+ }
+
+ return $bstream->toByte();
+ }
+ }
+
+
+ \ No newline at end of file
diff --git a/library/phpqrcode/qrlib.php b/library/phpqrcode/qrlib.php
new file mode 100644
index 000000000..d55c4af29
--- /dev/null
+++ b/library/phpqrcode/qrlib.php
@@ -0,0 +1,43 @@
+<?php
+/*
+ * PHP QR Code encoder
+ *
+ * Root library file, prepares environment and includes dependencies
+ *
+ * Based on libqrencode C library distributed under LGPL 2.1
+ * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi <fukuchi@megaui.net>
+ *
+ * PHP QR Code is distributed under LGPL 3
+ * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+ $QR_BASEDIR = dirname(__FILE__).DIRECTORY_SEPARATOR;
+
+ // Required libs
+
+ include $QR_BASEDIR."qrconst.php";
+ include $QR_BASEDIR."qrconfig.php";
+ include $QR_BASEDIR."qrtools.php";
+ include $QR_BASEDIR."qrspec.php";
+ include $QR_BASEDIR."qrimage.php";
+ include $QR_BASEDIR."qrinput.php";
+ include $QR_BASEDIR."qrbitstream.php";
+ include $QR_BASEDIR."qrsplit.php";
+ include $QR_BASEDIR."qrrscode.php";
+ include $QR_BASEDIR."qrmask.php";
+ include $QR_BASEDIR."qrencode.php";
+
diff --git a/library/phpqrcode/qrmask.php b/library/phpqrcode/qrmask.php
new file mode 100644
index 000000000..b14d7ae16
--- /dev/null
+++ b/library/phpqrcode/qrmask.php
@@ -0,0 +1,328 @@
+<?php
+/*
+ * PHP QR Code encoder
+ *
+ * Masking
+ *
+ * Based on libqrencode C library distributed under LGPL 2.1
+ * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi <fukuchi@megaui.net>
+ *
+ * PHP QR Code is distributed under LGPL 3
+ * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+ define('N1', 3);
+ define('N2', 3);
+ define('N3', 40);
+ define('N4', 10);
+
+ class QRmask {
+
+ public $runLength = array();
+
+ //----------------------------------------------------------------------
+ public function __construct()
+ {
+ $this->runLength = array_fill(0, QRSPEC_WIDTH_MAX + 1, 0);
+ }
+
+ //----------------------------------------------------------------------
+ public function writeFormatInformation($width, &$frame, $mask, $level)
+ {
+ $blacks = 0;
+ $format = QRspec::getFormatInfo($mask, $level);
+
+ for($i=0; $i<8; $i++) {
+ if($format & 1) {
+ $blacks += 2;
+ $v = 0x85;
+ } else {
+ $v = 0x84;
+ }
+
+ $frame[8][$width - 1 - $i] = chr($v);
+ if($i < 6) {
+ $frame[$i][8] = chr($v);
+ } else {
+ $frame[$i + 1][8] = chr($v);
+ }
+ $format = $format >> 1;
+ }
+
+ for($i=0; $i<7; $i++) {
+ if($format & 1) {
+ $blacks += 2;
+ $v = 0x85;
+ } else {
+ $v = 0x84;
+ }
+
+ $frame[$width - 7 + $i][8] = chr($v);
+ if($i == 0) {
+ $frame[8][7] = chr($v);
+ } else {
+ $frame[8][6 - $i] = chr($v);
+ }
+
+ $format = $format >> 1;
+ }
+
+ return $blacks;
+ }
+
+ //----------------------------------------------------------------------
+ public function mask0($x, $y) { return ($x+$y)&1; }
+ public function mask1($x, $y) { return ($y&1); }
+ public function mask2($x, $y) { return ($x%3); }
+ public function mask3($x, $y) { return ($x+$y)%3; }
+ public function mask4($x, $y) { return (((int)($y/2))+((int)($x/3)))&1; }
+ public function mask5($x, $y) { return (($x*$y)&1)+($x*$y)%3; }
+ public function mask6($x, $y) { return ((($x*$y)&1)+($x*$y)%3)&1; }
+ public function mask7($x, $y) { return ((($x*$y)%3)+(($x+$y)&1))&1; }
+
+ //----------------------------------------------------------------------
+ private function generateMaskNo($maskNo, $width, $frame)
+ {
+ $bitMask = array_fill(0, $width, array_fill(0, $width, 0));
+
+ for($y=0; $y<$width; $y++) {
+ for($x=0; $x<$width; $x++) {
+ if(ord($frame[$y][$x]) & 0x80) {
+ $bitMask[$y][$x] = 0;
+ } else {
+ $maskFunc = call_user_func(array($this, 'mask'.$maskNo), $x, $y);
+ $bitMask[$y][$x] = ($maskFunc == 0)?1:0;
+ }
+
+ }
+ }
+
+ return $bitMask;
+ }
+
+ //----------------------------------------------------------------------
+ public static function serial($bitFrame)
+ {
+ $codeArr = array();
+
+ foreach ($bitFrame as $line)
+ $codeArr[] = join('', $line);
+
+ return gzcompress(join("\n", $codeArr), 9);
+ }
+
+ //----------------------------------------------------------------------
+ public static function unserial($code)
+ {
+ $codeArr = array();
+
+ $codeLines = explode("\n", gzuncompress($code));
+ foreach ($codeLines as $line)
+ $codeArr[] = str_split($line);
+
+ return $codeArr;
+ }
+
+ //----------------------------------------------------------------------
+ public function makeMaskNo($maskNo, $width, $s, &$d, $maskGenOnly = false)
+ {
+ $b = 0;
+ $bitMask = array();
+
+ $fileName = QR_CACHE_DIR.'mask_'.$maskNo.DIRECTORY_SEPARATOR.'mask_'.$width.'_'.$maskNo.'.dat';
+
+ if (QR_CACHEABLE) {
+ if (file_exists($fileName)) {
+ $bitMask = self::unserial(file_get_contents($fileName));
+ } else {
+ $bitMask = $this->generateMaskNo($maskNo, $width, $s, $d);
+ if (!file_exists(QR_CACHE_DIR.'mask_'.$maskNo))
+ mkdir(QR_CACHE_DIR.'mask_'.$maskNo);
+ file_put_contents($fileName, self::serial($bitMask));
+ }
+ } else {
+ $bitMask = $this->generateMaskNo($maskNo, $width, $s, $d);
+ }
+
+ if ($maskGenOnly)
+ return;
+
+ $d = $s;
+
+ for($y=0; $y<$width; $y++) {
+ for($x=0; $x<$width; $x++) {
+ if($bitMask[$y][$x] == 1) {
+ $d[$y][$x] = chr(ord($s[$y][$x]) ^ (int)$bitMask[$y][$x]);
+ }
+ $b += (int)(ord($d[$y][$x]) & 1);
+ }
+ }
+
+ return $b;
+ }
+
+ //----------------------------------------------------------------------
+ public function makeMask($width, $frame, $maskNo, $level)
+ {
+ $masked = array_fill(0, $width, str_repeat("\0", $width));
+ $this->makeMaskNo($maskNo, $width, $frame, $masked);
+ $this->writeFormatInformation($width, $masked, $maskNo, $level);
+
+ return $masked;
+ }
+
+ //----------------------------------------------------------------------
+ public function calcN1N3($length)
+ {
+ $demerit = 0;
+
+ for($i=0; $i<$length; $i++) {
+
+ if($this->runLength[$i] >= 5) {
+ $demerit += (N1 + ($this->runLength[$i] - 5));
+ }
+ if($i & 1) {
+ if(($i >= 3) && ($i < ($length-2)) && ($this->runLength[$i] % 3 == 0)) {
+ $fact = (int)($this->runLength[$i] / 3);
+ if(($this->runLength[$i-2] == $fact) &&
+ ($this->runLength[$i-1] == $fact) &&
+ ($this->runLength[$i+1] == $fact) &&
+ ($this->runLength[$i+2] == $fact)) {
+ if(($this->runLength[$i-3] < 0) || ($this->runLength[$i-3] >= (4 * $fact))) {
+ $demerit += N3;
+ } else if((($i+3) >= $length) || ($this->runLength[$i+3] >= (4 * $fact))) {
+ $demerit += N3;
+ }
+ }
+ }
+ }
+ }
+ return $demerit;
+ }
+
+ //----------------------------------------------------------------------
+ public function evaluateSymbol($width, $frame)
+ {
+ $head = 0;
+ $demerit = 0;
+
+ for($y=0; $y<$width; $y++) {
+ $head = 0;
+ $this->runLength[0] = 1;
+
+ $frameY = $frame[$y];
+
+ if ($y>0)
+ $frameYM = $frame[$y-1];
+
+ for($x=0; $x<$width; $x++) {
+ if(($x > 0) && ($y > 0)) {
+ $b22 = ord($frameY[$x]) & ord($frameY[$x-1]) & ord($frameYM[$x]) & ord($frameYM[$x-1]);
+ $w22 = ord($frameY[$x]) | ord($frameY[$x-1]) | ord($frameYM[$x]) | ord($frameYM[$x-1]);
+
+ if(($b22 | ($w22 ^ 1))&1) {
+ $demerit += N2;
+ }
+ }
+ if(($x == 0) && (ord($frameY[$x]) & 1)) {
+ $this->runLength[0] = -1;
+ $head = 1;
+ $this->runLength[$head] = 1;
+ } else if($x > 0) {
+ if((ord($frameY[$x]) ^ ord($frameY[$x-1])) & 1) {
+ $head++;
+ $this->runLength[$head] = 1;
+ } else {
+ $this->runLength[$head]++;
+ }
+ }
+ }
+
+ $demerit += $this->calcN1N3($head+1);
+ }
+
+ for($x=0; $x<$width; $x++) {
+ $head = 0;
+ $this->runLength[0] = 1;
+
+ for($y=0; $y<$width; $y++) {
+ if($y == 0 && (ord($frame[$y][$x]) & 1)) {
+ $this->runLength[0] = -1;
+ $head = 1;
+ $this->runLength[$head] = 1;
+ } else if($y > 0) {
+ if((ord($frame[$y][$x]) ^ ord($frame[$y-1][$x])) & 1) {
+ $head++;
+ $this->runLength[$head] = 1;
+ } else {
+ $this->runLength[$head]++;
+ }
+ }
+ }
+
+ $demerit += $this->calcN1N3($head+1);
+ }
+
+ return $demerit;
+ }
+
+
+ //----------------------------------------------------------------------
+ public function mask($width, $frame, $level)
+ {
+ $minDemerit = PHP_INT_MAX;
+ $bestMaskNum = 0;
+ $bestMask = array();
+
+ $checked_masks = array(0,1,2,3,4,5,6,7);
+
+ if (QR_FIND_FROM_RANDOM !== false) {
+
+ $howManuOut = 8-(QR_FIND_FROM_RANDOM % 9);
+ for ($i = 0; $i < $howManuOut; $i++) {
+ $remPos = rand (0, count($checked_masks)-1);
+ unset($checked_masks[$remPos]);
+ $checked_masks = array_values($checked_masks);
+ }
+
+ }
+
+ $bestMask = $frame;
+
+ foreach($checked_masks as $i) {
+ $mask = array_fill(0, $width, str_repeat("\0", $width));
+
+ $demerit = 0;
+ $blacks = 0;
+ $blacks = $this->makeMaskNo($i, $width, $frame, $mask);
+ $blacks += $this->writeFormatInformation($width, $mask, $i, $level);
+ $blacks = (int)(100 * $blacks / ($width * $width));
+ $demerit = (int)((int)(abs($blacks - 50) / 5) * N4);
+ $demerit += $this->evaluateSymbol($width, $mask);
+
+ if($demerit < $minDemerit) {
+ $minDemerit = $demerit;
+ $bestMask = $mask;
+ $bestMaskNum = $i;
+ }
+ }
+
+ return $bestMask;
+ }
+
+ //----------------------------------------------------------------------
+ }
diff --git a/library/phpqrcode/qrrscode.php b/library/phpqrcode/qrrscode.php
new file mode 100644
index 000000000..591129a32
--- /dev/null
+++ b/library/phpqrcode/qrrscode.php
@@ -0,0 +1,210 @@
+<?php
+/*
+ * PHP QR Code encoder
+ *
+ * Reed-Solomon error correction support
+ *
+ * Copyright (C) 2002, 2003, 2004, 2006 Phil Karn, KA9Q
+ * (libfec is released under the GNU Lesser General Public License.)
+ *
+ * Based on libqrencode C library distributed under LGPL 2.1
+ * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi <fukuchi@megaui.net>
+ *
+ * PHP QR Code is distributed under LGPL 3
+ * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+ class QRrsItem {
+
+ public $mm; // Bits per symbol
+ public $nn; // Symbols per block (= (1<<mm)-1)
+ public $alpha_to = array(); // log lookup table
+ public $index_of = array(); // Antilog lookup table
+ public $genpoly = array(); // Generator polynomial
+ public $nroots; // Number of generator roots = number of parity symbols
+ public $fcr; // First consecutive root, index form
+ public $prim; // Primitive element, index form
+ public $iprim; // prim-th root of 1, index form
+ public $pad; // Padding bytes in shortened block
+ public $gfpoly;
+
+ //----------------------------------------------------------------------
+ public function modnn($x)
+ {
+ while ($x >= $this->nn) {
+ $x -= $this->nn;
+ $x = ($x >> $this->mm) + ($x & $this->nn);
+ }
+
+ return $x;
+ }
+
+ //----------------------------------------------------------------------
+ public static function init_rs_char($symsize, $gfpoly, $fcr, $prim, $nroots, $pad)
+ {
+ // Common code for intializing a Reed-Solomon control block (char or int symbols)
+ // Copyright 2004 Phil Karn, KA9Q
+ // May be used under the terms of the GNU Lesser General Public License (LGPL)
+
+ $rs = null;
+
+ // Check parameter ranges
+ if($symsize < 0 || $symsize > 8) return $rs;
+ if($fcr < 0 || $fcr >= (1<<$symsize)) return $rs;
+ if($prim <= 0 || $prim >= (1<<$symsize)) return $rs;
+ if($nroots < 0 || $nroots >= (1<<$symsize)) return $rs; // Can't have more roots than symbol values!
+ if($pad < 0 || $pad >= ((1<<$symsize) -1 - $nroots)) return $rs; // Too much padding
+
+ $rs = new QRrsItem();
+ $rs->mm = $symsize;
+ $rs->nn = (1<<$symsize)-1;
+ $rs->pad = $pad;
+
+ $rs->alpha_to = array_fill(0, $rs->nn+1, 0);
+ $rs->index_of = array_fill(0, $rs->nn+1, 0);
+
+ // PHP style macro replacement ;)
+ $NN =& $rs->nn;
+ $A0 =& $NN;
+
+ // Generate Galois field lookup tables
+ $rs->index_of[0] = $A0; // log(zero) = -inf
+ $rs->alpha_to[$A0] = 0; // alpha**-inf = 0
+ $sr = 1;
+
+ for($i=0; $i<$rs->nn; $i++) {
+ $rs->index_of[$sr] = $i;
+ $rs->alpha_to[$i] = $sr;
+ $sr <<= 1;
+ if($sr & (1<<$symsize)) {
+ $sr ^= $gfpoly;
+ }
+ $sr &= $rs->nn;
+ }
+
+ if($sr != 1){
+ // field generator polynomial is not primitive!
+ $rs = NULL;
+ return $rs;
+ }
+
+ /* Form RS code generator polynomial from its roots */
+ $rs->genpoly = array_fill(0, $nroots+1, 0);
+
+ $rs->fcr = $fcr;
+ $rs->prim = $prim;
+ $rs->nroots = $nroots;
+ $rs->gfpoly = $gfpoly;
+
+ /* Find prim-th root of 1, used in decoding */
+ for($iprim=1;($iprim % $prim) != 0;$iprim += $rs->nn)
+ ; // intentional empty-body loop!
+
+ $rs->iprim = (int)($iprim / $prim);
+ $rs->genpoly[0] = 1;
+
+ for ($i = 0,$root=$fcr*$prim; $i < $nroots; $i++, $root += $prim) {
+ $rs->genpoly[$i+1] = 1;
+
+ // Multiply rs->genpoly[] by @**(root + x)
+ for ($j = $i; $j > 0; $j--) {
+ if ($rs->genpoly[$j] != 0) {
+ $rs->genpoly[$j] = $rs->genpoly[$j-1] ^ $rs->alpha_to[$rs->modnn($rs->index_of[$rs->genpoly[$j]] + $root)];
+ } else {
+ $rs->genpoly[$j] = $rs->genpoly[$j-1];
+ }
+ }
+ // rs->genpoly[0] can never be zero
+ $rs->genpoly[0] = $rs->alpha_to[$rs->modnn($rs->index_of[$rs->genpoly[0]] + $root)];
+ }
+
+ // convert rs->genpoly[] to index form for quicker encoding
+ for ($i = 0; $i <= $nroots; $i++)
+ $rs->genpoly[$i] = $rs->index_of[$rs->genpoly[$i]];
+
+ return $rs;
+ }
+
+ //----------------------------------------------------------------------
+ public function encode_rs_char($data, &$parity)
+ {
+ $MM =& $this->mm;
+ $NN =& $this->nn;
+ $ALPHA_TO =& $this->alpha_to;
+ $INDEX_OF =& $this->index_of;
+ $GENPOLY =& $this->genpoly;
+ $NROOTS =& $this->nroots;
+ $FCR =& $this->fcr;
+ $PRIM =& $this->prim;
+ $IPRIM =& $this->iprim;
+ $PAD =& $this->pad;
+ $A0 =& $NN;
+
+ $parity = array_fill(0, $NROOTS, 0);
+
+ for($i=0; $i< ($NN-$NROOTS-$PAD); $i++) {
+
+ $feedback = $INDEX_OF[$data[$i] ^ $parity[0]];
+ if($feedback != $A0) {
+ // feedback term is non-zero
+
+ // This line is unnecessary when GENPOLY[NROOTS] is unity, as it must
+ // always be for the polynomials constructed by init_rs()
+ $feedback = $this->modnn($NN - $GENPOLY[$NROOTS] + $feedback);
+
+ for($j=1;$j<$NROOTS;$j++) {
+ $parity[$j] ^= $ALPHA_TO[$this->modnn($feedback + $GENPOLY[$NROOTS-$j])];
+ }
+ }
+
+ // Shift
+ array_shift($parity);
+ if($feedback != $A0) {
+ array_push($parity, $ALPHA_TO[$this->modnn($feedback + $GENPOLY[0])]);
+ } else {
+ array_push($parity, 0);
+ }
+ }
+ }
+ }
+
+ //##########################################################################
+
+ class QRrs {
+
+ public static $items = array();
+
+ //----------------------------------------------------------------------
+ public static function init_rs($symsize, $gfpoly, $fcr, $prim, $nroots, $pad)
+ {
+ foreach(self::$items as $rs) {
+ if($rs->pad != $pad) continue;
+ if($rs->nroots != $nroots) continue;
+ if($rs->mm != $symsize) continue;
+ if($rs->gfpoly != $gfpoly) continue;
+ if($rs->fcr != $fcr) continue;
+ if($rs->prim != $prim) continue;
+
+ return $rs;
+ }
+
+ $rs = QRrsItem::init_rs_char($symsize, $gfpoly, $fcr, $prim, $nroots, $pad);
+ array_unshift(self::$items, $rs);
+
+ return $rs;
+ }
+ } \ No newline at end of file
diff --git a/library/phpqrcode/qrspec.php b/library/phpqrcode/qrspec.php
new file mode 100644
index 000000000..92aea0c78
--- /dev/null
+++ b/library/phpqrcode/qrspec.php
@@ -0,0 +1,592 @@
+<?php
+/*
+ * PHP QR Code encoder
+ *
+ * QR Code specifications
+ *
+ * Based on libqrencode C library distributed under LGPL 2.1
+ * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi <fukuchi@megaui.net>
+ *
+ * PHP QR Code is distributed under LGPL 3
+ * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
+ *
+ * The following data / specifications are taken from
+ * "Two dimensional symbol -- QR-code -- Basic Specification" (JIS X0510:2004)
+ * or
+ * "Automatic identification and data capture techniques --
+ * QR Code 2005 bar code symbology specification" (ISO/IEC 18004:2006)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+ define('QRSPEC_VERSION_MAX', 40);
+ define('QRSPEC_WIDTH_MAX', 177);
+
+ define('QRCAP_WIDTH', 0);
+ define('QRCAP_WORDS', 1);
+ define('QRCAP_REMINDER', 2);
+ define('QRCAP_EC', 3);
+
+ class QRspec {
+
+ public static $capacity = array(
+ array( 0, 0, 0, array( 0, 0, 0, 0)),
+ array( 21, 26, 0, array( 7, 10, 13, 17)), // 1
+ array( 25, 44, 7, array( 10, 16, 22, 28)),
+ array( 29, 70, 7, array( 15, 26, 36, 44)),
+ array( 33, 100, 7, array( 20, 36, 52, 64)),
+ array( 37, 134, 7, array( 26, 48, 72, 88)), // 5
+ array( 41, 172, 7, array( 36, 64, 96, 112)),
+ array( 45, 196, 0, array( 40, 72, 108, 130)),
+ array( 49, 242, 0, array( 48, 88, 132, 156)),
+ array( 53, 292, 0, array( 60, 110, 160, 192)),
+ array( 57, 346, 0, array( 72, 130, 192, 224)), //10
+ array( 61, 404, 0, array( 80, 150, 224, 264)),
+ array( 65, 466, 0, array( 96, 176, 260, 308)),
+ array( 69, 532, 0, array( 104, 198, 288, 352)),
+ array( 73, 581, 3, array( 120, 216, 320, 384)),
+ array( 77, 655, 3, array( 132, 240, 360, 432)), //15
+ array( 81, 733, 3, array( 144, 280, 408, 480)),
+ array( 85, 815, 3, array( 168, 308, 448, 532)),
+ array( 89, 901, 3, array( 180, 338, 504, 588)),
+ array( 93, 991, 3, array( 196, 364, 546, 650)),
+ array( 97, 1085, 3, array( 224, 416, 600, 700)), //20
+ array(101, 1156, 4, array( 224, 442, 644, 750)),
+ array(105, 1258, 4, array( 252, 476, 690, 816)),
+ array(109, 1364, 4, array( 270, 504, 750, 900)),
+ array(113, 1474, 4, array( 300, 560, 810, 960)),
+ array(117, 1588, 4, array( 312, 588, 870, 1050)), //25
+ array(121, 1706, 4, array( 336, 644, 952, 1110)),
+ array(125, 1828, 4, array( 360, 700, 1020, 1200)),
+ array(129, 1921, 3, array( 390, 728, 1050, 1260)),
+ array(133, 2051, 3, array( 420, 784, 1140, 1350)),
+ array(137, 2185, 3, array( 450, 812, 1200, 1440)), //30
+ array(141, 2323, 3, array( 480, 868, 1290, 1530)),
+ array(145, 2465, 3, array( 510, 924, 1350, 1620)),
+ array(149, 2611, 3, array( 540, 980, 1440, 1710)),
+ array(153, 2761, 3, array( 570, 1036, 1530, 1800)),
+ array(157, 2876, 0, array( 570, 1064, 1590, 1890)), //35
+ array(161, 3034, 0, array( 600, 1120, 1680, 1980)),
+ array(165, 3196, 0, array( 630, 1204, 1770, 2100)),
+ array(169, 3362, 0, array( 660, 1260, 1860, 2220)),
+ array(173, 3532, 0, array( 720, 1316, 1950, 2310)),
+ array(177, 3706, 0, array( 750, 1372, 2040, 2430)) //40
+ );
+
+ //----------------------------------------------------------------------
+ public static function getDataLength($version, $level)
+ {
+ return self::$capacity[$version][QRCAP_WORDS] - self::$capacity[$version][QRCAP_EC][$level];
+ }
+
+ //----------------------------------------------------------------------
+ public static function getECCLength($version, $level)
+ {
+ return self::$capacity[$version][QRCAP_EC][$level];
+ }
+
+ //----------------------------------------------------------------------
+ public static function getWidth($version)
+ {
+ return self::$capacity[$version][QRCAP_WIDTH];
+ }
+
+ //----------------------------------------------------------------------
+ public static function getRemainder($version)
+ {
+ return self::$capacity[$version][QRCAP_REMINDER];
+ }
+
+ //----------------------------------------------------------------------
+ public static function getMinimumVersion($size, $level)
+ {
+
+ for($i=1; $i<= QRSPEC_VERSION_MAX; $i++) {
+ $words = self::$capacity[$i][QRCAP_WORDS] - self::$capacity[$i][QRCAP_EC][$level];
+ if($words >= $size)
+ return $i;
+ }
+
+ return -1;
+ }
+
+ //######################################################################
+
+ public static $lengthTableBits = array(
+ array(10, 12, 14),
+ array( 9, 11, 13),
+ array( 8, 16, 16),
+ array( 8, 10, 12)
+ );
+
+ //----------------------------------------------------------------------
+ public static function lengthIndicator($mode, $version)
+ {
+ if ($mode == QR_MODE_STRUCTURE)
+ return 0;
+
+ if ($version <= 9) {
+ $l = 0;
+ } else if ($version <= 26) {
+ $l = 1;
+ } else {
+ $l = 2;
+ }
+
+ return self::$lengthTableBits[$mode][$l];
+ }
+
+ //----------------------------------------------------------------------
+ public static function maximumWords($mode, $version)
+ {
+ if($mode == QR_MODE_STRUCTURE)
+ return 3;
+
+ if($version <= 9) {
+ $l = 0;
+ } else if($version <= 26) {
+ $l = 1;
+ } else {
+ $l = 2;
+ }
+
+ $bits = self::$lengthTableBits[$mode][$l];
+ $words = (1 << $bits) - 1;
+
+ if($mode == QR_MODE_KANJI) {
+ $words *= 2; // the number of bytes is required
+ }
+
+ return $words;
+ }
+
+ // Error correction code -----------------------------------------------
+ // Table of the error correction code (Reed-Solomon block)
+ // See Table 12-16 (pp.30-36), JIS X0510:2004.
+
+ public static $eccTable = array(
+ array(array( 0, 0), array( 0, 0), array( 0, 0), array( 0, 0)),
+ array(array( 1, 0), array( 1, 0), array( 1, 0), array( 1, 0)), // 1
+ array(array( 1, 0), array( 1, 0), array( 1, 0), array( 1, 0)),
+ array(array( 1, 0), array( 1, 0), array( 2, 0), array( 2, 0)),
+ array(array( 1, 0), array( 2, 0), array( 2, 0), array( 4, 0)),
+ array(array( 1, 0), array( 2, 0), array( 2, 2), array( 2, 2)), // 5
+ array(array( 2, 0), array( 4, 0), array( 4, 0), array( 4, 0)),
+ array(array( 2, 0), array( 4, 0), array( 2, 4), array( 4, 1)),
+ array(array( 2, 0), array( 2, 2), array( 4, 2), array( 4, 2)),
+ array(array( 2, 0), array( 3, 2), array( 4, 4), array( 4, 4)),
+ array(array( 2, 2), array( 4, 1), array( 6, 2), array( 6, 2)), //10
+ array(array( 4, 0), array( 1, 4), array( 4, 4), array( 3, 8)),
+ array(array( 2, 2), array( 6, 2), array( 4, 6), array( 7, 4)),
+ array(array( 4, 0), array( 8, 1), array( 8, 4), array(12, 4)),
+ array(array( 3, 1), array( 4, 5), array(11, 5), array(11, 5)),
+ array(array( 5, 1), array( 5, 5), array( 5, 7), array(11, 7)), //15
+ array(array( 5, 1), array( 7, 3), array(15, 2), array( 3, 13)),
+ array(array( 1, 5), array(10, 1), array( 1, 15), array( 2, 17)),
+ array(array( 5, 1), array( 9, 4), array(17, 1), array( 2, 19)),
+ array(array( 3, 4), array( 3, 11), array(17, 4), array( 9, 16)),
+ array(array( 3, 5), array( 3, 13), array(15, 5), array(15, 10)), //20
+ array(array( 4, 4), array(17, 0), array(17, 6), array(19, 6)),
+ array(array( 2, 7), array(17, 0), array( 7, 16), array(34, 0)),
+ array(array( 4, 5), array( 4, 14), array(11, 14), array(16, 14)),
+ array(array( 6, 4), array( 6, 14), array(11, 16), array(30, 2)),
+ array(array( 8, 4), array( 8, 13), array( 7, 22), array(22, 13)), //25
+ array(array(10, 2), array(19, 4), array(28, 6), array(33, 4)),
+ array(array( 8, 4), array(22, 3), array( 8, 26), array(12, 28)),
+ array(array( 3, 10), array( 3, 23), array( 4, 31), array(11, 31)),
+ array(array( 7, 7), array(21, 7), array( 1, 37), array(19, 26)),
+ array(array( 5, 10), array(19, 10), array(15, 25), array(23, 25)), //30
+ array(array(13, 3), array( 2, 29), array(42, 1), array(23, 28)),
+ array(array(17, 0), array(10, 23), array(10, 35), array(19, 35)),
+ array(array(17, 1), array(14, 21), array(29, 19), array(11, 46)),
+ array(array(13, 6), array(14, 23), array(44, 7), array(59, 1)),
+ array(array(12, 7), array(12, 26), array(39, 14), array(22, 41)), //35
+ array(array( 6, 14), array( 6, 34), array(46, 10), array( 2, 64)),
+ array(array(17, 4), array(29, 14), array(49, 10), array(24, 46)),
+ array(array( 4, 18), array(13, 32), array(48, 14), array(42, 32)),
+ array(array(20, 4), array(40, 7), array(43, 22), array(10, 67)),
+ array(array(19, 6), array(18, 31), array(34, 34), array(20, 61)),//40
+ );
+
+ //----------------------------------------------------------------------
+ // CACHEABLE!!!
+
+ public static function getEccSpec($version, $level, array &$spec)
+ {
+ if (count($spec) < 5) {
+ $spec = array(0,0,0,0,0);
+ }
+
+ $b1 = self::$eccTable[$version][$level][0];
+ $b2 = self::$eccTable[$version][$level][1];
+ $data = self::getDataLength($version, $level);
+ $ecc = self::getECCLength($version, $level);
+
+ if($b2 == 0) {
+ $spec[0] = $b1;
+ $spec[1] = (int)($data / $b1);
+ $spec[2] = (int)($ecc / $b1);
+ $spec[3] = 0;
+ $spec[4] = 0;
+ } else {
+ $spec[0] = $b1;
+ $spec[1] = (int)($data / ($b1 + $b2));
+ $spec[2] = (int)($ecc / ($b1 + $b2));
+ $spec[3] = $b2;
+ $spec[4] = $spec[1] + 1;
+ }
+ }
+
+ // Alignment pattern ---------------------------------------------------
+
+ // Positions of alignment patterns.
+ // This array includes only the second and the third position of the
+ // alignment patterns. Rest of them can be calculated from the distance
+ // between them.
+
+ // See Table 1 in Appendix E (pp.71) of JIS X0510:2004.
+
+ public static $alignmentPattern = array(
+ array( 0, 0),
+ array( 0, 0), array(18, 0), array(22, 0), array(26, 0), array(30, 0), // 1- 5
+ array(34, 0), array(22, 38), array(24, 42), array(26, 46), array(28, 50), // 6-10
+ array(30, 54), array(32, 58), array(34, 62), array(26, 46), array(26, 48), //11-15
+ array(26, 50), array(30, 54), array(30, 56), array(30, 58), array(34, 62), //16-20
+ array(28, 50), array(26, 50), array(30, 54), array(28, 54), array(32, 58), //21-25
+ array(30, 58), array(34, 62), array(26, 50), array(30, 54), array(26, 52), //26-30
+ array(30, 56), array(34, 60), array(30, 58), array(34, 62), array(30, 54), //31-35
+ array(24, 50), array(28, 54), array(32, 58), array(26, 54), array(30, 58), //35-40
+ );
+
+
+ /** --------------------------------------------------------------------
+ * Put an alignment marker.
+ * @param frame
+ * @param width
+ * @param ox,oy center coordinate of the pattern
+ */
+ public static function putAlignmentMarker(array &$frame, $ox, $oy)
+ {
+ $finder = array(
+ "\xa1\xa1\xa1\xa1\xa1",
+ "\xa1\xa0\xa0\xa0\xa1",
+ "\xa1\xa0\xa1\xa0\xa1",
+ "\xa1\xa0\xa0\xa0\xa1",
+ "\xa1\xa1\xa1\xa1\xa1"
+ );
+
+ $yStart = $oy-2;
+ $xStart = $ox-2;
+
+ for($y=0; $y<5; $y++) {
+ QRstr::set($frame, $xStart, $yStart+$y, $finder[$y]);
+ }
+ }
+
+ //----------------------------------------------------------------------
+ public static function putAlignmentPattern($version, &$frame, $width)
+ {
+ if($version < 2)
+ return;
+
+ $d = self::$alignmentPattern[$version][1] - self::$alignmentPattern[$version][0];
+ if($d < 0) {
+ $w = 2;
+ } else {
+ $w = (int)(($width - self::$alignmentPattern[$version][0]) / $d + 2);
+ }
+
+ if($w * $w - 3 == 1) {
+ $x = self::$alignmentPattern[$version][0];
+ $y = self::$alignmentPattern[$version][0];
+ self::putAlignmentMarker($frame, $x, $y);
+ return;
+ }
+
+ $cx = self::$alignmentPattern[$version][0];
+ for($x=1; $x<$w - 1; $x++) {
+ self::putAlignmentMarker($frame, 6, $cx);
+ self::putAlignmentMarker($frame, $cx, 6);
+ $cx += $d;
+ }
+
+ $cy = self::$alignmentPattern[$version][0];
+ for($y=0; $y<$w-1; $y++) {
+ $cx = self::$alignmentPattern[$version][0];
+ for($x=0; $x<$w-1; $x++) {
+ self::putAlignmentMarker($frame, $cx, $cy);
+ $cx += $d;
+ }
+ $cy += $d;
+ }
+ }
+
+ // Version information pattern -----------------------------------------
+
+ // Version information pattern (BCH coded).
+ // See Table 1 in Appendix D (pp.68) of JIS X0510:2004.
+
+ // size: [QRSPEC_VERSION_MAX - 6]
+
+ public static $versionPattern = array(
+ 0x07c94, 0x085bc, 0x09a99, 0x0a4d3, 0x0bbf6, 0x0c762, 0x0d847, 0x0e60d,
+ 0x0f928, 0x10b78, 0x1145d, 0x12a17, 0x13532, 0x149a6, 0x15683, 0x168c9,
+ 0x177ec, 0x18ec4, 0x191e1, 0x1afab, 0x1b08e, 0x1cc1a, 0x1d33f, 0x1ed75,
+ 0x1f250, 0x209d5, 0x216f0, 0x228ba, 0x2379f, 0x24b0b, 0x2542e, 0x26a64,
+ 0x27541, 0x28c69
+ );
+
+ //----------------------------------------------------------------------
+ public static function getVersionPattern($version)
+ {
+ if($version < 7 || $version > QRSPEC_VERSION_MAX)
+ return 0;
+
+ return self::$versionPattern[$version -7];
+ }
+
+ // Format information --------------------------------------------------
+ // See calcFormatInfo in tests/test_qrspec.c (orginal qrencode c lib)
+
+ public static $formatInfo = array(
+ array(0x77c4, 0x72f3, 0x7daa, 0x789d, 0x662f, 0x6318, 0x6c41, 0x6976),
+ array(0x5412, 0x5125, 0x5e7c, 0x5b4b, 0x45f9, 0x40ce, 0x4f97, 0x4aa0),
+ array(0x355f, 0x3068, 0x3f31, 0x3a06, 0x24b4, 0x2183, 0x2eda, 0x2bed),
+ array(0x1689, 0x13be, 0x1ce7, 0x19d0, 0x0762, 0x0255, 0x0d0c, 0x083b)
+ );
+
+ public static function getFormatInfo($mask, $level)
+ {
+ if($mask < 0 || $mask > 7)
+ return 0;
+
+ if($level < 0 || $level > 3)
+ return 0;
+
+ return self::$formatInfo[$level][$mask];
+ }
+
+ // Frame ---------------------------------------------------------------
+ // Cache of initial frames.
+
+ public static $frames = array();
+
+ /** --------------------------------------------------------------------
+ * Put a finder pattern.
+ * @param frame
+ * @param width
+ * @param ox,oy upper-left coordinate of the pattern
+ */
+ public static function putFinderPattern(&$frame, $ox, $oy)
+ {
+ $finder = array(
+ "\xc1\xc1\xc1\xc1\xc1\xc1\xc1",
+ "\xc1\xc0\xc0\xc0\xc0\xc0\xc1",
+ "\xc1\xc0\xc1\xc1\xc1\xc0\xc1",
+ "\xc1\xc0\xc1\xc1\xc1\xc0\xc1",
+ "\xc1\xc0\xc1\xc1\xc1\xc0\xc1",
+ "\xc1\xc0\xc0\xc0\xc0\xc0\xc1",
+ "\xc1\xc1\xc1\xc1\xc1\xc1\xc1"
+ );
+
+ for($y=0; $y<7; $y++) {
+ QRstr::set($frame, $ox, $oy+$y, $finder[$y]);
+ }
+ }
+
+ //----------------------------------------------------------------------
+ public static function createFrame($version)
+ {
+ $width = self::$capacity[$version][QRCAP_WIDTH];
+ $frameLine = str_repeat ("\0", $width);
+ $frame = array_fill(0, $width, $frameLine);
+
+ // Finder pattern
+ self::putFinderPattern($frame, 0, 0);
+ self::putFinderPattern($frame, $width - 7, 0);
+ self::putFinderPattern($frame, 0, $width - 7);
+
+ // Separator
+ $yOffset = $width - 7;
+
+ for($y=0; $y<7; $y++) {
+ $frame[$y][7] = "\xc0";
+ $frame[$y][$width - 8] = "\xc0";
+ $frame[$yOffset][7] = "\xc0";
+ $yOffset++;
+ }
+
+ $setPattern = str_repeat("\xc0", 8);
+
+ QRstr::set($frame, 0, 7, $setPattern);
+ QRstr::set($frame, $width-8, 7, $setPattern);
+ QRstr::set($frame, 0, $width - 8, $setPattern);
+
+ // Format info
+ $setPattern = str_repeat("\x84", 9);
+ QRstr::set($frame, 0, 8, $setPattern);
+ QRstr::set($frame, $width - 8, 8, $setPattern, 8);
+
+ $yOffset = $width - 8;
+
+ for($y=0; $y<8; $y++,$yOffset++) {
+ $frame[$y][8] = "\x84";
+ $frame[$yOffset][8] = "\x84";
+ }
+
+ // Timing pattern
+
+ for($i=1; $i<$width-15; $i++) {
+ $frame[6][7+$i] = chr(0x90 | ($i & 1));
+ $frame[7+$i][6] = chr(0x90 | ($i & 1));
+ }
+
+ // Alignment pattern
+ self::putAlignmentPattern($version, $frame, $width);
+
+ // Version information
+ if($version >= 7) {
+ $vinf = self::getVersionPattern($version);
+
+ $v = $vinf;
+
+ for($x=0; $x<6; $x++) {
+ for($y=0; $y<3; $y++) {
+ $frame[($width - 11)+$y][$x] = chr(0x88 | ($v & 1));
+ $v = $v >> 1;
+ }
+ }
+
+ $v = $vinf;
+ for($y=0; $y<6; $y++) {
+ for($x=0; $x<3; $x++) {
+ $frame[$y][$x+($width - 11)] = chr(0x88 | ($v & 1));
+ $v = $v >> 1;
+ }
+ }
+ }
+
+ // and a little bit...
+ $frame[$width - 8][8] = "\x81";
+
+ return $frame;
+ }
+
+ //----------------------------------------------------------------------
+ public static function debug($frame, $binary_mode = false)
+ {
+ if ($binary_mode) {
+
+ foreach ($frame as &$frameLine) {
+ $frameLine = join('<span class="m">&nbsp;&nbsp;</span>', explode('0', $frameLine));
+ $frameLine = join('&#9608;&#9608;', explode('1', $frameLine));
+ }
+
+ ?>
+ <style>
+ .m { background-color: white; }
+ </style>
+ <?php
+ echo '<pre><tt><br/ ><br/ ><br/ >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;';
+ echo join("<br/ >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;", $frame);
+ echo '</tt></pre><br/ ><br/ ><br/ ><br/ ><br/ ><br/ >';
+
+ } else {
+
+ foreach ($frame as &$frameLine) {
+ $frameLine = join('<span class="m">&nbsp;</span>', explode("\xc0", $frameLine));
+ $frameLine = join('<span class="m">&#9618;</span>', explode("\xc1", $frameLine));
+ $frameLine = join('<span class="p">&nbsp;</span>', explode("\xa0", $frameLine));
+ $frameLine = join('<span class="p">&#9618;</span>', explode("\xa1", $frameLine));
+ $frameLine = join('<span class="s">&#9671;</span>', explode("\x84", $frameLine)); //format 0
+ $frameLine = join('<span class="s">&#9670;</span>', explode("\x85", $frameLine)); //format 1
+ $frameLine = join('<span class="x">&#9762;</span>', explode("\x81", $frameLine)); //special bit
+ $frameLine = join('<span class="c">&nbsp;</span>', explode("\x90", $frameLine)); //clock 0
+ $frameLine = join('<span class="c">&#9719;</span>', explode("\x91", $frameLine)); //clock 1
+ $frameLine = join('<span class="f">&nbsp;</span>', explode("\x88", $frameLine)); //version
+ $frameLine = join('<span class="f">&#9618;</span>', explode("\x89", $frameLine)); //version
+ $frameLine = join('&#9830;', explode("\x01", $frameLine));
+ $frameLine = join('&#8901;', explode("\0", $frameLine));
+ }
+
+ ?>
+ <style>
+ .p { background-color: yellow; }
+ .m { background-color: #00FF00; }
+ .s { background-color: #FF0000; }
+ .c { background-color: aqua; }
+ .x { background-color: pink; }
+ .f { background-color: gold; }
+ </style>
+ <?php
+ echo "<pre><tt>";
+ echo join("<br/ >", $frame);
+ echo "</tt></pre>";
+
+ }
+ }
+
+ //----------------------------------------------------------------------
+ public static function serial($frame)
+ {
+ return gzcompress(join("\n", $frame), 9);
+ }
+
+ //----------------------------------------------------------------------
+ public static function unserial($code)
+ {
+ return explode("\n", gzuncompress($code));
+ }
+
+ //----------------------------------------------------------------------
+ public static function newFrame($version)
+ {
+ if($version < 1 || $version > QRSPEC_VERSION_MAX)
+ return null;
+
+ if(!isset(self::$frames[$version])) {
+
+ $fileName = QR_CACHE_DIR.'frame_'.$version.'.dat';
+
+ if (QR_CACHEABLE) {
+ if (file_exists($fileName)) {
+ self::$frames[$version] = self::unserial(file_get_contents($fileName));
+ } else {
+ self::$frames[$version] = self::createFrame($version);
+ file_put_contents($fileName, self::serial(self::$frames[$version]));
+ }
+ } else {
+ self::$frames[$version] = self::createFrame($version);
+ }
+ }
+
+ if(is_null(self::$frames[$version]))
+ return null;
+
+ return self::$frames[$version];
+ }
+
+ //----------------------------------------------------------------------
+ public static function rsBlockNum($spec) { return $spec[0] + $spec[3]; }
+ public static function rsBlockNum1($spec) { return $spec[0]; }
+ public static function rsDataCodes1($spec) { return $spec[1]; }
+ public static function rsEccCodes1($spec) { return $spec[2]; }
+ public static function rsBlockNum2($spec) { return $spec[3]; }
+ public static function rsDataCodes2($spec) { return $spec[4]; }
+ public static function rsEccCodes2($spec) { return $spec[2]; }
+ public static function rsDataLength($spec) { return ($spec[0] * $spec[1]) + ($spec[3] * $spec[4]); }
+ public static function rsEccLength($spec) { return ($spec[0] + $spec[3]) * $spec[2]; }
+
+ } \ No newline at end of file
diff --git a/library/phpqrcode/qrsplit.php b/library/phpqrcode/qrsplit.php
new file mode 100644
index 000000000..d75b82737
--- /dev/null
+++ b/library/phpqrcode/qrsplit.php
@@ -0,0 +1,311 @@
+<?php
+/*
+ * PHP QR Code encoder
+ *
+ * Input splitting classes
+ *
+ * Based on libqrencode C library distributed under LGPL 2.1
+ * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi <fukuchi@megaui.net>
+ *
+ * PHP QR Code is distributed under LGPL 3
+ * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
+ *
+ * The following data / specifications are taken from
+ * "Two dimensional symbol -- QR-code -- Basic Specification" (JIS X0510:2004)
+ * or
+ * "Automatic identification and data capture techniques --
+ * QR Code 2005 bar code symbology specification" (ISO/IEC 18004:2006)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+ class QRsplit {
+
+ public $dataStr = '';
+ public $input;
+ public $modeHint;
+
+ //----------------------------------------------------------------------
+ public function __construct($dataStr, $input, $modeHint)
+ {
+ $this->dataStr = $dataStr;
+ $this->input = $input;
+ $this->modeHint = $modeHint;
+ }
+
+ //----------------------------------------------------------------------
+ public static function isdigitat($str, $pos)
+ {
+ if ($pos >= strlen($str))
+ return false;
+
+ return ((ord($str[$pos]) >= ord('0'))&&(ord($str[$pos]) <= ord('9')));
+ }
+
+ //----------------------------------------------------------------------
+ public static function isalnumat($str, $pos)
+ {
+ if ($pos >= strlen($str))
+ return false;
+
+ return (QRinput::lookAnTable(ord($str[$pos])) >= 0);
+ }
+
+ //----------------------------------------------------------------------
+ public function identifyMode($pos)
+ {
+ if ($pos >= strlen($this->dataStr))
+ return QR_MODE_NUL;
+
+ $c = $this->dataStr[$pos];
+
+ if(self::isdigitat($this->dataStr, $pos)) {
+ return QR_MODE_NUM;
+ } else if(self::isalnumat($this->dataStr, $pos)) {
+ return QR_MODE_AN;
+ } else if($this->modeHint == QR_MODE_KANJI) {
+
+ if ($pos+1 < strlen($this->dataStr))
+ {
+ $d = $this->dataStr[$pos+1];
+ $word = (ord($c) << 8) | ord($d);
+ if(($word >= 0x8140 && $word <= 0x9ffc) || ($word >= 0xe040 && $word <= 0xebbf)) {
+ return QR_MODE_KANJI;
+ }
+ }
+ }
+
+ return QR_MODE_8;
+ }
+
+ //----------------------------------------------------------------------
+ public function eatNum()
+ {
+ $ln = QRspec::lengthIndicator(QR_MODE_NUM, $this->input->getVersion());
+
+ $p = 0;
+ while(self::isdigitat($this->dataStr, $p)) {
+ $p++;
+ }
+
+ $run = $p;
+ $mode = $this->identifyMode($p);
+
+ if($mode == QR_MODE_8) {
+ $dif = QRinput::estimateBitsModeNum($run) + 4 + $ln
+ + QRinput::estimateBitsMode8(1) // + 4 + l8
+ - QRinput::estimateBitsMode8($run + 1); // - 4 - l8
+ if($dif > 0) {
+ return $this->eat8();
+ }
+ }
+ if($mode == QR_MODE_AN) {
+ $dif = QRinput::estimateBitsModeNum($run) + 4 + $ln
+ + QRinput::estimateBitsModeAn(1) // + 4 + la
+ - QRinput::estimateBitsModeAn($run + 1);// - 4 - la
+ if($dif > 0) {
+ return $this->eatAn();
+ }
+ }
+
+ $ret = $this->input->append(QR_MODE_NUM, $run, str_split($this->dataStr));
+ if($ret < 0)
+ return -1;
+
+ return $run;
+ }
+
+ //----------------------------------------------------------------------
+ public function eatAn()
+ {
+ $la = QRspec::lengthIndicator(QR_MODE_AN, $this->input->getVersion());
+ $ln = QRspec::lengthIndicator(QR_MODE_NUM, $this->input->getVersion());
+
+ $p = 0;
+
+ while(self::isalnumat($this->dataStr, $p)) {
+ if(self::isdigitat($this->dataStr, $p)) {
+ $q = $p;
+ while(self::isdigitat($this->dataStr, $q)) {
+ $q++;
+ }
+
+ $dif = QRinput::estimateBitsModeAn($p) // + 4 + la
+ + QRinput::estimateBitsModeNum($q - $p) + 4 + $ln
+ - QRinput::estimateBitsModeAn($q); // - 4 - la
+
+ if($dif < 0) {
+ break;
+ } else {
+ $p = $q;
+ }
+ } else {
+ $p++;
+ }
+ }
+
+ $run = $p;
+
+ if(!self::isalnumat($this->dataStr, $p)) {
+ $dif = QRinput::estimateBitsModeAn($run) + 4 + $la
+ + QRinput::estimateBitsMode8(1) // + 4 + l8
+ - QRinput::estimateBitsMode8($run + 1); // - 4 - l8
+ if($dif > 0) {
+ return $this->eat8();
+ }
+ }
+
+ $ret = $this->input->append(QR_MODE_AN, $run, str_split($this->dataStr));
+ if($ret < 0)
+ return -1;
+
+ return $run;
+ }
+
+ //----------------------------------------------------------------------
+ public function eatKanji()
+ {
+ $p = 0;
+
+ while($this->identifyMode($p) == QR_MODE_KANJI) {
+ $p += 2;
+ }
+
+ $ret = $this->input->append(QR_MODE_KANJI, $p, str_split($this->dataStr));
+ if($ret < 0)
+ return -1;
+
+ return $run;
+ }
+
+ //----------------------------------------------------------------------
+ public function eat8()
+ {
+ $la = QRspec::lengthIndicator(QR_MODE_AN, $this->input->getVersion());
+ $ln = QRspec::lengthIndicator(QR_MODE_NUM, $this->input->getVersion());
+
+ $p = 1;
+ $dataStrLen = strlen($this->dataStr);
+
+ while($p < $dataStrLen) {
+
+ $mode = $this->identifyMode($p);
+ if($mode == QR_MODE_KANJI) {
+ break;
+ }
+ if($mode == QR_MODE_NUM) {
+ $q = $p;
+ while(self::isdigitat($this->dataStr, $q)) {
+ $q++;
+ }
+ $dif = QRinput::estimateBitsMode8($p) // + 4 + l8
+ + QRinput::estimateBitsModeNum($q - $p) + 4 + $ln
+ - QRinput::estimateBitsMode8($q); // - 4 - l8
+ if($dif < 0) {
+ break;
+ } else {
+ $p = $q;
+ }
+ } else if($mode == QR_MODE_AN) {
+ $q = $p;
+ while(self::isalnumat($this->dataStr, $q)) {
+ $q++;
+ }
+ $dif = QRinput::estimateBitsMode8($p) // + 4 + l8
+ + QRinput::estimateBitsModeAn($q - $p) + 4 + $la
+ - QRinput::estimateBitsMode8($q); // - 4 - l8
+ if($dif < 0) {
+ break;
+ } else {
+ $p = $q;
+ }
+ } else {
+ $p++;
+ }
+ }
+
+ $run = $p;
+ $ret = $this->input->append(QR_MODE_8, $run, str_split($this->dataStr));
+
+ if($ret < 0)
+ return -1;
+
+ return $run;
+ }
+
+ //----------------------------------------------------------------------
+ public function splitString()
+ {
+ while (strlen($this->dataStr) > 0)
+ {
+ if($this->dataStr == '')
+ return 0;
+
+ $mode = $this->identifyMode(0);
+
+ switch ($mode) {
+ case QR_MODE_NUM: $length = $this->eatNum(); break;
+ case QR_MODE_AN: $length = $this->eatAn(); break;
+ case QR_MODE_KANJI:
+ if ($hint == QR_MODE_KANJI)
+ $length = $this->eatKanji();
+ else $length = $this->eat8();
+ break;
+ default: $length = $this->eat8(); break;
+
+ }
+
+ if($length == 0) return 0;
+ if($length < 0) return -1;
+
+ $this->dataStr = substr($this->dataStr, $length);
+ }
+ }
+
+ //----------------------------------------------------------------------
+ public function toUpper()
+ {
+ $stringLen = strlen($this->dataStr);
+ $p = 0;
+
+ while ($p<$stringLen) {
+ $mode = self::identifyMode(substr($this->dataStr, $p), $this->modeHint);
+ if($mode == QR_MODE_KANJI) {
+ $p += 2;
+ } else {
+ if (ord($this->dataStr[$p]) >= ord('a') && ord($this->dataStr[$p]) <= ord('z')) {
+ $this->dataStr[$p] = chr(ord($this->dataStr[$p]) - 32);
+ }
+ $p++;
+ }
+ }
+
+ return $this->dataStr;
+ }
+
+ //----------------------------------------------------------------------
+ public static function splitStringToQRinput($string, QRinput $input, $modeHint, $casesensitive = true)
+ {
+ if(is_null($string) || $string == '\0' || $string == '') {
+ throw new Exception('empty string!!!');
+ }
+
+ $split = new QRsplit($string, $input, $modeHint);
+
+ if(!$casesensitive)
+ $split->toUpper();
+
+ return $split->splitString();
+ }
+ } \ No newline at end of file
diff --git a/library/phpqrcode/qrtools.php b/library/phpqrcode/qrtools.php
new file mode 100644
index 000000000..3012db493
--- /dev/null
+++ b/library/phpqrcode/qrtools.php
@@ -0,0 +1,172 @@
+<?php
+/*
+ * PHP QR Code encoder
+ *
+ * Toolset, handy and debug utilites.
+ *
+ * PHP QR Code is distributed under LGPL 3
+ * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+ class QRtools {
+
+ //----------------------------------------------------------------------
+ public static function binarize($frame)
+ {
+ $len = count($frame);
+ foreach ($frame as &$frameLine) {
+
+ for($i=0; $i<$len; $i++) {
+ $frameLine[$i] = (ord($frameLine[$i])&1)?'1':'0';
+ }
+ }
+
+ return $frame;
+ }
+
+ //----------------------------------------------------------------------
+ public static function tcpdfBarcodeArray($code, $mode = 'QR,L', $tcPdfVersion = '4.5.037')
+ {
+ $barcode_array = array();
+
+ if (!is_array($mode))
+ $mode = explode(',', $mode);
+
+ $eccLevel = 'L';
+
+ if (count($mode) > 1) {
+ $eccLevel = $mode[1];
+ }
+
+ $qrTab = QRcode::text($code, false, $eccLevel);
+ $size = count($qrTab);
+
+ $barcode_array['num_rows'] = $size;
+ $barcode_array['num_cols'] = $size;
+ $barcode_array['bcode'] = array();
+
+ foreach ($qrTab as $line) {
+ $arrAdd = array();
+ foreach(str_split($line) as $char)
+ $arrAdd[] = ($char=='1')?1:0;
+ $barcode_array['bcode'][] = $arrAdd;
+ }
+
+ return $barcode_array;
+ }
+
+ //----------------------------------------------------------------------
+ public static function clearCache()
+ {
+ self::$frames = array();
+ }
+
+ //----------------------------------------------------------------------
+ public static function buildCache()
+ {
+ QRtools::markTime('before_build_cache');
+
+ $mask = new QRmask();
+ for ($a=1; $a <= QRSPEC_VERSION_MAX; $a++) {
+ $frame = QRspec::newFrame($a);
+ if (QR_IMAGE) {
+ $fileName = QR_CACHE_DIR.'frame_'.$a.'.png';
+ QRimage::png(self::binarize($frame), $fileName, 1, 0);
+ }
+
+ $width = count($frame);
+ $bitMask = array_fill(0, $width, array_fill(0, $width, 0));
+ for ($maskNo=0; $maskNo<8; $maskNo++)
+ $mask->makeMaskNo($maskNo, $width, $frame, $bitMask, true);
+ }
+
+ QRtools::markTime('after_build_cache');
+ }
+
+ //----------------------------------------------------------------------
+ public static function log($outfile, $err)
+ {
+ if (QR_LOG_DIR !== false) {
+ if ($err != '') {
+ if ($outfile !== false) {
+ file_put_contents(QR_LOG_DIR.basename($outfile).'-errors.txt', date('Y-m-d H:i:s').': '.$err, FILE_APPEND);
+ } else {
+ file_put_contents(QR_LOG_DIR.'errors.txt', date('Y-m-d H:i:s').': '.$err, FILE_APPEND);
+ }
+ }
+ }
+ }
+
+ //----------------------------------------------------------------------
+ public static function dumpMask($frame)
+ {
+ $width = count($frame);
+ for($y=0;$y<$width;$y++) {
+ for($x=0;$x<$width;$x++) {
+ echo ord($frame[$y][$x]).',';
+ }
+ }
+ }
+
+ //----------------------------------------------------------------------
+ public static function markTime($markerId)
+ {
+ list($usec, $sec) = explode(" ", microtime());
+ $time = ((float)$usec + (float)$sec);
+
+ if (!isset($GLOBALS['qr_time_bench']))
+ $GLOBALS['qr_time_bench'] = array();
+
+ $GLOBALS['qr_time_bench'][$markerId] = $time;
+ }
+
+ //----------------------------------------------------------------------
+ public static function timeBenchmark()
+ {
+ self::markTime('finish');
+
+ $lastTime = 0;
+ $startTime = 0;
+ $p = 0;
+
+ echo '<table cellpadding="3" cellspacing="1">
+ <thead><tr style="border-bottom:1px solid silver"><td colspan="2" style="text-align:center">BENCHMARK</td></tr></thead>
+ <tbody>';
+
+ foreach($GLOBALS['qr_time_bench'] as $markerId=>$thisTime) {
+ if ($p > 0) {
+ echo '<tr><th style="text-align:right">till '.$markerId.': </th><td>'.number_format($thisTime-$lastTime, 6).'s</td></tr>';
+ } else {
+ $startTime = $thisTime;
+ }
+
+ $p++;
+ $lastTime = $thisTime;
+ }
+
+ echo '</tbody><tfoot>
+ <tr style="border-top:2px solid black"><th style="text-align:right">TOTAL: </th><td>'.number_format($lastTime-$startTime, 6).'s</td></tr>
+ </tfoot>
+ </table>';
+ }
+
+ }
+
+ //##########################################################################
+
+ QRtools::markTime('start');
+ \ No newline at end of file
diff --git a/library/phpqrcode/tools/merge.bat b/library/phpqrcode/tools/merge.bat
new file mode 100644
index 000000000..b60a4853c
--- /dev/null
+++ b/library/phpqrcode/tools/merge.bat
@@ -0,0 +1,2 @@
+php ./merge.php
+pause \ No newline at end of file
diff --git a/library/phpqrcode/tools/merge.php b/library/phpqrcode/tools/merge.php
new file mode 100644
index 000000000..19d338b34
--- /dev/null
+++ b/library/phpqrcode/tools/merge.php
@@ -0,0 +1,70 @@
+<?php
+
+/*
+ * PHP QR Code encoder
+ *
+ * Tool for merging all library files into one, simpler to incorporate.
+ *
+ * MAKE SURE THAT RESULTING PHPQRCode.php (and its dir) ARE WRITABLE!
+ *
+ * PHP QR Code is distributed under LGPL 3
+ * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+ $QR_BASEDIR = dirname(__FILE__).DIRECTORY_SEPARATOR.'..'.DIRECTORY_SEPARATOR;
+ $QR_TOOLSDIR = dirname(__FILE__).DIRECTORY_SEPARATOR;
+
+ $outputFile = $QR_BASEDIR.'phpqrcode.php';
+
+ // Required libs
+
+ $fileList = array(
+ $QR_BASEDIR.'qrconst.php',
+ $QR_TOOLSDIR.'merged_config.php',
+ $QR_BASEDIR.'qrtools.php',
+ $QR_BASEDIR.'qrspec.php',
+ $QR_BASEDIR.'qrimage.php',
+ $QR_BASEDIR.'qrinput.php',
+ $QR_BASEDIR.'qrbitstream.php',
+ $QR_BASEDIR.'qrsplit.php',
+ $QR_BASEDIR.'qrrscode.php',
+ $QR_BASEDIR.'qrmask.php',
+ $QR_BASEDIR.'qrencode.php'
+ );
+
+ $headerFile = $QR_TOOLSDIR.'merged_header.php';
+ $versionFile = $QR_BASEDIR.'VERSION';
+
+ $outputCode = '';
+
+ foreach($fileList as $fileName) {
+ $outputCode .= "\n\n".'//---- '.basename($fileName).' -----------------------------'."\n\n";
+ $anotherCode = file_get_contents($fileName);
+ $anotherCode = preg_replace ('/^<\?php/', '', $anotherCode);
+ $anotherCode = preg_replace ('/\?>\*$/', '', $anotherCode);
+ $outputCode .= "\n\n".$anotherCode."\n\n";
+ }
+
+ $versionDataEx = explode("\n", file_get_contents($versionFile));
+
+ $outputContents = file_get_contents($headerFile);
+ $outputContents .= "\n\n/*\n * Version: ".trim($versionDataEx[0])."\n * Build: ".trim($versionDataEx[1])."\n */\n\n";
+ $outputContents .= $outputCode;
+
+ file_put_contents($outputFile, $outputContents);
+
+ \ No newline at end of file
diff --git a/library/phpqrcode/tools/merge.sh b/library/phpqrcode/tools/merge.sh
new file mode 100644
index 000000000..e4c2fbcb8
--- /dev/null
+++ b/library/phpqrcode/tools/merge.sh
@@ -0,0 +1,2 @@
+#!/bin/sh
+php ./merge.php \ No newline at end of file
diff --git a/library/phpqrcode/tools/merged_config.php b/library/phpqrcode/tools/merged_config.php
new file mode 100644
index 000000000..55ddb4506
--- /dev/null
+++ b/library/phpqrcode/tools/merged_config.php
@@ -0,0 +1,17 @@
+<?php
+/*
+ * PHP QR Code encoder
+ *
+ * Config file, tuned-up for merged verion
+ */
+
+ define('QR_CACHEABLE', false); // use cache - more disk reads but less CPU power, masks and format templates are stored there
+ define('QR_CACHE_DIR', false); // used when QR_CACHEABLE === true
+ define('QR_LOG_DIR', false); // default error logs dir
+
+ define('QR_FIND_BEST_MASK', true); // if true, estimates best mask (spec. default, but extremally slow; set to false to significant performance boost but (propably) worst quality code
+ define('QR_FIND_FROM_RANDOM', 2); // if false, checks all masks available, otherwise value tells count of masks need to be checked, mask id are got randomly
+ define('QR_DEFAULT_MASK', 2); // when QR_FIND_BEST_MASK === false
+
+ define('QR_PNG_MAXIMUM_SIZE', 1024); // maximum allowed png image width (in pixels), tune to make sure GD and PHP can handle such big images
+ \ No newline at end of file
diff --git a/library/phpqrcode/tools/merged_header.php b/library/phpqrcode/tools/merged_header.php
new file mode 100644
index 000000000..25805e564
--- /dev/null
+++ b/library/phpqrcode/tools/merged_header.php
@@ -0,0 +1,36 @@
+<?php
+
+/*
+ * PHP QR Code encoder
+ *
+ * This file contains MERGED version of PHP QR Code library.
+ * It was auto-generated from full version for your convenience.
+ *
+ * This merged version was configured to not requre any external files,
+ * with disabled cache, error loging and weker but faster mask matching.
+ * If you need tune it up please use non-merged version.
+ *
+ * For full version, documentation, examples of use please visit:
+ *
+ * http://phpqrcode.sourceforge.net/
+ * https://sourceforge.net/projects/phpqrcode/
+ *
+ * PHP QR Code is distributed under LGPL 3
+ * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+ \ No newline at end of file
diff --git a/library/prettyphoto/README b/library/prettyphoto/README
new file mode 100755
index 000000000..1e5684253
--- /dev/null
+++ b/library/prettyphoto/README
@@ -0,0 +1,30 @@
+prettyPhoto v3.1.4
+© Copyright, Stephane Caron
+http://www.no-margin-for-errors.com
+
+
+============================= Released under =============================
+
+Creative Commons 2.5
+http://creativecommons.org/licenses/by/2.5/
+
+OR
+
+GPLV2 license
+http://www.gnu.org/licenses/gpl-2.0.html
+
+You are free to use prettyPhoto in commercial projects as long as the
+copyright header is left intact.
+
+============================ More information ============================
+http://www.no-margin-for-errors.com/projects/prettyPhoto/
+
+
+============================== Description ===============================
+
+prettyPhoto is a jQuery based lightbox clone. Not only does it support images,
+it also add support for videos, flash, YouTube, iFrame. It's a full blown
+media modal box.
+
+Please refer to http://www.no-margin-for-errors.com/projects/prettyPhoto/
+for all the details on how to use.
diff --git a/library/prettyphoto/css/prettyPhoto.css b/library/prettyphoto/css/prettyPhoto.css
new file mode 100644
index 000000000..8a2a2fd14
--- /dev/null
+++ b/library/prettyphoto/css/prettyPhoto.css
@@ -0,0 +1,170 @@
+div.pp_default .pp_top,div.pp_default .pp_top .pp_middle,div.pp_default .pp_top .pp_left,div.pp_default .pp_top .pp_right,div.pp_default .pp_bottom,div.pp_default .pp_bottom .pp_left,div.pp_default .pp_bottom .pp_middle,div.pp_default .pp_bottom .pp_right{height:13px}
+div.pp_default .pp_top .pp_left{background:url(../images/prettyPhoto/default/sprite.png) -78px -93px no-repeat}
+div.pp_default .pp_top .pp_middle{background:url(../images/prettyPhoto/default/sprite_x.png) top left repeat-x}
+div.pp_default .pp_top .pp_right{background:url(../images/prettyPhoto/default/sprite.png) -112px -93px no-repeat}
+div.pp_default .pp_content .ppt{color:#f8f8f8}
+div.pp_default .pp_content_container .pp_left{background:url(../images/prettyPhoto/default/sprite_y.png) -7px 0 repeat-y;padding-left:13px}
+div.pp_default .pp_content_container .pp_right{background:url(../images/prettyPhoto/default/sprite_y.png) top right repeat-y;padding-right:13px}
+div.pp_default .pp_next:hover{background:url(../images/prettyPhoto/default/sprite_next.png) center right no-repeat;cursor:pointer}
+div.pp_default .pp_previous:hover{background:url(../images/prettyPhoto/default/sprite_prev.png) center left no-repeat;cursor:pointer}
+div.pp_default .pp_expand{background:url(../images/prettyPhoto/default/sprite.png) 0 -29px no-repeat;cursor:pointer;width:28px;height:28px}
+div.pp_default .pp_expand:hover{background:url(../images/prettyPhoto/default/sprite.png) 0 -56px no-repeat;cursor:pointer}
+div.pp_default .pp_contract{background:url(../images/prettyPhoto/default/sprite.png) 0 -84px no-repeat;cursor:pointer;width:28px;height:28px}
+div.pp_default .pp_contract:hover{background:url(../images/prettyPhoto/default/sprite.png) 0 -113px no-repeat;cursor:pointer}
+div.pp_default .pp_close{width:30px;height:30px;background:url(../images/prettyPhoto/default/sprite.png) 2px 1px no-repeat;cursor:pointer}
+div.pp_default .pp_gallery ul li a{background:url(../images/prettyPhoto/default/default_thumb.png) center center #f8f8f8;border:1px solid #aaa}
+div.pp_default .pp_social{margin-top:7px}
+div.pp_default .pp_gallery a.pp_arrow_previous,div.pp_default .pp_gallery a.pp_arrow_next{position:static;left:auto}
+div.pp_default .pp_nav .pp_play,div.pp_default .pp_nav .pp_pause{background:url(../images/prettyPhoto/default/sprite.png) -51px 1px no-repeat;height:30px;width:30px}
+div.pp_default .pp_nav .pp_pause{background-position:-51px -29px}
+div.pp_default a.pp_arrow_previous,div.pp_default a.pp_arrow_next{background:url(../images/prettyPhoto/default/sprite.png) -31px -3px no-repeat;height:20px;width:20px;margin:4px 0 0}
+div.pp_default a.pp_arrow_next{left:52px;background-position:-82px -3px}
+div.pp_default .pp_content_container .pp_details{margin-top:5px}
+div.pp_default .pp_nav{clear:none;height:30px;width:110px;position:relative}
+div.pp_default .pp_nav .currentTextHolder{font-family:Georgia;font-style:italic;color:#999;font-size:11px;left:75px;line-height:25px;position:absolute;top:2px;margin:0;padding:0 0 0 10px}
+div.pp_default .pp_close:hover,div.pp_default .pp_nav .pp_play:hover,div.pp_default .pp_nav .pp_pause:hover,div.pp_default .pp_arrow_next:hover,div.pp_default .pp_arrow_previous:hover{opacity:0.7}
+div.pp_default .pp_description{font-size:11px;font-weight:700;line-height:14px;margin:5px 50px 5px 0}
+div.pp_default .pp_bottom .pp_left{background:url(../images/prettyPhoto/default/sprite.png) -78px -127px no-repeat}
+div.pp_default .pp_bottom .pp_middle{background:url(../images/prettyPhoto/default/sprite_x.png) bottom left repeat-x}
+div.pp_default .pp_bottom .pp_right{background:url(../images/prettyPhoto/default/sprite.png) -112px -127px no-repeat}
+div.pp_default .pp_loaderIcon{background:url(../images/prettyPhoto/default/loader.gif) center center no-repeat}
+div.light_rounded .pp_top .pp_left{background:url(../images/prettyPhoto/light_rounded/sprite.png) -88px -53px no-repeat}
+div.light_rounded .pp_top .pp_right{background:url(../images/prettyPhoto/light_rounded/sprite.png) -110px -53px no-repeat}
+div.light_rounded .pp_next:hover{background:url(../images/prettyPhoto/light_rounded/btnNext.png) center right no-repeat;cursor:pointer}
+div.light_rounded .pp_previous:hover{background:url(../images/prettyPhoto/light_rounded/btnPrevious.png) center left no-repeat;cursor:pointer}
+div.light_rounded .pp_expand{background:url(../images/prettyPhoto/light_rounded/sprite.png) -31px -26px no-repeat;cursor:pointer}
+div.light_rounded .pp_expand:hover{background:url(../images/prettyPhoto/light_rounded/sprite.png) -31px -47px no-repeat;cursor:pointer}
+div.light_rounded .pp_contract{background:url(../images/prettyPhoto/light_rounded/sprite.png) 0 -26px no-repeat;cursor:pointer}
+div.light_rounded .pp_contract:hover{background:url(../images/prettyPhoto/light_rounded/sprite.png) 0 -47px no-repeat;cursor:pointer}
+div.light_rounded .pp_close{width:75px;height:22px;background:url(../images/prettyPhoto/light_rounded/sprite.png) -1px -1px no-repeat;cursor:pointer}
+div.light_rounded .pp_nav .pp_play{background:url(../images/prettyPhoto/light_rounded/sprite.png) -1px -100px no-repeat;height:15px;width:14px}
+div.light_rounded .pp_nav .pp_pause{background:url(../images/prettyPhoto/light_rounded/sprite.png) -24px -100px no-repeat;height:15px;width:14px}
+div.light_rounded .pp_arrow_previous{background:url(../images/prettyPhoto/light_rounded/sprite.png) 0 -71px no-repeat}
+div.light_rounded .pp_arrow_next{background:url(../images/prettyPhoto/light_rounded/sprite.png) -22px -71px no-repeat}
+div.light_rounded .pp_bottom .pp_left{background:url(../images/prettyPhoto/light_rounded/sprite.png) -88px -80px no-repeat}
+div.light_rounded .pp_bottom .pp_right{background:url(../images/prettyPhoto/light_rounded/sprite.png) -110px -80px no-repeat}
+div.dark_rounded .pp_top .pp_left{background:url(../images/prettyPhoto/dark_rounded/sprite.png) -88px -53px no-repeat}
+div.dark_rounded .pp_top .pp_right{background:url(../images/prettyPhoto/dark_rounded/sprite.png) -110px -53px no-repeat}
+div.dark_rounded .pp_content_container .pp_left{background:url(../images/prettyPhoto/dark_rounded/contentPattern.png) top left repeat-y}
+div.dark_rounded .pp_content_container .pp_right{background:url(../images/prettyPhoto/dark_rounded/contentPattern.png) top right repeat-y}
+div.dark_rounded .pp_next:hover{background:url(../images/prettyPhoto/dark_rounded/btnNext.png) center right no-repeat;cursor:pointer}
+div.dark_rounded .pp_previous:hover{background:url(../images/prettyPhoto/dark_rounded/btnPrevious.png) center left no-repeat;cursor:pointer}
+div.dark_rounded .pp_expand{background:url(../images/prettyPhoto/dark_rounded/sprite.png) -31px -26px no-repeat;cursor:pointer}
+div.dark_rounded .pp_expand:hover{background:url(../images/prettyPhoto/dark_rounded/sprite.png) -31px -47px no-repeat;cursor:pointer}
+div.dark_rounded .pp_contract{background:url(../images/prettyPhoto/dark_rounded/sprite.png) 0 -26px no-repeat;cursor:pointer}
+div.dark_rounded .pp_contract:hover{background:url(../images/prettyPhoto/dark_rounded/sprite.png) 0 -47px no-repeat;cursor:pointer}
+div.dark_rounded .pp_close{width:75px;height:22px;background:url(../images/prettyPhoto/dark_rounded/sprite.png) -1px -1px no-repeat;cursor:pointer}
+div.dark_rounded .pp_description{margin-right:85px;color:#fff}
+div.dark_rounded .pp_nav .pp_play{background:url(../images/prettyPhoto/dark_rounded/sprite.png) -1px -100px no-repeat;height:15px;width:14px}
+div.dark_rounded .pp_nav .pp_pause{background:url(../images/prettyPhoto/dark_rounded/sprite.png) -24px -100px no-repeat;height:15px;width:14px}
+div.dark_rounded .pp_arrow_previous{background:url(../images/prettyPhoto/dark_rounded/sprite.png) 0 -71px no-repeat}
+div.dark_rounded .pp_arrow_next{background:url(../images/prettyPhoto/dark_rounded/sprite.png) -22px -71px no-repeat}
+div.dark_rounded .pp_bottom .pp_left{background:url(../images/prettyPhoto/dark_rounded/sprite.png) -88px -80px no-repeat}
+div.dark_rounded .pp_bottom .pp_right{background:url(../images/prettyPhoto/dark_rounded/sprite.png) -110px -80px no-repeat}
+div.dark_rounded .pp_loaderIcon{background:url(../images/prettyPhoto/dark_rounded/loader.gif) center center no-repeat}
+div.dark_square .pp_left,div.dark_square .pp_middle,div.dark_square .pp_right,div.dark_square .pp_content{background:#000}
+div.dark_square .pp_description{color:#fff;margin:0 85px 0 0}
+div.dark_square .pp_loaderIcon{background:url(../images/prettyPhoto/dark_square/loader.gif) center center no-repeat}
+div.dark_square .pp_expand{background:url(../images/prettyPhoto/dark_square/sprite.png) -31px -26px no-repeat;cursor:pointer}
+div.dark_square .pp_expand:hover{background:url(../images/prettyPhoto/dark_square/sprite.png) -31px -47px no-repeat;cursor:pointer}
+div.dark_square .pp_contract{background:url(../images/prettyPhoto/dark_square/sprite.png) 0 -26px no-repeat;cursor:pointer}
+div.dark_square .pp_contract:hover{background:url(../images/prettyPhoto/dark_square/sprite.png) 0 -47px no-repeat;cursor:pointer}
+div.dark_square .pp_close{width:75px;height:22px;background:url(../images/prettyPhoto/dark_square/sprite.png) -1px -1px no-repeat;cursor:pointer}
+div.dark_square .pp_nav{clear:none}
+div.dark_square .pp_nav .pp_play{background:url(../images/prettyPhoto/dark_square/sprite.png) -1px -100px no-repeat;height:15px;width:14px}
+div.dark_square .pp_nav .pp_pause{background:url(../images/prettyPhoto/dark_square/sprite.png) -24px -100px no-repeat;height:15px;width:14px}
+div.dark_square .pp_arrow_previous{background:url(../images/prettyPhoto/dark_square/sprite.png) 0 -71px no-repeat}
+div.dark_square .pp_arrow_next{background:url(../images/prettyPhoto/dark_square/sprite.png) -22px -71px no-repeat}
+div.dark_square .pp_next:hover{background:url(../images/prettyPhoto/dark_square/btnNext.png) center right no-repeat;cursor:pointer}
+div.dark_square .pp_previous:hover{background:url(../images/prettyPhoto/dark_square/btnPrevious.png) center left no-repeat;cursor:pointer}
+div.light_square .pp_expand{background:url(../images/prettyPhoto/light_square/sprite.png) -31px -26px no-repeat;cursor:pointer}
+div.light_square .pp_expand:hover{background:url(../images/prettyPhoto/light_square/sprite.png) -31px -47px no-repeat;cursor:pointer}
+div.light_square .pp_contract{background:url(../images/prettyPhoto/light_square/sprite.png) 0 -26px no-repeat;cursor:pointer}
+div.light_square .pp_contract:hover{background:url(../images/prettyPhoto/light_square/sprite.png) 0 -47px no-repeat;cursor:pointer}
+div.light_square .pp_close{width:75px;height:22px;background:url(../images/prettyPhoto/light_square/sprite.png) -1px -1px no-repeat;cursor:pointer}
+div.light_square .pp_nav .pp_play{background:url(../images/prettyPhoto/light_square/sprite.png) -1px -100px no-repeat;height:15px;width:14px}
+div.light_square .pp_nav .pp_pause{background:url(../images/prettyPhoto/light_square/sprite.png) -24px -100px no-repeat;height:15px;width:14px}
+div.light_square .pp_arrow_previous{background:url(../images/prettyPhoto/light_square/sprite.png) 0 -71px no-repeat}
+div.light_square .pp_arrow_next{background:url(../images/prettyPhoto/light_square/sprite.png) -22px -71px no-repeat}
+div.light_square .pp_next:hover{background:url(../images/prettyPhoto/light_square/btnNext.png) center right no-repeat;cursor:pointer}
+div.light_square .pp_previous:hover{background:url(../images/prettyPhoto/light_square/btnPrevious.png) center left no-repeat;cursor:pointer}
+div.facebook .pp_top .pp_left{background:url(../images/prettyPhoto/facebook/sprite.png) -88px -53px no-repeat}
+div.facebook .pp_top .pp_middle{background:url(../images/prettyPhoto/facebook/contentPatternTop.png) top left repeat-x}
+div.facebook .pp_top .pp_right{background:url(../images/prettyPhoto/facebook/sprite.png) -110px -53px no-repeat}
+div.facebook .pp_content_container .pp_left{background:url(../images/prettyPhoto/facebook/contentPatternLeft.png) top left repeat-y}
+div.facebook .pp_content_container .pp_right{background:url(../images/prettyPhoto/facebook/contentPatternRight.png) top right repeat-y}
+div.facebook .pp_expand{background:url(../images/prettyPhoto/facebook/sprite.png) -31px -26px no-repeat;cursor:pointer}
+div.facebook .pp_expand:hover{background:url(../images/prettyPhoto/facebook/sprite.png) -31px -47px no-repeat;cursor:pointer}
+div.facebook .pp_contract{background:url(../images/prettyPhoto/facebook/sprite.png) 0 -26px no-repeat;cursor:pointer}
+div.facebook .pp_contract:hover{background:url(../images/prettyPhoto/facebook/sprite.png) 0 -47px no-repeat;cursor:pointer}
+div.facebook .pp_close{width:22px;height:22px;background:url(../images/prettyPhoto/facebook/sprite.png) -1px -1px no-repeat;cursor:pointer}
+div.facebook .pp_description{margin:0 37px 0 0}
+div.facebook .pp_loaderIcon{background:url(../images/prettyPhoto/facebook/loader.gif) center center no-repeat}
+div.facebook .pp_arrow_previous{background:url(../images/prettyPhoto/facebook/sprite.png) 0 -71px no-repeat;height:22px;margin-top:0;width:22px}
+div.facebook .pp_arrow_previous.disabled{background-position:0 -96px;cursor:default}
+div.facebook .pp_arrow_next{background:url(../images/prettyPhoto/facebook/sprite.png) -32px -71px no-repeat;height:22px;margin-top:0;width:22px}
+div.facebook .pp_arrow_next.disabled{background-position:-32px -96px;cursor:default}
+div.facebook .pp_nav{margin-top:0}
+div.facebook .pp_nav p{font-size:15px;padding:0 3px 0 4px}
+div.facebook .pp_nav .pp_play{background:url(../images/prettyPhoto/facebook/sprite.png) -1px -123px no-repeat;height:22px;width:22px}
+div.facebook .pp_nav .pp_pause{background:url(../images/prettyPhoto/facebook/sprite.png) -32px -123px no-repeat;height:22px;width:22px}
+div.facebook .pp_next:hover{background:url(../images/prettyPhoto/facebook/btnNext.png) center right no-repeat;cursor:pointer}
+div.facebook .pp_previous:hover{background:url(../images/prettyPhoto/facebook/btnPrevious.png) center left no-repeat;cursor:pointer}
+div.facebook .pp_bottom .pp_left{background:url(../images/prettyPhoto/facebook/sprite.png) -88px -80px no-repeat}
+div.facebook .pp_bottom .pp_middle{background:url(../images/prettyPhoto/facebook/contentPatternBottom.png) top left repeat-x}
+div.facebook .pp_bottom .pp_right{background:url(../images/prettyPhoto/facebook/sprite.png) -110px -80px no-repeat}
+div.pp_pic_holder a:focus{outline:none}
+div.pp_overlay{background:#000;display:none;left:0;position:absolute;top:0;width:100%;z-index:9500}
+div.pp_pic_holder{display:none;position:absolute;width:100px;z-index:10000}
+.pp_content{height:40px;min-width:40px}
+* html .pp_content{width:40px}
+.pp_content_container{position:relative;text-align:left;width:100%}
+.pp_content_container .pp_left{padding-left:20px}
+.pp_content_container .pp_right{padding-right:20px}
+.pp_content_container .pp_details{float:left;margin:10px 0 2px}
+.pp_description{display:none;margin:0}
+.pp_social{float:left;margin:0}
+.pp_social .facebook{float:left;margin-left:5px;width:55px;overflow:hidden}
+.pp_social .twitter{float:left}
+.pp_nav{clear:right;float:left;margin:3px 10px 0 0}
+.pp_nav p{float:left;white-space:nowrap;margin:2px 4px}
+.pp_nav .pp_play,.pp_nav .pp_pause{float:left;margin-right:4px;text-indent:-10000px}
+a.pp_arrow_previous,a.pp_arrow_next{display:block;float:left;height:15px;margin-top:3px;overflow:hidden;text-indent:-10000px;width:14px}
+.pp_hoverContainer{position:absolute;top:0;width:100%;z-index:2000}
+.pp_gallery{display:none;left:50%;margin-top:-50px;position:absolute;z-index:10000}
+.pp_gallery div{float:left;overflow:hidden;position:relative}
+.pp_gallery ul{float:left;height:35px;position:relative;white-space:nowrap;margin:0 0 0 5px;padding:0}
+.pp_gallery ul a{border:1px rgba(0,0,0,0.5) solid;display:block;float:left;height:33px;overflow:hidden}
+.pp_gallery ul a img{border:0}
+.pp_gallery li{display:block;float:left;margin:0 5px 0 0;padding:0}
+.pp_gallery li.default a{background:url(../images/prettyPhoto/facebook/default_thumbnail.gif) 0 0 no-repeat;display:block;height:33px;width:50px}
+.pp_gallery .pp_arrow_previous,.pp_gallery .pp_arrow_next{margin-top:7px!important}
+a.pp_next{background:url(../images/prettyPhoto/light_rounded/btnNext.png) 10000px 10000px no-repeat;display:block;float:right;height:100%;text-indent:-10000px;width:49%}
+a.pp_previous{background:url(../images/prettyPhoto/light_rounded/btnNext.png) 10000px 10000px no-repeat;display:block;float:left;height:100%;text-indent:-10000px;width:49%}
+a.pp_expand,a.pp_contract{cursor:pointer;display:none;height:20px;position:absolute;right:30px;text-indent:-10000px;top:10px;width:20px;z-index:20000}
+a.pp_close{position:absolute;right:0;top:0;display:block;line-height:22px;text-indent:-10000px}
+.pp_loaderIcon{display:block;height:24px;left:50%;position:absolute;top:50%;width:24px;margin:-12px 0 0 -12px}
+#pp_full_res{line-height:1!important}
+#pp_full_res .pp_inline{text-align:left}
+#pp_full_res .pp_inline p{margin:0 0 15px}
+div.ppt{color:#fff;display:none;font-size:17px;z-index:9999;margin:0 0 5px 15px}
+div.pp_default .pp_content,div.light_rounded .pp_content{background-color:#fff}
+div.pp_default #pp_full_res .pp_inline,div.light_rounded .pp_content .ppt,div.light_rounded #pp_full_res .pp_inline,div.light_square .pp_content .ppt,div.light_square #pp_full_res .pp_inline,div.facebook .pp_content .ppt,div.facebook #pp_full_res .pp_inline{color:#000}
+div.pp_default .pp_gallery ul li a:hover,div.pp_default .pp_gallery ul li.selected a,.pp_gallery ul a:hover,.pp_gallery li.selected a{border-color:#fff}
+div.pp_default .pp_details,div.light_rounded .pp_details,div.dark_rounded .pp_details,div.dark_square .pp_details,div.light_square .pp_details,div.facebook .pp_details{position:relative}
+div.light_rounded .pp_top .pp_middle,div.light_rounded .pp_content_container .pp_left,div.light_rounded .pp_content_container .pp_right,div.light_rounded .pp_bottom .pp_middle,div.light_square .pp_left,div.light_square .pp_middle,div.light_square .pp_right,div.light_square .pp_content,div.facebook .pp_content{background:#fff}
+div.light_rounded .pp_description,div.light_square .pp_description{margin-right:85px}
+div.light_rounded .pp_gallery a.pp_arrow_previous,div.light_rounded .pp_gallery a.pp_arrow_next,div.dark_rounded .pp_gallery a.pp_arrow_previous,div.dark_rounded .pp_gallery a.pp_arrow_next,div.dark_square .pp_gallery a.pp_arrow_previous,div.dark_square .pp_gallery a.pp_arrow_next,div.light_square .pp_gallery a.pp_arrow_previous,div.light_square .pp_gallery a.pp_arrow_next{margin-top:12px!important}
+div.light_rounded .pp_arrow_previous.disabled,div.dark_rounded .pp_arrow_previous.disabled,div.dark_square .pp_arrow_previous.disabled,div.light_square .pp_arrow_previous.disabled{background-position:0 -87px;cursor:default}
+div.light_rounded .pp_arrow_next.disabled,div.dark_rounded .pp_arrow_next.disabled,div.dark_square .pp_arrow_next.disabled,div.light_square .pp_arrow_next.disabled{background-position:-22px -87px;cursor:default}
+div.light_rounded .pp_loaderIcon,div.light_square .pp_loaderIcon{background:url(../images/prettyPhoto/light_rounded/loader.gif) center center no-repeat}
+div.dark_rounded .pp_top .pp_middle,div.dark_rounded .pp_content,div.dark_rounded .pp_bottom .pp_middle{background:url(../images/prettyPhoto/dark_rounded/contentPattern.png) top left repeat}
+div.dark_rounded .currentTextHolder,div.dark_square .currentTextHolder{color:#c4c4c4}
+div.dark_rounded #pp_full_res .pp_inline,div.dark_square #pp_full_res .pp_inline{color:#fff}
+.pp_top,.pp_bottom{height:20px;position:relative}
+* html .pp_top,* html .pp_bottom{padding:0 20px}
+.pp_top .pp_left,.pp_bottom .pp_left{height:20px;left:0;position:absolute;width:20px}
+.pp_top .pp_middle,.pp_bottom .pp_middle{height:20px;left:20px;position:absolute;right:20px}
+* html .pp_top .pp_middle,* html .pp_bottom .pp_middle{left:0;position:static}
+.pp_top .pp_right,.pp_bottom .pp_right{height:20px;left:auto;position:absolute;right:0;top:0;width:20px}
+.pp_fade,.pp_gallery li.default a img{display:none} \ No newline at end of file
diff --git a/library/prettyphoto/images/prettyPhoto/dark_rounded/btnNext.png b/library/prettyphoto/images/prettyPhoto/dark_rounded/btnNext.png
new file mode 100755
index 000000000..b28c1ef3d
--- /dev/null
+++ b/library/prettyphoto/images/prettyPhoto/dark_rounded/btnNext.png
Binary files differ
diff --git a/library/prettyphoto/images/prettyPhoto/dark_rounded/btnPrevious.png b/library/prettyphoto/images/prettyPhoto/dark_rounded/btnPrevious.png
new file mode 100755
index 000000000..e0cd9c49a
--- /dev/null
+++ b/library/prettyphoto/images/prettyPhoto/dark_rounded/btnPrevious.png
Binary files differ
diff --git a/library/prettyphoto/images/prettyPhoto/dark_rounded/contentPattern.png b/library/prettyphoto/images/prettyPhoto/dark_rounded/contentPattern.png
new file mode 100755
index 000000000..e5a047c3a
--- /dev/null
+++ b/library/prettyphoto/images/prettyPhoto/dark_rounded/contentPattern.png
Binary files differ
diff --git a/library/prettyphoto/images/prettyPhoto/dark_rounded/default_thumbnail.gif b/library/prettyphoto/images/prettyPhoto/dark_rounded/default_thumbnail.gif
new file mode 100755
index 000000000..2b1280f32
--- /dev/null
+++ b/library/prettyphoto/images/prettyPhoto/dark_rounded/default_thumbnail.gif
Binary files differ
diff --git a/library/prettyphoto/images/prettyPhoto/dark_rounded/loader.gif b/library/prettyphoto/images/prettyPhoto/dark_rounded/loader.gif
new file mode 100755
index 000000000..50820eedd
--- /dev/null
+++ b/library/prettyphoto/images/prettyPhoto/dark_rounded/loader.gif
Binary files differ
diff --git a/library/prettyphoto/images/prettyPhoto/dark_rounded/sprite.png b/library/prettyphoto/images/prettyPhoto/dark_rounded/sprite.png
new file mode 100755
index 000000000..fb8c0f83d
--- /dev/null
+++ b/library/prettyphoto/images/prettyPhoto/dark_rounded/sprite.png
Binary files differ
diff --git a/library/prettyphoto/images/prettyPhoto/dark_square/btnNext.png b/library/prettyphoto/images/prettyPhoto/dark_square/btnNext.png
new file mode 100755
index 000000000..b28c1ef3d
--- /dev/null
+++ b/library/prettyphoto/images/prettyPhoto/dark_square/btnNext.png
Binary files differ
diff --git a/library/prettyphoto/images/prettyPhoto/dark_square/btnPrevious.png b/library/prettyphoto/images/prettyPhoto/dark_square/btnPrevious.png
new file mode 100755
index 000000000..e0cd9c49a
--- /dev/null
+++ b/library/prettyphoto/images/prettyPhoto/dark_square/btnPrevious.png
Binary files differ
diff --git a/library/prettyphoto/images/prettyPhoto/dark_square/contentPattern.png b/library/prettyphoto/images/prettyPhoto/dark_square/contentPattern.png
new file mode 100755
index 000000000..7b50aff88
--- /dev/null
+++ b/library/prettyphoto/images/prettyPhoto/dark_square/contentPattern.png
Binary files differ
diff --git a/library/prettyphoto/images/prettyPhoto/dark_square/default_thumbnail.gif b/library/prettyphoto/images/prettyPhoto/dark_square/default_thumbnail.gif
new file mode 100755
index 000000000..2b1280f32
--- /dev/null
+++ b/library/prettyphoto/images/prettyPhoto/dark_square/default_thumbnail.gif
Binary files differ
diff --git a/library/prettyphoto/images/prettyPhoto/dark_square/loader.gif b/library/prettyphoto/images/prettyPhoto/dark_square/loader.gif
new file mode 100755
index 000000000..50820eedd
--- /dev/null
+++ b/library/prettyphoto/images/prettyPhoto/dark_square/loader.gif
Binary files differ
diff --git a/library/prettyphoto/images/prettyPhoto/dark_square/sprite.png b/library/prettyphoto/images/prettyPhoto/dark_square/sprite.png
new file mode 100755
index 000000000..4fe354752
--- /dev/null
+++ b/library/prettyphoto/images/prettyPhoto/dark_square/sprite.png
Binary files differ
diff --git a/library/prettyphoto/images/prettyPhoto/default/default_thumb.png b/library/prettyphoto/images/prettyPhoto/default/default_thumb.png
new file mode 100644
index 000000000..1a26e4b16
--- /dev/null
+++ b/library/prettyphoto/images/prettyPhoto/default/default_thumb.png
Binary files differ
diff --git a/library/prettyphoto/images/prettyPhoto/default/loader.gif b/library/prettyphoto/images/prettyPhoto/default/loader.gif
new file mode 100644
index 000000000..35d397c9e
--- /dev/null
+++ b/library/prettyphoto/images/prettyPhoto/default/loader.gif
Binary files differ
diff --git a/library/prettyphoto/images/prettyPhoto/default/sprite.png b/library/prettyphoto/images/prettyPhoto/default/sprite.png
new file mode 100644
index 000000000..5f07ddc56
--- /dev/null
+++ b/library/prettyphoto/images/prettyPhoto/default/sprite.png
Binary files differ
diff --git a/library/prettyphoto/images/prettyPhoto/default/sprite_next.png b/library/prettyphoto/images/prettyPhoto/default/sprite_next.png
new file mode 100644
index 000000000..379dc0d0d
--- /dev/null
+++ b/library/prettyphoto/images/prettyPhoto/default/sprite_next.png
Binary files differ
diff --git a/library/prettyphoto/images/prettyPhoto/default/sprite_prev.png b/library/prettyphoto/images/prettyPhoto/default/sprite_prev.png
new file mode 100644
index 000000000..1ee486514
--- /dev/null
+++ b/library/prettyphoto/images/prettyPhoto/default/sprite_prev.png
Binary files differ
diff --git a/library/prettyphoto/images/prettyPhoto/default/sprite_x.png b/library/prettyphoto/images/prettyPhoto/default/sprite_x.png
new file mode 100644
index 000000000..d4433ab0d
--- /dev/null
+++ b/library/prettyphoto/images/prettyPhoto/default/sprite_x.png
Binary files differ
diff --git a/library/prettyphoto/images/prettyPhoto/default/sprite_y.png b/library/prettyphoto/images/prettyPhoto/default/sprite_y.png
new file mode 100644
index 000000000..7786ab512
--- /dev/null
+++ b/library/prettyphoto/images/prettyPhoto/default/sprite_y.png
Binary files differ
diff --git a/library/prettyphoto/images/prettyPhoto/facebook/btnNext.png b/library/prettyphoto/images/prettyPhoto/facebook/btnNext.png
new file mode 100755
index 000000000..e809c3b64
--- /dev/null
+++ b/library/prettyphoto/images/prettyPhoto/facebook/btnNext.png
Binary files differ
diff --git a/library/prettyphoto/images/prettyPhoto/facebook/btnPrevious.png b/library/prettyphoto/images/prettyPhoto/facebook/btnPrevious.png
new file mode 100755
index 000000000..0812542cc
--- /dev/null
+++ b/library/prettyphoto/images/prettyPhoto/facebook/btnPrevious.png
Binary files differ
diff --git a/library/prettyphoto/images/prettyPhoto/facebook/contentPatternBottom.png b/library/prettyphoto/images/prettyPhoto/facebook/contentPatternBottom.png
new file mode 100755
index 000000000..a9be3b2ca
--- /dev/null
+++ b/library/prettyphoto/images/prettyPhoto/facebook/contentPatternBottom.png
Binary files differ
diff --git a/library/prettyphoto/images/prettyPhoto/facebook/contentPatternLeft.png b/library/prettyphoto/images/prettyPhoto/facebook/contentPatternLeft.png
new file mode 100755
index 000000000..277c87a5b
--- /dev/null
+++ b/library/prettyphoto/images/prettyPhoto/facebook/contentPatternLeft.png
Binary files differ
diff --git a/library/prettyphoto/images/prettyPhoto/facebook/contentPatternRight.png b/library/prettyphoto/images/prettyPhoto/facebook/contentPatternRight.png
new file mode 100755
index 000000000..76e50d0f5
--- /dev/null
+++ b/library/prettyphoto/images/prettyPhoto/facebook/contentPatternRight.png
Binary files differ
diff --git a/library/prettyphoto/images/prettyPhoto/facebook/contentPatternTop.png b/library/prettyphoto/images/prettyPhoto/facebook/contentPatternTop.png
new file mode 100755
index 000000000..8b110bac6
--- /dev/null
+++ b/library/prettyphoto/images/prettyPhoto/facebook/contentPatternTop.png
Binary files differ
diff --git a/library/prettyphoto/images/prettyPhoto/facebook/default_thumbnail.gif b/library/prettyphoto/images/prettyPhoto/facebook/default_thumbnail.gif
new file mode 100755
index 000000000..2b1280f32
--- /dev/null
+++ b/library/prettyphoto/images/prettyPhoto/facebook/default_thumbnail.gif
Binary files differ
diff --git a/library/prettyphoto/images/prettyPhoto/facebook/loader.gif b/library/prettyphoto/images/prettyPhoto/facebook/loader.gif
new file mode 100755
index 000000000..7ac990cf0
--- /dev/null
+++ b/library/prettyphoto/images/prettyPhoto/facebook/loader.gif
Binary files differ
diff --git a/library/prettyphoto/images/prettyPhoto/facebook/sprite.png b/library/prettyphoto/images/prettyPhoto/facebook/sprite.png
new file mode 100755
index 000000000..660a254f1
--- /dev/null
+++ b/library/prettyphoto/images/prettyPhoto/facebook/sprite.png
Binary files differ
diff --git a/library/prettyphoto/images/prettyPhoto/light_rounded/btnNext.png b/library/prettyphoto/images/prettyPhoto/light_rounded/btnNext.png
new file mode 100755
index 000000000..b28c1ef3d
--- /dev/null
+++ b/library/prettyphoto/images/prettyPhoto/light_rounded/btnNext.png
Binary files differ
diff --git a/library/prettyphoto/images/prettyPhoto/light_rounded/btnPrevious.png b/library/prettyphoto/images/prettyPhoto/light_rounded/btnPrevious.png
new file mode 100755
index 000000000..e0cd9c49a
--- /dev/null
+++ b/library/prettyphoto/images/prettyPhoto/light_rounded/btnPrevious.png
Binary files differ
diff --git a/library/prettyphoto/images/prettyPhoto/light_rounded/default_thumbnail.gif b/library/prettyphoto/images/prettyPhoto/light_rounded/default_thumbnail.gif
new file mode 100755
index 000000000..2b1280f32
--- /dev/null
+++ b/library/prettyphoto/images/prettyPhoto/light_rounded/default_thumbnail.gif
Binary files differ
diff --git a/library/prettyphoto/images/prettyPhoto/light_rounded/loader.gif b/library/prettyphoto/images/prettyPhoto/light_rounded/loader.gif
new file mode 100755
index 000000000..7ac990cf0
--- /dev/null
+++ b/library/prettyphoto/images/prettyPhoto/light_rounded/loader.gif
Binary files differ
diff --git a/library/prettyphoto/images/prettyPhoto/light_rounded/sprite.png b/library/prettyphoto/images/prettyPhoto/light_rounded/sprite.png
new file mode 100755
index 000000000..7f2837981
--- /dev/null
+++ b/library/prettyphoto/images/prettyPhoto/light_rounded/sprite.png
Binary files differ
diff --git a/library/prettyphoto/images/prettyPhoto/light_square/btnNext.png b/library/prettyphoto/images/prettyPhoto/light_square/btnNext.png
new file mode 100755
index 000000000..b28c1ef3d
--- /dev/null
+++ b/library/prettyphoto/images/prettyPhoto/light_square/btnNext.png
Binary files differ
diff --git a/library/prettyphoto/images/prettyPhoto/light_square/btnPrevious.png b/library/prettyphoto/images/prettyPhoto/light_square/btnPrevious.png
new file mode 100755
index 000000000..e0cd9c49a
--- /dev/null
+++ b/library/prettyphoto/images/prettyPhoto/light_square/btnPrevious.png
Binary files differ
diff --git a/library/prettyphoto/images/prettyPhoto/light_square/default_thumbnail.gif b/library/prettyphoto/images/prettyPhoto/light_square/default_thumbnail.gif
new file mode 100755
index 000000000..2b1280f32
--- /dev/null
+++ b/library/prettyphoto/images/prettyPhoto/light_square/default_thumbnail.gif
Binary files differ
diff --git a/library/prettyphoto/images/prettyPhoto/light_square/loader.gif b/library/prettyphoto/images/prettyPhoto/light_square/loader.gif
new file mode 100755
index 000000000..7ac990cf0
--- /dev/null
+++ b/library/prettyphoto/images/prettyPhoto/light_square/loader.gif
Binary files differ
diff --git a/library/prettyphoto/images/prettyPhoto/light_square/sprite.png b/library/prettyphoto/images/prettyPhoto/light_square/sprite.png
new file mode 100755
index 000000000..4fe354752
--- /dev/null
+++ b/library/prettyphoto/images/prettyPhoto/light_square/sprite.png
Binary files differ
diff --git a/library/prettyphoto/js/jquery-1.3.2.min.js b/library/prettyphoto/js/jquery-1.3.2.min.js
new file mode 100755
index 000000000..b1ae21d8b
--- /dev/null
+++ b/library/prettyphoto/js/jquery-1.3.2.min.js
@@ -0,0 +1,19 @@
+/*
+ * jQuery JavaScript Library v1.3.2
+ * http://jquery.com/
+ *
+ * Copyright (c) 2009 John Resig
+ * Dual licensed under the MIT and GPL licenses.
+ * http://docs.jquery.com/License
+ *
+ * Date: 2009-02-19 17:34:21 -0500 (Thu, 19 Feb 2009)
+ * Revision: 6246
+ */
+(function(){var l=this,g,y=l.jQuery,p=l.$,o=l.jQuery=l.$=function(E,F){return new o.fn.init(E,F)},D=/^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/,f=/^.[^:#\[\.,]*$/;o.fn=o.prototype={init:function(E,H){E=E||document;if(E.nodeType){this[0]=E;this.length=1;this.context=E;return this}if(typeof E==="string"){var G=D.exec(E);if(G&&(G[1]||!H)){if(G[1]){E=o.clean([G[1]],H)}else{var I=document.getElementById(G[3]);if(I&&I.id!=G[3]){return o().find(E)}var F=o(I||[]);F.context=document;F.selector=E;return F}}else{return o(H).find(E)}}else{if(o.isFunction(E)){return o(document).ready(E)}}if(E.selector&&E.context){this.selector=E.selector;this.context=E.context}return this.setArray(o.isArray(E)?E:o.makeArray(E))},selector:"",jquery:"1.3.2",size:function(){return this.length},get:function(E){return E===g?Array.prototype.slice.call(this):this[E]},pushStack:function(F,H,E){var G=o(F);G.prevObject=this;G.context=this.context;if(H==="find"){G.selector=this.selector+(this.selector?" ":"")+E}else{if(H){G.selector=this.selector+"."+H+"("+E+")"}}return G},setArray:function(E){this.length=0;Array.prototype.push.apply(this,E);return this},each:function(F,E){return o.each(this,F,E)},index:function(E){return o.inArray(E&&E.jquery?E[0]:E,this)},attr:function(F,H,G){var E=F;if(typeof F==="string"){if(H===g){return this[0]&&o[G||"attr"](this[0],F)}else{E={};E[F]=H}}return this.each(function(I){for(F in E){o.attr(G?this.style:this,F,o.prop(this,E[F],G,I,F))}})},css:function(E,F){if((E=="width"||E=="height")&&parseFloat(F)<0){F=g}return this.attr(E,F,"curCSS")},text:function(F){if(typeof F!=="object"&&F!=null){return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(F))}var E="";o.each(F||this,function(){o.each(this.childNodes,function(){if(this.nodeType!=8){E+=this.nodeType!=1?this.nodeValue:o.fn.text([this])}})});return E},wrapAll:function(E){if(this[0]){var F=o(E,this[0].ownerDocument).clone();if(this[0].parentNode){F.insertBefore(this[0])}F.map(function(){var G=this;while(G.firstChild){G=G.firstChild}return G}).append(this)}return this},wrapInner:function(E){return this.each(function(){o(this).contents().wrapAll(E)})},wrap:function(E){return this.each(function(){o(this).wrapAll(E)})},append:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.appendChild(E)}})},prepend:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.insertBefore(E,this.firstChild)}})},before:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this)})},after:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this.nextSibling)})},end:function(){return this.prevObject||o([])},push:[].push,sort:[].sort,splice:[].splice,find:function(E){if(this.length===1){var F=this.pushStack([],"find",E);F.length=0;o.find(E,this[0],F);return F}else{return this.pushStack(o.unique(o.map(this,function(G){return o.find(E,G)})),"find",E)}},clone:function(G){var E=this.map(function(){if(!o.support.noCloneEvent&&!o.isXMLDoc(this)){var I=this.outerHTML;if(!I){var J=this.ownerDocument.createElement("div");J.appendChild(this.cloneNode(true));I=J.innerHTML}return o.clean([I.replace(/ jQuery\d+="(?:\d+|null)"/g,"").replace(/^\s*/,"")])[0]}else{return this.cloneNode(true)}});if(G===true){var H=this.find("*").andSelf(),F=0;E.find("*").andSelf().each(function(){if(this.nodeName!==H[F].nodeName){return}var I=o.data(H[F],"events");for(var K in I){for(var J in I[K]){o.event.add(this,K,I[K][J],I[K][J].data)}}F++})}return E},filter:function(E){return this.pushStack(o.isFunction(E)&&o.grep(this,function(G,F){return E.call(G,F)})||o.multiFilter(E,o.grep(this,function(F){return F.nodeType===1})),"filter",E)},closest:function(E){var G=o.expr.match.POS.test(E)?o(E):null,F=0;return this.map(function(){var H=this;while(H&&H.ownerDocument){if(G?G.index(H)>-1:o(H).is(E)){o.data(H,"closest",F);return H}H=H.parentNode;F++}})},not:function(E){if(typeof E==="string"){if(f.test(E)){return this.pushStack(o.multiFilter(E,this,true),"not",E)}else{E=o.multiFilter(E,this)}}var F=E.length&&E[E.length-1]!==g&&!E.nodeType;return this.filter(function(){return F?o.inArray(this,E)<0:this!=E})},add:function(E){return this.pushStack(o.unique(o.merge(this.get(),typeof E==="string"?o(E):o.makeArray(E))))},is:function(E){return !!E&&o.multiFilter(E,this).length>0},hasClass:function(E){return !!E&&this.is("."+E)},val:function(K){if(K===g){var E=this[0];if(E){if(o.nodeName(E,"option")){return(E.attributes.value||{}).specified?E.value:E.text}if(o.nodeName(E,"select")){var I=E.selectedIndex,L=[],M=E.options,H=E.type=="select-one";if(I<0){return null}for(var F=H?I:0,J=H?I+1:M.length;F<J;F++){var G=M[F];if(G.selected){K=o(G).val();if(H){return K}L.push(K)}}return L}return(E.value||"").replace(/\r/g,"")}return g}if(typeof K==="number"){K+=""}return this.each(function(){if(this.nodeType!=1){return}if(o.isArray(K)&&/radio|checkbox/.test(this.type)){this.checked=(o.inArray(this.value,K)>=0||o.inArray(this.name,K)>=0)}else{if(o.nodeName(this,"select")){var N=o.makeArray(K);o("option",this).each(function(){this.selected=(o.inArray(this.value,N)>=0||o.inArray(this.text,N)>=0)});if(!N.length){this.selectedIndex=-1}}else{this.value=K}}})},html:function(E){return E===g?(this[0]?this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g,""):null):this.empty().append(E)},replaceWith:function(E){return this.after(E).remove()},eq:function(E){return this.slice(E,+E+1)},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments),"slice",Array.prototype.slice.call(arguments).join(","))},map:function(E){return this.pushStack(o.map(this,function(G,F){return E.call(G,F,G)}))},andSelf:function(){return this.add(this.prevObject)},domManip:function(J,M,L){if(this[0]){var I=(this[0].ownerDocument||this[0]).createDocumentFragment(),F=o.clean(J,(this[0].ownerDocument||this[0]),I),H=I.firstChild;if(H){for(var G=0,E=this.length;G<E;G++){L.call(K(this[G],H),this.length>1||G>0?I.cloneNode(true):I)}}if(F){o.each(F,z)}}return this;function K(N,O){return M&&o.nodeName(N,"table")&&o.nodeName(O,"tr")?(N.getElementsByTagName("tbody")[0]||N.appendChild(N.ownerDocument.createElement("tbody"))):N}}};o.fn.init.prototype=o.fn;function z(E,F){if(F.src){o.ajax({url:F.src,async:false,dataType:"script"})}else{o.globalEval(F.text||F.textContent||F.innerHTML||"")}if(F.parentNode){F.parentNode.removeChild(F)}}function e(){return +new Date}o.extend=o.fn.extend=function(){var J=arguments[0]||{},H=1,I=arguments.length,E=false,G;if(typeof J==="boolean"){E=J;J=arguments[1]||{};H=2}if(typeof J!=="object"&&!o.isFunction(J)){J={}}if(I==H){J=this;--H}for(;H<I;H++){if((G=arguments[H])!=null){for(var F in G){var K=J[F],L=G[F];if(J===L){continue}if(E&&L&&typeof L==="object"&&!L.nodeType){J[F]=o.extend(E,K||(L.length!=null?[]:{}),L)}else{if(L!==g){J[F]=L}}}}}return J};var b=/z-?index|font-?weight|opacity|zoom|line-?height/i,q=document.defaultView||{},s=Object.prototype.toString;o.extend({noConflict:function(E){l.$=p;if(E){l.jQuery=y}return o},isFunction:function(E){return s.call(E)==="[object Function]"},isArray:function(E){return s.call(E)==="[object Array]"},isXMLDoc:function(E){return E.nodeType===9&&E.documentElement.nodeName!=="HTML"||!!E.ownerDocument&&o.isXMLDoc(E.ownerDocument)},globalEval:function(G){if(G&&/\S/.test(G)){var F=document.getElementsByTagName("head")[0]||document.documentElement,E=document.createElement("script");E.type="text/javascript";if(o.support.scriptEval){E.appendChild(document.createTextNode(G))}else{E.text=G}F.insertBefore(E,F.firstChild);F.removeChild(E)}},nodeName:function(F,E){return F.nodeName&&F.nodeName.toUpperCase()==E.toUpperCase()},each:function(G,K,F){var E,H=0,I=G.length;if(F){if(I===g){for(E in G){if(K.apply(G[E],F)===false){break}}}else{for(;H<I;){if(K.apply(G[H++],F)===false){break}}}}else{if(I===g){for(E in G){if(K.call(G[E],E,G[E])===false){break}}}else{for(var J=G[0];H<I&&K.call(J,H,J)!==false;J=G[++H]){}}}return G},prop:function(H,I,G,F,E){if(o.isFunction(I)){I=I.call(H,F)}return typeof I==="number"&&G=="curCSS"&&!b.test(E)?I+"px":I},className:{add:function(E,F){o.each((F||"").split(/\s+/),function(G,H){if(E.nodeType==1&&!o.className.has(E.className,H)){E.className+=(E.className?" ":"")+H}})},remove:function(E,F){if(E.nodeType==1){E.className=F!==g?o.grep(E.className.split(/\s+/),function(G){return !o.className.has(F,G)}).join(" "):""}},has:function(F,E){return F&&o.inArray(E,(F.className||F).toString().split(/\s+/))>-1}},swap:function(H,G,I){var E={};for(var F in G){E[F]=H.style[F];H.style[F]=G[F]}I.call(H);for(var F in G){H.style[F]=E[F]}},css:function(H,F,J,E){if(F=="width"||F=="height"){var L,G={position:"absolute",visibility:"hidden",display:"block"},K=F=="width"?["Left","Right"]:["Top","Bottom"];function I(){L=F=="width"?H.offsetWidth:H.offsetHeight;if(E==="border"){return}o.each(K,function(){if(!E){L-=parseFloat(o.curCSS(H,"padding"+this,true))||0}if(E==="margin"){L+=parseFloat(o.curCSS(H,"margin"+this,true))||0}else{L-=parseFloat(o.curCSS(H,"border"+this+"Width",true))||0}})}if(H.offsetWidth!==0){I()}else{o.swap(H,G,I)}return Math.max(0,Math.round(L))}return o.curCSS(H,F,J)},curCSS:function(I,F,G){var L,E=I.style;if(F=="opacity"&&!o.support.opacity){L=o.attr(E,"opacity");return L==""?"1":L}if(F.match(/float/i)){F=w}if(!G&&E&&E[F]){L=E[F]}else{if(q.getComputedStyle){if(F.match(/float/i)){F="float"}F=F.replace(/([A-Z])/g,"-$1").toLowerCase();var M=q.getComputedStyle(I,null);if(M){L=M.getPropertyValue(F)}if(F=="opacity"&&L==""){L="1"}}else{if(I.currentStyle){var J=F.replace(/\-(\w)/g,function(N,O){return O.toUpperCase()});L=I.currentStyle[F]||I.currentStyle[J];if(!/^\d+(px)?$/i.test(L)&&/^\d/.test(L)){var H=E.left,K=I.runtimeStyle.left;I.runtimeStyle.left=I.currentStyle.left;E.left=L||0;L=E.pixelLeft+"px";E.left=H;I.runtimeStyle.left=K}}}}return L},clean:function(F,K,I){K=K||document;if(typeof K.createElement==="undefined"){K=K.ownerDocument||K[0]&&K[0].ownerDocument||document}if(!I&&F.length===1&&typeof F[0]==="string"){var H=/^<(\w+)\s*\/?>$/.exec(F[0]);if(H){return[K.createElement(H[1])]}}var G=[],E=[],L=K.createElement("div");o.each(F,function(P,S){if(typeof S==="number"){S+=""}if(!S){return}if(typeof S==="string"){S=S.replace(/(<(\w+)[^>]*?)\/>/g,function(U,V,T){return T.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?U:V+"></"+T+">"});var O=S.replace(/^\s+/,"").substring(0,10).toLowerCase();var Q=!O.indexOf("<opt")&&[1,"<select multiple='multiple'>","</select>"]||!O.indexOf("<leg")&&[1,"<fieldset>","</fieldset>"]||O.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"<table>","</table>"]||!O.indexOf("<tr")&&[2,"<table><tbody>","</tbody></table>"]||(!O.indexOf("<td")||!O.indexOf("<th"))&&[3,"<table><tbody><tr>","</tr></tbody></table>"]||!O.indexOf("<col")&&[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"]||!o.support.htmlSerialize&&[1,"div<div>","</div>"]||[0,"",""];L.innerHTML=Q[1]+S+Q[2];while(Q[0]--){L=L.lastChild}if(!o.support.tbody){var R=/<tbody/i.test(S),N=!O.indexOf("<table")&&!R?L.firstChild&&L.firstChild.childNodes:Q[1]=="<table>"&&!R?L.childNodes:[];for(var M=N.length-1;M>=0;--M){if(o.nodeName(N[M],"tbody")&&!N[M].childNodes.length){N[M].parentNode.removeChild(N[M])}}}if(!o.support.leadingWhitespace&&/^\s/.test(S)){L.insertBefore(K.createTextNode(S.match(/^\s*/)[0]),L.firstChild)}S=o.makeArray(L.childNodes)}if(S.nodeType){G.push(S)}else{G=o.merge(G,S)}});if(I){for(var J=0;G[J];J++){if(o.nodeName(G[J],"script")&&(!G[J].type||G[J].type.toLowerCase()==="text/javascript")){E.push(G[J].parentNode?G[J].parentNode.removeChild(G[J]):G[J])}else{if(G[J].nodeType===1){G.splice.apply(G,[J+1,0].concat(o.makeArray(G[J].getElementsByTagName("script"))))}I.appendChild(G[J])}}return E}return G},attr:function(J,G,K){if(!J||J.nodeType==3||J.nodeType==8){return g}var H=!o.isXMLDoc(J),L=K!==g;G=H&&o.props[G]||G;if(J.tagName){var F=/href|src|style/.test(G);if(G=="selected"&&J.parentNode){J.parentNode.selectedIndex}if(G in J&&H&&!F){if(L){if(G=="type"&&o.nodeName(J,"input")&&J.parentNode){throw"type property can't be changed"}J[G]=K}if(o.nodeName(J,"form")&&J.getAttributeNode(G)){return J.getAttributeNode(G).nodeValue}if(G=="tabIndex"){var I=J.getAttributeNode("tabIndex");return I&&I.specified?I.value:J.nodeName.match(/(button|input|object|select|textarea)/i)?0:J.nodeName.match(/^(a|area)$/i)&&J.href?0:g}return J[G]}if(!o.support.style&&H&&G=="style"){return o.attr(J.style,"cssText",K)}if(L){J.setAttribute(G,""+K)}var E=!o.support.hrefNormalized&&H&&F?J.getAttribute(G,2):J.getAttribute(G);return E===null?g:E}if(!o.support.opacity&&G=="opacity"){if(L){J.zoom=1;J.filter=(J.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(K)+""=="NaN"?"":"alpha(opacity="+K*100+")")}return J.filter&&J.filter.indexOf("opacity=")>=0?(parseFloat(J.filter.match(/opacity=([^)]*)/)[1])/100)+"":""}G=G.replace(/-([a-z])/ig,function(M,N){return N.toUpperCase()});if(L){J[G]=K}return J[G]},trim:function(E){return(E||"").replace(/^\s+|\s+$/g,"")},makeArray:function(G){var E=[];if(G!=null){var F=G.length;if(F==null||typeof G==="string"||o.isFunction(G)||G.setInterval){E[0]=G}else{while(F){E[--F]=G[F]}}}return E},inArray:function(G,H){for(var E=0,F=H.length;E<F;E++){if(H[E]===G){return E}}return -1},merge:function(H,E){var F=0,G,I=H.length;if(!o.support.getAll){while((G=E[F++])!=null){if(G.nodeType!=8){H[I++]=G}}}else{while((G=E[F++])!=null){H[I++]=G}}return H},unique:function(K){var F=[],E={};try{for(var G=0,H=K.length;G<H;G++){var J=o.data(K[G]);if(!E[J]){E[J]=true;F.push(K[G])}}}catch(I){F=K}return F},grep:function(F,J,E){var G=[];for(var H=0,I=F.length;H<I;H++){if(!E!=!J(F[H],H)){G.push(F[H])}}return G},map:function(E,J){var F=[];for(var G=0,H=E.length;G<H;G++){var I=J(E[G],G);if(I!=null){F[F.length]=I}}return F.concat.apply([],F)}});var C=navigator.userAgent.toLowerCase();o.browser={version:(C.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[0,"0"])[1],safari:/webkit/.test(C),opera:/opera/.test(C),msie:/msie/.test(C)&&!/opera/.test(C),mozilla:/mozilla/.test(C)&&!/(compatible|webkit)/.test(C)};o.each({parent:function(E){return E.parentNode},parents:function(E){return o.dir(E,"parentNode")},next:function(E){return o.nth(E,2,"nextSibling")},prev:function(E){return o.nth(E,2,"previousSibling")},nextAll:function(E){return o.dir(E,"nextSibling")},prevAll:function(E){return o.dir(E,"previousSibling")},siblings:function(E){return o.sibling(E.parentNode.firstChild,E)},children:function(E){return o.sibling(E.firstChild)},contents:function(E){return o.nodeName(E,"iframe")?E.contentDocument||E.contentWindow.document:o.makeArray(E.childNodes)}},function(E,F){o.fn[E]=function(G){var H=o.map(this,F);if(G&&typeof G=="string"){H=o.multiFilter(G,H)}return this.pushStack(o.unique(H),E,G)}});o.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(E,F){o.fn[E]=function(G){var J=[],L=o(G);for(var K=0,H=L.length;K<H;K++){var I=(K>0?this.clone(true):this).get();o.fn[F].apply(o(L[K]),I);J=J.concat(I)}return this.pushStack(J,E,G)}});o.each({removeAttr:function(E){o.attr(this,E,"");if(this.nodeType==1){this.removeAttribute(E)}},addClass:function(E){o.className.add(this,E)},removeClass:function(E){o.className.remove(this,E)},toggleClass:function(F,E){if(typeof E!=="boolean"){E=!o.className.has(this,F)}o.className[E?"add":"remove"](this,F)},remove:function(E){if(!E||o.filter(E,[this]).length){o("*",this).add([this]).each(function(){o.event.remove(this);o.removeData(this)});if(this.parentNode){this.parentNode.removeChild(this)}}},empty:function(){o(this).children().remove();while(this.firstChild){this.removeChild(this.firstChild)}}},function(E,F){o.fn[E]=function(){return this.each(F,arguments)}});function j(E,F){return E[0]&&parseInt(o.curCSS(E[0],F,true),10)||0}var h="jQuery"+e(),v=0,A={};o.extend({cache:{},data:function(F,E,G){F=F==l?A:F;var H=F[h];if(!H){H=F[h]=++v}if(E&&!o.cache[H]){o.cache[H]={}}if(G!==g){o.cache[H][E]=G}return E?o.cache[H][E]:H},removeData:function(F,E){F=F==l?A:F;var H=F[h];if(E){if(o.cache[H]){delete o.cache[H][E];E="";for(E in o.cache[H]){break}if(!E){o.removeData(F)}}}else{try{delete F[h]}catch(G){if(F.removeAttribute){F.removeAttribute(h)}}delete o.cache[H]}},queue:function(F,E,H){if(F){E=(E||"fx")+"queue";var G=o.data(F,E);if(!G||o.isArray(H)){G=o.data(F,E,o.makeArray(H))}else{if(H){G.push(H)}}}return G},dequeue:function(H,G){var E=o.queue(H,G),F=E.shift();if(!G||G==="fx"){F=E[0]}if(F!==g){F.call(H)}}});o.fn.extend({data:function(E,G){var H=E.split(".");H[1]=H[1]?"."+H[1]:"";if(G===g){var F=this.triggerHandler("getData"+H[1]+"!",[H[0]]);if(F===g&&this.length){F=o.data(this[0],E)}return F===g&&H[1]?this.data(H[0]):F}else{return this.trigger("setData"+H[1]+"!",[H[0],G]).each(function(){o.data(this,E,G)})}},removeData:function(E){return this.each(function(){o.removeData(this,E)})},queue:function(E,F){if(typeof E!=="string"){F=E;E="fx"}if(F===g){return o.queue(this[0],E)}return this.each(function(){var G=o.queue(this,E,F);if(E=="fx"&&G.length==1){G[0].call(this)}})},dequeue:function(E){return this.each(function(){o.dequeue(this,E)})}});
+/*
+ * Sizzle CSS Selector Engine - v0.9.3
+ * Copyright 2009, The Dojo Foundation
+ * Released under the MIT, BSD, and GPL Licenses.
+ * More information: http://sizzlejs.com/
+ */
+(function(){var R=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?/g,L=0,H=Object.prototype.toString;var F=function(Y,U,ab,ac){ab=ab||[];U=U||document;if(U.nodeType!==1&&U.nodeType!==9){return[]}if(!Y||typeof Y!=="string"){return ab}var Z=[],W,af,ai,T,ad,V,X=true;R.lastIndex=0;while((W=R.exec(Y))!==null){Z.push(W[1]);if(W[2]){V=RegExp.rightContext;break}}if(Z.length>1&&M.exec(Y)){if(Z.length===2&&I.relative[Z[0]]){af=J(Z[0]+Z[1],U)}else{af=I.relative[Z[0]]?[U]:F(Z.shift(),U);while(Z.length){Y=Z.shift();if(I.relative[Y]){Y+=Z.shift()}af=J(Y,af)}}}else{var ae=ac?{expr:Z.pop(),set:E(ac)}:F.find(Z.pop(),Z.length===1&&U.parentNode?U.parentNode:U,Q(U));af=F.filter(ae.expr,ae.set);if(Z.length>0){ai=E(af)}else{X=false}while(Z.length){var ah=Z.pop(),ag=ah;if(!I.relative[ah]){ah=""}else{ag=Z.pop()}if(ag==null){ag=U}I.relative[ah](ai,ag,Q(U))}}if(!ai){ai=af}if(!ai){throw"Syntax error, unrecognized expression: "+(ah||Y)}if(H.call(ai)==="[object Array]"){if(!X){ab.push.apply(ab,ai)}else{if(U.nodeType===1){for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&(ai[aa]===true||ai[aa].nodeType===1&&K(U,ai[aa]))){ab.push(af[aa])}}}else{for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&ai[aa].nodeType===1){ab.push(af[aa])}}}}}else{E(ai,ab)}if(V){F(V,U,ab,ac);if(G){hasDuplicate=false;ab.sort(G);if(hasDuplicate){for(var aa=1;aa<ab.length;aa++){if(ab[aa]===ab[aa-1]){ab.splice(aa--,1)}}}}}return ab};F.matches=function(T,U){return F(T,null,null,U)};F.find=function(aa,T,ab){var Z,X;if(!aa){return[]}for(var W=0,V=I.order.length;W<V;W++){var Y=I.order[W],X;if((X=I.match[Y].exec(aa))){var U=RegExp.leftContext;if(U.substr(U.length-1)!=="\\"){X[1]=(X[1]||"").replace(/\\/g,"");Z=I.find[Y](X,T,ab);if(Z!=null){aa=aa.replace(I.match[Y],"");break}}}}if(!Z){Z=T.getElementsByTagName("*")}return{set:Z,expr:aa}};F.filter=function(ad,ac,ag,W){var V=ad,ai=[],aa=ac,Y,T,Z=ac&&ac[0]&&Q(ac[0]);while(ad&&ac.length){for(var ab in I.filter){if((Y=I.match[ab].exec(ad))!=null){var U=I.filter[ab],ah,af;T=false;if(aa==ai){ai=[]}if(I.preFilter[ab]){Y=I.preFilter[ab](Y,aa,ag,ai,W,Z);if(!Y){T=ah=true}else{if(Y===true){continue}}}if(Y){for(var X=0;(af=aa[X])!=null;X++){if(af){ah=U(af,Y,X,aa);var ae=W^!!ah;if(ag&&ah!=null){if(ae){T=true}else{aa[X]=false}}else{if(ae){ai.push(af);T=true}}}}}if(ah!==g){if(!ag){aa=ai}ad=ad.replace(I.match[ab],"");if(!T){return[]}break}}}if(ad==V){if(T==null){throw"Syntax error, unrecognized expression: "+ad}else{break}}V=ad}return aa};var I=F.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF_-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF_-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*_-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF_-]|\\.)+)(?:\((['"]*)((?:\([^\)]+\)|[^\2\(\)]*)+)\2\))?/},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(T){return T.getAttribute("href")}},relative:{"+":function(aa,T,Z){var X=typeof T==="string",ab=X&&!/\W/.test(T),Y=X&&!ab;if(ab&&!Z){T=T.toUpperCase()}for(var W=0,V=aa.length,U;W<V;W++){if((U=aa[W])){while((U=U.previousSibling)&&U.nodeType!==1){}aa[W]=Y||U&&U.nodeName===T?U||false:U===T}}if(Y){F.filter(T,aa,true)}},">":function(Z,U,aa){var X=typeof U==="string";if(X&&!/\W/.test(U)){U=aa?U:U.toUpperCase();for(var V=0,T=Z.length;V<T;V++){var Y=Z[V];if(Y){var W=Y.parentNode;Z[V]=W.nodeName===U?W:false}}}else{for(var V=0,T=Z.length;V<T;V++){var Y=Z[V];if(Y){Z[V]=X?Y.parentNode:Y.parentNode===U}}if(X){F.filter(U,Z,true)}}},"":function(W,U,Y){var V=L++,T=S;if(!U.match(/\W/)){var X=U=Y?U:U.toUpperCase();T=P}T("parentNode",U,V,W,X,Y)},"~":function(W,U,Y){var V=L++,T=S;if(typeof U==="string"&&!U.match(/\W/)){var X=U=Y?U:U.toUpperCase();T=P}T("previousSibling",U,V,W,X,Y)}},find:{ID:function(U,V,W){if(typeof V.getElementById!=="undefined"&&!W){var T=V.getElementById(U[1]);return T?[T]:[]}},NAME:function(V,Y,Z){if(typeof Y.getElementsByName!=="undefined"){var U=[],X=Y.getElementsByName(V[1]);for(var W=0,T=X.length;W<T;W++){if(X[W].getAttribute("name")===V[1]){U.push(X[W])}}return U.length===0?null:U}},TAG:function(T,U){return U.getElementsByTagName(T[1])}},preFilter:{CLASS:function(W,U,V,T,Z,aa){W=" "+W[1].replace(/\\/g,"")+" ";if(aa){return W}for(var X=0,Y;(Y=U[X])!=null;X++){if(Y){if(Z^(Y.className&&(" "+Y.className+" ").indexOf(W)>=0)){if(!V){T.push(Y)}}else{if(V){U[X]=false}}}}return false},ID:function(T){return T[1].replace(/\\/g,"")},TAG:function(U,T){for(var V=0;T[V]===false;V++){}return T[V]&&Q(T[V])?U[1]:U[1].toUpperCase()},CHILD:function(T){if(T[1]=="nth"){var U=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(T[2]=="even"&&"2n"||T[2]=="odd"&&"2n+1"||!/\D/.test(T[2])&&"0n+"+T[2]||T[2]);T[2]=(U[1]+(U[2]||1))-0;T[3]=U[3]-0}T[0]=L++;return T},ATTR:function(X,U,V,T,Y,Z){var W=X[1].replace(/\\/g,"");if(!Z&&I.attrMap[W]){X[1]=I.attrMap[W]}if(X[2]==="~="){X[4]=" "+X[4]+" "}return X},PSEUDO:function(X,U,V,T,Y){if(X[1]==="not"){if(X[3].match(R).length>1||/^\w/.test(X[3])){X[3]=F(X[3],null,null,U)}else{var W=F.filter(X[3],U,V,true^Y);if(!V){T.push.apply(T,W)}return false}}else{if(I.match.POS.test(X[0])||I.match.CHILD.test(X[0])){return true}}return X},POS:function(T){T.unshift(true);return T}},filters:{enabled:function(T){return T.disabled===false&&T.type!=="hidden"},disabled:function(T){return T.disabled===true},checked:function(T){return T.checked===true},selected:function(T){T.parentNode.selectedIndex;return T.selected===true},parent:function(T){return !!T.firstChild},empty:function(T){return !T.firstChild},has:function(V,U,T){return !!F(T[3],V).length},header:function(T){return/h\d/i.test(T.nodeName)},text:function(T){return"text"===T.type},radio:function(T){return"radio"===T.type},checkbox:function(T){return"checkbox"===T.type},file:function(T){return"file"===T.type},password:function(T){return"password"===T.type},submit:function(T){return"submit"===T.type},image:function(T){return"image"===T.type},reset:function(T){return"reset"===T.type},button:function(T){return"button"===T.type||T.nodeName.toUpperCase()==="BUTTON"},input:function(T){return/input|select|textarea|button/i.test(T.nodeName)}},setFilters:{first:function(U,T){return T===0},last:function(V,U,T,W){return U===W.length-1},even:function(U,T){return T%2===0},odd:function(U,T){return T%2===1},lt:function(V,U,T){return U<T[3]-0},gt:function(V,U,T){return U>T[3]-0},nth:function(V,U,T){return T[3]-0==U},eq:function(V,U,T){return T[3]-0==U}},filter:{PSEUDO:function(Z,V,W,aa){var U=V[1],X=I.filters[U];if(X){return X(Z,W,V,aa)}else{if(U==="contains"){return(Z.textContent||Z.innerText||"").indexOf(V[3])>=0}else{if(U==="not"){var Y=V[3];for(var W=0,T=Y.length;W<T;W++){if(Y[W]===Z){return false}}return true}}}},CHILD:function(T,W){var Z=W[1],U=T;switch(Z){case"only":case"first":while(U=U.previousSibling){if(U.nodeType===1){return false}}if(Z=="first"){return true}U=T;case"last":while(U=U.nextSibling){if(U.nodeType===1){return false}}return true;case"nth":var V=W[2],ac=W[3];if(V==1&&ac==0){return true}var Y=W[0],ab=T.parentNode;if(ab&&(ab.sizcache!==Y||!T.nodeIndex)){var X=0;for(U=ab.firstChild;U;U=U.nextSibling){if(U.nodeType===1){U.nodeIndex=++X}}ab.sizcache=Y}var aa=T.nodeIndex-ac;if(V==0){return aa==0}else{return(aa%V==0&&aa/V>=0)}}},ID:function(U,T){return U.nodeType===1&&U.getAttribute("id")===T},TAG:function(U,T){return(T==="*"&&U.nodeType===1)||U.nodeName===T},CLASS:function(U,T){return(" "+(U.className||U.getAttribute("class"))+" ").indexOf(T)>-1},ATTR:function(Y,W){var V=W[1],T=I.attrHandle[V]?I.attrHandle[V](Y):Y[V]!=null?Y[V]:Y.getAttribute(V),Z=T+"",X=W[2],U=W[4];return T==null?X==="!=":X==="="?Z===U:X==="*="?Z.indexOf(U)>=0:X==="~="?(" "+Z+" ").indexOf(U)>=0:!U?Z&&T!==false:X==="!="?Z!=U:X==="^="?Z.indexOf(U)===0:X==="$="?Z.substr(Z.length-U.length)===U:X==="|="?Z===U||Z.substr(0,U.length+1)===U+"-":false},POS:function(X,U,V,Y){var T=U[2],W=I.setFilters[T];if(W){return W(X,V,U,Y)}}}};var M=I.match.POS;for(var O in I.match){I.match[O]=RegExp(I.match[O].source+/(?![^\[]*\])(?![^\(]*\))/.source)}var E=function(U,T){U=Array.prototype.slice.call(U);if(T){T.push.apply(T,U);return T}return U};try{Array.prototype.slice.call(document.documentElement.childNodes)}catch(N){E=function(X,W){var U=W||[];if(H.call(X)==="[object Array]"){Array.prototype.push.apply(U,X)}else{if(typeof X.length==="number"){for(var V=0,T=X.length;V<T;V++){U.push(X[V])}}else{for(var V=0;X[V];V++){U.push(X[V])}}}return U}}var G;if(document.documentElement.compareDocumentPosition){G=function(U,T){var V=U.compareDocumentPosition(T)&4?-1:U===T?0:1;if(V===0){hasDuplicate=true}return V}}else{if("sourceIndex" in document.documentElement){G=function(U,T){var V=U.sourceIndex-T.sourceIndex;if(V===0){hasDuplicate=true}return V}}else{if(document.createRange){G=function(W,U){var V=W.ownerDocument.createRange(),T=U.ownerDocument.createRange();V.selectNode(W);V.collapse(true);T.selectNode(U);T.collapse(true);var X=V.compareBoundaryPoints(Range.START_TO_END,T);if(X===0){hasDuplicate=true}return X}}}}(function(){var U=document.createElement("form"),V="script"+(new Date).getTime();U.innerHTML="<input name='"+V+"'/>";var T=document.documentElement;T.insertBefore(U,T.firstChild);if(!!document.getElementById(V)){I.find.ID=function(X,Y,Z){if(typeof Y.getElementById!=="undefined"&&!Z){var W=Y.getElementById(X[1]);return W?W.id===X[1]||typeof W.getAttributeNode!=="undefined"&&W.getAttributeNode("id").nodeValue===X[1]?[W]:g:[]}};I.filter.ID=function(Y,W){var X=typeof Y.getAttributeNode!=="undefined"&&Y.getAttributeNode("id");return Y.nodeType===1&&X&&X.nodeValue===W}}T.removeChild(U)})();(function(){var T=document.createElement("div");T.appendChild(document.createComment(""));if(T.getElementsByTagName("*").length>0){I.find.TAG=function(U,Y){var X=Y.getElementsByTagName(U[1]);if(U[1]==="*"){var W=[];for(var V=0;X[V];V++){if(X[V].nodeType===1){W.push(X[V])}}X=W}return X}}T.innerHTML="<a href='#'></a>";if(T.firstChild&&typeof T.firstChild.getAttribute!=="undefined"&&T.firstChild.getAttribute("href")!=="#"){I.attrHandle.href=function(U){return U.getAttribute("href",2)}}})();if(document.querySelectorAll){(function(){var T=F,U=document.createElement("div");U.innerHTML="<p class='TEST'></p>";if(U.querySelectorAll&&U.querySelectorAll(".TEST").length===0){return}F=function(Y,X,V,W){X=X||document;if(!W&&X.nodeType===9&&!Q(X)){try{return E(X.querySelectorAll(Y),V)}catch(Z){}}return T(Y,X,V,W)};F.find=T.find;F.filter=T.filter;F.selectors=T.selectors;F.matches=T.matches})()}if(document.getElementsByClassName&&document.documentElement.getElementsByClassName){(function(){var T=document.createElement("div");T.innerHTML="<div class='test e'></div><div class='test'></div>";if(T.getElementsByClassName("e").length===0){return}T.lastChild.className="e";if(T.getElementsByClassName("e").length===1){return}I.order.splice(1,0,"CLASS");I.find.CLASS=function(U,V,W){if(typeof V.getElementsByClassName!=="undefined"&&!W){return V.getElementsByClassName(U[1])}}})()}function P(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W<V;W++){var T=ad[W];if(T){if(ab&&T.nodeType===1){T.sizcache=Y;T.sizset=W}T=T[U];var X=false;while(T){if(T.sizcache===Y){X=ad[T.sizset];break}if(T.nodeType===1&&!ac){T.sizcache=Y;T.sizset=W}if(T.nodeName===Z){X=T;break}T=T[U]}ad[W]=X}}}function S(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W<V;W++){var T=ad[W];if(T){if(ab&&T.nodeType===1){T.sizcache=Y;T.sizset=W}T=T[U];var X=false;while(T){if(T.sizcache===Y){X=ad[T.sizset];break}if(T.nodeType===1){if(!ac){T.sizcache=Y;T.sizset=W}if(typeof Z!=="string"){if(T===Z){X=true;break}}else{if(F.filter(Z,[T]).length>0){X=T;break}}}T=T[U]}ad[W]=X}}}var K=document.compareDocumentPosition?function(U,T){return U.compareDocumentPosition(T)&16}:function(U,T){return U!==T&&(U.contains?U.contains(T):true)};var Q=function(T){return T.nodeType===9&&T.documentElement.nodeName!=="HTML"||!!T.ownerDocument&&Q(T.ownerDocument)};var J=function(T,aa){var W=[],X="",Y,V=aa.nodeType?[aa]:aa;while((Y=I.match.PSEUDO.exec(T))){X+=Y[0];T=T.replace(I.match.PSEUDO,"")}T=I.relative[T]?T+"*":T;for(var Z=0,U=V.length;Z<U;Z++){F(T,V[Z],W)}return F.filter(X,W)};o.find=F;o.filter=F.filter;o.expr=F.selectors;o.expr[":"]=o.expr.filters;F.selectors.filters.hidden=function(T){return T.offsetWidth===0||T.offsetHeight===0};F.selectors.filters.visible=function(T){return T.offsetWidth>0||T.offsetHeight>0};F.selectors.filters.animated=function(T){return o.grep(o.timers,function(U){return T===U.elem}).length};o.multiFilter=function(V,T,U){if(U){V=":not("+V+")"}return F.matches(V,T)};o.dir=function(V,U){var T=[],W=V[U];while(W&&W!=document){if(W.nodeType==1){T.push(W)}W=W[U]}return T};o.nth=function(X,T,V,W){T=T||1;var U=0;for(;X;X=X[V]){if(X.nodeType==1&&++U==T){break}}return X};o.sibling=function(V,U){var T=[];for(;V;V=V.nextSibling){if(V.nodeType==1&&V!=U){T.push(V)}}return T};return;l.Sizzle=F})();o.event={add:function(I,F,H,K){if(I.nodeType==3||I.nodeType==8){return}if(I.setInterval&&I!=l){I=l}if(!H.guid){H.guid=this.guid++}if(K!==g){var G=H;H=this.proxy(G);H.data=K}var E=o.data(I,"events")||o.data(I,"events",{}),J=o.data(I,"handle")||o.data(I,"handle",function(){return typeof o!=="undefined"&&!o.event.triggered?o.event.handle.apply(arguments.callee.elem,arguments):g});J.elem=I;o.each(F.split(/\s+/),function(M,N){var O=N.split(".");N=O.shift();H.type=O.slice().sort().join(".");var L=E[N];if(o.event.specialAll[N]){o.event.specialAll[N].setup.call(I,K,O)}if(!L){L=E[N]={};if(!o.event.special[N]||o.event.special[N].setup.call(I,K,O)===false){if(I.addEventListener){I.addEventListener(N,J,false)}else{if(I.attachEvent){I.attachEvent("on"+N,J)}}}}L[H.guid]=H;o.event.global[N]=true});I=null},guid:1,global:{},remove:function(K,H,J){if(K.nodeType==3||K.nodeType==8){return}var G=o.data(K,"events"),F,E;if(G){if(H===g||(typeof H==="string"&&H.charAt(0)==".")){for(var I in G){this.remove(K,I+(H||""))}}else{if(H.type){J=H.handler;H=H.type}o.each(H.split(/\s+/),function(M,O){var Q=O.split(".");O=Q.shift();var N=RegExp("(^|\\.)"+Q.slice().sort().join(".*\\.")+"(\\.|$)");if(G[O]){if(J){delete G[O][J.guid]}else{for(var P in G[O]){if(N.test(G[O][P].type)){delete G[O][P]}}}if(o.event.specialAll[O]){o.event.specialAll[O].teardown.call(K,Q)}for(F in G[O]){break}if(!F){if(!o.event.special[O]||o.event.special[O].teardown.call(K,Q)===false){if(K.removeEventListener){K.removeEventListener(O,o.data(K,"handle"),false)}else{if(K.detachEvent){K.detachEvent("on"+O,o.data(K,"handle"))}}}F=null;delete G[O]}}})}for(F in G){break}if(!F){var L=o.data(K,"handle");if(L){L.elem=null}o.removeData(K,"events");o.removeData(K,"handle")}}},trigger:function(I,K,H,E){var G=I.type||I;if(!E){I=typeof I==="object"?I[h]?I:o.extend(o.Event(G),I):o.Event(G);if(G.indexOf("!")>=0){I.type=G=G.slice(0,-1);I.exclusive=true}if(!H){I.stopPropagation();if(this.global[G]){o.each(o.cache,function(){if(this.events&&this.events[G]){o.event.trigger(I,K,this.handle.elem)}})}}if(!H||H.nodeType==3||H.nodeType==8){return g}I.result=g;I.target=H;K=o.makeArray(K);K.unshift(I)}I.currentTarget=H;var J=o.data(H,"handle");if(J){J.apply(H,K)}if((!H[G]||(o.nodeName(H,"a")&&G=="click"))&&H["on"+G]&&H["on"+G].apply(H,K)===false){I.result=false}if(!E&&H[G]&&!I.isDefaultPrevented()&&!(o.nodeName(H,"a")&&G=="click")){this.triggered=true;try{H[G]()}catch(L){}}this.triggered=false;if(!I.isPropagationStopped()){var F=H.parentNode||H.ownerDocument;if(F){o.event.trigger(I,K,F,true)}}},handle:function(K){var J,E;K=arguments[0]=o.event.fix(K||l.event);K.currentTarget=this;var L=K.type.split(".");K.type=L.shift();J=!L.length&&!K.exclusive;var I=RegExp("(^|\\.)"+L.slice().sort().join(".*\\.")+"(\\.|$)");E=(o.data(this,"events")||{})[K.type];for(var G in E){var H=E[G];if(J||I.test(H.type)){K.handler=H;K.data=H.data;var F=H.apply(this,arguments);if(F!==g){K.result=F;if(F===false){K.preventDefault();K.stopPropagation()}}if(K.isImmediatePropagationStopped()){break}}}},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(H){if(H[h]){return H}var F=H;H=o.Event(F);for(var G=this.props.length,J;G;){J=this.props[--G];H[J]=F[J]}if(!H.target){H.target=H.srcElement||document}if(H.target.nodeType==3){H.target=H.target.parentNode}if(!H.relatedTarget&&H.fromElement){H.relatedTarget=H.fromElement==H.target?H.toElement:H.fromElement}if(H.pageX==null&&H.clientX!=null){var I=document.documentElement,E=document.body;H.pageX=H.clientX+(I&&I.scrollLeft||E&&E.scrollLeft||0)-(I.clientLeft||0);H.pageY=H.clientY+(I&&I.scrollTop||E&&E.scrollTop||0)-(I.clientTop||0)}if(!H.which&&((H.charCode||H.charCode===0)?H.charCode:H.keyCode)){H.which=H.charCode||H.keyCode}if(!H.metaKey&&H.ctrlKey){H.metaKey=H.ctrlKey}if(!H.which&&H.button){H.which=(H.button&1?1:(H.button&2?3:(H.button&4?2:0)))}return H},proxy:function(F,E){E=E||function(){return F.apply(this,arguments)};E.guid=F.guid=F.guid||E.guid||this.guid++;return E},special:{ready:{setup:B,teardown:function(){}}},specialAll:{live:{setup:function(E,F){o.event.add(this,F[0],c)},teardown:function(G){if(G.length){var E=0,F=RegExp("(^|\\.)"+G[0]+"(\\.|$)");o.each((o.data(this,"events").live||{}),function(){if(F.test(this.type)){E++}});if(E<1){o.event.remove(this,G[0],c)}}}}}};o.Event=function(E){if(!this.preventDefault){return new o.Event(E)}if(E&&E.type){this.originalEvent=E;this.type=E.type}else{this.type=E}this.timeStamp=e();this[h]=true};function k(){return false}function u(){return true}o.Event.prototype={preventDefault:function(){this.isDefaultPrevented=u;var E=this.originalEvent;if(!E){return}if(E.preventDefault){E.preventDefault()}E.returnValue=false},stopPropagation:function(){this.isPropagationStopped=u;var E=this.originalEvent;if(!E){return}if(E.stopPropagation){E.stopPropagation()}E.cancelBubble=true},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=u;this.stopPropagation()},isDefaultPrevented:k,isPropagationStopped:k,isImmediatePropagationStopped:k};var a=function(F){var E=F.relatedTarget;while(E&&E!=this){try{E=E.parentNode}catch(G){E=this}}if(E!=this){F.type=F.data;o.event.handle.apply(this,arguments)}};o.each({mouseover:"mouseenter",mouseout:"mouseleave"},function(F,E){o.event.special[E]={setup:function(){o.event.add(this,F,a,E)},teardown:function(){o.event.remove(this,F,a)}}});o.fn.extend({bind:function(F,G,E){return F=="unload"?this.one(F,G,E):this.each(function(){o.event.add(this,F,E||G,E&&G)})},one:function(G,H,F){var E=o.event.proxy(F||H,function(I){o(this).unbind(I,E);return(F||H).apply(this,arguments)});return this.each(function(){o.event.add(this,G,E,F&&H)})},unbind:function(F,E){return this.each(function(){o.event.remove(this,F,E)})},trigger:function(E,F){return this.each(function(){o.event.trigger(E,F,this)})},triggerHandler:function(E,G){if(this[0]){var F=o.Event(E);F.preventDefault();F.stopPropagation();o.event.trigger(F,G,this[0]);return F.result}},toggle:function(G){var E=arguments,F=1;while(F<E.length){o.event.proxy(G,E[F++])}return this.click(o.event.proxy(G,function(H){this.lastToggle=(this.lastToggle||0)%F;H.preventDefault();return E[this.lastToggle++].apply(this,arguments)||false}))},hover:function(E,F){return this.mouseenter(E).mouseleave(F)},ready:function(E){B();if(o.isReady){E.call(document,o)}else{o.readyList.push(E)}return this},live:function(G,F){var E=o.event.proxy(F);E.guid+=this.selector+G;o(document).bind(i(G,this.selector),this.selector,E);return this},die:function(F,E){o(document).unbind(i(F,this.selector),E?{guid:E.guid+this.selector+F}:null);return this}});function c(H){var E=RegExp("(^|\\.)"+H.type+"(\\.|$)"),G=true,F=[];o.each(o.data(this,"events").live||[],function(I,J){if(E.test(J.type)){var K=o(H.target).closest(J.data)[0];if(K){F.push({elem:K,fn:J})}}});F.sort(function(J,I){return o.data(J.elem,"closest")-o.data(I.elem,"closest")});o.each(F,function(){if(this.fn.call(this.elem,H,this.fn.data)===false){return(G=false)}});return G}function i(F,E){return["live",F,E.replace(/\./g,"`").replace(/ /g,"|")].join(".")}o.extend({isReady:false,readyList:[],ready:function(){if(!o.isReady){o.isReady=true;if(o.readyList){o.each(o.readyList,function(){this.call(document,o)});o.readyList=null}o(document).triggerHandler("ready")}}});var x=false;function B(){if(x){return}x=true;if(document.addEventListener){document.addEventListener("DOMContentLoaded",function(){document.removeEventListener("DOMContentLoaded",arguments.callee,false);o.ready()},false)}else{if(document.attachEvent){document.attachEvent("onreadystatechange",function(){if(document.readyState==="complete"){document.detachEvent("onreadystatechange",arguments.callee);o.ready()}});if(document.documentElement.doScroll&&l==l.top){(function(){if(o.isReady){return}try{document.documentElement.doScroll("left")}catch(E){setTimeout(arguments.callee,0);return}o.ready()})()}}}o.event.add(l,"load",o.ready)}o.each(("blur,focus,load,resize,scroll,unload,click,dblclick,mousedown,mouseup,mousemove,mouseover,mouseout,mouseenter,mouseleave,change,select,submit,keydown,keypress,keyup,error").split(","),function(F,E){o.fn[E]=function(G){return G?this.bind(E,G):this.trigger(E)}});o(l).bind("unload",function(){for(var E in o.cache){if(E!=1&&o.cache[E].handle){o.event.remove(o.cache[E].handle.elem)}}});(function(){o.support={};var F=document.documentElement,G=document.createElement("script"),K=document.createElement("div"),J="script"+(new Date).getTime();K.style.display="none";K.innerHTML=' <link/><table></table><a href="/a" style="color:red;float:left;opacity:.5;">a</a><select><option>text</option></select><object><param/></object>';var H=K.getElementsByTagName("*"),E=K.getElementsByTagName("a")[0];if(!H||!H.length||!E){return}o.support={leadingWhitespace:K.firstChild.nodeType==3,tbody:!K.getElementsByTagName("tbody").length,objectAll:!!K.getElementsByTagName("object")[0].getElementsByTagName("*").length,htmlSerialize:!!K.getElementsByTagName("link").length,style:/red/.test(E.getAttribute("style")),hrefNormalized:E.getAttribute("href")==="/a",opacity:E.style.opacity==="0.5",cssFloat:!!E.style.cssFloat,scriptEval:false,noCloneEvent:true,boxModel:null};G.type="text/javascript";try{G.appendChild(document.createTextNode("window."+J+"=1;"))}catch(I){}F.insertBefore(G,F.firstChild);if(l[J]){o.support.scriptEval=true;delete l[J]}F.removeChild(G);if(K.attachEvent&&K.fireEvent){K.attachEvent("onclick",function(){o.support.noCloneEvent=false;K.detachEvent("onclick",arguments.callee)});K.cloneNode(true).fireEvent("onclick")}o(function(){var L=document.createElement("div");L.style.width=L.style.paddingLeft="1px";document.body.appendChild(L);o.boxModel=o.support.boxModel=L.offsetWidth===2;document.body.removeChild(L).style.display="none"})})();var w=o.support.cssFloat?"cssFloat":"styleFloat";o.props={"for":"htmlFor","class":"className","float":w,cssFloat:w,styleFloat:w,readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",tabindex:"tabIndex"};o.fn.extend({_load:o.fn.load,load:function(G,J,K){if(typeof G!=="string"){return this._load(G)}var I=G.indexOf(" ");if(I>=0){var E=G.slice(I,G.length);G=G.slice(0,I)}var H="GET";if(J){if(o.isFunction(J)){K=J;J=null}else{if(typeof J==="object"){J=o.param(J);H="POST"}}}var F=this;o.ajax({url:G,type:H,dataType:"html",data:J,complete:function(M,L){if(L=="success"||L=="notmodified"){F.html(E?o("<div/>").append(M.responseText.replace(/<script(.|\s)*?\/script>/g,"")).find(E):M.responseText)}if(K){F.each(K,[M.responseText,L,M])}}});return this},serialize:function(){return o.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?o.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password|search/i.test(this.type))}).map(function(E,F){var G=o(this).val();return G==null?null:o.isArray(G)?o.map(G,function(I,H){return{name:F.name,value:I}}):{name:F.name,value:G}}).get()}});o.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(E,F){o.fn[F]=function(G){return this.bind(F,G)}});var r=e();o.extend({get:function(E,G,H,F){if(o.isFunction(G)){H=G;G=null}return o.ajax({type:"GET",url:E,data:G,success:H,dataType:F})},getScript:function(E,F){return o.get(E,null,F,"script")},getJSON:function(E,F,G){return o.get(E,F,G,"json")},post:function(E,G,H,F){if(o.isFunction(G)){H=G;G={}}return o.ajax({type:"POST",url:E,data:G,success:H,dataType:F})},ajaxSetup:function(E){o.extend(o.ajaxSettings,E)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return l.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest()},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(M){M=o.extend(true,M,o.extend(true,{},o.ajaxSettings,M));var W,F=/=\?(&|$)/g,R,V,G=M.type.toUpperCase();if(M.data&&M.processData&&typeof M.data!=="string"){M.data=o.param(M.data)}if(M.dataType=="jsonp"){if(G=="GET"){if(!M.url.match(F)){M.url+=(M.url.match(/\?/)?"&":"?")+(M.jsonp||"callback")+"=?"}}else{if(!M.data||!M.data.match(F)){M.data=(M.data?M.data+"&":"")+(M.jsonp||"callback")+"=?"}}M.dataType="json"}if(M.dataType=="json"&&(M.data&&M.data.match(F)||M.url.match(F))){W="jsonp"+r++;if(M.data){M.data=(M.data+"").replace(F,"="+W+"$1")}M.url=M.url.replace(F,"="+W+"$1");M.dataType="script";l[W]=function(X){V=X;I();L();l[W]=g;try{delete l[W]}catch(Y){}if(H){H.removeChild(T)}}}if(M.dataType=="script"&&M.cache==null){M.cache=false}if(M.cache===false&&G=="GET"){var E=e();var U=M.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+E+"$2");M.url=U+((U==M.url)?(M.url.match(/\?/)?"&":"?")+"_="+E:"")}if(M.data&&G=="GET"){M.url+=(M.url.match(/\?/)?"&":"?")+M.data;M.data=null}if(M.global&&!o.active++){o.event.trigger("ajaxStart")}var Q=/^(\w+:)?\/\/([^\/?#]+)/.exec(M.url);if(M.dataType=="script"&&G=="GET"&&Q&&(Q[1]&&Q[1]!=location.protocol||Q[2]!=location.host)){var H=document.getElementsByTagName("head")[0];var T=document.createElement("script");T.src=M.url;if(M.scriptCharset){T.charset=M.scriptCharset}if(!W){var O=false;T.onload=T.onreadystatechange=function(){if(!O&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){O=true;I();L();T.onload=T.onreadystatechange=null;H.removeChild(T)}}}H.appendChild(T);return g}var K=false;var J=M.xhr();if(M.username){J.open(G,M.url,M.async,M.username,M.password)}else{J.open(G,M.url,M.async)}try{if(M.data){J.setRequestHeader("Content-Type",M.contentType)}if(M.ifModified){J.setRequestHeader("If-Modified-Since",o.lastModified[M.url]||"Thu, 01 Jan 1970 00:00:00 GMT")}J.setRequestHeader("X-Requested-With","XMLHttpRequest");J.setRequestHeader("Accept",M.dataType&&M.accepts[M.dataType]?M.accepts[M.dataType]+", */*":M.accepts._default)}catch(S){}if(M.beforeSend&&M.beforeSend(J,M)===false){if(M.global&&!--o.active){o.event.trigger("ajaxStop")}J.abort();return false}if(M.global){o.event.trigger("ajaxSend",[J,M])}var N=function(X){if(J.readyState==0){if(P){clearInterval(P);P=null;if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}}else{if(!K&&J&&(J.readyState==4||X=="timeout")){K=true;if(P){clearInterval(P);P=null}R=X=="timeout"?"timeout":!o.httpSuccess(J)?"error":M.ifModified&&o.httpNotModified(J,M.url)?"notmodified":"success";if(R=="success"){try{V=o.httpData(J,M.dataType,M)}catch(Z){R="parsererror"}}if(R=="success"){var Y;try{Y=J.getResponseHeader("Last-Modified")}catch(Z){}if(M.ifModified&&Y){o.lastModified[M.url]=Y}if(!W){I()}}else{o.handleError(M,J,R)}L();if(X){J.abort()}if(M.async){J=null}}}};if(M.async){var P=setInterval(N,13);if(M.timeout>0){setTimeout(function(){if(J&&!K){N("timeout")}},M.timeout)}}try{J.send(M.data)}catch(S){o.handleError(M,J,null,S)}if(!M.async){N()}function I(){if(M.success){M.success(V,R)}if(M.global){o.event.trigger("ajaxSuccess",[J,M])}}function L(){if(M.complete){M.complete(J,R)}if(M.global){o.event.trigger("ajaxComplete",[J,M])}if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}return J},handleError:function(F,H,E,G){if(F.error){F.error(H,E,G)}if(F.global){o.event.trigger("ajaxError",[H,F,G])}},active:0,httpSuccess:function(F){try{return !F.status&&location.protocol=="file:"||(F.status>=200&&F.status<300)||F.status==304||F.status==1223}catch(E){}return false},httpNotModified:function(G,E){try{var H=G.getResponseHeader("Last-Modified");return G.status==304||H==o.lastModified[E]}catch(F){}return false},httpData:function(J,H,G){var F=J.getResponseHeader("content-type"),E=H=="xml"||!H&&F&&F.indexOf("xml")>=0,I=E?J.responseXML:J.responseText;if(E&&I.documentElement.tagName=="parsererror"){throw"parsererror"}if(G&&G.dataFilter){I=G.dataFilter(I,H)}if(typeof I==="string"){if(H=="script"){o.globalEval(I)}if(H=="json"){I=l["eval"]("("+I+")")}}return I},param:function(E){var G=[];function H(I,J){G[G.length]=encodeURIComponent(I)+"="+encodeURIComponent(J)}if(o.isArray(E)||E.jquery){o.each(E,function(){H(this.name,this.value)})}else{for(var F in E){if(o.isArray(E[F])){o.each(E[F],function(){H(F,this)})}else{H(F,o.isFunction(E[F])?E[F]():E[F])}}}return G.join("&").replace(/%20/g,"+")}});var m={},n,d=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];function t(F,E){var G={};o.each(d.concat.apply([],d.slice(0,E)),function(){G[this]=F});return G}o.fn.extend({show:function(J,L){if(J){return this.animate(t("show",3),J,L)}else{for(var H=0,F=this.length;H<F;H++){var E=o.data(this[H],"olddisplay");this[H].style.display=E||"";if(o.css(this[H],"display")==="none"){var G=this[H].tagName,K;if(m[G]){K=m[G]}else{var I=o("<"+G+" />").appendTo("body");K=I.css("display");if(K==="none"){K="block"}I.remove();m[G]=K}o.data(this[H],"olddisplay",K)}}for(var H=0,F=this.length;H<F;H++){this[H].style.display=o.data(this[H],"olddisplay")||""}return this}},hide:function(H,I){if(H){return this.animate(t("hide",3),H,I)}else{for(var G=0,F=this.length;G<F;G++){var E=o.data(this[G],"olddisplay");if(!E&&E!=="none"){o.data(this[G],"olddisplay",o.css(this[G],"display"))}}for(var G=0,F=this.length;G<F;G++){this[G].style.display="none"}return this}},_toggle:o.fn.toggle,toggle:function(G,F){var E=typeof G==="boolean";return o.isFunction(G)&&o.isFunction(F)?this._toggle.apply(this,arguments):G==null||E?this.each(function(){var H=E?G:o(this).is(":hidden");o(this)[H?"show":"hide"]()}):this.animate(t("toggle",3),G,F)},fadeTo:function(E,G,F){return this.animate({opacity:G},E,F)},animate:function(I,F,H,G){var E=o.speed(F,H,G);return this[E.queue===false?"each":"queue"](function(){var K=o.extend({},E),M,L=this.nodeType==1&&o(this).is(":hidden"),J=this;for(M in I){if(I[M]=="hide"&&L||I[M]=="show"&&!L){return K.complete.call(this)}if((M=="height"||M=="width")&&this.style){K.display=o.css(this,"display");K.overflow=this.style.overflow}}if(K.overflow!=null){this.style.overflow="hidden"}K.curAnim=o.extend({},I);o.each(I,function(O,S){var R=new o.fx(J,K,O);if(/toggle|show|hide/.test(S)){R[S=="toggle"?L?"show":"hide":S](I)}else{var Q=S.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),T=R.cur(true)||0;if(Q){var N=parseFloat(Q[2]),P=Q[3]||"px";if(P!="px"){J.style[O]=(N||1)+P;T=((N||1)/R.cur(true))*T;J.style[O]=T+P}if(Q[1]){N=((Q[1]=="-="?-1:1)*N)+T}R.custom(T,N,P)}else{R.custom(T,S,"")}}});return true})},stop:function(F,E){var G=o.timers;if(F){this.queue([])}this.each(function(){for(var H=G.length-1;H>=0;H--){if(G[H].elem==this){if(E){G[H](true)}G.splice(H,1)}}});if(!E){this.dequeue()}return this}});o.each({slideDown:t("show",1),slideUp:t("hide",1),slideToggle:t("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(E,F){o.fn[E]=function(G,H){return this.animate(F,G,H)}});o.extend({speed:function(G,H,F){var E=typeof G==="object"?G:{complete:F||!F&&H||o.isFunction(G)&&G,duration:G,easing:F&&H||H&&!o.isFunction(H)&&H};E.duration=o.fx.off?0:typeof E.duration==="number"?E.duration:o.fx.speeds[E.duration]||o.fx.speeds._default;E.old=E.complete;E.complete=function(){if(E.queue!==false){o(this).dequeue()}if(o.isFunction(E.old)){E.old.call(this)}};return E},easing:{linear:function(G,H,E,F){return E+F*G},swing:function(G,H,E,F){return((-Math.cos(G*Math.PI)/2)+0.5)*F+E}},timers:[],fx:function(F,E,G){this.options=E;this.elem=F;this.prop=G;if(!E.orig){E.orig={}}}});o.fx.prototype={update:function(){if(this.options.step){this.options.step.call(this.elem,this.now,this)}(o.fx.step[this.prop]||o.fx.step._default)(this);if((this.prop=="height"||this.prop=="width")&&this.elem.style){this.elem.style.display="block"}},cur:function(F){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null)){return this.elem[this.prop]}var E=parseFloat(o.css(this.elem,this.prop,F));return E&&E>-10000?E:parseFloat(o.curCSS(this.elem,this.prop))||0},custom:function(I,H,G){this.startTime=e();this.start=I;this.end=H;this.unit=G||this.unit||"px";this.now=this.start;this.pos=this.state=0;var E=this;function F(J){return E.step(J)}F.elem=this.elem;if(F()&&o.timers.push(F)&&!n){n=setInterval(function(){var K=o.timers;for(var J=0;J<K.length;J++){if(!K[J]()){K.splice(J--,1)}}if(!K.length){clearInterval(n);n=g}},13)}},show:function(){this.options.orig[this.prop]=o.attr(this.elem.style,this.prop);this.options.show=true;this.custom(this.prop=="width"||this.prop=="height"?1:0,this.cur());o(this.elem).show()},hide:function(){this.options.orig[this.prop]=o.attr(this.elem.style,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(H){var G=e();if(H||G>=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var E=true;for(var F in this.options.curAnim){if(this.options.curAnim[F]!==true){E=false}}if(E){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(o.css(this.elem,"display")=="none"){this.elem.style.display="block"}}if(this.options.hide){o(this.elem).hide()}if(this.options.hide||this.options.show){for(var I in this.options.curAnim){o.attr(this.elem.style,I,this.options.orig[I])}}this.options.complete.call(this.elem)}return false}else{var J=G-this.startTime;this.state=J/this.options.duration;this.pos=o.easing[this.options.easing||(o.easing.swing?"swing":"linear")](this.state,J,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update()}return true}};o.extend(o.fx,{speeds:{slow:600,fast:200,_default:400},step:{opacity:function(E){o.attr(E.elem.style,"opacity",E.now)},_default:function(E){if(E.elem.style&&E.elem.style[E.prop]!=null){E.elem.style[E.prop]=E.now+E.unit}else{E.elem[E.prop]=E.now}}}});if(document.documentElement.getBoundingClientRect){o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}var G=this[0].getBoundingClientRect(),J=this[0].ownerDocument,F=J.body,E=J.documentElement,L=E.clientTop||F.clientTop||0,K=E.clientLeft||F.clientLeft||0,I=G.top+(self.pageYOffset||o.boxModel&&E.scrollTop||F.scrollTop)-L,H=G.left+(self.pageXOffset||o.boxModel&&E.scrollLeft||F.scrollLeft)-K;return{top:I,left:H}}}else{o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}o.offset.initialized||o.offset.initialize();var J=this[0],G=J.offsetParent,F=J,O=J.ownerDocument,M,H=O.documentElement,K=O.body,L=O.defaultView,E=L.getComputedStyle(J,null),N=J.offsetTop,I=J.offsetLeft;while((J=J.parentNode)&&J!==K&&J!==H){M=L.getComputedStyle(J,null);N-=J.scrollTop,I-=J.scrollLeft;if(J===G){N+=J.offsetTop,I+=J.offsetLeft;if(o.offset.doesNotAddBorder&&!(o.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(J.tagName))){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}F=G,G=J.offsetParent}if(o.offset.subtractsBorderForOverflowNotVisible&&M.overflow!=="visible"){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}E=M}if(E.position==="relative"||E.position==="static"){N+=K.offsetTop,I+=K.offsetLeft}if(E.position==="fixed"){N+=Math.max(H.scrollTop,K.scrollTop),I+=Math.max(H.scrollLeft,K.scrollLeft)}return{top:N,left:I}}}o.offset={initialize:function(){if(this.initialized){return}var L=document.body,F=document.createElement("div"),H,G,N,I,M,E,J=L.style.marginTop,K='<div style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;"><div></div></div><table style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;" cellpadding="0" cellspacing="0"><tr><td></td></tr></table>';M={position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"};for(E in M){F.style[E]=M[E]}F.innerHTML=K;L.insertBefore(F,L.firstChild);H=F.firstChild,G=H.firstChild,I=H.nextSibling.firstChild.firstChild;this.doesNotAddBorder=(G.offsetTop!==5);this.doesAddBorderForTableAndCells=(I.offsetTop===5);H.style.overflow="hidden",H.style.position="relative";this.subtractsBorderForOverflowNotVisible=(G.offsetTop===-5);L.style.marginTop="1px";this.doesNotIncludeMarginInBodyOffset=(L.offsetTop===0);L.style.marginTop=J;L.removeChild(F);this.initialized=true},bodyOffset:function(E){o.offset.initialized||o.offset.initialize();var G=E.offsetTop,F=E.offsetLeft;if(o.offset.doesNotIncludeMarginInBodyOffset){G+=parseInt(o.curCSS(E,"marginTop",true),10)||0,F+=parseInt(o.curCSS(E,"marginLeft",true),10)||0}return{top:G,left:F}}};o.fn.extend({position:function(){var I=0,H=0,F;if(this[0]){var G=this.offsetParent(),J=this.offset(),E=/^body|html$/i.test(G[0].tagName)?{top:0,left:0}:G.offset();J.top-=j(this,"marginTop");J.left-=j(this,"marginLeft");E.top+=j(G,"borderTopWidth");E.left+=j(G,"borderLeftWidth");F={top:J.top-E.top,left:J.left-E.left}}return F},offsetParent:function(){var E=this[0].offsetParent||document.body;while(E&&(!/^body|html$/i.test(E.tagName)&&o.css(E,"position")=="static")){E=E.offsetParent}return o(E)}});o.each(["Left","Top"],function(F,E){var G="scroll"+E;o.fn[G]=function(H){if(!this[0]){return null}return H!==g?this.each(function(){this==l||this==document?l.scrollTo(!F?H:o(l).scrollLeft(),F?H:o(l).scrollTop()):this[G]=H}):this[0]==l||this[0]==document?self[F?"pageYOffset":"pageXOffset"]||o.boxModel&&document.documentElement[G]||document.body[G]:this[0][G]}});o.each(["Height","Width"],function(I,G){var E=I?"Left":"Top",H=I?"Right":"Bottom",F=G.toLowerCase();o.fn["inner"+G]=function(){return this[0]?o.css(this[0],F,false,"padding"):null};o.fn["outer"+G]=function(K){return this[0]?o.css(this[0],F,false,K?"margin":"border"):null};var J=G.toLowerCase();o.fn[J]=function(K){return this[0]==l?document.compatMode=="CSS1Compat"&&document.documentElement["client"+G]||document.body["client"+G]:this[0]==document?Math.max(document.documentElement["client"+G],document.body["scroll"+G],document.documentElement["scroll"+G],document.body["offset"+G],document.documentElement["offset"+G]):K===g?(this.length?o.css(this[0],J):null):this.css(J,typeof K==="string"?K:K+"px")}})})(); \ No newline at end of file
diff --git a/library/prettyphoto/js/jquery-1.4.4.min.js b/library/prettyphoto/js/jquery-1.4.4.min.js
new file mode 100644
index 000000000..2bd4cbb8a
--- /dev/null
+++ b/library/prettyphoto/js/jquery-1.4.4.min.js
@@ -0,0 +1,167 @@
+/*!
+ * jQuery JavaScript Library v1.4.4
+ * http://jquery.com/
+ *
+ * Copyright 2010, John Resig
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ * Copyright 2010, The Dojo Foundation
+ * Released under the MIT, BSD, and GPL Licenses.
+ *
+ * Date: Thu Nov 11 19:04:53 2010 -0500
+ */
+(function(E,B){function ka(a,b,d){if(d===B&&a.nodeType===1){d=a.getAttribute("data-"+b);if(typeof d==="string"){try{d=d==="true"?true:d==="false"?false:d==="null"?null:!c.isNaN(d)?parseFloat(d):Ja.test(d)?c.parseJSON(d):d}catch(e){}c.data(a,b,d)}else d=B}return d}function U(){return false}function ca(){return true}function la(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}function Ka(a){var b,d,e,f,h,l,k,o,x,r,A,C=[];f=[];h=c.data(this,this.nodeType?"events":"__events__");if(typeof h==="function")h=
+h.events;if(!(a.liveFired===this||!h||!h.live||a.button&&a.type==="click")){if(a.namespace)A=RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)");a.liveFired=this;var J=h.live.slice(0);for(k=0;k<J.length;k++){h=J[k];h.origType.replace(X,"")===a.type?f.push(h.selector):J.splice(k--,1)}f=c(a.target).closest(f,a.currentTarget);o=0;for(x=f.length;o<x;o++){r=f[o];for(k=0;k<J.length;k++){h=J[k];if(r.selector===h.selector&&(!A||A.test(h.namespace))){l=r.elem;e=null;if(h.preType==="mouseenter"||
+h.preType==="mouseleave"){a.type=h.preType;e=c(a.relatedTarget).closest(h.selector)[0]}if(!e||e!==l)C.push({elem:l,handleObj:h,level:r.level})}}}o=0;for(x=C.length;o<x;o++){f=C[o];if(d&&f.level>d)break;a.currentTarget=f.elem;a.data=f.handleObj.data;a.handleObj=f.handleObj;A=f.handleObj.origHandler.apply(f.elem,arguments);if(A===false||a.isPropagationStopped()){d=f.level;if(A===false)b=false;if(a.isImmediatePropagationStopped())break}}return b}}function Y(a,b){return(a&&a!=="*"?a+".":"")+b.replace(La,
+"`").replace(Ma,"&")}function ma(a,b,d){if(c.isFunction(b))return c.grep(a,function(f,h){return!!b.call(f,h,f)===d});else if(b.nodeType)return c.grep(a,function(f){return f===b===d});else if(typeof b==="string"){var e=c.grep(a,function(f){return f.nodeType===1});if(Na.test(b))return c.filter(b,e,!d);else b=c.filter(b,e)}return c.grep(a,function(f){return c.inArray(f,b)>=0===d})}function na(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var e=c.data(a[d++]),f=c.data(this,
+e);if(e=e&&e.events){delete f.handle;f.events={};for(var h in e)for(var l in e[h])c.event.add(this,h,e[h][l],e[h][l].data)}}})}function Oa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function oa(a,b,d){var e=b==="width"?a.offsetWidth:a.offsetHeight;if(d==="border")return e;c.each(b==="width"?Pa:Qa,function(){d||(e-=parseFloat(c.css(a,"padding"+this))||0);if(d==="margin")e+=parseFloat(c.css(a,
+"margin"+this))||0;else e-=parseFloat(c.css(a,"border"+this+"Width"))||0});return e}function da(a,b,d,e){if(c.isArray(b)&&b.length)c.each(b,function(f,h){d||Ra.test(a)?e(a,h):da(a+"["+(typeof h==="object"||c.isArray(h)?f:"")+"]",h,d,e)});else if(!d&&b!=null&&typeof b==="object")c.isEmptyObject(b)?e(a,""):c.each(b,function(f,h){da(a+"["+f+"]",h,d,e)});else e(a,b)}function S(a,b){var d={};c.each(pa.concat.apply([],pa.slice(0,b)),function(){d[this]=a});return d}function qa(a){if(!ea[a]){var b=c("<"+
+a+">").appendTo("body"),d=b.css("display");b.remove();if(d==="none"||d==="")d="block";ea[a]=d}return ea[a]}function fa(a){return c.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var t=E.document,c=function(){function a(){if(!b.isReady){try{t.documentElement.doScroll("left")}catch(j){setTimeout(a,1);return}b.ready()}}var b=function(j,s){return new b.fn.init(j,s)},d=E.jQuery,e=E.$,f,h=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/,l=/\S/,k=/^\s+/,o=/\s+$/,x=/\W/,r=/\d/,A=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,
+C=/^[\],:{}\s]*$/,J=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,w=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,I=/(?:^|:|,)(?:\s*\[)+/g,L=/(webkit)[ \/]([\w.]+)/,g=/(opera)(?:.*version)?[ \/]([\w.]+)/,i=/(msie) ([\w.]+)/,n=/(mozilla)(?:.*? rv:([\w.]+))?/,m=navigator.userAgent,p=false,q=[],u,y=Object.prototype.toString,F=Object.prototype.hasOwnProperty,M=Array.prototype.push,N=Array.prototype.slice,O=String.prototype.trim,D=Array.prototype.indexOf,R={};b.fn=b.prototype={init:function(j,
+s){var v,z,H;if(!j)return this;if(j.nodeType){this.context=this[0]=j;this.length=1;return this}if(j==="body"&&!s&&t.body){this.context=t;this[0]=t.body;this.selector="body";this.length=1;return this}if(typeof j==="string")if((v=h.exec(j))&&(v[1]||!s))if(v[1]){H=s?s.ownerDocument||s:t;if(z=A.exec(j))if(b.isPlainObject(s)){j=[t.createElement(z[1])];b.fn.attr.call(j,s,true)}else j=[H.createElement(z[1])];else{z=b.buildFragment([v[1]],[H]);j=(z.cacheable?z.fragment.cloneNode(true):z.fragment).childNodes}return b.merge(this,
+j)}else{if((z=t.getElementById(v[2]))&&z.parentNode){if(z.id!==v[2])return f.find(j);this.length=1;this[0]=z}this.context=t;this.selector=j;return this}else if(!s&&!x.test(j)){this.selector=j;this.context=t;j=t.getElementsByTagName(j);return b.merge(this,j)}else return!s||s.jquery?(s||f).find(j):b(s).find(j);else if(b.isFunction(j))return f.ready(j);if(j.selector!==B){this.selector=j.selector;this.context=j.context}return b.makeArray(j,this)},selector:"",jquery:"1.4.4",length:0,size:function(){return this.length},
+toArray:function(){return N.call(this,0)},get:function(j){return j==null?this.toArray():j<0?this.slice(j)[0]:this[j]},pushStack:function(j,s,v){var z=b();b.isArray(j)?M.apply(z,j):b.merge(z,j);z.prevObject=this;z.context=this.context;if(s==="find")z.selector=this.selector+(this.selector?" ":"")+v;else if(s)z.selector=this.selector+"."+s+"("+v+")";return z},each:function(j,s){return b.each(this,j,s)},ready:function(j){b.bindReady();if(b.isReady)j.call(t,b);else q&&q.push(j);return this},eq:function(j){return j===
+-1?this.slice(j):this.slice(j,+j+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(N.apply(this,arguments),"slice",N.call(arguments).join(","))},map:function(j){return this.pushStack(b.map(this,function(s,v){return j.call(s,v,s)}))},end:function(){return this.prevObject||b(null)},push:M,sort:[].sort,splice:[].splice};b.fn.init.prototype=b.fn;b.extend=b.fn.extend=function(){var j,s,v,z,H,G=arguments[0]||{},K=1,Q=arguments.length,ga=false;
+if(typeof G==="boolean"){ga=G;G=arguments[1]||{};K=2}if(typeof G!=="object"&&!b.isFunction(G))G={};if(Q===K){G=this;--K}for(;K<Q;K++)if((j=arguments[K])!=null)for(s in j){v=G[s];z=j[s];if(G!==z)if(ga&&z&&(b.isPlainObject(z)||(H=b.isArray(z)))){if(H){H=false;v=v&&b.isArray(v)?v:[]}else v=v&&b.isPlainObject(v)?v:{};G[s]=b.extend(ga,v,z)}else if(z!==B)G[s]=z}return G};b.extend({noConflict:function(j){E.$=e;if(j)E.jQuery=d;return b},isReady:false,readyWait:1,ready:function(j){j===true&&b.readyWait--;
+if(!b.readyWait||j!==true&&!b.isReady){if(!t.body)return setTimeout(b.ready,1);b.isReady=true;if(!(j!==true&&--b.readyWait>0))if(q){var s=0,v=q;for(q=null;j=v[s++];)j.call(t,b);b.fn.trigger&&b(t).trigger("ready").unbind("ready")}}},bindReady:function(){if(!p){p=true;if(t.readyState==="complete")return setTimeout(b.ready,1);if(t.addEventListener){t.addEventListener("DOMContentLoaded",u,false);E.addEventListener("load",b.ready,false)}else if(t.attachEvent){t.attachEvent("onreadystatechange",u);E.attachEvent("onload",
+b.ready);var j=false;try{j=E.frameElement==null}catch(s){}t.documentElement.doScroll&&j&&a()}}},isFunction:function(j){return b.type(j)==="function"},isArray:Array.isArray||function(j){return b.type(j)==="array"},isWindow:function(j){return j&&typeof j==="object"&&"setInterval"in j},isNaN:function(j){return j==null||!r.test(j)||isNaN(j)},type:function(j){return j==null?String(j):R[y.call(j)]||"object"},isPlainObject:function(j){if(!j||b.type(j)!=="object"||j.nodeType||b.isWindow(j))return false;if(j.constructor&&
+!F.call(j,"constructor")&&!F.call(j.constructor.prototype,"isPrototypeOf"))return false;for(var s in j);return s===B||F.call(j,s)},isEmptyObject:function(j){for(var s in j)return false;return true},error:function(j){throw j;},parseJSON:function(j){if(typeof j!=="string"||!j)return null;j=b.trim(j);if(C.test(j.replace(J,"@").replace(w,"]").replace(I,"")))return E.JSON&&E.JSON.parse?E.JSON.parse(j):(new Function("return "+j))();else b.error("Invalid JSON: "+j)},noop:function(){},globalEval:function(j){if(j&&
+l.test(j)){var s=t.getElementsByTagName("head")[0]||t.documentElement,v=t.createElement("script");v.type="text/javascript";if(b.support.scriptEval)v.appendChild(t.createTextNode(j));else v.text=j;s.insertBefore(v,s.firstChild);s.removeChild(v)}},nodeName:function(j,s){return j.nodeName&&j.nodeName.toUpperCase()===s.toUpperCase()},each:function(j,s,v){var z,H=0,G=j.length,K=G===B||b.isFunction(j);if(v)if(K)for(z in j){if(s.apply(j[z],v)===false)break}else for(;H<G;){if(s.apply(j[H++],v)===false)break}else if(K)for(z in j){if(s.call(j[z],
+z,j[z])===false)break}else for(v=j[0];H<G&&s.call(v,H,v)!==false;v=j[++H]);return j},trim:O?function(j){return j==null?"":O.call(j)}:function(j){return j==null?"":j.toString().replace(k,"").replace(o,"")},makeArray:function(j,s){var v=s||[];if(j!=null){var z=b.type(j);j.length==null||z==="string"||z==="function"||z==="regexp"||b.isWindow(j)?M.call(v,j):b.merge(v,j)}return v},inArray:function(j,s){if(s.indexOf)return s.indexOf(j);for(var v=0,z=s.length;v<z;v++)if(s[v]===j)return v;return-1},merge:function(j,
+s){var v=j.length,z=0;if(typeof s.length==="number")for(var H=s.length;z<H;z++)j[v++]=s[z];else for(;s[z]!==B;)j[v++]=s[z++];j.length=v;return j},grep:function(j,s,v){var z=[],H;v=!!v;for(var G=0,K=j.length;G<K;G++){H=!!s(j[G],G);v!==H&&z.push(j[G])}return z},map:function(j,s,v){for(var z=[],H,G=0,K=j.length;G<K;G++){H=s(j[G],G,v);if(H!=null)z[z.length]=H}return z.concat.apply([],z)},guid:1,proxy:function(j,s,v){if(arguments.length===2)if(typeof s==="string"){v=j;j=v[s];s=B}else if(s&&!b.isFunction(s)){v=
+s;s=B}if(!s&&j)s=function(){return j.apply(v||this,arguments)};if(j)s.guid=j.guid=j.guid||s.guid||b.guid++;return s},access:function(j,s,v,z,H,G){var K=j.length;if(typeof s==="object"){for(var Q in s)b.access(j,Q,s[Q],z,H,v);return j}if(v!==B){z=!G&&z&&b.isFunction(v);for(Q=0;Q<K;Q++)H(j[Q],s,z?v.call(j[Q],Q,H(j[Q],s)):v,G);return j}return K?H(j[0],s):B},now:function(){return(new Date).getTime()},uaMatch:function(j){j=j.toLowerCase();j=L.exec(j)||g.exec(j)||i.exec(j)||j.indexOf("compatible")<0&&n.exec(j)||
+[];return{browser:j[1]||"",version:j[2]||"0"}},browser:{}});b.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(j,s){R["[object "+s+"]"]=s.toLowerCase()});m=b.uaMatch(m);if(m.browser){b.browser[m.browser]=true;b.browser.version=m.version}if(b.browser.webkit)b.browser.safari=true;if(D)b.inArray=function(j,s){return D.call(s,j)};if(!/\s/.test("\u00a0")){k=/^[\s\xA0]+/;o=/[\s\xA0]+$/}f=b(t);if(t.addEventListener)u=function(){t.removeEventListener("DOMContentLoaded",u,
+false);b.ready()};else if(t.attachEvent)u=function(){if(t.readyState==="complete"){t.detachEvent("onreadystatechange",u);b.ready()}};return E.jQuery=E.$=b}();(function(){c.support={};var a=t.documentElement,b=t.createElement("script"),d=t.createElement("div"),e="script"+c.now();d.style.display="none";d.innerHTML=" <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";var f=d.getElementsByTagName("*"),h=d.getElementsByTagName("a")[0],l=t.createElement("select"),
+k=l.appendChild(t.createElement("option"));if(!(!f||!f.length||!h)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(h.getAttribute("style")),hrefNormalized:h.getAttribute("href")==="/a",opacity:/^0.55$/.test(h.style.opacity),cssFloat:!!h.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:k.selected,deleteExpando:true,optDisabled:false,checkClone:false,
+scriptEval:false,noCloneEvent:true,boxModel:null,inlineBlockNeedsLayout:false,shrinkWrapBlocks:false,reliableHiddenOffsets:true};l.disabled=true;c.support.optDisabled=!k.disabled;b.type="text/javascript";try{b.appendChild(t.createTextNode("window."+e+"=1;"))}catch(o){}a.insertBefore(b,a.firstChild);if(E[e]){c.support.scriptEval=true;delete E[e]}try{delete b.test}catch(x){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function r(){c.support.noCloneEvent=
+false;d.detachEvent("onclick",r)});d.cloneNode(true).fireEvent("onclick")}d=t.createElement("div");d.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";a=t.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var r=t.createElement("div");r.style.width=r.style.paddingLeft="1px";t.body.appendChild(r);c.boxModel=c.support.boxModel=r.offsetWidth===2;if("zoom"in r.style){r.style.display="inline";r.style.zoom=
+1;c.support.inlineBlockNeedsLayout=r.offsetWidth===2;r.style.display="";r.innerHTML="<div style='width:4px;'></div>";c.support.shrinkWrapBlocks=r.offsetWidth!==2}r.innerHTML="<table><tr><td style='padding:0;display:none'></td><td>t</td></tr></table>";var A=r.getElementsByTagName("td");c.support.reliableHiddenOffsets=A[0].offsetHeight===0;A[0].style.display="";A[1].style.display="none";c.support.reliableHiddenOffsets=c.support.reliableHiddenOffsets&&A[0].offsetHeight===0;r.innerHTML="";t.body.removeChild(r).style.display=
+"none"});a=function(r){var A=t.createElement("div");r="on"+r;var C=r in A;if(!C){A.setAttribute(r,"return;");C=typeof A[r]==="function"}return C};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=f=h=null}})();var ra={},Ja=/^(?:\{.*\}|\[.*\])$/;c.extend({cache:{},uuid:0,expando:"jQuery"+c.now(),noData:{embed:true,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:true},data:function(a,b,d){if(c.acceptData(a)){a=a==E?ra:a;var e=a.nodeType,f=e?a[c.expando]:null,h=
+c.cache;if(!(e&&!f&&typeof b==="string"&&d===B)){if(e)f||(a[c.expando]=f=++c.uuid);else h=a;if(typeof b==="object")if(e)h[f]=c.extend(h[f],b);else c.extend(h,b);else if(e&&!h[f])h[f]={};a=e?h[f]:h;if(d!==B)a[b]=d;return typeof b==="string"?a[b]:a}}},removeData:function(a,b){if(c.acceptData(a)){a=a==E?ra:a;var d=a.nodeType,e=d?a[c.expando]:a,f=c.cache,h=d?f[e]:e;if(b){if(h){delete h[b];d&&c.isEmptyObject(h)&&c.removeData(a)}}else if(d&&c.support.deleteExpando)delete a[c.expando];else if(a.removeAttribute)a.removeAttribute(c.expando);
+else if(d)delete f[e];else for(var l in a)delete a[l]}},acceptData:function(a){if(a.nodeName){var b=c.noData[a.nodeName.toLowerCase()];if(b)return!(b===true||a.getAttribute("classid")!==b)}return true}});c.fn.extend({data:function(a,b){var d=null;if(typeof a==="undefined"){if(this.length){var e=this[0].attributes,f;d=c.data(this[0]);for(var h=0,l=e.length;h<l;h++){f=e[h].name;if(f.indexOf("data-")===0){f=f.substr(5);ka(this[0],f,d[f])}}}return d}else if(typeof a==="object")return this.each(function(){c.data(this,
+a)});var k=a.split(".");k[1]=k[1]?"."+k[1]:"";if(b===B){d=this.triggerHandler("getData"+k[1]+"!",[k[0]]);if(d===B&&this.length){d=c.data(this[0],a);d=ka(this[0],a,d)}return d===B&&k[1]?this.data(k[0]):d}else return this.each(function(){var o=c(this),x=[k[0],b];o.triggerHandler("setData"+k[1]+"!",x);c.data(this,a,b);o.triggerHandler("changeData"+k[1]+"!",x)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var e=
+c.data(a,b);if(!d)return e||[];if(!e||c.isArray(d))e=c.data(a,b,c.makeArray(d));else e.push(d);return e}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),e=d.shift();if(e==="inprogress")e=d.shift();if(e){b==="fx"&&d.unshift("inprogress");e.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b===B)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,
+a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var sa=/[\n\t]/g,ha=/\s+/,Sa=/\r/g,Ta=/^(?:href|src|style)$/,Ua=/^(?:button|input)$/i,Va=/^(?:button|input|object|select|textarea)$/i,Wa=/^a(?:rea)?$/i,ta=/^(?:radio|checkbox)$/i;c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",
+colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};c.fn.extend({attr:function(a,b){return c.access(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(x){var r=c(this);r.addClass(a.call(this,x,r.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ha),d=0,e=this.length;d<e;d++){var f=this[d];if(f.nodeType===
+1)if(f.className){for(var h=" "+f.className+" ",l=f.className,k=0,o=b.length;k<o;k++)if(h.indexOf(" "+b[k]+" ")<0)l+=" "+b[k];f.className=c.trim(l)}else f.className=a}return this},removeClass:function(a){if(c.isFunction(a))return this.each(function(o){var x=c(this);x.removeClass(a.call(this,o,x.attr("class")))});if(a&&typeof a==="string"||a===B)for(var b=(a||"").split(ha),d=0,e=this.length;d<e;d++){var f=this[d];if(f.nodeType===1&&f.className)if(a){for(var h=(" "+f.className+" ").replace(sa," "),
+l=0,k=b.length;l<k;l++)h=h.replace(" "+b[l]+" "," ");f.className=c.trim(h)}else f.className=""}return this},toggleClass:function(a,b){var d=typeof a,e=typeof b==="boolean";if(c.isFunction(a))return this.each(function(f){var h=c(this);h.toggleClass(a.call(this,f,h.attr("class"),b),b)});return this.each(function(){if(d==="string")for(var f,h=0,l=c(this),k=b,o=a.split(ha);f=o[h++];){k=e?k:!l.hasClass(f);l[k?"addClass":"removeClass"](f)}else if(d==="undefined"||d==="boolean"){this.className&&c.data(this,
+"__className__",this.className);this.className=this.className||a===false?"":c.data(this,"__className__")||""}})},hasClass:function(a){a=" "+a+" ";for(var b=0,d=this.length;b<d;b++)if((" "+this[b].className+" ").replace(sa," ").indexOf(a)>-1)return true;return false},val:function(a){if(!arguments.length){var b=this[0];if(b){if(c.nodeName(b,"option")){var d=b.attributes.value;return!d||d.specified?b.value:b.text}if(c.nodeName(b,"select")){var e=b.selectedIndex;d=[];var f=b.options;b=b.type==="select-one";
+if(e<0)return null;var h=b?e:0;for(e=b?e+1:f.length;h<e;h++){var l=f[h];if(l.selected&&(c.support.optDisabled?!l.disabled:l.getAttribute("disabled")===null)&&(!l.parentNode.disabled||!c.nodeName(l.parentNode,"optgroup"))){a=c(l).val();if(b)return a;d.push(a)}}return d}if(ta.test(b.type)&&!c.support.checkOn)return b.getAttribute("value")===null?"on":b.value;return(b.value||"").replace(Sa,"")}return B}var k=c.isFunction(a);return this.each(function(o){var x=c(this),r=a;if(this.nodeType===1){if(k)r=
+a.call(this,o,x.val());if(r==null)r="";else if(typeof r==="number")r+="";else if(c.isArray(r))r=c.map(r,function(C){return C==null?"":C+""});if(c.isArray(r)&&ta.test(this.type))this.checked=c.inArray(x.val(),r)>=0;else if(c.nodeName(this,"select")){var A=c.makeArray(r);c("option",this).each(function(){this.selected=c.inArray(c(this).val(),A)>=0});if(!A.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},
+attr:function(a,b,d,e){if(!a||a.nodeType===3||a.nodeType===8)return B;if(e&&b in c.attrFn)return c(a)[b](d);e=a.nodeType!==1||!c.isXMLDoc(a);var f=d!==B;b=e&&c.props[b]||b;var h=Ta.test(b);if((b in a||a[b]!==B)&&e&&!h){if(f){b==="type"&&Ua.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed");if(d===null)a.nodeType===1&&a.removeAttribute(b);else a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&
+b.specified?b.value:Va.test(a.nodeName)||Wa.test(a.nodeName)&&a.href?0:B;return a[b]}if(!c.support.style&&e&&b==="style"){if(f)a.style.cssText=""+d;return a.style.cssText}f&&a.setAttribute(b,""+d);if(!a.attributes[b]&&a.hasAttribute&&!a.hasAttribute(b))return B;a=!c.support.hrefNormalized&&e&&h?a.getAttribute(b,2):a.getAttribute(b);return a===null?B:a}});var X=/\.(.*)$/,ia=/^(?:textarea|input|select)$/i,La=/\./g,Ma=/ /g,Xa=/[^\w\s.|`]/g,Ya=function(a){return a.replace(Xa,"\\$&")},ua={focusin:0,focusout:0};
+c.event={add:function(a,b,d,e){if(!(a.nodeType===3||a.nodeType===8)){if(c.isWindow(a)&&a!==E&&!a.frameElement)a=E;if(d===false)d=U;else if(!d)return;var f,h;if(d.handler){f=d;d=f.handler}if(!d.guid)d.guid=c.guid++;if(h=c.data(a)){var l=a.nodeType?"events":"__events__",k=h[l],o=h.handle;if(typeof k==="function"){o=k.handle;k=k.events}else if(!k){a.nodeType||(h[l]=h=function(){});h.events=k={}}if(!o)h.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem,
+arguments):B};o.elem=a;b=b.split(" ");for(var x=0,r;l=b[x++];){h=f?c.extend({},f):{handler:d,data:e};if(l.indexOf(".")>-1){r=l.split(".");l=r.shift();h.namespace=r.slice(0).sort().join(".")}else{r=[];h.namespace=""}h.type=l;if(!h.guid)h.guid=d.guid;var A=k[l],C=c.event.special[l]||{};if(!A){A=k[l]=[];if(!C.setup||C.setup.call(a,e,r,o)===false)if(a.addEventListener)a.addEventListener(l,o,false);else a.attachEvent&&a.attachEvent("on"+l,o)}if(C.add){C.add.call(a,h);if(!h.handler.guid)h.handler.guid=
+d.guid}A.push(h);c.event.global[l]=true}a=null}}},global:{},remove:function(a,b,d,e){if(!(a.nodeType===3||a.nodeType===8)){if(d===false)d=U;var f,h,l=0,k,o,x,r,A,C,J=a.nodeType?"events":"__events__",w=c.data(a),I=w&&w[J];if(w&&I){if(typeof I==="function"){w=I;I=I.events}if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(f in I)c.event.remove(a,f+b)}else{for(b=b.split(" ");f=b[l++];){r=f;k=f.indexOf(".")<0;o=[];if(!k){o=f.split(".");f=o.shift();x=RegExp("(^|\\.)"+
+c.map(o.slice(0).sort(),Ya).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(A=I[f])if(d){r=c.event.special[f]||{};for(h=e||0;h<A.length;h++){C=A[h];if(d.guid===C.guid){if(k||x.test(C.namespace)){e==null&&A.splice(h--,1);r.remove&&r.remove.call(a,C)}if(e!=null)break}}if(A.length===0||e!=null&&A.length===1){if(!r.teardown||r.teardown.call(a,o)===false)c.removeEvent(a,f,w.handle);delete I[f]}}else for(h=0;h<A.length;h++){C=A[h];if(k||x.test(C.namespace)){c.event.remove(a,r,C.handler,h);A.splice(h--,1)}}}if(c.isEmptyObject(I)){if(b=
+w.handle)b.elem=null;delete w.events;delete w.handle;if(typeof w==="function")c.removeData(a,J);else c.isEmptyObject(w)&&c.removeData(a)}}}}},trigger:function(a,b,d,e){var f=a.type||a;if(!e){a=typeof a==="object"?a[c.expando]?a:c.extend(c.Event(f),a):c.Event(f);if(f.indexOf("!")>=0){a.type=f=f.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[f]&&c.each(c.cache,function(){this.events&&this.events[f]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===
+8)return B;a.result=B;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(e=d.nodeType?c.data(d,"handle"):(c.data(d,"__events__")||{}).handle)&&e.apply(d,b);e=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+f]&&d["on"+f].apply(d,b)===false){a.result=false;a.preventDefault()}}catch(h){}if(!a.isPropagationStopped()&&e)c.event.trigger(a,b,e,true);else if(!a.isDefaultPrevented()){var l;e=a.target;var k=f.replace(X,""),o=c.nodeName(e,"a")&&k===
+"click",x=c.event.special[k]||{};if((!x._default||x._default.call(d,a)===false)&&!o&&!(e&&e.nodeName&&c.noData[e.nodeName.toLowerCase()])){try{if(e[k]){if(l=e["on"+k])e["on"+k]=null;c.event.triggered=true;e[k]()}}catch(r){}if(l)e["on"+k]=l;c.event.triggered=false}}},handle:function(a){var b,d,e,f;d=[];var h=c.makeArray(arguments);a=h[0]=c.event.fix(a||E.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive;if(!b){e=a.type.split(".");a.type=e.shift();d=e.slice(0).sort();e=RegExp("(^|\\.)"+
+d.join("\\.(?:.*\\.)?")+"(\\.|$)")}a.namespace=a.namespace||d.join(".");f=c.data(this,this.nodeType?"events":"__events__");if(typeof f==="function")f=f.events;d=(f||{})[a.type];if(f&&d){d=d.slice(0);f=0;for(var l=d.length;f<l;f++){var k=d[f];if(b||e.test(k.namespace)){a.handler=k.handler;a.data=k.data;a.handleObj=k;k=k.handler.apply(this,h);if(k!==B){a.result=k;if(k===false){a.preventDefault();a.stopPropagation()}}if(a.isImmediatePropagationStopped())break}}}return a.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
+fix:function(a){if(a[c.expando])return a;var b=a;a=c.Event(b);for(var d=this.props.length,e;d;){e=this.props[--d];a[e]=b[e]}if(!a.target)a.target=a.srcElement||t;if(a.target.nodeType===3)a.target=a.target.parentNode;if(!a.relatedTarget&&a.fromElement)a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement;if(a.pageX==null&&a.clientX!=null){b=t.documentElement;d=t.body;a.pageX=a.clientX+(b&&b.scrollLeft||d&&d.scrollLeft||0)-(b&&b.clientLeft||d&&d.clientLeft||0);a.pageY=a.clientY+(b&&b.scrollTop||
+d&&d.scrollTop||0)-(b&&b.clientTop||d&&d.clientTop||0)}if(a.which==null&&(a.charCode!=null||a.keyCode!=null))a.which=a.charCode!=null?a.charCode:a.keyCode;if(!a.metaKey&&a.ctrlKey)a.metaKey=a.ctrlKey;if(!a.which&&a.button!==B)a.which=a.button&1?1:a.button&2?3:a.button&4?2:0;return a},guid:1E8,proxy:c.proxy,special:{ready:{setup:c.bindReady,teardown:c.noop},live:{add:function(a){c.event.add(this,Y(a.origType,a.selector),c.extend({},a,{handler:Ka,guid:a.handler.guid}))},remove:function(a){c.event.remove(this,
+Y(a.origType,a.selector),a)}},beforeunload:{setup:function(a,b,d){if(c.isWindow(this))this.onbeforeunload=d},teardown:function(a,b){if(this.onbeforeunload===b)this.onbeforeunload=null}}}};c.removeEvent=t.removeEventListener?function(a,b,d){a.removeEventListener&&a.removeEventListener(b,d,false)}:function(a,b,d){a.detachEvent&&a.detachEvent("on"+b,d)};c.Event=function(a){if(!this.preventDefault)return new c.Event(a);if(a&&a.type){this.originalEvent=a;this.type=a.type}else this.type=a;this.timeStamp=
+c.now();this[c.expando]=true};c.Event.prototype={preventDefault:function(){this.isDefaultPrevented=ca;var a=this.originalEvent;if(a)if(a.preventDefault)a.preventDefault();else a.returnValue=false},stopPropagation:function(){this.isPropagationStopped=ca;var a=this.originalEvent;if(a){a.stopPropagation&&a.stopPropagation();a.cancelBubble=true}},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=ca;this.stopPropagation()},isDefaultPrevented:U,isPropagationStopped:U,isImmediatePropagationStopped:U};
+var va=function(a){var b=a.relatedTarget;try{for(;b&&b!==this;)b=b.parentNode;if(b!==this){a.type=a.data;c.event.handle.apply(this,arguments)}}catch(d){}},wa=function(a){a.type=a.data;c.event.handle.apply(this,arguments)};c.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){c.event.special[a]={setup:function(d){c.event.add(this,b,d&&d.selector?wa:va,a)},teardown:function(d){c.event.remove(this,b,d&&d.selector?wa:va)}}});if(!c.support.submitBubbles)c.event.special.submit={setup:function(){if(this.nodeName.toLowerCase()!==
+"form"){c.event.add(this,"click.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="submit"||d==="image")&&c(b).closest("form").length){a.liveFired=B;return la("submit",this,arguments)}});c.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="text"||d==="password")&&c(b).closest("form").length&&a.keyCode===13){a.liveFired=B;return la("submit",this,arguments)}})}else return false},teardown:function(){c.event.remove(this,".specialSubmit")}};if(!c.support.changeBubbles){var V,
+xa=function(a){var b=a.type,d=a.value;if(b==="radio"||b==="checkbox")d=a.checked;else if(b==="select-multiple")d=a.selectedIndex>-1?c.map(a.options,function(e){return e.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},Z=function(a,b){var d=a.target,e,f;if(!(!ia.test(d.nodeName)||d.readOnly)){e=c.data(d,"_change_data");f=xa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data",f);if(!(e===B||f===e))if(e!=null||f){a.type="change";a.liveFired=
+B;return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:Z,beforedeactivate:Z,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return Z.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return Z.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a,"_change_data",xa(a))}},setup:function(){if(this.type===
+"file")return false;for(var a in V)c.event.add(this,a+".specialChange",V[a]);return ia.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return ia.test(this.nodeName)}};V=c.event.special.change.filters;V.focus=V.beforeactivate}t.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(e){e=c.event.fix(e);e.type=b;return c.event.trigger(e,null,e.target)}c.event.special[b]={setup:function(){ua[b]++===0&&t.addEventListener(a,d,true)},teardown:function(){--ua[b]===
+0&&t.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,e,f){if(typeof d==="object"){for(var h in d)this[b](h,e,d[h],f);return this}if(c.isFunction(e)||e===false){f=e;e=B}var l=b==="one"?c.proxy(f,function(o){c(this).unbind(o,l);return f.apply(this,arguments)}):f;if(d==="unload"&&b!=="one")this.one(d,e,f);else{h=0;for(var k=this.length;h<k;h++)c.event.add(this[h],d,l,e)}return this}});c.fn.extend({unbind:function(a,b){if(typeof a==="object"&&!a.preventDefault)for(var d in a)this.unbind(d,
+a[d]);else{d=0;for(var e=this.length;d<e;d++)c.event.remove(this[d],a,b)}return this},delegate:function(a,b,d,e){return this.live(b,d,e,a)},undelegate:function(a,b,d){return arguments.length===0?this.unbind("live"):this.die(b,null,d,a)},trigger:function(a,b){return this.each(function(){c.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){var d=c.Event(a);d.preventDefault();d.stopPropagation();c.event.trigger(d,b,this[0]);return d.result}},toggle:function(a){for(var b=arguments,d=
+1;d<b.length;)c.proxy(a,b[d++]);return this.click(c.proxy(a,function(e){var f=(c.data(this,"lastToggle"+a.guid)||0)%d;c.data(this,"lastToggle"+a.guid,f+1);e.preventDefault();return b[f].apply(this,arguments)||false}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var ya={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};c.each(["live","die"],function(a,b){c.fn[b]=function(d,e,f,h){var l,k=0,o,x,r=h||this.selector;h=h?this:c(this.context);if(typeof d===
+"object"&&!d.preventDefault){for(l in d)h[b](l,e,d[l],r);return this}if(c.isFunction(e)){f=e;e=B}for(d=(d||"").split(" ");(l=d[k++])!=null;){o=X.exec(l);x="";if(o){x=o[0];l=l.replace(X,"")}if(l==="hover")d.push("mouseenter"+x,"mouseleave"+x);else{o=l;if(l==="focus"||l==="blur"){d.push(ya[l]+x);l+=x}else l=(ya[l]||l)+x;if(b==="live"){x=0;for(var A=h.length;x<A;x++)c.event.add(h[x],"live."+Y(l,r),{data:e,selector:r,handler:f,origType:l,origHandler:f,preType:o})}else h.unbind("live."+Y(l,r),f)}}return this}});
+c.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".split(" "),function(a,b){c.fn[b]=function(d,e){if(e==null){e=d;d=null}return arguments.length>0?this.bind(b,d,e):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});E.attachEvent&&!E.addEventListener&&c(E).bind("unload",function(){for(var a in c.cache)if(c.cache[a].handle)try{c.event.remove(c.cache[a].handle.elem)}catch(b){}});
+(function(){function a(g,i,n,m,p,q){p=0;for(var u=m.length;p<u;p++){var y=m[p];if(y){var F=false;for(y=y[g];y;){if(y.sizcache===n){F=m[y.sizset];break}if(y.nodeType===1&&!q){y.sizcache=n;y.sizset=p}if(y.nodeName.toLowerCase()===i){F=y;break}y=y[g]}m[p]=F}}}function b(g,i,n,m,p,q){p=0;for(var u=m.length;p<u;p++){var y=m[p];if(y){var F=false;for(y=y[g];y;){if(y.sizcache===n){F=m[y.sizset];break}if(y.nodeType===1){if(!q){y.sizcache=n;y.sizset=p}if(typeof i!=="string"){if(y===i){F=true;break}}else if(k.filter(i,
+[y]).length>0){F=y;break}}y=y[g]}m[p]=F}}}var d=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,e=0,f=Object.prototype.toString,h=false,l=true;[0,0].sort(function(){l=false;return 0});var k=function(g,i,n,m){n=n||[];var p=i=i||t;if(i.nodeType!==1&&i.nodeType!==9)return[];if(!g||typeof g!=="string")return n;var q,u,y,F,M,N=true,O=k.isXML(i),D=[],R=g;do{d.exec("");if(q=d.exec(R)){R=q[3];D.push(q[1]);if(q[2]){F=q[3];
+break}}}while(q);if(D.length>1&&x.exec(g))if(D.length===2&&o.relative[D[0]])u=L(D[0]+D[1],i);else for(u=o.relative[D[0]]?[i]:k(D.shift(),i);D.length;){g=D.shift();if(o.relative[g])g+=D.shift();u=L(g,u)}else{if(!m&&D.length>1&&i.nodeType===9&&!O&&o.match.ID.test(D[0])&&!o.match.ID.test(D[D.length-1])){q=k.find(D.shift(),i,O);i=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]}if(i){q=m?{expr:D.pop(),set:C(m)}:k.find(D.pop(),D.length===1&&(D[0]==="~"||D[0]==="+")&&i.parentNode?i.parentNode:i,O);u=q.expr?k.filter(q.expr,
+q.set):q.set;if(D.length>0)y=C(u);else N=false;for(;D.length;){q=M=D.pop();if(o.relative[M])q=D.pop();else M="";if(q==null)q=i;o.relative[M](y,q,O)}}else y=[]}y||(y=u);y||k.error(M||g);if(f.call(y)==="[object Array]")if(N)if(i&&i.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&k.contains(i,y[g])))n.push(u[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&n.push(u[g]);else n.push.apply(n,y);else C(y,n);if(F){k(F,p,n,m);k.uniqueSort(n)}return n};k.uniqueSort=function(g){if(w){h=
+l;g.sort(w);if(h)for(var i=1;i<g.length;i++)g[i]===g[i-1]&&g.splice(i--,1)}return g};k.matches=function(g,i){return k(g,null,null,i)};k.matchesSelector=function(g,i){return k(i,null,null,[g]).length>0};k.find=function(g,i,n){var m;if(!g)return[];for(var p=0,q=o.order.length;p<q;p++){var u,y=o.order[p];if(u=o.leftMatch[y].exec(g)){var F=u[1];u.splice(1,1);if(F.substr(F.length-1)!=="\\"){u[1]=(u[1]||"").replace(/\\/g,"");m=o.find[y](u,i,n);if(m!=null){g=g.replace(o.match[y],"");break}}}}m||(m=i.getElementsByTagName("*"));
+return{set:m,expr:g}};k.filter=function(g,i,n,m){for(var p,q,u=g,y=[],F=i,M=i&&i[0]&&k.isXML(i[0]);g&&i.length;){for(var N in o.filter)if((p=o.leftMatch[N].exec(g))!=null&&p[2]){var O,D,R=o.filter[N];D=p[1];q=false;p.splice(1,1);if(D.substr(D.length-1)!=="\\"){if(F===y)y=[];if(o.preFilter[N])if(p=o.preFilter[N](p,F,n,y,m,M)){if(p===true)continue}else q=O=true;if(p)for(var j=0;(D=F[j])!=null;j++)if(D){O=R(D,p,j,F);var s=m^!!O;if(n&&O!=null)if(s)q=true;else F[j]=false;else if(s){y.push(D);q=true}}if(O!==
+B){n||(F=y);g=g.replace(o.match[N],"");if(!q)return[];break}}}if(g===u)if(q==null)k.error(g);else break;u=g}return F};k.error=function(g){throw"Syntax error, unrecognized expression: "+g;};var o=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+\-]*)\))?/,
+POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(g){return g.getAttribute("href")}},relative:{"+":function(g,i){var n=typeof i==="string",m=n&&!/\W/.test(i);n=n&&!m;if(m)i=i.toLowerCase();m=0;for(var p=g.length,q;m<p;m++)if(q=g[m]){for(;(q=q.previousSibling)&&q.nodeType!==1;);g[m]=n||q&&q.nodeName.toLowerCase()===
+i?q||false:q===i}n&&k.filter(i,g,true)},">":function(g,i){var n,m=typeof i==="string",p=0,q=g.length;if(m&&!/\W/.test(i))for(i=i.toLowerCase();p<q;p++){if(n=g[p]){n=n.parentNode;g[p]=n.nodeName.toLowerCase()===i?n:false}}else{for(;p<q;p++)if(n=g[p])g[p]=m?n.parentNode:n.parentNode===i;m&&k.filter(i,g,true)}},"":function(g,i,n){var m,p=e++,q=b;if(typeof i==="string"&&!/\W/.test(i)){m=i=i.toLowerCase();q=a}q("parentNode",i,p,g,m,n)},"~":function(g,i,n){var m,p=e++,q=b;if(typeof i==="string"&&!/\W/.test(i)){m=
+i=i.toLowerCase();q=a}q("previousSibling",i,p,g,m,n)}},find:{ID:function(g,i,n){if(typeof i.getElementById!=="undefined"&&!n)return(g=i.getElementById(g[1]))&&g.parentNode?[g]:[]},NAME:function(g,i){if(typeof i.getElementsByName!=="undefined"){for(var n=[],m=i.getElementsByName(g[1]),p=0,q=m.length;p<q;p++)m[p].getAttribute("name")===g[1]&&n.push(m[p]);return n.length===0?null:n}},TAG:function(g,i){return i.getElementsByTagName(g[1])}},preFilter:{CLASS:function(g,i,n,m,p,q){g=" "+g[1].replace(/\\/g,
+"")+" ";if(q)return g;q=0;for(var u;(u=i[q])!=null;q++)if(u)if(p^(u.className&&(" "+u.className+" ").replace(/[\t\n]/g," ").indexOf(g)>=0))n||m.push(u);else if(n)i[q]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()},CHILD:function(g){if(g[1]==="nth"){var i=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=i[1]+(i[2]||1)-0;g[3]=i[3]-0}g[0]=e++;return g},ATTR:function(g,i,n,
+m,p,q){i=g[1].replace(/\\/g,"");if(!q&&o.attrMap[i])g[1]=o.attrMap[i];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,i,n,m,p){if(g[1]==="not")if((d.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,i);else{g=k.filter(g[3],i,n,true^p);n||m.push.apply(m,g);return false}else if(o.match.POS.test(g[0])||o.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===
+true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,i,n){return!!k(n[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)},text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===
+g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}},setFilters:{first:function(g,i){return i===0},last:function(g,i,n,m){return i===m.length-1},even:function(g,i){return i%2===0},odd:function(g,i){return i%2===1},lt:function(g,i,n){return i<n[3]-0},gt:function(g,i,n){return i>n[3]-0},nth:function(g,i,n){return n[3]-
+0===i},eq:function(g,i,n){return n[3]-0===i}},filter:{PSEUDO:function(g,i,n,m){var p=i[1],q=o.filters[p];if(q)return q(g,n,i,m);else if(p==="contains")return(g.textContent||g.innerText||k.getText([g])||"").indexOf(i[3])>=0;else if(p==="not"){i=i[3];n=0;for(m=i.length;n<m;n++)if(i[n]===g)return false;return true}else k.error("Syntax error, unrecognized expression: "+p)},CHILD:function(g,i){var n=i[1],m=g;switch(n){case "only":case "first":for(;m=m.previousSibling;)if(m.nodeType===1)return false;if(n===
+"first")return true;m=g;case "last":for(;m=m.nextSibling;)if(m.nodeType===1)return false;return true;case "nth":n=i[2];var p=i[3];if(n===1&&p===0)return true;var q=i[0],u=g.parentNode;if(u&&(u.sizcache!==q||!g.nodeIndex)){var y=0;for(m=u.firstChild;m;m=m.nextSibling)if(m.nodeType===1)m.nodeIndex=++y;u.sizcache=q}m=g.nodeIndex-p;return n===0?m===0:m%n===0&&m/n>=0}},ID:function(g,i){return g.nodeType===1&&g.getAttribute("id")===i},TAG:function(g,i){return i==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===
+i},CLASS:function(g,i){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(i)>-1},ATTR:function(g,i){var n=i[1];n=o.attrHandle[n]?o.attrHandle[n](g):g[n]!=null?g[n]:g.getAttribute(n);var m=n+"",p=i[2],q=i[4];return n==null?p==="!=":p==="="?m===q:p==="*="?m.indexOf(q)>=0:p==="~="?(" "+m+" ").indexOf(q)>=0:!q?m&&n!==false:p==="!="?m!==q:p==="^="?m.indexOf(q)===0:p==="$="?m.substr(m.length-q.length)===q:p==="|="?m===q||m.substr(0,q.length+1)===q+"-":false},POS:function(g,i,n,m){var p=o.setFilters[i[2]];
+if(p)return p(g,n,i,m)}}},x=o.match.POS,r=function(g,i){return"\\"+(i-0+1)},A;for(A in o.match){o.match[A]=RegExp(o.match[A].source+/(?![^\[]*\])(?![^\(]*\))/.source);o.leftMatch[A]=RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[A].source.replace(/\\(\d+)/g,r))}var C=function(g,i){g=Array.prototype.slice.call(g,0);if(i){i.push.apply(i,g);return i}return g};try{Array.prototype.slice.call(t.documentElement.childNodes,0)}catch(J){C=function(g,i){var n=0,m=i||[];if(f.call(g)==="[object Array]")Array.prototype.push.apply(m,
+g);else if(typeof g.length==="number")for(var p=g.length;n<p;n++)m.push(g[n]);else for(;g[n];n++)m.push(g[n]);return m}}var w,I;if(t.documentElement.compareDocumentPosition)w=function(g,i){if(g===i){h=true;return 0}if(!g.compareDocumentPosition||!i.compareDocumentPosition)return g.compareDocumentPosition?-1:1;return g.compareDocumentPosition(i)&4?-1:1};else{w=function(g,i){var n,m,p=[],q=[];n=g.parentNode;m=i.parentNode;var u=n;if(g===i){h=true;return 0}else if(n===m)return I(g,i);else if(n){if(!m)return 1}else return-1;
+for(;u;){p.unshift(u);u=u.parentNode}for(u=m;u;){q.unshift(u);u=u.parentNode}n=p.length;m=q.length;for(u=0;u<n&&u<m;u++)if(p[u]!==q[u])return I(p[u],q[u]);return u===n?I(g,q[u],-1):I(p[u],i,1)};I=function(g,i,n){if(g===i)return n;for(g=g.nextSibling;g;){if(g===i)return-1;g=g.nextSibling}return 1}}k.getText=function(g){for(var i="",n,m=0;g[m];m++){n=g[m];if(n.nodeType===3||n.nodeType===4)i+=n.nodeValue;else if(n.nodeType!==8)i+=k.getText(n.childNodes)}return i};(function(){var g=t.createElement("div"),
+i="script"+(new Date).getTime(),n=t.documentElement;g.innerHTML="<a name='"+i+"'/>";n.insertBefore(g,n.firstChild);if(t.getElementById(i)){o.find.ID=function(m,p,q){if(typeof p.getElementById!=="undefined"&&!q)return(p=p.getElementById(m[1]))?p.id===m[1]||typeof p.getAttributeNode!=="undefined"&&p.getAttributeNode("id").nodeValue===m[1]?[p]:B:[]};o.filter.ID=function(m,p){var q=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&q&&q.nodeValue===p}}n.removeChild(g);
+n=g=null})();(function(){var g=t.createElement("div");g.appendChild(t.createComment(""));if(g.getElementsByTagName("*").length>0)o.find.TAG=function(i,n){var m=n.getElementsByTagName(i[1]);if(i[1]==="*"){for(var p=[],q=0;m[q];q++)m[q].nodeType===1&&p.push(m[q]);m=p}return m};g.innerHTML="<a href='#'></a>";if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")o.attrHandle.href=function(i){return i.getAttribute("href",2)};g=null})();t.querySelectorAll&&
+function(){var g=k,i=t.createElement("div");i.innerHTML="<p class='TEST'></p>";if(!(i.querySelectorAll&&i.querySelectorAll(".TEST").length===0)){k=function(m,p,q,u){p=p||t;m=m.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!u&&!k.isXML(p))if(p.nodeType===9)try{return C(p.querySelectorAll(m),q)}catch(y){}else if(p.nodeType===1&&p.nodeName.toLowerCase()!=="object"){var F=p.getAttribute("id"),M=F||"__sizzle__";F||p.setAttribute("id",M);try{return C(p.querySelectorAll("#"+M+" "+m),q)}catch(N){}finally{F||
+p.removeAttribute("id")}}return g(m,p,q,u)};for(var n in g)k[n]=g[n];i=null}}();(function(){var g=t.documentElement,i=g.matchesSelector||g.mozMatchesSelector||g.webkitMatchesSelector||g.msMatchesSelector,n=false;try{i.call(t.documentElement,"[test!='']:sizzle")}catch(m){n=true}if(i)k.matchesSelector=function(p,q){q=q.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(p))try{if(n||!o.match.PSEUDO.test(q)&&!/!=/.test(q))return i.call(p,q)}catch(u){}return k(q,null,null,[p]).length>0}})();(function(){var g=
+t.createElement("div");g.innerHTML="<div class='test e'></div><div class='test'></div>";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){o.order.splice(1,0,"CLASS");o.find.CLASS=function(i,n,m){if(typeof n.getElementsByClassName!=="undefined"&&!m)return n.getElementsByClassName(i[1])};g=null}}})();k.contains=t.documentElement.contains?function(g,i){return g!==i&&(g.contains?g.contains(i):true)}:t.documentElement.compareDocumentPosition?
+function(g,i){return!!(g.compareDocumentPosition(i)&16)}:function(){return false};k.isXML=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false};var L=function(g,i){for(var n,m=[],p="",q=i.nodeType?[i]:i;n=o.match.PSEUDO.exec(g);){p+=n[0];g=g.replace(o.match.PSEUDO,"")}g=o.relative[g]?g+"*":g;n=0;for(var u=q.length;n<u;n++)k(g,q[n],m);return k.filter(p,m)};c.find=k;c.expr=k.selectors;c.expr[":"]=c.expr.filters;c.unique=k.uniqueSort;c.text=k.getText;c.isXMLDoc=k.isXML;
+c.contains=k.contains})();var Za=/Until$/,$a=/^(?:parents|prevUntil|prevAll)/,ab=/,/,Na=/^.[^:#\[\.,]*$/,bb=Array.prototype.slice,cb=c.expr.match.POS;c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,e=0,f=this.length;e<f;e++){d=b.length;c.find(a,this[e],b);if(e>0)for(var h=d;h<b.length;h++)for(var l=0;l<d;l++)if(b[l]===b[h]){b.splice(h--,1);break}}return b},has:function(a){var b=c(a);return this.filter(function(){for(var d=0,e=b.length;d<e;d++)if(c.contains(this,b[d]))return true})},
+not:function(a){return this.pushStack(ma(this,a,false),"not",a)},filter:function(a){return this.pushStack(ma(this,a,true),"filter",a)},is:function(a){return!!a&&c.filter(a,this).length>0},closest:function(a,b){var d=[],e,f,h=this[0];if(c.isArray(a)){var l,k={},o=1;if(h&&a.length){e=0;for(f=a.length;e<f;e++){l=a[e];k[l]||(k[l]=c.expr.match.POS.test(l)?c(l,b||this.context):l)}for(;h&&h.ownerDocument&&h!==b;){for(l in k){e=k[l];if(e.jquery?e.index(h)>-1:c(h).is(e))d.push({selector:l,elem:h,level:o})}h=
+h.parentNode;o++}}return d}l=cb.test(a)?c(a,b||this.context):null;e=0;for(f=this.length;e<f;e++)for(h=this[e];h;)if(l?l.index(h)>-1:c.find.matchesSelector(h,a)){d.push(h);break}else{h=h.parentNode;if(!h||!h.ownerDocument||h===b)break}d=d.length>1?c.unique(d):d;return this.pushStack(d,"closest",a)},index:function(a){if(!a||typeof a==="string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var d=typeof a==="string"?c(a,b||this.context):
+c.makeArray(a),e=c.merge(this.get(),d);return this.pushStack(!d[0]||!d[0].parentNode||d[0].parentNode.nodeType===11||!e[0]||!e[0].parentNode||e[0].parentNode.nodeType===11?e:c.unique(e))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode",d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,
+2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,
+b){c.fn[a]=function(d,e){var f=c.map(this,b,d);Za.test(a)||(e=d);if(e&&typeof e==="string")f=c.filter(e,f);f=this.length>1?c.unique(f):f;if((this.length>1||ab.test(e))&&$a.test(a))f=f.reverse();return this.pushStack(f,a,bb.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return b.length===1?c.find.matchesSelector(b[0],a)?[b[0]]:[]:c.find.matches(a,b)},dir:function(a,b,d){var e=[];for(a=a[b];a&&a.nodeType!==9&&(d===B||a.nodeType!==1||!c(a).is(d));){a.nodeType===1&&
+e.push(a);a=a[b]}return e},nth:function(a,b,d){b=b||1;for(var e=0;a;a=a[d])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var za=/ jQuery\d+="(?:\d+|null)"/g,$=/^\s+/,Aa=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Ba=/<([\w:]+)/,db=/<tbody/i,eb=/<|&#?\w+;/,Ca=/<(?:script|object|embed|option|style)/i,Da=/checked\s*(?:[^=]|=\s*.checked.)/i,fb=/\=([^="'>\s]+\/)>/g,P={option:[1,
+"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};P.optgroup=P.option;P.tbody=P.tfoot=P.colgroup=P.caption=P.thead;P.th=P.td;if(!c.support.htmlSerialize)P._default=[1,"div<div>","</div>"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d=
+c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==B)return this.empty().append((this[0]&&this[0].ownerDocument||t).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this},
+wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})},
+prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,
+this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,e;(e=this[d])!=null;d++)if(!a||c.filter(a,[e]).length){if(!b&&e.nodeType===1){c.cleanData(e.getElementsByTagName("*"));c.cleanData([e])}e.parentNode&&e.parentNode.removeChild(e)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild);
+return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,e=this.ownerDocument;if(!d){d=e.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(za,"").replace(fb,'="$1">').replace($,"")],e)[0]}else return this.cloneNode(true)});if(a===true){na(this,b);na(this.find("*"),b.find("*"))}return b},html:function(a){if(a===B)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(za,""):null;
+else if(typeof a==="string"&&!Ca.test(a)&&(c.support.leadingWhitespace||!$.test(a))&&!P[(Ba.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Aa,"<$1></$2>");try{for(var b=0,d=this.length;b<d;b++)if(this[b].nodeType===1){c.cleanData(this[b].getElementsByTagName("*"));this[b].innerHTML=a}}catch(e){this.empty().append(a)}}else c.isFunction(a)?this.each(function(f){var h=c(this);h.html(a.call(this,f,h.html()))}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(c.isFunction(a))return this.each(function(b){var d=
+c(this),e=d.html();d.replaceWith(a.call(this,b,e))});if(typeof a!=="string")a=c(a).detach();return this.each(function(){var b=this.nextSibling,d=this.parentNode;c(this).remove();b?c(b).before(a):c(d).append(a)})}else return this.pushStack(c(c.isFunction(a)?a():a),"replaceWith",a)},detach:function(a){return this.remove(a,true)},domManip:function(a,b,d){var e,f,h,l=a[0],k=[];if(!c.support.checkClone&&arguments.length===3&&typeof l==="string"&&Da.test(l))return this.each(function(){c(this).domManip(a,
+b,d,true)});if(c.isFunction(l))return this.each(function(x){var r=c(this);a[0]=l.call(this,x,b?r.html():B);r.domManip(a,b,d)});if(this[0]){e=l&&l.parentNode;e=c.support.parentNode&&e&&e.nodeType===11&&e.childNodes.length===this.length?{fragment:e}:c.buildFragment(a,this,k);h=e.fragment;if(f=h.childNodes.length===1?h=h.firstChild:h.firstChild){b=b&&c.nodeName(f,"tr");f=0;for(var o=this.length;f<o;f++)d.call(b?c.nodeName(this[f],"table")?this[f].getElementsByTagName("tbody")[0]||this[f].appendChild(this[f].ownerDocument.createElement("tbody")):
+this[f]:this[f],f>0||e.cacheable||this.length>1?h.cloneNode(true):h)}k.length&&c.each(k,Oa)}return this}});c.buildFragment=function(a,b,d){var e,f,h;b=b&&b[0]?b[0].ownerDocument||b[0]:t;if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&b===t&&!Ca.test(a[0])&&(c.support.checkClone||!Da.test(a[0]))){f=true;if(h=c.fragments[a[0]])if(h!==1)e=h}if(!e){e=b.createDocumentFragment();c.clean(a,b,e,d)}if(f)c.fragments[a[0]]=h?e:1;return{fragment:e,cacheable:f}};c.fragments={};c.each({appendTo:"append",
+prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var e=[];d=c(d);var f=this.length===1&&this[0].parentNode;if(f&&f.nodeType===11&&f.childNodes.length===1&&d.length===1){d[b](this[0]);return this}else{f=0;for(var h=d.length;f<h;f++){var l=(f>0?this.clone(true):this).get();c(d[f])[b](l);e=e.concat(l)}return this.pushStack(e,a,d.selector)}}});c.extend({clean:function(a,b,d,e){b=b||t;if(typeof b.createElement==="undefined")b=b.ownerDocument||
+b[0]&&b[0].ownerDocument||t;for(var f=[],h=0,l;(l=a[h])!=null;h++){if(typeof l==="number")l+="";if(l){if(typeof l==="string"&&!eb.test(l))l=b.createTextNode(l);else if(typeof l==="string"){l=l.replace(Aa,"<$1></$2>");var k=(Ba.exec(l)||["",""])[1].toLowerCase(),o=P[k]||P._default,x=o[0],r=b.createElement("div");for(r.innerHTML=o[1]+l+o[2];x--;)r=r.lastChild;if(!c.support.tbody){x=db.test(l);k=k==="table"&&!x?r.firstChild&&r.firstChild.childNodes:o[1]==="<table>"&&!x?r.childNodes:[];for(o=k.length-
+1;o>=0;--o)c.nodeName(k[o],"tbody")&&!k[o].childNodes.length&&k[o].parentNode.removeChild(k[o])}!c.support.leadingWhitespace&&$.test(l)&&r.insertBefore(b.createTextNode($.exec(l)[0]),r.firstChild);l=r.childNodes}if(l.nodeType)f.push(l);else f=c.merge(f,l)}}if(d)for(h=0;f[h];h++)if(e&&c.nodeName(f[h],"script")&&(!f[h].type||f[h].type.toLowerCase()==="text/javascript"))e.push(f[h].parentNode?f[h].parentNode.removeChild(f[h]):f[h]);else{f[h].nodeType===1&&f.splice.apply(f,[h+1,0].concat(c.makeArray(f[h].getElementsByTagName("script"))));
+d.appendChild(f[h])}return f},cleanData:function(a){for(var b,d,e=c.cache,f=c.event.special,h=c.support.deleteExpando,l=0,k;(k=a[l])!=null;l++)if(!(k.nodeName&&c.noData[k.nodeName.toLowerCase()]))if(d=k[c.expando]){if((b=e[d])&&b.events)for(var o in b.events)f[o]?c.event.remove(k,o):c.removeEvent(k,o,b.handle);if(h)delete k[c.expando];else k.removeAttribute&&k.removeAttribute(c.expando);delete e[d]}}});var Ea=/alpha\([^)]*\)/i,gb=/opacity=([^)]*)/,hb=/-([a-z])/ig,ib=/([A-Z])/g,Fa=/^-?\d+(?:px)?$/i,
+jb=/^-?\d/,kb={position:"absolute",visibility:"hidden",display:"block"},Pa=["Left","Right"],Qa=["Top","Bottom"],W,Ga,aa,lb=function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){if(arguments.length===2&&b===B)return this;return c.access(this,a,b,true,function(d,e,f){return f!==B?c.style(d,e,f):c.css(d,e)})};c.extend({cssHooks:{opacity:{get:function(a,b){if(b){var d=W(a,"opacity","opacity");return d===""?"1":d}else return a.style.opacity}}},cssNumber:{zIndex:true,fontWeight:true,opacity:true,
+zoom:true,lineHeight:true},cssProps:{"float":c.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,d,e){if(!(!a||a.nodeType===3||a.nodeType===8||!a.style)){var f,h=c.camelCase(b),l=a.style,k=c.cssHooks[h];b=c.cssProps[h]||h;if(d!==B){if(!(typeof d==="number"&&isNaN(d)||d==null)){if(typeof d==="number"&&!c.cssNumber[h])d+="px";if(!k||!("set"in k)||(d=k.set(a,d))!==B)try{l[b]=d}catch(o){}}}else{if(k&&"get"in k&&(f=k.get(a,false,e))!==B)return f;return l[b]}}},css:function(a,b,d){var e,f=c.camelCase(b),
+h=c.cssHooks[f];b=c.cssProps[f]||f;if(h&&"get"in h&&(e=h.get(a,true,d))!==B)return e;else if(W)return W(a,b,f)},swap:function(a,b,d){var e={},f;for(f in b){e[f]=a.style[f];a.style[f]=b[f]}d.call(a);for(f in b)a.style[f]=e[f]},camelCase:function(a){return a.replace(hb,lb)}});c.curCSS=c.css;c.each(["height","width"],function(a,b){c.cssHooks[b]={get:function(d,e,f){var h;if(e){if(d.offsetWidth!==0)h=oa(d,b,f);else c.swap(d,kb,function(){h=oa(d,b,f)});if(h<=0){h=W(d,b,b);if(h==="0px"&&aa)h=aa(d,b,b);
+if(h!=null)return h===""||h==="auto"?"0px":h}if(h<0||h==null){h=d.style[b];return h===""||h==="auto"?"0px":h}return typeof h==="string"?h:h+"px"}},set:function(d,e){if(Fa.test(e)){e=parseFloat(e);if(e>=0)return e+"px"}else return e}}});if(!c.support.opacity)c.cssHooks.opacity={get:function(a,b){return gb.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var d=a.style;d.zoom=1;var e=c.isNaN(b)?"":"alpha(opacity="+b*100+")",f=
+d.filter||"";d.filter=Ea.test(f)?f.replace(Ea,e):d.filter+" "+e}};if(t.defaultView&&t.defaultView.getComputedStyle)Ga=function(a,b,d){var e;d=d.replace(ib,"-$1").toLowerCase();if(!(b=a.ownerDocument.defaultView))return B;if(b=b.getComputedStyle(a,null)){e=b.getPropertyValue(d);if(e===""&&!c.contains(a.ownerDocument.documentElement,a))e=c.style(a,d)}return e};if(t.documentElement.currentStyle)aa=function(a,b){var d,e,f=a.currentStyle&&a.currentStyle[b],h=a.style;if(!Fa.test(f)&&jb.test(f)){d=h.left;
+e=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;h.left=b==="fontSize"?"1em":f||0;f=h.pixelLeft+"px";h.left=d;a.runtimeStyle.left=e}return f===""?"auto":f};W=Ga||aa;if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b=a.offsetHeight;return a.offsetWidth===0&&b===0||!c.support.reliableHiddenOffsets&&(a.style.display||c.css(a,"display"))==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var mb=c.now(),nb=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
+ob=/^(?:select|textarea)/i,pb=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,qb=/^(?:GET|HEAD)$/,Ra=/\[\]$/,T=/\=\?(&|$)/,ja=/\?/,rb=/([?&])_=[^&]*/,sb=/^(\w+:)?\/\/([^\/?#]+)/,tb=/%20/g,ub=/#.*$/,Ha=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!=="string"&&Ha)return Ha.apply(this,arguments);else if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var f=a.slice(e,a.length);a=a.slice(0,e)}e="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b===
+"object"){b=c.param(b,c.ajaxSettings.traditional);e="POST"}var h=this;c.ajax({url:a,type:e,dataType:"html",data:b,complete:function(l,k){if(k==="success"||k==="notmodified")h.html(f?c("<div>").append(l.responseText.replace(nb,"")).find(f):l.responseText);d&&h.each(d,[l.responseText,k,l])}});return this},serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&&
+!this.disabled&&(this.checked||ob.test(this.nodeName)||pb.test(this.type))}).map(function(a,b){var d=c(this).val();return d==null?null:c.isArray(d)?c.map(d,function(e){return{name:b.name,value:e}}):{name:b.name,value:d}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,e){if(c.isFunction(b)){e=e||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:e})},
+getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,e){if(c.isFunction(b)){e=e||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:e})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return new E.XMLHttpRequest},accepts:{xml:"application/xml, text/xml",html:"text/html",
+script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},ajax:function(a){var b=c.extend(true,{},c.ajaxSettings,a),d,e,f,h=b.type.toUpperCase(),l=qb.test(h);b.url=b.url.replace(ub,"");b.context=a&&a.context!=null?a.context:b;if(b.data&&b.processData&&typeof b.data!=="string")b.data=c.param(b.data,b.traditional);if(b.dataType==="jsonp"){if(h==="GET")T.test(b.url)||(b.url+=(ja.test(b.url)?"&":"?")+(b.jsonp||"callback")+"=?");else if(!b.data||
+!T.test(b.data))b.data=(b.data?b.data+"&":"")+(b.jsonp||"callback")+"=?";b.dataType="json"}if(b.dataType==="json"&&(b.data&&T.test(b.data)||T.test(b.url))){d=b.jsonpCallback||"jsonp"+mb++;if(b.data)b.data=(b.data+"").replace(T,"="+d+"$1");b.url=b.url.replace(T,"="+d+"$1");b.dataType="script";var k=E[d];E[d]=function(m){if(c.isFunction(k))k(m);else{E[d]=B;try{delete E[d]}catch(p){}}f=m;c.handleSuccess(b,w,e,f);c.handleComplete(b,w,e,f);r&&r.removeChild(A)}}if(b.dataType==="script"&&b.cache===null)b.cache=
+false;if(b.cache===false&&l){var o=c.now(),x=b.url.replace(rb,"$1_="+o);b.url=x+(x===b.url?(ja.test(b.url)?"&":"?")+"_="+o:"")}if(b.data&&l)b.url+=(ja.test(b.url)?"&":"?")+b.data;b.global&&c.active++===0&&c.event.trigger("ajaxStart");o=(o=sb.exec(b.url))&&(o[1]&&o[1].toLowerCase()!==location.protocol||o[2].toLowerCase()!==location.host);if(b.dataType==="script"&&h==="GET"&&o){var r=t.getElementsByTagName("head")[0]||t.documentElement,A=t.createElement("script");if(b.scriptCharset)A.charset=b.scriptCharset;
+A.src=b.url;if(!d){var C=false;A.onload=A.onreadystatechange=function(){if(!C&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){C=true;c.handleSuccess(b,w,e,f);c.handleComplete(b,w,e,f);A.onload=A.onreadystatechange=null;r&&A.parentNode&&r.removeChild(A)}}}r.insertBefore(A,r.firstChild);return B}var J=false,w=b.xhr();if(w){b.username?w.open(h,b.url,b.async,b.username,b.password):w.open(h,b.url,b.async);try{if(b.data!=null&&!l||a&&a.contentType)w.setRequestHeader("Content-Type",
+b.contentType);if(b.ifModified){c.lastModified[b.url]&&w.setRequestHeader("If-Modified-Since",c.lastModified[b.url]);c.etag[b.url]&&w.setRequestHeader("If-None-Match",c.etag[b.url])}o||w.setRequestHeader("X-Requested-With","XMLHttpRequest");w.setRequestHeader("Accept",b.dataType&&b.accepts[b.dataType]?b.accepts[b.dataType]+", */*; q=0.01":b.accepts._default)}catch(I){}if(b.beforeSend&&b.beforeSend.call(b.context,w,b)===false){b.global&&c.active--===1&&c.event.trigger("ajaxStop");w.abort();return false}b.global&&
+c.triggerGlobal(b,"ajaxSend",[w,b]);var L=w.onreadystatechange=function(m){if(!w||w.readyState===0||m==="abort"){J||c.handleComplete(b,w,e,f);J=true;if(w)w.onreadystatechange=c.noop}else if(!J&&w&&(w.readyState===4||m==="timeout")){J=true;w.onreadystatechange=c.noop;e=m==="timeout"?"timeout":!c.httpSuccess(w)?"error":b.ifModified&&c.httpNotModified(w,b.url)?"notmodified":"success";var p;if(e==="success")try{f=c.httpData(w,b.dataType,b)}catch(q){e="parsererror";p=q}if(e==="success"||e==="notmodified")d||
+c.handleSuccess(b,w,e,f);else c.handleError(b,w,e,p);d||c.handleComplete(b,w,e,f);m==="timeout"&&w.abort();if(b.async)w=null}};try{var g=w.abort;w.abort=function(){w&&Function.prototype.call.call(g,w);L("abort")}}catch(i){}b.async&&b.timeout>0&&setTimeout(function(){w&&!J&&L("timeout")},b.timeout);try{w.send(l||b.data==null?null:b.data)}catch(n){c.handleError(b,w,null,n);c.handleComplete(b,w,e,f)}b.async||L();return w}},param:function(a,b){var d=[],e=function(h,l){l=c.isFunction(l)?l():l;d[d.length]=
+encodeURIComponent(h)+"="+encodeURIComponent(l)};if(b===B)b=c.ajaxSettings.traditional;if(c.isArray(a)||a.jquery)c.each(a,function(){e(this.name,this.value)});else for(var f in a)da(f,a[f],b,e);return d.join("&").replace(tb,"+")}});c.extend({active:0,lastModified:{},etag:{},handleError:function(a,b,d,e){a.error&&a.error.call(a.context,b,d,e);a.global&&c.triggerGlobal(a,"ajaxError",[b,a,e])},handleSuccess:function(a,b,d,e){a.success&&a.success.call(a.context,e,d,b);a.global&&c.triggerGlobal(a,"ajaxSuccess",
+[b,a])},handleComplete:function(a,b,d){a.complete&&a.complete.call(a.context,b,d);a.global&&c.triggerGlobal(a,"ajaxComplete",[b,a]);a.global&&c.active--===1&&c.event.trigger("ajaxStop")},triggerGlobal:function(a,b,d){(a.context&&a.context.url==null?c(a.context):c.event).trigger(b,d)},httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status===1223}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),
+e=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(e)c.etag[b]=e;return a.status===304},httpData:function(a,b,d){var e=a.getResponseHeader("content-type")||"",f=b==="xml"||!b&&e.indexOf("xml")>=0;a=f?a.responseXML:a.responseText;f&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b==="json"||!b&&e.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&e.indexOf("javascript")>=0)c.globalEval(a);return a}});
+if(E.ActiveXObject)c.ajaxSettings.xhr=function(){if(E.location.protocol!=="file:")try{return new E.XMLHttpRequest}catch(a){}try{return new E.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}};c.support.ajax=!!c.ajaxSettings.xhr();var ea={},vb=/^(?:toggle|show|hide)$/,wb=/^([+\-]=)?([\d+.\-]+)(.*)$/,ba,pa=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b,d){if(a||a===0)return this.animate(S("show",
+3),a,b,d);else{d=0;for(var e=this.length;d<e;d++){a=this[d];b=a.style.display;if(!c.data(a,"olddisplay")&&b==="none")b=a.style.display="";b===""&&c.css(a,"display")==="none"&&c.data(a,"olddisplay",qa(a.nodeName))}for(d=0;d<e;d++){a=this[d];b=a.style.display;if(b===""||b==="none")a.style.display=c.data(a,"olddisplay")||""}return this}},hide:function(a,b,d){if(a||a===0)return this.animate(S("hide",3),a,b,d);else{a=0;for(b=this.length;a<b;a++){d=c.css(this[a],"display");d!=="none"&&c.data(this[a],"olddisplay",
+d)}for(a=0;a<b;a++)this[a].style.display="none";return this}},_toggle:c.fn.toggle,toggle:function(a,b,d){var e=typeof a==="boolean";if(c.isFunction(a)&&c.isFunction(b))this._toggle.apply(this,arguments);else a==null||e?this.each(function(){var f=e?a:c(this).is(":hidden");c(this)[f?"show":"hide"]()}):this.animate(S("toggle",3),a,b,d);return this},fadeTo:function(a,b,d,e){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,d,e)},animate:function(a,b,d,e){var f=c.speed(b,
+d,e);if(c.isEmptyObject(a))return this.each(f.complete);return this[f.queue===false?"each":"queue"](function(){var h=c.extend({},f),l,k=this.nodeType===1,o=k&&c(this).is(":hidden"),x=this;for(l in a){var r=c.camelCase(l);if(l!==r){a[r]=a[l];delete a[l];l=r}if(a[l]==="hide"&&o||a[l]==="show"&&!o)return h.complete.call(this);if(k&&(l==="height"||l==="width")){h.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY];if(c.css(this,"display")==="inline"&&c.css(this,"float")==="none")if(c.support.inlineBlockNeedsLayout)if(qa(this.nodeName)===
+"inline")this.style.display="inline-block";else{this.style.display="inline";this.style.zoom=1}else this.style.display="inline-block"}if(c.isArray(a[l])){(h.specialEasing=h.specialEasing||{})[l]=a[l][1];a[l]=a[l][0]}}if(h.overflow!=null)this.style.overflow="hidden";h.curAnim=c.extend({},a);c.each(a,function(A,C){var J=new c.fx(x,h,A);if(vb.test(C))J[C==="toggle"?o?"show":"hide":C](a);else{var w=wb.exec(C),I=J.cur()||0;if(w){var L=parseFloat(w[2]),g=w[3]||"px";if(g!=="px"){c.style(x,A,(L||1)+g);I=(L||
+1)/J.cur()*I;c.style(x,A,I+g)}if(w[1])L=(w[1]==="-="?-1:1)*L+I;J.custom(I,L,g)}else J.custom(I,C,"")}});return true})},stop:function(a,b){var d=c.timers;a&&this.queue([]);this.each(function(){for(var e=d.length-1;e>=0;e--)if(d[e].elem===this){b&&d[e](true);d.splice(e,1)}});b||this.dequeue();return this}});c.each({slideDown:S("show",1),slideUp:S("hide",1),slideToggle:S("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){c.fn[a]=function(d,e,f){return this.animate(b,
+d,e,f)}});c.extend({speed:function(a,b,d){var e=a&&typeof a==="object"?c.extend({},a):{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};e.duration=c.fx.off?0:typeof e.duration==="number"?e.duration:e.duration in c.fx.speeds?c.fx.speeds[e.duration]:c.fx.speeds._default;e.old=e.complete;e.complete=function(){e.queue!==false&&c(this).dequeue();c.isFunction(e.old)&&e.old.call(this)};return e},easing:{linear:function(a,b,d,e){return d+e*a},swing:function(a,b,d,e){return(-Math.cos(a*
+Math.PI)/2+0.5)*e+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]||c.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a=parseFloat(c.css(this.elem,this.prop));return a&&a>-1E4?a:0},custom:function(a,b,d){function e(l){return f.step(l)}
+var f=this,h=c.fx;this.startTime=c.now();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start;this.pos=this.state=0;e.elem=this.elem;if(e()&&c.timers.push(e)&&!ba)ba=setInterval(h.tick,h.interval)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true;
+this.custom(this.cur(),0)},step:function(a){var b=c.now(),d=true;if(a||b>=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var e in this.options.curAnim)if(this.options.curAnim[e]!==true)d=false;if(d){if(this.options.overflow!=null&&!c.support.shrinkWrapBlocks){var f=this.elem,h=this.options;c.each(["","X","Y"],function(k,o){f.style["overflow"+o]=h.overflow[k]})}this.options.hide&&c(this.elem).hide();if(this.options.hide||
+this.options.show)for(var l in this.options.curAnim)c.style(this.elem,l,this.options.orig[l]);this.options.complete.call(this.elem)}return false}else{a=b-this.startTime;this.state=a/this.options.duration;b=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||b](this.state,a,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a=
+c.timers,b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length||c.fx.stop()},interval:13,stop:function(){clearInterval(ba);ba=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){c.style(a.elem,"opacity",a.now)},_default:function(a){if(a.elem.style&&a.elem.style[a.prop]!=null)a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit;else a.elem[a.prop]=a.now}}});if(c.expr&&c.expr.filters)c.expr.filters.animated=function(a){return c.grep(c.timers,function(b){return a===
+b.elem}).length};var xb=/^t(?:able|d|h)$/i,Ia=/^(?:body|html)$/i;c.fn.offset="getBoundingClientRect"in t.documentElement?function(a){var b=this[0],d;if(a)return this.each(function(l){c.offset.setOffset(this,a,l)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);try{d=b.getBoundingClientRect()}catch(e){}var f=b.ownerDocument,h=f.documentElement;if(!d||!c.contains(h,b))return d||{top:0,left:0};b=f.body;f=fa(f);return{top:d.top+(f.pageYOffset||c.support.boxModel&&
+h.scrollTop||b.scrollTop)-(h.clientTop||b.clientTop||0),left:d.left+(f.pageXOffset||c.support.boxModel&&h.scrollLeft||b.scrollLeft)-(h.clientLeft||b.clientLeft||0)}}:function(a){var b=this[0];if(a)return this.each(function(x){c.offset.setOffset(this,a,x)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);c.offset.initialize();var d,e=b.offsetParent,f=b.ownerDocument,h=f.documentElement,l=f.body;d=(f=f.defaultView)?f.getComputedStyle(b,null):b.currentStyle;
+for(var k=b.offsetTop,o=b.offsetLeft;(b=b.parentNode)&&b!==l&&b!==h;){if(c.offset.supportsFixedPosition&&d.position==="fixed")break;d=f?f.getComputedStyle(b,null):b.currentStyle;k-=b.scrollTop;o-=b.scrollLeft;if(b===e){k+=b.offsetTop;o+=b.offsetLeft;if(c.offset.doesNotAddBorder&&!(c.offset.doesAddBorderForTableAndCells&&xb.test(b.nodeName))){k+=parseFloat(d.borderTopWidth)||0;o+=parseFloat(d.borderLeftWidth)||0}e=b.offsetParent}if(c.offset.subtractsBorderForOverflowNotVisible&&d.overflow!=="visible"){k+=
+parseFloat(d.borderTopWidth)||0;o+=parseFloat(d.borderLeftWidth)||0}d=d}if(d.position==="relative"||d.position==="static"){k+=l.offsetTop;o+=l.offsetLeft}if(c.offset.supportsFixedPosition&&d.position==="fixed"){k+=Math.max(h.scrollTop,l.scrollTop);o+=Math.max(h.scrollLeft,l.scrollLeft)}return{top:k,left:o}};c.offset={initialize:function(){var a=t.body,b=t.createElement("div"),d,e,f,h=parseFloat(c.css(a,"marginTop"))||0;c.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",
+height:"1px",visibility:"hidden"});b.innerHTML="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";a.insertBefore(b,a.firstChild);d=b.firstChild;e=d.firstChild;f=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=e.offsetTop!==5;this.doesAddBorderForTableAndCells=
+f.offsetTop===5;e.style.position="fixed";e.style.top="20px";this.supportsFixedPosition=e.offsetTop===20||e.offsetTop===15;e.style.position=e.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=e.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==h;a.removeChild(b);c.offset.initialize=c.noop},bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.css(a,
+"marginTop"))||0;d+=parseFloat(c.css(a,"marginLeft"))||0}return{top:b,left:d}},setOffset:function(a,b,d){var e=c.css(a,"position");if(e==="static")a.style.position="relative";var f=c(a),h=f.offset(),l=c.css(a,"top"),k=c.css(a,"left"),o=e==="absolute"&&c.inArray("auto",[l,k])>-1;e={};var x={};if(o)x=f.position();l=o?x.top:parseInt(l,10)||0;k=o?x.left:parseInt(k,10)||0;if(c.isFunction(b))b=b.call(a,d,h);if(b.top!=null)e.top=b.top-h.top+l;if(b.left!=null)e.left=b.left-h.left+k;"using"in b?b.using.call(a,
+e):f.css(e)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),e=Ia.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.css(a,"marginTop"))||0;d.left-=parseFloat(c.css(a,"marginLeft"))||0;e.top+=parseFloat(c.css(b[0],"borderTopWidth"))||0;e.left+=parseFloat(c.css(b[0],"borderLeftWidth"))||0;return{top:d.top-e.top,left:d.left-e.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||t.body;a&&!Ia.test(a.nodeName)&&
+c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(e){var f=this[0],h;if(!f)return null;if(e!==B)return this.each(function(){if(h=fa(this))h.scrollTo(!a?e:c(h).scrollLeft(),a?e:c(h).scrollTop());else this[d]=e});else return(h=fa(f))?"pageXOffset"in h?h[a?"pageYOffset":"pageXOffset"]:c.support.boxModel&&h.document.documentElement[d]||h.document.body[d]:f[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase();
+c.fn["inner"+b]=function(){return this[0]?parseFloat(c.css(this[0],d,"padding")):null};c.fn["outer"+b]=function(e){return this[0]?parseFloat(c.css(this[0],d,e?"margin":"border")):null};c.fn[d]=function(e){var f=this[0];if(!f)return e==null?null:this;if(c.isFunction(e))return this.each(function(l){var k=c(this);k[d](e.call(this,l,k[d]()))});if(c.isWindow(f))return f.document.compatMode==="CSS1Compat"&&f.document.documentElement["client"+b]||f.document.body["client"+b];else if(f.nodeType===9)return Math.max(f.documentElement["client"+
+b],f.body["scroll"+b],f.documentElement["scroll"+b],f.body["offset"+b],f.documentElement["offset"+b]);else if(e===B){f=c.css(f,d);var h=parseFloat(f);return c.isNaN(h)?f:h}else return this.css(d,typeof e==="string"?e:e+"px")}})})(window); \ No newline at end of file
diff --git a/library/prettyphoto/js/jquery-1.6.1.min.js b/library/prettyphoto/js/jquery-1.6.1.min.js
new file mode 100644
index 000000000..eb6a59693
--- /dev/null
+++ b/library/prettyphoto/js/jquery-1.6.1.min.js
@@ -0,0 +1,18 @@
+/*!
+ * jQuery JavaScript Library v1.6.1
+ * http://jquery.com/
+ *
+ * Copyright 2011, John Resig
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ * Copyright 2011, The Dojo Foundation
+ * Released under the MIT, BSD, and GPL Licenses.
+ *
+ * Date: Thu May 12 15:04:36 2011 -0400
+ */
+(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cv(a){if(!cj[a]){var b=f("<"+a+">").appendTo("body"),d=b.css("display");b.remove();if(d==="none"||d===""){ck||(ck=c.createElement("iframe"),ck.frameBorder=ck.width=ck.height=0),c.body.appendChild(ck);if(!cl||!ck.createElement)cl=(ck.contentWindow||ck.contentDocument).document,cl.write("<!doctype><html><body></body></html>");b=cl.createElement(a),cl.body.appendChild(b),d=f.css(b,"display"),c.body.removeChild(ck)}cj[a]=d}return cj[a]}function cu(a,b){var c={};f.each(cp.concat.apply([],cp.slice(0,b)),function(){c[this]=a});return c}function ct(){cq=b}function cs(){setTimeout(ct,0);return cq=f.now()}function ci(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ch(){try{return new a.XMLHttpRequest}catch(b){}}function cb(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g<i;g++){if(g===1)for(h in a.converters)typeof h=="string"&&(e[h.toLowerCase()]=a.converters[h]);l=k,k=d[g];if(k==="*")k=l;else if(l!=="*"&&l!==k){m=l+" "+k,n=e[m]||e["* "+k];if(!n){p=b;for(o in e){j=o.split(" ");if(j[0]===l||j[0]==="*"){p=e[j[1]+" "+k];if(p){o=e[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&f.error("No conversion from "+m.replace(" "," to ")),n!==!0&&(c=n?n(c):p(o(c)))}}return c}function ca(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]==="*")f.shift(),h===b&&(h=a.mimeType||c.getResponseHeader("content-type"));if(h)for(i in e)if(e[i]&&e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+" "+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j);return d[j]}}function b_(a,b,c,d){if(f.isArray(b))f.each(b,function(b,e){c||bF.test(a)?d(a,e):b_(a+"["+(typeof e=="object"||f.isArray(e)?b:"")+"]",e,c,d)});else if(!c&&b!=null&&typeof b=="object")for(var e in b)b_(a+"["+e+"]",b[e],c,d);else d(a,b)}function b$(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bU,l;for(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l=="string"&&(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=b$(a,c,d,e,l,g)));(k||!l)&&!g["*"]&&(l=b$(a,c,d,e,"*",g));return l}function bZ(a){return function(b,c){typeof b!="string"&&(c=b,b="*");if(f.isFunction(c)){var d=b.toLowerCase().split(bQ),e=0,g=d.length,h,i,j;for(;e<g;e++)h=d[e],j=/^\+/.test(h),j&&(h=h.substr(1)||"*"),i=a[h]=a[h]||[],i[j?"unshift":"push"](c)}}}function bD(a,b,c){var d=b==="width"?bx:by,e=b==="width"?a.offsetWidth:a.offsetHeight;if(c==="border")return e;f.each(d,function(){c||(e-=parseFloat(f.css(a,"padding"+this))||0),c==="margin"?e+=parseFloat(f.css(a,"margin"+this))||0:e-=parseFloat(f.css(a,"border"+this+"Width"))||0});return e}function bn(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(bf,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bm(a){f.nodeName(a,"input")?bl(a):a.getElementsByTagName&&f.grep(a.getElementsByTagName("input"),bl)}function bl(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bk(a){return"getElementsByTagName"in a?a.getElementsByTagName("*"):"querySelectorAll"in a?a.querySelectorAll("*"):[]}function bj(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bi(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c=f.expando,d=f.data(a),e=f.data(b,d);if(d=d[c]){var g=d.events;e=e[c]=f.extend({},d);if(g){delete e.handle,e.events={};for(var h in g)for(var i=0,j=g[h].length;i<j;i++)f.event.add(b,h+(g[h][i].namespace?".":"")+g[h][i].namespace,g[h][i],g[h][i].data)}}}}function bh(a,b){return f.nodeName(a,"table")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function X(a,b,c){b=b||0;if(f.isFunction(b))return f.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return f.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=f.grep(a,function(a){return a.nodeType===1});if(S.test(b))return f.filter(b,d,!c);b=f.filter(b,d)}return f.grep(a,function(a,d){return f.inArray(a,b)>=0===c})}function W(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function O(a,b){return(a&&a!=="*"?a+".":"")+b.replace(A,"`").replace(B,"&")}function N(a){var b,c,d,e,g,h,i,j,k,l,m,n,o,p=[],q=[],r=f._data(this,"events");if(!(a.liveFired===this||!r||!r.live||a.target.disabled||a.button&&a.type==="click")){a.namespace&&(n=new RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)")),a.liveFired=this;var s=r.live.slice(0);for(i=0;i<s.length;i++)g=s[i],g.origType.replace(y,"")===a.type?q.push(g.selector):s.splice(i--,1);e=f(a.target).closest(q,a.currentTarget);for(j=0,k=e.length;j<k;j++){m=e[j];for(i=0;i<s.length;i++){g=s[i];if(m.selector===g.selector&&(!n||n.test(g.namespace))&&!m.elem.disabled){h=m.elem,d=null;if(g.preType==="mouseenter"||g.preType==="mouseleave")a.type=g.preType,d=f(a.relatedTarget).closest(g.selector)[0],d&&f.contains(h,d)&&(d=h);(!d||d!==h)&&p.push({elem:h,handleObj:g,level:m.level})}}}for(j=0,k=p.length;j<k;j++){e=p[j];if(c&&e.level>c)break;a.currentTarget=e.elem,a.data=e.handleObj.data,a.handleObj=e.handleObj,o=e.handleObj.origHandler.apply(e.elem,arguments);if(o===!1||a.isPropagationStopped()){c=e.level,o===!1&&(b=!1);if(a.isImmediatePropagationStopped())break}}return b}}function L(a,c,d){var e=f.extend({},d[0]);e.type=a,e.originalEvent={},e.liveFired=b,f.event.handle.call(c,e),e.isDefaultPrevented()&&d[0].preventDefault()}function F(){return!0}function E(){return!1}function m(a,c,d){var e=c+"defer",g=c+"queue",h=c+"mark",i=f.data(a,e,b,!0);i&&(d==="queue"||!f.data(a,g,b,!0))&&(d==="mark"||!f.data(a,h,b,!0))&&setTimeout(function(){!f.data(a,g,b,!0)&&!f.data(a,h,b,!0)&&(f.removeData(a,e,!0),i.resolve())},0)}function l(a){for(var b in a)if(b!=="toJSON")return!1;return!0}function k(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(j,"$1-$2").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNaN(d)?i.test(d)?f.parseJSON(d):d:parseFloat(d)}catch(g){}f.data(a,c,d)}else d=b}return d}var c=a.document,d=a.navigator,e=a.location,f=function(){function H(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(H,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/\d/,n=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,o=/^[\],:{}\s]*$/,p=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,q=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,r=/(?:^|:|,)(?:\s*\[)+/g,s=/(webkit)[ \/]([\w.]+)/,t=/(opera)(?:.*version)?[ \/]([\w.]+)/,u=/(msie) ([\w.]+)/,v=/(mozilla)(?:.*? rv:([\w.]+))?/,w=d.userAgent,x,y,z,A=Object.prototype.toString,B=Object.prototype.hasOwnProperty,C=Array.prototype.push,D=Array.prototype.slice,E=String.prototype.trim,F=Array.prototype.indexOf,G={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=n.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.6.1",length:0,size:function(){return this.length},toArray:function(){return D.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?C.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),y.done(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(D.apply(this,arguments),"slice",D.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:C,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j<k;j++)if((a=arguments[j])!=null)for(c in a){d=i[c],f=a[c];if(i===f)continue;l&&f&&(e.isPlainObject(f)||(g=e.isArray(f)))?(g?(g=!1,h=d&&e.isArray(d)?d:[]):h=d&&e.isPlainObject(d)?d:{},i[c]=e.extend(l,h,f)):f!==b&&(i[c]=f)}return i},e.extend({noConflict:function(b){a.$===e&&(a.$=g),b&&a.jQuery===e&&(a.jQuery=f);return e},isReady:!1,readyWait:1,holdReady:function(a){a?e.readyWait++:e.ready(!0)},ready:function(a){if(a===!0&&!--e.readyWait||a!==!0&&!e.isReady){if(!c.body)return setTimeout(e.ready,1);e.isReady=!0;if(a!==!0&&--e.readyWait>0)return;y.resolveWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").unbind("ready")}},bindReady:function(){if(!y){y=e._Deferred();if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",z,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",z),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&H()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNaN:function(a){return a==null||!m.test(a)||isNaN(a)},type:function(a){return a==null?String(a):G[A.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;if(a.constructor&&!B.call(a,"constructor")&&!B.call(a.constructor.prototype,"isPrototypeOf"))return!1;var c;for(c in a);return c===b||B.call(a,c)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw a},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(o.test(b.replace(p,"@").replace(q,"]").replace(r,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(b,c,d){a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b)),d=c.documentElement,(!d||!d.nodeName||d.nodeName==="parsererror")&&e.error("Invalid XML: "+b);return c},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g<h;)if(c.apply(a[g++],d)===!1)break}else if(i){for(f in a)if(c.call(a[f],f,a[f])===!1)break}else for(;g<h;)if(c.call(a[g],g,a[g++])===!1)break;return a},trim:E?function(a){return a==null?"":E.call(a)}:function(a){return a==null?"":(a+"").replace(k,"").replace(l,"")},makeArray:function(a,b){var c=b||[];if(a!=null){var d=e.type(a);a.length==null||d==="string"||d==="function"||d==="regexp"||e.isWindow(a)?C.call(c,a):e.merge(c,a)}return c},inArray:function(a,b){if(F)return F.call(b,a);for(var c=0,d=b.length;c<d;c++)if(b[c]===a)return c;return-1},merge:function(a,c){var d=a.length,e=0;if(typeof c.length=="number")for(var f=c.length;e<f;e++)a[d++]=c[e];else while(c[e]!==b)a[d++]=c[e++];a.length=d;return a},grep:function(a,b,c){var d=[],e;c=!!c;for(var f=0,g=a.length;f<g;f++)e=!!b(a[f],f),c!==e&&d.push(a[f]);return d},map:function(a,c,d){var f,g,h=[],i=0,j=a.length,k=a instanceof e||j!==b&&typeof j=="number"&&(j>0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i<j;i++)f=c(a[i],i,d),f!=null&&(h[h.length]=f);else for(g in a)f=c(a[g],g,d),f!=null&&(h[h.length]=f);return h.concat.apply([],h)},guid:1,proxy:function(a,c){if(typeof c=="string"){var d=a[c];c=a,a=d}if(!e.isFunction(a))return b;var f=D.call(arguments,2),g=function(){return a.apply(c,f.concat(D.call(arguments)))};g.guid=a.guid=a.guid||g.guid||e.guid++;return g},access:function(a,c,d,f,g,h){var i=a.length;if(typeof c=="object"){for(var j in c)e.access(a,j,c[j],f,g,d);return a}if(d!==b){f=!h&&f&&e.isFunction(d);for(var k=0;k<i;k++)g(a[k],c,f?d.call(a[k],k,g(a[k],c)):d,h);return a}return i?g(a[0],c):b},now:function(){return(new Date).getTime()},uaMatch:function(a){a=a.toLowerCase();var b=s.exec(a)||t.exec(a)||u.exec(a)||a.indexOf("compatible")<0&&v.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},sub:function(){function a(b,c){return new a.fn.init(b,c)}e.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function(d,f){f&&f instanceof e&&!(f instanceof a)&&(f=a(f));return e.fn.init.call(this,d,f,b)},a.fn.init.prototype=a.fn;var b=a(c);return a},browser:{}}),e.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){G["[object "+b+"]"]=b.toLowerCase()}),x=e.uaMatch(w),x.browser&&(e.browser[x.browser]=!0,e.browser.version=x.version),e.browser.webkit&&(e.browser.safari=!0),j.test(" ")&&(k=/^[\s\xA0]+/,l=/[\s\xA0]+$/),h=e(c),c.addEventListener?z=function(){c.removeEventListener("DOMContentLoaded",z,!1),e.ready()}:c.attachEvent&&(z=function(){c.readyState==="complete"&&(c.detachEvent("onreadystatechange",z),e.ready())});return e}(),g="done fail isResolved isRejected promise then always pipe".split(" "),h=[].slice;f.extend({_Deferred:function(){var a=[],b,c,d,e={done:function(){if(!d){var c=arguments,g,h,i,j,k;b&&(k=b,b=0);for(g=0,h=c.length;g<h;g++)i=c[g],j=f.type(i),j==="array"?e.done.apply(e,i):j==="function"&&a.push(i);k&&e.resolveWith(k[0],k[1])}return this},resolveWith:function(e,f){if(!d&&!b&&!c){f=f||[],c=1;try{while(a[0])a.shift().apply(e,f)}finally{b=[e,f],c=0}}return this},resolve:function(){e.resolveWith(this,arguments);return this},isResolved:function(){return!!c||!!b},cancel:function(){d=1,a=[];return this}};return e},Deferred:function(a){var b=f._Deferred(),c=f._Deferred(),d;f.extend(b,{then:function(a,c){b.done(a).fail(c);return this},always:function(){return b.done.apply(b,arguments).fail.apply(this,arguments)},fail:c.done,rejectWith:c.resolveWith,reject:c.resolve,isRejected:c.isResolved,pipe:function(a,c){return f.Deferred(function(d){f.each({done:[a,"resolve"],fail:[c,"reject"]},function(a,c){var e=c[0],g=c[1],h;f.isFunction(e)?b[a](function(){h=e.apply(this,arguments),h&&f.isFunction(h.promise)?h.promise().then(d.resolve,d.reject):d[g](h)}):b[a](d[g])})}).promise()},promise:function(a){if(a==null){if(d)return d;d=a={}}var c=g.length;while(c--)a[g[c]]=b[g[c]];return a}}),b.done(c.cancel).fail(b.cancel),delete b.cancel,a&&a.call(b,b);return b},when:function(a){function i(a){return function(c){b[a]=arguments.length>1?h.call(arguments,0):c,--e||g.resolveWith(g,h.call(b,0))}}var b=arguments,c=0,d=b.length,e=d,g=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred();if(d>1){for(;c<d;c++)b[c]&&f.isFunction(b[c].promise)?b[c].promise().then(i(c),g.reject):--e;e||g.resolveWith(g,b)}else g!==a&&g.resolveWith(g,d?[a]:[]);return g.promise()}}),f.support=function(){var a=c.createElement("div"),b=c.documentElement,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r;a.setAttribute("className","t"),a.innerHTML=" <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>",d=a.getElementsByTagName("*"),e=a.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};f=c.createElement("select"),g=f.appendChild(c.createElement("option")),h=a.getElementsByTagName("input")[0],j={leadingWhitespace:a.firstChild.nodeType===3,tbody:!a.getElementsByTagName("tbody").length,htmlSerialize:!!a.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55$/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:h.value==="on",optSelected:g.selected,getSetAttribute:a.className!=="t",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},h.checked=!0,j.noCloneChecked=h.cloneNode(!0).checked,f.disabled=!0,j.optDisabled=!g.disabled;try{delete a.test}catch(s){j.deleteExpando=!1}!a.addEventListener&&a.attachEvent&&a.fireEvent&&(a.attachEvent("onclick",function b(){j.noCloneEvent=!1,a.detachEvent("onclick",b)}),a.cloneNode(!0).fireEvent("onclick")),h=c.createElement("input"),h.value="t",h.setAttribute("type","radio"),j.radioValue=h.value==="t",h.setAttribute("checked","checked"),a.appendChild(h),k=c.createDocumentFragment(),k.appendChild(a.firstChild),j.checkClone=k.cloneNode(!0).cloneNode(!0).lastChild.checked,a.innerHTML="",a.style.width=a.style.paddingLeft="1px",l=c.createElement("body"),m={visibility:"hidden",width:0,height:0,border:0,margin:0,background:"none"};for(q in m)l.style[q]=m[q];l.appendChild(a),b.insertBefore(l,b.firstChild),j.appendChecked=h.checked,j.boxModel=a.offsetWidth===2,"zoom"in a.style&&(a.style.display="inline",a.style.zoom=1,j.inlineBlockNeedsLayout=a.offsetWidth===2,a.style.display="",a.innerHTML="<div style='width:4px;'></div>",j.shrinkWrapBlocks=a.offsetWidth!==2),a.innerHTML="<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>",n=a.getElementsByTagName("td"),r=n[0].offsetHeight===0,n[0].style.display="",n[1].style.display="none",j.reliableHiddenOffsets=r&&n[0].offsetHeight===0,a.innerHTML="",c.defaultView&&c.defaultView.getComputedStyle&&(i=c.createElement("div"),i.style.width="0",i.style.marginRight="0",a.appendChild(i),j.reliableMarginRight=(parseInt((c.defaultView.getComputedStyle(i,null)||{marginRight:0}).marginRight,10)||0)===0),l.innerHTML="",b.removeChild(l);if(a.attachEvent)for(q in{submit:1,change:1,focusin:1})p="on"+q,r=p in a,r||(a.setAttribute(p,"return;"),r=typeof a[p]=="function"),j[q+"Bubbles"]=r;return j}(),f.boxModel=f.support.boxModel;var i=/^(?:\{.*\}|\[.*\])$/,j=/([a-z])([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!l(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g=f.expando,h=typeof c=="string",i,j=a.nodeType,k=j?f.cache:a,l=j?a[f.expando]:a[f.expando]&&f.expando;if((!l||e&&l&&!k[l][g])&&h&&d===b)return;l||(j?a[f.expando]=l=++f.uuid:l=f.expando),k[l]||(k[l]={},j||(k[l].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?k[l][g]=f.extend(k[l][g],c):k[l]=f.extend(k[l],c);i=k[l],e&&(i[g]||(i[g]={}),i=i[g]),d!==b&&(i[f.camelCase(c)]=d);if(c==="events"&&!i[c])return i[g]&&i[g].events;return h?i[f.camelCase(c)]:i}},removeData:function(b,c,d){if(!!f.acceptData(b)){var e=f.expando,g=b.nodeType,h=g?f.cache:b,i=g?b[f.expando]:f.expando;if(!h[i])return;if(c){var j=d?h[i][e]:h[i];if(j){delete j[c];if(!l(j))return}}if(d){delete h[i][e];if(!l(h[i]))return}var k=h[i][e];f.support.deleteExpando||h!=a?delete h[i]:h[i]=null,k?(h[i]={},g||(h[i].toJSON=f.noop),h[i][e]=k):g&&(f.support.deleteExpando?delete b[f.expando]:b.removeAttribute?b.removeAttribute(f.expando):b[f.expando]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d=null;if(typeof a=="undefined"){if(this.length){d=f.data(this[0]);if(this[0].nodeType===1){var e=this[0].attributes,g;for(var h=0,i=e.length;h<i;h++)g=e[h].name,g.indexOf("data-")===0&&(g=f.camelCase(g.substring(5)),k(this[0],g,d[g]))}}return d}if(typeof a=="object")return this.each(function(){f.data(this,a)});var j=a.split(".");j[1]=j[1]?"."+j[1]:"";if(c===b){d=this.triggerHandler("getData"+j[1]+"!",[j[0]]),d===b&&this.length&&(d=f.data(this[0],a),d=k(this[0],a,d));return d===b&&j[1]?this.data(j[0]):d}return this.each(function(){var b=f(this),d=[j[0],c];b.triggerHandler("setData"+j[1]+"!",d),f.data(this,a,c),b.triggerHandler("changeData"+j[1]+"!",d)})},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,c){a&&(c=(c||"fx")+"mark",f.data(a,c,(f.data(a,c,b,!0)||0)+1,!0))},_unmark:function(a,c,d){a!==!0&&(d=c,c=a,a=!1);if(c){d=d||"fx";var e=d+"mark",g=a?0:(f.data(c,e,b,!0)||1)-1;g?f.data(c,e,g,!0):(f.removeData(c,e,!0),m(c,d,"mark"))}},queue:function(a,c,d){if(a){c=(c||"fx")+"queue";var e=f.data(a,c,b,!0);d&&(!e||f.isArray(d)?e=f.data(a,c,f.makeArray(d),!0):e.push(d));return e||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e;d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),d.call(a,function(){f.dequeue(a,b)})),c.length||(f.removeData(a,b+"queue",!0),m(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){typeof a!="string"&&(c=a,a="fx");if(c===b)return f.queue(this[0],a);return this.each(function(){var b=f.queue(this,a,c);a==="fx"&&b[0]!=="inprogress"&&f.dequeue(this,a)})},dequeue:function(a){return this.each(function(){f.dequeue(this,a)})},delay:function(a,b){a=f.fx?f.fx.speeds[a]||a:a,b=b||"fx";return this.queue(b,function(){var c=this;setTimeout(function(){f.dequeue(c,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,c){function m(){--h||d.resolveWith(e,[e])}typeof a!="string"&&(c=a,a=b),a=a||"fx";var d=f.Deferred(),e=this,g=e.length,h=1,i=a+"defer",j=a+"queue",k=a+"mark",l;while(g--)if(l=f.data(e[g],i,b,!0)||(f.data(e[g],j,b,!0)||f.data(e[g],k,b,!0))&&f.data(e[g],i,f._Deferred(),!0))h++,l.done(m);m();return d.promise()}});var n=/[\n\t\r]/g,o=/\s+/,p=/\r/g,q=/^(?:button|input)$/i,r=/^(?:button|input|object|select|textarea)$/i,s=/^a(?:rea)?$/i,t=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,u=/\:/,v,w;f.fn.extend({attr:function(a,b){return f.access(this,a,b,!0,f.attr)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,a,b,!0,f.prop)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.addClass(a.call(this,b,c.attr("class")||""))});if(a&&typeof a=="string"){var b=(a||"").split(o);for(var c=0,d=this.length;c<d;c++){var e=this[c];if(e.nodeType===1)if(!e.className)e.className=a;else{var g=" "+e.className+" ",h=e.className;for(var i=0,j=b.length;i<j;i++)g.indexOf(" "+b[i]+" ")<0&&(h+=" "+b[i]);e.className=f.trim(h)}}}return this},removeClass:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.removeClass(a.call(this,b,c.attr("class")))});if(a&&typeof a=="string"||a===b){var c=(a||"").split(o);for(var d=0,e=this.length;d<e;d++){var g=this[d];if(g.nodeType===1&&g.className)if(a){var h=(" "+g.className+" ").replace(n," ");for(var i=0,j=c.length;i<j;i++)h=h.replace(" "+c[i]+" "," ");g.className=f.trim(h)}else g.className=""}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b=="boolean";if(f.isFunction(a))return this.each(function(c){var d=f(this);d.toggleClass(a.call(this,c,d.attr("class"),b),b)});return this.each(function(){if(c==="string"){var e,g=0,h=f(this),i=b,j=a.split(o);while(e=j[g++])i=d?i:!h.hasClass(e),h[i?"addClass":"removeClass"](e)}else if(c==="undefined"||c==="boolean")this.className&&f._data(this,"__className__",this.className),this.className=this.className||a===!1?"":f._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ";for(var c=0,d=this.length;c<d;c++)if((" "+this[c].className+" ").replace(n," ").indexOf(b)>-1)return!0;return!1},val:function(a){var c,d,e=this[0];if(!arguments.length){if(e){c=f.valHooks[e.nodeName.toLowerCase()]||f.valHooks[e.type];if(c&&"get"in c&&(d=c.get(e,"value"))!==b)return d;return(e.value||"").replace(p,"")}return b}var g=f.isFunction(a);return this.each(function(d){var e=f(this),h;if(this.nodeType===1){g?h=a.call(this,d,e.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c=a.selectedIndex,d=[],e=a.options,g=a.type==="select-one";if(c<0)return null;for(var h=g?c:0,i=g?c+1:e.length;h<i;h++){var j=e[h];if(j.selected&&(f.support.optDisabled?!j.disabled:j.getAttribute("disabled")===null)&&(!j.parentNode.disabled||!f.nodeName(j.parentNode,"optgroup"))){b=f(j).val();if(g)return b;d.push(b)}}if(g&&!d.length&&e.length)return f(e[c]).val();return d},set:function(a,b){var c=f.makeArray(b);f(a).find("option").each(function(){this.selected=f.inArray(f(this).val(),c)>=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attrFix:{tabindex:"tabIndex"},attr:function(a,c,d,e){var g=a.nodeType;if(!a||g===3||g===8||g===2)return b;if(e&&c in f.attrFn)return f(a)[c](d);if(!("getAttribute"in a))return f.prop(a,c,d);var h,i,j=g!==1||!f.isXMLDoc(a);c=j&&f.attrFix[c]||c,i=f.attrHooks[c],i||(!t.test(c)||typeof d!="boolean"&&d!==b&&d.toLowerCase()!==c.toLowerCase()?v&&(f.nodeName(a,"form")||u.test(c))&&(i=v):i=w);if(d!==b){if(d===null){f.removeAttr(a,c);return b}if(i&&"set"in i&&j&&(h=i.set(a,d,c))!==b)return h;a.setAttribute(c,""+d);return d}if(i&&"get"in i&&j)return i.get(a,c);h=a.getAttribute(c);return h===null?b:h},removeAttr:function(a,b){var c;a.nodeType===1&&(b=f.attrFix[b]||b,f.support.getSetAttribute?a.removeAttribute(b):(f.attr(a,b,""),a.removeAttributeNode(a.getAttributeNode(b))),t.test(b)&&(c=f.propFix[b]||b)in a&&(a[c]=!1))},attrHooks:{type:{set:function(a,b){if(q.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},tabIndex:{get:function(a){var c=a.getAttributeNode("tabIndex");return c&&c.specified?parseInt(c.value,10):r.test(a.nodeName)||s.test(a.nodeName)&&a.href?0:b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e=a.nodeType;if(!a||e===3||e===8||e===2)return b;var g,h,i=e!==1||!f.isXMLDoc(a);c=i&&f.propFix[c]||c,h=f.propHooks[c];return d!==b?h&&"set"in h&&(g=h.set(a,d,c))!==b?g:a[c]=d:h&&"get"in h&&(g=h.get(a,c))!==b?g:a[c]},propHooks:{}}),w={get:function(a,c){return a[f.propFix[c]||c]?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=b),a.setAttribute(c,c.toLowerCase()));return c}},f.attrHooks.value={get:function(a,b){if(v&&f.nodeName(a,"button"))return v.get(a,b);return a.value},set:function(a,b,c){if(v&&f.nodeName(a,"button"))return v.set(a,b,c);a.value=b}},f.support.getSetAttribute||(f.attrFix=f.propFix,v=f.attrHooks.name=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&d.nodeValue!==""?d.nodeValue:b},set:function(a,b,c){var d=a.getAttributeNode(c);if(d){d.nodeValue=b;return b}}},f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})})),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}})),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var x=Object.prototype.hasOwnProperty,y=/\.(.*)$/,z=/^(?:textarea|input|select)$/i,A=/\./g,B=/ /g,C=/[^\w\s.|`]/g,D=function(a){return a.replace(C,"\\$&")};f.event={add:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){if(d===!1)d=E;else if(!d)return;var g,h;d.handler&&(g=d,d=g.handler),d.guid||(d.guid=f.guid++);var i=f._data(a);if(!i)return;var j=i.events,k=i.handle;j||(i.events=j={}),k||(i.handle=k=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.handle.apply(k.elem,arguments):b}),k.elem=a,c=c.split(" ");var l,m=0,n;while(l=c[m++]){h=g?f.extend({},g):{handler:d,data:e},l.indexOf(".")>-1?(n=l.split("."),l=n.shift(),h.namespace=n.slice(0).sort().join(".")):(n=[],h.namespace=""),h.type=l,h.guid||(h.guid=d.guid);var o=j[l],p=f.event.special[l]||{};if(!o){o=j[l]=[];if(!p.setup||p.setup.call(a,e,n,k)===!1)a.addEventListener?a.addEventListener(l,k,!1):a.attachEvent&&a.attachEvent("on"+l,k)}p.add&&(p.add.call(a,h),h.handler.guid||(h.handler.guid=d.guid)),o.push(h),f.event.global[l]=!0}a=null}},global:{},remove:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){d===!1&&(d=E);var g,h,i,j,k=0,l,m,n,o,p,q,r,s=f.hasData(a)&&f._data(a),t=s&&s.events;if(!s||!t)return;c&&c.type&&(d=c.handler,c=c.type);if(!c||typeof c=="string"&&c.charAt(0)==="."){c=c||"";for(h in t)f.event.remove(a,h+c);return}c=c.split(" ");while(h=c[k++]){r=h,q=null,l=h.indexOf(".")<0,m=[],l||(m=h.split("."),h=m.shift(),n=new RegExp("(^|\\.)"+f.map(m.slice(0).sort(),D).join("\\.(?:.*\\.)?")+"(\\.|$)")),p=t[h];if(!p)continue;if(!d){for(j=0;j<p.length;j++){q=p[j];if(l||n.test(q.namespace))f.event.remove(a,r,q.handler,j),p.splice(j--,1)}continue}o=f.event.special[h]||{};for(j=e||0;j<p.length;j++){q=p[j];if(d.guid===q.guid){if(l||n.test(q.namespace))e==null&&p.splice(j--,1),o.remove&&o.remove.call(a,q);if(e!=null)break}}if(p.length===0||e!=null&&p.length===1)(!o.teardown||o.teardown.call(a,m)===!1)&&f.removeEvent(a,h,s.handle),g=null,delete t[h]}if(f.isEmptyObject(t)){var u=s.handle;u&&(u.elem=null),delete s.events,delete s.handle,f.isEmptyObject(s)&&f.removeData(a,b,!0)}}},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(c,d,e,g){var h=c.type||c,i=[],j;h.indexOf("!")>=0&&(h=h.slice(0,-1),j=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if(!!e&&!f.event.customEvent[h]||!!f.event.global[h]){c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.exclusive=j,c.namespace=i.join("."),c.namespace_re=new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)");if(g||!e)c.preventDefault(),c.stopPropagation();if(!e){f.each(f.cache,function(){var a=f.expando,b=this[a];b&&b.events&&b.events[h]&&f.event.trigger(c,d,b.handle.elem
+)});return}if(e.nodeType===3||e.nodeType===8)return;c.result=b,c.target=e,d=d?f.makeArray(d):[],d.unshift(c);var k=e,l=h.indexOf(":")<0?"on"+h:"";do{var m=f._data(k,"handle");c.currentTarget=k,m&&m.apply(k,d),l&&f.acceptData(k)&&k[l]&&k[l].apply(k,d)===!1&&(c.result=!1,c.preventDefault()),k=k.parentNode||k.ownerDocument||k===c.target.ownerDocument&&a}while(k&&!c.isPropagationStopped());if(!c.isDefaultPrevented()){var n,o=f.event.special[h]||{};if((!o._default||o._default.call(e.ownerDocument,c)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)){try{l&&e[h]&&(n=e[l],n&&(e[l]=null),f.event.triggered=h,e[h]())}catch(p){}n&&(e[l]=n),f.event.triggered=b}}return c.result}},handle:function(c){c=f.event.fix(c||a.event);var d=((f._data(this,"events")||{})[c.type]||[]).slice(0),e=!c.exclusive&&!c.namespace,g=Array.prototype.slice.call(arguments,0);g[0]=c,c.currentTarget=this;for(var h=0,i=d.length;h<i;h++){var j=d[h];if(e||c.namespace_re.test(j.namespace)){c.handler=j.handler,c.data=j.data,c.handleObj=j;var k=j.handler.apply(this,g);k!==b&&(c.result=k,k===!1&&(c.preventDefault(),c.stopPropagation()));if(c.isImmediatePropagationStopped())break}}return c.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(a){if(a[f.expando])return a;var d=a;a=f.Event(d);for(var e=this.props.length,g;e;)g=this.props[--e],a[g]=d[g];a.target||(a.target=a.srcElement||c),a.target.nodeType===3&&(a.target=a.target.parentNode),!a.relatedTarget&&a.fromElement&&(a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement);if(a.pageX==null&&a.clientX!=null){var h=a.target.ownerDocument||c,i=h.documentElement,j=h.body;a.pageX=a.clientX+(i&&i.scrollLeft||j&&j.scrollLeft||0)-(i&&i.clientLeft||j&&j.clientLeft||0),a.pageY=a.clientY+(i&&i.scrollTop||j&&j.scrollTop||0)-(i&&i.clientTop||j&&j.clientTop||0)}a.which==null&&(a.charCode!=null||a.keyCode!=null)&&(a.which=a.charCode!=null?a.charCode:a.keyCode),!a.metaKey&&a.ctrlKey&&(a.metaKey=a.ctrlKey),!a.which&&a.button!==b&&(a.which=a.button&1?1:a.button&2?3:a.button&4?2:0);return a},guid:1e8,proxy:f.proxy,special:{ready:{setup:f.bindReady,teardown:f.noop},live:{add:function(a){f.event.add(this,O(a.origType,a.selector),f.extend({},a,{handler:N,guid:a.handler.guid}))},remove:function(a){f.event.remove(this,O(a.origType,a.selector),a)}},beforeunload:{setup:function(a,b,c){f.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}}},f.removeEvent=c.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){a.detachEvent&&a.detachEvent("on"+b,c)},f.Event=function(a,b){if(!this.preventDefault)return new f.Event(a,b);a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?F:E):this.type=a,b&&f.extend(this,b),this.timeStamp=f.now(),this[f.expando]=!0},f.Event.prototype={preventDefault:function(){this.isDefaultPrevented=F;var a=this.originalEvent;!a||(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){this.isPropagationStopped=F;var a=this.originalEvent;!a||(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=F,this.stopPropagation()},isDefaultPrevented:E,isPropagationStopped:E,isImmediatePropagationStopped:E};var G=function(a){var b=a.relatedTarget;a.type=a.data;try{if(b&&b!==c&&!b.parentNode)return;while(b&&b!==this)b=b.parentNode;b!==this&&f.event.handle.apply(this,arguments)}catch(d){}},H=function(a){a.type=a.data,f.event.handle.apply(this,arguments)};f.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){f.event.special[a]={setup:function(c){f.event.add(this,b,c&&c.selector?H:G,a)},teardown:function(a){f.event.remove(this,b,a&&a.selector?H:G)}}}),f.support.submitBubbles||(f.event.special.submit={setup:function(a,b){if(!f.nodeName(this,"form"))f.event.add(this,"click.specialSubmit",function(a){var b=a.target,c=b.type;(c==="submit"||c==="image")&&f(b).closest("form").length&&L("submit",this,arguments)}),f.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,c=b.type;(c==="text"||c==="password")&&f(b).closest("form").length&&a.keyCode===13&&L("submit",this,arguments)});else return!1},teardown:function(a){f.event.remove(this,".specialSubmit")}});if(!f.support.changeBubbles){var I,J=function(a){var b=a.type,c=a.value;b==="radio"||b==="checkbox"?c=a.checked:b==="select-multiple"?c=a.selectedIndex>-1?f.map(a.options,function(a){return a.selected}).join("-"):"":f.nodeName(a,"select")&&(c=a.selectedIndex);return c},K=function(c){var d=c.target,e,g;if(!!z.test(d.nodeName)&&!d.readOnly){e=f._data(d,"_change_data"),g=J(d),(c.type!=="focusout"||d.type!=="radio")&&f._data(d,"_change_data",g);if(e===b||g===e)return;if(e!=null||g)c.type="change",c.liveFired=b,f.event.trigger(c,arguments[1],d)}};f.event.special.change={filters:{focusout:K,beforedeactivate:K,click:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(c==="radio"||c==="checkbox"||f.nodeName(b,"select"))&&K.call(this,a)},keydown:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(a.keyCode===13&&!f.nodeName(b,"textarea")||a.keyCode===32&&(c==="checkbox"||c==="radio")||c==="select-multiple")&&K.call(this,a)},beforeactivate:function(a){var b=a.target;f._data(b,"_change_data",J(b))}},setup:function(a,b){if(this.type==="file")return!1;for(var c in I)f.event.add(this,c+".specialChange",I[c]);return z.test(this.nodeName)},teardown:function(a){f.event.remove(this,".specialChange");return z.test(this.nodeName)}},I=f.event.special.change.filters,I.focus=I.beforeactivate}f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){function e(a){var c=f.event.fix(a);c.type=b,c.originalEvent={},f.event.trigger(c,null,c.target),c.isDefaultPrevented()&&a.preventDefault()}var d=0;f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.each(["bind","one"],function(a,c){f.fn[c]=function(a,d,e){var g;if(typeof a=="object"){for(var h in a)this[c](h,d,a[h],e);return this}if(arguments.length===2||d===!1)e=d,d=b;c==="one"?(g=function(a){f(this).unbind(a,g);return e.apply(this,arguments)},g.guid=e.guid||f.guid++):g=e;if(a==="unload"&&c!=="one")this.one(a,d,e);else for(var i=0,j=this.length;i<j;i++)f.event.add(this[i],a,g,d);return this}}),f.fn.extend({unbind:function(a,b){if(typeof a=="object"&&!a.preventDefault)for(var c in a)this.unbind(c,a[c]);else for(var d=0,e=this.length;d<e;d++)f.event.remove(this[d],a,b);return this},delegate:function(a,b,c,d){return this.live(b,c,d,a)},undelegate:function(a,b,c){return arguments.length===0?this.unbind("live"):this.die(b,null,c,a)},trigger:function(a,b){return this.each(function(){f.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0])return f.event.trigger(a,b,this[0],!0)},toggle:function(a){var b=arguments,c=a.guid||f.guid++,d=0,e=function(c){var e=(f.data(this,"lastToggle"+a.guid)||0)%d;f.data(this,"lastToggle"+a.guid,e+1),c.preventDefault();return b[e].apply(this,arguments)||!1};e.guid=c;while(d<b.length)b[d++].guid=c;return this.click(e)},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var M={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};f.each(["live","die"],function(a,c){f.fn[c]=function(a,d,e,g){var h,i=0,j,k,l,m=g||this.selector,n=g?this:f(this.context);if(typeof a=="object"&&!a.preventDefault){for(var o in a)n[c](o,d,a[o],m);return this}if(c==="die"&&!a&&g&&g.charAt(0)==="."){n.unbind(g);return this}if(d===!1||f.isFunction(d))e=d||E,d=b;a=(a||"").split(" ");while((h=a[i++])!=null){j=y.exec(h),k="",j&&(k=j[0],h=h.replace(y,""));if(h==="hover"){a.push("mouseenter"+k,"mouseleave"+k);continue}l=h,M[h]?(a.push(M[h]+k),h=h+k):h=(M[h]||h)+k;if(c==="live")for(var p=0,q=n.length;p<q;p++)f.event.add(n[p],"live."+O(h,m),{data:d,selector:m,handler:e,origType:h,origHandler:e,preType:l});else n.unbind("live."+O(h,m),e)}return this}}),f.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".split(" "),function(a,b){f.fn[b]=function(a,c){c==null&&(c=a,a=null);return arguments.length>0?this.bind(b,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0)}),function(){function u(a,b,c,d,e,f){for(var g=0,h=d.length;g<h;g++){var i=d[g];if(i){var j=!1;i=i[a];while(i){if(i.sizcache===c){j=d[i.sizset];break}if(i.nodeType===1){f||(i.sizcache=c,i.sizset=g);if(typeof b!="string"){if(i===b){j=!0;break}}else if(k.filter(b,[i]).length>0){j=i;break}}i=i[a]}d[g]=j}}}function t(a,b,c,d,e,f){for(var g=0,h=d.length;g<h;g++){var i=d[g];if(i){var j=!1;i=i[a];while(i){if(i.sizcache===c){j=d[i.sizset];break}i.nodeType===1&&!f&&(i.sizcache=c,i.sizset=g);if(i.nodeName.toLowerCase()===b){j=i;break}i=i[a]}d[g]=j}}}var a=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d=0,e=Object.prototype.toString,g=!1,h=!0,i=/\\/g,j=/\W/;[0,0].sort(function(){h=!1;return 0});var k=function(b,d,f,g){f=f||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return f;var i,j,n,o,q,r,s,t,u=!0,w=k.isXML(d),x=[],y=b;do{a.exec(""),i=a.exec(y);if(i){y=i[3],x.push(i[1]);if(i[2]){o=i[3];break}}}while(i);if(x.length>1&&m.exec(b))if(x.length===2&&l.relative[x[0]])j=v(x[0]+x[1],d);else{j=l.relative[x[0]]?[d]:k(x.shift(),d);while(x.length)b=x.shift(),l.relative[b]&&(b+=x.shift()),j=v(b,j)}else{!g&&x.length>1&&d.nodeType===9&&!w&&l.match.ID.test(x[0])&&!l.match.ID.test(x[x.length-1])&&(q=k.find(x.shift(),d,w),d=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]);if(d){q=g?{expr:x.pop(),set:p(g)}:k.find(x.pop(),x.length===1&&(x[0]==="~"||x[0]==="+")&&d.parentNode?d.parentNode:d,w),j=q.expr?k.filter(q.expr,q.set):q.set,x.length>0?n=p(j):u=!1;while(x.length)r=x.pop(),s=r,l.relative[r]?s=x.pop():r="",s==null&&(s=d),l.relative[r](n,s,w)}else n=x=[]}n||(n=j),n||k.error(r||b);if(e.call(n)==="[object Array]")if(!u)f.push.apply(f,n);else if(d&&d.nodeType===1)for(t=0;n[t]!=null;t++)n[t]&&(n[t]===!0||n[t].nodeType===1&&k.contains(d,n[t]))&&f.push(j[t]);else for(t=0;n[t]!=null;t++)n[t]&&n[t].nodeType===1&&f.push(j[t]);else p(n,f);o&&(k(o,h,f,g),k.uniqueSort(f));return f};k.uniqueSort=function(a){if(r){g=h,a.sort(r);if(g)for(var b=1;b<a.length;b++)a[b]===a[b-1]&&a.splice(b--,1)}return a},k.matches=function(a,b){return k(a,null,null,b)},k.matchesSelector=function(a,b){return k(b,null,null,[a]).length>0},k.find=function(a,b,c){var d;if(!a)return[];for(var e=0,f=l.order.length;e<f;e++){var g,h=l.order[e];if(g=l.leftMatch[h].exec(a)){var j=g[1];g.splice(1,1);if(j.substr(j.length-1)!=="\\"){g[1]=(g[1]||"").replace(i,""),d=l.find[h](g,b,c);if(d!=null){a=a.replace(l.match[h],"");break}}}}d||(d=typeof b.getElementsByTagName!="undefined"?b.getElementsByTagName("*"):[]);return{set:d,expr:a}},k.filter=function(a,c,d,e){var f,g,h=a,i=[],j=c,m=c&&c[0]&&k.isXML(c[0]);while(a&&c.length){for(var n in l.filter)if((f=l.leftMatch[n].exec(a))!=null&&f[2]){var o,p,q=l.filter[n],r=f[1];g=!1,f.splice(1,1);if(r.substr(r.length-1)==="\\")continue;j===i&&(i=[]);if(l.preFilter[n]){f=l.preFilter[n](f,j,d,i,e,m);if(!f)g=o=!0;else if(f===!0)continue}if(f)for(var s=0;(p=j[s])!=null;s++)if(p){o=q(p,f,s,j);var t=e^!!o;d&&o!=null?t?g=!0:j[s]=!1:t&&(i.push(p),g=!0)}if(o!==b){d||(j=i),a=a.replace(l.match[n],"");if(!g)return[];break}}if(a===h)if(g==null)k.error(a);else break;h=a}return j},k.error=function(a){throw"Syntax error, unrecognized expression: "+a};var l=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(a){return a.getAttribute("href")},type:function(a){return a.getAttribute("type")}},relative:{"+":function(a,b){var c=typeof b=="string",d=c&&!j.test(b),e=c&&!d;d&&(b=b.toLowerCase());for(var f=0,g=a.length,h;f<g;f++)if(h=a[f]){while((h=h.previousSibling)&&h.nodeType!==1);a[f]=e||h&&h.nodeName.toLowerCase()===b?h||!1:h===b}e&&k.filter(b,a,!0)},">":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!j.test(b)){b=b.toLowerCase();for(;e<f;e++){c=a[e];if(c){var g=c.parentNode;a[e]=g.nodeName.toLowerCase()===b?g:!1}}}else{for(;e<f;e++)c=a[e],c&&(a[e]=d?c.parentNode:c.parentNode===b);d&&k.filter(b,a,!0)}},"":function(a,b,c){var e,f=d++,g=u;typeof b=="string"&&!j.test(b)&&(b=b.toLowerCase(),e=b,g=t),g("parentNode",b,f,a,e,c)},"~":function(a,b,c){var e,f=d++,g=u;typeof b=="string"&&!j.test(b)&&(b=b.toLowerCase(),e=b,g=t),g("previousSibling",b,f,a,e,c)}},find:{ID:function(a,b,c){if(typeof b.getElementById!="undefined"&&!c){var d=b.getElementById(a[1]);return d&&d.parentNode?[d]:[]}},NAME:function(a,b){if(typeof b.getElementsByName!="undefined"){var c=[],d=b.getElementsByName(a[1]);for(var e=0,f=d.length;e<f;e++)d[e].getAttribute("name")===a[1]&&c.push(d[e]);return c.length===0?null:c}},TAG:function(a,b){if(typeof b.getElementsByTagName!="undefined")return b.getElementsByTagName(a[1])}},preFilter:{CLASS:function(a,b,c,d,e,f){a=" "+a[1].replace(i,"")+" ";if(f)return a;for(var g=0,h;(h=b[g])!=null;g++)h&&(e^(h.className&&(" "+h.className+" ").replace(/[\t\n\r]/g," ").indexOf(a)>=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(i,"")},TAG:function(a,b){return a[1].replace(i,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||k.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&k.error(a[0]);a[0]=d++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(i,"");!f&&l.attrMap[g]&&(a[1]=l.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(i,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=k(b[3],null,null,c);else{var g=k.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(l.match.POS.test(b[0])||l.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!k(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return b<c[3]-0},gt:function(a,b,c){return b>c[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=l.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||k.getText([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h<i;h++)if(g[h]===a)return!1;return!0}k.error(e)},CHILD:function(a,b){var c=b[1],d=a;switch(c){case"only":case"first":while(d=d.previousSibling)if(d.nodeType===1)return!1;if(c==="first")return!0;d=a;case"last":while(d=d.nextSibling)if(d.nodeType===1)return!1;return!0;case"nth":var e=b[2],f=b[3];if(e===1&&f===0)return!0;var g=b[0],h=a.parentNode;if(h&&(h.sizcache!==g||!a.nodeIndex)){var i=0;for(d=h.firstChild;d;d=d.nextSibling)d.nodeType===1&&(d.nodeIndex=++i);h.sizcache=g}var j=a.nodeIndex-f;return e===0?j===0:j%e===0&&j/e>=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=l.attrHandle[c]?l.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=l.setFilters[e];if(f)return f(a,c,b,d)}}},m=l.match.POS,n=function(a,b){return"\\"+(b-0+1)};for(var o in l.match)l.match[o]=new RegExp(l.match[o].source+/(?![^\[]*\])(?![^\(]*\))/.source),l.leftMatch[o]=new RegExp(/(^(?:.|\r|\n)*?)/.source+l.match[o].source.replace(/\\(\d+)/g,n));var p=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(q){p=function(a,b){var c=0,d=b||[];if(e.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var f=a.length;c<f;c++)d.push(a[c]);else for(;a[c];c++)d.push(a[c]);return d}}var r,s;c.documentElement.compareDocumentPosition?r=function(a,b){if(a===b){g=!0;return 0}if(!a.compareDocumentPosition||!b.compareDocumentPosition)return a.compareDocumentPosition?-1:1;return a.compareDocumentPosition(b)&4?-1:1}:(r=function(a,b){if(a===b){g=!0;return 0}if(a.sourceIndex&&b.sourceIndex)return a.sourceIndex-b.sourceIndex;var c,d,e=[],f=[],h=a.parentNode,i=b.parentNode,j=h;if(h===i)return s(a,b);if(!h)return-1;if(!i)return 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)f.unshift(j),j=j.parentNode;c=e.length,d=f.length;for(var k=0;k<c&&k<d;k++)if(e[k]!==f[k])return s(e[k],f[k]);return k===c?s(a,f[k],-1):s(e[k],b,1)},s=function(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),k.getText=function(a){var b="",c;for(var d=0;a[d];d++)c=a[d],c.nodeType===3||c.nodeType===4?b+=c.nodeValue:c.nodeType!==8&&(b+=k.getText(c.childNodes));return b},function(){var a=c.createElement("div"),d="script"+(new Date).getTime(),e=c.documentElement;a.innerHTML="<a name='"+d+"'/>",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(l.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},l.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(l.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(l.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=k,b=c.createElement("div"),d="__sizzle__";b.innerHTML="<p class='TEST'></p>";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){k=function(b,e,f,g){e=e||c;if(!g&&!k.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return p(e.getElementsByTagName(b),f);if(h[2]&&l.find.CLASS&&e.getElementsByClassName)return p(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return p([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return p([],f);if(i.id===h[3])return p([i],f)}try{return p(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var m=e,n=e.getAttribute("id"),o=n||d,q=e.parentNode,r=/^\s*[+~]/.test(b);n?o=o.replace(/'/g,"\\$&"):e.setAttribute("id",o),r&&q&&(e=e.parentNode);try{if(!r||q)return p(e.querySelectorAll("[id='"+o+"'] "+b),f)}catch(s){}finally{n||m.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)k[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}k.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(a))try{if(e||!l.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return k(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="<div class='test e'></div><div class='test'></div>";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;l.order.splice(1,0,"CLASS"),l.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?k.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?k.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:k.contains=function(){return!1},k.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var v=function(a,b){var c,d=[],e="",f=b.nodeType?[b]:b;while(c=l.match.PSEUDO.exec(a))e+=c[0],a=a.replace(l.match.PSEUDO,"");a=l.relative[a]?a+"*":a;for(var g=0,h=f.length;g<h;g++)k(a,f[g],d);return k.filter(e,d)};f.find=k,f.expr=k.selectors,f.expr[":"]=f.expr.filters,f.unique=k.uniqueSort,f.text=k.getText,f.isXMLDoc=k.isXML,f.contains=k.contains}();var P=/Until$/,Q=/^(?:parents|prevUntil|prevAll)/,R=/,/,S=/^.[^:#\[\.,]*$/,T=Array.prototype.slice,U=f.expr.match.POS,V={children:!0,contents:!0,next:!0,prev:!0};f.fn.extend({find:function(a){var b=this,c,d;if(typeof a!="string")return f(a).filter(function(){for(c=0,d=b.length;c<d;c++)if(f.contains(b[c],this))return!0});var e=this.pushStack("","find",a),g,h,i;for(c=0,d=this.length;c<d;c++){g=e.length,f.find(a,this[c],e);if(c>0)for(h=g;h<e.length;h++)for(i=0;i<g;i++)if(e[i]===e[h]){e.splice(h--,1);break}}return e},has:function(a){var b=f(a);return this.filter(function(){for(var a=0,c=b.length;a<c;a++)if(f.contains(this,b[a]))return!0})},not:function(a){return this.pushStack(X(this,a,!1),"not",a)},filter:function(a){return this.pushStack(X(this,a,!0),"filter",a)},is:function(a){return!!a&&(typeof a=="string"?f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h,i,j={},k=1;if(g&&a.length){for(d=0,e=a.length;d<e;d++)i=a[d],j[i]||(j[i]=U.test(i)?f(i,b||this.context):i);while(g&&g.ownerDocument&&g!==b){for(i in j)h=j[i],(h.jquery?h.index(g)>-1:f(g).is(h))&&c.push({selector:i,elem:g,level:k});g=g.parentNode,k++}}return c}var l=U.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d<e;d++){g=this[d];while(g){if(l?l.index(g)>-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a||typeof a=="string")return f.inArray(this[0],a?f(a):this.parent().children());return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(W(c[0])||W(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c),g=T.call(arguments);P.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!V[a]?f.unique(e):e,(this.length>1||R.test(d))&&Q.test(a)&&(e=e.reverse());return this.pushStack(e,a,g.join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var Y=/ jQuery\d+="(?:\d+|null)"/g,Z=/^\s+/,$=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,_=/<([\w:]+)/,ba=/<tbody/i,bb=/<|&#?\w+;/,bc=/<(?:script|object|embed|option|style)/i,bd=/checked\s*(?:[^=]|=\s*.checked.)/i,be=/\/(java|ecma)script/i,bf=/^\s*<!(?:\[CDATA\[|\-\-)/,bg={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div<div>","</div>"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){f(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f(arguments[0]).toArray());return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(Y,""):null;if(typeof a=="string"&&!bc.test(a)&&(f.support.leadingWhitespace||!Z.test(a))&&!bg[(_.exec(a)||["",""])[1].toLowerCase()]){a=a.replace($,"<$1></$2>");try{for(var c=0,d=this.length;c<d;c++)this[c].nodeType===1&&(f.cleanData(this[c].getElementsByTagName("*")),this[c].innerHTML=a)}catch(e){this.empty().append(a)}}else f.isFunction(a)?this.each(function(b){var c=f(this);c.html(a.call(this,b,c.html()))}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(f.isFunction(a))return this.each(function(b){var c=f(this),d=c.html();c.replaceWith(a.call(this,b,d))});typeof a!="string"&&(a=f(a).detach());return this.each(function(){var b=this.nextSibling,c=this.parentNode;f(this).remove(),b?f(b).before(a):f(c).append(a)})}return this.length?this.pushStack(f(f.isFunction(a)?a():a),"replaceWith",a):this},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,d){var e,g,h,i,j=a[0],k=[];if(!f.support.checkClone&&arguments.length===3&&typeof j=="string"&&bd.test(j))return this.each(function(){f(this).domManip(a,c,d,!0)});if(f.isFunction(j))return this.each(function(e){var g=f(this);a[0]=j.call(this,e,c?g.html():b),g.domManip(a,c,d)});if(this[0]){i=j&&j.parentNode,f.support.parentNode&&i&&i.nodeType===11&&i.childNodes.length===this.length?e={fragment:i}:e=f.buildFragment(a,this,k),h=e.fragment,h.childNodes.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&&f.nodeName(g,"tr");for(var l=0,m=this.length,n=m-1;l<m;l++)d.call(c?bh(this[l],g):this[l],e.cacheable||m>1&&l<n?f.clone(h,!0,!0):h)}k.length&&f.each(k,bn)}return this}}),f.buildFragment=function(a,b,d){var e,g,h,i=b&&b[0]?b[0].ownerDocument||b[0]:c;a.length===1&&typeof a[0]=="string"&&a[0].length<512&&i===c&&a[0].charAt(0)==="<"&&!bc.test(a[0])&&(f.support.checkClone||!bd.test(a[0]))&&(g=!0,h=f.fragments[a[0]],h&&h!==1&&(e=h)),e||(e=i.createDocumentFragment(),f.clean(a,i,e,d)),g&&(f.fragments[a[0]]=h?e:1);return{fragment:e,cacheable:g}},f.fragments={},f.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){f.fn[a]=function(c){var d=[],e=f(c),g=this.length===1&&this[0].parentNode;if(g&&g.nodeType===11&&g.childNodes.length===1&&e.length===1){e[b](this[0]);return this}for(var h=0,i=e.length;h<i;h++){var j=(h>0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d=a.cloneNode(!0),e,g,h;if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bj(a,d),e=bk(a),g=bk(d);for(h=0;e[h];++h)bj(e[h],g[h])}if(b){bi(a,d);if(c){e=bk(a),g=bk(d);for(h=0;e[h];++h)bi(e[h],g[h])}}return d},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||
+b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!bb.test(k))k=b.createTextNode(k);else{k=k.replace($,"<$1></$2>");var l=(_.exec(k)||["",""])[1].toLowerCase(),m=bg[l]||bg._default,n=m[0],o=b.createElement("div");o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=ba.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]==="<table>"&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&Z.test(k)&&o.insertBefore(b.createTextNode(Z.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i<r;i++)bm(k[i]);else bm(k);k.nodeType?h.push(k):h=f.merge(h,k)}if(d){g=function(a){return!a.type||be.test(a.type)};for(j=0;h[j];j++)if(e&&f.nodeName(h[j],"script")&&(!h[j].type||h[j].type.toLowerCase()==="text/javascript"))e.push(h[j].parentNode?h[j].parentNode.removeChild(h[j]):h[j]);else{if(h[j].nodeType===1){var s=f.grep(h[j].getElementsByTagName("script"),g);h.splice.apply(h,[j+1,0].concat(s))}d.appendChild(h[j])}}return h},cleanData:function(a){var b,c,d=f.cache,e=f.expando,g=f.event.special,h=f.support.deleteExpando;for(var i=0,j;(j=a[i])!=null;i++){if(j.nodeName&&f.noData[j.nodeName.toLowerCase()])continue;c=j[f.expando];if(c){b=d[c]&&d[c][e];if(b&&b.events){for(var k in b.events)g[k]?f.event.remove(j,k):f.removeEvent(j,k,b.handle);b.handle&&(b.handle.elem=null)}h?delete j[f.expando]:j.removeAttribute&&j.removeAttribute(f.expando),delete d[c]}}}});var bo=/alpha\([^)]*\)/i,bp=/opacity=([^)]*)/,bq=/-([a-z])/ig,br=/([A-Z]|^ms)/g,bs=/^-?\d+(?:px)?$/i,bt=/^-?\d/,bu=/^[+\-]=/,bv=/[^+\-\.\de]+/g,bw={position:"absolute",visibility:"hidden",display:"block"},bx=["Left","Right"],by=["Top","Bottom"],bz,bA,bB,bC=function(a,b){return b.toUpperCase()};f.fn.css=function(a,c){if(arguments.length===2&&c===b)return this;return f.access(this,a,c,!0,function(a,c,d){return d!==b?f.style(a,c,d):f.css(a,c)})},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bz(a,"opacity","opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{zIndex:!0,fontWeight:!0,opacity:!0,zoom:!0,lineHeight:!0,widows:!0,orphans:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d;if(h==="number"&&isNaN(d)||d==null)return;h==="string"&&bu.test(d)&&(d=+d.replace(bv,"")+parseFloat(f.css(a,c))),h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(bz)return bz(a,c)},swap:function(a,b,c){var d={};for(var e in b)d[e]=a.style[e],a.style[e]=b[e];c.call(a);for(e in b)a.style[e]=d[e]},camelCase:function(a){return a.replace(bq,bC)}}),f.curCSS=f.css,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){var e;if(c){a.offsetWidth!==0?e=bD(a,b,d):f.swap(a,bw,function(){e=bD(a,b,d)});if(e<=0){e=bz(a,b,b),e==="0px"&&bB&&(e=bB(a,b,b));if(e!=null)return e===""||e==="auto"?"0px":e}if(e<0||e==null){e=a.style[b];return e===""||e==="auto"?"0px":e}return typeof e=="string"?e:e+"px"}},set:function(a,b){if(!bs.test(b))return b;b=parseFloat(b);if(b>=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bp.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle;c.zoom=1;var e=f.isNaN(b)?"":"alpha(opacity="+b*100+")",g=d&&d.filter||c.filter||"";c.filter=bo.test(g)?g.replace(bo,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bz(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bA=function(a,c){var d,e,g;c=c.replace(br,"-$1").toLowerCase();if(!(e=a.ownerDocument.defaultView))return b;if(g=e.getComputedStyle(a,null))d=g.getPropertyValue(c),d===""&&!f.contains(a.ownerDocument.documentElement,a)&&(d=f.style(a,c));return d}),c.documentElement.currentStyle&&(bB=function(a,b){var c,d=a.currentStyle&&a.currentStyle[b],e=a.runtimeStyle&&a.runtimeStyle[b],f=a.style;!bs.test(d)&&bt.test(d)&&(c=f.left,e&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":d||0,d=f.pixelLeft+"px",f.left=c,e&&(a.runtimeStyle.left=e));return d===""?"auto":d}),bz=bA||bB,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bE=/%20/g,bF=/\[\]$/,bG=/\r?\n/g,bH=/#.*$/,bI=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bJ=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bK=/^(?:about|app|app\-storage|.+\-extension|file|widget):$/,bL=/^(?:GET|HEAD)$/,bM=/^\/\//,bN=/\?/,bO=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bP=/^(?:select|textarea)/i,bQ=/\s+/,bR=/([?&])_=[^&]*/,bS=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bT=f.fn.load,bU={},bV={},bW,bX;try{bW=e.href}catch(bY){bW=c.createElement("a"),bW.href="",bW=bW.href}bX=bS.exec(bW.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bT)return bT.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("<div>").append(c.replace(bO,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bP.test(this.nodeName)||bJ.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bG,"\r\n")}}):{name:b.name,value:c.replace(bG,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.bind(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?f.extend(!0,a,f.ajaxSettings,b):(b=a,a=f.extend(!0,f.ajaxSettings,b));for(var c in{context:1,url:1})c in b?a[c]=b[c]:c in f.ajaxSettings&&(a[c]=f.ajaxSettings[c]);return a},ajaxSettings:{url:bW,isLocal:bK.test(bX[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":"*/*"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML}},ajaxPrefilter:bZ(bU),ajaxTransport:bZ(bV),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a?4:0;var o,r,u,w=l?ca(d,v,l):b,x,y;if(a>=200&&a<300||a===304){if(d.ifModified){if(x=v.getResponseHeader("Last-Modified"))f.lastModified[k]=x;if(y=v.getResponseHeader("Etag"))f.etag[k]=y}if(a===304)c="notmodified",o=!0;else try{r=cb(d,w),c="success",o=!0}catch(z){c="parsererror",u=z}}else{u=c;if(!c||a)c="error",a<0&&(a=0)}v.status=a,v.statusText=c,o?h.resolveWith(e,[r,c,v]):h.rejectWith(e,[v,c,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.resolveWith(e,[v,c]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f._Deferred(),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bI.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.done,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bH,"").replace(bM,bX[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bQ),d.crossDomain==null&&(r=bS.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bX[1]&&r[2]==bX[2]&&(r[3]||(r[1]==="http:"?80:443))==(bX[3]||(bX[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),b$(bU,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bL.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bN.test(d.url)?"&":"?")+d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bR,"$1_="+x);d.url=y+(y===d.url?(bN.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", */*; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=b$(bV,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){status<2?w(-1,z):f.error(z)}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)b_(g,a[g],c,e);return d.join("&").replace(bE,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cc=f.now(),cd=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cc++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(cd.test(b.url)||e&&cd.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(cd,l),b.url===j&&(e&&(k=k.replace(cd,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var ce=a.ActiveXObject?function(){for(var a in cg)cg[a](0,1)}:!1,cf=0,cg;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ch()||ci()}:ch,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,ce&&delete cg[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cf,ce&&(cg||(cg={},f(a).unload(ce)),cg[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cj={},ck,cl,cm=/^(?:toggle|show|hide)$/,cn=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,co,cp=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cq,cr=a.webkitRequestAnimationFrame||a.mozRequestAnimationFrame||a.oRequestAnimationFrame;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cu("show",3),a,b,c);for(var g=0,h=this.length;g<h;g++)d=this[g],d.style&&(e=d.style.display,!f._data(d,"olddisplay")&&e==="none"&&(e=d.style.display=""),e===""&&f.css(d,"display")==="none"&&f._data(d,"olddisplay",cv(d.nodeName)));for(g=0;g<h;g++){d=this[g];if(d.style){e=d.style.display;if(e===""||e==="none")d.style.display=f._data(d,"olddisplay")||""}}return this},hide:function(a,b,c){if(a||a===0)return this.animate(cu("hide",3),a,b,c);for(var d=0,e=this.length;d<e;d++)if(this[d].style){var g=f.css(this[d],"display");g!=="none"&&!f._data(this[d],"olddisplay")&&f._data(this[d],"olddisplay",g)}for(d=0;d<e;d++)this[d].style&&(this[d].style.display="none");return this},_toggle:f.fn.toggle,toggle:function(a,b,c){var d=typeof a=="boolean";f.isFunction(a)&&f.isFunction(b)?this._toggle.apply(this,arguments):a==null||d?this.each(function(){var b=d?a:f(this).is(":hidden");f(this)[b?"show":"hide"]()}):this.animate(cu("toggle",3),a,b,c);return this},fadeTo:function(a,b,c,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=f.speed(b,c,d);if(f.isEmptyObject(a))return this.each(e.complete,[!1]);a=f.extend({},a);return this[e.queue===!1?"each":"queue"](function(){e.queue===!1&&f._mark(this);var b=f.extend({},e),c=this.nodeType===1,d=c&&f(this).is(":hidden"),g,h,i,j,k,l,m,n,o;b.animatedProperties={};for(i in a){g=f.camelCase(i),i!==g&&(a[g]=a[i],delete a[i]),h=a[g],f.isArray(h)?(b.animatedProperties[g]=h[1],h=a[g]=h[0]):b.animatedProperties[g]=b.specialEasing&&b.specialEasing[g]||b.easing||"swing";if(h==="hide"&&d||h==="show"&&!d)return b.complete.call(this);c&&(g==="height"||g==="width")&&(b.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY],f.css(this,"display")==="inline"&&f.css(this,"float")==="none"&&(f.support.inlineBlockNeedsLayout?(j=cv(this.nodeName),j==="inline"?this.style.display="inline-block":(this.style.display="inline",this.style.zoom=1)):this.style.display="inline-block"))}b.overflow!=null&&(this.style.overflow="hidden");for(i in a)k=new f.fx(this,b,i),h=a[i],cm.test(h)?k[h==="toggle"?d?"show":"hide":h]():(l=cn.exec(h),m=k.cur(),l?(n=parseFloat(l[2]),o=l[3]||(f.cssNumber[i]?"":"px"),o!=="px"&&(f.style(this,i,(n||1)+o),m=(n||1)/k.cur()*m,f.style(this,i,m+o)),l[1]&&(n=(l[1]==="-="?-1:1)*n+m),k.custom(m,n,o)):k.custom(m,h,""));return!0})},stop:function(a,b){a&&this.queue([]),this.each(function(){var a=f.timers,c=a.length;b||f._unmark(!0,this);while(c--)a[c].elem===this&&(b&&a[c](!0),a.splice(c,1))}),b||this.dequeue();return this}}),f.each({slideDown:cu("show",1),slideUp:cu("hide",1),slideToggle:cu("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){f.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),f.extend({speed:function(a,b,c){var d=a&&typeof a=="object"?f.extend({},a):{complete:c||!c&&b||f.isFunction(a)&&a,duration:a,easing:c&&b||b&&!f.isFunction(b)&&b};d.duration=f.fx.off?0:typeof d.duration=="number"?d.duration:d.duration in f.fx.speeds?f.fx.speeds[d.duration]:f.fx.speeds._default,d.old=d.complete,d.complete=function(a){d.queue!==!1?f.dequeue(this):a!==!1&&f._unmark(this),f.isFunction(d.old)&&d.old.call(this)};return d},easing:{linear:function(a,b,c,d){return c+d*a},swing:function(a,b,c,d){return(-Math.cos(a*Math.PI)/2+.5)*d+c}},timers:[],fx:function(a,b,c){this.options=b,this.elem=a,this.prop=c,b.orig=b.orig||{}}}),f.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this),(f.fx.step[this.prop]||f.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a,b=f.css(this.elem,this.prop);return isNaN(a=parseFloat(b))?!b||b==="auto"?0:b:a},custom:function(a,b,c){function h(a){return d.step(a)}var d=this,e=f.fx,g;this.startTime=cq||cs(),this.start=a,this.end=b,this.unit=c||this.unit||(f.cssNumber[this.prop]?"":"px"),this.now=this.start,this.pos=this.state=0,h.elem=this.elem,h()&&f.timers.push(h)&&!co&&(cr?(co=1,g=function(){co&&(cr(g),e.tick())},cr(g)):co=setInterval(e.tick,e.interval))},show:function(){this.options.orig[this.prop]=f.style(this.elem,this.prop),this.options.show=!0,this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur()),f(this.elem).show()},hide:function(){this.options.orig[this.prop]=f.style(this.elem,this.prop),this.options.hide=!0,this.custom(this.cur(),0)},step:function(a){var b=cq||cs(),c=!0,d=this.elem,e=this.options,g,h;if(a||b>=e.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),e.animatedProperties[this.prop]=!0;for(g in e.animatedProperties)e.animatedProperties[g]!==!0&&(c=!1);if(c){e.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){d.style["overflow"+b]=e.overflow[a]}),e.hide&&f(d).hide();if(e.hide||e.show)for(var i in e.animatedProperties)f.style(d,i,e.orig[i]);e.complete.call(d)}return!1}e.duration==Infinity?this.now=b:(h=b-this.startTime,this.state=h/e.duration,this.pos=f.easing[e.animatedProperties[this.prop]](this.state,h,0,1,e.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){for(var a=f.timers,b=0;b<a.length;++b)a[b]()||a.splice(b--,1);a.length||f.fx.stop()},interval:13,stop:function(){clearInterval(co),co=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){f.style(a.elem,"opacity",a.now)},_default:function(a){a.elem.style&&a.elem.style[a.prop]!=null?a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit:a.elem[a.prop]=a.now}}}),f.expr&&f.expr.filters&&(f.expr.filters.animated=function(a){return f.grep(f.timers,function(b){return a===b.elem}).length});var cw=/^t(?:able|d|h)$/i,cx=/^(?:body|html)$/i;"getBoundingClientRect"in c.documentElement?f.fn.offset=function(a){var b=this[0],c;if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);try{c=b.getBoundingClientRect()}catch(d){}var e=b.ownerDocument,g=e.documentElement;if(!c||!f.contains(g,b))return c?{top:c.top,left:c.left}:{top:0,left:0};var h=e.body,i=cy(e),j=g.clientTop||h.clientTop||0,k=g.clientLeft||h.clientLeft||0,l=i.pageYOffset||f.support.boxModel&&g.scrollTop||h.scrollTop,m=i.pageXOffset||f.support.boxModel&&g.scrollLeft||h.scrollLeft,n=c.top+l-j,o=c.left+m-k;return{top:n,left:o}}:f.fn.offset=function(a){var b=this[0];if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);f.offset.initialize();var c,d=b.offsetParent,e=b,g=b.ownerDocument,h=g.documentElement,i=g.body,j=g.defaultView,k=j?j.getComputedStyle(b,null):b.currentStyle,l=b.offsetTop,m=b.offsetLeft;while((b=b.parentNode)&&b!==i&&b!==h){if(f.offset.supportsFixedPosition&&k.position==="fixed")break;c=j?j.getComputedStyle(b,null):b.currentStyle,l-=b.scrollTop,m-=b.scrollLeft,b===d&&(l+=b.offsetTop,m+=b.offsetLeft,f.offset.doesNotAddBorder&&(!f.offset.doesAddBorderForTableAndCells||!cw.test(b.nodeName))&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),e=d,d=b.offsetParent),f.offset.subtractsBorderForOverflowNotVisible&&c.overflow!=="visible"&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),k=c}if(k.position==="relative"||k.position==="static")l+=i.offsetTop,m+=i.offsetLeft;f.offset.supportsFixedPosition&&k.position==="fixed"&&(l+=Math.max(h.scrollTop,i.scrollTop),m+=Math.max(h.scrollLeft,i.scrollLeft));return{top:l,left:m}},f.offset={initialize:function(){var a=c.body,b=c.createElement("div"),d,e,g,h,i=parseFloat(f.css(a,"marginTop"))||0,j="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";f.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"}),b.innerHTML=j,a.insertBefore(b,a.firstChild),d=b.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,this.doesNotAddBorder=e.offsetTop!==5,this.doesAddBorderForTableAndCells=h.offsetTop===5,e.style.position="fixed",e.style.top="20px",this.supportsFixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",this.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==i,a.removeChild(b),f.offset.initialize=f.noop},bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.offset.initialize(),f.offset.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cy(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cy(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){return this[0]?parseFloat(f.css(this[0],d,"padding")):null},f.fn["outer"+c]=function(a){return this[0]?parseFloat(f.css(this[0],d,a?"margin":"border")):null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c];return e.document.compatMode==="CSS1Compat"&&g||e.document.body["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var h=f.css(e,d),i=parseFloat(h);return f.isNaN(i)?h:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f})(window); \ No newline at end of file
diff --git a/library/prettyphoto/js/jquery.prettyPhoto.js b/library/prettyphoto/js/jquery.prettyPhoto.js
new file mode 100644
index 000000000..a67afddca
--- /dev/null
+++ b/library/prettyphoto/js/jquery.prettyPhoto.js
@@ -0,0 +1,7 @@
+/* ------------------------------------------------------------------------
+ Class: prettyPhoto
+ Use: Lightbox clone for jQuery
+ Author: Stephane Caron (http://www.no-margin-for-errors.com)
+ Version: 3.1.5
+------------------------------------------------------------------------- */
+(function(e){function t(){var e=location.href;hashtag=e.indexOf("#prettyPhoto")!==-1?decodeURI(e.substring(e.indexOf("#prettyPhoto")+1,e.length)):false;return hashtag}function n(){if(typeof theRel=="undefined")return;location.hash=theRel+"/"+rel_index+"/"}function r(){if(location.href.indexOf("#prettyPhoto")!==-1)location.hash="prettyPhoto"}function i(e,t){e=e.replace(/[\[]/,"\\[").replace(/[\]]/,"\\]");var n="[\\?&]"+e+"=([^&#]*)";var r=new RegExp(n);var i=r.exec(t);return i==null?"":i[1]}e.prettyPhoto={version:"3.1.5"};e.fn.prettyPhoto=function(s){function g(){e(".pp_loaderIcon").hide();projectedTop=scroll_pos["scrollTop"]+(d/2-a["containerHeight"]/2);if(projectedTop<0)projectedTop=0;$ppt.fadeTo(settings.animation_speed,1);$pp_pic_holder.find(".pp_content").animate({height:a["contentHeight"],width:a["contentWidth"]},settings.animation_speed);$pp_pic_holder.animate({top:projectedTop,left:v/2-a["containerWidth"]/2<0?0:v/2-a["containerWidth"]/2,width:a["containerWidth"]},settings.animation_speed,function(){$pp_pic_holder.find(".pp_hoverContainer,#fullResImage").height(a["height"]).width(a["width"]);$pp_pic_holder.find(".pp_fade").fadeIn(settings.animation_speed);if(isSet&&S(pp_images[set_position])=="image"){$pp_pic_holder.find(".pp_hoverContainer").show()}else{$pp_pic_holder.find(".pp_hoverContainer").hide()}if(settings.allow_expand){if(a["resized"]){e("a.pp_expand,a.pp_contract").show()}else{e("a.pp_expand").hide()}}if(settings.autoplay_slideshow&&!m&&!f)e.prettyPhoto.startSlideshow();settings.changepicturecallback();f=true});C();s.ajaxcallback()}function y(t){$pp_pic_holder.find("#pp_full_res object,#pp_full_res embed").css("visibility","hidden");$pp_pic_holder.find(".pp_fade").fadeOut(settings.animation_speed,function(){e(".pp_loaderIcon").show();t()})}function b(t){t>1?e(".pp_nav").show():e(".pp_nav").hide()}function w(e,t){resized=false;E(e,t);imageWidth=e,imageHeight=t;if((p>v||h>d)&&doresize&&settings.allow_resize&&!u){resized=true,fitting=false;while(!fitting){if(p>v){imageWidth=v-200;imageHeight=t/e*imageWidth}else if(h>d){imageHeight=d-200;imageWidth=e/t*imageHeight}else{fitting=true}h=imageHeight,p=imageWidth}if(p>v||h>d){w(p,h)}E(imageWidth,imageHeight)}return{width:Math.floor(imageWidth),height:Math.floor(imageHeight),containerHeight:Math.floor(h),containerWidth:Math.floor(p)+settings.horizontal_padding*2,contentHeight:Math.floor(l),contentWidth:Math.floor(c),resized:resized}}function E(t,n){t=parseFloat(t);n=parseFloat(n);$pp_details=$pp_pic_holder.find(".pp_details");$pp_details.width(t);detailsHeight=parseFloat($pp_details.css("marginTop"))+parseFloat($pp_details.css("marginBottom"));$pp_details=$pp_details.clone().addClass(settings.theme).width(t).appendTo(e("body")).css({position:"absolute",top:-1e4});detailsHeight+=$pp_details.height();detailsHeight=detailsHeight<=34?36:detailsHeight;$pp_details.remove();$pp_title=$pp_pic_holder.find(".ppt");$pp_title.width(t);titleHeight=parseFloat($pp_title.css("marginTop"))+parseFloat($pp_title.css("marginBottom"));$pp_title=$pp_title.clone().appendTo(e("body")).css({position:"absolute",top:-1e4});titleHeight+=$pp_title.height();$pp_title.remove();l=n+detailsHeight;c=t;h=l+titleHeight+$pp_pic_holder.find(".pp_top").height()+$pp_pic_holder.find(".pp_bottom").height();p=t}function S(e){if(e.match(/youtube\.com\/watch/i)||e.match(/youtu\.be/i)){return"youtube"}else if(e.match(/vimeo\.com/i)){return"vimeo"}else if(e.match(/\b.mov\b/i)){return"quicktime"}else if(e.match(/\b.swf\b/i)){return"flash"}else if(e.match(/\biframe=true\b/i)){return"iframe"}else if(e.match(/\bajax=true\b/i)){return"ajax"}else if(e.match(/\bcustom=true\b/i)){return"custom"}else if(e.substr(0,1)=="#"){return"inline"}else{return"image"}}function x(){if(doresize&&typeof $pp_pic_holder!="undefined"){scroll_pos=T();contentHeight=$pp_pic_holder.height(),contentwidth=$pp_pic_holder.width();projectedTop=d/2+scroll_pos["scrollTop"]-contentHeight/2;if(projectedTop<0)projectedTop=0;if(contentHeight>d)return;$pp_pic_holder.css({top:projectedTop,left:v/2+scroll_pos["scrollLeft"]-contentwidth/2})}}function T(){if(self.pageYOffset){return{scrollTop:self.pageYOffset,scrollLeft:self.pageXOffset}}else if(document.documentElement&&document.documentElement.scrollTop){return{scrollTop:document.documentElement.scrollTop,scrollLeft:document.documentElement.scrollLeft}}else if(document.body){return{scrollTop:document.body.scrollTop,scrollLeft:document.body.scrollLeft}}}function N(){d=e(window).height(),v=e(window).width();if(typeof $pp_overlay!="undefined")$pp_overlay.height(e(document).height()).width(v)}function C(){if(isSet&&settings.overlay_gallery&&S(pp_images[set_position])=="image"){itemWidth=52+5;navWidth=settings.theme=="facebook"||settings.theme=="pp_default"?50:30;itemsPerPage=Math.floor((a["containerWidth"]-100-navWidth)/itemWidth);itemsPerPage=itemsPerPage<pp_images.length?itemsPerPage:pp_images.length;totalPage=Math.ceil(pp_images.length/itemsPerPage)-1;if(totalPage==0){navWidth=0;$pp_gallery.find(".pp_arrow_next,.pp_arrow_previous").hide()}else{$pp_gallery.find(".pp_arrow_next,.pp_arrow_previous").show()}galleryWidth=itemsPerPage*itemWidth;fullGalleryWidth=pp_images.length*itemWidth;$pp_gallery.css("margin-left",-(galleryWidth/2+navWidth/2)).find("div:first").width(galleryWidth+5).find("ul").width(fullGalleryWidth).find("li.selected").removeClass("selected");goToPage=Math.floor(set_position/itemsPerPage)<totalPage?Math.floor(set_position/itemsPerPage):totalPage;e.prettyPhoto.changeGalleryPage(goToPage);$pp_gallery_li.filter(":eq("+set_position+")").addClass("selected")}else{$pp_pic_holder.find(".pp_content").unbind("mouseenter mouseleave")}}function k(t){if(settings.social_tools)facebook_like_link=settings.social_tools.replace("{location_href}",encodeURIComponent(location.href));settings.markup=settings.markup.replace("{pp_social}","");e("body").append(settings.markup);$pp_pic_holder=e(".pp_pic_holder"),$ppt=e(".ppt"),$pp_overlay=e("div.pp_overlay");if(isSet&&settings.overlay_gallery){currentGalleryPage=0;toInject="";for(var n=0;n<pp_images.length;n++){if(!pp_images[n].match(/\b(jpg|jpeg|png|gif)\b/gi)){classname="default";img_src=""}else{classname="";img_src=pp_images[n]}toInject+="<li class='"+classname+"'><a href='#'><img src='"+img_src+"' width='50' alt='' /></a></li>"}toInject=settings.gallery_markup.replace(/{gallery}/g,toInject);$pp_pic_holder.find("#pp_full_res").after(toInject);$pp_gallery=e(".pp_pic_holder .pp_gallery"),$pp_gallery_li=$pp_gallery.find("li");$pp_gallery.find(".pp_arrow_next").click(function(){e.prettyPhoto.changeGalleryPage("next");e.prettyPhoto.stopSlideshow();return false});$pp_gallery.find(".pp_arrow_previous").click(function(){e.prettyPhoto.changeGalleryPage("previous");e.prettyPhoto.stopSlideshow();return false});$pp_pic_holder.find(".pp_content").hover(function(){$pp_pic_holder.find(".pp_gallery:not(.disabled)").fadeIn()},function(){$pp_pic_holder.find(".pp_gallery:not(.disabled)").fadeOut()});itemWidth=52+5;$pp_gallery_li.each(function(t){e(this).find("a").click(function(){e.prettyPhoto.changePage(t);e.prettyPhoto.stopSlideshow();return false})})}if(settings.slideshow){$pp_pic_holder.find(".pp_nav").prepend('<a href="#" class="pp_play">Play</a>');$pp_pic_holder.find(".pp_nav .pp_play").click(function(){e.prettyPhoto.startSlideshow();return false})}$pp_pic_holder.attr("class","pp_pic_holder "+settings.theme);$pp_overlay.css({opacity:0,height:e(document).height(),width:e(window).width()}).bind("click",function(){if(!settings.modal)e.prettyPhoto.close()});e("a.pp_close").bind("click",function(){e.prettyPhoto.close();return false});if(settings.allow_expand){e("a.pp_expand").bind("click",function(t){if(e(this).hasClass("pp_expand")){e(this).removeClass("pp_expand").addClass("pp_contract");doresize=false}else{e(this).removeClass("pp_contract").addClass("pp_expand");doresize=true}y(function(){e.prettyPhoto.open()});return false})}$pp_pic_holder.find(".pp_previous, .pp_nav .pp_arrow_previous").bind("click",function(){e.prettyPhoto.changePage("previous");e.prettyPhoto.stopSlideshow();return false});$pp_pic_holder.find(".pp_next, .pp_nav .pp_arrow_next").bind("click",function(){e.prettyPhoto.changePage("next");e.prettyPhoto.stopSlideshow();return false});x()}s=jQuery.extend({hook:"rel",animation_speed:"fast",ajaxcallback:function(){},slideshow:5e3,autoplay_slideshow:false,opacity:.8,show_title:true,allow_resize:true,allow_expand:true,default_width:500,default_height:344,counter_separator_label:"/",theme:"pp_default",horizontal_padding:20,hideflash:false,wmode:"opaque",autoplay:true,modal:false,deeplinking:true,overlay_gallery:true,overlay_gallery_max:30,keyboard_shortcuts:true,changepicturecallback:function(){},callback:function(){},ie6_fallback:true,markup:'<div class="pp_pic_holder"> <div class="ppt"> </div> <div class="pp_top"> <div class="pp_left"></div> <div class="pp_middle"></div> <div class="pp_right"></div> </div> <div class="pp_content_container"> <div class="pp_left"> <div class="pp_right"> <div class="pp_content"> <div class="pp_loaderIcon"></div> <div class="pp_fade"> <a href="#" class="pp_expand" title="Expand the image">Expand</a> <div class="pp_hoverContainer"> <a class="pp_next" href="#">next</a> <a class="pp_previous" href="#">previous</a> </div> <div id="pp_full_res"></div> <div class="pp_details"> <div class="pp_nav"> <a href="#" class="pp_arrow_previous">Previous</a> <p class="currentTextHolder">0/0</p> <a href="#" class="pp_arrow_next">Next</a> </div> <p class="pp_description"></p> <div class="pp_social">{pp_social}</div> <a class="pp_close" href="#">Close</a> </div> </div> </div> </div> </div> </div> <div class="pp_bottom"> <div class="pp_left"></div> <div class="pp_middle"></div> <div class="pp_right"></div> </div> </div> <div class="pp_overlay"></div>',gallery_markup:'<div class="pp_gallery"> <a href="#" class="pp_arrow_previous">Previous</a> <div> <ul> {gallery} </ul> </div> <a href="#" class="pp_arrow_next">Next</a> </div>',image_markup:'<img id="fullResImage" src="{path}" />',flash_markup:'<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="{width}" height="{height}"><param name="wmode" value="{wmode}" /><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="{path}" /><embed src="{path}" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="{width}" height="{height}" wmode="{wmode}"></embed></object>',quicktime_markup:'<object classid="clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B" codebase="http://www.apple.com/qtactivex/qtplugin.cab" height="{height}" width="{width}"><param name="src" value="{path}"><param name="autoplay" value="{autoplay}"><param name="type" value="video/quicktime"><embed src="{path}" height="{height}" width="{width}" autoplay="{autoplay}" type="video/quicktime" pluginspage="http://www.apple.com/quicktime/download/"></embed></object>',iframe_markup:'<iframe src ="{path}" width="{width}" height="{height}" frameborder="no"></iframe>',inline_markup:'<div class="pp_inline">{content}</div>'},s);var o=this,u=false,a,f,l,c,h,p,d=e(window).height(),v=e(window).width(),m;doresize=true,scroll_pos=T();e(window).unbind("resize.prettyphoto").bind("resize.prettyphoto",function(){x();N()});if(s.keyboard_shortcuts){e(document).unbind("keydown.prettyphoto").bind("keydown.prettyphoto",function(t){if(typeof $pp_pic_holder!="undefined"){if($pp_pic_holder.is(":visible")){switch(t.keyCode){case 37:e.prettyPhoto.changePage("previous");t.preventDefault();break;case 39:e.prettyPhoto.changePage("next");t.preventDefault();break;case 27:if(!settings.modal)e.prettyPhoto.close();t.preventDefault();break}}}})}e.prettyPhoto.initialize=function(){settings=s;if(settings.theme=="pp_default")settings.horizontal_padding=16;theRel=e(this).attr(settings.hook);galleryRegExp=/\[(?:.*)\]/;isSet=galleryRegExp.exec(theRel)?true:false;pp_images=isSet?jQuery.map(o,function(t,n){if(e(t).attr(settings.hook).indexOf(theRel)!=-1)return e(t).attr("href")}):e.makeArray(e(this).attr("href"));pp_titles=isSet?jQuery.map(o,function(t,n){if(e(t).attr(settings.hook).indexOf(theRel)!=-1)return e(t).find("img").attr("alt")?e(t).find("img").attr("alt"):""}):e.makeArray(e(this).find("img").attr("alt"));pp_descriptions=isSet?jQuery.map(o,function(t,n){if(e(t).attr(settings.hook).indexOf(theRel)!=-1)return e(t).attr("title")?e(t).attr("title"):""}):e.makeArray(e(this).attr("title"));if(pp_images.length>settings.overlay_gallery_max)settings.overlay_gallery=false;set_position=jQuery.inArray(e(this).attr("href"),pp_images);rel_index=isSet?set_position:e("a["+settings.hook+"^='"+theRel+"']").index(e(this));k(this);if(settings.allow_resize)e(window).bind("scroll.prettyphoto",function(){x()});e.prettyPhoto.open();return false};e.prettyPhoto.open=function(t){if(typeof settings=="undefined"){settings=s;pp_images=e.makeArray(arguments[0]);pp_titles=arguments[1]?e.makeArray(arguments[1]):e.makeArray("");pp_descriptions=arguments[2]?e.makeArray(arguments[2]):e.makeArray("");isSet=pp_images.length>1?true:false;set_position=arguments[3]?arguments[3]:0;k(t.target)}if(settings.hideflash)e("object,embed,iframe[src*=youtube],iframe[src*=vimeo]").css("visibility","hidden");b(e(pp_images).size());e(".pp_loaderIcon").show();if(settings.deeplinking)n();if(settings.social_tools){facebook_like_link=settings.social_tools.replace("{location_href}",encodeURIComponent(location.href));$pp_pic_holder.find(".pp_social").html(facebook_like_link)}if($ppt.is(":hidden"))$ppt.css("opacity",0).show();$pp_overlay.show().fadeTo(settings.animation_speed,settings.opacity);$pp_pic_holder.find(".currentTextHolder").text(set_position+1+settings.counter_separator_label+e(pp_images).size());if(typeof pp_descriptions[set_position]!="undefined"&&pp_descriptions[set_position]!=""){$pp_pic_holder.find(".pp_description").show().html(unescape(pp_descriptions[set_position]))}else{$pp_pic_holder.find(".pp_description").hide()}movie_width=parseFloat(i("width",pp_images[set_position]))?i("width",pp_images[set_position]):settings.default_width.toString();movie_height=parseFloat(i("height",pp_images[set_position]))?i("height",pp_images[set_position]):settings.default_height.toString();u=false;if(movie_height.indexOf("%")!=-1){movie_height=parseFloat(e(window).height()*parseFloat(movie_height)/100-150);u=true}if(movie_width.indexOf("%")!=-1){movie_width=parseFloat(e(window).width()*parseFloat(movie_width)/100-150);u=true}$pp_pic_holder.fadeIn(function(){settings.show_title&&pp_titles[set_position]!=""&&typeof pp_titles[set_position]!="undefined"?$ppt.html(unescape(pp_titles[set_position])):$ppt.html(" ");imgPreloader="";skipInjection=false;switch(S(pp_images[set_position])){case"image":imgPreloader=new Image;nextImage=new Image;if(isSet&&set_position<e(pp_images).size()-1)nextImage.src=pp_images[set_position+1];prevImage=new Image;if(isSet&&pp_images[set_position-1])prevImage.src=pp_images[set_position-1];$pp_pic_holder.find("#pp_full_res")[0].innerHTML=settings.image_markup.replace(/{path}/g,pp_images[set_position]);imgPreloader.onload=function(){a=w(imgPreloader.width,imgPreloader.height);g()};imgPreloader.onerror=function(){alert("Image cannot be loaded. Make sure the path is correct and image exist.");e.prettyPhoto.close()};imgPreloader.src=pp_images[set_position];break;case"youtube":a=w(movie_width,movie_height);movie_id=i("v",pp_images[set_position]);if(movie_id==""){movie_id=pp_images[set_position].split("youtu.be/");movie_id=movie_id[1];if(movie_id.indexOf("?")>0)movie_id=movie_id.substr(0,movie_id.indexOf("?"));if(movie_id.indexOf("&")>0)movie_id=movie_id.substr(0,movie_id.indexOf("&"))}movie="http://www.youtube.com/embed/"+movie_id;i("rel",pp_images[set_position])?movie+="?rel="+i("rel",pp_images[set_position]):movie+="?rel=1";if(settings.autoplay)movie+="&autoplay=1";toInject=settings.iframe_markup.replace(/{width}/g,a["width"]).replace(/{height}/g,a["height"]).replace(/{wmode}/g,settings.wmode).replace(/{path}/g,movie);break;case"vimeo":a=w(movie_width,movie_height);movie_id=pp_images[set_position];var t=/http(s?):\/\/(www\.)?vimeo.com\/(\d+)/;var n=movie_id.match(t);movie="http://player.vimeo.com/video/"+n[3]+"?title=0&byline=0&portrait=0";if(settings.autoplay)movie+="&autoplay=1;";vimeo_width=a["width"]+"/embed/?moog_width="+a["width"];toInject=settings.iframe_markup.replace(/{width}/g,vimeo_width).replace(/{height}/g,a["height"]).replace(/{path}/g,movie);break;case"quicktime":a=w(movie_width,movie_height);a["height"]+=15;a["contentHeight"]+=15;a["containerHeight"]+=15;toInject=settings.quicktime_markup.replace(/{width}/g,a["width"]).replace(/{height}/g,a["height"]).replace(/{wmode}/g,settings.wmode).replace(/{path}/g,pp_images[set_position]).replace(/{autoplay}/g,settings.autoplay);break;case"flash":a=w(movie_width,movie_height);flash_vars=pp_images[set_position];flash_vars=flash_vars.substring(pp_images[set_position].indexOf("flashvars")+10,pp_images[set_position].length);filename=pp_images[set_position];filename=filename.substring(0,filename.indexOf("?"));toInject=settings.flash_markup.replace(/{width}/g,a["width"]).replace(/{height}/g,a["height"]).replace(/{wmode}/g,settings.wmode).replace(/{path}/g,filename+"?"+flash_vars);break;case"iframe":a=w(movie_width,movie_height);frame_url=pp_images[set_position];frame_url=frame_url.substr(0,frame_url.indexOf("iframe")-1);toInject=settings.iframe_markup.replace(/{width}/g,a["width"]).replace(/{height}/g,a["height"]).replace(/{path}/g,frame_url);break;case"ajax":doresize=false;a=w(movie_width,movie_height);doresize=true;skipInjection=true;e.get(pp_images[set_position],function(e){toInject=settings.inline_markup.replace(/{content}/g,e);$pp_pic_holder.find("#pp_full_res")[0].innerHTML=toInject;g()});break;case"custom":a=w(movie_width,movie_height);toInject=settings.custom_markup;break;case"inline":myClone=e(pp_images[set_position]).clone().append('<br clear="all" />').css({width:settings.default_width}).wrapInner('<div id="pp_full_res"><div class="pp_inline"></div></div>').appendTo(e("body")).show();doresize=false;a=w(e(myClone).width(),e(myClone).height());doresize=true;e(myClone).remove();toInject=settings.inline_markup.replace(/{content}/g,e(pp_images[set_position]).html());break}if(!imgPreloader&&!skipInjection){$pp_pic_holder.find("#pp_full_res")[0].innerHTML=toInject;g()}});return false};e.prettyPhoto.changePage=function(t){currentGalleryPage=0;if(t=="previous"){set_position--;if(set_position<0)set_position=e(pp_images).size()-1}else if(t=="next"){set_position++;if(set_position>e(pp_images).size()-1)set_position=0}else{set_position=t}rel_index=set_position;if(!doresize)doresize=true;if(settings.allow_expand){e(".pp_contract").removeClass("pp_contract").addClass("pp_expand")}y(function(){e.prettyPhoto.open()})};e.prettyPhoto.changeGalleryPage=function(e){if(e=="next"){currentGalleryPage++;if(currentGalleryPage>totalPage)currentGalleryPage=0}else if(e=="previous"){currentGalleryPage--;if(currentGalleryPage<0)currentGalleryPage=totalPage}else{currentGalleryPage=e}slide_speed=e=="next"||e=="previous"?settings.animation_speed:0;slide_to=currentGalleryPage*itemsPerPage*itemWidth;$pp_gallery.find("ul").animate({left:-slide_to},slide_speed)};e.prettyPhoto.startSlideshow=function(){if(typeof m=="undefined"){$pp_pic_holder.find(".pp_play").unbind("click").removeClass("pp_play").addClass("pp_pause").click(function(){e.prettyPhoto.stopSlideshow();return false});m=setInterval(e.prettyPhoto.startSlideshow,settings.slideshow)}else{e.prettyPhoto.changePage("next")}};e.prettyPhoto.stopSlideshow=function(){$pp_pic_holder.find(".pp_pause").unbind("click").removeClass("pp_pause").addClass("pp_play").click(function(){e.prettyPhoto.startSlideshow();return false});clearInterval(m);m=undefined};e.prettyPhoto.close=function(){if($pp_overlay.is(":animated"))return;e.prettyPhoto.stopSlideshow();$pp_pic_holder.stop().find("object,embed").css("visibility","hidden");e("div.pp_pic_holder,div.ppt,.pp_fade").fadeOut(settings.animation_speed,function(){e(this).remove()});$pp_overlay.fadeOut(settings.animation_speed,function(){if(settings.hideflash)e("object,embed,iframe[src*=youtube],iframe[src*=vimeo]").css("visibility","visible");e(this).remove();e(window).unbind("scroll.prettyphoto");r();settings.callback();doresize=true;f=false;delete settings})};if(!pp_alreadyInitialized&&t()){pp_alreadyInitialized=true;hashIndex=t();hashRel=hashIndex;hashIndex=hashIndex.substring(hashIndex.indexOf("/")+1,hashIndex.length-1);hashRel=hashRel.substring(0,hashRel.indexOf("/"));setTimeout(function(){e("a["+s.hook+"^='"+hashRel+"']:eq("+hashIndex+")").trigger("click")},50)}return this.unbind("click.prettyphoto").bind("click.prettyphoto",e.prettyPhoto.initialize)};})(jQuery);var pp_alreadyInitialized=false \ No newline at end of file
diff --git a/library/tinymce/jscripts/tiny_mce/plugins/bbcode/editor_plugin.js b/library/tinymce/jscripts/tiny_mce/plugins/bbcode/editor_plugin.js
index 8f8821fd6..81b69e736 100644
--- a/library/tinymce/jscripts/tiny_mce/plugins/bbcode/editor_plugin.js
+++ b/library/tinymce/jscripts/tiny_mce/plugins/bbcode/editor_plugin.js
@@ -1 +1 @@
-(function(){tinymce.create("tinymce.plugins.BBCodePlugin",{init:function(a,b){var d=this,c=a.getParam("bbcode_dialect","punbb").toLowerCase();a.onBeforeSetContent.add(function(e,f){f.content=d["_"+c+"_bbcode2html"](f.content)});a.onPostProcess.add(function(e,f){if(f.set){f.content=d["_"+c+"_bbcode2html"](f.content)}if(f.get){f.content=d["_"+c+"_html2bbcode"](f.content)}})},getInfo:function(){return{longname:"BBCode Plugin",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/bbcode",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_punbb_html2bbcode:function(a){a=tinymce.trim(a);function b(c,d){a=a.replace(c,d)}b(/<a.*?href=\"(.*?)\".*?>(.*?)<\/a>/gi,"[url=$1]$2[/url]");b(/<font.*?color=\"(.*?)\".*?class=\"codeStyle\".*?>(.*?)<\/font>/gi,"[code][color=$1]$2[/color][/code]");b(/<font.*?color=\"(.*?)\".*?class=\"quoteStyle\".*?>(.*?)<\/font>/gi,"[quote][color=$1]$2[/color][/quote]");b(/<font.*?class=\"codeStyle\".*?color=\"(.*?)\".*?>(.*?)<\/font>/gi,"[code][color=$1]$2[/color][/code]");b(/<font.*?class=\"quoteStyle\".*?color=\"(.*?)\".*?>(.*?)<\/font>/gi,"[quote][color=$1]$2[/color][/quote]");b(/<span style=\"color: ?(.*?);\">(.*?)<\/span>/gi,"[color=$1]$2[/color]");b(/<font.*?color=\"(.*?)\".*?>(.*?)<\/font>/gi,"[color=$1]$2[/color]");b(/<span style=\"font-size:(.*?);\">(.*?)<\/span>/gi,"[size=$1]$2[/size]");b(/<font>(.*?)<\/font>/gi,"$1");b(/<img.*?src=\"(.*?)\".*?\/>/gi,"[img]$1[/img]");b(/<span class=\"codeStyle\">(.*?)<\/span>/gi,"[code]$1[/code]");b(/<span class=\"quoteStyle\">(.*?)<\/span>/gi,"[quote]$1[/quote]");b(/<strong class=\"codeStyle\">(.*?)<\/strong>/gi,"[code][b]$1[/b][/code]");b(/<strong class=\"quoteStyle\">(.*?)<\/strong>/gi,"[quote][b]$1[/b][/quote]");b(/<em class=\"codeStyle\">(.*?)<\/em>/gi,"[code][i]$1[/i][/code]");b(/<em class=\"quoteStyle\">(.*?)<\/em>/gi,"[quote][i]$1[/i][/quote]");b(/<u class=\"codeStyle\">(.*?)<\/u>/gi,"[code][u]$1[/u][/code]");b(/<u class=\"quoteStyle\">(.*?)<\/u>/gi,"[quote][u]$1[/u][/quote]");b(/<\/(strong|b)>/gi,"[/b]");b(/<(strong|b)>/gi,"[b]");b(/<\/(em|i)>/gi,"[/i]");b(/<(em|i)>/gi,"[i]");b(/<\/u>/gi,"[/u]");b(/<span style=\"text-decoration: ?underline;\">(.*?)<\/span>/gi,"[u]$1[/u]");b(/<u>/gi,"[u]");b(/<blockquote[^>]*>/gi,"[quote]");b(/<\/blockquote>/gi,"[/quote]");b(/<br \/>/gi,"\n");b(/<br\/>/gi,"\n");b(/<br>/gi,"\n");b(/<p>/gi,"");b(/<\/p>/gi,"\n");b(/&nbsp;|\u00a0/gi," ");b(/&quot;/gi,'"');b(/&lt;/gi,"<");b(/&gt;/gi,">");b(/&amp;/gi,"&");return a},_punbb_bbcode2html:function(a){a=tinymce.trim(a);function b(c,d){a=a.replace(c,d)}b(/\n/gi,"<br />");b(/\[b\]/gi,"<strong>");b(/\[\/b\]/gi,"</strong>");b(/\[i\]/gi,"<em>");b(/\[\/i\]/gi,"</em>");b(/\[u\]/gi,"<u>");b(/\[\/u\]/gi,"</u>");b(/\[url=([^\]]+)\](.*?)\[\/url\]/gi,'<a href="$1">$2</a>');b(/\[url\](.*?)\[\/url\]/gi,'<a href="$1">$1</a>');b(/\[img\](.*?)\[\/img\]/gi,'<img src="$1" />');b(/\[color=(.*?)\](.*?)\[\/color\]/gi,'<font color="$1">$2</font>');b(/\[code\](.*?)\[\/code\]/gi,'<span class="codeStyle">$1</span>&nbsp;');b(/\[quote.*?\](.*?)\[\/quote\]/gi,'<span class="quoteStyle">$1</span>&nbsp;');return a}});tinymce.PluginManager.add("bbcode",tinymce.plugins.BBCodePlugin)})(); \ No newline at end of file
+(function(){tinymce.create("tinymce.plugins.BBCodePlugin",{init:function(e,t){var n=this,r=e.getParam("bbcode_dialect","dfrn").toLowerCase();e.onBeforeSetContent.add(function(e,t){t.content=n["_"+r+"_bbcode2html"](t.content)});e.onPostProcess.add(function(e,t){if(t.set)t.content=n["_"+r+"_bbcode2html"](t.content);if(t.get)t.content=n["_"+r+"_html2bbcode"](t.content)})},getInfo:function(){return{longname:"BBCode Plugin",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/bbcode",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_dfrn_html2bbcode:function(e){function t(t,n){e=e.replace(t,n)}function n(e){var t,n,r=[],i=[];var s=/<span [^>]*class *= *[\"'](?:[^\"']* )*oembed(?: [^\"']*)*[\"'][^>]*>(.*?(?:<span[^>]*>(.*?)<\/span *>)*.*?)<\/span *>/ig;while(t=s.exec(e)){var o=/<a([^>]* rel=[\"']oembed[\"'][^>]*)>.*?<\/a *>/ig;if(n=o.exec(t[1])){var u=/href=[\"']([^\"']*)[\"']/ig;var a=u.exec(n[1]);if(a[1]){r.push(t[0]);i.push("[EMBED]"+a[1]+"[/EMBED]")}}}for(var f=0;f<r.length;f++)e=e.replace(r[f],i[f]);return e}e=tinymce.trim(e);if(e.indexOf('class="oembed')>=0){e=n(e)}t(/<a.*?href=\"(.*?)\".*?>(.*?)<\/a>/gi,"[url=$1]$2[/url]");t(/<span style=\"font-size:(.*?);\">(.*?)<\/span>/gi,"[size=$1]$2[/size]");t(/<span style=\"color:(.*?);\">(.*?)<\/span>/gi,"[color=$1]$2[/color]");t(/<font>(.*?)<\/font>/gi,"$1");t(/<img.*?width=\"(.*?)\".*?height=\"(.*?)\".*?src=\"(.*?)\".*?\/>/gi,"[img=$1x$2]$3[/img]");t(/<img.*?height=\"(.*?)\".*?width=\"(.*?)\".*?src=\"(.*?)\".*?\/>/gi,"[img=$2x$1]$3[/img]");t(/<img.*?src=\"(.*?)\".*?height=\"(.*?)\".*?width=\"(.*?)\".*?\/>/gi,"[img=$3x$2]$1[/img]");t(/<img.*?src=\"(.*?)\".*?width=\"(.*?)\".*?height=\"(.*?)\".*?\/>/gi,"[img=$2x$3]$1[/img]");t(/<img.*?src=\"(.*?)\".*?\/>/gi,"[img]$1[/img]");t(/<ul class=\"listbullet\" style=\"list-style-type\: circle\;\">(.*?)<\/ul>/gi,"[list]$1[/list]");t(/<ul class=\"listnone\" style=\"list-style-type\: none\;\">(.*?)<\/ul>/gi,"[list=]$1[/list]");t(/<ul class=\"listdecimal\" style=\"list-style-type\: decimal\;\">(.*?)<\/ul>/gi,"[list=1]$1[/list]");t(/<ul class=\"listlowerroman\" style=\"list-style-type\: lower-roman\;\">(.*?)<\/ul>/gi,"[list=i]$1[/list]");t(/<ul class=\"listupperroman\" style=\"list-style-type\: upper-roman\;\">(.*?)<\/ul>/gi,"[list=I]$1[/list]");t(/<ul class=\"listloweralpha\" style=\"list-style-type\: lower-alpha\;\">(.*?)<\/ul>/gi,"[list=a]$1[/list]");t(/<ul class=\"listupperalpha\" style=\"list-style-type\: upper-alpha\;\">(.*?)<\/ul>/gi,"[list=A]$1[/list]");t(/<li>(.*?)<\/li>/gi,"[li]$1[/li]");t(/<code>(.*?)<\/code>/gi,"[code]$1[/code]");t(/<\/(strong|b)>/gi,"[/b]");t(/<(strong|b)>/gi,"[b]");t(/<\/(em|i)>/gi,"[/i]");t(/<(em|i)>/gi,"[i]");t(/<\/u>/gi,"[/u]");t(/<span style=\"text-decoration: ?underline;\">(.*?)<\/span>/gi,"[u]$1[/u]");t(/<u>/gi,"[u]");t(/<blockquote[^>]*>/gi,"[quote]");t(/<\/blockquote>/gi,"[/quote]");t(/<hr \/>/gi,"[hr]");t(/<br (.*?)\/>/gi,"\n");t(/<br\/>/gi,"\n");t(/<br>/gi,"\n");t(/<p>/gi,"");t(/<\/p>/gi,"\n");t(/&nbsp;/gi," ");t(/&quot;/gi,'"');t(/&lt;/gi,"<");t(/&gt;/gi,">");t(/&/gi,"&");return e},_dfrn_bbcode2html:function(e){function t(t,n){var r=new Array;var i=e.split("[code]");var o=0;var u="";u=i.shift();u=u.replace(t,n);r.push(u);for(o=0;o<i.length;o++){var a=new Array;var f=i.shift();var l=f.split("[/code]");a.push(l.shift());u=l.shift();u=u.replace(t,n);a.push(u);r.push(a.join("[/code]"))}e=r.join("[code]")}function n(e,t){function n(t){e=t}t=bin2hex(t);$.ajax({url:"oembed/b2h?url="+t,async:false,success:n,dataType:"html"});return e}e=tinymce.trim(e);t(/\n/gi,"<br />");t(/\[b\]/gi,"<strong>");t(/\[\/b\]/gi,"</strong>");t(/\[i\]/gi,"<em>");t(/\[\/i\]/gi,"</em>");t(/\[u\]/gi,"<u>");t(/\[\/u\]/gi,"</u>");t(/\[hr\]/gi,"<hr />");t(/\[url=([^\]]+)\](.*?)\[\/url\]/gi,'<a href="$1">$2</a>');t(/\[url\](.*?)\[\/url\]/gi,'<a href="$1">$1</a>');t(/\[img=(.*?)x(.*?)\](.*?)\[\/img\]/gi,'<img width="$1" height="$2" src="$3" />');t(/\[img\](.*?)\[\/img\]/gi,'<img src="$1" />');t(/\[list\](.*?)\[\/list\]/gi,'<ul class="listbullet" style="list-style-type: circle;">$1</ul>');t(/\[list=\](.*?)\[\/list\]/gi,'<ul class="listnone" style="list-style-type: none;">$1</ul>');t(/\[list=1\](.*?)\[\/list\]/gi,'<ul class="listdecimal" style="list-style-type: decimal;">$1</ul>');t(/\[list=i\](.*?)\[\/list\]/gi,'<ul class="listlowerroman" style="list-style-type: lower-roman;">$1</ul>');t(/\[list=I\](.*?)\[\/list\]/gi,'<ul class="listupperroman" style="list-style-type: upper-roman;">$1</ul>');t(/\[list=a\](.*?)\[\/list\]/gi,'<ul class="listloweralpha" style="list-style-type: lower-alpha;">$1</ul>');t(/\[list=A\](.*?)\[\/list\]/gi,'<ul class="listupperalpha" style="list-style-type: upper-alpha;">$1</ul>');t(/\[li\](.*?)\[\/li\]/gi,"<li>$1</li>");t(/\[color=(.*?)\](.*?)\[\/color\]/gi,'<span style="color: $1;">$2</span>');t(/\[size=(.*?)\](.*?)\[\/size\]/gi,'<span style="font-size: $1;">$2</span>');t(/\[code\](.*?)\[\/code\]/gi,"<code>$1</code>");t(/\[quote.*?\](.*?)\[\/quote\]/gi,"<blockquote>$1</blockquote>");e=e.replace(/\[embed\](.*?)\[\/embed\]/gi,n);return e}});tinymce.PluginManager.add("bbcode",tinymce.plugins.BBCodePlugin)})()
diff --git a/library/tinymce/jscripts/tiny_mce/plugins/bbcode/editor_plugin_src.js b/library/tinymce/jscripts/tiny_mce/plugins/bbcode/editor_plugin_src.js
index f94fbc5d7..387ccdd59 100644
--- a/library/tinymce/jscripts/tiny_mce/plugins/bbcode/editor_plugin_src.js
+++ b/library/tinymce/jscripts/tiny_mce/plugins/bbcode/editor_plugin_src.js
@@ -45,63 +45,12 @@
s = tinymce.trim(s);
function rep(re, str) {
-
-
-s = s.replace(re,str);
-
- //modify code to keep stuff intact within [code][/code] blocks
- //Waitman Gobble NO WARRANTY
-
-/* This doesn't seem to work well with
-[code]line1
-line2[/code]
-commenting out for now
-*/
-
-/*
- var o = new Array();
- var x = s.split("[code]");
- var i = 0;
-
- var si = "";
- si = x.shift();
- si = si.replace(re,str);
- o.push(si);
-
- for (i = 0; i < x.length; i++) {
- var no = new Array();
- var j = x.shift();
- var g = j.split("[/code]");
- no.push(g.shift());
- si = g.shift();
- si = si.replace(re,str);
- no.push(si);
- o.push(no.join("[/code]"));
- }
-
- s = o.join("[code]");
-*/
+ s = s.replace(re,str);
};
-
-
/* oembed */
function _h2b_cb(match) {
- /*
- function s_h2b(data) {
- match = data;
- }
- $.ajax({
- type:"POST",
- url: 'oembed/h2b',
- data: {text: match},
- async: false,
- success: s_h2b,
- dataType: 'html'
- });
- */
-
var f, g, tof = [], tor = [];
var find_spanc = /<span [^>]*class *= *[\"'](?:[^\"']* )*oembed(?: [^\"']*)*[\"'][^>]*>(.*?(?:<span[^>]*>(.*?)<\/span *>)*.*?)<\/span *>/ig;
while (f = find_spanc.exec(match)) {
@@ -124,11 +73,8 @@ commenting out for now
s = _h2b_cb(s);
}
- /* /oembed */
-
-
// example: <strong> to [b]
- rep(/<a class=\"bookmark\" href=\"(.*?)\".*?>(.*?)<\/a>/gi,"[bookmark=$1]$2[/bookmark]");
+
rep(/<a.*?href=\"(.*?)\".*?>(.*?)<\/a>/gi,"[url=$1]$2[/url]");
rep(/<span style=\"font-size:(.*?);\">(.*?)<\/span>/gi,"[size=$1]$2[/size]");
rep(/<span style=\"color:(.*?);\">(.*?)<\/span>/gi,"[color=$1]$2[/color]");
@@ -222,7 +168,6 @@ commenting out for now
rep(/\[u\]/gi,"<u>");
rep(/\[\/u\]/gi,"</u>");
rep(/\[hr\]/gi,"<hr />");
- rep(/\[bookmark=([^\]]+)\](.*?)\[\/bookmark\]/gi,"<a class=\"bookmark\" href=\"$1\">$2</a>");
rep(/\[url=([^\]]+)\](.*?)\[\/url\]/gi,"<a href=\"$1\">$2</a>");
rep(/\[url\](.*?)\[\/url\]/gi,"<a href=\"$1\">$1</a>");
rep(/\[img=(.*?)x(.*?)\](.*?)\[\/img\]/gi,"<img width=\"$1\" height=\"$2\" src=\"$3\" />");
diff --git a/mod/_well_known.php b/mod/_well_known.php
index 5c5f6585f..6e77336c3 100644
--- a/mod/_well_known.php
+++ b/mod/_well_known.php
@@ -4,11 +4,6 @@ function _well_known_init(&$a){
if(argc() > 1) {
switch(argv(1)) {
- case "host-meta":
- require_once('mod/hostxrd.php');
- hostxrd_init($a);
- break;
-
case 'zot-info':
$a->argc -= 1;
array_shift($a->argv);
@@ -17,6 +12,14 @@ function _well_known_init(&$a){
zfinger_init($a);
break;
+ case 'webfinger':
+ $a->argc -= 1;
+ array_shift($a->argv);
+ $a->argv[0] = 'wfinger';
+ require_once('mod/wfinger.php');
+ wfinger_init($a);
+ break;
+
}
}
diff --git a/mod/achievements.php b/mod/achievements.php
new file mode 100644
index 000000000..1910def73
--- /dev/null
+++ b/mod/achievements.php
@@ -0,0 +1,84 @@
+<?php
+
+function achievements_content(&$a) {
+
+ if(argc() > 1)
+ $which = argv(1);
+ else {
+ notice( t('Requested profile is not available.') . EOL );
+ return;
+}
+
+ $profile = 0;
+ $profile = argv(1);
+ profile_load($a,$which,$profile);
+
+ $r = q("select channel_id from channel where channel_address = '%s'",
+ dbesc($which)
+ );
+ if($r) {
+ $owner = intval($r[0]['channel_id']);
+ }
+
+ $observer = $a->get_observer();
+ $ob_hash = (($observer) ? $observer['xchan_hash'] : '');
+ $perms = get_all_perms($owner,$ob_hash);
+ if(! $perms['view_profile']) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+// By default, all badges are false
+ $contactbadge = false;
+ $profilebadge = false;
+ $keywordsbadge = false;
+
+// Check number of contacts. Award a badge if over 10
+// We'll figure these out on each page load instead of
+// writing them to the DB because that will mean one needs
+// to retain their achievements - eg, you can't add
+// a bunch of channels just to get your badge, and then
+// delete them all again. If these become popular or
+// used in profiles or something, we may need to reconsider
+// and add a table for this - because this won't scale.
+
+ $r = q("select * from abook where abook_channel = %d",
+ intval($owner)
+ );
+
+ if (count($r))
+ $contacts = count($r);
+ // We're checking for 11 to adjust for the abook record for self
+ if ($contacts >= 11)
+ $contactbadge = true;
+
+// Check if an about field in the profile has been created.
+
+ $r = q("select * from profile where uid = %d and about <> ''",
+ intval($owner)
+ );
+
+ if ($r)
+ $profilebadge = 1;
+
+// Check if keywords have been set
+
+ $r = q("select * from profile where uid = %d and keywords <> ''",
+ intval($owner)
+ );
+
+ if($r)
+ $keywordsbadge = 1;
+
+// FIXME - stick ths in a template, and make it look pretty.
+ $o .= "Template not implemented";
+ $o .= "If this is one, you get the profile badge" . $profilebadge . "<br>";
+ $o .= "If this is one, you get the contact badge" . $contactbadge . "<br>";
+ $o .= "If this is one you get the keywords badge" . $keywordsbadge . "<br>";
+ $o .= "I haven't done the top level posts badge yet" . $toplevelpostsbadge . "<br>";
+ $o .= "I haven't done the number of channels badge yet" . $channelsbadge;
+
+
+return $o;
+
+}
diff --git a/mod/acl.php b/mod/acl.php
index 2f1866f85..ed9e935e9 100644
--- a/mod/acl.php
+++ b/mod/acl.php
@@ -39,7 +39,7 @@ function acl_init(&$a){
// count groups and contacts
if ($type=='' || $type=='g'){
- $r = q("SELECT COUNT(`id`) AS g FROM `group` WHERE `deleted` = 0 AND `uid` = %d $sql_extra",
+ $r = q("SELECT COUNT(`id`) AS g FROM `groups` WHERE `deleted` = 0 AND `uid` = %d $sql_extra",
intval(local_user())
);
$group_count = (int)$r[0]['g'];
@@ -49,9 +49,10 @@ function acl_init(&$a){
if ($type=='' || $type=='c'){
$r = q("SELECT COUNT(abook_id) AS c FROM abook left join xchan on abook_xchan = xchan_hash
- WHERE abook_channel = %d AND not ( abook_flags & %d ) $sql_extra2" ,
+ WHERE abook_channel = %d AND not ( abook_flags & %d ) and not (xchan_flags & %d ) $sql_extra2" ,
intval(local_user()),
- intval(ABOOK_FLAG_SELF|ABOOK_FLAG_BLOCKED|ABOOK_FLAG_PENDING|ABOOK_FLAG_ARCHIVE)
+ intval(ABOOK_FLAG_BLOCKED|ABOOK_FLAG_PENDING|ABOOK_FLAG_ARCHIVED),
+ intval(XCHAN_FLAGS_DELETED)
);
$contact_count = (int)$r[0]['c'];
}
@@ -60,26 +61,29 @@ function acl_init(&$a){
// autocomplete for Private Messages
- $r = q("SELECT COUNT(`id`) AS c FROM `contact`
- WHERE `uid` = %d AND `self` = 0
- AND `blocked` = 0 AND `pending` = 0 AND `archive` = 0
- AND `network` IN ('%s','%s','%s') $sql_extra2" ,
+
+ $r = q("SELECT count(xchan_hash) as c
+ FROM abook left join xchan on abook_xchan = xchan_hash
+ WHERE abook_channel = %d and ( (abook_their_perms = null) or (abook_their_perms & %d ))
+ and not ( xchan_flags & %d )
+ $sql_extra2 ",
intval(local_user()),
- dbesc(NETWORK_DFRN),
- dbesc(NETWORK_ZOT),
- dbesc(NETWORK_DIASPORA)
+ intval(PERMS_W_MAIL),
+ intval(XCHAN_FLAGS_DELETED)
);
- $contact_count = (int)$r[0]['c'];
+
+ if($r)
+ $contact_count = (int)$r[0]['c'];
}
elseif ($type == 'a') {
// autocomplete for Contacts
- $r = q("SELECT COUNT(`id`) AS c FROM `contact`
- WHERE `uid` = %d AND `self` = 0
- AND `pending` = 0 $sql_extra2" ,
- intval(local_user())
+ $r = q("SELECT COUNT(abook_id) AS c FROM abook left join xchan on abook_xchan = xchan_hash
+ WHERE abook_channel = %d and not ( xchan_flags & %d ) $sql_extra2" ,
+ intval(local_user()),
+ intval(XCHAN_FLAGS_DELETED)
);
$contact_count = (int)$r[0]['c'];
@@ -94,14 +98,14 @@ function acl_init(&$a){
if ($type=='' || $type=='g'){
- $r = q("SELECT `group`.`id`, `group`.`hash`, `group`.`name`,
+ $r = q("SELECT `groups`.`id`, `groups`.`hash`, `groups`.`name`,
GROUP_CONCAT(DISTINCT `group_member`.`xchan` SEPARATOR ',') as uids
- FROM `group`,`group_member`
- WHERE `group`.`deleted` = 0 AND `group`.`uid` = %d
- AND `group_member`.`gid`=`group`.`id`
+ FROM `groups`,`group_member`
+ WHERE `groups`.`deleted` = 0 AND `groups`.`uid` = %d
+ AND `group_member`.`gid`=`groups`.`id`
$sql_extra
- GROUP BY `group`.`id`
- ORDER BY `group`.`name`
+ GROUP BY `groups`.`id`
+ ORDER BY `groups`.`name`
LIMIT %d,%d",
intval(local_user()),
intval($start),
@@ -121,32 +125,39 @@ function acl_init(&$a){
);
}
}
-
+
if ($type=='' || $type=='c') {
- $r = q("SELECT abook_id as id, xchan_hash as hash, xchan_name as name, xchan_photo_s as micro, xchan_url as url, xchan_addr as nick
+ $r = q("SELECT abook_id as id, xchan_hash as hash, xchan_name as name, xchan_photo_s as micro, xchan_url as url, xchan_addr as nick, abook_their_perms, abook_flags
FROM abook left join xchan on abook_xchan = xchan_hash
- WHERE abook_channel = %d AND not ( abook_flags & %d ) $sql_extra2 order by xchan_name asc" ,
+ WHERE abook_channel = %d AND not ( abook_flags & %d ) and not (xchan_flags & %d ) $sql_extra2 order by xchan_name asc" ,
intval(local_user()),
- intval(ABOOK_FLAG_SELF|ABOOK_FLAG_BLOCKED|ABOOK_FLAG_PENDING|ABOOK_FLAG_ARCHIVE)
+ intval(ABOOK_FLAG_BLOCKED|ABOOK_FLAG_PENDING|ABOOK_FLAG_ARCHIVED),
+ intval(XCHAN_FLAGS_DELETED)
);
+
}
elseif($type == 'm') {
$r = q("SELECT xchan_hash as id, xchan_name as name, xchan_addr as nick, xchan_photo_s as micro, xchan_url as url
FROM abook left join xchan on abook_xchan = xchan_hash
WHERE abook_channel = %d and ( (abook_their_perms = null) or (abook_their_perms & %d ))
+ and not (xchan_flags & %d)
$sql_extra3
ORDER BY `xchan_name` ASC ",
intval(local_user()),
- intval(PERMS_W_MAIL)
+ intval(PERMS_W_MAIL),
+ intval(XCHAN_FLAGS_DELETED)
);
}
elseif($type == 'a') {
- $r = q("SELECT abook_id as id, xchan_name as name, xchan_addr as nick, xchan_photo_s as micro, xchan_network as network, xchan_url as url, xchan_addr as attag FROM abook left join xchan on abook_xchan = xchan_hash
+ $r = q("SELECT abook_id as id, xchan_name as name, xchan_hash as hash, xchan_addr as nick, xchan_photo_s as micro, xchan_network as network, xchan_url as url, xchan_addr as attag , abook_their_perms FROM abook left join xchan on abook_xchan = xchan_hash
WHERE abook_channel = %d
+ and not (xchan_flags & %d)
$sql_extra3
ORDER BY xchan_name ASC ",
- intval(local_user())
+ intval(local_user()),
+ intval(XCHAN_FLAGS_DELETED)
+
);
}
elseif($type == 'x') {
@@ -196,13 +207,15 @@ function acl_init(&$a){
if(count($r)) {
foreach($r as $g){
$contacts[] = array(
- "type" => "c",
- "photo" => $g['micro'],
- "name" => $g['name'],
- "id" => $g['id'],
- "xid" => $g['hash'],
- "link" => $g['nick'],
- "nick" => substr($g['nick'],0,strpos($g['nick'],'@'))
+ "type" => "c",
+ "photo" => $g['micro'],
+ "name" => $g['name'],
+ "id" => $g['id'],
+ "xid" => $g['hash'],
+ "link" => $g['nick'],
+ "nick" => substr($g['nick'],0,strpos($g['nick'],'@')),
+ "self" => (($g['abook_flags'] & ABOOK_FLAG_SELF) ? 'abook-self' : ''),
+ "taggable" => (($g['abook_their_perms'] & PERMS_W_TAGWALL) ? 'taggable' : '')
);
}
}
@@ -226,6 +239,10 @@ function navbar_complete(&$a) {
// logger('navbar_complete');
+ if((get_config('system','block_public')) && (! local_user()) && (! remote_user())) {
+ return;
+ }
+
$dirmode = intval(get_config('system','directory_mode'));
$search = ((x($_REQUEST,'query')) ? htmlentities($_REQUEST['query'],ENT_COMPAT,'UTF-8',false) : '');
if(! $search || mb_strlen($search) < 2)
@@ -251,10 +268,11 @@ function navbar_complete(&$a) {
}
if(! $url) {
+ require_once("include/dir_fns.php");
$directory = find_upstream_directory($dirmode);
if($directory) {
- $url = $directory['url'];
+ $url = $directory['url'] . '/dirsearch';
}
else {
$url = DIRECTORY_FALLBACK_MASTER . '/dirsearch';
@@ -275,4 +293,4 @@ function navbar_complete(&$a) {
}
}
return array();
-} \ No newline at end of file
+}
diff --git a/mod/admin.php b/mod/admin.php
index aa3d7b294..91dd0b56e 100644
--- a/mod/admin.php
+++ b/mod/admin.php
@@ -1,7 +1,7 @@
<?php
/**
- * Friendica admin
+ * Red admin
*/
@@ -49,11 +49,15 @@ function admin_post(&$a){
if(is_ajax()) return;
goaway($a->get_baseurl(true) . '/admin/themes/' . $theme );
+
return;
break;
case 'logs':
admin_page_logs_post($a);
break;
+ case 'hubloc':
+ admin_page_hubloc_post($a);
+ break;
case 'dbsync':
admin_page_dbsync_post($a);
break;
@@ -84,6 +88,7 @@ function admin_content(&$a) {
'users' => Array($a->get_baseurl(true)."/admin/users/", t("Users") , "users"),
'plugins'=> Array($a->get_baseurl(true)."/admin/plugins/", t("Plugins") , "plugins"),
'themes' => Array($a->get_baseurl(true)."/admin/themes/", t("Themes") , "themes"),
+ 'hubloc' => Array($a->get_baseurl(true)."/admin/hubloc/", t("Server") , "server"),
'dbsync' => Array($a->get_baseurl(true)."/admin/dbsync/", t('DB updates'), "dbsync")
);
@@ -132,6 +137,9 @@ function admin_content(&$a) {
case 'themes':
$o = admin_page_themes($a);
break;
+ case 'hubloc':
+ $o = admin_page_hubloc($a);
+ break;
case 'logs':
$o = admin_page_logs($a);
break;
@@ -188,7 +196,7 @@ function admin_page_summary(&$a) {
'$users' => Array( t('Registered users'), $users),
'$accounts' => $accounts,
'$pending' => Array( t('Pending registrations'), $pending),
- '$version' => Array( t('Version'), FRIENDICA_VERSION),
+ '$version' => Array( t('Version'), RED_VERSION),
'$build' => get_config('system','db_version'),
'$plugins' => Array( t('Active plugins'), $a->plugins )
));
@@ -210,10 +218,14 @@ function admin_page_site_post(&$a){
$banner = ((x($_POST,'banner')) ? trim($_POST['banner']) : false);
$language = ((x($_POST,'language')) ? notags(trim($_POST['language'])) : '');
$theme = ((x($_POST,'theme')) ? notags(trim($_POST['theme'])) : '');
+ $theme_mobile = ((x($_POST,'theme_mobile')) ? notags(trim($_POST['theme_mobile'])) : '');
+ $theme_accessibility = ((x($_POST,'theme_accessibility')) ? notags(trim($_POST['theme_accessibility'])) : '');
+ $site_channel = ((x($_POST,'site_channel')) ? notags(trim($_POST['site_channel'])) : '');
$maximagesize = ((x($_POST,'maximagesize')) ? intval(trim($_POST['maximagesize'])) : 0);
$register_policy = ((x($_POST,'register_policy')) ? intval(trim($_POST['register_policy'])) : 0);
+ $access_policy = ((x($_POST,'access_policy')) ? intval(trim($_POST['access_policy'])) : 0);
$abandon_days = ((x($_POST,'abandon_days')) ? intval(trim($_POST['abandon_days'])) : 0);
$register_text = ((x($_POST,'register_text')) ? notags(trim($_POST['register_text'])) : '');
@@ -222,6 +234,7 @@ function admin_page_site_post(&$a){
$allowed_email = ((x($_POST,'allowed_email')) ? notags(trim($_POST['allowed_email'])) : '');
$block_public = ((x($_POST,'block_public')) ? True : False);
$force_publish = ((x($_POST,'publish_all')) ? True : False);
+ $no_login_on_homepage = ((x($_POST,'no_login_on_homepage')) ? True : False);
$global_directory = ((x($_POST,'directory_submit_url')) ? notags(trim($_POST['directory_submit_url'])) : '');
$no_community_page = !((x($_POST,'no_community_page')) ? True : False);
@@ -231,7 +244,7 @@ function admin_page_site_post(&$a){
$timeout = ((x($_POST,'timeout')) ? intval(trim($_POST['timeout'])) : 60);
$delivery_interval = ((x($_POST,'delivery_interval'))? intval(trim($_POST['delivery_interval'])) : 0);
$poll_interval = ((x($_POST,'poll_interval'))? intval(trim($_POST['poll_interval'])) : 0);
- $ssl_policy = ((x($_POST,'ssl_policy')) ? intval($_POST['ssl_policy']) : 0);
+// $ssl_policy = ((x($_POST,'ssl_policy')) ? intval($_POST['ssl_policy']) : 0);
/*
if($ssl_policy != intval(get_config('system','ssl_policy'))) {
if($ssl_policy == SSL_POLICY_FULL) {
@@ -274,11 +287,12 @@ function admin_page_site_post(&$a){
}
}
*/
- set_config('system','ssl_policy',$ssl_policy);
+// set_config('system','ssl_policy',$ssl_policy);
set_config('system','delivery_interval',$delivery_interval);
set_config('system','poll_interval',$poll_interval);
set_config('system','maxloadavg',$maxloadavg);
- set_config('config','sitename',$sitename);
+ set_config('system','sitename',$sitename);
+ set_config('system','no_login_on_homepage',$no_login_on_homepage);
if ($banner=="") {
del_config('system','banner');
@@ -289,9 +303,22 @@ function admin_page_site_post(&$a){
set_config('system','language', $language);
set_config('system','theme', $theme);
+ if ( $theme_mobile === '---' ) {
+ del_config('system','mobile_theme');
+ } else {
+ set_config('system','mobile_theme', $theme_mobile);
+ }
+ if ( $theme_accessibility === '---' ) {
+ del_config('system','accessibility_theme');
+ } else {
+ set_config('system','accessibility_theme', $theme_accessibility);
+ }
+
+ set_config('system','site_channel', $site_channel);
set_config('system','maximagesize', $maximagesize);
set_config('system','register_policy', $register_policy);
+ set_config('system','access_policy', $access_policy);
set_config('system','account_abandon_days', $abandon_days);
set_config('system','register_text', $register_text);
set_config('system','allowed_sites', $allowed_sites);
@@ -337,14 +364,24 @@ function admin_page_site(&$a) {
$lang_choices[$t[1]] = $t[1];
}
}
-
+
/* Installed themes */
$theme_choices = array();
+ $theme_choices_mobile = array();
+ $theme_choices_mobile["---"] = t("No special theme for mobile devices");
+ $theme_choices_accessibility = array();
+ $theme_choices_accessibility["---"] =t("No special theme for accessibility");
$files = glob('view/theme/*');
if($files) {
foreach($files as $file) {
$f = basename($file);
- $theme_name = ((file_exists($file . '/.experimental')) ? sprintf("%s - Experimental", $f) : $f);
+ $theme_name = ((file_exists($file . '/experimental')) ? sprintf("%s - Experimental", $f) : $f);
+ if (file_exists($file . '/mobile')) {
+ $theme_choices_mobile[$f] = $theme_name;
+ }
+ if (file_exists($file . '/accessibility')) {
+ $theme_choices_accessibility[$f] = $theme_name;
+ }
$theme_choices[$f] = $theme_name;
}
}
@@ -363,10 +400,18 @@ function admin_page_site(&$a) {
REGISTER_OPEN => t("Open")
);
- $ssl_choices = array(
- SSL_POLICY_NONE => t("No SSL policy, links will track page SSL state"),
- SSL_POLICY_FULL => t("Force all links to use SSL")
+ /* Acess policy */
+ $access_choices = Array(
+ ACCESS_PRIVATE => t("Private"),
+ ACCESS_PAID => t("Paid Access"),
+ ACCESS_FREE => t("Free Access"),
+ ACCESS_TIERED => t("Tiered Access")
);
+
+// $ssl_choices = array(
+// SSL_POLICY_NONE => t("No SSL policy, links will track page SSL state"),
+// SSL_POLICY_FULL => t("Force all links to use SSL")
+// );
$t = get_markup_template("admin_site.tpl");
return replace_macros($t, array(
@@ -380,22 +425,25 @@ function admin_page_site(&$a) {
'$baseurl' => $a->get_baseurl(true),
// name, label, value, help string, extra data...
- '$sitename' => array('sitename', t("Site name"), htmlentities($a->config['sitename'], ENT_QUOTES), ""),
+ '$sitename' => array('sitename', t("Site name"), htmlspecialchars(get_config('system','sitename'), ENT_QUOTES, 'UTF-8'),''),
'$banner' => array('banner', t("Banner/Logo"), $banner, ""),
'$language' => array('language', t("System language"), get_config('system','language'), "", $lang_choices),
'$theme' => array('theme', t("System theme"), get_config('system','theme'), t("Default system theme - may be over-ridden by user profiles - <a href='#' id='cnftheme'>change theme settings</a>"), $theme_choices),
- '$ssl_policy' => array('ssl_policy', t("SSL link policy"), (string) intval(get_config('system','ssl_policy')), t("Determines whether generated links should be forced to use SSL"), $ssl_choices),
+ '$theme_mobile' => array('theme_mobile', t("Mobile system theme"), get_config('system','mobile_theme'), t("Theme for mobile devices"), $theme_choices_mobile),
+ '$theme_accessibility' => array('theme_accessibility', t("Accessibility system theme"), get_config('system','accessibility_theme'), t("Accessibility theme"), $theme_choices_accessibility),
+ '$site_channel' => array('site_channel', t("Channel to use for this website's static pages"), get_config('system','site_channel'), t("Site Channel")),
+// '$ssl_policy' => array('ssl_policy', t("SSL link policy"), (string) intval(get_config('system','ssl_policy')), t("Determines whether generated links should be forced to use SSL"), $ssl_choices),
'$maximagesize' => array('maximagesize', t("Maximum image size"), get_config('system','maximagesize'), t("Maximum size in bytes of uploaded images. Default is 0, which means no limits.")),
- '$register_policy' => array('register_policy', t("Register policy"), $a->config['system']['register_policy'], "", $register_choices),
- '$register_text' => array('register_text', t("Register text"), htmlentities($a->config['register_text'], ENT_QUOTES, 'UTF-8'), t("Will be displayed prominently on the registration page.")),
+ '$register_policy' => array('register_policy', t("Register policy"), get_config('system','register_policy'), "", $register_choices),
+ '$access_policy' => array('access_policy', t("Access policy"), get_config('system','access_policy'), "", $access_choices),
+ '$register_text' => array('register_text', t("Register text"), htmlspecialchars(get_config('system','register_text'), ENT_QUOTES, 'UTF-8'), t("Will be displayed prominently on the registration page.")),
'$abandon_days' => array('abandon_days', t('Accounts abandoned after x days'), get_config('system','account_abandon_days'), t('Will not waste system resources polling external sites for abandonded accounts. Enter 0 for no time limit.')),
'$allowed_sites' => array('allowed_sites', t("Allowed friend domains"), get_config('system','allowed_sites'), t("Comma separated list of domains which are allowed to establish friendships with this site. Wildcards are accepted. Empty to allow any domains")),
'$allowed_email' => array('allowed_email', t("Allowed email domains"), get_config('system','allowed_email'), t("Comma separated list of domains which are allowed in email addresses for registrations to this site. Wildcards are accepted. Empty to allow any domains")),
'$block_public' => array('block_public', t("Block public"), get_config('system','block_public'), t("Check to block public access to all otherwise public personal pages on this site unless you are currently logged in.")),
'$force_publish' => array('publish_all', t("Force publish"), get_config('system','publish_all'), t("Check to force all profiles on this site to be listed in the site directory.")),
- '$global_directory' => array('directory_submit_url', t("Global directory update URL"), get_config('system','directory_submit_url'), t("URL to update the global directory. If this is not set, the global directory is completely unavailable to the application.")),
+ '$no_login_on_homepage' => array('no_login_on_homepage', t("No login on Homepage"), get_config('system','no_login_on_homepage'), t("Check to hide the login form from your sites homepage when visitors arrive who are not logged in (e.g. when you put the content of the homepage in via the site channel).")),
- '$no_community_page' => array('no_community_page', t("Show Community Page"), !get_config('system','no_community_page'), t("Display a Community page showing all recent public postings on this site.")),
'$proxyuser' => array('proxyuser', t("Proxy user"), get_config('system','proxyuser'), ""),
'$proxy' => array('proxy', t("Proxy URL"), get_config('system','proxy'), ""),
'$timeout' => array('timeout', t("Network timeout"), (x(get_config('system','curl_timeout'))?get_config('system','curl_timeout'):60), t("Value is in seconds. Set to 0 for unlimited (not recommended).")),
@@ -407,6 +455,34 @@ function admin_page_site(&$a) {
));
}
+function admin_page_hubloc_post(&$a){
+ check_form_security_token_redirectOnErr('/admin/hubloc', 'hubloc');
+ return;
+}
+
+function admin_page_hubloc(&$a) {
+ $o = '';
+ $hubloc = q("SELECT hubloc_id, hubloc_addr, hubloc_host, hubloc_status FROM hubloc");
+
+
+ if(! $hubloc){
+ notice( t('No server found') . EOL);
+ goaway($a->get_baseurl(true) . '/admin/hubloc');
+ }
+
+ $t = get_markup_template("admin_hubloc.tpl");
+ return replace_macros($t, array(
+ '$hubloc' => $hubloc,
+ '$th_hubloc' => array(t('ID'), t('for channel'), t('on server'), t('Status')),
+ '$title' => t('Administration'),
+ '$page' => t('Server'),
+ '$queues' => $queues,
+ //'$accounts' => $accounts, /*$accounts is empty here*/
+ '$pending' => Array( t('Pending registrations'), $pending),
+ '$plugins' => Array( t('Active plugins'), $a->plugins )
+ ));
+ return $o;
+}
function admin_page_dbsync(&$a) {
@@ -490,7 +566,7 @@ function admin_page_users_post(&$a){
if (x($_POST,'page_users_delete')){
require_once("include/Contact.php");
foreach($users as $uid){
- user_remove($uid);
+ account_remove($uid,true);
}
notice( sprintf( tt("%s user deleted", "%s users deleted", count($users)), count($users)) );
}
@@ -532,9 +608,9 @@ function admin_page_users(&$a){
check_form_security_token_redirectOnErr('/admin/users', 'admin_users', 't');
// delete user
require_once("include/Contact.php");
- user_remove($uid);
+ account_remove($uid,true);
- notice( sprintf(t("User '%s' deleted"), $user[0]['username']) . EOL);
+ notice( sprintf(t("User '%s' deleted"), $account[0]['account_email']) . EOL);
}; break;
case "block":{
check_form_security_token_redirectOnErr('/admin/users', 'admin_users', 't');
@@ -552,7 +628,7 @@ function admin_page_users(&$a){
}
/* get pending */
- $pending = q("SELECT * from account where (account_flags & %d ) ",
+ $pending = q("SELECT account.*, register.hash from account left join register on account_id = register.uid where (account_flags & %d ) ",
intval(ACCOUNT_PENDING)
);
@@ -564,40 +640,42 @@ function admin_page_users(&$a){
$a->set_pager_itemspage(100);
}
-// FIXME this is borked since there is no more user table
-
- $users = q("SELECT `user` . * , `contact`.`name` , `contact`.`url` , `contact`.`micro`, `lastitem`.`lastitem_date`
- FROM
- (SELECT MAX(`item`.`changed`) as `lastitem_date`, `item`.`uid`
- FROM `item`
- WHERE `item`.`type` = 'wall'
- GROUP BY `item`.`uid`) AS `lastitem`
- RIGHT OUTER JOIN `user` ON `user`.`uid` = `lastitem`.`uid`,
- `contact`
- WHERE
- `user`.`uid` = `contact`.`uid`
- AND `user`.`verified` =1
- AND `contact`.`self` =1
- ORDER BY `contact`.`name` LIMIT %d, %d
- ",
- intval($a->pager['start']),
- intval($a->pager['itemspage'])
- );
+
+// WEe'll still need to link email addresses to admin/users/channels or some such, but this bit doesn't exist yet.
+// That's where we need to be doing last post/channel flags/etc, not here.
+
+
+ $serviceclass = (($_REQUEST['class']) ? " and account_service_class = '" . dbesc($_REQUEST['class']) . "' " : '');
+
+
+ $order = " order by account_email asc ";
+ if($_REQUEST['order'] === 'expires')
+ $order = " order by account_expires desc ";
+
+ $users =q("SELECT `account_id` , `account_email`, `account_lastlog`, `account_created`, `account_expires`, " . "`account_service_class`, ( account_flags & %d ) > 0 as `blocked`, " .
+ "(SELECT GROUP_CONCAT( ch.channel_address SEPARATOR ' ') FROM channel as ch " .
+ "WHERE ch.channel_account_id = ac.account_id) as `channels` " .
+ "FROM account as ac where true $serviceclass $order limit %d , %d ",
+ intval(ACCOUNT_BLOCKED),
+ intval($a->pager['start']),
+ intval($a->pager['itemspage'])
+ );
- function _setup_users($e){
- $accounts = Array(
- t('Normal Account'),
- t('Soapbox Account'),
- t('Community/Celebrity Account'),
- t('Automatic Friend Account')
- );
- $e['page_flags'] = $accounts[$e['page-flags']];
- $e['register_date'] = relative_date($e['register_date']);
- $e['login_date'] = relative_date($e['login_date']);
- $e['lastitem_date'] = relative_date($e['lastitem_date']);
- return $e;
- }
- $users = array_map("_setup_users", $users);
+// function _setup_users($e){
+// $accounts = Array(
+// t('Normal Account'),
+// t('Soapbox Account'),
+// t('Community/Celebrity Account'),
+// t('Automatic Friend Account')
+// );
+
+// $e['page_flags'] = $accounts[$e['page-flags']];
+// $e['register_date'] = relative_date($e['register_date']);
+// $e['login_date'] = relative_date($e['login_date']);
+// $e['lastitem_date'] = relative_date($e['lastitem_date']);
+// return $e;
+// }
+// $users = array_map("_setup_users", $users);
$t = get_markup_template("admin_users.tpl");
@@ -615,9 +693,9 @@ function admin_page_users(&$a){
'$delete' => t('Delete'),
'$block' => t('Block'),
'$unblock' => t('Unblock'),
-
+
'$h_users' => t('Users'),
- '$th_users' => array( t('Name'), t('Email'), t('Register date'), t('Last login'), t('Last item'), t('Account') ),
+ '$th_users' => array( t('ID'), t('Email'), t('All Channels'), t('Register date'), t('Last login'), t('Expires'), t('Service Class')),
'$confirm_delete_multi' => t('Selected users will be deleted!\n\nEverything these users had posted on this site will be permanently deleted!\n\nAre you sure?'),
'$confirm_delete' => t('The user {0} will be deleted!\n\nEverything this user has posted on this site will be permanently deleted!\n\nAre you sure?'),
@@ -689,12 +767,16 @@ function admin_page_plugins(&$a){
}
$admin_form="";
+
if (is_array($a->plugins_admin) && in_array($plugin, $a->plugins_admin)){
@require_once("addon/$plugin/$plugin.php");
- $func = $plugin.'_plugin_admin';
- $func($a, $admin_form);
+ if(function_exists($plugin.'_plugin_admin')) {
+ $func = $plugin.'_plugin_admin';
+ $func($a, $admin_form);
+ }
}
-
+
+
$t = get_markup_template("admin_plugins_details.tpl");
return replace_macros($t, array(
'$title' => t('Administration'),
@@ -1035,7 +1117,7 @@ readable.");
// name, label, value, help string, extra data...
'$debugging' => array('debugging', t("Debugging"),get_config('system','debugging'), ""),
- '$logfile' => array('logfile', t("Log file"), get_config('system','logfile'), t("Must be writable by web server. Relative to your Friendica top-level directory.")),
+ '$logfile' => array('logfile', t("Log file"), get_config('system','logfile'), t("Must be writable by web server. Relative to your Red top-level directory.")),
'$loglevel' => array('loglevel', t("Log level"), get_config('system','loglevel'), "", $log_choices),
'$form_security_token' => get_form_security_token("admin_logs"),
diff --git a/mod/allfriends.php b/mod/allfriends.php
deleted file mode 100644
index bb4df30be..000000000
--- a/mod/allfriends.php
+++ /dev/null
@@ -1,60 +0,0 @@
-<?php
-
-require_once('include/socgraph.php');
-
-function allfriends_content(&$a) {
-
- $o = '';
-
- if(! local_user()) {
- notice( t('Permission denied.') . EOL);
- return;
- }
-
- if(argc() > 1)
- $cid = intval(argv(1));
- if(! $cid)
- return;
-
- $c = q("select name, url, photo from contact where id = %d and uid = %d limit 1",
- intval($cid),
- intval(local_user())
- );
-
- $a->page['aside'] .= '<div class="vcard">'
- . '<div class="fn label">' . $c[0]['name'] . '</div>'
- . '<div id="profile-photo-wrapper">'
- . '<a href="/contacts/' . $cid . '"><img class="photo" width="175" height="175"
- src="' . $c[0]['photo'] . '" alt="' . $c[0]['name'] . '" /></div>'
- . '</div>';
-
-
- if(! count($c))
- return;
-
- $o .= '<h2>' . sprintf( t('Friends of %s'), $c[0]['name']) . '</h2>';
-
-
- $r = all_friends(local_user(),$cid);
-
- if(! count($r)) {
- $o .= t('No friends to display.');
- return $o;
- }
-
- $tpl = get_markup_template('common_friends.tpl');
-
- foreach($r as $rr) {
-
- $o .= replace_macros($tpl,array(
- '$url' => $rr['url'],
- '$name' => $rr['name'],
- '$photo' => $rr['photo'],
- '$tags' => ''
- ));
- }
-
- $o .= cleardiv();
-// $o .= paginate($a);
- return $o;
-}
diff --git a/mod/attach.php b/mod/attach.php
index a5f9d1a6b..c52966ce0 100644
--- a/mod/attach.php
+++ b/mod/attach.php
@@ -17,10 +17,24 @@ function attach_init(&$a) {
return;
}
+ $c = q("select channel_address from channel where channel_id = %d limit 1",
+ intval($r['data']['uid'])
+ );
+
+ if(! $c)
+ return;
+
header('Content-type: ' . $r['data']['filetype']);
header('Content-disposition: attachment; filename=' . $r['data']['filename']);
- if($r['data']['flags'] & ATTACH_FLAG_OS )
- echo @file_get_contents($r['data']['data']);
+ if($r['data']['flags'] & ATTACH_FLAG_OS ) {
+ $istream = fopen('store/' . $c[0]['channel_address'] . '/' . $r['data']['data'],'rb');
+ $ostream = fopen('php://output','wb');
+ if($istream && $ostream) {
+ pipe_streams($istream,$ostream);
+ fclose($istream);
+ fclose($ostream);
+ }
+ }
else
echo $r['data']['data'];
killme();
diff --git a/mod/authtest.php b/mod/authtest.php
new file mode 100644
index 000000000..7747ea504
--- /dev/null
+++ b/mod/authtest.php
@@ -0,0 +1,50 @@
+<?php
+
+require_once('include/zot.php');
+require_once('mod/magic.php');
+
+function authtest_content(&$a) {
+
+
+ $auth_success = false;
+ $o .= '<h3>Magic-Auth Diagnostic</h3>';
+
+ if(! local_user()) {
+ notice( t('Permission denied.') . EOL);
+ return $o;
+ }
+
+ $o .= '<form action="authtest" method="get">';
+ $o .= 'Target URL: <input type="text" style="width: 250px;" name="dest" value="' . $_GET['dest'] .'" />';
+ $o .= '<input type="submit" name="submit" value="Submit" /></form>';
+
+ $o .= '<br /><br />';
+
+ if(x($_GET,'dest')) {
+ $_REQUEST['test'] = 1;
+ $x = magic_init($a);
+ $o .= 'Local Setup returns: ' . print_r($x,true);
+
+
+
+ if($x['url']) {
+ $z = z_fetch_url($x['url'] . '&test=1');
+ if($z['success']) {
+ $j = json_decode($z['body'],true);
+ if(! $j)
+ $o .= 'json_decode failure from remote site. ' . print_r($z['body'],true);
+ $o .= 'Remote site responded: ' . print_r($j,true);
+ if(strpos($j,'Authentication Success'))
+ $auth_success = true;
+ }
+ else {
+ $o .= 'fetch url failure.' . print_r($z,true);
+ }
+ }
+
+ if(! $auth_success)
+ $o .= 'Authentication Failed!' . EOL;
+ }
+
+ return str_replace("\n",'<br />',$o);
+}
diff --git a/mod/blocks.php b/mod/blocks.php
new file mode 100644
index 000000000..9a4e0b1ca
--- /dev/null
+++ b/mod/blocks.php
@@ -0,0 +1,102 @@
+<?php
+
+function blocks_content(&$a) {
+
+
+
+ if(argc() > 1)
+ $which = argv(1);
+ else {
+ notice( t('Requested profile is not available.') . EOL );
+ $a->error = 404;
+ return;
+ }
+
+ profile_load($a,$which,0);
+
+
+ // Figure out who the page owner is.
+ $r = q("select channel_id from channel where channel_address = '%s'",
+ dbesc($which)
+ );
+ if($r) {
+ $owner = intval($r[0]['channel_id']);
+ }
+
+ // Block design features from visitors
+
+ if((! local_user()) || (local_user() != $owner)) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+
+
+
+// Get the observer, check their permissions
+
+ $observer = $a->get_observer();
+ $ob_hash = (($observer) ? $observer['xchan_hash'] : '');
+
+ $perms = get_all_perms($owner,$ob_hash);
+
+ if(! $perms['write_pages']) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+// if(local_user() && local_user() == $owner) {
+ // $a->set_widget('design',design_tools());
+ // }
+
+
+
+// Create a status editor (for now - we'll need a WYSIWYG eventually) to create pages
+// Nickname is set to the observers xchan, and profile_uid to the owners. This lets you post pages at other people's channels.
+require_once ('include/conversation.php');
+ $x = array(
+ 'webpage' => ITEM_BUILDBLOCK,
+ 'is_owner' => true,
+ 'nickname' => $a->profile['channel_address'],
+ 'lockstate' => (($group || $cid || $channel['channel_allow_cid'] || $channel['channel_allow_gid'] || $channel['channel_deny_cid'] || $channel['channel_deny_gid']) ? 'lock' : 'unlock'),
+ 'bang' => (($group || $cid) ? '!' : ''),
+ 'visitor' => 'block',
+ 'mimetype' => 'choose',
+ 'ptlabel' => t('Block Name'),
+ 'profile_uid' => intval($owner),
+ );
+
+ $o .= status_editor($a,$x);
+
+ //Get a list of blocks. We can't display all them because endless scroll makes that unusable, so just list titles and an edit link.
+//TODO - this should be replaced with pagelist_widget
+
+$r = q("select * from item_id where uid = %d and service = 'BUILDBLOCK' order by sid asc",
+ intval($owner)
+);
+
+ $pages = null;
+
+ if($r) {
+ $pages = array();
+ foreach($r as $rr) {
+ $pages[$rr['iid']][] = array('url' => $rr['iid'],'title' => $rr['sid']);
+ }
+ }
+
+
+//Build the base URL for edit links
+ $url = z_root() . "/editblock/" . $which;
+// This isn't pretty, but it works. Until I figure out what to do with the UI, it's Good Enough(TM).
+ return $o . replace_macros(get_markup_template("webpagelist.tpl"), array(
+ '$baseurl' => $url,
+ '$edit' => t('Edit'),
+ '$pages' => $pages,
+ '$channel' => $which,
+ '$view' => t('View'),
+ '$preview' => '1',
+
+ ));
+
+
+}
diff --git a/mod/chanman.php b/mod/chanman.php
new file mode 100644
index 000000000..7a89708d7
--- /dev/null
+++ b/mod/chanman.php
@@ -0,0 +1,31 @@
+<?php /** @file */
+
+
+/**
+ Placeholder file at present. This is going to involve a bit of work.
+
+ This file will deal with the deletion of channels and management of hublocs.
+
+ We need to provide the following functionality:
+
+ - Delete my account and all channels from the entire network
+
+ - Delete my account and all channels from this server
+
+ - Delete a channel from the entire network
+
+ - Delete a channel from this server
+
+ - List all hub locations for this channel
+
+ - Remove this/some hub location from this channel
+
+ - promote this/some hub location to primary
+
+ - Remove hub location 'xyz' from this channel, (this should possibly only be allowed if that hub has been down for a period of time)
+
+ - Some of these actions should probably require email verification
+
+*/
+
+
diff --git a/mod/channel.php b/mod/channel.php
index 0a49b41eb..6e82eb1e7 100644
--- a/mod/channel.php
+++ b/mod/channel.php
@@ -1,12 +1,28 @@
<?php
+require_once('include/contact_widgets.php');
+require_once('include/items.php');
+require_once("include/bbcode.php");
+require_once('include/security.php');
+require_once('include/conversation.php');
+require_once('include/acl_selectors.php');
+require_once('include/permissions.php');
+
+
function channel_init(&$a) {
+ $which = null;
if(argc() > 1)
$which = argv(1);
- else {
- notice( t('Requested profile is not available.') . EOL );
- $a->error = 404;
+ if(! $which) {
+ if(local_user()) {
+ $channel = $a->get_channel();
+ if($channel && $channel['channel_address'])
+ $which = $channel['channel_address'];
+ }
+ }
+ if(! $which) {
+ notice( t('You must be logged in to see this page.') . EOL );
return;
}
@@ -27,58 +43,20 @@ function channel_init(&$a) {
}
-
-function channel_aside(&$a) {
-
- require_once('include/contact_widgets.php');
- require_once('include/items.php');
-
- if(! $a->profile['profile_uid'])
- return;
-
- $channel_display = get_pconfig($a->profile['profile_uid'],'system','channel_format');
- if(! $channel_display)
- profile_create_sidebar($a);
-
- if($channel_display === 'full')
- $a->page['template'] = 'full';
- else {
- $cat = ((x($_REQUEST,'cat')) ? htmlspecialchars($_REQUEST['cat']) : '');
- $a->set_widget('archive',posted_date_widget($a->get_baseurl(true) . '/channel/' . $a->profile['channel_address'],$a->profile['profile_uid'],true));
- $a->set_widget('categories',categories_widget($a->get_baseurl(true) . '/channel/' . $a->profile['channel_address'],$cat));
- }
-}
-
-
function channel_content(&$a, $update = 0, $load = false) {
$category = $datequery = $datequery2 = '';
- if(argc() > 2) {
- for($x = 2; $x < argc(); $x ++) {
- if(is_a_date_arg(argv($x))) {
- if($datequery)
- $datequery2 = escape_tags(argv($x));
- else
- $datequery = escape_tags(argv($x));
- }
- }
- }
+ $mid = $_GET['mid'];
+ $datequery = ((x($_GET,'dend') && is_a_date_arg($_GET['dend'])) ? notags($_GET['dend']) : '');
+ $datequery2 = ((x($_GET,'dbegin') && is_a_date_arg($_GET['dbegin'])) ? notags($_GET['dbegin']) : '');
if(get_config('system','block_public') && (! get_account_id()) && (! remote_user())) {
return login();
}
-
-
- require_once("include/bbcode.php");
- require_once('include/security.php');
- require_once('include/conversation.php');
- require_once('include/acl_selectors.php');
- require_once('include/items.php');
- require_once('include/permissions.php');
-
+ $category = ((x($_REQUEST,'cat')) ? $_REQUEST['cat'] : '');
$groups = array();
@@ -102,6 +80,11 @@ function channel_content(&$a, $update = 0, $load = false) {
$perms = get_all_perms($a->profile['profile_uid'],$ob_hash);
if(! $perms['view_stream']) {
+ // We may want to make the target of this redirect configurable
+ if($perms['view_profile']) {
+ notice( t('Insufficient permissions. Request redirected to profile page.') . EOL);
+ goaway (z_root() . "/profile/" . $a->profile['channel_address']);
+ }
notice( t('Permission denied.') . EOL);
return;
}
@@ -113,17 +96,24 @@ function channel_content(&$a, $update = 0, $load = false) {
$o .= common_friends_visitor_widget($a->profile['profile_uid']);
+ $channel_acl = array(
+ 'allow_cid' => $channel['channel_allow_cid'],
+ 'allow_gid' => $channel['channel_allow_gid'],
+ 'deny_cid' => $channel['channel_deny_cid'],
+ 'deny_gid' => $channel['channel_deny_gid']
+ );
+
if($perms['post_wall']) {
$x = array(
'is_owner' => $is_owner,
-// FIXME
- 'allow_location' => ((($is_owner || $observer) && $a->profile['allow_location']) ? true : false),
- 'default_location' => (($is_owner) ? $a->profile['default_location'] : ''),
+ 'allow_location' => ((($is_owner || $observer) && (intval(get_pconfig($a->profile['profile_uid'],'system','use_browser_location')))) ? true : false),
+ 'default_location' => (($is_owner) ? $a->profile['channel_location'] : ''),
'nickname' => $a->profile['channel_address'],
'lockstate' => (((strlen($a->profile['channel_allow_cid'])) || (strlen($a->profile['channel_allow_gid'])) || (strlen($a->profile['channel_deny_cid'])) || (strlen($a->profile['channel_deny_gid']))) ? 'lock' : 'unlock'),
- 'acl' => (($is_owner) ? populate_acl($channel, false) : ''),
+ 'acl' => (($is_owner) ? populate_acl($channel_acl) : ''),
+ 'showacl' => (($is_owner) ? 'yes' : ''),
'bang' => '',
'visitor' => (($is_owner || $observer) ? 'block' : 'none'),
'profile_uid' => $a->profile['profile_uid']
@@ -144,25 +134,34 @@ function channel_content(&$a, $update = 0, $load = false) {
if(($update) && (! $load)) {
-
- $r = q("SELECT distinct parent AS `item_id` from item
- left join abook on item.author_xchan = abook.abook_xchan
- WHERE uid = %d AND item_restrict = 0
- AND (item_flags & %d) AND ( item_flags & %d )
- AND ((abook.abook_flags & %d) = 0 or abook.abook_flags is null)
- $sql_extra
- ORDER BY created DESC",
- intval($a->profile['profile_uid']),
- intval(ITEM_WALL),
- intval(ITEM_UNSEEN),
- intval(ABOOK_FLAG_BLOCKED)
- );
+ if ($mid) {
+ $r = q("SELECT parent AS item_id from item where mid = '%s' and uid = %d AND item_restrict = 0
+ AND (item_flags & %d) $sql_extra limit 1",
+ dbesc($mid),
+ intval($a->profile['profile_uid']),
+ intval(ITEM_WALL)
+ );
+ } else {
+ $r = q("SELECT distinct parent AS `item_id` from item
+ left join abook on item.author_xchan = abook.abook_xchan
+ WHERE uid = %d AND item_restrict = 0
+ AND (item_flags & %d) AND ( item_flags & %d )
+ AND ((abook.abook_flags & %d) = 0 or abook.abook_flags is null)
+ $sql_extra
+ ORDER BY created DESC",
+ intval($a->profile['profile_uid']),
+ intval(ITEM_WALL),
+ intval(ITEM_UNSEEN),
+ intval(ABOOK_FLAG_BLOCKED)
+ );
+ }
}
else {
+
if(x($category)) {
- $sql_extra .= protect_sprintf(file_tag_file_query('item',$category,'category'));
+ $sql_extra .= protect_sprintf(term_query('item', $category, TERM_CATEGORY));
}
if($datequery) {
@@ -172,25 +171,36 @@ function channel_content(&$a, $update = 0, $load = false) {
$sql_extra2 .= protect_sprintf(sprintf(" AND item.created >= '%s' ", dbesc(datetime_convert(date_default_timezone_get(),'',$datequery2))));
}
-
- $a->set_pager_itemspage(40);
-
+ $itemspage = get_pconfig(local_user(),'system','itemspage');
+ $a->set_pager_itemspage(((intval($itemspage)) ? $itemspage : 20));
$pager_sql = sprintf(" LIMIT %d, %d ",intval($a->pager['start']), intval($a->pager['itemspage']));
- if($load) {
- $r = q("SELECT distinct id AS item_id FROM item
- left join abook on item.author_xchan = abook.abook_xchan
- WHERE uid = %d AND item_restrict = 0
- AND (item_flags & %d) and (item_flags & %d)
- AND ((abook.abook_flags & %d) = 0 or abook.abook_flags is null)
- $sql_extra $sql_extra2
- ORDER BY created DESC $pager_sql ",
- intval($a->profile['profile_uid']),
- intval(ITEM_WALL),
- intval(ITEM_THREAD_TOP),
- intval(ABOOK_FLAG_BLOCKED)
-
- );
+ if($load || ($_COOKIE['jsAvailable'] != 1)) {
+ if ($mid) {
+ $r = q("SELECT parent AS item_id from item where mid = '%s' and uid = %d AND item_restrict = 0
+ AND (item_flags & %d) $sql_extra limit 1",
+ dbesc($mid),
+ intval($a->profile['profile_uid']),
+ intval(ITEM_WALL)
+ );
+ if (! $r) {
+ notice( t('Permission denied.') . EOL);
+ }
+
+ } else {
+ $r = q("SELECT distinct id AS item_id FROM item
+ left join abook on item.author_xchan = abook.abook_xchan
+ WHERE uid = %d AND item_restrict = 0
+ AND (item_flags & %d) and (item_flags & %d)
+ AND ((abook.abook_flags & %d) = 0 or abook.abook_flags is null)
+ $sql_extra $sql_extra2
+ ORDER BY created DESC $pager_sql ",
+ intval($a->profile['profile_uid']),
+ intval(ITEM_WALL),
+ intval(ITEM_THREAD_TOP),
+ intval(ABOOK_FLAG_BLOCKED)
+ );
+ }
}
else {
$r = array();
@@ -214,6 +224,12 @@ function channel_content(&$a, $update = 0, $load = false) {
$items = fetch_post_tags($items, true);
$items = conv_sort($items,'created');
+ if ($load && $mid && (! count($items))) {
+ // This will happen if we don't have sufficient permissions
+ // to view the parent item (or the item itself if it is toplevel)
+ notice( t('Permission denied.') . EOL);
+ }
+
} else {
$items = array();
}
@@ -245,9 +261,10 @@ function channel_content(&$a, $update = 0, $load = false) {
'$page' => (($a->pager['page'] != 1) ? $a->pager['page'] : 1),
'$search' => '',
'$order' => '',
+ '$list' => ((x($_REQUEST,'list')) ? intval($_REQUEST['list']) : 0),
'$file' => '',
'$cats' => (($category) ? $category : ''),
- '$uri' => '',
+ '$mid' => $mid,
'$dend' => $datequery,
'$dbegin' => $datequery2
));
@@ -269,9 +286,13 @@ function channel_content(&$a, $update = 0, $load = false) {
}
- $o .= conversation($a,$items,'channel',$update,'client');
+ if($_COOKIE['jsAvailable'] == 1) {
+ $o .= conversation($a,$items,'channel',$update,'client');
+ } else {
+ $o .= conversation($a,$items,'channel',$update,'traditional');
+ }
- if(! $update)
+ if((! $update) || ($_COOKIE['jsAvailable'] != 1))
$o .= alt_pager($a,count($items));
return $o;
diff --git a/mod/chanview.php b/mod/chanview.php
index 8de59b92e..c4942b938 100644
--- a/mod/chanview.php
+++ b/mod/chanview.php
@@ -29,22 +29,25 @@ function chanview_content(&$a) {
);
}
elseif($_REQUEST['url']) {
- $r = q("select * from xchan where xchan_url = '%s' limit 1",
+
+ // if somebody re-installed they will have more than one xchan, use the most recent name date as this is
+ // the most useful consistently ascending table item we have.
+
+ $r = q("select * from xchan where xchan_url = '%s' order by xchan_name_date desc limit 1",
dbesc($_REQUEST['url'])
);
}
if($r) {
- $xchan = $r[0];
+ $a->poi = $r[0];
}
-
// Here, let's see if we have an xchan. If we don't, how we proceed is determined by what
// info we do have. If it's a URL, we can offer to visit it directly. If it's a webbie or
// address, we can and should try to import it. If it's just a hash, we can't continue, but we
// probably wouldn't have a hash if we don't already have an xchan for this channel.
- if(! $xchan) {
+ if(! $a->poi) {
logger('mod_chanview: fallback');
// This is hackish - construct a zot address from the url
if($_REQUEST['url']) {
@@ -64,26 +67,30 @@ function chanview_content(&$a) {
dbesc($_REQUEST['address'])
);
if($r)
- $xchan = $r[0];
+ $a->poi = $r[0];
}
}
}
- if(! $xchan) {
+ if(! $a->poi) {
notice( t('Channel not found.') . EOL);
return;
}
- if($xchan['xchan_hash'])
- $a->set_widget('vcard',vcard_from_xchan($xchan,$observer,'chanview'));
-
- $url = (($observer)
- ? z_root() . '/magic?f=&dest=' . $xchan['xchan_url'] . '&addr=' . $xchan['xchan_addr']
- : $xchan['xchan_url']
- );
-
+ if(is_foreigner($a->poi['xchan_hash']))
+ $url = $a->poi['xchan_url'];
+ else {
+ $url = (($observer)
+ ? z_root() . '/magic?f=&dest=' . $a->poi['xchan_url'] . '&addr=' . $a->poi['xchan_addr']
+ : $a->poi['xchan_url']
+ );
+ }
+
+ // let somebody over-ride the iframed viewport presentation
+ if(local_user() && get_pconfig(local_user(),'system','chanview_full'))
+ goaway($url);
$o = replace_macros(get_markup_template('chanview.tpl'),array(
'$url' => $url,
diff --git a/mod/cloud.php b/mod/cloud.php
new file mode 100644
index 000000000..2d8442807
--- /dev/null
+++ b/mod/cloud.php
@@ -0,0 +1,92 @@
+<?php
+
+ use Sabre\DAV;
+
+ require_once('vendor/autoload.php');
+
+
+ // workaround for HTTP-auth in CGI mode
+ if(x($_SERVER,'REDIRECT_REMOTE_USER')) {
+ $userpass = base64_decode(substr($_SERVER["REDIRECT_REMOTE_USER"],6)) ;
+ if(strlen($userpass)) {
+ list($name, $password) = explode(':', $userpass);
+ $_SERVER['PHP_AUTH_USER'] = $name;
+ $_SERVER['PHP_AUTH_PW'] = $password;
+ }
+ }
+
+ if(x($_SERVER,'HTTP_AUTHORIZATION')) {
+ $userpass = base64_decode(substr($_SERVER["HTTP_AUTHORIZATION"],6)) ;
+ if(strlen($userpass)) {
+ list($name, $password) = explode(':', $userpass);
+ $_SERVER['PHP_AUTH_USER'] = $name;
+ $_SERVER['PHP_AUTH_PW'] = $password;
+ }
+ }
+
+
+
+
+
+function cloud_init(&$a) {
+
+ require_once('include/reddav.php');
+
+ $which = null;
+ if(argc() > 1)
+ $which = argv(1);
+
+ $profile = 0;
+ $channel = $a->get_channel();
+
+ $a->page['htmlhead'] .= '<link rel="alternate" type="application/atom+xml" href="' . $a->get_baseurl() . '/feed/' . $which .'" />' . "\r\n" ;
+
+ if($which)
+ profile_load($a,$which,$profile);
+
+
+
+
+ $auth = new RedBasicAuth();
+
+ $ob_hash = get_observer_hash();
+
+ if($ob_hash) {
+ if(local_user()) {
+ $channel = $a->get_channel();
+ $auth->setCurrentUser($channel['channel_address']);
+ $auth->channel_name = $channel['channel_address'];
+ $auth->channel_id = $channel['channel_id'];
+ $auth->channel_hash = $channel['channel_hash'];
+ if($channel['channel_timezone'])
+ $auth->timezone = $channel['channel_timezone'];
+ }
+ $auth->observer = $ob_hash;
+ }
+
+
+ $rootDirectory = new RedDirectory('/',$auth);
+ $server = new DAV\Server($rootDirectory);
+ $lockBackend = new DAV\Locks\Backend\File('store/data/locks');
+ $lockPlugin = new DAV\Locks\Plugin($lockBackend);
+
+ $server->addPlugin($lockPlugin);
+
+
+ if(! $auth->observer)
+ $auth->Authenticate($server,'Red Matrix');
+
+// $browser = new DAV\Browser\Plugin();
+
+ $browser = new RedBrowser($auth);
+
+ $auth->setBrowserPlugin($browser);
+
+ $server->addPlugin($browser);
+
+
+ // All we need to do now, is to fire up the server
+ $server->exec();
+
+ killme();
+} \ No newline at end of file
diff --git a/mod/common.php b/mod/common.php
index 4afaf37eb..e19a9d3a9 100644
--- a/mod/common.php
+++ b/mod/common.php
@@ -21,14 +21,6 @@ function common_init(&$a) {
}
-function common_aside(&$a) {
- if(! $a->profile['profile_uid'])
- return;
-
- profile_create_sidebar($a);
-}
-
-
function common_content(&$a) {
$o = '';
diff --git a/mod/community.php b/mod/community.php
index 4f6c3d3c9..e4c6e6b04 100644
--- a/mod/community.php
+++ b/mod/community.php
@@ -3,7 +3,7 @@
function community_init(&$a) {
if(! local_user()) {
unset($_SESSION['theme']);
- unset($_SESSION['mobile-theme']);
+ unset($_SESSION['mobile_theme']);
}
@@ -47,7 +47,7 @@ function community_content(&$a, $update = 0) {
// OR your own posts if you are a logged in member
if(! get_pconfig(local_user(),'system','alt_pager')) {
- $r = q("SELECT COUNT(distinct(`item`.`uri`)) AS `total`
+ $r = q("SELECT COUNT(distinct(`item`.`mid`)) AS `total`
FROM `item` LEFT JOIN `contact` ON `contact`.`id` = `item`.`contact-id` LEFT JOIN `user` ON `user`.`uid` = `item`.`uid`
WHERE `item`.`visible` = 1 AND `item`.`deleted` = 0 and `item`.`moderated` = 0
AND `item`.`allow_cid` = '' AND `item`.`allow_gid` = ''
@@ -66,7 +66,7 @@ function community_content(&$a, $update = 0) {
}
- $r = q("SELECT distinct(`item`.`uri`), `item`.*, `item`.`id` AS `item_id`,
+ $r = q("SELECT distinct(`item`.`mid`), `item`.*, `item`.`id` AS `item_id`,
`contact`.`name`, `contact`.`photo`, `contact`.`url`, `contact`.`alias`, `contact`.`rel`,
`contact`.`network`, `contact`.`thumb`, `contact`.`self`, `contact`.`writable`,
`contact`.`id` AS `cid`, `contact`.`uid` AS `contact-uid`,
@@ -77,7 +77,7 @@ function community_content(&$a, $update = 0) {
AND `item`.`allow_cid` = '' AND `item`.`allow_gid` = ''
AND `item`.`deny_cid` = '' AND `item`.`deny_gid` = ''
AND `item`.`private` = 0 AND `item`.`wall` = 1 AND `user`.`hidewall` = 0
- AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0 group by `item`.`uri`
+ AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0 group by `item`.`mid`
ORDER BY `received` DESC LIMIT %d, %d ",
intval($a->pager['start']),
intval($a->pager['itemspage'])
diff --git a/mod/connect.php b/mod/connect.php
new file mode 100644
index 000000000..f7748bcaf
--- /dev/null
+++ b/mod/connect.php
@@ -0,0 +1,124 @@
+<?php /** @file */
+
+
+require_once('include/Contact.php');
+require_once('include/contact_widgets.php');
+require_once('include/items.php');
+
+
+function connect_init(&$a) {
+ if(argc() > 1)
+ $which = argv(1);
+ else {
+ notice( t('Requested profile is not available.') . EOL );
+ $a->error = 404;
+ return;
+ }
+
+ $r = q("select * from channel where channel_address = '%s' limit 1",
+ dbesc($which)
+ );
+
+ if($r)
+ $a->data['channel'] = $r[0];
+
+ profile_load($a,$which,'');
+}
+
+function connect_post(&$a) {
+
+ if(! array_key_exists('channel', $a->data))
+ return;
+
+ $edit = ((local_user() && (local_user() == $a->data['channel']['channel_id'])) ? true : false);
+
+ if($edit) {
+ $has_premium = (($a->data['channel']['channel_pageflags'] & PAGE_PREMIUM) ? 1 : 0);
+ $premium = (($_POST['premium']) ? intval($_POST['premium']) : 0);
+ $text = escape_tags($_POST['text']);
+
+ if($has_premium != $premium) {
+ $r = q("update channel set channel_pageflags = ( channel_pageflags ^ %d ) where channel_id = %d limit 1",
+ intval(PAGE_PREMIUM),
+ intval(local_user())
+ );
+ proc_run('php','include/notifier.php','refresh_all',$a->data['channel']['channel_id']);
+ }
+ set_pconfig($a->data['channel']['channel_id'],'system','selltext',$text);
+ // reload the page completely to get fresh data
+ goaway(z_root() . '/' . $a->query_string);
+
+ }
+
+ $url = '';
+ $observer = $a->get_observer();
+ if(($observer) && ($_POST['submit'] === t('Continue'))) {
+ if($observer['xchan_follow'])
+ $url = sprintf($observer['xchan_follow'],urlencode($a->data['channel']['channel_address'] . '@' . $a->get_hostname()));
+ if(! $url) {
+ $r = q("select * from hubloc where hubloc_hash = '%s' order by hubloc_id desc limit 1",
+ dbesc($observer['xchan_hash'])
+ );
+ if($r)
+ $url = $r[0]['hubloc_url'] . '/follow?f=&url=' . urlencode($a->data['channel']['channel_address'] . '@' . $a->get_hostname());
+ }
+ }
+ if($url)
+ goaway($url . '&confirm=1');
+ else
+ notice('Unable to connect to your home hub location.');
+
+}
+
+
+
+function connect_content(&$a) {
+
+ $edit = ((local_user() && (local_user() == $a->data['channel']['channel_id'])) ? true : false);
+
+ $text = get_pconfig($a->data['channel']['channel_id'],'system','selltext');
+
+ if($edit) {
+
+ $o = replace_macros(get_markup_template('sellpage_edit.tpl'),array(
+ '$header' => t('Premium Channel Setup'),
+ '$address' => $a->data['channel']['channel_address'],
+ '$premium' => array('premium', t('Enable premium channel connection restrictions'),(($a->data['channel']['channel_pageflags'] & PAGE_PREMIUM) ? '1' : ''),''),
+ '$lbl_about' => t('Please enter your restrictions or conditions, such as paypal receipt, usage guidelines, etc.'),
+ '$text' => $text,
+ '$desc' => t('This channel may require additional steps or acknowledgement of the following conditions prior to connecting:'),
+ '$lbl2' => t('Potential connections will then see the following text before proceeding:'),
+ '$desc2' => t('By continuing, I certify that I have complied with any instructions provided on this page.'),
+ '$submit' => t('Submit'),
+
+
+ ));
+ return $o;
+ }
+ else {
+ if(! $text)
+ $text = t('(No specific instructions have been provided by the channel owner.)');
+
+ $submit = replace_macros(get_markup_template('sellpage_submit.tpl'), array(
+ '$continue' => t('Continue'),
+ '$address' => $a->data['channel']['channel_address']
+ ));
+
+ $o = replace_macros(get_markup_template('sellpage_view.tpl'),array(
+ '$header' => t('Restricted or Premium Channel'),
+ '$desc' => t('This channel may require additional steps or acknowledgement of the following conditions prior to connecting:'),
+ '$text' => prepare_text($text),
+
+ '$desc2' => t('By continuing, I certify that I have complied with any instructions provided on this page.'),
+ '$submit' => $submit,
+
+ ));
+
+ $arr = array('channel' => $a->data['channel'],'observer' => $a->get_observer(), 'sellpage' => $o, 'submit' => $submit);
+ call_hooks('connect_premium', $arr);
+ $o = $arr['sellpage'];
+
+ }
+
+ return $o;
+} \ No newline at end of file
diff --git a/mod/connections.php b/mod/connections.php
index 8e002d870..2119c69c7 100644
--- a/mod/connections.php
+++ b/mod/connections.php
@@ -6,41 +6,19 @@ require_once('include/contact_selectors.php');
require_once('include/group.php');
require_once('include/contact_widgets.php');
require_once('include/zot.php');
+require_once('include/widgets.php');
function connections_init(&$a) {
if(! local_user())
return;
- if((argc() == 2) && intval(argv(1))) {
- $r = q("SELECT abook.*, xchan.*
- FROM abook left join xchan on abook_xchan = xchan_hash
- WHERE abook_channel = %d and abook_id = %d LIMIT 1",
- intval(local_user()),
- intval(argv(1))
- );
- if($r) {
- $a->data['abook'] = $r[0];
- }
- }
-}
-
-function connections_aside(&$a) {
-
- if(x($a->data,'abook')) {
- $a->set_widget('vcard',vcard_from_xchan($a->data['abook'],$a->get_observer()));
- }
- else {
- $a->set_widget('follow', follow_widget());
- }
-
- $a->set_widget('collections', group_side('connections','group',false,0,((array_key_exists('abook',$a->data)) ? $a->data['abook']['abook_xchan'] : '')));
- $a->set_widget('findpeople',findpeople_widget());
+ $channel = $a->get_channel();
+ if($channel)
+ head_set_icon($channel['xchan_photo_s']);
}
-
-
function connections_post(&$a) {
if(! local_user())
@@ -63,10 +41,10 @@ function connections_post(&$a) {
call_hooks('contact_edit_post', $_POST);
- $profile_id = intval($_POST['profile-assign']);
+ $profile_id = $_POST['profile-assign'];
if($profile_id) {
- $r = q("SELECT `id` FROM `profile` WHERE `id` = %d AND `uid` = %d LIMIT 1",
- intval($profile_id),
+ $r = q("SELECT profile_guid FROM profile WHERE profile_guid = '%s' AND `uid` = %d LIMIT 1",
+ dbesc($profile_id),
intval(local_user())
);
if(! count($r)) {
@@ -94,14 +72,16 @@ function connections_post(&$a) {
}
$abook_flags = $orig_record[0]['abook_flags'];
+ $new_friend = false;
if(($_REQUEST['pending']) && ($abook_flags & ABOOK_FLAG_PENDING)) {
$abook_flags = ( $abook_flags ^ ABOOK_FLAG_PENDING );
+ $new_friend = true;
}
- $r = q("UPDATE abook SET abook_profile = %d, abook_my_perms = %d , abook_closeness = %d, abook_flags = %d
+ $r = q("UPDATE abook SET abook_profile = '%s', abook_my_perms = %d , abook_closeness = %d, abook_flags = %d
where abook_id = %d AND abook_channel = %d LIMIT 1",
- intval($profile_id),
+ dbesc($profile_id),
intval($abook_my_perms),
intval($closeness),
intval($abook_flags),
@@ -118,6 +98,28 @@ function connections_post(&$a) {
proc_run('php', 'include/notifier.php', 'permission_update', $contact_id);
}
+ if($new_friend) {
+ $channel = $a->get_channel();
+ $default_group = $channel['channel_default_group'];
+ if($default_group) {
+ require_once('include/group.php');
+ $g = group_rec_byhash(local_user(),$default_group);
+ if($g)
+ group_add_member(local_user(),'',$a->data['abook_xchan'],$g['id']);
+ }
+
+
+
+ // Check if settings permit ("post new friend activity" is allowed, and
+ // friends in general or this friend in particular aren't hidden)
+ // and send out a new friend activity
+ // TODO
+
+ // pull in a bit of content if there is any to pull in
+ proc_run('php','include/onepoll.php',$contact_id);
+
+ }
+
// Refresh the structure in memory with the new data
$r = q("SELECT abook.*, xchan.*
@@ -126,307 +128,44 @@ function connections_post(&$a) {
intval(local_user()),
intval($contact_id)
);
- if($r)
+ if($r) {
$a->data['abook'] = $r[0];
+ }
+
+ if($new_friend) {
+ $arr = array('channel_id' => local_user(), 'abook' => $a->data['abook']);
+ call_hooks('accept_follow', $arr);
+ }
+
+ connections_clone($a);
return;
}
+function connections_clone(&$a) {
+
+ if(! array_key_exists('abook',$a->data))
+ return;
+ $clone = $a->data['abook'];
+
+ unset($clone['abook_id']);
+ unset($clone['abook_account']);
+ unset($clone['abook_channel']);
+
+ build_sync_packet(0 /* use the current local_user */, array('abook' => array($clone)));
+}
function connections_content(&$a) {
$sort_type = 0;
$o = '';
- nav_set_selected('connections');
if(! local_user()) {
notice( t('Permission denied.') . EOL);
- return;
- }
-
- if(argc() == 3) {
-
- $contact_id = intval(argv(1));
- if(! $contact_id)
- return;
-
- $cmd = argv(2);
-
- $orig_record = q("SELECT abook.*, xchan.* FROM abook left join xchan on abook_xchan = xchan_hash
- WHERE abook_id = %d AND abook_channel = %d AND NOT ( abook_flags & %d ) and not ( abook_flags & %d ) LIMIT 1",
- intval($contact_id),
- intval(local_user()),
- intval(ABOOK_FLAG_SELF),
- intval(ABOOK_FLAG_PENDING)
- );
-
- if(! count($orig_record)) {
- notice( t('Could not access address book record.') . EOL);
- goaway($a->get_baseurl(true) . '/connections');
- }
-
- if($cmd === 'update') {
-
- // pull feed and consume it, which should subscribe to the hub.
- proc_run('php',"include/poller.php","$contact_id");
- goaway($a->get_baseurl(true) . '/connections/' . $contact_id);
-
- }
-
- if($cmd === 'refresh') {
- if(! zot_refresh($orig_record[0],get_app()->get_channel()))
- notice( t('Refresh failed - channel is currently unavailable.') );
- goaway($a->get_baseurl(true) . '/connections/' . $contact_id);
- }
-
- if($cmd === 'block') {
- if(abook_toggle_flag($orig_record[0],ABOOK_FLAG_BLOCKED))
- info((($orig_record[0]['abook_flags'] & ABOOK_FLAG_BLOCKED)
- ? t('Channel has been unblocked')
- : t('Channel has been blocked')) . EOL );
- else
- notice(t('Unable to set address book parameters.') . EOL);
- goaway($a->get_baseurl(true) . '/connections/' . $contact_id);
- }
-
- if($cmd === 'ignore') {
- if(abook_toggle_flag($orig_record[0],ABOOK_FLAG_IGNORED))
- info((($orig_record[0]['abook_flags'] & ABOOK_FLAG_IGNORED)
- ? t('Channel has been unignored')
- : t('Channel has been ignored')) . EOL );
- else
- notice(t('Unable to set address book parameters.') . EOL);
- goaway($a->get_baseurl(true) . '/connections/' . $contact_id);
- }
-
- if($cmd === 'archive') {
- if(abook_toggle_flag($orig_record[0],ABOOK_FLAG_ARCHIVED))
- info((($orig_record[0]['abook_flags'] & ABOOK_FLAG_ARCHIVED)
- ? t('Channel has been unarchived')
- : t('Channel has been archived')) . EOL );
- else
- notice(t('Unable to set address book parameters.') . EOL);
- goaway($a->get_baseurl(true) . '/connections/' . $contact_id);
- }
-
- if($cmd === 'hide') {
- if(abook_toggle_flag($orig_record[0],ABOOK_FLAG_HIDDEN))
- info((($orig_record[0]['abook_flags'] & ABOOK_FLAG_HIDDEN)
- ? t('Channel has been unhidden')
- : t('Channel has been hidden')) . EOL );
- else
- notice(t('Unable to set address book parameters.') . EOL);
- goaway($a->get_baseurl(true) . '/connections/' . $contact_id);
- }
-
- // We'll prevent somebody from unapproving a contact.
-
- if($cmd === 'approve') {
- if($orig_record[0]['abook_flags'] & ABOOK_FLAG_PENDING) {
- if(abook_toggle_flag($orig_record[0],ABOOK_FLAG_PENDING))
- info((($orig_record[0]['abook_flags'] & ABOOK_FLAG_PENDING)
- ? t('Channel has been approved')
- : t('Channel has been unapproved')) . EOL );
- else
- notice(t('Unable to set address book parameters.') . EOL);
- }
- goaway($a->get_baseurl(true) . '/connections/' . $contact_id);
- }
-
-
- if($cmd === 'drop') {
-
- require_once('include/Contact.php');
-// FIXME
-// terminate_friendship($a->get_channel(),$orig_record[0]);
-
- contact_remove(local_user(), $orig_record[0]['abook_id']);
- info( t('Contact has been removed.') . EOL );
- if(x($_SESSION,'return_url'))
- goaway($a->get_baseurl(true) . '/' . $_SESSION['return_url']);
- goaway($a->get_baseurl(true) . '/contacts');
-
- }
- }
-
- if((x($a->data,'abook')) && (is_array($a->data['abook']))) {
-
- $contact_id = $a->data['abook']['abook_id'];
- $contact = $a->data['abook'];
-
-
- $tabs = array(
-
- array(
- 'label' => t('View Profile'),
- 'url' => $a->get_baseurl(true) . '/chanview/?f=&cid=' . $contact['abook_id'],
- 'sel' => '',
- 'title' => sprintf( t('View %s\'s profile'), $contact['xchan_name']),
- ),
-
- array(
- 'label' => t('Refresh Permissions'),
- 'url' => $a->get_baseurl(true) . '/connections/' . $contact['abook_id'] . '/refresh',
- 'sel' => '',
- 'title' => t('Fetch updated permissions'),
- ),
-
- array(
- 'label' => (($contact['abook_flags'] & ABOOK_FLAG_BLOCKED) ? t('Unblock') : t('Block')),
- 'url' => $a->get_baseurl(true) . '/connections/' . $contact['abook_id'] . '/block',
- 'sel' => (($contact['abook_flags'] & ABOOK_FLAG_BLOCKED) ? 'active' : ''),
- 'title' => t('Block or Unblock this connection'),
- ),
-
- array(
- 'label' => (($contact['abook_flags'] & ABOOK_FLAG_IGNORED) ? t('Unignore') : t('Ignore')),
- 'url' => $a->get_baseurl(true) . '/connections/' . $contact['abook_id'] . '/ignore',
- 'sel' => (($contact['abook_flags'] & ABOOK_FLAG_IGNORED) ? 'active' : ''),
- 'title' => t('Ignore or Unignore this connection'),
- ),
- array(
- 'label' => (($contact['abook_flags'] & ABOOK_FLAG_ARCHIVED) ? t('Unarchive') : t('Archive')),
- 'url' => $a->get_baseurl(true) . '/connections/' . $contact['abook_id'] . '/archive',
- 'sel' => (($contact['abook_flags'] & ABOOK_FLAG_ARCHIVED) ? 'active' : ''),
- 'title' => t('Archive or Unarchive this connection'),
- ),
- array(
- 'label' => (($contact['abook_flags'] & ABOOK_FLAG_HIDDEN) ? t('Unhide') : t('Hide')),
- 'url' => $a->get_baseurl(true) . '/connections/' . $contact['abook_id'] . '/hide',
- 'sel' => (($contact['abook_flags'] & ABOOK_FLAG_HIDDEN) ? 'active' : ''),
- 'title' => t('Hide or Unhide this connection'),
- ),
-
- array(
- 'label' => t('Delete'),
- 'url' => $a->get_baseurl(true) . '/connections/' . $contact['abook_id'] . '/drop',
- 'sel' => '',
- 'title' => t('Delete this connection'),
- ),
-
- );
-
- $self = false;
-
- if(! ($contact['abook_flags'] & ABOOK_FLAG_SELF)) {
- $tab_tpl = get_markup_template('common_tabs.tpl');
- $t = replace_macros($tab_tpl, array('$tabs'=>$tabs));
- }
- else
- $self = true;
-
- $a->page['htmlhead'] .= replace_macros(get_markup_template('contact_head.tpl'), array(
- '$baseurl' => $a->get_baseurl(true),
- '$editselect' => $editselect
- ));
-
- require_once('include/contact_selectors.php');
-
- $tpl = get_markup_template("abook_edit.tpl");
-
- if(feature_enabled(local_user(),'affinity')) {
-
- $slider_tpl = get_markup_template('contact_slider.tpl');
- $slide = replace_macros($slider_tpl,array(
- '$me' => t('Me'),
- '$val' => $contact['abook_closeness'],
- '$intimate' => t('Best Friends'),
- '$friends' => t('Friends'),
- '$oldfriends' => t('Former Friends'),
- '$acquaintances' => t('Acquaintances'),
- '$world' => t('Unknown')
- ));
- }
-
- $perms = array();
- $channel = $a->get_channel();
-
- $global_perms = get_perms();
- $existing = get_all_perms(local_user(),$contact);
-
- $unapproved = array('pending', t('Approve this connection'), '', t('Accept connection to allow communication'));
-
- foreach($global_perms as $k => $v) {
- $perms[] = array('perms_' . $k, $v[3], (($contact['abook_their_perms'] & $v[1]) ? "1" : ""),((($contact['abook_my_perms'] & $v[1]) || $existing[$k]) ? "1" : ""), $v[1], (($channel[$v[0]] == PERMS_SPECIFIC) ? '' : '1'), $v[4]);
- }
-
- $o .= replace_macros($tpl,array(
-
- '$header' => (($self) ? t('Automatic Permissions Settings') : sprintf( t('Connections: settings for %s'),$contact['xchan_name'])),
- '$addr' => $contact['xchan_addr'],
- '$notself' => (($self) ? '' : '1'),
- '$self' => (($self) ? '1' : ''),
- '$autolbl' => t('When receiving a channel introduction, any permissions provided here will be applied to the new connection automatically and the introduction approved. Leave this page if you do not wish to use this feature.'),
- '$viewprof' => t('View Profile'),
- '$lbl_slider' => t('Slide to adjust your degree of friendship'),
- '$slide' => $slide,
- '$tabs' => $t,
- '$tab_str' => $tab_str,
- '$is_pending' => (($contact['abook_flags'] & ABOOK_FLAG_PENDING) ? 1 : ''),
- '$unapproved' => $unapproved,
- '$approve' => t('Approve this connection'),
- '$noperms' => (((! $self) && (! $contact['abook_my_perms'])) ? t('Connection has no permissions!') : ''),
- '$submit' => t('Submit'),
- '$lbl_vis1' => t('Profile Visibility'),
- '$lbl_vis2' => sprintf( t('Please choose the profile you would like to display to %s when viewing your profile securely.'), $contact['name']),
- '$lbl_info1' => t('Contact Information / Notes'),
- '$infedit' => t('Edit contact notes'),
- '$close' => $contact['abook_closeness'],
- '$them' => t('Their Settings'),
- '$me' => t('My Settings'),
- '$perms' => $perms,
- '$forum' => t('Forum Members'),
- '$soapbox' => t('Soapbox'),
- '$full' => t('Full Sharing'),
- '$cautious' => t('Cautious Sharing'),
- '$follow' => t('Follow Only'),
- '$permlbl' => t('Permissions'),
- '$advanced' => t('Advanced Permissions'),
- '$quick' => t('Quick Links'),
- '$common_link' => $a->get_baseurl(true) . '/common/loc/' . local_user() . '/' . $contact['id'],
- '$all_friends' => $all_friends,
- '$relation_text' => $relation_text,
- '$visit' => sprintf( t('Visit %s\'s profile - %s'),$contact['xchan_name'],$contact['xchan_url']),
- '$blockunblock' => t('Block/Unblock contact'),
- '$ignorecont' => t('Ignore contact'),
- '$lblcrepair' => t("Repair URL settings"),
- '$lblrecent' => t('View conversations'),
- '$lblsuggest' => $lblsuggest,
- '$delete' => t('Delete contact'),
- '$poll_interval' => contact_poll_interval($contact['priority'],(! $poll_enabled)),
- '$poll_enabled' => $poll_enabled,
- '$lastupdtext' => t('Last update:'),
- '$lost_contact' => $lost_contact,
- '$updpub' => t('Update public posts'),
- '$last_update' => $last_update,
- '$udnow' => t('Update now'),
-// '$profile_select' => contact_profile_assign($contact['profile_id'],(($contact['network'] !== NETWORK_DFRN) ? true : false)),
- '$contact_id' => $contact['abook_id'],
- '$block_text' => (($contact['blocked']) ? t('Unblock') : t('Block') ),
- '$ignore_text' => (($contact['readonly']) ? t('Unignore') : t('Ignore') ),
- '$blocked' => (($contact['blocked']) ? t('Currently blocked') : ''),
- '$ignored' => (($contact['readonly']) ? t('Currently ignored') : ''),
- '$archived' => (($contact['archive']) ? t('Currently archived') : ''),
- '$pending' => (($contact['archive']) ? t('Currently pending') : ''),
- '$hidden' => array('hidden', t('Hide this contact from others'), ($contact['hidden'] == 1), t('Replies/likes to your public posts <strong>may</strong> still be visible')),
- '$photo' => $contact['photo'],
- '$name' => $contact['name'],
- '$dir_icon' => $dir_icon,
- '$alt_text' => $alt_text,
- '$sparkle' => $sparkle,
- '$url' => $url
-
- ));
-
- $arr = array('contact' => $contact,'output' => $o);
-
- call_hooks('contact_edit', $arr);
-
- return $arr['output'];
-
+ return login();
}
$blocked = false;
@@ -469,6 +208,7 @@ function connections_content(&$a) {
$search_flags = ABOOK_FLAG_PENDING;
$head = t('New');
$pending = true;
+ nav_set_selected('intros');
break;
case 'all':
@@ -560,9 +300,10 @@ function connections_content(&$a) {
$r = q("SELECT COUNT(abook.abook_id) AS total FROM abook left join xchan on abook.abook_xchan = xchan.xchan_hash
- where abook_channel = %d and not (abook_flags & %d) $sql_extra $sql_extra2 ",
+ where abook_channel = %d and not (abook_flags & %d) and not (xchan_flags & %d ) $sql_extra $sql_extra2 ",
intval(local_user()),
- intval(ABOOK_FLAG_SELF)
+ intval(ABOOK_FLAG_SELF),
+ intval(XCHAN_FLAGS_DELETED)
);
if(count($r)) {
$a->set_pager_total($r[0]['total']);
@@ -570,9 +311,10 @@ function connections_content(&$a) {
}
$r = q("SELECT abook.*, xchan.* FROM abook left join xchan on abook.abook_xchan = xchan.xchan_hash
- WHERE abook_channel = %d and not (abook_flags & %d) $sql_extra $sql_extra2 ORDER BY xchan_name LIMIT %d , %d ",
+ WHERE abook_channel = %d and not (abook_flags & %d) and not ( xchan_flags & %d) $sql_extra $sql_extra2 ORDER BY xchan_name LIMIT %d , %d ",
intval(local_user()),
intval(ABOOK_FLAG_SELF),
+ intval(XCHAN_FLAGS_DELETED),
intval($a->pager['start']),
intval($a->pager['itemspage'])
);
@@ -582,26 +324,23 @@ function connections_content(&$a) {
if(count($r)) {
foreach($r as $rr) {
-
- $contacts[] = array(
- 'img_hover' => sprintf( t('%1$s [%2$s]'),$rr['xchan_name'],$rr['xchan_url']),
- 'edit_hover' => t('Edit contact'),
- 'photo_menu' => contact_photo_menu($rr),
- 'id' => $rr['abook_id'],
- 'alt_text' => $alt_text,
- 'dir_icon' => $dir_icon,
- 'thumb' => $rr['xchan_photo_m'],
- 'name' => $rr['xchan_name'],
- 'username' => $rr['xchan_name'],
- 'sparkle' => $sparkle,
- 'edit' => z_root() . '/connections/' . $rr['abook_id'],
- 'url' => $rr['xchan_url'],
- 'network' => network_to_name($rr['network']),
- );
+ if($rr['xchan_url']) {
+ $contacts[] = array(
+ 'img_hover' => sprintf( t('%1$s [%2$s]'),$rr['xchan_name'],$rr['xchan_url']),
+ 'edit_hover' => t('Edit contact'),
+ 'id' => $rr['abook_id'],
+ 'alt_text' => $alt_text,
+ 'dir_icon' => $dir_icon,
+ 'thumb' => $rr['xchan_photo_m'],
+ 'name' => $rr['xchan_name'],
+ 'username' => $rr['xchan_name'],
+ 'sparkle' => $sparkle,
+ 'link' => z_root() . '/connedit/' . $rr['abook_id'],
+ 'url' => $rr['xchan_url'],
+ 'network' => network_to_name($rr['network']),
+ );
+ }
}
-
-
-
}
diff --git a/mod/connedit.php b/mod/connedit.php
new file mode 100644
index 000000000..e2d4b861c
--- /dev/null
+++ b/mod/connedit.php
@@ -0,0 +1,497 @@
+<?php
+
+require_once('include/Contact.php');
+require_once('include/socgraph.php');
+require_once('include/contact_selectors.php');
+require_once('include/group.php');
+require_once('include/contact_widgets.php');
+require_once('include/zot.php');
+require_once('include/widgets.php');
+
+function connedit_init(&$a) {
+
+ if(! local_user())
+ return;
+
+ if((argc() == 2) && intval(argv(1))) {
+ $r = q("SELECT abook.*, xchan.*
+ FROM abook left join xchan on abook_xchan = xchan_hash
+ WHERE abook_channel = %d and abook_id = %d LIMIT 1",
+ intval(local_user()),
+ intval(argv(1))
+ );
+ if($r) {
+ $a->poi = $r[0];
+ }
+ }
+
+ $channel = $a->get_channel();
+ if($channel)
+ head_set_icon($channel['xchan_photo_s']);
+
+}
+
+function connedit_post(&$a) {
+
+ if(! local_user())
+ return;
+
+ $contact_id = intval(argv(1));
+ if(! $contact_id)
+ return;
+
+ $orig_record = q("SELECT * FROM abook WHERE abook_id = %d AND abook_channel = %d LIMIT 1",
+ intval($contact_id),
+ intval(local_user())
+ );
+
+ if(! $orig_record) {
+ notice( t('Could not access contact record.') . EOL);
+ goaway($a->get_baseurl(true) . '/connections');
+ return; // NOTREACHED
+ }
+
+ call_hooks('contact_edit_post', $_POST);
+
+ $profile_id = $_POST['profile-assign'];
+ if($profile_id) {
+ $r = q("SELECT profile_guid FROM profile WHERE profile_guid = '%s' AND `uid` = %d LIMIT 1",
+ dbesc($profile_id),
+ intval(local_user())
+ );
+ if(! count($r)) {
+ notice( t('Could not locate selected profile.') . EOL);
+ return;
+ }
+ }
+
+ $hidden = intval($_POST['hidden']);
+
+ $priority = intval($_POST['poll']);
+ if($priority > 5 || $priority < 0)
+ $priority = 0;
+
+ $closeness = intval($_POST['closeness']);
+ if($closeness < 0)
+ $closeness = 99;
+
+ $abook_my_perms = 0;
+
+ foreach($_POST as $k => $v) {
+ if(strpos($k,'perms_') === 0) {
+ $abook_my_perms += $v;
+ }
+ }
+
+ $abook_flags = $orig_record[0]['abook_flags'];
+ $new_friend = false;
+
+ if(($_REQUEST['pending']) && ($abook_flags & ABOOK_FLAG_PENDING)) {
+ $abook_flags = ( $abook_flags ^ ABOOK_FLAG_PENDING );
+ $new_friend = true;
+ }
+
+ $r = q("UPDATE abook SET abook_profile = '%s', abook_my_perms = %d , abook_closeness = %d, abook_flags = %d
+ where abook_id = %d AND abook_channel = %d LIMIT 1",
+ dbesc($profile_id),
+ intval($abook_my_perms),
+ intval($closeness),
+ intval($abook_flags),
+ intval($contact_id),
+ intval(local_user())
+ );
+ if($r)
+ info( t('Connection updated.') . EOL);
+ else
+ notice( t('Failed to update connection record.') . EOL);
+
+ if($a->poi && $a->poi['abook_my_perms'] != $abook_my_perms
+ && (! ($a->poi['abook_flags'] & ABOOK_FLAG_SELF))) {
+ proc_run('php', 'include/notifier.php', 'permission_update', $contact_id);
+ }
+
+ if($new_friend) {
+ $channel = $a->get_channel();
+ $default_group = $channel['channel_default_group'];
+ if($default_group) {
+ require_once('include/group.php');
+ $g = group_rec_byhash(local_user(),$default_group);
+ if($g)
+ group_add_member(local_user(),'',$a->poi['abook_xchan'],$g['id']);
+ }
+
+
+
+ // Check if settings permit ("post new friend activity" is allowed, and
+ // friends in general or this friend in particular aren't hidden)
+ // and send out a new friend activity
+ // TODO
+
+ // pull in a bit of content if there is any to pull in
+ proc_run('php','include/onepoll.php',$contact_id);
+
+ }
+
+ // Refresh the structure in memory with the new data
+
+ $r = q("SELECT abook.*, xchan.*
+ FROM abook left join xchan on abook_xchan = xchan_hash
+ WHERE abook_channel = %d and abook_id = %d LIMIT 1",
+ intval(local_user()),
+ intval($contact_id)
+ );
+ if($r) {
+ $a->poi = $r[0];
+ }
+
+ if($new_friend) {
+ $arr = array('channel_id' => local_user(), 'abook' => $a->poi);
+ call_hooks('accept_follow', $arr);
+ }
+
+ connedit_clone($a);
+
+ return;
+
+}
+
+function connedit_clone(&$a) {
+
+ if(! $a->poi)
+ return;
+ $clone = $a->poi;
+
+ unset($clone['abook_id']);
+ unset($clone['abook_account']);
+ unset($clone['abook_channel']);
+
+ build_sync_packet(0 /* use the current local_user */, array('abook' => array($clone)));
+}
+
+
+function connedit_content(&$a) {
+
+ $sort_type = 0;
+ $o = '';
+
+
+ if(! local_user()) {
+ notice( t('Permission denied.') . EOL);
+ return login();
+ }
+
+ if(argc() == 3) {
+
+ $contact_id = intval(argv(1));
+ if(! $contact_id)
+ return;
+
+ $cmd = argv(2);
+
+ $orig_record = q("SELECT abook.*, xchan.* FROM abook left join xchan on abook_xchan = xchan_hash
+ WHERE abook_id = %d AND abook_channel = %d AND NOT ( abook_flags & %d ) and not ( abook_flags & %d ) LIMIT 1",
+ intval($contact_id),
+ intval(local_user()),
+ intval(ABOOK_FLAG_SELF),
+ // allow drop even if pending, just duplicate the self query
+ intval(($cmd === 'drop') ? ABOOK_FLAG_SELF : ABOOK_FLAG_PENDING)
+ );
+
+ if(! count($orig_record)) {
+ notice( t('Could not access address book record.') . EOL);
+ goaway($a->get_baseurl(true) . '/connections');
+ }
+
+ if($cmd === 'update') {
+
+ // pull feed and consume it, which should subscribe to the hub.
+ proc_run('php',"include/poller.php","$contact_id");
+ goaway($a->get_baseurl(true) . '/connedit/' . $contact_id);
+
+ }
+
+ if($cmd === 'refresh') {
+ if(! zot_refresh($orig_record[0],get_app()->get_channel()))
+ notice( t('Refresh failed - channel is currently unavailable.') );
+ goaway($a->get_baseurl(true) . '/connedit/' . $contact_id);
+ }
+
+ if($cmd === 'block') {
+ if(abook_toggle_flag($orig_record[0],ABOOK_FLAG_BLOCKED)) {
+ info((($orig_record[0]['abook_flags'] & ABOOK_FLAG_BLOCKED)
+ ? t('Channel has been unblocked')
+ : t('Channel has been blocked')) . EOL );
+ connedit_clone($a);
+ }
+ else
+ notice(t('Unable to set address book parameters.') . EOL);
+ goaway($a->get_baseurl(true) . '/connedit/' . $contact_id);
+ }
+
+ if($cmd === 'ignore') {
+ if(abook_toggle_flag($orig_record[0],ABOOK_FLAG_IGNORED)) {
+ info((($orig_record[0]['abook_flags'] & ABOOK_FLAG_IGNORED)
+ ? t('Channel has been unignored')
+ : t('Channel has been ignored')) . EOL );
+ connedit_clone($a);
+ }
+ else
+ notice(t('Unable to set address book parameters.') . EOL);
+ goaway($a->get_baseurl(true) . '/connedit/' . $contact_id);
+ }
+
+ if($cmd === 'archive') {
+ if(abook_toggle_flag($orig_record[0],ABOOK_FLAG_ARCHIVED)) {
+ info((($orig_record[0]['abook_flags'] & ABOOK_FLAG_ARCHIVED)
+ ? t('Channel has been unarchived')
+ : t('Channel has been archived')) . EOL );
+ connedit_clone($a);
+ }
+ else
+ notice(t('Unable to set address book parameters.') . EOL);
+ goaway($a->get_baseurl(true) . '/connedit/' . $contact_id);
+ }
+
+ if($cmd === 'hide') {
+ if(abook_toggle_flag($orig_record[0],ABOOK_FLAG_HIDDEN)) {
+ info((($orig_record[0]['abook_flags'] & ABOOK_FLAG_HIDDEN)
+ ? t('Channel has been unhidden')
+ : t('Channel has been hidden')) . EOL );
+ connedit_clone($a);
+ }
+ else
+ notice(t('Unable to set address book parameters.') . EOL);
+ goaway($a->get_baseurl(true) . '/connedit/' . $contact_id);
+ }
+
+ // We'll prevent somebody from unapproving a contact.
+
+ if($cmd === 'approve') {
+ if($orig_record[0]['abook_flags'] & ABOOK_FLAG_PENDING) {
+ if(abook_toggle_flag($orig_record[0],ABOOK_FLAG_PENDING)) {
+ info((($orig_record[0]['abook_flags'] & ABOOK_FLAG_PENDING)
+ ? t('Channel has been approved')
+ : t('Channel has been unapproved')) . EOL );
+ connedit_clone($a);
+ }
+ else
+ notice(t('Unable to set address book parameters.') . EOL);
+ }
+ goaway($a->get_baseurl(true) . '/connedit/' . $contact_id);
+ }
+
+
+ if($cmd === 'drop') {
+
+ require_once('include/Contact.php');
+// FIXME
+// terminate_friendship($a->get_channel(),$orig_record[0]);
+
+ contact_remove(local_user(), $orig_record[0]['abook_id']);
+// FIXME - send to clones
+ info( t('Contact has been removed.') . EOL );
+ if(x($_SESSION,'return_url'))
+ goaway($a->get_baseurl(true) . '/' . $_SESSION['return_url']);
+ goaway($a->get_baseurl(true) . '/contacts');
+
+ }
+ }
+
+ if($a->poi) {
+
+ $contact_id = $a->poi['abook_id'];
+ $contact = $a->poi;
+
+
+ $tabs = array(
+
+ array(
+ 'label' => t('View Profile'),
+ 'url' => $a->get_baseurl(true) . '/chanview/?f=&cid=' . $contact['abook_id'],
+ 'sel' => '',
+ 'title' => sprintf( t('View %s\'s profile'), $contact['xchan_name']),
+ ),
+
+ array(
+ 'label' => t('Refresh Permissions'),
+ 'url' => $a->get_baseurl(true) . '/connedit/' . $contact['abook_id'] . '/refresh',
+ 'sel' => '',
+ 'title' => t('Fetch updated permissions'),
+ ),
+
+ array(
+ 'label' => t('Recent Activity'),
+ 'url' => $a->get_baseurl(true) . '/network/?f=&cid=' . $contact['abook_id'],
+ 'sel' => '',
+ 'title' => t('View recent posts and comments'),
+ ),
+
+ array(
+ 'label' => (($contact['abook_flags'] & ABOOK_FLAG_BLOCKED) ? t('Unblock') : t('Block')),
+ 'url' => $a->get_baseurl(true) . '/connedit/' . $contact['abook_id'] . '/block',
+ 'sel' => (($contact['abook_flags'] & ABOOK_FLAG_BLOCKED) ? 'active' : ''),
+ 'title' => t('Block or Unblock this connection'),
+ ),
+
+ array(
+ 'label' => (($contact['abook_flags'] & ABOOK_FLAG_IGNORED) ? t('Unignore') : t('Ignore')),
+ 'url' => $a->get_baseurl(true) . '/connedit/' . $contact['abook_id'] . '/ignore',
+ 'sel' => (($contact['abook_flags'] & ABOOK_FLAG_IGNORED) ? 'active' : ''),
+ 'title' => t('Ignore or Unignore this connection'),
+ ),
+ array(
+ 'label' => (($contact['abook_flags'] & ABOOK_FLAG_ARCHIVED) ? t('Unarchive') : t('Archive')),
+ 'url' => $a->get_baseurl(true) . '/connedit/' . $contact['abook_id'] . '/archive',
+ 'sel' => (($contact['abook_flags'] & ABOOK_FLAG_ARCHIVED) ? 'active' : ''),
+ 'title' => t('Archive or Unarchive this connection'),
+ ),
+ array(
+ 'label' => (($contact['abook_flags'] & ABOOK_FLAG_HIDDEN) ? t('Unhide') : t('Hide')),
+ 'url' => $a->get_baseurl(true) . '/connedit/' . $contact['abook_id'] . '/hide',
+ 'sel' => (($contact['abook_flags'] & ABOOK_FLAG_HIDDEN) ? 'active' : ''),
+ 'title' => t('Hide or Unhide this connection'),
+ ),
+
+ array(
+ 'label' => t('Delete'),
+ 'url' => $a->get_baseurl(true) . '/connedit/' . $contact['abook_id'] . '/drop',
+ 'sel' => '',
+ 'title' => t('Delete this connection'),
+ ),
+
+ );
+
+ $self = false;
+
+ if(! ($contact['abook_flags'] & ABOOK_FLAG_SELF)) {
+ $tab_tpl = get_markup_template('common_tabs.tpl');
+ $t = replace_macros($tab_tpl, array('$tabs'=>$tabs));
+ }
+ else
+ $self = true;
+
+ $a->page['htmlhead'] .= replace_macros(get_markup_template('contact_head.tpl'), array(
+ '$baseurl' => $a->get_baseurl(true),
+ '$editselect' => $editselect
+ ));
+
+ require_once('include/contact_selectors.php');
+
+ $tpl = get_markup_template("abook_edit.tpl");
+
+ if(feature_enabled(local_user(),'affinity')) {
+
+ $slider_tpl = get_markup_template('contact_slider.tpl');
+ $slide = replace_macros($slider_tpl,array(
+ '$me' => t('Me'),
+ '$val' => (($contact['abook_closeness']) ? $contact['abook_closeness'] : 99),
+ '$intimate' => t('Best Friends'),
+ '$friends' => t('Friends'),
+ '$oldfriends' => t('Former Friends'),
+ '$acquaintances' => t('Acquaintances'),
+ '$world' => t('Unknown')
+ ));
+ }
+
+ $perms = array();
+ $channel = $a->get_channel();
+
+ $global_perms = get_perms();
+ $existing = get_all_perms(local_user(),$contact['abook_xchan']);
+
+ $unapproved = array('pending', t('Approve this connection'), '', t('Accept connection to allow communication'));
+
+ foreach($global_perms as $k => $v) {
+ $thisperm = (($contact['abook_my_perms'] & $v[1]) ? "1" : '');
+
+ // For auto permissions (when $self is true) we don't want to look at existing
+ // permissions because they are enabled for the channel owner
+
+ if((! $self) && ($existing[$k]))
+ $thisperm = "1";
+
+ $perms[] = array('perms_' . $k, $v[3], (($contact['abook_their_perms'] & $v[1]) ? "1" : ""),$thisperm, $v[1], (($channel[$v[0]] == PERMS_SPECIFIC) ? '' : '1'), $v[4]);
+ }
+
+ $o .= replace_macros($tpl,array(
+
+ '$header' => (($self) ? t('Automatic Permissions Settings') : sprintf( t('Connections: settings for %s'),$contact['xchan_name'])),
+ '$addr' => $contact['xchan_addr'],
+ '$notself' => (($self) ? '' : '1'),
+ '$self' => (($self) ? '1' : ''),
+ '$autolbl' => t('When receiving a channel introduction, any permissions provided here will be applied to the new connection automatically and the introduction approved. Leave this page if you do not wish to use this feature.'),
+ '$viewprof' => t('View Profile'),
+ '$lbl_slider' => t('Slide to adjust your degree of friendship'),
+ '$slide' => $slide,
+ '$tabs' => $t,
+ '$tab_str' => $tab_str,
+ '$is_pending' => (($contact['abook_flags'] & ABOOK_FLAG_PENDING) ? 1 : ''),
+ '$unapproved' => $unapproved,
+ '$inherited' => t('inherited'),
+ '$approve' => t('Approve this connection'),
+ '$noperms' => (((! $self) && (! $contact['abook_my_perms'])) ? t('Connection has no individual permissions!') : ''),
+ '$noperm_desc' => (((! $self) && (! $contact['abook_my_perms'])) ? t('This may be appropriate based on your <a href="settings">privacy settings</a>, though you may wish to review the "Advanced Permissions".') : ''),
+ '$submit' => t('Submit'),
+ '$lbl_vis1' => t('Profile Visibility'),
+ '$lbl_vis2' => sprintf( t('Please choose the profile you would like to display to %s when viewing your profile securely.'), $contact['xchan_name']),
+ '$lbl_info1' => t('Contact Information / Notes'),
+ '$infedit' => t('Edit contact notes'),
+ '$close' => $contact['abook_closeness'],
+ '$them' => t('Their Settings'),
+ '$me' => t('My Settings'),
+ '$perms' => $perms,
+ '$forum' => t('Forum Members'),
+ '$soapbox' => t('Soapbox'),
+ '$full' => t('Full Sharing'),
+ '$cautious' => t('Cautious Sharing'),
+ '$follow' => t('Follow Only'),
+ '$permlbl' => t('Individual Permissions'),
+ '$permnote' => t('Some permissions may be inherited from your channel <a href="settings">privacy settings</a>, which have higher priority. Changing those inherited settings on this page will have no effect.'),
+ '$advanced' => t('Advanced Permissions'),
+ '$quick' => t('Quick Links'),
+ '$common_link' => $a->get_baseurl(true) . '/common/loc/' . local_user() . '/' . $contact['id'],
+ '$all_friends' => $all_friends,
+ '$relation_text' => $relation_text,
+ '$visit' => sprintf( t('Visit %s\'s profile - %s'),$contact['xchan_name'],$contact['xchan_url']),
+ '$blockunblock' => t('Block/Unblock contact'),
+ '$ignorecont' => t('Ignore contact'),
+ '$lblcrepair' => t("Repair URL settings"),
+ '$lblrecent' => t('View conversations'),
+ '$lblsuggest' => $lblsuggest,
+ '$delete' => t('Delete contact'),
+ '$poll_interval' => contact_poll_interval($contact['priority'],(! $poll_enabled)),
+ '$poll_enabled' => $poll_enabled,
+ '$lastupdtext' => t('Last update:'),
+ '$lost_contact' => $lost_contact,
+ '$updpub' => t('Update public posts'),
+ '$last_update' => relative_date($contact['abook_connected']),
+ '$udnow' => t('Update now'),
+ '$profile_select' => contact_profile_assign($contact['abook_profile']),
+ '$multiprofs' => feature_enabled(local_user(),'multi_profiles'),
+ '$contact_id' => $contact['abook_id'],
+ '$block_text' => (($contact['blocked']) ? t('Unblock') : t('Block') ),
+ '$ignore_text' => (($contact['readonly']) ? t('Unignore') : t('Ignore') ),
+ '$blocked' => (($contact['blocked']) ? t('Currently blocked') : ''),
+ '$ignored' => (($contact['readonly']) ? t('Currently ignored') : ''),
+ '$archived' => (($contact['archive']) ? t('Currently archived') : ''),
+ '$pending' => (($contact['archive']) ? t('Currently pending') : ''),
+ '$hidden' => array('hidden', t('Hide this contact from others'), ($contact['hidden'] == 1), t('Replies/likes to your public posts <strong>may</strong> still be visible')),
+ '$photo' => $contact['photo'],
+ '$name' => $contact['name'],
+ '$dir_icon' => $dir_icon,
+ '$alt_text' => $alt_text,
+ '$sparkle' => $sparkle,
+ '$url' => $url
+
+ ));
+
+ $arr = array('contact' => $contact,'output' => $o);
+
+ call_hooks('contact_edit', $arr);
+
+ return $arr['output'];
+
+ }
+
+
+}
diff --git a/mod/contactgroup.php b/mod/contactgroup.php
index 4b46605a6..8b23f9f10 100644
--- a/mod/contactgroup.php
+++ b/mod/contactgroup.php
@@ -20,7 +20,7 @@ function contactgroup_content(&$a) {
if((argc() > 1) && (intval(argv(1)))) {
- $r = q("SELECT * FROM `group` WHERE `id` = %d AND `uid` = %d AND `deleted` = 0 LIMIT 1",
+ $r = q("SELECT * FROM `groups` WHERE `id` = %d AND `uid` = %d AND `deleted` = 0 LIMIT 1",
intval(argv(1)),
intval(local_user())
);
diff --git a/mod/crepair.php b/mod/crepair.php
deleted file mode 100644
index e5ece0f98..000000000
--- a/mod/crepair.php
+++ /dev/null
@@ -1,171 +0,0 @@
-<?php
-
-function crepair_init(&$a) {
- if(! local_user())
- return;
-
- $contact_id = 0;
-
- if(($a->argc == 2) && intval($a->argv[1])) {
- $contact_id = intval($a->argv[1]);
- $r = q("SELECT * FROM `contact` WHERE `uid` = %d and `id` = %d LIMIT 1",
- intval(local_user()),
- intval($contact_id)
- );
- if(! count($r)) {
- $contact_id = 0;
- }
- }
-
- if(! x($a->page,'aside'))
- $a->page['aside'] = '';
-
- if($contact_id) {
- $a->data['contact'] = $r[0];
- $o .= '<div class="vcard">';
- $o .= '<div class="fn">' . $a->data['contact']['name'] . '</div>';
- $o .= '<div id="profile-photo-wrapper"><img class="photo" style="width: 175px; height: 175px;" src="' . $a->data['contact']['photo'] . '" alt="' . $a->data['contact']['name'] . '" /></div>';
- $o .= '</div>';
- $a->page['aside'] .= $o;
-
- }
-}
-
-
-function crepair_post(&$a) {
- if(! local_user())
- return;
-
- $cid = (($a->argc > 1) ? intval($a->argv[1]) : 0);
-
- if($cid) {
- $r = q("SELECT * FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1",
- intval($cid),
- intval(local_user())
- );
- }
-
- if(! count($r))
- return;
-
- $contact = $r[0];
-
- $name = ((x($_POST,'name')) ? $_POST['name'] : $contact['name']);
- $nick = ((x($_POST,'nick')) ? $_POST['nick'] : '');
- $url = ((x($_POST,'url')) ? $_POST['url'] : '');
- $request = ((x($_POST,'request')) ? $_POST['request'] : '');
- $confirm = ((x($_POST,'confirm')) ? $_POST['confirm'] : '');
- $notify = ((x($_POST,'notify')) ? $_POST['notify'] : '');
- $poll = ((x($_POST,'poll')) ? $_POST['poll'] : '');
- $attag = ((x($_POST,'attag')) ? $_POST['attag'] : '');
- $photo = ((x($_POST,'photo')) ? $_POST['photo'] : '');
-
- $r = q("UPDATE `contact` SET `name` = '%s', `nick` = '%s', `url` = '%s', `request` = '%s', `confirm` = '%s', `notify` = '%s', `poll` = '%s', `attag` = '%s'
- WHERE `id` = %d AND `uid` = %d LIMIT 1",
- dbesc($name),
- dbesc($nick),
- dbesc($url),
- dbesc($request),
- dbesc($confirm),
- dbesc($notify),
- dbesc($poll),
- dbesc($attag),
- intval($contact['id']),
- local_user()
- );
-
- if($photo) {
- logger('mod-crepair: updating photo from ' . $photo);
- require_once("Photo.php");
-
- $photos = import_profile_photo($photo,local_user(),$contact['id']);
-
- $x = q("UPDATE `contact` SET `photo` = '%s',
- `thumb` = '%s',
- `micro` = '%s',
- `name_date` = '%s',
- `uri_date` = '%s',
- `avatar_date` = '%s'
- WHERE `id` = %d LIMIT 1
- ",
- dbesc($photos[0]),
- dbesc($photos[1]),
- dbesc($photos[2]),
- dbesc(datetime_convert()),
- dbesc(datetime_convert()),
- dbesc(datetime_convert()),
- intval($contact['id'])
- );
- }
-
- if($r)
- info( t('Contact settings applied.') . EOL);
- else
- notice( t('Contact update failed.') . EOL);
-
-
- return;
-}
-
-
-
-function crepair_content(&$a) {
-
- if(! local_user()) {
- notice( t('Permission denied.') . EOL);
- return;
- }
-
- $cid = (($a->argc > 1) ? intval($a->argv[1]) : 0);
-
- if($cid) {
- $r = q("SELECT * FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1",
- intval($cid),
- intval(local_user())
- );
- }
-
- if(! count($r)) {
- notice( t('Contact not found.') . EOL);
- return;
- }
-
- $contact = $r[0];
-
- $msg1 = t('Repair Contact Settings');
-
- $msg2 = t('<strong>WARNING: This is highly advanced</strong> and if you enter incorrect information your communications with this contact may stop working.');
- $msg3 = t('Please use your browser \'Back\' button <strong>now</strong> if you are uncertain what to do on this page.');
-
- $o .= '<h2>' . $msg1 . '</h2>';
-
- $o .= '<div class="error-message">' . $msg2 . EOL . EOL. $msg3 . '</div>';
-
- $o .= EOL . '<a href="contacts/' . $cid . '">' . t('Return to contact editor') . '</a>' . EOL;
-
- $tpl = get_markup_template('crepair.tpl');
- $o .= replace_macros($tpl, array(
- '$label_name' => t('Name'),
- '$label_nick' => t('Account Nickname'),
- '$label_attag' => t('@Tagname - overrides Name/Nickname'),
- '$label_url' => t('Account URL'),
- '$label_request' => t('Friend Request URL'),
- '$label_confirm' => t('Friend Confirm URL'),
- '$label_notify' => t('Notification Endpoint URL'),
- '$label_poll' => t('Poll/Feed URL'),
- '$label_photo' => t('New photo from this URL'),
- '$contact_name' => $contact['name'],
- '$contact_nick' => $contact['nick'],
- '$contact_id' => $contact['id'],
- '$contact_url' => $contact['url'],
- '$request' => $contact['request'],
- '$confirm' => $contact['confirm'],
- '$notify' => $contact['notify'],
- '$poll' => $contact['poll'],
- '$contact_attag' => $contact['attag'],
- '$lbl_submit' => t('Submit')
- ));
-
- return $o;
-
-}
diff --git a/mod/directory.php b/mod/directory.php
index 21fb14bfc..53542db60 100644
--- a/mod/directory.php
+++ b/mod/directory.php
@@ -1,22 +1,14 @@
<?php
require_once('include/dir_fns.php');
+require_once('include/widgets.php');
function directory_init(&$a) {
- $a->set_pager_itemspage(60);
+ $a->set_pager_itemspage(80);
}
-function directory_aside(&$a) {
-
- if(local_user()) {
- require_once('include/contact_widgets.php');
- $a->set_widget('find_people',findpeople_widget());
- }
-}
-
-
function directory_content(&$a) {
if((get_config('system','block_public')) && (! local_user()) && (! remote_user())) {
@@ -24,6 +16,24 @@ function directory_content(&$a) {
return;
}
+ $safe_mode = 1;
+
+ $observer = get_observer_hash();
+
+ if($observer) {
+ $safe_mode = get_xconfig($observer,'directory','safe_mode');
+ }
+ if($safe_mode === false)
+ $safe_mode = 1;
+ else
+ $safe_mode = intval($safe_mode);
+
+ if(x($_REQUEST,'safe'))
+ $safe_mode = (intval($_REQUEST['safe']));
+
+
+
+
$o = '';
nav_set_selected('directory');
@@ -32,6 +42,7 @@ function directory_content(&$a) {
else
$search = ((x($_GET,'search')) ? notags(trim(rawurldecode($_GET['search']))) : '');
+ $keywords = (($_GET['keywords']) ? $_GET['keywords'] : '');
$tpl = get_markup_template('directory_header.tpl');
@@ -45,7 +56,7 @@ function directory_content(&$a) {
$directory = find_upstream_directory($dirmode);
if($directory) {
- $url = $directory['url'];
+ $url = $directory['url'] . '/dirsearch';
}
else {
$url = DIRECTORY_FALLBACK_MASTER . '/dirsearch';
@@ -53,12 +64,37 @@ function directory_content(&$a) {
}
logger('mod_directory: URL = ' . $url, LOGGER_DEBUG);
+ $contacts = array();
+
+ if(local_user()) {
+ $x = q("select abook_xchan from abook where abook_channel = %d",
+ intval(local_user())
+ );
+ if($x) {
+ foreach($x as $xx)
+ $contacts[] = $xx['abook_xchan'];
+ }
+ }
+
+
+
if($url) {
- $query = $url . '?f=' ;
+ // We might want to make the tagadelic count (&kw=) configurable or turn it off completely.
+ $numtags = get_config('system','directorytags');
+
+ $kw = ((intval($numtags)) ? $numtags : 24);
+ $query = $url . '?f=&kw=' . $kw . (($safe_mode != 1) ? '&safe=' . $safe_mode : '');
+
if($search)
- $query .= '&name=' . urlencode($search);
+ $query .= '&name=' . urlencode($search) . '&keywords=' . urlencode($search);
if(strpos($search,'@'))
$query .= '&address=' . urlencode($search);
+ if($keywords)
+ $query .= '&keywords=' . urlencode($keywords);
+
+ $sort_order = ((x($_REQUEST,'order')) ? $_REQUEST['order'] : '');
+ if($sort_order)
+ $query .= '&order=' . urlencode($sort_order);
if($a->pager['page'] != 1)
$query .= '&p=' . $a->pager['page'];
@@ -66,7 +102,7 @@ function directory_content(&$a) {
logger('mod_directory: query: ' . $query);
$x = z_fetch_url($query);
- logger('directory: return from upstream: ' . print_r($x,true));
+ logger('directory: return from upstream: ' . print_r($x,true), LOGGER_DATA);
if($x['success']) {
$t = 0;
@@ -84,7 +120,11 @@ function directory_content(&$a) {
$profile_link = chanlink_url($rr['url']);
$pdesc = (($rr['description']) ? $rr['description'] . '<br />' : '');
-
+ $connect_link = ((local_user()) ? z_root() . '/follow?f=&url=' . urlencode($rr['address']) : '');
+
+ if(in_array($rr['hash'],$contacts))
+ $connect_link = '';
+
$details = '';
if(strlen($rr['locale']))
$details .= $rr['locale'];
@@ -128,6 +168,7 @@ function directory_content(&$a) {
'id' => ++$t,
'profile_link' => $profile_link,
'photo' => $rr['photo'],
+ 'hash' => $rr['hash'],
'alttext' => $rr['name'] . ' ' . $rr['address'],
'name' => $rr['name'],
'details' => $pdesc . $details,
@@ -138,22 +179,26 @@ function directory_content(&$a) {
'marital' => $marital,
'homepage' => $homepage,
'about' => $about,
-
+ 'conn_label' => t('Connect'),
+ 'connect' => $connect_link,
);
$arr = array('contact' => $rr, 'entry' => $entry);
call_hooks('directory_item', $arr);
- $entries[] = $entry;
-
+ $entries[] = $arr['entry'];
unset($profile);
unset($location);
}
- logger('mod_directory: entries: ' . print_r($entries,true), LOGGER_DATA);
+ if($j['keywords']) {
+ $a->data['directory_keywords'] = $j['keywords'];
+ }
+
+// logger('mod_directory: entries: ' . print_r($entries,true), LOGGER_DATA);
$o .= replace_macros($tpl, array(
'$search' => $search,
@@ -166,7 +211,7 @@ function directory_content(&$a) {
));
- $o .= alt_pager($a,$j['records'], t('more'), t('back'));
+ $o .= alt_pager($a,$j['records'], t('next page'), t('previous page'));
}
else {
diff --git a/mod/dirfind.php b/mod/dirfind.php
deleted file mode 100644
index 54bbf31af..000000000
--- a/mod/dirfind.php
+++ /dev/null
@@ -1,68 +0,0 @@
-<?php
-
-function dirfind_init(&$a) {
-
- require_once('include/contact_widgets.php');
-
- if(! x($a->page,'aside'))
- $a->page['aside'] = '';
-
- $a->page['aside'] .= follow_widget();
-
- $a->page['aside'] .= findpeople_widget();
-}
-
-
-
-function dirfind_content(&$a) {
-
- $search = notags(trim($_REQUEST['search']));
-
- if(strpos($search,'@') === 0)
- $search = substr($search,1);
-
- $o = '';
-
- $o .= '<h2>' . t('People Search') . ' - ' . $search . '</h2>';
-
- if($search) {
-
- $p = (($a->pager['page'] != 1) ? '&p=' . $a->pager['page'] : '');
-
- if(strlen(get_config('system','directory_submit_url')))
- $x = fetch_url('http://dir.friendica.com/lsearch?f=' . $p . '&search=' . urlencode($search));
-
-//TODO fallback local search if global dir not available.
-// else
-// $x = post_url($a->get_baseurl() . '/lsearch', $params);
-
- $j = json_decode($x);
-
- if($j->total) {
- $a->set_pager_total($j->total);
- $a->set_pager_itemspage($j->items_page);
- }
-
- if(count($j->results)) {
-
- $tpl = get_markup_template('match.tpl');
- foreach($j->results as $jj) {
-
- $o .= replace_macros($tpl,array(
- '$url' => zid($jj->url),
- '$name' => $jj->name,
- '$photo' => $jj->photo,
- '$tags' => $jj->tags
- ));
- }
- }
- else {
- info( t('No matches') . EOL);
- }
-
- }
-
- $o .= '<div class="clear"></div>';
- $o .= paginate($a);
- return $o;
-}
diff --git a/mod/dirprofile.php b/mod/dirprofile.php
new file mode 100644
index 000000000..0cd84b910
--- /dev/null
+++ b/mod/dirprofile.php
@@ -0,0 +1,185 @@
+<?php
+
+require_once('include/dir_fns.php');
+require_once('include/bbcode.php');
+
+function dirprofile_init(&$a) {
+
+ if((get_config('system','block_public')) && (! local_user()) && (! remote_user())) {
+ notice( t('Public access denied.') . EOL);
+ return;
+ }
+
+ $hash = $_REQUEST['hash'];
+ if(! $hash)
+ return '';
+
+ $o = '';
+
+ $dirmode = intval(get_config('system','directory_mode'));
+
+ if(($dirmode == DIRECTORY_MODE_PRIMARY) || ($dirmode == DIRECTORY_MODE_STANDALONE)) {
+ $url = z_root() . '/dirsearch';
+ }
+ if(! $url) {
+ $directory = find_upstream_directory($dirmode);
+
+ if($directory) {
+ $url = $directory['url'] . '/dirsearch';
+ }
+ else {
+ $url = DIRECTORY_FALLBACK_MASTER . '/dirsearch';
+ }
+ }
+ logger('mod_directory: URL = ' . $url, LOGGER_DEBUG);
+
+ $contacts = array();
+
+ if(local_user()) {
+ $x = q("select abook_xchan from abook where abook_channel = %d",
+ intval(local_user())
+ );
+ if($x) {
+ foreach($x as $xx)
+ $contacts[] = $xx['abook_xchan'];
+ }
+ }
+
+
+
+ if($url) {
+
+ $query = $url . '?f=&hash=' . $hash;
+
+ $x = z_fetch_url($query);
+ logger('dirprofile: return from upstream: ' . print_r($x,true), LOGGER_DATA);
+
+ if($x['success']) {
+ $t = 0;
+ $j = json_decode($x['body'],true);
+ if($j) {
+
+ if($j['results']) {
+
+ $entries = array();
+
+ $photo = 'thumb';
+
+ foreach($j['results'] as $rr) {
+
+ $profile_link = chanlink_url($rr['url']);
+
+ $pdesc = (($rr['description']) ? $rr['description'] . '<br />' : '');
+
+ $qrlink = zid($rr['url']);
+ $connect_link = ((local_user()) ? z_root() . '/follow?f=&url=' . urlencode($rr['address']) : '');
+
+ if(in_array($rr['hash'],$contacts))
+ $connect_link = '';
+
+ $details = '';
+ if(strlen($rr['locale']))
+ $details .= $rr['locale'];
+ if(strlen($rr['region'])) {
+ if(strlen($rr['locale']))
+ $details .= ', ';
+ $details .= $rr['region'];
+ }
+ if(strlen($rr['country'])) {
+ if(strlen($details))
+ $details .= ', ';
+ $details .= $rr['country'];
+ }
+ if(strlen($rr['birthday'])) {
+ if(($years = age($rr['birthday'],'UTC','')) != 0)
+ $details .= '<br />' . t('Age: ') . $years ;
+ }
+ if(strlen($rr['gender']))
+ $details .= '<br />' . t('Gender: ') . $rr['gender'];
+
+ $page_type = '';
+
+ $profile = $rr;
+
+ if ((x($profile,'locale') == 1)
+ || (x($profile,'region') == 1)
+ || (x($profile,'postcode') == 1)
+ || (x($profile,'country') == 1))
+ $location = t('Location:');
+
+
+ $marital = ((x($profile,'marital') == 1) ? t('Status: ') . $profile['marital'] : False);
+ $sexual = ((x($profile,'sexual') == 1) ? t('Sexual Preference: ') . $profile['sexual'] : False);
+
+ $homepage = ((x($profile,'homepage') == 1) ? t('Homepage: ') . linkify($profile['homepage']) : False);
+ $hometown = ((x($profile,'hometown') == 1) ? t('Hometown: ') . $profile['hometown'] : False);
+
+ $about = ((x($profile,'about') == 1) ? t('About: ') . bbcode($profile['about']) : False);
+
+ $keywords = ((x($profile,'keywords')) ? $profile['keywords'] : '');
+ if($keywords) {
+ $keywords = str_replace(',',' ', $keywords);
+ $keywords = str_replace(' ',' ', $keywords);
+ $karr = explode(' ', $keywords);
+ $out = '';
+ if($karr) {
+ if(local_user()) {
+ $r = q("select keywords from profile where uid = %d and is_default = 1 limit 1",
+ intval(local_user())
+ );
+ if($r) {
+ $keywords = str_replace(',',' ', $r[0]['keywords']);
+ $keywords = str_replace(' ',' ', $keywords);
+ $marr = explode(' ', $keywords);
+ }
+ }
+ foreach($karr as $k) {
+ if(strlen($out))
+ $out .= ', ';
+ if($marr && in_arrayi($k,$marr))
+ $out .= '<strong>' . $k . '</strong>';
+ else
+ $out .= $k;
+ }
+ }
+
+ }
+ $entry = replace_macros(get_markup_template('direntry_large.tpl'), array(
+ '$id' => ++$t,
+ '$profile_link' => $profile_link,
+ '$qrlink' => $qrlink,
+ '$photo' => $rr['photo_l'],
+ '$alttext' => $rr['name'] . ' ' . $rr['address'],
+ '$name' => $rr['name'],
+ '$details' => $pdesc . $details,
+ '$profile' => $profile,
+ '$location' => $location,
+ '$gender' => $gender,
+ '$pdesc' => $pdesc,
+ '$marital' => $marital,
+ '$homepage' => $homepage,
+ '$hometown' => $hometown,
+ '$about' => $about,
+ '$kw' => (($out) ? t('Keywords: ') : ''),
+ '$keywords' => $out,
+ '$conn_label' => t('Connect'),
+ '$connect' => $connect_link,
+ ));
+
+
+ echo $entry;
+ killme();
+
+ }
+ }
+ else {
+ info( t("Not found.") . EOL);
+ }
+ }
+ }
+ }
+
+
+
+
+} \ No newline at end of file
diff --git a/mod/dirsearch.php b/mod/dirsearch.php
index 7e4323da9..59a1d448d 100644
--- a/mod/dirsearch.php
+++ b/mod/dirsearch.php
@@ -22,15 +22,42 @@ function dirsearch_content(&$a) {
json_return_and_die($ret);
}
- $name = ((x($_REQUEST,'name')) ? $_REQUEST['name'] : '');
- $address = ((x($_REQUEST,'address')) ? $_REQUEST['address'] : '');
- $locale = ((x($_REQUEST,'locale')) ? $_REQUEST['locale'] : '');
- $region = ((x($_REQUEST,'region')) ? $_REQUEST['region'] : '');
+ if(argc() > 1 && argv(1) === 'sites') {
+ $ret = list_public_sites();
+ json_return_and_die($ret);
+ }
+
+ $hash = ((x($_REQUEST['hash'])) ? $_REQUEST['hash'] : '');
+
+ $name = ((x($_REQUEST,'name')) ? $_REQUEST['name'] : '');
+ $hub = ((x($_REQUEST,'hub')) ? $_REQUEST['hub'] : '');
+ $address = ((x($_REQUEST,'address')) ? $_REQUEST['address'] : '');
+ $locale = ((x($_REQUEST,'locale')) ? $_REQUEST['locale'] : '');
+ $region = ((x($_REQUEST,'region')) ? $_REQUEST['region'] : '');
$postcode = ((x($_REQUEST,'postcode')) ? $_REQUEST['postcode'] : '');
- $country = ((x($_REQUEST,'country')) ? $_REQUEST['country'] : '');
- $gender = ((x($_REQUEST,'gender')) ? $_REQUEST['gender'] : '');
- $marital = ((x($_REQUEST,'marital')) ? $_REQUEST['marital'] : '');
+ $country = ((x($_REQUEST,'country')) ? $_REQUEST['country'] : '');
+ $gender = ((x($_REQUEST,'gender')) ? $_REQUEST['gender'] : '');
+ $marital = ((x($_REQUEST,'marital')) ? $_REQUEST['marital'] : '');
$keywords = ((x($_REQUEST,'keywords')) ? $_REQUEST['keywords'] : '');
+ $agege = ((x($_REQUEST,'agege')) ? intval($_REQUEST['agege']) : 0 );
+ $agele = ((x($_REQUEST,'agele')) ? intval($_REQUEST['agele']) : 0 );
+ $kw = ((x($_REQUEST,'kw')) ? intval($_REQUEST['kw']) : 0 );
+
+ // by default use a safe search
+ $safe = ((x($_REQUEST,'safe'))); // ? intval($_REQUEST['safe']) : 1 );
+ if ($safe === false)
+ $safe = 1;
+
+ if(array_key_exists('sync',$_REQUEST)) {
+ if($_REQUEST['sync'])
+ $sync = datetime_convert('UTC','UTC',$_REQUEST['sync']);
+ else
+ $sync = datetime_convert('UTC','UTC','2010-01-01 01:01:00');
+ }
+ else
+ $sync = false;
+
+ $sort_order = ((x($_REQUEST,'order')) ? $_REQUEST['order'] : '');
// TODO - a meta search which joins all of these things to one search string
@@ -38,6 +65,8 @@ function dirsearch_content(&$a) {
if($name)
$sql_extra .= " OR xchan_name like '" . protect_sprintf( '%' . dbesc($name) . '%' ) . "' ";
+ if($hub)
+ $sql_extra .= " OR xchan_hash in (select hubloc_hash from hubloc where hubloc_host = '" . protect_sprintf(dbesc($hub)) . "') ";
if($address)
$sql_extra .= " OR xchan_addr like '" . protect_sprintf( '%' . dbesc($address) . '%' ) . "' ";
if($city)
@@ -55,12 +84,31 @@ function dirsearch_content(&$a) {
if($keywords)
$sql_extra .= " OR xprof_keywords like '" . protect_sprintf( '%' . dbesc($keywords) . '%' ) . "' ";
- $perpage = (($_REQUEST['n']) ? $_REQUEST['n'] : 80);
- $page = (($_REQUEST['p']) ? intval($_REQUEST['p'] - 1) : 0);
- $startrec = (($page+1) * $perpage) - $perpage;
- $limit = (($_REQUEST['limit']) ? intval($_REQUEST['limit']) : 0);
+ // we only support an age range currently. You must set both agege
+ // (greater than or equal) and agele (less than or equal)
+
+ if($agele && $agege) {
+ $sql_extra .= " OR ( xprof_age <= " . intval($agele) . " ";
+ $sql_extra .= " AND xprof_age >= " . intval($agege) . ") ";
+ }
+
+
+ if($hash) {
+ $sql_extra = " AND xchan_hash = '" . dbesc($hash) . "' ";
+ }
+
+
+
+ $perpage = (($_REQUEST['n']) ? $_REQUEST['n'] : 80);
+ $page = (($_REQUEST['p']) ? intval($_REQUEST['p'] - 1) : 0);
+ $startrec = (($page+1) * $perpage) - $perpage;
+ $limit = (($_REQUEST['limit']) ? intval($_REQUEST['limit']) : 0);
$return_total = ((x($_REQUEST,'return_total')) ? intval($_REQUEST['return_total']) : 0);
+ // mtime is not currently working
+
+ $mtime = ((x($_REQUEST,'mtime')) ? datetime_convert('UTC','UTC',$_REQUEST['mtime']) : '');
+
// ok a separate tag table won't work.
// merge them into xprof
@@ -72,13 +120,22 @@ function dirsearch_content(&$a) {
$logic = ((strlen($sql_extra)) ? 0 : 1);
+ if($hash)
+ $logic = 1;
+
+ $safesql = (($safe > 0) ? " and not ( xchan_flags & " . intval(XCHAN_FLAGS_CENSORED|XCHAN_FLAGS_SELFCENSORED) . " ) " : '');
+ if($safe < 0)
+ $safesql = " and ( xchan_flags & " . intval(XCHAN_FLAGS_CENSORED|XCHAN_FLAGS_SELFCENSORED) . " ) ";
+
if($limit)
$qlimit = " LIMIT $limit ";
else {
$qlimit = " LIMIT " . intval($startrec) . " , " . intval($perpage);
if($return_total) {
- $r = q("SELECT COUNT(xchan_hash) AS `total` FROM xchan left join xprof on xchan_hash = xprof_hash where $logic $sql_extra and not ( xchan_flags & %d) ",
- intval(XCHAN_FLAGS_HIDDEN)
+ $r = q("SELECT COUNT(xchan_hash) AS `total` FROM xchan left join xprof on xchan_hash = xprof_hash where $logic $sql_extra and not ( xchan_flags & %d) and not ( xchan_flags & %d ) and not ( xchan_flags & %d ) $safesql ",
+ intval(XCHAN_FLAGS_HIDDEN),
+ intval(XCHAN_FLAGS_ORPHAN),
+ intval(XCHAN_FLAGS_DELETED)
);
if($r) {
$ret['total_items'] = $r[0]['total'];
@@ -86,11 +143,41 @@ function dirsearch_content(&$a) {
}
}
- $order = " ORDER BY `xchan_name` ASC ";
- $r = q("SELECT xchan.*, xprof.* from xchan left join xprof on xchan_hash = xprof_hash where $logic $sql_extra and not ( xchan_flags & %d ) $order $qlimit ",
- intval(XCHAN_FLAGS_HIDDEN)
- );
+ if($sort_order == 'normal')
+ $order = " order by xchan_name asc ";
+ elseif($sort_order == 'reverse')
+ $order = " order by xchan_name desc ";
+ else
+ $order = " order by xchan_name_date desc ";
+
+
+ if($sync) {
+ $spkt = array('transactions' => array());
+ $r = q("select * from updates where ud_date >= '%s' and ud_guid != '' order by ud_date desc",
+ dbesc($sync)
+ );
+ if($r) {
+ foreach($r as $rr) {
+ $flags = (($rr['ud_flags'] & UPDATE_FLAGS_DELETED) ? array('deleted') : array());
+ $spkt['transactions'][] = array(
+ 'hash' => $rr['ud_hash'],
+ 'address' => $rr['ud_addr'],
+ 'transaction_id' => $rr['ud_guid'],
+ 'timestamp' => $rr['ud_date'],
+ 'flags' => $flags
+ );
+ }
+ }
+ json_return_and_die($spkt);
+ }
+ else {
+ $r = q("SELECT xchan.*, xprof.* from xchan left join xprof on xchan_hash = xprof_hash where ( $logic $sql_extra ) and not ( xchan_flags & %d ) and not ( xchan_flags & %d ) and not ( xchan_flags & %d ) $safesql $order $qlimit ",
+ intval(XCHAN_FLAGS_HIDDEN),
+ intval(XCHAN_FLAGS_ORPHAN),
+ intval(XCHAN_FLAGS_DELETED)
+ );
+ }
$ret['page'] = $page + 1;
$ret['records'] = count($r);
@@ -104,7 +191,10 @@ function dirsearch_content(&$a) {
$entry = array();
$entry['name'] = $rr['xchan_name'];
+ $entry['hash'] = $rr['xchan_hash'];
+
$entry['url'] = $rr['xchan_url'];
+ $entry['photo_l'] = $rr['xchan_photo_l'];
$entry['photo'] = $rr['xchan_photo_m'];
$entry['address'] = $rr['xchan_addr'];
$entry['description'] = $rr['xprof_desc'];
@@ -113,8 +203,13 @@ function dirsearch_content(&$a) {
$entry['postcode'] = $rr['xprof_postcode'];
$entry['country'] = $rr['xprof_country'];
$entry['birthday'] = $rr['xprof_dob'];
+ $entry['age'] = $rr['xprof_age'];
$entry['gender'] = $rr['xprof_gender'];
$entry['marital'] = $rr['xprof_marital'];
+ $entry['sexual'] = $rr['xprof_sexual'];
+ $entry['about'] = $rr['xprof_about'];
+ $entry['homepage'] = $rr['xprof_homepage'];
+ $entry['hometown'] = $rr['xprof_hometown'];
$entry['keywords'] = $rr['xprof_keywords'];
$entries[] = $entry;
@@ -122,8 +217,56 @@ function dirsearch_content(&$a) {
}
$ret['results'] = $entries;
-
+ if($kw) {
+ $k = dir_tagadelic($kw);
+ if($k) {
+ $ret['keywords'] = array();
+ foreach($k as $kv) {
+ $ret['keywords'][] = array('term' => $kv[0],'weight' => $kv[1], 'normalise' => $kv[2]);
+ }
+ }
+ }
}
json_return_and_die($ret);
}
+
+
+function list_public_sites() {
+ $r = q("select * from site where site_access != 0 and site_register !=0 order by rand()");
+ $ret = array('success' => false);
+
+ if($r) {
+ $ret['success'] = true;
+ $ret['sites'] = array();
+ $insecure = array();
+
+ foreach($r as $rr) {
+
+ if($rr['site_access'] == ACCESS_FREE)
+ $access = 'free';
+ elseif($rr['site_access'] == ACCESS_PAID)
+ $access = 'paid';
+ elseif($rr['site_access'] == ACCESS_TIERED)
+ $access = 'tiered';
+ else
+ $access = 'private';
+
+ if($rr['site_register'] == REGISTER_OPEN)
+ $register = 'open';
+ elseif($rr['site_register'] == REGISTER_APPROVE)
+ $register = 'approve';
+ else
+ $register = 'closed';
+
+ if(strpos($rr['site_url'],'https://') !== false)
+ $ret['sites'][] = array('url' => $rr['site_url'], 'access' => $access, 'register' => $register, 'sellpage' => $rr['site_sellpage'], 'location' => $rr['site_location']);
+ else
+ $insecure[] = array('url' => $rr['site_url'], 'access' => $access, 'register' => $register, 'sellpage' => $rr['site_sellpage'], 'location' => $rr['site_location']);
+ }
+ if($insecure) {
+ $ret['sites'] = array_merge($ret['sites'],$insecure);
+ }
+ }
+ return $ret;
+}
diff --git a/mod/display.php b/mod/display.php
index 3c2172c7d..b20eb3e4f 100644
--- a/mod/display.php
+++ b/mod/display.php
@@ -3,6 +3,8 @@
function display_content(&$a, $update = 0, $load = false) {
+// logger("mod-display: update = $update load = $load");
+
if(intval(get_config('system','block_public')) && (! local_user()) && (! remote_user())) {
notice( t('Public access denied.') . EOL);
return;
@@ -17,11 +19,12 @@ function display_content(&$a, $update = 0, $load = false) {
$a->page['htmlhead'] .= replace_macros(get_markup_template('display-head.tpl'), array());
-
if(argc() > 1 && argv(1) !== 'load')
$item_hash = argv(1);
- if($_REQUEST['uri'])
- $item_hash = $_REQUEST['uri'];
+
+
+ if($_REQUEST['mid'])
+ $item_hash = $_REQUEST['mid'];
if(! $item_hash) {
@@ -32,6 +35,37 @@ function display_content(&$a, $update = 0, $load = false) {
$observer_is_owner = false;
+
+ if(local_user() && (! $update)) {
+
+ $channel = $a->get_channel();
+
+
+ $channel_acl = array(
+ 'allow_cid' => $channel['channel_allow_cid'],
+ 'allow_gid' => $channel['channel_allow_gid'],
+ 'deny_cid' => $channel['channel_deny_cid'],
+ 'deny_gid' => $channel['channel_deny_gid']
+ );
+
+ $x = array(
+ 'is_owner' => true,
+ 'allow_location' => ((intval(get_pconfig($channel['channel_id'],'system','use_browser_location'))) ? '1' : ''),
+ 'default_location' => $channel['channel_location'],
+ 'nickname' => $channel['channel_address'],
+ 'lockstate' => (($group || $cid || $channel['channel_allow_cid'] || $channel['channel_allow_gid'] || $channel['channel_deny_cid'] || $channel['channel_deny_gid']) ? 'lock' : 'unlock'),
+
+ 'acl' => populate_acl($channel_acl, false),
+ 'bang' => '',
+ 'visitor' => 'block',
+ 'profile_uid' => local_user(),
+ 'return_path' => 'channel/' . $channel['channel_address']
+ );
+
+ $o .= status_editor($a,$x);
+
+ }
+
// This page can be viewed by anybody so the query could be complicated
// First we'll see if there is a copy of the item which is owned by us - if we're logged in locally.
// If that fails (or we aren't logged in locally),
@@ -43,7 +77,7 @@ function display_content(&$a, $update = 0, $load = false) {
$target_item = null;
- $r = q("select uri, parent_uri from item where uri = '%s' limit 1",
+ $r = q("select id, uid, mid, parent_mid, item_restrict from item where mid = '%s' limit 1",
dbesc($item_hash)
);
@@ -51,11 +85,29 @@ function display_content(&$a, $update = 0, $load = false) {
$target_item = $r[0];
}
+ if($target_item['item_restrict'] & ITEM_WEBPAGE) {
+ $x = q("select * from channel where channel_id = %d limit 1",
+ intval($target_item['uid'])
+ );
+ $y = q("select * from item_id where uid = %d and service = 'WEBPAGE' and iid = %d limit 1",
+ intval($target_item['uid']),
+ intval($target_item['id'])
+ );
+ if($x && $y) {
+ goaway(z_root() . '/page/' . $x[0]['channel_address'] . '/' . $y[0]['sid']);
+ }
+ else {
+ notice( t('Page not found.') . EOL);
+ return '';
+ }
+ }
+
+
if((! $update) && (! $load)) {
$o .= '<div id="live-display"></div>' . "\r\n";
- $o .= "<script> var profile_uid = " . intval(local_user())
+ $o .= "<script> var profile_uid = " . ((intval(local_user())) ? local_user() : (-1))
. "; var netargs = '?f='; var profile_page = " . $a->pager['page'] . "; </script>\r\n";
$a->page['htmlhead'] .= replace_macros(get_markup_template("build_query.tpl"),array(
@@ -73,13 +125,14 @@ function display_content(&$a, $update = 0, $load = false) {
'$nouveau' => '0',
'$wall' => '0',
'$page' => (($a->pager['page'] != 1) ? $a->pager['page'] : 1),
+ '$list' => ((x($_REQUEST,'list')) ? intval($_REQUEST['list']) : 0),
'$search' => '',
'$order' => '',
'$file' => '',
'$cats' => '',
'$dend' => '',
'$dbegin' => '',
- '$uri' => $item_hash
+ '$mid' => $item_hash
));
@@ -87,23 +140,42 @@ function display_content(&$a, $update = 0, $load = false) {
$sql_extra = public_permissions_sql(get_observer_hash());
+ if(($update && $load) || ($_COOKIE['jsAvailable'] != 1)) {
- if($update && $load) {
+ $updateable = false;
$pager_sql = sprintf(" LIMIT %d, %d ",intval($a->pager['start']), intval($a->pager['itemspage']));
- if($load) {
-
- $r = q("SELECT * from item
- WHERE item_restrict = 0
- and uri = '%s'
- AND ((( `item`.`allow_cid` = '' AND `item`.`allow_gid` = '' AND `item`.`deny_cid` = ''
- AND `item`.`deny_gid` = '' AND item_private = 0 )
- and uid in ( " . stream_perms_api_uids() . " ))
- $sql_extra )
- group by uri limit 1",
- dbesc($target_item['parent_uri'])
- );
+ if($load || ($_COOKIE['jsAvailable'] != 1)) {
+ $r = null;
+ if(local_user()) {
+ $r = q("SELECT * from item
+ WHERE item_restrict = 0
+ and uid = %d
+ and mid = '%s'
+ limit 1",
+ intval(local_user()),
+ dbesc($target_item['parent_mid'])
+ );
+ if($r) {
+ $updateable = true;
+
+ }
+ }
+ if($r === null) {
+
+ $r = q("SELECT * from item
+ WHERE item_restrict = 0
+ and mid = '%s'
+ AND ((( `item`.`allow_cid` = '' AND `item`.`allow_gid` = '' AND `item`.`deny_cid` = ''
+ AND `item`.`deny_gid` = '' AND item_private = 0 )
+ and owner_xchan in ( " . stream_perms_xchans(($observer) ? PERMS_NETWORK : PERMS_PUBLIC) . " ))
+ $sql_extra )
+ group by mid limit 1",
+ dbesc($target_item['parent_mid'])
+ );
+
+ }
}
else {
@@ -131,14 +203,31 @@ function display_content(&$a, $update = 0, $load = false) {
}
- $o .= conversation($a,$items,'display', $update, 'client');
+ if ($_COOKIE['jsAvailable'] == 1) {
+ $o .= conversation($a, $items, 'display', $update, 'client');
+ } else {
+ $o .= conversation($a, $items, 'display', $update, 'traditional');
+ }
+
+ if($updateable) {
+ $x = q("UPDATE item SET item_flags = ( item_flags ^ %d )
+ WHERE (item_flags & %d) AND uid = %d and parent = %d ",
+ intval(ITEM_UNSEEN),
+ intval(ITEM_UNSEEN),
+ intval(local_user()),
+ intval($r[0]['parent'])
+ );
+ }
+
+ $o .= '<div id="content-complete"></div>';
+
return $o;
/*
elseif((! $update) && (! {
- $r = q("SELECT `id`, item_flags FROM `item` WHERE `id` = '%s' OR `uri` = '%s' LIMIT 1",
+ $r = q("SELECT `id`, item_flags FROM `item` WHERE `id` = '%s' OR `mid` = '%s' LIMIT 1",
dbesc($item_hash),
dbesc($item_hash)
);
diff --git a/mod/editblock.php b/mod/editblock.php
new file mode 100644
index 000000000..dcb4b42a7
--- /dev/null
+++ b/mod/editblock.php
@@ -0,0 +1,169 @@
+<?php
+
+// What is this here for? I think it's cruft, but comment out for now in case it's here for a reason
+// require_once('acl_selectors.php');
+
+function editblock_content(&$a) {
+
+// We first need to figure out who owns the webpage, grab it from an argument
+ $which = argv(1);
+
+// $a->get_channel() and stuff don't work here, so we've got to find the owner for ourselves.
+ $r = q("select channel_id from channel where channel_address = '%s'",
+ dbesc($which)
+ );
+ if($r) {
+ $owner = intval($r[0]['channel_id']);
+ //logger('owner: ' . print_r($owner,true));
+ }
+
+
+
+
+ if((local_user()) && (argc() > 2) && (argv(2) === 'view')) {
+ $which = $channel['channel_address'];
+ }
+
+
+ $o = '';
+
+
+// Figure out which post we're editing
+ $post_id = ((argc() > 2) ? intval(argv(2)) : 0);
+
+
+ if(! $post_id) {
+ notice( t('Item not found') . EOL);
+ return;
+ }
+
+// Now we've got a post and an owner, let's find out if we're allowed to edit it
+
+ $observer = $a->get_observer();
+ $ob_hash = (($observer) ? $observer['xchan_hash'] : '');
+
+ $perms = get_all_perms($owner,$ob_hash);
+
+ if(! $perms['write_pages']) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+
+
+// We've already figured out which item we want and whose copy we need, so we don't need anything fancy here
+ $itm = q("SELECT * FROM `item` WHERE `id` = %d and uid = %s LIMIT 1",
+ intval($post_id),
+ intval($owner)
+ );
+ $item_id = q("select * from item_id where service = 'BUILDBLOCK' and iid = %d limit 1",
+ $itm[0]['id']
+ );
+ if($item_id)
+ $block_title = $item_id[0]['sid'];
+
+
+ $plaintext = true;
+// You may or may not be a local user. This won't work,
+ if(feature_enabled(local_user(),'richtext'))
+ $plaintext = false;
+
+ $mimeselect = '';
+
+ if($mimetype != 'text/bbcode')
+ $plaintext = true;
+
+ if(get_config('system','page_mimetype'))
+ $mimeselect = '<input type="hidden" name="mimetype" value="' . $mimetype . '" />';
+ else
+ $mimeselect = mimetype_select($itm[0]['uid'],$mimetype);
+
+
+
+
+
+ $o .= replace_macros(get_markup_template('edpost_head.tpl'), array(
+ '$title' => t('Edit Block')
+ ));
+
+
+ $a->page['htmlhead'] .= replace_macros(get_markup_template('jot-header.tpl'), array(
+ '$baseurl' => $a->get_baseurl(),
+ '$editselect' => (($plaintext) ? 'none' : '/(profile-jot-text|prvmail-text)/'),
+ '$ispublic' => '&nbsp;', // t('Visible to <strong>everybody</strong>'),
+ '$geotag' => $geotag,
+ '$nickname' => $a->user['nickname'],
+ '$confirmdelete' => t('Delete block?')
+ ));
+
+
+ $tpl = get_markup_template("jot.tpl");
+
+ $jotplugins = '';
+ $jotnets = '';
+
+ call_hooks('jot_tool', $jotplugins);
+ call_hooks('jot_networks', $jotnets);
+
+ $channel = $a->get_channel();
+
+ //$tpl = replace_macros($tpl,array('$jotplugins' => $jotplugins));
+
+//FIXME A return path with $_SESSION doesn't always work for observer - it may WSoD instead of loading a sensible page. So, send folk to the webpage list.
+
+ $rp = '/blocks/' . $which;
+
+ $o .= replace_macros($tpl,array(
+ '$return_path' => $rp,
+ '$action' => 'item',
+ '$webpage' => ITEM_BUILDBLOCK,
+ '$share' => t('Edit'),
+ '$upload' => t('Upload photo'),
+ '$attach' => t('Attach file'),
+ '$weblink' => t('Insert web link'),
+ '$youtube' => t('Insert YouTube video'),
+ '$video' => t('Insert Vorbis [.ogg] video'),
+ '$audio' => t('Insert Vorbis [.ogg] audio'),
+ '$setloc' => t('Set your location'),
+ '$noloc' => t('Clear browser location'),
+ '$wait' => t('Please wait'),
+ '$permset' => t('Permission settings'),
+ '$ptyp' => $itm[0]['type'],
+ '$mimeselect' => $mimeselect,
+ '$content' => undo_post_tagging($itm[0]['body']),
+ '$post_id' => $post_id,
+ '$baseurl' => $a->get_baseurl(),
+ '$defloc' => $channel['channel_location'],
+ '$visitor' => 'none',
+ '$pvisit' => 'none',
+ '$public' => t('Public post'),
+ '$jotnets' => $jotnets,
+ '$title' => htmlspecialchars($itm[0]['title'],ENT_COMPAT,'UTF-8'),
+ '$placeholdertitle' => t('Set title'),
+ '$pagetitle' => $block_title,
+ '$category' => '',
+ '$placeholdercategory' => t('Categories (comma-separated list)'),
+ '$emtitle' => t('Example: bob@example.com, mary@example.com'),
+ '$lockstate' => $lockstate,
+ '$acl' => '',
+ '$bang' => '',
+ '$profile_uid' => (intval($owner)),
+ '$preview' => ((feature_enabled(local_user(),'preview')) ? t('Preview') : ''),
+ '$jotplugins' => $jotplugins,
+ '$sourceapp' => t($a->sourcename),
+ '$defexpire' => '',
+ '$feature_expire' => 'none',
+ '$expires' => t('Set expiration date'),
+ ));
+
+
+ $ob = get_observer_hash();
+
+ if(($itm[0]['author_xchan'] === $ob) || ($itm[0]['owner_xchan'] === $ob))
+ $o .= '<br /><br /><a class="block-delete-link" href="item/drop/' . $itm[0]['id'] . '" >' . t('Delete Block') . '</a><br />';
+
+ return $o;
+
+}
+
+
diff --git a/mod/editlayout.php b/mod/editlayout.php
new file mode 100644
index 000000000..838a219c9
--- /dev/null
+++ b/mod/editlayout.php
@@ -0,0 +1,153 @@
+<?php
+
+// What is this here for? I think it's cruft, but comment out for now in case it's here for a reason
+// require_once('acl_selectors.php');
+
+function editlayout_content(&$a) {
+
+// We first need to figure out who owns the webpage, grab it from an argument
+ $which = argv(1);
+
+// $a->get_channel() and stuff don't work here, so we've got to find the owner for ourselves.
+ $r = q("select channel_id from channel where channel_address = '%s'",
+ dbesc($which)
+ );
+ if($r) {
+ $owner = intval($r[0]['channel_id']);
+ //logger('owner: ' . print_r($owner,true));
+ }
+
+
+
+
+ if((local_user()) && (argc() > 2) && (argv(2) === 'view')) {
+ $which = $channel['channel_address'];
+ }
+
+
+ $o = '';
+
+
+// Figure out which post we're editing
+ $post_id = ((argc() > 2) ? intval(argv(2)) : 0);
+
+
+ if(! $post_id) {
+ notice( t('Item not found') . EOL);
+ return;
+ }
+
+// Now we've got a post and an owner, let's find out if we're allowed to edit it
+
+ $observer = $a->get_observer();
+ $ob_hash = (($observer) ? $observer['xchan_hash'] : '');
+
+ $perms = get_all_perms($owner,$ob_hash);
+
+ if(! $perms['write_pages']) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+
+
+// We've already figured out which item we want and whose copy we need, so we don't need anything fancy here
+ $itm = q("SELECT * FROM `item` WHERE `id` = %d and uid = %s LIMIT 1",
+ intval($post_id),
+ intval($owner)
+ );
+
+ $item_id = q("select * from item_id where service = 'PDL' and iid = %d limit 1",
+ $itm[0]['id']
+ );
+ if($item_id)
+ $layout_title = $item_id[0]['sid'];
+
+ $plaintext = true;
+// You may or may not be a local user. This won't work,
+ if(feature_enabled(local_user(),'richtext'))
+ $plaintext = false;
+
+ $o .= replace_macros(get_markup_template('edpost_head.tpl'), array(
+ '$title' => t('Edit Layout')
+ ));
+
+
+ $a->page['htmlhead'] .= replace_macros(get_markup_template('jot-header.tpl'), array(
+ '$baseurl' => $a->get_baseurl(),
+ '$editselect' => (($plaintext) ? 'none' : '/(profile-jot-text|prvmail-text)/'),
+ '$ispublic' => '&nbsp;', // t('Visible to <strong>everybody</strong>'),
+ '$geotag' => $geotag,
+ '$nickname' => $a->user['nickname'],
+ '$confirmdelete' => t('Delete layout?')
+ ));
+
+
+ $tpl = get_markup_template("jot.tpl");
+
+ $jotplugins = '';
+ $jotnets = '';
+
+ call_hooks('jot_tool', $jotplugins);
+ call_hooks('jot_networks', $jotnets);
+
+ $channel = $a->get_channel();
+
+ //$tpl = replace_macros($tpl,array('$jotplugins' => $jotplugins));
+
+//FIXME A return path with $_SESSION doesn't always work for observer - it may WSoD instead of loading a sensible page. So, send folk to the webpage list.
+
+ $rp = '/layouts/' . $which;
+
+ $o .= replace_macros($tpl,array(
+ '$return_path' => $rp,
+ '$action' => 'item',
+ '$webpage' => ITEM_PDL,
+ '$share' => t('Edit'),
+ '$upload' => t('Upload photo'),
+ '$attach' => t('Attach file'),
+ '$weblink' => t('Insert web link'),
+ '$youtube' => t('Insert YouTube video'),
+ '$video' => t('Insert Vorbis [.ogg] video'),
+ '$audio' => t('Insert Vorbis [.ogg] audio'),
+ '$setloc' => t('Set your location'),
+ '$noloc' => t('Clear browser location'),
+ '$wait' => t('Please wait'),
+ '$permset' => t('Permission settings'),
+ '$ptyp' => $itm[0]['type'],
+ '$content' => undo_post_tagging($itm[0]['body']),
+ '$post_id' => $post_id,
+ '$baseurl' => $a->get_baseurl(),
+ '$defloc' => $channel['channel_location'],
+ '$visitor' => 'none',
+ '$pvisit' => 'none',
+ '$public' => t('Public post'),
+ '$jotnets' => $jotnets,
+ '$title' => htmlspecialchars($itm[0]['title'],ENT_COMPAT,'UTF-8'),
+ '$placeholdertitle' => t('Set title'),
+ '$pagetitle' => $layout_title,
+ '$category' => '',
+ '$placeholdercategory' => t('Categories (comma-separated list)'),
+ '$emtitle' => t('Example: bob@example.com, mary@example.com'),
+ '$lockstate' => $lockstate,
+ '$acl' => '',
+ '$bang' => '',
+ '$profile_uid' => (intval($owner)),
+ '$preview' => ((feature_enabled(local_user(),'preview')) ? t('Preview') : ''),
+ '$jotplugins' => $jotplugins,
+ '$sourceapp' => t($a->sourcename),
+ '$defexpire' => '',
+ '$feature_expire' => 'none',
+ '$expires' => t('Set expiration date'),
+ ));
+
+ $ob = get_observer_hash();
+
+ if(($itm[0]['author_xchan'] === $ob) || ($itm[0]['owner_xchan'] === $ob))
+ $o .= '<br /><br /><a class="layout-delete-link" href="item/drop/' . $itm[0]['id'] . '" >' . t('Delete Layout') . '</a><br />';
+
+ return $o;
+
+}
+
+
diff --git a/mod/editpost.php b/mod/editpost.php
index 43c71ca8a..7cc33d60d 100644
--- a/mod/editpost.php
+++ b/mod/editpost.php
@@ -1,6 +1,9 @@
-<?php
+<?php /** @file */
require_once('acl_selectors.php');
+require_once('include/crypto.php');
+require_once('include/items.php');
+require_once('include/taxonomy.php');
function editpost_content(&$a) {
@@ -18,13 +21,14 @@ function editpost_content(&$a) {
return;
}
- $itm = q("SELECT * FROM `item` WHERE `id` = %d AND `uid` = %d LIMIT 1",
+ $itm = q("SELECT * FROM `item` WHERE `id` = %d AND `uid` = %d and author_xchan = '%s' LIMIT 1",
intval($post_id),
- intval(local_user())
+ intval(local_user()),
+ dbesc(get_observer_hash())
);
if(! count($itm)) {
- notice( t('Item not found') . EOL);
+ notice( t('Item is not editable') . EOL);
return;
}
@@ -32,6 +36,8 @@ function editpost_content(&$a) {
if(feature_enabled(local_user(),'richtext'))
$plaintext = false;
+ $channel = $a->get_channel();
+
$o .= replace_macros(get_markup_template('edpost_head.tpl'), array(
'$title' => t('Edit post')
));
@@ -42,10 +48,21 @@ function editpost_content(&$a) {
'$editselect' => (($plaintext) ? 'none' : '/(profile-jot-text|prvmail-text)/'),
'$ispublic' => '&nbsp;', // t('Visible to <strong>everybody</strong>'),
'$geotag' => $geotag,
- '$nickname' => $a->user['nickname']
+ '$nickname' => $channel['channel_address'],
+ '$expireswhen' => t('Expires YYYY-MM-DD HH:MM'),
+ '$confirmdelete' => t('Delete item?'),
));
+
+ if($itm[0]['item_flags'] & ITEM_OBSCURED) {
+ $key = get_config('system','prvkey');
+ if($itm[0]['title'])
+ $itm[0]['title'] = crypto_unencapsulate(json_decode_plus($itm[0]['title']),$key);
+ if($itm[0]['body'])
+ $itm[0]['body'] = crypto_unencapsulate(json_decode_plus($itm[0]['body']),$key);
+ }
+
$tpl = get_markup_template("jot.tpl");
$jotplugins = '';
@@ -59,6 +76,22 @@ function editpost_content(&$a) {
//$tpl = replace_macros($tpl,array('$jotplugins' => $jotplugins));
+ $category = '';
+ $catsenabled = ((feature_enabled(local_user(),'categories')) ? 'categories' : '');
+
+ if ($catsenabled){
+ $itm = fetch_post_tags($itm);
+
+ $cats = get_terms_oftype($itm[0]['term'], TERM_CATEGORY);
+
+ foreach ($cats as $cat) {
+ if (strlen($category))
+ $category .= ', ';
+ $category .= $cat['term'];
+ }
+
+ }
+
$o .= replace_macros($tpl,array(
'$return_path' => $_SESSION['return_url'],
'$action' => 'item',
@@ -82,9 +115,9 @@ function editpost_content(&$a) {
'$pvisit' => 'none',
'$public' => t('Public post'),
'$jotnets' => $jotnets,
- '$title' => $itm[0]['title'],
+ '$title' => htmlspecialchars($itm[0]['title'],ENT_COMPAT,'UTF-8'),
'$placeholdertitle' => t('Set title'),
- '$category' => file_tag_file_to_list($itm[0]['file'], 'category'),
+ '$category' => $category,
'$placeholdercategory' => t('Categories (comma-separated list)'),
'$emtitle' => t('Example: bob@example.com, mary@example.com'),
'$lockstate' => $lockstate,
@@ -94,6 +127,14 @@ function editpost_content(&$a) {
'$preview' => ((feature_enabled(local_user(),'preview')) ? t('Preview') : ''),
'$jotplugins' => $jotplugins,
'$sourceapp' => t($a->sourcename),
+ '$catsenabled' => $catsenabled,
+ '$defexpire' => $itm[0]['expires'],
+ '$feature_expire' => 'none',
+ '$expires' => t('Set expiration date'),
+ '$feature_encrypt' => 'none',
+ '$encrypt' => t('Encrypt text'),
+ '$expiryModalOK' => t('OK'),
+ '$expiryModalCANCEL' => t('Cancel'),
));
return $o;
diff --git a/mod/editwebpage.php b/mod/editwebpage.php
new file mode 100644
index 000000000..f11210eea
--- /dev/null
+++ b/mod/editwebpage.php
@@ -0,0 +1,195 @@
+<?php
+
+// Required for setting permissions. (FIXME)
+
+require_once('acl_selectors.php');
+
+function editwebpage_content(&$a) {
+
+ // We first need to figure out who owns the webpage, grab it from an argument
+
+ $which = argv(1);
+
+ // $a->get_channel() and stuff don't work here, so we've got to find the owner for ourselves.
+
+ $r = q("select channel_id from channel where channel_address = '%s'",
+ dbesc($which)
+ );
+ if($r) {
+ $owner = intval($r[0]['channel_id']);
+ //logger('owner: ' . print_r($owner,true));
+ }
+
+ $is_owner = ((local_user() && local_user() == $owner) ? true : false);
+
+ $o = '';
+
+ // Figure out which post we're editing
+ $post_id = ((argc() > 2) ? intval(argv(2)) : 0);
+
+
+ if(! $post_id) {
+ notice( t('Item not found') . EOL);
+ return;
+ }
+
+ // Now we've got a post and an owner, let's find out if we're allowed to edit it
+
+ $observer = $a->get_observer();
+ $ob_hash = (($observer) ? $observer['xchan_hash'] : '');
+
+ $perms = get_all_perms($owner,$ob_hash);
+
+ if(! $perms['write_pages']) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+
+
+ // We've already figured out which item we want and whose copy we need, so we don't need anything fancy here
+ $itm = q("SELECT * FROM `item` WHERE `id` = %d and uid = %s LIMIT 1",
+ intval($post_id),
+ intval($owner)
+ );
+
+
+ if($itm[0]['item_flags'] & ITEM_OBSCURED) {
+ $key = get_config('system','prvkey');
+ if($itm[0]['title'])
+ $itm[0]['title'] = crypto_unencapsulate(json_decode_plus($itm[0]['title']),$key);
+ if($itm[0]['body'])
+ $itm[0]['body'] = crypto_unencapsulate(json_decode_plus($itm[0]['body']),$key);
+ }
+
+ $item_id = q("select * from item_id where service = 'WEBPAGE' and iid = %d limit 1",
+ $itm[0]['id']
+ );
+ if($item_id)
+ $page_title = $item_id[0]['sid'];
+
+
+
+
+ $plaintext = true;
+
+ if(feature_enabled($itm[0]['uid'],'richtext'))
+ $plaintext = false;
+
+ $mimetype = $itm[0]['mimetype'];
+
+ if($mimetype === 'application/x-php') {
+ if((! local_user()) || (local_user() != $itm[0]['uid'])) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+ }
+
+ $mimeselect = '';
+
+ if($mimetype != 'text/bbcode')
+ $plaintext = true;
+
+ if(get_config('system','page_mimetype'))
+ $mimeselect = '<input type="hidden" name="mimetype" value="' . $mimetype . '" />';
+ else
+ $mimeselect = mimetype_select($itm[0]['uid'],$mimetype);
+
+ $layout = get_config('system','page_layout');
+ if($layout)
+ $layoutselect = '<input type="hidden" name="layout_mid" value="' . $layout . '" />';
+ else
+ $layoutselect = layout_select($itm[0]['uid'],$itm[0]['layout_mid']);
+
+
+ $o .= replace_macros(get_markup_template('edpost_head.tpl'), array(
+ '$title' => t('Edit Webpage')
+ ));
+
+
+ $a->page['htmlhead'] .= replace_macros(get_markup_template('jot-header.tpl'), array(
+ '$baseurl' => $a->get_baseurl(),
+ '$editselect' => (($plaintext) ? 'none' : '/(profile-jot-text|prvmail-text)/'),
+ '$ispublic' => '&nbsp;', // t('Visible to <strong>everybody</strong>'),
+ '$geotag' => $geotag,
+ '$nickname' => $a->user['nickname'],
+ '$confirmdelete' => t('Delete webpage?')
+ ));
+
+
+ $tpl = get_markup_template("jot.tpl");
+
+ $jotplugins = '';
+ $jotnets = '';
+
+ call_hooks('jot_tool', $jotplugins);
+ call_hooks('jot_networks', $jotnets);
+
+ $channel = $a->get_channel();
+
+ //$tpl = replace_macros($tpl,array('$jotplugins' => $jotplugins));
+
+//FIXME A return path with $_SESSION doesn't always work for observer - it may WSoD instead of loading a sensible page. So, send folk to the webpage list.
+
+ $rp = '/webpages/' . $which;
+ $lockstate =
+
+ $o .= replace_macros($tpl,array(
+ '$return_path' => $rp,
+ '$webpage' => ITEM_WEBPAGE,
+ '$placeholdpagetitle' => t('Page link title'),
+ '$pagetitle' => $page_title,
+
+ '$action' => 'item',
+ '$share' => t('Edit'),
+ '$upload' => t('Upload photo'),
+ '$attach' => t('Attach file'),
+ '$weblink' => t('Insert web link'),
+ '$youtube' => t('Insert YouTube video'),
+ '$video' => t('Insert Vorbis [.ogg] video'),
+ '$audio' => t('Insert Vorbis [.ogg] audio'),
+ '$setloc' => t('Set your location'),
+ '$noloc' => t('Clear browser location'),
+ '$wait' => t('Please wait'),
+ '$permset' => t('Permission settings'),
+ '$ptyp' => $itm[0]['type'],
+ '$content' => undo_post_tagging($itm[0]['body']),
+ '$post_id' => $post_id,
+ '$baseurl' => $a->get_baseurl(),
+ '$defloc' => $itm[0]['location'],
+ '$visitor' => ($is_owner) ? 'block' : 'none',
+ '$acl' => populate_acl($itm[0]),
+ '$showacl' => true,
+ '$pvisit' => ($is_owner) ? 'block' : 'none',
+ '$public' => t('Public post'),
+ '$jotnets' => $jotnets,
+ '$mimeselect' => $mimeselect,
+ '$layoutselect' => $layoutselect,
+ '$title' => htmlspecialchars($itm[0]['title'],ENT_COMPAT,'UTF-8'),
+ '$placeholdertitle' => t('Set title'),
+ '$category' => '',
+ '$placeholdercategory' => t('Categories (comma-separated list)'),
+ '$emtitle' => t('Example: bob@example.com, mary@example.com'),
+ 'lockstate' => (((strlen($itm[0]['allow_cid'])) || (strlen($itm[0]['allow_gid'])) || (strlen($itm[0]['deny_cid'])) || (strlen($itm[0]['deny_gid']))) ? 'lock' : 'unlock'),
+ '$acl' => populate_acl($itm[0]),
+ '$bang' => '',
+ '$profile_uid' => (intval($owner)),
+ '$preview' => ((feature_enabled(local_user(),'preview')) ? t('Preview') : ''),
+ '$jotplugins' => $jotplugins,
+ '$sourceapp' => t($a->sourcename),
+ '$defexpire' => '',
+ '$feature_expire' => 'none',
+ '$expires' => t('Set expiration date'),
+
+ ));
+
+ $ob = get_observer_hash();
+
+ if(($itm[0]['author_xchan'] === $ob) || ($itm[0]['owner_xchan'] === $ob))
+ $o .= '<br /><br /><a class="page-delete-link" href="item/drop/' . $itm[0]['id'] . '" >' . t('Delete Webpage') . '</a><br />';
+
+ return $o;
+
+}
+
+
diff --git a/mod/events.php b/mod/events.php
index 8c509cfea..2a6067e65 100755
--- a/mod/events.php
+++ b/mod/events.php
@@ -1,5 +1,6 @@
<?php
+require_once('include/conversation.php');
require_once('include/bbcode.php');
require_once('include/datetime.php');
require_once('include/event.php');
@@ -11,7 +12,7 @@ function events_post(&$a) {
return;
$event_id = ((x($_POST,'event_id')) ? intval($_POST['event_id']) : 0);
- $cid = ((x($_POST,'cid')) ? intval($_POST['cid']) : 0);
+ $xchan = ((x($_POST,'xchan')) ? dbesc($_POST['xchan']) : '');
$uid = local_user();
$startyear = intval($_POST['startyear']);
$startmonth = intval($_POST['startmonth']);
@@ -28,6 +29,11 @@ function events_post(&$a) {
$adjust = intval($_POST['adjust']);
$nofinish = intval($_POST['nofinish']);
+ // only allow editing your own events.
+
+ if(($xchan) && ($xchan !== get_observer_hash()))
+ return;
+
// The default setting for the `private` field in event_store() is false, so mirror that
$private_event = false;
@@ -102,7 +108,7 @@ function events_post(&$a) {
$datarray['start'] = $start;
$datarray['finish'] = $finish;
$datarray['summary'] = $summary;
- $datarray['desc'] = $desc;
+ $datarray['description'] = $desc;
$datarray['location'] = $location;
$datarray['type'] = $type;
$datarray['adjust'] = $adjust;
@@ -135,6 +141,8 @@ function events_content(&$a) {
return;
}
+ nav_set_selected('all_events');
+
if((argc() > 2) && (argv(1) === 'ignore') && intval(argv(2))) {
$r = q("update event set ignore = 1 where id = %d and uid = %d limit 1",
intval(argv(2)),
@@ -229,9 +237,9 @@ function events_content(&$a) {
$adjust_start = datetime_convert('UTC', date_default_timezone_get(), $start);
$adjust_finish = datetime_convert('UTC', date_default_timezone_get(), $finish);
-
if (x($_GET,'id')){
- $r = q("SELECT * from event left join item on resource_id = event_hash where resource_type = 'event' and event.uid = %d and event.id = %d limit 1",
+ $r = q("SELECT event.*, item.plink, item.item_flags, item.author_xchan, item.owner_xchan
+ from event left join item on resource_id = event_hash where resource_type = 'event' and event.uid = %d and event.id = %d limit 1",
intval(local_user()),
intval($_GET['id'])
);
@@ -242,8 +250,8 @@ function events_content(&$a) {
// Noting this for now - it will need to be fixed here and in Friendica.
// Ultimately the finish date shouldn't be involved in the query.
-
- $r = q("SELECT * from event left join item on event_hash = resource_id
+ $r = q("SELECT event.*, item.plink, item.item_flags, item.author_xchan, item.owner_xchan
+ from event left join item on event_hash = resource_id
where resource_type = 'event' and event.uid = %d and event.ignore = %d
AND (( `adjust` = 0 AND ( `finish` >= '%s' or nofinish ) AND `start` <= '%s' )
OR ( `adjust` = 1 AND ( `finish` >= '%s' or nofinish ) AND `start` <= '%s' )) ",
@@ -339,6 +347,7 @@ function events_content(&$a) {
else {
$tpl = get_markup_template("events-js.tpl");
}
+
$o = replace_macros($tpl, array(
'$baseurl' => $a->get_baseurl(),
'$tabs' => $tabs,
@@ -346,8 +355,7 @@ function events_content(&$a) {
'$new_event'=> array($a->get_baseurl().'/events/new',t('Create New Event'),'',''),
'$previus' => array($a->get_baseurl()."/events/$prevyear/$prevmonth",t('Previous'),'',''),
'$next' => array($a->get_baseurl()."/events/$nextyear/$nextmonth",t('Next'),'',''),
- '$calendar' => cal($y,$m,$links, ' eventcal'),
-
+ '$calendar' => cal($y,$m,$links, ' eventcal'),
'$events' => $events,
@@ -379,18 +387,16 @@ function events_content(&$a) {
$l_orig = ((x($orig_event)) ? $orig_event['location'] : '');
$eid = ((x($orig_event)) ? $orig_event['id'] : 0);
$event_xchan = ((x($orig_event)) ? $orig_event['event_xchan'] : $channel['channel_hash']);
- $uri = ((x($orig_event)) ? $orig_event['uri'] : '');
+ $mid = ((x($orig_event)) ? $orig_event['mid'] : '');
if(! x($orig_event))
$sh_checked = '';
else
$sh_checked = (($orig_event['allow_cid'] === '<' . $channel['channel_hash'] . '>' && (! $orig_event['allow_gid']) && (! $orig_event['deny_cid']) && (! $orig_event['deny_gid'])) ? '' : ' checked="checked" ' );
- if($cid)
+ if($orig_event['event_xchan'])
$sh_checked .= ' disabled="disabled" ';
-
-
$tpl = get_markup_template('event_form.tpl');
$sdt = ((x($orig_event)) ? $orig_event['start'] : 'now');
@@ -423,11 +429,20 @@ function events_content(&$a) {
require_once('include/acl_selectors.php');
+ $perm_defaults = array(
+ 'allow_cid' => $channel['channel_allow_cid'],
+ 'allow_gid' => $channel['channel_allow_gid'],
+ 'deny_cid' => $channel['channel_deny_cid'],
+ 'deny_gid' => $channel['channel_deny_gid']
+ );
+
+
+
$o .= replace_macros($tpl,array(
'$post' => $a->get_baseurl() . '/events',
'$eid' => $eid,
'$xchan' => $event_xchan,
- '$uri' => $uri,
+ '$mid' => $mid,
'$title' => t('Event details'),
'$desc' => sprintf( t('Format is %s %s. Starting date and Title are required.'),$dateformat,$timeformat),
@@ -450,8 +465,7 @@ function events_content(&$a) {
'$t_orig' => $t_orig,
'$sh_text' => t('Share this event'),
'$sh_checked' => $sh_checked,
-// FIXME
- '$acl' => (($cid) ? '' : populate_acl(((x($orig_event)) ? $orig_event : $a->user),false)),
+ '$acl' => (($orig_event['event_xchan']) ? '' : populate_acl(((x($orig_event)) ? $orig_event : $perm_defaults))),
'$submit' => t('Submit')
));
diff --git a/mod/fbrowser.php b/mod/fbrowser.php
index d10d8021b..19bd77914 100644
--- a/mod/fbrowser.php
+++ b/mod/fbrowser.php
@@ -5,7 +5,7 @@
* @author Fabio Comuni <fabrixxm@kirgroup.com>
*/
-require_once('include/Photo.php');
+require_once('include/photo/photo_driver.php');
/**
* @param App $a
@@ -45,7 +45,7 @@ function fbrowser_content($a){
$path[]=array($a->get_baseurl()."/fbrowser/image/".$a->argv[2]."/", $album);
}
- $r = q("SELECT `resource_id`, `id`, `filename`, type, min(`scale`) AS `hiq`,max(`scale`) AS `loq`, `desc`
+ $r = q("SELECT `resource_id`, `id`, `filename`, type, min(`scale`) AS `hiq`,max(`scale`) AS `loq`, `description`
FROM `photo` WHERE `uid` = %d $sql_extra
GROUP BY `resource_id` $sql_extra2",
intval(local_user())
@@ -53,7 +53,8 @@ function fbrowser_content($a){
function files1($rr){
global $a;
- $types = Photo::supportedTypes();
+ $ph = photo_factory('');
+ $types = $ph->supportedTypes();
$ext = $types[$rr['type']];
if($a->get_template_engine() === 'internal') {
diff --git a/mod/feed.php b/mod/feed.php
index a6adc620e..0f8296ed1 100644
--- a/mod/feed.php
+++ b/mod/feed.php
@@ -7,13 +7,14 @@ function feed_init(&$a) {
$params = array();
- $params['begin'] = ((x($_REQUEST,'date_begin')) ? $_REQUEST['date_begin'] : '0000-00-00 00:00:00');
- $params['end'] = ((x($_REQUEST,'date_end')) ? $_REQUEST['date_end'] : '');
- $params['type'] = ((stristr(argv(0),'json')) ? 'json' : 'xml');
+ $params['begin'] = ((x($_REQUEST,'date_begin')) ? $_REQUEST['date_begin'] : '0000-00-00 00:00:00');
+ $params['end'] = ((x($_REQUEST,'date_end')) ? $_REQUEST['date_end'] : '');
+ $params['type'] = ((stristr(argv(0),'json')) ? 'json' : 'xml');
+ $params['pages'] = ((x($_REQUEST,'pages')) ? intval($_REQUEST['pages']) : 0);
$channel = '';
if(argc() > 1) {
- $r = q("select * from channel where channel_address = '%s' limit 1",
+ $r = q("select * from channel left join xchan on channel_hash = xchan_hash where channel_address = '%s' limit 1",
dbesc(argv(1))
);
if(!($r && count($r)))
@@ -21,11 +22,6 @@ function feed_init(&$a) {
$channel = $r[0];
- // check site and channel permissions
-
- if(!($channel['channel_r_stream'] & PERMS_PUBLIC))
- killme();
-
if((intval(get_config('system','block_public'))) && (! get_account_id()))
killme();
diff --git a/mod/filestorage.php b/mod/filestorage.php
new file mode 100644
index 000000000..18760dd45
--- /dev/null
+++ b/mod/filestorage.php
@@ -0,0 +1,180 @@
+<?php
+
+require_once('include/attach.php');
+
+function filestorage_post(&$a) {
+
+ $channel_id = ((x($_POST,'uid')) ? intval($_POST['uid']) : 0);
+
+ if((! $channel_id) || (! local_user()) || ($channel_id != local_user())) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+ $recurse = ((x($_POST,'recurse')) ? intval($_POST['recurse']) : 0);
+ $resource = ((x($_POST,'filehash')) ? notags($_POST['filehash']) : '');
+
+ if(! $resource) {
+ notice(t('Item not found.') . EOL);
+ return;
+ }
+
+ $str_group_allow = perms2str($_REQUEST['group_allow']);
+ $str_contact_allow = perms2str($_REQUEST['contact_allow']);
+ $str_group_deny = perms2str($_REQUEST['group_deny']);
+ $str_contact_deny = perms2str($_REQUEST['contact_deny']);
+
+ attach_change_permissions($channel_id,$resource,$str_contact_allow,$str_group_allow,$str_contact_deny,$str_group_deny,$recurse = false);
+
+}
+
+
+
+
+
+function filestorage_content(&$a) {
+
+ if(argc() > 1)
+ $which = argv(1);
+ else {
+ notice( t('Requested profile is not available.') . EOL );
+ $a->error = 404;
+ return;
+ }
+
+ $r = q("select * from channel where channel_address = '%s'",
+ dbesc($which)
+ );
+ if($r) {
+ $channel = $r[0];
+ $owner = intval($r[0]['channel_id']);
+ }
+
+ $observer = $a->get_observer();
+ $ob_hash = (($observer) ? $observer['xchan_hash'] : '');
+
+ $perms = get_all_perms($owner,$ob_hash);
+
+ if(! $perms['view_storage']) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+ // Since we have ACL'd files in the wild, but don't have ACL here yet, we
+ // need to return for anyone other than the owner, despite the perms check for now.
+
+ $is_owner = (((local_user()) && ($owner == local_user())) ? true : false);
+ if(! $is_owner) {
+ info( t('Permission Denied.') . EOL );
+ return;
+ }
+
+ // TODO This will also need to check for files on disk and delete them from there as well as the DB.
+
+ if(argc() > 3 && argv(3) === 'delete') {
+ if(! $perms['write_storage']) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+ $file = intval(argv(2));
+ $r = q("select hash from attach where id = %d and uid = %d limit 1",
+ dbesc($file),
+ intval($owner)
+ );
+ if(! $r) {
+ notice( t('File not found.') . EOL);
+ goaway(z_root() . '/filestorage/' . $which);
+ }
+
+ attach_delete($owner,$r[0]['hash']);
+
+ goaway(z_root() . '/filestorage/' . $which);
+ }
+
+
+ if(argc() > 3 && argv(3) === 'edit') {
+ require_once('include/acl_selectors.php');
+ if(! $perms['write_storage']) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+ $file = intval(argv(2));
+
+ $r = q("select id, uid, folder, filename, revision, flags, hash, allow_cid, allow_gid, deny_cid, deny_gid from attach where id = %d and uid = %d limit 1",
+ intval($file),
+ intval($owner)
+ );
+
+ $f = $r[0];
+
+ $channel = $a->get_channel();
+
+ $cloudpath = get_cloudpath($f);
+
+ $aclselect_e = populate_acl($f);
+ $is_a_dir = (($f['flags'] & ATTACH_FLAG_DIR) ? true : false);
+
+
+ $o = replace_macros(get_markup_template('attach_edit.tpl'), array(
+ '$header' => t('Edit file permissions'),
+ '$file' => $f,
+ '$cloudpath' => z_root() . '/' . $cloudpath,
+ '$uid' => $channel['channel_id'],
+ '$channelnick' => $channel['channel_address'],
+ '$permissions' => t('Permissions'),
+ '$aclselect' => $aclselect_e,
+ '$recurse' => t('Include all files and sub folders'),
+ '$backlink' => t('Return to file list'),
+ '$isadir' => $is_a_dir,
+ '$cpdesc' => t('Copy/paste this code to attach file to a post'),
+ '$cpldesc' => t('Copy/paste this URL to link file from a web page'),
+ '$submit' => t('Submit')
+
+ ));
+
+ return $o;
+ }
+
+ $r = q("select * from attach where uid = %d order by edited desc",
+ intval($owner)
+ );
+
+ $files = null;
+
+ if($r) {
+ $files = array();
+ foreach($r as $rr) {
+ $files[$rr['id']][] = array(
+ 'id' => $rr['id'],
+ 'download' => $rr['hash'],
+ 'title' => $rr['filename'],
+ 'size' => $rr['filesize'],
+ 'rev' => $rr['revision'],
+ 'dir' => (($rr['flags'] & ATTACH_FLAG_DIR) ? true : false)
+ );
+ }
+ }
+
+ $limit = service_class_fetch ($owner,'attach_upload_limit');
+ $r = q("select sum(filesize) as total from attach where aid = %d ",
+ intval($channel['channel_account_id'])
+ );
+ $used = $r[0]['total'];
+
+ $url = z_root() . "/filestorage/" . $which;
+ return $o . replace_macros(get_markup_template("filestorage.tpl"), array(
+ '$baseurl' => $url,
+ '$download' => t('Download'),
+ '$files' => $files,
+ '$channel' => $which,
+ '$edit' => t('Edit'),
+ '$delete' => t('Delete'),
+ '$used' => $used,
+ '$usedlabel' => t('Used: '),
+ '$directory' => t('[directory]'),
+ '$limit' => $limit,
+ '$limitlabel' => t('Limit: '),
+ ));
+
+}
diff --git a/mod/follow.php b/mod/follow.php
index c07c210f6..962bb71a7 100644
--- a/mod/follow.php
+++ b/mod/follow.php
@@ -6,24 +6,37 @@ require_once('include/follow.php');
function follow_init(&$a) {
if(! local_user()) {
- notice( t('Permission denied.') . EOL);
return;
}
$uid = local_user();
$url = notags(trim($_REQUEST['url']));
$return_url = $_SESSION['return_url'];
+ $confirm = intval($_REQUEST['confirm']);
- $result = new_contact($uid,$url,$a->get_channel(),true);
-
+ $result = new_contact($uid,$url,$a->get_channel(),true,$confirm);
+
if($result['success'] == false) {
if($result['message'])
notice($result['message']);
goaway($return_url);
}
- info( t('Channel added') . EOL);
+ info( t('Channel added.') . EOL);
+
+ // If we can view their stream, pull in some posts
+
+ if($result['abook']['abook_their_perms'] & PERMS_R_STREAM)
+ proc_run('php','include/onepoll.php',$result['abook']['abook_id']);
+
- goaway(z_root() . '/connections/' . $result['abook']['abook_id']);
+ goaway(z_root() . '/connedit/' . $result['abook']['abook_id']);
}
+
+function follow_content(&$a) {
+
+ if(! local_user()) {
+ return login();
+ }
+} \ No newline at end of file
diff --git a/mod/fsuggest.php b/mod/fsuggest.php
index 9ef8f4c55..8b6f077d3 100644
--- a/mod/fsuggest.php
+++ b/mod/fsuggest.php
@@ -100,8 +100,9 @@ function fsuggest_content(&$a) {
$o .= '<form id="fsuggest-form" action="fsuggest/' . $contact_id . '" method="post" >';
- $o .= contact_selector('suggest','suggest-select', false,
- array('size' => 4, 'exclude' => $contact_id, 'networks' => 'DFRN_ONLY', 'single' => true));
+// FIXME contact_selector deprecated, removed
+// $o .= contact_selector('suggest','suggest-select', false,
+// array('size' => 4, 'exclude' => $contact_id, 'networks' => 'DFRN_ONLY', 'single' => true));
$o .= '<div id="fsuggest-submit-wrapper"><input id="fsuggest-submit" type="submit" name="submit" value="' . t('Submit') . '" /></div>';
diff --git a/mod/group.php b/mod/group.php
index 778ecbded..66e5fbf8e 100644
--- a/mod/group.php
+++ b/mod/group.php
@@ -2,12 +2,6 @@
require_once('include/group.php');
-function group_aside(&$a) {
- if(local_user()) {
- $a->set_widget('groups_edit',group_side('connections','group',false,(($a->argc > 1) ? intval($a->argv[1]) : 0)));
- }
-}
-
function group_post(&$a) {
@@ -20,7 +14,8 @@ function group_post(&$a) {
check_form_security_token_redirectOnErr('/group/new', 'group_edit');
$name = notags(trim($_POST['groupname']));
- $r = group_add(local_user(),$name);
+ $public = intval($_POST['public']);
+ $r = group_add(local_user(),$name,$public);
if($r) {
info( t('Collection created.') . EOL );
$r = group_byname(local_user(),$name);
@@ -35,7 +30,7 @@ function group_post(&$a) {
if((argc() == 2) && (intval(argv(1)))) {
check_form_security_token_redirectOnErr('/group', 'group_edit');
- $r = q("SELECT * FROM `group` WHERE `id` = %d AND `uid` = %d LIMIT 1",
+ $r = q("SELECT * FROM `groups` WHERE `id` = %d AND `uid` = %d LIMIT 1",
intval(argv(1)),
intval(local_user())
);
@@ -46,14 +41,17 @@ function group_post(&$a) {
}
$group = $r[0];
$groupname = notags(trim($_POST['groupname']));
- if((strlen($groupname)) && ($groupname != $group['name'])) {
- $r = q("UPDATE `group` SET `name` = '%s' WHERE `uid` = %d AND `id` = %d LIMIT 1",
+ $public = intval($_POST['public']);
+
+ if((strlen($groupname)) && (($groupname != $group['name']) || ($public != $group['visible']))) {
+ $r = q("UPDATE `groups` SET `name` = '%s', visible = %d WHERE `uid` = %d AND `id` = %d LIMIT 1",
dbesc($groupname),
+ intval($public),
intval(local_user()),
intval($group['id'])
);
if($r)
- info( t('Collection name changed.') . EOL );
+ info( t('Collection updated.') . EOL );
}
goaway(z_root() . '/group/' . argv(1) . '/' . argv(2));
@@ -85,9 +83,10 @@ function group_content(&$a) {
if((argc() == 2) && (argv(1) === 'new')) {
return replace_macros($tpl, $context + array(
- '$title' => t('Create a collection of connections.'),
+ '$title' => t('Create a collection of channels.'),
'$gname' => array('groupname',t('Collection Name: '), '', ''),
'$gid' => 'new',
+ '$public' => array('public',t('Members are visible to other channels'), false, ''),
'$form_security_token' => get_form_security_token("group_edit"),
));
@@ -98,7 +97,7 @@ function group_content(&$a) {
check_form_security_token_redirectOnErr('/group', 'group_drop', 't');
if(intval(argv(2))) {
- $r = q("SELECT `name` FROM `group` WHERE `id` = %d AND `uid` = %d LIMIT 1",
+ $r = q("SELECT `name` FROM `groups` WHERE `id` = %d AND `uid` = %d LIMIT 1",
intval(argv(2)),
intval(local_user())
);
@@ -133,7 +132,7 @@ function group_content(&$a) {
if((argc() > 1) && (intval(argv(1)))) {
require_once('include/acl_selectors.php');
- $r = q("SELECT * FROM `group` WHERE `id` = %d AND `uid` = %d AND `deleted` = 0 LIMIT 1",
+ $r = q("SELECT * FROM `groups` WHERE `id` = %d AND `uid` = %d AND `deleted` = 0 LIMIT 1",
intval(argv(1)),
intval(local_user())
);
@@ -143,12 +142,14 @@ function group_content(&$a) {
}
$group = $r[0];
+
$members = group_get_members($group['id']);
$preselected = array();
if(count($members)) {
foreach($members as $member)
- $preselected[] = $member['xchan_hash'];
+ if(! in_array($member['xchan_hash'],$preselected))
+ $preselected[] = $member['xchan_hash'];
}
if($change) {
@@ -182,6 +183,7 @@ function group_content(&$a) {
'$gname' => array('groupname',t('Collection Name: '),$group['name'], ''),
'$gid' => $group['id'],
'$drop' => $drop_txt,
+ '$public' => array('public',t('Members are visible to other channels'), $group['visible'], ''),
'$form_security_token' => get_form_security_token('group_edit'),
);
diff --git a/mod/hcard.php b/mod/hcard.php
deleted file mode 100644
index ab2fa88a1..000000000
--- a/mod/hcard.php
+++ /dev/null
@@ -1,53 +0,0 @@
-<?php
-
-function hcard_init(&$a) {
-
- $blocked = (((get_config('system','block_public')) && (! local_user()) && (! remote_user())) ? true : false);
-
- if($a->argc > 1)
- $which = $a->argv[1];
- else {
- notice( t('No profile') . EOL );
- $a->error = 404;
- return;
- }
-
- $profile = 0;
- if((local_user()) && ($a->argc > 2) && ($a->argv[2] === 'view')) {
- $which = $a->user['nickname'];
- $profile = $a->argv[1];
- }
-
- profile_load($a,$which,$profile);
-
- if((x($a->profile,'page-flags')) && ($a->profile['page-flags'] == PAGE_COMMUNITY)) {
- $a->page['htmlhead'] .= '<meta name="friendica.community" content="true" />';
- }
- if(x($a->profile,'openidserver'))
- $a->page['htmlhead'] .= '<link rel="openid.server" href="' . $a->profile['openidserver'] . '" />' . "\r\n";
- if(x($a->profile,'openid')) {
- $delegate = ((strstr($a->profile['openid'],'://')) ? $a->profile['openid'] : 'http://' . $a->profile['openid']);
- $a->page['htmlhead'] .= '<link rel="openid.delegate" href="' . $delegate . '" />' . "\r\n";
- }
-
- if(! $blocked) {
- $keywords = ((x($a->profile,'keywords')) ? $a->profile['keywords'] : '');
- $keywords = str_replace(array(',',' ',',,'),array(' ',',',','),$keywords);
- if(strlen($keywords))
- $a->page['htmlhead'] .= '<meta name="keywords" content="' . $keywords . '" />' . "\r\n" ;
- }
-
- $a->page['htmlhead'] .= '<link rel="alternate" type="application/atom+xml" href="' . $a->get_baseurl() . '/dfrn_poll/' . $which .'" />' . "\r\n" ;
- $uri = urlencode('acct:' . $a->profile['nickname'] . '@' . $a->get_hostname() . (($a->path) ? '/' . $a->path : ''));
- $a->page['htmlhead'] .= '<link rel="lrdd" type="application/xrd+xml" href="' . $a->get_baseurl() . '/xrd/?uri=' . $uri . '" />' . "\r\n";
- header('Link: <' . $a->get_baseurl() . '/xrd/?uri=' . $uri . '>; rel="lrdd"; type="application/xrd+xml"', false);
-
- $dfrn_pages = array('request', 'confirm', 'notify', 'poll');
- foreach($dfrn_pages as $dfrn)
- $a->page['htmlhead'] .= "<link rel=\"dfrn-{$dfrn}\" href=\"".$a->get_baseurl()."/dfrn_{$dfrn}/{$which}\" />\r\n";
-
-}
-
-function hcard_aside(&$a) {
- profile_create_sidebar($a);
-}
diff --git a/mod/help.php b/mod/help.php
index af05bd47c..a4ccd1cfe 100644
--- a/mod/help.php
+++ b/mod/help.php
@@ -1,8 +1,19 @@
<?php
+/**
+ * You can create local site resources in doc/Site.md and either link to doc/Home.md for the standard resources
+ * or use our include mechanism to include it on your local page.
+ *
+ * #include doc/Home.md;
+ *
+ * The syntax is somewhat strict.
+ *
+ */
+
+
if(! function_exists('load_doc_file')) {
function load_doc_file($s) {
- global $lang;
+ $lang = get_app()->language;
if(! isset($lang))
$lang = 'en';
$b = basename($s);
@@ -21,13 +32,32 @@ function help_content(&$a) {
global $lang;
+ $doctype = 'markdown';
+
require_once('library/markdown.php');
$text = '';
- if($a->argc > 1) {
+ if(argc() > 1) {
$text = load_doc_file('doc/' . $a->argv[1] . '.md');
- $a->page['title'] = t('Help:') . ' ' . str_replace('-',' ',notags($a->argv[1]));
+ $a->page['title'] = t('Help:') . ' ' . str_replace('-',' ',notags(argv(1)));
+ }
+ if(! $text) {
+ $text = load_doc_file('doc/' . $a->argv[1] . '.bb');
+ if($text)
+ $doctype = 'bbcode';
+ $a->page['title'] = t('Help:') . ' ' . str_replace('-',' ',notags(argv(1)));
+ }
+ if(! $text) {
+ $text = load_doc_file('doc/' . $a->argv[1] . '.html');
+ if($text)
+ $doctype = 'html';
+ $a->page['title'] = t('Help:') . ' ' . str_replace('-',' ',notags(argv(1)));
+ }
+
+ if(! $text) {
+ $text = load_doc_file('doc/Site.md');
+ $a->page['title'] = t('Help');
}
if(! $text) {
$text = load_doc_file('doc/Home.md');
@@ -41,7 +71,25 @@ function help_content(&$a) {
'$message' => t('Page not found.' )
));
}
-
- return Markdown($text);
+
+ $text = preg_replace_callback("/#include (.*?)\;/ism", 'preg_callback_help_include', $text);
+
+ if($doctype === 'html')
+ return $text;
+ if($doctype === 'markdown')
+ return Markdown($text);
+ if($doctype === 'bbcode') {
+ require_once('include/bbcode.php');
+ return bbcode($text);
+ }
+
+}
+
+
+function preg_callback_help_include($matches) {
+
+ if($matches[1])
+ return str_replace($matches[0],load_doc_file($matches[1]),$matches[0]);
}
+
diff --git a/mod/home.php b/mod/home.php
index 1bb0148d2..05626dcb5 100644
--- a/mod/home.php
+++ b/mod/home.php
@@ -1,6 +1,9 @@
<?php
-if(! function_exists('home_init')) {
+require_once('include/items.php');
+require_once('include/conversation.php');
+
+
function home_init(&$a) {
$ret = array();
@@ -8,35 +11,86 @@ function home_init(&$a) {
$channel = $a->get_channel();
- if(local_user() && $channel && $channel['xchan_url'])
- goaway( $channel['xchan_url']);
+ if(local_user() && $channel && $channel['xchan_url']) {
+ $dest = get_pconfig(local_user(),'system','startpage');
+ if(! $dest)
+ $dest = z_root() . '/network';
+
+ goaway($dest);
+ }
if(get_account_id()) {
- goaway('new_channel');
+ goaway(z_root() . '/new_channel');
}
-}}
+}
-if(! function_exists('home_content')) {
function home_content(&$a) {
$o = '';
if(x($_SESSION,'theme'))
unset($_SESSION['theme']);
- if(x($_SESSION,'mobile-theme'))
- unset($_SESSION['mobile-theme']);
+ if(x($_SESSION,'mobile_theme'))
+ unset($_SESSION['mobile_theme']);
- $o .= '<h1>' . ((x($a->config,'sitename')) ? sprintf( t("Welcome to %s") ,$a->config['sitename']) : "" ) . '</h1>';
- if(file_exists('home.html'))
- $o .= file_get_contents('home.html');
+ $channel_address = get_config("system", "site_channel" );
+ if ($channel_address){
- $o .= login(($a->config['system']['register_policy'] == REGISTER_CLOSED) ? 0 : 1);
-
- call_hooks("home_content",$o);
-
- return $o;
+ // We can do better, but until we figure out auto-linkification, let's keep things simple
+
+ $page_id = 'home';
+
+ $u = q("select channel_id from channel where channel_address = '%s' limit 1",
+ dbesc($channel_address)
+ );
+
+ if(! $u) {
+ notice( t('Channel not found.') . EOL);
+ return;
+ }
+
+ $r = q("select item.* from item left join item_id on item.id = item_id.iid
+ where item.uid = %d and sid = '%s' and service = 'WEBPAGE' and
+ item_restrict = %d limit 1",
+ intval($u[0]['channel_id']),
+ dbesc($page_id),
+ intval(ITEM_WEBPAGE)
+ );
+ if(! $r) {
+ notice( t('Item not found.') . EOL);
+ return;
+ }
+
+ xchan_query($r);
+ $r = fetch_post_tags($r,true);
+ $a->profile = array('profile_uid' => $u[0]['channel_id']);
+ $o .= prepare_page($r[0]);
+ return $o;
+ }
+
+ if(get_config('system','projecthome')) {
+ $o .= file_get_contents('assets/home.html');
+ $a->page['template'] = 'full';
+ return $o;
+ }
+
+ if(file_exists('home.html')) {
+ $o .= file_get_contents('home.html');
+ }
+ else {
+
+ // If there's no site channel or home contents configured, fallback to the old behaviour
+
+ $sitename = get_config('system','sitename');
+ if($sitename)
+ $o .= '<h1>' . sprintf( t("Welcome to %s") ,$sitename) . '</h1>';
+ if (! $a->config['system']['no_login_on_homepage'])
+ $o .= login(($a->config['system']['register_policy'] == REGISTER_CLOSED) ? 0 : 1);
+ }
-}}
+ call_hooks('home_content',$o);
+ return $o;
+}
diff --git a/mod/import.php b/mod/import.php
index f35ca149b..5b3b53156 100644
--- a/mod/import.php
+++ b/mod/import.php
@@ -4,24 +4,29 @@
// connection to original server.
require_once('include/Contact.php');
-
+require_once('include/zot.php');
+require_once('include/identity.php');
function import_post(&$a) {
+ if(! get_account_id()) {
+ return;
+ }
$data = null;
$seize = ((x($_REQUEST,'make_primary')) ? intval($_REQUEST['make_primary']) : 0);
- $src = $_FILES['userfile']['tmp_name'];
- $filename = basename($_FILES['userfile']['name']);
- $filesize = intval($_FILES['userfile']['size']);
- $filetype = $_FILES['userfile']['type'];
+ $src = $_FILES['filename']['tmp_name'];
+ $filename = basename($_FILES['filename']['name']);
+ $filesize = intval($_FILES['filename']['size']);
+ $filetype = $_FILES['filename']['type'];
if($src) {
if($filesize) {
$data = @file_get_contents($src);
}
+ unlink($src);
}
if(! $src) {
@@ -39,7 +44,7 @@ function import_post(&$a) {
$servername = substr($old_address,strpos($old_address,'@')+1);
$scheme = 'https://';
- $api_path = '/api/export/basic?f=&channel=' . $channelname;
+ $api_path = '/api/red/channel/export/basic?f=&channel=' . $channelname;
$binary = false;
$redirects = 0;
$opts = array('http_auth' => $email . ':' . $password);
@@ -60,6 +65,7 @@ function import_post(&$a) {
return;
}
+ $data = json_decode($data,true);
// logger('import: data: ' . print_r($data,true));
@@ -113,9 +119,11 @@ function import_post(&$a) {
// reset
$channel = $r[0];
+ set_default_login_identity(get_account_id(),$channel['channel_id'],false);
+
if($data['photo']) {
- require_once('include/Photo.php');
- import_channel_photo(base64url_decode($data['photo']['data']),$data['photo']['type'],get_account_id,$channel['channel_id']);
+ require_once('include/photo/photo_driver.php');
+ import_channel_photo(base64url_decode($data['photo']['data']),$data['photo']['type'],get_account_id(),$channel['channel_id']);
}
$profiles = $data['profile'];
@@ -198,10 +206,37 @@ function import_post(&$a) {
// import xchans and contact photos
+ if($seize) {
+
+ // replace our existing xchan if we're seizing control
+
+ $r = q("delete from xchan where xchan_hash = '%s' limit 1",
+ dbesc($channel['channel_hash'])
+ );
+
+ $r = q("insert into xchan ( xchan_hash, xchan_guid, xchan_guid_sig, xchan_pubkey, xchan_photo_l, xchan_photo_m, xchan_photo_s, xchan_addr, xchan_url, xchan_follow, xchan_connurl, xchan_name, xchan_network, xchan_photo_date, xchan_name_date ) values ('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s')",
+ dbesc($channel['channel_hash']),
+ dbesc($channel['channel_guid']),
+ dbesc($channel['channel_guid_sig']),
+ dbesc($channel['channel_pubkey']),
+ dbesc($a->get_baseurl() . "/photo/profile/l/" . $channel['channel_id']),
+ dbesc($a->get_baseurl() . "/photo/profile/m/" . $channel['channel_id']),
+ dbesc($a->get_baseurl() . "/photo/profile/s/" . $channel['channel_id']),
+ dbesc($channel['channel_address'] . '@' . get_app()->get_hostname()),
+ dbesc(z_root() . '/channel/' . $channel['channel_address']),
+ dbesc(z_root() . '/follow?f=&url=%s'),
+ dbesc(z_root() . '/poco/' . $channel['channel_address']),
+ dbesc($channel['channel_name']),
+ dbesc('zot'),
+ dbesc(datetime_convert()),
+ dbesc(datetime_convert())
+ );
+ }
$xchans = $data['xchan'];
if($xchans) {
foreach($xchans as $xchan) {
+
$r = q("select xchan_hash from xchan where xchan_hash = '%s' limit 1",
dbesc($xchan['xchan_hash'])
);
@@ -217,7 +252,7 @@ function import_post(&$a) {
. "')" );
- require_once("Photo.php");
+ require_once('include/photo/photo_driver.php');
$photos = import_profile_photo($xchan['xchan_photo_l'],$xchan['xchan_hash']);
$r = q("update xchan set xchan_photo_l = '%s', xchan_photo_m = '%s', xchan_photo_s = '%s', xchan_photo_mimetype = '%s'
where xchan_hash = '%s' limit 1",
@@ -250,6 +285,63 @@ function import_post(&$a) {
}
}
+
+ $configs = $data['config'];
+ if($configs) {
+ foreach($configs as $config) {
+ unset($config['id']);
+ $config['uid'] = $channel['channel_id'];
+ dbesc_array($config);
+ $r = dbq("INSERT INTO pconfig (`"
+ . implode("`, `", array_keys($config))
+ . "`) VALUES ('"
+ . implode("', '", array_values($config))
+ . "')" );
+ }
+ }
+
+ $groups = $data['group'];
+ if($groups) {
+ $saved = array();
+ foreach($groups as $group) {
+ $saved[$group['hash']] = array('old' => $group['id']);
+ unset($group['id']);
+ $group['uid'] = $channel['channel_id'];
+ dbesc_array($group);
+ $r = dbq("INSERT INTO group (`"
+ . implode("`, `", array_keys($group))
+ . "`) VALUES ('"
+ . implode("', '", array_values($group))
+ . "')" );
+ }
+ $r = q("select * from `groups` where uid = %d",
+ intval($channel['channel_id'])
+ );
+ if($r) {
+ foreach($r as $rr) {
+ $saved[$rr['hash']]['new'] = $rr['id'];
+ }
+ }
+ }
+
+ $group_members = $data['group_member'];
+ if($groups_members) {
+ foreach($group_members as $group_member) {
+ unset($group_member['id']);
+ $group_member['uid'] = $channel['channel_id'];
+ foreach($saved as $x) {
+ if($x['old'] == $group_member['gid'])
+ $group_member['gid'] = $x['new'];
+ }
+ dbesc_array($group_member);
+ $r = dbq("INSERT INTO group_member (`"
+ . implode("`, `", array_keys($group_member))
+ . "`) VALUES ('"
+ . implode("', '", array_values($group_member))
+ . "')" );
+ }
+ }
+
// FIXME - ensure we have a self entry if somebody is trying to pull a fast one
if($seize) {
@@ -257,15 +349,28 @@ function import_post(&$a) {
}
+ // This will indirectly perform a refresh_all *and* update the directory
+
+ proc_run('php', 'include/directory.php', $channel['channel_id']);
+
// send out refresh requests
notice( t('Import completed.') . EOL);
+ change_channel($channel['channel_id']);
+
+ goaway(z_root() . '/network' );
+
+
}
function import_content(&$a) {
+ if(! get_account_id()) {
+ notice( t('You must be logged in to use this feature.'));
+ return '';
+ }
$o = replace_macros(get_markup_template('channel_import.tpl'),array(
'$title' => t('Import Channel'),
@@ -284,4 +389,4 @@ function import_content(&$a) {
return $o;
-} \ No newline at end of file
+}
diff --git a/mod/intro.php b/mod/intro.php
deleted file mode 100644
index 5b660485a..000000000
--- a/mod/intro.php
+++ /dev/null
@@ -1,110 +0,0 @@
-<?php
-
-function intro_post(&$a) {
- if(! local_user())
- return;
- if(! intval($_REQUEST['contact_id']))
- return;
-
- $approved = false;
- $flags = 0;
- if($_REQUEST['submit'] == t('Approve')) {
- $approved = true;
- }
- elseif($_REQUEST['submit'] == t('Block')) {
- $flags = ABOOK_FLAG_BLOCKED;
- }
- elseif($_REQUEST['submit'] == t('Ignore')) {
- $flags = ABOOK_FLAG_IGNORED;
- }
- if(intval($_REQUEST['hidden']))
- $flags |= ABOOK_FLAG_HIDDEN;
-
- $r = q("update abook set abook_flags = %d where abook_channel = %d and abook_id = %d limit 1",
- intval($flags),
- intval(local_user()),
- intval($_REQUEST['contact_id'])
- );
- if($r)
- info( t('Connection updated.') . EOL);
- else
- notice( t('Connection update failed.') . EOL);
-
- if($approved)
- goaway(z_root() . '/connections/' . $_REQUEST['contact_id']);
-
-
-}
-
-function intro_aside(&$a) {
- require_once('include/contact_widgets.php');
-
- $a->set_widget('follow', follow_widget());
-
-}
-
-
-function intro_content(&$a) {
-
- if( ! local_user()) {
- notice( t('Permission denied.') . EOL);
- return;
- }
-
-
- $o = replace_macros(get_markup_template('intros_header.tpl'),array(
- '$title' => t('Introductions and Connection Requests')
- ));
-
- $r = q("select count(abook_id) as total from abook where abook_channel = %d and (abook_flags & %d) and not (abook_flags & %d) ",
- intval(local_user()),
- intval(ABOOK_FLAG_PENDING),
- intval(ABOOK_FLAG_SELF)
- );
- if($r) {
- $a->set_pager_total($r[0]['total']);
- if(! intval($r[0]['total'])) {
- notice( t('No pending introductions.') . EOL);
- return $o;
- }
- }
- else {
- notice( t('System error. Please try again later.') . EOL);
- return $o;
- }
-
- $r = q("select abook.*, xchan.* from abook left join xchan on abook_xchan = xchan_hash where abook_channel = %d and (abook_flags & %d) and not (abook_flags & %d) LIMIT %d, %d",
- intval(local_user()),
- intval(ABOOK_FLAG_PENDING),
- intval(ABOOK_FLAG_SELF),
- intval($a->pager['start']),
- intval($a->pager['itemspage'])
- );
-
- if($r) {
-
- $tpl = get_markup_template("intros.tpl");
-
- foreach($r as $rr) {
- $o .= replace_macros($tpl,array(
- '$uid' => local_user(),
-
- '$contact_id' => $rr['abook_id'],
- '$photo' => ((x($rr,'xchan_photo_l')) ? $rr['xchan_photo_l'] : "images/person-175.jpg"),
- '$fullname' => $rr['xchan_name'],
- '$hidden' => array('hidden', t('Hide this contact from others'), ($rr['abook_flags'] & ABOOK_FLAG_HIDDEN), ''),
- '$activity' => array('activity', t('Post a new friend activity'), (intval(get_pconfig(local_user(),'system','post_newfriend')) ? '1' : 0), t('if applicable')),
- '$url' => zid($rr['xchan_url']),
- '$approve' => t('Approve'),
- '$block' => t('Block'),
- '$ignore' => t('Ignore'),
- '$discard' => t('Discard')
-
- ));
- }
- }
-
- $o .= paginate($a);
- return $o;
-
-} \ No newline at end of file
diff --git a/mod/invite.php b/mod/invite.php
index 336e20164..9e37d1e6d 100644
--- a/mod/invite.php
+++ b/mod/invite.php
@@ -42,6 +42,8 @@ function invite_post(&$a) {
foreach($recips as $recip) {
$recip = trim($recip);
+ if(! $recip)
+ continue;
if(! valid_email($recip)) {
notice( sprintf( t('%s : Not a valid email address.'), $recip) . EOL);
@@ -68,9 +70,12 @@ function invite_post(&$a) {
else
$nmessage = $message;
- $res = mail($recip, sprintf( t('Please join us on Friendica'), $a->config['sitename']),
+ $account = $a->get_account();
+
+
+ $res = mail($recip, sprintf( t('Please join us on Red'), $a->config['sitename']),
$nmessage,
- "From: " . $a->user['email'] . "\n"
+ "From: " . $account['account_email'] . "\n"
. 'Content-type: text/plain; charset=UTF-8' . "\n"
. 'Content-transfer-encoding: 8bit' );
@@ -112,29 +117,42 @@ function invite_content(&$a) {
}
}
- $dirloc = get_config('system','directory_submit_url');
- if(strlen($dirloc)) {
- if($a->config['system']['register_policy'] == REGISTER_CLOSED)
- $linktxt = sprintf( t('Visit %s for a list of public sites that you can join. Friendica members on other sites can all connect with each other, as well as with members of many other social networks.'), dirname($dirloc) . '/siteinfo');
- elseif($a->config['system']['register_policy'] != REGISTER_CLOSED)
- $linktxt = sprintf( t('To accept this invitation, please visit and register at %s or any other public Friendica website.'), $a->get_baseurl())
- . "\r\n" . "\r\n" . sprintf( t('Friendica sites all inter-connect to create a huge privacy-enhanced social web that is owned and controlled by its members. They can also connect with many traditional social networks. See %s for a list of alternate Friendica sites you can join.'),dirname($dirloc) . '/siteinfo');
- }
- else {
- $o = t('Our apologies. This system is not currently configured to connect with other public sites or invite members.');
+// $dirloc = get_config('system','directory_submit_url');
+// if(strlen($dirloc)) {
+// if($a->config['system']['register_policy'] == REGISTER_CLOSED)
+// $linktxt = sprintf( t('Visit %s for a list of public sites that you can join. Friendica members on other sites can all connect with each other, as well as with members of many other social networks.'), dirname($dirloc) . '/siteinfo');
+// elseif($a->config['system']['register_policy'] != REGISTER_CLOSED)
+// $linktxt = sprintf( t('To accept this invitation, please visit and register at %s or any other public Friendica website.'), $a->get_baseurl())
+// . "\r\n" . "\r\n" . sprintf( t('Friendica sites all inter-connect to create a huge privacy-enhanced social web that is owned and controlled by its members. They can also connect with many traditional social networks. See %s for a list of alternate Friendica sites you can join.'),dirname($dirloc) . '/siteinfo');
+// }
+// else {
+// $o = t('Our apologies. This system is not currently configured to connect with other public sites or invite members.');
+// return $o;
+// }
+
+ $ob = $a->get_observer();
+ if(! $ob)
return $o;
- }
+
+ $channel = $a->get_channel();
$o = replace_macros($tpl, array(
'$form_security_token' => get_form_security_token("send_invite"),
'$invite' => t('Send invitations'),
'$addr_text' => t('Enter email addresses, one per line:'),
'$msg_text' => t('Your message:'),
- '$default_message' => t('You are cordially invited to join me and other close friends on Friendica - and help us to create a better social web.') . "\r\n" . "\r\n"
+ '$default_message' => t('You are cordially invited to join me and some other close friends on the Red Matrix - a revolutionary new decentralised communication and information tool.') . "\r\n" . "\r\n"
. $linktxt
- . "\r\n" . "\r\n" . (($invonly) ? t('You will need to supply this invitation code: $invite_code') . "\r\n" . "\r\n" : '') .t('Once you have registered, please connect with me via my profile page at:')
- . "\r\n" . "\r\n" . $a->get_baseurl() . '/channel/' . $a->user['nickname']
- . "\r\n" . "\r\n" . t('For more information about the Friendica project and why we feel it is important, please visit http://friendica.com') . "\r\n" . "\r\n" ,
+ . (($invonly) ? "\r\n" . "\r\n" . t('You will need to supply this invitation code: $invite_code') . "\r\n" . "\r\n" : '')
+ . t('Please visit my channel at')
+ . "\r\n" . "\r\n"
+ . z_root() . "/channel/" . $channel['channel_address']
+ . "\r\n" . "\r\n"
+ . t('Once you have registered (on ANY Red Matrix site - they are all inter-connected), please connect with my Red Matrix channel address:')
+ . "\r\n" . "\r\n" . $ob['xchan_addr']
+ . "\r\n" . "\r\n" . t('Click the [Register] link on the following page to join.') . "\r\n" . "\r\n" . z_root()
+
+ . "\r\n" . "\r\n" . t('For more information about the Red Matrix Project and why it has the potential to change the internet as we know it, please visit http://getzot.com') . "\r\n" . "\r\n" ,
'$submit' => t('Submit')
));
diff --git a/mod/item.php b/mod/item.php
index 8298d3dc0..23fce2fd7 100644
--- a/mod/item.php
+++ b/mod/item.php
@@ -58,29 +58,54 @@ function item_post(&$a) {
// If you are unsure, it is prudent (and important) to leave it unset.
$origin = (($api_source && array_key_exists('origin',$_REQUEST)) ? intval($_REQUEST['origin']) : 1);
- $owner_hash = null;
+ // To represent message-ids on other networks - this will create an item_id record
+
+ $namespace = (($api_source && array_key_exists('namespace',$_REQUEST)) ? strip_tags($_REQUEST['namespace']) : '');
+ $remote_id = (($api_source && array_key_exists('remote_id',$_REQUEST)) ? strip_tags($_REQUEST['remote_id']) : '');
- $profile_uid = ((x($_REQUEST,'profile_uid')) ? intval($_REQUEST['profile_uid']) : 0);
- $post_id = ((x($_REQUEST,'post_id')) ? intval($_REQUEST['post_id']) : 0);
- $app = ((x($_REQUEST,'source')) ? strip_tags($_REQUEST['source']) : '');
- $return_path = ((x($_REQUEST,'return')) ? $_REQUEST['return'] : '');
- $preview = ((x($_REQUEST,'preview')) ? intval($_REQUEST['preview']) : 0);
- $categories = ((x($_REQUEST,'category')) ? escape_tags($_REQUEST['category']) : '');
- $webpage = ((x($_REQUEST,'webpage')) ? intval($_REQUEST['webpage']) : 0);
- $pagetitle = ((x($_REQUEST,'pagetitle')) ? escape_tags($_REQUEST['pagetitle']): '');
+ $owner_hash = null;
+ $message_id = ((x($_REQUEST,'message_id') && $api_source) ? strip_tags($_REQUEST['message_id']) : '');
+ $created = ((x($_REQUEST,'created')) ? datetime_convert('UTC','UTC',$_REQUEST['created']) : datetime_convert());
+ $profile_uid = ((x($_REQUEST,'profile_uid')) ? intval($_REQUEST['profile_uid']) : 0);
+ $post_id = ((x($_REQUEST,'post_id')) ? intval($_REQUEST['post_id']) : 0);
+ $app = ((x($_REQUEST,'source')) ? strip_tags($_REQUEST['source']) : '');
+ $return_path = ((x($_REQUEST,'return')) ? $_REQUEST['return'] : '');
+ $preview = ((x($_REQUEST,'preview')) ? intval($_REQUEST['preview']) : 0);
+ $categories = ((x($_REQUEST,'category')) ? escape_tags($_REQUEST['category']) : '');
+ $webpage = ((x($_REQUEST,'webpage')) ? intval($_REQUEST['webpage']) : 0);
+ $pagetitle = ((x($_REQUEST,'pagetitle')) ? escape_tags($_REQUEST['pagetitle']) : '');
+ $layout_mid = ((x($_REQUEST,'layout_mid')) ? escape_tags($_REQUEST['layout_mid']): '');
+ $plink = ((x($_REQUEST,'permalink')) ? escape_tags($_REQUEST['permalink']) : '');
+
+
+ /*
+ Check service class limits
+ */
+ if (local_user() && !(x($_REQUEST,'parent')) && !(x($_REQUEST,'post_id'))) {
+ $ret=item_check_service_class(local_user(),x($_REQUEST,'webpage'));
+ if (!$ret['success']) {
+ notice( t($ret['message']) . EOL) ;
+ if(x($_REQUEST,'return'))
+ goaway($a->get_baseurl() . "/" . $return_path );
+ killme();
+ }
+ }
if($pagetitle) {
require_once('library/urlify/URLify.php');
$pagetitle = strtolower(URLify::transliterate($pagetitle));
}
+
+ $item_flags = $item_restrict = 0;
+
/**
* Is this a reply to something?
*/
$parent = ((x($_REQUEST,'parent')) ? intval($_REQUEST['parent']) : 0);
- $parent_uri = ((x($_REQUEST,'parent_uri')) ? trim($_REQUEST['parent_uri']) : '');
+ $parent_mid = ((x($_REQUEST,'parent_mid')) ? trim($_REQUEST['parent_mid']) : '');
$parent_item = null;
$parent_contact = null;
@@ -88,7 +113,7 @@ function item_post(&$a) {
$parid = 0;
$r = false;
- if($parent || $parent_uri) {
+ if($parent || $parent_mid) {
if(! x($_REQUEST,'type'))
$_REQUEST['type'] = 'net-comment';
@@ -98,17 +123,17 @@ function item_post(&$a) {
intval($parent)
);
}
- elseif($parent_uri && local_user()) {
+ elseif($parent_mid && local_user()) {
// This is coming from an API source, and we are logged in
- $r = q("SELECT * FROM `item` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
- dbesc($parent_uri),
+ $r = q("SELECT * FROM `item` WHERE `mid` = '%s' AND `uid` = %d LIMIT 1",
+ dbesc($parent_mid),
intval(local_user())
);
}
// if this isn't the real parent of the conversation, find it
if($r !== false && count($r)) {
$parid = $r[0]['parent'];
- $parent_uri = $r[0]['uri'];
+ $parent_mid = $r[0]['mid'];
if($r[0]['id'] != $r[0]['parent']) {
$r = q("SELECT * FROM `item` WHERE `id` = `parent` AND `parent` = %d LIMIT 1",
intval($parid)
@@ -122,32 +147,51 @@ function item_post(&$a) {
goaway($a->get_baseurl() . "/" . $return_path );
killme();
}
+
+ // can_comment_on_post() needs info from the following xchan_query
+ xchan_query($r);
$parent_item = $r[0];
$parent = $r[0]['id'];
// multi-level threading - preserve the info but re-parent to our single level threading
//if(($parid) && ($parid != $parent))
- $thr_parent = $parent_uri;
+ $thr_parent = $parent_mid;
- if($parent_item['contact-id'] && $uid) {
- $r = q("SELECT * FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1",
- intval($parent_item['contact-id']),
- intval($uid)
- );
- if(count($r))
- $parent_contact = $r[0];
- }
- }
+// if($parent_item['contact-id'] && $uid) {
+// $r = q("SELECT * FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1",
+// intval($parent_item['contact-id']),
+// intval($uid)
+// );
+// if(count($r))
+// $parent_contact = $r[0];
+// }
- if($parent) logger('mod_item: item_post parent=' . $parent);
+ }
$observer = $a->get_observer();
- if(! perm_is_allowed($profile_uid,$observer['xchan_hash'],(($parent) ? 'post_comments' : 'post_wall'))) {
- notice( t('Permission denied.') . EOL) ;
- if(x($_REQUEST,'return'))
- goaway($a->get_baseurl() . "/" . $return_path );
- killme();
+ if($parent) {
+ logger('mod_item: item_post parent=' . $parent);
+ $can_comment = false;
+ if((array_key_exists('owner',$parent_item)) && ($parent_item['owner']['abook_flags'] & ABOOK_FLAG_SELF))
+ $can_comment = perm_is_allowed($profile_uid,$observer['xchan_hash'],'post_comments');
+ else
+ $can_comment = can_comment_on_post($observer['xchan_hash'],$parent_item);
+
+ if(! $can_comment) {
+ notice( t('Permission denied.') . EOL) ;
+ if(x($_REQUEST,'return'))
+ goaway($a->get_baseurl() . "/" . $return_path );
+ killme();
+ }
+ }
+ else {
+ if(! perm_is_allowed($profile_uid,$observer['xchan_hash'],'post_wall')) {
+ notice( t('Permission denied.') . EOL) ;
+ if(x($_REQUEST,'return'))
+ goaway($a->get_baseurl() . "/" . $return_path );
+ killme();
+ }
}
@@ -155,6 +199,16 @@ function item_post(&$a) {
$orig_post = null;
+ if($namespace && $remote_id) {
+ // It wasn't an internally generated post - see if we've got an item matching this remote service id
+ $i = q("select iid from item_id where service = '%s' and sid = '%s' limit 1",
+ dbesc($namespace),
+ dbesc($remote_id)
+ );
+ if($i)
+ $post_id = $i[0]['iid'];
+ }
+
if($post_id) {
$i = q("SELECT * FROM `item` WHERE `uid` = %d AND `id` = %d LIMIT 1",
intval($profile_uid),
@@ -200,6 +254,10 @@ function item_post(&$a) {
goaway($a->get_baseurl() . "/" . $return_path );
killme();
}
+
+ if($observer) {
+ logger('mod_item: post accepted from ' . $observer['xchan_name'] . ' for ' . $owner_xchan['xchan_name'], LOGGER_DEBUG);
+ }
if($orig_post) {
@@ -210,11 +268,17 @@ function item_post(&$a) {
$location = $orig_post['location'];
$coord = $orig_post['coord'];
$verb = $orig_post['verb'];
- $app = $orig_post['app'];
+ $app = $orig_post['app'];
$title = escape_tags(trim($_REQUEST['title']));
- $body = escape_tags(trim($_REQUEST['body']));
+ $body = $_REQUEST['body'];
$private = $orig_post['item_private'];
-
+ $item_flags = $orig_post['item_flags'];
+ $item_restrict = $orig_post['item_restrict'];
+ $postopts = $orig_post['postopts'];
+ $created = $orig_post['created'];
+ $mid = $orig_post['mid'];
+ $parent_mid = $orig_post['parent_mid'];
+ $plink = $orig_post['plink'];
}
else {
@@ -242,11 +306,12 @@ function item_post(&$a) {
$str_contact_deny = perms2str($_REQUEST['contact_deny']);
}
- $title = escape_tags(trim($_REQUEST['title']));
$location = notags(trim($_REQUEST['location']));
$coord = notags(trim($_REQUEST['coord']));
$verb = notags(trim($_REQUEST['verb']));
- $body = escape_tags(trim($_REQUEST['body']));
+ $title = escape_tags(trim($_REQUEST['title']));
+ $body = $_REQUEST['body'];
+ $postopts = '';
$private = (
( strlen($str_group_allow)
@@ -287,164 +352,215 @@ function item_post(&$a) {
$expires = '0000-00-00 00:00:00';
- if(feature_enabled($profile_uid,'expire')) {
- // expire_quantity, e.g. '3'
- // expire_units, e.g. days, weeks, months
- if(x($_REQUEST,'expire_quantity') && (x($_REQUEST,'expire_units'))) {
- $expire = datetime_convert(date_default_timezone_get(),'UTC', 'now + ' . $_REQUEST['expire_quantity'] . ' ' . $_REQUEST['expire_units']);
+ if(feature_enabled($profile_uid,'content_expire')) {
+ if(x($_REQUEST,'expire')) {
+ $expires = datetime_convert(date_default_timezone_get(),'UTC', $_REQUEST['expire']);
if($expires <= datetime_convert())
$expires = '0000-00-00 00:00:00';
}
}
- // Work around doubled linefeeds in Tinymce 3.5b2
- // First figure out if it's a status post that would've been
- // created using tinymce. Otherwise leave it alone.
- $plaintext = ((feature_enabled($profile_uid,'richtext')) ? false : true);
- if((! $parent) && (! $api_source) && (! $plaintext)) {
- $body = fix_mce_lf($body);
- }
+ $post_type = notags(trim($_REQUEST['type']));
+ $mimetype = notags(trim($_REQUEST['mimetype']));
+ if(! $mimetype)
+ $mimetype = 'text/bbcode';
- // get contact info for poster
+ // Verify ability to use html or php!!!
+ if($preview) {
+ $body = z_input_filter($profile_uid,$body,$mimetype);
+ }
-/*
- $author = null;
- $self = false;
- $contact_id = 0;
+ $execflag = false;
- if((local_user()) && (local_user() == $profile_uid)) {
- $self = true;
- $r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `self` = 1 LIMIT 1",
- intval($_SESSION['uid'])
+ if($mimetype === 'application/x-php') {
+ $z = q("select account_id, account_roles from account left join channel on channel_account_id = account_id where channel_id = %d limit 1",
+ intval($profile_uid)
);
- }
- elseif(remote_user()) {
- if(is_array($_SESSION['remote'])) {
- foreach($_SESSION['remote'] as $v) {
- if($v['uid'] == $profile_uid) {
- $contact_id = $v['cid'];
- break;
- }
+ if($z && ($z[0]['account_roles'] & ACCOUNT_ROLE_ALLOWCODE)) {
+ if(local_user() && (get_account_id() == $z[0]['account_id'])) {
+ $execflag = true;
+ }
+ else {
+ notice( t('Executable content type not permitted to this channel.') . EOL);
+ if(x($_REQUEST,'return'))
+ goaway($a->get_baseurl() . "/" . $return_path );
+ killme();
}
- }
- if($contact_id) {
- $r = q("SELECT * FROM `contact` WHERE `id` = %d LIMIT 1",
- intval($contact_id)
- );
}
}
- if(count($r)) {
- // FIXME
- $author = $r[0];
- $contact_id = $author['id'];
- }
+ if($mimetype === 'text/bbcode') {
- // get contact info for owner
-
- if($profile_uid == local_user()) {
- $contact_record = $author;
- }
- else {
- $r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `self` = 1 LIMIT 1",
- intval($profile_uid)
- );
- if(count($r))
- $contact_record = $r[0];
- }
+ // BBCODE alert: the following functions assume bbcode input
+ // and will require alternatives for alternative content-types (text/html, text/markdown, text/plain, etc.)
+ // we may need virtual or template classes to implement the possible alternatives
-*/
+ // Work around doubled linefeeds in Tinymce 3.5b2
+ // First figure out if it's a status post that would've been
+ // created using tinymce. Otherwise leave it alone.
- $post_type = notags(trim($_REQUEST['type']));
+ $plaintext = ((feature_enabled($profile_uid,'richtext')) ? false : true);
+ if((! $parent) && (! $api_source) && (! $plaintext)) {
+ $body = fix_mce_lf($body);
+ }
+ // If we're sending a private top-level message with a single @-taggable channel as a recipient, @-tag it, if our pconfig is set.
- /**
- *
- * When a photo was uploaded into the message using the (profile wall) ajax
- * uploader, The permissions are initially set to disallow anybody but the
- * owner from seeing it. This is because the permissions may not yet have been
- * set for the post. If it's private, the photo permissions should be set
- * appropriately. But we didn't know the final permissions on the post until
- * now. So now we'll look for links of uploaded messages that are in the
- * post and set them to the same permissions as the post itself.
- *
- */
- if(! $preview) {
- fix_attached_photo_permissions($profile_uid,$owner_xchan['xchan_hash'],$body,
- $str_contact_allow,$str_group_allow,$str_contact_deny,$str_group_deny);
+ if((! $parent) && (get_pconfig($profile_uid,'system','tagifonlyrecip')) && (substr_count($str_contact_allow,'<') == 1) && ($str_group_allow == '') && ($str_contact_deny == '') && ($str_group_deny == '')) {
+ $x = q("select abook_id, abook_their_perms from abook where abook_xchan = '%s' and abook_channel = %d limit 1",
+ dbesc(str_replace(array('<','>'),array('',''),$str_contact_allow)),
+ intval($profile_uid)
+ );
+ if($x && ($x[0]['abook_their_perms'] & PERMS_W_TAGWALL))
+ $body .= "\n\n@group+" . $x[0]['abook_id'] . "\n";
+ }
- fix_attached_file_permissions($channel,$observer['xchan_hash'],$body,
- $str_contact_allow,$str_group_allow,$str_contact_deny,$str_group_deny);
+ /**
+ * fix naked links by passing through a callback to see if this is a red site
+ * (already known to us) which will get a zrl, otherwise link with url
+ */
+
+ $body = preg_replace_callback("/([^\]\='".'"'."]|^)(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\@\_\~\#\%\$\!\+\,]+)/ism", 'red_zrl_callback', $body);
+
+ /**
+ *
+ * When a photo was uploaded into the message using the (profile wall) ajax
+ * uploader, The permissions are initially set to disallow anybody but the
+ * owner from seeing it. This is because the permissions may not yet have been
+ * set for the post. If it's private, the photo permissions should be set
+ * appropriately. But we didn't know the final permissions on the post until
+ * now. So now we'll look for links of uploaded photos and attachments that are in the
+ * post and set them to the same permissions as the post itself.
+ *
+ * If the post was end-to-end encrypted we can't find images and attachments in the body,
+ * use our media_str input instead which only contains these elements - but only do this
+ * when encrypted content exists because the photo/attachment may have been removed from
+ * the post and we should keep it private. If it's encrypted we have no way of knowing
+ * so we'll set the permissions regardless and realise that the media may not be
+ * referenced in the post.
+ */
+
+ if(! $preview) {
+ fix_attached_photo_permissions($profile_uid,$owner_xchan['xchan_hash'],((strpos($body,'[/crypt]')) ? $_POST['media_str'] : $body),$str_contact_allow,$str_group_allow,$str_contact_deny,$str_group_deny);
+
+ fix_attached_file_permissions($channel,$observer['xchan_hash'],((strpos($body,'[/crypt]')) ? $_POST['media_str'] : $body),$str_contact_allow,$str_group_allow,$str_contact_deny,$str_group_deny);
- }
+ }
- $body = bb_translate_video($body);
+ $body = bb_translate_video($body);
- /**
- * Fold multi-line [code] sequences
- */
+ /**
+ * Fold multi-line [code] sequences
+ */
- $body = preg_replace('/\[\/code\]\s*\[code\]/ism',"\n",$body);
+ $body = preg_replace('/\[\/code\]\s*\[code\]/ism',"\n",$body);
- $body = scale_external_images($body,false);
+ $body = scale_external_images($body,false);
- /**
- * Look for any tags and linkify them
- */
+ /**
+ * Look for any tags and linkify them
+ */
- $str_tags = '';
- $inform = '';
- $post_tags = array();
+ $str_tags = '';
+ $inform = '';
+ $post_tags = array();
- $tags = get_tags($body);
+ $tags = get_tags($body);
- $tagged = array();
+ $tagged = array();
- $private_forum = false;
+ $private_forum = false;
- if(count($tags)) {
- foreach($tags as $tag) {
+ if(count($tags)) {
+ foreach($tags as $tag) {
- // If we already tagged 'Robert Johnson', don't try and tag 'Robert'.
- // Robert Johnson should be first in the $tags array
+ // If we already tagged 'Robert Johnson', don't try and tag 'Robert'.
+ // Robert Johnson should be first in the $tags array
- $fullnametagged = false;
- for($x = 0; $x < count($tagged); $x ++) {
- if(stristr($tagged[$x],$tag . ' ')) {
- $fullnametagged = true;
- break;
+ $fullnametagged = false;
+ for($x = 0; $x < count($tagged); $x ++) {
+ if(stristr($tagged[$x],$tag . ' ')) {
+ $fullnametagged = true;
+ break;
+ }
+ }
+ if($fullnametagged)
+ continue;
+
+ $success = handle_tag($a, $body, $access_tag, $str_tags, (local_user()) ? local_user() : $profile_uid , $tag);
+ logger('handle_tag: ' . print_r($success,tue), LOGGER_DEBUG);
+ if(($access_tag) && (! $parent_item)) {
+ logger('access_tag: ' . $tag . ' ' . print_r($access_tag,true), LOGGER_DEBUG);
+ if(strpos($access_tag,'cid:') === 0) {
+ $str_contact_allow .= '<' . substr($access_tag,4) . '>';
+ $access_tag = '';
+ }
+ elseif(strpos($access_tag,'gid:') === 0) {
+ $str_group_allow .= '<' . substr($access_tag,4) . '>';
+ $access_tag = '';
+ }
+ }
+
+ if($success['replaced']) {
+ $tagged[] = $tag;
+ $post_tags[] = array(
+ 'uid' => $profile_uid,
+ 'type' => $success['termtype'],
+ 'otype' => TERM_OBJ_POST,
+ 'term' => $success['term'],
+ 'url' => $success['url']
+ );
+ }
+ if(is_array($success['contact']) && intval($success['contact']['prv'])) {
+ $private_forum = true;
+ $private_id = $success['contact']['id'];
}
}
- if($fullnametagged)
- continue;
-
- $success = handle_tag($a, $body, $inform, $str_tags, (local_user()) ? local_user() : $profile_uid , $tag);
- logger('handle_tag: ' . print_r($success,tue));
-
- if($success['replaced']) {
- $tagged[] = $tag;
- $post_tags[] = array(
- 'uid' => $profile_uid,
- 'type' => $success['termtype'],
- 'otype' => TERM_OBJ_POST,
- 'term' => $success['term'],
- 'url' => $success['url']
- );
- }
- if(is_array($success['contact']) && intval($success['contact']['prv'])) {
- $private_forum = true;
- $private_id = $success['contact']['id'];
+ }
+
+
+// logger('post_tags: ' . print_r($post_tags,true));
+
+ if(($private_forum) && (! $parent) && (! $private)) {
+ // we tagged a private forum in a top level post and the message was public.
+ // Restrict it.
+ $private = 1;
+ $str_contact_allow = '<' . $private_id . '>';
+ }
+
+ $attachments = '';
+ $match = false;
+
+ if(preg_match_all('/(\[attachment\](.*?)\[\/attachment\])/',$body,$match)) {
+ $attachments = array();
+ foreach($match[2] as $mtch) {
+ $hash = substr($mtch,0,strpos($mtch,','));
+ $rev = intval(substr($mtch,strpos($mtch,',')));
+ $r = attach_by_hash_nodata($hash,$rev);
+ if($r['success']) {
+ $attachments[] = array(
+ 'href' => $a->get_baseurl() . '/attach/' . $r['data']['hash'],
+ 'length' => $r['data']['filesize'],
+ 'type' => $r['data']['filetype'],
+ 'title' => urlencode($r['data']['filename']),
+ 'revision' => $r['data']['revision']
+ );
+ }
+ $body = str_replace($match[1],'',$body);
}
}
}
+// BBCODE end alert
+
+
if(strlen($categories)) {
$cats = explode(',',$categories);
foreach($cats as $cat) {
@@ -453,44 +569,13 @@ function item_post(&$a) {
'type' => TERM_CATEGORY,
'otype' => TERM_OBJ_POST,
'term' => trim($cat),
- 'url' => ''
+ 'url' => $owner_xchan['xchan_url'] . '?f=&cat=' . urlencode(trim($cat))
);
}
}
-// logger('post_tags: ' . print_r($post_tags,true));
-
- if(($private_forum) && (! $parent) && (! $private)) {
- // we tagged a private forum in a top level post and the message was public.
- // Restrict it.
- $private = 1;
- $str_contact_allow = '<' . $private_id . '>';
- }
-
- $attachments = '';
- $match = false;
-
- if(preg_match_all('/(\[attachment\](.*?)\[\/attachment\])/',$body,$match)) {
- $attachments = array();
- foreach($match[2] as $mtch) {
- $hash = substr($mtch,0,strpos($mtch,','));
- $rev = intval(substr($mtch,strpos($mtch,',')));
- $r = attach_by_hash_nodata($hash,$rev);
- if($r['success']) {
- $attachments[] = array(
- 'href' => $a->get_baseurl() . '/attach/' . $r['data']['hash'],
- 'length' => $r['data']['filesize'],
- 'type' => $r['data']['filetype'],
- 'title' => urlencode($r['data']['filename']),
- 'revision' => $r['data']['revision']
- );
- }
- $body = str_replace($match[1],'',$body);
- }
- }
-
- $item_flags = ITEM_UNSEEN;
- $item_restrict = ITEM_VISIBLE;
+ $item_flags |= ITEM_UNSEEN;
+// $item_restrict |= ITEM_VISIBLE;
if($post_type === 'wall' || $post_type === 'wall-comment')
$item_flags = $item_flags | ITEM_WALL;
@@ -502,9 +587,7 @@ function item_post(&$a) {
$item_restrict = $item_restrict | ITEM_MODERATED;
if($webpage)
- $item_restrict = $item_restrict | ITEM_WEBPAGE;
-
-
+ $item_restrict = $item_restrict | $webpage;
if(! strlen($verb))
@@ -512,54 +595,65 @@ function item_post(&$a) {
$notify_type = (($parent) ? 'comment-new' : 'wall-new' );
- $uri = item_message_id();
- $parent_uri = $uri;
+ if(! $mid) {
+ $mid = (($message_id) ? $message_id : item_message_id());
+ }
+ if(! $parent_mid) {
+ $parent_mid = $mid;
+ }
+
if($parent_item)
- $parent_uri = $parent_item['uri'];
+ $parent_mid = $parent_item['mid'];
// Fallback so that we alway have a thr_parent
if(!$thr_parent)
- $thr_parent = $uri;
+ $thr_parent = $mid;
$datarray = array();
if(! $parent) {
- $datarray['parent_uri'] = $uri;
$item_flags = $item_flags | ITEM_THREAD_TOP;
}
-
- $datarray['aid'] = $channel['channel_account_id'];
- $datarray['uid'] = $profile_uid;
-
- $datarray['owner_xchan'] = (($owner_hash) ? $owner_hash : $owner_xchan['xchan_hash']);
- $datarray['author_xchan'] = $observer['xchan_hash'];
- $datarray['created'] = datetime_convert();
- $datarray['edited'] = datetime_convert();
- $datarray['expires'] = $expires;
- $datarray['commented'] = datetime_convert();
- $datarray['received'] = datetime_convert();
- $datarray['changed'] = datetime_convert();
- $datarray['uri'] = $uri;
- $datarray['parent_uri'] = $parent_uri;
- $datarray['title'] = $title;
- $datarray['body'] = $body;
- $datarray['app'] = $app;
- $datarray['location'] = $location;
- $datarray['coord'] = $coord;
- $datarray['inform'] = $inform;
- $datarray['verb'] = $verb;
- $datarray['allow_cid'] = $str_contact_allow;
- $datarray['allow_gid'] = $str_group_allow;
- $datarray['deny_cid'] = $str_contact_deny;
- $datarray['deny_gid'] = $str_group_deny;
- $datarray['item_private'] = $private;
- $datarray['attach'] = $attachments;
- $datarray['thr_parent'] = $thr_parent;
- $datarray['postopts'] = '';
- $datarray['item_restrict'] = $item_restrict;
- $datarray['item_flags'] = $item_flags;
+ if ((! $plink) && ($item_flags & ITEM_THREAD_TOP)) {
+ $plink = z_root() . '/channel/' . $channel['channel_address'] . '/?f=&mid=' . $mid;
+ }
+
+ $datarray['aid'] = $channel['channel_account_id'];
+ $datarray['uid'] = $profile_uid;
+
+ $datarray['owner_xchan'] = (($owner_hash) ? $owner_hash : $owner_xchan['xchan_hash']);
+ $datarray['author_xchan'] = $observer['xchan_hash'];
+ $datarray['created'] = $created;
+ $datarray['edited'] = datetime_convert();
+ $datarray['expires'] = $expires;
+ $datarray['commented'] = datetime_convert();
+ $datarray['received'] = datetime_convert();
+ $datarray['changed'] = datetime_convert();
+ $datarray['mid'] = $mid;
+ $datarray['parent_mid'] = $parent_mid;
+ $datarray['mimetype'] = $mimetype;
+ $datarray['title'] = $title;
+ $datarray['body'] = $body;
+ $datarray['app'] = $app;
+ $datarray['location'] = $location;
+ $datarray['coord'] = $coord;
+ $datarray['verb'] = $verb;
+ $datarray['allow_cid'] = $str_contact_allow;
+ $datarray['allow_gid'] = $str_group_allow;
+ $datarray['deny_cid'] = $str_contact_deny;
+ $datarray['deny_gid'] = $str_group_deny;
+ $datarray['item_private'] = $private;
+ $datarray['attach'] = $attachments;
+ $datarray['thr_parent'] = $thr_parent;
+ $datarray['postopts'] = $postopts;
+ $datarray['item_restrict'] = $item_restrict;
+ $datarray['item_flags'] = $item_flags;
+ $datarray['layout_mid'] = $layout_mid;
+ $datarray['comment_policy'] = map_scope($channel['channel_w_comment']);
+ $datarray['term'] = $post_tags;
+ $datarray['plink'] = $plink;
// preview mode - prepare the body for display and send it via json
@@ -568,11 +662,14 @@ function item_post(&$a) {
$datarray['owner'] = $owner_xchan;
$datarray['author'] = $observer;
+ $datarray['attach'] = json_encode($datarray['attach']);
$o = conversation($a,array($datarray),'search',false,'preview');
logger('preview: ' . $o, LOGGER_DEBUG);
echo json_encode(array('preview' => $o));
killme();
}
+ if($orig_post)
+ $datarray['edit'] = true;
call_hooks('post_local',$datarray);
@@ -591,27 +688,35 @@ function item_post(&$a) {
}
- if($orig_post) {
- $r = q("UPDATE `item` SET `title` = '%s', `body` = '%s', `attach` = '%s', `edited` = '%s' WHERE `id` = %d AND `uid` = %d LIMIT 1",
- dbesc($datarray['title']),
- dbesc($datarray['body']),
- dbesc($datarray['attach']),
- dbesc(datetime_convert()),
- intval($post_id),
- intval($profile_uid)
- );
+ if(mb_strlen($datarray['title']) > 255)
+ $datarray['title'] = mb_substr($datarray['title'],0,255);
- // remove taxonomy items for this post - we'll recreate them
+ if(array_key_exists('item_private',$datarray) && $datarray['item_private']) {
- q("delete from term where otype = %d and oid = %d and type in (%d, %d, %d, %d) ",
- intval(TERM_OBJ_POST),
- intval($post_id),
- intval(TERM_UNKNOWN),
- intval(TERM_HASHTAG),
- intval(TERM_MENTION),
- intval(TERM_CATEGORY)
- );
+ $datarray['body'] = z_input_filter($datarray['uid'],$datarray['body'],$datarray['mimetype']);
+
+ if(local_user()) {
+ if($channel['channel_hash'] === $datarray['author_xchan']) {
+ $datarray['sig'] = base64url_encode(rsa_sign($datarray['body'],$channel['channel_prvkey']));
+ $datarray['item_flags'] = $datarray['item_flags'] | ITEM_VERIFIED;
+ }
+ }
+
+ logger('Encrypting local storage');
+ $key = get_config('system','pubkey');
+ $datarray['item_flags'] = $datarray['item_flags'] | ITEM_OBSCURED;
+ if($datarray['title'])
+ $datarray['title'] = json_encode(aes_encapsulate($datarray['title'],$key));
+ if($datarray['body'])
+ $datarray['body'] = json_encode(aes_encapsulate($datarray['body'],$key));
+ }
+
+ if($orig_post) {
+ $datarray['id'] = $post_id;
+
+ item_store_update($datarray,$execflag);
+ update_remote_id($channel,$post_id,$webpage,$pagetitle,$namespace,$remote_id,$mid);
proc_run('php', "include/notifier.php", 'edit_post', $post_id);
if((x($_REQUEST,'return')) && strlen($return_path)) {
@@ -624,26 +729,14 @@ function item_post(&$a) {
$post_id = 0;
- $post_id = item_store($datarray);
+ $post = item_store($datarray,$execflag);
+
+
+ $post_id = $post['item_id'];
if($post_id) {
logger('mod_item: saved item ' . $post_id);
- if(count($post_tags)) {
- foreach($post_tags as $tag) {
- if(strlen(trim($tag['term']))) {
- q("insert into term (uid,oid,otype,type,term,url) values (%d,%d,%d,%d,'%s','%s')",
- intval($tag['uid']),
- intval($post_id),
- intval($tag['otype']),
- intval($tag['type']),
- dbesc(trim($tag['term'])),
- dbesc(trim($tag['url']))
- );
- }
- }
- }
-
if($parent) {
$r = q("UPDATE `item` SET `changed` = '%s' WHERE `parent` = %d ",
@@ -659,7 +752,7 @@ function item_post(&$a) {
dbesc($parent_item['allow_gid']),
dbesc($parent_item['deny_cid']),
dbesc($parent_item['deny_gid']),
- intval($parent_item['private']),
+ intval($parent_item['item_private']),
intval($post_id)
);
@@ -669,11 +762,11 @@ function item_post(&$a) {
'from_xchan' => $datarray['author_xchan'],
'to_xchan' => $datarray['owner_xchan'],
'item' => $datarray,
- 'link' => $a->get_baseurl() . '/display/' . $datarray['uri'],
+ 'link' => $a->get_baseurl() . '/display/' . $datarray['mid'],
'verb' => ACTIVITY_POST,
'otype' => 'item',
'parent' => $parent,
- 'parent_uri' => $parent_item['uri']
+ 'parent_mid' => $parent_item['mid']
));
}
@@ -688,7 +781,7 @@ function item_post(&$a) {
'from_xchan' => $datarray['author_xchan'],
'to_xchan' => $datarray['owner_xchan'],
'item' => $datarray,
- 'link' => $a->get_baseurl() . '/display/' . $datarray['uri'],
+ 'link' => $a->get_baseurl() . '/display/' . $datarray['mid'],
'verb' => ACTIVITY_POST,
'otype' => 'item'
));
@@ -700,10 +793,10 @@ function item_post(&$a) {
if(! $parent)
$parent = $post_id;
- $r = q("UPDATE `item` SET `parent` = %d, `parent_uri` = '%s', `changed` = '%s'
+ $r = q("UPDATE `item` SET `parent` = %d, `parent_mid` = '%s', `changed` = '%s'
WHERE `id` = %d LIMIT 1",
intval($parent),
- dbesc(($parent == $post_id) ? $uri : $parent_item['uri']),
+ dbesc(($parent == $post_id) ? $mid : $parent_item['mid']),
dbesc(datetime_convert()),
intval($post_id)
);
@@ -728,33 +821,11 @@ function item_post(&$a) {
// NOTREACHED
}
- // update the commented timestamp on the parent
-
- q("UPDATE `item` set `commented` = '%s', `changed` = '%s' WHERE `id` = %d LIMIT 1",
- dbesc(datetime_convert()),
- dbesc(datetime_convert()),
- intval($parent)
- );
-
- if($webpage) {
- // store page info as an alternate message_id so we can access it via
- // https://sitename/page/$channelname/$pagetitle
- // if no pagetitle was given or it couldn't be transliterated into a url, use the first
- // sixteen bytes of the uri - which makes the link portable and not quite as daunting
- // as the entire uri. If it were the post_id the link would be less portable.
- // We should have the ability to edit this and arrange pages into menus via the pages module
-
- q("insert into item_id ( iid, uid, sid, service ) values ( %d, %d, '%s','%s' )",
- intval($post_id),
- intval($channel['channel_id']),
- dbesc(($pagetitle) ? $pagetitle : substr($uri,0,16)),
- dbesc('WEBPAGE')
- );
- }
+ update_remote_id($channel,$post_id,$webpage,$pagetitle,$namespace,$remote_id,$mid);
$datarray['id'] = $post_id;
- $datarray['plink'] = $a->get_baseurl() . '/display/' . $channel['channel_address'] . '/' . $post_id;
+ $datarray['llink'] = $a->get_baseurl() . '/display/' . $channel['channel_address'] . '/' . $post_id;
call_hooks('post_local_end', $datarray);
@@ -804,14 +875,14 @@ function item_content(&$a) {
* the appropiate link.
*
* @param unknown_type $body the text to replace the tag in
- * @param unknown_type $inform a comma-seperated string containing everybody to inform
+ * @param unknown_type $access_tag - used to return tag ACL exclusions e.g. @!foo
* @param unknown_type $str_tags string to add the tag to
* @param unknown_type $profile_uid
* @param unknown_type $tag the tag to replace
*
* @return boolean true if replaced, false if not replaced
*/
-function handle_tag($a, &$body, &$inform, &$str_tags, $profile_uid, $tag) {
+function handle_tag($a, &$body, &$access_tag, &$str_tags, $profile_uid, $tag) {
$replaced = false;
$r = null;
@@ -821,19 +892,28 @@ function handle_tag($a, &$body, &$inform, &$str_tags, $profile_uid, $tag) {
//is it a hash tag?
if(strpos($tag,'#') === 0) {
- //if the tag is replaced...
- if(strpos($tag,'[url='))
+ // if the tag is replaced...
+ if(strpos($tag,'[zrl=')) {
//...do nothing
return $replaced;
- //base tag has the tags name only
- $basetag = str_replace('_',' ',substr($tag,1));
- //create text for link
- $url = $a->get_baseurl() . '/search?tag=' . rawurlencode($basetag);
- $newtag = '#[url=' . $a->get_baseurl() . '/search?tag=' . rawurlencode($basetag) . ']' . $basetag . '[/url]';
- //replace tag by the link
- $body = str_replace($tag, $newtag, $body);
- $replaced = true;
-
+ }
+ if($tag == '#getzot') {
+ $basetag = 'getzot';
+ $url = 'https://redmatrix.me';
+ $newtag = '#[zrl=' . $url . ']' . $basetag . '[/zrl]';
+ $body = str_replace($tag,$newtag,$body);
+ $replaced = true;
+ }
+ else {
+ //base tag has the tags name only
+ $basetag = str_replace('_',' ',substr($tag,1));
+ //create text for link
+ $url = $a->get_baseurl() . '/search?tag=' . rawurlencode($basetag);
+ $newtag = '#[zrl=' . $a->get_baseurl() . '/search?tag=' . rawurlencode($basetag) . ']' . $basetag . '[/zrl]';
+ //replace tag by the link
+ $body = str_replace($tag, $newtag, $body);
+ $replaced = true;
+ }
//is the link already in str_tags?
if(! stristr($str_tags,$newtag)) {
//append or set str_tags
@@ -843,107 +923,105 @@ function handle_tag($a, &$body, &$inform, &$str_tags, $profile_uid, $tag) {
}
return array('replaced' => $replaced, 'termtype' => $termtype, 'term' => $basetag, 'url' => $url, 'contact' => $r[0]);
}
+
//is it a person tag?
if(strpos($tag,'@') === 0) {
+ $exclusive = ((strpos($tag,'!') === 1) ? true : false);
//is it already replaced?
- if(strpos($tag,'[url='))
+ if(strpos($tag,'[zrl='))
return $replaced;
$stat = false;
//get the person's name
- $name = substr($tag,1);
- //is it a link or a full dfrn address?
- if((strpos($name,'@')) || (strpos($name,'http://'))) {
- $newname = $name;
- //get the profile links
- $links = @lrdd($name);
- if(count($links)) {
- //for all links, collect how is to inform and how's profile is to link
- foreach($links as $link) {
- if($link['@attributes']['rel'] === 'http://webfinger.net/rel/profile-page')
- $profile = $link['@attributes']['href'];
- if($link['@attributes']['rel'] === 'salmon') {
- if(strlen($inform))
- $inform .= ',';
- $inform .= 'url:' . str_replace(',','%2c',$link['@attributes']['href']);
- }
- }
+ $name = substr($tag,(($exclusive) ? 2 : 1));
+ $newname = $name;
+ $alias = '';
+ $tagcid = 0;
+
+ // is it some generated name?
+
+ if(strrpos($newname,'+')) {
+ //get the id
+ $tagcid = intval(substr($newname,strrpos($newname,'+') + 1));
+ //remove the next word from tag's name
+ if(strpos($name,' ')) {
+ $name = substr($name,0,strpos($name,' '));
}
- } else { //if it is a name rather than an address
- $newname = $name;
- $alias = '';
- $tagcid = 0;
- //is it some generated name?
- if(strrpos($newname,'+')) {
- //get the id
- $tagcid = intval(substr($newname,strrpos($newname,'+') + 1));
- //remove the next word from tag's name
- if(strpos($name,' ')) {
- $name = substr($name,0,strpos($name,' '));
- }
- }
- if($tagcid) { //if there was an id
- //select contact with that id from the logged in user's contact list
+ if($tagcid) { // if there was an id
+ // select channel with that id from the logged in user's address book
$r = q("SELECT * FROM abook left join xchan on abook_xchan = xchan_hash
WHERE abook_id = %d AND abook_channel = %d LIMIT 1",
intval($tagcid),
intval($profile_uid)
);
-
}
- else {
- $newname = str_replace('_',' ',$name);
+ }
- //select someone from this user's contacts by name
+ else {
+ $newname = str_replace('_',' ',$name);
+
+ //select someone from this user's contacts by name
+ $r = q("SELECT * FROM abook left join xchan on abook_xchan - xchan_hash
+ WHERE xchan_name = '%s' AND abook_channel = %d LIMIT 1",
+ dbesc($newname),
+ intval($profile_uid)
+ );
+
+ if(! $r) {
+ //select someone by attag or nick and the name passed in
$r = q("SELECT * FROM abook left join xchan on abook_xchan - xchan_hash
- WHERE xchan_name = '%s' AND abook_channel = %d LIMIT 1",
- dbesc($newname),
+ WHERE xchan_addr like ('%s') AND abook_channel = %d LIMIT 1",
+ dbesc($newname . '@%'),
intval($profile_uid)
);
+ }
+ }
- if(! $r) {
- //select someone by attag or nick and the name passed in
-/* $r = q("SELECT * FROM `contact` WHERE `attag` = '%s' OR `nick` = '%s' AND `uid` = %d ORDER BY `attag` DESC LIMIT 1",
- dbesc($name),
- dbesc($name),
- intval($profile_uid)
- );
-*/ }
+ // $r is set, if someone could be selected
+
+ if($r) {
+ $profile = $r[0]['xchan_url'];
+ $newname = $r[0]['xchan_name'];
+ //add person's id to $access_tag if exclusive
+ if($exclusive) {
+ $access_tag .= 'cid:' . $r[0]['xchan_hash'];
}
-/* } elseif(strstr($name,'_') || strstr($name,' ')) { //no id
- //get the real name
- $newname = str_replace('_',' ',$name);
- //select someone from this user's contacts by name
- $r = q("SELECT * FROM `contact` WHERE `name` = '%s' AND `uid` = %d LIMIT 1",
- dbesc($newname),
- intval($profile_uid)
- );
- } else {
- //select someone by attag or nick and the name passed in
- $r = q("SELECT * FROM `contact` WHERE `attag` = '%s' OR `nick` = '%s' AND `uid` = %d ORDER BY `attag` DESC LIMIT 1",
- dbesc($name),
- dbesc($name),
- intval($profile_uid)
- );
- }*/
- //$r is set, if someone could be selected
- if($r) {
- $profile = $r[0]['xchan_url'];
- $newname = $r[0]['xchan_name'];
- //add person's id to $inform
- if(strlen($inform))
- $inform .= ',';
- $inform .= 'cid:' . $r[0]['id'];
+ }
+ else {
+ // check for a group/collection exclusion tag
+
+ // note that we aren't setting $replaced even though we're replacing text.
+ // This tag isn't going to get a term attached to it. It's only used for
+ // access control. The link points to out own channel just so it doesn't look
+ // weird - as all the other tags are linked to something.
+
+ if(local_user() && local_user() == $profile_uid) {
+ require_once('include/group.php');
+ $grp = group_byname($profile_uid,$name);
+ if($grp) {
+ $g = q("select hash from groups where id = %d and visible = 1 limit 1",
+ intval($grp[0]['id'])
+ );
+ if($g && $exclusive) {
+ $access_tag .= 'gid:' . $g[0]['hash'];
+ }
+ $channel = get_app()->get_channel();
+ if($channel) {
+ $newtag = '@' . (($exclusive) ? '!' : '') . '[zrl=' . z_root() . '/channel/' . $channel['channel_address'] . ']' . $newname . '[/zrl]';
+ $body = str_replace('@' . (($exclusive) ? '!' : '') . $name, $newtag, $body);
+ }
+ }
}
}
+
//if there is an url for this persons profile
if(isset($profile)) {
$replaced = true;
//create profile link
$profile = str_replace(',','%2c',$profile);
$url = $profile;
- $newtag = '@[url=' . $profile . ']' . $newname . '[/url]';
- $body = str_replace('@' . $name, $newtag, $body);
+ $newtag = '@' . (($exclusive) ? '!' : '') . '[zrl=' . $profile . ']' . $newname . '[/zrl]';
+ $body = str_replace('@' . (($exclusive) ? '!' : '') . $name, $newtag, $body);
//append tag to str_tags
if(! stristr($str_tags,$newtag)) {
if(strlen($str_tags))
@@ -952,8 +1030,7 @@ function handle_tag($a, &$body, &$inform, &$str_tags, $profile_uid, $tag) {
}
}
}
-
- return array('replaced' => $replaced, 'termtype' => $termtype, 'term' => $newname, 'url' => $url, 'contact' => $r[0]);
+ return array('replaced' => $replaced, 'termtype' => $termtype, 'term' => $newname, 'url' => $url, 'contact' => $r[0]);
}
@@ -962,15 +1039,18 @@ function fix_attached_photo_permissions($uid,$xchan_hash,$body,
$str_contact_allow,$str_group_allow,$str_contact_deny,$str_group_deny) {
$match = null;
-
- if(preg_match_all("/\[img\](.*?)\[\/img\]/",$body,$match)) {
+ // match img and zmg image links
+ if(preg_match_all("/\[[zi]mg\](.*?)\[\/[zi]mg\]/",$body,$match)) {
$images = $match[1];
if($images) {
foreach($images as $image) {
if(! stristr($image,get_app()->get_baseurl() . '/photo/'))
continue;
$image_uri = substr($image,strrpos($image,'/') + 1);
- $image_uri = substr($image_uri,0, strpos($image_uri,'-'));
+ if(strpos($image_uri,'-') !== false)
+ $image_uri = substr($image_uri,0, strpos($image_uri,'-'));
+ if(strpos($image_uri,'.') !== false)
+ $image_uri = substr($image_uri,0, strpos($image_uri,'.'));
if(! strlen($image_uri))
continue;
$srch = '<' . $xchan_hash . '>';
@@ -1005,12 +1085,15 @@ function fix_attached_photo_permissions($uid,$xchan_hash,$body,
intval($uid)
);
if($r) {
- $r = q("UPDATE item SET allow_cid = '%s', allow_gid = '%s', deny_cid = '%s', deny_gid = '%s'
+ $private = (($str_contact_allow || $str_group_allow || $str_contact_deny || $str_group_deny) ? true : false);
+
+ $r = q("UPDATE item SET allow_cid = '%s', allow_gid = '%s', deny_cid = '%s', deny_gid = '%s', item_private = %d
WHERE id = %d AND uid = %d limit 1",
dbesc($str_contact_allow),
dbesc($str_group_allow),
dbesc($str_contact_deny),
dbesc($str_group_deny),
+ intval($private),
intval($r[0]['id']),
intval($uid)
);
@@ -1045,3 +1128,41 @@ function fix_attached_file_permissions($channel,$observer_hash,$body,
}
}
}
+function item_check_service_class($channel_id,$iswebpage) {
+ $ret = array('success' => false, $message => '');
+ if ($iswebpage) {
+ $r = q("select count(i.id) as total from item i
+ right join channel c on (i.author_xchan=c.channel_hash and i.uid=c.channel_id )
+ and i.parent=i.id and (i.item_restrict & %d) and not (i.item_restrict & %d) and i.uid= %d ",
+ intval(ITEM_WEBPAGE),
+ intval(ITEM_DELETED),
+ intval($channel_id)
+ );
+ }
+ else {
+ $r = q("select count(i.id) as total from item i
+ right join channel c on (i.author_xchan=c.channel_hash and i.uid=c.channel_id )
+ and i.parent=i.id and (i.item_restrict=0) and i.uid= %d ",
+ intval($channel_id)
+ );
+ }
+ if(! ($r && count($r))) {
+ $ret['message'] = t('Unable to obtain identity information from database');
+ return $ret;
+ }
+ if (!$iswebpage) {
+ if(! service_class_allows($channel_id,'total_items',$r[0]['total'])) {
+ $result['message'] .= upgrade_message().sprintf(t("You have reached your limit of %1$.0f top level posts."),$r[0]['total']);
+ return $result;
+ }
+ }
+ else {
+ if(! service_class_allows($channel_id,'total_pages',$r[0]['total'])) {
+ $result['message'] .= upgrade_message().sprintf(t("You have reached your limit of %1$.0f webpages."),$r[0]['total']);
+ return $result;
+ }
+ }
+
+ $ret['success'] = true;
+ return $ret;
+}
diff --git a/mod/layouts.php b/mod/layouts.php
new file mode 100644
index 000000000..9ed349850
--- /dev/null
+++ b/mod/layouts.php
@@ -0,0 +1,111 @@
+<?php
+
+function layouts_content(&$a) {
+
+ if(argc() > 1)
+ $which = argv(1);
+ else {
+ notice( t('Requested profile is not available.') . EOL );
+ $a->error = 404;
+ return;
+ }
+
+ profile_load($a,$which,0);
+
+
+ // Figure out who the page owner is.
+ $r = q("select channel_id from channel where channel_address = '%s'",
+ dbesc($which)
+ );
+ if($r) {
+ $owner = intval($r[0]['channel_id']);
+ }
+
+ // Block design features from visitors
+
+ if((! local_user()) || (local_user() != $owner)) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+
+
+
+// Get the observer, check their permissions
+
+ $observer = $a->get_observer();
+ $ob_hash = (($observer) ? $observer['xchan_hash'] : '');
+
+ $perms = get_all_perms($owner,$ob_hash);
+
+ if(! $perms['write_pages']) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+// if(local_user() && local_user() == $owner) {
+ // $a->set_widget('design',design_tools());
+ // }
+
+ $tabs = array(
+ array(
+ 'label' => t('Layout Help'),
+ 'url' => 'help/Comanche',
+ 'sel' => '',
+ 'title' => t('Help with this feature'),
+ 'id' => 'layout-help-tab',
+ ));
+
+
+ $o .= replace_macros(get_markup_template('common_tabs.tpl'),array('$tabs' => $tabs));
+
+
+// Create a status editor (for now - we'll need a WYSIWYG eventually) to create pages
+// Nickname is set to the observers xchan, and profile_uid to the owners. This lets you post pages at other people's channels.
+require_once ('include/conversation.php');
+ $x = array(
+ 'webpage' => ITEM_PDL,
+ 'is_owner' => true,
+ 'nickname' => $a->profile['channel_address'],
+ 'lockstate' => (($group || $cid || $channel['channel_allow_cid'] || $channel['channel_allow_gid'] || $channel['channel_deny_cid'] || $channel['channel_deny_gid']) ? 'lock' : 'unlock'),
+ 'bang' => (($group || $cid) ? '!' : ''),
+ 'visitor' => 'none',
+ 'nopreview' => 1,
+ 'ptlabel' => t('Layout Name'),
+ 'profile_uid' => intval($owner),
+ );
+
+ $o .= status_editor($a,$x);
+
+ //Get a list of blocks. We can't display all them because endless scroll makes that unusable, so just list titles and an edit link.
+//TODO - this should be replaced with pagelist_widget
+
+$r = q("select * from item_id where uid = %d and service = 'PDL' order by sid asc",
+ intval($owner)
+);
+
+ $pages = null;
+
+ if($r) {
+ $pages = array();
+ foreach($r as $rr) {
+ $pages[$rr['iid']][] = array('url' => $rr['iid'],'title' => $rr['sid']);
+ }
+ }
+
+
+//Build the base URL for edit links
+ $url = z_root() . "/editlayout/" . $which;
+// This isn't pretty, but it works. Until I figure out what to do with the UI, it's Good Enough(TM).
+ return $o . replace_macros(get_markup_template("webpagelist.tpl"), array(
+ '$baseurl' => $url,
+ '$edit' => t('Edit'),
+ '$pages' => $pages,
+ '$channel' => $which,
+ '$view' => t('View'),
+ '$preview' => '1',
+
+ ));
+
+
+}
diff --git a/mod/like.php b/mod/like.php
index 7c3df98ba..007d1aee1 100755
--- a/mod/like.php
+++ b/mod/like.php
@@ -49,6 +49,7 @@ function like_content(&$a) {
$item = $r[0];
$owner_uid = $item['uid'];
+ $owner_aid = $item['aid'];
if(! perm_is_allowed($owner_uid,$observer['xchan_hash'],'post_comments')) {
notice( t('Permission denied') . EOL);
@@ -78,7 +79,7 @@ function like_content(&$a) {
dbesc($activity),
dbesc($observer['xchan_hash']),
intval($item_id),
- dbesc($item['uri'])
+ dbesc($item['mid'])
);
if($r) {
$like_item = $r[0];
@@ -97,22 +98,24 @@ function like_content(&$a) {
- $uri = item_message_id();
+ $mid = item_message_id();
- $post_type = (($item['resource_type'] === 'photo') ? $t('photo') : t('status'));
+ $post_type = (($item['resource_type'] === 'photo') ? t('photo') : t('status'));
- $links = array(array('rel' => 'alternate','type' => 'text/html',
- 'href' => z_root() . '/display/' . $item['uri']));
+ $links = array(array('rel' => 'alternate','type' => 'text/html', 'href' => $item['plink']));
$objtype = (($item['resource_type'] === 'photo') ? ACTIVITY_OBJ_PHOTO : ACTIVITY_OBJ_NOTE );
$body = $item['body'];
$obj = json_encode(array(
'type' => $objtype,
- 'id' => $item['uri'],
+ 'id' => $item['mid'],
+ 'parent' => (($item['thr_parent']) ? $item['thr_parent'] : $item['parent_mid']),
'link' => $links,
'title' => $item['title'],
'content' => $item['body'],
+ 'created' => $item['created'],
+ 'edited' => $item['edited'],
'author' => array(
'name' => $item_author['xchan_name'],
'address' => $item_author['xchan_addr'],
@@ -124,6 +127,9 @@ function like_content(&$a) {
),
));
+ if(! ($item['item_flags'] & ITEM_THREAD_TOP))
+ $post_type = 'comment';
+
if($verb === 'like')
$bodyverb = t('%1$s likes %2$s\'s %3$s');
if($verb === 'dislike')
@@ -132,28 +138,29 @@ function like_content(&$a) {
if(! isset($bodyverb))
return;
- $item_flags = ITEM_ORIGIN;
+ $item_flags = ITEM_ORIGIN | ITEM_NOTSHOWN;
if($item['item_flags'] & ITEM_WALL)
$item_flags |= ITEM_WALL;
$arr = array();
- $arr['uri'] = $uri;
+ $arr['mid'] = $mid;
+ $arr['aid'] = $owner_aid;
$arr['uid'] = $owner_uid;
$arr['item_flags'] = $item_flags;
$arr['parent'] = $item['id'];
- $arr['parent_uri'] = $item['uri'];
- $arr['thr_parent'] = $item['uri'];
+ $arr['parent_mid'] = $item['mid'];
+ $arr['thr_parent'] = $item['mid'];
$arr['owner_xchan'] = $thread_owner['xchan_hash'];
$arr['author_xchan'] = $observer['xchan_hash'];
- $ulink = '[url=' . $item_owner['xchan_url'] . ']' . $item_owner['xchan_name'] . '[/url]';
- $alink = '[url=' . $observer['xchan_url'] . ']' . $observer['xchan_name'] . '[/url]';
- $plink = '[url=' . $a->get_baseurl() . '/display/' . $item['uri'] . ']' . $post_type . '[/url]';
+ $ulink = '[zrl=' . $item_author['xchan_url'] . ']' . $item_author['xchan_name'] . '[/zrl]';
+ $alink = '[zrl=' . $observer['xchan_url'] . ']' . $observer['xchan_name'] . '[/zrl]';
+ $plink = '[zrl=' . $a->get_baseurl() . '/display/' . $item['mid'] . ']' . $post_type . '[/zrl]';
- $arr['body'] = sprintf( $bodyverb, $ulink, $alink, $plink );
+ $arr['body'] = sprintf( $bodyverb, $alink, $ulink, $plink );
$arr['verb'] = $activity;
$arr['obj_type'] = $objtype;
@@ -164,7 +171,9 @@ function like_content(&$a) {
$arr['deny_cid'] = $item['deny_cid'];
$arr['deny_gid'] = $item['deny_gid'];
- $post_id = item_store($arr);
+
+ $post = item_store($arr);
+ $post_id = $post['item_id'];
$arr['id'] = $post_id;
diff --git a/mod/lockview.php b/mod/lockview.php
index 01a6997ee..32e7a3afb 100644
--- a/mod/lockview.php
+++ b/mod/lockview.php
@@ -49,7 +49,7 @@ function lockview_content(&$a) {
stringify_array_elms($deny_users,true);
if(count($allowed_groups)) {
- $r = q("SELECT name FROM group WHERE hash IN ( " . implode(', ', $allowed_groups) . " )");
+ $r = q("SELECT name FROM `groups` WHERE hash IN ( " . implode(', ', $allowed_groups) . " )");
if($r)
foreach($r as $rr)
$l[] = '<b>' . $rr['name'] . '</b>';
@@ -61,7 +61,7 @@ function lockview_content(&$a) {
$l[] = $rr['xchan_name'];
}
if(count($deny_groups)) {
- $r = q("SELECT name FROM group WHERE hash IN ( " . implode(', ', $deny_groups) . " )");
+ $r = q("SELECT name FROM `groups` WHERE hash IN ( " . implode(', ', $deny_groups) . " )");
if($r)
foreach($r as $rr)
$l[] = '<b><strike>' . $rr['name'] . '</strike></b>';
diff --git a/mod/magic.php b/mod/magic.php
index ba9e69a49..aead559a7 100644
--- a/mod/magic.php
+++ b/mod/magic.php
@@ -4,81 +4,103 @@
function magic_init(&$a) {
+ $ret = array('success' => false, 'url' => '', 'message' => '');
+ logger('mod_magic: invoked', LOGGER_DEBUG);
+
+ logger('mod_magic: args: ' . print_r($_REQUEST,true),LOGGER_DATA);
+
$addr = ((x($_REQUEST,'addr')) ? $_REQUEST['addr'] : '');
$hash = ((x($_REQUEST,'hash')) ? $_REQUEST['hash'] : '');
$dest = ((x($_REQUEST,'dest')) ? $_REQUEST['dest'] : '');
+ $test = ((x($_REQUEST,'test')) ? intval($_REQUEST['test']) : 0);
+ $rev = ((x($_REQUEST,'rev')) ? intval($_REQUEST['rev']) : 0);
- if($hash) {
- $x = q("select xchan.xchan_url, hubloc.* from xchan left join hubloc on xchan_hash = hubloc_hash
- where hubloc_hash = '%s' and (hubloc_flags & %d) limit 1",
- dbesc($hash),
- intval(HUBLOC_FLAGS_PRIMARY)
- );
- }
- elseif($addr) {
- $x = q("select hubloc.* from xchan left join hubloc on xchan_hash = hubloc_hash
- where xchan_addr = '%s' and (hubloc_flags & %d) limit 1",
- dbesc($addr),
- intval(HUBLOC_FLAGS_PRIMARY)
- );
- }
- else {
- // See if we know anybody at the dest site that will unlock the door for us
- $b = explode('/',$dest);
- if(count($b) >= 2)
- $u = $b[0] . '//' . $b[2];
-
- $x = q("select xchan.xchan_url, hubloc.* from xchan left join hubloc on xchan_hash = hubloc_hash
- where hubloc_url = '%s' limit 1",
- dbesc($u)
- );
+ $parsed = parse_url($dest);
+ if(! $parsed) {
+ if($test) {
+ $ret['message'] .= 'could not parse ' . $dest . EOL;
+ return($ret);
+ }
+ goaway($dest);
}
+ $basepath = $parsed['scheme'] . '://' . $parsed['host'] . (($parsed['port']) ? ':' . $parsed['port'] : '');
+ $x = q("select * from hubloc where hubloc_url = '%s' order by hubloc_connected desc limit 1",
+ dbesc($basepath)
+ );
+
if(! $x) {
- // Finger them if they've never been seen here before
-
- if($addr) {
- $ret = zot_finger($addr,null);
- if($ret['success']) {
- $j = json_decode($ret['body'],true);
- if($j)
- import_xchan($j);
- $x = q("select hubloc.* from xchan left join hubloc on xchan_hash = hubloc_hash
- where xchan_addr = '%s' and (hubloc_flags & %d) limit 1",
- dbesc($addr),
- intval(HUBLOC_FLAGS_PRIMARY)
- );
- }
+ /*
+ * We have no records for, or prior communications with this hub.
+ * If an address was supplied, let's finger them to create a hub record.
+ * Otherwise we'll use the special address '[system]' which will return
+ * either a system channel or the first available normal channel. We don't
+ * really care about what channel is returned - we need the hub information
+ * from that response so that we can create signed auth packets destined
+ * for that hub.
+ *
+ */
+
+ $ret = zot_finger((($addr) ? $addr : '[system]@' . $parsed['host']),null);
+ if($ret['success']) {
+ $j = json_decode($ret['body'],true);
+ if($j)
+ import_xchan($j);
+
+ // Now try again
+
+ $x = q("select * from hubloc where hubloc_url = '%s' order by hubloc_connected desc limit 1",
+ dbesc($basepath)
+ );
}
}
if(! $x) {
- notice( t('Channel not found.') . EOL);
- return;
+ if($rev)
+ goaway($dest);
+ else {
+ logger('mod_magic: no channels found for requested hub.' . print_r($_REQUEST,true));
+ if($test) {
+ $ret['message'] .= 'This site has no previous connections with ' . $basepath . EOL;
+ return $ret;
+ }
+ notice( t('Hub not found.') . EOL);
+ return;
+ }
}
- if($x[0]['hubloc_url'] === z_root()) {
- $webbie = substr($x[0]['hubloc_addr'],0,strpos('@',$x[0]['hubloc_addr']));
- switch($dest) {
- case 'channel':
- $desturl = z_root() . '/channel/' . $webbie;
- break;
- case 'photos':
- $desturl = z_root() . '/photos/' . $webbie;
- break;
- case 'profile':
- $desturl = z_root() . '/profile/' . $webbie;
- break;
- default:
- $desturl = $dest;
- break;
+ // This is ready-made for a plugin that provides a blacklist or "ask me" before blindly authenticating.
+ // By default, we'll proceed without asking.
+
+ $arr = array(
+ 'channel_id' => local_user(),
+ 'xchan' => $x[0],
+ 'destination' => $dest,
+ 'proceed' => true
+ );
+
+ call_hooks('magic_auth',$arr);
+ $dest = $arr['destination'];
+ if(! $arr['proceed']) {
+ if($test) {
+ $ret['message'] .= 'cancelled by plugin.' . EOL;
+ return $ret;
}
+ goaway($dest);
+ }
+
+ if((get_observer_hash()) && ($x[0]['hubloc_url'] === z_root())) {
// We are already authenticated on this site and a registered observer.
// Just redirect.
- goaway($desturl);
+ if($test) {
+ $ret['success'] = true;
+ $ret['message'] .= 'Local site - you are already authenticated.' . EOL;
+ return $ret;
+ }
+ goaway($dest);
}
if(local_user()) {
@@ -90,25 +112,35 @@ function magic_init(&$a) {
$channel['token'] = $token;
$channel['token_sig'] = $token_sig;
-
- $recip = array(array('guid' => $x[0]['hubloc_guid'],'guid_sig' => $x[0]['hubloc_guid_sig']));
-
- $hash = random_string();
-
$r = q("insert into verify ( type, channel, token, meta, created) values ('%s','%d','%s','%s','%s')",
dbesc('auth'),
intval($channel['channel_id']),
dbesc($token),
- dbesc($x[0]['hubloc_hash']),
+ dbesc($x[0]['hubloc_url']),
dbesc(datetime_convert())
);
- goaway($x[0]['hubloc_callback'] . '/' . substr($x[0]['hubloc_addr'],0,strpos($x[0]['hubloc_addr'],'@'))
- . '/?f=&auth=' . $channel['channel_address'] . '@' . $a->get_hostname()
- . '&sec=' . $token . '&dest=' . $dest . '&version=' . ZOT_REVISION);
+ $target_url = $x[0]['hubloc_callback'] . '/?f=&auth=' . urlencode($channel['channel_address'] . '@' . $a->get_hostname())
+ . '&sec=' . $token . '&dest=' . urlencode($dest) . '&version=' . ZOT_REVISION;
+
+ logger('mod_magic: redirecting to: ' . $target_url, LOGGER_DEBUG);
+
+ if($test) {
+ $ret['success'] = true;
+ $ret['url'] = $target_url;
+ $ret['message'] = 'token ' . $token . ' created for channel ' . $channel['channel_id'] . ' for url ' . $x[0]['hubloc_url'] . EOL;
+ return $ret;
+ }
+
+ goaway($target_url);
+
}
- if(strpos($dest,'/'))
- goaway($dest);
- goaway(z_root());
+ if($test) {
+ $ret['message'] = 'Not authenticated or invalid arguments to mod_magic' . EOL;
+ return $ret;
+ }
+
+ goaway($dest);
+
}
diff --git a/mod/mail.php b/mod/mail.php
new file mode 100644
index 000000000..eb1b0ddc0
--- /dev/null
+++ b/mod/mail.php
@@ -0,0 +1,349 @@
+<?php
+
+require_once('include/acl_selectors.php');
+require_once('include/message.php');
+require_once('include/zot.php');
+require_once("include/bbcode.php");
+require_once('include/Contact.php');
+
+
+function mail_post(&$a) {
+
+ if(! local_user())
+ return;
+
+ $replyto = ((x($_REQUEST,'replyto')) ? notags(trim($_REQUEST['replyto'])) : '');
+ $subject = ((x($_REQUEST,'subject')) ? notags(trim($_REQUEST['subject'])) : '');
+ $body = ((x($_REQUEST,'body')) ? escape_tags(trim($_REQUEST['body'])) : '');
+ $recipient = ((x($_REQUEST,'messageto')) ? notags(trim($_REQUEST['messageto'])) : '');
+ $rstr = ((x($_REQUEST,'messagerecip')) ? notags(trim($_REQUEST['messagerecip'])) : '');
+ $expires = ((x($_REQUEST,'expires')) ? datetime_convert(date_default_timezone_get(),'UTC', $_REQUEST['expires']) : '0000-00-00 00:00:00');
+
+ // If we have a raw string for a recipient which hasn't been auto-filled,
+ // it means they probably aren't in our address book, hence we don't know
+ // if we have permission to send them private messages.
+ // finger them and find out before we try and send it.
+
+ if(! $recipient) {
+ $channel = $a->get_channel();
+
+ $ret = zot_finger($rstr,$channel);
+
+ if(! $ret['success']) {
+ notice( t('Unable to lookup recipient.') . EOL);
+ return;
+ }
+ $j = json_decode($ret['body'],true);
+
+ logger('message_post: lookup: ' . $url . ' ' . print_r($j,true));
+
+ if(! ($j['success'] && $j['guid'])) {
+ notice( t('Unable to communicate with requested channel.'));
+ return;
+ }
+
+ $x = import_xchan($j);
+
+ if(! $x['success']) {
+ notice( t('Cannot verify requested channel.'));
+ return;
+ }
+
+ $recipient = $x['hash'];
+
+ $their_perms = 0;
+
+ $global_perms = get_perms();
+
+ if($j['permissions']['data']) {
+ $permissions = crypto_unencapsulate($j['permissions'],$channel['channel_prvkey']);
+ if($permissions)
+ $permissions = json_decode($permissions);
+ logger('decrypted permissions: ' . print_r($permissions,true), LOGGER_DATA);
+ }
+ else
+ $permissions = $j['permissions'];
+
+ foreach($permissions as $k => $v) {
+ if($v) {
+ $their_perms = $their_perms | intval($global_perms[$k][1]);
+ }
+ }
+
+ if(! ($their_perms & PERMS_W_MAIL)) {
+ notice( t('Selected channel has private message restrictions. Send failed.'));
+ return;
+ }
+ }
+
+ if(feature_enabled(local_user(),'richtext')) {
+ $body = fix_mce_lf($body);
+ }
+
+ if(! $recipient) {
+ notice('No recipient found.');
+ $a->argc = 2;
+ $a->argv[1] = 'new';
+ return;
+ }
+
+ // We have a local_user, let send_message use the session channel and save a lookup
+
+ $ret = send_message(0, $recipient, $body, $subject, $replyto, $expires);
+
+ if(! $ret['success']) {
+ notice($ret['message']);
+ }
+
+ goaway(z_root() . '/message');
+
+}
+
+function mail_content(&$a) {
+
+ $o = '';
+ nav_set_selected('messages');
+
+ if(! local_user()) {
+ notice( t('Permission denied.') . EOL);
+ return login();
+ }
+
+ $channel = $a->get_channel();
+ head_set_icon($channel['xchan_photo_s']);
+
+ $cipher = get_pconfig(local_user(),'system','default_cipher');
+ if(! $cipher)
+ $cipher = 'aes256';
+
+ $tpl = get_markup_template('mail_head.tpl');
+ $header = replace_macros($tpl, array(
+ '$messages' => t('Messages'),
+ '$tab_content' => $tab_content
+ ));
+
+ if((argc() == 3) && (argv(1) === 'drop')) {
+ if(! intval(argv(2)))
+ return;
+ $cmd = argv(1);
+
+ $r = private_messages_drop(local_user(), argv(2));
+ if($r) {
+ info( t('Message deleted.') . EOL );
+ }
+ goaway($a->get_baseurl(true) . '/message' );
+ }
+
+ if((argc() == 3) && (argv(1) === 'recall')) {
+ if(! intval(argv(2)))
+ return;
+ $cmd = argv(1);
+ $r = q("update mail set mail_flags = mail_flags | %d where id = %d and channel_id = %d limit 1",
+ intval(MAIL_RECALLED),
+ intval(argv(2)),
+ intval(local_user())
+ );
+ proc_run('php','include/notifier.php','mail',intval(argv(2)));
+
+ if($r) {
+ info( t('Message recalled.') . EOL );
+ }
+ goaway($a->get_baseurl(true) . '/message' );
+
+ }
+
+ if((argc() > 1) && (argv(1) === 'new')) {
+
+ $o .= $header;
+
+ $plaintext = false;
+ if(intval(get_pconfig(local_user(),'system','plaintext')))
+ $plaintext = true;
+ if(! feature_enabled(local_user(),'richtext'))
+ $plaintext = true;
+
+ $tpl = get_markup_template('msg-header.tpl');
+
+ $a->page['htmlhead'] .= replace_macros($tpl, array(
+ '$baseurl' => $a->get_baseurl(true),
+ '$editselect' => (($plaintext) ? 'none' : '/(profile-jot-text|prvmail-text)/'),
+ '$nickname' => $channel['channel_address'],
+ '$linkurl' => t('Please enter a link URL:'),
+ '$expireswhen' => t('Expires YYYY-MM-DD HH:MM')
+ ));
+
+ $preselect = (isset($a->argv[2])?array($a->argv[2]):false);
+
+
+ $prename = $preurl = $preid = '';
+
+ if($preselect) {
+ $r = q("select abook.*, xchan.* from abook left join xchan on abook_xchan = xchan_hash
+ where abook_channel = %d and abook_id = %d limit 1",
+ intval(local_user()),
+ intval(argv(2))
+ );
+ if($r) {
+ $prename = $r[0]['xchan_name'];
+ $preurl = $r[0]['xchan_url'];
+ $preid = $r[0]['abook_id'];
+ }
+ }
+
+ $prefill = (($preselect) ? $prename : '');
+
+ if(! $prefill) {
+ if(array_key_exists('to',$_REQUEST))
+ $prefill = $_REQUEST['to'];
+ }
+
+ // the ugly select box
+
+ $select = contact_select('messageto','message-to-select', $preselect, 4, true, false, false, 10);
+
+ $tpl = get_markup_template('prv_message.tpl');
+ $o .= replace_macros($tpl,array(
+ '$header' => t('Send Private Message'),
+ '$to' => t('To:'),
+ '$showinputs' => 'true',
+ '$prefill' => $prefill,
+ '$autocomp' => $autocomp,
+ '$preid' => $preid,
+ '$subject' => t('Subject:'),
+ '$subjtxt' => ((x($_REQUEST,'subject')) ? strip_tags($_REQUEST['subject']) : ''),
+ '$text' => ((x($_REQUEST,'body')) ? htmlspecialchars($_REQUEST['body'], ENT_COMPAT, 'UTF-8') : ''),
+ '$readonly' => '',
+ '$yourmessage' => t('Your message:'),
+ '$select' => $select,
+ '$parent' => '',
+ '$upload' => t('Upload photo'),
+ '$attach' => t('Attach file'),
+ '$insert' => t('Insert web link'),
+ '$wait' => t('Please wait'),
+ '$submit' => t('Submit'),
+ '$defexpire' => '',
+ '$feature_expire' => ((feature_enabled(local_user(),'content_expire')) ? 'block' : 'none'),
+ '$expires' => t('Set expiration date'),
+ '$feature_encrypt' => ((feature_enabled(local_user(),'content_encrypt')) ? 'block' : 'none'),
+ '$encrypt' => t('Encrypt text'),
+ '$cipher' => $cipher,
+
+
+ ));
+
+ return $o;
+ }
+
+
+ if((argc() > 1) && (intval(argv(1)))) {
+
+ $o .= $header;
+
+ $plaintext = true;
+ if( local_user() && feature_enabled(local_user(),'richtext') )
+ $plaintext = false;
+
+ $messages = private_messages_fetch_conversation(local_user(), argv(1), true);
+
+ if(! $messages) {
+ info( t('Message not found.') . EOL);
+ return $o;
+ }
+
+ if($messages[0]['to_xchan'] === $channel['channel_hash'])
+ $a->poi = $messages[0]['from'];
+ else
+ $a->poi = $messages[0]['to'];
+
+// require_once('include/Contact.php');
+
+// $a->set_widget('mail_conversant',vcard_from_xchan($a->poi,$get_observer_hash,'mail'));
+
+
+ $tpl = get_markup_template('msg-header.tpl');
+
+ $a->page['htmlhead'] .= replace_macros($tpl, array(
+ '$nickname' => $channel['channel_addr'],
+ '$baseurl' => $a->get_baseurl(true),
+ '$editselect' => (($plaintext) ? 'none' : '/(profile-jot-text|prvmail-text)/'),
+ '$linkurl' => t('Please enter a link URL:'),
+ '$expireswhen' => t('Expires YYYY-MM-DD HH:MM')
+ ));
+
+
+ $mails = array();
+ $seen = 0;
+ $unknown = false;
+
+ foreach($messages as $message) {
+
+ $s = theme_attachments($message);
+
+ $mails[] = array(
+ 'id' => $message['id'],
+ 'from_name' => $message['from']['xchan_name'],
+ 'from_url' => chanlink_hash($message['from_xchan']),
+ 'from_photo' => $message['from']['xchan_photo_m'],
+ 'to_name' => $message['to']['xchan_name'],
+ 'to_url' => chanlink_hash($message['to_xchan']),
+ 'to_photo' => $message['to']['xchan_photo_m'],
+ 'subject' => $message['title'],
+ 'body' => smilies(bbcode($message['body']) . $s),
+ 'delete' => t('Delete message'),
+ 'recall' => t('Recall message'),
+ 'can_recall' => (($channel['channel_hash'] == $message['from_xchan']) ? true : false),
+ 'is_recalled' => (($message['mail_flags'] & MAIL_RECALLED) ? t('Message has been recalled.') : ''),
+ 'date' => datetime_convert('UTC',date_default_timezone_get(),$message['created'],'D, d M Y - g:i A'),
+ );
+
+ $seen = $message['seen'];
+
+ }
+
+ $recp = (($message['from_xchan'] === $channel['channel_hash']) ? 'to' : 'from');
+
+// FIXME - move this HTML to template
+
+ $select = $message[$recp]['xchan_name'] . '<input type="hidden" name="messageto" value="' . $message[$recp]['xchan_hash'] . '" />';
+ $parent = '<input type="hidden" name="replyto" value="' . $message['parent_mid'] . '" />';
+
+ $tpl = get_markup_template('mail_display.tpl');
+ $o = replace_macros($tpl, array(
+ '$prvmsg_header' => t('Private Conversation'),
+ '$thread_id' => $a->argv[1],
+ '$thread_subject' => $message['title'],
+ '$thread_seen' => $seen,
+ '$delete' => t('Delete conversation'),
+ '$canreply' => (($unknown) ? false : '1'),
+ '$unknown_text' => t("No secure communications available. You <strong>may</strong> be able to respond from the sender's profile page."),
+ '$mails' => $mails,
+
+ // reply
+ '$header' => t('Send Reply'),
+ '$to' => t('To:'),
+ '$showinputs' => '',
+ '$subject' => t('Subject:'),
+ '$subjtxt' => $message['title'],
+ '$readonly' => ' readonly="readonly" style="background: #BBBBBB;" ',
+ '$yourmessage' => t('Your message:'),
+ '$text' => '',
+ '$select' => $select,
+ '$parent' => $parent,
+ '$upload' => t('Upload photo'),
+ '$attach' => t('Attach file'),
+ '$insert' => t('Insert web link'),
+ '$submit' => t('Submit'),
+ '$wait' => t('Please wait'),
+ '$defexpire' => '',
+ '$feature_expire' => ((feature_enabled(local_user(),'content_expire')) ? 'block' : 'none'),
+ '$expires' => t('Set expiration date'),
+ '$feature_encrypt' => ((feature_enabled(local_user(),'content_encrypt')) ? 'block' : 'none'),
+ '$encrypt' => t('Encrypt text'),
+ '$cipher' => $cipher,
+
+ ));
+
+ return $o;
+ }
+
+}
diff --git a/mod/manage.php b/mod/manage.php
index 2cdfce115..a2f65b271 100644
--- a/mod/manage.php
+++ b/mod/manage.php
@@ -36,8 +36,9 @@ function manage_content(&$a) {
$channels = null;
if(local_user()) {
- $r = q("select channel.*, xchan.* from channel left join xchan on channel.channel_hash = xchan.xchan_hash where channel.channel_account_id = %d order by channel_name ",
- intval(get_account_id())
+ $r = q("select channel.*, xchan.* from channel left join xchan on channel.channel_hash = xchan.xchan_hash where channel.channel_account_id = %d and not ( channel_pageflags & %d ) order by channel_name ",
+ intval(get_account_id()),
+ intval(PAGE_REMOVED)
);
$selected_channel = null;
@@ -53,6 +54,17 @@ function manage_content(&$a) {
$channels[$x]['default_links'] = '1';
}
}
+
+ $r = q("select count(channel_id) as total from channel where channel_account_id = %d ",
+ intval(get_account_id())
+ );
+ $limit = service_class_fetch(local_user(),'total_identities');
+ if($limit !== false) {
+ $channel_usage_message = sprintf( t("You have created %1$.0f of %2$.0f allowed channels."), $r[0]['total'], $limit);
+ }
+ else {
+ $channel_usage_message = '';
+ }
}
$links = array(
@@ -69,6 +81,7 @@ function manage_content(&$a) {
'$msg_make_default' => t('Make Default'),
'$links' => $links,
'$all_channels' => $channels,
+ '$channel_usage_message' => $channel_usage_message,
));
diff --git a/mod/match.php b/mod/match.php
index 23eeb9370..5447f755d 100644
--- a/mod/match.php
+++ b/mod/match.php
@@ -1,5 +1,9 @@
<?php
+// FIXME - this has never been properly ported from Friendica
+// It takes keywords from your profile and queries the directory server for
+// matching keywords from other profiles.
+
function match_content(&$a) {
@@ -30,10 +34,10 @@ function match_content(&$a) {
if($a->pager['page'] != 1)
$params['p'] = $a->pager['page'];
- if(strlen(get_config('system','directory_submit_url')))
- $x = post_url('http://dir.friendica.com/msearch', $params);
- else
- $x = post_url($a->get_baseurl() . '/msearch', $params);
+// if(strlen(get_config('system','directory_submit_url')))
+// $x = post_url('http://dir.friendica.com/msearch', $params);
+// else
+// $x = post_url($a->get_baseurl() . '/msearch', $params);
$j = json_decode($x);
diff --git a/mod/menu.php b/mod/menu.php
new file mode 100644
index 000000000..47eed6484
--- /dev/null
+++ b/mod/menu.php
@@ -0,0 +1,118 @@
+<?php
+
+require_once('include/menu.php');
+
+function menu_post(&$a) {
+
+ if(! local_user())
+ return;
+
+ $_REQUEST['menu_channel_id'] = local_user();
+
+ $menu_id = ((argc() > 1) ? intval(argv(1)) : 0);
+ if($menu_id) {
+ $_REQUEST['menu_id'] = intval(argv(1));
+ $r = menu_edit($_REQUEST);
+ if($r) {
+ info( t('Menu updated.') . EOL);
+ goaway(z_root() . '/mitem/' . $menu_id);
+ }
+ else
+ notice( t('Unable to update menu.'). EOL);
+ }
+ else {
+ $r = menu_create($_REQUEST);
+ if($r) {
+ info( t('Menu created.') . EOL);
+ goaway(z_root() . '/mitem/' . $r);
+ }
+ else
+ notice( t('Unable to create menu.'). EOL);
+
+ }
+
+}
+
+
+function menu_content(&$a) {
+
+ if(! local_user()) {
+ notice( t('Permission denied.') . EOL);
+ return '';
+ }
+
+
+// $a->set_widget('design',design_tools());
+
+
+ if(argc() == 1) {
+ // list menus
+ $x = menu_list(local_user());
+
+ $o = replace_macros(get_markup_template('menulist.tpl'),array(
+ '$title' => t('Manage Menus'),
+ '$menus' => $x,
+ '$edit' => t('Edit'),
+ '$drop' => t('Drop'),
+ '$new' => t('New'),
+ '$hintnew' => t('Create a new menu'),
+ '$hintdrop' => t('Delete this menu'),
+ '$hintcontent' => t('Edit menu contents'),
+ '$hintedit' => t('Edit this menu')
+ ));
+
+ return $o;
+
+
+
+
+
+ }
+
+
+ if(argc() > 1) {
+ if(argv(1) === 'new') {
+ $o = replace_macros(get_markup_template('menuedit.tpl'), array(
+ '$header' => t('New Menu'),
+ '$menu_name' => array('menu_name', t('Menu name'), '', t('Must be unique, only seen by you'), '*'),
+ '$menu_desc' => array('menu_desc', t('Menu title'), '', t('Menu title as seen by others'), ''),
+ '$submit' => t('Create')
+ ));
+ return $o;
+ }
+
+ elseif(intval(argv(1))) {
+ $m = menu_fetch_id(intval(argv(1)),local_user());
+ if(! $m) {
+ notice( t('Menu not found.') . EOL);
+ return '';
+ }
+ if(argc() == 3 && argv(2) == 'drop') {
+ $r = menu_delete_id(intval(argv(1)),local_user());
+ if($r)
+ info( t('Menu deleted.') . EOL);
+ else
+ notice( t('Menu could not be deleted.'). EOL);
+
+ goaway(z_root() . '/menu');
+ }
+ else {
+ $o = replace_macros(get_markup_template('menuedit.tpl'), array(
+ '$header' => t('Edit Menu'),
+ '$menu_id' => intval(argv(1)),
+ '$hintedit' => t('Add or remove entries to this menu'),
+ '$editcontents' => t('Edit menu contents'),
+ '$menu_name' => array('menu_name', t('Menu name'), $m['menu_name'], t('Must be unique, only seen by you'), '*'),
+ '$menu_desc' => array('menu_desc', t('Menu title'), $m['menu_desc'], t('Menu title as seen by others'), ''),
+ '$submit' => t('Modify')
+ ));
+ return $o;
+ }
+ }
+ else {
+ notice( t('Not found.') . EOL);
+ return;
+ }
+ }
+
+}
diff --git a/mod/message.php b/mod/message.php
index 98a1067ed..c14bf2161 100644
--- a/mod/message.php
+++ b/mod/message.php
@@ -7,186 +7,6 @@ require_once("include/bbcode.php");
require_once('include/Contact.php');
-function message_aside(&$a) {
-
- $a->set_widget('newmessage',replace_macros(get_markup_template('message_side.tpl'), array(
- '$tabs'=> array(),
- '$new'=>array(
- 'label' => t('New Message'),
- 'url' => $a->get_baseurl(true) . '/message/new',
- 'sel'=> (argv(1) == 'new'),
- )
- )));
-
-}
-
-function message_post(&$a) {
-
- if(! local_user())
- return;
-
- $replyto = ((x($_REQUEST,'replyto')) ? notags(trim($_REQUEST['replyto'])) : '');
- $subject = ((x($_REQUEST,'subject')) ? notags(trim($_REQUEST['subject'])) : '');
- $body = ((x($_REQUEST,'body')) ? escape_tags(trim($_REQUEST['body'])) : '');
- $recipient = ((x($_REQUEST,'messageto')) ? notags(trim($_REQUEST['messageto'])) : '');
- $rstr = ((x($_REQUEST,'messagerecip')) ? notags(trim($_REQUEST['messagerecip'])) : '');
-
- // If we have a raw string for a recipient which hasn't been auto-filled,
- // it means they probably aren't in our address book, hence we don't know
- // if we have permission to send them private messages.
- // finger them and find out before we try and send it.
-
- if(! $recipient) {
- $channel = $a->get_channel();
-
- $ret = zot_finger($rstr,$channel);
-
- if(! $ret) {
- notice( t('Unable to lookup recipient.') . EOL);
- return;
- }
- $j = json_decode($ret['body'],true);
-
- logger('message_post: lookup: ' . $url . ' ' . print_r($j,true));
-
- if(! ($j['success'] && $j['guid'])) {
- notice( t('Unable to communicate with requested channel.'));
- return;
- }
-
- $x = import_xchan($j);
-
- if(! $x['success']) {
- notice( t('Cannot verify requested channel.'));
- return;
- }
-
- $recipient = $x['hash'];
-
- $their_perms = 0;
-
- $global_perms = get_perms();
-
- if($j['permissions']['data']) {
- $permissions = aes_unencapsulate($j['permissions'],$channel['channel_prvkey']);
- if($permissions)
- $permissions = json_decode($permissions);
- logger('decrypted permissions: ' . print_r($permissions,true), LOGGER_DATA);
- }
- else
- $permissions = $j['permissions'];
-
- foreach($permissions as $k => $v) {
- if($v) {
- $their_perms = $their_perms | intval($global_perms[$k][1]);
- }
- }
-
- if(! ($their_perms & PERMS_W_MAIL)) {
- notice( t('Selected channel has private message restrictions. Send failed.'));
- return;
- }
- }
-
- if(feature_enabled(local_user(),'richtext')) {
- $body = fix_mce_lf($body);
- }
-
- if(! $recipient) {
- notice('No recipient found.');
- $a->argc = 2;
- $a->argv[1] = 'new';
- return;
- }
-
- // We have a local_user, let send_message use the session channel and save a lookup
-
- $ret = send_message(0, $recipient, $body, $subject, $replyto);
-
- if(! $ret['success']) {
- notice($ret['message']);
- }
-
-}
-
-// Note: the code in 'item_extract_images' and 'item_redir_and_replace_images'
-// is identical to the code in include/conversation.php
-if(! function_exists('item_extract_images')) {
-function item_extract_images($body) {
-
- $saved_image = array();
- $orig_body = $body;
- $new_body = '';
-
- $cnt = 0;
- $img_start = strpos($orig_body, '[img');
- $img_st_close = ($img_start !== false ? strpos(substr($orig_body, $img_start), ']') : false);
- $img_end = ($img_start !== false ? strpos(substr($orig_body, $img_start), '[/img]') : false);
- while(($img_st_close !== false) && ($img_end !== false)) {
-
- $img_st_close++; // make it point to AFTER the closing bracket
- $img_end += $img_start;
-
- if(! strcmp(substr($orig_body, $img_start + $img_st_close, 5), 'data:')) {
- // This is an embedded image
-
- $saved_image[$cnt] = substr($orig_body, $img_start + $img_st_close, $img_end - ($img_start + $img_st_close));
- $new_body = $new_body . substr($orig_body, 0, $img_start) . '[!#saved_image' . $cnt . '#!]';
-
- $cnt++;
- }
- else
- $new_body = $new_body . substr($orig_body, 0, $img_end + strlen('[/img]'));
-
- $orig_body = substr($orig_body, $img_end + strlen('[/img]'));
-
- if($orig_body === false) // in case the body ends on a closing image tag
- $orig_body = '';
-
- $img_start = strpos($orig_body, '[img');
- $img_st_close = ($img_start !== false ? strpos(substr($orig_body, $img_start), ']') : false);
- $img_end = ($img_start !== false ? strpos(substr($orig_body, $img_start), '[/img]') : false);
- }
-
- $new_body = $new_body . $orig_body;
-
- return array('body' => $new_body, 'images' => $saved_image);
-}}
-
-if(! function_exists('item_redir_and_replace_images')) {
-function item_redir_and_replace_images($body, $images, $cid) {
-
- $origbody = $body;
- $newbody = '';
-
- for($i = 0; $i < count($images); $i++) {
- $search = '/\[url\=(.*?)\]\[!#saved_image' . $i . '#!\]\[\/url\]' . '/is';
- $replace = '[url=' . z_path() . '/redir/' . $cid
- . '?f=1&url=' . '$1' . '][!#saved_image' . $i . '#!][/url]' ;
-
- $img_end = strpos($origbody, '[!#saved_image' . $i . '#!][/url]') + strlen('[!#saved_image' . $i . '#!][/url]');
- $process_part = substr($origbody, 0, $img_end);
- $origbody = substr($origbody, $img_end);
-
- $process_part = preg_replace($search, $replace, $process_part);
- $newbody = $newbody . $process_part;
- }
- $newbody = $newbody . $origbody;
-
- $cnt = 0;
- foreach($images as $image) {
- // We're depending on the property of 'foreach' (specified on the PHP website) that
- // it loops over the array starting from the first element and going sequentially
- // to the last element
- $newbody = str_replace('[!#saved_image' . $cnt . '#!]', '[img]' . $image . '[/img]', $newbody);
- $cnt++;
- }
-
- return $newbody;
-}}
-
-
-
function message_content(&$a) {
$o = '';
@@ -194,10 +14,17 @@ function message_content(&$a) {
if(! local_user()) {
notice( t('Permission denied.') . EOL);
- return;
+ return login();
}
$channel = $a->get_channel();
+ head_set_icon($channel['xchan_photo_s']);
+
+ $cipher = get_pconfig(local_user(),'system','default_cipher');
+ if(! $cipher)
+ $cipher = 'aes256';
+
+
$tpl = get_markup_template('mail_head.tpl');
$header = replace_macros($tpl, array(
@@ -205,93 +32,15 @@ function message_content(&$a) {
'$tab_content' => $tab_content
));
- if((argc() == 3) && (argv(1) === 'drop' || argv(1) === 'dropconv')) {
+ if((argc() == 3) && (argv(1) === 'dropconv')) {
if(! intval(argv(2)))
return;
$cmd = argv(1);
- if($cmd === 'drop') {
- $r = private_messages_drop(local_user(), argv(2));
- if($r) {
- info( t('Message deleted.') . EOL );
- }
- goaway($a->get_baseurl(true) . '/message' );
- }
- else {
- $r = private_messages_drop(local_user(), argv(2), true);
- if($r)
- info( t('Conversation removed.') . EOL );
- goaway($a->get_baseurl(true) . '/message' );
- }
- }
-
-
- if((argc() > 1) && ($a->argv[1] === 'new')) {
-
- $o .= $header;
-
- $plaintext = false;
- if(intval(get_pconfig(local_user(),'system','plaintext')))
- $plaintext = true;
- if(! feature_enabled(local_user(),'richtext'))
- $plaintext = true;
-
- $tpl = get_markup_template('msg-header.tpl');
-
- $a->page['htmlhead'] .= replace_macros($tpl, array(
- '$baseurl' => $a->get_baseurl(true),
- '$editselect' => (($plaintext) ? 'none' : '/(profile-jot-text|prvmail-text)/'),
- '$nickname' => $channel['channel_addr'],
- '$linkurl' => t('Please enter a link URL:')
- ));
-
- $preselect = (isset($a->argv[2])?array($a->argv[2]):false);
-
-
- $prename = $preurl = $preid = '';
-
- if($preselect) {
- $r = q("select abook.*, xchan.* from abook left join xchan on abook_xchan = xchan_hash
- where abook_channel = %d and abook_id = %d limit 1",
- intval(local_user()),
- intval(argv(2))
- );
- if($r) {
- $prename = $r[0]['xchan_name'];
- $preurl = $r[0]['xchan_url'];
- $preid = $r[0]['abook_id'];
- }
- }
-
- $prefill = (($preselect) ? $prename : '');
-
- // the ugly select box
-
- $select = contact_select('messageto','message-to-select', $preselect, 4, true, false, false, 10);
-
- $tpl = get_markup_template('prv_message.tpl');
- $o .= replace_macros($tpl,array(
- '$header' => t('Send Private Message'),
- '$to' => t('To:'),
- '$showinputs' => 'true',
- '$prefill' => $prefill,
- '$autocomp' => $autocomp,
- '$preid' => $preid,
- '$subject' => t('Subject:'),
- '$subjtxt' => ((x($_REQUEST,'subject')) ? strip_tags($_REQUEST['subject']) : ''),
- '$text' => ((x($_REQUEST,'body')) ? escape_tags(htmlspecialchars($_REQUEST['body'])) : ''),
- '$readonly' => '',
- '$yourmessage' => t('Your message:'),
- '$select' => $select,
- '$parent' => '',
- '$upload' => t('Upload photo'),
- '$insert' => t('Insert web link'),
- '$wait' => t('Please wait'),
- '$submit' => t('Submit')
- ));
-
- return $o;
+ $r = private_messages_drop(local_user(), argv(2), true);
+ if($r)
+ info( t('Conversation removed.') . EOL );
+ goaway($a->get_baseurl(true) . '/message' );
}
-
if(argc() == 1) {
// list messages
@@ -330,99 +79,5 @@ function message_content(&$a) {
return $o;
}
- if((argc() > 1) && (intval(argv(1)))) {
-
- $o .= $header;
-
- $plaintext = true;
- if( local_user() && feature_enabled(local_user(),'richtext') )
- $plaintext = false;
-
- $messages = private_messages_fetch_conversation(local_user(), argv(1), true);
-
- if(! $messages) {
- info( t('Message not found.') . EOL);
- return $o;
- }
-
-
- $tpl = get_markup_template('msg-header.tpl');
-
- $a->page['htmlhead'] .= replace_macros($tpl, array(
- '$nickname' => $channel['channel_addr'],
- '$baseurl' => $a->get_baseurl(true),
- '$editselect' => (($plaintext) ? 'none' : '/(profile-jot-text|prvmail-text)/'),
- '$linkurl' => t('Please enter a link URL:')
- ));
-
-
- $mails = array();
- $seen = 0;
- $unknown = false;
-
- foreach($messages as $message) {
-
-// FIXME
-// $extracted = item_extract_images($message['body']);
-// if($extracted['images'])
-// $message['body'] = item_redir_and_replace_images($extracted['body'], $extracted['images'], $message['contact-id']);
-
- $mails[] = array(
- 'id' => $message['id'],
- 'from_name' => $message['from']['xchan_name'],
- 'from_url' => chanlink_hash($message['from_xchan']),
- 'from_photo' => $message['from']['xchan_photo_m'],
- 'to_name' => $message['to']['xchan_name'],
- 'to_url' => chanlink_hash($message['to_xchan']),
- 'to_photo' => $message['to']['xchan_photo_m'],
- 'subject' => $message['title'],
- 'body' => smilies(bbcode($message['body'])),
- 'delete' => t('Delete message'),
- 'date' => datetime_convert('UTC',date_default_timezone_get(),$message['created'],'D, d M Y - g:i A'),
- );
-
- $seen = $message['seen'];
-
- }
-
- logger('mails: ' . print_r($mails,true), LOGGER_DATA);
-
- $recp = (($message['from_xchan'] === $channel['channel_hash']) ? 'to' : 'from');
-
-// FIXME - move this HTML to template
-
- $select = $message[$recp]['xchan_name'] . '<input type="hidden" name="messageto" value="' . $message[$recp]['xchan_hash'] . '" />';
- $parent = '<input type="hidden" name="replyto" value="' . $message['parent_uri'] . '" />';
-
- $tpl = get_markup_template('mail_display.tpl');
- $o = replace_macros($tpl, array(
- '$thread_id' => $a->argv[1],
- '$thread_subject' => $message['title'],
- '$thread_seen' => $seen,
- '$delete' => t('Delete conversation'),
- '$canreply' => (($unknown) ? false : '1'),
- '$unknown_text' => t("No secure communications available. You <strong>may</strong> be able to respond from the sender's profile page."),
- '$mails' => $mails,
-
- // reply
- '$header' => t('Send Reply'),
- '$to' => t('To:'),
- '$showinputs' => '',
- '$subject' => t('Subject:'),
- '$subjtxt' => $message['title'],
- '$readonly' => ' readonly="readonly" style="background: #BBBBBB;" ',
- '$yourmessage' => t('Your message:'),
- '$text' => '',
- '$select' => $select,
- '$parent' => $parent,
- '$upload' => t('Upload photo'),
- '$insert' => t('Insert web link'),
- '$submit' => t('Submit'),
- '$wait' => t('Please wait')
-
- ));
-
- return $o;
- }
}
diff --git a/mod/mitem.php b/mod/mitem.php
new file mode 100644
index 000000000..e0aa1b87a
--- /dev/null
+++ b/mod/mitem.php
@@ -0,0 +1,197 @@
+<?php
+
+require_once('include/menu.php');
+require_once('include/acl_selectors.php');
+
+function mitem_init(&$a) {
+ if(! local_user())
+ return;
+ if(argc() < 2)
+ return;
+
+ $m = menu_fetch_id(intval(argv(1)),local_user());
+ if(! $m) {
+ notice( t('Menu not found.') . EOL);
+ return '';
+ }
+ $a->data['menu'] = $m;
+
+}
+
+function mitem_post(&$a) {
+
+ if(! local_user())
+ return;
+
+ if(! $a->data['menu'])
+ return;
+
+
+ $channel = $a->get_channel();
+
+ $_REQUEST['mitem_channel_id'] = local_user();
+ $_REQUEST['menu_id'] = $a->data['menu']['menu_id'];
+
+ $_REQUEST['mitem_flags'] = 0;
+ if($_REQUEST['usezid'])
+ $_REQUEST['mitem_flags'] |= MENU_ITEM_ZID;
+ if($_REQUEST['newwin'])
+ $_REQUEST['mitem_flags'] |= MENU_ITEM_NEWWIN;
+
+
+ $mitem_id = ((argc() > 2) ? intval(argv(2)) : 0);
+ if($mitem_id) {
+ $_REQUEST['mitem_id'] = $mitem_id;
+ $r = menu_edit_item($_REQUEST['menu_id'],local_user(),$_REQUEST);
+ if($r) {
+ info( t('Menu element updated.') . EOL);
+ goaway(z_root() . '/mitem/' . $_REQUEST['menu_id']);
+ }
+ else
+ notice( t('Unable to update menu element.') . EOL);
+
+ }
+ else {
+ $r = menu_add_item($_REQUEST['menu_id'],local_user(),$_REQUEST);
+ if($r) {
+ info( t('Menu element added.') . EOL);
+ goaway(z_root() . '/mitem/' . $_REQUEST['menu_id']);
+ }
+ else
+ notice( t('Unable to add menu element.') . EOL);
+
+ }
+
+
+
+}
+
+
+function mitem_content(&$a) {
+
+ if(! local_user()) {
+ notice( t('Permission denied.') . EOL);
+ return '';
+ }
+
+ if(argc() < 2 || (! $a->data['menu'])) {
+ notice( t('Not found.') . EOL);
+ return '';
+ }
+
+ $channel = $a->get_channel();
+
+ $m = menu_fetch($a->data['menu']['menu_name'],local_user(), get_observer_hash());
+ $a->data['menu_item'] = $m;
+
+
+ if(argc() == 2) {
+ $r = q("select * from menu_item where mitem_menu_id = %d and mitem_channel_id = %d order by mitem_order asc, mitem_desc asc",
+ intval($a->data['menu']['menu_id']),
+ local_user()
+ );
+
+
+ $o .= replace_macros(get_markup_template('mitemlist.tpl'),array(
+ '$title' => t('Manage Menu Elements'),
+ '$menuname' => $a->data['menu']['menu_name'],
+ '$menudesc' => $a->data['menu']['menu_desc'],
+ '$edmenu' => t('Edit menu'),
+ '$menu_id' => $a->data['menu']['menu_id'],
+ '$mlist' => $r,
+ '$edit' => t('Edit element'),
+ '$drop' => t('Drop element'),
+ '$new' => t('New element'),
+ '$hintmenu' => t('Edit this menu container'),
+ '$hintnew' => t('Add menu element'),
+ '$hintdrop' => t('Delete this menu item'),
+ '$hintedit' => t('Edit this menu item')
+ ));
+
+
+ return $o;
+
+ }
+
+
+ if(argc() > 2) {
+
+
+
+ if(argv(2) === 'new') {
+
+ $perm_defaults = array(
+ 'allow_cid' => $channel['channel_allow_cid'],
+ 'allow_gid' => $channel['channel_allow_gid'],
+ 'deny_cid' => $channel['channel_deny_cid'],
+ 'deny_gid' => $channel['channel_deny_gid']
+ );
+
+ $o = replace_macros(get_markup_template('mitemedit.tpl'), array(
+ '$header' => t('New Menu Element'),
+ '$menu_id' => $a->data['menu']['menu_id'],
+ '$permissions' => t('Menu Item Permissions'),
+ '$permdesc' => t("\x28click to open/close\x29"),
+ '$aclselect' => populate_acl($perm_defaults),
+ '$mitem_desc' => array('mitem_desc', t('Link text'), '', '','*'),
+ '$mitem_link' => array('mitem_link', t('URL of link'), '', '', '*'),
+ '$usezid' => array('usezid', t('Use Red magic-auth if available'), true, ''),
+ '$newwin' => array('newwin', t('Open link in new window'), false,''),
+// permissions go here
+ '$mitem_order' => array('mitem_order', t('Order in list'),'0',t('Higher numbers will sink to bottom of listing')),
+ '$submit' => t('Create')
+ ));
+ return $o;
+ }
+
+
+ elseif(intval(argv(2))) {
+ $m = q("select * from menu_item where mitem_id = %d and mitem_channel_id = %d limit 1",
+ intval(argv(2)),
+ intval(local_user())
+ );
+ if(! $m) {
+ notice( t('Menu item not found.') . EOL);
+ goaway(z_root() . '/menu');
+ }
+
+ $mitem = $m[0];
+
+ if(argc() == 4 && argv(3) == 'drop') {
+ $r = menu_del_item($mitem['mitem_menu_id'], local_user(),intval(argv(2)));
+ if($r)
+ info( t('Menu item deleted.') . EOL);
+ else
+ notice( t('Menu item could not be deleted.'). EOL);
+
+ goaway(z_root() . '/mitem/' . $mitem['mitem_menu_id']);
+ }
+ else {
+
+ // edit menu item
+
+ $o = replace_macros(get_markup_template('mitemedit.tpl'), array(
+ '$header' => t('Edit Menu Element'),
+ '$menu_id' => $a->data['menu']['menu_id'],
+ '$permissions' => t('Menu Item Permissions'),
+ '$permdesc' => t("\x28click to open/close\x29"),
+ '$aclselect' => populate_acl($mitem),
+ '$mitem_id' => intval(argv(2)),
+ '$mitem_desc' => array('mitem_desc', t('Link text'), $mitem['mitem_desc'], '','*'),
+ '$mitem_link' => array('mitem_link', t('URL of link'), $mitem['mitem_link'], '', '*'),
+ '$usezid' => array('usezid', t('Use Red magic-auth if available'), (($mitem['mitem_flags'] & MENU_ITEM_ZID) ? 1 : 0), ''),
+ '$newwin' => array('newwin', t('Open link in new window'), (($mitem['mitem_flags'] & MENU_ITEM_NEWWIN) ? 1 : 0),''),
+// permissions go here
+ '$mitem_order' => array('mitem_order', t('Order in list'),$mitem['mitem_order'],t('Higher numbers will sink to bottom of listing')),
+ '$submit' => t('Modify')
+ ));
+ return $o;
+ }
+ }
+
+ }
+
+
+
+
+}
diff --git a/mod/mood.php b/mod/mood.php
index 98064beab..5075f622d 100755
--- a/mod/mood.php
+++ b/mod/mood.php
@@ -11,6 +11,7 @@ function mood_init(&$a) {
return;
$uid = local_user();
+ $channel = $a->get_channel();
$verb = notags(trim($_GET['verb']));
if(! $verb)
@@ -30,15 +31,15 @@ function mood_init(&$a) {
if($parent) {
- $r = q("select uri, owner_xchan, private, allow_cid, allow_gid, deny_cid, deny_gid
+ $r = q("select mid, owner_xchan, private, allow_cid, allow_gid, deny_cid, deny_gid
from item where id = %d and parent = %d and uid = %d limit 1",
intval($parent),
intval($parent),
intval($uid)
);
if(count($r)) {
- $parent_uri = $r[0]['uri'];
- $private = $r[0]['private'];
+ $parent_mid = $r[0]['mid'];
+ $private = $r[0]['item_private'];
$allow_cid = $r[0]['allow_cid'];
$allow_gid = $r[0]['allow_gid'];
$deny_cid = $r[0]['deny_cid'];
@@ -48,7 +49,6 @@ function mood_init(&$a) {
else {
$private = 0;
- $channel = $a->get_channel();
$allow_cid = $channel['channel_allow_cid'];
$allow_gid = $channel['channel_allow_gid'];
@@ -58,11 +58,11 @@ function mood_init(&$a) {
$poster = $a->get_observer();
- $uri = item_message_id();
+ $mid = item_message_id();
- $action = sprintf( t('%1$s is currently %2$s'), '[url=' . $poster['xchan_url'] . ']' . $poster['xchan_name'] . '[/url]' , $verbs[$verb]);
+ $action = sprintf( t('%1$s is currently %2$s'), '[zrl=' . $poster['xchan_url'] . ']' . $poster['xchan_name'] . '[/zrl]' , $verbs[$verb]);
$item_flags = ITEM_WALL|ITEM_ORIGIN|ITEM_UNSEEN;
- if(! $parent_uri)
+ if(! $parent_mid)
$item_flags |= ITEM_THREAD_TOP;
@@ -70,20 +70,28 @@ function mood_init(&$a) {
$arr['aid'] = get_account_id();
$arr['uid'] = $uid;
- $arr['uri'] = $uri;
- $arr['parent_uri'] = (($parent_uri) ? $parent_uri : $uri);
+ $arr['mid'] = $mid;
+ $arr['parent_mid'] = (($parent_mid) ? $parent_mid : $mid);
$arr['item_flags'] = $item_flags;
$arr['author_xchan'] = $poster['xchan_hash'];
- $arr['owner_xchan'] = (($parent_uri) ? $r[0]['owner_xchan'] : $poster['xchan_hash']);
+ $arr['owner_xchan'] = (($parent_mid) ? $r[0]['owner_xchan'] : $poster['xchan_hash']);
$arr['title'] = '';
$arr['allow_cid'] = $allow_cid;
$arr['allow_gid'] = $allow_gid;
$arr['deny_cid'] = $deny_cid;
$arr['deny_gid'] = $deny_gid;
+ $arr['item_private'] = $private;
$arr['verb'] = $activity;
$arr['body'] = $action;
- $item_id = item_store($arr);
+ if ((! $arr['plink']) && ($arr['item_flags'] & ITEM_THREAD_TOP)) {
+ $arr['plink'] = z_root() . '/channel/' . $channel['channel_address'] . '/?f=&mid=' . $arr['mid'];
+ }
+
+
+ $post = item_store($arr);
+ $item_id = $post['item_id'];
+
if($item_id) {
// q("UPDATE `item` SET `plink` = '%s' WHERE `uid` = %d AND `id` = %d LIMIT 1",
// dbesc($a->get_baseurl() . '/display/' . $poster['nickname'] . '/' . $item_id),
diff --git a/mod/network.php b/mod/network.php
index dae9fa6be..191fe55ed 100644
--- a/mod/network.php
+++ b/mod/network.php
@@ -1,243 +1,26 @@
<?php
require_once('include/items.php');
+require_once('include/group.php');
+require_once('include/contact_widgets.php');
+require_once('include/conversation.php');
+require_once('include/acl_selectors.php');
+
function network_init(&$a) {
if(! local_user()) {
notice( t('Permission denied.') . EOL);
return;
}
-
- $is_a_date_query = false;
-
- if($a->argc > 1) {
- for($x = 1; $x < $a->argc; $x ++) {
- if(is_a_date_arg($a->argv[$x])) {
- $is_a_date_query = true;
- break;
- }
- }
- }
-
- // convert query string to array and remove first element (wich is friendica args)
- $query_array = array();
- parse_str($a->query_string, $query_array);
- array_shift($query_array);
-
- // fetch last used tab and redirect if needed
- $sel_tabs = network_query_get_sel_tab($a);
- $last_sel_tabs = get_pconfig(local_user(), 'network.view','tab.selected');
- if (is_array($last_sel_tabs)){
- $tab_urls = array(
- '/network?f=&order=comment',//all
- '/network?f=&order=post', //postord
- '/network?f=&conv=1', //conv
- '/network/new', //new
- '/network?f=&star=1', //starred
- '/network?f=&spam=1', //spam
- );
-
- // redirect if current selected tab is 'no_active' and
- // last selected tab is _not_ 'all_active'.
- // and this isn't a date query
-
- if ($sel_tabs[0] == 'active' && $last_sel_tabs[0]!='active' && (! $is_a_date_query)) {
- $k = array_search('active', $last_sel_tabs);
-
- // merge tab querystring with request querystring
- $dest_qa = array();
- list($dest_url,$dest_qs) = explode("?", $tab_urls[$k]);
- parse_str( $dest_qs, $dest_qa);
- $dest_qa = array_merge($query_array, $dest_qa);
- $dest_qs = build_querystring($dest_qa);
-
- // groups filter is in form of "network/nnn". Add it to $dest_url, if it's possible
- if ($a->argc==2 && is_numeric($a->argv[1]) && strpos($dest_url, "/",1)===false){
- $dest_url .= "/".$a->argv[1];
- }
-
-// goaway($a->get_baseurl() . $dest_url."?".$dest_qs);
- }
- }
-
- $group_id = ((x($_GET,'gid')) ? intval($_GET['gid']) : 0);
-
- require_once('include/group.php');
- require_once('include/contact_widgets.php');
- require_once('include/items.php');
-
- if(! x($a->page,'aside'))
- $a->page['aside'] = '';
-
- $search = ((x($_GET,'search')) ? $_GET['search'] : '');
-
- if(x($_GET,'save')) {
- $r = q("select * from `term` where `uid` = %d and `type` = %d and `term` = '%s' limit 1",
- intval(local_user()),
- intval(TERM_SAVEDSEARCH),
- dbesc($search)
- );
- if(! count($r)) {
- q("insert into `term` ( `uid`,`type`,`term` ) values ( %d, %d, '%s') ",
- intval(local_user()),
- intval(TERM_SAVEDSEARCH),
- dbesc($search)
- );
- }
- }
- if(x($_GET,'remove')) {
- q("delete from `term` where `uid` = %d and `type` = %d and `term` = '%s' limit 1",
- intval(local_user()),
- intval(TERM_SAVEDSEARCH),
- dbesc($search)
- );
- }
-
-
- $a->page['aside'] .= group_side('network','network',true,$group_id);
- $a->page['aside'] .= posted_date_widget($a->get_baseurl() . '/network',local_user(),false);
-
- $a->page['aside'] .= saved_searches($search);
- $a->page['aside'] .= fileas_widget($a->get_baseurl(true) . '/network',(x($_GET, 'file') ? $_GET['file'] : ''));
-
- $base = $a->get_baseurl();
-
- $a->page['htmlhead'] .= <<< EOT
-
-<script>$(document).ready(function() {
- var a;
- a = $("#search-text").autocomplete({
- serviceUrl: '$base/search_ac',
- minChars: 2,
- width: 350,
- });
-});
-</script>
-EOT;
-
-
-
-}
-
-function saved_searches($search) {
-
- if(! feature_enabled(local_user(),'savedsearch'))
- return '';
-
- $a = get_app();
-
- $srchurl = '/network?f='
- . ((x($_GET,'cid')) ? '&cid=' . $_GET['cid'] : '')
- . ((x($_GET,'star')) ? '&star=' . $_GET['star'] : '')
- . ((x($_GET,'conv')) ? '&conv=' . $_GET['conv'] : '')
- . ((x($_GET,'cmin')) ? '&cmin=' . $_GET['cmin'] : '')
- . ((x($_GET,'cmax')) ? '&cmax=' . $_GET['cmax'] : '')
- . ((x($_GET,'file')) ? '&file=' . $_GET['file'] : '');
- ;
-
- $o = '';
-
- $r = q("select `tid`,`term` from `term` WHERE `uid` = %d and `type` = %d ",
- intval(local_user()),
- intval(TERM_SAVEDSEARCH)
- );
-
- $saved = array();
-
- if(count($r)) {
- foreach($r as $rr) {
- $saved[] = array(
- 'id' => $rr['tid'],
- 'term' => $rr['term'],
- 'displayterm' => htmlspecialchars($rr['term']),
- 'encodedterm' => urlencode($rr['term']),
- 'delete' => t('Remove term'),
- 'selected' => ($search==$rr['term']),
- );
- }
- }
-
-
- $tpl = get_markup_template("saved_searches_aside.tpl");
- $o = replace_macros($tpl, array(
- '$title' => t('Saved Searches'),
- '$add' => t('add'),
- '$searchbox' => search($search,'netsearch-box',$srchurl,true),
- '$saved' => $saved,
- ));
-
- return $o;
-
-}
-
-/**
- * Return selected tab from query
- *
- * urls -> returns
- * '/network' => $no_active = 'active'
- * '/network?f=&order=comment' => $comment_active = 'active'
- * '/network?f=&order=post' => $postord_active = 'active'
- * '/network?f=&conv=1', => $conv_active = 'active'
- * '/network/new', => $new_active = 'active'
- * '/network?f=&star=1', => $starred_active = 'active'
- * '/network?f=&spam=1', => $spam_active = 'active'
- *
- * @return Array ( $no_active, $comment_active, $postord_active, $conv_active, $new_active, $starred_active, $spam_active );
- */
-function network_query_get_sel_tab($a) {
- $no_active='';
- $starred_active = '';
- $new_active = '';
- $all_active = '';
- $search_active = '';
- $conv_active = '';
- $spam_active = '';
- $postord_active = '';
-
- if(x($_GET,'new')) {
- $new_active = 'active';
- }
-
- if(x($_GET,'search')) {
- $search_active = 'active';
- }
-
- if(x($_GET,'star')) {
- $starred_active = 'active';
- }
-
- if(x($_GET,'conv')) {
- $conv_active = 'active';
- }
-
- if(x($_GET,'spam')) {
- $spam_active = 'active';
- }
-
-
- if (($new_active == '')
- && ($starred_active == '')
- && ($conv_active == '')
- && ($search_active == '')
- && ($spam_active == '')) {
- $no_active = 'active';
- }
+ $channel = $a->get_channel();
+ $a->profile_uid = local_user();
+ head_set_icon($channel['xchan_photo_s']);
- if ($no_active=='active' && x($_GET,'order')) {
- switch($_GET['order']){
- case 'post': $postord_active = 'active'; $no_active=''; break;
- case 'comment' : $all_active = 'active'; $no_active=''; break;
- }
- }
-
- return array($no_active, $all_active, $postord_active, $conv_active, $new_active, $starred_active, $spam_active);
}
-
function network_content(&$a, $update = 0, $load = false) {
- require_once('include/conversation.php');
if(! local_user()) {
$_SESSION['return_url'] = $a->query_string;
@@ -245,13 +28,31 @@ function network_content(&$a, $update = 0, $load = false) {
}
-
$arr = array('query' => $a->query_string);
call_hooks('network_content_init', $arr);
$channel = $a->get_channel();
+ $search = (($_GET['search']) ? $_GET['search'] : '');
+ if($search) {
+ if(strpos($search,'@') === 0) {
+ $r = q("select abook_id from abook left join xchan on abook_xchan = xchan_hash where xchan_name = '%s' and abook_channel = %d limit 1",
+ dbesc(substr($search,1)),
+ intval(local_user())
+ );
+ if($r) {
+ $_GET['cid'] = $r[0]['abook_id'];
+ $search = $_GET['search'] = '';
+ }
+ }
+ elseif(strpos($search,'#') === 0) {
+ $search = $_GET['search'] = substr($search,1);
+ }
+ }
+
+
+
$datequery = $datequery2 = '';
$group = 0;
@@ -268,84 +69,28 @@ function network_content(&$a, $update = 0, $load = false) {
$_GET['order'] = 'post';
if($gid) {
+ $r = q("SELECT * FROM `groups` WHERE id = %d AND uid = %d LIMIT 1",
+ intval($gid),
+ intval(local_user())
+ );
+ if(! $r) {
+ if($update)
+ killme();
+ notice( t('No such group') . EOL );
+ goaway($a->get_baseurl(true) . '/network');
+ // NOTREACHED
+ }
+
$group = $gid;
- $def_acl = array('allow_gid' => '<' . $group . '>');
+ $group_hash = $r[0]['hash'];
+ $def_acl = array('allow_gid' => '<' . $r[0]['hash'] . '>');
}
$o = '';
- // item filter tabs
- // TODO: fix this logic, reduce duplication
- //$a->page['content'] .= '<div class="tabs-wrapper">';
- list($no_active, $all_active, $postord_active, $conv_active, $new_active, $starred_active, $spam_active) = network_query_get_sel_tab($a);
- // if no tabs are selected, defaults to comments
- if ($no_active=='active') $all_active='active';
- //echo "<pre>"; var_dump($no_active, $all_active, $postord_active, $conv_active, $new_active, $starred_active, $bookmarked_active, $spam_active); killme();
-
- $cmd = (($datequery) ? '' : $a->cmd);
- $len_naked_cmd = strlen(str_replace('/new','',$cmd));
-
- // tabs
- $tabs = array(
- array(
- 'label' => t('Commented Order'),
- 'url'=>$a->get_baseurl(true) . '/' . $cmd . '?f=&order=comment' . ((x($_GET,'cid')) ? '&cid=' . $_GET['cid'] : ''),
- 'sel'=>$all_active,
- 'title'=> t('Sort by Comment Date'),
- ),
- array(
- 'label' => t('Posted Order'),
- 'url'=>$a->get_baseurl(true) . '/' . $cmd . '?f=&order=post' . ((x($_GET,'cid')) ? '&cid=' . $_GET['cid'] : ''),
- 'sel'=>$postord_active,
- 'title' => t('Sort by Post Date'),
- ),
-
- array(
- 'label' => t('Personal'),
- 'url' => $a->get_baseurl(true) . '/' . $cmd . ((x($_GET,'cid')) ? '/?f=&cid=' . $_GET['cid'] : '') . '&conv=1',
- 'sel' => $conv_active,
- 'title' => t('Posts that mention or involve you'),
- ),
- array(
- 'label' => t('New'),
- 'url' => $a->get_baseurl(true) . '/' . $cmd . ((x($_GET,'cid')) ? '/?f=&cid=' . $_GET['cid'] : '') . '&new=1',
- 'sel' => $new_active,
- 'title' => t('Activity Stream - by date'),
- ),
-
- );
-
- if(feature_enabled(local_user(),'star_posts'))
- $tabs[] = array(
- 'label' => t('Starred'),
- 'url'=>$a->get_baseurl(true) . '/' . $cmd . ((x($_GET,'cid')) ? '/?f=&cid=' . $_GET['cid'] : '') . '&star=1',
- 'sel'=>$starred_active,
- 'title' => t('Favourite Posts'),
- );
-
- // Not yet implemented
-
- if(feature_enabled(local_user(),'spam_filter'))
- $tabs[] = array(
- 'label' => t('Spam'),
- 'url'=>$a->get_baseurl(true) . '/network?f=&spam=1',
- 'sel'=> $spam_active,
- 'title' => t('Posts flagged as SPAM'),
- );
-
-
-
- // save selected tab, but only if not in search or file mode
- if(!x($_GET,'search') && !x($_GET,'file')) {
- set_pconfig( local_user(), 'network.view','tab.selected',array($all_active, $postord_active, $conv_active, $new_active, $starred_active, $bookmarked_active, $spam_active) );
- }
-
-
- $contact_id = $a->cid;
-
- require_once('include/acl_selectors.php');
+ // if no tabs are selected, defaults to comments
$cid = ((x($_GET,'cid')) ? intval($_GET['cid']) : 0);
$star = ((x($_GET,'star')) ? intval($_GET['star']) : 0);
@@ -366,46 +111,29 @@ function network_content(&$a, $update = 0, $load = false) {
if(! $update) {
-
- if(feature_enabled(local_user(),'affinity')) {
- $tpl = get_markup_template('main_slider.tpl');
- $o .= replace_macros($tpl,array(
- '$val' => intval($cmin) . ';' . intval($cmax),
- '$refresh' => t('Refresh'),
- '$me' => t('Me'),
- '$intimate' => t('Best Friends'),
- '$friends' => t('Friends'),
- '$coworkers' => t('Co-workers'),
- '$oldfriends' => t('Former Friends'),
- '$acquaintances' => t('Acquaintances'),
- '$world' => t('Everybody')
- ));
- }
-
- $arr = array('tabs' => $tabs);
- call_hooks('network_tabs', $arr);
-
- $o .= replace_macros(get_markup_template('common_tabs.tpl'), array('$tabs'=> $arr['tabs']));
-
- // --- end item filter tabs
-
+ $o .= network_tabs();
// search terms header
if($search)
- $o .= '<h2>' . t('Search Results For:') . ' ' . htmlspecialchars($search) . '</h2>';
+ $o .= '<h2>' . t('Search Results For:') . ' ' . htmlspecialchars($search, ENT_COMPAT,'UTF-8') . '</h2>';
nav_set_selected('network');
- $celeb = ((($a->user['page-flags'] == PAGE_SOAPBOX) || ($a->user['page-flags'] == PAGE_COMMUNITY)) ? true : false);
+ $channel_acl = array(
+ 'allow_cid' => $channel['channel_allow_cid'],
+ 'allow_gid' => $channel['channel_allow_gid'],
+ 'deny_cid' => $channel['channel_deny_cid'],
+ 'deny_gid' => $channel['channel_deny_gid']
+ );
+
$x = array(
'is_owner' => true,
- 'allow_location' => $a->user['allow_location'], // FIXME
+ 'allow_location' => ((intval(get_pconfig($channel['channel_id'],'system','use_browser_location'))) ? '1' : ''),
'default_location' => $channel['channel_location'],
'nickname' => $channel['channel_address'],
'lockstate' => (($group || $cid || $channel['channel_allow_cid'] || $channel['channel_allow_gid'] || $channel['channel_deny_cid'] || $channel['channel_deny_gid']) ? 'lock' : 'unlock'),
-// FIXME
- 'acl' => populate_acl((($group || $cid || $nets) ? $def_acl : $channel), $celeb),
+ 'acl' => populate_acl((($group || $cid) ? $def_acl : $channel_acl)),
'bang' => (($group || $cid) ? '!' : ''),
'visitor' => 'block',
'profile_uid' => local_user()
@@ -430,45 +158,44 @@ function network_content(&$a, $update = 0, $load = false) {
$sql_extra = " AND `item`.`parent` IN ( SELECT `parent` FROM `item` WHERE (item_flags & " . intval(ITEM_THREAD_TOP) . ") $sql_options ) ";
if($group) {
- $r = q("SELECT `name`, `id` FROM `group` WHERE `id` = %d AND `uid` = %d LIMIT 1",
- intval($group),
- intval($_SESSION['uid'])
- );
- if(! count($r)) {
- if($update)
- killme();
- notice( t('No such group') . EOL );
- goaway($a->get_baseurl(true) . '/network');
- // NOTREACHED
- }
+ $contact_str = '';
+ $contacts = group_get_members($group);
+ if($contacts) {
+ foreach($contacts as $c) {
+ if($contact_str)
+ $contact_str .= ',';
+ $contact_str .= "'" . $c['xchan'] . "'";
+ }
+ }
+ else {
+ $contact_str = ' 0 ';
+ info( t('Collection is empty'));
+ }
- $contacts = expand_groups(array($group));
- if((is_array($contacts)) && count($contacts)) {
- $contact_str = implode(',',$contacts);
- }
- else {
- $contact_str = ' 0 ';
- info( t('Group is empty'));
- }
+ $sql_extra = " AND item.parent IN ( SELECT DISTINCT parent FROM item WHERE true $sql_options AND (( author_xchan IN ( $contact_str ) OR owner_xchan in ( $contact_str )) or allow_gid like '" . protect_sprintf('%<' . dbesc($group_hash) . '>%') . "' ) and id = parent and item_restrict = 0 ) ";
+
+ $x = group_rec_byhash(local_user(), $group_hash);
+
+ if($x)
+ $o = '<h2>' . t('Collection: ') . $x['name'] . '</h2>' . $o;
+
+
+ }
- $sql_extra = " AND `item`.`parent` IN ( SELECT DISTINCT(`parent`) FROM `item` WHERE 1 $sql_options AND ( `contact-id` IN ( $contact_str ) OR `allow_gid` like '" . protect_sprintf('%<' . intval($group) . '>%') . "' ) and deleted = 0 ) ";
- $o = '<h2>' . t('Group: ') . $r[0]['name'] . '</h2>' . $o;
- }
elseif($cid) {
- $r = q("SELECT `id`,`name`,`network`,`writable`,`nurl` FROM `contact` WHERE `id` = %d
- AND `blocked` = 0 AND `pending` = 0 LIMIT 1",
- intval($cid)
- );
- if(count($r)) {
- $sql_extra = " AND `item`.`parent` IN ( SELECT DISTINCT(`parent`) FROM `item` WHERE 1 $sql_options AND `contact-id` = " . intval($cid) . " and deleted = 0 ) ";
- $o = '<h2>' . t('Contact: ') . $r[0]['name'] . '</h2>' . $o;
- }
- else {
- notice( t('Invalid contact.') . EOL);
+ $r = q("SELECT abook.*, xchan.* from abook left join xchan on abook_xchan = xchan_hash where abook_id = %d and abook_channel = %d and not ( abook_flags & " . intval(ABOOK_FLAG_BLOCKED) . ") limit 1",
+ intval($cid),
+ intval(local_user())
+ );
+ if($r) {
+ $sql_extra = " AND item.parent IN ( SELECT DISTINCT parent FROM item WHERE true $sql_options AND uid = " . intval(local_user()) . " AND ( author_xchan = '" . dbesc($r[0]['abook_xchan']) . "' or owner_xchan = '" . dbesc($r[0]['abook_xchan']) . "' ) and item_restrict = 0 ) ";
+ $o = '<h2>' . t('Connection: ') . $r[0]['xchan_name'] . '</h2>' . $o;
+ }
+ else {
+ notice( t('Invalid connection.') . EOL);
goaway($a->get_baseurl(true) . '/network');
- // NOTREACHED
- }
+ }
}
@@ -495,6 +222,7 @@ function network_content(&$a, $update = 0, $load = false) {
. "'; var profile_page = " . $a->pager['page'] . ";</script>";
+
$a->page['htmlhead'] .= replace_macros(get_markup_template("build_query.tpl"),array(
'$baseurl' => z_root(),
'$pgtype' => 'network',
@@ -509,13 +237,14 @@ function network_content(&$a, $update = 0, $load = false) {
'$spam' => (($spam) ? $spam : '0'),
'$nouveau' => (($nouveau) ? $nouveau : '0'),
'$wall' => '0',
+ '$list' => ((x($_REQUEST,'list')) ? intval($_REQUEST['list']) : 0),
'$page' => (($a->pager['page'] != 1) ? $a->pager['page'] : 1),
- '$search' => $search,
+ '$search' => (($search) ? $search : ''),
'$order' => $order,
'$file' => $file,
'$cats' => '',
'$dend' => $datequery,
- '$uri' => '',
+ '$mid' => '',
'$dbegin' => $datequery2
));
}
@@ -651,6 +380,8 @@ function network_content(&$a, $update = 0, $load = false) {
$first = dba_timer();
// Then fetch all the children of the parents that are on this page
+ $parents_str = '';
+ $update_unseen = '';
if($r) {
@@ -709,10 +440,12 @@ function network_content(&$a, $update = 0, $load = false) {
$sixth = dba_timer();
- if(! $update)
+ if(($items) && (! $update))
$o .= alt_pager($a,count($items));
if($load) {
+// logger('mod_network: load: ' . count($items) . ' items', LOGGER_DATA);
+
profiler($start,$first,'network parents');
profiler($first,$second,'network children');
profiler($second,$third,'network authors');
diff --git a/mod/nogroup.php b/mod/nogroup.php
deleted file mode 100644
index bd1ec82ed..000000000
--- a/mod/nogroup.php
+++ /dev/null
@@ -1,65 +0,0 @@
-<?php
-
-require_once('include/Contact.php');
-require_once('include/socgraph.php');
-require_once('include/contact_selectors.php');
-
-function nogroup_init(&$a) {
-
- if(! local_user())
- return;
-
- require_once('include/group.php');
- require_once('include/contact_widgets.php');
-
- if(! x($a->page,'aside'))
- $a->page['aside'] = '';
-
- $a->page['aside'] .= group_side('contacts','group',false,0,$contact_id);
-}
-
-
-function nogroup_content(&$a) {
-
- if(! local_user()) {
- notice( t('Permission denied.') . EOL);
- return '';
- }
-
- require_once('include/Contact.php');
- $r = contacts_not_grouped(local_user());
- if(count($r)) {
- $a->set_pager_total($r[0]['total']);
- }
- $r = contacts_not_grouped(local_user(),$a->pager['start'],$a->pager['itemspage']);
- if(count($r)) {
- foreach($r as $rr) {
-
-
- $contacts[] = array(
- 'img_hover' => sprintf( t('Visit %s\'s profile [%s]'),$rr['name'],$rr['url']),
- 'edit_hover' => t('Edit contact'),
- 'photo_menu' => contact_photo_menu($rr),
- 'id' => $rr['id'],
- 'alt_text' => $alt_text,
- 'dir_icon' => $dir_icon,
- 'thumb' => $rr['thumb'],
- 'name' => $rr['name'],
- 'username' => $rr['name'],
- 'sparkle' => $sparkle,
- 'itemurl' => $rr['url'],
- 'url' => $url,
- 'network' => network_to_name($rr['network']),
- );
- }
- }
- $tpl = get_markup_template("nogroup-template.tpl");
- $o .= replace_macros($tpl,array(
- '$header' => t('Contacts who are not members of a group'),
- '$contacts' => $contacts,
- '$paginate' => paginate($a),
- ));
-
- return $o;
-
-}
diff --git a/mod/notes.php b/mod/notes.php
new file mode 100644
index 000000000..468b4ef26
--- /dev/null
+++ b/mod/notes.php
@@ -0,0 +1,16 @@
+<?php /** @file */
+
+function notes_init(&$a) {
+ if(! local_user())
+ return;
+ logger('mod_notes: ' . print_r($_REQUEST,true));
+
+ $ret = array('success' => true);
+ if($_REQUEST['note_text'] || $_REQUEST['note_text'] == '') {
+ $body = escape_tags($_REQUEST['note_text']);
+ set_pconfig(local_user(),'notes','text',$body);
+ }
+ logger('notes saved.');
+ json_return_and_die($ret);
+
+}
diff --git a/mod/notifications.php b/mod/notifications.php
index 7d861037c..f327c2fe2 100644
--- a/mod/notifications.php
+++ b/mod/notifications.php
@@ -70,242 +70,7 @@ function notifications_content(&$a) {
nav_set_selected('notifications');
$o = '';
- $tabs = array(
- array(
- 'label' => t('System'),
- 'url'=>$a->get_baseurl(true) . '/notifications/system',
- 'sel'=> (($a->argv[1] == 'system') ? 'active' : ''),
- ),
- array(
- 'label' => t('Network'),
- 'url'=>$a->get_baseurl(true) . '/notifications/network',
- 'sel'=> (($a->argv[1] == 'network') ? 'active' : ''),
- ),
- array(
- 'label' => t('Personal'),
- 'url'=>$a->get_baseurl(true) . '/notifications/personal',
- 'sel'=> (($a->argv[1] == 'personal') ? 'active' : ''),
- ),
- array(
- 'label' => t('Home'),
- 'url' => $a->get_baseurl(true) . '/notifications/home',
- 'sel'=> (($a->argv[1] == 'home') ? 'active' : ''),
- ),
- array(
- 'label' => t('Introductions'),
- 'url' => $a->get_baseurl(true) . '/notifications/intros',
- 'sel'=> (($a->argv[1] == 'intros') ? 'active' : ''),
- ),
- array(
- 'label' => t('Messages'),
- 'url' => $a->get_baseurl(true) . '/message',
- 'sel'=> '',
- ),
- );
-
- $o = "";
-
-
- if( (($a->argc > 1) && ($a->argv[1] == 'intros')) || (($a->argc == 1))) {
- nav_set_selected('introductions');
- if(($a->argc > 2) && ($a->argv[2] == 'all'))
- $sql_extra = '';
- else
- $sql_extra = " AND `ignore` = 0 ";
-
- $notif_tpl = get_markup_template('notifications.tpl');
-
- $notif_content .= '<a href="' . ((strlen($sql_extra)) ? 'notifications/intros/all' : 'notifications/intros' ) . '" id="notifications-show-hide-link" >'
- . ((strlen($sql_extra)) ? t('Show Ignored Requests') : t('Hide Ignored Requests')) . '</a></div>' . "\r\n";
-
- $r = q("SELECT COUNT(*) AS `total` FROM `intro`
- WHERE `intro`.`uid` = %d $sql_extra AND `intro`.`blocked` = 0 ",
- intval($_SESSION['uid'])
- );
- if($r && count($r)) {
- $a->set_pager_total($r[0]['total']);
- $a->set_pager_itemspage(20);
- }
-
- $r = q("SELECT `intro`.`id` AS `intro_id`, `intro`.*, `contact`.*, `fcontact`.`name` AS `fname`,`fcontact`.`url` AS `furl`,`fcontact`.`photo` AS `fphoto`,`fcontact`.`request` AS `frequest`
- FROM `intro` LEFT JOIN `contact` ON `contact`.`id` = `intro`.`contact-id` LEFT JOIN `fcontact` ON `intro`.`fid` = `fcontact`.`id`
- WHERE `intro`.`uid` = %d $sql_extra AND `intro`.`blocked` = 0 ",
- intval($_SESSION['uid']));
-
- if(($r !== false) && (count($r))) {
-
- $sugg = get_markup_template('suggestions.tpl');
- $tpl = get_markup_template("intros.tpl");
-
- foreach($r as $rr) {
- if($rr['fid']) {
- $return_addr = bin2hex($a->user['nickname'] . '@' . $a->get_hostname() . (($a->path) ? '/' . $a->path : ''));
- $notif_content .= replace_macros($sugg,array(
- '$str_notifytype' => t('Notification type: '),
- '$notify_type' => t('Friend Suggestion'),
- '$intro_id' => $rr['intro_id'],
- '$madeby' => sprintf( t('suggested by %s'),$rr['name']),
- '$contact_id' => $rr['contact-id'],
- '$photo' => ((x($rr,'fphoto')) ? $rr['fphoto'] : "images/person-175.jpg"),
- '$fullname' => $rr['fname'],
- '$url' => zid($rr['furl']),
- '$hidden' => array('hidden', t('Hide this contact from others'), ($rr['hidden'] == 1), ''),
- '$activity' => array('activity', t('Post a new friend activity'), (intval(get_pconfig(local_user(),'system','post_newfriend')) ? '1' : 0), t('if applicable')),
-
- '$knowyou' => $knowyou,
- '$approve' => t('Approve'),
- '$note' => $rr['note'],
- '$request' => $rr['frequest'] . '?addr=' . $return_addr,
- '$ignore' => t('Ignore'),
- '$discard' => t('Discard')
-
- ));
-
- continue;
-
- }
- $friend_selected = (($rr['network'] !== NETWORK_OSTATUS) ? ' checked="checked" ' : ' disabled ');
- $fan_selected = (($rr['network'] === NETWORK_OSTATUS) ? ' checked="checked" disabled ' : '');
- $dfrn_tpl = get_markup_template('netfriend.tpl');
-
- $knowyou = '';
- $dfrn_text = '';
-
- if($rr['network'] === NETWORK_DFRN || $rr['network'] === NETWORK_DIASPORA) {
- if($rr['network'] === NETWORK_DFRN)
- $knowyou = t('Claims to be known to you: ') . (($rr['knowyou']) ? t('yes') : t('no'));
- else
- $knowyou = '';
- $dfrn_text = replace_macros($dfrn_tpl,array(
- '$intro_id' => $rr['intro_id'],
- '$friend_selected' => $friend_selected,
- '$fan_selected' => $fan_selected,
- '$approve_as' => t('Approve as: '),
- '$as_friend' => t('Friend'),
- '$as_fan' => (($rr['network'] == NETWORK_DIASPORA) ? t('Sharer') : t('Fan/Admirer'))
- ));
- }
-
- $notif_content .= replace_macros($tpl,array(
- '$str_notifytype' => t('Notification type: '),
- '$notify_type' => (($rr['network'] !== NETWORK_OSTATUS) ? t('Friend/Connect Request') : t('New Follower')),
- '$dfrn_text' => $dfrn_text,
- '$dfrn_id' => $rr['issued_id'],
- '$uid' => $_SESSION['uid'],
- '$intro_id' => $rr['intro_id'],
- '$contact_id' => $rr['contact-id'],
- '$photo' => ((x($rr,'photo')) ? $rr['photo'] : "images/person-175.jpg"),
- '$fullname' => $rr['name'],
- '$hidden' => array('hidden', t('Hide this contact from others'), ($rr['hidden'] == 1), ''),
- '$activity' => array('activity', t('Post a new friend activity'), (intval(get_pconfig(local_user(),'system','post_newfriend')) ? '1' : 0), t('if applicable')),
- '$url' => zid($rr['url']),
- '$knowyou' => $knowyou,
- '$approve' => t('Approve'),
- '$note' => $rr['note'],
- '$ignore' => t('Ignore'),
- '$discard' => t('Discard')
-
- ));
- }
- }
- else
- info( t('No introductions.') . EOL);
-
- $o .= replace_macros($notif_tpl,array(
- '$notif_header' => t('Notifications'),
- '$tabs' => $tabs,
- '$notif_content' => $notif_content,
- ));
-
- $o .= paginate($a);
- return $o;
-
- } else if (($a->argc > 1) && ($a->argv[1] == 'network')) {
-
- $notif_tpl = get_markup_template('notifications.tpl');
-
- $r = q("SELECT `item`.`id`,`item`.`parent`, `item`.`verb`, `item`.`author-name`,
- `item`.`author-link`, `item`.`author-avatar`, `item`.`created`, `item`.`object` as `object`,
- `pitem`.`author-name` as `pname`, `pitem`.`author-link` as `plink`
- FROM `item` INNER JOIN `item` as `pitem` ON `pitem`.`id`=`item`.`parent`
- WHERE `item`.`unseen` = 1 AND `item`.`visible` = 1 AND
- `item`.`deleted` = 0 AND `item`.`uid` = %d AND `item`.`wall` = 0 ORDER BY `item`.`created` DESC" ,
- intval(local_user())
- );
-
- $tpl_item_likes = get_markup_template('notifications_likes_item.tpl');
- $tpl_item_dislikes = get_markup_template('notifications_dislikes_item.tpl');
- $tpl_item_friends = get_markup_template('notifications_friends_item.tpl');
- $tpl_item_comments = get_markup_template('notifications_comments_item.tpl');
- $tpl_item_posts = get_markup_template('notifications_posts_item.tpl');
-
- $notif_content = '';
-
- if (count($r) > 0) {
-
- foreach ($r as $it) {
- switch($it['verb']){
- case ACTIVITY_LIKE:
- $notif_content .= replace_macros($tpl_item_likes,array(
- '$item_link' => $a->get_baseurl(true).'/display/'.$a->user['nickname']."/".$it['parent'],
- '$item_image' => $it['author-avatar'],
- '$item_text' => sprintf( t("%s liked %s's post"), $it['author-name'], $it['pname']),
- '$item_when' => relative_date($it['created'])
- ));
- break;
-
- case ACTIVITY_DISLIKE:
- $notif_content .= replace_macros($tpl_item_dislikes,array(
- '$item_link' => $a->get_baseurl(true).'/display/'.$a->user['nickname']."/".$it['parent'],
- '$item_image' => $it['author-avatar'],
- '$item_text' => sprintf( t("%s disliked %s's post"), $it['author-name'], $it['pname']),
- '$item_when' => relative_date($it['created'])
- ));
- break;
-
- case ACTIVITY_FRIEND:
-
- $xmlhead="<"."?xml version='1.0' encoding='UTF-8' ?".">";
- $obj = parse_xml_string($xmlhead.$it['object']);
- $it['fname'] = $obj->title;
-
- $notif_content .= replace_macros($tpl_item_friends,array(
- '$item_link' => $a->get_baseurl(true).'/display/'.$a->user['nickname']."/".$it['parent'],
- '$item_image' => $it['author-avatar'],
- '$item_text' => sprintf( t("%s is now friends with %s"), $it['author-name'], $it['fname']),
- '$item_when' => relative_date($it['created'])
- ));
- break;
-
- default:
- $item_text = (($it['id'] == $it['parent'])
- ? sprintf( t("%s created a new post"), $it['author-name'])
- : sprintf( t("%s commented on %s's post"), $it['author-name'], $it['pname']));
- $tpl = (($it['id'] == $it['parent']) ? $tpl_item_posts : $tpl_item_comments);
-
- $notif_content .= replace_macros($tpl,array(
- '$item_link' => $a->get_baseurl(true).'/display/'.$a->user['nickname']."/".$it['parent'],
- '$item_image' => $it['author-avatar'],
- '$item_text' => $item_text,
- '$item_when' => relative_date($it['created'])
- ));
- }
- }
-
- } else {
-
- $notif_content = t('No more network notifications.');
- }
-
- $o .= replace_macros($notif_tpl,array(
- '$notif_header' => t('Network Notifications'),
- '$tabs' => $tabs,
- '$notif_content' => $notif_content,
- ));
-
- } else if (($a->argc > 1) && ($a->argv[1] == 'system')) {
-
$notif_tpl = get_markup_template('notifications.tpl');
$not_tpl = get_markup_template('notify.tpl');
@@ -330,187 +95,8 @@ function notifications_content(&$a) {
$o .= replace_macros($notif_tpl,array(
'$notif_header' => t('System Notifications'),
- '$tabs' => $tabs,
'$notif_content' => $notif_content,
));
- } else if (($a->argc > 1) && ($a->argv[1] == 'personal')) {
-
- $notif_tpl = get_markup_template('notifications.tpl');
-
- $myurl = $a->get_baseurl(true) . '/channel/'. $a->user['nickname'];
- $myurl = substr($myurl,strpos($myurl,'://')+3);
- $myurl = str_replace(array('www.','.'),array('','\\.'),$myurl);
- $diasp_url = str_replace('/channel/','/u/',$myurl);
- $sql_extra .= sprintf(" AND ( `item`.`author-link` regexp '%s' or `item`.`tag` regexp '%s' or `item`.`tag` regexp '%s' ) ",
- dbesc($myurl . '$'),
- dbesc($myurl . '\\]'),
- dbesc($diasp_url . '\\]')
- );
-
-
- $r = q("SELECT `item`.`id`,`item`.`parent`, `item`.`verb`, `item`.`author-name`,
- `item`.`author-link`, `item`.`author-avatar`, `item`.`created`, `item`.`object` as `object`,
- `pitem`.`author-name` as `pname`, `pitem`.`author-link` as `plink`
- FROM `item` INNER JOIN `item` as `pitem` ON `pitem`.`id`=`item`.`parent`
- WHERE `item`.`unseen` = 1 AND `item`.`visible` = 1
- $sql_extra
- AND `item`.`deleted` = 0 AND `item`.`uid` = %d AND `item`.`wall` = 0 ORDER BY `item`.`created` DESC" ,
- intval(local_user())
- );
-
- $tpl_item_likes = get_markup_template('notifications_likes_item.tpl');
- $tpl_item_dislikes = get_markup_template('notifications_dislikes_item.tpl');
- $tpl_item_friends = get_markup_template('notifications_friends_item.tpl');
- $tpl_item_comments = get_markup_template('notifications_comments_item.tpl');
- $tpl_item_posts = get_markup_template('notifications_posts_item.tpl');
-
- $notif_content = '';
-
- if (count($r) > 0) {
-
- foreach ($r as $it) {
- switch($it['verb']){
- case ACTIVITY_LIKE:
- $notif_content .= replace_macros($tpl_item_likes,array(
- '$item_link' => $a->get_baseurl(true).'/display/'.$a->user['nickname']."/".$it['parent'],
- '$item_image' => $it['author-avatar'],
- '$item_text' => sprintf( t("%s liked %s's post"), $it['author-name'], $it['pname']),
- '$item_when' => relative_date($it['created'])
- ));
- break;
-
- case ACTIVITY_DISLIKE:
- $notif_content .= replace_macros($tpl_item_dislikes,array(
- '$item_link' => $a->get_baseurl(true).'/display/'.$a->user['nickname']."/".$it['parent'],
- '$item_image' => $it['author-avatar'],
- '$item_text' => sprintf( t("%s disliked %s's post"), $it['author-name'], $it['pname']),
- '$item_when' => relative_date($it['created'])
- ));
- break;
-
- case ACTIVITY_FRIEND:
-
- $xmlhead="<"."?xml version='1.0' encoding='UTF-8' ?".">";
- $obj = parse_xml_string($xmlhead.$it['object']);
- $it['fname'] = $obj->title;
-
- $notif_content .= replace_macros($tpl_item_friends,array(
- '$item_link' => $a->get_baseurl(true).'/display/'.$a->user['nickname']."/".$it['parent'],
- '$item_image' => $it['author-avatar'],
- '$item_text' => sprintf( t("%s is now friends with %s"), $it['author-name'], $it['fname']),
- '$item_when' => relative_date($it['created'])
- ));
- break;
-
- default:
- $item_text = (($it['id'] == $it['parent'])
- ? sprintf( t("%s created a new post"), $it['author-name'])
- : sprintf( t("%s commented on %s's post"), $it['author-name'], $it['pname']));
- $tpl = (($it['id'] == $it['parent']) ? $tpl_item_posts : $tpl_item_comments);
-
- $notif_content .= replace_macros($tpl,array(
- '$item_link' => $a->get_baseurl(true).'/display/'.$a->user['nickname']."/".$it['parent'],
- '$item_image' => $it['author-avatar'],
- '$item_text' => $item_text,
- '$item_when' => relative_date($it['created'])
- ));
- }
- }
-
- } else {
-
- $notif_content = t('No more personal notifications.');
- }
-
- $o .= replace_macros($notif_tpl,array(
- '$notif_header' => t('Personal Notifications'),
- '$tabs' => $tabs,
- '$notif_content' => $notif_content,
- ));
-
-
-
-
-
-
- } else if (($a->argc > 1) && ($a->argv[1] == 'home')) {
-
- $notif_tpl = get_markup_template('notifications.tpl');
-
- $r = q("SELECT `item`.`id`,`item`.`parent`, `item`.`verb`, `item`.`author-name`,
- `item`.`author-link`, `item`.`author-avatar`, `item`.`created`, `item`.`object` as `object`,
- `pitem`.`author-name` as `pname`, `pitem`.`author-link` as `plink`
- FROM `item` INNER JOIN `item` as `pitem` ON `pitem`.`id`=`item`.`parent`
- WHERE `item`.`unseen` = 1 AND `item`.`visible` = 1 AND
- `item`.`deleted` = 0 AND `item`.`uid` = %d AND `item`.`wall` = 1 ORDER BY `item`.`created` DESC",
- intval(local_user())
- );
-
- $tpl_item_likes = get_markup_template('notifications_likes_item.tpl');
- $tpl_item_dislikes = get_markup_template('notifications_dislikes_item.tpl');
- $tpl_item_friends = get_markup_template('notifications_friends_item.tpl');
- $tpl_item_comments = get_markup_template('notifications_comments_item.tpl');
-
- $notif_content = '';
-
- if (count($r) > 0) {
-
- foreach ($r as $it) {
- switch($it['verb']){
- case ACTIVITY_LIKE:
- $notif_content .= replace_macros($tpl_item_likes,array(
- '$item_link' => $a->get_baseurl(true).'/display/'.$a->user['nickname']."/".$it['parent'],
- '$item_image' => $it['author-avatar'],
- '$item_text' => sprintf( t("%s liked %s's post"), $it['author-name'], $it['pname']),
- '$item_when' => relative_date($it['created'])
- ));
-
- break;
- case ACTIVITY_DISLIKE:
- $notif_content .= replace_macros($tpl_item_dislikes,array(
- '$item_link' => $a->get_baseurl(true).'/display/'.$a->user['nickname']."/".$it['parent'],
- '$item_image' => $it['author-avatar'],
- '$item_text' => sprintf( t("%s disliked %s's post"), $it['author-name'], $it['pname']),
- '$item_when' => relative_date($it['created'])
- ));
-
- break;
- case ACTIVITY_FRIEND:
-
- $xmlhead="<"."?xml version='1.0' encoding='UTF-8' ?".">";
- $obj = parse_xml_string($xmlhead.$it['object']);
- $it['fname'] = $obj->title;
-
- $notif_content .= replace_macros($tpl_item_friends,array(
- '$item_link' => $a->get_baseurl(true).'/display/'.$a->user['nickname']."/".$it['parent'],
- '$item_image' => $it['author-avatar'],
- '$item_text' => sprintf( t("%s is now friends with %s"), $it['author-name'], $it['fname']),
- '$item_when' => relative_date($it['created'])
- ));
-
- break;
- default:
- $notif_content .= replace_macros($tpl_item_comments,array(
- '$item_link' => $a->get_baseurl(true).'/display/'.$a->user['nickname']."/".$it['parent'],
- '$item_image' => $it['author-avatar'],
- '$item_text' => sprintf( t("%s commented on %s's post"), $it['author-name'], $it['pname']),
- '$item_when' => relative_date($it['created'])
- ));
- }
- }
-
- } else {
- $notif_content = t('No more home notifications.');
- }
-
- $o .= replace_macros($notif_tpl,array(
- '$notif_header' => t('Home Notifications'),
- '$tabs' => $tabs,
- '$notif_content' => $notif_content,
- ));
- }
-
- $o .= paginate($a);
return $o;
}
diff --git a/mod/oembed.php b/mod/oembed.php
index 720a6d72b..adda63cf2 100644
--- a/mod/oembed.php
+++ b/mod/oembed.php
@@ -19,7 +19,7 @@ function oembed_init(&$a){
else {
echo "<html><body>";
- $url = base64url_decode($argv(1));
+ $url = base64url_decode(argv(1));
$j = oembed_fetch_url($url);
echo $j->html;
// logger('mod-oembed ' . $j->html, LOGGER_ALL);
diff --git a/mod/oexchange.php b/mod/oexchange.php
index 791a493ff..27c8b388d 100644
--- a/mod/oexchange.php
+++ b/mod/oexchange.php
@@ -15,6 +15,21 @@ function oexchange_init(&$a) {
function oexchange_content(&$a) {
if(! local_user()) {
+ if(remote_user()) {
+ $observer = $a->get_observer();
+ if($observer && $observer['xchan_url']) {
+ $parsed = @parse_url($observer['xchan_url']);
+ if(! $parsed) {
+ notice( t('Unable to find your hub.') . EOL);
+ return;
+ }
+ $url = $parsed['scheme'] . '://' . $parsed['host'] . (($parsed['port']) ? ':' . $parsed['port'] : '');
+ $url .= '/oexchange';
+ $result = z_post_url($url,$_REQUEST);
+ json_return_and_die($result);
+ }
+ }
+
return login(false);
}
@@ -32,18 +47,19 @@ function oexchange_content(&$a) {
$tags = (((x($_REQUEST,'tags')) && strlen($_REQUEST['tags']))
? '&tags=' . urlencode(notags(trim($_REQUEST['tags']))) : '');
- $s = fetch_url($a->get_baseurl() . '/parse_url?f=&url=' . $url . $title . $description . $tags);
+ $ret = z_fetch_url($a->get_baseurl() . '/parse_url?f=&url=' . $url . $title . $description . $tags);
+
+ if($ret['success'])
+ $s = $ret['body'];
if(! strlen($s))
return;
- require_once('include/html2bbcode.php');
-
$post = array();
$post['profile_uid'] = local_user();
$post['return'] = '/oexchange/done' ;
- $post['body'] = html2bbcode($s);
+ $post['body'] = $s;
$post['type'] = 'wall';
$_REQUEST = $post;
diff --git a/mod/page.php b/mod/page.php
index 62f9d9204..56592116f 100644
--- a/mod/page.php
+++ b/mod/page.php
@@ -2,9 +2,35 @@
require_once('include/items.php');
require_once('include/conversation.php');
+require_once('include/page_widgets.php');
+
+function page_init(&$a) {
+ // We need this to make sure the channel theme is always loaded.
+
+ $which = argv(1);
+ $profile = 0;
+ profile_load($a,$which,$profile);
+
+ if($a->profile['profile_uid'])
+ head_set_icon($a->profile['thumb']);
+
+}
+
+
+
function page_content(&$a) {
+ $observer = $a->get_observer();
+ $ob_hash = (($observer) ? $observer['xchan_hash'] : '');
+
+ $perms = get_all_perms($a->profile['profile_uid'],$ob_hash);
+
+ if(! $perms['view_pages']) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
if(argc() < 3) {
notice( t('Invalid item.') . EOL);
return;
@@ -12,7 +38,7 @@ function page_content(&$a) {
$channel_address = argv(1);
$page_id = argv(2);
-
+dbg(1);
$u = q("select channel_id from channel where channel_address = '%s' limit 1",
dbesc($channel_address)
);
@@ -22,23 +48,71 @@ function page_content(&$a) {
return;
}
+ if($_REQUEST['rev'])
+ $revision = " and revision = " . intval($_REQUEST['rev']) . " ";
+ else
+ $revision = " order by revision desc ";
+
+ require_once('include/security.php');
+ $sql_options = item_permissions_sql($u[0]['channel_id']);
+
$r = q("select item.* from item left join item_id on item.id = item_id.iid
where item.uid = %d and sid = '%s' and service = 'WEBPAGE' and
- item_restrict = %d limit 1",
+ item_restrict = %d $sql_options $revision limit 1",
intval($u[0]['channel_id']),
dbesc($page_id),
intval(ITEM_WEBPAGE)
);
-
+dbg(0);
if(! $r) {
- notice( t('Item not found.') . EOL);
+
+ // Check again with no permissions clause to see if it is a permissions issue
+
+ $x = q("select item.* from item left join item_id on item.id = item_id.iid
+ where item.uid = %d and sid = '%s' and service = 'WEBPAGE' and
+ item_restrict = %d $revision limit 1",
+ intval($u[0]['channel_id']),
+ dbesc($page_id),
+ intval(ITEM_WEBPAGE)
+ );
+ if($x) {
+ // Yes, it's there. You just aren't allowed to see it.
+ notice( t('Permission denied.') . EOL);
+ }
+ else {
+ notice( t('Page not found.') . EOL);
+ }
return;
}
+ if($r[0]['layout_mid']) {
+ $l = q("select body from item where mid = '%s' and uid = %d limit 1",
+ dbesc($r[0]['layout_mid']),
+ intval($u[0]['channel_id'])
+ );
+
+ if($l) {
+ require_once('include/comanche.php');
+ comanche_parser(get_app(),$l[0]['body']);
+ }
+ }
+
+
+ // logger('layout: ' . print_r($a->layout,true));
+
+ // Use of widgets should be determined by Comanche, but we don't have it on system pages yet, so...
+
+ if ($perms['write_pages']) {
+ $chan = $a->channel['channel_id'];
+ $who = $channel_address;
+ $which = $r[0]['id'];
+ $o .= writepages_widget($who,$which);
+ }
+
xchan_query($r);
$r = fetch_post_tags($r,true);
- $a->profile = array('profile_uid' => $u[0]['channel_id']);
+
$o .= prepare_page($r[0]);
return $o;
-} \ No newline at end of file
+}
diff --git a/mod/parse_url.php b/mod/parse_url.php
index 600d3dc8b..c206c24ec 100644
--- a/mod/parse_url.php
+++ b/mod/parse_url.php
@@ -55,34 +55,18 @@ function completeurl($url, $scheme) {
function parseurl_getsiteinfo($url) {
$siteinfo = array();
- $ch = curl_init();
- curl_setopt($ch, CURLOPT_URL, $url);
- curl_setopt($ch, CURLOPT_HEADER, 1);
- curl_setopt($ch, CURLOPT_NOBODY, 0);
- curl_setopt($ch, CURLOPT_TIMEOUT, 3);
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
- curl_setopt($ch,CURLOPT_USERAGENT,'Opera/9.64(Windows NT 5.1; U; de) Presto/2.1.1');
-
- $header = curl_exec($ch);
- curl_close($ch);
-
- // Fetch the first mentioned charset. Can be in body or header
- if (preg_match('/charset=(.*?)['."'".'"\s\n]/', $header, $matches))
- $charset = trim(array_pop($matches));
- else
- $charset = "utf-8";
- $pos = strpos($header, "\r\n\r\n");
+ $result = z_fetch_url($url,false,0,array('novalidate' => true));
+ if(! $result['success'])
+ return $siteinfo;
- if ($pos)
- $body = trim(substr($header, $pos));
- else
- $body = $header;
+ $header = $result['header'];
+ $body = $result['body'];
- $body = mb_convert_encoding($body, "UTF-8", $charset);
- $body = mb_convert_encoding($body, 'HTML-ENTITIES', "UTF-8");
+ $body = mb_convert_encoding($body, 'UTF-8', 'UTF-8');
+ $body = mb_convert_encoding($body, 'HTML-ENTITIES', "UTF-8");
- $doc = new DOMDocument();
+ $doc = new DOMDocument();
@$doc->loadHTML($body);
deletenode($doc, 'style');
@@ -115,6 +99,9 @@ function parseurl_getsiteinfo($url) {
$attr["content"] = html_entity_decode($attr["content"], ENT_QUOTES, "UTF-8");
switch (strtolower($attr["name"])) {
+ case 'generator':
+ $siteinfo['generator'] = $attr['content'];
+ break;
case "fulltitle":
$siteinfo["title"] = $attr["content"];
break;
@@ -245,6 +232,10 @@ function parse_url_content(&$a) {
else
$url = trim($_GET['url']);
+ if((substr($url,0,1) != '/') && (substr($url,0,4) != 'http'))
+ $url = 'http://' . $url;
+
+
if($_GET['title'])
$title = strip_tags(trim($_GET['title']));
@@ -290,6 +281,11 @@ function parse_url_content(&$a) {
$siteinfo = parseurl_getsiteinfo($url);
+ // If this is a Red site, use zrl rather than url so they get zids sent to them by default
+
+ if( x($siteinfo,'generator') && (strpos($siteinfo['generator'],RED_PLATFORM . ' ') === 0))
+ $template = str_replace('url','zrl',$template);
+
if($siteinfo["title"] == "") {
echo sprintf($template,$url,$url,'') . $str_tags;
killme();
diff --git a/mod/photo.php b/mod/photo.php
index aff4dc895..1319f9569 100644
--- a/mod/photo.php
+++ b/mod/photo.php
@@ -1,7 +1,7 @@
<?php
require_once('include/security.php');
-require_once('include/Photo.php');
+require_once('include/photo/photo_driver.php');
function photo_init(&$a) {
@@ -22,9 +22,17 @@ function photo_init(&$a) {
// NOTREACHED
}
+ if($photo === 'qr') {
+ $t = $_GET['qr'];
+ require_once('library/phpqrcode/phpqrcode.php');
+ header("Content-type: image/png");
+ QRcode::png(($t) ? $t : '.');
+ killme();
+ }
+
$observer_xchan = get_observer_hash();
- $default = 'images/person-175.jpg';
+ $default = get_default_profile_photo();
if(isset($type)) {
@@ -38,11 +46,11 @@ function photo_init(&$a) {
case 'm':
$resolution = 5;
- $default = 'images/person-80.jpg';
+ $default = get_default_profile_photo(80);
break;
case 's':
$resolution = 6;
- $default = 'images/person-48.jpg';
+ $default = get_default_profile_photo(48);
break;
case 'l':
default:
@@ -112,14 +120,18 @@ function photo_init(&$a) {
// There won't be many completely unauthorised people seeing this because
// they won't have the photo link, so there's a reasonable chance that the person
// might be able to obtain permission to view it.
-
+
$r = q("SELECT * FROM `photo` WHERE `resource_id` = '%s' AND `scale` = %d LIMIT 1",
dbesc($photo),
intval($resolution)
);
+
if($r) {
- $data = file_get_contents('images/nosign.jpg');
- $mimetype = 'image/jpeg';
+ logger('mod_photo: forbidden. ' . $a->query_string);
+ $observer = $a->get_observer();
+ logger('mod_photo: observer = ' . (($observer) ? $observer['xchan_addr'] : '(not authenticated)'));
+ $data = file_get_contents('images/nosign.png');
+ $mimetype = 'image/png';
$prvcachecontrol = true;
}
}
@@ -131,15 +143,15 @@ function photo_init(&$a) {
switch($resolution) {
case 4:
- $data = file_get_contents('images/person-175.jpg');
+ $data = file_get_contents(get_default_profile_photo());
$mimetype = 'image/jpeg';
break;
case 5:
- $data = file_get_contents('images/person-80.jpg');
+ $data = file_get_contents(get_default_profile_photo(80));
$mimetype = 'image/jpeg';
break;
case 6:
- $data = file_get_contents('images/person-48.jpg');
+ $data = file_get_contents(get_default_profile_photo(48));
$mimetype = 'image/jpeg';
break;
default:
@@ -151,7 +163,7 @@ function photo_init(&$a) {
}
if(isset($res) && intval($res) && $res < 500) {
- $ph = new Photo($data, $mimetype);
+ $ph = photo_factory($data, $mimetype);
if($ph->is_valid()) {
$ph->scaleImageSquare($res);
$data = $ph->imageString();
diff --git a/mod/photos.php b/mod/photos.php
index 90b2990aa..8099c71e6 100644
--- a/mod/photos.php
+++ b/mod/photos.php
@@ -1,5 +1,5 @@
<?php
-require_once('include/Photo.php');
+require_once('include/photo/photo_driver.php');
require_once('include/photos.php');
require_once('include/items.php');
require_once('include/acl_selectors.php');
@@ -19,6 +19,9 @@ function photos_init(&$a) {
if(argc() > 1) {
$nick = argv(1);
+
+ profile_load($a,$nick);
+
$channelx = channelx_by_nick($nick);
if(! $channelx)
@@ -31,18 +34,9 @@ function photos_init(&$a) {
$observer_xchan = (($observer) ? $observer['xchan_hash'] : '');
- $a->data['perms'] = get_all_perms($channelx[0]['channel_id'],$observer_xchan);
-
+ head_set_icon($a->data['channel']['xchan_photo_s']);
-
- $a->set_widget('vcard',vcard_from_xchan($a->data['channel'],$observer));
-
- if($a->data['perms']['view_photos']) {
- $a->data['albums'] = photos_albums_list($a->data['channel'],$observer);
- $a->set_widget('photo_albums',photos_album_widget($a->data['channel'],$observer,$a->data['albums']));
- }
-
- $a->page['htmlhead'] .= "<script> var ispublic = '" . t('everybody') . "';</script>" ;
+ $a->page['htmlhead'] .= "<script> var ispublic = '" . t('everybody') . "'; var profile_uid = " . (($a->data['channel']) ? $a->data['channel']['channel_id'] : 0) . "; </script>" ;
}
@@ -59,7 +53,9 @@ function photos_post(&$a) {
logger('mod_photos: REQUEST ' . print_r($_REQUEST,true), LOGGER_DATA);
logger('mod_photos: FILES ' . print_r($_FILES,true), LOGGER_DATA);
- $phototypes = Photo::supportedTypes();
+ $ph = photo_factory('');
+
+ $phototypes = $ph->supportedTypes();
$can_post = false;
@@ -161,36 +157,34 @@ function photos_post(&$a) {
}
if((argc() > 2) && (x($_REQUEST,'delete')) && ($_REQUEST['delete'] === t('Delete Photo'))) {
-// FIXME
+
// same as above but remove single photo
- if($visitor) {
- $r = q("SELECT `id`, `resource_id` FROM `photo` WHERE `contact-id` = %d AND `uid` = %d AND `resource_id` = '%s' LIMIT 1",
- intval($visitor),
- intval($page_owner_uid),
- dbesc($a->argv[2])
- );
- }
- else {
- $r = q("SELECT `id`, `resource_id` FROM `photo` WHERE `uid` = %d AND `resource_id` = '%s' LIMIT 1",
- intval(local_user()),
- dbesc($a->argv[2])
- );
- }
- if(count($r)) {
+ $ob_hash = get_observer_hash();
+ if(! $ob_hash)
+ goaway($a->get_baseurl() . '/' . $_SESSION['photo_return']);
+
+ $r = q("SELECT `id`, `resource_id` FROM `photo` WHERE ( xchan = '%s' or `uid` = %d ) AND `resource_id` = '%s' LIMIT 1",
+ dbesc($ob_hash),
+ intval(local_user()),
+ dbesc($a->argv[2])
+ );
+
+ if($r) {
q("DELETE FROM `photo` WHERE `uid` = %d AND `resource_id` = '%s'",
intval($page_owner_uid),
dbesc($r[0]['resource_id'])
);
- $i = q("SELECT * FROM `item` WHERE `resource_id` = '%s' AND `uid` = %d LIMIT 1",
+ $i = q("SELECT * FROM `item` WHERE `resource_id` = '%s' AND resource_type = 'photo' and `uid` = %d LIMIT 1",
dbesc($r[0]['resource_id']),
intval($page_owner_uid)
);
if(count($i)) {
- q("UPDATE `item` SET `deleted` = 1, `edited` = '%s', `changed` = '%s' WHERE `parent_uri` = '%s' AND `uid` = %d",
+ q("UPDATE `item` SET item_restrict = (item_restrict | %d), `edited` = '%s', `changed` = '%s' WHERE `parent_mid` = '%s' AND `uid` = %d",
+ intval(ITEM_DELETED),
dbesc(datetime_convert()),
dbesc(datetime_convert()),
- dbesc($i[0]['uri']),
+ dbesc($i[0]['mid']),
intval($page_owner_uid)
);
@@ -203,7 +197,6 @@ function photos_post(&$a) {
}
goaway($a->get_baseurl() . '/' . $_SESSION['photo_return']);
- return; // NOTREACHED
}
if(($a->argc > 2) && ((x($_POST,'desc') !== false) || (x($_POST,'newtag') !== false)) || (x($_POST,'albname') !== false)) {
@@ -233,7 +226,7 @@ function photos_post(&$a) {
intval($page_owner_uid)
);
if(count($r)) {
- $ph = new Photo($r[0]['data'], $r[0]['type']);
+ $ph = photo_factory($r[0]['data'], $r[0]['type']);
if($ph->is_valid()) {
$rotate_deg = ( (intval($_POST['rotate']) == 1) ? 270 : 90 );
$ph->rotate($rotate_deg);
@@ -280,13 +273,15 @@ function photos_post(&$a) {
}
}
- $p = q("SELECT * FROM `photo` WHERE `resource_id` = '%s' AND `uid` = %d ORDER BY `scale` DESC",
+ $p = q("SELECT * FROM `photo` WHERE `resource_id` = '%s' AND `uid` = %d and ( photo_flags = %d or photo_flags = %d ) ORDER BY `scale` DESC",
dbesc($resource_id),
- intval($page_owner_uid)
+ intval($page_owner_uid),
+ intval(PHOTO_NORMAL),
+ intval(PHOTO_PROFILE)
);
if(count($p)) {
$ext = $phototypes[$p[0]['type']];
- $r = q("UPDATE `photo` SET `desc` = '%s', `album` = '%s', `allow_cid` = '%s', `allow_gid` = '%s', `deny_cid` = '%s', `deny_gid` = '%s' WHERE `resource_id` = '%s' AND `uid` = %d",
+ $r = q("UPDATE `photo` SET `description` = '%s', `album` = '%s', `allow_cid` = '%s', `allow_gid` = '%s', `deny_cid` = '%s', `deny_gid` = '%s' WHERE `resource_id` = '%s' AND `uid` = %d",
dbesc($desc),
dbesc($albname),
dbesc($str_contact_allow),
@@ -298,10 +293,13 @@ function photos_post(&$a) {
);
}
+ $item_private = (($str_contact_allow || $str_group_allow || $str_contact_deny || $str_group_deny) ? true : false);
+
+
/* Don't make the item visible if the only change was the album name */
$visibility = 0;
- if($p[0]['desc'] !== $desc || strlen($rawtags))
+ if($p[0]['description'] !== $desc || strlen($rawtags))
$visibility = 1;
if(! $item_id) {
@@ -315,11 +313,23 @@ function photos_post(&$a) {
intval($page_owner_uid)
);
}
- if(count($r)) {
+ if($r) {
$old_tag = $r[0]['tag'];
$old_inform = $r[0]['inform'];
}
+ // make sure the linked item has the same permissions as the photo regardless of any other changes
+ $x = q("update item set allow_cid = '%s', allow_gid = '%s', deny_cid = '%s', deny_gid = '%s', item_private = %d
+ where id = %d limit 1",
+ dbesc($str_contact_allow),
+ dbesc($str_group_allow),
+ dbesc($str_contact_deny),
+ dbesc($str_group_deny),
+ intval($item_private),
+ intval($item_id)
+ );
+
+
if(strlen($rawtags)) {
$str_tags = '';
@@ -413,13 +423,13 @@ function photos_post(&$a) {
}
if($profile) {
if(substr($notify,0,4) === 'cid:')
- $taginfo[] = array($newname,$profile,$notify,$r[0],'@[url=' . str_replace(',','%2c',$profile) . ']' . $newname . '[/url]');
+ $taginfo[] = array($newname,$profile,$notify,$r[0],'@[zrl=' . str_replace(',','%2c',$profile) . ']' . $newname . '[/zrl]');
else
$taginfo[] = array($newname,$profile,$notify,null,$str_tags .= '@[url=' . $profile . ']' . $newname . '[/url]');
if(strlen($str_tags))
$str_tags .= ',';
$profile = str_replace(',','%2c',$profile);
- $str_tags .= '@[url=' . $profile . ']' . $newname . '[/url]';
+ $str_tags .= '@[zrl=' . $profile . ']' . $newname . '[/zrl]';
}
}
}
@@ -434,15 +444,15 @@ function photos_post(&$a) {
if(strlen($newinform) && strlen($inform))
$newinform .= ',';
$newinform .= $inform;
-
- $r = q("UPDATE `item` SET `tag` = '%s', `inform` = '%s', `edited` = '%s', `changed` = '%s' WHERE `id` = %d AND `uid` = %d LIMIT 1",
- dbesc($newtag),
- dbesc($newinform),
- dbesc(datetime_convert()),
- dbesc(datetime_convert()),
- intval($item_id),
- intval($page_owner_uid)
- );
+//FIXME - inform is gone
+// $r = q("UPDATE `item` SET `tag` = '%s', `inform` = '%s', `edited` = '%s', `changed` = '%s' WHERE `id` = %d AND `uid` = %d LIMIT 1",
+// dbesc($newtag),
+// dbesc($newinform),
+// dbesc(datetime_convert()),
+// dbesc(datetime_convert()),
+// intval($item_id),
+// intval($page_owner_uid)
+// );
$best = 0;
foreach($p as $scales) {
@@ -459,13 +469,13 @@ function photos_post(&$a) {
if(count($taginfo)) {
foreach($taginfo as $tagged) {
- $uri = item_message_id();
+ $mid = item_message_id();
$arr = array();
-
+//FIXME
$arr['uid'] = $page_owner_uid;
- $arr['uri'] = $uri;
- $arr['parent_uri'] = $uri;
+ $arr['mid'] = $mid;
+ $arr['parent_mid'] = $mid;
$arr['type'] = 'activity';
$arr['wall'] = 1;
$arr['contact-id'] = $owner_record['id'];
@@ -487,9 +497,9 @@ function photos_post(&$a) {
$arr['tag'] = $tagged[4];
$arr['inform'] = $tagged[2];
$arr['origin'] = 1;
- $arr['body'] = sprintf( t('%1$s was tagged in %2$s by %3$s'), '[url=' . $tagged[1] . ']' . $tagged[0] . '[/url]', '[url=' . $a->get_baseurl() . '/photos/' . $owner_record['nickname'] . '/image/' . $p[0]['resource-id'] . ']' . t('a photo') . '[/url]', '[url=' . $owner_record['url'] . ']' . $owner_record['name'] . '[/url]') ;
+ $arr['body'] = sprintf( t('%1$s was tagged in %2$s by %3$s'), '[zrl=' . $tagged[1] . ']' . $tagged[0] . '[/zrl]', '[zrl=' . $a->get_baseurl() . '/photos/' . $owner_record['nickname'] . '/image/' . $p[0]['resource-id'] . ']' . t('a photo') . '[/zrl]', '[zrl=' . $owner_record['url'] . ']' . $owner_record['name'] . '[/zrl]') ;
- $arr['body'] .= "\n\n" . '[url=' . $a->get_baseurl() . '/photos/' . $owner_record['nickname'] . '/image/' . $p[0]['resource_id'] . ']' . '[img]' . $a->get_baseurl() . "/photo/" . $p[0]['resource_id'] . '-' . $best . '.' . $ext . '[/img][/url]' . "\n" ;
+ $arr['body'] .= "\n\n" . '[zrl=' . $a->get_baseurl() . '/photos/' . $owner_record['nickname'] . '/image/' . $p[0]['resource_id'] . ']' . '[zmg]' . $a->get_baseurl() . "/photo/" . $p[0]['resource_id'] . '-' . $best . '.' . $ext . '[/zmg][/zrl]' . "\n" ;
$arr['object'] = '<object><type>' . ACTIVITY_OBJ_PERSON . '</type><title>' . $tagged[0] . '</title><id>' . $tagged[1] . '/' . $tagged[0] . '</id>';
$arr['object'] .= '<link>' . xmlify('<link rel="alternate" type="text/html" href="' . $tagged[1] . '" />' . "\n");
@@ -497,11 +507,20 @@ function photos_post(&$a) {
$arr['object'] .= xmlify('<link rel="photo" type="'.$p[0]['type'].'" href="' . $tagged[3]['photo'] . '" />' . "\n");
$arr['object'] .= '</link></object>' . "\n";
- $arr['target'] = '<target><type>' . ACTIVITY_OBJ_PHOTO . '</type><title>' . $p[0]['desc'] . '</title><id>'
+ $arr['target'] = '<target><type>' . ACTIVITY_OBJ_PHOTO . '</type><title>' . $p[0]['description'] . '</title><id>'
. $a->get_baseurl() . '/photos/' . $owner_record['nickname'] . '/image/' . $p[0]['resource_id'] . '</id>';
$arr['target'] .= '<link>' . xmlify('<link rel="alternate" type="text/html" href="' . $a->get_baseurl() . '/photos/' . $owner_record['nickname'] . '/image/' . $p[0]['resource_id'] . '" />' . "\n" . '<link rel="preview" type="'.$p[0]['type'].'" href="' . $a->get_baseurl() . "/photo/" . $p[0]['resource_id'] . '-' . $best . '.' . $ext . '" />') . '</link></target>';
- $item_id = item_store($arr);
+ if ((! $arr['plink']) && ($arr['item_flags'] & ITEM_THREAD_TOP)) {
+ $arr['plink'] = z_root() . '/channel/' . $owner_record['channel_address'] . '/?f=&mid=' . $arr['mid'];
+ }
+
+
+
+
+ $post = item_store($arr);
+ $item_id = $post['item_id'];
+
if($item_id) {
q("UPDATE `item` SET `plink` = '%s' WHERE `uid` = %d AND `id` = %d LIMIT 1",
dbesc($a->get_baseurl() . '/display/' . $owner_record['nickname'] . '/' . $item_id),
@@ -565,7 +584,8 @@ function photos_content(&$a) {
return;
}
- $phototypes = Photo::supportedTypes();
+ $ph = photo_factory('');
+ $phototypes = $ph->supportedTypes();
$_SESSION['photo_return'] = $a->cmd;
@@ -573,6 +593,8 @@ function photos_content(&$a) {
// Parse arguments
//
+ $can_comment = perm_is_allowed($a->profile['profile_uid'],get_observer_hash(),'post_comments');
+
if(argc() > 3) {
$datatype = argv(2);
$datum = argv(3);
@@ -593,85 +615,28 @@ function photos_content(&$a) {
$can_post = false;
$visitor = 0;
- $contact = null;
- $remote_contact = false;
- $contact_id = 0;
+
$owner_uid = $a->data['channel']['channel_id'];
$owner_aid = $a->data['channel']['channel_account_id'];
- $community_page = (($a->data['user']['page-flags'] == PAGE_COMMUNITY) ? true : false);
+ $observer = $a->get_observer();
- if((local_user()) && (local_user() == $owner_uid))
- $can_post = true;
- else {
- if($community_page && remote_user()) {
- if(is_array($_SESSION['remote'])) {
- foreach($_SESSION['remote'] as $v) {
- if($v['uid'] == $owner_uid) {
- $contact_id = $v['cid'];
- break;
- }
- }
- }
- if($contact_id) {
-
- $r = q("SELECT `uid` FROM `contact` WHERE `blocked` = 0 AND `pending` = 0 AND `id` = %d AND `uid` = %d LIMIT 1",
- intval($contact_id),
- intval($owner_uid)
- );
- if(count($r)) {
- $can_post = true;
- $contact = $r[0];
- $remote_contact = true;
- $visitor = $cid;
- }
- }
- }
- }
-
- // perhaps they're visiting - but not a community page, so they wouldn't have write access
-
- if(remote_user() && (! $visitor)) {
- $contact_id = 0;
- if(is_array($_SESSION['remote'])) {
- foreach($_SESSION['remote'] as $v) {
- if($v['uid'] == $owner_uid) {
- $contact_id = $v['cid'];
- break;
- }
- }
- }
- if($contact_id) {
- $groups = init_groups_visitor($contact_id);
- $r = q("SELECT * FROM `contact` WHERE `blocked` = 0 AND `pending` = 0 AND `id` = %d AND `uid` = %d LIMIT 1",
- intval($contact_id),
- intval($owner_uid)
- );
- if(count($r)) {
- $contact = $r[0];
- $remote_contact = true;
- }
- }
- }
+ $can_post = perm_is_allowed($owner_uid,$observer['xchan_hash'],'post_photos');
+ $can_view = perm_is_allowed($owner_uid,$observer['xchan_hash'],'view_photos');
- if(! $remote_contact) {
- if(local_user()) {
- $contact_id = $_SESSION['cid'];
- $contact = $a->contact;
- }
- }
- if($a->data['user']['hidewall'] && (local_user() != $owner_uid) && (! $remote_contact)) {
+ if(! $can_view) {
notice( t('Access to this item is restricted.') . EOL);
return;
}
- $sql_extra = permissions_sql($owner_uid,$remote_contact,$groups);
+ $sql_extra = permissions_sql($owner_uid);
$o = "";
// tabs
+
$_is_owner = (local_user() && (local_user() == $owner_uid));
$o .= profile_tabs($a,$_is_owner, $a->data['channel']['channel_address']);
@@ -679,6 +644,9 @@ function photos_content(&$a) {
// dispatch request
//
+ /**
+ * Display upload form
+ */
if($datatype === 'upload') {
if(! ($can_post)) {
@@ -687,19 +655,24 @@ function photos_content(&$a) {
}
- $selname = (($datum) ? hex2bin($datum) : '');
+
+ if(array_key_exists('albums', $a->data))
+ $albums = get_app()->data['albums'];
+ else
+ $albums = photos_albums_list($a->data['channel'],$a->data['observer']);
- $albumselect = '<select id="photos-upload-album-select" name="album" size="4">';
+ $selname = (($datum) ? hex2bin($datum) : '');
+ $albumselect = '<select id="photos-upload-album-select" name="album" size="4">';
$albumselect .= '<option value="" ' . ((! $selname) ? ' selected="selected" ' : '') . '>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</option>';
- if(count($a->data['albums'])) {
- foreach($a->data['albums'] as $album) {
- if(($album['album'] === '') || ($album['album'] === 'Contact Photos') || ($album['album'] === t('Contact Photos')))
+ if(count($albums)) {
+ foreach($albums as $album) {
+ if($album['text'] === '')
continue;
- $selected = (($selname === $album['album']) ? ' selected="selected" ' : '');
- $albumselect .= '<option value="' . $album['album'] . '"' . $selected . '>' . $album['album'] . '</option>';
+ $selected = (($selname === $album['text']) ? ' selected="selected" ' : '');
+ $albumselect .= '<option value="' . $album['text'] . '"' . $selected . '>' . $album['text'] . '</option>';
}
}
@@ -719,9 +692,10 @@ function photos_content(&$a) {
$default_upload = '<input id="photos-upload-choose" type="file" name="userfile" /> <div class="photos-upload-submit-wrapper" >
<input type="submit" name="submit" value="' . t('Submit') . '" id="photos-upload-submit" /> </div>';
+ /* Show space usage */
- $r = q("select sum(size) as total from photo where uid = %d and scale = 0 ",
- intval($a->data['channel']['channel_id'])
+ $r = q("select sum(size) as total from photo where aid = %d and scale = 0 ",
+ intval($a->data['channel']['channel_account_id'])
);
@@ -733,15 +707,19 @@ function photos_content(&$a) {
$usage_message = sprintf( t('You have used %1$.2f Mbytes of photo storage.'), $r[0]['total'] / 1024000 );
}
+ if($_is_owner) {
+ $channel = $a->get_channel();
- if($a->get_template_engine() === 'internal') {
- $albumselect_e = template_escape($albumselect);
- $aclselect_e = (($visitor) ? '' : template_escape(populate_acl($a->user, $celeb)));
- }
- else {
- $albumselect_e = $albumselect;
- $aclselect_e = (($visitor) ? '' : populate_acl($a->user, $celeb));
- }
+ $channel_acl = array(
+ 'allow_cid' => $channel['channel_allow_cid'],
+ 'allow_gid' => $channel['channel_allow_gid'],
+ 'deny_cid' => $channel['channel_deny_cid'],
+ 'deny_gid' => $channel['channel_deny_gid']
+ );
+ }
+
+ $albumselect_e = $albumselect;
+ $aclselect_e = (($_is_owner) ? populate_acl($channel_acl) : '');
$tpl = get_markup_template('photos_upload.tpl');
$o .= replace_macros($tpl,array(
@@ -764,18 +742,24 @@ function photos_content(&$a) {
return $o;
}
+ /*
+ * Display a single photo album
+ */
+
if($datatype === 'album') {
$album = hex2bin($datum);
$r = q("SELECT `resource_id`, max(`scale`) AS `scale` FROM `photo` WHERE `uid` = %d AND `album` = '%s'
- AND `scale` <= 4 $sql_extra GROUP BY `resource_id`",
+ AND `scale` <= 4 and (photo_flags = %d or photo_flags = %d ) $sql_extra GROUP BY `resource_id`",
intval($owner_uid),
- dbesc($album)
+ dbesc($album),
+ intval(PHOTO_NORMAL),
+ intval(PHOTO_PROFILE)
);
if(count($r)) {
$a->set_pager_total(count($r));
- $a->set_pager_itemspage(20);
+ $a->set_pager_itemspage(40);
}
if($_GET['order'] === 'posted')
@@ -783,10 +767,12 @@ function photos_content(&$a) {
else
$order = 'DESC';
- $r = q("SELECT `resource_id`, `id`, `filename`, type, max(`scale`) AS `scale`, `desc` FROM `photo` WHERE `uid` = %d AND `album` = '%s'
- AND `scale` <= 4 $sql_extra GROUP BY `resource_id` ORDER BY `created` $order LIMIT %d , %d",
+ $r = q("SELECT `resource_id`, `id`, `filename`, type, max(`scale`) AS `scale`, `description` FROM `photo` WHERE `uid` = %d AND `album` = '%s'
+ AND `scale` <= 4 and (photo_flags = %d or photo_flags = %d ) $sql_extra GROUP BY `resource_id` ORDER BY `created` $order LIMIT %d , %d",
intval($owner_uid),
dbesc($album),
+ intvaL(PHOTO_NORMAL),
+ intval(PHOTO_PROFILE),
intval($a->pager['start']),
intval($a->pager['itemspage'])
);
@@ -835,11 +821,11 @@ function photos_content(&$a) {
$o .= '<div class="photos-upload-link" ><a href="' . $a->get_baseurl() . '/photos/' . $a->data['channel']['channel_address'] . '/upload/' . bin2hex($album) . '" >' . t('Upload New Photos') . '</a></div>';
}
-
$tpl = get_markup_template('photo_album.tpl');
if(count($r))
$twist = 'rotright';
foreach($r as $rr) {
+
if($twist == 'rotright')
$twist = 'rotleft';
else
@@ -847,24 +833,36 @@ function photos_content(&$a) {
$ext = $phototypes[$rr['type']];
- if($a->get_template_engine() === 'internal') {
- $imgalt_e = template_escape($rr['filename']);
- $desc_e = template_escape($rr['desc']);
- }
- else {
- $imgalt_e = $rr['filename'];
- $desc_e = $rr['desc'];
- }
-
+ $imgalt_e = $rr['filename'];
+ $desc_e = $rr['description'];
+
+
+// prettyphoto has potential license issues, so we can no longer include it in core
+// The following lines would need to be modified so that they are provided in theme specific files
+// instead of core modules for themes that wish to make use of prettyphoto. I would suggest
+// the feature as a per-theme display option and putting the rel line inside a template.
+
+// if(feature_enabled($a->data['channel']['channel_id'],'prettyphoto')){
+// $imagelink = ($a->get_baseurl() . '/photo/' . $rr['resource_id'] . '.' . $ext );
+// $rel=("prettyPhoto[pp_gal]");
+// }
+// else {
+ $imagelink = ($a->get_baseurl() . '/photos/' . $a->data['channel']['channel_address'] . '/image/' . $rr['resource_id']
+ . (($_GET['order'] === 'posted') ? '?f=&order=posted' : ''));
+ $rel=("photo");
+// }
+
$o .= replace_macros($tpl,array(
'$id' => $rr['id'],
'$twist' => ' ' . $twist . rand(2,4),
- '$photolink' => $a->get_baseurl() . '/photos/' . $a->data['channel']['channel_address'] . '/image/' . $rr['resource_id']
- . (($_GET['order'] === 'posted') ? '?f=&order=posted' : ''),
+ '$photolink' => $imagelink,
+ '$rel' => $rel,
'$phototitle' => t('View Photo'),
'$imgsrc' => $a->get_baseurl() . '/photo/' . $rr['resource_id'] . '-' . $rr['scale'] . '.' .$ext,
'$imgalt' => $imgalt_e,
- '$desc'=> $desc_e
+ '$desc'=> $desc_e,
+ '$ext' => $ext,
+ '$hash'=> $rr['resource_id'],
));
}
@@ -875,28 +873,37 @@ function photos_content(&$a) {
}
+ /**
+ * Display one photo
+ */
if($datatype === 'image') {
-
-
- //$o = '';
// fetch image, item containing image, then comments
- $ph = q("SELECT * FROM `photo` WHERE `uid` = %d AND `resource_id` = '%s'
- $sql_extra ORDER BY `scale` ASC ",
+ $ph = q("SELECT aid,uid,xchan,resource_id,created,edited,title,`description`,album,filename,`type`,height,width,`size`,scale,profile,photo_flags,allow_cid,allow_gid,deny_cid,deny_gid FROM `photo` WHERE `uid` = %d AND `resource_id` = '%s'
+ and (photo_flags = %d or photo_flags = %d ) $sql_extra ORDER BY `scale` ASC ",
intval($owner_uid),
- dbesc($datum)
+ dbesc($datum),
+ intval(PHOTO_NORMAL),
+ intval(PHOTO_PROFILE)
+
);
- if(! count($ph)) {
+ if(! $ph) {
+
+ /* Check again - this time without specifying permissions */
+
$ph = q("SELECT `id` FROM `photo` WHERE `uid` = %d AND `resource_id` = '%s'
+ and ( photo_flags = %d or photo_flags = %d )
LIMIT 1",
intval($owner_uid),
- dbesc($datum)
+ dbesc($datum),
+ intval(PHOTO_NORMAL),
+ intval(PHOTO_PROFILE)
);
- if(count($ph))
- notice( t('Permission denied. Access to this item may be restricted.'));
+ if($ph)
+ notice( t('Permission denied. Access to this item may be restricted.') . EOL);
else
notice( t('Photo not available') . EOL );
return;
@@ -912,9 +919,11 @@ function photos_content(&$a) {
$prvnxt = q("SELECT `resource_id` FROM `photo` WHERE `album` = '%s' AND `uid` = %d AND `scale` = 0
- $sql_extra ORDER BY `created` $order ",
+ and ( photo_flags = %d or photo_flags = %d ) $sql_extra ORDER BY `created` $order ",
dbesc($ph[0]['album']),
- intval($owner_uid)
+ intval($owner_uid),
+ intval(PHOTO_NORMAL),
+ intval(PHOTO_PROFILE)
);
if(count($prvnxt)) {
@@ -929,9 +938,9 @@ function photos_content(&$a) {
break;
}
}
- $edit_suffix = ((($cmd === 'edit') && ($can_post)) ? '/edit' : '');
- $prevlink = $a->get_baseurl() . '/photos/' . $a->data['channel']['channel_address'] . '/image/' . $prvnxt[$prv]['resource_id'] . $edit_suffix . (($_GET['order'] === 'posted') ? '?f=&order=posted' : '');
- $nextlink = $a->get_baseurl() . '/photos/' . $a->data['channel']['channel_address'] . '/image/' . $prvnxt[$nxt]['resource_id'] . $edit_suffix . (($_GET['order'] === 'posted') ? '?f=&order=posted' : '');
+
+ $prevlink = $a->get_baseurl() . '/photos/' . $a->data['channel']['channel_address'] . '/image/' . $prvnxt[$prv]['resource_id'] . (($_GET['order'] === 'posted') ? '?f=&order=posted' : '');
+ $nextlink = $a->get_baseurl() . '/photos/' . $a->data['channel']['channel_address'] . '/image/' . $prvnxt[$nxt]['resource_id'] . (($_GET['order'] === 'posted') ? '?f=&order=posted' : '');
}
@@ -954,7 +963,6 @@ function photos_content(&$a) {
if($can_post && ($ph[0]['uid'] == $owner_uid)) {
$tools = array(
- 'edit' => array($a->get_baseurl() . '/photos/' . $a->data['channel']['channel_address'] . '/image/' . $datum . (($cmd === 'edit') ? '' : '/edit'), (($cmd === 'edit') ? t('View photo') : t('Edit photo'))),
'profile'=>array($a->get_baseurl() . '/profile_photo/use/'.$ph[0]['resource_id'], t('Use as profile photo')),
);
@@ -967,19 +975,15 @@ function photos_content(&$a) {
}
- if(! $cmd !== 'edit') {
- $a->page['htmlhead'] .= '<script>
- $(document).keydown(function(event) {' . "\n";
-
- if($prevlink)
- $a->page['htmlhead'] .= 'if(event.ctrlKey && event.keyCode == 37) { event.preventDefault(); window.location.href = \'' . $prevlink . '\'; }' . "\n";
- if($nextlink)
- $a->page['htmlhead'] .= 'if(event.ctrlKey && event.keyCode == 39) { event.preventDefault(); window.location.href = \'' . $nextlink . '\'; }' . "\n";
- $a->page['htmlhead'] .= '});</script>';
- }
+ $a->page['htmlhead'] .= '<script>$(document).keydown(function(event) {' . "\n";
+ if($prevlink)
+ $a->page['htmlhead'] .= 'if(event.ctrlKey && event.keyCode == 37) { event.preventDefault(); window.location.href = \'' . $prevlink . '\'; }' . "\n";
+ if($nextlink)
+ $a->page['htmlhead'] .= 'if(event.ctrlKey && event.keyCode == 39) { event.preventDefault(); window.location.href = \'' . $nextlink . '\'; }' . "\n";
+ $a->page['htmlhead'] .= '});</script>';
if($prevlink)
- $prevlink = array($prevlink, '<div class="icon prev"></div>') ;
+ $prevlink = array($prevlink, '<i class="icon-backward photo-icons""></i>') ;
$photo = array(
'href' => $a->get_baseurl() . '/photo/' . $hires['resource_id'] . '-' . $hires['scale'] . '.' . $phototypes[$hires['type']],
@@ -988,110 +992,74 @@ function photos_content(&$a) {
);
if($nextlink)
- $nextlink = array($nextlink, '<div class="icon next"></div>');
+ $nextlink = array($nextlink, '<i class="icon-forward photo-icons"></i>');
// Do we have an item for this photo?
- $linked_items = q("SELECT * FROM `item` WHERE `resource_id` = '%s' $sql_extra LIMIT 1",
+ $linked_items = q("SELECT * FROM item WHERE resource_id = '%s' and resource_type = 'photo'
+ $sql_extra LIMIT 1",
dbesc($datum)
);
- if(count($linked_items)) {
+
+ if($linked_items) {
+
$link_item = $linked_items[0];
- $r = q("SELECT COUNT(*) AS `total`
- FROM `item` LEFT JOIN `contact` ON `contact`.`id` = `item`.`contact-id`
- WHERE `parent_uri` = '%s' AND `uri` != '%s' AND `item`.`deleted` = 0 and `item`.`moderated` = 0
- AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0
- AND `item`.`uid` = %d
- $sql_extra ",
- dbesc($link_item['uri']),
- dbesc($link_item['uri']),
+
+ $r = q("select * from item where parent_mid = '%s'
+ and item_restrict = 0 and uid = %d $sql_extra ",
+ dbesc($link_item['mid']),
intval($link_item['uid'])
);
- if(count($r))
- $a->set_pager_total($r[0]['total']);
-
-
- $r = q("SELECT `item`.*, `item`.`id` AS `item_id`,
- `contact`.`name`, `contact`.`photo`, `contact`.`url`, `contact`.`network`,
- `contact`.`rel`, `contact`.`thumb`, `contact`.`self`,
- `contact`.`id` AS `cid`, `contact`.`uid` AS `contact-uid`
- FROM `item` LEFT JOIN `contact` ON `contact`.`id` = `item`.`contact-id`
- WHERE `parent_uri` = '%s' AND `uri` != '%s' AND `item`.`deleted` = 0 and `item`.`moderated` = 0
- AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0
- AND `item`.`uid` = %d
- $sql_extra
- ORDER BY `parent` DESC, `id` ASC LIMIT %d ,%d ",
- dbesc($link_item['uri']),
- dbesc($link_item['uri']),
- intval($link_item['uid']),
- intval($a->pager['start']),
- intval($a->pager['itemspage'])
+ if($r) {
+ xchan_query($r);
+ $r = fetch_post_tags($r,true);
+ $r = conv_sort($r,'commented');
+ }
- );
-
if((local_user()) && (local_user() == $link_item['uid'])) {
- q("UPDATE `item` SET `unseen` = 0 WHERE `parent` = %d and `uid` = %d",
+ q("UPDATE `item` SET item_flags = (item_flags ^ %d) WHERE parent = %d and uid = %d and (item_flags & %d)",
+ intval(ITEM_UNSEEN),
intval($link_item['parent']),
- intval(local_user())
+ intval(local_user()),
+ intval(ITEM_UNSEEN)
);
}
}
- $tags=Null;
-
- if(count($linked_items) && strlen($link_item['tag'])) {
- $arr = explode(',',$link_item['tag']);
- // parse tags and add links
- $tag_str = '';
- foreach($arr as $t) {
- if(strlen($tag_str))
- $tag_str .= ', ';
- $tag_str .= bbcode($t);
- }
- $tags = array(t('Tags: '), $tag_str);
- if($cmd === 'edit') {
- $tags[] = $a->get_baseurl() . '/tagrm/' . $link_item['id'];
- $tags[] = t('[Remove any tag]');
- }
- }
+ // FIXME - remove this when we move to conversation module
+ $r = $r[0]['children'];
- $edit = Null;
- if(($cmd === 'edit') && ($can_post)) {
- if($a->get_template_engine() === 'internal') {
- $album_e = template_escape($ph[0]['album']);
- $caption_e = template_escape($ph[0]['desc']);
- $aclselect_e = template_escape(populate_acl($ph[0]));
- }
- else {
- $album_e = $ph[0]['album'];
- $caption_e = $ph[0]['desc'];
- $aclselect_e = populate_acl($ph[0]);
- }
+ $edit = null;
+ if($can_post) {
- $edit_tpl = get_markup_template('photo_edit.tpl');
- $edit = replace_macros($edit_tpl, array(
- '$id' => $ph[0]['id'],
- '$rotatecw' => t('Rotate CW (right)'),
- '$rotateccw' => t('Rotate CCW (left)'),
- '$album' => $album_e,
- '$newalbum' => t('New album name'),
- '$nickname' => $a->data['channel']['channel_address'],
- '$resource_id' => $ph[0]['resource_id'],
- '$capt_label' => t('Caption'),
- '$caption' => $caption_e,
- '$tag_label' => t('Add a Tag'),
- '$tags' => $link_item['tag'],
- '$permissions' => t('Permissions'),
- '$aclselect' => $aclselect_e,
- '$help_tags' => t('Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping'),
- '$item_id' => ((count($linked_items)) ? $link_item['id'] : 0),
- '$submit' => t('Submit'),
- '$delete' => t('Delete Photo')
- ));
+ $album_e = $ph[0]['album'];
+ $caption_e = $ph[0]['description'];
+ $aclselect_e = populate_acl($ph[0]);
+
+ $edit = array(
+ 'edit' => t('Edit photo'),
+ 'id' => $ph[0]['id'],
+ 'rotatecw' => t('Rotate CW (right)'),
+ 'rotateccw' => t('Rotate CCW (left)'),
+ 'album' => $album_e,
+ 'newalbum' => t('New album name'),
+ 'nickname' => $a->data['channel']['channel_address'],
+ 'resource_id' => $ph[0]['resource_id'],
+ 'capt_label' => t('Caption'),
+ 'caption' => $caption_e,
+ 'tag_label' => t('Add a Tag'),
+ 'tags' => $link_item['tag'],
+ 'permissions' => t('Permissions'),
+ 'aclselect' => $aclselect_e,
+ 'help_tags' => t('Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping'),
+ 'item_id' => ((count($linked_items)) ? $link_item['id'] : 0),
+ 'submit' => t('Submit'),
+ 'delete' => t('Delete Photo')
+ );
}
if(count($linked_items)) {
@@ -1104,7 +1072,7 @@ function photos_content(&$a) {
$likebuttons = '';
- if($can_post || $a->data['perms']['post_comments']) {
+ if($can_post || $can_comment) {
$likebuttons = replace_macros($like_tpl,array(
'$id' => $link_item['id'],
'$likethis' => t("I like this \x28toggle\x29"),
@@ -1116,21 +1084,23 @@ function photos_content(&$a) {
$comments = '';
if(! count($r)) {
- if($can_post || $a->data['perms']['post_comments']) {
+ if($can_post || $can_comment) {
$comments .= replace_macros($cmnt_tpl,array(
'$return_path' => '',
+ '$mode' => 'photos',
'$jsreload' => $return_url,
'$type' => 'wall-comment',
'$id' => $link_item['id'],
'$parent' => $link_item['id'],
'$profile_uid' => $owner_uid,
- '$mylink' => $contact['url'],
+ '$mylink' => $observer['xchan_url'],
'$mytitle' => t('This is you'),
- '$myphoto' => $contact['thumb'],
+ '$myphoto' => $observer['xchan_photo_s'],
'$comment' => t('Comment'),
'$submit' => t('Submit'),
'$preview' => t('Preview'),
- '$ww' => ''
+ '$ww' => '',
+ '$feature_encrypt' => false
));
}
}
@@ -1142,7 +1112,7 @@ function photos_content(&$a) {
$dislike = '';
// display comments
- if(count($r)) {
+ if($r) {
foreach($r as $item) {
like_puller($a,$item,$alike,'like');
@@ -1154,23 +1124,6 @@ function photos_content(&$a) {
- if($can_post || $a->data['perms']['post_comments']) {
- $comments .= replace_macros($cmnt_tpl,array(
- '$return_path' => '',
- '$jsreload' => $return_url,
- '$type' => 'wall-comment',
- '$id' => $link_item['id'],
- '$parent' => $link_item['id'],
- '$profile_uid' => $owner_uid,
- '$mylink' => $contact['url'],
- '$mytitle' => t('This is you'),
- '$myphoto' => $contact['thumb'],
- '$comment' => t('Comment'),
- '$submit' => t('Submit'),
- '$ww' => ''
- ));
- }
-
foreach($r as $item) {
$comment = '';
$template = $tpl;
@@ -1181,61 +1134,30 @@ function photos_content(&$a) {
$redirect_url = $a->get_baseurl() . '/redir/' . $item['cid'] ;
- if($can_post || $a->data['perms']['post_comments']) {
- $comments .= replace_macros($cmnt_tpl,array(
- '$return_path' => '',
- '$jsreload' => $return_url,
- '$type' => 'wall-comment',
- '$id' => $item['item_id'],
- '$parent' => $item['parent'],
- '$profile_uid' => $owner_uid,
- '$mylink' => $contact['url'],
- '$mytitle' => t('This is you'),
- '$myphoto' => $contact['thumb'],
- '$comment' => t('Comment'),
- '$submit' => t('Submit'),
- '$sourceapp' => t($a->sourcename),
- '$ww' => ''
- ));
- }
+ $profile_url = zid($item['author']['xchan_url']);
+ $sparkle = '';
- if(local_user() && ($item['contact-uid'] == local_user())
- && ($item['network'] == 'dfrn') && (! $item['self'] )) {
- $profile_url = $redirect_url;
- $sparkle = ' sparkle';
- }
- else {
- $profile_url = $item['url'];
- $sparkle = '';
- }
-
- $diff_author = (($item['url'] !== $item['author-link']) ? true : false);
- $profile_name = (((strlen($item['author-name'])) && $diff_author) ? $item['author-name'] : $item['name']);
- $profile_avatar = (((strlen($item['author-avatar'])) && $diff_author) ? $item['author-avatar'] : $item['thumb']);
+ $profile_name = $item['author']['xchan_name'];
+ $profile_avatar = $item['author']['xchan_photo_m'];
$profile_link = $profile_url;
$drop = '';
- if(($item['contact-id'] == $contact_id) || ($item['uid'] == local_user()))
+ if($observer['xchan_hash'] === $item['author_xchan'] || $observer['xchan_hash'] === $item['owner_xchan'])
$drop = replace_macros(get_markup_template('photo_drop.tpl'), array('$id' => $item['id'], '$delete' => t('Delete')));
- if($a->get_template_engine() === 'internal') {
- $name_e = template_escape($profile_name);
- $title_e = template_escape($item['title']);
- $body_e = template_escape(bbcode($item['body']));
- }
- else {
- $name_e = $profile_name;
- $title_e = $item['title'];
- $body_e = bbcode($item['body']);
- }
+ $name_e = $profile_name;
+ $title_e = $item['title'];
+ unobscure($item);
+ $body_e = prepare_text($item['body'],$item['mimetype']);
$comments .= replace_macros($template,array(
'$id' => $item['item_id'],
+ '$mode' => 'photos',
'$profile_url' => $profile_link,
'$name' => $name_e,
'$thumb' => $profile_avatar,
@@ -1247,24 +1169,34 @@ function photos_content(&$a) {
'$drop' => $drop,
'$comment' => $comment
));
+
+ }
+
+ if($can_post || $can_comment) {
+ $comments .= replace_macros($cmnt_tpl,array(
+ '$return_path' => '',
+ '$jsreload' => $return_url,
+ '$type' => 'wall-comment',
+ '$id' => $link_item['id'],
+ '$parent' => $link_item['id'],
+ '$profile_uid' => $owner_uid,
+ '$mylink' => $observer['xchan_url'],
+ '$mytitle' => t('This is you'),
+ '$myphoto' => $observer['xchan_photo_s'],
+ '$comment' => t('Comment'),
+ '$submit' => t('Submit'),
+ '$ww' => ''
+ ));
}
- }
+ }
$paginate = paginate($a);
}
- if($a->get_template_engine() === 'internal') {
- $album_e = array($album_link,template_escape($ph[0]['album']));
- $tags_e = template_escape($tags);
- $like_e = template_escape($like);
- $dislike_e = template_escape($dislike);
- }
- else {
- $album_e = array($album_link,$ph[0]['album']);
- $tags_e = $tags;
- $like_e = $like;
- $dislike_e = $dislike;
- }
+ $album_e = array($album_link,$ph[0]['album']);
+ $tags_e = $tags;
+ $like_e = $like;
+ $dislike_e = $dislike;
$photo_tpl = get_markup_template('photo_view.tpl');
$o .= replace_macros($photo_tpl, array(
@@ -1275,7 +1207,7 @@ function photos_content(&$a) {
'$photo' => $photo,
'$prevlink' => $prevlink,
'$nextlink' => $nextlink,
- '$desc' => $ph[0]['desc'],
+ '$desc' => $ph[0]['description'],
'$tags' => $tags_e,
'$edit' => $edit,
'$likebuttons' => $likebuttons,
@@ -1284,6 +1216,8 @@ function photos_content(&$a) {
'$comments' => $comments,
'$paginate' => $paginate,
));
+
+ $a->data['photo_html'] = $o;
return $o;
}
@@ -1292,10 +1226,12 @@ function photos_content(&$a) {
//$o = '';
$r = q("SELECT `resource_id`, max(`scale`) AS `scale` FROM `photo` WHERE `uid` = %d AND `album` != '%s' AND `album` != '%s'
- $sql_extra GROUP BY `resource_id`",
+ and ( photo_flags = %d or photo_flags = %d ) $sql_extra GROUP BY `resource_id`",
intval($a->data['channel']['channel_id']),
dbesc('Contact Photos'),
- dbesc( t('Contact Photos'))
+ dbesc( t('Contact Photos')),
+ intval(PHOTO_NORMAL),
+ intval(PHOTO_PROFILE)
);
if(count($r)) {
$a->set_pager_total(count($r));
@@ -1303,11 +1239,14 @@ function photos_content(&$a) {
}
$r = q("SELECT `resource_id`, `id`, `filename`, type, `album`, max(`scale`) AS `scale` FROM `photo`
- WHERE `uid` = %d AND `album` != '%s' AND `album` != '%s'
+ WHERE `uid` = %d AND `album` != '%s' AND `album` != '%s'
+ and ( photo_flags = %d or photo_flags = %d )
$sql_extra GROUP BY `resource_id` ORDER BY `created` DESC LIMIT %d , %d",
intval($a->data['channel']['channel_id']),
dbesc('Contact Photos'),
dbesc( t('Contact Photos')),
+ intval(PHOTO_NORMAL),
+ intval(PHOTO_PROFILE),
intval($a->pager['start']),
intval($a->pager['itemspage'])
);
diff --git a/mod/ping.php b/mod/ping.php
index 827992c65..dda87dec2 100644
--- a/mod/ping.php
+++ b/mod/ping.php
@@ -75,7 +75,7 @@ function ping_init(&$a) {
);
break;
case 'all_events':
- $r = q("update event set ignore = 1 where ignore = 0 and uid = %d",
+ $r = q("update event set `ignore` = 1 where `ignore` = 0 and uid = %d",
intval(local_user())
);
break;
@@ -151,7 +151,7 @@ function ping_init(&$a) {
foreach($t as $zz) {
// $msg = sprintf( t('sent you a private message.'), $zz['xchan_name']);
$notifs[] = array(
- 'notify_link' => $a->get_baseurl() . '/message/' . $zz['id'],
+ 'notify_link' => $a->get_baseurl() . '/mail/' . $zz['id'],
'name' => $zz['xchan_name'],
'url' => $zz['xchan_url'],
'photo' => $zz['xchan_photo_s'],
@@ -209,7 +209,7 @@ function ping_init(&$a) {
if($r) {
foreach($r as $rr) {
$result[] = array(
- 'notify_link' => $a->get_baseurl() . '/intro/' . $rr['abook_id'],
+ 'notify_link' => $a->get_baseurl() . '/connedit/' . $rr['abook_id'],
'name' => $rr['xchan_name'],
'url' => $rr['xchan_url'],
'photo' => $rr['xchan_photo_s'],
@@ -253,7 +253,7 @@ function ping_init(&$a) {
$result[] = array(
- 'notify_link' => $a->get_baseurl() . '/events/event/' . $rr['event_hash'],
+ 'notify_link' => $a->get_baseurl() . '/events', // FIXME this takes you to an edit page and it may not be yours, we really want to just view the single event --> '/events/event/' . $rr['event_hash'],
'name' => $rr['xchan_name'],
'url' => $rr['xchan_url'],
'photo' => $rr['xchan_photo_s'],
diff --git a/mod/poke.php b/mod/poke.php
index 163ef0cd8..b22f7d9d5 100755
--- a/mod/poke.php
+++ b/mod/poke.php
@@ -1,17 +1,30 @@
-<?php
+<?php /** @file */
+
+/**
+ *
+ * Poke, prod, finger, or otherwise do unspeakable things to somebody - who must be a connection in your address book
+ * This function can be invoked with the required arguments (verb and cid and private and possibly parent) silently via ajax or
+ * other web request. You must be logged in and connected to a channel.
+ * If the required arguments aren't present, we'll display a simple form to choose a recipient and a verb.
+ * parent is a special argument which let's you attach this activity as a comment to an existing conversation, which
+ * may have started with somebody else poking (etc.) somebody, but this isn't necessary. This can be used in the adult
+ * plugin version to have entire conversations where Alice poked Bob, Bob fingered Alice, Alice hugged Bob, etc.
+ *
+ * private creates a private conversation with the recipient. Otherwise your channel's default post privacy is used.
+ *
+ */
-require_once('include/security.php');
-require_once('include/bbcode.php');
require_once('include/items.php');
-
function poke_init(&$a) {
if(! local_user())
return;
$uid = local_user();
- $verb = notags(trim($_GET['verb']));
+ $channel = $a->get_channel();
+
+ $verb = notags(trim($_REQUEST['verb']));
if(! $verb)
return;
@@ -23,109 +36,86 @@ function poke_init(&$a) {
$activity = ACTIVITY_POKE . '#' . urlencode($verbs[$verb][0]);
- $contact_id = intval($_GET['cid']);
+ $contact_id = intval($_REQUEST['cid']);
if(! $contact_id)
return;
- $parent = ((x($_GET,'parent')) ? intval($_GET['parent']) : 0);
-
+ $parent = ((x($_REQUEST,'parent')) ? intval($_REQUEST['parent']) : 0);
logger('poke: verb ' . $verb . ' contact ' . $contact_id, LOGGER_DEBUG);
- $r = q("SELECT * FROM `contact` WHERE `id` = %d and `uid` = %d LIMIT 1",
+ $r = q("SELECT * FROM abook left join xchan on xchan_hash = abook_xchan where abook_id = %d and abook_channel = %d LIMIT 1",
intval($contact_id),
intval($uid)
);
- if(! count($r)) {
- logger('poke: no contact ' . $contact_id);
+ if(! $r) {
+ logger('poke: no target ' . $contact_id);
return;
}
$target = $r[0];
+ $parent_item = null;
if($parent) {
- $r = q("select uri, private, allow_cid, allow_gid, deny_cid, deny_gid
+ $r = q("select mid, item_private, owner_xchan, allow_cid, allow_gid, deny_cid, deny_gid
from item where id = %d and parent = %d and uid = %d limit 1",
intval($parent),
intval($parent),
intval($uid)
);
- if(count($r)) {
- $parent_uri = $r[0]['uri'];
- $private = $r[0]['private'];
- $allow_cid = $r[0]['allow_cid'];
- $allow_gid = $r[0]['allow_gid'];
- $deny_cid = $r[0]['deny_cid'];
- $deny_gid = $r[0]['deny_gid'];
+ if($r) {
+ $parent_item = $r[0];
+ $parent_mid = $r[0]['mid'];
+ $item_private = $r[0]['item_private'];
+ $allow_cid = $r[0]['allow_cid'];
+ $allow_gid = $r[0]['allow_gid'];
+ $deny_cid = $r[0]['deny_cid'];
+ $deny_gid = $r[0]['deny_gid'];
}
}
else {
- $private = ((x($_GET,'private')) ? intval($_GET['private']) : 0);
+ $item_private = ((x($_GET,'private')) ? intval($_GET['private']) : 0);
- $allow_cid = (($private) ? '<' . $target['id']. '>' : $a->user['allow_cid']);
- $allow_gid = (($private) ? '' : $a->user['allow_gid']);
- $deny_cid = (($private) ? '' : $a->user['deny_cid']);
- $deny_gid = (($private) ? '' : $a->user['deny_gid']);
+ $allow_cid = (($item_private) ? '<' . $target['abook_xchan']. '>' : $channel['channel_allow_cid']);
+ $allow_gid = (($item_private) ? '' : $channel['channel_allow_gid']);
+ $deny_cid = (($item_private) ? '' : $channel['channel_deny_cid']);
+ $deny_gid = (($item_private) ? '' : $channel['channel_deny_gid']);
}
-
-
- $poster = $a->contact;
-
- $uri = item_message_id();
-
$arr = array();
+ $arr['item_flags'] = ITEM_WALL | ITEM_ORIGIN;
+ if($parent_item)
+ $arr['item_flags'] |= ITEM_THREAD_TOP;
- $arr['uid'] = $uid;
- $arr['uri'] = $uri;
- $arr['parent_uri'] = (($parent_uri) ? $parent_uri : $uri);
- $arr['type'] = 'activity';
- $arr['wall'] = 1;
- $arr['contact-id'] = $poster['id'];
- $arr['owner-name'] = $poster['name'];
- $arr['owner-link'] = $poster['url'];
- $arr['owner-avatar'] = $poster['thumb'];
- $arr['author-name'] = $poster['name'];
- $arr['author-link'] = $poster['url'];
- $arr['author-avatar'] = $poster['thumb'];
+ $arr['owner_xchan'] = (($parent_item) ? $parent_item['owner_xchan'] : $channel['channel_hash']);
+ $arr['parent_mid'] = (($parent_mid) ? $parent_mid : $mid);
$arr['title'] = '';
$arr['allow_cid'] = $allow_cid;
$arr['allow_gid'] = $allow_gid;
$arr['deny_cid'] = $deny_cid;
$arr['deny_gid'] = $deny_gid;
- $arr['last-child'] = 1;
- $arr['visible'] = 1;
$arr['verb'] = $activity;
- $arr['private'] = $private;
- $arr['obj_type'] = ACTIVITY_OBJ_PERSON;
-
- $arr['origin'] = 1;
- $arr['body'] = '[url=' . $poster['url'] . ']' . $poster['name'] . '[/url]' . ' ' . t($verbs[$verb][0]) . ' ' . '[url=' . $target['url'] . ']' . $target['name'] . '[/url]';
-
- $arr['object'] = '<object><type>' . ACTIVITY_OBJ_PERSON . '</type><title>' . $target['name'] . '</title><id>' . $a->get_baseurl() . '/contact/' . $target['id'] . '</id>';
- $arr['object'] .= '<link>' . xmlify('<link rel="alternate" type="text/html" href="' . $target['url'] . '" />' . "\n");
-
- $arr['object'] .= xmlify('<link rel="photo" type="image/jpeg" href="' . $target['photo'] . '" />' . "\n");
- $arr['object'] .= '</link></object>' . "\n";
-
- $item_id = item_store($arr);
- if($item_id) {
- q("UPDATE `item` SET `plink` = '%s' WHERE `uid` = %d AND `id` = %d LIMIT 1",
- dbesc($a->get_baseurl() . '/display/' . $poster['nickname'] . '/' . $item_id),
- intval($uid),
- intval($item_id)
- );
- proc_run('php',"include/notifier.php","tag","$item_id");
- }
-
+ $arr['item_private'] = $item_private;
+ $arr['obj_type'] = ACTIVITY_OBJ_PERSON;
+ $arr['body'] = '[zrl=' . $channel['xchan_url'] . ']' . $channel['xchan_name'] . '[/zrl]' . ' ' . t($verbs[$verb][0]) . ' ' . '[zrl=' . $target['xchan_url'] . ']' . $target['xchan_name'] . '[/zrl]';
+
+ $obj = array(
+ 'type' => ACTIVITY_OBJ_PERSON,
+ 'title' => $target['xchan_name'],
+ 'id' => $target['xchan_hash'],
+ 'link' => array(
+ array('rel' => 'alternate', 'type' => 'text/html', 'href' => $target['xchan_url']),
+ array('rel' => 'photo', 'type' => $target['xchan_photo_mimetype'], 'href' => $target['xchan_photo_l'])
+ ),
+ );
- call_hooks('post_local_end', $arr);
+ $arr['object'] = json_encode($obj);
- proc_run('php',"include/notifier.php","like","$post_id");
+ post_activity_item($arr);
return;
}
@@ -142,43 +132,19 @@ function poke_content(&$a) {
$name = '';
$id = '';
- if(intval($_GET['c'])) {
- $r = q("select id,name from contact where id = %d and uid = %d limit 1",
- intval($_GET['c']),
+ if(intval($_REQUEST['c'])) {
+ $r = q("select abook_id, xchan_name from abook left join xchan on abook_xchan = xchan_hash
+ where abook_id = %d and abook_channel = %d limit 1",
+ intval($_REQUEST['c']),
intval(local_user())
);
- if(count($r)) {
- $name = $r[0]['name'];
- $id = $r[0]['id'];
+ if($r) {
+ $name = $r[0]['xchan_name'];
+ $id = $r[0]['abook_id'];
}
}
-
- $base = $a->get_baseurl();
-
- $a->page['htmlhead'] .= <<< EOT
-
-<script>$(document).ready(function() {
- var a;
- a = $("#poke-recip").autocomplete({
- serviceUrl: '$base/acl',
- minChars: 2,
- width: 350,
- onSelect: function(value,data) {
- $("#poke-recip-complete").val(data);
- }
- });
- a.setOptions({ params: { type: 'a' }});
-
-
-});
-
-</script>
-EOT;
-
- $parent = ((x($_GET,'parent')) ? intval($_GET['parent']) : '0');
-
-
+ $parent = ((x($_REQUEST,'parent')) ? intval($_REQUEST['parent']) : '0');
$verbs = get_poke_verbs();
diff --git a/mod/post.php b/mod/post.php
index e5fa1a418..965ba09a3 100644
--- a/mod/post.php
+++ b/mod/post.php
@@ -1,4 +1,4 @@
-<?php
+<?php /** @file */
/**
* Zot endpoint
@@ -10,158 +10,511 @@ require_once('include/zot.php');
function post_init(&$a) {
- // All other access to this endpoint is via the post method.
+ // Most access to this endpoint is via the post method.
// Here we will pick out the magic auth params which arrive
- // as a get request.
-
- if(argc() > 1) {
-
- $webbie = argv(1);
-
- if(array_key_exists('auth',$_REQUEST)) {
-
- $address = $_REQUEST['auth'];
- $dest = $_REQUEST['dest'];
- $sec = $_REQUEST['sec'];
- $version = $_REQUEST['version'];
-
- switch($dest) {
- case 'channel':
- $desturl = z_root() . '/channel/' . $webbie;
- break;
- case 'photos':
- $desturl = z_root() . '/photos/' . $webbie;
- break;
- case 'profile':
- $desturl = z_root() . '/profile/' . $webbie;
- break;
- default:
- $desturl = $dest;
- break;
- }
- $c = q("select * from channel where channel_address = '%s' limit 1",
- dbesc($webbie)
- );
- if(! $c) {
- logger('mod_zot: auth: unable to find channel ' . $webbie);
- // They'll get a notice when they hit the page, we don't need two of them.
- goaway($desturl);
+ // as a get request, and the only communications to arrive this way.
+
+/**
+ * Magic Auth
+ * ==========
+ *
+ * So-called "magic auth" takes place by a special exchange. On the site where the "channel to be authenticated" lives (e.g. $mysite),
+ * a redirection is made via $mysite/magic to the zot endpoint of the remote site ($remotesite) with special GET parameters.
+ *
+ * The endpoint is typically https://$remotesite/post - or whatever was specified as the callback url in prior communications
+ * (we will bootstrap an address and fetch a zot info packet if possible where no prior communications exist)
+ *
+ * Four GET parameters are supplied:
+ *
+ ** auth => the urlencoded webbie (channel@host.domain) of the channel requesting access
+ ** dest => the desired destination URL (urlencoded)
+ ** sec => a random string which is also stored on $mysite for use during the verification phase.
+ ** version => the zot revision
+ *
+ * When this packet is received, an "auth-check" zot message is sent to $mysite.
+ * (e.g. if $_GET['auth'] is foobar@podunk.edu, a zot packet is sent to the podunk.edu zot endpoint, which is typically /post)
+ * If no information has been recorded about the requesting identity a zot information packet will be retrieved before
+ * continuing.
+ *
+ * The sender of this packet is an arbitrary/random site channel. The recipients will be a single recipient corresponding
+ * to the guid and guid_sig we have associated with the requesting auth identity
+ *
+ *
+ * {
+ * "type":"auth_check",
+ * "sender":{
+ * "guid":"kgVFf_...",
+ * "guid_sig":"PT9-TApz...",
+ * "url":"http:\/\/podunk.edu",
+ * "url_sig":"T8Bp7j..."
+ * },
+ * "recipients":{
+ * {
+ * "guid":"ZHSqb...",
+ * "guid_sig":"JsAAXi..."
+ * }
+ * }
+ * "callback":"\/post",
+ * "version":1,
+ * "secret":"1eaa661",
+ * "secret_sig":"eKV968b1..."
+ * }
+ *
+ *
+ * auth_check messages MUST use encapsulated encryption. This message is sent to the origination site, which checks the 'secret' to see
+ * if it is the same as the 'sec' which it passed originally. It also checks the secret_sig which is the secret signed by the
+ * destination channel's private key and base64url encoded. If everything checks out, a json packet is returned:
+ *
+ * {
+ * "success":1,
+ * "confirm":"q0Ysovd1u..."
+ * "service_class":(optional)
+ * "level":(optional)
+ * }
+ *
+ * 'confirm' in this case is the base64url encoded RSA signature of the concatenation of 'secret' with the
+ * base64url encoded whirlpool hash of the requestor's guid and guid_sig; signed with the source channel private key.
+ * This prevents a man-in-the-middle from inserting a rogue success packet. Upon receipt and successful
+ * verification of this packet, the destination site will redirect to the original destination URL and indicate a successful remote login.
+ * Service_class can be used by cooperating sites to provide different access rights based on account rights and subscription plans. It is
+ * a string whose contents are not defined by protocol. Example: "basic" or "gold".
+ *
+ *
+ *
+ */
+
+ if(array_key_exists('auth',$_REQUEST)) {
+
+ $ret = array('success' => false, 'message' => '');
+
+ logger('mod_zot: auth request received.');
+ $address = $_REQUEST['auth'];
+ $desturl = $_REQUEST['dest'];
+ $sec = $_REQUEST['sec'];
+ $version = $_REQUEST['version'];
+ $test = ((x($_REQUEST,'test')) ? intval($_REQUEST['test']) : 0);
+
+ // They are authenticating ultimately to the site and not to a particular channel.
+ // Any channel will do, providing it's currently active. We just need to have an
+ // identity to attach to the packet we send back. So find one.
+
+ $c = q("select * from channel where not ( channel_pageflags & %d ) limit 1",
+ intval(PAGE_REMOVED)
+ );
+
+ if(! $c) {
+ // nobody here
+ logger('mod_zot: auth: unable to find a response channel');
+ if($test) {
+ $ret['message'] .= 'no local channels found.' . EOL;
+ json_return_and_die($ret);
}
- // Try and find a hubloc for the person attempting to auth
- $x = q("select * from hubloc left join xchan on xchan_hash = hubloc_hash where hubloc_addr = '%s' limit 1",
- dbesc($address)
- );
+ goaway($desturl);
+ }
- if(! $x) {
- // finger them if they can't be found.
- $ret = zot_finger($addr,null);
- if($ret['success']) {
- $j = json_decode($ret['body'],true);
- if($j)
- import_xchan($j);
- $x = q("select * from hubloc left join xchan on xchan_hash = hubloc_hash where hubloc_addr = '%s' limit 1",
- dbesc($address)
- );
- }
+ // Try and find a hubloc for the person attempting to auth
+ $x = q("select * from hubloc left join xchan on xchan_hash = hubloc_hash where hubloc_addr = '%s' order by hubloc_id desc limit 1",
+ dbesc($address)
+ );
+
+ if(! $x) {
+ // finger them if they can't be found.
+ $ret = zot_finger($address,null);
+ if($ret['success']) {
+ $j = json_decode($ret['body'],true);
+ if($j)
+ import_xchan($j);
+ $x = q("select * from hubloc left join xchan on xchan_hash = hubloc_hash where hubloc_addr = '%s' order by hubloc_id desc limit 1",
+ dbesc($address)
+ );
}
- if(! $x) {
- logger('mod_zot: auth: unable to finger ' . $addr);
- goaway($desturl);
+ }
+ if(! $x) {
+ logger('mod_zot: auth: unable to finger ' . $address);
+
+ if($test) {
+ $ret['message'] .= 'no hubloc found for ' . $address . ' and probing failed.' . EOL;
+ json_return_and_die($ret);
}
- logger('mod_zot: auth request received from ' . $x[0]['xchan_addr'] . ' for ' . $webbie);
+ goaway($desturl);
+ }
+
+ logger('mod_zot: auth request received from ' . $x[0]['hubloc_addr'] );
+
+ // check credentials and access
+
+ // If they are already authenticated and haven't changed credentials,
+ // we can save an expensive network round trip and improve performance.
+
+ $remote = remote_user();
+ $result = null;
+ $remote_service_class = '';
+ $remote_level = 0;
+ $remote_hub = $x[0]['hubloc_url'];
+
+ // Also check that they are coming from the same site as they authenticated with originally.
+
+ $already_authed = ((($remote) && ($x[0]['hubloc_hash'] == $remote) && ($x[0]['hubloc_url'] === $_SESSION['remote_hub'])) ? true : false);
- // check credentials and access
+ $j = array();
- // If they are already authenticated and haven't changed credentials,
- // we can save an expensive network round trip and improve performance.
+ if(! $already_authed) {
- $remote = remote_user();
- $result = null;
+ // Auth packets MUST use ultra top-secret hush-hush mode - e.g. the entire packet is encrypted using the site private key
+ // The actual channel sending the packet ($c[0]) is not important, but this provides a generic zot packet with a sender
+ // which can be verified
+
+ $p = zot_build_packet($c[0],$type = 'auth_check', array(array('guid' => $x[0]['hubloc_guid'],'guid_sig' => $x[0]['hubloc_guid_sig'])), $x[0]['hubloc_sitekey'], $sec);
+ if($test) {
+ $ret['message'] .= 'auth check packet created using sitekey ' . $x[0]['hubloc_sitekey'] . EOL;
+ $ret['message'] .= 'packet contents: ' . $p . EOL;
+ }
+
+ $result = zot_zot($x[0]['hubloc_callback'],$p);
- $already_authed = ((($remote) && ($x[0]['hubloc_hash'] == $remote)) ? true : false);
- if(! $already_authed) {
- // Auth packets MUST use ultra top-secret hush-hush mode
- $p = zot_build_packet($c[0],$type = 'auth_check',
- array(array('guid' => $x[0]['hubloc_guid'],'guid_sig' => $x[0]['hubloc_guid_sig'])),
- $x[0]['hubloc_sitekey'], $sec);
- $result = zot_zot($x[0]['hubloc_callback'],$p);
- if(! $result['success']) {
- logger('mod_zot: auth_check callback failed.');
+ if(! $result['success']) {
+ logger('mod_zot: auth_check callback failed.');
+ if($test) {
+ $ret['message'] .= 'auth check request to your site returned .' . print_r($result, true) . EOL;
+ json_return_and_die($ret);
+ }
+
+ goaway($desturl);
+ }
+ $j = json_decode($result['body'],true);
+ if(! $j) {
+ logger('mod_zot: auth_check json data malformed.');
+ if($test) {
+ $ret['message'] .= 'json malformed: ' . $result['body'] . EOL;
+ json_return_and_die($ret);
+ }
+ }
+ }
+
+ if($test) {
+ $ret['message'] .= 'auth check request returned .' . print_r($j, true) . EOL;
+ }
+
+ if($already_authed || $j['success']) {
+ if($j['success']) {
+ // legit response, but we do need to check that this wasn't answered by a man-in-middle
+ if(! rsa_verify($sec . $x[0]['xchan_hash'],base64url_decode($j['confirm']),$x[0]['xchan_pubkey'])) {
+ logger('mod_zot: auth: final confirmation failed.');
+ if($test) {
+ $ret['message'] .= 'final confirmation failed. ' . $sec . print_r($j,true) . print_r($x[0],true);
+ json_return_and_die($ret);
+ }
+
goaway($desturl);
}
- $j = json_decode($result['body'],true);
+ if(array_key_exists('service_class',$j))
+ $remote_service_class = $j['service_class'];
+ if(array_key_exists('level',$j))
+ $remote_level = $j['level'];
}
+ // everything is good... maybe
+ if(local_user()) {
- if($already_authed || $j['result']) {
- // everything is good... maybe
- if(local_user()) {
+ // tell them to logout if they're logged in locally as anything but the target remote account
+ // in which case just shut up because they don't need to be doing this at all.
+
+ if($a->channel['channel_hash'] != $x[0]['xchan_hash']) {
+ logger('mod_zot: auth: already authenticated locally as somebody else.');
notice( t('Remote authentication blocked. You are logged into this site locally. Please logout and retry.') . EOL);
- goaway($desturl);
+ if($test) {
+ $ret['message'] .= 'already logged in locally with a conflicting identity.' . EOL;
+ json_return_and_die($ret);
+ }
+
}
- // log them in
- $_SESSION['authenticated'] = 1;
- $_SESSION['visitor_id'] = $x[0]['xchan_hash'];
- $a->set_observer($x[0]);
- require_once('include/security.php');
- $a->set_groups(init_groups_visitor($_SESSION['visitor_id']));
- info(sprintf( t('Welcome %s. Remote authentication successful.'),$x[0]['xchan_name']));
- logger('mod_zot: auth success from ' . $x[0]['xchan_addr'] . ' for ' . $webbie);
+ goaway($desturl);
+ }
+ // log them in
+ if($test) {
+ $ret['success'] = true;
+ $ret['message'] .= 'Authentication Success!' . EOL;
+ json_return_and_die($ret);
}
-// FIXME - we really want to save the return_url in the session before we visit rmagic.
-// This does however prevent a recursion if you visit rmagic directly, as it would otherwise send you back here again.
-// But z_root() probably isn't where you really want to go.
- if(strstr($desturl,z_root() . '/rmagic'))
- goaway(z_root());
+ $_SESSION['authenticated'] = 1;
+ $_SESSION['visitor_id'] = $x[0]['xchan_hash'];
+ $_SESSION['my_address'] = $address;
+ $_SESSION['remote_service_class'] = $remote_service_class;
+ $_SESSION['remote_level'] = $remote_level;
+ $_SESSION['remote_hub'] = $remote_hub;
+
+ $arr = array('xchan' => $x[0], 'url' => $desturl, 'session' => $_SESSION);
+ call_hooks('magic_auth_success',$arr);
+ $a->set_observer($x[0]);
+ require_once('include/security.php');
+ $a->set_groups(init_groups_visitor($_SESSION['visitor_id']));
+ info(sprintf( t('Welcome %s. Remote authentication successful.'),$x[0]['xchan_name']));
+ logger('mod_zot: auth success from ' . $x[0]['xchan_addr']);
+
+ } else {
+ if($test) {
+ $ret['message'] .= 'auth failure. ' . print_r($_REQUEST,true) . print_r($j,true) . EOL;
+ json_return_and_dir($ret);
+ }
- goaway($desturl);
+ logger('mod_zot: magic-auth failure - not authenticated: ' . $x[0]['xchan_addr']);
+ q("update hubloc set hubloc_status = (hubloc_status | %d ) where hubloc_id = %d ",
+ intval(HUBLOC_RECEIVE_ERROR),
+ intval($x[0]['hubloc_id'])
+ );
}
- logger('mod_zot: invalid args: ' . print_r($a->argv,true));
- killme();
- }
+ // FIXME - we really want to save the return_url in the session before we visit rmagic.
+ // This does however prevent a recursion if you visit rmagic directly, as it would otherwise send you back here again.
+ // But z_root() probably isn't where you really want to go.
+ if($test) {
+ $ret['message'] .= 'auth failure fallthrough ' . print_r($_REQUEST,true) . print_r($j,true) . EOL;
+ json_return_and_dir($ret);
+ }
+
+ if(strstr($desturl,z_root() . '/rmagic'))
+ goaway(z_root());
+
+ goaway($desturl);
+ }
return;
}
-
+/**
+ * @function post_post(&$a)
+ * zot communications and messaging
+ *
+ * Sender HTTP posts to this endpoint ($site/post typically) with 'data' parameter set to json zot message packet.
+ * This packet is optionally encrypted, which we will discover if the json has an 'iv' element.
+ * $contents => array( 'alg' => 'aes256cbc', 'iv' => initialisation vector, 'key' => decryption key, 'data' => encrypted data);
+ * $contents->iv and $contents->key are random strings encrypted with this site's RSA public key and then base64url encoded.
+ * Currently only 'aes256cbc' is used, but this is extensible should that algorithm prove inadequate.
+ *
+ * Once decrypted, one will find the normal json_encoded zot message packet.
+ *
+ * Defined packet types are: notify, purge, refresh, auth_check, ping, and pickup
+ *
+ * Standard packet: (used by notify, purge, refresh, and auth_check)
+ *
+ * {
+ * "type": "notify",
+ * "sender":{
+ * "guid":"kgVFf_1...",
+ * "guid_sig":"PT9-TApzp...",
+ * "url":"http:\/\/podunk.edu",
+ * "url_sig":"T8Bp7j5...",
+ * },
+ * "recipients": { optional recipient array },
+ * "callback":"\/post",
+ * "version":1,
+ * "secret":"1eaa...",
+ * "secret_sig": "df89025470fac8..."
+ * }
+ *
+ * Signature fields are all signed with the sender channel private key and base64url encoded.
+ * Recipients are arrays of guid and guid_sig, which were previously signed with the recipients private
+ * key and base64url encoded and later obtained via channel discovery. Absence of recipients indicates
+ * a public message or visible to all potential listeners on this site.
+ *
+ * "pickup" packet:
+ * The pickup packet is sent in response to a notify packet from another site
+ *
+ * {
+ * "type":"pickup",
+ * "url":"http:\/\/example.com",
+ * "callback":"http:\/\/example.com\/post",
+ * "callback_sig":"teE1_fLI...",
+ * "secret":"1eaa...",
+ * "secret_sig":"O7nB4_..."
+ * }
+ *
+ * In the pickup packet, the sig fields correspond to the respective data element signed with this site's system
+ * private key and then base64url encoded.
+ * The "secret" is the same as the original secret from the notify packet.
+ *
+ * If verification is successful, a json structure is returned
+ * containing a success indicator and an array of type 'pickup'.
+ * Each pickup element contains the original notify request and a message field whose contents are
+ * dependent on the message type
+ *
+ * This JSON array is AES encapsulated using the site public key of the site that sent the initial zot pickup packet.
+ * Using the above example, this would be example.com.
+ *
+ *
+ * {
+ * "success":1,
+ * "pickup":{
+ * "notify":{
+ * "type":"notify",
+ * "sender":{
+ * "guid":"kgVFf_...",
+ * "guid_sig":"PT9-TApz...",
+ * "url":"http:\/\/z.podunk.edu",
+ * "url_sig":"T8Bp7j5D..."
+ * },
+ * "callback":"\/post",
+ * "version":1,
+ * "secret":"1eaa661..."
+ * },
+ * "message":{
+ * "type":"activity",
+ * "message_id":"10b049ce384cbb2da9467319bc98169ab36290b8bbb403aa0c0accd9cb072e76@podunk.edu",
+ * "message_top":"10b049ce384cbb2da9467319bc98169ab36290b8bbb403aa0c0accd9cb072e76@podunk.edu",
+ * "message_parent":"10b049ce384cbb2da9467319bc98169ab36290b8bbb403aa0c0accd9cb072e76@podunk.edu",
+ * "created":"2012-11-20 04:04:16",
+ * "edited":"2012-11-20 04:04:16",
+ * "title":"",
+ * "body":"Hi Nickordo",
+ * "app":"",
+ * "verb":"post",
+ * "object_type":"",
+ * "target_type":"",
+ * "permalink":"",
+ * "location":"",
+ * "longlat":"",
+ * "owner":{
+ * "name":"Indigo",
+ * "address":"indigo@podunk.edu",
+ * "url":"http:\/\/podunk.edu",
+ * "photo":{
+ * "mimetype":"image\/jpeg",
+ * "src":"http:\/\/podunk.edu\/photo\/profile\/m\/5"
+ * },
+ * "guid":"kgVFf_...",
+ * "guid_sig":"PT9-TAp...",
+ * },
+ * "author":{
+ * "name":"Indigo",
+ * "address":"indigo@podunk.edu",
+ * "url":"http:\/\/podunk.edu",
+ * "photo":{
+ * "mimetype":"image\/jpeg",
+ * "src":"http:\/\/podunk.edu\/photo\/profile\/m\/5"
+ * },
+ * "guid":"kgVFf_...",
+ * "guid_sig":"PT9-TAp..."
+ * }
+ * }
+ * }
+ *}
+ *
+ * Currently defined message types are 'activity', 'mail', 'profile' and 'channel_sync', which each have
+ * different content schemas.
+ *
+ * Ping packet:
+ * A ping packet does not require any parameters except the type. It may or may not be encrypted.
+ *
+ * {
+ * "type": "ping"
+ * }
+ *
+ * On receipt of a ping packet a ping response will be returned:
+ *
+ * {
+ * "success" : 1,
+ * "site" {
+ * "url":"http:\/\/podunk.edu",
+ * "url_sig":"T8Bp7j5...",
+ * "sitekey": "-----BEGIN PUBLIC KEY-----
+ * MIICIjANBgkqhkiG9w0BAQE..."
+ * }
+ * }
+ *
+ * The ping packet can be used to verify that a site has not been re-installed, and to
+ * initiate corrective action if it has. The url_sig is signed with the site private key
+ * and base64url encoded - and this should verify with the enclosed sitekey. Failure to
+ * verify indicates the site is corrupt or otherwise unable to communicate using zot.
+ * This return packet is not otherwise verified, so should be compared with other
+ * results obtained from this site which were verified prior to taking action. For instance
+ * if you have one verified result with this signature and key, and other records for this
+ * url which have different signatures and keys, it indicates that the site was re-installed
+ * and corrective action may commence (remove or mark invalid any entries with different
+ * signatures).
+ * If you have no records which match this url_sig and key - no corrective action should
+ * be taken as this packet may have been returned by an imposter.
+ *
+ */
function post_post(&$a) {
logger('mod_zot: ' . print_r($_REQUEST,true), LOGGER_DEBUG);
- $ret = array('result' => false);
+ $encrypted_packet = false;
+ $ret = array('success' => false);
$data = json_decode($_REQUEST['data'],true);
logger('mod_zot: data: ' . print_r($data,true), LOGGER_DATA);
+ /**
+ * Many message packets will arrive encrypted. The existence of an 'iv' element
+ * tells us we need to unencapsulate the AES-256-CBC content using the site private key
+ */
+
if(array_key_exists('iv',$data)) {
- $data = aes_unencapsulate($data,get_config('system','prvkey'));
+ $encrypted_packet = true;
+ $data = crypto_unencapsulate($data,get_config('system','prvkey'));
logger('mod_zot: decrypt1: ' . $data, LOGGER_DATA);
$data = json_decode($data,true);
}
+ if(! $data) {
+
+ // possible Bleichenbacher's attack, just treat it as a
+ // message we have no handler for. It should fail a bit
+ // further along with "no hub". Our public key is public
+ // knowledge. There's no reason why anybody should get the
+ // encryption wrong unless they're fishing or hacking. If
+ // they're developing and made a goof, this can be discovered
+ // in the logs of the destination site. If they're fishing or
+ // hacking, the bottom line is we can't verify their hub.
+ // That's all we're going to tell them.
+
+ $data = array('type' => 'bogus');
+ }
+
logger('mod_zot: decoded data: ' . print_r($data,true), LOGGER_DATA);
$msgtype = ((array_key_exists('type',$data)) ? $data['type'] : '');
+ if($msgtype === 'ping') {
+
+ // Useful to get a health check on a remote site.
+ // This will let us know if any important communication details
+ // that we may have stored are no longer valid, regardless of xchan details.
+
+ $ret['success'] = true;
+ $ret['site'] = array();
+ $ret['site']['url'] = z_root();
+ $ret['site']['url_sig'] = base64url_encode(rsa_sign(z_root(),get_config('system','prvkey')));
+ $ret['site']['sitekey'] = get_config('system','pubkey');
+ json_return_and_die($ret);
+ }
if($msgtype === 'pickup') {
+ /**
+ * The 'pickup' message arrives with a tracking ID which is associated with a particular outq_hash
+ * First verify that that the returned signatures verify, then check that we have an outbound queue item
+ * with the correct hash.
+ * If everything verifies, find any/all outbound messages in the queue for this hubloc and send them back
+ *
+ */
+
if((! $data['secret']) || (! $data['secret_sig'])) {
$ret['message'] = 'no verification signature';
logger('mod_zot: pickup: ' . $ret['message'], LOGGER_DEBUG);
json_return_and_die($ret);
}
- $r = q("select hubloc_sitekey from hubloc where hubloc_url = '%s' and hubloc_callback = '%s' and hubloc_sitekey != '' limit 1",
+ $r = q("select distinct hubloc_sitekey from hubloc where hubloc_url = '%s' and hubloc_callback = '%s' and hubloc_sitekey != '' group by hubloc_sitekey ",
dbesc($data['url']),
dbesc($data['callback'])
);
@@ -170,23 +523,47 @@ function post_post(&$a) {
logger('mod_zot: pickup: ' . $ret['message']);
json_return_and_die($ret);
}
- // verify the url_sig
- $sitekey = $r[0]['hubloc_sitekey'];
- logger('sitekey: ' . $sitekey);
- if(! rsa_verify($data['callback'],base64url_decode($data['callback_sig']),$sitekey)) {
+ foreach ($r as $hubsite) {
+
+ // verify the url_sig
+ // If the server was re-installed at some point, there could be multiple hubs with the same url and callback.
+ // Only one will have a valid key.
+
+ $forgery = true;
+ $secret_fail = true;
+
+ $sitekey = $hubsite['hubloc_sitekey'];
+
+ logger('mod_zot: Checking sitekey: ' . $sitekey);
+
+ if(rsa_verify($data['callback'],base64url_decode($data['callback_sig']),$sitekey)) {
+ $forgery = false;
+ }
+ if(rsa_verify($data['secret'],base64url_decode($data['secret_sig']),$sitekey)) {
+ $secret_fail = false;
+ }
+ if((! $forgery) && (! $secret_fail))
+ break;
+ }
+
+ if($forgery) {
$ret['message'] = 'possible site forgery';
logger('mod_zot: pickup: ' . $ret['message']);
json_return_and_die($ret);
}
- if(! rsa_verify($data['secret'],base64url_decode($data['secret_sig']),$sitekey)) {
+ if($secret_fail) {
$ret['message'] = 'secret validation failed';
logger('mod_zot: pickup: ' . $ret['message']);
json_return_and_die($ret);
}
- // If we made it to here, we've got a valid pickup. Grab everything for this host and send it.
+ /**
+ * If we made it to here, the signatures verify, but we still don't know if the tracking ID is valid.
+ * It wouldn't be an error if the tracking ID isn't found, because we may have sent this particular
+ * queue item with another pickup (after the tracking ID for the other pickup was verified).
+ */
$r = q("select outq_posturl from outq where outq_hash = '%s' and outq_posturl = '%s' limit 1",
dbesc($data['secret']),
@@ -198,6 +575,11 @@ function post_post(&$a) {
json_return_and_die($ret);
}
+ /**
+ * Everything is good if we made it here, so find all messages that are going to this location
+ * and send them all.
+ */
+
$r = q("select * from outq where outq_posturl = '%s'",
dbesc($data['callback'])
);
@@ -212,55 +594,202 @@ function post_post(&$a) {
);
}
}
- $encrypted = aes_encapsulate(json_encode($ret),$sitekey);
+
+ $encrypted = crypto_encapsulate(json_encode($ret),$sitekey);
json_return_and_die($encrypted);
+
+ /** pickup: end */
}
+
+
+
+ /**
+ * All other message types require us to verify the sender. This is a generic check, so we
+ * will do it once here and bail if anything goes wrong.
+ */
+
if(array_key_exists('sender',$data)) {
$sender = $data['sender'];
}
+ /** Check if the sender is already verified here */
+
$hub = zot_gethub($sender);
+
if(! $hub) {
+
+ /** Have never seen this guid or this guid coming from this location. Check it and register it. */
+
// (!!) this will validate the sender
$result = zot_register_hub($sender);
- if((! $result['success']) || (! zot_gethub($sender))) {
+
+ if((! $result['success']) || (! ($hub = zot_gethub($sender)))) {
$ret['message'] = 'Hub not available.';
logger('mod_zot: no hub');
json_return_and_die($ret);
}
}
+
+ // Update our DB to show when we last communicated successfully with this hub
+ // This will allow us to prune dead hubs from using up resources
+
+ $r = q("update hubloc set hubloc_connected = '%s' where hubloc_id = %d limit 1",
+ dbesc(datetime_convert()),
+ intval($hub['hubloc_id'])
+ );
+
+ /**
+ * This hub has now been proven to be valid.
+ * Any hub with the same URL and a different sitekey cannot be valid.
+ * Get rid of them (mark them deleted). There's a good chance they were re-installs.
+ *
+ */
+
+ q("update hubloc set hubloc_flags = ( hubloc_flags | %d ) where hubloc_url = '%s' and hubloc_sitekey != '%s' ",
+ intval(HUBLOC_FLAGS_DELETED),
+ dbesc($hub['hubloc_url']),
+ dbesc($hub['hubloc_sitekey'])
+ );
+
// TODO: check which hub is primary and take action if mismatched
if(array_key_exists('recipients',$data))
$recipients = $data['recipients'];
- if($msgtype === 'purge') {
- if($recipients) {
- // basically this means "unfriend"
- foreach($recipients as $recip) {
+ if($msgtype === 'auth_check') {
+
+ /**
+ * Requestor visits /magic/?dest=somewhere on their own site with a browser
+ * magic redirects them to $destsite/post [with auth args....]
+ * $destsite sends an auth_check packet to originator site
+ * The auth_check packet is handled here by the originator's site
+ * - the browser session is still waiting
+ * inside $destsite/post for everything to verify
+ * If everything checks out we'll return a token to $destsite
+ * and then $destsite will verify the token, authenticate the browser
+ * session and then redirect to the original destination.
+ * If authentication fails, the redirection to the original destination
+ * will still take place but without authentication.
+ */
+ logger('mod_zot: auth_check', LOGGER_DEBUG);
+
+ if(! $encrypted_packet) {
+ logger('mod_zot: auth_check packet was not encrypted.');
+ $ret['message'] .= 'no packet encryption' . EOL;
+ json_return_and_die($ret);
+ }
+
+ $arr = $data['sender'];
+ $sender_hash = base64url_encode(hash('whirlpool',$arr['guid'] . $arr['guid_sig'], true));
+
+ // garbage collect any old unused notifications
+ q("delete from verify where type = 'auth' and created < UTC_TIMESTAMP() - INTERVAL 10 MINUTE");
+ $y = q("select xchan_pubkey from xchan where xchan_hash = '%s' limit 1",
+ dbesc($sender_hash)
+ );
+
+ // We created a unique hash in mod/magic.php when we invoked remote auth, and stored it in
+ // the verify table. It is now coming back to us as 'secret' and is signed by a channel at the other end.
+ // First verify their signature. We will have obtained a zot-info packet from them as part of the sender
+ // verification.
+
+ if((! $y) || (! rsa_verify($data['secret'],base64url_decode($data['secret_sig']),$y[0]['xchan_pubkey']))) {
+ logger('mod_zot: auth_check: sender not found or secret_sig invalid.');
+ $ret['message'] .= 'sender not found or sig invalid ' . print_r($y,true) . EOL;
+ json_return_and_die($ret);
+ }
+
+ // There should be exactly one recipient, the original auth requestor
+ $ret['message'] .= 'recipients ' . print_r($recipients,true) . EOL;
+ if($data['recipients']) {
+
+ $arr = $data['recipients'][0];
+ $recip_hash = base64url_encode(hash('whirlpool',$arr['guid'] . $arr['guid_sig'], true));
+ $c = q("select channel_id, channel_account_id, channel_prvkey from channel where channel_hash = '%s' limit 1",
+ dbesc($recip_hash)
+ );
+ if(! $c) {
+ logger('mod_zot: auth_check: recipient channel not found.');
+ $ret['message'] .= 'recipient not found.' . EOL;
+ json_return_and_die($ret);
}
+ $confirm = base64url_encode(rsa_sign($data['secret'] . $recip_hash,$c[0]['channel_prvkey']));
+
+ // This additionally checks for forged sites since we already stored the expected result in meta
+ // and we've already verified that this is them via zot_gethub() and that their key signed our token
+
+ $z = q("select id from verify where channel = %d and type = 'auth' and token = '%s' and meta = '%s' limit 1",
+ intval($c[0]['channel_id']),
+ dbesc($data['secret']),
+ dbesc($data['sender']['url'])
+ );
+ if(! $z) {
+ logger('mod_zot: auth_check: verification key not found.');
+ $ret['message'] .= 'verification key not found' . EOL;
+ json_return_and_die($ret);
+ }
+ $r = q("delete from verify where id = %d limit 1",
+ intval($z[0]['id'])
+ );
+
+ $u = q("select account_service_class from account where account_id = %d limit 1",
+ intval($c[0]['channel_account_id'])
+ );
+
+ logger('mod_zot: auth_check: success', LOGGER_DEBUG);
+ $ret['success'] = true;
+ $ret['confirm'] = $confirm;
+ if($u && $u[0]['account_service_class'])
+ $ret['service_class'] = $u[0]['account_service_class'];
+ json_return_and_die($ret);
}
+ json_return_and_die($ret);
+ }
+
+
+ if($msgtype === 'purge') {
+ if($recipients) {
+ // basically this means "unfriend"
+ foreach($recipients as $recip) {
+ $r = q("select channel.*,xchan.* from channel
+ left join xchan on channel_hash = xchan_hash
+ where channel_guid = '%s' and channel_guid_sig = '%s' limit 1",
+ dbesc($recip['guid']),
+ dbesc($recip['guid_sig'])
+ );
+ if($r) {
+ $r = q("select abook_id from abook where uid = %d and abook_xchan = '%s' limit 1",
+ intval($r[0]['channel_id']),
+ dbesc(base64url_encode(hash('whirlpool',$sender['guid'] . $sender['guid_sig'], true)))
+ );
+ if($r) {
+ contact_remove($r[0]['channel_id'],$r[0]['abook_id']);
+ }
+ }
+ }
+ }
else {
- // basically this means the channel has committed suicide
+ // Unfriend everybody - basically this means the channel has committed suicide
$arr = $data['sender'];
$sender_hash = base64url_encode(hash('whirlpool',$arr['guid'] . $arr['guid_sig'], true));
require_once('include/Contact.php');
remove_all_xchan_resources($sender_hash);
- $ret['result'] = true;
+ $ret['success'] = true;
json_return_and_die($ret);
}
}
+
if($msgtype === 'refresh') {
// remote channel info (such as permissions or photo or something)
@@ -295,7 +824,7 @@ function post_post(&$a) {
'hubloc_url' => $sender['url']
),null);
}
- $ret['result'] = true;
+ $ret['success'] = true;
json_return_and_die($ret);
}
@@ -311,67 +840,11 @@ function post_post(&$a) {
$ret['delivery_report'] = $x;
}
- $ret['result'] = true;
+ $ret['success'] = true;
json_return_and_die($ret);
}
- if($msgtype === 'auth_check') {
- $arr = $data['sender'];
- $sender_hash = base64url_encode(hash('whirlpool',$arr['guid'] . $arr['guid_sig'], true));
-
- // garbage collect any old unused notifications
- q("delete from verify where type = 'auth' and created < UTC_TIMESTAMP() - INTERVAL 10 MINUTE");
-
- $y = q("select xchan_pubkey from xchan where xchan_hash = '%s' limit 1",
- dbesc($sender_hash)
- );
- // We created a unique hash in mod/magic.php when we invoked remote auth, and stored it in
- // the verify table. It is now coming back to us as 'secret' and is signed by the other site.
- // First verify their signature.
-
- if((! $y) || (! rsa_verify($data['secret'],base64url_decode($data['secret_sig']),$y[0]['xchan_pubkey']))) {
- logger('mod_zot: auth_check: sender not found or secret_sig invalid.');
- json_return_and_die($ret);
- }
-
- // There should be exactly one recipient
- if($data['recipients']) {
-
- $arr = $data['recipients'][0];
- $recip_hash = base64url_encode(hash('whirlpool',$arr['guid'] . $arr['guid_sig'], true));
- $c = q("select channel_id from channel where channel_hash = '%s' limit 1",
- dbesc($recip_hash)
- );
- if(! $c) {
- logger('mod_zot: auth_check: recipient channel not found.');
- json_return_and_die($ret);
- }
-
- // This additionally checks for forged senders since we already stored the expected result in meta
- // and we've already verified that this is them via zot_gethub() and that their key signed our token
-
- $z = q("select id from verify where channel = %d and type = 'auth' and token = '%s' and meta = '%s' limit 1",
- intval($c[0]['channel_id']),
- dbesc($data['secret']),
- dbesc($sender_hash)
- );
- if(! $z) {
- logger('mod_zot: auth_check: verification key not found.');
- json_return_and_die($ret);
- }
- $r = q("delete from verify where id = %d limit 1",
- intval($z[0]['id'])
- );
-
- logger('mod_zot: auth_check: success', LOGGER_DEBUG);
- $ret['result'] = true;
- json_return_and_die($ret);
-
- }
- json_return_and_die($ret);
- }
-
// catchall
json_return_and_die($ret);
diff --git a/mod/probe.php b/mod/probe.php
index f90728df2..e2dd4ef77 100644
--- a/mod/probe.php
+++ b/mod/probe.php
@@ -1,6 +1,5 @@
<?php
-require_once('include/Scrape.php');
require_once('include/zot.php');
function probe_content(&$a) {
@@ -16,11 +15,18 @@ function probe_content(&$a) {
if(x($_GET,'addr')) {
$channel = $a->get_channel();
$addr = trim($_GET['addr']);
- $res = zot_finger($addr,$channel);
+ $res = zot_finger($addr,$channel,false);
$o .= '<pre>';
- $j = json_decode($res['body'],true);
+ if($res['success'])
+ $j = json_decode($res['body'],true);
+ else {
+ $o .= "<strong>https connection failed. Trying again with auto failover to http.</strong>\r\n\r\n";
+ $res = zot_finger($addr,$channel,true);
+ if($res['success'])
+ $j = json_decode($res['body'],true);
+ }
if($j && $j['permissions'] && $j['permissions']['iv'])
- $j['permissions'] = json_decode(aes_unencapsulate($j['permissions'],$channel['channel_prvkey']),true);
+ $j['permissions'] = json_decode(crypto_unencapsulate($j['permissions'],$channel['channel_prvkey']),true);
$o .= str_replace("\n",'<br />',print_r($j,true));
$o .= '</pre>';
}
diff --git a/mod/profile.php b/mod/profile.php
index 2f869a533..fca7c8f9f 100644
--- a/mod/profile.php
+++ b/mod/profile.php
@@ -1,4 +1,12 @@
-<?php
+<?php /** @file */
+
+require_once('include/contact_widgets.php');
+require_once('include/items.php');
+require_once("include/bbcode.php");
+require_once('include/security.php');
+require_once('include/conversation.php');
+require_once('include/acl_selectors.php');
+
function profile_init(&$a) {
@@ -10,94 +18,57 @@ function profile_init(&$a) {
return;
}
- $profile = 0;
+ $profile = '';
$channel = $a->get_channel();
if((local_user()) && (argc() > 2) && (argv(2) === 'view')) {
$which = $channel['channel_address'];
$profile = argv(1);
+ $r = q("select profile_guid from profile where id = %d and uid = %d limit 1",
+ intval($profile),
+ intval(local_user())
+ );
+ if(! $r)
+ $profile = '';
+ $profile = $r[0]['profile_guid'];
}
$a->page['htmlhead'] .= '<link rel="alternate" type="application/atom+xml" href="' . $a->get_baseurl() . '/feed/' . $which .'" />' . "\r\n" ;
- $x = q("select channel_id as profile_uid from channel where channel_address = '%s' limit 1",
- dbesc(argv(1))
- );
- if($x) {
- $a->profile = $x[0];
-// $channel_display = get_pconfig($a->profile['profile_uid'],'system','channel_format');
-// if(! $channel_display)
- profile_load($a,$which,$profile);
+ if(! $profile) {
+ $x = q("select channel_id as profile_uid from channel where channel_address = '%s' limit 1",
+ dbesc(argv(1))
+ );
+ if($x) {
+ $a->profile = $x[0];
+ }
}
-}
-
-
-function profile_aside(&$a) {
-
- require_once('include/contact_widgets.php');
- require_once('include/items.php');
+ profile_load($a,$which,$profile);
- profile_create_sidebar($a);
}
-
function profile_content(&$a, $update = 0) {
if(get_config('system','block_public') && (! get_account_id()) && (! remote_user())) {
return login();
}
-
- require_once("include/bbcode.php");
- require_once('include/security.php');
- require_once('include/conversation.php');
- require_once('include/acl_selectors.php');
- require_once('include/items.php');
-
$groups = array();
$tab = 'profile';
$o = '';
-
- $contact = null;
- $remote_contact = false;
-
- $contact_id = 0;
-
- if(is_array($_SESSION['remote'])) {
- foreach($_SESSION['remote'] as $v) {
- if($v['uid'] == $a->profile['profile_uid']) {
- $contact_id = $v['cid'];
- break;
- }
- }
- }
-
- if($contact_id) {
- $groups = init_groups_visitor($contact_id);
- $r = q("SELECT * FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1",
- intval($contact_id),
- intval($a->profile['profile_uid'])
- );
- if(count($r)) {
- $contact = $r[0];
- $remote_contact = true;
- }
+ if(! (perm_is_allowed($a->profile['profile_uid'],get_observer_hash(), 'view_profile'))) {
+ notice( t('Access to this profile has been restricted.') . EOL);
+ return;
}
- if(! $remote_contact) {
- if(local_user()) {
- $contact_id = $_SESSION['cid'];
- $contact = $a->contact;
- }
- }
$is_owner = ((local_user()) && (local_user() == $a->profile['profile_uid']) ? true : false);
- if($a->profile['hidewall'] && (! $is_owner) && (! $remote_contact)) {
+ if($a->profile['hidewall'] && (! $is_owner) && (! remote_user())) {
notice( t('Access to this profile has been restricted.') . EOL);
return;
}
@@ -106,7 +77,6 @@ function profile_content(&$a, $update = 0) {
$o .= profile_tabs($a, $is_owner, $a->profile['channel_address']);
- require_once('include/profile_advanced.php');
$o .= advanced_profile($a);
call_hooks('profile_advanced',$o);
return $o;
diff --git a/mod/profile_photo.php b/mod/profile_photo.php
index ea7a01bc9..876e3a931 100644
--- a/mod/profile_photo.php
+++ b/mod/profile_photo.php
@@ -1,6 +1,6 @@
<?php
-require_once("Photo.php");
+require_once('include/photo/photo_driver.php');
function profile_photo_init(&$a) {
@@ -14,16 +14,6 @@ function profile_photo_init(&$a) {
}
-function profile_photo_aside(&$a) {
-
- if(! local_user()) {
- return;
- }
-
- profile_create_sidebar($a);
-}
-
-
function profile_photo_post(&$a) {
if(! local_user()) {
@@ -42,7 +32,7 @@ function profile_photo_post(&$a) {
intval($_REQUEST['profile']),
intval(local_user())
);
- if(count($r) && (! intval($r[0]['is_default'])))
+ if(($r) && (! intval($r[0]['is_default'])))
$is_default_profile = 0;
}
@@ -77,25 +67,30 @@ function profile_photo_post(&$a) {
$base_image = $r[0];
- $im = new Photo($base_image['data'], $base_image['type']);
+ $im = photo_factory($base_image['data'], $base_image['type']);
if($im->is_valid()) {
$im->cropImage(175,$srcX,$srcY,$srcW,$srcH);
$aid = get_account_id();
- $r1 = $im->store($aid, local_user(), '', $base_image['resource_id'],$base_image['filename'],
- t('Profile Photos'), 4, $is_default_profile);
+ $p = array('aid' => $aid, 'uid' => local_user(), 'resource_id' => $base_image['resource_id'],
+ 'filename' => $base_image['filename'], 'album' => t('Profile Photos'));
+
+ $p['scale'] = 4;
+ $p['photo_flags'] = (($is_default_profile) ? PHOTO_PROFILE : PHOTO_NORMAL);
+
+ $r1 = $im->save($p);
$im->scaleImage(80);
+ $p['scale'] = 5;
- $r2 = $im->store($aid, local_user(), '', $base_image['resource_id'],$base_image['filename'],
- t('Profile Photos'), 5, $is_default_profile);
+ $r2 = $im->save($p);
$im->scaleImage(48);
+ $p['scale'] = 6;
- $r3 = $im->store($aid, local_user(), '', $base_image['resource_id'],$base_image['filename'],
- t('Profile Photos'), 6, $is_default_profile);
+ $r3 = $im->save($p);
if($r1 === false || $r2 === false || $r3 === false) {
// if one failed, delete them all so we can start over.
@@ -114,6 +109,13 @@ function profile_photo_post(&$a) {
dbesc($base_image['resource_id']),
intval(local_user())
);
+ $r = q("UPDATE photo SET photo_flags = ( photo_flags ^ %d ) WHERE ( photo_flags & %d )
+ AND resource_id != '%s' AND `uid` = %d",
+ intval(PHOTO_PROFILE),
+ intval(PHOTO_PROFILE),
+ dbesc($base_image['resource_id']),
+ intval(local_user())
+ );
}
else {
$r = q("update profile set photo = '%s', thumb = '%s' where id = %d and uid = %d limit 1",
@@ -164,7 +166,7 @@ function profile_photo_post(&$a) {
}
$imagedata = @file_get_contents($src);
- $ph = new Photo($imagedata, $filetype);
+ $ph = photo_factory($imagedata, $filetype);
if(! $ph->is_valid()) {
notice( t('Unable to process image.') . EOL );
@@ -224,6 +226,10 @@ function profile_photo_content(&$a) {
// unset any existing profile photos
$r = q("UPDATE photo SET profile = 0 WHERE profile = 1 AND uid = %d",
intval(local_user()));
+ $r = q("UPDATE photo SET photo_flags = (photo_flags ^ %d ) WHERE (photo_flags & %d ) AND uid = %d",
+ intval(PHOTO_PROFILE),
+ intval(PHOTO_PROFILE),
+ intval(local_user()));
// set all sizes of this one as profile photos
$r = q("UPDATE photo SET profile = 1 WHERE uid = %d AND resource_id = '%s'",
@@ -231,6 +237,12 @@ function profile_photo_content(&$a) {
dbesc($resource_id)
);
+ $r = q("UPDATE photo SET photo_flags = ( photo_flags | %d ) WHERE uid = %d AND resource_id = '%s'",
+ intval(PHOTO_PROFILE),
+ intval(local_user()),
+ dbesc($resource_id)
+ );
+
$r = q("UPDATE xchan set xchan_photo_date = '%s'
where xchan_hash = '%s' limit 1",
dbesc(datetime_convert()),
@@ -241,7 +253,7 @@ function profile_photo_content(&$a) {
goaway($a->get_baseurl() . '/profiles');
}
- $r = q("SELECT data, type FROM photo WHERE id = %d and uid = %d limit 1",
+ $r = q("SELECT `data`, `type` FROM photo WHERE id = %d and uid = %d limit 1",
intval($r[0]['id']),
intval(local_user())
@@ -251,7 +263,7 @@ function profile_photo_content(&$a) {
return;
}
- $ph = new Photo($r[0]['data'], $r[0]['type']);
+ $ph = photo_factory($r[0]['data'], $r[0]['type']);
// go ahead as if we have just uploaded a new photo to crop
profile_photo_crop_ui_head($a, $ph);
}
@@ -320,7 +332,9 @@ function profile_photo_crop_ui_head(&$a, $ph){
$hash = photo_new_resource();
$smallest = 0;
- $r = $ph->store(get_account_id(), local_user(), '', $hash, $filename, t('Profile Photos'), 0 );
+ $p = array('aid' => get_account_id(), 'uid' => local_user(), 'resource_id' => $hash,
+ 'filename' => $filename, 'album' => t('Profile Photos'), 'scale' => 0);
+ $r = $ph->save($p);
if($r)
info( t('Image uploaded successfully.') . EOL );
@@ -329,7 +343,9 @@ function profile_photo_crop_ui_head(&$a, $ph){
if($width > 640 || $height > 640) {
$ph->scaleImage(640);
- $r = $ph->store(get_account_id(), local_user(), '' , $hash, $filename, t('Profile Photos'), 1 );
+ $p['scale'] = 1;
+
+ $r = $ph->save($p);
if($r === false)
notice( sprintf(t('Image size reduction [%s] failed.'),"640") . EOL );
diff --git a/mod/profiles.php b/mod/profiles.php
index e857c4216..b94e4bf03 100644
--- a/mod/profiles.php
+++ b/mod/profiles.php
@@ -47,7 +47,7 @@ function profiles_init(&$a) {
if((argc() > 1) && (argv(1) === 'new')) {
- check_form_security_token_redirectOnErr('/profiles', 'profile_new', 't');
+// check_form_security_token_redirectOnErr('/profiles', 'profile_new', 't');
$r0 = q("SELECT `id` FROM `profile` WHERE `uid` = %d",
intval(local_user()));
@@ -59,7 +59,7 @@ function profiles_init(&$a) {
intval(local_user()));
$r2 = q("INSERT INTO `profile` (`aid`, `uid` , `profile_guid`, `profile_name` , `name`, `photo`, `thumb`)
- VALUES ( %d, '%s', '%s', '%s', '%s' )",
+ VALUES ( %d, '%s', '%s', '%s', '%s', '%s', '%s' )",
intval(get_account_id()),
intval(local_user()),
dbesc(random_string()),
@@ -146,17 +146,6 @@ function profiles_init(&$a) {
}
}
-function profiles_aside(&$a) {
-
- if(! local_user()) {
- return;
- }
-
- if((argc() > 1) && (intval(argv(1)))) {
- profile_create_sidebar($a);
- }
-}
-
function profiles_post(&$a) {
if(! local_user()) {
@@ -200,6 +189,11 @@ function profiles_post(&$a) {
$day = intval($_POST['day']);
if(($day > $mtab[$month]) || ($day < 0))
$day = 0;
+
+ if($year && (! ($month && $day))) {
+ $month = 1; $day = 1;
+ }
+
$dob = '0000-00-00';
$dob = sprintf('%04d-%02d-%02d',$year,$month,$day);
@@ -232,6 +226,7 @@ function profiles_post(&$a) {
$about = fix_mce_lf(escape_tags(trim($_POST['about'])));
$interest = fix_mce_lf(escape_tags(trim($_POST['interest'])));
$contact = fix_mce_lf(escape_tags(trim($_POST['contact'])));
+ $channels = fix_mce_lf(escape_tags(trim($_POST['channels'])));
$music = fix_mce_lf(escape_tags(trim($_POST['music'])));
$book = fix_mce_lf(escape_tags(trim($_POST['book'])));
$tv = fix_mce_lf(escape_tags(trim($_POST['tv'])));
@@ -393,6 +388,7 @@ function profiles_post(&$a) {
`about` = '%s',
`interest` = '%s',
`contact` = '%s',
+ `channels` = '%s',
`music` = '%s',
`book` = '%s',
`tv` = '%s',
@@ -426,6 +422,7 @@ function profiles_post(&$a) {
dbesc($about),
dbesc($interest),
dbesc($contact),
+ dbesc($channels),
dbesc($music),
dbesc($book),
dbesc($tv),
@@ -444,7 +441,7 @@ function profiles_post(&$a) {
$channel = $a->get_channel();
if($namechanged && $is_default) {
- $r = q("UPDATE xchan SET xchan_name = '%s', xchan_name_date` = '%s' WHERE xchan_hash = '%s' limit 1",
+ $r = q("UPDATE xchan SET xchan_name = '%s', xchan_name_date = '%s' WHERE xchan_hash = '%s' limit 1",
dbesc($name),
dbesc(datetime_convert()),
dbesc($channel['xchan_hash'])
@@ -516,6 +513,7 @@ function profiles_content(&$a) {
'$profile_drop_link' => 'profiles/drop/' . $r[0]['id'] . '?t='
. get_form_security_token("profile_drop"),
+ '$guid' => $r[0]['profile_guid'],
'$banner' => t('Edit Profile Details'),
'$submit' => t('Submit'),
'$viewprof' => t('View this profile'),
@@ -550,6 +548,7 @@ function profiles_content(&$a) {
'$lbl_about' => t('Tell us about yourself...'),
'$lbl_hobbies' => t('Hobbies/Interests'),
'$lbl_social' => t('Contact information and Social Networks'),
+ '$lbl_channels' => t('My other channels'),
'$lbl_music' => t('Musical interests'),
'$lbl_book' => t('Books, literature'),
'$lbl_tv' => t('Television'),
@@ -593,7 +592,8 @@ function profiles_content(&$a) {
'$romance' => $r[0]['romance'],
'$work' => $r[0]['work'],
'$education' => $r[0]['education'],
- '$contact' => $r[0]['contact']
+ '$contact' => $r[0]['contact'],
+ '$channels' => $r[0]['channels'],
));
$arr = array('profile' => $r[0], 'entry' => $o);
@@ -610,6 +610,8 @@ function profiles_content(&$a) {
$tpl_header = get_markup_template('profile_listing_header.tpl');
$o .= replace_macros($tpl_header,array(
'$header' => t('Edit/Manage Profiles'),
+ '$addstuff' => t('Add profile things'),
+ '$stuff_desc' => t('Include desirable objects in your profile'),
'$chg_photo' => t('Change profile photo'),
'$cr_new' => t('Create New Profile'),
'$cr_new_link' => 'profiles/new?t=' . get_form_security_token("profile_new")
diff --git a/mod/profperm.php b/mod/profperm.php
index 8054851e8..b31dfc128 100644
--- a/mod/profperm.php
+++ b/mod/profperm.php
@@ -13,15 +13,6 @@ function profperm_init(&$a) {
}
-function profperm_aside(&$a) {
-
- if(! local_user())
- return;
-
- profile_create_sidebar($a);
-}
-
-
function profperm_content(&$a) {
if(! local_user()) {
diff --git a/mod/pubsites.php b/mod/pubsites.php
new file mode 100644
index 000000000..c08ca2ae5
--- /dev/null
+++ b/mod/pubsites.php
@@ -0,0 +1,42 @@
+<?php
+
+function pubsites_content(&$a) {
+ require_once('include/dir_fns.php');
+ $dirmode = intval(get_config('system','directory_mode'));
+
+ if(($dirmode == DIRECTORY_MODE_PRIMARY) || ($dirmode == DIRECTORY_MODE_STANDALONE)) {
+ $url = z_root() . '/dirsearch';
+ }
+ if(! $url) {
+ $directory = find_upstream_directory($dirmode);
+
+ if($directory) {
+ $url = $directory['url'] . '/dirsearch';
+ }
+ else {
+ $url = DIRECTORY_FALLBACK_MASTER . '/dirsearch';
+ }
+ }
+ $url .= '/sites';
+
+ $o .= '<h1>' . t('Public Sites') . '</h1>';
+
+ $o .= '<div class="descriptive-text">' .
+ t('The listed sites allow public registration into the Red Matrix. All sites in the matrix are interlinked so membership on any of them conveys membership in the matrix as a whole. Some sites may require subscription or provide tiered service plans. The provider links <strong>may</strong> provide additional details.') . '</div>' . EOL;
+
+ $ret = z_fetch_url($url);
+ if($ret['success']) {
+ $j = json_decode($ret['body'],true);
+ if($j) {
+ $o .= '<table border="1"><tr><td>' . t('Site URL') . '</td><td>' . t('Access Type') . '</td><td>' . t('Registration Policy') . '</td><td>' . t('Location') . '</td></tr>';
+ if($j['sites']) {
+ foreach($j['sites'] as $jj) {
+ $o .= '<tr><td>' . '<a href="'. (($jj['sellpage']) ? $jj['sellpage'] : $jj['url'] . '/register' ) . '" >' . $jj['url'] . '</a>' . '</td><td>' . $jj['access'] . '</td><td>' . $jj['register'] . '</td><td>' . $jj['location'] . '</td></tr>';
+ }
+ }
+
+ $o .= '</table>';
+ }
+ }
+ return $o;
+}
diff --git a/mod/qsearch.php b/mod/qsearch.php
deleted file mode 100644
index c35e253b6..000000000
--- a/mod/qsearch.php
+++ /dev/null
@@ -1,50 +0,0 @@
-<?php
-
-function qsearch_init(&$a) {
-
- if(! local_user())
- killme();
-
- $limit = (get_config('system','qsearch_limit') ? intval(get_config('system','qsearch_limit')) : 100);
-
- $search = ((x($_GET,'s')) ? notags(trim(urldecode($_GET['s']))) : '');
-
- if(! strlen($search))
- killme();
-
-
- if($search)
- $search = dbesc($search);
-
- $results = array();
-
- $r = q("SELECT * FROM `group` WHERE `name` REGEXP '$search' AND `deleted` = 0 AND `uid` = %d LIMIT 0, %d ",
- intval(local_user()),
- intval($limit)
- );
-
- if(count($r)) {
-
- foreach($r as $rr)
- $results[] = array( 0, (int) $rr['id'], $rr['name'], '', '');
- }
-
- $sql_extra = ((strlen($search)) ? " AND (`name` REGEXP '$search' OR `nick` REGEXP '$search') " : "");
-
-
- $r = q("SELECT * FROM `contact` WHERE `uid` = %d $sql_extra ORDER BY `name` ASC LIMIT 0, %d ",
- intval(local_user()),
- intval($limit)
- );
-
-
- if(count($r)) {
-
- foreach($r as $rr)
- $results[] = array( (int) $rr['id'], 0, $rr['name'],$rr['url'],$rr['photo']);
- }
-
- echo json_encode((object) $results);
- killme();
-}
-
diff --git a/mod/randprof.php b/mod/randprof.php
index 0726b231a..bddb3251a 100644
--- a/mod/randprof.php
+++ b/mod/randprof.php
@@ -5,6 +5,7 @@ function randprof_init(&$a) {
require_once('include/Contact.php');
$x = random_profile();
if($x)
- goaway(zid($x));
+ goaway(chanlink_url($x));
+ // FIXME this doesn't work at the moment as a fallback
goaway($a->get_baseurl() . '/profile');
}
diff --git a/mod/redir.php b/mod/redir.php
deleted file mode 100644
index 113f6c200..000000000
--- a/mod/redir.php
+++ /dev/null
@@ -1,60 +0,0 @@
-<?php
-
-function redir_init(&$a) {
-
- $url = ((x($_GET,'url')) ? $_GET['url'] : '');
-
- // traditional DFRN
-
- if(local_user() && $a->argc > 1 && intval($a->argv[1])) {
-
- $cid = $a->argv[1];
-
- $r = q("SELECT * FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1",
- intval($cid),
- intval(local_user())
- );
-
- if((! count($r)) || ($r[0]['network'] !== NETWORK_DFRN))
- goaway(z_root());
-
- $dfrn_id = $orig_id = (($r[0]['issued_id']) ? $r[0]['issued_id'] : $r[0]['dfrn_id']);
-
- if($r[0]['duplex'] && $r[0]['issued_id']) {
- $orig_id = $r[0]['issued_id'];
- $dfrn_id = '1:' . $orig_id;
- }
- if($r[0]['duplex'] && $r[0]['dfrn_id']) {
- $orig_id = $r[0]['dfrn_id'];
- $dfrn_id = '0:' . $orig_id;
- }
-
- $sec = random_string();
-
- q("INSERT INTO `profile_check` ( `uid`, `cid`, `dfrn_id`, `sec`, `expire`)
- VALUES( %d, %s, '%s', '%s', %d )",
- intval(local_user()),
- intval($cid),
- dbesc($dfrn_id),
- dbesc($sec),
- intval(time() + 45)
- );
-
- logger('mod_redir: ' . $r[0]['name'] . ' ' . $sec, LOGGER_DEBUG);
- $dest = (($url) ? '&destination_url=' . $url : '');
- goaway ($r[0]['poll'] . '?dfrn_id=' . $dfrn_id
- . '&dfrn_version=' . DFRN_PROTOCOL_VERSION . '&type=profile&sec=' . $sec . $dest );
- }
-
- if(local_user())
- $handle = $a->user['nickname'] . '@' . substr($a->get_baseurl(),strpos($a->get_baseurl(),'://')+3);
- if(remote_user())
- $handle = $_SESSION['handle'];
-
- if($url) {
- $url = str_replace('{zid}','&zid=' . $handle,$url);
- goaway($url);
- }
-
- goaway(z_root());
-}
diff --git a/mod/register.php b/mod/register.php
index 3ba714c74..990cce2ed 100644
--- a/mod/register.php
+++ b/mod/register.php
@@ -7,6 +7,14 @@ function register_init(&$a) {
$result = null;
$cmd = ((argc() > 1) ? argv(1) : '');
+ // Provide a stored request for somebody desiring a connection
+ // when they first need to register someplace. Once they've
+ // created a channel, we'll try to revive the connection request
+ // and process it.
+
+ if($_REQUEST['connect'])
+ $_SESSION['connect'] = $_REQUEST['connect'];
+
switch($cmd) {
case 'invite_check.json':
$result = check_account_invite($_REQUEST['invite_code']);
@@ -64,6 +72,12 @@ function register_post(&$a) {
break;
}
+
+ if((! $_POST['password']) || ($_POST['password'] !== $_POST['password2'])) {
+ notice( t('Passwords do not match.') . EOL);
+ return;
+ }
+
$arr = $_POST;
$arr['account_flags'] = $flags;
@@ -121,10 +135,17 @@ function register_post(&$a) {
function register_content(&$a) {
+ $registration_is = '';
+ $other_sites = '';
if(get_config('system','register_policy') == REGISTER_CLOSED) {
- notice("Permission denied." . EOL);
- return;
+ require_once('mod/pubsites.php');
+ return pubsites_content($a);
+ }
+
+ if(get_config('system','register_policy') == REGISTER_APPROVE) {
+ $registration_is = t('Registration on this site/hub is by approval only.');
+ $other_sites = t('<a href="pubsites">Register at another affiliated site/hub</a>');
}
$max_dailies = intval(get_config('system','max_daily_registrations'));
@@ -161,10 +182,14 @@ function register_content(&$a) {
$invite_code = ((x($_REQUEST,'invite_code')) ? strip_tags(trim($_REQUEST['invite_code'])) : "" );
+
+
$o = replace_macros(get_markup_template('register.tpl'), array(
'$title' => t('Registration'),
+ '$reg_is' => $registration_is,
'$registertext' => get_config('system','register_text'),
+ '$other_sites' => $other_sites,
'$invitations' => get_config('system','invitation_only'),
'$invite_desc' => t('Membership on this site is by invitation only.'),
'$label_invite' => t('Please enter your invitation code'),
diff --git a/mod/removeme.php b/mod/removeme.php
index ee88bd76a..7af4719bd 100644
--- a/mod/removeme.php
+++ b/mod/removeme.php
@@ -17,13 +17,17 @@ function removeme_post(&$a) {
if($_POST['verify'] !== $_SESSION['remove_account_verify'])
return;
- $encrypted = hash('whirlpool',trim($_POST['qxz_password']));
- if((strlen($a->user['password'])) && ($encrypted === $a->user['password'])) {
- require_once('include/Contact.php');
- user_remove($a->user['uid']);
- // NOTREACHED
- }
+ $account = $a->get_account();
+
+ if(! account_verify_password($account['account_email'],$_POST['qxz_password']))
+ return;
+
+ require_once('include/Contact.php');
+
+ $global_remove = intval($_POST['global']);
+
+ channel_remove(local_user(),1 - $global_remove);
}
@@ -42,9 +46,10 @@ function removeme_content(&$a) {
$o .= replace_macros($tpl, array(
'$basedir' => $a->get_baseurl(),
'$hash' => $hash,
- '$title' => t('Remove My Account'),
- '$desc' => t('This will completely remove your account. Once this has been done it is not recoverable.'),
+ '$title' => t('Remove This Channel'),
+ '$desc' => t('This will completely remove this channel from the network. Once this has been done it is not recoverable.'),
'$passwd' => t('Please enter your password for verification:'),
+ '$global' => array('global', t('Remove this channel and all its clones from the network'), false, t('By default only the instance of the channel located on this hub will be removed from the network')),
'$submit' => t('Remove My Account')
));
diff --git a/mod/rpost.php b/mod/rpost.php
new file mode 100644
index 000000000..8e01ef5d4
--- /dev/null
+++ b/mod/rpost.php
@@ -0,0 +1,122 @@
+<?php /** @file */
+
+require_once('acl_selectors.php');
+require_once('include/crypto.php');
+require_once('include/items.php');
+require_once('include/taxonomy.php');
+require_once('include/conversation.php');
+require_once('include/zot.php');
+
+/**
+ * remote post
+ *
+ * https://yoursite/rpost?f=&title=&body=&remote_return=
+ *
+ * This can be called via either GET or POST, use POST for long body content as suhosin often limits GET parameter length
+ *
+ * f= placeholder, often required
+ * title= Title of post
+ * body= Body of post
+ * source= Source application
+ * remote_return= absolute URL to return after posting is finished
+ * type= choices are 'html' or 'bbcode', default is 'bbcode'
+ *
+ */
+
+
+
+function rpost_content(&$a) {
+
+ $o = '';
+
+ if(! local_user()) {
+ if(remote_user()) {
+ // redirect to your own site.
+ // We can only do this with a GET request so you'll need to keep the text short or risk getting truncated
+ // by the wretched beast called 'shusoin'. All the browsers now allow long GET requests, but suhosin
+ // blocks them.
+
+ $url = get_rpost_path($a->get_observer());
+ // make sure we're not looping to our own hub
+ if(($url) && (! stristr($url, $a->get_hostname()))) {
+ foreach($_REQUEST as $key => $arg) {
+ $url .= '&' . $key . '=' . $arg;
+ }
+ goaway($url);
+ }
+ }
+
+ // The login procedure is going to bugger our $_REQUEST variables
+ // so save them in the session.
+
+ if(array_key_exists('body',$_REQUEST)) {
+ $_SESSION['rpost'] = $_REQUEST;
+ }
+ return login();
+ }
+
+ // If we have saved rpost session variables, but nothing in the current $_REQUEST, recover the saved variables
+
+ if((! array_key_exists('body',$_REQUEST)) && (array_key_exists('rpost',$_SESSION))) {
+ $_REQUEST = $_SESSION['rpost'];
+ unset($_SESSION['rpost']);
+ }
+
+ if($_REQUEST['remote_return']) {
+ $_SESSION['remote_return'] = $_REQUEST['remote_return'];
+ }
+ if(argc() > 1 && argv(1) === 'return' && $_SESSION['remote_return']) {
+ goaway($_SESSION['remote_return']);
+ }
+
+ $plaintext = true;
+ if(feature_enabled(local_user(),'richtext'))
+ $plaintext = false;
+
+ if(array_key_exists('type', $_REQUEST) && $_REQUEST['type'] === 'html') {
+ require_once('include/html2bbcode.php');
+ $_REQUEST['body'] = html2bbcode($_REQUEST['body']);
+ }
+
+ $channel = $a->get_channel();
+
+ $o .= replace_macros(get_markup_template('edpost_head.tpl'), array(
+ '$title' => t('Edit post')
+ ));
+
+
+// $a->page['htmlhead'] .= replace_macros(get_markup_template('jot-header.tpl'), array(
+// '$baseurl' => $a->get_baseurl(),
+// '$editselect' => (($plaintext) ? 'none' : '/(profile-jot-text|prvmail-text)/'),
+// '$ispublic' => '&nbsp;', // t('Visible to <strong>everybody</strong>'),
+// '$geotag' => $geotag,
+// '$nickname' => $channel['channel_address']
+// ));
+
+
+
+ $x = array(
+ 'is_owner' => true,
+ 'allow_location' => ((intval(get_pconfig($channel['channel_id'],'system','use_browser_location'))) ? '1' : ''),
+ 'default_location' => $channel['channel_location'],
+ 'nickname' => $channel['channel_address'],
+ 'lockstate' => (($channel['channel_allow_cid'] || $channel['channel_allow_gid']
+ || $channel['channel_deny_cid'] || $channel['channel_deny_gid']) ? 'lock' : 'unlock'),
+ 'acl' => populate_acl($channel, $false),
+ 'bang' => '',
+ 'visitor' => 'block',
+ 'profile_uid' => local_user(),
+ 'title' => $_REQUEST['title'],
+ 'body' => $_REQUEST['body'],
+ 'source' => ((x($_REQUEST,'source')) ? strip_tags($_REQUEST['source']) : ''),
+ 'return_path' => 'rpost/return'
+ );
+
+
+ $o .= status_editor($a,$x);
+
+ return $o;
+
+}
+
+
diff --git a/mod/search.php b/mod/search.php
index 1bea720a6..d13c613c2 100644
--- a/mod/search.php
+++ b/mod/search.php
@@ -1,80 +1,12 @@
<?php
-function search_saved_searches() {
-
- if(! feature_enabled(local_user(),'savedsearch'))
- return '';
-
- $o = '';
-
- $r = q("select `tid`,`term` from `term` WHERE `uid` = %d and type = %d",
- intval(local_user()),
- intval(TERM_SAVEDSEARCH)
- );
-
- if(count($r)) {
- $o .= '<div id="saved-search-list" class="widget">';
- $o .= '<h3>' . t('Saved Searches') . '</h3>' . "\r\n";
- $o .= '<ul id="saved-search-ul">' . "\r\n";
- foreach($r as $rr) {
- $o .= '<li class="saved-search-li clear"><a href="search/?f=&remove=1&search=' . $rr['term'] . '" class="icon drophide savedsearchdrop" title="' . t('Remove term') . '" onclick="return confirmDelete();" onmouseover="imgbright(this);" onmouseout="imgdull(this);" ></a> <a href="search/?f=&search=' . $rr['term'] . '" class="savedsearchterm" >' . htmlspecialchars($rr['term']) . '</a></li>' . "\r\n";
- }
- $o .= '</ul><div class="clear"></div></div>' . "\r\n";
- }
-
- return $o;
-
-}
-
-
function search_init(&$a) {
-
- $search = ((x($_GET,'search')) ? trim(rawurldecode($_GET['search'])) : '');
-
- if(local_user()) {
- if(x($_GET,'save') && $search) {
- $r = q("select `tid` from `term` where `uid` = %d and `type` = %d and `term` = '%s' limit 1",
- intval(local_user()),
- intval(TERM_SAVEDSEARCH),
- dbesc($search)
- );
- if(! count($r)) {
- q("insert into `term` ( `uid`,`type`,`term` ) values ( %d, %d, '%s') ",
- intval(local_user()),
- intval(TERM_SAVEDSEARCH),
- dbesc($search)
- );
- }
- }
- if(x($_GET,'remove') && $search) {
- q("delete from `term` where `uid` = %d and `type` = %d and `term` = '%s' limit 1",
- intval(local_user()),
- intval(TERM_SAVEDSEARCH),
- dbesc($search)
- );
- }
-
- $a->page['aside'] .= search_saved_searches();
-
- }
- else {
- unset($_SESSION['theme']);
- unset($_SESSION['mobile-theme']);
- }
-
-
-
-}
-
-
-
-function search_post(&$a) {
- if(x($_POST,'search'))
- $a->data['search'] = $_POST['search'];
+ if(x($_REQUEST,'search'))
+ $a->data['search'] = $_REQUEST['search'];
}
-function search_content(&$a) {
+function search_content(&$a,$update = 0, $load = false) {
if((get_config('system','block_public')) && (! local_user()) && (! remote_user())) {
notice( t('Public access denied.') . EOL);
@@ -133,10 +65,7 @@ function search_content(&$a) {
);
}
else {
- if (get_config('system','use_fulltext_engine'))
- $sql_extra = sprintf(" AND MATCH (`item`.`body`) AGAINST ('".'"%s"'."' in boolean mode) ", dbesc(protect_sprintf($search)));
- else
- $sql_extra = sprintf(" AND `item`.`body` REGEXP '%s' ", dbesc(protect_sprintf(preg_quote($search))));
+ $sql_extra = sprintf(" AND `item`.`body` REGEXP '%s' ", dbesc(protect_sprintf(preg_quote($search))));
}
// Here is the way permissions work in the search module...
@@ -144,16 +73,13 @@ function search_content(&$a) {
// OR your own posts if you are a logged in member
// No items will be shown if the member has a blocked profile wall.
-
-
-
if((! $update) && (! $load)) {
// This is ugly, but we can't pass the profile_uid through the session to the ajax updater,
// because browser prefetching might change it on us. We have to deliver it with the page.
$o .= '<div id="live-search"></div>' . "\r\n";
- $o .= "<script> var profile_uid = " . $a->profile['profile_uid']
+ $o .= "<script> var profile_uid = " . ((intval(local_user())) ? local_user() : (-1))
. "; var netargs = '?f='; var profile_page = " . $a->pager['page'] . "; </script>\r\n";
$a->page['htmlhead'] .= replace_macros(get_markup_template("build_query.tpl"),array(
@@ -170,12 +96,13 @@ function search_content(&$a) {
'$spam' => '0',
'$nouveau' => '0',
'$wall' => '0',
+ '$list' => ((x($_REQUEST,'list')) ? intval($_REQUEST['list']) : 0),
'$page' => (($a->pager['page'] != 1) ? $a->pager['page'] : 1),
- '$search' => (($tag) ? '#' : '') . $search,
+ '$search' => (($tag) ? urlencode('#') : '') . $search,
'$order' => '',
'$file' => '',
'$cats' => '',
- '$uri' => '',
+ '$mid' => '',
'$dend' => '',
'$dbegin' => ''
));
@@ -183,23 +110,39 @@ function search_content(&$a) {
}
-
+ $pub_sql = public_permissions_sql(get_observer_hash());
if(($update) && ($load)) {
-
+ $itemspage = get_pconfig(local_user(),'system','itemspage');
+ $a->set_pager_itemspage(((intval($itemspage)) ? $itemspage : 20));
$pager_sql = sprintf(" LIMIT %d, %d ",intval($a->pager['start']), intval($a->pager['itemspage']));
if($load) {
- $r = q("SELECT distinct(uri), item.* from item
- WHERE item_restrict = 0
- AND (( `item`.`allow_cid` = '' AND `item`.`allow_gid` = '' AND `item`.`deny_cid` = '' AND `item`.`deny_gid` = '' AND item_private = 0 )
- OR ( `item`.`uid` = %d ))
- $sql_extra
- group by uri ORDER BY created DESC $pager_sql ",
- intval(local_user()),
- intval(ABOOK_FLAG_BLOCKED)
-
- );
+ $r = null;
+
+ if(local_user()) {
+ $r = q("SELECT distinct mid, item.id as item_id, item.* from item
+ WHERE item_restrict = 0
+ AND (( `item`.`allow_cid` = '' AND `item`.`allow_gid` = '' AND `item`.`deny_cid` = '' AND `item`.`deny_gid` = '' AND item_private = 0 )
+ OR ( `item`.`uid` = %d ))
+ $sql_extra
+ group by mid ORDER BY created DESC $pager_sql ",
+ intval(local_user()),
+ intval(ABOOK_FLAG_BLOCKED)
+
+ );
+ }
+ if($r === null) {
+ $r = q("SELECT distinct mid, item.id as item_id, item.* from item
+ WHERE item_restrict = 0
+ AND ((( `item`.`allow_cid` = '' AND `item`.`allow_gid` = '' AND `item`.`deny_cid` = ''
+ AND `item`.`deny_gid` = '' AND item_private = 0 )
+ and owner_xchan in ( " . stream_perms_xchans(($observer) ? PERMS_NETWORK : PERMS_PUBLIC) . " ))
+ $pub_sql )
+ $sql_extra
+ group by mid ORDER BY created DESC $pager_sql"
+ );
+ }
}
else {
$r = array();
@@ -207,64 +150,18 @@ function search_content(&$a) {
}
if($r) {
-
- $parents_str = ids_to_querystr($r,'item_id');
-
- $items = q("SELECT `item`.*, `item`.`id` AS `item_id`
- FROM `item`
- WHERE item_restrict = 0 and
- $sql_extra ",
- intval($a->profile['profile_uid']),
- dbesc($parents_str)
- );
-
- xchan_query($items);
- $items = fetch_post_tags($items,true);
- $items = conv_sort($items,'created');
-
+ xchan_query($r);
+ $items = fetch_post_tags($r,true);
} else {
$items = array();
}
-
-
- $r = q("SELECT distinct(`item`.`uri`), `item`.*, `item`.`id` AS `item_id`,
- `contact`.`name`, `contact`.`photo`, `contact`.`url`, `contact`.`alias`, `contact`.`rel`,
- `contact`.`network`, `contact`.`thumb`, `contact`.`self`, `contact`.`writable`,
- `contact`.`id` AS `cid`, `contact`.`uid` AS `contact-uid`,
- `user`.`nickname`
- FROM `item` LEFT JOIN `contact` ON `contact`.`id` = `item`.`contact-id`
- LEFT JOIN `user` ON `user`.`uid` = `item`.`uid`
- WHERE `item`.`visible` = 1 AND `item`.`deleted` = 0 and `item`.`moderated` = 0
- AND (( `item`.`allow_cid` = '' AND `item`.`allow_gid` = '' AND `item`.`deny_cid` = '' AND `item`.`deny_gid` = '' AND `item`.`private` = 0 AND `user`.`hidewall` = 0 )
- OR `item`.`uid` = %d )
- AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0
- $sql_extra
- group by `item`.`uri`
- ORDER BY `received` DESC LIMIT %d , %d ",
- intval(local_user()),
- intval($a->pager['start']),
- intval($a->pager['itemspage'])
-
- );
-
-
-// $a = fetch_post_tags($a,true);
-
- if(! count($r)) {
- info( t('No results.') . EOL);
- return $o;
- }
-
-
if($tag)
- $o .= '<h2>Items tagged with: ' . htmlspecialchars($search) . '</h2>';
+ $o .= '<h2>Items tagged with: ' . htmlspecialchars($search, ENT_COMPAT,'UTF-8') . '</h2>';
else
- $o .= '<h2>Search results for: ' . htmlspecialchars($search) . '</h2>';
-
- $o .= conversation($a,$r,'search',false);
+ $o .= '<h2>Search results for: ' . htmlspecialchars($search, ENT_COMPAT,'UTF-8') . '</h2>';
- $o .= alt_pager($a,count($r));
+ $o .= conversation($a,$items,'search',$update,'client');
return $o;
}
diff --git a/mod/search_ac.php b/mod/search_ac.php
index 5bc3c1c0b..36da21376 100644
--- a/mod/search_ac.php
+++ b/mod/search_ac.php
@@ -27,43 +27,27 @@ function search_ac_init(&$a){
// Priority to people searches
if ($search) {
- $people_sql_extra = protect_sprintf(" AND `name` LIKE '%". dbesc($search) . "%' ");
+ $people_sql_extra = protect_sprintf(" AND `xchan_name` LIKE '%". dbesc($search) . "%' ");
$tag_sql_extra = protect_sprintf(" AND term LIKE '%". dbesc($search) . "%' ");
}
- $r = q("SELECT `id`, `name`, `micro`, `url` FROM `contact`
- WHERE `uid` = %d AND `pending` = 0
+
+ $r = q("SELECT `abook_id`, `xchan_name`, `xchan_photo_s`, `xchan_url` FROM `abook` left join xchan on abook_xchan = xchan_hash WHERE abook_channel = %d
$people_sql_extra
- ORDER BY `name` ASC ",
+ ORDER BY `xchan_name` ASC ",
intval(local_user())
);
- if(count($r)) {
+ if($r) {
foreach($r as $g) {
- $x['photos'][] = $g['micro'];
- $x['links'][] = $g['url'];
- $x['suggestions'][] = '@' . $g['name'];
- $x['data'][] = intval($g['id']);
- }
- }
- else {
-
- $r = q("SELECT `id`, `name`, `photo`, `url` FROM `gcontact` where 1
- $people_sql_extra
- ORDER BY `name` ASC "
- );
-
- if(count($r)) {
- foreach($r as $g) {
- $x['photos'][] = $g['photo'];
- $x['links'][] = $g['url'];
- $x['suggestions'][] = '@' . $g['name'];
- $x['data'][] = intval($g['id']);
- }
+ $x['photos'][] = $g['xchan_photo_s'];
+ $x['links'][] = $g['xchan_url'];
+ $x['suggestions'][] = '@' . $g['xchan_name'];
+ $x['data'][] = 'cid=' . intval($g['abook_id']);
}
}
- $r = q("select tid, term, url from term where type = %d $tag_sql_extra order by term asc",
+ $r = q("select distinct term, tid, url from term where type = %d $tag_sql_extra group by term order by term asc",
intval(TERM_HASHTAG)
);
diff --git a/mod/settings.php b/mod/settings.php
index da6cf709c..5aa018cc2 100644
--- a/mod/settings.php
+++ b/mod/settings.php
@@ -1,5 +1,6 @@
-<?php
+<?php /** @file */
+require_once('include/zot.php');
function get_theme_config_file($theme){
@@ -14,8 +15,11 @@ function get_theme_config_file($theme){
return null;
}
-function settings_aside(&$a) {
+function settings_init(&$a) {
+ if(! local_user())
+ return;
+ $a->profile_uid = local_user();
// default is channel settings in the absence of other arguments
@@ -25,83 +29,7 @@ function settings_aside(&$a) {
$a->argv[] = 'channel';
}
- $abook_self_id = 0;
-
- // Retrieve the 'self' address book entry for use in the auto-permissions link
- if(local_user()) {
- $abk = q("select abook_id from abook where abook_channel = %d and ( abook_flags & %d ) limit 1",
- intval(local_user()),
- intval(ABOOK_FLAG_SELF)
- );
- if($abk)
- $abook_self_id = $abk[0]['abook_id'];
- }
-
- $tabs = array(
- array(
- 'label' => t('Account settings'),
- 'url' => $a->get_baseurl(true).'/settings/account',
- 'selected' => ((argv(1) === 'account') ? 'active' : ''),
- ),
-
- array(
- 'label' => t('Channel settings'),
- 'url' => $a->get_baseurl(true).'/settings/channel',
- 'selected' => ((argv(1) === 'channel') ? 'active' : ''),
- ),
-
- array(
- 'label' => t('Additional features'),
- 'url' => $a->get_baseurl(true).'/settings/features',
- 'selected' => ((argv(1) === 'features') ? 'active' : ''),
- ),
-
- array(
- 'label' => t('Feature settings'),
- 'url' => $a->get_baseurl(true).'/settings/featured',
- 'selected' => ((argv(1) === 'featured') ? 'active' : ''),
- ),
-
- array(
- 'label' => t('Display settings'),
- 'url' => $a->get_baseurl(true).'/settings/display',
- 'selected' => ((argv(1) === 'display') ? 'active' : ''),
- ),
-
- array(
- 'label' => t('Connected apps'),
- 'url' => $a->get_baseurl(true) . '/settings/oauth',
- 'selected' => ((argv(1) === 'oauth') ? 'active' : ''),
- ),
-
- array(
- 'label' => t('Export channel'),
- 'url' => $a->get_baseurl(true) . '/uexport/basic',
- 'selected' => ''
- ),
-
-// array(
-// 'label' => t('Export account'),
-// 'url' => $a->get_baseurl(true) . '/uexport/complete',
-// 'selected' => ''
-// ),
-
- array(
- 'label' => t('Automatic Permissions (Advanced)'),
- 'url' => $a->get_baseurl(true) . '/connections/' . $abook_self_id,
- 'selected' => ''
- ),
-
-
- );
-
- $tabtpl = get_markup_template("generic_links_widget.tpl");
- $a->page['aside'] = replace_macros($tabtpl, array(
- '$title' => t('Settings'),
- '$class' => 'settings-widget',
- '$items' => $tabs,
- ));
}
@@ -111,17 +39,12 @@ function settings_post(&$a) {
if(! local_user())
return;
+// logger('mod_settings: ' . print_r($_REQUEST,true));
+
if(x($_SESSION,'submanage') && intval($_SESSION['submanage']))
return;
-// if(count($a->user) && x($a->user,'uid') && $a->user['uid'] != local_user()) {
-// notice( t('Permission denied.') . EOL);
-// return;
-// }
-
- $old_page_flags = $a->user['page-flags'];
-
if((argc() > 1) && (argv(1) === 'oauth') && x($_POST,'remove')){
check_form_security_token_redirectOnErr('/settings/oauth', 'settings_oauth');
@@ -142,10 +65,17 @@ function settings_post(&$a) {
$secret = ((x($_POST,'secret')) ? $_POST['secret'] : '');
$redirect = ((x($_POST,'redirect')) ? $_POST['redirect'] : '');
$icon = ((x($_POST,'icon')) ? $_POST['icon'] : '');
- if ($name=="" || $key=="" || $secret==""){
- notice(t("Missing some important data!"));
-
- } else {
+ $ok = true;
+ if($name == '') {
+ $ok = false;
+ notice( t('Name is required') . EOL);
+ }
+ if($key == '' || $secret == '') {
+ $ok = false;
+ notice( t('Key and Secret are required') . EOL);
+ }
+
+ if($ok) {
if ($_POST['submit']==t("Update")){
$r = q("UPDATE clients SET
client_id='%s',
@@ -182,6 +112,7 @@ function settings_post(&$a) {
check_form_security_token_redirectOnErr('/settings/featured', 'settings_featured');
call_hooks('feature_settings_post', $_POST);
+ build_sync_packet();
return;
}
@@ -194,6 +125,7 @@ function settings_post(&$a) {
set_pconfig(local_user(),'feature',substr($k,8),((intval($v)) ? 1 : 0));
}
}
+ build_sync_packet();
return;
}
@@ -237,6 +169,7 @@ function settings_post(&$a) {
);
call_hooks('display_settings_post', $_POST);
+ build_sync_packet();
goaway($a->get_baseurl(true) . '/settings/display' );
return; // NOTREACHED
}
@@ -286,13 +219,13 @@ function settings_post(&$a) {
}
$email = ((x($_POST,'email')) ? trim(notags($_POST['email'])) : '');
+ $account = $a->get_account();
if($email != $account['account_email']) {
- $account = $a->get_account();
if(! valid_email($email))
$errs[] = t('Not valid email.');
$adm = trim(get_config('system','admin_email'));
if(($adm) && (strcasecmp($email,$adm) == 0)) {
- $errs[] = t('Protected email. Cannot change to that email.');
+ $errs[] = t('Protected email address. Cannot change to that email.');
$email = $a->user['email'];
}
if(! $errs) {
@@ -324,16 +257,16 @@ function settings_post(&$a) {
$openid = ((x($_POST,'openid_url')) ? notags(trim($_POST['openid_url'])) : '');
$maxreq = ((x($_POST,'maxreq')) ? intval($_POST['maxreq']) : 0);
$expire = ((x($_POST,'expire')) ? intval($_POST['expire']) : 0);
- $def_gid = ((x($_POST,'group-selection')) ? intval($_POST['group-selection']) : 0);
+ $def_group = ((x($_POST,'group-selection')) ? notags(trim($_POST['group-selection'])) : '');
$expire_items = ((x($_POST,'expire_items')) ? intval($_POST['expire_items']) : 0);
- $expire_notes = ((x($_POST,'expire_notes')) ? intval($_POST['expire_notes']) : 0);
$expire_starred = ((x($_POST,'expire_starred')) ? intval($_POST['expire_starred']) : 0);
$expire_photos = ((x($_POST,'expire_photos'))? intval($_POST['expire_photos']) : 0);
$expire_network_only = ((x($_POST,'expire_network_only'))? intval($_POST['expire_network_only']) : 0);
$allow_location = (((x($_POST,'allow_location')) && (intval($_POST['allow_location']) == 1)) ? 1: 0);
+
$publish = (((x($_POST,'profile_in_directory')) && (intval($_POST['profile_in_directory']) == 1)) ? 1: 0);
$page_flags = (((x($_POST,'page-flags')) && (intval($_POST['page-flags']))) ? intval($_POST['page-flags']) : 0);
$blockwall = (((x($_POST,'blockwall')) && (intval($_POST['blockwall']) == 1)) ? 0: 1); // this setting is inverted!
@@ -346,25 +279,33 @@ function settings_post(&$a) {
$post_newfriend = (($_POST['post_newfriend'] == 1) ? 1: 0);
$post_joingroup = (($_POST['post_joingroup'] == 1) ? 1: 0);
$post_profilechange = (($_POST['post_profilechange'] == 1) ? 1: 0);
+ $adult = (($_POST['adult'] == 1) ? 1 : 0);
- $arr = array();
- $arr['channel_r_stream'] = (($_POST['view_stream']) ? $_POST['view_stream'] : 0);
- $arr['channel_r_profile'] = (($_POST['view_profile']) ? $_POST['view_profile'] : 0);
- $arr['channel_r_photos'] = (($_POST['view_photos']) ? $_POST['view_photos'] : 0);
- $arr['channel_r_abook'] = (($_POST['view_contacts']) ? $_POST['view_contacts'] : 0);
- $arr['channel_w_stream'] = (($_POST['send_stream']) ? $_POST['send_stream'] : 0);
- $arr['channel_w_wall'] = (($_POST['post_wall']) ? $_POST['post_wall'] : 0);
- $arr['channel_w_tagwall'] = (($_POST['tag_deliver']) ? $_POST['tag_deliver'] : 0);
- $arr['channel_w_comment'] = (($_POST['post_comments']) ? $_POST['post_comments'] : 0);
- $arr['channel_w_mail'] = (($_POST['post_mail']) ? $_POST['post_mail'] : 0);
- $arr['channel_w_photos'] = (($_POST['post_photos']) ? $_POST['post_photos'] : 0);
- $arr['channel_w_chat'] = (($_POST['chat']) ? $_POST['chat'] : 0);
- $arr['channel_a_delegate'] = (($_POST['delegate']) ? $_POST['delegate'] : 0);
- $arr['channel_r_storage'] = (($_POST['view_storage']) ? $_POST['view_storage'] : 0);
- $arr['channel_w_storage'] = (($_POST['write_storage']) ? $_POST['write_storage'] : 0);
- $arr['channel_r_pages'] = (($_POST['view_pages']) ? $_POST['view_pages'] : 0);
- $arr['channel_w_pages'] = (($_POST['write_pages']) ? $_POST['write_pages'] : 0);
+ $channel = $a->get_channel();
+ $pageflags = $channel['channel_pageflags'];
+ $existing_adult = (($pageflags & PAGE_ADULT) ? 1 : 0);
+ if($adult != $existing_adult)
+ $pageflags = ($pageflags ^ PAGE_ADULT);
+ $arr = array();
+ $arr['channel_r_stream'] = (($_POST['view_stream']) ? $_POST['view_stream'] : 0);
+ $arr['channel_r_profile'] = (($_POST['view_profile']) ? $_POST['view_profile'] : 0);
+ $arr['channel_r_photos'] = (($_POST['view_photos']) ? $_POST['view_photos'] : 0);
+ $arr['channel_r_abook'] = (($_POST['view_contacts']) ? $_POST['view_contacts'] : 0);
+ $arr['channel_w_stream'] = (($_POST['send_stream']) ? $_POST['send_stream'] : 0);
+ $arr['channel_w_wall'] = (($_POST['post_wall']) ? $_POST['post_wall'] : 0);
+ $arr['channel_w_tagwall'] = (($_POST['tag_deliver']) ? $_POST['tag_deliver'] : 0);
+ $arr['channel_w_comment'] = (($_POST['post_comments']) ? $_POST['post_comments'] : 0);
+ $arr['channel_w_mail'] = (($_POST['post_mail']) ? $_POST['post_mail'] : 0);
+ $arr['channel_w_photos'] = (($_POST['post_photos']) ? $_POST['post_photos'] : 0);
+ $arr['channel_w_chat'] = (($_POST['chat']) ? $_POST['chat'] : 0);
+ $arr['channel_a_delegate'] = (($_POST['delegate']) ? $_POST['delegate'] : 0);
+ $arr['channel_r_storage'] = (($_POST['view_storage']) ? $_POST['view_storage'] : 0);
+ $arr['channel_w_storage'] = (($_POST['write_storage']) ? $_POST['write_storage'] : 0);
+ $arr['channel_r_pages'] = (($_POST['view_pages']) ? $_POST['view_pages'] : 0);
+ $arr['channel_w_pages'] = (($_POST['write_pages']) ? $_POST['write_pages'] : 0);
+ $arr['channel_a_republish'] = (($_POST['republish']) ? $_POST['republish'] : 0);
+
$defperms = 0;
if(x($_POST['def_view_stream']))
$defperms += $_POST['def_view_stream'];
@@ -398,6 +339,8 @@ function settings_post(&$a) {
$defperms += $_POST['def_view_pages'];
if(x($_POST['def_write_pages']))
$defperms += $_POST['def_write_pages'];
+ if(x($_POST['def_republish']))
+ $defperms += $_POST['def_republish'];
$notify = 0;
@@ -446,66 +389,24 @@ function settings_post(&$a) {
$str_group_deny = perms2str($_POST['group_deny']);
$str_contact_deny = perms2str($_POST['contact_deny']);
- set_pconfig(local_user(),'expire','items', $expire_items);
- set_pconfig(local_user(),'expire','notes', $expire_notes);
- set_pconfig(local_user(),'expire','starred', $expire_starred);
- set_pconfig(local_user(),'expire','photos', $expire_photos);
- set_pconfig(local_user(),'expire','network_only', $expire_network_only);
set_pconfig(local_user(),'system','use_browser_location',$allow_location);
set_pconfig(local_user(),'system','suggestme', $suggestme);
set_pconfig(local_user(),'system','post_newfriend', $post_newfriend);
set_pconfig(local_user(),'system','post_joingroup', $post_joingroup);
set_pconfig(local_user(),'system','post_profilechange', $post_profilechange);
+ set_pconfig(local_user(),'system','blocktags',$blocktags);
-/*
- if($page_flags == PAGE_PRVGROUP) {
- $hidewall = 1;
- if((! $str_contact_allow) && (! $str_group_allow) && (! $str_contact_deny) && (! $str_group_deny)) {
- if($def_gid) {
- info( t('Private forum has no privacy permissions. Using default privacy group.'). EOL);
- $str_group_allow = '<' . $def_gid . '>';
- }
- else {
- notice( t('Private forum has no privacy permissions and no default privacy group.') . EOL);
- }
- }
- }
-
-*/
-
-/*
- $r = q("UPDATE `user` SET `username` = '%s', `email` = '%s', `openid` = '%s', `timezone` = '%s', `allow_cid` = '%s', `allow_gid` = '%s', `deny_cid` = '%s', `deny_gid` = '%s', `notify-flags` = %d, `page-flags` = %d, `default-location` = '%s', `allow_location` = %d, `maxreq` = %d, `expire` = %d, `openidserver` = '%s', `def_gid` = %d, `blockwall` = %d, `hidewall` = %d, `blocktags` = %d, `unkmail` = %d, `cntunkmail` = %d WHERE `uid` = %d LIMIT 1",
- dbesc($username),
- dbesc($email),
- dbesc($openid),
- dbesc($timezone),
- dbesc($str_contact_allow),
- dbesc($str_group_allow),
- dbesc($str_contact_deny),
- dbesc($str_group_deny),
- intval($notify),
- intval($page_flags),
- dbesc($defloc),
- intval($allow_location),
- intval($maxreq),
- intval($expire),
- dbesc($openidserver),
- intval($def_gid),
- intval($blockwall),
- intval($hidewall),
- intval($blocktags),
- intval($unkmail),
- intval($cntunkmail),
- intval(local_user())
- );
-*/
- $r = q("update channel set channel_name = '%s', channel_timezone = '%s', channel_max_anon_mail = %d, channel_max_friend_req = %d, channel_expire_days = %d, channel_r_stream = %d, channel_r_profile = %d, channel_r_photos = %d, channel_r_abook = %d, channel_w_stream = %d, channel_w_wall = %d, channel_w_tagwall = %d, channel_w_comment = %d, channel_w_mail = %d, channel_w_photos = %d, channel_w_chat = %d, channel_a_delegate = %d, channel_r_storage = %d, channel_w_storage = %d, channel_r_pages = %d, channel_w_pages = %d where channel_id = %d limit 1",
+ $r = q("update channel set channel_name = '%s', channel_pageflags = %d, channel_timezone = '%s', channel_location = '%s', channel_notifyflags = %d, channel_max_anon_mail = %d, channel_max_friend_req = %d, channel_expire_days = %d, channel_default_group = '%s', channel_r_stream = %d, channel_r_profile = %d, channel_r_photos = %d, channel_r_abook = %d, channel_w_stream = %d, channel_w_wall = %d, channel_w_tagwall = %d, channel_w_comment = %d, channel_w_mail = %d, channel_w_photos = %d, channel_w_chat = %d, channel_a_delegate = %d, channel_r_storage = %d, channel_w_storage = %d, channel_r_pages = %d, channel_w_pages = %d, channel_a_republish = %d, channel_allow_cid = '%s', channel_allow_gid = '%s', channel_deny_cid = '%s', channel_deny_gid = '%s' where channel_id = %d limit 1",
dbesc($username),
+ intval($pageflags),
dbesc($timezone),
+ dbesc($defloc),
+ intval($notify),
intval($unkmail),
intval($maxreq),
intval($expire),
+ dbesc($def_group),
intval($arr['channel_r_stream']),
intval($arr['channel_r_profile']),
intval($arr['channel_r_photos']),
@@ -522,6 +423,11 @@ function settings_post(&$a) {
intval($arr['channel_w_storage']),
intval($arr['channel_r_pages']),
intval($arr['channel_w_pages']),
+ intval($arr['channel_a_republish']),
+ dbesc($str_contact_allow),
+ dbesc($str_group_allow),
+ dbesc($str_contact_deny),
+ dbesc($str_group_deny),
intval(local_user())
);
@@ -547,11 +453,12 @@ function settings_post(&$a) {
dbesc($username),
intval($channel['channel_id'])
);
- // we really need to send out notifications to all our friends
}
proc_run('php','include/directory.php',local_user());
+ build_sync_packet();
+
//$_SESSION['theme'] = $theme;
if($email_changed && $a->config['system']['register_policy'] == REGISTER_VERIFY) {
@@ -575,9 +482,14 @@ function settings_content(&$a) {
if(! local_user()) {
notice( t('Permission denied.') . EOL );
- return;
+ return login();
}
+
+ $channel = $a->get_channel();
+ if($channel)
+ head_set_icon($channel['xchan_photo_s']);
+
// if(x($_SESSION,'submanage') && intval($_SESSION['submanage'])) {
// notice( t('Permission denied.') . EOL );
// return;
@@ -594,11 +506,11 @@ function settings_content(&$a) {
'$title' => t('Add application'),
'$submit' => t('Submit'),
'$cancel' => t('Cancel'),
- '$name' => array('name', t('Name'), '', ''),
- '$key' => array('key', t('Consumer Key'), '', ''),
- '$secret' => array('secret', t('Consumer Secret'), '', ''),
- '$redirect' => array('redirect', t('Redirect'), '', ''),
- '$icon' => array('icon', t('Icon url'), '', ''),
+ '$name' => array('name', t('Name'), '', t('Name of application')),
+ '$key' => array('key', t('Consumer Key'), random_string(16), t('Automatically generated - change if desired. Max length 20')),
+ '$secret' => array('secret', t('Consumer Secret'), random_string(16), t('Automatically generated - change if desired. Max length 20')),
+ '$redirect' => array('redirect', t('Redirect'), '', t('Redirect URI - leave blank unless your application specifically requires this')),
+ '$icon' => array('icon', t('Icon url'), '', t('Optional')),
));
return $o;
}
@@ -716,7 +628,6 @@ function settings_content(&$a) {
if((argc() > 1) && (argv(1) === 'features')) {
-
$arr = array();
$features = get_features();
@@ -736,6 +647,7 @@ function settings_content(&$a) {
'$submit' => t('Submit'),
'$field_yesno' => 'field_yesno.tpl',
));
+
return $o;
}
@@ -771,7 +683,7 @@ function settings_content(&$a) {
$default_theme = get_config('system','theme');
if(! $default_theme)
$default_theme = 'default';
- $default_mobile_theme = get_config('system','mobile-theme');
+ $default_mobile_theme = get_config('system','mobile_theme');
if(! $mobile_default_theme)
$mobile_default_theme = 'none';
@@ -805,7 +717,7 @@ function settings_content(&$a) {
}
}
$theme_selected = (!x($_SESSION,'theme')? $default_theme : $_SESSION['theme']);
- $mobile_theme_selected = (!x($_SESSION,'mobile-theme')? $default_mobile_theme : $_SESSION['mobile-theme']);
+ $mobile_theme_selected = (!x($_SESSION,'mobile_theme')? $default_mobile_theme : $_SESSION['mobile_theme']);
$browser_update = intval(get_pconfig(local_user(), 'system','update_interval'));
$browser_update = (($browser_update == 0) ? 40 : $browser_update / 1000); // default if not set: 40 seconds
@@ -903,9 +815,9 @@ function settings_content(&$a) {
$maxreq = $channel['channel_max_friend_req'];
$expire = $channel['channel_expire_days'];
+ $adult_flag = intval($channel['channel_pageflags'] & PAGE_ADULT);
$blockwall = $a->user['blockwall'];
- $blocktags = $a->user['blocktags'];
$unkmail = $a->user['unkmail'];
$cntunkmail = $a->user['cntunkmail'];
@@ -937,6 +849,8 @@ function settings_content(&$a) {
$post_profilechange = get_pconfig(local_user(), 'system','post_profilechange');
$post_profilechange = (($post_profilechange===false)? '0': $post_profilechange); // default if not set: 0
+ $blocktags = get_pconfig(local_user(),'system','blocktags');
+ $blocktags = (($blocktags===false) ? '0' : $blocktags);
$timezone = date_default_timezone_get();
@@ -970,25 +884,18 @@ function settings_content(&$a) {
$stpl = get_markup_template('settings.tpl');
- $celeb = ((($a->user['page-flags'] == PAGE_SOAPBOX) || ($a->user['page-flags'] == PAGE_COMMUNITY)) ? true : false);
-
- $expire_arr = array(
- 'days' => array('expire', t("Automatically expire posts after this many days:"), $expire, t('If empty, posts will not expire. Expired posts will be deleted')),
- 'advanced' => t('Advanced expiration settings'),
- 'label' => t('Advanced Expiration'),
- 'items' => array('expire_items', t("Expire posts:"), $expire_items, '', array(t('No'),t('Yes'))),
-
- 'starred' => array('expire_starred', t("Expire starred posts:"), $expire_starred, '', array(t('No'),t('Yes'))),
- 'photos' => array('expire_photos', t("Expire photos:"), $expire_photos, '', array(t('No'),t('Yes'))),
- 'network_only' => array('expire_network_only', t("Only expire posts by others:"), $expire_network_only, '', array(t('No'),t('Yes'))),
- );
-
-
+ $celeb = false;
+ $perm_defaults = array(
+ 'allow_cid' => $channel['channel_allow_cid'],
+ 'allow_gid' => $channel['channel_allow_gid'],
+ 'deny_cid' => $channel['channel_deny_cid'],
+ 'deny_gid' => $channel['channel_deny_gid']
+ );
require_once('include/group.php');
- $group_select = mini_group_select(local_user(),$a->user['def_gid']);
+ $group_select = mini_group_select(local_user(),$channel['channel_default_group']);
$o .= replace_macros($stpl,array(
'$ptitle' => t('Channel Settings'),
@@ -1005,24 +912,28 @@ function settings_content(&$a) {
'$email' => array('email', t('Email Address:'), $email, ''),
'$timezone' => array('timezone_select' , t('Your Timezone:'), select_timezone($timezone), ''),
'$defloc' => array('defloc', t('Default Post Location:'), $defloc, ''),
- '$allowloc' => array('allow_location', t('Use Browser Location:'), (intval(get_pconfig(local_user(),'system','use_browser_location')) == 1), ''),
+ '$allowloc' => array('allow_location', t('Use Browser Location:'), ((get_pconfig(local_user(),'system','use_browser_location')) ? 1 : ''), ''),
+ '$adult' => array('adult', t('Adult Content'), $adult_flag, t('This channel publishes adult content.')),
'$h_prv' => t('Security and Privacy Settings'),
+ '$lbl_pmacro' => t('Quick Privacy Settings:'),
+ '$pmacro3' => t('Very Public - extremely permissive'),
+ '$pmacro2' => t('Typical - default public, privacy when desired'),
+ '$pmacro1' => t('Private - default private, rarely open or public'),
+ '$pmacro0' => t('Blocked - default blocked to/from everybody'),
'$permiss_arr' => $permiss,
'$maxreq' => array('maxreq', t('Maximum Friend Requests/Day:'), intval($channel['channel_max_friend_req']) , t('May reduce spam activity')),
'$permissions' => t('Default Post Permissions'),
'$permdesc' => t("\x28click to open/close\x29"),
- '$aclselect' => populate_acl($a->user,$celeb),
+ '$aclselect' => populate_acl($perm_defaults),
'$suggestme' => $suggestme,
'$group_select' => $group_select,
- '$expire' => $expire_arr,
-
'$profile_in_dir' => $profile_in_dir,
'$hide_friends' => $hide_friends,
'$hide_wall' => $hide_wall,
diff --git a/mod/setup.php b/mod/setup.php
index b05b0cec3..ca5566578 100755
--- a/mod/setup.php
+++ b/mod/setup.php
@@ -4,7 +4,25 @@ $install_wizard_pass=1;
function setup_init(&$a){
+
+ // Ensure that if somebody hasn't read the install documentation and doesn't have all
+ // the required modules or has a totally borked shared hosting provider and they can't
+ // figure out what the hell is going on - that we at least spit out an error message which
+ // we can inquire about when they write to tell us that our software doesn't work.
+
+ // The worst thing we can do at this point is throw a white screen of death and rely on
+ // them knowing about servers and php modules and logfiles enough so that we can guess
+ // at the source of the problem. As ugly as it may be, we need to throw a technically worded
+ // PHP error message in their face. Once installation is complete application errors will
+ // throw a white screen because these error messages divulge information which can
+ // potentially be useful to hackers.
+
+ error_reporting(E_ERROR | E_WARNING | E_PARSE );
+ ini_set('log_errors','0');
+ ini_set('display_errors', '1');
+
+
// $baseurl/setup/testrwrite to test if rewite in .htaccess is working
if (argc() ==2 && argv(1)=="testrewrite") {
echo "ok";
@@ -14,6 +32,7 @@ function setup_init(&$a){
if (x($_POST,'pass'))
$install_wizard_pass = intval($_POST['pass']);
+
}
function setup_post(&$a) {
@@ -27,6 +46,7 @@ function setup_post(&$a) {
case 3:
$urlpath = $a->get_path();
$dbhost = notags(trim($_POST['dbhost']));
+ $dbport = intval(notags(trim($_POST['dbport'])));
$dbuser = notags(trim($_POST['dbuser']));
$dbpass = notags(trim($_POST['dbpass']));
$dbdata = notags(trim($_POST['dbdata']));
@@ -34,12 +54,16 @@ function setup_post(&$a) {
$adminmail = notags(trim($_POST['adminmail']));
$siteurl = notags(trim($_POST['siteurl']));
- require_once("dba.php");
+ require_once('include/dba/dba_driver.php');
unset($db);
- $db = new dba($dbhost, $dbuser, $dbpass, $dbdata, true);
+ $db = dba_factory($dbhost, $dbport, $dbuser, $dbpass, $dbdata, true);
+ if(! $db->connected) {
+ echo "Database Connect failed: " . $db->error;
+ killme();
+ }
/*if(get_db_errno()) {
unset($db);
- $db = new dba($dbhost, $dbuser, $dbpass, '', true);
+ $db = dba_factory($dbhost, $dbport, $dbuser, $dbpass, '', true);
if(! get_db_errno()) {
$r = q("CREATE DATABASE '%s'",
@@ -47,7 +71,7 @@ function setup_post(&$a) {
);
if($r) {
unset($db);
- $db = new dba($dbhost, $dbuser, $dbpass, $dbdata, true);
+ $db = new dba($dbhost, $dbport, $dbuser, $dbpass, $dbdata, true);
} else {
$a->data['db_create_failed']=true;
}
@@ -65,6 +89,7 @@ function setup_post(&$a) {
case 4:
$urlpath = $a->get_path();
$dbhost = notags(trim($_POST['dbhost']));
+ $dbport = intval(notags(trim($_POST['dbport'])));
$dbuser = notags(trim($_POST['dbuser']));
$dbpass = notags(trim($_POST['dbpass']));
$dbdata = notags(trim($_POST['dbdata']));
@@ -74,13 +99,26 @@ function setup_post(&$a) {
$siteurl = notags(trim($_POST['siteurl']));
+ if($siteurl != z_root()) {
+ $test = z_fetch_url($siteurl."/setup/testrewrite");
+ if((! $test['success']) || ($test['body'] != 'ok')) {
+ $a->data['url_fail'] = true;
+ return;
+ }
+ }
// connect to db
- $db = new dba($dbhost, $dbuser, $dbpass, $dbdata, true);
+ $db = dba_factory($dbhost, $dbport, $dbuser, $dbpass, $dbdata, true);
+
+ if(! $db->connected) {
+ echo 'CRITICAL: DB not connected.';
+ killme();
+ }
$tpl = get_intltext_template('htconfig.tpl');
$txt = replace_macros($tpl,array(
'$dbhost' => $dbhost,
+ '$dbport' => $dbport,
'$dbuser' => $dbuser,
'$dbpass' => $dbpass,
'$dbdata' => $dbdata,
@@ -120,7 +158,7 @@ function setup_content(&$a) {
global $install_wizard_pass, $db;
$o = '';
$wizard_status = "";
- $install_title = t('Friendica Red Communications Server - Setup');
+ $install_title = t('Red Matrix Server - Setup');
@@ -128,6 +166,11 @@ function setup_content(&$a) {
$install_wizard_pass = 2;
$wizard_status = t('Could not connect to database.');
}
+ if(x($a->data,'url_fail')) {
+ $install_wizard_pass = 3;
+ $wizard_status = t('Could not connect to specified site URL. Possible SSL certificate or DNS issue.');
+ }
+
if(x($a->data,'db_create_failed')) {
$install_wizard_pass = 2;
$wizard_status = t('Could not create table.');
@@ -136,7 +179,7 @@ function setup_content(&$a) {
$db_return_text="";
if(x($a->data,'db_installed')) {
$txt = '<p style="font-size: 130%;">';
- $txt .= t('Your Friendica site database has been installed.') . EOL;
+ $txt .= t('Your site database has been installed.') . EOL;
$db_return_text .= $txt;
}
@@ -148,7 +191,7 @@ function setup_content(&$a) {
}
if($db && $db->connected) {
- $r = q("SELECT COUNT(*) as `total` FROM `user`");
+ $r = q("SELECT COUNT(*) as `total` FROM `account`");
if($r && count($r) && $r[0]['total']) {
$tpl = get_markup_template('install.tpl');
return replace_macros($tpl, array(
@@ -185,6 +228,8 @@ function setup_content(&$a) {
check_smarty3($checks);
+ check_store($checks);
+
check_keys($checks);
if(x($_POST,'phpath'))
@@ -222,6 +267,7 @@ function setup_content(&$a) {
$dbhost = ((x($_POST,'dbhost')) ? notags(trim($_POST['dbhost'])) : 'localhost');
$dbuser = notags(trim($_POST['dbuser']));
+ $dbport = intval(notags(trim($_POST['dbport'])));
$dbpass = notags(trim($_POST['dbpass']));
$dbdata = notags(trim($_POST['dbdata']));
$phpath = notags(trim($_POST['phpath']));
@@ -233,13 +279,14 @@ function setup_content(&$a) {
$o .= replace_macros($tpl, array(
'$title' => $install_title,
'$pass' => t('Database connection'),
- '$info_01' => t('In order to install Friendica we need to know how to connect to your database.'),
+ '$info_01' => t('In order to install Red Matrix we need to know how to connect to your database.'),
'$info_02' => t('Please contact your hosting provider or site administrator if you have questions about these settings.'),
'$info_03' => t('The database you specify below should already exist. If it does not, please create it before continuing.'),
'$status' => $wizard_status,
- '$dbhost' => array('dbhost', t('Database Server Name'), $dbhost, ''),
+ '$dbhost' => array('dbhost', t('Database Server Name'), $dbhost, t('Default is localhost')),
+ '$dbport' => array('dbport', t('Database Port'), $dbport, t('Communication port number - use 0 for default')),
'$dbuser' => array('dbuser', t('Database Login Name'), $dbuser, ''),
'$dbpass' => array('dbpass', t('Database Login Password'), $dbpass, ''),
'$dbdata' => array('dbdata', t('Database Name'), $dbdata, ''),
@@ -260,8 +307,9 @@ function setup_content(&$a) {
return $o;
}; break;
case 3: { // Site settings
- require_once('datetime.php');
+ require_once('include/datetime.php');
$dbhost = ((x($_POST,'dbhost')) ? notags(trim($_POST['dbhost'])) : 'localhost');
+ $dbport = intval(notags(trim($_POST['dbuser'])));
$dbuser = notags(trim($_POST['dbuser']));
$dbpass = notags(trim($_POST['dbpass']));
$dbdata = notags(trim($_POST['dbdata']));
@@ -279,6 +327,7 @@ function setup_content(&$a) {
'$status' => $wizard_status,
'$dbhost' => $dbhost,
+ '$dbport' => $dbport,
'$dbuser' => $dbuser,
'$dbpass' => $dbpass,
'$dbdata' => $dbdata,
@@ -330,7 +379,7 @@ function check_php(&$phpath, &$checks) {
$help = "";
if(!$passed) {
$help .= t('Could not find a command line version of PHP in the web server PATH.'). EOL;
- $help .= t("If you don't have a command line version of PHP installed on server, you will not be able to run background polling via cron. See <a href='http://friendica.com/node/27'>'Activating scheduled tasks'</a>") . EOL ;
+ $help .= t("If you don't have a command line version of PHP installed on server, you will not be able to run background polling via cron.") . EOL;
$help .= EOL . EOL ;
$tpl = get_markup_template('field_input.tpl');
$help .= replace_macros($tpl, array(
@@ -397,6 +446,12 @@ function check_funcs(&$checks) {
check_add($ck_funcs, t('Apache mod_rewrite module'), true, true, "");
}
}
+ if((! function_exists('proc_open')) || strstr(ini_get('disable_functions'),'proc_open')) {
+ check_add($ck_funcs, t('proc_open'), false, true, t('Error: proc_open is required but is either not installed or has been disabled in php.ini'));
+ }
+ else {
+ check_add($ck_funcs, t('proc_open'), true, true, "");
+ }
if(! function_exists('curl_init')){
$ck_funcs[0]['status']= false;
@@ -419,8 +474,8 @@ function check_funcs(&$checks) {
$ck_funcs[4]['help']= t('Error: mb_string PHP module required but not installed.');
}
if(! function_exists('mcrypt_encrypt')){
- $ck_funcs[4]['status']= false;
- $ck_funcs[4]['help']= t('Error: mcrypt PHP module required but not installed.');
+ $ck_funcs[5]['status']= false;
+ $ck_funcs[5]['help']= t('Error: mcrypt PHP module required but not installed.');
}
$checks = array_merge($checks, $ck_funcs);
@@ -438,7 +493,7 @@ function check_htconfig(&$checks) {
$status=false;
$help = t('The web installer needs to be able to create a file called ".htconfig.php" in the top folder of your web server and it is unable to do so.') .EOL;
$help .= t('This is most often a permission setting, as the web server may not be able to write files in your folder - even if you can.').EOL;
- $help .= t('At the end of this procedure, we will give you a text to save in a file named .htconfig.php in your Friendica top folder.').EOL;
+ $help .= t('At the end of this procedure, we will give you a text to save in a file named .htconfig.php in your Red top folder.').EOL;
$help .= t('You can alternatively skip this procedure and perform a manual installation. Please see the file "install/INSTALL.txt" for instructions.').EOL;
}
@@ -452,8 +507,8 @@ function check_smarty3(&$checks) {
if( !is_writable('view/tpl/smarty3') ) {
$status=false;
- $help = t('Friendica uses the Smarty3 template engine to render its web views. Smarty3 compiles templates to PHP to speed up rendering.') .EOL;
- $help .= t('In order to store these compiled templates, the web server needs to have write access to the directory view/tpl/smarty3/ under the Friendica top level folder.').EOL;
+ $help = t('Red uses the Smarty3 template engine to render its web views. Smarty3 compiles templates to PHP to speed up rendering.') .EOL;
+ $help .= t('In order to store these compiled templates, the web server needs to have write access to the directory view/tpl/smarty3/ under the Red top level folder.').EOL;
$help .= t('Please ensure that the user that your web server runs as (e.g. www-data) has write access to this folder.').EOL;
$help .= t('Note: as a security measure, you should give the web server write access to view/tpl/smarty3/ only--not the template files (.tpl) that it contains.').EOL;
}
@@ -462,13 +517,40 @@ function check_smarty3(&$checks) {
}
+function check_store(&$checks) {
+ $status = true;
+ $help = "";
+
+ @mkdir('store',STORAGE_DEFAULT_PERMISSIONS);
+
+ if( !is_writable('store') ) {
+
+ $status=false;
+ $help = t('Red uses the store directory to save uploaded files. The web server needs to have write access to the store directory under the Red top level folder') . EOL;
+ $help .= t('Please ensure that the user that your web server runs as (e.g. www-data) has write access to this folder.').EOL;
+ }
+
+ check_add($checks, t('store is writable'), $status, true, $help);
+
+}
+
+
function check_htaccess(&$checks) {
$a = get_app();
$status = true;
$help = "";
if (function_exists('curl_init')){
- $test = fetch_url($a->get_baseurl()."/setup/testrewrite");
- if ($test!="ok") {
+ $test = z_fetch_url($a->get_baseurl()."/setup/testrewrite");
+ if(! $test['success']) {
+ if(strstr($a->get_baseurl(),'https://')) {
+ $test = z_fetch_url($a->get_baseurl() . "/setup/testrewrite",false,0,array('novalidate' => true));
+ if($test['success']) {
+ check_add($checks, t('SSL certificate validation'),false,true, t('SSL certificate cannot be validated. Fix certificate or disable https access to this site.'));
+ }
+ }
+ }
+
+ if ((! $test['success']) || ($test['body'] != "ok")) {
$status = false;
$help = t('Url rewrite in .htaccess is not working. Check your server configuration.');
}
@@ -481,7 +563,7 @@ function check_htaccess(&$checks) {
function manual_config(&$a) {
- $data = htmlentities($a->data['txt']);
+ $data = htmlspecialchars($a->data['txt'],ENT_COMPAT,'UTF-8');
$o = t('The database configuration file ".htconfig.php" could not be written. Please use the enclosed text to create a configuration file in your web server root.');
$o .= "<textarea rows=\"24\" cols=\"80\" >$data</textarea>";
return $o;
@@ -515,13 +597,15 @@ function load_database($db) {
function what_next() {
$a = get_app();
+ // install the standard theme
+ set_config('system','allowed_themes','redbasic');
$baseurl = $a->get_baseurl();
return
t('<h1>What next</h1>')
."<p>".t('IMPORTANT: You will need to [manually] setup a scheduled task for the poller.')
.t('Please see the file "install/INSTALL.txt".')
."</p><p>"
- .t("Go to your new Friendica node <a href='$baseurl/register'>registration page</a> and register as new user. Remember to use the same email you have entered as administrator email. This will allow you to enter the site admin panel.")
+ .t("Go to your new Red node <a href='$baseurl/register'>registration page</a> and register as new user. Remember to use the same email you have entered as administrator email. This will allow you to enter the site admin panel.")
."</p>";
}
diff --git a/mod/share.php b/mod/share.php
index 33aa9eede..48965ad36 100644
--- a/mod/share.php
+++ b/mod/share.php
@@ -1,31 +1,80 @@
<?php
+require_once('include/security.php');
require_once('bbcode.php');
function share_init(&$a) {
$post_id = ((argc() > 1) ? intval(argv(1)) : 0);
- if((! $post_id) || (! local_user()))
+
+ if(! $post_id)
+ killme();
+
+ if(! (local_user() || remote_user()))
killme();
- $r = q("SELECT * from item WHERE id = %d AND uid = %d and item_restrict = 0 LIMIT 1",
- intval($post_id),
- intval(local_user())
+
+ $r = q("SELECT * from item WHERE id = %d LIMIT 1",
+ intval($post_id)
);
if((! $r) || $r[0]['item_private'])
killme();
+ $sql_extra = item_permissions_sql($r[0]['uid']);
+
+ $r = q("select * from item where id = %d $sql_extra",
+ intval($post_id)
+ );
+ if(! $r)
+ killme();
+
+ // FIXME - we only share bbcode
+
+ if($r[0]['mimetype'] !== 'text/bbcode')
+ killme();
+
+ // FIXME - eventually we want to post remotely via rpost
+ // on your home site.
+ // When that works remove this next bit:
+
+ if(! local_user())
+ killme();
+
xchan_query($r);
- $o = '[share]' . "\n";
+ if (strpos($r[0]['body'], "[/share]") !== false) {
+ $pos = strpos($r[0]['body'], "[share");
+ $o = substr($r[0]['body'], $pos);
+ } else {
+ $o = "[share author='".urlencode($r[0]['author']['xchan_name']).
+ "' profile='".$r[0]['author']['xchan_url'] .
+ "' avatar='".$r[0]['author']['xchan_photo_s'].
+ "' link='".$r[0]['plink'].
+ "' posted='".$r[0]['created']."']\n";
+ if($r[0]['title'])
+ $o .= '[b]'.$r[0]['title'].'[/b]'."\n";
+ $o .= $r[0]['body'];
+ $o.= "[/share]";
+ }
- $o .= "\xE2\x99\xb2" . ' [url=' . $r[0]['author']['xchan_url'] . ']' . $r[0]['author']['xchan_name'] . '[/url]' . "\n";
- if($r[0]['title'])
- $o .= '[b]' . $r[0]['title'] . '[/b]' . "\n";
- $o .= $r[0]['body'] . "\n" ;
+ if(local_user()) {
+ echo $o;
+ killme();
+ }
+
+ $observer = $a->get_observer();
+ $parsed = $observer['xchan_url'];
+ if($parsed) {
+ $post_url = $parsed['scheme'] . ':' . $parsed['host'] . (($parsed['port']) ? ':' . $parsed['port'] : '')
+ . '/rpost';
+ // FIXME - we were probably called from JS
+ // so we don't know the return page.
+ // in fact we won't be able to load the remote page.
+ // we might need an iframe
- $o .= (($r[0]['plink']) ? '[url=' . $r[0]['plink'] . ']' . t('link') . '[/url]' . "\n" : '') . '[/share]';
+ $x = z_post_url($post_url, array('f' => '', 'body' => $o ));
+ killme();
+ }
+
- echo $o;
- killme();
}
diff --git a/mod/siteinfo.php b/mod/siteinfo.php
index 0cd569d20..9f65f59e4 100644
--- a/mod/siteinfo.php
+++ b/mod/siteinfo.php
@@ -27,14 +27,20 @@ function siteinfo_init(&$a) {
$visible_plugins[] = $rr['name'];
}
+ if(@is_dir('.git') && function_exists('shell_exec'))
+ $commit = @shell_exec('git log -1 --format="%h"');
+ if(! isset($commit) || strlen($commit) > 16)
+ $commit = '';
+
$data = Array(
- 'version' => FRIENDICA_VERSION,
+ 'version' => RED_VERSION,
+ 'commit' => $commit,
'url' => z_root(),
'plugins' => $visible_plugins,
'register_policy' => $register_policy[$a->config['system']['register_policy']],
'admin' => $admin,
'site_name' => $a->config['sitename'],
- 'platform' => FRIENDICA_PLATFORM,
+ 'platform' => RED_PLATFORM,
'info' => ((x($a->config,'info')) ? $a->config['info'] : '')
);
@@ -47,27 +53,16 @@ function siteinfo_init(&$a) {
function siteinfo_content(&$a) {
- // FIXME Gak - this needs to be a template.
-
- $o = '';
- $o .= '<h3>' . t('Red') . '</h3>';
-
-
- $o .= '<p></p><p>';
-
- $o .= t('This is Red - another decentralized, distributed communications project by the folks at Friendica.');
- if(! get_config('system','hidden_version_siteinfo'))
- $o .= '</p><p>' . sprintf( t('Version %s'), FRIENDICA_VERSION ) . '</p><p>';
- $o .= '</p><p>';
- $o .= t('Running at web location') . ' ' . z_root() . '</p><p>';
-
- $o .= t('Please visit <a href="http://friendica.com">Friendica.com</a> to learn more about the Friendica and/or Red project.') . '</p><p>';
-
- $o .= t('Bug reports and issues: please visit') . ' ' . '<a href="http://bugs.friendica.com">Bugs.Friendica.com</a></p><p>';
- $o .= t('Suggestions, praise, donations, etc. - please email "Info" at Friendica - dot com') . '</p>';
-
- $o .= '<p></p>';
-
+ if(! get_config('system','hidden_version_siteinfo')) {
+ $version = sprintf( t('Version %s'), RED_VERSION );
+ if(@is_dir('.git') && function_exists('shell_exec'))
+ $commit = @shell_exec('git log -1 --format="%h"');
+ if(! isset($commit) || strlen($commit) > 16)
+ $commit = '';
+ }
+ else {
+ $version = $commit = '';
+ }
$visible_plugins = array();
if(is_array($a->plugins) && count($a->plugins)) {
$r = q("select * from addon where hidden = 0");
@@ -76,9 +71,9 @@ function siteinfo_content(&$a) {
$visible_plugins[] = $rr['name'];
}
-
+ $plugins_list = '';
if(count($visible_plugins)) {
- $o .= '<p>' . t('Installed plugins/addons/apps:') . '</p>';
+ $plugins_text = t('Installed plugins/addons/apps:');
$sorted = $visible_plugins;
$s = '';
sort($sorted);
@@ -88,10 +83,25 @@ function siteinfo_content(&$a) {
$s .= $p;
}
}
- $o .= '<div style="margin-left: 25px; margin-right: 25px;">' . $s . '</div>';
+ $plugins_list .= $s;
}
else
- $o .= '<p>' . t('No installed plugins/addons/apps') . '</p>';
+ $plugins_text = t('No installed plugins/addons/apps');
+
+ $o = replace_macros(get_markup_template('siteinfo.tpl'), array(
+ '$title' => t('Red'),
+ '$description' => t('This is a hub of the Red Matrix - a global cooperative network of decentralised privacy enhanced websites.'),
+ '$version' => $version,
+ '$commit' => $commit,
+ '$web_location' => t('Running at web location') . ' ' . z_root(),
+ '$visit' => t('Please visit <a href="http://getzot.com">GetZot.com</a> to learn more about the Red Matrix.'),
+ '$bug_text' => t('Bug reports and issues: please visit'),
+ '$bug_link_url' => 'https://github.com/friendica/red/issues',
+ '$bug_link_text' => 'redmatrix issues',
+ '$contact' => t('Suggestions, praise, donations, etc. - please email "redmatrix" at librelist - dot com'),
+ '$plugins_text' => $plugins_text,
+ '$plugins_list' => $plugins_list
+ ));
call_hooks('about_hook', $o);
diff --git a/mod/sitelist.php b/mod/sitelist.php
new file mode 100644
index 000000000..1e6d0fcfb
--- /dev/null
+++ b/mod/sitelist.php
@@ -0,0 +1,51 @@
+<?php /** @file */
+
+function sitelist_init(&$a) {
+
+ $start = (($_REQUEST['start']) ? intval($_REQUEST['start']) : 0);
+ $limit = ((intval($_REQUEST['limit'])) ? intval($_REQUEST['limit']) : 30);
+ $order = (($_REQUEST['order']) ? $_REQUEST['order'] : 'random');
+ $open = (($_REQUEST['open']) ? intval($_REQUEST['open']) : false);
+
+
+ $sql_order = " order by site_url ";
+ if($order == 'random')
+ $sql_order = " order by rand() ";
+
+ $sql_limit = " limit $start, $limit ";
+
+ $sql_extra = "";
+ if($open)
+ $sql_extra = " and site_register = " . intval(REGISTER_OPEN) . " ";
+
+
+ $result = array('success' => false);
+
+ $r = q("select count(site_url) as total from site where 1 $sql_extra ");
+
+ if($r)
+ $result['total'] = intval($r[0]['total']);
+
+ $result['start'] = $start;
+ $result['limit'] = $limit;
+
+ $r = q("select * from site where true $sql_extra $sql_order $sql_limit");
+
+ $result['results'] = 0;
+ $result['entries'] = array();
+
+ if($r) {
+ $result['success'] = true;
+ $result['results'] = count($r);
+
+ foreach($r as $rr) {
+ $result['entries'][] = array('url' => $rr['site_url']);
+ }
+
+ }
+
+ echo json_encode($result);
+ killme();
+
+
+} \ No newline at end of file
diff --git a/mod/sources.php b/mod/sources.php
new file mode 100644
index 000000000..87bab60df
--- /dev/null
+++ b/mod/sources.php
@@ -0,0 +1,161 @@
+<?php /** @file */
+
+function sources_post(&$a) {
+ if(! local_user())
+ return;
+
+ if(! feature_enabled(local_user(),'channel_sources'))
+ return '';
+
+ $source = intval($_REQUEST['source']);
+ $xchan = $_REQUEST['xchan'];
+ $abook = intval($_REQUEST['abook']);
+ $words = $_REQUEST['words'];
+ $frequency = $_REQUEST['frequency'];
+
+ $channel = $a->get_channel();
+
+ if($abook) {
+ $r = q("select abook_xchan from abook where abook_id = %d and abook_channel = %d limit 1",
+ intval($abook),
+ intval(local_user())
+ );
+ if($r)
+ $xchan = $r[0]['abook_xchan'];
+ }
+
+ if(! $xchan) {
+ notice ( t('Failed to create source. No channel selected.') . EOL);
+ return;
+ }
+
+ if(! $source) {
+ $r = q("insert into source ( src_channel_id, src_channel_xchan, src_xchan, src_patt )
+ values ( %d, '%s', '%s', '%s' ) ",
+ intval(local_user()),
+ dbesc($channel['channel_hash']),
+ dbesc($xchan),
+ dbesc($words)
+ );
+ if($r) {
+ info( t('Source created.') . EOL);
+ }
+ goaway(z_root() . '/sources');
+ }
+ else {
+ $r = q("update source set src_xchan = '%s', src_patt = '%s' where src_channel_id = %d and src_id = %d limit 1",
+ dbesc($xchan),
+ dbesc($words),
+ intval(local_user()),
+ intval($source)
+ );
+ if($r) {
+ info( t('Source updated.') . EOL);
+ }
+
+ }
+}
+
+
+function sources_content(&$a) {
+ if(! local_user()) {
+ notice( t('Permission denied.') . EOL);
+ return '';
+ }
+
+ if(! feature_enabled(local_user(),'channel_sources')) {
+ return '';
+ }
+
+ // list sources
+ if(argc() == 1) {
+ $r = q("select source.*, xchan.* from source left join xchan on src_xchan = xchan_hash where src_channel_id = %d",
+ intval(local_user())
+ );
+ if($r) {
+ for($x = 0; $x < count($r); $x ++) {
+ $r[$x]['src_patt'] = htmlspecialchars($r[$x]['src_patt'], ENT_COMPAT,'UTF-8');
+ }
+ }
+ $o = replace_macros(get_markup_template('sources_list.tpl'), array(
+ '$title' => t('Channel Sources'),
+ '$desc' => t('Manage remote sources of content for your channel.'),
+ '$new' => t('New Source'),
+ '$sources' => $r
+ ));
+ return $o;
+ }
+
+ if(argc() == 2 && argv(1) === 'new') {
+ // TODO add the words 'or RSS feed' and corresponding code to manage feeds and frequency
+
+ $o = replace_macros(get_markup_template('sources_new.tpl'), array(
+ '$title' => t('New Source'),
+ '$desc' => t('Import all or selected content from the following channel into this channel and distribute it according to your channel settings.'),
+ '$words' => array( 'words', t('Only import content with these words (one per line)'),'',t('Leave blank to import all public content')),
+ '$name' => array( 'name', t('Channel Name'), '', ''),
+ '$submit' => t('Submit')
+ ));
+ return $o;
+
+ }
+
+ if(argc() == 2 && intval(argv(1))) {
+ // edit source
+ $r = q("select source.*, xchan.* from source left join xchan on src_xchan = xchan_hash where src_id = %d and src_channel_id = %d limit 1",
+ intval(argv(1)),
+ intval(local_user())
+ );
+ if($r) {
+ $x = q("select abook_id from abook where abook_xchan = '%s' and abook_channel = %d limit 1",
+ dbesc($r[0]['src_xchan']),
+ intval(local_user())
+ );
+ }
+ if(! $r) {
+ notice( t('Source not found.') . EOL);
+ return '';
+ }
+
+ $r[0]['src_patt'] = htmlspecialchars($r[0]['src_patt'], ENT_QUOTES,'UTF-8');
+
+ $o = replace_macros(get_markup_template('sources_edit.tpl'), array(
+ '$title' => t('Edit Source'),
+ '$drop' => t('Delete Source'),
+ '$id' => $r[0]['src_id'],
+ '$desc' => t('Import all or selected content from the following channel into this channel and distribute it according to your channel settings.'),
+ '$words' => array( 'words', t('Only import content with these words (one per line)'),$r[0]['src_patt'],t('Leave blank to import all public content')),
+ '$xchan' => $r[0]['src_xchan'],
+ '$abook' => $x[0]['abook_id'],
+ '$name' => array( 'name', t('Channel Name'), $r[0]['xchan_name'], ''),
+ '$submit' => t('Submit')
+ ));
+ return $o;
+
+ }
+
+ if(argc() == 3 && intval(argv(1)) && argv(2) === 'drop') {
+ $r = q("select * from source where src_id = %d and src_channel_id = %d limit 1",
+ intval(argv(1)),
+ intval(local_user())
+ );
+ if(! $r) {
+ notice( t('Source not found.') . EOL);
+ return '';
+ }
+ $r = q("delete from source where src_id = %d and src_channel_id = %d limit 1",
+ intval(argv(1)),
+ intval(local_user())
+ );
+ if($r)
+ info( t('Source removed') . EOL);
+ else
+ notice( t('Unable to remove source.') . EOL);
+
+ goaway(z_root() . '/sources');
+
+ }
+
+ // shouldn't get here.
+
+} \ No newline at end of file
diff --git a/mod/sslify.php b/mod/sslify.php
new file mode 100644
index 000000000..ed06d87c1
--- /dev/null
+++ b/mod/sslify.php
@@ -0,0 +1,24 @@
+<?php
+
+function sslify_init(&$a) {
+ $x = z_fetch_url($_REQUEST['url']);
+ if($x['success']) {
+ $h = explode("\n",$x['headers']);
+ foreach ($h as $l) {
+ list($k,$v) = array_map("trim", explode(":", trim($l), 2));
+ $hdrs[$k] = $v;
+ }
+ if (array_key_exists('Content-Type', $hdrs))
+ $type = $hdrs['Content-Type'];
+
+ header('Content-Type: ' . $type);
+ echo $x['body'];
+ killme();
+ }
+ killme();
+ // for some reason when this fallback is in place - it gets triggered
+ // often, (creating mixed content exceptions) even though there is
+ // nothing obvious missing on the page when we bypass it.
+ goaway($_REQUEST['url']);
+}
+
diff --git a/mod/starred.php b/mod/starred.php
index 530c5c7e0..ca7621b0f 100644
--- a/mod/starred.php
+++ b/mod/starred.php
@@ -19,13 +19,7 @@ function starred_init(&$a) {
if(! count($r))
killme();
- $item_flags = $r[0]['item_flags'];
-
- if($item_flags & ITEM_STARRED)
- $item_flags -= ITEM_STARRED;
- else
- $item_flags += ITEM_STARRED;
-
+ $item_flags = ( $r[0]['item_flags'] ^ ITEM_STARRED );
$r = q("UPDATE item SET item_flags = %d WHERE uid = %d and id = %d LIMIT 1",
intval($item_flags),
diff --git a/mod/subthread.php b/mod/subthread.php
index f8918e25d..11b7236fb 100755
--- a/mod/subthread.php
+++ b/mod/subthread.php
@@ -7,15 +7,15 @@ require_once('include/items.php');
function subthread_content(&$a) {
- if(! local_user() && ! remote_user()) {
+ if((! local_user()) && (! remote_user())) {
return;
}
$activity = ACTIVITY_FOLLOW;
- $item_id = (($a->argc > 1) ? notags(trim($a->argv[1])) : 0);
+ $item_id = ((argc() > 1) ? notags(trim(argv(1))) : 0);
- $r = q("SELECT * FROM `item` WHERE `parent` = '%s' OR `parent-uri` = '%s' and parent = id LIMIT 1",
+ $r = q("SELECT * FROM `item` WHERE `parent` = '%s' OR `parent_mid` = '%s' and parent = id LIMIT 1",
dbesc($item_id),
dbesc($item_id)
);
@@ -84,7 +84,7 @@ function subthread_content(&$a) {
return;
}
- $uri = item_message_id();
+ $mid = item_message_id();
$post_type = (($item['resource_id']) ? t('photo') : t('status'));
$objtype = (($item['resource_id']) ? ACTIVITY_OBJ_PHOTO : ACTIVITY_OBJ_NOTE );
@@ -96,7 +96,7 @@ function subthread_content(&$a) {
<object>
<type>$objtype</type>
<local>1</local>
- <id>{$item['uri']}</id>
+ <id>{$item['mid']}</id>
<link>$link</link>
<title></title>
<content>$body</content>
@@ -109,7 +109,7 @@ EOT;
$arr = array();
- $arr['uri'] = $uri;
+ $arr['mid'] = $mid;
$arr['uid'] = $owner_uid;
$arr['contact-id'] = $contact['id'];
$arr['type'] = 'activity';
@@ -117,8 +117,8 @@ EOT;
$arr['origin'] = 1;
$arr['gravity'] = GRAVITY_LIKE;
$arr['parent'] = $item['id'];
- $arr['parent-uri'] = $item['uri'];
- $arr['thr_parent'] = $item['uri'];
+ $arr['parent-mid'] = $item['mid'];
+ $arr['thr_parent'] = $item['mid'];
$arr['owner-name'] = $remote_owner['name'];
$arr['owner-link'] = $remote_owner['url'];
$arr['owner-avatar'] = $remote_owner['thumb'];
@@ -126,9 +126,9 @@ EOT;
$arr['author-link'] = $contact['url'];
$arr['author-avatar'] = $contact['thumb'];
- $ulink = '[url=' . $contact['url'] . ']' . $contact['name'] . '[/url]';
- $alink = '[url=' . $item['author-link'] . ']' . $item['author-name'] . '[/url]';
- $plink = '[url=' . $a->get_baseurl() . '/display/' . $owner['nickname'] . '/' . $item['id'] . ']' . $post_type . '[/url]';
+ $ulink = '[zrl=' . $contact['url'] . ']' . $contact['name'] . '[/zrl]';
+ $alink = '[zrl=' . $item['author-link'] . ']' . $item['author-name'] . '[/zrl]';
+ $plink = '[zrl=' . $a->get_baseurl() . '/display/' . $owner['nickname'] . '/' . $item['id'] . ']' . $post_type . '[/zrl]';
$arr['body'] = sprintf( $bodyverb, $ulink, $alink, $plink );
$arr['verb'] = $activity;
@@ -142,7 +142,8 @@ EOT;
$arr['unseen'] = 1;
$arr['last-child'] = 0;
- $post_id = item_store($arr);
+ $post = item_store($arr);
+ $post_id = $post['item_id'];
if(! $item['visible']) {
$r = q("UPDATE `item` SET `visible` = 1 WHERE `id` = %d AND `uid` = %d LIMIT 1",
diff --git a/mod/suggest.php b/mod/suggest.php
index 4aed2e61a..8a6b50b22 100644
--- a/mod/suggest.php
+++ b/mod/suggest.php
@@ -2,25 +2,23 @@
require_once('include/socgraph.php');
require_once('include/contact_widgets.php');
+require_once('include/widgets.php');
function suggest_init(&$a) {
if(! local_user())
return;
- if(x($_GET,'ignore') && intval($_GET['ignore'])) {
- q("insert into gcign ( uid, gcid ) values ( %d, %d ) ",
+ if(x($_GET,'ignore')) {
+ q("insert into xign ( uid, xchan ) values ( %d, '%s' ) ",
intval(local_user()),
- intval($_GET['ignore'])
+ dbesc($_GET['ignore'])
);
}
}
-
-
-
function suggest_content(&$a) {
$o = '';
@@ -31,38 +29,37 @@ function suggest_content(&$a) {
$_SESSION['return_url'] = $a->get_baseurl() . '/' . $a->cmd;
- $a->page['aside'] .= follow_widget();
- $a->page['aside'] .= findpeople_widget();
-
-
- $o .= '<h2>' . t('Friend Suggestions') . '</h2>';
-
+ $r = suggestion_query(local_user(),get_observer_hash());
- $r = suggestion_query(local_user());
-
- if(! count($r)) {
- $o .= t('No suggestions available. If this is a new site, please try again in 24 hours.');
- return $o;
+ if(! $r) {
+ info( t('No suggestions available. If this is a new site, please try again in 24 hours.'));
+ return;
}
- $tpl = get_markup_template('suggest_friends.tpl');
+ $arr = array();
foreach($r as $rr) {
- $connlnk = $a->get_baseurl() . '/follow/?url=' . (($rr['connect']) ? $rr['connect'] : $rr['url']);
-
- $o .= replace_macros($tpl,array(
- '$url' => zid($rr['url']),
- '$name' => $rr['name'],
- '$photo' => $rr['photo'],
- '$ignlnk' => $a->get_baseurl() . '/suggest?ignore=' . $rr['id'],
- '$conntxt' => t('Connect'),
- '$connlnk' => $connlnk,
- '$ignore' => t('Ignore/Hide')
- ));
+ $connlnk = $a->get_baseurl() . '/follow/?url=' . $rr['xchan_addr'];
+
+ $arr[] = array(
+ 'url' => chanlink_url($rr['xchan_url']),
+ 'profile' => $rr['xchan_url'],
+ 'name' => $rr['xchan_name'],
+ 'photo' => $rr['xchan_photo_m'],
+ 'ignlnk' => $a->get_baseurl() . '/suggest?ignore=' . $rr['xchan_hash'],
+ 'conntxt' => t('Connect'),
+ 'connlnk' => $connlnk,
+ 'ignore' => t('Ignore/Hide')
+ );
}
- $o .= cleardiv();
-// $o .= paginate($a);
+
+ $o = replace_macros(get_markup_template('suggest_page.tpl'),array(
+ '$title' => t('Channel Suggestions'),
+ '$entries' => $arr
+ ));
+
return $o;
+
}
diff --git a/mod/tagger.php b/mod/tagger.php
index 9c36a8b09..ec5c92184 100644
--- a/mod/tagger.php
+++ b/mod/tagger.php
@@ -11,6 +11,8 @@ function tagger_content(&$a) {
return;
}
+ $observer_hash = get_observer_hash();
+
$term = notags(trim($_GET['term']));
// no commas allowed
$term = str_replace(array(',',' '),array('','_'),$term);
@@ -23,11 +25,12 @@ function tagger_content(&$a) {
logger('tagger: tag ' . $term . ' item ' . $item_id);
- $r = q("SELECT * FROM `item` WHERE `id` = '%s' LIMIT 1",
- dbesc($item_id)
+ $r = q("SELECT * FROM item left join xchan on xchan_hash = author_xchan WHERE id = '%s' and uid = %d LIMIT 1",
+ dbesc($item_id),
+ intval(local_user())
);
- if(! $item_id || (! count($r))) {
+ if((! $item_id) || (! $r)) {
logger('tagger: no item ' . $item_id);
return;
}
@@ -36,89 +39,82 @@ function tagger_content(&$a) {
$owner_uid = $item['uid'];
- $r = q("select `nickname`,`blocktags` from user where uid = %d limit 1",
- intval($owner_uid)
- );
- if(count($r)) {
- $owner_nick = $r[0]['nickname'];
- $blocktags = $r[0]['blocktags'];
+ switch($item['resource_type']) {
+ case 'photo':
+ $targettype = ACTIVITY_OBJ_PHOTO;
+ $post_type = t('photo');
+ break;
+ case 'event':
+ $targgettype = ACTIVITY_OBJ_EVENT;
+ $post_type = t('event');
+ break;
+ default:
+ $targettype = ACTIVITY_OBJ_NOTE;
+ $post_type = t('status');
+ if($item['mid'] != $item['parent_mid'])
+ $post_type = t('comment');
+ break;
}
- if(local_user() != $owner_uid)
- return;
- $r = q("select * from contact where self = 1 and uid = %d limit 1",
- intval(local_user())
- );
- if(count($r))
- $contact = $r[0];
- else {
- logger('tagger: no contact_id');
- return;
- }
+ $links = array(array('rel' => 'alternate','type' => 'text/html',
+ 'href' => z_root() . '/display/' . $item['mid']));
- $uri = item_message_id();
- $xterm = xmlify($term);
- $post_type = (($item['resource_id']) ? t('photo') : t('status'));
- $targettype = (($item['resource_id']) ? ACTIVITY_OBJ_PHOTO : ACTIVITY_OBJ_NOTE );
+ $target = json_encode(array(
+ 'type' => $targettype,
+ 'id' => $item['mid'],
+ 'link' => $links,
+ 'title' => $item['title'],
+ 'content' => $item['body'],
+ 'created' => $item['created'],
+ 'edited' => $item['edited'],
+ 'author' => array(
+ 'name' => $item['xchan_name'],
+ 'address' => $item['xchan_addr'],
+ 'guid' => $item['xchan_guid'],
+ 'guid_sig' => $item['xchan_guid_sig'],
+ 'link' => array(
+ array('rel' => 'alternate', 'type' => 'text/html', 'href' => $item['xchan_url']),
+ array('rel' => 'photo', 'type' => $item['xchan_photo_mimetype'], 'href' => $item['xchan_photo_m'])),
+ ),
+ ));
- $link = xmlify('<link rel="alternate" type="text/html" href="'
- . $a->get_baseurl() . '/display/' . $owner['nickname'] . '/' . $item['id'] . '" />' . "\n") ;
- $body = xmlify($item['body']);
- $target = <<< EOT
- <target>
- <type>$targettype</type>
- <local>1</local>
- <id>{$item['uri']}</id>
- <link>$link</link>
- <title></title>
- <content>$body</content>
- </target>
-EOT;
+ $link = xmlify('<link rel="alternate" type="text/html" href="'
+ . $a->get_baseurl() . '/display/' . $owner['nickname'] . '/' . $item['id'] . '" />' . "\n") ;
$tagid = $a->get_baseurl() . '/search?tag=' . $term;
$objtype = ACTIVITY_OBJ_TAGTERM;
- $obj = <<< EOT
- <object>
- <type>$objtype</type>
- <local>1</local>
- <id>$tagid</id>
- <link>$tagid</link>
- <title>$xterm</title>
- <content>$xterm</content>
- </object>
-EOT;
+ $obj = json_encode(array(
+ 'type' => $objtype,
+ 'id' => $tagid,
+ 'link' => array(array('rel' => 'alternate','type' => 'text/html', 'href' => $tagid)),
+ 'title' => $term,
+ 'content' => $term
+ ));
$bodyverb = t('%1$s tagged %2$s\'s %3$s with %4$s');
- if(! isset($bodyverb))
- return;
+ $termlink = html_entity_decode('&#x2317;') . '[zrl=' . $a->get_baseurl() . '/search?tag=' . urlencode($term) . ']'. $term . '[/zrl]';
- $termlink = html_entity_decode('&#x2317;') . '[url=' . $a->get_baseurl() . '/search?tag=' . urlencode($term) . ']'. $term . '[/url]';
+ $channel = $a->get_channel();
$arr = array();
- $arr['uri'] = $uri;
- $arr['uid'] = $owner_uid;
- $arr['contact-id'] = $contact['id'];
- $arr['type'] = 'activity';
- $arr['wall'] = $item['wall'];
- $arr['gravity'] = GRAVITY_COMMENT;
- $arr['parent'] = $item['id'];
- $arr['parent_uri'] = $item['uri'];
- $arr['owner-name'] = $item['author-name'];
- $arr['owner-link'] = $item['author-link'];
- $arr['owner-avatar'] = $item['author-avatar'];
- $arr['author-name'] = $contact['name'];
- $arr['author-link'] = $contact['url'];
- $arr['author-avatar'] = $contact['thumb'];
+ $arr['owner_xchan'] = $item['owner_xchan'];
+ $arr['author_xchan'] = $channel['channel_hash'];
+
+
+ $arr['item_flags'] = ITEM_ORIGIN;
+ if($item['item_flags'] & ITEM_WALL)
+ $arr['item_flags'] |= ITEM_WALL;
- $ulink = '[url=' . $contact['url'] . ']' . $contact['name'] . '[/url]';
- $alink = '[url=' . $item['author-link'] . ']' . $item['author-name'] . '[/url]';
- $plink = '[url=' . $item['plink'] . ']' . $post_type . '[/url]';
+ $ulink = '[zrl=' . $channel['xchan_url'] . ']' . $channel['channel_name'] . '[/zrl]';
+ $alink = '[zrl=' . $item['xchan_url'] . ']' . $item['xchan_name'] . '[/zrl]';
+ $plink = '[zrl=' . $item['plink'] . ']' . $post_type . '[/zrl]';
+
$arr['body'] = sprintf( $bodyverb, $ulink, $alink, $plink, $termlink );
$arr['verb'] = ACTIVITY_TAG;
@@ -126,65 +122,14 @@ EOT;
$arr['target'] = $target;
$arr['obj_type'] = $objtype;
$arr['object'] = $obj;
- $arr['private'] = $item['private'];
- $arr['allow_cid'] = $item['allow_cid'];
- $arr['allow_gid'] = $item['allow_gid'];
- $arr['deny_cid'] = $item['deny_cid'];
- $arr['deny_gid'] = $item['deny_gid'];
- $arr['visible'] = 1;
- $arr['unseen'] = 1;
- $arr['origin'] = 1;
-
- $post_id = item_store($arr);
-
- q("UPDATE `item` set plink = '%s' where id = %d limit 1",
- dbesc($a->get_baseurl() . '/display/' . $owner_nick . '/' . $post_id),
- intval($post_id)
- );
-
-
- if(! $item['visible']) {
- $r = q("UPDATE `item` SET `visible` = 1 WHERE `id` = %d AND `uid` = %d LIMIT 1",
- intval($item['id']),
- intval($owner_uid)
- );
- }
-
- if((! $blocktags) && (! stristr($item['tag'], ']' . $term . '[' ))) {
- q("update item set tag = '%s' where id = %d limit 1",
- dbesc($item['tag'] . (strlen($item['tag']) ? ',' : '') . '#[url=' . $a->get_baseurl() . '/search?tag=' . $term . ']'. $term . '[/url]'),
- intval($item['id'])
- );
- }
-
- // if the original post is on this site, update it.
-
- $r = q("select `tag`,`id`,`uid` from item where `origin` = 1 AND `uri` = '%s' LIMIT 1",
- dbesc($item['uri'])
- );
- if(count($r)) {
- $x = q("SELECT `blocktags` FROM `user` WHERE `uid` = %d limit 1",
- intval($r[0]['uid'])
- );
- if(count($x) && !$x[0]['blocktags'] && (! stristr($r[0]['tag'], ']' . $term . '['))) {
- q("update item set tag = '%s' where id = %d limit 1",
- dbesc($r[0]['tag'] . (strlen($r[0]['tag']) ? ',' : '') . '#[url=' . $a->get_baseurl() . '/search?tag=' . $term . ']'. $term . '[/url]'),
- intval($r[0]['id'])
- );
- }
-
- }
-
-
- $arr['id'] = $post_id;
-
- call_hooks('post_local_end', $arr);
+ $arr['parent_mid'] = $item['mid'];
+
+ store_item_tag($item['uid'],$item['id'],TERM_OBJ_POST,TERM_HASHTAG,$term,$tagid);
+ $ret = post_activity_item($arr);
- proc_run('php',"include/notifier.php","tag","$post_id");
+ if($ret['success'])
+ proc_run('php','include/notifier.php','tag',$ret['activity']['id']);
killme();
- return; // NOTREACHED
-
-
} \ No newline at end of file
diff --git a/mod/thing.php b/mod/thing.php
new file mode 100644
index 000000000..d3b47ebb9
--- /dev/null
+++ b/mod/thing.php
@@ -0,0 +1,324 @@
+<?php /** @file */
+
+require_once('include/items.php');
+require_once('include/contact_selectors.php');
+
+
+function thing_init(&$a) {
+
+ if(! local_user())
+ return;
+
+ $account_id = $a->get_account();
+ $channel = $a->get_channel();
+
+ $term_hash = (($_REQUEST['term_hash']) ? $_REQUEST['term_hash'] : '');
+
+ $name = escape_tags($_REQUEST['term']);
+ $verb = escape_tags($_REQUEST['verb']);
+ $profile_guid = escape_tags($_REQUEST['profile']);
+ $url = $_REQUEST['link'];
+ $photo = $_REQUEST['img'];
+
+ $hash = random_string();
+
+
+ $verbs = obj_verbs();
+
+ /**
+ * verbs: [0] = first person singular, e.g. "I want", [1] = 3rd person singular, e.g. "Bill wants"
+ * We use the first person form when creating an activity, but the third person for use in activities
+ * FIXME: There is no accounting for verb gender for languages where this is significant. We may eventually
+ * require obj_verbs() to provide full conjugations and specify which form to use in the $_REQUEST params to this module.
+ */
+
+ $translated_verb = $verbs[$verb][1];
+
+ /**
+ * The site administrator can do things that normals cannot.
+ * This is restricted because it will likely cause
+ * an activitystreams protocol violation and the activity might
+ * choke in some other network and result in unnecessary
+ * support requests. It isn't because we're trying to be heavy-handed
+ * about what you can and can't do.
+ */
+
+ if(! $translated_verb) {
+ if(is_site_admin())
+ $translated_verb = $verb;
+ }
+
+ /**
+ * Things, objects: We do not provide definite (a, an) or indefinite (the) articles or singular/plural designators
+ * That needs to be specified in your thing. e.g. Mike has "a carrot", Greg wants "balls", Bob likes "the Boston Red Sox".
+ */
+
+ /**
+ * Future work on this module might produce more complex activities with targets, e.g. Phillip likes Karen's moustache
+ * and to describe other non-thing objects like channels, such as Karl wants Susan - where Susan represents a channel profile.
+ */
+
+ if((! $name) || (! $translated_verb))
+ return;
+
+
+
+
+
+ if($term_hash) {
+ $t = q("select * from obj left join term on obj_obj = term_hash where term_hash != '' and obj_type = %d and term_hash = '%s' limit 1",
+ intval(TERM_OBJ_THING),
+ dbesc($term_hash)
+ );
+ if(! $t) {
+ notice( t('Item not found.') . EOL);
+ return;
+ }
+ $orig_record = $t[0];
+ if($photo != $orig_record['imgurl']) {
+ $arr = import_profile_photo($photo,get_observer_hash(),true);
+ $local_photo = $arr[0];
+ $local_photo_type = $arr[3];
+ }
+ else
+ $local_photo = $orig_record['imgurl'];
+
+ $r = q("update term set term = '%s', url = '%s', imgurl = '%s' where term_hash = '%s' and uid = %d limit 1",
+ dbesc($name),
+ dbesc(($url) ? $url : z_root() . '/thing/' . $term_hash),
+ dbesc($local_photo),
+ dbesc($term_hash),
+ intval(local_user())
+ );
+
+ info( t('Thing updated') . EOL);
+ return;
+ }
+
+ $sql = (($profile_guid) ? " and profile_guid = '" . dbesc($profile_guid) . "' " : " and is_default = 1 ");
+ $p = q("select profile_guid, is_default from profile where uid = %d $sql limit 1",
+ intval(local_user())
+ );
+ if($p)
+ $profile = $p[0];
+ else
+ return;
+
+ $local_photo = null;
+
+ if($photo) {
+ $arr = import_profile_photo($photo,get_observer_hash(),true);
+ $local_photo = $arr[0];
+ $local_photo_type = $arr[3];
+ }
+
+
+ $r = q("select * from term where uid = %d and otype = %d and type = %d and term = '%s' limit 1",
+ intval(local_user()),
+ intval(TERM_OBJ_THING),
+ intval(TERM_THING),
+ dbesc($name)
+ );
+ if(! $r) {
+ $r = q("insert into term ( aid, uid, oid, otype, type, term, url, imgurl, term_hash )
+ values( %d, %d, %d, %d, %d, '%s', '%s', '%s', '%s' ) ",
+ intval($account_id),
+ intval(local_user()),
+ 0,
+ intval(TERM_OBJ_THING),
+ intval(TERM_THING),
+ dbesc($name),
+ dbesc(($url) ? $url : z_root() . '/thing/' . $hash),
+ dbesc(($photo) ? $local_photo : ''),
+ dbesc($hash)
+ );
+ $r = q("select * from term where uid = %d and otype = %d and type = %d and term = '%s' limit 1",
+ intval(local_user()),
+ intval(TERM_OBJ_THING),
+ intval(TERM_THING),
+ dbesc($name)
+ );
+ }
+ $term = $r[0];
+
+ $r = q("insert into obj ( obj_page, obj_verb, obj_type, obj_channel, obj_obj) values ('%s','%s', %d, %d, '%s') ",
+ dbesc($profile['profile_guid']),
+ dbesc($verb),
+ intval(TERM_OBJ_THING),
+ intval(local_user()),
+ dbesc($term['term_hash'])
+ );
+
+ if(! $r) {
+ notice( t('Object store: failed'));
+ return;
+ }
+
+ info( t('Thing added'));
+
+ $arr = array();
+ $links = array(array('rel' => 'alternate','type' => 'text/html', 'href' => $term['url']));
+ if($local_photo)
+ $links[] = array('rel' => 'photo', 'type' => $local_photo_type, 'href' => $local_photo);
+
+
+ $objtype = ACTIVITY_OBJ_THING;
+
+ $obj = json_encode(array(
+ 'type' => $objtype,
+ 'id' => $term['url'],
+ 'link' => $links,
+ 'title' => $term['term'],
+ 'content' => $term['term']
+ ));
+
+ $bodyverb = str_replace('OBJ: ', '',t('OBJ: %1$s %2$s %3$s'));
+
+ $arr['owner_xchan'] = $channel['channel_hash'];
+ $arr['author_xchan'] = $channel['channel_hash'];
+
+
+ $arr['item_flags'] = ITEM_ORIGIN|ITEM_WALL|ITEM_THREAD_TOP;
+
+ $ulink = '[zrl=' . $channel['xchan_url'] . ']' . $channel['channel_name'] . '[/zrl]';
+ $plink = '[zrl=' . $term['url'] . ']' . $term['term'] . '[/zrl]';
+
+ $arr['body'] = sprintf( $bodyverb, $ulink, $translated_verb, $plink );
+
+ if($local_photo)
+ $arr['body'] .= "\n\n[zmg]" . $local_photo . "[/zmg]";
+
+ $arr['verb'] = $verb;
+ $arr['obj_type'] = $objtype;
+ $arr['object'] = $obj;
+
+ if(! $profile['is_default']) {
+ $arr['item_private'] = true;
+ $str = '';
+ $r = q("select abook_hash from abook where abook_channel = %d and abook_profile = '%s'",
+ intval(local_user()),
+ dbesc($profile_guid)
+ );
+ if($r) {
+ $arr['allow_cid'] = '';
+ foreach($r as $rr)
+ $arr['allow_cid'] .= '<' . $rr['abook_hash'] . '>';
+ }
+ else
+ $arr['allow_cid'] = '<' . get_observer_hash() . '>';
+ }
+
+ $ret = post_activity_item($arr);
+
+
+}
+
+
+function thing_content(&$a) {
+
+ if(argc() == 2) {
+
+ $r = q("select * from obj left join term on obj_obj = term_hash where term_hash != '' and obj_type = %d and term_hash = '%s' limit 1",
+ intval(TERM_OBJ_THING),
+ dbesc(argv(1))
+ );
+
+ if($r) {
+ return replace_macros(get_markup_template('show_thing.tpl'), array(
+ '$header' => t('Show Thing'),
+ '$edit' => t('Edit'),
+ '$delete' => t('Delete'),
+ '$canedit' => ((local_user() && local_user() == $r[0]['obj_channel']) ? true : false),
+ '$thing' => $r[0] ));
+ }
+ else {
+ notice( t('item not found.') . EOL);
+ return;
+ }
+ }
+
+ if(! local_user()) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+ $thing_hash = '';
+
+ if(argc() == 3 && argv(1) === 'edit') {
+ $thing_hash = argv(2);
+
+
+ $r = q("select * from obj left join term on obj_obj = term_hash where term_hash != '' and obj_type = %d and term_hash = '%s' limit 1",
+ intval(TERM_OBJ_THING),
+ dbesc($thing_hash)
+ );
+
+ if((! $r) || ($r[0]['obj_channel'] != local_user())) {
+ notice( t('Permission denied.') . EOL);
+ return '';
+ }
+
+
+ $o .= replace_macros(get_markup_template('thing_edit.tpl'),array(
+ '$thing_hdr' => t('Edit Thing'),
+ '$multiprof' => feature_enabled(local_user(),'multi_profiles'),
+ '$profile_lbl' => t('Select a profile'),
+ '$profile_select' => contact_profile_assign($r[0]['obj_page']),
+ '$verb_lbl' => t('Select a category of stuff. e.g. I ______ something'),
+ '$verb_select' => obj_verb_selector($r[0]['obj_verb']),
+ '$thing_hash' => $thing_hash,
+ '$thing_lbl' => t('Name of thing e.g. something'),
+ '$thething' => $r[0]['term'],
+ '$url_lbl' => t('URL of thing (optional)'),
+ '$theurl' => $r[0]['url'],
+ '$img_lbl' => t('URL for photo of thing (optional)'),
+ '$imgurl' => $r[0]['imgurl'],
+ '$submit' => t('Submit')
+ ));
+
+ return $o;
+ }
+
+ if(argc() == 3 && argv(1) === 'drop') {
+ $thing_hash = argv(2);
+
+ $r = q("select * from obj left join term on obj_obj = term_hash where term_hash != '' and obj_type = %d and term_hash = '%s' limit 1",
+ intval(TERM_OBJ_THING),
+ dbesc($thing_hash)
+ );
+
+ if((! $r) || ($r[0]['obj_channel'] != local_user())) {
+ notice( t('Permission denied.') . EOL);
+ return '';
+ }
+
+
+ $x = q("delete from obj where obj_obj = '%s' and obj_type = %d and obj_channel = %d limit 1",
+ dbesc($thing_hash),
+ intval(TERM_OBJ_THING),
+ intval(local_user())
+ );
+ $x = q("delete from term where term_hash = '%s' and uid = %d limit 1",
+ dbesc($thing_hash),
+ intval(local_user())
+ );
+ return $o;
+ }
+
+ $o .= replace_macros(get_markup_template('thing_input.tpl'),array(
+ '$thing_hdr' => t('Add Thing to your Profile'),
+ '$multiprof' => feature_enabled(local_user(),'multi_profiles'),
+ '$profile_lbl' => t('Select a profile'),
+ '$profile_select' => contact_profile_assign(''),
+ '$verb_lbl' => t('Select a category of stuff. e.g. I ______ something'),
+ '$verb_select' => obj_verb_selector(),
+ '$thing_lbl' => t('Name of thing e.g. something'),
+ '$url_lbl' => t('URL of thing (optional)'),
+ '$img_lbl' => t('URL for photo of thing (optional)'),
+ '$submit' => t('Submit')
+ ));
+
+ return $o;
+
+
+}
diff --git a/mod/toggle_mobile.php b/mod/toggle_mobile.php
index 00991e44c..06dadca04 100644
--- a/mod/toggle_mobile.php
+++ b/mod/toggle_mobile.php
@@ -3,9 +3,9 @@
function toggle_mobile_init(&$a) {
if(isset($_GET['off']))
- $_SESSION['show-mobile'] = false;
+ $_SESSION['show_mobile'] = false;
else
- $_SESSION['show-mobile'] = true;
+ $_SESSION['show_mobile'] = true;
if(isset($_GET['address']))
$address = $_GET['address'];
diff --git a/mod/toggle_safesearch.php b/mod/toggle_safesearch.php
new file mode 100644
index 000000000..3c800c4f3
--- /dev/null
+++ b/mod/toggle_safesearch.php
@@ -0,0 +1,25 @@
+<?php
+
+function toggle_safesearch_init(&$a) {
+
+$observer = get_observer_hash();
+if (! $observer)
+ return;
+
+if($observer)
+ $safe_mode = get_xconfig($observer,'directory','safe_mode');
+if ($safe_mode == '')
+ set_xconfig($observer,'directory','safe_mode', '0');
+elseif($safe_mode == '0')
+ set_xconfig($observer,'directory','safe_mode', '1');
+elseif($safe_mode == '1')
+ set_xconfig($observer,'directory','safe_mode', '0');
+
+if(isset($_GET['address']))
+ $address = $_GET['address'];
+else
+ $address = z_root() . '/directory';
+
+ goaway($address);
+}
+
diff --git a/mod/update_channel.php b/mod/update_channel.php
index 19226297b..bdde0a3be 100644
--- a/mod/update_channel.php
+++ b/mod/update_channel.php
@@ -39,15 +39,17 @@ function update_channel_content(&$a) {
$replace = "<img\${1} dst=\"\${2}\"";
$text = preg_replace($pattern, $replace, $text);
- $replace = '<br />' . t('[Embedded content - reload page to view]') . '<br />';
- $pattern = "/<\s*audio[^>]*>(.*?)<\s*\/\s*audio>/i";
- $text = preg_replace($pattern, $replace, $text);
- $pattern = "/<\s*video[^>]*>(.*?)<\s*\/\s*video>/i";
- $text = preg_replace($pattern, $replace, $text);
- $pattern = "/<\s*embed[^>]*>(.*?)<\s*\/\s*embed>/i";
- $text = preg_replace($pattern, $replace, $text);
- $pattern = "/<\s*iframe[^>]*>(.*?)<\s*\/\s*iframe>/i";
- $text = preg_replace($pattern, $replace, $text);
+ if(! $load) {
+ $replace = '<br />' . t('[Embedded content - reload page to view]') . '<br />';
+ $pattern = "/<\s*audio[^>]*>(.*?)<\s*\/\s*audio>/i";
+ $text = preg_replace($pattern, $replace, $text);
+ $pattern = "/<\s*video[^>]*>(.*?)<\s*\/\s*video>/i";
+ $text = preg_replace($pattern, $replace, $text);
+ $pattern = "/<\s*embed[^>]*>(.*?)<\s*\/\s*embed>/i";
+ $text = preg_replace($pattern, $replace, $text);
+ $pattern = "/<\s*iframe[^>]*>(.*?)<\s*\/\s*iframe>/i";
+ $text = preg_replace($pattern, $replace, $text);
+ }
/**
* reportedly some versions of MSIE don't handle tabs in XMLHttpRequest documents very well
diff --git a/mod/update_display.php b/mod/update_display.php
index c8eb9c3a3..5802852bb 100644
--- a/mod/update_display.php
+++ b/mod/update_display.php
@@ -16,11 +16,12 @@ function update_display_content(&$a) {
echo (($_GET['msie'] == 1) ? '<div>' : '<section>');
- $text = display_content($a,$profile_uid, $load);
- $pattern = "/<img([^>]*) src=\"([^\"]*)\"/";
- $replace = "<img\${1} dst=\"\${2}\"";
- $text = preg_replace($pattern, $replace, $text);
+ $text = display_content($a,$profile_uid, $load);
+ $pattern = "/<img([^>]*) src=\"([^\"]*)\"/";
+ $replace = "<img\${1} dst=\"\${2}\"";
+ $text = preg_replace($pattern, $replace, $text);
+ if(! $load) {
$replace = '<br />' . t('[Embedded content - reload page to view]') . '<br />';
$pattern = "/<\s*audio[^>]*>(.*?)<\s*\/\s*audio>/i";
$text = preg_replace($pattern, $replace, $text);
@@ -30,9 +31,9 @@ function update_display_content(&$a) {
$text = preg_replace($pattern, $replace, $text);
$pattern = "/<\s*iframe[^>]*>(.*?)<\s*\/\s*iframe>/i";
$text = preg_replace($pattern, $replace, $text);
+ }
-
- echo str_replace("\t",' ',$text);
+ echo str_replace("\t",' ',$text);
echo (($_GET['msie'] == 1) ? '</div>' : '</section>');
echo "</body></html>\r\n";
// logger('update_display: ' . $text);
diff --git a/mod/update_network.php b/mod/update_network.php
index 16de19365..0021af876 100644
--- a/mod/update_network.php
+++ b/mod/update_network.php
@@ -11,7 +11,7 @@ function update_network_content(&$a) {
$load = (((argc() > 1) && (argv(1) == 'load')) ? 1 : 0);
header("Content-type: text/html");
echo "<!DOCTYPE html><html><body>\r\n";
- echo (($_GET['msie'] == 1) ? '<div>' : '<section>');
+ echo ((array_key_exists('msie',$_GET) && $_GET['msie'] == 1) ? '<div>' : '<section>');
$text = network_content($a,$profile_uid, $load);
@@ -19,19 +19,20 @@ function update_network_content(&$a) {
$replace = "<img\${1} dst=\"\${2}\"";
$text = preg_replace($pattern, $replace, $text);
- $replace = '<br />' . t('[Embedded content - reload page to view]') . '<br />';
- $pattern = "/<\s*audio[^>]*>(.*?)<\s*\/\s*audio>/i";
- $text = preg_replace($pattern, $replace, $text);
- $pattern = "/<\s*video[^>]*>(.*?)<\s*\/\s*video>/i";
- $text = preg_replace($pattern, $replace, $text);
- $pattern = "/<\s*embed[^>]*>(.*?)<\s*\/\s*embed>/i";
- $text = preg_replace($pattern, $replace, $text);
- $pattern = "/<\s*iframe[^>]*>(.*?)<\s*\/\s*iframe>/i";
- $text = preg_replace($pattern, $replace, $text);
-
+ if(! $load) {
+ $replace = '<br />' . t('[Embedded content - reload page to view]') . '<br />';
+ $pattern = "/<\s*audio[^>]*>(.*?)<\s*\/\s*audio>/i";
+ $text = preg_replace($pattern, $replace, $text);
+ $pattern = "/<\s*video[^>]*>(.*?)<\s*\/\s*video>/i";
+ $text = preg_replace($pattern, $replace, $text);
+ $pattern = "/<\s*embed[^>]*>(.*?)<\s*\/\s*embed>/i";
+ $text = preg_replace($pattern, $replace, $text);
+ $pattern = "/<\s*iframe[^>]*>(.*?)<\s*\/\s*iframe>/i";
+ $text = preg_replace($pattern, $replace, $text);
+ }
echo str_replace("\t",' ',$text);
- echo (($_GET['msie'] == 1) ? '</div>' : '</section>');
+ echo ((array_key_exists('msie',$_GET) && $_GET['msie'] == 1) ? '</div>' : '</section>');
echo "</body></html>\r\n";
// logger('update_network: ' . $text);
killme();
diff --git a/mod/update_search.php b/mod/update_search.php
new file mode 100644
index 000000000..ec7599b79
--- /dev/null
+++ b/mod/update_search.php
@@ -0,0 +1,66 @@
+<?php
+
+/**
+ * Module: update_profile
+ * Purpose: AJAX synchronisation of search page
+ *
+ */
+
+
+require_once('mod/search.php');
+
+function update_search_content(&$a) {
+
+ $profile_uid = intval($_GET['p']);
+ if(! $profile_uid)
+ $profile_uid = (-1);
+
+ $load = (((argc() > 1) && (argv(1) == 'load')) ? 1 : 0);
+
+ header("Content-type: text/html");
+ echo "<!DOCTYPE html><html><body>\r\n";
+
+ /**
+ * We can remove this hack once Internet Explorer recognises HTML5 natively
+ */
+
+ echo (($_GET['msie'] == 1) ? '<div>' : '<section>');
+
+ /**
+ *
+ * Grab the page inner contents by calling the content function from the profile module directly,
+ * but move any image src attributes to another attribute name. This is because
+ * some browsers will prefetch all the images for the page even if we don't need them.
+ * The only ones we need to fetch are those for new page additions, which we'll discover
+ * on the client side and then swap the image back.
+ *
+ */
+
+ $text = search_content($a,$profile_uid,$load);
+
+ $pattern = "/<img([^>]*) src=\"([^\"]*)\"/";
+ $replace = "<img\${1} dst=\"\${2}\"";
+ $text = preg_replace($pattern, $replace, $text);
+
+ if(! $load) {
+ $replace = '<br />' . t('[Embedded content - reload page to view]') . '<br />';
+ $pattern = "/<\s*audio[^>]*>(.*?)<\s*\/\s*audio>/i";
+ $text = preg_replace($pattern, $replace, $text);
+ $pattern = "/<\s*video[^>]*>(.*?)<\s*\/\s*video>/i";
+ $text = preg_replace($pattern, $replace, $text);
+ $pattern = "/<\s*embed[^>]*>(.*?)<\s*\/\s*embed>/i";
+ $text = preg_replace($pattern, $replace, $text);
+ $pattern = "/<\s*iframe[^>]*>(.*?)<\s*\/\s*iframe>/i";
+ $text = preg_replace($pattern, $replace, $text);
+ }
+
+ /**
+ * reportedly some versions of MSIE don't handle tabs in XMLHttpRequest documents very well
+ */
+
+ echo str_replace("\t",' ',$text);
+ echo (($_GET['msie'] == 1) ? '</div>' : '</section>');
+ echo "</body></html>\r\n";
+ killme();
+
+} \ No newline at end of file
diff --git a/mod/view.php b/mod/view.php
index 9e5eff962..d4381743c 100644
--- a/mod/view.php
+++ b/mod/view.php
@@ -1,6 +1,6 @@
<?php
/**
- * load view/theme/$current_theme/style.php with friendica contex
+ * load view/theme/$current_theme/style.php with Red context
*/
function view_init($a){
diff --git a/mod/viewconnections.php b/mod/viewconnections.php
index e6c739562..4f6f81d82 100644
--- a/mod/viewconnections.php
+++ b/mod/viewconnections.php
@@ -11,17 +11,6 @@ function viewconnections_init(&$a) {
profile_load($a,argv(1));
}
-
-function viewconnections_aside(&$a) {
-
- if((get_config('system','block_public')) && (! local_user()) && (! remote_user())) {
- return;
- }
-
- profile_create_sidebar($a);
-}
-
-
function viewconnections_content(&$a) {
if((get_config('system','block_public')) && (! local_user()) && (! remote_user())) {
@@ -41,14 +30,11 @@ function viewconnections_content(&$a) {
- $r = q("SELECT COUNT(abook_id) as total FROM abook WHERE abook_channel = %d AND abook_flags = 0 ",
- intval($a->profile['uid'])
- );
- if($r)
- $a->set_pager_total($r[0]['total']);
-
- $r = q("SELECT * FROM abook left join xchan on abook_xchan = xchan_hash where abook_channel = %d and abook_flags = 0 order by xchan_name LIMIT %d , %d ",
+ $r = q("SELECT * FROM abook left join xchan on abook_xchan = xchan_hash where abook_channel = %d and abook_flags = 0 and not ( xchan_flags & %d ) and not ( xchan_flags & %d ) and not ( xchan_flags & %d ) order by xchan_name LIMIT %d , %d ",
intval($a->profile['uid']),
+ intval(XCHAN_FLAGS_HIDDEN),
+ intval(XCHAN_FLAGS_ORPHAN),
+ intval(XCHAN_FLAGS_DELETED),
intval($a->pager['start']),
intval($a->pager['itemspage'])
);
@@ -63,18 +49,19 @@ function viewconnections_content(&$a) {
foreach($r as $rr) {
$url = zid($rr['xchan_url']);
-
- $contacts[] = array(
- 'id' => $rr['abook_id'],
- 'img_hover' => sprintf( t('Visit %s\'s profile [%s]'), $rr['xchan_name'], $rr['xchan_url']),
- 'thumb' => $rr['xchan_photo_m'],
- 'name' => substr($rr['xchan_name'],0,20),
- 'username' => $rr['xchan_addr'],
- 'url' => $url,
- 'sparkle' => '',
- 'itemurl' => $rr['url'],
- 'network' => '',
- );
+ if($url) {
+ $contacts[] = array(
+ 'id' => $rr['abook_id'],
+ 'img_hover' => sprintf( t('Visit %s\'s profile [%s]'), $rr['xchan_name'], $rr['xchan_url']),
+ 'thumb' => $rr['xchan_photo_m'],
+ 'name' => substr($rr['xchan_name'],0,20),
+ 'username' => $rr['xchan_addr'],
+ 'link' => $url,
+ 'sparkle' => '',
+ 'itemurl' => $rr['url'],
+ 'network' => '',
+ );
+ }
}
diff --git a/mod/wall_upload.php b/mod/wall_upload.php
index cee40744f..dd5d760b3 100644
--- a/mod/wall_upload.php
+++ b/mod/wall_upload.php
@@ -1,6 +1,6 @@
<?php
-require_once('Photo.php');
+require_once('include/photo/photo_driver.php');
require_once('include/photos.php');
@@ -52,8 +52,11 @@ function wall_upload_post(&$a) {
$m = $ret['body'];
+ // This might make Friendica for Android uploads work again, as it won't have any knowledge of zrl and zmg tags
+ // and these tags probably aren't useful with other client apps.
+
if($using_api)
- return($ret['body']);
+ return(str_replace(array('zrl','zmg'),array('url','img'),$ret['body']));
else
echo "\n\n" . $ret['body'] . "\n\n";
killme();
diff --git a/mod/webpages.php b/mod/webpages.php
new file mode 100644
index 000000000..7e1b32f36
--- /dev/null
+++ b/mod/webpages.php
@@ -0,0 +1,127 @@
+<?php
+
+function webpages_content(&$a) {
+
+ if(argc() > 1)
+ $which = argv(1);
+ else {
+ notice( t('Requested profile is not available.') . EOL );
+ $a->error = 404;
+ return;
+ }
+
+ $profile = 0;
+ $channel = $a->get_channel();
+
+ if((local_user()) && (argc() > 2) && (argv(2) === 'view')) {
+ $which = $channel['channel_address'];
+ $profile = argv(1);
+ }
+
+ profile_load($a,$which,$profile);
+
+
+// Figure out who the page owner is.
+ $r = q("select channel_id from channel where channel_address = '%s'",
+ dbesc($which)
+ );
+ if($r) {
+ $owner = intval($r[0]['channel_id']);
+ }
+
+// Get the observer, check their permissions
+
+ $observer = $a->get_observer();
+ $ob_hash = (($observer) ? $observer['xchan_hash'] : '');
+
+ $perms = get_all_perms($owner,$ob_hash);
+
+ if(! $perms['write_pages']) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+// if(local_user() && local_user() == $owner) {
+// $a->set_widget('design',design_tools());
+// }
+
+
+ $mimetype = get_config('system','page_mimetype');
+ if(! $mimetype)
+ $mimetype = 'choose';
+
+ $layout = get_config('system','page_layout');
+ if(! $layout)
+ $layout = 'choose';
+
+
+// Create a status editor (for now - we'll need a WYSIWYG eventually) to create pages
+// Nickname is set to the observers xchan, and profile_uid to the owners. This lets you post pages at other people's channels.
+ require_once ('include/conversation.php');
+ require_once('include/acl_selectors.php');
+
+
+ if(local_user() && local_user() == $a->profile_uid) {
+ $channel = $a->get_channel();
+ $channel_acl = array(
+ 'allow_cid' => $channel['channel_allow_cid'],
+ 'allow_gid' => $channel['channel_allow_gid'],
+ 'deny_cid' => $channel['channel_deny_cid'],
+ 'deny_gid' => $channel['channel_deny_gid']
+ );
+ }
+ else
+ $channel_acl = array();
+
+
+
+
+
+ $x = array(
+ 'webpage' => ITEM_WEBPAGE,
+ 'is_owner' => true,
+ 'nickname' => $a->profile['channel_address'],
+ 'lockstate' => (($group || $cid || $channel['channel_allow_cid'] || $channel['channel_allow_gid'] || $channel['channel_deny_cid'] || $channel['channel_deny_gid']) ? 'lock' : 'unlock'),
+ 'bang' => (($group || $cid) ? '!' : ''),
+ 'acl' => ((local_user() && local_user() == $owner) ? populate_acl($channel_acl) : ''),
+ 'visitor' => 'block',
+ 'profile_uid' => intval($owner),
+ 'mimetype' => $mimetype,
+ 'layout' => $layout,
+ );
+
+ $o .= status_editor($a,$x);
+
+
+//Get a list of webpages. We can't display all them because endless scroll makes that unusable, so just list titles and an edit link.
+//TODO - this should be replaced with pagelist_widget
+
+ $r = q("select item_id.* from item_id left join item on item_id.iid = item.id where item_id.uid = %d and service = 'WEBPAGE' order by item.created desc",
+ intval($owner)
+ );
+
+ $pages = null;
+
+ if($r) {
+ $pages = array();
+ foreach($r as $rr) {
+ $pages[$rr['iid']][] = array('url' => $rr['iid'],'title' => $rr['sid']);
+ }
+ }
+
+
+//Build the base URL for edit links
+ $url = z_root() . "/editwebpage/" . $which;
+// This isn't pretty, but it works. Until I figure out what to do with the UI, it's Good Enough(TM).
+ return $o . replace_macros(get_markup_template("webpagelist.tpl"), array(
+ '$baseurl' => $url,
+ '$edit' => t('Edit'),
+ '$pages' => $pages,
+ '$channel' => $which,
+ '$view' => t('View'),
+ '$preview' => t('Preview'),
+
+ ));
+
+
+}
diff --git a/mod/wfinger.php b/mod/wfinger.php
new file mode 100644
index 000000000..33d2fe478
--- /dev/null
+++ b/mod/wfinger.php
@@ -0,0 +1,99 @@
+<?php
+
+function wfinger_init(&$a) {
+
+ $result = array();
+
+ $scheme = '';
+
+ if(x($_SERVER,'HTTPS') && $_SERVER['HTTPS'])
+ $scheme = 'https';
+ elseif(x($_SERVER,'SERVER_PORT') && (intval($_SERVER['SERVER_PORT']) == 443))
+ $scheme = 'https';
+
+ // Don't complain to me - I'm just implementing the spec.
+
+ if($scheme !== 'https') {
+ header($_SERVER["SERVER_PROTOCOL"] . ' ' . 500 . ' ' . 'Webfinger requires HTTPS');
+ killme();
+ }
+
+ $resource = $_REQUEST['resource'];
+
+ header('Access-Control-Allow-Origin: *');
+
+ header('Content-type: application/jrd+json');
+
+ $r = null;
+
+ if($resource) {
+
+ if(strpos($resource,'acct:') === 0) {
+ $channel = str_replace('acct:','',$resource);
+ $channel = substr($channel,0,strpos($channel,'@'));
+ }
+ if(strpos($resource,'http') === 0) {
+ $channel = str_replace('~','',basename($resource));
+ }
+
+ $r = q("select * from channel left join xchan on channel_hash = xchan_hash
+ where channel_address = '%s' limit 1",
+ dbesc($channel)
+ );
+
+ }
+
+ if($resource && $r) {
+
+ $result['subject'] = $resource;
+
+ $aliases = array(
+ 'acct:' . $r[0]['channel_address'] . '@' . $a->get_hostname(),
+ z_root() . '/channel/' . $r[0]['channel_address'],
+ z_root() . '/~' . $r[0]['channel_address']
+ );
+
+ $result['aliases'] = array();
+
+ foreach($aliases as $alias)
+ if($alias != $resource)
+ $result['aliases'][] = $alias;
+
+
+ $result['links'] = array(
+
+ array(
+ 'rel' => 'http://webfinger.example/rel/avatar',
+ 'type' => $r[0]['xchan_photo_mimetype'],
+ 'href' => $r[0]['xchan_photo_l']
+ ),
+
+ array(
+ 'rel' => 'http://webfinger.example/rel/profile-page',
+ 'href' => z_root() . '/profile/' . $r[0]['channel_address'],
+ ),
+
+ array(
+ 'rel' => 'http://webfinger.example/rel/blog',
+ 'href' => z_root() . '/channel/' . $r[0]['channel_address'],
+ ),
+
+ array(
+ 'rel' => 'http://purl.org/zot/protocol',
+ 'href' => z_root() . '/.well-known/zot-info' . '?zaddr=' . $r[0]['xchan_addr'],
+ )
+ );
+
+ }
+ else {
+ header($_SERVER["SERVER_PROTOCOL"] . ' ' . 400 . ' ' . 'Bad Request');
+ killme();
+ }
+
+ $arr = array('channel' => $r[0], 'request' => $_REQUEST, 'result' => $result);
+ call_hooks('webfinger',$arr);
+
+ echo json_encode($arr['result']);
+ killme();
+
+} \ No newline at end of file
diff --git a/mod/xref.php b/mod/xref.php
new file mode 100644
index 000000000..95cc22aa7
--- /dev/null
+++ b/mod/xref.php
@@ -0,0 +1,20 @@
+<?php
+
+function xref_init(&$a) {
+ // Sets a referral URL using an xchan directly
+ // Link format: example.com/xref/[xchan]/[TargetURL]
+ // Target URL is optional.
+ // Cookie lasts 24 hours to survive a browser restart. Contains no personal
+ // information at all - just somebody else's xchan.
+ $referrer = argv(1);
+ $expire=time()+60*60*2;
+ $path = 'xref';
+ setcookie($path, $referrer, $expire, "/");
+ $url = '';
+
+ if (argc() > 2)
+ $url = argv(2);
+
+ goaway (z_root() . '/' . $url);
+
+}
diff --git a/mod/zfinger.php b/mod/zfinger.php
index 74353e8f9..94671271b 100644
--- a/mod/zfinger.php
+++ b/mod/zfinger.php
@@ -52,10 +52,33 @@ function zfinger_init(&$a) {
);
}
elseif(strlen($zaddr)) {
- $r = q("select channel.*, xchan.* from channel left join xchan on channel_hash = xchan_hash
- where channel_address = '%s' limit 1",
- dbesc($zaddr)
- );
+ if(strpos($zaddr,'[system]') === false) { /* normal address lookup */
+ $r = q("select channel.*, xchan.* from channel left join xchan on channel_hash = xchan_hash
+ where ( channel_address = '%s' or xchan_addr = '%s' ) limit 1",
+ dbesc($zaddr),
+ dbesc($zaddr)
+ );
+ }
+
+ else {
+
+ /**
+ * The special address '[system]' will return a system channel if one has been defined,
+ * Or the first valid channel we find if there are no system channels.
+ *
+ * This is used by magic-auth if we have no prior communications with this site - and
+ * returns an identity on this site which we can use to create a valid hub record so that
+ * we can exchange signed messages. The precise identity is irrelevant. It's the hub
+ * information that we really need at the other end - and this will return it.
+ *
+ */
+
+ $r = q("select channel.*, xchan.* from channel left join xchan on channel_hash = xchan_hash
+ where (( channel_pageflags & %d ) or not ( channel_pageflags & %d )) order by channel_id limit 1",
+ intval(PAGE_SYSTEM),
+ intval(PAGE_REMOVED)
+ );
+ }
}
else {
$ret['message'] = 'Invalid request';
@@ -71,7 +94,9 @@ function zfinger_init(&$a) {
$id = $e['channel_id'];
- $searchable = (($e['channel_pageflags'] & PAGE_HIDDEN) ? false : true);
+ $special_channel = (($e['channel_pageflags'] & PAGE_PREMIUM) ? true : false);
+ $adult_channel = (($e['channel_pageflags'] & PAGE_ADULT) ? true : false);
+ $searchable = (($e['channel_pageflags'] & PAGE_HIDDEN) ? false : true);
if($e['xchan_flags'] & XCHAN_FLAGS_HIDDEN)
$searchable = false;
@@ -91,6 +116,9 @@ function zfinger_init(&$a) {
$profile['birthday'] = $p[0]['dob'];
if($profile['birthday'] != '0000-00-00')
$profile['next_birthday'] = z_birthday($p[0]['dob'],$e['channel_timezone']);
+
+ if($age = age($p[0]['dob'],$e['channel_timezone'],''))
+ $profile['age'] = $age;
$profile['gender'] = $p[0]['gender'];
$profile['marital'] = $p[0]['marital'];
$profile['sexual'] = $p[0]['sexual'];
@@ -98,13 +126,20 @@ function zfinger_init(&$a) {
$profile['region'] = $p[0]['region'];
$profile['postcode'] = $p[0]['postal_code'];
$profile['country'] = $p[0]['country_name'];
+ $profile['about'] = $p[0]['about'];
+ $profile['homepage'] = $p[0]['homepage'];
+ $profile['hometown'] = $p[0]['hometown'];
+
if($p[0]['keywords']) {
$tags = array();
$k = explode(' ',$p[0]['keywords']);
- if($k)
- foreach($k as $kk)
- if(trim($kk))
- $tags[] = trim($kk);
+ if($k) {
+ foreach($k as $kk) {
+ if(trim($kk," \t\n\r\0\x0B,")) {
+ $tags[] = trim($kk," \t\n\r\0\x0B,");
+ }
+ }
+ }
if($tags)
$profile['keywords'] = $tags;
}
@@ -125,11 +160,21 @@ function zfinger_init(&$a) {
$ret['photo_updated'] = $e['xchan_photo_date'];
$ret['url'] = $e['xchan_url'];
$ret['connections_url']= (($e['xchan_connurl']) ? $e['xchan_connurl'] : z_root() . '/poco/' . $e['channel_address']);
- $ret['name_updated'] = $e['xchan_name_date'];
$ret['target'] = $ztarget;
$ret['target_sig'] = $zsig;
$ret['searchable'] = $searchable;
+ $ret['adult_content'] = $adult_channel;
+
+
+ // premium or other channel desiring some contact with potential followers before connecting.
+ // This is a template - %s will be replaced with the follow_url we discover for the return channel.
+
+ if($special_channel)
+ $ret['connect_url'] = z_root() . '/connect/' . $e['channel_address'];
+
+ // This is a template for our follow url, %s will be replaced with a webbie
+ $ret['follow_url'] = z_root() . '/follow?f=&url=%s';
$permissions = get_all_perms($e['channel_id'],(($ztarget && $zsig)
? base64url_encode(hash('whirlpool',$ztarget . $zsig,true))
@@ -145,7 +190,8 @@ function zfinger_init(&$a) {
// array of (verified) hubs this channel uses
$ret['locations'] = array();
- $x = zot_get_hubloc(array($e['channel_hash']));
+
+ $x = zot_get_hublocs($e['channel_hash']);
if($x && count($x)) {
foreach($x as $hub) {
if(! ($hub['hubloc_flags'] & HUBLOC_FLAGS_UNVERIFIED)) {
@@ -156,7 +202,8 @@ function zfinger_init(&$a) {
'url' => $hub['hubloc_url'],
'url_sig' => $hub['hubloc_url_sig'],
'callback' => $hub['hubloc_callback'],
- 'sitekey' => $hub['hubloc_sitekey']
+ 'sitekey' => $hub['hubloc_sitekey'],
+ 'deleted' => (($hub['hubloc_flags'] & HUBLOC_FLAGS_DELETED) ? true : false)
);
}
}
@@ -164,6 +211,8 @@ function zfinger_init(&$a) {
$ret['site'] = array();
$ret['site']['url'] = z_root();
+ $ret['site']['url_sig'] = base64url_encode(rsa_sign(z_root(),$e['channel_prvkey']));
+
$dirmode = get_config('system','directory_mode');
if(($dirmode === false) || ($dirmode == DIRECTORY_MODE_NORMAL))
$ret['site']['directory_mode'] = 'normal';
@@ -175,7 +224,61 @@ function zfinger_init(&$a) {
$ret['site']['directory_mode'] = 'standalone';
if($dirmode != DIRECTORY_MODE_NORMAL)
$ret['site']['directory_url'] = z_root() . '/dirsearch';
-
+
+
+ // hide detailed site information if you're off the grid
+
+ if($dirmode != DIRECTORY_MODE_STANDALONE) {
+
+ $register_policy = intval(get_config('system','register_policy'));
+
+
+ if($register_policy == REGISTER_CLOSED)
+ $ret['site']['register_policy'] = 'closed';
+ if($register_policy == REGISTER_APPROVE)
+ $ret['site']['register_policy'] = 'approve';
+ if($register_policy == REGISTER_OPEN)
+ $ret['site']['register_policy'] = 'open';
+
+
+ $access_policy = intval(get_config('system','access_policy'));
+
+ if($access_policy == ACCESS_PRIVATE)
+ $ret['site']['access_policy'] = 'private';
+ if($access_policy == ACCESS_PAID)
+ $ret['site']['access_policy'] = 'paid';
+ if($access_policy == ACCESS_FREE)
+ $ret['site']['access_policy'] = 'free';
+ if($access_policy == ACCESS_TIERED)
+ $ret['site']['access_policy'] = 'tiered';
+
+ require_once('include/account.php');
+ $ret['site']['accounts'] = account_total();
+
+ require_once('include/identity.php');
+ $ret['site']['channels'] = channel_total();
+
+
+ $ret['site']['version'] = RED_PLATFORM . ' ' . RED_VERSION . '[' . DB_UPDATE_VERSION . ']';
+
+ $ret['site']['admin'] = get_config('system','admin_email');
+
+ $visible_plugins = array();
+ if(is_array($a->plugins) && count($a->plugins)) {
+ $r = q("select * from addon where hidden = 0");
+ if($r)
+ foreach($r as $rr)
+ $visible_plugins[] = $rr['name'];
+ }
+
+ $ret['site']['plugins'] = $visible_plugins;
+ $ret['site']['sitehash'] = get_config('system','location_hash');
+ $ret['site']['sitename'] = get_config('system','sitename');
+ $ret['site']['sellpage'] = get_config('system','sellpage');
+ $ret['site']['location'] = get_config('system','site_location');
+
+ }
+ call_hooks('zot_finger',$ret);
json_return_and_die($ret);
-} \ No newline at end of file
+}
diff --git a/mod/zotfeed.php b/mod/zotfeed.php
index 76a860139..6d84a5a1e 100644
--- a/mod/zotfeed.php
+++ b/mod/zotfeed.php
@@ -9,7 +9,7 @@ function zotfeed_init(&$a) {
$mindate = (($_REQUEST['mindate']) ? datetime_convert('UTC','UTC',$_REQUEST['mindate']) : '');
if(! $mindate)
- $mindate = '0000-00-00 00:00:00';
+ $mindate = datetime_convert('UTC','UTC', 'now - 1 month');
if(get_config('system','block_public') && (! get_account_id()) && (! remote_user())) {
$result['message'] = 'Public access denied';
@@ -21,7 +21,7 @@ function zotfeed_init(&$a) {
$channel_address = ((argc() > 1) ? argv(1) : '');
if($channel_address) {
- $r = q("select channel_id from channel where channel_address = '%s' limit 1",
+ $r = q("select channel_id, channel_name from channel where channel_address = '%s' limit 1",
dbesc(argv(1))
);
}
@@ -30,6 +30,8 @@ function zotfeed_init(&$a) {
json_return_and_die($result);
}
+ logger('zotfeed request: ' . $r[0]['channel_name'], LOGGER_DEBUG);
+
$result['messages'] = zot_feed($r[0]['channel_id'],$observer['xchan_hash'],$mindate);
$result['success'] = true;
json_return_and_die($result);
diff --git a/mod/zperms.php b/mod/zperms.php
deleted file mode 100644
index 6a7097cd6..000000000
--- a/mod/zperms.php
+++ /dev/null
@@ -1,84 +0,0 @@
-<?php
-
-function zperms_init(&$a) {
-
- require_once('include/zot.php');
- require_once('include/Contact.php');
- require_once('include/crypto.php');
-
- $ret = array('success' => false);
-
- $zguid = ((x($_REQUEST,'guid')) ? $_REQUEST['guid'] : '');
- $zaddr = ((x($_REQUEST,'address')) ? $_REQUEST['address'] : '');
- $ztarget = ((x($_REQUEST,'target')) ? $_REQUEST['target'] : '');
- $zsig = ((x($_REQUEST,'target_sig')) ? $_REQUEST['target_sig'] : '');
-
- $r = null;
-
- if(strlen($zguid)) {
- $r = q("select * from channel where channel_guid = '%s' limit 1",
- dbesc($zguid)
- );
- }
- elseif(strlen($zaddr)) {
- $r = q("select * from channel where channel_address = '%s' limit 1",
- dbesc($zaddr)
- );
- }
- else {
- $ret['message'] = 'Invalid request';
- json_return_and_die($ret);
- }
-
- if(! ($r && count($r))) {
- $ret['message'] = 'Item not found.';
- json_return_and_die($ret);
- }
- $e = $r[0];
-
- $id = $e['channel_id'];
- $r = q("select contact.*, profile.*
- from contact left join profile on contact.uid = profile.uid
- where contact.uid = %d && contact.self = 1 and profile.is_default = 1 limit 1",
- intval($id)
- );
- if($r && count($r)) {
- $profile = $r[0];
- }
-
-
-
- $ret['success'] = true;
- $ret['guid'] = $e['channel_guid'];
- $ret['guid_sig'] = base64url_encode(rsa_sign($e['channel_guid'],$e['channel_prvkey']));
- $ret['key'] = $e['channel_pubkey'];
- $ret['name'] = $e['channel_name'];
- $ret['address'] = $e['channel_address'];
- $ret['target'] = $ztarget;
- $ret['target_sig'] = $zsig;
- $ret['permissions'] = map_perms($r[0],$ztarget,$zsig);
-
- $ret['profile'] = $profile;
-
- // array of (verified) hubs this channel uses
-
- $ret['hubs'] = array();
- $x = zot_get_hubloc(array($e['channel_guid']));
- if($x && count($x)) {
- foreach($x as $hub) {
- if(! ($hub['hubloc_flags'] & HUBLOC_FLAGS_UNVERIFIED)) {
- $ret['hubs'][] = array(
- 'primary' => (($hub['hubloc_flags'] & HUBLOC_FLAGS_PRIMARY) ? true : false),
- 'url' => $hub['hubloc_url'],
- /// hmmm we probably shouldn't sign somebody else's hub. FIXME
- 'url_sig' => base64url_encode(rsa_sign($hub['hubloc_url'],$e['channel_prvkey'])),
- 'callback' => $hub['hubloc_callback'],
- 'sitekey' => $hub['hubloc_sitekey']
- );
- }
- }
- }
-
- json_return_and_die($ret);
-
-}
diff --git a/mod/zping.php b/mod/zping.php
new file mode 100644
index 000000000..76f4470c1
--- /dev/null
+++ b/mod/zping.php
@@ -0,0 +1,28 @@
+<?php /** @file */
+
+require_once('include/zot.php');
+
+function zping_content(&$a) {
+
+ // This is just a test utility function and may go away once we build these tools into
+ // the address book and directory to do dead site discovery.
+
+ // The response packet include the current URL and key so we can discover if the server
+ // has been re-installed and clean up (e.g. get rid of) any old hublocs and xchans.
+
+ // Remember to add '/post' to the url
+
+ if(! local_user())
+ return;
+
+ $url = $_REQUEST['url'];
+
+ if(! $url)
+ return;
+
+
+ $m = zot_build_packet($a->get_channel(),'ping');
+ $r = zot_zot($url,$m);
+ return print_r($r,true);
+
+} \ No newline at end of file
diff --git a/spec/dfrn-snap2.jpg b/spec/dfrn-snap2.jpg
deleted file mode 100644
index ee00f5654..000000000
--- a/spec/dfrn-snap2.jpg
+++ /dev/null
Binary files differ
diff --git a/spec/dfrn2.odt b/spec/dfrn2.odt
deleted file mode 100644
index 390fc4bb8..000000000
--- a/spec/dfrn2.odt
+++ /dev/null
Binary files differ
diff --git a/spec/dfrn2.pdf b/spec/dfrn2.pdf
deleted file mode 100644
index e46225f7e..000000000
--- a/spec/dfrn2.pdf
+++ /dev/null
Binary files differ
diff --git a/spec/zot-2012.txt b/spec/zot-2012.txt
deleted file mode 100644
index d01af5c87..000000000
--- a/spec/zot-2012.txt
+++ /dev/null
@@ -1,44 +0,0 @@
-
-Initial cut at Zot-2012 protocol. This is a very rough draft of some very rough ideas and concepts.
-It is not yet intended to be a definitive specification and many things like the security handshakes are yet to be specified precisely.
-
-All communications are https
-
-
-First create a global unique channel and assign a location
-
-Site id is 'https://macgirvin.com'
-Site channel-id is 'https://macgirvin.com/channel/1'
-
-$guid = base64url_encode(hash('whirlpool','https://macgirvin.com/channel/1.' . mt_rand(1000000,9999999),1);
-
-$guid_sig = base64_urlencode(rsa_sign($guid,$myprivatekey));
-
-$location = Site id
-$location_sig = base64_urlencode(rsa_sign($location,$myprivatekey));
-
-
-This information will identify a channel+site pair in the future. When contact is made initially, a lookup is performed to a well known URL at this site to verify the signatures of both the guid and the site. After this information has been verified, it is stored and we can use them to uniquely identify a channel/location pair in the future.
-
-If a new location is provided, this process is repeated but only the new location needs to be verified and stored.
-
-Messages are sent by providing this information in an HTTP post (*) to the other site, along with a protocol version specifier and type of message and a verification token. For message types which do not require identity validation, the message may be included. Others will require a security handshake with the remote site calling back the original to verify the identity assertion and the message is only collected at that time.
-
-Multiple messages may be sent, and a callback may result in the collection of multiple messages destined for this site, not necessarily limited to the channel/location which was asserted.
-
-
-(*) A POST method is used for many protocol transactions as site "hardening" tools may place overly restrictive length limits on GET data. We are typically sending several encoded/encrypted strings and these requests are likely to fail on some sites and become a nagging support issue if a GET request is used.
-
-The verification token is signed by the remote site and the signed token returned during the callback. This verifies the identity of the callback - by matching with known tokens.
-
-
-Permissions:
-
-Permissions are available for several different activities. This list is enumerated by a POST to the permissions service with the above channel+location information. An array of permissions will be returned. If no identity assertion is made, a list of the default channel permissions is returned.
-
-
-
-
-
-
-
diff --git a/spec/zot.txt b/spec/zot.txt
deleted file mode 100644
index 2c3bbb180..000000000
--- a/spec/zot.txt
+++ /dev/null
@@ -1,362 +0,0 @@
-This is the Zot! social communications protocol.
-
-Specification revision: 1
-2 October 2011
-
-Mike Macgirvin
-This specification is public domain.
-
-Zot is a framework for secure delivery of messages on the web based on
-webfinger and encapsulating salmon.
-
-First read the salmon and salmon magic envelope specifications. Zot also
-makes use of webfinger and ActivityStreams and several concepts from RFC822
-(email). Zot encompasses the zot delivery framework and the zid remote
-access protocol.
-
-The current specification revision (1) is frozen until a reference
-implementation is available. After that, any protocol changes will require a
-change to the revision number.
-
-****************
-* Zot delivery *
-****************
-
-Format of a zot wrapper. This completely encapsulates a salmon magic envelope
-and provides privacy protection, while defining a delivery envelope - a
-concept familiar to email systems. All addresses in zot are webfinger
-resolvable addresses containing zot endpoints and salmon public keys (zot
-is a superset of salmon).
-
-
-<?xml version='1.0' encoding='UTF-8'?>
-<zot:msg xmlns:zot='http://purl.org/zot/1.0'>
- <zot:key>((key))</zot:key>
- <zot:iv>((iv))</zot:iv>
- <zot:env_key>((env_key))</zot:env_key>
- <zot:env_iv>((env_iv))</zot:env_iv>
- <zot:env>((envelope))</zot:env>
- <zot:sig key_id="xxx">((sender signature))</zot:sig>
- <zot:alg>AES-256-CBC</zot:alg>
- <zot:data type='application/magic-envelope+xml'>((salmon))</zot:data>
-</zot:msg>
-
-
-zot:key
-*******
-
-A suitable randomly generated encyption key of length 32 octets for encrypting
-the salmon packet. This is then encrypted with the sender's private key and
-base64url encoded.
-
-zot:iv
-******
-
-A suitable randomly generated initialisation vector of length 16 octets for
-encrypting the salmon packet. This is then encrypted with the sender's private
-key and base64url encoded.
-
-zot:env_key
-***********
-
-A suitable randomly generated encyption key of length 32 octets for encrypting
-the envelope. This is then encrypted with the recipient's public key and
-base64url encoded. For bulk deliveries, it is encrypted with the site bulk
-delivery public key.
-
-
-zot:env_iv
-**********
-
-A suitable randomly generated initialisation vector of length 16 octets for
-encrypting the envelope. This is then encrypted with the recipient's public
-key and base64url encoded. For bulk deliveries, it is encrypted with the site
-bulk delivery public key.
-
-
-zot:env
-*******
-
-This consists of RFC822-style header fields representing the sender and
-recipient(s). Line lengths have no defined limit and RFC822 continuation
-lines are not supported. If an inbound server is not able to process an
-envelope or post due to size constraints, it SHOULD return a
-"413 Entity too large" HTTP response.
-
-Example:
-
-Z-From: zot:bob@example.com
-Z-Sender: zot:bob@example.com
-Z-To: zot:alice@example.com
-
-Both "Z-From:" and "Z-Sender:" MUST be provided, and represent a single
-webfinger address of the author and sender respectively. The webfinger
-address for the From address MUST contain a discoverable salmon public key
-which is needed to verify the enclosed salmon data. Sender is used to indicate
-the webfinger identity responsible for transmitting this message. From
-indicates the message author.
-
-In web-based social systems, a reply to a message SHOULD be conveyed to all of
-the original message participants. Only the author of the original message
-may know all the recipients (such as those contained in Bcc: elements). The
-author of a message always provides 'From'. They MUST duplicate this
-information as 'Sender' when posting a followup message.
-
-A reply to a given message MUST be sent to the From address of the original
-post, and MAY be sent to any additional addresses in the recipient list. The
-original post author MUST send the reply to all known recipients of the
-original message, with their webfinger identity as Sender, and the
-comment/reply author as From.
-
-Receiving agents SHOULD validate the From identity as the signer of the salmon
-magic envelope, and MAY reject it. They SHOULD also verify the Sender signature
-of the zot packet if it is different than the salmon signature. They MAY
-reject the message if the Sender is not allowed in their "friend list", or if
-they do not have a suitable relationship with the Sender, or if either
-signature fails to validate. Rejected messages for one of these reasons SHOULD
-be indicated with a "400 Bad Request" HTTP response.
-
-
-Z-To: *
-
-indicates a public message with no specifically enumerated recipients.
-
-The fields Z-To: and/or Z-Bcc: MAY be present. At least one recipient field
-MUST be present.
-
-Z-To: zot:bob@example.com, zot:alice@example.com, mailto:dave@example.com
-Z-Bcc: zot:https://example.com/profile/richard
-
-are valid entries. Adresses are comma separated and individual entries MUST NOT
-contain commas. There MAY be any number of ASCII space characters between
-entries for legibility. Header lines are terminated with a linefeed character
-(ASCII 0x0A).
-
-This specification provides the following protocol address prefixes
-for use in Z-To: or Z-Bcc: elements:
-
-zot: - normal zot delivery using webfinger or LRDD resolvable address
-dfrn: - legacy DFRN mode delivery using webfinger or LRDD resovable address
-ostatus: - normal OStatus delivery using webfinger or LRDD resovable address
-diaspora: - Diaspora network delivery using webfinger address
-facebook: - Facebook profile page URL
-twitter: - Twitter personal page URL without AJAX '#!' fragment
-mailto: - email RFC822/ESMTP address
-
-Examples:
-
-twitter:http://twitter.com/bjensen
-facebook:http://facebook.com/profile.php?id=000000001
-
-Foreign protocol addresses which have not been defined in this specification
-or future revisions of this specification and which are unknown to the
-recipient delivery process MAY be ignored.
-
-In cases where an address may contain either a webfinger or LRDD address, the
-webfinger address SHOULD be used preferentially.
-
-
-Z-Bcc:
-******
-
-The Z-Bcc element may contain one or more addresses which are hidden from end
-user presentation. A zot receiving system MUST NOT store or allow for
-the display of the Bcc information. Implementations which require extreme
-privacy SHOULD send individual posts to each of the Bcc: recipients containing
-only a single address. They MAY send all Bcc: posts using bulk delivery,
-however this may have privacy implications as there is no guarantee a
-receiving system will not log, store, or otherwise reveal the contents of the
-Bcc recipient list.
-
-Z-To: addresses MAY be shown to an end user.
-
-
-Envelope encryption
-*******************
-
-
-The entire envelope is encrypted using alg with env_key and env_iv and
-base64url encoded for transmission.
-
-The zot envelope MAY include remote addresses. A zot inbound delivery agent
-MUST parse the envelope and determine whether a delivery address to the
-current endpoint is valid. This may be the result of:
-
- 1. An address contains the public message wildcard '*'
-
- 2. The current endpoint is a personal endpoint and one of the recipients
-listed in the Z-To: or Z-Bcc: addresses matches the webfinger address of
-the "owner" of the endpoint.
-
- 3. The current endpoint is a bulk delivery endpoint. The bulk delivery
-endpoint is defined elsewhere in this document. The bulk delivery agent
-will deliver to all local addresses found in the address lists.
-
-zot:sig
-*******
-
-The Sender of the message signs the underlying salmon data in the manner
-prescribed by salmon. If the Sender and From address are identical, the
-signature will be identical to the signature of the underlying salmon packet.
-If they are different, this signature is verified with the Sender's public
-key to verify the Sender.
-
-zot:alg
-*******
-
-Currently the only valid choice for alg is "AES-256-CBC".
-
-
-zot:data
-********
-
-The data field is a salmon magic envelope. This is encrypted with alg using
-key and iv. The result is then base64url encoded for transmission.
-
-For the first release of this specification, the data format of the enclosed
-salmon SHOULD be 'application/atom+xml' representing an Atom formatted
-ActivityStream. Future revisions MAY allow other alternate data formats.
-All acceptable formats MUST be listed in an XRD property (described elsewhere
-in this document).
-
-
-Delivery
-********
-
-The zot message is then POSTed to the zot endpoint URL as
-application/text+xml and can be decoded/decrypted by the recipient using
-their private key.
-
-The normal salmon endpoint for a service MAY be used as an alternate
-delivery method for non-encrypted (e.g. public) messages.
-
-Discover of the zot endpoint is based on webfinger XRD:
-
-<Link rel="http://purl.org/zot/1.0/post"
- href="http://example/org/zot-endpoint" />
-
-
-Bulk Delivery
-*************
-
-A site MAY provide a bulk delivery endpoint, which MAY be used to avoid
-multiple encryptions of the same data for a single destination.
-This is discoverable by providing a zot endpoint with a corresponding
-salmon public key in the site's .well-known/host-meta file.
-A delivery to this endpoint will deliver to all local recipients provided
-within the zot envelope.
-
-
-Extensibility
-*************
-
-This specification is subject to change. The current version which is in
-effect at a given site may be noted by XRD properties. The following
-properties MUST be present in the XRD providing the relevant endpoint:
-
-<Property type="http://purl.org/zot/1.0/version">1</Property>
-<Property type="http://purl.org/zot/1.0/accept">application/atom+xml</Property>
-
-
-Version is specified in this document and indicates the current revision.
-Version is an increasing non-zero integer value. There are no minor versions.
-Implementations MAY provide compatibility to multiple incompatible versions
-by using this version indication. The "accept" indicates a range of document
-content types which may be enclosed in the underlying salmon magic envelope.
-We anticipate this specification will in the future allow for a close variant
-of "message/rfc822" and which may include MIME. This may also be used to
-embed alternate message formats and protocols such as
-"application/x-diaspora+xml". If a delivery agent is unable to provide any
-acceptable data format to the remote system, the delivery to that system MUST
-be terminated/cancelled.
-
-Foreign Messages
-****************
-
-Messages MAY be imported from other networks and systems which have no
-knowledge of salmon signatures. The salmon signature in this case MUST be the
-exact string 'NOTSIGNED' to indicate that the author (From address) cannot be
-validated using salmon verification. This message MUST be relayed by a Sender
-who can provide a valid salmon signature of the message via zot:sig. Delivery
-systems MAY reject foreign messages.
-
-
-
-
-
-*******************************
-* Zid (Zot-ID) authentication *
-*******************************
-
-This section of the document is considered separate from the delivery
-specification precding it and represents a different protocol, which is
-currently incomplete. This will be split off into another document in the
-future, but is presented here as a synergistic component of the Zot network
-model.
-
-
-URLs may be present within a zot message which refer to private and/or
-protected resources. Zid uses OpenID to gain access to these protected
-resources. These could be private photos or profile information - or *any*
-web accessible resource. Using zid, these can have access controls which
-extends to any resolvable webfinger address.
-
-Zid authentication relies on the presence of an OpenID provider element in
-webfinger, and a URL template which is applied to protected resources within
-a zot message.
-
-The template is designated with the characters "{zid=}" within a URL of a zot
-message. When the page is rendered for viewing to an observer, this template
-is replaced with the webfinger address of the viewer (if known), or an empty
-string if the webfinger address of the viewer cannot be determined.
-
-For example in a message body:
-
-http://example.com/photos/bob/picture.jpg?{zid=}
-
-refers to a private photo which is only visible to alice@example.com.
-
-If Alice is viewing the page, the link is rendered with
-
-http://example.com/photos/bob/picture.jpg?zid=alice@example.com
-
-If the page viewer is unknown, it is rendered as
-
-http://example.com/photos/bob/picture.jpg?zid=
-
-
-When the link is visited, the web server at example.com notes the presence of
-the zid parameter and uses information from webfinger to locate the OpenID
-provider for the zid webfinger address. It then redirects to the OpenID
-server and requests authentication of the given person. If this is successful,
-access to the protected resource is granted.
-
-A browser cookie may be provided to avoid future authentication redirects
-and allow authenticated browsing to other resources on the website.
-
-Only authentication via OpenID is defined in this version of the specification.
-
-This can be used to provide access control of any web resource to any
-webfinger identity on the internet.
-
-
-*********
-* Links *
-*********
-
-Salmon Protocol
- http://www.salmon-protocol.org/salmon-protocol-summary
-
-Salmon Magic Envelope
- http://salmon-protocol.googlecode.com/svn/trunk/draft-panzer-magicsig-01.html
-
-Atom Activity Stream Draft
- http://activitystrea.ms/specs/atom/1.0/
-
-Activty Stream Base Schema
- http://activitystrea.ms/head/activity-schema.html
-
-WebFinger Protocol
- http://code.google.com/p/webfinger/wiki/WebFingerProtocol
-
-
diff --git a/util/Doxyfile b/util/Doxyfile
new file mode 100644
index 000000000..fce6c1359
--- /dev/null
+++ b/util/Doxyfile
@@ -0,0 +1,21 @@
+INPUT = boot.php mod include setup util view
+RECURSIVE = YES
+PROJECT_NAME = "The Red Matrix"
+PROJECT_LOGO = images/rm-64.png
+EXCLUDE = .htconfig.php library doc .git
+EXCLUDE_PATTERNS = *smarty3* *strings.php *.out *test*
+OUTPUT_DIRECTORY = doc
+GENERATE_HTML = YES
+HTML_OUTPUT = html/
+HTML_FILE_EXTENSION = .html
+GENERATE_LATEX = NO
+EXTRACT_ALL = YES
+EXTRACT_PRIVATE = YES
+GENERATE_TODOLIST = YES
+USE_MDFILE_AS_MAINPAGE = README
+REFERENCED_BY_RELATION = YES
+GENERATE_TREEVIEW = YES
+HTML_FOOTER = util/Doxygen.footer
+
+
+
diff --git a/util/Doxygen.footer b/util/Doxygen.footer
new file mode 100644
index 000000000..fd40910d9
--- /dev/null
+++ b/util/Doxygen.footer
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/util/db_update.php b/util/db_update.php
index 775a6585a..ceef061c1 100644
--- a/util/db_update.php
+++ b/util/db_update.php
@@ -1,24 +1,14 @@
<?php
+
+
/**
* @package util
*/
-/*
-* require boot.php
-*/
-require_once("boot.php");
-
-$a = new App;
-@include(".htconfig.php");
-
-$lang = get_best_language();
-load_translation_table($lang);
-
-require_once("dba.php");
-$db = new dba($db_host, $db_user, $db_pass, $db_data, false);
- unset($db_host, $db_user, $db_pass, $db_data);
+require_once('boot.php');
+require_once('include/cli_startup.php');
-$build = get_config('system','build');
+cli_startup();
echo "Old DB VERSION: " . $build . "\n";
echo "New DB VERSION: " . DB_UPDATE_VERSION . "\n";
diff --git a/util/fresh.md b/util/fresh.md
index ff4dfaa94..7bdf87ff3 100644
--- a/util/fresh.md
+++ b/util/fresh.md
@@ -1,7 +1,6 @@
-Fresh - The Friendica REd Shell
+Fresh - The Freaking REd Shell
===============================
-
This will only work on Unix/Linux. If the readline module is installed, we will
use that for input, otherwise we will just read from stdin and write to stdout.
diff --git a/util/makedocs b/util/makedocs
new file mode 100755
index 000000000..53e78e6b0
--- /dev/null
+++ b/util/makedocs
@@ -0,0 +1,2 @@
+#!/bin/sh
+/home/macgirvin/bin/doxygen util/Doxyfile
diff --git a/util/messages.po b/util/messages.po
index 472d1c21f..4e0dd0609 100644
--- a/util/messages.po
+++ b/util/messages.po
@@ -1,7847 +1,7120 @@
-# FRIENDICA Distributed Social Network
-# Copyright (C) 2010, 2011 the Friendica Project
-# This file is distributed under the same license as the Friendica package.
-# Mike Macgirvin, 2010
+# Red Communications Project
+# Copyright (C) 2013 the Red Matrix Project
+# This file is distributed under the same license as the Red package.
+# Mike Macgirvin, 2013
#
#, fuzzy
msgid ""
msgstr ""
-"Project-Id-Version: 3.0.1397\n"
+"Project-Id-Version: 2014-01-10.553\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2012-07-07 10:00-0700\n"
+"POT-Creation-Date: 2014-01-10 00:02-0800\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"
+"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
-#: ../../mod/oexchange.php:25
-msgid "Post successful."
-msgstr ""
-
-#: ../../mod/update_notes.php:41 ../../mod/update_community.php:18
-#: ../../mod/update_network.php:22 ../../mod/update_profile.php:41
-msgid "[Embedded content - reload page to view]"
-msgstr ""
-
-#: ../../mod/crepair.php:102
-msgid "Contact settings applied."
-msgstr ""
-
-#: ../../mod/crepair.php:104
-msgid "Contact update failed."
-msgstr ""
-
-#: ../../mod/crepair.php:115 ../../mod/wall_attach.php:44
-#: ../../mod/fsuggest.php:78 ../../mod/events.php:140 ../../mod/api.php:26
-#: ../../mod/api.php:31 ../../mod/photos.php:135 ../../mod/photos.php:957
-#: ../../mod/editpost.php:10 ../../mod/install.php:151
-#: ../../mod/notifications.php:66 ../../mod/contacts.php:145
-#: ../../mod/settings.php:106 ../../mod/settings.php:537
-#: ../../mod/settings.php:542 ../../mod/manage.php:86 ../../mod/network.php:6
-#: ../../mod/notes.php:20 ../../mod/wallmessage.php:9
-#: ../../mod/wallmessage.php:33 ../../mod/wallmessage.php:79
-#: ../../mod/wallmessage.php:103 ../../mod/attach.php:33
-#: ../../mod/group.php:19 ../../mod/viewconnections.php:22
-#: ../../mod/register.php:38 ../../mod/regmod.php:116 ../../mod/item.php:124
-#: ../../mod/item.php:140 ../../mod/profile_photo.php:19
-#: ../../mod/profile_photo.php:141 ../../mod/profile_photo.php:152
-#: ../../mod/profile_photo.php:165 ../../mod/message.php:45
-#: ../../mod/message.php:97 ../../mod/allfriends.php:9
-#: ../../mod/nogroup.php:25 ../../mod/wall_upload.php:53
-#: ../../mod/follow.php:9 ../../mod/display.php:138 ../../mod/profiles.php:7
-#: ../../mod/profiles.php:400 ../../mod/delegate.php:6
-#: ../../mod/suggest.php:28 ../../mod/invite.php:13 ../../mod/invite.php:81
-#: ../../mod/dfrn_confirm.php:53 ../../addon/facebook/facebook.php:510
-#: ../../addon/facebook/facebook.php:516 ../../addon/dav/layout.fnk.php:353
-#: ../../include/items.php:3457 ../../index.php:309
-msgid "Permission denied."
-msgstr ""
-
-#: ../../mod/crepair.php:129 ../../mod/fsuggest.php:20
-#: ../../mod/fsuggest.php:92 ../../mod/dfrn_confirm.php:118
-msgid "Contact not found."
-msgstr ""
-
-#: ../../mod/crepair.php:135
-msgid "Repair Contact Settings"
-msgstr ""
-
-#: ../../mod/crepair.php:137
-msgid ""
-"<strong>WARNING: This is highly advanced</strong> and if you enter incorrect "
-"information your communications with this contact may stop working."
-msgstr ""
-
-#: ../../mod/crepair.php:138
-msgid ""
-"Please use your browser 'Back' button <strong>now</strong> if you are "
-"uncertain what to do on this page."
-msgstr ""
-
-#: ../../mod/crepair.php:144
-msgid "Return to contact editor"
-msgstr ""
-
-#: ../../mod/crepair.php:148 ../../mod/settings.php:557
-#: ../../mod/settings.php:583 ../../mod/admin.php:661 ../../mod/admin.php:670
-msgid "Name"
-msgstr ""
-
-#: ../../mod/crepair.php:149
-msgid "Account Nickname"
-msgstr ""
-
-#: ../../mod/crepair.php:150
-msgid "@Tagname - overrides Name/Nickname"
-msgstr ""
-
-#: ../../mod/crepair.php:151
-msgid "Account URL"
-msgstr ""
-
-#: ../../mod/crepair.php:152
-msgid "Friend Request URL"
-msgstr ""
-
-#: ../../mod/crepair.php:153
-msgid "Friend Confirm URL"
-msgstr ""
-
-#: ../../mod/crepair.php:154
-msgid "Notification Endpoint URL"
-msgstr ""
-
-#: ../../mod/crepair.php:155
-msgid "Poll/Feed URL"
-msgstr ""
-
-#: ../../mod/crepair.php:156
-msgid "New photo from this URL"
-msgstr ""
-
-#: ../../mod/crepair.php:166 ../../mod/fsuggest.php:107
-#: ../../mod/events.php:436 ../../mod/photos.php:992 ../../mod/photos.php:1063
-#: ../../mod/photos.php:1309 ../../mod/photos.php:1349
-#: ../../mod/photos.php:1389 ../../mod/photos.php:1420
-#: ../../mod/install.php:246 ../../mod/install.php:284
-#: ../../mod/localtime.php:45 ../../mod/content.php:691
-#: ../../mod/contacts.php:343 ../../mod/settings.php:555
-#: ../../mod/settings.php:709 ../../mod/settings.php:770
-#: ../../mod/settings.php:971 ../../mod/group.php:85 ../../mod/message.php:216
-#: ../../mod/message.php:412 ../../mod/admin.php:422 ../../mod/admin.php:658
-#: ../../mod/admin.php:794 ../../mod/admin.php:993 ../../mod/admin.php:1080
-#: ../../mod/profiles.php:569 ../../mod/invite.php:119
-#: ../../addon/fromgplus/fromgplus.php:40
-#: ../../addon/facebook/facebook.php:619
-#: ../../addon/snautofollow/snautofollow.php:64
-#: ../../addon/yourls/yourls.php:76 ../../addon/ljpost/ljpost.php:93
-#: ../../addon/nsfw/nsfw.php:57 ../../addon/page/page.php:210
-#: ../../addon/planets/planets.php:158
-#: ../../addon/uhremotestorage/uhremotestorage.php:89
-#: ../../addon/randplace/randplace.php:177 ../../addon/dwpost/dwpost.php:93
-#: ../../addon/drpost/drpost.php:110 ../../addon/startpage/startpage.php:92
-#: ../../addon/geonames/geonames.php:187 ../../addon/oembed.old/oembed.php:41
-#: ../../addon/impressum/impressum.php:82
-#: ../../addon/notimeline/notimeline.php:64 ../../addon/blockem/blockem.php:57
-#: ../../addon/qcomment/qcomment.php:61
-#: ../../addon/openstreetmap/openstreetmap.php:70
-#: ../../addon/libertree/libertree.php:90 ../../addon/mathjax/mathjax.php:42
-#: ../../addon/editplain/editplain.php:84 ../../addon/blackout/blackout.php:98
-#: ../../addon/gravatar/gravatar.php:86
-#: ../../addon/pageheader/pageheader.php:55 ../../addon/ijpost/ijpost.php:93
-#: ../../addon/jappixmini/jappixmini.php:302
-#: ../../addon/statusnet/statusnet.php:278
-#: ../../addon/statusnet/statusnet.php:292
-#: ../../addon/statusnet/statusnet.php:318
-#: ../../addon/statusnet/statusnet.php:325
-#: ../../addon/statusnet/statusnet.php:353
-#: ../../addon/statusnet/statusnet.php:567 ../../addon/tumblr/tumblr.php:90
-#: ../../addon/numfriends/numfriends.php:85 ../../addon/gnot/gnot.php:88
-#: ../../addon/wppost/wppost.php:110 ../../addon/showmore/showmore.php:48
-#: ../../addon/piwik/piwik.php:89 ../../addon/twitter/twitter.php:180
-#: ../../addon/twitter/twitter.php:209 ../../addon/twitter/twitter.php:387
-#: ../../addon/irc/irc.php:55 ../../addon/blogger/blogger.php:102
-#: ../../addon/posterous/posterous.php:103
-#: ../../view/theme/cleanzero/config.php:80
-#: ../../view/theme/diabook/theme.php:757
-#: ../../view/theme/diabook/config.php:190
-#: ../../view/theme/quattro/config.php:52 ../../view/theme/dispy/config.php:70
-#: ../../include/conversation.php:580
-msgid "Submit"
+#: ../../include/acl_selectors.php:235
+msgid "Visible to everybody"
msgstr ""
-#: ../../mod/help.php:30
-msgid "Help:"
+#: ../../include/acl_selectors.php:236
+msgid "show"
msgstr ""
-#: ../../mod/help.php:34 ../../addon/dav/layout.fnk.php:116
-#: ../../include/nav.php:86
-msgid "Help"
+#: ../../include/acl_selectors.php:237
+msgid "don't show"
msgstr ""
-#: ../../mod/help.php:38 ../../index.php:218
-msgid "Not Found"
+#: ../../include/activities.php:39
+msgid " and "
msgstr ""
-#: ../../mod/help.php:41 ../../index.php:221
-msgid "Page not found."
+#: ../../include/activities.php:47
+msgid "public profile"
msgstr ""
-#: ../../mod/wall_attach.php:58
+#: ../../include/activities.php:52
#, php-format
-msgid "File exceeds size limit of %d"
-msgstr ""
-
-#: ../../mod/wall_attach.php:99 ../../mod/wall_attach.php:110
-msgid "File upload failed."
-msgstr ""
-
-#: ../../mod/fsuggest.php:63
-msgid "Friend suggestion sent."
+msgid "%1$s changed %2$s to &ldquo;%3$s&rdquo;"
msgstr ""
-#: ../../mod/fsuggest.php:97
-msgid "Suggest Friends"
+#: ../../include/activities.php:53
+#, php-format
+msgid "Visit %1$s's %2$s"
msgstr ""
-#: ../../mod/fsuggest.php:99
+#: ../../include/activities.php:56
#, php-format
-msgid "Suggest a friend for %s"
+msgid "%1$s has an updated %2$s, changing %3$s."
msgstr ""
-#: ../../mod/events.php:66
-msgid "Event title and start time are required."
+#: ../../include/api.php:973
+msgid "Public Timeline"
msgstr ""
-#: ../../mod/events.php:260
-msgid "l, F j"
+#: ../../include/nav.php:72 ../../include/nav.php:87 ../../boot.php:1415
+msgid "Logout"
msgstr ""
-#: ../../mod/events.php:282
-msgid "Edit event"
+#: ../../include/nav.php:72 ../../include/nav.php:87
+msgid "End this session"
msgstr ""
-#: ../../mod/events.php:304 ../../include/text.php:1069
-msgid "link to source"
+#: ../../include/nav.php:75 ../../include/nav.php:121
+msgid "Home"
msgstr ""
-#: ../../mod/events.php:328 ../../view/theme/diabook/theme.php:131
-#: ../../include/nav.php:52 ../../boot.php:1595
-msgid "Events"
+#: ../../include/nav.php:75
+msgid "Your posts and conversations"
msgstr ""
-#: ../../mod/events.php:329
-msgid "Create New Event"
+#: ../../include/nav.php:76 ../../include/conversation.php:932
+#: ../../mod/connedit.php:309 ../../mod/connedit.php:423
+msgid "View Profile"
msgstr ""
-#: ../../mod/events.php:330 ../../addon/dav/layout.fnk.php:154
-msgid "Previous"
+#: ../../include/nav.php:76
+msgid "Your profile page"
msgstr ""
-#: ../../mod/events.php:331 ../../mod/install.php:205
-#: ../../addon/dav/layout.fnk.php:157
-msgid "Next"
+#: ../../include/nav.php:78
+msgid "Edit Profiles"
msgstr ""
-#: ../../mod/events.php:404
-msgid "hour:minute"
+#: ../../include/nav.php:78
+msgid "Manage/Edit Profiles"
msgstr ""
-#: ../../mod/events.php:414
-msgid "Event details"
+#: ../../include/nav.php:79 ../../include/conversation.php:1462
+#: ../../mod/fbrowser.php:25
+msgid "Photos"
msgstr ""
-#: ../../mod/events.php:415
-#, php-format
-msgid "Format is %s %s. Starting date and Title are required."
+#: ../../include/nav.php:79
+msgid "Your photos"
msgstr ""
-#: ../../mod/events.php:417
-msgid "Event Starts:"
+#: ../../include/nav.php:85 ../../boot.php:1416
+msgid "Login"
msgstr ""
-#: ../../mod/events.php:417 ../../mod/events.php:431
-msgid "Required"
+#: ../../include/nav.php:85
+msgid "Sign in"
msgstr ""
-#: ../../mod/events.php:420
-msgid "Finish date/time is not known or not relevant"
+#: ../../include/nav.php:102
+#, php-format
+msgid "%s - click to logout"
msgstr ""
-#: ../../mod/events.php:422
-msgid "Event Finishes:"
+#: ../../include/nav.php:107
+msgid "Click to authenticate to your home hub"
msgstr ""
-#: ../../mod/events.php:425
-msgid "Adjust for viewer timezone"
+#: ../../include/nav.php:121
+msgid "Home Page"
msgstr ""
-#: ../../mod/events.php:427
-msgid "Description:"
+#: ../../include/nav.php:125 ../../mod/register.php:206 ../../boot.php:1392
+msgid "Register"
msgstr ""
-#: ../../mod/events.php:429 ../../mod/directory.php:132
-#: ../../include/event.php:40 ../../include/bb2diaspora.php:409
-#: ../../boot.php:1172
-msgid "Location:"
+#: ../../include/nav.php:125
+msgid "Create an account"
msgstr ""
-#: ../../mod/events.php:431
-msgid "Title:"
+#: ../../include/nav.php:130 ../../mod/help.php:60 ../../mod/help.php:64
+msgid "Help"
msgstr ""
-#: ../../mod/events.php:433
-msgid "Share this event"
+#: ../../include/nav.php:130
+msgid "Help and documentation"
msgstr ""
-#: ../../mod/tagrm.php:11 ../../mod/tagrm.php:94
-#: ../../mod/dfrn_request.php:845 ../../mod/settings.php:556
-#: ../../mod/settings.php:582 ../../addon/js_upload/js_upload.php:45
-msgid "Cancel"
+#: ../../include/nav.php:133
+msgid "Apps"
msgstr ""
-#: ../../mod/tagrm.php:41
-msgid "Tag removed"
+#: ../../include/nav.php:133
+msgid "Addon applications, utilities, games"
msgstr ""
-#: ../../mod/tagrm.php:79
-msgid "Remove Item Tag"
+#: ../../include/nav.php:135 ../../include/text.php:736
+#: ../../include/text.php:750 ../../mod/search.php:28
+msgid "Search"
msgstr ""
-#: ../../mod/tagrm.php:81
-msgid "Select a tag to remove: "
+#: ../../include/nav.php:135
+msgid "Search site content"
msgstr ""
-#: ../../mod/tagrm.php:93 ../../mod/delegate.php:130
-msgid "Remove"
+#: ../../include/nav.php:138 ../../mod/directory.php:209
+msgid "Directory"
msgstr ""
-#: ../../mod/dfrn_poll.php:94 ../../mod/dfrn_poll.php:522
-#, php-format
-msgid "%s welcomes %s"
+#: ../../include/nav.php:138
+msgid "Channel Locator"
msgstr ""
-#: ../../mod/api.php:76 ../../mod/api.php:102
-msgid "Authorize application connection"
+#: ../../include/nav.php:149
+msgid "Matrix"
msgstr ""
-#: ../../mod/api.php:77
-msgid "Return to your app and insert this Securty Code:"
+#: ../../include/nav.php:149
+msgid "Your matrix"
msgstr ""
-#: ../../mod/api.php:89
-msgid "Please login to continue."
+#: ../../include/nav.php:150
+msgid "Mark all matrix notifications seen"
msgstr ""
-#: ../../mod/api.php:104
-msgid ""
-"Do you want to authorize this application to access your posts and contacts, "
-"and/or create new posts for you?"
+#: ../../include/nav.php:152
+msgid "Channel Home"
msgstr ""
-#: ../../mod/api.php:105 ../../mod/dfrn_request.php:833
-#: ../../mod/settings.php:887 ../../mod/settings.php:893
-#: ../../mod/settings.php:901 ../../mod/settings.php:905
-#: ../../mod/settings.php:910 ../../mod/settings.php:916
-#: ../../mod/settings.php:922 ../../mod/settings.php:928
-#: ../../mod/settings.php:958 ../../mod/settings.php:959
-#: ../../mod/settings.php:960 ../../mod/settings.php:961
-#: ../../mod/settings.php:962 ../../mod/register.php:234
-#: ../../mod/profiles.php:546
-msgid "Yes"
+#: ../../include/nav.php:152
+msgid "Channel home"
msgstr ""
-#: ../../mod/api.php:106 ../../mod/dfrn_request.php:834
-#: ../../mod/settings.php:887 ../../mod/settings.php:893
-#: ../../mod/settings.php:901 ../../mod/settings.php:905
-#: ../../mod/settings.php:910 ../../mod/settings.php:916
-#: ../../mod/settings.php:922 ../../mod/settings.php:928
-#: ../../mod/settings.php:958 ../../mod/settings.php:959
-#: ../../mod/settings.php:960 ../../mod/settings.php:961
-#: ../../mod/settings.php:962 ../../mod/register.php:235
-#: ../../mod/profiles.php:547
-msgid "No"
+#: ../../include/nav.php:153
+msgid "Mark all channel notifications seen"
msgstr ""
-#: ../../mod/photos.php:46 ../../boot.php:1589
-msgid "Photo Albums"
+#: ../../include/nav.php:156
+msgid "Intros"
msgstr ""
-#: ../../mod/photos.php:54 ../../mod/photos.php:156 ../../mod/photos.php:971
-#: ../../mod/photos.php:1055 ../../mod/photos.php:1070
-#: ../../mod/photos.php:1498 ../../mod/photos.php:1510
-#: ../../addon/communityhome/communityhome.php:110
-#: ../../view/theme/diabook/theme.php:598
-msgid "Contact Photos"
+#: ../../include/nav.php:156 ../../mod/connections.php:242
+msgid "New Connections"
msgstr ""
-#: ../../mod/photos.php:61 ../../mod/photos.php:1080 ../../mod/photos.php:1548
-msgid "Upload New Photos"
+#: ../../include/nav.php:159
+msgid "Notices"
msgstr ""
-#: ../../mod/photos.php:72 ../../mod/settings.php:21
-msgid "everybody"
+#: ../../include/nav.php:159
+msgid "Notifications"
msgstr ""
-#: ../../mod/photos.php:145
-msgid "Contact information unavailable"
+#: ../../include/nav.php:160
+msgid "See all notifications"
msgstr ""
-#: ../../mod/photos.php:156 ../../mod/photos.php:660 ../../mod/photos.php:1055
-#: ../../mod/photos.php:1070 ../../mod/profile_photo.php:60
-#: ../../mod/profile_photo.php:67 ../../mod/profile_photo.php:74
-#: ../../mod/profile_photo.php:176 ../../mod/profile_photo.php:254
-#: ../../mod/profile_photo.php:263
-#: ../../addon/communityhome/communityhome.php:111
-#: ../../view/theme/diabook/theme.php:599 ../../include/user.php:318
-#: ../../include/user.php:325 ../../include/user.php:332
-msgid "Profile Photos"
+#: ../../include/nav.php:161
+msgid "Mark all system notifications seen"
msgstr ""
-#: ../../mod/photos.php:166
-msgid "Album not found."
+#: ../../include/nav.php:163
+msgid "Mail"
msgstr ""
-#: ../../mod/photos.php:184 ../../mod/photos.php:1064
-msgid "Delete Album"
+#: ../../include/nav.php:163
+msgid "Private mail"
msgstr ""
-#: ../../mod/photos.php:247 ../../mod/photos.php:1310
-msgid "Delete Photo"
+#: ../../include/nav.php:164
+msgid "See all private messages"
msgstr ""
-#: ../../mod/photos.php:591
-msgid "was tagged in a"
+#: ../../include/nav.php:165
+msgid "Mark all private messages seen"
msgstr ""
-#: ../../mod/photos.php:591 ../../mod/like.php:144 ../../mod/tagger.php:70
-#: ../../addon/communityhome/communityhome.php:163
-#: ../../view/theme/diabook/theme.php:570 ../../include/text.php:1321
-#: ../../include/diaspora.php:1777 ../../include/conversation.php:53
-#: ../../include/conversation.php:126
-msgid "photo"
+#: ../../include/nav.php:166
+msgid "Inbox"
msgstr ""
-#: ../../mod/photos.php:591
-msgid "by"
+#: ../../include/nav.php:167
+msgid "Outbox"
msgstr ""
-#: ../../mod/photos.php:696 ../../addon/js_upload/js_upload.php:315
-msgid "Image exceeds size limit of "
+#: ../../include/nav.php:168 ../../include/widgets.php:509
+msgid "New Message"
msgstr ""
-#: ../../mod/photos.php:704
-msgid "Image file is empty."
+#: ../../include/nav.php:171 ../../include/conversation.php:1482
+#: ../../mod/events.php:354
+msgid "Events"
msgstr ""
-#: ../../mod/photos.php:736 ../../mod/profile_photo.php:126
-#: ../../mod/wall_upload.php:99
-msgid "Unable to process image."
+#: ../../include/nav.php:171
+msgid "Event Calendar"
msgstr ""
-#: ../../mod/photos.php:763 ../../mod/profile_photo.php:259
-#: ../../mod/wall_upload.php:118
-msgid "Image upload failed."
+#: ../../include/nav.php:172
+msgid "See all events"
msgstr ""
-#: ../../mod/photos.php:849 ../../mod/community.php:16
-#: ../../mod/dfrn_request.php:759 ../../mod/viewconnections.php:17
-#: ../../mod/display.php:7 ../../mod/search.php:71 ../../mod/directory.php:29
-msgid "Public access denied."
+#: ../../include/nav.php:173
+msgid "Mark all events seen"
msgstr ""
-#: ../../mod/photos.php:859
-msgid "No photos selected"
+#: ../../include/nav.php:175
+msgid "Channel Select"
msgstr ""
-#: ../../mod/photos.php:938
-msgid "Access to this item is restricted."
+#: ../../include/nav.php:175
+msgid "Manage Your Channels"
msgstr ""
-#: ../../mod/photos.php:1002
-#, php-format
-msgid "You have used %1$.2f Mbytes of %2$.2f Mbytes photo storage."
+#: ../../include/nav.php:177 ../../include/widgets.php:487
+#: ../../mod/admin.php:785 ../../mod/admin.php:990
+msgid "Settings"
msgstr ""
-#: ../../mod/photos.php:1005
-#, php-format
-msgid "You have used %1$.2f Mbytes of photo storage."
+#: ../../include/nav.php:177
+msgid "Account/Channel Settings"
msgstr ""
-#: ../../mod/photos.php:1011
-msgid "Upload Photos"
+#: ../../include/nav.php:179 ../../mod/connections.php:349
+msgid "Connections"
msgstr ""
-#: ../../mod/photos.php:1015 ../../mod/photos.php:1059
-msgid "New album name: "
+#: ../../include/nav.php:179
+msgid "Manage/Edit Friends and Connections"
msgstr ""
-#: ../../mod/photos.php:1016
-msgid "or existing album name: "
+#: ../../include/nav.php:186 ../../mod/admin.php:111
+msgid "Admin"
msgstr ""
-#: ../../mod/photos.php:1017
-msgid "Do not show a status post for this upload"
+#: ../../include/nav.php:186
+msgid "Site Setup and Configuration"
msgstr ""
-#: ../../mod/photos.php:1019 ../../mod/photos.php:1305
-msgid "Permissions"
+#: ../../include/nav.php:212
+msgid "Nothing new here"
msgstr ""
-#: ../../mod/photos.php:1074
-msgid "Edit Album"
+#: ../../include/nav.php:217
+msgid "Please wait..."
msgstr ""
-#: ../../mod/photos.php:1098 ../../mod/photos.php:1531
-msgid "View Photo"
+#: ../../include/reddav.php:940
+msgid "Edit File properties"
msgstr ""
-#: ../../mod/photos.php:1133
-msgid "Permission denied. Access to this item may be restricted."
+#: ../../include/Contact.php:104 ../../include/widgets.php:115
+#: ../../include/widgets.php:155 ../../include/identity.php:625
+#: ../../mod/directory.php:182 ../../mod/match.php:62 ../../mod/suggest.php:51
+#: ../../mod/dirprofile.php:165
+msgid "Connect"
msgstr ""
-#: ../../mod/photos.php:1135
-msgid "Photo not available"
+#: ../../include/Contact.php:120
+msgid "New window"
msgstr ""
-#: ../../mod/photos.php:1185
-msgid "View photo"
+#: ../../include/Contact.php:121
+msgid "Open the selected location in a different window or browser tab"
msgstr ""
-#: ../../mod/photos.php:1185
-msgid "Edit photo"
+#: ../../include/widgets.php:29 ../../include/contact_widgets.php:87
+msgid "Categories"
msgstr ""
-#: ../../mod/photos.php:1186
-msgid "Use as profile photo"
+#: ../../include/widgets.php:117 ../../mod/suggest.php:53
+msgid "Ignore/Hide"
msgstr ""
-#: ../../mod/photos.php:1192 ../../mod/content.php:601
-#: ../../include/conversation.php:490
-msgid "Private Message"
+#: ../../include/widgets.php:123 ../../mod/connections.php:236
+msgid "Suggestions"
msgstr ""
-#: ../../mod/photos.php:1214
-msgid "View Full Size"
+#: ../../include/widgets.php:124
+msgid "See more..."
msgstr ""
-#: ../../mod/photos.php:1282
-msgid "Tags: "
+#: ../../include/widgets.php:146
+#, php-format
+msgid "You have %1$.0f of %2$.0f allowed connections."
msgstr ""
-#: ../../mod/photos.php:1285
-msgid "[Remove any tag]"
+#: ../../include/widgets.php:152
+msgid "Add New Connection"
msgstr ""
-#: ../../mod/photos.php:1295
-msgid "Rotate CW (right)"
+#: ../../include/widgets.php:153
+msgid "Enter the channel address"
msgstr ""
-#: ../../mod/photos.php:1296
-msgid "Rotate CCW (left)"
+#: ../../include/widgets.php:154
+msgid "Example: bob@example.com, http://example.com/barbara"
msgstr ""
-#: ../../mod/photos.php:1298
-msgid "New album name"
+#: ../../include/widgets.php:171
+msgid "Notes"
msgstr ""
-#: ../../mod/photos.php:1301
-msgid "Caption"
+#: ../../include/widgets.php:173 ../../include/text.php:738
+#: ../../include/text.php:752 ../../mod/filer.php:36
+msgid "Save"
msgstr ""
-#: ../../mod/photos.php:1303
-msgid "Add a Tag"
+#: ../../include/widgets.php:243
+msgid "Remove term"
msgstr ""
-#: ../../mod/photos.php:1307
-msgid "Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"
+#: ../../include/widgets.php:252 ../../include/features.php:50
+msgid "Saved Searches"
msgstr ""
-#: ../../mod/photos.php:1327 ../../mod/content.php:665
-#: ../../include/conversation.php:554
-msgid "I like this (toggle)"
+#: ../../include/widgets.php:253 ../../include/group.php:290
+msgid "add"
msgstr ""
-#: ../../mod/photos.php:1328 ../../mod/content.php:666
-#: ../../include/conversation.php:555
-msgid "I don't like this (toggle)"
+#: ../../include/widgets.php:283 ../../include/features.php:64
+#: ../../include/contact_widgets.php:53
+msgid "Saved Folders"
msgstr ""
-#: ../../mod/photos.php:1329 ../../include/conversation.php:993
-msgid "Share"
+#: ../../include/widgets.php:286 ../../include/contact_widgets.php:56
+#: ../../include/contact_widgets.php:90
+msgid "Everything"
msgstr ""
-#: ../../mod/photos.php:1330 ../../mod/editpost.php:104
-#: ../../mod/content.php:482 ../../mod/content.php:842
-#: ../../mod/wallmessage.php:145 ../../mod/message.php:215
-#: ../../mod/message.php:413 ../../include/conversation.php:371
-#: ../../include/conversation.php:731 ../../include/conversation.php:1012
-msgid "Please wait"
+#: ../../include/widgets.php:318 ../../include/items.php:3566
+msgid "Archives"
msgstr ""
-#: ../../mod/photos.php:1346 ../../mod/photos.php:1386
-#: ../../mod/photos.php:1417 ../../mod/content.php:688
-#: ../../include/conversation.php:577
-msgid "This is you"
+#: ../../include/widgets.php:370
+msgid "Refresh"
msgstr ""
-#: ../../mod/photos.php:1348 ../../mod/photos.php:1388
-#: ../../mod/photos.php:1419 ../../mod/content.php:690
-#: ../../include/conversation.php:579 ../../boot.php:564
-msgid "Comment"
+#: ../../include/widgets.php:371 ../../mod/connedit.php:386
+msgid "Me"
msgstr ""
-#: ../../mod/photos.php:1350 ../../mod/editpost.php:125
-#: ../../mod/content.php:700 ../../include/conversation.php:589
-#: ../../include/conversation.php:1030
-msgid "Preview"
+#: ../../include/widgets.php:372 ../../mod/connedit.php:388
+msgid "Best Friends"
msgstr ""
-#: ../../mod/photos.php:1447 ../../mod/content.php:439
-#: ../../mod/content.php:720 ../../mod/settings.php:618
-#: ../../mod/settings.php:707 ../../mod/group.php:168 ../../mod/admin.php:665
-#: ../../include/conversation.php:328 ../../include/conversation.php:609
-msgid "Delete"
+#: ../../include/widgets.php:373 ../../include/profile_selectors.php:42
+#: ../../include/identity.php:310 ../../mod/connedit.php:389
+msgid "Friends"
msgstr ""
-#: ../../mod/photos.php:1537
-msgid "View Album"
+#: ../../include/widgets.php:374
+msgid "Co-workers"
msgstr ""
-#: ../../mod/photos.php:1546
-msgid "Recent Photos"
+#: ../../include/widgets.php:375 ../../mod/connedit.php:390
+msgid "Former Friends"
msgstr ""
-#: ../../mod/community.php:21
-msgid "Not available."
+#: ../../include/widgets.php:376 ../../mod/connedit.php:391
+msgid "Acquaintances"
msgstr ""
-#: ../../mod/community.php:30 ../../view/theme/diabook/theme.php:133
-#: ../../include/nav.php:101
-msgid "Community"
+#: ../../include/widgets.php:377
+msgid "Everybody"
msgstr ""
-#: ../../mod/community.php:61 ../../mod/search.php:144
-msgid "No results."
+#: ../../include/widgets.php:409
+msgid "Account settings"
msgstr ""
-#: ../../mod/friendica.php:55
-msgid "This is Friendica, version"
+#: ../../include/widgets.php:415
+msgid "Channel settings"
msgstr ""
-#: ../../mod/friendica.php:56
-msgid "running at web location"
+#: ../../include/widgets.php:421
+msgid "Additional features"
msgstr ""
-#: ../../mod/friendica.php:58
-msgid ""
-"Please visit <a href=\"http://friendica.com\">Friendica.com</a> to learn "
-"more about the Friendica project."
+#: ../../include/widgets.php:427
+msgid "Feature settings"
msgstr ""
-#: ../../mod/friendica.php:60
-msgid "Bug reports and issues: please visit"
+#: ../../include/widgets.php:433
+msgid "Display settings"
msgstr ""
-#: ../../mod/friendica.php:61
-msgid ""
-"Suggestions, praise, donations, etc. - please email \"Info\" at Friendica - "
-"dot com"
+#: ../../include/widgets.php:439
+msgid "Connected apps"
msgstr ""
-#: ../../mod/friendica.php:75
-msgid "Installed plugins/addons/apps:"
+#: ../../include/widgets.php:445
+msgid "Export channel"
msgstr ""
-#: ../../mod/friendica.php:88
-msgid "No installed plugins/addons/apps"
+#: ../../include/widgets.php:457
+msgid "Automatic Permissions (Advanced)"
msgstr ""
-#: ../../mod/editpost.php:17 ../../mod/editpost.php:27
-msgid "Item not found"
+#: ../../include/widgets.php:467
+msgid "Premium Channel Settings"
msgstr ""
-#: ../../mod/editpost.php:36
-msgid "Edit post"
+#: ../../include/widgets.php:476 ../../include/features.php:41
+#: ../../mod/sources.php:81
+msgid "Channel Sources"
msgstr ""
-#: ../../mod/editpost.php:80 ../../include/conversation.php:979
-msgid "Post to Email"
+#: ../../include/widgets.php:504
+msgid "Check Mail"
msgstr ""
-#: ../../mod/editpost.php:95 ../../mod/content.php:707
-#: ../../mod/settings.php:617 ../../include/conversation.php:596
-msgid "Edit"
+#: ../../include/contact_selectors.php:30
+msgid "Unknown | Not categorised"
msgstr ""
-#: ../../mod/editpost.php:96 ../../mod/wallmessage.php:143
-#: ../../mod/message.php:213 ../../mod/message.php:410
-#: ../../include/conversation.php:994
-msgid "Upload photo"
+#: ../../include/contact_selectors.php:31
+msgid "Block immediately"
msgstr ""
-#: ../../mod/editpost.php:97 ../../include/conversation.php:996
-msgid "Attach file"
+#: ../../include/contact_selectors.php:32
+msgid "Shady, spammer, self-marketer"
msgstr ""
-#: ../../mod/editpost.php:98 ../../mod/wallmessage.php:144
-#: ../../mod/message.php:214 ../../mod/message.php:411
-#: ../../include/conversation.php:998
-msgid "Insert web link"
+#: ../../include/contact_selectors.php:33
+msgid "Known to me, but no opinion"
msgstr ""
-#: ../../mod/editpost.php:99
-msgid "Insert YouTube video"
+#: ../../include/contact_selectors.php:34
+msgid "OK, probably harmless"
msgstr ""
-#: ../../mod/editpost.php:100
-msgid "Insert Vorbis [.ogg] video"
+#: ../../include/contact_selectors.php:35
+msgid "Reputable, has my trust"
msgstr ""
-#: ../../mod/editpost.php:101
-msgid "Insert Vorbis [.ogg] audio"
+#: ../../include/contact_selectors.php:54
+msgid "Frequently"
msgstr ""
-#: ../../mod/editpost.php:102 ../../include/conversation.php:1004
-msgid "Set your location"
+#: ../../include/contact_selectors.php:55
+msgid "Hourly"
msgstr ""
-#: ../../mod/editpost.php:103 ../../include/conversation.php:1006
-msgid "Clear browser location"
+#: ../../include/contact_selectors.php:56
+msgid "Twice daily"
msgstr ""
-#: ../../mod/editpost.php:105 ../../include/conversation.php:1013
-msgid "Permission settings"
+#: ../../include/contact_selectors.php:57
+msgid "Daily"
msgstr ""
-#: ../../mod/editpost.php:113 ../../include/conversation.php:1022
-msgid "CC: email addresses"
+#: ../../include/contact_selectors.php:58
+msgid "Weekly"
msgstr ""
-#: ../../mod/editpost.php:114 ../../include/conversation.php:1023
-msgid "Public post"
+#: ../../include/contact_selectors.php:59
+msgid "Monthly"
msgstr ""
-#: ../../mod/editpost.php:117 ../../include/conversation.php:1009
-msgid "Set title"
+#: ../../include/contact_selectors.php:74
+msgid "Friendica"
msgstr ""
-#: ../../mod/editpost.php:119 ../../include/conversation.php:1011
-msgid "Categories (comma-separated list)"
+#: ../../include/contact_selectors.php:75
+msgid "OStatus"
msgstr ""
-#: ../../mod/editpost.php:120 ../../include/conversation.php:1025
-msgid "Example: bob@example.com, mary@example.com"
+#: ../../include/contact_selectors.php:76
+msgid "RSS/Atom"
msgstr ""
-#: ../../mod/editpost.php:135 ../../include/conversation.php:1166
-msgid "Friendica mobile web"
+#: ../../include/contact_selectors.php:77 ../../mod/admin.php:689
+#: ../../mod/admin.php:698 ../../boot.php:1418
+msgid "Email"
msgstr ""
-#: ../../mod/dfrn_request.php:93
-msgid "This introduction has already been accepted."
+#: ../../include/contact_selectors.php:78
+msgid "Diaspora"
msgstr ""
-#: ../../mod/dfrn_request.php:118 ../../mod/dfrn_request.php:512
-msgid "Profile location is not valid or does not contain profile information."
+#: ../../include/contact_selectors.php:79
+msgid "Facebook"
msgstr ""
-#: ../../mod/dfrn_request.php:123 ../../mod/dfrn_request.php:517
-msgid "Warning: profile location has no identifiable owner name."
+#: ../../include/contact_selectors.php:80
+msgid "Zot!"
msgstr ""
-#: ../../mod/dfrn_request.php:125 ../../mod/dfrn_request.php:519
-msgid "Warning: profile location has no profile photo."
+#: ../../include/contact_selectors.php:81
+msgid "LinkedIn"
msgstr ""
-#: ../../mod/dfrn_request.php:128 ../../mod/dfrn_request.php:522
-#, php-format
-msgid "%d required parameter was not found at the given location"
-msgid_plural "%d required parameters were not found at the given location"
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../../mod/dfrn_request.php:170
-msgid "Introduction complete."
+#: ../../include/contact_selectors.php:82
+msgid "XMPP/IM"
msgstr ""
-#: ../../mod/dfrn_request.php:209
-msgid "Unrecoverable protocol error."
+#: ../../include/contact_selectors.php:83
+msgid "MySpace"
msgstr ""
-#: ../../mod/dfrn_request.php:237
-msgid "Profile unavailable."
+#: ../../include/datetime.php:43 ../../include/datetime.php:45
+msgid "Miscellaneous"
msgstr ""
-#: ../../mod/dfrn_request.php:262
-#, php-format
-msgid "%s has received too many connection requests today."
+#: ../../include/datetime.php:152 ../../include/datetime.php:284
+msgid "year"
msgstr ""
-#: ../../mod/dfrn_request.php:263
-msgid "Spam protection measures have been invoked."
+#: ../../include/datetime.php:157 ../../include/datetime.php:285
+msgid "month"
msgstr ""
-#: ../../mod/dfrn_request.php:264
-msgid "Friends are advised to please try again in 24 hours."
+#: ../../include/datetime.php:162 ../../include/datetime.php:287
+msgid "day"
msgstr ""
-#: ../../mod/dfrn_request.php:326
-msgid "Invalid locator"
+#: ../../include/datetime.php:275
+msgid "never"
msgstr ""
-#: ../../mod/dfrn_request.php:335
-msgid "Invalid email address."
+#: ../../include/datetime.php:281
+msgid "less than a second ago"
msgstr ""
-#: ../../mod/dfrn_request.php:361
-msgid "This account has not been configured for email. Request failed."
+#: ../../include/datetime.php:284
+msgid "years"
msgstr ""
-#: ../../mod/dfrn_request.php:457
-msgid "Unable to resolve your name at the provided location."
+#: ../../include/datetime.php:285
+msgid "months"
msgstr ""
-#: ../../mod/dfrn_request.php:470
-msgid "You have already introduced yourself here."
+#: ../../include/datetime.php:286
+msgid "week"
msgstr ""
-#: ../../mod/dfrn_request.php:474
-#, php-format
-msgid "Apparently you are already friends with %s."
+#: ../../include/datetime.php:286
+msgid "weeks"
msgstr ""
-#: ../../mod/dfrn_request.php:495
-msgid "Invalid profile URL."
+#: ../../include/datetime.php:287
+msgid "days"
msgstr ""
-#: ../../mod/dfrn_request.php:501 ../../include/follow.php:27
-msgid "Disallowed profile URL."
+#: ../../include/datetime.php:288
+msgid "hour"
msgstr ""
-#: ../../mod/dfrn_request.php:570 ../../mod/contacts.php:122
-msgid "Failed to update contact record."
+#: ../../include/datetime.php:288
+msgid "hours"
msgstr ""
-#: ../../mod/dfrn_request.php:591
-msgid "Your introduction has been sent."
+#: ../../include/datetime.php:289
+msgid "minute"
msgstr ""
-#: ../../mod/dfrn_request.php:644
-msgid "Please login to confirm introduction."
+#: ../../include/datetime.php:289
+msgid "minutes"
msgstr ""
-#: ../../mod/dfrn_request.php:658
-msgid ""
-"Incorrect identity currently logged in. Please login to <strong>this</"
-"strong> profile."
+#: ../../include/datetime.php:290
+msgid "second"
msgstr ""
-#: ../../mod/dfrn_request.php:669
-msgid "Hide this contact"
+#: ../../include/datetime.php:290
+msgid "seconds"
msgstr ""
-#: ../../mod/dfrn_request.php:672
+#: ../../include/datetime.php:299
#, php-format
-msgid "Welcome home %s."
+msgid "%1$d %2$s ago"
msgstr ""
-#: ../../mod/dfrn_request.php:673
+#: ../../include/dba/dba_driver.php:50
#, php-format
-msgid "Please confirm your introduction/connection request to %s."
-msgstr ""
-
-#: ../../mod/dfrn_request.php:674
-msgid "Confirm"
-msgstr ""
-
-#: ../../mod/dfrn_request.php:715 ../../include/items.php:2883
-msgid "[Name Withheld]"
+msgid "Cannot locate DNS info for database server '%s'"
msgstr ""
-#: ../../mod/dfrn_request.php:808
-msgid ""
-"Please enter your 'Identity Address' from one of the following supported "
-"communications networks:"
+#: ../../include/event.php:11 ../../include/bb2diaspora.php:433
+msgid "l F d, Y \\@ g:i A"
msgstr ""
-#: ../../mod/dfrn_request.php:824
-msgid "<strike>Connect as an email follower</strike> (Coming soon)"
+#: ../../include/event.php:20 ../../include/bb2diaspora.php:439
+msgid "Starts:"
msgstr ""
-#: ../../mod/dfrn_request.php:826
-msgid ""
-"If you are not yet a member of the free social web, <a href=\"http://dir."
-"friendica.com/siteinfo\">follow this link to find a public Friendica site "
-"and join us today</a>."
+#: ../../include/event.php:30 ../../include/bb2diaspora.php:447
+msgid "Finishes:"
msgstr ""
-#: ../../mod/dfrn_request.php:829
-msgid "Friend/Connection Request"
+#: ../../include/event.php:40 ../../include/identity.php:676
+#: ../../include/bb2diaspora.php:455 ../../mod/events.php:463
+#: ../../mod/directory.php:156 ../../mod/dirprofile.php:108
+msgid "Location:"
msgstr ""
-#: ../../mod/dfrn_request.php:830
-msgid ""
-"Examples: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, "
-"testuser@identi.ca"
+#: ../../include/text.php:315
+msgid "prev"
msgstr ""
-#: ../../mod/dfrn_request.php:831
-msgid "Please answer the following:"
+#: ../../include/text.php:317
+msgid "first"
msgstr ""
-#: ../../mod/dfrn_request.php:832
-#, php-format
-msgid "Does %s know you?"
+#: ../../include/text.php:346
+msgid "last"
msgstr ""
-#: ../../mod/dfrn_request.php:835
-msgid "Add a personal note:"
+#: ../../include/text.php:349
+msgid "next"
msgstr ""
-#: ../../mod/dfrn_request.php:837 ../../include/contact_selectors.php:76
-msgid "Friendica"
+#: ../../include/text.php:361
+msgid "older"
msgstr ""
-#: ../../mod/dfrn_request.php:838
-msgid "StatusNet/Federated Social Web"
+#: ../../include/text.php:363
+msgid "newer"
msgstr ""
-#: ../../mod/dfrn_request.php:839 ../../mod/settings.php:652
-#: ../../include/contact_selectors.php:80
-msgid "Diaspora"
+#: ../../include/text.php:654
+msgid "No connections"
msgstr ""
-#: ../../mod/dfrn_request.php:840
+#: ../../include/text.php:665
#, php-format
-msgid ""
-" - please do not use this form. Instead, enter %s into your Diaspora search "
-"bar."
-msgstr ""
+msgid "%d Connection"
+msgid_plural "%d Connections"
+msgstr[0] ""
+msgstr[1] ""
-#: ../../mod/dfrn_request.php:841
-msgid "Your Identity Address:"
+#: ../../include/text.php:677
+msgid "View Connections"
msgstr ""
-#: ../../mod/dfrn_request.php:844
-msgid "Submit Request"
+#: ../../include/text.php:818
+msgid "poke"
msgstr ""
-#: ../../mod/install.php:117
-msgid "Friendica Social Communications Server - Setup"
+#: ../../include/text.php:818 ../../include/conversation.php:240
+msgid "poked"
msgstr ""
-#: ../../mod/install.php:123
-msgid "Could not connect to database."
+#: ../../include/text.php:819
+msgid "ping"
msgstr ""
-#: ../../mod/install.php:127
-msgid "Could not create table."
+#: ../../include/text.php:819
+msgid "pinged"
msgstr ""
-#: ../../mod/install.php:133
-msgid "Your Friendica site database has been installed."
+#: ../../include/text.php:820
+msgid "prod"
msgstr ""
-#: ../../mod/install.php:138
-msgid ""
-"You may need to import the file \"database.sql\" manually using phpmyadmin "
-"or mysql."
+#: ../../include/text.php:820
+msgid "prodded"
msgstr ""
-#: ../../mod/install.php:139 ../../mod/install.php:204
-#: ../../mod/install.php:489
-msgid "Please see the file \"INSTALL.txt\"."
+#: ../../include/text.php:821
+msgid "slap"
msgstr ""
-#: ../../mod/install.php:201
-msgid "System check"
+#: ../../include/text.php:821
+msgid "slapped"
msgstr ""
-#: ../../mod/install.php:206
-msgid "Check again"
+#: ../../include/text.php:822
+msgid "finger"
msgstr ""
-#: ../../mod/install.php:225
-msgid "Database connection"
+#: ../../include/text.php:822
+msgid "fingered"
msgstr ""
-#: ../../mod/install.php:226
-msgid ""
-"In order to install Friendica we need to know how to connect to your "
-"database."
+#: ../../include/text.php:823
+msgid "rebuff"
msgstr ""
-#: ../../mod/install.php:227
-msgid ""
-"Please contact your hosting provider or site administrator if you have "
-"questions about these settings."
+#: ../../include/text.php:823
+msgid "rebuffed"
msgstr ""
-#: ../../mod/install.php:228
-msgid ""
-"The database you specify below should already exist. If it does not, please "
-"create it before continuing."
+#: ../../include/text.php:835
+msgid "happy"
msgstr ""
-#: ../../mod/install.php:232
-msgid "Database Server Name"
+#: ../../include/text.php:836
+msgid "sad"
msgstr ""
-#: ../../mod/install.php:233
-msgid "Database Login Name"
+#: ../../include/text.php:837
+msgid "mellow"
msgstr ""
-#: ../../mod/install.php:234
-msgid "Database Login Password"
+#: ../../include/text.php:838
+msgid "tired"
msgstr ""
-#: ../../mod/install.php:235
-msgid "Database Name"
+#: ../../include/text.php:839
+msgid "perky"
msgstr ""
-#: ../../mod/install.php:236 ../../mod/install.php:275
-msgid "Site administrator email address"
+#: ../../include/text.php:840
+msgid "angry"
msgstr ""
-#: ../../mod/install.php:236 ../../mod/install.php:275
-msgid ""
-"Your account email address must match this in order to use the web admin "
-"panel."
+#: ../../include/text.php:841
+msgid "stupified"
msgstr ""
-#: ../../mod/install.php:240 ../../mod/install.php:278
-msgid "Please select a default timezone for your website"
+#: ../../include/text.php:842
+msgid "puzzled"
msgstr ""
-#: ../../mod/install.php:265
-msgid "Site settings"
+#: ../../include/text.php:843
+msgid "interested"
msgstr ""
-#: ../../mod/install.php:318
-msgid "Could not find a command line version of PHP in the web server PATH."
+#: ../../include/text.php:844
+msgid "bitter"
msgstr ""
-#: ../../mod/install.php:319
-msgid ""
-"If you don't have a command line version of PHP installed on server, you "
-"will not be able to run background polling via cron. See <a href='http://"
-"friendica.com/node/27'>'Activating scheduled tasks'</a>"
+#: ../../include/text.php:845
+msgid "cheerful"
msgstr ""
-#: ../../mod/install.php:323
-msgid "PHP executable path"
+#: ../../include/text.php:846
+msgid "alive"
msgstr ""
-#: ../../mod/install.php:323
-msgid ""
-"Enter full path to php executable. You can leave this blank to continue the "
-"installation."
+#: ../../include/text.php:847
+msgid "annoyed"
msgstr ""
-#: ../../mod/install.php:328
-msgid "Command line PHP"
+#: ../../include/text.php:848
+msgid "anxious"
msgstr ""
-#: ../../mod/install.php:337
-msgid ""
-"The command line version of PHP on your system does not have "
-"\"register_argc_argv\" enabled."
+#: ../../include/text.php:849
+msgid "cranky"
msgstr ""
-#: ../../mod/install.php:338
-msgid "This is required for message delivery to work."
+#: ../../include/text.php:850
+msgid "disturbed"
msgstr ""
-#: ../../mod/install.php:340
-msgid "PHP register_argc_argv"
+#: ../../include/text.php:851
+msgid "frustrated"
msgstr ""
-#: ../../mod/install.php:361
-msgid ""
-"Error: the \"openssl_pkey_new\" function on this system is not able to "
-"generate encryption keys"
+#: ../../include/text.php:852
+msgid "motivated"
msgstr ""
-#: ../../mod/install.php:362
-msgid ""
-"If running under Windows, please see \"http://www.php.net/manual/en/openssl."
-"installation.php\"."
+#: ../../include/text.php:853
+msgid "relaxed"
msgstr ""
-#: ../../mod/install.php:364
-msgid "Generate encryption keys"
+#: ../../include/text.php:854
+msgid "surprised"
msgstr ""
-#: ../../mod/install.php:371
-msgid "libCurl PHP module"
+#: ../../include/text.php:1016
+msgid "Monday"
msgstr ""
-#: ../../mod/install.php:372
-msgid "GD graphics PHP module"
+#: ../../include/text.php:1016
+msgid "Tuesday"
msgstr ""
-#: ../../mod/install.php:373
-msgid "OpenSSL PHP module"
+#: ../../include/text.php:1016
+msgid "Wednesday"
msgstr ""
-#: ../../mod/install.php:374
-msgid "mysqli PHP module"
+#: ../../include/text.php:1016
+msgid "Thursday"
msgstr ""
-#: ../../mod/install.php:375
-msgid "mb_string PHP module"
+#: ../../include/text.php:1016
+msgid "Friday"
msgstr ""
-#: ../../mod/install.php:380 ../../mod/install.php:382
-msgid "Apache mod_rewrite module"
+#: ../../include/text.php:1016
+msgid "Saturday"
msgstr ""
-#: ../../mod/install.php:380
-msgid ""
-"Error: Apache webserver mod-rewrite module is required but not installed."
+#: ../../include/text.php:1016
+msgid "Sunday"
msgstr ""
-#: ../../mod/install.php:388
-msgid "Error: libCURL PHP module required but not installed."
+#: ../../include/text.php:1020
+msgid "January"
msgstr ""
-#: ../../mod/install.php:392
-msgid ""
-"Error: GD graphics PHP module with JPEG support required but not installed."
+#: ../../include/text.php:1020
+msgid "February"
msgstr ""
-#: ../../mod/install.php:396
-msgid "Error: openssl PHP module required but not installed."
+#: ../../include/text.php:1020
+msgid "March"
msgstr ""
-#: ../../mod/install.php:400
-msgid "Error: mysqli PHP module required but not installed."
+#: ../../include/text.php:1020
+msgid "April"
msgstr ""
-#: ../../mod/install.php:404
-msgid "Error: mb_string PHP module required but not installed."
+#: ../../include/text.php:1020
+msgid "May"
msgstr ""
-#: ../../mod/install.php:421
-msgid ""
-"The web installer needs to be able to create a file called \".htconfig.php\" "
-"in the top folder of your web server and it is unable to do so."
+#: ../../include/text.php:1020
+msgid "June"
msgstr ""
-#: ../../mod/install.php:422
-msgid ""
-"This is most often a permission setting, as the web server may not be able "
-"to write files in your folder - even if you can."
+#: ../../include/text.php:1020
+msgid "July"
msgstr ""
-#: ../../mod/install.php:423
-msgid ""
-"At the end of this procedure, we will give you a text to save in a file "
-"named .htconfig.php in your Friendica top folder."
+#: ../../include/text.php:1020
+msgid "August"
msgstr ""
-#: ../../mod/install.php:424
-msgid ""
-"You can alternatively skip this procedure and perform a manual installation. "
-"Please see the file \"INSTALL.txt\" for instructions."
+#: ../../include/text.php:1020
+msgid "September"
msgstr ""
-#: ../../mod/install.php:427
-msgid ".htconfig.php is writable"
+#: ../../include/text.php:1020
+msgid "October"
msgstr ""
-#: ../../mod/install.php:439
-msgid ""
-"Url rewrite in .htaccess is not working. Check your server configuration."
+#: ../../include/text.php:1020
+msgid "November"
msgstr ""
-#: ../../mod/install.php:441
-msgid "Url rewrite is working"
+#: ../../include/text.php:1020
+msgid "December"
msgstr ""
-#: ../../mod/install.php:451
-msgid ""
-"The database configuration file \".htconfig.php\" could not be written. "
-"Please use the enclosed text to create a configuration file in your web "
-"server root."
+#: ../../include/text.php:1098
+msgid "unknown.???"
msgstr ""
-#: ../../mod/install.php:476
-msgid "Errors encountered creating database tables."
+#: ../../include/text.php:1099
+msgid "bytes"
msgstr ""
-#: ../../mod/install.php:487
-msgid "<h1>What next</h1>"
+#: ../../include/text.php:1134
+msgid "remove category"
msgstr ""
-#: ../../mod/install.php:488
-msgid ""
-"IMPORTANT: You will need to [manually] setup a scheduled task for the poller."
+#: ../../include/text.php:1156
+msgid "remove from file"
msgstr ""
-#: ../../mod/localtime.php:12 ../../include/event.php:11
-#: ../../include/bb2diaspora.php:387
-msgid "l F d, Y \\@ g:i A"
+#: ../../include/text.php:1214 ../../include/text.php:1226
+msgid "Click to open/close"
msgstr ""
-#: ../../mod/localtime.php:24
-msgid "Time Conversion"
+#: ../../include/text.php:1402 ../../mod/events.php:332
+msgid "link to source"
msgstr ""
-#: ../../mod/localtime.php:26
-msgid ""
-"Friendika provides this service for sharing events with other networks and "
-"friends in unknown timezones."
+#: ../../include/text.php:1421
+msgid "Select a page layout: "
msgstr ""
-#: ../../mod/localtime.php:30
-#, php-format
-msgid "UTC time: %s"
+#: ../../include/text.php:1424 ../../include/text.php:1489
+msgid "default"
msgstr ""
-#: ../../mod/localtime.php:33
-#, php-format
-msgid "Current timezone: %s"
+#: ../../include/text.php:1460
+msgid "Page content type: "
msgstr ""
-#: ../../mod/localtime.php:36
-#, php-format
-msgid "Converted localtime: %s"
+#: ../../include/text.php:1501
+msgid "Select an alternate language"
msgstr ""
-#: ../../mod/localtime.php:41
-msgid "Please select your timezone:"
+#: ../../include/text.php:1653 ../../include/conversation.php:117
+#: ../../mod/like.php:103 ../../mod/subthread.php:89 ../../mod/tagger.php:45
+msgid "photo"
msgstr ""
-#: ../../mod/match.php:12
-msgid "Profile Match"
+#: ../../include/text.php:1656 ../../include/conversation.php:120
+#: ../../mod/tagger.php:49
+msgid "event"
msgstr ""
-#: ../../mod/match.php:20
-msgid "No keywords to match. Please add keywords to your default profile."
+#: ../../include/text.php:1659 ../../include/conversation.php:145
+#: ../../mod/like.php:103 ../../mod/subthread.php:89 ../../mod/tagger.php:53
+msgid "status"
msgstr ""
-#: ../../mod/match.php:57
-msgid "is interested in:"
+#: ../../include/text.php:1661 ../../include/conversation.php:147
+#: ../../mod/tagger.php:55
+msgid "comment"
msgstr ""
-#: ../../mod/match.php:58 ../../mod/suggest.php:59
-#: ../../include/contact_widgets.php:9 ../../boot.php:1116
-msgid "Connect"
+#: ../../include/text.php:1666
+msgid "activity"
msgstr ""
-#: ../../mod/match.php:65 ../../mod/dirfind.php:60
-msgid "No matches"
+#: ../../include/text.php:1928
+msgid "Design"
msgstr ""
-#: ../../mod/lockview.php:39
-msgid "Remote privacy information not available."
+#: ../../include/text.php:1930
+msgid "Blocks"
msgstr ""
-#: ../../mod/lockview.php:43
-msgid "Visible to:"
+#: ../../include/text.php:1931
+msgid "Menus"
msgstr ""
-#: ../../mod/content.php:119 ../../mod/network.php:436
-msgid "No such group"
+#: ../../include/text.php:1932
+msgid "Layouts"
msgstr ""
-#: ../../mod/content.php:130 ../../mod/network.php:447
-msgid "Group is empty"
+#: ../../include/text.php:1933
+msgid "Pages"
msgstr ""
-#: ../../mod/content.php:134 ../../mod/network.php:451
-msgid "Group: "
+#: ../../include/group.php:25
+msgid ""
+"A deleted group with this name was revived. Existing item permissions "
+"<strong>may</strong> apply to this group and any future members. If this is "
+"not what you intended, please create another group with a different name."
msgstr ""
-#: ../../mod/content.php:438 ../../mod/content.php:719
-#: ../../include/conversation.php:327 ../../include/conversation.php:608
-msgid "Select"
+#: ../../include/group.php:223
+msgid "Default privacy group for new contacts"
msgstr ""
-#: ../../mod/content.php:455 ../../mod/content.php:812
-#: ../../mod/content.php:813 ../../include/conversation.php:344
-#: ../../include/conversation.php:701 ../../include/conversation.php:702
-#, php-format
-msgid "View %s's profile @ %s"
+#: ../../include/group.php:242 ../../mod/admin.php:698
+msgid "All Channels"
msgstr ""
-#: ../../mod/content.php:465 ../../mod/content.php:824
-#: ../../include/conversation.php:354 ../../include/conversation.php:713
-#, php-format
-msgid "%s from %s"
+#: ../../include/group.php:264
+msgid "edit"
msgstr ""
-#: ../../mod/content.php:480 ../../include/conversation.php:369
-msgid "View in context"
+#: ../../include/group.php:285
+msgid "Collections"
msgstr ""
-#: ../../mod/content.php:586 ../../include/conversation.php:475
-#, php-format
-msgid "%d comment"
-msgid_plural "%d comments"
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../../mod/content.php:587 ../../addon/page/page.php:76
-#: ../../addon/page/page.php:110 ../../addon/showmore/showmore.php:87
-#: ../../include/contact_widgets.php:188 ../../include/conversation.php:476
-#: ../../boot.php:565
-msgid "show more"
+#: ../../include/group.php:286
+msgid "Edit collection"
msgstr ""
-#: ../../mod/content.php:665 ../../include/conversation.php:554
-msgid "like"
+#: ../../include/group.php:287
+msgid "Create a new collection"
msgstr ""
-#: ../../mod/content.php:666 ../../include/conversation.php:555
-msgid "dislike"
+#: ../../include/group.php:288
+msgid "Channels not in any collection"
msgstr ""
-#: ../../mod/content.php:668 ../../include/conversation.php:557
-msgid "Share this"
+#: ../../include/js_strings.php:5
+msgid "Delete this item?"
msgstr ""
-#: ../../mod/content.php:668 ../../include/conversation.php:557
-msgid "share"
+#: ../../include/js_strings.php:6 ../../include/ItemObject.php:536
+#: ../../mod/photos.php:1099 ../../mod/photos.php:1186
+msgid "Comment"
msgstr ""
-#: ../../mod/content.php:692 ../../include/conversation.php:581
-msgid "Bold"
+#: ../../include/js_strings.php:7 ../../include/contact_widgets.php:125
+#: ../../include/ItemObject.php:270
+msgid "show more"
msgstr ""
-#: ../../mod/content.php:693 ../../include/conversation.php:582
-msgid "Italic"
+#: ../../include/js_strings.php:8
+msgid "show fewer"
msgstr ""
-#: ../../mod/content.php:694 ../../include/conversation.php:583
-msgid "Underline"
+#: ../../include/js_strings.php:9
+msgid "Password too short"
msgstr ""
-#: ../../mod/content.php:695 ../../include/conversation.php:584
-msgid "Quote"
+#: ../../include/js_strings.php:10
+msgid "Passwords do not match"
msgstr ""
-#: ../../mod/content.php:696 ../../include/conversation.php:585
-msgid "Code"
+#: ../../include/js_strings.php:11 ../../mod/photos.php:39
+msgid "everybody"
msgstr ""
-#: ../../mod/content.php:697 ../../include/conversation.php:586
-msgid "Image"
+#: ../../include/js_strings.php:12
+msgid "Secret Passphrase"
msgstr ""
-#: ../../mod/content.php:698 ../../include/conversation.php:587
-msgid "Link"
+#: ../../include/js_strings.php:13
+msgid "Passphrase hint"
msgstr ""
-#: ../../mod/content.php:699 ../../include/conversation.php:588
-msgid "Video"
+#: ../../include/js_strings.php:15
+msgid "timeago.prefixAgo"
msgstr ""
-#: ../../mod/content.php:732 ../../include/conversation.php:621
-msgid "add star"
+#: ../../include/js_strings.php:16
+msgid "timeago.suffixAgo"
msgstr ""
-#: ../../mod/content.php:733 ../../include/conversation.php:622
-msgid "remove star"
+#: ../../include/js_strings.php:17
+msgid "ago"
msgstr ""
-#: ../../mod/content.php:734 ../../include/conversation.php:623
-msgid "toggle star status"
+#: ../../include/js_strings.php:18
+msgid "from now"
msgstr ""
-#: ../../mod/content.php:737 ../../include/conversation.php:626
-msgid "starred"
+#: ../../include/js_strings.php:19
+msgid "less than a minute"
msgstr ""
-#: ../../mod/content.php:738 ../../include/conversation.php:627
-msgid "add tag"
+#: ../../include/js_strings.php:20
+msgid "about a minute"
msgstr ""
-#: ../../mod/content.php:742 ../../include/conversation.php:631
-msgid "save to folder"
+#: ../../include/js_strings.php:21
+#, php-format
+msgid "%d minutes"
msgstr ""
-#: ../../mod/content.php:814 ../../include/conversation.php:703
-msgid "to"
+#: ../../include/js_strings.php:22
+msgid "about an hour"
msgstr ""
-#: ../../mod/content.php:815 ../../include/conversation.php:704
-msgid "Wall-to-Wall"
+#: ../../include/js_strings.php:23
+#, php-format
+msgid "about %d hours"
msgstr ""
-#: ../../mod/content.php:816 ../../include/conversation.php:705
-msgid "via Wall-To-Wall:"
+#: ../../include/js_strings.php:24
+msgid "a day"
msgstr ""
-#: ../../mod/home.php:26 ../../addon/communityhome/communityhome.php:179
+#: ../../include/js_strings.php:25
#, php-format
-msgid "Welcome to %s"
+msgid "%d days"
msgstr ""
-#: ../../mod/notifications.php:26
-msgid "Invalid request identifier."
+#: ../../include/js_strings.php:26
+msgid "about a month"
msgstr ""
-#: ../../mod/notifications.php:35 ../../mod/notifications.php:161
-#: ../../mod/notifications.php:207
-msgid "Discard"
-msgstr ""
-
-#: ../../mod/notifications.php:51 ../../mod/notifications.php:160
-#: ../../mod/notifications.php:206 ../../mod/contacts.php:316
-#: ../../mod/contacts.php:370
-msgid "Ignore"
+#: ../../include/js_strings.php:27
+#, php-format
+msgid "%d months"
msgstr ""
-#: ../../mod/notifications.php:75
-msgid "System"
+#: ../../include/js_strings.php:28
+msgid "about a year"
msgstr ""
-#: ../../mod/notifications.php:80 ../../include/nav.php:113
-msgid "Network"
+#: ../../include/js_strings.php:29
+#, php-format
+msgid "%d years"
msgstr ""
-#: ../../mod/notifications.php:85 ../../mod/network.php:300
-msgid "Personal"
+#: ../../include/js_strings.php:30
+msgid " "
msgstr ""
-#: ../../mod/notifications.php:90 ../../view/theme/diabook/theme.php:127
-#: ../../include/nav.php:77 ../../include/nav.php:115
-msgid "Home"
+#: ../../include/js_strings.php:31
+msgid "timeago.numbers"
msgstr ""
-#: ../../mod/notifications.php:95 ../../include/nav.php:121
-msgid "Introductions"
+#: ../../include/message.php:18
+msgid "No recipient provided."
msgstr ""
-#: ../../mod/notifications.php:100 ../../mod/message.php:105
-#: ../../include/nav.php:128
-msgid "Messages"
+#: ../../include/message.php:23
+msgid "[no subject]"
msgstr ""
-#: ../../mod/notifications.php:119
-msgid "Show Ignored Requests"
+#: ../../include/message.php:42
+msgid "Unable to determine sender."
msgstr ""
-#: ../../mod/notifications.php:119
-msgid "Hide Ignored Requests"
+#: ../../include/message.php:143
+msgid "Stored post could not be verified."
msgstr ""
-#: ../../mod/notifications.php:145 ../../mod/notifications.php:191
-msgid "Notification type: "
+#: ../../include/photo/photo_driver.php:637 ../../include/photos.php:51
+#: ../../mod/photos.php:91 ../../mod/photos.php:783 ../../mod/photos.php:805
+#: ../../mod/profile_photo.php:78 ../../mod/profile_photo.php:225
+#: ../../mod/profile_photo.php:336
+msgid "Profile Photos"
msgstr ""
-#: ../../mod/notifications.php:146
-msgid "Friend Suggestion"
+#: ../../include/network.php:640
+msgid "view full size"
msgstr ""
-#: ../../mod/notifications.php:148
-#, php-format
-msgid "suggested by %s"
+#: ../../include/bbcode.php:94 ../../include/bbcode.php:509
+#: ../../include/bbcode.php:512
+msgid "Image/photo"
msgstr ""
-#: ../../mod/notifications.php:153 ../../mod/notifications.php:200
-#: ../../mod/contacts.php:376
-msgid "Hide this contact from others"
+#: ../../include/bbcode.php:129 ../../include/bbcode.php:517
+msgid "Encrypted content"
msgstr ""
-#: ../../mod/notifications.php:154 ../../mod/notifications.php:201
-msgid "Post a new friend activity"
+#: ../../include/bbcode.php:136
+msgid "QR code"
msgstr ""
-#: ../../mod/notifications.php:154 ../../mod/notifications.php:201
-msgid "if applicable"
+#: ../../include/bbcode.php:179
+#, php-format
+msgid "%1$s wrote the following %2$s %3$s"
msgstr ""
-#: ../../mod/notifications.php:157 ../../mod/notifications.php:204
-#: ../../mod/admin.php:663
-msgid "Approve"
+#: ../../include/bbcode.php:181
+msgid "post"
msgstr ""
-#: ../../mod/notifications.php:177
-msgid "Claims to be known to you: "
+#: ../../include/bbcode.php:469 ../../include/bbcode.php:489
+msgid "$1 wrote:"
msgstr ""
-#: ../../mod/notifications.php:177
-msgid "yes"
+#: ../../include/oembed.php:150
+msgid "Embedded content"
msgstr ""
-#: ../../mod/notifications.php:177
-msgid "no"
+#: ../../include/oembed.php:159
+msgid "Embedding disabled"
msgstr ""
-#: ../../mod/notifications.php:184
-msgid "Approve as: "
+#: ../../include/features.php:21
+msgid "General Features"
msgstr ""
-#: ../../mod/notifications.php:185
-msgid "Friend"
+#: ../../include/features.php:23
+msgid "Content Expiration"
msgstr ""
-#: ../../mod/notifications.php:186
-msgid "Sharer"
+#: ../../include/features.php:23
+msgid "Remove posts/comments and/or private messages at a future time"
msgstr ""
-#: ../../mod/notifications.php:186
-msgid "Fan/Admirer"
+#: ../../include/features.php:24
+msgid "Multiple Profiles"
msgstr ""
-#: ../../mod/notifications.php:192
-msgid "Friend/Connect Request"
+#: ../../include/features.php:24
+msgid "Ability to create multiple profiles"
msgstr ""
-#: ../../mod/notifications.php:192
-msgid "New Follower"
+#: ../../include/features.php:25
+msgid "Web Pages"
msgstr ""
-#: ../../mod/notifications.php:213
-msgid "No introductions."
+#: ../../include/features.php:25
+msgid "Provide managed web pages on your channel"
msgstr ""
-#: ../../mod/notifications.php:216 ../../include/nav.php:122
-msgid "Notifications"
+#: ../../include/features.php:26
+msgid "Private Notes"
msgstr ""
-#: ../../mod/notifications.php:253 ../../mod/notifications.php:378
-#: ../../mod/notifications.php:465
-#, php-format
-msgid "%s liked %s's post"
+#: ../../include/features.php:26
+msgid "Enables a tool to store notes and reminders"
msgstr ""
-#: ../../mod/notifications.php:262 ../../mod/notifications.php:387
-#: ../../mod/notifications.php:474
-#, php-format
-msgid "%s disliked %s's post"
+#: ../../include/features.php:31
+msgid "Extended Identity Sharing"
msgstr ""
-#: ../../mod/notifications.php:276 ../../mod/notifications.php:401
-#: ../../mod/notifications.php:488
-#, php-format
-msgid "%s is now friends with %s"
+#: ../../include/features.php:31
+msgid ""
+"Share your identity with all websites on the internet. When disabled, "
+"identity is only shared with sites in the matrix."
msgstr ""
-#: ../../mod/notifications.php:283 ../../mod/notifications.php:408
-#, php-format
-msgid "%s created a new post"
+#: ../../include/features.php:32
+msgid "Expert Mode"
msgstr ""
-#: ../../mod/notifications.php:284 ../../mod/notifications.php:409
-#: ../../mod/notifications.php:497
-#, php-format
-msgid "%s commented on %s's post"
+#: ../../include/features.php:32
+msgid "Enable Expert Mode to provide advanced configuration options"
msgstr ""
-#: ../../mod/notifications.php:298
-msgid "No more network notifications."
+#: ../../include/features.php:33
+msgid "Premium Channel"
msgstr ""
-#: ../../mod/notifications.php:302
-msgid "Network Notifications"
+#: ../../include/features.php:33
+msgid ""
+"Allows you to set restrictions and terms on those that connect with your "
+"channel"
msgstr ""
-#: ../../mod/notifications.php:328 ../../mod/notify.php:61
-msgid "No more system notifications."
+#: ../../include/features.php:38
+msgid "Post Composition Features"
msgstr ""
-#: ../../mod/notifications.php:332 ../../mod/notify.php:65
-msgid "System Notifications"
+#: ../../include/features.php:39
+msgid "Richtext Editor"
msgstr ""
-#: ../../mod/notifications.php:423
-msgid "No more personal notifications."
+#: ../../include/features.php:39
+msgid "Enable richtext editor"
msgstr ""
-#: ../../mod/notifications.php:427
-msgid "Personal Notifications"
+#: ../../include/features.php:40
+msgid "Post Preview"
msgstr ""
-#: ../../mod/notifications.php:504
-msgid "No more home notifications."
+#: ../../include/features.php:40
+msgid "Allow previewing posts and comments before publishing them"
msgstr ""
-#: ../../mod/notifications.php:508
-msgid "Home Notifications"
+#: ../../include/features.php:41
+msgid "Automatically import channel content from other channels or feeds"
msgstr ""
-#: ../../mod/contacts.php:83 ../../mod/contacts.php:163
-msgid "Could not access contact record."
+#: ../../include/features.php:42
+msgid "Even More Encryption"
msgstr ""
-#: ../../mod/contacts.php:97
-msgid "Could not locate selected profile."
+#: ../../include/features.php:42
+msgid ""
+"Allow optional encryption of content end-to-end with a shared secret key"
msgstr ""
-#: ../../mod/contacts.php:120
-msgid "Contact updated."
+#: ../../include/features.php:47
+msgid "Network and Stream Filtering"
msgstr ""
-#: ../../mod/contacts.php:185
-msgid "Contact has been blocked"
+#: ../../include/features.php:48
+msgid "Search by Date"
msgstr ""
-#: ../../mod/contacts.php:185
-msgid "Contact has been unblocked"
+#: ../../include/features.php:48
+msgid "Ability to select posts by date ranges"
msgstr ""
-#: ../../mod/contacts.php:199
-msgid "Contact has been ignored"
+#: ../../include/features.php:49
+msgid "Collections Filter"
msgstr ""
-#: ../../mod/contacts.php:199
-msgid "Contact has been unignored"
+#: ../../include/features.php:49
+msgid "Enable widget to display Network posts only from selected collections"
msgstr ""
-#: ../../mod/contacts.php:215
-msgid "Contact has been archived"
+#: ../../include/features.php:50
+msgid "Save search terms for re-use"
msgstr ""
-#: ../../mod/contacts.php:215
-msgid "Contact has been unarchived"
+#: ../../include/features.php:51
+msgid "Network Personal Tab"
msgstr ""
-#: ../../mod/contacts.php:228
-msgid "Contact has been removed."
+#: ../../include/features.php:51
+msgid "Enable tab to display only Network posts that you've interacted on"
msgstr ""
-#: ../../mod/contacts.php:258
-#, php-format
-msgid "You are mutual friends with %s"
+#: ../../include/features.php:52
+msgid "Network New Tab"
msgstr ""
-#: ../../mod/contacts.php:262
-#, php-format
-msgid "You are sharing with %s"
+#: ../../include/features.php:52
+msgid "Enable tab to display all new Network activity"
msgstr ""
-#: ../../mod/contacts.php:267
-#, php-format
-msgid "%s is sharing with you"
+#: ../../include/features.php:53
+msgid "Affinity Tool"
msgstr ""
-#: ../../mod/contacts.php:284
-msgid "Private communications are not available for this contact."
+#: ../../include/features.php:53
+msgid "Filter stream activity by depth of relationships"
msgstr ""
-#: ../../mod/contacts.php:287
-msgid "Never"
+#: ../../include/features.php:54
+msgid "Suggest Channels"
msgstr ""
-#: ../../mod/contacts.php:291
-msgid "(Update was successful)"
+#: ../../include/features.php:54
+msgid "Show channel suggestions"
msgstr ""
-#: ../../mod/contacts.php:291
-msgid "(Update was not successful)"
+#: ../../include/features.php:59
+msgid "Post/Comment Tools"
msgstr ""
-#: ../../mod/contacts.php:293
-msgid "Suggest friends"
+#: ../../include/features.php:61
+msgid "Edit Sent Posts"
msgstr ""
-#: ../../mod/contacts.php:297
-#, php-format
-msgid "Network type: %s"
+#: ../../include/features.php:61
+msgid "Edit and correct posts and comments after sending"
msgstr ""
-#: ../../mod/contacts.php:300 ../../include/contact_widgets.php:183
-#, php-format
-msgid "%d contact in common"
-msgid_plural "%d contacts in common"
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../../mod/contacts.php:305
-msgid "View all contacts"
+#: ../../include/features.php:62
+msgid "Tagging"
msgstr ""
-#: ../../mod/contacts.php:310 ../../mod/contacts.php:369
-#: ../../mod/admin.php:667
-msgid "Unblock"
+#: ../../include/features.php:62
+msgid "Ability to tag existing posts"
msgstr ""
-#: ../../mod/contacts.php:310 ../../mod/contacts.php:369
-#: ../../mod/admin.php:666
-msgid "Block"
+#: ../../include/features.php:63
+msgid "Post Categories"
msgstr ""
-#: ../../mod/contacts.php:313
-msgid "Toggle Blocked status"
+#: ../../include/features.php:63
+msgid "Add categories to your posts"
msgstr ""
-#: ../../mod/contacts.php:316 ../../mod/contacts.php:370
-msgid "Unignore"
+#: ../../include/features.php:64
+msgid "Ability to file posts under folders"
msgstr ""
-#: ../../mod/contacts.php:319
-msgid "Toggle Ignored status"
+#: ../../include/features.php:65
+msgid "Dislike Posts"
msgstr ""
-#: ../../mod/contacts.php:323
-msgid "Unarchive"
+#: ../../include/features.php:65
+msgid "Ability to dislike posts/comments"
msgstr ""
-#: ../../mod/contacts.php:323
-msgid "Archive"
+#: ../../include/features.php:66
+msgid "Star Posts"
msgstr ""
-#: ../../mod/contacts.php:326
-msgid "Toggle Archive status"
+#: ../../include/features.php:66
+msgid "Ability to mark special posts with a star indicator"
msgstr ""
-#: ../../mod/contacts.php:329
-msgid "Repair"
+#: ../../include/features.php:67
+msgid "Tag Cloud"
msgstr ""
-#: ../../mod/contacts.php:332
-msgid "Advanced Contact Settings"
+#: ../../include/features.php:67
+msgid "Provide a personal tag cloud on your channel page"
msgstr ""
-#: ../../mod/contacts.php:338
-msgid "Communications lost with this contact!"
+#: ../../include/conversation.php:123
+msgid "channel"
msgstr ""
-#: ../../mod/contacts.php:341
-msgid "Contact Editor"
-msgstr ""
-
-#: ../../mod/contacts.php:344
-msgid "Profile Visibility"
+#: ../../include/conversation.php:161 ../../mod/like.php:134
+#, php-format
+msgid "%1$s likes %2$s's %3$s"
msgstr ""
-#: ../../mod/contacts.php:345
+#: ../../include/conversation.php:164 ../../mod/like.php:136
#, php-format
-msgid ""
-"Please choose the profile you would like to display to %s when viewing your "
-"profile securely."
+msgid "%1$s doesn't like %2$s's %3$s"
msgstr ""
-#: ../../mod/contacts.php:346
-msgid "Contact Information / Notes"
+#: ../../include/conversation.php:201
+#, php-format
+msgid "%1$s is now connected with %2$s"
msgstr ""
-#: ../../mod/contacts.php:347
-msgid "Edit contact notes"
+#: ../../include/conversation.php:236
+#, php-format
+msgid "%1$s poked %2$s"
msgstr ""
-#: ../../mod/contacts.php:352 ../../mod/contacts.php:544
-#: ../../mod/viewconnections.php:62 ../../mod/nogroup.php:40
+#: ../../include/conversation.php:258 ../../mod/mood.php:63
#, php-format
-msgid "Visit %s's profile [%s]"
+msgid "%1$s is currently %2$s"
msgstr ""
-#: ../../mod/contacts.php:353
-msgid "Block/Unblock contact"
+#: ../../include/conversation.php:631 ../../include/ItemObject.php:114
+msgid "Select"
msgstr ""
-#: ../../mod/contacts.php:354
-msgid "Ignore contact"
+#: ../../include/conversation.php:632 ../../include/ItemObject.php:108
+#: ../../mod/thing.php:230 ../../mod/connedit.php:356 ../../mod/admin.php:693
+#: ../../mod/group.php:176 ../../mod/photos.php:1150
+#: ../../mod/filestorage.php:172 ../../mod/settings.php:570
+msgid "Delete"
msgstr ""
-#: ../../mod/contacts.php:355
-msgid "Repair URL settings"
+#: ../../include/conversation.php:642 ../../include/ItemObject.php:161
+msgid "Message is verified"
msgstr ""
-#: ../../mod/contacts.php:356
-msgid "View conversations"
+#: ../../include/conversation.php:662
+#, php-format
+msgid "View %s's profile @ %s"
msgstr ""
-#: ../../mod/contacts.php:358
-msgid "Delete contact"
+#: ../../include/conversation.php:676
+msgid "Categories:"
msgstr ""
-#: ../../mod/contacts.php:362
-msgid "Last update:"
+#: ../../include/conversation.php:677
+msgid "Filed under:"
msgstr ""
-#: ../../mod/contacts.php:364
-msgid "Update public posts"
+#: ../../include/conversation.php:686 ../../include/ItemObject.php:217
+#, php-format
+msgid " from %s"
msgstr ""
-#: ../../mod/contacts.php:366 ../../mod/admin.php:1138
-msgid "Update now"
+#: ../../include/conversation.php:689 ../../include/ItemObject.php:220
+#, php-format
+msgid "last edited: %s"
msgstr ""
-#: ../../mod/contacts.php:373
-msgid "Currently blocked"
+#: ../../include/conversation.php:704
+msgid "View in context"
msgstr ""
-#: ../../mod/contacts.php:374
-msgid "Currently ignored"
+#: ../../include/conversation.php:706 ../../include/conversation.php:1119
+#: ../../include/ItemObject.php:248 ../../mod/photos.php:1081
+#: ../../mod/mail.php:222 ../../mod/mail.php:336 ../../mod/editlayout.php:110
+#: ../../mod/editpost.php:107 ../../mod/editwebpage.php:153
+#: ../../mod/editblock.php:124
+msgid "Please wait"
msgstr ""
-#: ../../mod/contacts.php:375
-msgid "Currently archived"
+#: ../../include/conversation.php:833
+msgid "remove"
msgstr ""
-#: ../../mod/contacts.php:376
-msgid ""
-"Replies/likes to your public posts <strong>may</strong> still be visible"
+#: ../../include/conversation.php:837
+msgid "Loading..."
msgstr ""
-#: ../../mod/contacts.php:429
-msgid "Suggestions"
+#: ../../include/conversation.php:838
+msgid "Delete Selected Items"
msgstr ""
-#: ../../mod/contacts.php:432
-msgid "Suggest potential friends"
+#: ../../include/conversation.php:929
+msgid "View Source"
msgstr ""
-#: ../../mod/contacts.php:435 ../../mod/group.php:191
-msgid "All Contacts"
+#: ../../include/conversation.php:930
+msgid "Follow Thread"
msgstr ""
-#: ../../mod/contacts.php:438
-msgid "Show all contacts"
+#: ../../include/conversation.php:931
+msgid "View Status"
msgstr ""
-#: ../../mod/contacts.php:441
-msgid "Unblocked"
+#: ../../include/conversation.php:933
+msgid "View Photos"
msgstr ""
-#: ../../mod/contacts.php:444
-msgid "Only show unblocked contacts"
+#: ../../include/conversation.php:934
+msgid "Matrix Activity"
msgstr ""
-#: ../../mod/contacts.php:448
-msgid "Blocked"
+#: ../../include/conversation.php:935
+msgid "Edit Contact"
msgstr ""
-#: ../../mod/contacts.php:451
-msgid "Only show blocked contacts"
+#: ../../include/conversation.php:936
+msgid "Send PM"
msgstr ""
-#: ../../mod/contacts.php:455
-msgid "Ignored"
+#: ../../include/conversation.php:937
+msgid "Poke"
msgstr ""
-#: ../../mod/contacts.php:458
-msgid "Only show ignored contacts"
+#: ../../include/conversation.php:999
+#, php-format
+msgid "%s likes this."
msgstr ""
-#: ../../mod/contacts.php:462
-msgid "Archived"
+#: ../../include/conversation.php:999
+#, php-format
+msgid "%s doesn't like this."
msgstr ""
-#: ../../mod/contacts.php:465
-msgid "Only show archived contacts"
-msgstr ""
+#: ../../include/conversation.php:1003
+#, php-format
+msgid "<span %1$s>%2$d people</span> like this."
+msgid_plural "<span %1$s>%2$d people</span> like this."
+msgstr[0] ""
+msgstr[1] ""
-#: ../../mod/contacts.php:469
-msgid "Hidden"
-msgstr ""
+#: ../../include/conversation.php:1005
+#, php-format
+msgid "<span %1$s>%2$d people</span> don't like this."
+msgid_plural "<span %1$s>%2$d people</span> don't like this."
+msgstr[0] ""
+msgstr[1] ""
-#: ../../mod/contacts.php:472
-msgid "Only show hidden contacts"
+#: ../../include/conversation.php:1011
+msgid "and"
msgstr ""
-#: ../../mod/contacts.php:520
-msgid "Mutual Friendship"
+#: ../../include/conversation.php:1014
+#, php-format
+msgid ", and %d other people"
+msgid_plural ", and %d other people"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../../include/conversation.php:1015
+#, php-format
+msgid "%s like this."
msgstr ""
-#: ../../mod/contacts.php:524
-msgid "is a fan of yours"
+#: ../../include/conversation.php:1015
+#, php-format
+msgid "%s don't like this."
msgstr ""
-#: ../../mod/contacts.php:528
-msgid "you are a fan of"
+#: ../../include/conversation.php:1065
+msgid "Visible to <strong>everybody</strong>"
msgstr ""
-#: ../../mod/contacts.php:545 ../../mod/nogroup.php:41
-msgid "Edit contact"
+#: ../../include/conversation.php:1066 ../../mod/mail.php:171
+#: ../../mod/mail.php:269
+msgid "Please enter a link URL:"
msgstr ""
-#: ../../mod/contacts.php:566 ../../view/theme/diabook/theme.php:129
-#: ../../include/nav.php:139
-msgid "Contacts"
+#: ../../include/conversation.php:1067
+msgid "Please enter a video link/URL:"
msgstr ""
-#: ../../mod/contacts.php:570
-msgid "Search your contacts"
+#: ../../include/conversation.php:1068
+msgid "Please enter an audio link/URL:"
msgstr ""
-#: ../../mod/contacts.php:571 ../../mod/directory.php:57
-msgid "Finding: "
+#: ../../include/conversation.php:1069
+msgid "Tag term:"
msgstr ""
-#: ../../mod/contacts.php:572 ../../mod/directory.php:59
-#: ../../include/contact_widgets.php:33
-msgid "Find"
+#: ../../include/conversation.php:1070 ../../mod/filer.php:35
+msgid "Save to Folder:"
msgstr ""
-#: ../../mod/lostpass.php:16
-msgid "No valid account found."
+#: ../../include/conversation.php:1071
+msgid "Where are you right now?"
msgstr ""
-#: ../../mod/lostpass.php:32
-msgid "Password reset request issued. Check your email."
+#: ../../include/conversation.php:1072 ../../mod/mail.php:172
+#: ../../mod/mail.php:270 ../../mod/editpost.php:52
+msgid "Expires YYYY-MM-DD HH:MM"
msgstr ""
-#: ../../mod/lostpass.php:43
-#, php-format
-msgid "Password reset requested at %s"
+#: ../../include/conversation.php:1082 ../../include/ItemObject.php:546
+#: ../../mod/webpages.php:122 ../../mod/photos.php:1101
+#: ../../mod/editlayout.php:130 ../../mod/editpost.php:127
+#: ../../mod/editwebpage.php:177 ../../mod/editblock.php:145
+msgid "Preview"
msgstr ""
-#: ../../mod/lostpass.php:45 ../../mod/lostpass.php:107
-#: ../../mod/register.php:90 ../../mod/register.php:144
-#: ../../mod/regmod.php:54 ../../mod/dfrn_confirm.php:752
-#: ../../addon/facebook/facebook.php:702
-#: ../../addon/facebook/facebook.php:1192
-#: ../../addon/public_server/public_server.php:62
-#: ../../addon/testdrive/testdrive.php:67 ../../include/items.php:2892
-#: ../../boot.php:766
-msgid "Administrator"
+#: ../../include/conversation.php:1096 ../../mod/photos.php:1080
+msgid "Share"
msgstr ""
-#: ../../mod/lostpass.php:65
-msgid ""
-"Request could not be verified. (You may have previously submitted it.) "
-"Password reset failed."
+#: ../../include/conversation.php:1098 ../../mod/editwebpage.php:140
+msgid "Page link title"
msgstr ""
-#: ../../mod/lostpass.php:83 ../../boot.php:898
-msgid "Password Reset"
+#: ../../include/conversation.php:1100 ../../mod/mail.php:219
+#: ../../mod/mail.php:332 ../../mod/editlayout.php:102
+#: ../../mod/editpost.php:99 ../../mod/editwebpage.php:145
+#: ../../mod/editblock.php:116
+msgid "Upload photo"
msgstr ""
-#: ../../mod/lostpass.php:84
-msgid "Your password has been reset as requested."
+#: ../../include/conversation.php:1101
+msgid "upload photo"
msgstr ""
-#: ../../mod/lostpass.php:85
-msgid "Your new password is"
+#: ../../include/conversation.php:1102 ../../mod/mail.php:220
+#: ../../mod/mail.php:333 ../../mod/editlayout.php:103
+#: ../../mod/editpost.php:100 ../../mod/editwebpage.php:146
+#: ../../mod/editblock.php:117
+msgid "Attach file"
msgstr ""
-#: ../../mod/lostpass.php:86
-msgid "Save or copy your new password - and then"
+#: ../../include/conversation.php:1103
+msgid "attach file"
msgstr ""
-#: ../../mod/lostpass.php:87
-msgid "click here to login"
+#: ../../include/conversation.php:1104 ../../mod/mail.php:221
+#: ../../mod/mail.php:334 ../../mod/editlayout.php:104
+#: ../../mod/editpost.php:101 ../../mod/editwebpage.php:147
+#: ../../mod/editblock.php:118
+msgid "Insert web link"
msgstr ""
-#: ../../mod/lostpass.php:88
-msgid ""
-"Your password may be changed from the <em>Settings</em> page after "
-"successful login."
+#: ../../include/conversation.php:1105
+msgid "web link"
msgstr ""
-#: ../../mod/lostpass.php:119
-msgid "Forgot your Password?"
+#: ../../include/conversation.php:1106
+msgid "Insert video link"
msgstr ""
-#: ../../mod/lostpass.php:120
-msgid ""
-"Enter your email address and submit to have your password reset. Then check "
-"your email for further instructions."
+#: ../../include/conversation.php:1107
+msgid "video link"
msgstr ""
-#: ../../mod/lostpass.php:121
-msgid "Nickname or Email: "
+#: ../../include/conversation.php:1108
+msgid "Insert audio link"
msgstr ""
-#: ../../mod/lostpass.php:122
-msgid "Reset"
+#: ../../include/conversation.php:1109
+msgid "audio link"
msgstr ""
-#: ../../mod/settings.php:50 ../../include/nav.php:137
-msgid "Account settings"
+#: ../../include/conversation.php:1110 ../../mod/editlayout.php:108
+#: ../../mod/editpost.php:105 ../../mod/editwebpage.php:151
+#: ../../mod/editblock.php:122
+msgid "Set your location"
msgstr ""
-#: ../../mod/settings.php:55
-msgid "Display settings"
+#: ../../include/conversation.php:1111
+msgid "set location"
msgstr ""
-#: ../../mod/settings.php:61
-msgid "Connector settings"
+#: ../../include/conversation.php:1112 ../../mod/editlayout.php:109
+#: ../../mod/editpost.php:106 ../../mod/editwebpage.php:152
+#: ../../mod/editblock.php:123
+msgid "Clear browser location"
msgstr ""
-#: ../../mod/settings.php:66
-msgid "Plugin settings"
+#: ../../include/conversation.php:1113
+msgid "clear location"
msgstr ""
-#: ../../mod/settings.php:71
-msgid "Connected apps"
+#: ../../include/conversation.php:1115 ../../mod/editlayout.php:122
+#: ../../mod/editpost.php:119 ../../mod/editwebpage.php:169
+#: ../../mod/editblock.php:137
+msgid "Set title"
msgstr ""
-#: ../../mod/settings.php:76
-msgid "Export personal data"
+#: ../../include/conversation.php:1118 ../../mod/editlayout.php:124
+#: ../../mod/editpost.php:121 ../../mod/editwebpage.php:171
+#: ../../mod/editblock.php:139
+msgid "Categories (comma-separated list)"
msgstr ""
-#: ../../mod/settings.php:81
-msgid "Remove account"
+#: ../../include/conversation.php:1120 ../../mod/editlayout.php:111
+#: ../../mod/editpost.php:108 ../../mod/editwebpage.php:154
+#: ../../mod/editblock.php:125
+msgid "Permission settings"
msgstr ""
-#: ../../mod/settings.php:89 ../../mod/admin.php:753 ../../mod/admin.php:958
-#: ../../addon/dav/layout.fnk.php:116 ../../addon/mathjax/mathjax.php:36
-#: ../../view/theme/diabook/theme.php:643
-#: ../../view/theme/diabook/theme.php:773 ../../include/nav.php:137
-msgid "Settings"
+#: ../../include/conversation.php:1121
+msgid "permissions"
msgstr ""
-#: ../../mod/settings.php:133
-msgid "Missing some important data!"
+#: ../../include/conversation.php:1129 ../../mod/editlayout.php:119
+#: ../../mod/editpost.php:116 ../../mod/editwebpage.php:164
+#: ../../mod/editblock.php:134
+msgid "Public post"
msgstr ""
-#: ../../mod/settings.php:136 ../../mod/settings.php:581
-msgid "Update"
+#: ../../include/conversation.php:1131 ../../mod/editlayout.php:125
+#: ../../mod/editpost.php:122 ../../mod/editwebpage.php:172
+#: ../../mod/editblock.php:140
+msgid "Example: bob@example.com, mary@example.com"
msgstr ""
-#: ../../mod/settings.php:241
-msgid "Failed to connect with email account using the settings provided."
+#: ../../include/conversation.php:1144 ../../mod/mail.php:226
+#: ../../mod/mail.php:339 ../../mod/editlayout.php:135
+#: ../../mod/editpost.php:133 ../../mod/editwebpage.php:182
+#: ../../mod/editblock.php:150
+msgid "Set expiration date"
msgstr ""
-#: ../../mod/settings.php:246
-msgid "Email settings updated."
+#: ../../include/conversation.php:1146 ../../include/ItemObject.php:549
+#: ../../mod/mail.php:228 ../../mod/mail.php:341 ../../mod/editpost.php:135
+msgid "Encrypt text"
msgstr ""
-#: ../../mod/settings.php:305
-msgid "Passwords do not match. Password unchanged."
+#: ../../include/conversation.php:1148 ../../mod/editpost.php:136
+msgid "OK"
msgstr ""
-#: ../../mod/settings.php:310
-msgid "Empty passwords are not allowed. Password unchanged."
+#: ../../include/conversation.php:1149 ../../mod/tagrm.php:11
+#: ../../mod/tagrm.php:94 ../../mod/settings.php:508
+#: ../../mod/settings.php:534 ../../mod/editpost.php:137
+#: ../../mod/fbrowser.php:82 ../../mod/fbrowser.php:117
+msgid "Cancel"
msgstr ""
-#: ../../mod/settings.php:321
-msgid "Password changed."
+#: ../../include/conversation.php:1376
+msgid "Commented Order"
msgstr ""
-#: ../../mod/settings.php:323
-msgid "Password update failed. Please try again."
+#: ../../include/conversation.php:1379
+msgid "Sort by Comment Date"
msgstr ""
-#: ../../mod/settings.php:386
-msgid " Please use a shorter name."
+#: ../../include/conversation.php:1382
+msgid "Posted Order"
msgstr ""
-#: ../../mod/settings.php:388
-msgid " Name too short."
+#: ../../include/conversation.php:1385
+msgid "Sort by Post Date"
msgstr ""
-#: ../../mod/settings.php:394
-msgid " Not valid email."
+#: ../../include/conversation.php:1389
+msgid "Personal"
msgstr ""
-#: ../../mod/settings.php:396
-msgid " Cannot change to that email."
+#: ../../include/conversation.php:1392
+msgid "Posts that mention or involve you"
msgstr ""
-#: ../../mod/settings.php:450
-msgid "Private forum has no privacy permissions. Using default privacy group."
+#: ../../include/conversation.php:1395 ../../mod/menu.php:57
+#: ../../mod/connections.php:209
+msgid "New"
msgstr ""
-#: ../../mod/settings.php:454
-msgid "Private forum has no privacy permissions and no default privacy group."
+#: ../../include/conversation.php:1398
+msgid "Activity Stream - by date"
msgstr ""
-#: ../../mod/settings.php:484 ../../addon/facebook/facebook.php:495
-#: ../../addon/impressum/impressum.php:77
-#: ../../addon/openstreetmap/openstreetmap.php:80
-#: ../../addon/mathjax/mathjax.php:66 ../../addon/piwik/piwik.php:105
-#: ../../addon/twitter/twitter.php:382
-msgid "Settings updated."
+#: ../../include/conversation.php:1405
+msgid "Starred"
msgstr ""
-#: ../../mod/settings.php:554 ../../mod/settings.php:580
-#: ../../mod/settings.php:616
-msgid "Add application"
+#: ../../include/conversation.php:1408
+msgid "Favourite Posts"
msgstr ""
-#: ../../mod/settings.php:558 ../../mod/settings.php:584
-#: ../../addon/statusnet/statusnet.php:561
-msgid "Consumer Key"
+#: ../../include/conversation.php:1415
+msgid "Spam"
msgstr ""
-#: ../../mod/settings.php:559 ../../mod/settings.php:585
-#: ../../addon/statusnet/statusnet.php:560
-msgid "Consumer Secret"
+#: ../../include/conversation.php:1418
+msgid "Posts flagged as SPAM"
msgstr ""
-#: ../../mod/settings.php:560 ../../mod/settings.php:586
-msgid "Redirect"
+#: ../../include/conversation.php:1448
+msgid "Channel"
msgstr ""
-#: ../../mod/settings.php:561 ../../mod/settings.php:587
-msgid "Icon url"
+#: ../../include/conversation.php:1451
+msgid "Status Messages and Posts"
msgstr ""
-#: ../../mod/settings.php:572
-msgid "You can't edit this application."
+#: ../../include/conversation.php:1455
+msgid "About"
msgstr ""
-#: ../../mod/settings.php:615
-msgid "Connected Apps"
+#: ../../include/conversation.php:1458
+msgid "Profile Details"
msgstr ""
-#: ../../mod/settings.php:619
-msgid "Client key starts with"
+#: ../../include/conversation.php:1465 ../../include/photos.php:297
+msgid "Photo Albums"
msgstr ""
-#: ../../mod/settings.php:620
-msgid "No name"
+#: ../../include/conversation.php:1470 ../../mod/fbrowser.php:114
+msgid "Files"
msgstr ""
-#: ../../mod/settings.php:621
-msgid "Remove authorization"
+#: ../../include/conversation.php:1473
+msgid "Files and Storage"
msgstr ""
-#: ../../mod/settings.php:632
-msgid "No Plugin settings configured"
+#: ../../include/conversation.php:1485
+msgid "Events and Calendar"
msgstr ""
-#: ../../mod/settings.php:640 ../../addon/widgets/widgets.php:123
-msgid "Plugin Settings"
+#: ../../include/conversation.php:1490
+msgid "Webpages"
+msgstr ""
+
+#: ../../include/conversation.php:1493
+msgid "Manage Webpages"
+msgstr ""
+
+#: ../../include/notify.php:23
+msgid "created a new post"
+msgstr ""
+
+#: ../../include/notify.php:24
+#, php-format
+msgid "commented on %s's post"
+msgstr ""
+
+#: ../../include/photos.php:15 ../../include/attach.php:97
+#: ../../include/attach.php:128 ../../include/attach.php:184
+#: ../../include/attach.php:199 ../../include/attach.php:232
+#: ../../include/attach.php:246 ../../include/attach.php:267
+#: ../../include/attach.php:461 ../../include/attach.php:539
+#: ../../include/items.php:3445 ../../mod/common.php:35
+#: ../../mod/events.php:140 ../../mod/thing.php:241 ../../mod/thing.php:257
+#: ../../mod/thing.php:291 ../../mod/invite.php:13 ../../mod/invite.php:104
+#: ../../mod/connedit.php:179 ../../mod/webpages.php:40 ../../mod/api.php:26
+#: ../../mod/api.php:31 ../../mod/page.php:30 ../../mod/page.php:80
+#: ../../mod/setup.php:200 ../../mod/viewconnections.php:22
+#: ../../mod/viewconnections.php:27 ../../mod/delegate.php:6
+#: ../../mod/sources.php:62 ../../mod/mitem.php:73 ../../mod/group.php:9
+#: ../../mod/photos.php:68 ../../mod/photos.php:653 ../../mod/viewsrc.php:12
+#: ../../mod/menu.php:40 ../../mod/connections.php:167
+#: ../../mod/layouts.php:27 ../../mod/layouts.php:42 ../../mod/network.php:12
+#: ../../mod/profiles.php:152 ../../mod/profiles.php:465
+#: ../../mod/new_channel.php:66 ../../mod/new_channel.php:97
+#: ../../mod/achievements.php:27 ../../mod/filestorage.php:10
+#: ../../mod/filestorage.php:59 ../../mod/filestorage.php:76
+#: ../../mod/filestorage.php:99 ../../mod/manage.php:6
+#: ../../mod/settings.php:484 ../../mod/mail.php:108
+#: ../../mod/editlayout.php:48 ../../mod/profile_photo.php:187
+#: ../../mod/profile_photo.php:200 ../../mod/editpost.php:13
+#: ../../mod/notifications.php:66 ../../mod/blocks.php:29
+#: ../../mod/blocks.php:44 ../../mod/editwebpage.php:44
+#: ../../mod/editwebpage.php:83 ../../mod/poke.php:128
+#: ../../mod/channel.php:88 ../../mod/channel.php:225
+#: ../../mod/fsuggest.php:78 ../../mod/editblock.php:48
+#: ../../mod/suggest.php:26 ../../mod/message.php:16 ../../mod/register.php:68
+#: ../../mod/regmod.php:18 ../../mod/authtest.php:13 ../../mod/item.php:182
+#: ../../mod/item.php:190 ../../mod/mood.php:119 ../../index.php:176
+#: ../../index.php:344
+msgid "Permission denied."
msgstr ""
-#: ../../mod/settings.php:652 ../../mod/settings.php:653
+#: ../../include/photos.php:88
#, php-format
-msgid "Built-in support for %s connectivity is %s"
+msgid "Image exceeds website size limit of %lu bytes"
msgstr ""
-#: ../../mod/settings.php:652 ../../mod/settings.php:653
-msgid "enabled"
+#: ../../include/photos.php:95
+msgid "Image file is empty."
msgstr ""
-#: ../../mod/settings.php:652 ../../mod/settings.php:653
-msgid "disabled"
+#: ../../include/photos.php:122 ../../mod/profile_photo.php:147
+msgid "Unable to process image"
msgstr ""
-#: ../../mod/settings.php:653
-msgid "StatusNet"
+#: ../../include/photos.php:184
+msgid "Photo storage failed."
msgstr ""
-#: ../../mod/settings.php:685
-msgid "Email access is disabled on this site."
+#: ../../include/photos.php:301 ../../mod/photos.php:821
+#: ../../mod/photos.php:1296
+msgid "Upload New Photos"
msgstr ""
-#: ../../mod/settings.php:691
-msgid "Connector Settings"
+#: ../../include/profile_selectors.php:6
+msgid "Male"
msgstr ""
-#: ../../mod/settings.php:696
-msgid "Email/Mailbox Setup"
+#: ../../include/profile_selectors.php:6
+msgid "Female"
msgstr ""
-#: ../../mod/settings.php:697
-msgid ""
-"If you wish to communicate with email contacts using this service "
-"(optional), please specify how to connect to your mailbox."
+#: ../../include/profile_selectors.php:6
+msgid "Currently Male"
msgstr ""
-#: ../../mod/settings.php:698
-msgid "Last successful email check:"
+#: ../../include/profile_selectors.php:6
+msgid "Currently Female"
msgstr ""
-#: ../../mod/settings.php:700
-msgid "IMAP server name:"
+#: ../../include/profile_selectors.php:6
+msgid "Mostly Male"
msgstr ""
-#: ../../mod/settings.php:701
-msgid "IMAP port:"
+#: ../../include/profile_selectors.php:6
+msgid "Mostly Female"
msgstr ""
-#: ../../mod/settings.php:702
-msgid "Security:"
+#: ../../include/profile_selectors.php:6
+msgid "Transgender"
msgstr ""
-#: ../../mod/settings.php:702 ../../mod/settings.php:707
-msgid "None"
+#: ../../include/profile_selectors.php:6
+msgid "Intersex"
msgstr ""
-#: ../../mod/settings.php:703
-msgid "Email login name:"
+#: ../../include/profile_selectors.php:6
+msgid "Transsexual"
msgstr ""
-#: ../../mod/settings.php:704
-msgid "Email password:"
+#: ../../include/profile_selectors.php:6
+msgid "Hermaphrodite"
msgstr ""
-#: ../../mod/settings.php:705
-msgid "Reply-to address:"
+#: ../../include/profile_selectors.php:6
+msgid "Neuter"
msgstr ""
-#: ../../mod/settings.php:706
-msgid "Send public posts to all email contacts:"
+#: ../../include/profile_selectors.php:6
+msgid "Non-specific"
msgstr ""
-#: ../../mod/settings.php:707
-msgid "Action after import:"
+#: ../../include/profile_selectors.php:6
+msgid "Other"
msgstr ""
-#: ../../mod/settings.php:707
-msgid "Mark as seen"
+#: ../../include/profile_selectors.php:6
+msgid "Undecided"
msgstr ""
-#: ../../mod/settings.php:707
-msgid "Move to folder"
+#: ../../include/profile_selectors.php:23
+msgid "Males"
msgstr ""
-#: ../../mod/settings.php:708
-msgid "Move to folder:"
+#: ../../include/profile_selectors.php:23
+msgid "Females"
msgstr ""
-#: ../../mod/settings.php:768
-msgid "Display Settings"
+#: ../../include/profile_selectors.php:23
+msgid "Gay"
msgstr ""
-#: ../../mod/settings.php:774
-msgid "Display Theme:"
+#: ../../include/profile_selectors.php:23
+msgid "Lesbian"
msgstr ""
-#: ../../mod/settings.php:775
-msgid "Update browser every xx seconds"
+#: ../../include/profile_selectors.php:23
+msgid "No Preference"
msgstr ""
-#: ../../mod/settings.php:775
-msgid "Minimum of 10 seconds, no maximum"
+#: ../../include/profile_selectors.php:23
+msgid "Bisexual"
msgstr ""
-#: ../../mod/settings.php:776
-msgid "Number of items to display on the network page:"
+#: ../../include/profile_selectors.php:23
+msgid "Autosexual"
msgstr ""
-#: ../../mod/settings.php:776
-msgid "Maximum of 100 items"
+#: ../../include/profile_selectors.php:23
+msgid "Abstinent"
msgstr ""
-#: ../../mod/settings.php:777
-msgid "Don't show emoticons"
+#: ../../include/profile_selectors.php:23
+msgid "Virgin"
msgstr ""
-#: ../../mod/settings.php:848
-msgid "Normal Account Page"
+#: ../../include/profile_selectors.php:23
+msgid "Deviant"
msgstr ""
-#: ../../mod/settings.php:849
-msgid "This account is a normal personal profile"
+#: ../../include/profile_selectors.php:23
+msgid "Fetish"
msgstr ""
-#: ../../mod/settings.php:852
-msgid "Soapbox Page"
+#: ../../include/profile_selectors.php:23
+msgid "Oodles"
msgstr ""
-#: ../../mod/settings.php:853
-msgid "Automatically approve all connection/friend requests as read-only fans"
+#: ../../include/profile_selectors.php:23
+msgid "Nonsexual"
msgstr ""
-#: ../../mod/settings.php:856
-msgid "Community Forum/Celebrity Account"
+#: ../../include/profile_selectors.php:42
+msgid "Single"
msgstr ""
-#: ../../mod/settings.php:857
-msgid "Automatically approve all connection/friend requests as read-write fans"
+#: ../../include/profile_selectors.php:42
+msgid "Lonely"
msgstr ""
-#: ../../mod/settings.php:860
-msgid "Automatic Friend Page"
+#: ../../include/profile_selectors.php:42
+msgid "Available"
msgstr ""
-#: ../../mod/settings.php:861
-msgid "Automatically approve all connection/friend requests as friends"
+#: ../../include/profile_selectors.php:42
+msgid "Unavailable"
msgstr ""
-#: ../../mod/settings.php:864
-msgid "Private Forum [Experimental]"
+#: ../../include/profile_selectors.php:42
+msgid "Has crush"
msgstr ""
-#: ../../mod/settings.php:865
-msgid "Private forum - approved members only"
+#: ../../include/profile_selectors.php:42
+msgid "Infatuated"
msgstr ""
-#: ../../mod/settings.php:877
-msgid "OpenID:"
+#: ../../include/profile_selectors.php:42
+msgid "Dating"
msgstr ""
-#: ../../mod/settings.php:877
-msgid "(Optional) Allow this OpenID to login to this account."
+#: ../../include/profile_selectors.php:42
+msgid "Unfaithful"
msgstr ""
-#: ../../mod/settings.php:887
-msgid "Publish your default profile in your local site directory?"
+#: ../../include/profile_selectors.php:42
+msgid "Sex Addict"
msgstr ""
-#: ../../mod/settings.php:893
-msgid "Publish your default profile in the global social directory?"
+#: ../../include/profile_selectors.php:42
+msgid "Friends/Benefits"
msgstr ""
-#: ../../mod/settings.php:901
-msgid "Hide your contact/friend list from viewers of your default profile?"
+#: ../../include/profile_selectors.php:42
+msgid "Casual"
msgstr ""
-#: ../../mod/settings.php:905
-msgid "Hide your profile details from unknown viewers?"
+#: ../../include/profile_selectors.php:42
+msgid "Engaged"
msgstr ""
-#: ../../mod/settings.php:910
-msgid "Allow friends to post to your profile page?"
+#: ../../include/profile_selectors.php:42
+msgid "Married"
msgstr ""
-#: ../../mod/settings.php:916
-msgid "Allow friends to tag your posts?"
+#: ../../include/profile_selectors.php:42
+msgid "Imaginarily married"
msgstr ""
-#: ../../mod/settings.php:922
-msgid "Allow us to suggest you as a potential friend to new members?"
+#: ../../include/profile_selectors.php:42
+msgid "Partners"
msgstr ""
-#: ../../mod/settings.php:928
-msgid "Permit unknown people to send you private mail?"
+#: ../../include/profile_selectors.php:42
+msgid "Cohabiting"
msgstr ""
-#: ../../mod/settings.php:936
-msgid "Profile is <strong>not published</strong>."
+#: ../../include/profile_selectors.php:42
+msgid "Common law"
msgstr ""
-#: ../../mod/settings.php:939 ../../mod/profile_photo.php:213
-msgid "or"
+#: ../../include/profile_selectors.php:42
+msgid "Happy"
msgstr ""
-#: ../../mod/settings.php:944
-msgid "Your Identity Address is"
+#: ../../include/profile_selectors.php:42
+msgid "Not looking"
msgstr ""
-#: ../../mod/settings.php:955
-msgid "Automatically expire posts after this many days:"
+#: ../../include/profile_selectors.php:42
+msgid "Swinger"
msgstr ""
-#: ../../mod/settings.php:955
-msgid "If empty, posts will not expire. Expired posts will be deleted"
+#: ../../include/profile_selectors.php:42
+msgid "Betrayed"
msgstr ""
-#: ../../mod/settings.php:956
-msgid "Advanced expiration settings"
+#: ../../include/profile_selectors.php:42
+msgid "Separated"
msgstr ""
-#: ../../mod/settings.php:957
-msgid "Advanced Expiration"
+#: ../../include/profile_selectors.php:42
+msgid "Unstable"
msgstr ""
-#: ../../mod/settings.php:958
-msgid "Expire posts:"
+#: ../../include/profile_selectors.php:42
+msgid "Divorced"
msgstr ""
-#: ../../mod/settings.php:959
-msgid "Expire personal notes:"
+#: ../../include/profile_selectors.php:42
+msgid "Imaginarily divorced"
msgstr ""
-#: ../../mod/settings.php:960
-msgid "Expire starred posts:"
+#: ../../include/profile_selectors.php:42
+msgid "Widowed"
msgstr ""
-#: ../../mod/settings.php:961
-msgid "Expire photos:"
+#: ../../include/profile_selectors.php:42
+msgid "Uncertain"
msgstr ""
-#: ../../mod/settings.php:962
-msgid "Only expire posts by others:"
+#: ../../include/profile_selectors.php:42
+msgid "It's complicated"
msgstr ""
-#: ../../mod/settings.php:969
-msgid "Account Settings"
+#: ../../include/profile_selectors.php:42
+msgid "Don't care"
msgstr ""
-#: ../../mod/settings.php:977
-msgid "Password Settings"
+#: ../../include/profile_selectors.php:42
+msgid "Ask me"
msgstr ""
-#: ../../mod/settings.php:978
-msgid "New Password:"
+#: ../../include/attach.php:179 ../../include/attach.php:227
+msgid "Item was not found."
msgstr ""
-#: ../../mod/settings.php:979
-msgid "Confirm:"
+#: ../../include/attach.php:280
+msgid "No source file."
msgstr ""
-#: ../../mod/settings.php:979
-msgid "Leave password fields blank unless changing"
+#: ../../include/attach.php:297
+msgid "Cannot locate file to replace"
msgstr ""
-#: ../../mod/settings.php:983
-msgid "Basic Settings"
+#: ../../include/attach.php:315
+msgid "Cannot locate file to revise/update"
msgstr ""
-#: ../../mod/settings.php:984 ../../include/profile_advanced.php:15
-msgid "Full Name:"
+#: ../../include/attach.php:326
+#, php-format
+msgid "File exceeds size limit of %d"
msgstr ""
-#: ../../mod/settings.php:985
-msgid "Email Address:"
+#: ../../include/attach.php:337
+#, php-format
+msgid "You have reached your limit of %1$.0f Mbytes attachment storage."
msgstr ""
-#: ../../mod/settings.php:986
-msgid "Your Timezone:"
+#: ../../include/attach.php:421
+msgid "File upload failed. Possible system limit or action terminated."
msgstr ""
-#: ../../mod/settings.php:987
-msgid "Default Post Location:"
+#: ../../include/attach.php:433
+msgid "Stored file could not be verified. Upload failed."
msgstr ""
-#: ../../mod/settings.php:988
-msgid "Use Browser Location:"
+#: ../../include/attach.php:477 ../../include/attach.php:494
+msgid "Path not available."
msgstr ""
-#: ../../mod/settings.php:991
-msgid "Security and Privacy Settings"
+#: ../../include/attach.php:544
+msgid "Empty pathname"
msgstr ""
-#: ../../mod/settings.php:993
-msgid "Maximum Friend Requests/Day:"
+#: ../../include/attach.php:562
+msgid "duplicate filename or path"
msgstr ""
-#: ../../mod/settings.php:993 ../../mod/settings.php:1012
-msgid "(to prevent spam abuse)"
+#: ../../include/attach.php:587
+msgid "Path not found."
msgstr ""
-#: ../../mod/settings.php:994
-msgid "Default Post Permissions"
+#: ../../include/attach.php:632
+msgid "mkdir failed."
msgstr ""
-#: ../../mod/settings.php:995
-msgid "(click to open/close)"
+#: ../../include/attach.php:636
+msgid "database storage failed."
msgstr ""
-#: ../../mod/settings.php:1012
-msgid "Maximum private messages per day from unknown people:"
+#: ../../include/taxonomy.php:210
+msgid "Tags"
msgstr ""
-#: ../../mod/settings.php:1015
-msgid "Notification Settings"
+#: ../../include/taxonomy.php:227
+msgid "Keywords"
msgstr ""
-#: ../../mod/settings.php:1016
-msgid "By default post a status message when:"
+#: ../../include/taxonomy.php:252
+msgid "have"
msgstr ""
-#: ../../mod/settings.php:1017
-msgid "accepting a friend request"
+#: ../../include/taxonomy.php:252
+msgid "has"
msgstr ""
-#: ../../mod/settings.php:1018
-msgid "joining a forum/community"
+#: ../../include/taxonomy.php:253
+msgid "want"
msgstr ""
-#: ../../mod/settings.php:1019
-msgid "making an <em>interesting</em> profile change"
+#: ../../include/taxonomy.php:253
+msgid "wants"
msgstr ""
-#: ../../mod/settings.php:1020
-msgid "Send a notification email when:"
+#: ../../include/taxonomy.php:254 ../../include/ItemObject.php:175
+msgid "like"
msgstr ""
-#: ../../mod/settings.php:1021
-msgid "You receive an introduction"
+#: ../../include/taxonomy.php:254
+msgid "likes"
msgstr ""
-#: ../../mod/settings.php:1022
-msgid "Your introductions are confirmed"
+#: ../../include/taxonomy.php:255 ../../include/ItemObject.php:176
+msgid "dislike"
msgstr ""
-#: ../../mod/settings.php:1023
-msgid "Someone writes on your profile wall"
+#: ../../include/taxonomy.php:255
+msgid "dislikes"
msgstr ""
-#: ../../mod/settings.php:1024
-msgid "Someone writes a followup comment"
+#: ../../include/account.php:23
+msgid "Not a valid email address"
msgstr ""
-#: ../../mod/settings.php:1025
-msgid "You receive a private message"
+#: ../../include/account.php:25
+msgid "Your email domain is not among those allowed on this site"
msgstr ""
-#: ../../mod/settings.php:1026
-msgid "You receive a friend suggestion"
+#: ../../include/account.php:31
+msgid "Your email address is already registered at this site."
msgstr ""
-#: ../../mod/settings.php:1027
-msgid "You are tagged in a post"
+#: ../../include/account.php:64
+msgid "An invitation is required."
msgstr ""
-#: ../../mod/settings.php:1030
-msgid "Advanced Account/Page Type Settings"
+#: ../../include/account.php:68
+msgid "Invitation could not be verified."
msgstr ""
-#: ../../mod/settings.php:1031
-msgid "Change the behaviour of this account for special situations"
+#: ../../include/account.php:119
+msgid "Please enter the required information."
msgstr ""
-#: ../../mod/manage.php:90
-msgid "Manage Identities and/or Pages"
+#: ../../include/account.php:187
+msgid "Failed to store account information."
msgstr ""
-#: ../../mod/manage.php:93
-msgid ""
-"Toggle between different identities or community/group pages which share "
-"your account details or which you have been granted \"manage\" permissions"
+#: ../../include/account.php:273
+#, php-format
+msgid "Registration request at %s"
msgstr ""
-#: ../../mod/manage.php:95
-msgid "Select an identity to manage: "
+#: ../../include/account.php:275 ../../include/account.php:302
+#: ../../include/account.php:359
+msgid "Administrator"
msgstr ""
-#: ../../mod/network.php:97
-msgid "Search Results For:"
+#: ../../include/account.php:297
+msgid "your registration password"
msgstr ""
-#: ../../mod/network.php:137 ../../mod/search.php:16
-msgid "Remove term"
+#: ../../include/account.php:300 ../../include/account.php:357
+#, php-format
+msgid "Registration details for %s"
msgstr ""
-#: ../../mod/network.php:146 ../../mod/search.php:13
-msgid "Saved Searches"
+#: ../../include/account.php:366
+msgid "Account approved."
msgstr ""
-#: ../../mod/network.php:147 ../../include/group.php:244
-msgid "add"
+#: ../../include/account.php:400
+#, php-format
+msgid "Registration revoked for %s"
msgstr ""
-#: ../../mod/network.php:287
-msgid "Commented Order"
+#: ../../include/dir_fns.php:15
+msgid "Sort Options"
msgstr ""
-#: ../../mod/network.php:290
-msgid "Sort by Comment Date"
+#: ../../include/dir_fns.php:16
+msgid "Alphabetic"
msgstr ""
-#: ../../mod/network.php:293
-msgid "Posted Order"
+#: ../../include/dir_fns.php:17
+msgid "Reverse Alphabetic"
msgstr ""
-#: ../../mod/network.php:296
-msgid "Sort by Post Date"
+#: ../../include/dir_fns.php:18
+msgid "Newest to Oldest"
msgstr ""
-#: ../../mod/network.php:303
-msgid "Posts that mention or involve you"
+#: ../../include/dir_fns.php:30
+msgid "Enable Safe Search"
msgstr ""
-#: ../../mod/network.php:306
-msgid "New"
+#: ../../include/dir_fns.php:32
+msgid "Disable Safe Search"
msgstr ""
-#: ../../mod/network.php:309
-msgid "Activity Stream - by date"
+#: ../../include/dir_fns.php:34
+msgid "Safe Mode"
msgstr ""
-#: ../../mod/network.php:312
-msgid "Starred"
+#: ../../include/enotify.php:40
+msgid "Red Matrix Notification"
msgstr ""
-#: ../../mod/network.php:315
-msgid "Favourite Posts"
+#: ../../include/enotify.php:41
+msgid "redmatrix"
msgstr ""
-#: ../../mod/network.php:318
-msgid "Shared Links"
+#: ../../include/enotify.php:43
+msgid "Thank You,"
msgstr ""
-#: ../../mod/network.php:321
-msgid "Interesting Links"
+#: ../../include/enotify.php:45
+#, php-format
+msgid "%s Administrator"
msgstr ""
-#: ../../mod/network.php:388
+#: ../../include/enotify.php:80
#, php-format
-msgid "Warning: This group contains %s member from an insecure network."
-msgid_plural ""
-"Warning: This group contains %s members from an insecure network."
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../../mod/network.php:391
-msgid "Private messages to this group are at risk of public disclosure."
+msgid "%s <!item_type!>"
msgstr ""
-#: ../../mod/network.php:461
-msgid "Contact: "
+#: ../../include/enotify.php:84
+#, php-format
+msgid "[Red:Notify] New mail received at %s"
msgstr ""
-#: ../../mod/network.php:463
-msgid "Private messages to this person are at risk of public disclosure."
+#: ../../include/enotify.php:86
+#, php-format
+msgid "%1$s, %2$s sent you a new private message at %3$s."
msgstr ""
-#: ../../mod/network.php:468
-msgid "Invalid contact."
+#: ../../include/enotify.php:87
+#, php-format
+msgid "%1$s sent you %2$s."
msgstr ""
-#: ../../mod/notes.php:44 ../../boot.php:1601
-msgid "Personal Notes"
+#: ../../include/enotify.php:87
+msgid "a private message"
msgstr ""
-#: ../../mod/notes.php:63 ../../mod/filer.php:30
-#: ../../addon/facebook/facebook.php:770
-#: ../../addon/privacy_image_cache/privacy_image_cache.php:187
-#: ../../addon/dav/layout.fnk.php:384 ../../include/text.php:652
-msgid "Save"
+#: ../../include/enotify.php:88
+#, php-format
+msgid "Please visit %s to view and/or reply to your private messages."
msgstr ""
-#: ../../mod/wallmessage.php:42 ../../mod/wallmessage.php:112
+#: ../../include/enotify.php:142
#, php-format
-msgid "Number of daily wall messages for %s exceeded. Message failed."
+msgid "%1$s, %2$s commented on [zrl=%3$s]a %4$s[/zrl]"
msgstr ""
-#: ../../mod/wallmessage.php:56 ../../mod/message.php:66
-msgid "No recipient selected."
+#: ../../include/enotify.php:150
+#, php-format
+msgid "%1$s, %2$s commented on [zrl=%3$s]%4$s's %5$s[/zrl]"
msgstr ""
-#: ../../mod/wallmessage.php:59
-msgid "Unable to check your home location."
+#: ../../include/enotify.php:159
+#, php-format
+msgid "%1$s, %2$s commented on [zrl=%3$s]your %4$s[/zrl]"
msgstr ""
-#: ../../mod/wallmessage.php:62 ../../mod/message.php:73
-msgid "Message could not be sent."
+#: ../../include/enotify.php:170
+#, php-format
+msgid "[Red:Notify] Comment to conversation #%1$d by %2$s"
msgstr ""
-#: ../../mod/wallmessage.php:65 ../../mod/message.php:76
-msgid "Message collection failure."
+#: ../../include/enotify.php:171
+#, php-format
+msgid "%1$s, %2$s commented on an item/conversation you have been following."
msgstr ""
-#: ../../mod/wallmessage.php:68 ../../mod/message.php:79
-msgid "Message sent."
+#: ../../include/enotify.php:174 ../../include/enotify.php:189
+#: ../../include/enotify.php:215 ../../include/enotify.php:234
+#: ../../include/enotify.php:248
+#, php-format
+msgid "Please visit %s to view and/or reply to the conversation."
msgstr ""
-#: ../../mod/wallmessage.php:86 ../../mod/wallmessage.php:95
-msgid "No recipient."
+#: ../../include/enotify.php:180
+#, php-format
+msgid "[Red:Notify] %s posted to your profile wall"
msgstr ""
-#: ../../mod/wallmessage.php:124 ../../mod/message.php:172
-#: ../../include/conversation.php:947
-msgid "Please enter a link URL:"
+#: ../../include/enotify.php:182
+#, php-format
+msgid "%1$s, %2$s posted to your profile wall at %3$s"
msgstr ""
-#: ../../mod/wallmessage.php:131 ../../mod/message.php:200
-msgid "Send Private Message"
+#: ../../include/enotify.php:184
+#, php-format
+msgid "%1$s, %2$s posted to [zrl=%3$s]your wall[/zrl]"
msgstr ""
-#: ../../mod/wallmessage.php:132
+#: ../../include/enotify.php:208
#, php-format
-msgid ""
-"If you wish for %s to respond, please check that the privacy settings on "
-"your site allow private mail from unknown senders."
+msgid "[Red:Notify] %s tagged you"
msgstr ""
-#: ../../mod/wallmessage.php:133 ../../mod/message.php:201
-#: ../../mod/message.php:401
-msgid "To:"
+#: ../../include/enotify.php:209
+#, php-format
+msgid "%1$s, %2$s tagged you at %3$s"
msgstr ""
-#: ../../mod/wallmessage.php:134 ../../mod/message.php:206
-#: ../../mod/message.php:403
-msgid "Subject:"
+#: ../../include/enotify.php:210
+#, php-format
+msgid "%1$s, %2$s [zrl=%3$s]tagged you[/zrl]."
msgstr ""
-#: ../../mod/wallmessage.php:140 ../../mod/message.php:210
-#: ../../mod/message.php:406 ../../mod/invite.php:113
-msgid "Your message:"
+#: ../../include/enotify.php:223
+#, php-format
+msgid "[Red:Notify] %1$s poked you"
msgstr ""
-#: ../../mod/newmember.php:6
-msgid "Welcome to Friendica"
+#: ../../include/enotify.php:224
+#, php-format
+msgid "%1$s, %2$s poked you at %3$s"
msgstr ""
-#: ../../mod/newmember.php:8
-msgid "New Member Checklist"
+#: ../../include/enotify.php:225
+#, php-format
+msgid "%1$s, %2$s [zrl=%2$s]poked you[/zrl]."
msgstr ""
-#: ../../mod/newmember.php:12
-msgid ""
-"We would like to offer some tips and links to help make your experience "
-"enjoyable. Click any item to visit the relevant page. A link to this page "
-"will be visible from your home page for two weeks after your initial "
-"registration and then will quietly disappear."
+#: ../../include/enotify.php:241
+#, php-format
+msgid "[Red:Notify] %s tagged your post"
msgstr ""
-#: ../../mod/newmember.php:16
-msgid ""
-"On your <em>Quick Start</em> page - find a brief introduction to your "
-"profile and network tabs, connect to Facebook, make some new connections, "
-"and find some groups to join."
+#: ../../include/enotify.php:242
+#, php-format
+msgid "%1$s, %2$s tagged your post at %3$s"
msgstr ""
-#: ../../mod/newmember.php:18
-msgid ""
-"On your <em>Settings</em> page - change your initial password. Also make a "
-"note of your Identity Address. This looks just like an email address - and "
-"will be useful in making friends on the free social web."
+#: ../../include/enotify.php:243
+#, php-format
+msgid "%1$s, %2$s tagged [zrl=%3$s]your post[/zrl]"
msgstr ""
-#: ../../mod/newmember.php:20
-msgid ""
-"Review the other settings, particularly the privacy settings. An unpublished "
-"directory listing is like having an unlisted phone number. In general, you "
-"should probably publish your listing - unless all of your friends and "
-"potential friends know exactly how to find you."
+#: ../../include/enotify.php:255
+msgid "[Red:Notify] Introduction received"
msgstr ""
-#: ../../mod/newmember.php:32 ../../mod/profperm.php:103
-#: ../../view/theme/diabook/theme.php:128 ../../include/profile_advanced.php:7
-#: ../../include/profile_advanced.php:84 ../../include/nav.php:50
-#: ../../boot.php:1642
-msgid "Profile"
+#: ../../include/enotify.php:256
+#, php-format
+msgid "%1$s, you've received an introduction from '%2$s' at %3$s"
msgstr ""
-#: ../../mod/newmember.php:36 ../../mod/profile_photo.php:211
-msgid "Upload Profile Photo"
+#: ../../include/enotify.php:257
+#, php-format
+msgid "%1$s, you've received [zrl=%2$s]an introduction[/zrl] from %3$s."
msgstr ""
-#: ../../mod/newmember.php:36
-msgid ""
-"Upload a profile photo if you have not done so already. Studies have shown "
-"that people with real photos of themselves are ten times more likely to make "
-"friends than people who do not."
+#: ../../include/enotify.php:261 ../../include/enotify.php:280
+#, php-format
+msgid "You may visit their profile at %s"
msgstr ""
-#: ../../mod/newmember.php:38
-msgid "Edit Your Profile"
+#: ../../include/enotify.php:263
+#, php-format
+msgid "Please visit %s to approve or reject the introduction."
msgstr ""
-#: ../../mod/newmember.php:38
-msgid ""
-"Edit your <strong>default</strong> profile to your liking. Review the "
-"settings for hiding your list of friends and hiding the profile from unknown "
-"visitors."
+#: ../../include/enotify.php:270
+msgid "[Red:Notify] Friend suggestion received"
msgstr ""
-#: ../../mod/newmember.php:40
-msgid "Profile Keywords"
+#: ../../include/enotify.php:271
+#, php-format
+msgid "%1$s, you've received a friend suggestion from '%2$s' at %3$s"
msgstr ""
-#: ../../mod/newmember.php:40
+#: ../../include/enotify.php:272
+#, php-format
msgid ""
-"Set some public keywords for your default profile which describe your "
-"interests. We may be able to find other people with similar interests and "
-"suggest friendships."
-msgstr ""
-
-#: ../../mod/newmember.php:44
-msgid "Connecting"
-msgstr ""
-
-#: ../../mod/newmember.php:49 ../../mod/newmember.php:51
-#: ../../addon/facebook/facebook.php:728
-#: ../../include/contact_selectors.php:81
-msgid "Facebook"
+"%1$s, you've received [zrl=%2$s]a friend suggestion[/zrl] for %3$s from %4$s."
msgstr ""
-#: ../../mod/newmember.php:49
-msgid ""
-"Authorise the Facebook Connector if you currently have a Facebook account "
-"and we will (optionally) import all your Facebook friends and conversations."
+#: ../../include/enotify.php:278
+msgid "Name:"
msgstr ""
-#: ../../mod/newmember.php:51
-msgid ""
-"<em>If</em> this is your own personal server, installing the Facebook addon "
-"may ease your transition to the free social web."
+#: ../../include/enotify.php:279
+msgid "Photo:"
msgstr ""
-#: ../../mod/newmember.php:56
-msgid "Importing Emails"
+#: ../../include/enotify.php:282
+#, php-format
+msgid "Please visit %s to approve or reject the suggestion."
msgstr ""
-#: ../../mod/newmember.php:56
-msgid ""
-"Enter your email access information on your Connector Settings page if you "
-"wish to import and interact with friends or mailing lists from your email "
-"INBOX"
+#: ../../include/auth.php:69
+msgid "Logged out."
msgstr ""
-#: ../../mod/newmember.php:58
-msgid "Go to Your Contacts Page"
+#: ../../include/auth.php:181
+msgid "Failed authentication"
msgstr ""
-#: ../../mod/newmember.php:58
-msgid ""
-"Your Contacts page is your gateway to managing friendships and connecting "
-"with friends on other networks. Typically you enter their address or site "
-"URL in the <em>Add New Contact</em> dialog."
+#: ../../include/auth.php:190
+msgid "Login failed."
msgstr ""
-#: ../../mod/newmember.php:60
-msgid "Go to Your Site's Directory"
-msgstr ""
+#: ../../include/contact_widgets.php:14
+#, php-format
+msgid "%d invitation available"
+msgid_plural "%d invitations available"
+msgstr[0] ""
+msgstr[1] ""
-#: ../../mod/newmember.php:60
-msgid ""
-"The Directory page lets you find other people in this network or other "
-"federated sites. Look for a <em>Connect</em> or <em>Follow</em> link on "
-"their profile page. Provide your own Identity Address if requested."
+#: ../../include/contact_widgets.php:20
+msgid "Find Channels"
msgstr ""
-#: ../../mod/newmember.php:62
-msgid "Finding New People"
+#: ../../include/contact_widgets.php:21
+msgid "Enter name or interest"
msgstr ""
-#: ../../mod/newmember.php:62
-msgid ""
-"On the side panel of the Contacts page are several tools to find new "
-"friends. We can match people by interest, look up people by name or "
-"interest, and provide suggestions based on network relationships. On a brand "
-"new site, friend suggestions will usually begin to be populated within 24 "
-"hours."
+#: ../../include/contact_widgets.php:22
+msgid "Connect/Follow"
msgstr ""
-#: ../../mod/newmember.php:66 ../../include/group.php:239
-msgid "Groups"
+#: ../../include/contact_widgets.php:23
+msgid "Examples: Robert Morgenstein, Fishing"
msgstr ""
-#: ../../mod/newmember.php:70
-msgid "Group Your Contacts"
+#: ../../include/contact_widgets.php:24 ../../mod/directory.php:205
+#: ../../mod/directory.php:210 ../../mod/connections.php:355
+msgid "Find"
msgstr ""
-#: ../../mod/newmember.php:70
-msgid ""
-"Once you have made some friends, organize them into private conversation "
-"groups from the sidebar of your Contacts page and then you can interact with "
-"each group privately on your Network page."
+#: ../../include/contact_widgets.php:25 ../../mod/suggest.php:59
+msgid "Channel Suggestions"
msgstr ""
-#: ../../mod/newmember.php:73
-msgid "Why Aren't My Posts Public?"
+#: ../../include/contact_widgets.php:27
+msgid "Random Profile"
msgstr ""
-#: ../../mod/newmember.php:73
-msgid ""
-"Friendica respects your privacy. By default, your posts will only show up to "
-"people you've added as friends. For more information, see the help section "
-"from the link above."
+#: ../../include/contact_widgets.php:28
+msgid "Invite Friends"
msgstr ""
-#: ../../mod/newmember.php:78
-msgid "Getting Help"
-msgstr ""
+#: ../../include/contact_widgets.php:120
+#, php-format
+msgid "%d connection in common"
+msgid_plural "%d connections in common"
+msgstr[0] ""
+msgstr[1] ""
-#: ../../mod/newmember.php:82
-msgid "Go to the Help Section"
+#: ../../include/page_widgets.php:6
+msgid "New Page"
msgstr ""
-#: ../../mod/newmember.php:82
-msgid ""
-"Our <strong>help</strong> pages may be consulted for detail on other program "
-"features and resources."
+#: ../../include/page_widgets.php:8 ../../include/ItemObject.php:96
+#: ../../mod/thing.php:229 ../../mod/webpages.php:118 ../../mod/menu.php:55
+#: ../../mod/layouts.php:102 ../../mod/filestorage.php:171
+#: ../../mod/settings.php:569 ../../mod/editlayout.php:101
+#: ../../mod/editpost.php:98 ../../mod/blocks.php:93
+#: ../../mod/editwebpage.php:144 ../../mod/editblock.php:115
+msgid "Edit"
msgstr ""
-#: ../../mod/attach.php:8
-msgid "Item not available."
+#: ../../include/plugin.php:475 ../../include/plugin.php:477
+msgid "Click here to upgrade."
msgstr ""
-#: ../../mod/attach.php:20
-msgid "Item was not found."
+#: ../../include/plugin.php:483
+msgid "This action exceeds the limits set by your subscription plan."
msgstr ""
-#: ../../mod/group.php:29
-msgid "Group created."
+#: ../../include/plugin.php:488
+msgid "This action is not available under your subscription plan."
msgstr ""
-#: ../../mod/group.php:35
-msgid "Could not create group."
+#: ../../include/follow.php:21
+msgid "Channel is blocked on this site."
msgstr ""
-#: ../../mod/group.php:47 ../../mod/group.php:137
-msgid "Group not found."
+#: ../../include/follow.php:26
+msgid "Channel location missing."
msgstr ""
-#: ../../mod/group.php:60
-msgid "Group name changed."
+#: ../../include/follow.php:43
+msgid "Channel discovery failed. Website may be down or misconfigured."
msgstr ""
-#: ../../mod/group.php:72 ../../mod/profperm.php:19 ../../index.php:308
-msgid "Permission denied"
+#: ../../include/follow.php:51
+msgid "Response from remote channel was not understood."
msgstr ""
-#: ../../mod/group.php:90
-msgid "Create a group of contacts/friends."
+#: ../../include/follow.php:58
+msgid "Response from remote channel was incomplete."
msgstr ""
-#: ../../mod/group.php:91 ../../mod/group.php:177
-msgid "Group Name: "
+#: ../../include/follow.php:129
+msgid "local account not found."
msgstr ""
-#: ../../mod/group.php:110
-msgid "Group removed."
+#: ../../include/follow.php:138
+msgid "Cannot connect to yourself."
msgstr ""
-#: ../../mod/group.php:112
-msgid "Unable to remove group."
+#: ../../include/permissions.php:13
+msgid "Can view my \"public\" stream and posts"
msgstr ""
-#: ../../mod/group.php:176
-msgid "Group Editor"
+#: ../../include/permissions.php:14
+msgid "Can view my \"public\" channel profile"
msgstr ""
-#: ../../mod/group.php:189
-msgid "Members"
+#: ../../include/permissions.php:15
+msgid "Can view my \"public\" photo albums"
msgstr ""
-#: ../../mod/group.php:221 ../../mod/profperm.php:105
-msgid "Click on a contact to add or remove."
+#: ../../include/permissions.php:16
+msgid "Can view my \"public\" address book"
msgstr ""
-#: ../../mod/profperm.php:25 ../../mod/profperm.php:55
-msgid "Invalid profile identifier."
+#: ../../include/permissions.php:17
+msgid "Can view my \"public\" file storage"
msgstr ""
-#: ../../mod/profperm.php:101
-msgid "Profile Visibility Editor"
+#: ../../include/permissions.php:18
+msgid "Can view my \"public\" pages"
msgstr ""
-#: ../../mod/profperm.php:103 ../../view/theme/diabook/theme.php:128
-#: ../../include/profile_advanced.php:7 ../../include/profile_advanced.php:84
-#: ../../include/nav.php:50 ../../boot.php:1580
-msgid "Profile"
+#: ../../include/permissions.php:21
+msgid "Can send me their channel stream and posts"
msgstr ""
-#: ../../mod/profperm.php:114
-msgid "Visible To"
+#: ../../include/permissions.php:22
+msgid "Can post on my channel page (\"wall\")"
msgstr ""
-#: ../../mod/profperm.php:130
-msgid "All Contacts (with secure profile access)"
+#: ../../include/permissions.php:23
+msgid "Can comment on my posts"
msgstr ""
-#: ../../mod/viewconnections.php:39
-msgid "No contacts."
+#: ../../include/permissions.php:24
+msgid "Can send me private mail messages"
msgstr ""
-#: ../../mod/viewconnections.php:76 ../../include/text.php:589
-msgid "View Contacts"
+#: ../../include/permissions.php:25
+msgid "Can post photos to my photo albums"
msgstr ""
-#: ../../mod/register.php:88 ../../mod/regmod.php:52
-#, php-format
-msgid "Registration details for %s"
+#: ../../include/permissions.php:26
+msgid "Can forward to all my channel contacts via post @mentions"
msgstr ""
-#: ../../mod/register.php:96
-msgid ""
-"Registration successful. Please check your email for further instructions."
+#: ../../include/permissions.php:26
+msgid "Advanced - useful for creating group forum channels"
msgstr ""
-#: ../../mod/register.php:100
-msgid "Failed to send email message. Here is the message that failed."
+#: ../../include/permissions.php:27
+msgid "Can chat with me (when available)"
msgstr ""
-#: ../../mod/register.php:105
-msgid "Your registration can not be processed."
+#: ../../include/permissions.php:27
+msgid "Requires compatible chat plugin"
msgstr ""
-#: ../../mod/register.php:142
-#, php-format
-msgid "Registration request at %s"
+#: ../../include/permissions.php:28
+msgid "Can write to my \"public\" file storage"
msgstr ""
-#: ../../mod/register.php:151
-msgid "Your registration is pending approval by the site owner."
+#: ../../include/permissions.php:29
+msgid "Can edit my \"public\" pages"
msgstr ""
-#: ../../mod/register.php:189
-msgid ""
-"This site has exceeded the number of allowed daily account registrations. "
-"Please try again tomorrow."
+#: ../../include/permissions.php:31
+msgid "Can source my \"public\" posts in derived channels"
msgstr ""
-#: ../../mod/register.php:215
-msgid ""
-"You may (optionally) fill in this form via OpenID by supplying your OpenID "
-"and clicking 'Register'."
+#: ../../include/permissions.php:31
+msgid "Somewhat advanced - very useful in open communities"
msgstr ""
-#: ../../mod/register.php:216
-msgid ""
-"If you are not familiar with OpenID, please leave that field blank and fill "
-"in the rest of the items."
+#: ../../include/permissions.php:32
+msgid "Can administer my channel resources"
msgstr ""
-#: ../../mod/register.php:217
-msgid "Your OpenID (optional): "
+#: ../../include/permissions.php:32
+msgid "Extremely advanced. Leave this alone unless you know what you are doing"
msgstr ""
-#: ../../mod/register.php:231
-msgid "Include your profile in member directory?"
+#: ../../include/comanche.php:35 ../../view/theme/redbasic/php/config.php:62
+#: ../../view/theme/apw/php/config.php:176
+msgid "Default"
msgstr ""
-#: ../../mod/register.php:251
-msgid "Membership on this site is by invitation only."
+#: ../../include/identity.php:29 ../../mod/item.php:1143
+msgid "Unable to obtain identity information from database"
msgstr ""
-#: ../../mod/register.php:252
-msgid "Your invitation ID: "
+#: ../../include/identity.php:62
+msgid "Empty name"
msgstr ""
-#: ../../mod/register.php:255 ../../mod/admin.php:423
-msgid "Registration"
+#: ../../include/identity.php:64
+msgid "Name too long"
msgstr ""
-#: ../../mod/register.php:263
-msgid "Your Full Name (e.g. Joe Smith): "
+#: ../../include/identity.php:143
+msgid "No account identifier"
msgstr ""
-#: ../../mod/register.php:264
-msgid "Your Email Address: "
+#: ../../include/identity.php:153
+msgid "Nickname is required."
msgstr ""
-#: ../../mod/register.php:265
+#: ../../include/identity.php:167
msgid ""
-"Choose a profile nickname. This must begin with a text character. Your "
-"profile address on this site will then be '<strong>nickname@$sitename</"
-"strong>'."
-msgstr ""
-
-#: ../../mod/register.php:266
-msgid "Choose a nickname: "
-msgstr ""
-
-#: ../../mod/register.php:269 ../../include/nav.php:81 ../../boot.php:864
-msgid "Register"
-msgstr ""
-
-#: ../../mod/dirfind.php:26
-msgid "People Search"
-msgstr ""
-
-#: ../../mod/like.php:144 ../../mod/like.php:301 ../../mod/tagger.php:70
-#: ../../addon/facebook/facebook.php:1586
-#: ../../addon/communityhome/communityhome.php:158
-#: ../../addon/communityhome/communityhome.php:167
-#: ../../view/theme/diabook/theme.php:565
-#: ../../view/theme/diabook/theme.php:574 ../../include/diaspora.php:1777
-#: ../../include/conversation.php:48 ../../include/conversation.php:57
-#: ../../include/conversation.php:121 ../../include/conversation.php:130
-msgid "status"
-msgstr ""
-
-#: ../../mod/like.php:161 ../../addon/facebook/facebook.php:1590
-#: ../../addon/communityhome/communityhome.php:172
-#: ../../view/theme/diabook/theme.php:579 ../../include/diaspora.php:1793
-#: ../../include/conversation.php:65
-#, php-format
-msgid "%1$s likes %2$s's %3$s"
-msgstr ""
-
-#: ../../mod/like.php:163 ../../include/conversation.php:68
-#, php-format
-msgid "%1$s doesn't like %2$s's %3$s"
-msgstr ""
-
-#: ../../mod/notice.php:15 ../../mod/viewsrc.php:15 ../../mod/admin.php:159
-#: ../../mod/admin.php:702 ../../mod/admin.php:901 ../../mod/display.php:37
-#: ../../mod/display.php:142 ../../include/items.php:3336
-msgid "Item not found."
-msgstr ""
-
-#: ../../mod/viewsrc.php:7
-msgid "Access denied."
+"Nickname has unsupported characters or is already being used on this site."
msgstr ""
-#: ../../mod/fbrowser.php:25 ../../view/theme/diabook/theme.php:130
-#: ../../include/nav.php:51 ../../boot.php:1586
-msgid "Photos"
+#: ../../include/identity.php:226
+msgid "Unable to retrieve created identity"
msgstr ""
-#: ../../mod/fbrowser.php:96
-msgid "Files"
+#: ../../include/identity.php:285
+msgid "Default Profile"
msgstr ""
-#: ../../mod/regmod.php:61
-msgid "Account approved."
+#: ../../include/identity.php:477
+msgid "Requested channel is not available."
msgstr ""
-#: ../../mod/regmod.php:98
-#, php-format
-msgid "Registration revoked for %s"
-msgstr ""
-
-#: ../../mod/regmod.php:110
-msgid "Please login."
-msgstr ""
-
-#: ../../mod/item.php:89
-msgid "Unable to locate original post."
-msgstr ""
-
-#: ../../mod/item.php:258
-msgid "Empty post discarded."
-msgstr ""
-
-#: ../../mod/item.php:379 ../../mod/wall_upload.php:115
-#: ../../mod/wall_upload.php:124 ../../mod/wall_upload.php:131
-#: ../../include/message.php:144
-msgid "Wall Photos"
+#: ../../include/identity.php:489
+msgid " Sorry, you don't have the permission to view this profile. "
msgstr ""
-#: ../../mod/item.php:784
-msgid "System error. Post not saved."
-msgstr ""
-
-#: ../../mod/item.php:809
-#, php-format
-msgid ""
-"This message was sent to you by %s, a member of the Friendica social network."
-msgstr ""
-
-#: ../../mod/item.php:811
-#, php-format
-msgid "You may visit them online at %s"
-msgstr ""
-
-#: ../../mod/item.php:812
-msgid ""
-"Please contact the sender by replying to this post if you do not wish to "
-"receive these messages."
-msgstr ""
-
-#: ../../mod/item.php:814
-#, php-format
-msgid "%s posted an update."
+#: ../../include/identity.php:524 ../../mod/webpages.php:8
+#: ../../mod/connect.php:13 ../../mod/layouts.php:8
+#: ../../mod/achievements.php:8 ../../mod/filestorage.php:40
+#: ../../mod/blocks.php:10 ../../mod/profile.php:16
+msgid "Requested profile is not available."
msgstr ""
-#: ../../mod/profile_photo.php:30
-msgid "Image uploaded but image cropping failed."
+#: ../../include/identity.php:639 ../../mod/profiles.php:615
+msgid "Change profile photo"
msgstr ""
-#: ../../mod/profile_photo.php:63 ../../mod/profile_photo.php:70
-#: ../../mod/profile_photo.php:77 ../../mod/profile_photo.php:266
-#, php-format
-msgid "Image size reduction [%s] failed."
+#: ../../include/identity.php:645
+msgid "Profiles"
msgstr ""
-#: ../../mod/profile_photo.php:91
-msgid ""
-"Shift-reload the page or clear browser cache if the new photo does not "
-"display immediately."
+#: ../../include/identity.php:645
+msgid "Manage/edit profiles"
msgstr ""
-#: ../../mod/profile_photo.php:101
-msgid "Unable to process image"
+#: ../../include/identity.php:646 ../../mod/profiles.php:616
+msgid "Create New Profile"
msgstr ""
-#: ../../mod/profile_photo.php:117 ../../mod/wall_upload.php:77
-#, php-format
-msgid "Image exceeds size limit of %d"
+#: ../../include/identity.php:649
+msgid "Edit Profile"
msgstr ""
-#: ../../mod/profile_photo.php:209
-msgid "Upload File:"
+#: ../../include/identity.php:660 ../../mod/profiles.php:627
+msgid "Profile Image"
msgstr ""
-#: ../../mod/profile_photo.php:210
-msgid "Upload Profile Photo"
+#: ../../include/identity.php:663 ../../mod/profiles.php:630
+msgid "visible to everybody"
msgstr ""
-#: ../../mod/profile_photo.php:211
-msgid "Upload"
+#: ../../include/identity.php:664 ../../mod/profiles.php:631
+msgid "Edit visibility"
msgstr ""
-#: ../../mod/profile_photo.php:213
-msgid "skip this step"
+#: ../../include/identity.php:678 ../../include/identity.php:903
+#: ../../mod/directory.php:158
+msgid "Gender:"
msgstr ""
-#: ../../mod/profile_photo.php:213
-msgid "select a photo from your photo albums"
+#: ../../include/identity.php:679 ../../include/identity.php:923
+#: ../../mod/directory.php:160
+msgid "Status:"
msgstr ""
-#: ../../mod/profile_photo.php:226
-msgid "Crop Image"
+#: ../../include/identity.php:680 ../../include/identity.php:934
+#: ../../mod/directory.php:162
+msgid "Homepage:"
msgstr ""
-#: ../../mod/profile_photo.php:227
-msgid "Please adjust the image cropping for optimum viewing."
+#: ../../include/identity.php:747 ../../include/identity.php:827
+#: ../../mod/ping.php:230
+msgid "g A l F d"
msgstr ""
-#: ../../mod/profile_photo.php:229
-msgid "Done Editing"
+#: ../../include/identity.php:748 ../../include/identity.php:828
+msgid "F d"
msgstr ""
-#: ../../mod/profile_photo.php:257
-msgid "Image uploaded successfully."
+#: ../../include/identity.php:793 ../../include/identity.php:868
+#: ../../mod/ping.php:252
+msgid "[today]"
msgstr ""
-#: ../../mod/hcard.php:10
-msgid "No profile"
+#: ../../include/identity.php:805
+msgid "Birthday Reminders"
msgstr ""
-#: ../../mod/removeme.php:45 ../../mod/removeme.php:48
-msgid "Remove My Account"
+#: ../../include/identity.php:806
+msgid "Birthdays this week:"
msgstr ""
-#: ../../mod/removeme.php:46
-msgid ""
-"This will completely remove your account. Once this has been done it is not "
-"recoverable."
+#: ../../include/identity.php:861
+msgid "[No description]"
msgstr ""
-#: ../../mod/removeme.php:47
-msgid "Please enter your password for verification:"
+#: ../../include/identity.php:879
+msgid "Event Reminders"
msgstr ""
-#: ../../mod/message.php:9 ../../include/nav.php:131
-msgid "New Message"
+#: ../../include/identity.php:880
+msgid "Events this week:"
msgstr ""
-#: ../../mod/message.php:70
-msgid "Unable to locate contact information."
+#: ../../include/identity.php:893 ../../include/identity.php:975
+#: ../../mod/profperm.php:103
+msgid "Profile"
msgstr ""
-#: ../../mod/message.php:120
-msgid "Message deleted."
+#: ../../include/identity.php:901 ../../mod/settings.php:911
+msgid "Full Name:"
msgstr ""
-#: ../../mod/message.php:150
-msgid "Conversation removed."
+#: ../../include/identity.php:908
+msgid "j F, Y"
msgstr ""
-#: ../../mod/message.php:249
-msgid "No messages."
+#: ../../include/identity.php:909
+msgid "j F"
msgstr ""
-#: ../../mod/message.php:256
-#, php-format
-msgid "Unknown sender - %s"
+#: ../../include/identity.php:916
+msgid "Birthday:"
msgstr ""
-#: ../../mod/message.php:259
-#, php-format
-msgid "You and %s"
+#: ../../include/identity.php:920
+msgid "Age:"
msgstr ""
-#: ../../mod/message.php:262
+#: ../../include/identity.php:929
#, php-format
-msgid "%s and You"
-msgstr ""
-
-#: ../../mod/message.php:272 ../../mod/message.php:394
-msgid "Delete conversation"
+msgid "for %1$d %2$s"
msgstr ""
-#: ../../mod/message.php:275
-msgid "D, d M Y - g:i A"
+#: ../../include/identity.php:932 ../../mod/profiles.php:538
+msgid "Sexual Preference:"
msgstr ""
-#: ../../mod/message.php:277
-#, php-format
-msgid "%d message"
-msgid_plural "%d messages"
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../../mod/message.php:312
-msgid "Message not available."
+#: ../../include/identity.php:936 ../../mod/profiles.php:540
+msgid "Hometown:"
msgstr ""
-#: ../../mod/message.php:377
-msgid "Delete message"
+#: ../../include/identity.php:938
+msgid "Tags:"
msgstr ""
-#: ../../mod/message.php:396
-msgid ""
-"No secure communications available. You <strong>may</strong> be able to "
-"respond from the sender's profile page."
+#: ../../include/identity.php:940 ../../mod/profiles.php:541
+msgid "Political Views:"
msgstr ""
-#: ../../mod/message.php:400
-msgid "Send Reply"
+#: ../../include/identity.php:942
+msgid "Religion:"
msgstr ""
-#: ../../mod/allfriends.php:34
-#, php-format
-msgid "Friends of %s"
+#: ../../include/identity.php:944 ../../mod/directory.php:164
+msgid "About:"
msgstr ""
-#: ../../mod/allfriends.php:40
-msgid "No friends to display."
+#: ../../include/identity.php:946
+msgid "Hobbies/Interests:"
msgstr ""
-#: ../../mod/admin.php:55
-msgid "Theme settings updated."
+#: ../../include/identity.php:948 ../../mod/profiles.php:544
+msgid "Likes:"
msgstr ""
-#: ../../mod/admin.php:96 ../../mod/admin.php:421
-msgid "Site"
+#: ../../include/identity.php:950 ../../mod/profiles.php:545
+msgid "Dislikes:"
msgstr ""
-#: ../../mod/admin.php:97 ../../mod/admin.php:657 ../../mod/admin.php:669
-msgid "Users"
+#: ../../include/identity.php:953
+msgid "Contact information and Social Networks:"
msgstr ""
-#: ../../mod/admin.php:98 ../../mod/admin.php:751 ../../mod/admin.php:793
-msgid "Plugins"
+#: ../../include/identity.php:955
+msgid "Musical interests:"
msgstr ""
-#: ../../mod/admin.php:99 ../../mod/admin.php:956 ../../mod/admin.php:992
-msgid "Themes"
+#: ../../include/identity.php:957
+msgid "Books, literature:"
msgstr ""
-#: ../../mod/admin.php:100
-msgid "DB updates"
+#: ../../include/identity.php:959
+msgid "Television:"
msgstr ""
-#: ../../mod/admin.php:115 ../../mod/admin.php:122 ../../mod/admin.php:1079
-msgid "Logs"
+#: ../../include/identity.php:961
+msgid "Film/dance/culture/entertainment:"
msgstr ""
-#: ../../mod/admin.php:120 ../../include/nav.php:146
-msgid "Admin"
+#: ../../include/identity.php:963
+msgid "Love/Romance:"
msgstr ""
-#: ../../mod/admin.php:121
-msgid "Plugin Features"
+#: ../../include/identity.php:965
+msgid "Work/employment:"
msgstr ""
-#: ../../mod/admin.php:123
-msgid "User registrations waiting for confirmation"
+#: ../../include/identity.php:967
+msgid "School/education:"
msgstr ""
-#: ../../mod/admin.php:183 ../../mod/admin.php:639
-msgid "Normal Account"
+#: ../../include/items.php:201 ../../mod/like.php:55 ../../mod/group.php:68
+#: ../../mod/profperm.php:19 ../../index.php:343
+msgid "Permission denied"
msgstr ""
-#: ../../mod/admin.php:184 ../../mod/admin.php:640
-msgid "Soapbox Account"
+#: ../../include/items.php:3383 ../../mod/thing.php:74 ../../mod/admin.php:150
+#: ../../mod/admin.php:730 ../../mod/admin.php:933 ../../mod/viewsrc.php:18
+#: ../../mod/home.php:63 ../../mod/filestorage.php:18 ../../mod/display.php:32
+#: ../../mod/channel.php:182
+msgid "Item not found."
msgstr ""
-#: ../../mod/admin.php:185 ../../mod/admin.php:641
-msgid "Community/Celebrity Account"
+#: ../../include/items.php:3734 ../../mod/group.php:38 ../../mod/group.php:140
+msgid "Collection not found."
msgstr ""
-#: ../../mod/admin.php:186 ../../mod/admin.php:642
-msgid "Automatic Friend Account"
+#: ../../include/items.php:3749
+msgid "Collection is empty."
msgstr ""
-#: ../../mod/admin.php:187
-msgid "Blog Account"
+#: ../../include/items.php:3756
+#, php-format
+msgid "Collection: %s"
msgstr ""
-#: ../../mod/admin.php:188
-msgid "Private Forum"
+#: ../../include/items.php:3767
+#, php-format
+msgid "Connection: %s"
msgstr ""
-#: ../../mod/admin.php:207
-msgid "Message queues"
+#: ../../include/items.php:3770
+msgid "Connection not found."
msgstr ""
-#: ../../mod/admin.php:212 ../../mod/admin.php:420 ../../mod/admin.php:656
-#: ../../mod/admin.php:750 ../../mod/admin.php:792 ../../mod/admin.php:955
-#: ../../mod/admin.php:991 ../../mod/admin.php:1078
-msgid "Administration"
+#: ../../include/ItemObject.php:89 ../../mod/photos.php:972
+msgid "Private Message"
msgstr ""
-#: ../../mod/admin.php:213
-msgid "Summary"
+#: ../../include/ItemObject.php:118
+msgid "save to folder"
msgstr ""
-#: ../../mod/admin.php:215
-msgid "Registered users"
+#: ../../include/ItemObject.php:146
+msgid "add star"
msgstr ""
-#: ../../mod/admin.php:217
-msgid "Pending registrations"
+#: ../../include/ItemObject.php:147
+msgid "remove star"
msgstr ""
-#: ../../mod/admin.php:218
-msgid "Version"
+#: ../../include/ItemObject.php:148
+msgid "toggle star status"
msgstr ""
-#: ../../mod/admin.php:220
-msgid "Active plugins"
+#: ../../include/ItemObject.php:152
+msgid "starred"
msgstr ""
-#: ../../mod/admin.php:359
-msgid "Site settings updated."
+#: ../../include/ItemObject.php:169
+msgid "add tag"
msgstr ""
-#: ../../mod/admin.php:407
-msgid "Closed"
+#: ../../include/ItemObject.php:175 ../../mod/photos.php:1078
+msgid "I like this (toggle)"
msgstr ""
-#: ../../mod/admin.php:408
-msgid "Requires approval"
+#: ../../include/ItemObject.php:176 ../../mod/photos.php:1079
+msgid "I don't like this (toggle)"
msgstr ""
-#: ../../mod/admin.php:409
-msgid "Open"
+#: ../../include/ItemObject.php:178
+msgid "Share this"
msgstr ""
-#: ../../mod/admin.php:413
-msgid "No SSL policy, links will track page SSL state"
+#: ../../include/ItemObject.php:178
+msgid "share"
msgstr ""
-#: ../../mod/admin.php:414
-msgid "Force all links to use SSL"
+#: ../../include/ItemObject.php:202 ../../include/ItemObject.php:203
+#, php-format
+msgid "View %s's profile - %s"
msgstr ""
-#: ../../mod/admin.php:415
-msgid "Self-signed certificate, use SSL for local links only (discouraged)"
+#: ../../include/ItemObject.php:204
+msgid "to"
msgstr ""
-#: ../../mod/admin.php:424
-msgid "File upload"
+#: ../../include/ItemObject.php:205
+msgid "via"
msgstr ""
-#: ../../mod/admin.php:425
-msgid "Policies"
+#: ../../include/ItemObject.php:206
+msgid "Wall-to-Wall"
msgstr ""
-#: ../../mod/admin.php:426
-msgid "Advanced"
+#: ../../include/ItemObject.php:207
+msgid "via Wall-To-Wall:"
msgstr ""
-#: ../../mod/admin.php:430 ../../addon/statusnet/statusnet.php:558
-msgid "Site name"
+#: ../../include/ItemObject.php:221
+#, php-format
+msgid "Expires: %s"
msgstr ""
-#: ../../mod/admin.php:431
-msgid "Banner/Logo"
-msgstr ""
+#: ../../include/ItemObject.php:269
+#, php-format
+msgid "%d comment"
+msgid_plural "%d comments"
+msgstr[0] ""
+msgstr[1] ""
-#: ../../mod/admin.php:432
-msgid "System language"
+#: ../../include/ItemObject.php:534 ../../mod/photos.php:1097
+#: ../../mod/photos.php:1184
+msgid "This is you"
msgstr ""
-#: ../../mod/admin.php:433
-msgid "System theme"
+#: ../../include/ItemObject.php:537 ../../mod/events.php:470
+#: ../../mod/thing.php:276 ../../mod/thing.php:318 ../../mod/invite.php:156
+#: ../../mod/connedit.php:434 ../../mod/setup.php:304 ../../mod/setup.php:347
+#: ../../mod/connect.php:92 ../../mod/sources.php:97 ../../mod/sources.php:131
+#: ../../mod/admin.php:420 ../../mod/admin.php:686 ../../mod/admin.php:826
+#: ../../mod/admin.php:1025 ../../mod/admin.php:1112 ../../mod/group.php:81
+#: ../../mod/photos.php:693 ../../mod/photos.php:798 ../../mod/photos.php:1060
+#: ../../mod/photos.php:1100 ../../mod/photos.php:1187
+#: ../../mod/profiles.php:518 ../../mod/filestorage.php:132
+#: ../../mod/import.php:387 ../../mod/settings.php:507
+#: ../../mod/settings.php:619 ../../mod/settings.php:647
+#: ../../mod/settings.php:671 ../../mod/settings.php:742
+#: ../../mod/settings.php:903 ../../mod/mail.php:223 ../../mod/mail.php:335
+#: ../../mod/poke.php:166 ../../mod/fsuggest.php:108 ../../mod/mood.php:142
+#: ../../view/theme/redbasic/php/config.php:85
+#: ../../view/theme/apw/php/config.php:231
+#: ../../view/theme/blogga/view/theme/blog/config.php:67
+#: ../../view/theme/blogga/php/config.php:67
+msgid "Submit"
msgstr ""
-#: ../../mod/admin.php:433
-msgid ""
-"Default system theme - may be over-ridden by user profiles - <a href='#' "
-"id='cnftheme'>change theme settings</a>"
+#: ../../include/ItemObject.php:538
+msgid "Bold"
msgstr ""
-#: ../../mod/admin.php:434
-msgid "SSL link policy"
+#: ../../include/ItemObject.php:539
+msgid "Italic"
msgstr ""
-#: ../../mod/admin.php:434
-msgid "Determines whether generated links should be forced to use SSL"
+#: ../../include/ItemObject.php:540
+msgid "Underline"
msgstr ""
-#: ../../mod/admin.php:435
-msgid "Maximum image size"
+#: ../../include/ItemObject.php:541
+msgid "Quote"
msgstr ""
-#: ../../mod/admin.php:435
-msgid ""
-"Maximum size in bytes of uploaded images. Default is 0, which means no "
-"limits."
+#: ../../include/ItemObject.php:542
+msgid "Code"
msgstr ""
-#: ../../mod/admin.php:437
-msgid "Register policy"
+#: ../../include/ItemObject.php:543
+msgid "Image"
msgstr ""
-#: ../../mod/admin.php:438
-msgid "Register text"
+#: ../../include/ItemObject.php:544
+msgid "Link"
msgstr ""
-#: ../../mod/admin.php:438
-msgid "Will be displayed prominently on the registration page."
+#: ../../include/ItemObject.php:545
+msgid "Video"
msgstr ""
-#: ../../mod/admin.php:439
-msgid "Accounts abandoned after x days"
+#: ../../include/security.php:49
+msgid "Welcome "
msgstr ""
-#: ../../mod/admin.php:439
-msgid ""
-"Will not waste system resources polling external sites for abandonded "
-"accounts. Enter 0 for no time limit."
+#: ../../include/security.php:50
+msgid "Please upload a profile photo."
msgstr ""
-#: ../../mod/admin.php:440
-msgid "Allowed friend domains"
+#: ../../include/security.php:53
+msgid "Welcome back "
msgstr ""
-#: ../../mod/admin.php:440
+#: ../../include/security.php:360
msgid ""
-"Comma separated list of domains which are allowed to establish friendships "
-"with this site. Wildcards are accepted. Empty to allow any domains"
+"The form security token was not correct. This probably happened because the "
+"form has been opened for too long (>3 hours) before submitting it."
msgstr ""
-#: ../../mod/admin.php:441
-msgid "Allowed email domains"
+#: ../../include/zot.php:545
+msgid "Invalid data packet"
msgstr ""
-#: ../../mod/admin.php:441
-msgid ""
-"Comma separated list of domains which are allowed in email addresses for "
-"registrations to this site. Wildcards are accepted. Empty to allow any "
-"domains"
+#: ../../include/zot.php:555
+msgid "Unable to verify channel signature"
msgstr ""
-#: ../../mod/admin.php:442
-msgid "Block public"
+#: ../../include/zot.php:732
+#, php-format
+msgid "Unable to verify site signature for %s"
msgstr ""
-#: ../../mod/admin.php:442
-msgid ""
-"Check to block public access to all otherwise public personal pages on this "
-"site unless you are currently logged in."
+#: ../../mod/common.php:10
+msgid "No channel."
msgstr ""
-#: ../../mod/admin.php:443
-msgid "Force publish"
+#: ../../mod/common.php:39
+msgid "Common connections"
msgstr ""
-#: ../../mod/admin.php:443
-msgid ""
-"Check to force all profiles on this site to be listed in the site directory."
+#: ../../mod/common.php:44
+msgid "No connections in common."
msgstr ""
-#: ../../mod/admin.php:444
-msgid "Global directory update URL"
+#: ../../mod/events.php:72
+msgid "Event title and start time are required."
msgstr ""
-#: ../../mod/admin.php:444
-msgid ""
-"URL to update the global directory. If this is not set, the global directory "
-"is completely unavailable to the application."
+#: ../../mod/events.php:287
+msgid "l, F j"
msgstr ""
-#: ../../mod/admin.php:446
-msgid "Block multiple registrations"
+#: ../../mod/events.php:309
+msgid "Edit event"
msgstr ""
-#: ../../mod/admin.php:446
-msgid "Disallow users to register additional accounts for use as pages."
+#: ../../mod/events.php:355
+msgid "Create New Event"
msgstr ""
-#: ../../mod/admin.php:447
-msgid "OpenID support"
+#: ../../mod/events.php:356
+msgid "Previous"
msgstr ""
-#: ../../mod/admin.php:447
-msgid "OpenID support for registration and logins."
+#: ../../mod/events.php:357 ../../mod/setup.php:258
+msgid "Next"
msgstr ""
-#: ../../mod/admin.php:448
-msgid "Fullname check"
+#: ../../mod/events.php:429
+msgid "hour:minute"
msgstr ""
-#: ../../mod/admin.php:448
-msgid ""
-"Force users to register with a space between firstname and lastname in Full "
-"name, as an antispam measure"
+#: ../../mod/events.php:448
+msgid "Event details"
msgstr ""
-#: ../../mod/admin.php:449
-msgid "UTF-8 Regular expressions"
+#: ../../mod/events.php:449
+#, php-format
+msgid "Format is %s %s. Starting date and Title are required."
msgstr ""
-#: ../../mod/admin.php:449
-msgid "Use PHP UTF8 regular expressions"
+#: ../../mod/events.php:451
+msgid "Event Starts:"
msgstr ""
-#: ../../mod/admin.php:450
-msgid "Show Community Page"
+#: ../../mod/events.php:451 ../../mod/events.php:465
+msgid "Required"
msgstr ""
-#: ../../mod/admin.php:450
-msgid ""
-"Display a Community page showing all recent public postings on this site."
+#: ../../mod/events.php:454
+msgid "Finish date/time is not known or not relevant"
msgstr ""
-#: ../../mod/admin.php:451
-msgid "Enable OStatus support"
+#: ../../mod/events.php:456
+msgid "Event Finishes:"
msgstr ""
-#: ../../mod/admin.php:451
-msgid ""
-"Provide built-in OStatus (identi.ca, status.net, etc.) compatibility. All "
-"communications in OStatus are public, so privacy warnings will be "
-"occasionally displayed."
+#: ../../mod/events.php:459
+msgid "Adjust for viewer timezone"
msgstr ""
-#: ../../mod/admin.php:452
-msgid "Enable Diaspora support"
+#: ../../mod/events.php:461
+msgid "Description:"
msgstr ""
-#: ../../mod/admin.php:452
-msgid "Provide built-in Diaspora network compatibility."
+#: ../../mod/events.php:465
+msgid "Title:"
msgstr ""
-#: ../../mod/admin.php:453
-msgid "Only allow Friendica contacts"
+#: ../../mod/events.php:467
+msgid "Share this event"
msgstr ""
-#: ../../mod/admin.php:453
-msgid ""
-"All contacts must use Friendica protocols. All other built-in communication "
-"protocols disabled."
+#: ../../mod/thing.php:94
+msgid "Thing updated"
msgstr ""
-#: ../../mod/admin.php:454
-msgid "Verify SSL"
+#: ../../mod/thing.php:153
+msgid "Object store: failed"
msgstr ""
-#: ../../mod/admin.php:454
-msgid ""
-"If you wish, you can turn on strict certificate checking. This will mean you "
-"cannot connect (at all) to self-signed SSL sites."
+#: ../../mod/thing.php:157
+msgid "Thing added"
msgstr ""
-#: ../../mod/admin.php:455
-msgid "Proxy user"
+#: ../../mod/thing.php:175
+#, php-format
+msgid "OBJ: %1$s %2$s %3$s"
msgstr ""
-#: ../../mod/admin.php:456
-msgid "Proxy URL"
+#: ../../mod/thing.php:228
+msgid "Show Thing"
msgstr ""
-#: ../../mod/admin.php:457
-msgid "Network timeout"
+#: ../../mod/thing.php:235
+msgid "item not found."
msgstr ""
-#: ../../mod/admin.php:457
-msgid "Value is in seconds. Set to 0 for unlimited (not recommended)."
+#: ../../mod/thing.php:263
+msgid "Edit Thing"
msgstr ""
-#: ../../mod/admin.php:458
-msgid "Delivery interval"
+#: ../../mod/thing.php:265 ../../mod/thing.php:311
+msgid "Select a profile"
msgstr ""
-#: ../../mod/admin.php:458
-msgid ""
-"Delay background delivery processes by this many seconds to reduce system "
-"load. Recommend: 4-5 for shared hosts, 2-3 for virtual private servers. 0-1 "
-"for large dedicated servers."
+#: ../../mod/thing.php:267 ../../mod/thing.php:313
+msgid "Select a category of stuff. e.g. I ______ something"
msgstr ""
-#: ../../mod/admin.php:459
-msgid "Poll interval"
+#: ../../mod/thing.php:270 ../../mod/thing.php:315
+msgid "Name of thing e.g. something"
msgstr ""
-#: ../../mod/admin.php:459
-msgid ""
-"Delay background polling processes by this many seconds to reduce system "
-"load. If 0, use delivery interval."
+#: ../../mod/thing.php:272 ../../mod/thing.php:316
+msgid "URL of thing (optional)"
msgstr ""
-#: ../../mod/admin.php:460
-msgid "Maximum Load Average"
+#: ../../mod/thing.php:274 ../../mod/thing.php:317
+msgid "URL for photo of thing (optional)"
msgstr ""
-#: ../../mod/admin.php:460
-msgid ""
-"Maximum system load before delivery and poll processes are deferred - "
-"default 50."
+#: ../../mod/thing.php:309
+msgid "Add Thing to your Profile"
msgstr ""
-#: ../../mod/admin.php:474
-msgid "Update has been marked successful"
+#: ../../mod/invite.php:25
+msgid "Total invitation limit exceeded."
msgstr ""
-#: ../../mod/admin.php:484
+#: ../../mod/invite.php:49
#, php-format
-msgid "Executing %s failed. Check system logs."
+msgid "%s : Not a valid email address."
msgstr ""
-#: ../../mod/admin.php:487
-#, php-format
-msgid "Update %s was successfully applied."
+#: ../../mod/invite.php:76
+msgid "Please join us on Red"
msgstr ""
-#: ../../mod/admin.php:491
-#, php-format
-msgid "Update %s did not return a status. Unknown if it succeeded."
+#: ../../mod/invite.php:87
+msgid "Invitation limit exceeded. Please contact your site administrator."
msgstr ""
-#: ../../mod/admin.php:494
+#: ../../mod/invite.php:92
#, php-format
-msgid "Update function %s could not be found."
-msgstr ""
-
-#: ../../mod/admin.php:509
-msgid "No failed updates."
-msgstr ""
-
-#: ../../mod/admin.php:513
-msgid "Failed Updates"
-msgstr ""
-
-#: ../../mod/admin.php:514
-msgid ""
-"This does not include updates prior to 1139, which did not return a status."
-msgstr ""
-
-#: ../../mod/admin.php:515
-msgid "Mark success (if update was manually applied)"
-msgstr ""
-
-#: ../../mod/admin.php:516
-msgid "Attempt to execute this update step automatically"
+msgid "%s : Message delivery failed."
msgstr ""
-#: ../../mod/admin.php:541
-#, php-format
-msgid "%s user blocked/unblocked"
-msgid_plural "%s users blocked/unblocked"
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../../mod/admin.php:548
+#: ../../mod/invite.php:96
#, php-format
-msgid "%s user deleted"
-msgid_plural "%s users deleted"
+msgid "%d message sent."
+msgid_plural "%d messages sent."
msgstr[0] ""
msgstr[1] ""
-#: ../../mod/admin.php:587
-#, php-format
-msgid "User '%s' deleted"
-msgstr ""
-
-#: ../../mod/admin.php:595
-#, php-format
-msgid "User '%s' unblocked"
-msgstr ""
-
-#: ../../mod/admin.php:595
-#, php-format
-msgid "User '%s' blocked"
-msgstr ""
-
-#: ../../mod/admin.php:659
-msgid "select all"
-msgstr ""
-
-#: ../../mod/admin.php:660
-msgid "User registrations waiting for confirm"
-msgstr ""
-
-#: ../../mod/admin.php:661
-msgid "Request date"
-msgstr ""
-
-#: ../../mod/admin.php:661 ../../mod/admin.php:670
-#: ../../include/contact_selectors.php:79
-msgid "Email"
+#: ../../mod/invite.php:115
+msgid "You have no more invitations available"
msgstr ""
-#: ../../mod/admin.php:662
-msgid "No registrations."
+#: ../../mod/invite.php:141
+msgid "Send invitations"
msgstr ""
-#: ../../mod/admin.php:664
-msgid "Deny"
+#: ../../mod/invite.php:142
+msgid "Enter email addresses, one per line:"
msgstr ""
-#: ../../mod/admin.php:670
-msgid "Register date"
+#: ../../mod/invite.php:143 ../../mod/mail.php:216 ../../mod/mail.php:328
+msgid "Your message:"
msgstr ""
-#: ../../mod/admin.php:670
-msgid "Last login"
+#: ../../mod/invite.php:144
+msgid ""
+"You are cordially invited to join me and some other close friends on the Red "
+"Matrix - a revolutionary new decentralised communication and information "
+"tool."
msgstr ""
-#: ../../mod/admin.php:670
-msgid "Last item"
+#: ../../mod/invite.php:146
+msgid "You will need to supply this invitation code: $invite_code"
msgstr ""
-#: ../../mod/admin.php:670
-msgid "Account"
+#: ../../mod/invite.php:147
+msgid "Please visit my channel at"
msgstr ""
-#: ../../mod/admin.php:672
+#: ../../mod/invite.php:151
msgid ""
-"Selected users will be deleted!\\n\\nEverything these users had posted on "
-"this site will be permanently deleted!\\n\\nAre you sure?"
+"Once you have registered (on ANY Red Matrix site - they are all inter-"
+"connected), please connect with my Red Matrix channel address:"
msgstr ""
-#: ../../mod/admin.php:673
-msgid ""
-"The user {0} will be deleted!\\n\\nEverything this user has posted on this "
-"site will be permanently deleted!\\n\\nAre you sure?"
+#: ../../mod/invite.php:153
+msgid "Click the [Register] link on the following page to join."
msgstr ""
-#: ../../mod/admin.php:714
-#, php-format
-msgid "Plugin %s disabled."
+#: ../../mod/invite.php:155
+msgid ""
+"For more information about the Red Matrix Project and why it has the "
+"potential to change the internet as we know it, please visit http://getzot."
+"com"
msgstr ""
-#: ../../mod/admin.php:718
-#, php-format
-msgid "Plugin %s enabled."
+#: ../../mod/connedit.php:49 ../../mod/connections.php:37
+msgid "Could not access contact record."
msgstr ""
-#: ../../mod/admin.php:728 ../../mod/admin.php:926
-msgid "Disable"
+#: ../../mod/connedit.php:63 ../../mod/connections.php:51
+msgid "Could not locate selected profile."
msgstr ""
-#: ../../mod/admin.php:730 ../../mod/admin.php:928
-msgid "Enable"
+#: ../../mod/connedit.php:104 ../../mod/connections.php:92
+msgid "Connection updated."
msgstr ""
-#: ../../mod/admin.php:752 ../../mod/admin.php:957
-msgid "Toggle"
+#: ../../mod/connedit.php:106 ../../mod/connections.php:94
+msgid "Failed to update connection record."
msgstr ""
-#: ../../mod/admin.php:760 ../../mod/admin.php:967
-msgid "Author: "
+#: ../../mod/connedit.php:201
+msgid "Could not access address book record."
msgstr ""
-#: ../../mod/admin.php:761 ../../mod/admin.php:968
-msgid "Maintainer: "
+#: ../../mod/connedit.php:215
+msgid "Refresh failed - channel is currently unavailable."
msgstr ""
-#: ../../mod/admin.php:890
-msgid "No themes found."
+#: ../../mod/connedit.php:222
+msgid "Channel has been unblocked"
msgstr ""
-#: ../../mod/admin.php:949
-msgid "Screenshot"
+#: ../../mod/connedit.php:223
+msgid "Channel has been blocked"
msgstr ""
-#: ../../mod/admin.php:997
-msgid "[Experimental]"
+#: ../../mod/connedit.php:227 ../../mod/connedit.php:239
+#: ../../mod/connedit.php:251 ../../mod/connedit.php:263
+#: ../../mod/connedit.php:278
+msgid "Unable to set address book parameters."
msgstr ""
-#: ../../mod/admin.php:998
-msgid "[Unsupported]"
+#: ../../mod/connedit.php:234
+msgid "Channel has been unignored"
msgstr ""
-#: ../../mod/admin.php:1025
-msgid "Log settings updated."
+#: ../../mod/connedit.php:235
+msgid "Channel has been ignored"
msgstr ""
-#: ../../mod/admin.php:1081
-msgid "Clear"
+#: ../../mod/connedit.php:246
+msgid "Channel has been unarchived"
msgstr ""
-#: ../../mod/admin.php:1087
-msgid "Debugging"
+#: ../../mod/connedit.php:247
+msgid "Channel has been archived"
msgstr ""
-#: ../../mod/admin.php:1088
-msgid "Log file"
+#: ../../mod/connedit.php:258
+msgid "Channel has been unhidden"
msgstr ""
-#: ../../mod/admin.php:1088
-msgid ""
-"Must be writable by web server. Relative to your Friendica top-level "
-"directory."
+#: ../../mod/connedit.php:259
+msgid "Channel has been hidden"
msgstr ""
-#: ../../mod/admin.php:1089
-msgid "Log level"
+#: ../../mod/connedit.php:273
+msgid "Channel has been approved"
msgstr ""
-#: ../../mod/admin.php:1139
-msgid "Close"
+#: ../../mod/connedit.php:274
+msgid "Channel has been unapproved"
msgstr ""
-#: ../../mod/admin.php:1145
-msgid "FTP Host"
+#: ../../mod/connedit.php:292
+msgid "Contact has been removed."
msgstr ""
-#: ../../mod/admin.php:1146
-msgid "FTP Path"
+#: ../../mod/connedit.php:312
+#, php-format
+msgid "View %s's profile"
msgstr ""
-#: ../../mod/admin.php:1147
-msgid "FTP User"
+#: ../../mod/connedit.php:316
+msgid "Refresh Permissions"
msgstr ""
-#: ../../mod/admin.php:1148
-msgid "FTP Password"
+#: ../../mod/connedit.php:319
+msgid "Fetch updated permissions"
msgstr ""
-#: ../../mod/profile.php:21 ../../boot.php:1029
-msgid "Requested profile is not available."
+#: ../../mod/connedit.php:323
+msgid "Recent Activity"
msgstr ""
-#: ../../mod/profile.php:141 ../../mod/display.php:75
-msgid "Access to this profile has been restricted."
+#: ../../mod/connedit.php:326
+msgid "View recent posts and comments"
msgstr ""
-#: ../../mod/profile.php:166
-msgid "Tips for New Members"
+#: ../../mod/connedit.php:330 ../../mod/connedit.php:472
+#: ../../mod/admin.php:695
+msgid "Unblock"
msgstr ""
-#: ../../mod/ping.php:185
-msgid "{0} wants to be your friend"
+#: ../../mod/connedit.php:330 ../../mod/connedit.php:472
+#: ../../mod/admin.php:694
+msgid "Block"
msgstr ""
-#: ../../mod/ping.php:190
-msgid "{0} sent you a message"
+#: ../../mod/connedit.php:333
+msgid "Block or Unblock this connection"
msgstr ""
-#: ../../mod/ping.php:195
-msgid "{0} requested registration"
+#: ../../mod/connedit.php:337 ../../mod/connedit.php:473
+msgid "Unignore"
msgstr ""
-#: ../../mod/ping.php:201
-#, php-format
-msgid "{0} commented %s's post"
+#: ../../mod/connedit.php:337 ../../mod/connedit.php:473
+#: ../../mod/notifications.php:51
+msgid "Ignore"
msgstr ""
-#: ../../mod/ping.php:206
-#, php-format
-msgid "{0} liked %s's post"
+#: ../../mod/connedit.php:340
+msgid "Ignore or Unignore this connection"
msgstr ""
-#: ../../mod/ping.php:211
-#, php-format
-msgid "{0} disliked %s's post"
+#: ../../mod/connedit.php:343
+msgid "Unarchive"
msgstr ""
-#: ../../mod/ping.php:216
-#, php-format
-msgid "{0} is now friends with %s"
+#: ../../mod/connedit.php:343
+msgid "Archive"
msgstr ""
-#: ../../mod/ping.php:221
-msgid "{0} posted"
+#: ../../mod/connedit.php:346
+msgid "Archive or Unarchive this connection"
msgstr ""
-#: ../../mod/ping.php:226
-#, php-format
-msgid "{0} tagged %s's post with #%s"
+#: ../../mod/connedit.php:349
+msgid "Unhide"
msgstr ""
-#: ../../mod/ping.php:232
-msgid "{0} mentioned you in a post"
+#: ../../mod/connedit.php:349
+msgid "Hide"
msgstr ""
-#: ../../mod/nogroup.php:58
-msgid "Contacts who are not members of a group"
+#: ../../mod/connedit.php:352
+msgid "Hide or Unhide this connection"
msgstr ""
-#: ../../mod/openid.php:24
-msgid "OpenID protocol error. No ID returned."
+#: ../../mod/connedit.php:359
+msgid "Delete this connection"
msgstr ""
-#: ../../mod/openid.php:53
-msgid ""
-"Account not found and OpenID registration is not permitted on this site."
+#: ../../mod/connedit.php:392
+msgid "Unknown"
msgstr ""
-#: ../../mod/openid.php:93 ../../include/auth.php:99
-#: ../../include/auth.php:162
-msgid "Login failed."
+#: ../../mod/connedit.php:402 ../../mod/connedit.php:431
+msgid "Approve this connection"
msgstr ""
-#: ../../mod/follow.php:27
-msgid "Contact added"
+#: ../../mod/connedit.php:402
+msgid "Accept connection to allow communication"
msgstr ""
-#: ../../mod/common.php:42
-msgid "Common Friends"
+#: ../../mod/connedit.php:418
+msgid "Automatic Permissions Settings"
msgstr ""
-#: ../../mod/common.php:78
-msgid "No contacts in common."
+#: ../../mod/connedit.php:418
+#, php-format
+msgid "Connections: settings for %s"
msgstr ""
-#: ../../mod/share.php:28 ../../include/bb2diaspora.php:226
-msgid "link"
+#: ../../mod/connedit.php:422
+msgid ""
+"When receiving a channel introduction, any permissions provided here will be "
+"applied to the new connection automatically and the introduction approved. "
+"Leave this page if you do not wish to use this feature."
msgstr ""
-#: ../../mod/display.php:135
-msgid "Item has been removed."
+#: ../../mod/connedit.php:424
+msgid "Slide to adjust your degree of friendship"
msgstr ""
-#: ../../mod/apps.php:4
-msgid "Applications"
+#: ../../mod/connedit.php:430
+msgid "inherited"
msgstr ""
-#: ../../mod/apps.php:7
-msgid "No installed applications."
+#: ../../mod/connedit.php:432
+msgid "Connection has no individual permissions!"
msgstr ""
-#: ../../mod/search.php:83 ../../include/text.php:649
-#: ../../include/text.php:650 ../../include/nav.php:91
-msgid "Search"
+#: ../../mod/connedit.php:433
+msgid ""
+"This may be appropriate based on your <a href=\"settings\">privacy settings</"
+"a>, though you may wish to review the \"Advanced Permissions\"."
msgstr ""
-#: ../../mod/profiles.php:21 ../../mod/profiles.php:410
-#: ../../mod/profiles.php:524 ../../mod/dfrn_confirm.php:62
-msgid "Profile not found."
+#: ../../mod/connedit.php:435
+msgid "Profile Visibility"
msgstr ""
-#: ../../mod/profiles.php:31
-msgid "Profile Name is required."
+#: ../../mod/connedit.php:436
+#, php-format
+msgid ""
+"Please choose the profile you would like to display to %s when viewing your "
+"profile securely."
msgstr ""
-#: ../../mod/profiles.php:155
-msgid "Marital Status"
+#: ../../mod/connedit.php:437
+msgid "Contact Information / Notes"
msgstr ""
-#: ../../mod/profiles.php:159
-msgid "Romantic Partner"
+#: ../../mod/connedit.php:438
+msgid "Edit contact notes"
msgstr ""
-#: ../../mod/profiles.php:163
-msgid "Likes"
+#: ../../mod/connedit.php:440
+msgid "Their Settings"
msgstr ""
-#: ../../mod/profiles.php:167
-msgid "Dislikes"
+#: ../../mod/connedit.php:441
+msgid "My Settings"
msgstr ""
-#: ../../mod/profiles.php:171
-msgid "Work/Employment"
+#: ../../mod/connedit.php:443
+msgid "Forum Members"
msgstr ""
-#: ../../mod/profiles.php:174
-msgid "Religion"
+#: ../../mod/connedit.php:444
+msgid "Soapbox"
msgstr ""
-#: ../../mod/profiles.php:178
-msgid "Political Views"
+#: ../../mod/connedit.php:445
+msgid "Full Sharing"
msgstr ""
-#: ../../mod/profiles.php:182
-msgid "Gender"
+#: ../../mod/connedit.php:446
+msgid "Cautious Sharing"
msgstr ""
-#: ../../mod/profiles.php:186
-msgid "Sexual Preference"
+#: ../../mod/connedit.php:447
+msgid "Follow Only"
msgstr ""
-#: ../../mod/profiles.php:190
-msgid "Homepage"
+#: ../../mod/connedit.php:448
+msgid "Individual Permissions"
msgstr ""
-#: ../../mod/profiles.php:194
-msgid "Interests"
-msgstr ""
-
-#: ../../mod/profiles.php:198
-msgid "Address"
-msgstr ""
-
-#: ../../mod/profiles.php:205 ../../addon/dav/layout.fnk.php:310
-msgid "Location"
-msgstr ""
-
-#: ../../mod/profiles.php:288
-msgid "Profile updated."
+#: ../../mod/connedit.php:449
+msgid ""
+"Some permissions may be inherited from your channel <a href=\"settings"
+"\">privacy settings</a>, which have higher priority. Changing those "
+"inherited settings on this page will have no effect."
msgstr ""
-#: ../../mod/profiles.php:355
-msgid " and "
+#: ../../mod/connedit.php:450
+msgid "Advanced Permissions"
msgstr ""
-#: ../../mod/profiles.php:363
-msgid "public profile"
+#: ../../mod/connedit.php:451
+msgid "Quick Links"
msgstr ""
-#: ../../mod/profiles.php:366
+#: ../../mod/connedit.php:455
#, php-format
-msgid "%1$s changed %2$s to &ldquo;%3$s&rdquo;"
+msgid "Visit %s's profile - %s"
msgstr ""
-#: ../../mod/profiles.php:367
-#, php-format
-msgid " - Visit %1$s's %2$s"
+#: ../../mod/connedit.php:456
+msgid "Block/Unblock contact"
msgstr ""
-#: ../../mod/profiles.php:370
-#, php-format
-msgid "%1$s has an updated %2$s, changing %3$s."
+#: ../../mod/connedit.php:457
+msgid "Ignore contact"
msgstr ""
-#: ../../mod/profiles.php:429
-msgid "Profile deleted."
+#: ../../mod/connedit.php:458
+msgid "Repair URL settings"
msgstr ""
-#: ../../mod/profiles.php:447 ../../mod/profiles.php:481
-msgid "Profile-"
+#: ../../mod/connedit.php:459
+msgid "View conversations"
msgstr ""
-#: ../../mod/profiles.php:466 ../../mod/profiles.php:508
-msgid "New profile created."
+#: ../../mod/connedit.php:461
+msgid "Delete contact"
msgstr ""
-#: ../../mod/profiles.php:487
-msgid "Profile unavailable to clone."
+#: ../../mod/connedit.php:464
+msgid "Last update:"
msgstr ""
-#: ../../mod/profiles.php:545
-msgid "Hide your contact/friend list from viewers of this profile?"
+#: ../../mod/connedit.php:466
+msgid "Update public posts"
msgstr ""
-#: ../../mod/profiles.php:568
-msgid "Edit Profile Details"
+#: ../../mod/connedit.php:468
+msgid "Update now"
msgstr ""
-#: ../../mod/profiles.php:570
-msgid "View this profile"
+#: ../../mod/connedit.php:474
+msgid "Currently blocked"
msgstr ""
-#: ../../mod/profiles.php:571
-msgid "Create a new profile using these settings"
+#: ../../mod/connedit.php:475
+msgid "Currently ignored"
msgstr ""
-#: ../../mod/profiles.php:572
-msgid "Clone this profile"
+#: ../../mod/connedit.php:476
+msgid "Currently archived"
msgstr ""
-#: ../../mod/profiles.php:573
-msgid "Delete this profile"
+#: ../../mod/connedit.php:477
+msgid "Currently pending"
msgstr ""
-#: ../../mod/profiles.php:574
-msgid "Profile Name:"
+#: ../../mod/connedit.php:478
+msgid "Hide this contact from others"
msgstr ""
-#: ../../mod/profiles.php:575
-msgid "Your Full Name:"
+#: ../../mod/connedit.php:478
+msgid ""
+"Replies/likes to your public posts <strong>may</strong> still be visible"
msgstr ""
-#: ../../mod/profiles.php:576
-msgid "Title/Description:"
+#: ../../mod/webpages.php:121 ../../mod/layouts.php:105
+#: ../../mod/blocks.php:96
+msgid "View"
msgstr ""
-#: ../../mod/profiles.php:577
-msgid "Your Gender:"
+#: ../../mod/api.php:76 ../../mod/api.php:102
+msgid "Authorize application connection"
msgstr ""
-#: ../../mod/profiles.php:578
-#, php-format
-msgid "Birthday (%s):"
+#: ../../mod/api.php:77
+msgid "Return to your app and insert this Securty Code:"
msgstr ""
-#: ../../mod/profiles.php:579
-msgid "Street Address:"
+#: ../../mod/api.php:89
+msgid "Please login to continue."
msgstr ""
-#: ../../mod/profiles.php:580
-msgid "Locality/City:"
+#: ../../mod/api.php:104
+msgid ""
+"Do you want to authorize this application to access your posts and contacts, "
+"and/or create new posts for you?"
msgstr ""
-#: ../../mod/profiles.php:581
-msgid "Postal/Zip Code:"
+#: ../../mod/api.php:105 ../../mod/profiles.php:495 ../../mod/settings.php:865
+#: ../../mod/settings.php:870
+msgid "Yes"
msgstr ""
-#: ../../mod/profiles.php:582
-msgid "Country:"
+#: ../../mod/api.php:106 ../../mod/profiles.php:496 ../../mod/settings.php:865
+#: ../../mod/settings.php:870
+msgid "No"
msgstr ""
-#: ../../mod/profiles.php:583
-msgid "Region/State:"
+#: ../../mod/apps.php:8
+msgid "No installed applications."
msgstr ""
-#: ../../mod/profiles.php:584
-msgid "<span class=\"heart\">&hearts;</span> Marital Status:"
+#: ../../mod/apps.php:13
+msgid "Applications"
msgstr ""
-#: ../../mod/profiles.php:585
-msgid "Who: (if applicable)"
+#: ../../mod/page.php:35
+msgid "Invalid item."
msgstr ""
-#: ../../mod/profiles.php:586
-msgid "Examples: cathy123, Cathy Williams, cathy@example.com"
+#: ../../mod/page.php:47 ../../mod/chanview.php:77 ../../mod/home.php:50
+#: ../../mod/wall_upload.php:35
+msgid "Channel not found."
msgstr ""
-#: ../../mod/profiles.php:587
-msgid "Since [date]:"
+#: ../../mod/page.php:83 ../../mod/help.php:71 ../../mod/display.php:100
+#: ../../index.php:227
+msgid "Page not found."
msgstr ""
-#: ../../mod/profiles.php:588 ../../include/profile_advanced.php:46
-msgid "Sexual Preference:"
+#: ../../mod/attach.php:9
+msgid "Item not available."
msgstr ""
-#: ../../mod/profiles.php:589
-msgid "Homepage URL:"
+#: ../../mod/setup.php:161
+msgid "Red Matrix Server - Setup"
msgstr ""
-#: ../../mod/profiles.php:590 ../../include/profile_advanced.php:50
-msgid "Hometown:"
+#: ../../mod/setup.php:167
+msgid "Could not connect to database."
msgstr ""
-#: ../../mod/profiles.php:591 ../../include/profile_advanced.php:54
-msgid "Political Views:"
+#: ../../mod/setup.php:171
+msgid ""
+"Could not connect to specified site URL. Possible SSL certificate or DNS "
+"issue."
msgstr ""
-#: ../../mod/profiles.php:592
-msgid "Religious Views:"
+#: ../../mod/setup.php:176
+msgid "Could not create table."
msgstr ""
-#: ../../mod/profiles.php:593
-msgid "Public Keywords:"
+#: ../../mod/setup.php:182
+msgid "Your site database has been installed."
msgstr ""
-#: ../../mod/profiles.php:594
-msgid "Private Keywords:"
+#: ../../mod/setup.php:187
+msgid ""
+"You may need to import the file \"install/database.sql\" manually using "
+"phpmyadmin or mysql."
msgstr ""
-#: ../../mod/profiles.php:595 ../../include/profile_advanced.php:62
-msgid "Likes:"
+#: ../../mod/setup.php:188 ../../mod/setup.php:257 ../../mod/setup.php:606
+msgid "Please see the file \"install/INSTALL.txt\"."
msgstr ""
-#: ../../mod/profiles.php:596 ../../include/profile_advanced.php:64
-msgid "Dislikes:"
+#: ../../mod/setup.php:254
+msgid "System check"
msgstr ""
-#: ../../mod/profiles.php:597
-msgid "Example: fishing photography software"
+#: ../../mod/setup.php:259
+msgid "Check again"
msgstr ""
-#: ../../mod/profiles.php:598
-msgid "(Used for suggesting potential friends, can be seen by others)"
+#: ../../mod/setup.php:281
+msgid "Database connection"
msgstr ""
-#: ../../mod/profiles.php:599
-msgid "(Used for searching profiles, never shown to others)"
+#: ../../mod/setup.php:282
+msgid ""
+"In order to install Red Matrix we need to know how to connect to your "
+"database."
msgstr ""
-#: ../../mod/profiles.php:600
-msgid "Tell us about yourself..."
+#: ../../mod/setup.php:283
+msgid ""
+"Please contact your hosting provider or site administrator if you have "
+"questions about these settings."
msgstr ""
-#: ../../mod/profiles.php:601
-msgid "Hobbies/Interests"
+#: ../../mod/setup.php:284
+msgid ""
+"The database you specify below should already exist. If it does not, please "
+"create it before continuing."
msgstr ""
-#: ../../mod/profiles.php:602
-msgid "Contact information and Social Networks"
+#: ../../mod/setup.php:288
+msgid "Database Server Name"
msgstr ""
-#: ../../mod/profiles.php:603
-msgid "Musical interests"
+#: ../../mod/setup.php:288
+msgid "Default is localhost"
msgstr ""
-#: ../../mod/profiles.php:604
-msgid "Books, literature"
+#: ../../mod/setup.php:289
+msgid "Database Port"
msgstr ""
-#: ../../mod/profiles.php:605
-msgid "Television"
+#: ../../mod/setup.php:289
+msgid "Communication port number - use 0 for default"
msgstr ""
-#: ../../mod/profiles.php:606
-msgid "Film/dance/culture/entertainment"
+#: ../../mod/setup.php:290
+msgid "Database Login Name"
msgstr ""
-#: ../../mod/profiles.php:607
-msgid "Love/romance"
+#: ../../mod/setup.php:291
+msgid "Database Login Password"
msgstr ""
-#: ../../mod/profiles.php:608
-msgid "Work/employment"
+#: ../../mod/setup.php:292
+msgid "Database Name"
msgstr ""
-#: ../../mod/profiles.php:609
-msgid "School/education"
+#: ../../mod/setup.php:294 ../../mod/setup.php:336
+msgid "Site administrator email address"
msgstr ""
-#: ../../mod/profiles.php:614
+#: ../../mod/setup.php:294 ../../mod/setup.php:336
msgid ""
-"This is your <strong>public</strong> profile.<br />It <strong>may</strong> "
-"be visible to anybody using the internet."
-msgstr ""
-
-#: ../../mod/profiles.php:624 ../../mod/directory.php:109
-msgid "Age: "
-msgstr ""
-
-#: ../../mod/profiles.php:663
-msgid "Edit/Manage Profiles"
-msgstr ""
-
-#: ../../mod/profiles.php:664 ../../boot.php:1138
-msgid "Change profile photo"
-msgstr ""
-
-#: ../../mod/profiles.php:665 ../../boot.php:1139
-msgid "Create New Profile"
-msgstr ""
-
-#: ../../mod/profiles.php:676 ../../boot.php:1149
-msgid "Profile Image"
+"Your account email address must match this in order to use the web admin "
+"panel."
msgstr ""
-#: ../../mod/profiles.php:678 ../../boot.php:1152
-msgid "visible to everybody"
+#: ../../mod/setup.php:295 ../../mod/setup.php:338
+msgid "Website URL"
msgstr ""
-#: ../../mod/profiles.php:679 ../../boot.php:1153
-msgid "Edit visibility"
+#: ../../mod/setup.php:295 ../../mod/setup.php:338
+msgid "Please use SSL (https) URL if available."
msgstr ""
-#: ../../mod/filer.php:29 ../../include/conversation.php:951
-msgid "Save to Folder:"
+#: ../../mod/setup.php:298 ../../mod/setup.php:341
+msgid "Please select a default timezone for your website"
msgstr ""
-#: ../../mod/filer.php:29
-msgid "- select -"
+#: ../../mod/setup.php:325
+msgid "Site settings"
msgstr ""
-#: ../../mod/tagger.php:103 ../../include/conversation.php:138
-#, php-format
-msgid "%1$s tagged %2$s's %3$s with %4$s"
+#: ../../mod/setup.php:381
+msgid "Could not find a command line version of PHP in the web server PATH."
msgstr ""
-#: ../../mod/delegate.php:95
-msgid "No potential page delegates located."
+#: ../../mod/setup.php:382
+msgid ""
+"If you don't have a command line version of PHP installed on server, you "
+"will not be able to run background polling via cron."
msgstr ""
-#: ../../mod/delegate.php:121
-msgid "Delegate Page Management"
+#: ../../mod/setup.php:386
+msgid "PHP executable path"
msgstr ""
-#: ../../mod/delegate.php:123
+#: ../../mod/setup.php:386
msgid ""
-"Delegates are able to manage all aspects of this account/page except for "
-"basic account settings. Please do not delegate your personal account to "
-"anybody that you do not trust completely."
+"Enter full path to php executable. You can leave this blank to continue the "
+"installation."
msgstr ""
-#: ../../mod/delegate.php:124
-msgid "Existing Page Managers"
+#: ../../mod/setup.php:391
+msgid "Command line PHP"
msgstr ""
-#: ../../mod/delegate.php:126
-msgid "Existing Page Delegates"
+#: ../../mod/setup.php:400
+msgid ""
+"The command line version of PHP on your system does not have "
+"\"register_argc_argv\" enabled."
msgstr ""
-#: ../../mod/delegate.php:128
-msgid "Potential Delegates"
+#: ../../mod/setup.php:401
+msgid "This is required for message delivery to work."
msgstr ""
-#: ../../mod/delegate.php:131
-msgid "Add"
+#: ../../mod/setup.php:403
+msgid "PHP register_argc_argv"
msgstr ""
-#: ../../mod/delegate.php:132
-msgid "No entries."
+#: ../../mod/setup.php:424
+msgid ""
+"Error: the \"openssl_pkey_new\" function on this system is not able to "
+"generate encryption keys"
msgstr ""
-#: ../../mod/babel.php:17
-msgid "Source (bbcode) text:"
+#: ../../mod/setup.php:425
+msgid ""
+"If running under Windows, please see \"http://www.php.net/manual/en/openssl."
+"installation.php\"."
msgstr ""
-#: ../../mod/babel.php:25
-msgid "Source input: "
+#: ../../mod/setup.php:427
+msgid "Generate encryption keys"
msgstr ""
-#: ../../mod/babel.php:29
-msgid "bb2html: "
+#: ../../mod/setup.php:434
+msgid "libCurl PHP module"
msgstr ""
-#: ../../mod/babel.php:33
-msgid "bb2html2bb: "
+#: ../../mod/setup.php:435
+msgid "GD graphics PHP module"
msgstr ""
-#: ../../mod/babel.php:37
-msgid "bb2md: "
+#: ../../mod/setup.php:436
+msgid "OpenSSL PHP module"
msgstr ""
-#: ../../mod/babel.php:41
-msgid "bb2md2html: "
+#: ../../mod/setup.php:437
+msgid "mysqli PHP module"
msgstr ""
-#: ../../mod/babel.php:45
-msgid "bb2dia2bb: "
+#: ../../mod/setup.php:438
+msgid "mb_string PHP module"
msgstr ""
-#: ../../mod/babel.php:49
-msgid "bb2md2html2bb: "
+#: ../../mod/setup.php:439
+msgid "mcrypt PHP module"
msgstr ""
-#: ../../mod/suggest.php:38 ../../view/theme/diabook/theme.php:626
-#: ../../include/contact_widgets.php:34
-msgid "Friend Suggestions"
+#: ../../mod/setup.php:444 ../../mod/setup.php:446
+msgid "Apache mod_rewrite module"
msgstr ""
-#: ../../mod/suggest.php:44
+#: ../../mod/setup.php:444
msgid ""
-"No suggestions available. If this is a new site, please try again in 24 "
-"hours."
-msgstr ""
-
-#: ../../mod/suggest.php:61
-msgid "Ignore/Hide"
-msgstr ""
-
-#: ../../mod/directory.php:47 ../../view/theme/diabook/theme.php:624
-msgid "Global Directory"
-msgstr ""
-
-#: ../../mod/directory.php:55
-msgid "Find on this site"
-msgstr ""
-
-#: ../../mod/directory.php:58
-msgid "Site Directory"
-msgstr ""
-
-#: ../../mod/directory.php:112
-msgid "Gender: "
-msgstr ""
-
-#: ../../mod/directory.php:134 ../../include/profile_advanced.php:17
-#: ../../boot.php:1174
-msgid "Gender:"
+"Error: Apache webserver mod-rewrite module is required but not installed."
msgstr ""
-#: ../../mod/directory.php:136 ../../include/profile_advanced.php:37
-#: ../../boot.php:1177
-msgid "Status:"
+#: ../../mod/setup.php:450 ../../mod/setup.php:453
+msgid "proc_open"
msgstr ""
-#: ../../mod/directory.php:138 ../../include/profile_advanced.php:48
-#: ../../boot.php:1179
-msgid "Homepage:"
+#: ../../mod/setup.php:450
+msgid ""
+"Error: proc_open is required but is either not installed or has been "
+"disabled in php.ini"
msgstr ""
-#: ../../mod/directory.php:140 ../../include/profile_advanced.php:58
-msgid "About:"
+#: ../../mod/setup.php:458
+msgid "Error: libCURL PHP module required but not installed."
msgstr ""
-#: ../../mod/directory.php:178
-msgid "No entries (some entries may be hidden)."
+#: ../../mod/setup.php:462
+msgid ""
+"Error: GD graphics PHP module with JPEG support required but not installed."
msgstr ""
-#: ../../mod/invite.php:35
-#, php-format
-msgid "%s : Not a valid email address."
+#: ../../mod/setup.php:466
+msgid "Error: openssl PHP module required but not installed."
msgstr ""
-#: ../../mod/invite.php:59
-msgid "Please join us on Friendica"
+#: ../../mod/setup.php:470
+msgid "Error: mysqli PHP module required but not installed."
msgstr ""
-#: ../../mod/invite.php:69
-#, php-format
-msgid "%s : Message delivery failed."
+#: ../../mod/setup.php:474
+msgid "Error: mb_string PHP module required but not installed."
msgstr ""
-#: ../../mod/invite.php:73
-#, php-format
-msgid "%d message sent."
-msgid_plural "%d messages sent."
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../../mod/invite.php:92
-msgid "You have no more invitations available"
+#: ../../mod/setup.php:478
+msgid "Error: mcrypt PHP module required but not installed."
msgstr ""
-#: ../../mod/invite.php:100
-#, php-format
+#: ../../mod/setup.php:494
msgid ""
-"Visit %s for a list of public sites that you can join. Friendica members on "
-"other sites can all connect with each other, as well as with members of many "
-"other social networks."
+"The web installer needs to be able to create a file called \".htconfig.php\" "
+"in the top folder of your web server and it is unable to do so."
msgstr ""
-#: ../../mod/invite.php:102
-#, php-format
+#: ../../mod/setup.php:495
msgid ""
-"To accept this invitation, please visit and register at %s or any other "
-"public Friendica website."
+"This is most often a permission setting, as the web server may not be able "
+"to write files in your folder - even if you can."
msgstr ""
-#: ../../mod/invite.php:103
-#, php-format
+#: ../../mod/setup.php:496
msgid ""
-"Friendica sites all inter-connect to create a huge privacy-enhanced social "
-"web that is owned and controlled by its members. They can also connect with "
-"many traditional social networks. See %s for a list of alternate Friendica "
-"sites you can join."
+"At the end of this procedure, we will give you a text to save in a file "
+"named .htconfig.php in your Red top folder."
msgstr ""
-#: ../../mod/invite.php:106
+#: ../../mod/setup.php:497
msgid ""
-"Our apologies. This system is not currently configured to connect with other "
-"public sites or invite members."
-msgstr ""
-
-#: ../../mod/invite.php:111
-msgid "Send invitations"
+"You can alternatively skip this procedure and perform a manual installation. "
+"Please see the file \"install/INSTALL.txt\" for instructions."
msgstr ""
-#: ../../mod/invite.php:112
-msgid "Enter email addresses, one per line:"
+#: ../../mod/setup.php:500
+msgid ".htconfig.php is writable"
msgstr ""
-#: ../../mod/invite.php:114
+#: ../../mod/setup.php:510
msgid ""
-"You are cordially invited to join me and other close friends on Friendica - "
-"and help us to create a better social web."
-msgstr ""
-
-#: ../../mod/invite.php:116
-msgid "You will need to supply this invitation code: $invite_code"
+"Red uses the Smarty3 template engine to render its web views. Smarty3 "
+"compiles templates to PHP to speed up rendering."
msgstr ""
-#: ../../mod/invite.php:116
+#: ../../mod/setup.php:511
msgid ""
-"Once you have registered, please connect with me via my profile page at:"
+"In order to store these compiled templates, the web server needs to have "
+"write access to the directory view/tpl/smarty3/ under the Red top level "
+"folder."
msgstr ""
-#: ../../mod/invite.php:118
+#: ../../mod/setup.php:512 ../../mod/setup.php:530
msgid ""
-"For more information about the Friendica project and why we feel it is "
-"important, please visit http://friendica.com"
+"Please ensure that the user that your web server runs as (e.g. www-data) has "
+"write access to this folder."
msgstr ""
-#: ../../mod/dfrn_confirm.php:119
+#: ../../mod/setup.php:513
msgid ""
-"This may occasionally happen if contact was requested by both persons and it "
-"has already been approved."
+"Note: as a security measure, you should give the web server write access to "
+"view/tpl/smarty3/ only--not the template files (.tpl) that it contains."
msgstr ""
-#: ../../mod/dfrn_confirm.php:237
-msgid "Response from remote site was not understood."
+#: ../../mod/setup.php:516
+msgid "view/tpl/smarty3 is writable"
msgstr ""
-#: ../../mod/dfrn_confirm.php:246
-msgid "Unexpected response from remote site: "
+#: ../../mod/setup.php:529
+msgid ""
+"Red uses the store directory to save uploaded files. The web server needs to "
+"have write access to the store directory under the Red top level folder"
msgstr ""
-#: ../../mod/dfrn_confirm.php:254
-msgid "Confirmation completed successfully."
+#: ../../mod/setup.php:533
+msgid "store is writable"
msgstr ""
-#: ../../mod/dfrn_confirm.php:256 ../../mod/dfrn_confirm.php:270
-#: ../../mod/dfrn_confirm.php:277
-msgid "Remote site reported: "
+#: ../../mod/setup.php:548
+msgid "SSL certificate validation"
msgstr ""
-#: ../../mod/dfrn_confirm.php:268
-msgid "Temporary failure. Please wait and try again."
+#: ../../mod/setup.php:548
+msgid ""
+"SSL certificate cannot be validated. Fix certificate or disable https access "
+"to this site."
msgstr ""
-#: ../../mod/dfrn_confirm.php:275
-msgid "Introduction failed or was revoked."
+#: ../../mod/setup.php:555
+msgid ""
+"Url rewrite in .htaccess is not working. Check your server configuration."
msgstr ""
-#: ../../mod/dfrn_confirm.php:420
-msgid "Unable to set contact photo."
+#: ../../mod/setup.php:557
+msgid "Url rewrite is working"
msgstr ""
-#: ../../mod/dfrn_confirm.php:477 ../../include/diaspora.php:577
-#: ../../include/conversation.php:101
-#, php-format
-msgid "%1$s is now friends with %2$s"
+#: ../../mod/setup.php:567
+msgid ""
+"The database configuration file \".htconfig.php\" could not be written. "
+"Please use the enclosed text to create a configuration file in your web "
+"server root."
msgstr ""
-#: ../../mod/dfrn_confirm.php:562
-#, php-format
-msgid "No user record found for '%s' "
+#: ../../mod/setup.php:591
+msgid "Errors encountered creating database tables."
msgstr ""
-#: ../../mod/dfrn_confirm.php:572
-msgid "Our site encryption key is apparently messed up."
+#: ../../mod/setup.php:604
+msgid "<h1>What next</h1>"
msgstr ""
-#: ../../mod/dfrn_confirm.php:583
-msgid "Empty site URL was provided or URL could not be decrypted by us."
+#: ../../mod/setup.php:605
+msgid ""
+"IMPORTANT: You will need to [manually] setup a scheduled task for the poller."
msgstr ""
-#: ../../mod/dfrn_confirm.php:604
-msgid "Contact record was not found for you on our site."
+#: ../../mod/rpost.php:84 ../../mod/editpost.php:42
+msgid "Edit post"
msgstr ""
-#: ../../mod/dfrn_confirm.php:618
+#: ../../mod/subthread.php:105
#, php-format
-msgid "Site public key not available in contact record for URL %s."
+msgid "%1$s is following %2$s's %3$s"
msgstr ""
-#: ../../mod/dfrn_confirm.php:638
-msgid ""
-"The ID provided by your system is a duplicate on our system. It should work "
-"if you try again."
-msgstr ""
-
-#: ../../mod/dfrn_confirm.php:649
-msgid "Unable to set your contact credentials on our system."
+#: ../../mod/update_network.php:23 ../../mod/update_channel.php:43
+#: ../../mod/update_search.php:46 ../../mod/update_display.php:25
+#: ../../mod/update_community.php:18
+msgid "[Embedded content - reload page to view]"
msgstr ""
-#: ../../mod/dfrn_confirm.php:716
-msgid "Unable to update your contact profile details on our system"
+#: ../../mod/chanview.php:97
+msgid "toggle full screen mode"
msgstr ""
-#: ../../mod/dfrn_confirm.php:750
+#: ../../mod/tagger.php:98
#, php-format
-msgid "Connection accepted at %s"
+msgid "%1$s tagged %2$s's %3$s with %4$s"
msgstr ""
-#: ../../mod/dfrn_confirm.php:799
-#, php-format
-msgid "%1$s has joined %2$s"
+#: ../../mod/viewconnections.php:17 ../../mod/search.php:12
+#: ../../mod/photos.php:573 ../../mod/directory.php:15 ../../mod/display.php:9
+#: ../../mod/community.php:18 ../../mod/dirprofile.php:9
+msgid "Public access denied."
msgstr ""
-#: ../../addon/fromgplus/fromgplus.php:29
-msgid "Google+ Import Settings"
+#: ../../mod/viewconnections.php:43
+msgid "No connections."
msgstr ""
-#: ../../addon/fromgplus/fromgplus.php:32
-msgid "Enable Google+ Import"
+#: ../../mod/viewconnections.php:55
+#, php-format
+msgid "Visit %s's profile [%s]"
msgstr ""
-#: ../../addon/fromgplus/fromgplus.php:35
-msgid "Google Account ID"
+#: ../../mod/viewconnections.php:70
+msgid "View Connnections"
msgstr ""
-#: ../../addon/fromgplus/fromgplus.php:55
-msgid "Google+ Import Settings saved."
+#: ../../mod/tagrm.php:41
+msgid "Tag removed"
msgstr ""
-#: ../../addon/facebook/facebook.php:523
-msgid "Facebook disabled"
+#: ../../mod/tagrm.php:79
+msgid "Remove Item Tag"
msgstr ""
-#: ../../addon/facebook/facebook.php:528
-msgid "Updating contacts"
+#: ../../mod/tagrm.php:81
+msgid "Select a tag to remove: "
msgstr ""
-#: ../../addon/facebook/facebook.php:551
-msgid "Facebook API key is missing."
+#: ../../mod/tagrm.php:93 ../../mod/delegate.php:130
+msgid "Remove"
msgstr ""
-#: ../../addon/facebook/facebook.php:558
-msgid "Facebook Connect"
+#: ../../mod/connect.php:55 ../../mod/connect.php:103
+msgid "Continue"
msgstr ""
-#: ../../addon/facebook/facebook.php:564
-msgid "Install Facebook connector for this account."
+#: ../../mod/connect.php:84
+msgid "Premium Channel Setup"
msgstr ""
-#: ../../addon/facebook/facebook.php:571
-msgid "Remove Facebook connector"
+#: ../../mod/connect.php:86
+msgid "Enable premium channel connection restrictions"
msgstr ""
-#: ../../addon/facebook/facebook.php:576
+#: ../../mod/connect.php:87
msgid ""
-"Re-authenticate [This is necessary whenever your Facebook password is "
-"changed.]"
+"Please enter your restrictions or conditions, such as paypal receipt, usage "
+"guidelines, etc."
msgstr ""
-#: ../../addon/facebook/facebook.php:583
-msgid "Post to Facebook by default"
-msgstr ""
-
-#: ../../addon/facebook/facebook.php:589
+#: ../../mod/connect.php:89 ../../mod/connect.php:109
msgid ""
-"Facebook friend linking has been disabled on this site. The following "
-"settings will have no effect."
+"This channel may require additional steps or acknowledgement of the "
+"following conditions prior to connecting:"
msgstr ""
-#: ../../addon/facebook/facebook.php:593
+#: ../../mod/connect.php:90
msgid ""
-"Facebook friend linking has been disabled on this site. If you disable it, "
-"you will be unable to re-enable it."
-msgstr ""
-
-#: ../../addon/facebook/facebook.php:596
-msgid "Link all your Facebook friends and conversations on this website"
+"Potential connections will then see the following text before proceeding:"
msgstr ""
-#: ../../addon/facebook/facebook.php:598
+#: ../../mod/connect.php:91 ../../mod/connect.php:112
msgid ""
-"Facebook conversations consist of your <em>profile wall</em> and your friend "
-"<em>stream</em>."
+"By continuing, I certify that I have complied with any instructions provided "
+"on this page."
msgstr ""
-#: ../../addon/facebook/facebook.php:599
-msgid "On this website, your Facebook friend stream is only visible to you."
+#: ../../mod/connect.php:100
+msgid "(No specific instructions have been provided by the channel owner.)"
msgstr ""
-#: ../../addon/facebook/facebook.php:600
-msgid ""
-"The following settings determine the privacy of your Facebook profile wall "
-"on this website."
+#: ../../mod/connect.php:108
+msgid "Restricted or Premium Channel"
msgstr ""
-#: ../../addon/facebook/facebook.php:604
-msgid ""
-"On this website your Facebook profile wall conversations will only be "
-"visible to you"
+#: ../../mod/delegate.php:95
+msgid "No potential page delegates located."
msgstr ""
-#: ../../addon/facebook/facebook.php:609
-msgid "Do not import your Facebook profile wall conversations"
+#: ../../mod/delegate.php:121
+msgid "Delegate Page Management"
msgstr ""
-#: ../../addon/facebook/facebook.php:611
+#: ../../mod/delegate.php:123
msgid ""
-"If you choose to link conversations and leave both of these boxes unchecked, "
-"your Facebook profile wall will be merged with your profile wall on this "
-"website and your privacy settings on this website will be used to determine "
-"who may see the conversations."
-msgstr ""
-
-#: ../../addon/facebook/facebook.php:616
-msgid "Comma separated applications to ignore"
+"Delegates are able to manage all aspects of this account/page except for "
+"basic account settings. Please do not delegate your personal account to "
+"anybody that you do not trust completely."
msgstr ""
-#: ../../addon/facebook/facebook.php:700
-msgid "Problems with Facebook Real-Time Updates"
+#: ../../mod/delegate.php:124
+msgid "Existing Page Managers"
msgstr ""
-#: ../../addon/facebook/facebook.php:729
-msgid "Facebook Connector Settings"
+#: ../../mod/delegate.php:126
+msgid "Existing Page Delegates"
msgstr ""
-#: ../../addon/facebook/facebook.php:744
-msgid "Facebook API Key"
+#: ../../mod/delegate.php:128
+msgid "Potential Delegates"
msgstr ""
-#: ../../addon/facebook/facebook.php:754
-msgid ""
-"Error: it appears that you have specified the App-ID and -Secret in your ."
-"htconfig.php file. As long as they are specified there, they cannot be set "
-"using this form.<br><br>"
+#: ../../mod/delegate.php:131
+msgid "Add"
msgstr ""
-#: ../../addon/facebook/facebook.php:759
-msgid ""
-"Error: the given API Key seems to be incorrect (the application access token "
-"could not be retrieved)."
+#: ../../mod/delegate.php:132
+msgid "No entries."
msgstr ""
-#: ../../addon/facebook/facebook.php:761
-msgid "The given API Key seems to work correctly."
+#: ../../mod/sources.php:28
+msgid "Failed to create source. No channel selected."
msgstr ""
-#: ../../addon/facebook/facebook.php:763
-msgid ""
-"The correctness of the API Key could not be detected. Something strange's "
-"going on."
+#: ../../mod/sources.php:41
+msgid "Source created."
msgstr ""
-#: ../../addon/facebook/facebook.php:766
-msgid "App-ID / API-Key"
+#: ../../mod/sources.php:53
+msgid "Source updated."
msgstr ""
-#: ../../addon/facebook/facebook.php:767
-msgid "Application secret"
+#: ../../mod/sources.php:82
+msgid "Manage remote sources of content for your channel."
msgstr ""
-#: ../../addon/facebook/facebook.php:768
-#, php-format
-msgid "Polling Interval in minutes (minimum %1$s minutes)"
+#: ../../mod/sources.php:83 ../../mod/sources.php:93
+msgid "New Source"
msgstr ""
-#: ../../addon/facebook/facebook.php:769
+#: ../../mod/sources.php:94 ../../mod/sources.php:126
msgid ""
-"Synchronize comments (no comments on Facebook are missed, at the cost of "
-"increased system load)"
+"Import all or selected content from the following channel into this channel "
+"and distribute it according to your channel settings."
msgstr ""
-#: ../../addon/facebook/facebook.php:773
-msgid "Real-Time Updates"
+#: ../../mod/sources.php:95 ../../mod/sources.php:127
+msgid "Only import content with these words (one per line)"
msgstr ""
-#: ../../addon/facebook/facebook.php:777
-msgid "Real-Time Updates are activated."
+#: ../../mod/sources.php:95 ../../mod/sources.php:127
+msgid "Leave blank to import all public content"
msgstr ""
-#: ../../addon/facebook/facebook.php:778
-msgid "Deactivate Real-Time Updates"
+#: ../../mod/sources.php:96 ../../mod/sources.php:130
+#: ../../mod/new_channel.php:110
+msgid "Channel Name"
msgstr ""
-#: ../../addon/facebook/facebook.php:780
-msgid "Real-Time Updates not activated."
+#: ../../mod/sources.php:116 ../../mod/sources.php:143
+msgid "Source not found."
msgstr ""
-#: ../../addon/facebook/facebook.php:780
-msgid "Activate Real-Time Updates"
+#: ../../mod/sources.php:123
+msgid "Edit Source"
msgstr ""
-#: ../../addon/facebook/facebook.php:799 ../../addon/dav/layout.fnk.php:360
-msgid "The new values have been saved."
+#: ../../mod/sources.php:124
+msgid "Delete Source"
msgstr ""
-#: ../../addon/facebook/facebook.php:823
-msgid "Post to Facebook"
+#: ../../mod/sources.php:151
+msgid "Source removed"
msgstr ""
-#: ../../addon/facebook/facebook.php:921
-msgid ""
-"Post to Facebook cancelled because of multi-network access permission "
-"conflict."
+#: ../../mod/sources.php:153
+msgid "Unable to remove source."
msgstr ""
-#: ../../addon/facebook/facebook.php:1141
-msgid "View on Friendica"
+#: ../../mod/admin.php:48
+msgid "Theme settings updated."
msgstr ""
-#: ../../addon/facebook/facebook.php:1174
-msgid "Facebook post failed. Queued for retry."
+#: ../../mod/admin.php:87 ../../mod/admin.php:419
+msgid "Site"
msgstr ""
-#: ../../addon/facebook/facebook.php:1214
-msgid "Your Facebook connection became invalid. Please Re-authenticate."
+#: ../../mod/admin.php:88 ../../mod/admin.php:685 ../../mod/admin.php:697
+msgid "Users"
msgstr ""
-#: ../../addon/facebook/facebook.php:1215
-msgid "Facebook connection became invalid"
+#: ../../mod/admin.php:89 ../../mod/admin.php:783 ../../mod/admin.php:825
+msgid "Plugins"
msgstr ""
-#: ../../addon/facebook/facebook.php:1216
-#, php-format
-msgid ""
-"Hi %1$s,\n"
-"\n"
-"The connection between your accounts on %2$s and Facebook became invalid. "
-"This usually happens after you change your Facebook-password. To enable the "
-"connection again, you have to %3$sre-authenticate the Facebook-connector%4$s."
+#: ../../mod/admin.php:90 ../../mod/admin.php:988 ../../mod/admin.php:1024
+msgid "Themes"
msgstr ""
-#: ../../addon/snautofollow/snautofollow.php:32
-msgid "StatusNet AutoFollow settings updated."
+#: ../../mod/admin.php:91 ../../mod/admin.php:478
+msgid "Server"
msgstr ""
-#: ../../addon/snautofollow/snautofollow.php:56
-msgid "StatusNet AutoFollow Settings"
+#: ../../mod/admin.php:92
+msgid "DB updates"
msgstr ""
-#: ../../addon/snautofollow/snautofollow.php:58
-msgid "Automatically follow any StatusNet followers/mentioners"
+#: ../../mod/admin.php:106 ../../mod/admin.php:113 ../../mod/admin.php:1111
+msgid "Logs"
msgstr ""
-#: ../../addon/privacy_image_cache/privacy_image_cache.php:184
-msgid "Lifetime of the cache (in hours)"
+#: ../../mod/admin.php:112
+msgid "Plugin Features"
msgstr ""
-#: ../../addon/privacy_image_cache/privacy_image_cache.php:189
-msgid "Cache Statistics"
+#: ../../mod/admin.php:114
+msgid "User registrations waiting for confirmation"
msgstr ""
-#: ../../addon/privacy_image_cache/privacy_image_cache.php:192
-msgid "Number of items"
+#: ../../mod/admin.php:188
+msgid "Message queues"
msgstr ""
-#: ../../addon/privacy_image_cache/privacy_image_cache.php:194
-msgid "Size of the cache"
+#: ../../mod/admin.php:193 ../../mod/admin.php:418 ../../mod/admin.php:477
+#: ../../mod/admin.php:684 ../../mod/admin.php:782 ../../mod/admin.php:824
+#: ../../mod/admin.php:987 ../../mod/admin.php:1023 ../../mod/admin.php:1110
+msgid "Administration"
msgstr ""
-#: ../../addon/privacy_image_cache/privacy_image_cache.php:196
-msgid "Delete the whole cache"
+#: ../../mod/admin.php:194
+msgid "Summary"
msgstr ""
-#: ../../addon/widgets/widget_like.php:58
-#, php-format
-msgid "%d person likes this"
-msgid_plural "%d people like this"
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../../addon/widgets/widget_like.php:61
-#, php-format
-msgid "%d person doesn't like this"
-msgid_plural "%d people don't like this"
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../../addon/widgets/widget_friendheader.php:40
-msgid "Get added to this list!"
+#: ../../mod/admin.php:196
+msgid "Registered users"
msgstr ""
-#: ../../addon/widgets/widgets.php:56
-msgid "Generate new key"
+#: ../../mod/admin.php:198 ../../mod/admin.php:481
+msgid "Pending registrations"
msgstr ""
-#: ../../addon/widgets/widgets.php:59
-msgid "Widgets key"
+#: ../../mod/admin.php:199
+msgid "Version"
msgstr ""
-#: ../../addon/widgets/widgets.php:61
-msgid "Widgets available"
+#: ../../mod/admin.php:201 ../../mod/admin.php:482
+msgid "Active plugins"
msgstr ""
-#: ../../addon/widgets/widget_friends.php:40
-msgid "Connect on Friendica!"
+#: ../../mod/admin.php:342
+msgid "Site settings updated."
msgstr ""
-#: ../../addon/yourls/yourls.php:55
-msgid "YourLS Settings"
+#: ../../mod/admin.php:371 ../../mod/settings.php:700
+msgid "No special theme for mobile devices"
msgstr ""
-#: ../../addon/yourls/yourls.php:57
-msgid "URL: http://"
+#: ../../mod/admin.php:373
+msgid "No special theme for accessibility"
msgstr ""
-#: ../../addon/yourls/yourls.php:62
-msgid "Username:"
+#: ../../mod/admin.php:398
+msgid "Closed"
msgstr ""
-#: ../../addon/yourls/yourls.php:67
-msgid "Password:"
+#: ../../mod/admin.php:399
+msgid "Requires approval"
msgstr ""
-#: ../../addon/yourls/yourls.php:72
-msgid "Use SSL "
+#: ../../mod/admin.php:400
+msgid "Open"
msgstr ""
-#: ../../addon/yourls/yourls.php:92
-msgid "yourls Settings saved."
+#: ../../mod/admin.php:405
+msgid "Private"
msgstr ""
-#: ../../addon/ljpost/ljpost.php:39
-msgid "Post to LiveJournal"
+#: ../../mod/admin.php:406
+msgid "Paid Access"
msgstr ""
-#: ../../addon/ljpost/ljpost.php:70
-msgid "LiveJournal Post Settings"
+#: ../../mod/admin.php:407
+msgid "Free Access"
msgstr ""
-#: ../../addon/ljpost/ljpost.php:72
-msgid "Enable LiveJournal Post Plugin"
+#: ../../mod/admin.php:408
+msgid "Tiered Access"
msgstr ""
-#: ../../addon/ljpost/ljpost.php:77
-msgid "LiveJournal username"
+#: ../../mod/admin.php:421 ../../mod/register.php:189
+msgid "Registration"
msgstr ""
-#: ../../addon/ljpost/ljpost.php:82
-msgid "LiveJournal password"
+#: ../../mod/admin.php:422
+msgid "File upload"
msgstr ""
-#: ../../addon/ljpost/ljpost.php:87
-msgid "Post to LiveJournal by default"
+#: ../../mod/admin.php:423
+msgid "Policies"
msgstr ""
-#: ../../addon/nsfw/nsfw.php:47
-msgid "Not Safe For Work (General Purpose Content Filter) settings"
+#: ../../mod/admin.php:424
+msgid "Advanced"
msgstr ""
-#: ../../addon/nsfw/nsfw.php:49
-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."
+#: ../../mod/admin.php:428
+msgid "Site name"
msgstr ""
-#: ../../addon/nsfw/nsfw.php:50
-msgid "Enable Content filter"
+#: ../../mod/admin.php:429
+msgid "Banner/Logo"
msgstr ""
-#: ../../addon/nsfw/nsfw.php:53
-msgid "Comma separated list of keywords to hide"
+#: ../../mod/admin.php:430
+msgid "System language"
msgstr ""
-#: ../../addon/nsfw/nsfw.php:58
-msgid "Use /expression/ to provide regular expressions"
+#: ../../mod/admin.php:431
+msgid "System theme"
msgstr ""
-#: ../../addon/nsfw/nsfw.php:74
-msgid "NSFW Settings saved."
+#: ../../mod/admin.php:431
+msgid ""
+"Default system theme - may be over-ridden by user profiles - <a href='#' "
+"id='cnftheme'>change theme settings</a>"
msgstr ""
-#: ../../addon/nsfw/nsfw.php:121
-#, php-format
-msgid "%s - Click to open/close"
+#: ../../mod/admin.php:432
+msgid "Mobile system theme"
msgstr ""
-#: ../../addon/page/page.php:61 ../../addon/page/page.php:91
-msgid "Forums"
+#: ../../mod/admin.php:432
+msgid "Theme for mobile devices"
msgstr ""
-#: ../../addon/page/page.php:129
-msgid "Forums:"
+#: ../../mod/admin.php:433
+msgid "Accessibility system theme"
msgstr ""
-#: ../../addon/page/page.php:165
-msgid "Page settings updated."
+#: ../../mod/admin.php:433
+msgid "Accessibility theme"
msgstr ""
-#: ../../addon/page/page.php:194
-msgid "Page Settings"
+#: ../../mod/admin.php:434
+msgid "Channel to use for this website's static pages"
msgstr ""
-#: ../../addon/page/page.php:196
-msgid "How many forums to display on sidebar without paging"
+#: ../../mod/admin.php:434
+msgid "Site Channel"
msgstr ""
-#: ../../addon/page/page.php:199
-msgid "Randomise Page/Forum list"
+#: ../../mod/admin.php:436
+msgid "Maximum image size"
msgstr ""
-#: ../../addon/page/page.php:202
-msgid "Show pages/forums on profile page"
+#: ../../mod/admin.php:436
+msgid ""
+"Maximum size in bytes of uploaded images. Default is 0, which means no "
+"limits."
msgstr ""
-#: ../../addon/planets/planets.php:150
-msgid "Planets Settings"
+#: ../../mod/admin.php:437
+msgid "Register policy"
msgstr ""
-#: ../../addon/planets/planets.php:152
-msgid "Enable Planets Plugin"
+#: ../../mod/admin.php:438
+msgid "Access policy"
msgstr ""
-#: ../../addon/communityhome/communityhome.php:28
-#: ../../addon/communityhome/communityhome.php:34
-#: ../../addon/communityhome/twillingham/communityhome.php:28
-#: ../../addon/communityhome/twillingham/communityhome.php:34
-#: ../../include/nav.php:64 ../../boot.php:885
-msgid "Login"
+#: ../../mod/admin.php:439
+msgid "Register text"
msgstr ""
-#: ../../addon/communityhome/communityhome.php:29
-#: ../../addon/communityhome/twillingham/communityhome.php:29
-msgid "OpenID"
+#: ../../mod/admin.php:439
+msgid "Will be displayed prominently on the registration page."
msgstr ""
-#: ../../addon/communityhome/communityhome.php:38
-#: ../../addon/communityhome/twillingham/communityhome.php:38
-msgid "Latest users"
+#: ../../mod/admin.php:440
+msgid "Accounts abandoned after x days"
msgstr ""
-#: ../../addon/communityhome/communityhome.php:81
-#: ../../addon/communityhome/twillingham/communityhome.php:81
-msgid "Most active users"
+#: ../../mod/admin.php:440
+msgid ""
+"Will not waste system resources polling external sites for abandonded "
+"accounts. Enter 0 for no time limit."
msgstr ""
-#: ../../addon/communityhome/communityhome.php:98
-msgid "Latest photos"
+#: ../../mod/admin.php:441
+msgid "Allowed friend domains"
msgstr ""
-#: ../../addon/communityhome/communityhome.php:133
-msgid "Latest likes"
+#: ../../mod/admin.php:441
+msgid ""
+"Comma separated list of domains which are allowed to establish friendships "
+"with this site. Wildcards are accepted. Empty to allow any domains"
msgstr ""
-#: ../../addon/communityhome/communityhome.php:155
-#: ../../view/theme/diabook/theme.php:562 ../../include/text.php:1319
-#: ../../include/conversation.php:45 ../../include/conversation.php:118
-msgid "event"
+#: ../../mod/admin.php:442
+msgid "Allowed email domains"
msgstr ""
-#: ../../addon/dav/common/wdcal_configuration.php:126
-msgid "U.S. Time Format (mm/dd/YYYY)"
+#: ../../mod/admin.php:442
+msgid ""
+"Comma separated list of domains which are allowed in email addresses for "
+"registrations to this site. Wildcards are accepted. Empty to allow any "
+"domains"
msgstr ""
-#: ../../addon/dav/common/wdcal_configuration.php:205
-msgid "German Time Format (dd.mm.YYYY)"
+#: ../../mod/admin.php:443
+msgid "Block public"
msgstr ""
-#: ../../addon/dav/common/calendar.fnk.php:517
-#: ../../addon/dav/common/calendar.fnk.php:533
-#: ../../addon/dav/layout.fnk.php:200
-msgid "Error"
+#: ../../mod/admin.php:443
+msgid ""
+"Check to block public access to all otherwise public personal pages on this "
+"site unless you are currently logged in."
msgstr ""
-#: ../../addon/dav/common/calendar.fnk.php:568
-#: ../../addon/dav/common/calendar.fnk.php:637
-#: ../../addon/dav/common/calendar.fnk.php:664
-#: ../../addon/dav/layout.fnk.php:231
-msgid "No access"
+#: ../../mod/admin.php:444
+msgid "Force publish"
msgstr ""
-#: ../../addon/dav/layout.fnk.php:119
-msgid "New event"
+#: ../../mod/admin.php:444
+msgid ""
+"Check to force all profiles on this site to be listed in the site directory."
msgstr ""
-#: ../../addon/dav/layout.fnk.php:123
-msgid "Today"
+#: ../../mod/admin.php:445
+msgid "No login on Homepage"
msgstr ""
-#: ../../addon/dav/layout.fnk.php:132
-msgid "Day"
+#: ../../mod/admin.php:445
+msgid ""
+"Check to hide the login form from your sites homepage when visitors arrive "
+"who are not logged in (e.g. when you put the content of the homepage in via "
+"the site channel)."
msgstr ""
-#: ../../addon/dav/layout.fnk.php:139
-msgid "Week"
+#: ../../mod/admin.php:447
+msgid "Proxy user"
msgstr ""
-#: ../../addon/dav/layout.fnk.php:146
-msgid "Month"
+#: ../../mod/admin.php:448
+msgid "Proxy URL"
msgstr ""
-#: ../../addon/dav/layout.fnk.php:151
-msgid "Reload"
+#: ../../mod/admin.php:449
+msgid "Network timeout"
msgstr ""
-#: ../../addon/dav/layout.fnk.php:162
-msgid "Date"
+#: ../../mod/admin.php:449
+msgid "Value is in seconds. Set to 0 for unlimited (not recommended)."
msgstr ""
-#: ../../addon/dav/layout.fnk.php:224
-msgid "Not found"
+#: ../../mod/admin.php:450
+msgid "Delivery interval"
msgstr ""
-#: ../../addon/dav/layout.fnk.php:292 ../../addon/dav/layout.fnk.php:365
-msgid "Go back to the calendar"
+#: ../../mod/admin.php:450
+msgid ""
+"Delay background delivery processes by this many seconds to reduce system "
+"load. Recommend: 4-5 for shared hosts, 2-3 for virtual private servers. 0-1 "
+"for large dedicated servers."
msgstr ""
-#: ../../addon/dav/layout.fnk.php:300
-msgid "Starts"
+#: ../../mod/admin.php:451
+msgid "Poll interval"
msgstr ""
-#: ../../addon/dav/layout.fnk.php:305
-msgid "Ends"
+#: ../../mod/admin.php:451
+msgid ""
+"Delay background polling processes by this many seconds to reduce system "
+"load. If 0, use delivery interval."
msgstr ""
-#: ../../addon/dav/layout.fnk.php:312
-msgid "Description"
+#: ../../mod/admin.php:452
+msgid "Maximum Load Average"
msgstr ""
-#: ../../addon/dav/layout.fnk.php:315
-msgid "Notification"
+#: ../../mod/admin.php:452
+msgid ""
+"Maximum system load before delivery and poll processes are deferred - "
+"default 50."
msgstr ""
-#: ../../addon/dav/layout.fnk.php:324
-msgid "Minutes"
+#: ../../mod/admin.php:469
+msgid "No server found"
msgstr ""
-#: ../../addon/dav/layout.fnk.php:327
-msgid "Hours"
+#: ../../mod/admin.php:476 ../../mod/admin.php:698
+msgid "ID"
msgstr ""
-#: ../../addon/dav/layout.fnk.php:330
-msgid "Days"
+#: ../../mod/admin.php:476
+msgid "for channel"
msgstr ""
-#: ../../addon/dav/layout.fnk.php:331
-msgid "before"
+#: ../../mod/admin.php:476
+msgid "on server"
msgstr ""
-#: ../../addon/dav/layout.fnk.php:367
-msgid "Calendar Settings"
+#: ../../mod/admin.php:476
+msgid "Status"
msgstr ""
-#: ../../addon/dav/layout.fnk.php:373
-msgid "Date format"
+#: ../../mod/admin.php:496
+msgid "Update has been marked successful"
msgstr ""
-#: ../../addon/dav/layout.fnk.php:382
-msgid "Time zone"
+#: ../../mod/admin.php:506
+#, php-format
+msgid "Executing %s failed. Check system logs."
msgstr ""
-#: ../../addon/dav/layout.fnk.php:387
-msgid "Limitations"
+#: ../../mod/admin.php:509
+#, php-format
+msgid "Update %s was successfully applied."
msgstr ""
-#: ../../addon/dav/layout.fnk.php:391
-msgid "Warning"
+#: ../../mod/admin.php:513
+#, php-format
+msgid "Update %s did not return a status. Unknown if it succeeded."
msgstr ""
-#: ../../addon/dav/layout.fnk.php:395
-msgid "Synchronization (iPhone, Thunderbird Lightning, Android, ...)"
+#: ../../mod/admin.php:516
+#, php-format
+msgid "Update function %s could not be found."
msgstr ""
-#: ../../addon/dav/layout.fnk.php:402
-msgid "Synchronizing this calendar with the iPhone"
+#: ../../mod/admin.php:531
+msgid "No failed updates."
msgstr ""
-#: ../../addon/dav/layout.fnk.php:413
-msgid "Synchronizing your Friendica-Contacts with the iPhone"
+#: ../../mod/admin.php:535
+msgid "Failed Updates"
msgstr ""
-#: ../../addon/dav/dav_carddav_backend_friendica_community.inc.php:37
-msgid "Friendica-Contacts"
+#: ../../mod/admin.php:537
+msgid "Mark success (if update was manually applied)"
msgstr ""
-#: ../../addon/dav/dav_carddav_backend_friendica_community.inc.php:38
-msgid "Your Friendica-Contacts"
+#: ../../mod/admin.php:538
+msgid "Attempt to execute this update step automatically"
msgstr ""
-#: ../../addon/dav/main.php:244
-msgid "Calendar"
-msgstr ""
+#: ../../mod/admin.php:564
+#, php-format
+msgid "%s user blocked/unblocked"
+msgid_plural "%s users blocked/unblocked"
+msgstr[0] ""
+msgstr[1] ""
-#: ../../addon/dav/main.php:247
-msgid "Extended calendar with CalDAV-support"
-msgstr ""
+#: ../../mod/admin.php:571
+#, php-format
+msgid "%s user deleted"
+msgid_plural "%s users deleted"
+msgstr[0] ""
+msgstr[1] ""
-#: ../../addon/dav/main.php:263
-msgid "The database tables have been installed."
+#: ../../mod/admin.php:602
+msgid "Account not found"
msgstr ""
-#: ../../addon/dav/main.php:264
-msgid "An error occurred during the installation."
+#: ../../mod/admin.php:613
+#, php-format
+msgid "User '%s' deleted"
msgstr ""
-#: ../../addon/dav/main.php:280
-msgid "No system-wide settings yet."
+#: ../../mod/admin.php:622
+#, php-format
+msgid "User '%s' unblocked"
msgstr ""
-#: ../../addon/dav/main.php:283
-msgid "Database status"
+#: ../../mod/admin.php:622
+#, php-format
+msgid "User '%s' blocked"
msgstr ""
-#: ../../addon/dav/main.php:286
-msgid "Installed"
+#: ../../mod/admin.php:687
+msgid "select all"
msgstr ""
-#: ../../addon/dav/main.php:289
-msgid "Upgrade needed"
+#: ../../mod/admin.php:688
+msgid "User registrations waiting for confirm"
msgstr ""
-#: ../../addon/dav/main.php:289
-msgid "Upgrade"
+#: ../../mod/admin.php:689
+msgid "Request date"
msgstr ""
-#: ../../addon/dav/main.php:292
-msgid "Not installed"
+#: ../../mod/admin.php:689 ../../mod/settings.php:509
+#: ../../mod/settings.php:535
+msgid "Name"
msgstr ""
-#: ../../addon/dav/main.php:292
-msgid "Install"
+#: ../../mod/admin.php:690
+msgid "No registrations."
msgstr ""
-#: ../../addon/dav/main.php:297
-msgid "Troubleshooting"
+#: ../../mod/admin.php:691
+msgid "Approve"
msgstr ""
-#: ../../addon/dav/main.php:298
-msgid "Manual creation of the database tables:"
+#: ../../mod/admin.php:692
+msgid "Deny"
msgstr ""
-#: ../../addon/dav/main.php:299
-msgid "Show SQL-statements"
+#: ../../mod/admin.php:698
+msgid "Register date"
msgstr ""
-#: ../../addon/dav/calendar.friendica.fnk.php:151
-msgid "Private Calendar"
+#: ../../mod/admin.php:698
+msgid "Last login"
msgstr ""
-#: ../../addon/dav/calendar.friendica.fnk.php:158
-msgid "Friendica Events: Mine"
+#: ../../mod/admin.php:698
+msgid "Expires"
msgstr ""
-#: ../../addon/dav/calendar.friendica.fnk.php:161
-msgid "Friendica Events: Contacts"
+#: ../../mod/admin.php:698
+msgid "Service Class"
msgstr ""
-#: ../../addon/uhremotestorage/uhremotestorage.php:84
-#, php-format
+#: ../../mod/admin.php:700
msgid ""
-"Allow to use your friendica id (%s) to connecto to external unhosted-enabled "
-"storage (like ownCloud). See <a href=\"http://www.w3.org/community/unhosted/"
-"wiki/RemoteStorage#WebFinger\">RemoteStorage WebFinger</a>"
-msgstr ""
-
-#: ../../addon/uhremotestorage/uhremotestorage.php:85
-msgid "Template URL (with {category})"
-msgstr ""
-
-#: ../../addon/uhremotestorage/uhremotestorage.php:86
-msgid "OAuth end-point"
-msgstr ""
-
-#: ../../addon/uhremotestorage/uhremotestorage.php:87
-msgid "Api"
-msgstr ""
-
-#: ../../addon/membersince/membersince.php:18
-msgid "Member since:"
-msgstr ""
-
-#: ../../addon/tictac/tictac.php:20
-msgid "Three Dimensional Tic-Tac-Toe"
-msgstr ""
-
-#: ../../addon/tictac/tictac.php:53
-msgid "3D Tic-Tac-Toe"
+"Selected users will be deleted!\\n\\nEverything these users had posted on "
+"this site will be permanently deleted!\\n\\nAre you sure?"
msgstr ""
-#: ../../addon/tictac/tictac.php:58
-msgid "New game"
+#: ../../mod/admin.php:701
+msgid ""
+"The user {0} will be deleted!\\n\\nEverything this user has posted on this "
+"site will be permanently deleted!\\n\\nAre you sure?"
msgstr ""
-#: ../../addon/tictac/tictac.php:59
-msgid "New game with handicap"
+#: ../../mod/admin.php:742
+#, php-format
+msgid "Plugin %s disabled."
msgstr ""
-#: ../../addon/tictac/tictac.php:60
-msgid ""
-"Three dimensional tic-tac-toe is just like the traditional game except that "
-"it is played on multiple levels simultaneously. "
+#: ../../mod/admin.php:746
+#, php-format
+msgid "Plugin %s enabled."
msgstr ""
-#: ../../addon/tictac/tictac.php:61
-msgid ""
-"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."
+#: ../../mod/admin.php:756 ../../mod/admin.php:958
+msgid "Disable"
msgstr ""
-#: ../../addon/tictac/tictac.php:63
-msgid ""
-"The handicap game disables the center position on the middle level because "
-"the player claiming this square often has an unfair advantage."
+#: ../../mod/admin.php:758 ../../mod/admin.php:960
+msgid "Enable"
msgstr ""
-#: ../../addon/tictac/tictac.php:182
-msgid "You go first..."
+#: ../../mod/admin.php:784 ../../mod/admin.php:989
+msgid "Toggle"
msgstr ""
-#: ../../addon/tictac/tictac.php:187
-msgid "I'm going first this time..."
+#: ../../mod/admin.php:792 ../../mod/admin.php:999
+msgid "Author: "
msgstr ""
-#: ../../addon/tictac/tictac.php:193
-msgid "You won!"
+#: ../../mod/admin.php:793 ../../mod/admin.php:1000
+msgid "Maintainer: "
msgstr ""
-#: ../../addon/tictac/tictac.php:199 ../../addon/tictac/tictac.php:224
-msgid "\"Cat\" game!"
+#: ../../mod/admin.php:922
+msgid "No themes found."
msgstr ""
-#: ../../addon/tictac/tictac.php:222
-msgid "I won!"
+#: ../../mod/admin.php:981
+msgid "Screenshot"
msgstr ""
-#: ../../addon/randplace/randplace.php:169
-msgid "Randplace Settings"
+#: ../../mod/admin.php:1029
+msgid "[Experimental]"
msgstr ""
-#: ../../addon/randplace/randplace.php:171
-msgid "Enable Randplace Plugin"
+#: ../../mod/admin.php:1030
+msgid "[Unsupported]"
msgstr ""
-#: ../../addon/dwpost/dwpost.php:39
-msgid "Post to Dreamwidth"
+#: ../../mod/admin.php:1057
+msgid "Log settings updated."
msgstr ""
-#: ../../addon/dwpost/dwpost.php:70
-msgid "Dreamwidth Post Settings"
+#: ../../mod/admin.php:1113
+msgid "Clear"
msgstr ""
-#: ../../addon/dwpost/dwpost.php:72
-msgid "Enable dreamwidth Post Plugin"
+#: ../../mod/admin.php:1119
+msgid "Debugging"
msgstr ""
-#: ../../addon/dwpost/dwpost.php:77
-msgid "dreamwidth username"
+#: ../../mod/admin.php:1120
+msgid "Log file"
msgstr ""
-#: ../../addon/dwpost/dwpost.php:82
-msgid "dreamwidth password"
+#: ../../mod/admin.php:1120
+msgid ""
+"Must be writable by web server. Relative to your Red top-level directory."
msgstr ""
-#: ../../addon/dwpost/dwpost.php:87
-msgid "Post to dreamwidth by default"
+#: ../../mod/admin.php:1121
+msgid "Log level"
msgstr ""
-#: ../../addon/drpost/drpost.php:35
-msgid "Post to Drupal"
+#: ../../mod/mitem.php:14 ../../mod/menu.php:87
+msgid "Menu not found."
msgstr ""
-#: ../../addon/drpost/drpost.php:72
-msgid "Drupal Post Settings"
+#: ../../mod/mitem.php:47
+msgid "Menu element updated."
msgstr ""
-#: ../../addon/drpost/drpost.php:74
-msgid "Enable Drupal Post Plugin"
+#: ../../mod/mitem.php:51
+msgid "Unable to update menu element."
msgstr ""
-#: ../../addon/drpost/drpost.php:79
-msgid "Drupal username"
+#: ../../mod/mitem.php:57
+msgid "Menu element added."
msgstr ""
-#: ../../addon/drpost/drpost.php:84
-msgid "Drupal password"
+#: ../../mod/mitem.php:61
+msgid "Unable to add menu element."
msgstr ""
-#: ../../addon/drpost/drpost.php:89
-msgid "Post Type - article,page,or blog"
+#: ../../mod/mitem.php:78 ../../mod/xchan.php:25 ../../mod/menu.php:113
+#: ../../mod/dirprofile.php:176
+msgid "Not found."
msgstr ""
-#: ../../addon/drpost/drpost.php:94
-msgid "Drupal site URL"
+#: ../../mod/mitem.php:96
+msgid "Manage Menu Elements"
msgstr ""
-#: ../../addon/drpost/drpost.php:99
-msgid "Drupal site uses clean URLS"
+#: ../../mod/mitem.php:99
+msgid "Edit menu"
msgstr ""
-#: ../../addon/drpost/drpost.php:104
-msgid "Post to Drupal by default"
+#: ../../mod/mitem.php:102
+msgid "Edit element"
msgstr ""
-#: ../../addon/drpost/drpost.php:184 ../../addon/wppost/wppost.php:201
-#: ../../addon/blogger/blogger.php:172 ../../addon/posterous/posterous.php:189
-msgid "Post from Friendica"
+#: ../../mod/mitem.php:103
+msgid "Drop element"
msgstr ""
-#: ../../addon/startpage/startpage.php:83
-msgid "Startpage Settings"
+#: ../../mod/mitem.php:104
+msgid "New element"
msgstr ""
-#: ../../addon/startpage/startpage.php:85
-msgid "Home page to load after login - leave blank for profile wall"
+#: ../../mod/mitem.php:105
+msgid "Edit this menu container"
msgstr ""
-#: ../../addon/startpage/startpage.php:88
-msgid "Examples: &quot;network&quot; or &quot;notifications/system&quot;"
+#: ../../mod/mitem.php:106
+msgid "Add menu element"
msgstr ""
-#: ../../addon/geonames/geonames.php:143
-msgid "Geonames settings updated."
+#: ../../mod/mitem.php:107
+msgid "Delete this menu item"
msgstr ""
-#: ../../addon/geonames/geonames.php:179
-msgid "Geonames Settings"
+#: ../../mod/mitem.php:108
+msgid "Edit this menu item"
msgstr ""
-#: ../../addon/geonames/geonames.php:181
-msgid "Enable Geonames Plugin"
+#: ../../mod/mitem.php:131
+msgid "New Menu Element"
msgstr ""
-#: ../../addon/public_server/public_server.php:126
-#: ../../addon/testdrive/testdrive.php:94
-#, php-format
-msgid "Your account on %s will expire in a few days."
+#: ../../mod/mitem.php:133 ../../mod/mitem.php:176
+msgid "Menu Item Permissions"
msgstr ""
-#: ../../addon/public_server/public_server.php:127
-msgid "Your Friendica account is about to expire."
+#: ../../mod/mitem.php:134 ../../mod/mitem.php:177 ../../mod/settings.php:930
+msgid "(click to open/close)"
msgstr ""
-#: ../../addon/public_server/public_server.php:128
-#, php-format
-msgid ""
-"Hi %1$s,\n"
-"\n"
-"Your 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"
+#: ../../mod/mitem.php:136 ../../mod/mitem.php:180
+msgid "Link text"
msgstr ""
-#: ../../addon/js_upload/js_upload.php:43
-msgid "Upload a file"
+#: ../../mod/mitem.php:137 ../../mod/mitem.php:181
+msgid "URL of link"
msgstr ""
-#: ../../addon/js_upload/js_upload.php:44
-msgid "Drop files here to upload"
+#: ../../mod/mitem.php:138 ../../mod/mitem.php:182
+msgid "Use Red magic-auth if available"
msgstr ""
-#: ../../addon/js_upload/js_upload.php:46
-msgid "Failed"
+#: ../../mod/mitem.php:139 ../../mod/mitem.php:183
+msgid "Open link in new window"
msgstr ""
-#: ../../addon/js_upload/js_upload.php:297
-msgid "No files were uploaded."
+#: ../../mod/mitem.php:141 ../../mod/mitem.php:185
+msgid "Order in list"
msgstr ""
-#: ../../addon/js_upload/js_upload.php:303
-msgid "Uploaded file is empty"
+#: ../../mod/mitem.php:141 ../../mod/mitem.php:185
+msgid "Higher numbers will sink to bottom of listing"
msgstr ""
-#: ../../addon/js_upload/js_upload.php:326
-msgid "File has an invalid extension, it should be one of "
+#: ../../mod/mitem.php:142 ../../mod/menu.php:79 ../../mod/new_channel.php:117
+msgid "Create"
msgstr ""
-#: ../../addon/js_upload/js_upload.php:337
-msgid "Upload was cancelled, or server error encountered"
+#: ../../mod/mitem.php:154
+msgid "Menu item not found."
msgstr ""
-#: ../../addon/oembed.old/oembed.php:30
-msgid "OEmbed settings updated"
+#: ../../mod/mitem.php:163
+msgid "Menu item deleted."
msgstr ""
-#: ../../addon/oembed.old/oembed.php:43
-msgid "Use OEmbed for YouTube videos"
+#: ../../mod/mitem.php:165
+msgid "Menu item could not be deleted."
msgstr ""
-#: ../../addon/oembed.old/oembed.php:71
-msgid "URL to embed:"
+#: ../../mod/mitem.php:174
+msgid "Edit Menu Element"
msgstr ""
-#: ../../addon/impressum/impressum.php:36
-msgid "Impressum"
+#: ../../mod/mitem.php:186 ../../mod/menu.php:107
+msgid "Modify"
msgstr ""
-#: ../../addon/impressum/impressum.php:49
-#: ../../addon/impressum/impressum.php:51
-#: ../../addon/impressum/impressum.php:83
-msgid "Site Owner"
+#: ../../mod/group.php:20
+msgid "Collection created."
msgstr ""
-#: ../../addon/impressum/impressum.php:49
-#: ../../addon/impressum/impressum.php:87
-msgid "Email Address"
+#: ../../mod/group.php:26
+msgid "Could not create collection."
msgstr ""
-#: ../../addon/impressum/impressum.php:54
-#: ../../addon/impressum/impressum.php:85
-msgid "Postal Address"
+#: ../../mod/group.php:54
+msgid "Collection updated."
msgstr ""
-#: ../../addon/impressum/impressum.php:60
-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."
+#: ../../mod/group.php:86
+msgid "Create a collection of channels."
msgstr ""
-#: ../../addon/impressum/impressum.php:83
-msgid "The page operators name."
+#: ../../mod/group.php:87 ../../mod/group.php:183
+msgid "Collection Name: "
msgstr ""
-#: ../../addon/impressum/impressum.php:84
-msgid "Site Owners Profile"
+#: ../../mod/group.php:89 ../../mod/group.php:186
+msgid "Members are visible to other channels"
msgstr ""
-#: ../../addon/impressum/impressum.php:84
-msgid "Profile address of the operator."
+#: ../../mod/group.php:107
+msgid "Collection removed."
msgstr ""
-#: ../../addon/impressum/impressum.php:85
-msgid "How to contact the operator via snail mail. You can use BBCode here."
+#: ../../mod/group.php:109
+msgid "Unable to remove collection."
msgstr ""
-#: ../../addon/impressum/impressum.php:86
-msgid "Notes"
+#: ../../mod/group.php:182
+msgid "Collection Editor"
msgstr ""
-#: ../../addon/impressum/impressum.php:86
-msgid ""
-"Additional notes that are displayed beneath the contact information. You can "
-"use BBCode here."
+#: ../../mod/group.php:196
+msgid "Members"
msgstr ""
-#: ../../addon/impressum/impressum.php:87
-msgid "How to contact the operator via email. (will be displayed obfuscated)"
+#: ../../mod/group.php:198
+msgid "All Connected Channels"
msgstr ""
-#: ../../addon/impressum/impressum.php:88
-msgid "Footer note"
+#: ../../mod/group.php:231
+msgid "Click on a channel to add or remove."
msgstr ""
-#: ../../addon/impressum/impressum.php:88
-msgid "Text for the footer. You can use BBCode here."
+#: ../../mod/photos.php:77
+msgid "Page owner information could not be retrieved."
msgstr ""
-#: ../../addon/buglink/buglink.php:15
-msgid "Report Bug"
+#: ../../mod/photos.php:97
+msgid "Album not found."
msgstr ""
-#: ../../addon/notimeline/notimeline.php:32
-msgid "No Timeline settings updated."
+#: ../../mod/photos.php:119 ../../mod/photos.php:799
+msgid "Delete Album"
msgstr ""
-#: ../../addon/notimeline/notimeline.php:56
-msgid "No Timeline Settings"
+#: ../../mod/photos.php:159 ../../mod/photos.php:1061
+msgid "Delete Photo"
msgstr ""
-#: ../../addon/notimeline/notimeline.php:58
-msgid "Disable Archive selector on profile wall"
+#: ../../mod/photos.php:500
+#, php-format
+msgid "%1$s was tagged in %2$s by %3$s"
msgstr ""
-#: ../../addon/blockem/blockem.php:51
-msgid "\"Blockem\" Settings"
+#: ../../mod/photos.php:500
+msgid "a photo"
msgstr ""
-#: ../../addon/blockem/blockem.php:53
-msgid "Comma separated profile URLS to block"
+#: ../../mod/photos.php:583
+msgid "No photos selected"
msgstr ""
-#: ../../addon/blockem/blockem.php:70
-msgid "BLOCKEM Settings saved."
+#: ../../mod/photos.php:630
+msgid "Access to this item is restricted."
msgstr ""
-#: ../../addon/blockem/blockem.php:105
+#: ../../mod/photos.php:704
#, php-format
-msgid "Blocked %s - Click to open/close"
-msgstr ""
-
-#: ../../addon/blockem/blockem.php:160
-msgid "Unblock Author"
+msgid "You have used %1$.2f Mbytes of %2$.2f Mbytes photo storage."
msgstr ""
-#: ../../addon/blockem/blockem.php:162
-msgid "Block Author"
+#: ../../mod/photos.php:707
+#, php-format
+msgid "You have used %1$.2f Mbytes of photo storage."
msgstr ""
-#: ../../addon/blockem/blockem.php:194
-msgid "blockem settings updated"
+#: ../../mod/photos.php:726
+msgid "Upload Photos"
msgstr ""
-#: ../../addon/qcomment/qcomment.php:51
-msgid ":-)"
+#: ../../mod/photos.php:730 ../../mod/photos.php:794
+msgid "New album name: "
msgstr ""
-#: ../../addon/qcomment/qcomment.php:51
-msgid ":-("
+#: ../../mod/photos.php:731
+msgid "or existing album name: "
msgstr ""
-#: ../../addon/qcomment/qcomment.php:51
-msgid "lol"
+#: ../../mod/photos.php:732
+msgid "Do not show a status post for this upload"
msgstr ""
-#: ../../addon/qcomment/qcomment.php:54
-msgid "Quick Comment Settings"
+#: ../../mod/photos.php:734 ../../mod/photos.php:1056
+#: ../../mod/filestorage.php:125
+msgid "Permissions"
msgstr ""
-#: ../../addon/qcomment/qcomment.php:56
-msgid ""
-"Quick comments are found near comment boxes, sometimes hidden. Click them to "
-"provide simple replies."
+#: ../../mod/photos.php:783 ../../mod/photos.php:805 ../../mod/photos.php:1232
+#: ../../mod/photos.php:1247
+msgid "Contact Photos"
msgstr ""
-#: ../../addon/qcomment/qcomment.php:57
-msgid "Enter quick comments, one per line"
+#: ../../mod/photos.php:809
+msgid "Edit Album"
msgstr ""
-#: ../../addon/qcomment/qcomment.php:75
-msgid "Quick Comment settings saved."
+#: ../../mod/photos.php:815
+msgid "Show Newest First"
msgstr ""
-#: ../../addon/openstreetmap/openstreetmap.php:71
-msgid "Tile Server URL"
+#: ../../mod/photos.php:817
+msgid "Show Oldest First"
msgstr ""
-#: ../../addon/openstreetmap/openstreetmap.php:71
-msgid ""
-"A list of <a href=\"http://wiki.openstreetmap.org/wiki/TMS\" target=\"_blank"
-"\">public tile servers</a>"
+#: ../../mod/photos.php:860 ../../mod/photos.php:1279
+msgid "View Photo"
msgstr ""
-#: ../../addon/openstreetmap/openstreetmap.php:72
-msgid "Default zoom"
+#: ../../mod/photos.php:906
+msgid "Permission denied. Access to this item may be restricted."
msgstr ""
-#: ../../addon/openstreetmap/openstreetmap.php:72
-msgid "The default zoom level. (1:world, 18:highest)"
+#: ../../mod/photos.php:908
+msgid "Photo not available"
msgstr ""
-#: ../../addon/libertree/libertree.php:36
-msgid "Post to libertree"
+#: ../../mod/photos.php:966
+msgid "Use as profile photo"
msgstr ""
-#: ../../addon/libertree/libertree.php:67
-msgid "libertree Post Settings"
+#: ../../mod/photos.php:990
+msgid "View Full Size"
msgstr ""
-#: ../../addon/libertree/libertree.php:69
-msgid "Enable Libertree Post Plugin"
+#: ../../mod/photos.php:1044
+msgid "Edit photo"
msgstr ""
-#: ../../addon/libertree/libertree.php:74
-msgid "Libertree API token"
+#: ../../mod/photos.php:1046
+msgid "Rotate CW (right)"
msgstr ""
-#: ../../addon/libertree/libertree.php:79
-msgid "Libertree site URL"
+#: ../../mod/photos.php:1047
+msgid "Rotate CCW (left)"
msgstr ""
-#: ../../addon/libertree/libertree.php:84
-msgid "Post to Libertree by default"
+#: ../../mod/photos.php:1049
+msgid "New album name"
msgstr ""
-#: ../../addon/mathjax/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."
+#: ../../mod/photos.php:1052
+msgid "Caption"
msgstr ""
-#: ../../addon/mathjax/mathjax.php:38
-msgid "Use the MathJax renderer"
+#: ../../mod/photos.php:1054
+msgid "Add a Tag"
msgstr ""
-#: ../../addon/mathjax/mathjax.php:74
-msgid "MathJax Base URL"
+#: ../../mod/photos.php:1058
+msgid "Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"
msgstr ""
-#: ../../addon/mathjax/mathjax.php:74
-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."
+#: ../../mod/photos.php:1285
+msgid "View Album"
msgstr ""
-#: ../../addon/editplain/editplain.php:46
-msgid "Editplain settings updated."
+#: ../../mod/photos.php:1294
+msgid "Recent Photos"
msgstr ""
-#: ../../addon/editplain/editplain.php:76
-msgid "Editplain Settings"
+#: ../../mod/filer.php:35
+msgid "- select -"
msgstr ""
-#: ../../addon/editplain/editplain.php:78
-msgid "Disable richtext status editor"
+#: ../../mod/menu.php:17
+msgid "Menu updated."
msgstr ""
-#: ../../addon/gravatar/gravatar.php:71
-msgid "generic profile image"
+#: ../../mod/menu.php:21
+msgid "Unable to update menu."
msgstr ""
-#: ../../addon/gravatar/gravatar.php:72
-msgid "random geometric pattern"
+#: ../../mod/menu.php:26
+msgid "Menu created."
msgstr ""
-#: ../../addon/gravatar/gravatar.php:73
-msgid "monster face"
+#: ../../mod/menu.php:30
+msgid "Unable to create menu."
msgstr ""
-#: ../../addon/gravatar/gravatar.php:74
-msgid "computer generated face"
+#: ../../mod/menu.php:53
+msgid "Manage Menus"
msgstr ""
-#: ../../addon/gravatar/gravatar.php:75
-msgid "retro arcade style face"
+#: ../../mod/menu.php:56
+msgid "Drop"
msgstr ""
-#: ../../addon/gravatar/gravatar.php:87
-msgid "Default avatar image"
+#: ../../mod/menu.php:58
+msgid "Create a new menu"
msgstr ""
-#: ../../addon/gravatar/gravatar.php:87
-msgid "Select default avatar image if none was found at Gravatar. See README"
+#: ../../mod/menu.php:59
+msgid "Delete this menu"
msgstr ""
-#: ../../addon/gravatar/gravatar.php:88
-msgid "Rating of images"
+#: ../../mod/menu.php:60 ../../mod/menu.php:104
+msgid "Edit menu contents"
msgstr ""
-#: ../../addon/gravatar/gravatar.php:88
-msgid "Select the appropriate avatar rating for your site. See README"
+#: ../../mod/menu.php:61
+msgid "Edit this menu"
msgstr ""
-#: ../../addon/gravatar/gravatar.php:102
-msgid "Gravatar settings updated."
+#: ../../mod/menu.php:76
+msgid "New Menu"
msgstr ""
-#: ../../addon/testdrive/testdrive.php:95
-msgid "Your Friendica test account is about to expire."
+#: ../../mod/menu.php:77 ../../mod/menu.php:105
+msgid "Menu name"
msgstr ""
-#: ../../addon/testdrive/testdrive.php:96
-#, php-format
-msgid ""
-"Hi %1$s,\n"
-"\n"
-"Your 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 http://dir.friendica.com/siteinfo - and for "
-"more information on setting up your own Friendica server please see the "
-"Friendica project website at http://friendica.com."
+#: ../../mod/menu.php:77 ../../mod/menu.php:105
+msgid "Must be unique, only seen by you"
msgstr ""
-#: ../../addon/pageheader/pageheader.php:50
-msgid "\"pageheader\" Settings"
+#: ../../mod/menu.php:78 ../../mod/menu.php:106
+msgid "Menu title"
msgstr ""
-#: ../../addon/pageheader/pageheader.php:68
-msgid "pageheader Settings saved."
+#: ../../mod/menu.php:78 ../../mod/menu.php:106
+msgid "Menu title as seen by others"
msgstr ""
-#: ../../addon/ijpost/ijpost.php:39
-msgid "Post to Insanejournal"
+#: ../../mod/menu.php:93
+msgid "Menu deleted."
msgstr ""
-#: ../../addon/ijpost/ijpost.php:70
-msgid "InsaneJournal Post Settings"
+#: ../../mod/menu.php:95
+msgid "Menu could not be deleted."
msgstr ""
-#: ../../addon/ijpost/ijpost.php:72
-msgid "Enable InsaneJournal Post Plugin"
+#: ../../mod/menu.php:101
+msgid "Edit Menu"
msgstr ""
-#: ../../addon/ijpost/ijpost.php:77
-msgid "InsaneJournal username"
+#: ../../mod/menu.php:103
+msgid "Add or remove entries to this menu"
msgstr ""
-#: ../../addon/ijpost/ijpost.php:82
-msgid "InsaneJournal password"
+#: ../../mod/home.php:89
+#, php-format
+msgid "Welcome to %s"
msgstr ""
-#: ../../addon/ijpost/ijpost.php:87
-msgid "Post to InsaneJournal by default"
+#: ../../mod/directory.php:143 ../../mod/profiles.php:573
+#: ../../mod/dirprofile.php:95
+msgid "Age: "
msgstr ""
-#: ../../addon/viewsrc/viewsrc.php:37
-msgid "View Source"
+#: ../../mod/directory.php:146 ../../mod/dirprofile.php:98
+msgid "Gender: "
msgstr ""
-#: ../../addon/statusnet/statusnet.php:134
-msgid "Post to StatusNet"
+#: ../../mod/directory.php:206
+msgid "Finding:"
msgstr ""
-#: ../../addon/statusnet/statusnet.php:176
-msgid ""
-"Please contact your site administrator.<br />The provided API URL is not "
-"valid."
+#: ../../mod/directory.php:214
+msgid "next page"
msgstr ""
-#: ../../addon/statusnet/statusnet.php:204
-msgid "We could not contact the StatusNet API with the Path you entered."
+#: ../../mod/directory.php:214
+msgid "previous page"
msgstr ""
-#: ../../addon/statusnet/statusnet.php:232
-msgid "StatusNet settings updated."
+#: ../../mod/directory.php:221
+msgid "No entries (some entries may be hidden)."
msgstr ""
-#: ../../addon/statusnet/statusnet.php:257
-msgid "StatusNet Posting Settings"
+#: ../../mod/connections.php:189 ../../mod/connections.php:261
+msgid "Blocked"
msgstr ""
-#: ../../addon/statusnet/statusnet.php:271
-msgid "Globally Available StatusNet OAuthKeys"
+#: ../../mod/connections.php:194 ../../mod/connections.php:268
+msgid "Ignored"
msgstr ""
-#: ../../addon/statusnet/statusnet.php:272
-msgid ""
-"There are preconfigured OAuth key pairs for some StatusNet servers "
-"available. If you are useing one of them, please use these credentials. If "
-"not feel free to connect to any other StatusNet instance (see below)."
+#: ../../mod/connections.php:199 ../../mod/connections.php:282
+msgid "Hidden"
msgstr ""
-#: ../../addon/statusnet/statusnet.php:280
-msgid "Provide your own OAuth Credentials"
+#: ../../mod/connections.php:204 ../../mod/connections.php:275
+msgid "Archived"
msgstr ""
-#: ../../addon/statusnet/statusnet.php:281
-msgid ""
-"No consumer key pair for StatusNet found. Register your Friendica Account as "
-"an desktop client on your StatusNet 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 StatusNet installation."
+#: ../../mod/connections.php:215
+msgid "All"
msgstr ""
-#: ../../addon/statusnet/statusnet.php:283
-msgid "OAuth Consumer Key"
+#: ../../mod/connections.php:239
+msgid "Suggest new connections"
msgstr ""
-#: ../../addon/statusnet/statusnet.php:286
-msgid "OAuth Consumer Secret"
+#: ../../mod/connections.php:245
+msgid "Show pending (new) connections"
msgstr ""
-#: ../../addon/statusnet/statusnet.php:289
-msgid "Base API Path (remember the trailing /)"
+#: ../../mod/connections.php:248
+msgid "All Connections"
msgstr ""
-#: ../../addon/statusnet/statusnet.php:310
-msgid ""
-"To connect to your StatusNet account click the button below to get a "
-"security code from StatusNet which you have to copy into the input box below "
-"and submit the form. Only your <strong>public</strong> posts will be posted "
-"to StatusNet."
+#: ../../mod/connections.php:251
+msgid "Show all connections"
msgstr ""
-#: ../../addon/statusnet/statusnet.php:311
-msgid "Log in with StatusNet"
+#: ../../mod/connections.php:254
+msgid "Unblocked"
msgstr ""
-#: ../../addon/statusnet/statusnet.php:313
-msgid "Copy the security code from StatusNet here"
+#: ../../mod/connections.php:257
+msgid "Only show unblocked connections"
msgstr ""
-#: ../../addon/statusnet/statusnet.php:319
-msgid "Cancel Connection Process"
+#: ../../mod/connections.php:264
+msgid "Only show blocked connections"
msgstr ""
-#: ../../addon/statusnet/statusnet.php:321
-msgid "Current StatusNet API is"
+#: ../../mod/connections.php:271
+msgid "Only show ignored connections"
msgstr ""
-#: ../../addon/statusnet/statusnet.php:322
-msgid "Cancel StatusNet Connection"
+#: ../../mod/connections.php:278
+msgid "Only show archived connections"
msgstr ""
-#: ../../addon/statusnet/statusnet.php:333 ../../addon/twitter/twitter.php:189
-msgid "Currently connected to: "
+#: ../../mod/connections.php:285
+msgid "Only show hidden connections"
msgstr ""
-#: ../../addon/statusnet/statusnet.php:334
-msgid ""
-"If enabled all your <strong>public</strong> postings can be posted to the "
-"associated StatusNet account. You can choose to do so by default (here) or "
-"for every posting separately in the posting options when writing the entry."
+#: ../../mod/connections.php:329
+#, php-format
+msgid "%1$s [%2$s]"
msgstr ""
-#: ../../addon/statusnet/statusnet.php:336
-msgid ""
-"<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 StatusNet will lead the visitor to a blank page "
-"informing the visitor that the access to your profile has been restricted."
+#: ../../mod/connections.php:330
+msgid "Edit contact"
msgstr ""
-#: ../../addon/statusnet/statusnet.php:339
-msgid "Allow posting to StatusNet"
+#: ../../mod/connections.php:353
+msgid "Search your connections"
msgstr ""
-#: ../../addon/statusnet/statusnet.php:342
-msgid "Send public postings to StatusNet by default"
+#: ../../mod/connections.php:354
+msgid "Finding: "
msgstr ""
-#: ../../addon/statusnet/statusnet.php:345
-msgid "Send linked #-tags and @-names to StatusNet"
+#: ../../mod/layouts.php:52
+msgid "Layout Help"
msgstr ""
-#: ../../addon/statusnet/statusnet.php:350 ../../addon/twitter/twitter.php:206
-msgid "Clear OAuth configuration"
+#: ../../mod/layouts.php:55
+msgid "Help with this feature"
msgstr ""
-#: ../../addon/statusnet/statusnet.php:559
-msgid "API URL"
+#: ../../mod/layouts.php:74
+msgid "Layout Name"
msgstr ""
-#: ../../addon/infiniteimprobabilitydrive/infiniteimprobabilitydrive.php:19
-msgid "Infinite Improbability Drive"
+#: ../../mod/help.php:43 ../../mod/help.php:49 ../../mod/help.php:55
+msgid "Help:"
msgstr ""
-#: ../../addon/tumblr/tumblr.php:36
-msgid "Post to Tumblr"
+#: ../../mod/help.php:68 ../../index.php:224
+msgid "Not Found"
msgstr ""
-#: ../../addon/tumblr/tumblr.php:67
-msgid "Tumblr Post Settings"
+#: ../../mod/rmagic.php:56
+msgid "Remote Authentication"
msgstr ""
-#: ../../addon/tumblr/tumblr.php:69
-msgid "Enable Tumblr Post Plugin"
+#: ../../mod/rmagic.php:57
+msgid "Enter your channel address (e.g. channel@example.com)"
msgstr ""
-#: ../../addon/tumblr/tumblr.php:74
-msgid "Tumblr login"
+#: ../../mod/rmagic.php:58
+msgid "Authenticate"
msgstr ""
-#: ../../addon/tumblr/tumblr.php:79
-msgid "Tumblr password"
+#: ../../mod/network.php:79
+msgid "No such group"
msgstr ""
-#: ../../addon/tumblr/tumblr.php:84
-msgid "Post to Tumblr by default"
+#: ../../mod/network.php:118
+msgid "Search Results For:"
msgstr ""
-#: ../../addon/numfriends/numfriends.php:46
-msgid "Numfriends settings updated."
+#: ../../mod/network.php:172
+msgid "Collection is empty"
msgstr ""
-#: ../../addon/numfriends/numfriends.php:77
-msgid "Numfriends Settings"
+#: ../../mod/network.php:180
+msgid "Collection: "
msgstr ""
-#: ../../addon/numfriends/numfriends.php:79
-msgid "How many contacts to display on profile sidebar"
+#: ../../mod/network.php:193
+msgid "Connection: "
msgstr ""
-#: ../../addon/gnot/gnot.php:48
-msgid "Gnot settings updated."
+#: ../../mod/network.php:196
+msgid "Invalid connection."
msgstr ""
-#: ../../addon/gnot/gnot.php:79
-msgid "Gnot Settings"
+#: ../../mod/follow.php:25
+msgid "Channel added."
msgstr ""
-#: ../../addon/gnot/gnot.php:81
+#: ../../mod/post.php:226
msgid ""
-"Allows threading of email comment notifications on Gmail and anonymising the "
-"subject line."
-msgstr ""
-
-#: ../../addon/gnot/gnot.php:82
-msgid "Enable this plugin/addon?"
+"Remote authentication blocked. You are logged into this site locally. Please "
+"logout and retry."
msgstr ""
-#: ../../addon/gnot/gnot.php:97
+#: ../../mod/post.php:256
#, php-format
-msgid "[Friendica:Notify] Comment to conversation #%d"
-msgstr ""
-
-#: ../../addon/wppost/wppost.php:42
-msgid "Post to Wordpress"
-msgstr ""
-
-#: ../../addon/wppost/wppost.php:76
-msgid "WordPress Post Settings"
-msgstr ""
-
-#: ../../addon/wppost/wppost.php:78
-msgid "Enable WordPress Post Plugin"
-msgstr ""
-
-#: ../../addon/wppost/wppost.php:83
-msgid "WordPress username"
+msgid "Welcome %s. Remote authentication successful."
msgstr ""
-#: ../../addon/wppost/wppost.php:88
-msgid "WordPress password"
+#: ../../mod/dirsearch.php:21
+msgid "This site is not a directory server"
msgstr ""
-#: ../../addon/wppost/wppost.php:93
-msgid "WordPress API URL"
+#: ../../mod/lockview.php:34
+msgid "Remote privacy information not available."
msgstr ""
-#: ../../addon/wppost/wppost.php:98
-msgid "Post to WordPress by default"
+#: ../../mod/lockview.php:43
+msgid "Visible to:"
msgstr ""
-#: ../../addon/wppost/wppost.php:103
-msgid "Provide a backlink to the Friendica post"
+#: ../../mod/magic.php:70
+msgid "Hub not found."
msgstr ""
-#: ../../addon/wppost/wppost.php:207
-msgid "Read the original post and comment stream on Friendica"
+#: ../../mod/profiles.php:18 ../../mod/profiles.php:138
+#: ../../mod/profiles.php:168 ../../mod/profiles.php:475
+msgid "Profile not found."
msgstr ""
-#: ../../addon/showmore/showmore.php:38
-msgid "\"Show more\" Settings"
+#: ../../mod/profiles.php:38
+msgid "Profile deleted."
msgstr ""
-#: ../../addon/showmore/showmore.php:41
-msgid "Enable Show More"
+#: ../../mod/profiles.php:56 ../../mod/profiles.php:92
+msgid "Profile-"
msgstr ""
-#: ../../addon/showmore/showmore.php:44
-msgid "Cutting posts after how much characters"
+#: ../../mod/profiles.php:77 ../../mod/profiles.php:120
+msgid "New profile created."
msgstr ""
-#: ../../addon/showmore/showmore.php:65
-msgid "Show More Settings saved."
+#: ../../mod/profiles.php:98
+msgid "Profile unavailable to clone."
msgstr ""
-#: ../../addon/piwik/piwik.php:79
-msgid ""
-"This website is tracked using the <a href='http://www.piwik.org'>Piwik</a> "
-"analytics tool."
+#: ../../mod/profiles.php:178
+msgid "Profile Name is required."
msgstr ""
-#: ../../addon/piwik/piwik.php:82
-#, php-format
-msgid ""
-"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)."
+#: ../../mod/profiles.php:306
+msgid "Marital Status"
msgstr ""
-#: ../../addon/piwik/piwik.php:90
-msgid "Piwik Base URL"
+#: ../../mod/profiles.php:310
+msgid "Romantic Partner"
msgstr ""
-#: ../../addon/piwik/piwik.php:90
-msgid ""
-"Absolute path to your Piwik installation. (without protocol (http/s), with "
-"trailing slash)"
+#: ../../mod/profiles.php:314
+msgid "Likes"
msgstr ""
-#: ../../addon/piwik/piwik.php:91
-msgid "Site ID"
+#: ../../mod/profiles.php:318
+msgid "Dislikes"
msgstr ""
-#: ../../addon/piwik/piwik.php:92
-msgid "Show opt-out cookie link?"
+#: ../../mod/profiles.php:322
+msgid "Work/Employment"
msgstr ""
-#: ../../addon/piwik/piwik.php:93
-msgid "Asynchronous tracking"
+#: ../../mod/profiles.php:325
+msgid "Religion"
msgstr ""
-#: ../../addon/twitter/twitter.php:73
-msgid "Post to Twitter"
+#: ../../mod/profiles.php:329
+msgid "Political Views"
msgstr ""
-#: ../../addon/twitter/twitter.php:122
-msgid "Twitter settings updated."
+#: ../../mod/profiles.php:333
+msgid "Gender"
msgstr ""
-#: ../../addon/twitter/twitter.php:146
-msgid "Twitter Posting Settings"
+#: ../../mod/profiles.php:337
+msgid "Sexual Preference"
msgstr ""
-#: ../../addon/twitter/twitter.php:153
-msgid ""
-"No consumer key pair for Twitter found. Please contact your site "
-"administrator."
+#: ../../mod/profiles.php:341
+msgid "Homepage"
msgstr ""
-#: ../../addon/twitter/twitter.php:172
-msgid ""
-"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."
+#: ../../mod/profiles.php:345
+msgid "Interests"
msgstr ""
-#: ../../addon/twitter/twitter.php:173
-msgid "Log in with Twitter"
+#: ../../mod/profiles.php:349
+msgid "Address"
msgstr ""
-#: ../../addon/twitter/twitter.php:175
-msgid "Copy the PIN from Twitter here"
+#: ../../mod/profiles.php:356 ../../mod/pubsites.php:31
+msgid "Location"
msgstr ""
-#: ../../addon/twitter/twitter.php:190
-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."
+#: ../../mod/profiles.php:439
+msgid "Profile updated."
msgstr ""
-#: ../../addon/twitter/twitter.php:192
-msgid ""
-"<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."
+#: ../../mod/profiles.php:494
+msgid "Hide your contact/friend list from viewers of this profile?"
msgstr ""
-#: ../../addon/twitter/twitter.php:195
-msgid "Allow posting to Twitter"
+#: ../../mod/profiles.php:517
+msgid "Edit Profile Details"
msgstr ""
-#: ../../addon/twitter/twitter.php:198
-msgid "Send public postings to Twitter by default"
+#: ../../mod/profiles.php:519
+msgid "View this profile"
msgstr ""
-#: ../../addon/twitter/twitter.php:201
-msgid "Send linked #-tags and @-names to Twitter"
+#: ../../mod/profiles.php:520
+msgid "Change Profile Photo"
msgstr ""
-#: ../../addon/twitter/twitter.php:389
-msgid "Consumer key"
+#: ../../mod/profiles.php:521
+msgid "Create a new profile using these settings"
msgstr ""
-#: ../../addon/twitter/twitter.php:390
-msgid "Consumer secret"
+#: ../../mod/profiles.php:522
+msgid "Clone this profile"
msgstr ""
-#: ../../addon/irc/irc.php:44
-msgid "IRC Settings"
+#: ../../mod/profiles.php:523
+msgid "Delete this profile"
msgstr ""
-#: ../../addon/irc/irc.php:46
-msgid "Channel(s) to auto connect (comma separated)"
+#: ../../mod/profiles.php:524
+msgid "Profile Name:"
msgstr ""
-#: ../../addon/irc/irc.php:51
-msgid "Popular Channels (comma separated)"
+#: ../../mod/profiles.php:525
+msgid "Your Full Name:"
msgstr ""
-#: ../../addon/irc/irc.php:69
-msgid "IRC settings saved."
+#: ../../mod/profiles.php:526
+msgid "Title/Description:"
msgstr ""
-#: ../../addon/irc/irc.php:74
-msgid "IRC Chatroom"
+#: ../../mod/profiles.php:527
+msgid "Your Gender:"
msgstr ""
-#: ../../addon/irc/irc.php:96
-msgid "Popular Channels"
+#: ../../mod/profiles.php:528
+#, php-format
+msgid "Birthday (%s):"
msgstr ""
-#: ../../addon/blogger/blogger.php:42
-msgid "Post to blogger"
+#: ../../mod/profiles.php:529
+msgid "Street Address:"
msgstr ""
-#: ../../addon/blogger/blogger.php:74
-msgid "Blogger Post Settings"
+#: ../../mod/profiles.php:530
+msgid "Locality/City:"
msgstr ""
-#: ../../addon/blogger/blogger.php:76
-msgid "Enable Blogger Post Plugin"
+#: ../../mod/profiles.php:531
+msgid "Postal/Zip Code:"
msgstr ""
-#: ../../addon/blogger/blogger.php:81
-msgid "Blogger username"
+#: ../../mod/profiles.php:532
+msgid "Country:"
msgstr ""
-#: ../../addon/blogger/blogger.php:86
-msgid "Blogger password"
+#: ../../mod/profiles.php:533
+msgid "Region/State:"
msgstr ""
-#: ../../addon/blogger/blogger.php:91
-msgid "Blogger API URL"
+#: ../../mod/profiles.php:534
+msgid "<span class=\"heart\">&hearts;</span> Marital Status:"
msgstr ""
-#: ../../addon/blogger/blogger.php:96
-msgid "Post to Blogger by default"
+#: ../../mod/profiles.php:535
+msgid "Who: (if applicable)"
msgstr ""
-#: ../../addon/posterous/posterous.php:37
-msgid "Post to Posterous"
+#: ../../mod/profiles.php:536
+msgid "Examples: cathy123, Cathy Williams, cathy@example.com"
msgstr ""
-#: ../../addon/posterous/posterous.php:70
-msgid "Posterous Post Settings"
+#: ../../mod/profiles.php:537
+msgid "Since [date]:"
msgstr ""
-#: ../../addon/posterous/posterous.php:72
-msgid "Enable Posterous Post Plugin"
+#: ../../mod/profiles.php:539
+msgid "Homepage URL:"
msgstr ""
-#: ../../addon/posterous/posterous.php:77
-msgid "Posterous login"
+#: ../../mod/profiles.php:542
+msgid "Religious Views:"
msgstr ""
-#: ../../addon/posterous/posterous.php:82
-msgid "Posterous password"
+#: ../../mod/profiles.php:543
+msgid "Keywords:"
msgstr ""
-#: ../../addon/posterous/posterous.php:87
-msgid "Posterous site ID"
+#: ../../mod/profiles.php:546
+msgid "Example: fishing photography software"
msgstr ""
-#: ../../addon/posterous/posterous.php:92
-msgid "Posterous API token"
+#: ../../mod/profiles.php:547
+msgid "Used in directory listings"
msgstr ""
-#: ../../addon/posterous/posterous.php:97
-msgid "Post to Posterous by default"
+#: ../../mod/profiles.php:548
+msgid "Tell us about yourself..."
msgstr ""
-#: ../../view/theme/cleanzero/config.php:82
-#: ../../view/theme/diabook/config.php:192
-#: ../../view/theme/quattro/config.php:54 ../../view/theme/dispy/config.php:72
-msgid "Theme settings"
+#: ../../mod/profiles.php:549
+msgid "Hobbies/Interests"
msgstr ""
-#: ../../view/theme/cleanzero/config.php:83
-msgid "Set resize level for images in posts and comments (width and height)"
+#: ../../mod/profiles.php:550
+msgid "Contact information and Social Networks"
msgstr ""
-#: ../../view/theme/cleanzero/config.php:84
-#: ../../view/theme/diabook/config.php:193
-#: ../../view/theme/dispy/config.php:73
-msgid "Set font-size for posts and comments"
+#: ../../mod/profiles.php:551
+msgid "My other channels"
msgstr ""
-#: ../../view/theme/cleanzero/config.php:85
-msgid "Set theme width"
+#: ../../mod/profiles.php:552
+msgid "Musical interests"
msgstr ""
-#: ../../view/theme/cleanzero/config.php:86
-#: ../../view/theme/quattro/config.php:56
-msgid "Color scheme"
+#: ../../mod/profiles.php:553
+msgid "Books, literature"
msgstr ""
-#: ../../view/theme/diabook/theme.php:127 ../../include/nav.php:49
-#: ../../include/nav.php:115
-msgid "Your posts and conversations"
+#: ../../mod/profiles.php:554
+msgid "Television"
msgstr ""
-#: ../../view/theme/diabook/theme.php:128 ../../include/nav.php:50
-msgid "Your profile page"
+#: ../../mod/profiles.php:555
+msgid "Film/dance/culture/entertainment"
msgstr ""
-#: ../../view/theme/diabook/theme.php:129
-msgid "Your contacts"
+#: ../../mod/profiles.php:556
+msgid "Love/romance"
msgstr ""
-#: ../../view/theme/diabook/theme.php:130 ../../include/nav.php:51
-msgid "Your photos"
+#: ../../mod/profiles.php:557
+msgid "Work/employment"
msgstr ""
-#: ../../view/theme/diabook/theme.php:131 ../../include/nav.php:52
-msgid "Your events"
+#: ../../mod/profiles.php:558
+msgid "School/education"
msgstr ""
-#: ../../view/theme/diabook/theme.php:132 ../../include/nav.php:53
-msgid "Personal notes"
+#: ../../mod/profiles.php:563
+msgid ""
+"This is your <strong>public</strong> profile.<br />It <strong>may</strong> "
+"be visible to anybody using the internet."
msgstr ""
-#: ../../view/theme/diabook/theme.php:132 ../../include/nav.php:53
-msgid "Your personal photos"
+#: ../../mod/profiles.php:612
+msgid "Edit/Manage Profiles"
msgstr ""
-#: ../../view/theme/diabook/theme.php:134
-#: ../../view/theme/diabook/theme.php:643
-#: ../../view/theme/diabook/theme.php:747
-#: ../../view/theme/diabook/config.php:201
-msgid "Community Pages"
+#: ../../mod/profiles.php:613
+msgid "Add profile things"
msgstr ""
-#: ../../view/theme/diabook/theme.php:490
-#: ../../view/theme/diabook/theme.php:749
-#: ../../view/theme/diabook/config.php:203
-msgid "Community Profiles"
+#: ../../mod/profiles.php:614
+msgid "Include desirable objects in your profile"
msgstr ""
-#: ../../view/theme/diabook/theme.php:511
-#: ../../view/theme/diabook/theme.php:754
-#: ../../view/theme/diabook/config.php:208
-msgid "Last users"
+#: ../../mod/new_channel.php:107
+msgid "Add a Channel"
msgstr ""
-#: ../../view/theme/diabook/theme.php:540
-#: ../../view/theme/diabook/theme.php:756
-#: ../../view/theme/diabook/config.php:210
-msgid "Last likes"
+#: ../../mod/new_channel.php:108
+msgid ""
+"A channel is your own collection of related web pages. A channel can be used "
+"to hold social network profiles, blogs, conversation groups and forums, "
+"celebrity pages, and much more. You may create as many channels as your "
+"service provider allows."
msgstr ""
-#: ../../view/theme/diabook/theme.php:585
-#: ../../view/theme/diabook/theme.php:755
-#: ../../view/theme/diabook/config.php:209
-msgid "Last photos"
+#: ../../mod/new_channel.php:111
+msgid ""
+"Examples: \"Bob Jameson\", \"Lisa and her Horses\", \"Soccer\", \"Aviation "
+"Group\" "
msgstr ""
-#: ../../view/theme/diabook/theme.php:622
-#: ../../view/theme/diabook/theme.php:752
-#: ../../view/theme/diabook/config.php:206
-msgid "Find Friends"
+#: ../../mod/new_channel.php:112
+msgid "Choose a short nickname"
msgstr ""
-#: ../../view/theme/diabook/theme.php:623
-msgid "Local Directory"
+#: ../../mod/new_channel.php:113
+msgid ""
+"Your nickname will be used to create an easily remembered channel address "
+"(like an email address) which you can share with others."
msgstr ""
-#: ../../view/theme/diabook/theme.php:625 ../../include/contact_widgets.php:35
-msgid "Similar Interests"
+#: ../../mod/new_channel.php:114
+msgid ""
+"Or <a href=\"import\">import an existing channel</a> from another location"
msgstr ""
-#: ../../view/theme/diabook/theme.php:627 ../../include/contact_widgets.php:37
-msgid "Invite Friends"
+#: ../../mod/filestorage.php:68
+msgid "Permission Denied."
msgstr ""
-#: ../../view/theme/diabook/theme.php:678
-#: ../../view/theme/diabook/theme.php:748
-#: ../../view/theme/diabook/config.php:202
-msgid "Earth Layers"
+#: ../../mod/filestorage.php:86
+msgid "File not found."
msgstr ""
-#: ../../view/theme/diabook/theme.php:683
-msgid "Set zoomfactor for Earth Layers"
+#: ../../mod/filestorage.php:120
+msgid "Edit file permissions"
msgstr ""
-#: ../../view/theme/diabook/theme.php:684
-#: ../../view/theme/diabook/config.php:199
-msgid "Set longitude (X) for Earth Layers"
+#: ../../mod/filestorage.php:127
+msgid "Include all files and sub folders"
msgstr ""
-#: ../../view/theme/diabook/theme.php:685
-#: ../../view/theme/diabook/config.php:200
-msgid "Set latitude (Y) for Earth Layers"
+#: ../../mod/filestorage.php:128
+msgid "Return to file list"
msgstr ""
-#: ../../view/theme/diabook/theme.php:698
-#: ../../view/theme/diabook/theme.php:750
-#: ../../view/theme/diabook/config.php:204
-msgid "Help or @NewHere ?"
+#: ../../mod/filestorage.php:130
+msgid "Copy/paste this code to attach file to a post"
msgstr ""
-#: ../../view/theme/diabook/theme.php:705
-#: ../../view/theme/diabook/theme.php:751
-#: ../../view/theme/diabook/config.php:205
-msgid "Connect Services"
+#: ../../mod/filestorage.php:131
+msgid "Copy/paste this URL to link file from a web page"
msgstr ""
-#: ../../view/theme/diabook/theme.php:712
-#: ../../view/theme/diabook/theme.php:753
-msgid "Last Tweets"
+#: ../../mod/filestorage.php:168
+msgid "Download"
msgstr ""
-#: ../../view/theme/diabook/theme.php:715
-#: ../../view/theme/diabook/config.php:197
-msgid "Set twitter search term"
+#: ../../mod/filestorage.php:174
+msgid "Used: "
msgstr ""
-#: ../../view/theme/diabook/theme.php:735
-#: ../../view/theme/diabook/theme.php:736
-#: ../../view/theme/diabook/theme.php:737
-#: ../../view/theme/diabook/theme.php:738
-#: ../../view/theme/diabook/theme.php:739
-#: ../../view/theme/diabook/theme.php:740
-#: ../../view/theme/diabook/theme.php:741
-#: ../../view/theme/diabook/theme.php:742
-#: ../../view/theme/diabook/theme.php:743
-#: ../../view/theme/diabook/theme.php:744 ../../include/acl_selectors.php:288
-msgid "don't show"
+#: ../../mod/filestorage.php:175
+msgid "[directory]"
msgstr ""
-#: ../../view/theme/diabook/theme.php:735
-#: ../../view/theme/diabook/theme.php:736
-#: ../../view/theme/diabook/theme.php:737
-#: ../../view/theme/diabook/theme.php:738
-#: ../../view/theme/diabook/theme.php:739
-#: ../../view/theme/diabook/theme.php:740
-#: ../../view/theme/diabook/theme.php:741
-#: ../../view/theme/diabook/theme.php:742
-#: ../../view/theme/diabook/theme.php:743
-#: ../../view/theme/diabook/theme.php:744 ../../include/acl_selectors.php:287
-msgid "show"
+#: ../../mod/filestorage.php:177
+msgid "Limit: "
msgstr ""
-#: ../../view/theme/diabook/theme.php:745
-msgid "Show/hide boxes at right-hand column:"
+#: ../../mod/lostpass.php:15
+msgid "No valid account found."
msgstr ""
-#: ../../view/theme/diabook/config.php:194
-#: ../../view/theme/dispy/config.php:74
-msgid "Set line-height for posts and comments"
+#: ../../mod/lostpass.php:29
+msgid "Password reset request issued. Check your email."
msgstr ""
-#: ../../view/theme/diabook/config.php:195
-msgid "Set resolution for middle column"
+#: ../../mod/lostpass.php:35 ../../mod/lostpass.php:102
+#, php-format
+msgid "Site Member (%s)"
msgstr ""
-#: ../../view/theme/diabook/config.php:196
-msgid "Set color scheme"
+#: ../../mod/lostpass.php:40
+#, php-format
+msgid "Password reset requested at %s"
msgstr ""
-#: ../../view/theme/diabook/config.php:198
-msgid "Set zoomfactor for Earth Layer"
+#: ../../mod/lostpass.php:63
+msgid ""
+"Request could not be verified. (You may have previously submitted it.) "
+"Password reset failed."
msgstr ""
-#: ../../view/theme/diabook/config.php:207
-msgid "Last tweets"
+#: ../../mod/lostpass.php:85 ../../boot.php:1426
+msgid "Password Reset"
msgstr ""
-#: ../../view/theme/quattro/config.php:55
-msgid "Alignment"
+#: ../../mod/lostpass.php:86
+msgid "Your password has been reset as requested."
msgstr ""
-#: ../../view/theme/quattro/config.php:55
-msgid "Left"
+#: ../../mod/lostpass.php:87
+msgid "Your new password is"
msgstr ""
-#: ../../view/theme/quattro/config.php:55
-msgid "Center"
+#: ../../mod/lostpass.php:88
+msgid "Save or copy your new password - and then"
msgstr ""
-#: ../../view/theme/dispy/config.php:75
-msgid "Set colour scheme"
+#: ../../mod/lostpass.php:89
+msgid "click here to login"
msgstr ""
-#: ../../include/profile_advanced.php:22
-msgid "j F, Y"
+#: ../../mod/lostpass.php:90
+msgid ""
+"Your password may be changed from the <em>Settings</em> page after "
+"successful login."
msgstr ""
-#: ../../include/profile_advanced.php:23
-msgid "j F"
+#: ../../mod/lostpass.php:107
+#, php-format
+msgid "Your password has changed at %s"
msgstr ""
-#: ../../include/profile_advanced.php:30
-msgid "Birthday:"
+#: ../../mod/lostpass.php:122
+msgid "Forgot your Password?"
msgstr ""
-#: ../../include/profile_advanced.php:34
-msgid "Age:"
+#: ../../mod/lostpass.php:123
+msgid ""
+"Enter your email address and submit to have your password reset. Then check "
+"your email for further instructions."
msgstr ""
-#: ../../include/profile_advanced.php:43
-#, php-format
-msgid "for %1$d %2$s"
+#: ../../mod/lostpass.php:124
+msgid "Email Address"
msgstr ""
-#: ../../include/profile_advanced.php:52
-msgid "Tags:"
+#: ../../mod/lostpass.php:125
+msgid "Reset"
msgstr ""
-#: ../../include/profile_advanced.php:56
-msgid "Religion:"
+#: ../../mod/import.php:36
+msgid "Nothing to import."
msgstr ""
-#: ../../include/profile_advanced.php:60
-msgid "Hobbies/Interests:"
+#: ../../mod/import.php:58
+msgid "Unable to download data from old server"
msgstr ""
-#: ../../include/profile_advanced.php:67
-msgid "Contact information and Social Networks:"
+#: ../../mod/import.php:64
+msgid "Imported file is empty."
msgstr ""
-#: ../../include/profile_advanced.php:69
-msgid "Musical interests:"
+#: ../../mod/import.php:88
+msgid ""
+"Cannot create a duplicate channel identifier on this system. Import failed."
msgstr ""
-#: ../../include/profile_advanced.php:71
-msgid "Books, literature:"
+#: ../../mod/import.php:106
+msgid "Channel clone failed. Import failed."
msgstr ""
-#: ../../include/profile_advanced.php:73
-msgid "Television:"
+#: ../../mod/import.php:116
+msgid "Cloned channel not found. Import failed."
msgstr ""
-#: ../../include/profile_advanced.php:75
-msgid "Film/dance/culture/entertainment:"
+#: ../../mod/import.php:358
+msgid "Import completed."
msgstr ""
-#: ../../include/profile_advanced.php:77
-msgid "Love/Romance:"
+#: ../../mod/import.php:371
+msgid "You must be logged in to use this feature."
msgstr ""
-#: ../../include/profile_advanced.php:79
-msgid "Work/employment:"
+#: ../../mod/import.php:376
+msgid "Import Channel"
msgstr ""
-#: ../../include/profile_advanced.php:81
-msgid "School/education:"
+#: ../../mod/import.php:377
+msgid ""
+"Use this form to import an existing channel from a different server/hub. You "
+"may retrieve the channel identity from the old server/hub via the network or "
+"provide an export file. Only identity and connections/relationships will be "
+"imported. Importation of content is not yet available."
msgstr ""
-#: ../../include/contact_selectors.php:32
-msgid "Unknown | Not categorised"
+#: ../../mod/import.php:378
+msgid "File to Upload"
msgstr ""
-#: ../../include/contact_selectors.php:33
-msgid "Block immediately"
+#: ../../mod/import.php:379
+msgid "Or provide the old server/hub details"
msgstr ""
-#: ../../include/contact_selectors.php:34
-msgid "Shady, spammer, self-marketer"
+#: ../../mod/import.php:380
+msgid "Your old identity address (xyz@example.com)"
msgstr ""
-#: ../../include/contact_selectors.php:35
-msgid "Known to me, but no opinion"
+#: ../../mod/import.php:381
+msgid "Your old login email address"
msgstr ""
-#: ../../include/contact_selectors.php:36
-msgid "OK, probably harmless"
+#: ../../mod/import.php:382
+msgid "Your old login password"
msgstr ""
-#: ../../include/contact_selectors.php:37
-msgid "Reputable, has my trust"
+#: ../../mod/import.php:383
+msgid ""
+"For either option, please choose whether to make this hub your new primary "
+"address, or whether your old location should continue this role. You will be "
+"able to post from either location, but only one can be marked as the primary "
+"location for files, photos, and media."
msgstr ""
-#: ../../include/contact_selectors.php:56
-msgid "Frequently"
+#: ../../mod/import.php:384
+msgid "Make this hub my primary location"
msgstr ""
-#: ../../include/contact_selectors.php:57
-msgid "Hourly"
+#: ../../mod/manage.php:63
+#, php-format
+msgid "You have created %1$.0f of %2$.0f allowed channels."
msgstr ""
-#: ../../include/contact_selectors.php:58
-msgid "Twice daily"
+#: ../../mod/manage.php:71
+msgid "Create a new channel"
msgstr ""
-#: ../../include/contact_selectors.php:59
-msgid "Daily"
+#: ../../mod/manage.php:76
+msgid "Channel Manager"
msgstr ""
-#: ../../include/contact_selectors.php:60
-msgid "Weekly"
+#: ../../mod/manage.php:77
+msgid "Current Channel"
msgstr ""
-#: ../../include/contact_selectors.php:61
-msgid "Monthly"
+#: ../../mod/manage.php:79
+msgid "Attach to one of your channels by selecting it."
msgstr ""
-#: ../../include/contact_selectors.php:77
-msgid "OStatus"
+#: ../../mod/manage.php:80
+msgid "Default Channel"
msgstr ""
-#: ../../include/contact_selectors.php:78
-msgid "RSS/Atom"
+#: ../../mod/manage.php:81
+msgid "Make Default"
msgstr ""
-#: ../../include/contact_selectors.php:82
-msgid "Zot!"
+#: ../../mod/vote.php:97
+msgid "Total votes"
msgstr ""
-#: ../../include/contact_selectors.php:83
-msgid "LinkedIn"
+#: ../../mod/vote.php:98
+msgid "Average Rating"
msgstr ""
-#: ../../include/contact_selectors.php:84
-msgid "XMPP/IM"
+#: ../../mod/match.php:16
+msgid "Profile Match"
msgstr ""
-#: ../../include/contact_selectors.php:85
-msgid "MySpace"
+#: ../../mod/match.php:24
+msgid "No keywords to match. Please add keywords to your default profile."
msgstr ""
-#: ../../include/profile_selectors.php:6
-msgid "Male"
+#: ../../mod/match.php:61
+msgid "is interested in:"
msgstr ""
-#: ../../include/profile_selectors.php:6
-msgid "Female"
+#: ../../mod/match.php:69
+msgid "No matches"
msgstr ""
-#: ../../include/profile_selectors.php:6
-msgid "Currently Male"
+#: ../../mod/zfinger.php:23
+msgid "invalid target signature"
msgstr ""
-#: ../../include/profile_selectors.php:6
-msgid "Currently Female"
+#: ../../mod/settings.php:71
+msgid "Name is required"
msgstr ""
-#: ../../include/profile_selectors.php:6
-msgid "Mostly Male"
+#: ../../mod/settings.php:75
+msgid "Key and Secret are required"
msgstr ""
-#: ../../include/profile_selectors.php:6
-msgid "Mostly Female"
+#: ../../mod/settings.php:79 ../../mod/settings.php:533
+msgid "Update"
msgstr ""
-#: ../../include/profile_selectors.php:6
-msgid "Transgender"
+#: ../../mod/settings.php:192
+msgid "Passwords do not match. Password unchanged."
msgstr ""
-#: ../../include/profile_selectors.php:6
-msgid "Intersex"
+#: ../../mod/settings.php:196
+msgid "Empty passwords are not allowed. Password unchanged."
msgstr ""
-#: ../../include/profile_selectors.php:6
-msgid "Transsexual"
+#: ../../mod/settings.php:209
+msgid "Password changed."
msgstr ""
-#: ../../include/profile_selectors.php:6
-msgid "Hermaphrodite"
+#: ../../mod/settings.php:211
+msgid "Password update failed. Please try again."
msgstr ""
-#: ../../include/profile_selectors.php:6
-msgid "Neuter"
+#: ../../mod/settings.php:225
+msgid "Not valid email."
msgstr ""
-#: ../../include/profile_selectors.php:6
-msgid "Non-specific"
+#: ../../mod/settings.php:228
+msgid "Protected email address. Cannot change to that email."
msgstr ""
-#: ../../include/profile_selectors.php:6
-msgid "Other"
+#: ../../mod/settings.php:237
+msgid "System failure storing new email. Please try again."
msgstr ""
-#: ../../include/profile_selectors.php:6
-msgid "Undecided"
+#: ../../mod/settings.php:435
+msgid "Settings updated."
msgstr ""
-#: ../../include/profile_selectors.php:23
-msgid "Males"
+#: ../../mod/settings.php:506 ../../mod/settings.php:532
+#: ../../mod/settings.php:568
+msgid "Add application"
msgstr ""
-#: ../../include/profile_selectors.php:23
-msgid "Females"
+#: ../../mod/settings.php:509
+msgid "Name of application"
msgstr ""
-#: ../../include/profile_selectors.php:23
-msgid "Gay"
+#: ../../mod/settings.php:510 ../../mod/settings.php:536
+msgid "Consumer Key"
msgstr ""
-#: ../../include/profile_selectors.php:23
-msgid "Lesbian"
+#: ../../mod/settings.php:510 ../../mod/settings.php:511
+msgid "Automatically generated - change if desired. Max length 20"
msgstr ""
-#: ../../include/profile_selectors.php:23
-msgid "No Preference"
+#: ../../mod/settings.php:511 ../../mod/settings.php:537
+msgid "Consumer Secret"
msgstr ""
-#: ../../include/profile_selectors.php:23
-msgid "Bisexual"
+#: ../../mod/settings.php:512 ../../mod/settings.php:538
+msgid "Redirect"
msgstr ""
-#: ../../include/profile_selectors.php:23
-msgid "Autosexual"
+#: ../../mod/settings.php:512
+msgid ""
+"Redirect URI - leave blank unless your application specifically requires this"
msgstr ""
-#: ../../include/profile_selectors.php:23
-msgid "Abstinent"
+#: ../../mod/settings.php:513 ../../mod/settings.php:539
+msgid "Icon url"
msgstr ""
-#: ../../include/profile_selectors.php:23
-msgid "Virgin"
+#: ../../mod/settings.php:513
+msgid "Optional"
msgstr ""
-#: ../../include/profile_selectors.php:23
-msgid "Deviant"
+#: ../../mod/settings.php:524
+msgid "You can't edit this application."
msgstr ""
-#: ../../include/profile_selectors.php:23
-msgid "Fetish"
+#: ../../mod/settings.php:567
+msgid "Connected Apps"
msgstr ""
-#: ../../include/profile_selectors.php:23
-msgid "Oodles"
+#: ../../mod/settings.php:571
+msgid "Client key starts with"
msgstr ""
-#: ../../include/profile_selectors.php:23
-msgid "Nonsexual"
+#: ../../mod/settings.php:572
+msgid "No name"
msgstr ""
-#: ../../include/profile_selectors.php:42
-msgid "Single"
+#: ../../mod/settings.php:573
+msgid "Remove authorization"
msgstr ""
-#: ../../include/profile_selectors.php:42
-msgid "Lonely"
+#: ../../mod/settings.php:584
+msgid "No feature settings configured"
msgstr ""
-#: ../../include/profile_selectors.php:42
-msgid "Available"
+#: ../../mod/settings.php:592
+msgid "Feature Settings"
msgstr ""
-#: ../../include/profile_selectors.php:42
-msgid "Unavailable"
+#: ../../mod/settings.php:615
+msgid "Account Settings"
msgstr ""
-#: ../../include/profile_selectors.php:42
-msgid "Has crush"
+#: ../../mod/settings.php:616
+msgid "Password Settings"
msgstr ""
-#: ../../include/profile_selectors.php:42
-msgid "Infatuated"
+#: ../../mod/settings.php:617
+msgid "New Password:"
msgstr ""
-#: ../../include/profile_selectors.php:42
-msgid "Dating"
+#: ../../mod/settings.php:618
+msgid "Confirm:"
msgstr ""
-#: ../../include/profile_selectors.php:42
-msgid "Unfaithful"
+#: ../../mod/settings.php:618
+msgid "Leave password fields blank unless changing"
msgstr ""
-#: ../../include/profile_selectors.php:42
-msgid "Sex Addict"
+#: ../../mod/settings.php:620 ../../mod/settings.php:912
+msgid "Email Address:"
msgstr ""
-#: ../../include/profile_selectors.php:42 ../../include/user.php:278
-#: ../../include/user.php:283
-msgid "Friends"
+#: ../../mod/settings.php:621
+msgid "Remove Account"
msgstr ""
-#: ../../include/profile_selectors.php:42
-msgid "Friends/Benefits"
+#: ../../mod/settings.php:622
+msgid "Warning: This action is permanent and cannot be reversed."
msgstr ""
-#: ../../include/profile_selectors.php:42
-msgid "Casual"
+#: ../../mod/settings.php:638
+msgid "Off"
msgstr ""
-#: ../../include/profile_selectors.php:42
-msgid "Engaged"
+#: ../../mod/settings.php:638
+msgid "On"
msgstr ""
-#: ../../include/profile_selectors.php:42
-msgid "Married"
+#: ../../mod/settings.php:645
+msgid "Additional Features"
msgstr ""
-#: ../../include/profile_selectors.php:42
-msgid "Imaginarily married"
+#: ../../mod/settings.php:670
+msgid "Connector Settings"
msgstr ""
-#: ../../include/profile_selectors.php:42
-msgid "Partners"
+#: ../../mod/settings.php:740
+msgid "Display Settings"
msgstr ""
-#: ../../include/profile_selectors.php:42
-msgid "Cohabiting"
+#: ../../mod/settings.php:746
+msgid "Display Theme:"
msgstr ""
-#: ../../include/profile_selectors.php:42
-msgid "Common law"
+#: ../../mod/settings.php:747
+msgid "Mobile Theme:"
msgstr ""
-#: ../../include/profile_selectors.php:42
-msgid "Happy"
+#: ../../mod/settings.php:748
+msgid "Update browser every xx seconds"
msgstr ""
-#: ../../include/profile_selectors.php:42
-msgid "Not looking"
+#: ../../mod/settings.php:748
+msgid "Minimum of 10 seconds, no maximum"
msgstr ""
-#: ../../include/profile_selectors.php:42
-msgid "Swinger"
+#: ../../mod/settings.php:749
+msgid "Maximum number of conversations to load at any time:"
msgstr ""
-#: ../../include/profile_selectors.php:42
-msgid "Betrayed"
+#: ../../mod/settings.php:749
+msgid "Maximum of 100 items"
msgstr ""
-#: ../../include/profile_selectors.php:42
-msgid "Separated"
+#: ../../mod/settings.php:750
+msgid "Don't show emoticons"
msgstr ""
-#: ../../include/profile_selectors.php:42
-msgid "Unstable"
+#: ../../mod/settings.php:786
+msgid "Nobody except yourself"
msgstr ""
-#: ../../include/profile_selectors.php:42
-msgid "Divorced"
+#: ../../mod/settings.php:787
+msgid "Only those you specifically allow"
msgstr ""
-#: ../../include/profile_selectors.php:42
-msgid "Imaginarily divorced"
+#: ../../mod/settings.php:788
+msgid "Anybody in your address book"
msgstr ""
-#: ../../include/profile_selectors.php:42
-msgid "Widowed"
+#: ../../mod/settings.php:789
+msgid "Anybody on this website"
msgstr ""
-#: ../../include/profile_selectors.php:42
-msgid "Uncertain"
+#: ../../mod/settings.php:790
+msgid "Anybody in this network"
msgstr ""
-#: ../../include/profile_selectors.php:42
-msgid "It's complicated"
+#: ../../mod/settings.php:791
+msgid "Anybody on the internet"
msgstr ""
-#: ../../include/profile_selectors.php:42
-msgid "Don't care"
+#: ../../mod/settings.php:865
+msgid "Publish your default profile in the network directory"
msgstr ""
-#: ../../include/profile_selectors.php:42
-msgid "Ask me"
+#: ../../mod/settings.php:870
+msgid "Allow us to suggest you as a potential friend to new members?"
msgstr ""
-#: ../../include/event.php:20 ../../include/bb2diaspora.php:393
-msgid "Starts:"
+#: ../../mod/settings.php:874 ../../mod/profile_photo.php:288
+msgid "or"
msgstr ""
-#: ../../include/event.php:30 ../../include/bb2diaspora.php:401
-msgid "Finishes:"
+#: ../../mod/settings.php:879
+msgid "Your channel address is"
msgstr ""
-#: ../../include/delivery.php:456 ../../include/notifier.php:678
-msgid "(no subject)"
+#: ../../mod/settings.php:901
+msgid "Channel Settings"
msgstr ""
-#: ../../include/delivery.php:463 ../../include/enotify.php:26
-#: ../../include/notifier.php:685
-msgid "noreply"
+#: ../../mod/settings.php:910
+msgid "Basic Settings"
msgstr ""
-#: ../../include/Scrape.php:572
-msgid " on Last.fm"
+#: ../../mod/settings.php:913
+msgid "Your Timezone:"
msgstr ""
-#: ../../include/text.php:243
-msgid "prev"
+#: ../../mod/settings.php:914
+msgid "Default Post Location:"
msgstr ""
-#: ../../include/text.php:245
-msgid "first"
+#: ../../mod/settings.php:915
+msgid "Use Browser Location:"
msgstr ""
-#: ../../include/text.php:274
-msgid "last"
+#: ../../mod/settings.php:917
+msgid "Adult Content"
msgstr ""
-#: ../../include/text.php:277
-msgid "next"
+#: ../../mod/settings.php:917
+msgid "This channel publishes adult content."
msgstr ""
-#: ../../include/text.php:568
-msgid "No contacts"
+#: ../../mod/settings.php:919
+msgid "Security and Privacy Settings"
msgstr ""
-#: ../../include/text.php:577
-#, php-format
-msgid "%d Contact"
-msgid_plural "%d Contacts"
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../../include/text.php:839
-msgid "Monday"
+#: ../../mod/settings.php:921
+msgid "Quick Privacy Settings:"
msgstr ""
-#: ../../include/text.php:839
-msgid "Tuesday"
+#: ../../mod/settings.php:922
+msgid "Very Public - extremely permissive"
msgstr ""
-#: ../../include/text.php:839
-msgid "Wednesday"
+#: ../../mod/settings.php:923
+msgid "Typical - default public, privacy when desired"
msgstr ""
-#: ../../include/text.php:839
-msgid "Thursday"
+#: ../../mod/settings.php:924
+msgid "Private - default private, rarely open or public"
msgstr ""
-#: ../../include/text.php:839
-msgid "Friday"
+#: ../../mod/settings.php:925
+msgid "Blocked - default blocked to/from everybody"
msgstr ""
-#: ../../include/text.php:839
-msgid "Saturday"
+#: ../../mod/settings.php:928
+msgid "Maximum Friend Requests/Day:"
msgstr ""
-#: ../../include/text.php:839
-msgid "Sunday"
+#: ../../mod/settings.php:928
+msgid "May reduce spam activity"
msgstr ""
-#: ../../include/text.php:843
-msgid "January"
+#: ../../mod/settings.php:929
+msgid "Default Post Permissions"
msgstr ""
-#: ../../include/text.php:843
-msgid "February"
+#: ../../mod/settings.php:941
+msgid "Maximum private messages per day from unknown people:"
msgstr ""
-#: ../../include/text.php:843
-msgid "March"
+#: ../../mod/settings.php:941
+msgid "Useful to reduce spamming"
msgstr ""
-#: ../../include/text.php:843
-msgid "April"
+#: ../../mod/settings.php:944
+msgid "Notification Settings"
msgstr ""
-#: ../../include/text.php:843
-msgid "May"
+#: ../../mod/settings.php:945
+msgid "By default post a status message when:"
msgstr ""
-#: ../../include/text.php:843
-msgid "June"
+#: ../../mod/settings.php:946
+msgid "accepting a friend request"
msgstr ""
-#: ../../include/text.php:843
-msgid "July"
+#: ../../mod/settings.php:947
+msgid "joining a forum/community"
msgstr ""
-#: ../../include/text.php:843
-msgid "August"
+#: ../../mod/settings.php:948
+msgid "making an <em>interesting</em> profile change"
msgstr ""
-#: ../../include/text.php:843
-msgid "September"
+#: ../../mod/settings.php:949
+msgid "Send a notification email when:"
msgstr ""
-#: ../../include/text.php:843
-msgid "October"
+#: ../../mod/settings.php:950
+msgid "You receive an introduction"
msgstr ""
-#: ../../include/text.php:843
-msgid "November"
+#: ../../mod/settings.php:951
+msgid "Your introductions are confirmed"
msgstr ""
-#: ../../include/text.php:843
-msgid "December"
+#: ../../mod/settings.php:952
+msgid "Someone writes on your profile wall"
msgstr ""
-#: ../../include/text.php:929
-msgid "bytes"
+#: ../../mod/settings.php:953
+msgid "Someone writes a followup comment"
msgstr ""
-#: ../../include/text.php:949 ../../include/text.php:964
-msgid "remove"
+#: ../../mod/settings.php:954
+msgid "You receive a private message"
msgstr ""
-#: ../../include/text.php:949 ../../include/text.php:964
-msgid "[remove]"
+#: ../../mod/settings.php:955
+msgid "You receive a friend suggestion"
msgstr ""
-#: ../../include/text.php:952
-msgid "Categories:"
+#: ../../mod/settings.php:956
+msgid "You are tagged in a post"
msgstr ""
-#: ../../include/text.php:967
-msgid "Filed under:"
+#: ../../mod/settings.php:957
+msgid "You are poked/prodded/etc. in a post"
msgstr ""
-#: ../../include/text.php:983 ../../include/text.php:995
-msgid "Click to open/close"
+#: ../../mod/settings.php:960
+msgid "Advanced Account/Page Type Settings"
msgstr ""
-#: ../../include/text.php:1101 ../../include/user.php:236
-msgid "default"
+#: ../../mod/settings.php:961
+msgid "Change the behaviour of this account for special situations"
msgstr ""
-#: ../../include/text.php:1113
-msgid "Select an alternate language"
+#: ../../mod/mail.php:33
+msgid "Unable to lookup recipient."
msgstr ""
-#: ../../include/text.php:1323
-msgid "activity"
+#: ../../mod/mail.php:41
+msgid "Unable to communicate with requested channel."
msgstr ""
-#: ../../include/text.php:1325
-msgid "comment"
+#: ../../mod/mail.php:48
+msgid "Cannot verify requested channel."
msgstr ""
-#: ../../include/text.php:1326
-msgid "post"
+#: ../../mod/mail.php:74
+msgid "Selected channel has private message restrictions. Send failed."
msgstr ""
-#: ../../include/text.php:1481
-msgid "Item filed"
+#: ../../mod/mail.php:121 ../../mod/message.php:31
+msgid "Messages"
msgstr ""
-#: ../../include/diaspora.php:660
-msgid "Sharing notification from Diaspora network"
+#: ../../mod/mail.php:132
+msgid "Message deleted."
msgstr ""
-#: ../../include/diaspora.php:2152
-msgid "Attachments:"
+#: ../../mod/mail.php:149
+msgid "Message recalled."
msgstr ""
-#: ../../include/network.php:842
-msgid "view full size"
+#: ../../mod/mail.php:206
+msgid "Send Private Message"
msgstr ""
-#: ../../include/oembed.php:135
-msgid "Embedded content"
+#: ../../mod/mail.php:207 ../../mod/mail.php:323
+msgid "To:"
msgstr ""
-#: ../../include/oembed.php:144
-msgid "Embedding disabled"
+#: ../../mod/mail.php:212 ../../mod/mail.php:325
+msgid "Subject:"
msgstr ""
-#: ../../include/group.php:25
-msgid ""
-"A deleted group with this name was revived. Existing item permissions "
-"<strong>may</strong> apply to this group and any future members. If this is "
-"not what you intended, please create another group with a different name."
+#: ../../mod/mail.php:249
+msgid "Message not found."
msgstr ""
-#: ../../include/group.php:176
-msgid "Default privacy group for new contacts"
+#: ../../mod/mail.php:292 ../../mod/message.php:72
+msgid "Delete message"
msgstr ""
-#: ../../include/group.php:195
-msgid "Everybody"
+#: ../../mod/mail.php:293
+msgid "Recall message"
msgstr ""
-#: ../../include/group.php:218
-msgid "edit"
+#: ../../mod/mail.php:295
+msgid "Message has been recalled."
msgstr ""
-#: ../../include/group.php:240
-msgid "Edit group"
+#: ../../mod/mail.php:312
+msgid "Private Conversation"
msgstr ""
-#: ../../include/group.php:241
-msgid "Create a new group"
+#: ../../mod/mail.php:316
+msgid "Delete conversation"
msgstr ""
-#: ../../include/group.php:242
-msgid "Contacts not in any group"
+#: ../../mod/mail.php:318
+msgid ""
+"No secure communications available. You <strong>may</strong> be able to "
+"respond from the sender's profile page."
msgstr ""
-#: ../../include/nav.php:46 ../../boot.php:884
-msgid "Logout"
+#: ../../mod/mail.php:322
+msgid "Send Reply"
msgstr ""
-#: ../../include/nav.php:46
-msgid "End this session"
+#: ../../mod/editlayout.php:36 ../../mod/editpost.php:20
+#: ../../mod/editwebpage.php:32 ../../mod/editblock.php:36
+msgid "Item not found"
msgstr ""
-#: ../../include/nav.php:49 ../../boot.php:1574
-msgid "Status"
+#: ../../mod/editlayout.php:68
+msgid "Edit Layout"
msgstr ""
-#: ../../include/nav.php:64
-msgid "Sign in"
+#: ../../mod/editlayout.php:105 ../../mod/editpost.php:102
+#: ../../mod/editwebpage.php:148 ../../mod/editblock.php:119
+msgid "Insert YouTube video"
msgstr ""
-#: ../../include/nav.php:77
-msgid "Home Page"
+#: ../../mod/editlayout.php:106 ../../mod/editpost.php:103
+#: ../../mod/editwebpage.php:149 ../../mod/editblock.php:120
+msgid "Insert Vorbis [.ogg] video"
msgstr ""
-#: ../../include/nav.php:81
-msgid "Create an account"
+#: ../../mod/editlayout.php:107 ../../mod/editpost.php:104
+#: ../../mod/editwebpage.php:150 ../../mod/editblock.php:121
+msgid "Insert Vorbis [.ogg] audio"
msgstr ""
-#: ../../include/nav.php:86
-msgid "Help and documentation"
+#: ../../mod/editlayout.php:141
+msgid "Delete Layout"
msgstr ""
-#: ../../include/nav.php:89
-msgid "Apps"
+#: ../../mod/profile_photo.php:44
+msgid "Image uploaded but image cropping failed."
msgstr ""
-#: ../../include/nav.php:89
-msgid "Addon applications, utilities, games"
+#: ../../mod/profile_photo.php:97
+msgid "Image resize failed."
msgstr ""
-#: ../../include/nav.php:91
-msgid "Search site content"
+#: ../../mod/profile_photo.php:141
+msgid ""
+"Shift-reload the page or clear browser cache if the new photo does not "
+"display immediately."
msgstr ""
-#: ../../include/nav.php:101
-msgid "Conversations on this site"
+#: ../../mod/profile_photo.php:163
+#, php-format
+msgid "Image exceeds size limit of %d"
msgstr ""
-#: ../../include/nav.php:103
-msgid "Directory"
+#: ../../mod/profile_photo.php:172
+msgid "Unable to process image."
msgstr ""
-#: ../../include/nav.php:103
-msgid "People directory"
+#: ../../mod/profile_photo.php:214 ../../mod/profile_photo.php:262
+msgid "Photo not available."
msgstr ""
-#: ../../include/nav.php:113
-msgid "Conversations from your friends"
+#: ../../mod/profile_photo.php:281
+msgid "Upload File:"
msgstr ""
-#: ../../include/nav.php:121
-msgid "Friend Requests"
+#: ../../mod/profile_photo.php:282
+msgid "Select a profile:"
msgstr ""
-#: ../../include/nav.php:123
-msgid "See all notifications"
+#: ../../mod/profile_photo.php:283
+msgid "Upload Profile Photo"
msgstr ""
-#: ../../include/nav.php:124
-msgid "Mark all system notifications seen"
+#: ../../mod/profile_photo.php:284
+msgid "Upload"
msgstr ""
-#: ../../include/nav.php:128
-msgid "Private mail"
+#: ../../mod/profile_photo.php:288
+msgid "skip this step"
msgstr ""
-#: ../../include/nav.php:129
-msgid "Inbox"
+#: ../../mod/profile_photo.php:288
+msgid "select a photo from your photo albums"
msgstr ""
-#: ../../include/nav.php:130
-msgid "Outbox"
+#: ../../mod/profile_photo.php:302
+msgid "Crop Image"
msgstr ""
-#: ../../include/nav.php:134
-msgid "Manage"
+#: ../../mod/profile_photo.php:303
+msgid "Please adjust the image cropping for optimum viewing."
msgstr ""
-#: ../../include/nav.php:134
-msgid "Manage other pages"
+#: ../../mod/profile_photo.php:305
+msgid "Done Editing"
msgstr ""
-#: ../../include/nav.php:138 ../../boot.php:1132
-msgid "Profiles"
+#: ../../mod/profile_photo.php:340
+msgid "Image uploaded successfully."
msgstr ""
-#: ../../include/nav.php:138 ../../boot.php:1132
-msgid "Manage/edit profiles"
+#: ../../mod/profile_photo.php:342
+msgid "Image upload failed."
msgstr ""
-#: ../../include/nav.php:139
-msgid "Manage/edit friends and contacts"
+#: ../../mod/profile_photo.php:351
+#, php-format
+msgid "Image size reduction [%s] failed."
msgstr ""
-#: ../../include/nav.php:146
-msgid "Site setup and configuration"
+#: ../../mod/editpost.php:31
+msgid "Item is not editable"
msgstr ""
-#: ../../include/nav.php:170
-msgid "Nothing new here"
+#: ../../mod/editpost.php:53
+msgid "Delete item?"
msgstr ""
-#: ../../include/contact_widgets.php:6
-msgid "Add New Contact"
+#: ../../mod/notifications.php:26
+msgid "Invalid request identifier."
msgstr ""
-#: ../../include/contact_widgets.php:7
-msgid "Enter address or web location"
+#: ../../mod/notifications.php:35
+msgid "Discard"
msgstr ""
-#: ../../include/contact_widgets.php:8
-msgid "Example: bob@example.com, http://example.com/barbara"
+#: ../../mod/notifications.php:93 ../../mod/notify.php:54
+msgid "No more system notifications."
msgstr ""
-#: ../../include/contact_widgets.php:23
-#, php-format
-msgid "%d invitation available"
-msgid_plural "%d invitations available"
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../../include/contact_widgets.php:29
-msgid "Find People"
+#: ../../mod/notifications.php:97 ../../mod/notify.php:58
+msgid "System Notifications"
msgstr ""
-#: ../../include/contact_widgets.php:30
-msgid "Enter name or interest"
+#: ../../mod/blocks.php:65
+msgid "Block Name"
msgstr ""
-#: ../../include/contact_widgets.php:31
-msgid "Connect/Follow"
+#: ../../mod/oexchange.php:23
+msgid "Unable to find your hub."
msgstr ""
-#: ../../include/contact_widgets.php:32
-msgid "Examples: Robert Morgenstein, Fishing"
+#: ../../mod/oexchange.php:37
+msgid "Post successful."
msgstr ""
-#: ../../include/contact_widgets.php:36
-msgid "Random Profile"
+#: ../../mod/editwebpage.php:106
+msgid "Edit Webpage"
msgstr ""
-#: ../../include/contact_widgets.php:68
-msgid "Networks"
+#: ../../mod/editwebpage.php:116
+msgid "Delete webpage?"
msgstr ""
-#: ../../include/contact_widgets.php:71
-msgid "All Networks"
+#: ../../mod/editwebpage.php:189
+msgid "Delete Webpage"
msgstr ""
-#: ../../include/contact_widgets.php:98
-msgid "Saved Folders"
+#: ../../mod/profile.php:64 ../../mod/profile.php:72
+msgid "Access to this profile has been restricted."
msgstr ""
-#: ../../include/contact_widgets.php:101 ../../include/contact_widgets.php:129
-msgid "Everything"
+#: ../../mod/poke.php:159
+msgid "Poke/Prod"
msgstr ""
-#: ../../include/contact_widgets.php:126
-msgid "Categories"
+#: ../../mod/poke.php:160
+msgid "poke, prod or do other things to somebody"
msgstr ""
-#: ../../include/auth.php:36
-msgid "Logged out."
+#: ../../mod/poke.php:161
+msgid "Recipient"
msgstr ""
-#: ../../include/auth.php:115
-msgid ""
-"We encountered a problem while logging in with the OpenID you provided. "
-"Please check the correct spelling of the ID."
+#: ../../mod/poke.php:162
+msgid "Choose what you wish to do to recipient"
msgstr ""
-#: ../../include/auth.php:115
-msgid "The error message was:"
+#: ../../mod/poke.php:165
+msgid "Make this post private"
msgstr ""
-#: ../../include/datetime.php:43 ../../include/datetime.php:45
-msgid "Miscellaneous"
+#: ../../mod/wall_upload.php:41 ../../mod/item.php:1068
+msgid "Wall Photos"
msgstr ""
-#: ../../include/datetime.php:131 ../../include/datetime.php:263
-msgid "year"
+#: ../../mod/channel.php:25
+msgid "You must be logged in to see this page."
msgstr ""
-#: ../../include/datetime.php:136 ../../include/datetime.php:264
-msgid "month"
+#: ../../mod/channel.php:85
+msgid "Insufficient permissions. Request redirected to profile page."
msgstr ""
-#: ../../include/datetime.php:141 ../../include/datetime.php:266
-msgid "day"
+#: ../../mod/community.php:23
+msgid "Not available."
msgstr ""
-#: ../../include/datetime.php:254
-msgid "never"
+#: ../../mod/community.php:32
+msgid "Community"
msgstr ""
-#: ../../include/datetime.php:260
-msgid "less than a second ago"
+#: ../../mod/community.php:63 ../../mod/community.php:88
+msgid "No results."
msgstr ""
-#: ../../include/datetime.php:263
-msgid "years"
+#: ../../mod/fsuggest.php:20 ../../mod/fsuggest.php:92
+msgid "Contact not found."
msgstr ""
-#: ../../include/datetime.php:264
-msgid "months"
+#: ../../mod/fsuggest.php:63
+msgid "Friend suggestion sent."
msgstr ""
-#: ../../include/datetime.php:265
-msgid "week"
+#: ../../mod/fsuggest.php:97
+msgid "Suggest Friends"
msgstr ""
-#: ../../include/datetime.php:265
-msgid "weeks"
+#: ../../mod/fsuggest.php:99
+#, php-format
+msgid "Suggest a friend for %s"
msgstr ""
-#: ../../include/datetime.php:266
-msgid "days"
+#: ../../mod/editblock.php:82
+msgid "Edit Block"
msgstr ""
-#: ../../include/datetime.php:267
-msgid "hour"
+#: ../../mod/editblock.php:157
+msgid "Delete Block"
msgstr ""
-#: ../../include/datetime.php:267
-msgid "hours"
+#: ../../mod/profperm.php:25 ../../mod/profperm.php:55
+msgid "Invalid profile identifier."
msgstr ""
-#: ../../include/datetime.php:268
-msgid "minute"
+#: ../../mod/profperm.php:101
+msgid "Profile Visibility Editor"
msgstr ""
-#: ../../include/datetime.php:268
-msgid "minutes"
+#: ../../mod/profperm.php:105
+msgid "Click on a contact to add or remove."
msgstr ""
-#: ../../include/datetime.php:269
-msgid "second"
+#: ../../mod/profperm.php:114
+msgid "Visible To"
msgstr ""
-#: ../../include/datetime.php:269
-msgid "seconds"
+#: ../../mod/profperm.php:130
+msgid "All Contacts (with secure profile access)"
msgstr ""
-#: ../../include/datetime.php:278
+#: ../../mod/siteinfo.php:57
#, php-format
-msgid "%1$d %2$s ago"
+msgid "Version %s"
msgstr ""
-#: ../../include/datetime.php:450 ../../include/items.php:1460
-#, php-format
-msgid "%s's birthday"
+#: ../../mod/siteinfo.php:76
+msgid "Installed plugins/addons/apps:"
msgstr ""
-#: ../../include/datetime.php:451 ../../include/items.php:1461
-#, php-format
-msgid "Happy Birthday %s"
+#: ../../mod/siteinfo.php:89
+msgid "No installed plugins/addons/apps"
msgstr ""
-#: ../../include/onepoll.php:399
-msgid "From: "
+#: ../../mod/siteinfo.php:92
+msgid "Red"
msgstr ""
-#: ../../include/bbcode.php:225 ../../include/bbcode.php:245
-msgid "$1 wrote:"
+#: ../../mod/siteinfo.php:93
+msgid ""
+"This is a hub of the Red Matrix - a global cooperative network of "
+"decentralised privacy enhanced websites."
msgstr ""
-#: ../../include/bbcode.php:260 ../../include/bbcode.php:337
-msgid "Image/photo"
+#: ../../mod/siteinfo.php:96
+msgid "Running at web location"
msgstr ""
-#: ../../include/dba.php:41
-#, php-format
-msgid "Cannot locate DNS info for database server '%s'"
+#: ../../mod/siteinfo.php:97
+msgid ""
+"Please visit <a href=\"http://getzot.com\">GetZot.com</a> to learn more "
+"about the Red Matrix."
msgstr ""
-#: ../../include/message.php:15 ../../include/message.php:171
-msgid "[no subject]"
+#: ../../mod/siteinfo.php:98
+msgid "Bug reports and issues: please visit"
msgstr ""
-#: ../../include/acl_selectors.php:286
-msgid "Visible to everybody"
+#: ../../mod/siteinfo.php:101
+msgid ""
+"Suggestions, praise, donations, etc. - please email \"redmatrix\" at "
+"librelist - dot com"
msgstr ""
-#: ../../include/enotify.php:14
-msgid "Friendica Notification"
+#: ../../mod/suggest.php:35
+msgid ""
+"No suggestions available. If this is a new site, please try again in 24 "
+"hours."
msgstr ""
-#: ../../include/enotify.php:17
-msgid "Thank You,"
+#: ../../mod/message.php:41
+msgid "Conversation removed."
msgstr ""
-#: ../../include/enotify.php:19
-#, php-format
-msgid "%s Administrator"
+#: ../../mod/message.php:56
+msgid "No messages."
msgstr ""
-#: ../../include/enotify.php:38
-#, php-format
-msgid "%s <!item_type!>"
+#: ../../mod/message.php:74
+msgid "D, d M Y - g:i A"
msgstr ""
-#: ../../include/enotify.php:42
-#, php-format
-msgid "[Friendica:Notify] New mail received at %s"
+#: ../../mod/pubsites.php:22
+msgid "Public Sites"
msgstr ""
-#: ../../include/enotify.php:44
-#, php-format
-msgid "%1$s sent you a new private message at %2$s."
+#: ../../mod/pubsites.php:25
+msgid ""
+"The listed sites allow public registration into the Red Matrix. All sites in "
+"the matrix are interlinked so membership on any of them conveys membership "
+"in the matrix as a whole. Some sites may require subscription or provide "
+"tiered service plans. The provider links <strong>may</strong> provide "
+"additional details."
msgstr ""
-#: ../../include/enotify.php:45
-#, php-format
-msgid "%1$s sent you %2$s."
+#: ../../mod/pubsites.php:31
+msgid "Site URL"
msgstr ""
-#: ../../include/enotify.php:45
-msgid "a private message"
+#: ../../mod/pubsites.php:31
+msgid "Access Type"
msgstr ""
-#: ../../include/enotify.php:46
-#, php-format
-msgid "Please visit %s to view and/or reply to your private messages."
+#: ../../mod/pubsites.php:31
+msgid "Registration Policy"
msgstr ""
-#: ../../include/enotify.php:87
-#, php-format
-msgid "%1$s commented on [url=%2$s]a %3$s[/url]"
+#: ../../mod/register.php:43
+msgid "Maximum daily site registrations exceeded. Please try again tomorrow."
msgstr ""
-#: ../../include/enotify.php:94
-#, php-format
-msgid "%1$s commented on [url=%2$s]%3$s's %4$s[/url]"
+#: ../../mod/register.php:49
+msgid ""
+"Please indicate acceptance of the Terms of Service. Registration failed."
msgstr ""
-#: ../../include/enotify.php:102
-#, php-format
-msgid "%1$s commented on [url=%2$s]your %3$s[/url]"
+#: ../../mod/register.php:77
+msgid "Passwords do not match."
msgstr ""
-#: ../../include/enotify.php:112
-#, php-format
-msgid "[Friendica:Notify] Comment to conversation #%1$d by %2$s"
+#: ../../mod/register.php:105
+msgid ""
+"Registration successful. Please check your email for validation instructions."
msgstr ""
-#: ../../include/enotify.php:113
-#, php-format
-msgid "%s commented on an item/conversation you have been following."
+#: ../../mod/register.php:111
+msgid "Your registration is pending approval by the site owner."
msgstr ""
-#: ../../include/enotify.php:116 ../../include/enotify.php:131
-#: ../../include/enotify.php:144 ../../include/enotify.php:157
-#, php-format
-msgid "Please visit %s to view and/or reply to the conversation."
+#: ../../mod/register.php:114
+msgid "Your registration can not be processed."
msgstr ""
-#: ../../include/enotify.php:123
-#, php-format
-msgid "[Friendica:Notify] %s posted to your profile wall"
+#: ../../mod/register.php:147
+msgid "Registration on this site/hub is by approval only."
msgstr ""
-#: ../../include/enotify.php:125
-#, php-format
-msgid "%1$s posted to your profile wall at %2$s"
+#: ../../mod/register.php:148
+msgid "<a href=\"pubsites\">Register at another affiliated site/hub</a>"
msgstr ""
-#: ../../include/enotify.php:127
-#, php-format
-msgid "%1$s posted to [url=%2s]your wall[/url]"
+#: ../../mod/register.php:156
+msgid ""
+"This site has exceeded the number of allowed daily account registrations. "
+"Please try again tomorrow."
msgstr ""
-#: ../../include/enotify.php:138
-#, php-format
-msgid "[Friendica:Notify] %s tagged you"
+#: ../../mod/register.php:167
+msgid "Terms of Service"
msgstr ""
-#: ../../include/enotify.php:139
+#: ../../mod/register.php:173
#, php-format
-msgid "%1$s tagged you at %2$s"
+msgid "I accept the %s for this website"
msgstr ""
-#: ../../include/enotify.php:140
+#: ../../mod/register.php:175
#, php-format
-msgid "%1$s [url=%2$s]tagged you[/url]."
+msgid "I am over 13 years of age and accept the %s for this website"
msgstr ""
-#: ../../include/enotify.php:151
-#, php-format
-msgid "[Friendica:Notify] %s tagged your post"
+#: ../../mod/register.php:194
+msgid "Membership on this site is by invitation only."
msgstr ""
-#: ../../include/enotify.php:152
-#, php-format
-msgid "%1$s tagged your post at %2$s"
+#: ../../mod/register.php:195
+msgid "Please enter your invitation code"
msgstr ""
-#: ../../include/enotify.php:153
-#, php-format
-msgid "%1$s tagged [url=%2$s]your post[/url]"
+#: ../../mod/register.php:198
+msgid "Your email address"
msgstr ""
-#: ../../include/enotify.php:164
-msgid "[Friendica:Notify] Introduction received"
+#: ../../mod/register.php:199
+msgid "Choose a password"
msgstr ""
-#: ../../include/enotify.php:165
-#, php-format
-msgid "You've received an introduction from '%1$s' at %2$s"
+#: ../../mod/register.php:200
+msgid "Please re-enter your password"
msgstr ""
-#: ../../include/enotify.php:166
-#, php-format
-msgid "You've received [url=%1$s]an introduction[/url] from %2$s."
+#: ../../mod/regmod.php:12
+msgid "Please login."
msgstr ""
-#: ../../include/enotify.php:169 ../../include/enotify.php:187
-#, php-format
-msgid "You may visit their profile at %s"
+#: ../../mod/removeme.php:49
+msgid "Remove This Channel"
msgstr ""
-#: ../../include/enotify.php:171
-#, php-format
-msgid "Please visit %s to approve or reject the introduction."
+#: ../../mod/removeme.php:50
+msgid ""
+"This will completely remove this channel from the network. Once this has "
+"been done it is not recoverable."
msgstr ""
-#: ../../include/enotify.php:178
-msgid "[Friendica:Notify] Friend suggestion received"
+#: ../../mod/removeme.php:51
+msgid "Please enter your password for verification:"
msgstr ""
-#: ../../include/enotify.php:179
-#, php-format
-msgid "You've received a friend suggestion from '%1$s' at %2$s"
+#: ../../mod/removeme.php:52
+msgid "Remove this channel and all its clones from the network"
msgstr ""
-#: ../../include/enotify.php:180
-#, php-format
-msgid "You've received [url=%1$s]a friend suggestion[/url] for %2$s from %3$s."
+#: ../../mod/removeme.php:52
+msgid ""
+"By default only the instance of the channel located on this hub will be "
+"removed from the network"
msgstr ""
-#: ../../include/enotify.php:185
-msgid "Name:"
+#: ../../mod/removeme.php:53
+msgid "Remove My Account"
msgstr ""
-#: ../../include/enotify.php:186
-msgid "Photo:"
+#: ../../mod/item.php:145
+msgid "Unable to locate original post."
msgstr ""
-#: ../../include/enotify.php:189
-#, php-format
-msgid "Please visit %s to approve or reject the suggestion."
+#: ../../mod/item.php:343
+msgid "Empty post discarded."
msgstr ""
-#: ../../include/follow.php:32
-msgid "Connect URL missing."
+#: ../../mod/item.php:385
+msgid "Executable content type not permitted to this channel."
msgstr ""
-#: ../../include/follow.php:59
-msgid ""
-"This site is not configured to allow communications with other networks."
+#: ../../mod/item.php:812
+msgid "System error. Post not saved."
msgstr ""
-#: ../../include/follow.php:60 ../../include/follow.php:80
-msgid "No compatible communication protocols or feeds were discovered."
+#: ../../mod/item.php:1148
+#, php-format
+msgid "You have reached your limit of %1$.0f top level posts."
msgstr ""
-#: ../../include/follow.php:78
-msgid "The profile address specified does not provide adequate information."
+#: ../../mod/item.php:1154
+#, php-format
+msgid "You have reached your limit of %1$.0f webpages."
msgstr ""
-#: ../../include/follow.php:82
-msgid "An author or name was not found."
+#: ../../mod/mood.php:138
+msgid "Mood"
msgstr ""
-#: ../../include/follow.php:84
-msgid "No browser URL could be matched to this address."
+#: ../../mod/mood.php:139
+msgid "Set your current mood and tell your friends"
msgstr ""
-#: ../../include/follow.php:86
-msgid ""
-"Unable to match @-style Identity Address with a known protocol or email "
-"contact."
+#: ../../mod/ping.php:160
+msgid "sent you a private message"
msgstr ""
-#: ../../include/follow.php:87
-msgid "Use mailto: in front of address to force email check."
+#: ../../mod/ping.php:218
+msgid "added your channel"
msgstr ""
-#: ../../include/follow.php:93
-msgid ""
-"The profile address specified belongs to a network which has been disabled "
-"on this site."
+#: ../../mod/ping.php:262
+msgid "posted an event"
msgstr ""
-#: ../../include/follow.php:103
-msgid ""
-"Limited profile. This person will be unable to receive direct/personal "
-"notifications from you."
+#: ../../mod/dirprofile.php:111
+msgid "Status: "
msgstr ""
-#: ../../include/follow.php:205
-msgid "Unable to retrieve contact information."
+#: ../../mod/dirprofile.php:112
+msgid "Sexual Preference: "
msgstr ""
-#: ../../include/follow.php:259
-msgid "following"
+#: ../../mod/dirprofile.php:114
+msgid "Homepage: "
msgstr ""
-#: ../../include/items.php:2890
-msgid "A new person is sharing with you at "
+#: ../../mod/dirprofile.php:115
+msgid "Hometown: "
msgstr ""
-#: ../../include/items.php:2890
-msgid "You have a new follower at "
+#: ../../mod/dirprofile.php:117
+msgid "About: "
msgstr ""
-#: ../../include/items.php:3522
-msgid "Archives"
+#: ../../mod/dirprofile.php:163
+msgid "Keywords: "
msgstr ""
-#: ../../include/bb2diaspora.php:226 ../../include/bb2diaspora.php:236
-#: ../../include/bb2diaspora.php:237
-msgid "image/photo"
+#: ../../view/theme/redbasic/php/config.php:74
+msgid "Scheme Default"
msgstr ""
-#: ../../include/user.php:38
-msgid "An invitation is required."
+#: ../../view/theme/redbasic/php/config.php:75
+msgid "red"
msgstr ""
-#: ../../include/user.php:43
-msgid "Invitation could not be verified."
+#: ../../view/theme/redbasic/php/config.php:76
+msgid "black"
msgstr ""
-#: ../../include/user.php:51
-msgid "Invalid OpenID url"
+#: ../../view/theme/redbasic/php/config.php:77
+msgid "silver"
msgstr ""
-#: ../../include/user.php:66
-msgid "Please enter the required information."
+#: ../../view/theme/redbasic/php/config.php:88
+#: ../../view/theme/apw/php/config.php:234
+#: ../../view/theme/blogga/view/theme/blog/config.php:69
+#: ../../view/theme/blogga/php/config.php:69
+msgid "Theme settings"
msgstr ""
-#: ../../include/user.php:80
-msgid "Please use a shorter name."
+#: ../../view/theme/redbasic/php/config.php:89
+#: ../../view/theme/apw/php/config.php:235
+msgid "Set scheme"
msgstr ""
-#: ../../include/user.php:82
-msgid "Name too short."
+#: ../../view/theme/redbasic/php/config.php:90
+msgid "Navigation bar colour"
msgstr ""
-#: ../../include/user.php:97
-msgid "That doesn't appear to be your full (First Last) name."
+#: ../../view/theme/redbasic/php/config.php:91
+msgid "Set font-colour for banner"
msgstr ""
-#: ../../include/user.php:102
-msgid "Your email domain is not among those allowed on this site."
+#: ../../view/theme/redbasic/php/config.php:92
+msgid "Set the background colour"
msgstr ""
-#: ../../include/user.php:105
-msgid "Not a valid email address."
+#: ../../view/theme/redbasic/php/config.php:93
+msgid "Set the background image"
msgstr ""
-#: ../../include/user.php:115
-msgid "Cannot use that email."
+#: ../../view/theme/redbasic/php/config.php:94
+msgid "Set the background colour of items"
msgstr ""
-#: ../../include/user.php:121
-msgid ""
-"Your \"nickname\" can only contain \"a-z\", \"0-9\", \"-\", and \"_\", and "
-"must also begin with a letter."
+#: ../../view/theme/redbasic/php/config.php:95
+msgid "Set the opacity of items"
msgstr ""
-#: ../../include/user.php:127 ../../include/user.php:225
-msgid "Nickname is already registered. Please choose another."
+#: ../../view/theme/redbasic/php/config.php:96
+msgid "Set the basic colour for item icons"
msgstr ""
-#: ../../include/user.php:137
-msgid ""
-"Nickname was once registered here and may not be re-used. Please choose "
-"another."
+#: ../../view/theme/redbasic/php/config.php:97
+msgid "Set the hover colour for item icons"
msgstr ""
-#: ../../include/user.php:153
-msgid "SERIOUS ERROR: Generation of security keys failed."
+#: ../../view/theme/redbasic/php/config.php:98
+msgid "Set font-size for the entire application"
msgstr ""
-#: ../../include/user.php:211
-msgid "An error occurred during registration. Please try again."
+#: ../../view/theme/redbasic/php/config.php:99
+#: ../../view/theme/apw/php/config.php:236
+msgid "Set font-size for posts and comments"
msgstr ""
-#: ../../include/user.php:246
-msgid "An error occurred creating your default profile. Please try again."
+#: ../../view/theme/redbasic/php/config.php:100
+msgid "Set font-colour for posts and comments"
msgstr ""
-#: ../../include/security.php:21
-msgid "Welcome "
+#: ../../view/theme/redbasic/php/config.php:101
+msgid "Set radius of corners"
msgstr ""
-#: ../../include/security.php:22
-msgid "Please upload a profile photo."
+#: ../../view/theme/redbasic/php/config.php:102
+msgid "Set shadow depth of photos"
msgstr ""
-#: ../../include/security.php:25
-msgid "Welcome back "
+#: ../../view/theme/redbasic/php/config.php:103
+msgid "Set maximum width of conversation regions"
msgstr ""
-#: ../../include/security.php:329
-msgid ""
-"The form security token was not correct. This probably happened because the "
-"form has been opened for too long (>3 hours) before submitting it."
+#: ../../view/theme/redbasic/php/config.php:104
+msgid "Set minimum opacity of nav bar - to hide it"
msgstr ""
-#: ../../include/Contact.php:111
-msgid "stopped following"
+#: ../../view/theme/redbasic/php/config.php:105
+msgid "Set size of conversation author photo"
msgstr ""
-#: ../../include/Contact.php:218 ../../include/conversation.php:842
-msgid "View Status"
+#: ../../view/theme/redbasic/php/config.php:106
+msgid "Set size of followup author photos"
msgstr ""
-#: ../../include/Contact.php:219 ../../include/conversation.php:843
-msgid "View Profile"
+#: ../../view/theme/redbasic/php/config.php:107
+msgid "Sloppy photo albums"
msgstr ""
-#: ../../include/Contact.php:220 ../../include/conversation.php:844
-msgid "View Photos"
+#: ../../view/theme/redbasic/php/config.php:107
+msgid "Are you a clean desk or a messy desk person?"
msgstr ""
-#: ../../include/Contact.php:221 ../../include/Contact.php:234
-#: ../../include/conversation.php:845
-msgid "Network Posts"
+#: ../../view/theme/apw/php/config.php:193
+#: ../../view/theme/apw/php/config.php:211
+msgid "Schema Default"
msgstr ""
-#: ../../include/Contact.php:222 ../../include/Contact.php:234
-#: ../../include/conversation.php:846
-msgid "Edit Contact"
+#: ../../view/theme/apw/php/config.php:194
+msgid "Sans-Serif"
msgstr ""
-#: ../../include/Contact.php:223 ../../include/Contact.php:234
-#: ../../include/conversation.php:847
-msgid "Send PM"
+#: ../../view/theme/apw/php/config.php:195
+msgid "Monospace"
msgstr ""
-#: ../../include/conversation.php:163
-msgid "post/item"
+#: ../../view/theme/apw/php/config.php:237
+msgid "Set font face"
msgstr ""
-#: ../../include/conversation.php:164
-#, php-format
-msgid "%1$s marked %2$s's %3$s as favorite"
+#: ../../view/theme/apw/php/config.php:238
+msgid "Set iconset"
msgstr ""
-#: ../../include/conversation.php:750
-msgid "Delete Selected Items"
+#: ../../view/theme/apw/php/config.php:239
+msgid "Set big shadow size, default 15px 15px 15px"
msgstr ""
-#: ../../include/conversation.php:905
-#, php-format
-msgid "%s likes this."
+#: ../../view/theme/apw/php/config.php:240
+msgid "Set small shadow size, default 5px 5px 5px"
msgstr ""
-#: ../../include/conversation.php:905
-#, php-format
-msgid "%s doesn't like this."
+#: ../../view/theme/apw/php/config.php:241
+msgid "Set shadow colour, default #000"
msgstr ""
-#: ../../include/conversation.php:909
-#, php-format
-msgid "<span %1$s>%2$d people</span> like this."
+#: ../../view/theme/apw/php/config.php:242
+msgid "Set radius size, default 5px"
msgstr ""
-#: ../../include/conversation.php:911
-#, php-format
-msgid "<span %1$s>%2$d people</span> don't like this."
+#: ../../view/theme/apw/php/config.php:243
+msgid "Set line-height for posts and comments"
msgstr ""
-#: ../../include/conversation.php:917
-msgid "and"
+#: ../../view/theme/apw/php/config.php:244
+msgid "Set background image"
msgstr ""
-#: ../../include/conversation.php:920
-#, php-format
-msgid ", and %d other people"
+#: ../../view/theme/apw/php/config.php:245
+msgid "Set background colour"
msgstr ""
-#: ../../include/conversation.php:921
-#, php-format
-msgid "%s like this."
+#: ../../view/theme/apw/php/config.php:246
+msgid "Set section background image"
msgstr ""
-#: ../../include/conversation.php:921
-#, php-format
-msgid "%s don't like this."
+#: ../../view/theme/apw/php/config.php:247
+msgid "Set section background colour"
msgstr ""
-#: ../../include/conversation.php:946
-msgid "Visible to <strong>everybody</strong>"
+#: ../../view/theme/apw/php/config.php:248
+msgid "Set colour of items - use hex"
msgstr ""
-#: ../../include/conversation.php:948
-msgid "Please enter a video link/URL:"
+#: ../../view/theme/apw/php/config.php:249
+msgid "Set colour of links - use hex"
msgstr ""
-#: ../../include/conversation.php:949
-msgid "Please enter an audio link/URL:"
+#: ../../view/theme/apw/php/config.php:250
+msgid "Set max-width for items. Default 400px"
msgstr ""
-#: ../../include/conversation.php:950
-msgid "Tag term:"
+#: ../../view/theme/apw/php/config.php:251
+msgid "Set min-width for items. Default 240px"
msgstr ""
-#: ../../include/conversation.php:952
-msgid "Where are you right now?"
+#: ../../view/theme/apw/php/config.php:252
+msgid "Set the generic content wrapper width. Default 48%"
msgstr ""
-#: ../../include/conversation.php:995
-msgid "upload photo"
+#: ../../view/theme/apw/php/config.php:253
+msgid "Set colour of fonts - use hex"
msgstr ""
-#: ../../include/conversation.php:997
-msgid "attach file"
+#: ../../view/theme/apw/php/config.php:254
+msgid "Set background-size element"
msgstr ""
-#: ../../include/conversation.php:999
-msgid "web link"
+#: ../../view/theme/apw/php/config.php:255
+msgid "Item opacity"
msgstr ""
-#: ../../include/conversation.php:1000
-msgid "Insert video link"
+#: ../../view/theme/apw/php/config.php:256
+msgid "Display post previews only"
msgstr ""
-#: ../../include/conversation.php:1001
-msgid "video link"
+#: ../../view/theme/apw/php/config.php:257
+msgid "Display side bar on channel page"
msgstr ""
-#: ../../include/conversation.php:1002
-msgid "Insert audio link"
+#: ../../view/theme/apw/php/config.php:258
+msgid "Colour of the navigation bar"
msgstr ""
-#: ../../include/conversation.php:1003
-msgid "audio link"
+#: ../../view/theme/apw/php/config.php:259
+msgid "Item float"
msgstr ""
-#: ../../include/conversation.php:1005
-msgid "set location"
+#: ../../view/theme/apw/php/config.php:260
+msgid "Left offset of the section element"
msgstr ""
-#: ../../include/conversation.php:1007
-msgid "clear location"
+#: ../../view/theme/apw/php/config.php:261
+msgid "Right offset of the section element"
msgstr ""
-#: ../../include/conversation.php:1014
-msgid "permissions"
+#: ../../view/theme/apw/php/config.php:262
+msgid "Section width"
msgstr ""
-#: ../../include/plugin.php:388 ../../include/plugin.php:390
-msgid "Click here to upgrade."
+#: ../../view/theme/apw/php/config.php:263
+msgid "Left offset of the aside"
msgstr ""
-#: ../../include/plugin.php:396
-msgid "This action exceeds the limits set by your subscription plan."
+#: ../../view/theme/apw/php/config.php:264
+msgid "Right offset of the aside element"
msgstr ""
-#: ../../include/plugin.php:401
-msgid "This action is not available under your subscription plan."
+#: ../../view/theme/blogga/view/theme/blog/config.php:47
+#: ../../view/theme/blogga/php/config.php:47
+msgid "None"
msgstr ""
-#: ../../boot.php:563
-msgid "Delete this item?"
+#: ../../view/theme/blogga/view/theme/blog/config.php:70
+#: ../../view/theme/blogga/php/config.php:70
+msgid "Header image"
msgstr ""
-#: ../../boot.php:566
-msgid "show fewer"
+#: ../../view/theme/blogga/view/theme/blog/config.php:71
+#: ../../view/theme/blogga/php/config.php:71
+msgid "Header image only on profile pages"
msgstr ""
-#: ../../boot.php:761
+#: ../../boot.php:1224
#, php-format
msgid "Update %s failed. See error logs."
msgstr ""
-#: ../../boot.php:763
+#: ../../boot.php:1227
#, php-format
msgid "Update Error at %s"
msgstr ""
-#: ../../boot.php:863
-msgid "Create a New Account"
-msgstr ""
-
-#: ../../boot.php:887
-msgid "Nickname or Email address: "
+#: ../../boot.php:1391
+msgid ""
+"Create an account to access services and applications within the Red Matrix"
msgstr ""
-#: ../../boot.php:888
-msgid "Password: "
+#: ../../boot.php:1419
+msgid "Password"
msgstr ""
-#: ../../boot.php:891
-msgid "Or login using OpenID: "
+#: ../../boot.php:1420
+msgid "Remember me"
msgstr ""
-#: ../../boot.php:897
+#: ../../boot.php:1425
msgid "Forgot your password?"
msgstr ""
-#: ../../boot.php:1064
-msgid "Edit profile"
-msgstr ""
-
-#: ../../boot.php:1124
-msgid "Message"
-msgstr ""
-
-#: ../../boot.php:1240 ../../boot.php:1319
-msgid "g A l F d"
-msgstr ""
-
-#: ../../boot.php:1241 ../../boot.php:1320
-msgid "F d"
-msgstr ""
-
-#: ../../boot.php:1286 ../../boot.php:1360
-msgid "[today]"
-msgstr ""
-
-#: ../../boot.php:1298
-msgid "Birthday Reminders"
-msgstr ""
-
-#: ../../boot.php:1299
-msgid "Birthdays this week:"
-msgstr ""
-
-#: ../../boot.php:1353
-msgid "[No description]"
-msgstr ""
-
-#: ../../boot.php:1371
-msgid "Event Reminders"
-msgstr ""
-
-#: ../../boot.php:1372
-msgid "Events this week:"
+#: ../../boot.php:1490
+msgid "permission denied"
msgstr ""
-#: ../../boot.php:1577
-msgid "Status Messages and Posts"
-msgstr ""
-
-#: ../../boot.php:1583
-msgid "Profile Details"
-msgstr ""
-
-#: ../../boot.php:1598
-msgid "Events and Calendar"
+#: ../../boot.php:1491
+msgid "Got Zot?"
msgstr ""
-#: ../../boot.php:1604
-msgid "Only You Can See This"
+#: ../../boot.php:1887
+msgid "toggle mobile"
msgstr ""
diff --git a/util/pconfig b/util/pconfig
new file mode 100755
index 000000000..baa786a03
--- /dev/null
+++ b/util/pconfig
@@ -0,0 +1,34 @@
+#!/usr/bin/env php
+<?php
+
+// Red pconfig utility
+
+require_once('include/cli_startup.php');
+
+cli_startup();
+
+if($argc > 4) {
+ set_pconfig($argv[1],$argv[2],$argv[3],$argv[4]);
+ echo "pconfig[{$argv[1]}][{$argv[2]}][{$argv[3]}] = " . get_pconfig($argv[1],$argv[2],$argv[3]) . "\n";
+}
+
+if($argc == 4) {
+ echo "pconfig[{$argv[1]}][{$argv[2]}][{$argv[3]}] = " . get_pconfig($argv[1],$argv[2],$argv[3]) . "\n";
+}
+
+if($argc == 3) {
+ load_pconfig($argv[1],$argv[2]);
+ foreach($a->config[$argv[1]][$argv[2]] as $k => $x) {
+ echo "pconfig[{$argv[1]}][{$argv[2]}][{$k}] = " . $x . "\n";
+ }
+}
+
+if($argc == 2) {
+ $r = q("select * from pconfig where uid = " . intval($argv[1]));
+ if($r) {
+ foreach($r as $rr) {
+ echo "pconfig[{$rr['uid']}][{$rr['cat']}][{$rr['k']}] = " . $rr['v'] . "\n";
+ }
+ }
+}
+
diff --git a/util/precompile_smarty3.php b/util/precompile_smarty3.php
new file mode 100755
index 000000000..65cb760ef
--- /dev/null
+++ b/util/precompile_smarty3.php
@@ -0,0 +1,27 @@
+<?php
+
+
+/**
+* @package util
+*/
+
+#require_once('boot.php');
+#require_once('include/cli_startup.php');
+require_once "library/Smarty/libs/Smarty.class.php";
+
+#cli_startup();
+
+$folders = array_merge(array('view/tpl/'),glob('view/theme/*/tpl/*',GLOB_ONLYDIR));
+
+$s = new Smarty();
+
+$s->setTemplateDir($folders);
+
+$s->setCompileDir('view/tpl/smarty3/compiled/');
+$s->setConfigDir('view/tpl/smarty3/config/');
+$s->setCacheDir('view/tpl/smarty3/cache/');
+
+$s->left_delimiter = "{{";
+$s->right_delimiter = "}}";
+
+$s->compileAllTemplates('.tpl',true); \ No newline at end of file
diff --git a/util/run_xgettext.sh b/util/run_xgettext.sh
index 6ea603c83..73f28cabb 100755
--- a/util/run_xgettext.sh
+++ b/util/run_xgettext.sh
@@ -1,37 +1,81 @@
#!/bin/bash
FULLPATH=$(dirname $(readlink -f "$0"))
-cd "$FULLPATH/../view/en/"
-F9KVERSION=$(sed -n "s/.*'FRIENDICA_VERSION'.*'\([0-9.]*\)'.*/\1/p" ../../boot.php);
-
-echo "Friendica version $F9KVERSION"
+ADDONMODE=
+ADDONNAME=
+if [ "$1" == "--addon" -o "$1" == "-a" ]
+then
+ ADDONMODE=1
+ if [ -z $2 ]; then echo -e "ERROR: missing addon name\n\nrun_xgettext.sh -a <addonname>"; exit 1; fi
+ ADDONNAME=$2
+ if [ ! -d "$FULLPATH/../addon/$ADDONNAME" ]; then echo "ERROR: addon '$ADDONNAME' not found"; exit 2; fi
+fi
-OPTS=
-OUTFILE="$FULLPATH/messages.po"
-if [ "" != "$1" ]
+if [ $ADDONMODE ]
then
- OUTFILE="$(readlink -f ${FULLPATH}/$1)"
- if [ -e "$OUTFILE" ]
- then
- echo "join extracted strings"
- OPTS="-j"
- fi
+ cd "$FULLPATH/../addon/$ADDONNAME"
+ mkdir -p "$FULLPATH/../addon/$ADDONNAME/lang/C"
+ OUTFILE="$FULLPATH/../addon/$ADDONNAME/lang/C/messages.po"
+ FINDSTARTDIR="."
+ FINDOPTS=
+else
+ cd "$FULLPATH/../view/en/"
+ OUTFILE="$FULLPATH/messages.po"
+ FINDSTARTDIR="../../"
+ # skip addon folder
+ FINDOPTS="-wholename */addon -prune -o"
fi
+
+F9KVERSION=$(cat ../../version.inc);
+
+echo "Red version $F9KVERSION"
+
+OPTS=
+
+#if [ "" != "$1" ]
+#then
+# OUTFILE="$(readlink -f ${FULLPATH}/$1)"
+# if [ -e "$OUTFILE" ]
+# then
+# echo "join extracted strings"
+# OPTS="-j"
+# fi
+#fi
+
KEYWORDS="-k -kt -ktt:1,2"
echo "extract strings to $OUTFILE.."
-find ../../ -name "*.php" | xargs xgettext $KEYWORDS $OPTS -o "$OUTFILE" --from-code=UTF-8
-echo "setup base info.."
-sed -i "s/SOME DESCRIPTIVE TITLE./FRIENDICA Distributed Social Network/g" "$OUTFILE"
-sed -i "s/YEAR THE PACKAGE'S COPYRIGHT HOLDER/2010, 2011 the Friendica Project/g" "$OUTFILE"
-sed -i "s/FIRST AUTHOR <EMAIL@ADDRESS>, YEAR./Mike Macgirvin, 2010/g" "$OUTFILE"
-sed -i "s/PACKAGE VERSION/$F9KVERSION/g" "$OUTFILE"
-sed -i "s/PACKAGE/Friendica/g" "$OUTFILE"
-sed -i "s/CHARSET/UTF-8/g" "$OUTFILE"
-sed -i "s/^\"Plural-Forms/#\"Plural-Forms/g" "$OUTFILE"
+echo "extract strings to $OUTFILE.."
+rm "$OUTFILE"; touch "$OUTFILE"
+for f in $(find "$FINDSTARTDIR" $FINDOPTS -name "*.php" -type f)
+do
+ if [ ! -d "$f" ]
+ then
+ xgettext $KEYWORDS $OPTS -j -o "$OUTFILE" --from-code=UTF-8 "$f" > /dev/null 2>&1
+ fi
+done
+echo "setup base info.."
+if [ $ADDONMODE ]
+then
+ sed -i "s/SOME DESCRIPTIVE TITLE./ADDON $ADDONNAME/g" "$OUTFILE"
+ sed -i "s/YEAR THE PACKAGE'S COPYRIGHT HOLDER//g" "$OUTFILE"
+ sed -i "s/FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.//g" "$OUTFILE"
+ sed -i "s/PACKAGE VERSION//g" "$OUTFILE"
+ sed -i "s/PACKAGE/RedMatrix $ADDONNAME addon/g" "$OUTFILE"
+ sed -i "s/CHARSET/UTF-8/g" "$OUTFILE"
+ sed -i "s/^\"Plural-Forms/#\"Plural-Forms/g" "$OUTFILE"
+else
+ sed -i "s/SOME DESCRIPTIVE TITLE./Red Communications Project/g" "$OUTFILE"
+ sed -i "s/YEAR THE PACKAGE'S COPYRIGHT HOLDER/2012-2014 the Red Matrix Project/g" "$OUTFILE"
+ sed -i "s/FIRST AUTHOR <EMAIL@ADDRESS>, YEAR./Mike Macgirvin, 2013/g" "$OUTFILE"
+ sed -i "s/PACKAGE VERSION/$F9KVERSION/g" "$OUTFILE"
+ sed -i "s/PACKAGE/Red/g" "$OUTFILE"
+ sed -i "s/CHARSET/UTF-8/g" "$OUTFILE"
+ sed -i "s/^\"Plural-Forms/#\"Plural-Forms/g" "$OUTFILE"
+fi
echo "done."
diff --git a/util/shred/FriendicaOAuth.sh b/util/shred/FriendicaOAuth.sh
new file mode 100755
index 000000000..67f64b6eb
--- /dev/null
+++ b/util/shred/FriendicaOAuth.sh
@@ -0,0 +1,173 @@
+#!/bin/bash
+# Copyright (c) 2012 Fabio Comuni
+# Copyright (c) 2012 Michael Nowack
+# Copyright (c) 2010, 2012 Yu-Jie Lin
+#
+# 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.
+
+FRIENDICAOAUTH_VERSION=0.1.1
+
+F_API_VERSION="1"
+
+# Friendica API endpoints
+
+F_ACCOUNF_UPDATE_PROFILE_IMAGE="${redmatrix_url}/api/account/update_profile_image"
+F_STATUSES_UPDATE="${redmatrix_url}/api/statuses/update"
+F_STATUSES_HOME_TIMELINE="${redmatrix_url}/api/statuses/home_timeline"
+
+F_REQUESF_TOKEN=${redmatrix_url}'/api/oauth/request_token'
+F_ACCESS_TOKEN=${redmatrix_url}'/api/oauth/access_token'
+F_AUTHORIZE_TOKEN=${redmatrix_url}'/api/oauth/authorize'
+
+# Source OAuth.sh
+
+OAuth_sh=$(which OAuth.sh)
+(( $? != 0 )) && echo 'Unable to locate OAuth.sh! Make sure it is in searching PATH.' && exit 1
+source "$OAuth_sh"
+
+FO_debug () {
+ # Print out all parameters, each in own line
+ [[ "$FO_DEBUG" == "" ]] && return
+ local t=$(date +%FT%T.%N)
+ while (( $# > 0 )); do
+ echo "[FO][DEBUG][$t] $1"
+ shift 1
+ done
+ }
+
+FO_extract_value () {
+ # $1 key name
+ # $2 string to find
+ egrep -o "$1=[a-zA-Z0-9-]*" <<< "$2" | cut -d\= -f 2
+ }
+
+
+FO_init() {
+ # Initialize FriendicaOAuth
+ oauth_version='1.0'
+ oauth_signature_method='HMAC-SHA1'
+ oauth_basic_params=(
+ $(OAuth_param 'oauth_consumer_key' "$oauth_consumer_key")
+ $(OAuth_param 'oauth_signature_method' "$oauth_signature_method")
+ $(OAuth_param 'oauth_version' "$oauth_version")
+ )
+ }
+
+FO_access_token_helper () {
+ # Help guide user to get access token
+
+ local resp PIN
+
+ # Request Token
+
+ local auth_header="$(_OAuth_authorization_header 'Authorization' "$redmatrix_url/" "$oauth_consumer_key" "$oauth_consumer_secret" '' '' "$oauth_signature_method" "$oauth_version" "$(OAuth_nonce)" "$(OAuth_timestamp)" 'POST' "$F_REQUESF_TOKEN" "$(OAuth_param 'oauth_callback' 'oob')"), $(OAuth_param_quote 'oauth_callback' 'oob')"
+
+# echo $auth_header
+# echo $F_REQUESF_TOKEN
+
+ resp=$(curl -s -d '' -H "$auth_header" "$F_REQUESF_TOKEN")
+ FO_rval=$?
+ (( $? != 0 )) && return $FO_rval
+
+ local _oauth_token=$(FO_extract_value 'oauth_token' "$resp")
+ local _oauth_token_secret=$(FO_extract_value 'oauth_token_secret' "$resp")
+
+ echo 'Please go to the following link to get the PIN:'
+ echo " ${F_AUTHORIZE_TOKEN}?oauth_token=$_oauth_token"
+
+ read -p 'PIN: ' PIN
+
+ # Access Token
+
+ local auth_header="$(_OAuth_authorization_header 'Authorization' "$redmatrix_url/" "$oauth_consumer_key" "$oauth_consumer_secret" "$_oauth_token" "$_oauth_token_secret" "$oauth_signature_method" "$oauth_version" "$(OAuth_nonce)" "$(OAuth_timestamp)" 'POST' "$F_ACCESS_TOKEN" "$(OAuth_param 'oauth_verifier' "$PIN")"), $(OAuth_param_quote 'oauth_verifier' "$PIN")"
+
+ resp=$(curl -s -d "" -H "$auth_header" "$F_ACCESS_TOKEN")
+ FO_rval=$?
+ (( $? != 0 )) && return $FO_rval
+
+ FO_ret=(
+ $(FO_extract_value 'oauth_token' "$resp")
+ $(FO_extract_value 'oauth_token_secret' "$resp")
+ $(FO_extract_value 'user_id' "$resp")
+ $(FO_extract_value 'screen_name' "$resp")
+ )
+ }
+
+# APIs
+######
+
+FO_statuses_update () {
+ # $1 format
+ # $2 status
+ # $3 in_reply_to_status_id
+ # The followins are not implemented yet:
+ # $4 lat
+ # $5 long
+ # $6 place_id
+ # $7 display_coordinates
+ local format="$1"
+ [[ "$format" == "" ]] && format="xml"
+
+ local params=(
+ $(OAuth_param 'status' "$2")
+ )
+
+ params[${#params[@]}]=$(OAuth_param 'source' "shred")
+
+ [[ "$3" != "" ]] && params[${#params[@]}]=$(OAuth_param 'in_reply_to_status_id' "$3") && local in_reply_to_status_id=( '--data-urlencode' "in_reply_to_status_id=$3" )
+
+
+ local auth_header=$(OAuth_authorization_header 'Authorization' "$redmatrix_url" '' '' 'POST' "$F_STATUSES_UPDATE.$format" ${params[@]})
+
+
+ FO_ret=$(curl -s -H "$auth_header" --data-urlencode "status=$2" --data-urlencode "source=shred" ${in_reply_to_status_id[@]} "$F_STATUSES_UPDATE.$format")
+
+ FO_rval=$?
+ return $FO_rval
+ }
+
+
+# gets the user home_timeline.
+#
+# @sets FO_ret API response
+# @returns status
+# @public
+FO_statuses_home_timeline () {
+ # $1 format
+ # $2 screen_name
+ # $3 count
+ local format="$1"
+ local screen_name="$2"
+ local count="$3"
+ [[ "$format" == "" ]] && format="xml"
+ [[ "$count" == "" ]] && count=1
+
+ local params=(
+ $(OAuth_param 'screen_name' $screen_name)
+ $(OAuth_param 'count' $count)
+ )
+g
+ local auth_header=$(OAuth_authorization_header 'Authorization' "$redmatrix_url" '' '' 'GET' "$F_STATUSES_HOME_TIMELINE.$format" ${params[@]})
+
+ convscreen=$(OAuth_PE "$screen_name");
+ FO_ret=$(curl -s --get "${F_STATUSES_HOME_TIMELINE}.${format}" --data "screen_name=${convscreen}&count=${count}" --header "${auth_header}")
+ FO_rval=$?
+
+ return $FO_rval
+ }
diff --git a/util/shred/JSON.sh b/util/shred/JSON.sh
new file mode 100755
index 000000000..65f5f1f66
--- /dev/null
+++ b/util/shred/JSON.sh
@@ -0,0 +1,129 @@
+# The MIT License
+#
+# Copyright (c) 2011 Dominic Tarr
+#
+# 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.
+#
+#
+# https://github.com/dominictarr/JSON.sh
+#
+throw () {
+ echo "$*" >&2
+ exit 1
+}
+
+tokenize () {
+ local ESCAPE='(\\[^u[:cntrl:]]|\\u[0-9a-fA-F]{4})'
+ local CHAR='[^[:cntrl:]"\\]'
+ local STRING="\"$CHAR*($ESCAPE$CHAR*)*\""
+ local NUMBER='-?(0|[1-9][0-9]*)([.][0-9]*)?([eE][+-]?[0-9]*)?'
+ local KEYWORD='null|false|true'
+ local SPACE='[[:space:]]+'
+ egrep -ao "$STRING|$NUMBER|$KEYWORD|$SPACE|." --color=never |
+ egrep -v "^$SPACE$" # eat whitespace
+}
+
+parse_array () {
+ local index=0
+ local ary=''
+ read -r token
+ case "$token" in
+ ']') ;;
+ *)
+ while :
+ do
+ parse_value "$1" "$index"
+ let index=$index+1
+ ary="$ary""$value"
+ read -r token
+ case "$token" in
+ ']') break ;;
+ ',') ary="$ary," ;;
+ *) throw "EXPECTED , or ] GOT ${token:-EOF}" ;;
+ esac
+ read -r token
+ done
+ ;;
+ esac
+ value=`printf '[%s]' "$ary"`
+}
+
+parse_object () {
+ local key
+ local obj=''
+ read -r token
+ case "$token" in
+ '}') ;;
+ *)
+ while :
+ do
+ case "$token" in
+ '"'*'"') key=$token ;;
+ *) throw "EXPECTED string GOT ${token:-EOF}" ;;
+ esac
+ read -r token
+ case "$token" in
+ ':') ;;
+ *) throw "EXPECTED : GOT ${token:-EOF}" ;;
+ esac
+ read -r token
+ parse_value "$1" "$key"
+ obj="$obj$key:$value"
+ read -r token
+ case "$token" in
+ '}') break ;;
+ ',') obj="$obj," ;;
+ *) throw "EXPECTED , or } GOT ${token:-EOF}" ;;
+ esac
+ read -r token
+ done
+ ;;
+ esac
+ value=`printf '{%s}' "$obj"`
+}
+
+parse_value () {
+ local jpath="${1:+$1,}$2"
+ case "$token" in
+ '{') parse_object "$jpath" ;;
+ '[') parse_array "$jpath" ;;
+ # At this point, the only valid single-character tokens are digits.
+ ''|[^0-9]) throw "EXPECTED value GOT ${token:-EOF}" ;;
+ *) value=$token ;;
+ esac
+ printf "[%s]\t%s\n" "$jpath" "$value"
+}
+
+parse () {
+ read -r token
+ parse_value
+ read -r token
+ case "$token" in
+ '') ;;
+ *) throw "EXPECTED EOF GOT $token" ;;
+ esac
+}
+
+if [ $0 = $BASH_SOURCE ];
+then
+ tokenize | parse
+fi
diff --git a/util/shred/OAuth.sh b/util/shred/OAuth.sh
new file mode 100755
index 000000000..4be4ed35b
--- /dev/null
+++ b/util/shred/OAuth.sh
@@ -0,0 +1,214 @@
+#!/bin/bash
+# Copyright (c) 2010, 2012 Yu-Jie Lin
+#
+# 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.
+
+BASHOAUTH_VERSION=0.1.2
+
+OAuth_debug () {
+ # Print out all parameters, each in own line
+ [[ "$OAUTH_DEBUG" == "" ]] && return
+ local t=$(date +%FT%T.%N)
+ while (( $# > 0 )); do
+ echo "[OAuth][DEBUG][$t] $1"
+ shift 1
+ done
+ }
+
+OAuth_nonce () {
+ # Return a nonce
+ md5sum <<< "$RANDOM-$(date +%s.%N)" | cut -d' ' -f 1
+ }
+
+OAuth_timestamp () {
+ # Return timestamp
+ echo "$(date +%s)"
+ }
+
+OAuth_PE () {
+ # Encode $1 using Percent-encoding as defined in
+ # http://tools.ietf.org/html/rfc5849#section-3.6
+ # Any character other than [a-zA-Z0-9-._~] is converted into format %XX
+ [ -n "$1" ] \
+ && echo -n "$1" | perl -p -e 's/([^A-Za-z0-9-._~])/sprintf("%%%02X", ord($1))/seg'
+}
+
+OAuth_PE_file () {
+ # Encode a file $1 using Percent-encoding as defined in
+ # http://tools.ietf.org/html/rfc5849#section-3.6
+ # $1 a filename, not the content of file
+ perl -p -e 's/([^A-Za-z0-9-._~])/sprintf("%%%02X", ord($1))/seg' < "$1"
+}
+
+OAuth_params_string () {
+ # Sort the paramters and join them into one-line string
+ while (( $# > 0 )); do
+ echo $1
+ shift 1
+ done | sort | tr '\n' '&' | sed 's/&$//'
+ }
+
+OAuth_base_string () {
+ # $1 method: "GET", "POST", etc
+ # $2 url
+ # $3-$N params
+ local method=$1
+ local url=$2
+ shift 2
+
+ local params_string=$(OAuth_params_string $@)
+
+ echo "$method&$(OAuth_PE "$url")&$(OAuth_PE "$params_string")"
+ }
+
+OAuth_param () {
+ # Return a percent encoded key-value pair
+ # $1 key
+ # $2 value
+ echo "$(OAuth_PE "$1")=$(OAuth_PE "$2")"
+ }
+
+OAuth_param_quote () {
+ # Return a percent encoded key-value pair, value is quoted
+ # $1 key
+ # $2 value
+ echo "$(OAuth_PE "$1")=\"$(OAuth_PE "$2")\""
+ }
+
+OAuth_param_file () {
+ # Return a percent encoded key-value pair, the value is an encoded file content
+ # $1 key
+ # $2 filename
+ echo "$(OAuth_PE "$1")=$(OAuth_PE_file "$2")"
+ }
+
+OAuth_param_raw_value () {
+ # Return a percent encoded key-value pair, only key will be encoded by this function
+ # $1 key
+ # $2 value
+ echo "$(OAuth_PE "$1")=$2"
+ }
+
+OAuth_HMAC_SHA1 () {
+ # Hash the text $1 with key $2
+ local text="$1"
+ local key="$2"
+ echo -n "$text" | openssl dgst -sha1 -binary -hmac "$key" | base64
+ }
+
+_OAuth_signature () {
+ # Return the signature, note it's necessary to pass to OAuth_PE before add to header
+ # $1 signature_method
+ # $2 base_string
+ # $3 consumer_secret
+ # $4 token_secret
+ local signature_method="OAuth_${1//-/_}"
+ local base_string=$2
+ local c_secret=$3
+ local t_secret=$4
+ $signature_method "$base_string" "$c_secret&$t_secret"
+ }
+
+OAuth_signature () {
+ # Return the signature, note it's necessary to pass to OAuth_PE before add to header
+ # $1 base_string
+ _OAuth_signature "$oauth_signature_method" "$1" "$oauth_consumer_secret" "$oauth_token_secret"
+ }
+
+_OAuth_authorization_header_params_string () {
+ while (( $# > 0 )); do
+ echo -n "$(cut -d\= -f 1 <<< "$1")=\"$(cut -d\= -f 2 <<< "$1")\""
+ shift 1
+ # Use break to prevent error code being returned
+ (( $# > 0 )) && echo -n ', ' || break
+ done
+ }
+
+_OAuth_authorization_header () {
+ # Return header string
+ # $1 header key
+ # $2 OAuth realm, can be empty string
+ # $3 OAuth consumer key
+ # $4 OAuth consumer secret
+ # $5 OAuth token
+ # $6 OAuth token secret
+ # $7 OAuth signature method
+ # $8 OAuth version
+ # $9 nonce
+ # $10 timestamp
+ # $11 method
+ # $12 url
+ # $13-$N params
+ echo -n "$1: OAuth "
+ [[ "$2" != "" ]] && echo -n "realm=\"$2\", "
+ local oauth_consumer_key="$3"
+ local oauth_consumer_secret="$4"
+ local oauth_token="$5"
+ local oauth_token_secret="$6"
+ local oauth_signature_method="$7"
+ local oauth_version="$8"
+ local oauth_nonce="$9"
+ [[ "$oauth_nonce" == "" ]] && oauth_nonce="$(OAuth_nonce)"
+ local oauth_timestamp="${10}"
+ [[ "$oauth_timestamp" == "" ]] && oauth_timestamp="$(OAuth_timestamp)"
+ local method="${11}"
+ local url="${12}"
+ shift 12
+ local params=(
+ $(OAuth_param 'oauth_consumer_key' "$oauth_consumer_key")
+ $(OAuth_param 'oauth_signature_method' "$oauth_signature_method")
+ $(OAuth_param 'oauth_version' "$oauth_version")
+ $(OAuth_param 'oauth_nonce' "$oauth_nonce")
+ $(OAuth_param 'oauth_timestamp' "$oauth_timestamp")
+ )
+ [[ "$oauth_token" != "" ]] && params[${#params[@]}]=$(OAuth_param 'oauth_token' "$oauth_token")
+ local sign_params=${params[@]}
+ while (( $# > 0 )); do
+ sign_params[${#sign_params[@]}]="$1"
+ shift 1
+ done
+ local base_string=$(OAuth_base_string "$method" "$url" ${sign_params[@]})
+ local signature=$(_OAuth_signature "$oauth_signature_method" "$base_string" "$oauth_consumer_secret" "$oauth_token_secret")
+ params[${#params[@]}]=$(OAuth_param 'oauth_signature' "$signature")
+ _OAuth_authorization_header_params_string ${params[@]}
+ }
+
+OAuth_authorization_header () {
+ # Return header string
+ # $1 header key
+ # $2 OAuth realm, can be empty string
+ # $3 OAuth nonce
+ # $4 OAuth timestamp
+ # $5 method
+ # $6 url
+ # $7-$N params
+ local header_key="$1"
+ local realm="$2"
+ local oauth_nonce="$3"
+ local oauth_timestamp="$4"
+ local method="$5"
+ local url="$6"
+ shift 6
+ local params=()
+ while (( $# > 0 )); do
+ params[${#params[@]}]="$1"
+ shift 1
+ done
+ _OAuth_authorization_header "$header_key" "$realm" "$oauth_consumer_key" "$oauth_consumer_secret" "$oauth_token" "$oauth_token_secret" "$oauth_signature_method" "$oauth_version" "$oauth_nonce" "$oauth_timestamp" "$method" "$url" ${params[@]}
+ }
diff --git a/util/shred/shred b/util/shred/shred
new file mode 100755
index 000000000..2e463ac6d
--- /dev/null
+++ b/util/shred/shred
@@ -0,0 +1,214 @@
+#!/bin/bash
+# Copyright (c) 2012 Fabio Comuni
+# Copyright (c) 2010, 2012 Yu-Jie Lin
+#
+# 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.
+
+FCLI_RC="$HOME/.shred.rc"
+
+# Source Config
+[[ -f "$FCLI_RC" ]] && . "$FCLI_RC" || show_config_help 1
+
+# Source FriendicaOAuth.sh
+OAuth_sh=$(which FriendicaOAuth.sh)
+(( $? != 0 )) && echo 'Unable to locate FriendicaOAuth.sh! Make sure it is in searching PATH.' && exit 1
+source "$OAuth_sh"
+
+# Source JSON.sh
+JSON_sh=$(which JSON.sh)
+(( $? != 0 )) && echo 'Unable to locate JSON.sh! Make sure it is in searching PATH.' && exit 1
+source "$JSON_sh"
+
+
+usage () {
+ echo "usage: $0 options
+
+OPTIONS:
+ -h Show this message
+
+ -c Command
+
+ -C Config-Filename
+
+ Valid Commands:
+ statuses_update
+ home_timeline
+
+Use -h -c command to get options for the command.
+"
+ exit $1
+ }
+
+show_config_help () {
+ echo "Please create $FCLI_RC with:
+redmatrix_url=YOR_SERVER_URL (no trailing /)
+oauth_consumer_key=YOUR_CONSUMER_KEY
+oauth_consumer_secret=YOUR_CONSUMER_SECRET
+
+You can register new app consumer key and secret at
+ http://yourserver.com/settings/oauth
+"
+ exit $1
+ }
+
+
+show_statuses_update () {
+ echo "Command statuses_update
+
+Requires:
+ -s status
+
+Optional:
+ -r in_reply_to_status_id
+"
+ exit $1
+ }
+
+show_home_timeline () {
+ echo "Command home_timeline"
+
+ exit $1
+ }
+
+#json helper
+#
+# usage:
+# echo "$parsed_json" | js key1 [key2 [key3 ...]][,]
+#
+# echoes the value of json[key1][key2][key3], without surronding quotes
+# with "," as last argument, no newline is printed
+#
+js () {
+ local arg
+ local rg='^\['
+ local ret
+ for arg in $@
+ do
+ [[ "$arg" == "," ]] && break;
+ if [[ $arg == ${arg//[0-9]/} ]]
+ then
+ rg="${rg}\"$arg\","
+ else
+ rg="${rg}$arg,"
+ fi
+ done
+ rg="${rg%?}\]"
+ ret=$(grep $rg | cut -f 2 | sed 's/^"\(.*\)"$/\1/' | sed "s/\\\\\//\//g" )
+ if [[ "$arg" == "," ]]
+ then
+ echo -e "$ret" | tr -d '\012\015'
+ else
+ echo -e "$ret"
+ fi
+}
+
+
+load_config () {
+
+ [[ "$oauth_consumer_key" == "" ]] && show_config_help 1
+ [[ "$oauth_consumer_secret" == "" ]] && show_config_help 1
+
+
+ FO_init
+
+ if [[ "$oauth_token" == "" ]] || [[ "$oauth_token_secret" == "" ]]; then
+ FO_access_token_helper
+ if (( $? == 0 )); then
+ oauth_token=${FO_ret[0]}
+ oauth_token_secret=${FO_ret[1]}
+ echo "oauth_token='${FO_ret[0]}'" >> "$FCLI_RC"
+ echo "oauth_token_secret='${FO_ret[1]}'" >> "$FCLI_RC"
+ echo "Token saved."
+ else
+ echo 'Unable to get access token'
+ exit 1
+ fi
+ fi
+ }
+
+main () {
+
+ fcli_command=
+ fcli_status=
+ fcli_in_reply_to_status_id=
+ fcli_file=
+ fcli_help_flag=
+ while getopts "c:s:r:f:h" name
+ do
+ case $name in
+ c) fcli_command="$OPTARG";;
+ C) FCLI_RC="$OPTARG";;
+ s) fcli_status="$OPTARG";;
+ r) fcli_in_reply_to_status_id="$OPTARG";;
+ f) fcli_file="$OPTARG";;
+ h) fcli_help_flag="1";;
+ ?) usage
+ exit 2;;
+ esac
+ done
+ load_config
+
+ if [[ "$fcli_help_flag" == "1" ]]; then case $fcli_command in
+ statuses_update)
+ show_statuses_update 0
+ ;;
+ home_timeline)
+ show_home_timeline 0
+ ;;
+ *)
+ [[ "$fcli_command" == "" ]] && usage 0
+ usage 1
+ esac ; fi
+
+ case $fcli_command in
+ home_timeline)
+ FO_statuses_home_timeline 'json' '' 5
+ JS_Parsed=$(echo "$FO_ret" | tokenize | parse)
+ for id in 0 1 2 3 4
+ do
+ echo "$JS_Parsed" | js $id "user" "name" ,
+ echo -n " - "
+ echo "$JS_Parsed" | js $id "created_at"
+ echo "$JS_Parsed" | js $id "text"
+ echo ""
+ echo "------------------------------------------------------------------------------"
+ done
+
+ return $FO_rval
+ ;;
+ statuses_update)
+ [[ "$fcli_status" == "" ]] && show_statuses_update 1
+ FO_statuses_update 'json' "$fcli_status" "$fcli_in_reply_to_status_id"
+ JS_Parsed=$(echo "$FO_ret" | tokenize | parse)
+ echo "$JS_Parsed" | js "user" "name" ,
+ echo -n " - "
+ echo "$JS_Parsed" | js "created_at"
+ echo "$JS_Parsed" | js "text"
+ echo ""
+ echo "------------------------------------------------------------------------------"
+ return $FO_rval
+ ;;
+ *)
+ usage 1
+ ;;
+ esac
+ return 0
+ }
+
+main "$@"
diff --git a/util/strings.php b/util/strings.php
index e70766d86..2614d7fc2 100644
--- a/util/strings.php
+++ b/util/strings.php
@@ -1,213 +1,717 @@
<?php
;
-$a->strings["Post successful."] = "";
-$a->strings["[Embedded content - reload page to view]"] = "";
-$a->strings["Contact settings applied."] = "";
-$a->strings["Contact update failed."] = "";
-$a->strings["Permission denied."] = "";
-$a->strings["Contact not found."] = "";
-$a->strings["Repair Contact Settings"] = "";
-$a->strings["<strong>WARNING: This is highly advanced</strong> and if you enter incorrect information your communications with this contact may stop working."] = "";
-$a->strings["Please use your browser 'Back' button <strong>now</strong> if you are uncertain what to do on this page."] = "";
-$a->strings["Return to contact editor"] = "";
-$a->strings["Name"] = "";
-$a->strings["Account Nickname"] = "";
-$a->strings["@Tagname - overrides Name/Nickname"] = "";
-$a->strings["Account URL"] = "";
-$a->strings["Friend Request URL"] = "";
-$a->strings["Friend Confirm URL"] = "";
-$a->strings["Notification Endpoint URL"] = "";
-$a->strings["Poll/Feed URL"] = "";
-$a->strings["New photo from this URL"] = "";
-$a->strings["Submit"] = "";
-$a->strings["Help:"] = "";
+$a->strings["Visible to everybody"] = "";
+$a->strings["show"] = "";
+$a->strings["don't show"] = "";
+$a->strings[" and "] = "";
+$a->strings["public profile"] = "";
+$a->strings["%1\$s changed %2\$s to &ldquo;%3\$s&rdquo;"] = "";
+$a->strings["Visit %1\$s's %2\$s"] = "";
+$a->strings["%1\$s has an updated %2\$s, changing %3\$s."] = "";
+$a->strings["Public Timeline"] = "";
+$a->strings["Red Matrix Notification"] = "";
+$a->strings["Thank You,"] = "";
+$a->strings["%s Administrator"] = "";
+$a->strings["%s <!item_type!>"] = "";
+$a->strings["[Red:Notify] New mail received at %s"] = "";
+$a->strings["%1\$s sent you a new private message at %2\$s."] = "";
+$a->strings["%1\$s sent you %2\$s."] = "";
+$a->strings["a private message"] = "";
+$a->strings["Please visit %s to view and/or reply to your private messages."] = "";
+$a->strings["%1\$s commented on [zrl=%2\$s]a %3\$s[/zrl]"] = "";
+$a->strings["%1\$s commented on [zrl=%2\$s]%3\$s's %4\$s[/zrl]"] = "";
+$a->strings["%1\$s commented on [zrl=%2\$s]your %3\$s[/zrl]"] = "";
+$a->strings["[Red:Notify] Comment to conversation #%1\$d by %2\$s"] = "";
+$a->strings["%s commented on an item/conversation you have been following."] = "";
+$a->strings["Please visit %s to view and/or reply to the conversation."] = "";
+$a->strings["[Red:Notify] %s posted to your profile wall"] = "";
+$a->strings["%1\$s posted to your profile wall at %2\$s"] = "";
+$a->strings["%1\$s posted to [zrl=%2\$s]your wall[/zrl]"] = "";
+$a->strings["[Red:Notify] %s tagged you"] = "";
+$a->strings["%1\$s tagged you at %2\$s"] = "";
+$a->strings["%1\$s [zrl=%2\$s]tagged you[/zrl]."] = "";
+$a->strings["[Red:Notify] %1\$s poked you"] = "";
+$a->strings["%1\$s poked you at %2\$s"] = "";
+$a->strings["%1\$s [zrl=%2\$s]poked you[/zrl]."] = "";
+$a->strings["[Red:Notify] %s tagged your post"] = "";
+$a->strings["%1\$s tagged your post at %2\$s"] = "";
+$a->strings["%1\$s tagged [zrl=%2\$s]your post[/zrl]"] = "";
+$a->strings["[Red:Notify] Introduction received"] = "";
+$a->strings["You've received an introduction from '%1\$s' at %2\$s"] = "";
+$a->strings["You've received [zrl=%1\$s]an introduction[/zrl] from %2\$s."] = "";
+$a->strings["You may visit their profile at %s"] = "";
+$a->strings["Please visit %s to approve or reject the introduction."] = "";
+$a->strings["[Red:Notify] Friend suggestion received"] = "";
+$a->strings["You've received a friend suggestion from '%1\$s' at %2\$s"] = "";
+$a->strings["You've received [zrl=%1\$s]a friend suggestion[/zrl] for %2\$s from %3\$s."] = "";
+$a->strings["Name:"] = "";
+$a->strings["Photo:"] = "";
+$a->strings["Please visit %s to approve or reject the suggestion."] = "";
+$a->strings["Connect"] = "";
+$a->strings["New window"] = "";
+$a->strings["Open the selected location in a different window or browser tab"] = "";
+$a->strings["Poke"] = "";
+$a->strings["View Status"] = "";
+$a->strings["View Profile"] = "";
+$a->strings["View Photos"] = "";
+$a->strings["Network Posts"] = "";
+$a->strings["Edit Contact"] = "";
+$a->strings["Send PM"] = "";
+$a->strings["Unknown | Not categorised"] = "";
+$a->strings["Block immediately"] = "";
+$a->strings["Shady, spammer, self-marketer"] = "";
+$a->strings["Known to me, but no opinion"] = "";
+$a->strings["OK, probably harmless"] = "";
+$a->strings["Reputable, has my trust"] = "";
+$a->strings["Frequently"] = "";
+$a->strings["Hourly"] = "";
+$a->strings["Twice daily"] = "";
+$a->strings["Daily"] = "";
+$a->strings["Weekly"] = "";
+$a->strings["Monthly"] = "";
+$a->strings["Friendica"] = "";
+$a->strings["OStatus"] = "";
+$a->strings["RSS/Atom"] = "";
+$a->strings["Email"] = "";
+$a->strings["Diaspora"] = "";
+$a->strings["Facebook"] = "";
+$a->strings["Zot!"] = "";
+$a->strings["LinkedIn"] = "";
+$a->strings["XMPP/IM"] = "";
+$a->strings["MySpace"] = "";
+$a->strings["Add New Connection"] = "";
+$a->strings["Enter the channel address"] = "";
+$a->strings["Example: bob@example.com, http://example.com/barbara"] = "";
+$a->strings["%d invitation available"] = array(
+ 0 => "",
+ 1 => "",
+);
+$a->strings["Find Channels"] = "";
+$a->strings["Enter name or interest"] = "";
+$a->strings["Connect/Follow"] = "";
+$a->strings["Examples: Robert Morgenstein, Fishing"] = "";
+$a->strings["Find"] = "";
+$a->strings["Channel Suggestions"] = "";
+$a->strings["Similar Interests"] = "";
+$a->strings["Random Profile"] = "";
+$a->strings["Invite Friends"] = "";
+$a->strings["Saved Folders"] = "";
+$a->strings["Everything"] = "";
+$a->strings["Categories"] = "";
+$a->strings["%d connection in common"] = array(
+ 0 => "",
+ 1 => "",
+);
+$a->strings["show more"] = "";
+$a->strings["Miscellaneous"] = "";
+$a->strings["year"] = "";
+$a->strings["month"] = "";
+$a->strings["day"] = "";
+$a->strings["never"] = "";
+$a->strings["less than a second ago"] = "";
+$a->strings["years"] = "";
+$a->strings["months"] = "";
+$a->strings["week"] = "";
+$a->strings["weeks"] = "";
+$a->strings["days"] = "";
+$a->strings["hour"] = "";
+$a->strings["hours"] = "";
+$a->strings["minute"] = "";
+$a->strings["minutes"] = "";
+$a->strings["second"] = "";
+$a->strings["seconds"] = "";
+$a->strings["%1\$d %2\$s ago"] = "";
+$a->strings["Cannot locate DNS info for database server '%s'"] = "";
+$a->strings["l F d, Y \\@ g:i A"] = "";
+$a->strings["Starts:"] = "";
+$a->strings["Finishes:"] = "";
+$a->strings["Location:"] = "";
+$a->strings["General Features"] = "";
+$a->strings["Content Expiration"] = "";
+$a->strings["Remove old posts/comments after a period of time"] = "";
+$a->strings["Multiple Profiles"] = "";
+$a->strings["Ability to create multiple profiles"] = "";
+$a->strings["Web Pages"] = "";
+$a->strings["Provide managed web pages on your channel"] = "";
+$a->strings["Enhanced Photo Albums"] = "";
+$a->strings["Enable photo album with enhanced features"] = "";
+$a->strings["Extended Identity Sharing"] = "";
+$a->strings[" "] = "";
+$a->strings["Expert Mode"] = "";
+$a->strings["Enable Expert Mode to provide advanced configuration options"] = "";
+$a->strings["Post Composition Features"] = "";
+$a->strings["Richtext Editor"] = "";
+$a->strings["Enable richtext editor"] = "";
+$a->strings["Post Preview"] = "";
+$a->strings["Allow previewing posts and comments before publishing them"] = "";
+$a->strings["Network and Stream Filtering"] = "";
+$a->strings["Search by Date"] = "";
+$a->strings["Ability to select posts by date ranges"] = "";
+$a->strings["Collections Filter"] = "";
+$a->strings["Enable widget to display Network posts only from selected collections"] = "";
+$a->strings["Saved Searches"] = "";
+$a->strings["Save search terms for re-use"] = "";
+$a->strings["Network Personal Tab"] = "";
+$a->strings["Enable tab to display only Network posts that you've interacted on"] = "";
+$a->strings["Network New Tab"] = "";
+$a->strings["Enable tab to display all new Network activity"] = "";
+$a->strings["Affinity Tool"] = "";
+$a->strings["Filter stream activity by depth of relationships"] = "";
+$a->strings["Post/Comment Tools"] = "";
+$a->strings["Multiple Deletion"] = "";
+$a->strings["Select and delete multiple posts/comments at once"] = "";
+$a->strings["Edit Sent Posts"] = "";
+$a->strings["Edit and correct posts and comments after sending"] = "";
+$a->strings["Tagging"] = "";
+$a->strings["Ability to tag existing posts"] = "";
+$a->strings["Post Categories"] = "";
+$a->strings["Add categories to your posts"] = "";
+$a->strings["Ability to file posts under folders"] = "";
+$a->strings["Dislike Posts"] = "";
+$a->strings["Ability to dislike posts/comments"] = "";
+$a->strings["Star Posts"] = "";
+$a->strings["Ability to mark special posts with a star indicator"] = "";
+$a->strings["Tag Cloud"] = "";
+$a->strings["Provide a personal tag cloud on your channel page"] = "";
+$a->strings["A deleted group with this name was revived. Existing item permissions <strong>may</strong> apply to this group and any future members. If this is not what you intended, please create another group with a different name."] = "";
+$a->strings["Default privacy group for new contacts"] = "";
+$a->strings["All Channels"] = "";
+$a->strings["edit"] = "";
+$a->strings["Collections"] = "";
+$a->strings["Edit collection"] = "";
+$a->strings["Create a new collection"] = "";
+$a->strings["Channels not in any collection"] = "";
+$a->strings["add"] = "";
+$a->strings["Delete this item?"] = "";
+$a->strings["Comment"] = "";
+$a->strings["show fewer"] = "";
+$a->strings["Password too short"] = "";
+$a->strings["Passwords do not match"] = "";
+$a->strings["everybody"] = "";
+$a->strings["timeago.prefixAgo"] = "";
+$a->strings["timeago.suffixAgo"] = "";
+$a->strings["ago"] = "";
+$a->strings["from now"] = "";
+$a->strings["less than a minute"] = "";
+$a->strings["about a minute"] = "";
+$a->strings["%d minutes"] = "";
+$a->strings["about an hour"] = "";
+$a->strings["about %d hours"] = "";
+$a->strings["a day"] = "";
+$a->strings["%d days"] = "";
+$a->strings["about a month"] = "";
+$a->strings["%d months"] = "";
+$a->strings["about a year"] = "";
+$a->strings["%d years"] = "";
+$a->strings["timeago.numbers"] = "";
+$a->strings["No recipient provided."] = "";
+$a->strings["[no subject]"] = "";
+$a->strings["Unable to determine sender."] = "";
+$a->strings["Stored post could not be verified."] = "";
+$a->strings["view full size"] = "";
+$a->strings["Profile Photos"] = "";
+$a->strings["Profile"] = "";
+$a->strings["Full Name:"] = "";
+$a->strings["Gender:"] = "";
+$a->strings["j F, Y"] = "";
+$a->strings["j F"] = "";
+$a->strings["Birthday:"] = "";
+$a->strings["Age:"] = "";
+$a->strings["Status:"] = "";
+$a->strings["for %1\$d %2\$s"] = "";
+$a->strings["Sexual Preference:"] = "";
+$a->strings["Homepage:"] = "";
+$a->strings["Hometown:"] = "";
+$a->strings["Tags:"] = "";
+$a->strings["Political Views:"] = "";
+$a->strings["Religion:"] = "";
+$a->strings["About:"] = "";
+$a->strings["Hobbies/Interests:"] = "";
+$a->strings["Likes:"] = "";
+$a->strings["Dislikes:"] = "";
+$a->strings["Contact information and Social Networks:"] = "";
+$a->strings["Musical interests:"] = "";
+$a->strings["Books, literature:"] = "";
+$a->strings["Television:"] = "";
+$a->strings["Film/dance/culture/entertainment:"] = "";
+$a->strings["Love/Romance:"] = "";
+$a->strings["Work/employment:"] = "";
+$a->strings["School/education:"] = "";
+$a->strings["Welcome "] = "";
+$a->strings["Please upload a profile photo."] = "";
+$a->strings["Welcome back "] = "";
+$a->strings["The form security token was not correct. This probably happened because the form has been opened for too long (>3 hours) before submitting it."] = "";
+$a->strings["Logout"] = "";
+$a->strings["End this session"] = "";
+$a->strings["Home"] = "";
+$a->strings["Your posts and conversations"] = "";
+$a->strings["Your profile page"] = "";
+$a->strings["Edit Profiles"] = "";
+$a->strings["Manage/Edit Profiles"] = "";
+$a->strings["Photos"] = "";
+$a->strings["Your photos"] = "";
+$a->strings["Login"] = "";
+$a->strings["Sign in"] = "";
+$a->strings["%s - click to logout"] = "";
+$a->strings["Click to authenticate to your home hub"] = "";
+$a->strings["Home Page"] = "";
+$a->strings["Register"] = "";
+$a->strings["Create an account"] = "";
$a->strings["Help"] = "";
-$a->strings["Not Found"] = "";
-$a->strings["Page not found."] = "";
-$a->strings["File exceeds size limit of %d"] = "";
-$a->strings["File upload failed."] = "";
-$a->strings["Friend suggestion sent."] = "";
-$a->strings["Suggest Friends"] = "";
-$a->strings["Suggest a friend for %s"] = "";
-$a->strings["Event description and start time are required."] = "";
-$a->strings["l, F j"] = "";
-$a->strings["Edit event"] = "";
-$a->strings["link to source"] = "";
+$a->strings["Help and documentation"] = "";
+$a->strings["Apps"] = "";
+$a->strings["Addon applications, utilities, games"] = "";
+$a->strings["Search"] = "";
+$a->strings["Search site content"] = "";
+$a->strings["Directory"] = "";
+$a->strings["Channel Locator"] = "";
+$a->strings["Matrix"] = "";
+$a->strings["Conversations from your grid"] = "";
+$a->strings["See all matrix notifications"] = "";
+$a->strings["Mark all matrix notifications seen"] = "";
+$a->strings["See all channel notifications"] = "";
+$a->strings["Mark all channel notifications seen"] = "";
+$a->strings["Intros"] = "";
+$a->strings["New Connections"] = "";
+$a->strings["See all channel introductions"] = "";
+$a->strings["Notices"] = "";
+$a->strings["Notifications"] = "";
+$a->strings["See all notifications"] = "";
+$a->strings["Mark all system notifications seen"] = "";
+$a->strings["Mail"] = "";
+$a->strings["Private mail"] = "";
+$a->strings["See all private messages"] = "";
+$a->strings["Mark all private messages seen"] = "";
+$a->strings["Inbox"] = "";
+$a->strings["Outbox"] = "";
+$a->strings["New Message"] = "";
$a->strings["Events"] = "";
-$a->strings["Create New Event"] = "";
-$a->strings["Previous"] = "";
-$a->strings["Next"] = "";
-$a->strings["hour:minute"] = "";
-$a->strings["Event details"] = "";
-$a->strings["Format is %s %s. Starting date and Description are required."] = "";
-$a->strings["Event Starts:"] = "";
-$a->strings["Finish date/time is not known or not relevant"] = "";
-$a->strings["Event Finishes:"] = "";
-$a->strings["Adjust for viewer timezone"] = "";
-$a->strings["Description:"] = "";
-$a->strings["Location:"] = "";
-$a->strings["Share this event"] = "";
-$a->strings["Cancel"] = "";
-$a->strings["Tag removed"] = "";
-$a->strings["Remove Item Tag"] = "";
-$a->strings["Select a tag to remove: "] = "";
-$a->strings["Remove"] = "";
-$a->strings["%s welcomes %s"] = "";
-$a->strings["Authorize application connection"] = "";
-$a->strings["Return to your app and insert this Securty Code:"] = "";
-$a->strings["Please login to continue."] = "";
-$a->strings["Do you want to authorize this application to access your posts and contacts, and/or create new posts for you?"] = "";
-$a->strings["Yes"] = "";
-$a->strings["No"] = "";
+$a->strings["Event Calendar"] = "";
+$a->strings["See all events"] = "";
+$a->strings["Mark all events seen"] = "";
+$a->strings["Channel Select"] = "";
+$a->strings["Manage Your Channels"] = "";
+$a->strings["Settings"] = "";
+$a->strings["Account/Channel Settings"] = "";
+$a->strings["Connections"] = "";
+$a->strings["Manage/Edit Friends and Connections"] = "";
+$a->strings["Admin"] = "";
+$a->strings["Site Setup and Configuration"] = "";
+$a->strings["Nothing new here"] = "";
+$a->strings["Please wait..."] = "";
+$a->strings["created a new post"] = "";
+$a->strings["commented on %s's post"] = "";
+$a->strings["Embedded content"] = "";
+$a->strings["Embedding disabled"] = "";
+$a->strings["Permission denied."] = "";
+$a->strings["Image exceeds website size limit of %lu bytes"] = "";
+$a->strings["Image file is empty."] = "";
+$a->strings["Unable to process image"] = "";
+$a->strings["Photo storage failed."] = "";
$a->strings["Photo Albums"] = "";
-$a->strings["Contact Photos"] = "";
$a->strings["Upload New Photos"] = "";
-$a->strings["everybody"] = "";
-$a->strings["Contact information unavailable"] = "";
-$a->strings["Profile Photos"] = "";
-$a->strings["Album not found."] = "";
-$a->strings["Delete Album"] = "";
-$a->strings["Delete Photo"] = "";
-$a->strings["was tagged in a"] = "";
+$a->strings["Male"] = "";
+$a->strings["Female"] = "";
+$a->strings["Currently Male"] = "";
+$a->strings["Currently Female"] = "";
+$a->strings["Mostly Male"] = "";
+$a->strings["Mostly Female"] = "";
+$a->strings["Transgender"] = "";
+$a->strings["Intersex"] = "";
+$a->strings["Transsexual"] = "";
+$a->strings["Hermaphrodite"] = "";
+$a->strings["Neuter"] = "";
+$a->strings["Non-specific"] = "";
+$a->strings["Other"] = "";
+$a->strings["Undecided"] = "";
+$a->strings["Males"] = "";
+$a->strings["Females"] = "";
+$a->strings["Gay"] = "";
+$a->strings["Lesbian"] = "";
+$a->strings["No Preference"] = "";
+$a->strings["Bisexual"] = "";
+$a->strings["Autosexual"] = "";
+$a->strings["Abstinent"] = "";
+$a->strings["Virgin"] = "";
+$a->strings["Deviant"] = "";
+$a->strings["Fetish"] = "";
+$a->strings["Oodles"] = "";
+$a->strings["Nonsexual"] = "";
+$a->strings["Single"] = "";
+$a->strings["Lonely"] = "";
+$a->strings["Available"] = "";
+$a->strings["Unavailable"] = "";
+$a->strings["Has crush"] = "";
+$a->strings["Infatuated"] = "";
+$a->strings["Dating"] = "";
+$a->strings["Unfaithful"] = "";
+$a->strings["Sex Addict"] = "";
+$a->strings["Friends"] = "";
+$a->strings["Friends/Benefits"] = "";
+$a->strings["Casual"] = "";
+$a->strings["Engaged"] = "";
+$a->strings["Married"] = "";
+$a->strings["Imaginarily married"] = "";
+$a->strings["Partners"] = "";
+$a->strings["Cohabiting"] = "";
+$a->strings["Common law"] = "";
+$a->strings["Happy"] = "";
+$a->strings["Not looking"] = "";
+$a->strings["Swinger"] = "";
+$a->strings["Betrayed"] = "";
+$a->strings["Separated"] = "";
+$a->strings["Unstable"] = "";
+$a->strings["Divorced"] = "";
+$a->strings["Imaginarily divorced"] = "";
+$a->strings["Widowed"] = "";
+$a->strings["Uncertain"] = "";
+$a->strings["It's complicated"] = "";
+$a->strings["Don't care"] = "";
+$a->strings["Ask me"] = "";
+$a->strings["Not a valid email address"] = "";
+$a->strings["Your email domain is not among those allowed on this site"] = "";
+$a->strings["Your email address is already registered at this site."] = "";
+$a->strings["An invitation is required."] = "";
+$a->strings["Invitation could not be verified."] = "";
+$a->strings["Please enter the required information."] = "";
+$a->strings["Failed to store account information."] = "";
+$a->strings["Registration request at %s"] = "";
+$a->strings["Administrator"] = "";
+$a->strings["your registration password"] = "";
+$a->strings["Registration details for %s"] = "";
+$a->strings["Account approved."] = "";
+$a->strings["Registration revoked for %s"] = "";
+$a->strings["Unable to obtain identity information from database"] = "";
+$a->strings["Empty name"] = "";
+$a->strings["Name too long"] = "";
+$a->strings["No account identifier"] = "";
+$a->strings["Nickname has unsupported characters or is already being used on this site."] = "";
+$a->strings["Unable to retrieve created identity"] = "";
+$a->strings["Default Profile"] = "";
+$a->strings["Click here to upgrade."] = "";
+$a->strings["This action exceeds the limits set by your subscription plan."] = "";
+$a->strings["This action is not available under your subscription plan."] = "";
+$a->strings["Invalid data packet"] = "";
+$a->strings["Unable to verify channel signature"] = "";
+$a->strings["Unable to verify site signature for %s"] = "";
+$a->strings["prev"] = "";
+$a->strings["first"] = "";
+$a->strings["last"] = "";
+$a->strings["next"] = "";
+$a->strings["older"] = "";
+$a->strings["newer"] = "";
+$a->strings["No connections"] = "";
+$a->strings["%d Connection"] = array(
+ 0 => "",
+ 1 => "",
+);
+$a->strings["View Connections"] = "";
+$a->strings["Save"] = "";
+$a->strings["poke"] = "";
+$a->strings["poked"] = "";
+$a->strings["ping"] = "";
+$a->strings["pinged"] = "";
+$a->strings["prod"] = "";
+$a->strings["prodded"] = "";
+$a->strings["slap"] = "";
+$a->strings["slapped"] = "";
+$a->strings["finger"] = "";
+$a->strings["fingered"] = "";
+$a->strings["rebuff"] = "";
+$a->strings["rebuffed"] = "";
+$a->strings["happy"] = "";
+$a->strings["sad"] = "";
+$a->strings["mellow"] = "";
+$a->strings["tired"] = "";
+$a->strings["perky"] = "";
+$a->strings["angry"] = "";
+$a->strings["stupified"] = "";
+$a->strings["puzzled"] = "";
+$a->strings["interested"] = "";
+$a->strings["bitter"] = "";
+$a->strings["cheerful"] = "";
+$a->strings["alive"] = "";
+$a->strings["annoyed"] = "";
+$a->strings["anxious"] = "";
+$a->strings["cranky"] = "";
+$a->strings["disturbed"] = "";
+$a->strings["frustrated"] = "";
+$a->strings["motivated"] = "";
+$a->strings["relaxed"] = "";
+$a->strings["surprised"] = "";
+$a->strings["Monday"] = "";
+$a->strings["Tuesday"] = "";
+$a->strings["Wednesday"] = "";
+$a->strings["Thursday"] = "";
+$a->strings["Friday"] = "";
+$a->strings["Saturday"] = "";
+$a->strings["Sunday"] = "";
+$a->strings["January"] = "";
+$a->strings["February"] = "";
+$a->strings["March"] = "";
+$a->strings["April"] = "";
+$a->strings["May"] = "";
+$a->strings["June"] = "";
+$a->strings["July"] = "";
+$a->strings["August"] = "";
+$a->strings["September"] = "";
+$a->strings["October"] = "";
+$a->strings["November"] = "";
+$a->strings["December"] = "";
+$a->strings["unknown.???"] = "";
+$a->strings["bytes"] = "";
+$a->strings["remove"] = "";
+$a->strings["[remove]"] = "";
+$a->strings["Categories:"] = "";
+$a->strings["Filed under:"] = "";
+$a->strings["Click to open/close"] = "";
+$a->strings["link to source"] = "";
+$a->strings["default"] = "";
+$a->strings["Select an alternate language"] = "";
$a->strings["photo"] = "";
-$a->strings["by"] = "";
-$a->strings["Image exceeds size limit of "] = "";
-$a->strings["Image file is empty."] = "";
-$a->strings["Unable to process image."] = "";
-$a->strings["Image upload failed."] = "";
-$a->strings["Public access denied."] = "";
-$a->strings["No photos selected"] = "";
-$a->strings["Access to this item is restricted."] = "";
-$a->strings["Upload Photos"] = "";
-$a->strings["New album name: "] = "";
-$a->strings["or existing album name: "] = "";
-$a->strings["Do not show a status post for this upload"] = "";
-$a->strings["Permissions"] = "";
-$a->strings["Edit Album"] = "";
-$a->strings["View Photo"] = "";
-$a->strings["Permission denied. Access to this item may be restricted."] = "";
-$a->strings["Photo not available"] = "";
-$a->strings["View photo"] = "";
-$a->strings["Edit photo"] = "";
-$a->strings["Use as profile photo"] = "";
+$a->strings["event"] = "";
+$a->strings["status"] = "";
+$a->strings["comment"] = "";
+$a->strings["activity"] = "";
+$a->strings["Logged out."] = "";
+$a->strings["Failed authentication"] = "";
+$a->strings["Login failed."] = "";
+$a->strings["Channel is blocked on this site."] = "";
+$a->strings["Channel location missing."] = "";
+$a->strings["Channel discovery failed. Website may be down or misconfigured."] = "";
+$a->strings["Response from remote channel was not understood."] = "";
+$a->strings["Response from remote channel was incomplete."] = "";
+$a->strings["local account not found."] = "";
+$a->strings["Cannot connect to yourself."] = "";
+$a->strings["Can view my \"public\" stream and posts"] = "";
+$a->strings["Can view my \"public\" channel profile"] = "";
+$a->strings["Can view my \"public\" photo albums"] = "";
+$a->strings["Can view my \"public\" address book"] = "";
+$a->strings["Can view my \"public\" file storage"] = "";
+$a->strings["Can view my \"public\" pages"] = "";
+$a->strings["Can send me their channel stream and posts"] = "";
+$a->strings["Can post on my channel page (\"wall\")"] = "";
+$a->strings["Can comment on my posts"] = "";
+$a->strings["Can send me private mail messages"] = "";
+$a->strings["Can post photos to my photo albums"] = "";
+$a->strings["Can forward to all my channel contacts via post @mentions"] = "";
+$a->strings["Advanced - useful for creating group forum channels"] = "";
+$a->strings["Can chat with me (when available)"] = "";
+$a->strings["Requires compatible chat plugin"] = "";
+$a->strings["Can write to my \"public\" file storage"] = "";
+$a->strings["Can edit my \"public\" pages"] = "";
+$a->strings["Can administer my channel resources"] = "";
+$a->strings["Extremely advanced. Leave this alone unless you know what you are doing"] = "";
+$a->strings["Tags"] = "";
+$a->strings["have"] = "";
+$a->strings["has"] = "";
+$a->strings["want"] = "";
+$a->strings["wants"] = "";
+$a->strings["like"] = "";
+$a->strings["likes"] = "";
+$a->strings["dislike"] = "";
+$a->strings["dislikes"] = "";
+$a->strings["Item was not found."] = "";
+$a->strings["No source file."] = "";
+$a->strings["Cannot locate file to replace"] = "";
+$a->strings["Cannot locate file to revise/update"] = "";
+$a->strings["File exceeds size limit of %d"] = "";
+$a->strings["File upload failed. Possible system limit or action terminated."] = "";
+$a->strings["Stored file could not be verified. Upload failed."] = "";
+$a->strings["Path not available."] = "";
$a->strings["Private Message"] = "";
-$a->strings["View Full Size"] = "";
-$a->strings["Tags: "] = "";
-$a->strings["[Remove any tag]"] = "";
-$a->strings["New album name"] = "";
-$a->strings["Caption"] = "";
-$a->strings["Add a Tag"] = "";
-$a->strings["Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"] = "";
+$a->strings["Edit"] = "";
+$a->strings["Delete"] = "";
+$a->strings["Select"] = "";
+$a->strings["save to folder"] = "";
+$a->strings["add star"] = "";
+$a->strings["remove star"] = "";
+$a->strings["toggle star status"] = "";
+$a->strings["starred"] = "";
+$a->strings["add tag"] = "";
$a->strings["I like this (toggle)"] = "";
$a->strings["I don't like this (toggle)"] = "";
-$a->strings["Share"] = "";
+$a->strings["Share this"] = "";
+$a->strings["share"] = "";
+$a->strings["View %s's profile - %s"] = "";
+$a->strings["to"] = "";
+$a->strings["Wall-to-Wall"] = "";
+$a->strings["via Wall-To-Wall:"] = "";
+$a->strings[" from %s"] = "";
$a->strings["Please wait"] = "";
+$a->strings["%d comment"] = array(
+ 0 => "",
+ 1 => "",
+);
$a->strings["This is you"] = "";
-$a->strings["Comment"] = "";
+$a->strings["Submit"] = "";
+$a->strings["Bold"] = "";
+$a->strings["Italic"] = "";
+$a->strings["Underline"] = "";
+$a->strings["Quote"] = "";
+$a->strings["Code"] = "";
+$a->strings["Image"] = "";
+$a->strings["Link"] = "";
+$a->strings["Video"] = "";
$a->strings["Preview"] = "";
-$a->strings["Delete"] = "";
-$a->strings["View Album"] = "";
-$a->strings["Recent Photos"] = "";
-$a->strings["Not available."] = "";
-$a->strings["Community"] = "";
-$a->strings["No results."] = "";
-$a->strings["This is Friendica, version"] = "";
-$a->strings["running at web location"] = "";
-$a->strings["Please visit <a href=\"http://friendica.com\">Friendica.com</a> to learn more about the Friendica project."] = "";
-$a->strings["Bug reports and issues: please visit"] = "";
-$a->strings["Suggestions, praise, donations, etc. - please email \"Info\" at Friendica - dot com"] = "";
-$a->strings["Installed plugins/addons/apps"] = "";
-$a->strings["No installed plugins/addons/apps"] = "";
-$a->strings["Item not found"] = "";
-$a->strings["Edit post"] = "";
-$a->strings["Post to Email"] = "";
-$a->strings["Edit"] = "";
+$a->strings["channel"] = "";
+$a->strings["%1\$s likes %2\$s's %3\$s"] = "";
+$a->strings["%1\$s doesn't like %2\$s's %3\$s"] = "";
+$a->strings["%1\$s is now connected with %2\$s"] = "";
+$a->strings["%1\$s poked %2\$s"] = "";
+$a->strings["%1\$s is currently %2\$s"] = "";
+$a->strings["View %s's profile @ %s"] = "";
+$a->strings["View in context"] = "";
+$a->strings["Loading..."] = "";
+$a->strings["Delete Selected Items"] = "";
+$a->strings["Follow Thread"] = "";
+$a->strings["%s likes this."] = "";
+$a->strings["%s doesn't like this."] = "";
+$a->strings["<span %1\$s>%2\$d people</span> like this."] = "";
+$a->strings["<span %1\$s>%2\$d people</span> don't like this."] = "";
+$a->strings["and"] = "";
+$a->strings[", and %d other people"] = "";
+$a->strings["%s like this."] = "";
+$a->strings["%s don't like this."] = "";
+$a->strings["Visible to <strong>everybody</strong>"] = "";
+$a->strings["Please enter a link URL:"] = "";
+$a->strings["Please enter a video link/URL:"] = "";
+$a->strings["Please enter an audio link/URL:"] = "";
+$a->strings["Tag term:"] = "";
+$a->strings["Save to Folder:"] = "";
+$a->strings["Where are you right now?"] = "";
+$a->strings["Share"] = "";
+$a->strings["Page link title"] = "";
$a->strings["Upload photo"] = "";
+$a->strings["upload photo"] = "";
$a->strings["Attach file"] = "";
+$a->strings["attach file"] = "";
$a->strings["Insert web link"] = "";
-$a->strings["Insert YouTube video"] = "";
-$a->strings["Insert Vorbis [.ogg] video"] = "";
-$a->strings["Insert Vorbis [.ogg] audio"] = "";
+$a->strings["web link"] = "";
+$a->strings["Insert video link"] = "";
+$a->strings["video link"] = "";
+$a->strings["Insert audio link"] = "";
+$a->strings["audio link"] = "";
$a->strings["Set your location"] = "";
+$a->strings["set location"] = "";
$a->strings["Clear browser location"] = "";
+$a->strings["clear location"] = "";
+$a->strings["Set title"] = "";
+$a->strings["Categories (comma-separated list)"] = "";
$a->strings["Permission settings"] = "";
-$a->strings["CC: email addresses"] = "";
+$a->strings["permissions"] = "";
$a->strings["Public post"] = "";
-$a->strings["Set title"] = "";
$a->strings["Example: bob@example.com, mary@example.com"] = "";
-$a->strings["This introduction has already been accepted."] = "";
-$a->strings["Profile location is not valid or does not contain profile information."] = "";
-$a->strings["Warning: profile location has no identifiable owner name."] = "";
-$a->strings["Warning: profile location has no profile photo."] = "";
-$a->strings["%d required parameter was not found at the given location"] = array(
+$a->strings["Permission denied"] = "";
+$a->strings["Item not found."] = "";
+$a->strings["Archives"] = "";
+$a->strings["Collection not found."] = "";
+$a->strings["Collection has no members."] = "";
+$a->strings["Connection not found."] = "";
+$a->strings["Image/photo"] = "";
+$a->strings["%1\$s wrote the following %2\$s %3\$s"] = "";
+$a->strings["post"] = "";
+$a->strings["$1 wrote:"] = "";
+$a->strings["Encrypted content"] = "";
+$a->strings["No channel."] = "";
+$a->strings["Common connections"] = "";
+$a->strings["No connections in common."] = "";
+$a->strings["Event title and start time are required."] = "";
+$a->strings["l, F j"] = "";
+$a->strings["Edit event"] = "";
+$a->strings["Create New Event"] = "";
+$a->strings["Previous"] = "";
+$a->strings["Next"] = "";
+$a->strings["hour:minute"] = "";
+$a->strings["Event details"] = "";
+$a->strings["Format is %s %s. Starting date and Title are required."] = "";
+$a->strings["Event Starts:"] = "";
+$a->strings["Required"] = "";
+$a->strings["Finish date/time is not known or not relevant"] = "";
+$a->strings["Event Finishes:"] = "";
+$a->strings["Adjust for viewer timezone"] = "";
+$a->strings["Description:"] = "";
+$a->strings["Title:"] = "";
+$a->strings["Share this event"] = "";
+$a->strings["Object store: failed"] = "";
+$a->strings["thing/stuff added"] = "";
+$a->strings["OBJ: %1\$s %2\$s %3\$s"] = "";
+$a->strings["not yet implemented."] = "";
+$a->strings["Add Stuff to your Profile"] = "";
+$a->strings["Select a profile"] = "";
+$a->strings["Select a category of stuff. e.g. I ______ something"] = "";
+$a->strings["Name of thing or stuff e.g. something"] = "";
+$a->strings["URL of thing or stuff (optional)"] = "";
+$a->strings["URL for photo of thing or stuff (optional)"] = "";
+$a->strings["Total invitation limit exceeded."] = "";
+$a->strings["%s : Not a valid email address."] = "";
+$a->strings["Please join us on Red"] = "";
+$a->strings["Invitation limit exceeded. Please contact your site administrator."] = "";
+$a->strings["%s : Message delivery failed."] = "";
+$a->strings["%d message sent."] = array(
0 => "",
1 => "",
);
-$a->strings["Introduction complete."] = "";
-$a->strings["Unrecoverable protocol error."] = "";
-$a->strings["Profile unavailable."] = "";
-$a->strings["%s has received too many connection requests today."] = "";
-$a->strings["Spam protection measures have been invoked."] = "";
-$a->strings["Friends are advised to please try again in 24 hours."] = "";
-$a->strings["Invalid locator"] = "";
-$a->strings["Unable to resolve your name at the provided location."] = "";
-$a->strings["You have already introduced yourself here."] = "";
-$a->strings["Apparently you are already friends with %s."] = "";
-$a->strings["Invalid profile URL."] = "";
-$a->strings["Disallowed profile URL."] = "";
-$a->strings["Failed to update contact record."] = "";
-$a->strings["Your introduction has been sent."] = "";
-$a->strings["Please login to confirm introduction."] = "";
-$a->strings["Incorrect identity currently logged in. Please login to <strong>this</strong> profile."] = "";
-$a->strings["Welcome home %s."] = "";
-$a->strings["Please confirm your introduction/connection request to %s."] = "";
-$a->strings["Confirm"] = "";
-$a->strings["[Name Withheld]"] = "";
-$a->strings["Diaspora members: Please do not use this form. Instead, enter \"%s\" into your Diaspora search bar."] = "";
-$a->strings["Please enter your 'Identity Address' from one of the following supported social networks:"] = "";
-$a->strings["Friend/Connection Request"] = "";
-$a->strings["Examples: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, testuser@identi.ca"] = "";
-$a->strings["Please answer the following:"] = "";
-$a->strings["Does %s know you?"] = "";
-$a->strings["Add a personal note:"] = "";
-$a->strings["Friendica"] = "";
-$a->strings["StatusNet/Federated Social Web"] = "";
-$a->strings["Diaspora"] = "";
-$a->strings["- please share from your own site as noted above"] = "";
-$a->strings["Your Identity Address:"] = "";
-$a->strings["Submit Request"] = "";
-$a->strings["Friendica Social Communications Server - Setup"] = "";
-$a->strings["Database connection"] = "";
+$a->strings["You have no more invitations available"] = "";
+$a->strings["Send invitations"] = "";
+$a->strings["Enter email addresses, one per line:"] = "";
+$a->strings["Your message:"] = "";
+$a->strings["You are cordially invited to join me and some other close friends on the Red Matrix - a revolutionary new decentralised social and information tool."] = "";
+$a->strings["You will need to supply this invitation code: \$invite_code"] = "";
+$a->strings["Please visit my channel at"] = "";
+$a->strings["Once you have registered, please connect with my Red Matrix channel address:"] = "";
+$a->strings["For more information about the Red Matrix Project and why it has the potential to change the internet as we know it, please visit http://getzot.com"] = "";
+$a->strings["Friends of %s"] = "";
+$a->strings["No friends to display."] = "";
+$a->strings["Requested profile is not available."] = "";
+$a->strings["View"] = "";
+$a->strings["Authorize application connection"] = "";
+$a->strings["Return to your app and insert this Securty Code:"] = "";
+$a->strings["Please login to continue."] = "";
+$a->strings["Do you want to authorize this application to access your posts and contacts, and/or create new posts for you?"] = "";
+$a->strings["Yes"] = "";
+$a->strings["No"] = "";
+$a->strings["You must be logged in to see this page."] = "";
+$a->strings["No installed applications."] = "";
+$a->strings["Applications"] = "";
+$a->strings["Invalid item."] = "";
+$a->strings["Channel not found."] = "";
+$a->strings["Item not available."] = "";
+$a->strings["Red Matrix Server - Setup"] = "";
$a->strings["Could not connect to database."] = "";
+$a->strings["Could not connect to specified site URL. Possible SSL certificate or DNS issue."] = "";
$a->strings["Could not create table."] = "";
-$a->strings["Your Friendica site database has been installed."] = "";
-$a->strings["IMPORTANT: You will need to [manually] setup a scheduled task for the poller."] = "";
-$a->strings["Please see the file \"INSTALL.txt\"."] = "";
-$a->strings["Proceed to registration"] = "";
-$a->strings["Proceed with Installation"] = "";
-$a->strings["You may need to import the file \"database.sql\" manually using phpmyadmin or mysql."] = "";
-$a->strings["Database import failed."] = "";
+$a->strings["Your site database has been installed."] = "";
+$a->strings["You may need to import the file \"install/database.sql\" manually using phpmyadmin or mysql."] = "";
+$a->strings["Please see the file \"install/INSTALL.txt\"."] = "";
$a->strings["System check"] = "";
$a->strings["Check again"] = "";
-$a->strings["In order to install Friendica we need to know how to connect to your database."] = "";
+$a->strings["Database connection"] = "";
+$a->strings["In order to install Red Matrix we need to know how to connect to your database."] = "";
$a->strings["Please contact your hosting provider or site administrator if you have questions about these settings."] = "";
$a->strings["The database you specify below should already exist. If it does not, please create it before continuing."] = "";
$a->strings["Database Server Name"] = "";
+$a->strings["Default is localhost"] = "";
+$a->strings["Database Port"] = "";
+$a->strings["Communication port number - use 0 for default"] = "";
$a->strings["Database Login Name"] = "";
$a->strings["Database Login Password"] = "";
$a->strings["Database Name"] = "";
$a->strings["Site administrator email address"] = "";
$a->strings["Your account email address must match this in order to use the web admin panel."] = "";
+$a->strings["Website URL"] = "";
+$a->strings["Please use SSL (https) URL if available."] = "";
$a->strings["Please select a default timezone for your website"] = "";
$a->strings["Site settings"] = "";
$a->strings["Could not find a command line version of PHP in the web server PATH."] = "";
+$a->strings["If you don't have a command line version of PHP installed on server, you will not be able to run background polling via cron."] = "";
$a->strings["PHP executable path"] = "";
-$a->strings["Enter full path to php executable"] = "";
+$a->strings["Enter full path to php executable. You can leave this blank to continue the installation."] = "";
$a->strings["Command line PHP"] = "";
$a->strings["The command line version of PHP on your system does not have \"register_argc_argv\" enabled."] = "";
$a->strings["This is required for message delivery to work."] = "";
-$a->strings["PHP \"register_argc_argv\""] = "";
+$a->strings["PHP register_argc_argv"] = "";
$a->strings["Error: the \"openssl_pkey_new\" function on this system is not able to generate encryption keys"] = "";
$a->strings["If running under Windows, please see \"http://www.php.net/manual/en/openssl.installation.php\"."] = "";
$a->strings["Generate encryption keys"] = "";
@@ -216,168 +720,60 @@ $a->strings["GD graphics PHP module"] = "";
$a->strings["OpenSSL PHP module"] = "";
$a->strings["mysqli PHP module"] = "";
$a->strings["mb_string PHP module"] = "";
-$a->strings["Apace mod_rewrite module"] = "";
+$a->strings["mcrypt PHP module"] = "";
+$a->strings["Apache mod_rewrite module"] = "";
$a->strings["Error: Apache webserver mod-rewrite module is required but not installed."] = "";
+$a->strings["proc_open"] = "";
+$a->strings["Error: proc_open is required but is either not installed or has been disabled in php.ini"] = "";
$a->strings["Error: libCURL PHP module required but not installed."] = "";
$a->strings["Error: GD graphics PHP module with JPEG support required but not installed."] = "";
$a->strings["Error: openssl PHP module required but not installed."] = "";
$a->strings["Error: mysqli PHP module required but not installed."] = "";
$a->strings["Error: mb_string PHP module required but not installed."] = "";
+$a->strings["Error: mcrypt PHP module required but not installed."] = "";
$a->strings["The web installer needs to be able to create a file called \".htconfig.php\" in the top folder of your web server and it is unable to do so."] = "";
$a->strings["This is most often a permission setting, as the web server may not be able to write files in your folder - even if you can."] = "";
-$a->strings["Please check with your site documentation or support people to see if this situation can be corrected."] = "";
-$a->strings["If not, you may be required to perform a manual installation. Please see the file \"INSTALL.txt\" for instructions."] = "";
+$a->strings["At the end of this procedure, we will give you a text to save in a file named .htconfig.php in your Red top folder."] = "";
+$a->strings["You can alternatively skip this procedure and perform a manual installation. Please see the file \"install/INSTALL.txt\" for instructions."] = "";
$a->strings[".htconfig.php is writable"] = "";
+$a->strings["Red uses the Smarty3 template engine to render its web views. Smarty3 compiles templates to PHP to speed up rendering."] = "";
+$a->strings["In order to store these compiled templates, the web server needs to have write access to the directory view/tpl/smarty3/ under the Red top level folder."] = "";
+$a->strings["Please ensure that the user that your web server runs as (e.g. www-data) has write access to this folder."] = "";
+$a->strings["Note: as a security measure, you should give the web server write access to view/tpl/smarty3/ only--not the template files (.tpl) that it contains."] = "";
+$a->strings["view/tpl/smarty3 is writable"] = "";
+$a->strings["SSL certificate validation"] = "";
+$a->strings["SSL certificate cannot be validated. Fix certificate or disable https access to this site."] = "";
+$a->strings["Url rewrite in .htaccess is not working. Check your server configuration."] = "";
+$a->strings["Url rewrite is working"] = "";
$a->strings["The database configuration file \".htconfig.php\" could not be written. Please use the enclosed text to create a configuration file in your web server root."] = "";
$a->strings["Errors encountered creating database tables."] = "";
-$a->strings["l F d, Y \\@ g:i A"] = "";
-$a->strings["Time Conversion"] = "";
-$a->strings["Friendika provides this service for sharing events with other networks and friends in unknown timezones."] = "";
-$a->strings["UTC time: %s"] = "";
-$a->strings["Current timezone: %s"] = "";
-$a->strings["Converted localtime: %s"] = "";
-$a->strings["Please select your timezone:"] = "";
-$a->strings["Profile Match"] = "";
-$a->strings["No keywords to match. Please add keywords to your default profile."] = "";
-$a->strings["is interested in:"] = "";
-$a->strings["Connect"] = "";
-$a->strings["No matches"] = "";
-$a->strings["Remote privacy information not available."] = "";
-$a->strings["Visible to:"] = "";
-$a->strings["Welcome to %s"] = "";
-$a->strings["Invalid request identifier."] = "";
-$a->strings["Discard"] = "";
-$a->strings["Ignore"] = "";
-$a->strings["System"] = "";
-$a->strings["Network"] = "";
-$a->strings["Personal"] = "";
-$a->strings["Home"] = "";
-$a->strings["Introductions"] = "";
-$a->strings["Messages"] = "";
-$a->strings["Show Ignored Requests"] = "";
-$a->strings["Hide Ignored Requests"] = "";
-$a->strings["Notification type: "] = "";
-$a->strings["Friend Suggestion"] = "";
-$a->strings["suggested by %s"] = "";
-$a->strings["Hide this contact from others"] = "";
-$a->strings["Post a new friend activity"] = "";
-$a->strings["if applicable"] = "";
-$a->strings["Approve"] = "";
-$a->strings["Claims to be known to you: "] = "";
-$a->strings["yes"] = "";
-$a->strings["no"] = "";
-$a->strings["Approve as: "] = "";
-$a->strings["Friend"] = "";
-$a->strings["Sharer"] = "";
-$a->strings["Fan/Admirer"] = "";
-$a->strings["Friend/Connect Request"] = "";
-$a->strings["New Follower"] = "";
-$a->strings["No introductions."] = "";
-$a->strings["Notifications"] = "";
-$a->strings["%s liked %s's post"] = "";
-$a->strings["%s disliked %s's post"] = "";
-$a->strings["%s is now friends with %s"] = "";
-$a->strings["%s created a new post"] = "";
-$a->strings["%s commented on %s's post"] = "";
-$a->strings["No more network notifications."] = "";
-$a->strings["Network Notifications"] = "";
-$a->strings["No more system notifications."] = "";
-$a->strings["System Notifications"] = "";
-$a->strings["No more personal notifications."] = "";
-$a->strings["Personal Notifications"] = "";
-$a->strings["No more home notifications."] = "";
-$a->strings["Home Notifications"] = "";
-$a->strings["Could not access contact record."] = "";
-$a->strings["Could not locate selected profile."] = "";
-$a->strings["Contact updated."] = "";
-$a->strings["Contact has been blocked"] = "";
-$a->strings["Contact has been unblocked"] = "";
-$a->strings["Contact has been ignored"] = "";
-$a->strings["Contact has been unignored"] = "";
-$a->strings["stopped following"] = "";
-$a->strings["Contact has been removed."] = "";
-$a->strings["You are mutual friends with %s"] = "";
-$a->strings["You are sharing with %s"] = "";
-$a->strings["%s is sharing with you"] = "";
-$a->strings["Private communications are not available for this contact."] = "";
-$a->strings["Never"] = "";
-$a->strings["(Update was successful)"] = "";
-$a->strings["(Update was not successful)"] = "";
-$a->strings["Suggest friends"] = "";
-$a->strings["Network type: %s"] = "";
-$a->strings["%d contact in common"] = array(
- 0 => "",
- 1 => "",
-);
-$a->strings["View all contacts"] = "";
-$a->strings["Unblock"] = "";
-$a->strings["Block"] = "";
-$a->strings["Unignore"] = "";
-$a->strings["Repair"] = "";
-$a->strings["Contact Editor"] = "";
-$a->strings["Profile Visibility"] = "";
-$a->strings["Please choose the profile you would like to display to %s when viewing your profile securely."] = "";
-$a->strings["Contact Information / Notes"] = "";
-$a->strings["Edit contact notes"] = "";
-$a->strings["Visit %s's profile [%s]"] = "";
-$a->strings["Block/Unblock contact"] = "";
-$a->strings["Ignore contact"] = "";
-$a->strings["Repair URL settings"] = "";
-$a->strings["View conversations"] = "";
-$a->strings["Delete contact"] = "";
-$a->strings["Last update:"] = "";
-$a->strings["Update public posts"] = "";
-$a->strings["Update now"] = "";
-$a->strings["Currently blocked"] = "";
-$a->strings["Currently ignored"] = "";
-$a->strings["Replies/likes to your public posts <strong>may</strong> still be visible"] = "";
-$a->strings["All Contacts"] = "";
-$a->strings["Unblocked Contacts"] = "";
-$a->strings["Blocked Contacts"] = "";
-$a->strings["Ignored Contacts"] = "";
-$a->strings["Hidden Contacts"] = "";
-$a->strings["Mutual Friendship"] = "";
-$a->strings["is a fan of yours"] = "";
-$a->strings["you are a fan of"] = "";
-$a->strings["Edit contact"] = "";
-$a->strings["Contacts"] = "";
-$a->strings["Search your contacts"] = "";
-$a->strings["Finding: "] = "";
-$a->strings["Find"] = "";
-$a->strings["No valid account found."] = "";
-$a->strings["Password reset request issued. Check your email."] = "";
-$a->strings["Password reset requested at %s"] = "";
-$a->strings["Administrator"] = "";
-$a->strings["Request could not be verified. (You may have previously submitted it.) Password reset failed."] = "";
-$a->strings["Password Reset"] = "";
-$a->strings["Your password has been reset as requested."] = "";
-$a->strings["Your new password is"] = "";
-$a->strings["Save or copy your new password - and then"] = "";
-$a->strings["click here to login"] = "";
-$a->strings["Your password may be changed from the <em>Settings</em> page after successful login."] = "";
-$a->strings["Forgot your Password?"] = "";
-$a->strings["Enter your email address and submit to have your password reset. Then check your email for further instructions."] = "";
-$a->strings["Nickname or Email: "] = "";
-$a->strings["Reset"] = "";
+$a->strings["<h1>What next</h1>"] = "";
+$a->strings["IMPORTANT: You will need to [manually] setup a scheduled task for the poller."] = "";
+$a->strings["%1\$s is following %2\$s's %3\$s"] = "";
+$a->strings["[Embedded content - reload page to view]"] = "";
+$a->strings["toggle full screen mode"] = "";
+$a->strings["%1\$s tagged %2\$s's %3\$s with %4\$s"] = "";
+$a->strings["Account settings"] = "";
+$a->strings["Channel settings"] = "";
+$a->strings["Additional features"] = "";
+$a->strings["Feature settings"] = "";
+$a->strings["Display settings"] = "";
+$a->strings["Connected apps"] = "";
+$a->strings["Export channel"] = "";
+$a->strings["Automatic Permissions (Advanced)"] = "";
$a->strings["Missing some important data!"] = "";
$a->strings["Update"] = "";
-$a->strings["Failed to connect with email account using the settings provided."] = "";
-$a->strings["Email settings updated."] = "";
$a->strings["Passwords do not match. Password unchanged."] = "";
$a->strings["Empty passwords are not allowed. Password unchanged."] = "";
$a->strings["Password changed."] = "";
$a->strings["Password update failed. Please try again."] = "";
-$a->strings[" Please use a shorter name."] = "";
-$a->strings[" Name too short."] = "";
-$a->strings[" Not valid email."] = "";
-$a->strings[" Cannot change to that email."] = "";
+$a->strings["Not valid email."] = "";
+$a->strings["Protected email address. Cannot change to that email."] = "";
+$a->strings["System failure storing new email. Please try again."] = "";
$a->strings["Settings updated."] = "";
-$a->strings["Account settings"] = "";
-$a->strings["Connector settings"] = "";
-$a->strings["Plugin settings"] = "";
-$a->strings["Connections"] = "";
-$a->strings["Export personal data"] = "";
$a->strings["Add application"] = "";
+$a->strings["Cancel"] = "";
+$a->strings["Name"] = "";
$a->strings["Consumer Key"] = "";
$a->strings["Consumer Secret"] = "";
$a->strings["Redirect"] = "";
@@ -387,73 +783,69 @@ $a->strings["Connected Apps"] = "";
$a->strings["Client key starts with"] = "";
$a->strings["No name"] = "";
$a->strings["Remove authorization"] = "";
-$a->strings["No Plugin settings configured"] = "";
-$a->strings["Plugin Settings"] = "";
-$a->strings["Built-in support for %s connectivity is %s"] = "";
-$a->strings["enabled"] = "";
-$a->strings["disabled"] = "";
-$a->strings["StatusNet"] = "";
+$a->strings["No feature settings configured"] = "";
+$a->strings["Feature Settings"] = "";
+$a->strings["Account Settings"] = "";
+$a->strings["Password Settings"] = "";
+$a->strings["New Password:"] = "";
+$a->strings["Confirm:"] = "";
+$a->strings["Leave password fields blank unless changing"] = "";
+$a->strings["Email Address:"] = "";
+$a->strings["Remove Account"] = "";
+$a->strings["Warning: This action is permanent and cannot be reversed."] = "";
+$a->strings["Off"] = "";
+$a->strings["On"] = "";
+$a->strings["Additional Features"] = "";
$a->strings["Connector Settings"] = "";
-$a->strings["Email/Mailbox Setup"] = "";
-$a->strings["If you wish to communicate with email contacts using this service (optional), please specify how to connect to your mailbox."] = "";
-$a->strings["Last successful email check:"] = "";
-$a->strings["Email access is disabled on this site."] = "";
-$a->strings["IMAP server name:"] = "";
-$a->strings["IMAP port:"] = "";
-$a->strings["Security:"] = "";
-$a->strings["None"] = "";
-$a->strings["Email login name:"] = "";
-$a->strings["Email password:"] = "";
-$a->strings["Reply-to address:"] = "";
-$a->strings["Send public posts to all email contacts:"] = "";
-$a->strings["Normal Account"] = "";
-$a->strings["This account is a normal personal profile"] = "";
-$a->strings["Soapbox Account"] = "";
-$a->strings["Automatically approve all connection/friend requests as read-only fans"] = "";
-$a->strings["Community/Celebrity Account"] = "";
-$a->strings["Automatically approve all connection/friend requests as read-write fans"] = "";
-$a->strings["Automatic Friend Account"] = "";
-$a->strings["Automatically approve all connection/friend requests as friends"] = "";
-$a->strings["OpenID:"] = "";
-$a->strings["(Optional) Allow this OpenID to login to this account."] = "";
-$a->strings["Publish your default profile in your local site directory?"] = "";
-$a->strings["Publish your default profile in the global social directory?"] = "";
-$a->strings["Hide your contact/friend list from viewers of your default profile?"] = "";
-$a->strings["Hide your profile details from unknown viewers?"] = "";
-$a->strings["Allow friends to post to your profile page?"] = "";
-$a->strings["Allow friends to tag your posts?"] = "";
+$a->strings["No special theme for mobile devices"] = "";
+$a->strings["Display Settings"] = "";
+$a->strings["Display Theme:"] = "";
+$a->strings["Mobile Theme:"] = "";
+$a->strings["Update browser every xx seconds"] = "";
+$a->strings["Minimum of 10 seconds, no maximum"] = "";
+$a->strings["Maximum number of conversations to load at any time:"] = "";
+$a->strings["Maximum of 100 items"] = "";
+$a->strings["Don't show emoticons"] = "";
+$a->strings["Nobody except yourself"] = "";
+$a->strings["Only those you specifically allow"] = "";
+$a->strings["Anybody in your address book"] = "";
+$a->strings["Anybody on this website"] = "";
+$a->strings["Anybody in this network"] = "";
+$a->strings["Anybody on the internet"] = "";
+$a->strings["Publish your default profile in the network directory"] = "";
$a->strings["Allow us to suggest you as a potential friend to new members?"] = "";
-$a->strings["Profile is <strong>not published</strong>."] = "";
$a->strings["or"] = "";
-$a->strings["Your Identity Address is"] = "";
+$a->strings["Your channel address is"] = "";
$a->strings["Automatically expire posts after this many days:"] = "";
$a->strings["If empty, posts will not expire. Expired posts will be deleted"] = "";
$a->strings["Advanced expiration settings"] = "";
$a->strings["Advanced Expiration"] = "";
$a->strings["Expire posts:"] = "";
-$a->strings["Expire personal notes:"] = "";
$a->strings["Expire starred posts:"] = "";
$a->strings["Expire photos:"] = "";
-$a->strings["Account Settings"] = "";
-$a->strings["Password Settings"] = "";
-$a->strings["New Password:"] = "";
-$a->strings["Confirm:"] = "";
-$a->strings["Leave password fields blank unless changing"] = "";
+$a->strings["Only expire posts by others:"] = "";
+$a->strings["Channel Settings"] = "";
$a->strings["Basic Settings"] = "";
-$a->strings["Full Name:"] = "";
-$a->strings["Email Address:"] = "";
$a->strings["Your Timezone:"] = "";
$a->strings["Default Post Location:"] = "";
$a->strings["Use Browser Location:"] = "";
-$a->strings["Display Theme:"] = "";
-$a->strings["Update browser every xx seconds"] = "";
-$a->strings["Minimum of 10 seconds, no maximum"] = "";
$a->strings["Security and Privacy Settings"] = "";
+$a->strings["Quick Privacy Settings:"] = "";
+$a->strings["Very Public - extremely permissive"] = "";
+$a->strings["Typical - default public, privacy when desired"] = "";
+$a->strings["Private - default private, rarely open or public"] = "";
+$a->strings["Blocked - default blocked to/from everybody"] = "";
$a->strings["Maximum Friend Requests/Day:"] = "";
-$a->strings["(to prevent spam abuse)"] = "";
+$a->strings["May reduce spam activity"] = "";
$a->strings["Default Post Permissions"] = "";
$a->strings["(click to open/close)"] = "";
+$a->strings["Maximum private messages per day from unknown people:"] = "";
+$a->strings["Useful to reduce spamming"] = "";
$a->strings["Notification Settings"] = "";
+$a->strings["By default post a status message when:"] = "";
+$a->strings["accepting a friend request"] = "";
+$a->strings["joining a forum/community"] = "";
+$a->strings["making an <em>interesting</em> profile change"] = "";
$a->strings["Send a notification email when:"] = "";
$a->strings["You receive an introduction"] = "";
$a->strings["Your introductions are confirmed"] = "";
@@ -462,167 +854,150 @@ $a->strings["Someone writes a followup comment"] = "";
$a->strings["You receive a private message"] = "";
$a->strings["You receive a friend suggestion"] = "";
$a->strings["You are tagged in a post"] = "";
-$a->strings["Advanced Page Settings"] = "";
-$a->strings["Manage Identities and/or Pages"] = "";
-$a->strings["Toggle between different identities or community/group pages which share your account details or which you have been granted \"manage\" permissions"] = "";
-$a->strings["Select an identity to manage: "] = "";
-$a->strings["Search Results For:"] = "";
-$a->strings["Remove term"] = "";
-$a->strings["Saved Searches"] = "";
-$a->strings["add"] = "";
-$a->strings["Commented Order"] = "";
-$a->strings["Posted Order"] = "";
-$a->strings["New"] = "";
-$a->strings["Starred"] = "";
-$a->strings["Bookmarks"] = "";
-$a->strings["Warning: This group contains %s member from an insecure network."] = array(
- 0 => "",
- 1 => "",
-);
-$a->strings["Private messages to this group are at risk of public disclosure."] = "";
-$a->strings["No such group"] = "";
-$a->strings["Group is empty"] = "";
-$a->strings["Group: "] = "";
-$a->strings["Contact: "] = "";
-$a->strings["Private messages to this person are at risk of public disclosure."] = "";
-$a->strings["Invalid contact."] = "";
-$a->strings["Personal Notes"] = "";
-$a->strings["Save"] = "";
-$a->strings["Welcome to Friendica"] = "";
-$a->strings["New Member Checklist"] = "";
-$a->strings["We would like to offer some tips and links to help make your experience enjoyable. Click any item to visit the relevant page. A link to this page will be visible from your home page for two weeks after your initial registration and then will quietly disappear."] = "";
-$a->strings["On your <em>Settings</em> page - change your initial password. Also make a note of your Identity Address. This looks just like an email address - and will be useful in making friends on the free social web."] = "";
-$a->strings["Review the other settings, particularly the privacy settings. An unpublished directory listing is like having an unlisted phone number. In general, you should probably publish your listing - unless all of your friends and potential friends know exactly how to find you."] = "";
-$a->strings["Upload a profile photo if you have not done so already. Studies have shown that people with real photos of themselves are ten times more likely to make friends than people who do not."] = "";
-$a->strings["Authorise the Facebook Connector if you currently have a Facebook account and we will (optionally) import all your Facebook friends and conversations."] = "";
-$a->strings["<em>If</em> this is your own personal server, installing the Facebook addon may ease your transition to the free social web."] = "";
-$a->strings["Enter your email access information on your Connector Settings page if you wish to import and interact with friends or mailing lists from your email INBOX"] = "";
-$a->strings["Edit your <strong>default</strong> profile to your liking. Review the settings for hiding your list of friends and hiding the profile from unknown visitors."] = "";
-$a->strings["Set some public keywords for your default profile which describe your interests. We may be able to find other people with similar interests and suggest friendships."] = "";
-$a->strings["Your Contacts page is your gateway to managing friendships and connecting with friends on other networks. Typically you enter their address or site URL in the <em>Add New Contact</em> dialog."] = "";
-$a->strings["The Directory page lets you find other people in this network or other federated sites. Look for a <em>Connect</em> or <em>Follow</em> link on their profile page. Provide your own Identity Address if requested."] = "";
-$a->strings["On the side panel of the Contacts page are several tools to find new friends. We can match people by interest, look up people by name or interest, and provide suggestions based on network relationships. On a brand new site, friend suggestions will usually begin to be populated within 24 hours."] = "";
-$a->strings["Once you have made some friends, organize them into private conversation groups from the sidebar of your Contacts page and then you can interact with each group privately on your Network page."] = "";
-$a->strings["Our <strong>help</strong> pages may be consulted for detail on other program features and resources."] = "";
-$a->strings["Item not available."] = "";
-$a->strings["Item was not found."] = "";
-$a->strings["Group created."] = "";
-$a->strings["Could not create group."] = "";
-$a->strings["Group not found."] = "";
-$a->strings["Group name changed."] = "";
-$a->strings["Permission denied"] = "";
-$a->strings["Create a group of contacts/friends."] = "";
-$a->strings["Group Name: "] = "";
-$a->strings["Group removed."] = "";
-$a->strings["Unable to remove group."] = "";
-$a->strings["Click on a contact to add or remove."] = "";
-$a->strings["Group Editor"] = "";
-$a->strings["Members"] = "";
-$a->strings["Invalid profile identifier."] = "";
-$a->strings["Profile Visibility Editor"] = "";
-$a->strings["Profile"] = "";
-$a->strings["Visible To"] = "";
-$a->strings["All Contacts (with secure profile access)"] = "";
-$a->strings["No contacts."] = "";
-$a->strings["View Contacts"] = "";
-$a->strings["An invitation is required."] = "";
-$a->strings["Invitation could not be verified."] = "";
-$a->strings["Invalid OpenID url"] = "";
-$a->strings["Please enter the required information."] = "";
-$a->strings["Please use a shorter name."] = "";
-$a->strings["Name too short."] = "";
-$a->strings["That doesn't appear to be your full (First Last) name."] = "";
-$a->strings["Your email domain is not among those allowed on this site."] = "";
-$a->strings["Not a valid email address."] = "";
-$a->strings["Cannot use that email."] = "";
-$a->strings["Your \"nickname\" can only contain \"a-z\", \"0-9\", \"-\", and \"_\", and must also begin with a letter."] = "";
-$a->strings["Nickname is already registered. Please choose another."] = "";
-$a->strings["SERIOUS ERROR: Generation of security keys failed."] = "";
-$a->strings["An error occurred during registration. Please try again."] = "";
-$a->strings["An error occurred creating your default profile. Please try again."] = "";
-$a->strings["Registration details for %s"] = "";
-$a->strings["Registration successful. Please check your email for further instructions."] = "";
-$a->strings["Failed to send email message. Here is the message that failed."] = "";
-$a->strings["Your registration can not be processed."] = "";
-$a->strings["Registration request at %s"] = "";
-$a->strings["Your registration is pending approval by the site owner."] = "";
-$a->strings["This site has exceeded the number of allowed daily account registrations. Please try again tomorrow."] = "";
-$a->strings["You may (optionally) fill in this form via OpenID by supplying your OpenID and clicking 'Register'."] = "";
-$a->strings["If you are not familiar with OpenID, please leave that field blank and fill in the rest of the items."] = "";
-$a->strings["Your OpenID (optional): "] = "";
-$a->strings["Include your profile in member directory?"] = "";
-$a->strings["Membership on this site is by invitation only."] = "";
-$a->strings["Your invitation ID: "] = "";
-$a->strings["Registration"] = "";
-$a->strings["Your Full Name (e.g. Joe Smith): "] = "";
-$a->strings["Your Email Address: "] = "";
-$a->strings["Choose a profile nickname. This must begin with a text character. Your profile address on this site will then be '<strong>nickname@\$sitename</strong>'."] = "";
-$a->strings["Choose a nickname: "] = "";
-$a->strings["Register"] = "";
+$a->strings["You are poked/prodded/etc. in a post"] = "";
+$a->strings["Advanced Account/Page Type Settings"] = "";
+$a->strings["Change the behaviour of this account for special situations"] = "";
+$a->strings["Public access denied."] = "";
+$a->strings["No connections."] = "";
+$a->strings["Visit %s's profile [%s]"] = "";
+$a->strings["View Connnections"] = "";
+$a->strings["Tag removed"] = "";
+$a->strings["Remove Item Tag"] = "";
+$a->strings["Select a tag to remove: "] = "";
+$a->strings["Remove"] = "";
+$a->strings["No potential page delegates located."] = "";
+$a->strings["Delegate Page Management"] = "";
+$a->strings["Delegates are able to manage all aspects of this account/page except for basic account settings. Please do not delegate your personal account to anybody that you do not trust completely."] = "";
+$a->strings["Existing Page Managers"] = "";
+$a->strings["Existing Page Delegates"] = "";
+$a->strings["Potential Delegates"] = "";
+$a->strings["Add"] = "";
+$a->strings["No entries."] = "";
+$a->strings["Age: "] = "";
+$a->strings["Gender: "] = "";
+$a->strings["Finding:"] = "";
+$a->strings["next page"] = "";
+$a->strings["previous page"] = "";
+$a->strings["No entries (some entries may be hidden)."] = "";
$a->strings["People Search"] = "";
-$a->strings["status"] = "";
-$a->strings["%1\$s likes %2\$s's %3\$s"] = "";
-$a->strings["%1\$s doesn't like %2\$s's %3\$s"] = "";
-$a->strings["Item not found."] = "";
-$a->strings["Access denied."] = "";
-$a->strings["Account approved."] = "";
-$a->strings["Registration revoked for %s"] = "";
-$a->strings["Please login."] = "";
-$a->strings["Unable to locate original post."] = "";
-$a->strings["Empty post discarded."] = "";
-$a->strings["Wall Photos"] = "";
-$a->strings["System error. Post not saved."] = "";
-$a->strings["This message was sent to you by %s, a member of the Friendica social network."] = "";
-$a->strings["You may visit them online at %s"] = "";
-$a->strings["Please contact the sender by replying to this post if you do not wish to receive these messages."] = "";
-$a->strings["%s posted an update."] = "";
-$a->strings["Image uploaded but image cropping failed."] = "";
-$a->strings["Image size reduction [%s] failed."] = "";
-$a->strings["Shift-reload the page or clear browser cache if the new photo does not display immediately."] = "";
-$a->strings["Unable to process image"] = "";
-$a->strings["Image exceeds size limit of %d"] = "";
-$a->strings["Upload File:"] = "";
-$a->strings["Upload Profile Photo"] = "";
-$a->strings["Upload"] = "";
-$a->strings["skip this step"] = "";
-$a->strings["select a photo from your photo albums"] = "";
-$a->strings["Crop Image"] = "";
-$a->strings["Please adjust the image cropping for optimum viewing."] = "";
-$a->strings["Done Editing"] = "";
-$a->strings["Image uploaded successfully."] = "";
-$a->strings["No profile"] = "";
-$a->strings["Remove My Account"] = "";
-$a->strings["This will completely remove your account. Once this has been done it is not recoverable."] = "";
-$a->strings["Please enter your password for verification:"] = "";
-$a->strings["No recipient selected."] = "";
-$a->strings["Unable to locate contact information."] = "";
-$a->strings["Message could not be sent."] = "";
-$a->strings["Message collection failure."] = "";
-$a->strings["Message sent."] = "";
-$a->strings["Inbox"] = "";
-$a->strings["Outbox"] = "";
-$a->strings["New Message"] = "";
+$a->strings["No matches"] = "";
+$a->strings["Collection created."] = "";
+$a->strings["Could not create collection."] = "";
+$a->strings["Collection name changed."] = "";
+$a->strings["Create a collection of channels."] = "";
+$a->strings["Collection Name: "] = "";
+$a->strings["Members are visible to other channels"] = "";
+$a->strings["Collection removed."] = "";
+$a->strings["Unable to remove collection."] = "";
+$a->strings["Collection Editor"] = "";
+$a->strings["Members"] = "";
+$a->strings["All Connected Channels"] = "";
+$a->strings["Click on a channel to add or remove."] = "";
+$a->strings["Page owner information could not be retrieved."] = "";
+$a->strings["Album not found."] = "";
+$a->strings["Delete Album"] = "";
+$a->strings["Delete Photo"] = "";
+$a->strings["%1\$s was tagged in %2\$s by %3\$s"] = "";
+$a->strings["a photo"] = "";
+$a->strings["No photos selected"] = "";
+$a->strings["Access to this item is restricted."] = "";
+$a->strings["You have used %1$.2f Mbytes of %2$.2f Mbytes photo storage."] = "";
+$a->strings["You have used %1$.2f Mbytes of photo storage."] = "";
+$a->strings["Upload Photos"] = "";
+$a->strings["New album name: "] = "";
+$a->strings["or existing album name: "] = "";
+$a->strings["Do not show a status post for this upload"] = "";
+$a->strings["Permissions"] = "";
+$a->strings["Contact Photos"] = "";
+$a->strings["Edit Album"] = "";
+$a->strings["Show Newest First"] = "";
+$a->strings["Show Oldest First"] = "";
+$a->strings["View Photo"] = "";
+$a->strings["Permission denied. Access to this item may be restricted."] = "";
+$a->strings["Photo not available"] = "";
+$a->strings["Use as profile photo"] = "";
+$a->strings["View Full Size"] = "";
+$a->strings["Edit photo"] = "";
+$a->strings["Rotate CW (right)"] = "";
+$a->strings["Rotate CCW (left)"] = "";
+$a->strings["New album name"] = "";
+$a->strings["Caption"] = "";
+$a->strings["Add a Tag"] = "";
+$a->strings["Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"] = "";
+$a->strings["View Album"] = "";
+$a->strings["Recent Photos"] = "";
+$a->strings["sent you a private message"] = "";
+$a->strings["added your channel"] = "";
+$a->strings["g A l F d"] = "";
+$a->strings["[today]"] = "";
+$a->strings["posted an event"] = "";
+$a->strings["Not found."] = "";
+$a->strings["- select -"] = "";
+$a->strings["Welcome to %s"] = "";
+$a->strings["Check Mail"] = "";
+$a->strings["Unable to lookup recipient."] = "";
+$a->strings["Unable to communicate with requested channel."] = "";
+$a->strings["Cannot verify requested channel."] = "";
+$a->strings["Selected channel has private message restrictions. Send failed."] = "";
+$a->strings["Messages"] = "";
$a->strings["Message deleted."] = "";
$a->strings["Conversation removed."] = "";
-$a->strings["Please enter a link URL:"] = "";
$a->strings["Send Private Message"] = "";
$a->strings["To:"] = "";
$a->strings["Subject:"] = "";
-$a->strings["Your message:"] = "";
$a->strings["No messages."] = "";
-$a->strings["Delete conversation"] = "";
-$a->strings["D, d M Y - g:i A"] = "";
-$a->strings["Message not available."] = "";
$a->strings["Delete message"] = "";
+$a->strings["D, d M Y - g:i A"] = "";
+$a->strings["Message not found."] = "";
+$a->strings["Delete conversation"] = "";
+$a->strings["No secure communications available. You <strong>may</strong> be able to respond from the sender's profile page."] = "";
$a->strings["Send Reply"] = "";
-$a->strings["Friends of %s"] = "";
-$a->strings["No friends to display."] = "";
+$a->strings["No profile"] = "";
+$a->strings["Help:"] = "";
+$a->strings["Not Found"] = "";
+$a->strings["Page not found."] = "";
+$a->strings["Remote Authentication"] = "";
+$a->strings["Enter your channel address (e.g. channel@example.com)"] = "";
+$a->strings["Authenticate"] = "";
+$a->strings["Unable to locate original post."] = "";
+$a->strings["Empty post discarded."] = "";
+$a->strings["System error. Post not saved."] = "";
+$a->strings["Wall Photos"] = "";
+$a->strings["Remove term"] = "";
+$a->strings["Commented Order"] = "";
+$a->strings["Sort by Comment Date"] = "";
+$a->strings["Posted Order"] = "";
+$a->strings["Sort by Post Date"] = "";
+$a->strings["Personal"] = "";
+$a->strings["Posts that mention or involve you"] = "";
+$a->strings["New"] = "";
+$a->strings["Activity Stream - by date"] = "";
+$a->strings["Starred"] = "";
+$a->strings["Favourite Posts"] = "";
+$a->strings["Spam"] = "";
+$a->strings["Posts flagged as SPAM"] = "";
+$a->strings["Refresh"] = "";
+$a->strings["Me"] = "";
+$a->strings["Best Friends"] = "";
+$a->strings["Co-workers"] = "";
+$a->strings["Former Friends"] = "";
+$a->strings["Acquaintances"] = "";
+$a->strings["Everybody"] = "";
+$a->strings["Search Results For:"] = "";
+$a->strings["No such group"] = "";
+$a->strings["Group is empty"] = "";
+$a->strings["Contact: "] = "";
+$a->strings["Invalid contact."] = "";
+$a->strings["Theme settings updated."] = "";
$a->strings["Site"] = "";
$a->strings["Users"] = "";
$a->strings["Plugins"] = "";
$a->strings["Themes"] = "";
+$a->strings["DB updates"] = "";
$a->strings["Logs"] = "";
+$a->strings["Plugin Features"] = "";
$a->strings["User registrations waiting for confirmation"] = "";
+$a->strings["Message queues"] = "";
$a->strings["Administration"] = "";
$a->strings["Summary"] = "";
$a->strings["Registered users"] = "";
@@ -630,9 +1005,16 @@ $a->strings["Pending registrations"] = "";
$a->strings["Version"] = "";
$a->strings["Active plugins"] = "";
$a->strings["Site settings updated."] = "";
+$a->strings["No special theme for accessibility"] = "";
$a->strings["Closed"] = "";
$a->strings["Requires approval"] = "";
$a->strings["Open"] = "";
+$a->strings["Private"] = "";
+$a->strings["Paid Access"] = "";
+$a->strings["Free Access"] = "";
+$a->strings["No SSL policy, links will track page SSL state"] = "";
+$a->strings["Force all links to use SSL"] = "";
+$a->strings["Registration"] = "";
$a->strings["File upload"] = "";
$a->strings["Policies"] = "";
$a->strings["Advanced"] = "";
@@ -640,30 +1022,51 @@ $a->strings["Site name"] = "";
$a->strings["Banner/Logo"] = "";
$a->strings["System language"] = "";
$a->strings["System theme"] = "";
+$a->strings["Default system theme - may be over-ridden by user profiles - <a href='#' id='cnftheme'>change theme settings</a>"] = "";
+$a->strings["Mobile system theme"] = "";
+$a->strings["Theme for mobile devices"] = "";
+$a->strings["Accessibility system theme"] = "";
+$a->strings["Accessibility theme"] = "";
+$a->strings["Channel to use for this website's static pages"] = "";
+$a->strings["Site Channel"] = "";
+$a->strings["SSL link policy"] = "";
+$a->strings["Determines whether generated links should be forced to use SSL"] = "";
$a->strings["Maximum image size"] = "";
+$a->strings["Maximum size in bytes of uploaded images. Default is 0, which means no limits."] = "";
$a->strings["Register policy"] = "";
+$a->strings["Access policy"] = "";
$a->strings["Register text"] = "";
+$a->strings["Will be displayed prominently on the registration page."] = "";
$a->strings["Accounts abandoned after x days"] = "";
$a->strings["Will not waste system resources polling external sites for abandonded accounts. Enter 0 for no time limit."] = "";
$a->strings["Allowed friend domains"] = "";
+$a->strings["Comma separated list of domains which are allowed to establish friendships with this site. Wildcards are accepted. Empty to allow any domains"] = "";
$a->strings["Allowed email domains"] = "";
+$a->strings["Comma separated list of domains which are allowed in email addresses for registrations to this site. Wildcards are accepted. Empty to allow any domains"] = "";
$a->strings["Block public"] = "";
+$a->strings["Check to block public access to all otherwise public personal pages on this site unless you are currently logged in."] = "";
$a->strings["Force publish"] = "";
-$a->strings["Global directory update URL"] = "";
-$a->strings["Block multiple registrations"] = "";
-$a->strings["OpenID support"] = "";
-$a->strings["Gravatar support"] = "";
-$a->strings["Fullname check"] = "";
-$a->strings["UTF-8 Regular expressions"] = "";
-$a->strings["Show Community Page"] = "";
-$a->strings["Enable OStatus support"] = "";
-$a->strings["Enable Diaspora support"] = "";
-$a->strings["Only allow Friendica contacts"] = "";
-$a->strings["Verify SSL"] = "";
+$a->strings["Check to force all profiles on this site to be listed in the site directory."] = "";
$a->strings["Proxy user"] = "";
$a->strings["Proxy URL"] = "";
$a->strings["Network timeout"] = "";
-$a->strings["%s user blocked"] = array(
+$a->strings["Value is in seconds. Set to 0 for unlimited (not recommended)."] = "";
+$a->strings["Delivery interval"] = "";
+$a->strings["Delay background delivery processes by this many seconds to reduce system load. Recommend: 4-5 for shared hosts, 2-3 for virtual private servers. 0-1 for large dedicated servers."] = "";
+$a->strings["Poll interval"] = "";
+$a->strings["Delay background polling processes by this many seconds to reduce system load. If 0, use delivery interval."] = "";
+$a->strings["Maximum Load Average"] = "";
+$a->strings["Maximum system load before delivery and poll processes are deferred - default 50."] = "";
+$a->strings["Update has been marked successful"] = "";
+$a->strings["Executing %s failed. Check system logs."] = "";
+$a->strings["Update %s was successfully applied."] = "";
+$a->strings["Update %s did not return a status. Unknown if it succeeded."] = "";
+$a->strings["Update function %s could not be found."] = "";
+$a->strings["No failed updates."] = "";
+$a->strings["Failed Updates"] = "";
+$a->strings["Mark success (if update was manually applied)"] = "";
+$a->strings["Attempt to execute this update step automatically"] = "";
+$a->strings["%s user blocked/unblocked"] = array(
0 => "",
1 => "",
);
@@ -671,19 +1074,25 @@ $a->strings["%s user deleted"] = array(
0 => "",
1 => "",
);
+$a->strings["Account not found"] = "";
$a->strings["User '%s' deleted"] = "";
$a->strings["User '%s' unblocked"] = "";
$a->strings["User '%s' blocked"] = "";
+$a->strings["Normal Account"] = "";
+$a->strings["Soapbox Account"] = "";
+$a->strings["Community/Celebrity Account"] = "";
+$a->strings["Automatic Friend Account"] = "";
$a->strings["select all"] = "";
$a->strings["User registrations waiting for confirm"] = "";
$a->strings["Request date"] = "";
-$a->strings["Email"] = "";
$a->strings["No registrations."] = "";
+$a->strings["Approve"] = "";
$a->strings["Deny"] = "";
+$a->strings["Block"] = "";
+$a->strings["Unblock"] = "";
$a->strings["Register date"] = "";
$a->strings["Last login"] = "";
-$a->strings["Last item"] = "";
-$a->strings["Account"] = "";
+$a->strings["Service Class"] = "";
$a->strings["Selected users will be deleted!\\n\\nEverything these users had posted on this site will be permanently deleted!\\n\\nAre you sure?"] = "";
$a->strings["The user {0} will be deleted!\\n\\nEverything this user has posted on this site will be permanently deleted!\\n\\nAre you sure?"] = "";
$a->strings["Plugin %s disabled."] = "";
@@ -691,59 +1100,145 @@ $a->strings["Plugin %s enabled."] = "";
$a->strings["Disable"] = "";
$a->strings["Enable"] = "";
$a->strings["Toggle"] = "";
-$a->strings["Settings"] = "";
+$a->strings["Author: "] = "";
+$a->strings["Maintainer: "] = "";
$a->strings["No themes found."] = "";
+$a->strings["Screenshot"] = "";
+$a->strings["[Experimental]"] = "";
+$a->strings["[Unsupported]"] = "";
$a->strings["Log settings updated."] = "";
$a->strings["Clear"] = "";
$a->strings["Debugging"] = "";
$a->strings["Log file"] = "";
-$a->strings["Must be writable by web server. Relative to your Friendica top-level directory."] = "";
+$a->strings["Must be writable by web server. Relative to your Red top-level directory."] = "";
$a->strings["Log level"] = "";
-$a->strings["Close"] = "";
-$a->strings["FTP Host"] = "";
-$a->strings["FTP Path"] = "";
-$a->strings["FTP User"] = "";
-$a->strings["FTP Password"] = "";
-$a->strings["Requested profile is not available."] = "";
-$a->strings["Access to this profile has been restricted."] = "";
-$a->strings["Tips for New Members"] = "";
-$a->strings["{0} wants to be your friend"] = "";
-$a->strings["{0} sent you a message"] = "";
-$a->strings["{0} requested registration"] = "";
-$a->strings["{0} commented %s's post"] = "";
-$a->strings["{0} liked %s's post"] = "";
-$a->strings["{0} disliked %s's post"] = "";
-$a->strings["{0} is now friends with %s"] = "";
-$a->strings["{0} posted"] = "";
-$a->strings["{0} tagged %s's post with #%s"] = "";
-$a->strings["{0} mentioned you in a post"] = "";
-$a->strings["Login failed."] = "";
-$a->strings["Connect URL missing."] = "";
-$a->strings["This site is not configured to allow communications with other networks."] = "";
-$a->strings["No compatible communication protocols or feeds were discovered."] = "";
-$a->strings["The profile address specified does not provide adequate information."] = "";
-$a->strings["An author or name was not found."] = "";
-$a->strings["No browser URL could be matched to this address."] = "";
-$a->strings["The profile address specified belongs to a network which has been disabled on this site."] = "";
-$a->strings["Limited profile. This person will be unable to receive direct/personal notifications from you."] = "";
-$a->strings["Unable to retrieve contact information."] = "";
-$a->strings["following"] = "";
-$a->strings["Common Friends"] = "";
-$a->strings["No friends in common."] = "";
-$a->strings["Item has been removed."] = "";
-$a->strings["Applications"] = "";
-$a->strings["No installed applications."] = "";
-$a->strings["Search This Site"] = "";
+$a->strings["Ignore"] = "";
+$a->strings["Connection updated."] = "";
+$a->strings["Connection update failed."] = "";
+$a->strings["Introductions and Connection Requests"] = "";
+$a->strings["No pending introductions."] = "";
+$a->strings["System error. Please try again later."] = "";
+$a->strings["Hide this contact from others"] = "";
+$a->strings["Post a new friend activity"] = "";
+$a->strings["if applicable"] = "";
+$a->strings["Discard"] = "";
+$a->strings["Could not access contact record."] = "";
+$a->strings["Could not locate selected profile."] = "";
+$a->strings["Failed to update connection record."] = "";
+$a->strings["Could not access address book record."] = "";
+$a->strings["Refresh failed - channel is currently unavailable."] = "";
+$a->strings["Channel has been unblocked"] = "";
+$a->strings["Channel has been blocked"] = "";
+$a->strings["Unable to set address book parameters."] = "";
+$a->strings["Channel has been unignored"] = "";
+$a->strings["Channel has been ignored"] = "";
+$a->strings["Channel has been unarchived"] = "";
+$a->strings["Channel has been archived"] = "";
+$a->strings["Channel has been unhidden"] = "";
+$a->strings["Channel has been hidden"] = "";
+$a->strings["Channel has been approved"] = "";
+$a->strings["Channel has been unapproved"] = "";
+$a->strings["Contact has been removed."] = "";
+$a->strings["View %s's profile"] = "";
+$a->strings["Refresh Permissions"] = "";
+$a->strings["Fetch updated permissions"] = "";
+$a->strings["Block or Unblock this connection"] = "";
+$a->strings["Unignore"] = "";
+$a->strings["Ignore or Unignore this connection"] = "";
+$a->strings["Unarchive"] = "";
+$a->strings["Archive"] = "";
+$a->strings["Archive or Unarchive this connection"] = "";
+$a->strings["Unhide"] = "";
+$a->strings["Hide"] = "";
+$a->strings["Hide or Unhide this connection"] = "";
+$a->strings["Delete this connection"] = "";
+$a->strings["Unknown"] = "";
+$a->strings["Approve this connection"] = "";
+$a->strings["Accept connection to allow communication"] = "";
+$a->strings["Automatic Permissions Settings"] = "";
+$a->strings["Connections: settings for %s"] = "";
+$a->strings["When receiving a channel introduction, any permissions provided here will be applied to the new connection automatically and the introduction approved. Leave this page if you do not wish to use this feature."] = "";
+$a->strings["Slide to adjust your degree of friendship"] = "";
+$a->strings["Connection has no individual permissions!"] = "";
+$a->strings["This may be appropriate based on your <a href=\"settings\">privacy settings</a>, though you may wish to review the \"Advanced Permissions\"."] = "";
+$a->strings["Profile Visibility"] = "";
+$a->strings["Please choose the profile you would like to display to %s when viewing your profile securely."] = "";
+$a->strings["Contact Information / Notes"] = "";
+$a->strings["Edit contact notes"] = "";
+$a->strings["Their Settings"] = "";
+$a->strings["My Settings"] = "";
+$a->strings["Forum Members"] = "";
+$a->strings["Soapbox"] = "";
+$a->strings["Full Sharing"] = "";
+$a->strings["Cautious Sharing"] = "";
+$a->strings["Follow Only"] = "";
+$a->strings["Individual Permissions"] = "";
+$a->strings["Individual permissions are only enabled for <a href=\"settings\">privacy settings</a> which are set to \"Only those you specifically allow\". Otherwise they are controlled by your privacy settings."] = "";
+$a->strings["Advanced Permissions"] = "";
+$a->strings["Quick Links"] = "";
+$a->strings["Visit %s's profile - %s"] = "";
+$a->strings["Block/Unblock contact"] = "";
+$a->strings["Ignore contact"] = "";
+$a->strings["Repair URL settings"] = "";
+$a->strings["View conversations"] = "";
+$a->strings["Delete contact"] = "";
+$a->strings["Last update:"] = "";
+$a->strings["Update public posts"] = "";
+$a->strings["Update now"] = "";
+$a->strings["Currently blocked"] = "";
+$a->strings["Currently ignored"] = "";
+$a->strings["Currently archived"] = "";
+$a->strings["Currently pending"] = "";
+$a->strings["Replies/likes to your public posts <strong>may</strong> still be visible"] = "";
+$a->strings["Blocked"] = "";
+$a->strings["Ignored"] = "";
+$a->strings["Hidden"] = "";
+$a->strings["Archived"] = "";
+$a->strings["All"] = "";
+$a->strings["Suggestions"] = "";
+$a->strings["Suggest new connections"] = "";
+$a->strings["Show pending (new) connections"] = "";
+$a->strings["All Connections"] = "";
+$a->strings["Show all connections"] = "";
+$a->strings["Unblocked"] = "";
+$a->strings["Only show unblocked connections"] = "";
+$a->strings["Only show blocked connections"] = "";
+$a->strings["Only show ignored connections"] = "";
+$a->strings["Only show archived connections"] = "";
+$a->strings["Only show hidden connections"] = "";
+$a->strings["%1\$s [%2\$s]"] = "";
+$a->strings["Edit contact"] = "";
+$a->strings["Search your connections"] = "";
+$a->strings["Finding: "] = "";
+$a->strings["This site is not a directory server"] = "";
+$a->strings["Remote privacy information not available."] = "";
+$a->strings["Visible to:"] = "";
+$a->strings["Remote authentication blocked. You are logged into this site locally. Please logout and retry."] = "";
+$a->strings["Welcome %s. Remote authentication successful."] = "";
$a->strings["Profile not found."] = "";
-$a->strings["Profile Name is required."] = "";
-$a->strings["Profile updated."] = "";
$a->strings["Profile deleted."] = "";
$a->strings["Profile-"] = "";
$a->strings["New profile created."] = "";
$a->strings["Profile unavailable to clone."] = "";
+$a->strings["Profile Name is required."] = "";
+$a->strings["Marital Status"] = "";
+$a->strings["Romantic Partner"] = "";
+$a->strings["Likes"] = "";
+$a->strings["Dislikes"] = "";
+$a->strings["Work/Employment"] = "";
+$a->strings["Religion"] = "";
+$a->strings["Political Views"] = "";
+$a->strings["Gender"] = "";
+$a->strings["Sexual Preference"] = "";
+$a->strings["Homepage"] = "";
+$a->strings["Interests"] = "";
+$a->strings["Address"] = "";
+$a->strings["Location"] = "";
+$a->strings["Profile updated."] = "";
$a->strings["Hide your contact/friend list from viewers of this profile?"] = "";
$a->strings["Edit Profile Details"] = "";
$a->strings["View this profile"] = "";
+$a->strings["Change Profile Photo"] = "";
$a->strings["Create a new profile using these settings"] = "";
$a->strings["Clone this profile"] = "";
$a->strings["Delete this profile"] = "";
@@ -760,18 +1255,16 @@ $a->strings["Region/State:"] = "";
$a->strings["<span class=\"heart\">&hearts;</span> Marital Status:"] = "";
$a->strings["Who: (if applicable)"] = "";
$a->strings["Examples: cathy123, Cathy Williams, cathy@example.com"] = "";
-$a->strings["Sexual Preference:"] = "";
+$a->strings["Since [date]:"] = "";
$a->strings["Homepage URL:"] = "";
-$a->strings["Political Views:"] = "";
$a->strings["Religious Views:"] = "";
-$a->strings["Public Keywords:"] = "";
-$a->strings["Private Keywords:"] = "";
+$a->strings["Keywords:"] = "";
$a->strings["Example: fishing photography software"] = "";
-$a->strings["(Used for suggesting potential friends, can be seen by others)"] = "";
-$a->strings["(Used for searching profiles, never shown to others)"] = "";
+$a->strings["Used in directory listings"] = "";
$a->strings["Tell us about yourself..."] = "";
$a->strings["Hobbies/Interests"] = "";
$a->strings["Contact information and Social Networks"] = "";
+$a->strings["My other channels"] = "";
$a->strings["Musical interests"] = "";
$a->strings["Books, literature"] = "";
$a->strings["Television"] = "";
@@ -780,583 +1273,219 @@ $a->strings["Love/romance"] = "";
$a->strings["Work/employment"] = "";
$a->strings["School/education"] = "";
$a->strings["This is your <strong>public</strong> profile.<br />It <strong>may</strong> be visible to anybody using the internet."] = "";
-$a->strings["Age: "] = "";
$a->strings["Edit/Manage Profiles"] = "";
$a->strings["Change profile photo"] = "";
$a->strings["Create New Profile"] = "";
$a->strings["Profile Image"] = "";
$a->strings["visible to everybody"] = "";
$a->strings["Edit visibility"] = "";
-$a->strings["%1\$s tagged %2\$s's %3\$s with %4\$s"] = "";
-$a->strings["No potential page delegates located."] = "";
-$a->strings["Delegate Page Management"] = "";
-$a->strings["Delegates are able to manage all aspects of this account/page except for basic account settings. Please do not delegate your personal account to anybody that you do not trust completely."] = "";
-$a->strings["Existing Page Managers"] = "";
-$a->strings["Existing Page Delegates"] = "";
-$a->strings["Potential Delegates"] = "";
-$a->strings["Add"] = "";
-$a->strings["No entries."] = "";
-$a->strings["Friend Suggestions"] = "";
+$a->strings["Add a Channel"] = "";
+$a->strings["A channel is your own collection of related web pages. A channel can be used to hold social network profiles, blogs, conversation groups and forums, celebrity pages, and much more. You may create as many channels as your service provider allows."] = "";
+$a->strings["Channel Name"] = "";
+$a->strings["Examples: \"Bob Jameson\", \"Lisa and her Horses\", \"Soccer\", \"Aviation Group\" "] = "";
+$a->strings["Choose a short nickname"] = "";
+$a->strings["Your nickname will be used to create an easily remembered channel address (like an email address) which you can share with others."] = "";
+$a->strings["Or <a href=\"import\">import an existing channel</a> from another location"] = "";
+$a->strings["Create"] = "";
+$a->strings["No valid account found."] = "";
+$a->strings["Password reset request issued. Check your email."] = "";
+$a->strings["Site Member (%s)"] = "";
+$a->strings["Password reset requested at %s"] = "";
+$a->strings["Request could not be verified. (You may have previously submitted it.) Password reset failed."] = "";
+$a->strings["Password Reset"] = "";
+$a->strings["Your password has been reset as requested."] = "";
+$a->strings["Your new password is"] = "";
+$a->strings["Save or copy your new password - and then"] = "";
+$a->strings["click here to login"] = "";
+$a->strings["Your password may be changed from the <em>Settings</em> page after successful login."] = "";
+$a->strings["Your password has changed at %s"] = "";
+$a->strings["Forgot your Password?"] = "";
+$a->strings["Enter your email address and submit to have your password reset. Then check your email for further instructions."] = "";
+$a->strings["Email Address"] = "";
+$a->strings["Reset"] = "";
+$a->strings["Nothing to import."] = "";
+$a->strings["Unable to download data from old server"] = "";
+$a->strings["Imported file is empty."] = "";
+$a->strings["Cannot create a duplicate channel identifier on this system. Import failed."] = "";
+$a->strings["Channel clone failed. Import failed."] = "";
+$a->strings["Cloned channel not found. Import failed."] = "";
+$a->strings["Import completed."] = "";
+$a->strings["You must be logged in to use this feature."] = "";
+$a->strings["Import Channel"] = "";
+$a->strings["Use this form to import an existing channel from a different server/hub. You may retrieve the channel identity from the old server/hub via the network or provide an export file. Only identity and connections/relationships will be imported. Importation of content is not yet available."] = "";
+$a->strings["File to Upload"] = "";
+$a->strings["Or provide the old server/hub details"] = "";
+$a->strings["Your old identity address (xyz@example.com)"] = "";
+$a->strings["Your old login email address"] = "";
+$a->strings["Your old login password"] = "";
+$a->strings["For either option, please choose whether to make this hub your new primary address, or whether your old location should continue this role. You will be able to post from either location, but only one can be marked as the primary location for files, photos, and media."] = "";
+$a->strings["Make this hub my primary location"] = "";
+$a->strings["Create a new channel"] = "";
+$a->strings["Channel Manager"] = "";
+$a->strings["Current Channel"] = "";
+$a->strings["Attach to one of your channels by selecting it."] = "";
+$a->strings["Default Channel"] = "";
+$a->strings["Make Default"] = "";
+$a->strings["Profile Match"] = "";
+$a->strings["No keywords to match. Please add keywords to your default profile."] = "";
+$a->strings["is interested in:"] = "";
+$a->strings["Contact settings applied."] = "";
+$a->strings["Contact update failed."] = "";
+$a->strings["Contact not found."] = "";
+$a->strings["Repair Contact Settings"] = "";
+$a->strings["<strong>WARNING: This is highly advanced</strong> and if you enter incorrect information your communications with this contact may stop working."] = "";
+$a->strings["Please use your browser 'Back' button <strong>now</strong> if you are uncertain what to do on this page."] = "";
+$a->strings["Return to contact editor"] = "";
+$a->strings["Account Nickname"] = "";
+$a->strings["@Tagname - overrides Name/Nickname"] = "";
+$a->strings["Account URL"] = "";
+$a->strings["Friend Request URL"] = "";
+$a->strings["Friend Confirm URL"] = "";
+$a->strings["Notification Endpoint URL"] = "";
+$a->strings["Poll/Feed URL"] = "";
+$a->strings["New photo from this URL"] = "";
+$a->strings["invalid target signature"] = "";
+$a->strings["Channel added."] = "";
+$a->strings["Contacts who are not members of a group"] = "";
+$a->strings["Image uploaded but image cropping failed."] = "";
+$a->strings["Image resize failed."] = "";
+$a->strings["Shift-reload the page or clear browser cache if the new photo does not display immediately."] = "";
+$a->strings["Image exceeds size limit of %d"] = "";
+$a->strings["Unable to process image."] = "";
+$a->strings["Photo not available."] = "";
+$a->strings["Upload File:"] = "";
+$a->strings["Select a profile:"] = "";
+$a->strings["Upload Profile Photo"] = "";
+$a->strings["Upload"] = "";
+$a->strings["skip this step"] = "";
+$a->strings["select a photo from your photo albums"] = "";
+$a->strings["Crop Image"] = "";
+$a->strings["Please adjust the image cropping for optimum viewing."] = "";
+$a->strings["Done Editing"] = "";
+$a->strings["Image uploaded successfully."] = "";
+$a->strings["Image upload failed."] = "";
+$a->strings["Image size reduction [%s] failed."] = "";
+$a->strings["Item not found"] = "";
+$a->strings["Edit post"] = "";
+$a->strings["Insert YouTube video"] = "";
+$a->strings["Insert Vorbis [.ogg] video"] = "";
+$a->strings["Insert Vorbis [.ogg] audio"] = "";
+$a->strings["Invalid request identifier."] = "";
+$a->strings["System"] = "";
+$a->strings["Introductions"] = "";
+$a->strings["Show Ignored Requests"] = "";
+$a->strings["Hide Ignored Requests"] = "";
+$a->strings["Notification type: "] = "";
+$a->strings["Friend Suggestion"] = "";
+$a->strings["suggested by %s"] = "";
+$a->strings["Claims to be known to you: "] = "";
+$a->strings["yes"] = "";
+$a->strings["no"] = "";
+$a->strings["Approve as: "] = "";
+$a->strings["Friend"] = "";
+$a->strings["Sharer"] = "";
+$a->strings["Fan/Admirer"] = "";
+$a->strings["Friend/Connect Request"] = "";
+$a->strings["New Follower"] = "";
+$a->strings["No introductions."] = "";
+$a->strings["%s liked %s's post"] = "";
+$a->strings["%s disliked %s's post"] = "";
+$a->strings["%s is now friends with %s"] = "";
+$a->strings["%s created a new post"] = "";
+$a->strings["%s commented on %s's post"] = "";
+$a->strings["No more network notifications."] = "";
+$a->strings["Network Notifications"] = "";
+$a->strings["No more system notifications."] = "";
+$a->strings["System Notifications"] = "";
+$a->strings["No more personal notifications."] = "";
+$a->strings["Personal Notifications"] = "";
+$a->strings["No more home notifications."] = "";
+$a->strings["Home Notifications"] = "";
+$a->strings["Post successful."] = "";
+$a->strings["Item is not editable"] = "";
+$a->strings["Access to this profile has been restricted."] = "";
+$a->strings["Poke/Prod"] = "";
+$a->strings["poke, prod or do other things to somebody"] = "";
+$a->strings["Recipient"] = "";
+$a->strings["Choose what you wish to do to recipient"] = "";
+$a->strings["Make this post private"] = "";
+$a->strings["Not available."] = "";
+$a->strings["Community"] = "";
+$a->strings["No results."] = "";
+$a->strings["Files"] = "";
+$a->strings["Friend suggestion sent."] = "";
+$a->strings["Suggest Friends"] = "";
+$a->strings["Suggest a friend for %s"] = "";
+$a->strings["Invalid profile identifier."] = "";
+$a->strings["Profile Visibility Editor"] = "";
+$a->strings["Click on a contact to add or remove."] = "";
+$a->strings["Visible To"] = "";
+$a->strings["All Contacts (with secure profile access)"] = "";
+$a->strings["Version %s"] = "";
+$a->strings["Installed plugins/addons/apps:"] = "";
+$a->strings["No installed plugins/addons/apps"] = "";
+$a->strings["Red"] = "";
+$a->strings["This is Red - another decentralized, distributed communications project by the folks at Friendica."] = "";
+$a->strings["Running at web location"] = "";
+$a->strings["Please visit <a href=\"http://friendica.com\">Friendica.com</a> to learn more about the Friendica and/or Red project."] = "";
+$a->strings["Bug reports and issues: please visit"] = "";
+$a->strings["Suggestions, praise, donations, etc. - please email \"Info\" at Friendica - dot com"] = "";
$a->strings["No suggestions available. If this is a new site, please try again in 24 hours."] = "";
$a->strings["Ignore/Hide"] = "";
-$a->strings["Global Directory"] = "";
-$a->strings["Normal site view"] = "";
-$a->strings["Admin - View all site entries"] = "";
-$a->strings["Find on this site"] = "";
-$a->strings["Site Directory"] = "";
-$a->strings["Gender: "] = "";
-$a->strings["No entries (some entries may be hidden)."] = "";
-$a->strings["%s : Not a valid email address."] = "";
-$a->strings["Please join my network on %s"] = "";
-$a->strings["%s : Message delivery failed."] = "";
-$a->strings["%d message sent."] = array(
- 0 => "",
- 1 => "",
-);
-$a->strings["You have no more invitations available"] = "";
-$a->strings["Send invitations"] = "";
-$a->strings["Enter email addresses, one per line:"] = "";
-$a->strings["Please join my social network on %s"] = "";
-$a->strings["To accept this invitation, please visit:"] = "";
-$a->strings["You will need to supply this invitation code: \$invite_code"] = "";
-$a->strings["Once you have registered, please connect with me via my profile page at:"] = "";
-$a->strings["Response from remote site was not understood."] = "";
-$a->strings["Unexpected response from remote site: "] = "";
-$a->strings["Confirmation completed successfully."] = "";
-$a->strings["Remote site reported: "] = "";
-$a->strings["Temporary failure. Please wait and try again."] = "";
-$a->strings["Introduction failed or was revoked."] = "";
-$a->strings["Unable to set contact photo."] = "";
-$a->strings["%1\$s is now friends with %2\$s"] = "";
-$a->strings["No user record found for '%s' "] = "";
-$a->strings["Our site encryption key is apparently messed up."] = "";
-$a->strings["Empty site URL was provided or URL could not be decrypted by us."] = "";
-$a->strings["Contact record was not found for you on our site."] = "";
-$a->strings["Site public key not available in contact record for URL %s."] = "";
-$a->strings["The ID provided by your system is a duplicate on our system. It should work if you try again."] = "";
-$a->strings["Unable to set your contact credentials on our system."] = "";
-$a->strings["Unable to update your contact profile details on our system"] = "";
-$a->strings["Connection accepted at %s"] = "";
-$a->strings["Facebook disabled"] = "";
-$a->strings["Updating contacts"] = "";
-$a->strings["Facebook API key is missing."] = "";
-$a->strings["Facebook Connect"] = "";
-$a->strings["Install Facebook connector for this account."] = "";
-$a->strings["Remove Facebook connector"] = "";
-$a->strings["Re-authenticate [This is necessary whenever your Facebook password is changed.]"] = "";
-$a->strings["Post to Facebook by default"] = "";
-$a->strings["Link all your Facebook friends and conversations on this website"] = "";
-$a->strings["Facebook conversations consist of your <em>profile wall</em> and your friend <em>stream</em>."] = "";
-$a->strings["On this website, your Facebook friend stream is only visible to you."] = "";
-$a->strings["The following settings determine the privacy of your Facebook profile wall on this website."] = "";
-$a->strings["On this website your Facebook profile wall conversations will only be visible to you"] = "";
-$a->strings["Do not import your Facebook profile wall conversations"] = "";
-$a->strings["If you choose to link conversations and leave both of these boxes unchecked, your Facebook profile wall will be merged with your profile wall on this website and your privacy settings on this website will be used to determine who may see the conversations."] = "";
-$a->strings["Comma separated applications to ignore"] = "";
-$a->strings["Facebook"] = "";
-$a->strings["Facebook Connector Settings"] = "";
-$a->strings["Post to Facebook"] = "";
-$a->strings["Post to Facebook cancelled because of multi-network access permission conflict."] = "";
-$a->strings["Image: "] = "";
-$a->strings["View on Friendica"] = "";
-$a->strings["Facebook post failed. Queued for retry."] = "";
-$a->strings["link"] = "";
-$a->strings["%d person likes this"] = array(
- 0 => "",
- 1 => "",
-);
-$a->strings["%d person doesn't like this"] = array(
- 0 => "",
- 1 => "",
-);
-$a->strings["Generate new key"] = "";
-$a->strings["Widgets key"] = "";
-$a->strings["Widgets available"] = "";
-$a->strings["Connect on Friendica!"] = "";
-$a->strings["YourLS Settings"] = "";
-$a->strings["URL: http://"] = "";
-$a->strings["Username:"] = "";
-$a->strings["Password:"] = "";
-$a->strings["Use SSL "] = "";
-$a->strings["yourls Settings saved."] = "";
-$a->strings["\"Not Safe For Work\" Settings"] = "";
-$a->strings["Enable NSFW filter"] = "";
-$a->strings["Comma separated words to treat as NSFW"] = "";
-$a->strings["Use /expression/ to provide regular expressions"] = "";
-$a->strings["NSFW Settings saved."] = "";
-$a->strings["%s - Click to open/close"] = "";
-$a->strings["Login"] = "";
-$a->strings["OpenID"] = "";
-$a->strings["Last users"] = "";
-$a->strings["Most active users"] = "";
-$a->strings["Last photos"] = "";
-$a->strings["Last likes"] = "";
-$a->strings["event"] = "";
-$a->strings["Allow to use your friendica id (%s) to connecto to external unhosted-enabled storage (like ownCloud). See <a href=\"http://www.w3.org/community/unhosted/wiki/RemoteStorage#WebFinger\">RemoteStorage WebFinger</a>"] = "";
-$a->strings["Template URL (with {category})"] = "";
-$a->strings["OAuth end-point"] = "";
-$a->strings["Api"] = "";
-$a->strings["Member since:"] = "";
-$a->strings["Three Dimensional Tic-Tac-Toe"] = "";
-$a->strings["3D Tic-Tac-Toe"] = "";
-$a->strings["New game"] = "";
-$a->strings["New game with handicap"] = "";
-$a->strings["Three dimensional tic-tac-toe is just like the traditional game except that it is played on multiple levels simultaneously. "] = "";
-$a->strings["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."] = "";
-$a->strings["The handicap game disables the center position on the middle level because the player claiming this square often has an unfair advantage."] = "";
-$a->strings["You go first..."] = "";
-$a->strings["I'm going first this time..."] = "";
-$a->strings["You won!"] = "";
-$a->strings["\"Cat\" game!"] = "";
-$a->strings["I won!"] = "";
-$a->strings["Randplace Settings"] = "";
-$a->strings["Enable Randplace Plugin"] = "";
-$a->strings["Post to Drupal"] = "";
-$a->strings["Drupal Post Settings"] = "";
-$a->strings["Enable Drupal Post Plugin"] = "";
-$a->strings["Drupal username"] = "";
-$a->strings["Drupal password"] = "";
-$a->strings["Post Type - article,page,or blog"] = "";
-$a->strings["Drupal site URL"] = "";
-$a->strings["Drupal site uses clean URLS"] = "";
-$a->strings["Post to Drupal by default"] = "";
-$a->strings["Post from Friendica"] = "";
-$a->strings["Geonames settings updated."] = "";
-$a->strings["Geonames Settings"] = "";
-$a->strings["Enable Geonames Plugin"] = "";
-$a->strings["Upload a file"] = "";
-$a->strings["Drop files here to upload"] = "";
-$a->strings["Failed"] = "";
-$a->strings["No files were uploaded."] = "";
-$a->strings["Uploaded file is empty"] = "";
-$a->strings["File has an invalid extension, it should be one of "] = "";
-$a->strings["Upload was cancelled, or server error encountered"] = "";
-$a->strings["OEmbed settings updated"] = "";
-$a->strings["Use OEmbed for YouTube videos"] = "";
-$a->strings["URL to embed:"] = "";
-$a->strings["Impressum"] = "";
-$a->strings["Site Owner"] = "";
-$a->strings["Email Address"] = "";
-$a->strings["Postal Address"] = "";
-$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."] = "";
-$a->strings["Site Owners Profile"] = "";
-$a->strings["Notes"] = "";
-$a->strings["Report Bug"] = "";
-$a->strings["\"Blockem\" Settings"] = "";
-$a->strings["Comma separated profile URLS to block"] = "";
-$a->strings["BLOCKEM Settings saved."] = "";
-$a->strings["Blocked %s - Click to open/close"] = "";
-$a->strings["Unblock Author"] = "";
-$a->strings["Block Author"] = "";
-$a->strings["blockem settings updated"] = "";
-$a->strings[":-)"] = "";
-$a->strings[":-("] = "";
-$a->strings["lol"] = "";
-$a->strings["Quick Comment Settings"] = "";
-$a->strings["Enter quick comments, one per line"] = "";
-$a->strings["Quick Comment settings saved."] = "";
-$a->strings["Tile Server URL"] = "";
-$a->strings["A list of <a href=\"http://wiki.openstreetmap.org/wiki/TMS\" target=\"_blank\">public tile servers</a>"] = "";
-$a->strings["Default zoom"] = "";
-$a->strings["The default zoom level. (1:world, 18:highest)"] = "";
-$a->strings["Editplain settings updated."] = "";
-$a->strings["Editplain Settings"] = "";
-$a->strings["Disable richtext status editor"] = "";
-$a->strings["\"pageheader\" Settings"] = "";
-$a->strings["pageheader Settings saved."] = "";
-$a->strings["View Source"] = "";
-$a->strings["Post to StatusNet"] = "";
-$a->strings["Please contact your site administrator.<br />The provided API URL is not valid."] = "";
-$a->strings["We could not contact the StatusNet API with the Path you entered."] = "";
-$a->strings["StatusNet settings updated."] = "";
-$a->strings["StatusNet Posting Settings"] = "";
-$a->strings["Globally Available StatusNet OAuthKeys"] = "";
-$a->strings["There are preconfigured OAuth key pairs for some StatusNet servers available. If you are useing one of them, please use these credentials. If not feel free to connect to any other StatusNet instance (see below)."] = "";
-$a->strings["Provide your own OAuth Credentials"] = "";
-$a->strings["No consumer key pair for StatusNet found. Register your Friendica Account as an desktop client on your StatusNet 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 StatusNet installation."] = "";
-$a->strings["OAuth Consumer Key"] = "";
-$a->strings["OAuth Consumer Secret"] = "";
-$a->strings["Base API Path (remember the trailing /)"] = "";
-$a->strings["To connect to your StatusNet account click the button below to get a security code from StatusNet which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to StatusNet."] = "";
-$a->strings["Log in with StatusNet"] = "";
-$a->strings["Copy the security code from StatusNet here"] = "";
-$a->strings["Cancel Connection Process"] = "";
-$a->strings["Current StatusNet API is"] = "";
-$a->strings["Cancel StatusNet Connection"] = "";
-$a->strings["Currently connected to: "] = "";
-$a->strings["If enabled all your <strong>public</strong> postings can be posted to the associated StatusNet account. You can choose to do so by default (here) or for every posting separately in the posting options when writing the entry."] = "";
-$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 StatusNet will lead the visitor to a blank page informing the visitor that the access to your profile has been restricted."] = "";
-$a->strings["Allow posting to StatusNet"] = "";
-$a->strings["Send public postings to StatusNet by default"] = "";
-$a->strings["Clear OAuth configuration"] = "";
-$a->strings["API URL"] = "";
-$a->strings["Post to Tumblr"] = "";
-$a->strings["Tumblr Post Settings"] = "";
-$a->strings["Enable Tumblr Post Plugin"] = "";
-$a->strings["Tumblr login"] = "";
-$a->strings["Tumblr password"] = "";
-$a->strings["Post to Tumblr by default"] = "";
-$a->strings["Numfriends settings updated."] = "";
-$a->strings["Numfriends Settings"] = "";
-$a->strings["How many contacts to display on profile sidebar"] = "";
-$a->strings["Post to Wordpress"] = "";
-$a->strings["WordPress Post Settings"] = "";
-$a->strings["Enable WordPress Post Plugin"] = "";
-$a->strings["WordPress username"] = "";
-$a->strings["WordPress password"] = "";
-$a->strings["WordPress API URL"] = "";
-$a->strings["Post to WordPress by default"] = "";
-$a->strings["\"Show more\" Settings"] = "";
-$a->strings["Enable Show More"] = "";
-$a->strings["Cutting posts after how much characters"] = "";
-$a->strings["Show More Settings saved."] = "";
-$a->strings["Show More"] = "";
-$a->strings["This website is tracked using the <a href='http://www.piwik.org'>Piwik</a> analytics tool."] = "";
-$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->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["Post to Twitter"] = "";
-$a->strings["Twitter settings updated."] = "";
-$a->strings["Twitter Posting Settings"] = "";
-$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["Log in with Twitter"] = "";
-$a->strings["Copy the PIN from Twitter here"] = "";
-$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."] = "";
-$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."] = "";
-$a->strings["Allow posting to Twitter"] = "";
-$a->strings["Send public postings to Twitter by default"] = "";
-$a->strings["Consumer key"] = "";
-$a->strings["Consumer secret"] = "";
-$a->strings["Post to Posterous"] = "";
-$a->strings["Posterous Post Settings"] = "";
-$a->strings["Enable Posterous Post Plugin"] = "";
-$a->strings["Posterous login"] = "";
-$a->strings["Posterous password"] = "";
-$a->strings["Post to Posterous by default"] = "";
-$a->strings["Gender:"] = "";
-$a->strings["j F, Y"] = "";
-$a->strings["j F"] = "";
-$a->strings["Birthday:"] = "";
-$a->strings["Age:"] = "";
-$a->strings["Status:"] = "";
-$a->strings["Homepage:"] = "";
-$a->strings["Tags:"] = "";
-$a->strings["Religion:"] = "";
-$a->strings["About:"] = "";
-$a->strings["Hobbies/Interests:"] = "";
-$a->strings["Contact information and Social Networks:"] = "";
-$a->strings["Musical interests:"] = "";
-$a->strings["Books, literature:"] = "";
-$a->strings["Television:"] = "";
-$a->strings["Film/dance/culture/entertainment:"] = "";
-$a->strings["Love/Romance:"] = "";
-$a->strings["Work/employment:"] = "";
-$a->strings["School/education:"] = "";
-$a->strings["Unknown | Not categorised"] = "";
-$a->strings["Block immediately"] = "";
-$a->strings["Shady, spammer, self-marketer"] = "";
-$a->strings["Known to me, but no opinion"] = "";
-$a->strings["OK, probably harmless"] = "";
-$a->strings["Reputable, has my trust"] = "";
-$a->strings["Frequently"] = "";
-$a->strings["Hourly"] = "";
-$a->strings["Twice daily"] = "";
-$a->strings["Daily"] = "";
-$a->strings["Weekly"] = "";
-$a->strings["Monthly"] = "";
-$a->strings["OStatus"] = "";
-$a->strings["RSS/Atom"] = "";
-$a->strings["Zot!"] = "";
-$a->strings["LinkedIn"] = "";
-$a->strings["XMPP/IM"] = "";
-$a->strings["MySpace"] = "";
-$a->strings["Male"] = "";
-$a->strings["Female"] = "";
-$a->strings["Currently Male"] = "";
-$a->strings["Currently Female"] = "";
-$a->strings["Mostly Male"] = "";
-$a->strings["Mostly Female"] = "";
-$a->strings["Transgender"] = "";
-$a->strings["Intersex"] = "";
-$a->strings["Transsexual"] = "";
-$a->strings["Hermaphrodite"] = "";
-$a->strings["Neuter"] = "";
-$a->strings["Non-specific"] = "";
-$a->strings["Other"] = "";
-$a->strings["Undecided"] = "";
-$a->strings["Males"] = "";
-$a->strings["Females"] = "";
-$a->strings["Gay"] = "";
-$a->strings["Lesbian"] = "";
-$a->strings["No Preference"] = "";
-$a->strings["Bisexual"] = "";
-$a->strings["Autosexual"] = "";
-$a->strings["Abstinent"] = "";
-$a->strings["Virgin"] = "";
-$a->strings["Deviant"] = "";
-$a->strings["Fetish"] = "";
-$a->strings["Oodles"] = "";
-$a->strings["Nonsexual"] = "";
-$a->strings["Single"] = "";
-$a->strings["Lonely"] = "";
-$a->strings["Available"] = "";
-$a->strings["Unavailable"] = "";
-$a->strings["Dating"] = "";
-$a->strings["Unfaithful"] = "";
-$a->strings["Sex Addict"] = "";
-$a->strings["Friends"] = "";
-$a->strings["Friends/Benefits"] = "";
-$a->strings["Casual"] = "";
-$a->strings["Engaged"] = "";
-$a->strings["Married"] = "";
-$a->strings["Partners"] = "";
-$a->strings["Cohabiting"] = "";
-$a->strings["Happy"] = "";
-$a->strings["Not Looking"] = "";
-$a->strings["Swinger"] = "";
-$a->strings["Betrayed"] = "";
-$a->strings["Separated"] = "";
-$a->strings["Unstable"] = "";
-$a->strings["Divorced"] = "";
-$a->strings["Widowed"] = "";
-$a->strings["Uncertain"] = "";
-$a->strings["Complicated"] = "";
-$a->strings["Don't care"] = "";
-$a->strings["Ask me"] = "";
-$a->strings["Starts:"] = "";
-$a->strings["Finishes:"] = "";
-$a->strings["(no subject)"] = "";
-$a->strings["noreply"] = "";
-$a->strings["prev"] = "";
-$a->strings["first"] = "";
-$a->strings["last"] = "";
-$a->strings["next"] = "";
-$a->strings["No contacts"] = "";
-$a->strings["%d Contact"] = array(
- 0 => "",
- 1 => "",
-);
-$a->strings["Search"] = "";
-$a->strings["Monday"] = "";
-$a->strings["Tuesday"] = "";
-$a->strings["Wednesday"] = "";
-$a->strings["Thursday"] = "";
-$a->strings["Friday"] = "";
-$a->strings["Saturday"] = "";
-$a->strings["Sunday"] = "";
-$a->strings["January"] = "";
-$a->strings["February"] = "";
-$a->strings["March"] = "";
-$a->strings["April"] = "";
-$a->strings["May"] = "";
-$a->strings["June"] = "";
-$a->strings["July"] = "";
-$a->strings["August"] = "";
-$a->strings["September"] = "";
-$a->strings["October"] = "";
-$a->strings["November"] = "";
-$a->strings["December"] = "";
-$a->strings["bytes"] = "";
-$a->strings["Select an alternate language"] = "";
-$a->strings["default"] = "";
-$a->strings["Sharing notification from Diaspora network"] = "";
-$a->strings["Attachments:"] = "";
-$a->strings["[Relayed] Comment authored by %s from network %s"] = "";
-$a->strings["Embedded content"] = "";
-$a->strings["Embedding disabled"] = "";
-$a->strings["A deleted group with this name was revived. Existing item permissions <strong>may</strong> apply to this group and any future members. If this is not what you intended, please create another group with a different name."] = "";
-$a->strings["Everybody"] = "";
-$a->strings["edit"] = "";
-$a->strings["Groups"] = "";
-$a->strings["Edit group"] = "";
-$a->strings["Create a new group"] = "";
-$a->strings["Logout"] = "";
-$a->strings["End this session"] = "";
-$a->strings["Status"] = "";
-$a->strings["Your posts and conversations"] = "";
-$a->strings["Your profile page"] = "";
-$a->strings["Photos"] = "";
-$a->strings["Your photos"] = "";
-$a->strings["Your events"] = "";
-$a->strings["Personal notes"] = "";
-$a->strings["Your personal photos"] = "";
-$a->strings["Sign in"] = "";
-$a->strings["Home Page"] = "";
-$a->strings["Create an account"] = "";
-$a->strings["Help and documentation"] = "";
-$a->strings["Apps"] = "";
-$a->strings["Addon applications, utilities, games"] = "";
-$a->strings["Search site content"] = "";
-$a->strings["Conversations on this site"] = "";
-$a->strings["Directory"] = "";
-$a->strings["People directory"] = "";
-$a->strings["Conversations from your friends"] = "";
-$a->strings["Friend Requests"] = "";
-$a->strings["See all notifications"] = "";
-$a->strings["Mark all system notifications seen"] = "";
-$a->strings["Private mail"] = "";
-$a->strings["Manage"] = "";
-$a->strings["Manage other pages"] = "";
-$a->strings["Profiles"] = "";
-$a->strings["Manage/edit profiles"] = "";
-$a->strings["Manage/edit friends and contacts"] = "";
-$a->strings["Admin"] = "";
-$a->strings["Site setup and configuration"] = "";
-$a->strings["Nothing new here"] = "";
-$a->strings["Add New Contact"] = "";
-$a->strings["Enter address or web location"] = "";
-$a->strings["Example: bob@example.com, http://example.com/barbara"] = "";
-$a->strings["Invite Friends"] = "";
-$a->strings["%d invitation available"] = array(
- 0 => "",
- 1 => "",
-);
-$a->strings["Find People"] = "";
-$a->strings["Enter name or interest"] = "";
-$a->strings["Connect/Follow"] = "";
-$a->strings["Examples: Robert Morgenstein, Fishing"] = "";
-$a->strings["Similar Interests"] = "";
-$a->strings["Networks"] = "";
-$a->strings["All Networks"] = "";
-$a->strings["Logged out."] = "";
-$a->strings["Miscellaneous"] = "";
-$a->strings["year"] = "";
-$a->strings["month"] = "";
-$a->strings["day"] = "";
-$a->strings["never"] = "";
-$a->strings["less than a second ago"] = "";
-$a->strings["years"] = "";
-$a->strings["months"] = "";
-$a->strings["week"] = "";
-$a->strings["weeks"] = "";
-$a->strings["days"] = "";
-$a->strings["hour"] = "";
-$a->strings["hours"] = "";
-$a->strings["minute"] = "";
-$a->strings["minutes"] = "";
-$a->strings["second"] = "";
-$a->strings["seconds"] = "";
-$a->strings["%1\$d %2\$s ago"] = "";
-$a->strings["From: "] = "";
-$a->strings["$1 wrote:"] = "";
-$a->strings["Image/photo"] = "";
-$a->strings["Cannot locate DNS info for database server '%s'"] = "";
-$a->strings["[no subject]"] = "";
-$a->strings["Visible to everybody"] = "";
-$a->strings["show"] = "";
-$a->strings["don't show"] = "";
-$a->strings["Friendica Notification"] = "";
-$a->strings["Thank You,"] = "";
-$a->strings["%s Administrator"] = "";
-$a->strings["New mail received at %s"] = "";
-$a->strings["%s sent you a new private message at %s."] = "";
-$a->strings["%s sent you %s."] = "";
-$a->strings["a private message"] = "";
-$a->strings["Please visit %s to view and/or reply to your private messages."] = "";
-$a->strings["%s commented on an item at %s"] = "";
-$a->strings["%s commented on an item/conversation you have been following."] = "";
-$a->strings["%s commented in %s."] = "";
-$a->strings["a watched conversation"] = "";
-$a->strings["Please visit %s to view and/or reply to the conversation."] = "";
-$a->strings["%s posted to your profile wall at %s"] = "";
-$a->strings["%s posted to %s"] = "";
-$a->strings["your profile wall."] = "";
-$a->strings["%s tagged you at %s"] = "";
-$a->strings["%s %s."] = "";
-$a->strings["tagged you"] = "";
-$a->strings["%s tagged your post at %s"] = "";
-$a->strings["%s tagged %s"] = "";
-$a->strings["your post"] = "";
-$a->strings["Introduction received at %s"] = "";
-$a->strings["You've received an introduction from '%s' at %s"] = "";
-$a->strings["You've received %s from %s."] = "";
-$a->strings["an introduction"] = "";
-$a->strings["You may visit their profile at %s"] = "";
-$a->strings["Please visit %s to approve or reject the introduction."] = "";
-$a->strings["Friend suggestion received at %s"] = "";
-$a->strings["You've received a friend suggestion from '%s' at %s"] = "";
-$a->strings["You've received %s for %s from %s."] = "";
-$a->strings["a friend suggestion"] = "";
-$a->strings["Name:"] = "";
-$a->strings["Photo:"] = "";
-$a->strings["Please visit %s to approve or reject the suggestion."] = "";
-$a->strings["A new person is sharing with you at "] = "";
-$a->strings["You have a new follower at "] = "";
-$a->strings["view full size"] = "";
-$a->strings["image/photo"] = "";
-$a->strings["Welcome "] = "";
-$a->strings["Please upload a profile photo."] = "";
-$a->strings["Welcome back "] = "";
-$a->strings["View status"] = "";
-$a->strings["View profile"] = "";
-$a->strings["View photos"] = "";
-$a->strings["View recent"] = "";
-$a->strings["Send PM"] = "";
-$a->strings["post/item"] = "";
-$a->strings["%1\$s marked %2\$s's %3\$s as favorite"] = "";
-$a->strings["Select"] = "";
-$a->strings["View %s's profile @ %s"] = "";
-$a->strings["%s from %s"] = "";
-$a->strings["View in context"] = "";
-$a->strings["%d comment"] = array(
- 0 => "",
- 1 => "",
-);
-$a->strings["show more"] = "";
-$a->strings["like"] = "";
-$a->strings["dislike"] = "";
-$a->strings["Share this"] = "";
-$a->strings["share"] = "";
-$a->strings["add star"] = "";
-$a->strings["remove star"] = "";
-$a->strings["toggle star status"] = "";
-$a->strings["starred"] = "";
-$a->strings["add tag"] = "";
-$a->strings["to"] = "";
-$a->strings["Wall-to-Wall"] = "";
-$a->strings["via Wall-To-Wall:"] = "";
-$a->strings["Delete Selected Items"] = "";
-$a->strings["%s likes this."] = "";
-$a->strings["%s doesn't like this."] = "";
-$a->strings["<span %1\$s>%2\$d people</span> like this."] = "";
-$a->strings["<span %1\$s>%2\$d people</span> don't like this."] = "";
-$a->strings["and"] = "";
-$a->strings[", and %d other people"] = "";
-$a->strings["%s like this."] = "";
-$a->strings["%s don't like this."] = "";
-$a->strings["Visible to <strong>everybody</strong>"] = "";
-$a->strings["Please enter a video link/URL:"] = "";
-$a->strings["Please enter an audio link/URL:"] = "";
-$a->strings["Tag term:"] = "";
-$a->strings["Where are you right now?"] = "";
-$a->strings["Enter a title for this item"] = "";
-$a->strings["upload photo"] = "";
-$a->strings["attach file"] = "";
-$a->strings["web link"] = "";
-$a->strings["Insert video link"] = "";
-$a->strings["video link"] = "";
-$a->strings["Insert audio link"] = "";
-$a->strings["audio link"] = "";
-$a->strings["set location"] = "";
-$a->strings["clear location"] = "";
-$a->strings["permissions"] = "";
-$a->strings["Delete this item?"] = "";
-$a->strings["show fewer"] = "";
+$a->strings["Maximum daily site registrations exceeded. Please try again tomorrow."] = "";
+$a->strings["Please indicate acceptance of the Terms of Service. Registration failed."] = "";
+$a->strings["Registration successful. Please check your email for validation instructions."] = "";
+$a->strings["Your registration is pending approval by the site owner."] = "";
+$a->strings["Your registration can not be processed."] = "";
+$a->strings["This site has exceeded the number of allowed daily account registrations. Please try again tomorrow."] = "";
+$a->strings["Terms of Service"] = "";
+$a->strings["I accept the %s for this website"] = "";
+$a->strings["I am over 13 years of age and accept the %s for this website"] = "";
+$a->strings["Membership on this site is by invitation only."] = "";
+$a->strings["Please enter your invitation code"] = "";
+$a->strings["Your email address"] = "";
+$a->strings["Choose a password"] = "";
+$a->strings["Please re-enter your password"] = "";
+$a->strings["Please login."] = "";
+$a->strings["Remove My Account"] = "";
+$a->strings["This will completely remove your account. Once this has been done it is not recoverable."] = "";
+$a->strings["Please enter your password for verification:"] = "";
+$a->strings["Mood"] = "";
+$a->strings["Set your current mood and tell your friends"] = "";
+$a->strings["Theme settings"] = "";
+$a->strings["Set font-size for posts and comments"] = "";
+$a->strings["Set line-height for posts and comments"] = "";
+$a->strings["Set colour scheme"] = "";
+$a->strings["Draw shadows"] = "";
+$a->strings["Navigation bar colour"] = "";
+$a->strings["Display style"] = "";
+$a->strings["Display colour of links - hex value, do not include the #"] = "";
+$a->strings["Icons"] = "";
+$a->strings["Shiny style"] = "";
+$a->strings["Corner radius"] = "";
+$a->strings["0-99 default: 5"] = "";
+$a->strings["Update %s failed. See error logs."] = "";
+$a->strings["Update Error at %s"] = "";
$a->strings["Create a New Account"] = "";
-$a->strings["Nickname or Email address: "] = "";
-$a->strings["Password: "] = "";
-$a->strings["Or login using OpenID: "] = "";
+$a->strings["Password"] = "";
+$a->strings["Remember me"] = "";
$a->strings["Forgot your password?"] = "";
-$a->strings["Edit profile"] = "";
-$a->strings["g A l F d"] = "";
+$a->strings["Requested channel is not available."] = "";
+$a->strings[" Sorry, you don't have the permission to view this profile. "] = "";
+$a->strings["Profiles"] = "";
+$a->strings["Manage/edit profiles"] = "";
+$a->strings["Edit Profile"] = "";
$a->strings["F d"] = "";
$a->strings["Birthday Reminders"] = "";
$a->strings["Birthdays this week:"] = "";
-$a->strings["[today]"] = "";
+$a->strings["[No description]"] = "";
$a->strings["Event Reminders"] = "";
$a->strings["Events this week:"] = "";
-$a->strings["[No description]"] = "";
+$a->strings["Channel"] = "";
+$a->strings["Status Messages and Posts"] = "";
+$a->strings["About"] = "";
+$a->strings["Profile Details"] = "";
+$a->strings["Events and Calendar"] = "";
+$a->strings["Webpages"] = "";
+$a->strings["Manage Webpages"] = "";
+$a->strings["toggle mobile"] = "";
diff --git a/util/tpldebug.php b/util/tpldebug.php
new file mode 100644
index 000000000..80da410dc
--- /dev/null
+++ b/util/tpldebug.php
@@ -0,0 +1,43 @@
+<?php
+
+// Tool to assist with figuring out what variables are passed to templates.
+// It will take a source php file and print all the template calls it finds, including the passed args.
+// With no args it will enumerate all templates in boot.php, include/* and mod/*
+// This is a quick hack and far from perfect (there's a template call in boot.php that buggers the regex from the get-go)
+// but is one step towards template documentation.
+
+
+if($argc > 1) {
+ echo "{$argv[1]}: templates\n";
+ print_template($argv[1]);
+}
+else {
+
+
+ echo 'boot.php: templates' . "\n";
+ print_template('boot.php');
+
+ $files = glob('include/*.php');
+ foreach($files as $file) {
+ echo $file . ': templates'. "\n";
+ print_template($file);
+ }
+
+ $files = glob('mod/*.php');
+ foreach($files as $file) {
+ echo $file . ': templates'. "\n";
+ print_template($file);
+ }
+}
+
+function print_template($s) {
+ $x = file_get_contents($s);
+
+ $cnt = preg_match_all('/replace_macros(.*?)\)\;/ism',$x,$matches);
+
+ if($cnt) {
+ print_r($matches[0]);
+
+ }
+
+} \ No newline at end of file
diff --git a/util/typo.php b/util/typo.php
index c4d038ce8..6c846696d 100644
--- a/util/typo.php
+++ b/util/typo.php
@@ -19,6 +19,20 @@
include_once($file);
}
+ echo "Directory: include/dba\n";
+ $files = glob('include/dba/*.php');
+ foreach($files as $file) {
+ echo $file . "\n";
+ include_once($file);
+ }
+
+ echo "Directory: include/photo\n";
+ $files = glob('include/photo/*.php');
+ foreach($files as $file) {
+ echo $file . "\n";
+ include_once($file);
+ }
+
echo "Directory: mod\n";
$files = glob('mod/*.php');
foreach($files as $file) {
@@ -38,8 +52,8 @@
}
}
- if(x($a->config,'php_path'))
- $phpath = $a->config['php_path'];
+ if(x($a->config,'system') && x($a->config['system'],'php_path'))
+ $phpath = $a->config['system']['php_path'];
else
$phpath = 'php';
diff --git a/util/wp/post_to_red/post_to_red.php b/util/wp/post_to_red/post_to_red.php
new file mode 100644
index 000000000..e7f18985e
--- /dev/null
+++ b/util/wp/post_to_red/post_to_red.php
@@ -0,0 +1,489 @@
+<?php
+/*
+Plugin Name: CrossPost to Red Matrix
+Plugin URI: http://blog.duthied.com/2011/09/12/friendika-cross-poster-wordpress-plugin/
+Description: This plugin allows you to cross post to your Red Matrix account. Extended by Mike Macgirvin from a Friendica cross-posting tool
+Version: 1.2
+Author: Devlon Duthied
+Author URI: http://blog.duthied.com
+*/
+
+/* Copyright 2011 Devlon Duthie (email: duthied@gmail.com)
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License, version 2, as
+ published by the Free Software Foundation.
+
+ 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, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+*/
+
+define("post_to_red_path", WP_PLUGIN_URL . "/" . str_replace(basename( __FILE__), "", plugin_basename(__FILE__)));
+define("post_to_red_version", "1.2");
+$plugin_dir = basename(dirname(__FILE__));
+$plugin = plugin_basename(__FILE__);
+
+define("post_to_red_acct_name", "post_to_red_admin_options");
+
+function post_to_red_deactivate() {
+ delete_option('post_to_red_seed_location');
+ delete_option('post_to_red_acct_name');
+ delete_option('post_to_red_user_name');
+ delete_option('post_to_red_password');
+}
+
+function post_to_red_get_seed_location() {
+ return get_option('post_to_red_seed_location');
+}
+
+function post_to_red_get_acct_name() {
+ return get_option('post_to_red_acct_name');
+}
+
+function post_to_red_get_channel_name() {
+ return get_option('post_to_red_channel_name');
+}
+
+function post_to_red_get_password() {
+ return get_option('post_to_red_password');
+}
+
+function post_to_red_post($post_id) {
+
+ $post = get_post($post_id);
+
+ if (isset($_POST['post_to_red'])) {
+ update_post_meta($post_id, 'post_to_red', '1');
+ }
+
+ // if meta has been set
+ if (get_post_meta($post_id, "post_to_red", true) === '1') {
+
+ $user_name = post_to_red_get_acct_name();
+ $password = post_to_red_get_password();
+ $seed_location = post_to_red_get_seed_location();
+ $channel = post_to_red_get_channel_name();
+ $backlink = get_option('post_to_red_backlink');
+
+ if ((isset($user_name)) && (isset($password)) && (isset($seed_location))) {
+ // remove potential comments
+ $message = preg_replace('/<!--(.*)-->/Uis', '', $post->post_content);
+
+ // get any tags and make them hashtags
+ $post_tags = get_the_tags($post_id);
+ if ($post_tags) {
+ foreach($post_tags as $tag) {
+ $tag_string .= "#" . $tag->name . " ";
+ }
+ }
+
+ $message_id = site_url() . '/' . $post_id;
+
+ if (isset($tag_string)) {
+ $message .= "<br />$tag_string";
+ }
+
+ $cats = '';
+
+ $terms = get_the_terms($post_id,'category');
+ if($terms) {
+ foreach($terms as $term) {
+ if(strlen($cats))
+ $cats .= ',';
+ $cats .= htmlspecialchars_decode($term->name, ENT_COMPAT);
+ }
+ }
+
+
+
+ $bbcode = xpost_to_html2bbcode($message);
+
+ if($backlink)
+ $bbcode .= "\n\n" . _('Source:') . ' ' . '[url]' . get_permalink($post_id) . '[/url]';
+
+ $url = $seed_location . '/api/statuses/update';
+
+ $headers = array('Authorization' => 'Basic '.base64_encode("$user_name:$password"));
+ $body = array(
+ 'title' => xpost_to_html2bbcode($post->post_title),
+ 'status' => $bbcode,
+ 'source' => 'WordPress',
+ 'namespace' => 'wordpress',
+ 'remote_id' => $message_id,
+ 'permalink' => $post->guid
+ );
+ if($channel)
+ $body['channel'] = $channel;
+ if($cats)
+ $body['category'] = $cats;
+
+ // post:
+ $request = new WP_Http;
+ $result = $request->request($url , array( 'method' => 'POST', 'body' => $body, 'headers' => $headers));
+
+ }
+
+ }
+}
+
+
+function post_to_red_delete_post($post_id) {
+
+ $post = get_post($post_id);
+
+ // if meta has been set
+ if ((get_post_meta($post_id, "post_to_red", true) == '1') || (get_post_meta($post_id, "post_from_red", true) == '1')) {
+
+ $user_name = post_to_red_get_acct_name();
+ $password = post_to_red_get_password();
+ $seed_location = post_to_red_get_seed_location();
+ $channel = post_to_red_get_channel_name();
+
+ if ((isset($user_name)) && (isset($password)) && (isset($seed_location))) {
+
+ $message_id = site_url() . '/' . $post_id;
+ $url = $seed_location . '/api/statuses/destroy';
+
+ $headers = array('Authorization' => 'Basic '.base64_encode("$user_name:$password"));
+ $body = array(
+ 'namespace' => 'wordpress',
+ 'remote_id' => $message_id,
+ );
+ if($channel)
+ $body['channel'] = $channel;
+
+ // post:
+ $request = new WP_Http;
+ $result = $request->request($url , array( 'method' => 'POST', 'body' => $body, 'headers' => $headers));
+
+ }
+
+ }
+}
+
+function post_to_red_delete_comment($post_id) {
+
+ // The comment may already be destroyed so we can't query it or the parent post. That means
+ // we have to make a network call for any deleted comment to see if it's registered on Red.
+ // We really need a "before_delete_comment" action in WP to make
+ // this more efficient.
+
+ $user_name = post_to_red_get_acct_name();
+ $password = post_to_red_get_password();
+ $seed_location = post_to_red_get_seed_location();
+ $channel = post_to_red_get_channel_name();
+
+ if ((isset($user_name)) && (isset($password)) && (isset($seed_location))) {
+
+ $message_id = site_url() . '/' . $post_id;
+ $url = $seed_location . '/api/statuses/destroy';
+
+ $headers = array('Authorization' => 'Basic '.base64_encode("$user_name:$password"));
+ $body = array(
+ 'namespace' => 'wordpress',
+ 'comment_id' => $message_id,
+ );
+ if($channel)
+ $body['channel'] = $channel;
+
+ // post:
+ $request = new WP_Http;
+ $result = $request->request($url , array( 'method' => 'POST', 'body' => $body, 'headers' => $headers));
+ }
+}
+
+
+
+
+function post_to_red_displayAdminContent() {
+
+ $seed_url = post_to_red_get_seed_location();
+ $password = post_to_red_get_password();
+ $user_acct = post_to_red_get_acct_name();
+ $channel = post_to_red_get_channel_name();
+ $backlink = get_option('post_to_red_backlink');
+ $backlink_checked = ((intval($backlink)) ? ' checked="checked" ' : '');
+ // debug...
+ // echo "seed location: $seed_url</br>";
+ // echo "password: $password</br>";
+ // echo "user_acct: $user_acct</br>";
+
+ echo <<<EOF
+ <div class='wrap'>
+ <h2>CrossPost to Red Matrix</h2>
+ <p>This plugin allows you to cross post to your Red Matrix channel.</p>
+ </div>
+
+ <div class="wrap">
+ <h2>Configuration</h2>
+ <form method="post" action="{$_SERVER["REQUEST_URI"]}">
+ Enter the login details of your Red Matrix account<br /><br />
+ Login (email): <input type="text" name="post_to_red_acct_name" value="{$user_acct}"/><br />
+ Password: <input type="password" name="post_to_red_password" value="{$password}"/><br />
+ Red Matrix URL: <input type="text" name="post_to_red_url" value="{$seed_url}"/><br />
+ Optional channel nickname: <input type="text" name="post_to_red_channel" value="{$channel}"/><br />
+ Add permalink to posts? <input type="checkbox" name="post_to_red_backlink" value="1" {$backlink_checked} /><br />
+ <input type="submit" value="Save" name="submit" />
+ </form>
+ <p></p>
+ </div>
+EOF;
+
+ if(isset($_POST['submit'])) {
+ echo "<div style='text-align:center;padding:4px;width:200px;background-color:#FFFF99;border:1xp solid #CCCCCC;color:#000000;'>Settings Saved!</div>";
+ }
+}
+
+function post_to_red_post_checkbox() {
+
+ add_meta_box(
+ 'post_to_red_meta_box_id',
+ 'Cross Post to Red Matrix',
+ 'post_to_red_post_meta_content',
+ 'post',
+ 'normal',
+ 'default'
+ );
+}
+
+function post_to_red_post_meta_content($post_id) {
+ wp_nonce_field(plugin_basename( __FILE__ ), 'post_to_red_nonce');
+ echo '<input type="checkbox" name="post_to_red" value="1" /> Cross post?';
+}
+
+function post_to_red_post_field_data($post_id) {
+
+ // check if this isn't an auto save
+ if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
+ return;
+
+ // security check
+ if((! array_key_exists('post_to_red_nonce', $_POST))
+ || (!wp_verify_nonce( $_POST['post_to_red_nonce'], plugin_basename( __FILE__ ))))
+ return;
+
+ // now store data in custom fields based on checkboxes selected
+ if (isset($_POST['post_to_red'])) {
+ update_post_meta($post_id, 'post_to_red', '1');
+ }
+}
+
+function post_to_red_display_admin_page() {
+
+ if ((isset($_REQUEST["post_to_red_acct_name"])) && (isset($_REQUEST["post_to_red_password"]))) {
+
+ $password = $_REQUEST["post_to_red_password"];
+ $red_url = $_REQUEST["post_to_red_url"];
+ $channelname = $_REQUEST['post_to_red_channel'];
+
+
+ update_option('post_to_red_acct_name', $_REQUEST["post_to_red_acct_name"]);
+ update_option('post_to_red_channel_name', $channelname);
+ update_option('post_to_red_seed_location', $red_url);
+ update_option('post_to_red_password', $password);
+ update_option('post_to_red_backlink', $_REQUEST['post_to_red_backlink']);
+ }
+
+ post_to_red_displayAdminContent();
+}
+
+function post_to_red_settings_link($links) {
+ $settings_link = '<a href="options-general.php?page=xpost-to-redmatrix">Settings</a>';
+ array_unshift($links, $settings_link);
+ return $links;
+}
+
+function post_to_red_admin() {
+ add_options_page("Crosspost to redmatrix", "Crosspost to redmatrix", "manage_options", "xpost-to-redmatrix", "post_to_red_display_admin_page");
+}
+
+register_deactivation_hook( __FILE__, 'post_to_red_deactivate' );
+
+add_filter("plugin_action_links_$plugin", "post_to_red_settings_link");
+
+add_action("admin_menu", "post_to_red_admin");
+add_action('publish_post', 'post_to_red_post');
+add_action('add_meta_boxes', 'post_to_red_post_checkbox');
+add_action('save_post', 'post_to_red_post_field_data');
+add_action('before_delete_post', 'post_to_red_delete_post');
+
+add_action('delete_comment', 'post_to_red_delete_comment');
+
+add_filter('xmlrpc_methods', 'red_xmlrpc_methods');
+
+add_filter('get_avatar', 'post_to_red_get_avatar',10,5);
+
+
+function red_xmlrpc_methods($methods) {
+ $methods['red.Comment'] = 'red_comment';
+ return $methods;
+}
+
+function red_comment($args) {
+ global $wp_xmlrpc_server;
+ $wp_xmlrpc_server->escape( $args );
+
+ $blog_id = $args[0];
+ $username = $args[1];
+ $password = $args[2];
+ $post = $args[3];
+ $content_struct = $args[4];
+
+ if ( ! $user = $wp_xmlrpc_server->login( $username, $password ) )
+ return $wp_xmlrpc_server->error;
+
+ if ( is_numeric($post) )
+ $post_id = absint($post);
+ else
+ $post_id = url_to_postid($post);
+
+ if ( ! $post_id )
+ return new IXR_Error( 404, __( 'Invalid post ID.' ) );
+ if ( ! get_post($post_id) )
+ return new IXR_Error( 404, __( 'Invalid post ID.' ) );
+
+ $comment['comment_post_ID'] = $post_id;
+
+ $comment['comment_author'] = '';
+ if ( isset($content_struct['author']) )
+ $comment['comment_author'] = $content_struct['author'];
+
+ $comment['comment_author_email'] = '';
+ if ( isset($content_struct['author_email']) )
+ $comment['comment_author_email'] = $content_struct['author_email'];
+
+ $comment['comment_author_url'] = '';
+ if ( isset($content_struct['author_url']) )
+ $comment['comment_author_url'] = $content_struct['author_url'];
+
+ $comment['user_ID'] = 0;
+
+ if ( get_option('require_name_email') ) {
+ if ( 6 > strlen($comment['comment_author_email']) || '' == $comment['comment_author'] )
+ return new IXR_Error( 403, __( 'Comment author name and email are required' ) );
+ elseif ( !is_email($comment['comment_author_email']) )
+ return new IXR_Error( 403, __( 'A valid email address is required' ) );
+ }
+
+ if(isset($content_struct['comment_id'])) {
+ $comment['comment_ID'] = intval($content_struct['comment_id']);
+ $edit = true;
+ }
+ $comment['comment_post_ID'] = $post_id;
+ $comment['comment_parent'] = isset($content_struct['comment_parent']) ? absint($content_struct['comment_parent']) : 0;
+ $comment['comment_content'] = isset($content_struct['content']) ? $content_struct['content'] : null;
+
+ do_action('xmlrpc_call', 'red.Comment');
+
+ if($edit) {
+ $result = wp_update_comment($comment);
+ $comment_ID = $comment['comment_ID'];
+ }
+ else {
+ $comment_ID = wp_new_comment( $comment );
+ if($comment_ID)
+ wp_set_comment_status($comment_ID,'approve');
+ }
+
+ if(isset($content_struct['red_avatar']))
+ add_comment_meta($comment_ID,'red_avatar',$content_struct['red_avatar'],true);
+
+ do_action( 'xmlrpc_call_success_red_Comment', $comment_ID, $args );
+
+ return $comment_ID;
+}
+
+function post_to_red_get_avatar($avatar,$id_or_email,$size,$default,$alt) {
+
+ if(! is_object($id_or_email))
+ return $avatar;
+ if((! array_key_exists('comment_author_email',$id_or_email)) || (empty($id_or_email->comment_author_email)))
+ return $avatar;
+ if((! array_key_exists('comment_ID', $id_or_email)) || (! intval($id_or_email->comment_ID)))
+ return $avatar;
+ $l = get_comment_meta($id_or_email->comment_ID,'red_avatar',true);
+ if($l) {
+ $safe_alt = esc_attr($alt);
+ $avatar = "<img alt='{$safe_alt}' src='{$l}' class='avatar avatar-{$size} photo' height='{$size}' width='{$size}' />";
+ }
+ return $avatar;
+}
+
+
+// from:
+// http://www.docgate.com/tutorial/php/how-to-convert-html-to-bbcode-with-php-script.html
+function xpost_to_html2bbcode($text) {
+ $htmltags = array(
+ '/\<b\>(.*?)\<\/b\>/is',
+ '/\<i\>(.*?)\<\/i\>/is',
+ '/\<u\>(.*?)\<\/u\>/is',
+ '/\<ul.*?\>(.*?)\<\/ul\>/is',
+ '/\<li\>(.*?)\<\/li\>/is',
+ '/\<img(.*?) src=\"(.*?)\" alt=\"(.*?)\" title=\"Smile(y?)\" \/\>/is', // some smiley
+ '/\<img(.*?) src=\"http:\/\/(.*?)\" (.*?)\>/is',
+ '/\<img(.*?) src=\"(.*?)\" alt=\":(.*?)\" .*? \/\>/is', // some smiley
+ '/\<div class=\"quotecontent\"\>(.*?)\<\/div\>/is',
+ '/\<div class=\"codecontent\"\>(.*?)\<\/div\>/is',
+ '/\<div class=\"quotetitle\"\>(.*?)\<\/div\>/is',
+ '/\<div class=\"codetitle\"\>(.*?)\<\/div\>/is',
+ '/\<cite.*?\>(.*?)\<\/cite\>/is',
+ '/\<blockquote.*?\>(.*?)\<\/blockquote\>/is',
+ '/\<div\>(.*?)\<\/div\>/is',
+ '/\<code\>(.*?)\<\/code\>/is',
+ '/\<br(.*?)\>/is',
+ '/\<strong\>(.*?)\<\/strong\>/is',
+ '/\<em\>(.*?)\<\/em\>/is',
+ '/\<a href=\"mailto:(.*?)\"(.*?)\>(.*?)\<\/a\>/is',
+ '/\<a .*?href=\"(.*?)\"(.*?)\>http:\/\/(.*?)\<\/a\>/is',
+ '/\<a .*?href=\"(.*?)\"(.*?)\>(.*?)\<\/a\>/is'
+ );
+
+ $bbtags = array(
+ '[b]$1[/b]',
+ '[i]$1[/i]',
+ '[u]$1[/u]',
+ '[list]$1[/list]',
+ '[*]$1',
+ '$3',
+ '[img]http://$2[/img]' . "\n",
+ ':$3',
+ '\[quote\]$1\[/quote\]',
+ '\[code\]$1\[/code\]',
+ '',
+ '',
+ '',
+ '\[quote\]$1\[/quote\]',
+ '$1',
+ '\[code\]$1\[/code\]',
+ "\n",
+ '[b]$1[/b]',
+ '[i]$1[/i]',
+ '[email=$1]$3[/email]',
+ '[url]$1[/url]',
+ '[url=$1]$3[/url]'
+ );
+
+ $text = str_replace ("\n", ' ', $text);
+ $ntext = preg_replace ($htmltags, $bbtags, $text);
+ $ntext = preg_replace ($htmltags, $bbtags, $ntext);
+
+ // for too large text and cannot handle by str_replace
+ if (!$ntext) {
+ $ntext = str_replace(array('<br>', '<br />'), "\n", $text);
+ $ntext = str_replace(array('<strong>', '</strong>'), array('[b]', '[/b]'), $ntext);
+ $ntext = str_replace(array('<em>', '</em>'), array('[i]', '[/i]'), $ntext);
+ }
+
+ $ntext = strip_tags($ntext);
+
+ $ntext = trim(html_entity_decode($ntext,ENT_QUOTES,'UTF-8'));
+ return $ntext;
+}
+
+
diff --git a/util/wp/post_to_red/readme.txt b/util/wp/post_to_red/readme.txt
new file mode 100644
index 000000000..e27c46236
--- /dev/null
+++ b/util/wp/post_to_red/readme.txt
@@ -0,0 +1,39 @@
+=== CrossPost to redmatrix ===
+Contributors: duthied, macgirvin
+Donate link: TBD
+Tags: redmatrix, crosspost
+Requires at least: 3.2
+Tested up to: 3.2
+Stable tag: 1.2
+
+CrossPost to Red Matrix for WordPress
+
+== Description ==
+This plugin allows you to cross post to your Red Matrix account.
+
+**Note, this plugin converts the html from wordpress into bbcode.
+The bbcode conversion doesn't handle height and width of an image, so be warned that if you post a very large
+image that is resized via height and with attributes, those attributes won't be honored in the resulatant post.
+
+== Changelog ==
+= 1.2 =
+* ensured no function name collision
+
+= 1.1 =
+* Added feedback to settings form post.
+
+= 1.0 =
+* Initial release.
+
+== Installation ==
+
+1. Install the plugin from your Wordpress admin panel.
+
+OR
+
+1. Upload the plugin folder to the `/wp-content/plugins/` directory.
+2. Activate the plugin through the 'Plugins' menu in WordPress.
+3. On the settings page enter your account name and password and the nickname of the channel to post to - then click the submit button
+4. To cross-post ensure the check box in the 'Cross Post To redmatrix' is checked before publishing.
+
+== Frequently Asked Questions ==
diff --git a/vendor/autoload.php b/vendor/autoload.php
new file mode 100644
index 000000000..5944e90ba
--- /dev/null
+++ b/vendor/autoload.php
@@ -0,0 +1,7 @@
+<?php
+
+// autoload.php @generated by Composer
+
+require_once __DIR__ . '/composer' . '/autoload_real.php';
+
+return ComposerAutoloaderInit4d84580b3010f36341ea4e8d04bc8eab::getLoader();
diff --git a/vendor/bin/sabredav b/vendor/bin/sabredav
new file mode 120000
index 000000000..3b5e4511d
--- /dev/null
+++ b/vendor/bin/sabredav
@@ -0,0 +1 @@
+../sabre/dav/bin/sabredav \ No newline at end of file
diff --git a/vendor/bin/vobjectvalidate.php b/vendor/bin/vobjectvalidate.php
new file mode 120000
index 000000000..4121667bf
--- /dev/null
+++ b/vendor/bin/vobjectvalidate.php
@@ -0,0 +1 @@
+../sabre/vobject/bin/vobjectvalidate.php \ No newline at end of file
diff --git a/vendor/composer/ClassLoader.php b/vendor/composer/ClassLoader.php
new file mode 100644
index 000000000..1db8d9a0b
--- /dev/null
+++ b/vendor/composer/ClassLoader.php
@@ -0,0 +1,246 @@
+<?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 class loader
+ *
+ * See https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md
+ *
+ * $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>
+ */
+class ClassLoader
+{
+ private $prefixes = array();
+ private $fallbackDirs = array();
+ private $useIncludePath = false;
+ private $classMap = array();
+
+ public function getPrefixes()
+ {
+ return call_user_func_array('array_merge', $this->prefixes);
+ }
+
+ public function getFallbackDirs()
+ {
+ return $this->fallbackDirs;
+ }
+
+ 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 classes, merging with any others previously set.
+ *
+ * @param string $prefix The classes prefix
+ * @param array|string $paths The location(s) of the classes
+ * @param bool $prepend Prepend the location(s)
+ */
+ public function add($prefix, $paths, $prepend = false)
+ {
+ if (!$prefix) {
+ if ($prepend) {
+ $this->fallbackDirs = array_merge(
+ (array) $paths,
+ $this->fallbackDirs
+ );
+ } else {
+ $this->fallbackDirs = array_merge(
+ $this->fallbackDirs,
+ (array) $paths
+ );
+ }
+
+ return;
+ }
+
+ $first = $prefix[0];
+ if (!isset($this->prefixes[$first][$prefix])) {
+ $this->prefixes[$first][$prefix] = (array) $paths;
+
+ return;
+ }
+ if ($prepend) {
+ $this->prefixes[$first][$prefix] = array_merge(
+ (array) $paths,
+ $this->prefixes[$first][$prefix]
+ );
+ } else {
+ $this->prefixes[$first][$prefix] = array_merge(
+ $this->prefixes[$first][$prefix],
+ (array) $paths
+ );
+ }
+ }
+
+ /**
+ * Registers a set of classes, replacing any others previously set.
+ *
+ * @param string $prefix The classes prefix
+ * @param array|string $paths The location(s) of the classes
+ */
+ public function set($prefix, $paths)
+ {
+ if (!$prefix) {
+ $this->fallbackDirs = (array) $paths;
+
+ return;
+ }
+ $this->prefixes[substr($prefix, 0, 1)][$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;
+ }
+
+ /**
+ * 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)) {
+ include $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)
+ {
+ // work around for PHP 5.3.0 - 5.3.2 https://bugs.php.net/50731
+ if ('\\' == $class[0]) {
+ $class = substr($class, 1);
+ }
+
+ if (isset($this->classMap[$class])) {
+ return $this->classMap[$class];
+ }
+
+ if (false !== $pos = strrpos($class, '\\')) {
+ // namespaced class name
+ $classPath = strtr(substr($class, 0, $pos), '\\', DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR;
+ $className = substr($class, $pos + 1);
+ } else {
+ // PEAR-like class name
+ $classPath = null;
+ $className = $class;
+ }
+
+ $classPath .= strtr($className, '_', DIRECTORY_SEPARATOR) . '.php';
+
+ $first = $class[0];
+ if (isset($this->prefixes[$first])) {
+ foreach ($this->prefixes[$first] as $prefix => $dirs) {
+ if (0 === strpos($class, $prefix)) {
+ foreach ($dirs as $dir) {
+ if (file_exists($dir . DIRECTORY_SEPARATOR . $classPath)) {
+ return $dir . DIRECTORY_SEPARATOR . $classPath;
+ }
+ }
+ }
+ }
+ }
+
+ foreach ($this->fallbackDirs as $dir) {
+ if (file_exists($dir . DIRECTORY_SEPARATOR . $classPath)) {
+ return $dir . DIRECTORY_SEPARATOR . $classPath;
+ }
+ }
+
+ if ($this->useIncludePath && $file = stream_resolve_include_path($classPath)) {
+ return $file;
+ }
+
+ return $this->classMap[$class] = false;
+ }
+}
diff --git a/vendor/composer/autoload_classmap.php b/vendor/composer/autoload_classmap.php
new file mode 100644
index 000000000..7a91153b0
--- /dev/null
+++ b/vendor/composer/autoload_classmap.php
@@ -0,0 +1,9 @@
+<?php
+
+// autoload_classmap.php @generated by Composer
+
+$vendorDir = dirname(dirname(__FILE__));
+$baseDir = dirname($vendorDir);
+
+return array(
+);
diff --git a/vendor/composer/autoload_namespaces.php b/vendor/composer/autoload_namespaces.php
new file mode 100644
index 000000000..e64e0a875
--- /dev/null
+++ b/vendor/composer/autoload_namespaces.php
@@ -0,0 +1,15 @@
+<?php
+
+// autoload_namespaces.php @generated by Composer
+
+$vendorDir = dirname(dirname(__FILE__));
+$baseDir = dirname($vendorDir);
+
+return array(
+ 'Sabre\\VObject' => array($vendorDir . '/sabre/vobject/lib'),
+ 'Sabre\\HTTP' => array($vendorDir . '/sabre/dav/lib'),
+ 'Sabre\\DAVACL' => array($vendorDir . '/sabre/dav/lib'),
+ 'Sabre\\DAV' => array($vendorDir . '/sabre/dav/lib'),
+ 'Sabre\\CardDAV' => array($vendorDir . '/sabre/dav/lib'),
+ 'Sabre\\CalDAV' => array($vendorDir . '/sabre/dav/lib'),
+);
diff --git a/vendor/composer/autoload_real.php b/vendor/composer/autoload_real.php
new file mode 100644
index 000000000..9faa11fc8
--- /dev/null
+++ b/vendor/composer/autoload_real.php
@@ -0,0 +1,43 @@
+<?php
+
+// autoload_real.php @generated by Composer
+
+class ComposerAutoloaderInit4d84580b3010f36341ea4e8d04bc8eab
+{
+ 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('ComposerAutoloaderInit4d84580b3010f36341ea4e8d04bc8eab', 'loadClassLoader'), true, true);
+ self::$loader = $loader = new \Composer\Autoload\ClassLoader();
+ spl_autoload_unregister(array('ComposerAutoloaderInit4d84580b3010f36341ea4e8d04bc8eab', 'loadClassLoader'));
+
+ $vendorDir = dirname(__DIR__);
+ $baseDir = dirname($vendorDir);
+
+ $map = require __DIR__ . '/autoload_namespaces.php';
+ foreach ($map as $namespace => $path) {
+ $loader->set($namespace, $path);
+ }
+
+ $classMap = require __DIR__ . '/autoload_classmap.php';
+ if ($classMap) {
+ $loader->addClassMap($classMap);
+ }
+
+ $loader->register(true);
+
+ return $loader;
+ }
+}
diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json
new file mode 100644
index 000000000..81bd0fd3a
--- /dev/null
+++ b/vendor/composer/installed.json
@@ -0,0 +1,130 @@
+[
+ {
+ "name": "sabre/vobject",
+ "version": "2.1.3",
+ "version_normalized": "2.1.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/fruux/sabre-vobject.git",
+ "reference": "e46d6855cfef23318e7c422cd08d36e344624675"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/fruux/sabre-vobject/zipball/e46d6855cfef23318e7c422cd08d36e344624675",
+ "reference": "e46d6855cfef23318e7c422cd08d36e344624675",
+ "shasum": ""
+ },
+ "require": {
+ "ext-mbstring": "*",
+ "php": ">=5.3.1"
+ },
+ "time": "2013-10-02 15:57:01",
+ "bin": [
+ "bin/vobjectvalidate.php"
+ ],
+ "type": "library",
+ "installation-source": "dist",
+ "autoload": {
+ "psr-0": {
+ "Sabre\\VObject": "lib/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Evert Pot",
+ "email": "evert@rooftopsolutions.nl",
+ "homepage": "http://evertpot.com/",
+ "role": "Developer"
+ }
+ ],
+ "description": "The VObject library for PHP allows you to easily parse and manipulate iCalendar and vCard objects",
+ "homepage": "https://github.com/fruux/sabre-vobject",
+ "keywords": [
+ "VObject",
+ "iCalendar",
+ "vCard"
+ ]
+ },
+ {
+ "name": "sabre/dav",
+ "version": "1.8.7",
+ "version_normalized": "1.8.7.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/fruux/sabre-dav.git",
+ "reference": "41c750da3c60a427cdd847df090ef0fc7e8f1076"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/fruux/sabre-dav/zipball/41c750da3c60a427cdd847df090ef0fc7e8f1076",
+ "reference": "41c750da3c60a427cdd847df090ef0fc7e8f1076",
+ "shasum": ""
+ },
+ "require": {
+ "ext-ctype": "*",
+ "ext-date": "*",
+ "ext-dom": "*",
+ "ext-iconv": "*",
+ "ext-libxml": "*",
+ "ext-mbstring": "*",
+ "ext-pcre": "*",
+ "ext-simplexml": "*",
+ "ext-spl": "*",
+ "php": ">=5.3.1",
+ "sabre/vobject": "~2.1.0"
+ },
+ "provide": {
+ "evert/sabredav": "1.7.*"
+ },
+ "require-dev": {
+ "evert/phpdoc-md": "~0.0.7",
+ "phing/phing": "2.4.14",
+ "phpunit/phpunit": "3.7.*"
+ },
+ "suggest": {
+ "ext-apc": "*",
+ "ext-curl": "*",
+ "ext-pdo": "*"
+ },
+ "time": "2013-10-02 18:38:26",
+ "bin": [
+ "bin/sabredav"
+ ],
+ "type": "library",
+ "installation-source": "dist",
+ "autoload": {
+ "psr-0": {
+ "Sabre\\DAV": "lib/",
+ "Sabre\\HTTP": "lib/",
+ "Sabre\\DAVACL": "lib/",
+ "Sabre\\CalDAV": "lib/",
+ "Sabre\\CardDAV": "lib/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Evert Pot",
+ "email": "evert@rooftopsolutions.nl",
+ "homepage": "http://evertpot.com/",
+ "role": "Developer"
+ }
+ ],
+ "description": "WebDAV Framework for PHP",
+ "homepage": "http://code.google.com/p/sabredav/",
+ "keywords": [
+ "CalDAV",
+ "CardDAV",
+ "WebDAV",
+ "framework",
+ "iCalendar"
+ ]
+ }
+]
diff --git a/vendor/sabre/dav/.gitignore b/vendor/sabre/dav/.gitignore
new file mode 100644
index 000000000..9a17f7748
--- /dev/null
+++ b/vendor/sabre/dav/.gitignore
@@ -0,0 +1,22 @@
+docs/api
+docs/wikidocs
+build.properties
+build
+public
+data
+fileserver.php
+fileserver2.php
+calendarserver.php
+groupwareserver.php
+package.xml
+tmpdata
+tests/temp
+tests/.sabredav
+*.swp
+composer.lock
+vendor
+bin/phing
+bin/phpunit
+bin/vobjectvalidate.php
+bin/phpdocmd
+bin/phpunit
diff --git a/vendor/sabre/dav/.travis.yml b/vendor/sabre/dav/.travis.yml
new file mode 100644
index 000000000..37c99f841
--- /dev/null
+++ b/vendor/sabre/dav/.travis.yml
@@ -0,0 +1,20 @@
+language: php
+php:
+ - 5.3.3
+ - 5.3
+ - 5.4
+ - 5.5
+
+services:
+ - mysql
+
+before_script:
+ - mysql -e 'create database sabredav'
+ - composer install --prefer-source
+# - echo "zend.enable_gc=0" >> `php --ini | grep "Loaded Configuration" | sed -e "s|.*:\s*||"`
+
+script:
+ - phpunit --configuration tests/phpunit.xml
+ - cp tests/composer.vobject3.json composer.json
+ - composer update --no-dev
+ - phpunit --configuration tests/phpunit.xml
diff --git a/vendor/sabre/dav/ChangeLog b/vendor/sabre/dav/ChangeLog
new file mode 100644
index 000000000..145cf1fcb
--- /dev/null
+++ b/vendor/sabre/dav/ChangeLog
@@ -0,0 +1,1122 @@
+1.8.7-stable (2013-10-02)
+ * The zip release ships with sabre/vobject 2.1.3.
+ * Includes changes from version 1.7.9.
+
+1.8.6-stable (2013-06-18)
+ * The zip release ships with sabre/vobject 2.1.0.
+ * Includes changes from version 1.7.8.
+
+1.8.5-stable (2013-04-11)
+ * The zip release ships with sabre/vobject 2.0.7.
+ * Includes changes from version 1.7.7.
+
+1.8.4-stable (2013-04-08)
+ * The zip release ships with sabre/vobject 2.0.7.
+ * Includes changes from version 1.7.6.
+
+1.8.3-stable (2013-03-01)
+ * The zip release ships with sabre/vobject 2.0.6.
+ * Includes changes from version 1.7.5.
+ * Fixed: organizer email-address for shared calendars is now prefixed with
+ mailto:, as it should.
+
+1.8.2-stable (2013-01-19)
+ * The zip release ships with sabre/vobject 2.0.5.
+ * Includes changes from version 1.7.4.
+
+1.8.1-stable (2012-12-01)
+ * The zip release ships with sabre/vobject 2.0.5.
+ * Includes changes from version 1.7.3.
+ * Fixed: Typo in 1.7 migration script caused it to fail.
+
+1.8.0-stable (2012-11-08)
+ * The zip release ships with sabre/vobject 2.0.5.
+ * BC Break: Moved the entire codebase to PHP namespaces.
+ * BC Break: Every backend package (CalDAV, CardDAV, Auth, Locks,
+ Principals) now has consistent naming conventions. There's a
+ BackendInterface, and an AbstractBackend class.
+ * BC Break: Changed a bunch of constructor signatures in the CalDAV
+ package, to reduce dependencies on the ACL package.
+ * BC Break: Sabre_CalDAV_ISharedCalendar now also has a getShares method,
+ so sharees can figure out who is also on a shared calendar.
+
+ * Added: Sabre_DAVACL_IPrincipalCollection interface, to advertise support
+ for principal-property-search on any node.
+ * Added: Simple console script to fire up a fileserver in the current
+ directory using PHP 5.4's built-in webserver.
+ * Added: Sharee's can now also read out the list of invites for a shared
+ calendar.
+ * Added: The Proxy principal classes now both implement an interface, for
+ greater flexiblity.
+
+1.7.9-stable (2013-10-02)
+ * The zip release ships with sabre/vobject 2.1.3.
+ * Fixed: Issue #365. Incorrect output when principal urls have spaces in
+ them.
+ * Added: Issue #367: Automatically adding a UID to vcards that don't have
+ them.
+
+1.7.8-stable (2013-06-17)
+ * The zip release ships with sabre/vobject 2.1.0.
+ * Changed: Sabre\DAV\Client::verifyPeer is now a protected property
+ (instead of private).
+ * Fixed: Text was incorrectly escaped in the Href and HrefList properties,
+ disallowing urls with ampersands (&) in them.
+ * Added: deserializer for Sabre\DAVACL\Property\CurrentUserPrivilegeSet.
+ * Fixed: Issue 335: Client only deserializes properties with status 200.
+ * Fixed: Issue 341: Escaping xml in 423 Locked error responses.
+ * Added: Issue 339: beforeGetPropertiesForPath event.
+
+1.7.7-stable (2013-04-11)
+ * The zip release ships with sabre/vobject 2.0.7.
+ * Fixed: Assets in the browser plugins were not being served on windows
+ machines.
+
+1.7.6-stable (2013-04-08)
+ * The zip release ships with sabre/vobject 2.0.7.
+ * Fixed: vcardurl in database schema can now hold 255 characters instead
+ of 80 (which is often way to small).
+ * Fixed: The browser plugin potentially allowed people to open any
+ arbitrary file on windows servers (CVE-2013-1939).
+
+1.7.5-stable (2013-03-01)
+ * The zip release ships with sabre/vobject 2.0.6.
+ * Change: No longer advertising support for 4.0 vcards. iOS and OS X
+ address book don't handle this well, and just advertising 3.0 support
+ seems like the most logical course of action.
+ * Added: ->setVerifyPeers to Sabre_DAV_Client (greatly resisting against
+ it, don't use this..).
+
+1.7.4-stable (2013-01-19)
+ * The zip release ships with sabre/vobject 2.0.5.
+ * Changed: To be compatibile with MS Office 2011 for Mac, a workaround was
+ removed that was added to support old versions of Windows XP (pre-SP3).
+ Indeed! We needed a crazy workaround to work with one MS product in the
+ past, and we can't keep that workaround to be compatible with another MS
+ product.
+ * Fixed: expand-properties REPORT had incorrect values for the href
+ element.
+ * Fixed: Range requests now work for non-seekable streams. (Thanks Alfred
+ Klomp).
+ * Fixed: Changed serialization of {DAV:}getlastmodified and
+ {DAV:}supportedlock to improve compatiblity with MS Office 2011 for Mac.
+ * Changed: reverted the automatic translation of 'DAV:' xml namespaces to
+ 'urn:DAV' when parsing files. Issues were reported with libxml 2.6.32,
+ on a relatively recent debian release, so we'll wait till 2015 to take
+ this one out again.
+ * Added: Sabre_DAV_Exception_ServiceUnavailable, for emitting 503's.
+
+1.7.3-stable (2012-12-01)
+ * The zip release ships with sabre/vobject 2.0.5.
+ * Fixed: Removing double slashes from getPropertiesForPath.
+ * Change: Marked a few more properties in the CardDAV as protected,
+ instead of private.
+ * Fixed: SharingPlugin now plays nicer with other plugins with similar
+ functionality.
+ * Fixed: Issue 174. Sending back HTTP/1.0 for requests with this version.
+
+1.7.2-stable (2012-11-08)
+ * The zip release ships with sabre/vobject 2.0.5.
+ * Added: ACL plugin advertises support for 'calendarserver-principal-
+ property-search'.
+ * Fixed: [#153] Allowing for relative http principals in iMip requests.
+ * Added: Support for cs:first-name and cs:last-name properties in sharing
+ invites.
+ * Fixed: Made a bunch of properties protected, where they were private
+ before.
+ * Added: Some non-standard properties for sharing to improve
+ compatibility.
+ * Fixed: some bugfixes in postgres sql script.
+ * Fixed: When requesting some properties using PROPFIND, they could show
+ up as both '200 Ok' and '403 Forbidden'.
+ * Fixed: calendar-proxy principals were not checked for deeper principal
+ membership than 1 level.
+ * Fixed: setGroupMemberSet argument now correctly receives relative
+ principal urls, instead of the absolute ones.
+ * Fixed: Server class will filter out any bonus properties if any extra
+ were returned. This means the implementor of the IProperty class can be
+ a bit lazier when implementing.
+
+Note: bug numbers after this line refer to Google Code tickets. We're using
+github now.
+
+1.7.1-stable (2012-10-07)
+ * Fixed: include path problem in the migration script.
+
+1.7.0-stable (2012-10-06)
+ * BC Break: The calendarobjects database table has a bunch of new
+ fields, and a migration script is required to ensure everything will
+ keep working. Read the wiki for more details.
+ * BC Break: The ICalendar interface now has a new method: calendarQuery.
+ * BC Break: In this version a number of classes have been deleted, that
+ have been previously deprecated. Namely:
+ - Sabre_DAV_Directory (now: Sabre_DAV_Collection)
+ - Sabre_DAV_SimpleDirectory (now: Sabre_DAV_SimpleCollection)
+ * BC Break: Sabre_CalDAV_Schedule_IMip::sendMessage now has an extra
+ argument. If you extended this class, you should fix this method. It's
+ only used for informational purposes.
+ * BC Break: The DAV: namespace is no longer converted to urn:DAV. This was
+ a workaround for a bug in older PHP versions (pre-5.3).
+ * Removed: Sabre.includes.php was deprecated, and is now removed.
+ * Removed: Sabre_CalDAV_Server was deprecated, and is now removed. Please
+ use Sabre_DAV_Server and check the examples in the examples/ directory.
+ * Changed: The Sabre_VObject library now spawned into it's own project!
+ The VObject library is still included in the SabreDAV zip package.
+ * Added: Experimental interfaces to allow implementation of caldav-sharing.
+ Note that no implementation is provided yet, just the api hooks.
+ * Added: Free-busy reporting compliant with the caldav-scheduling
+ standard. This allows iCal and other clients to fetch other users'
+ free-busy data.
+ * Added: Experimental NotificationSupport interface to add
+ caldav notifications.
+ * Added: VCF Export plugin. If enabled, it can generate an export of an
+ entire addressbook.
+ * Added: Support for PATCH using a SabreDAV format, to live-patch files.
+ * Added: Support for Prefer: return-minimal and Brief: t headers for
+ PROPFIND and PROPPATCH requests.
+ * Changed: Responsibility for dealing with the calendar-query is now
+ moved from the CalDAV plugin to the CalDAV backends. This allows for
+ heavy optimizations.
+ * Changed: The CalDAV PDO backend is now a lot faster for common
+ calendar queries.
+ * Changed: We are now using the composer autoloader.
+ * Changed: The CalDAV backend now all implement an interface.
+ * Changed: Instead of Sabre_DAV_Property, Sabre_DAV_PropertyInterface is
+ now the basis of every property class.
+ * Update: Caching results for principal lookups. This should cut down
+ queries and performance for a number of heavy requests.
+ * Update: ObjectTree caches lookups much more aggresively, which will help
+ especially speeding up a bunch of REPORT queries.
+ * Added: Support for the schedule-calendar-transp property.
+ * Fixed: Marking both the text/calendar and text/x-vcard as UTF-8
+ encoded.
+ * Fixed: Workaround for the SOGO connector, as it doesn't understand
+ 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
+ PATCH method to update parts of a file.
+ * Added: Tons of timezone name mappings for Microsoft Exchange.
+ * Added: Support for an 'exception' event in the server class.
+ * Fixed: Uploaded VCards without a UID are now rejected. (thanks Dominik!)
+ * Fixed: Rejecting calendar objects if they are not in the
+ supported-calendar-component list. (thanks Armin!)
+ * Fixed: Issue 219: serialize() now reorders correctly.
+ * Fixed: Sabre_DAV_XMLUtil no longer returns empty $dom->childNodes
+ if there is whitespace in $dom.
+ * Fixed: Returning 409 Conflict instead of 500 when an attempt is made to
+ create a file as a child of something that's not a collection.
+ * Fixed: Issue 237: xml-encoding values in SabreDAV error responses.
+ * Fixed: Returning 403, instead of 501 when an unknown REPORT is
+ requested.
+ * Fixed: Postfixing slash on {DAV:}owner properties.
+ * Fixed: Several embarrassing spelling mistakes in docblocks.
+
+1.6.10-stable (2013-06-17)
+ * Fixed: Text was incorrectly escaped in the Href and HrefList properties,
+ disallowing urls with ampersands (&) in them.
+ * Fixed: Issue 341: Escaping xml in 423 Locked error responses.
+
+1.6.9-stable (2013-04-11)
+ * Fixed: Assets in the browser plugins were not being served on windows
+ machines.
+
+1.6.8-stable (2013-04-08)
+ * Fixed: vcardurl in database schema can now hold 255 characters instead
+ of 80 (which is often way to small).
+ * Fixed: The browser plugin potentially allowed people to open any
+ arbitrary file on windows servers. (CVE-2013-1939).
+
+1.6.7-stable (2013-03-01)
+ * Change: No longer advertising support for 4.0 vcards. iOS and OS X
+ address book don't handle this well, and just advertising 3.0 support
+ seems like the most logical course of action.
+ * Added: ->setVerifyPeers to Sabre_DAV_Client (greatly resisting against
+ it, don't use this..).
+
+1.6.6-stable (2013-01-19)
+ * Fixed: Backported a fix for broken XML serialization in error responses.
+ (Thanks @DeepDiver1975!)
+
+1.6.5-stable (2012-10-04)
+ * Fixed: Workaround for line-ending bug OS X 10.8 addressbook has.
+ * Added: Ability to allow users to set SSL certificates for the Client
+ class. (Thanks schiesbn!).
+ * Fixed: Directory indexes with lots of nodes should be a lot faster.
+ * Fixed: Issue 235: E_NOTICE thrown when doing a propfind request with
+ Sabre_DAV_Client, and no valid properties are returned.
+ * Fixed: Issue with filtering on alarms in tasks.
+
+1.6.4-stable (2012-08-02)
+ * Fixed: Issue 220: Calendar-query filters may fail when filtering on
+ alarms, if an overridden event has it's alarm removed.
+ * Fixed: Compatibility for OS/X 10.8 iCal in the IMipHandler.
+ * Fixed: Issue 222: beforeWriteContent shouldn't be called for lock
+ requests.
+ * Fixed: Problem with POST requests to the outbox if mailto: was not lower
+ cased.
+ * Fixed: Yearly recurrence rule expansion on leap-days no behaves
+ correctly.
+ * Fixed: Correctly checking if recurring, all-day events with no dtstart
+ fall in a timerange if the start of the time-range exceeds the start of
+ the instance of an event, but not the end.
+ * Fixed: All-day recurring events wouldn't match if an occurence ended
+ exactly on the start of a time-range.
+ * Fixed: HTTP basic auth did not correctly deal with passwords containing
+ colons on some servers.
+ * Fixed: Issue 228: DTEND is now non-inclusive for all-day events in the
+ calendar-query REPORT and free-busy calculations.
+
+1.6.3-stable (2012-06-12)
+ * Added: It's now possible to specify in Sabre_DAV_Client which type of
+ authentication is to be used.
+ * Fixed: Issue 206: Sabre_DAV_Client PUT requests are fixed.
+ * Fixed: Issue 205: Parsing an iCalendar 0-second date interval.
+ * 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: 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
+ 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
+ * Fixed: Issue 217: Sabre_DAV_Tree_FileSystem was pretty broken.
+
+1.6.2-stable (2012-04-16)
+ * Fixed: Sabre_VObject_Node::$parent should have been public.
+ * Fixed: Recurrence rules of events are now taken into consideration when
+ doing time-range queries on alarms.
+ * Fixed: Added a workaround for the fact that php's DateInterval cannot
+ parse weeks and days at the same time.
+ * Added: Sabre_DAV_Server::$exposeVersion, allowing you to hide SabreDAV's
+ version number from various outputs.
+ * Fixed: DTSTART values would be incorrect when expanding events.
+ * Fixed: DTSTART and DTEND would be incorrect for expansion of WEEKLY
+ BYDAY recurrences.
+ * Fixed: Issue 203: A problem with overridden events hitting the exact
+ date and time of a subsequent event in the recurrence set.
+ * Fixed: There was a problem with recurrence rules, for example the 5th
+ tuesday of the month, if this day did not exist.
+ * Added: New HTTP status codes from draft-nottingham-http-new-status-04.
+
+1.6.1-stable (2012-03-05)
+ * Added: createFile and put() can now return an ETag.
+ * Added: Sending back an ETag on for operations on CardDAV backends. This
+ should help with OS X 10.6 Addressbook compatibility.
+ * Fixed: Fixed a bug where an infinite loop could occur in the recurrence
+ iterator if the recurrence was YEARLY, with a BYMONTH rule, and either
+ BYDAY or BYMONTHDAY match the first day of the month.
+ * Fixed: Events that are excluded using EXDATE are still counted in the
+ 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
+ Jürgen).
+ * Fixed: Issue 195: Sabre_CardDAV pear package had an incorrect dependency.
+ * Fixed: Calendardata would be destroyed when performing a MOVE request.
+
+1.6.0-stable (2012-02-22)
+ * BC Break: Now requires PHP 5.3
+ * BC Break: Any node that implemented Sabre_DAVACL_IACL must now also
+ implement the getSupportedPrivilegeSet method. See website for details.
+ * BC Break: Moved functions from Sabre_CalDAV_XMLUtil to
+ Sabre_VObject_DateTimeParser.
+ * BC Break: The Sabre_DAVACL_IPrincipalCollection now has two new methods:
+ 'searchPrincipals' and 'updatePrincipal'.
+ * BC Break: Sabre_DAV_ILockable is removed and all related per-node
+ locking functionality.
+ * BC Break: Sabre_DAV_Exception_FileNotFound is now deprecated in favor of
+ Sabre_DAV_Exception_NotFound. The former will be removed in a later
+ version.
+ * BC Break: Removed Sabre_CalDAV_ICalendarUtil, use Sabre_VObject instead.
+ * BC Break: Sabre_CalDAV_Server is now deprecated, check out the
+ documentation on how to setup a caldav server with just
+ Sabre_DAV_Server.
+ * 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.
+ * 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
+ CalDAV client, using Sabre_CalDAV_Schedule_IMip.
+ * 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: [DAVACL] Per-node overriding of supported privileges. This allows
+ for custom privileges where needed.
+ * Added: [DAVACL] Public 'principalSearch' method on the DAVACL plugin,
+ which allows for easy searching for principals, based on their
+ properties.
+ * Added: Sabre_VObject_Component::getComponents() to return a list of only
+ components and not properties.
+ * Added: An includes.php file in every sub-package (CalDAV, CardDAV, DAV,
+ DAVACL, HTTP, VObject) as an alternative to the autoloader. This often
+ works much faster.
+ * Added: Support for the 'Me card', which allows Addressbook.app users
+ specify which vcard is their own.
+ * Added: Support for updating principal properties in the DAVACL principal
+ backends.
+ * Changed: Major refactoring in the calendar-query REPORT code. Should
+ make things more flexible and correct.
+ * Changed: The calendar-proxy-[read|write] principals will now only appear
+ in the tree, if they actually exist in the Principal backend. This should
+ reduce some problems people have been having with this.
+ * Changed: Sabre_VObject_Element_* classes are now renamed to
+ Sabre_VObject_Property. Old classes are retained for backwards
+ compatibility, but this will be removed in the future.
+ * Added: Sabre_VObject_FreeBusyGenerator to generate free-busy reports
+ based on lists of events.
+ * Added: Sabre_VObject_RecurrenceIterator to find all the dates and times
+ for recurring events.
+ * Fixed: Issue 97: Correctly handling RRULE for the calendar-query REPORT.
+ * Fixed: Issue 154: Encoding of VObject parameters with no value was
+ incorrect.
+ * Added: Support for {DAV:}acl-restrictions property from RFC3744.
+ * Added: The contentlength for calendar objects can now be supplied by a
+ CalDAV backend, allowing for more optimizations.
+ * Fixed: Much faster implementation of Sabre_DAV_URLUtil::encodePath.
+ * Fixed: {DAV:}getcontentlength may now be not specified.
+ * Fixed: Issue 66: Using rawurldecode instead of urldecode to decode paths
+ from clients. This means that + will now be treated as a literal rather
+ than a space, and this should improve compatibility with the Windows
+ built-in client.
+ * Added: Sabre_DAV_Exception_PaymentRequired exception, to emit HTTP 402
+ status codes.
+ * Added: Some mysql unique constraints to example files.
+ * Fixed: Correctly formatting HTTP dates.
+ * Fixed: Issue 94: Sending back Last-Modified header for 304 responses.
+ * Added: Sabre_VObject_Component_VEvent, Sabre_VObject_Component_VJournal,
+ Sabre_VObject_Component_VTodo and Sabre_VObject_Component_VCalendar.
+ * Changed: Properties are now also automatically mapped to their
+ appropriate classes, if they are created using the add() or __set()
+ methods.
+ * Changed: Cloning VObject objects now clones the entire tree, rather than
+ just the default shallow copy.
+ * Added: Support for recurrence expansion in the CALDAV:calendar-multiget
+ and CALDAV:calendar-query REPORTS.
+ * Changed: CalDAV PDO backend now sorts calendars based on the internal
+ 'calendarorder' field.
+ * Added: Issue 181: Carddav backends may no optionally not supply the carddata in
+ getCards, if etag and size are specified. This may speed up certain
+ requests.
+ * Added: More arguments to beforeWriteContent and beforeCreateFile (see
+ WritingPlugins wiki document).
+ * Added: Hook for iCalendar validation. This allows us to validate
+ iCalendar objects when they're uploaded. At the moment we're just
+ validating syntax.
+ * Added: VObject now support Windows Timezone names correctly (thanks
+ mrpace2).
+ * Added: If a timezonename could not be detected, we fall back on the
+ default PHP timezone.
+ * Added: Now a Composer package (thanks willdurand).
+ * Fixed: Support for \N as a newline character in the VObject reader.
+ * Added: afterWriteContent, afterCreateFile and afterUnbind events.
+ * Added: Postgresql example files. Not part of the unittests though, so
+ use at your own risk.
+ * Fixed: Issue 182: Removed backticks from sql queries, so it will work
+ with Postgres.
+
+1.5.9-stable (2012-04-16)
+ * Fixed: Issue with parsing timezone identifiers that were surrounded by
+ quotes. (Fixes emClient compatibility).
+
+1.5.8-stable (2012-02-22)
+ * Fixed: Issue 95: Another timezone parsing issue, this time in
+ calendar-query.
+
+1.5.7-stable (2012-02-19)
+ * 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
+ creating files.
+ * Fixed: The ICSExportPlugin now considers ACL's.
+ * Added: Made it optional to supply carddata from an Addressbook backend
+ when requesting getCards. This can make some operations much faster, and
+ could result in much lower memory use.
+ * Fixed: Issue 187: Sabre_DAV_UUIDUtil was missing from includes file.
+ * Fixed: Issue 191: beforeUnlock was triggered twice.
+
+1.5.6-stable (2012-01-07)
+ * Fixed: Issue 174: VObject could break UTF-8 characters.
+ * Fixed: pear package installation issues.
+
+1.5.5-stable (2011-12-16)
+ * Fixed: CalDAV time-range filter workaround for recurring events.
+ * Fixed: Bug in Sabre_DAV_Locks_Backend_File that didn't allow multiple
+ 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: 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
+ compatibility.
+ * Fixed: Issue 95: Parsing X-LIC-LOCATION if it's available.
+ * Added: All VObject elements now have a reference to their parent node.
+
+1.5.3-stable (2011-09-28)
+ * Fixed: Sabre_DAV_Collection was missing from the includes file.
+ * Fixed: Issue 152. iOS 1.4.2 apparantly requires HTTP/1.1 200 OK to be in
+ uppercase.
+ * Fixed: Issue 153: Support for files with mixed newline styles in
+ Sabre_VObject.
+ * Fixed: Issue 159: Automatically converting any vcard and icalendardata
+ to UTF-8.
+ * Added: Sabre_DAV_SimpleFile class for easy static file creation.
+ * Added: Issue 158: Support for the CARDDAV:supported-address-data
+ property.
+
+1.5.2-stable (2011-09-21)
+ * Fixed: carddata and calendardata MySQL fields are now of type
+ 'mediumblob'. 'TEXT' was too small sometimes to hold all the data.
+ * Fixed: {DAV:}supported-report-set is now correctly reporting the reports
+ for IAddressBook.
+ * Added: Sabre_VObject_Property::add() to add duplicate parameters to
+ properties.
+ * Added: Issue 151: Sabre_CalDAV_ICalendar and Sabre_CalDAV_ICalendarObject
+ interfaces.
+ * 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
+ TemporaryFileFilterPlugin if it was loaded first.
+ * Added: It's not possible to specify more 'alternate uris' in principal
+ backends.
+
+1.5.1-stable (2011-08-24)
+ * Fixed: Issue 137. Hiding action interface in HTML browser for
+ non-collections.
+ * Fixed: addressbook-query is now correctly returned from the
+ {DAV:}supported-report-set property.
+ * Fixed: Issue 142: Bugs in groupwareserver.php example.
+ * Fixed: Issue 139: Rejecting PUT requests with Content-Range.
+
+1.5.0-stable (2011-08-12)
+ * Added: CardDAV support.
+ * Added: An experimental WebDAV client.
+ * Added: MIME-Directory grouping support in the VObject library. This is
+ very useful for people attempting to parse vcards.
+ * BC Break: Adding parameters with the VObject libraries now overwrites
+ the previous parameter, rather than just add it. This makes more sense
+ for 99% of the cases.
+ * BC Break: lib/Sabre.autoload.php is now removed in favor of
+ lib/Sabre/autoload.php.
+ * Deprecated: Sabre_DAV_Directory is now deprecated and will be removed in
+ a future version. Use Sabre_DAV_Collection instead.
+ * Deprecated: Sabre_DAV_SimpleDirectory is now deprecated and will be
+ removed in a future version. Use Sabre_DAV_SimpleCollection instead.
+ * Fixed: Problem with overriding tablenames for the CalDAV backend.
+ * 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: i;unicode-casemap support
+ * Fixed: VObject bug: wouldn't parse parameters if they weren't specified
+ in uppercase.
+ * Fixed: VObject bug: Parameters now behave more like Properties.
+ * 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
+ 'action' to reduce the chance of collisions.
+
+1.4.4-stable (2011-07-07)
+ * Fixed: Issue 131: Custom CalDAV backends could break in certain cases.
+ * Added: The option to override the default tablename all PDO backends
+ use. (Issue 60).
+ * Fixed: Issue 124: 'File' authentication backend now takes realm into
+ consideration.
+ * Fixed: Sabre_DAV_Property_HrefList now properly deserializes. This
+ allows users to update the {DAV:}group-member-set property.
+ * Added: Helper functions for DateTime-values in Sabre_VObject package.
+ * Added: VObject library can now automatically map iCalendar properties to
+ custom classes.
+
+1.4.3-stable (2011-04-25)
+ * Fixed: Issue 123: Added workaround for Windows 7 UNLOCK bug.
+ * Fixed: datatype of lastmodified field in mysql.calendars.sql. Please
+ change the DATETIME field to an INT to ensure this field will work
+ correctly.
+ * Change: Sabre_DAV_Property_Principal is now renamed to
+ Sabre_DAVACL_Property_Principal.
+ * Added: API level support for ACL HTTP method.
+ * Fixed: Bug in serializing {DAV:}acl property.
+ * Added: deserializer for {DAV:}resourcetype property.
+ * Added: deserializer for {DAV:}acl property.
+ * Added: deserializer for {DAV:}principal property.
+
+1.4.2-beta (2011-04-01)
+ * Added: It's not possible to disable listing of nodes that are denied
+ read access by ACL.
+ * Fixed: Changed a few properties in CalDAV classes from private to
+ protected.
+ * Fixed: Issue 119: Terrible things could happen when relying on
+ guessBaseUri, the server was running on the root of the domain and a user
+ tried to access a file ending in .php. This is a slight BC break.
+ * Fixed: Issue 118: Lock tokens in If headers without a uri should be
+ treated as the request uri, not 'all relevant uri's.
+ * Fixed: Issue 120: PDO backend was incorrectly fetching too much locks in
+ cases where there were similar named locked files in a directory.
+
+1.4.1-beta (2011-02-26)
+ * Fixed: Sabre_DAV_Locks_Backend_PDO returned too many locks.
+ * Fixed: Sabre_HTTP_Request::getHeader didn't return Content-Type when
+ running on apache, so a few workarounds were added.
+ * Change: Slightly changed CalDAV Backend API's, to allow for heavy
+ optimizations. This is non-bc breaking.
+
+1.4.0-beta (2011-02-12)
+ * Added: Partly RFC3744 ACL support.
+ * Added: Calendar-delegation (caldav-proxy) support.
+ * BC break: In order to fix Issue 99, a new argument had to be added to
+ Sabre_DAV_Locks_Backend_*::getLocks classes. Consult the classes for
+ details.
+ * Deprecated: Sabre_DAV_Locks_Backend_FS is now deprecated and will be
+ removed in a later version. Use PDO or the new File class instead.
+ * Deprecated: The Sabre_CalDAV_ICalendarUtil class is now marked
+ deprecated, and will be removed in a future version. Please use
+ Sabre_VObject instead.
+ * Removed: All principal-related functionality has been removed from the
+ Sabre_DAV_Auth_Plugin, and moved to the Sabre_DAVACL_Plugin.
+ * Added: VObject library, for easy vcard/icalendar parsing using a natural
+ interface.
+ * 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
+ Sabre_DAV_Server::getPlugin().
+ * Added: beforeGetProperties event.
+ * Added: updateProperties event.
+ * Added: Principal listings and calendar-access can now be done privately,
+ disallowing users from accessing or modifying other users' data.
+ * Added: You can now pass arrays to the Sabre_DAV_Server constructor. If
+ it's an array with node-objects, a Root collection will automatically be
+ created, and the nodes are used as top-level children.
+ * Added: The principal base uri is now customizable. It used to be
+ hardcoded to 'principals/[user]'.
+ * Added: getSupportedReportSet method in ServerPlugin class. This allows
+ you to easily specify which reports you're implementing.
+ * Added: A '..' link to the HTML browser.
+ * Fixed: Issue 99: Locks on child elements were ignored when their parent
+ nodes were deleted.
+ * Fixed: Issue 90: lockdiscovery property and LOCK response now include a
+ {DAV}lockroot element.
+ * Fixed: Issue 96: support for 'default' collation in CalDAV text-match
+ filters.
+ * Fixed: Issue 102: Ensuring that copy and move with identical source and
+ destination uri's fails.
+ * Fixed: Issue 105: Supporting MKCALENDAR with no body.
+ * Fixed: Issue 109: Small fixes in Sabre_HTTP_Util.
+ * Fixed: Issue 111: Properly catching the ownername in a lock (if it's a
+ string)
+ * Fixed: Sabre_DAV_ObjectTree::nodeExist always returned false for the
+ root node.
+ * Added: Global way to easily supply new resourcetypes for certain node
+ classes.
+ * Fixed: Issue 59: Allowing the user to override the authentication realm
+ in Sabre_CalDAV_Server.
+ * Update: Issue 97: Looser time-range checking if there's a recurrence
+ rule in an event. This fixes 'missing recurring events'.
+
+1.3.0 (2010-10-14)
+ * Added: childExists method to Sabre_DAV_ICollection. This is an api
+ 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
+ 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
+ double-quotes. This was a mistake made in all previous SabreDAV
+ versions. If you don't do this, any If-Match, If-None-Match and If:
+ headers using Etags will work incorrectly. (Issue 85).
+ * Added: Sabre_DAV_Auth_Backend_AbstractBasic class, which can be used to
+ easily implement basic authentication.
+ * Removed: Sabre_DAV_PermissionDenied class. Use Sabre_DAV_Forbidden
+ instead.
+ * Removed: Sabre_DAV_IDirectory interface, use Sabre_DAV_ICollection
+ instead.
+ * Added: Browser plugin 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.
+ * Fixed: If-Modified-Since and If-Unmodified-Since would be incorrect if
+ the date is an exact match.
+ * Fixed: Support for multiple ETags in If-Match and If-None-Match headers.
+ * Fixed: Improved baseUrl handling.
+ * Fixed: Issue 67: Non-seekable stream support in ::put()/::get().
+ * Fixed: Issue 65: Invalid dates are now ignored.
+ * Updated: Refactoring in Sabre_CalDAV to make everything a bit more
+ ledgable.
+ * Fixed: Issue 88, Issue 89: Fixed compatibility for running SabreDAV on
+ Windows.
+ * Fixed: Issue 86: Fixed Content-Range top-boundary from 'file size' to
+ 'file size'-1.
+
+1.2.4 (2010-07-13)
+ * Fixed: Issue 62: Guessing baseUrl fails when url contains a
+ query-string.
+ * Added: Apache configuration sample for CGI/FastCGI setups.
+ * Fixed: Issue 64: Only returning calendar-data when it was actually
+ requested.
+
+1.2.3 (2010-06-26)
+ * Fixed: Issue 57: Supporting quotes around etags in If-Match and
+ If-None-Match
+
+1.2.2 (2010-06-21)
+ * Updated: SabreDAV now attempts to guess the BaseURI if it's not set.
+ * Updated: Better compatibility with BitKinex
+ * Fixed: Issue 56: Incorrect behaviour for If-None-Match headers and GET
+ requests.
+ * Fixed: Issue with certain encoded paths in Browser Plugin.
+
+1.2.1 (2010-06-07)
+ * Fixed: Issue 50, patch by Mattijs Hoitink.
+ * Fixed: Issue 51, Adding windows 7 lockfiles to TemporaryFileFilter.
+ * Fixed: Issue 38, Allowing custom filters to be added to
+ TemporaryFileFilter.
+ * Fixed: Issue 53, ETags in the If: header were always failing. This
+ behaviour is now corrected.
+ * Added: Apache Authentication backend, in case authentication through
+ .htaccess is desired.
+ * Updated: Small improvements to example files.
+
+1.2.0 (2010-05-24)
+ * Fixed: Browser plugin now displays international characters.
+ * Changed: More properties in CalDAV classes are now protected instead of
+ private.
+
+1.2.0beta3 (2010-05-14)
+ * Fixed: Custom properties were not properly sent back for allprops
+ requests.
+ * Fixed: Issue 49, incorrect parsing of PROPPATCH, affecting Office 2007.
+ * Changed: Removed CalDAV items from includes.php, and added a few missing
+ ones.
+
+1.2.0beta2 (2010-05-04)
+ * Fixed: Issue 46: Fatal error for some non-existent nodes.
+ * Updated: some example sql to include email address.
+ * Added: 208 and 508 statuscodes from RFC5842.
+ * Added: Apache2 configuration examples
+
+1.2.0beta1 (2010-04-28)
+ * Fixed: redundant namespace declaration in resourcetypes.
+ * Fixed: 2 locking bugs triggered by litmus when no Sabre_DAV_ILockable
+ interface is used.
+ * Changed: using http://sabredav.org/ns for all custom xml properties.
+ * Added: email address property to principals.
+ * Updated: CalendarObject validation.
+
+1.2.0alpha4 (2010-04-24)
+ * Added: Support for If-Range, If-Match, If-None-Match, If-Modified-Since,
+ If-Unmodified-Since.
+ * Changed: Brand new build system. Functionality is split up between
+ Sabre, Sabre_HTTP, Sabre_DAV and Sabre_CalDAV packages. In addition to
+ that a new non-pear package will be created with all this functionality
+ combined.
+ * Changed: Autoloader moved to Sabre/autoload.php.
+ * Changed: The Allow: header is now more accurate, with appropriate HTTP
+ methods per uri.
+ * Changed: Now throwing back Sabre_DAV_Exception_MethodNotAllowed on a few
+ places where Sabre_DAV_Exception_NotImplemented was used.
+
+1.2.0alpha3 (2010-04-20)
+ * 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: support for principal-property-search and
+ principal-search-property-set reports.
+ * Added: Issue 31: Hiding exception information by default. Can be turned
+ on with the Sabre_DAV_Server::$debugExceptions property.
+
+1.2.0alpha2 (2010-04-08)
+ * Added: Calendars are now private and can only be read by the owner.
+ * Fixed: double namespace declaration in multistatus responses.
+ * Added: MySQL database dumps. MySQL is now also supported next to SQLite.
+ * Added: expand-properties REPORT from RFC 3253.
+ * Added: Sabre_DAV_Property_IHref interface for properties exposing urls.
+ * Added: Issue 25: Throwing error on broken Finder behaviour.
+ * Changed: Authentication backend is now aware of current user.
+
+1.2.0alpha1 (2010-03-31)
+ * Fixed: Issue 26: Workaround for broken GVFS behaviour with encoded
+ special characters.
+ * Fixed: Issue 34: Incorrect Lock-Token response header for LOCK. Fixes
+ Office 2010 compatibility.
+ * Added: Issue 35: SabreDAV version to header to OPTIONS response to ease
+ debugging.
+ * Fixed: Issue 36: Incorrect variable name, throwing error in some
+ requests.
+ * Fixed: Issue 37: Incorrect smultron regex in temporary filefilter.
+ * Fixed: Issue 33: Converting ISO-8859-1 characters to UTF-8.
+ * Fixed: Issue 39 & Issue 40: Basename fails on non-utf-8 locales.
+ * Added: More unittests.
+ * Added: SabreDAV version to all error responses.
+ * Added: URLUtil class for decoding urls.
+ * Changed: Now using pear.sabredav.org pear channel.
+ * Changed: Sabre_DAV_Server::getCopyAndMoveInfo is now a public method.
+
+1.1.2-alpha (2010-03-18)
+ * Added: RFC5397 - current-user-principal support.
+ * Fixed: Issue 27: encoding entities in property responses.
+ * Added: naturalselection script now allows the user to specify a 'minimum
+ number of bytes' for deletion. This should reduce load due to less
+ crawling
+ * Added: Full support for the calendar-query report.
+ * Added: More unittests.
+ * Added: Support for complex property deserialization through the static
+ ::unserialize() method.
+ * Added: Support for modifying calendar-component-set
+ * Fixed: Issue 29: Added TIMEOUT_INFINITE constant
+
+1.1.1-alpha (2010-03-11)
+ * Added: RFC5689 - Extended MKCOL support.
+ * Fixed: Evolution support for CalDAV.
+ * Fixed: PDO-locks backend was pretty much completely broken. This is
+ 100% unittested now.
+ * Added: support for ctags.
+ * Fixed: Comma's between HTTP methods in 'Allow' method.
+ * Changed: default argument for Sabre_DAV_Locks_Backend_FS. This means a
+ datadirectory must always be specified from now on.
+ * Changed: Moved Sabre_DAV_Server::parseProps to
+ Sabre_DAV_XMLUtil::parseProperties.
+ * Changed: Sabre_DAV_IDirectory is now Sabre_DAV_ICollection.
+ * Changed: Sabre_DAV_Exception_PermissionDenied is now
+ Sabre_DAV_Exception_Forbidden.
+ * Changed: Sabre_CalDAV_ICalendarCollection is removed.
+ * Added: Sabre_DAV_IExtendedCollection.
+ * Added: Many more unittests.
+ * Added: support for calendar-timezone property.
+
+1.1.0-alpha (2010-03-01)
+ * Note: This version is forked from version 1.0.5, so release dates may be
+ out of order.
+ * Added: CalDAV - RFC 4791
+ * Removed: Sabre_PHP_Exception. PHP has a built-in ErrorException for
+ 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
+ implement non-digest authentication.
+ * Fixed: Better error display in browser plugin.
+ * Added: Support for {DAV:}supported-report-set
+ * Added: XML utility class with helper functions for the WebDAV protocol.
+ * Added: Tons of unittests
+ * Added: PrincipalCollection and Principal classes
+ * Added: Sabre_DAV_Server::getProperties for easy property retrieval
+ * Changed: {DAV:}resourceType defaults to 0
+ * Changed: Any non-null resourceType now gets a / appended to the href
+ value. Before this was just for {DAV:}collection's, but this is now also
+ the case for for example {DAV:}principal.
+ * Changed: The Href property class can now optionally create non-relative
+ uri's.
+ * Changed: Sabre_HTTP_Response now returns false if headers are already
+ sent and header-methods are called.
+ * Fixed: Issue 19: HEAD requests on Collections
+ * Fixed: Issue 21: Typo in Sabre_DAV_Property_Response
+ * Fixed: Issue 18: Doesn't work with Evolution Contacts
+
+1.0.15-stable (2010-05-28)
+ * Added: Issue 31: Hiding exception information by default. Can be turned
+ on with the Sabre_DAV_Server::$debugExceptions property.
+ * Added: Moved autoload from lib/ to lib/Sabre/autoload.php. This is also
+ the case in the upcoming 1.2.0, so it will improve future compatibility.
+
+1.0.14-stable (2010-04-15)
+ * Fixed: double namespace declaration in multistatus responses.
+
+1.0.13-stable (2010-03-30)
+ * Fixed: Issue 40: Last references to basename/dirname
+
+1.0.12-stable (2010-03-30)
+ * Fixed: Issue 37: Incorrect smultron regex in temporary filefilter.
+ * Fixed: Issue 26: Workaround for broken GVFS behaviour with encoded
+ special characters.
+ * Fixed: Issue 33: Converting ISO-8859-1 characters to UTF-8.
+ * Fixed: Issue 39: Basename fails on non-utf-8 locales.
+ * Added: More unittests.
+ * Added: SabreDAV version to all error responses.
+ * Added: URLUtil class for decoding urls.
+ * Updated: Now using pear.sabredav.org pear channel.
+
+1.0.11-stable (2010-03-23)
+ * Non-public release. This release is identical to 1.0.10, but it is used
+ to test releasing packages to pear.sabredav.org.
+
+1.0.10-stable (2010-03-22)
+ * Fixed: Issue 34: Invalid Lock-Token header response.
+ * Added: Issue 35: Addign SabreDAV version to HTTP OPTIONS responses.
+
+1.0.9-stable (2010-03-19)
+ * Fixed: Issue 27: Entities not being encoded in PROPFIND responses.
+ * Fixed: Issue 29: Added missing TIMEOUT_INFINITE constant.
+
+1.0.8-stable (2010-03-03)
+ * Fixed: Issue 21: typos causing errors
+ * Fixed: Issue 23: Comma's between methods in Allow header.
+ * Added: Sabre_DAV_ICollection interface, to aid in future compatibility.
+ * Added: Sabre_DAV_Exception_Forbidden exception. This will replace
+ Sabre_DAV_Exception_PermissionDenied in the future, and can already be
+ used to ensure future compatibility.
+
+1.0.7-stable (2010-02-24)
+ * Fixed: Issue 19 regression for MS Office
+
+1.0.6-stable (2010-02-23)
+ * Fixed: Issue 19: HEAD requests on Collections
+
+1.0.5-stable (2010-01-22)
+ * Fixed: Fatal error when a malformed url was used for unlocking, in
+ conjuction with Sabre.autoload.php due to a incorrect filename.
+ * Fixed: Improved unittests and build system
+
+1.0.4-stable (2010-01-11)
+ * Fixed: needed 2 different releases. One for googlecode and one for
+ pearfarm. This is to retain the old method to install SabreDAV until
+ pearfarm becomes the standard installation method.
+
+1.0.3-stable (2010-01-11)
+ * Added: RFC4709 support (davmount)
+ * Added: 6 unittests
+ * Added: naturalselection. A tool to keep cache directories below a
+ specified theshold.
+ * Changed: Now using pearfarm.org channel server.
+
+1.0.1-stable (2009-12-22)
+ * Fixed: Issue 15: typos in examples
+ * Fixed: Minor pear installation issues
+
+1.0.0-stable (2009-11-02)
+ * Added: SimpleDirectory class. This class allows creating static
+ directory structures with ease.
+ * Changed: Custom complex properties and exceptions now get an instance of
+ Sabre_DAV_Server as their first argument in serialize()
+ * Changed: Href complex property now prepends server's baseUri
+ * Changed: delete before an overwriting copy/move is now handles by server
+ class instead of tree classes
+ * Changed: events must now explicitly return false to stop execution.
+ 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
+ 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
+ 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
+ afterGetProperties event, which should provide more flexibility.
+ * Fixed: Only calling getSize() on IFile instances in httpHead()
+ * Added: beforeBind event. This is invoked upon file or directory creation
+ * Added: beforeWriteContent event, this is invoked by PUT and LOCK on an
+ existing resource.
+ * Added: beforeUnbind event. This is invoked right before deletion of any
+ resource.
+ * Added: afterGetProperties event. This event can be used to make
+ modifications to property responses.
+ * Added: beforeLock and beforeUnlock events.
+ * Added: afterBind event.
+ * 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.
+ * 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
+
+0.12.1-beta (2009-09-11)
+ * Fixed: UNLOCK bug. Unlock didn't work at all
+
+0.12-beta (2009-09-10)
+ * Updated: Browser plugin 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
+ improves NGinx compatibility.
+ * Fixed: Last modification time is reported in UTC timezone. This improves
+ Finder compatibility.
+
+0.11-beta (2009-08-11)
+ * Updated: Now in Beta
+ * Updated: Pear package no longer includes docs/ directory. These just
+ contained rfc's, which are publically available. This reduces the
+ package from ~800k to ~60k
+ * Added: generatePropfindResponse now takes a baseUri argument
+ * Added: ResourceType property can now contain multiple resourcetypes.
+ * Fixed: Issue 13.
+
+0.10-alpha (2009-08-03)
+ * Added: Plugin to automatically map GET requests to non-files to
+ PROPFIND (Sabre_DAV_Browser_MapGetToPropFind). This should allow
+ easier debugging of complicated WebDAV setups.
+ * Added: Sabre_DAV_Property_Href class. For future use.
+ * 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
+ 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.
+ * Added: now a PEAR-compatible package again, thanks to Michael Gauthier
+ * Changed: moved default copy and move logic from ObjectTree to Tree class
+
+0.9-alpha (2009-07-21)
+ * Changed: Major refactoring, removed most of the logic from the Tree
+ objects. The Server class now directly works with the INode, IFile
+ 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.
+ * 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.
+ * Added: simpleserversetup.py script. This will quickly get a fileserver
+ up and running.
+ * Added: When subscribing to events, it is now possible to supply a
+ 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
+ subject to change.
+ * Added: RFC 2324 HTTP 418 status code
+ * Fixed: Exclusive locks could in some cases be picked up as shared locks
+ * Fixed: Digest auth for non-apache servers had a bug (still not actually
+ tested this well).
+
+0.8-alpha (2009-05-30)
+ * 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
+ straight from the browser.
+ * Added: 12 more unittests
+ * Fixed: Locking bug, which became prevalent on Windows Vista.
+ * Fixed: Netdrive support
+ * Fixed: TemporaryFileFilter filtered out too many files. Fixed some
+ of the regexes.
+ * Fixed: Added README and ChangeLog to package
+
+0.7-alpha (2009-03-29)
+ * Added: System to return complex properties from PROPFIND.
+ * 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: 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.
+ * Changed: ->getSize is only called for files, no longer for collections.
+ r303
+ * Changed: Sabre_DAV_FilterTree is now Sabre_DAV_Tree_Filter
+ * Changed: Sabre_DAV_TemporaryFileFilter is now called
+ Sabre_DAV_Tree_TemporaryFileFilter.
+ * Changed: removed functions (get(/set)HTTPRequest(/Response)) from Server
+ class, and using a public property instead.
+ * Fixed: bug related to parsing proppatch and propfind requests. Didn't
+ show up in most clients, but it needed fixing regardless. (r255)
+ * Fixed: auth-int is now properly supported within HTTP Digest.
+ * Fixed: Using application/xml for a mimetype vs. text/xml as per RFC4918
+ sec 8.2.
+ * Fixed: TemporaryFileFilter now lets through GET's if they actually
+ exist on the backend. (r274)
+ * FIxed: Some methods didn't get passed through in the FilterTree (r283).
+ * Fixed: LockManager is now slightly more complex, Tree classes slightly
+ less. (r287)
+
+0.6-alpha (2009-02-16)
+ * Added: Now uses streams for files, instead of strings.
+ This means it won't require to hold entire files in memory, which can be
+ an issue if you're dealing with big files. Note that this breaks
+ compatibility for put() and createFile methods.
+ * Added: HTTP Digest Authentication helper class.
+ * Added: Support for HTTP Range header
+ * Added: Support for ETags within If: headers
+ * Added: The API can now return ETags and override the default Content-Type
+ * Added: starting with basic framework for unittesting, using PHPUnit.
+ * Added: 49 unittests.
+ * Added: Abstraction for the HTTP request.
+ * Updated: Using Clark Notation for tags in properties. This means tags
+ are serialized as {namespace}tagName instead of namespace#tagName
+ * Fixed: HTTP_BasicAuth class now works as expected.
+ * Fixed: DAV_Server uses / for a default baseUrl.
+ * Fixed: Last modification date is no longer ignored in PROPFIND.
+ * Fixed: PROPFIND now sends back information about the requestUri even
+ when "Depth: 1" is specified.
+
+0.5-alpha (2009-01-14)
+ * Added: Added a very simple example for implementing a mapping to PHP
+ file streams. This should allow easy implementation of for example a
+ WebDAV to FTP proxy.
+ * Added: HTTP Basic Authentication helper class.
+ * Added: Sabre_HTTP_Response class. This centralizes HTTP operations and
+ will be a start towards the creating of a testing framework.
+ * Updated: Backwards compatibility break: all require_once() statements
+ are removed
+ from all the files. It is now recommended to use autoloading of
+ classes, or just including lib/Sabre.includes.php. This fix was made
+ to allow easier integration into applications not using this standard
+ inclusion model.
+ * Updated: Better in-file documentation.
+ * Updated: Sabre_DAV_Tree can now work with Sabre_DAV_LockManager.
+ * Updated: Fixes a shared-lock bug.
+ * Updated: Removed ?> from the bottom of each php file.
+ * Updated: Split up some operations from Sabre_DAV_Server to
+ Sabre_HTTP_Response.
+ * Fixed: examples are now actually included in the pear package.
+
+0.4-alpha (2008-11-05)
+ * Passes all litmus tests!
+ * Added: more examples
+ * Added: Custom property support
+ * Added: Shared lock support
+ * Added: Depth support to locks
+ * Added: Locking on unmapped urls (non-existent nodes)
+ * Fixed: Advertising as WebDAV class 3 support
+
+0.3-alpha (2008-06-29)
+ * Fully working in MS Windows clients.
+ * Added: temporary file filter: support for smultron files.
+ * Added: Phing build scripts
+ * Added: PEAR package
+ * Fixed: MOVE bug identified using finder.
+ * Fixed: Using gzuncompress instead of gzdecode in the temporary file
+ filter. This seems more common.
+
+0.2-alpha (2008-05-27)
+ * Somewhat working in Windows clients
+ * Added: Working PROPPATCH method (doesn't support custom properties yet)
+ * Added: Temporary filename handling system
+ * Added: Sabre_DAV_IQuota to return quota information
+ * Added: PROPFIND now reads the request body and only supplies the
+ requested properties
+
+0.1-alpha (2008-04-04)
+ * First release!
+ * Passes litmus: basic, http and copymove test.
+ * Fully working in Finder and DavFSv2
+
+Project started: 2007-12-13
diff --git a/vendor/sabre/dav/LICENSE b/vendor/sabre/dav/LICENSE
new file mode 100644
index 000000000..68aceab80
--- /dev/null
+++ b/vendor/sabre/dav/LICENSE
@@ -0,0 +1,27 @@
+Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/)
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+ * Neither the name of SabreDAV nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND 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.
diff --git a/vendor/sabre/dav/README.md b/vendor/sabre/dav/README.md
new file mode 100644
index 000000000..8346c9a39
--- /dev/null
+++ b/vendor/sabre/dav/README.md
@@ -0,0 +1,30 @@
+# What is SabreDAV
+
+SabreDAV allows you to easily add WebDAV support to a PHP application. SabreDAV is meant to cover the entire standard, and attempts to allow integration using an easy to understand API.
+
+### Feature list:
+
+* Fully WebDAV compliant
+* Supports Windows XP, Windows Vista, Mac OS/X, DavFSv2, Cadaver, Netdrive, Open Office, and probably more.
+* Passing all Litmus tests.
+* Supporting class 1, 2 and 3 Webdav servers.
+* Locking support.
+* Custom property support.
+* CalDAV (tested with [Evolution](http://code.google.com/p/sabredav/wiki/Evolution), [iCal](http://code.google.com/p/sabredav/wiki/ICal), [iPhone](http://code.google.com/p/sabredav/wiki/IPhone) and [Lightning](http://code.google.com/p/sabredav/wiki/Lightning)).
+* CardDAV (tested with [OS/X addressbook](http://code.google.com/p/sabredav/wiki/OSXAddressbook), the [iOS addressbook](http://code.google.com/p/sabredav/wiki/iOSCardDAV) and [Evolution](http://code.google.com/p/sabredav/wiki/Evolution)).
+* Over 97% unittest code coverage.
+
+### Supported RFC's:
+
+* [RFC2617](http://www.ietf.org/rfc/rfc2617.txt): Basic/Digest auth.
+* [RFC2518](http://www.ietf.org/rfc/rfc2518.txt): First WebDAV spec.
+* [RFC3744](http://www.ietf.org/rfc/rfc3744.txt): ACL (some features missing).
+* [RFC4709](http://www.ietf.org/rfc/rfc4709.txt): [DavMount](http://code.google.com/p/sabredav/wiki/DavMount).
+* [RFC4791](http://www.ietf.org/rfc/rfc4791.txt): CalDAV.
+* [RFC4918](http://www.ietf.org/rfc/rfc4918.txt): WebDAV revision.
+* [RFC5397](http://www.ietf.org/rfc/rfc5689.txt): current-user-principal.
+* [RFC5689](http://www.ietf.org/rfc/rfc5689.txt): Extended MKCOL.
+* [RFC5789](http://tools.ietf.org/html/rfc5789): PATCH method for HTTP.
+* [RFC6352](http://www.ietf.org/rfc/rfc6352.txt): CardDAV
+* [draft-daboo-carddav-directory-gateway](http://tools.ietf.org/html/draft-daboo-carddav-directory-gateway): CardDAV directory gateway
+* CalDAV ctag, CalDAV-proxy.
diff --git a/vendor/sabre/dav/bin/googlecode_upload.py b/vendor/sabre/dav/bin/googlecode_upload.py
new file mode 100755
index 000000000..caafd5ded
--- /dev/null
+++ b/vendor/sabre/dav/bin/googlecode_upload.py
@@ -0,0 +1,248 @@
+#!/usr/bin/env python
+#
+# Copyright 2006, 2007 Google Inc. All Rights Reserved.
+# Author: danderson@google.com (David Anderson)
+#
+# Script for uploading files to a Google Code project.
+#
+# This is intended to be both a useful script for people who want to
+# streamline project uploads and a reference implementation for
+# uploading files to Google Code projects.
+#
+# To upload a file to Google Code, you need to provide a path to the
+# file on your local machine, a small summary of what the file is, a
+# project name, and a valid account that is a member or owner of that
+# project. You can optionally provide a list of labels that apply to
+# the file. The file will be uploaded under the same name that it has
+# in your local filesystem (that is, the "basename" or last path
+# component). Run the script with '--help' to get the exact syntax
+# and available options.
+#
+# Note that the upload script requests that you enter your
+# googlecode.com password. This is NOT your Gmail account password!
+# This is the password you use on googlecode.com for committing to
+# Subversion and uploading files. You can find your password by going
+# to http://code.google.com/hosting/settings when logged in with your
+# Gmail account. If you have already committed to your project's
+# Subversion repository, the script will automatically retrieve your
+# credentials from there (unless disabled, see the output of '--help'
+# for details).
+#
+# If you are looking at this script as a reference for implementing
+# your own Google Code file uploader, then you should take a look at
+# the upload() function, which is the meat of the uploader. You
+# basically need to build a multipart/form-data POST request with the
+# right fields and send it to https://PROJECT.googlecode.com/files .
+# Authenticate the request using HTTP Basic authentication, as is
+# shown below.
+#
+# Licensed under the terms of the Apache Software License 2.0:
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Questions, comments, feature requests and patches are most welcome.
+# Please direct all of these to the Google Code users group:
+# http://groups.google.com/group/google-code-hosting
+
+"""Google Code file uploader script.
+"""
+
+__author__ = 'danderson@google.com (David Anderson)'
+
+import httplib
+import os.path
+import optparse
+import getpass
+import base64
+import sys
+
+
+def upload(file, project_name, user_name, password, summary, labels=None):
+ """Upload a file to a Google Code project's file server.
+
+ Args:
+ file: The local path to the file.
+ project_name: The name of your project on Google Code.
+ user_name: Your Google account name.
+ password: The googlecode.com password for your account.
+ Note that this is NOT your global Google Account password!
+ summary: A small description for the file.
+ labels: an optional list of label strings with which to tag the file.
+
+ Returns: a tuple:
+ http_status: 201 if the upload succeeded, something else if an
+ error occurred.
+ http_reason: The human-readable string associated with http_status
+ file_url: If the upload succeeded, the URL of the file on Google
+ Code, None otherwise.
+ """
+ # The login is the user part of user@gmail.com. If the login provided
+ # is in the full user@domain form, strip it down.
+ if user_name.endswith('@gmail.com'):
+ user_name = user_name[:user_name.index('@gmail.com')]
+
+ form_fields = [('summary', summary)]
+ if labels is not None:
+ form_fields.extend([('label', l.strip()) for l in labels])
+
+ content_type, body = encode_upload_request(form_fields, file)
+
+ upload_host = '%s.googlecode.com' % project_name
+ upload_uri = '/files'
+ auth_token = base64.b64encode('%s:%s'% (user_name, password))
+ headers = {
+ 'Authorization': 'Basic %s' % auth_token,
+ 'User-Agent': 'Googlecode.com uploader v0.9.4',
+ 'Content-Type': content_type,
+ }
+
+ server = httplib.HTTPSConnection(upload_host)
+ server.request('POST', upload_uri, body, headers)
+ resp = server.getresponse()
+ server.close()
+
+ if resp.status == 201:
+ location = resp.getheader('Location', None)
+ else:
+ location = None
+ return resp.status, resp.reason, location
+
+
+def encode_upload_request(fields, file_path):
+ """Encode the given fields and file into a multipart form body.
+
+ fields is a sequence of (name, value) pairs. file is the path of
+ the file to upload. The file will be uploaded to Google Code with
+ the same file name.
+
+ Returns: (content_type, body) ready for httplib.HTTP instance
+ """
+ BOUNDARY = '----------Googlecode_boundary_reindeer_flotilla'
+ CRLF = '\r\n'
+
+ body = []
+
+ # Add the metadata about the upload first
+ for key, value in fields:
+ body.extend(
+ ['--' + BOUNDARY,
+ 'Content-Disposition: form-data; name="%s"' % key,
+ '',
+ value,
+ ])
+
+ # Now add the file itself
+ file_name = os.path.basename(file_path)
+ f = open(file_path, 'rb')
+ file_content = f.read()
+ f.close()
+
+ body.extend(
+ ['--' + BOUNDARY,
+ 'Content-Disposition: form-data; name="filename"; filename="%s"'
+ % file_name,
+ # The upload server determines the mime-type, no need to set it.
+ 'Content-Type: application/octet-stream',
+ '',
+ file_content,
+ ])
+
+ # Finalize the form body
+ body.extend(['--' + BOUNDARY + '--', ''])
+
+ return 'multipart/form-data; boundary=%s' % BOUNDARY, CRLF.join(body)
+
+
+def upload_find_auth(file_path, project_name, summary, labels=None,
+ user_name=None, password=None, tries=3):
+ """Find credentials and upload a file to a Google Code project's file server.
+
+ file_path, project_name, summary, and labels are passed as-is to upload.
+
+ Args:
+ file_path: The local path to the file.
+ project_name: The name of your project on Google Code.
+ summary: A small description for the file.
+ labels: an optional list of label strings with which to tag the file.
+ config_dir: Path to Subversion configuration directory, 'none', or None.
+ user_name: Your Google account name.
+ tries: How many attempts to make.
+ """
+
+ while tries > 0:
+ if user_name is None:
+ # Read username if not specified or loaded from svn config, or on
+ # subsequent tries.
+ sys.stdout.write('Please enter your googlecode.com username: ')
+ sys.stdout.flush()
+ user_name = sys.stdin.readline().rstrip()
+ if password is None:
+ # Read password if not loaded from svn config, or on subsequent tries.
+ print 'Please enter your googlecode.com password.'
+ print '** Note that this is NOT your Gmail account password! **'
+ print 'It is the password you use to access Subversion repositories,'
+ print 'and can be found here: http://code.google.com/hosting/settings'
+ password = getpass.getpass()
+
+ status, reason, url = upload(file_path, project_name, user_name, password,
+ summary, labels)
+ # Returns 403 Forbidden instead of 401 Unauthorized for bad
+ # credentials as of 2007-07-17.
+ if status in [httplib.FORBIDDEN, httplib.UNAUTHORIZED]:
+ # Rest for another try.
+ user_name = password = None
+ tries = tries - 1
+ else:
+ # We're done.
+ break
+
+ return status, reason, url
+
+
+def main():
+ parser = optparse.OptionParser(usage='googlecode-upload.py -s SUMMARY '
+ '-p PROJECT [options] FILE')
+ parser.add_option('-s', '--summary', dest='summary',
+ help='Short description of the file')
+ parser.add_option('-p', '--project', dest='project',
+ help='Google Code project name')
+ parser.add_option('-u', '--user', dest='user',
+ help='Your Google Code username')
+ parser.add_option('-w', '--password', dest='password',
+ help='Your Google Code password')
+ parser.add_option('-l', '--labels', dest='labels',
+ help='An optional list of comma-separated labels to attach '
+ 'to the file')
+
+ options, args = parser.parse_args()
+
+ if not options.summary:
+ parser.error('File summary is missing.')
+ elif not options.project:
+ parser.error('Project name is missing.')
+ elif len(args) < 1:
+ parser.error('File to upload not provided.')
+ elif len(args) > 1:
+ parser.error('Only one file may be specified.')
+
+ file_path = args[0]
+
+ if options.labels:
+ labels = options.labels.split(',')
+ else:
+ labels = None
+
+ status, reason, url = upload_find_auth(file_path, options.project,
+ options.summary, labels,
+ options.user, options.password)
+ if url:
+ print 'The file was uploaded successfully.'
+ print 'URL: %s' % url
+ return 0
+ else:
+ print 'An error occurred. Your file was not uploaded.'
+ print 'Google Code upload server said: %s (%s)' % (reason, status)
+ return 1
+
+
+if __name__ == '__main__':
+ sys.exit(main())
diff --git a/vendor/sabre/dav/bin/migrateto17.php b/vendor/sabre/dav/bin/migrateto17.php
new file mode 100755
index 000000000..66a9ee564
--- /dev/null
+++ b/vendor/sabre/dav/bin/migrateto17.php
@@ -0,0 +1,284 @@
+#!/usr/bin/env php
+<?php
+
+echo "SabreDAV migrate script for version 1.7\n";
+
+if ($argc<2) {
+
+ echo <<<HELLO
+
+This script help you migrate from a pre-1.7 database to 1.7 and later\n
+Both the 'calendarobjects' and 'calendars' tables will be upgraded.
+
+If you do not have this table, or don't use the default PDO CalDAV backend
+it's pointless to run this script.
+
+Keep in mind that some processing will be done on every single record of this
+table and in addition, ALTER TABLE commands will be executed.
+If you have a large calendarobjects table, this may mean that this process
+takes a while.
+
+Usage:
+
+php {$argv[0]} [pdo-dsn] [username] [password]
+
+For example:
+
+php {$argv[0]} "mysql:host=localhost;dbname=sabredav" root password
+php {$argv[0]} sqlite:data/sabredav.db
+
+HELLO;
+
+ exit();
+
+}
+
+// There's a bunch of places where the autoloader could be, so we'll try all of
+// them.
+$paths = array(
+ __DIR__ . '/../vendor/autoload.php',
+ __DIR__ . '/../../../autoload.php',
+);
+
+foreach($paths as $path) {
+ if (file_exists($path)) {
+ include $path;
+ break;
+ }
+}
+
+$dsn = $argv[1];
+$user = isset($argv[2])?$argv[2]:null;
+$pass = isset($argv[3])?$argv[3]:null;
+
+echo "Connecting to database: " . $dsn . "\n";
+
+$pdo = new PDO($dsn, $user, $pass);
+$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
+$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
+
+echo "Validating existing table layout\n";
+
+// The only cross-db way to do this, is to just fetch a single record.
+$row = $pdo->query("SELECT * FROM calendarobjects LIMIT 1")->fetch();
+
+if (!$row) {
+ echo "Error: This database did not have any records in the calendarobjects table, you should just recreate the table.\n";
+ exit(-1);
+}
+
+$requiredFields = array(
+ 'id',
+ 'calendardata',
+ 'uri',
+ 'calendarid',
+ 'lastmodified',
+);
+
+foreach($requiredFields as $requiredField) {
+ if (!array_key_exists($requiredField,$row)) {
+ echo "Error: The current 'calendarobjects' table was missing a field we expected to exist.\n";
+ echo "For safety reasons, this process is stopped.\n";
+ exit(-1);
+ }
+}
+
+$fields17 = array(
+ 'etag',
+ 'size',
+ 'componenttype',
+ 'firstoccurence',
+ 'lastoccurence',
+);
+
+$found = 0;
+foreach($fields17 as $field) {
+ if (array_key_exists($field, $row)) {
+ $found++;
+ }
+}
+
+if ($found === 0) {
+ echo "The database had the 1.6 schema. Table will now be altered.\n";
+ echo "This may take some time for large tables\n";
+
+ switch($pdo->getAttribute(PDO::ATTR_DRIVER_NAME)) {
+
+ case 'mysql' :
+
+ $pdo->exec(<<<SQL
+ALTER TABLE calendarobjects
+ADD etag VARCHAR(32),
+ADD size INT(11) UNSIGNED,
+ADD componenttype VARCHAR(8),
+ADD firstoccurence INT(11) UNSIGNED,
+ADD lastoccurence INT(11) UNSIGNED
+SQL
+ );
+ break;
+ case 'sqlite' :
+ $pdo->exec('ALTER TABLE calendarobjects ADD etag text');
+ $pdo->exec('ALTER TABLE calendarobjects ADD size integer');
+ $pdo->exec('ALTER TABLE calendarobjects ADD componenttype TEXT');
+ $pdo->exec('ALTER TABLE calendarobjects ADD firstoccurence integer');
+ $pdo->exec('ALTER TABLE calendarobjects ADD lastoccurence integer');
+ break;
+
+ default :
+ die('This upgrade script does not support this driver (' . $pdo->getAttribute(PDO::ATTR_DRIVER_NAME) . ")\n");
+
+ }
+ echo "Database schema upgraded.\n";
+
+} elseif ($found === 5) {
+
+ echo "Database already had the 1.7 schema\n";
+
+} else {
+
+ echo "The database had $found out of 5 from the changes for 1.7. This is scary and unusual, so we have to abort.\n";
+ echo "You can manually try to upgrade the schema, and then run this script again.\n";
+ exit(-1);
+
+}
+
+echo "Now, we need to parse every record and pull out some information.\n";
+
+$result = $pdo->query('SELECT id, calendardata FROM calendarobjects');
+$stmt = $pdo->prepare('UPDATE calendarobjects SET etag = ?, size = ?, componenttype = ?, firstoccurence = ?, lastoccurence = ? WHERE id = ?');
+
+echo "Total records found: " . $result->rowCount() . "\n";
+$done = 0;
+$total = $result->rowCount();
+while($row = $result->fetch()) {
+
+ try {
+ $newData = getDenormalizedData($row['calendardata']);
+ } catch (Exception $e) {
+ echo "===\nException caught will trying to parser calendarobject.\n";
+ echo "Error message: " . $e->getMessage() . "\n";
+ echo "Record id: " . $row['id'] . "\n";
+ echo "This record is ignored, you should inspect it to see if there's anything wrong.\n===\n";
+ continue;
+ }
+ $stmt->execute(array(
+ $newData['etag'],
+ $newData['size'],
+ $newData['componentType'],
+ $newData['firstOccurence'],
+ $newData['lastOccurence'],
+ $row['id'],
+ ));
+ $done++;
+
+ if ($done % 500 === 0) {
+ echo "Completed: $done / $total\n";
+ }
+}
+echo "Completed: $done / $total\n";
+
+echo "Checking the calendars table needs changes.\n";
+$row = $pdo->query("SELECT * FROM calendars LIMIT 1")->fetch();
+
+if (array_key_exists('transparent', $row)) {
+
+ echo "The calendars table is already up to date\n";
+
+} else {
+
+ echo "Adding the 'transparent' field to the calendars table\n";
+
+ switch($pdo->getAttribute(PDO::ATTR_DRIVER_NAME)) {
+
+ case 'mysql' :
+ $pdo->exec("ALTER TABLE calendars ADD transparent TINYINT(1) NOT NULL DEFAULT '0'");
+ break;
+ case 'sqlite' :
+ $pdo->exec("ALTER TABLE calendars ADD transparent bool");
+ break;
+
+ default :
+ die('This upgrade script does not support this driver (' . $pdo->getAttribute(PDO::ATTR_DRIVER_NAME) . ")\n");
+
+ }
+
+}
+
+echo "Process completed!\n";
+
+/**
+ * Parses some information from calendar objects, used for optimized
+ * calendar-queries.
+ *
+ * Blantently copied from Sabre\CalDAV\Backend\PDO
+ *
+ * Returns an array with the following keys:
+ * * etag
+ * * size
+ * * componentType
+ * * firstOccurence
+ * * lastOccurence
+ *
+ * @param string $calendarData
+ * @return array
+ */
+function getDenormalizedData($calendarData) {
+
+ $vObject = \Sabre\VObject\Reader::read($calendarData);
+ $componentType = null;
+ $component = null;
+ $firstOccurence = null;
+ $lastOccurence = null;
+ foreach($vObject->getComponents() as $component) {
+ if ($component->name!=='VTIMEZONE') {
+ $componentType = $component->name;
+ break;
+ }
+ }
+ if (!$componentType) {
+ throw new \Sabre\DAV\Exception\BadRequest('Calendar objects must have a VJOURNAL, VEVENT or VTODO component');
+ }
+ if ($componentType === 'VEVENT') {
+ $firstOccurence = $component->DTSTART->getDateTime()->getTimeStamp();
+ // Finding the last occurence is a bit harder
+ if (!isset($component->RRULE)) {
+ if (isset($component->DTEND)) {
+ $lastOccurence = $component->DTEND->getDateTime()->getTimeStamp();
+ } elseif (isset($component->DURATION)) {
+ $endDate = clone $component->DTSTART->getDateTime();
+ $endDate->add(\Sabre\VObject\DateTimeParser::parse($component->DURATION->value));
+ $lastOccurence = $endDate->getTimeStamp();
+ } elseif (!$component->DTSTART->hasTime()) {
+ $endDate = clone $component->DTSTART->getDateTime();
+ $endDate->modify('+1 day');
+ $lastOccurence = $endDate->getTimeStamp();
+ } else {
+ $lastOccurence = $firstOccurence;
+ }
+ } else {
+ $it = new \Sabre\VObject\RecurrenceIterator($vObject, (string)$component->UID);
+ $maxDate = new DateTime(\Sabre\CalDAV\Backend\PDO::MAX_DATE);
+ if ($it->isInfinite()) {
+ $lastOccurence = $maxDate->getTimeStamp();
+ } else {
+ $end = $it->getDtEnd();
+ while($it->valid() && $end < $maxDate) {
+ $end = $it->getDtEnd();
+ $it->next();
+
+ }
+ $lastOccurence = $end->getTimeStamp();
+ }
+
+ }
+ }
+
+ return array(
+ 'etag' => md5($calendarData),
+ 'size' => strlen($calendarData),
+ 'componentType' => $componentType,
+ 'firstOccurence' => $firstOccurence,
+ 'lastOccurence' => $lastOccurence,
+ );
+
+}
diff --git a/vendor/sabre/dav/bin/naturalselection.py b/vendor/sabre/dav/bin/naturalselection.py
new file mode 100755
index 000000000..aa5554dd0
--- /dev/null
+++ b/vendor/sabre/dav/bin/naturalselection.py
@@ -0,0 +1,140 @@
+#!/usr/bin/env python
+
+#
+# Copyright (c) 2009-2010 Evert Pot
+# All rights reserved.
+# http://www.rooftopsolutions.nl/
+#
+# This utility is distributed along with SabreDAV
+# license: http://code.google.com/p/sabredav/wiki/License Modified BSD License
+
+import os
+from optparse import OptionParser
+import time
+
+def getfreespace(path):
+ stat = os.statvfs(path)
+ return stat.f_frsize * stat.f_bavail
+
+def getbytesleft(path,treshold):
+ return getfreespace(path)-treshold
+
+def run(cacheDir, treshold, sleep=5, simulate=False, min_erase = 0):
+
+ bytes = getbytesleft(cacheDir,treshold)
+ if (bytes>0):
+ print "Bytes to go before we hit treshhold:", bytes
+ else:
+ print "Treshold exceeded with:", -bytes, "bytes"
+ dir = os.listdir(cacheDir)
+ dir2 = []
+ for file in dir:
+ path = cacheDir + '/' + file
+ dir2.append({
+ "path" : path,
+ "atime": os.stat(path).st_atime,
+ "size" : os.stat(path).st_size
+ })
+
+ dir2.sort(lambda x,y: int(x["atime"]-y["atime"]))
+
+ filesunlinked = 0
+ gainedspace = 0
+
+ # Left is the amount of bytes that need to be freed up
+ # The default is the 'min_erase setting'
+ left = min_erase
+
+ # If the min_erase setting is lower than the amount of bytes over
+ # the treshold, we use that number instead.
+ if left < -bytes :
+ left = -bytes
+
+ print "Need to delete at least:", left;
+
+ for file in dir2:
+
+ # Only deleting files if we're not simulating
+ if not simulate: os.unlink(file["path"])
+ left = int(left - file["size"])
+ gainedspace = gainedspace + file["size"]
+ filesunlinked = filesunlinked + 1
+
+ if(left<0):
+ break
+
+ print "%d files deleted (%d bytes)" % (filesunlinked, gainedspace)
+
+
+ time.sleep(sleep)
+
+
+
+def main():
+ parser = OptionParser(
+ version="naturalselecton v0.3",
+ description="Cache directory manager. Deletes cache entries based on accesstime and free space tresholds.\n" +
+ "This utility is distributed alongside SabreDAV.",
+ usage="usage: %prog [options] cacheDirectory",
+ )
+ parser.add_option(
+ '-s',
+ dest="simulate",
+ action="store_true",
+ help="Don't actually make changes, but just simulate the behaviour",
+ )
+ parser.add_option(
+ '-r','--runs',
+ help="How many times to check before exiting. -1 is infinite, which is the default",
+ type="int",
+ dest="runs",
+ default=-1
+ )
+ parser.add_option(
+ '-n','--interval',
+ help="Sleep time in seconds (default = 5)",
+ type="int",
+ dest="sleep",
+ default=5
+ )
+ parser.add_option(
+ '-l','--treshold',
+ help="Treshhold in bytes (default = 10737418240, which is 10GB)",
+ type="int",
+ dest="treshold",
+ default=10737418240
+ )
+ parser.add_option(
+ '-m', '--min-erase',
+ help="Minimum number of bytes to erase when the treshold is reached. " +
+ "Setting this option higher will reduce the amount of times the cache directory will need to be scanned. " +
+ "(the default is 1073741824, which is 1GB.)",
+ type="int",
+ dest="min_erase",
+ default=1073741824
+ )
+
+ options,args = parser.parse_args()
+ if len(args)<1:
+ parser.error("This utility requires at least 1 argument")
+ cacheDir = args[0]
+
+ print "Natural Selection"
+ print "Cache directory:", cacheDir
+ free = getfreespace(cacheDir);
+ print "Current free disk space:", free
+
+ runs = options.runs;
+ while runs!=0 :
+ run(
+ cacheDir,
+ sleep=options.sleep,
+ simulate=options.simulate,
+ treshold=options.treshold,
+ min_erase=options.min_erase
+ )
+ if runs>0:
+ runs = runs - 1
+
+if __name__ == '__main__' :
+ main()
diff --git a/vendor/sabre/dav/bin/sabredav b/vendor/sabre/dav/bin/sabredav
new file mode 100755
index 000000000..032371ba8
--- /dev/null
+++ b/vendor/sabre/dav/bin/sabredav
@@ -0,0 +1,2 @@
+#!/bin/sh
+php -S 0.0.0.0:8080 `dirname $0`/sabredav.php
diff --git a/vendor/sabre/dav/bin/sabredav.php b/vendor/sabre/dav/bin/sabredav.php
new file mode 100755
index 000000000..34a674fd5
--- /dev/null
+++ b/vendor/sabre/dav/bin/sabredav.php
@@ -0,0 +1,53 @@
+<?php
+
+// SabreDAV test server.
+
+class CliLog {
+
+ protected $stream;
+
+ function __construct() {
+
+ $this->stream = fopen('php://stdout','w');
+
+ }
+
+ function log($msg) {
+ fwrite($this->stream, $msg . "\n");
+ }
+
+}
+
+$log = new CliLog();
+
+if (php_sapi_name()!=='cli-server') {
+ die("This script is intended to run on the built-in php webserver");
+}
+
+// Finding composer
+
+
+$paths = array(
+ __DIR__ . '/../vendor/autoload.php',
+ __DIR__ . '/../../../autoload.php',
+);
+
+foreach($paths as $path) {
+ if (file_exists($path)) {
+ include $path;
+ break;
+ }
+}
+
+use Sabre\DAV;
+
+// Root
+$root = new DAV\FS\Directory(getcwd());
+
+// Setting up server.
+$server = new DAV\Server($root);
+
+// Browser plugin
+$server->addPlugin(new DAV\Browser\Plugin());
+
+$server->exec();
diff --git a/vendor/sabre/dav/build.xml b/vendor/sabre/dav/build.xml
new file mode 100644
index 000000000..6a37d2011
--- /dev/null
+++ b/vendor/sabre/dav/build.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0"?>
+<project name="SabreDAV" default="buildzip" basedir=".">
+
+ <!-- Any default properties -->
+ <property file="build.properties" />
+
+ <!-- Where to write api documentation -->
+ <property name="sabredav.apidocspath" value="docs/api" />
+
+ <target name="buildzip" depends="init, test, clean">
+ <mkdir dir="build" />
+ <echo>Running composer</echo>
+ <exec command="composer create-project --no-dev sabre/dav build/SabreDAV ${sabredav.version}" checkreturn="false" passthru="1" />
+ <zip destfile="build/SabreDAV-${sabredav.version}.zip" basedir="build/SabreDAV" prefix="SabreDAV/" />
+ </target>
+
+ <target name="uploadzip" depends="buildzip">
+ <echo>Uploading to Google Code</echo>
+ <propertyprompt propertyName="googlecode.username" promptText="Enter your googlecode username" useExistingValue="true" />
+ <propertyprompt propertyName="googlecode.password" promptText="Enter your googlecode password" useExistingValue="true" />
+ <exec command="bin/googlecode_upload.py -s 'SabreDAV ${sabredav.version}' -p sabredav --labels=${sabredav.ucstability} -u '${googlecode.username}' -w '${googlecode.password}' build/SabreDAV-${sabredav.version}.zip" checkreturn="true" />
+ </target>
+
+ <target name="clean" depends="init">
+ <echo msg="Removing build files (cleaning up distribution)" />
+ <delete dir="docs/api" />
+ <delete dir="build" />
+ </target>
+
+ <target name="markrelease" depends="init,clean,test">
+ <echo>Creating Git release tag</echo>
+ <exec command="git tag ${sabredav.version}" checkreturn="false" passthru="1" />
+ </target>
+
+ <target name="test">
+ <phpunit haltonfailure="1" haltonerror="1" bootstrap="tests/bootstrap.php" haltonskipped="1" printsummary="1">
+ <batchtest>
+ <fileset dir="tests">
+ <include name="**/*.php"/>
+ </fileset>
+ </batchtest>
+ </phpunit>
+ </target>
+
+ <target name="apidocs" depends="init">
+
+ <echo>Creating api documentation using PHP documentor</echo>
+ <echo>Writing to ${sabredav.apidocspath}</echo>
+ <exec command="phpdoc parse -t ${sabredav.apidocspath} -d lib/" passthru="1" />
+ <exec command="bin/phpdocmd ${sabredav.apidocspath}/structure.xml ${sabredav.apidocspath} --lt %c" passthru="1" />
+ <!--<delete file="${sabredav.apidocspath}/structure.xml" />-->
+
+ </target>
+
+ <target name="init">
+
+ <!-- This sets SabreDAV version information -->
+ <adhoc-task name="sabredav-version"><![CDATA[
+
+ class SabreDAV_VersionTask extends Task {
+
+ public function main() {
+
+ include_once 'lib/Sabre/DAV/Version.php';
+ $this->getProject()->setNewProperty('sabredav.version',\Sabre\DAV\Version::VERSION);
+ $this->getProject()->setNewProperty('sabredav.stability',\Sabre\DAV\Version::STABILITY);
+ $this->getProject()->setNewProperty('sabredav.ucstability',ucwords(Sabre\DAV\Version::STABILITY));
+
+ }
+
+ }
+
+ ]]></adhoc-task>
+ <sabredav-version />
+ <echo>SabreDAV version ${sabredav.version}</echo>
+
+ </target>
+
+</project>
diff --git a/vendor/sabre/dav/docs/caldav-ctag.txt b/vendor/sabre/dav/docs/caldav-ctag.txt
new file mode 100644
index 000000000..4787ca260
--- /dev/null
+++ b/vendor/sabre/dav/docs/caldav-ctag.txt
@@ -0,0 +1,336 @@
+
+
+
+Calendar Server Extension C. Daboo
+ Apple
+ May 3, 2007
+
+
+ Calendar Collection Entity Tag (CTag) in CalDAV
+ caldav-ctag-02
+
+Abstract
+
+ This specification defines an extension to CalDAV that provides a
+ fast way for a client to determine whether the contents of a calendar
+ collection may have changed.
+
+
+Table of Contents
+
+ 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 2
+ 2. Conventions Used in This Document . . . . . . . . . . . . . . . 2
+ 3. Overview . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
+ 3.1. Server . . . . . . . . . . . . . . . . . . . . . . . . . . 3
+ 3.2. Client . . . . . . . . . . . . . . . . . . . . . . . . . . 3
+ 4. New features in CalDAV . . . . . . . . . . . . . . . . . . . . 3
+ 4.1. getctag WebDAV Property . . . . . . . . . . . . . . . . . . 4
+ 5. Security Considerations . . . . . . . . . . . . . . . . . . . . 4
+ 6. IANA Considerations . . . . . . . . . . . . . . . . . . . . . . 5
+ 7. Normative References . . . . . . . . . . . . . . . . . . . . . 5
+ Appendix A. Acknowledgments . . . . . . . . . . . . . . . . . . . 5
+ Appendix B. Change History . . . . . . . . . . . . . . . . . . . . 5
+ Author's Address . . . . . . . . . . . . . . . . . . . . . . . . . 6
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo [Page 1]
+
+ CalDAV Proxy May 2007
+
+
+1. Introduction
+
+ In CalDAV [RFC4791] calendar data is stored in calendar collection
+ resources. Clients need to "poll" calendar collections in order to
+ find out what has changed since the last time they examined it.
+ Currently that involves having to do a PROPFIND Depth:1 HTTP request,
+ or a CALDAV:calendar-query REPORT request. When a calendar
+ collection contains a large number of calendar resources those
+ operations become expensive on the server.
+
+ Calendar users often configure their clients to poll at short time
+ intervals. So polling traffic to the server will be high, even
+ though the frequency at which changes actually occur to a calendar is
+ typically low.
+
+ To improve on performance, this specification defines a new "calendar
+ collection entity tag" (CTag) WebDAV property that is defined on
+ calendar collections. When the calendar collection changes, the CTag
+ value changes. Thus a client can cache the CTag at some point in
+ time, then poll the collection only (i.e. PROPFIND Depth:0 HTTP
+ requests) and determine if a change has happened based on the
+ returned CTag value. If there is a change, it can then fall back to
+ doing the full (Depth:1) poll of the collection to actually determine
+ which resources in the collection changed.
+
+ This extension also defines CTag's on CalDAV scheduling
+ [I-D.desruisseaux-caldav-sched] Inbox and Outbox collections.
+
+
+2. Conventions Used in This Document
+
+ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
+ "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
+ document are to be interpreted as described in [RFC2119].
+
+ When XML element types in the namespaces "DAV:" and
+ "urn:ietf:params:xml:ns:caldav" are referenced in this document
+ outside of the context of an XML fragment, the string "DAV:" and
+ "CALDAV:" will be prefixed to the element type names respectively.
+
+ The namespace "http://calendarserver.org/ns/" is used for XML
+ elements defined in this specification. When XML element types in
+ this namespace are referenced in this document outside of the context
+ of an XML fragment, the string "CS:" will be prefixed to the element
+ type names respectively.
+
+
+
+
+
+
+Daboo [Page 2]
+
+ CalDAV Proxy May 2007
+
+
+3. Overview
+
+3.1. Server
+
+ For each calendar or scheduling Inbox or Outbox collection on the
+ server, a new CS:getctag WebDAV property is present.
+
+ The property value is an "opaque" token whose value is guaranteed to
+ be unique over the lifetime of any calendar or scheduling Inbox or
+ Outbox collection at a specific URI.
+
+ Whenever a calendar resource is added to, modified or deleted from
+ the calendar collection, the value of the CS:getctag property MUST
+ change. Typically this change will occur when the DAV:getetag
+ property on a child resource changes due to some protocol action. It
+ could be the result of a change to the body or properties of the
+ resource.
+
+3.2. Client
+
+ The client starts off with an empty string as the initial value for
+ the cached CTag of a calendar or scheduling Inbox or Outbox
+ collection that it intends to synchronize with.
+
+ When polling a calendar or scheduling Inbox or Outbox collection, the
+ client issues a PROPFIND Depth:0 HTTP request, asking for the CS:
+ getctag property to be returned.
+
+ If the returned value of CS:getctag property matches the one
+ currently cached for the calendar or scheduling Inbox or Outbox
+ collection, then the collection contents have not changed and no
+ further action is required until the next poll.
+
+ If the returned value of CS:getctag property does not match the one
+ found previously, then the contents of the calendar or scheduling
+ Inbox or Outbox collection have changed. At that point the client
+ should re-issue the PROPFIND Depth:1 request to get the collection
+ changes in detail and the CS:getctag property value corresponding to
+ the new state. The new CSgetctag property value should replace the
+ one currently cached for that calendar or scheduling Inbox or Outbox
+ collection.
+
+
+4. New features in CalDAV
+
+
+
+
+
+
+
+Daboo [Page 3]
+
+ CalDAV Proxy May 2007
+
+
+4.1. getctag WebDAV Property
+
+ Name: getctag
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: Specifies a "synchronization" token used to indicate when
+ the contents of a calendar or scheduling Inbox or Outbox
+ collection have changed.
+
+ Conformance: This property MUST be defined on a calendar or
+ scheduling Inbox or Outbox collection resource. It MUST be
+ protected and SHOULD be returned by a PROPFIND DAV:allprop request
+ (as defined in Section 12.14.1 of [RFC2518]).
+
+ Description: The CS:getctag property allows clients to quickly
+ determine if the contents of a calendar or scheduling Inbox or
+ Outbox collection have changed since the last time a
+ "synchronization" operation was done. The CS:getctag property
+ value MUST change each time the contents of the calendar or
+ scheduling Inbox or Outbox collection change, and each change MUST
+ result in a value that is different from any other used with that
+ collection URI.
+
+ Definition:
+
+ <!ELEMENT getctag #PCDATA>
+
+ Example:
+
+ <T:getctag xmlns:T="http://calendarserver.org/ns/"
+ >ABCD-GUID-IN-THIS-COLLECTION-20070228T122324010340</T:getctag>
+
+
+5. Security Considerations
+
+ The CS:getctag property value changes whenever any resource in the
+ collection or scheduling Inbox or Outbox changes. Thus a change to a
+ resource that a user does not have read access to will result in a
+ change in the CTag and the user will know that a change occurred.
+ However, that user will not able to get additional details about
+ exactly what changed as WebDAV ACLs [RFC3744] will prevent that. So
+ this does expose the fact that there are potentially "hidden"
+ resources in a calendar collection, but it does not expose any
+ details about them.
+
+
+
+
+
+
+Daboo [Page 4]
+
+ CalDAV Proxy May 2007
+
+
+6. IANA Considerations
+
+ This document does not require any actions on the part of IANA.
+
+
+7. Normative References
+
+ [I-D.desruisseaux-caldav-sched]
+ Desruisseaux, B., "Scheduling Extensions to CalDAV",
+ draft-desruisseaux-caldav-sched-03 (work in progress),
+ January 2007.
+
+ [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
+ Requirement Levels", BCP 14, RFC 2119, March 1997.
+
+ [RFC2518] Goland, Y., Whitehead, E., Faizi, A., Carter, S., and D.
+ Jensen, "HTTP Extensions for Distributed Authoring --
+ WEBDAV", RFC 2518, February 1999.
+
+ [RFC3744] Clemm, G., Reschke, J., Sedlar, E., and J. Whitehead, "Web
+ Distributed Authoring and Versioning (WebDAV) Access
+ Control Protocol", RFC 3744, May 2004.
+
+ [RFC4791] Daboo, C., Desruisseaux, B., and L. Dusseault,
+ "Calendaring Extensions to WebDAV (CalDAV)", RFC 4791,
+ March 2007.
+
+
+Appendix A. Acknowledgments
+
+ This specification is the result of discussions between the Apple
+ calendar server and client teams.
+
+
+Appendix B. Change History
+
+ Changes from -01:
+
+ 1. Updated to RFC4791 reference.
+
+ 2. Added text indicating that ctag applies to schedule Inbox and
+ Outbox as well.
+
+ Changes from -00:
+
+ 1. Relaxed requirement so that any type of change to a child
+ resource can trigger a CTag change (similar behavior to ETag).
+
+
+
+
+Daboo [Page 5]
+
+ CalDAV Proxy May 2007
+
+
+Author's Address
+
+ Cyrus Daboo
+ Apple Inc.
+ 1 Infinite Loop
+ Cupertino, CA 95014
+ USA
+
+ Email: cyrus@daboo.name
+ URI: http://www.apple.com/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo [Page 6]
+
diff --git a/vendor/sabre/dav/docs/caldav-notifications.txt b/vendor/sabre/dav/docs/caldav-notifications.txt
new file mode 100644
index 000000000..75c2e5e07
--- /dev/null
+++ b/vendor/sabre/dav/docs/caldav-notifications.txt
@@ -0,0 +1,1568 @@
+
+
+
+Calendar Server Extension C. Daboo
+ Apple Inc.
+ March 19, 2012
+
+
+ CalDAV: Calendar User Notifications
+
+Abstract
+
+ This specification defines an extension to CalDAV that allows the
+ server to provide notifications to calendar users.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo [Page 1]
+
+ CalDAV User Notifications March 2012
+
+
+Table of Contents
+
+ 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 3
+ 2. Open Issues . . . . . . . . . . . . . . . . . . . . . . . . . 3
+ 3. Conventions Used in This Document . . . . . . . . . . . . . . 3
+ 4. Notifications . . . . . . . . . . . . . . . . . . . . . . . . 3
+ 4.1. Additional Principal Properties . . . . . . . . . . . . . 4
+ 4.1.1. CS:notification-URL Property . . . . . . . . . . . . . 5
+ 4.2. Properties on Notification Resources . . . . . . . . . . . 5
+ 4.2.1. CS:notificationtype Property . . . . . . . . . . . . . 5
+ 4.3. XML Element Definitions . . . . . . . . . . . . . . . . . 6
+ 4.3.1. CS:notifications . . . . . . . . . . . . . . . . . . . 6
+ 4.3.2. CS:notification . . . . . . . . . . . . . . . . . . . 6
+ 4.3.3. CS:dtstamp . . . . . . . . . . . . . . . . . . . . . . 7
+ 5. Notification Definitions . . . . . . . . . . . . . . . . . . . 7
+ 5.1. System Status Notification . . . . . . . . . . . . . . . . 7
+ 5.1.1. CS:systemstatus Element Definition . . . . . . . . . . 8
+ 5.2. Quota Notification . . . . . . . . . . . . . . . . . . . . 8
+ 5.2.1. CS:quotastatus Element Definition . . . . . . . . . . 9
+ 5.3. Resource Changes Notification . . . . . . . . . . . . . . 10
+ 5.3.1. CS:resource-change Element Definition . . . . . . . . 11
+ 5.3.2. CS:calendar-changes Element Definition . . . . . . . . 15
+ 5.3.2.1. Handling Recurrences in CS:calendar-changes . . . 17
+ 5.3.3. CS:deleted-details Element Definition . . . . . . . . 18
+ 5.3.4. CS:notify-changes Property . . . . . . . . . . . . . . 20
+ 6. Security Considerations . . . . . . . . . . . . . . . . . . . 20
+ 7. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 21
+ 8. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 21
+ 9. References . . . . . . . . . . . . . . . . . . . . . . . . . . 21
+ 9.1. Normative References . . . . . . . . . . . . . . . . . . . 21
+ 9.2. Informative References . . . . . . . . . . . . . . . . . . 21
+ Appendix A. Examples . . . . . . . . . . . . . . . . . . . . . . 21
+ A.1. Resource Created . . . . . . . . . . . . . . . . . . . . . 21
+ A.2. Resource Updated - Property Change . . . . . . . . . . . . 22
+ A.3. Resource Updated - Parameter Change . . . . . . . . . . . 23
+ A.4. Resource Updated - Multiple Instances Change . . . . . . . 23
+ A.5. Resource Updated - Multiple User Change . . . . . . . . . 24
+ A.6. Resource Deleted . . . . . . . . . . . . . . . . . . . . . 25
+ A.7. Collection Created . . . . . . . . . . . . . . . . . . . . 26
+ A.8. Collection Updated . . . . . . . . . . . . . . . . . . . . 26
+ A.9. Collection Deleted . . . . . . . . . . . . . . . . . . . . 27
+ Author's Address . . . . . . . . . . . . . . . . . . . . . . . . . 27
+
+
+
+
+
+
+
+
+
+Daboo [Page 2]
+
+ CalDAV User Notifications March 2012
+
+
+1. Introduction
+
+ CalDAV [RFC4791] provides a way for calendar users to store calendar
+ data and exchange this data via scheduling operations. Based on the
+ WebDAV [RFC4918] protocol, it also includes the ability to manage
+ access to calendar data via the WebDAV ACL [RFC3744] extension.
+
+ It is often useful for servers to communicate arbitrary information
+ to calendar users, e.g., system status, message of the day, quota
+ warnings, changes to shared resources made by others etc. This
+ specification defines a generic "notification" mechanism that allows
+ a server to do that. Whilst primarily aimed at CalDAV [RFC4791],
+ this mechanism has been designed to be adaptable to WebDAV [RFC4918].
+
+
+2. Open Issues
+
+ 1. Define specific child elements for system status notification,
+ e.g. "server-maintenance-period", "server-read-only-period",
+ "client-upgrade-required".
+
+
+3. Conventions Used in This Document
+
+ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
+ "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
+ document are to be interpreted as described in [RFC2119].
+
+ When XML element types in the namespaces "DAV:" and
+ "urn:ietf:params:xml:ns:caldav" are referenced in this document
+ outside of the context of an XML fragment, the string "DAV:" and
+ "CALDAV:" will be prefixed to the element type names respectively.
+
+ The namespace "http://calendarserver.org/ns/" is used for XML
+ elements defined in this specification. When XML element types in
+ that namespace are referenced in this document outside of the context
+ of an XML fragment, the string "CS:" will be prefixed to the element
+ type names.
+
+
+4. Notifications
+
+ When this feature is available, a CS:notification-URL (Section 4.1.1)
+ property appears on principal resources for those principals who are
+ able to receive notifications. That property specifies a single DAV:
+ href element whose content refers to a WebDAV collection resource.
+ Notification "messages" are deposited into this collection and can be
+ retrieved by clients and acted on accordingly.
+
+
+
+Daboo [Page 3]
+
+ CalDAV User Notifications March 2012
+
+
+ The notification collection referenced by the CS:notification-URL
+ (Section 4.1.1) property MUST have a DAV:resourcetype property with
+ DAV:collection and CS:notifications (Section 4.3.1) child elements.
+
+ Notification "messages" are XML documents stored as resources in the
+ notification collection. Each XML document contains a CS:
+ notification (Section 4.3.2) element as its root. The root element
+ contains a CS:dtstamp element, and one additional element which
+ represents the type of notification being conveyed in the message.
+ That child element will typically contain additional content that
+ describes the notification.
+
+ Each notification resource has a CS:notificationtype (Section 4.2.1)
+ property which contains as its single child element an empty element
+ that matches the child element of the notification resource XML
+ document root. Any attributes on the child element in the XML
+ document are also present in the property child element.
+
+ Notifications are automatically generated by the server (perhaps in
+ response to a action) with an appropriate resource stored in the
+ notifications collection of the user to whom the notification is
+ targeted. Clients SHOULD monitor the notification collection looking
+ for new notification resources. When doing so, clients SHOULD look
+ at the CS:notificationtype (Section 4.2.1) property to ensure that
+ the notification is of a type that the client can handle. Once a
+ client has handled the notification in whatever way is appropriate it
+ SHOULD delete the notification resource. Clients SHOULD remove
+ notifications being displayed to a user when the notification
+ resource is removed from the notification collection, to enable the
+ user to dismiss a notification on one device and have it
+ automatically removed from others. Clients MUST ignore all
+ notifications for types they do not recognize. Servers MAY delete
+ notification resources on their own if they determine that the
+ notifications are no longer relevant or valid. Servers MAY coalesce
+ notifications as appropriate.
+
+ Servers MUST prevent clients from adding resources in the
+ notification collection.
+
+4.1. Additional Principal Properties
+
+ This section defines new properties for WebDAV principal resources as
+ defined in RFC3744 [RFC3744]. These properties are likely to be
+ protected but the server MAY allow them to be written by appropriate
+ users.
+
+
+
+
+
+
+Daboo [Page 4]
+
+ CalDAV User Notifications March 2012
+
+
+4.1.1. CS:notification-URL Property
+
+ Name: notification-URL
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: Identify the URL of the notification collection owned by
+ the associated principal resource.
+
+ Protected: This property SHOULD be protected.
+
+ PROPFIND behavior: This property SHOULD NOT be returned by a
+ PROPFIND allprop request (as defined in Section 14.2 of
+ [RFC4918]).
+
+ COPY/MOVE behavior: This property value SHOULD be preserved in COPY
+ and MOVE operations.
+
+ Description: This property is needed for a client to determine where
+ the notification collection of the current user is located so that
+ processing of notification messages can occur. If not present,
+ then the associated calendar user is not enabled for notification
+ messages on the server.
+
+ Definition:
+
+ <!ELEMENT notification-URL (DAV:href)>
+
+4.2. Properties on Notification Resources
+
+ The following new WebDAV properties are defined for notification
+ resources.
+
+4.2.1. CS:notificationtype Property
+
+ Name: notificationtype
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: Identify the type of notification of the corresponding
+ resource.
+
+ Protected: This property MUST be protected.
+
+ PROPFIND behavior: This property SHOULD NOT be returned by a
+ PROPFIND allprop request (as defined in Section 14.2 of
+ [RFC4918]).
+
+
+
+
+Daboo [Page 5]
+
+ CalDAV User Notifications March 2012
+
+
+ COPY/MOVE behavior: This property value MUST be preserved in COPY
+ and MOVE operations.
+
+ Description: This property allows a client, via a PROPFIND Depth:1
+ request, to quickly find notification messages that the client can
+ handle in a notification collection. The single child element is
+ the notification resource root element's child defining the
+ notification itself. This element MUST be empty, though any
+ attributes on the element in the notification resource MUST be
+ present in the property element.
+
+ Definition:
+
+ <!ELEMENT notificationtype ANY>
+ <!-- Child elements are empty but will have appropriate attributes.
+ Any valid notification message child element can appear.-->
+
+4.3. XML Element Definitions
+
+4.3.1. CS:notifications
+
+ Name: notifications
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: Indicates a notification collection.
+
+ Description: This XML element is used in a DAV:resourcetype element
+ to indicate that the corresponding resource is a notification
+ collection.
+
+ Definition:
+
+ <!ELEMENT notifications EMPTY>
+
+4.3.2. CS:notification
+
+ Name: notification
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: Notification message root element.
+
+ Description: The root element used in notification resources.
+
+
+
+
+
+
+
+Daboo [Page 6]
+
+ CalDAV User Notifications March 2012
+
+
+ Definition:
+
+ <!ELEMENT notification (dtstamp, XXX) >
+ <!-- Any notification type element can appear after
+ CS:dtstamp -->
+
+4.3.3. CS:dtstamp
+
+ Name: dtstamp
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: Date-time stamp.
+
+ Description: Contains the date-time stamp corresponding to the
+ creation of a notification message, using the format defined in
+ [RFC3339], or the "compact" format without "-" and ":" characters
+ between date and time elements, respectively.
+
+ Definition:
+
+ <!ELEMENT dtstamp (#PCDATA)>
+ <!-- Value is a date-time in UTZ as per [RFC3339] with
+ "compact" format allowed.-->
+
+
+5. Notification Definitions
+
+ This section defines a set of common notification types.
+
+5.1. System Status Notification
+
+ The system status notification is used to convey a URI and/or textual
+ description to the user. The assumption is that the URI points to a
+ webpage where current system status is described in detail, with the
+ provided description being a summary of that. A "type" attribute on
+ the element is used to indicate the importance of the current status
+ notification, and has the values "low", "medium" and "high",
+ representing the increasing level of importance of the message
+ respectively.
+
+ Servers might have knowledge of specific calendar user language
+ preferences, in which case it MAY localise the CS:description value
+ as appropriate based on the calendar user accessing the notification,
+ but if it does, it SHOULD include an xml:lang attribute on the CS:
+ description element to indicate what language is being used.
+
+
+
+
+
+Daboo [Page 7]
+
+ CalDAV User Notifications March 2012
+
+
+5.1.1. CS:systemstatus Element Definition
+
+ Name: systemstatus
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: Indicates a system status notification.
+
+ Description: This XML element is used in a CS:notification element
+ to describe a system status notification.
+
+ Definition:
+
+ <!ELEMENT systemstatus (DAV:href?, CS:description?)>
+ <!ATTLIST systemstatus type (low | medium | high) "low">
+
+ <!ELEMENT description CDATA>
+
+ <!-- One of DAV:href of CS:description MUST be present -->
+
+ Example: This is an example of the body of a notification resource
+ for an emergency system outage:
+
+ <?xml version="1.0" encoding="UTF-8"?>
+ <CS:notification xmlns:D="DAV:"
+ xmlns:CS="http://calendarserver.org/ns/">
+ <CS:dtstamp>2011-12-09T11:12:53-05:00</CS:dtstamp>
+ <CS:systemstatus type="high">
+ <D:href>http://example.com/emergency_shutdown.html</D:href>
+ <CS:description xml:lang='en_US'
+ >Emergency shutdown now</CS:description>
+ </CS:systemstatus>
+ </CS:notification>
+
+ Example: This is an example of the WebDAV property on the example
+ notification resource above:
+
+ <?xml version="1.0" encoding="UTF-8"?>
+ <CS:notificationtype xmlns:D="DAV:"
+ xmlns:CS="http://calendarserver.org/ns/">
+ <CS:systemstatus type="high" />
+ </CS:notificationtype>
+
+5.2. Quota Notification
+
+ The quota notification is used to convey information about the status
+ of one or more quotas for the user. The notification contains
+ elements for different types of quota being reported to the user. In
+
+
+
+Daboo [Page 8]
+
+ CalDAV User Notifications March 2012
+
+
+ some cases these may be warnings (e.g., a user getting to 80% of
+ their quota limit), or in other cases errors (e.g., a user exceeding
+ their quota).
+
+5.2.1. CS:quotastatus Element Definition
+
+ Name: quotastatus
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: Indicates a quota status notification.
+
+ Description: This XML element is used in a CS:notification element
+ to describe a quota status notification. The CS:quota-percent-
+ used element contains an integer greater than or equal to zero.
+ If the value is greater than or equal to 100, then the user's
+ quota has been reached or exceeded. The DAV:href element contains
+ a URI for a webpage where the user can go to get further
+ information about their quota status or take corrective action.
+
+ Definition:
+
+ <!ELEMENT quota-status (quota+)>
+
+ <!ELEMENT quota (quota-type, quota-percent-used?,
+ quota-count?, DAV:href?)>
+ <!ATTLIST quota type (warning | exceeded) "exceeded">
+
+ <!ELEMENT quota-type ANY>
+ <!-- Child elements are application specific -->
+
+ <!ELEMENT quota-percent-used CDATA>
+ <!-- Integer value greater than or equal to zero -->
+
+ <!ELEMENT quota-count CDATA>
+ <!-- Integer value greater than or equal to zero -->
+
+ Example: This is an example of the body of a notification resource
+ for a quota warning:
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo [Page 9]
+
+ CalDAV User Notifications March 2012
+
+
+ <?xml version="1.0" encoding="UTF-8"?>
+ <CS:notification xmlns:D="DAV:"
+ xmlns:CS="http://calendarserver.org/ns/">
+ <CS:dtstamp>2011-12-09T11:12:53-05:00</CS:dtstamp>
+ <CS:quota-status>
+ <CS:quota type="warning">
+ <CS:quota-type><CS:attachments /></CS:quota-type>
+ <CS:quota-percent-used>80</CS:quota-percent-used>
+ <D:href>https://example.com/your-account.html</D:href>
+ </CS:quota>
+ </CS:quota-status>
+ </CS:notification>
+
+ Example: This is an example of the body of a notification resource
+ for a quota that has been exceeded, and a count-based limit that
+ is shown as a warning:
+
+ <?xml version="1.0" encoding="UTF-8"?>
+ <CS:notification xmlns:D="DAV:"
+ xmlns:CS="http://calendarserver.org/ns/">
+ <CS:dtstamp>2011-12-09T11:12:53-05:00</CS:dtstamp>
+ <CS:quota-status>
+ <CS:quota type="exceeded">
+ <CS:quota-type><CS:attachments /></CS:quota-type>
+ <CS:quota-percent-used>102</CS:quota-percent-used>
+ <D:href>https://example.com/fix-account.html</D:href>
+ </CS:quota>
+ <CS:quota type="warning">
+ <CS:quota-type><CS:events /></CS:quota-type>
+ <CS:quota-percent-used>82</CS:quota-percent-used>
+ <CS:quota-count>4980</CS:quota-count>
+ <D:href>https://example.com/buy-more-space.html</D:href>
+ </CS:quota>
+ </CS:quota-status>
+ </CS:notification>
+
+5.3. Resource Changes Notification
+
+ The resource change notification is used to inform the user of new,
+ updated or deleted resources caused by changes made by someone else
+ (note: servers MUST NOT generate notifications to users for changes
+ they themselves make, though the possibility of an automated process
+ acting on behalf of a user needs to be considered). This
+ notification can be used by clients to show changes that a user can
+ acknowledge in their own time. When the notification is present, it
+ can be displayed on all devices a user is accessing their data from.
+ When the user acknowledges and dismisses the notification on one
+ device, other devices SHOULD also remove the notification when they
+
+
+
+Daboo [Page 10]
+
+ CalDAV User Notifications March 2012
+
+
+ next synchronize the notification collection.
+
+ A new WebDAV property CS:notify-changes (Section 5.3.4) is defined
+ for calendar collections. This allows users to enable or disable the
+ sending of resource change notifications for the calendar and its
+ child resources. Servers MUST allow users to set this property on a
+ per-user basis on any calendars accessible to them. Servers MUST
+ honor the chosen setting to enable or disable change notifications.
+
+ Servers can send notifications for calendar object resources, and
+ ones for calendar collections. Servers SHOULD coalesce notifications
+ that refer to the same resource into a single notification resource,
+ containing multiple CS:created, CS:updated or CS:deleted elements all
+ with the same DAV:href child element value. Servers MAY coalesce
+ changes to multiple resources into a change notification for the
+ parent collection of those resources and use a CS:collection-changes
+ element to indicate the number of individual resources that changed.
+
+5.3.1. CS:resource-change Element Definition
+
+ Name: resource-change
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: Indicates that resources have been created, updated or
+ deleted.
+
+ Description: This XML element is used in a CS:notification element
+ to describe a resource change notification. It can describe a
+ change directly to a calendar object resource or to a calendar
+ collection.
+
+ When used for a calendar object resource change, it can contain
+ one of the CS:created, or CS:deleted elements, or multiple CS:
+ updated elements, which indicate a created, deleted or updated
+ resource, respectively. The DAV:href element within those
+ elements, contains the URI of the changed resource, optional
+ information about who changed the resource and when that change
+ was made (the CS:changed-by element), and information specific to
+ the nature of the change. Servers SHOULD coalesce resource change
+ notifications for the same resource into a single notification
+ resource where possible. The CS:updated element optionally
+ contains CS:content and/or DAV:prop elements to indicate a change
+ to the body of the resource or resource WebDAV properties,
+ respectively. The DAV:prop element MAY contain a list of property
+ elements to indicate which properties changed. The CS:updated
+ element can also contain zero or more CS:calendar-changes elements
+ to list details of the changes. If no CS:calendar-changes element
+
+
+
+Daboo [Page 11]
+
+ CalDAV User Notifications March 2012
+
+
+ is present, the specific details are not provided, and clients
+ will need to assume that some set of changes occurred, but the
+ server is unwilling to disclose the full details. The CS:deleted
+ element can also contain zero or more CS:deleted-details elements
+ to list details of the deleted resource.
+
+ When used for a calendar collection change, it can contain a CS:
+ collection-changes element. The DAV:href element within that
+ element, contains the URI of the changed calendar collection. The
+ DAV:prop element indicates a change to WebDAV properties on the
+ calendar collection resource. The CS:child-created, CS:child-
+ updated, and CS:child-deleted elements each contain a positive
+ integer value indicating how many child resources were added,
+ updated or deleted in the collection, respectively.
+
+ Definition:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo [Page 12]
+
+ CalDAV User Notifications March 2012
+
+
+ <!ELEMENT resource-change (created | updated+ | deleted |
+ collection-changes)>
+ <!ELEMENT created (DAV:href, changed-by?, ANY)>
+ <!ELEMENT updated (DAV:href, changed-by?, content?,
+ DAV:prop?, calendar-changes*)>
+ <!ELEMENT content EMPTY>
+ <!ELEMENT deleted (DAV:href, changed-by?, deleted-details)>
+
+ <!ELEMENT changed-by (common-name | (first-name, last-name),
+ dtstamp?, DAV:href)>
+ <!ELEMENT common-name CDATA>
+ <!ELEMENT first-name CDATA>
+ <!ELEMENT last-name CDATA>
+ <!-- CS:changed-by indicates who made the change that caused the
+ notification. CS:first-name and CS:last-name are the first
+ and last names of the corresponding user. or the
+ CS:common-name is the overall display name. CS:dtstamp is the
+ time in UTC when the change was made. The DAV:href element
+ is the principal URI or email address of the user who made
+ the change. -->
+
+ <!ELEMENT collection-changes (DAV:href, changed-by*, DAV:prop?,
+ child-created?, child-updated?,
+ child-deleted?>
+ <!-- When coalescing changes from multiple users, the changed-by
+ element can appear more than once. -->
+
+ <!ELEMENT child-created CDATA>
+ <!ELEMENT child-updated CDATA>
+ <!ELEMENT child-deleted CDATA>
+ <!-- Each of the three elements above MUST contain a positive,
+ non-zero integer value indicate the total number of changes
+ being reported for the collection. -->
+
+ Example: This is an example of the body of a notification resource
+ for changes where one resource has been created:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo [Page 13]
+
+ CalDAV User Notifications March 2012
+
+
+ <?xml version="1.0" encoding="UTF-8"?>
+ <CS:notification xmlns:D="DAV:"
+ xmlns:CS="http://calendarserver.org/ns/">
+ <CS:dtstamp>2011-12-09T11:51:14-05:00</CS:dtstamp>
+ <CS:resource-change>
+ <CS:created>
+ <D:href>http://example.com/cyrus/calendar/new.ics</D:href>
+ <CS:changed-by>
+ <CS:common-name>Cyrus Daboo</CS:common-name>
+ <D:href>/principals/cyrusdaboo</D:href>
+ </CS:changed-by>
+ </CS:created>
+ </CS:resource-change>
+ </CS:notification>
+
+ Example: This is an example of the body of a notification resource
+ for changes where a resource has been updated twice. One of the
+ updated resources elements contains additional information
+ indicating which recurrence instances in the iCalendar data were
+ changed:
+
+ <?xml version="1.0" encoding="UTF-8"?>
+ <CS:notification xmlns:D="DAV:"
+ xmlns:CS="http://calendarserver.org/ns/">
+ <CS:dtstamp>2011-12-09T11:51:14-05:00</CS:dtstamp>
+ <CS:resource-change>
+ <CS:updated>
+ <D:href>http://example.com/cyrus/calendar/event.ics</D:href>
+ <CS:changed-by>
+ <CS:first-name>Oliver</CS:first-name>
+ <CS:last-name>Daboo</CS:last-name>
+ <D:href>mailto:oliver@example.com</D:href>
+ </CS:changed-by>
+ </CS:updated>
+ <CS:updated>
+ <D:href>http://example.com/cyrus/calendar/event.ics</D:href>
+ <CS:changed-by>
+ <CS:first-name>Eleanor</CS:first-name>
+ <CS:last-name>Daboo</CS:last-name>
+ <D:href>mailto:eleanor@example.com</D:href>
+ </CS:changed-by>
+ </CS:updated>
+ </CS:resource-change>
+ </CS:notification>
+
+
+
+
+
+
+
+Daboo [Page 14]
+
+ CalDAV User Notifications March 2012
+
+
+ Example: This is an example of the body of a notification resource
+ for changes where one resource has been deleted:
+
+ <?xml version="1.0" encoding="UTF-8"?>
+ <CS:notification xmlns:D="DAV:"
+ xmlns:CS="http://calendarserver.org/ns/">
+ <CS:dtstamp>2011-12-09T11:51:14-05:00</CS:dtstamp>
+ <CS:resource-change>
+ <CS:deleted>
+ <D:href>http://example.com/cyrus/calendar/old.ics</D:href>
+ <CS:changed-by>
+ <CS:first-name>Cyrus</CS:first-name>
+ <CS:last-name>Daboo</CS:last-name>
+ <D:href>/principals/cyrusdaboo</D:href>
+ </CS:changed-by>
+ </CS:deleted>
+ </CS:resource-change>
+ </CS:notification>
+
+ Example: This example is the same as the previous three, except that
+ all the individual resource changes have been coalesced into a
+ single notification about changes to the parent calendar
+ collection:
+
+ <?xml version="1.0" encoding="UTF-8"?>
+ <CS:notification xmlns:D="DAV:"
+ xmlns:CS="http://calendarserver.org/ns/">
+ <CS:dtstamp>2011-12-09T11:51:14-05:00</CS:dtstamp>
+ <CS:resource-change>
+ <CS:collection-changes>
+ <D:href>http://example.com/cyrus/calendar/</D:href>
+ <CS:child-created>1</CS:child-created>
+ <CS:child-updated>2</CS:child-updated>
+ <CS:child-deleted>1</CS:child-deleted>
+ </CS:collection-changes>
+ </CS:resource-change>
+ </CS:notification>
+
+5.3.2. CS:calendar-changes Element Definition
+
+ Name: calendar-changes
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: Indicates which portions of an calendar object resource
+ have changed, or provides details of deleted calendar object
+ resources.
+
+
+
+
+Daboo [Page 15]
+
+ CalDAV User Notifications March 2012
+
+
+ Description: This XML element is used in a CS:updated element to
+ describe how a calendar object resource changed, or in a CS:
+ deleted element to provide details of a deleted resource. It can
+ identify the master instance, or individual recurrence instances,
+ and for each indicate which iCalendar properties and parameters
+ changed during the update for which the notification was
+ generated. For details of handling recurrences please see
+ Section 5.3.2.1.
+
+ Definition:
+
+ <!ELEMENT calendar-changes (recurrence+) >
+
+ <!ELEMENT recurrence
+ ((master | recurrenceid), added?, removed?, changes?)>
+ <!-- Which instances were affected by the change,
+ and details on the per-instance changes -->
+
+ <!ELEMENT master EMPTY>
+ <!-- The "master" instance was affected -->
+
+ <!ELEMENT recurrenceid CDATA>
+ <!-- RECURRENCE-ID value in iCalendar form (in UTC if a
+ non-floating DATE-TIME value) for the affected instance -->
+
+ <!ELEMENT added EMPTY>
+ <!-- The component was added -->
+
+ <!ELEMENT removed EMPTY>
+ <!-- The component was removed -->
+
+ <!ELEMENT changes changed-property*>
+ <!-- Detailed changes in the iCalendar data -->
+
+ <!ELEMENT changed-property changed-parameter*>
+ <!ATTLIST changed-property name PCDATA>
+ <!-- An iCalendar property changed -->
+
+ <!ELEMENT changed-parameter EMPTY>
+ <!ATTLIST changed-parameter name PCDATA>
+ <!-- An iCalendar property parameter changed -->
+
+ Example: This example indicates that a non-recurring component, or
+ the master component in a recurring component, was changed and
+ that the change was to the "SUMMARY" iCalendar property.
+
+
+
+
+
+
+Daboo [Page 16]
+
+ CalDAV User Notifications March 2012
+
+
+ <CS:calendar-changes xmlns:CS="http://calendarserver.org/ns/">
+ <CS:recurrence>
+ <CS:master/>
+ <CS:changes>
+ <CS:changed-property name="SUMMARY"/>
+ </CS:changes>
+ </CS:recurrence>
+ </CS:calendar-changes>
+
+ Example: This example indicates that an instance of a recurring
+ component was changed and that the change was to the "DTSTART"
+ iCalendar property.
+
+ <CS:calendar-changes xmlns:CS="http://calendarserver.org/ns/">
+ <CS:recurrence>
+ <CS:recurrenceid>20111215T160000Z</CS:recurrenceid>
+ <CS:changes>
+ <CS:changed-property name="DTSTART"/>
+ </CS:changes>
+ </CS:recurrence>
+ </CS:calendar-changes>
+
+5.3.2.1. Handling Recurrences in CS:calendar-changes
+
+ Changes to recurring components can be complex. This section
+ describes the possible set of changes that could occur, and what the
+ CS:calendar-changes element will contain as a result.
+
+ Master exists, unchanged override added In this case, a CS:
+ recurrence element will be present, containing a CS:recurrence-id
+ element with a value equal to the RECURRENCE-ID property value (in
+ UTC) of the added component. A CS:added element will be present.
+ There will not be any CS:removed or CS:changes elements.
+
+ Master exists, changed override added In this case, a CS:recurrence
+ element will be present, containing a CS:recurrence-id element
+ with a value equal to the RECURRENCE-ID property value (in UTC) of
+ the added component. Both CS:added and CS:changes elements will
+ be present. There will not be a CS:removed element.
+
+ Master exists, override changed In this case, a CS:recurrence
+ element will be present, containing a CS:recurrence-id element
+ with a value equal to the RECURRENCE-ID property value (in UTC) of
+ the added component. A CS:changes element will be present. There
+ will not be any CS:added or CS:removed elements.
+
+
+
+
+
+
+Daboo [Page 17]
+
+ CalDAV User Notifications March 2012
+
+
+ Master exists, override removed In this case, a CS:recurrence
+ element will be present, containing a CS:recurrence-id element
+ with a value equal to the RECURRENCE-ID property value (in UTC) of
+ the added component. A CS:removed element will be present. There
+ will not be a CS:added element. A CS:changes element will only be
+ present if the removed component differs from the "derived" master
+ instance.
+
+ Master exists, override cancelled In this case, a CS:recurrence
+ element will be present, containing a CS:recurrence-id element
+ with a value equal to the RECURRENCE-ID property value (in UTC) of
+ the added component. A CS:removed element will be present. There
+ will not be any CS:added or CS:changes element. There will also
+ be a CS:master element present, with an appropriate CS:changes
+ element, likely covering a change to "RRULE" or addition of
+ "EXDATE" properties.
+
+ Master does not exist, override added In this case, a CS:recurrence
+ element will be present, containing a CS:recurrence-id element
+ with a value equal to the RECURRENCE-ID property value (in UTC) of
+ the added component. A CS:added element will be present. There
+ will not be a CS:removed or CS:changes element.
+
+ Master does not exist, override changed In this case, a CS:
+ recurrence element will be present, containing a CS:recurrence-id
+ element with a value equal to the RECURRENCE-ID property value (in
+ UTC) of the added component. A CS:changes element will be
+ present. There will not be any CS:added or CS:removed elements.
+
+ Master does not exist, override removed In this case, a CS:
+ recurrence element will be present, containing a CS:recurrence-id
+ element with a value equal to the RECURRENCE-ID property value (in
+ UTC) of the added component. A CS:removed element will be
+ present. There will not be any CS:added or CS:changes element.
+
+5.3.3. CS:deleted-details Element Definition
+
+ Name: deleted-details
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: Provides summary information about a deleted resource or
+ collection.
+
+ Description: This XML element is used in a CS:deleted element to
+ describe useful information about a deleted resource or
+ collection, so clients can provide a meaningful notification
+ message to users. This element has two variants: one for deletion
+
+
+
+Daboo [Page 18]
+
+ CalDAV User Notifications March 2012
+
+
+ of a calendar object resource, the other for deletion of a
+ calendar collection.
+
+ Definition:
+
+ <!ELEMENT deleted-details ((deleted-component,
+ deleted-summary,
+ deleted-next-instance?,
+ deleted-had-more-instances?) |
+ deleted-displayname)>
+ <!-- deleted-displayname is used for a collection delete, the other
+ elements used for a resource delete. -->
+
+ <!ELEMENT deleted-component CDATA>
+ <!-- The main calendar component type of the deleted
+ resource, e.g., "VEVENT", "VTODO" -->
+
+ <!ELEMENT deleted-summary CDATA>
+ <!-- Indicates the "SUMMARY" of the next future instance at the
+ time of deletion, or the previous instance if no future
+ instances existed at the time of deletion. -->
+
+ <!ELEMENT deleted-next-instance CDATA>
+ <!ATTLIST deleted-next-instance tzid PCDATA>
+ <!-- If present, indicates when the next deleted instance would
+ have occurred. For a VEVENT that would be the DTSTART value,
+ for a VTODO that would be either DTSTART or DUE, if present.
+ In each case the value must match the value in the iCalendar
+ data, and any TZID iCalendar property parameter value must
+ be included in the tzid XML element attribute value. -->
+
+ <!ELEMENT deleted-had-more-instances EMPTY>
+ <!-- If present indicates that there was more than one future
+ instances still to occur at the time of deletion. -->
+
+ <!ELEMENT deleted-displayname CDATA>
+ <!-- The DAV:getdisplayname property for the collection that
+ was deleted. -->
+
+ Example: This example indicates deletion of a non-recurring event
+ that was yet to occur at the time of deletion.
+
+ <CS:deleted-details xmlns:CS="http://calendarserver.org/ns/">
+ <CS:deleted-component>VEVENT</CS:deleted-component>
+ <CS:deleted-summary>Birthday Party</CS:deleted-summary>
+ <CS:deleted-next-instance tzid="America/New_York
+ >20120505T120000</CS:deleted-next-instance>
+ </CS:deleted-details>
+
+
+
+Daboo [Page 19]
+
+ CalDAV User Notifications March 2012
+
+
+ Example: This example indicates deletion of a calendar.
+
+ <CS:deleted-details xmlns:CS="http://calendarserver.org/ns/">
+ <CS:deleted-displayname>Holidays</CS:deleted-displayname>
+ </CS:deleted-details>
+
+5.3.4. CS:notify-changes Property
+
+ Name: notify-changes
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: Allows a user to specify whether resource change
+ notifications are generated by the server.
+
+ Protected: This property MUST NOT be protected.
+
+ PROPFIND behavior: This property SHOULD NOT be returned by a
+ PROPFIND allprop request (as defined in Section 14.2 of
+ [RFC4918]).
+
+ COPY/MOVE behavior: This property value MUST be preserved in COPY
+ and MOVE operations.
+
+ Description: This property allows a user to enable or disable the
+ server generation of resource change notifications for the
+ calendar collection, and all its child resources, on which the
+ property resides. If the property is not present on a calendar
+ collection, the client and server MUST assume that resource change
+ notifications are enabled.
+
+ Definition:
+
+ <!ELEMENT notify-changes (true|false)>
+ <!ELEMENT true EMPTY>
+ <!ELEMENT false EMPTY>
+
+ <!-- true - notifications enabled,
+ false - notifications disabled -->
+
+
+6. Security Considerations
+
+ Some notification mechanisms might allow a user to trigger a
+ notification to be delivered to other users (e.g., an invitation to
+ share a calendar). In such cases servers MUST ensure that suitable
+ limits are placed on the number and frequency of such user generated
+ notifications.
+
+
+
+Daboo [Page 20]
+
+ CalDAV User Notifications March 2012
+
+
+ TBD: More?
+
+
+7. IANA Considerations
+
+ This document does not require any actions on the part of IANA.
+
+
+8. Acknowledgments
+
+ This specification is the result of discussions between the various
+ Apple calendar server and client teams.
+
+
+9. References
+
+9.1. Normative References
+
+ [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
+ Requirement Levels", BCP 14, RFC 2119, March 1997.
+
+ [RFC3339] Klyne, G., Ed. and C. Newman, "Date and Time on the
+ Internet: Timestamps", RFC 3339, July 2002.
+
+ [RFC4918] Dusseault, L., "HTTP Extensions for Web Distributed
+ Authoring and Versioning (WebDAV)", RFC 4918, June 2007.
+
+9.2. Informative References
+
+ [RFC3744] Clemm, G., Reschke, J., Sedlar, E., and J. Whitehead, "Web
+ Distributed Authoring and Versioning (WebDAV)
+ Access Control Protocol", RFC 3744, May 2004.
+
+ [RFC4791] Daboo, C., Desruisseaux, B., and L. Dusseault,
+ "Calendaring Extensions to WebDAV (CalDAV)", RFC 4791,
+ March 2007.
+
+
+Appendix A. Examples
+
+ This section provides more detailed examples of resource change
+ notifications for illustrative purposes only.
+
+A.1. Resource Created
+
+ This is an example of the body of a notification resource where one
+ resource has been created.
+
+
+
+
+Daboo [Page 21]
+
+ CalDAV User Notifications March 2012
+
+
+ <?xml version="1.0" encoding="UTF-8"?>
+ <CS:notification xmlns:D="DAV:"
+ xmlns:CS="http://calendarserver.org/ns/">
+ <CS:dtstamp>2011-12-09T11:51:14-05:00</CS:dtstamp>
+ <CS:resource-change>
+ <CS:created>
+ <D:href>http://example.com/cyrus/calendar/new.ics</D:href>
+ <CS:changed-by>
+ <CS:first-name>Cyrus</CS:first-name>
+ <CS:last-name>Daboo</CS:last-name>
+ <D:href>/principals/cyrusdaboo</D:href>
+ </CS:changed-by>
+ </CS:created>
+ </CS:resource-change>
+ </CS:notification>
+
+A.2. Resource Updated - Property Change
+
+ This is an example of the body of a notification resource where one
+ non-recurring event has had its "DTSTART" and "SUMMARY" iCalendar
+ property values changed.
+
+ <?xml version="1.0" encoding="UTF-8"?>
+ <CS:notification xmlns:D="DAV:"
+ xmlns:CS="http://calendarserver.org/ns/">
+ <CS:dtstamp>2011-12-09T11:51:14-05:00</CS:dtstamp>
+ <CS:resource-change>
+ <CS:updated>
+ <D:href>http://example.com/cyrus/calendar/new.ics</D:href>
+ <CS:changed-by>
+ <CS:first-name>Cyrus</CS:first-name>
+ <CS:last-name>Daboo</CS:last-name>
+ <D:href>/principals/cyrusdaboo</D:href>
+ </CS:changed-by>
+ <CS:calendar-changes>
+ <CS:recurrence>
+ <CS:master/>
+ <CS:changes>
+ <CS:changed-property name="DTSTART"/>
+ <CS:changed-property name="SUMMARY"/>
+ </CS:changes>
+ </CS:recurrence>
+ </CS:calendar-changes>
+ </CS:updated>
+ </CS:resource-change>
+ </CS:notification>
+
+
+
+
+
+Daboo [Page 22]
+
+ CalDAV User Notifications March 2012
+
+
+A.3. Resource Updated - Parameter Change
+
+ This is an example of the body of a notification resource where one
+ non-recurring event has had the "PARTSTAT" iCalendar property
+ parameter on an "ATTENDEE" property changed, and a "TRANSP" property
+ added.
+
+ <?xml version="1.0" encoding="UTF-8"?>
+ <CS:notification xmlns:D="DAV:"
+ xmlns:CS="http://calendarserver.org/ns/">
+ <CS:dtstamp>2011-12-09T11:51:14-05:00</CS:dtstamp>
+ <CS:resource-change>
+ <CS:updated>
+ <D:href>http://example.com/cyrus/calendar/new.ics</D:href>
+ <CS:changed-by>
+ <CS:first-name>Cyrus</CS:first-name>
+ <CS:last-name>Daboo</CS:last-name>
+ <D:href>/principals/cyrusdaboo</D:href>
+ </CS:changed-by>
+ <CS:calendar-changes>
+ <CS:recurrence>
+ <CS:master/>
+ <CS:added>
+ <CS:changed-property name="TRANSP"/>
+ </CS:added>
+ <CS:changes>
+ <CS:changed-property name="ATTENDEE">
+ <CS:changed-parameter name="PARTSTAT"/>
+ </CS:changed-property>
+ </CS:changes>
+ </CS:recurrence>
+ </CS:calendar-changes>
+ </CS:updated>
+ </CS:resource-change>
+ </CS:notification>
+
+A.4. Resource Updated - Multiple Instances Change
+
+ This is an example of the body of a notification resource where two
+ instances of a recurring event have their "DTSTART" and "SUMMARY"
+ iCalendar property values changed.
+
+
+
+
+
+
+
+
+
+
+Daboo [Page 23]
+
+ CalDAV User Notifications March 2012
+
+
+ <?xml version="1.0" encoding="UTF-8"?>
+ <CS:notification xmlns:D="DAV:"
+ xmlns:CS="http://calendarserver.org/ns/">
+ <CS:dtstamp>2011-12-09T11:51:14-05:00</CS:dtstamp>
+ <CS:resource-change>
+ <CS:updated>
+ <D:href>http://example.com/cyrus/calendar/new.ics</D:href>
+ <CS:changed-by>
+ <CS:first-name>Cyrus</CS:first-name>
+ <CS:last-name>Daboo</CS:last-name>
+ <D:href>/principals/cyrusdaboo</D:href>
+ </CS:changed-by>
+ <CS:calendar-changes>
+ <CS:recurrence>
+ <CS:recurrenceid>20120209T170000Z</CS:recurrenceid>
+ <CS:changes>
+ <CS:changed-property name="DTSTART"/>
+ <CS:changed-property name="SUMMARY"/>
+ </CS:changes>
+ </CS:recurrence>
+ <CS:recurrence>
+ <CS:recurrenceid>20120210T170000Z</CS:recurrenceid>
+ <CS:changes>
+ <CS:changed-property name="DTSTART"/>
+ <CS:changed-property name="SUMMARY"/>
+ </CS:changes>
+ </CS:recurrence>
+ </CS:calendar-changes>
+ </CS:updated>
+ </CS:resource-change>
+ </CS:notification>
+
+A.5. Resource Updated - Multiple User Change
+
+ This is an example of the body of a notification resource where two
+ instances of a recurring event have their "DTSTART" and "SUMMARY"
+ iCalendar property values changed. Each instance was changed by a
+ different user.
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo [Page 24]
+
+ CalDAV User Notifications March 2012
+
+
+ <?xml version="1.0" encoding="UTF-8"?>
+ <CS:notification xmlns:D="DAV:"
+ xmlns:CS="http://calendarserver.org/ns/">
+ <CS:dtstamp>2011-12-09T11:51:14-05:00</CS:dtstamp>
+ <CS:resource-change>
+ <CS:updated>
+ <D:href>http://example.com/cyrus/calendar/new.ics</D:href>
+ <CS:changed-by>
+ <CS:first-name>Cyrus</CS:first-name>
+ <CS:last-name>Daboo</CS:last-name>
+ <D:href>/principals/cyrusdaboo</D:href>
+ </CS:changed-by>
+ <CS:calendar-changes>
+ <CS:recurrence>
+ <CS:recurrenceid>20120209T170000Z</CS:recurrenceid>
+ <CS:changes>
+ <CS:changed-property name="DTSTART"/>
+ <CS:changed-property name="SUMMARY"/>
+ </CS:changes>
+ </CS:recurrence>
+ </CS:calendar-changes>
+ </CS:updated>
+ <CS:updated>
+ <D:href>http://example.com/cyrus/calendar/new.ics</D:href>
+ <CS:changed-by>
+ <CS:first-name>Eric</CS:first-name>
+ <CS:last-name>York</CS:last-name>
+ <D:href>/principals/ericyork</D:href>
+ </CS:changed-by>
+ <CS:calendar-changes>
+ <CS:recurrence>
+ <CS:recurrenceid>20120210T170000Z</CS:recurrenceid>
+ <CS:changes>
+ <CS:changed-property name="DTSTART"/>
+ <CS:changed-property name="SUMMARY"/>
+ </CS:changes>
+ </CS:recurrence>
+ </CS:calendar-changes>
+ </CS:updated>
+ </CS:resource-change>
+ </CS:notification>
+
+A.6. Resource Deleted
+
+ This is an example of the body of a notification resource where one
+ resource has been deleted. The resource was a VEVENT whose next
+ occurrence was in the future on 20120210T170000Z.
+
+
+
+
+Daboo [Page 25]
+
+ CalDAV User Notifications March 2012
+
+
+ <?xml version="1.0" encoding="UTF-8"?>
+ <CS:notification xmlns:D="DAV:"
+ xmlns:CS="http://calendarserver.org/ns/">
+ <CS:dtstamp>2011-12-09T11:51:14-05:00</CS:dtstamp>
+ <CS:resource-change>
+ <CS:deleted>
+ <D:href>http://example.com/cyrus/calendar/new.ics</D:href>
+ <CS:changed-by>
+ <CS:first-name>Cyrus</CS:first-name>
+ <CS:last-name>Daboo</CS:last-name>
+ <D:href>/principals/cyrusdaboo</D:href>
+ </CS:changed-by>
+ <CS:deleted-details>
+ <CS:deleted-component>VEVENT</CS:deleted-component>
+ <CS:deleted-summary>CalDAV Meeting</CS:deleted-summary>
+ <CS:deleted-next-instance
+ >20120210T170000Z</CS:deleted-next-instance>
+ </CS:deleted-details>
+ </CS:deleted>
+ </CS:resource-change>
+ </CS:notification>
+
+A.7. Collection Created
+
+ This is an example of the body of a notification resource where a
+ calendar collection has been created.
+
+ <?xml version="1.0" encoding="UTF-8"?>
+ <CS:notification xmlns:D="DAV:"
+ xmlns:CS="http://calendarserver.org/ns/">
+ <CS:dtstamp>2011-12-09T11:51:14-05:00</CS:dtstamp>
+ <CS:resource-change>
+ <CS:created>
+ <D:href>http://example.com/cyrus/new-calendar/</D:href>
+ <CS:changed-by>
+ <CS:first-name>Cyrus</CS:first-name>
+ <CS:last-name>Daboo</CS:last-name>
+ <D:href>/principals/cyrusdaboo</D:href>
+ </CS:changed-by>
+ </CS:created>
+ </CS:resource-change>
+ </CS:notification>
+
+A.8. Collection Updated
+
+ This is an example of the body of a notification resource where
+ coalesced changes in a calendar collection are shown. In this case 1
+ child resource was created, 2 updated, and 1 deleted.
+
+
+
+Daboo [Page 26]
+
+ CalDAV User Notifications March 2012
+
+
+ <?xml version="1.0" encoding="UTF-8"?>
+ <CS:notification xmlns:D="DAV:"
+ xmlns:CS="http://calendarserver.org/ns/">
+ <CS:dtstamp>2011-12-09T11:51:14-05:00</CS:dtstamp>
+ <CS:resource-change>
+ <CS:collection-changes>
+ <D:href>http://example.com/cyrus/calendar/</D:href>
+ <CS:child-created>1</CS:child-created>
+ <CS:child-updated>2</CS:child-updated>
+ <CS:child-deleted>1</CS:child-deleted>
+ </CS:collection-changes>
+ </CS:resource-change>
+ </CS:notification>
+
+A.9. Collection Deleted
+
+ This is an example of the body of a notification resource where a
+ calendar collection has been deleted.
+
+ <?xml version="1.0" encoding="UTF-8"?>
+ <CS:notification xmlns:D="DAV:"
+ xmlns:CS="http://calendarserver.org/ns/">
+ <CS:dtstamp>2011-12-09T11:51:14-05:00</CS:dtstamp>
+ <CS:resource-change>
+ <CS:deleted>
+ <D:href>http://example.com/cyrus/old-calendar/</D:href>
+ <CS:changed-by>
+ <CS:first-name>Cyrus</CS:first-name>
+ <CS:last-name>Daboo</CS:last-name>
+ <D:href>/principals/cyrusdaboo</D:href>
+ </CS:changed-by>
+ <CS:deleted-details>
+ <CS:deleted-displayname>Holidays</CS:deleted-displayname>
+ </CS:deleted-details>
+ </CS:deleted>
+ </CS:resource-change>
+ </CS:notification>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo [Page 27]
+
+ CalDAV User Notifications March 2012
+
+
+Author's Address
+
+ Cyrus Daboo
+ Apple Inc.
+ 1 Infinite Loop
+ Cupertino, CA 95014
+ USA
+
+ Email: cyrus@daboo.name
+ URI: http://www.apple.com/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo [Page 28]
+
diff --git a/vendor/sabre/dav/docs/caldav-proxy.txt b/vendor/sabre/dav/docs/caldav-proxy.txt
new file mode 100644
index 000000000..2d96bfc82
--- /dev/null
+++ b/vendor/sabre/dav/docs/caldav-proxy.txt
@@ -0,0 +1,560 @@
+
+
+
+Calendar Server Extension C. Daboo
+ Apple Computer
+ May 3, 2007
+
+
+ Calendar User Proxy Functionality in CalDAV
+ caldav-cu-proxy-02
+
+Abstract
+
+ This specification defines an extension to CalDAV that makes it easy
+ for clients to setup and manage calendar user proxies, using the
+ WebDAV Access Control List extension as a basis.
+
+
+Table of Contents
+
+ 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 2
+ 2. Conventions Used in This Document . . . . . . . . . . . . . . 2
+ 3. Overview . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
+ 3.1. Server . . . . . . . . . . . . . . . . . . . . . . . . . . 3
+ 3.2. Client . . . . . . . . . . . . . . . . . . . . . . . . . . 3
+ 4. Open Issues . . . . . . . . . . . . . . . . . . . . . . . . . 4
+ 5. New features in CalDAV . . . . . . . . . . . . . . . . . . . . 4
+ 5.1. Proxy Principal Resource . . . . . . . . . . . . . . . . . 4
+ 5.2. Privilege Provisioning . . . . . . . . . . . . . . . . . . 8
+ 6. Security Considerations . . . . . . . . . . . . . . . . . . . 9
+ 7. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 9
+ 8. Normative References . . . . . . . . . . . . . . . . . . . . . 9
+ Appendix A. Acknowledgments . . . . . . . . . . . . . . . . . . . 9
+ Appendix B. Change History . . . . . . . . . . . . . . . . . . . 10
+ Author's Address . . . . . . . . . . . . . . . . . . . . . . . . . 10
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo [Page 1]
+
+ CalDAV Proxy May 2007
+
+
+1. Introduction
+
+ CalDAV [RFC4791] provides a way for calendar users to store calendar
+ data and exchange this data via scheduling operations. Based on the
+ WebDAV protocol [RFC2518], it also includes the ability to manage
+ access to calendar data via the WebDAV ACL extension [RFC3744].
+
+ It is often common for a calendar user to delegate some form of
+ responsibility for their calendar and schedules to another calendar
+ user (e.g., a boss allows an assistant to check a calendar or to send
+ and accept scheduling invites on his behalf). The user handling the
+ calendar data on behalf of someone else is often referred to as a
+ "calendar user proxy".
+
+ Whilst CalDAV does have fine-grained access control features that can
+ be used to setup complex sharing and management of calendars, often
+ the proxy behavior required is an "all-or-nothing" approach - i.e.
+ the proxy has access to all the calendars or to no calendars (in
+ which case they are of course not a proxy). So a simple way to
+ manage access to an entire set of calendars and scheduling ability
+ would be handy.
+
+ In addition, calendar user agents will often want to display to a
+ user who has proxy access to their calendars, or to whom they are
+ acting as a proxy. Again, CalDAV's access control discovery and
+ report features can be used to do that, but with fine-grained control
+ that exists, it can be hard to tell who is a "real" proxy as opposed
+ to someone just granted rights to some subset of calendars. Again, a
+ simple way to discover proxy information would be handy.
+
+
+2. Conventions Used in This Document
+
+ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
+ "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
+ document are to be interpreted as described in [RFC2119].
+
+ When XML element types in the namespace "DAV:" are referenced in this
+ document outside of the context of an XML fragment, the string "DAV:"
+ will be prefixed to the element type names.
+
+ When XML element types in the namespaces "DAV:" and
+ "urn:ietf:params:xml:ns:caldav" are referenced in this document
+ outside of the context of an XML fragment, the string "DAV:" and
+ "CALDAV:" will be prefixed to the element type names respectively.
+
+ The namespace "http://calendarserver.org/ns/" is used for XML
+ elements defined in this specification. When XML element types in
+
+
+
+Daboo [Page 2]
+
+ CalDAV Proxy May 2007
+
+
+ this namespace are referenced in this document outside of the context
+ of an XML fragment, the string "CS:" will be prefixed to the element
+ type names respectively.
+
+
+3. Overview
+
+3.1. Server
+
+ For each calendar user principal on the server, the server will
+ generate two group principals - "proxy groups". One is used to hold
+ the list of principals who have read-only proxy access to the main
+ principal's calendars, the other holds the list of principals who
+ have read-write and scheduling proxy access. NB these new group
+ principals would have no equivalent in Open Directory.
+
+ Privileges on each "proxy group" principal will be set so that the
+ "owner" has the ability to change property values.
+
+ The "proxy group" principals will be child resources of the user
+ principal resource with specific resource types and thus are easy to
+ discover. As a result the user principal resources will also be
+ collection resources.
+
+ When provisioning the calendar user home collection, the server will:
+
+ a. Add an ACE to the calendar home collection giving the read-only
+ "proxy group" inheritable read access.
+
+ b. Add an ACE to the calendar home collection giving the read-write
+ "proxy group" inheritable read-write access.
+
+ c. Add an ACE to each of the calendar Inbox and Outbox collections
+ giving the CALDAV:schedule privilege
+ [I-D.desruisseaux-caldav-sched] to the read-write "proxy group".
+
+3.2. Client
+
+ A client can see who the proxies are for the current principal by
+ examining the principal resource for the two "proxy group" properties
+ and then looking at the DAV:group-member-set property of each.
+
+ The client can edit the list of proxies for the current principal by
+ editing the DAV:group-member-set property on the relevant "proxy
+ group" principal resource.
+
+ The client can find out who the current principal is a proxy for by
+ running a DAV:principal-match REPORT on the principal collection.
+
+
+
+Daboo [Page 3]
+
+ CalDAV Proxy May 2007
+
+
+ Alternatively, the client can find out who the current principal is a
+ proxy for by examining the DAV:group-membership property on the
+ current principal resource looking for membership in other users'
+ "proxy groups".
+
+
+4. Open Issues
+
+ 1. Do we want to separate read-write access to calendars vs the
+ ability to schedule as a proxy?
+
+ 2. We may want to restrict changing properties on the proxy group
+ collections to just the DAV:group-member-set property?
+
+ 3. There is no way for a proxy to be able to manage the list of
+ proxies. We could allow the main calendar user DAV:write-acl on
+ their "proxy group" principals, in which case they could grant
+ others the right to modify the group membership.
+
+ 4. Should the "proxy group" principals also be collections given
+ that the regular principal resources will be?
+
+
+5. New features in CalDAV
+
+5.1. Proxy Principal Resource
+
+ Each "regular" principal resource that needs to allow calendar user
+ proxy support MUST be a collection resource. i.e. in addition to
+ including the DAV:principal XML element in the DAV:resourcetype
+ property on the resource, it MUST also include the DAV:collection XML
+ element.
+
+ Each "regular" principal resource MUST contain two child resources
+ with names "calendar-proxy-read" and "calendar-proxy-write" (note
+ that these are only suggested names - the server could choose any
+ unique name for these). These resources are themselves principal
+ resources that are groups contain the list of principals for calendar
+ users who can act as a read-only or read-write proxy respectively.
+
+ The server MUST include the CS:calendar-proxy-read or CS:calendar-
+ proxy-write XML elements in the DAV:resourcetype property of the
+ child resources, respectively. This allows clients to discover the
+ "proxy group" principals by using a PROPFIND, Depth:1 request on the
+ current user's principal resource and requesting the DAV:resourcetype
+ property be returned. The element type declarations are:
+
+
+
+
+
+Daboo [Page 4]
+
+ CalDAV Proxy May 2007
+
+
+ <!ELEMENT calendar-proxy-read EMPTY>
+
+ <!ELEMENT calendar-proxy-write EMPTY>
+
+ The server MUST allow the "parent" principal to change the DAV:group-
+ member-set property on each of the "child" "proxy group" principal
+ resources. When a principal is listed as a member of the "child"
+ resource, the server MUST include the "child" resource URI in the
+ DAV:group-membership property on the included principal resource.
+ Note that this is just "normal" behavior for a group principal.
+
+ An example principal resource layout might be:
+
+ + /
+ + principals/
+ + users/
+ + cyrus/
+ calendar-proxy-read
+ calendar-proxy-write
+ + red/
+ calendar-proxy-read
+ calendar-proxy-write
+ + wilfredo/
+ calendar-proxy-read
+ calendar-proxy-write
+
+ If the principal "cyrus" wishes to have the principal "red" act as a
+ calendar user proxy on his behalf and have the ability to change
+ items on his calendar or schedule meetings on his behalf, then he
+ would add the principal resource URI for "red" to the DAV:group-
+ member-set property of the principal resource /principals/users/
+ cyrus/calendar-proxy-write, giving:
+
+ <DAV:group-member-set>
+ <DAV:href>/principals/users/red/</DAV:href>
+ </DAV:group-member-set>
+
+ The DAV:group-membership property on the resource /principals/users/
+ red/ would be:
+
+ <DAV:group-membership>
+ <DAV:href>/principals/users/cyrus/calendar-proxy-write</DAV:href>
+ </DAV:group-membership>
+
+ If the principal "red" was also a read-only proxy for the principal
+ "wilfredo", then the DA:group-membership property on the resource
+ /principals/users/red/ would be:
+
+
+
+
+Daboo [Page 5]
+
+ CalDAV Proxy May 2007
+
+
+ <DAV:group-membership>
+ <DAV:href>/principals/users/cyrus/calendar-proxy-write</DAV:href>
+ <DAV:href>/principals/users/wilfredo/calendar-proxy-read</DAV:href>
+ </DAV:group-membership>
+
+ Thus a client can discover to which principals a particular principal
+ is acting as a calendar user proxy for by examining the DAV:group-
+ membership property.
+
+ An alternative to discovering which principals a user can proxy as is
+ to use the WebDAV ACL principal-match report, targeted at the
+ principal collections available on the server.
+
+ Example:
+
+ >> Request <<
+
+ REPORT /principals/ HTTP/1.1
+ Host: cal.example.com
+ Depth: 0
+ Content-Type: application/xml; charset="utf-8"
+ Content-Length: xxxx
+ Authorization: Digest username="red",
+ realm="cal.example.com", nonce="...",
+ uri="/principals/", response="...", opaque="..."
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:principal-match xmlns:D="DAV:">
+ <D:self/>
+ <D:prop>
+ <D:resourcetype/>
+ </D:prop>
+ </D:principal-match>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo [Page 6]
+
+ CalDAV Proxy May 2007
+
+
+ >> Response <<
+
+ HTTP/1.1 207 Multi-Status
+ Date: Fri, 10 Nov 2006 09:32:12 GMT
+ Content-Type: application/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:multistatus xmlns:D="DAV:"
+ xmlns:A="http://calendarserver.org/ns/">
+ <D:response>
+ <D:href>/principals/users/red/</D:href>
+ <D:propstat>
+ <D:prop>
+ <D:resourcetype>
+ <D:principal/>
+ <D:collection/>
+ </D:resourcetype>
+ </D:prop>
+ <D:status>HTTP/1.1 200 OK</D:status>
+ </D:propstat>
+ </D:response>
+ <D:response>
+ <D:href>/principals/users/cyrus/calendar-proxy-write</D:href>
+ <D:propstat>
+ <D:prop>
+ <D:resourcetype>
+ <D:principal/>
+ <A:calendar-proxy-write/>
+ </D:resourcetype>
+ </D:prop>
+ <D:status>HTTP/1.1 200 OK</D:status>
+ </D:propstat>
+ </D:response>
+ <D:response>
+ <D:href>/principals/users/wilfredo/calendar-proxy-read</D:href>
+ <D:propstat>
+ <D:prop>
+ <D:resourcetype>
+ <D:principal/>
+ <A:calendar-proxy-read/>
+ </D:resourcetype>
+ </D:prop>
+ <D:status>HTTP/1.1 200 OK</D:status>
+ </D:propstat>
+ </D:response>
+ </D:multistatus>
+
+
+
+
+Daboo [Page 7]
+
+ CalDAV Proxy May 2007
+
+
+5.2. Privilege Provisioning
+
+ In order for a calendar user proxy to be able to access the calendars
+ of the user they are proxying for the server MUST ensure that the
+ privileges on the relevant calendars are setup accordingly:
+
+ The DAV:read privilege MUST be granted for read-only and read-
+ write calendar user proxy principals
+
+ The DAV:write privilege MUST be granted for read-write calendar
+ user proxy principals.
+
+ Additionally, the CalDAV scheduling Inbox and Outbox calendar
+ collections for the user allowing proxy access, MUST have the CALDAV:
+ schedule privilege [I-D.desruisseaux-caldav-sched] granted for read-
+ write calendar user proxy principals.
+
+ Note that with a suitable repository layout, a server may be able to
+ grant the appropriate privileges on a parent collection and ensure
+ that all the contained collections and resources inherit that. For
+ example, given the following repository layout:
+
+ + /
+ + calendars/
+ + users/
+ + cyrus/
+ inbox
+ outbox
+ home
+ work
+ + red/
+ inbox
+ outbox
+ work
+ soccer
+ + wilfredo/
+ inbox
+ outbox
+ home
+ work
+ flying
+
+ In order for the principal "red" to act as a read-write proxy for the
+ principal "cyrus", the following WebDAV ACE will need to be granted
+ on the resource /calendars/users/cyrus/ and all children of that
+ resource:
+
+
+
+
+
+Daboo [Page 8]
+
+ CalDAV Proxy May 2007
+
+
+ <DAV:ace>
+ <DAV:principal>
+ <DAV:href>/principals/users/cyrus/calendar-proxy-write</DAV:href>
+ </DAV:principal>
+ <DAV:privileges>
+ <DAV:grant><DAV:read/><DAV:write/></DAV:grant>
+ </DAV:privileges>
+ </DAV:ace>
+
+
+6. Security Considerations
+
+ TBD
+
+
+7. IANA Considerations
+
+ This document does not require any actions on the part of IANA.
+
+
+8. Normative References
+
+ [I-D.desruisseaux-caldav-sched]
+ Desruisseaux, B., "Scheduling Extensions to CalDAV",
+ draft-desruisseaux-caldav-sched-03 (work in progress),
+ January 2007.
+
+ [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
+ Requirement Levels", BCP 14, RFC 2119, March 1997.
+
+ [RFC2518] Goland, Y., Whitehead, E., Faizi, A., Carter, S., and D.
+ Jensen, "HTTP Extensions for Distributed Authoring --
+ WEBDAV", RFC 2518, February 1999.
+
+ [RFC3744] Clemm, G., Reschke, J., Sedlar, E., and J. Whitehead, "Web
+ Distributed Authoring and Versioning (WebDAV) Access
+ Control Protocol", RFC 3744, May 2004.
+
+ [RFC4791] Daboo, C., Desruisseaux, B., and L. Dusseault,
+ "Calendaring Extensions to WebDAV (CalDAV)", RFC 4791,
+ March 2007.
+
+
+Appendix A. Acknowledgments
+
+ This specification is the result of discussions between the Apple
+ calendar server and client teams.
+
+
+
+
+Daboo [Page 9]
+
+ CalDAV Proxy May 2007
+
+
+Appendix B. Change History
+
+ Changes from -00:
+
+ 1. Updated to RFC 4791 reference.
+
+ Changes from -00:
+
+ 1. Added more details on actual CalDAV protocol changes.
+
+ 2. Changed namespace from http://apple.com/ns/calendarserver/ to
+ http://calendarserver.org/ns/.
+
+ 3. Made "proxy group" principals child resources of their "owner"
+ principals.
+
+ 4. The "proxy group" principals now have their own resourcetype.
+
+
+Author's Address
+
+ Cyrus Daboo
+ Apple Computer, Inc.
+ 1 Infinite Loop
+ Cupertino, CA 95014
+ USA
+
+ Email: cyrus@daboo.name
+ URI: http://www.apple.com/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo [Page 10]
+
diff --git a/vendor/sabre/dav/docs/caldav-sharing.txt b/vendor/sabre/dav/docs/caldav-sharing.txt
new file mode 100644
index 000000000..c69d6bbbe
--- /dev/null
+++ b/vendor/sabre/dav/docs/caldav-sharing.txt
@@ -0,0 +1,1624 @@
+
+
+
+Calendar Server Extension C. Daboo
+ E. York
+ Apple Inc.
+ September 19, 2012
+
+
+ Shared and Published Calendars in CalDAV
+
+Abstract
+
+ This specification defines an extension to CalDAV that enables the
+ sharing of calendars between users on a CalDAV server.
+
+
+Table of Contents
+
+ 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 3
+ 2. Conventions Used in This Document . . . . . . . . . . . . . . 3
+ 3. Overview . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
+ 4. Notifications . . . . . . . . . . . . . . . . . . . . . . . . 5
+ 4.1. Additional Principal Properties . . . . . . . . . . . . . 5
+ 4.1.1. CS:notification-URL Property . . . . . . . . . . . . . 6
+ 4.2. Properties on Notification Resources . . . . . . . . . . . 6
+ 4.2.1. CS:notificationtype Property . . . . . . . . . . . . . 6
+ 5. Shared Calendaring . . . . . . . . . . . . . . . . . . . . . . 7
+ 5.1. Feature Discovery . . . . . . . . . . . . . . . . . . . . 7
+ 5.2. Additional Properties for Calendars . . . . . . . . . . . 7
+ 5.2.1. DAV:resourcetype Property . . . . . . . . . . . . . . 7
+ 5.2.2. CS:invite Property . . . . . . . . . . . . . . . . . . 8
+ 5.2.3. CS:allowed-sharing-modes Property . . . . . . . . . . 8
+ 5.2.4. CS:shared-url Property . . . . . . . . . . . . . . . . 9
+ 5.3. Sharer Actions on Shared Calendars . . . . . . . . . . . . 9
+ 5.3.1. Sharing or Unsharing a Calendar . . . . . . . . . . . 9
+ 5.3.2. Manipulating Sharees of a Shared Calendar . . . . . . 10
+ 5.3.2.1. Example: Successful Sharee Add Request . . . . . . 11
+ 5.3.2.2. Example: Successful Multiple Sharee Change
+ Request . . . . . . . . . . . . . . . . . . . . . 11
+ 5.4. Sharee Actions on Shared Calendars . . . . . . . . . . . . 12
+ 5.4.1. Replying to a Sharing Invite . . . . . . . . . . . . . 12
+ 5.4.2. Removing a Shared Calendar . . . . . . . . . . . . . . 13
+ 5.5. General Considerations . . . . . . . . . . . . . . . . . . 13
+ 5.5.1. Access Levels . . . . . . . . . . . . . . . . . . . . 13
+ 5.5.2. Allowing or Disallowing Sharing . . . . . . . . . . . 13
+ 5.5.3. Per-user WebDAV Properties . . . . . . . . . . . . . . 14
+ 5.5.4. Per-user Calendar Data . . . . . . . . . . . . . . . . 14
+ 5.5.5. Scheduling . . . . . . . . . . . . . . . . . . . . . . 15
+ 6. XML Element Definitions . . . . . . . . . . . . . . . . . . . 16
+ 6.1. CS:shared-owner . . . . . . . . . . . . . . . . . . . . . 16
+
+
+
+Daboo & York [Page 1]
+
+ CalDAV Sharing and Publishing September 2012
+
+
+ 6.2. CS:shared . . . . . . . . . . . . . . . . . . . . . . . . 17
+ 6.3. CS:can-be-shared . . . . . . . . . . . . . . . . . . . . . 17
+ 6.4. CS:can-be-published . . . . . . . . . . . . . . . . . . . 18
+ 6.5. CS:user . . . . . . . . . . . . . . . . . . . . . . . . . 18
+ 6.6. CS:invite-noresponse . . . . . . . . . . . . . . . . . . . 18
+ 6.7. CS:invite-deleted . . . . . . . . . . . . . . . . . . . . 19
+ 6.8. CS:invite-accepted . . . . . . . . . . . . . . . . . . . . 19
+ 6.9. CS:invite-declined . . . . . . . . . . . . . . . . . . . . 19
+ 6.10. CS:invite-invalid . . . . . . . . . . . . . . . . . . . . 20
+ 6.11. CS:access . . . . . . . . . . . . . . . . . . . . . . . . 20
+ 6.12. CS:read . . . . . . . . . . . . . . . . . . . . . . . . . 21
+ 6.13. CS:read-write . . . . . . . . . . . . . . . . . . . . . . 21
+ 6.14. CS:summary . . . . . . . . . . . . . . . . . . . . . . . . 21
+ 6.15. CS:invite-notification . . . . . . . . . . . . . . . . . . 22
+ 6.16. CS:uid . . . . . . . . . . . . . . . . . . . . . . . . . . 22
+ 6.17. CS:hosturl . . . . . . . . . . . . . . . . . . . . . . . . 23
+ 6.18. CS:organizer . . . . . . . . . . . . . . . . . . . . . . . 23
+ 6.19. CS:common-name . . . . . . . . . . . . . . . . . . . . . . 23
+ 6.20. CS:first-name . . . . . . . . . . . . . . . . . . . . . . 24
+ 6.21. CS:last-name . . . . . . . . . . . . . . . . . . . . . . . 24
+ 6.22. CS:invite-reply . . . . . . . . . . . . . . . . . . . . . 24
+ 6.23. CS:in-reply-to . . . . . . . . . . . . . . . . . . . . . . 25
+ 6.24. CS:notification . . . . . . . . . . . . . . . . . . . . . 25
+ 6.25. CS:dtstamp . . . . . . . . . . . . . . . . . . . . . . . . 26
+ 6.26. CS:share . . . . . . . . . . . . . . . . . . . . . . . . . 26
+ 6.27. CS:set . . . . . . . . . . . . . . . . . . . . . . . . . . 26
+ 6.28. CS:remove . . . . . . . . . . . . . . . . . . . . . . . . 27
+ 6.29. CS:shared-as . . . . . . . . . . . . . . . . . . . . . . . 27
+ 7. Security Considerations . . . . . . . . . . . . . . . . . . . 27
+ 8. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 27
+ 9. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 28
+ 10. Normative References . . . . . . . . . . . . . . . . . . . . . 28
+ Appendix A. Change History . . . . . . . . . . . . . . . . . . . 28
+ Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . . 29
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo & York [Page 2]
+
+ CalDAV Sharing and Publishing September 2012
+
+
+1. Introduction
+
+ CalDAV [RFC4791] provides a way for calendar users to store calendar
+ data and exchange this data via scheduling operations. Based on the
+ WebDAV [RFC4918] protocol, it also includes the ability to manage
+ access to calendar data via the WebDAV ACL [RFC3744] extension.
+
+ WebDAV ACL [RFC3744] provides a way to manage fine-grained access
+ controls on WebDAV resources. Whilst this could be used directly to
+ manage sharing of calendars, experience has shown that client
+ developers are averse to using it due to its complexity. Instead a
+ simpler process for sharing calendars is preferred.
+
+ This extension defines a way for individual calendar users to share
+ calendars with other users. This is done via an "opt-in" process in
+ which a sharing invite is sent from the sharer to a sharee, allowing
+ the sharee to accept or decline. If the sharee accepts the sharing
+ invite, the shared calendar is made available to them in their own
+ calendar home collection (i.e., alongside their own personal
+ calendars). HTTP POST operations are used to manage the sharing
+ invitations and replies, and WebDAV properties are used to expose the
+ state of shared calendars.
+
+
+2. Conventions Used in This Document
+
+ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
+ "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
+ document are to be interpreted as described in [RFC2119].
+
+ When XML element types in the namespaces "DAV:" and
+ "urn:ietf:params:xml:ns:caldav" are referenced in this document
+ outside of the context of an XML fragment, the string "DAV:" and
+ "CALDAV:" will be prefixed to the element type names respectively.
+
+ The namespace "http://calendarserver.org/ns/" is used for XML
+ elements defined in this specification. When XML element types in
+ that namespace are referenced in this document outside of the context
+ of an XML fragment, the string "CS:" will be prefixed to the element
+ type names.
+
+ Terms Used:
+
+ Sharer A calendar user who is sharing a calendar with other calendar
+ users.
+
+
+
+
+
+
+Daboo & York [Page 3]
+
+ CalDAV Sharing and Publishing September 2012
+
+
+ Sharee A calendar user to whom a calendar has been shared.
+
+ Sharing Invite A message sent by a sharer to a sharee to indicate
+ the status of a shared calendar.
+
+ Sharing Reply A message sent by a sharee to a sharer to indicate the
+ status of a shared calendar.
+
+
+3. Overview
+
+ This section provides a basic overview of this protocol by way of a
+ simple use case of a sharer sharing a calendar with a single sharee.
+
+ To share a calendar with another user, the sharer's client executes
+ an HTTP POST request against the calendar collection resource for the
+ calendar to be shared. The POST request body will contain details of
+ the calendar user to whom the calendar is to be shared as well as the
+ access right to be granted to them. If the request succeeds, a
+ notification is sent to the sharee with details of the calendar being
+ shared to them.
+
+ The sharer's client will show the notification to the sharee and
+ present them with the choice to accept or decline the invitation to
+ the shared calendar. If the sharee chooses to decline, then nothing
+ changes for that sharee. If the sharee chooses to accept, then the
+ server automatically creates a new calendar collection resource in
+ the sharee's calendar home collection, and ensures that calendar
+ provides a mapping to the actual shared calendar of the sharer. Thus
+ the shared calendar is available to the sharee as just another
+ calendar in their calendar home. The server enforces the appropriare
+ access privileges for the sharee.
+
+ At any time, the sharer can inspect properties on the calendar
+ collection being shared, and determine the accept/decline status of
+ each sharee. Additional sharees can be added and existing ones
+ removed. The access privileges for existing sharees can also be
+ changed.
+
+ Once a sharee has a shared calendar set to appear in their calendar
+ home collection, they can remove it and decline the sharing invite by
+ simply having their client issue an HTTP DELETE request on the shared
+ calendar collection. That does not delete any calendar data, but
+ rather simply removes the "link" to the sharer's calendar collection
+ and sets the sharee's inviate status to declined.
+
+
+
+
+
+
+Daboo & York [Page 4]
+
+ CalDAV Sharing and Publishing September 2012
+
+
+4. Notifications
+
+ In order to facilitate the process of sharing invitations, this
+ specification defines a new generic notification mechanism for CalDAV
+ servers. When this feature is available, a CS:notification-URL
+ (Section 4.1.1) property appears on principal resources for those
+ principals who are able to receive notifications. That property
+ specifies a single DAV:href element whose content refers to a WebDAV
+ collection resource. Notification "messages" are deposited into this
+ collection and can be retrieved by clients and acted on accordingly.
+
+ The notification collection referenced by the CS:notification-URL
+ (Section 4.1.1) property MUST have a DAV:resourcetype property with
+ DAV:collection and CS:notification (Section 6.24) child elements.
+
+ Notification "messages" are XML documents stored as resources in the
+ notification collection. Each XML document contains a CS:
+ notification (Section 6.24) element as its root. The root element
+ contains a CS:dtstamp (Section 6.25) element, and one additional
+ element which represents the type of notification being conveyed in
+ the message. That child element will typically contain additional
+ content that describes the notification.
+
+ Each notification resource has a CS:notificationtype (Section 4.2.1)
+ property which contains as its single child element an empty element
+ that matches the child element of the notification resource XML
+ document root. Any attributes on the child element in the XML
+ document are also present in the property child element.
+
+ Notifications are automatically generated by the server (perhaps in
+ response to a client action) with an appropriate resource stored in
+ the notifications collection of the user to whom the notification is
+ targeted. Clients SHOULD monitor the notification collection looking
+ for new notification resources. When doing so, clients SHOULD look
+ at the CS:notificationtype (Section 4.2.1) property to ensure that
+ the notification is of a type that the client can handle. Once a
+ client has handled the notification in whatever way is appropriate it
+ SHOULD delete the notification resource. Servers MAY delete
+ notification resources on their own if they determine that the
+ notifications are no longer relevant or valid. Servers MAY coalesce
+ notifications as appropriate.
+
+4.1. Additional Principal Properties
+
+ This section defines new properties for WebDAV principal resources as
+ defined in RFC3744 [RFC3744]. These properties are likely to be
+ protected but the server MAY allow them to be written by appropriate
+ users.
+
+
+
+Daboo & York [Page 5]
+
+ CalDAV Sharing and Publishing September 2012
+
+
+4.1.1. CS:notification-URL Property
+
+ Name: notification-URL
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: Identify the URL of the notification collection owned by
+ the associated principal resource.
+
+ Protected: This property SHOULD be protected.
+
+ PROPFIND behavior: This property SHOULD NOT be returned by a
+ PROPFIND allprop request (as defined in Section 14.2 of
+ [RFC4918]).
+
+ COPY/MOVE behavior: This property value SHOULD be preserved in COPY
+ and MOVE operations.
+
+ Description: This property is needed for a client to determine where
+ the notification collection of the current user is located so that
+ processing of notification messages can occur. If not present,
+ then the associated calendar user is not enabled for notification
+ messages on the server.
+
+ Definition:
+
+ <!ELEMENT notification-URL (DAV:href)>
+
+4.2. Properties on Notification Resources
+
+ The following new WebDAV properties are defined for notification
+ resources.
+
+4.2.1. CS:notificationtype Property
+
+ Name: notificationtype
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: Identify the type of notification of the corresponding
+ resource.
+
+ Protected: This property MUST be protected.
+
+ PROPFIND behavior: This property SHOULD NOT be returned by a
+ PROPFIND allprop request (as defined in Section 14.2 of
+ [RFC4918]).
+
+
+
+
+Daboo & York [Page 6]
+
+ CalDAV Sharing and Publishing September 2012
+
+
+ COPY/MOVE behavior: This property value MUST be preserved in COPY
+ and MOVE operations.
+
+ Description: This property allows a client, via a PROPFIND Depth:1
+ request, to quickly find notification messages that the client can
+ handle in a notification collection. The single child element is
+ the notification resource root element's child defining the
+ notification itself. This element MUST be empty, though any
+ attributes on the element in the notification resource MUST be
+ present in the property element.
+
+ Definition:
+
+ <!ELEMENT notificationtype (invite-notification | invite-reply)>
+ <!-- Child elements are empty but will have appropriate attributes.
+ Any valid notification message child element can appear.-->
+
+
+5. Shared Calendaring
+
+5.1. Feature Discovery
+
+ A server that supports the features described in this document MUST
+ include "calendarserver-sharing" as a field in the DAV response
+ header from an OPTIONS request on any resource that supports these
+ features.
+
+5.2. Additional Properties for Calendars
+
+ The following new or modified WebDAV properties are defined for
+ calendar collections and used to view or manipulate shared calendar
+ features.
+
+5.2.1. DAV:resourcetype Property
+
+ Calendar collections that are shared have addition elements listed in
+ their DAV:resourcetype property in addition to DAV:collection and
+ CALDAV:calendar.
+
+ o CS:shared-owner (Section 6.1): used to indicate that the calendar
+ is owned by the current user and is being shared by them.
+
+ o CS:shared (Section 6.2): used to indicate that the calendar is
+ owned by another user and is being shared to the current user.
+
+
+
+
+
+
+
+Daboo & York [Page 7]
+
+ CalDAV Sharing and Publishing September 2012
+
+
+5.2.2. CS:invite Property
+
+ Name: invite
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: Used to show to whom a calendar has been shared.
+
+ Protected: This property MUST be protected.
+
+ PROPFIND behavior: This property SHOULD NOT be returned by a
+ PROPFIND allprop request (as defined in Section 14.2 of
+ [RFC4918]).
+
+ COPY/MOVE behavior: This property value MUST be preserved in COPY
+ and MOVE operations.
+
+ Description: This WebDAV property is present on a calendar
+ collection resource that has been shared by the owner, or on the
+ calendar collection resources of the sharees of the calendar. It
+ provides a list of users to whom the calendar has been shared,
+ along with the "status" of the sharing invites sent to each user.
+ In addition, servers SHOULD include a CS:organizer XML element on
+ calendar collection resources of the sharees to provide clients
+ with a fast way to determine who the sharer is. A server's local
+ privacy policy may prevent sharees from knowing about other
+ sharees on a shared calendar. If that is so server will not
+ include CS:user XML elements for other sharees.
+
+ Definition:
+
+ <!ELEMENT invite (organizer?, user*)>
+
+5.2.3. CS:allowed-sharing-modes Property
+
+ Name: allowed-sharing-modes
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: Used to show which modes of sharing are supported on a
+ calendar collection.
+
+ Protected: This property MUST be protected.
+
+ PROPFIND behavior: This property SHOULD NOT be returned by a
+ PROPFIND allprop request (as defined in Section 14.2 of
+ [RFC4918]).
+
+
+
+
+Daboo & York [Page 8]
+
+ CalDAV Sharing and Publishing September 2012
+
+
+ COPY/MOVE behavior: This property value MUST be preserved in COPY
+ and MOVE operations.
+
+ Description: This WebDAV property is present on a calendar
+ collection resource that can been shared or published. It
+ provides a list of options indicating what sharing modes are
+ allowed as per Section 5.5.2.
+
+ Definition:
+
+ <!ELEMENT allowed-sharing-modes
+ (can-be-shared?, can-be-published?)>
+
+5.2.4. CS:shared-url Property
+
+ Name: shared-url
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: Indicates the URL of the owner's copy of a shared calendar.
+
+ Protected: This property MUST be protected.
+
+ PROPFIND behavior: This property SHOULD NOT be returned by a
+ PROPFIND allprop request (as defined in Section 14.2 of
+ [RFC4918]).
+
+ COPY/MOVE behavior: This property value MUST be preserved in COPY
+ and MOVE operations.
+
+ Description: This WebDAV property is present on a shared calendar
+ collection resource that appears in a sharee's calendar home
+ collection. Its content is a single DAV:href element whose value
+ is the URL of the sharer's calendar being shared.
+
+ Definition:
+
+ <!ELEMENT shared-url (DAV:href)>
+
+5.3. Sharer Actions on Shared Calendars
+
+5.3.1. Sharing or Unsharing a Calendar
+
+ To update an existing calendar to be shared, the sharer simply adds
+ one or more sharees to the calendar collection as per Section 5.3.2.
+ The server MUST update the DAV:resourcetype property on the calendar
+ collection to ensure it contains a CS:shared-owner XML element to
+ indicate the calendar collection is now shared.
+
+
+
+Daboo & York [Page 9]
+
+ CalDAV Sharing and Publishing September 2012
+
+
+ To unshare a calendar, the sharer simply removes all sharees to the
+ CS:invite property of the calendar collection as per Section 5.3.2.
+ The server MUST update the DAV:resourcetype property on the calendar
+ collection to ensure it does not contain a CS:shared-owner XML
+ element to indicate the calendar collection is not shared.
+
+5.3.2. Manipulating Sharees of a Shared Calendar
+
+ The sharer of a shared calendar is able to manipulate the sharee list
+ by issuing a POST request targeted at the calendar collection
+ resource. The POST request MUST contain an XML document as its body
+ with the root element being CS:share (Section 6.26).
+
+ The CS:share (Section 6.26) element in the POST requests MUST contain
+ one or more CS:set (Section 6.27) or CS:remove (Section 6.28)
+ elements. For each CS:set (Section 6.27) element, the server MUST
+ add the specified sharee access to the calendar. For each CS:remove
+ (Section 6.28) element the server MUST remove the specified sharee
+ access from the shared calendar. In each case the server MUST send a
+ notification message to any sharees whose status is changed (added,
+ modified or removed), indicating to them a change in status for the
+ shared calendar. The server SHOULD NOT send notification messages to
+ sharees whose status is unchanged.
+
+ Sharee's are identified via a DAV:href element whose value is either
+ a principal-URL for a sharee hosted on the same server, a calendar
+ user address or email address. In the case of the later two, the
+ sharee might not be a user on the same server - though in that case
+ how invitations are sent or access enabled is out of scope for this
+ specification. A server MAY change the sharee's "address" to any
+ suitable alternative that it might prefer when returning the list of
+ sharees via the CS:invite property (Section 5.2.2).
+
+ The client MAY include a CS:common-name (Section 6.19) element in the
+ CS:set (Section 6.27) element. When provided, the value represents
+ the common name for the sharee, and is returned in the list of
+ sharees via the CS:invite property (Section 5.2.2). The server MAY
+ change this to a suitable alternative when it is able to match the
+ sharee to a known user. If absent from the client request, the
+ server SHOULD add a CS:common-name when it is able to match the
+ sharee with a known user, and a common name for that user can be
+ determined.
+
+ When the sharee list on a shared calendar is changed, the server MUST
+ send notifications to each sharee to update them on their current
+ sharing status. This is accomplished by sending a CS:invite-
+ notification (Section 6.15) notification to each sharee.
+
+
+
+
+Daboo & York [Page 10]
+
+ CalDAV Sharing and Publishing September 2012
+
+
+5.3.2.1. Example: Successful Sharee Add Request
+
+ This example shows how to add a single sharee (with calendar user
+ address "mailto:eric@example.com") to a shared calendar with CS:read-
+ write access.
+
+ >> Request <<
+
+ POST /calendars/users/cyrus/shared/ HTTP/1.1
+ Host: calendar.example.com
+ Content-Type: application/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <CS:share xmlns:D="DAV:"
+ xmlns:CS="http://calendarserver.org/ns/">
+ <CS:set>
+ <D:href>mailto:eric@example.com</D:href>
+ <CS:common-name>Eric York</CS:common-name>
+ <CS:summary>Shared workspace</CS:summary>
+ <CS:read-write />
+ </CS:set>
+ </CS:share>
+
+ >> Response <<
+
+ HTTP/1.1 200 OK
+ Cache-Control: no-cache
+ Date: Sat, 11 Nov 2006 09:32:12 GMT
+
+5.3.2.2. Example: Successful Multiple Sharee Change Request
+
+ This example shows how multiple sharee's can be manipulated in a
+ single request. The sharee with calendar user address
+ "mailto:eric@example.com" has their access downgraded to CS:read,
+ whilst another sharee is removed from the access list entirely.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo & York [Page 11]
+
+ CalDAV Sharing and Publishing September 2012
+
+
+ >> Request <<
+
+ POST /calendars/users/cyrus/shared/ HTTP/1.1
+ Host: calendar.example.com
+ Content-Type: application/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <CS:share xmlns:D="DAV:"
+ xmlns:CS="http://calendarserver.org/ns/">
+ <CS:set>
+ <D:href>mailto:eric@example.com</D:href>
+ <CS:summary>Shared workspace</CS:summary>
+ <CS:read-write />
+ </CS:set>
+ <CS:remove>
+ <D:href>mailto:wilfredo@example.com</D:href>
+ </CS:remove>
+ </CS:share>
+
+ >> Response <<
+
+ HTTP/1.1 200 OK
+ Cache-Control: no-cache
+ Date: Sat, 11 Nov 2006 09:32:12 GMT
+
+5.4. Sharee Actions on Shared Calendars
+
+5.4.1. Replying to a Sharing Invite
+
+ When a sharee is invited to a shared calendar they can accept or
+ decline the invite by issuing a POST request to the sharee's calendar
+ home collection resource. The POST request MUST contain an XML
+ document as its body with the root element being CS:invite-reply
+ (Section 6.22).
+
+ The CS:invite-reply (Section 6.22) element in the POST request
+ specifies the sharee who is replying in the DAV:href element, the
+ accept or decline action via the CS:invite-accepted or CS:invite-
+ declined elements, the URL of the shared calendar in the CS:hosturl
+ element, the unique identifier of the invite to which it is a reply
+ in the CS:in-reply-to element, and an optional CS:summary element.
+
+ The response to a POST request that accepts a shared calendar invite
+ MUST be an XML document containing CS:shared-as (Section 6.29) as its
+ root element. That root element contains a single DAV:href element
+ whose content is the URI of the shared calendar in the sharee's
+ calendar home created by the invite acceptance.
+
+
+
+Daboo & York [Page 12]
+
+ CalDAV Sharing and Publishing September 2012
+
+
+ When the sharee replies to an invite, the server SHOULD send a
+ notification to the sharer to update them on the change in the sharee
+ state. This is accomplished by sending a CS:invite-reply
+ (Section 6.22) notification to the sharer.
+
+5.4.2. Removing a Shared Calendar
+
+ To remove a shared calendar from a sharee's calendar home collection
+ a DELETE request is targeted at the shared calendar URI. When such a
+ request is received the server MUST remove the shared calendar from
+ the sharee's calendar home and automatically update the sharee's
+ status in the sharer's calendar's CS:invite property.
+
+5.5. General Considerations
+
+5.5.1. Access Levels
+
+ Two levels of access ca be granted by a sharer to any sharee. These
+ are governed by the CS:access element used in the CS:invite/CS:user
+ element that specifies a shared user invite. CS:access contains a
+ single empty element that defines the type of access granted:
+
+ CS:read When present this indicates that sharees can read calendar
+ data but cannot change it.
+
+ CS:read-write When present this indicates that sharees can read and
+ write calendar data.
+
+5.5.2. Allowing or Disallowing Sharing
+
+ Servers MAY support calendar sharing on a per-calendar basis - e.g.,
+ they could treat some calendars as always private (cannot be shared)
+ or always public (always shared). As a result clients need a way to
+ determine which calendar could be shared so they can enable or
+ disable sharing options on a per-calendar basis.
+
+ This specification adds a CS:allowed-sharing-modes (Section 5.2.3)
+ WebDAV property which servers can return on calendar collection
+ resources. This property contains XML elements that describe which
+ sharing or publishing capabilities can be supported by the
+ corresponding calendar collection:
+
+ CS:can-be-shared (Section 6.3): when present indicates that the
+ calendar collection can be shared. When not present, the calendar
+ collection cannot be shared.
+
+ CS:can-be-published (Section 6.4): when present indicates that the
+ calendar collection can be published. When not present, the
+
+
+
+Daboo & York [Page 13]
+
+ CalDAV Sharing and Publishing September 2012
+
+
+ calendar collection cannot be published.
+
+ When not present on a calendar collection, sharing or publishing of
+ that calendar is not allowed. Clients SHOULD NOT attempt to use
+ requests to enable sharing or publishing targeted at those calendar
+ collections.
+
+5.5.3. Per-user WebDAV Properties
+
+ Servers MUST support "per-user" WebDAV properties on shared calendar
+ collections and MAY support them on calendar object resources within
+ shared calendar collections. A "per-user" WebDAV property is one
+ whose value can be set and retrieved independently by each user with
+ appropriate access rights. e.g., user "A" changes the DAV:displayname
+ property on a shared calendar in their calendar home to "My
+ calendar", and user "B" changes the same property to "Shared" on the
+ same shared calendar in their calendar home. When each user
+ retrieves the property value they will see their own last stored
+ value and not the value of the other user.
+
+ For shared calendars, the server MUST allow all users to write "per-
+ user" WebDAV properties on the shared calendar collection and MAY
+ allow property writes on calendar object resources within the shared
+ calendar collection. This is required even in the case where the
+ sharee has been granted read access only (i.e., the ability to change
+ calendar data is disallowed). This requirement ensures that sharees
+ can always change "personal" properties such as calendar colors and
+ display names.
+
+ Servers MUST treat the following properties as "per-user":
+
+ DAV:displayname
+
+ CALDAV:calendar-description
+
+ CALDAV:schedule-calendar-transp
+
+ ICAL:calendar-color
+
+ Servers MAY treat any dead property as per-user.
+
+ Servers MUST NOT treat live properties as per-user.
+
+5.5.4. Per-user Calendar Data
+
+ Servers MUST support "per-user" calendar data in calendar object
+ resources stored in shared calendars. This allows each sharee and
+ the sharer to store their own alarms and free busy transparency
+
+
+
+Daboo & York [Page 14]
+
+ CalDAV Sharing and Publishing September 2012
+
+
+ status without "interfering" with other users who also have access to
+ the same calendar object resources.
+
+ For calendaring object resources in shared calendar collections, the
+ server MUST treat the following iCalendar data objects as per-user:
+
+ TRANSP property
+
+ VALARM component
+
+ Servers MAY treat any non-standard X- iCalendar properties as per-
+ user.
+
+ When handling per-user data in recurring components, servers SHOULD
+ eliminate overridden instances when returning iCalendar data to
+ clients in the case where there are no differences between the
+ overridden component and the instance that could be derived from the
+ "master" recurrence component. For example, consider a daily
+ recurring event, Monday through Friday, initially defined without any
+ overridden instances, that is in a shared calendar. If user "A"
+ overrides the Tuesday instance and adds their own "VALARM" component
+ only, then when user "A" later retrieves the data again they would
+ see that overridden instance, but when user "B" does so, they would
+ not. This ensures that each user sees the most "compact"
+ representation of the calendar data.
+
+5.5.5. Scheduling
+
+ CalDAV Scheduling [RFC6638] defines how a CalDAV server carries out
+ scheduling operations when calendar object resources are created,
+ modified or deleted and include "ORGANIZER" and "ATTENDEE" iCalendar
+ properties.
+
+ When calendar object resources are created, modified or deleted in
+ shared calendars by sharees, the following restrictions apply:
+
+ 1. The "ORGANIZER" iCalendar property value in the iCalendar data
+ MUST match a calendar user address of the sharer (owner) of the
+ shared calendar. The DAV:owner WebDAV property MUST be present
+ on a shared calendar and MUST provide a reference to a principal-
+ URL of the sharer (owner) of the shared calendar. Clients can
+ use this value to determine what the allowed "ORGANIZER"
+ iCalendar property values are. The server MUST reject any
+ attempt by a sharee to create an iCalendar component with an
+ "ORGANIZER" property value other than the sharer (owner) of the
+ shared calendar.
+
+
+
+
+
+Daboo & York [Page 15]
+
+ CalDAV Sharing and Publishing September 2012
+
+
+ 2. The server MUST reject any attempt by a sharee to MOVE a calendar
+ object resource in a shared calendar to some other collection.
+
+ 3. When a sharee is listed as an Attendee in a calendar object
+ resource in a shared calendar, and write access is granted, the
+ sharee is allowed to change not only iCalendar data related to
+ the Organizer, but also data related to the Attendee. i.e., a
+ sharee can change their own participation status on the
+ "ATTENDEE" iCalendar property referring to them. Additionally,
+ if the sharee is not listed as an Attendee, and write access is
+ granted, the sharee can add themselves as an Attendee.
+
+ 4. The default calendar collection defined in Section 6.3 of
+ [RFC6638] MUST NOT be a calendar shared to the corresponding
+ calendar user.
+
+ Following are additional considerations for scheduling with shared
+ calendars:
+
+ 1. A scheduled iCalendar component could appear in more than one
+ calendar collection within a sharee's calendar home if the sharee
+ is an Attendee and the Organizer or other Attendees have shared a
+ calendar with the sharee that includes their copies of the
+ iCalendar component. It is important to note that the scheduled
+ component in the shared calendar could have different access
+ rights than the one in the sharee's owned calendar.
+
+ 2. A scheduled iCalendar component appearing in a sharee's shared
+ calendar could include the sharee as an Attendee. For recurring
+ events, it is possible for the sharee to only be listed as an
+ Attendee in some instances, as opposed to all. Clients will need
+ to be aware of this when allowing sharee's to set their own
+ participation status.
+
+ In addition, when a shared calendar is first accepted by a sharee,
+ the server SHOULD set the CALDAV:schedule-calendar-transp property to
+ the value CALDAV:transparent to ensure newly accepted shared
+ calendars do not contribute to the sharee's freebusy time until the
+ sharee explicitly requests it.
+
+
+6. XML Element Definitions
+
+6.1. CS:shared-owner
+
+
+
+
+
+
+
+Daboo & York [Page 16]
+
+ CalDAV Sharing and Publishing September 2012
+
+
+ Name: shared-owner
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: Used to indicate that a calendar is being shared by the
+ owner.
+
+ Description: This property appears in the DAV:resourcetype property
+ on the calendar collection resource shared by a sharer. See
+ Section 5.2.
+
+ Definition:
+
+ <!ELEMENT shared-owner EMPTY>
+
+6.2. CS:shared
+
+ Name: shared
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: Used to indicate that a calendar is being shared to a
+ sharee.
+
+ Description: This property appears in the DAV:resourcetype property
+ on a calendar collection resource that is shared to a sharee and
+ appears in the sharee's calendar home collection. See
+ Section 5.2.
+
+ Definition:
+
+ <!ELEMENT shared EMPTY>
+
+6.3. CS:can-be-shared
+
+ Name: can-be-shared
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: Used to indicate that a calendar can be shared.
+
+ Description: This element indicates that a calendar can be shared
+ with other users. See Section 5.2.3
+
+ Definition:
+
+ <!ELEMENT can-be-shared EMPTY>
+
+
+
+
+Daboo & York [Page 17]
+
+ CalDAV Sharing and Publishing September 2012
+
+
+6.4. CS:can-be-published
+
+ Name: can-be-published
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: Used to indicate that a calendar can be published.
+
+ Description: This element indicates that a calendar can be published
+ to anyone. See Section 5.2.3
+
+ Definition:
+
+ <!ELEMENT can-be-published EMPTY>
+
+6.5. CS:user
+
+ Name: user
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: Used to show status of sharing invites sent to sharees.
+
+ Description: This element provides the "status" of a sharing invite
+ sent to a particular user. See Section 5.2.2.
+
+ Definition:
+
+ <!ELEMENT user (DAV:href, common-name?, (invite-noresponse |
+ invite-accepted | invite-declined | invite-invalid),
+ access, summary?)>
+
+6.6. CS:invite-noresponse
+
+ Name: invite-noresponse
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: Sharing invite status.
+
+ Description: When used in a CS:user (Section 6.5) element, this
+ element is used to indicate that the sharee has never replied to
+ the corresponding sharing invite. When used in a CS:invite-
+ notification (Section 6.15) element, this element is used to
+ indicate to the sharee that a sharing reply is needed.
+
+
+
+
+
+
+Daboo & York [Page 18]
+
+ CalDAV Sharing and Publishing September 2012
+
+
+ Definition:
+
+ <!ELEMENT invite-noresponse EMPTY>
+
+6.7. CS:invite-deleted
+
+ Name: invite-deleted
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: Sharing invite status.
+
+ Description: When used in a CS:invite-notification (Section 6.15)
+ element, this element is used to indicate to the sharee that a
+ shared calendar has been unshared by the sharer.
+
+ Definition:
+
+ <!ELEMENT invite-deleted EMPTY>
+
+6.8. CS:invite-accepted
+
+ Name: invite-accepted
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: Sharing invite status.
+
+ Description: When used in a CS:user (Section 6.5) element, this
+ element is used to indicate that the sharee has accepted the
+ corresponding sharing invite. When used in a CS:invite-
+ notification (Section 6.15) element, this element is used to
+ indicate to the sharee that the sharing invite is an update for
+ one they previously accepted.
+
+ Definition:
+
+ <!ELEMENT invite-accepted EMPTY>
+
+6.9. CS:invite-declined
+
+ Name: invite-declined
+
+ Namespace: http://calendarserver.org/ns/
+
+
+
+
+
+
+
+Daboo & York [Page 19]
+
+ CalDAV Sharing and Publishing September 2012
+
+
+ Purpose: Sharing invite status.
+
+ Description: When used in a CS:user (Section 6.5) element, this
+ element is used to indicate that the sharee has declined the
+ corresponding sharing invite. When used in a CS:invite-
+ notification (Section 6.15) element, this element is used to
+ indicate to the sharee that the sharing invite is an update for
+ one they previously declined.
+
+ Definition:
+
+ <!ELEMENT invite-declined EMPTY>
+
+6.10. CS:invite-invalid
+
+ Name: invite-invalid
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: Sharing invite status.
+
+ Description: When used in a CS:user (Section 6.5) element, this
+ element is used to indicate that the corresponding sharee is not a
+ valid calendar user known to the server.
+
+ Definition:
+
+ <!ELEMENT invite-invalid EMPTY>
+
+6.11. CS:access
+
+ Name: access
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: Shared calendar access level.
+
+ Description: When used in a CS:user (Section 6.5) element, this
+ element is used to indicate the sharing access level granted to
+ the corresponding sharee.
+
+ Definition:
+
+ <!ELEMENT access (read | read-write)>
+
+
+
+
+
+
+
+Daboo & York [Page 20]
+
+ CalDAV Sharing and Publishing September 2012
+
+
+6.12. CS:read
+
+ Name: read
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: Shared calendar access level privilege.
+
+ Description: Indicates that the access level granted only allows
+ sharees to read data in the shared calendar (though they can write
+ per-user data (Section 5.5.4)).
+
+ Definition:
+
+ <!ELEMENT read EMPTY>
+
+6.13. CS:read-write
+
+ Name: read-write
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: Shared calendar access level privilege.
+
+ Description: Indicates that the access level granted allows sharees
+ to read and write all data in the shared calendar, with the
+ exception of components that would trigger scheduling.
+
+ Definition:
+
+ <!ELEMENT read-write EMPTY>
+
+6.14. CS:summary
+
+ Name: summary
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: Summary or title of shared calendar.
+
+ Description: A brief description of a shared calendar. This can be
+ used by sharers to communicate the nature of a shared calendar to
+ sharees, as well as used by sharees to indicate back to the sharer
+ how each sharee is refering to the shared calendar.
+
+
+
+
+
+
+
+Daboo & York [Page 21]
+
+ CalDAV Sharing and Publishing September 2012
+
+
+ Definition:
+
+ <!ELEMENT summary (#PCDATA)>
+
+6.15. CS:invite-notification
+
+ Name: invite-notification
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: A notification used as a shared calendar invite.
+
+ Description: Defines a notification message sent automatically by
+ the server when a sharer adds, changes or removes a sharee from a
+ shared calendar. The DAV:href element specifies the calendar user
+ address of the sharee to whom the message was sent. The CALDAV:
+ supported-calendar-component-set is a copy of the matching WebDAV
+ property on the sharers calendar collection, to allow clients to
+ know what restrictions might apply to the shared calendar before
+ accepting it.
+
+ Definition:
+
+ <!ELEMENT invite-notification (
+ uid, DAV:href,
+ (invite-noresponse | invite-deleted |
+ invite-accepted | invite-declined),
+ access, hosturl, organizer,
+ summary?,
+ CALDAV:supported-calendar-component-set?>
+
+6.16. CS:uid
+
+ Name: uid
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: Unique identifier.
+
+ Description: A unique identifier for an invitation to a shared
+ calendar.
+
+ Definition:
+
+ <!ELEMENT uid (#PCDATA)>
+
+
+
+
+
+
+Daboo & York [Page 22]
+
+ CalDAV Sharing and Publishing September 2012
+
+
+6.17. CS:hosturl
+
+ Name: hosturl
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: Identifies the source URL of a shared calendar.
+
+ Description: Contains a single DAV:href element that refers to the
+ source of a shared calendar - i.e., the URL of the calendar shared
+ by the sharer.
+
+ Definition:
+
+ <!ELEMENT hosturl (DAV:href)>
+
+6.18. CS:organizer
+
+ Name: organizer
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: Identifies the sharer of a shared calendar.
+
+ Description: Contains a single DAV:href element that identifies the
+ calendar user address of the sharer of a shared calendar, and an
+ optional CS:common-name element that matches that user, and an
+ option CS:first-name, CS:last-name pair of elements that match
+ that user. In some cases servers might have directory information
+ that includes only the common name, or only the first or last
+ name, and it is better to expose those directly to the client
+ as-is rather than to try and split or combine the attributes to
+ synthesize one set or the other.
+
+ Definition:
+
+ <!ELEMENT organizer (DAV:href,
+ CS:common-name?,
+ (CS:first-name, CS:last-name)?)>
+
+6.19. CS:common-name
+
+ Name: common-name
+
+ Namespace: http://calendarserver.org/ns/
+
+
+
+
+
+
+Daboo & York [Page 23]
+
+ CalDAV Sharing and Publishing September 2012
+
+
+ Purpose: The common name of a sharer or sharee.
+
+ Description: The common name is optionally provided by a client when
+ adding a sharee and optionally included (or modified) by the
+ server when returning results for sharers or sharees and in
+ notifications.
+
+ Definition:
+
+ <!ELEMENT common-name (#PCDATA)>
+
+6.20. CS:first-name
+
+ Name: first-name
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: The first name of a sharer or sharee.
+
+ Description: The first name is optionally included by the server
+ when returning results for sharers or sharees and in
+ notifications.
+
+ Definition:
+
+ <!ELEMENT first-name (#PCDATA)>
+
+6.21. CS:last-name
+
+ Name: last-name
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: The last name of a sharer or sharee.
+
+ Description: The last name is optionally included by the server when
+ returning results for sharers or sharees and in notifications.
+
+ Definition:
+
+ <!ELEMENT last-name (#PCDATA)>
+
+6.22. CS:invite-reply
+
+
+
+
+
+
+
+
+Daboo & York [Page 24]
+
+ CalDAV Sharing and Publishing September 2012
+
+
+ Name: invite-reply
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: A notification used as a reply to a shared calendar invite.
+
+ Description: Defines a notification message sent automatically by
+ the server when a sharee replies to a shared calendar invite. The
+ DAV:href element specifies the calendar user address of the sharee
+ to whom the original invite message was sent.
+
+ Definition:
+
+ <!ELEMENT invite-reply (DAV:href,
+ (invite-accepted | invite-declined),
+ hosturl, in-reply-to, summary?>
+
+6.23. CS:in-reply-to
+
+ Name: in-reply-to
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: Unique identifier.
+
+ Description: Specifies the unique identifier of the inviate message
+ that this notification message is a reply to.
+
+ Definition:
+
+ <!ELEMENT in-reply-to (#PCDATA)>
+
+6.24. CS:notification
+
+ Name: notification
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: Notification message root element.
+
+ Description: The root element used in notification resources.
+
+ Definition:
+
+ <!ELEMENT notification (CS:dtstamp,
+ (invite-notification | invite-reply)>
+ <!-- Any notification type element can appear after CS:dtstamp,
+ this specification defines only the two listed above -->
+
+
+
+Daboo & York [Page 25]
+
+ CalDAV Sharing and Publishing September 2012
+
+
+6.25. CS:dtstamp
+
+ Name: dtstamp
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: Date-time stamp.
+
+ Description: Contains the date-time stamp corresponding to the
+ creation of a notification message.
+
+ Definition:
+
+ <!ELEMENT dtstamp (#PCDATA)>
+
+6.26. CS:share
+
+ Name: share
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: Describes changes to sharees.
+
+ Description: The root element used in POST requests on calendars by
+ sharers to manipulate the sharee list of a shared calendar.
+
+ Definition:
+
+ <!ELEMENT share (set | remove)*>
+
+6.27. CS:set
+
+ Name: set
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: Sets access for a sharee.
+
+ Description: Used to add or modify sharee access to a shared
+ calendar. The specified access to the shared calendar is given to
+ the sharee.
+
+ Definition:
+
+ <!ELEMENT set (DAV:href, common-name?, summary?,
+ (read | read-write)>
+
+
+
+
+
+Daboo & York [Page 26]
+
+ CalDAV Sharing and Publishing September 2012
+
+
+6.28. CS:remove
+
+ Name: remove
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: Removes access for a sharee.
+
+ Description: Used to remove sharee access to a shared calendar. All
+ access to the shared calendar is removed for the sharee.
+
+ Definition:
+
+ <!ELEMENT remove (DAV:href)>
+
+6.29. CS:shared-as
+
+ Name: shared-as
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: Identifies a shared calendar.
+
+ Description: Returned by the server for a POST request by a sharee
+ accepting a shared calendar invite. The DAV:href element
+ specifies the URI of the calendar created by the acceptance.
+
+ Definition:
+
+ <!ELEMENT shared-as (DAV:href)>
+
+
+7. Security Considerations
+
+ Per-user WebDAV properties and iCalendar data MUST only be accessible
+ by the user that created them.
+
+ Alarms set by the sharer SHOULD NOT be propagated to sharees by
+ default. Clients SHOULD NOT automatically enable triggering of
+ alarms on shared calendars that have just been accepted without
+ confirmation by the user.
+
+ TBD
+
+
+8. IANA Considerations
+
+ This document does not require any actions on the part of IANA.
+
+
+
+Daboo & York [Page 27]
+
+ CalDAV Sharing and Publishing September 2012
+
+
+9. Acknowledgments
+
+ This specification is the result of discussions between the Apple
+ calendar server and client teams.
+
+
+10. Normative References
+
+ [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
+ Requirement Levels", BCP 14, RFC 2119, March 1997.
+
+ [RFC3744] Clemm, G., Reschke, J., Sedlar, E., and J. Whitehead, "Web
+ Distributed Authoring and Versioning (WebDAV)
+ Access Control Protocol", RFC 3744, May 2004.
+
+ [RFC4791] Daboo, C., Desruisseaux, B., and L. Dusseault,
+ "Calendaring Extensions to WebDAV (CalDAV)", RFC 4791,
+ March 2007.
+
+ [RFC4918] Dusseault, L., "HTTP Extensions for Web Distributed
+ Authoring and Versioning (WebDAV)", RFC 4918, June 2007.
+
+ [RFC6638] Daboo, C. and B. Desruisseaux, "Scheduling Extensions to
+ CalDAV", RFC 6638, June 2012.
+
+
+Appendix A. Change History
+
+ Changes in -03:
+
+ 1. Fixed access element DTD.
+
+ 2. Remove MKxxx and PROPPATCH mechanism for upgrading/downgrading
+ shared state on a calendar collection. Instead the server
+ implicitly sets the state based on whether there are any sharees
+ or not..
+
+ 3. Added CS:first-name and CS:last-name optional element to CS:
+ organizer.
+
+ 4. Added CALDAV:supported-calendar-component-set optional element to
+ CS:invite-notification.
+
+ Changes in -02:
+
+ 1. Removed read-write-shared access mode - now a server that does
+ not support shared scheduling should advertise that via a DAV
+ header
+
+
+
+Daboo & York [Page 28]
+
+ CalDAV Sharing and Publishing September 2012
+
+
+ Changes in -01:
+
+ 1. Added CS:shared-url property
+
+ 2. Clarified that notifications are only required to be sent when
+ sharee status is changed
+
+
+Authors' Addresses
+
+ Cyrus Daboo
+ Apple Inc.
+ 1 Infinite Loop
+ Cupertino, CA 95014
+ USA
+
+ Email: cyrus@daboo.name
+ URI: http://www.apple.com/
+
+
+ Eric York
+ Apple Inc.
+ 1 Infinite Loop
+ Cupertino, CA 95014
+ USA
+
+ Email:
+ URI: http://www.apple.com/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo & York [Page 29]
+
diff --git a/vendor/sabre/dav/docs/draft-daboo-carddav-directory-gateway-02.txt b/vendor/sabre/dav/docs/draft-daboo-carddav-directory-gateway-02.txt
new file mode 100644
index 000000000..63aa8b29c
--- /dev/null
+++ b/vendor/sabre/dav/docs/draft-daboo-carddav-directory-gateway-02.txt
@@ -0,0 +1,560 @@
+
+
+
+Network Working Group C. Daboo
+Internet-Draft Apple Inc.
+Updates: XXXX-CardDAV August 24, 2010
+(if approved)
+Intended status: Standards Track
+Expires: February 25, 2011
+
+
+ CardDAV Directory Gateway Extension
+ draft-daboo-carddav-directory-gateway-02
+
+Abstract
+
+ This document defines an extension to the vCard Extensions to WebDAV
+ (CardDAV) protocol that allows a server to expose a directory as a
+ read-only address book collection.
+
+Status of this Memo
+
+ This Internet-Draft is submitted in full conformance with the
+ provisions of BCP 78 and BCP 79.
+
+ Internet-Drafts are working documents of the Internet Engineering
+ Task Force (IETF). Note that other groups may also distribute
+ working documents as Internet-Drafts. The list of current Internet-
+ Drafts is at http://datatracker.ietf.org/drafts/current/.
+
+ Internet-Drafts are draft documents valid for a maximum of six months
+ and may be updated, replaced, or obsoleted by other documents at any
+ time. It is inappropriate to use Internet-Drafts as reference
+ material or to cite them other than as "work in progress."
+
+ This Internet-Draft will expire on February 25, 2011.
+
+Copyright Notice
+
+ Copyright (c) 2010 IETF Trust and the persons identified as the
+ document authors. All rights reserved.
+
+ This document is subject to BCP 78 and the IETF Trust's Legal
+ Provisions Relating to IETF Documents
+ (http://trustee.ietf.org/license-info) in effect on the date of
+ publication of this document. Please review these documents
+ carefully, as they describe your rights and restrictions with respect
+ to this document. Code Components extracted from this document must
+ include Simplified BSD License text as described in Section 4.e of
+ the Trust Legal Provisions and are provided without warranty as
+ described in the Simplified BSD License.
+
+
+
+Daboo Expires February 25, 2011 [Page 1]
+
+Internet-Draft CardDAV Directory Gateway Extension August 2010
+
+
+Table of Contents
+
+ 1. Introduction and Overview . . . . . . . . . . . . . . . . . . 3
+ 2. Conventions . . . . . . . . . . . . . . . . . . . . . . . . . 3
+ 3. CARDDAV:directory-gateway Property . . . . . . . . . . . . . . 4
+ 4. XML Element Definitions . . . . . . . . . . . . . . . . . . . 5
+ 4.1. CARDDAV:directory . . . . . . . . . . . . . . . . . . . . 5
+ 5. Client Guidelines . . . . . . . . . . . . . . . . . . . . . . 5
+ 6. Server Guidelines . . . . . . . . . . . . . . . . . . . . . . 6
+ 7. Security Considerations . . . . . . . . . . . . . . . . . . . 7
+ 8. IANA Consideration . . . . . . . . . . . . . . . . . . . . . . 8
+ 9. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 8
+ 10. References . . . . . . . . . . . . . . . . . . . . . . . . . . 8
+ 10.1. Normative References . . . . . . . . . . . . . . . . . . . 8
+ 10.2. Informative References . . . . . . . . . . . . . . . . . . 9
+ Appendix A. Change History (to be removed prior to
+ publication as an RFC) . . . . . . . . . . . . . . . 9
+ Author's Address . . . . . . . . . . . . . . . . . . . . . . . . . 10
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo Expires February 25, 2011 [Page 2]
+
+Internet-Draft CardDAV Directory Gateway Extension August 2010
+
+
+1. Introduction and Overview
+
+ The CardDAV [I-D.ietf-vcarddav-carddav] protocol defines a standard
+ way of accessing, managing, and sharing contact information based on
+ the vCard [RFC2426] format. Often, in an enterprise or service
+ provider environment, a directory of all users hosted on the server
+ (or elsewhere) is available (for example via Lightweight Directory
+ Access Protocol (LDAP) [RFC4510] or some direct database access). It
+ would be convenient for CardDAV clients if this directory were
+ exposed as a "global" address book on the CardDAV server so it could
+ be searched in the same way as personal address books are. This
+ specification defines a "directory gateway" feature extension to
+ CardDAV to enable this.
+
+ This specification adds one new WebDAV property to principal
+ resources that contains the URL to one or more directory gateway
+ address book collection resources. It is important for clients to be
+ able to distinguish this address book collection from others because
+ there are specific limitations involved in using it as described
+ below. To aid that, this specification defines an XML element that
+ can be included as a child element of the DAV:resourcetype property
+ of address book collections to identify them as directory gateways.
+
+ Note that this feature is in no way intended to replace full
+ directory access - it is meant to simply provide a convenient way for
+ CardDAV clients to query contact-related attributes in directory
+ records.
+
+
+2. Conventions
+
+ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
+ "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
+ document are to be interpreted as described in [RFC2119].
+
+ The term "protected" is used in the Conformance field of property
+ definitions as defined in Section 15 of [RFC4918].
+
+ This document uses XML DTD fragments ([W3C.REC-xml-20081126], Section
+ 3.2) as a purely notational convention. WebDAV request and response
+ bodies cannot be validated by a DTD due to the specific extensibility
+ rules defined in Section 17 of [RFC4918] and due to the fact that all
+ XML elements defined by this specification use the XML namespace name
+ "DAV:". In particular:
+
+ 1. element names use the "DAV:" namespace,
+
+
+
+
+
+Daboo Expires February 25, 2011 [Page 3]
+
+Internet-Draft CardDAV Directory Gateway Extension August 2010
+
+
+ 2. element ordering is irrelevant unless explicitly stated,
+
+ 3. extension elements (elements not already defined as valid child
+ elements) may be added anywhere, except when explicitly stated
+ otherwise,
+
+ 4. extension attributes (attributes not already defined as valid for
+ this element) may be added anywhere, except when explicitly
+ stated otherwise.
+
+ When XML element types in the namespaces "DAV:" and
+ "urn:ietf:params:xml:ns:carddav" are referenced in this document
+ outside of the context of an XML fragment, the strings "DAV:" and
+ "CARDDAV:" will be prefixed to the element types, respectively.
+
+
+3. CARDDAV:directory-gateway Property
+
+ Name: directory-gateway
+
+ Namespace: urn:ietf:params:xml:ns:carddav
+
+ Purpose: Identifies URLs of CardDAV address book collections acting
+ as a directory gateway for the server.
+
+ Protected: MUST be protected.
+
+ allprop behavior: SHOULD NOT be returned by a PROPFIND DAV:allprop
+ request.
+
+ Description: The CARDDAV:directory-gateway identifies address book
+ collection resources that are directory gateway address books for
+ the server.
+
+ Definition:
+
+ <!ELEMENT directory-gateway (DAV:href*)>
+
+ Example:
+
+ <C:directory-gateway xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:carddav">
+ <D:href>/directory</D:href>
+ </C:directory-gateway>
+
+
+
+
+
+
+
+Daboo Expires February 25, 2011 [Page 4]
+
+Internet-Draft CardDAV Directory Gateway Extension August 2010
+
+
+4. XML Element Definitions
+
+4.1. CARDDAV:directory
+
+ Name: directory
+
+ Namespace: urn:ietf:params:xml:ns:carddav
+
+ Purpose: Used to indicate that an address book collection is a
+ directory gateway.
+
+ Description: This element appears in the DAV:resourcetype property
+ on a address book collection resources that are directory
+ gateways. Clients can use the presence of this element to
+ identify directory gateway collections when doing PROPFINDs to
+ list collection contents.
+
+ Definition:
+
+ <!ELEMENT directory EMPTY>
+
+ Example:
+
+ <D:resourcetype xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:carddav">
+ <D:collection/>
+ <C:addressbook/>
+ <C:directory/>
+ </D:resourcetype>
+
+
+5. Client Guidelines
+
+ Clients wishing to make use of directory gateway address books can
+ request the CARDDAV:directory-gateway property (Section 3) when
+ examining other properties on the principal resource for the user.
+ If the property is not present, then the directory gateway feature is
+ not supported by the server at that time.
+
+ Clients can also detect the presence of directory gateway address
+ book collections by retrieving the DAV:resourcetype property on
+ collections that it lists, and look for the presence of the CARDDAV:
+ directory element (Section 4.1).
+
+ Since the directory being exposed via a directory gateway address
+ book collection could be large, clients SHOULD limit the number of
+ results returned in an CARDDAV:addressbook-query REPORT as defined in
+ Section 8.6.1 of [I-D.ietf-vcarddav-carddav].
+
+
+
+Daboo Expires February 25, 2011 [Page 5]
+
+Internet-Draft CardDAV Directory Gateway Extension August 2010
+
+
+ Clients MUST treat the directory gateway address book collection as a
+ read-only collection, so HTTP methods that modify resource data or
+ properties in the address book collection MUST NOT be used.
+
+ Clients SHOULD NOT attempt to cache the entire contents of the
+ directory gateway address book collection resource by retrieving all
+ resources, or trying to examine all the properties of all resources
+ (e.g., via a PROPFIND Depth:1 request). Instead, CARDDAV:
+ addressbook-query REPORTs are used to search for specific address
+ book object resources, and CARDDAV:multiget REPORTs and individual
+ GET requests can be made to retrieve the actual vCard data for
+ address book object resources found via a query.
+
+ When presenting directory gateway collections to the user, clients
+ SHOULD use the DAV:displayname property on the corresponding address
+ book collections as the name of the directory gateway. This is
+ important in the case where more than one directory gateway is
+ available. Clients MAY also provide descriptive information about
+ each directory gateway by examining the CARDDAV:addressbook-
+ description property (see Section 6.2.1 of
+ [I-D.ietf-vcarddav-carddav]) on the resource.
+
+
+6. Server Guidelines
+
+ Servers wishing to expose a directory gateway as an address book
+ collection MUST include the CARDDAV:directory-gateway property on all
+ principal resources of users expected to use the feature.
+
+ Since the directory being exposed via the directory gateway address
+ book collection could be large, servers SHOULD truncate the number of
+ results returned in an CARDDAV:addressbook-query REPORT as defined in
+ Section 8.6.2 of [I-D.ietf-vcarddav-carddav]. In addition, servers
+ SHOULD disallow requests that effectively enumerate the collection
+ contents (e.g., PROPFIND Depth:1, trivial CARDDAV:addressbook-query,
+ DAV:sync-collection REPORT).
+
+ Servers need to expose the directory information as a set of address
+ book object resources in the directory gateway address book
+ collection resource. To do that, a mapping between the directory
+ record format and the vCard data has to be applied. In general, only
+ directory record attributes that have a direct equivalent in vCard
+ SHOULD be mapped. It is up to individual implementations to
+ determine which attributes to map. But in all cases servers MUST
+ generate valid vCard data as returned to the client. In addition, as
+ required by CardDAV, the UID vCard property MUST be present in the
+ vCard data, and this value MUST be persistent from query to query for
+ the same directory record.
+
+
+
+Daboo Expires February 25, 2011 [Page 6]
+
+Internet-Draft CardDAV Directory Gateway Extension August 2010
+
+
+ Multiple directory sources could be available to the server. The
+ server MAY use a single directory gateway resource to aggregate
+ results from each directory source. When doing so care is needed
+ when dealing with potential records that refer to the same entity.
+ Servers MAY suppress any duplicates that they are able to determine
+ themselves. Alternatively, multiple directory sources can be exposed
+ as separate directory gateway resources.
+
+ For any directory source, a server MAY expose multiple directory
+ gateway resources where each represents a different query "scope" for
+ the directory. Different scopes MAY be offered to different
+ principals on the server. For example, the server might expose an
+ entire company directory for searching as the resource "/directory-
+ all" to all principals, but then provide "/directory-department-XYZ"
+ as another directory gateway that has a search scope that implicitly
+ limits the search results to just the "XYZ" department. Users in
+ that department would then have a CARDDAV:directory-gateway property
+ on their principal resource that included the "/directory-department-
+ XYZ" resource. Users in other departments would have corresponding
+ directory gateway resources available to them.
+
+ Records in a directory can include data for more than just people,
+ e.g, resources such as rooms or projectors, groups, computer systems
+ etc. It is up to individual implementations to determine the most
+ appropriate "scope" for the data returned via the directory gateway
+ by filtering the appropriate record types. As above, servers could
+ choose to expose people and resources under different directory
+ gateway resources by implicitly limiting the search "scope" for each
+ of those.
+
+ Servers MAY apply implementation defined access rules to determine,
+ on a per-user basis, what records are returned to a particularly user
+ and the content of those records exposed via vCard data. This per-
+ user behavior is in addition to the general security requirements
+ detailed below.
+
+ When multiple directory gateway collections are present, servers
+ SHOULD provide a DAV:displayname property on each that disambiguates
+ them. Servers MAY include a CARDDAV:addressbook-description property
+ (see Section 6.2.1 of [I-D.ietf-vcarddav-carddav]) on each directory
+ gateway resource to provide a description of the directory and any
+ search "scope" that might be used, or any other useful information
+ for users.
+
+
+7. Security Considerations
+
+ Servers MUST ensure that client requests against the directory
+
+
+
+Daboo Expires February 25, 2011 [Page 7]
+
+Internet-Draft CardDAV Directory Gateway Extension August 2010
+
+
+ gateway address book collection cannot use excessive resources (CPU,
+ memory, network bandwidth etc), given that the directory could be
+ large.
+
+ Servers MUST take care not to expose sensitive directory record
+ attributes in the vCard data via the directory gateway address book.
+ In general only those properties that have direct correspondence in
+ vCard SHOULD be exposed.
+
+ Servers need to determine whether it is appropriate for the directory
+ information to be available via CardDAV to unauthenticated users. If
+ not, servers MUST ensure that unauthenticated users do not have
+ access to the directory gateway address book object resource and its
+ contents. If unauthenticated access is allowed, servers MAY choose
+ to limit the set of vCard properties that are searchable or returned
+ in the address book object resources when unauthenticated requests
+ are made.
+
+
+8. IANA Consideration
+
+ This document does not require any actions on the part of IANA.
+
+
+9. Acknowledgments
+
+
+10. References
+
+10.1. Normative References
+
+ [I-D.ietf-vcarddav-carddav]
+ Daboo, C., "vCard Extensions to WebDAV (CardDAV)",
+ draft-ietf-vcarddav-carddav-10 (work in progress),
+ November 2009.
+
+ [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
+ Requirement Levels", BCP 14, RFC 2119, March 1997.
+
+ [RFC2426] Dawson, F. and T. Howes, "vCard MIME Directory Profile",
+ RFC 2426, September 1998.
+
+ [RFC4918] Dusseault, L., "HTTP Extensions for Web Distributed
+ Authoring and Versioning (WebDAV)", RFC 4918, June 2007.
+
+ [W3C.REC-xml-20081126]
+ Paoli, J., Yergeau, F., Bray, T., Sperberg-McQueen, C.,
+ and E. Maler, "Extensible Markup Language (XML) 1.0 (Fifth
+
+
+
+Daboo Expires February 25, 2011 [Page 8]
+
+Internet-Draft CardDAV Directory Gateway Extension August 2010
+
+
+ Edition)", World Wide Web Consortium Recommendation REC-
+ xml-20081126, November 2008,
+ <http://www.w3.org/TR/2008/REC-xml-20081126>.
+
+10.2. Informative References
+
+ [RFC4510] Zeilenga, K., "Lightweight Directory Access Protocol
+ (LDAP): Technical Specification Road Map", RFC 4510,
+ June 2006.
+
+
+Appendix A. Change History (to be removed prior to publication as an
+ RFC)
+
+ Changes in -02
+
+ 1. Added CARDDAV:directory element for use in DAV:resourcetype
+
+ 2. Allow CARDDAV:directory-gateway to be multi-valued
+
+ 3. Explain how a server could implicit "scope" queries on different
+ directory gateway resources
+
+ Changes in -01
+
+ 1. Remove duplicated text in a couple of sections
+
+ 2. Add example of LDAP/generic database as possible directory
+ "sources"
+
+ 3. Add text to explain why the client needs to treat this as special
+ and thus the need for a property
+
+ 4. Added text to server guidelines indicating requirements for
+ handling vCard UID properties
+
+ 5. Added text to server guidelines explain that different record
+ "types" may exist in the directory and the server is free to
+ filter those as appropriate
+
+ 6. Added text to server guidelines indicating that server are free
+ to aggregate directory records from multiple sources
+
+ 7. Added text to server guidelines indicating that servers are free
+ to apply implementation defined access control to the returned
+ data on a per-user basis
+
+
+
+
+
+Daboo Expires February 25, 2011 [Page 9]
+
+Internet-Draft CardDAV Directory Gateway Extension August 2010
+
+
+Author's Address
+
+ Cyrus Daboo
+ Apple Inc.
+ 1 Infinite Loop
+ Cupertino, CA 95014
+ USA
+
+ Email: cyrus@daboo.name
+ URI: http://www.apple.com/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo Expires February 25, 2011 [Page 10]
+
diff --git a/vendor/sabre/dav/docs/draft-desruisseaux-caldav-sched-10.txt b/vendor/sabre/dav/docs/draft-desruisseaux-caldav-sched-10.txt
new file mode 100644
index 000000000..bcb2520f0
--- /dev/null
+++ b/vendor/sabre/dav/docs/draft-desruisseaux-caldav-sched-10.txt
@@ -0,0 +1,5544 @@
+
+
+
+Network Working Group C. Daboo
+Internet-Draft Apple Inc.
+Updates: 4791 (if approved) B. Desruisseaux
+Intended status: Standards Track Oracle
+Expires: March 10, 2012 September 7, 2011
+
+
+ CalDAV Scheduling Extensions to WebDAV
+ draft-desruisseaux-caldav-sched-10
+
+Abstract
+
+ This document defines extensions to the CalDAV "calendar-access"
+ feature to specify a standard way of performing scheduling
+ transactions with iCalendar-based calendar components. This document
+ defines the "calendar-auto-schedule" feature of CalDAV.
+
+Status of This Memo
+
+ This Internet-Draft is submitted in full conformance with the
+ provisions of BCP 78 and BCP 79.
+
+ Internet-Drafts are working documents of the Internet Engineering
+ Task Force (IETF). Note that other groups may also distribute
+ working documents as Internet-Drafts. The list of current Internet-
+ Drafts is at http://datatracker.ietf.org/drafts/current/.
+
+ Internet-Drafts are draft documents valid for a maximum of six months
+ and may be updated, replaced, or obsoleted by other documents at any
+ time. It is inappropriate to use Internet-Drafts as reference
+ material or to cite them other than as "work in progress."
+
+ This Internet-Draft will expire on March 10, 2012.
+
+Copyright Notice
+
+ Copyright (c) 2011 IETF Trust and the persons identified as the
+ document authors. All rights reserved.
+
+ This document is subject to BCP 78 and the IETF Trust's Legal
+ Provisions Relating to IETF Documents
+ (http://trustee.ietf.org/license-info) in effect on the date of
+ publication of this document. Please review these documents
+ carefully, as they describe your rights and restrictions with respect
+ to this document. Code Components extracted from this document must
+ include Simplified BSD License text as described in Section 4.e of
+ the Trust Legal Provisions and are provided without warranty as
+ described in the Simplified BSD License.
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 1]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ This document may contain material from IETF Documents or IETF
+ Contributions published or made publicly available before November
+ 10, 2008. The person(s) controlling the copyright in some of this
+ material may not have granted the IETF Trust the right to allow
+ modifications of such material outside the IETF Standards Process.
+ Without obtaining an adequate license from the person(s) controlling
+ the copyright in such materials, this document may not be modified
+ outside the IETF Standards Process, and derivative works of it may
+ not be created outside the IETF Standards Process, except to format
+ it for publication as an RFC or to translate it into languages other
+ than English.
+
+Table of Contents
+
+ 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 6
+ 1.1. Terminology . . . . . . . . . . . . . . . . . . . . . . . 6
+ 1.2. Approach . . . . . . . . . . . . . . . . . . . . . . . . . 7
+ 1.3. Limitations . . . . . . . . . . . . . . . . . . . . . . . 7
+ 1.4. Notational Conventions . . . . . . . . . . . . . . . . . . 8
+ 1.5. XML Namespaces and Processing . . . . . . . . . . . . . . 8
+ 2. Scheduling Process . . . . . . . . . . . . . . . . . . . . . . 10
+ 3. Scheduling Support . . . . . . . . . . . . . . . . . . . . . . 11
+ 3.1. Example OPTIONS Request . . . . . . . . . . . . . . . . . 11
+ 4. Scheduling Collections . . . . . . . . . . . . . . . . . . . . 12
+ 4.1. Scheduling Outbox Collection . . . . . . . . . . . . . . . 12
+ 4.2. Scheduling Inbox Collection . . . . . . . . . . . . . . . 13
+ 4.3. Calendaring Reports Extensions . . . . . . . . . . . . . . 15
+ 5. Scheduling Transactions . . . . . . . . . . . . . . . . . . . 16
+ 5.1. Identifying Scheduling Object Resources . . . . . . . . . 16
+ 5.2. Handling Scheduling Object Resources . . . . . . . . . . . 16
+ 5.2.1. Organizer Scheduling Object Resources . . . . . . . . 16
+ 5.2.1.1. Create . . . . . . . . . . . . . . . . . . . . . . 17
+ 5.2.1.2. Modify . . . . . . . . . . . . . . . . . . . . . . 18
+ 5.2.1.3. Remove . . . . . . . . . . . . . . . . . . . . . . 20
+ 5.2.2. Attendee Scheduling Object Resources . . . . . . . . . 20
+ 5.2.2.1. Allowed Attendee Changes . . . . . . . . . . . . . 20
+ 5.2.2.2. Create . . . . . . . . . . . . . . . . . . . . . . 21
+ 5.2.2.3. Modify . . . . . . . . . . . . . . . . . . . . . . 22
+ 5.2.2.4. Remove . . . . . . . . . . . . . . . . . . . . . . 23
+ 5.2.3. HTTP Methods . . . . . . . . . . . . . . . . . . . . . 24
+ 5.2.3.1. PUT . . . . . . . . . . . . . . . . . . . . . . . 24
+ 5.2.3.2. COPY . . . . . . . . . . . . . . . . . . . . . . . 24
+ 5.2.3.3. MOVE . . . . . . . . . . . . . . . . . . . . . . . 25
+ 5.2.3.4. DELETE . . . . . . . . . . . . . . . . . . . . . . 26
+ 5.2.4. Additional Method Preconditions . . . . . . . . . . . 26
+ 5.2.4.1. CALDAV:unique-scheduling-object-resource
+ Precondition . . . . . . . . . . . . . . . . . . . 26
+ 5.2.4.2. CALDAV:same-organizer-in-all-components
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 2]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ Precondition . . . . . . . . . . . . . . . . . . . 26
+ 5.2.4.3. CALDAV:allowed-organizer-scheduling-object-chan
+ Precondition . . . . . . . . . . . . . . . . . . . 27
+ 5.2.4.4. CALDAV:allowed-attendee-scheduling-object-chang
+ Precondition . . . . . . . . . . . . . . . . . . . 28
+ 5.2.5. DTSTAMP and SEQUENCE Properties . . . . . . . . . . . 28
+ 5.2.6. Restrict Recurrence Instances Sent to Attendees . . . 28
+ 5.2.7. Forcing the Server to Send a Scheduling Message . . . 29
+ 6. Processing Incoming Scheduling Messages . . . . . . . . . . . 30
+ 6.1. Processing Organizer Requests, Additions, and
+ Cancellations . . . . . . . . . . . . . . . . . . . . . . 30
+ 6.2. Processing Attendee Replies . . . . . . . . . . . . . . . 31
+ 6.3. Scheduling Messages as Notifications . . . . . . . . . . . 31
+ 6.4. Default Calendar Collection . . . . . . . . . . . . . . . 31
+ 6.4.1. Additional Method Preconditions . . . . . . . . . . . 32
+ 6.4.1.1. CALDAV:default-calendar-needed Precondition . . . 32
+ 6.4.1.2. CALDAV:valid-schedule-default-calendar-URL
+ Precondition . . . . . . . . . . . . . . . . . . . 33
+ 7. Request for Busy Time Information . . . . . . . . . . . . . . 34
+ 7.1. Status Codes . . . . . . . . . . . . . . . . . . . . . . . 34
+ 7.2. Additional Method Preconditions . . . . . . . . . . . . . 34
+ 7.2.1. DAV:need-privileges Precondition . . . . . . . . . . . 34
+ 7.2.2. CALDAV:supported-collection Precondition . . . . . . . 35
+ 7.2.3. CALDAV:supported-calendar-data Precondition . . . . . 36
+ 7.2.4. CALDAV:valid-calendar-data Precondition . . . . . . . 36
+ 7.2.5. CALDAV:valid-scheduling-message Precondition . . . . . 37
+ 7.2.6. CALDAV:valid-organizer Precondition . . . . . . . . . 37
+ 7.2.7. CALDAV:max-resource-size Precondition . . . . . . . . 38
+ 7.3. Response to a POST request . . . . . . . . . . . . . . . . 38
+ 8. Avoiding Conflicts when Updating Scheduling Object
+ Resources . . . . . . . . . . . . . . . . . . . . . . . . . . 40
+ 8.1. PUT . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
+ 8.2. DELETE, COPY or MOVE . . . . . . . . . . . . . . . . . . . 42
+ 9. Other Scheduling Considerations . . . . . . . . . . . . . . . 44
+ 9.1. Attendee Participation Status . . . . . . . . . . . . . . 44
+ 9.2. Schedule Status Values . . . . . . . . . . . . . . . . . . 45
+ 10. Additional iCalendar Property Parameters . . . . . . . . . . . 49
+ 10.1. Schedule Agent Parameter . . . . . . . . . . . . . . . . . 49
+ 10.2. Schedule Force Send Parameter . . . . . . . . . . . . . . 50
+ 10.3. Schedule Status Parameter . . . . . . . . . . . . . . . . 51
+ 11. Additional Message Header Fields . . . . . . . . . . . . . . . 53
+ 11.1. Schedule-Reply Request Header . . . . . . . . . . . . . . 53
+ 11.2. Schedule-Tag Response Header . . . . . . . . . . . . . . . 53
+ 11.3. If-Schedule-Tag-Match Request Header . . . . . . . . . . . 54
+ 12. Additional WebDAV Properties . . . . . . . . . . . . . . . . . 55
+ 12.1. CALDAV:schedule-calendar-transp Property . . . . . . . . . 55
+ 12.2. CALDAV:schedule-default-calendar-URL Property . . . . . . 56
+ 12.3. CALDAV:schedule-tag Property . . . . . . . . . . . . . . . 57
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 3]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ 13. Scheduling Access Control . . . . . . . . . . . . . . . . . . 58
+ 13.1. Scheduling Privileges . . . . . . . . . . . . . . . . . . 58
+ 13.1.1. Privileges on Scheduling Inbox Collections . . . . . . 58
+ 13.1.1.1. CALDAV:schedule-deliver Privilege . . . . . . . . 58
+ 13.1.1.2. CALDAV:schedule-deliver-invite Privilege . . . . . 59
+ 13.1.1.3. CALDAV:schedule-deliver-reply Privilege . . . . . 59
+ 13.1.1.4. CALDAV:schedule-query-freebusy Privilege . . . . . 59
+ 13.1.2. Privileges on Scheduling Outbox Collections . . . . . 59
+ 13.1.2.1. CALDAV:schedule-send Privilege . . . . . . . . . . 59
+ 13.1.2.2. CALDAV:schedule-send-invite Privilege . . . . . . 60
+ 13.1.2.3. CALDAV:schedule-send-reply Privilege . . . . . . . 60
+ 13.1.2.4. CALDAV:schedule-send-freebusy Privilege . . . . . 60
+ 13.1.3. Aggregation of Scheduling Privileges . . . . . . . . . 60
+ 13.2. Additional Principal Properties . . . . . . . . . . . . . 61
+ 13.2.1. CALDAV:schedule-inbox-URL Property . . . . . . . . . . 61
+ 13.2.2. CALDAV:schedule-outbox-URL Property . . . . . . . . . 62
+ 13.2.3. CALDAV:calendar-user-address-set Property . . . . . . 62
+ 13.2.4. CALDAV:calendar-user-type Property . . . . . . . . . . 63
+ 14. XML Element Definitions . . . . . . . . . . . . . . . . . . . 65
+ 14.1. CALDAV:schedule-response XML Element . . . . . . . . . . . 65
+ 14.2. CALDAV:response XML Element . . . . . . . . . . . . . . . 65
+ 14.3. CALDAV:recipient XML Element . . . . . . . . . . . . . . . 65
+ 14.4. CALDAV:request-status XML Element . . . . . . . . . . . . 66
+ 15. Security Considerations . . . . . . . . . . . . . . . . . . . 67
+ 15.1. Verifying Scheduling Transactions . . . . . . . . . . . . 67
+ 15.2. Verifying Busy Time Information Requests . . . . . . . . . 67
+ 15.3. Privacy Issues . . . . . . . . . . . . . . . . . . . . . . 68
+ 16. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 69
+ 16.1. Message Header Field Registrations . . . . . . . . . . . . 69
+ 16.1.1. Schedule-Reply . . . . . . . . . . . . . . . . . . . . 69
+ 16.1.2. Schedule-Tag . . . . . . . . . . . . . . . . . . . . . 69
+ 16.1.3. If-Schedule-Tag-Match . . . . . . . . . . . . . . . . 69
+ 16.2. iCalendar Property Parameter Registrations . . . . . . . . 70
+ 16.3. iCalendar REQUEST-STATUS Value Registrations . . . . . . . 70
+ 16.4. Additional iCalendar Elements Registries . . . . . . . . . 70
+ 16.4.1. Schedule Agent Values Registry . . . . . . . . . . . . 70
+ 16.4.2. Schedule Force Send Values Registry . . . . . . . . . 71
+ 17. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . 72
+ 18. References . . . . . . . . . . . . . . . . . . . . . . . . . . 73
+ 18.1. Normative References . . . . . . . . . . . . . . . . . . . 73
+ 18.2. Informative References . . . . . . . . . . . . . . . . . . 74
+ Appendix A. Scheduling Privileges Summary . . . . . . . . . . . . 75
+ A.1. Scheduling Inbox Privileges . . . . . . . . . . . . . . . 75
+ A.2. Scheduling Outbox Privileges . . . . . . . . . . . . . . . 75
+ Appendix B. Example Scheduling Transactions . . . . . . . . . . . 77
+ B.1. Example: Organizer Inviting Multiple Attendees . . . . . . 77
+ B.2. Example: Attendee Receiving an Invitation . . . . . . . . 79
+ B.3. Example: Attendee Replying to an Invitation . . . . . . . 81
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 4]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ B.4. Example: Organizer Receiving a Reply to an Invitation . . 83
+ B.5. Example: Organizer Requesting Busy Time Information . . . 85
+ B.6. Example: User Attempting to Invite Attendee on behalf
+ of Organizer . . . . . . . . . . . . . . . . . . . . . . . 87
+ B.7. Example: Attendee Declining an Instance of a Recurring
+ Event . . . . . . . . . . . . . . . . . . . . . . . . . . 88
+ B.8. Example: Attendee Removing an Instance of a Recurring
+ Event . . . . . . . . . . . . . . . . . . . . . . . . . . 92
+ Appendix C. Changes (to be removed by RFC Editor prior to
+ publication) . . . . . . . . . . . . . . . . . . . . 95
+ C.1. Changes in -10 . . . . . . . . . . . . . . . . . . . . . . 95
+ C.2. Changes in -09 . . . . . . . . . . . . . . . . . . . . . . 95
+ C.3. Changes in -08 . . . . . . . . . . . . . . . . . . . . . . 96
+ C.4. Changes in -07 . . . . . . . . . . . . . . . . . . . . . . 97
+ C.5. Changes in -06 . . . . . . . . . . . . . . . . . . . . . . 97
+ C.6. Changes in -05 . . . . . . . . . . . . . . . . . . . . . . 98
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 5]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+1. Introduction
+
+ This document specifies extensions to the CalDAV "calendar-access"
+ [RFC4791] feature to enable scheduling of iCalendar-based [RFC5545]
+ calendar components between Calendar Users. This extension leverages
+ the scheduling methods defined in the iCalendar Transport-independent
+ Interoperability Protocol (iTIP) [RFC5546] to permit Calendar Users
+ to perform scheduling transactions such as schedule, reschedule,
+ respond to scheduling request or cancel calendar components, as well
+ as search for busy time information.
+
+ Discussion of this Internet-Draft is taking place on the mailing list
+ <https://www.ietf.org/mailman/listinfo/caldav>.
+
+1.1. Terminology
+
+ This specification uses much of the same terminology as iCalendar
+ [RFC5545], iTIP [RFC5546], WebDAV [RFC4918], and CalDAV [RFC4791].
+ The following definitions are provided to aid the reader in
+ understanding this specification.
+
+ Calendar User (CU): An entity (often a human) that accesses calendar
+ information [RFC3283].
+
+ Calendar collection: A resource that acts as a container of
+ references to child calendar object resources [RFC4791].
+
+ Calendar object resource: A resource representing a calendar object
+ (event, to-do, journal entry, or other calendar components)
+ [RFC4791].
+
+ Scheduling object resource: A calendar object resource contained in
+ a calendar collection for which the server will take care of
+ sending scheduling messages on behalf of the owner of the calendar
+ collection.
+
+ Organizer scheduling object resource: A scheduling object resource
+ owned by an Organizer.
+
+ Attendee scheduling object resource: A scheduling object resource
+ owned by an Attendee.
+
+ Automatic scheduling transaction: Add, change or remove operations
+ on a scheduling object resource for which the server will deliver
+ scheduling messages to other Calendar Users.
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 6]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ Scheduling message: A calendar object that describes a scheduling
+ transaction such as schedule, reschedule, reply, or cancel.
+
+ Scheduling Outbox collection: A resource at which busy time
+ information requests are targeted.
+
+ Scheduling Inbox collection: A collection in which incoming
+ scheduling messages are delivered.
+
+1.2. Approach
+
+ iTIP [RFC5546] outlines a model where Calendar Users exchange
+ scheduling messages with one another. Often times, clients are made
+ responsible for generating and sending scheduling messages as well as
+ processing incoming scheduling messages. This approach yields a
+ number of problems, including:
+
+ o For most updates to a calendar component, clients are responsible
+ for sending appropriate scheduling messages to the Organizer or
+ the Attendees.
+
+ o The handling of incoming scheduling messages and the updates to
+ calendars impacted by those messages only occurs when clients are
+ active.
+
+ o Due to the update latency, it is possible for calendars of
+ different Calendar Users to reflect different, inaccurate states.
+
+ This specification uses an alternative approach where the server is
+ made responsible for sending scheduling messages and processing
+ incoming scheduling messages. This approach frees the clients from
+ the submission and processing of scheduling messages and ensures
+ better consistency of calendar data across users' calendars. The
+ operation of creating, modifying or deleting a calendar component in
+ a calendar is enough to trigger the server to deliver the necessary
+ scheduling messages to the appropriate Calendar Users.
+
+1.3. Limitations
+
+ While the scheduling features described in this specification are
+ based on iTIP [RFC5546], some of its more advanced features have
+ deliberately been left out in order to keep this specification
+ simple. In particular, the following iTIP [RFC5546] features are not
+ covered: publishing, countering, delegating, refreshing and
+ forwarding calendar components, as well as replacing the Organizer of
+ a calendar component.
+
+ The goal of this specification is to provide the essential scheduling
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 7]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ features needed. It is expected that future extensions will be
+ developed to address the more advanced features.
+
+1.4. Notational Conventions
+
+ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
+ "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
+ document are to be interpreted as described in [RFC2119].
+
+ The Augmented BNF (ABNF) syntax used by this document to specify the
+ format definition of new iCalendar elements is defined in [RFC5234].
+
+ The Augmented BNF (ABNF) syntax used by this document to specify the
+ format definition of new message header fields to be used with the
+ HTTP/1.1 protocol is described in Section 2.1 of [RFC2616]. Since
+ this Augmented BNF uses the basic production rules provided in
+ Section 2.2 of [RFC2616], these rules apply to this document as well.
+
+ The term "protected" is used in the Conformance field of WebDAV
+ property definitions as defined in Section 15 of [RFC4918].
+
+1.5. XML Namespaces and Processing
+
+ This document uses XML DTD fragments ([W3C.REC-xml-20081126], Section
+ 3.2) as a purely notational convention. WebDAV request and response
+ bodies cannot be validated by a DTD due to the specific extensibility
+ rules defined in Section 17 of [RFC4918] and due to the fact that all
+ XML elements defined by that specification use the XML namespace name
+ "DAV:". In particular:
+
+ 1. element names use the "DAV:" namespace,
+
+ 2. element ordering is irrelevant unless explicitly stated,
+
+ 3. extension elements (elements not already defined as valid child
+ elements) may be added anywhere, except when explicitly stated
+ otherwise,
+
+ 4. extension attributes (attributes not already defined as valid for
+ this element) may be added anywhere, except when explicitly
+ stated otherwise.
+
+ The XML elements specified in this document are defined in the
+ "urn:ietf:params:xml:ns:caldav" XML namespace registered by CalDAV
+ [RFC4791].
+
+ When XML element types in the namespaces "DAV:" and
+ "urn:ietf:params:xml:ns:caldav" are referenced in this document
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 8]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ outside of the context of an XML fragment, the strings "DAV:" and
+ "CALDAV:" will be prefixed to the element types, respectively.
+
+ This document inherits, and sometimes extends, DTD productions from
+ Section 14 of [RFC4918].
+
+ Also note that some CalDAV XML element names are identical to WebDAV
+ XML element names, though their namespace differs. Care must be
+ taken not to confuse the two sets of names.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 9]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+2. Scheduling Process
+
+ The process of scheduling an event between different parties often
+ involves a series of steps with different actors playing particular
+ roles during the whole process. Typically there is an event
+ "Organizer" whose role is to schedule an event between one or more
+ "Attendees", and this is done by sending out invitations and handling
+ responses from each Attendee.
+
+ This process can typically be broken down into two phases.
+
+ In the first phase, the Organizer will query the busy time
+ information of each Attendee to determine the most appropriate time
+ for the event. This request is sometimes called a "freebusy" lookup.
+
+ In the second phase, the Organizer sends out invitations to each
+ Attendee using the time previously determined from the freebusy
+ lookup. There then follows exchanges between Organizer and Attendees
+ regarding the invitation. Some Attendees may choose to attend at the
+ time proposed by the Organizer, others may decline to attend. The
+ Organizer needs to process each of the replies from the Attendees and
+ take appropriate action to confirm the event, reschedule it or
+ perhaps cancel it.
+
+ The user expectation as to how a calendaring and scheduling system
+ should respond in each of these two phases is somewhat different. In
+ the case of a freebusy lookup, users expect to get back results
+ immediately so that they can then move on to the invitation phase as
+ quickly as possible. In the case of invitations, it is expected that
+ each Attendee will reply with their participation status in their own
+ time, so delays in receiving replies are anticipated. Thus
+ calendaring and scheduling systems should treat these two operational
+ phases in different ways to accommodate the user expectations, which
+ is what this specification does.
+
+ While the scenario described above only covers the case of scheduling
+ events between Calendar Users, and requesting busy time information,
+ this specification also provides support for the scheduling of to-dos
+ between Calendar Users. For the majority of the following
+ discussion, scheduling of events and freebusy lookups will be
+ discussed, as these are the more common operations.
+
+
+
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 10]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+3. Scheduling Support
+
+ A server that supports the features described in this document MUST
+ include "calendar-auto-schedule" as a field in the DAV response
+ header from an OPTIONS request on any resource that supports any
+ scheduling actions, properties, privileges or methods.
+
+ To advertise support for the CalDAV "calendar-auto-schedule" feature
+ a server is REQUIRED to support and advertise support for the CalDAV
+ "calendar-access" [RFC4791] feature.
+
+3.1. Example OPTIONS Request
+
+ In this example, the OPTIONS response indicates that the server
+ supports the "calendar-access" and "calendar-auto-schedule" features
+ and that the resource "/home/cyrus/calendars/inbox/" supports the
+ scheduling actions, properties, privileges and methods defined in
+ this specification.
+
+ >> Request <<
+
+ OPTIONS /home/cyrus/calendars/inbox/ HTTP/1.1
+ Host: cal.example.com
+
+ >> Response <<
+
+ HTTP/1.1 204 No Content
+ Date: Thu, 31 Mar 2011 09:00:00 GMT
+ Allow: OPTIONS, GET, HEAD, DELETE, TRACE, PROPFIND
+ Allow: PROPPATCH, LOCK, UNLOCK, REPORT, ACL
+ DAV: 1, 2, 3, access-control
+ DAV: calendar-access, calendar-auto-schedule
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 11]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+4. Scheduling Collections
+
+ This specification introduces new collection resource types that are
+ used to manage scheduling object resources, and scheduling
+ privileges, as well as provide scheduling functionality. It is the
+ server's responsibility to create these collection resources, and
+ clients have no way to create or delete them.
+
+4.1. Scheduling Outbox Collection
+
+ A scheduling Outbox collection is used as the target for busy time
+ information requests, and to manage privileges that apply to outgoing
+ scheduling requests.
+
+ A scheduling Outbox collection MUST report the DAV:collection and
+ CALDAV:schedule-outbox XML elements in the value of the DAV:
+ resourcetype property. The element type declaration for CALDAV:
+ schedule-outbox is:
+
+ <!ELEMENT schedule-outbox EMPTY>
+
+ Example:
+
+ <D:resourcetype xmlns:D="DAV:">
+ <D:collection/>
+ <C:schedule-outbox xmlns:C="urn:ietf:params:xml:ns:caldav"/>
+ </D:resourcetype>
+
+ New WebDAV ACL [RFC3744] privileges can be set on the scheduling
+ Outbox collection to control who is allowed to send scheduling
+ messages on behalf of the Calendar User associated with the
+ scheduling Outbox collection. See Section 13.1 for more details.
+
+ A scheduling Outbox collection MUST NOT be a child (at any depth) of
+ a calendar collection resource.
+
+ The following WebDAV properties specified in CalDAV "calendar-access"
+ [RFC4791] MAY also be defined on scheduling Outbox collections:
+
+ CALDAV:supported-calendar-component-set - when present this
+ indicates the allowed calendar component types for scheduling
+ messages submitted to the scheduling Outbox collection with the
+ POST method.
+
+ CALDAV:supported-calendar-data - when present this indicates the
+ allowed media types for scheduling messages submitted to the
+ scheduling Outbox collection with the POST method.
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 12]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ CALDAV:max-resource-size - when present this indicates the maximum
+ size in octets of a resource that the server is willing to accept
+ for scheduling messages submitted to the scheduling Outbox
+ collection with the POST method.
+
+ CALDAV:min-date-time - when present this indicates the earliest
+ date and time (in UTC) that the server is willing to accept for
+ any DATE or DATE-TIME value in scheduling messages submitted to
+ the scheduling Outbox collection with the POST method.
+
+ CALDAV:max-date-time - when present this indicates the latest date
+ and time (in UTC) that the server is willing to accept for any
+ DATE or DATE-TIME value in scheduling messages submitted to the
+ scheduling Outbox collection with the POST method.
+
+ CALDAV:max-attendees-per-instance - when present this indicates
+ the maximum number of ATTENDEE properties in any instance of
+ scheduling messages submitted to the scheduling Outbox collection
+ with the POST method. Specifically, this limits the total number
+ of Attendees whose freebusy information can be queried in a single
+ request.
+
+ The use of child resources in a scheduling Outbox collection is
+ reserved for future revisions or extensions of this specification.
+
+4.2. Scheduling Inbox Collection
+
+ A scheduling Inbox collection contains copies of incoming scheduling
+ messages. These may be requests sent by an Organizer, or replies
+ sent by an Attendee in response to a request. The scheduling Inbox
+ collection is also used to manage scheduling privileges.
+
+ A scheduling Inbox collection MUST report the DAV:collection and
+ CALDAV:schedule-inbox XML elements in the value of the DAV:
+ resourcetype property. The element type declaration for CALDAV:
+ schedule-inbox is:
+
+ <!ELEMENT schedule-inbox EMPTY>
+
+ Example:
+
+ <D:resourcetype xmlns:D="DAV:">
+ <D:collection/>
+ <C:schedule-inbox xmlns:C="urn:ietf:params:xml:ns:caldav"/>
+ </D:resourcetype>
+
+ Scheduling Inbox collections MUST only contain calendar object
+ resources that obey the restrictions specified in iTIP [RFC5546].
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 13]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ Consequently, scheduling Inbox collections MUST NOT contain any types
+ of collection resources. Restrictions defined in Section 4.1 of
+ CalDAV "calendar-access" [RFC4791] on calendar object resources
+ contained in calendar collections (e.g., "UID" uniqueness) do not
+ apply to calendar object resources contained in a scheduling Inbox
+ collection. Thus, multiple calendar object resources contained in a
+ scheduling Inbox collection can have the same "UID" property value
+ (i.e., multiple scheduling messages for the same calendar component).
+
+ New WebDAV ACL [RFC3744] privileges can be set on the scheduling
+ Inbox collection to control from whom the Calendar User associated
+ with the scheduling Inbox collection will accept scheduling messages
+ from. See Section 13.1 for more details.
+
+ A scheduling Inbox collection MUST NOT be a child (at any depth) of a
+ calendar collection resource.
+
+ The following WebDAV properties specified in CalDAV "calendar-access"
+ [RFC4791] MAY also be defined on scheduling Inbox collections:
+
+ CALDAV:calendar-timezone - when present this contains a time zone
+ that the server can use when calendar date-time operations are
+ carried out, for example when a time-range CALDAV:calendar-query
+ REPORT is targeted at a scheduling Inbox collection.
+
+ CALDAV:supported-calendar-component-set - when present this
+ indicates the allowed calendar component types for scheduling
+ messages delivered to the scheduling Inbox collection.
+
+ CALDAV:supported-calendar-data - when present this indicates the
+ allowed media types for scheduling messages delivered to the
+ scheduling Inbox collection.
+
+ CALDAV:max-resource-size - when present this indicates the maximum
+ size in octets of a resource that the server is willing to accept
+ for scheduling messages delivered to the scheduling Inbox
+ collection.
+
+ CALDAV:min-date-time - when present this indicates the earliest
+ date and time (in UTC) that the server is willing to accept for
+ any DATE or DATE-TIME value in scheduling messages delivered to
+ the scheduling Inbox collection.
+
+ CALDAV:max-date-time - when present this indicates the latest date
+ and time (in UTC) that the server is willing to accept for any
+ DATE or DATE-TIME value in scheduling messages delivered to the
+ scheduling Inbox collection.
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 14]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ CALDAV:max-instances - when present this indicates the maximum
+ number of recurrence instances in scheduling messages delivered to
+ the scheduling Inbox collection.
+
+ CALDAV:max-attendees-per-instance - when present this indicates
+ the maximum number of ATTENDEE properties in any instance of
+ scheduling messages delivered to the scheduling Inbox collection.
+
+4.3. Calendaring Reports Extensions
+
+ This specification extends the CALDAV:calendar-query and CALDAV:
+ calendar-multiget REPORTs to return results for calendar object
+ resources in scheduling Inbox collections.
+
+ When a CALDAV:calendar-query REPORT includes a time-range query and
+ targets a scheduling Inbox collection, if any calendar object
+ resources contain "VEVENT" calendar components that do not include a
+ "DTSTART" iCalendar property (as allowed by iTIP [RFC5546]) then such
+ components MUST always match the time-range query test.
+
+ Note that the CALDAV:free-busy-query REPORT is not supported on
+ scheduling Inbox collections.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 15]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+5. Scheduling Transactions
+
+ When a calendar object resource is created, modified or removed from
+ a calendar collection, the server examines the calendar data and
+ checks to see whether the data represents a scheduling object
+ resource. If it does, the server will automatically attempt to
+ deliver a scheduling message to the appropriate Calendar Users.
+ Several types of scheduling operations can occur in this case,
+ equivalent to iTIP "REQUEST", "REPLY", "CANCEL", and "ADD"
+ operations.
+
+5.1. Identifying Scheduling Object Resources
+
+ Calendar object resources on which the server performs automatic
+ scheduling transactions are referred to as scheduling object
+ resources. There are two types of scheduling object resources:
+ organizer scheduling object resources, and attendee scheduling object
+ resources.
+
+ A calendar object resource is considered to be a valid organizer
+ scheduling object resource if the "ORGANIZER" iCalendar property is
+ present and set in all the calendar components to a value that
+ matches one of the calendar user addresses of the owner of the
+ calendar collection.
+
+ A calendar object resource is considered to be a valid attendee
+ scheduling object resource if the "ORGANIZER" iCalendar property is
+ present and set in all the calendar components to the same value and
+ doesn't match one of the calendar user addresses of the owner of the
+ calendar collection, and at least one of the "ATTENDEE" iCalendar
+ property values matches one of the calendar user addresses of the
+ owner of the calendar collection.
+
+ The creation of attendee scheduling object resources is typically
+ done by the server, with the resource being created in an appropriate
+ calendar collection (see Section 6.4).
+
+5.2. Handling Scheduling Object Resources
+
+ The server's behavior when processing a scheduling object resource
+ depends on whether it is owned by the Organizer or an Attendee
+ specified in the calendar data.
+
+5.2.1. Organizer Scheduling Object Resources
+
+ An Organizer can create, modify or remove a scheduling object
+ resource. The create, modify and remove behaviors for the server are
+ each described next, and the way these are invoked via HTTP requests
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 16]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ is described in Section 5.2.3.
+
+ The Organizer of a calendar component may also be an Attendee of that
+ calendar component. In such cases the server MUST NOT send a
+ scheduling message to the Attendee that matches the Organizer.
+
+5.2.1.1. Create
+
+ When a scheduling object resource is created by the Organizer, the
+ server will inspect each "ATTENDEE" property to determine if a
+ scheduling message should be delivered to this Attendee according to
+ the value of the "SCHEDULE-AGENT" property parameter (see
+ Section 10.1) as described in the table below:
+
+ +------------------+-------------+
+ | SCHEDULE-AGENT | iTIP METHOD |
+ +==================+=============+
+ | SERVER (default) | REQUEST |
+ +------------------+-------------+
+ | CLIENT | -- |
+ +------------------+-------------+
+ | NONE | -- |
+ +------------------+-------------+
+
+ The attempt to deliver the scheduling message will either succeed or
+ fail. In all cases, the server MUST add a "SCHEDULE-STATUS"
+ iCalendar property parameter (see Section 10.3) to the "ATTENDEE"
+ iCalendar property in the scheduling object resource being created,
+ and set its value as described in Section 9.2. This will result in
+ the created calendar object resource differing from the calendar data
+ sent in the HTTP request. As a result clients MAY reload the
+ calendar data from the server in order to update to the new server
+ generated state information. Servers MUST NOT set the "SCHEDULE-
+ STATUS" property parameter on the "ATTENDEE" property of Attendees
+ for which it did not attempt to deliver a scheduling message.
+
+ Restrictions:
+
+ 1. The server SHOULD reject any attempt to set the "PARTSTAT"
+ iCalendar property parameter value of the "ATTENDEE" iCalendar
+ property of other users in the calendar object resource to a
+ value other than "NEEDS-ACTION" if the "SCHEDULE-AGENT" property
+ parameter value is not present or set to the value "SERVER".
+
+ 2. The server MAY reject attempts to create a scheduling object
+ resource that specifies a "UID" property value already specified
+ in a scheduling object resource contained in another calendar
+ collection of the Organizer.
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 17]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ 3. The server MUST take into account scheduling privileges as
+ described in Section 13.1 when handling the creation of a
+ scheduling object resource.
+
+ 4. Restrictions on calendar object resources defined in Section 4.1
+ of [RFC4791] MUST also be enforced.
+
+ The server MUST return an error with the CALDAV:allowed-organizer-
+ scheduling-object-change precondition code (Section 5.2.4.3) when the
+ Organizer attempts to change the iCalendar data in a manner that is
+ forbidden.
+
+5.2.1.2. Modify
+
+ When a scheduling object resource is modified by the Organizer, the
+ server will inspect each "ATTENDEE" property in the new calendar data
+ to determine which ones have the "SCHEDULE-AGENT" iCalendar property
+ parameter. It will then need to compare this with the "ATTENDEE"
+ properties in the existing calendar object resource that is being
+ modified.
+
+ For each Attendee in the old and new calendar data on a per-instance
+ basis, and taking into account the addition or removal of Attendees,
+ the server will determine whether to deliver a scheduling message to
+ the Attendee. The following table determines whether the server
+ needs to deliver a scheduling message, and if so which iTIP
+ scheduling method to use. The values "SERVER", "CLIENT", and "NONE"
+ in the top and left titles of the table refer to the "SCHEDULE-AGENT"
+ parameter value of the "ATTENDEE" property, and the values "<Absent>"
+ and "<Removed>" are used to cover the cases where the "ATTENDEE"
+ property is not present (Old) or is being removed (New).
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 18]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ +---------------+-----------------------------------------------+
+ | | New |
+ | ATTENDEE +-----------+-----------+-----------+-----------+
+ | | <Removed> | SERVER | CLIENT | NONE |
+ | | | (default) | | |
+ +===+===========+===========+===========+===========+===========+
+ | | <Absent> | -- | REQUEST / | -- | -- |
+ | | | | ADD | | |
+ | +-----------+-----------+-----------+-----------+-----------+
+ | | SERVER | CANCEL | REQUEST | CANCEL | CANCEL |
+ | O | (default) | | | | |
+ | l +-----------+-----------+-----------+-----------+-----------+
+ | d | CLIENT | -- | REQUEST / | -- | -- |
+ | | | | ADD | | |
+ | +-----------+-----------+-----------+-----------+-----------+
+ | | NONE | -- | REQUEST / | -- | -- |
+ | | | | ADD | | |
+ +---+-----------+-----------+-----------+-----------+-----------+
+
+ The attempt to deliver the scheduling message will either succeed or
+ fail. In all cases, the server MUST add a "SCHEDULE-STATUS"
+ iCalendar property parameter to the "ATTENDEE" iCalendar property in
+ the scheduling object resource being modified, and set its value as
+ described in Section 9.2. This will result in the created calendar
+ object resource differing from the calendar data sent in the HTTP
+ request. As a result clients MAY reload the calendar data from the
+ server in order to update to the new server generated state
+ information.
+
+ Restrictions:
+
+ 1. The server MAY reject any attempt to set the "PARTSTAT" iCalendar
+ property parameter value of the "ATTENDEE" iCalendar property of
+ other users in the calendar object resource to a value other than
+ "NEEDS-ACTION" if the "SCHEDULE-AGENT" property parameter value
+ is not present or set to the value "SERVER".
+
+ 2. The server MUST take into account scheduling privileges as
+ described in Section 13.1 when handling the modification of a
+ scheduling object resource.
+
+ 3. Restrictions on calendar object resources defined in Section 4.1
+ of [RFC4791] MUST also be enforced.
+
+ The server MUST return an error with the CALDAV:allowed-organizer-
+ scheduling-object-change precondition code (Section 5.2.4.3) when the
+ Organizer attempts to change the iCalendar data in a manner that is
+ forbidden.
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 19]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+5.2.1.3. Remove
+
+ When a scheduling object resource is removed by the Organizer, the
+ server will inspect each "ATTENDEE" property in the scheduling object
+ resource being removed to determine which ones have the "SCHEDULE-
+ AGENT" iCalendar property parameter.
+
+ For each Attendee the server will determine whether to attempt to
+ deliver a scheduling message into the Attendee's scheduling Inbox
+ collection, based on the table below:
+
+ +------------------+-------------+
+ | SCHEDULE-AGENT | iTIP METHOD |
+ +==================+=============+
+ | SERVER (default) | CANCEL |
+ +------------------+-------------+
+ | CLIENT | -- |
+ +------------------+-------------+
+ | NONE | -- |
+ +------------------+-------------+
+
+ Restrictions:
+
+ 1. The server MUST take into account scheduling privileges as
+ described in Section 13.1 when handling the deletion of a
+ scheduling object resource.
+
+5.2.2. Attendee Scheduling Object Resources
+
+ An Attendee can create, modify or remove a scheduling object resource
+ by issuing HTTP requests with an appropriate method. The create,
+ modify and remove behaviors for the server are each described next,
+ and the way these are invoked via HTTP requests is described in
+ Section 5.2.3.
+
+5.2.2.1. Allowed Attendee Changes
+
+ Attendees are allowed to make some changes to a scheduling object
+ resource, though key properties such as start time, end time,
+ location, and summary are typically under the control of the
+ Organizer.
+
+ The server MUST allow Attendees to:
+
+ 1. change their own "PARTSTAT" iCalendar property parameter value.
+
+ 2. add, modify or remove any "TRANSP" iCalendar properties.
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 20]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ 3. add, modify or remove any "PERCENT-COMPLETE" iCalendar
+ properties.
+
+ 4. add, modify or remove any "COMPLETED" iCalendar properties.
+
+ 5. add, modify or remove any "VALARM" iCalendar components.
+
+ 6. add, modify or remove the "CALSCALE" iCalendar property within
+ the top-level "VCALENDAR" component.
+
+ 7. modify the "PRODID" iCalendar property within the top-level
+ "VCALENDAR" component.
+
+ 8. add "EXDATE" iCalendar properties and possibly remove components
+ for overridden recurrence instances.
+
+ 9. add, modify or remove any "CREATED", "DTSTAMP" and "LAST-
+ MODIFIED" iCalendar properties.
+
+ 10. add, modify or remove "SCHEDULE-STATUS" iCalendar property
+ parameters on "ATTENDEE" properties that have a "SCHEDULE-AGENT"
+ parameter set to "CLIENT".
+
+ 11. add new components to represent overridden recurrence instances,
+ provided the only changes to the recurrence instance follow the
+ rules above.
+
+ The server MUST return an error with the CALDAV:allowed-attendee-
+ scheduling-object-change precondition code (Section 5.2.4.4) when the
+ Attendee attempts to change the iCalendar data in a manner forbidden
+ by the server.
+
+5.2.2.2. Create
+
+ Typically an Attendee does not create scheduling object resources, as
+ scheduling messages delivered to them on the server are automatically
+ processed by the server and placed on one of their calendars (see
+ Section 6). However, in some cases a scheduling message may get
+ delivered directly to the client, and the Attendee may wish to store
+ that on the server. In that case the client creates a scheduling
+ object resource in a suitable calendar belonging to the Attendee. It
+ can then set the "SCHEDULE-AGENT" iCalendar property parameter on all
+ "ORGANIZER" iCalendar properties in the resource to determine how the
+ server treats the resource. The value of the "SCHEDULE-AGENT"
+ iCalendar property parameter on all "ORGANIZER" iCalendar properties
+ MUST be the same.
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 21]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ +----------------+--------------------------------------------------+
+ | SCHEDULE-AGENT | Action |
+ +----------------+--------------------------------------------------+
+ | SERVER | The server will attempt to process changes to |
+ | (default) | the resource using the normal rules for attendee |
+ | | scheduling object resources. |
+ | | |
+ | CLIENT | The server does no special processing of the |
+ | | resource. The client is assumed to be handling |
+ | | Attendee replies etc. |
+ | | |
+ | NONE | The server does no special processing of the |
+ | | resource. |
+ +----------------+--------------------------------------------------+
+
+ In some cases a server may not be able to process an Attendee
+ scheduling object resource that originated from another system (i.e.,
+ where the server is unable to deliver scheduling messages to the
+ Organizer). In such cases the server MUST add a "SCHEDULE-STATUS"
+ iCalendar property parameter to all "ORGANIZER" iCalendar properties
+ in the resource with a suitable value indicating a error.
+
+5.2.2.3. Modify
+
+ When a scheduling object resource is modified by an Attendee, the
+ server behavior depends on the value of the "SCHEDULE-AGENT"
+ iCalendar property parameter on the "ORGANIZER" iCalendar properties:
+
+ +----------------+--------------------------------------------------+
+ | SCHEDULE-AGENT | Action |
+ +----------------+--------------------------------------------------+
+ | SERVER | The server will attempt to process the removal |
+ | (default) | using the behavior listed below. |
+ | | |
+ | CLIENT | The server does no special processing of the |
+ | | resource. The client is assumed to be handling |
+ | | any Attendee replies etc. |
+ | | |
+ | NONE | The server does no special processing of the |
+ | | resource. |
+ +----------------+--------------------------------------------------+
+
+ The server will inspect the changes by comparing the new scheduling
+ object resource with the existing scheduling object resource.
+
+ If the Attendee changes one or more "PARTSTAT" iCalendar property
+ values on any component, or adds an overridden component with a
+ changed "PARTSTAT" property, then the server MUST deliver an iTIP
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 22]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ "REPLY" scheduling message to the Organizer to indicate the new
+ participation status of the Attendee.
+
+ If the Attendee adds an "EXDATE" property value to effectively remove
+ a recurrence instance, the server MUST deliver an iTIP "REPLY"
+ scheduling message to the Organizer to indicate that the Attendee has
+ declined the instance (i.e., the Attendee's "PARTSTAT" iCalendar
+ property parameter value is set to "DECLINED").
+
+ The attempt to deliver the scheduling message will either succeed or
+ fail. In all cases, the server MUST add a "SCHEDULE-STATUS"
+ iCalendar property parameter to the "ORGANIZER" iCalendar property in
+ the scheduling object resource being created, and set its value as
+ described in Section 9.2. This will result in the created calendar
+ object resource differing from the calendar data sent in the HTTP
+ request. As a result clients MAY reload the calendar data from the
+ server in order to update to the new server generated state
+ information.
+
+5.2.2.4. Remove
+
+ When a scheduling object resource is removed by an Attendee, the
+ server behavior depends on the value of the "SCHEDULE-AGENT"
+ iCalendar property parameter on the "ORGANIZER" iCalendar properties:
+
+ +----------------+--------------------------------------------------+
+ | SCHEDULE-AGENT | Action |
+ +----------------+--------------------------------------------------+
+ | SERVER | The server will attempt to process the removal |
+ | (default) | using either behaviors (1) or (2) listed below. |
+ | | |
+ | CLIENT | The server does no special processing of the |
+ | | resource. The client is assumed to be handling |
+ | | any Attendee replies etc. |
+ | | |
+ | NONE | The server does no special processing of the |
+ | | resource. |
+ +----------------+--------------------------------------------------+
+
+ 1. If the HTTP request contains a "Schedule-Reply" request header
+ set to the value "T" or there is no "Schedule-Reply" request
+ header, then the server MUST attempt to deliver a scheduling
+ message to the Organizer indicating that the Attendee has a
+ "PARTSTAT" iCalendar property parameter value set to "DECLINED".
+ That is, the Attendee has chosen not to attend any instances. If
+ the server is unable to deliver the scheduling message, the
+ remove action MUST fail, and an appropriate "SCHEDULE-STATUS"
+ iCalendar property parameter set on the "ORGANIZER" property in
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 23]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ the scheduling object resource stored by the server.
+
+ 2. If the HTTP request contains a "Schedule-Reply" request header
+ set to the value "F", the server MUST NOT attempt to deliver a
+ scheduling message. The resource is simply removed. This
+ provides the client a way to silently remove unwanted scheduling
+ messages.
+
+5.2.3. HTTP Methods
+
+ This section describes how use of various HTTP methods on a
+ scheduling object resource will cause a create, modify or remove
+ action on that resource as described above. The use of these methods
+ is subject to the restrictions in [RFC4791], in addition to what is
+ described below.
+
+5.2.3.1. PUT
+
+ When a PUT method request is received, the server will execute the
+ following actions, provided all appropriate preconditions are met:
+
+ +--------------------------+--------------------------+-------------+
+ | Existing Destination | Resulting Destination | Server |
+ | Resource | Resource | Action |
+ +--------------------------+--------------------------+-------------+
+ | None | Calendar object resource | None |
+ | | | |
+ | None | Scheduling object | Create |
+ | | resource | |
+ | | | |
+ | Calendar object resource | Calendar object resource | None |
+ | | | |
+ | Calendar object resource | Scheduling object | Create |
+ | | resource | |
+ | | | |
+ | Scheduling object | Calendar object resource | Remove |
+ | resource | | |
+ | | | |
+ | Scheduling object | Scheduling object | Modify |
+ | resource | resource | |
+ +--------------------------+--------------------------+-------------+
+
+5.2.3.2. COPY
+
+ When a COPY method request is received, the server will execute the
+ following actions based on the source and destination collections in
+ the request:
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 24]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ +-------------------------+-------------------------+---------------+
+ | Source Collection | Destination Collection | Server Action |
+ +-------------------------+-------------------------+---------------+
+ | Non-calendar collection | Non-calendar collection | None |
+ | | | |
+ | Non-calendar collection | Calendar collection | (1) |
+ | | | |
+ | Calendar collection | Non-calendar collection | None |
+ | | | |
+ | Calendar collection | Calendar collection | (2) |
+ +-------------------------+-------------------------+---------------+
+
+ Note 1. The same rules as used for PUT above are applied for the
+ destination of the COPY request.
+
+ Note 2. The server MAY reject this as per Section 5.2.4.1, otherwise
+ None.
+
+ The behavior of a COPY method request on a calendar collection is
+ undefined.
+
+5.2.3.3. MOVE
+
+ When a MOVE method request is received, the server will execute the
+ following actions based on the source and destination collections in
+ the request:
+
+ +-------------------------+-------------------------+---------------+
+ | Source Collection | Destination Collection | Server Action |
+ +-------------------------+-------------------------+---------------+
+ | Non-calendar collection | Non-calendar collection | None |
+ | | | |
+ | Non-calendar collection | Calendar collection | (1) |
+ | | | |
+ | Calendar collection | Non-calendar collection | (2) |
+ | | | |
+ | Calendar collection | Calendar collection | None |
+ +-------------------------+-------------------------+---------------+
+
+ Note 1. The same rules as used for PUT above are applied for the
+ destination of the MOVE request.
+
+ Note 2. The same rules as used for DELETE below are applied for the
+ source of the MOVE request.
+
+ The behavior of a MOVE method request on a calendar collection is
+ undefined.
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 25]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+5.2.3.4. DELETE
+
+ When a DELETE method is targeted at a scheduling object resource the
+ server will execute the Remove action.
+
+ When a DELETE method is targeted at a calendar collection the server
+ will execute the Remove action on all scheduling object resources
+ contained in the calendar collection.
+
+5.2.4. Additional Method Preconditions
+
+ This specification defines method preconditions (see Section 16 of
+ WebDAV [RFC4918]), in addition to the ones in [RFC4791], to provide
+ machine-parsable information in error responses.
+
+5.2.4.1. CALDAV:unique-scheduling-object-resource Precondition
+
+ Name: unique-scheduling-object-resource
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Apply to: PUT, COPY, and MOVE
+
+ Use with: 403 Forbidden
+
+ Purpose: (precondition) -- Servers MAY reject requests to create a
+ scheduling object resource with an iCalendar "UID" property value
+ already in use by another scheduling object resource owned by the
+ same user in other calendar collections. Servers SHOULD report
+ the URL of the scheduling object resource that is already making
+ use of the same "UID" property value in the DAV:href element.
+
+ Definition:
+
+ <!ELEMENT unique-scheduling-object-resource (DAV:href?)>
+
+ Example:
+
+ <C:unique-scheduling-object-resource xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:href>/home/bernard/calendars/personal/abc123.ics</D:href>
+ </C:unique-scheduling-object-resource>
+
+5.2.4.2. CALDAV:same-organizer-in-all-components Precondition
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 26]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ Name: same-organizer-in-all-components
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Apply to: PUT, COPY, and MOVE
+
+ Use with: 403 Forbidden
+
+ Purpose: (precondition) -- All the calendar components in a
+ scheduling object resource MUST contain the same "ORGANIZER"
+ property value when present.
+
+ Definition:
+
+ <!ELEMENT same-organizer-in-all-components EMPTY>
+
+ Example:
+
+ <C:same-organizer-in-all-components
+ xmlns:C="urn:ietf:params:xml:ns:caldav"/>
+
+5.2.4.3. CALDAV:allowed-organizer-scheduling-object-change Precondition
+
+ Name: allowed-organizer-scheduling-object-change
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Apply to: PUT, COPY, and MOVE
+
+ Use with: 403 Forbidden
+
+ Purpose: (precondition) -- Servers MAY impose restrictions on
+ modifications allowed by an Organizer. For instance, servers MAY
+ prevent the Organizer setting the "PARTSTAT" property parameter to
+ a value other than "NEEDS-ACTION" if the corresponding "ATTENDEE"
+ property has the "SCHEDULE-AGENT" property parameter set to
+ "SERVER", or has no "SCHEDULE-AGENT" property parameter. See
+ Section 5.2.1.
+
+ Definition:
+
+ <!ELEMENT allowed-organizer-scheduling-object-change EMPTY>
+
+ Example:
+
+ <C:allowed-organizer-scheduling-object-change
+ xmlns:C="urn:ietf:params:xml:ns:caldav"/>
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 27]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+5.2.4.4. CALDAV:allowed-attendee-scheduling-object-change Precondition
+
+ Name: allowed-attendee-scheduling-object-change
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Apply to: PUT, COPY, and MOVE
+
+ Use with: 403 Forbidden
+
+ Purpose: (precondition) -- Servers MAY impose restrictions on
+ modifications allowed by an Attendee. Attendee modifications that
+ servers MUST allow are specified in Section 5.2.2.1.
+
+ Definition:
+
+ <!ELEMENT allowed-attendee-scheduling-object-change EMPTY>
+
+ Example:
+
+ <C:allowed-attendee-scheduling-object-change
+ xmlns:C="urn:ietf:params:xml:ns:caldav"/>
+
+5.2.5. DTSTAMP and SEQUENCE Properties
+
+ Whenever the server generates a scheduling message for delivery to a
+ Calendar User, it MUST ensure that a "DTSTAMP" iCalendar property is
+ present and MUST set the value to the UTC time that the scheduling
+ message was generated (as required by iCalendar).
+
+ iTIP [RFC5546] places certain requirements on how the "SEQUENCE"
+ iCalendar property value in scheduling messages changes. The server
+ MUST ensure that for each type of scheduling operation, the
+ "SEQUENCE" iCalendar property value is appropriately updated. If the
+ client does not update the "SEQUENCE" iCalendar property itself when
+ that is required, the server MUST update the property.
+
+5.2.6. Restrict Recurrence Instances Sent to Attendees
+
+ When delivering scheduling messages for recurring calendar components
+ to Attendees, servers MUST ensure that Attendees only get information
+ about recurrence instances that explicitly include them as an
+ Attendee.
+
+ For example, if an Attendee is invited to a single recurrence
+ instance of a recurring event, and no others, the scheduling object
+ resource contained in the Organizer's calendar collection will
+ contain an overridden instance in the form of a separate calendar
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 28]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ component. That separate calendar component will include the
+ "ATTENDEE" property referencing the "one-off" Attendee. That
+ Attendee will not be listed in any other calendar components in the
+ scheduling object resource. Any scheduling messages delivered to the
+ Attendee will only contain information about this overridden
+ instance.
+
+ As another example, an Attendee could be excluded from one instance
+ of a recurring event. In that case the scheduling object resource
+ contained in the calendar collection of the Organizer will include an
+ overridden instance with an "ATTENDEE" list that does not include the
+ Attendee being excluded. The scheduling message that will be
+ delivered to the Attendee will not specify the overridden instance
+ but rather include an "EXDATE" property in the master recurring
+ component defining the recurrence set.
+
+5.2.7. Forcing the Server to Send a Scheduling Message
+
+ The iCalendar property parameter "SCHEDULE-FORCE-SEND" defined in
+ Section 10.2 can be used by a Calendar User to force the server to
+ send a scheduling message to an Attendee or the Organizer in a
+ situation where the server would not normally send a scheduling
+ message. For instance, an Organizer could use this property
+ parameter to request an Attendee, that previously declined an
+ invitation, to reconsider their participation status without being
+ forced to modify the event.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 29]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+6. Processing Incoming Scheduling Messages
+
+ Scheduling operations can cause the delivery of a scheduling message
+ into an Organizer's or Attendee's scheduling Inbox collection. In
+ the former case the scheduling messages are replies from Attendees,
+ in the latter case the scheduling messages are requests,
+ cancellations or additions from the Organizer.
+
+ Servers MUST automatically process incoming scheduling messages using
+ the rules defined by [RFC5546], by creating or updating the
+ corresponding scheduling object resources on calendars owned by the
+ owner of the scheduling Inbox collection. In addition, the
+ scheduling message is stored in the scheduling Inbox collection as an
+ indicator to the client that a scheduling operation has taken place.
+
+ The server MUST take into account privileges on the scheduling Inbox
+ collection when processing incoming scheduling messages, to determine
+ whether delivery of the scheduling message is allowed. Privileges on
+ calendars containing any matching scheduling object resource are not
+ considered in this case (i.e., a schedule message from another user
+ can cause modifications to resources in calendar collections that the
+ other user would not normally have read or write access to).
+ Additionally, servers MUST take into account any scheduling Inbox
+ collection preconditions (see Section 4.2) when delivering the
+ scheduling message, and it MUST take into account the similar
+ preconditions on any calendar collection which contains, or would
+ contain, the corresponding scheduling object resource.
+
+6.1. Processing Organizer Requests, Additions, and Cancellations
+
+ For a scheduling message sent by an Organizer, the server first tries
+ to locate a corresponding scheduling object resource belonging to the
+ Attendee. If no matching scheduling object resource exists, the
+ server treats the scheduling message as a new message, otherwise it
+ is treated as an update.
+
+ In the case of a new message, the server MUST process the scheduling
+ message and create a new scheduling object resource in an appropriate
+ calendar collection for the Attendee.
+
+ In the case of an update, the server MUST process the scheduling
+ message and update the matching scheduling object resource belonging
+ to the Attendee to reflect the changes sent by the Organizer.
+
+ In each case, the scheduling message MUST only appear in the
+ Attendee's scheduling Inbox collection once all automatic processing
+ has been done.
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 30]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+6.2. Processing Attendee Replies
+
+ For a scheduling message reply sent by an Attendee, the server first
+ locates the corresponding scheduling object resource belonging to the
+ Organizer.
+
+ The server MUST then update the "PARTSTAT" iCalendar property
+ parameter value of each "ATTENDEE" iCalendar property in the
+ scheduling object resource to match the changes indicated in the
+ reply (taking into account the fact that an Attendee could have
+ created a new overridden iCalendar component to indicate different
+ participation status on one or more recurrence instances of a
+ recurring event).
+
+ The server MUST also update or add the "SCHEDULE-STATUS" property
+ parameter on each matching "ATTENDEE" iCalendar property and set its
+ value to that of the "REQUEST-STATUS" property in the reply, or to
+ "2.0" if "REQUEST-STATUS" is not present (also taking into account
+ recurrence instances). If there are multiple "REQUEST-STATUS"
+ properties in the reply, the "SCHEDULE-STATUS" property parameter
+ value is set to a comma-separated list of status codes, one from each
+ "REQUEST-STATUS" property.
+
+ The server SHOULD send scheduling messages to all the other Attendees
+ indicating the change in participation status of the Attendee
+ replying, subject to the recurrence requirements of Section 5.2.6.
+
+ The scheduling message MUST only appear in the Organizer's scheduling
+ Inbox collection once all automatic processing has been done.
+
+6.3. Scheduling Messages as Notifications
+
+ Once the processing of an incoming scheduling message is completed by
+ the server, the message is made available as a child resource in the
+ scheduling Inbox collection of the Calendar User that received the
+ message, to serve as a notification that a change has been made to
+ the corresponding scheduling object resource. Scheduling messages
+ are typically removed from the scheduling Inbox collection by the
+ client once the calendar user has acknowledged the change.
+
+6.4. Default Calendar Collection
+
+ The server is REQUIRED to process scheduling messages received for an
+ Attendee by creating a new scheduling object resource in a calendar
+ collection belonging to the Attendee, when one does not already
+ exist. A Calendar User that is an Attendee in a scheduling operation
+ MUST have at least one valid calendar collection available. If there
+ is no valid calendar collection, then the server MUST reject the
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 31]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ attempt to deliver the scheduling message to the Attendee.
+
+ Servers MAY provide support for a default calendar collection, that
+ is, the calendar collection in which new scheduling object resources
+ will be created. The CALDAV:schedule-default-calendar-URL WebDAV
+ property, which can be present on the scheduling Inbox collection of
+ a Calendar User, specifies if this Calendar User has a default
+ calendar collection. See Section 12.2.
+
+ Servers SHOULD create new scheduling object resources in the default
+ calendar collection, if the CALDAV:schedule-default-calendar-URL
+ WebDAV property is set.
+
+ Servers MAY allow clients to change the default calendar collection
+ by changing the value of the CALDAV:schedule-default-calendar-URL
+ WebDAV property on the scheduling Inbox collection. However, the
+ servers MUST ensure that any new value for that property refers to a
+ valid calendar collection belonging to the owner of the scheduling
+ Inbox collection.
+
+ Servers MUST reject any attempt to delete the default calendar
+ collection.
+
+6.4.1. Additional Method Preconditions
+
+ This specification defines additional method preconditions (see
+ Section 16 of WebDAV [RFC4918]) to provide machine-parsable
+ information in error responses.
+
+6.4.1.1. CALDAV:default-calendar-needed Precondition
+
+ Name: default-calendar-needed
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Apply to: DELETE
+
+ Use with: 403 Forbidden
+
+ Purpose: (precondition) -- The client attempted to delete the
+ calendar collection currently referenced by the CALDAV:schedule-
+ default-calendar-URL property, or attempted to remove the CALDAV:
+ schedule-default-calendar-URL property on the scheduling Inbox
+ collection on a server that doesn't allow such operations.
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 32]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ Definition:
+
+ <!ELEMENT default-calendar-needed EMPTY>
+
+ Example:
+
+ <C:default-calendar-needed
+ xmlns:C="urn:ietf:params:xml:ns:caldav"/>
+
+6.4.1.2. CALDAV:valid-schedule-default-calendar-URL Precondition
+
+ Name: valid-schedule-default-calendar-URL
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Apply to: PROPPATCH
+
+ Use with: 403 Forbidden
+
+ Purpose: (precondition) -- The client attempted to set the CALDAV:
+ schedule-default-calendar-URL property to a DAV:href element that
+ doesn't reference a valid calendar collection. Note: Servers that
+ do not allow clients to change the CALDAV:schedule-default-
+ calendar-URL property would simply return the DAV:cannot-modify-
+ protected-property precondition defined in Section 16 of WebDAV
+ [RFC4918].
+
+ Definition:
+
+ <!ELEMENT valid-schedule-default-calendar-URL EMPTY>
+
+ Example:
+
+ <C:valid-schedule-default-calendar-URL
+ xmlns:C="urn:ietf:params:xml:ns:caldav"/>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 33]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+7. Request for Busy Time Information
+
+ The POST method is used to request busy time information of one or
+ more Calendar Users by submitting a request at the scheduling Outbox
+ collection of the Calendar User requesting the information (the
+ Organizer). To accomplish this, the request body of a POST method
+ MUST contain a "VFREEBUSY" calendar component with the "METHOD"
+ iCalendar property set to the value "REQUEST" as specified in Section
+ 3.3.2 of iTIP [RFC5546]. The resource identified by the Request-URI
+ MUST be a resource collection of type CALDAV:schedule-outbox
+ (Section 4.1). The "ORGANIZER" property in the "VFREEBUSY" component
+ MUST match that of the Calendar User who "owns" the Outbox
+ collection.
+
+7.1. Status Codes
+
+ The following are examples of response codes one would expect to be
+ used for this method. However, unless explicitly prohibited, any
+ 2/3/4/5xx series response code can be used in a response.
+
+ 200 (OK) - The command succeeded.
+
+ 204 (No Content) - The command succeeded.
+
+ 400 (Bad Request) - The client has provided an invalid scheduling
+ message.
+
+ 403 (Forbidden) - The client cannot submit a scheduling message to
+ the specified Request-URI.
+
+ 404 (Not Found) - The URL in the Request-URI was not present.
+
+ 423 (Locked) - The specified resource is locked and the client
+ either is not a lock owner or the lock type requires a lock token
+ to be submitted and the client did not submit it.
+
+7.2. Additional Method Preconditions
+
+ This specification defines additional method preconditions for the
+ POST method. Preconditions defined in WebDAV ACL [RFC3744] and
+ CalDAV [RFC4791] that applies to the POST method are also listed here
+ for completeness.
+
+7.2.1. DAV:need-privileges Precondition
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 34]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ Name: need-privileges
+
+ Namespace: DAV:
+
+ Apply to: POST
+
+ Use with: 403 Forbidden
+
+ Purpose: (precondition) -- The currently authenticated user MUST be
+ granted the CALDAV:schedule-send-freebusy privilege on the
+ scheduling Outbox collection being targeted by the request.
+
+ Definition:
+
+ <!ELEMENT DAV:need-privileges (DAV:resource)* >
+ <!ELEMENT DAV:resource (DAV:href, DAV:privilege) >
+
+ Example:
+
+ <D:need-privileges xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:caldav"/>
+ <D:resource>
+ <D:href>/home/bernard/calendars/outbox/</D:href>
+ <D:privilege><C:schedule-send-freebusy/></D:privilege>
+ </D:resource>
+ </D:need-privileges>
+
+7.2.2. CALDAV:supported-collection Precondition
+
+ Name: supported-collection
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Apply to: POST
+
+ Use with: 400 Bad Request
+
+ Purpose: (precondition) -- The Request-URI MUST identify the
+ location of a scheduling Outbox collection.
+
+ Definition:
+
+ <!ELEMENT supported-collection EMPTY >
+
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 35]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ Example:
+
+ <C:supported-collection xmlns:C="urn:ietf:params:xml:ns:caldav"/>
+
+7.2.3. CALDAV:supported-calendar-data Precondition
+
+ Name: supported-calendar-data
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Apply to: POST
+
+ Use with: 400 Bad Request
+
+ Purpose: (precondition) -- The resource body submitted in the POST
+ request MUST be a supported media type (e.g., text/calendar).
+
+ Definition:
+
+ <!ELEMENT supported-calendar-data EMPTY >
+
+ Example:
+
+ <C:supported-calendar-data
+ xmlns:C="urn:ietf:params:xml:ns:caldav"/>
+
+7.2.4. CALDAV:valid-calendar-data Precondition
+
+ Name: valid-calendar-data
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Apply to: POST
+
+ Use with: 400 Bad Request
+
+ Purpose: (precondition) -- The resource submitted in the POST
+ request MUST be valid data for the media type being specified
+ (e.g., a valid iCalendar object).
+
+ Definition:
+
+ <!ELEMENT valid-calendar-data EMPTY>
+
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 36]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ Example:
+
+ <C:valid-calendar-data xmlns:C="urn:ietf:params:xml:ns:caldav"/>
+
+7.2.5. CALDAV:valid-scheduling-message Precondition
+
+ Name: valid-scheduling-message
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Apply to: POST
+
+ Use with: 400 Bad Request
+
+ Purpose: (precondition) -- The resource submitted in the POST
+ request MUST obey all restrictions specified for the POST request
+ (e.g., the scheduling message follow the restrictions of iTIP).
+
+ Definition:
+
+ <!ELEMENT valid-scheduling-message EMPTY >
+
+ Example:
+
+ <C:valid-scheduling-message
+ xmlns:C="urn:ietf:params:xml:ns:caldav"/>
+
+7.2.6. CALDAV:valid-organizer Precondition
+
+ Name: valid-organizer
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Apply to: POST
+
+ Use with: 403 Forbidden
+
+ Purpose: (precondition) -- The Calendar User identified by the
+ "ORGANIZER" property in the POST request's scheduling message MUST
+ be the Calendar User (or one of the Calendar Users) associated
+ with the scheduling Outbox collection being targeted by the
+ request;
+
+ Definition:
+
+ <!ELEMENT valid-organizer EMPTY >
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 37]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ Example:
+
+ <C:valid-organizer xmlns:C="urn:ietf:params:xml:ns:caldav"/>
+
+7.2.7. CALDAV:max-resource-size Precondition
+
+ Name: max-resource-size
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Apply to: POST
+
+ Use with: 403 Forbidden
+
+ Purpose: (precondition) -- The resource submitted in the POST
+ request MUST have a size in octets less than or equal to the value
+ of the CALDAV:max-resource-size property (defined in Section 5.2.5
+ of [RFC4791]) specified on the scheduling Outbox collection
+ targeted by the request.
+
+ Definition:
+
+ <!ELEMENT max-resource-size EMPTY >
+
+ Example:
+
+ <C:max-resource-size xmlns:C="urn:ietf:params:xml:ns:caldav"/>
+
+7.3. Response to a POST request
+
+ A POST request can return freebusy information for one or more
+ Calendar Users. Thus the response needs to contain separate status
+ information for each recipient. This specification defines a new XML
+ response body to convey multiple recipient status.
+
+ A response to a POST method that indicates status for one or more
+ recipients MUST be an XML document with a CALDAV:schedule-response
+ XML element as its root element. This element MUST contain one
+ CALDAV:response element for each recipient, with each of those
+ containing elements that indicate which recipient they correspond to,
+ the scheduling status for that recipient, any error codes and an
+ optional description. See Section 14.1 for the detail on the child
+ elements.
+
+ In the case of a successful freebusy request, the CALDAV:response
+ elements can also contain CALDAV:calendar-data elements which contain
+ freebusy information (e.g., an iCalendar VFREEBUSY component)
+ indicating the busy state of the corresponding recipient. See
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 38]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ Appendix B.5 for an example freebusy request and response.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 39]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+8. Avoiding Conflicts when Updating Scheduling Object Resources
+
+ Because replies from Attendees and updates from Organizers are
+ automatically processed by the server, clients might be in a
+ situation where their copy of a calendar resource is different from
+ the one currently on the server. When an Attendee or Organizer makes
+ a change to the client's copy of the calendar resource, if the client
+ writes the data to the server it could overwrite the changes already
+ made there. Typically, clients use the ETag value and If-Match
+ request headers to avoid the "lost update problem".
+
+ Clients can also use ETag and If-Match to avoid this problem.
+ However, when doing so the client will likely have to resolve the
+ differences between the new resource and the original one, and the
+ changes made by the Attendee or Organizer in the client. This can be
+ a complicated comparison particularly when recurring components are
+ present.
+
+ Additionally, the data on the server may change frequently as
+ Attendees change their participation status, triggering updates to
+ the Organizer, and consequently other Attendees' copies of the
+ scheduling object resource. If the ETag/If-Match behavior were used,
+ clients would be forced to reconcile their cached copy of a
+ scheduling object resource with the updated one on the server in
+ order to attempt to write the user's changes back. This could lead
+ to a race condition that can effectively result in a temporary denial
+ of service when, for example, there is an event with a large Attendee
+ list. A "storm" of updates will occur if Attendees all start
+ responding at the same time, and this would prevent Attendees and the
+ Organizer from being able to update their own copies of the
+ scheduling object resource as the server copy is changing frequently.
+
+ A solution is to have the server determine the best way to merge
+ changes made on the server with changes being made by the client.
+ For example, if an Attendee changes their participation status and
+ triggers an update to the Organizer's copy of the event, but the
+ Organizer also updates their cached copy of the event and attempts to
+ write it back, rather than failing on a conditional If-Match when the
+ Organizer writes their data, the server would instead take the
+ changes made by the Organizer and apply the Attendee changes and
+ store the result. Thus a form of "weak" ETag matching behavior is
+ needed such that scheduling changes made automatically on the server
+ do not invalidate the tag, so that when clients store data
+ conditionally based on the tag value, the server knows it can apply
+ the merge behavior.
+
+ In order to do that, this specification introduces a new WebDAV
+ resource property CALDAV:schedule-tag with a corresponding response
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 40]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ header "Schedule-Tag", and a new "If-Schedule-Tag-Match" request
+ header to allow client changes to be appropriately merged with server
+ changes in the case where the changes on the server were the result
+ of an "inconsequential" scheduling message update. An
+ "inconsequential" scheduling message is one which simply updates the
+ status information of Attendees due to a reply from an Attendee.
+
+ Servers MUST support requests targeted at scheduling object resources
+ using the "If-Schedule-Tag-Match" request header. Consequently, the
+ server MUST support the "Schedule-Tag" response header and CALDAV:
+ schedule-tag property for scheduling object resources. Servers MUST
+ automatically resolve conflicts with "inconsequential" changes done
+ to scheduling object resources when the "If-Schedule-Tag-Match"
+ request header is specified.
+
+ The If-Schedule-Tag-Match request header applies only to the Request-
+ URI, and not to the Destination of a COPY or MOVE in the same way as
+ the If-Match request header.
+
+ Clients SHOULD use the If-Schedule-Tag-Match header on requests that
+ update scheduling object resources.
+
+ A response to any successful GET or PUT request targeting a
+ scheduling object resource MUST include a Schedule-Tag response
+ header with the value set to the same value as the CALDAV:schedule-
+ tag WebDAV property of the resource.
+
+ A response to any successful COPY or MOVE request that specifies a
+ Destination request header targeting a scheduling object resource
+ MUST include a Schedule-Tag response header with the value set to the
+ same value as the CALDAV:schedule-tag WebDAV property of the resource
+ identified in the Request-URI.
+
+ The Schedule-Tag feature is designed to be used to address the
+ problem of "inconsequential" changes on the server only. Normal ETag
+ operations are used in all other cases, e.g., for synchronization.
+
+ The value of the CALDAV:schedule-tag property changes according to
+ these rules:
+
+ o For an Organizer's copy of a scheduling object resource:
+
+ 1. The server MUST NOT change the CALDAV:schedule-tag property
+ value when the scheduling object resource is updated as the
+ result of automatically processing a scheduling message reply
+ from an Attendee. For instance, when an Attendee replies to
+ the Organizer, the CALDAV:schedule-tag property is unchanged
+ after the Organizer's scheduling object resource has been
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 41]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ automatically updated by the server with the Attendee's new
+ participation status.
+
+ 2. The server MUST change CALDAV:schedule-tag property value when
+ the scheduling object resource is changed directly via an HTTP
+ request (e.g., PUT, COPY or MOVE).
+
+ o For an Attendee's copy of a scheduling object resource:
+
+ 1. The server MUST change the CALDAV:schedule-tag property value
+ when the scheduling object resource is changed as the result
+ of processing a scheduling message update from an Organizer
+ that contains changes other than just the participation status
+ of Attendees.
+
+ 2. The server MUST NOT change the CALDAV:schedule-tag property
+ value when the scheduling object resource is changed as the
+ result of processing a scheduling message update from an
+ Organizer that only specify changes in the participation
+ status of Attendees. For instance, when Attendee "A" replies
+ to Organizer "O", and Attendee "B" receives a scheduling
+ message update from Organizer "O" with the new participation
+ status of Attendee "A", the CALDAV:schedule-tag property of
+ Attendee "B"s scheduling object resource MUST NOT be changed.
+
+ 3. The server MUST change the CALDAV:schedule-tag property value
+ when the scheduling object resource is changed directly via an
+ HTTP request (e.g., PUT, COPY or MOVE).
+
+8.1. PUT
+
+ Clients can use the If-Schedule-Tag-Match request header to do a PUT
+ request that ensures that "inconsequential" changes on the server do
+ not result in a precondition error. The value of the request header
+ is set to the last Schedule-Tag value received for the resource being
+ modified. If the value of the If-Schedule-Tag-Match header matches
+ the current value of the CALDAV:schedule-tag property the server MUST
+ take any "ATTENDEE" property changes for all Attendees other than the
+ owner of the scheduling object resource and apply those to the new
+ resource being stored. Otherwise, the server MUST fail the request
+ with a 412 Precondition Failed status code.
+
+8.2. DELETE, COPY or MOVE
+
+ Clients can use the If-Schedule-Tag-Match request header to do a
+ DELETE, COPY or MOVE request that ensures that "inconsequential"
+ changes on the server do not result in a precondition error. The
+ value of the request header is set to the last Schedule-Tag value
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 42]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ received for the resource being deleted. If the value of the If-
+ Schedule-Tag-Match header matches the current value of the CALDAV:
+ schedule-tag property the server performs the normal DELETE, COPY or
+ MOVE request processing for the resource. Otherwise, the server MUST
+ fail the request with a 412 Precondition Failed status code.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 43]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+9. Other Scheduling Considerations
+
+9.1. Attendee Participation Status
+
+ This section specifies additional requirements on the handling of the
+ "PARTSTAT" property parameter when the "SCHEDULE-AGENT" property
+ parameter on the corresponding "ATTENDEE" property is set to the
+ value "SERVER" or is not present.
+
+ Clients SHOULD, and servers MUST reset the "PARTSTAT" property
+ parameter value of all "ATTENDEE" properties, except the one that
+ corresponds to the Organizer, to "NEEDS-ACTION" when the Organizer
+ reschedules an event.
+
+ A reschedule of an event occurs when any "DTSTART", "DTEND",
+ "DURATION", "DUE", "RRULE", "RDATE", or "EXDATE" property changes in
+ a calendar component such that existing recurrence instances are
+ impacted by the changes, as shown in the table below.
+
+ +-----------+-------------------------------------------------------+
+ | Property | Server Action |
+ +-----------+-------------------------------------------------------+
+ | DTSTART, | Any change to these properties MUST result in |
+ | DTEND, | "PARTSTAT" being set to "NEEDS-ACTION" |
+ | DURATION, | |
+ | DUE | |
+ | | |
+ | | |
+ | | |
+ | RRULE | A change to or addition of this property that results |
+ | | in the addition of new recurring instances or a |
+ | | change in time for existing recurring instances MUST |
+ | | result in "PARTSTAT" being reset to "NEEDS-ACTION" on |
+ | | each affected component. |
+ | | |
+ | | |
+ | | |
+ | RDATE | A change to or addition of this property that results |
+ | | in the addition of new recurring instances or a |
+ | | change in time for existing recurring instances MUST |
+ | | result in "PARTSTAT" being reset to "NEEDS-ACTION" on |
+ | | each affected component. |
+ | | |
+ | | |
+ | | |
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 44]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ | EXDATE | A change to or removal of this property that results |
+ | | in the re-instatement of recurring instances MUST |
+ | | result in "PARTSTAT" being set to "NEEDS-ACTION" on |
+ | | each affected component. |
+ +-----------+-------------------------------------------------------+
+
+ The server MAY allow the Organizer's client to change an Attendee's
+ "PARTSTAT" property parameter value to "NEEDS-ACTION" at any other
+ time (e.g., when the "LOCATION" property value changes, an Organizer
+ might wish to re-invite Attendees who may be impacted by the change).
+
+9.2. Schedule Status Values
+
+ When scheduling with an Attendee there are two types of status
+ information that can be returned during the transaction. The first
+ type of status information is a "delivery" status that indicates
+ whether the scheduling message from the Organizer to the Attendee was
+ delivered or not, or what the current status of delivery is. The
+ second type of status information is a "reply" status corresponding
+ to the Attendee's own "REQUEST-STATUS" information from the
+ scheduling message reply that is sent back to the Organizer.
+
+ Similarly, when an Attendee sends a reply back to the Organizer,
+ there will be "delivery" status information for the scheduling
+ message sent to the Organizer. However, there is no "REQUEST-STATUS"
+ sent back by the Organizer, so there is no equivalent of the "reply"
+ status as per scheduling messages to Attendees.
+
+ The "delivery" status information on an "ORGANIZER" or "ATTENDEE"
+ iCalendar property is conveyed in the "SCHEDULE-STATUS" property
+ parameter value (Section 10.3). The status code value for "delivery"
+ status can be one of the following:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 45]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ +----------+--------------------------------------------------------+
+ | Delivery | Description |
+ | Status | |
+ | Code | |
+ +----------+--------------------------------------------------------+
+ | 1.0 | The scheduling message is pending. i.e. the server is |
+ | | still in the process of sending the message. The |
+ | | status code value can be expected to change once the |
+ | | server has completed its sending and delivery |
+ | | attempts. |
+ | | |
+ | | |
+ | | |
+ | 1.1 | The scheduling message has been successfully sent. |
+ | | However, the server does not have explicit information |
+ | | about whether the scheduling message was successfully |
+ | | delivered to the recipient. This state can occur with |
+ | | "store and forward" style scheduling protocols such as |
+ | | iMIP [RFC6047] (iTIP using email). |
+ | | |
+ | | |
+ | | |
+ | 1.2 | The scheduling message has been successfully |
+ | | delivered. |
+ | | |
+ | | |
+ | | |
+ | 3.7 | The scheduling message was not delivered because the |
+ | | server did not recognize the calendar user address as |
+ | | a valid calendar user. Note that this code applies to |
+ | | both Organizer and Attendee calendar user addresses. |
+ | | |
+ | | |
+ | | |
+ | 3.8 | The scheduling message was not delivered due to |
+ | | insufficient privileges. Note that this code applies |
+ | | to both privileges granted by both the Organizer and |
+ | | Attendee calendar users. |
+ | | |
+ | | |
+ | | |
+ | 5.1 | The scheduling message was not delivered because the |
+ | | server could not complete delivery of the message. |
+ | | This is likely due to a temporary failure, and the |
+ | | originator can try to send the message again at a |
+ | | later time. |
+ | | |
+ | | |
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 46]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ | 5.2 | The scheduling message was not delivered because the |
+ | | server was not able to find a suitable way to deliver |
+ | | the message. This is likely a permanent failure, and |
+ | | the originator should not try to send the message |
+ | | again, at least without verifying/correcting the |
+ | | calendar user address of the recipient. |
+ | | |
+ | | |
+ | | |
+ | 5.3 | The scheduling message was not delivered and was |
+ | | rejected because scheduling with that recipient is not |
+ | | allowed. This is likely a permanent failure, and the |
+ | | originator should not try to send the message again. |
+ +----------+--------------------------------------------------------+
+
+ The status code for "reply" status can be any of the valid iTIP
+ [RFC5546] "REQUEST-STATUS" values.
+
+ The 1.xx "REQUEST-STATUS" codes are new. This specification modifies
+ item (2) of Section 3.6 of [RFC5546] by adding the following
+ restriction:
+
+ For a 1.xx code, all components MUST have exactly the same code.
+
+ Definition of the new 1.xx codes is as follows:
+
+9.2.1. Status Code 1.0
+
+ Status Code: 1.0
+
+ Status Description: Pending.
+
+ Status Exception Data: None.
+
+ Description: Delivery of the iTIP message is pending.
+
+9.2.2. Status Code 1.1
+
+ Status Code: 1.1
+
+ Status Description: Sent.
+
+ Status Exception Data: None.
+
+ Description: The iTIP message has been sent, though no information
+ about successful delivery is known.
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 47]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+9.2.3. Status Code 1.2
+
+ Status Code: 1.2
+
+ Status Description: Delivered.
+
+ Status Exception Data: None.
+
+ Description: The iTIP message has been sent and delivered.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 48]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+10. Additional iCalendar Property Parameters
+
+ This specification defines additional iCalendar property parameters
+ to support the CalDAV scheduling extensions.
+
+10.1. Schedule Agent Parameter
+
+ Parameter Name: SCHEDULE-AGENT
+
+ Purpose: To specify the agent expected to deliver scheduling
+ messages to the corresponding Organizer or Attendee.
+
+ Format Definition: This property parameter is defined by the
+ following notation:
+
+ scheduleagentparam = "SCHEDULE-AGENT" "="
+ ("SERVER" ; The server handles scheduling
+ / "CLIENT" ; The client handles scheduling
+ / "NONE" ; No scheduling
+ / x-name ; Experimental type
+ / iana-token) ; Other IANA registered type
+ ;
+ ; Default is SERVER
+
+ Description: This property parameter MAY be specified on "ORGANIZER"
+ or "ATTENDEE" iCalendar properties. In the absence of this
+ parameter, the value "SERVER" MUST be used for the default
+ behavior. The value determines whether or not an automatic
+ scheduling transaction on a server will cause a scheduling message
+ to be sent to the corresponding Calendar User identified by the
+ "ORGANIZER" or "ATTENDEE" property value. When the value "SERVER"
+ is specified, or the parameter is absent, then it is the server's
+ responsibility to send a scheduling message as part of an
+ automatic scheduling transaction. When the value "CLIENT" is
+ specified, that indicates that the client is handling scheduling
+ messages with the Calendar User itself. When "NONE" is specified,
+ no scheduling messages are being sent to the Calendar User.
+
+ Servers MUST NOT include this parameter in any scheduling messages
+ sent as the result of an automatic scheduling transaction.
+
+ Clients MUST NOT include this parameter in any scheduling messages
+ that they themselves send.
+
+ The parameter value MUST be the same on every "ORGANIZER" property
+ in a scheduling object resource.
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 49]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ The parameter value MUST be the same on each "ATTENDEE" property
+ whose values match in a scheduling object resource.
+
+ Servers and clients MUST treat x-name and iana-token values they
+ do not recognize the same way as they would the "NONE" value.
+
+ Example:
+
+ ORGANIZER;SCHEDULE-AGENT=SERVER:mailto:bernard@example.com
+
+ ATTENDEE;SCHEDULE-AGENT=NONE:mailto:cyrus@example.com
+
+10.2. Schedule Force Send Parameter
+
+ Parameter Name: SCHEDULE-FORCE-SEND
+
+ Purpose: To force a scheduling message to be sent to the Calendar
+ User specified by the property.
+
+ Format Definition: This property parameter is defined by the
+ following notation:
+
+ scheduleforcesendparam = "SCHEDULE-FORCE-SEND" "="
+ ("REQUEST" ; Force a "REQUEST"
+ / "REPLY" ; Force a "REPLY"
+ / iana-token) ; IANA registered method
+
+ Description: This property parameter MAY be specified on "ATTENDEE"
+ and "ORGANIZER" properties on which the "SCHEDULE-AGENT" property
+ parameter is set to the value "SERVER" or is not specified. This
+ property parameter is used to force a server to send a scheduling
+ message to a specific Calendar User in situations where the server
+ would not send a scheduling message otherwise (e.g., when no
+ change that warrants the delivery of a new scheduling message was
+ performed on the scheduling object resource). An Organizer MAY
+ specify this parameter on an "ATTENDEE" property with the value
+ "REQUEST" to force a "REQUEST" scheduling message to be sent to
+ this Attendee. An Attendee MAY specify this parameter on the
+ "ORGANIZER" with the value "REPLY" to force a "REPLY" scheduling
+ message to be sent to the Organizer.
+
+ Servers MUST NOT preserve this property parameter in scheduling
+ object resources, nor include it in any scheduling messages sent
+ as the result of an automatic scheduling transaction.
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 50]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ Clients MUST NOT include this parameter in any scheduling messages
+ that they themselves send.
+
+ Servers MUST set the "SCHEDULE-STATUS" parameter of the "ATTENDEE"
+ or "ORGANIZER" to 2.3 (i.e., "Success, invalid property parameter
+ ignored", see Section 3.6 of [RFC5546]) when the "SCHEDULE-FORCE-
+ SEND" parameter is set to a x-name or iana-token value they do not
+ recognize.
+
+ Example:
+
+ ATTENDEE;SCHEDULE-FORCE-SEND=REQUEST:mailto:bernard@example.com
+
+ ORGANIZER;SCHEDULE-FORCE-SEND=REPLY:mailto:cyrus@example.com
+
+10.3. Schedule Status Parameter
+
+ Parameter Name: SCHEDULE-STATUS
+
+ Purpose: To specify the status codes returned from processing of the
+ most recent scheduling message sent to the corresponding Attendee,
+ or received from the corresponding Organizer.
+
+ Format Definition: This property parameter is defined by the
+ following notation:
+
+ schedulestatusparam = "SCHEDULE-STATUS" "="
+ ( statcode
+ / DQUOTE statcode *("," statcode) DQUOTE)
+ ; "statcode" is defined in Section 3.8.8.3 of
+ ; [RFC5545]. Value is a single
+ ; "statcode" or a comma-separated list of "statcode" values.
+
+ Description: This property parameter MAY be specified on the
+ "ATTENDEE" and "ORGANIZER" properties.
+
+ Servers MUST add this property parameter to any "ATTENDEE"
+ properties corresponding to Calendar Users who were sent a
+ scheduling message via an automatic scheduling transaction.
+ Clients SHOULD NOT change or remove this parameter if it was
+ provided by the server. In the case where the client is handling
+ the scheduling, the client MAY add, change or remove this
+ parameter to indicate the last scheduling message status it
+ received.
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 51]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ Servers MUST add this parameter to any "ORGANIZER" properties
+ corresponding to Calendar Users who were sent a scheduling message
+ reply by an Attendee via an automatic scheduling transaction.
+ Clients SHOULD NOT change or remove this parameter if it was
+ provided by the server. In the case where the client is handling
+ the scheduling, the client MAY add, change or remove this
+ parameter to indicate the last scheduling message status it
+ received.
+
+ Servers MUST NOT include this parameter in any scheduling messages
+ sent as the result of an automatic scheduling transaction.
+
+ Clients MUST NOT include this parameter in any scheduling messages
+ that they themselves send.
+
+ Suitable values for this property parameter are described in
+ Section 9.2.
+
+ Example:
+
+ ATTENDEE;SCHEDULE-STATUS="2.0":mailto:bernard@example.com
+
+ ATTENDEE;SCHEDULE-STATUS="2.0,2.4":mailto:cyrus@example.com
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 52]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+11. Additional Message Header Fields
+
+ This specification defines additional HTTP request and response
+ headers for use with CalDAV.
+
+11.1. Schedule-Reply Request Header
+
+
+ Schedule-Reply = "Schedule-Reply" ":" ("T" | "F")
+
+ Example:
+
+ Schedule-Reply: F
+
+ When an Attendee removes a scheduling object resource, and the
+ Schedule-Reply header is not present, or present and set to the value
+ "T", the server MUST send an appropriate reply scheduling message
+ with the Attendee's "PARTSTAT" iCalendar property parameter value set
+ to "DECLINED" as part of its normal automatic scheduling transaction
+ processing.
+
+ When the Schedule-Reply header is set to the value "F", the server
+ MUST NOT send a scheduling message as part of its normal automatic
+ scheduling transaction processing.
+
+ The Schedule-Reply request header is used by a client to indicate to
+ a server whether or not an automatic scheduling transaction should
+ occur when an Attendee deletes a scheduling object resource. In
+ particular it controls whether a reply scheduling message is sent to
+ the Organizer as a result of the removal. There are situations in
+ which unsolicited scheduling messages need to be silently removed (or
+ ignored) for security or privacy reasons. This request header allows
+ the scheduling object resource to be removed if such a need arises.
+
+ All scheduling object resources MUST support the Schedule-Reply
+ request header.
+
+11.2. Schedule-Tag Response Header
+
+ The Schedule-Tag response header provides the current value of the
+ CALDAV:schedule-tag property value. The behavior of this response
+ header is described in Section 8.
+
+ All scheduling object resources MUST support the Schedule-Tag header.
+
+ Schedule-Tag = "Schedule-Tag" ":" opaque-tag
+ ; "opaque-tag" is defined in Section 3.11 of [RFC2616]
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 53]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ Example:
+
+ Schedule-Tag: "12ab34-cd56ef"
+
+11.3. If-Schedule-Tag-Match Request Header
+
+ The If-Schedule-Tag-Match request header field is used with a method
+ to make it conditional. Clients can set this header to the value
+ returned in the Schedule-Tag response header, or the CALDAV:schedule-
+ tag property, of a scheduling object resource previously retrieved
+ from the server to avoid overwriting "consequential" changes to the
+ scheduling object resource.
+
+ All scheduling object resources MUST support the If-Schedule-Tag-
+ Match header.
+
+ If-Schedule-Tag-Match = "If-Schedule-Tag-Match" ":" opaque-tag
+ ; "opaque-tag" is defined in Section 3.11 of [RFC2616]
+
+ Example:
+
+ If-Schedule-Tag-Match: "12ab34-cd56ef"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 54]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+12. Additional WebDAV Properties
+
+ This specification defines the following new WebDAV properties for
+ use with CalDAV.
+
+12.1. CALDAV:schedule-calendar-transp Property
+
+ Name: schedule-calendar-transp
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: Determines whether the calendar object resources in a
+ calendar collection will affect the owner's freebusy.
+
+ Protected: This property MAY be protected and SHOULD NOT be returned
+ by a PROPFIND allprop request (as defined in Section 14.2 of
+ [RFC4918]).
+
+ COPY/MOVE behavior: This property value SHOULD be kept during a MOVE
+ operation, and SHOULD be copied and preserved in a COPY.
+
+ Description: This property SHOULD be defined on all calendar
+ collections. If present, it contains one of two XML elements that
+ indicate whether the calendar object resources in the calendar
+ collection should contribute to the owner's freebusy or not. When
+ the CALDAV:opaque element is used, all calendar object resources
+ in the corresponding calendar collection MUST contribute to
+ freebusy, assuming access privileges and other iCalendar
+ properties allow it to. When the CALDAV:transparent XML element
+ is used, the calendar object resources in the corresponding
+ calendar collection MUST NOT contribute to freebusy.
+
+ If this property is not present on a calendar collection, then the
+ default value CALDAV:opaque MUST be assumed.
+
+ Definition:
+
+ <!ELEMENT schedule-calendar-transp (opaque | transparent) >
+
+ <!ELEMENT opaque EMPTY>
+ <!-- Affect busy time searches -->
+
+ <!ELEMENT transparent EMPTY>
+ <!-- Invisible to busy time searches -->
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 55]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ Example:
+
+ <C:schedule-calendar-transp
+ xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <C:opaque/>
+ </C:schedule-calendar-transp>
+
+12.2. CALDAV:schedule-default-calendar-URL Property
+
+ Name: schedule-default-calendar-URL
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: Specifies a default calendar for an Attendee where new
+ scheduling object resources are created.
+
+ Protected: This property MAY be protected in the case where a server
+ does not support changing the default calendar, or does not
+ support a default calendar.
+
+ COPY/MOVE behavior: This property is only defined on a scheduling
+ Inbox collection which cannot be moved or copied.
+
+ Description: This property MAY be defined on a scheduling Inbox
+ collection. If present, it contains zero or one DAV:href XML
+ elements. When a DAV:href element is present, its value indicates
+ a URL to a calendar collection that is used as the default
+ calendar. When no DAV:href element is present, it indicates that
+ there is no default calendar. In the absence of this property
+ there is no default calendar. When there is no default calendar
+ the server is free to choose the calendar in which a new
+ scheduling object resource is created. See Section 6.4.
+
+ Definition:
+
+ <!ELEMENT schedule-default-calendar-URL (DAV:href?) >
+
+ Example:
+
+ <C:schedule-default-calendar-URL xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:href>/home/cyrus/calendars/work/</D:href>
+ </C:schedule-default-calendar-URL>
+
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 56]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+12.3. CALDAV:schedule-tag Property
+
+ Name: schedule-tag
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: Indicates whether a scheduling object resource has had a
+ "consequential" change made to it.
+
+ Value: opaque-tag (defined in Section 3.11 of [RFC2616])
+
+ Protected: This property MUST be protected as only the server can
+ update the value.
+
+ COPY/MOVE behavior: This property is only defined on scheduling
+ object resources. It MUST be preserved when a scheduling object
+ resource is copied or moved and the resulting resource is also a
+ scheduling object resource. If the source resource is not a
+ scheduling object resource but the destination resource is, this
+ property MUST be added to the destination resource.
+
+ Description: The CALDAV:schedule-tag property MUST be defined on all
+ scheduling object resources. This property is described in
+ Section 8.
+
+ Definition:
+
+ <!ELEMENT schedule-tag (#PCDATA) >
+
+ Example:
+
+ <C:schedule-tag xmlns:C="urn:ietf:params:xml:ns:caldav"
+ >"12345-67890"</C:schedule-tag>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 57]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+13. Scheduling Access Control
+
+13.1. Scheduling Privileges
+
+ CalDAV servers MUST support and adhere to the requirements of WebDAV
+ ACL [RFC3744]. Furthermore, CalDAV servers that advertise support
+ for the "calendar-auto-schedule" feature MUST also support the
+ scheduling privileges defined in this section.
+
+ All the scheduling privileges MUST be non-abstract and MUST appear in
+ the DAV:supported-privilege-set property of scheduling Outbox and
+ Inbox collections on which they are defined.
+
+ The tables specified in Appendix A clarify which scheduling methods
+ (e.g., "REQUEST", "REPLY", etc.) are controlled by each scheduling
+ privilege defined in this section.
+
+13.1.1. Privileges on Scheduling Inbox Collections
+
+ This section defines new WebDAV ACL privileges that are for use on
+ scheduling Inbox collections. These privileges determine whether
+ delivery of scheduling messages from a calendar user is allowed by
+ the calendar user who "owns" the scheduling Inbox collection. This
+ allows calendar users to choose which other calendar users can
+ schedule with them.
+
+ Note that when a scheduling message is delivered to a calendar user,
+ in addition to a scheduling object resource being created in the
+ calendar user's scheduling Inbox collection, a new scheduling object
+ resource might be created or an existing one updated in a calendar
+ belonging to the calendar user. In that case, the ability to create
+ or update the scheduling object resource in the calendar is
+ controlled by the privileges assigned to the scheduling Inbox
+ collection.
+
+ The privileges defined in this section are ignored if applied to a
+ resource other than a scheduling Inbox collection.
+
+13.1.1.1. CALDAV:schedule-deliver Privilege
+
+ CALDAV:schedule-deliver is an aggregate privilege that contains all
+ the scheduling privileges that control the processing and delivery of
+ incoming scheduling messages, that is, CALDAV:schedule-deliver-invite
+ and CALDAV:schedule-deliver-reply, as well as freebusy requests
+ targeted at the owner of the scheduling Inbox collection, that is,
+ CALDAV:schedule-query-freebusy.
+
+ <!ELEMENT schedule-deliver EMPTY >
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 58]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+13.1.1.2. CALDAV:schedule-deliver-invite Privilege
+
+ The CALDAV:schedule-deliver-invite privilege controls the processing
+ and delivery of scheduling messages coming from an Organizer.
+
+ <!ELEMENT schedule-deliver-invite EMPTY >
+
+13.1.1.3. CALDAV:schedule-deliver-reply Privilege
+
+ The CALDAV:schedule-deliver-reply privilege controls the processing
+ and delivery of scheduling messages coming from an Attendee.
+
+ <!ELEMENT schedule-deliver-reply EMPTY >
+
+13.1.1.4. CALDAV:schedule-query-freebusy Privilege
+
+ The CALDAV:schedule-query-freebusy privilege controls freebusy
+ requests targeted at the owner of the scheduling Inbox collection.
+
+ <!ELEMENT schedule-query-freebusy EMPTY >
+
+13.1.2. Privileges on Scheduling Outbox Collections
+
+ This section defines new WebDAV ACL privileges that are defined for
+ use on scheduling Outbox collections. These privileges determine
+ which calendar users are allowed to send scheduling messages on
+ behalf of the calendar user who "owns" the scheduling Outbox
+ collection. This allows calendar users to choose other calendar
+ users who can act on their behalf to send schedule messages to other
+ calendar users (e.g. assistants working on behalf of their boss).
+
+ The privileges defined in this section are ignored if applied to a
+ resource other than a scheduling Outbox collection.
+
+13.1.2.1. CALDAV:schedule-send Privilege
+
+ CALDAV:schedule-send is an aggregate privilege that contains all the
+ scheduling privileges that control the use of methods that will cause
+ scheduling messages to be delivered to other users, that is, CALDAV:
+ schedule-send-invite and CALDAV:schedule-send-reply, as well as
+ freebusy requests to be targeted at other users, that is, CALDAV:
+ schedule-send-freebusy.
+
+ <!ELEMENT schedule-send EMPTY >
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 59]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+13.1.2.2. CALDAV:schedule-send-invite Privilege
+
+ The CALDAV:schedule-send-invite privilege controls the sending of
+ scheduling messages by Organizers.
+
+ Users granted the DAV:bind privilege on a calendar collection, or
+ DAV:write privilege on scheduling object resources, will also need
+ the CALDAV:schedule-send-invite privilege granted on the scheduling
+ Outbox collection of the owner of the calendar collection or
+ scheduling object resource in order to be allowed to create, modify
+ or delete scheduling object resources in a way that will trigger the
+ CalDAV server to deliver organizer scheduling messages to other
+ calendar users.
+
+ <!ELEMENT schedule-send-invite EMPTY >
+
+13.1.2.3. CALDAV:schedule-send-reply Privilege
+
+ The CALDAV:schedule-send-reply privilege controls the sending of
+ scheduling messages by Attendees.
+
+ Users granted the DAV:bind privilege on a calendar collection, or
+ DAV:write privilege on scheduling object resources, will also need
+ the CALDAV:schedule-send-reply privilege granted on the scheduling
+ Outbox collection of the owner of the calendar collection or
+ scheduling object resource in order to be allowed to create, modify
+ or delete scheduling object resources in a way that will trigger the
+ CalDAV server to deliver attendee scheduling messages to other
+ calendar users.
+
+ <!ELEMENT schedule-send-reply EMPTY >
+
+13.1.2.4. CALDAV:schedule-send-freebusy Privilege
+
+ The CALDAV:schedule-send-freebusy privilege controls the use of the
+ POST method to submit scheduling messages that specify the scheduling
+ method "REQUEST" with a "VFREEBUSY" calendar component.
+
+ <!ELEMENT schedule-send-freebusy EMPTY >
+
+13.1.3. Aggregation of Scheduling Privileges
+
+ Server implementations MUST aggregate the scheduling privileges as
+ follows:
+
+ DAV:all MUST contain CALDAV:schedule-send and CALDAV:schedule-
+ deliver;
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 60]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ CALDAV:schedule-send MUST contain CALDAV:schedule-send-invite,
+ CALDAV:schedule-send-reply, and CALDAV:schedule-send-freebusy;
+
+ CALDAV:schedule-deliver MUST contain CALDAV:schedule-deliver-
+ invite, CALDAV:schedule-deliver-reply, and CALDAV:schedule-query-
+ freebusy.
+
+ The following diagram illustrates how scheduling privileges are
+ aggregated according to the above requirements.
+
+ [DAV:all] (aggregate)
+ |
+ +-- [CALDAV:schedule-deliver] (aggregate)
+ | |
+ | +-- [CALDAV:schedule-deliver-invite]
+ | +-- [CALDAV:schedule-deliver-reply]
+ | +-- [CALDAV:schedule-query-freebusy]
+ |
+ +-- [CALDAV:schedule-send] (aggregate)
+ |
+ +-- [CALDAV:schedule-send-invite]
+ +-- [CALDAV:schedule-send-reply]
+ +-- [CALDAV:schedule-send-freebusy]
+
+13.2. Additional Principal Properties
+
+ This section defines new properties for WebDAV principal resources as
+ defined in [RFC3744]. These properties are likely to be protected
+ but the server MAY allow them to be written by appropriate users.
+
+13.2.1. CALDAV:schedule-inbox-URL Property
+
+ Name: schedule-inbox-URL
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: Identify the URL of the scheduling Inbox collection owned
+ by the associated principal resource.
+
+ Protected: This property MAY be protected.
+
+ PROPFIND behavior: This property SHOULD NOT be returned by a
+ PROPFIND allprop request (as defined in Section 14.2 of
+ [RFC4918]).
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 61]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ COPY/MOVE behavior: This property value SHOULD be preserved in COPY
+ and MOVE operations.
+
+ Description: This property is needed for a client to determine where
+ the scheduling Inbox collection of the current user is located so
+ that processing of scheduling messages can occur. If not present,
+ then the associated calendar user is not enabled for reception of
+ scheduling messages on the server.
+
+ Definition:
+
+ <!ELEMENT schedule-inbox-URL (DAV:href)>
+
+13.2.2. CALDAV:schedule-outbox-URL Property
+
+ Name: schedule-outbox-URL
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: Identify the URL of the scheduling Outbox collection owned
+ by the associated principal resource.
+
+ Protected: This property MAY be protected.
+
+ PROPFIND behavior: This property SHOULD NOT be returned by a
+ PROPFIND allprop request (as defined in Section 14.2 of
+ [RFC4918]).
+
+ COPY/MOVE behavior: This property value SHOULD be preserved in COPY
+ and MOVE operations.
+
+ Description: This property is needed for a client to determine where
+ the scheduling Outbox collection of the current user is located so
+ that sending of scheduling messages can occur. If not present,
+ then the associated calendar user is not enabled for the sending
+ of scheduling messages on the server.
+
+ Definition:
+
+ <!ELEMENT schedule-outbox-URL DAV:href>
+
+13.2.3. CALDAV:calendar-user-address-set Property
+
+ Name: calendar-user-address-set
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 62]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: Identify the calendar addresses of the associated principal
+ resource.
+
+ Protected: This property MAY be protected.
+
+ PROPFIND behavior: This property SHOULD NOT be returned by a
+ PROPFIND allprop request (as defined in Section 14.2 of
+ [RFC4918]).
+
+ COPY/MOVE behavior: This property value SHOULD be preserved in COPY
+ and MOVE operations.
+
+ Description: Support for this property is REQUIRED. This property
+ is needed to map calendar user addresses in iCalendar data to
+ principal resources and their associated scheduling Inbox and
+ Outbox collections. In the event that a user has no well defined
+ identifier for their calendar user address, the URI of their
+ principal resource can be used. This property SHOULD be
+ searchable using the DAV:principal-property-search REPORT. The
+ DAV:principal-search-property-set REPORT SHOULD identify this
+ property as such. If not present, then the associated calendar
+ user is not enabled for scheduling on the server.
+
+ Definition:
+
+ <!ELEMENT calendar-user-address-set (DAV:href*)>
+
+ Example:
+
+ <C:calendar-user-address-set xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:href>mailto:bernard@example.com</D:href>
+ <D:href>mailto:bernard.desruisseaux@example.com</D:href>
+ </C:calendar-user-address-set>
+
+13.2.4. CALDAV:calendar-user-type Property
+
+ Name: calendar-user-type
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: Identifies the calendar user type of the associated
+ principal resource.
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 63]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ Value: Same values allowed for the iCalendar "CUTYPE" property
+ parameter defined in Section 3.2.3 of [RFC5545].
+
+ Protected: This property MAY be protected.
+
+ PROPFIND behavior: This property SHOULD NOT be returned by a
+ PROPFIND allprop request (as defined in Section 14.2 of
+ [RFC4918]).
+
+ COPY/MOVE behavior: This property value SHOULD be preserved in COPY
+ and MOVE operations.
+
+ Description: Clients can query principal resources in order to
+ lookup attendees available on the server. When doing this, it is
+ useful to know, or restrict the query to, certain types of
+ calendar user (e.g., only search for "people", or only search for
+ "rooms"). This property MAY be defined on principal resources to
+ indicate the type of calendar user associated with the principal
+ resource. Its value is the same as the iCalendar "CUTYPE"
+ property parameter that can be used on "ATTENDEE" properties.
+ This property SHOULD be searchable using the DAV:principal-
+ property-search REPORT. The DAV:principal-search-property-set
+ REPORT SHOULD identify this property as such.
+
+ Definition:
+
+ <!ELEMENT calendar-user-type (#PCDATA) >
+
+ Example:
+
+ <C:calendar-user-type
+ xmlns:C="urn:ietf:params:xml:ns:caldav">INDIVIDUAL<
+ /C:calendar-user-type>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 64]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+14. XML Element Definitions
+
+14.1. CALDAV:schedule-response XML Element
+
+ Name: schedule-response
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: Contains the set of responses for a POST method request.
+
+ Description: See Section 7.3.
+
+ Definition:
+
+ <!ELEMENT schedule-response (response*)>
+
+14.2. CALDAV:response XML Element
+
+ Name: response
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: Contains a single response for a POST method request.
+
+ Description: See Section 7.3.
+
+ Definition:
+
+ <!ELEMENT response (recipient,
+ request-status,
+ calendar-data?,
+ DAV:error?,
+ DAV:responsedescription?)>
+
+ <!-- CALDAV:calendar-data is defined in Section 9.6 of
+ RFC 4791 and when used here uses the definition with
+ content (#PCDATA) only -->
+
+14.3. CALDAV:recipient XML Element
+
+ Name: recipient
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: The calendar user address that the enclosing response for a
+ POST method request is for.
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 65]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ Description: See Section 7.3.
+
+ Definition:
+
+ <!ELEMENT recipient (DAV:href)>
+
+14.4. CALDAV:request-status XML Element
+
+ Name: request-status
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: The iTIP "REQUEST-STATUS" property value for this response.
+
+ Description: See Section 7.3.
+
+ Definition:
+
+ <!ELEMENT request-status (#PCDATA) >
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 66]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+15. Security Considerations
+
+ The process of scheduling involves the sending and receiving of
+ scheduling messages. As a result, the security problems related to
+ messaging in general are relevant here. In particular the
+ authenticity of the scheduling messages needs to be verified.
+ Servers and clients MUST use an HTTP connection protected with TLS as
+ defined in [RFC2818] for all scheduling transactions.
+
+15.1. Verifying Scheduling Transactions
+
+ When handling a scheduling transaction:
+
+ Servers MUST verify that the principal associated with the DAV:
+ owner of the calendar collection in which a scheduling object
+ resource is being manipulated contains a CALDAV:schedule-outbox-
+ URL property value.
+
+ Servers MUST verify that the currently authenticated user has the
+ CALDAV:schedule-send privilege, or a suitable sub-privilege
+ aggregated under this privilege, on the scheduling Outbox
+ collection of the DAV:owner of the calendar collection in which a
+ scheduling object resource is being manipulated.
+
+ Servers MUST only deliver scheduling messages to recipients when
+ the CALDAV:schedule-deliver privilege, or a suitable sub-privilege
+ aggregated under this privilege, is granted on the recipient's
+ scheduling Inbox collection for the principal associated with the
+ DAV:owner of the calendar collection in which a scheduling object
+ resource is being manipulated.
+
+ To prevent impersonation of calendar users, the server MUST verify
+ that the "ORGANIZER" property in an organizer scheduling object
+ resource matches one of the calendar user addresses of the DAV:
+ owner of the calendar collection in which the resource is stored.
+
+ To prevent spoofing of an existing scheduling object resource,
+ servers MUST verify that the "UID" iCalendar property value in a
+ new scheduling object resource does not match that of an existing
+ scheduling object resource with a different "ORGANIZER" property
+ value.
+
+15.2. Verifying Busy Time Information Requests
+
+ When handling a POST request on a scheduling Outbox collection:
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 67]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ Servers MUST verify that the principal associated with the
+ calendar user address specified in the "ORGANIZER" property of the
+ scheduling message data in the request contains a CALDAV:schedule-
+ outbox-URL property value that matches the scheduling Outbox
+ collection targeted by the request.
+
+ Servers MUST verify that the currently authenticated user has the
+ CALDAV:schedule-send privilege, or a sub-privilege aggregated
+ under this privilege, on the scheduling Outbox collection targeted
+ by the request.
+
+ Servers MUST only return valid freebusy information for recipients
+ when the CALDAV:schedule-deliver privilege, or a sub-privilege
+ aggregated under this privilege, is granted on the recipient's
+ scheduling Inbox collection for the principal associated with the
+ DAV:owner of the scheduling Outbox collection targeted by the
+ request.
+
+15.3. Privacy Issues
+
+ As noted in Section 11.1, Attendees can use the Schedule-Reply
+ request header with the value set to "F" to prevent notification to
+ an Organizer that a scheduling object resource was deleted. This
+ allows Attendees to remove unwanted scheduling messages without any
+ response to the Organizer.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 68]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+16. IANA Considerations
+
+16.1. Message Header Field Registrations
+
+ The message header fields below should be added to the Permanent
+ Message Header Field Registry (see [RFC3864]).
+
+16.1.1. Schedule-Reply
+
+ Header field name: Schedule-Reply
+
+ Applicable protocol: http
+
+ Status: standard
+
+ Author/Change controller: IETF
+
+ Specification document(s): this specification (Section 11.1)
+
+ Related information: none
+
+16.1.2. Schedule-Tag
+
+ Header field name: Schedule-Tag
+
+ Applicable protocol: http
+
+ Status: standard
+
+ Author/Change controller: IETF
+
+ Specification document(s): this specification (Section 11.2)
+
+ Related information: none
+
+16.1.3. If-Schedule-Tag-Match
+
+ Header field name: If-Schedule-Tag-Match
+
+ Applicable protocol: http
+
+ Status: standard
+
+ Author/Change controller: IETF
+
+ Specification document(s): this specification (Section 11.3)
+
+ Related information: none
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 69]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+16.2. iCalendar Property Parameter Registrations
+
+ The following iCalendar property parameters should be added to the
+ iCalendar Property Parameter Registry defined in Section 8.3.3 of
+ [RFC5545].
+
+ +---------------------+---------+-----------------------+
+ | Parameter | Status | Reference |
+ +---------------------+---------+-----------------------+
+ | SCHEDULE-AGENT | Current | RFCXXXX, Section 10.1 |
+ | | | |
+ | SCHEDULE-STATUS | Current | RFCXXXX, Section 10.3 |
+ | | | |
+ | SCHEDULE-FORCE-SEND | Current | RFCXXXX, Section 10.2 |
+ +---------------------+---------+-----------------------+
+
+16.3. iCalendar REQUEST-STATUS Value Registrations
+
+ The following iCalendar "REQUEST-STATUS" values should be added to
+ the iCalendar REQUEST-STATUS Value Registry defined in Section 7.3 of
+ [RFC5546].
+
+ +-------------+---------+-------------------------+
+ | Status Code | Status | Reference |
+ +-------------+---------+-------------------------+
+ | 1.0 | Current | RFC XXXX, Section 9.2.1 |
+ | | | |
+ | 1.1 | Current | RFC XXXX, Section 9.2.2 |
+ | | | |
+ | 1.2 | Current | RFC XXXX, Section 9.2.3 |
+ +-------------+---------+-------------------------+
+
+16.4. Additional iCalendar Elements Registries
+
+ This specification adds two new IANA registries for iCalendar
+ elements. Additional codes MAY be used, provided the process
+ described in Section 8.2.1 of [RFC5545] is used to register them.
+
+16.4.1. Schedule Agent Values Registry
+
+ The following table has been used to initialize the schedule agent
+ values registry.
+
+
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 70]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ +----------------+---------+------------------------+
+ | Schedule Agent | Status | Reference |
+ +----------------+---------+------------------------+
+ | SERVER | Current | RFC XXXX, Section 10.1 |
+ | | | |
+ | CLIENT | Current | RFC XXXX, Section 10.1 |
+ | | | |
+ | NONE | Current | RFC XXXX, Section 10.1 |
+ +----------------+---------+------------------------+
+
+16.4.2. Schedule Force Send Values Registry
+
+ The following table has been used to initialize the schedule send
+ values registry.
+
+ +---------------------+---------+------------------------+
+ | Schedule Force Send | Status | Reference |
+ +---------------------+---------+------------------------+
+ | REQUEST | Current | RFC XXXX, Section 10.2 |
+ | | | |
+ | REPLY | Current | RFC XXXX, Section 10.2 |
+ +---------------------+---------+------------------------+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 71]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+17. Acknowledgements
+
+ The authors would like to thank the following individuals for
+ contributing their ideas and support for writing this specification:
+ Mike Douglass, Lisa Dusseault, Helge Hess, Arnaud Quillaud, Julian F.
+ Reschke, Wilfredo Sanchez Vega, Simon Vaillancourt, and Jim
+ Whitehead.
+
+ The authors would also like to thank the Calendaring and Scheduling
+ Consortium for advice with this specification, and for organizing
+ interoperability testing events to help refine it.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 72]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+18. References
+
+18.1. Normative References
+
+ [RFC2119] Bradner, S., "Key words for use in RFCs to
+ Indicate Requirement Levels", BCP 14,
+ RFC 2119, March 1997.
+
+ [RFC2616] Fielding, R., Gettys, J., Mogul, J., Frystyk,
+ H., Masinter, L., Leach, P., and T. Berners-
+ Lee, "Hypertext Transfer Protocol --
+ HTTP/1.1", RFC 2616, June 1999.
+
+ [RFC2818] Rescorla, E., "HTTP Over TLS", RFC 2818,
+ May 2000.
+
+ [RFC3744] Clemm, G., Reschke, J., Sedlar, E., and J.
+ Whitehead, "Web Distributed Authoring and
+ Versioning (WebDAV) Access Control Protocol",
+ RFC 3744, May 2004.
+
+ [RFC3864] Klyne, G., Nottingham, M., and J. Mogul,
+ "Registration Procedures for Message Header
+ Fields", BCP 90, RFC 3864, September 2004.
+
+ [RFC4791] Daboo, C., Desruisseaux, B., and L.
+ Dusseault, "Calendaring Extensions to WebDAV
+ (CalDAV)", RFC 4791, March 2007.
+
+ [RFC4918] Dusseault, L., "HTTP Extensions for Web
+ Distributed Authoring and Versioning
+ (WebDAV)", RFC 4918, June 2007.
+
+ [RFC5234] Crocker, D. and P. Overell, "Augmented BNF
+ for Syntax Specifications: ABNF", STD 68,
+ RFC 5234, January 2008.
+
+ [RFC5545] Desruisseaux, B., "Internet Calendaring and
+ Scheduling Core Object Specification
+ (iCalendar)", RFC 5545, September 2009.
+
+ [RFC5546] Daboo, C., "iCalendar Transport-Independent
+ Interoperability Protocol (iTIP)", RFC 5546,
+ December 2009.
+
+ [W3C.REC-xml-20081126] Paoli, J., Yergeau, F., Bray, T., Sperberg-
+ McQueen, C., and E. Maler, "Extensible Markup
+ Language (XML) 1.0 (Fifth Edition)", World
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 73]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ Wide Web Consortium Recommendation REC-xml-
+ 20081126, November 2008,
+ <http://www.w3.org/TR/2008/REC-xml-20081126>.
+
+18.2. Informative References
+
+ [RFC3283] Mahoney, B., Babics, G., and A. Taler, "Guide
+ to Internet Calendaring", RFC 3283,
+ June 2002.
+
+ [RFC6047] Melnikov, A., "iCalendar Message-Based
+ Interoperability Protocol (iMIP)", RFC 6047,
+ December 2010.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 74]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+Appendix A. Scheduling Privileges Summary
+
+A.1. Scheduling Inbox Privileges
+
+ The following tables specify which scheduling privileges grant the
+ right to a calendar user to deliver a scheduling message to the
+ scheduling Inbox collection of another calendar user. The
+ appropriate behavior depends on the calendar component type as well
+ as the scheduling "METHOD" specified in the scheduling message.
+
+ +--------------------------------+
+ | METHOD for VEVENT and VTODO |
+ +-----------------------------+---------+-------+-----+--------+
+ | Scheduling Inbox Privilege | REQUEST | REPLY | ADD | CANCEL |
+ +-----------------------------+---------+-------+-----+--------+
+ | schedule-deliver | * | * | * | * |
+ | schedule-deliver-invite | * | | * | * |
+ | schedule-deliver-reply | | * | | |
+ | schedule-query-freebusy | | | | |
+ +-----------------------------+---------+-------+-----+--------+
+
+
+ +----------------------+
+ | METHOD for VFREEBUSY |
+ +-----------------------------+----------------------+
+ | Scheduling Inbox Privilege | REQUEST |
+ +-----------------------------+----------------------+
+ | schedule-deliver | * |
+ | schedule-deliver-invite | |
+ | schedule-deliver-reply | |
+ | schedule-query-freebusy | * |
+ +-----------------------------+----------------------+
+
+A.2. Scheduling Outbox Privileges
+
+ The following tables specify which scheduling privileges grant the
+ right to a Calendar User to perform busy time information requests
+ and to submit scheduling messages to other Calendar Users as the
+ result of a scheduling transaction. The appropriate behavior depends
+ on the calendar component type as well as the scheduling "METHOD"
+ specified in the scheduling message.
+
+
+
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 75]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ +--------------------------------+
+ | METHOD for VEVENT and VTODO |
+ +-----------------------------+---------+-------+-----+--------+
+ | Scheduling Outbox Privilege | REQUEST | REPLY | ADD | CANCEL |
+ +-----------------------------+---------+-------+-----+--------+
+ | schedule-send | * | * | * | * |
+ | schedule-send-invite | * | | * | * |
+ | schedule-send-reply | | * | | |
+ | schedule-send-freebusy | | | | |
+ +-----------------------------+---------+-------+-----+--------+
+
+
+ +----------------------+
+ | METHOD for VFREEBUSY |
+ +-----------------------------+----------------------+
+ | Scheduling Outbox Privilege | REQUEST |
+ +-----------------------------+----------------------+
+ | schedule-send | * |
+ | schedule-send-invite | |
+ | schedule-send-reply | |
+ | schedule-send-freebusy | * |
+ +-----------------------------+----------------------+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 76]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+Appendix B. Example Scheduling Transactions
+
+ This section describes some example scheduling transactions that give
+ a general idea of how scheduling is carried out between CalDAV
+ clients and servers from the perspective of meeting Organizers and
+ Attendees.
+
+ In the following examples the requests and responses are incomplete
+ and are only for illustrative purposes. In particular, HTTP
+ authentication headers and behaviors are not shown, even though they
+ are required in normal operation.
+
+B.1. Example: Organizer Inviting Multiple Attendees
+
+ In the following example, Cyrus invites Wilfredo, Bernard and Mike to
+ a single instance event by simply creating a new scheduling object
+ resource in one of his calendar collection by using the PUT method.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 77]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ >> Request <<
+
+ PUT /home/cyrus/calendars/work/9263504FD3AD.ics HTTP/1.1
+ Host: cal.example.com
+ Content-Type: text/calendar; charset="utf-8"
+ Content-Length: xxxx
+ If-None-Match: *
+
+ BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//Example Corp.//CalDAV Client//EN
+ BEGIN:VEVENT
+ UID:9263504FD3AD
+ SEQUENCE:0
+ DTSTAMP:20090602T185254Z
+ DTSTART:20090602T160000Z
+ DTEND:20090602T170000Z
+ TRANSP:OPAQUE
+ SUMMARY:Lunch
+ ORGANIZER;CN="Cyrus Daboo":mailto:cyrus@example.com
+ ATTENDEE;CN="Cyrus Daboo";CUTYPE=INDIVIDUAL;PARTSTAT=ACCEPTED:
+ mailto:cyrus@example.com
+ ATTENDEE;CN="Wilfredo Sanchez Vega";CUTYPE=INDIVIDUAL;PARTSTAT
+ =NEEDS-ACTION;ROLE=REQ-PARTICIPANT;RSVP=TRUE:mailto:wilfredo@
+ example.com
+ ATTENDEE;CN="Bernard Desruisseaux";CUTYPE=INDIVIDUAL;PARTSTAT=
+ NEEDS-ACTION;ROLE=REQ-PARTICIPANT;RSVP=TRUE:mailto:bernard@ex
+ ample.net
+ ATTENDEE;CN="Mike Douglass";CUTYPE=INDIVIDUAL;PARTSTAT=NEEDS-A
+ CTION;RSVP=TRUE:mailto:mike@example.org
+ END:VEVENT
+ END:VCALENDAR
+
+ >> Response <<
+
+ HTTP/1.1 201 Created
+ Content-Length: 0
+ Date: Tue, 02 Jun 2009 18:52:54 GMT
+ Last-Modified: Tue, 02 Jun 2009 18:52:54 GMT
+ ETag: "d85561cfe74a4e785eb4639451b434fb"
+ Schedule-Tag: "488177c8-2ea7-4176-a6cb-fab8cfccdea2"
+
+ Once the event creation has been completed, Cyrus's client will
+ retrieve the event back from the server to get the schedule status of
+ each Attendee. In this example, the server reports that a scheduling
+ message was delivered to Wilfredo, a scheduling message is still
+ pending for Bernard, and the server was unable to deliver a
+ scheduling message to Mike.
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 78]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ >> Request <<
+
+ GET /home/cyrus/calendars/work/9263504FD3AD.ics HTTP/1.1
+ Host: cal.example.com
+
+ >> Response <<
+
+ HTTP/1.1 200 OK
+ Date: Tue, 02 Jun 2009 18:52:58 GMT
+ Last-Modified: Tue, 02 Jun 2009 18:52:58 GMT
+ ETag: "eb897deabc8939589da116714bc99265"
+ Schedule-Tag: "488177c8-2ea7-4176-a6cb-fab8cfccdea2"
+ Content-Type: text/calendar; charset="utf-8"
+ Content-Length: xxxx
+
+ BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//Example Corp.//CalDAV Server//EN
+ BEGIN:VEVENT
+ UID:9263504FD3AD
+ SEQUENCE:0
+ DTSTAMP:20090602T185300Z
+ DTSTART:20090602T160000Z
+ DTEND:20090602T170000Z
+ TRANSP:OPAQUE
+ SUMMARY:Lunch
+ ORGANIZER;CN="Cyrus Daboo":mailto:cyrus@example.com
+ ATTENDEE;CN="Cyrus Daboo";CUTYPE=INDIVIDUAL;PARTSTAT=ACCEPTED:
+ mailto:cyrus@example.com
+ ATTENDEE;CN="Wilfredo Sanchez Vega";CUTYPE=INDIVIDUAL;PARTSTAT
+ =NEEDS-ACTION;ROLE=REQ-PARTICIPANT;RSVP=TRUE;SCHEDULE-STATUS=
+ 1.2:mailto:wilfredo@e
+ xample.com
+ ATTENDEE;CN="Bernard Desruisseaux";CUTYPE=INDIVIDUAL;PARTSTAT=
+ NEEDS-ACTION;ROLE=REQ-PARTICIPANT;RSVP=TRUE;SCHEDULE-STATUS=
+ 1.0:mailto:bernard@example.net
+ ATTENDEE;CN="Mike Douglass";CUTYPE=INDIVIDUAL;PARTSTAT=NEEDS-A
+ CTION;RSVP=TRUE;SCHEDULE-STATUS=3.7:mailto:mike@example.org
+ END:VEVENT
+ END:VCALENDAR
+
+B.2. Example: Attendee Receiving an Invitation
+
+ In the following example, Wilfredo's client retrieves and deletes the
+ new scheduling message that appeared in his scheduling Inbox
+ collection after the server automatically processed it and created a
+ new scheduling object resource in his default calendar collection.
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 79]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ >> Request <<
+
+ GET /home/wilfredo/calendars/inbox/27d93fc0a58c.ics HTTP/1.1
+ Host: cal.example.com
+
+ >> Response <<
+
+ HTTP/1.1 200 OK
+ Date: Tue, 02 Jun 2009 18:59:58 GMT
+ Last-Modified: Tue, 02 Jun 2009 18:59:58 GMT
+ ETag: "da116714bc9926c89395895eb897deab"
+ Content-Type: text/calendar; charset="utf-8"
+ Content-Length: xxxx
+
+ BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//Example Corp.//CalDAV Server//EN
+ METHOD:REQUEST
+ BEGIN:VEVENT
+ UID:9263504FD3AD
+ SEQUENCE:0
+ DTSTAMP:20090602T185254Z
+ DTSTART:20090602T160000Z
+ DTEND:20090602T170000Z
+ TRANSP:OPAQUE
+ SUMMARY:Lunch
+ ORGANIZER;CN="Cyrus Daboo":mailto:cyrus@example.com
+ ATTENDEE;CN="Cyrus Daboo";CUTYPE=INDIVIDUAL;PARTSTAT=ACCEPTED:
+ mailto:cyrus@example.com
+ ATTENDEE;CN="Wilfredo Sanchez Vega";CUTYPE=INDIVIDUAL;PARTSTAT
+ =NEEDS-ACTION;ROLE=REQ-PARTICIPANT;RSVP=TRUE:mailto:wilfredo@
+ example.com
+ ATTENDEE;CN="Bernard Desruisseaux";CUTYPE=INDIVIDUAL;PARTSTAT=
+ NEEDS-ACTION;ROLE=REQ-PARTICIPANT;RSVP=TRUE:mailto:bernard@ex
+ ample.net
+ ATTENDEE;CN="Mike Douglass";CUTYPE=INDIVIDUAL;PARTSTAT=NEEDS-A
+ CTION;RSVP=TRUE:mailto:mike@example.org
+ END:VEVENT
+ END:VCALENDAR
+
+ >> Request <<
+
+ DELETE /home/wilfredo/calendars/inbox/27d93fc0a58c.ics HTTP/1.1
+ Host: cal.example.com
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 80]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ >> Response <<
+
+ HTTP/1.1 204 No Content
+ Date: Tue, 02 Jun 2009 20:40:36 GMT
+
+B.3. Example: Attendee Replying to an Invitation
+
+ In the following example, Wilfredo's accepts Cyrus's invitation and
+ sets a reminder on the event.
+
+ >> Request <<
+
+ PUT /home/wilfredo/calendars/work/BB64861C2228.ics HTTP/1.1
+ Host: cal.example.com
+ If-Schedule-Tag-Match: "e78f23ed-0188-4bab-938d-2aeb3324c7e8"
+ Content-Type: text/calendar; charset="utf-8"
+ Content-Length: xxxx
+
+ BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//Example Corp.//CalDAV Client//EN
+ BEGIN:VEVENT
+ UID:9263504FD3AD
+ SEQUENCE:0
+ DTSTAMP:20090602T185254Z
+ DTSTART:20090602T160000Z
+ DTEND:20090602T170000Z
+ TRANSP:OPAQUE
+ SUMMARY:Lunch
+ ORGANIZER;CN="Cyrus Daboo":mailto:cyrus@example.com
+ ATTENDEE;CN="Cyrus Daboo";CUTYPE=INDIVIDUAL;PARTSTAT=ACCEPTED:
+ mailto:cyrus@example.com
+ ATTENDEE;CN="Wilfredo Sanchez Vega";CUTYPE=INDIVIDUAL;PARTSTAT
+ =ACCEPTED;ROLE=REQ-PARTICIPANT;RSVP=TRUE:mailto:wilfredo@exam
+ ple.com
+ ATTENDEE;CN="Bernard Desruisseaux";CUTYPE=INDIVIDUAL;PARTSTAT=
+ NEEDS-ACTION;ROLE=REQ-PARTICIPANT;RSVP=TRUE:mailto:bernard@ex
+ ample.net
+ ATTENDEE;CN="Mike Douglass";CUTYPE=INDIVIDUAL;PARTSTAT=NEEDS-A
+ CTION;RSVP=TRUE:mailto:mike@example.org
+ BEGIN:VALARM
+ TRIGGER:-PT15M
+ ACTION:DISPLAY
+ DESCRIPTION:Reminder
+ END:VALARM
+ END:VEVENT
+ END:VCALENDAR
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 81]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ >> Response <<
+
+ HTTP/1.1 200 OK
+ Content-Length: 0
+ Date: Tue, 02 Jun 2009 18:57:54 GMT
+ Last-Modified: Tue, 02 Jun 2009 18:57:54 GMT
+ ETag: "eb4639451b434fbd85561cfe74a4e785"
+ Schedule-Tag: "8893ee45-eb9d-428f-b53c-c777daf19e41"
+
+ Once the event modification has been completed, Wilfredo's client
+ will retrieve the event back from the server to get the schedule
+ status of the Organizer.
+
+ >> Request <<
+
+ GET /home/wilfredo/calendars/work/BB64861C2228.ics HTTP/1.1
+ Host: cal.example.com
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 82]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ >> Response <<
+
+ HTTP/1.1 200 OK
+ Date: Tue, 02 Jun 2009 19:03:03 GMT
+ Last-Modified: Tue, 02 Jun 2009 19:02:21 GMT
+ ETag: "5eb897deabda116714bc9926c8939589"
+ Schedule-Tag: "8893ee45-eb9d-428f-b53c-c777daf19e41"
+ Content-Type: text/calendar; charset="utf-8"
+ Content-Length: xxxx
+
+ BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//Example Corp.//CalDAV Client//EN
+ BEGIN:VEVENT
+ UID:9263504FD3AD
+ SEQUENCE:0
+ DTSTAMP:20090602T190221Z
+ DTSTART:20090602T160000Z
+ DTEND:20090602T170000Z
+ TRANSP:OPAQUE
+ SUMMARY:Lunch
+ ORGANIZER;CN="Cyrus Daboo";SCHEDULE-STATUS=1.2:mailto:cyrus@ex
+ ample.com
+ ATTENDEE;CN="Cyrus Daboo";CUTYPE=INDIVIDUAL;PARTSTAT=ACCEPTED:
+ mailto:cyrus@example.com
+ ATTENDEE;CN="Wilfredo Sanchez Vega";CUTYPE=INDIVIDUAL;PARTSTAT
+ =ACCEPTED;ROLE=REQ-PARTICIPANT;RSVP=TRUE:mailto:wilfredo@exam
+ ple.com
+ ATTENDEE;CN="Bernard Desruisseaux";CUTYPE=INDIVIDUAL;PARTSTAT=
+ NEEDS-ACTION;ROLE=REQ-PARTICIPANT;RSVP=TRUE:mailto:bernard@ex
+ ample.net
+ ATTENDEE;CN="Mike Douglass";CUTYPE=INDIVIDUAL;PARTSTAT=NEEDS-A
+ CTION;RSVP=TRUE:mailto:mike@example.org
+ BEGIN:VALARM
+ TRIGGER:-PT15M
+ ACTION:DISPLAY
+ DESCRIPTION:Reminder
+ END:VALARM
+ END:VEVENT
+ END:VCALENDAR
+
+B.4. Example: Organizer Receiving a Reply to an Invitation
+
+ On reception of Wilfredo's reply, Cyrus's server will automatically
+ update Cyrus's scheduling object resource, make Wilfredo's scheduling
+ message available in Cyrus's scheduling Inbox collection, and deliver
+ an updated scheduling message to Bernard to share Wilfredo's updated
+ participation status. In this example, Cyrus's client retrieves and
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 83]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ deletes this scheduling message in his scheduling Inbox collection.
+
+ >> Request <<
+
+ GET /home/cyrus/calendars/inbox/c0a58c27d93f.ics HTTP/1.1
+ Host: cal.example.com
+
+ >> Response <<
+
+ HTTP/1.1 200 OK
+ Date: Tue, 02 Jun 2009 19:05:02 GMT
+ Last-Modified: Tue, 02 Jun 2009 19:04:20 GMT
+ ETag: "9265eb897deabc8939589da116714bc9"
+ Content-Type: text/calendar; charset="utf-8"
+ Content-Length: xxxx
+
+ BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//Example Corp.//CalDAV Server//EN
+ METHOD:REPLY
+ BEGIN:VEVENT
+ UID:9263504FD3AD
+ SEQUENCE:0
+ DTSTAMP:20090602T185754Z
+ DTSTART:20090602T160000Z
+ DTEND:20090602T170000Z
+ ORGANIZER;CN="Cyrus Daboo":mailto:cyrus@example.com
+ ATTENDEE;CN="Wilfredo Sanchez Vega";PARTSTAT=ACCEPTED:mailto:w
+ ilfredo@example.com
+ REQUEST-STATUS:2.0;Success
+ END:VEVENT
+ END:VCALENDAR
+
+ >> Request <<
+
+ DELETE /home/cyrus/calendars/inbox/c0a58c27d93f.ics HTTP/1.1
+ Host: cal.example.com
+
+ >> Response <<
+
+ HTTP/1.1 204 No Content
+ Date: Tue, 02 Jun 2009 19:05:05 GMT
+
+ Cyrus's client then retrieves the event back from the server with
+ Wilfredo's updated participation status.
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 84]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ >> Request <<
+
+ GET /home/cyrus/calendars/work/9263504FD3AD.ics HTTP/1.1
+ Host: cal.example.com
+
+ >> Response <<
+
+ HTTP/1.1 200 OK
+ Date: Tue, 02 Jun 2009 19:05:02 GMT
+ Last-Modified: Tue, 02 Jun 2009 19:04:20 GMT
+ ETag: "eb897deabc8939589da116714bc99265"
+ Schedule-Tag: "132cab27-1fe3-67ab-de13-abd348d1dee3"
+ Content-Type: text/calendar; charset="utf-8"
+ Content-Length: xxxx
+
+ BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//Example Corp.//CalDAV Server//EN
+ BEGIN:VEVENT
+ UID:9263504FD3AD
+ SEQUENCE:0
+ DTSTAMP:20090602T190420Z
+ DTSTART:20090602T160000Z
+ DTEND:20090602T170000Z
+ TRANSP:OPAQUE
+ SUMMARY:Lunch
+ ORGANIZER;CN="Cyrus Daboo":mailto:cyrus@example.com
+ ATTENDEE;CN="Cyrus Daboo";CUTYPE=INDIVIDUAL;PARTSTAT=ACCEPTED:
+ mailto:cyrus@example.com
+ ATTENDEE;CN="Wilfredo Sanchez Vega";CUTYPE=INDIVIDUAL;PARTSTAT
+ =ACCEPTED;ROLE=REQ-PARTICIPANT;RSVP=TRUE;SCHEDULE-STATUS=2.0:
+ mailto:wilfredo@example.com
+ ATTENDEE;CN="Bernard Desruisseaux";CUTYPE=INDIVIDUAL;PARTSTAT=
+ NEEDS-ACTION;ROLE=REQ-PARTICIPANT;RSVP=TRUE;SCHEDULE-STATUS=1
+ .0:mailto:bernard@example.net
+ ATTENDEE;CN="Mike Douglass";CUTYPE=INDIVIDUAL;PARTSTAT=NEEDS-A
+ CTION;RSVP=TRUE;SCHEDULE-STATUS=3.7:mailto:mike@example.org
+ END:VEVENT
+ END:VCALENDAR
+
+B.5. Example: Organizer Requesting Busy Time Information
+
+ In this example, Cyrus requests the busy time information of
+ Wilfredo, Bernard and Mike.
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 85]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ >> Request <<
+
+ POST /home/cyrus/calendars/outbox/ HTTP/1.1
+ Host: cal.example.com
+ Content-Type: text/calendar; charset="utf-8"
+ Content-Length: xxxx
+
+ BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//Example Corp.//CalDAV Client//EN
+ METHOD:REQUEST
+ BEGIN:VFREEBUSY
+ UID:4FD3AD926350
+ DTSTAMP:20090602T190420Z
+ DTSTART:20090602T000000Z
+ DTEND:20090604T000000Z
+ ORGANIZER;CN="Cyrus Daboo":mailto:cyrus@example.com
+ ATTENDEE;CN="Wilfredo Sanchez Vega":mailto:wilfredo@example.com
+ ATTENDEE;CN="Bernard Desruisseaux":mailto:bernard@example.net
+ ATTENDEE;CN="Mike Douglass":mailto:mike@example.org
+ END:VFREEBUSY
+ END:VCALENDAR
+
+ >> Response <<
+
+ HTTP/1.1 200 OK
+ Date: Tue, 02 Jun 2009 20:07:34 GMT
+ Content-Type: application/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <C:schedule-response xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <C:response>
+ <C:recipient>
+ <D:href>mailto:wilfredo@example.com</D:href>
+ </C:recipient>
+ <C:request-status>2.0;Success</C:request-status>
+ <C:calendar-data>BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//Example Corp.//CalDAV Server//EN
+ METHOD:REPLY
+ BEGIN:VFREEBUSY
+ UID:4FD3AD926350
+ DTSTAMP:20090602T200733Z
+ DTSTART:20090602T000000Z
+ DTEND:20090604T000000Z
+ ORGANIZER;CN="Cyrus Daboo":mailto:cyrus@example.com
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 86]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ ATTENDEE;CN="Wilfredo Sanchez Vega":mailto:wilfredo@example.com
+ FREEBUSY;FBTYPE=BUSY:20090602T110000Z/20090602T120000Z
+ FREEBUSY;FBTYPE=BUSY:20090603T170000Z/20090603T180000Z
+ END:VFREEBUSY
+ END:VCALENDAR
+ </C:calendar-data>
+ </C:response>
+ <C:response>
+ <C:recipient>
+ <D:href>mailto:bernard@example.net</D:href>
+ </C:recipient>
+ <C:request-status>2.0;Success</C:request-status>
+ <C:calendar-data>BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//Example Corp.//CalDAV Server//EN
+ METHOD:REPLY
+ BEGIN:VFREEBUSY
+ UID:4FD3AD926350
+ DTSTAMP:20090602T200733Z
+ DTSTART:20090602T000000Z
+ DTEND:20090604T000000Z
+ ORGANIZER;CN="Cyrus Daboo":mailto:cyrus@example.com
+ ATTENDEE;CN="Bernard Desruisseaux":mailto:bernard@example.net
+ FREEBUSY;FBTYPE=BUSY:20090602T150000Z/20090602T160000Z
+ FREEBUSY;FBTYPE=BUSY:20090603T090000Z/20090603T100000Z
+ FREEBUSY;FBTYPE=BUSY:20090603T180000Z/20090603T190000Z
+ END:VFREEBUSY
+ END:VCALENDAR
+ </C:calendar-data>
+ </C:response>
+ <C:response>
+ <C:recipient>
+ <D:href>mailto:mike@example.org</D:href>
+ </C:recipient>
+ <C:request-status>3.7;Invalid calendar user</C:request-status>
+ </C:response>
+ </C:schedule-response>
+
+B.6. Example: User Attempting to Invite Attendee on behalf of Organizer
+
+ In the following example, Cyrus attempts to create, on behalf of
+ Wilfredo, an event with Bernard specified as an Attendee. The
+ request fails since Wilfredo didn't grant Cyrus the right to invite
+ other Calendar Users on his behalf.
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 87]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ >> Request <<
+
+ PUT /home/wilfredo/calendars/work/def456.ics HTTP/1.1
+ Host: cal.example.com
+ Content-Type: text/calendar; charset="utf-8"
+ Content-Length: xxxx
+ If-None-Match: *
+
+ BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//Example Corp.//CalDAV Client//EN
+ BEGIN:VEVENT
+ UID:3504F926D3AD
+ SEQUENCE:0
+ DTSTAMP:20090602T190221Z
+ DTSTART:20090602T230000Z
+ DTEND:20090603T000000Z
+ TRANSP:OPAQUE
+ SUMMARY:Dinner
+ ORGANIZER;CN="Wilfredo Sanchez Vega":mailto:wilfredo@example.com
+ ATTENDEE;CN="Wilfredo Sanchez Vega";CUTYPE=INDIVIDUAL;PARTSTAT=A
+ CCEPTED:mailto:wilfredo@example.com
+ ATTENDEE;CN="Bernard Desruisseaux";CUTYPE=INDIVIDUAL;PARTSTAT=NE
+ EDS-ACTION;ROLE=REQ-PARTICIPANT;RSVP=TRUE:mailto:bernard@exampl
+ e.net
+ END:VEVENT
+ END:VCALENDAR
+
+ >> Response <<
+
+ HTTP/1.1 403 Forbidden
+ Content-Type: application/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <D:error xmlns:D="DAV:" xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:need-privileges>
+ <D:resource>
+ <D:href>/home/wilfredo/calendars/outbox/</D:href>
+ <D:privilege><C:schedule-send-invite/></D:privilege>
+ </D:resource>
+ </D:need-privileges>
+ </D:error>
+
+B.7. Example: Attendee Declining an Instance of a Recurring Event
+
+ In the following example, Bernard declines the second recurrence
+ instance of a daily recurring event he's been invited to by Cyrus.
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 88]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ >> Request <<
+
+ PUT /home/bernard/calendars/work/4FD3AD926350.ics HTTP/1.1
+ Host: cal.example.com
+ Content-Type: text/calendar; charset="utf-8"
+ Content-Length: xxxx
+ If-Schedule-Tag-Match: "7775FB30-7534-489E-A79A-0EA147B933EB"
+
+ BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//Example Corp.//CalDAV Client//EN
+ BEGIN:VTIMEZONE
+ TZID:America/Montreal
+ BEGIN:STANDARD
+ DTSTART:20071104T020000
+ RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+ TZNAME:EST
+ TZOFFSETFROM:-0400
+ TZOFFSETTO:-0500
+ END:STANDARD
+ BEGIN:DAYLIGHT
+ DTSTART:20070311T020000
+ RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+ TZNAME:EDT
+ TZOFFSETFROM:-0500
+ TZOFFSETTO:-0400
+ END:DAYLIGHT
+ END:VTIMEZONE
+ BEGIN:VEVENT
+ UID:9263504FD3AD
+ SEQUENCE:0
+ DTSTAMP:20090602T185254Z
+ DTSTART;TZID=America/Montreal:20090601T150000
+ DTEND;TZID=America/Montreal:20090601T160000
+ RRULE:FREQ=DAILY;INTERVAL=1;COUNT=5
+ TRANSP:OPAQUE
+ SUMMARY:Review Internet-Draft
+ ORGANIZER;CN="Cyrus Daboo":mailto:cyrus@example.com
+ ATTENDEE;CN="Cyrus Daboo";CUTYPE=INDIVIDUAL;PARTSTAT=ACCEPTED:
+ mailto:cyrus@example.com
+ ATTENDEE;CN="Bernard Desruisseaux";CUTYPE=INDIVIDUAL;PARTSTAT=
+ ACCEPTED;ROLE=REQ-PARTICIPANT;RSVP=TRUE:mailto:bernard@exampl
+ e.net
+ END:VEVENT
+ BEGIN:VEVENT
+ UID:9263504FD3AD
+ SEQUENCE:0
+ DTSTAMP:20090603T183823Z
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 89]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ RECURRENCE-ID;TZID=America/Montreal:20090602T150000
+ DTSTART;TZID=America/Montreal:20090602T150000
+ DTEND;TZID=America/Montreal:20090602T160000
+ TRANSP:TRANSPARENT
+ SUMMARY:Review Internet-Draft
+ ORGANIZER;CN="Cyrus Daboo":mailto:cyrus@example.com
+ ATTENDEE;CN="Cyrus Daboo";CUTYPE=INDIVIDUAL;PARTSTAT=ACCEPTED:
+ mailto:cyrus@example.com
+ ATTENDEE;CN="Bernard Desruisseaux";CUTYPE=INDIVIDUAL;PARTSTAT=
+ DECLINED;ROLE=REQ-PARTICIPANT;RSVP=TRUE:mailto:bernard@exampl
+ e.net
+ END:VEVENT
+ END:VCALENDAR
+
+ >> Response <<
+
+ HTTP/1.1 200 OK
+ Content-Length: 0
+ Date: Tue, 02 Jun 2009 18:52:54 GMT
+ Last-Modified: Tue, 02 Jun 2009 18:52:54 GMT
+ ETag: "d85561cfe74a4e785eb4639451b434fb"
+ Schedule-Tag: "488177c8-2ea7-4176-a6cb-fab8cfccdea2"
+
+ Bernard's participation status update will cause his server to
+ deliver a scheduling message to Cyrus. Cyrus's client will find the
+ following reply message from Bernard in Cyrus's scheduling Inbox
+ collection:
+
+ >> Request <<
+
+ GET /home/cyrus/calendars/inbox/9263504FD3AD.ics HTTP/1.1
+ Host: cal.example.com
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 90]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ >> Response <<
+
+ HTTP/1.1 200 OK
+ Date: Tue, 02 Jun 2009 18:52:58 GMT
+ Last-Modified: Tue, 02 Jun 2009 18:52:58 GMT
+ ETag: "eb897deabc8939589da116714bc99265"
+ Content-Type: text/calendar; charset="utf-8"
+ Content-Length: xxxx
+
+ BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//Example Corp.//CalDAV Client//EN
+ METHOD:REPLY
+ BEGIN:VTIMEZONE
+ TZID:America/Montreal
+ BEGIN:STANDARD
+ DTSTART:20071104T020000
+ RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+ TZNAME:EST
+ TZOFFSETFROM:-0400
+ TZOFFSETTO:-0500
+ END:STANDARD
+ BEGIN:DAYLIGHT
+ DTSTART:20070311T020000
+ RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+ TZNAME:EDT
+ TZOFFSETFROM:-0500
+ TZOFFSETTO:-0400
+ END:DAYLIGHT
+ END:VTIMEZONE
+ BEGIN:VEVENT
+ UID:9263504FD3AD
+ SEQUENCE:0
+ DTSTAMP:20090603T183823Z
+ RECURRENCE-ID;TZID=America/Montreal:20090602T150000
+ DTSTART;TZID=America/Montreal:20090602T150000
+ DTEND;TZID=America/Montreal:20090602T160000
+ SUMMARY:Review Internet-Draft
+ ORGANIZER;CN="Cyrus Daboo":mailto:cyrus@example.com
+ ATTENDEE;CN="Bernard Desruisseaux";PARTSTAT=DECLINED:
+ mailto:bernard@example.net
+ REQUEST-STATUS:2.0;Success
+ END:VEVENT
+ END:VCALENDAR
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 91]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+B.8. Example: Attendee Removing an Instance of a Recurring Event
+
+ In the following example, Bernard removes from his calendar the third
+ recurrence instance of a daily recurring event he's been invited to
+ by Cyrus. This is accomplished by the addition of an "EXDATE"
+ property to the scheduling object resource stored by Bernard.
+
+ >> Request <<
+
+ PUT /home/bernard/calendars/work/4FD3AD926350.ics HTTP/1.1
+ Host: cal.example.com
+ Content-Type: text/calendar; charset="utf-8"
+ Content-Length: xxxx
+ If-Schedule-Tag-Match: "488177c8-2ea7-4176-a6cb-fab8cfccdea2"
+
+ BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//Example Corp.//CalDAV Client//EN
+ BEGIN:VTIMEZONE
+ TZID:America/Montreal
+ BEGIN:STANDARD
+ DTSTART:20071104T020000
+ RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+ TZNAME:EST
+ TZOFFSETFROM:-0400
+ TZOFFSETTO:-0500
+ END:STANDARD
+ BEGIN:DAYLIGHT
+ DTSTART:20070311T020000
+ RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+ TZNAME:EDT
+ TZOFFSETFROM:-0500
+ TZOFFSETTO:-0400
+ END:DAYLIGHT
+ END:VTIMEZONE
+ BEGIN:VEVENT
+ UID:9263504FD3AD
+ SEQUENCE:0
+ DTSTAMP:20090602T185254Z
+ DTSTART;TZID=America/Montreal:20090601T150000
+ DTEND;TZID=America/Montreal:20090601T160000
+ RRULE:FREQ=DAILY;INTERVAL=1;COUNT=5
+ EXDATE;TZID=America/Montreal:20090603T150000
+ TRANSP:OPAQUE
+ SUMMARY:Review Internet-Draft
+ ORGANIZER;CN="Cyrus Daboo":mailto:cyrus@example.com
+ ATTENDEE;CN="Cyrus Daboo";CUTYPE=INDIVIDUAL;PARTSTAT=ACCEPTED:
+ mailto:cyrus@example.com
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 92]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ ATTENDEE;CN="Bernard Desruisseaux";CUTYPE=INDIVIDUAL;PARTSTAT=
+ ACCEPTED;ROLE=REQ-PARTICIPANT;RSVP=TRUE:mailto:bernard@exampl
+ e.net
+ END:VEVENT
+ BEGIN:VEVENT
+ UID:9263504FD3AD
+ SEQUENCE:0
+ DTSTAMP:20090603T183823Z
+ RECURRENCE-ID;TZID=America/Montreal:20090602T150000
+ DTSTART;TZID=America/Montreal:20090602T150000
+ DTEND;TZID=America/Montreal:20090602T160000
+ TRANSP:TRANSPARENT
+ SUMMARY:Review Internet-Draft
+ ORGANIZER;CN="Cyrus Daboo":mailto:cyrus@example.com
+ ATTENDEE;CN="Cyrus Daboo";CUTYPE=INDIVIDUAL;PARTSTAT=ACCEPTED:
+ mailto:cyrus@example.com
+ ATTENDEE;CN="Bernard Desruisseaux";CUTYPE=INDIVIDUAL;PARTSTAT=
+ DECLINED;ROLE=REQ-PARTICIPANT;RSVP=TRUE:mailto:bernard@exampl
+ e.net
+ END:VEVENT
+ END:VCALENDAR
+
+ Bernard's deletion of a recurrence instance will cause his server to
+ deliver a scheduling message to Cyrus. Cyrus's client will find the
+ following reply message from Bernard in Cyrus's scheduling Inbox
+ collection:
+
+ >> Request <<
+
+ GET /home/cyrus/calendars/inbox/6504923FD3AD.ics HTTP/1.1
+ Host: cal.example.com
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 93]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ >> Response <<
+
+ HTTP/1.1 200 OK
+ Date: Tue, 02 Jun 2009 18:52:58 GMT
+ Last-Modified: Tue, 02 Jun 2009 18:52:58 GMT
+ ETag: "eb897deabc8939589da116714bc99265"
+ Content-Type: text/calendar; charset="utf-8"
+ Content-Length: xxxx
+
+ BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//Example Corp.//CalDAV Client//EN
+ METHOD:REPLY
+ BEGIN:VTIMEZONE
+ TZID:America/Montreal
+ BEGIN:STANDARD
+ DTSTART:20071104T020000
+ RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+ TZNAME:EST
+ TZOFFSETFROM:-0400
+ TZOFFSETTO:-0500
+ END:STANDARD
+ BEGIN:DAYLIGHT
+ DTSTART:20070311T020000
+ RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+ TZNAME:EDT
+ TZOFFSETFROM:-0500
+ TZOFFSETTO:-0400
+ END:DAYLIGHT
+ END:VTIMEZONE
+ BEGIN:VEVENT
+ UID:9263504FD3AD
+ SEQUENCE:0
+ DTSTAMP:20090603T183823Z
+ RECURRENCE-ID;TZID=America/Montreal:20090603T150000
+ DTSTART;TZID=America/Montreal:20090603T150000
+ DTEND;TZID=America/Montreal:20090603T160000
+ SUMMARY:Review Internet-Draft
+ ORGANIZER;CN="Cyrus Daboo":mailto:cyrus@example.com
+ ATTENDEE;CN="Bernard Desruisseaux";PARTSTAT=DECLINED:
+ mailto:bernard@example.net
+ REQUEST-STATUS:2.0;Success
+ END:VEVENT
+ END:VCALENDAR
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 94]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+Appendix C. Changes (to be removed by RFC Editor prior to publication)
+
+C.1. Changes in -10
+
+ a. Updated to RFC 6047 reference.
+
+ b. Various minor clarifications to behavior and terminology done.
+
+ c. Clarified that Inbox/Outbox are the server's responsibility to
+ create.
+
+ d. Changed MAY to SHOULD for server rejecting organizer PARTSTAT
+ changes of attendees.
+
+ e. Allow COMPLETED as a valid attendee change.
+
+ f. Allow SCHEDULE-STATUS as a valid attendee change on SCHEDULE-
+ AGENT=CLIENT attendee properties.
+
+ g. COPY or MOVE on a calendar collection now declared to be
+ undefined.
+
+ h. Changed pre-condition error codes from 409 to 403.
+
+ i. Clarified that rules 5546 must be used when server processes
+ incoming scheduling messages.
+
+ j. default-calendar-delete-allowed -> default-calendar-needed.
+
+ k. Clarified that SCHEDULE-AGENT must be the same on all matching
+ properties.
+
+ l. Added more text justifying the need for calendar-user-type
+ property.
+
+C.2. Changes in -09
+
+ a. Fixed some examples.
+
+ b. Tweaked XML conventions.
+
+ c. Removed description in SCHEDULE-STATUS example values.
+
+ d. Tweaked 3.7 and 3.8 SCHEDULE-STATUS description to indicate it
+ applies to the Organizer as well as Attendee.
+
+ e. Updated to RFC 5545 reference.
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 95]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ f. AD Review: clarified text about inbox resource deletion being
+ acknowledgment of change.
+
+ g. AD Review: clarified description of freebusy Outbox POST.
+
+ h. AD Review: registered new 1.xx request-status codes and added new
+ restriction on usage as per iTIP.
+
+ i. AD Review: changes SHOULD NOT to MUST NOT for new property
+ parameters when clients send scheduling messages.
+
+ j. AD Review: CALDAV:schedule-calendar-transp now preserved during
+ COPY.
+
+ k. AD Review: changed CALDAV- to CALDAV: in acl descriptions.
+
+ l. AD Review: fixed various minor typos.
+
+ m. AD Review: Added text to new principal properties to indicate
+ that if they are not present, then the user is not enabled for
+ the various scheduling operations.
+
+ n. AD Review: clarified use of CALDAV:calendar-data element in
+ CALDAV:response element.
+
+ o. AD Review: made reference to 5545 IANA registry procedures for
+ the two new element registries.
+
+ p. AD Review: Fixed description of B5. example.
+
+ q. Fixed SCHEDULE-AGENT/SCHEDULE-STATUS behavior for Attendee
+ replies.
+
+C.3. Changes in -08
+
+ a. Added "Updates 4791".
+
+ b. XML conventions changed to match that in CardDAV spec.
+
+ c. Reworded child response behavior for Outbox.
+
+ d. Reworded "octet size".
+
+ e. If-Schedule-Match descriptions changed to remove implication that
+ it is purely a conditional operation.
+
+ f. Schedule-Reply header descriptions generalized to resource
+ removal rather than just HTTP DELETE.
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 96]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ g. Fixed various examples.
+
+C.4. Changes in -07
+
+ a. Restructured document.
+
+ b. Clarified that CALDAV:schedule-calendar-transp only applies to
+ calendar collection.
+
+ c. Removed CALDAV:schedule-state property on scheduling messages in
+ the scheduling Inbox collection.
+
+ d. Added conditional requests on scheduling object resources.
+
+ e. Added section on handling of PARTSTAT.
+
+ f. Added SCHEDULE-FORCE-SEND iCalendar property parameter.
+
+ g. Added clarification on child resources in scheduling Outbox
+ collections.
+
+ h. Clarified Attendee changes that server MUST allow, and removed
+ restrictions on changes that Attendee MUST NOT do.
+
+ i. Added Example Scheduling Transactions appendix.
+
+ j. Scheduling privileges are no longer required to be non-abstract.
+
+ k. Removed handling of REFRESH requests.
+
+ l. Removed handling of VJOURNAL components.
+
+ m. Completed IANA Considerations section.
+
+ n. Added references to RFC3283 and RFC5234.
+
+ o. Updated references to iCalendar, iTIP and iMIP.
+
+C.5. Changes in -06
+
+ a. Removed distinction between scheduling calendar collections and
+ basic calendar collections - now just have calendar collections.
+
+ b. Clients now "MAY" reload data rather than "SHOULD" reload data.
+
+ c. Fixed <C:recipient> in examples.
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 97]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ d. Removed CALDAV:attachments-allowed precondition on POST to Outbox
+ as that is no longer relevant.
+
+ e. Added CALDAV:default-calendar-delete-allowed precondition for
+ DELETE.
+
+ f. Relaxed MUST->MAY for Organizer setting PARTSTAT value.
+
+ g. Tweaked restrictions on Create/Modify to emphasize that 4791
+ restrictions also apply.
+
+ h. Added comment that 'opaque' is the default when the CALDAV:
+ schedule-calendar-transp property is not present.
+
+ i. Description of Schedule-Reply header changed to reflect that it
+ is only relevant for Attendees.
+
+ j. Minor typos fixed.
+
+C.6. Changes in -05
+
+ This draft has changed substantially since the -04 version. The
+ primary reason for this change was implementation experience from a
+ number of vendors who implemented products based on the earlier
+ drafts. Experience showed that the client/server interaction was not
+ reliable in keeping scheduling messages synchronized between
+ organizer and attendees. In addition the latency in updates due to
+ clients being offline proved unacceptable to users. These issues led
+ to the redesign of this specification to support a server-based
+ processing model that eliminates all the problems seen previously.
+ Whilst this adds significant complexity to the server in that it
+ needs to be a full blown iTIP processing agent, it does remove a lot
+ of the same complexity from clients, opening up the possibility of
+ supporting complex scheduling behaviors even with "thin" clients.
+
+ In the judgement of the authors, we consider this new specification
+ to be a substantial improvement over the old one and believe it
+ represents a stronger protocol that will lead to better
+ interoperability.
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 98]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+Authors' Addresses
+
+ Cyrus Daboo
+ Apple Inc.
+ 1 Infinite Loop
+ Cupertino, CA 95014
+ USA
+
+ EMail: cyrus@daboo.name
+ URI: http://www.apple.com/
+
+
+ Bernard Desruisseaux
+ Oracle Corporation
+ 600 Blvd. de Maisonneuve West
+ Suite 1900
+ Montreal, QC H3A 3J2
+ CANADA
+
+ EMail: bernard.desruisseaux@oracle.com
+ URI: http://www.oracle.com/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 99]
+
diff --git a/vendor/sabre/dav/docs/draft-ietf-httpbis-p1-messaging-11.txt b/vendor/sabre/dav/docs/draft-ietf-httpbis-p1-messaging-11.txt
new file mode 100644
index 000000000..c0d449877
--- /dev/null
+++ b/vendor/sabre/dav/docs/draft-ietf-httpbis-p1-messaging-11.txt
@@ -0,0 +1,5152 @@
+
+
+
+HTTPbis Working Group R. Fielding, Ed.
+Internet-Draft Day Software
+Obsoletes: 2616 (if approved) J. Gettys
+Updates: 2817 (if approved) Alcatel-Lucent
+Intended status: Standards Track J. Mogul
+Expires: February 5, 2011 HP
+ H. Frystyk
+ Microsoft
+ L. Masinter
+ Adobe Systems
+ P. Leach
+ Microsoft
+ T. Berners-Lee
+ W3C/MIT
+ Y. Lafon, Ed.
+ W3C
+ J. Reschke, Ed.
+ greenbytes
+ August 4, 2010
+
+
+ HTTP/1.1, part 1: URIs, Connections, and Message Parsing
+ draft-ietf-httpbis-p1-messaging-11
+
+Abstract
+
+ The Hypertext Transfer Protocol (HTTP) is an application-level
+ protocol for distributed, collaborative, hypertext information
+ systems. HTTP has been in use by the World Wide Web global
+ information initiative since 1990. This document is Part 1 of the
+ seven-part specification that defines the protocol referred to as
+ "HTTP/1.1" and, taken together, obsoletes RFC 2616. Part 1 provides
+ an overview of HTTP and its associated terminology, defines the
+ "http" and "https" Uniform Resource Identifier (URI) schemes, defines
+ the generic message syntax and parsing requirements for HTTP message
+ frames, and describes general security concerns for implementations.
+
+Editorial Note (To be removed by RFC Editor)
+
+ Discussion of this draft should take place on the HTTPBIS working
+ group mailing list (ietf-http-wg@w3.org). The current issues list is
+ at <http://tools.ietf.org/wg/httpbis/trac/report/3> and related
+ documents (including fancy diffs) can be found at
+ <http://tools.ietf.org/wg/httpbis/>.
+
+ The changes in this draft are summarized in Appendix D.12.
+
+Status of This Memo
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 1]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ This Internet-Draft is submitted in full conformance with the
+ provisions of BCP 78 and BCP 79.
+
+ Internet-Drafts are working documents of the Internet Engineering
+ Task Force (IETF). Note that other groups may also distribute
+ working documents as Internet-Drafts. The list of current Internet-
+ Drafts is at http://datatracker.ietf.org/drafts/current/.
+
+ Internet-Drafts are draft documents valid for a maximum of six months
+ and may be updated, replaced, or obsoleted by other documents at any
+ time. It is inappropriate to use Internet-Drafts as reference
+ material or to cite them other than as "work in progress."
+
+ This Internet-Draft will expire on February 5, 2011.
+
+Copyright Notice
+
+ Copyright (c) 2010 IETF Trust and the persons identified as the
+ document authors. All rights reserved.
+
+ This document is subject to BCP 78 and the IETF Trust's Legal
+ Provisions Relating to IETF Documents
+ (http://trustee.ietf.org/license-info) in effect on the date of
+ publication of this document. Please review these documents
+ carefully, as they describe your rights and restrictions with respect
+ to this document. Code Components extracted from this document must
+ include Simplified BSD License text as described in Section 4.e of
+ the Trust Legal Provisions and are provided without warranty as
+ described in the Simplified BSD License.
+
+ This document may contain material from IETF Documents or IETF
+ Contributions published or made publicly available before November
+ 10, 2008. The person(s) controlling the copyright in some of this
+ material may not have granted the IETF Trust the right to allow
+ modifications of such material outside the IETF Standards Process.
+ Without obtaining an adequate license from the person(s) controlling
+ the copyright in such materials, this document may not be modified
+ outside the IETF Standards Process, and derivative works of it may
+ not be created outside the IETF Standards Process, except to format
+ it for publication as an RFC or to translate it into languages other
+ than English.
+
+Table of Contents
+
+ 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 6
+ 1.1. Requirements . . . . . . . . . . . . . . . . . . . . . . . 7
+ 1.2. Syntax Notation . . . . . . . . . . . . . . . . . . . . . 7
+ 1.2.1. ABNF Extension: #rule . . . . . . . . . . . . . . . . 7
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 2]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ 1.2.2. Basic Rules . . . . . . . . . . . . . . . . . . . . . 8
+ 1.2.3. ABNF Rules defined in other Parts of the
+ Specification . . . . . . . . . . . . . . . . . . . . 10
+ 2. HTTP-related architecture . . . . . . . . . . . . . . . . . . 10
+ 2.1. Client/Server Messaging . . . . . . . . . . . . . . . . . 10
+ 2.2. Intermediaries . . . . . . . . . . . . . . . . . . . . . . 12
+ 2.3. Caches . . . . . . . . . . . . . . . . . . . . . . . . . . 13
+ 2.4. Transport Independence . . . . . . . . . . . . . . . . . . 14
+ 2.5. HTTP Version . . . . . . . . . . . . . . . . . . . . . . . 14
+ 2.6. Uniform Resource Identifiers . . . . . . . . . . . . . . . 16
+ 2.6.1. http URI scheme . . . . . . . . . . . . . . . . . . . 16
+ 2.6.2. https URI scheme . . . . . . . . . . . . . . . . . . . 18
+ 2.6.3. http and https URI Normalization and Comparison . . . 18
+ 3. HTTP Message . . . . . . . . . . . . . . . . . . . . . . . . . 19
+ 3.1. Message Parsing Robustness . . . . . . . . . . . . . . . . 20
+ 3.2. Header Fields . . . . . . . . . . . . . . . . . . . . . . 20
+ 3.3. Message Body . . . . . . . . . . . . . . . . . . . . . . . 22
+ 3.4. General Header Fields . . . . . . . . . . . . . . . . . . 25
+ 4. Request . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
+ 4.1. Request-Line . . . . . . . . . . . . . . . . . . . . . . . 26
+ 4.1.1. Method . . . . . . . . . . . . . . . . . . . . . . . . 26
+ 4.1.2. request-target . . . . . . . . . . . . . . . . . . . . 27
+ 4.2. The Resource Identified by a Request . . . . . . . . . . . 29
+ 4.3. Effective Request URI . . . . . . . . . . . . . . . . . . 29
+ 5. Response . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
+ 5.1. Status-Line . . . . . . . . . . . . . . . . . . . . . . . 31
+ 5.1.1. Status Code and Reason Phrase . . . . . . . . . . . . 31
+ 6. Protocol Parameters . . . . . . . . . . . . . . . . . . . . . 32
+ 6.1. Date/Time Formats: Full Date . . . . . . . . . . . . . . . 32
+ 6.2. Transfer Codings . . . . . . . . . . . . . . . . . . . . . 34
+ 6.2.1. Chunked Transfer Coding . . . . . . . . . . . . . . . 35
+ 6.2.2. Compression Codings . . . . . . . . . . . . . . . . . 37
+ 6.2.3. Transfer Coding Registry . . . . . . . . . . . . . . . 38
+ 6.3. Product Tokens . . . . . . . . . . . . . . . . . . . . . . 39
+ 6.4. Quality Values . . . . . . . . . . . . . . . . . . . . . . 39
+ 7. Connections . . . . . . . . . . . . . . . . . . . . . . . . . 39
+ 7.1. Persistent Connections . . . . . . . . . . . . . . . . . . 39
+ 7.1.1. Purpose . . . . . . . . . . . . . . . . . . . . . . . 40
+ 7.1.2. Overall Operation . . . . . . . . . . . . . . . . . . 40
+ 7.1.3. Proxy Servers . . . . . . . . . . . . . . . . . . . . 42
+ 7.1.4. Practical Considerations . . . . . . . . . . . . . . . 44
+ 7.2. Message Transmission Requirements . . . . . . . . . . . . 45
+ 7.2.1. Persistent Connections and Flow Control . . . . . . . 45
+ 7.2.2. Monitoring Connections for Error Status Messages . . . 45
+ 7.2.3. Use of the 100 (Continue) Status . . . . . . . . . . . 46
+ 7.2.4. Client Behavior if Server Prematurely Closes
+ Connection . . . . . . . . . . . . . . . . . . . . . . 48
+ 8. Miscellaneous notes that might disappear . . . . . . . . . . . 49
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 3]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ 8.1. Scheme aliases considered harmful . . . . . . . . . . . . 49
+ 8.2. Use of HTTP for proxy communication . . . . . . . . . . . 49
+ 8.3. Interception of HTTP for access control . . . . . . . . . 49
+ 8.4. Use of HTTP by other protocols . . . . . . . . . . . . . . 49
+ 8.5. Use of HTTP by media type specification . . . . . . . . . 49
+ 9. Header Field Definitions . . . . . . . . . . . . . . . . . . . 49
+ 9.1. Connection . . . . . . . . . . . . . . . . . . . . . . . . 49
+ 9.2. Content-Length . . . . . . . . . . . . . . . . . . . . . . 50
+ 9.3. Date . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
+ 9.3.1. Clockless Origin Server Operation . . . . . . . . . . 52
+ 9.4. Host . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
+ 9.5. TE . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
+ 9.6. Trailer . . . . . . . . . . . . . . . . . . . . . . . . . 54
+ 9.7. Transfer-Encoding . . . . . . . . . . . . . . . . . . . . 55
+ 9.8. Upgrade . . . . . . . . . . . . . . . . . . . . . . . . . 55
+ 9.8.1. Upgrade Token Registry . . . . . . . . . . . . . . . . 56
+ 9.9. Via . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
+ 10. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 59
+ 10.1. Header Field Registration . . . . . . . . . . . . . . . . 59
+ 10.2. URI Scheme Registration . . . . . . . . . . . . . . . . . 59
+ 10.3. Internet Media Type Registrations . . . . . . . . . . . . 59
+ 10.3.1. Internet Media Type message/http . . . . . . . . . . . 59
+ 10.3.2. Internet Media Type application/http . . . . . . . . . 61
+ 10.4. Transfer Coding Registry . . . . . . . . . . . . . . . . . 62
+ 10.5. Upgrade Token Registration . . . . . . . . . . . . . . . . 62
+ 11. Security Considerations . . . . . . . . . . . . . . . . . . . 62
+ 11.1. Personal Information . . . . . . . . . . . . . . . . . . . 63
+ 11.2. Abuse of Server Log Information . . . . . . . . . . . . . 63
+ 11.3. Attacks Based On File and Path Names . . . . . . . . . . . 63
+ 11.4. DNS Spoofing . . . . . . . . . . . . . . . . . . . . . . . 63
+ 11.5. Proxies and Caching . . . . . . . . . . . . . . . . . . . 64
+ 11.6. Denial of Service Attacks on Proxies . . . . . . . . . . . 65
+ 12. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 65
+ 13. References . . . . . . . . . . . . . . . . . . . . . . . . . . 66
+ 13.1. Normative References . . . . . . . . . . . . . . . . . . . 66
+ 13.2. Informative References . . . . . . . . . . . . . . . . . . 68
+ Appendix A. Tolerant Applications . . . . . . . . . . . . . . . . 70
+ Appendix B. Compatibility with Previous Versions . . . . . . . . 71
+ B.1. Changes from HTTP/1.0 . . . . . . . . . . . . . . . . . . 71
+ B.1.1. Changes to Simplify Multi-homed Web Servers and
+ Conserve IP Addresses . . . . . . . . . . . . . . . . 72
+ B.2. Compatibility with HTTP/1.0 Persistent Connections . . . . 72
+ B.3. Changes from RFC 2616 . . . . . . . . . . . . . . . . . . 73
+ Appendix C. Collected ABNF . . . . . . . . . . . . . . . . . . . 74
+ Appendix D. Change Log (to be removed by RFC Editor before
+ publication) . . . . . . . . . . . . . . . . . . . . 78
+ D.1. Since RFC2616 . . . . . . . . . . . . . . . . . . . . . . 78
+ D.2. Since draft-ietf-httpbis-p1-messaging-00 . . . . . . . . . 78
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 4]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ D.3. Since draft-ietf-httpbis-p1-messaging-01 . . . . . . . . . 80
+ D.4. Since draft-ietf-httpbis-p1-messaging-02 . . . . . . . . . 81
+ D.5. Since draft-ietf-httpbis-p1-messaging-03 . . . . . . . . . 81
+ D.6. Since draft-ietf-httpbis-p1-messaging-04 . . . . . . . . . 82
+ D.7. Since draft-ietf-httpbis-p1-messaging-05 . . . . . . . . . 82
+ D.8. Since draft-ietf-httpbis-p1-messaging-06 . . . . . . . . . 83
+ D.9. Since draft-ietf-httpbis-p1-messaging-07 . . . . . . . . . 84
+ D.10. Since draft-ietf-httpbis-p1-messaging-08 . . . . . . . . . 84
+ D.11. Since draft-ietf-httpbis-p1-messaging-09 . . . . . . . . . 85
+ D.12. Since draft-ietf-httpbis-p1-messaging-10 . . . . . . . . . 85
+ Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 5]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+1. Introduction
+
+ The Hypertext Transfer Protocol (HTTP) is an application-level
+ request/response protocol that uses extensible semantics and MIME-
+ like message payloads for flexible interaction with network-based
+ hypertext information systems. HTTP relies upon the Uniform Resource
+ Identifier (URI) standard [RFC3986] to indicate request targets and
+ relationships between resources. Messages are passed in a format
+ similar to that used by Internet mail [RFC5322] and the Multipurpose
+ Internet Mail Extensions (MIME) [RFC2045] (see Appendix A of [Part3]
+ for the differences between HTTP and MIME messages).
+
+ HTTP is a generic interface protocol for information systems. It is
+ designed to hide the details of how a service is implemented by
+ presenting a uniform interface to clients that is independent of the
+ types of resources provided. Likewise, servers do not need to be
+ aware of each client's purpose: an HTTP request can be considered in
+ isolation rather than being associated with a specific type of client
+ or a predetermined sequence of application steps. The result is a
+ protocol that can be used effectively in many different contexts and
+ for which implementations can evolve independently over time.
+
+ HTTP is also designed for use as an intermediation protocol for
+ translating communication to and from non-HTTP information systems.
+ HTTP proxies and gateways can provide access to alternative
+ information services by translating their diverse protocols into a
+ hypertext format that can be viewed and manipulated by clients in the
+ same way as HTTP services.
+
+ One consequence of HTTP flexibility is that the protocol cannot be
+ defined in terms of what occurs behind the interface. Instead, we
+ are limited to defining the syntax of communication, the intent of
+ received communication, and the expected behavior of recipients. If
+ the communication is considered in isolation, then successful actions
+ ought to be reflected in corresponding changes to the observable
+ interface provided by servers. However, since multiple clients might
+ act in parallel and perhaps at cross-purposes, we cannot require that
+ such changes be observable beyond the scope of a single response.
+
+ This document is Part 1 of the seven-part specification of HTTP,
+ defining the protocol referred to as "HTTP/1.1" and obsoleting
+ [RFC2616]. Part 1 describes the architectural elements that are used
+ or referred to in HTTP, defines the "http" and "https" URI schemes,
+ describes overall network operation and connection management, and
+ defines HTTP message framing and forwarding requirements. Our goal
+ is to define all of the mechanisms necessary for HTTP message
+ handling that are independent of message semantics, thereby defining
+ the complete set of requirements for message parsers and message-
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 6]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ forwarding intermediaries.
+
+1.1. Requirements
+
+ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
+ "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
+ document are to be interpreted as described in [RFC2119].
+
+ An implementation is not compliant if it fails to satisfy one or more
+ of the "MUST" or "REQUIRED" level requirements for the protocols it
+ implements. An implementation that satisfies all the "MUST" or
+ "REQUIRED" level and all the "SHOULD" level requirements for its
+ protocols is said to be "unconditionally compliant"; one that
+ satisfies all the "MUST" level requirements but not all the "SHOULD"
+ level requirements for its protocols is said to be "conditionally
+ compliant".
+
+1.2. Syntax Notation
+
+ This specification uses the Augmented Backus-Naur Form (ABNF)
+ notation of [RFC5234].
+
+ The following core rules are included by reference, as defined in
+ [RFC5234], Appendix B.1: ALPHA (letters), CR (carriage return), CRLF
+ (CR LF), CTL (controls), DIGIT (decimal 0-9), DQUOTE (double quote),
+ HEXDIG (hexadecimal 0-9/A-F/a-f), LF (line feed), OCTET (any 8-bit
+ sequence of data), SP (space), VCHAR (any visible [USASCII]
+ character), and WSP (whitespace).
+
+ As a syntactic convention, ABNF rule names prefixed with "obs-"
+ denote "obsolete" grammar rules that appear for historical reasons.
+
+1.2.1. ABNF Extension: #rule
+
+ The #rule extension to the ABNF rules of [RFC5234] is used to improve
+ readability.
+
+ A construct "#" is defined, similar to "*", for defining comma-
+ delimited lists of elements. The full form is "<n>#<m>element"
+ indicating at least <n> and at most <m> elements, each separated by a
+ single comma (",") and optional whitespace (OWS, Section 1.2.2).
+
+ Thus,
+
+ 1#element => element *( OWS "," OWS element )
+
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 7]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ and:
+
+ #element => [ 1#element ]
+
+ and for n >= 1 and m > 1:
+
+ <n>#<m>element => element <n-1>*<m-1>( OWS "," OWS element )
+
+ For compatibility with legacy list rules, recipients SHOULD accept
+ empty list elements. In other words, consumers would follow the list
+ productions:
+
+ #element => [ ( "," / element ) *( OWS "," [ OWS element ] ) ]
+
+ 1#element => *( "," OWS ) element *( OWS "," [ OWS element ] )
+
+ Note that empty elements do not contribute to the count of elements
+ present, though.
+
+ For example, given these ABNF productions:
+
+ example-list = 1#example-list-elmt
+ example-list-elmt = token ; see Section 1.2.2
+
+ Then these are valid values for example-list (not including the
+ double quotes, which are present for delimitation only):
+
+ "foo,bar"
+ " foo ,bar,"
+ " foo , ,bar,charlie "
+ "foo ,bar, charlie "
+
+ But these values would be invalid, as at least one non-empty element
+ is required:
+
+ ""
+ ","
+ ", ,"
+
+ Appendix C shows the collected ABNF, with the list rules expanded as
+ explained above.
+
+1.2.2. Basic Rules
+
+ HTTP/1.1 defines the sequence CR LF as the end-of-line marker for all
+ protocol elements other than the message-body (see Appendix A for
+ tolerant applications).
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 8]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ This specification uses three rules to denote the use of linear
+ whitespace: OWS (optional whitespace), RWS (required whitespace), and
+ BWS ("bad" whitespace).
+
+ The OWS rule is used where zero or more linear whitespace characters
+ might appear. OWS SHOULD either not be produced or be produced as a
+ single SP character. Multiple OWS characters that occur within
+ field-content SHOULD be replaced with a single SP before interpreting
+ the field value or forwarding the message downstream.
+
+ RWS is used when at least one linear whitespace character is required
+ to separate field tokens. RWS SHOULD be produced as a single SP
+ character. Multiple RWS characters that occur within field-content
+ SHOULD be replaced with a single SP before interpreting the field
+ value or forwarding the message downstream.
+
+ BWS is used where the grammar allows optional whitespace for
+ historical reasons but senders SHOULD NOT produce it in messages.
+ HTTP/1.1 recipients MUST accept such bad optional whitespace and
+ remove it before interpreting the field value or forwarding the
+ message downstream.
+
+
+ OWS = *( [ obs-fold ] WSP )
+ ; "optional" whitespace
+ RWS = 1*( [ obs-fold ] WSP )
+ ; "required" whitespace
+ BWS = OWS
+ ; "bad" whitespace
+ obs-fold = CRLF
+ ; see Section 3.2
+
+ Many HTTP/1.1 header field values consist of words (token or quoted-
+ string) separated by whitespace or special characters. These special
+ characters MUST be in a quoted string to be used within a parameter
+ value (as defined in Section 6.2).
+
+ word = token / quoted-string
+
+ token = 1*tchar
+
+ tchar = "!" / "#" / "$" / "%" / "&" / "'" / "*"
+ / "+" / "-" / "." / "^" / "_" / "`" / "|" / "~"
+ / DIGIT / ALPHA
+ ; any VCHAR, except special
+
+ special = "(" / ")" / "<" / ">" / "@" / ","
+ / ";" / ":" / "\" / DQUOTE / "/" / "["
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 9]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ / "]" / "?" / "=" / "{" / "}"
+
+ A string of text is parsed as a single word if it is quoted using
+ double-quote marks.
+
+ quoted-string = DQUOTE *( qdtext / quoted-pair ) DQUOTE
+ qdtext = OWS / %x21 / %x23-5B / %x5D-7E / obs-text
+ ; OWS / <VCHAR except DQUOTE and "\"> / obs-text
+ obs-text = %x80-FF
+
+ The backslash character ("\") can be used as a single-character
+ quoting mechanism within quoted-string constructs:
+
+ quoted-pair = "\" ( WSP / VCHAR / obs-text )
+
+ Producers SHOULD NOT escape characters that do not require escaping
+ (i.e., other than DQUOTE and the backslash character).
+
+1.2.3. ABNF Rules defined in other Parts of the Specification
+
+ The ABNF rules below are defined in other parts:
+
+ request-header = <request-header, defined in [Part2], Section 3>
+ response-header = <response-header, defined in [Part2], Section 5>
+
+
+ MIME-Version = <MIME-Version, defined in [Part3], Appendix A.1>
+
+
+ Cache-Control = <Cache-Control, defined in [Part6], Section 3.4>
+ Pragma = <Pragma, defined in [Part6], Section 3.4>
+ Warning = <Warning, defined in [Part6], Section 3.6>
+
+2. HTTP-related architecture
+
+ HTTP was created for the World Wide Web architecture and has evolved
+ over time to support the scalability needs of a worldwide hypertext
+ system. Much of that architecture is reflected in the terminology
+ and syntax productions used to define HTTP.
+
+2.1. Client/Server Messaging
+
+ HTTP is a stateless request/response protocol that operates by
+ exchanging messages across a reliable transport or session-layer
+ connection. An HTTP "client" is a program that establishes a
+ connection to a server for the purpose of sending one or more HTTP
+ requests. An HTTP "server" is a program that accepts connections in
+ order to service HTTP requests by sending HTTP responses.
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 10]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ Note that the terms client and server refer only to the roles that
+ these programs perform for a particular connection. The same program
+ might act as a client on some connections and a server on others. We
+ use the term "user agent" to refer to the program that initiates a
+ request, such as a WWW browser, editor, or spider (web-traversing
+ robot), and the term "origin server" to refer to the program that can
+ originate authoritative responses to a request. For general
+ requirements, we use the term "sender" to refer to whichever
+ component sent a given message and the term "recipient" to refer to
+ any component that receives the message.
+
+ Most HTTP communication consists of a retrieval request (GET) for a
+ representation of some resource identified by a URI. In the simplest
+ case, this might be accomplished via a single bidirectional
+ connection (===) between the user agent (UA) and the origin server
+ (O).
+
+ request >
+ UA ======================================= O
+ < response
+
+ A client sends an HTTP request to the server in the form of a request
+ message (Section 4), beginning with a method, URI, and protocol
+ version, followed by MIME-like header fields containing request
+ modifiers, client information, and payload metadata, an empty line to
+ indicate the end of the header section, and finally the payload body
+ (if any).
+
+ A server responds to the client's request by sending an HTTP response
+ message (Section 5), beginning with a status line that includes the
+ protocol version, a success or error code, and textual reason phrase,
+ followed by MIME-like header fields containing server information,
+ resource metadata, and payload metadata, an empty line to indicate
+ the end of the header section, and finally the payload body (if any).
+
+ The following example illustrates a typical message exchange for a
+ GET request on the URI "http://www.example.com/hello.txt":
+
+ client request:
+
+ GET /hello.txt HTTP/1.1
+ User-Agent: curl/7.16.3 libcurl/7.16.3 OpenSSL/0.9.7l zlib/1.2.3
+ Host: www.example.com
+ Accept: */*
+
+
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 11]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ server response:
+
+ HTTP/1.1 200 OK
+ Date: Mon, 27 Jul 2009 12:28:53 GMT
+ Server: Apache
+ Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT
+ ETag: "34aa387-d-1568eb00"
+ Accept-Ranges: bytes
+ Content-Length: 14
+ Vary: Accept-Encoding
+ Content-Type: text/plain
+
+ Hello World!
+
+2.2. Intermediaries
+
+ A more complicated situation occurs when one or more intermediaries
+ are present in the request/response chain. There are three common
+ forms of intermediary: proxy, gateway, and tunnel. In some cases, a
+ single intermediary might act as an origin server, proxy, gateway, or
+ tunnel, switching behavior based on the nature of each request.
+
+ > > > >
+ UA =========== A =========== B =========== C =========== O
+ < < < <
+
+ The figure above shows three intermediaries (A, B, and C) between the
+ user agent and origin server. A request or response message that
+ travels the whole chain will pass through four separate connections.
+ Some HTTP communication options might apply only to the connection
+ with the nearest, non-tunnel neighbor, only to the end-points of the
+ chain, or to all connections along the chain. Although the diagram
+ is linear, each participant might be engaged in multiple,
+ simultaneous communications. For example, B might be receiving
+ requests from many clients other than A, and/or forwarding requests
+ to servers other than C, at the same time that it is handling A's
+ request.
+
+ We use the terms "upstream" and "downstream" to describe various
+ requirements in relation to the directional flow of a message: all
+ messages flow from upstream to downstream. Likewise, we use the
+ terms "inbound" and "outbound" to refer to directions in relation to
+ the request path: "inbound" means toward the origin server and
+ "outbound" means toward the user agent.
+
+ A "proxy" is a message forwarding agent that is selected by the
+ client, usually via local configuration rules, to receive requests
+ for some type(s) of absolute URI and attempt to satisfy those
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 12]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ requests via translation through the HTTP interface. Some
+ translations are minimal, such as for proxy requests for "http" URIs,
+ whereas other requests might require translation to and from entirely
+ different application-layer protocols. Proxies are often used to
+ group an organization's HTTP requests through a common intermediary
+ for the sake of security, annotation services, or shared caching.
+
+ A "gateway" (a.k.a., "reverse proxy") is a receiving agent that acts
+ as a layer above some other server(s) and translates the received
+ requests to the underlying server's protocol. Gateways are often
+ used for load balancing or partitioning HTTP services across multiple
+ machines. Unlike a proxy, a gateway receives requests as if it were
+ the origin server for the target resource; the requesting client will
+ not be aware that it is communicating with a gateway. A gateway
+ communicates with the client as if the gateway is the origin server
+ and thus is subject to all of the requirements on origin servers for
+ that connection. A gateway communicates with inbound servers using
+ any protocol it desires, including private extensions to HTTP that
+ are outside the scope of this specification.
+
+ A "tunnel" acts as a blind relay between two connections without
+ changing the messages. Once active, a tunnel is not considered a
+ party to the HTTP communication, though the tunnel might have been
+ initiated by an HTTP request. A tunnel ceases to exist when both
+ ends of the relayed connection are closed. Tunnels are used to
+ extend a virtual connection through an intermediary, such as when
+ transport-layer security is used to establish private communication
+ through a shared firewall proxy.
+
+2.3. Caches
+
+ A "cache" is a local store of previous response messages and the
+ subsystem that controls its message storage, retrieval, and deletion.
+ A cache stores cacheable responses in order to reduce the response
+ time and network bandwidth consumption on future, equivalent
+ requests. Any client or server MAY employ a cache, though a cache
+ cannot be used by a server while it is acting as a tunnel.
+
+ The effect of a cache is that the request/response chain is shortened
+ if one of the participants along the chain has a cached response
+ applicable to that request. The following illustrates the resulting
+ chain if B has a cached copy of an earlier response from O (via C)
+ for a request which has not been cached by UA or A.
+
+ > >
+ UA =========== A =========== B - - - - - - C - - - - - - O
+ < <
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 13]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ A response is "cacheable" if a cache is allowed to store a copy of
+ the response message for use in answering subsequent requests. Even
+ when a response is cacheable, there might be additional constraints
+ placed by the client or by the origin server on when that cached
+ response can be used for a particular request. HTTP requirements for
+ cache behavior and cacheable responses are defined in Section 2 of
+ [Part6].
+
+ There are a wide variety of architectures and configurations of
+ caches and proxies deployed across the World Wide Web and inside
+ large organizations. These systems include national hierarchies of
+ proxy caches to save transoceanic bandwidth, systems that broadcast
+ or multicast cache entries, organizations that distribute subsets of
+ cached data via optical media, and so on.
+
+2.4. Transport Independence
+
+ HTTP systems are used in a wide variety of environments, from
+ corporate intranets with high-bandwidth links to long-distance
+ communication over low-power radio links and intermittent
+ connectivity.
+
+ HTTP communication usually takes place over TCP/IP connections. The
+ default port is TCP 80
+ (<http://www.iana.org/assignments/port-numbers>), but other ports can
+ be used. This does not preclude HTTP from being implemented on top
+ of any other protocol on the Internet, or on other networks. HTTP
+ only presumes a reliable transport; any protocol that provides such
+ guarantees can be used; the mapping of the HTTP/1.1 request and
+ response structures onto the transport data units of the protocol in
+ question is outside the scope of this specification.
+
+ In HTTP/1.0, most implementations used a new connection for each
+ request/response exchange. In HTTP/1.1, a connection might be used
+ for one or more request/response exchanges, although connections
+ might be closed for a variety of reasons (see Section 7.1).
+
+2.5. HTTP Version
+
+ HTTP uses a "<major>.<minor>" numbering scheme to indicate versions
+ of the protocol. The protocol versioning policy is intended to allow
+ the sender to indicate the format of a message and its capacity for
+ understanding further HTTP communication, rather than the features
+ obtained via that communication. No change is made to the version
+ number for the addition of message components which do not affect
+ communication behavior or which only add to extensible field values.
+ The <minor> number is incremented when the changes made to the
+ protocol add features which do not change the general message parsing
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 14]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ algorithm, but which might add to the message semantics and imply
+ additional capabilities of the sender. The <major> number is
+ incremented when the format of a message within the protocol is
+ changed. See [RFC2145] for a fuller explanation.
+
+ The version of an HTTP message is indicated by an HTTP-Version field
+ in the first line of the message. HTTP-Version is case-sensitive.
+
+ HTTP-Version = HTTP-Prot-Name "/" 1*DIGIT "." 1*DIGIT
+ HTTP-Prot-Name = %x48.54.54.50 ; "HTTP", case-sensitive
+
+ Note that the major and minor numbers MUST be treated as separate
+ integers and that each MAY be incremented higher than a single digit.
+ Thus, HTTP/2.4 is a lower version than HTTP/2.13, which in turn is
+ lower than HTTP/12.3. Leading zeros MUST be ignored by recipients
+ and MUST NOT be sent.
+
+ An application that sends a request or response message that includes
+ HTTP-Version of "HTTP/1.1" MUST be at least conditionally compliant
+ with this specification. Applications that are at least
+ conditionally compliant with this specification SHOULD use an HTTP-
+ Version of "HTTP/1.1" in their messages, and MUST do so for any
+ message that is not compatible with HTTP/1.0. For more details on
+ when to send specific HTTP-Version values, see [RFC2145].
+
+ The HTTP version of an application is the highest HTTP version for
+ which the application is at least conditionally compliant.
+
+ Proxy and gateway applications need to be careful when forwarding
+ messages in protocol versions different from that of the application.
+ Since the protocol version indicates the protocol capability of the
+ sender, a proxy/gateway MUST NOT send a message with a version
+ indicator which is greater than its actual version. If a higher
+ version request is received, the proxy/gateway MUST either downgrade
+ the request version, or respond with an error, or switch to tunnel
+ behavior.
+
+ Due to interoperability problems with HTTP/1.0 proxies discovered
+ since the publication of [RFC2068], caching proxies MUST, gateways
+ MAY, and tunnels MUST NOT upgrade the request to the highest version
+ they support. The proxy/gateway's response to that request MUST be
+ in the same major version as the request.
+
+ Note: Converting between versions of HTTP might involve
+ modification of header fields required or forbidden by the
+ versions involved.
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 15]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+2.6. Uniform Resource Identifiers
+
+ Uniform Resource Identifiers (URIs) [RFC3986] are used throughout
+ HTTP as the means for identifying resources. URI references are used
+ to target requests, indicate redirects, and define relationships.
+ HTTP does not limit what a resource might be; it merely defines an
+ interface that can be used to interact with a resource via HTTP.
+ More information on the scope of URIs and resources can be found in
+ [RFC3986].
+
+ This specification adopts the definitions of "URI-reference",
+ "absolute-URI", "relative-part", "port", "host", "path-abempty",
+ "path-absolute", "query", and "authority" from [RFC3986]. In
+ addition, we define a partial-URI rule for protocol elements that
+ allow a relative URI without a fragment.
+
+ URI-reference = <URI-reference, defined in [RFC3986], Section 4.1>
+ absolute-URI = <absolute-URI, defined in [RFC3986], Section 4.3>
+ relative-part = <relative-part, defined in [RFC3986], Section 4.2>
+ authority = <authority, defined in [RFC3986], Section 3.2>
+ path-abempty = <path-abempty, defined in [RFC3986], Section 3.3>
+ path-absolute = <path-absolute, defined in [RFC3986], Section 3.3>
+ port = <port, defined in [RFC3986], Section 3.2.3>
+ query = <query, defined in [RFC3986], Section 3.4>
+ uri-host = <host, defined in [RFC3986], Section 3.2.2>
+
+ partial-URI = relative-part [ "?" query ]
+
+ Each protocol element in HTTP that allows a URI reference will
+ indicate in its ABNF production whether the element allows only a URI
+ in absolute form (absolute-URI), any relative reference (relative-
+ ref), or some other subset of the URI-reference grammar. Unless
+ otherwise indicated, URI references are parsed relative to the
+ request target (the default base URI for both the request and its
+ corresponding response).
+
+2.6.1. http URI scheme
+
+ The "http" URI scheme is hereby defined for the purpose of minting
+ identifiers according to their association with the hierarchical
+ namespace governed by a potential HTTP origin server listening for
+ TCP connections on a given port. The HTTP server is identified via
+ the generic syntax's authority component, which includes a host
+ identifier and optional TCP port, and the remainder of the URI is
+ considered to be identifying data corresponding to a resource for
+ which that server might provide an HTTP interface.
+
+ http-URI = "http:" "//" authority path-abempty [ "?" query ]
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 16]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ The host identifier within an authority component is defined in
+ [RFC3986], Section 3.2.2. If host is provided as an IP literal or
+ IPv4 address, then the HTTP server is any listener on the indicated
+ TCP port at that IP address. If host is a registered name, then that
+ name is considered an indirect identifier and the recipient might use
+ a name resolution service, such as DNS, to find the address of a
+ listener for that host. The host MUST NOT be empty; if an "http" URI
+ is received with an empty host, then it MUST be rejected as invalid.
+ If the port subcomponent is empty or not given, then TCP port 80 is
+ assumed (the default reserved port for WWW services).
+
+ Regardless of the form of host identifier, access to that host is not
+ implied by the mere presence of its name or address. The host might
+ or might not exist and, even when it does exist, might or might not
+ be running an HTTP server or listening to the indicated port. The
+ "http" URI scheme makes use of the delegated nature of Internet names
+ and addresses to establish a naming authority (whatever entity has
+ the ability to place an HTTP server at that Internet name or address)
+ and allows that authority to determine which names are valid and how
+ they might be used.
+
+ When an "http" URI is used within a context that calls for access to
+ the indicated resource, a client MAY attempt access by resolving the
+ host to an IP address, establishing a TCP connection to that address
+ on the indicated port, and sending an HTTP request message to the
+ server containing the URI's identifying data as described in
+ Section 4. If the server responds to that request with a non-interim
+ HTTP response message, as described in Section 5, then that response
+ is considered an authoritative answer to the client's request.
+
+ Although HTTP is independent of the transport protocol, the "http"
+ scheme is specific to TCP-based services because the name delegation
+ process depends on TCP for establishing authority. An HTTP service
+ based on some other underlying connection protocol would presumably
+ be identified using a different URI scheme, just as the "https"
+ scheme (below) is used for servers that require an SSL/TLS transport
+ layer on a connection. Other protocols might also be used to provide
+ access to "http" identified resources --- it is only the
+ authoritative interface used for mapping the namespace that is
+ specific to TCP.
+
+ The URI generic syntax for authority also includes a deprecated
+ userinfo subcomponent ([RFC3986], Section 3.2.1) for including user
+ authentication information in the URI. The userinfo subcomponent
+ (and its "@" delimiter) MUST NOT be used in an "http" URI. URI
+ reference recipients SHOULD parse for the existence of userinfo and
+ treat its presence as an error, likely indicating that the deprecated
+ subcomponent is being used to obscure the authority for the sake of
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 17]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ phishing attacks.
+
+2.6.2. https URI scheme
+
+ The "https" URI scheme is hereby defined for the purpose of minting
+ identifiers according to their association with the hierarchical
+ namespace governed by a potential HTTP origin server listening for
+ SSL/TLS-secured connections on a given TCP port.
+
+ All of the requirements listed above for the "http" scheme are also
+ requirements for the "https" scheme, except that a default TCP port
+ of 443 is assumed if the port subcomponent is empty or not given, and
+ the TCP connection MUST be secured for privacy through the use of
+ strong encryption prior to sending the first HTTP request.
+
+ https-URI = "https:" "//" authority path-abempty [ "?" query ]
+
+ Unlike the "http" scheme, responses to "https" identified requests
+ are never "public" and thus are ineligible for shared caching. Their
+ default is "private" and might be further constrained via use of the
+ Cache-Control header field.
+
+ Resources made available via the "https" scheme have no shared
+ identity with the "http" scheme even if their resource identifiers
+ only differ by the single "s" in the scheme name. They are different
+ services governed by different authorities. However, some extensions
+ to HTTP that apply to entire host domains, such as the Cookie
+ protocol, do allow one service to effect communication with the other
+ services based on host domain matching.
+
+ The process for authoritative access to an "https" identified
+ resource is defined in [RFC2818].
+
+2.6.3. http and https URI Normalization and Comparison
+
+ Since the "http" and "https" schemes conform to the URI generic
+ syntax, such URIs are normalized and compared according to the
+ algorithm defined in [RFC3986], Section 6, using the defaults
+ described above for each scheme.
+
+ If the port is equal to the default port for a scheme, the normal
+ form is to elide the port subcomponent. Likewise, an empty path
+ component is equivalent to an absolute path of "/", so the normal
+ form is to provide a path of "/" instead. The scheme and host are
+ case-insensitive and normally provided in lowercase; all other
+ components are compared in a case-sensitive manner. Characters other
+ than those in the "reserved" set are equivalent to their percent-
+ encoded octets (see [RFC3986], Section 2.1): the normal form is to
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 18]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ not encode them.
+
+ For example, the following three URIs are equivalent:
+
+ http://example.com:80/~smith/home.html
+ http://EXAMPLE.com/%7Esmith/home.html
+ http://EXAMPLE.com:/%7esmith/home.html
+
+ [[TODO-not-here: This paragraph does not belong here. --roy]] If
+ path-abempty is the empty string (i.e., there is no slash "/" path
+ separator following the authority), then the "http" URI MUST be given
+ as "/" when used as a request-target (Section 4.1.2). If a proxy
+ receives a host name which is not a fully qualified domain name, it
+ MAY add its domain to the host name it received. If a proxy receives
+ a fully qualified domain name, the proxy MUST NOT change the host
+ name.
+
+3. HTTP Message
+
+ All HTTP/1.1 messages consist of a start-line followed by a sequence
+ of characters in a format similar to the Internet Message Format
+ [RFC5322]: zero or more header fields (collectively referred to as
+ the "headers" or the "header section"), an empty line indicating the
+ end of the header section, and an optional message-body.
+
+ An HTTP message can either be a request from client to server or a
+ response from server to client. Syntactically, the two types of
+ message differ only in the start-line, which is either a Request-Line
+ (for requests) or a Status-Line (for responses), and in the algorithm
+ for determining the length of the message-body (Section 3.3). In
+ theory, a client could receive requests and a server could receive
+ responses, distinguishing them by their different start-line formats,
+ but in practice servers are implemented to only expect a request (a
+ response is interpreted as an unknown or invalid request method) and
+ clients are implemented to only expect a response.
+
+ HTTP-message = start-line
+ *( header-field CRLF )
+ CRLF
+ [ message-body ]
+ start-line = Request-Line / Status-Line
+
+ Whitespace (WSP) MUST NOT be sent between the start-line and the
+ first header field. The presence of whitespace might be an attempt
+ to trick a noncompliant implementation of HTTP into ignoring that
+ field or processing the next line as a new request, either of which
+ might result in security issues when implementations within the
+ request chain interpret the same message differently. HTTP/1.1
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 19]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ servers MUST reject such a message with a 400 (Bad Request) response.
+
+3.1. Message Parsing Robustness
+
+ In the interest of robustness, servers SHOULD ignore at least one
+ empty line received where a Request-Line is expected. In other
+ words, if the server is reading the protocol stream at the beginning
+ of a message and receives a CRLF first, it SHOULD ignore the CRLF.
+
+ Some old HTTP/1.0 client implementations generate an extra CRLF after
+ a POST request as a lame workaround for some early server
+ applications that failed to read message-body content that was not
+ terminated by a line-ending. An HTTP/1.1 client MUST NOT preface or
+ follow a request with an extra CRLF. If terminating the request
+ message-body with a line-ending is desired, then the client MUST
+ include the terminating CRLF octets as part of the message-body
+ length.
+
+ The normal procedure for parsing an HTTP message is to read the
+ start-line into a structure, read each header field into a hash table
+ by field name until the empty line, and then use the parsed data to
+ determine if a message-body is expected. If a message-body has been
+ indicated, then it is read as a stream until an amount of octets
+ equal to the message-body length is read or the connection is closed.
+ Care must be taken to parse an HTTP message as a sequence of octets
+ in an encoding that is a superset of US-ASCII. Attempting to parse
+ HTTP as a stream of Unicode characters in a character encoding like
+ UTF-16 might introduce security flaws due to the differing ways that
+ such parsers interpret invalid characters.
+
+ HTTP allows the set of defined header fields to be extended without
+ changing the protocol version (see Section 10.1). However, such
+ fields might not be recognized by a downstream recipient and might be
+ stripped by non-transparent intermediaries. Unrecognized header
+ fields MUST be forwarded by transparent proxies and SHOULD be ignored
+ by a recipient.
+
+3.2. Header Fields
+
+ Each HTTP header field consists of a case-insensitive field name
+ followed by a colon (":"), optional whitespace, and the field value.
+
+ header-field = field-name ":" OWS [ field-value ] OWS
+ field-name = token
+ field-value = *( field-content / OWS )
+ field-content = *( WSP / VCHAR / obs-text )
+
+ No whitespace is allowed between the header field name and colon.
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 20]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ For security reasons, any request message received containing such
+ whitespace MUST be rejected with a response code of 400 (Bad
+ Request). A proxy MUST remove any such whitespace from a response
+ message before forwarding the message downstream.
+
+ A field value MAY be preceded by optional whitespace (OWS); a single
+ SP is preferred. The field value does not include any leading or
+ trailing white space: OWS occurring before the first non-whitespace
+ character of the field value or after the last non-whitespace
+ character of the field value is ignored and SHOULD be removed before
+ further processing (as this does not change the meaning of the header
+ field).
+
+ The order in which header fields with differing field names are
+ received is not significant. However, it is "good practice" to send
+ header fields that contain control data first, such as Host on
+ requests and Date on responses, so that implementations can decide
+ when not to handle a message as early as possible. A server MUST
+ wait until the entire header section is received before interpreting
+ a request message, since later header fields might include
+ conditionals, authentication credentials, or deliberately misleading
+ duplicate header fields that would impact request processing.
+
+ Multiple header fields with the same field name MUST NOT be sent in a
+ message unless the entire field value for that header field is
+ defined as a comma-separated list [i.e., #(values)]. Multiple header
+ fields with the same field name can be combined into one "field-name:
+ field-value" pair, without changing the semantics of the message, by
+ appending each subsequent field value to the combined field value in
+ order, separated by a comma. The order in which header fields with
+ the same field name are received is therefore significant to the
+ interpretation of the combined field value; a proxy MUST NOT change
+ the order of these field values when forwarding a message.
+
+ Note: The "Set-Cookie" header as implemented in practice (as
+ opposed to how it is specified in [RFC2109]) can occur multiple
+ times, but does not use the list syntax, and thus cannot be
+ combined into a single line. (See Appendix A.2.3 of [Kri2001] for
+ details.) Also note that the Set-Cookie2 header specified in
+ [RFC2965] does not share this problem.
+
+ Historically, HTTP header field values could be extended over
+ multiple lines by preceding each extra line with at least one space
+ or horizontal tab character (line folding). This specification
+ deprecates such line folding except within the message/http media
+ type (Section 10.3.1). HTTP/1.1 senders MUST NOT produce messages
+ that include line folding (i.e., that contain any field-content that
+ matches the obs-fold rule) unless the message is intended for
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 21]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ packaging within the message/http media type. HTTP/1.1 recipients
+ SHOULD accept line folding and replace any embedded obs-fold
+ whitespace with a single SP prior to interpreting the field value or
+ forwarding the message downstream.
+
+ Historically, HTTP has allowed field content with text in the ISO-
+ 8859-1 [ISO-8859-1] character encoding and supported other character
+ sets only through use of [RFC2047] encoding. In practice, most HTTP
+ header field values use only a subset of the US-ASCII character
+ encoding [USASCII]. Newly defined header fields SHOULD limit their
+ field values to US-ASCII characters. Recipients SHOULD treat other
+ (obs-text) octets in field content as opaque data.
+
+ Comments can be included in some HTTP header fields by surrounding
+ the comment text with parentheses. Comments are only allowed in
+ fields containing "comment" as part of their field value definition.
+
+ comment = "(" *( ctext / quoted-cpair / comment ) ")"
+ ctext = OWS / %x21-27 / %x2A-5B / %x5D-7E / obs-text
+ ; OWS / <VCHAR except "(", ")", and "\"> / obs-text
+
+ The backslash character ("\") can be used as a single-character
+ quoting mechanism within comment constructs:
+
+ quoted-cpair = "\" ( WSP / VCHAR / obs-text )
+
+ Producers SHOULD NOT escape characters that do not require escaping
+ (i.e., other than the backslash character "\" and the parentheses "("
+ and ")").
+
+3.3. Message Body
+
+ The message-body (if any) of an HTTP message is used to carry the
+ payload body associated with the request or response.
+
+ message-body = *OCTET
+
+ The message-body differs from the payload body only when a transfer-
+ coding has been applied, as indicated by the Transfer-Encoding header
+ field (Section 9.7). When one or more transfer-codings are applied
+ to a payload in order to form the message-body, the Transfer-Encoding
+ header field MUST contain the list of transfer-codings applied.
+ Transfer-Encoding is a property of the message, not of the payload,
+ and thus MAY be added or removed by any implementation along the
+ request/response chain under the constraints found in Section 6.2.
+
+ The rules for when a message-body is allowed in a message differ for
+ requests and responses.
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 22]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ The presence of a message-body in a request is signaled by the
+ inclusion of a Content-Length or Transfer-Encoding header field in
+ the request's header fields, even if the request method does not
+ define any use for a message-body. This allows the request message
+ framing algorithm to be independent of method semantics.
+
+ For response messages, whether or not a message-body is included with
+ a message is dependent on both the request method and the response
+ status code (Section 5.1.1). Responses to the HEAD request method
+ never include a message-body because the associated response header
+ fields (e.g., Transfer-Encoding, Content-Length, etc.) only indicate
+ what their values would have been if the method had been GET. All
+ 1xx (Informational), 204 (No Content), and 304 (Not Modified)
+ responses MUST NOT include a message-body. All other responses do
+ include a message-body, although the body MAY be of zero length.
+
+ The length of the message-body is determined by one of the following
+ (in order of precedence):
+
+ 1. Any response to a HEAD request and any response with a status
+ code of 100-199, 204, or 304 is always terminated by the first
+ empty line after the header fields, regardless of the header
+ fields present in the message, and thus cannot contain a message-
+ body.
+
+ 2. If a Transfer-Encoding header field (Section 9.7) is present and
+ the "chunked" transfer-coding (Section 6.2) is the final
+ encoding, the message-body length is determined by reading and
+ decoding the chunked data until the transfer-coding indicates the
+ data is complete.
+
+ If a Transfer-Encoding header field is present in a response and
+ the "chunked" transfer-coding is not the final encoding, the
+ message-body length is determined by reading the connection until
+ it is closed by the server. If a Transfer-Encoding header field
+ is present in a request and the "chunked" transfer-coding is not
+ the final encoding, the message-body length cannot be determined
+ reliably; the server MUST respond with the 400 (Bad Request)
+ status code and then close the connection.
+
+ If a message is received with both a Transfer-Encoding header
+ field and a Content-Length header field, the Transfer-Encoding
+ overrides the Content-Length. Such a message might indicate an
+ attempt to perform request or response smuggling (bypass of
+ security-related checks on message routing or content) and thus
+ ought to be handled as an error. The provided Content-Length
+ MUST be removed, prior to forwarding the message downstream, or
+ replaced with the real message-body length after the transfer-
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 23]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ coding is decoded.
+
+ 3. If a message is received without Transfer-Encoding and with
+ either multiple Content-Length header fields or a single Content-
+ Length header field with an invalid value, then the message
+ framing is invalid and MUST be treated as an error to prevent
+ request or response smuggling. If this is a request message, the
+ server MUST respond with a 400 (Bad Request) status code and then
+ close the connection. If this is a response message received by
+ a proxy or gateway, the proxy or gateway MUST discard the
+ received response, send a 502 (Bad Gateway) status code as its
+ downstream response, and then close the connection. If this is a
+ response message received by a user-agent, the message-body
+ length is determined by reading the connection until it is
+ closed; an error SHOULD be indicated to the user.
+
+ 4. If a valid Content-Length header field (Section 9.2) is present
+ without Transfer-Encoding, its decimal value defines the message-
+ body length in octets. If the actual number of octets sent in
+ the message is less than the indicated Content-Length, the
+ recipient MUST consider the message to be incomplete and treat
+ the connection as no longer usable. If the actual number of
+ octets sent in the message is more than the indicated Content-
+ Length, the recipient MUST only process the message-body up to
+ the field value's number of octets; the remainder of the message
+ MUST either be discarded or treated as the next message in a
+ pipeline. For the sake of robustness, a user-agent MAY attempt
+ to detect and correct such an error in message framing if it is
+ parsing the response to the last request on on a connection and
+ the connection has been closed by the server.
+
+ 5. If this is a request message and none of the above are true, then
+ the message-body length is zero (no message-body is present).
+
+ 6. Otherwise, this is a response message without a declared message-
+ body length, so the message-body length is determined by the
+ number of octets received prior to the server closing the
+ connection.
+
+ Since there is no way to distinguish a successfully completed, close-
+ delimited message from a partially-received message interrupted by
+ network failure, implementations SHOULD use encoding or length-
+ delimited messages whenever possible. The close-delimiting feature
+ exists primarily for backwards compatibility with HTTP/1.0.
+
+ A server MAY reject a request that contains a message-body but not a
+ Content-Length by responding with 411 (Length Required).
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 24]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ Unless a transfer-coding other than "chunked" has been applied, a
+ client that sends a request containing a message-body SHOULD use a
+ valid Content-Length header field if the message-body length is known
+ in advance, rather than the "chunked" encoding, since some existing
+ services respond to "chunked" with a 411 (Length Required) status
+ code even though they understand the chunked encoding. This is
+ typically because such services are implemented via a gateway that
+ requires a content-length in advance of being called and the server
+ is unable or unwilling to buffer the entire request before
+ processing.
+
+ A client that sends a request containing a message-body MUST include
+ a valid Content-Length header field if it does not know the server
+ will handle HTTP/1.1 (or later) requests; such knowledge can be in
+ the form of specific user configuration or by remembering the version
+ of a prior received response.
+
+ Request messages that are prematurely terminated, possibly due to a
+ cancelled connection or a server-imposed time-out exception, MUST
+ result in closure of the connection; sending an HTTP/1.1 error
+ response prior to closing the connection is OPTIONAL. Response
+ messages that are prematurely terminated, usually by closure of the
+ connection prior to receiving the expected number of octets or by
+ failure to decode a transfer-encoded message-body, MUST be recorded
+ as incomplete. A user agent MUST NOT render an incomplete response
+ message-body as if it were complete (i.e., some indication must be
+ given to the user that an error occurred). Cache requirements for
+ incomplete responses are defined in Section 2.1.1 of [Part6].
+
+ A server MUST read the entire request message-body or close the
+ connection after sending its response, since otherwise the remaining
+ data on a persistent connection would be misinterpreted as the next
+ request. Likewise, a client MUST read the entire response message-
+ body if it intends to reuse the same connection for a subsequent
+ request. Pipelining multiple requests on a connection is described
+ in Section 7.1.2.2.
+
+3.4. General Header Fields
+
+ There are a few header fields which have general applicability for
+ both request and response messages, but which do not apply to the
+ payload being transferred. These header fields apply only to the
+ message being transmitted.
+
+
+
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 25]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ general-header = Cache-Control ; [Part6], Section 3.2
+ / Connection ; Section 9.1
+ / Date ; Section 9.3
+ / Pragma ; [Part6], Section 3.4
+ / Trailer ; Section 9.6
+ / Transfer-Encoding ; Section 9.7
+ / Upgrade ; Section 9.8
+ / Via ; Section 9.9
+ / Warning ; [Part6], Section 3.6
+ / MIME-Version ; [Part3], Appendix A.1
+
+ General-header field names can be extended reliably only in
+ combination with a change in the protocol version. However, new or
+ experimental header fields might be given the semantics of general
+ header fields if all parties in the communication recognize them to
+ be general-header fields.
+
+4. Request
+
+ A request message from a client to a server includes, within the
+ first line of that message, the method to be applied to the resource,
+ the identifier of the resource, and the protocol version in use.
+
+ Request = Request-Line ; Section 4.1
+ *( header-field CRLF ) ; Section 3.2
+ CRLF
+ [ message-body ] ; Section 3.3
+
+4.1. Request-Line
+
+ The Request-Line begins with a method token, followed by the request-
+ target and the protocol version, and ending with CRLF. The elements
+ are separated by SP characters. No CR or LF is allowed except in the
+ final CRLF sequence.
+
+ Request-Line = Method SP request-target SP HTTP-Version CRLF
+
+4.1.1. Method
+
+ The Method token indicates the method to be performed on the resource
+ identified by the request-target. The method is case-sensitive.
+
+ Method = token
+
+
+
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 26]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+4.1.2. request-target
+
+ The request-target identifies the resource upon which to apply the
+ request.
+
+ request-target = "*"
+ / absolute-URI
+ / ( path-absolute [ "?" query ] )
+ / authority
+
+ The four options for request-target are dependent on the nature of
+ the request.
+
+ The asterisk "*" means that the request does not apply to a
+ particular resource, but to the server itself, and is only allowed
+ when the method used does not necessarily apply to a resource. One
+ example would be
+
+ OPTIONS * HTTP/1.1
+
+ The absolute-URI form is REQUIRED when the request is being made to a
+ proxy. The proxy is requested to forward the request or service it
+ from a valid cache, and return the response. Note that the proxy MAY
+ forward the request on to another proxy or directly to the server
+ specified by the absolute-URI. In order to avoid request loops, a
+ proxy MUST be able to recognize all of its server names, including
+ any aliases, local variations, and the numeric IP address. An
+ example Request-Line would be:
+
+ GET http://www.example.org/pub/WWW/TheProject.html HTTP/1.1
+
+ To allow for transition to absolute-URIs in all requests in future
+ versions of HTTP, all HTTP/1.1 servers MUST accept the absolute-URI
+ form in requests, even though HTTP/1.1 clients will only generate
+ them in requests to proxies.
+
+ The authority form is only used by the CONNECT method (Section 7.9 of
+ [Part2]).
+
+ The most common form of request-target is that used to identify a
+ resource on an origin server or gateway. In this case the absolute
+ path of the URI MUST be transmitted (see Section 2.6.1, path-
+ absolute) as the request-target, and the network location of the URI
+ (authority) MUST be transmitted in a Host header field. For example,
+ a client wishing to retrieve the resource above directly from the
+ origin server would create a TCP connection to port 80 of the host
+ "www.example.org" and send the lines:
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 27]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ GET /pub/WWW/TheProject.html HTTP/1.1
+ Host: www.example.org
+
+ followed by the remainder of the Request. Note that the absolute
+ path cannot be empty; if none is present in the original URI, it MUST
+ be given as "/" (the server root).
+
+ If a proxy receives a request without any path in the request-target
+ and the method specified is capable of supporting the asterisk form
+ of request-target, then the last proxy on the request chain MUST
+ forward the request with "*" as the final request-target.
+
+ For example, the request
+
+ OPTIONS http://www.example.org:8001 HTTP/1.1
+
+ would be forwarded by the proxy as
+
+ OPTIONS * HTTP/1.1
+ Host: www.example.org:8001
+
+ after connecting to port 8001 of host "www.example.org".
+
+ The request-target is transmitted in the format specified in
+ Section 2.6.1. If the request-target is percent-encoded ([RFC3986],
+ Section 2.1), the origin server MUST decode the request-target in
+ order to properly interpret the request. Servers SHOULD respond to
+ invalid request-targets with an appropriate status code.
+
+ A transparent proxy MUST NOT rewrite the "path-absolute" part of the
+ received request-target when forwarding it to the next inbound
+ server, except as noted above to replace a null path-absolute with
+ "/" or "*".
+
+ Note: The "no rewrite" rule prevents the proxy from changing the
+ meaning of the request when the origin server is improperly using
+ a non-reserved URI character for a reserved purpose. Implementors
+ need to be aware that some pre-HTTP/1.1 proxies have been known to
+ rewrite the request-target.
+
+ HTTP does not place a pre-defined limit on the length of a request-
+ target. A server MUST be prepared to receive URIs of unbounded
+ length and respond with the 414 (URI Too Long) status code if the
+ received request-target would be longer than the server wishes to
+ handle (see Section 8.4.15 of [Part2]).
+
+ Various ad-hoc limitations on request-target length are found in
+ practice. It is RECOMMENDED that all HTTP senders and recipients
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 28]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ support request-target lengths of 8000 or more octets.
+
+ Note: Fragments ([RFC3986], Section 3.5) are not part of the
+ request-target and thus will not be transmitted in an HTTP
+ request.
+
+4.2. The Resource Identified by a Request
+
+ The exact resource identified by an Internet request is determined by
+ examining both the request-target and the Host header field.
+
+ An origin server that does not allow resources to differ by the
+ requested host MAY ignore the Host header field value when
+ determining the resource identified by an HTTP/1.1 request. (But see
+ Appendix B.1.1 for other requirements on Host support in HTTP/1.1.)
+
+ An origin server that does differentiate resources based on the host
+ requested (sometimes referred to as virtual hosts or vanity host
+ names) MUST use the following rules for determining the requested
+ resource on an HTTP/1.1 request:
+
+ 1. If request-target is an absolute-URI, the host is part of the
+ request-target. Any Host header field value in the request MUST
+ be ignored.
+
+ 2. If the request-target is not an absolute-URI, and the request
+ includes a Host header field, the host is determined by the Host
+ header field value.
+
+ 3. If the host as determined by rule 1 or 2 is not a valid host on
+ the server, the response MUST be a 400 (Bad Request) error
+ message.
+
+ Recipients of an HTTP/1.0 request that lacks a Host header field MAY
+ attempt to use heuristics (e.g., examination of the URI path for
+ something unique to a particular host) in order to determine what
+ exact resource is being requested.
+
+4.3. Effective Request URI
+
+ HTTP requests often do not carry the absolute URI ([RFC3986], Section
+ 4.3) for the target resource; instead, the URI needs to be inferred
+ from the request-target, Host header field, and connection context.
+ The result of this process is called the "effective request URI".
+ The "target resource" is the resource identified by the effective
+ request URI.
+
+ If the request-target is an absolute-URI, then the effective request
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 29]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ URI is the request-target.
+
+ If the request-target uses the path-absolute (plus optional query)
+ syntax or if it is just the asterisk "*", then the effective request
+ URI is constructed by concatenating
+
+ o the scheme name: "http" if the request was received over an
+ insecure TCP connection, or "https" when received over a SSL/
+ TLS-secured TCP connection,
+
+ o the character sequence "://",
+
+ o the authority component, as specified in the Host header
+ (Section 9.4) and determined by the rules in Section 4.2,
+ [[effrequri-nohost: Do we need to include the handling of missing
+ hosts in HTTP/1.0 messages, as described in Section 4.2? -- See
+ <http://tools.ietf.org/wg/httpbis/trac/ticket/221> --jre]] and
+
+ o the request-target obtained from the Request-Line, unless the
+ request-target is just the asterisk "*".
+
+ Otherwise, when request-target uses the authority form, the effective
+ Request URI is undefined.
+
+ Example 1: the effective request URI for the message
+
+ GET /pub/WWW/TheProject.html HTTP/1.1
+ Host: www.example.org:8080
+
+ (received over an insecure TCP connection) is "http", plus "://",
+ plus the authority component "www.example.org:8080", plus the
+ request-target "/pub/WWW/TheProject.html", thus
+ "http://www.example.org:8080/pub/WWW/TheProject.html".
+
+ Example 2: the effective request URI for the message
+
+ GET * HTTP/1.1
+ Host: www.example.org
+
+ (received over an SSL/TLS secured TCP connection) is "https", plus
+ "://", plus the authority component "www.example.org", thus
+ "https://www.example.org".
+
+ Effective request URIs are compared using the rules described in
+ Section 2.6.3, except that empty path components MUST NOT be treated
+ as equivalent to an absolute path of "/".
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 30]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+5. Response
+
+ After receiving and interpreting a request message, a server responds
+ with an HTTP response message.
+
+ Response = Status-Line ; Section 5.1
+ *( header-field CRLF ) ; Section 3.2
+ CRLF
+ [ message-body ] ; Section 3.3
+
+5.1. Status-Line
+
+ The first line of a Response message is the Status-Line, consisting
+ of the protocol version followed by a numeric status code and its
+ associated textual phrase, with each element separated by SP
+ characters. No CR or LF is allowed except in the final CRLF
+ sequence.
+
+ Status-Line = HTTP-Version SP Status-Code SP Reason-Phrase CRLF
+
+5.1.1. Status Code and Reason Phrase
+
+ The Status-Code element is a 3-digit integer result code of the
+ attempt to understand and satisfy the request. These codes are fully
+ defined in Section 8 of [Part2]. The Reason Phrase exists for the
+ sole purpose of providing a textual description associated with the
+ numeric status code, out of deference to earlier Internet application
+ protocols that were more frequently used with interactive text
+ clients. A client SHOULD ignore the content of the Reason Phrase.
+
+ The first digit of the Status-Code defines the class of response.
+ The last two digits do not have any categorization role. There are 5
+ values for the first digit:
+
+ o 1xx: Informational - Request received, continuing process
+
+ o 2xx: Success - The action was successfully received, understood,
+ and accepted
+
+ o 3xx: Redirection - Further action must be taken in order to
+ complete the request
+
+ o 4xx: Client Error - The request contains bad syntax or cannot be
+ fulfilled
+
+ o 5xx: Server Error - The server failed to fulfill an apparently
+ valid request
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 31]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ Status-Code = 3DIGIT
+ Reason-Phrase = *( WSP / VCHAR / obs-text )
+
+6. Protocol Parameters
+
+6.1. Date/Time Formats: Full Date
+
+ HTTP applications have historically allowed three different formats
+ for date/time stamps. However, the preferred format is a fixed-
+ length subset of that defined by [RFC1123]:
+
+ Sun, 06 Nov 1994 08:49:37 GMT ; RFC 1123
+
+ The other formats are described here only for compatibility with
+ obsolete implementations.
+
+ Sunday, 06-Nov-94 08:49:37 GMT ; obsolete RFC 850 format
+ Sun Nov 6 08:49:37 1994 ; ANSI C's asctime() format
+
+ HTTP/1.1 clients and servers that parse a date value MUST accept all
+ three formats (for compatibility with HTTP/1.0), though they MUST
+ only generate the RFC 1123 format for representing HTTP-date values
+ in header fields. See Appendix A for further information.
+
+ All HTTP date/time stamps MUST be represented in Greenwich Mean Time
+ (GMT), without exception. For the purposes of HTTP, GMT is exactly
+ equal to UTC (Coordinated Universal Time). This is indicated in the
+ first two formats by the inclusion of "GMT" as the three-letter
+ abbreviation for time zone, and MUST be assumed when reading the
+ asctime format. HTTP-date is case sensitive and MUST NOT include
+ additional whitespace beyond that specifically included as SP in the
+ grammar.
+
+ HTTP-date = rfc1123-date / obs-date
+
+ Preferred format:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 32]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ rfc1123-date = day-name "," SP date1 SP time-of-day SP GMT
+
+ day-name = %x4D.6F.6E ; "Mon", case-sensitive
+ / %x54.75.65 ; "Tue", case-sensitive
+ / %x57.65.64 ; "Wed", case-sensitive
+ / %x54.68.75 ; "Thu", case-sensitive
+ / %x46.72.69 ; "Fri", case-sensitive
+ / %x53.61.74 ; "Sat", case-sensitive
+ / %x53.75.6E ; "Sun", case-sensitive
+
+ date1 = day SP month SP year
+ ; e.g., 02 Jun 1982
+
+ day = 2DIGIT
+ month = %x4A.61.6E ; "Jan", case-sensitive
+ / %x46.65.62 ; "Feb", case-sensitive
+ / %x4D.61.72 ; "Mar", case-sensitive
+ / %x41.70.72 ; "Apr", case-sensitive
+ / %x4D.61.79 ; "May", case-sensitive
+ / %x4A.75.6E ; "Jun", case-sensitive
+ / %x4A.75.6C ; "Jul", case-sensitive
+ / %x41.75.67 ; "Aug", case-sensitive
+ / %x53.65.70 ; "Sep", case-sensitive
+ / %x4F.63.74 ; "Oct", case-sensitive
+ / %x4E.6F.76 ; "Nov", case-sensitive
+ / %x44.65.63 ; "Dec", case-sensitive
+ year = 4DIGIT
+
+ GMT = %x47.4D.54 ; "GMT", case-sensitive
+
+ time-of-day = hour ":" minute ":" second
+ ; 00:00:00 - 23:59:59
+
+ hour = 2DIGIT
+ minute = 2DIGIT
+ second = 2DIGIT
+
+ The semantics of day-name, day, month, year, and time-of-day are the
+ same as those defined for the RFC 5322 constructs with the
+ corresponding name ([RFC5322], Section 3.3).
+
+ Obsolete formats:
+
+ obs-date = rfc850-date / asctime-date
+
+
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 33]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ rfc850-date = day-name-l "," SP date2 SP time-of-day SP GMT
+ date2 = day "-" month "-" 2DIGIT
+ ; day-month-year (e.g., 02-Jun-82)
+
+ day-name-l = %x4D.6F.6E.64.61.79 ; "Monday", case-sensitive
+ / %x54.75.65.73.64.61.79 ; "Tuesday", case-sensitive
+ / %x57.65.64.6E.65.73.64.61.79 ; "Wednesday", case-sensitive
+ / %x54.68.75.72.73.64.61.79 ; "Thursday", case-sensitive
+ / %x46.72.69.64.61.79 ; "Friday", case-sensitive
+ / %x53.61.74.75.72.64.61.79 ; "Saturday", case-sensitive
+ / %x53.75.6E.64.61.79 ; "Sunday", case-sensitive
+
+
+ asctime-date = day-name SP date3 SP time-of-day SP year
+ date3 = month SP ( 2DIGIT / ( SP 1DIGIT ))
+ ; month day (e.g., Jun 2)
+
+ Note: Recipients of date values are encouraged to be robust in
+ accepting date values that might have been sent by non-HTTP
+ applications, as is sometimes the case when retrieving or posting
+ messages via proxies/gateways to SMTP or NNTP.
+
+ Note: HTTP requirements for the date/time stamp format apply only
+ to their usage within the protocol stream. Clients and servers
+ are not required to use these formats for user presentation,
+ request logging, etc.
+
+6.2. Transfer Codings
+
+ Transfer-coding values are used to indicate an encoding
+ transformation that has been, can be, or might need to be applied to
+ a payload body in order to ensure "safe transport" through the
+ network. This differs from a content coding in that the transfer-
+ coding is a property of the message rather than a property of the
+ representation that is being transferred.
+
+ transfer-coding = "chunked" ; Section 6.2.1
+ / "compress" ; Section 6.2.2.1
+ / "deflate" ; Section 6.2.2.2
+ / "gzip" ; Section 6.2.2.3
+ / transfer-extension
+ transfer-extension = token *( OWS ";" OWS transfer-parameter )
+
+ Parameters are in the form of attribute/value pairs.
+
+ transfer-parameter = attribute BWS "=" BWS value
+ attribute = token
+ value = word
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 34]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ All transfer-coding values are case-insensitive. HTTP/1.1 uses
+ transfer-coding values in the TE header field (Section 9.5) and in
+ the Transfer-Encoding header field (Section 9.7).
+
+ Transfer-codings are analogous to the Content-Transfer-Encoding
+ values of MIME, which were designed to enable safe transport of
+ binary data over a 7-bit transport service ([RFC2045], Section 6).
+ However, safe transport has a different focus for an 8bit-clean
+ transfer protocol. In HTTP, the only unsafe characteristic of
+ message-bodies is the difficulty in determining the exact message
+ body length (Section 3.3), or the desire to encrypt data over a
+ shared transport.
+
+ A server that receives a request message with a transfer-coding it
+ does not understand SHOULD respond with 501 (Not Implemented) and
+ then close the connection. A server MUST NOT send transfer-codings
+ to an HTTP/1.0 client.
+
+6.2.1. Chunked Transfer Coding
+
+ The chunked encoding modifies the body of a message in order to
+ transfer it as a series of chunks, each with its own size indicator,
+ followed by an OPTIONAL trailer containing header fields. This
+ allows dynamically produced content to be transferred along with the
+ information necessary for the recipient to verify that it has
+ received the full message.
+
+ Chunked-Body = *chunk
+ last-chunk
+ trailer-part
+ CRLF
+
+ chunk = chunk-size *WSP [ chunk-ext ] CRLF
+ chunk-data CRLF
+ chunk-size = 1*HEXDIG
+ last-chunk = 1*("0") *WSP [ chunk-ext ] CRLF
+
+ chunk-ext = *( ";" *WSP chunk-ext-name
+ [ "=" chunk-ext-val ] *WSP )
+ chunk-ext-name = token
+ chunk-ext-val = token / quoted-str-nf
+ chunk-data = 1*OCTET ; a sequence of chunk-size octets
+ trailer-part = *( header-field CRLF )
+
+ quoted-str-nf = DQUOTE *( qdtext-nf / quoted-pair ) DQUOTE
+ ; like quoted-string, but disallowing line folding
+ qdtext-nf = WSP / %x21 / %x23-5B / %x5D-7E / obs-text
+ ; WSP / <VCHAR except DQUOTE and "\"> / obs-text
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 35]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ The chunk-size field is a string of hex digits indicating the size of
+ the chunk-data in octets. The chunked encoding is ended by any chunk
+ whose size is zero, followed by the trailer, which is terminated by
+ an empty line.
+
+ The trailer allows the sender to include additional HTTP header
+ fields at the end of the message. The Trailer header field can be
+ used to indicate which header fields are included in a trailer (see
+ Section 9.6).
+
+ A server using chunked transfer-coding in a response MUST NOT use the
+ trailer for any header fields unless at least one of the following is
+ true:
+
+ 1. the request included a TE header field that indicates "trailers"
+ is acceptable in the transfer-coding of the response, as
+ described in Section 9.5; or,
+
+ 2. the server is the origin server for the response, the trailer
+ fields consist entirely of optional metadata, and the recipient
+ could use the message (in a manner acceptable to the origin
+ server) without receiving this metadata. In other words, the
+ origin server is willing to accept the possibility that the
+ trailer fields might be silently discarded along the path to the
+ client.
+
+ This requirement prevents an interoperability failure when the
+ message is being received by an HTTP/1.1 (or later) proxy and
+ forwarded to an HTTP/1.0 recipient. It avoids a situation where
+ compliance with the protocol would have necessitated a possibly
+ infinite buffer on the proxy.
+
+ A process for decoding the "chunked" transfer-coding can be
+ represented in pseudo-code as:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 36]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ length := 0
+ read chunk-size, chunk-ext (if any) and CRLF
+ while (chunk-size > 0) {
+ read chunk-data and CRLF
+ append chunk-data to decoded-body
+ length := length + chunk-size
+ read chunk-size and CRLF
+ }
+ read header-field
+ while (header-field not empty) {
+ append header-field to existing header fields
+ read header-field
+ }
+ Content-Length := length
+ Remove "chunked" from Transfer-Encoding
+
+ All HTTP/1.1 applications MUST be able to receive and decode the
+ "chunked" transfer-coding and MUST ignore chunk-ext extensions they
+ do not understand.
+
+ Since "chunked" is the only transfer-coding required to be understood
+ by HTTP/1.1 recipients, it plays a crucial role in delimiting
+ messages on a persistent connection. Whenever a transfer-coding is
+ applied to a payload body in a request, the final transfer-coding
+ applied MUST be "chunked". If a transfer-coding is applied to a
+ response payload body, then either the final transfer-coding applied
+ MUST be "chunked" or the message MUST be terminated by closing the
+ connection. When the "chunked" transfer-coding is used, it MUST be
+ the last transfer-coding applied to form the message-body. The
+ "chunked" transfer-coding MUST NOT be applied more than once in a
+ message-body.
+
+6.2.2. Compression Codings
+
+ The codings defined below can be used to compress the payload of a
+ message.
+
+ Note: Use of program names for the identification of encoding
+ formats is not desirable and is discouraged for future encodings.
+ Their use here is representative of historical practice, not good
+ design.
+
+ Note: For compatibility with previous implementations of HTTP,
+ applications SHOULD consider "x-gzip" and "x-compress" to be
+ equivalent to "gzip" and "compress" respectively.
+
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 37]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+6.2.2.1. Compress Coding
+
+ The "compress" format is produced by the common UNIX file compression
+ program "compress". This format is an adaptive Lempel-Ziv-Welch
+ coding (LZW).
+
+6.2.2.2. Deflate Coding
+
+ The "deflate" format is defined as the "deflate" compression
+ mechanism (described in [RFC1951]) used inside the "zlib" data format
+ ([RFC1950]).
+
+ Note: Some incorrect implementations send the "deflate" compressed
+ data without the zlib wrapper.
+
+6.2.2.3. Gzip Coding
+
+ The "gzip" format is produced by the file compression program "gzip"
+ (GNU zip), as described in [RFC1952]. This format is a Lempel-Ziv
+ coding (LZ77) with a 32 bit CRC.
+
+6.2.3. Transfer Coding Registry
+
+ The HTTP Transfer Coding Registry defines the name space for the
+ transfer coding names.
+
+ Registrations MUST include the following fields:
+
+ o Name
+
+ o Description
+
+ o Pointer to specification text
+
+ Names of transfer codings MUST NOT overlap with names of content
+ codings (Section 2.2 of [Part3]), unless the encoding transformation
+ is identical (as it is the case for the compression codings defined
+ in Section 6.2.2).
+
+ Values to be added to this name space require a specification (see
+ "Specification Required" in Section 4.1 of [RFC5226]), and MUST
+ conform to the purpose of transfer coding defined in this section.
+
+ The registry itself is maintained at
+ <http://www.iana.org/assignments/http-parameters>.
+
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 38]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+6.3. Product Tokens
+
+ Product tokens are used to allow communicating applications to
+ identify themselves by software name and version. Most fields using
+ product tokens also allow sub-products which form a significant part
+ of the application to be listed, separated by whitespace. By
+ convention, the products are listed in order of their significance
+ for identifying the application.
+
+ product = token ["/" product-version]
+ product-version = token
+
+ Examples:
+
+ User-Agent: CERN-LineMode/2.15 libwww/2.17b3
+ Server: Apache/0.8.4
+
+ Product tokens SHOULD be short and to the point. They MUST NOT be
+ used for advertising or other non-essential information. Although
+ any token character MAY appear in a product-version, this token
+ SHOULD only be used for a version identifier (i.e., successive
+ versions of the same product SHOULD only differ in the product-
+ version portion of the product value).
+
+6.4. Quality Values
+
+ Both transfer codings (TE request header, Section 9.5) and content
+ negotiation (Section 5 of [Part3]) use short "floating point" numbers
+ to indicate the relative importance ("weight") of various negotiable
+ parameters. A weight is normalized to a real number in the range 0
+ through 1, where 0 is the minimum and 1 the maximum value. If a
+ parameter has a quality value of 0, then content with this parameter
+ is "not acceptable" for the client. HTTP/1.1 applications MUST NOT
+ generate more than three digits after the decimal point. User
+ configuration of these values SHOULD also be limited in this fashion.
+
+ qvalue = ( "0" [ "." 0*3DIGIT ] )
+ / ( "1" [ "." 0*3("0") ] )
+
+ Note: "Quality values" is a misnomer, since these values merely
+ represent relative degradation in desired quality.
+
+7. Connections
+
+7.1. Persistent Connections
+
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 39]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+7.1.1. Purpose
+
+ Prior to persistent connections, a separate TCP connection was
+ established to fetch each URL, increasing the load on HTTP servers
+ and causing congestion on the Internet. The use of inline images and
+ other associated data often requires a client to make multiple
+ requests of the same server in a short amount of time. Analysis of
+ these performance problems and results from a prototype
+ implementation are available [Pad1995] [Spe]. Implementation
+ experience and measurements of actual HTTP/1.1 implementations show
+ good results [Nie1997]. Alternatives have also been explored, for
+ example, T/TCP [Tou1998].
+
+ Persistent HTTP connections have a number of advantages:
+
+ o By opening and closing fewer TCP connections, CPU time is saved in
+ routers and hosts (clients, servers, proxies, gateways, tunnels,
+ or caches), and memory used for TCP protocol control blocks can be
+ saved in hosts.
+
+ o HTTP requests and responses can be pipelined on a connection.
+ Pipelining allows a client to make multiple requests without
+ waiting for each response, allowing a single TCP connection to be
+ used much more efficiently, with much lower elapsed time.
+
+ o Network congestion is reduced by reducing the number of packets
+ caused by TCP opens, and by allowing TCP sufficient time to
+ determine the congestion state of the network.
+
+ o Latency on subsequent requests is reduced since there is no time
+ spent in TCP's connection opening handshake.
+
+ o HTTP can evolve more gracefully, since errors can be reported
+ without the penalty of closing the TCP connection. Clients using
+ future versions of HTTP might optimistically try a new feature,
+ but if communicating with an older server, retry with old
+ semantics after an error is reported.
+
+ HTTP implementations SHOULD implement persistent connections.
+
+7.1.2. Overall Operation
+
+ A significant difference between HTTP/1.1 and earlier versions of
+ HTTP is that persistent connections are the default behavior of any
+ HTTP connection. That is, unless otherwise indicated, the client
+ SHOULD assume that the server will maintain a persistent connection,
+ even after error responses from the server.
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 40]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ Persistent connections provide a mechanism by which a client and a
+ server can signal the close of a TCP connection. This signaling
+ takes place using the Connection header field (Section 9.1). Once a
+ close has been signaled, the client MUST NOT send any more requests
+ on that connection.
+
+7.1.2.1. Negotiation
+
+ An HTTP/1.1 server MAY assume that a HTTP/1.1 client intends to
+ maintain a persistent connection unless a Connection header including
+ the connection-token "close" was sent in the request. If the server
+ chooses to close the connection immediately after sending the
+ response, it SHOULD send a Connection header including the
+ connection-token "close".
+
+ An HTTP/1.1 client MAY expect a connection to remain open, but would
+ decide to keep it open based on whether the response from a server
+ contains a Connection header with the connection-token close. In
+ case the client does not want to maintain a connection for more than
+ that request, it SHOULD send a Connection header including the
+ connection-token close.
+
+ If either the client or the server sends the close token in the
+ Connection header, that request becomes the last one for the
+ connection.
+
+ Clients and servers SHOULD NOT assume that a persistent connection is
+ maintained for HTTP versions less than 1.1 unless it is explicitly
+ signaled. See Appendix B.2 for more information on backward
+ compatibility with HTTP/1.0 clients.
+
+ In order to remain persistent, all messages on the connection MUST
+ have a self-defined message length (i.e., one not defined by closure
+ of the connection), as described in Section 3.3.
+
+7.1.2.2. Pipelining
+
+ A client that supports persistent connections MAY "pipeline" its
+ requests (i.e., send multiple requests without waiting for each
+ response). A server MUST send its responses to those requests in the
+ same order that the requests were received.
+
+ Clients which assume persistent connections and pipeline immediately
+ after connection establishment SHOULD be prepared to retry their
+ connection if the first pipelined attempt fails. If a client does
+ such a retry, it MUST NOT pipeline before it knows the connection is
+ persistent. Clients MUST also be prepared to resend their requests
+ if the server closes the connection before sending all of the
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 41]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ corresponding responses.
+
+ Clients SHOULD NOT pipeline requests using non-idempotent methods or
+ non-idempotent sequences of methods (see Section 7.1.2 of [Part2]).
+ Otherwise, a premature termination of the transport connection could
+ lead to indeterminate results. A client wishing to send a non-
+ idempotent request SHOULD wait to send that request until it has
+ received the response status line for the previous request.
+
+7.1.3. Proxy Servers
+
+ It is especially important that proxies correctly implement the
+ properties of the Connection header field as specified in
+ Section 9.1.
+
+ The proxy server MUST signal persistent connections separately with
+ its clients and the origin servers (or other proxy servers) that it
+ connects to. Each persistent connection applies to only one
+ transport link.
+
+ A proxy server MUST NOT establish a HTTP/1.1 persistent connection
+ with an HTTP/1.0 client (but see Section 19.7.1 of [RFC2068] for
+ information and discussion of the problems with the Keep-Alive header
+ implemented by many HTTP/1.0 clients).
+
+7.1.3.1. End-to-end and Hop-by-hop Headers
+
+ For the purpose of defining the behavior of caches and non-caching
+ proxies, we divide HTTP headers into two categories:
+
+ o End-to-end headers, which are transmitted to the ultimate
+ recipient of a request or response. End-to-end headers in
+ responses MUST be stored as part of a cache entry and MUST be
+ transmitted in any response formed from a cache entry.
+
+ o Hop-by-hop headers, which are meaningful only for a single
+ transport-level connection, and are not stored by caches or
+ forwarded by proxies.
+
+ The following HTTP/1.1 headers are hop-by-hop headers:
+
+ o Connection
+
+ o Keep-Alive
+
+ o Proxy-Authenticate
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 42]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ o Proxy-Authorization
+
+ o TE
+
+ o Trailer
+
+ o Transfer-Encoding
+
+ o Upgrade
+
+ All other headers defined by HTTP/1.1 are end-to-end headers.
+
+ Other hop-by-hop headers MUST be listed in a Connection header
+ (Section 9.1).
+
+7.1.3.2. Non-modifiable Headers
+
+ Some features of HTTP/1.1, such as Digest Authentication, depend on
+ the value of certain end-to-end headers. A transparent proxy SHOULD
+ NOT modify an end-to-end header unless the definition of that header
+ requires or specifically allows that.
+
+ A transparent proxy MUST NOT modify any of the following fields in a
+ request or response, and it MUST NOT add any of these fields if not
+ already present:
+
+ o Content-Location
+
+ o Content-MD5
+
+ o ETag
+
+ o Last-Modified
+
+ A transparent proxy MUST NOT modify any of the following fields in a
+ response:
+
+ o Expires
+
+ but it MAY add any of these fields if not already present. If an
+ Expires header is added, it MUST be given a field-value identical to
+ that of the Date header in that response.
+
+ A proxy MUST NOT modify or add any of the following fields in a
+ message that contains the no-transform cache-control directive, or in
+ any request:
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 43]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ o Content-Encoding
+
+ o Content-Range
+
+ o Content-Type
+
+ A non-transparent proxy MAY modify or add these fields to a message
+ that does not include no-transform, but if it does so, it MUST add a
+ Warning 214 (Transformation applied) if one does not already appear
+ in the message (see Section 3.6 of [Part6]).
+
+ Warning: Unnecessary modification of end-to-end headers might
+ cause authentication failures if stronger authentication
+ mechanisms are introduced in later versions of HTTP. Such
+ authentication mechanisms MAY rely on the values of header fields
+ not listed here.
+
+ A transparent proxy MUST preserve the message payload ([Part3]),
+ though it MAY change the message-body through application or removal
+ of a transfer-coding (Section 6.2).
+
+7.1.4. Practical Considerations
+
+ Servers will usually have some time-out value beyond which they will
+ no longer maintain an inactive connection. Proxy servers might make
+ this a higher value since it is likely that the client will be making
+ more connections through the same server. The use of persistent
+ connections places no requirements on the length (or existence) of
+ this time-out for either the client or the server.
+
+ When a client or server wishes to time-out it SHOULD issue a graceful
+ close on the transport connection. Clients and servers SHOULD both
+ constantly watch for the other side of the transport close, and
+ respond to it as appropriate. If a client or server does not detect
+ the other side's close promptly it could cause unnecessary resource
+ drain on the network.
+
+ A client, server, or proxy MAY close the transport connection at any
+ time. For example, a client might have started to send a new request
+ at the same time that the server has decided to close the "idle"
+ connection. From the server's point of view, the connection is being
+ closed while it was idle, but from the client's point of view, a
+ request is in progress.
+
+ This means that clients, servers, and proxies MUST be able to recover
+ from asynchronous close events. Client software SHOULD reopen the
+ transport connection and retransmit the aborted sequence of requests
+ without user interaction so long as the request sequence is
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 44]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ idempotent (see Section 7.1.2 of [Part2]). Non-idempotent methods or
+ sequences MUST NOT be automatically retried, although user agents MAY
+ offer a human operator the choice of retrying the request(s).
+ Confirmation by user-agent software with semantic understanding of
+ the application MAY substitute for user confirmation. The automatic
+ retry SHOULD NOT be repeated if the second sequence of requests
+ fails.
+
+ Servers SHOULD always respond to at least one request per connection,
+ if at all possible. Servers SHOULD NOT close a connection in the
+ middle of transmitting a response, unless a network or client failure
+ is suspected.
+
+ Clients (including proxies) SHOULD limit the number of simultaneous
+ connections that they maintain to a given server (including proxies).
+
+ Previous revisions of HTTP gave a specific number of connections as a
+ ceiling, but this was found to be impractical for many applications.
+ As a result, this specification does not mandate a particular maximum
+ number of connections, but instead encourages clients to be
+ conservative when opening multiple connections.
+
+ In particular, while using multiple connections avoids the "head-of-
+ line blocking" problem (whereby a request that takes significant
+ server-side processing and/or has a large payload can block
+ subsequent requests on the same connection), each connection used
+ consumes server resources (sometimes significantly), and furthermore
+ using multiple connections can cause undesirable side effects in
+ congested networks.
+
+ Note that servers might reject traffic that they deem abusive,
+ including an excessive number of connections from a client.
+
+7.2. Message Transmission Requirements
+
+7.2.1. Persistent Connections and Flow Control
+
+ HTTP/1.1 servers SHOULD maintain persistent connections and use TCP's
+ flow control mechanisms to resolve temporary overloads, rather than
+ terminating connections with the expectation that clients will retry.
+ The latter technique can exacerbate network congestion.
+
+7.2.2. Monitoring Connections for Error Status Messages
+
+ An HTTP/1.1 (or later) client sending a message-body SHOULD monitor
+ the network connection for an error status code while it is
+ transmitting the request. If the client sees an error status code,
+ it SHOULD immediately cease transmitting the body. If the body is
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 45]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ being sent using a "chunked" encoding (Section 6.2), a zero length
+ chunk and empty trailer MAY be used to prematurely mark the end of
+ the message. If the body was preceded by a Content-Length header,
+ the client MUST close the connection.
+
+7.2.3. Use of the 100 (Continue) Status
+
+ The purpose of the 100 (Continue) status code (see Section 8.1.1 of
+ [Part2]) is to allow a client that is sending a request message with
+ a request body to determine if the origin server is willing to accept
+ the request (based on the request headers) before the client sends
+ the request body. In some cases, it might either be inappropriate or
+ highly inefficient for the client to send the body if the server will
+ reject the message without looking at the body.
+
+ Requirements for HTTP/1.1 clients:
+
+ o If a client will wait for a 100 (Continue) response before sending
+ the request body, it MUST send an Expect request-header field
+ (Section 9.2 of [Part2]) with the "100-continue" expectation.
+
+ o A client MUST NOT send an Expect request-header field (Section 9.2
+ of [Part2]) with the "100-continue" expectation if it does not
+ intend to send a request body.
+
+ Because of the presence of older implementations, the protocol allows
+ ambiguous situations in which a client might send "Expect: 100-
+ continue" without receiving either a 417 (Expectation Failed) or a
+ 100 (Continue) status code. Therefore, when a client sends this
+ header field to an origin server (possibly via a proxy) from which it
+ has never seen a 100 (Continue) status code, the client SHOULD NOT
+ wait for an indefinite period before sending the request body.
+
+ Requirements for HTTP/1.1 origin servers:
+
+ o Upon receiving a request which includes an Expect request-header
+ field with the "100-continue" expectation, an origin server MUST
+ either respond with 100 (Continue) status code and continue to
+ read from the input stream, or respond with a final status code.
+ The origin server MUST NOT wait for the request body before
+ sending the 100 (Continue) response. If it responds with a final
+ status code, it MAY close the transport connection or it MAY
+ continue to read and discard the rest of the request. It MUST NOT
+ perform the requested method if it returns a final status code.
+
+ o An origin server SHOULD NOT send a 100 (Continue) response if the
+ request message does not include an Expect request-header field
+ with the "100-continue" expectation, and MUST NOT send a 100
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 46]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ (Continue) response if such a request comes from an HTTP/1.0 (or
+ earlier) client. There is an exception to this rule: for
+ compatibility with [RFC2068], a server MAY send a 100 (Continue)
+ status code in response to an HTTP/1.1 PUT or POST request that
+ does not include an Expect request-header field with the "100-
+ continue" expectation. This exception, the purpose of which is to
+ minimize any client processing delays associated with an
+ undeclared wait for 100 (Continue) status code, applies only to
+ HTTP/1.1 requests, and not to requests with any other HTTP-version
+ value.
+
+ o An origin server MAY omit a 100 (Continue) response if it has
+ already received some or all of the request body for the
+ corresponding request.
+
+ o An origin server that sends a 100 (Continue) response MUST
+ ultimately send a final status code, once the request body is
+ received and processed, unless it terminates the transport
+ connection prematurely.
+
+ o If an origin server receives a request that does not include an
+ Expect request-header field with the "100-continue" expectation,
+ the request includes a request body, and the server responds with
+ a final status code before reading the entire request body from
+ the transport connection, then the server SHOULD NOT close the
+ transport connection until it has read the entire request, or
+ until the client closes the connection. Otherwise, the client
+ might not reliably receive the response message. However, this
+ requirement is not be construed as preventing a server from
+ defending itself against denial-of-service attacks, or from badly
+ broken client implementations.
+
+ Requirements for HTTP/1.1 proxies:
+
+ o If a proxy receives a request that includes an Expect request-
+ header field with the "100-continue" expectation, and the proxy
+ either knows that the next-hop server complies with HTTP/1.1 or
+ higher, or does not know the HTTP version of the next-hop server,
+ it MUST forward the request, including the Expect header field.
+
+ o If the proxy knows that the version of the next-hop server is
+ HTTP/1.0 or lower, it MUST NOT forward the request, and it MUST
+ respond with a 417 (Expectation Failed) status code.
+
+ o Proxies SHOULD maintain a cache recording the HTTP version numbers
+ received from recently-referenced next-hop servers.
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 47]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ o A proxy MUST NOT forward a 100 (Continue) response if the request
+ message was received from an HTTP/1.0 (or earlier) client and did
+ not include an Expect request-header field with the "100-continue"
+ expectation. This requirement overrides the general rule for
+ forwarding of 1xx responses (see Section 8.1 of [Part2]).
+
+7.2.4. Client Behavior if Server Prematurely Closes Connection
+
+ If an HTTP/1.1 client sends a request which includes a request body,
+ but which does not include an Expect request-header field with the
+ "100-continue" expectation, and if the client is not directly
+ connected to an HTTP/1.1 origin server, and if the client sees the
+ connection close before receiving a status line from the server, the
+ client SHOULD retry the request. If the client does retry this
+ request, it MAY use the following "binary exponential backoff"
+ algorithm to be assured of obtaining a reliable response:
+
+ 1. Initiate a new connection to the server
+
+ 2. Transmit the request-headers
+
+ 3. Initialize a variable R to the estimated round-trip time to the
+ server (e.g., based on the time it took to establish the
+ connection), or to a constant value of 5 seconds if the round-
+ trip time is not available.
+
+ 4. Compute T = R * (2**N), where N is the number of previous retries
+ of this request.
+
+ 5. Wait either for an error response from the server, or for T
+ seconds (whichever comes first)
+
+ 6. If no error response is received, after T seconds transmit the
+ body of the request.
+
+ 7. If client sees that the connection is closed prematurely, repeat
+ from step 1 until the request is accepted, an error response is
+ received, or the user becomes impatient and terminates the retry
+ process.
+
+ If at any point an error status code is received, the client
+
+ o SHOULD NOT continue and
+
+ o SHOULD close the connection if it has not completed sending the
+ request message.
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 48]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+8. Miscellaneous notes that might disappear
+
+8.1. Scheme aliases considered harmful
+
+ [[TBD-aliases-harmful: describe why aliases like webcal are
+ harmful.]]
+
+8.2. Use of HTTP for proxy communication
+
+ [[TBD-proxy-other: Configured to use HTTP to proxy HTTP or other
+ protocols.]]
+
+8.3. Interception of HTTP for access control
+
+ [[TBD-intercept: Interception of HTTP traffic for initiating access
+ control.]]
+
+8.4. Use of HTTP by other protocols
+
+ [[TBD-profiles: Profiles of HTTP defined by other protocol.
+ Extensions of HTTP like WebDAV.]]
+
+8.5. Use of HTTP by media type specification
+
+ [[TBD-hypertext: Instructions on composing HTTP requests via
+ hypertext formats.]]
+
+9. Header Field Definitions
+
+ This section defines the syntax and semantics of HTTP/1.1 header
+ fields related to message framing and transport protocols.
+
+9.1. Connection
+
+ The "Connection" general-header field allows the sender to specify
+ options that are desired for that particular connection and MUST NOT
+ be communicated by proxies over further connections.
+
+ The Connection header's value has the following grammar:
+
+ Connection = "Connection" ":" OWS Connection-v
+ Connection-v = 1#connection-token
+ connection-token = token
+
+ HTTP/1.1 proxies MUST parse the Connection header field before a
+ message is forwarded and, for each connection-token in this field,
+ remove any header field(s) from the message with the same name as the
+ connection-token. Connection options are signaled by the presence of
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 49]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ a connection-token in the Connection header field, not by any
+ corresponding additional header field(s), since the additional header
+ field might not be sent if there are no parameters associated with
+ that connection option.
+
+ Message headers listed in the Connection header MUST NOT include end-
+ to-end headers, such as Cache-Control.
+
+ HTTP/1.1 defines the "close" connection option for the sender to
+ signal that the connection will be closed after completion of the
+ response. For example,
+
+ Connection: close
+
+ in either the request or the response header fields indicates that
+ the connection SHOULD NOT be considered "persistent" (Section 7.1)
+ after the current request/response is complete.
+
+ An HTTP/1.1 client that does not support persistent connections MUST
+ include the "close" connection option in every request message.
+
+ An HTTP/1.1 server that does not support persistent connections MUST
+ include the "close" connection option in every response message that
+ does not have a 1xx (Informational) status code.
+
+ A system receiving an HTTP/1.0 (or lower-version) message that
+ includes a Connection header MUST, for each connection-token in this
+ field, remove and ignore any header field(s) from the message with
+ the same name as the connection-token. This protects against
+ mistaken forwarding of such header fields by pre-HTTP/1.1 proxies.
+ See Appendix B.2.
+
+9.2. Content-Length
+
+ The "Content-Length" header field indicates the size of the message-
+ body, in decimal number of octets, for any message other than a
+ response to the HEAD method or a response with a status code of 304.
+ In the case of responses to the HEAD method, it indicates the size of
+ the payload body (not including any potential transfer-coding) that
+ would have been sent had the request been a GET. In the case of the
+ 304 (Not Modified) response, it indicates the size of the payload
+ body (not including any potential transfer-coding) that would have
+ been sent in a 200 (OK) response.
+
+ Content-Length = "Content-Length" ":" OWS 1*Content-Length-v
+ Content-Length-v = 1*DIGIT
+
+ An example is
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 50]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ Content-Length: 3495
+
+ Implementations SHOULD use this field to indicate the message-body
+ length when no transfer-coding is being applied and the payload's
+ body length can be determined prior to being transferred.
+ Section 3.3 describes how recipients determine the length of a
+ message-body.
+
+ Any Content-Length greater than or equal to zero is a valid value.
+
+ Note that the use of this field in HTTP is significantly different
+ from the corresponding definition in MIME, where it is an optional
+ field used within the "message/external-body" content-type.
+
+9.3. Date
+
+ The "Date" general-header field represents the date and time at which
+ the message was originated, having the same semantics as the
+ Origination Date Field (orig-date) defined in Section 3.6.1 of
+ [RFC5322]. The field value is an HTTP-date, as described in
+ Section 6.1; it MUST be sent in rfc1123-date format.
+
+ Date = "Date" ":" OWS Date-v
+ Date-v = HTTP-date
+
+ An example is
+
+ Date: Tue, 15 Nov 1994 08:12:31 GMT
+
+ Origin servers MUST include a Date header field in all responses,
+ except in these cases:
+
+ 1. If the response status code is 100 (Continue) or 101 (Switching
+ Protocols), the response MAY include a Date header field, at the
+ server's option.
+
+ 2. If the response status code conveys a server error, e.g., 500
+ (Internal Server Error) or 503 (Service Unavailable), and it is
+ inconvenient or impossible to generate a valid Date.
+
+ 3. If the server does not have a clock that can provide a reasonable
+ approximation of the current time, its responses MUST NOT include
+ a Date header field. In this case, the rules in Section 9.3.1
+ MUST be followed.
+
+ A received message that does not have a Date header field MUST be
+ assigned one by the recipient if the message will be cached by that
+ recipient or gatewayed via a protocol which requires a Date. An HTTP
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 51]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ implementation without a clock MUST NOT cache responses without
+ revalidating them on every use. An HTTP cache, especially a shared
+ cache, SHOULD use a mechanism, such as NTP [RFC1305], to synchronize
+ its clock with a reliable external standard.
+
+ Clients SHOULD only send a Date header field in messages that include
+ a payload, as is usually the case for PUT and POST requests, and even
+ then it is optional. A client without a clock MUST NOT send a Date
+ header field in a request.
+
+ The HTTP-date sent in a Date header SHOULD NOT represent a date and
+ time subsequent to the generation of the message. It SHOULD
+ represent the best available approximation of the date and time of
+ message generation, unless the implementation has no means of
+ generating a reasonably accurate date and time. In theory, the date
+ ought to represent the moment just before the payload is generated.
+ In practice, the date can be generated at any time during the message
+ origination without affecting its semantic value.
+
+9.3.1. Clockless Origin Server Operation
+
+ Some origin server implementations might not have a clock available.
+ An origin server without a clock MUST NOT assign Expires or Last-
+ Modified values to a response, unless these values were associated
+ with the resource by a system or user with a reliable clock. It MAY
+ assign an Expires value that is known, at or before server
+ configuration time, to be in the past (this allows "pre-expiration"
+ of responses without storing separate Expires values for each
+ resource).
+
+9.4. Host
+
+ The "Host" request-header field specifies the Internet host and port
+ number of the resource being requested, allowing the origin server or
+ gateway to differentiate between internally-ambiguous URLs, such as
+ the root "/" URL of a server for multiple host names on a single IP
+ address.
+
+ The Host field value MUST represent the naming authority of the
+ origin server or gateway given by the original URL obtained from the
+ user or referring resource (generally an http URI, as described in
+ Section 2.6.1).
+
+ Host = "Host" ":" OWS Host-v
+ Host-v = uri-host [ ":" port ] ; Section 2.6.1
+
+ A "host" without any trailing port information implies the default
+ port for the service requested (e.g., "80" for an HTTP URL). For
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 52]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ example, a request on the origin server for
+ <http://www.example.org/pub/WWW/> would properly include:
+
+ GET /pub/WWW/ HTTP/1.1
+ Host: www.example.org
+
+ A client MUST include a Host header field in all HTTP/1.1 request
+ messages. If the requested URI does not include an Internet host
+ name for the service being requested, then the Host header field MUST
+ be given with an empty value. An HTTP/1.1 proxy MUST ensure that any
+ request message it forwards does contain an appropriate Host header
+ field that identifies the service being requested by the proxy. All
+ Internet-based HTTP/1.1 servers MUST respond with a 400 (Bad Request)
+ status code to any HTTP/1.1 request message which lacks a Host header
+ field.
+
+ See Sections 4.2 and B.1.1 for other requirements relating to Host.
+
+9.5. TE
+
+ The "TE" request-header field indicates what extension transfer-
+ codings it is willing to accept in the response, and whether or not
+ it is willing to accept trailer fields in a chunked transfer-coding.
+
+ Its value consists of the keyword "trailers" and/or a comma-separated
+ list of extension transfer-coding names with optional accept
+ parameters (as described in Section 6.2).
+
+ TE = "TE" ":" OWS TE-v
+ TE-v = #t-codings
+ t-codings = "trailers" / ( transfer-extension [ te-params ] )
+ te-params = OWS ";" OWS "q=" qvalue *( te-ext )
+ te-ext = OWS ";" OWS token [ "=" word ]
+
+ The presence of the keyword "trailers" indicates that the client is
+ willing to accept trailer fields in a chunked transfer-coding, as
+ defined in Section 6.2.1. This keyword is reserved for use with
+ transfer-coding values even though it does not itself represent a
+ transfer-coding.
+
+ Examples of its use are:
+
+ TE: deflate
+ TE:
+ TE: trailers, deflate;q=0.5
+
+ The TE header field only applies to the immediate connection.
+ Therefore, the keyword MUST be supplied within a Connection header
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 53]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ field (Section 9.1) whenever TE is present in an HTTP/1.1 message.
+
+ A server tests whether a transfer-coding is acceptable, according to
+ a TE field, using these rules:
+
+ 1. The "chunked" transfer-coding is always acceptable. If the
+ keyword "trailers" is listed, the client indicates that it is
+ willing to accept trailer fields in the chunked response on
+ behalf of itself and any downstream clients. The implication is
+ that, if given, the client is stating that either all downstream
+ clients are willing to accept trailer fields in the forwarded
+ response, or that it will attempt to buffer the response on
+ behalf of downstream recipients.
+
+ Note: HTTP/1.1 does not define any means to limit the size of a
+ chunked response such that a client can be assured of buffering
+ the entire response.
+
+ 2. If the transfer-coding being tested is one of the transfer-
+ codings listed in the TE field, then it is acceptable unless it
+ is accompanied by a qvalue of 0. (As defined in Section 6.4, a
+ qvalue of 0 means "not acceptable".)
+
+ 3. If multiple transfer-codings are acceptable, then the acceptable
+ transfer-coding with the highest non-zero qvalue is preferred.
+ The "chunked" transfer-coding always has a qvalue of 1.
+
+ If the TE field-value is empty or if no TE field is present, the only
+ transfer-coding is "chunked". A message with no transfer-coding is
+ always acceptable.
+
+9.6. Trailer
+
+ The "Trailer" general-header field indicates that the given set of
+ header fields is present in the trailer of a message encoded with
+ chunked transfer-coding.
+
+ Trailer = "Trailer" ":" OWS Trailer-v
+ Trailer-v = 1#field-name
+
+ An HTTP/1.1 message SHOULD include a Trailer header field in a
+ message using chunked transfer-coding with a non-empty trailer.
+ Doing so allows the recipient to know which header fields to expect
+ in the trailer.
+
+ If no Trailer header field is present, the trailer SHOULD NOT include
+ any header fields. See Section 6.2.1 for restrictions on the use of
+ trailer fields in a "chunked" transfer-coding.
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 54]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ Message header fields listed in the Trailer header field MUST NOT
+ include the following header fields:
+
+ o Transfer-Encoding
+
+ o Content-Length
+
+ o Trailer
+
+9.7. Transfer-Encoding
+
+ The "Transfer-Encoding" general-header field indicates what transfer-
+ codings (if any) have been applied to the message body. It differs
+ from Content-Encoding (Section 2.2 of [Part3]) in that transfer-
+ codings are a property of the message (and therefore are removed by
+ intermediaries), whereas content-codings are not.
+
+ Transfer-Encoding = "Transfer-Encoding" ":" OWS
+ Transfer-Encoding-v
+ Transfer-Encoding-v = 1#transfer-coding
+
+ Transfer-codings are defined in Section 6.2. An example is:
+
+ Transfer-Encoding: chunked
+
+ If multiple encodings have been applied to a representation, the
+ transfer-codings MUST be listed in the order in which they were
+ applied. Additional information about the encoding parameters MAY be
+ provided by other header fields not defined by this specification.
+
+ Many older HTTP/1.0 applications do not understand the Transfer-
+ Encoding header.
+
+9.8. Upgrade
+
+ The "Upgrade" general-header field allows the client to specify what
+ additional communication protocols it would like to use, if the
+ server chooses to switch protocols. Additionally, the server MUST
+ use the Upgrade header field within a 101 (Switching Protocols)
+ response to indicate which protocol(s) are being switched to.
+
+ Upgrade = "Upgrade" ":" OWS Upgrade-v
+ Upgrade-v = 1#product
+
+ For example,
+
+ Upgrade: HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 55]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ The Upgrade header field is intended to provide a simple mechanism
+ for transition from HTTP/1.1 to some other, incompatible protocol.
+ It does so by allowing the client to advertise its desire to use
+ another protocol, such as a later version of HTTP with a higher major
+ version number, even though the current request has been made using
+ HTTP/1.1. This eases the difficult transition between incompatible
+ protocols by allowing the client to initiate a request in the more
+ commonly supported protocol while indicating to the server that it
+ would like to use a "better" protocol if available (where "better" is
+ determined by the server, possibly according to the nature of the
+ method and/or resource being requested).
+
+ The Upgrade header field only applies to switching application-layer
+ protocols upon the existing transport-layer connection. Upgrade
+ cannot be used to insist on a protocol change; its acceptance and use
+ by the server is optional. The capabilities and nature of the
+ application-layer communication after the protocol change is entirely
+ dependent upon the new protocol chosen, although the first action
+ after changing the protocol MUST be a response to the initial HTTP
+ request containing the Upgrade header field.
+
+ The Upgrade header field only applies to the immediate connection.
+ Therefore, the upgrade keyword MUST be supplied within a Connection
+ header field (Section 9.1) whenever Upgrade is present in an HTTP/1.1
+ message.
+
+ The Upgrade header field cannot be used to indicate a switch to a
+ protocol on a different connection. For that purpose, it is more
+ appropriate to use a 301, 302, 303, or 305 redirection response.
+
+ This specification only defines the protocol name "HTTP" for use by
+ the family of Hypertext Transfer Protocols, as defined by the HTTP
+ version rules of Section 2.5 and future updates to this
+ specification. Additional tokens can be registered with IANA using
+ the registration procedure defined below.
+
+9.8.1. Upgrade Token Registry
+
+ The HTTP Upgrade Token Registry defines the name space for product
+ tokens used to identify protocols in the Upgrade header field. Each
+ registered token is associated with contact information and an
+ optional set of specifications that details how the connection will
+ be processed after it has been upgraded.
+
+ Registrations are allowed on a First Come First Served basis as
+ described in Section 4.1 of [RFC5226]. The specifications need not
+ be IETF documents or be subject to IESG review. Registrations are
+ subject to the following rules:
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 56]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ 1. A token, once registered, stays registered forever.
+
+ 2. The registration MUST name a responsible party for the
+ registration.
+
+ 3. The registration MUST name a point of contact.
+
+ 4. The registration MAY name a set of specifications associated with
+ that token. Such specifications need not be publicly available.
+
+ 5. The responsible party MAY change the registration at any time.
+ The IANA will keep a record of all such changes, and make them
+ available upon request.
+
+ 6. The responsible party for the first registration of a "product"
+ token MUST approve later registrations of a "version" token
+ together with that "product" token before they can be registered.
+
+ 7. If absolutely required, the IESG MAY reassign the responsibility
+ for a token. This will normally only be used in the case when a
+ responsible party cannot be contacted.
+
+9.9. Via
+
+ The "Via" general-header field MUST be used by gateways and proxies
+ to indicate the intermediate protocols and recipients between the
+ user agent and the server on requests, and between the origin server
+ and the client on responses. It is analogous to the "Received" field
+ defined in Section 3.6.7 of [RFC5322] and is intended to be used for
+ tracking message forwards, avoiding request loops, and identifying
+ the protocol capabilities of all senders along the request/response
+ chain.
+
+ Via = "Via" ":" OWS Via-v
+ Via-v = 1#( received-protocol RWS received-by
+ [ RWS comment ] )
+ received-protocol = [ protocol-name "/" ] protocol-version
+ protocol-name = token
+ protocol-version = token
+ received-by = ( uri-host [ ":" port ] ) / pseudonym
+ pseudonym = token
+
+ The received-protocol indicates the protocol version of the message
+ received by the server or client along each segment of the request/
+ response chain. The received-protocol version is appended to the Via
+ field value when the message is forwarded so that information about
+ the protocol capabilities of upstream applications remains visible to
+ all recipients.
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 57]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ The protocol-name is optional if and only if it would be "HTTP". The
+ received-by field is normally the host and optional port number of a
+ recipient server or client that subsequently forwarded the message.
+ However, if the real host is considered to be sensitive information,
+ it MAY be replaced by a pseudonym. If the port is not given, it MAY
+ be assumed to be the default port of the received-protocol.
+
+ Multiple Via field values represent each proxy or gateway that has
+ forwarded the message. Each recipient MUST append its information
+ such that the end result is ordered according to the sequence of
+ forwarding applications.
+
+ Comments MAY be used in the Via header field to identify the software
+ of the recipient proxy or gateway, analogous to the User-Agent and
+ Server header fields. However, all comments in the Via field are
+ optional and MAY be removed by any recipient prior to forwarding the
+ message.
+
+ For example, a request message could be sent from an HTTP/1.0 user
+ agent to an internal proxy code-named "fred", which uses HTTP/1.1 to
+ forward the request to a public proxy at p.example.net, which
+ completes the request by forwarding it to the origin server at
+ www.example.com. The request received by www.example.com would then
+ have the following Via header field:
+
+ Via: 1.0 fred, 1.1 p.example.net (Apache/1.1)
+
+ Proxies and gateways used as a portal through a network firewall
+ SHOULD NOT, by default, forward the names and ports of hosts within
+ the firewall region. This information SHOULD only be propagated if
+ explicitly enabled. If not enabled, the received-by host of any host
+ behind the firewall SHOULD be replaced by an appropriate pseudonym
+ for that host.
+
+ For organizations that have strong privacy requirements for hiding
+ internal structures, a proxy MAY combine an ordered subsequence of
+ Via header field entries with identical received-protocol values into
+ a single such entry. For example,
+
+ Via: 1.0 ricky, 1.1 ethel, 1.1 fred, 1.0 lucy
+
+ could be collapsed to
+
+ Via: 1.0 ricky, 1.1 mertz, 1.0 lucy
+
+ Applications SHOULD NOT combine multiple entries unless they are all
+ under the same organizational control and the hosts have already been
+ replaced by pseudonyms. Applications MUST NOT combine entries which
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 58]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ have different received-protocol values.
+
+10. IANA Considerations
+
+10.1. Header Field Registration
+
+ The Message Header Field Registry located at <http://www.iana.org/
+ assignments/message-headers/message-header-index.html> shall be
+ updated with the permanent registrations below (see [RFC3864]):
+
+ +-------------------+----------+----------+-------------+
+ | Header Field Name | Protocol | Status | Reference |
+ +-------------------+----------+----------+-------------+
+ | Connection | http | standard | Section 9.1 |
+ | Content-Length | http | standard | Section 9.2 |
+ | Date | http | standard | Section 9.3 |
+ | Host | http | standard | Section 9.4 |
+ | TE | http | standard | Section 9.5 |
+ | Trailer | http | standard | Section 9.6 |
+ | Transfer-Encoding | http | standard | Section 9.7 |
+ | Upgrade | http | standard | Section 9.8 |
+ | Via | http | standard | Section 9.9 |
+ +-------------------+----------+----------+-------------+
+
+ The change controller is: "IETF (iesg@ietf.org) - Internet
+ Engineering Task Force".
+
+10.2. URI Scheme Registration
+
+ The entries for the "http" and "https" URI Schemes in the registry
+ located at <http://www.iana.org/assignments/uri-schemes.html> shall
+ be updated to point to Sections 2.6.1 and 2.6.2 of this document (see
+ [RFC4395]).
+
+10.3. Internet Media Type Registrations
+
+ This document serves as the specification for the Internet media
+ types "message/http" and "application/http". The following is to be
+ registered with IANA (see [RFC4288]).
+
+10.3.1. Internet Media Type message/http
+
+ The message/http type can be used to enclose a single HTTP request or
+ response message, provided that it obeys the MIME restrictions for
+ all "message" types regarding line length and encodings.
+
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 59]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ Type name: message
+
+ Subtype name: http
+
+ Required parameters: none
+
+ Optional parameters: version, msgtype
+
+ version: The HTTP-Version number of the enclosed message (e.g.,
+ "1.1"). If not present, the version can be determined from the
+ first line of the body.
+
+ msgtype: The message type -- "request" or "response". If not
+ present, the type can be determined from the first line of the
+ body.
+
+ Encoding considerations: only "7bit", "8bit", or "binary" are
+ permitted
+
+ Security considerations: none
+
+ Interoperability considerations: none
+
+ Published specification: This specification (see Section 10.3.1).
+
+ Applications that use this media type:
+
+ Additional information:
+
+ Magic number(s): none
+
+ File extension(s): none
+
+ Macintosh file type code(s): none
+
+ Person and email address to contact for further information: See
+ Authors Section.
+
+ Intended usage: COMMON
+
+ Restrictions on usage: none
+
+ Author/Change controller: IESG
+
+
+
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 60]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+10.3.2. Internet Media Type application/http
+
+ The application/http type can be used to enclose a pipeline of one or
+ more HTTP request or response messages (not intermixed).
+
+ Type name: application
+
+ Subtype name: http
+
+ Required parameters: none
+
+ Optional parameters: version, msgtype
+
+ version: The HTTP-Version number of the enclosed messages (e.g.,
+ "1.1"). If not present, the version can be determined from the
+ first line of the body.
+
+ msgtype: The message type -- "request" or "response". If not
+ present, the type can be determined from the first line of the
+ body.
+
+ Encoding considerations: HTTP messages enclosed by this type are in
+ "binary" format; use of an appropriate Content-Transfer-Encoding
+ is required when transmitted via E-mail.
+
+ Security considerations: none
+
+ Interoperability considerations: none
+
+ Published specification: This specification (see Section 10.3.2).
+
+ Applications that use this media type:
+
+ Additional information:
+
+ Magic number(s): none
+
+ File extension(s): none
+
+ Macintosh file type code(s): none
+
+ Person and email address to contact for further information: See
+ Authors Section.
+
+ Intended usage: COMMON
+
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 61]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ Restrictions on usage: none
+
+ Author/Change controller: IESG
+
+10.4. Transfer Coding Registry
+
+ The registration procedure for HTTP Transfer Codings is now defined
+ by Section 6.2.3 of this document.
+
+ The HTTP Transfer Codings Registry located at
+ <http://www.iana.org/assignments/http-parameters> shall be updated
+ with the registrations below:
+
+ +----------+--------------------------------------+-----------------+
+ | Name | Description | Reference |
+ +----------+--------------------------------------+-----------------+
+ | chunked | Transfer in a series of chunks | Section 6.2.1 |
+ | compress | UNIX "compress" program method | Section 6.2.2.1 |
+ | deflate | "deflate" compression mechanism | Section 6.2.2.2 |
+ | | ([RFC1951]) used inside the "zlib" | |
+ | | data format ([RFC1950]) | |
+ | gzip | Same as GNU zip [RFC1952] | Section 6.2.2.3 |
+ +----------+--------------------------------------+-----------------+
+
+10.5. Upgrade Token Registration
+
+ The registration procedure for HTTP Upgrade Tokens -- previously
+ defined in Section 7.2 of [RFC2817] -- is now defined by
+ Section 9.8.1 of this document.
+
+ The HTTP Status Code Registry located at
+ <http://www.iana.org/assignments/http-upgrade-tokens/> shall be
+ updated with the registration below:
+
+ +-------+---------------------------+-------------------------------+
+ | Value | Description | Reference |
+ +-------+---------------------------+-------------------------------+
+ | HTTP | Hypertext Transfer | Section 2.5 of this |
+ | | Protocol | specification |
+ +-------+---------------------------+-------------------------------+
+
+11. Security Considerations
+
+ This section is meant to inform application developers, information
+ providers, and users of the security limitations in HTTP/1.1 as
+ described by this document. The discussion does not include
+ definitive solutions to the problems revealed, though it does make
+ some suggestions for reducing security risks.
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 62]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+11.1. Personal Information
+
+ HTTP clients are often privy to large amounts of personal information
+ (e.g., the user's name, location, mail address, passwords, encryption
+ keys, etc.), and SHOULD be very careful to prevent unintentional
+ leakage of this information. We very strongly recommend that a
+ convenient interface be provided for the user to control
+ dissemination of such information, and that designers and
+ implementors be particularly careful in this area. History shows
+ that errors in this area often create serious security and/or privacy
+ problems and generate highly adverse publicity for the implementor's
+ company.
+
+11.2. Abuse of Server Log Information
+
+ A server is in the position to save personal data about a user's
+ requests which might identify their reading patterns or subjects of
+ interest. This information is clearly confidential in nature and its
+ handling can be constrained by law in certain countries. People
+ using HTTP to provide data are responsible for ensuring that such
+ material is not distributed without the permission of any individuals
+ that are identifiable by the published results.
+
+11.3. Attacks Based On File and Path Names
+
+ Implementations of HTTP origin servers SHOULD be careful to restrict
+ the documents returned by HTTP requests to be only those that were
+ intended by the server administrators. If an HTTP server translates
+ HTTP URIs directly into file system calls, the server MUST take
+ special care not to serve files that were not intended to be
+ delivered to HTTP clients. For example, UNIX, Microsoft Windows, and
+ other operating systems use ".." as a path component to indicate a
+ directory level above the current one. On such a system, an HTTP
+ server MUST disallow any such construct in the request-target if it
+ would otherwise allow access to a resource outside those intended to
+ be accessible via the HTTP server. Similarly, files intended for
+ reference only internally to the server (such as access control
+ files, configuration files, and script code) MUST be protected from
+ inappropriate retrieval, since they might contain sensitive
+ information. Experience has shown that minor bugs in such HTTP
+ server implementations have turned into security risks.
+
+11.4. DNS Spoofing
+
+ Clients using HTTP rely heavily on the Domain Name Service, and are
+ thus generally prone to security attacks based on the deliberate mis-
+ association of IP addresses and DNS names. Clients need to be
+ cautious in assuming the continuing validity of an IP number/DNS name
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 63]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ association.
+
+ In particular, HTTP clients SHOULD rely on their name resolver for
+ confirmation of an IP number/DNS name association, rather than
+ caching the result of previous host name lookups. Many platforms
+ already can cache host name lookups locally when appropriate, and
+ they SHOULD be configured to do so. It is proper for these lookups
+ to be cached, however, only when the TTL (Time To Live) information
+ reported by the name server makes it likely that the cached
+ information will remain useful.
+
+ If HTTP clients cache the results of host name lookups in order to
+ achieve a performance improvement, they MUST observe the TTL
+ information reported by DNS.
+
+ If HTTP clients do not observe this rule, they could be spoofed when
+ a previously-accessed server's IP address changes. As network
+ renumbering is expected to become increasingly common [RFC1900], the
+ possibility of this form of attack will grow. Observing this
+ requirement thus reduces this potential security vulnerability.
+
+ This requirement also improves the load-balancing behavior of clients
+ for replicated servers using the same DNS name and reduces the
+ likelihood of a user's experiencing failure in accessing sites which
+ use that strategy.
+
+11.5. Proxies and Caching
+
+ By their very nature, HTTP proxies are men-in-the-middle, and
+ represent an opportunity for man-in-the-middle attacks. Compromise
+ of the systems on which the proxies run can result in serious
+ security and privacy problems. Proxies have access to security-
+ related information, personal information about individual users and
+ organizations, and proprietary information belonging to users and
+ content providers. A compromised proxy, or a proxy implemented or
+ configured without regard to security and privacy considerations,
+ might be used in the commission of a wide range of potential attacks.
+
+ Proxy operators need to protect the systems on which proxies run as
+ they would protect any system that contains or transports sensitive
+ information. In particular, log information gathered at proxies
+ often contains highly sensitive personal information, and/or
+ information about organizations. Log information needs to be
+ carefully guarded, and appropriate guidelines for use need to be
+ developed and followed. (Section 11.2).
+
+ Proxy implementors need to consider the privacy and security
+ implications of their design and coding decisions, and of the
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 64]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ configuration options they provide to proxy operators (especially the
+ default configuration).
+
+ Users of a proxy need to be aware that proxies are no trustworthier
+ than the people who run them; HTTP itself cannot solve this problem.
+
+ The judicious use of cryptography, when appropriate, might suffice to
+ protect against a broad range of security and privacy attacks. Such
+ cryptography is beyond the scope of the HTTP/1.1 specification.
+
+11.6. Denial of Service Attacks on Proxies
+
+ They exist. They are hard to defend against. Research continues.
+ Beware.
+
+12. Acknowledgments
+
+ HTTP has evolved considerably over the years. It has benefited from
+ a large and active developer community--the many people who have
+ participated on the www-talk mailing list--and it is that community
+ which has been most responsible for the success of HTTP and of the
+ World-Wide Web in general. Marc Andreessen, Robert Cailliau, Daniel
+ W. Connolly, Bob Denny, John Franks, Jean-Francois Groff, Phillip M.
+ Hallam-Baker, Hakon W. Lie, Ari Luotonen, Rob McCool, Lou Montulli,
+ Dave Raggett, Tony Sanders, and Marc VanHeyningen deserve special
+ recognition for their efforts in defining early aspects of the
+ protocol.
+
+ This document has benefited greatly from the comments of all those
+ participating in the HTTP-WG. In addition to those already
+ mentioned, the following individuals have contributed to this
+ specification:
+
+ Gary Adams, Harald Tveit Alvestrand, Keith Ball, Brian Behlendorf,
+ Paul Burchard, Maurizio Codogno, Josh Cohen, Mike Cowlishaw, Roman
+ Czyborra, Michael A. Dolan, Daniel DuBois, David J. Fiander, Alan
+ Freier, Marc Hedlund, Greg Herlihy, Koen Holtman, Alex Hopmann, Bob
+ Jernigan, Shel Kaphan, Rohit Khare, John Klensin, Martijn Koster,
+ Alexei Kosut, David M. Kristol, Daniel LaLiberte, Ben Laurie, Paul J.
+ Leach, Albert Lunde, John C. Mallery, Jean-Philippe Martin-Flatin,
+ Mitra, David Morris, Gavin Nicol, Ross Patterson, Bill Perry, Jeffrey
+ Perry, Scott Powers, Owen Rees, Luigi Rizzo, David Robinson, Marc
+ Salomon, Rich Salz, Allan M. Schiffman, Jim Seidman, Chuck Shotton,
+ Eric W. Sink, Simon E. Spero, Richard N. Taylor, Robert S. Thau, Bill
+ (BearHeart) Weinman, Francois Yergeau, Mary Ellen Zurko.
+
+ Thanks to the "cave men" of Palo Alto. You know who you are.
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 65]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ Jim Gettys (the editor of [RFC2616]) wishes particularly to thank Roy
+ Fielding, the editor of [RFC2068], along with John Klensin, Jeff
+ Mogul, Paul Leach, Dave Kristol, Koen Holtman, John Franks, Josh
+ Cohen, Alex Hopmann, Scott Lawrence, and Larry Masinter for their
+ help. And thanks go particularly to Jeff Mogul and Scott Lawrence
+ for performing the "MUST/MAY/SHOULD" audit.
+
+ The Apache Group, Anselm Baird-Smith, author of Jigsaw, and Henrik
+ Frystyk implemented RFC 2068 early, and we wish to thank them for the
+ discovery of many of the problems that this document attempts to
+ rectify.
+
+ This specification makes heavy use of the augmented BNF and generic
+ constructs defined by David H. Crocker for [RFC5234]. Similarly, it
+ reuses many of the definitions provided by Nathaniel Borenstein and
+ Ned Freed for MIME [RFC2045]. We hope that their inclusion in this
+ specification will help reduce past confusion over the relationship
+ between HTTP and Internet mail message formats.
+
+13. References
+
+13.1. Normative References
+
+ [ISO-8859-1] International Organization for Standardization,
+ "Information technology -- 8-bit single-byte coded
+ graphic character sets -- Part 1: Latin alphabet No.
+ 1", ISO/IEC 8859-1:1998, 1998.
+
+ [Part2] Fielding, R., Ed., Gettys, J., Mogul, J., Frystyk, H.,
+ Masinter, L., Leach, P., Berners-Lee, T., Lafon, Y.,
+ Ed., and J. Reschke, Ed., "HTTP/1.1, part 2: Message
+ Semantics", draft-ietf-httpbis-p2-semantics-11 (work in
+ progress), August 2010.
+
+ [Part3] Fielding, R., Ed., Gettys, J., Mogul, J., Frystyk, H.,
+ Masinter, L., Leach, P., Berners-Lee, T., Lafon, Y.,
+ Ed., and J. Reschke, Ed., "HTTP/1.1, part 3: Message
+ Payload and Content Negotiation",
+ draft-ietf-httpbis-p3-payload-11 (work in progress),
+ August 2010.
+
+ [Part6] Fielding, R., Ed., Gettys, J., Mogul, J., Frystyk, H.,
+ Masinter, L., Leach, P., Berners-Lee, T., Lafon, Y.,
+ Ed., Nottingham, M., Ed., and J. Reschke, Ed.,
+ "HTTP/1.1, part 6: Caching",
+ draft-ietf-httpbis-p6-cache-11 (work in progress),
+ August 2010.
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 66]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ [RFC1950] Deutsch, L. and J-L. Gailly, "ZLIB Compressed Data
+ Format Specification version 3.3", RFC 1950, May 1996.
+
+ RFC 1950 is an Informational RFC, thus it might be less
+ stable than this specification. On the other hand,
+ this downward reference was present since the
+ publication of RFC 2068 in 1997 ([RFC2068]), therefore
+ it is unlikely to cause problems in practice. See also
+ [BCP97].
+
+ [RFC1951] Deutsch, P., "DEFLATE Compressed Data Format
+ Specification version 1.3", RFC 1951, May 1996.
+
+ RFC 1951 is an Informational RFC, thus it might be less
+ stable than this specification. On the other hand,
+ this downward reference was present since the
+ publication of RFC 2068 in 1997 ([RFC2068]), therefore
+ it is unlikely to cause problems in practice. See also
+ [BCP97].
+
+ [RFC1952] Deutsch, P., Gailly, J-L., Adler, M., Deutsch, L., and
+ G. Randers-Pehrson, "GZIP file format specification
+ version 4.3", RFC 1952, May 1996.
+
+ RFC 1952 is an Informational RFC, thus it might be less
+ stable than this specification. On the other hand,
+ this downward reference was present since the
+ publication of RFC 2068 in 1997 ([RFC2068]), therefore
+ it is unlikely to cause problems in practice. See also
+ [BCP97].
+
+ [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
+ Requirement Levels", BCP 14, RFC 2119, March 1997.
+
+ [RFC3986] Berners-Lee, T., Fielding, R., and L. Masinter,
+ "Uniform Resource Identifier (URI): Generic Syntax",
+ RFC 3986, STD 66, January 2005.
+
+ [RFC5234] Crocker, D., Ed. and P. Overell, "Augmented BNF for
+ Syntax Specifications: ABNF", STD 68, RFC 5234,
+ January 2008.
+
+ [USASCII] American National Standards Institute, "Coded Character
+ Set -- 7-bit American Standard Code for Information
+ Interchange", ANSI X3.4, 1986.
+
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 67]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+13.2. Informative References
+
+ [BCP97] Klensin, J. and S. Hartman, "Handling Normative
+ References to Standards-Track Documents", BCP 97,
+ RFC 4897, June 2007.
+
+ [Kri2001] Kristol, D., "HTTP Cookies: Standards, Privacy, and
+ Politics", ACM Transactions on Internet Technology Vol.
+ 1, #2, November 2001,
+ <http://arxiv.org/abs/cs.SE/0105018>.
+
+ [Nie1997] Frystyk, H., Gettys, J., Prud'hommeaux, E., Lie, H.,
+ and C. Lilley, "Network Performance Effects of
+ HTTP/1.1, CSS1, and PNG", ACM Proceedings of the ACM
+ SIGCOMM '97 conference on Applications, technologies,
+ architectures, and protocols for computer communication
+ SIGCOMM '97, September 1997,
+ <http://doi.acm.org/10.1145/263105.263157>.
+
+ [Pad1995] Padmanabhan, V. and J. Mogul, "Improving HTTP Latency",
+ Computer Networks and ISDN Systems v. 28, pp. 25-35,
+ December 1995,
+ <http://portal.acm.org/citation.cfm?id=219094>.
+
+ [RFC1123] Braden, R., "Requirements for Internet Hosts -
+ Application and Support", STD 3, RFC 1123,
+ October 1989.
+
+ [RFC1305] Mills, D., "Network Time Protocol (Version 3)
+ Specification, Implementation", RFC 1305, March 1992.
+
+ [RFC1900] Carpenter, B. and Y. Rekhter, "Renumbering Needs Work",
+ RFC 1900, February 1996.
+
+ [RFC1945] Berners-Lee, T., Fielding, R., and H. Nielsen,
+ "Hypertext Transfer Protocol -- HTTP/1.0", RFC 1945,
+ May 1996.
+
+ [RFC2045] Freed, N. and N. Borenstein, "Multipurpose Internet
+ Mail Extensions (MIME) Part One: Format of Internet
+ Message Bodies", RFC 2045, November 1996.
+
+ [RFC2047] Moore, K., "MIME (Multipurpose Internet Mail
+ Extensions) Part Three: Message Header Extensions for
+ Non-ASCII Text", RFC 2047, November 1996.
+
+ [RFC2068] Fielding, R., Gettys, J., Mogul, J., Nielsen, H., and
+ T. Berners-Lee, "Hypertext Transfer Protocol --
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 68]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ HTTP/1.1", RFC 2068, January 1997.
+
+ [RFC2109] Kristol, D. and L. Montulli, "HTTP State Management
+ Mechanism", RFC 2109, February 1997.
+
+ [RFC2145] Mogul, J., Fielding, R., Gettys, J., and H. Nielsen,
+ "Use and Interpretation of HTTP Version Numbers",
+ RFC 2145, May 1997.
+
+ [RFC2616] Fielding, R., Gettys, J., Mogul, J., Frystyk, H.,
+ Masinter, L., Leach, P., and T. Berners-Lee, "Hypertext
+ Transfer Protocol -- HTTP/1.1", RFC 2616, June 1999.
+
+ [RFC2817] Khare, R. and S. Lawrence, "Upgrading to TLS Within
+ HTTP/1.1", RFC 2817, May 2000.
+
+ [RFC2818] Rescorla, E., "HTTP Over TLS", RFC 2818, May 2000.
+
+ [RFC2965] Kristol, D. and L. Montulli, "HTTP State Management
+ Mechanism", RFC 2965, October 2000.
+
+ [RFC3864] Klyne, G., Nottingham, M., and J. Mogul, "Registration
+ Procedures for Message Header Fields", BCP 90,
+ RFC 3864, September 2004.
+
+ [RFC4288] Freed, N. and J. Klensin, "Media Type Specifications
+ and Registration Procedures", BCP 13, RFC 4288,
+ December 2005.
+
+ [RFC4395] Hansen, T., Hardie, T., and L. Masinter, "Guidelines
+ and Registration Procedures for New URI Schemes",
+ BCP 115, RFC 4395, February 2006.
+
+ [RFC5226] Narten, T. and H. Alvestrand, "Guidelines for Writing
+ an IANA Considerations Section in RFCs", BCP 26,
+ RFC 5226, May 2008.
+
+ [RFC5322] Resnick, P., "Internet Message Format", RFC 5322,
+ October 2008.
+
+ [Spe] Spero, S., "Analysis of HTTP Performance Problems",
+ <http://sunsite.unc.edu/mdma-release/http-prob.html>.
+
+ [Tou1998] Touch, J., Heidemann, J., and K. Obraczka, "Analysis of
+ HTTP Performance", ISI Research Report ISI/RR-98-463,
+ Aug 1998, <http://www.isi.edu/touch/pubs/http-perf96/>.
+
+ (original report dated Aug. 1996)
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 69]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+Appendix A. Tolerant Applications
+
+ Although this document specifies the requirements for the generation
+ of HTTP/1.1 messages, not all applications will be correct in their
+ implementation. We therefore recommend that operational applications
+ be tolerant of deviations whenever those deviations can be
+ interpreted unambiguously.
+
+ Clients SHOULD be tolerant in parsing the Status-Line and servers
+ SHOULD be tolerant when parsing the Request-Line. In particular,
+ they SHOULD accept any amount of WSP characters between fields, even
+ though only a single SP is required.
+
+ The line terminator for header fields is the sequence CRLF. However,
+ we recommend that applications, when parsing such headers, recognize
+ a single LF as a line terminator and ignore the leading CR.
+
+ The character set of a representation SHOULD be labeled as the lowest
+ common denominator of the character codes used within that
+ representation, with the exception that not labeling the
+ representation is preferred over labeling the representation with the
+ labels US-ASCII or ISO-8859-1. See [Part3].
+
+ Additional rules for requirements on parsing and encoding of dates
+ and other potential problems with date encodings include:
+
+ o HTTP/1.1 clients and caches SHOULD assume that an RFC-850 date
+ which appears to be more than 50 years in the future is in fact in
+ the past (this helps solve the "year 2000" problem).
+
+ o Although all date formats are specified to be case-sensitive,
+ recipients SHOULD match day, week and timezone names case-
+ insensitively.
+
+ o An HTTP/1.1 implementation MAY internally represent a parsed
+ Expires date as earlier than the proper value, but MUST NOT
+ internally represent a parsed Expires date as later than the
+ proper value.
+
+ o All expiration-related calculations MUST be done in GMT. The
+ local time zone MUST NOT influence the calculation or comparison
+ of an age or expiration time.
+
+ o If an HTTP header incorrectly carries a date value with a time
+ zone other than GMT, it MUST be converted into GMT using the most
+ conservative possible conversion.
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 70]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+Appendix B. Compatibility with Previous Versions
+
+ HTTP has been in use by the World-Wide Web global information
+ initiative since 1990. The first version of HTTP, later referred to
+ as HTTP/0.9, was a simple protocol for hypertext data transfer across
+ the Internet with only a single method and no metadata. HTTP/1.0, as
+ defined by [RFC1945], added a range of request methods and MIME-like
+ messaging that could include metadata about the data transferred and
+ modifiers on the request/response semantics. However, HTTP/1.0 did
+ not sufficiently take into consideration the effects of hierarchical
+ proxies, caching, the need for persistent connections, or name-based
+ virtual hosts. The proliferation of incompletely-implemented
+ applications calling themselves "HTTP/1.0" further necessitated a
+ protocol version change in order for two communicating applications
+ to determine each other's true capabilities.
+
+ HTTP/1.1 remains compatible with HTTP/1.0 by including more stringent
+ requirements that enable reliable implementations, adding only those
+ new features that will either be safely ignored by an HTTP/1.0
+ recipient or only sent when communicating with a party advertising
+ compliance with HTTP/1.1.
+
+ It is beyond the scope of a protocol specification to mandate
+ compliance with previous versions. HTTP/1.1 was deliberately
+ designed, however, to make supporting previous versions easy. It is
+ worth noting that, at the time of composing this specification, we
+ would expect general-purpose HTTP/1.1 servers to:
+
+ o understand any valid request in the format of HTTP/1.0 and 1.1;
+
+ o respond appropriately with a message in the same major version
+ used by the client.
+
+ And we would expect HTTP/1.1 clients to:
+
+ o understand any valid response in the format of HTTP/1.0 or 1.1.
+
+ For most implementations of HTTP/1.0, each connection is established
+ by the client prior to the request and closed by the server after
+ sending the response. Some implementations implement the Keep-Alive
+ version of persistent connections described in Section 19.7.1 of
+ [RFC2068].
+
+B.1. Changes from HTTP/1.0
+
+ This section summarizes major differences between versions HTTP/1.0
+ and HTTP/1.1.
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 71]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+B.1.1. Changes to Simplify Multi-homed Web Servers and Conserve IP
+ Addresses
+
+ The requirements that clients and servers support the Host request-
+ header, report an error if the Host request-header (Section 9.4) is
+ missing from an HTTP/1.1 request, and accept absolute URIs
+ (Section 4.1.2) are among the most important changes defined by this
+ specification.
+
+ Older HTTP/1.0 clients assumed a one-to-one relationship of IP
+ addresses and servers; there was no other established mechanism for
+ distinguishing the intended server of a request than the IP address
+ to which that request was directed. The changes outlined above will
+ allow the Internet, once older HTTP clients are no longer common, to
+ support multiple Web sites from a single IP address, greatly
+ simplifying large operational Web servers, where allocation of many
+ IP addresses to a single host has created serious problems. The
+ Internet will also be able to recover the IP addresses that have been
+ allocated for the sole purpose of allowing special-purpose domain
+ names to be used in root-level HTTP URLs. Given the rate of growth
+ of the Web, and the number of servers already deployed, it is
+ extremely important that all implementations of HTTP (including
+ updates to existing HTTP/1.0 applications) correctly implement these
+ requirements:
+
+ o Both clients and servers MUST support the Host request-header.
+
+ o A client that sends an HTTP/1.1 request MUST send a Host header.
+
+ o Servers MUST report a 400 (Bad Request) error if an HTTP/1.1
+ request does not include a Host request-header.
+
+ o Servers MUST accept absolute URIs.
+
+B.2. Compatibility with HTTP/1.0 Persistent Connections
+
+ Some clients and servers might wish to be compatible with some
+ previous implementations of persistent connections in HTTP/1.0
+ clients and servers. Persistent connections in HTTP/1.0 are
+ explicitly negotiated as they are not the default behavior. HTTP/1.0
+ experimental implementations of persistent connections are faulty,
+ and the new facilities in HTTP/1.1 are designed to rectify these
+ problems. The problem was that some existing HTTP/1.0 clients might
+ send Keep-Alive to a proxy server that doesn't understand Connection,
+ which would then erroneously forward it to the next inbound server,
+ which would establish the Keep-Alive connection and result in a hung
+ HTTP/1.0 proxy waiting for the close on the response. The result is
+ that HTTP/1.0 clients must be prevented from using Keep-Alive when
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 72]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ talking to proxies.
+
+ However, talking to proxies is the most important use of persistent
+ connections, so that prohibition is clearly unacceptable. Therefore,
+ we need some other mechanism for indicating a persistent connection
+ is desired, which is safe to use even when talking to an old proxy
+ that ignores Connection. Persistent connections are the default for
+ HTTP/1.1 messages; we introduce a new keyword (Connection: close) for
+ declaring non-persistence. See Section 9.1.
+
+ The original HTTP/1.0 form of persistent connections (the Connection:
+ Keep-Alive and Keep-Alive header) is documented in Section 19.7.1 of
+ [RFC2068].
+
+B.3. Changes from RFC 2616
+
+ Empty list elements in list productions have been deprecated.
+ (Section 1.2.1)
+
+ Rules about implicit linear whitespace between certain grammar
+ productions have been removed; now it's only allowed when
+ specifically pointed out in the ABNF. The NUL character is no longer
+ allowed in comment and quoted-string text. The quoted-pair rule no
+ longer allows escaping control characters other than HTAB. Non-ASCII
+ content in header fields and reason phrase has been obsoleted and
+ made opaque (the TEXT rule was removed) (Section 1.2.2)
+
+ Clarify that HTTP-Version is case sensitive. (Section 2.5)
+
+ Remove reference to non-existent identity transfer-coding value
+ tokens. (Sections 6.2 and 3.3)
+
+ Require that invalid whitespace around field-names be rejected.
+ (Section 3.2)
+
+ Update use of abs_path production from RFC1808 to the path-absolute +
+ query components of RFC3986. (Section 4.1.2)
+
+ Clarification that the chunk length does not include the count of the
+ octets in the chunk header and trailer. Furthermore disallowed line
+ folding in chunk extensions. (Section 6.2.1)
+
+ Remove hard limit of two connections per server. (Section 7.1.4)
+
+ Clarify exactly when close connection options must be sent.
+ (Section 9.1)
+
+Appendix C. Collected ABNF
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 73]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ BWS = OWS
+
+ Cache-Control = <Cache-Control, defined in [Part6], Section 3.4>
+ Chunked-Body = *chunk last-chunk trailer-part CRLF
+ Connection = "Connection:" OWS Connection-v
+ Connection-v = *( "," OWS ) connection-token *( OWS "," [ OWS
+ connection-token ] )
+ Content-Length = "Content-Length:" OWS 1*Content-Length-v
+ Content-Length-v = 1*DIGIT
+
+ Date = "Date:" OWS Date-v
+ Date-v = HTTP-date
+
+ GMT = %x47.4D.54 ; GMT
+
+ HTTP-Prot-Name = %x48.54.54.50 ; HTTP
+ HTTP-Version = HTTP-Prot-Name "/" 1*DIGIT "." 1*DIGIT
+ HTTP-date = rfc1123-date / obs-date
+ HTTP-message = start-line *( header-field CRLF ) CRLF [ message-body
+ ]
+ Host = "Host:" OWS Host-v
+ Host-v = uri-host [ ":" port ]
+
+ MIME-Version = <MIME-Version, defined in [Part3], Appendix A.1>
+ Method = token
+
+ OWS = *( [ obs-fold ] WSP )
+
+ Pragma = <Pragma, defined in [Part6], Section 3.4>
+
+ RWS = 1*( [ obs-fold ] WSP )
+ Reason-Phrase = *( WSP / VCHAR / obs-text )
+ Request = Request-Line *( header-field CRLF ) CRLF [ message-body ]
+ Request-Line = Method SP request-target SP HTTP-Version CRLF
+ Response = Status-Line *( header-field CRLF ) CRLF [ message-body ]
+
+ Status-Code = 3DIGIT
+ Status-Line = HTTP-Version SP Status-Code SP Reason-Phrase CRLF
+
+ TE = "TE:" OWS TE-v
+ TE-v = [ ( "," / t-codings ) *( OWS "," [ OWS t-codings ] ) ]
+ Trailer = "Trailer:" OWS Trailer-v
+ Trailer-v = *( "," OWS ) field-name *( OWS "," [ OWS field-name ] )
+ Transfer-Encoding = "Transfer-Encoding:" OWS Transfer-Encoding-v
+ Transfer-Encoding-v = *( "," OWS ) transfer-coding *( OWS "," [ OWS
+ transfer-coding ] )
+
+ URI-reference = <URI-reference, defined in [RFC3986], Section 4.1>
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 74]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ Upgrade = "Upgrade:" OWS Upgrade-v
+ Upgrade-v = *( "," OWS ) product *( OWS "," [ OWS product ] )
+
+ Via = "Via:" OWS Via-v
+ Via-v = *( "," OWS ) received-protocol RWS received-by [ RWS comment
+ ] *( OWS "," [ OWS received-protocol RWS received-by [ RWS comment ]
+ ] )
+
+ Warning = <Warning, defined in [Part6], Section 3.6>
+
+ absolute-URI = <absolute-URI, defined in [RFC3986], Section 4.3>
+ asctime-date = day-name SP date3 SP time-of-day SP year
+ attribute = token
+ authority = <authority, defined in [RFC3986], Section 3.2>
+
+ chunk = chunk-size *WSP [ chunk-ext ] CRLF chunk-data CRLF
+ chunk-data = 1*OCTET
+ chunk-ext = *( ";" *WSP chunk-ext-name [ "=" chunk-ext-val ] *WSP )
+ chunk-ext-name = token
+ chunk-ext-val = token / quoted-str-nf
+ chunk-size = 1*HEXDIG
+ comment = "(" *( ctext / quoted-cpair / comment ) ")"
+ connection-token = token
+ ctext = OWS / %x21-27 ; '!'-'''
+ / %x2A-5B ; '*'-'['
+ / %x5D-7E ; ']'-'~'
+ / obs-text
+
+ date1 = day SP month SP year
+ date2 = day "-" month "-" 2DIGIT
+ date3 = month SP ( 2DIGIT / ( SP DIGIT ) )
+ day = 2DIGIT
+ day-name = %x4D.6F.6E ; Mon
+ / %x54.75.65 ; Tue
+ / %x57.65.64 ; Wed
+ / %x54.68.75 ; Thu
+ / %x46.72.69 ; Fri
+ / %x53.61.74 ; Sat
+ / %x53.75.6E ; Sun
+ day-name-l = %x4D.6F.6E.64.61.79 ; Monday
+ / %x54.75.65.73.64.61.79 ; Tuesday
+ / %x57.65.64.6E.65.73.64.61.79 ; Wednesday
+ / %x54.68.75.72.73.64.61.79 ; Thursday
+ / %x46.72.69.64.61.79 ; Friday
+ / %x53.61.74.75.72.64.61.79 ; Saturday
+ / %x53.75.6E.64.61.79 ; Sunday
+
+ field-content = *( WSP / VCHAR / obs-text )
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 75]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ field-name = token
+ field-value = *( field-content / OWS )
+
+ general-header = Cache-Control / Connection / Date / Pragma / Trailer
+ / Transfer-Encoding / Upgrade / Via / Warning / MIME-Version
+
+ header-field = field-name ":" OWS [ field-value ] OWS
+ hour = 2DIGIT
+ http-URI = "http://" authority path-abempty [ "?" query ]
+ https-URI = "https://" authority path-abempty [ "?" query ]
+
+ last-chunk = 1*"0" *WSP [ chunk-ext ] CRLF
+
+ message-body = *OCTET
+ minute = 2DIGIT
+ month = %x4A.61.6E ; Jan
+ / %x46.65.62 ; Feb
+ / %x4D.61.72 ; Mar
+ / %x41.70.72 ; Apr
+ / %x4D.61.79 ; May
+ / %x4A.75.6E ; Jun
+ / %x4A.75.6C ; Jul
+ / %x41.75.67 ; Aug
+ / %x53.65.70 ; Sep
+ / %x4F.63.74 ; Oct
+ / %x4E.6F.76 ; Nov
+ / %x44.65.63 ; Dec
+
+ obs-date = rfc850-date / asctime-date
+ obs-fold = CRLF
+ obs-text = %x80-FF
+
+ partial-URI = relative-part [ "?" query ]
+ path-abempty = <path-abempty, defined in [RFC3986], Section 3.3>
+ path-absolute = <path-absolute, defined in [RFC3986], Section 3.3>
+ port = <port, defined in [RFC3986], Section 3.2.3>
+ product = token [ "/" product-version ]
+ product-version = token
+ protocol-name = token
+ protocol-version = token
+ pseudonym = token
+
+ qdtext = OWS / "!" / %x23-5B ; '#'-'['
+ / %x5D-7E ; ']'-'~'
+ / obs-text
+ qdtext-nf = WSP / "!" / %x23-5B ; '#'-'['
+ / %x5D-7E ; ']'-'~'
+ / obs-text
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 76]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ query = <query, defined in [RFC3986], Section 3.4>
+ quoted-cpair = "\" ( WSP / VCHAR / obs-text )
+ quoted-pair = "\" ( WSP / VCHAR / obs-text )
+ quoted-str-nf = DQUOTE *( qdtext-nf / quoted-pair ) DQUOTE
+ quoted-string = DQUOTE *( qdtext / quoted-pair ) DQUOTE
+ qvalue = ( "0" [ "." *3DIGIT ] ) / ( "1" [ "." *3"0" ] )
+
+ received-by = ( uri-host [ ":" port ] ) / pseudonym
+ received-protocol = [ protocol-name "/" ] protocol-version
+ relative-part = <relative-part, defined in [RFC3986], Section 4.2>
+ request-header = <request-header, defined in [Part2], Section 3>
+ request-target = "*" / absolute-URI / ( path-absolute [ "?" query ] )
+ / authority
+ response-header = <response-header, defined in [Part2], Section 5>
+ rfc1123-date = day-name "," SP date1 SP time-of-day SP GMT
+ rfc850-date = day-name-l "," SP date2 SP time-of-day SP GMT
+
+ second = 2DIGIT
+ special = "(" / ")" / "<" / ">" / "@" / "," / ";" / ":" / "\" /
+ DQUOTE / "/" / "[" / "]" / "?" / "=" / "{" / "}"
+ start-line = Request-Line / Status-Line
+
+ t-codings = "trailers" / ( transfer-extension [ te-params ] )
+ tchar = "!" / "#" / "$" / "%" / "&" / "'" / "*" / "+" / "-" / "." /
+ "^" / "_" / "`" / "|" / "~" / DIGIT / ALPHA
+ te-ext = OWS ";" OWS token [ "=" word ]
+ te-params = OWS ";" OWS "q=" qvalue *te-ext
+ time-of-day = hour ":" minute ":" second
+ token = 1*tchar
+ trailer-part = *( header-field CRLF )
+ transfer-coding = "chunked" / "compress" / "deflate" / "gzip" /
+ transfer-extension
+ transfer-extension = token *( OWS ";" OWS transfer-parameter )
+ transfer-parameter = attribute BWS "=" BWS value
+
+ uri-host = <host, defined in [RFC3986], Section 3.2.2>
+
+ value = word
+
+ word = token / quoted-string
+
+ year = 4DIGIT
+
+
+
+
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 77]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ ABNF diagnostics:
+
+ ; Chunked-Body defined but not used
+ ; Content-Length defined but not used
+ ; HTTP-message defined but not used
+ ; Host defined but not used
+ ; Request defined but not used
+ ; Response defined but not used
+ ; TE defined but not used
+ ; URI-reference defined but not used
+ ; general-header defined but not used
+ ; http-URI defined but not used
+ ; https-URI defined but not used
+ ; partial-URI defined but not used
+ ; request-header defined but not used
+ ; response-header defined but not used
+ ; special defined but not used
+
+Appendix D. Change Log (to be removed by RFC Editor before publication)
+
+D.1. Since RFC2616
+
+ Extracted relevant partitions from [RFC2616].
+
+D.2. Since draft-ietf-httpbis-p1-messaging-00
+
+ Closed issues:
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/1>: "HTTP Version
+ should be case sensitive"
+ (<http://purl.org/NET/http-errata#verscase>)
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/2>: "'unsafe'
+ characters" (<http://purl.org/NET/http-errata#unsafe-uri>)
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/3>: "Chunk Size
+ Definition" (<http://purl.org/NET/http-errata#chunk-size>)
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/4>: "Message Length"
+ (<http://purl.org/NET/http-errata#msg-len-chars>)
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/8>: "Media Type
+ Registrations" (<http://purl.org/NET/http-errata#media-reg>)
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/11>: "URI includes
+ query" (<http://purl.org/NET/http-errata#uriquery>)
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 78]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/15>: "No close on
+ 1xx responses" (<http://purl.org/NET/http-errata#noclose1xx>)
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/16>: "Remove
+ 'identity' token references"
+ (<http://purl.org/NET/http-errata#identity>)
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/26>: "Import query
+ BNF"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/31>: "qdtext BNF"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/35>: "Normative and
+ Informative references"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/42>: "RFC2606
+ Compliance"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/45>: "RFC977
+ reference"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/46>: "RFC1700
+ references"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/47>: "inconsistency
+ in date format explanation"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/48>: "Date reference
+ typo"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/65>: "Informative
+ references"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/66>: "ISO-8859-1
+ Reference"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/86>: "Normative up-
+ to-date references"
+
+ Other changes:
+
+ o Update media type registrations to use RFC4288 template.
+
+ o Use names of RFC4234 core rules DQUOTE and WSP, fix broken ABNF
+ for chunk-data (work in progress on
+ <http://tools.ietf.org/wg/httpbis/trac/ticket/36>)
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 79]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+D.3. Since draft-ietf-httpbis-p1-messaging-01
+
+ Closed issues:
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/19>: "Bodies on GET
+ (and other) requests"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/55>: "Updating to
+ RFC4288"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/57>: "Status Code
+ and Reason Phrase"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/82>: "rel_path not
+ used"
+
+ Ongoing work on ABNF conversion
+ (<http://tools.ietf.org/wg/httpbis/trac/ticket/36>):
+
+ o Get rid of duplicate BNF rule names ("host" -> "uri-host",
+ "trailer" -> "trailer-part").
+
+ o Avoid underscore character in rule names ("http_URL" -> "http-
+ URL", "abs_path" -> "path-absolute").
+
+ o Add rules for terms imported from URI spec ("absoluteURI",
+ "authority", "path-absolute", "port", "query", "relativeURI",
+ "host) -- these will have to be updated when switching over to
+ RFC3986.
+
+ o Synchronize core rules with RFC5234.
+
+ o Get rid of prose rules that span multiple lines.
+
+ o Get rid of unused rules LOALPHA and UPALPHA.
+
+ o Move "Product Tokens" section (back) into Part 1, as "token" is
+ used in the definition of the Upgrade header.
+
+ o Add explicit references to BNF syntax and rules imported from
+ other parts of the specification.
+
+ o Rewrite prose rule "token" in terms of "tchar", rewrite prose rule
+ "TEXT".
+
+
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 80]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+D.4. Since draft-ietf-httpbis-p1-messaging-02
+
+ Closed issues:
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/51>: "HTTP-date vs.
+ rfc1123-date"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/64>: "WS in quoted-
+ pair"
+
+ Ongoing work on IANA Message Header Registration
+ (<http://tools.ietf.org/wg/httpbis/trac/ticket/40>):
+
+ o Reference RFC 3984, and update header registrations for headers
+ defined in this document.
+
+ Ongoing work on ABNF conversion
+ (<http://tools.ietf.org/wg/httpbis/trac/ticket/36>):
+
+ o Replace string literals when the string really is case-sensitive
+ (HTTP-Version).
+
+D.5. Since draft-ietf-httpbis-p1-messaging-03
+
+ Closed issues:
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/28>: "Connection
+ closing"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/97>: "Move
+ registrations and registry information to IANA Considerations"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/120>: "need new URL
+ for PAD1995 reference"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/127>: "IANA
+ Considerations: update HTTP URI scheme registration"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/128>: "Cite HTTPS
+ URI scheme definition"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/129>: "List-type
+ headers vs Set-Cookie"
+
+ Ongoing work on ABNF conversion
+ (<http://tools.ietf.org/wg/httpbis/trac/ticket/36>):
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 81]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ o Replace string literals when the string really is case-sensitive
+ (HTTP-Date).
+
+ o Replace HEX by HEXDIG for future consistence with RFC 5234's core
+ rules.
+
+D.6. Since draft-ietf-httpbis-p1-messaging-04
+
+ Closed issues:
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/34>: "Out-of-date
+ reference for URIs"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/132>: "RFC 2822 is
+ updated by RFC 5322"
+
+ Ongoing work on ABNF conversion
+ (<http://tools.ietf.org/wg/httpbis/trac/ticket/36>):
+
+ o Use "/" instead of "|" for alternatives.
+
+ o Get rid of RFC822 dependency; use RFC5234 plus extensions instead.
+
+ o Only reference RFC 5234's core rules.
+
+ o Introduce new ABNF rules for "bad" whitespace ("BWS"), optional
+ whitespace ("OWS") and required whitespace ("RWS").
+
+ o Rewrite ABNFs to spell out whitespace rules, factor out header
+ value format definitions.
+
+D.7. Since draft-ietf-httpbis-p1-messaging-05
+
+ Closed issues:
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/30>: "Header LWS"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/52>: "Sort 1.3
+ Terminology"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/63>: "RFC2047
+ encoded words"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/74>: "Character
+ Encodings in TEXT"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/77>: "Line Folding"
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 82]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/83>: "OPTIONS * and
+ proxies"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/94>: "Reason-Phrase
+ BNF"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/111>: "Use of TEXT"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/118>: "Join
+ "Differences Between HTTP Entities and RFC 2045 Entities"?"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/134>: "RFC822
+ reference left in discussion of date formats"
+
+ Final work on ABNF conversion
+ (<http://tools.ietf.org/wg/httpbis/trac/ticket/36>):
+
+ o Rewrite definition of list rules, deprecate empty list elements.
+
+ o Add appendix containing collected and expanded ABNF.
+
+ Other changes:
+
+ o Rewrite introduction; add mostly new Architecture Section.
+
+ o Move definition of quality values from Part 3 into Part 1; make TE
+ request header grammar independent of accept-params (defined in
+ Part 3).
+
+D.8. Since draft-ietf-httpbis-p1-messaging-06
+
+ Closed issues:
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/161>: "base for
+ numeric protocol elements"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/162>: "comment ABNF"
+
+ Partly resolved issues:
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/88>: "205 Bodies"
+ (took out language that implied that there might be methods for
+ which a request body MUST NOT be included)
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/163>: "editorial
+ improvements around HTTP-date"
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 83]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+D.9. Since draft-ietf-httpbis-p1-messaging-07
+
+ Closed issues:
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/93>: "Repeating
+ single-value headers"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/131>: "increase
+ connection limit"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/157>: "IP addresses
+ in URLs"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/172>: "take over
+ HTTP Upgrade Token Registry"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/173>: "CR and LF in
+ chunk extension values"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/184>: "HTTP/0.9
+ support"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/188>: "pick IANA
+ policy (RFC5226) for Transfer Coding / Content Coding"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/189>: "move
+ definitions of gzip/deflate/compress to part 1"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/194>: "disallow
+ control characters in quoted-pair"
+
+ Partly resolved issues:
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/148>: "update IANA
+ requirements wrt Transfer-Coding values" (add the IANA
+ Considerations subsection)
+
+D.10. Since draft-ietf-httpbis-p1-messaging-08
+
+ Closed issues:
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/201>: "header
+ parsing, treatment of leading and trailing OWS"
+
+ Partly resolved issues:
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/60>: "Placement of
+ 13.5.1 and 13.5.2"
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 84]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/200>: "use of term
+ "word" when talking about header structure"
+
+D.11. Since draft-ietf-httpbis-p1-messaging-09
+
+ Closed issues:
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/73>: "Clarification
+ of the term 'deflate'"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/83>: "OPTIONS * and
+ proxies"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/122>: "MIME-Version
+ not listed in P1, general header fields"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/143>: "IANA registry
+ for content/transfer encodings"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/165>: "Case-
+ sensitivity of HTTP-date"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/200>: "use of term
+ "word" when talking about header structure"
+
+ Partly resolved issues:
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/196>: "Term for the
+ requested resource's URI"
+
+D.12. Since draft-ietf-httpbis-p1-messaging-10
+
+ Closed issues:
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/28>: "Connection
+ Closing"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/90>: "Delimiting
+ messages with multipart/byteranges"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/95>: "Handling
+ multiple Content-Length headers"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/109>: "Clarify
+ entity / representation / variant terminology"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/220>: "consider
+ removing the 'changes from 2068' sections"
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 85]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ Partly resolved issues:
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/159>: "HTTP(s) URI
+ scheme definitions"
+
+Index
+
+ A
+ application/http Media Type 61
+
+ B
+ browser 10
+
+ C
+ cache 13
+ cacheable 14
+ chunked (Coding Format) 35
+ client 10
+ Coding Format
+ chunked 35
+ compress 38
+ deflate 38
+ gzip 38
+ compress (Coding Format) 38
+ connection 10
+ Connection header 49
+ Content-Length header 50
+
+ D
+ Date header 51
+ deflate (Coding Format) 38
+ downstream 12
+
+ E
+ effective request URI 29
+
+ G
+ gateway 13
+ Grammar
+ absolute-URI 16
+ ALPHA 7
+ asctime-date 34
+ attribute 34
+ authority 16
+ BWS 9
+ chunk 35
+ chunk-data 35
+ chunk-ext 35
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 86]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ chunk-ext-name 35
+ chunk-ext-val 35
+ chunk-size 35
+ Chunked-Body 35
+ comment 22
+ Connection 49
+ connection-token 49
+ Connection-v 49
+ Content-Length 50
+ Content-Length-v 50
+ CR 7
+ CRLF 7
+ ctext 22
+ CTL 7
+ Date 51
+ Date-v 51
+ date1 33
+ date2 34
+ date3 34
+ day 33
+ day-name 33
+ day-name-l 33
+ DIGIT 7
+ DQUOTE 7
+ extension-code 32
+ extension-method 26
+ field-content 20
+ field-name 20
+ field-value 20
+ general-header 26
+ GMT 33
+ header-field 20
+ HEXDIG 7
+ Host 52
+ Host-v 52
+ hour 33
+ HTTP-date 32
+ HTTP-message 19
+ HTTP-Prot-Name 15
+ http-URI 16
+ HTTP-Version 15
+ https-URI 18
+ last-chunk 35
+ LF 7
+ message-body 22
+ Method 26
+ minute 33
+ month 33
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 87]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ obs-date 33
+ obs-text 10
+ OCTET 7
+ OWS 9
+ path-absolute 16
+ port 16
+ product 39
+ product-version 39
+ protocol-name 57
+ protocol-version 57
+ pseudonym 57
+ qdtext 10
+ qdtext-nf 35
+ query 16
+ quoted-cpair 22
+ quoted-pair 10
+ quoted-str-nf 35
+ quoted-string 10
+ qvalue 39
+ Reason-Phrase 32
+ received-by 57
+ received-protocol 57
+ Request 26
+ Request-Line 26
+ request-target 27
+ Response 31
+ rfc850-date 34
+ rfc1123-date 33
+ RWS 9
+ second 33
+ SP 7
+ special 9
+ Status-Code 32
+ Status-Line 31
+ t-codings 53
+ tchar 9
+ TE 53
+ te-ext 53
+ te-params 53
+ TE-v 53
+ time-of-day 33
+ token 9
+ Trailer 54
+ trailer-part 35
+ Trailer-v 54
+ transfer-coding 34
+ Transfer-Encoding 55
+ Transfer-Encoding-v 55
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 88]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ transfer-extension 34
+ transfer-parameter 34
+ Upgrade 55
+ Upgrade-v 55
+ uri-host 16
+ URI-reference 16
+ value 34
+ VCHAR 7
+ Via 57
+ Via-v 57
+ word 9
+ WSP 7
+ year 33
+ gzip (Coding Format) 38
+
+ H
+ header field 19
+ header section 19
+ Headers
+ Connection 49
+ Content-Length 50
+ Date 51
+ Host 52
+ TE 53
+ Trailer 54
+ Transfer-Encoding 55
+ Upgrade 55
+ Via 57
+ headers 19
+ Host header 52
+ http URI scheme 16
+ https URI scheme 18
+
+ I
+ inbound 12
+ intermediary 12
+
+ M
+ Media Type
+ application/http 61
+ message/http 59
+ message 11
+ message/http Media Type 59
+
+ O
+ origin server 10
+ outbound 12
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 89]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ P
+ proxy 12
+
+ R
+ request 11
+ resource 16
+ response 11
+ reverse proxy 13
+
+ S
+ server 10
+ spider 10
+
+ T
+ target resource 29
+ TE header 53
+ Trailer header 54
+ Transfer-Encoding header 55
+ tunnel 13
+
+ U
+ Upgrade header 55
+ upstream 12
+ URI scheme
+ http 16
+ https 18
+ user agent 10
+
+ V
+ Via header 57
+
+Authors' Addresses
+
+ Roy T. Fielding (editor)
+ Day Software
+ 23 Corporate Plaza DR, Suite 280
+ Newport Beach, CA 92660
+ USA
+
+ Phone: +1-949-706-5300
+ Fax: +1-949-706-5305
+ EMail: fielding@gbiv.com
+ URI: http://roy.gbiv.com/
+
+
+
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 90]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ Jim Gettys
+ Alcatel-Lucent Bell Labs
+ 21 Oak Knoll Road
+ Carlisle, MA 01741
+ USA
+
+ EMail: jg@freedesktop.org
+ URI: http://gettys.wordpress.com/
+
+
+ Jeffrey C. Mogul
+ Hewlett-Packard Company
+ HP Labs, Large Scale Systems Group
+ 1501 Page Mill Road, MS 1177
+ Palo Alto, CA 94304
+ USA
+
+ EMail: JeffMogul@acm.org
+
+
+ Henrik Frystyk Nielsen
+ Microsoft Corporation
+ 1 Microsoft Way
+ Redmond, WA 98052
+ USA
+
+ EMail: henrikn@microsoft.com
+
+
+ Larry Masinter
+ Adobe Systems, Incorporated
+ 345 Park Ave
+ San Jose, CA 95110
+ USA
+
+ EMail: LMM@acm.org
+ URI: http://larry.masinter.net/
+
+
+ Paul J. Leach
+ Microsoft Corporation
+ 1 Microsoft Way
+ Redmond, WA 98052
+
+ EMail: paulle@microsoft.com
+
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 91]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ Tim Berners-Lee
+ World Wide Web Consortium
+ MIT Computer Science and Artificial Intelligence Laboratory
+ The Stata Center, Building 32
+ 32 Vassar Street
+ Cambridge, MA 02139
+ USA
+
+ EMail: timbl@w3.org
+ URI: http://www.w3.org/People/Berners-Lee/
+
+
+ Yves Lafon (editor)
+ World Wide Web Consortium
+ W3C / ERCIM
+ 2004, rte des Lucioles
+ Sophia-Antipolis, AM 06902
+ France
+
+ EMail: ylafon@w3.org
+ URI: http://www.raubacapeu.net/people/yves/
+
+
+ Julian F. Reschke (editor)
+ greenbytes GmbH
+ Hafenweg 16
+ Muenster, NW 48155
+ Germany
+
+ Phone: +49 251 2807760
+ Fax: +49 251 2807761
+ EMail: julian.reschke@greenbytes.de
+ URI: http://greenbytes.de/tech/webdav/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 92]
+
diff --git a/vendor/sabre/dav/docs/draft-ietf-httpbis-p4-conditional-11.txt b/vendor/sabre/dav/docs/draft-ietf-httpbis-p4-conditional-11.txt
new file mode 100644
index 000000000..2dd1b7fc2
--- /dev/null
+++ b/vendor/sabre/dav/docs/draft-ietf-httpbis-p4-conditional-11.txt
@@ -0,0 +1,1512 @@
+
+
+
+HTTPbis Working Group R. Fielding, Ed.
+Internet-Draft Day Software
+Obsoletes: 2616 (if approved) J. Gettys
+Intended status: Standards Track Alcatel-Lucent
+Expires: February 5, 2011 J. Mogul
+ HP
+ H. Frystyk
+ Microsoft
+ L. Masinter
+ Adobe Systems
+ P. Leach
+ Microsoft
+ T. Berners-Lee
+ W3C/MIT
+ Y. Lafon, Ed.
+ W3C
+ J. Reschke, Ed.
+ greenbytes
+ August 4, 2010
+
+
+ HTTP/1.1, part 4: Conditional Requests
+ draft-ietf-httpbis-p4-conditional-11
+
+Abstract
+
+ The Hypertext Transfer Protocol (HTTP) is an application-level
+ protocol for distributed, collaborative, hypermedia information
+ systems. HTTP has been in use by the World Wide Web global
+ information initiative since 1990. This document is Part 4 of the
+ seven-part specification that defines the protocol referred to as
+ "HTTP/1.1" and, taken together, obsoletes RFC 2616. Part 4 defines
+ request header fields for indicating conditional requests and the
+ rules for constructing responses to those requests.
+
+Editorial Note (To be removed by RFC Editor)
+
+ Discussion of this draft should take place on the HTTPBIS working
+ group mailing list (ietf-http-wg@w3.org). The current issues list is
+ at <http://tools.ietf.org/wg/httpbis/trac/report/3> and related
+ documents (including fancy diffs) can be found at
+ <http://tools.ietf.org/wg/httpbis/>.
+
+ The changes in this draft are summarized in Appendix C.12.
+
+Status of This Memo
+
+ This Internet-Draft is submitted in full conformance with the
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 1]
+
+Internet-Draft HTTP/1.1, Part 4 August 2010
+
+
+ provisions of BCP 78 and BCP 79.
+
+ Internet-Drafts are working documents of the Internet Engineering
+ Task Force (IETF). Note that other groups may also distribute
+ working documents as Internet-Drafts. The list of current Internet-
+ Drafts is at http://datatracker.ietf.org/drafts/current/.
+
+ Internet-Drafts are draft documents valid for a maximum of six months
+ and may be updated, replaced, or obsoleted by other documents at any
+ time. It is inappropriate to use Internet-Drafts as reference
+ material or to cite them other than as "work in progress."
+
+ This Internet-Draft will expire on February 5, 2011.
+
+Copyright Notice
+
+ Copyright (c) 2010 IETF Trust and the persons identified as the
+ document authors. All rights reserved.
+
+ This document is subject to BCP 78 and the IETF Trust's Legal
+ Provisions Relating to IETF Documents
+ (http://trustee.ietf.org/license-info) in effect on the date of
+ publication of this document. Please review these documents
+ carefully, as they describe your rights and restrictions with respect
+ to this document. Code Components extracted from this document must
+ include Simplified BSD License text as described in Section 4.e of
+ the Trust Legal Provisions and are provided without warranty as
+ described in the Simplified BSD License.
+
+ This document may contain material from IETF Documents or IETF
+ Contributions published or made publicly available before November
+ 10, 2008. The person(s) controlling the copyright in some of this
+ material may not have granted the IETF Trust the right to allow
+ modifications of such material outside the IETF Standards Process.
+ Without obtaining an adequate license from the person(s) controlling
+ the copyright in such materials, this document may not be modified
+ outside the IETF Standards Process, and derivative works of it may
+ not be created outside the IETF Standards Process, except to format
+ it for publication as an RFC or to translate it into languages other
+ than English.
+
+
+
+
+
+
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 2]
+
+Internet-Draft HTTP/1.1, Part 4 August 2010
+
+
+Table of Contents
+
+ 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 4
+ 1.1. Requirements . . . . . . . . . . . . . . . . . . . . . . . 4
+ 1.2. Syntax Notation . . . . . . . . . . . . . . . . . . . . . 4
+ 1.2.1. Core Rules . . . . . . . . . . . . . . . . . . . . . . 5
+ 1.2.2. ABNF Rules defined in other Parts of the
+ Specification . . . . . . . . . . . . . . . . . . . . 5
+ 2. Entity-Tags . . . . . . . . . . . . . . . . . . . . . . . . . 5
+ 2.1. Example: Entity-tags varying on Content-Negotiated
+ Resources . . . . . . . . . . . . . . . . . . . . . . . . 6
+ 3. Status Code Definitions . . . . . . . . . . . . . . . . . . . 7
+ 3.1. 304 Not Modified . . . . . . . . . . . . . . . . . . . . . 7
+ 3.2. 412 Precondition Failed . . . . . . . . . . . . . . . . . 7
+ 4. Weak and Strong Validators . . . . . . . . . . . . . . . . . . 8
+ 5. Rules for When to Use Entity-tags and Last-Modified Dates . . 10
+ 6. Header Field Definitions . . . . . . . . . . . . . . . . . . . 12
+ 6.1. ETag . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
+ 6.2. If-Match . . . . . . . . . . . . . . . . . . . . . . . . . 13
+ 6.3. If-Modified-Since . . . . . . . . . . . . . . . . . . . . 14
+ 6.4. If-None-Match . . . . . . . . . . . . . . . . . . . . . . 16
+ 6.5. If-Unmodified-Since . . . . . . . . . . . . . . . . . . . 17
+ 6.6. Last-Modified . . . . . . . . . . . . . . . . . . . . . . 18
+ 7. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 18
+ 7.1. Status Code Registration . . . . . . . . . . . . . . . . . 19
+ 7.2. Header Field Registration . . . . . . . . . . . . . . . . 19
+ 8. Security Considerations . . . . . . . . . . . . . . . . . . . 19
+ 9. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 19
+ 10. References . . . . . . . . . . . . . . . . . . . . . . . . . . 19
+ 10.1. Normative References . . . . . . . . . . . . . . . . . . . 19
+ 10.2. Informative References . . . . . . . . . . . . . . . . . . 20
+ Appendix A. Changes from RFC 2616 . . . . . . . . . . . . . . . . 20
+ Appendix B. Collected ABNF . . . . . . . . . . . . . . . . . . . 21
+ Appendix C. Change Log (to be removed by RFC Editor before
+ publication) . . . . . . . . . . . . . . . . . . . . 21
+ C.1. Since RFC2616 . . . . . . . . . . . . . . . . . . . . . . 21
+ C.2. Since draft-ietf-httpbis-p4-conditional-00 . . . . . . . . 22
+ C.3. Since draft-ietf-httpbis-p4-conditional-01 . . . . . . . . 22
+ C.4. Since draft-ietf-httpbis-p4-conditional-02 . . . . . . . . 22
+ C.5. Since draft-ietf-httpbis-p4-conditional-03 . . . . . . . . 22
+ C.6. Since draft-ietf-httpbis-p4-conditional-04 . . . . . . . . 23
+ C.7. Since draft-ietf-httpbis-p4-conditional-05 . . . . . . . . 23
+ C.8. Since draft-ietf-httpbis-p4-conditional-06 . . . . . . . . 23
+ C.9. Since draft-ietf-httpbis-p4-conditional-07 . . . . . . . . 23
+ C.10. Since draft-ietf-httpbis-p4-conditional-08 . . . . . . . . 23
+ C.11. Since draft-ietf-httpbis-p4-conditional-09 . . . . . . . . 23
+ C.12. Since draft-ietf-httpbis-p4-conditional-10 . . . . . . . . 24
+ Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 3]
+
+Internet-Draft HTTP/1.1, Part 4 August 2010
+
+
+1. Introduction
+
+ This document defines HTTP/1.1 response metadata for indicating
+ potential changes to payload content, including modification time
+ stamps and opaque entity-tags, and the HTTP conditional request
+ mechanisms that allow preconditions to be placed on a request method.
+ Conditional GET requests allow for efficient cache updates. Other
+ conditional request methods are used to protect against overwriting
+ or misunderstanding the state of a resource that has been changed
+ unbeknownst to the requesting client.
+
+ This document is currently disorganized in order to minimize the
+ changes between drafts and enable reviewers to see the smaller errata
+ changes. The next draft will reorganize the sections to better
+ reflect the content. In particular, the sections on resource
+ metadata will be discussed first and then followed by each
+ conditional request-header, concluding with a definition of
+ precedence and the expectation of ordering strong validator checks
+ before weak validator checks. It is likely that more content from
+ [Part6] will migrate to this part, where appropriate. The current
+ mess reflects how widely dispersed these topics and associated
+ requirements had become in [RFC2616].
+
+1.1. Requirements
+
+ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
+ "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
+ document are to be interpreted as described in [RFC2119].
+
+ An implementation is not compliant if it fails to satisfy one or more
+ of the "MUST" or "REQUIRED" level requirements for the protocols it
+ implements. An implementation that satisfies all the "MUST" or
+ "REQUIRED" level and all the "SHOULD" level requirements for its
+ protocols is said to be "unconditionally compliant"; one that
+ satisfies all the "MUST" level requirements but not all the "SHOULD"
+ level requirements for its protocols is said to be "conditionally
+ compliant".
+
+1.2. Syntax Notation
+
+ This specification uses the ABNF syntax defined in Section 1.2 of
+ [Part1] (which extends the syntax defined in [RFC5234] with a list
+ rule). Appendix B shows the collected ABNF, with the list rule
+ expanded.
+
+ The following core rules are included by reference, as defined in
+ [RFC5234], Appendix B.1: ALPHA (letters), CR (carriage return), CRLF
+ (CR LF), CTL (controls), DIGIT (decimal 0-9), DQUOTE (double quote),
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 4]
+
+Internet-Draft HTTP/1.1, Part 4 August 2010
+
+
+ HEXDIG (hexadecimal 0-9/A-F/a-f), LF (line feed), OCTET (any 8-bit
+ sequence of data), SP (space), VCHAR (any visible USASCII character),
+ and WSP (whitespace).
+
+1.2.1. Core Rules
+
+ The core rules below are defined in Section 1.2.2 of [Part1]:
+
+ quoted-string = <quoted-string, defined in [Part1], Section 1.2.2>
+ OWS = <OWS, defined in [Part1], Section 1.2.2>
+
+1.2.2. ABNF Rules defined in other Parts of the Specification
+
+ The ABNF rules below are defined in other parts:
+
+ HTTP-date = <HTTP-date, defined in [Part1], Section 6.1>
+
+2. Entity-Tags
+
+ Entity-tags are used for comparing two or more representations of the
+ same resource. HTTP/1.1 uses entity-tags in the ETag (Section 6.1),
+ If-Match (Section 6.2), If-None-Match (Section 6.4), and If-Range
+ (Section 5.3 of [Part5]) header fields. The definition of how they
+ are used and compared as cache validators is in Section 4. An
+ entity-tag consists of an opaque quoted string, possibly prefixed by
+ a weakness indicator.
+
+ entity-tag = [ weak ] opaque-tag
+ weak = %x57.2F ; "W/", case-sensitive
+ opaque-tag = quoted-string
+
+ A "strong entity-tag" MAY be shared by two representations of a
+ resource only if they are equivalent by octet equality.
+
+ A "weak entity-tag", indicated by the "W/" prefix, MAY be shared by
+ two representations of a resource only if the representations are
+ equivalent and could be substituted for each other with no
+ significant change in semantics. A weak entity-tag can only be used
+ for weak comparison.
+
+ An entity-tag MUST be unique across all versions of all
+ representations associated with a particular resource. A given
+ entity-tag value MAY be used for representations obtained by requests
+ on different URIs. The use of the same entity-tag value in
+ conjunction with representations obtained by requests on different
+ URIs does not imply the equivalence of those representations.
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 5]
+
+Internet-Draft HTTP/1.1, Part 4 August 2010
+
+
+2.1. Example: Entity-tags varying on Content-Negotiated Resources
+
+ Consider a resource that is subject to content negotiation (Section 5
+ of [Part3]), and where the representations returned upon a GET
+ request vary based on the Accept-Encoding request header field
+ (Section 6.3 of [Part3]):
+
+ >> Request:
+
+ GET /index HTTP/1.1
+ Host: www.example.com
+ Accept-Encoding: gzip
+
+
+ In this case, the response might or might not use the gzip content
+ coding. If it does not, the response might look like:
+
+ >> Response:
+
+ HTTP/1.1 200 OK
+ Date: Thu, 26 Mar 2010 00:05:00 GMT
+ ETag: "123-a"
+ Content-Length: 70
+ Vary: Accept-Encoding
+ Content-Type: text/plain
+
+ Hello World!
+ Hello World!
+ Hello World!
+ Hello World!
+ Hello World!
+
+ An alternative representation that does use gzip content coding would
+ be:
+
+ >> Response:
+
+ HTTP/1.1 200 OK
+ Date: Thu, 26 Mar 2010 00:05:00 GMT
+ ETag: "123-b"
+ Content-Length: 43
+ Vary: Accept-Encoding
+ Content-Type: text/plain
+ Content-Encoding: gzip
+
+ ...binary data...
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 6]
+
+Internet-Draft HTTP/1.1, Part 4 August 2010
+
+
+ Note: Content codings are a property of the representation, so
+ therefore an entity-tag of an encoded representation must be
+ distinct from an unencoded representation to prevent conflicts
+ during cache updates and range requests. In contrast, transfer
+ codings (Section 6.2 of [Part1]) apply only during message
+ transfer and do not require distinct entity-tags.
+
+3. Status Code Definitions
+
+3.1. 304 Not Modified
+
+ If the client has performed a conditional GET request and access is
+ allowed, but the document has not been modified, the server SHOULD
+ respond with this status code. The 304 response MUST NOT contain a
+ message-body, and thus is always terminated by the first empty line
+ after the header fields.
+
+ A 304 response MUST include a Date header field (Section 9.3 of
+ [Part1]) unless its omission is required by Section 9.3.1 of [Part1].
+ If a 200 response to the same request would have included any of the
+ header fields Cache-Control, Content-Location, ETag, Expires, Last-
+ Modified, or Vary, then those same header fields MUST be sent in a
+ 304 response.
+
+ Since the goal of a 304 response is to minimize information transfer
+ when the recipient already has one or more cached representations,
+ the response SHOULD NOT include representation metadata other than
+ the above listed fields unless said metadata exists for the purpose
+ of guiding cache updates (e.g., future HTTP extensions).
+
+ If a 304 response includes an entity-tag that indicates a
+ representation not currently cached, then the recipient MUST NOT use
+ the 304 to update its own cache. If that conditional request
+ originated with an outbound client, such as a user agent with its own
+ cache sending a conditional GET to a shared proxy, then the 304
+ response MAY be forwarded to the outbound client. Otherwise,
+ disregard the response and repeat the request without the
+ conditional.
+
+ If a cache uses a received 304 response to update a cache entry, the
+ cache MUST update the entry to reflect any new field values given in
+ the response.
+
+3.2. 412 Precondition Failed
+
+ The precondition given in one or more of the request-header fields
+ evaluated to false when it was tested on the server. This response
+ code allows the client to place preconditions on the current resource
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 7]
+
+Internet-Draft HTTP/1.1, Part 4 August 2010
+
+
+ metadata (header field data) and thus prevent the requested method
+ from being applied to a resource other than the one intended.
+
+4. Weak and Strong Validators
+
+ Since both origin servers and caches will compare two validators to
+ decide if they represent the same or different representations, one
+ normally would expect that if the representation (including both
+ representation header fields and representation body) changes in any
+ way, then the associated validator would change as well. If this is
+ true, then we call this validator a "strong validator".
+
+ However, there might be cases when a server prefers to change the
+ validator only on semantically significant changes, and not when
+ insignificant aspects of the representation change. A validator that
+ does not always change when the representation changes is a "weak
+ validator".
+
+ An entity-tag is normally a strong validator, but the protocol
+ provides a mechanism to tag an entity-tag as "weak". One can think
+ of a strong validator as one that changes whenever the sequence of
+ bits in a representation changes, while a weak value changes whenever
+ the meaning of a representation changes. Alternatively, one can
+ think of a strong validator as part of an identifier for a specific
+ representation, whereas a weak validator is part of an identifier for
+ a set of semantically equivalent representations.
+
+ Note: One example of a strong validator is an integer that is
+ incremented in stable storage every time a representation is
+ changed.
+
+ A representation's modification time, if defined with only one-
+ second resolution, could be a weak validator, since it is possible
+ that the representation might be modified twice during a single
+ second.
+
+ Support for weak validators is optional. However, weak validators
+ allow for more efficient caching of equivalent objects; for
+ example, a hit counter on a site is probably good enough if it is
+ updated every few days or weeks, and any value during that period
+ is likely "good enough" to be equivalent.
+
+ A "use" of a validator is either when a client generates a request
+ and includes the validator in a validating header field, or when a
+ server compares two validators.
+
+ Strong validators are usable in any context. Weak validators are
+ only usable in contexts that do not depend on exact equality of a
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 8]
+
+Internet-Draft HTTP/1.1, Part 4 August 2010
+
+
+ representation. For example, either kind is usable for a normal
+ conditional GET. However, only a strong validator is usable for a
+ sub-range retrieval, since otherwise the client might end up with an
+ internally inconsistent representation.
+
+ Clients MUST NOT use weak validators in range requests ([Part5]).
+
+ The only function that HTTP/1.1 defines on validators is comparison.
+ There are two validator comparison functions, depending on whether
+ the comparison context allows the use of weak validators or not:
+
+ o The strong comparison function: in order to be considered equal,
+ both opaque-tags MUST be identical character-by-character, and
+ both MUST NOT be weak.
+
+ o The weak comparison function: in order to be considered equal,
+ both opaque-tags MUST be identical character-by-character, but
+ either or both of them MAY be tagged as "weak" without affecting
+ the result.
+
+ The example below shows the results for a set of entity-tag pairs,
+ and both the weak and strong comparison function results:
+
+ +--------+--------+-------------------+-----------------+
+ | ETag 1 | ETag 2 | Strong Comparison | Weak Comparison |
+ +--------+--------+-------------------+-----------------+
+ | W/"1" | W/"1" | no match | match |
+ | W/"1" | W/"2" | no match | no match |
+ | W/"1" | "1" | no match | match |
+ | "1" | "1" | match | match |
+ +--------+--------+-------------------+-----------------+
+
+ An entity-tag is strong unless it is explicitly tagged as weak.
+ Section 2 gives the syntax for entity-tags.
+
+ A Last-Modified time, when used as a validator in a request, is
+ implicitly weak unless it is possible to deduce that it is strong,
+ using the following rules:
+
+ o The validator is being compared by an origin server to the actual
+ current validator for the representation and,
+
+ o That origin server reliably knows that the associated
+ representation did not change twice during the second covered by
+ the presented validator.
+
+ or
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 9]
+
+Internet-Draft HTTP/1.1, Part 4 August 2010
+
+
+ o The validator is about to be used by a client in an If-Modified-
+ Since or If-Unmodified-Since header, because the client has a
+ cache entry for the associated representation, and
+
+ o That cache entry includes a Date value, which gives the time when
+ the origin server sent the original response, and
+
+ o The presented Last-Modified time is at least 60 seconds before the
+ Date value.
+
+ or
+
+ o The validator is being compared by an intermediate cache to the
+ validator stored in its cache entry for the representation, and
+
+ o That cache entry includes a Date value, which gives the time when
+ the origin server sent the original response, and
+
+ o The presented Last-Modified time is at least 60 seconds before the
+ Date value.
+
+ This method relies on the fact that if two different responses were
+ sent by the origin server during the same second, but both had the
+ same Last-Modified time, then at least one of those responses would
+ have a Date value equal to its Last-Modified time. The arbitrary 60-
+ second limit guards against the possibility that the Date and Last-
+ Modified values are generated from different clocks, or at somewhat
+ different times during the preparation of the response. An
+ implementation MAY use a value larger than 60 seconds, if it is
+ believed that 60 seconds is too short.
+
+ If a client wishes to perform a sub-range retrieval on a value for
+ which it has only a Last-Modified time and no opaque validator, it
+ MAY do this only if the Last-Modified time is strong in the sense
+ described here.
+
+ A cache or origin server receiving a conditional range request
+ ([Part5]) MUST use the strong comparison function to evaluate the
+ condition.
+
+ These rules allow HTTP/1.1 caches and clients to safely perform sub-
+ range retrievals on values that have been obtained from HTTP/1.0
+ servers.
+
+5. Rules for When to Use Entity-tags and Last-Modified Dates
+
+ We adopt a set of rules and recommendations for origin servers,
+ clients, and caches regarding when various validator types ought to
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 10]
+
+Internet-Draft HTTP/1.1, Part 4 August 2010
+
+
+ be used, and for what purposes.
+
+ HTTP/1.1 origin servers:
+
+ o SHOULD send an entity-tag validator unless it is not feasible to
+ generate one.
+
+ o MAY send a weak entity-tag instead of a strong entity-tag, if
+ performance considerations support the use of weak entity-tags, or
+ if it is unfeasible to send a strong entity-tag.
+
+ o SHOULD send a Last-Modified value if it is feasible to send one,
+ unless the risk of a breakdown in semantic transparency that could
+ result from using this date in an If-Modified-Since header would
+ lead to serious problems.
+
+ In other words, the preferred behavior for an HTTP/1.1 origin server
+ is to send both a strong entity-tag and a Last-Modified value.
+
+ In order to be legal, a strong entity-tag MUST change whenever the
+ associated representation changes in any way. A weak entity-tag
+ SHOULD change whenever the associated representation changes in a
+ semantically significant way.
+
+ Note: In order to provide semantically transparent caching, an
+ origin server must avoid reusing a specific strong entity-tag
+ value for two different representations, or reusing a specific
+ weak entity-tag value for two semantically different
+ representations. Cache entries might persist for arbitrarily long
+ periods, regardless of expiration times, so it might be
+ inappropriate to expect that a cache will never again attempt to
+ validate an entry using a validator that it obtained at some point
+ in the past.
+
+ HTTP/1.1 clients:
+
+ o MUST use that entity-tag in any cache-conditional request (using
+ If-Match or If-None-Match) if an entity-tag has been provided by
+ the origin server.
+
+ o SHOULD use the Last-Modified value in non-subrange cache-
+ conditional requests (using If-Modified-Since) if only a Last-
+ Modified value has been provided by the origin server.
+
+ o MAY use the Last-Modified value in subrange cache-conditional
+ requests (using If-Unmodified-Since) if only a Last-Modified value
+ has been provided by an HTTP/1.0 origin server. The user agent
+ SHOULD provide a way to disable this, in case of difficulty.
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 11]
+
+Internet-Draft HTTP/1.1, Part 4 August 2010
+
+
+ o SHOULD use both validators in cache-conditional requests if both
+ an entity-tag and a Last-Modified value have been provided by the
+ origin server. This allows both HTTP/1.0 and HTTP/1.1 caches to
+ respond appropriately.
+
+ An HTTP/1.1 origin server, upon receiving a conditional request that
+ includes both a Last-Modified date (e.g., in an If-Modified-Since or
+ If-Unmodified-Since header field) and one or more entity-tags (e.g.,
+ in an If-Match, If-None-Match, or If-Range header field) as cache
+ validators, MUST NOT return a response status code of 304 (Not
+ Modified) unless doing so is consistent with all of the conditional
+ header fields in the request.
+
+ An HTTP/1.1 caching proxy, upon receiving a conditional request that
+ includes both a Last-Modified date and one or more entity-tags as
+ cache validators, MUST NOT return a locally cached response to the
+ client unless that cached response is consistent with all of the
+ conditional header fields in the request.
+
+ Note: The general principle behind these rules is that HTTP/1.1
+ servers and clients ought to transmit as much non-redundant
+ information as is available in their responses and requests.
+ HTTP/1.1 systems receiving this information will make the most
+ conservative assumptions about the validators they receive.
+
+ HTTP/1.0 clients and caches will ignore entity-tags. Generally,
+ last-modified values received or used by these systems will
+ support transparent and efficient caching, and so HTTP/1.1 origin
+ servers should provide Last-Modified values. In those rare cases
+ where the use of a Last-Modified value as a validator by an
+ HTTP/1.0 system could result in a serious problem, then HTTP/1.1
+ origin servers should not provide one.
+
+6. Header Field Definitions
+
+ This section defines the syntax and semantics of HTTP/1.1 header
+ fields related to conditional requests.
+
+6.1. ETag
+
+ The "ETag" response-header field provides the current value of the
+ entity-tag (see Section 2) for one representation of the target
+ resource. An entity-tag is intended for use as a resource-local
+ identifier for differentiating between representations of the same
+ resource that vary over time or via content negotiation (see
+ Section 4).
+
+ ETag = "ETag" ":" OWS ETag-v
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 12]
+
+Internet-Draft HTTP/1.1, Part 4 August 2010
+
+
+ ETag-v = entity-tag
+
+ Examples:
+
+ ETag: "xyzzy"
+ ETag: W/"xyzzy"
+ ETag: ""
+
+ An entity-tag provides an "opaque" cache validator that allows for
+ more reliable validation than modification dates in situations where
+ it is inconvenient to store modification dates, where the one-second
+ resolution of HTTP date values is not sufficient, or where the origin
+ server wishes to avoid certain paradoxes that might arise from the
+ use of modification dates.
+
+ The principle behind entity-tags is that only the service author
+ knows the semantics of a resource well enough to select an
+ appropriate cache validation mechanism, and the specification of any
+ validator comparison function more complex than byte-equality would
+ open up a can of worms. Thus, comparisons of any other headers
+ (except Last-Modified, for compatibility with HTTP/1.0) are never
+ used for purposes of validating a cache entry.
+
+6.2. If-Match
+
+ The "If-Match" request-header field is used to make a request method
+ conditional. A client that has one or more representations
+ previously obtained from the resource can verify that one of those
+ representations is current by including a list of their associated
+ entity-tags in the If-Match header field.
+
+ This allows efficient updates of cached information with a minimum
+ amount of transaction overhead. It is also used when updating
+ resources, to prevent inadvertent modification of the wrong version
+ of a resource. As a special case, the value "*" matches any current
+ representation of the resource.
+
+ If-Match = "If-Match" ":" OWS If-Match-v
+ If-Match-v = "*" / 1#entity-tag
+
+ If any of the entity-tags match the entity-tag of the representation
+ that would have been returned in the response to a similar GET
+ request (without the If-Match header) on that resource, or if "*" is
+ given and any current representation exists for that resource, then
+ the server MAY perform the requested method as if the If-Match header
+ field did not exist.
+
+ If none of the entity-tags match, or if "*" is given and no current
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 13]
+
+Internet-Draft HTTP/1.1, Part 4 August 2010
+
+
+ representation exists, the server MUST NOT perform the requested
+ method, and MUST return a 412 (Precondition Failed) response. This
+ behavior is most useful when the client wants to prevent an updating
+ method, such as PUT, from modifying a resource that has changed since
+ the client last retrieved it.
+
+ If the request would, without the If-Match header field, result in
+ anything other than a 2xx or 412 status code, then the If-Match
+ header MUST be ignored.
+
+ The meaning of "If-Match: *" is that the method SHOULD be performed
+ if the representation selected by the origin server (or by a cache,
+ possibly using the Vary mechanism, see Section 3.5 of [Part6])
+ exists, and MUST NOT be performed if the representation does not
+ exist.
+
+ A request intended to update a resource (e.g., a PUT) MAY include an
+ If-Match header field to signal that the request method MUST NOT be
+ applied if the representation corresponding to the If-Match value (a
+ single entity-tag) is no longer a representation of that resource.
+ This allows the user to indicate that they do not wish the request to
+ be successful if the resource has been changed without their
+ knowledge. Examples:
+
+ If-Match: "xyzzy"
+ If-Match: "xyzzy", "r2d2xxxx", "c3piozzzz"
+ If-Match: *
+
+ The result of a request having both an If-Match header field and
+ either an If-None-Match or an If-Modified-Since header fields is
+ undefined by this specification.
+
+6.3. If-Modified-Since
+
+ The "If-Modified-Since" request-header field is used to make a
+ request method conditional by date: if the representation that would
+ have been transferred in a 200 response to a GET request has not been
+ modified since the time specified in this field, then do not perform
+ the method; instead, respond as detailed below.
+
+ If-Modified-Since = "If-Modified-Since" ":" OWS
+ If-Modified-Since-v
+ If-Modified-Since-v = HTTP-date
+
+ An example of the field is:
+
+ If-Modified-Since: Sat, 29 Oct 1994 19:43:31 GMT
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 14]
+
+Internet-Draft HTTP/1.1, Part 4 August 2010
+
+
+ A GET method with an If-Modified-Since header and no Range header
+ requests that the representation be transferred only if it has been
+ modified since the date given by the If-Modified-Since header. The
+ algorithm for determining this includes the following cases:
+
+ 1. If the request would normally result in anything other than a 200
+ (OK) status code, or if the passed If-Modified-Since date is
+ invalid, the response is exactly the same as for a normal GET. A
+ date which is later than the server's current time is invalid.
+
+ 2. If the representation has been modified since the If-Modified-
+ Since date, the response is exactly the same as for a normal GET.
+
+ 3. If the representation has not been modified since a valid If-
+ Modified-Since date, the server SHOULD return a 304 (Not
+ Modified) response.
+
+ The purpose of this feature is to allow efficient updates of cached
+ information with a minimum amount of transaction overhead.
+
+ Note: The Range request-header field modifies the meaning of If-
+ Modified-Since; see Section 5.4 of [Part5] for full details.
+
+ Note: If-Modified-Since times are interpreted by the server, whose
+ clock might not be synchronized with the client.
+
+ Note: When handling an If-Modified-Since header field, some
+ servers will use an exact date comparison function, rather than a
+ less-than function, for deciding whether to send a 304 (Not
+ Modified) response. To get best results when sending an If-
+ Modified-Since header field for cache validation, clients are
+ advised to use the exact date string received in a previous Last-
+ Modified header field whenever possible.
+
+ Note: If a client uses an arbitrary date in the If-Modified-Since
+ header instead of a date taken from the Last-Modified header for
+ the same request, the client needs to be aware that this date is
+ interpreted in the server's understanding of time. Unsynchronized
+ clocks and rounding problems, due to the different encodings of
+ time between the client and server, are concerns. This includes
+ the possibility of race conditions if the document has changed
+ between the time it was first requested and the If-Modified-Since
+ date of a subsequent request, and the possibility of clock-skew-
+ related problems if the If-Modified-Since date is derived from the
+ client's clock without correction to the server's clock.
+ Corrections for different time bases between client and server are
+ at best approximate due to network latency.
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 15]
+
+Internet-Draft HTTP/1.1, Part 4 August 2010
+
+
+ The result of a request having both an If-Modified-Since header field
+ and either an If-Match or an If-Unmodified-Since header fields is
+ undefined by this specification.
+
+6.4. If-None-Match
+
+ The "If-None-Match" request-header field is used to make a request
+ method conditional. A client that has one or more representations
+ previously obtained from the resource can verify that none of those
+ representations is current by including a list of their associated
+ entity-tags in the If-None-Match header field.
+
+ This allows efficient updates of cached information with a minimum
+ amount of transaction overhead. It is also used to prevent a method
+ (e.g., PUT) from inadvertently modifying an existing resource when
+ the client believes that the resource does not exist.
+
+ As a special case, the value "*" matches any current representation
+ of the resource.
+
+ If-None-Match = "If-None-Match" ":" OWS If-None-Match-v
+ If-None-Match-v = "*" / 1#entity-tag
+
+ If any of the entity-tags match the entity-tag of the representation
+ that would have been returned in the response to a similar GET
+ request (without the If-None-Match header) on that resource, or if
+ "*" is given and any current representation exists for that resource,
+ then the server MUST NOT perform the requested method, unless
+ required to do so because the resource's modification date fails to
+ match that supplied in an If-Modified-Since header field in the
+ request. Instead, if the request method was GET or HEAD, the server
+ SHOULD respond with a 304 (Not Modified) response, including the
+ cache-related header fields (particularly ETag) of one of the
+ representations that matched. For all other request methods, the
+ server MUST respond with a 412 (Precondition Failed) status code.
+
+ If none of the entity-tags match, then the server MAY perform the
+ requested method as if the If-None-Match header field did not exist,
+ but MUST also ignore any If-Modified-Since header field(s) in the
+ request. That is, if no entity-tags match, then the server MUST NOT
+ return a 304 (Not Modified) response.
+
+ If the request would, without the If-None-Match header field, result
+ in anything other than a 2xx or 304 status code, then the If-None-
+ Match header MUST be ignored. (See Section 5 for a discussion of
+ server behavior when both If-Modified-Since and If-None-Match appear
+ in the same request.)
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 16]
+
+Internet-Draft HTTP/1.1, Part 4 August 2010
+
+
+ The meaning of "If-None-Match: *" is that the method MUST NOT be
+ performed if the representation selected by the origin server (or by
+ a cache, possibly using the Vary mechanism, see Section 3.5 of
+ [Part6]) exists, and SHOULD be performed if the representation does
+ not exist. This feature is intended to be useful in preventing races
+ between PUT operations.
+
+ Examples:
+
+ If-None-Match: "xyzzy"
+ If-None-Match: W/"xyzzy"
+ If-None-Match: "xyzzy", "r2d2xxxx", "c3piozzzz"
+ If-None-Match: W/"xyzzy", W/"r2d2xxxx", W/"c3piozzzz"
+ If-None-Match: *
+
+ The result of a request having both an If-None-Match header field and
+ either an If-Match or an If-Unmodified-Since header fields is
+ undefined by this specification.
+
+6.5. If-Unmodified-Since
+
+ The "If-Unmodified-Since" request-header field is used to make a
+ request method conditional. If the representation that would have
+ been transferred in a 200 response to a GET request on the same
+ resource has not been modified since the time specified in this
+ field, the server SHOULD perform the requested operation as if the
+ If-Unmodified-Since header were not present.
+
+ If the representation has been modified since the specified time, the
+ server MUST NOT perform the requested operation, and MUST return a
+ 412 (Precondition Failed).
+
+ If-Unmodified-Since = "If-Unmodified-Since" ":" OWS
+ If-Unmodified-Since-v
+ If-Unmodified-Since-v = HTTP-date
+
+ An example of the field is:
+
+ If-Unmodified-Since: Sat, 29 Oct 1994 19:43:31 GMT
+
+ If the request normally (i.e., without the If-Unmodified-Since
+ header) would result in anything other than a 2xx or 412 status code,
+ the If-Unmodified-Since header SHOULD be ignored.
+
+ If the specified date is invalid, the header is ignored.
+
+ The result of a request having both an If-Unmodified-Since header
+ field and either an If-None-Match or an If-Modified-Since header
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 17]
+
+Internet-Draft HTTP/1.1, Part 4 August 2010
+
+
+ fields is undefined by this specification.
+
+6.6. Last-Modified
+
+ The "Last-Modified" header field indicates the date and time at which
+ the origin server believes the representation was last modified.
+
+ Last-Modified = "Last-Modified" ":" OWS Last-Modified-v
+ Last-Modified-v = HTTP-date
+
+ An example of its use is
+
+ Last-Modified: Tue, 15 Nov 1994 12:45:26 GMT
+
+ The exact meaning of this header field depends on the implementation
+ of the origin server and the nature of the original resource. For
+ files, it might be just the file system last-modified time. For
+ representations with dynamically included parts, it might be the most
+ recent of the set of last-modify times for its component parts. For
+ database gateways, it might be the last-update time stamp of the
+ record. For virtual objects, it might be the last time the internal
+ state changed.
+
+ An origin server MUST NOT send a Last-Modified date which is later
+ than the server's time of message origination. In such cases, where
+ the resource's last modification would indicate some time in the
+ future, the server MUST replace that date with the message
+ origination date.
+
+ An origin server SHOULD obtain the Last-Modified value of the
+ representation as close as possible to the time that it generates the
+ Date value of its response. This allows a recipient to make an
+ accurate assessment of the representation's modification time,
+ especially if the representation changes near the time that the
+ response is generated.
+
+ HTTP/1.1 servers SHOULD send Last-Modified whenever feasible.
+
+ The Last-Modified header field value is often used as a cache
+ validator. In simple terms, a cache entry is considered to be valid
+ if the representation has not been modified since the Last-Modified
+ value.
+
+7. IANA Considerations
+
+
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 18]
+
+Internet-Draft HTTP/1.1, Part 4 August 2010
+
+
+7.1. Status Code Registration
+
+ The HTTP Status Code Registry located at
+ <http://www.iana.org/assignments/http-status-codes> shall be updated
+ with the registrations below:
+
+ +-------+---------------------+-------------+
+ | Value | Description | Reference |
+ +-------+---------------------+-------------+
+ | 304 | Not Modified | Section 3.1 |
+ | 412 | Precondition Failed | Section 3.2 |
+ +-------+---------------------+-------------+
+
+7.2. Header Field Registration
+
+ The Message Header Field Registry located at <http://www.iana.org/
+ assignments/message-headers/message-header-index.html> shall be
+ updated with the permanent registrations below (see [RFC3864]):
+
+ +---------------------+----------+----------+-------------+
+ | Header Field Name | Protocol | Status | Reference |
+ +---------------------+----------+----------+-------------+
+ | ETag | http | standard | Section 6.1 |
+ | If-Match | http | standard | Section 6.2 |
+ | If-Modified-Since | http | standard | Section 6.3 |
+ | If-None-Match | http | standard | Section 6.4 |
+ | If-Unmodified-Since | http | standard | Section 6.5 |
+ | Last-Modified | http | standard | Section 6.6 |
+ +---------------------+----------+----------+-------------+
+
+ The change controller is: "IETF (iesg@ietf.org) - Internet
+ Engineering Task Force".
+
+8. Security Considerations
+
+ No additional security considerations have been identified beyond
+ those applicable to HTTP in general [Part1].
+
+9. Acknowledgments
+
+10. References
+
+10.1. Normative References
+
+ [Part1] Fielding, R., Ed., Gettys, J., Mogul, J., Frystyk, H.,
+ Masinter, L., Leach, P., Berners-Lee, T., Lafon, Y., Ed.,
+ and J. Reschke, Ed., "HTTP/1.1, part 1: URIs, Connections,
+ and Message Parsing", draft-ietf-httpbis-p1-messaging-11
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 19]
+
+Internet-Draft HTTP/1.1, Part 4 August 2010
+
+
+ (work in progress), August 2010.
+
+ [Part3] Fielding, R., Ed., Gettys, J., Mogul, J., Frystyk, H.,
+ Masinter, L., Leach, P., Berners-Lee, T., Lafon, Y., Ed.,
+ and J. Reschke, Ed., "HTTP/1.1, part 3: Message Payload
+ and Content Negotiation", draft-ietf-httpbis-p3-payload-11
+ (work in progress), August 2010.
+
+ [Part5] Fielding, R., Ed., Gettys, J., Mogul, J., Frystyk, H.,
+ Masinter, L., Leach, P., Berners-Lee, T., Lafon, Y., Ed.,
+ and J. Reschke, Ed., "HTTP/1.1, part 5: Range Requests and
+ Partial Responses", draft-ietf-httpbis-p5-range-11 (work
+ in progress), August 2010.
+
+ [Part6] Fielding, R., Ed., Gettys, J., Mogul, J., Frystyk, H.,
+ Masinter, L., Leach, P., Berners-Lee, T., Lafon, Y., Ed.,
+ Nottingham, M., Ed., and J. Reschke, Ed., "HTTP/1.1, part
+ 6: Caching", draft-ietf-httpbis-p6-cache-11 (work in
+ progress), August 2010.
+
+ [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
+ Requirement Levels", BCP 14, RFC 2119, March 1997.
+
+ [RFC5234] Crocker, D., Ed. and P. Overell, "Augmented BNF for Syntax
+ Specifications: ABNF", STD 68, RFC 5234, January 2008.
+
+10.2. Informative References
+
+ [RFC2616] Fielding, R., Gettys, J., Mogul, J., Frystyk, H.,
+ Masinter, L., Leach, P., and T. Berners-Lee, "Hypertext
+ Transfer Protocol -- HTTP/1.1", RFC 2616, June 1999.
+
+ [RFC3864] Klyne, G., Nottingham, M., and J. Mogul, "Registration
+ Procedures for Message Header Fields", BCP 90, RFC 3864,
+ September 2004.
+
+Appendix A. Changes from RFC 2616
+
+ Allow weak entity-tags in all requests except range requests
+ (Sections 4 and 6.4).
+
+
+
+
+
+
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 20]
+
+Internet-Draft HTTP/1.1, Part 4 August 2010
+
+
+Appendix B. Collected ABNF
+
+ ETag = "ETag:" OWS ETag-v
+ ETag-v = entity-tag
+
+ HTTP-date = <HTTP-date, defined in [Part1], Section 6.1>
+
+ If-Match = "If-Match:" OWS If-Match-v
+ If-Match-v = "*" / ( *( "," OWS ) entity-tag *( OWS "," [ OWS
+ entity-tag ] ) )
+ If-Modified-Since = "If-Modified-Since:" OWS If-Modified-Since-v
+ If-Modified-Since-v = HTTP-date
+ If-None-Match = "If-None-Match:" OWS If-None-Match-v
+ If-None-Match-v = "*" / ( *( "," OWS ) entity-tag *( OWS "," [ OWS
+ entity-tag ] ) )
+ If-Unmodified-Since = "If-Unmodified-Since:" OWS
+ If-Unmodified-Since-v
+ If-Unmodified-Since-v = HTTP-date
+
+ Last-Modified = "Last-Modified:" OWS Last-Modified-v
+ Last-Modified-v = HTTP-date
+
+ OWS = <OWS, defined in [Part1], Section 1.2.2>
+
+ entity-tag = [ weak ] opaque-tag
+
+ opaque-tag = quoted-string
+
+ quoted-string = <quoted-string, defined in [Part1], Section 1.2.2>
+
+ weak = %x57.2F ; W/
+
+ ABNF diagnostics:
+
+ ; ETag defined but not used
+ ; If-Match defined but not used
+ ; If-Modified-Since defined but not used
+ ; If-None-Match defined but not used
+ ; If-Unmodified-Since defined but not used
+ ; Last-Modified defined but not used
+
+Appendix C. Change Log (to be removed by RFC Editor before publication)
+
+C.1. Since RFC2616
+
+ Extracted relevant partitions from [RFC2616].
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 21]
+
+Internet-Draft HTTP/1.1, Part 4 August 2010
+
+
+C.2. Since draft-ietf-httpbis-p4-conditional-00
+
+ Closed issues:
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/35>: "Normative and
+ Informative references"
+
+ Other changes:
+
+ o Move definitions of 304 and 412 condition codes from Part2.
+
+C.3. Since draft-ietf-httpbis-p4-conditional-01
+
+ Ongoing work on ABNF conversion
+ (<http://tools.ietf.org/wg/httpbis/trac/ticket/36>):
+
+ o Add explicit references to BNF syntax and rules imported from
+ other parts of the specification.
+
+C.4. Since draft-ietf-httpbis-p4-conditional-02
+
+ Closed issues:
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/116>: "Weak ETags on
+ non-GET requests"
+
+ Ongoing work on IANA Message Header Registration
+ (<http://tools.ietf.org/wg/httpbis/trac/ticket/40>):
+
+ o Reference RFC 3984, and update header registrations for headers
+ defined in this document.
+
+C.5. Since draft-ietf-httpbis-p4-conditional-03
+
+ Closed issues:
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/71>: "Examples for
+ ETag matching"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/124>: "'entity
+ value' undefined"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/126>: "bogus 2068
+ Date header reference"
+
+
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 22]
+
+Internet-Draft HTTP/1.1, Part 4 August 2010
+
+
+C.6. Since draft-ietf-httpbis-p4-conditional-04
+
+ Ongoing work on ABNF conversion
+ (<http://tools.ietf.org/wg/httpbis/trac/ticket/36>):
+
+ o Use "/" instead of "|" for alternatives.
+
+ o Introduce new ABNF rules for "bad" whitespace ("BWS"), optional
+ whitespace ("OWS") and required whitespace ("RWS").
+
+ o Rewrite ABNFs to spell out whitespace rules, factor out header
+ value format definitions.
+
+C.7. Since draft-ietf-httpbis-p4-conditional-05
+
+ Final work on ABNF conversion
+ (<http://tools.ietf.org/wg/httpbis/trac/ticket/36>):
+
+ o Add appendix containing collected and expanded ABNF, reorganize
+ ABNF introduction.
+
+C.8. Since draft-ietf-httpbis-p4-conditional-06
+
+ Closed issues:
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/153>: "case-
+ sensitivity of etag weakness indicator"
+
+C.9. Since draft-ietf-httpbis-p4-conditional-07
+
+ Closed issues:
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/116>: "Weak ETags on
+ non-GET requests" (If-Match still was defined to require strong
+ matching)
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/198>: "move IANA
+ registrations for optional status codes"
+
+C.10. Since draft-ietf-httpbis-p4-conditional-08
+
+ No significant changes.
+
+C.11. Since draft-ietf-httpbis-p4-conditional-09
+
+ No significant changes.
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 23]
+
+Internet-Draft HTTP/1.1, Part 4 August 2010
+
+
+C.12. Since draft-ietf-httpbis-p4-conditional-10
+
+ Closed issues:
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/69>: "Clarify
+ 'Requested Variant'"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/109>: "Clarify
+ entity / representation / variant terminology"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/220>: "consider
+ removing the 'changes from 2068' sections"
+
+Index
+
+ 3
+ 304 Not Modified (status code) 7
+
+ 4
+ 412 Precondition Failed (status code) 7
+
+ E
+ ETag header 12
+
+ G
+ Grammar
+ entity-tag 5
+ ETag 12
+ ETag-v 12
+ If-Match 13
+ If-Match-v 13
+ If-Modified-Since 14
+ If-Modified-Since-v 14
+ If-None-Match 16
+ If-None-Match-v 16
+ If-Unmodified-Since 17
+ If-Unmodified-Since-v 17
+ Last-Modified 18
+ Last-Modified-v 18
+ opaque-tag 5
+ weak 5
+
+ H
+ Headers
+ ETag 12
+ If-Match 13
+ If-Modified-Since 14
+ If-None-Match 16
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 24]
+
+Internet-Draft HTTP/1.1, Part 4 August 2010
+
+
+ If-Unmodified-Since 17
+ Last-Modified 18
+
+ I
+ If-Match header 13
+ If-Modified-Since header 14
+ If-None-Match header 16
+ If-Unmodified-Since header 17
+
+ L
+ Last-Modified header 18
+
+ S
+ Status Codes
+ 304 Not Modified 7
+ 412 Precondition Failed 7
+
+Authors' Addresses
+
+ Roy T. Fielding (editor)
+ Day Software
+ 23 Corporate Plaza DR, Suite 280
+ Newport Beach, CA 92660
+ USA
+
+ Phone: +1-949-706-5300
+ Fax: +1-949-706-5305
+ EMail: fielding@gbiv.com
+ URI: http://roy.gbiv.com/
+
+
+ Jim Gettys
+ Alcatel-Lucent Bell Labs
+ 21 Oak Knoll Road
+ Carlisle, MA 01741
+ USA
+
+ EMail: jg@freedesktop.org
+ URI: http://gettys.wordpress.com/
+
+
+
+
+
+
+
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 25]
+
+Internet-Draft HTTP/1.1, Part 4 August 2010
+
+
+ Jeffrey C. Mogul
+ Hewlett-Packard Company
+ HP Labs, Large Scale Systems Group
+ 1501 Page Mill Road, MS 1177
+ Palo Alto, CA 94304
+ USA
+
+ EMail: JeffMogul@acm.org
+
+
+ Henrik Frystyk Nielsen
+ Microsoft Corporation
+ 1 Microsoft Way
+ Redmond, WA 98052
+ USA
+
+ EMail: henrikn@microsoft.com
+
+
+ Larry Masinter
+ Adobe Systems, Incorporated
+ 345 Park Ave
+ San Jose, CA 95110
+ USA
+
+ EMail: LMM@acm.org
+ URI: http://larry.masinter.net/
+
+
+ Paul J. Leach
+ Microsoft Corporation
+ 1 Microsoft Way
+ Redmond, WA 98052
+
+ EMail: paulle@microsoft.com
+
+
+ Tim Berners-Lee
+ World Wide Web Consortium
+ MIT Computer Science and Artificial Intelligence Laboratory
+ The Stata Center, Building 32
+ 32 Vassar Street
+ Cambridge, MA 02139
+ USA
+
+ EMail: timbl@w3.org
+ URI: http://www.w3.org/People/Berners-Lee/
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 26]
+
+Internet-Draft HTTP/1.1, Part 4 August 2010
+
+
+ Yves Lafon (editor)
+ World Wide Web Consortium
+ W3C / ERCIM
+ 2004, rte des Lucioles
+ Sophia-Antipolis, AM 06902
+ France
+
+ EMail: ylafon@w3.org
+ URI: http://www.raubacapeu.net/people/yves/
+
+
+ Julian F. Reschke (editor)
+ greenbytes GmbH
+ Hafenweg 16
+ Muenster, NW 48155
+ Germany
+
+ Phone: +49 251 2807760
+ Fax: +49 251 2807761
+ EMail: julian.reschke@greenbytes.de
+ URI: http://greenbytes.de/tech/webdav/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 27]
+
diff --git a/vendor/sabre/dav/docs/draft-ietf-httpbis-p5-range-11.txt b/vendor/sabre/dav/docs/draft-ietf-httpbis-p5-range-11.txt
new file mode 100644
index 000000000..1ef7b0946
--- /dev/null
+++ b/vendor/sabre/dav/docs/draft-ietf-httpbis-p5-range-11.txt
@@ -0,0 +1,1512 @@
+
+
+
+HTTPbis Working Group R. Fielding, Ed.
+Internet-Draft Day Software
+Obsoletes: 2616 (if approved) J. Gettys
+Intended status: Standards Track Alcatel-Lucent
+Expires: February 5, 2011 J. Mogul
+ HP
+ H. Frystyk
+ Microsoft
+ L. Masinter
+ Adobe Systems
+ P. Leach
+ Microsoft
+ T. Berners-Lee
+ W3C/MIT
+ Y. Lafon, Ed.
+ W3C
+ J. Reschke, Ed.
+ greenbytes
+ August 4, 2010
+
+
+ HTTP/1.1, part 5: Range Requests and Partial Responses
+ draft-ietf-httpbis-p5-range-11
+
+Abstract
+
+ The Hypertext Transfer Protocol (HTTP) is an application-level
+ protocol for distributed, collaborative, hypermedia information
+ systems. HTTP has been in use by the World Wide Web global
+ information initiative since 1990. This document is Part 5 of the
+ seven-part specification that defines the protocol referred to as
+ "HTTP/1.1" and, taken together, obsoletes RFC 2616. Part 5 defines
+ range-specific requests and the rules for constructing and combining
+ responses to those requests.
+
+Editorial Note (To be removed by RFC Editor)
+
+ Discussion of this draft should take place on the HTTPBIS working
+ group mailing list (ietf-http-wg@w3.org). The current issues list is
+ at <http://tools.ietf.org/wg/httpbis/trac/report/3> and related
+ documents (including fancy diffs) can be found at
+ <http://tools.ietf.org/wg/httpbis/>.
+
+ The changes in this draft are summarized in Appendix D.12.
+
+Status of This Memo
+
+ This Internet-Draft is submitted in full conformance with the
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 1]
+
+Internet-Draft HTTP/1.1, Part 5 August 2010
+
+
+ provisions of BCP 78 and BCP 79.
+
+ Internet-Drafts are working documents of the Internet Engineering
+ Task Force (IETF). Note that other groups may also distribute
+ working documents as Internet-Drafts. The list of current Internet-
+ Drafts is at http://datatracker.ietf.org/drafts/current/.
+
+ Internet-Drafts are draft documents valid for a maximum of six months
+ and may be updated, replaced, or obsoleted by other documents at any
+ time. It is inappropriate to use Internet-Drafts as reference
+ material or to cite them other than as "work in progress."
+
+ This Internet-Draft will expire on February 5, 2011.
+
+Copyright Notice
+
+ Copyright (c) 2010 IETF Trust and the persons identified as the
+ document authors. All rights reserved.
+
+ This document is subject to BCP 78 and the IETF Trust's Legal
+ Provisions Relating to IETF Documents
+ (http://trustee.ietf.org/license-info) in effect on the date of
+ publication of this document. Please review these documents
+ carefully, as they describe your rights and restrictions with respect
+ to this document. Code Components extracted from this document must
+ include Simplified BSD License text as described in Section 4.e of
+ the Trust Legal Provisions and are provided without warranty as
+ described in the Simplified BSD License.
+
+ This document may contain material from IETF Documents or IETF
+ Contributions published or made publicly available before November
+ 10, 2008. The person(s) controlling the copyright in some of this
+ material may not have granted the IETF Trust the right to allow
+ modifications of such material outside the IETF Standards Process.
+ Without obtaining an adequate license from the person(s) controlling
+ the copyright in such materials, this document may not be modified
+ outside the IETF Standards Process, and derivative works of it may
+ not be created outside the IETF Standards Process, except to format
+ it for publication as an RFC or to translate it into languages other
+ than English.
+
+
+
+
+
+
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 2]
+
+Internet-Draft HTTP/1.1, Part 5 August 2010
+
+
+Table of Contents
+
+ 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 5
+ 1.1. Requirements . . . . . . . . . . . . . . . . . . . . . . . 5
+ 1.2. Syntax Notation . . . . . . . . . . . . . . . . . . . . . 5
+ 1.2.1. Core Rules . . . . . . . . . . . . . . . . . . . . . . 6
+ 1.2.2. ABNF Rules defined in other Parts of the
+ Specification . . . . . . . . . . . . . . . . . . . . 6
+ 2. Range Units . . . . . . . . . . . . . . . . . . . . . . . . . 6
+ 2.1. Range Specifier Registry . . . . . . . . . . . . . . . . . 6
+ 3. Status Code Definitions . . . . . . . . . . . . . . . . . . . 7
+ 3.1. 206 Partial Content . . . . . . . . . . . . . . . . . . . 7
+ 3.2. 416 Requested Range Not Satisfiable . . . . . . . . . . . 8
+ 4. Combining Ranges . . . . . . . . . . . . . . . . . . . . . . . 8
+ 5. Header Field Definitions . . . . . . . . . . . . . . . . . . . 8
+ 5.1. Accept-Ranges . . . . . . . . . . . . . . . . . . . . . . 9
+ 5.2. Content-Range . . . . . . . . . . . . . . . . . . . . . . 9
+ 5.3. If-Range . . . . . . . . . . . . . . . . . . . . . . . . . 11
+ 5.4. Range . . . . . . . . . . . . . . . . . . . . . . . . . . 12
+ 5.4.1. Byte Ranges . . . . . . . . . . . . . . . . . . . . . 12
+ 5.4.2. Range Retrieval Requests . . . . . . . . . . . . . . . 14
+ 6. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 15
+ 6.1. Status Code Registration . . . . . . . . . . . . . . . . . 15
+ 6.2. Header Field Registration . . . . . . . . . . . . . . . . 15
+ 6.3. Range Specifier Registration . . . . . . . . . . . . . . . 16
+ 7. Security Considerations . . . . . . . . . . . . . . . . . . . 16
+ 8. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 16
+ 9. References . . . . . . . . . . . . . . . . . . . . . . . . . . 16
+ 9.1. Normative References . . . . . . . . . . . . . . . . . . . 16
+ 9.2. Informative References . . . . . . . . . . . . . . . . . . 17
+ Appendix A. Internet Media Type multipart/byteranges . . . . . . 17
+ Appendix B. Compatibility with Previous Versions . . . . . . . . 20
+ B.1. Changes from RFC 2616 . . . . . . . . . . . . . . . . . . 20
+ Appendix C. Collected ABNF . . . . . . . . . . . . . . . . . . . 20
+ Appendix D. Change Log (to be removed by RFC Editor before
+ publication) . . . . . . . . . . . . . . . . . . . . 21
+ D.1. Since RFC2616 . . . . . . . . . . . . . . . . . . . . . . 21
+ D.2. Since draft-ietf-httpbis-p5-range-00 . . . . . . . . . . . 21
+ D.3. Since draft-ietf-httpbis-p5-range-01 . . . . . . . . . . . 22
+ D.4. Since draft-ietf-httpbis-p5-range-02 . . . . . . . . . . . 22
+ D.5. Since draft-ietf-httpbis-p5-range-03 . . . . . . . . . . . 22
+ D.6. Since draft-ietf-httpbis-p5-range-04 . . . . . . . . . . . 22
+ D.7. Since draft-ietf-httpbis-p5-range-05 . . . . . . . . . . . 22
+ D.8. Since draft-ietf-httpbis-p5-range-06 . . . . . . . . . . . 23
+ D.9. Since draft-ietf-httpbis-p5-range-07 . . . . . . . . . . . 23
+ D.10. Since draft-ietf-httpbis-p5-range-08 . . . . . . . . . . . 23
+ D.11. Since draft-ietf-httpbis-p5-range-09 . . . . . . . . . . . 23
+ D.12. Since draft-ietf-httpbis-p5-range-10 . . . . . . . . . . . 23
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 3]
+
+Internet-Draft HTTP/1.1, Part 5 August 2010
+
+
+ Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 4]
+
+Internet-Draft HTTP/1.1, Part 5 August 2010
+
+
+1. Introduction
+
+ HTTP clients often encounter interrupted data transfers as a result
+ of cancelled requests or dropped connections. When a cache has
+ stored a partial representation, it is desirable to request the
+ remainder of that representation in a subsequent request rather than
+ transfer the entire representation. There are also a number of Web
+ applications that benefit from being able to request only a subset of
+ a larger representation, such as a single page of a very large
+ document or only part of an image to be rendered by a device with
+ limited local storage.
+
+ This document defines HTTP/1.1 range requests, partial responses, and
+ the multipart/byteranges media type. The protocol for range requests
+ is an OPTIONAL feature of HTTP, designed so resources or recipients
+ that do not implement this feature can respond as if it is a normal
+ GET request without impacting interoperability. Partial responses
+ are indicated by a distinct status code to not be mistaken for full
+ responses by intermediate caches that might not implement the
+ feature.
+
+ Although the HTTP range request mechanism is designed to allow for
+ extensible range types, this specification only defines requests for
+ byte ranges.
+
+1.1. Requirements
+
+ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
+ "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
+ document are to be interpreted as described in [RFC2119].
+
+ An implementation is not compliant if it fails to satisfy one or more
+ of the "MUST" or "REQUIRED" level requirements for the protocols it
+ implements. An implementation that satisfies all the "MUST" or
+ "REQUIRED" level and all the "SHOULD" level requirements for its
+ protocols is said to be "unconditionally compliant"; one that
+ satisfies all the "MUST" level requirements but not all the "SHOULD"
+ level requirements for its protocols is said to be "conditionally
+ compliant".
+
+1.2. Syntax Notation
+
+ This specification uses the ABNF syntax defined in Section 1.2 of
+ [Part1] (which extends the syntax defined in [RFC5234] with a list
+ rule). Appendix C shows the collected ABNF, with the list rule
+ expanded.
+
+ The following core rules are included by reference, as defined in
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 5]
+
+Internet-Draft HTTP/1.1, Part 5 August 2010
+
+
+ [RFC5234], Appendix B.1: ALPHA (letters), CR (carriage return), CRLF
+ (CR LF), CTL (controls), DIGIT (decimal 0-9), DQUOTE (double quote),
+ HEXDIG (hexadecimal 0-9/A-F/a-f), LF (line feed), OCTET (any 8-bit
+ sequence of data), SP (space), VCHAR (any visible USASCII character),
+ and WSP (whitespace).
+
+1.2.1. Core Rules
+
+ The core rules below are defined in Section 1.2.2 of [Part1]:
+
+ token = <token, defined in [Part1], Section 1.2.2>
+ OWS = <OWS, defined in [Part1], Section 1.2.2>
+
+1.2.2. ABNF Rules defined in other Parts of the Specification
+
+ The ABNF rules below are defined in other parts:
+
+ HTTP-date = <HTTP-date, defined in [Part1], Section 6.1>
+
+
+ entity-tag = <entity-tag, defined in [Part4], Section 2>
+
+2. Range Units
+
+ HTTP/1.1 allows a client to request that only part (a range of) the
+ representation be included within the response. HTTP/1.1 uses range
+ units in the Range (Section 5.4) and Content-Range (Section 5.2)
+ header fields. A representation can be broken down into subranges
+ according to various structural units.
+
+ range-unit = bytes-unit / other-range-unit
+ bytes-unit = "bytes"
+ other-range-unit = token
+
+ HTTP/1.1 has been designed to allow implementations of applications
+ that do not depend on knowledge of ranges. The only range unit
+ defined by HTTP/1.1 is "bytes". Additional specifiers can be defined
+ as described in Section 2.1.
+
+ If a range unit is not understood in a request, a server MUST ignore
+ the whole Range header (Section 5.4). If a range unit is not
+ understood in a response, an intermediary SHOULD pass the response to
+ the client; a client MUST fail.
+
+2.1. Range Specifier Registry
+
+ The HTTP Ranger Specifier Registry defines the name space for the
+ range specifier names.
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 6]
+
+Internet-Draft HTTP/1.1, Part 5 August 2010
+
+
+ Registrations MUST include the following fields:
+
+ o Name
+
+ o Description
+
+ o Pointer to specification text
+
+ Values to be added to this name space are subject to IETF review
+ ([RFC5226], Section 4.1).
+
+ The registry itself is maintained at
+ <http://www.iana.org/assignments/http-range-specifiers>.
+
+3. Status Code Definitions
+
+3.1. 206 Partial Content
+
+ The server has fulfilled the partial GET request for the resource.
+ The request MUST have included a Range header field (Section 5.4)
+ indicating the desired range, and MAY have included an If-Range
+ header field (Section 5.3) to make the request conditional.
+
+ The response MUST include the following header fields:
+
+ o Either a Content-Range header field (Section 5.2) indicating the
+ range included with this response, or a multipart/byteranges
+ Content-Type including Content-Range fields for each part. If a
+ Content-Length header field is present in the response, its value
+ MUST match the actual number of octets transmitted in the message-
+ body.
+
+ o Date
+
+ o Cache-Control, ETag, Expires, Content-Location, Last-Modified,
+ and/or Vary, if the header field would have been sent in a 200
+ response to the same request
+
+ If the 206 response is the result of an If-Range request, the
+ response SHOULD NOT include other representation header fields.
+ Otherwise, the response MUST include all of the representation header
+ fields that would have been returned with a 200 (OK) response to the
+ same request.
+
+ A cache MUST NOT combine a 206 response with other previously cached
+ content if the ETag or Last-Modified headers do not match exactly,
+ see Section 4.
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 7]
+
+Internet-Draft HTTP/1.1, Part 5 August 2010
+
+
+ A cache that does not support the Range and Content-Range headers
+ MUST NOT cache 206 (Partial Content) responses. Furthermore, if a
+ response uses a range unit that is not understood by the cache, then
+ it MUST NOT be cached either.
+
+3.2. 416 Requested Range Not Satisfiable
+
+ A server SHOULD return a response with this status code if a request
+ included a Range request-header field (Section 5.4), and none of the
+ ranges-specifier values in this field overlap the current extent of
+ the selected resource, and the request did not include an If-Range
+ request-header field (Section 5.3). (For byte-ranges, this means
+ that the first-byte-pos of all of the byte-range-spec values were
+ greater than the current length of the selected resource.)
+
+ When this status code is returned for a byte-range request, the
+ response SHOULD include a Content-Range header field specifying the
+ current length of the representation (see Section 5.2). This
+ response MUST NOT use the multipart/byteranges content-type.
+
+4. Combining Ranges
+
+ A response might transfer only a subrange of a representation, either
+ because the request included one or more Range specifications, or
+ because a connection closed prematurely. After several such
+ transfers, a cache might have received several ranges of the same
+ representation.
+
+ If a cache has a stored non-empty set of subranges for a
+ representation, and an incoming response transfers another subrange,
+ the cache MAY combine the new subrange with the existing set if both
+ the following conditions are met:
+
+ o Both the incoming response and the cache entry have a cache
+ validator.
+
+ o The two cache validators match using the strong comparison
+ function (see Section 4 of [Part4]).
+
+ If either requirement is not met, the cache MUST use only the most
+ recent partial response (based on the Date values transmitted with
+ every response, and using the incoming response if these values are
+ equal or missing), and MUST discard the other partial information.
+
+5. Header Field Definitions
+
+ This section defines the syntax and semantics of HTTP/1.1 header
+ fields related to range requests and partial responses.
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 8]
+
+Internet-Draft HTTP/1.1, Part 5 August 2010
+
+
+5.1. Accept-Ranges
+
+ The "Accept-Ranges" response-header field allows a resource to
+ indicate its acceptance of range requests.
+
+ Accept-Ranges = "Accept-Ranges" ":" OWS Accept-Ranges-v
+ Accept-Ranges-v = acceptable-ranges
+ acceptable-ranges = 1#range-unit / "none"
+
+ Origin servers that accept byte-range requests MAY send
+
+ Accept-Ranges: bytes
+
+ but are not required to do so. Clients MAY generate range requests
+ without having received this header for the resource involved. Range
+ units are defined in Section 2.
+
+ Servers that do not accept any kind of range request for a resource
+ MAY send
+
+ Accept-Ranges: none
+
+ to advise the client not to attempt a range request.
+
+5.2. Content-Range
+
+ The "Content-Range" header field is sent with a partial
+ representation to specify where in the full representation the
+ payload body is intended to be applied.
+
+ Range units are defined in Section 2.
+
+ Content-Range = "Content-Range" ":" OWS Content-Range-v
+ Content-Range-v = content-range-spec
+
+ content-range-spec = byte-content-range-spec
+ / other-content-range-spec
+ byte-content-range-spec = bytes-unit SP
+ byte-range-resp-spec "/"
+ ( instance-length / "*" )
+
+ byte-range-resp-spec = (first-byte-pos "-" last-byte-pos)
+ / "*"
+
+ instance-length = 1*DIGIT
+
+ other-content-range-spec = other-range-unit SP
+ other-range-resp-spec
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 9]
+
+Internet-Draft HTTP/1.1, Part 5 August 2010
+
+
+ other-range-resp-spec = *CHAR
+
+ The header SHOULD indicate the total length of the full
+ representation, unless this length is unknown or difficult to
+ determine. The asterisk "*" character means that the instance-length
+ is unknown at the time when the response was generated.
+
+ Unlike byte-ranges-specifier values (see Section 5.4.1), a byte-
+ range-resp-spec MUST only specify one range, and MUST contain
+ absolute byte positions for both the first and last byte of the
+ range.
+
+ A byte-content-range-spec with a byte-range-resp-spec whose last-
+ byte-pos value is less than its first-byte-pos value, or whose
+ instance-length value is less than or equal to its last-byte-pos
+ value, is invalid. The recipient of an invalid byte-content-range-
+ spec MUST ignore it and any content transferred along with it.
+
+ In the case of a byte range request: A server sending a response with
+ status code 416 (Requested range not satisfiable) SHOULD include a
+ Content-Range field with a byte-range-resp-spec of "*". The
+ instance-length specifies the current length of the selected
+ resource. A response with status code 206 (Partial Content) MUST NOT
+ include a Content-Range field with a byte-range-resp-spec of "*".
+
+ Examples of byte-content-range-spec values, assuming that the
+ representation contains a total of 1234 bytes:
+
+ o The first 500 bytes:
+
+ bytes 0-499/1234
+
+ o The second 500 bytes:
+
+ bytes 500-999/1234
+
+ o All except for the first 500 bytes:
+
+ bytes 500-1233/1234
+
+ o The last 500 bytes:
+
+ bytes 734-1233/1234
+
+ When an HTTP message includes the content of a single range (for
+ example, a response to a request for a single range, or to a request
+ for a set of ranges that overlap without any holes), this content is
+ transmitted with a Content-Range header, and a Content-Length header
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 10]
+
+Internet-Draft HTTP/1.1, Part 5 August 2010
+
+
+ showing the number of bytes actually transferred. For example,
+
+ HTTP/1.1 206 Partial Content
+ Date: Wed, 15 Nov 1995 06:25:24 GMT
+ Last-Modified: Wed, 15 Nov 1995 04:58:08 GMT
+ Content-Range: bytes 21010-47021/47022
+ Content-Length: 26012
+ Content-Type: image/gif
+
+ When an HTTP message includes the content of multiple ranges (for
+ example, a response to a request for multiple non-overlapping
+ ranges), these are transmitted as a multipart message. The multipart
+ media type used for this purpose is "multipart/byteranges" as defined
+ in Appendix A.
+
+ A response to a request for a single range MUST NOT be sent using the
+ multipart/byteranges media type. A response to a request for
+ multiple ranges, whose result is a single range, MAY be sent as a
+ multipart/byteranges media type with one part. A client that cannot
+ decode a multipart/byteranges message MUST NOT ask for multiple
+ ranges in a single request.
+
+ When a client requests multiple ranges in one request, the server
+ SHOULD return them in the order that they appeared in the request.
+
+ If the server ignores a byte-range-spec because it is syntactically
+ invalid, the server SHOULD treat the request as if the invalid Range
+ header field did not exist. (Normally, this means return a 200
+ response containing the full representation).
+
+ If the server receives a request (other than one including an If-
+ Range request-header field) with an unsatisfiable Range request-
+ header field (that is, all of whose byte-range-spec values have a
+ first-byte-pos value greater than the current length of the selected
+ resource), it SHOULD return a response code of 416 (Requested range
+ not satisfiable) (Section 3.2).
+
+ Note: Clients cannot depend on servers to send a 416 (Requested
+ range not satisfiable) response instead of a 200 (OK) response for
+ an unsatisfiable Range request-header, since not all servers
+ implement this request-header.
+
+5.3. If-Range
+
+ If a client has a partial copy of a representation in its cache, and
+ wishes to have an up-to-date copy of the entire representation in its
+ cache, it could use the Range request-header with a conditional GET
+ (using either or both of If-Unmodified-Since and If-Match.) However,
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 11]
+
+Internet-Draft HTTP/1.1, Part 5 August 2010
+
+
+ if the condition fails because the representation has been modified,
+ the client would then have to make a second request to obtain the
+ entire current representation.
+
+ The "If-Range" request-header field allows a client to "short-
+ circuit" the second request. Informally, its meaning is "if the
+ representation is unchanged, send me the part(s) that I am missing;
+ otherwise, send me the entire new representation".
+
+ If-Range = "If-Range" ":" OWS If-Range-v
+ If-Range-v = entity-tag / HTTP-date
+
+ If the client has no entity-tag for a representation, but does have a
+ Last-Modified date, it MAY use that date in an If-Range header. (The
+ server can distinguish between a valid HTTP-date and any form of
+ entity-tag by examining no more than two characters.) The If-Range
+ header SHOULD only be used together with a Range header, and MUST be
+ ignored if the request does not include a Range header, or if the
+ server does not support the sub-range operation.
+
+ If the entity-tag given in the If-Range header matches the current
+ cache validator for the representation, then the server SHOULD
+ provide the specified sub-range of the representation using a 206
+ (Partial Content) response. If the cache validator does not match,
+ then the server SHOULD return the entire representation using a 200
+ (OK) response.
+
+5.4. Range
+
+5.4.1. Byte Ranges
+
+ Since all HTTP representations are transferred as sequences of bytes,
+ the concept of a byte range is meaningful for any HTTP
+ representation. (However, not all clients and servers need to
+ support byte-range operations.)
+
+ Byte range specifications in HTTP apply to the sequence of bytes in
+ the representation body (not necessarily the same as the message-
+ body).
+
+ A byte range operation MAY specify a single range of bytes, or a set
+ of ranges within a single representation.
+
+ byte-ranges-specifier = bytes-unit "=" byte-range-set
+ byte-range-set = 1#( byte-range-spec / suffix-byte-range-spec )
+ byte-range-spec = first-byte-pos "-" [ last-byte-pos ]
+ first-byte-pos = 1*DIGIT
+ last-byte-pos = 1*DIGIT
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 12]
+
+Internet-Draft HTTP/1.1, Part 5 August 2010
+
+
+ The first-byte-pos value in a byte-range-spec gives the byte-offset
+ of the first byte in a range. The last-byte-pos value gives the
+ byte-offset of the last byte in the range; that is, the byte
+ positions specified are inclusive. Byte offsets start at zero.
+
+ If the last-byte-pos value is present, it MUST be greater than or
+ equal to the first-byte-pos in that byte-range-spec, or the byte-
+ range-spec is syntactically invalid. The recipient of a byte-range-
+ set that includes one or more syntactically invalid byte-range-spec
+ values MUST ignore the header field that includes that byte-range-
+ set.
+
+ If the last-byte-pos value is absent, or if the value is greater than
+ or equal to the current length of the representation body, last-byte-
+ pos is taken to be equal to one less than the current length of the
+ representation in bytes.
+
+ By its choice of last-byte-pos, a client can limit the number of
+ bytes retrieved without knowing the size of the representation.
+
+ suffix-byte-range-spec = "-" suffix-length
+ suffix-length = 1*DIGIT
+
+ A suffix-byte-range-spec is used to specify the suffix of the
+ representation body, of a length given by the suffix-length value.
+ (That is, this form specifies the last N bytes of a representation.)
+ If the representation is shorter than the specified suffix-length,
+ the entire representation is used.
+
+ If a syntactically valid byte-range-set includes at least one byte-
+ range-spec whose first-byte-pos is less than the current length of
+ the representation, or at least one suffix-byte-range-spec with a
+ non-zero suffix-length, then the byte-range-set is satisfiable.
+ Otherwise, the byte-range-set is unsatisfiable. If the byte-range-
+ set is unsatisfiable, the server SHOULD return a response with a 416
+ (Requested range not satisfiable) status code. Otherwise, the server
+ SHOULD return a response with a 206 (Partial Content) status code
+ containing the satisfiable ranges of the representation.
+
+ Examples of byte-ranges-specifier values (assuming a representation
+ of length 10000):
+
+ o The first 500 bytes (byte offsets 0-499, inclusive):
+
+ bytes=0-499
+
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 13]
+
+Internet-Draft HTTP/1.1, Part 5 August 2010
+
+
+ o The second 500 bytes (byte offsets 500-999, inclusive):
+
+ bytes=500-999
+
+ o The final 500 bytes (byte offsets 9500-9999, inclusive):
+
+ bytes=-500
+
+ Or:
+
+ bytes=9500-
+
+ o The first and last bytes only (bytes 0 and 9999):
+
+ bytes=0-0,-1
+
+ o Several legal but not canonical specifications of the second 500
+ bytes (byte offsets 500-999, inclusive):
+
+ bytes=500-600,601-999
+ bytes=500-700,601-999
+
+5.4.2. Range Retrieval Requests
+
+ The "Range" request-header field defines the GET method (conditional
+ or not) to request one or more sub-ranges of the response
+ representation body, instead of the entire representation body.
+
+ Range = "Range" ":" OWS Range-v
+ Range-v = byte-ranges-specifier
+ / other-ranges-specifier
+ other-ranges-specifier = other-range-unit "=" other-range-set
+ other-range-set = 1*CHAR
+
+ A server MAY ignore the Range header. However, HTTP/1.1 origin
+ servers and intermediate caches ought to support byte ranges when
+ possible, since Range supports efficient recovery from partially
+ failed transfers, and supports efficient partial retrieval of large
+ representations.
+
+ If the server supports the Range header and the specified range or
+ ranges are appropriate for the representation:
+
+ o The presence of a Range header in an unconditional GET modifies
+ what is returned if the GET is otherwise successful. In other
+ words, the response carries a status code of 206 (Partial Content)
+ instead of 200 (OK).
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 14]
+
+Internet-Draft HTTP/1.1, Part 5 August 2010
+
+
+ o The presence of a Range header in a conditional GET (a request
+ using one or both of If-Modified-Since and If-None-Match, or one
+ or both of If-Unmodified-Since and If-Match) modifies what is
+ returned if the GET is otherwise successful and the condition is
+ true. It does not affect the 304 (Not Modified) response returned
+ if the conditional is false.
+
+ In some cases, it might be more appropriate to use the If-Range
+ header (see Section 5.3) in addition to the Range header.
+
+ If a proxy that supports ranges receives a Range request, forwards
+ the request to an inbound server, and receives an entire
+ representation in reply, it SHOULD only return the requested range to
+ its client. It SHOULD store the entire received response in its
+ cache if that is consistent with its cache allocation policies.
+
+6. IANA Considerations
+
+6.1. Status Code Registration
+
+ The HTTP Status Code Registry located at
+ <http://www.iana.org/assignments/http-status-codes> shall be updated
+ with the registrations below:
+
+ +-------+---------------------------------+-------------+
+ | Value | Description | Reference |
+ +-------+---------------------------------+-------------+
+ | 206 | Partial Content | Section 3.1 |
+ | 416 | Requested Range Not Satisfiable | Section 3.2 |
+ +-------+---------------------------------+-------------+
+
+6.2. Header Field Registration
+
+ The Message Header Field Registry located at <http://www.iana.org/
+ assignments/message-headers/message-header-index.html> shall be
+ updated with the permanent registrations below (see [RFC3864]):
+
+ +-------------------+----------+----------+-------------+
+ | Header Field Name | Protocol | Status | Reference |
+ +-------------------+----------+----------+-------------+
+ | Accept-Ranges | http | standard | Section 5.1 |
+ | Content-Range | http | standard | Section 5.2 |
+ | If-Range | http | standard | Section 5.3 |
+ | Range | http | standard | Section 5.4 |
+ +-------------------+----------+----------+-------------+
+
+ The change controller is: "IETF (iesg@ietf.org) - Internet
+ Engineering Task Force".
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 15]
+
+Internet-Draft HTTP/1.1, Part 5 August 2010
+
+
+6.3. Range Specifier Registration
+
+ The registration procedure for HTTP Range Specifiers is defined by
+ Section 2.1 of this document.
+
+ The HTTP Range Specifier Registry shall be created at
+ <http://www.iana.org/assignments/http-range-specifiers> and be
+ populated with the registrations below:
+
+ +----------------------+-------------------+----------------------+
+ | Range Specifier Name | Description | Reference |
+ +----------------------+-------------------+----------------------+
+ | bytes | a range of octets | (this specification) |
+ +----------------------+-------------------+----------------------+
+
+ The change controller is: "IETF (iesg@ietf.org) - Internet
+ Engineering Task Force".
+
+7. Security Considerations
+
+ No additional security considerations have been identified beyond
+ those applicable to HTTP in general [Part1].
+
+8. Acknowledgments
+
+ Most of the specification of ranges is based on work originally done
+ by Ari Luotonen and John Franks, with additional input from Steve
+ Zilles, Daniel W. Connolly, Roy T. Fielding, Jim Gettys, Martin
+ Hamilton, Koen Holtman, Shel Kaplan, Paul Leach, Alex Lopez-Ortiz,
+ Larry Masinter, Jeff Mogul, Lou Montulli, David W. Morris, Luigi
+ Rizzo, and Bill Weihl.
+
+9. References
+
+9.1. Normative References
+
+ [Part1] Fielding, R., Ed., Gettys, J., Mogul, J., Frystyk, H.,
+ Masinter, L., Leach, P., Berners-Lee, T., Lafon, Y., Ed.,
+ and J. Reschke, Ed., "HTTP/1.1, part 1: URIs, Connections,
+ and Message Parsing", draft-ietf-httpbis-p1-messaging-11
+ (work in progress), August 2010.
+
+ [Part4] Fielding, R., Ed., Gettys, J., Mogul, J., Frystyk, H.,
+ Masinter, L., Leach, P., Berners-Lee, T., Lafon, Y., Ed.,
+ and J. Reschke, Ed., "HTTP/1.1, part 4: Conditional
+ Requests", draft-ietf-httpbis-p4-conditional-11 (work in
+ progress), August 2010.
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 16]
+
+Internet-Draft HTTP/1.1, Part 5 August 2010
+
+
+ [RFC2046] Freed, N. and N. Borenstein, "Multipurpose Internet Mail
+ Extensions (MIME) Part Two: Media Types", RFC 2046,
+ November 1996.
+
+ [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
+ Requirement Levels", BCP 14, RFC 2119, March 1997.
+
+ [RFC5234] Crocker, D., Ed. and P. Overell, "Augmented BNF for Syntax
+ Specifications: ABNF", STD 68, RFC 5234, January 2008.
+
+9.2. Informative References
+
+ [RFC2616] Fielding, R., Gettys, J., Mogul, J., Frystyk, H.,
+ Masinter, L., Leach, P., and T. Berners-Lee, "Hypertext
+ Transfer Protocol -- HTTP/1.1", RFC 2616, June 1999.
+
+ [RFC3864] Klyne, G., Nottingham, M., and J. Mogul, "Registration
+ Procedures for Message Header Fields", BCP 90, RFC 3864,
+ September 2004.
+
+ [RFC4288] Freed, N. and J. Klensin, "Media Type Specifications and
+ Registration Procedures", BCP 13, RFC 4288, December 2005.
+
+ [RFC5226] Narten, T. and H. Alvestrand, "Guidelines for Writing an
+ IANA Considerations Section in RFCs", BCP 26, RFC 5226,
+ May 2008.
+
+Appendix A. Internet Media Type multipart/byteranges
+
+ When an HTTP 206 (Partial Content) response message includes the
+ content of multiple ranges (a response to a request for multiple non-
+ overlapping ranges), these are transmitted as a multipart message-
+ body ([RFC2046], Section 5.1). The media type for this purpose is
+ called "multipart/byteranges". The following is to be registered
+ with IANA [RFC4288].
+
+ Note: Despite the name "multipart/byteranges" is not limited to
+ the byte ranges only.
+
+ The multipart/byteranges media type includes one or more parts, each
+ with its own Content-Type and Content-Range fields. The required
+ boundary parameter specifies the boundary string used to separate
+ each body-part.
+
+
+
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 17]
+
+Internet-Draft HTTP/1.1, Part 5 August 2010
+
+
+ Type name: multipart
+
+ Subtype name: byteranges
+
+ Required parameters: boundary
+
+ Optional parameters: none
+
+ Encoding considerations: only "7bit", "8bit", or "binary" are
+ permitted
+
+ Security considerations: none
+
+ Interoperability considerations: none
+
+ Published specification: This specification (see Appendix A).
+
+ Applications that use this media type:
+
+ Additional information:
+
+ Magic number(s): none
+
+ File extension(s): none
+
+ Macintosh file type code(s): none
+
+ Person and email address to contact for further information: See
+ Authors Section.
+
+ Intended usage: COMMON
+
+ Restrictions on usage: none
+
+ Author/Change controller: IESG
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 18]
+
+Internet-Draft HTTP/1.1, Part 5 August 2010
+
+
+ For example:
+
+ HTTP/1.1 206 Partial Content
+ Date: Wed, 15 Nov 1995 06:25:24 GMT
+ Last-Modified: Wed, 15 Nov 1995 04:58:08 GMT
+ Content-type: multipart/byteranges; boundary=THIS_STRING_SEPARATES
+
+ --THIS_STRING_SEPARATES
+ Content-type: application/pdf
+ Content-range: bytes 500-999/8000
+
+ ...the first range...
+ --THIS_STRING_SEPARATES
+ Content-type: application/pdf
+ Content-range: bytes 7000-7999/8000
+
+ ...the second range
+ --THIS_STRING_SEPARATES--
+
+ Other example:
+
+ HTTP/1.1 206 Partial Content
+ Date: Tue, 14 Nov 1995 06:25:24 GMT
+ Last-Modified: Tue, 14 July 04:58:08 GMT
+ Content-type: multipart/byteranges; boundary=THIS_STRING_SEPARATES
+
+ --THIS_STRING_SEPARATES
+ Content-type: video/example
+ Content-range: exampleunit 1.2-4.3/25
+
+ ...the first range...
+ --THIS_STRING_SEPARATES
+ Content-type: video/example
+ Content-range: exampleunit 11.2-14.3/25
+
+ ...the second range
+ --THIS_STRING_SEPARATES--
+
+ Notes:
+
+ 1. Additional CRLFs MAY precede the first boundary string in the
+ body.
+
+ 2. Although [RFC2046] permits the boundary string to be quoted, some
+ existing implementations handle a quoted boundary string
+ incorrectly.
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 19]
+
+Internet-Draft HTTP/1.1, Part 5 August 2010
+
+
+ 3. A number of browsers and servers were coded to an early draft of
+ the byteranges specification to use a media type of multipart/
+ x-byteranges, which is almost, but not quite compatible with the
+ version documented in HTTP/1.1.
+
+Appendix B. Compatibility with Previous Versions
+
+B.1. Changes from RFC 2616
+
+ Clarify that it is not ok to use a weak cache validator in a 206
+ response. (Section 3.1)
+
+ Clarify that multipart/byteranges can consist of a single part.
+ (Appendix A)
+
+Appendix C. Collected ABNF
+
+ Accept-Ranges = "Accept-Ranges:" OWS Accept-Ranges-v
+ Accept-Ranges-v = acceptable-ranges
+
+ Content-Range = "Content-Range:" OWS Content-Range-v
+ Content-Range-v = content-range-spec
+
+ HTTP-date = <HTTP-date, defined in [Part1], Section 6.1>
+
+ If-Range = "If-Range:" OWS If-Range-v
+ If-Range-v = entity-tag / HTTP-date
+
+ OWS = <OWS, defined in [Part1], Section 1.2.2>
+
+ Range = "Range:" OWS Range-v
+ Range-v = byte-ranges-specifier / other-ranges-specifier
+
+ acceptable-ranges = ( *( "," OWS ) range-unit *( OWS "," [ OWS
+ range-unit ] ) ) / "none"
+
+ byte-content-range-spec = bytes-unit SP byte-range-resp-spec "/" (
+ instance-length / "*" )
+ byte-range-resp-spec = ( first-byte-pos "-" last-byte-pos ) / "*"
+ byte-range-set = ( *( "," OWS ) byte-range-spec ) / (
+ suffix-byte-range-spec *( OWS "," [ ( OWS byte-range-spec ) /
+ suffix-byte-range-spec ] ) )
+ byte-range-spec = first-byte-pos "-" [ last-byte-pos ]
+ byte-ranges-specifier = bytes-unit "=" byte-range-set
+ bytes-unit = "bytes"
+
+ content-range-spec = byte-content-range-spec /
+ other-content-range-spec
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 20]
+
+Internet-Draft HTTP/1.1, Part 5 August 2010
+
+
+ entity-tag = <entity-tag, defined in [Part4], Section 2>
+
+ first-byte-pos = 1*DIGIT
+
+ instance-length = 1*DIGIT
+
+ last-byte-pos = 1*DIGIT
+
+ other-content-range-spec = other-range-unit SP other-range-resp-spec
+ other-range-resp-spec = *CHAR
+ other-range-set = 1*CHAR
+ other-range-unit = token
+ other-ranges-specifier = other-range-unit "=" other-range-set
+
+ range-unit = bytes-unit / other-range-unit
+
+ suffix-byte-range-spec = "-" suffix-length
+ suffix-length = 1*DIGIT
+
+ token = <token, defined in [Part1], Section 1.2.2>
+
+ ABNF diagnostics:
+
+ ; Accept-Ranges defined but not used
+ ; Content-Range defined but not used
+ ; If-Range defined but not used
+ ; Range defined but not used
+
+Appendix D. Change Log (to be removed by RFC Editor before publication)
+
+D.1. Since RFC2616
+
+ Extracted relevant partitions from [RFC2616].
+
+D.2. Since draft-ietf-httpbis-p5-range-00
+
+ Closed issues:
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/18>: "Cache
+ validators in 206 responses"
+ (<http://purl.org/NET/http-errata#ifrange206>)
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/35>: "Normative and
+ Informative references"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/86>: "Normative up-
+ to-date references"
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 21]
+
+Internet-Draft HTTP/1.1, Part 5 August 2010
+
+
+D.3. Since draft-ietf-httpbis-p5-range-01
+
+ Closed issues:
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/55>: "Updating to
+ RFC4288"
+
+ Ongoing work on ABNF conversion
+ (<http://tools.ietf.org/wg/httpbis/trac/ticket/36>):
+
+ o Add explicit references to BNF syntax and rules imported from
+ other parts of the specification.
+
+D.4. Since draft-ietf-httpbis-p5-range-02
+
+ Ongoing work on IANA Message Header Registration
+ (<http://tools.ietf.org/wg/httpbis/trac/ticket/40>):
+
+ o Reference RFC 3984, and update header registrations for headers
+ defined in this document.
+
+D.5. Since draft-ietf-httpbis-p5-range-03
+
+D.6. Since draft-ietf-httpbis-p5-range-04
+
+ Closed issues:
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/133>: "multipart/
+ byteranges minimum number of parts"
+
+ Ongoing work on ABNF conversion
+ (<http://tools.ietf.org/wg/httpbis/trac/ticket/36>):
+
+ o Use "/" instead of "|" for alternatives.
+
+ o Introduce new ABNF rules for "bad" whitespace ("BWS"), optional
+ whitespace ("OWS") and required whitespace ("RWS").
+
+ o Rewrite ABNFs to spell out whitespace rules, factor out header
+ value format definitions.
+
+D.7. Since draft-ietf-httpbis-p5-range-05
+
+ Closed issues:
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/142>: "State base
+ for *-byte-pos and suffix-length"
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 22]
+
+Internet-Draft HTTP/1.1, Part 5 August 2010
+
+
+ Ongoing work on Custom Ranges
+ (<http://tools.ietf.org/wg/httpbis/trac/ticket/85>):
+
+ o Remove bias in favor of byte ranges; allow custom ranges in ABNF.
+
+ Final work on ABNF conversion
+ (<http://tools.ietf.org/wg/httpbis/trac/ticket/36>):
+
+ o Add appendix containing collected and expanded ABNF, reorganize
+ ABNF introduction.
+
+D.8. Since draft-ietf-httpbis-p5-range-06
+
+ Closed issues:
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/161>: "base for
+ numeric protocol elements"
+
+D.9. Since draft-ietf-httpbis-p5-range-07
+
+ Closed issues:
+
+ o Fixed discrepancy in the If-Range definition about allowed
+ validators.
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/150>: "multipart/
+ byteranges for custom range units"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/151>: "range unit
+ missing from other-ranges-specifier in Range header"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/198>: "move IANA
+ registrations for optional status codes"
+
+D.10. Since draft-ietf-httpbis-p5-range-08
+
+ No significant changes.
+
+D.11. Since draft-ietf-httpbis-p5-range-09
+
+ No significant changes.
+
+D.12. Since draft-ietf-httpbis-p5-range-10
+
+ Closed issues:
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/69>: "Clarify
+ 'Requested Variant'"
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 23]
+
+Internet-Draft HTTP/1.1, Part 5 August 2010
+
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/109>: "Clarify
+ entity / representation / variant terminology"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/220>: "consider
+ removing the 'changes from 2068' sections"
+
+ Ongoing work on Custom Ranges
+ (<http://tools.ietf.org/wg/httpbis/trac/ticket/85>):
+
+ o Add IANA registry.
+
+Index
+
+ 2
+ 206 Partial Content (status code) 7
+
+ 4
+ 416 Requested Range Not Satisfiable (status code) 8
+
+ A
+ Accept-Ranges header 9
+
+ C
+ Content-Range header 9
+
+ G
+ Grammar
+ Accept-Ranges 9
+ Accept-Ranges-v 9
+ acceptable-ranges 9
+ byte-content-range-spec 9
+ byte-range-resp-spec 9
+ byte-range-set 12
+ byte-range-spec 12
+ byte-ranges-specifier 12
+ bytes-unit 6
+ Content-Range 9
+ content-range-spec 9
+ Content-Range-v 9
+ first-byte-pos 12
+ If-Range 12
+ If-Range-v 12
+ instance-length 9
+ last-byte-pos 12
+ other-range-unit 6
+ Range 14
+ range-unit 6
+ ranges-specifier 12
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 24]
+
+Internet-Draft HTTP/1.1, Part 5 August 2010
+
+
+ suffix-byte-range-spec 13
+ suffix-length 13
+
+ H
+ Headers
+ Accept-Ranges 9
+ Content-Range 9
+ If-Range 11
+ Range 12
+
+ I
+ If-Range header 11
+
+ M
+ Media Type
+ multipart/byteranges 17
+ multipart/x-byteranges 20
+ multipart/byteranges Media Type 17
+ multipart/x-byteranges Media Type 20
+
+ R
+ Range header 12
+
+ S
+ Status Codes
+ 206 Partial Content 7
+ 416 Requested Range Not Satisfiable 8
+
+Authors' Addresses
+
+ Roy T. Fielding (editor)
+ Day Software
+ 23 Corporate Plaza DR, Suite 280
+ Newport Beach, CA 92660
+ USA
+
+ Phone: +1-949-706-5300
+ Fax: +1-949-706-5305
+ EMail: fielding@gbiv.com
+ URI: http://roy.gbiv.com/
+
+
+
+
+
+
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 25]
+
+Internet-Draft HTTP/1.1, Part 5 August 2010
+
+
+ Jim Gettys
+ Alcatel-Lucent Bell Labs
+ 21 Oak Knoll Road
+ Carlisle, MA 01741
+ USA
+
+ EMail: jg@freedesktop.org
+ URI: http://gettys.wordpress.com/
+
+
+ Jeffrey C. Mogul
+ Hewlett-Packard Company
+ HP Labs, Large Scale Systems Group
+ 1501 Page Mill Road, MS 1177
+ Palo Alto, CA 94304
+ USA
+
+ EMail: JeffMogul@acm.org
+
+
+ Henrik Frystyk Nielsen
+ Microsoft Corporation
+ 1 Microsoft Way
+ Redmond, WA 98052
+ USA
+
+ EMail: henrikn@microsoft.com
+
+
+ Larry Masinter
+ Adobe Systems, Incorporated
+ 345 Park Ave
+ San Jose, CA 95110
+ USA
+
+ EMail: LMM@acm.org
+ URI: http://larry.masinter.net/
+
+
+ Paul J. Leach
+ Microsoft Corporation
+ 1 Microsoft Way
+ Redmond, WA 98052
+
+ EMail: paulle@microsoft.com
+
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 26]
+
+Internet-Draft HTTP/1.1, Part 5 August 2010
+
+
+ Tim Berners-Lee
+ World Wide Web Consortium
+ MIT Computer Science and Artificial Intelligence Laboratory
+ The Stata Center, Building 32
+ 32 Vassar Street
+ Cambridge, MA 02139
+ USA
+
+ EMail: timbl@w3.org
+ URI: http://www.w3.org/People/Berners-Lee/
+
+
+ Yves Lafon (editor)
+ World Wide Web Consortium
+ W3C / ERCIM
+ 2004, rte des Lucioles
+ Sophia-Antipolis, AM 06902
+ France
+
+ EMail: ylafon@w3.org
+ URI: http://www.raubacapeu.net/people/yves/
+
+
+ Julian F. Reschke (editor)
+ greenbytes GmbH
+ Hafenweg 16
+ Muenster, NW 48155
+ Germany
+
+ Phone: +49 251 2807760
+ Fax: +49 251 2807761
+ EMail: julian.reschke@greenbytes.de
+ URI: http://greenbytes.de/tech/webdav/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 27]
+
diff --git a/vendor/sabre/dav/docs/draft-ietf-httpbis-p6-cache-11.txt b/vendor/sabre/dav/docs/draft-ietf-httpbis-p6-cache-11.txt
new file mode 100644
index 000000000..35b875615
--- /dev/null
+++ b/vendor/sabre/dav/docs/draft-ietf-httpbis-p6-cache-11.txt
@@ -0,0 +1,2352 @@
+
+
+
+HTTPbis Working Group R. Fielding, Ed.
+Internet-Draft Day Software
+Obsoletes: 2616 (if approved) J. Gettys
+Intended status: Standards Track Alcatel-Lucent
+Expires: February 5, 2011 J. Mogul
+ HP
+ H. Frystyk
+ Microsoft
+ L. Masinter
+ Adobe Systems
+ P. Leach
+ Microsoft
+ T. Berners-Lee
+ W3C/MIT
+ Y. Lafon, Ed.
+ W3C
+ M. Nottingham, Ed.
+
+ J. Reschke, Ed.
+ greenbytes
+ August 4, 2010
+
+
+ HTTP/1.1, part 6: Caching
+ draft-ietf-httpbis-p6-cache-11
+
+Abstract
+
+ The Hypertext Transfer Protocol (HTTP) is an application-level
+ protocol for distributed, collaborative, hypermedia information
+ systems. This document is Part 6 of the seven-part specification
+ that defines the protocol referred to as "HTTP/1.1" and, taken
+ together, obsoletes RFC 2616. Part 6 defines requirements on HTTP
+ caches and the associated header fields that control cache behavior
+ or indicate cacheable response messages.
+
+Editorial Note (To be removed by RFC Editor)
+
+ Discussion of this draft should take place on the HTTPBIS working
+ group mailing list (ietf-http-wg@w3.org). The current issues list is
+ at <http://tools.ietf.org/wg/httpbis/trac/report/3> and related
+ documents (including fancy diffs) can be found at
+ <http://tools.ietf.org/wg/httpbis/>.
+
+ The changes in this draft are summarized in Appendix C.12.
+
+Status of This Memo
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 1]
+
+Internet-Draft HTTP/1.1, Part 6 August 2010
+
+
+ This Internet-Draft is submitted in full conformance with the
+ provisions of BCP 78 and BCP 79.
+
+ Internet-Drafts are working documents of the Internet Engineering
+ Task Force (IETF). Note that other groups may also distribute
+ working documents as Internet-Drafts. The list of current Internet-
+ Drafts is at http://datatracker.ietf.org/drafts/current/.
+
+ Internet-Drafts are draft documents valid for a maximum of six months
+ and may be updated, replaced, or obsoleted by other documents at any
+ time. It is inappropriate to use Internet-Drafts as reference
+ material or to cite them other than as "work in progress."
+
+ This Internet-Draft will expire on February 5, 2011.
+
+Copyright Notice
+
+ Copyright (c) 2010 IETF Trust and the persons identified as the
+ document authors. All rights reserved.
+
+ This document is subject to BCP 78 and the IETF Trust's Legal
+ Provisions Relating to IETF Documents
+ (http://trustee.ietf.org/license-info) in effect on the date of
+ publication of this document. Please review these documents
+ carefully, as they describe your rights and restrictions with respect
+ to this document. Code Components extracted from this document must
+ include Simplified BSD License text as described in Section 4.e of
+ the Trust Legal Provisions and are provided without warranty as
+ described in the Simplified BSD License.
+
+ This document may contain material from IETF Documents or IETF
+ Contributions published or made publicly available before November
+ 10, 2008. The person(s) controlling the copyright in some of this
+ material may not have granted the IETF Trust the right to allow
+ modifications of such material outside the IETF Standards Process.
+ Without obtaining an adequate license from the person(s) controlling
+ the copyright in such materials, this document may not be modified
+ outside the IETF Standards Process, and derivative works of it may
+ not be created outside the IETF Standards Process, except to format
+ it for publication as an RFC or to translate it into languages other
+ than English.
+
+Table of Contents
+
+ 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 5
+ 1.1. Purpose . . . . . . . . . . . . . . . . . . . . . . . . . 5
+ 1.2. Terminology . . . . . . . . . . . . . . . . . . . . . . . 5
+ 1.3. Requirements . . . . . . . . . . . . . . . . . . . . . . . 6
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 2]
+
+Internet-Draft HTTP/1.1, Part 6 August 2010
+
+
+ 1.4. Syntax Notation . . . . . . . . . . . . . . . . . . . . . 7
+ 1.4.1. Core Rules . . . . . . . . . . . . . . . . . . . . . . 7
+ 1.4.2. ABNF Rules defined in other Parts of the
+ Specification . . . . . . . . . . . . . . . . . . . . 7
+ 2. Cache Operation . . . . . . . . . . . . . . . . . . . . . . . 7
+ 2.1. Response Cacheability . . . . . . . . . . . . . . . . . . 7
+ 2.1.1. Storing Partial and Incomplete Responses . . . . . . . 8
+ 2.2. Constructing Responses from Caches . . . . . . . . . . . . 9
+ 2.3. Freshness Model . . . . . . . . . . . . . . . . . . . . . 10
+ 2.3.1. Calculating Freshness Lifetime . . . . . . . . . . . . 11
+ 2.3.2. Calculating Age . . . . . . . . . . . . . . . . . . . 12
+ 2.3.3. Serving Stale Responses . . . . . . . . . . . . . . . 13
+ 2.4. Validation Model . . . . . . . . . . . . . . . . . . . . . 14
+ 2.5. Request Methods that Invalidate . . . . . . . . . . . . . 14
+ 2.6. Shared Caching of Authenticated Responses . . . . . . . . 15
+ 2.7. Caching Negotiated Responses . . . . . . . . . . . . . . . 16
+ 2.8. Combining Responses . . . . . . . . . . . . . . . . . . . 16
+ 3. Header Field Definitions . . . . . . . . . . . . . . . . . . . 17
+ 3.1. Age . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
+ 3.2. Cache-Control . . . . . . . . . . . . . . . . . . . . . . 18
+ 3.2.1. Request Cache-Control Directives . . . . . . . . . . . 18
+ 3.2.2. Response Cache-Control Directives . . . . . . . . . . 20
+ 3.2.3. Cache Control Extensions . . . . . . . . . . . . . . . 22
+ 3.3. Expires . . . . . . . . . . . . . . . . . . . . . . . . . 24
+ 3.4. Pragma . . . . . . . . . . . . . . . . . . . . . . . . . . 24
+ 3.5. Vary . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
+ 3.6. Warning . . . . . . . . . . . . . . . . . . . . . . . . . 26
+ 4. History Lists . . . . . . . . . . . . . . . . . . . . . . . . 28
+ 5. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 28
+ 5.1. Cache Directive Registry . . . . . . . . . . . . . . . . . 28
+ 5.2. Header Field Registration . . . . . . . . . . . . . . . . 29
+ 6. Security Considerations . . . . . . . . . . . . . . . . . . . 29
+ 7. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 30
+ 8. References . . . . . . . . . . . . . . . . . . . . . . . . . . 30
+ 8.1. Normative References . . . . . . . . . . . . . . . . . . . 30
+ 8.2. Informative References . . . . . . . . . . . . . . . . . . 31
+ Appendix A. Changes from RFC 2616 . . . . . . . . . . . . . . . . 31
+ Appendix B. Collected ABNF . . . . . . . . . . . . . . . . . . . 31
+ Appendix C. Change Log (to be removed by RFC Editor before
+ publication) . . . . . . . . . . . . . . . . . . . . 33
+ C.1. Since RFC2616 . . . . . . . . . . . . . . . . . . . . . . 33
+ C.2. Since draft-ietf-httpbis-p6-cache-00 . . . . . . . . . . . 33
+ C.3. Since draft-ietf-httpbis-p6-cache-01 . . . . . . . . . . . 34
+ C.4. Since draft-ietf-httpbis-p6-cache-02 . . . . . . . . . . . 34
+ C.5. Since draft-ietf-httpbis-p6-cache-03 . . . . . . . . . . . 34
+ C.6. Since draft-ietf-httpbis-p6-cache-04 . . . . . . . . . . . 34
+ C.7. Since draft-ietf-httpbis-p6-cache-05 . . . . . . . . . . . 35
+ C.8. Since draft-ietf-httpbis-p6-cache-06 . . . . . . . . . . . 35
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 3]
+
+Internet-Draft HTTP/1.1, Part 6 August 2010
+
+
+ C.9. Since draft-ietf-httpbis-p6-cache-07 . . . . . . . . . . . 35
+ C.10. Since draft-ietf-httpbis-p6-cache-08 . . . . . . . . . . . 36
+ C.11. Since draft-ietf-httpbis-p6-cache-09 . . . . . . . . . . . 36
+ C.12. Since draft-ietf-httpbis-p6-cache-10 . . . . . . . . . . . 37
+ Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 4]
+
+Internet-Draft HTTP/1.1, Part 6 August 2010
+
+
+1. Introduction
+
+ HTTP is typically used for distributed information systems, where
+ performance can be improved by the use of response caches. This
+ document defines aspects of HTTP/1.1 related to caching and reusing
+ response messages.
+
+1.1. Purpose
+
+ An HTTP cache is a local store of response messages and the subsystem
+ that controls its message storage, retrieval, and deletion. A cache
+ stores cacheable responses in order to reduce the response time and
+ network bandwidth consumption on future, equivalent requests. Any
+ client or server MAY employ a cache, though a cache cannot be used by
+ a server that is acting as a tunnel.
+
+ Caching would be useless if it did not significantly improve
+ performance. The goal of caching in HTTP/1.1 is to reuse a prior
+ response message to satisfy a current request. In some cases, a
+ stored response can be reused without the need for a network request,
+ reducing latency and network round-trips; a "freshness" mechanism is
+ used for this purpose (see Section 2.3). Even when a new request is
+ required, it is often possible to reuse all or parts of the payload
+ of a prior response to satisfy the request, thereby reducing network
+ bandwidth usage; a "validation" mechanism is used for this purpose
+ (see Section 2.4).
+
+1.2. Terminology
+
+ This specification uses a number of terms to refer to the roles
+ played by participants in, and objects of, HTTP caching.
+
+ cacheable
+
+ A response is cacheable if a cache is allowed to store a copy of
+ the response message for use in answering subsequent requests.
+ Even when a response is cacheable, there might be additional
+ constraints on whether a cache can use the cached copy to satisfy
+ a particular request.
+
+ explicit expiration time
+
+ The time at which the origin server intends that a representation
+ no longer be returned by a cache without further validation.
+
+
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 5]
+
+Internet-Draft HTTP/1.1, Part 6 August 2010
+
+
+ heuristic expiration time
+
+ An expiration time assigned by a cache when no explicit expiration
+ time is available.
+
+ age
+
+ The age of a response is the time since it was sent by, or
+ successfully validated with, the origin server.
+
+ first-hand
+
+ A response is first-hand if the freshness model is not in use;
+ i.e., its age is 0.
+
+ freshness lifetime
+
+ The length of time between the generation of a response and its
+ expiration time.
+
+ fresh
+
+ A response is fresh if its age has not yet exceeded its freshness
+ lifetime.
+
+ stale
+
+ A response is stale if its age has passed its freshness lifetime
+ (either explicit or heuristic).
+
+ validator
+
+ A protocol element (e.g., an entity-tag or a Last-Modified time)
+ that is used to find out whether a stored response has an
+ equivalent copy of a representation.
+
+ shared cache
+
+ A cache that is accessible to more than one user. A non-shared
+ cache is dedicated to a single user.
+
+1.3. Requirements
+
+ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
+ "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
+ document are to be interpreted as described in [RFC2119].
+
+ An implementation is not compliant if it fails to satisfy one or more
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 6]
+
+Internet-Draft HTTP/1.1, Part 6 August 2010
+
+
+ of the "MUST" or "REQUIRED" level requirements for the protocols it
+ implements. An implementation that satisfies all the "MUST" or
+ "REQUIRED" level and all the "SHOULD" level requirements for its
+ protocols is said to be "unconditionally compliant"; one that
+ satisfies all the "MUST" level requirements but not all the "SHOULD"
+ level requirements for its protocols is said to be "conditionally
+ compliant".
+
+1.4. Syntax Notation
+
+ This specification uses the ABNF syntax defined in Section 1.2 of
+ [Part1] (which extends the syntax defined in [RFC5234] with a list
+ rule). Appendix B shows the collected ABNF, with the list rule
+ expanded.
+
+ The following core rules are included by reference, as defined in
+ [RFC5234], Appendix B.1: ALPHA (letters), CR (carriage return), CRLF
+ (CR LF), CTL (controls), DIGIT (decimal 0-9), DQUOTE (double quote),
+ HEXDIG (hexadecimal 0-9/A-F/a-f), LF (line feed), OCTET (any 8-bit
+ sequence of data), SP (space), VCHAR (any visible USASCII character),
+ and WSP (whitespace).
+
+1.4.1. Core Rules
+
+ The core rules below are defined in Section 1.2.2 of [Part1]:
+
+ quoted-string = <quoted-string, defined in [Part1], Section 1.2.2>
+ token = <token, defined in [Part1], Section 1.2.2>
+ OWS = <OWS, defined in [Part1], Section 1.2.2>
+
+1.4.2. ABNF Rules defined in other Parts of the Specification
+
+ The ABNF rules below are defined in other parts:
+
+ field-name = <field-name, defined in [Part1], Section 3.2>
+ HTTP-date = <HTTP-date, defined in [Part1], Section 6.1>
+ port = <port, defined in [Part1], Section 2.6>
+ pseudonym = <pseudonym, defined in [Part1], Section 9.9>
+ uri-host = <uri-host, defined in [Part1], Section 2.6>
+
+2. Cache Operation
+
+2.1. Response Cacheability
+
+ A cache MUST NOT store a response to any request, unless:
+
+ o The request method is understood by the cache and defined as being
+ cacheable, and
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 7]
+
+Internet-Draft HTTP/1.1, Part 6 August 2010
+
+
+ o the response status code is understood by the cache, and
+
+ o the "no-store" cache directive (see Section 3.2) does not appear
+ in request or response headers, and
+
+ o the "private" cache response directive (see Section 3.2.2 does not
+ appear in the response, if the cache is shared, and
+
+ o the "Authorization" header (see Section 3.1 of [Part7]) does not
+ appear in the request, if the cache is shared, unless the response
+ explicitly allows it (see Section 2.6), and
+
+ o the response either:
+
+ * contains an Expires header (see Section 3.3), or
+
+ * contains a max-age response cache directive (see
+ Section 3.2.2), or
+
+ * contains a s-maxage response cache directive and the cache is
+ shared, or
+
+ * contains a Cache Control Extension (see Section 3.2.3) that
+ allows it to be cached, or
+
+ * has a status code that can be served with heuristic freshness
+ (see Section 2.3.1.1).
+
+ In this context, a cache has "understood" a request method or a
+ response status code if it recognises it and implements any cache-
+ specific behaviour. In particular, 206 Partial Content responses
+ cannot be cached by an implementation that does not handle partial
+ content (see Section 2.1.1).
+
+ Note that in normal operation, most caches will not store a response
+ that has neither a cache validator nor an explicit expiration time,
+ as such responses are not usually useful to store. However, caches
+ are not prohibited from storing such responses.
+
+2.1.1. Storing Partial and Incomplete Responses
+
+ A cache that receives an incomplete response (for example, with fewer
+ bytes of data than specified in a Content-Length header) can store
+ the response, but MUST treat it as a partial response [Part5].
+ Partial responses can be combined as described in Section 4 of
+ [Part5]; the result might be a full response or might still be
+ partial. A cache MUST NOT return a partial response to a client
+ without explicitly marking it as such using the 206 (Partial Content)
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 8]
+
+Internet-Draft HTTP/1.1, Part 6 August 2010
+
+
+ status code.
+
+ A cache that does not support the Range and Content-Range headers
+ MUST NOT store incomplete or partial responses.
+
+2.2. Constructing Responses from Caches
+
+ For a presented request, a cache MUST NOT return a stored response,
+ unless:
+
+ o The presented effective request URI (Section 4.3 of [Part1]) and
+ that of the stored response match, and
+
+ o the request method associated with the stored response allows it
+ to be used for the presented request, and
+
+ o selecting request-headers nominated by the stored response (if
+ any) match those presented (see Section 2.7), and
+
+ o the presented request and stored response are free from directives
+ that would prevent its use (see Section 3.2 and Section 3.4), and
+
+ o the stored response is either:
+
+ * fresh (see Section 2.3), or
+
+ * allowed to be served stale (see Section 2.3.3), or
+
+ * successfully validated (see Section 2.4).
+
+ When a stored response is used to satisfy a request without
+ validation, caches MUST include a single Age header field
+ (Section 3.1) in the response with a value equal to the stored
+ response's current_age; see Section 2.3.2.
+
+ Requests with methods that are unsafe (Section 7.1.1 of [Part2]) MUST
+ be written through the cache to the origin server; i.e., a cache must
+ not reply to such a request before having forwarded the request and
+ having received a corresponding response.
+
+ Also, note that unsafe requests might invalidate already stored
+ responses; see Section 2.5.
+
+ Caches MUST use the most recent response (as determined by the Date
+ header) when more than one suitable response is stored. They can
+ also forward a request with "Cache-Control: max-age=0" or "Cache-
+ Control: no-cache" to disambiguate which response to use.
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 9]
+
+Internet-Draft HTTP/1.1, Part 6 August 2010
+
+
+2.3. Freshness Model
+
+ When a response is "fresh" in the cache, it can be used to satisfy
+ subsequent requests without contacting the origin server, thereby
+ improving efficiency.
+
+ The primary mechanism for determining freshness is for an origin
+ server to provide an explicit expiration time in the future, using
+ either the Expires header (Section 3.3) or the max-age response cache
+ directive (Section 3.2.2). Generally, origin servers will assign
+ future explicit expiration times to responses in the belief that the
+ representation is not likely to change in a semantically significant
+ way before the expiration time is reached.
+
+ If an origin server wishes to force a cache to validate every
+ request, it can assign an explicit expiration time in the past to
+ indicate that the response is already stale. Compliant caches will
+ validate the cached response before reusing it for subsequent
+ requests.
+
+ Since origin servers do not always provide explicit expiration times,
+ HTTP caches MAY assign heuristic expiration times when explicit times
+ are not specified, employing algorithms that use other header values
+ (such as the Last-Modified time) to estimate a plausible expiration
+ time. The HTTP/1.1 specification does not provide specific
+ algorithms, but does impose worst-case constraints on their results.
+
+ The calculation to determine if a response is fresh is:
+
+ response_is_fresh = (freshness_lifetime > current_age)
+
+ The freshness_lifetime is defined in Section 2.3.1; the current_age
+ is defined in Section 2.3.2.
+
+ Additionally, clients might need to influence freshness calculation.
+ They can do this using several request cache directives, with the
+ effect of either increasing or loosening constraints on freshness.
+ See Section 3.2.1.
+
+ [[ISSUE-no-req-for-directives: there are not requirements directly
+ applying to cache-request-directives and freshness.]]
+
+ Note that freshness applies only to cache operation; it cannot be
+ used to force a user agent to refresh its display or reload a
+ resource. See Section 4 for an explanation of the difference between
+ caches and history mechanisms.
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 10]
+
+Internet-Draft HTTP/1.1, Part 6 August 2010
+
+
+2.3.1. Calculating Freshness Lifetime
+
+ A cache can calculate the freshness lifetime (denoted as
+ freshness_lifetime) of a response by using the first match of:
+
+ o If the cache is shared and the s-maxage response cache directive
+ (Section 3.2.2) is present, use its value, or
+
+ o If the max-age response cache directive (Section 3.2.2) is
+ present, use its value, or
+
+ o If the Expires response header (Section 3.3) is present, use its
+ value minus the value of the Date response header, or
+
+ o Otherwise, no explicit expiration time is present in the response.
+ A heuristic freshness lifetime might be applicable; see
+ Section 2.3.1.1.
+
+ Note that this calculation is not vulnerable to clock skew, since all
+ of the information comes from the origin server.
+
+2.3.1.1. Calculating Heuristic Freshness
+
+ If no explicit expiration time is present in a stored response that
+ has a status code whose definition allows heuristic freshness to be
+ used (including the following in Section 8 of [Part2]: 200, 203, 206,
+ 300, 301 and 410), a heuristic expiration time MAY be calculated.
+ Heuristics MUST NOT be used for response status codes that do not
+ explicitly allow it.
+
+ When a heuristic is used to calculate freshness lifetime, the cache
+ SHOULD attach a Warning header with a 113 warn-code to the response
+ if its current_age is more than 24 hours and such a warning is not
+ already present.
+
+ Also, if the response has a Last-Modified header (Section 6.6 of
+ [Part4]), the heuristic expiration value SHOULD be no more than some
+ fraction of the interval since that time. A typical setting of this
+ fraction might be 10%.
+
+ Note: RFC 2616 ([RFC2616], Section 13.9) required that caches do
+ not calculate heuristic freshness for URLs with query components
+ (i.e., those containing '?'). In practice, this has not been
+ widely implemented. Therefore, servers are encouraged to send
+ explicit directives (e.g., Cache-Control: no-cache) if they wish
+ to preclude caching.
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 11]
+
+Internet-Draft HTTP/1.1, Part 6 August 2010
+
+
+2.3.2. Calculating Age
+
+ HTTP/1.1 uses the Age response-header to convey the estimated age of
+ the response message when obtained from a cache. The Age field value
+ is the cache's estimate of the amount of time since the response was
+ generated or validated by the origin server. In essence, the Age
+ value is the sum of the time that the response has been resident in
+ each of the caches along the path from the origin server, plus the
+ amount of time it has been in transit along network paths.
+
+ The following data is used for the age calculation:
+
+ age_value
+
+ The term "age_value" denotes the value of the Age header
+ (Section 3.1), in a form appropriate for arithmetic operation; or
+ 0, if not available.
+
+ date_value
+
+ HTTP/1.1 requires origin servers to send a Date header, if
+ possible, with every response, giving the time at which the
+ response was generated. The term "date_value" denotes the value
+ of the Date header, in a form appropriate for arithmetic
+ operations. See Section 9.3 of [Part1] for the definition of the
+ Date header, and for requirements regarding responses without a
+ Date response header.
+
+ now
+
+ The term "now" means "the current value of the clock at the host
+ performing the calculation". Hosts that use HTTP, but especially
+ hosts running origin servers and caches, SHOULD use NTP
+ ([RFC1305]) or some similar protocol to synchronize their clocks
+ to a globally accurate time standard.
+
+ request_time
+
+ The current value of the clock at the host at the time the request
+ resulting in the stored response was made.
+
+ response_time
+
+ The current value of the clock at the host at the time the
+ response was received.
+
+ A response's age can be calculated in two entirely independent ways:
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 12]
+
+Internet-Draft HTTP/1.1, Part 6 August 2010
+
+
+ 1. the "apparent_age": response_time minus date_value, if the local
+ clock is reasonably well synchronized to the origin server's
+ clock. If the result is negative, the result is replaced by
+ zero.
+
+ 2. the "corrected_age_value", if all of the caches along the
+ response path implement HTTP/1.1; note this value MUST be
+ interpreted relative to the time the request was initiated, not
+ the time that the response was received.
+
+
+ apparent_age = max(0, response_time - date_value);
+
+ response_delay = response_time - request_time;
+ corrected_age_value = age_value + response_delay;
+
+ These are combined as
+
+ corrected_initial_age = max(apparent_age, corrected_age_value);
+
+ The current_age of a stored response can then be calculated by adding
+ the amount of time (in seconds) since the stored response was last
+ validated by the origin server to the corrected_initial_age.
+
+ resident_time = now - response_time;
+ current_age = corrected_initial_age + resident_time;
+
+2.3.3. Serving Stale Responses
+
+ A "stale" response is one that either has explicit expiry information
+ or is allowed to have heuristic expiry calculated, but is not fresh
+ according to the calculations in Section 2.3.
+
+ Caches MUST NOT return a stale response if it is prohibited by an
+ explicit in-protocol directive (e.g., by a "no-store" or "no-cache"
+ cache directive, a "must-revalidate" cache-response-directive, or an
+ applicable "s-maxage" or "proxy-revalidate" cache-response-directive;
+ see Section 3.2.2).
+
+ Caches SHOULD NOT return stale responses unless they are disconnected
+ (i.e., it cannot contact the origin server or otherwise find a
+ forward path) or otherwise explicitly allowed (e.g., the max-stale
+ request directive; see Section 3.2.1).
+
+ Stale responses SHOULD have a Warning header with the 110 warn-code
+ (see Section 3.6). Likewise, the 112 warn-code SHOULD be sent on
+ stale responses if the cache is disconnected.
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 13]
+
+Internet-Draft HTTP/1.1, Part 6 August 2010
+
+
+ If a cache receives a first-hand response (either an entire response,
+ or a 304 (Not Modified) response) that it would normally forward to
+ the requesting client, and the received response is no longer fresh,
+ the cache SHOULD forward it to the requesting client without adding a
+ new Warning (but without removing any existing Warning headers). A
+ cache SHOULD NOT attempt to validate a response simply because that
+ response became stale in transit.
+
+2.4. Validation Model
+
+ When a cache has one or more stored responses for a requested URI,
+ but cannot serve any of them (e.g., because they are not fresh, or
+ one cannot be selected; see Section 2.7), it can use the conditional
+ request mechanism [Part4] in the forwarded request to give the origin
+ server an opportunity to both select a valid stored response to be
+ used, and to update it. This process is known as "validating" or
+ "revalidating" the stored response.
+
+ When sending such a conditional request, the cache SHOULD add an If-
+ Modified-Since header whose value is that of the Last-Modified header
+ from the selected (see Section 2.7) stored response, if available.
+
+ Additionally, the cache SHOULD add an If-None-Match header whose
+ value is that of the ETag header(s) from all responses stored for the
+ requested URI, if present. However, if any of the stored responses
+ contains only partial content, its entity-tag SHOULD NOT be included
+ in the If-None-Match header field unless the request is for a range
+ that would be fully satisfied by that stored response.
+
+ A 304 (Not Modified) response status code indicates that the stored
+ response can be updated and reused; see Section 2.8.
+
+ A full response (i.e., one with a response body) indicates that none
+ of the stored responses nominated in the conditional request is
+ suitable. Instead, the full response SHOULD be used to satisfy the
+ request and MAY replace the stored response.
+
+ If a cache receives a 5xx response while attempting to validate a
+ response, it MAY either forward this response to the requesting
+ client, or act as if the server failed to respond. In the latter
+ case, it MAY return a previously stored response (see Section 2.3.3).
+
+2.5. Request Methods that Invalidate
+
+ Because unsafe methods (Section 7.1.1 of [Part2]) have the potential
+ for changing state on the origin server, intervening caches can use
+ them to keep their contents up-to-date.
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 14]
+
+Internet-Draft HTTP/1.1, Part 6 August 2010
+
+
+ The following HTTP methods MUST cause a cache to invalidate the
+ effective Request URI (Section 4.3 of [Part1]) as well as the URI(s)
+ in the Location and Content-Location headers (if present):
+
+ o PUT
+
+ o DELETE
+
+ o POST
+
+ An invalidation based on a URI from a Location or Content-Location
+ header MUST NOT be performed if the host part of that URI differs
+ from the host part in the effective request URI (Section 4.3 of
+ [Part1]). This helps prevent denial of service attacks.
+
+ A cache that passes through requests for methods it does not
+ understand SHOULD invalidate the effective request URI (Section 4.3
+ of [Part1]).
+
+ Here, "invalidate" means that the cache will either remove all stored
+ responses related to the effective request URI, or will mark these as
+ "invalid" and in need of a mandatory validation before they can be
+ returned in response to a subsequent request.
+
+ Note that this does not guarantee that all appropriate responses are
+ invalidated. For example, the request that caused the change at the
+ origin server might not have gone through the cache where a response
+ is stored.
+
+2.6. Shared Caching of Authenticated Responses
+
+ Shared caches MUST NOT use a cached response to a request with an
+ Authorization header (Section 3.1 of [Part7]) to satisfy any
+ subsequent request unless a cache directive that allows such
+ responses to be stored is present in the response.
+
+ In this specification, the following Cache-Control response
+ directives (Section 3.2.2) have such an effect: must-revalidate,
+ public, s-maxage.
+
+ Note that cached responses that contain the "must-revalidate" and/or
+ "s-maxage" response directives are not allowed to be served stale
+ (Section 2.3.3) by shared caches. In particular, a response with
+ either "max-age=0, must-revalidate" or "s-maxage=0" cannot be used to
+ satisfy a subsequent request without revalidating it on the origin
+ server.
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 15]
+
+Internet-Draft HTTP/1.1, Part 6 August 2010
+
+
+2.7. Caching Negotiated Responses
+
+ When a cache receives a request that can be satisfied by a stored
+ response that has a Vary header field (Section 3.5), it MUST NOT use
+ that response unless all of the selecting request-headers nominated
+ by the Vary header match in both the original request (i.e., that
+ associated with the stored response), and the presented request.
+
+ The selecting request-headers from two requests are defined to match
+ if and only if those in the first request can be transformed to those
+ in the second request by applying any of the following:
+
+ o adding or removing whitespace, where allowed in the header's
+ syntax
+
+ o combining multiple message-header fields with the same field name
+ (see Section 3.2 of [Part1])
+
+ o normalizing both header values in a way that is known to have
+ identical semantics, according to the header's specification
+ (e.g., re-ordering field values when order is not significant;
+ case-normalization, where values are defined to be case-
+ insensitive)
+
+ If (after any normalization that might take place) a header field is
+ absent from a request, it can only match another request if it is
+ also absent there.
+
+ A Vary header field-value of "*" always fails to match, and
+ subsequent requests to that resource can only be properly interpreted
+ by the origin server.
+
+ The stored response with matching selecting request-headers is known
+ as the selected response.
+
+ If no selected response is available, the cache MAY forward the
+ presented request to the origin server in a conditional request; see
+ Section 2.4.
+
+2.8. Combining Responses
+
+ When a cache receives a 304 (Not Modified) response or a 206 (Partial
+ Content) response (in this section, the "new" response"), it needs to
+ created an updated response by combining the stored response with the
+ new one, so that the updated response can be used to satisfy the
+ request, and potentially update the cached response.
+
+ If the new response contains an ETag, it identifies the stored
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 16]
+
+Internet-Draft HTTP/1.1, Part 6 August 2010
+
+
+ response to use. [[TODO-mention-CL: might need language about
+ Content-Location here]][[TODO-select-for-combine: Shouldn't this be
+ the selected response?]]
+
+ If the new response's status code is 206 (partial content), both the
+ stored and new responses MUST have validators, and those validators
+ MUST match using the strong comparison function (see Section 4 of
+ [Part4]). Otherwise, the responses MUST NOT be combined.
+
+ The stored response headers are used as those of the updated
+ response, except that
+
+ o any stored Warning headers with warn-code 1xx (see Section 3.6)
+ MUST be deleted.
+
+ o any stored Warning headers with warn-code 2xx MUST be retained.
+
+ o any other headers provided in the new response MUST replace all
+ instances of the corresponding headers from the stored response.
+
+ The updated response headers MUST be used to replace those of the
+ stored response in cache (unless the stored response is removed from
+ cache). In the case of a 206 response, the combined representation
+ MAY be stored.
+
+3. Header Field Definitions
+
+ This section defines the syntax and semantics of HTTP/1.1 header
+ fields related to caching.
+
+3.1. Age
+
+ The "Age" response-header field conveys the sender's estimate of the
+ amount of time since the response was generated or successfully
+ validated at the origin server. Age values are calculated as
+ specified in Section 2.3.2.
+
+ Age = "Age" ":" OWS Age-v
+ Age-v = delta-seconds
+
+ Age field-values are non-negative integers, representing time in
+ seconds.
+
+ delta-seconds = 1*DIGIT
+
+ If a cache receives a value larger than the largest positive integer
+ it can represent, or if any of its age calculations overflows, it
+ MUST transmit an Age header with a field-value of 2147483648 (2^31).
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 17]
+
+Internet-Draft HTTP/1.1, Part 6 August 2010
+
+
+ Caches SHOULD use an arithmetic type of at least 31 bits of range.
+
+ The presence of an Age header field in a response implies that a
+ response is not first-hand. However, the converse is not true, since
+ HTTP/1.0 caches might not implement the Age header field.
+
+3.2. Cache-Control
+
+ The "Cache-Control" general-header field is used to specify
+ directives for caches along the request/response chain. Such cache
+ directives are unidirectional in that the presence of a directive in
+ a request does not imply that the same directive is to be given in
+ the response.
+
+ HTTP/1.1 caches MUST obey the requirements of the Cache-Control
+ directives defined in this section. See Section 3.2.3 for
+ information about how Cache-Control directives defined elsewhere are
+ handled.
+
+ Note: HTTP/1.0 caches might not implement Cache-Control and might
+ only implement Pragma: no-cache (see Section 3.4).
+
+ Cache directives MUST be passed through by a proxy or gateway
+ application, regardless of their significance to that application,
+ since the directives might be applicable to all recipients along the
+ request/response chain. It is not possible to target a directive to
+ a specific cache.
+
+ Cache-Control = "Cache-Control" ":" OWS Cache-Control-v
+ Cache-Control-v = 1#cache-directive
+
+ cache-directive = cache-request-directive
+ / cache-response-directive
+
+ cache-extension = token [ "=" ( token / quoted-string ) ]
+
+3.2.1. Request Cache-Control Directives
+
+ cache-request-directive =
+ "no-cache"
+ / "no-store"
+ / "max-age" "=" delta-seconds
+ / "max-stale" [ "=" delta-seconds ]
+ / "min-fresh" "=" delta-seconds
+ / "no-transform"
+ / "only-if-cached"
+ / cache-extension
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 18]
+
+Internet-Draft HTTP/1.1, Part 6 August 2010
+
+
+ no-cache
+
+ The no-cache request directive indicates that a stored response
+ MUST NOT be used to satisfy the request without successful
+ validation on the origin server.
+
+ no-store
+
+ The no-store request directive indicates that a cache MUST NOT
+ store any part of either this request or any response to it. This
+ directive applies to both non-shared and shared caches. "MUST NOT
+ store" in this context means that the cache MUST NOT intentionally
+ store the information in non-volatile storage, and MUST make a
+ best-effort attempt to remove the information from volatile
+ storage as promptly as possible after forwarding it.
+
+ This directive is NOT a reliable or sufficient mechanism for
+ ensuring privacy. In particular, malicious or compromised caches
+ might not recognize or obey this directive, and communications
+ networks might be vulnerable to eavesdropping.
+
+ max-age
+
+ The max-age request directive indicates that the client is willing
+ to accept a response whose age is no greater than the specified
+ time in seconds. Unless the max-stale request directive is also
+ present, the client is not willing to accept a stale response.
+
+ max-stale
+
+ The max-stale request directive indicates that the client is
+ willing to accept a response that has exceeded its expiration
+ time. If max-stale is assigned a value, then the client is
+ willing to accept a response that has exceeded its expiration time
+ by no more than the specified number of seconds. If no value is
+ assigned to max-stale, then the client is willing to accept a
+ stale response of any age.
+
+ min-fresh
+
+ The min-fresh request directive indicates that the client is
+ willing to accept a response whose freshness lifetime is no less
+ than its current age plus the specified time in seconds. That is,
+ the client wants a response that will still be fresh for at least
+ the specified number of seconds.
+
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 19]
+
+Internet-Draft HTTP/1.1, Part 6 August 2010
+
+
+ no-transform
+
+ The no-transform request directive indicates that an intermediate
+ cache or proxy MUST NOT change the Content-Encoding, Content-Range
+ or Content-Type request headers, nor the request representation.
+
+ only-if-cached
+
+ The only-if-cached request directive indicates that the client
+ only wishes to return a stored response. If it receives this
+ directive, a cache SHOULD either respond using a stored response
+ that is consistent with the other constraints of the request, or
+ respond with a 504 (Gateway Timeout) status code. If a group of
+ caches is being operated as a unified system with good internal
+ connectivity, such a request MAY be forwarded within that group of
+ caches.
+
+3.2.2. Response Cache-Control Directives
+
+ cache-response-directive =
+ "public"
+ / "private" [ "=" DQUOTE 1#field-name DQUOTE ]
+ / "no-cache" [ "=" DQUOTE 1#field-name DQUOTE ]
+ / "no-store"
+ / "no-transform"
+ / "must-revalidate"
+ / "proxy-revalidate"
+ / "max-age" "=" delta-seconds
+ / "s-maxage" "=" delta-seconds
+ / cache-extension
+
+ public
+
+ The public response directive indicates that the response MAY be
+ cached, even if it would normally be non-cacheable or cacheable
+ only within a non-shared cache. (See also Authorization, Section
+ 3.1 of [Part7], for additional details.)
+
+ private
+
+ The private response directive indicates that the response message
+ is intended for a single user and MUST NOT be stored by a shared
+ cache. A private (non-shared) cache MAY store the response.
+
+ If the private response directive specifies one or more field-
+ names, this requirement is limited to the field-values associated
+ with the listed response headers. That is, the specified field-
+ names(s) MUST NOT be stored by a shared cache, whereas the
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 20]
+
+Internet-Draft HTTP/1.1, Part 6 August 2010
+
+
+ remainder of the response message MAY be.
+
+ Note: This usage of the word private only controls where the
+ response can be stored; it cannot ensure the privacy of the
+ message content. Also, private response directives with field-
+ names are often handled by implementations as if an unqualified
+ private directive was received; i.e., the special handling for the
+ qualified form is not widely implemented.
+
+ no-cache
+
+ The no-cache response directive indicates that the response MUST
+ NOT be used to satisfy a subsequent request without successful
+ validation on the origin server. This allows an origin server to
+ prevent a cache from using it to satisfy a request without
+ contacting it, even by caches that have been configured to return
+ stale responses.
+
+ If the no-cache response directive specifies one or more field-
+ names, this requirement is limited to the field-values associated
+ with the listed response headers. That is, the specified field-
+ name(s) MUST NOT be sent in the response to a subsequent request
+ without successful validation on the origin server. This allows
+ an origin server to prevent the re-use of certain header fields in
+ a response, while still allowing caching of the rest of the
+ response.
+
+ Note: Most HTTP/1.0 caches will not recognize or obey this
+ directive. Also, no-cache response directives with field-names
+ are often handled by implementations as if an unqualified no-cache
+ directive was received; i.e., the special handling for the
+ qualified form is not widely implemented.
+
+ no-store
+
+ The no-store response directive indicates that a cache MUST NOT
+ store any part of either the immediate request or response. This
+ directive applies to both non-shared and shared caches. "MUST NOT
+ store" in this context means that the cache MUST NOT intentionally
+ store the information in non-volatile storage, and MUST make a
+ best-effort attempt to remove the information from volatile
+ storage as promptly as possible after forwarding it.
+
+ This directive is NOT a reliable or sufficient mechanism for
+ ensuring privacy. In particular, malicious or compromised caches
+ might not recognize or obey this directive, and communications
+ networks might be vulnerable to eavesdropping.
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 21]
+
+Internet-Draft HTTP/1.1, Part 6 August 2010
+
+
+ must-revalidate
+
+ The must-revalidate response directive indicates that once it has
+ become stale, the response MUST NOT be used to satisfy subsequent
+ requests without successful validation on the origin server.
+
+ The must-revalidate directive is necessary to support reliable
+ operation for certain protocol features. In all circumstances an
+ HTTP/1.1 cache MUST obey the must-revalidate directive; in
+ particular, if the cache cannot reach the origin server for any
+ reason, it MUST generate a 504 (Gateway Timeout) response.
+
+ Servers SHOULD send the must-revalidate directive if and only if
+ failure to validate a request on the representation could result
+ in incorrect operation, such as a silently unexecuted financial
+ transaction.
+
+ proxy-revalidate
+
+ The proxy-revalidate response directive has the same meaning as
+ the must-revalidate response directive, except that it does not
+ apply to non-shared caches.
+
+ max-age
+
+ The max-age response directive indicates that response is to be
+ considered stale after its age is greater than the specified
+ number of seconds.
+
+ s-maxage
+
+ The s-maxage response directive indicates that, in shared caches,
+ the maximum age specified by this directive overrides the maximum
+ age specified by either the max-age directive or the Expires
+ header. The s-maxage directive also implies the semantics of the
+ proxy-revalidate response directive.
+
+ no-transform
+
+ The no-transform response directive indicates that an intermediate
+ cache or proxy MUST NOT change the Content-Encoding, Content-Range
+ or Content-Type response headers, nor the response representation.
+
+3.2.3. Cache Control Extensions
+
+ The Cache-Control header field can be extended through the use of one
+ or more cache-extension tokens, each with an optional value.
+ Informational extensions (those that do not require a change in cache
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 22]
+
+Internet-Draft HTTP/1.1, Part 6 August 2010
+
+
+ behavior) can be added without changing the semantics of other
+ directives. Behavioral extensions are designed to work by acting as
+ modifiers to the existing base of cache directives. Both the new
+ directive and the standard directive are supplied, such that
+ applications that do not understand the new directive will default to
+ the behavior specified by the standard directive, and those that
+ understand the new directive will recognize it as modifying the
+ requirements associated with the standard directive. In this way,
+ extensions to the cache-control directives can be made without
+ requiring changes to the base protocol.
+
+ This extension mechanism depends on an HTTP cache obeying all of the
+ cache-control directives defined for its native HTTP-version, obeying
+ certain extensions, and ignoring all directives that it does not
+ understand.
+
+ For example, consider a hypothetical new response directive called
+ "community" that acts as a modifier to the private directive. We
+ define this new directive to mean that, in addition to any non-shared
+ cache, any cache that is shared only by members of the community
+ named within its value may cache the response. An origin server
+ wishing to allow the UCI community to use an otherwise private
+ response in their shared cache(s) could do so by including
+
+ Cache-Control: private, community="UCI"
+
+ A cache seeing this header field will act correctly even if the cache
+ does not understand the community cache-extension, since it will also
+ see and understand the private directive and thus default to the safe
+ behavior.
+
+ Unrecognized cache directives MUST be ignored; it is assumed that any
+ cache directive likely to be unrecognized by an HTTP/1.1 cache will
+ be combined with standard directives (or the response's default
+ cacheability) such that the cache behavior will remain minimally
+ correct even if the cache does not understand the extension(s).
+
+ The HTTP Cache Directive Registry defines the name space for the
+ cache directives.
+
+ Registrations MUST include the following fields:
+
+ o Cache Directive Name
+
+ o Pointer to specification text
+
+ Values to be added to this name space are subject to IETF review
+ ([RFC5226], Section 4.1).
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 23]
+
+Internet-Draft HTTP/1.1, Part 6 August 2010
+
+
+ The registry itself is maintained at
+ <http://www.iana.org/assignments/http-cache-directives>.
+
+3.3. Expires
+
+ The "Expires" header field gives the date/time after which the
+ response is considered stale. See Section 2.3 for further discussion
+ of the freshness model.
+
+ The presence of an Expires field does not imply that the original
+ resource will change or cease to exist at, before, or after that
+ time.
+
+ The field-value is an absolute date and time as defined by HTTP-date
+ in Section 6.1 of [Part1]; it MUST be sent in rfc1123-date format.
+
+ Expires = "Expires" ":" OWS Expires-v
+ Expires-v = HTTP-date
+
+ For example
+
+ Expires: Thu, 01 Dec 1994 16:00:00 GMT
+
+ Note: If a response includes a Cache-Control field with the max-
+ age directive (see Section 3.2.2), that directive overrides the
+ Expires field. Likewise, the s-maxage directive overrides Expires
+ in shared caches.
+
+ HTTP/1.1 servers SHOULD NOT send Expires dates more than one year in
+ the future.
+
+ HTTP/1.1 clients and caches MUST treat other invalid date formats,
+ especially including the value "0", as in the past (i.e., "already
+ expired").
+
+3.4. Pragma
+
+ The "Pragma" general-header field is used to include implementation-
+ specific directives that might apply to any recipient along the
+ request/response chain. All pragma directives specify optional
+ behavior from the viewpoint of the protocol; however, some systems
+ MAY require that behavior be consistent with the directives.
+
+ Pragma = "Pragma" ":" OWS Pragma-v
+ Pragma-v = 1#pragma-directive
+ pragma-directive = "no-cache" / extension-pragma
+ extension-pragma = token [ "=" ( token / quoted-string ) ]
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 24]
+
+Internet-Draft HTTP/1.1, Part 6 August 2010
+
+
+ When the no-cache directive is present in a request message, an
+ application SHOULD forward the request toward the origin server even
+ if it has a cached copy of what is being requested. This pragma
+ directive has the same semantics as the no-cache response directive
+ (see Section 3.2.2) and is defined here for backward compatibility
+ with HTTP/1.0. Clients SHOULD include both header fields when a no-
+ cache request is sent to a server not known to be HTTP/1.1 compliant.
+ HTTP/1.1 caches SHOULD treat "Pragma: no-cache" as if the client had
+ sent "Cache-Control: no-cache".
+
+ Note: Because the meaning of "Pragma: no-cache" as a response-
+ header field is not actually specified, it does not provide a
+ reliable replacement for "Cache-Control: no-cache" in a response.
+
+ This mechanism is deprecated; no new Pragma directives will be
+ defined in HTTP.
+
+3.5. Vary
+
+ The "Vary" response-header field conveys the set of request-header
+ fields that were used to select the representation.
+
+ Caches use this information, in part, to determine whether a stored
+ response can be used to satisfy a given request; see Section 2.7.
+ determines, while the response is fresh, whether a cache is permitted
+ to use the response to reply to a subsequent request without
+ validation; see Section 2.7.
+
+ In uncacheable or stale responses, the Vary field value advises the
+ user agent about the criteria that were used to select the
+ representation.
+
+ Vary = "Vary" ":" OWS Vary-v
+ Vary-v = "*" / 1#field-name
+
+ The set of header fields named by the Vary field value is known as
+ the selecting request-headers.
+
+ Servers SHOULD include a Vary header field with any cacheable
+ response that is subject to server-driven negotiation. Doing so
+ allows a cache to properly interpret future requests on that resource
+ and informs the user agent about the presence of negotiation on that
+ resource. A server MAY include a Vary header field with a non-
+ cacheable response that is subject to server-driven negotiation,
+ since this might provide the user agent with useful information about
+ the dimensions over which the response varies at the time of the
+ response.
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 25]
+
+Internet-Draft HTTP/1.1, Part 6 August 2010
+
+
+ A Vary field value of "*" signals that unspecified parameters not
+ limited to the request-headers (e.g., the network address of the
+ client), play a role in the selection of the response representation;
+ therefore, a cache cannot determine whether this response is
+ appropriate. The "*" value MUST NOT be generated by a proxy server.
+
+ The field-names given are not limited to the set of standard request-
+ header fields defined by this specification. Field names are case-
+ insensitive.
+
+3.6. Warning
+
+ The "Warning" general-header field is used to carry additional
+ information about the status or transformation of a message that
+ might not be reflected in the message. This information is typically
+ used to warn about possible incorrectness introduced by caching
+ operations or transformations applied to the payload of the message.
+
+ Warnings can be used for other purposes, both cache-related and
+ otherwise. The use of a warning, rather than an error status code,
+ distinguishes these responses from true failures.
+
+ Warning headers can in general be applied to any message, however
+ some warn-codes are specific to caches and can only be applied to
+ response messages.
+
+ Warning = "Warning" ":" OWS Warning-v
+ Warning-v = 1#warning-value
+
+ warning-value = warn-code SP warn-agent SP warn-text
+ [SP warn-date]
+
+ warn-code = 3DIGIT
+ warn-agent = ( uri-host [ ":" port ] ) / pseudonym
+ ; the name or pseudonym of the server adding
+ ; the Warning header, for use in debugging
+ warn-text = quoted-string
+ warn-date = DQUOTE HTTP-date DQUOTE
+
+ Multiple warnings can be attached to a response (either by the origin
+ server or by a cache), including multiple warnings with the same code
+ number, only differing in warn-text.
+
+ When this occurs, the user agent SHOULD inform the user of as many of
+ them as possible, in the order that they appear in the response.
+
+ Systems that generate multiple Warning headers SHOULD order them with
+ this user agent behavior in mind. New Warning headers SHOULD be
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 26]
+
+Internet-Draft HTTP/1.1, Part 6 August 2010
+
+
+ added after any existing Warning headers.
+
+ Warnings are assigned three digit warn-codes. The first digit
+ indicates whether the Warning is required to be deleted from a stored
+ response after validation:
+
+ o 1xx Warnings describe the freshness or validation status of the
+ response, and so MUST be deleted by caches after validation. They
+ can only be generated by a cache when validating a cached entry,
+ and MUST NOT be generated in any other situation.
+
+ o 2xx Warnings describe some aspect of the representation that is
+ not rectified by a validation (for example, a lossy compression of
+ the representation) and MUST NOT be deleted by caches after
+ validation, unless a full response is returned, in which case they
+ MUST be.
+
+ If an implementation sends a message with one or more Warning headers
+ to a receiver whose version is HTTP/1.0 or lower, then the sender
+ MUST include in each warning-value a warn-date that matches the Date
+ header in the message.
+
+ If an implementation receives a message with a warning-value that
+ includes a warn-date, and that warn-date is different from the Date
+ value in the response, then that warning-value MUST be deleted from
+ the message before storing, forwarding, or using it. (preventing the
+ consequences of naive caching of Warning header fields.) If all of
+ the warning-values are deleted for this reason, the Warning header
+ MUST be deleted as well.
+
+ The following warn-codes are defined by this specification, each with
+ a recommended warn-text in English, and a description of its meaning.
+
+ 110 Response is stale
+
+ SHOULD be included whenever the returned response is stale.
+
+ 111 Revalidation failed
+
+ SHOULD be included if a cache returns a stale response because an
+ attempt to validate the response failed, due to an inability to
+ reach the server.
+
+ 112 Disconnected operation
+
+ SHOULD be included if the cache is intentionally disconnected from
+ the rest of the network for a period of time.
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 27]
+
+Internet-Draft HTTP/1.1, Part 6 August 2010
+
+
+ 113 Heuristic expiration
+
+ SHOULD be included if the cache heuristically chose a freshness
+ lifetime greater than 24 hours and the response's age is greater
+ than 24 hours.
+
+ 199 Miscellaneous warning
+
+ The warning text can include arbitrary information to be presented
+ to a human user, or logged. A system receiving this warning MUST
+ NOT take any automated action, besides presenting the warning to
+ the user.
+
+ 214 Transformation applied
+
+ MUST be added by an intermediate proxy if it applies any
+ transformation to the representation, such as changing the
+ content-coding, media-type, or modifying the representation data,
+ unless this Warning code already appears in the response.
+
+ 299 Miscellaneous persistent warning
+
+ The warning text can include arbitrary information to be presented
+ to a human user, or logged. A system receiving this warning MUST
+ NOT take any automated action.
+
+4. History Lists
+
+ User agents often have history mechanisms, such as "Back" buttons and
+ history lists, that can be used to redisplay a representation
+ retrieved earlier in a session.
+
+ The freshness model (Section 2.3) does not necessarily apply to
+ history mechanisms. I.e., a history mechanism can display a previous
+ representation even if it has expired.
+
+ This does not prohibit the history mechanism from telling the user
+ that a view might be stale, or from honoring cache directives (e.g.,
+ Cache-Control: no-store).
+
+5. IANA Considerations
+
+5.1. Cache Directive Registry
+
+ The registration procedure for HTTP Cache Directives is defined by
+ Section 3.2.3 of this document.
+
+ The HTTP Cache Directive Registry shall be created at
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 28]
+
+Internet-Draft HTTP/1.1, Part 6 August 2010
+
+
+ <http://www.iana.org/assignments/http-cache-directives> and be
+ populated with the registrations below:
+
+ +------------------------+------------------------------+
+ | Cache Directive | Reference |
+ +------------------------+------------------------------+
+ | max-age | Section 3.2.1, Section 3.2.2 |
+ | max-stale | Section 3.2.1 |
+ | min-fresh | Section 3.2.1 |
+ | must-revalidate | Section 3.2.2 |
+ | no-cache | Section 3.2.1, Section 3.2.2 |
+ | no-store | Section 3.2.1, Section 3.2.2 |
+ | no-transform | Section 3.2.1, Section 3.2.2 |
+ | only-if-cached | Section 3.2.1 |
+ | private | Section 3.2.2 |
+ | proxy-revalidate | Section 3.2.2 |
+ | public | Section 3.2.2 |
+ | s-maxage | Section 3.2.2 |
+ | stale-if-error | [RFC5861], Section 4 |
+ | stale-while-revalidate | [RFC5861], Section 3 |
+ +------------------------+------------------------------+
+
+5.2. Header Field Registration
+
+ The Message Header Field Registry located at <http://www.iana.org/
+ assignments/message-headers/message-header-index.html> shall be
+ updated with the permanent registrations below (see [RFC3864]):
+
+ +-------------------+----------+----------+-------------+
+ | Header Field Name | Protocol | Status | Reference |
+ +-------------------+----------+----------+-------------+
+ | Age | http | standard | Section 3.1 |
+ | Cache-Control | http | standard | Section 3.2 |
+ | Expires | http | standard | Section 3.3 |
+ | Pragma | http | standard | Section 3.4 |
+ | Vary | http | standard | Section 3.5 |
+ | Warning | http | standard | Section 3.6 |
+ +-------------------+----------+----------+-------------+
+
+ The change controller is: "IETF (iesg@ietf.org) - Internet
+ Engineering Task Force".
+
+6. Security Considerations
+
+ Caches expose additional potential vulnerabilities, since the
+ contents of the cache represent an attractive target for malicious
+ exploitation. Because cache contents persist after an HTTP request
+ is complete, an attack on the cache can reveal information long after
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 29]
+
+Internet-Draft HTTP/1.1, Part 6 August 2010
+
+
+ a user believes that the information has been removed from the
+ network. Therefore, cache contents need to be protected as sensitive
+ information.
+
+7. Acknowledgments
+
+ Much of the content and presentation of the caching design is due to
+ suggestions and comments from individuals including: Shel Kaphan,
+ Paul Leach, Koen Holtman, David Morris, and Larry Masinter.
+
+8. References
+
+8.1. Normative References
+
+ [Part1] Fielding, R., Ed., Gettys, J., Mogul, J., Frystyk, H.,
+ Masinter, L., Leach, P., Berners-Lee, T., Lafon, Y., Ed.,
+ and J. Reschke, Ed., "HTTP/1.1, part 1: URIs, Connections,
+ and Message Parsing", draft-ietf-httpbis-p1-messaging-11
+ (work in progress), August 2010.
+
+ [Part2] Fielding, R., Ed., Gettys, J., Mogul, J., Frystyk, H.,
+ Masinter, L., Leach, P., Berners-Lee, T., Lafon, Y., Ed.,
+ and J. Reschke, Ed., "HTTP/1.1, part 2: Message
+ Semantics", draft-ietf-httpbis-p2-semantics-11 (work in
+ progress), August 2010.
+
+ [Part4] Fielding, R., Ed., Gettys, J., Mogul, J., Frystyk, H.,
+ Masinter, L., Leach, P., Berners-Lee, T., Lafon, Y., Ed.,
+ and J. Reschke, Ed., "HTTP/1.1, part 4: Conditional
+ Requests", draft-ietf-httpbis-p4-conditional-11 (work in
+ progress), August 2010.
+
+ [Part5] Fielding, R., Ed., Gettys, J., Mogul, J., Frystyk, H.,
+ Masinter, L., Leach, P., Berners-Lee, T., Lafon, Y., Ed.,
+ and J. Reschke, Ed., "HTTP/1.1, part 5: Range Requests and
+ Partial Responses", draft-ietf-httpbis-p5-range-11 (work
+ in progress), August 2010.
+
+ [Part7] Fielding, R., Ed., Gettys, J., Mogul, J., Frystyk, H.,
+ Masinter, L., Leach, P., Berners-Lee, T., Lafon, Y., Ed.,
+ and J. Reschke, Ed., "HTTP/1.1, part 7: Authentication",
+ draft-ietf-httpbis-p7-auth-11 (work in progress),
+ August 2010.
+
+ [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
+ Requirement Levels", BCP 14, RFC 2119, March 1997.
+
+ [RFC5234] Crocker, D., Ed. and P. Overell, "Augmented BNF for Syntax
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 30]
+
+Internet-Draft HTTP/1.1, Part 6 August 2010
+
+
+ Specifications: ABNF", STD 68, RFC 5234, January 2008.
+
+8.2. Informative References
+
+ [RFC1305] Mills, D., "Network Time Protocol (Version 3)
+ Specification, Implementation", RFC 1305, March 1992.
+
+ [RFC2616] Fielding, R., Gettys, J., Mogul, J., Frystyk, H.,
+ Masinter, L., Leach, P., and T. Berners-Lee, "Hypertext
+ Transfer Protocol -- HTTP/1.1", RFC 2616, June 1999.
+
+ [RFC3864] Klyne, G., Nottingham, M., and J. Mogul, "Registration
+ Procedures for Message Header Fields", BCP 90, RFC 3864,
+ September 2004.
+
+ [RFC5226] Narten, T. and H. Alvestrand, "Guidelines for Writing an
+ IANA Considerations Section in RFCs", BCP 26, RFC 5226,
+ May 2008.
+
+ [RFC5861] Nottingham, M., "HTTP Cache-Control Extensions for Stale
+ Content", RFC 5861, April 2010.
+
+Appendix A. Changes from RFC 2616
+
+ Make the specified age calculation algorithm less conservative.
+ (Section 2.3.2)
+
+ Remove requirement to consider Content-Location in successful
+ responses in order to determine the appropriate response to use.
+ (Section 2.4)
+
+ Clarify denial of service attack avoidance requirement.
+ (Section 2.5)
+
+ Do not mention RFC 2047 encoding and multiple languages in Warning
+ headers anymore, as these aspects never were implemented.
+ (Section 3.6)
+
+Appendix B. Collected ABNF
+
+ Age = "Age:" OWS Age-v
+ Age-v = delta-seconds
+
+ Cache-Control = "Cache-Control:" OWS Cache-Control-v
+ Cache-Control-v = *( "," OWS ) cache-directive *( OWS "," [ OWS
+ cache-directive ] )
+
+ Expires = "Expires:" OWS Expires-v
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 31]
+
+Internet-Draft HTTP/1.1, Part 6 August 2010
+
+
+ Expires-v = HTTP-date
+
+ HTTP-date = <HTTP-date, defined in [Part1], Section 6.1>
+
+ OWS = <OWS, defined in [Part1], Section 1.2.2>
+
+ Pragma = "Pragma:" OWS Pragma-v
+ Pragma-v = *( "," OWS ) pragma-directive *( OWS "," [ OWS
+ pragma-directive ] )
+
+ Vary = "Vary:" OWS Vary-v
+ Vary-v = "*" / ( *( "," OWS ) field-name *( OWS "," [ OWS field-name
+ ] ) )
+
+ Warning = "Warning:" OWS Warning-v
+ Warning-v = *( "," OWS ) warning-value *( OWS "," [ OWS warning-value
+ ] )
+
+ cache-directive = cache-request-directive / cache-response-directive
+ cache-extension = token [ "=" ( token / quoted-string ) ]
+ cache-request-directive = "no-cache" / "no-store" / ( "max-age="
+ delta-seconds ) / ( "max-stale" [ "=" delta-seconds ] ) / (
+ "min-fresh=" delta-seconds ) / "no-transform" / "only-if-cached" /
+ cache-extension
+ cache-response-directive = "public" / ( "private" [ "=" DQUOTE *( ","
+ OWS ) field-name *( OWS "," [ OWS field-name ] ) DQUOTE ] ) / (
+ "no-cache" [ "=" DQUOTE *( "," OWS ) field-name *( OWS "," [ OWS
+ field-name ] ) DQUOTE ] ) / "no-store" / "no-transform" /
+ "must-revalidate" / "proxy-revalidate" / ( "max-age=" delta-seconds
+ ) / ( "s-maxage=" delta-seconds ) / cache-extension
+
+ delta-seconds = 1*DIGIT
+
+ extension-pragma = token [ "=" ( token / quoted-string ) ]
+
+ field-name = <field-name, defined in [Part1], Section 3.2>
+
+ port = <port, defined in [Part1], Section 2.6>
+ pragma-directive = "no-cache" / extension-pragma
+ pseudonym = <pseudonym, defined in [Part1], Section 9.9>
+
+ quoted-string = <quoted-string, defined in [Part1], Section 1.2.2>
+
+ token = <token, defined in [Part1], Section 1.2.2>
+
+ uri-host = <uri-host, defined in [Part1], Section 2.6>
+
+ warn-agent = ( uri-host [ ":" port ] ) / pseudonym
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 32]
+
+Internet-Draft HTTP/1.1, Part 6 August 2010
+
+
+ warn-code = 3DIGIT
+ warn-date = DQUOTE HTTP-date DQUOTE
+ warn-text = quoted-string
+ warning-value = warn-code SP warn-agent SP warn-text [ SP warn-date
+ ]
+
+ ABNF diagnostics:
+
+ ; Age defined but not used
+ ; Cache-Control defined but not used
+ ; Expires defined but not used
+ ; Pragma defined but not used
+ ; Vary defined but not used
+ ; Warning defined but not used
+
+Appendix C. Change Log (to be removed by RFC Editor before publication)
+
+C.1. Since RFC2616
+
+ Extracted relevant partitions from [RFC2616].
+
+C.2. Since draft-ietf-httpbis-p6-cache-00
+
+ Closed issues:
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/9>: "Trailer"
+ (<http://purl.org/NET/http-errata#trailer-hop>)
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/12>: "Invalidation
+ after Update or Delete"
+ (<http://purl.org/NET/http-errata#invalidupd>)
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/35>: "Normative and
+ Informative references"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/48>: "Date reference
+ typo"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/49>: "Connection
+ header text"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/65>: "Informative
+ references"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/66>: "ISO-8859-1
+ Reference"
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 33]
+
+Internet-Draft HTTP/1.1, Part 6 August 2010
+
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/86>: "Normative up-
+ to-date references"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/87>: "typo in
+ 13.2.2"
+
+ Other changes:
+
+ o Use names of RFC4234 core rules DQUOTE and HTAB (work in progress
+ on <http://tools.ietf.org/wg/httpbis/trac/ticket/36>)
+
+C.3. Since draft-ietf-httpbis-p6-cache-01
+
+ Closed issues:
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/82>: "rel_path not
+ used"
+
+ Other changes:
+
+ o Get rid of duplicate BNF rule names ("host" -> "uri-host") (work
+ in progress on <http://tools.ietf.org/wg/httpbis/trac/ticket/36>)
+
+ o Add explicit references to BNF syntax and rules imported from
+ other parts of the specification.
+
+C.4. Since draft-ietf-httpbis-p6-cache-02
+
+ Ongoing work on IANA Message Header Registration
+ (<http://tools.ietf.org/wg/httpbis/trac/ticket/40>):
+
+ o Reference RFC 3984, and update header registrations for headers
+ defined in this document.
+
+C.5. Since draft-ietf-httpbis-p6-cache-03
+
+ Closed issues:
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/106>: "Vary header
+ classification"
+
+C.6. Since draft-ietf-httpbis-p6-cache-04
+
+ Ongoing work on ABNF conversion
+ (<http://tools.ietf.org/wg/httpbis/trac/ticket/36>):
+
+ o Use "/" instead of "|" for alternatives.
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 34]
+
+Internet-Draft HTTP/1.1, Part 6 August 2010
+
+
+ o Introduce new ABNF rules for "bad" whitespace ("BWS"), optional
+ whitespace ("OWS") and required whitespace ("RWS").
+
+ o Rewrite ABNFs to spell out whitespace rules, factor out header
+ value format definitions.
+
+C.7. Since draft-ietf-httpbis-p6-cache-05
+
+ This is a total rewrite of this part of the specification.
+
+ Affected issues:
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/54>: "Definition of
+ 1xx Warn-Codes"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/60>: "Placement of
+ 13.5.1 and 13.5.2"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/138>: "The role of
+ Warning and Semantic Transparency in Caching"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/139>: "Methods and
+ Caching"
+
+ In addition: Final work on ABNF conversion
+ (<http://tools.ietf.org/wg/httpbis/trac/ticket/36>):
+
+ o Add appendix containing collected and expanded ABNF, reorganize
+ ABNF introduction.
+
+C.8. Since draft-ietf-httpbis-p6-cache-06
+
+ Closed issues:
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/161>: "base for
+ numeric protocol elements"
+
+ Affected issues:
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/37>: Vary and non-
+ existant headers
+
+C.9. Since draft-ietf-httpbis-p6-cache-07
+
+ Closed issues:
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/54>: "Definition of
+ 1xx Warn-Codes"
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 35]
+
+Internet-Draft HTTP/1.1, Part 6 August 2010
+
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/167>: "Content-
+ Location on 304 responses"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/169>: "private and
+ no-cache CC directives with headers"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/187>: "RFC2047 and
+ warn-text"
+
+C.10. Since draft-ietf-httpbis-p6-cache-08
+
+ Closed issues:
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/147>: "serving
+ negotiated responses from cache: header-specific canonicalization"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/197>: "Effect of CC
+ directives on history lists"
+
+ Affected issues:
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/199>: Status codes
+ and caching
+
+ Partly resolved issues:
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/60>: "Placement of
+ 13.5.1 and 13.5.2"
+
+C.11. Since draft-ietf-httpbis-p6-cache-09
+
+ Closed issues:
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/29>: "Age
+ calculation"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/168>: "Clarify
+ differences between / requirements for request and response CC
+ directives"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/174>: "Caching
+ authenticated responses"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/208>: "IANA registry
+ for cache-control directives"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/211>: "Heuristic
+ caching of URLs with query components"
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 36]
+
+Internet-Draft HTTP/1.1, Part 6 August 2010
+
+
+ Partly resolved issues:
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/196>: "Term for the
+ requested resource's URI"
+
+C.12. Since draft-ietf-httpbis-p6-cache-10
+
+ Closed issues:
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/109>: "Clarify
+ entity / representation / variant terminology"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/220>: "consider
+ removing the 'changes from 2068' sections"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/223>: "Allowing
+ heuristic caching for new status codes"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/223>: "Allowing
+ heuristic caching for new status codes"
+
+ o Clean up TODOs and prose in "Combining Responses."
+
+Index
+
+ A
+ age 6
+ Age header 17
+
+ C
+ cache 5
+ Cache Directives
+ max-age 19, 22
+ max-stale 19
+ min-fresh 19
+ must-revalidate 22
+ no-cache 19, 21
+ no-store 19, 21
+ no-transform 20, 22
+ only-if-cached 20
+ private 20
+ proxy-revalidate 22
+ public 20
+ s-maxage 22
+ Cache-Control header 18
+ cacheable 5
+
+ E
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 37]
+
+Internet-Draft HTTP/1.1, Part 6 August 2010
+
+
+ Expires header 24
+ explicit expiration time 5
+
+ F
+ first-hand 6
+ fresh 6
+ freshness lifetime 6
+
+ G
+ Grammar
+ Age 17
+ Age-v 17
+ Cache-Control 18
+ Cache-Control-v 18
+ cache-extension 18
+ cache-request-directive 18
+ cache-response-directive 20
+ delta-seconds 17
+ Expires 24
+ Expires-v 24
+ extension-pragma 24
+ Pragma 24
+ pragma-directive 24
+ Pragma-v 24
+ Vary 25
+ Vary-v 25
+ warn-agent 26
+ warn-code 26
+ warn-date 26
+ warn-text 26
+ Warning 26
+ Warning-v 26
+ warning-value 26
+
+ H
+ Headers
+ Age 17
+ Cache-Control 18
+ Expires 24
+ Pragma 24
+ Vary 25
+ Warning 26
+ heuristic expiration time 5
+
+ M
+ max-age
+ Cache Directive 19, 22
+ max-stale
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 38]
+
+Internet-Draft HTTP/1.1, Part 6 August 2010
+
+
+ Cache Directive 19
+ min-fresh
+ Cache Directive 19
+ must-revalidate
+ Cache Directive 22
+
+ N
+ no-cache
+ Cache Directive 19, 21
+ no-store
+ Cache Directive 19, 21
+ no-transform
+ Cache Directive 20, 22
+
+ O
+ only-if-cached
+ Cache Directive 20
+
+ P
+ Pragma header 24
+ private
+ Cache Directive 20
+ proxy-revalidate
+ Cache Directive 22
+ public
+ Cache Directive 20
+
+ S
+ s-maxage
+ Cache Directive 22
+ stale 6
+
+ V
+ validator 6
+ Vary header 25
+
+ W
+ Warning header 26
+
+
+
+
+
+
+
+
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 39]
+
+Internet-Draft HTTP/1.1, Part 6 August 2010
+
+
+Authors' Addresses
+
+ Roy T. Fielding (editor)
+ Day Software
+ 23 Corporate Plaza DR, Suite 280
+ Newport Beach, CA 92660
+ USA
+
+ Phone: +1-949-706-5300
+ Fax: +1-949-706-5305
+ EMail: fielding@gbiv.com
+ URI: http://roy.gbiv.com/
+
+
+ Jim Gettys
+ Alcatel-Lucent Bell Labs
+ 21 Oak Knoll Road
+ Carlisle, MA 01741
+ USA
+
+ EMail: jg@freedesktop.org
+ URI: http://gettys.wordpress.com/
+
+
+ Jeffrey C. Mogul
+ Hewlett-Packard Company
+ HP Labs, Large Scale Systems Group
+ 1501 Page Mill Road, MS 1177
+ Palo Alto, CA 94304
+ USA
+
+ EMail: JeffMogul@acm.org
+
+
+ Henrik Frystyk Nielsen
+ Microsoft Corporation
+ 1 Microsoft Way
+ Redmond, WA 98052
+ USA
+
+ EMail: henrikn@microsoft.com
+
+
+
+
+
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 40]
+
+Internet-Draft HTTP/1.1, Part 6 August 2010
+
+
+ Larry Masinter
+ Adobe Systems, Incorporated
+ 345 Park Ave
+ San Jose, CA 95110
+ USA
+
+ EMail: LMM@acm.org
+ URI: http://larry.masinter.net/
+
+
+ Paul J. Leach
+ Microsoft Corporation
+ 1 Microsoft Way
+ Redmond, WA 98052
+
+ EMail: paulle@microsoft.com
+
+
+ Tim Berners-Lee
+ World Wide Web Consortium
+ MIT Computer Science and Artificial Intelligence Laboratory
+ The Stata Center, Building 32
+ 32 Vassar Street
+ Cambridge, MA 02139
+ USA
+
+ EMail: timbl@w3.org
+ URI: http://www.w3.org/People/Berners-Lee/
+
+
+ Yves Lafon (editor)
+ World Wide Web Consortium
+ W3C / ERCIM
+ 2004, rte des Lucioles
+ Sophia-Antipolis, AM 06902
+ France
+
+ EMail: ylafon@w3.org
+ URI: http://www.raubacapeu.net/people/yves/
+
+
+ Mark Nottingham (editor)
+
+ EMail: mnot@mnot.net
+ URI: http://www.mnot.net/
+
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 41]
+
+Internet-Draft HTTP/1.1, Part 6 August 2010
+
+
+ Julian F. Reschke (editor)
+ greenbytes GmbH
+ Hafenweg 16
+ Muenster, NW 48155
+ Germany
+
+ Phone: +49 251 2807760
+ Fax: +49 251 2807761
+ EMail: julian.reschke@greenbytes.de
+ URI: http://greenbytes.de/tech/webdav/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 42]
+
diff --git a/vendor/sabre/dav/docs/draft-nottingham-http-new-status-04.txt b/vendor/sabre/dav/docs/draft-nottingham-http-new-status-04.txt
new file mode 100644
index 000000000..37d6808c3
--- /dev/null
+++ b/vendor/sabre/dav/docs/draft-nottingham-http-new-status-04.txt
@@ -0,0 +1,560 @@
+
+
+
+Network Working Group M. Nottingham
+Internet-Draft Rackspace
+Updates: 2616 (if approved) R. Fielding
+Intended status: Standards Track Adobe
+Expires: August 7, 2012 February 4, 2012
+
+
+ Additional HTTP Status Codes
+ draft-nottingham-http-new-status-04
+
+Abstract
+
+ This document specifies additional HyperText Transfer Protocol (HTTP)
+ status codes for a variety of common situations.
+
+Editorial Note (To be removed by RFC Editor before publication)
+
+ Distribution of this document is unlimited. Although this is not a
+ work item of the HTTPbis Working Group, comments should be sent to
+ the Hypertext Transfer Protocol (HTTP) mailing list at
+ ietf-http-wg@w3.org [1], which may be joined by sending a message
+ with subject "subscribe" to ietf-http-wg-request@w3.org [2].
+
+ Discussions of the HTTPbis Working Group are archived at
+ <http://lists.w3.org/Archives/Public/ietf-http-wg/>.
+
+Status of this Memo
+
+ This Internet-Draft is submitted in full conformance with the
+ provisions of BCP 78 and BCP 79.
+
+ Internet-Drafts are working documents of the Internet Engineering
+ Task Force (IETF). Note that other groups may also distribute
+ working documents as Internet-Drafts. The list of current Internet-
+ Drafts is at http://datatracker.ietf.org/drafts/current/.
+
+ Internet-Drafts are draft documents valid for a maximum of six months
+ and may be updated, replaced, or obsoleted by other documents at any
+ time. It is inappropriate to use Internet-Drafts as reference
+ material or to cite them other than as "work in progress."
+
+ This Internet-Draft will expire on August 7, 2012.
+
+Copyright Notice
+
+ Copyright (c) 2012 IETF Trust and the persons identified as the
+ document authors. All rights reserved.
+
+
+
+
+Nottingham & Fielding Expires August 7, 2012 [Page 1]
+
+Internet-Draft Additional HTTP Status Codes February 2012
+
+
+ This document is subject to BCP 78 and the IETF Trust's Legal
+ Provisions Relating to IETF Documents
+ (http://trustee.ietf.org/license-info) in effect on the date of
+ publication of this document. Please review these documents
+ carefully, as they describe your rights and restrictions with respect
+ to this document. Code Components extracted from this document must
+ include Simplified BSD License text as described in Section 4.e of
+ the Trust Legal Provisions and are provided without warranty as
+ described in the Simplified BSD License.
+
+
+Table of Contents
+
+ 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 3
+ 2. Requirements . . . . . . . . . . . . . . . . . . . . . . . . . 3
+ 3. 428 Precondition Required . . . . . . . . . . . . . . . . . . . 3
+ 4. 429 Too Many Requests . . . . . . . . . . . . . . . . . . . . . 4
+ 5. 431 Request Header Fields Too Large . . . . . . . . . . . . . . 4
+ 6. 511 Network Authentication Required . . . . . . . . . . . . . . 5
+ 7. Security Considerations . . . . . . . . . . . . . . . . . . . . 6
+ 8. IANA Considerations . . . . . . . . . . . . . . . . . . . . . . 7
+ 9. References . . . . . . . . . . . . . . . . . . . . . . . . . . 8
+ 9.1. Normative References . . . . . . . . . . . . . . . . . . . 8
+ 9.2. Informative References . . . . . . . . . . . . . . . . . . 8
+ Appendix A. Acknowledgements . . . . . . . . . . . . . . . . . . . 8
+ Appendix B. Issues Raised by Captive Portals . . . . . . . . . . . 8
+ Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . . 9
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Nottingham & Fielding Expires August 7, 2012 [Page 2]
+
+Internet-Draft Additional HTTP Status Codes February 2012
+
+
+1. Introduction
+
+ This document specifies additional HTTP [RFC2616] status codes for a
+ variety of common situations, to improve interoperability and avoid
+ confusion when other, less precise status codes are used.
+
+ Note that these status codes are optional; servers cannot be required
+ to support them. However, because clients will treat unknown status
+ codes as a generic error of the same class (e.g., 499 is treated as
+ 400 if it is not recognized), they can be safely deployed by existing
+ servers (see [RFC2616] Section 6.1.1 for more information).
+
+
+2. Requirements
+
+ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
+ "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
+ document are to be interpreted as described in [RFC2119].
+
+
+3. 428 Precondition Required
+
+ The 428 status code indicates that the origin server requires the
+ request to be conditional.
+
+ Its typical use is to avoid the "lost update" problem, where a client
+ GETs a resource's state, modifies it, and PUTs it back to the server,
+ when meanwhile a third party has modified the state on the server,
+ leading to a conflict. By requiring requests to be conditional, the
+ server can assure that clients are working with the correct copies.
+
+ Responses using this status code SHOULD explain how to resubmit the
+ request successfully. For example:
+
+ HTTP/1.1 428 Precondition Required
+ Content-Type: text/html
+
+ <html>
+ <head>
+ <title>Precondition Required</title>
+ </head>
+ <body>
+ <h1>Precondition Required</h1>
+ <p>This request is required to be conditional;
+ try using "If-Match".</p>
+ </body>
+ </html>
+
+
+
+
+Nottingham & Fielding Expires August 7, 2012 [Page 3]
+
+Internet-Draft Additional HTTP Status Codes February 2012
+
+
+ Responses with the 428 status code MUST NOT be stored by a cache.
+
+
+4. 429 Too Many Requests
+
+ The 429 status code indicates that the user has sent too many
+ requests in a given amount of time ("rate limiting").
+
+ The response representations SHOULD include details explaining the
+ condition, and MAY include a Retry-After header indicating how long
+ to wait before making a new request.
+
+ For example:
+
+ HTTP/1.1 429 Too Many Requests
+ Content-Type: text/html
+ Retry-After: 3600
+
+ <html>
+ <head>
+ <title>Too Many Requests</title>
+ </head>
+ <body>
+ <h1>Too Many Requests</h1>
+ <p>I only allow 50 requests per hour to this Web site per
+ logged in user. Try again soon.</p>
+ </body>
+ </html>
+
+ Note that this specification does not define how the origin server
+ identifies the user, nor how it counts requests. For example, an
+ origin server that is limiting request rates can do so based upon
+ counts of requests on a per-resource basis, across the entire server,
+ or even among a set of servers. Likewise, it might identify the user
+ by its authentication credentials, or a stateful cookie.
+
+ Responses with the 429 status code MUST NOT be stored by a cache.
+
+
+5. 431 Request Header Fields Too Large
+
+ The 431 status code indicates that the server is unwilling to process
+ the request because its header fields are too large. The request MAY
+ be resubmitted after reducing the size of the request header fields.
+
+ It can be used both when the set of request header fields in total
+ are too large, and when a single header field is at fault. In the
+ latter case, the response representation SHOULD specify which header
+
+
+
+Nottingham & Fielding Expires August 7, 2012 [Page 4]
+
+Internet-Draft Additional HTTP Status Codes February 2012
+
+
+ field was too large.
+
+ For example:
+
+ HTTP/1.1 431 Request Header Fields Too Large
+ Content-Type: text/html
+
+ <html>
+ <head>
+ <title>Request Header Fields Too Large</title>
+ </head>
+ <body>
+ <h1>Request Header Fields Too Large</h1>
+ <p>The "Example" header was too large.</p>
+ </body>
+ </html>
+
+ Responses with the 431 status code MUST NOT be stored by a cache.
+
+
+6. 511 Network Authentication Required
+
+ The 511 status code indicates that the client needs to authenticate
+ to gain network access.
+
+ The response representation SHOULD contain a link to a resource that
+ allows the user to submit credentials (e.g. with a HTML form).
+
+ Note that the 511 response SHOULD NOT contain a challenge or the
+ login interface itself, because browsers would show the login
+ interface as being associated with the originally requested URL,
+ which may cause confusion.
+
+ The 511 status SHOULD NOT be generated by origin servers; it is
+ intended for use by intercepting proxies that are interposed as a
+ means of controlling access to the network.
+
+ Responses with the 511 status code MUST NOT be stored by a cache.
+
+6.1. The 511 Status Code and Captive Portals
+
+ The 511 status code is designed to mitigate problems caused by
+ "captive portals" to software (especially non-browser agents) that is
+ expecting a response from the server that a request was made to, not
+ the intervening network infrastructure. It is not intended to
+ encouraged deployment of captive portals, only to limit the damage
+ caused by them.
+
+
+
+
+Nottingham & Fielding Expires August 7, 2012 [Page 5]
+
+Internet-Draft Additional HTTP Status Codes February 2012
+
+
+ A network operator wishing to require some authentication, acceptance
+ of terms or other user interaction before granting access usually
+ does so by identifing clients who have not done so ("unknown
+ clients") using their MAC addresses.
+
+ Unknown clients then have all traffic blocked, except for that on TCP
+ port 80, which is sent to a HTTP server (the "login server")
+ dedicated to "logging in" unknown clients, and of course traffic to
+ the login server itself.
+
+ For example, a user agent might connect to a network and make the
+ following HTTP request on TCP port 80:
+
+ GET /index.htm HTTP/1.1
+ Host: www.example.com
+
+ Upon receiving such a request, the login server would generate a 511
+ response:
+
+ HTTP/1.1 511 Network Authentication Required
+ Content-Type: text/html
+
+ <html>
+ <head>
+ <title>Network Authentication Required</title>
+ <meta http-equiv="refresh"
+ content="0; url=https://login.example.net/">
+ </head>
+ <body>
+ <p>You need to <a href="https://login.example.net/">
+ authenticate with the local network</a> in order to gain
+ access.</p>
+ </body>
+ </html>
+
+ Here, the 511 status code assures that non-browser clients will not
+ interpret the response as being from the origin server, and the META
+ HTML element redirects the user agent to the login server.
+
+
+7. Security Considerations
+
+7.1. 428 Precondition Required
+
+ The 428 status code is optional; clients cannot rely upon its use to
+ prevent "lost update" conflicts.
+
+
+
+
+
+Nottingham & Fielding Expires August 7, 2012 [Page 6]
+
+Internet-Draft Additional HTTP Status Codes February 2012
+
+
+7.2. 429 Too Many Requests
+
+ When a server is under attack or just receiving a very large number
+ of requests from a single party, responding to each with a 429 status
+ code will consume resources.
+
+ Therefore, servers are not required to use the 429 status code; when
+ limiting resource usage, it may be more appropriate to just drop
+ connections, or take other steps.
+
+7.3. 431 Request Header Fields Too Large
+
+ Servers are not required to use the 431 status code; when under
+ attack, it may be more appropriate to just drop connections, or take
+ other steps.
+
+7.4. 511 Network Authentication Required
+
+ In common use, a response carrying the 511 status code will not come
+ from the origin server indicated in the request's URL. This presents
+ many security issues; e.g., an attacking intermediary may be
+ inserting cookies into the original domain's name space, may be
+ observing cookies or HTTP authentication credentials sent from the
+ user agent, and so on.
+
+ However, these risks are not unique to the 511 status code; in other
+ words, a captive portal that is not using this status code introduces
+ the same issues.
+
+ Also, note that captive portals using this status code on an SSL or
+ TLS connection (commonly, port 443) will generate a certificate error
+ on the client.
+
+
+8. IANA Considerations
+
+ The HTTP Status Codes Registry should be updated with the following
+ entries:
+
+ o Code: 428
+ o Description: Precondition Required
+ o Specification: [ this document ]
+
+ o Code: 429
+ o Description: Too Many Requests
+ o Specification: [ this document ]
+
+
+
+
+
+Nottingham & Fielding Expires August 7, 2012 [Page 7]
+
+Internet-Draft Additional HTTP Status Codes February 2012
+
+
+ o Code: 431
+ o Description: Request Header Fields Too Large
+ o Specification: [ this document ]
+
+ o Code: 511
+ o Description: Network Authentication Required
+ o Specification: [ this document ]
+
+
+9. References
+
+9.1. Normative References
+
+ [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
+ Requirement Levels", BCP 14, RFC 2119, March 1997.
+
+ [RFC2616] Fielding, R., Gettys, J., Mogul, J., Frystyk, H.,
+ Masinter, L., Leach, P., and T. Berners-Lee, "Hypertext
+ Transfer Protocol -- HTTP/1.1", RFC 2616, June 1999.
+
+9.2. Informative References
+
+ [RFC4791] Daboo, C., Desruisseaux, B., and L. Dusseault,
+ "Calendaring Extensions to WebDAV (CalDAV)", RFC 4791,
+ March 2007.
+
+ [RFC4918] Dusseault, L., "HTTP Extensions for Web Distributed
+ Authoring and Versioning (WebDAV)", RFC 4918, June 2007.
+
+URIs
+
+ [1] <mailto:ietf-http-wg@w3.org>
+
+ [2] <mailto:ietf-http-wg-request@w3.org?subject=subscribe>
+
+
+Appendix A. Acknowledgements
+
+ Thanks to Jan Algermissen and Julian Reschke for their suggestions
+ and feedback.
+
+
+Appendix B. Issues Raised by Captive Portals
+
+ Since clients cannot differentiate between a portal's response and
+ that of the HTTP server that they intended to communicate with, a
+ number of issues arise. The 511 status code is intended to help
+ mitigate some of them.
+
+
+
+Nottingham & Fielding Expires August 7, 2012 [Page 8]
+
+Internet-Draft Additional HTTP Status Codes February 2012
+
+
+ One example is the "favicon.ico"
+ <http://en.wikipedia.org/wiki/Favicon> commonly used by browsers to
+ identify the site being accessed. If the favicon for a given site is
+ fetched from a captive portal instead of the intended site (e.g.,
+ because the user is unauthenticated), it will often "stick" in the
+ browser's cache (most implementations cache favicons aggressively)
+ beyond the portal session, so that it seems as if the portal's
+ favicon has "taken over" the legitimate site.
+
+ Another browser-based issue comes about when P3P
+ <http://www.w3.org/TR/P3P/> is supported. Depending on how it is
+ implemented, it's possible a browser might interpret a portal's
+ response for the p3p.xml file as the server's, resulting in the
+ privacy policy (or lack thereof) advertised by the portal being
+ interpreted as applying to the intended site. Other Web-based
+ protocols such as WebFinger
+ <http://code.google.com/p/webfinger/wiki/WebFingerProtocol>, CORS
+ <http://www.w3.org/TR/cors/> and OAuth
+ <http://tools.ietf.org/html/draft-ietf-oauth-v2> may also be
+ vulnerable to such issues.
+
+ Although HTTP is most widely used with Web browsers, a growing number
+ of non-browsing applications use it as a substrate protocol. For
+ example, WebDAV [RFC4918] and CalDAV [RFC4791] both use HTTP as the
+ basis (for remote authoring and calendaring, respectively). Using
+ these applications from behind a captive portal can result in
+ spurious errors being presented to the user, and might result in
+ content corruption, in extreme cases.
+
+ Similarly, other non-browser applications using HTTP can be affected
+ as well; e.g., widgets <http://www.w3.org/TR/widgets/>, software
+ updates, and other specialised software such as Twitter clients and
+ the iTunes Music Store.
+
+ It should be noted that it's sometimes believed that using HTTP
+ redirection to direct traffic to the portal addresses these issues.
+ However, since many of these uses "follow" redirects, this is not a
+ good solution.
+
+
+Authors' Addresses
+
+ Mark Nottingham
+ Rackspace
+
+ Email: mnot@mnot.net
+ URI: http://www.mnot.net/
+
+
+
+
+Nottingham & Fielding Expires August 7, 2012 [Page 9]
+
+Internet-Draft Additional HTTP Status Codes February 2012
+
+
+ Roy T. Fielding
+ Adobe Systems Incorporated
+ 345 Park Ave
+ San Jose, CA 95110
+ USA
+
+ Email: fielding@gbiv.com
+ URI: http://roy.gbiv.com/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Nottingham & Fielding Expires August 7, 2012 [Page 10]
+
diff --git a/vendor/sabre/dav/docs/rfc2425.txt b/vendor/sabre/dav/docs/rfc2425.txt
new file mode 100644
index 000000000..2e37e24a4
--- /dev/null
+++ b/vendor/sabre/dav/docs/rfc2425.txt
@@ -0,0 +1,1851 @@
+
+
+
+
+
+
+Network Working Group T. Howes
+Request for Comments: 2425 M. Smith
+Category: Standards Track Netscape Communications Corp.
+ F. Dawson
+ Lotus Development Corporation
+ September 1998
+
+
+ A MIME Content-Type for Directory Information
+
+Status of this Memo
+
+ This document specifies an Internet standards track protocol for the
+ Internet community, and requests discussion and suggestions for
+ improvements. Please refer to the current edition of the "Internet
+ Official Protocol Standards" (STD 1) for the standardization state
+ and status of this protocol. Distribution of this memo is unlimited.
+
+Copyright Notice
+
+ Copyright (C) The Internet Society (1998). All Rights Reserved.
+
+1. Abstract
+
+ This document defines a MIME Content-Type for holding directory
+ information. The definition is independent of any particular
+ directory service or protocol. The text/directory Content-Type is
+ defined for holding a variety of directory information, for example,
+ name, or email address, or logo. The text/directory Content-Type can
+ also be used as the root body part in a multipart/related Content-
+ Type for handling more complicated situations, especially those in
+ which non-textual information that already has a natural MIME
+ representation, for example, a photograph or sound, is to be
+ represented.
+
+ The text/directory Content-Type defines a general framework and
+ format for holding directory information in a simple "type:value"
+ form. We refer to "type" in this context meaning a property or
+ attribute with which the value is associated. Mechanisms are defined
+ to specify alternate languages, encodings and other meta-information.
+ This document also defines the procedure by which particular formats,
+ called profiles, for carrying application-specific information within
+ a text/directory Content-Type can be defined and registered, and the
+ conventions such formats must follow. It is expected that other
+ documents will be produced that define such formats for various
+ applications (e.g., white pages).
+
+
+
+
+
+Howes, et. al. Standards Track [Page 1]
+
+RFC 2425 MIME Content-Type for Directory Information September 1998
+
+
+ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
+ "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY" and "OPTIONAL" in this
+ document are to be interpreted as described in [RFC-2119].
+
+2. Table of Contents
+
+ Status of the Memo................................................ 1
+ Copyright Notice.................................................. 1
+ 1. Abstract...................................................... 1
+ 2. Table of Contents............................................. 2
+ 3. Need for a MIME Directory Type................................ 3
+ 4. Overview...................................................... 4
+ 5. The text/directory Content-Type............................... 4
+ 5.1. MIME media type name........................................ 4
+ 5.2. MIME subtype name........................................... 5
+ 5.3. Required parameters......................................... 5
+ 5.4. Optional parameters......................................... 5
+ 5.5. Encoding considerations..................................... 5
+ 5.6. Security considerations..................................... 6
+ 5.7. Interoperability considerations............................. 6
+ 5.8. Published specification..................................... 6
+ 5.8.1. Line delimiting and folding............................... 6
+ 5.8.2. ABNF content-type definition.............................. 7
+ 5.8.3. Pre-defined Parameters.................................... 9
+ 5.8.4. Pre-defined Value Types...................................11
+ 5.9. Applications which use this media type......................14
+ 5.10. Additional information.....................................14
+ 5.11. Person & email address to contact for further information..14
+ 5.12. Intended usage.............................................14
+ 5.13. Author/Change controller...................................15
+ 6. Predefined Types..............................................15
+ 6.1. SOURCE Type Definition......................................15
+ 6.2. NAME Type Definition........................................16
+ 6.3. PROFILE Type Definition.....................................16
+ 6.4. BEGIN Type Definition.......................................17
+ 6.5. END Type Definition.........................................17
+ 7. Use of the multipart/related Content-Type.....................18
+ 8. Examples.......................................................18
+ 8.1. Example 1...................................................19
+ 8.2. Example 2...................................................19
+ 8.3. Example 3...................................................20
+ 8.4. Example 4...................................................21
+ 9. Registration of new profiles..................................22
+ 9.1. Define the profile..........................................22
+ 9.2. Post the profile definition.................................23
+ 9.3. Allow a comment period......................................23
+ 9.4. Submit the profile for approval.............................23
+ 10. Profile Change Control.......................................23
+
+
+
+Howes, et. al. Standards Track [Page 2]
+
+RFC 2425 MIME Content-Type for Directory Information September 1998
+
+
+ 11. Registration of new types....................................24
+ 11.1. Define the type............................................24
+ 11.2. Post the type definition...................................25
+ 11.3. Allow a comment period.....................................25
+ 11.4. Submit the type for approval...............................25
+ 12. Type Change Control..........................................25
+ 13. Registration of new parameters...............................26
+ 13.1. Define the parameter.......................................26
+ 13.2. Post the parameter definition..............................27
+ 13.3. Allow a comment period.....................................27
+ 13.4. Submit the parameter for approval..........................27
+ 14. Parameter Change Control.....................................28
+ 15. Registration of new value types..............................28
+ 15.1. Define the value type......................................28
+ 15.2. Post the value type definition.............................29
+ 15.3. Allow a comment period.....................................29
+ 15.4. Submit the value type for approval.........................29
+ 16. Security Considerations......................................30
+ 17. Acknowledgements..............................................30
+ 18. References....................................................30
+ 19. Authors' Addresses...........................................32
+ 20. Full Copyright Statement......................................33
+
+3. Need for a MIME Directory Type
+
+ For purposes of this document, a directory is a special-purpose
+ database that contains typed information. A directory usually
+ supports both read and search of the information it contains, and can
+ support creation and modification of the information as well.
+ Directory information is usually accessed far more often than it is
+ updated. Directories can be local or global in scope. They can be
+ distributed or centralized. The information they contain can be
+ replicated, with weak or strong consistency requirements.
+
+ There are several situations in which users of Internet mail might
+ wish to exchange directory information: the email analogy of a
+ "business card" exchange; the conveyance of directory information to
+ a user having only email access to the Internet; the provision of
+ machine-parseable address information when purchasing goods or
+ services over the Internet; etc. As MIME [RFC-2045, RFC-2046] is
+ used increasingly by other protocols, most notably HTTP, it can also
+ be useful for these protocols to carry directory information in MIME
+ format. Such a format, for example, could be used to represent URC
+ (uniform resource characteristics) information about resources on the
+ World Wide Web, or to provide a rudimentary directory service over
+ HTTP.
+
+
+
+
+
+Howes, et. al. Standards Track [Page 3]
+
+RFC 2425 MIME Content-Type for Directory Information September 1998
+
+
+4. Overview
+
+ The scheme defined here for representing directory information in a
+ MIME Content-Type has two parts. First, the text/directory Content-
+ Type is defined for use in holding directory information within a
+ single body part, for example name, title, or email address. In its
+ simplest form, the format uses a "type:value" approach, which should
+ be easily parseable by existing MIME implementations and
+ understandable by users. More complicated situations can be
+ represented also. This document defines the general form the
+ information in the Content-Type should have, and the procedure by
+ which specific types and values (properties) for particular
+ applications can be defined. The framework is general enough to
+ handle information from any number of end directory services,
+ including LDAP [RFC-1777, RFC-1778], WHOIS++ [RFC-1835], and X.500
+ [X500].
+
+ Directory entries can include far more than just textual information.
+ Some such information (e.g., an image or sound) overlaps with
+ predefined MIME Content-Types. In these cases it can be desirable to
+ include the information in its well-known MIME format. This situation
+ is handled by using a multipart/related Content-Type as defined in
+ [RFC-2112]. The root component of this type is a text/directory body
+ part specifying any in-line information, and for information
+ contained in other Content-Types, the Content-IDs (in URI form) of
+ those parts.
+
+ In some applications, it can be useful to include a pointer (e.g, a
+ URI) to some directory information rather than the information
+ itself. This document defines a general mechanism for accomplishing
+ this.
+
+5. The text/directory Content-Type
+
+ The text/directory Content-Type is used to hold basic directory
+ information and URIs referencing other information, including other
+ MIME body parts holding supplementary or non-textual directory
+ information, such as an image or sound. It is defined as follows,
+ using the MIME media type registration template from [RFC-2048].
+
+ To: ietf-types@uninett.no
+ Subject: Registration of MIME media type text/directory
+
+5.1. MIME media type name
+
+ MIME media type name: text
+
+
+
+
+
+Howes, et. al. Standards Track [Page 4]
+
+RFC 2425 MIME Content-Type for Directory Information September 1998
+
+
+5.2. MIME subtype name
+
+ MIME subtype name: directory
+
+5.3. Required parameters
+
+ Required parameters: charset
+
+ The "charset" parameter is as defined in [RFC-2046] for other body
+ parts. It is used to identify the default character set used within
+ the body part.
+
+5.4. Optional parameters
+
+ Optional parameters: profile
+
+ The "profile" parameter is used to convey the type(s) of entity(ies)
+ to which the directory information pertains and the likely set of
+ information associated with the entity(ies). It is intended only as a
+ guide to applications interpreting the information contained within
+ the body part. It SHOULD NOT be used to exclude or require particular
+ pieces of information unless a profile definition specifically calls
+ for this behavior. Unless specifically forbidden by a particular
+ profile definition, a text/directory content type can contain
+ arbitrary attribute/value pairs.
+
+ The value of the "profile" parameter is defined as follows. Profile
+ names are case insensitive (i.e., the profile name "vCard" is the
+ same as "VCARD" and "vcard" and "vcArD").
+
+ profile = x-name / iana-token
+
+ x-name = "x-" 1*(ALPHA / DIGIT / "-")
+ ; Names beginning with "x-" or "X-" are
+ ; reserved for experimental use not intended for released
+ ; products, or for use in bilateral agreements.
+
+ iana-token = <a publicly-defined extension token, registered
+ with IANA, as specified in Section 9 of this
+ document>
+
+5.5. Encoding considerations
+
+ The default encoding is 8bit. Otherwise, as specified by the
+ Content-Transfer-Encoding header field.
+
+
+
+
+
+
+Howes, et. al. Standards Track [Page 5]
+
+RFC 2425 MIME Content-Type for Directory Information September 1998
+
+
+5.6. Security considerations
+
+ Directory information can be public or it can be protected from
+ unauthorized access by the directory service in which it resides.
+ Once the information leaves its native service, there can be no
+ guarantee that the same care will be taken by all services handling
+ the information. Furthermore, this specification defines no access
+ control mechanism by which information can be protected, or by which
+ access control information can be conveyed. Note that the integrity
+ and privacy of a text/directory body part can be protected by
+ enclosing it within an appropriate MIME-based security mechanism.
+
+5.7. Interoperability considerations
+
+ In order to make sense of directory information, applications must
+ share a common understanding of the types of information contained
+ within the Content-Type (the directory schema). This schema
+ information is not defined in this document, but rather in companion
+ documents (e.g., [MIME-VCARD]) that follow the requirements specified
+ in this document, or in bilateral agreements between communicating
+ parties.
+
+5.8. Published specification
+
+ The text/directory Content-Type contains directory information,
+ typically pertaining to a single directory entity or group of
+ entities. The content consists of one or more lines in the format
+ given below.
+
+5.8.1. Line delimiting and folding
+
+ Individual lines within the MIME text/directory Content Type body are
+ delimited by the [RFC-822] line break, which is a CRLF sequence
+ (ASCII decimal 13, followed by ASCII decimal 10). Long logical lines
+ of text can be split into a multiple-physical-line representation
+ using the following folding technique.
+
+ A logical line MAY be continued on the next physical line anywhere
+ between two characters by inserting a CRLF immediately followed by a
+ single white space character (space, ASCII decimal 32, or horizontal
+ tab, ASCII decimal 9). At least one character must be present on the
+ folded line. Any sequence of CRLF followed immediately by a single
+ white space character is ignored (removed) when processing the
+ content type. For example the line:
+
+ DESCRIPTION:This is a long description that exists on a long line.
+
+ Can be represented as:
+
+
+
+Howes, et. al. Standards Track [Page 6]
+
+RFC 2425 MIME Content-Type for Directory Information September 1998
+
+
+ DESCRIPTION:This is a long description
+ that exists on a long line.
+
+ It could also be represented as:
+
+ DESCRIPTION:This is a long descrip
+ tion that exists o
+ n a long line.
+
+ The process of moving from this folded multiple-line representation
+ of a type definition to its single line representation is called
+ unfolding. Unfolding is accomplished by regarding CRLF immediately
+ followed by a white space character (namely HTAB ASCII decimal 9 or
+ SPACE ASCII decimal 32) as equivalent to no characters at all (i.e.,
+ the CRLF and single white space character are removed).
+
+5.8.2. ABNF content-type definition
+
+ The following ABNF uses the notation of RFC 2234, which also defines
+ CRLF, WSP, DQUOTE, VCHAR, ALPHA, and DIGIT. After the unfolding of
+ any folded lines as described above, the syntax for a line of this
+ content type is as follows:
+
+ contentline = [group "."] name *(";" param) ":" value CRLF
+ ; When parsing a content line, folded lines MUST first
+ ; be unfolded according to the unfolding procedure
+ ; described above.
+ ; When generating a content line, lines longer than 75
+ ; characters SHOULD be folded according to the folding
+ ; procedure described above.
+
+ group = 1*(ALPHA / DIGIT / "-")
+
+ name = x-name / iana-token
+
+ iana-token = 1*(ALPHA / DIGIT / "-")
+ ; identifier registered with IANA
+
+ x-name = "x-" 1*(ALPHA / DIGIT / "-")
+ ; Names that begin with "x-" or "X-" are
+ ; reserved for experimental use, not intended for released
+ ; products, or for use in bilateral agreements.
+
+ param = param-name "=" param-value *("," param-value)
+
+ param-name = x-name / iana-token
+
+ param-value = ptext / quoted-string
+
+
+
+Howes, et. al. Standards Track [Page 7]
+
+RFC 2425 MIME Content-Type for Directory Information September 1998
+
+
+ ptext = *SAFE-CHAR
+
+ value = *VALUE-CHAR
+ / valuespec ; valuespec defined in section 5.8.4
+
+ quoted-string = DQUOTE *QSAFE-CHAR DQUOTE
+
+ NON-ASCII = %x80-FF
+ ; use restricted by charset parameter
+ ; on outer MIME object (UTF-8 preferred)
+
+ QSAFE-CHAR = WSP / %x21 / %x23-7E / NON-ASCII
+ ; Any character except CTLs, DQUOTE
+
+ SAFE-CHAR = WSP / %x21 / %x23-2B / %x2D-39 / %x3C-7E / NON-ASCII
+ ; Any character except CTLs, DQUOTE, ";", ":", ","
+
+ VALUE-CHAR = WSP / VCHAR / NON-ASCII
+ ; any textual character
+
+ A line that begins with a white space character is a continuation of
+ the previous line, as described above. The white space character and
+ immediately preceeding CRLF should be discarded when reconstructing
+ the original line. Note that this line-folding convention differs
+ from that found in RFC 822, in that the sequence <CRLF><WSP> found
+ anywhere in the content indicates a continued line and should be
+ removed.
+
+ Various type names and the format of the corresponding values are
+ defined as specified in Section 11. Specifications MAY impose
+ ordering on the type constructs within a body part, though none is
+ required by default. The various x-name constructs are used for
+ bilaterally-agreed upon type names, parameter names and parameter
+ values, or for use in experimental settings.
+
+ Type names and parameter names are case insensitive (e.g., the type
+ name "fn" is the same as "FN" and "Fn"). Parameter values MAY be case
+ sensitive or case insensitive, depending on their definition.
+
+ The group construct is used to group related attributes together.
+ The group name is a syntactic convention used to indicate that all
+ type names prefaced with the same group name SHOULD be grouped
+ together when displayed by an application. It has no other
+ significance. Implementations that do not understand or support
+ grouping MAY simply strip off any text before a "." to the left of
+ the type name and present the types and values as normal.
+
+
+
+
+
+Howes, et. al. Standards Track [Page 8]
+
+RFC 2425 MIME Content-Type for Directory Information September 1998
+
+
+ Each attribute defined in the text/directory body MAY have multiple
+ values, if allowed in the definition of the profile in which the
+ attribute is used. The general rule for encoding multi-valued items
+ is to simply create a new content line for each value (including the
+ type name). However, it should be noted that some value types
+ support encoding multiple values in a single content line by
+ separating the values with a comma ",". This approach has been taken
+ for several of the content types defined below (date, time, integer,
+ float), for space-saving reasons.
+
+5.8.3. Pre-defined Parameters
+
+ The following parameters and value types are defined for general use.
+
+ predefined-param = encodingparm
+ / valuetypeparm
+ / languageparm
+ / contextparm
+
+ encodingparm = "encoding" "=" encodingtype
+
+ encodingtype = "b" ; from RFC 2047
+ / iana-token ; registered as described in
+ ; section 15 of this document
+
+ valuetypeparm = "value" "=" valuetype
+
+ valuetype = "uri" ; genericurl from secion 5 of RFC 1738
+ / "text"
+ / "date"
+ / "time"
+ / "date-time" ; date time
+ / "integer"
+ / "boolean"
+ / "float"
+ / x-name
+ / iana-token ; registered as described in
+ ; section 15 of this document
+
+ languageparm = "language" "=" Language-Tag
+ ; Language-Tag is defined in section 2 of RFC 1766
+
+ contextparm = "context" "=" context
+
+ context = x-name
+ / iana-token
+
+
+
+
+
+Howes, et. al. Standards Track [Page 9]
+
+RFC 2425 MIME Content-Type for Directory Information September 1998
+
+
+ The "language" type parameter is used to identify data in multiple
+ languages. There is no concept of "default" language, except as
+ specified by any "Content-Language" MIME header parameter that is
+ present. The value of the "language" type parameter is a language
+ tag as defined in Section 2 of [RFC-1766].
+
+ The "context" type parameter is used to identify a context (e.g., a
+ protocol) used in interpreting the value. This is used, for example,
+ in the "source" type, defined below.
+
+ The "encoding" type parameter is used to specify an alternate
+ encoding for a value. If the value contains a CRLF, it must be
+ encoded, since CRLF is used to separate lines in the content-type
+ itself. Currently, only the "b" encoding is supported.
+
+ The "b" encoding can also be useful for binary values that are mixed
+ with other text information in the body part (e.g., a certificate).
+ Using a per-value "b" encoding in this case leaves the other
+ information in a more readable form. The encoded base 64 value can be
+ split across multiple physical lines in the content type by using the
+ line folding technique described above.
+
+ The Content-Transfer-Encoding header field is used to specify the
+ encoding used for the body part as a whole. The "encoding" type
+ parameter is used to specify an encoding for a particular value
+ (e.g., a certificate). In this case, the Content-Transfer-Encoding
+ header might specify "8bit", while the one certificate value might
+ specify an encoding of "b" via an "encoding=b" type parameter.
+
+ The Content-Transfer-Encoding and the encodings of individual types
+ given by the "encoding" type parameter are independent of one
+ another. When encoding a text/directory body part for transmission,
+ individual type encodings are performed first, then the entire body
+ part is encoded according to the Content-Transfer-Encoding. When
+ decoding a text/directory body part, the Content-Transfer-Encoding is
+ decoded first, and then any individual types with an "encoding" type
+ parameter are decoded.
+
+ The "value" parameter is optional, and is used to identify the value
+ type (data type) and format of the value. The use of these
+ predefined formats is encouraged even if the value parameter is not
+ explicity used. By defining a standard set of value types and their
+ formats, existing parsing and processing code can be leveraged.
+
+ Including the value type explicitly as part of each property provides
+ an extra hint to keep parsing simple and support more generalized
+ applications. For example a search engine would not have to know the
+ particular value types for all of the items for which it is
+
+
+
+Howes, et. al. Standards Track [Page 10]
+
+RFC 2425 MIME Content-Type for Directory Information September 1998
+
+
+ searching. Because the value type is explicit in the definition, the
+ search engine could look for dates in any item type and provide
+ results that can still be interpreted.
+
+5.8.4. Pre-defined Value Types
+
+ The format for values corresponding to the predefined valuetype
+ specifications given above are defined.
+
+ valuespec = text-list
+ / genericurl ; from section 5 of RFC 1738
+ / date-list
+ / time-list
+ / date-time-list
+ / boolean
+ / integer-list
+ / float-list
+ / iana-valuespec
+
+ text-list = *TEXT-LIST-CHAR *("," *TEXT-LIST-CHAR)
+
+ TEXT-LIST-CHAR = "\\" / "\," / "\n"
+ / <any VALUE-CHAR except , or \ or newline>
+ ; Backslashes, newlines, and commas must be encoded.
+ ; \n or \N can be used to encode a newline.
+
+ date-list = date *("," date)
+
+ time-list = time *("," time)
+
+ date-time-list = date "T" time *("," date "T" time)
+
+ boolean = "TRUE" / "FALSE"
+
+ integer-list = integer *("," integer)
+
+ integer = [sign] 1*DIGIT
+
+ float-list = float *("," float)
+
+ float = [sign] 1*DIGIT ["." 1*DIGIT]
+
+ sign = "+" / "-"
+
+ date = date-fullyear ["-"] date-month ["-"] date-mday
+
+ date-fullyear = 4 DIGIT
+
+
+
+
+Howes, et. al. Standards Track [Page 11]
+
+RFC 2425 MIME Content-Type for Directory Information September 1998
+
+
+ date-month = 2 DIGIT ;01-12
+
+ date-mday = 2 DIGIT ;01-28, 01-29, 01-30, 01-31
+ ;based on month/year
+
+ time = time-hour [":"] time-minute [":"] time-second [time-secfrac]
+ [time-zone]
+
+ time-hour = 2 DIGIT ;00-23
+
+ time-minute = 2 DIGIT ;00-59
+
+ time-second = 2 DIGIT ;00-60 (leap second)
+
+ time-secfrac = "," 1*DIGIT
+
+ time-zone = "Z" / time-numzone
+
+ time-numzome = sign time-hour [":"] time-minute
+
+ iana-valuespec = <a publicly-defined valuetype format, registered
+ with IANA, as defined in section 15 of this
+ document>
+
+ Some specific notes on the value types and formats:
+
+ "text": The "text" value type should be used to identify values that
+ contain human-readable text. The character set and language in which
+ the text is represented is controlled by the charset content-header
+ and the language type parameter and content-header.
+
+ Examples for "text":
+ this is a text value
+ this is one value,this is another
+ this is a single value\, with a comma encoded
+
+ A formatted text line break in a text value type MUST be represented
+ as the character sequence backslash (ASCII decimal 92) followed by a
+ Latin small letter n (ASCII decimal 110) or a Latin capital letter N
+ (ASCII decimal 78), that is "\n" or "\N".
+
+ For example a multiple line DESCRIPTION value of:
+
+ Mythical Manager
+ Hyjinx Software Division
+ BabsCo, Inc.
+
+ could be represented as:
+
+
+
+Howes, et. al. Standards Track [Page 12]
+
+RFC 2425 MIME Content-Type for Directory Information September 1998
+
+
+ DESCRIPTION:Mythical Manager\nHyjinx Software Division\n
+ BabsCo\, Inc.\n
+
+ demonstrating the \n literal formatted line break technique, the
+ CRLF-followed-by-space line folding technique, and the backslash
+ escape technique.
+
+ "uri": The "uri" value type should be used to identify values that
+ are referenced by a URI (including a Content-ID URI), instead of
+ encoded in-line. These value references might be used if the value is
+ too large, or otherwise undesirable to include directly. The format
+ for the URI is as defined in RFC 1738.
+
+ Examples for "uri":
+ http://www.foobar.com/my/picture.jpg
+ ldap://ldap.foobar.com/cn=babs%20jensen
+
+ "date", "time", and "date-time": Each of these value types is based
+ on a subset of the definitions in ISO 8601 standard. Profiles MAY
+ place further restrictions on "date" and "time" values. Multiple
+ "date" and "time" values can be specified using the comma-separated
+ notation, unless restricted by a profile.
+
+ Examples for "date":
+ 1985-04-12
+ 1996-08-05,1996-11-11
+ 19850412
+
+ Examples for "time":
+ 10:22:00
+ 102200
+ 10:22:00.33
+ 10:22:00.33Z
+ 10:22:33,11:22:00
+ 10:22:00-08:00
+
+ Examples for "date-time":
+ 1996-10-22T14:00:00Z
+ 1996-08-11T12:34:56Z
+ 19960811T123456Z
+ 1996-10-22T14:00:00Z,1996-08-11T12:34:56Z
+
+ "boolean": The "boolean" value type is used to express boolen values.
+ These values are case insensitive.
+
+ Examples: TRUE
+ false
+ True
+
+
+
+Howes, et. al. Standards Track [Page 13]
+
+RFC 2425 MIME Content-Type for Directory Information September 1998
+
+
+ "integer": The "integer" value type is used to express signed
+ integers in decimal format. If sign is not specified, the value is
+ assumed positive "+". Multiple "integer" values can be specified
+ using the comma-separated notation, unless restricted by a profile.
+
+ Examples: 1234567890
+ -1234556790
+ +1234556790,432109876
+
+ "float": The "float" value type is used to express real numbers. If
+ sign is not specified, the value is assumed positive "+". Multiple
+ "float" values can be specified using the comma-separated notation,
+ unless restricted by a profile.
+
+ Examples: 20.30
+ 1000000.0000001
+ 1.333,3.14
+
+5.9. Applications which use this media type
+
+ Applications which use this media type: Various
+
+5.10. Additional information
+
+ Additional information: None
+
+5.11. Person & email address to contact for further information
+
+ Tim Howes
+ Netscape Communications Corp.
+ 501 East Middlefield Rd.
+ Mountain View, CA 94041
+ USA
+ howes@netscape.com
+ +1 415 937 3419
+
+5.12. Intended usage
+
+ Intended usage: COMMON
+
+
+
+
+
+
+
+
+
+
+
+
+Howes, et. al. Standards Track [Page 14]
+
+RFC 2425 MIME Content-Type for Directory Information September 1998
+
+
+5.13. Author/Change controller
+
+ Tim Howes
+ Netscape Communications Corp.
+ 501 East Middlefield Rd.
+ Mountain View, CA 94041
+ USA
+ howes@netscape.com
+ +1 415 937 3419
+
+ Mark Smith
+ Netscape Communications Corp.
+ 501 East Middlefield Rd.
+ Mountain View, CA 94041
+ USA
+ mcs@netscape.com
+ +1 415 937 3477
+
+ Frank Dawson
+ Lotus Development Corporation
+ 6544 Battleford Drive
+ Raleigh, NC 27613-3502
+ USA
+ frank_dawson@lotus.com
+ +1-919-676-9515
+
+6. Predefined Types
+
+ The following types are generally useful regardless of the profile
+ being carried and are defined below using the text/directory MIME
+ type registration template defined in Section 11.1 of this document.
+ These types MAY be included in any profile, unless explicitly
+ forbidden in the profile definition.
+
+6.1. SOURCE Type Definition
+
+ To: ietf-mime-direct@imc.org
+ Subject: Registration of text/directory MIME type SOURCE
+
+ Type name: SOURCE
+
+ Type purpose: To identify the source of directory information
+ contained in the content type.
+
+ Type encoding: 8bit
+
+ Type valuetype: uri
+
+
+
+
+Howes, et. al. Standards Track [Page 15]
+
+RFC 2425 MIME Content-Type for Directory Information September 1998
+
+
+ Type special notes: The SOURCE type is used to provide the means by
+ which applications knowledgable in the given directory service
+ protocol can obtain additional or more up-to-date information from
+ the directory service. It contains a URI as defined in [RFC-1738]
+ and/or other information referencing the directory entity or entities
+ to which the information pertains. When directory information is
+ available from more than one source, the sending entity can pick what
+ it considers to be the best source, or multiple SOURCE types can be
+ included. The interpretation of the value for a SOURCE type can
+ depend on the setting of the CONTEXT type parameter. The value of the
+ CONTEXT type parameter MUST be compatible with the value of the uri
+ prefix.
+
+ Type example:
+ SOURCE;CONTEXT=LDAP:ldap://ldap.host/cn=Babs%20Jensen,
+ %20o=Babsco,%20c=US
+
+6.2. NAME Type Definition
+
+ To: ietf-mime-direct@imc.org
+ Subject: Registration of text/directory MIME type NAME
+
+ Type name: NAME
+
+ Type purpose: To identify the displayable name of the directory
+ entity to which information in the content type pertains.
+
+ Type encoding: 8bit
+
+ Type valuetype: text
+
+ Type special notes: The NAME type is used to convey the display name
+ of the entity to which the directory information pertains.
+
+ Type example:
+ NAME:Babs Jensen's Contact Information
+
+6.3. PROFILE Type Definition
+
+ To: ietf-mime-direct@imc.org
+ Subject: Registration of text/directory MIME type PROFILE
+
+ Type name: PROFILE
+
+ Type purpose: To identify the type of directory entity to which
+ information in the content type pertains.
+
+ Type encoding: 8bit
+
+
+
+Howes, et. al. Standards Track [Page 16]
+
+RFC 2425 MIME Content-Type for Directory Information September 1998
+
+
+ Type valuetype: A profile name, registered as described in Section 9
+ of this document or bilaterally agreed upon as described in Section
+ 5.
+
+ Type special notes: The PROFILE type is used to convey the type of
+ the entity to which the directory information in the rest of the body
+ part pertains. It should be the same as the "profile" header
+ parameter, if present.
+
+ Type example:
+ PROFILE:vCard
+
+6.4. BEGIN Type Definition
+
+ To: ietf-mime-direct@imc.org
+ Subject: Registration of text/directory MIME type BEGIN
+
+ Type name: BEGIN
+
+ Type purpose: To denote the beginning of a syntactic entity within a
+ text/directory content-type.
+
+ Type encoding: 8bit
+
+ Type valuetype: text, containing a profile name, registered as
+ described in Section 9 of this document or bilaterally-agreed upon as
+ described in Section 5.
+
+ Type special notes: The BEGIN type is used in conjunction with the
+ END type to delimit a profile containing a related set of properties
+ within an text/directory content-type. This construct can be used
+ instead of or in addition to wrapping separate sets of information
+ inside additional MIME headers. It is provided for applications that
+ wish to define content that can contain multiple entities within the
+ same text/directory content-type or to define content that can be
+ identifiable outside of a MIME environment.
+
+ Type example:
+ BEGIN:VCARD
+
+6.5. END Type Definition
+
+ To: ietf-mime-direct@imc.org
+ Subject: Registration of text/directory MIME type END
+
+ Type name: END
+
+
+
+
+
+Howes, et. al. Standards Track [Page 17]
+
+RFC 2425 MIME Content-Type for Directory Information September 1998
+
+
+ Type purpose: To denote the end of a syntactic entity within a
+ text/directory content-type.
+
+ Type encoding: 8bit
+
+ Type valuetype: text, containing a profile name, registered as
+ described in Section 9 of this document or bilaterally-agreed upon as
+ described in Section 5.
+
+ Type special notes: The END type is used in conjunction with the
+ BEGIN type to delimit a profile containing a related set of
+ properties within an text/directory content-type. This construct can
+ be used instead of or in addition to wrapping separate sets of
+ information inside additional MIME headers. It is provided for
+ applications that wish to define content that can contain multiple
+ entities within the same text/directory content-type or to define
+ content that can be identifiable outside of a MIME environment.
+
+ Type example:
+ END: VCARD
+
+7. Use of the multipart/related Content-Type
+
+ The multipart/related Content-Type can be used to hold directory
+ information comprised of both text and non-text information or
+ directory information that already has a natural MIME representation.
+ The root body part within the multipart/related body part is
+ specified as defined in [RFC-2112] by a "start" parameter, or it is
+ the first body part in the absence of such a parameter. The root
+ body part must have a Content-Type of "text/directory". This part
+ holds inline information and makes reference to subsequent body parts
+ holding additional text or non-text directory information via their
+ Content-ID URIs as explained in Section 5.
+
+ The body parts referred to do not have to be in any particular order,
+ except as noted above for the root body part.
+
+8. Examples
+
+ The following examples are for illustrative purposes only and are not
+ part of the definition.
+
+
+
+
+
+
+
+
+
+
+Howes, et. al. Standards Track [Page 18]
+
+RFC 2425 MIME Content-Type for Directory Information September 1998
+
+
+8.1. Example 1
+
+ The first example illustrates simple use of the text/directory
+ Content-Type. Note that no "profile" parameter is given, so an
+ application may not know what kind of directory entity the
+ information applies to. Note also the use of both hypothetical
+ official and bilaterally agreed upon types.
+
+ From: Whomever@wherever.com
+ To: Someone@somewhere.com
+ Subject: whatever
+ MIME-Version: 1.0
+ Message-ID: <id1@host.net>
+ Content-Type: text/directory
+ Content-ID: <id2@host.com>
+
+ cn:Babs Jensen
+ cn:Barbara J Jensen
+ sn:Jensen
+ email:babs@umich.edu
+ phone:+1 313 747-4454
+ x-id:1234567890
+
+8.2. Example 2
+
+ The next example illustrates the use of the Quoted-Printable transfer
+ encoding defined in [RFC 2045] to include non-ASCII character in some
+ of the information returned, and the use of the optional "name" and
+ "source" types. It also illustrates the use of an "encoding" type
+ parameter to encode a certificate value in "b". A "vCard" profile
+ [MIME- VCARD] is used for the example.
+
+Content-Type: text/directory;
+ charset="iso-8859-1";
+ profile="vCard"
+Content-ID: <id3@host.com>
+Content-Transfer-Encoding: Quoted-Printable
+
+begin:VCARD
+source:ldap://cn=bjorn%20Jensen, o=university%20of%20Michigan, c=US
+name:Bjorn Jensen
+fn:Bj=F8rn Jensen
+n:Jensen;Bj=F8rn
+email;type=internet:bjorn@umich.edu
+tel;type=work,voice,msg:+1 313 747-4454
+key;type=x509;encoding=B:dGhpcyBjb3VsZCBiZSAKbXkgY2VydGlmaWNhdGUK
+end:VCARD
+
+
+
+
+Howes, et. al. Standards Track [Page 19]
+
+RFC 2425 MIME Content-Type for Directory Information September 1998
+
+
+8.3. Example 3
+
+ The next example illustrates the use of multi-valued type parameters,
+ the "language" type parameter, the "value" type parameter, folding of
+ long lines, the \n encoding for formatted lines, attribute grouping,
+ and the inline "b" encoding. A "vCard" profile [MIME-VCARD] is used
+ for the example.
+
+Content-Type: text/directory; profile="vcard"; charset=iso-8859-1
+Content-ID: <id3@host.com>
+Content-Transfer-Encoding: Quoted-Printable
+
+begin:vcard
+source:ldap://cn=Meister%20Berger,o=Universitaet%20Goerlitz,c=DE
+name:Meister Berger
+fn:Meister Berger
+n:Berger;Meister
+bday;value=date:1963-09-21
+o:Universit=E6t G=F6rlitz
+title:Mayor
+title;language=de;value=text:Burgermeister
+note:The Mayor of the great city of
+ Goerlitz in the great country of Germany.
+email;internet:mb@goerlitz.de
+home.tel;type=fax,voice,msg:+49 3581 123456
+home.label:Hufenshlagel 1234\n
+ 02828 Goerlitz\n
+ Deutschland
+key;type=X509;encoding=b:MIICajCCAdOgAwIBAgICBEUwDQYJKoZIhvcNAQEEBQ
+ AwdzELMAkGA1UEBhMCVVMxLDAqBgNVBAoTI05ldHNjYXBlIENvbW11bmljYXRpb25zI
+ ENvcnBvcmF0aW9uMRwwGgYDVQQLExNJbmZvcm1hdGlvbiBTeXN0ZW1zMRwwGgYDVQQD
+ ExNyb290Y2EubmV0c2NhcGUuY29tMB4XDTk3MDYwNjE5NDc1OVoXDTk3MTIwMzE5NDc
+ 1OVowgYkxCzAJBgNVBAYTAlVTMSYwJAYDVQQKEx1OZXRzY2FwZSBDb21tdW5pY2F0aW
+ 9ucyBDb3JwLjEYMBYGA1UEAxMPVGltb3RoeSBBIEhvd2VzMSEwHwYJKoZIhvcNAQkBF
+ hJob3dlc0BuZXRzY2FwZS5jb20xFTATBgoJkiaJk/IsZAEBEwVob3dlczBcMA0GCSqG
+ SIb3DQEBAQUAA0sAMEgCQQC0JZf6wkg8pLMXHHCUvMfL5H6zjSk4vTTXZpYyrdN2dXc
+ oX49LKiOmgeJSzoiFKHtLOIboyludF90CgqcxtwKnAgMBAAGjNjA0MBEGCWCGSAGG+E
+ IBAQQEAwIAoDAfBgNVHSMEGDAWgBT84FToB/GV3jr3mcau+hUMbsQukjANBgkqhkiG9
+ w0BAQQFAAOBgQBexv7o7mi3PLXadkmNP9LcIPmx93HGp0Kgyx1jIVMyNgsemeAwBM+M
+ SlhMfcpbTrONwNjZYW8vJDSoi//yrZlVt9bJbs7MNYZVsyF1unsqaln4/vy6Uawfg8V
+ UMk1U7jt8LYpo4YULU7UZHPYVUaSgVttImOHZIKi4hlPXBOhcUQ==
+end:vcard
+
+
+
+
+
+
+
+
+
+Howes, et. al. Standards Track [Page 20]
+
+RFC 2425 MIME Content-Type for Directory Information September 1998
+
+
+8.4. Example 4
+
+ The final example illustrates the use of the multipart/related
+ Content-Type to include non-textual directory data via the "uri"
+ encoding to refer to other body parts within the same message, or to
+ external values. Note that no "profile" parameter is given, so an
+ application may not know what kind of directory entity the
+ information applies to. Note also the use of both hypothetical
+ official and bilaterally agreed upon types.
+
+Content-Type: multipart/related;
+ boundary=woof;
+ type="text/directory";
+ start="<id5@host.com>"
+Content-ID: <id4@host.com>
+
+--woof
+Content-Type: text/directory; charset="iso-8859-1"
+Content-ID: <id5@host.com>
+Content-Transfer-Encoding: Quoted-Printable
+
+source:ldap://cn=Bjorn%20Jensen,o=University%20of%20Michigan,c=US
+cn:Bj=F8rn Jensen
+sn:Jensen
+email:bjorn@umich.edu
+image;value=uri:cid:id6@host.com
+image;value=uri;format=jpeg:ftp://some.host/some/path.jpg
+sound;value=uri:cid:id7@host.com
+phone:+1 313 747-4454
+
+--woof
+Content-Type: image/jpeg
+Content-ID: <id6@host.com>
+
+<...image data...>
+
+--woof
+Content-Type: message/external-body;
+ name="myvoice.au";
+ site="myhost.com";
+ access-type=ANON-FTP;
+ directory="pub/myname";
+ mode="image"
+
+Content-Type: audio/basic
+Content-ID: <id7@host.com>
+
+--woof--
+
+
+
+Howes, et. al. Standards Track [Page 21]
+
+RFC 2425 MIME Content-Type for Directory Information September 1998
+
+
+9. Registration of new profiles
+
+ This section defines procedures by which new profiles are registered
+ with the IANA and made available to the Internet community. Note that
+ non-IANA profiles can be used by bilateral agreement, provided the
+ associated profile names follow the "X-" convention defined above.
+
+ The procedures defined here are designed to allow public comment and
+ review of new profiles, while posing only a small impediment to the
+ definition of new profiles.
+
+ Registration of a new profile is accomplished by the following steps.
+
+9.1. Define the profile
+
+ A profile is defined by completing the following template.
+
+ To: ietf-mime-direct@imc.org
+ Subject: Registration of text/directory MIME profile XXX
+
+ Profile name:
+
+ Profile purpose:
+
+ Profile types:
+
+ Profile special notes (optional):
+
+ Intended usage: (one of COMMON, LIMITED USE or OBSOLETE)
+
+ The explanation of what goes in each field in the template follows.
+
+ Profile name: The name of the profile as it will appear in the
+ text/directory MIME Content-Type "profile" header parameter, or the
+ predefined "profile" type name.
+
+ Profile purpose: The purpose of the profile (e.g., to represent
+ information about people, printers, documents, etc.). Give a short
+ but clear description.
+
+ Profile types: The list of types associated with the profile. This
+ list of types is to be expected but not required in the profile,
+ unless otherwise noted in the profile definition. Other types not
+ mentioned in the profile definition MAY also be present. Note that
+ any new types referenced by the profile MUST be defined separately as
+ described in Section 10.
+
+
+
+
+
+Howes, et. al. Standards Track [Page 22]
+
+RFC 2425 MIME Content-Type for Directory Information September 1998
+
+
+ Profile special notes: Any special notes about the profile, how it is
+ to be used, etc. This section of the template can also be used to
+ define an ordering on the types that appear in the Content-Type, if
+ such an ordering is required.
+
+9.2. Post the profile definition
+
+ The profile description must be posted to the new profile discussion
+ list, ietf-mime-direct@imc.org
+
+9.3. Allow a comment period
+
+ Discussion on the new profile must be allowed to take place on the
+ list for a minimum of two weeks. Consensus must be reached on the
+ profile before proceeding to step 4.
+
+9.4. Submit the profile for approval
+
+ Once the two-week comment period has elapsed, and the proposer is
+ convinced consensus has been reached on the profile, the registration
+ application should be submitted to the Profile Reviewer for approval.
+ The Profile Reviewer is appointed by the Application Area Directors
+ and can either accept or reject the profile registration. An accepted
+ registration is passed on by the Profile Reviewer to the IANA for
+ inclusion in the official IANA profile registry. The registration may
+ be rejected for any of the following reasons. 1) Insufficient comment
+ period; 2) Consensus not reached; 3) Technical deficiencies raised on
+ the list or elsewhere have not been addressed. The Profile Reviewer's
+ decision to reject a profile can be appealed by the proposer to the
+ IESG, or the objections raised can be addressed by the proposer and
+ the profile resubmitted.
+
+10. Profile Change Control
+
+ Existing profiles can be changed using the same process by which they
+ were registered.
+
+ Define the change
+
+ Post the change
+
+ Allow a comment period
+
+ Submit the changed profile for approval
+
+
+
+
+
+
+
+Howes, et. al. Standards Track [Page 23]
+
+RFC 2425 MIME Content-Type for Directory Information September 1998
+
+
+ Note that the original author or any other interested party can
+ propose a change to an existing profile, but that such changes should
+ only be proposed when there are serious omissions or errors in the
+ published specification. The Profile Reviewer can object to a change
+ if it is not backwards compatible, but is not required to do so.
+
+ Profile definitions can never be deleted from the IANA registry, but
+ profiles which are no longer believed to be useful can be declared
+ OBSOLETE by a change to their "intended use" field.
+
+11. Registration of new types
+
+ This section defines procedures by which new types are registered
+ with the IANA. Note that non-IANA types can be used by bilateral
+ agreement, provided the associated types names follow the "X-"
+ convention defined above.
+
+ The procedures defined here are designed to allow public comment and
+ review of new types, while posing only a small impediment to the
+ definition of new types.
+
+ Registration of a new type is accomplished by the following steps.
+
+11.1. Define the type
+
+ A type is defined by completing the following template.
+
+ To: ietf-mime-direct@imc.org
+ Subject: Registration of text/directory MIME type XXX
+
+ Type name:
+
+ Type purpose:
+
+ Type encoding:
+
+ Type valuetype:
+
+ Type special notes (optional):
+
+ Intended usage: (one of COMMON, LIMITED USE or OBSOLETE)
+
+ The meaning of each field in the template is as follows.
+
+ Type name: The name of the type, as it will appear in the body of an
+ text/directory MIME Content-Type "type: value" line to the left of
+ the colon ":".
+
+
+
+
+Howes, et. al. Standards Track [Page 24]
+
+RFC 2425 MIME Content-Type for Directory Information September 1998
+
+
+ Type purpose: The purpose of the type (e.g., to represent a name,
+ postal address, IP address, etc.). Give a short but clear
+ description.
+
+ Type encoding: The default encoding a value of the type must have in
+ the body of a text/directory MIME Content-Type.
+
+ Type valuetype: The format a value of the type must have in the body
+ of a text/directory MIME Content-Type. This description must be
+ precise and must not violate the general encoding rules defined in
+ section 5 of this document.
+
+ Type special notes: Any special notes about the type, how it is to be
+ used, etc.
+
+11.2. Post the type definition
+
+ The type description must be posted to the new type discussion list,
+ ietf-mime-direct@imc.org
+
+11.3. Allow a comment period
+
+ Discussion on the new type must be allowed to take place on the list
+ for a minimum of two weeks. Consensus must be reached on the type
+ before proceeding to step 4.
+
+11.4. Submit the type for approval
+
+ Once the two-week comment period has elapsed, and the proposer is
+ convinced consensus has been reached on the type, the registration
+ application should be submitted to the Profile Reviewer for approval.
+ The Profile Reviewer is appointed by the Application Area Directors
+ and can either accept or reject the type registration. An accepted
+ registration is passed on by the Profile Reviewer to the IANA for
+ inclusion in the official IANA profile registry. The registration can
+ be rejected for any of the following reasons. 1) Insufficient comment
+ period; 2) Consensus not reached; 3) Technical deficiencies raised on
+ the list or elsewhere have not been addressed. The Profile
+ Reviewer's decision to reject a type can be appealed by the proposer
+ to the IESG, or the objections raised can be addressed by the
+ proposer and the type resubmitted.
+
+
+
+
+
+
+
+
+
+
+Howes, et. al. Standards Track [Page 25]
+
+RFC 2425 MIME Content-Type for Directory Information September 1998
+
+
+12. Type Change Control
+
+ Existing types can be changed using the same process by which they
+ were registered.
+
+ Define the change
+
+ Post the change
+
+ Allow a comment period
+
+ Submit the type for approval
+
+ Note that the original author or any other interested party can
+ propose a change to an existing type, but that such changes should
+ only be proposed when there are serious omissions or errors in the
+ published specification. The Profile Reviewer can object to a change
+ if it is not backwards compatible, but is not required to do so.
+
+ Type definitions can never be deleted from the IANA registry, but
+ types which are nolonger believed to be useful can be declared
+ OBSOLETE by a change to their "intended use" field.
+
+13. Registration of new parameters
+
+ This section defines procedures by which new parameters are
+ registered with the IANA and made available to the Internet
+ community. Note that non-IANA parameters can be used by bilateral
+ agreement, provided the associated parameters names follow the "X-"
+ convention defined above.
+
+ The procedures defined here are designed to allow public comment and
+ review of new parameters, while posing only a small impediment to the
+ definition of new parameters.
+
+ Registration of a new parameter is accomplished by the following
+ steps.
+
+13.1. Define the parameter
+
+ A parameter is defined by completing the following template.
+
+ To: ietf-mime-direct@imc.org
+ Subject: Registration of text/directory MIME type parameter XXX
+
+ Parameter name:
+
+ Parameter purpose:
+
+
+
+Howes, et. al. Standards Track [Page 26]
+
+RFC 2425 MIME Content-Type for Directory Information September 1998
+
+
+ Parameter values:
+
+ Parameter special notes (optional):
+
+ Intended usage: (one of COMMON, LIMITED USE or OBSOLETE)
+
+ The explanation of what goes in each field in the template follows.
+
+ Parameter name: The name of the parameter as it will appear in the
+ text/directory MIME Content-Type.
+
+ Parameter purpose: The purpose of the parameter (e.g., to represent
+ the format of an image, type of a phone number, etc.). Give a short
+ but clear description. If defining a general paramemter like "format"
+ or "type" keep in mind that other applications might wish to extend
+ its use.
+
+ Parameter values: The list or description of values associated with
+ the parameter.
+
+ Parameter special notes: Any special notes about the parameter, how
+ it is to be used, etc.
+
+13.2. Post the parameter definition
+
+ The parameter description must be posted to the new parameter
+ discussion list, ietf-mime-direct@imc.org
+
+13.3. Allow a comment period
+
+ Discussion on the new parameter must be allowed to take place on the
+ list for a minimum of two weeks. Consensus must be reached on the
+ parameter before proceeding to step 4.
+
+13.4. Submit the parameter for approval
+
+ Once the two-week comment period has elapsed, and the proposer is
+ convinced consensus has been reached on the parameter, the
+ registration application should be submitted to the Profile Reviewer
+ for approval. The Profile Reviewer is appointed by the Application
+ Area Directors and can either accept or reject the parameter
+ registration. An accepted registration is passed on by the Profile
+ Reviewer to the IANA for inclusion in the official IANA parameter
+ registry. The registration can be rejected for any of the following
+ reasons. 1) Insufficient comment period; 2) Consensus not reached; 3)
+ Technical deficiencies raised on the list or elsewhere have not been
+ addressed. The Profile Reviewer's decision to reject a profile can be
+ appealed by the proposer to the IESG, or the objections raised can be
+
+
+
+Howes, et. al. Standards Track [Page 27]
+
+RFC 2425 MIME Content-Type for Directory Information September 1998
+
+
+ addressed by the proposer and the parameter registration resubmitted.
+
+14. Parameter Change Control
+
+ Existing parameters can be changed using the same process by which
+ they were registered.
+
+ Define the change
+
+ Post the change
+
+ Allow a comment period
+
+ Submit the parameter for approval
+
+ Note that the original author or any other interested party can
+ propose a change to an existing parameter, but that such changes
+ should only be proposed when there are serious omissions or errors in
+ the published specification. The Profile Reviewer can object to a
+ change if it is not backwards compatible, but is not required to do
+ so.
+
+ Parameter definitions can never be deleted from the IANA registry,
+ but parameters which are nolonger believed to be useful can be
+ declared OBSOLETE by a change to their "intended use" field.
+
+15. Registration of new value types
+
+ This section defines procedures by which new value types are
+ registered with the IANA and made available to the Internet
+ community. Note that non-IANA value types can be used by bilateral
+ agreement, provided the associated value types names follow the "X-"
+ convention defined above.
+
+ The procedures defined here are designed to allow public comment and
+ review of new value types, while posing only a small impediment to
+ the definition of new value types.
+
+ Registration of a new value types is accomplished by the following
+ steps.
+
+15.1. Define the value type
+
+ A value type is defined by completing the following template.
+
+ To: ietf-mime-direct@imc.org
+ Subject: Registration of text/directory MIME value type XXX
+
+
+
+
+Howes, et. al. Standards Track [Page 28]
+
+RFC 2425 MIME Content-Type for Directory Information September 1998
+
+
+ value type name:
+
+ value type purpose:
+
+ value type format:
+
+ value type special notes (optional):
+
+ Intended usage: (one of COMMON, LIMITED USE or OBSOLETE)
+
+ The explanation of what goes in each field in the template follows.
+
+ value type name: The name of the value type as it will appear in the
+ text/directory MIME Content-Type.
+
+ value type purpose: The purpose of the value type. Give a short but
+ clear description.
+
+ value type format: The definition of the format for the value,
+ usually using ABNF grammar.
+
+ value type special notes: Any special notes about the value type, how
+ it is to be used, etc.
+
+15.2. Post the value type definition
+
+ The value type description must be posted to the new value type
+ discussion list, ietf-mime-direct@imc.org
+
+15.3. Allow a comment period
+
+ Discussion on the new value type must be allowed to take place on the
+ list for a minimum of two weeks. Consensus must be reached before
+ proceeding to step 4.
+
+15.4. Submit the value type for approval
+
+ Once the two-week comment period has elapsed, and the proposer is
+ convinced consensus has been reached on the value type, the
+ registration application should be submitted to the Profile Reviewer
+ for approval. The Profile Reviewer is appointed by the Application
+ Area Directors and can either accept or reject the value type
+ registration. An accepted registration should be passed on by the
+ Profile Reviewer to the IANA for inclusion in the official IANA value
+ type registry. The registration can be rejected for any of the
+ following reasons. 1) Insufficient comment period; 2) Consensus not
+ reached; 3) Technical deficiencies raised on the list or elsewhere
+ have not been addressed. The Profile Reviewer's decision to reject a
+
+
+
+Howes, et. al. Standards Track [Page 29]
+
+RFC 2425 MIME Content-Type for Directory Information September 1998
+
+
+ profile can be appealed by the proposer to the IESG, or the
+ objections raised can be addressed by the proposer and the value type
+ registration resubmitted.
+
+16. Security Considerations
+
+ Internet mail is subject to many well known security attacks,
+ including monitoring, replay, and forgery. Care should be taken by
+ any directory service in allowing information to leave the scope of
+ the service itself, where any access controls can no longer be
+ guaranteed. Applications should also take care to display directory
+ data in a "safe" environment (e.g., PostScript-valued types).
+
+17. Acknowledgements
+
+ The registration procedures defined here were shamelessly lifted from
+ the MIME registration RFC.
+
+ The many valuable comments contributed by members of the IETF ASID
+ working group are gratefully acknowledged, as are the contributions
+ of the Versit Consortium. Chris Newman was especially helpful in
+ navigating the intricacies of ABNF lore.
+
+18. References
+
+ [RFC-1777] Yeong, W., Howes, T., and S. Kille, "Lightweight
+ Directory Access Protocol", RFC 1777, March 1995.
+
+ [RFC-1778] Howes, T., Kille, S., Yeong, W., and C. Robbins, "The
+ String Representation of Standard Attribute Syntaxes",
+ RFC 1778, March 1995.
+
+ [RFC-822] Crocker, D., "Standard for the Format of ARPA Internet
+ Text Messages", STD 11, RFC 822, August 1982.
+
+ [RFC-2045] Borenstein, N., and N. Freed, "Multipurpose Internet
+ Mail Extensions (MIME) Part One: Format of Internet
+ Message Bodies", RFC 2045, November 1996.
+
+ [RFC-2046] Moore, K., "Multipurpose Internet Mail Extensions (MIME)
+ Part Two: Media Types", RFC 2046, November 1996.
+
+ [RFC-2048] Freed, N., Klensin, J., and J. Postel, "Multipurpose
+ Internet Mail Extensions (MIME) Part Four: Registration
+ Procedures", RFC 2048, November 1996.
+
+ [RFC-1766] Alvestrand, H., "Tags for the Identification of
+ Languages", RFC 1766, March 1995.
+
+
+
+Howes, et. al. Standards Track [Page 30]
+
+RFC 2425 MIME Content-Type for Directory Information September 1998
+
+
+ [RFC-2112] Levinson, E., "The MIME Multipart/Related Content-type",
+ RFC 2112, March 1997.
+
+ [X500] "Information Processing Systems - Open Systems
+ Interconnection - The Directory: Overview of Concepts,
+ Models and Services", ISO/IEC JTC 1/SC21, International
+ Standard 9594-1, 1988.
+
+ [RFC-1835] Deutsch, P., Schoultz, R., Faltstrom, P., and C. Weider,
+ "Architecture of the WHOIS++ service", RFC 1835, August
+ 1995.
+
+ [RFC-1738] Berners-Lee, T., Masinter, L., and M. McCahill, "Uniform
+ Resource Locators (URL)", RFC 1738, December 1994.
+
+ [MIME-VCARD] Dawson, F., and T. Howes, "VCard MIME Directory
+ Profile", RFC 2426, September 1998.
+
+ [VCARD] Internet Mail Consortium, "vCard - The Electronic
+ Business Card", Version 2.1,
+ http://www.imc.com/pdi/vcard-21.txt, September, 1996.
+
+ [RFC-2119] Bradner, S., "Key words for use in RFCs to Indicate
+ Requirement Levels", BCP 14, RFC 2119, March 1997.
+
+ [RFC-2234] Crocker, D., and P. Overell, "Augmented BNF for Syntax
+ Specifications: ABNF", RFC 2234, November 1997.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Howes, et. al. Standards Track [Page 31]
+
+RFC 2425 MIME Content-Type for Directory Information September 1998
+
+
+19. Authors' Addresses
+
+ Tim Howes
+ Netscape Communications Corp.
+ 501 East Middlefield Rd.
+ Mountain View, CA 94041
+ USA
+
+ Phone: +1.415.937.3419
+ EMail: howes@netscape.com
+
+
+ Mark Smith
+ Netscape Communications Corp.
+ 501 East Middlefield Rd.
+ Mountain View, CA 94041
+ USA
+
+ Phone: +1.415.937.3477
+ EMail: mcs@netscape.com
+
+
+ Frank Dawson
+ Lotus Development Corporation
+ 6544 Battleford Drive
+ Raleigh, NC 27613
+ USA
+
+ Phone: +1-919-676-9515
+ EMail: frank_dawson@lotus.com
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Howes, et. al. Standards Track [Page 32]
+
+RFC 2425 MIME Content-Type for Directory Information September 1998
+
+
+20. Full Copyright Statement
+
+ Copyright (C) The Internet Society (1998). All Rights Reserved.
+
+ This document and translations of it may be copied and furnished to
+ others, and derivative works that comment on or otherwise explain it
+ or assist in its implementation may be prepared, copied, published
+ and distributed, in whole or in part, without restriction of any
+ kind, provided that the above copyright notice and this paragraph are
+ included on all such copies and derivative works. However, this
+ document itself may not be modified in any way, such as by removing
+ the copyright notice or references to the Internet Society or other
+ Internet organizations, except as needed for the purpose of
+ developing Internet standards in which case the procedures for
+ copyrights defined in the Internet Standards process must be
+ followed, or as required to translate it into languages other than
+ English.
+
+ The limited permissions granted above are perpetual and will not be
+ revoked by the Internet Society or its successors or assigns.
+
+ This document and the information contained herein is provided on an
+ "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING
+ TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING
+ BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION
+ HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF
+ MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Howes, et. al. Standards Track [Page 33]
+
diff --git a/vendor/sabre/dav/docs/rfc2426.txt b/vendor/sabre/dav/docs/rfc2426.txt
new file mode 100644
index 000000000..a393a67c9
--- /dev/null
+++ b/vendor/sabre/dav/docs/rfc2426.txt
@@ -0,0 +1,2355 @@
+
+
+
+
+
+
+Network Working Group F. Dawson
+Request for Comments: 2426 Lotus Development Corporation
+Category: Standards Track T. Howes
+ Netscape Communications
+ September 1998
+
+
+ vCard MIME Directory Profile
+
+Status of this Memo
+
+ This document specifies an Internet standards track protocol for the
+ Internet community, and requests discussion and suggestions for
+ improvements. Please refer to the current edition of the "Internet
+ Official Protocol Standards" (STD 1) for the standardization state
+ and status of this protocol. Distribution of this memo is unlimited.
+
+Copyright Notice
+
+ Copyright (C) The Internet Society (1998). All Rights Reserved.
+
+Abstract
+
+ This memo defines the profile of the MIME Content-Type [MIME-DIR] for
+ directory information for a white-pages person object, based on a
+ vCard electronic business card. The profile definition is independent
+ of any particular directory service or protocol. The profile is
+ defined for representing and exchanging a variety of information
+ about an individual (e.g., formatted and structured name and delivery
+ addresses, email address, multiple telephone numbers, photograph,
+ logo, audio clips, etc.). The directory information used by this
+ profile is based on the attributes for the person object defined in
+ the X.520 and X.521 directory services recommendations. The profile
+ also provides the method for including a [VCARD] representation of a
+ white-pages directory entry within the MIME Content-Type defined by
+ the [MIME-DIR] document.
+
+ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
+ "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY" and "OPTIONAL" in this
+ document are to be interpreted as described in [RFC 2119].
+
+
+
+
+
+
+
+
+
+
+
+Dawson & Howes Standards Track [Page 1]
+
+RFC 2426 vCard MIME Directory Profile September 1998
+
+
+Table of Contents
+
+ Overview.........................................................3
+ 1. THE VCARD MIME DIRECTORY PROFILE REGISTRATION.................4
+ 2. MIME DIRECTORY FEATURES.......................................5
+ 2.1 PREDEFINED TYPE USAGE ......................................5
+ 2.1.1 BEGIN and END Type ......................................5
+ 2.1.2 NAME Type ...............................................5
+ 2.1.3 PROFILE Type ............................................5
+ 2.1.4 SOURCE Type .............................................5
+ 2.2 PREDEFINED TYPE PARAMETER USAGE ............................6
+ 2.3 PREDEFINED VALUE TYPE USAGE ................................6
+ 2.4 EXTENSIONS TO THE PREDEFINED VALUE TYPES ...................6
+ 2.4.1 BINARY ..................................................6
+ 2.4.2 VCARD ...................................................6
+ 2.4.3 PHONE-NUMBER ............................................7
+ 2.4.4 UTC-OFFSET ..............................................7
+ 2.5 STRUCTURED TYPE VALUES .....................................7
+ 2.6 LINE DELIMITING AND FOLDING ................................8
+ 3. VCARD PROFILE FEATURES........................................8
+ 3.1 IDENTIFICATION TYPES .......................................8
+ 3.1.1 FN Type Definition ......................................8
+ 3.1.2 N Type Definition .......................................9
+ 3.1.3 NICKNAME Type Definition ................................9
+ 3.1.4 PHOTO Type Definition ..................................10
+ 3.1.5 BDAY Type Definition ...................................11
+ 3.2 DELIVERY ADDRESSING TYPES .................................11
+ 3.2.1 ADR Type Definition ....................................11
+ 3.2.2 LABEL Type Definition ..................................13
+ 3.3 TELECOMMUNICATIONS ADDRESSING TYPES .......................13
+ 3.3.1 TEL Type Definition ....................................14
+ 3.3.2 EMAIL Type Definition ..................................15
+ 3.3.3 MAILER Type Definition .................................15
+ 3.4 GEOGRAPHICAL TYPES ........................................16
+ 3.4.1 TZ Type Definition .....................................16
+ 3.4.2 GEO Type Definition ....................................16
+ 3.5 ORGANIZATIONAL TYPES ......................................17
+ 3.5.1 TITLE Type Definition ..................................17
+ 3.5.2 ROLE Type Definition ...................................18
+ 3.5.3 LOGO Type Definition ...................................18
+ 3.5.4 AGENT Type Definition ..................................19
+ 3.5.5 ORG Type Definition ....................................20
+ 3.6 EXPLANATORY TYPES .........................................20
+ 3.6.1 CATEGORIES Type Definition .............................20
+ 3.6.2 NOTE Type Definition ...................................21
+ 3.6.3 PRODID Type Definition .................................21
+ 3.6.4 REV Type Definition ....................................22
+ 3.6.5 SORT-STRING Type Definition ............................22
+
+
+
+Dawson & Howes Standards Track [Page 2]
+
+RFC 2426 vCard MIME Directory Profile September 1998
+
+
+ 3.6.6 SOUND Type Definition ..................................23
+ 3.6.7 UID Type Definition ....................................24
+ 3.6.8 URL Type Definition ....................................25
+ 3.6.9 VERSION Type Definition ................................25
+ 3.7 SECURITY TYPES ............................................25
+ 3.7.1 CLASS Type Definition ..................................26
+ 3.7.2 KEY Type Definition ....................................26
+ 3.8 EXTENDED TYPES ............................................27
+ 4. FORMAL GRAMMAR...............................................27
+ 5. DIFFERENCES FROM VCARD V2.1..................................37
+ 6. ACKNOWLEDGEMENTS.............................................39
+ 7. AUTHORS' ADDRESSES...........................................39
+ 8. SECURITY CONSIDERATIONS......................................39
+ 9. REFERENCES...................................................40
+ 10. FULL COPYRIGHT STATEMENT....................................42
+
+Overview
+
+ The [MIME-DIR] document defines a MIME Content-Type for holding
+ different kinds of directory information. The directory information
+ can be based on any of a number of directory schemas. This document
+ defines a [MIME-DIR] usage profile for conveying directory
+ information based on one such schema; that of the white-pages type of
+ person object.
+
+ The schema is based on the attributes for the person object defined
+ in the X.520 and X.521 directory services recommendations. The schema
+ has augmented the basic attributes defined in the X.500 series
+ recommendation in order to provide for an electronic representation
+ of the information commonly found on a paper business card. This
+ schema was first defined in the [VCARD] document. Hence, this [MIME-
+ DIR] profile is referred to as the vCard MIME Directory Profile.
+
+ A directory entry based on this usage profile can include traditional
+ directory, white-pages information such as the distinguished name
+ used to uniquely identify the entry, a formatted representation of
+ the name used for user-interface or presentation purposes, both the
+ structured and presentation form of the delivery address, various
+ telephone numbers and organizational information associated with the
+ entry. In addition, traditional paper business card information such
+ as an image of an organizational logo or identify photograph can be
+ included in this person object.
+
+ The vCard MIME Directory Profile also provides support for
+ representing other important information about the person associated
+ with the directory entry. For instance, the date of birth of the
+ person; an audio clip describing the pronunciation of the name
+ associated with the directory entry, or some other application of the
+
+
+
+Dawson & Howes Standards Track [Page 3]
+
+RFC 2426 vCard MIME Directory Profile September 1998
+
+
+ digital sound; longitude and latitude geo-positioning information
+ related to the person associated with the directory entry; date and
+ time that the directory information was last updated; annotations
+ often written on a business card; Uniform Resource Locators (URL) for
+ a website; public key information. The profile also provides support
+ for non-standard extensions to the schema. This provides the
+ flexibility for implementations to augment the current capabilities
+ of the profile in a standardized way. More information about this
+ electronic business card format can be found in [VCARD].
+
+1. The vCard Mime Directory Profile Registration
+
+ This profile is identified by the following [MIME-DIR] registration
+ template information. Subsequent sections define the profile
+ definition.
+
+ To: ietf-mime-directory@imc.org
+
+ Subject: Registration of text/directory MIME profile VCARD
+
+ Profile name: VCARD
+
+ Profile purpose: To hold person object or white-pages type of
+ directory information. The person schema captured in the directory
+ entries is that commonly found in an electronic business card.
+
+ Predefined MIME Directory value specifications used: uri, date,
+ date-time, float
+
+ New value specifications: This profile places further constraints on
+ the [MIME-DIR] text value specification. In addition, it adds a
+ binary, phone-number, utc-offset and vcard value specifications.
+
+ Predefined MIME Directory types used: SOURCE, NAME, PROFILE, BEGIN,
+ END.
+
+ Predefined MIME Directory parameters used: ENCODING, VALUE, CHARSET,
+ LANGUAGE, CONTEXT.
+
+ New types: FN, N, NICKNAME, PHOTO, BDAY, ADR, LABEL, TEL, EMAIL,
+ MAILER, TZ, GEO, TITLE, ROLE, LOGO, AGENT, ORG, CATEGORIES, NOTE,
+ PRODID, REV, SORT-STRING, SOUND, URL, UID, VERSION, CLASS, KEY
+
+ New parameters: TYPE
+
+ Profile special notes: The vCard object MUST contain the FN, N and
+ VERSION types. The type-grouping feature of [MIME-DIR] is supported
+ by this profile to group related vCard properties about a directory
+
+
+
+Dawson & Howes Standards Track [Page 4]
+
+RFC 2426 vCard MIME Directory Profile September 1998
+
+
+ entry. For example, vCard properties describing WORK or HOME related
+ characteristics can be grouped with a unique group label.
+
+ The profile permits the use of non-standard types (i.e., those
+ identified with the prefix string "X-") as a flexible method for
+ implementations to extend the functionality currently defined within
+ this profile.
+
+2. MIME Directory Features
+
+ The vCard MIME Directory Profile makes use of many of the features
+ defined by [MIME-DIR]. The following sections either clarify or
+ extend the content-type definition of [MIME-DIR].
+
+2.1 Predefined Type Usage
+
+ The vCard MIME Directory Profile uses the following predefined types
+ from [MIME-DIR].
+
+2.1.1 BEGIN and END Type
+
+ The content entity MUST begin with the BEGIN type with a value of
+ "VCARD". The content entity MUST end with the END type with a value
+ of "VCARD".
+
+2.1.2 NAME Type
+
+ If the NAME type is present, then its value is the displayable,
+ presentation text associated with the source for the vCard, as
+ specified in the SOURCE type.
+
+2.1.3 PROFILE Type
+
+ If the PROFILE type is present, then its value MUST be "VCARD".
+
+2.1.4 SOURCE Type
+
+ If the SOURCE type is present, then its value provides information
+ how to find the source for the vCard.
+
+
+
+
+
+
+
+
+
+
+
+
+Dawson & Howes Standards Track [Page 5]
+
+RFC 2426 vCard MIME Directory Profile September 1998
+
+
+2.2 Predefined Type Parameter Usage
+
+ The vCard MIME Directory Profile uses the following predefined type
+ parameters as defined by [MIME-DIR].
+
+ - LANGUAGE
+
+ - ENCODING
+
+ - VALUE
+
+2.3 Predefined VALUE Type Usage
+
+ The predefined data type values specified in [MIME-DIR] MUST NOT be
+ repeated in COMMA separated value lists except within the N,
+ NICKNAME, ADR and CATEGORIES value types.
+
+ The text value type defined in [MIME-DIR] is further restricted such
+ that any SEMI-COLON character (ASCII decimal 59) in the value MUST be
+ escaped with the BACKSLASH character (ASCII decimal 92).
+
+2.4 Extensions To The Predefined VALUE Types
+
+ The predefined data type values specified in [MIME-DIR] have been
+ extended by the vCard profile to include a number of value types that
+ are specific to this profile.
+
+2.4.1 BINARY
+
+ The "binary" value type specifies that the type value is inline,
+ encoded binary data. This value type can be specified in the PHOTO,
+ LOGO, SOUND, and KEY types.
+
+ If inline encoded binary data is specified, the ENCODING type
+ parameter MUST be used to specify the encoding format. The binary
+ data MUST be encoded using the "B" encoding format. Long lines of
+ encoded binary data SHOULD BE folded to 75 characters using the
+ folding method defined in [MIME-DIR].
+
+ The value type is defined by the following notation:
+
+ binary = <A "B" binary encoded string as defined by [RFC 2047].>
+
+2.4.2 VCARD
+
+ The "vcard" value type specifies that the type value is another
+ vCard. This value type can be specified in the AGENT type. The value
+ type is defined by this specification. Since each of the type
+
+
+
+Dawson & Howes Standards Track [Page 6]
+
+RFC 2426 vCard MIME Directory Profile September 1998
+
+
+ declarations with in the vcard value type are being specified within
+ a text value themselves, they MUST be terminated with the backslash
+ escape sequence "\n" or "\N", instead of the normal newline character
+ sequence CRLF. In addition, any COMMA character (ASCII decimal 44),
+ SEMI-COLON character (ASCII decimal 59) and COLON character (ASCII
+ decimal 58) MUST be escaped with the BACKSLASH character (ASCII
+ decimal 92). For example, with the AGENT type a value would be
+ specified as:
+
+ AGENT:BEGIN:VCARD\nFN:Joe Friday\nTEL:+1-919-555-7878\n
+ TITLE:Area Administrator\, Assistant\n EMAIL\;TYPE=INTERN\n
+ ET:jfriday@host.com\nEND:VCARD\n
+
+2.4.3 PHONE-NUMBER
+
+ The "phone-number" value type specifies that the type value is a
+ telephone number. This value type can be specified in the TEL type.
+ The value type is a text value that has the special semantics of a
+ telephone number as defined in [CCITT E.163] and [CCITT X.121].
+
+2.4.4 UTC-OFFSET
+
+ The "utc-offset" value type specifies that the type value is a signed
+ offset from UTC. This value type can be specified in the TZ type.
+
+ The value type is an offset from Coordinated Universal Time (UTC). It
+ is specified as a positive or negative difference in units of hours
+ and minutes (e.g., +hh:mm). The time is specified as a 24-hour clock.
+ Hour values are from 00 to 23, and minute values are from 00 to 59.
+ Hour and minutes are 2-digits with high order zeroes required to
+ maintain digit count. The extended format for ISO 8601 UTC offsets
+ MUST be used. The extended format makes use of a colon character as a
+ separator of the hour and minute text fields.
+
+ The value is defined by the following notation:
+
+ time-hour = 2DIGIT ;00-23
+ time-minute = 2DIGIT ;00-59
+ utc-offset = ("+" / "-") time-hour ":" time-minute
+
+2.5 Structured Type Values
+
+ Compound type values are delimited by a field delimiter, specified by
+ the SEMI-COLON character (ASCII decimal 59). A SEMI-COLON in a
+ component of a compound property value MUST be escaped with a
+ BACKSLASH character (ASCII decimal 92).
+
+
+
+
+
+Dawson & Howes Standards Track [Page 7]
+
+RFC 2426 vCard MIME Directory Profile September 1998
+
+
+ Lists of values are delimited by a list delimiter, specified by the
+ COMMA character (ASCII decimal 44). A COMMA character in a value MUST
+ be escaped with a BACKSLASH character (ASCII decimal 92).
+
+ This profile supports the type grouping mechanism defined in [MIME-
+ DIR]. Grouping of related types is a useful technique to communicate
+ common semantics concerning the properties of a vCard.
+
+2.6 Line Delimiting and Folding
+
+ This profile supports the same line delimiting and folding methods
+ defined in [MIME-DIR]. Specifically, when parsing a content line,
+ folded lines must first be unfolded according to the unfolding
+ procedure described in [MIME-DIR]. After generating a content line,
+ lines longer than 75 characters SHOULD be folded according to the
+ folding procedure described in [MIME DIR].
+
+ Folding is done after any content encoding of a type value. Unfolding
+ is done before any decoding of a type value in a content line.
+
+3. vCard Profile Features
+
+ The vCard MIME Directory Profile Type contains directory information,
+ typically pertaining to a single directory entry. The information is
+ described using an attribute schema that is tailored for capturing
+ personal contact information. The vCard can include attributes that
+ describe identification, delivery addressing, telecommunications
+ addressing, geographical, organizational, general explanatory and
+ security and access information about the particular object
+ associated with the vCard.
+
+3.1 Identification Types
+
+ These types are used in the vCard profile to capture information
+ associated with the identification and naming of the person or
+ resource associated with the vCard.
+
+3.1.1 FN Type Definition
+
+ To: ietf-mime-directory@imc.org
+
+ Subject: Registration of text/directory MIME type FN
+
+ Type name:FN
+
+ Type purpose: To specify the formatted text corresponding to the name
+ of the object the vCard represents.
+
+
+
+
+Dawson & Howes Standards Track [Page 8]
+
+RFC 2426 vCard MIME Directory Profile September 1998
+
+
+ Type encoding: 8bit
+
+ Type value: A single text value.
+
+ Type special notes: This type is based on the semantics of the X.520
+ Common Name attribute. The property MUST be present in the vCard
+ object.
+
+ Type example:
+
+ FN:Mr. John Q. Public\, Esq.
+
+3.1.2 N Type Definition
+
+ To: ietf-mime-directory@imc.org
+
+ Subject: Registration of text/directory MIME type N
+
+ Type name: N
+
+ Type purpose: To specify the components of the name of the object the
+ vCard represents.
+
+ Type encoding: 8bit
+
+ Type value: A single structured text value. Each component can have
+ multiple values.
+
+ Type special note: The structured type value corresponds, in
+ sequence, to the Family Name, Given Name, Additional Names, Honorific
+ Prefixes, and Honorific Suffixes. The text components are separated
+ by the SEMI-COLON character (ASCII decimal 59). Individual text
+ components can include multiple text values (e.g., multiple
+ Additional Names) separated by the COMMA character (ASCII decimal
+ 44). This type is based on the semantics of the X.520 individual name
+ attributes. The property MUST be present in the vCard object.
+
+ Type example:
+
+ N:Public;John;Quinlan;Mr.;Esq.
+
+ N:Stevenson;John;Philip,Paul;Dr.;Jr.,M.D.,A.C.P.
+
+3.1.3 NICKNAME Type Definition
+
+ To: ietf-mime-directory@imc.org
+
+ Subject: Registration of text/directory MIME type NICKNAME
+
+
+
+Dawson & Howes Standards Track [Page 9]
+
+RFC 2426 vCard MIME Directory Profile September 1998
+
+
+ Type name: NICKNAME
+
+ Type purpose: To specify the text corresponding to the nickname of
+ the object the vCard represents.
+
+ Type encoding: 8bit
+
+ Type value: One or more text values separated by a COMMA character
+ (ASCII decimal 44).
+
+ Type special note: The nickname is the descriptive name given instead
+ of or in addition to the one belonging to a person, place, or thing.
+ It can also be used to specify a familiar form of a proper name
+ specified by the FN or N types.
+
+ Type example:
+
+ NICKNAME:Robbie
+
+ NICKNAME:Jim,Jimmie
+
+3.1.4 PHOTO Type Definition
+
+ To: ietf-mime-directory@imc.org
+
+ Subject: Registration of text/directory MIME type PHOTO
+
+ Type name: PHOTO
+
+ Type purpose: To specify an image or photograph information that
+ annotates some aspect of the object the vCard represents.
+
+ Type encoding: The encoding MUST be reset to "b" using the ENCODING
+ parameter in order to specify inline, encoded binary data. If the
+ value is referenced by a URI value, then the default encoding of 8bit
+ is used and no explicit ENCODING parameter is needed.
+
+ Type value: A single value. The default is binary value. It can also
+ be reset to uri value. The uri value can be used to specify a value
+ outside of this MIME entity.
+
+ Type special notes: The type can include the type parameter "TYPE" to
+ specify the graphic image format type. The TYPE parameter values MUST
+ be one of the IANA registered image formats or a non-standard image
+ format.
+
+
+
+
+
+
+Dawson & Howes Standards Track [Page 10]
+
+RFC 2426 vCard MIME Directory Profile September 1998
+
+
+ Type example:
+
+ PHOTO;VALUE=uri:http://www.abc.com/pub/photos
+ /jqpublic.gif
+
+
+ PHOTO;ENCODING=b;TYPE=JPEG:MIICajCCAdOgAwIBAgICBEUwDQYJKoZIhvcN
+ AQEEBQAwdzELMAkGA1UEBhMCVVMxLDAqBgNVBAoTI05ldHNjYXBlIENvbW11bm
+ ljYXRpb25zIENvcnBvcmF0aW9uMRwwGgYDVQQLExNJbmZvcm1hdGlvbiBTeXN0
+ <...remainder of "B" encoded binary data...>
+
+3.1.5 BDAY Type Definition
+
+ To: ietf-mime-directory@imc.org
+
+ Subject: Registration of text/directory MIME type BDAY
+
+ Type name: BDAY
+
+ Type purpose: To specify the birth date of the object the vCard
+ represents.
+
+ Type encoding: 8bit
+
+ Type value: The default is a single date value. It can also be reset
+ to a single date-time value.
+
+ Type examples:
+
+ BDAY:1996-04-15
+
+ BDAY:1953-10-15T23:10:00Z
+
+ BDAY:1987-09-27T08:30:00-06:00
+
+3.2 Delivery Addressing Types
+
+ These types are concerned with information related to the delivery
+ addressing or label for the vCard object.
+
+3.2.1 ADR Type Definition
+
+ To: ietf-mime-directory@imc.org
+
+ Subject: Registration of text/directory MIME type ADR
+
+ Type name: ADR
+
+
+
+
+Dawson & Howes Standards Track [Page 11]
+
+RFC 2426 vCard MIME Directory Profile September 1998
+
+
+ Type purpose: To specify the components of the delivery address for
+ the vCard object.
+
+ Type encoding: 8bit
+
+ Type value: A single structured text value, separated by the
+ SEMI-COLON character (ASCII decimal 59).
+
+ Type special notes: The structured type value consists of a sequence
+ of address components. The component values MUST be specified in
+ their corresponding position. The structured type value corresponds,
+ in sequence, to the post office box; the extended address; the street
+ address; the locality (e.g., city); the region (e.g., state or
+ province); the postal code; the country name. When a component value
+ is missing, the associated component separator MUST still be
+ specified.
+
+ The text components are separated by the SEMI-COLON character (ASCII
+ decimal 59). Where it makes semantic sense, individual text
+ components can include multiple text values (e.g., a "street"
+ component with multiple lines) separated by the COMMA character
+ (ASCII decimal 44).
+
+ The type can include the type parameter "TYPE" to specify the
+ delivery address type. The TYPE parameter values can include "dom" to
+ indicate a domestic delivery address; "intl" to indicate an
+ international delivery address; "postal" to indicate a postal
+ delivery address; "parcel" to indicate a parcel delivery address;
+ "home" to indicate a delivery address for a residence; "work" to
+ indicate delivery address for a place of work; and "pref" to indicate
+ the preferred delivery address when more than one address is
+ specified. These type parameter values can be specified as a
+ parameter list (i.e., "TYPE=dom;TYPE=postal") or as a value list
+ (i.e., "TYPE=dom,postal"). This type is based on semantics of the
+ X.520 geographical and postal addressing attributes. The default is
+ "TYPE=intl,postal,parcel,work". The default can be overridden to some
+ other set of values by specifying one or more alternate values. For
+ example, the default can be reset to "TYPE=dom,postal,work,home" to
+ specify a domestic delivery address for postal delivery to a
+ residence that is also used for work.
+
+ Type example: In this example the post office box and the extended
+ address are absent.
+
+ ADR;TYPE=dom,home,postal,parcel:;;123 Main
+ Street;Any Town;CA;91921-1234
+
+
+
+
+
+Dawson & Howes Standards Track [Page 12]
+
+RFC 2426 vCard MIME Directory Profile September 1998
+
+
+3.2.2 LABEL Type Definition
+
+ To: ietf-mime-directory@imc.org
+
+ Subject: Registration of text/directory MIME type LABEL
+
+ Type name: LABEL
+
+ Type purpose: To specify the formatted text corresponding to delivery
+ address of the object the vCard represents.
+
+ Type encoding: 8bit
+
+ Type value: A single text value.
+
+ Type special notes: The type value is formatted text that can be used
+ to present a delivery address label for the vCard object. The type
+ can include the type parameter "TYPE" to specify delivery label type.
+ The TYPE parameter values can include "dom" to indicate a domestic
+ delivery label; "intl" to indicate an international delivery label;
+ "postal" to indicate a postal delivery label; "parcel" to indicate a
+ parcel delivery label; "home" to indicate a delivery label for a
+ residence; "work" to indicate delivery label for a place of work; and
+ "pref" to indicate the preferred delivery label when more than one
+ label is specified. These type parameter values can be specified as a
+ parameter list (i.e., "TYPE=dom;TYPE=postal") or as a value list
+ (i.e., "TYPE=dom,postal"). This type is based on semantics of the
+ X.520 geographical and postal addressing attributes. The default is
+ "TYPE=intl,postal,parcel,work". The default can be overridden to some
+ other set of values by specifying one or more alternate values. For
+ example, the default can be reset to "TYPE=intl,post,parcel,home" to
+ specify an international delivery label for both postal and parcel
+ delivery to a residential location.
+
+ Type example: A multi-line address label.
+
+ LABEL;TYPE=dom,home,postal,parcel:Mr.John Q. Public\, Esq.\n
+ Mail Drop: TNE QB\n123 Main Street\nAny Town\, CA 91921-1234
+ \nU.S.A.
+
+3.3 Telecommunications Addressing Types
+
+ These types are concerned with information associated with the
+ telecommunications addressing of the object the vCard represents.
+
+
+
+
+
+
+
+Dawson & Howes Standards Track [Page 13]
+
+RFC 2426 vCard MIME Directory Profile September 1998
+
+
+3.3.1 TEL Type Definition
+
+ To: ietf-mime-directory@imc.org
+
+ Subject: Registration of text/directory MIME type TEL
+
+ Type name: TEL
+
+ Type purpose: To specify the telephone number for telephony
+ communication with the object the vCard represents.
+
+ Type encoding: 8bit
+
+ Type value: A single phone-number value.
+
+ Type special notes: The value of this type is specified in a
+ canonical form in order to specify an unambiguous representation of
+ the globally unique telephone endpoint. This type is based on the
+ X.500 Telephone Number attribute.
+
+ The type can include the type parameter "TYPE" to specify intended
+ use for the telephone number. The TYPE parameter values can include:
+ "home" to indicate a telephone number associated with a residence,
+ "msg" to indicate the telephone number has voice messaging support,
+ "work" to indicate a telephone number associated with a place of
+ work, "pref" to indicate a preferred-use telephone number, "voice" to
+ indicate a voice telephone number, "fax" to indicate a facsimile
+ telephone number, "cell" to indicate a cellular telephone number,
+ "video" to indicate a video conferencing telephone number, "pager" to
+ indicate a paging device telephone number, "bbs" to indicate a
+ bulletin board system telephone number, "modem" to indicate a MODEM
+ connected telephone number, "car" to indicate a car-phone telephone
+ number, "isdn" to indicate an ISDN service telephone number, "pcs" to
+ indicate a personal communication services telephone number. The
+ default type is "voice". These type parameter values can be specified
+ as a parameter list (i.e., "TYPE=work;TYPE=voice") or as a value list
+ (i.e., "TYPE=work,voice"). The default can be overridden to another
+ set of values by specifying one or more alternate values. For
+ example, the default TYPE of "voice" can be reset to a WORK and HOME,
+ VOICE and FAX telephone number by the value list
+ "TYPE=work,home,voice,fax".
+
+ Type example:
+
+ TEL;TYPE=work,voice,pref,msg:+1-213-555-1234
+
+
+
+
+
+
+Dawson & Howes Standards Track [Page 14]
+
+RFC 2426 vCard MIME Directory Profile September 1998
+
+
+3.3.2 EMAIL Type Definition
+
+ To: ietf-mime-directory@imc.org
+
+ Subject: Registration of text/directory MIME type EMAIL
+
+ Type name: EMAIL
+
+ Type purpose: To specify the electronic mail address for
+ communication with the object the vCard represents.
+
+ Type encoding: 8bit
+
+ Type value: A single text value.
+
+ Type special notes: The type can include the type parameter "TYPE" to
+ specify the format or preference of the electronic mail address. The
+ TYPE parameter values can include: "internet" to indicate an Internet
+ addressing type, "x400" to indicate a X.400 addressing type or "pref"
+ to indicate a preferred-use email address when more than one is
+ specified. Another IANA registered address type can also be
+ specified. The default email type is "internet". A non-standard value
+ can also be specified.
+
+ Type example:
+
+ EMAIL;TYPE=internet:jqpublic@xyz.dom1.com
+
+ EMAIL;TYPE=internet:jdoe@isp.net
+
+ EMAIL;TYPE=internet,pref:jane_doe@abc.com
+
+3.3.3 MAILER Type Definition
+
+ To: ietf-mime-directory@imc.org
+
+ Subject: Registration of text/directory MIME type MAILER
+
+ Type name: MAILER
+
+ Type purpose: To specify the type of electronic mail software that is
+ used by the individual associated with the vCard.
+
+ Type encoding: 8bit
+
+ Type value: A single text value.
+
+
+
+
+
+Dawson & Howes Standards Track [Page 15]
+
+RFC 2426 vCard MIME Directory Profile September 1998
+
+
+ Type special notes: This information can provide assistance to a
+ correspondent regarding the type of data representation which can be
+ used, and how they can be packaged. This property is based on the
+ private MIME type X-Mailer that is generally implemented by MIME user
+ agent products.
+
+ Type example:
+
+ MAILER:PigeonMail 2.1
+
+3.4 Geographical Types
+
+ These types are concerned with information associated with
+ geographical positions or regions associated with the object the
+ vCard represents.
+
+3.4.1 TZ Type Definition
+
+ To: ietf-mime-directory@imc.org
+
+ Subject: Registration of text/directory MIME type TZ
+
+ Type name: TZ
+
+ Type purpose: To specify information related to the time zone of the
+ object the vCard represents.
+
+ Type encoding: 8bit
+
+ Type value: The default is a single utc-offset value. It can also be
+ reset to a single text value.
+
+ Type special notes: The type value consists of a single value.
+
+ Type examples:
+
+ TZ:-05:00
+
+ TZ;VALUE=text:-05:00; EST; Raleigh/North America
+ ;This example has a single value, not a structure text value.
+
+3.4.2 GEO Type Definition
+
+ To: ietf-mime-directory@imc.org
+
+ Subject: Registration of text/directory MIME type GEO
+
+ Type name: GEO
+
+
+
+Dawson & Howes Standards Track [Page 16]
+
+RFC 2426 vCard MIME Directory Profile September 1998
+
+
+ Type purpose: To specify information related to the global
+ positioning of the object the vCard represents.
+
+ Type encoding: 8bit
+
+ Type value: A single structured value consisting of two float values
+ separated by the SEMI-COLON character (ASCII decimal 59).
+
+ Type special notes: This type specifies information related to the
+ global position of the object associated with the vCard. The value
+ specifies latitude and longitude, in that order (i.e., "LAT LON"
+ ordering). The longitude represents the location east and west of the
+ prime meridian as a positive or negative real number, respectively.
+ The latitude represents the location north and south of the equator
+ as a positive or negative real number, respectively. The longitude
+ and latitude values MUST be specified as decimal degrees and should
+ be specified to six decimal places. This will allow for granularity
+ within a meter of the geographical position. The text components are
+ separated by the SEMI-COLON character (ASCII decimal 59). The simple
+ formula for converting degrees-minutes-seconds into decimal degrees
+ is:
+
+ decimal = degrees + minutes/60 + seconds/3600.
+
+ Type example:
+
+ GEO:37.386013;-122.082932
+
+3.5 Organizational Types
+
+ These types are concerned with information associated with
+ characteristics of the organization or organizational units of the
+ object the vCard represents.
+
+3.5.1 TITLE Type Definition
+
+ To: ietf-mime-directory@imc.org
+
+ Subject: Registration of text/directory MIME type TITLE
+
+ Type name: TITLE
+
+ Type purpose: To specify the job title, functional position or
+ function of the object the vCard represents.
+
+ Type encoding: 8bit
+
+ Type value: A single text value.
+
+
+
+Dawson & Howes Standards Track [Page 17]
+
+RFC 2426 vCard MIME Directory Profile September 1998
+
+
+ Type special notes: This type is based on the X.520 Title attribute.
+
+ Type example:
+
+ TITLE:Director\, Research and Development
+
+3.5.2 ROLE Type Definition
+
+ To: ietf-mime-directory@imc.org
+
+ Subject: Registration of text/directory MIME type ROLE
+
+ Type name: ROLE
+
+ Type purpose: To specify information concerning the role, occupation,
+ or business category of the object the vCard represents.
+
+ Type encoding: 8bit
+
+ Type value: A single text value.
+
+ Type special notes: This type is based on the X.520 Business Category
+ explanatory attribute. This property is included as an organizational
+ type to avoid confusion with the semantics of the TITLE type and
+ incorrect usage of that type when the semantics of this type is
+ intended.
+
+ Type example:
+
+ ROLE:Programmer
+
+3.5.3 LOGO Type Definition
+
+ To: ietf-mime-directory@imc.org
+
+ Subject: Registration of text/directory MIME type LOGO
+
+ Type name: LOGO
+
+ Type purpose: To specify a graphic image of a logo associated with
+ the object the vCard represents.
+
+ Type encoding: The encoding MUST be reset to "b" using the ENCODING
+ parameter in order to specify inline, encoded binary data. If the
+ value is referenced by a URI value, then the default encoding of 8bit
+ is used and no explicit ENCODING parameter is needed.
+
+
+
+
+
+Dawson & Howes Standards Track [Page 18]
+
+RFC 2426 vCard MIME Directory Profile September 1998
+
+
+ Type value: A single value. The default is binary value. It can also
+ be reset to uri value. The uri value can be used to specify a value
+ outside of this MIME entity.
+
+ Type special notes: The type can include the type parameter "TYPE" to
+ specify the graphic image format type. The TYPE parameter values MUST
+ be one of the IANA registered image formats or a non-standard image
+ format.
+
+ Type example:
+
+ LOGO;VALUE=uri:http://www.abc.com/pub/logos/abccorp.jpg
+
+ LOGO;ENCODING=b;TYPE=JPEG:MIICajCCAdOgAwIBAgICBEUwDQYJKoZIhvcN
+ AQEEBQAwdzELMAkGA1UEBhMCVVMxLDAqBgNVBAoTI05ldHNjYXBlIENvbW11bm
+ ljYXRpb25zIENvcnBvcmF0aW9uMRwwGgYDVQQLExNJbmZvcm1hdGlvbiBTeXN0
+ <...the remainder of "B" encoded binary data...>
+
+3.5.4 AGENT Type Definition
+
+ To: ietf-mime-directory@imc.org
+
+ Subject: Registration of text/directory MIME type AGENT
+
+ Type name: AGENT
+
+ Type purpose: To specify information about another person who will
+ act on behalf of the individual or resource associated with the
+ vCard.
+
+ Type encoding: 8-bit
+
+ Type value: The default is a single vcard value. It can also be reset
+ to either a single text or uri value. The text value can be used to
+ specify textual information. The uri value can be used to specify
+ information outside of this MIME entity.
+
+ Type special notes: This type typically is used to specify an area
+ administrator, assistant, or secretary for the individual associated
+ with the vCard. A key characteristic of the Agent type is that it
+ represents somebody or something that is separately addressable.
+
+ Type example:
+
+ AGENT;VALUE=uri:
+ CID:JQPUBLIC.part3.960129T083020.xyzMail@host3.com
+
+
+
+
+
+Dawson & Howes Standards Track [Page 19]
+
+RFC 2426 vCard MIME Directory Profile September 1998
+
+
+ AGENT:BEGIN:VCARD\nFN:Susan Thomas\nTEL:+1-919-555-
+ 1234\nEMAIL\;INTERNET:sthomas@host.com\nEND:VCARD\n
+
+3.5.5 ORG Type Definition
+
+ To: ietf-mime-directory@imc.org
+
+ Subject: Registration of text/directory MIME type ORG
+
+ Type name: ORG
+
+ Type purpose: To specify the organizational name and units associated
+ with the vCard.
+
+ Type encoding: 8bit
+
+ Type value: A single structured text value consisting of components
+ separated the SEMI-COLON character (ASCII decimal 59).
+
+ Type special notes: The type is based on the X.520 Organization Name
+ and Organization Unit attributes. The type value is a structured type
+ consisting of the organization name, followed by one or more levels
+ of organizational unit names.
+
+ Type example: A type value consisting of an organizational name,
+ organizational unit #1 name and organizational unit #2 name.
+
+ ORG:ABC\, Inc.;North American Division;Marketing
+
+3.6 Explanatory Types
+
+ These types are concerned with additional explanations, such as that
+ related to informational notes or revisions specific to the vCard.
+
+3.6.1 CATEGORIES Type Definition
+
+ To: ietf-mime-directory@imc.org
+
+ Subject: Registration of text/directory MIME type CATEGORIES
+
+ Type name: CATEGORIES
+
+ Type purpose: To specify application category information about the
+ vCard.
+
+ Type encoding: 8bit
+
+
+
+
+
+Dawson & Howes Standards Track [Page 20]
+
+RFC 2426 vCard MIME Directory Profile September 1998
+
+
+ Type value: One or more text values separated by a COMMA character
+ (ASCII decimal 44).
+
+ Type example:
+
+ CATEGORIES:TRAVEL AGENT
+
+ CATEGORIES:INTERNET,IETF,INDUSTRY,INFORMATION TECHNOLOGY
+
+3.6.2 NOTE Type Definition
+
+ To: ietf-mime-directory@imc.org
+
+ Subject: Registration of text/directory MIME type NOTE
+
+ Type name: NOTE
+
+ Type purpose: To specify supplemental information or a comment that
+ is associated with the vCard.
+
+ Type encoding: 8bit
+
+ Type value: A single text value.
+
+ Type special notes: The type is based on the X.520 Description
+ attribute.
+
+ Type example:
+
+ NOTE:This fax number is operational 0800 to 1715
+ EST\, Mon-Fri.
+
+3.6.3 PRODID Type Definition
+
+ To: ietf-mime-directory@imc.org
+
+ Subject: Registration of text/directory MIME type PRODID
+
+ Type name: PRODID
+
+ Type purpose: To specify the identifier for the product that created
+ the vCard object.
+
+ Type encoding: 8-bit
+
+ Type value: A single text value.
+
+
+
+
+
+Dawson & Howes Standards Track [Page 21]
+
+RFC 2426 vCard MIME Directory Profile September 1998
+
+
+ Type special notes: Implementations SHOULD use a method such as that
+ specified for Formal Public Identifiers in ISO 9070 to assure that
+ the text value is unique.
+
+ Type example:
+
+ PRODID:-//ONLINE DIRECTORY//NONSGML Version 1//EN
+
+3.6.4 REV Type Definition
+
+ To: ietf-mime-directory@imc.org
+
+ Subject: Registration of text/directory MIME type REV
+
+ Type name: REV
+
+ Type purpose: To specify revision information about the current
+ vCard.
+
+ Type encoding: 8-bit
+
+ Type value: The default is a single date-time value. Can also be
+ reset to a single date value.
+
+ Type special notes: The value distinguishes the current revision of
+ the information in this vCard for other renditions of the
+ information.
+
+ Type example:
+
+ REV:1995-10-31T22:27:10Z
+
+ REV:1997-11-15
+
+3.6.5 SORT-STRING Type Definition
+
+ To: ietf-mime-directory@imc.org
+
+ Subject: Registration of text/directory MIME type SORT-STRING
+
+ Type Name: SORT-STRING
+
+ Type purpose: To specify the family name or given name text to be
+ used for national-language-specific sorting of the FN and N types.
+
+ Type encoding: 8bit
+
+ Type value: A single text value.
+
+
+
+Dawson & Howes Standards Track [Page 22]
+
+RFC 2426 vCard MIME Directory Profile September 1998
+
+
+ Type special notes: The sort string is used to provide family name or
+ given name text that is to be used in locale- or national-language-
+ specific sorting of the formatted name and structured name types.
+ Without this information, sorting algorithms could incorrectly sort
+ this vCard within a sequence of sorted vCards. When this type is
+ present in a vCard, then this family name or given name value is used
+ for sorting the vCard.
+
+ Type examples: For the case of family name sorting, the following
+ examples define common sort string usage with the FN and N types.
+
+ FN:Rene van der Harten
+ N:van der Harten;Rene;J.;Sir;R.D.O.N.
+ SORT-STRING:Harten
+
+ FN:Robert Pau Shou Chang
+ N:Pau;Shou Chang;Robert
+ SORT-STRING:Pau
+
+ FN:Osamu Koura
+ N:Koura;Osamu
+ SORT-STRING:Koura
+
+ FN:Oscar del Pozo
+ N:del Pozo Triscon;Oscar
+ SORT-STRING:Pozo
+
+ FN:Chistine d'Aboville
+ N:d'Aboville;Christine
+ SORT-STRING:Aboville
+
+3.6.6 SOUND Type Definition
+
+ To: ietf-mime-directory@imc.org
+
+ Subject: Registration of text/directory MIME type SOUND
+
+ Type name: SOUND
+
+ Type purpose: To specify a digital sound content information that
+ annotates some aspect of the vCard. By default this type is used to
+ specify the proper pronunciation of the name type value of the vCard.
+
+ Type encoding: The encoding MUST be reset to "b" using the ENCODING
+ parameter in order to specify inline, encoded binary data. If the
+ value is referenced by a URI value, then the default encoding of 8bit
+ is used and no explicit ENCODING parameter is needed.
+
+
+
+
+Dawson & Howes Standards Track [Page 23]
+
+RFC 2426 vCard MIME Directory Profile September 1998
+
+
+ Type value: A single value. The default is binary value. It can also
+ be reset to uri value. The uri value can be used to specify a value
+ outside of this MIME entity.
+
+ Type special notes: The type can include the type parameter "TYPE" to
+ specify the audio format type. The TYPE parameter values MUST be one
+ of the IANA registered audio formats or a non-standard audio format.
+
+ Type example:
+
+ SOUND;TYPE=BASIC;VALUE=uri:CID:JOHNQPUBLIC.part8.
+ 19960229T080000.xyzMail@host1.com
+
+ SOUND;TYPE=BASIC;ENCODING=b:MIICajCCAdOgAwIBAgICBEUwDQYJKoZIhvcN
+ AQEEBQAwdzELMAkGA1UEBhMCVVMxLDAqBgNVBAoTI05ldHNjYXBlIENvbW11bm
+ ljYXRpb25zIENvcnBvcmF0aW9uMRwwGgYDVQQLExNJbmZvcm1hdGlvbiBTeXN0
+ <...the remainder of "B" encoded binary data...>
+
+3.6.7 UID Type Definition
+
+ To: ietf-mime-directory@imc.org
+
+ Subject: Registration of text/directory MIME type UID
+
+ Type name: UID
+
+ Type purpose: To specify a value that represents a globally unique
+ identifier corresponding to the individual or resource associated
+ with the vCard.
+
+ Type encoding: 8bit
+
+ Type value: A single text value.
+
+ Type special notes: The type is used to uniquely identify the object
+ that the vCard represents.
+
+ The type can include the type parameter "TYPE" to specify the format
+ of the identifier. The TYPE parameter value should be an IANA
+ registered identifier format. The value can also be a non-standard
+ format.
+
+ Type example:
+
+ UID:19950401-080045-40000F192713-0052
+
+
+
+
+
+
+Dawson & Howes Standards Track [Page 24]
+
+RFC 2426 vCard MIME Directory Profile September 1998
+
+
+3.6.8 URL Type Definition
+
+ To: ietf-mime-directory@imc.org
+
+ Subject: Registration of text/directory MIME type URL
+
+ Type name: URL
+
+ Type purpose: To specify a uniform resource locator associated with
+ the object that the vCard refers to.
+
+ Type encoding: 8bit
+
+ Type value: A single uri value.
+
+ Type example:
+
+ URL:http://www.swbyps.restaurant.french/~chezchic.html
+
+3.6.9 VERSION Type Definition
+
+ To: ietf-mime-directory@imc.org
+
+ Subject: Registration of text/directory MIME type VERSION
+
+ Type name: VERSION
+
+ Type purpose: To specify the version of the vCard specification used
+ to format this vCard.
+
+ Type encoding: 8bit
+
+ Type value: A single text value.
+
+ Type special notes: The property MUST be present in the vCard object.
+ The value MUST be "3.0" if the vCard corresponds to this
+ specification.
+
+ Type example:
+
+ VERSION:3.0
+
+3.7 Security Types
+
+ These types are concerned with the security of communication pathways
+ or access to the vCard.
+
+
+
+
+
+Dawson & Howes Standards Track [Page 25]
+
+RFC 2426 vCard MIME Directory Profile September 1998
+
+
+3.7.1 CLASS Type Definition
+
+ To: ietf-mime-directory@imc.org
+
+ Subject: Registration of text/directory MIME type CLASS
+
+ Type name: CLASS
+
+ Type purpose: To specify the access classification for a vCard
+ object.
+
+ Type encoding: 8bit
+
+ Type value: A single text value.
+
+ Type special notes: An access classification is only one component of
+ the general security model for a directory service. The
+ classification attribute provides a method of capturing the intent of
+ the owner for general access to information described by the vCard
+ object.
+
+ Type examples:
+
+ CLASS:PUBLIC
+
+ CLASS:PRIVATE
+
+ CLASS:CONFIDENTIAL
+
+3.7.2 KEY Type Definition
+
+ To: ietf-mime-directory@imc.org
+
+ Subject: Registration of text/directory MIME type KEY
+
+ Type name: KEY
+
+ Type purpose: To specify a public key or authentication certificate
+ associated with the object that the vCard represents.
+
+ Type encoding: The encoding MUST be reset to "b" using the ENCODING
+ parameter in order to specify inline, encoded binary data. If the
+ value is a text value, then the default encoding of 8bit is used and
+ no explicit ENCODING parameter is needed.
+
+ Type value: A single value. The default is binary. It can also be
+ reset to text value. The text value can be used to specify a text
+ key.
+
+
+
+Dawson & Howes Standards Track [Page 26]
+
+RFC 2426 vCard MIME Directory Profile September 1998
+
+
+ Type special notes: The type can also include the type parameter TYPE
+ to specify the public key or authentication certificate format. The
+ parameter type should specify an IANA registered public key or
+ authentication certificate format. The parameter type can also
+ specify a non-standard format.
+
+ Type example:
+
+ KEY;ENCODING=b:MIICajCCAdOgAwIBAgICBEUwDQYJKoZIhvcNAQEEBQA
+ wdzELMAkGA1UEBhMCVVMxLDAqBgNVBAoTI05ldHNjYXBlIENbW11bmljYX
+ Rpb25zIENvcnBvcmF0aW9uMRwwGgYDVQQLExNJbmZvcm1hdGlvbiBTeXN0
+ ZW1zMRwwGgYDVQQDExNyb290Y2EubmV0c2NhcGUuY29tMB4XDTk3MDYwNj
+ E5NDc1OVoXDTk3MTIwMzE5NDc1OVowgYkxCzAJBgNVBAYTAlVTMSYwJAYD
+ VQQKEx1OZXRzY2FwZSBDb21tdW5pY2F0aW9ucyBDb3JwLjEYMBYGA1UEAx
+ MPVGltb3RoeSBBIEhvd2VzMSEwHwYJKoZIhvcNAQkBFhJob3dlc0BuZXRz
+ Y2FwZS5jb20xFTATBgoJkiaJk/IsZAEBEwVob3dlczBcMA0GCSqGSIb3DQ
+ EBAQUAA0sAMEgCQQC0JZf6wkg8pLMXHHCUvMfL5H6zjSk4vTTXZpYyrdN2
+ dXcoX49LKiOmgeJSzoiFKHtLOIboyludF90CgqcxtwKnAgMBAAGjNjA0MB
+ EGCWCGSAGG+EIBAQQEAwIAoDAfBgNVHSMEGDAWgBT84FToB/GV3jr3mcau
+ +hUMbsQukjANBgkqhkiG9w0BAQQFAAOBgQBexv7o7mi3PLXadkmNP9LcIP
+ mx93HGp0Kgyx1jIVMyNgsemeAwBM+MSlhMfcpbTrONwNjZYW8vJDSoi//y
+ rZlVt9bJbs7MNYZVsyF1unsqaln4/vy6Uawfg8VUMk1U7jt8LYpo4YULU7
+ UZHPYVUaSgVttImOHZIKi4hlPXBOhcUQ==
+
+3.8 Extended Types
+
+ The types defined by this document can be extended with private types
+ using the non-standard, private values mechanism defined in [RFC
+ 2045]. Non-standard, private types with a name starting with "X-" may
+ be defined bilaterally between two cooperating agents without outside
+ registration or standardization.
+
+4. Formal Grammar
+
+ The following formal grammar is provided to assist developers in
+ building parsers for the vCard.
+
+ This syntax is written according to the form described in RFC 2234,
+ but it references just this small subset of RFC 2234 literals:
+
+ ;*******************************************
+ ; Commonly Used Literal Definition
+ ;*******************************************
+
+ ALPHA = %x41-5A / %x61-7A
+ ; Latin Capital Letter A-Latin Capital Letter Z /
+ ; Latin Small Letter a-Latin Small Letter z
+
+
+
+
+Dawson & Howes Standards Track [Page 27]
+
+RFC 2426 vCard MIME Directory Profile September 1998
+
+
+ CHAR = %x01-7F
+ ; Any C0 Controls and Basic Latin, excluding NULL from
+ ; Code Charts, pages 7-6 through 7-9 in [UNICODE]
+
+ CR = %x0D
+ ; Carriage Return
+
+ LF = %0A
+ ; Line Feed
+
+ CRLF = CR LF
+ ; Internet standard newline
+
+ ;CTL = %x00-1F / %x7F
+ ; Controls. Not used, but referenced in comments.
+
+ DIGIT = %x30-39
+ ; Digit Zero-Digit Nine
+
+ DQUOTE = %x22
+ ; Quotation Mark
+
+ HTAB = %x09
+ ; Horizontal Tabulation
+
+ SP = %x20
+ ; space
+
+ VCHAR = %x21-7E
+ ; Visible (printing) characters
+
+ WSP = SP / HTAB
+ ; White Space
+
+ ;*******************************************
+ ; Basic vCard Definition
+ ;*******************************************
+
+ vcard_entity = 1*(vcard)
+
+ vcard = [group "."] "BEGIN" ":" "VCARD" 1*CRLF
+ 1*(contentline)
+ ;A vCard object MUST include the VERSION, FN and N types.
+ [group "."] "END" ":" "VCARD" 1*CRLF
+
+ contentline = [group "."] name *(";" param ) ":" value CRLF
+ ; When parsing a content line, folded lines must first
+ ; be unfolded according to the unfolding procedure
+
+
+
+Dawson & Howes Standards Track [Page 28]
+
+RFC 2426 vCard MIME Directory Profile September 1998
+
+
+ ; described above. When generating a content line, lines
+ ; longer than 75 characters SHOULD be folded according to
+ ; the folding procedure described in [MIME DIR].
+
+ group = 1*(ALPHA / DIGIT / "-")
+
+ name = iana-token / x-name
+ ; Parsing of the param and value is
+ ; based on the "name" or type identifier
+ ; as defined in ABNF sections below
+
+ iana-token = 1*(ALPHA / DIGIT / "-")
+ ; vCard type or parameter identifier registered with IANA
+
+ x-name = "X-" 1*(ALPHA / DIGIT / "-")
+ ; Reserved for non-standard use
+
+ param = param-name "=" param-value *("," param-value)
+
+ param-name = iana-token / x-name
+
+ param-value = ptext / quoted-string
+
+ ptext = *SAFE-CHAR
+
+ value = *VALUE-CHAR
+
+ quoted-string = DQUOTE QSAFE-CHAR DQUOTE
+
+ NON-ASCII = %x80-FF
+ ; Use is restricted by CHARSET parameter
+ ; on outer MIME object (UTF-8 preferred)
+
+ QSAFE-CHAR = WSP / %x21 / %x23-7E / NON-ASCII
+ ; Any character except CTLs, DQUOTE
+
+ SAFE-CHAR = WSP / %x21 / %x23-2B / %x2D-39 / %x3C-7E / NON-ASCII
+ ; Any character except CTLs, DQUOTE, ";", ":", ","
+
+ VALUE-CHAR = WSP / VCHAR / NON-ASCII
+ ; Any textual character
+
+ ;*******************************************
+ ; vCard Type Definition
+ ;
+ ; Provides type-specific definitions for how the
+ ; "value" and "param" are defined.
+ ;*******************************************
+
+
+
+Dawson & Howes Standards Track [Page 29]
+
+RFC 2426 vCard MIME Directory Profile September 1998
+
+
+ ;For name="NAME"
+ param = ""
+ ; No parameters allowed
+
+ value = text-value
+
+ ;For name="PROFILE"
+ param = ""
+ ; No parameters allowed
+
+ value = text-value
+ ; Value MUST be the case insensitive value "VCARD
+
+ ;For name="SOURCE"
+ param = source-param
+ ; No parameters allowed
+
+ value = uri
+
+ source-param = ("VALUE" "=" "uri")
+ / ("CONTEXT" "=" "word")
+ ; Parameter value specifies the protocol context
+ ; for the uri value.
+ / (x-name "=" *SAFE-CHAR)
+
+ ;For name="FN"
+ ;This type MUST be included in a vCard object.
+ param = text-param
+ ; Text parameters allowed
+
+ value = text-value
+
+ ;For name="N"
+ ;This type MUST be included in a vCard object.
+
+ param = text-param
+ ; Text parameters allowed
+
+ value = n-value
+
+ n-value = 0*4(text-value *("," text-value) ";")
+ text-value *("," text-value)
+ ; Family; Given; Middle; Prefix; Suffix.
+ ; Example: Public;John;Quincy,Adams;Reverend Dr. III
+
+ ;For name="NICKNAME"
+ param = text-param
+ ; Text parameters allowed
+
+
+
+Dawson & Howes Standards Track [Page 30]
+
+RFC 2426 vCard MIME Directory Profile September 1998
+
+
+ value = text-list
+
+ ;For name="PHOTO"
+ param = img-inline-param
+ ; Only image parameters allowed
+
+ param =/ img-refer-param
+ ; Only image parameters allowed
+
+ value = img-inline-value
+ ; Value and parameter MUST match
+
+ value =/ img-refer-value
+ ; Value and parameter MUST match
+
+ ;For name="BDAY"
+ param = ("VALUE" "=" "date")
+ ; Only value parameter allowed
+
+ param =/ ("VALUE" "=" "date-time")
+ ; Only value parameter allowed
+
+ value = date-value
+ ; Value MUST match value type
+
+ value =/ date-time-value
+ ; Value MUST match value type
+
+ ;For name="ADR"
+ param = adr-param / text-param
+ ; Only adr and text parameters allowed
+
+ value = adr-value
+
+ ;For name="LABEL"
+ param = adr-param / text-param
+ ; Only adr and text parameters allowed
+
+ value = text-value
+
+ ;For name="TEL"
+ param = tel-param
+ ; Only tel parameters allowed
+
+ value = phone-number-value
+
+ tel-param = "TYPE" "=" tel-type *("," tel-type)
+
+
+
+
+Dawson & Howes Standards Track [Page 31]
+
+RFC 2426 vCard MIME Directory Profile September 1998
+
+
+ tel-type = "HOME" / "WORK" / "PREF" / "VOICE" / "FAX" / "MSG"
+ / "CELL" / "PAGER" / "BBS" / "MODEM" / "CAR" / "ISDN"
+ / "VIDEO" / "PCS" / iana-token / x-name
+ ; Values are case insensitive
+
+ ;For name="EMAIL"
+ param = email-param
+ ; Only email parameters allowed
+
+ value = text-value
+
+ email-param = "TYPE" "=" email-type ["," "PREF"]
+ ; Value is case insensitive
+
+ email-type = "INTERNET" / "X400" / iana-token / "X-" word
+ ; Values are case insensitive
+
+ ;For name="MAILER"
+ param = text-param
+ ; Only text parameters allowed
+
+ value = text-value
+
+ ;For name="TZ"
+ param = ""
+ ; No parameters allowed
+
+ value = utc-offset-value
+
+ ;For name="GEO"
+ param = ""
+ ; No parameters allowed
+
+ value = float-value ";" float-value
+
+ ;For name="TITLE"
+ param = text-param
+ ; Only text parameters allowed
+
+ value = text-value
+
+ ;For name="ROLE"
+ param = text-param
+ ; Only text parameters allowed
+
+ value = text-value
+
+ ;For name="LOGO"
+
+
+
+Dawson & Howes Standards Track [Page 32]
+
+RFC 2426 vCard MIME Directory Profile September 1998
+
+
+ param = img-inline-param / img-refer-param
+ ; Only image parameters allowed
+
+ value = img-inline-value / img-refer-value
+ ; Value and parameter MUST match
+
+ ;For name="AGENT"
+ param = agent-inline-param
+
+ param =/ agent-refer-param
+
+ value = agent-inline-value
+ ; Value and parameter MUST match
+
+ value =/ agent-refer-value
+ ; Value and parameter MUST match
+
+ agent-inline-param = ""
+ ; No parameters allowed
+
+ agent-refer-param = "VALUE" "=" "uri"
+ ; Only value parameter allowed
+
+ agent-inline-value = text-value
+ ; Value MUST be a valid vCard object
+
+ agent-refer-value = uri
+ ; URI MUST refer to image content of given type
+
+ ;For name="ORG"
+
+ param = text-param
+ ; Only text parameters allowed
+
+ value = org-value
+
+ org-value = *(text-value ";") text-value
+ ; First is Organization Name, remainder are Organization Units.
+
+ ;For name="CATEGORIES"
+ param = text-param
+ ; Only text parameters allowed
+
+ value = text-list
+
+ ;For name="NOTE"
+ param = text-param
+ ; Only text parameters allowed
+
+
+
+Dawson & Howes Standards Track [Page 33]
+
+RFC 2426 vCard MIME Directory Profile September 1998
+
+
+ value = text-value
+
+ ;For name="PRODID"
+ param = ""
+ ; No parameters allowed
+
+ value = text-value
+
+ ;For name="REV"
+ param = ["VALUE" =" "date-time"]
+ ; Only value parameters allowed. Values are case insensitive.
+
+ param =/ "VALUE" =" "date"
+ ; Only value parameters allowed. Values are case insensitive.
+
+ value = date-time-value
+
+ value =/ date-value
+
+ ;For name="SORT-STRING"
+ param = text-param
+ ; Only text parameters allowed
+
+ value = text-value
+
+ ;For name="SOUND"
+ param = snd-inline-param
+ ; Only sound parameters allowed
+
+ param =/ snd-refer-param
+ ; Only sound parameters allowed
+
+ value = snd-line-value
+ ; Value MUST match value type
+
+ value =/ snd-refer-value
+ ; Value MUST match value type
+
+ snd-inline-value = binary-value CRLF
+ ; Value MUST be "b" encoded audio content
+
+ snd-inline-param = ("VALUE" "=" "binary"])
+ / ("ENCODING" "=" "b")
+ / ("TYPE" "=" *SAFE-CHAR)
+ ; Value MUST be an IANA registered audio type
+
+ snd-refer-value = uri
+ ; URI MUST refer to audio content of given type
+
+
+
+Dawson & Howes Standards Track [Page 34]
+
+RFC 2426 vCard MIME Directory Profile September 1998
+
+
+ snd-refer-param = ("VALUE" "=" "uri")
+ / ("TYPE" "=" word)
+ ; Value MUST be an IANA registered audio type
+
+ ;For name="UID"
+ param = ""
+ ; No parameters allowed
+
+ value = text-value
+
+ ;For name="URL"
+ param = ""
+ ; No parameters allowed
+
+ value = uri
+
+ ;For name="VERSION"
+ ;This type MUST be included in a vCard object.
+ param = ""
+ ; No parameters allowed
+
+ value = text-value
+ ; Value MUST be "3.0"
+
+ ;For name="CLASS"
+ param = ""
+ ; No parameters allowed
+
+ value = "PUBLIC" / "PRIVATE" / "CONFIDENTIAL"
+ / iana-token / x-name
+ ; Value are case insensitive
+
+ ;For name="KEY"
+ param = key-txt-param
+ ; Only value and type parameters allowed
+
+ param =/ key-bin-param
+ ; Only value and type parameters allowed
+
+ value = text-value
+
+ value =/ binary-value
+
+ key-txt-param = "TYPE" "=" keytype
+
+ key-bin-param = ("TYPE" "=" keytype)
+ / ("ENCODING" "=" "b")
+ ; Value MUST be a "b" encoded key or certificate
+
+
+
+Dawson & Howes Standards Track [Page 35]
+
+RFC 2426 vCard MIME Directory Profile September 1998
+
+
+ keytype = "X509" / "PGP" / iana-token / x-name
+ ; Values are case insensitive
+
+ ;For name="X-" non-standard type
+ param = text-param / (x-name "=" param-value)
+ ; Only text or non-standard parameters allowed
+
+ value = text-value
+
+ ;*******************************************
+ ; vCard Commonly Used Parameter Definition
+ ;*******************************************
+
+ text-param = ("VALUE" "=" "ptext")
+ / ("LANGUAGE" "=" langval)
+ / (x-name "=" param-value)
+
+ langval = <a language string as defined in RFC 1766>
+
+ img-inline-value = binary-value
+ ;Value MUST be "b" encoded image content
+
+ img-inline-param
+
+ img-inline-param = ("VALUE" "=" "binary")
+ / ("ENCODING" "=" "b")
+ / ("TYPE" "=" param-value
+ ;TYPE value MUST be an IANA registered image type
+
+ img-refer-value = uri
+ ;URI MUST refer to image content of given type
+
+ img-refer-param = ("VALUE" "=" "uri")
+ / ("TYPE" "=" param-value)
+ ;TYPE value MUST be an IANA registered image type
+
+ adr-param = ("TYPE" "=" adr-type *("," adr-type))
+ / (text-param)
+
+ adr-type = "dom" / "intl" / "postal" / "parcel" / "home"
+ / "work" / "pref" / iana-type / x-name
+
+ adr-value = 0*6(text-value ";") text-value
+ ; PO Box, Extended Address, Street, Locality, Region, Postal
+ ; Code, Country Name
+
+
+
+
+
+
+Dawson & Howes Standards Track [Page 36]
+
+RFC 2426 vCard MIME Directory Profile September 1998
+
+
+ ;*******************************************
+ ; vCard Type Value Definition
+ ;*******************************************
+
+ text-value-list = 1*text-value *("," 1*text-value)
+
+ text-value = *(SAFE-CHAR / ":" / DQUOTE / ESCAPED-CHAR)
+
+ ESCAPED-CHAR = "\\" / "\;" / "\," / "\n" / "\N")
+ ; \\ encodes \, \n or \N encodes newline
+ ; \; encodes ;, \, encodes ,
+
+ binary-value = <A "b" encoded text value as defined in [RFC 2047]>
+
+ date-value = <A single date value as defined in [MIME-DIR]>
+
+ time-value = <A single time value as defined in [MIME-DIR]>
+
+ date-time-value = <A single date-time value as defined in [MIME-DIR]
+
+ float-value = <A single float value as defined in [MIME-DIR]>
+
+ phone-number-value = <A single text value as defined in [CCITT
+ E.163] and [CCITT X.121]>
+
+ uri-value = <A uri value as defined in [MIME-DIR]>
+
+ utc-offset-value = ("+" / "-") time-hour ":" time-minute
+ time-hour = 2DIGIT ;00-23
+ time-minute = 2DIGIT ;00-59
+
+5. Differences From vCard v2.1
+
+ This specification has been reviewed by the IETF community. The
+ review process introduced a number of differences from the [VCARD]
+ version 2.1. These differences require that vCard objects conforming
+ to this specification have a different version number than a vCard
+ conforming to [VCARD]. The differences include the following:
+
+ . The QUOTED-PRINTABLE inline encoding has been eliminated.
+ Only the "B" encoding of [RFC 2047] is an allowed value for
+ the ENCODING parameter.
+
+ . The method for specifying CRLF character sequences in text
+ type values has been changed. The CRLF character sequence in
+ a text type value is specified with the backslash character
+ sequence "\n" or "\N".
+
+
+
+
+Dawson & Howes Standards Track [Page 37]
+
+RFC 2426 vCard MIME Directory Profile September 1998
+
+
+ . Any COMMA or SEMICOLON in a text type value must be backslash
+ escaped.
+
+ . VERSION value corresponding to this specification MUST be
+ "3.0".
+
+ . The [MIME-DIR] predefined types of SOURCE, NAME and PROFILE
+ are allowed.
+
+ . The [MIME-DIR] VALUE type parameter for value data typing is
+ allowed. In addition, there are extensions made to these type
+ values for additional value types used in this specification.
+
+ . The [VCARD] CHARSET type parameter has been eliminated.
+ Character set can only be specified on the CHARSET parameter
+ on the Content-Type MIME header field.
+
+ . The [VCARD] support for non-significant WSP character has
+ been eliminated.
+
+ . The "TYPE=" prefix to parameter values is required. In
+ [VCARD] this was optional.
+
+ . LOGO, PHOTO and SOUND multimedia formats MUST be either IANA
+ registered types or non-standard types.
+
+ . Inline binary content must be "B" encoded and folded. A blank
+ line after the encoded binary content is no longer required.
+
+ . TEL values can be identified as personal communication
+ services telephone numbers with the PCS type parameter value.
+
+ . The CATEGORIES, CLASS, NICKNAME, PRODID and SORT-STRING types
+ have been added.
+
+ . The VERSION, N and FN types MUST be specified in a vCard.
+ This identifies the version of the specification that the
+ object was formatted to. It also assures that every vCard
+ will include both a structured and formatted name that can be
+ used to identify the object.
+
+
+
+
+
+
+
+
+
+
+
+Dawson & Howes Standards Track [Page 38]
+
+RFC 2426 vCard MIME Directory Profile September 1998
+
+
+6. Acknowledgements
+
+ The many valuable comments contributed by members of the IETF ASID
+ working group are gratefully acknowledged, as are the contributions
+ by Roland Alden, Stephen Bartlett, Alec Dun, Patrik Faltstrom, Daniel
+ Gurney, Bruce Johnston, Daniel Klaussen, Pete Miller, Keith Moore,
+ Vinod Seraphin, Michelle Watkins. Chris Newman was especially helpful
+ in navigating the intricacies of ABNF lore.
+
+7. Authors' Addresses
+
+ BEGIN:vCard
+ VERSION:3.0
+ FN:Frank Dawson
+ ORG:Lotus Development Corporation
+ ADR;TYPE=WORK,POSTAL,PARCEL:;;6544 Battleford Drive
+ ;Raleigh;NC;27613-3502;U.S.A.
+ TEL;TYPE=VOICE,MSG,WORK:+1-919-676-9515
+ TEL;TYPE=FAX,WORK:+1-919-676-9564
+ EMAIL;TYPE=INTERNET,PREF:Frank_Dawson@Lotus.com
+ EMAIL;TYPE=INTERNET:fdawson@earthlink.net
+ URL:http://home.earthlink.net/~fdawson
+ END:vCard
+
+
+ BEGIN:vCard
+ VERSION:3.0
+ FN:Tim Howes
+ ORG:Netscape Communications Corp.
+ ADR;TYPE=WORK:;;501 E. Middlefield Rd.;Mountain View;
+ CA; 94043;U.S.A.
+ TEL;TYPE=VOICE,MSG,WORK:+1-415-937-3419
+ TEL;TYPE=FAX,WORK:+1-415-528-4164
+ EMAIL;TYPE=INTERNET:howes@netscape.com
+ END:vCard
+
+8. Security Considerations
+
+ vCards can carry cryptographic keys or certificates, as described in
+ Section 3.7.2.
+
+ Section 3.7.1 specifies a desired security classification policy for
+ a particular vCard. That policy is not enforced in any way.
+
+ The vCard objects have no inherent authentication or privacy, but can
+ easily be carried by any security mechanism that transfers MIME
+ objects with authentication or privacy. In cases where threats of
+ "spoofed" vCard information is a concern, the vCard SHOULD BE
+
+
+
+Dawson & Howes Standards Track [Page 39]
+
+RFC 2426 vCard MIME Directory Profile September 1998
+
+
+ transported using one of these secure mechanisms.
+
+ The information in a vCard may become out of date. In cases where the
+ vitality of data is important to an originator of a vCard, the "URL"
+ type described in section 3.6.8 SHOULD BE specified. In addition, the
+ "REV" type described in section 3.6.4 can be specified to indicate
+ the last time that the vCard data was updated.
+
+9. References
+
+ [ISO 8601] ISO 8601:1988 - Data elements and interchange formats -
+ Information interchange - Representation of dates and
+ times - The International Organization for
+ Standardization, June, 1988.
+
+ [ISO 8601 TC] ISO 8601, Technical Corrigendum 1 - Data elements and
+ interchange formats - Information interchange -
+ Representation of dates and times - The International
+ Organization for Standardization, May, 1991.
+
+ [ISO 9070] ISO 9070, Information Processing - SGML support
+ facilities - Registration Procedures for Public Text
+ Owner Identifiers, April, 1991.
+
+ [CCITT E.163] Recommendation E.163 - Numbering Plan for The
+ International Telephone Service, CCITT Blue Book,
+ Fascicle II.2, pp. 128-134, November, 1988.
+
+ [CCITT X.121] Recommendation X.121 - International Numbering Plan for
+ Public Data Networks, CCITT Blue Book, Fascicle VIII.3,
+ pp. 317-332, November, 1988.
+
+ [CCITT X.520] Recommendation X.520 - The Directory - Selected
+ Attribute Types, November 1988.
+
+ [CCITT X.521] Recommendation X.521 - The Directory - Selected Object
+ Classes, November 1988.
+
+ [MIME-DIR] Howes, T., Smith, M., and F. Dawson, "A MIME Content-
+ Type for Directory Information", RFC 2425, September
+ 1998.
+
+ [RFC 1738] Berners-Lee, T., Masinter, L., and M. McCahill,
+ "Uniform Resource Locators (URL)", RFC 1738, December
+ 1994.
+
+ [RFC 1766] Alvestrand, H., "Tags for the Identification of
+ Languages", RFC 1766, March 1995.
+
+
+
+Dawson & Howes Standards Track [Page 40]
+
+RFC 2426 vCard MIME Directory Profile September 1998
+
+
+ [RFC 1872] Levinson, E., "The MIME Multipart/Related Content-
+ type", RFC 1872, December 1995.
+
+ [RFC 2045] Freed, N., and N. Borenstein, "Multipurpose Internet
+ Mail Extensions (MIME) - Part One: Format of Internet
+ Message Bodies", RFC 2045, November 1996.
+
+ [RFC 2046] Freed, N., and N. Borenstein, "Multipurpose Internet
+ Mail Extensions (MIME) - Part Two: Media Types", RFC
+ 2046, November 1996.
+
+ [RFC 2047] Moore, K., "Multipurpose Internet Mail Extensions
+ (MIME) - Part Three: Message Header Extensions for
+ Non-ASCII Text", RFC 2047, November 1996.
+
+ [RFC 2048] Freed, N., Klensin, J., and J. Postel, "Multipurpose
+ Internet Mail Extensions (MIME) - Part Four:
+ Registration Procedures", RFC 2048, January 1997.
+
+ [RFC 2119] Bradner, S., "Key words for use in RFCs to Indicate
+ Requirement Levels", BCP 14, RFC 2119, March 1997.
+
+ [RFC 2234] Crocker, D., and P. Overell, "Augmented BNF for Syntax
+ Specifications: ABNF", RFC 2234, November 1997.
+
+ [UNICODE] "The Unicode Standard - Version 2.0", The Unicode
+ Consortium, July 1996.
+
+ [VCARD] Internet Mail Consortium, "vCard - The Electronic
+ Business Card Version 2.1",
+ http://www.imc.org/pdi/vcard-21.txt, September 18,
+ 1996.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Dawson & Howes Standards Track [Page 41]
+
+RFC 2426 vCard MIME Directory Profile September 1998
+
+
+10. Full Copyright Statement
+
+ Copyright (C) The Internet Society (1998). All Rights Reserved.
+
+ This document and translations of it may be copied and furnished to
+ others, and derivative works that comment on or otherwise explain it
+ or assist in its implementation may be prepared, copied, published
+ and distributed, in whole or in part, without restriction of any
+ kind, provided that the above copyright notice and this paragraph are
+ included on all such copies and derivative works. However, this
+ document itself may not be modified in any way, such as by removing
+ the copyright notice or references to the Internet Society or other
+ Internet organizations, except as needed for the purpose of
+ developing Internet standards in which case the procedures for
+ copyrights defined in the Internet Standards process must be
+ followed, or as required to translate it into languages other than
+ English.
+
+ The limited permissions granted above are perpetual and will not be
+ revoked by the Internet Society or its successors or assigns.
+
+ This document and the information contained herein is provided on an
+ "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING
+ TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING
+ BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION
+ HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF
+ MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Dawson & Howes Standards Track [Page 42]
+
diff --git a/vendor/sabre/dav/docs/rfc2518.txt b/vendor/sabre/dav/docs/rfc2518.txt
new file mode 100644
index 000000000..81d40387b
--- /dev/null
+++ b/vendor/sabre/dav/docs/rfc2518.txt
@@ -0,0 +1,5267 @@
+
+
+
+
+
+
+Network Working Group Y. Goland
+Request for Comments: 2518 Microsoft
+Category: Standards Track E. Whitehead
+ UC Irvine
+ A. Faizi
+ Netscape
+ S. Carter
+ Novell
+ D. Jensen
+ Novell
+ February 1999
+
+
+ HTTP Extensions for Distributed Authoring -- WEBDAV
+
+Status of this Memo
+
+ This document specifies an Internet standards track protocol for the
+ Internet community, and requests discussion and suggestions for
+ improvements. Please refer to the current edition of the "Internet
+ Official Protocol Standards" (STD 1) for the standardization state
+ and status of this protocol. Distribution of this memo is unlimited.
+
+Copyright Notice
+
+ Copyright (C) The Internet Society (1999). All Rights Reserved.
+
+Abstract
+
+ This document specifies a set of methods, headers, and content-types
+ ancillary to HTTP/1.1 for the management of resource properties,
+ creation and management of resource collections, namespace
+ manipulation, and resource locking (collision avoidance).
+
+Table of Contents
+
+ ABSTRACT............................................................1
+ 1 INTRODUCTION .....................................................5
+ 2 NOTATIONAL CONVENTIONS ...........................................7
+ 3 TERMINOLOGY ......................................................7
+ 4 DATA MODEL FOR RESOURCE PROPERTIES ...............................8
+ 4.1 The Resource Property Model ...................................8
+ 4.2 Existing Metadata Proposals ...................................8
+ 4.3 Properties and HTTP Headers ...................................9
+ 4.4 Property Values ...............................................9
+ 4.5 Property Names ...............................................10
+ 4.6 Media Independent Links ......................................10
+ 5 COLLECTIONS OF WEB RESOURCES ....................................11
+
+
+
+Goland, et al. Standards Track [Page 1]
+
+RFC 2518 WEBDAV February 1999
+
+
+ 5.1 HTTP URL Namespace Model .....................................11
+ 5.2 Collection Resources .........................................11
+ 5.3 Creation and Retrieval of Collection Resources ...............12
+ 5.4 Source Resources and Output Resources ........................13
+ 6 LOCKING .........................................................14
+ 6.1 Exclusive Vs. Shared Locks ...................................14
+ 6.2 Required Support .............................................16
+ 6.3 Lock Tokens ..................................................16
+ 6.4 opaquelocktoken Lock Token URI Scheme ........................16
+ 6.4.1 Node Field Generation Without the IEEE 802 Address ........17
+ 6.5 Lock Capability Discovery ....................................19
+ 6.6 Active Lock Discovery ........................................19
+ 6.7 Usage Considerations .........................................19
+ 7 WRITE LOCK ......................................................20
+ 7.1 Methods Restricted by Write Locks ............................20
+ 7.2 Write Locks and Lock Tokens ..................................20
+ 7.3 Write Locks and Properties ...................................20
+ 7.4 Write Locks and Null Resources ...............................21
+ 7.5 Write Locks and Collections ..................................21
+ 7.6 Write Locks and the If Request Header ........................22
+ 7.6.1 Example - Write Lock ......................................22
+ 7.7 Write Locks and COPY/MOVE ....................................23
+ 7.8 Refreshing Write Locks .......................................23
+ 8 HTTP METHODS FOR DISTRIBUTED AUTHORING ..........................23
+ 8.1 PROPFIND .....................................................24
+ 8.1.1 Example - Retrieving Named Properties .....................25
+ 8.1.2 Example - Using allprop to Retrieve All Properties ........26
+ 8.1.3 Example - Using propname to Retrieve all Property Names ...29
+ 8.2 PROPPATCH ....................................................31
+ 8.2.1 Status Codes for use with 207 (Multi-Status) ..............31
+ 8.2.2 Example - PROPPATCH .......................................32
+ 8.3 MKCOL Method .................................................33
+ 8.3.1 Request ...................................................33
+ 8.3.2 Status Codes ..............................................33
+ 8.3.3 Example - MKCOL ...........................................34
+ 8.4 GET, HEAD for Collections ....................................34
+ 8.5 POST for Collections .........................................35
+ 8.6 DELETE .......................................................35
+ 8.6.1 DELETE for Non-Collection Resources .......................35
+ 8.6.2 DELETE for Collections ....................................36
+ 8.7 PUT ..........................................................36
+ 8.7.1 PUT for Non-Collection Resources ..........................36
+ 8.7.2 PUT for Collections .......................................37
+ 8.8 COPY Method ..................................................37
+ 8.8.1 COPY for HTTP/1.1 resources ...............................37
+ 8.8.2 COPY for Properties .......................................38
+ 8.8.3 COPY for Collections ......................................38
+ 8.8.4 COPY and the Overwrite Header .............................39
+
+
+
+Goland, et al. Standards Track [Page 2]
+
+RFC 2518 WEBDAV February 1999
+
+
+ 8.8.5 Status Codes ..............................................39
+ 8.8.6 Example - COPY with Overwrite .............................40
+ 8.8.7 Example - COPY with No Overwrite ..........................40
+ 8.8.8 Example - COPY of a Collection ............................41
+ 8.9 MOVE Method ..................................................42
+ 8.9.1 MOVE for Properties .......................................42
+ 8.9.2 MOVE for Collections ......................................42
+ 8.9.3 MOVE and the Overwrite Header .............................43
+ 8.9.4 Status Codes ..............................................43
+ 8.9.5 Example - MOVE of a Non-Collection ........................44
+ 8.9.6 Example - MOVE of a Collection ............................44
+ 8.10 LOCK Method ..................................................45
+ 8.10.1 Operation .................................................46
+ 8.10.2 The Effect of Locks on Properties and Collections .........46
+ 8.10.3 Locking Replicated Resources ..............................46
+ 8.10.4 Depth and Locking .........................................46
+ 8.10.5 Interaction with other Methods ............................47
+ 8.10.6 Lock Compatibility Table ..................................47
+ 8.10.7 Status Codes ..............................................48
+ 8.10.8 Example - Simple Lock Request .............................48
+ 8.10.9 Example - Refreshing a Write Lock .........................49
+ 8.10.10 Example - Multi-Resource Lock Request ....................50
+ 8.11 UNLOCK Method ................................................51
+ 8.11.1 Example - UNLOCK ..........................................52
+ 9 HTTP HEADERS FOR DISTRIBUTED AUTHORING ..........................52
+ 9.1 DAV Header ...................................................52
+ 9.2 Depth Header .................................................52
+ 9.3 Destination Header ...........................................54
+ 9.4 If Header ....................................................54
+ 9.4.1 No-tag-list Production ....................................55
+ 9.4.2 Tagged-list Production ....................................55
+ 9.4.3 not Production ............................................56
+ 9.4.4 Matching Function .........................................56
+ 9.4.5 If Header and Non-DAV Compliant Proxies ...................57
+ 9.5 Lock-Token Header ............................................57
+ 9.6 Overwrite Header .............................................57
+ 9.7 Status-URI Response Header ...................................57
+ 9.8 Timeout Request Header .......................................58
+ 10 STATUS CODE EXTENSIONS TO HTTP/1.1 ............................59
+ 10.1 102 Processing ...............................................59
+ 10.2 207 Multi-Status .............................................59
+ 10.3 422 Unprocessable Entity .....................................60
+ 10.4 423 Locked ...................................................60
+ 10.5 424 Failed Dependency ........................................60
+ 10.6 507 Insufficient Storage .....................................60
+ 11 MULTI-STATUS RESPONSE .........................................60
+ 12 XML ELEMENT DEFINITIONS .......................................61
+ 12.1 activelock XML Element .......................................61
+
+
+
+Goland, et al. Standards Track [Page 3]
+
+RFC 2518 WEBDAV February 1999
+
+
+ 12.1.1 depth XML Element .........................................61
+ 12.1.2 locktoken XML Element .....................................61
+ 12.1.3 timeout XML Element .......................................61
+ 12.2 collection XML Element .......................................62
+ 12.3 href XML Element .............................................62
+ 12.4 link XML Element .............................................62
+ 12.4.1 dst XML Element ...........................................62
+ 12.4.2 src XML Element ...........................................62
+ 12.5 lockentry XML Element ........................................63
+ 12.6 lockinfo XML Element .........................................63
+ 12.7 lockscope XML Element ........................................63
+ 12.7.1 exclusive XML Element .....................................63
+ 12.7.2 shared XML Element ........................................63
+ 12.8 locktype XML Element .........................................64
+ 12.8.1 write XML Element .........................................64
+ 12.9 multistatus XML Element ......................................64
+ 12.9.1 response XML Element ......................................64
+ 12.9.2 responsedescription XML Element ...........................65
+ 12.10 owner XML Element ...........................................65
+ 12.11 prop XML element ............................................66
+ 12.12 propertybehavior XML element ................................66
+ 12.12.1 keepalive XML element ....................................66
+ 12.12.2 omit XML element .........................................67
+ 12.13 propertyupdate XML element ..................................67
+ 12.13.1 remove XML element .......................................67
+ 12.13.2 set XML element ..........................................67
+ 12.14 propfind XML Element ........................................68
+ 12.14.1 allprop XML Element ......................................68
+ 12.14.2 propname XML Element .....................................68
+ 13 DAV PROPERTIES ................................................68
+ 13.1 creationdate Property ........................................69
+ 13.2 displayname Property .........................................69
+ 13.3 getcontentlanguage Property ..................................69
+ 13.4 getcontentlength Property ....................................69
+ 13.5 getcontenttype Property ......................................70
+ 13.6 getetag Property .............................................70
+ 13.7 getlastmodified Property .....................................70
+ 13.8 lockdiscovery Property .......................................71
+ 13.8.1 Example - Retrieving the lockdiscovery Property ...........71
+ 13.9 resourcetype Property ........................................72
+ 13.10 source Property .............................................72
+ 13.10.1 Example - A source Property ..............................72
+ 13.11 supportedlock Property ......................................73
+ 13.11.1 Example - Retrieving the supportedlock Property ..........73
+ 14 INSTRUCTIONS FOR PROCESSING XML IN DAV ........................74
+ 15 DAV COMPLIANCE CLASSES ........................................75
+ 15.1 Class 1 ......................................................75
+ 15.2 Class 2 ......................................................75
+
+
+
+Goland, et al. Standards Track [Page 4]
+
+RFC 2518 WEBDAV February 1999
+
+
+ 16 INTERNATIONALIZATION CONSIDERATIONS ...........................76
+ 17 SECURITY CONSIDERATIONS .......................................77
+ 17.1 Authentication of Clients ....................................77
+ 17.2 Denial of Service ............................................78
+ 17.3 Security through Obscurity ...................................78
+ 17.4 Privacy Issues Connected to Locks ............................78
+ 17.5 Privacy Issues Connected to Properties .......................79
+ 17.6 Reduction of Security due to Source Link .....................79
+ 17.7 Implications of XML External Entities ........................79
+ 17.8 Risks Connected with Lock Tokens .............................80
+ 18 IANA CONSIDERATIONS ...........................................80
+ 19 INTELLECTUAL PROPERTY .........................................81
+ 20 ACKNOWLEDGEMENTS ..............................................82
+ 21 REFERENCES ....................................................82
+ 21.1 Normative References .........................................82
+ 21.2 Informational References .....................................83
+ 22 AUTHORS' ADDRESSES ............................................84
+ 23 APPENDICES ....................................................86
+ 23.1 Appendix 1 - WebDAV Document Type Definition .................86
+ 23.2 Appendix 2 - ISO 8601 Date and Time Profile ..................88
+ 23.3 Appendix 3 - Notes on Processing XML Elements ................89
+ 23.3.1 Notes on Empty XML Elements ...............................89
+ 23.3.2 Notes on Illegal XML Processing ...........................89
+ 23.4 Appendix 4 -- XML Namespaces for WebDAV ......................92
+ 23.4.1 Introduction ..............................................92
+ 23.4.2 Meaning of Qualified Names ................................92
+ 24 FULL COPYRIGHT STATEMENT ......................................94
+
+
+
+1 Introduction
+
+ This document describes an extension to the HTTP/1.1 protocol that
+ allows clients to perform remote web content authoring operations.
+ This extension provides a coherent set of methods, headers, request
+ entity body formats, and response entity body formats that provide
+ operations for:
+
+ Properties: The ability to create, remove, and query information
+ about Web pages, such as their authors, creation dates, etc. Also,
+ the ability to link pages of any media type to related pages.
+
+ Collections: The ability to create sets of documents and to retrieve
+ a hierarchical membership listing (like a directory listing in a file
+ system).
+
+
+
+
+
+
+Goland, et al. Standards Track [Page 5]
+
+RFC 2518 WEBDAV February 1999
+
+
+ Locking: The ability to keep more than one person from working on a
+ document at the same time. This prevents the "lost update problem,"
+ in which modifications are lost as first one author then another
+ writes changes without merging the other author's changes.
+
+ Namespace Operations: The ability to instruct the server to copy and
+ move Web resources.
+
+ Requirements and rationale for these operations are described in a
+ companion document, "Requirements for a Distributed Authoring and
+ Versioning Protocol for the World Wide Web" [RFC2291].
+
+ The sections below provide a detailed introduction to resource
+ properties (section 4), collections of resources (section 5), and
+ locking operations (section 6). These sections introduce the
+ abstractions manipulated by the WebDAV-specific HTTP methods
+ described in section 8, "HTTP Methods for Distributed Authoring".
+
+ In HTTP/1.1, method parameter information was exclusively encoded in
+ HTTP headers. Unlike HTTP/1.1, WebDAV encodes method parameter
+ information either in an Extensible Markup Language (XML) [REC-XML]
+ request entity body, or in an HTTP header. The use of XML to encode
+ method parameters was motivated by the ability to add extra XML
+ elements to existing structures, providing extensibility; and by
+ XML's ability to encode information in ISO 10646 character sets,
+ providing internationalization support. As a rule of thumb,
+ parameters are encoded in XML entity bodies when they have unbounded
+ length, or when they may be shown to a human user and hence require
+ encoding in an ISO 10646 character set. Otherwise, parameters are
+ encoded within HTTP headers. Section 9 describes the new HTTP
+ headers used with WebDAV methods.
+
+ In addition to encoding method parameters, XML is used in WebDAV to
+ encode the responses from methods, providing the extensibility and
+ internationalization advantages of XML for method output, as well as
+ input.
+
+ XML elements used in this specification are defined in section 12.
+
+ The XML namespace extension (Appendix 4) is also used in this
+ specification in order to allow for new XML elements to be added
+ without fear of colliding with other element names.
+
+ While the status codes provided by HTTP/1.1 are sufficient to
+ describe most error conditions encountered by WebDAV methods, there
+ are some errors that do not fall neatly into the existing categories.
+ New status codes developed for the WebDAV methods are defined in
+ section 10. Since some WebDAV methods may operate over many
+
+
+
+Goland, et al. Standards Track [Page 6]
+
+RFC 2518 WEBDAV February 1999
+
+
+ resources, the Multi-Status response has been introduced to return
+ status information for multiple resources. The Multi-Status response
+ is described in section 11.
+
+ WebDAV employs the property mechanism to store information about the
+ current state of the resource. For example, when a lock is taken out
+ on a resource, a lock information property describes the current
+ state of the lock. Section 13 defines the properties used within the
+ WebDAV specification.
+
+ Finishing off the specification are sections on what it means to be
+ compliant with this specification (section 15), on
+ internationalization support (section 16), and on security (section
+ 17).
+
+2 Notational Conventions
+
+ Since this document describes a set of extensions to the HTTP/1.1
+ protocol, the augmented BNF used herein to describe protocol elements
+ is exactly the same as described in section 2.1 of [RFC2068]. Since
+ this augmented BNF uses the basic production rules provided in
+ section 2.2 of [RFC2068], these rules apply to this document as well.
+
+ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
+ "SHOULD", SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
+ document are to be interpreted as described in RFC 2119 [RFC2119].
+
+3 Terminology
+
+ URI/URL - A Uniform Resource Identifier and Uniform Resource Locator,
+ respectively. These terms (and the distinction between them) are
+ defined in [RFC2396].
+
+ Collection - A resource that contains a set of URIs, termed member
+ URIs, which identify member resources and meets the requirements in
+ section 5 of this specification.
+
+ Member URI - A URI which is a member of the set of URIs contained by
+ a collection.
+
+ Internal Member URI - A Member URI that is immediately relative to
+ the URI of the collection (the definition of immediately relative is
+ given in section 5.2).
+
+ Property - A name/value pair that contains descriptive information
+ about a resource.
+
+
+
+
+
+Goland, et al. Standards Track [Page 7]
+
+RFC 2518 WEBDAV February 1999
+
+
+ Live Property - A property whose semantics and syntax are enforced by
+ the server. For example, the live "getcontentlength" property has
+ its value, the length of the entity returned by a GET request,
+ automatically calculated by the server.
+
+ Dead Property - A property whose semantics and syntax are not
+ enforced by the server. The server only records the value of a dead
+ property; the client is responsible for maintaining the consistency
+ of the syntax and semantics of a dead property.
+
+ Null Resource - A resource which responds with a 404 (Not Found) to
+ any HTTP/1.1 or DAV method except for PUT, MKCOL, OPTIONS and LOCK.
+ A NULL resource MUST NOT appear as a member of its parent collection.
+
+4 Data Model for Resource Properties
+
+4.1 The Resource Property Model
+
+ Properties are pieces of data that describe the state of a resource.
+ Properties are data about data.
+
+ Properties are used in distributed authoring environments to provide
+ for efficient discovery and management of resources. For example, a
+ 'subject' property might allow for the indexing of all resources by
+ their subject, and an 'author' property might allow for the discovery
+ of what authors have written which documents.
+
+ The DAV property model consists of name/value pairs. The name of a
+ property identifies the property's syntax and semantics, and provides
+ an address by which to refer to its syntax and semantics.
+
+ There are two categories of properties: "live" and "dead". A live
+ property has its syntax and semantics enforced by the server. Live
+ properties include cases where a) the value of a property is read-
+ only, maintained by the server, and b) the value of the property is
+ maintained by the client, but the server performs syntax checking on
+ submitted values. All instances of a given live property MUST comply
+ with the definition associated with that property name. A dead
+ property has its syntax and semantics enforced by the client; the
+ server merely records the value of the property verbatim.
+
+4.2 Existing Metadata Proposals
+
+ Properties have long played an essential role in the maintenance of
+ large document repositories, and many current proposals contain some
+ notion of a property, or discuss web metadata more generally. These
+ include PICS [REC-PICS], PICS-NG, XML, Web Collections, and several
+ proposals on representing relationships within HTML. Work on PICS-NG
+
+
+
+Goland, et al. Standards Track [Page 8]
+
+RFC 2518 WEBDAV February 1999
+
+
+ and Web Collections has been subsumed by the Resource Description
+ Framework (RDF) metadata activity of the World Wide Web Consortium.
+ RDF consists of a network-based data model and an XML representation
+ of that model.
+
+ Some proposals come from a digital library perspective. These
+ include the Dublin Core [RFC2413] metadata set and the Warwick
+ Framework [WF], a container architecture for different metadata
+ schemas. The literature includes many examples of metadata,
+ including MARC [USMARC], a bibliographic metadata format, and a
+ technical report bibliographic format employed by the Dienst system
+ [RFC1807]. Additionally, the proceedings from the first IEEE Metadata
+ conference describe many community-specific metadata sets.
+
+ Participants of the 1996 Metadata II Workshop in Warwick, UK [WF],
+ noted that "new metadata sets will develop as the networked
+ infrastructure matures" and "different communities will propose,
+ design, and be responsible for different types of metadata." These
+ observations can be corroborated by noting that many community-
+ specific sets of metadata already exist, and there is significant
+ motivation for the development of new forms of metadata as many
+ communities increasingly make their data available in digital form,
+ requiring a metadata format to assist data location and cataloging.
+
+4.3 Properties and HTTP Headers
+
+ Properties already exist, in a limited sense, in HTTP message
+ headers. However, in distributed authoring environments a relatively
+ large number of properties are needed to describe the state of a
+ resource, and setting/returning them all through HTTP headers is
+ inefficient. Thus a mechanism is needed which allows a principal to
+ identify a set of properties in which the principal is interested and
+ to set or retrieve just those properties.
+
+4.4 Property Values
+
+ The value of a property when expressed in XML MUST be well formed.
+
+ XML has been chosen because it is a flexible, self-describing,
+ structured data format that supports rich schema definitions, and
+ because of its support for multiple character sets. XML's self-
+ describing nature allows any property's value to be extended by
+ adding new elements. Older clients will not break when they
+ encounter extensions because they will still have the data specified
+ in the original schema and will ignore elements they do not
+ understand. XML's support for multiple character sets allows any
+ human-readable property to be encoded and read in a character set
+ familiar to the user. XML's support for multiple human languages,
+
+
+
+Goland, et al. Standards Track [Page 9]
+
+RFC 2518 WEBDAV February 1999
+
+
+ using the "xml:lang" attribute, handles cases where the same
+ character set is employed by multiple human languages.
+
+4.5 Property Names
+
+ A property name is a universally unique identifier that is associated
+ with a schema that provides information about the syntax and
+ semantics of the property.
+
+ Because a property's name is universally unique, clients can depend
+ upon consistent behavior for a particular property across multiple
+ resources, on the same and across different servers, so long as that
+ property is "live" on the resources in question, and the
+ implementation of the live property is faithful to its definition.
+
+ The XML namespace mechanism, which is based on URIs [RFC2396], is
+ used to name properties because it prevents namespace collisions and
+ provides for varying degrees of administrative control.
+
+ The property namespace is flat; that is, no hierarchy of properties
+ is explicitly recognized. Thus, if a property A and a property A/B
+ exist on a resource, there is no recognition of any relationship
+ between the two properties. It is expected that a separate
+ specification will eventually be produced which will address issues
+ relating to hierarchical properties.
+
+ Finally, it is not possible to define the same property twice on a
+ single resource, as this would cause a collision in the resource's
+ property namespace.
+
+4.6 Media Independent Links
+
+ Although HTML resources support links to other resources, the Web
+ needs more general support for links between resources of any media
+ type (media types are also known as MIME types, or content types).
+ WebDAV provides such links. A WebDAV link is a special type of
+ property value, formally defined in section 12.4, that allows typed
+ connections to be established between resources of any media type.
+ The property value consists of source and destination Uniform
+ Resource Identifiers (URIs); the property name identifies the link
+ type.
+
+
+
+
+
+
+
+
+
+
+Goland, et al. Standards Track [Page 10]
+
+RFC 2518 WEBDAV February 1999
+
+
+5 Collections of Web Resources
+
+ This section provides a description of a new type of Web resource,
+ the collection, and discusses its interactions with the HTTP URL
+ namespace. The purpose of a collection resource is to model
+ collection-like objects (e.g., file system directories) within a
+ server's namespace.
+
+ All DAV compliant resources MUST support the HTTP URL namespace model
+ specified herein.
+
+5.1 HTTP URL Namespace Model
+
+ The HTTP URL namespace is a hierarchical namespace where the
+ hierarchy is delimited with the "/" character.
+
+ An HTTP URL namespace is said to be consistent if it meets the
+ following conditions: for every URL in the HTTP hierarchy there
+ exists a collection that contains that URL as an internal member.
+ The root, or top-level collection of the namespace under
+ consideration is exempt from the previous rule.
+
+ Neither HTTP/1.1 nor WebDAV require that the entire HTTP URL
+ namespace be consistent. However, certain WebDAV methods are
+ prohibited from producing results that cause namespace
+ inconsistencies.
+
+ Although implicit in [RFC2068] and [RFC2396], any resource, including
+ collection resources, MAY be identified by more than one URI. For
+ example, a resource could be identified by multiple HTTP URLs.
+
+5.2 Collection Resources
+
+ A collection is a resource whose state consists of at least a list of
+ internal member URIs and a set of properties, but which may have
+ additional state such as entity bodies returned by GET. An internal
+ member URI MUST be immediately relative to a base URI of the
+ collection. That is, the internal member URI is equal to a
+ containing collection's URI plus an additional segment for non-
+ collection resources, or additional segment plus trailing slash "/"
+ for collection resources, where segment is defined in section 3.3 of
+ [RFC2396].
+
+ Any given internal member URI MUST only belong to the collection
+ once, i.e., it is illegal to have multiple instances of the same URI
+ in a collection. Properties defined on collections behave exactly as
+ do properties on non-collection resources.
+
+
+
+
+Goland, et al. Standards Track [Page 11]
+
+RFC 2518 WEBDAV February 1999
+
+
+ For all WebDAV compliant resources A and B, identified by URIs U and
+ V, for which U is immediately relative to V, B MUST be a collection
+ that has U as an internal member URI. So, if the resource with URL
+ http://foo.com/bar/blah is WebDAV compliant and if the resource with
+ URL http://foo.com/bar/ is WebDAV compliant then the resource with
+ URL http://foo.com/bar/ must be a collection and must contain URL
+ http://foo.com/bar/blah as an internal member.
+
+ Collection resources MAY list the URLs of non-WebDAV compliant
+ children in the HTTP URL namespace hierarchy as internal members but
+ are not required to do so. For example, if the resource with URL
+ http://foo.com/bar/blah is not WebDAV compliant and the URL
+ http://foo.com/bar/ identifies a collection then URL
+ http://foo.com/bar/blah may or may not be an internal member of the
+ collection with URL http://foo.com/bar/.
+
+ If a WebDAV compliant resource has no WebDAV compliant children in
+ the HTTP URL namespace hierarchy then the WebDAV compliant resource
+ is not required to be a collection.
+
+ There is a standing convention that when a collection is referred to
+ by its name without a trailing slash, the trailing slash is
+ automatically appended. Due to this, a resource may accept a URI
+ without a trailing "/" to point to a collection. In this case it
+ SHOULD return a content-location header in the response pointing to
+ the URI ending with the "/". For example, if a client invokes a
+ method on http://foo.bar/blah (no trailing slash), the resource
+ http://foo.bar/blah/ (trailing slash) may respond as if the operation
+ were invoked on it, and should return a content-location header with
+ http://foo.bar/blah/ in it. In general clients SHOULD use the "/"
+ form of collection names.
+
+ A resource MAY be a collection but not be WebDAV compliant. That is,
+ the resource may comply with all the rules set out in this
+ specification regarding how a collection is to behave without
+ necessarily supporting all methods that a WebDAV compliant resource
+ is required to support. In such a case the resource may return the
+ DAV:resourcetype property with the value DAV:collection but MUST NOT
+ return a DAV header containing the value "1" on an OPTIONS response.
+
+5.3 Creation and Retrieval of Collection Resources
+
+ This document specifies the MKCOL method to create new collection
+ resources, rather than using the existing HTTP/1.1 PUT or POST
+ method, for the following reasons:
+
+
+
+
+
+
+Goland, et al. Standards Track [Page 12]
+
+RFC 2518 WEBDAV February 1999
+
+
+ In HTTP/1.1, the PUT method is defined to store the request body at
+ the location specified by the Request-URI. While a description
+ format for a collection can readily be constructed for use with PUT,
+ the implications of sending such a description to the server are
+ undesirable. For example, if a description of a collection that
+ omitted some existing resources were PUT to a server, this might be
+ interpreted as a command to remove those members. This would extend
+ PUT to perform DELETE functionality, which is undesirable since it
+ changes the semantics of PUT, and makes it difficult to control
+ DELETE functionality with an access control scheme based on methods.
+
+ While the POST method is sufficiently open-ended that a "create a
+ collection" POST command could be constructed, this is undesirable
+ because it would be difficult to separate access control for
+ collection creation from other uses of POST.
+
+ The exact definition of the behavior of GET and PUT on collections is
+ defined later in this document.
+
+5.4 Source Resources and Output Resources
+
+ For many resources, the entity returned by a GET method exactly
+ matches the persistent state of the resource, for example, a GIF file
+ stored on a disk. For this simple case, the URI at which a resource
+ is accessed is identical to the URI at which the source (the
+ persistent state) of the resource is accessed. This is also the case
+ for HTML source files that are not processed by the server prior to
+ transmission.
+
+ However, the server can sometimes process HTML resources before they
+ are transmitted as a return entity body. For example, a server-
+ side-include directive within an HTML file might instruct a server to
+ replace the directive with another value, such as the current date.
+ In this case, what is returned by GET (HTML plus date) differs from
+ the persistent state of the resource (HTML plus directive).
+ Typically there is no way to access the HTML resource containing the
+ unprocessed directive.
+
+ Sometimes the entity returned by GET is the output of a data-
+ producing process that is described by one or more source resources
+ (that may not even have a location in the URI namespace). A single
+ data-producing process may dynamically generate the state of a
+ potentially large number of output resources. An example of this is
+ a CGI script that describes a "finger" gateway process that maps part
+ of the namespace of a server into finger requests, such as
+ http://www.foo.bar.org/finger_gateway/user@host.
+
+
+
+
+
+Goland, et al. Standards Track [Page 13]
+
+RFC 2518 WEBDAV February 1999
+
+
+ In the absence of distributed authoring capabilities, it is
+ acceptable to have no mapping of source resource(s) to the URI
+ namespace. In fact, preventing access to the source resource(s) has
+ desirable security benefits. However, if remote editing of the
+ source resource(s) is desired, the source resource(s) should be given
+ a location in the URI namespace. This source location should not be
+ one of the locations at which the generated output is retrievable,
+ since in general it is impossible for the server to differentiate
+ requests for source resources from requests for process output
+ resources. There is often a many-to-many relationship between source
+ resources and output resources.
+
+ On WebDAV compliant servers the URI of the source resource(s) may be
+ stored in a link on the output resource with type DAV:source (see
+ section 13.10 for a description of the source link property).
+ Storing the source URIs in links on the output resources places the
+ burden of discovering the source on the authoring client. Note that
+ the value of a source link is not guaranteed to point to the correct
+ source. Source links may break or incorrect values may be entered.
+ Also note that not all servers will allow the client to set the
+ source link value. For example a server which generates source links
+ on the fly for its CGI files will most likely not allow a client to
+ set the source link value.
+
+6 Locking
+
+ The ability to lock a resource provides a mechanism for serializing
+ access to that resource. Using a lock, an authoring client can
+ provide a reasonable guarantee that another principal will not modify
+ a resource while it is being edited. In this way, a client can
+ prevent the "lost update" problem.
+
+ This specification allows locks to vary over two client-specified
+ parameters, the number of principals involved (exclusive vs. shared)
+ and the type of access to be granted. This document defines locking
+ for only one access type, write. However, the syntax is extensible,
+ and permits the eventual specification of locking for other access
+ types.
+
+6.1 Exclusive Vs. Shared Locks
+
+ The most basic form of lock is an exclusive lock. This is a lock
+ where the access right in question is only granted to a single
+ principal. The need for this arbitration results from a desire to
+ avoid having to merge results.
+
+
+
+
+
+
+Goland, et al. Standards Track [Page 14]
+
+RFC 2518 WEBDAV February 1999
+
+
+ However, there are times when the goal of a lock is not to exclude
+ others from exercising an access right but rather to provide a
+ mechanism for principals to indicate that they intend to exercise
+ their access rights. Shared locks are provided for this case. A
+ shared lock allows multiple principals to receive a lock. Hence any
+ principal with appropriate access can get the lock.
+
+ With shared locks there are two trust sets that affect a resource.
+ The first trust set is created by access permissions. Principals who
+ are trusted, for example, may have permission to write to the
+ resource. Among those who have access permission to write to the
+ resource, the set of principals who have taken out a shared lock also
+ must trust each other, creating a (typically) smaller trust set
+ within the access permission write set.
+
+ Starting with every possible principal on the Internet, in most
+ situations the vast majority of these principals will not have write
+ access to a given resource. Of the small number who do have write
+ access, some principals may decide to guarantee their edits are free
+ from overwrite conflicts by using exclusive write locks. Others may
+ decide they trust their collaborators will not overwrite their work
+ (the potential set of collaborators being the set of principals who
+ have write permission) and use a shared lock, which informs their
+ collaborators that a principal may be working on the resource.
+
+ The WebDAV extensions to HTTP do not need to provide all of the
+ communications paths necessary for principals to coordinate their
+ activities. When using shared locks, principals may use any out of
+ band communication channel to coordinate their work (e.g., face-to-
+ face interaction, written notes, post-it notes on the screen,
+ telephone conversation, Email, etc.) The intent of a shared lock is
+ to let collaborators know who else may be working on a resource.
+
+ Shared locks are included because experience from web distributed
+ authoring systems has indicated that exclusive locks are often too
+ rigid. An exclusive lock is used to enforce a particular editing
+ process: take out an exclusive lock, read the resource, perform
+ edits, write the resource, release the lock. This editing process
+ has the problem that locks are not always properly released, for
+ example when a program crashes, or when a lock owner leaves without
+ unlocking a resource. While both timeouts and administrative action
+ can be used to remove an offending lock, neither mechanism may be
+ available when needed; the timeout may be long or the administrator
+ may not be available.
+
+
+
+
+
+
+
+Goland, et al. Standards Track [Page 15]
+
+RFC 2518 WEBDAV February 1999
+
+
+6.2 Required Support
+
+ A WebDAV compliant server is not required to support locking in any
+ form. If the server does support locking it may choose to support
+ any combination of exclusive and shared locks for any access types.
+
+ The reason for this flexibility is that locking policy strikes to the
+ very heart of the resource management and versioning systems employed
+ by various storage repositories. These repositories require control
+ over what sort of locking will be made available. For example, some
+ repositories only support shared write locks while others only
+ provide support for exclusive write locks while yet others use no
+ locking at all. As each system is sufficiently different to merit
+ exclusion of certain locking features, this specification leaves
+ locking as the sole axis of negotiation within WebDAV.
+
+6.3 Lock Tokens
+
+ A lock token is a type of state token, represented as a URI, which
+ identifies a particular lock. A lock token is returned by every
+ successful LOCK operation in the lockdiscovery property in the
+ response body, and can also be found through lock discovery on a
+ resource.
+
+ Lock token URIs MUST be unique across all resources for all time.
+ This uniqueness constraint allows lock tokens to be submitted across
+ resources and servers without fear of confusion.
+
+ This specification provides a lock token URI scheme called
+ opaquelocktoken that meets the uniqueness requirements. However
+ resources are free to return any URI scheme so long as it meets the
+ uniqueness requirements.
+
+ Having a lock token provides no special access rights. Anyone can
+ find out anyone else's lock token by performing lock discovery.
+ Locks MUST be enforced based upon whatever authentication mechanism
+ is used by the server, not based on the secrecy of the token values.
+
+6.4 opaquelocktoken Lock Token URI Scheme
+
+ The opaquelocktoken URI scheme is designed to be unique across all
+ resources for all time. Due to this uniqueness quality, a client may
+ submit an opaque lock token in an If header on a resource other than
+ the one that returned it.
+
+ All resources MUST recognize the opaquelocktoken scheme and, at
+ minimum, recognize that the lock token does not refer to an
+ outstanding lock on the resource.
+
+
+
+Goland, et al. Standards Track [Page 16]
+
+RFC 2518 WEBDAV February 1999
+
+
+ In order to guarantee uniqueness across all resources for all time
+ the opaquelocktoken requires the use of the Universal Unique
+ Identifier (UUID) mechanism, as described in [ISO-11578].
+
+ Opaquelocktoken generators, however, have a choice of how they create
+ these tokens. They can either generate a new UUID for every lock
+ token they create or they can create a single UUID and then add
+ extension characters. If the second method is selected then the
+ program generating the extensions MUST guarantee that the same
+ extension will never be used twice with the associated UUID.
+
+ OpaqueLockToken-URI = "opaquelocktoken:" UUID [Extension] ; The UUID
+ production is the string representation of a UUID, as defined in
+ [ISO-11578]. Note that white space (LWS) is not allowed between
+ elements of this production.
+
+ Extension = path ; path is defined in section 3.2.1 of RFC 2068
+ [RFC2068]
+
+6.4.1 Node Field Generation Without the IEEE 802 Address
+
+ UUIDs, as defined in [ISO-11578], contain a "node" field that
+ contains one of the IEEE 802 addresses for the server machine. As
+ noted in section 17.8, there are several security risks associated
+ with exposing a machine's IEEE 802 address. This section provides an
+ alternate mechanism for generating the "node" field of a UUID which
+ does not employ an IEEE 802 address. WebDAV servers MAY use this
+ algorithm for creating the node field when generating UUIDs. The
+ text in this section is originally from an Internet-Draft by Paul
+ Leach and Rich Salz, who are noted here to properly attribute their
+ work.
+
+ The ideal solution is to obtain a 47 bit cryptographic quality random
+ number, and use it as the low 47 bits of the node ID, with the most
+ significant bit of the first octet of the node ID set to 1. This bit
+ is the unicast/multicast bit, which will never be set in IEEE 802
+ addresses obtained from network cards; hence, there can never be a
+ conflict between UUIDs generated by machines with and without network
+ cards.
+
+ If a system does not have a primitive to generate cryptographic
+ quality random numbers, then in most systems there are usually a
+ fairly large number of sources of randomness available from which one
+ can be generated. Such sources are system specific, but often
+ include:
+
+
+
+
+
+
+Goland, et al. Standards Track [Page 17]
+
+RFC 2518 WEBDAV February 1999
+
+
+ - the percent of memory in use
+ - the size of main memory in bytes
+ - the amount of free main memory in bytes
+ - the size of the paging or swap file in bytes
+ - free bytes of paging or swap file
+ - the total size of user virtual address space in bytes
+ - the total available user address space bytes
+ - the size of boot disk drive in bytes
+ - the free disk space on boot drive in bytes
+ - the current time
+ - the amount of time since the system booted
+ - the individual sizes of files in various system directories
+ - the creation, last read, and modification times of files in
+ various system directories
+ - the utilization factors of various system resources (heap, etc.)
+ - current mouse cursor position
+ - current caret position
+ - current number of running processes, threads
+ - handles or IDs of the desktop window and the active window
+ - the value of stack pointer of the caller
+ - the process and thread ID of caller
+ - various processor architecture specific performance counters
+ (instructions executed, cache misses, TLB misses)
+
+ (Note that it is precisely the above kinds of sources of randomness
+ that are used to seed cryptographic quality random number generators
+ on systems without special hardware for their construction.)
+
+ In addition, items such as the computer's name and the name of the
+ operating system, while not strictly speaking random, will help
+ differentiate the results from those obtained by other systems.
+
+ The exact algorithm to generate a node ID using these data is system
+ specific, because both the data available and the functions to obtain
+ them are often very system specific. However, assuming that one can
+ concatenate all the values from the randomness sources into a buffer,
+ and that a cryptographic hash function such as MD5 is available, then
+ any 6 bytes of the MD5 hash of the buffer, with the multicast bit
+ (the high bit of the first byte) set will be an appropriately random
+ node ID.
+
+ Other hash functions, such as SHA-1, can also be used. The only
+ requirement is that the result be suitably random _ in the sense that
+ the outputs from a set uniformly distributed inputs are themselves
+ uniformly distributed, and that a single bit change in the input can
+ be expected to cause half of the output bits to change.
+
+
+
+
+
+Goland, et al. Standards Track [Page 18]
+
+RFC 2518 WEBDAV February 1999
+
+
+6.5 Lock Capability Discovery
+
+ Since server lock support is optional, a client trying to lock a
+ resource on a server can either try the lock and hope for the best,
+ or perform some form of discovery to determine what lock capabilities
+ the server supports. This is known as lock capability discovery.
+ Lock capability discovery differs from discovery of supported access
+ control types, since there may be access control types without
+ corresponding lock types. A client can determine what lock types the
+ server supports by retrieving the supportedlock property.
+
+ Any DAV compliant resource that supports the LOCK method MUST support
+ the supportedlock property.
+
+6.6 Active Lock Discovery
+
+ If another principal locks a resource that a principal wishes to
+ access, it is useful for the second principal to be able to find out
+ who the first principal is. For this purpose the lockdiscovery
+ property is provided. This property lists all outstanding locks,
+ describes their type, and where available, provides their lock token.
+
+ Any DAV compliant resource that supports the LOCK method MUST support
+ the lockdiscovery property.
+
+6.7 Usage Considerations
+
+ Although the locking mechanisms specified here provide some help in
+ preventing lost updates, they cannot guarantee that updates will
+ never be lost. Consider the following scenario:
+
+ Two clients A and B are interested in editing the resource '
+ index.html'. Client A is an HTTP client rather than a WebDAV client,
+ and so does not know how to perform locking.
+ Client A doesn't lock the document, but does a GET and begins
+ editing.
+ Client B does LOCK, performs a GET and begins editing.
+ Client B finishes editing, performs a PUT, then an UNLOCK.
+ Client A performs a PUT, overwriting and losing all of B's changes.
+
+ There are several reasons why the WebDAV protocol itself cannot
+ prevent this situation. First, it cannot force all clients to use
+ locking because it must be compatible with HTTP clients that do not
+ comprehend locking. Second, it cannot require servers to support
+ locking because of the variety of repository implementations, some of
+ which rely on reservations and merging rather than on locking.
+ Finally, being stateless, it cannot enforce a sequence of operations
+ like LOCK / GET / PUT / UNLOCK.
+
+
+
+Goland, et al. Standards Track [Page 19]
+
+RFC 2518 WEBDAV February 1999
+
+
+ WebDAV servers that support locking can reduce the likelihood that
+ clients will accidentally overwrite each other's changes by requiring
+ clients to lock resources before modifying them. Such servers would
+ effectively prevent HTTP 1.0 and HTTP 1.1 clients from modifying
+ resources.
+
+ WebDAV clients can be good citizens by using a lock / retrieve /
+ write /unlock sequence of operations (at least by default) whenever
+ they interact with a WebDAV server that supports locking.
+
+ HTTP 1.1 clients can be good citizens, avoiding overwriting other
+ clients' changes, by using entity tags in If-Match headers with any
+ requests that would modify resources.
+
+ Information managers may attempt to prevent overwrites by
+ implementing client-side procedures requiring locking before
+ modifying WebDAV resources.
+
+7 Write Lock
+
+ This section describes the semantics specific to the write lock type.
+ The write lock is a specific instance of a lock type, and is the only
+ lock type described in this specification.
+
+7.1 Methods Restricted by Write Locks
+
+ A write lock MUST prevent a principal without the lock from
+ successfully executing a PUT, POST, PROPPATCH, LOCK, UNLOCK, MOVE,
+ DELETE, or MKCOL on the locked resource. All other current methods,
+ GET in particular, function independently of the lock.
+
+ Note, however, that as new methods are created it will be necessary
+ to specify how they interact with a write lock.
+
+7.2 Write Locks and Lock Tokens
+
+ A successful request for an exclusive or shared write lock MUST
+ result in the generation of a unique lock token associated with the
+ requesting principal. Thus if five principals have a shared write
+ lock on the same resource there will be five lock tokens, one for
+ each principal.
+
+7.3 Write Locks and Properties
+
+ While those without a write lock may not alter a property on a
+ resource it is still possible for the values of live properties to
+ change, even while locked, due to the requirements of their schemas.
+
+
+
+
+Goland, et al. Standards Track [Page 20]
+
+RFC 2518 WEBDAV February 1999
+
+
+ Only dead properties and live properties defined to respect locks are
+ guaranteed not to change while write locked.
+
+7.4 Write Locks and Null Resources
+
+ It is possible to assert a write lock on a null resource in order to
+ lock the name.
+
+ A write locked null resource, referred to as a lock-null resource,
+ MUST respond with a 404 (Not Found) or 405 (Method Not Allowed) to
+ any HTTP/1.1 or DAV methods except for PUT, MKCOL, OPTIONS, PROPFIND,
+ LOCK, and UNLOCK. A lock-null resource MUST appear as a member of
+ its parent collection. Additionally the lock-null resource MUST have
+ defined on it all mandatory DAV properties. Most of these
+ properties, such as all the get* properties, will have no value as a
+ lock-null resource does not support the GET method. Lock-Null
+ resources MUST have defined values for lockdiscovery and
+ supportedlock properties.
+
+ Until a method such as PUT or MKCOL is successfully executed on the
+ lock-null resource the resource MUST stay in the lock-null state.
+ However, once a PUT or MKCOL is successfully executed on a lock-null
+ resource the resource ceases to be in the lock-null state.
+
+ If the resource is unlocked, for any reason, without a PUT, MKCOL, or
+ similar method having been successfully executed upon it then the
+ resource MUST return to the null state.
+
+7.5 Write Locks and Collections
+
+ A write lock on a collection, whether created by a "Depth: 0" or
+ "Depth: infinity" lock request, prevents the addition or removal of
+ member URIs of the collection by non-lock owners. As a consequence,
+ when a principal issues a PUT or POST request to create a new
+ resource under a URI which needs to be an internal member of a write
+ locked collection to maintain HTTP namespace consistency, or issues a
+ DELETE to remove a resource which has a URI which is an existing
+ internal member URI of a write locked collection, this request MUST
+ fail if the principal does not have a write lock on the collection.
+
+ However, if a write lock request is issued to a collection containing
+ member URIs identifying resources that are currently locked in a
+ manner which conflicts with the write lock, the request MUST fail
+ with a 423 (Locked) status code.
+
+ If a lock owner causes the URI of a resource to be added as an
+ internal member URI of a locked collection then the new resource MUST
+ be automatically added to the lock. This is the only mechanism that
+
+
+
+Goland, et al. Standards Track [Page 21]
+
+RFC 2518 WEBDAV February 1999
+
+
+ allows a resource to be added to a write lock. Thus, for example, if
+ the collection /a/b/ is write locked and the resource /c is moved to
+ /a/b/c then resource /a/b/c will be added to the write lock.
+
+7.6 Write Locks and the If Request Header
+
+ If a user agent is not required to have knowledge about a lock when
+ requesting an operation on a locked resource, the following scenario
+ might occur. Program A, run by User A, takes out a write lock on a
+ resource. Program B, also run by User A, has no knowledge of the
+ lock taken out by Program A, yet performs a PUT to the locked
+ resource. In this scenario, the PUT succeeds because locks are
+ associated with a principal, not a program, and thus program B,
+ because it is acting with principal A's credential, is allowed to
+ perform the PUT. However, had program B known about the lock, it
+ would not have overwritten the resource, preferring instead to
+ present a dialog box describing the conflict to the user. Due to
+ this scenario, a mechanism is needed to prevent different programs
+ from accidentally ignoring locks taken out by other programs with the
+ same authorization.
+
+ In order to prevent these collisions a lock token MUST be submitted
+ by an authorized principal in the If header for all locked resources
+ that a method may interact with or the method MUST fail. For
+ example, if a resource is to be moved and both the source and
+ destination are locked then two lock tokens must be submitted, one
+ for the source and the other for the destination.
+
+7.6.1 Example - Write Lock
+
+ >>Request
+
+ COPY /~fielding/index.html HTTP/1.1
+ Host: www.ics.uci.edu
+ Destination: http://www.ics.uci.edu/users/f/fielding/index.html
+ If: <http://www.ics.uci.edu/users/f/fielding/index.html>
+ (<opaquelocktoken:f81d4fae-7dec-11d0-a765-00a0c91e6bf6>)
+
+ >>Response
+
+ HTTP/1.1 204 No Content
+
+ In this example, even though both the source and destination are
+ locked, only one lock token must be submitted, for the lock on the
+ destination. This is because the source resource is not modified by
+ a COPY, and hence unaffected by the write lock. In this example, user
+ agent authentication has previously occurred via a mechanism outside
+ the scope of the HTTP protocol, in the underlying transport layer.
+
+
+
+Goland, et al. Standards Track [Page 22]
+
+RFC 2518 WEBDAV February 1999
+
+
+7.7 Write Locks and COPY/MOVE
+
+ A COPY method invocation MUST NOT duplicate any write locks active on
+ the source. However, as previously noted, if the COPY copies the
+ resource into a collection that is locked with "Depth: infinity",
+ then the resource will be added to the lock.
+
+ A successful MOVE request on a write locked resource MUST NOT move
+ the write lock with the resource. However, the resource is subject to
+ being added to an existing lock at the destination, as specified in
+ section 7.5. For example, if the MOVE makes the resource a child of a
+ collection that is locked with "Depth: infinity", then the resource
+ will be added to that collection's lock. Additionally, if a resource
+ locked with "Depth: infinity" is moved to a destination that is
+ within the scope of the same lock (e.g., within the namespace tree
+ covered by the lock), the moved resource will again be a added to the
+ lock. In both these examples, as specified in section 7.6, an If
+ header must be submitted containing a lock token for both the source
+ and destination.
+
+7.8 Refreshing Write Locks
+
+ A client MUST NOT submit the same write lock request twice. Note
+ that a client is always aware it is resubmitting the same lock
+ request because it must include the lock token in the If header in
+ order to make the request for a resource that is already locked.
+
+ However, a client may submit a LOCK method with an If header but
+ without a body. This form of LOCK MUST only be used to "refresh" a
+ lock. Meaning, at minimum, that any timers associated with the lock
+ MUST be re-set.
+
+ A server may return a Timeout header with a lock refresh that is
+ different than the Timeout header returned when the lock was
+ originally requested. Additionally clients may submit Timeout
+ headers of arbitrary value with their lock refresh requests.
+ Servers, as always, may ignore Timeout headers submitted by the
+ client.
+
+ If an error is received in response to a refresh LOCK request the
+ client SHOULD assume that the lock was not refreshed.
+
+8 HTTP Methods for Distributed Authoring
+
+ The following new HTTP methods use XML as a request and response
+ format. All DAV compliant clients and resources MUST use XML parsers
+ that are compliant with [REC-XML]. All XML used in either requests
+ or responses MUST be, at minimum, well formed. If a server receives
+
+
+
+Goland, et al. Standards Track [Page 23]
+
+RFC 2518 WEBDAV February 1999
+
+
+ ill-formed XML in a request it MUST reject the entire request with a
+ 400 (Bad Request). If a client receives ill-formed XML in a response
+ then it MUST NOT assume anything about the outcome of the executed
+ method and SHOULD treat the server as malfunctioning.
+
+8.1 PROPFIND
+
+ The PROPFIND method retrieves properties defined on the resource
+ identified by the Request-URI, if the resource does not have any
+ internal members, or on the resource identified by the Request-URI
+ and potentially its member resources, if the resource is a collection
+ that has internal member URIs. All DAV compliant resources MUST
+ support the PROPFIND method and the propfind XML element (section
+ 12.14) along with all XML elements defined for use with that element.
+
+ A client may submit a Depth header with a value of "0", "1", or
+ "infinity" with a PROPFIND on a collection resource with internal
+ member URIs. DAV compliant servers MUST support the "0", "1" and
+ "infinity" behaviors. By default, the PROPFIND method without a Depth
+ header MUST act as if a "Depth: infinity" header was included.
+
+ A client may submit a propfind XML element in the body of the request
+ method describing what information is being requested. It is
+ possible to request particular property values, all property values,
+ or a list of the names of the resource's properties. A client may
+ choose not to submit a request body. An empty PROPFIND request body
+ MUST be treated as a request for the names and values of all
+ properties.
+
+ All servers MUST support returning a response of content type
+ text/xml or application/xml that contains a multistatus XML element
+ that describes the results of the attempts to retrieve the various
+ properties.
+
+ If there is an error retrieving a property then a proper error result
+ MUST be included in the response. A request to retrieve the value of
+ a property which does not exist is an error and MUST be noted, if the
+ response uses a multistatus XML element, with a response XML element
+ which contains a 404 (Not Found) status value.
+
+ Consequently, the multistatus XML element for a collection resource
+ with member URIs MUST include a response XML element for each member
+ URI of the collection, to whatever depth was requested. Each response
+ XML element MUST contain an href XML element that gives the URI of
+ the resource on which the properties in the prop XML element are
+ defined. Results for a PROPFIND on a collection resource with
+ internal member URIs are returned as a flat list whose order of
+ entries is not significant.
+
+
+
+Goland, et al. Standards Track [Page 24]
+
+RFC 2518 WEBDAV February 1999
+
+
+ In the case of allprop and propname, if a principal does not have the
+ right to know whether a particular property exists then the property
+ should be silently excluded from the response.
+
+ The results of this method SHOULD NOT be cached.
+
+8.1.1 Example - Retrieving Named Properties
+
+ >>Request
+
+ PROPFIND /file HTTP/1.1
+ Host: www.foo.bar
+ Content-type: text/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:propfind xmlns:D="DAV:">
+ <D:prop xmlns:R="http://www.foo.bar/boxschema/">
+ <R:bigbox/>
+ <R:author/>
+ <R:DingALing/>
+ <R:Random/>
+ </D:prop>
+ </D:propfind>
+
+ >>Response
+
+ HTTP/1.1 207 Multi-Status
+ Content-Type: text/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:multistatus xmlns:D="DAV:">
+ <D:response>
+ <D:href>http://www.foo.bar/file</D:href>
+ <D:propstat>
+ <D:prop xmlns:R="http://www.foo.bar/boxschema/">
+ <R:bigbox>
+ <R:BoxType>Box type A</R:BoxType>
+ </R:bigbox>
+ <R:author>
+ <R:Name>J.J. Johnson</R:Name>
+ </R:author>
+ </D:prop>
+ <D:status>HTTP/1.1 200 OK</D:status>
+ </D:propstat>
+ <D:propstat>
+ <D:prop><R:DingALing/><R:Random/></D:prop>
+
+
+
+Goland, et al. Standards Track [Page 25]
+
+RFC 2518 WEBDAV February 1999
+
+
+ <D:status>HTTP/1.1 403 Forbidden</D:status>
+ <D:responsedescription> The user does not have access to
+ the DingALing property.
+ </D:responsedescription>
+ </D:propstat>
+ </D:response>
+ <D:responsedescription> There has been an access violation error.
+ </D:responsedescription>
+ </D:multistatus>
+
+ In this example, PROPFIND is executed on a non-collection resource
+ http://www.foo.bar/file. The propfind XML element specifies the name
+ of four properties whose values are being requested. In this case
+ only two properties were returned, since the principal issuing the
+ request did not have sufficient access rights to see the third and
+ fourth properties.
+
+8.1.2 Example - Using allprop to Retrieve All Properties
+
+ >>Request
+
+ PROPFIND /container/ HTTP/1.1
+ Host: www.foo.bar
+ Depth: 1
+ Content-Type: text/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:propfind xmlns:D="DAV:">
+ <D:allprop/>
+ </D:propfind>
+
+ >>Response
+
+ HTTP/1.1 207 Multi-Status
+ Content-Type: text/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:multistatus xmlns:D="DAV:">
+ <D:response>
+ <D:href>http://www.foo.bar/container/</D:href>
+ <D:propstat>
+ <D:prop xmlns:R="http://www.foo.bar/boxschema/">
+ <R:bigbox>
+ <R:BoxType>Box type A</R:BoxType>
+ </R:bigbox>
+ <R:author>
+
+
+
+Goland, et al. Standards Track [Page 26]
+
+RFC 2518 WEBDAV February 1999
+
+
+ <R:Name>Hadrian</R:Name>
+ </R:author>
+ <D:creationdate>
+ 1997-12-01T17:42:21-08:00
+ </D:creationdate>
+ <D:displayname>
+ Example collection
+ </D:displayname>
+ <D:resourcetype><D:collection/></D:resourcetype>
+ <D:supportedlock>
+ <D:lockentry>
+ <D:lockscope><D:exclusive/></D:lockscope>
+ <D:locktype><D:write/></D:locktype>
+ </D:lockentry>
+ <D:lockentry>
+ <D:lockscope><D:shared/></D:lockscope>
+ <D:locktype><D:write/></D:locktype>
+ </D:lockentry>
+ </D:supportedlock>
+ </D:prop>
+ <D:status>HTTP/1.1 200 OK</D:status>
+ </D:propstat>
+ </D:response>
+ <D:response>
+ <D:href>http://www.foo.bar/container/front.html</D:href>
+ <D:propstat>
+ <D:prop xmlns:R="http://www.foo.bar/boxschema/">
+ <R:bigbox>
+ <R:BoxType>Box type B</R:BoxType>
+ </R:bigbox>
+ <D:creationdate>
+ 1997-12-01T18:27:21-08:00
+ </D:creationdate>
+ <D:displayname>
+ Example HTML resource
+ </D:displayname>
+ <D:getcontentlength>
+ 4525
+ </D:getcontentlength>
+ <D:getcontenttype>
+ text/html
+ </D:getcontenttype>
+ <D:getetag>
+ zzyzx
+ </D:getetag>
+ <D:getlastmodified>
+ Monday, 12-Jan-98 09:25:56 GMT
+ </D:getlastmodified>
+
+
+
+Goland, et al. Standards Track [Page 27]
+
+RFC 2518 WEBDAV February 1999
+
+
+ <D:resourcetype/>
+ <D:supportedlock>
+ <D:lockentry>
+ <D:lockscope><D:exclusive/></D:lockscope>
+ <D:locktype><D:write/></D:locktype>
+ </D:lockentry>
+ <D:lockentry>
+ <D:lockscope><D:shared/></D:lockscope>
+ <D:locktype><D:write/></D:locktype>
+ </D:lockentry>
+ </D:supportedlock>
+ </D:prop>
+ <D:status>HTTP/1.1 200 OK</D:status>
+ </D:propstat>
+ </D:response>
+ </D:multistatus>
+
+ In this example, PROPFIND was invoked on the resource
+ http://www.foo.bar/container/ with a Depth header of 1, meaning the
+ request applies to the resource and its children, and a propfind XML
+ element containing the allprop XML element, meaning the request
+ should return the name and value of all properties defined on each
+ resource.
+
+ The resource http://www.foo.bar/container/ has six properties defined
+ on it:
+
+ http://www.foo.bar/boxschema/bigbox,
+ http://www.foo.bar/boxschema/author, DAV:creationdate,
+ DAV:displayname, DAV:resourcetype, and DAV:supportedlock.
+
+ The last four properties are WebDAV-specific, defined in section 13.
+ Since GET is not supported on this resource, the get* properties
+ (e.g., getcontentlength) are not defined on this resource. The DAV-
+ specific properties assert that "container" was created on December
+ 1, 1997, at 5:42:21PM, in a time zone 8 hours west of GMT
+ (creationdate), has a name of "Example collection" (displayname), a
+ collection resource type (resourcetype), and supports exclusive write
+ and shared write locks (supportedlock).
+
+ The resource http://www.foo.bar/container/front.html has nine
+ properties defined on it:
+
+ http://www.foo.bar/boxschema/bigbox (another instance of the "bigbox"
+ property type), DAV:creationdate, DAV:displayname,
+ DAV:getcontentlength, DAV:getcontenttype, DAV:getetag,
+ DAV:getlastmodified, DAV:resourcetype, and DAV:supportedlock.
+
+
+
+
+Goland, et al. Standards Track [Page 28]
+
+RFC 2518 WEBDAV February 1999
+
+
+ The DAV-specific properties assert that "front.html" was created on
+ December 1, 1997, at 6:27:21PM, in a time zone 8 hours west of GMT
+ (creationdate), has a name of "Example HTML resource" (displayname),
+ a content length of 4525 bytes (getcontentlength), a MIME type of
+ "text/html" (getcontenttype), an entity tag of "zzyzx" (getetag), was
+ last modified on Monday, January 12, 1998, at 09:25:56 GMT
+ (getlastmodified), has an empty resource type, meaning that it is not
+ a collection (resourcetype), and supports both exclusive write and
+ shared write locks (supportedlock).
+
+8.1.3 Example - Using propname to Retrieve all Property Names
+
+ >>Request
+
+ PROPFIND /container/ HTTP/1.1
+ Host: www.foo.bar
+ Content-Type: text/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <propfind xmlns="DAV:">
+ <propname/>
+ </propfind>
+
+ >>Response
+
+ HTTP/1.1 207 Multi-Status
+ Content-Type: text/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <multistatus xmlns="DAV:">
+ <response>
+ <href>http://www.foo.bar/container/</href>
+ <propstat>
+ <prop xmlns:R="http://www.foo.bar/boxschema/">
+ <R:bigbox/>
+ <R:author/>
+ <creationdate/>
+ <displayname/>
+ <resourcetype/>
+ <supportedlock/>
+ </prop>
+ <status>HTTP/1.1 200 OK</status>
+ </propstat>
+ </response>
+ <response>
+ <href>http://www.foo.bar/container/front.html</href>
+
+
+
+Goland, et al. Standards Track [Page 29]
+
+RFC 2518 WEBDAV February 1999
+
+
+ <propstat>
+ <prop xmlns:R="http://www.foo.bar/boxschema/">
+ <R:bigbox/>
+ <creationdate/>
+ <displayname/>
+ <getcontentlength/>
+ <getcontenttype/>
+ <getetag/>
+ <getlastmodified/>
+ <resourcetype/>
+ <supportedlock/>
+ </prop>
+ <status>HTTP/1.1 200 OK</status>
+ </propstat>
+ </response>
+ </multistatus>
+
+
+ In this example, PROPFIND is invoked on the collection resource
+ http://www.foo.bar/container/, with a propfind XML element containing
+ the propname XML element, meaning the name of all properties should
+ be returned. Since no Depth header is present, it assumes its
+ default value of "infinity", meaning the name of the properties on
+ the collection and all its progeny should be returned.
+
+ Consistent with the previous example, resource
+ http://www.foo.bar/container/ has six properties defined on it,
+ http://www.foo.bar/boxschema/bigbox,
+ http://www.foo.bar/boxschema/author, DAV:creationdate,
+ DAV:displayname, DAV:resourcetype, and DAV:supportedlock.
+
+ The resource http://www.foo.bar/container/index.html, a member of the
+ "container" collection, has nine properties defined on it,
+ http://www.foo.bar/boxschema/bigbox, DAV:creationdate,
+ DAV:displayname, DAV:getcontentlength, DAV:getcontenttype,
+ DAV:getetag, DAV:getlastmodified, DAV:resourcetype, and
+ DAV:supportedlock.
+
+ This example also demonstrates the use of XML namespace scoping, and
+ the default namespace. Since the "xmlns" attribute does not contain
+ an explicit "shorthand name" (prefix) letter, the namespace applies
+ by default to all enclosed elements. Hence, all elements which do
+ not explicitly state the namespace to which they belong are members
+ of the "DAV:" namespace schema.
+
+
+
+
+
+
+
+Goland, et al. Standards Track [Page 30]
+
+RFC 2518 WEBDAV February 1999
+
+
+8.2 PROPPATCH
+
+ The PROPPATCH method processes instructions specified in the request
+ body to set and/or remove properties defined on the resource
+ identified by the Request-URI.
+
+ All DAV compliant resources MUST support the PROPPATCH method and
+ MUST process instructions that are specified using the
+ propertyupdate, set, and remove XML elements of the DAV schema.
+ Execution of the directives in this method is, of course, subject to
+ access control constraints. DAV compliant resources SHOULD support
+ the setting of arbitrary dead properties.
+
+ The request message body of a PROPPATCH method MUST contain the
+ propertyupdate XML element. Instruction processing MUST occur in the
+ order instructions are received (i.e., from top to bottom).
+ Instructions MUST either all be executed or none executed. Thus if
+ any error occurs during processing all executed instructions MUST be
+ undone and a proper error result returned. Instruction processing
+ details can be found in the definition of the set and remove
+ instructions in section 12.13.
+
+8.2.1 Status Codes for use with 207 (Multi-Status)
+
+ The following are examples of response codes one would expect to be
+ used in a 207 (Multi-Status) response for this method. Note,
+ however, that unless explicitly prohibited any 2/3/4/5xx series
+ response code may be used in a 207 (Multi-Status) response.
+
+ 200 (OK) - The command succeeded. As there can be a mixture of sets
+ and removes in a body, a 201 (Created) seems inappropriate.
+
+ 403 (Forbidden) - The client, for reasons the server chooses not to
+ specify, cannot alter one of the properties.
+
+ 409 (Conflict) - The client has provided a value whose semantics are
+ not appropriate for the property. This includes trying to set read-
+ only properties.
+
+ 423 (Locked) - The specified resource is locked and the client either
+ is not a lock owner or the lock type requires a lock token to be
+ submitted and the client did not submit it.
+
+ 507 (Insufficient Storage) - The server did not have sufficient space
+ to record the property.
+
+
+
+
+
+
+Goland, et al. Standards Track [Page 31]
+
+RFC 2518 WEBDAV February 1999
+
+
+8.2.2 Example - PROPPATCH
+
+ >>Request
+
+ PROPPATCH /bar.html HTTP/1.1
+ Host: www.foo.com
+ Content-Type: text/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:propertyupdate xmlns:D="DAV:"
+ xmlns:Z="http://www.w3.com/standards/z39.50/">
+ <D:set>
+ <D:prop>
+ <Z:authors>
+ <Z:Author>Jim Whitehead</Z:Author>
+ <Z:Author>Roy Fielding</Z:Author>
+ </Z:authors>
+ </D:prop>
+ </D:set>
+ <D:remove>
+ <D:prop><Z:Copyright-Owner/></D:prop>
+ </D:remove>
+ </D:propertyupdate>
+
+ >>Response
+
+ HTTP/1.1 207 Multi-Status
+ Content-Type: text/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:multistatus xmlns:D="DAV:"
+ xmlns:Z="http://www.w3.com/standards/z39.50">
+ <D:response>
+ <D:href>http://www.foo.com/bar.html</D:href>
+ <D:propstat>
+ <D:prop><Z:Authors/></D:prop>
+ <D:status>HTTP/1.1 424 Failed Dependency</D:status>
+ </D:propstat>
+ <D:propstat>
+ <D:prop><Z:Copyright-Owner/></D:prop>
+ <D:status>HTTP/1.1 409 Conflict</D:status>
+ </D:propstat>
+ <D:responsedescription> Copyright Owner can not be deleted or
+ altered.</D:responsedescription>
+ </D:response>
+ </D:multistatus>
+
+
+
+Goland, et al. Standards Track [Page 32]
+
+RFC 2518 WEBDAV February 1999
+
+
+ In this example, the client requests the server to set the value of
+ the http://www.w3.com/standards/z39.50/Authors property, and to
+ remove the property http://www.w3.com/standards/z39.50/Copyright-
+ Owner. Since the Copyright-Owner property could not be removed, no
+ property modifications occur. The 424 (Failed Dependency) status
+ code for the Authors property indicates this action would have
+ succeeded if it were not for the conflict with removing the
+ Copyright-Owner property.
+
+8.3 MKCOL Method
+
+ The MKCOL method is used to create a new collection. All DAV
+ compliant resources MUST support the MKCOL method.
+
+8.3.1 Request
+
+ MKCOL creates a new collection resource at the location specified by
+ the Request-URI. If the resource identified by the Request-URI is
+ non-null then the MKCOL MUST fail. During MKCOL processing, a server
+ MUST make the Request-URI a member of its parent collection, unless
+ the Request-URI is "/". If no such ancestor exists, the method MUST
+ fail. When the MKCOL operation creates a new collection resource,
+ all ancestors MUST already exist, or the method MUST fail with a 409
+ (Conflict) status code. For example, if a request to create
+ collection /a/b/c/d/ is made, and neither /a/b/ nor /a/b/c/ exists,
+ the request must fail.
+
+ When MKCOL is invoked without a request body, the newly created
+ collection SHOULD have no members.
+
+ A MKCOL request message may contain a message body. The behavior of
+ a MKCOL request when the body is present is limited to creating
+ collections, members of a collection, bodies of members and
+ properties on the collections or members. If the server receives a
+ MKCOL request entity type it does not support or understand it MUST
+ respond with a 415 (Unsupported Media Type) status code. The exact
+ behavior of MKCOL for various request media types is undefined in
+ this document, and will be specified in separate documents.
+
+8.3.2 Status Codes
+
+ Responses from a MKCOL request MUST NOT be cached as MKCOL has non-
+ idempotent semantics.
+
+ 201 (Created) - The collection or structured resource was created in
+ its entirety.
+
+
+
+
+
+Goland, et al. Standards Track [Page 33]
+
+RFC 2518 WEBDAV February 1999
+
+
+ 403 (Forbidden) - This indicates at least one of two conditions: 1)
+ the server does not allow the creation of collections at the given
+ location in its namespace, or 2) the parent collection of the
+ Request-URI exists but cannot accept members.
+
+ 405 (Method Not Allowed) - MKCOL can only be executed on a
+ deleted/non-existent resource.
+
+ 409 (Conflict) - A collection cannot be made at the Request-URI until
+ one or more intermediate collections have been created.
+
+ 415 (Unsupported Media Type)- The server does not support the request
+ type of the body.
+
+ 507 (Insufficient Storage) - The resource does not have sufficient
+ space to record the state of the resource after the execution of this
+ method.
+
+8.3.3 Example - MKCOL
+
+ This example creates a collection called /webdisc/xfiles/ on the
+ server www.server.org.
+
+ >>Request
+
+ MKCOL /webdisc/xfiles/ HTTP/1.1
+ Host: www.server.org
+
+ >>Response
+
+ HTTP/1.1 201 Created
+
+8.4 GET, HEAD for Collections
+
+ The semantics of GET are unchanged when applied to a collection,
+ since GET is defined as, "retrieve whatever information (in the form
+ of an entity) is identified by the Request-URI" [RFC2068]. GET when
+ applied to a collection may return the contents of an "index.html"
+ resource, a human-readable view of the contents of the collection, or
+ something else altogether. Hence it is possible that the result of a
+ GET on a collection will bear no correlation to the membership of the
+ collection.
+
+ Similarly, since the definition of HEAD is a GET without a response
+ message body, the semantics of HEAD are unmodified when applied to
+ collection resources.
+
+
+
+
+
+Goland, et al. Standards Track [Page 34]
+
+RFC 2518 WEBDAV February 1999
+
+
+8.5 POST for Collections
+
+ Since by definition the actual function performed by POST is
+ determined by the server and often depends on the particular
+ resource, the behavior of POST when applied to collections cannot be
+ meaningfully modified because it is largely undefined. Thus the
+ semantics of POST are unmodified when applied to a collection.
+
+8.6 DELETE
+
+ 8.6.1 DELETE for Non-Collection Resources
+
+ If the DELETE method is issued to a non-collection resource whose
+ URIs are an internal member of one or more collections, then during
+ DELETE processing a server MUST remove any URI for the resource
+ identified by the Request-URI from collections which contain it as a
+ member.
+
+8.6.2 DELETE for Collections
+
+ The DELETE method on a collection MUST act as if a "Depth: infinity"
+ header was used on it. A client MUST NOT submit a Depth header with
+ a DELETE on a collection with any value but infinity.
+
+ DELETE instructs that the collection specified in the Request-URI and
+ all resources identified by its internal member URIs are to be
+ deleted.
+
+ If any resource identified by a member URI cannot be deleted then all
+ of the member's ancestors MUST NOT be deleted, so as to maintain
+ namespace consistency.
+
+ Any headers included with DELETE MUST be applied in processing every
+ resource to be deleted.
+
+ When the DELETE method has completed processing it MUST result in a
+ consistent namespace.
+
+ If an error occurs with a resource other than the resource identified
+ in the Request-URI then the response MUST be a 207 (Multi-Status).
+ 424 (Failed Dependency) errors SHOULD NOT be in the 207 (Multi-
+ Status). They can be safely left out because the client will know
+ that the ancestors of a resource could not be deleted when the client
+ receives an error for the ancestor's progeny. Additionally 204 (No
+ Content) errors SHOULD NOT be returned in the 207 (Multi-Status).
+ The reason for this prohibition is that 204 (No Content) is the
+ default success code.
+
+
+
+
+Goland, et al. Standards Track [Page 35]
+
+RFC 2518 WEBDAV February 1999
+
+
+8.6.2.1 Example - DELETE
+
+ >>Request
+
+ DELETE /container/ HTTP/1.1
+ Host: www.foo.bar
+
+ >>Response
+
+ HTTP/1.1 207 Multi-Status
+ Content-Type: text/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <d:multistatus xmlns:d="DAV:">
+ <d:response>
+ <d:href>http://www.foo.bar/container/resource3</d:href>
+ <d:status>HTTP/1.1 423 Locked</d:status>
+ </d:response>
+ </d:multistatus>
+
+ In this example the attempt to delete
+ http://www.foo.bar/container/resource3 failed because it is locked,
+ and no lock token was submitted with the request. Consequently, the
+ attempt to delete http://www.foo.bar/container/ also failed. Thus the
+ client knows that the attempt to delete http://www.foo.bar/container/
+ must have also failed since the parent can not be deleted unless its
+ child has also been deleted. Even though a Depth header has not been
+ included, a depth of infinity is assumed because the method is on a
+ collection.
+
+8.7 PUT
+
+8.7.1 PUT for Non-Collection Resources
+
+ A PUT performed on an existing resource replaces the GET response
+ entity of the resource. Properties defined on the resource may be
+ recomputed during PUT processing but are not otherwise affected. For
+ example, if a server recognizes the content type of the request body,
+ it may be able to automatically extract information that could be
+ profitably exposed as properties.
+
+ A PUT that would result in the creation of a resource without an
+ appropriately scoped parent collection MUST fail with a 409
+ (Conflict).
+
+
+
+
+
+
+Goland, et al. Standards Track [Page 36]
+
+RFC 2518 WEBDAV February 1999
+
+
+8.7.2 PUT for Collections
+
+ As defined in the HTTP/1.1 specification [RFC2068], the "PUT method
+ requests that the enclosed entity be stored under the supplied
+ Request-URI." Since submission of an entity representing a
+ collection would implicitly encode creation and deletion of
+ resources, this specification intentionally does not define a
+ transmission format for creating a collection using PUT. Instead,
+ the MKCOL method is defined to create collections.
+
+ When the PUT operation creates a new non-collection resource all
+ ancestors MUST already exist. If all ancestors do not exist, the
+ method MUST fail with a 409 (Conflict) status code. For example, if
+ resource /a/b/c/d.html is to be created and /a/b/c/ does not exist,
+ then the request must fail.
+
+8.8 COPY Method
+
+ The COPY method creates a duplicate of the source resource,
+ identified by the Request-URI, in the destination resource,
+ identified by the URI in the Destination header. The Destination
+ header MUST be present. The exact behavior of the COPY method
+ depends on the type of the source resource.
+
+ All WebDAV compliant resources MUST support the COPY method.
+ However, support for the COPY method does not guarantee the ability
+ to copy a resource. For example, separate programs may control
+ resources on the same server. As a result, it may not be possible to
+ copy a resource to a location that appears to be on the same server.
+
+8.8.1 COPY for HTTP/1.1 resources
+
+ When the source resource is not a collection the result of the COPY
+ method is the creation of a new resource at the destination whose
+ state and behavior match that of the source resource as closely as
+ possible. After a successful COPY invocation, all properties on the
+ source resource MUST be duplicated on the destination resource,
+ subject to modifying headers and XML elements, following the
+ definition for copying properties. Since the environment at the
+ destination may be different than at the source due to factors
+ outside the scope of control of the server, such as the absence of
+ resources required for correct operation, it may not be possible to
+ completely duplicate the behavior of the resource at the destination.
+ Subsequent alterations to the destination resource will not modify
+ the source resource. Subsequent alterations to the source resource
+ will not modify the destination resource.
+
+
+
+
+
+Goland, et al. Standards Track [Page 37]
+
+RFC 2518 WEBDAV February 1999
+
+
+8.8.2. COPY for Properties
+
+ The following section defines how properties on a resource are
+ handled during a COPY operation.
+
+ Live properties SHOULD be duplicated as identically behaving live
+ properties at the destination resource. If a property cannot be
+ copied live, then its value MUST be duplicated, octet-for-octet, in
+ an identically named, dead property on the destination resource
+ subject to the effects of the propertybehavior XML element.
+
+ The propertybehavior XML element can specify that properties are
+ copied on best effort, that all live properties must be successfully
+ copied or the method must fail, or that a specified list of live
+ properties must be successfully copied or the method must fail. The
+ propertybehavior XML element is defined in section 12.12.
+
+8.8.3 COPY for Collections
+
+ The COPY method on a collection without a Depth header MUST act as if
+ a Depth header with value "infinity" was included. A client may
+ submit a Depth header on a COPY on a collection with a value of "0"
+ or "infinity". DAV compliant servers MUST support the "0" and
+ "infinity" Depth header behaviors.
+
+ A COPY of depth infinity instructs that the collection resource
+ identified by the Request-URI is to be copied to the location
+ identified by the URI in the Destination header, and all its internal
+ member resources are to be copied to a location relative to it,
+ recursively through all levels of the collection hierarchy.
+
+ A COPY of "Depth: 0" only instructs that the collection and its
+ properties but not resources identified by its internal member URIs,
+ are to be copied.
+
+ Any headers included with a COPY MUST be applied in processing every
+ resource to be copied with the exception of the Destination header.
+
+ The Destination header only specifies the destination URI for the
+ Request-URI. When applied to members of the collection identified by
+ the Request-URI the value of Destination is to be modified to reflect
+ the current location in the hierarchy. So, if the Request- URI is
+ /a/ with Host header value http://fun.com/ and the Destination is
+ http://fun.com/b/ then when http://fun.com/a/c/d is processed it must
+ use a Destination of http://fun.com/b/c/d.
+
+
+
+
+
+
+Goland, et al. Standards Track [Page 38]
+
+RFC 2518 WEBDAV February 1999
+
+
+ When the COPY method has completed processing it MUST have created a
+ consistent namespace at the destination (see section 5.1 for the
+ definition of namespace consistency). However, if an error occurs
+ while copying an internal collection, the server MUST NOT copy any
+ resources identified by members of this collection (i.e., the server
+ must skip this subtree), as this would create an inconsistent
+ namespace. After detecting an error, the COPY operation SHOULD try to
+ finish as much of the original copy operation as possible (i.e., the
+ server should still attempt to copy other subtrees and their members,
+ that are not descendents of an error-causing collection). So, for
+ example, if an infinite depth copy operation is performed on
+ collection /a/, which contains collections /a/b/ and /a/c/, and an
+ error occurs copying /a/b/, an attempt should still be made to copy
+ /a/c/. Similarly, after encountering an error copying a non-
+ collection resource as part of an infinite depth copy, the server
+ SHOULD try to finish as much of the original copy operation as
+ possible.
+
+ If an error in executing the COPY method occurs with a resource other
+ than the resource identified in the Request-URI then the response
+ MUST be a 207 (Multi-Status).
+
+ The 424 (Failed Dependency) status code SHOULD NOT be returned in the
+ 207 (Multi-Status) response from a COPY method. These responses can
+ be safely omitted because the client will know that the progeny of a
+ resource could not be copied when the client receives an error for
+ the parent. Additionally 201 (Created)/204 (No Content) status codes
+ SHOULD NOT be returned as values in 207 (Multi-Status) responses from
+ COPY methods. They, too, can be safely omitted because they are the
+ default success codes.
+
+8.8.4 COPY and the Overwrite Header
+
+ If a resource exists at the destination and the Overwrite header is
+ "T" then prior to performing the copy the server MUST perform a
+ DELETE with "Depth: infinity" on the destination resource. If the
+ Overwrite header is set to "F" then the operation will fail.
+
+8.8.5 Status Codes
+
+ 201 (Created) - The source resource was successfully copied. The
+ copy operation resulted in the creation of a new resource.
+
+ 204 (No Content) - The source resource was successfully copied to a
+ pre-existing destination resource.
+
+ 403 (Forbidden) _ The source and destination URIs are the same.
+
+
+
+
+Goland, et al. Standards Track [Page 39]
+
+RFC 2518 WEBDAV February 1999
+
+
+ 409 (Conflict) _ A resource cannot be created at the destination
+ until one or more intermediate collections have been created.
+
+ 412 (Precondition Failed) - The server was unable to maintain the
+ liveness of the properties listed in the propertybehavior XML element
+ or the Overwrite header is "F" and the state of the destination
+ resource is non-null.
+
+ 423 (Locked) - The destination resource was locked.
+
+ 502 (Bad Gateway) - This may occur when the destination is on another
+ server and the destination server refuses to accept the resource.
+
+ 507 (Insufficient Storage) - The destination resource does not have
+ sufficient space to record the state of the resource after the
+ execution of this method.
+
+8.8.6 Example - COPY with Overwrite
+
+ This example shows resource
+ http://www.ics.uci.edu/~fielding/index.html being copied to the
+ location http://www.ics.uci.edu/users/f/fielding/index.html. The 204
+ (No Content) status code indicates the existing resource at the
+ destination was overwritten.
+
+ >>Request
+
+ COPY /~fielding/index.html HTTP/1.1
+ Host: www.ics.uci.edu
+ Destination: http://www.ics.uci.edu/users/f/fielding/index.html
+
+ >>Response
+
+ HTTP/1.1 204 No Content
+
+8.8.7 Example - COPY with No Overwrite
+
+ The following example shows the same copy operation being performed,
+ but with the Overwrite header set to "F." A response of 412
+ (Precondition Failed) is returned because the destination resource
+ has a non-null state.
+
+ >>Request
+
+ COPY /~fielding/index.html HTTP/1.1
+ Host: www.ics.uci.edu
+ Destination: http://www.ics.uci.edu/users/f/fielding/index.html
+ Overwrite: F
+
+
+
+Goland, et al. Standards Track [Page 40]
+
+RFC 2518 WEBDAV February 1999
+
+
+ >>Response
+
+ HTTP/1.1 412 Precondition Failed
+
+8.8.8 Example - COPY of a Collection
+
+ >>Request
+
+ COPY /container/ HTTP/1.1
+ Host: www.foo.bar
+ Destination: http://www.foo.bar/othercontainer/
+ Depth: infinity
+ Content-Type: text/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <d:propertybehavior xmlns:d="DAV:">
+ <d:keepalive>*</d:keepalive>
+ </d:propertybehavior>
+
+ >>Response
+
+ HTTP/1.1 207 Multi-Status
+ Content-Type: text/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <d:multistatus xmlns:d="DAV:">
+ <d:response>
+ <d:href>http://www.foo.bar/othercontainer/R2/</d:href>
+ <d:status>HTTP/1.1 412 Precondition Failed</d:status>
+ </d:response>
+ </d:multistatus>
+
+ The Depth header is unnecessary as the default behavior of COPY on a
+ collection is to act as if a "Depth: infinity" header had been
+ submitted. In this example most of the resources, along with the
+ collection, were copied successfully. However the collection R2
+ failed, most likely due to a problem with maintaining the liveness of
+ properties (this is specified by the propertybehavior XML element).
+ Because there was an error copying R2, none of R2's members were
+ copied. However no errors were listed for those members due to the
+ error minimization rules given in section 8.8.3.
+
+
+
+
+
+
+
+
+Goland, et al. Standards Track [Page 41]
+
+RFC 2518 WEBDAV February 1999
+
+
+8.9 MOVE Method
+
+ The MOVE operation on a non-collection resource is the logical
+ equivalent of a copy (COPY), followed by consistency maintenance
+ processing, followed by a delete of the source, where all three
+ actions are performed atomically. The consistency maintenance step
+ allows the server to perform updates caused by the move, such as
+ updating all URIs other than the Request-URI which identify the
+ source resource, to point to the new destination resource.
+ Consequently, the Destination header MUST be present on all MOVE
+ methods and MUST follow all COPY requirements for the COPY part of
+ the MOVE method. All DAV compliant resources MUST support the MOVE
+ method. However, support for the MOVE method does not guarantee the
+ ability to move a resource to a particular destination.
+
+ For example, separate programs may actually control different sets of
+ resources on the same server. Therefore, it may not be possible to
+ move a resource within a namespace that appears to belong to the same
+ server.
+
+ If a resource exists at the destination, the destination resource
+ will be DELETEd as a side-effect of the MOVE operation, subject to
+ the restrictions of the Overwrite header.
+
+8.9.1 MOVE for Properties
+
+ The behavior of properties on a MOVE, including the effects of the
+ propertybehavior XML element, MUST be the same as specified in
+ section 8.8.2.
+
+8.9.2 MOVE for Collections
+
+ A MOVE with "Depth: infinity" instructs that the collection
+ identified by the Request-URI be moved to the URI specified in the
+ Destination header, and all resources identified by its internal
+ member URIs are to be moved to locations relative to it, recursively
+ through all levels of the collection hierarchy.
+
+ The MOVE method on a collection MUST act as if a "Depth: infinity"
+ header was used on it. A client MUST NOT submit a Depth header on a
+ MOVE on a collection with any value but "infinity".
+
+ Any headers included with MOVE MUST be applied in processing every
+ resource to be moved with the exception of the Destination header.
+
+ The behavior of the Destination header is the same as given for COPY
+ on collections.
+
+
+
+
+Goland, et al. Standards Track [Page 42]
+
+RFC 2518 WEBDAV February 1999
+
+
+ When the MOVE method has completed processing it MUST have created a
+ consistent namespace at both the source and destination (see section
+ 5.1 for the definition of namespace consistency). However, if an
+ error occurs while moving an internal collection, the server MUST NOT
+ move any resources identified by members of the failed collection
+ (i.e., the server must skip the error-causing subtree), as this would
+ create an inconsistent namespace. In this case, after detecting the
+ error, the move operation SHOULD try to finish as much of the
+ original move as possible (i.e., the server should still attempt to
+ move other subtrees and the resources identified by their members,
+ that are not descendents of an error-causing collection). So, for
+ example, if an infinite depth move is performed on collection /a/,
+ which contains collections /a/b/ and /a/c/, and an error occurs
+ moving /a/b/, an attempt should still be made to try moving /a/c/.
+ Similarly, after encountering an error moving a non-collection
+ resource as part of an infinite depth move, the server SHOULD try to
+ finish as much of the original move operation as possible.
+
+ If an error occurs with a resource other than the resource identified
+ in the Request-URI then the response MUST be a 207 (Multi-Status).
+
+ The 424 (Failed Dependency) status code SHOULD NOT be returned in the
+ 207 (Multi-Status) response from a MOVE method. These errors can be
+ safely omitted because the client will know that the progeny of a
+ resource could not be moved when the client receives an error for the
+ parent. Additionally 201 (Created)/204 (No Content) responses SHOULD
+ NOT be returned as values in 207 (Multi-Status) responses from a
+ MOVE. These responses can be safely omitted because they are the
+ default success codes.
+
+8.9.3 MOVE and the Overwrite Header
+
+ If a resource exists at the destination and the Overwrite header is
+ "T" then prior to performing the move the server MUST perform a
+ DELETE with "Depth: infinity" on the destination resource. If the
+ Overwrite header is set to "F" then the operation will fail.
+
+8.9.4 Status Codes
+
+ 201 (Created) - The source resource was successfully moved, and a new
+ resource was created at the destination.
+
+ 204 (No Content) - The source resource was successfully moved to a
+ pre-existing destination resource.
+
+ 403 (Forbidden) _ The source and destination URIs are the same.
+
+
+
+
+
+Goland, et al. Standards Track [Page 43]
+
+RFC 2518 WEBDAV February 1999
+
+
+ 409 (Conflict) _ A resource cannot be created at the destination
+ until one or more intermediate collections have been created.
+
+ 412 (Precondition Failed) - The server was unable to maintain the
+ liveness of the properties listed in the propertybehavior XML element
+ or the Overwrite header is "F" and the state of the destination
+ resource is non-null.
+
+ 423 (Locked) - The source or the destination resource was locked.
+
+ 502 (Bad Gateway) - This may occur when the destination is on another
+ server and the destination server refuses to accept the resource.
+
+8.9.5 Example - MOVE of a Non-Collection
+
+ This example shows resource
+ http://www.ics.uci.edu/~fielding/index.html being moved to the
+ location http://www.ics.uci.edu/users/f/fielding/index.html. The
+ contents of the destination resource would have been overwritten if
+ the destination resource had been non-null. In this case, since
+ there was nothing at the destination resource, the response code is
+ 201 (Created).
+
+ >>Request
+
+ MOVE /~fielding/index.html HTTP/1.1
+ Host: www.ics.uci.edu
+ Destination: http://www.ics.uci.edu/users/f/fielding/index.html
+
+ >>Response
+
+ HTTP/1.1 201 Created
+ Location: http://www.ics.uci.edu/users/f/fielding/index.html
+
+
+8.9.6 Example - MOVE of a Collection
+
+ >>Request
+
+ MOVE /container/ HTTP/1.1
+ Host: www.foo.bar
+ Destination: http://www.foo.bar/othercontainer/
+ Overwrite: F
+ If: (<opaquelocktoken:fe184f2e-6eec-41d0-c765-01adc56e6bb4>)
+ (<opaquelocktoken:e454f3f3-acdc-452a-56c7-00a5c91e4b77>)
+ Content-Type: text/xml; charset="utf-8"
+ Content-Length: xxxx
+
+
+
+
+Goland, et al. Standards Track [Page 44]
+
+RFC 2518 WEBDAV February 1999
+
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <d:propertybehavior xmlns:d='DAV:'>
+ <d:keepalive>*</d:keepalive>
+ </d:propertybehavior>
+
+ >>Response
+
+ HTTP/1.1 207 Multi-Status
+ Content-Type: text/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <d:multistatus xmlns:d='DAV:'>
+ <d:response>
+ <d:href>http://www.foo.bar/othercontainer/C2/</d:href>
+ <d:status>HTTP/1.1 423 Locked</d:status>
+ </d:response>
+ </d:multistatus>
+
+ In this example the client has submitted a number of lock tokens with
+ the request. A lock token will need to be submitted for every
+ resource, both source and destination, anywhere in the scope of the
+ method, that is locked. In this case the proper lock token was not
+ submitted for the destination http://www.foo.bar/othercontainer/C2/.
+ This means that the resource /container/C2/ could not be moved.
+ Because there was an error copying /container/C2/, none of
+ /container/C2's members were copied. However no errors were listed
+ for those members due to the error minimization rules given in
+ section 8.8.3. User agent authentication has previously occurred via
+ a mechanism outside the scope of the HTTP protocol, in an underlying
+ transport layer.
+
+8.10 LOCK Method
+
+ The following sections describe the LOCK method, which is used to
+ take out a lock of any access type. These sections on the LOCK
+ method describe only those semantics that are specific to the LOCK
+ method and are independent of the access type of the lock being
+ requested.
+
+ Any resource which supports the LOCK method MUST, at minimum, support
+ the XML request and response formats defined herein.
+
+
+
+
+
+
+
+
+
+Goland, et al. Standards Track [Page 45]
+
+RFC 2518 WEBDAV February 1999
+
+
+8.10.1 Operation
+
+ A LOCK method invocation creates the lock specified by the lockinfo
+ XML element on the Request-URI. Lock method requests SHOULD have a
+ XML request body which contains an owner XML element for this lock
+ request, unless this is a refresh request. The LOCK request may have
+ a Timeout header.
+
+ Clients MUST assume that locks may arbitrarily disappear at any time,
+ regardless of the value given in the Timeout header. The Timeout
+ header only indicates the behavior of the server if "extraordinary"
+ circumstances do not occur. For example, an administrator may remove
+ a lock at any time or the system may crash in such a way that it
+ loses the record of the lock's existence. The response MUST contain
+ the value of the lockdiscovery property in a prop XML element.
+
+ In order to indicate the lock token associated with a newly created
+ lock, a Lock-Token response header MUST be included in the response
+ for every successful LOCK request for a new lock. Note that the
+ Lock-Token header would not be returned in the response for a
+ successful refresh LOCK request because a new lock was not created.
+
+8.10.2 The Effect of Locks on Properties and Collections
+
+ The scope of a lock is the entire state of the resource, including
+ its body and associated properties. As a result, a lock on a
+ resource MUST also lock the resource's properties.
+
+ For collections, a lock also affects the ability to add or remove
+ members. The nature of the effect depends upon the type of access
+ control involved.
+
+8.10.3 Locking Replicated Resources
+
+ A resource may be made available through more than one URI. However
+ locks apply to resources, not URIs. Therefore a LOCK request on a
+ resource MUST NOT succeed if can not be honored by all the URIs
+ through which the resource is addressable.
+
+8.10.4 Depth and Locking
+
+ The Depth header may be used with the LOCK method. Values other than
+ 0 or infinity MUST NOT be used with the Depth header on a LOCK
+ method. All resources that support the LOCK method MUST support the
+ Depth header.
+
+ A Depth header of value 0 means to just lock the resource specified
+ by the Request-URI.
+
+
+
+Goland, et al. Standards Track [Page 46]
+
+RFC 2518 WEBDAV February 1999
+
+
+ If the Depth header is set to infinity then the resource specified in
+ the Request-URI along with all its internal members, all the way down
+ the hierarchy, are to be locked. A successful result MUST return a
+ single lock token which represents all the resources that have been
+ locked. If an UNLOCK is successfully executed on this token, all
+ associated resources are unlocked. If the lock cannot be granted to
+ all resources, a 409 (Conflict) status code MUST be returned with a
+ response entity body containing a multistatus XML element describing
+ which resource(s) prevented the lock from being granted. Hence,
+ partial success is not an option. Either the entire hierarchy is
+ locked or no resources are locked.
+
+ If no Depth header is submitted on a LOCK request then the request
+ MUST act as if a "Depth:infinity" had been submitted.
+
+8.10.5 Interaction with other Methods
+
+ The interaction of a LOCK with various methods is dependent upon the
+ lock type. However, independent of lock type, a successful DELETE of
+ a resource MUST cause all of its locks to be removed.
+
+8.10.6 Lock Compatibility Table
+
+ The table below describes the behavior that occurs when a lock
+ request is made on a resource.
+
+ Current lock state/ | Shared Lock | Exclusive
+ Lock request | | Lock
+ =====================+=================+==============
+ None | True | True
+ ---------------------+-----------------+--------------
+ Shared Lock | True | False
+ ---------------------+-----------------+--------------
+ Exclusive Lock | False | False*
+ ------------------------------------------------------
+
+ Legend: True = lock may be granted. False = lock MUST NOT be
+ granted. *=It is illegal for a principal to request the same lock
+ twice.
+
+ The current lock state of a resource is given in the leftmost column,
+ and lock requests are listed in the first row. The intersection of a
+ row and column gives the result of a lock request. For example, if a
+ shared lock is held on a resource, and an exclusive lock is
+ requested, the table entry is "false", indicating the lock must not
+ be granted.
+
+
+
+
+
+Goland, et al. Standards Track [Page 47]
+
+RFC 2518 WEBDAV February 1999
+
+
+8.10.7 Status Codes
+
+ 200 (OK) - The lock request succeeded and the value of the
+ lockdiscovery property is included in the body.
+
+ 412 (Precondition Failed) - The included lock token was not
+ enforceable on this resource or the server could not satisfy the
+ request in the lockinfo XML element.
+
+ 423 (Locked) - The resource is locked, so the method has been
+ rejected.
+
+8.10.8 Example - Simple Lock Request
+
+ >>Request
+
+ LOCK /workspace/webdav/proposal.doc HTTP/1.1
+ Host: webdav.sb.aol.com
+ Timeout: Infinite, Second-4100000000
+ Content-Type: text/xml; charset="utf-8"
+ Content-Length: xxxx
+ Authorization: Digest username="ejw",
+ realm="ejw@webdav.sb.aol.com", nonce="...",
+ uri="/workspace/webdav/proposal.doc",
+ response="...", opaque="..."
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:lockinfo xmlns:D='DAV:'>
+ <D:lockscope><D:exclusive/></D:lockscope>
+ <D:locktype><D:write/></D:locktype>
+ <D:owner>
+ <D:href>http://www.ics.uci.edu/~ejw/contact.html</D:href>
+ </D:owner>
+ </D:lockinfo>
+
+ >>Response
+
+ HTTP/1.1 200 OK
+ Content-Type: text/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:prop xmlns:D="DAV:">
+ <D:lockdiscovery>
+ <D:activelock>
+ <D:locktype><D:write/></D:locktype>
+ <D:lockscope><D:exclusive/></D:lockscope>
+ <D:depth>Infinity</D:depth>
+
+
+
+Goland, et al. Standards Track [Page 48]
+
+RFC 2518 WEBDAV February 1999
+
+
+ <D:owner>
+ <D:href>
+ http://www.ics.uci.edu/~ejw/contact.html
+ </D:href>
+ </D:owner>
+ <D:timeout>Second-604800</D:timeout>
+ <D:locktoken>
+ <D:href>
+ opaquelocktoken:e71d4fae-5dec-22d6-fea5-00a0c91e6be4
+ </D:href>
+ </D:locktoken>
+ </D:activelock>
+ </D:lockdiscovery>
+ </D:prop>
+
+ This example shows the successful creation of an exclusive write lock
+ on resource http://webdav.sb.aol.com/workspace/webdav/proposal.doc.
+ The resource http://www.ics.uci.edu/~ejw/contact.html contains
+ contact information for the owner of the lock. The server has an
+ activity-based timeout policy in place on this resource, which causes
+ the lock to automatically be removed after 1 week (604800 seconds).
+ Note that the nonce, response, and opaque fields have not been
+ calculated in the Authorization request header.
+
+8.10.9 Example - Refreshing a Write Lock
+
+ >>Request
+
+ LOCK /workspace/webdav/proposal.doc HTTP/1.1
+ Host: webdav.sb.aol.com
+ Timeout: Infinite, Second-4100000000
+ If: (<opaquelocktoken:e71d4fae-5dec-22d6-fea5-00a0c91e6be4>)
+ Authorization: Digest username="ejw",
+ realm="ejw@webdav.sb.aol.com", nonce="...",
+ uri="/workspace/webdav/proposal.doc",
+ response="...", opaque="..."
+
+ >>Response
+
+ HTTP/1.1 200 OK
+ Content-Type: text/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:prop xmlns:D="DAV:">
+ <D:lockdiscovery>
+ <D:activelock>
+ <D:locktype><D:write/></D:locktype>
+
+
+
+Goland, et al. Standards Track [Page 49]
+
+RFC 2518 WEBDAV February 1999
+
+
+ <D:lockscope><D:exclusive/></D:lockscope>
+ <D:depth>Infinity</D:depth>
+ <D:owner>
+ <D:href>
+ http://www.ics.uci.edu/~ejw/contact.html
+ </D:href>
+ </D:owner>
+ <D:timeout>Second-604800</D:timeout>
+ <D:locktoken>
+ <D:href>
+ opaquelocktoken:e71d4fae-5dec-22d6-fea5-00a0c91e6be4
+ </D:href>
+ </D:locktoken>
+ </D:activelock>
+ </D:lockdiscovery>
+ </D:prop>
+
+ This request would refresh the lock, resetting any time outs. Notice
+ that the client asked for an infinite time out but the server choose
+ to ignore the request. In this example, the nonce, response, and
+ opaque fields have not been calculated in the Authorization request
+ header.
+
+8.10.10 Example - Multi-Resource Lock Request
+
+ >>Request
+
+ LOCK /webdav/ HTTP/1.1
+ Host: webdav.sb.aol.com
+ Timeout: Infinite, Second-4100000000
+ Depth: infinity
+ Content-Type: text/xml; charset="utf-8"
+ Content-Length: xxxx
+ Authorization: Digest username="ejw",
+ realm="ejw@webdav.sb.aol.com", nonce="...",
+ uri="/workspace/webdav/proposal.doc",
+ response="...", opaque="..."
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:lockinfo xmlns:D="DAV:">
+ <D:locktype><D:write/></D:locktype>
+ <D:lockscope><D:exclusive/></D:lockscope>
+ <D:owner>
+ <D:href>http://www.ics.uci.edu/~ejw/contact.html</D:href>
+ </D:owner>
+ </D:lockinfo>
+
+ >>Response
+
+
+
+Goland, et al. Standards Track [Page 50]
+
+RFC 2518 WEBDAV February 1999
+
+
+ HTTP/1.1 207 Multi-Status
+ Content-Type: text/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:multistatus xmlns:D="DAV:">
+ <D:response>
+ <D:href>http://webdav.sb.aol.com/webdav/secret</D:href>
+ <D:status>HTTP/1.1 403 Forbidden</D:status>
+ </D:response>
+ <D:response>
+ <D:href>http://webdav.sb.aol.com/webdav/</D:href>
+ <D:propstat>
+ <D:prop><D:lockdiscovery/></D:prop>
+ <D:status>HTTP/1.1 424 Failed Dependency</D:status>
+ </D:propstat>
+ </D:response>
+ </D:multistatus>
+
+ This example shows a request for an exclusive write lock on a
+ collection and all its children. In this request, the client has
+ specified that it desires an infinite length lock, if available,
+ otherwise a timeout of 4.1 billion seconds, if available. The request
+ entity body contains the contact information for the principal taking
+ out the lock, in this case a web page URL.
+
+ The error is a 403 (Forbidden) response on the resource
+ http://webdav.sb.aol.com/webdav/secret. Because this resource could
+ not be locked, none of the resources were locked. Note also that the
+ lockdiscovery property for the Request-URI has been included as
+ required. In this example the lockdiscovery property is empty which
+ means that there are no outstanding locks on the resource.
+
+ In this example, the nonce, response, and opaque fields have not been
+ calculated in the Authorization request header.
+
+8.11 UNLOCK Method
+
+ The UNLOCK method removes the lock identified by the lock token in
+ the Lock-Token request header from the Request-URI, and all other
+ resources included in the lock. If all resources which have been
+ locked under the submitted lock token can not be unlocked then the
+ UNLOCK request MUST fail.
+
+ Any DAV compliant resource which supports the LOCK method MUST
+ support the UNLOCK method.
+
+
+
+
+
+Goland, et al. Standards Track [Page 51]
+
+RFC 2518 WEBDAV February 1999
+
+
+8.11.1 Example - UNLOCK
+
+ >>Request
+
+ UNLOCK /workspace/webdav/info.doc HTTP/1.1
+ Host: webdav.sb.aol.com
+ Lock-Token: <opaquelocktoken:a515cfa4-5da4-22e1-f5b5-00a0451e6bf7>
+ Authorization: Digest username="ejw",
+ realm="ejw@webdav.sb.aol.com", nonce="...",
+ uri="/workspace/webdav/proposal.doc",
+ response="...", opaque="..."
+
+ >>Response
+
+ HTTP/1.1 204 No Content
+
+ In this example, the lock identified by the lock token
+ "opaquelocktoken:a515cfa4-5da4-22e1-f5b5-00a0451e6bf7" is
+ successfully removed from the resource
+ http://webdav.sb.aol.com/workspace/webdav/info.doc. If this lock
+ included more than just one resource, the lock is removed from all
+ resources included in the lock. The 204 (No Content) status code is
+ used instead of 200 (OK) because there is no response entity body.
+
+ In this example, the nonce, response, and opaque fields have not been
+ calculated in the Authorization request header.
+
+9 HTTP Headers for Distributed Authoring
+
+9.1 DAV Header
+
+ DAV = "DAV" ":" "1" ["," "2"] ["," 1#extend]
+
+ This header indicates that the resource supports the DAV schema and
+ protocol as specified. All DAV compliant resources MUST return the
+ DAV header on all OPTIONS responses.
+
+ The value is a list of all compliance classes that the resource
+ supports. Note that above a comma has already been added to the 2.
+ This is because a resource can not be level 2 compliant unless it is
+ also level 1 compliant. Please refer to section 15 for more details.
+ In general, however, support for one compliance class does not entail
+ support for any other.
+
+9.2 Depth Header
+
+ Depth = "Depth" ":" ("0" | "1" | "infinity")
+
+
+
+
+Goland, et al. Standards Track [Page 52]
+
+RFC 2518 WEBDAV February 1999
+
+
+ The Depth header is used with methods executed on resources which
+ could potentially have internal members to indicate whether the
+ method is to be applied only to the resource ("Depth: 0"), to the
+ resource and its immediate children, ("Depth: 1"), or the resource
+ and all its progeny ("Depth: infinity").
+
+ The Depth header is only supported if a method's definition
+ explicitly provides for such support.
+
+ The following rules are the default behavior for any method that
+ supports the Depth header. A method may override these defaults by
+ defining different behavior in its definition.
+
+ Methods which support the Depth header may choose not to support all
+ of the header's values and may define, on a case by case basis, the
+ behavior of the method if a Depth header is not present. For example,
+ the MOVE method only supports "Depth: infinity" and if a Depth header
+ is not present will act as if a "Depth: infinity" header had been
+ applied.
+
+ Clients MUST NOT rely upon methods executing on members of their
+ hierarchies in any particular order or on the execution being atomic
+ unless the particular method explicitly provides such guarantees.
+
+ Upon execution, a method with a Depth header will perform as much of
+ its assigned task as possible and then return a response specifying
+ what it was able to accomplish and what it failed to do.
+
+ So, for example, an attempt to COPY a hierarchy may result in some of
+ the members being copied and some not.
+
+ Any headers on a method that has a defined interaction with the Depth
+ header MUST be applied to all resources in the scope of the method
+ except where alternative behavior is explicitly defined. For example,
+ an If-Match header will have its value applied against every resource
+ in the method's scope and will cause the method to fail if the header
+ fails to match.
+
+ If a resource, source or destination, within the scope of the method
+ with a Depth header is locked in such a way as to prevent the
+ successful execution of the method, then the lock token for that
+ resource MUST be submitted with the request in the If request header.
+
+ The Depth header only specifies the behavior of the method with
+ regards to internal children. If a resource does not have internal
+ children then the Depth header MUST be ignored.
+
+
+
+
+
+Goland, et al. Standards Track [Page 53]
+
+RFC 2518 WEBDAV February 1999
+
+
+ Please note, however, that it is always an error to submit a value
+ for the Depth header that is not allowed by the method's definition.
+ Thus submitting a "Depth: 1" on a COPY, even if the resource does not
+ have internal members, will result in a 400 (Bad Request). The method
+ should fail not because the resource doesn't have internal members,
+ but because of the illegal value in the header.
+
+9.3 Destination Header
+
+ Destination = "Destination" ":" absoluteURI
+
+ The Destination header specifies the URI which identifies a
+ destination resource for methods such as COPY and MOVE, which take
+ two URIs as parameters. Note that the absoluteURI production is
+ defined in [RFC2396].
+
+9.4 If Header
+
+ If = "If" ":" ( 1*No-tag-list | 1*Tagged-list)
+ No-tag-list = List
+ Tagged-list = Resource 1*List
+ Resource = Coded-URL
+ List = "(" 1*(["Not"](State-token | "[" entity-tag "]")) ")"
+ State-token = Coded-URL
+ Coded-URL = "<" absoluteURI ">"
+
+ The If header is intended to have similar functionality to the If-
+ Match header defined in section 14.25 of [RFC2068]. However the If
+ header is intended for use with any URI which represents state
+ information, referred to as a state token, about a resource as well
+ as ETags. A typical example of a state token is a lock token, and
+ lock tokens are the only state tokens defined in this specification.
+
+ All DAV compliant resources MUST honor the If header.
+
+ The If header's purpose is to describe a series of state lists. If
+ the state of the resource to which the header is applied does not
+ match any of the specified state lists then the request MUST fail
+ with a 412 (Precondition Failed). If one of the described state
+ lists matches the state of the resource then the request may succeed.
+
+ Note that the absoluteURI production is defined in [RFC2396].
+
+
+
+
+
+
+
+
+
+Goland, et al. Standards Track [Page 54]
+
+RFC 2518 WEBDAV February 1999
+
+
+9.4.1 No-tag-list Production
+
+ The No-tag-list production describes a series of state tokens and
+ ETags. If multiple No-tag-list productions are used then one only
+ needs to match the state of the resource for the method to be allowed
+ to continue.
+
+ If a method, due to the presence of a Depth or Destination header, is
+ applied to multiple resources then the No-tag-list production MUST be
+ applied to each resource the method is applied to.
+
+9.4.1.1 Example - No-tag-list If Header
+
+ If: (<locktoken:a-write-lock-token> ["I am an ETag"]) (["I am another
+ ETag"])
+
+ The previous header would require that any resources within the scope
+ of the method must either be locked with the specified lock token and
+ in the state identified by the "I am an ETag" ETag or in the state
+ identified by the second ETag "I am another ETag". To put the matter
+ more plainly one can think of the previous If header as being in the
+ form (or (and <locktoken:a-write-lock-token> ["I am an ETag"]) (and
+ ["I am another ETag"])).
+
+9.4.2 Tagged-list Production
+
+ The tagged-list production scopes a list production. That is, it
+ specifies that the lists following the resource specification only
+ apply to the specified resource. The scope of the resource
+ production begins with the list production immediately following the
+ resource production and ends with the next resource production, if
+ any.
+
+ When the If header is applied to a particular resource, the Tagged-
+ list productions MUST be searched to determine if any of the listed
+ resources match the operand resource(s) for the current method. If
+ none of the resource productions match the current resource then the
+ header MUST be ignored. If one of the resource productions does
+ match the name of the resource under consideration then the list
+ productions following the resource production MUST be applied to the
+ resource in the manner specified in the previous section.
+
+ The same URI MUST NOT appear more than once in a resource production
+ in an If header.
+
+
+
+
+
+
+
+Goland, et al. Standards Track [Page 55]
+
+RFC 2518 WEBDAV February 1999
+
+
+9.4.2.1 Example - Tagged List If header
+
+ COPY /resource1 HTTP/1.1
+ Host: www.foo.bar
+ Destination: http://www.foo.bar/resource2
+ If: <http://www.foo.bar/resource1> (<locktoken:a-write-lock-token>
+ [W/"A weak ETag"]) (["strong ETag"])
+ <http://www.bar.bar/random>(["another strong ETag"])
+
+ In this example http://www.foo.bar/resource1 is being copied to
+ http://www.foo.bar/resource2. When the method is first applied to
+ http://www.foo.bar/resource1, resource1 must be in the state
+ specified by "(<locktoken:a-write-lock-token> [W/"A weak ETag"])
+ (["strong ETag"])", that is, it either must be locked with a lock
+ token of "locktoken:a-write-lock-token" and have a weak entity tag
+ W/"A weak ETag" or it must have a strong entity tag "strong ETag".
+
+ That is the only success condition since the resource
+ http://www.bar.bar/random never has the method applied to it (the
+ only other resource listed in the If header) and
+ http://www.foo.bar/resource2 is not listed in the If header.
+
+9.4.3 not Production
+
+ Every state token or ETag is either current, and hence describes the
+ state of a resource, or is not current, and does not describe the
+ state of a resource. The boolean operation of matching a state token
+ or ETag to the current state of a resource thus resolves to a true or
+ false value. The not production is used to reverse that value. The
+ scope of the not production is the state-token or entity-tag
+ immediately following it.
+
+ If: (Not <locktoken:write1> <locktoken:write2>)
+
+ When submitted with a request, this If header requires that all
+ operand resources must not be locked with locktoken:write1 and must
+ be locked with locktoken:write2.
+
+9.4.4 Matching Function
+
+ When performing If header processing, the definition of a matching
+ state token or entity tag is as follows.
+
+ Matching entity tag: Where the entity tag matches an entity tag
+ associated with that resource.
+
+ Matching state token: Where there is an exact match between the state
+ token in the If header and any state token on the resource.
+
+
+
+Goland, et al. Standards Track [Page 56]
+
+RFC 2518 WEBDAV February 1999
+
+
+9.4.5 If Header and Non-DAV Compliant Proxies
+
+ Non-DAV compliant proxies will not honor the If header, since they
+ will not understand the If header, and HTTP requires non-understood
+ headers to be ignored. When communicating with HTTP/1.1 proxies, the
+ "Cache-Control: no-cache" request header MUST be used so as to
+ prevent the proxy from improperly trying to service the request from
+ its cache. When dealing with HTTP/1.0 proxies the "Pragma: no-cache"
+ request header MUST be used for the same reason.
+
+9.5 Lock-Token Header
+
+ Lock-Token = "Lock-Token" ":" Coded-URL
+
+ The Lock-Token request header is used with the UNLOCK method to
+ identify the lock to be removed. The lock token in the Lock-Token
+ request header MUST identify a lock that contains the resource
+ identified by Request-URI as a member.
+
+ The Lock-Token response header is used with the LOCK method to
+ indicate the lock token created as a result of a successful LOCK
+ request to create a new lock.
+
+9.6 Overwrite Header
+
+ Overwrite = "Overwrite" ":" ("T" | "F")
+
+ The Overwrite header specifies whether the server should overwrite
+ the state of a non-null destination resource during a COPY or MOVE.
+ A value of "F" states that the server must not perform the COPY or
+ MOVE operation if the state of the destination resource is non-null.
+ If the overwrite header is not included in a COPY or MOVE request
+ then the resource MUST treat the request as if it has an overwrite
+ header of value "T". While the Overwrite header appears to duplicate
+ the functionality of the If-Match: * header of HTTP/1.1, If-Match
+ applies only to the Request-URI, and not to the Destination of a COPY
+ or MOVE.
+
+ If a COPY or MOVE is not performed due to the value of the Overwrite
+ header, the method MUST fail with a 412 (Precondition Failed) status
+ code.
+
+ All DAV compliant resources MUST support the Overwrite header.
+
+9.7 Status-URI Response Header
+
+ The Status-URI response header may be used with the 102 (Processing)
+ status code to inform the client as to the status of a method.
+
+
+
+Goland, et al. Standards Track [Page 57]
+
+RFC 2518 WEBDAV February 1999
+
+
+ Status-URI = "Status-URI" ":" *(Status-Code Coded-URL) ; Status-Code
+ is defined in 6.1.1 of [RFC2068]
+
+ The URIs listed in the header are source resources which have been
+ affected by the outstanding method. The status code indicates the
+ resolution of the method on the identified resource. So, for
+ example, if a MOVE method on a collection is outstanding and a 102
+ (Processing) response with a Status-URI response header is returned,
+ the included URIs will indicate resources that have had move
+ attempted on them and what the result was.
+
+9.8 Timeout Request Header
+
+ TimeOut = "Timeout" ":" 1#TimeType
+ TimeType = ("Second-" DAVTimeOutVal | "Infinite" | Other)
+ DAVTimeOutVal = 1*digit
+ Other = "Extend" field-value ; See section 4.2 of [RFC2068]
+
+ Clients may include Timeout headers in their LOCK requests. However,
+ the server is not required to honor or even consider these requests.
+ Clients MUST NOT submit a Timeout request header with any method
+ other than a LOCK method.
+
+ A Timeout request header MUST contain at least one TimeType and may
+ contain multiple TimeType entries. The purpose of listing multiple
+ TimeType entries is to indicate multiple different values and value
+ types that are acceptable to the client. The client lists the
+ TimeType entries in order of preference.
+
+ Timeout response values MUST use a Second value, Infinite, or a
+ TimeType the client has indicated familiarity with. The server may
+ assume a client is familiar with any TimeType submitted in a Timeout
+ header.
+
+ The "Second" TimeType specifies the number of seconds that will
+ elapse between granting of the lock at the server, and the automatic
+ removal of the lock. The timeout value for TimeType "Second" MUST
+ NOT be greater than 2^32-1.
+
+ The timeout counter SHOULD be restarted any time an owner of the lock
+ sends a method to any member of the lock, including unsupported
+ methods, or methods which are unsuccessful. However the lock MUST be
+ refreshed if a refresh LOCK method is successfully received.
+
+ If the timeout expires then the lock may be lost. Specifically, if
+ the server wishes to harvest the lock upon time-out, the server
+ SHOULD act as if an UNLOCK method was executed by the server on the
+ resource using the lock token of the timed-out lock, performed with
+
+
+
+Goland, et al. Standards Track [Page 58]
+
+RFC 2518 WEBDAV February 1999
+
+
+ its override authority. Thus logs should be updated with the
+ disposition of the lock, notifications should be sent, etc., just as
+ they would be for an UNLOCK request.
+
+ Servers are advised to pay close attention to the values submitted by
+ clients, as they will be indicative of the type of activity the
+ client intends to perform. For example, an applet running in a
+ browser may need to lock a resource, but because of the instability
+ of the environment within which the applet is running, the applet may
+ be turned off without warning. As a result, the applet is likely to
+ ask for a relatively small timeout value so that if the applet dies,
+ the lock can be quickly harvested. However, a document management
+ system is likely to ask for an extremely long timeout because its
+ user may be planning on going off-line.
+
+ A client MUST NOT assume that just because the time-out has expired
+ the lock has been lost.
+
+10 Status Code Extensions to HTTP/1.1
+
+ The following status codes are added to those defined in HTTP/1.1
+ [RFC2068].
+
+10.1 102 Processing
+
+ The 102 (Processing) status code is an interim response used to
+ inform the client that the server has accepted the complete request,
+ but has not yet completed it. This status code SHOULD only be sent
+ when the server has a reasonable expectation that the request will
+ take significant time to complete. As guidance, if a method is taking
+ longer than 20 seconds (a reasonable, but arbitrary value) to process
+ the server SHOULD return a 102 (Processing) response. The server MUST
+ send a final response after the request has been completed.
+
+ Methods can potentially take a long period of time to process,
+ especially methods that support the Depth header. In such cases the
+ client may time-out the connection while waiting for a response. To
+ prevent this the server may return a 102 (Processing) status code to
+ indicate to the client that the server is still processing the
+ method.
+
+10.2 207 Multi-Status
+
+ The 207 (Multi-Status) status code provides status for multiple
+ independent operations (see section 11 for more information).
+
+
+
+
+
+
+Goland, et al. Standards Track [Page 59]
+
+RFC 2518 WEBDAV February 1999
+
+
+10.3 422 Unprocessable Entity
+
+ The 422 (Unprocessable Entity) status code means the server
+ understands the content type of the request entity (hence a
+ 415(Unsupported Media Type) status code is inappropriate), and the
+ syntax of the request entity is correct (thus a 400 (Bad Request)
+ status code is inappropriate) but was unable to process the contained
+ instructions. For example, this error condition may occur if an XML
+ request body contains well-formed (i.e., syntactically correct), but
+ semantically erroneous XML instructions.
+
+10.4 423 Locked
+
+ The 423 (Locked) status code means the source or destination resource
+ of a method is locked.
+
+10.5 424 Failed Dependency
+
+ The 424 (Failed Dependency) status code means that the method could
+ not be performed on the resource because the requested action
+ depended on another action and that action failed. For example, if a
+ command in a PROPPATCH method fails then, at minimum, the rest of the
+ commands will also fail with 424 (Failed Dependency).
+
+10.6 507 Insufficient Storage
+
+ The 507 (Insufficient Storage) status code means the method could not
+ be performed on the resource because the server is unable to store
+ the representation needed to successfully complete the request. This
+ condition is considered to be temporary. If the request which
+ received this status code was the result of a user action, the
+ request MUST NOT be repeated until it is requested by a separate user
+ action.
+
+11 Multi-Status Response
+
+ The default 207 (Multi-Status) response body is a text/xml or
+ application/xml HTTP entity that contains a single XML element called
+ multistatus, which contains a set of XML elements called response
+ which contain 200, 300, 400, and 500 series status codes generated
+ during the method invocation. 100 series status codes SHOULD NOT be
+ recorded in a response XML element.
+
+
+
+
+
+
+
+
+
+Goland, et al. Standards Track [Page 60]
+
+RFC 2518 WEBDAV February 1999
+
+
+12 XML Element Definitions
+
+ In the section below, the final line of each section gives the
+ element type declaration using the format defined in [REC-XML]. The
+ "Value" field, where present, specifies further restrictions on the
+ allowable contents of the XML element using BNF (i.e., to further
+ restrict the values of a PCDATA element).
+
+12.1 activelock XML Element
+
+ Name: activelock
+ Namespace: DAV:
+ Purpose: Describes a lock on a resource.
+
+ <!ELEMENT activelock (lockscope, locktype, depth, owner?, timeout?,
+ locktoken?) >
+
+12.1.1 depth XML Element
+
+ Name: depth
+ Namespace: DAV:
+ Purpose: The value of the Depth header.
+ Value: "0" | "1" | "infinity"
+
+ <!ELEMENT depth (#PCDATA) >
+
+12.1.2 locktoken XML Element
+
+ Name: locktoken
+ Namespace: DAV:
+ Purpose: The lock token associated with a lock.
+ Description: The href contains one or more opaque lock token URIs
+ which all refer to the same lock (i.e., the OpaqueLockToken-URI
+ production in section 6.4).
+
+ <!ELEMENT locktoken (href+) >
+
+12.1.3 timeout XML Element
+
+ Name: timeout
+ Namespace: DAV:
+ Purpose: The timeout associated with a lock
+ Value: TimeType ;Defined in section 9.8
+
+ <!ELEMENT timeout (#PCDATA) >
+
+
+
+
+
+
+Goland, et al. Standards Track [Page 61]
+
+RFC 2518 WEBDAV February 1999
+
+
+12.2 collection XML Element
+
+ Name: collection
+ Namespace: DAV:
+ Purpose: Identifies the associated resource as a collection. The
+ resourcetype property of a collection resource MUST have this value.
+
+ <!ELEMENT collection EMPTY >
+
+12.3 href XML Element
+
+ Name: href
+ Namespace: DAV:
+ Purpose: Identifies the content of the element as a URI.
+ Value: URI ; See section 3.2.1 of [RFC2068]
+
+ <!ELEMENT href (#PCDATA)>
+
+12.4 link XML Element
+
+ Name: link
+ Namespace: DAV:
+ Purpose: Identifies the property as a link and contains the source
+ and destination of that link.
+ Description: The link XML element is used to provide the sources and
+ destinations of a link. The name of the property containing the link
+ XML element provides the type of the link. Link is a multi-valued
+ element, so multiple links may be used together to indicate multiple
+ links with the same type. The values in the href XML elements inside
+ the src and dst XML elements of the link XML element MUST NOT be
+ rejected if they point to resources which do not exist.
+
+ <!ELEMENT link (src+, dst+) >
+
+12.4.1 dst XML Element
+
+ Name: dst
+ Namespace: DAV:
+ Purpose: Indicates the destination of a link
+ Value: URI
+
+ <!ELEMENT dst (#PCDATA) >
+
+12.4.2 src XML Element
+
+ Name: src
+ Namespace: DAV:
+ Purpose: Indicates the source of a link.
+
+
+
+Goland, et al. Standards Track [Page 62]
+
+RFC 2518 WEBDAV February 1999
+
+
+ Value: URI
+
+ <!ELEMENT src (#PCDATA) >
+
+12.5 lockentry XML Element
+
+ Name: lockentry
+ Namespace: DAV:
+ Purpose: Defines the types of locks that can be used with the
+ resource.
+
+ <!ELEMENT lockentry (lockscope, locktype) >
+
+12.6 lockinfo XML Element
+
+ Name: lockinfo
+ Namespace: DAV:
+ Purpose: The lockinfo XML element is used with a LOCK method to
+ specify the type of lock the client wishes to have created.
+
+ <!ELEMENT lockinfo (lockscope, locktype, owner?) >
+
+12.7 lockscope XML Element
+
+ Name: lockscope
+ Namespace: DAV:
+ Purpose: Specifies whether a lock is an exclusive lock, or a
+ shared lock.
+
+ <!ELEMENT lockscope (exclusive | shared) >
+
+12.7.1 exclusive XML Element
+
+ Name: exclusive
+ Namespace: DAV:
+ Purpose: Specifies an exclusive lock
+
+ <!ELEMENT exclusive EMPTY >
+
+12.7.2 shared XML Element
+
+ Name: shared
+ Namespace: DAV:
+ Purpose: Specifies a shared lock
+
+ <!ELEMENT shared EMPTY >
+
+
+
+
+
+Goland, et al. Standards Track [Page 63]
+
+RFC 2518 WEBDAV February 1999
+
+
+12.8 locktype XML Element
+
+ Name: locktype
+ Namespace: DAV:
+ Purpose: Specifies the access type of a lock. At present, this
+ specification only defines one lock type, the write lock.
+
+ <!ELEMENT locktype (write) >
+
+12.8.1 write XML Element
+
+ Name: write
+ Namespace: DAV:
+ Purpose: Specifies a write lock.
+
+ <!ELEMENT write EMPTY >
+
+12.9 multistatus XML Element
+
+ Name: multistatus
+ Namespace: DAV:
+ Purpose: Contains multiple response messages.
+ Description: The responsedescription at the top level is used to
+ provide a general message describing the overarching nature of the
+ response. If this value is available an application may use it
+ instead of presenting the individual response descriptions contained
+ within the responses.
+
+ <!ELEMENT multistatus (response+, responsedescription?) >
+
+12.9.1 response XML Element
+
+ Name: response
+ Namespace: DAV:
+ Purpose: Holds a single response describing the effect of a
+ method on resource and/or its properties.
+ Description: A particular href MUST NOT appear more than once as the
+ child of a response XML element under a multistatus XML element.
+ This requirement is necessary in order to keep processing costs for a
+ response to linear time. Essentially, this prevents having to search
+ in order to group together all the responses by href. There are,
+ however, no requirements regarding ordering based on href values.
+
+ <!ELEMENT response (href, ((href*, status)|(propstat+)),
+ responsedescription?) >
+
+
+
+
+
+
+Goland, et al. Standards Track [Page 64]
+
+RFC 2518 WEBDAV February 1999
+
+
+12.9.1.1 propstat XML Element
+
+ Name: propstat
+ Namespace: DAV:
+ Purpose: Groups together a prop and status element that is
+ associated with a particular href element.
+ Description: The propstat XML element MUST contain one prop XML
+ element and one status XML element. The contents of the prop XML
+ element MUST only list the names of properties to which the result in
+ the status element applies.
+
+ <!ELEMENT propstat (prop, status, responsedescription?) >
+
+12.9.1.2 status XML Element
+
+ Name: status
+ Namespace: DAV:
+ Purpose: Holds a single HTTP status-line
+ Value: status-line ;status-line defined in [RFC2068]
+
+ <!ELEMENT status (#PCDATA) >
+
+12.9.2 responsedescription XML Element
+
+ Name: responsedescription
+ Namespace: DAV:
+ Purpose: Contains a message that can be displayed to the user
+ explaining the nature of the response.
+ Description: This XML element provides information suitable to be
+ presented to a user.
+
+ <!ELEMENT responsedescription (#PCDATA) >
+
+12.10 owner XML Element
+
+ Name: owner
+ Namespace: DAV:
+ Purpose: Provides information about the principal taking out a
+ lock.
+ Description: The owner XML element provides information sufficient
+ for either directly contacting a principal (such as a telephone
+ number or Email URI), or for discovering the principal (such as the
+ URL of a homepage) who owns a lock.
+
+ <!ELEMENT owner ANY>
+
+
+
+
+
+
+Goland, et al. Standards Track [Page 65]
+
+RFC 2518 WEBDAV February 1999
+
+
+12.11 prop XML element
+
+ Name: prop
+ Namespace: DAV:
+ Purpose: Contains properties related to a resource.
+ Description: The prop XML element is a generic container for
+ properties defined on resources. All elements inside a prop XML
+ element MUST define properties related to the resource. No other
+ elements may be used inside of a prop element.
+
+ <!ELEMENT prop ANY>
+
+12.12 propertybehavior XML element
+
+ Name: propertybehavior Namespace: DAV: Purpose: Specifies
+ how properties are handled during a COPY or MOVE.
+ Description: The propertybehavior XML element specifies how
+ properties are handled during a COPY or MOVE. If this XML element is
+ not included in the request body then the server is expected to act
+ as defined by the default property handling behavior of the
+ associated method. All WebDAV compliant resources MUST support the
+ propertybehavior XML element.
+
+ <!ELEMENT propertybehavior (omit | keepalive) >
+
+12.12.1 keepalive XML element
+
+ Name: keepalive
+ Namespace: DAV:
+ Purpose: Specifies requirements for the copying/moving of live
+ properties.
+ Description: If a list of URIs is included as the value of keepalive
+ then the named properties MUST be "live" after they are copied
+ (moved) to the destination resource of a COPY (or MOVE). If the
+ value "*" is given for the keepalive XML element, this designates
+ that all live properties on the source resource MUST be live on the
+ destination. If the requirements specified by the keepalive element
+ can not be honored then the method MUST fail with a 412 (Precondition
+ Failed). All DAV compliant resources MUST support the keepalive XML
+ element for use with the COPY and MOVE methods.
+ Value: "*" ; #PCDATA value can only be "*"
+
+ <!ELEMENT keepalive (#PCDATA | href+) >
+
+
+
+
+
+
+
+
+Goland, et al. Standards Track [Page 66]
+
+RFC 2518 WEBDAV February 1999
+
+
+12.12.2 omit XML element
+
+ Name: omit
+ Namespace: DAV:
+ Purpose: The omit XML element instructs the server that it should
+ use best effort to copy properties but a failure to copy a property
+ MUST NOT cause the method to fail. Description: The default behavior
+ for a COPY or MOVE is to copy/move all properties or fail the method.
+ In certain circumstances, such as when a server copies a resource
+ over another protocol such as FTP, it may not be possible to
+ copy/move the properties associated with the resource. Thus any
+ attempt to copy/move over FTP would always have to fail because
+ properties could not be moved over, even as dead properties. All DAV
+ compliant resources MUST support the omit XML element on COPY/MOVE
+ methods.
+
+ <!ELEMENT omit EMPTY >
+
+12.13 propertyupdate XML element
+
+ Name: propertyupdate
+ Namespace: DAV:
+ Purpose: Contains a request to alter the properties on a
+ resource.
+ Description: This XML element is a container for the information
+ required to modify the properties on the resource. This XML element
+ is multi-valued.
+
+ <!ELEMENT propertyupdate (remove | set)+ >
+
+12.13.1 remove XML element
+
+ Name: remove
+ Namespace: DAV:
+ Purpose: Lists the DAV properties to be removed from a resource.
+ Description: Remove instructs that the properties specified in prop
+ should be removed. Specifying the removal of a property that does
+ not exist is not an error. All the XML elements in a prop XML
+ element inside of a remove XML element MUST be empty, as only the
+ names of properties to be removed are required.
+
+ <!ELEMENT remove (prop) >
+
+12.13.2 set XML element
+
+ Name: set
+ Namespace: DAV:
+ Purpose: Lists the DAV property values to be set for a resource.
+
+
+
+Goland, et al. Standards Track [Page 67]
+
+RFC 2518 WEBDAV February 1999
+
+
+ Description: The set XML element MUST contain only a prop XML
+ element. The elements contained by the prop XML element inside the
+ set XML element MUST specify the name and value of properties that
+ are set on the resource identified by Request-URI. If a property
+ already exists then its value is replaced. Language tagging
+ information in the property's value (in the "xml:lang" attribute, if
+ present) MUST be persistently stored along with the property, and
+ MUST be subsequently retrievable using PROPFIND.
+
+ <!ELEMENT set (prop) >
+
+12.14 propfind XML Element
+
+ Name: propfind
+ Namespace: DAV:
+ Purpose: Specifies the properties to be returned from a PROPFIND
+ method. Two special elements are specified for use with propfind,
+ allprop and propname. If prop is used inside propfind it MUST only
+ contain property names, not values.
+
+ <!ELEMENT propfind (allprop | propname | prop) >
+
+12.14.1 allprop XML Element
+
+ Name: allprop Namespace: DAV: Purpose: The allprop XML
+ element specifies that all property names and values on the resource
+ are to be returned.
+
+ <!ELEMENT allprop EMPTY >
+
+12.14.2 propname XML Element
+
+ Name: propname Namespace: DAV: Purpose: The propname XML
+ element specifies that only a list of property names on the resource
+ is to be returned.
+
+ <!ELEMENT propname EMPTY >
+
+13 DAV Properties
+
+ For DAV properties, the name of the property is also the same as the
+ name of the XML element that contains its value. In the section
+ below, the final line of each section gives the element type
+ declaration using the format defined in [REC-XML]. The "Value" field,
+ where present, specifies further restrictions on the allowable
+ contents of the XML element using BNF (i.e., to further restrict the
+ values of a PCDATA element).
+
+
+
+
+Goland, et al. Standards Track [Page 68]
+
+RFC 2518 WEBDAV February 1999
+
+
+13.1 creationdate Property
+
+ Name: creationdate
+ Namespace: DAV:
+ Purpose: Records the time and date the resource was created.
+ Value: date-time ; See Appendix 2
+ Description: The creationdate property should be defined on all DAV
+ compliant resources. If present, it contains a timestamp of the
+ moment when the resource was created (i.e., the moment it had non-
+ null state).
+
+ <!ELEMENT creationdate (#PCDATA) >
+
+13.2 displayname Property
+
+ Name: displayname
+ Namespace: DAV:
+ Purpose: Provides a name for the resource that is suitable for
+ presentation to a user.
+ Description: The displayname property should be defined on all DAV
+ compliant resources. If present, the property contains a description
+ of the resource that is suitable for presentation to a user.
+
+ <!ELEMENT displayname (#PCDATA) >
+
+13.3 getcontentlanguage Property
+
+ Name: getcontentlanguage
+ Namespace: DAV:
+ Purpose: Contains the Content-Language header returned by a GET
+ without accept headers
+ Description: The getcontentlanguage property MUST be defined on any
+ DAV compliant resource that returns the Content-Language header on a
+ GET.
+ Value: language-tag ;language-tag is defined in section 14.13
+ of [RFC2068]
+
+ <!ELEMENT getcontentlanguage (#PCDATA) >
+
+13.4 getcontentlength Property
+
+ Name: getcontentlength
+ Namespace: DAV:
+ Purpose: Contains the Content-Length header returned by a GET
+ without accept headers.
+ Description: The getcontentlength property MUST be defined on any
+ DAV compliant resource that returns the Content-Length header in
+ response to a GET.
+
+
+
+Goland, et al. Standards Track [Page 69]
+
+RFC 2518 WEBDAV February 1999
+
+
+ Value: content-length ; see section 14.14 of [RFC2068]
+
+ <!ELEMENT getcontentlength (#PCDATA) >
+
+13.5 getcontenttype Property
+
+ Name: getcontenttype
+ Namespace: DAV:
+ Purpose: Contains the Content-Type header returned by a GET
+ without accept headers.
+ Description: This getcontenttype property MUST be defined on any DAV
+ compliant resource that returns the Content-Type header in response
+ to a GET.
+ Value: media-type ; defined in section 3.7 of [RFC2068]
+
+ <!ELEMENT getcontenttype (#PCDATA) >
+
+13.6 getetag Property
+
+ Name: getetag
+ Namespace: DAV:
+ Purpose: Contains the ETag header returned by a GET without
+ accept headers.
+ Description: The getetag property MUST be defined on any DAV
+ compliant resource that returns the Etag header.
+ Value: entity-tag ; defined in section 3.11 of [RFC2068]
+
+ <!ELEMENT getetag (#PCDATA) >
+
+13.7 getlastmodified Property
+
+ Name: getlastmodified
+ Namespace: DAV:
+ Purpose: Contains the Last-Modified header returned by a GET
+ method without accept headers.
+ Description: Note that the last-modified date on a resource may
+ reflect changes in any part of the state of the resource, not
+ necessarily just a change to the response to the GET method. For
+ example, a change in a property may cause the last-modified date to
+ change. The getlastmodified property MUST be defined on any DAV
+ compliant resource that returns the Last-Modified header in response
+ to a GET.
+ Value: HTTP-date ; defined in section 3.3.1 of [RFC2068]
+
+ <!ELEMENT getlastmodified (#PCDATA) >
+
+
+
+
+
+
+Goland, et al. Standards Track [Page 70]
+
+RFC 2518 WEBDAV February 1999
+
+
+13.8 lockdiscovery Property
+
+ Name: lockdiscovery
+ Namespace: DAV:
+ Purpose: Describes the active locks on a resource
+ Description: The lockdiscovery property returns a listing of who has
+ a lock, what type of lock he has, the timeout type and the time
+ remaining on the timeout, and the associated lock token. The server
+ is free to withhold any or all of this information if the requesting
+ principal does not have sufficient access rights to see the requested
+ data.
+
+ <!ELEMENT lockdiscovery (activelock)* >
+
+13.8.1 Example - Retrieving the lockdiscovery Property
+
+ >>Request
+
+ PROPFIND /container/ HTTP/1.1
+ Host: www.foo.bar
+ Content-Length: xxxx
+ Content-Type: text/xml; charset="utf-8"
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:propfind xmlns:D='DAV:'>
+ <D:prop><D:lockdiscovery/></D:prop>
+ </D:propfind>
+
+ >>Response
+
+ HTTP/1.1 207 Multi-Status
+ Content-Type: text/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:multistatus xmlns:D='DAV:'>
+ <D:response>
+ <D:href>http://www.foo.bar/container/</D:href>
+ <D:propstat>
+ <D:prop>
+ <D:lockdiscovery>
+ <D:activelock>
+ <D:locktype><D:write/></D:locktype>
+ <D:lockscope><D:exclusive/></D:lockscope>
+ <D:depth>0</D:depth>
+ <D:owner>Jane Smith</D:owner>
+ <D:timeout>Infinite</D:timeout>
+ <D:locktoken>
+
+
+
+Goland, et al. Standards Track [Page 71]
+
+RFC 2518 WEBDAV February 1999
+
+
+ <D:href>
+ opaquelocktoken:f81de2ad-7f3d-a1b2-4f3c-00a0c91a9d76
+ </D:href>
+ </D:locktoken>
+ </D:activelock>
+ </D:lockdiscovery>
+ </D:prop>
+ <D:status>HTTP/1.1 200 OK</D:status>
+ </D:propstat>
+ </D:response>
+ </D:multistatus>
+
+ This resource has a single exclusive write lock on it, with an
+ infinite timeout.
+
+13.9 resourcetype Property
+
+ Name: resourcetype
+ Namespace: DAV:
+ Purpose: Specifies the nature of the resource.
+ Description: The resourcetype property MUST be defined on all DAV
+ compliant resources. The default value is empty.
+
+ <!ELEMENT resourcetype ANY >
+
+13.10 source Property
+
+ Name: source
+ Namespace: DAV:
+ Purpose: The destination of the source link identifies the
+ resource that contains the unprocessed source of the link's source.
+ Description: The source of the link (src) is typically the URI of the
+ output resource on which the link is defined, and there is typically
+ only one destination (dst) of the link, which is the URI where the
+ unprocessed source of the resource may be accessed. When more than
+ one link destination exists, this specification asserts no policy on
+ ordering.
+
+ <!ELEMENT source (link)* >
+
+13.10.1 Example - A source Property
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:prop xmlns:D="DAV:" xmlns:F="http://www.foocorp.com/Project/">
+ <D:source>
+ <D:link>
+ <F:projfiles>Source</F:projfiles>
+ <D:src>http://foo.bar/program</D:src>
+
+
+
+Goland, et al. Standards Track [Page 72]
+
+RFC 2518 WEBDAV February 1999
+
+
+ <D:dst>http://foo.bar/src/main.c</D:dst>
+ </D:link>
+ <D:link>
+ <F:projfiles>Library</F:projfiles>
+ <D:src>http://foo.bar/program</D:src>
+ <D:dst>http://foo.bar/src/main.lib</D:dst>
+ </D:link>
+ <D:link>
+ <F:projfiles>Makefile</F:projfiles>
+ <D:src>http://foo.bar/program</D:src>
+ <D:dst>http://foo.bar/src/makefile</D:dst>
+ </D:link>
+ </D:source>
+ </D:prop>
+
+ In this example the resource http://foo.bar/program has a source
+ property that contains three links. Each link contains three
+ elements, two of which, src and dst, are part of the DAV schema
+ defined in this document, and one which is defined by the schema
+ http://www.foocorp.com/project/ (Source, Library, and Makefile). A
+ client which only implements the elements in the DAV spec will not
+ understand the foocorp elements and will ignore them, thus seeing the
+ expected source and destination links. An enhanced client may know
+ about the foocorp elements and be able to present the user with
+ additional information about the links. This example demonstrates
+ the power of XML markup, allowing element values to be enhanced
+ without breaking older clients.
+
+13.11 supportedlock Property
+
+ Name: supportedlock
+ Namespace: DAV:
+ Purpose: To provide a listing of the lock capabilities supported
+ by the resource.
+ Description: The supportedlock property of a resource returns a
+ listing of the combinations of scope and access types which may be
+ specified in a lock request on the resource. Note that the actual
+ contents are themselves controlled by access controls so a server is
+ not required to provide information the client is not authorized to
+ see.
+
+ <!ELEMENT supportedlock (lockentry)* >
+
+13.11.1 Example - Retrieving the supportedlock Property
+
+ >>Request
+
+ PROPFIND /container/ HTTP/1.1
+
+
+
+Goland, et al. Standards Track [Page 73]
+
+RFC 2518 WEBDAV February 1999
+
+
+ Host: www.foo.bar
+ Content-Length: xxxx
+ Content-Type: text/xml; charset="utf-8"
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:propfind xmlns:D="DAV:">
+ <D:prop><D:supportedlock/></D:prop>
+ </D:propfind>
+
+ >>Response
+
+ HTTP/1.1 207 Multi-Status
+ Content-Type: text/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:multistatus xmlns:D="DAV:">
+ <D:response>
+ <D:href>http://www.foo.bar/container/</D:href>
+ <D:propstat>
+ <D:prop>
+ <D:supportedlock>
+ <D:lockentry>
+ <D:lockscope><D:exclusive/></D:lockscope>
+ <D:locktype><D:write/></D:locktype>
+ </D:lockentry>
+ <D:lockentry>
+ <D:lockscope><D:shared/></D:lockscope>
+ <D:locktype><D:write/></D:locktype>
+ </D:lockentry>
+ </D:supportedlock>
+ </D:prop>
+ <D:status>HTTP/1.1 200 OK</D:status>
+ </D:propstat>
+ </D:response>
+ </D:multistatus>
+
+14 Instructions for Processing XML in DAV
+
+ All DAV compliant resources MUST ignore any unknown XML element and
+ all its children encountered while processing a DAV method that uses
+ XML as its command language.
+
+ This restriction also applies to the processing, by clients, of DAV
+ property values where unknown XML elements SHOULD be ignored unless
+ the property's schema declares otherwise.
+
+
+
+
+
+Goland, et al. Standards Track [Page 74]
+
+RFC 2518 WEBDAV February 1999
+
+
+ This restriction does not apply to setting dead DAV properties on the
+ server where the server MUST record unknown XML elements.
+
+ Additionally, this restriction does not apply to the use of XML where
+ XML happens to be the content type of the entity body, for example,
+ when used as the body of a PUT.
+
+ Since XML can be transported as text/xml or application/xml, a DAV
+ server MUST accept DAV method requests with XML parameters
+ transported as either text/xml or application/xml, and DAV client
+ MUST accept XML responses using either text/xml or application/xml.
+
+15 DAV Compliance Classes
+
+ A DAV compliant resource can choose from two classes of compliance.
+ A client can discover the compliance classes of a resource by
+ executing OPTIONS on the resource, and examining the "DAV" header
+ which is returned.
+
+ Since this document describes extensions to the HTTP/1.1 protocol,
+ minimally all DAV compliant resources, clients, and proxies MUST be
+ compliant with [RFC2068].
+
+ Compliance classes are not necessarily sequential. A resource that is
+ class 2 compliant must also be class 1 compliant; but if additional
+ compliance classes are defined later, a resource that is class 1, 2,
+ and 4 compliant might not be class 3 compliant. Also note that
+ identifiers other than numbers may be used as compliance class
+ identifiers.
+
+15.1 Class 1
+
+ A class 1 compliant resource MUST meet all "MUST" requirements in all
+ sections of this document.
+
+ Class 1 compliant resources MUST return, at minimum, the value "1" in
+ the DAV header on all responses to the OPTIONS method.
+
+15.2 Class 2
+
+ A class 2 compliant resource MUST meet all class 1 requirements and
+ support the LOCK method, the supportedlock property, the
+ lockdiscovery property, the Time-Out response header and the Lock-
+ Token request header. A class "2" compliant resource SHOULD also
+ support the Time-Out request header and the owner XML element.
+
+ Class 2 compliant resources MUST return, at minimum, the values "1"
+ and "2" in the DAV header on all responses to the OPTIONS method.
+
+
+
+Goland, et al. Standards Track [Page 75]
+
+RFC 2518 WEBDAV February 1999
+
+
+16 Internationalization Considerations
+
+ In the realm of internationalization, this specification complies
+ with the IETF Character Set Policy [RFC2277]. In this specification,
+ human-readable fields can be found either in the value of a property,
+ or in an error message returned in a response entity body. In both
+ cases, the human-readable content is encoded using XML, which has
+ explicit provisions for character set tagging and encoding, and
+ requires that XML processors read XML elements encoded, at minimum,
+ using the UTF-8 [UTF-8] encoding of the ISO 10646 multilingual plane.
+ XML examples in this specification demonstrate use of the charset
+ parameter of the Content-Type header, as defined in [RFC2376], as
+ well as the XML "encoding" attribute, which together provide charset
+ identification information for MIME and XML processors.
+
+ XML also provides a language tagging capability for specifying the
+ language of the contents of a particular XML element. XML uses
+ either IANA registered language tags (see [RFC1766]) or ISO 639
+ language tags [ISO-639] in the "xml:lang" attribute of an XML element
+ to identify the language of its content and attributes.
+
+ WebDAV applications MUST support the character set tagging, character
+ set encoding, and the language tagging functionality of the XML
+ specification. Implementors of WebDAV applications are strongly
+ encouraged to read "XML Media Types" [RFC2376] for instruction on
+ which MIME media type to use for XML transport, and on use of the
+ charset parameter of the Content-Type header.
+
+ Names used within this specification fall into three categories:
+ names of protocol elements such as methods and headers, names of XML
+ elements, and names of properties. Naming of protocol elements
+ follows the precedent of HTTP, using English names encoded in USASCII
+ for methods and headers. Since these protocol elements are not
+ visible to users, and are in fact simply long token identifiers, they
+ do not need to support encoding in multiple character sets.
+ Similarly, though the names of XML elements used in this
+ specification are English names encoded in UTF-8, these names are not
+ visible to the user, and hence do not need to support multiple
+ character set encodings.
+
+ The name of a property defined on a resource is a URI. Although some
+ applications (e.g., a generic property viewer) will display property
+ URIs directly to their users, it is expected that the typical
+ application will use a fixed set of properties, and will provide a
+ mapping from the property name URI to a human-readable field when
+ displaying the property name to a user. It is only in the case where
+
+
+
+
+
+Goland, et al. Standards Track [Page 76]
+
+RFC 2518 WEBDAV February 1999
+
+
+ the set of properties is not known ahead of time that an application
+ need display a property name URI to a user. We recommend that
+ applications provide human-readable property names wherever feasible.
+
+ For error reporting, we follow the convention of HTTP/1.1 status
+ codes, including with each status code a short, English description
+ of the code (e.g., 423 (Locked)). While the possibility exists that
+ a poorly crafted user agent would display this message to a user,
+ internationalized applications will ignore this message, and display
+ an appropriate message in the user's language and character set.
+
+ Since interoperation of clients and servers does not require locale
+ information, this specification does not specify any mechanism for
+ transmission of this information.
+
+17 Security Considerations
+
+ This section is provided to detail issues concerning security
+ implications of which WebDAV applications need to be aware.
+
+ All of the security considerations of HTTP/1.1 (discussed in
+ [RFC2068]) and XML (discussed in [RFC2376]) also apply to WebDAV. In
+ addition, the security risks inherent in remote authoring require
+ stronger authentication technology, introduce several new privacy
+ concerns, and may increase the hazards from poor server design.
+ These issues are detailed below.
+
+17.1 Authentication of Clients
+
+ Due to their emphasis on authoring, WebDAV servers need to use
+ authentication technology to protect not just access to a network
+ resource, but the integrity of the resource as well. Furthermore,
+ the introduction of locking functionality requires support for
+ authentication.
+
+ A password sent in the clear over an insecure channel is an
+ inadequate means for protecting the accessibility and integrity of a
+ resource as the password may be intercepted. Since Basic
+ authentication for HTTP/1.1 performs essentially clear text
+ transmission of a password, Basic authentication MUST NOT be used to
+ authenticate a WebDAV client to a server unless the connection is
+ secure. Furthermore, a WebDAV server MUST NOT send Basic
+ authentication credentials in a WWW-Authenticate header unless the
+ connection is secure. Examples of secure connections include a
+ Transport Layer Security (TLS) connection employing a strong cipher
+ suite with mutual authentication of client and server, or a
+ connection over a network which is physically secure, for example, an
+ isolated network in a building with restricted access.
+
+
+
+Goland, et al. Standards Track [Page 77]
+
+RFC 2518 WEBDAV February 1999
+
+
+ WebDAV applications MUST support the Digest authentication scheme
+ [RFC2069]. Since Digest authentication verifies that both parties to
+ a communication know a shared secret, a password, without having to
+ send that secret in the clear, Digest authentication avoids the
+ security problems inherent in Basic authentication while providing a
+ level of authentication which is useful in a wide range of scenarios.
+
+17.2 Denial of Service
+
+ Denial of service attacks are of special concern to WebDAV servers.
+ WebDAV plus HTTP enables denial of service attacks on every part of a
+ system's resources.
+
+ The underlying storage can be attacked by PUTting extremely large
+ files.
+
+ Asking for recursive operations on large collections can attack
+ processing time.
+
+ Making multiple pipelined requests on multiple connections can attack
+ network connections.
+
+ WebDAV servers need to be aware of the possibility of a denial of
+ service attack at all levels.
+
+17.3 Security through Obscurity
+
+ WebDAV provides, through the PROPFIND method, a mechanism for listing
+ the member resources of a collection. This greatly diminishes the
+ effectiveness of security or privacy techniques that rely only on the
+ difficulty of discovering the names of network resources. Users of
+ WebDAV servers are encouraged to use access control techniques to
+ prevent unwanted access to resources, rather than depending on the
+ relative obscurity of their resource names.
+
+17.4 Privacy Issues Connected to Locks
+
+ When submitting a lock request a user agent may also submit an owner
+ XML field giving contact information for the person taking out the
+ lock (for those cases where a person, rather than a robot, is taking
+ out the lock). This contact information is stored in a lockdiscovery
+ property on the resource, and can be used by other collaborators to
+ begin negotiation over access to the resource. However, in many
+ cases this contact information can be very private, and should not be
+ widely disseminated. Servers SHOULD limit read access to the
+ lockdiscovery property as appropriate. Furthermore, user agents
+
+
+
+
+
+Goland, et al. Standards Track [Page 78]
+
+RFC 2518 WEBDAV February 1999
+
+
+ SHOULD provide control over whether contact information is sent at
+ all, and if contact information is sent, control over exactly what
+ information is sent.
+
+17.5 Privacy Issues Connected to Properties
+
+ Since property values are typically used to hold information such as
+ the author of a document, there is the possibility that privacy
+ concerns could arise stemming from widespread access to a resource's
+ property data. To reduce the risk of inadvertent release of private
+ information via properties, servers are encouraged to develop access
+ control mechanisms that separate read access to the resource body and
+ read access to the resource's properties. This allows a user to
+ control the dissemination of their property data without overly
+ restricting access to the resource's contents.
+
+17.6 Reduction of Security due to Source Link
+
+ HTTP/1.1 warns against providing read access to script code because
+ it may contain sensitive information. Yet WebDAV, via its source
+ link facility, can potentially provide a URI for script resources so
+ they may be authored. For HTTP/1.1, a server could reasonably
+ prevent access to source resources due to the predominance of read-
+ only access. WebDAV, with its emphasis on authoring, encourages read
+ and write access to source resources, and provides the source link
+ facility to identify the source. This reduces the security benefits
+ of eliminating access to source resources. Users and administrators
+ of WebDAV servers should be very cautious when allowing remote
+ authoring of scripts, limiting read and write access to the source
+ resources to authorized principals.
+
+17.7 Implications of XML External Entities
+
+ XML supports a facility known as "external entities", defined in
+ section 4.2.2 of [REC-XML], which instruct an XML processor to
+ retrieve and perform an inline include of XML located at a particular
+ URI. An external XML entity can be used to append or modify the
+ document type declaration (DTD) associated with an XML document. An
+ external XML entity can also be used to include XML within the
+ content of an XML document. For non-validating XML, such as the XML
+ used in this specification, including an external XML entity is not
+ required by [REC-XML]. However, [REC-XML] does state that an XML
+ processor may, at its discretion, include the external XML entity.
+
+ External XML entities have no inherent trustworthiness and are
+ subject to all the attacks that are endemic to any HTTP GET request.
+ Furthermore, it is possible for an external XML entity to modify the
+ DTD, and hence affect the final form of an XML document, in the worst
+
+
+
+Goland, et al. Standards Track [Page 79]
+
+RFC 2518 WEBDAV February 1999
+
+
+ case significantly modifying its semantics, or exposing the XML
+ processor to the security risks discussed in [RFC2376]. Therefore,
+ implementers must be aware that external XML entities should be
+ treated as untrustworthy.
+
+ There is also the scalability risk that would accompany a widely
+ deployed application which made use of external XML entities. In
+ this situation, it is possible that there would be significant
+ numbers of requests for one external XML entity, potentially
+ overloading any server which fields requests for the resource
+ containing the external XML entity.
+
+17.8 Risks Connected with Lock Tokens
+
+ This specification, in section 6.4, requires the use of Universal
+ Unique Identifiers (UUIDs) for lock tokens, in order to guarantee
+ their uniqueness across space and time. UUIDs, as defined in [ISO-
+ 11578], contain a "node" field which "consists of the IEEE address,
+ usually the host address. For systems with multiple IEEE 802 nodes,
+ any available node address can be used." Since a WebDAV server will
+ issue many locks over its lifetime, the implication is that it will
+ also be publicly exposing its IEEE 802 address.
+
+ There are several risks associated with exposure of IEEE 802
+ addresses. Using the IEEE 802 address:
+
+ * It is possible to track the movement of hardware from subnet to
+ subnet.
+
+ * It may be possible to identify the manufacturer of the hardware
+ running a WebDAV server.
+
+ * It may be possible to determine the number of each type of computer
+ running WebDAV.
+
+ Section 6.4.1 of this specification details an alternate mechanism
+ for generating the "node" field of a UUID without using an IEEE 802
+ address, which alleviates the risks associated with exposure of IEEE
+ 802 addresses by using an alternate source of uniqueness.
+
+18 IANA Considerations
+
+ This document defines two namespaces, the namespace of property
+ names, and the namespace of WebDAV-specific XML elements used within
+ property values.
+
+
+
+
+
+
+Goland, et al. Standards Track [Page 80]
+
+RFC 2518 WEBDAV February 1999
+
+
+ URIs are used for both names, for several reasons. Assignment of a
+ URI does not require a request to a central naming authority, and
+ hence allow WebDAV property names and XML elements to be quickly
+ defined by any WebDAV user or application. URIs also provide a
+ unique address space, ensuring that the distributed users of WebDAV
+ will not have collisions among the property names and XML elements
+ they create.
+
+ This specification defines a distinguished set of property names and
+ XML elements that are understood by all WebDAV applications. The
+ property names and XML elements in this specification are all derived
+ from the base URI DAV: by adding a suffix to this URI, for example,
+ DAV:creationdate for the "creationdate" property.
+
+ This specification also defines a URI scheme for the encoding of lock
+ tokens, the opaquelocktoken URI scheme described in section 6.4.
+
+ To ensure correct interoperation based on this specification, IANA
+ must reserve the URI namespaces starting with "DAV:" and with
+ "opaquelocktoken:" for use by this specification, its revisions, and
+ related WebDAV specifications.
+
+19 Intellectual Property
+
+ The following notice is copied from RFC 2026 [RFC2026], section 10.4,
+ and describes the position of the IETF concerning intellectual
+ property claims made against this document.
+
+ The IETF takes no position regarding the validity or scope of any
+ intellectual property or other rights that might be claimed to
+ pertain to the implementation or use other technology described in
+ this document or the extent to which any license under such rights
+ might or might not be available; neither does it represent that it
+ has made any effort to identify any such rights. Information on the
+ IETF's procedures with respect to rights in standards-track and
+ standards-related documentation can be found in BCP-11. Copies of
+ claims of rights made available for publication and any assurances of
+ licenses to be made available, or the result of an attempt made to
+ obtain a general license or permission for the use of such
+ proprietary rights by implementors or users of this specification can
+ be obtained from the IETF Secretariat.
+
+ The IETF invites any interested party to bring to its attention any
+ copyrights, patents or patent applications, or other proprietary
+ rights which may cover technology that may be required to practice
+ this standard. Please address the information to the IETF Executive
+ Director.
+
+
+
+
+Goland, et al. Standards Track [Page 81]
+
+RFC 2518 WEBDAV February 1999
+
+
+20 Acknowledgements
+
+ A specification such as this thrives on piercing critical review and
+ withers from apathetic neglect. The authors gratefully acknowledge
+ the contributions of the following people, whose insights were so
+ valuable at every stage of our work.
+
+ Terry Allen, Harald Alvestrand, Jim Amsden, Becky Anderson, Alan
+ Babich, Sanford Barr, Dylan Barrell, Bernard Chester, Tim Berners-
+ Lee, Dan Connolly, Jim Cunningham, Ron Daniel, Jr., Jim Davis, Keith
+ Dawson, Mark Day, Brian Deen, Martin Duerst, David Durand, Lee
+ Farrell, Chuck Fay, Wesley Felter, Roy Fielding, Mark Fisher, Alan
+ Freier, George Florentine, Jim Gettys, Phill Hallam-Baker, Dennis
+ Hamilton, Steve Henning, Mead Himelstein, Alex Hopmann, Andre van der
+ Hoek, Ben Laurie, Paul Leach, Ora Lassila, Karen MacArthur, Steven
+ Martin, Larry Masinter, Michael Mealling, Keith Moore, Thomas Narten,
+ Henrik Nielsen, Kenji Ota, Bob Parker, Glenn Peterson, Jon Radoff,
+ Saveen Reddy, Henry Sanders, Christopher Seiwald, Judith Slein, Mike
+ Spreitzer, Einar Stefferud, Greg Stein, Ralph Swick, Kenji Takahashi,
+ Richard N. Taylor, Robert Thau, John Turner, Sankar Virdhagriswaran,
+ Fabio Vitali, Gregory Woodhouse, and Lauren Wood.
+
+ Two from this list deserve special mention. The contributions by
+ Larry Masinter have been invaluable, both in helping the formation of
+ the working group and in patiently coaching the authors along the
+ way. In so many ways he has set high standards we have toiled to
+ meet. The contributions of Judith Slein in clarifying the
+ requirements, and in patiently reviewing draft after draft, both
+ improved this specification and expanded our minds on document
+ management.
+
+ We would also like to thank John Turner for developing the XML DTD.
+
+21 References
+
+21.1 Normative References
+
+ [RFC1766] Alvestrand, H., "Tags for the Identification of
+ Languages", RFC 1766, March 1995.
+
+ [RFC2277] Alvestrand, H., "IETF Policy on Character Sets and
+ Languages", BCP 18, RFC 2277, January 1998.
+
+ [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
+ Requirement Levels", BCP 14, RFC 2119, March 1997.
+
+
+
+
+
+
+Goland, et al. Standards Track [Page 82]
+
+RFC 2518 WEBDAV February 1999
+
+
+ [RFC2396] Berners-Lee, T., Fielding, R. and L. Masinter,
+ "Uniform Resource Identifiers (URI): Generic Syntax",
+ RFC 2396, August 1998.
+
+ [REC-XML] T. Bray, J. Paoli, C. M. Sperberg-McQueen,
+ "Extensible Markup Language (XML)." World Wide Web
+ Consortium Recommendation REC-xml-19980210.
+ http://www.w3.org/TR/1998/REC-xml-19980210.
+
+ [REC-XML-NAMES] T. Bray, D. Hollander, A. Layman, "Namespaces in
+ XML". World Wide Web Consortium Recommendation REC-
+ xml-names-19990114. http://www.w3.org/TR/1999/REC-
+ xml-names-19990114/
+
+ [RFC2069] Franks, J., Hallam-Baker, P., Hostetler, J., Leach,
+ P, Luotonen, A., Sink, E. and L. Stewart, "An
+ Extension to HTTP : Digest Access Authentication",
+ RFC 2069, January 1997.
+
+ [RFC2068] Fielding, R., Gettys, J., Mogul, J., Frystyk, H. and
+ T. Berners-Lee, "Hypertext Transfer Protocol --
+ HTTP/1.1", RFC 2068, January 1997.
+
+ [ISO-639] ISO (International Organization for Standardization).
+ ISO 639:1988. "Code for the representation of names
+ of languages."
+
+ [ISO-8601] ISO (International Organization for Standardization).
+ ISO 8601:1988. "Data elements and interchange formats
+ - Information interchange - Representation of dates
+ and times."
+
+ [ISO-11578] ISO (International Organization for Standardization).
+ ISO/IEC 11578:1996. "Information technology - Open
+ Systems Interconnection - Remote Procedure Call
+ (RPC)"
+
+ [RFC2141] Moats, R., "URN Syntax", RFC 2141, May 1997.
+
+ [UTF-8] Yergeau, F., "UTF-8, a transformation format of
+ Unicode and ISO 10646", RFC 2279, January 1998.
+
+21.2 Informational References
+
+ [RFC2026] Bradner, S., "The Internet Standards Process - Revision
+ 3", BCP 9, RFC 2026, October 1996.
+
+
+
+
+
+Goland, et al. Standards Track [Page 83]
+
+RFC 2518 WEBDAV February 1999
+
+
+ [RFC1807] Lasher, R. and D. Cohen, "A Format for Bibliographic
+ Records", RFC 1807, June 1995.
+
+ [WF] C. Lagoze, "The Warwick Framework: A Container
+ Architecture for Diverse Sets of Metadata", D-Lib
+ Magazine, July/August 1996.
+ http://www.dlib.org/dlib/july96/lagoze/07lagoze.html
+
+ [USMARC] Network Development and MARC Standards, Office, ed. 1994.
+ "USMARC Format for Bibliographic Data", 1994. Washington,
+ DC: Cataloging Distribution Service, Library of Congress.
+
+ [REC-PICS] J. Miller, T. Krauskopf, P. Resnick, W. Treese, "PICS
+ Label Distribution Label Syntax and Communication
+ Protocols" Version 1.1, World Wide Web Consortium
+ Recommendation REC-PICS-labels-961031.
+ http://www.w3.org/pub/WWW/TR/REC-PICS-labels-961031.html.
+
+ [RFC2291] Slein, J., Vitali, F., Whitehead, E. and D. Durand,
+ "Requirements for Distributed Authoring and Versioning
+ Protocol for the World Wide Web", RFC 2291, February 1998.
+
+ [RFC2413] Weibel, S., Kunze, J., Lagoze, C. and M. Wolf, "Dublin
+ Core Metadata for Resource Discovery", RFC 2413, September
+ 1998.
+
+ [RFC2376] Whitehead, E. and M. Murata, "XML Media Types", RFC 2376,
+ July 1998.
+
+22 Authors' Addresses
+
+ Y. Y. Goland
+ Microsoft Corporation
+ One Microsoft Way
+ Redmond, WA 98052-6399
+
+ EMail: yarong@microsoft.com
+
+
+ E. J. Whitehead, Jr.
+ Dept. Of Information and Computer Science
+ University of California, Irvine
+ Irvine, CA 92697-3425
+
+ EMail: ejw@ics.uci.edu
+
+
+
+
+
+
+Goland, et al. Standards Track [Page 84]
+
+RFC 2518 WEBDAV February 1999
+
+
+ A. Faizi
+ Netscape
+ 685 East Middlefield Road
+ Mountain View, CA 94043
+
+ EMail: asad@netscape.com
+
+
+ S. R. Carter
+ Novell
+ 1555 N. Technology Way
+ M/S ORM F111
+ Orem, UT 84097-2399
+
+ EMail: srcarter@novell.com
+
+
+ D. Jensen
+ Novell
+ 1555 N. Technology Way
+ M/S ORM F111
+ Orem, UT 84097-2399
+
+ EMail: dcjensen@novell.com
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Goland, et al. Standards Track [Page 85]
+
+RFC 2518 WEBDAV February 1999
+
+
+23 Appendices
+
+23.1 Appendix 1 - WebDAV Document Type Definition
+
+ This section provides a document type definition, following the rules
+ in [REC-XML], for the XML elements used in the protocol stream and in
+ the values of properties. It collects the element definitions given
+ in sections 12 and 13.
+
+ <!DOCTYPE webdav-1.0 [
+
+ <!--============ XML Elements from Section 12 ==================-->
+
+ <!ELEMENT activelock (lockscope, locktype, depth, owner?, timeout?,
+ locktoken?) >
+
+ <!ELEMENT lockentry (lockscope, locktype) >
+ <!ELEMENT lockinfo (lockscope, locktype, owner?) >
+
+ <!ELEMENT locktype (write) >
+ <!ELEMENT write EMPTY >
+
+ <!ELEMENT lockscope (exclusive | shared) >
+ <!ELEMENT exclusive EMPTY >
+ <!ELEMENT shared EMPTY >
+
+ <!ELEMENT depth (#PCDATA) >
+
+ <!ELEMENT owner ANY >
+
+ <!ELEMENT timeout (#PCDATA) >
+
+ <!ELEMENT locktoken (href+) >
+
+ <!ELEMENT href (#PCDATA) >
+
+ <!ELEMENT link (src+, dst+) >
+ <!ELEMENT dst (#PCDATA) >
+ <!ELEMENT src (#PCDATA) >
+
+ <!ELEMENT multistatus (response+, responsedescription?) >
+
+ <!ELEMENT response (href, ((href*, status)|(propstat+)),
+ responsedescription?) >
+ <!ELEMENT status (#PCDATA) >
+ <!ELEMENT propstat (prop, status, responsedescription?) >
+ <!ELEMENT responsedescription (#PCDATA) >
+
+
+
+
+Goland, et al. Standards Track [Page 86]
+
+RFC 2518 WEBDAV February 1999
+
+
+ <!ELEMENT prop ANY >
+
+ <!ELEMENT propertybehavior (omit | keepalive) >
+ <!ELEMENT omit EMPTY >
+
+ <!ELEMENT keepalive (#PCDATA | href+) >
+
+ <!ELEMENT propertyupdate (remove | set)+ >
+ <!ELEMENT remove (prop) >
+ <!ELEMENT set (prop) >
+
+ <!ELEMENT propfind (allprop | propname | prop) >
+ <!ELEMENT allprop EMPTY >
+ <!ELEMENT propname EMPTY >
+
+ <!ELEMENT collection EMPTY >
+
+ <!--=========== Property Elements from Section 13 ===============-->
+ <!ELEMENT creationdate (#PCDATA) >
+ <!ELEMENT displayname (#PCDATA) >
+ <!ELEMENT getcontentlanguage (#PCDATA) >
+ <!ELEMENT getcontentlength (#PCDATA) >
+ <!ELEMENT getcontenttype (#PCDATA) >
+ <!ELEMENT getetag (#PCDATA) >
+ <!ELEMENT getlastmodified (#PCDATA) >
+ <!ELEMENT lockdiscovery (activelock)* >
+ <!ELEMENT resourcetype ANY >
+ <!ELEMENT source (link)* >
+ <!ELEMENT supportedlock (lockentry)* >
+ ]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Goland, et al. Standards Track [Page 87]
+
+RFC 2518 WEBDAV February 1999
+
+
+23.2 Appendix 2 - ISO 8601 Date and Time Profile
+
+ The creationdate property specifies the use of the ISO 8601 date
+ format [ISO-8601]. This section defines a profile of the ISO 8601
+ date format for use with this specification. This profile is quoted
+ from an Internet-Draft by Chris Newman, and is mentioned here to
+ properly attribute his work.
+
+ date-time = full-date "T" full-time
+
+ full-date = date-fullyear "-" date-month "-" date-mday
+ full-time = partial-time time-offset
+
+ date-fullyear = 4DIGIT
+ date-month = 2DIGIT ; 01-12
+ date-mday = 2DIGIT ; 01-28, 01-29, 01-30, 01-31 based on
+ month/year
+ time-hour = 2DIGIT ; 00-23
+ time-minute = 2DIGIT ; 00-59
+ time-second = 2DIGIT ; 00-59, 00-60 based on leap second rules
+ time-secfrac = "." 1*DIGIT
+ time-numoffset = ("+" / "-") time-hour ":" time-minute
+ time-offset = "Z" / time-numoffset
+
+ partial-time = time-hour ":" time-minute ":" time-second
+ [time-secfrac]
+
+ Numeric offsets are calculated as local time minus UTC (Coordinated
+ Universal Time). So the equivalent time in UTC can be determined by
+ subtracting the offset from the local time. For example, 18:50:00-
+ 04:00 is the same time as 22:58:00Z.
+
+ If the time in UTC is known, but the offset to local time is unknown,
+ this can be represented with an offset of "-00:00". This differs
+ from an offset of "Z" which implies that UTC is the preferred
+ reference point for the specified time.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Goland, et al. Standards Track [Page 88]
+
+RFC 2518 WEBDAV February 1999
+
+
+23.3 Appendix 3 - Notes on Processing XML Elements
+
+23.3.1 Notes on Empty XML Elements
+
+ XML supports two mechanisms for indicating that an XML element does
+ not have any content. The first is to declare an XML element of the
+ form <A></A>. The second is to declare an XML element of the form
+ <A/>. The two XML elements are semantically identical.
+
+ It is a violation of the XML specification to use the <A></A> form if
+ the associated DTD declares the element to be EMPTY (e.g., <!ELEMENT
+ A EMPTY>). If such a statement is included, then the empty element
+ format, <A/> must be used. If the element is not declared to be
+ EMPTY, then either form <A></A> or <A/> may be used for empty
+ elements.
+
+ 23.3.2 Notes on Illegal XML Processing
+
+ XML is a flexible data format that makes it easy to submit data that
+ appears legal but in fact is not. The philosophy of "Be flexible in
+ what you accept and strict in what you send" still applies, but it
+ must not be applied inappropriately. XML is extremely flexible in
+ dealing with issues of white space, element ordering, inserting new
+ elements, etc. This flexibility does not require extension,
+ especially not in the area of the meaning of elements.
+
+ There is no kindness in accepting illegal combinations of XML
+ elements. At best it will cause an unwanted result and at worst it
+ can cause real damage.
+
+23.3.2.1 Example - XML Syntax Error
+
+ The following request body for a PROPFIND method is illegal.
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:propfind xmlns:D="DAV:">
+ <D:allprop/>
+ <D:propname/>
+ </D:propfind>
+
+ The definition of the propfind element only allows for the allprop or
+ the propname element, not both. Thus the above is an error and must
+ be responded to with a 400 (Bad Request).
+
+
+
+
+
+
+
+
+Goland, et al. Standards Track [Page 89]
+
+RFC 2518 WEBDAV February 1999
+
+
+ Imagine, however, that a server wanted to be "kind" and decided to
+ pick the allprop element as the true element and respond to it. A
+ client running over a bandwidth limited line who intended to execute
+ a propname would be in for a big surprise if the server treated the
+ command as an allprop.
+
+ Additionally, if a server were lenient and decided to reply to this
+ request, the results would vary randomly from server to server, with
+ some servers executing the allprop directive, and others executing
+ the propname directive. This reduces interoperability rather than
+ increasing it.
+
+23.3.2.2 Example - Unknown XML Element
+
+ The previous example was illegal because it contained two elements
+ that were explicitly banned from appearing together in the propfind
+ element. However, XML is an extensible language, so one can imagine
+ new elements being defined for use with propfind. Below is the
+ request body of a PROPFIND and, like the previous example, must be
+ rejected with a 400 (Bad Request) by a server that does not
+ understand the expired-props element.
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:propfind xmlns:D="DAV:"
+ xmlns:E="http://www.foo.bar/standards/props/">
+ <E:expired-props/>
+ </D:propfind>
+
+ To understand why a 400 (Bad Request) is returned let us look at the
+ request body as the server unfamiliar with expired-props sees it.
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:propfind xmlns:D="DAV:"
+ xmlns:E="http://www.foo.bar/standards/props/">
+ </D:propfind>
+
+ As the server does not understand the expired-props element,
+ according to the WebDAV-specific XML processing rules specified in
+ section 14, it must ignore it. Thus the server sees an empty
+ propfind, which by the definition of the propfind element is illegal.
+
+ Please note that had the extension been additive it would not
+ necessarily have resulted in a 400 (Bad Request). For example,
+ imagine the following request body for a PROPFIND:
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:propfind xmlns:D="DAV:"
+ xmlns:E="http://www.foo.bar/standards/props/">
+
+
+
+Goland, et al. Standards Track [Page 90]
+
+RFC 2518 WEBDAV February 1999
+
+
+ <D:propname/>
+ <E:leave-out>*boss*</E:leave-out>
+ </D:propfind>
+
+ The previous example contains the fictitious element leave-out. Its
+ purpose is to prevent the return of any property whose name matches
+ the submitted pattern. If the previous example were submitted to a
+ server unfamiliar with leave-out, the only result would be that the
+ leave-out element would be ignored and a propname would be executed.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Goland, et al. Standards Track [Page 91]
+
+RFC 2518 WEBDAV February 1999
+
+
+23.4 Appendix 4 -- XML Namespaces for WebDAV
+
+23.4.1 Introduction
+
+ All DAV compliant systems MUST support the XML namespace extensions
+ as specified in [REC-XML-NAMES].
+
+23.4.2 Meaning of Qualified Names
+
+ [Note to the reader: This section does not appear in [REC-XML-NAMES],
+ but is necessary to avoid ambiguity for WebDAV XML processors.]
+
+ WebDAV compliant XML processors MUST interpret a qualified name as a
+ URI constructed by appending the LocalPart to the namespace name URI.
+
+ Example
+
+ <del:glider xmlns:del="http://www.del.jensen.org/">
+ <del:glidername>
+ Johnny Updraft
+ </del:glidername>
+ <del:glideraccidents/>
+ </del:glider>
+
+ In this example, the qualified element name "del:glider" is
+ interpreted as the URL "http://www.del.jensen.org/glider".
+
+ <bar:glider xmlns:del="http://www.del.jensen.org/">
+ <bar:glidername>
+ Johnny Updraft
+ </bar:glidername>
+ <bar:glideraccidents/>
+ </bar:glider>
+
+ Even though this example is syntactically different from the previous
+ example, it is semantically identical. Each instance of the
+ namespace name "bar" is replaced with "http://www.del.jensen.org/"
+ and then appended to the local name for each element tag. The
+ resulting tag names in this example are exactly the same as for the
+ previous example.
+
+ <foo:r xmlns:foo="http://www.del.jensen.org/glide">
+ <foo:rname>
+ Johnny Updraft
+ </foo:rname>
+ <foo:raccidents/>
+ </foo:r>
+
+
+
+
+Goland, et al. Standards Track [Page 92]
+
+RFC 2518 WEBDAV February 1999
+
+
+ This example is semantically identical to the two previous ones.
+ Each instance of the namespace name "foo" is replaced with
+ "http://www.del.jensen.org/glide" which is then appended to the local
+ name for each element tag, the resulting tag names are identical to
+ those in the previous examples.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Goland, et al. Standards Track [Page 93]
+
+RFC 2518 WEBDAV February 1999
+
+
+24. Full Copyright Statement
+
+ Copyright (C) The Internet Society (1999). All Rights Reserved.
+
+ This document and translations of it may be copied and furnished to
+ others, and derivative works that comment on or otherwise explain it
+ or assist in its implementation may be prepared, copied, published
+ and distributed, in whole or in part, without restriction of any
+ kind, provided that the above copyright notice and this paragraph are
+ included on all such copies and derivative works. However, this
+ document itself may not be modified in any way, such as by removing
+ the copyright notice or references to the Internet Society or other
+ Internet organizations, except as needed for the purpose of
+ developing Internet standards in which case the procedures for
+ copyrights defined in the Internet Standards process must be
+ followed, or as required to translate it into languages other than
+ English.
+
+ The limited permissions granted above are perpetual and will not be
+ revoked by the Internet Society or its successors or assigns.
+
+ This document and the information contained herein is provided on an
+ "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING
+ TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING
+ BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION
+ HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF
+ MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Goland, et al. Standards Track [Page 94]
+
diff --git a/vendor/sabre/dav/docs/rfc2616.txt b/vendor/sabre/dav/docs/rfc2616.txt
new file mode 100644
index 000000000..45d7d08b8
--- /dev/null
+++ b/vendor/sabre/dav/docs/rfc2616.txt
@@ -0,0 +1,9859 @@
+
+
+
+
+
+
+Network Working Group R. Fielding
+Request for Comments: 2616 UC Irvine
+Obsoletes: 2068 J. Gettys
+Category: Standards Track Compaq/W3C
+ J. Mogul
+ Compaq
+ H. Frystyk
+ W3C/MIT
+ L. Masinter
+ Xerox
+ P. Leach
+ Microsoft
+ T. Berners-Lee
+ W3C/MIT
+ June 1999
+
+
+ Hypertext Transfer Protocol -- HTTP/1.1
+
+Status of this Memo
+
+ This document specifies an Internet standards track protocol for the
+ Internet community, and requests discussion and suggestions for
+ improvements. Please refer to the current edition of the "Internet
+ Official Protocol Standards" (STD 1) for the standardization state
+ and status of this protocol. Distribution of this memo is unlimited.
+
+Copyright Notice
+
+ Copyright (C) The Internet Society (1999). All Rights Reserved.
+
+Abstract
+
+ The Hypertext Transfer Protocol (HTTP) is an application-level
+ protocol for distributed, collaborative, hypermedia information
+ systems. It is a generic, stateless, protocol which can be used for
+ many tasks beyond its use for hypertext, such as name servers and
+ distributed object management systems, through extension of its
+ request methods, error codes and headers [47]. A feature of HTTP is
+ the typing and negotiation of data representation, allowing systems
+ to be built independently of the data being transferred.
+
+ HTTP has been in use by the World-Wide Web global information
+ initiative since 1990. This specification defines the protocol
+ referred to as "HTTP/1.1", and is an update to RFC 2068 [33].
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 1]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+Table of Contents
+
+ 1 Introduction ...................................................7
+ 1.1 Purpose......................................................7
+ 1.2 Requirements .................................................8
+ 1.3 Terminology ..................................................8
+ 1.4 Overall Operation ...........................................12
+ 2 Notational Conventions and Generic Grammar ....................14
+ 2.1 Augmented BNF ...............................................14
+ 2.2 Basic Rules .................................................15
+ 3 Protocol Parameters ...........................................17
+ 3.1 HTTP Version ................................................17
+ 3.2 Uniform Resource Identifiers ................................18
+ 3.2.1 General Syntax ...........................................19
+ 3.2.2 http URL .................................................19
+ 3.2.3 URI Comparison ...........................................20
+ 3.3 Date/Time Formats ...........................................20
+ 3.3.1 Full Date ................................................20
+ 3.3.2 Delta Seconds ............................................21
+ 3.4 Character Sets ..............................................21
+ 3.4.1 Missing Charset ..........................................22
+ 3.5 Content Codings .............................................23
+ 3.6 Transfer Codings ............................................24
+ 3.6.1 Chunked Transfer Coding ..................................25
+ 3.7 Media Types .................................................26
+ 3.7.1 Canonicalization and Text Defaults .......................27
+ 3.7.2 Multipart Types ..........................................27
+ 3.8 Product Tokens ..............................................28
+ 3.9 Quality Values ..............................................29
+ 3.10 Language Tags ...............................................29
+ 3.11 Entity Tags .................................................30
+ 3.12 Range Units .................................................30
+ 4 HTTP Message ..................................................31
+ 4.1 Message Types ...............................................31
+ 4.2 Message Headers .............................................31
+ 4.3 Message Body ................................................32
+ 4.4 Message Length ..............................................33
+ 4.5 General Header Fields .......................................34
+ 5 Request .......................................................35
+ 5.1 Request-Line ................................................35
+ 5.1.1 Method ...................................................36
+ 5.1.2 Request-URI ..............................................36
+ 5.2 The Resource Identified by a Request ........................38
+ 5.3 Request Header Fields .......................................38
+ 6 Response ......................................................39
+ 6.1 Status-Line .................................................39
+ 6.1.1 Status Code and Reason Phrase ............................39
+ 6.2 Response Header Fields ......................................41
+
+
+
+Fielding, et al. Standards Track [Page 2]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ 7 Entity ........................................................42
+ 7.1 Entity Header Fields ........................................42
+ 7.2 Entity Body .................................................43
+ 7.2.1 Type .....................................................43
+ 7.2.2 Entity Length ............................................43
+ 8 Connections ...................................................44
+ 8.1 Persistent Connections ......................................44
+ 8.1.1 Purpose ..................................................44
+ 8.1.2 Overall Operation ........................................45
+ 8.1.3 Proxy Servers ............................................46
+ 8.1.4 Practical Considerations .................................46
+ 8.2 Message Transmission Requirements ...........................47
+ 8.2.1 Persistent Connections and Flow Control ..................47
+ 8.2.2 Monitoring Connections for Error Status Messages .........48
+ 8.2.3 Use of the 100 (Continue) Status .........................48
+ 8.2.4 Client Behavior if Server Prematurely Closes Connection ..50
+ 9 Method Definitions ............................................51
+ 9.1 Safe and Idempotent Methods .................................51
+ 9.1.1 Safe Methods .............................................51
+ 9.1.2 Idempotent Methods .......................................51
+ 9.2 OPTIONS .....................................................52
+ 9.3 GET .........................................................53
+ 9.4 HEAD ........................................................54
+ 9.5 POST ........................................................54
+ 9.6 PUT .........................................................55
+ 9.7 DELETE ......................................................56
+ 9.8 TRACE .......................................................56
+ 9.9 CONNECT .....................................................57
+ 10 Status Code Definitions ......................................57
+ 10.1 Informational 1xx ...........................................57
+ 10.1.1 100 Continue .............................................58
+ 10.1.2 101 Switching Protocols ..................................58
+ 10.2 Successful 2xx ..............................................58
+ 10.2.1 200 OK ...................................................58
+ 10.2.2 201 Created ..............................................59
+ 10.2.3 202 Accepted .............................................59
+ 10.2.4 203 Non-Authoritative Information ........................59
+ 10.2.5 204 No Content ...........................................60
+ 10.2.6 205 Reset Content ........................................60
+ 10.2.7 206 Partial Content ......................................60
+ 10.3 Redirection 3xx .............................................61
+ 10.3.1 300 Multiple Choices .....................................61
+ 10.3.2 301 Moved Permanently ....................................62
+ 10.3.3 302 Found ................................................62
+ 10.3.4 303 See Other ............................................63
+ 10.3.5 304 Not Modified .........................................63
+ 10.3.6 305 Use Proxy ............................................64
+ 10.3.7 306 (Unused) .............................................64
+
+
+
+Fielding, et al. Standards Track [Page 3]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ 10.3.8 307 Temporary Redirect ...................................65
+ 10.4 Client Error 4xx ............................................65
+ 10.4.1 400 Bad Request .........................................65
+ 10.4.2 401 Unauthorized ........................................66
+ 10.4.3 402 Payment Required ....................................66
+ 10.4.4 403 Forbidden ...........................................66
+ 10.4.5 404 Not Found ...........................................66
+ 10.4.6 405 Method Not Allowed ..................................66
+ 10.4.7 406 Not Acceptable ......................................67
+ 10.4.8 407 Proxy Authentication Required .......................67
+ 10.4.9 408 Request Timeout .....................................67
+ 10.4.10 409 Conflict ............................................67
+ 10.4.11 410 Gone ................................................68
+ 10.4.12 411 Length Required .....................................68
+ 10.4.13 412 Precondition Failed .................................68
+ 10.4.14 413 Request Entity Too Large ............................69
+ 10.4.15 414 Request-URI Too Long ................................69
+ 10.4.16 415 Unsupported Media Type ..............................69
+ 10.4.17 416 Requested Range Not Satisfiable .....................69
+ 10.4.18 417 Expectation Failed ..................................70
+ 10.5 Server Error 5xx ............................................70
+ 10.5.1 500 Internal Server Error ................................70
+ 10.5.2 501 Not Implemented ......................................70
+ 10.5.3 502 Bad Gateway ..........................................70
+ 10.5.4 503 Service Unavailable ..................................70
+ 10.5.5 504 Gateway Timeout ......................................71
+ 10.5.6 505 HTTP Version Not Supported ...........................71
+ 11 Access Authentication ........................................71
+ 12 Content Negotiation ..........................................71
+ 12.1 Server-driven Negotiation ...................................72
+ 12.2 Agent-driven Negotiation ....................................73
+ 12.3 Transparent Negotiation .....................................74
+ 13 Caching in HTTP ..............................................74
+ 13.1.1 Cache Correctness ........................................75
+ 13.1.2 Warnings .................................................76
+ 13.1.3 Cache-control Mechanisms .................................77
+ 13.1.4 Explicit User Agent Warnings .............................78
+ 13.1.5 Exceptions to the Rules and Warnings .....................78
+ 13.1.6 Client-controlled Behavior ...............................79
+ 13.2 Expiration Model ............................................79
+ 13.2.1 Server-Specified Expiration ..............................79
+ 13.2.2 Heuristic Expiration .....................................80
+ 13.2.3 Age Calculations .........................................80
+ 13.2.4 Expiration Calculations ..................................83
+ 13.2.5 Disambiguating Expiration Values .........................84
+ 13.2.6 Disambiguating Multiple Responses ........................84
+ 13.3 Validation Model ............................................85
+ 13.3.1 Last-Modified Dates ......................................86
+
+
+
+Fielding, et al. Standards Track [Page 4]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ 13.3.2 Entity Tag Cache Validators ..............................86
+ 13.3.3 Weak and Strong Validators ...............................86
+ 13.3.4 Rules for When to Use Entity Tags and Last-Modified Dates.89
+ 13.3.5 Non-validating Conditionals ..............................90
+ 13.4 Response Cacheability .......................................91
+ 13.5 Constructing Responses From Caches ..........................92
+ 13.5.1 End-to-end and Hop-by-hop Headers ........................92
+ 13.5.2 Non-modifiable Headers ...................................92
+ 13.5.3 Combining Headers ........................................94
+ 13.5.4 Combining Byte Ranges ....................................95
+ 13.6 Caching Negotiated Responses ................................95
+ 13.7 Shared and Non-Shared Caches ................................96
+ 13.8 Errors or Incomplete Response Cache Behavior ................97
+ 13.9 Side Effects of GET and HEAD ................................97
+ 13.10 Invalidation After Updates or Deletions ...................97
+ 13.11 Write-Through Mandatory ...................................98
+ 13.12 Cache Replacement .........................................99
+ 13.13 History Lists .............................................99
+ 14 Header Field Definitions ....................................100
+ 14.1 Accept .....................................................100
+ 14.2 Accept-Charset .............................................102
+ 14.3 Accept-Encoding ............................................102
+ 14.4 Accept-Language ............................................104
+ 14.5 Accept-Ranges ..............................................105
+ 14.6 Age ........................................................106
+ 14.7 Allow ......................................................106
+ 14.8 Authorization ..............................................107
+ 14.9 Cache-Control ..............................................108
+ 14.9.1 What is Cacheable .......................................109
+ 14.9.2 What May be Stored by Caches ............................110
+ 14.9.3 Modifications of the Basic Expiration Mechanism .........111
+ 14.9.4 Cache Revalidation and Reload Controls ..................113
+ 14.9.5 No-Transform Directive ..................................115
+ 14.9.6 Cache Control Extensions ................................116
+ 14.10 Connection ...............................................117
+ 14.11 Content-Encoding .........................................118
+ 14.12 Content-Language .........................................118
+ 14.13 Content-Length ...........................................119
+ 14.14 Content-Location .........................................120
+ 14.15 Content-MD5 ..............................................121
+ 14.16 Content-Range ............................................122
+ 14.17 Content-Type .............................................124
+ 14.18 Date .....................................................124
+ 14.18.1 Clockless Origin Server Operation ......................125
+ 14.19 ETag .....................................................126
+ 14.20 Expect ...................................................126
+ 14.21 Expires ..................................................127
+ 14.22 From .....................................................128
+
+
+
+Fielding, et al. Standards Track [Page 5]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ 14.23 Host .....................................................128
+ 14.24 If-Match .................................................129
+ 14.25 If-Modified-Since ........................................130
+ 14.26 If-None-Match ............................................132
+ 14.27 If-Range .................................................133
+ 14.28 If-Unmodified-Since ......................................134
+ 14.29 Last-Modified ............................................134
+ 14.30 Location .................................................135
+ 14.31 Max-Forwards .............................................136
+ 14.32 Pragma ...................................................136
+ 14.33 Proxy-Authenticate .......................................137
+ 14.34 Proxy-Authorization ......................................137
+ 14.35 Range ....................................................138
+ 14.35.1 Byte Ranges ...........................................138
+ 14.35.2 Range Retrieval Requests ..............................139
+ 14.36 Referer ..................................................140
+ 14.37 Retry-After ..............................................141
+ 14.38 Server ...................................................141
+ 14.39 TE .......................................................142
+ 14.40 Trailer ..................................................143
+ 14.41 Transfer-Encoding..........................................143
+ 14.42 Upgrade ..................................................144
+ 14.43 User-Agent ...............................................145
+ 14.44 Vary .....................................................145
+ 14.45 Via ......................................................146
+ 14.46 Warning ..................................................148
+ 14.47 WWW-Authenticate .........................................150
+ 15 Security Considerations .......................................150
+ 15.1 Personal Information....................................151
+ 15.1.1 Abuse of Server Log Information .........................151
+ 15.1.2 Transfer of Sensitive Information .......................151
+ 15.1.3 Encoding Sensitive Information in URI's .................152
+ 15.1.4 Privacy Issues Connected to Accept Headers ..............152
+ 15.2 Attacks Based On File and Path Names .......................153
+ 15.3 DNS Spoofing ...............................................154
+ 15.4 Location Headers and Spoofing ..............................154
+ 15.5 Content-Disposition Issues .................................154
+ 15.6 Authentication Credentials and Idle Clients ................155
+ 15.7 Proxies and Caching ........................................155
+ 15.7.1 Denial of Service Attacks on Proxies....................156
+ 16 Acknowledgments .............................................156
+ 17 References ..................................................158
+ 18 Authors' Addresses ..........................................162
+ 19 Appendices ..................................................164
+ 19.1 Internet Media Type message/http and application/http ......164
+ 19.2 Internet Media Type multipart/byteranges ...................165
+ 19.3 Tolerant Applications ......................................166
+ 19.4 Differences Between HTTP Entities and RFC 2045 Entities ....167
+
+
+
+Fielding, et al. Standards Track [Page 6]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ 19.4.1 MIME-Version ............................................167
+ 19.4.2 Conversion to Canonical Form ............................167
+ 19.4.3 Conversion of Date Formats ..............................168
+ 19.4.4 Introduction of Content-Encoding ........................168
+ 19.4.5 No Content-Transfer-Encoding ............................168
+ 19.4.6 Introduction of Transfer-Encoding .......................169
+ 19.4.7 MHTML and Line Length Limitations .......................169
+ 19.5 Additional Features ........................................169
+ 19.5.1 Content-Disposition .....................................170
+ 19.6 Compatibility with Previous Versions .......................170
+ 19.6.1 Changes from HTTP/1.0 ...................................171
+ 19.6.2 Compatibility with HTTP/1.0 Persistent Connections ......172
+ 19.6.3 Changes from RFC 2068 ...................................172
+ 20 Index .......................................................175
+ 21 Full Copyright Statement ....................................176
+
+1 Introduction
+
+1.1 Purpose
+
+ The Hypertext Transfer Protocol (HTTP) is an application-level
+ protocol for distributed, collaborative, hypermedia information
+ systems. HTTP has been in use by the World-Wide Web global
+ information initiative since 1990. The first version of HTTP,
+ referred to as HTTP/0.9, was a simple protocol for raw data transfer
+ across the Internet. HTTP/1.0, as defined by RFC 1945 [6], improved
+ the protocol by allowing messages to be in the format of MIME-like
+ messages, containing metainformation about the data transferred and
+ modifiers on the request/response semantics. However, HTTP/1.0 does
+ not sufficiently take into consideration the effects of hierarchical
+ proxies, caching, the need for persistent connections, or virtual
+ hosts. In addition, the proliferation of incompletely-implemented
+ applications calling themselves "HTTP/1.0" has necessitated a
+ protocol version change in order for two communicating applications
+ to determine each other's true capabilities.
+
+ This specification defines the protocol referred to as "HTTP/1.1".
+ This protocol includes more stringent requirements than HTTP/1.0 in
+ order to ensure reliable implementation of its features.
+
+ Practical information systems require more functionality than simple
+ retrieval, including search, front-end update, and annotation. HTTP
+ allows an open-ended set of methods and headers that indicate the
+ purpose of a request [47]. It builds on the discipline of reference
+ provided by the Uniform Resource Identifier (URI) [3], as a location
+ (URL) [4] or name (URN) [20], for indicating the resource to which a
+
+
+
+
+
+Fielding, et al. Standards Track [Page 7]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ method is to be applied. Messages are passed in a format similar to
+ that used by Internet mail [9] as defined by the Multipurpose
+ Internet Mail Extensions (MIME) [7].
+
+ HTTP is also used as a generic protocol for communication between
+ user agents and proxies/gateways to other Internet systems, including
+ those supported by the SMTP [16], NNTP [13], FTP [18], Gopher [2],
+ and WAIS [10] protocols. In this way, HTTP allows basic hypermedia
+ access to resources available from diverse applications.
+
+1.2 Requirements
+
+ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
+ "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
+ document are to be interpreted as described in RFC 2119 [34].
+
+ An implementation is not compliant if it fails to satisfy one or more
+ of the MUST or REQUIRED level requirements for the protocols it
+ implements. An implementation that satisfies all the MUST or REQUIRED
+ level and all the SHOULD level requirements for its protocols is said
+ to be "unconditionally compliant"; one that satisfies all the MUST
+ level requirements but not all the SHOULD level requirements for its
+ protocols is said to be "conditionally compliant."
+
+1.3 Terminology
+
+ This specification uses a number of terms to refer to the roles
+ played by participants in, and objects of, the HTTP communication.
+
+ connection
+ A transport layer virtual circuit established between two programs
+ for the purpose of communication.
+
+ message
+ The basic unit of HTTP communication, consisting of a structured
+ sequence of octets matching the syntax defined in section 4 and
+ transmitted via the connection.
+
+ request
+ An HTTP request message, as defined in section 5.
+
+ response
+ An HTTP response message, as defined in section 6.
+
+
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 8]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ resource
+ A network data object or service that can be identified by a URI,
+ as defined in section 3.2. Resources may be available in multiple
+ representations (e.g. multiple languages, data formats, size, and
+ resolutions) or vary in other ways.
+
+ entity
+ The information transferred as the payload of a request or
+ response. An entity consists of metainformation in the form of
+ entity-header fields and content in the form of an entity-body, as
+ described in section 7.
+
+ representation
+ An entity included with a response that is subject to content
+ negotiation, as described in section 12. There may exist multiple
+ representations associated with a particular response status.
+
+ content negotiation
+ The mechanism for selecting the appropriate representation when
+ servicing a request, as described in section 12. The
+ representation of entities in any response can be negotiated
+ (including error responses).
+
+ variant
+ A resource may have one, or more than one, representation(s)
+ associated with it at any given instant. Each of these
+ representations is termed a `varriant'. Use of the term `variant'
+ does not necessarily imply that the resource is subject to content
+ negotiation.
+
+ client
+ A program that establishes connections for the purpose of sending
+ requests.
+
+ user agent
+ The client which initiates a request. These are often browsers,
+ editors, spiders (web-traversing robots), or other end user tools.
+
+ server
+ An application program that accepts connections in order to
+ service requests by sending back responses. Any given program may
+ be capable of being both a client and a server; our use of these
+ terms refers only to the role being performed by the program for a
+ particular connection, rather than to the program's capabilities
+ in general. Likewise, any server may act as an origin server,
+ proxy, gateway, or tunnel, switching behavior based on the nature
+ of each request.
+
+
+
+
+Fielding, et al. Standards Track [Page 9]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ origin server
+ The server on which a given resource resides or is to be created.
+
+ proxy
+ An intermediary program which acts as both a server and a client
+ for the purpose of making requests on behalf of other clients.
+ Requests are serviced internally or by passing them on, with
+ possible translation, to other servers. A proxy MUST implement
+ both the client and server requirements of this specification. A
+ "transparent proxy" is a proxy that does not modify the request or
+ response beyond what is required for proxy authentication and
+ identification. A "non-transparent proxy" is a proxy that modifies
+ the request or response in order to provide some added service to
+ the user agent, such as group annotation services, media type
+ transformation, protocol reduction, or anonymity filtering. Except
+ where either transparent or non-transparent behavior is explicitly
+ stated, the HTTP proxy requirements apply to both types of
+ proxies.
+
+ gateway
+ A server which acts as an intermediary for some other server.
+ Unlike a proxy, a gateway receives requests as if it were the
+ origin server for the requested resource; the requesting client
+ may not be aware that it is communicating with a gateway.
+
+ tunnel
+ An intermediary program which is acting as a blind relay between
+ two connections. Once active, a tunnel is not considered a party
+ to the HTTP communication, though the tunnel may have been
+ initiated by an HTTP request. The tunnel ceases to exist when both
+ ends of the relayed connections are closed.
+
+ cache
+ A program's local store of response messages and the subsystem
+ that controls its message storage, retrieval, and deletion. A
+ cache stores cacheable responses in order to reduce the response
+ time and network bandwidth consumption on future, equivalent
+ requests. Any client or server may include a cache, though a cache
+ cannot be used by a server that is acting as a tunnel.
+
+ cacheable
+ A response is cacheable if a cache is allowed to store a copy of
+ the response message for use in answering subsequent requests. The
+ rules for determining the cacheability of HTTP responses are
+ defined in section 13. Even if a resource is cacheable, there may
+ be additional constraints on whether a cache can use the cached
+ copy for a particular request.
+
+
+
+
+Fielding, et al. Standards Track [Page 10]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ first-hand
+ A response is first-hand if it comes directly and without
+ unnecessary delay from the origin server, perhaps via one or more
+ proxies. A response is also first-hand if its validity has just
+ been checked directly with the origin server.
+
+ explicit expiration time
+ The time at which the origin server intends that an entity should
+ no longer be returned by a cache without further validation.
+
+ heuristic expiration time
+ An expiration time assigned by a cache when no explicit expiration
+ time is available.
+
+ age
+ The age of a response is the time since it was sent by, or
+ successfully validated with, the origin server.
+
+ freshness lifetime
+ The length of time between the generation of a response and its
+ expiration time.
+
+ fresh
+ A response is fresh if its age has not yet exceeded its freshness
+ lifetime.
+
+ stale
+ A response is stale if its age has passed its freshness lifetime.
+
+ semantically transparent
+ A cache behaves in a "semantically transparent" manner, with
+ respect to a particular response, when its use affects neither the
+ requesting client nor the origin server, except to improve
+ performance. When a cache is semantically transparent, the client
+ receives exactly the same response (except for hop-by-hop headers)
+ that it would have received had its request been handled directly
+ by the origin server.
+
+ validator
+ A protocol element (e.g., an entity tag or a Last-Modified time)
+ that is used to find out whether a cache entry is an equivalent
+ copy of an entity.
+
+ upstream/downstream
+ Upstream and downstream describe the flow of a message: all
+ messages flow from upstream to downstream.
+
+
+
+
+
+Fielding, et al. Standards Track [Page 11]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ inbound/outbound
+ Inbound and outbound refer to the request and response paths for
+ messages: "inbound" means "traveling toward the origin server",
+ and "outbound" means "traveling toward the user agent"
+
+1.4 Overall Operation
+
+ The HTTP protocol is a request/response protocol. A client sends a
+ request to the server in the form of a request method, URI, and
+ protocol version, followed by a MIME-like message containing request
+ modifiers, client information, and possible body content over a
+ connection with a server. The server responds with a status line,
+ including the message's protocol version and a success or error code,
+ followed by a MIME-like message containing server information, entity
+ metainformation, and possible entity-body content. The relationship
+ between HTTP and MIME is described in appendix 19.4.
+
+ Most HTTP communication is initiated by a user agent and consists of
+ a request to be applied to a resource on some origin server. In the
+ simplest case, this may be accomplished via a single connection (v)
+ between the user agent (UA) and the origin server (O).
+
+ request chain ------------------------>
+ UA -------------------v------------------- O
+ <----------------------- response chain
+
+ A more complicated situation occurs when one or more intermediaries
+ are present in the request/response chain. There are three common
+ forms of intermediary: proxy, gateway, and tunnel. A proxy is a
+ forwarding agent, receiving requests for a URI in its absolute form,
+ rewriting all or part of the message, and forwarding the reformatted
+ request toward the server identified by the URI. A gateway is a
+ receiving agent, acting as a layer above some other server(s) and, if
+ necessary, translating the requests to the underlying server's
+ protocol. A tunnel acts as a relay point between two connections
+ without changing the messages; tunnels are used when the
+ communication needs to pass through an intermediary (such as a
+ firewall) even when the intermediary cannot understand the contents
+ of the messages.
+
+ request chain -------------------------------------->
+ UA -----v----- A -----v----- B -----v----- C -----v----- O
+ <------------------------------------- response chain
+
+ The figure above shows three intermediaries (A, B, and C) between the
+ user agent and origin server. A request or response message that
+ travels the whole chain will pass through four separate connections.
+ This distinction is important because some HTTP communication options
+
+
+
+Fielding, et al. Standards Track [Page 12]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ may apply only to the connection with the nearest, non-tunnel
+ neighbor, only to the end-points of the chain, or to all connections
+ along the chain. Although the diagram is linear, each participant may
+ be engaged in multiple, simultaneous communications. For example, B
+ may be receiving requests from many clients other than A, and/or
+ forwarding requests to servers other than C, at the same time that it
+ is handling A's request.
+
+ Any party to the communication which is not acting as a tunnel may
+ employ an internal cache for handling requests. The effect of a cache
+ is that the request/response chain is shortened if one of the
+ participants along the chain has a cached response applicable to that
+ request. The following illustrates the resulting chain if B has a
+ cached copy of an earlier response from O (via C) for a request which
+ has not been cached by UA or A.
+
+ request chain ---------->
+ UA -----v----- A -----v----- B - - - - - - C - - - - - - O
+ <--------- response chain
+
+ Not all responses are usefully cacheable, and some requests may
+ contain modifiers which place special requirements on cache behavior.
+ HTTP requirements for cache behavior and cacheable responses are
+ defined in section 13.
+
+ In fact, there are a wide variety of architectures and configurations
+ of caches and proxies currently being experimented with or deployed
+ across the World Wide Web. These systems include national hierarchies
+ of proxy caches to save transoceanic bandwidth, systems that
+ broadcast or multicast cache entries, organizations that distribute
+ subsets of cached data via CD-ROM, and so on. HTTP systems are used
+ in corporate intranets over high-bandwidth links, and for access via
+ PDAs with low-power radio links and intermittent connectivity. The
+ goal of HTTP/1.1 is to support the wide diversity of configurations
+ already deployed while introducing protocol constructs that meet the
+ needs of those who build web applications that require high
+ reliability and, failing that, at least reliable indications of
+ failure.
+
+ HTTP communication usually takes place over TCP/IP connections. The
+ default port is TCP 80 [19], but other ports can be used. This does
+ not preclude HTTP from being implemented on top of any other protocol
+ on the Internet, or on other networks. HTTP only presumes a reliable
+ transport; any protocol that provides such guarantees can be used;
+ the mapping of the HTTP/1.1 request and response structures onto the
+ transport data units of the protocol in question is outside the scope
+ of this specification.
+
+
+
+
+Fielding, et al. Standards Track [Page 13]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ In HTTP/1.0, most implementations used a new connection for each
+ request/response exchange. In HTTP/1.1, a connection may be used for
+ one or more request/response exchanges, although connections may be
+ closed for a variety of reasons (see section 8.1).
+
+2 Notational Conventions and Generic Grammar
+
+2.1 Augmented BNF
+
+ All of the mechanisms specified in this document are described in
+ both prose and an augmented Backus-Naur Form (BNF) similar to that
+ used by RFC 822 [9]. Implementors will need to be familiar with the
+ notation in order to understand this specification. The augmented BNF
+ includes the following constructs:
+
+ name = definition
+ The name of a rule is simply the name itself (without any
+ enclosing "<" and ">") and is separated from its definition by the
+ equal "=" character. White space is only significant in that
+ indentation of continuation lines is used to indicate a rule
+ definition that spans more than one line. Certain basic rules are
+ in uppercase, such as SP, LWS, HT, CRLF, DIGIT, ALPHA, etc. Angle
+ brackets are used within definitions whenever their presence will
+ facilitate discerning the use of rule names.
+
+ "literal"
+ Quotation marks surround literal text. Unless stated otherwise,
+ the text is case-insensitive.
+
+ rule1 | rule2
+ Elements separated by a bar ("|") are alternatives, e.g., "yes |
+ no" will accept yes or no.
+
+ (rule1 rule2)
+ Elements enclosed in parentheses are treated as a single element.
+ Thus, "(elem (foo | bar) elem)" allows the token sequences "elem
+ foo elem" and "elem bar elem".
+
+ *rule
+ The character "*" preceding an element indicates repetition. The
+ full form is "<n>*<m>element" indicating at least <n> and at most
+ <m> occurrences of element. Default values are 0 and infinity so
+ that "*(element)" allows any number, including zero; "1*element"
+ requires at least one; and "1*2element" allows one or two.
+
+ [rule]
+ Square brackets enclose optional elements; "[foo bar]" is
+ equivalent to "*1(foo bar)".
+
+
+
+Fielding, et al. Standards Track [Page 14]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ N rule
+ Specific repetition: "<n>(element)" is equivalent to
+ "<n>*<n>(element)"; that is, exactly <n> occurrences of (element).
+ Thus 2DIGIT is a 2-digit number, and 3ALPHA is a string of three
+ alphabetic characters.
+
+ #rule
+ A construct "#" is defined, similar to "*", for defining lists of
+ elements. The full form is "<n>#<m>element" indicating at least
+ <n> and at most <m> elements, each separated by one or more commas
+ (",") and OPTIONAL linear white space (LWS). This makes the usual
+ form of lists very easy; a rule such as
+ ( *LWS element *( *LWS "," *LWS element ))
+ can be shown as
+ 1#element
+ Wherever this construct is used, null elements are allowed, but do
+ not contribute to the count of elements present. That is,
+ "(element), , (element) " is permitted, but counts as only two
+ elements. Therefore, where at least one element is required, at
+ least one non-null element MUST be present. Default values are 0
+ and infinity so that "#element" allows any number, including zero;
+ "1#element" requires at least one; and "1#2element" allows one or
+ two.
+
+ ; comment
+ A semi-colon, set off some distance to the right of rule text,
+ starts a comment that continues to the end of line. This is a
+ simple way of including useful notes in parallel with the
+ specifications.
+
+ implied *LWS
+ The grammar described by this specification is word-based. Except
+ where noted otherwise, linear white space (LWS) can be included
+ between any two adjacent words (token or quoted-string), and
+ between adjacent words and separators, without changing the
+ interpretation of a field. At least one delimiter (LWS and/or
+
+ separators) MUST exist between any two tokens (for the definition
+ of "token" below), since they would otherwise be interpreted as a
+ single token.
+
+2.2 Basic Rules
+
+ The following rules are used throughout this specification to
+ describe basic parsing constructs. The US-ASCII coded character set
+ is defined by ANSI X3.4-1986 [21].
+
+
+
+
+
+Fielding, et al. Standards Track [Page 15]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ OCTET = <any 8-bit sequence of data>
+ CHAR = <any US-ASCII character (octets 0 - 127)>
+ UPALPHA = <any US-ASCII uppercase letter "A".."Z">
+ LOALPHA = <any US-ASCII lowercase letter "a".."z">
+ ALPHA = UPALPHA | LOALPHA
+ DIGIT = <any US-ASCII digit "0".."9">
+ CTL = <any US-ASCII control character
+ (octets 0 - 31) and DEL (127)>
+ CR = <US-ASCII CR, carriage return (13)>
+ LF = <US-ASCII LF, linefeed (10)>
+ SP = <US-ASCII SP, space (32)>
+ HT = <US-ASCII HT, horizontal-tab (9)>
+ <"> = <US-ASCII double-quote mark (34)>
+
+ HTTP/1.1 defines the sequence CR LF as the end-of-line marker for all
+ protocol elements except the entity-body (see appendix 19.3 for
+ tolerant applications). The end-of-line marker within an entity-body
+ is defined by its associated media type, as described in section 3.7.
+
+ CRLF = CR LF
+
+ HTTP/1.1 header field values can be folded onto multiple lines if the
+ continuation line begins with a space or horizontal tab. All linear
+ white space, including folding, has the same semantics as SP. A
+ recipient MAY replace any linear white space with a single SP before
+ interpreting the field value or forwarding the message downstream.
+
+ LWS = [CRLF] 1*( SP | HT )
+
+ The TEXT rule is only used for descriptive field contents and values
+ that are not intended to be interpreted by the message parser. Words
+ of *TEXT MAY contain characters from character sets other than ISO-
+ 8859-1 [22] only when encoded according to the rules of RFC 2047
+ [14].
+
+ TEXT = <any OCTET except CTLs,
+ but including LWS>
+
+ A CRLF is allowed in the definition of TEXT only as part of a header
+ field continuation. It is expected that the folding LWS will be
+ replaced with a single SP before interpretation of the TEXT value.
+
+ Hexadecimal numeric characters are used in several protocol elements.
+
+ HEX = "A" | "B" | "C" | "D" | "E" | "F"
+ | "a" | "b" | "c" | "d" | "e" | "f" | DIGIT
+
+
+
+
+
+Fielding, et al. Standards Track [Page 16]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ Many HTTP/1.1 header field values consist of words separated by LWS
+ or special characters. These special characters MUST be in a quoted
+ string to be used within a parameter value (as defined in section
+ 3.6).
+
+ token = 1*<any CHAR except CTLs or separators>
+ separators = "(" | ")" | "<" | ">" | "@"
+ | "," | ";" | ":" | "\" | <">
+ | "/" | "[" | "]" | "?" | "="
+ | "{" | "}" | SP | HT
+
+ Comments can be included in some HTTP header fields by surrounding
+ the comment text with parentheses. Comments are only allowed in
+ fields containing "comment" as part of their field value definition.
+ In all other fields, parentheses are considered part of the field
+ value.
+
+ comment = "(" *( ctext | quoted-pair | comment ) ")"
+ ctext = <any TEXT excluding "(" and ")">
+
+ A string of text is parsed as a single word if it is quoted using
+ double-quote marks.
+
+ quoted-string = ( <"> *(qdtext | quoted-pair ) <"> )
+ qdtext = <any TEXT except <">>
+
+ The backslash character ("\") MAY be used as a single-character
+ quoting mechanism only within quoted-string and comment constructs.
+
+ quoted-pair = "\" CHAR
+
+3 Protocol Parameters
+
+3.1 HTTP Version
+
+ HTTP uses a "<major>.<minor>" numbering scheme to indicate versions
+ of the protocol. The protocol versioning policy is intended to allow
+ the sender to indicate the format of a message and its capacity for
+ understanding further HTTP communication, rather than the features
+ obtained via that communication. No change is made to the version
+ number for the addition of message components which do not affect
+ communication behavior or which only add to extensible field values.
+ The <minor> number is incremented when the changes made to the
+ protocol add features which do not change the general message parsing
+ algorithm, but which may add to the message semantics and imply
+ additional capabilities of the sender. The <major> number is
+ incremented when the format of a message within the protocol is
+ changed. See RFC 2145 [36] for a fuller explanation.
+
+
+
+Fielding, et al. Standards Track [Page 17]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ The version of an HTTP message is indicated by an HTTP-Version field
+ in the first line of the message.
+
+ HTTP-Version = "HTTP" "/" 1*DIGIT "." 1*DIGIT
+
+ Note that the major and minor numbers MUST be treated as separate
+ integers and that each MAY be incremented higher than a single digit.
+ Thus, HTTP/2.4 is a lower version than HTTP/2.13, which in turn is
+ lower than HTTP/12.3. Leading zeros MUST be ignored by recipients and
+ MUST NOT be sent.
+
+ An application that sends a request or response message that includes
+ HTTP-Version of "HTTP/1.1" MUST be at least conditionally compliant
+ with this specification. Applications that are at least conditionally
+ compliant with this specification SHOULD use an HTTP-Version of
+ "HTTP/1.1" in their messages, and MUST do so for any message that is
+ not compatible with HTTP/1.0. For more details on when to send
+ specific HTTP-Version values, see RFC 2145 [36].
+
+ The HTTP version of an application is the highest HTTP version for
+ which the application is at least conditionally compliant.
+
+ Proxy and gateway applications need to be careful when forwarding
+ messages in protocol versions different from that of the application.
+ Since the protocol version indicates the protocol capability of the
+ sender, a proxy/gateway MUST NOT send a message with a version
+ indicator which is greater than its actual version. If a higher
+ version request is received, the proxy/gateway MUST either downgrade
+ the request version, or respond with an error, or switch to tunnel
+ behavior.
+
+ Due to interoperability problems with HTTP/1.0 proxies discovered
+ since the publication of RFC 2068[33], caching proxies MUST, gateways
+ MAY, and tunnels MUST NOT upgrade the request to the highest version
+ they support. The proxy/gateway's response to that request MUST be in
+ the same major version as the request.
+
+ Note: Converting between versions of HTTP may involve modification
+ of header fields required or forbidden by the versions involved.
+
+3.2 Uniform Resource Identifiers
+
+ URIs have been known by many names: WWW addresses, Universal Document
+ Identifiers, Universal Resource Identifiers [3], and finally the
+ combination of Uniform Resource Locators (URL) [4] and Names (URN)
+ [20]. As far as HTTP is concerned, Uniform Resource Identifiers are
+ simply formatted strings which identify--via name, location, or any
+ other characteristic--a resource.
+
+
+
+Fielding, et al. Standards Track [Page 18]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+3.2.1 General Syntax
+
+ URIs in HTTP can be represented in absolute form or relative to some
+ known base URI [11], depending upon the context of their use. The two
+ forms are differentiated by the fact that absolute URIs always begin
+ with a scheme name followed by a colon. For definitive information on
+ URL syntax and semantics, see "Uniform Resource Identifiers (URI):
+ Generic Syntax and Semantics," RFC 2396 [42] (which replaces RFCs
+ 1738 [4] and RFC 1808 [11]). This specification adopts the
+ definitions of "URI-reference", "absoluteURI", "relativeURI", "port",
+ "host","abs_path", "rel_path", and "authority" from that
+ specification.
+
+ The HTTP protocol does not place any a priori limit on the length of
+ a URI. Servers MUST be able to handle the URI of any resource they
+ serve, and SHOULD be able to handle URIs of unbounded length if they
+ provide GET-based forms that could generate such URIs. A server
+ SHOULD return 414 (Request-URI Too Long) status if a URI is longer
+ than the server can handle (see section 10.4.15).
+
+ Note: Servers ought to be cautious about depending on URI lengths
+ above 255 bytes, because some older client or proxy
+ implementations might not properly support these lengths.
+
+3.2.2 http URL
+
+ The "http" scheme is used to locate network resources via the HTTP
+ protocol. This section defines the scheme-specific syntax and
+ semantics for http URLs.
+
+ http_URL = "http:" "//" host [ ":" port ] [ abs_path [ "?" query ]]
+
+ If the port is empty or not given, port 80 is assumed. The semantics
+ are that the identified resource is located at the server listening
+ for TCP connections on that port of that host, and the Request-URI
+ for the resource is abs_path (section 5.1.2). The use of IP addresses
+ in URLs SHOULD be avoided whenever possible (see RFC 1900 [24]). If
+ the abs_path is not present in the URL, it MUST be given as "/" when
+ used as a Request-URI for a resource (section 5.1.2). If a proxy
+ receives a host name which is not a fully qualified domain name, it
+ MAY add its domain to the host name it received. If a proxy receives
+ a fully qualified domain name, the proxy MUST NOT change the host
+ name.
+
+
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 19]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+3.2.3 URI Comparison
+
+ When comparing two URIs to decide if they match or not, a client
+ SHOULD use a case-sensitive octet-by-octet comparison of the entire
+ URIs, with these exceptions:
+
+ - A port that is empty or not given is equivalent to the default
+ port for that URI-reference;
+
+ - Comparisons of host names MUST be case-insensitive;
+
+ - Comparisons of scheme names MUST be case-insensitive;
+
+ - An empty abs_path is equivalent to an abs_path of "/".
+
+ Characters other than those in the "reserved" and "unsafe" sets (see
+ RFC 2396 [42]) are equivalent to their ""%" HEX HEX" encoding.
+
+ For example, the following three URIs are equivalent:
+
+ http://abc.com:80/~smith/home.html
+ http://ABC.com/%7Esmith/home.html
+ http://ABC.com:/%7esmith/home.html
+
+3.3 Date/Time Formats
+
+3.3.1 Full Date
+
+ HTTP applications have historically allowed three different formats
+ for the representation of date/time stamps:
+
+ Sun, 06 Nov 1994 08:49:37 GMT ; RFC 822, updated by RFC 1123
+ Sunday, 06-Nov-94 08:49:37 GMT ; RFC 850, obsoleted by RFC 1036
+ Sun Nov 6 08:49:37 1994 ; ANSI C's asctime() format
+
+ The first format is preferred as an Internet standard and represents
+ a fixed-length subset of that defined by RFC 1123 [8] (an update to
+ RFC 822 [9]). The second format is in common use, but is based on the
+ obsolete RFC 850 [12] date format and lacks a four-digit year.
+ HTTP/1.1 clients and servers that parse the date value MUST accept
+ all three formats (for compatibility with HTTP/1.0), though they MUST
+ only generate the RFC 1123 format for representing HTTP-date values
+ in header fields. See section 19.3 for further information.
+
+ Note: Recipients of date values are encouraged to be robust in
+ accepting date values that may have been sent by non-HTTP
+ applications, as is sometimes the case when retrieving or posting
+ messages via proxies/gateways to SMTP or NNTP.
+
+
+
+Fielding, et al. Standards Track [Page 20]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ All HTTP date/time stamps MUST be represented in Greenwich Mean Time
+ (GMT), without exception. For the purposes of HTTP, GMT is exactly
+ equal to UTC (Coordinated Universal Time). This is indicated in the
+ first two formats by the inclusion of "GMT" as the three-letter
+ abbreviation for time zone, and MUST be assumed when reading the
+ asctime format. HTTP-date is case sensitive and MUST NOT include
+ additional LWS beyond that specifically included as SP in the
+ grammar.
+
+ HTTP-date = rfc1123-date | rfc850-date | asctime-date
+ rfc1123-date = wkday "," SP date1 SP time SP "GMT"
+ rfc850-date = weekday "," SP date2 SP time SP "GMT"
+ asctime-date = wkday SP date3 SP time SP 4DIGIT
+ date1 = 2DIGIT SP month SP 4DIGIT
+ ; day month year (e.g., 02 Jun 1982)
+ date2 = 2DIGIT "-" month "-" 2DIGIT
+ ; day-month-year (e.g., 02-Jun-82)
+ date3 = month SP ( 2DIGIT | ( SP 1DIGIT ))
+ ; month day (e.g., Jun 2)
+ time = 2DIGIT ":" 2DIGIT ":" 2DIGIT
+ ; 00:00:00 - 23:59:59
+ wkday = "Mon" | "Tue" | "Wed"
+ | "Thu" | "Fri" | "Sat" | "Sun"
+ weekday = "Monday" | "Tuesday" | "Wednesday"
+ | "Thursday" | "Friday" | "Saturday" | "Sunday"
+ month = "Jan" | "Feb" | "Mar" | "Apr"
+ | "May" | "Jun" | "Jul" | "Aug"
+ | "Sep" | "Oct" | "Nov" | "Dec"
+
+ Note: HTTP requirements for the date/time stamp format apply only
+ to their usage within the protocol stream. Clients and servers are
+ not required to use these formats for user presentation, request
+ logging, etc.
+
+3.3.2 Delta Seconds
+
+ Some HTTP header fields allow a time value to be specified as an
+ integer number of seconds, represented in decimal, after the time
+ that the message was received.
+
+ delta-seconds = 1*DIGIT
+
+3.4 Character Sets
+
+ HTTP uses the same definition of the term "character set" as that
+ described for MIME:
+
+
+
+
+
+Fielding, et al. Standards Track [Page 21]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ The term "character set" is used in this document to refer to a
+ method used with one or more tables to convert a sequence of octets
+ into a sequence of characters. Note that unconditional conversion in
+ the other direction is not required, in that not all characters may
+ be available in a given character set and a character set may provide
+ more than one sequence of octets to represent a particular character.
+ This definition is intended to allow various kinds of character
+ encoding, from simple single-table mappings such as US-ASCII to
+ complex table switching methods such as those that use ISO-2022's
+ techniques. However, the definition associated with a MIME character
+ set name MUST fully specify the mapping to be performed from octets
+ to characters. In particular, use of external profiling information
+ to determine the exact mapping is not permitted.
+
+ Note: This use of the term "character set" is more commonly
+ referred to as a "character encoding." However, since HTTP and
+ MIME share the same registry, it is important that the terminology
+ also be shared.
+
+ HTTP character sets are identified by case-insensitive tokens. The
+ complete set of tokens is defined by the IANA Character Set registry
+ [19].
+
+ charset = token
+
+ Although HTTP allows an arbitrary token to be used as a charset
+ value, any token that has a predefined value within the IANA
+ Character Set registry [19] MUST represent the character set defined
+ by that registry. Applications SHOULD limit their use of character
+ sets to those defined by the IANA registry.
+
+ Implementors should be aware of IETF character set requirements [38]
+ [41].
+
+3.4.1 Missing Charset
+
+ Some HTTP/1.0 software has interpreted a Content-Type header without
+ charset parameter incorrectly to mean "recipient should guess."
+ Senders wishing to defeat this behavior MAY include a charset
+ parameter even when the charset is ISO-8859-1 and SHOULD do so when
+ it is known that it will not confuse the recipient.
+
+ Unfortunately, some older HTTP/1.0 clients did not deal properly with
+ an explicit charset parameter. HTTP/1.1 recipients MUST respect the
+ charset label provided by the sender; and those user agents that have
+ a provision to "guess" a charset MUST use the charset from the
+
+
+
+
+
+Fielding, et al. Standards Track [Page 22]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ content-type field if they support that charset, rather than the
+ recipient's preference, when initially displaying a document. See
+ section 3.7.1.
+
+3.5 Content Codings
+
+ Content coding values indicate an encoding transformation that has
+ been or can be applied to an entity. Content codings are primarily
+ used to allow a document to be compressed or otherwise usefully
+ transformed without losing the identity of its underlying media type
+ and without loss of information. Frequently, the entity is stored in
+ coded form, transmitted directly, and only decoded by the recipient.
+
+ content-coding = token
+
+ All content-coding values are case-insensitive. HTTP/1.1 uses
+ content-coding values in the Accept-Encoding (section 14.3) and
+ Content-Encoding (section 14.11) header fields. Although the value
+ describes the content-coding, what is more important is that it
+ indicates what decoding mechanism will be required to remove the
+ encoding.
+
+ The Internet Assigned Numbers Authority (IANA) acts as a registry for
+ content-coding value tokens. Initially, the registry contains the
+ following tokens:
+
+ gzip An encoding format produced by the file compression program
+ "gzip" (GNU zip) as described in RFC 1952 [25]. This format is a
+ Lempel-Ziv coding (LZ77) with a 32 bit CRC.
+
+ compress
+ The encoding format produced by the common UNIX file compression
+ program "compress". This format is an adaptive Lempel-Ziv-Welch
+ coding (LZW).
+
+ Use of program names for the identification of encoding formats
+ is not desirable and is discouraged for future encodings. Their
+ use here is representative of historical practice, not good
+ design. For compatibility with previous implementations of HTTP,
+ applications SHOULD consider "x-gzip" and "x-compress" to be
+ equivalent to "gzip" and "compress" respectively.
+
+ deflate
+ The "zlib" format defined in RFC 1950 [31] in combination with
+ the "deflate" compression mechanism described in RFC 1951 [29].
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 23]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ identity
+ The default (identity) encoding; the use of no transformation
+ whatsoever. This content-coding is used only in the Accept-
+ Encoding header, and SHOULD NOT be used in the Content-Encoding
+ header.
+
+ New content-coding value tokens SHOULD be registered; to allow
+ interoperability between clients and servers, specifications of the
+ content coding algorithms needed to implement a new value SHOULD be
+ publicly available and adequate for independent implementation, and
+ conform to the purpose of content coding defined in this section.
+
+3.6 Transfer Codings
+
+ Transfer-coding values are used to indicate an encoding
+ transformation that has been, can be, or may need to be applied to an
+ entity-body in order to ensure "safe transport" through the network.
+ This differs from a content coding in that the transfer-coding is a
+ property of the message, not of the original entity.
+
+ transfer-coding = "chunked" | transfer-extension
+ transfer-extension = token *( ";" parameter )
+
+ Parameters are in the form of attribute/value pairs.
+
+ parameter = attribute "=" value
+ attribute = token
+ value = token | quoted-string
+
+ All transfer-coding values are case-insensitive. HTTP/1.1 uses
+ transfer-coding values in the TE header field (section 14.39) and in
+ the Transfer-Encoding header field (section 14.41).
+
+ Whenever a transfer-coding is applied to a message-body, the set of
+ transfer-codings MUST include "chunked", unless the message is
+ terminated by closing the connection. When the "chunked" transfer-
+ coding is used, it MUST be the last transfer-coding applied to the
+ message-body. The "chunked" transfer-coding MUST NOT be applied more
+ than once to a message-body. These rules allow the recipient to
+ determine the transfer-length of the message (section 4.4).
+
+ Transfer-codings are analogous to the Content-Transfer-Encoding
+ values of MIME [7], which were designed to enable safe transport of
+ binary data over a 7-bit transport service. However, safe transport
+ has a different focus for an 8bit-clean transfer protocol. In HTTP,
+ the only unsafe characteristic of message-bodies is the difficulty in
+ determining the exact body length (section 7.2.2), or the desire to
+ encrypt data over a shared transport.
+
+
+
+Fielding, et al. Standards Track [Page 24]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ The Internet Assigned Numbers Authority (IANA) acts as a registry for
+ transfer-coding value tokens. Initially, the registry contains the
+ following tokens: "chunked" (section 3.6.1), "identity" (section
+ 3.6.2), "gzip" (section 3.5), "compress" (section 3.5), and "deflate"
+ (section 3.5).
+
+ New transfer-coding value tokens SHOULD be registered in the same way
+ as new content-coding value tokens (section 3.5).
+
+ A server which receives an entity-body with a transfer-coding it does
+ not understand SHOULD return 501 (Unimplemented), and close the
+ connection. A server MUST NOT send transfer-codings to an HTTP/1.0
+ client.
+
+3.6.1 Chunked Transfer Coding
+
+ The chunked encoding modifies the body of a message in order to
+ transfer it as a series of chunks, each with its own size indicator,
+ followed by an OPTIONAL trailer containing entity-header fields. This
+ allows dynamically produced content to be transferred along with the
+ information necessary for the recipient to verify that it has
+ received the full message.
+
+ Chunked-Body = *chunk
+ last-chunk
+ trailer
+ CRLF
+
+ chunk = chunk-size [ chunk-extension ] CRLF
+ chunk-data CRLF
+ chunk-size = 1*HEX
+ last-chunk = 1*("0") [ chunk-extension ] CRLF
+
+ chunk-extension= *( ";" chunk-ext-name [ "=" chunk-ext-val ] )
+ chunk-ext-name = token
+ chunk-ext-val = token | quoted-string
+ chunk-data = chunk-size(OCTET)
+ trailer = *(entity-header CRLF)
+
+ The chunk-size field is a string of hex digits indicating the size of
+ the chunk. The chunked encoding is ended by any chunk whose size is
+ zero, followed by the trailer, which is terminated by an empty line.
+
+ The trailer allows the sender to include additional HTTP header
+ fields at the end of the message. The Trailer header field can be
+ used to indicate which header fields are included in a trailer (see
+ section 14.40).
+
+
+
+
+Fielding, et al. Standards Track [Page 25]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ A server using chunked transfer-coding in a response MUST NOT use the
+ trailer for any header fields unless at least one of the following is
+ true:
+
+ a)the request included a TE header field that indicates "trailers" is
+ acceptable in the transfer-coding of the response, as described in
+ section 14.39; or,
+
+ b)the server is the origin server for the response, the trailer
+ fields consist entirely of optional metadata, and the recipient
+ could use the message (in a manner acceptable to the origin server)
+ without receiving this metadata. In other words, the origin server
+ is willing to accept the possibility that the trailer fields might
+ be silently discarded along the path to the client.
+
+ This requirement prevents an interoperability failure when the
+ message is being received by an HTTP/1.1 (or later) proxy and
+ forwarded to an HTTP/1.0 recipient. It avoids a situation where
+ compliance with the protocol would have necessitated a possibly
+ infinite buffer on the proxy.
+
+ An example process for decoding a Chunked-Body is presented in
+ appendix 19.4.6.
+
+ All HTTP/1.1 applications MUST be able to receive and decode the
+ "chunked" transfer-coding, and MUST ignore chunk-extension extensions
+ they do not understand.
+
+3.7 Media Types
+
+ HTTP uses Internet Media Types [17] in the Content-Type (section
+ 14.17) and Accept (section 14.1) header fields in order to provide
+ open and extensible data typing and type negotiation.
+
+ media-type = type "/" subtype *( ";" parameter )
+ type = token
+ subtype = token
+
+ Parameters MAY follow the type/subtype in the form of attribute/value
+ pairs (as defined in section 3.6).
+
+ The type, subtype, and parameter attribute names are case-
+ insensitive. Parameter values might or might not be case-sensitive,
+ depending on the semantics of the parameter name. Linear white space
+ (LWS) MUST NOT be used between the type and subtype, nor between an
+ attribute and its value. The presence or absence of a parameter might
+ be significant to the processing of a media-type, depending on its
+ definition within the media type registry.
+
+
+
+Fielding, et al. Standards Track [Page 26]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ Note that some older HTTP applications do not recognize media type
+ parameters. When sending data to older HTTP applications,
+ implementations SHOULD only use media type parameters when they are
+ required by that type/subtype definition.
+
+ Media-type values are registered with the Internet Assigned Number
+ Authority (IANA [19]). The media type registration process is
+ outlined in RFC 1590 [17]. Use of non-registered media types is
+ discouraged.
+
+3.7.1 Canonicalization and Text Defaults
+
+ Internet media types are registered with a canonical form. An
+ entity-body transferred via HTTP messages MUST be represented in the
+ appropriate canonical form prior to its transmission except for
+ "text" types, as defined in the next paragraph.
+
+ When in canonical form, media subtypes of the "text" type use CRLF as
+ the text line break. HTTP relaxes this requirement and allows the
+ transport of text media with plain CR or LF alone representing a line
+ break when it is done consistently for an entire entity-body. HTTP
+ applications MUST accept CRLF, bare CR, and bare LF as being
+ representative of a line break in text media received via HTTP. In
+ addition, if the text is represented in a character set that does not
+ use octets 13 and 10 for CR and LF respectively, as is the case for
+ some multi-byte character sets, HTTP allows the use of whatever octet
+ sequences are defined by that character set to represent the
+ equivalent of CR and LF for line breaks. This flexibility regarding
+ line breaks applies only to text media in the entity-body; a bare CR
+ or LF MUST NOT be substituted for CRLF within any of the HTTP control
+ structures (such as header fields and multipart boundaries).
+
+ If an entity-body is encoded with a content-coding, the underlying
+ data MUST be in a form defined above prior to being encoded.
+
+ The "charset" parameter is used with some media types to define the
+ character set (section 3.4) of the data. When no explicit charset
+ parameter is provided by the sender, media subtypes of the "text"
+ type are defined to have a default charset value of "ISO-8859-1" when
+ received via HTTP. Data in character sets other than "ISO-8859-1" or
+ its subsets MUST be labeled with an appropriate charset value. See
+ section 3.4.1 for compatibility problems.
+
+3.7.2 Multipart Types
+
+ MIME provides for a number of "multipart" types -- encapsulations of
+ one or more entities within a single message-body. All multipart
+ types share a common syntax, as defined in section 5.1.1 of RFC 2046
+
+
+
+Fielding, et al. Standards Track [Page 27]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ [40], and MUST include a boundary parameter as part of the media type
+ value. The message body is itself a protocol element and MUST
+ therefore use only CRLF to represent line breaks between body-parts.
+ Unlike in RFC 2046, the epilogue of any multipart message MUST be
+ empty; HTTP applications MUST NOT transmit the epilogue (even if the
+ original multipart contains an epilogue). These restrictions exist in
+ order to preserve the self-delimiting nature of a multipart message-
+ body, wherein the "end" of the message-body is indicated by the
+ ending multipart boundary.
+
+ In general, HTTP treats a multipart message-body no differently than
+ any other media type: strictly as payload. The one exception is the
+ "multipart/byteranges" type (appendix 19.2) when it appears in a 206
+ (Partial Content) response, which will be interpreted by some HTTP
+ caching mechanisms as described in sections 13.5.4 and 14.16. In all
+ other cases, an HTTP user agent SHOULD follow the same or similar
+ behavior as a MIME user agent would upon receipt of a multipart type.
+ The MIME header fields within each body-part of a multipart message-
+ body do not have any significance to HTTP beyond that defined by
+ their MIME semantics.
+
+ In general, an HTTP user agent SHOULD follow the same or similar
+ behavior as a MIME user agent would upon receipt of a multipart type.
+ If an application receives an unrecognized multipart subtype, the
+ application MUST treat it as being equivalent to "multipart/mixed".
+
+ Note: The "multipart/form-data" type has been specifically defined
+ for carrying form data suitable for processing via the POST
+ request method, as described in RFC 1867 [15].
+
+3.8 Product Tokens
+
+ Product tokens are used to allow communicating applications to
+ identify themselves by software name and version. Most fields using
+ product tokens also allow sub-products which form a significant part
+ of the application to be listed, separated by white space. By
+ convention, the products are listed in order of their significance
+ for identifying the application.
+
+ product = token ["/" product-version]
+ product-version = token
+
+ Examples:
+
+ User-Agent: CERN-LineMode/2.15 libwww/2.17b3
+ Server: Apache/0.8.4
+
+
+
+
+
+Fielding, et al. Standards Track [Page 28]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ Product tokens SHOULD be short and to the point. They MUST NOT be
+ used for advertising or other non-essential information. Although any
+ token character MAY appear in a product-version, this token SHOULD
+ only be used for a version identifier (i.e., successive versions of
+ the same product SHOULD only differ in the product-version portion of
+ the product value).
+
+3.9 Quality Values
+
+ HTTP content negotiation (section 12) uses short "floating point"
+ numbers to indicate the relative importance ("weight") of various
+ negotiable parameters. A weight is normalized to a real number in
+ the range 0 through 1, where 0 is the minimum and 1 the maximum
+ value. If a parameter has a quality value of 0, then content with
+ this parameter is `not acceptable' for the client. HTTP/1.1
+ applications MUST NOT generate more than three digits after the
+ decimal point. User configuration of these values SHOULD also be
+ limited in this fashion.
+
+ qvalue = ( "0" [ "." 0*3DIGIT ] )
+ | ( "1" [ "." 0*3("0") ] )
+
+ "Quality values" is a misnomer, since these values merely represent
+ relative degradation in desired quality.
+
+3.10 Language Tags
+
+ A language tag identifies a natural language spoken, written, or
+ otherwise conveyed by human beings for communication of information
+ to other human beings. Computer languages are explicitly excluded.
+ HTTP uses language tags within the Accept-Language and Content-
+ Language fields.
+
+ The syntax and registry of HTTP language tags is the same as that
+ defined by RFC 1766 [1]. In summary, a language tag is composed of 1
+ or more parts: A primary language tag and a possibly empty series of
+ subtags:
+
+ language-tag = primary-tag *( "-" subtag )
+ primary-tag = 1*8ALPHA
+ subtag = 1*8ALPHA
+
+ White space is not allowed within the tag and all tags are case-
+ insensitive. The name space of language tags is administered by the
+ IANA. Example tags include:
+
+ en, en-US, en-cockney, i-cherokee, x-pig-latin
+
+
+
+
+Fielding, et al. Standards Track [Page 29]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ where any two-letter primary-tag is an ISO-639 language abbreviation
+ and any two-letter initial subtag is an ISO-3166 country code. (The
+ last three tags above are not registered tags; all but the last are
+ examples of tags which could be registered in future.)
+
+3.11 Entity Tags
+
+ Entity tags are used for comparing two or more entities from the same
+ requested resource. HTTP/1.1 uses entity tags in the ETag (section
+ 14.19), If-Match (section 14.24), If-None-Match (section 14.26), and
+ If-Range (section 14.27) header fields. The definition of how they
+ are used and compared as cache validators is in section 13.3.3. An
+ entity tag consists of an opaque quoted string, possibly prefixed by
+ a weakness indicator.
+
+ entity-tag = [ weak ] opaque-tag
+ weak = "W/"
+ opaque-tag = quoted-string
+
+ A "strong entity tag" MAY be shared by two entities of a resource
+ only if they are equivalent by octet equality.
+
+ A "weak entity tag," indicated by the "W/" prefix, MAY be shared by
+ two entities of a resource only if the entities are equivalent and
+ could be substituted for each other with no significant change in
+ semantics. A weak entity tag can only be used for weak comparison.
+
+ An entity tag MUST be unique across all versions of all entities
+ associated with a particular resource. A given entity tag value MAY
+ be used for entities obtained by requests on different URIs. The use
+ of the same entity tag value in conjunction with entities obtained by
+ requests on different URIs does not imply the equivalence of those
+ entities.
+
+3.12 Range Units
+
+ HTTP/1.1 allows a client to request that only part (a range of) the
+ response entity be included within the response. HTTP/1.1 uses range
+ units in the Range (section 14.35) and Content-Range (section 14.16)
+ header fields. An entity can be broken down into subranges according
+ to various structural units.
+
+ range-unit = bytes-unit | other-range-unit
+ bytes-unit = "bytes"
+ other-range-unit = token
+
+ The only range unit defined by HTTP/1.1 is "bytes". HTTP/1.1
+ implementations MAY ignore ranges specified using other units.
+
+
+
+Fielding, et al. Standards Track [Page 30]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ HTTP/1.1 has been designed to allow implementations of applications
+ that do not depend on knowledge of ranges.
+
+4 HTTP Message
+
+4.1 Message Types
+
+ HTTP messages consist of requests from client to server and responses
+ from server to client.
+
+ HTTP-message = Request | Response ; HTTP/1.1 messages
+
+ Request (section 5) and Response (section 6) messages use the generic
+ message format of RFC 822 [9] for transferring entities (the payload
+ of the message). Both types of message consist of a start-line, zero
+ or more header fields (also known as "headers"), an empty line (i.e.,
+ a line with nothing preceding the CRLF) indicating the end of the
+ header fields, and possibly a message-body.
+
+ generic-message = start-line
+ *(message-header CRLF)
+ CRLF
+ [ message-body ]
+ start-line = Request-Line | Status-Line
+
+ In the interest of robustness, servers SHOULD ignore any empty
+ line(s) received where a Request-Line is expected. In other words, if
+ the server is reading the protocol stream at the beginning of a
+ message and receives a CRLF first, it should ignore the CRLF.
+
+ Certain buggy HTTP/1.0 client implementations generate extra CRLF's
+ after a POST request. To restate what is explicitly forbidden by the
+ BNF, an HTTP/1.1 client MUST NOT preface or follow a request with an
+ extra CRLF.
+
+4.2 Message Headers
+
+ HTTP header fields, which include general-header (section 4.5),
+ request-header (section 5.3), response-header (section 6.2), and
+ entity-header (section 7.1) fields, follow the same generic format as
+ that given in Section 3.1 of RFC 822 [9]. Each header field consists
+ of a name followed by a colon (":") and the field value. Field names
+ are case-insensitive. The field value MAY be preceded by any amount
+ of LWS, though a single SP is preferred. Header fields can be
+ extended over multiple lines by preceding each extra line with at
+ least one SP or HT. Applications ought to follow "common form", where
+ one is known or indicated, when generating HTTP constructs, since
+ there might exist some implementations that fail to accept anything
+
+
+
+Fielding, et al. Standards Track [Page 31]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ beyond the common forms.
+
+ message-header = field-name ":" [ field-value ]
+ field-name = token
+ field-value = *( field-content | LWS )
+ field-content = <the OCTETs making up the field-value
+ and consisting of either *TEXT or combinations
+ of token, separators, and quoted-string>
+
+ The field-content does not include any leading or trailing LWS:
+ linear white space occurring before the first non-whitespace
+ character of the field-value or after the last non-whitespace
+ character of the field-value. Such leading or trailing LWS MAY be
+ removed without changing the semantics of the field value. Any LWS
+ that occurs between field-content MAY be replaced with a single SP
+ before interpreting the field value or forwarding the message
+ downstream.
+
+ The order in which header fields with differing field names are
+ received is not significant. However, it is "good practice" to send
+ general-header fields first, followed by request-header or response-
+ header fields, and ending with the entity-header fields.
+
+ Multiple message-header fields with the same field-name MAY be
+ present in a message if and only if the entire field-value for that
+ header field is defined as a comma-separated list [i.e., #(values)].
+ It MUST be possible to combine the multiple header fields into one
+ "field-name: field-value" pair, without changing the semantics of the
+ message, by appending each subsequent field-value to the first, each
+ separated by a comma. The order in which header fields with the same
+ field-name are received is therefore significant to the
+ interpretation of the combined field value, and thus a proxy MUST NOT
+ change the order of these field values when a message is forwarded.
+
+4.3 Message Body
+
+ The message-body (if any) of an HTTP message is used to carry the
+ entity-body associated with the request or response. The message-body
+ differs from the entity-body only when a transfer-coding has been
+ applied, as indicated by the Transfer-Encoding header field (section
+ 14.41).
+
+ message-body = entity-body
+ | <entity-body encoded as per Transfer-Encoding>
+
+ Transfer-Encoding MUST be used to indicate any transfer-codings
+ applied by an application to ensure safe and proper transfer of the
+ message. Transfer-Encoding is a property of the message, not of the
+
+
+
+Fielding, et al. Standards Track [Page 32]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ entity, and thus MAY be added or removed by any application along the
+ request/response chain. (However, section 3.6 places restrictions on
+ when certain transfer-codings may be used.)
+
+ The rules for when a message-body is allowed in a message differ for
+ requests and responses.
+
+ The presence of a message-body in a request is signaled by the
+ inclusion of a Content-Length or Transfer-Encoding header field in
+ the request's message-headers. A message-body MUST NOT be included in
+ a request if the specification of the request method (section 5.1.1)
+ does not allow sending an entity-body in requests. A server SHOULD
+ read and forward a message-body on any request; if the request method
+ does not include defined semantics for an entity-body, then the
+ message-body SHOULD be ignored when handling the request.
+
+ For response messages, whether or not a message-body is included with
+ a message is dependent on both the request method and the response
+ status code (section 6.1.1). All responses to the HEAD request method
+ MUST NOT include a message-body, even though the presence of entity-
+ header fields might lead one to believe they do. All 1xx
+ (informational), 204 (no content), and 304 (not modified) responses
+ MUST NOT include a message-body. All other responses do include a
+ message-body, although it MAY be of zero length.
+
+4.4 Message Length
+
+ The transfer-length of a message is the length of the message-body as
+ it appears in the message; that is, after any transfer-codings have
+ been applied. When a message-body is included with a message, the
+ transfer-length of that body is determined by one of the following
+ (in order of precedence):
+
+ 1.Any response message which "MUST NOT" include a message-body (such
+ as the 1xx, 204, and 304 responses and any response to a HEAD
+ request) is always terminated by the first empty line after the
+ header fields, regardless of the entity-header fields present in
+ the message.
+
+ 2.If a Transfer-Encoding header field (section 14.41) is present and
+ has any value other than "identity", then the transfer-length is
+ defined by use of the "chunked" transfer-coding (section 3.6),
+ unless the message is terminated by closing the connection.
+
+ 3.If a Content-Length header field (section 14.13) is present, its
+ decimal value in OCTETs represents both the entity-length and the
+ transfer-length. The Content-Length header field MUST NOT be sent
+ if these two lengths are different (i.e., if a Transfer-Encoding
+
+
+
+Fielding, et al. Standards Track [Page 33]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ header field is present). If a message is received with both a
+ Transfer-Encoding header field and a Content-Length header field,
+ the latter MUST be ignored.
+
+ 4.If the message uses the media type "multipart/byteranges", and the
+ ransfer-length is not otherwise specified, then this self-
+ elimiting media type defines the transfer-length. This media type
+ UST NOT be used unless the sender knows that the recipient can arse
+ it; the presence in a request of a Range header with ultiple byte-
+ range specifiers from a 1.1 client implies that the lient can parse
+ multipart/byteranges responses.
+
+ A range header might be forwarded by a 1.0 proxy that does not
+ understand multipart/byteranges; in this case the server MUST
+ delimit the message using methods defined in items 1,3 or 5 of
+ this section.
+
+ 5.By the server closing the connection. (Closing the connection
+ cannot be used to indicate the end of a request body, since that
+ would leave no possibility for the server to send back a response.)
+
+ For compatibility with HTTP/1.0 applications, HTTP/1.1 requests
+ containing a message-body MUST include a valid Content-Length header
+ field unless the server is known to be HTTP/1.1 compliant. If a
+ request contains a message-body and a Content-Length is not given,
+ the server SHOULD respond with 400 (bad request) if it cannot
+ determine the length of the message, or with 411 (length required) if
+ it wishes to insist on receiving a valid Content-Length.
+
+ All HTTP/1.1 applications that receive entities MUST accept the
+ "chunked" transfer-coding (section 3.6), thus allowing this mechanism
+ to be used for messages when the message length cannot be determined
+ in advance.
+
+ Messages MUST NOT include both a Content-Length header field and a
+ non-identity transfer-coding. If the message does include a non-
+ identity transfer-coding, the Content-Length MUST be ignored.
+
+ When a Content-Length is given in a message where a message-body is
+ allowed, its field value MUST exactly match the number of OCTETs in
+ the message-body. HTTP/1.1 user agents MUST notify the user when an
+ invalid length is received and detected.
+
+4.5 General Header Fields
+
+ There are a few header fields which have general applicability for
+ both request and response messages, but which do not apply to the
+ entity being transferred. These header fields apply only to the
+
+
+
+Fielding, et al. Standards Track [Page 34]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ message being transmitted.
+
+ general-header = Cache-Control ; Section 14.9
+ | Connection ; Section 14.10
+ | Date ; Section 14.18
+ | Pragma ; Section 14.32
+ | Trailer ; Section 14.40
+ | Transfer-Encoding ; Section 14.41
+ | Upgrade ; Section 14.42
+ | Via ; Section 14.45
+ | Warning ; Section 14.46
+
+ General-header field names can be extended reliably only in
+ combination with a change in the protocol version. However, new or
+ experimental header fields may be given the semantics of general
+ header fields if all parties in the communication recognize them to
+ be general-header fields. Unrecognized header fields are treated as
+ entity-header fields.
+
+5 Request
+
+ A request message from a client to a server includes, within the
+ first line of that message, the method to be applied to the resource,
+ the identifier of the resource, and the protocol version in use.
+
+ Request = Request-Line ; Section 5.1
+ *(( general-header ; Section 4.5
+ | request-header ; Section 5.3
+ | entity-header ) CRLF) ; Section 7.1
+ CRLF
+ [ message-body ] ; Section 4.3
+
+5.1 Request-Line
+
+ The Request-Line begins with a method token, followed by the
+ Request-URI and the protocol version, and ending with CRLF. The
+ elements are separated by SP characters. No CR or LF is allowed
+ except in the final CRLF sequence.
+
+ Request-Line = Method SP Request-URI SP HTTP-Version CRLF
+
+
+
+
+
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 35]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+5.1.1 Method
+
+ The Method token indicates the method to be performed on the
+ resource identified by the Request-URI. The method is case-sensitive.
+
+ Method = "OPTIONS" ; Section 9.2
+ | "GET" ; Section 9.3
+ | "HEAD" ; Section 9.4
+ | "POST" ; Section 9.5
+ | "PUT" ; Section 9.6
+ | "DELETE" ; Section 9.7
+ | "TRACE" ; Section 9.8
+ | "CONNECT" ; Section 9.9
+ | extension-method
+ extension-method = token
+
+ The list of methods allowed by a resource can be specified in an
+ Allow header field (section 14.7). The return code of the response
+ always notifies the client whether a method is currently allowed on a
+ resource, since the set of allowed methods can change dynamically. An
+ origin server SHOULD return the status code 405 (Method Not Allowed)
+ if the method is known by the origin server but not allowed for the
+ requested resource, and 501 (Not Implemented) if the method is
+ unrecognized or not implemented by the origin server. The methods GET
+ and HEAD MUST be supported by all general-purpose servers. All other
+ methods are OPTIONAL; however, if the above methods are implemented,
+ they MUST be implemented with the same semantics as those specified
+ in section 9.
+
+5.1.2 Request-URI
+
+ The Request-URI is a Uniform Resource Identifier (section 3.2) and
+ identifies the resource upon which to apply the request.
+
+ Request-URI = "*" | absoluteURI | abs_path | authority
+
+ The four options for Request-URI are dependent on the nature of the
+ request. The asterisk "*" means that the request does not apply to a
+ particular resource, but to the server itself, and is only allowed
+ when the method used does not necessarily apply to a resource. One
+ example would be
+
+ OPTIONS * HTTP/1.1
+
+ The absoluteURI form is REQUIRED when the request is being made to a
+ proxy. The proxy is requested to forward the request or service it
+ from a valid cache, and return the response. Note that the proxy MAY
+ forward the request on to another proxy or directly to the server
+
+
+
+Fielding, et al. Standards Track [Page 36]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ specified by the absoluteURI. In order to avoid request loops, a
+ proxy MUST be able to recognize all of its server names, including
+ any aliases, local variations, and the numeric IP address. An example
+ Request-Line would be:
+
+ GET http://www.w3.org/pub/WWW/TheProject.html HTTP/1.1
+
+ To allow for transition to absoluteURIs in all requests in future
+ versions of HTTP, all HTTP/1.1 servers MUST accept the absoluteURI
+ form in requests, even though HTTP/1.1 clients will only generate
+ them in requests to proxies.
+
+ The authority form is only used by the CONNECT method (section 9.9).
+
+ The most common form of Request-URI is that used to identify a
+ resource on an origin server or gateway. In this case the absolute
+ path of the URI MUST be transmitted (see section 3.2.1, abs_path) as
+ the Request-URI, and the network location of the URI (authority) MUST
+ be transmitted in a Host header field. For example, a client wishing
+ to retrieve the resource above directly from the origin server would
+ create a TCP connection to port 80 of the host "www.w3.org" and send
+ the lines:
+
+ GET /pub/WWW/TheProject.html HTTP/1.1
+ Host: www.w3.org
+
+ followed by the remainder of the Request. Note that the absolute path
+ cannot be empty; if none is present in the original URI, it MUST be
+ given as "/" (the server root).
+
+ The Request-URI is transmitted in the format specified in section
+ 3.2.1. If the Request-URI is encoded using the "% HEX HEX" encoding
+ [42], the origin server MUST decode the Request-URI in order to
+ properly interpret the request. Servers SHOULD respond to invalid
+ Request-URIs with an appropriate status code.
+
+ A transparent proxy MUST NOT rewrite the "abs_path" part of the
+ received Request-URI when forwarding it to the next inbound server,
+ except as noted above to replace a null abs_path with "/".
+
+ Note: The "no rewrite" rule prevents the proxy from changing the
+ meaning of the request when the origin server is improperly using
+ a non-reserved URI character for a reserved purpose. Implementors
+ should be aware that some pre-HTTP/1.1 proxies have been known to
+ rewrite the Request-URI.
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 37]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+5.2 The Resource Identified by a Request
+
+ The exact resource identified by an Internet request is determined by
+ examining both the Request-URI and the Host header field.
+
+ An origin server that does not allow resources to differ by the
+ requested host MAY ignore the Host header field value when
+ determining the resource identified by an HTTP/1.1 request. (But see
+ section 19.6.1.1 for other requirements on Host support in HTTP/1.1.)
+
+ An origin server that does differentiate resources based on the host
+ requested (sometimes referred to as virtual hosts or vanity host
+ names) MUST use the following rules for determining the requested
+ resource on an HTTP/1.1 request:
+
+ 1. If Request-URI is an absoluteURI, the host is part of the
+ Request-URI. Any Host header field value in the request MUST be
+ ignored.
+
+ 2. If the Request-URI is not an absoluteURI, and the request includes
+ a Host header field, the host is determined by the Host header
+ field value.
+
+ 3. If the host as determined by rule 1 or 2 is not a valid host on
+ the server, the response MUST be a 400 (Bad Request) error message.
+
+ Recipients of an HTTP/1.0 request that lacks a Host header field MAY
+ attempt to use heuristics (e.g., examination of the URI path for
+ something unique to a particular host) in order to determine what
+ exact resource is being requested.
+
+5.3 Request Header Fields
+
+ The request-header fields allow the client to pass additional
+ information about the request, and about the client itself, to the
+ server. These fields act as request modifiers, with semantics
+ equivalent to the parameters on a programming language method
+ invocation.
+
+ request-header = Accept ; Section 14.1
+ | Accept-Charset ; Section 14.2
+ | Accept-Encoding ; Section 14.3
+ | Accept-Language ; Section 14.4
+ | Authorization ; Section 14.8
+ | Expect ; Section 14.20
+ | From ; Section 14.22
+ | Host ; Section 14.23
+ | If-Match ; Section 14.24
+
+
+
+Fielding, et al. Standards Track [Page 38]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ | If-Modified-Since ; Section 14.25
+ | If-None-Match ; Section 14.26
+ | If-Range ; Section 14.27
+ | If-Unmodified-Since ; Section 14.28
+ | Max-Forwards ; Section 14.31
+ | Proxy-Authorization ; Section 14.34
+ | Range ; Section 14.35
+ | Referer ; Section 14.36
+ | TE ; Section 14.39
+ | User-Agent ; Section 14.43
+
+ Request-header field names can be extended reliably only in
+ combination with a change in the protocol version. However, new or
+ experimental header fields MAY be given the semantics of request-
+ header fields if all parties in the communication recognize them to
+ be request-header fields. Unrecognized header fields are treated as
+ entity-header fields.
+
+6 Response
+
+ After receiving and interpreting a request message, a server responds
+ with an HTTP response message.
+
+ Response = Status-Line ; Section 6.1
+ *(( general-header ; Section 4.5
+ | response-header ; Section 6.2
+ | entity-header ) CRLF) ; Section 7.1
+ CRLF
+ [ message-body ] ; Section 7.2
+
+6.1 Status-Line
+
+ The first line of a Response message is the Status-Line, consisting
+ of the protocol version followed by a numeric status code and its
+ associated textual phrase, with each element separated by SP
+ characters. No CR or LF is allowed except in the final CRLF sequence.
+
+ Status-Line = HTTP-Version SP Status-Code SP Reason-Phrase CRLF
+
+6.1.1 Status Code and Reason Phrase
+
+ The Status-Code element is a 3-digit integer result code of the
+ attempt to understand and satisfy the request. These codes are fully
+ defined in section 10. The Reason-Phrase is intended to give a short
+ textual description of the Status-Code. The Status-Code is intended
+ for use by automata and the Reason-Phrase is intended for the human
+ user. The client is not required to examine or display the Reason-
+ Phrase.
+
+
+
+Fielding, et al. Standards Track [Page 39]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ The first digit of the Status-Code defines the class of response. The
+ last two digits do not have any categorization role. There are 5
+ values for the first digit:
+
+ - 1xx: Informational - Request received, continuing process
+
+ - 2xx: Success - The action was successfully received,
+ understood, and accepted
+
+ - 3xx: Redirection - Further action must be taken in order to
+ complete the request
+
+ - 4xx: Client Error - The request contains bad syntax or cannot
+ be fulfilled
+
+ - 5xx: Server Error - The server failed to fulfill an apparently
+ valid request
+
+ The individual values of the numeric status codes defined for
+ HTTP/1.1, and an example set of corresponding Reason-Phrase's, are
+ presented below. The reason phrases listed here are only
+ recommendations -- they MAY be replaced by local equivalents without
+ affecting the protocol.
+
+ Status-Code =
+ "100" ; Section 10.1.1: Continue
+ | "101" ; Section 10.1.2: Switching Protocols
+ | "200" ; Section 10.2.1: OK
+ | "201" ; Section 10.2.2: Created
+ | "202" ; Section 10.2.3: Accepted
+ | "203" ; Section 10.2.4: Non-Authoritative Information
+ | "204" ; Section 10.2.5: No Content
+ | "205" ; Section 10.2.6: Reset Content
+ | "206" ; Section 10.2.7: Partial Content
+ | "300" ; Section 10.3.1: Multiple Choices
+ | "301" ; Section 10.3.2: Moved Permanently
+ | "302" ; Section 10.3.3: Found
+ | "303" ; Section 10.3.4: See Other
+ | "304" ; Section 10.3.5: Not Modified
+ | "305" ; Section 10.3.6: Use Proxy
+ | "307" ; Section 10.3.8: Temporary Redirect
+ | "400" ; Section 10.4.1: Bad Request
+ | "401" ; Section 10.4.2: Unauthorized
+ | "402" ; Section 10.4.3: Payment Required
+ | "403" ; Section 10.4.4: Forbidden
+ | "404" ; Section 10.4.5: Not Found
+ | "405" ; Section 10.4.6: Method Not Allowed
+ | "406" ; Section 10.4.7: Not Acceptable
+
+
+
+Fielding, et al. Standards Track [Page 40]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ | "407" ; Section 10.4.8: Proxy Authentication Required
+ | "408" ; Section 10.4.9: Request Time-out
+ | "409" ; Section 10.4.10: Conflict
+ | "410" ; Section 10.4.11: Gone
+ | "411" ; Section 10.4.12: Length Required
+ | "412" ; Section 10.4.13: Precondition Failed
+ | "413" ; Section 10.4.14: Request Entity Too Large
+ | "414" ; Section 10.4.15: Request-URI Too Large
+ | "415" ; Section 10.4.16: Unsupported Media Type
+ | "416" ; Section 10.4.17: Requested range not satisfiable
+ | "417" ; Section 10.4.18: Expectation Failed
+ | "500" ; Section 10.5.1: Internal Server Error
+ | "501" ; Section 10.5.2: Not Implemented
+ | "502" ; Section 10.5.3: Bad Gateway
+ | "503" ; Section 10.5.4: Service Unavailable
+ | "504" ; Section 10.5.5: Gateway Time-out
+ | "505" ; Section 10.5.6: HTTP Version not supported
+ | extension-code
+
+ extension-code = 3DIGIT
+ Reason-Phrase = *<TEXT, excluding CR, LF>
+
+ HTTP status codes are extensible. HTTP applications are not required
+ to understand the meaning of all registered status codes, though such
+ understanding is obviously desirable. However, applications MUST
+ understand the class of any status code, as indicated by the first
+ digit, and treat any unrecognized response as being equivalent to the
+ x00 status code of that class, with the exception that an
+ unrecognized response MUST NOT be cached. For example, if an
+ unrecognized status code of 431 is received by the client, it can
+ safely assume that there was something wrong with its request and
+ treat the response as if it had received a 400 status code. In such
+ cases, user agents SHOULD present to the user the entity returned
+ with the response, since that entity is likely to include human-
+ readable information which will explain the unusual status.
+
+6.2 Response Header Fields
+
+ The response-header fields allow the server to pass additional
+ information about the response which cannot be placed in the Status-
+ Line. These header fields give information about the server and about
+ further access to the resource identified by the Request-URI.
+
+ response-header = Accept-Ranges ; Section 14.5
+ | Age ; Section 14.6
+ | ETag ; Section 14.19
+ | Location ; Section 14.30
+ | Proxy-Authenticate ; Section 14.33
+
+
+
+Fielding, et al. Standards Track [Page 41]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ | Retry-After ; Section 14.37
+ | Server ; Section 14.38
+ | Vary ; Section 14.44
+ | WWW-Authenticate ; Section 14.47
+
+ Response-header field names can be extended reliably only in
+ combination with a change in the protocol version. However, new or
+ experimental header fields MAY be given the semantics of response-
+ header fields if all parties in the communication recognize them to
+ be response-header fields. Unrecognized header fields are treated as
+ entity-header fields.
+
+7 Entity
+
+ Request and Response messages MAY transfer an entity if not otherwise
+ restricted by the request method or response status code. An entity
+ consists of entity-header fields and an entity-body, although some
+ responses will only include the entity-headers.
+
+ In this section, both sender and recipient refer to either the client
+ or the server, depending on who sends and who receives the entity.
+
+7.1 Entity Header Fields
+
+ Entity-header fields define metainformation about the entity-body or,
+ if no body is present, about the resource identified by the request.
+ Some of this metainformation is OPTIONAL; some might be REQUIRED by
+ portions of this specification.
+
+ entity-header = Allow ; Section 14.7
+ | Content-Encoding ; Section 14.11
+ | Content-Language ; Section 14.12
+ | Content-Length ; Section 14.13
+ | Content-Location ; Section 14.14
+ | Content-MD5 ; Section 14.15
+ | Content-Range ; Section 14.16
+ | Content-Type ; Section 14.17
+ | Expires ; Section 14.21
+ | Last-Modified ; Section 14.29
+ | extension-header
+
+ extension-header = message-header
+
+ The extension-header mechanism allows additional entity-header fields
+ to be defined without changing the protocol, but these fields cannot
+ be assumed to be recognizable by the recipient. Unrecognized header
+ fields SHOULD be ignored by the recipient and MUST be forwarded by
+ transparent proxies.
+
+
+
+Fielding, et al. Standards Track [Page 42]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+7.2 Entity Body
+
+ The entity-body (if any) sent with an HTTP request or response is in
+ a format and encoding defined by the entity-header fields.
+
+ entity-body = *OCTET
+
+ An entity-body is only present in a message when a message-body is
+ present, as described in section 4.3. The entity-body is obtained
+ from the message-body by decoding any Transfer-Encoding that might
+ have been applied to ensure safe and proper transfer of the message.
+
+7.2.1 Type
+
+ When an entity-body is included with a message, the data type of that
+ body is determined via the header fields Content-Type and Content-
+ Encoding. These define a two-layer, ordered encoding model:
+
+ entity-body := Content-Encoding( Content-Type( data ) )
+
+ Content-Type specifies the media type of the underlying data.
+ Content-Encoding may be used to indicate any additional content
+ codings applied to the data, usually for the purpose of data
+ compression, that are a property of the requested resource. There is
+ no default encoding.
+
+ Any HTTP/1.1 message containing an entity-body SHOULD include a
+ Content-Type header field defining the media type of that body. If
+ and only if the media type is not given by a Content-Type field, the
+ recipient MAY attempt to guess the media type via inspection of its
+ content and/or the name extension(s) of the URI used to identify the
+ resource. If the media type remains unknown, the recipient SHOULD
+ treat it as type "application/octet-stream".
+
+7.2.2 Entity Length
+
+ The entity-length of a message is the length of the message-body
+ before any transfer-codings have been applied. Section 4.4 defines
+ how the transfer-length of a message-body is determined.
+
+
+
+
+
+
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 43]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+8 Connections
+
+8.1 Persistent Connections
+
+8.1.1 Purpose
+
+ Prior to persistent connections, a separate TCP connection was
+ established to fetch each URL, increasing the load on HTTP servers
+ and causing congestion on the Internet. The use of inline images and
+ other associated data often require a client to make multiple
+ requests of the same server in a short amount of time. Analysis of
+ these performance problems and results from a prototype
+ implementation are available [26] [30]. Implementation experience and
+ measurements of actual HTTP/1.1 (RFC 2068) implementations show good
+ results [39]. Alternatives have also been explored, for example,
+ T/TCP [27].
+
+ Persistent HTTP connections have a number of advantages:
+
+ - By opening and closing fewer TCP connections, CPU time is saved
+ in routers and hosts (clients, servers, proxies, gateways,
+ tunnels, or caches), and memory used for TCP protocol control
+ blocks can be saved in hosts.
+
+ - HTTP requests and responses can be pipelined on a connection.
+ Pipelining allows a client to make multiple requests without
+ waiting for each response, allowing a single TCP connection to
+ be used much more efficiently, with much lower elapsed time.
+
+ - Network congestion is reduced by reducing the number of packets
+ caused by TCP opens, and by allowing TCP sufficient time to
+ determine the congestion state of the network.
+
+ - Latency on subsequent requests is reduced since there is no time
+ spent in TCP's connection opening handshake.
+
+ - HTTP can evolve more gracefully, since errors can be reported
+ without the penalty of closing the TCP connection. Clients using
+ future versions of HTTP might optimistically try a new feature,
+ but if communicating with an older server, retry with old
+ semantics after an error is reported.
+
+ HTTP implementations SHOULD implement persistent connections.
+
+
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 44]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+8.1.2 Overall Operation
+
+ A significant difference between HTTP/1.1 and earlier versions of
+ HTTP is that persistent connections are the default behavior of any
+ HTTP connection. That is, unless otherwise indicated, the client
+ SHOULD assume that the server will maintain a persistent connection,
+ even after error responses from the server.
+
+ Persistent connections provide a mechanism by which a client and a
+ server can signal the close of a TCP connection. This signaling takes
+ place using the Connection header field (section 14.10). Once a close
+ has been signaled, the client MUST NOT send any more requests on that
+ connection.
+
+8.1.2.1 Negotiation
+
+ An HTTP/1.1 server MAY assume that a HTTP/1.1 client intends to
+ maintain a persistent connection unless a Connection header including
+ the connection-token "close" was sent in the request. If the server
+ chooses to close the connection immediately after sending the
+ response, it SHOULD send a Connection header including the
+ connection-token close.
+
+ An HTTP/1.1 client MAY expect a connection to remain open, but would
+ decide to keep it open based on whether the response from a server
+ contains a Connection header with the connection-token close. In case
+ the client does not want to maintain a connection for more than that
+ request, it SHOULD send a Connection header including the
+ connection-token close.
+
+ If either the client or the server sends the close token in the
+ Connection header, that request becomes the last one for the
+ connection.
+
+ Clients and servers SHOULD NOT assume that a persistent connection is
+ maintained for HTTP versions less than 1.1 unless it is explicitly
+ signaled. See section 19.6.2 for more information on backward
+ compatibility with HTTP/1.0 clients.
+
+ In order to remain persistent, all messages on the connection MUST
+ have a self-defined message length (i.e., one not defined by closure
+ of the connection), as described in section 4.4.
+
+
+
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 45]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+8.1.2.2 Pipelining
+
+ A client that supports persistent connections MAY "pipeline" its
+ requests (i.e., send multiple requests without waiting for each
+ response). A server MUST send its responses to those requests in the
+ same order that the requests were received.
+
+ Clients which assume persistent connections and pipeline immediately
+ after connection establishment SHOULD be prepared to retry their
+ connection if the first pipelined attempt fails. If a client does
+ such a retry, it MUST NOT pipeline before it knows the connection is
+ persistent. Clients MUST also be prepared to resend their requests if
+ the server closes the connection before sending all of the
+ corresponding responses.
+
+ Clients SHOULD NOT pipeline requests using non-idempotent methods or
+ non-idempotent sequences of methods (see section 9.1.2). Otherwise, a
+ premature termination of the transport connection could lead to
+ indeterminate results. A client wishing to send a non-idempotent
+ request SHOULD wait to send that request until it has received the
+ response status for the previous request.
+
+8.1.3 Proxy Servers
+
+ It is especially important that proxies correctly implement the
+ properties of the Connection header field as specified in section
+ 14.10.
+
+ The proxy server MUST signal persistent connections separately with
+ its clients and the origin servers (or other proxy servers) that it
+ connects to. Each persistent connection applies to only one transport
+ link.
+
+ A proxy server MUST NOT establish a HTTP/1.1 persistent connection
+ with an HTTP/1.0 client (but see RFC 2068 [33] for information and
+ discussion of the problems with the Keep-Alive header implemented by
+ many HTTP/1.0 clients).
+
+8.1.4 Practical Considerations
+
+ Servers will usually have some time-out value beyond which they will
+ no longer maintain an inactive connection. Proxy servers might make
+ this a higher value since it is likely that the client will be making
+ more connections through the same server. The use of persistent
+ connections places no requirements on the length (or existence) of
+ this time-out for either the client or the server.
+
+
+
+
+
+Fielding, et al. Standards Track [Page 46]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ When a client or server wishes to time-out it SHOULD issue a graceful
+ close on the transport connection. Clients and servers SHOULD both
+ constantly watch for the other side of the transport close, and
+ respond to it as appropriate. If a client or server does not detect
+ the other side's close promptly it could cause unnecessary resource
+ drain on the network.
+
+ A client, server, or proxy MAY close the transport connection at any
+ time. For example, a client might have started to send a new request
+ at the same time that the server has decided to close the "idle"
+ connection. From the server's point of view, the connection is being
+ closed while it was idle, but from the client's point of view, a
+ request is in progress.
+
+ This means that clients, servers, and proxies MUST be able to recover
+ from asynchronous close events. Client software SHOULD reopen the
+ transport connection and retransmit the aborted sequence of requests
+ without user interaction so long as the request sequence is
+ idempotent (see section 9.1.2). Non-idempotent methods or sequences
+ MUST NOT be automatically retried, although user agents MAY offer a
+ human operator the choice of retrying the request(s). Confirmation by
+ user-agent software with semantic understanding of the application
+ MAY substitute for user confirmation. The automatic retry SHOULD NOT
+ be repeated if the second sequence of requests fails.
+
+ Servers SHOULD always respond to at least one request per connection,
+ if at all possible. Servers SHOULD NOT close a connection in the
+ middle of transmitting a response, unless a network or client failure
+ is suspected.
+
+ Clients that use persistent connections SHOULD limit the number of
+ simultaneous connections that they maintain to a given server. A
+ single-user client SHOULD NOT maintain more than 2 connections with
+ any server or proxy. A proxy SHOULD use up to 2*N connections to
+ another server or proxy, where N is the number of simultaneously
+ active users. These guidelines are intended to improve HTTP response
+ times and avoid congestion.
+
+8.2 Message Transmission Requirements
+
+8.2.1 Persistent Connections and Flow Control
+
+ HTTP/1.1 servers SHOULD maintain persistent connections and use TCP's
+ flow control mechanisms to resolve temporary overloads, rather than
+ terminating connections with the expectation that clients will retry.
+ The latter technique can exacerbate network congestion.
+
+
+
+
+
+Fielding, et al. Standards Track [Page 47]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+8.2.2 Monitoring Connections for Error Status Messages
+
+ An HTTP/1.1 (or later) client sending a message-body SHOULD monitor
+ the network connection for an error status while it is transmitting
+ the request. If the client sees an error status, it SHOULD
+ immediately cease transmitting the body. If the body is being sent
+ using a "chunked" encoding (section 3.6), a zero length chunk and
+ empty trailer MAY be used to prematurely mark the end of the message.
+ If the body was preceded by a Content-Length header, the client MUST
+ close the connection.
+
+8.2.3 Use of the 100 (Continue) Status
+
+ The purpose of the 100 (Continue) status (see section 10.1.1) is to
+ allow a client that is sending a request message with a request body
+ to determine if the origin server is willing to accept the request
+ (based on the request headers) before the client sends the request
+ body. In some cases, it might either be inappropriate or highly
+ inefficient for the client to send the body if the server will reject
+ the message without looking at the body.
+
+ Requirements for HTTP/1.1 clients:
+
+ - If a client will wait for a 100 (Continue) response before
+ sending the request body, it MUST send an Expect request-header
+ field (section 14.20) with the "100-continue" expectation.
+
+ - A client MUST NOT send an Expect request-header field (section
+ 14.20) with the "100-continue" expectation if it does not intend
+ to send a request body.
+
+ Because of the presence of older implementations, the protocol allows
+ ambiguous situations in which a client may send "Expect: 100-
+ continue" without receiving either a 417 (Expectation Failed) status
+ or a 100 (Continue) status. Therefore, when a client sends this
+ header field to an origin server (possibly via a proxy) from which it
+ has never seen a 100 (Continue) status, the client SHOULD NOT wait
+ for an indefinite period before sending the request body.
+
+ Requirements for HTTP/1.1 origin servers:
+
+ - Upon receiving a request which includes an Expect request-header
+ field with the "100-continue" expectation, an origin server MUST
+ either respond with 100 (Continue) status and continue to read
+ from the input stream, or respond with a final status code. The
+ origin server MUST NOT wait for the request body before sending
+ the 100 (Continue) response. If it responds with a final status
+ code, it MAY close the transport connection or it MAY continue
+
+
+
+Fielding, et al. Standards Track [Page 48]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ to read and discard the rest of the request. It MUST NOT
+ perform the requested method if it returns a final status code.
+
+ - An origin server SHOULD NOT send a 100 (Continue) response if
+ the request message does not include an Expect request-header
+ field with the "100-continue" expectation, and MUST NOT send a
+ 100 (Continue) response if such a request comes from an HTTP/1.0
+ (or earlier) client. There is an exception to this rule: for
+ compatibility with RFC 2068, a server MAY send a 100 (Continue)
+ status in response to an HTTP/1.1 PUT or POST request that does
+ not include an Expect request-header field with the "100-
+ continue" expectation. This exception, the purpose of which is
+ to minimize any client processing delays associated with an
+ undeclared wait for 100 (Continue) status, applies only to
+ HTTP/1.1 requests, and not to requests with any other HTTP-
+ version value.
+
+ - An origin server MAY omit a 100 (Continue) response if it has
+ already received some or all of the request body for the
+ corresponding request.
+
+ - An origin server that sends a 100 (Continue) response MUST
+ ultimately send a final status code, once the request body is
+ received and processed, unless it terminates the transport
+ connection prematurely.
+
+ - If an origin server receives a request that does not include an
+ Expect request-header field with the "100-continue" expectation,
+ the request includes a request body, and the server responds
+ with a final status code before reading the entire request body
+ from the transport connection, then the server SHOULD NOT close
+ the transport connection until it has read the entire request,
+ or until the client closes the connection. Otherwise, the client
+ might not reliably receive the response message. However, this
+ requirement is not be construed as preventing a server from
+ defending itself against denial-of-service attacks, or from
+ badly broken client implementations.
+
+ Requirements for HTTP/1.1 proxies:
+
+ - If a proxy receives a request that includes an Expect request-
+ header field with the "100-continue" expectation, and the proxy
+ either knows that the next-hop server complies with HTTP/1.1 or
+ higher, or does not know the HTTP version of the next-hop
+ server, it MUST forward the request, including the Expect header
+ field.
+
+
+
+
+
+Fielding, et al. Standards Track [Page 49]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ - If the proxy knows that the version of the next-hop server is
+ HTTP/1.0 or lower, it MUST NOT forward the request, and it MUST
+ respond with a 417 (Expectation Failed) status.
+
+ - Proxies SHOULD maintain a cache recording the HTTP version
+ numbers received from recently-referenced next-hop servers.
+
+ - A proxy MUST NOT forward a 100 (Continue) response if the
+ request message was received from an HTTP/1.0 (or earlier)
+ client and did not include an Expect request-header field with
+ the "100-continue" expectation. This requirement overrides the
+ general rule for forwarding of 1xx responses (see section 10.1).
+
+8.2.4 Client Behavior if Server Prematurely Closes Connection
+
+ If an HTTP/1.1 client sends a request which includes a request body,
+ but which does not include an Expect request-header field with the
+ "100-continue" expectation, and if the client is not directly
+ connected to an HTTP/1.1 origin server, and if the client sees the
+ connection close before receiving any status from the server, the
+ client SHOULD retry the request. If the client does retry this
+ request, it MAY use the following "binary exponential backoff"
+ algorithm to be assured of obtaining a reliable response:
+
+ 1. Initiate a new connection to the server
+
+ 2. Transmit the request-headers
+
+ 3. Initialize a variable R to the estimated round-trip time to the
+ server (e.g., based on the time it took to establish the
+ connection), or to a constant value of 5 seconds if the round-
+ trip time is not available.
+
+ 4. Compute T = R * (2**N), where N is the number of previous
+ retries of this request.
+
+ 5. Wait either for an error response from the server, or for T
+ seconds (whichever comes first)
+
+ 6. If no error response is received, after T seconds transmit the
+ body of the request.
+
+ 7. If client sees that the connection is closed prematurely,
+ repeat from step 1 until the request is accepted, an error
+ response is received, or the user becomes impatient and
+ terminates the retry process.
+
+
+
+
+
+Fielding, et al. Standards Track [Page 50]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ If at any point an error status is received, the client
+
+ - SHOULD NOT continue and
+
+ - SHOULD close the connection if it has not completed sending the
+ request message.
+
+9 Method Definitions
+
+ The set of common methods for HTTP/1.1 is defined below. Although
+ this set can be expanded, additional methods cannot be assumed to
+ share the same semantics for separately extended clients and servers.
+
+ The Host request-header field (section 14.23) MUST accompany all
+ HTTP/1.1 requests.
+
+9.1 Safe and Idempotent Methods
+
+9.1.1 Safe Methods
+
+ Implementors should be aware that the software represents the user in
+ their interactions over the Internet, and should be careful to allow
+ the user to be aware of any actions they might take which may have an
+ unexpected significance to themselves or others.
+
+ In particular, the convention has been established that the GET and
+ HEAD methods SHOULD NOT have the significance of taking an action
+ other than retrieval. These methods ought to be considered "safe".
+ This allows user agents to represent other methods, such as POST, PUT
+ and DELETE, in a special way, so that the user is made aware of the
+ fact that a possibly unsafe action is being requested.
+
+ Naturally, it is not possible to ensure that the server does not
+ generate side-effects as a result of performing a GET request; in
+ fact, some dynamic resources consider that a feature. The important
+ distinction here is that the user did not request the side-effects,
+ so therefore cannot be held accountable for them.
+
+9.1.2 Idempotent Methods
+
+ Methods can also have the property of "idempotence" in that (aside
+ from error or expiration issues) the side-effects of N > 0 identical
+ requests is the same as for a single request. The methods GET, HEAD,
+ PUT and DELETE share this property. Also, the methods OPTIONS and
+ TRACE SHOULD NOT have side effects, and so are inherently idempotent.
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 51]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ However, it is possible that a sequence of several requests is non-
+ idempotent, even if all of the methods executed in that sequence are
+ idempotent. (A sequence is idempotent if a single execution of the
+ entire sequence always yields a result that is not changed by a
+ reexecution of all, or part, of that sequence.) For example, a
+ sequence is non-idempotent if its result depends on a value that is
+ later modified in the same sequence.
+
+ A sequence that never has side effects is idempotent, by definition
+ (provided that no concurrent operations are being executed on the
+ same set of resources).
+
+9.2 OPTIONS
+
+ The OPTIONS method represents a request for information about the
+ communication options available on the request/response chain
+ identified by the Request-URI. This method allows the client to
+ determine the options and/or requirements associated with a resource,
+ or the capabilities of a server, without implying a resource action
+ or initiating a resource retrieval.
+
+ Responses to this method are not cacheable.
+
+ If the OPTIONS request includes an entity-body (as indicated by the
+ presence of Content-Length or Transfer-Encoding), then the media type
+ MUST be indicated by a Content-Type field. Although this
+ specification does not define any use for such a body, future
+ extensions to HTTP might use the OPTIONS body to make more detailed
+ queries on the server. A server that does not support such an
+ extension MAY discard the request body.
+
+ If the Request-URI is an asterisk ("*"), the OPTIONS request is
+ intended to apply to the server in general rather than to a specific
+ resource. Since a server's communication options typically depend on
+ the resource, the "*" request is only useful as a "ping" or "no-op"
+ type of method; it does nothing beyond allowing the client to test
+ the capabilities of the server. For example, this can be used to test
+ a proxy for HTTP/1.1 compliance (or lack thereof).
+
+ If the Request-URI is not an asterisk, the OPTIONS request applies
+ only to the options that are available when communicating with that
+ resource.
+
+ A 200 response SHOULD include any header fields that indicate
+ optional features implemented by the server and applicable to that
+ resource (e.g., Allow), possibly including extensions not defined by
+ this specification. The response body, if any, SHOULD also include
+ information about the communication options. The format for such a
+
+
+
+Fielding, et al. Standards Track [Page 52]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ body is not defined by this specification, but might be defined by
+ future extensions to HTTP. Content negotiation MAY be used to select
+ the appropriate response format. If no response body is included, the
+ response MUST include a Content-Length field with a field-value of
+ "0".
+
+ The Max-Forwards request-header field MAY be used to target a
+ specific proxy in the request chain. When a proxy receives an OPTIONS
+ request on an absoluteURI for which request forwarding is permitted,
+ the proxy MUST check for a Max-Forwards field. If the Max-Forwards
+ field-value is zero ("0"), the proxy MUST NOT forward the message;
+ instead, the proxy SHOULD respond with its own communication options.
+ If the Max-Forwards field-value is an integer greater than zero, the
+ proxy MUST decrement the field-value when it forwards the request. If
+ no Max-Forwards field is present in the request, then the forwarded
+ request MUST NOT include a Max-Forwards field.
+
+9.3 GET
+
+ The GET method means retrieve whatever information (in the form of an
+ entity) is identified by the Request-URI. If the Request-URI refers
+ to a data-producing process, it is the produced data which shall be
+ returned as the entity in the response and not the source text of the
+ process, unless that text happens to be the output of the process.
+
+ The semantics of the GET method change to a "conditional GET" if the
+ request message includes an If-Modified-Since, If-Unmodified-Since,
+ If-Match, If-None-Match, or If-Range header field. A conditional GET
+ method requests that the entity be transferred only under the
+ circumstances described by the conditional header field(s). The
+ conditional GET method is intended to reduce unnecessary network
+ usage by allowing cached entities to be refreshed without requiring
+ multiple requests or transferring data already held by the client.
+
+ The semantics of the GET method change to a "partial GET" if the
+ request message includes a Range header field. A partial GET requests
+ that only part of the entity be transferred, as described in section
+ 14.35. The partial GET method is intended to reduce unnecessary
+ network usage by allowing partially-retrieved entities to be
+ completed without transferring data already held by the client.
+
+ The response to a GET request is cacheable if and only if it meets
+ the requirements for HTTP caching described in section 13.
+
+ See section 15.1.3 for security considerations when used for forms.
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 53]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+9.4 HEAD
+
+ The HEAD method is identical to GET except that the server MUST NOT
+ return a message-body in the response. The metainformation contained
+ in the HTTP headers in response to a HEAD request SHOULD be identical
+ to the information sent in response to a GET request. This method can
+ be used for obtaining metainformation about the entity implied by the
+ request without transferring the entity-body itself. This method is
+ often used for testing hypertext links for validity, accessibility,
+ and recent modification.
+
+ The response to a HEAD request MAY be cacheable in the sense that the
+ information contained in the response MAY be used to update a
+ previously cached entity from that resource. If the new field values
+ indicate that the cached entity differs from the current entity (as
+ would be indicated by a change in Content-Length, Content-MD5, ETag
+ or Last-Modified), then the cache MUST treat the cache entry as
+ stale.
+
+9.5 POST
+
+ The POST method is used to request that the origin server accept the
+ entity enclosed in the request as a new subordinate of the resource
+ identified by the Request-URI in the Request-Line. POST is designed
+ to allow a uniform method to cover the following functions:
+
+ - Annotation of existing resources;
+
+ - Posting a message to a bulletin board, newsgroup, mailing list,
+ or similar group of articles;
+
+ - Providing a block of data, such as the result of submitting a
+ form, to a data-handling process;
+
+ - Extending a database through an append operation.
+
+ The actual function performed by the POST method is determined by the
+ server and is usually dependent on the Request-URI. The posted entity
+ is subordinate to that URI in the same way that a file is subordinate
+ to a directory containing it, a news article is subordinate to a
+ newsgroup to which it is posted, or a record is subordinate to a
+ database.
+
+ The action performed by the POST method might not result in a
+ resource that can be identified by a URI. In this case, either 200
+ (OK) or 204 (No Content) is the appropriate response status,
+ depending on whether or not the response includes an entity that
+ describes the result.
+
+
+
+Fielding, et al. Standards Track [Page 54]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ If a resource has been created on the origin server, the response
+ SHOULD be 201 (Created) and contain an entity which describes the
+ status of the request and refers to the new resource, and a Location
+ header (see section 14.30).
+
+ Responses to this method are not cacheable, unless the response
+ includes appropriate Cache-Control or Expires header fields. However,
+ the 303 (See Other) response can be used to direct the user agent to
+ retrieve a cacheable resource.
+
+ POST requests MUST obey the message transmission requirements set out
+ in section 8.2.
+
+ See section 15.1.3 for security considerations.
+
+9.6 PUT
+
+ The PUT method requests that the enclosed entity be stored under the
+ supplied Request-URI. If the Request-URI refers to an already
+ existing resource, the enclosed entity SHOULD be considered as a
+ modified version of the one residing on the origin server. If the
+ Request-URI does not point to an existing resource, and that URI is
+ capable of being defined as a new resource by the requesting user
+ agent, the origin server can create the resource with that URI. If a
+ new resource is created, the origin server MUST inform the user agent
+ via the 201 (Created) response. If an existing resource is modified,
+ either the 200 (OK) or 204 (No Content) response codes SHOULD be sent
+ to indicate successful completion of the request. If the resource
+ could not be created or modified with the Request-URI, an appropriate
+ error response SHOULD be given that reflects the nature of the
+ problem. The recipient of the entity MUST NOT ignore any Content-*
+ (e.g. Content-Range) headers that it does not understand or implement
+ and MUST return a 501 (Not Implemented) response in such cases.
+
+ If the request passes through a cache and the Request-URI identifies
+ one or more currently cached entities, those entries SHOULD be
+ treated as stale. Responses to this method are not cacheable.
+
+ The fundamental difference between the POST and PUT requests is
+ reflected in the different meaning of the Request-URI. The URI in a
+ POST request identifies the resource that will handle the enclosed
+ entity. That resource might be a data-accepting process, a gateway to
+ some other protocol, or a separate entity that accepts annotations.
+ In contrast, the URI in a PUT request identifies the entity enclosed
+ with the request -- the user agent knows what URI is intended and the
+ server MUST NOT attempt to apply the request to some other resource.
+ If the server desires that the request be applied to a different URI,
+
+
+
+
+Fielding, et al. Standards Track [Page 55]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ it MUST send a 301 (Moved Permanently) response; the user agent MAY
+ then make its own decision regarding whether or not to redirect the
+ request.
+
+ A single resource MAY be identified by many different URIs. For
+ example, an article might have a URI for identifying "the current
+ version" which is separate from the URI identifying each particular
+ version. In this case, a PUT request on a general URI might result in
+ several other URIs being defined by the origin server.
+
+ HTTP/1.1 does not define how a PUT method affects the state of an
+ origin server.
+
+ PUT requests MUST obey the message transmission requirements set out
+ in section 8.2.
+
+ Unless otherwise specified for a particular entity-header, the
+ entity-headers in the PUT request SHOULD be applied to the resource
+ created or modified by the PUT.
+
+9.7 DELETE
+
+ The DELETE method requests that the origin server delete the resource
+ identified by the Request-URI. This method MAY be overridden by human
+ intervention (or other means) on the origin server. The client cannot
+ be guaranteed that the operation has been carried out, even if the
+ status code returned from the origin server indicates that the action
+ has been completed successfully. However, the server SHOULD NOT
+ indicate success unless, at the time the response is given, it
+ intends to delete the resource or move it to an inaccessible
+ location.
+
+ A successful response SHOULD be 200 (OK) if the response includes an
+ entity describing the status, 202 (Accepted) if the action has not
+ yet been enacted, or 204 (No Content) if the action has been enacted
+ but the response does not include an entity.
+
+ If the request passes through a cache and the Request-URI identifies
+ one or more currently cached entities, those entries SHOULD be
+ treated as stale. Responses to this method are not cacheable.
+
+9.8 TRACE
+
+ The TRACE method is used to invoke a remote, application-layer loop-
+ back of the request message. The final recipient of the request
+ SHOULD reflect the message received back to the client as the
+ entity-body of a 200 (OK) response. The final recipient is either the
+
+
+
+
+Fielding, et al. Standards Track [Page 56]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ origin server or the first proxy or gateway to receive a Max-Forwards
+ value of zero (0) in the request (see section 14.31). A TRACE request
+ MUST NOT include an entity.
+
+ TRACE allows the client to see what is being received at the other
+ end of the request chain and use that data for testing or diagnostic
+ information. The value of the Via header field (section 14.45) is of
+ particular interest, since it acts as a trace of the request chain.
+ Use of the Max-Forwards header field allows the client to limit the
+ length of the request chain, which is useful for testing a chain of
+ proxies forwarding messages in an infinite loop.
+
+ If the request is valid, the response SHOULD contain the entire
+ request message in the entity-body, with a Content-Type of
+ "message/http". Responses to this method MUST NOT be cached.
+
+9.9 CONNECT
+
+ This specification reserves the method name CONNECT for use with a
+ proxy that can dynamically switch to being a tunnel (e.g. SSL
+ tunneling [44]).
+
+10 Status Code Definitions
+
+ Each Status-Code is described below, including a description of which
+ method(s) it can follow and any metainformation required in the
+ response.
+
+10.1 Informational 1xx
+
+ This class of status code indicates a provisional response,
+ consisting only of the Status-Line and optional headers, and is
+ terminated by an empty line. There are no required headers for this
+ class of status code. Since HTTP/1.0 did not define any 1xx status
+ codes, servers MUST NOT send a 1xx response to an HTTP/1.0 client
+ except under experimental conditions.
+
+ A client MUST be prepared to accept one or more 1xx status responses
+ prior to a regular response, even if the client does not expect a 100
+ (Continue) status message. Unexpected 1xx status responses MAY be
+ ignored by a user agent.
+
+ Proxies MUST forward 1xx responses, unless the connection between the
+ proxy and its client has been closed, or unless the proxy itself
+ requested the generation of the 1xx response. (For example, if a
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 57]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ proxy adds a "Expect: 100-continue" field when it forwards a request,
+ then it need not forward the corresponding 100 (Continue)
+ response(s).)
+
+10.1.1 100 Continue
+
+ The client SHOULD continue with its request. This interim response is
+ used to inform the client that the initial part of the request has
+ been received and has not yet been rejected by the server. The client
+ SHOULD continue by sending the remainder of the request or, if the
+ request has already been completed, ignore this response. The server
+ MUST send a final response after the request has been completed. See
+ section 8.2.3 for detailed discussion of the use and handling of this
+ status code.
+
+10.1.2 101 Switching Protocols
+
+ The server understands and is willing to comply with the client's
+ request, via the Upgrade message header field (section 14.42), for a
+ change in the application protocol being used on this connection. The
+ server will switch protocols to those defined by the response's
+ Upgrade header field immediately after the empty line which
+ terminates the 101 response.
+
+ The protocol SHOULD be switched only when it is advantageous to do
+ so. For example, switching to a newer version of HTTP is advantageous
+ over older versions, and switching to a real-time, synchronous
+ protocol might be advantageous when delivering resources that use
+ such features.
+
+10.2 Successful 2xx
+
+ This class of status code indicates that the client's request was
+ successfully received, understood, and accepted.
+
+10.2.1 200 OK
+
+ The request has succeeded. The information returned with the response
+ is dependent on the method used in the request, for example:
+
+ GET an entity corresponding to the requested resource is sent in
+ the response;
+
+ HEAD the entity-header fields corresponding to the requested
+ resource are sent in the response without any message-body;
+
+ POST an entity describing or containing the result of the action;
+
+
+
+
+Fielding, et al. Standards Track [Page 58]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ TRACE an entity containing the request message as received by the
+ end server.
+
+10.2.2 201 Created
+
+ The request has been fulfilled and resulted in a new resource being
+ created. The newly created resource can be referenced by the URI(s)
+ returned in the entity of the response, with the most specific URI
+ for the resource given by a Location header field. The response
+ SHOULD include an entity containing a list of resource
+ characteristics and location(s) from which the user or user agent can
+ choose the one most appropriate. The entity format is specified by
+ the media type given in the Content-Type header field. The origin
+ server MUST create the resource before returning the 201 status code.
+ If the action cannot be carried out immediately, the server SHOULD
+ respond with 202 (Accepted) response instead.
+
+ A 201 response MAY contain an ETag response header field indicating
+ the current value of the entity tag for the requested variant just
+ created, see section 14.19.
+
+10.2.3 202 Accepted
+
+ The request has been accepted for processing, but the processing has
+ not been completed. The request might or might not eventually be
+ acted upon, as it might be disallowed when processing actually takes
+ place. There is no facility for re-sending a status code from an
+ asynchronous operation such as this.
+
+ The 202 response is intentionally non-committal. Its purpose is to
+ allow a server to accept a request for some other process (perhaps a
+ batch-oriented process that is only run once per day) without
+ requiring that the user agent's connection to the server persist
+ until the process is completed. The entity returned with this
+ response SHOULD include an indication of the request's current status
+ and either a pointer to a status monitor or some estimate of when the
+ user can expect the request to be fulfilled.
+
+10.2.4 203 Non-Authoritative Information
+
+ The returned metainformation in the entity-header is not the
+ definitive set as available from the origin server, but is gathered
+ from a local or a third-party copy. The set presented MAY be a subset
+ or superset of the original version. For example, including local
+ annotation information about the resource might result in a superset
+ of the metainformation known by the origin server. Use of this
+ response code is not required and is only appropriate when the
+ response would otherwise be 200 (OK).
+
+
+
+Fielding, et al. Standards Track [Page 59]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+10.2.5 204 No Content
+
+ The server has fulfilled the request but does not need to return an
+ entity-body, and might want to return updated metainformation. The
+ response MAY include new or updated metainformation in the form of
+ entity-headers, which if present SHOULD be associated with the
+ requested variant.
+
+ If the client is a user agent, it SHOULD NOT change its document view
+ from that which caused the request to be sent. This response is
+ primarily intended to allow input for actions to take place without
+ causing a change to the user agent's active document view, although
+ any new or updated metainformation SHOULD be applied to the document
+ currently in the user agent's active view.
+
+ The 204 response MUST NOT include a message-body, and thus is always
+ terminated by the first empty line after the header fields.
+
+10.2.6 205 Reset Content
+
+ The server has fulfilled the request and the user agent SHOULD reset
+ the document view which caused the request to be sent. This response
+ is primarily intended to allow input for actions to take place via
+ user input, followed by a clearing of the form in which the input is
+ given so that the user can easily initiate another input action. The
+ response MUST NOT include an entity.
+
+10.2.7 206 Partial Content
+
+ The server has fulfilled the partial GET request for the resource.
+ The request MUST have included a Range header field (section 14.35)
+ indicating the desired range, and MAY have included an If-Range
+ header field (section 14.27) to make the request conditional.
+
+ The response MUST include the following header fields:
+
+ - Either a Content-Range header field (section 14.16) indicating
+ the range included with this response, or a multipart/byteranges
+ Content-Type including Content-Range fields for each part. If a
+ Content-Length header field is present in the response, its
+ value MUST match the actual number of OCTETs transmitted in the
+ message-body.
+
+ - Date
+
+ - ETag and/or Content-Location, if the header would have been sent
+ in a 200 response to the same request
+
+
+
+
+Fielding, et al. Standards Track [Page 60]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ - Expires, Cache-Control, and/or Vary, if the field-value might
+ differ from that sent in any previous response for the same
+ variant
+
+ If the 206 response is the result of an If-Range request that used a
+ strong cache validator (see section 13.3.3), the response SHOULD NOT
+ include other entity-headers. If the response is the result of an
+ If-Range request that used a weak validator, the response MUST NOT
+ include other entity-headers; this prevents inconsistencies between
+ cached entity-bodies and updated headers. Otherwise, the response
+ MUST include all of the entity-headers that would have been returned
+ with a 200 (OK) response to the same request.
+
+ A cache MUST NOT combine a 206 response with other previously cached
+ content if the ETag or Last-Modified headers do not match exactly,
+ see 13.5.4.
+
+ A cache that does not support the Range and Content-Range headers
+ MUST NOT cache 206 (Partial) responses.
+
+10.3 Redirection 3xx
+
+ This class of status code indicates that further action needs to be
+ taken by the user agent in order to fulfill the request. The action
+ required MAY be carried out by the user agent without interaction
+ with the user if and only if the method used in the second request is
+ GET or HEAD. A client SHOULD detect infinite redirection loops, since
+ such loops generate network traffic for each redirection.
+
+ Note: previous versions of this specification recommended a
+ maximum of five redirections. Content developers should be aware
+ that there might be clients that implement such a fixed
+ limitation.
+
+10.3.1 300 Multiple Choices
+
+ The requested resource corresponds to any one of a set of
+ representations, each with its own specific location, and agent-
+ driven negotiation information (section 12) is being provided so that
+ the user (or user agent) can select a preferred representation and
+ redirect its request to that location.
+
+ Unless it was a HEAD request, the response SHOULD include an entity
+ containing a list of resource characteristics and location(s) from
+ which the user or user agent can choose the one most appropriate. The
+ entity format is specified by the media type given in the Content-
+ Type header field. Depending upon the format and the capabilities of
+
+
+
+
+Fielding, et al. Standards Track [Page 61]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ the user agent, selection of the most appropriate choice MAY be
+ performed automatically. However, this specification does not define
+ any standard for such automatic selection.
+
+ If the server has a preferred choice of representation, it SHOULD
+ include the specific URI for that representation in the Location
+ field; user agents MAY use the Location field value for automatic
+ redirection. This response is cacheable unless indicated otherwise.
+
+10.3.2 301 Moved Permanently
+
+ The requested resource has been assigned a new permanent URI and any
+ future references to this resource SHOULD use one of the returned
+ URIs. Clients with link editing capabilities ought to automatically
+ re-link references to the Request-URI to one or more of the new
+ references returned by the server, where possible. This response is
+ cacheable unless indicated otherwise.
+
+ The new permanent URI SHOULD be given by the Location field in the
+ response. Unless the request method was HEAD, the entity of the
+ response SHOULD contain a short hypertext note with a hyperlink to
+ the new URI(s).
+
+ If the 301 status code is received in response to a request other
+ than GET or HEAD, the user agent MUST NOT automatically redirect the
+ request unless it can be confirmed by the user, since this might
+ change the conditions under which the request was issued.
+
+ Note: When automatically redirecting a POST request after
+ receiving a 301 status code, some existing HTTP/1.0 user agents
+ will erroneously change it into a GET request.
+
+10.3.3 302 Found
+
+ The requested resource resides temporarily under a different URI.
+ Since the redirection might be altered on occasion, the client SHOULD
+ continue to use the Request-URI for future requests. This response
+ is only cacheable if indicated by a Cache-Control or Expires header
+ field.
+
+ The temporary URI SHOULD be given by the Location field in the
+ response. Unless the request method was HEAD, the entity of the
+ response SHOULD contain a short hypertext note with a hyperlink to
+ the new URI(s).
+
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 62]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ If the 302 status code is received in response to a request other
+ than GET or HEAD, the user agent MUST NOT automatically redirect the
+ request unless it can be confirmed by the user, since this might
+ change the conditions under which the request was issued.
+
+ Note: RFC 1945 and RFC 2068 specify that the client is not allowed
+ to change the method on the redirected request. However, most
+ existing user agent implementations treat 302 as if it were a 303
+ response, performing a GET on the Location field-value regardless
+ of the original request method. The status codes 303 and 307 have
+ been added for servers that wish to make unambiguously clear which
+ kind of reaction is expected of the client.
+
+10.3.4 303 See Other
+
+ The response to the request can be found under a different URI and
+ SHOULD be retrieved using a GET method on that resource. This method
+ exists primarily to allow the output of a POST-activated script to
+ redirect the user agent to a selected resource. The new URI is not a
+ substitute reference for the originally requested resource. The 303
+ response MUST NOT be cached, but the response to the second
+ (redirected) request might be cacheable.
+
+ The different URI SHOULD be given by the Location field in the
+ response. Unless the request method was HEAD, the entity of the
+ response SHOULD contain a short hypertext note with a hyperlink to
+ the new URI(s).
+
+ Note: Many pre-HTTP/1.1 user agents do not understand the 303
+ status. When interoperability with such clients is a concern, the
+ 302 status code may be used instead, since most user agents react
+ to a 302 response as described here for 303.
+
+10.3.5 304 Not Modified
+
+ If the client has performed a conditional GET request and access is
+ allowed, but the document has not been modified, the server SHOULD
+ respond with this status code. The 304 response MUST NOT contain a
+ message-body, and thus is always terminated by the first empty line
+ after the header fields.
+
+ The response MUST include the following header fields:
+
+ - Date, unless its omission is required by section 14.18.1
+
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 63]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ If a clockless origin server obeys these rules, and proxies and
+ clients add their own Date to any response received without one (as
+ already specified by [RFC 2068], section 14.19), caches will operate
+ correctly.
+
+ - ETag and/or Content-Location, if the header would have been sent
+ in a 200 response to the same request
+
+ - Expires, Cache-Control, and/or Vary, if the field-value might
+ differ from that sent in any previous response for the same
+ variant
+
+ If the conditional GET used a strong cache validator (see section
+ 13.3.3), the response SHOULD NOT include other entity-headers.
+ Otherwise (i.e., the conditional GET used a weak validator), the
+ response MUST NOT include other entity-headers; this prevents
+ inconsistencies between cached entity-bodies and updated headers.
+
+ If a 304 response indicates an entity not currently cached, then the
+ cache MUST disregard the response and repeat the request without the
+ conditional.
+
+ If a cache uses a received 304 response to update a cache entry, the
+ cache MUST update the entry to reflect any new field values given in
+ the response.
+
+10.3.6 305 Use Proxy
+
+ The requested resource MUST be accessed through the proxy given by
+ the Location field. The Location field gives the URI of the proxy.
+ The recipient is expected to repeat this single request via the
+ proxy. 305 responses MUST only be generated by origin servers.
+
+ Note: RFC 2068 was not clear that 305 was intended to redirect a
+ single request, and to be generated by origin servers only. Not
+ observing these limitations has significant security consequences.
+
+10.3.7 306 (Unused)
+
+ The 306 status code was used in a previous version of the
+ specification, is no longer used, and the code is reserved.
+
+
+
+
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 64]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+10.3.8 307 Temporary Redirect
+
+ The requested resource resides temporarily under a different URI.
+ Since the redirection MAY be altered on occasion, the client SHOULD
+ continue to use the Request-URI for future requests. This response
+ is only cacheable if indicated by a Cache-Control or Expires header
+ field.
+
+ The temporary URI SHOULD be given by the Location field in the
+ response. Unless the request method was HEAD, the entity of the
+ response SHOULD contain a short hypertext note with a hyperlink to
+ the new URI(s) , since many pre-HTTP/1.1 user agents do not
+ understand the 307 status. Therefore, the note SHOULD contain the
+ information necessary for a user to repeat the original request on
+ the new URI.
+
+ If the 307 status code is received in response to a request other
+ than GET or HEAD, the user agent MUST NOT automatically redirect the
+ request unless it can be confirmed by the user, since this might
+ change the conditions under which the request was issued.
+
+10.4 Client Error 4xx
+
+ The 4xx class of status code is intended for cases in which the
+ client seems to have erred. Except when responding to a HEAD request,
+ the server SHOULD include an entity containing an explanation of the
+ error situation, and whether it is a temporary or permanent
+ condition. These status codes are applicable to any request method.
+ User agents SHOULD display any included entity to the user.
+
+ If the client is sending data, a server implementation using TCP
+ SHOULD be careful to ensure that the client acknowledges receipt of
+ the packet(s) containing the response, before the server closes the
+ input connection. If the client continues sending data to the server
+ after the close, the server's TCP stack will send a reset packet to
+ the client, which may erase the client's unacknowledged input buffers
+ before they can be read and interpreted by the HTTP application.
+
+10.4.1 400 Bad Request
+
+ The request could not be understood by the server due to malformed
+ syntax. The client SHOULD NOT repeat the request without
+ modifications.
+
+
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 65]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+10.4.2 401 Unauthorized
+
+ The request requires user authentication. The response MUST include a
+ WWW-Authenticate header field (section 14.47) containing a challenge
+ applicable to the requested resource. The client MAY repeat the
+ request with a suitable Authorization header field (section 14.8). If
+ the request already included Authorization credentials, then the 401
+ response indicates that authorization has been refused for those
+ credentials. If the 401 response contains the same challenge as the
+ prior response, and the user agent has already attempted
+ authentication at least once, then the user SHOULD be presented the
+ entity that was given in the response, since that entity might
+ include relevant diagnostic information. HTTP access authentication
+ is explained in "HTTP Authentication: Basic and Digest Access
+ Authentication" [43].
+
+10.4.3 402 Payment Required
+
+ This code is reserved for future use.
+
+10.4.4 403 Forbidden
+
+ The server understood the request, but is refusing to fulfill it.
+ Authorization will not help and the request SHOULD NOT be repeated.
+ If the request method was not HEAD and the server wishes to make
+ public why the request has not been fulfilled, it SHOULD describe the
+ reason for the refusal in the entity. If the server does not wish to
+ make this information available to the client, the status code 404
+ (Not Found) can be used instead.
+
+10.4.5 404 Not Found
+
+ The server has not found anything matching the Request-URI. No
+ indication is given of whether the condition is temporary or
+ permanent. The 410 (Gone) status code SHOULD be used if the server
+ knows, through some internally configurable mechanism, that an old
+ resource is permanently unavailable and has no forwarding address.
+ This status code is commonly used when the server does not wish to
+ reveal exactly why the request has been refused, or when no other
+ response is applicable.
+
+10.4.6 405 Method Not Allowed
+
+ The method specified in the Request-Line is not allowed for the
+ resource identified by the Request-URI. The response MUST include an
+ Allow header containing a list of valid methods for the requested
+ resource.
+
+
+
+
+Fielding, et al. Standards Track [Page 66]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+10.4.7 406 Not Acceptable
+
+ The resource identified by the request is only capable of generating
+ response entities which have content characteristics not acceptable
+ according to the accept headers sent in the request.
+
+ Unless it was a HEAD request, the response SHOULD include an entity
+ containing a list of available entity characteristics and location(s)
+ from which the user or user agent can choose the one most
+ appropriate. The entity format is specified by the media type given
+ in the Content-Type header field. Depending upon the format and the
+ capabilities of the user agent, selection of the most appropriate
+ choice MAY be performed automatically. However, this specification
+ does not define any standard for such automatic selection.
+
+ Note: HTTP/1.1 servers are allowed to return responses which are
+ not acceptable according to the accept headers sent in the
+ request. In some cases, this may even be preferable to sending a
+ 406 response. User agents are encouraged to inspect the headers of
+ an incoming response to determine if it is acceptable.
+
+ If the response could be unacceptable, a user agent SHOULD
+ temporarily stop receipt of more data and query the user for a
+ decision on further actions.
+
+10.4.8 407 Proxy Authentication Required
+
+ This code is similar to 401 (Unauthorized), but indicates that the
+ client must first authenticate itself with the proxy. The proxy MUST
+ return a Proxy-Authenticate header field (section 14.33) containing a
+ challenge applicable to the proxy for the requested resource. The
+ client MAY repeat the request with a suitable Proxy-Authorization
+ header field (section 14.34). HTTP access authentication is explained
+ in "HTTP Authentication: Basic and Digest Access Authentication"
+ [43].
+
+10.4.9 408 Request Timeout
+
+ The client did not produce a request within the time that the server
+ was prepared to wait. The client MAY repeat the request without
+ modifications at any later time.
+
+10.4.10 409 Conflict
+
+ The request could not be completed due to a conflict with the current
+ state of the resource. This code is only allowed in situations where
+ it is expected that the user might be able to resolve the conflict
+ and resubmit the request. The response body SHOULD include enough
+
+
+
+Fielding, et al. Standards Track [Page 67]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ information for the user to recognize the source of the conflict.
+ Ideally, the response entity would include enough information for the
+ user or user agent to fix the problem; however, that might not be
+ possible and is not required.
+
+ Conflicts are most likely to occur in response to a PUT request. For
+ example, if versioning were being used and the entity being PUT
+ included changes to a resource which conflict with those made by an
+ earlier (third-party) request, the server might use the 409 response
+ to indicate that it can't complete the request. In this case, the
+ response entity would likely contain a list of the differences
+ between the two versions in a format defined by the response
+ Content-Type.
+
+10.4.11 410 Gone
+
+ The requested resource is no longer available at the server and no
+ forwarding address is known. This condition is expected to be
+ considered permanent. Clients with link editing capabilities SHOULD
+ delete references to the Request-URI after user approval. If the
+ server does not know, or has no facility to determine, whether or not
+ the condition is permanent, the status code 404 (Not Found) SHOULD be
+ used instead. This response is cacheable unless indicated otherwise.
+
+ The 410 response is primarily intended to assist the task of web
+ maintenance by notifying the recipient that the resource is
+ intentionally unavailable and that the server owners desire that
+ remote links to that resource be removed. Such an event is common for
+ limited-time, promotional services and for resources belonging to
+ individuals no longer working at the server's site. It is not
+ necessary to mark all permanently unavailable resources as "gone" or
+ to keep the mark for any length of time -- that is left to the
+ discretion of the server owner.
+
+10.4.12 411 Length Required
+
+ The server refuses to accept the request without a defined Content-
+ Length. The client MAY repeat the request if it adds a valid
+ Content-Length header field containing the length of the message-body
+ in the request message.
+
+10.4.13 412 Precondition Failed
+
+ The precondition given in one or more of the request-header fields
+ evaluated to false when it was tested on the server. This response
+ code allows the client to place preconditions on the current resource
+ metainformation (header field data) and thus prevent the requested
+ method from being applied to a resource other than the one intended.
+
+
+
+Fielding, et al. Standards Track [Page 68]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+10.4.14 413 Request Entity Too Large
+
+ The server is refusing to process a request because the request
+ entity is larger than the server is willing or able to process. The
+ server MAY close the connection to prevent the client from continuing
+ the request.
+
+ If the condition is temporary, the server SHOULD include a Retry-
+ After header field to indicate that it is temporary and after what
+ time the client MAY try again.
+
+10.4.15 414 Request-URI Too Long
+
+ The server is refusing to service the request because the Request-URI
+ is longer than the server is willing to interpret. This rare
+ condition is only likely to occur when a client has improperly
+ converted a POST request to a GET request with long query
+ information, when the client has descended into a URI "black hole" of
+ redirection (e.g., a redirected URI prefix that points to a suffix of
+ itself), or when the server is under attack by a client attempting to
+ exploit security holes present in some servers using fixed-length
+ buffers for reading or manipulating the Request-URI.
+
+10.4.16 415 Unsupported Media Type
+
+ The server is refusing to service the request because the entity of
+ the request is in a format not supported by the requested resource
+ for the requested method.
+
+10.4.17 416 Requested Range Not Satisfiable
+
+ A server SHOULD return a response with this status code if a request
+ included a Range request-header field (section 14.35), and none of
+ the range-specifier values in this field overlap the current extent
+ of the selected resource, and the request did not include an If-Range
+ request-header field. (For byte-ranges, this means that the first-
+ byte-pos of all of the byte-range-spec values were greater than the
+ current length of the selected resource.)
+
+ When this status code is returned for a byte-range request, the
+ response SHOULD include a Content-Range entity-header field
+ specifying the current length of the selected resource (see section
+ 14.16). This response MUST NOT use the multipart/byteranges content-
+ type.
+
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 69]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+10.4.18 417 Expectation Failed
+
+ The expectation given in an Expect request-header field (see section
+ 14.20) could not be met by this server, or, if the server is a proxy,
+ the server has unambiguous evidence that the request could not be met
+ by the next-hop server.
+
+10.5 Server Error 5xx
+
+ Response status codes beginning with the digit "5" indicate cases in
+ which the server is aware that it has erred or is incapable of
+ performing the request. Except when responding to a HEAD request, the
+ server SHOULD include an entity containing an explanation of the
+ error situation, and whether it is a temporary or permanent
+ condition. User agents SHOULD display any included entity to the
+ user. These response codes are applicable to any request method.
+
+10.5.1 500 Internal Server Error
+
+ The server encountered an unexpected condition which prevented it
+ from fulfilling the request.
+
+10.5.2 501 Not Implemented
+
+ The server does not support the functionality required to fulfill the
+ request. This is the appropriate response when the server does not
+ recognize the request method and is not capable of supporting it for
+ any resource.
+
+10.5.3 502 Bad Gateway
+
+ The server, while acting as a gateway or proxy, received an invalid
+ response from the upstream server it accessed in attempting to
+ fulfill the request.
+
+10.5.4 503 Service Unavailable
+
+ The server is currently unable to handle the request due to a
+ temporary overloading or maintenance of the server. The implication
+ is that this is a temporary condition which will be alleviated after
+ some delay. If known, the length of the delay MAY be indicated in a
+ Retry-After header. If no Retry-After is given, the client SHOULD
+ handle the response as it would for a 500 response.
+
+ Note: The existence of the 503 status code does not imply that a
+ server must use it when becoming overloaded. Some servers may wish
+ to simply refuse the connection.
+
+
+
+
+Fielding, et al. Standards Track [Page 70]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+10.5.5 504 Gateway Timeout
+
+ The server, while acting as a gateway or proxy, did not receive a
+ timely response from the upstream server specified by the URI (e.g.
+ HTTP, FTP, LDAP) or some other auxiliary server (e.g. DNS) it needed
+ to access in attempting to complete the request.
+
+ Note: Note to implementors: some deployed proxies are known to
+ return 400 or 500 when DNS lookups time out.
+
+10.5.6 505 HTTP Version Not Supported
+
+ The server does not support, or refuses to support, the HTTP protocol
+ version that was used in the request message. The server is
+ indicating that it is unable or unwilling to complete the request
+ using the same major version as the client, as described in section
+ 3.1, other than with this error message. The response SHOULD contain
+ an entity describing why that version is not supported and what other
+ protocols are supported by that server.
+
+11 Access Authentication
+
+ HTTP provides several OPTIONAL challenge-response authentication
+ mechanisms which can be used by a server to challenge a client
+ request and by a client to provide authentication information. The
+ general framework for access authentication, and the specification of
+ "basic" and "digest" authentication, are specified in "HTTP
+ Authentication: Basic and Digest Access Authentication" [43]. This
+ specification adopts the definitions of "challenge" and "credentials"
+ from that specification.
+
+12 Content Negotiation
+
+ Most HTTP responses include an entity which contains information for
+ interpretation by a human user. Naturally, it is desirable to supply
+ the user with the "best available" entity corresponding to the
+ request. Unfortunately for servers and caches, not all users have the
+ same preferences for what is "best," and not all user agents are
+ equally capable of rendering all entity types. For that reason, HTTP
+ has provisions for several mechanisms for "content negotiation" --
+ the process of selecting the best representation for a given response
+ when there are multiple representations available.
+
+ Note: This is not called "format negotiation" because the
+ alternate representations may be of the same media type, but use
+ different capabilities of that type, be in different languages,
+ etc.
+
+
+
+
+Fielding, et al. Standards Track [Page 71]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ Any response containing an entity-body MAY be subject to negotiation,
+ including error responses.
+
+ There are two kinds of content negotiation which are possible in
+ HTTP: server-driven and agent-driven negotiation. These two kinds of
+ negotiation are orthogonal and thus may be used separately or in
+ combination. One method of combination, referred to as transparent
+ negotiation, occurs when a cache uses the agent-driven negotiation
+ information provided by the origin server in order to provide
+ server-driven negotiation for subsequent requests.
+
+12.1 Server-driven Negotiation
+
+ If the selection of the best representation for a response is made by
+ an algorithm located at the server, it is called server-driven
+ negotiation. Selection is based on the available representations of
+ the response (the dimensions over which it can vary; e.g. language,
+ content-coding, etc.) and the contents of particular header fields in
+ the request message or on other information pertaining to the request
+ (such as the network address of the client).
+
+ Server-driven negotiation is advantageous when the algorithm for
+ selecting from among the available representations is difficult to
+ describe to the user agent, or when the server desires to send its
+ "best guess" to the client along with the first response (hoping to
+ avoid the round-trip delay of a subsequent request if the "best
+ guess" is good enough for the user). In order to improve the server's
+ guess, the user agent MAY include request header fields (Accept,
+ Accept-Language, Accept-Encoding, etc.) which describe its
+ preferences for such a response.
+
+ Server-driven negotiation has disadvantages:
+
+ 1. It is impossible for the server to accurately determine what
+ might be "best" for any given user, since that would require
+ complete knowledge of both the capabilities of the user agent
+ and the intended use for the response (e.g., does the user want
+ to view it on screen or print it on paper?).
+
+ 2. Having the user agent describe its capabilities in every
+ request can be both very inefficient (given that only a small
+ percentage of responses have multiple representations) and a
+ potential violation of the user's privacy.
+
+ 3. It complicates the implementation of an origin server and the
+ algorithms for generating responses to a request.
+
+
+
+
+
+Fielding, et al. Standards Track [Page 72]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ 4. It may limit a public cache's ability to use the same response
+ for multiple user's requests.
+
+ HTTP/1.1 includes the following request-header fields for enabling
+ server-driven negotiation through description of user agent
+ capabilities and user preferences: Accept (section 14.1), Accept-
+ Charset (section 14.2), Accept-Encoding (section 14.3), Accept-
+ Language (section 14.4), and User-Agent (section 14.43). However, an
+ origin server is not limited to these dimensions and MAY vary the
+ response based on any aspect of the request, including information
+ outside the request-header fields or within extension header fields
+ not defined by this specification.
+
+ The Vary header field can be used to express the parameters the
+ server uses to select a representation that is subject to server-
+ driven negotiation. See section 13.6 for use of the Vary header field
+ by caches and section 14.44 for use of the Vary header field by
+ servers.
+
+12.2 Agent-driven Negotiation
+
+ With agent-driven negotiation, selection of the best representation
+ for a response is performed by the user agent after receiving an
+ initial response from the origin server. Selection is based on a list
+ of the available representations of the response included within the
+ header fields or entity-body of the initial response, with each
+ representation identified by its own URI. Selection from among the
+ representations may be performed automatically (if the user agent is
+ capable of doing so) or manually by the user selecting from a
+ generated (possibly hypertext) menu.
+
+ Agent-driven negotiation is advantageous when the response would vary
+ over commonly-used dimensions (such as type, language, or encoding),
+ when the origin server is unable to determine a user agent's
+ capabilities from examining the request, and generally when public
+ caches are used to distribute server load and reduce network usage.
+
+ Agent-driven negotiation suffers from the disadvantage of needing a
+ second request to obtain the best alternate representation. This
+ second request is only efficient when caching is used. In addition,
+ this specification does not define any mechanism for supporting
+ automatic selection, though it also does not prevent any such
+ mechanism from being developed as an extension and used within
+ HTTP/1.1.
+
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 73]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ HTTP/1.1 defines the 300 (Multiple Choices) and 406 (Not Acceptable)
+ status codes for enabling agent-driven negotiation when the server is
+ unwilling or unable to provide a varying response using server-driven
+ negotiation.
+
+12.3 Transparent Negotiation
+
+ Transparent negotiation is a combination of both server-driven and
+ agent-driven negotiation. When a cache is supplied with a form of the
+ list of available representations of the response (as in agent-driven
+ negotiation) and the dimensions of variance are completely understood
+ by the cache, then the cache becomes capable of performing server-
+ driven negotiation on behalf of the origin server for subsequent
+ requests on that resource.
+
+ Transparent negotiation has the advantage of distributing the
+ negotiation work that would otherwise be required of the origin
+ server and also removing the second request delay of agent-driven
+ negotiation when the cache is able to correctly guess the right
+ response.
+
+ This specification does not define any mechanism for transparent
+ negotiation, though it also does not prevent any such mechanism from
+ being developed as an extension that could be used within HTTP/1.1.
+
+13 Caching in HTTP
+
+ HTTP is typically used for distributed information systems, where
+ performance can be improved by the use of response caches. The
+ HTTP/1.1 protocol includes a number of elements intended to make
+ caching work as well as possible. Because these elements are
+ inextricable from other aspects of the protocol, and because they
+ interact with each other, it is useful to describe the basic caching
+ design of HTTP separately from the detailed descriptions of methods,
+ headers, response codes, etc.
+
+ Caching would be useless if it did not significantly improve
+ performance. The goal of caching in HTTP/1.1 is to eliminate the need
+ to send requests in many cases, and to eliminate the need to send
+ full responses in many other cases. The former reduces the number of
+ network round-trips required for many operations; we use an
+ "expiration" mechanism for this purpose (see section 13.2). The
+ latter reduces network bandwidth requirements; we use a "validation"
+ mechanism for this purpose (see section 13.3).
+
+ Requirements for performance, availability, and disconnected
+ operation require us to be able to relax the goal of semantic
+ transparency. The HTTP/1.1 protocol allows origin servers, caches,
+
+
+
+Fielding, et al. Standards Track [Page 74]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ and clients to explicitly reduce transparency when necessary.
+ However, because non-transparent operation may confuse non-expert
+ users, and might be incompatible with certain server applications
+ (such as those for ordering merchandise), the protocol requires that
+ transparency be relaxed
+
+ - only by an explicit protocol-level request when relaxed by
+ client or origin server
+
+ - only with an explicit warning to the end user when relaxed by
+ cache or client
+
+ Therefore, the HTTP/1.1 protocol provides these important elements:
+
+ 1. Protocol features that provide full semantic transparency when
+ this is required by all parties.
+
+ 2. Protocol features that allow an origin server or user agent to
+ explicitly request and control non-transparent operation.
+
+ 3. Protocol features that allow a cache to attach warnings to
+ responses that do not preserve the requested approximation of
+ semantic transparency.
+
+ A basic principle is that it must be possible for the clients to
+ detect any potential relaxation of semantic transparency.
+
+ Note: The server, cache, or client implementor might be faced with
+ design decisions not explicitly discussed in this specification.
+ If a decision might affect semantic transparency, the implementor
+ ought to err on the side of maintaining transparency unless a
+ careful and complete analysis shows significant benefits in
+ breaking transparency.
+
+13.1.1 Cache Correctness
+
+ A correct cache MUST respond to a request with the most up-to-date
+ response held by the cache that is appropriate to the request (see
+ sections 13.2.5, 13.2.6, and 13.12) which meets one of the following
+ conditions:
+
+ 1. It has been checked for equivalence with what the origin server
+ would have returned by revalidating the response with the
+ origin server (section 13.3);
+
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 75]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ 2. It is "fresh enough" (see section 13.2). In the default case,
+ this means it meets the least restrictive freshness requirement
+ of the client, origin server, and cache (see section 14.9); if
+ the origin server so specifies, it is the freshness requirement
+ of the origin server alone.
+
+ If a stored response is not "fresh enough" by the most
+ restrictive freshness requirement of both the client and the
+ origin server, in carefully considered circumstances the cache
+ MAY still return the response with the appropriate Warning
+ header (see section 13.1.5 and 14.46), unless such a response
+ is prohibited (e.g., by a "no-store" cache-directive, or by a
+ "no-cache" cache-request-directive; see section 14.9).
+
+ 3. It is an appropriate 304 (Not Modified), 305 (Proxy Redirect),
+ or error (4xx or 5xx) response message.
+
+ If the cache can not communicate with the origin server, then a
+ correct cache SHOULD respond as above if the response can be
+ correctly served from the cache; if not it MUST return an error or
+ warning indicating that there was a communication failure.
+
+ If a cache receives a response (either an entire response, or a 304
+ (Not Modified) response) that it would normally forward to the
+ requesting client, and the received response is no longer fresh, the
+ cache SHOULD forward it to the requesting client without adding a new
+ Warning (but without removing any existing Warning headers). A cache
+ SHOULD NOT attempt to revalidate a response simply because that
+ response became stale in transit; this might lead to an infinite
+ loop. A user agent that receives a stale response without a Warning
+ MAY display a warning indication to the user.
+
+13.1.2 Warnings
+
+ Whenever a cache returns a response that is neither first-hand nor
+ "fresh enough" (in the sense of condition 2 in section 13.1.1), it
+ MUST attach a warning to that effect, using a Warning general-header.
+ The Warning header and the currently defined warnings are described
+ in section 14.46. The warning allows clients to take appropriate
+ action.
+
+ Warnings MAY be used for other purposes, both cache-related and
+ otherwise. The use of a warning, rather than an error status code,
+ distinguish these responses from true failures.
+
+ Warnings are assigned three digit warn-codes. The first digit
+ indicates whether the Warning MUST or MUST NOT be deleted from a
+ stored cache entry after a successful revalidation:
+
+
+
+Fielding, et al. Standards Track [Page 76]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ 1xx Warnings that describe the freshness or revalidation status of
+ the response, and so MUST be deleted after a successful
+ revalidation. 1XX warn-codes MAY be generated by a cache only when
+ validating a cached entry. It MUST NOT be generated by clients.
+
+ 2xx Warnings that describe some aspect of the entity body or entity
+ headers that is not rectified by a revalidation (for example, a
+ lossy compression of the entity bodies) and which MUST NOT be
+ deleted after a successful revalidation.
+
+ See section 14.46 for the definitions of the codes themselves.
+
+ HTTP/1.0 caches will cache all Warnings in responses, without
+ deleting the ones in the first category. Warnings in responses that
+ are passed to HTTP/1.0 caches carry an extra warning-date field,
+ which prevents a future HTTP/1.1 recipient from believing an
+ erroneously cached Warning.
+
+ Warnings also carry a warning text. The text MAY be in any
+ appropriate natural language (perhaps based on the client's Accept
+ headers), and include an OPTIONAL indication of what character set is
+ used.
+
+ Multiple warnings MAY be attached to a response (either by the origin
+ server or by a cache), including multiple warnings with the same code
+ number. For example, a server might provide the same warning with
+ texts in both English and Basque.
+
+ When multiple warnings are attached to a response, it might not be
+ practical or reasonable to display all of them to the user. This
+ version of HTTP does not specify strict priority rules for deciding
+ which warnings to display and in what order, but does suggest some
+ heuristics.
+
+13.1.3 Cache-control Mechanisms
+
+ The basic cache mechanisms in HTTP/1.1 (server-specified expiration
+ times and validators) are implicit directives to caches. In some
+ cases, a server or client might need to provide explicit directives
+ to the HTTP caches. We use the Cache-Control header for this purpose.
+
+ The Cache-Control header allows a client or server to transmit a
+ variety of directives in either requests or responses. These
+ directives typically override the default caching algorithms. As a
+ general rule, if there is any apparent conflict between header
+ values, the most restrictive interpretation is applied (that is, the
+ one that is most likely to preserve semantic transparency). However,
+
+
+
+
+Fielding, et al. Standards Track [Page 77]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ in some cases, cache-control directives are explicitly specified as
+ weakening the approximation of semantic transparency (for example,
+ "max-stale" or "public").
+
+ The cache-control directives are described in detail in section 14.9.
+
+13.1.4 Explicit User Agent Warnings
+
+ Many user agents make it possible for users to override the basic
+ caching mechanisms. For example, the user agent might allow the user
+ to specify that cached entities (even explicitly stale ones) are
+ never validated. Or the user agent might habitually add "Cache-
+ Control: max-stale=3600" to every request. The user agent SHOULD NOT
+ default to either non-transparent behavior, or behavior that results
+ in abnormally ineffective caching, but MAY be explicitly configured
+ to do so by an explicit action of the user.
+
+ If the user has overridden the basic caching mechanisms, the user
+ agent SHOULD explicitly indicate to the user whenever this results in
+ the display of information that might not meet the server's
+ transparency requirements (in particular, if the displayed entity is
+ known to be stale). Since the protocol normally allows the user agent
+ to determine if responses are stale or not, this indication need only
+ be displayed when this actually happens. The indication need not be a
+ dialog box; it could be an icon (for example, a picture of a rotting
+ fish) or some other indicator.
+
+ If the user has overridden the caching mechanisms in a way that would
+ abnormally reduce the effectiveness of caches, the user agent SHOULD
+ continually indicate this state to the user (for example, by a
+ display of a picture of currency in flames) so that the user does not
+ inadvertently consume excess resources or suffer from excessive
+ latency.
+
+13.1.5 Exceptions to the Rules and Warnings
+
+ In some cases, the operator of a cache MAY choose to configure it to
+ return stale responses even when not requested by clients. This
+ decision ought not be made lightly, but may be necessary for reasons
+ of availability or performance, especially when the cache is poorly
+ connected to the origin server. Whenever a cache returns a stale
+ response, it MUST mark it as such (using a Warning header) enabling
+ the client software to alert the user that there might be a potential
+ problem.
+
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 78]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ It also allows the user agent to take steps to obtain a first-hand or
+ fresh response. For this reason, a cache SHOULD NOT return a stale
+ response if the client explicitly requests a first-hand or fresh one,
+ unless it is impossible to comply for technical or policy reasons.
+
+13.1.6 Client-controlled Behavior
+
+ While the origin server (and to a lesser extent, intermediate caches,
+ by their contribution to the age of a response) are the primary
+ source of expiration information, in some cases the client might need
+ to control a cache's decision about whether to return a cached
+ response without validating it. Clients do this using several
+ directives of the Cache-Control header.
+
+ A client's request MAY specify the maximum age it is willing to
+ accept of an unvalidated response; specifying a value of zero forces
+ the cache(s) to revalidate all responses. A client MAY also specify
+ the minimum time remaining before a response expires. Both of these
+ options increase constraints on the behavior of caches, and so cannot
+ further relax the cache's approximation of semantic transparency.
+
+ A client MAY also specify that it will accept stale responses, up to
+ some maximum amount of staleness. This loosens the constraints on the
+ caches, and so might violate the origin server's specified
+ constraints on semantic transparency, but might be necessary to
+ support disconnected operation, or high availability in the face of
+ poor connectivity.
+
+13.2 Expiration Model
+
+13.2.1 Server-Specified Expiration
+
+ HTTP caching works best when caches can entirely avoid making
+ requests to the origin server. The primary mechanism for avoiding
+ requests is for an origin server to provide an explicit expiration
+ time in the future, indicating that a response MAY be used to satisfy
+ subsequent requests. In other words, a cache can return a fresh
+ response without first contacting the server.
+
+ Our expectation is that servers will assign future explicit
+ expiration times to responses in the belief that the entity is not
+ likely to change, in a semantically significant way, before the
+ expiration time is reached. This normally preserves semantic
+ transparency, as long as the server's expiration times are carefully
+ chosen.
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 79]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ The expiration mechanism applies only to responses taken from a cache
+ and not to first-hand responses forwarded immediately to the
+ requesting client.
+
+ If an origin server wishes to force a semantically transparent cache
+ to validate every request, it MAY assign an explicit expiration time
+ in the past. This means that the response is always stale, and so the
+ cache SHOULD validate it before using it for subsequent requests. See
+ section 14.9.4 for a more restrictive way to force revalidation.
+
+ If an origin server wishes to force any HTTP/1.1 cache, no matter how
+ it is configured, to validate every request, it SHOULD use the "must-
+ revalidate" cache-control directive (see section 14.9).
+
+ Servers specify explicit expiration times using either the Expires
+ header, or the max-age directive of the Cache-Control header.
+
+ An expiration time cannot be used to force a user agent to refresh
+ its display or reload a resource; its semantics apply only to caching
+ mechanisms, and such mechanisms need only check a resource's
+ expiration status when a new request for that resource is initiated.
+ See section 13.13 for an explanation of the difference between caches
+ and history mechanisms.
+
+13.2.2 Heuristic Expiration
+
+ Since origin servers do not always provide explicit expiration times,
+ HTTP caches typically assign heuristic expiration times, employing
+ algorithms that use other header values (such as the Last-Modified
+ time) to estimate a plausible expiration time. The HTTP/1.1
+ specification does not provide specific algorithms, but does impose
+ worst-case constraints on their results. Since heuristic expiration
+ times might compromise semantic transparency, they ought to used
+ cautiously, and we encourage origin servers to provide explicit
+ expiration times as much as possible.
+
+13.2.3 Age Calculations
+
+ In order to know if a cached entry is fresh, a cache needs to know if
+ its age exceeds its freshness lifetime. We discuss how to calculate
+ the latter in section 13.2.4; this section describes how to calculate
+ the age of a response or cache entry.
+
+ In this discussion, we use the term "now" to mean "the current value
+ of the clock at the host performing the calculation." Hosts that use
+ HTTP, but especially hosts running origin servers and caches, SHOULD
+ use NTP [28] or some similar protocol to synchronize their clocks to
+ a globally accurate time standard.
+
+
+
+Fielding, et al. Standards Track [Page 80]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ HTTP/1.1 requires origin servers to send a Date header, if possible,
+ with every response, giving the time at which the response was
+ generated (see section 14.18). We use the term "date_value" to denote
+ the value of the Date header, in a form appropriate for arithmetic
+ operations.
+
+ HTTP/1.1 uses the Age response-header to convey the estimated age of
+ the response message when obtained from a cache. The Age field value
+ is the cache's estimate of the amount of time since the response was
+ generated or revalidated by the origin server.
+
+ In essence, the Age value is the sum of the time that the response
+ has been resident in each of the caches along the path from the
+ origin server, plus the amount of time it has been in transit along
+ network paths.
+
+ We use the term "age_value" to denote the value of the Age header, in
+ a form appropriate for arithmetic operations.
+
+ A response's age can be calculated in two entirely independent ways:
+
+ 1. now minus date_value, if the local clock is reasonably well
+ synchronized to the origin server's clock. If the result is
+ negative, the result is replaced by zero.
+
+ 2. age_value, if all of the caches along the response path
+ implement HTTP/1.1.
+
+ Given that we have two independent ways to compute the age of a
+ response when it is received, we can combine these as
+
+ corrected_received_age = max(now - date_value, age_value)
+
+ and as long as we have either nearly synchronized clocks or all-
+ HTTP/1.1 paths, one gets a reliable (conservative) result.
+
+ Because of network-imposed delays, some significant interval might
+ pass between the time that a server generates a response and the time
+ it is received at the next outbound cache or client. If uncorrected,
+ this delay could result in improperly low ages.
+
+ Because the request that resulted in the returned Age value must have
+ been initiated prior to that Age value's generation, we can correct
+ for delays imposed by the network by recording the time at which the
+ request was initiated. Then, when an Age value is received, it MUST
+ be interpreted relative to the time the request was initiated, not
+
+
+
+
+
+Fielding, et al. Standards Track [Page 81]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ the time that the response was received. This algorithm results in
+ conservative behavior no matter how much delay is experienced. So, we
+ compute:
+
+ corrected_initial_age = corrected_received_age
+ + (now - request_time)
+
+ where "request_time" is the time (according to the local clock) when
+ the request that elicited this response was sent.
+
+ Summary of age calculation algorithm, when a cache receives a
+ response:
+
+ /*
+ * age_value
+ * is the value of Age: header received by the cache with
+ * this response.
+ * date_value
+ * is the value of the origin server's Date: header
+ * request_time
+ * is the (local) time when the cache made the request
+ * that resulted in this cached response
+ * response_time
+ * is the (local) time when the cache received the
+ * response
+ * now
+ * is the current (local) time
+ */
+
+ apparent_age = max(0, response_time - date_value);
+ corrected_received_age = max(apparent_age, age_value);
+ response_delay = response_time - request_time;
+ corrected_initial_age = corrected_received_age + response_delay;
+ resident_time = now - response_time;
+ current_age = corrected_initial_age + resident_time;
+
+ The current_age of a cache entry is calculated by adding the amount
+ of time (in seconds) since the cache entry was last validated by the
+ origin server to the corrected_initial_age. When a response is
+ generated from a cache entry, the cache MUST include a single Age
+ header field in the response with a value equal to the cache entry's
+ current_age.
+
+ The presence of an Age header field in a response implies that a
+ response is not first-hand. However, the converse is not true, since
+ the lack of an Age header field in a response does not imply that the
+
+
+
+
+
+Fielding, et al. Standards Track [Page 82]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ response is first-hand unless all caches along the request path are
+ compliant with HTTP/1.1 (i.e., older HTTP caches did not implement
+ the Age header field).
+
+13.2.4 Expiration Calculations
+
+ In order to decide whether a response is fresh or stale, we need to
+ compare its freshness lifetime to its age. The age is calculated as
+ described in section 13.2.3; this section describes how to calculate
+ the freshness lifetime, and to determine if a response has expired.
+ In the discussion below, the values can be represented in any form
+ appropriate for arithmetic operations.
+
+ We use the term "expires_value" to denote the value of the Expires
+ header. We use the term "max_age_value" to denote an appropriate
+ value of the number of seconds carried by the "max-age" directive of
+ the Cache-Control header in a response (see section 14.9.3).
+
+ The max-age directive takes priority over Expires, so if max-age is
+ present in a response, the calculation is simply:
+
+ freshness_lifetime = max_age_value
+
+ Otherwise, if Expires is present in the response, the calculation is:
+
+ freshness_lifetime = expires_value - date_value
+
+ Note that neither of these calculations is vulnerable to clock skew,
+ since all of the information comes from the origin server.
+
+ If none of Expires, Cache-Control: max-age, or Cache-Control: s-
+ maxage (see section 14.9.3) appears in the response, and the response
+ does not include other restrictions on caching, the cache MAY compute
+ a freshness lifetime using a heuristic. The cache MUST attach Warning
+ 113 to any response whose age is more than 24 hours if such warning
+ has not already been added.
+
+ Also, if the response does have a Last-Modified time, the heuristic
+ expiration value SHOULD be no more than some fraction of the interval
+ since that time. A typical setting of this fraction might be 10%.
+
+ The calculation to determine if a response has expired is quite
+ simple:
+
+ response_is_fresh = (freshness_lifetime > current_age)
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 83]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+13.2.5 Disambiguating Expiration Values
+
+ Because expiration values are assigned optimistically, it is possible
+ for two caches to contain fresh values for the same resource that are
+ different.
+
+ If a client performing a retrieval receives a non-first-hand response
+ for a request that was already fresh in its own cache, and the Date
+ header in its existing cache entry is newer than the Date on the new
+ response, then the client MAY ignore the response. If so, it MAY
+ retry the request with a "Cache-Control: max-age=0" directive (see
+ section 14.9), to force a check with the origin server.
+
+ If a cache has two fresh responses for the same representation with
+ different validators, it MUST use the one with the more recent Date
+ header. This situation might arise because the cache is pooling
+ responses from other caches, or because a client has asked for a
+ reload or a revalidation of an apparently fresh cache entry.
+
+13.2.6 Disambiguating Multiple Responses
+
+ Because a client might be receiving responses via multiple paths, so
+ that some responses flow through one set of caches and other
+ responses flow through a different set of caches, a client might
+ receive responses in an order different from that in which the origin
+ server sent them. We would like the client to use the most recently
+ generated response, even if older responses are still apparently
+ fresh.
+
+ Neither the entity tag nor the expiration value can impose an
+ ordering on responses, since it is possible that a later response
+ intentionally carries an earlier expiration time. The Date values are
+ ordered to a granularity of one second.
+
+ When a client tries to revalidate a cache entry, and the response it
+ receives contains a Date header that appears to be older than the one
+ for the existing entry, then the client SHOULD repeat the request
+ unconditionally, and include
+
+ Cache-Control: max-age=0
+
+ to force any intermediate caches to validate their copies directly
+ with the origin server, or
+
+ Cache-Control: no-cache
+
+ to force any intermediate caches to obtain a new copy from the origin
+ server.
+
+
+
+Fielding, et al. Standards Track [Page 84]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ If the Date values are equal, then the client MAY use either response
+ (or MAY, if it is being extremely prudent, request a new response).
+ Servers MUST NOT depend on clients being able to choose
+ deterministically between responses generated during the same second,
+ if their expiration times overlap.
+
+13.3 Validation Model
+
+ When a cache has a stale entry that it would like to use as a
+ response to a client's request, it first has to check with the origin
+ server (or possibly an intermediate cache with a fresh response) to
+ see if its cached entry is still usable. We call this "validating"
+ the cache entry. Since we do not want to have to pay the overhead of
+ retransmitting the full response if the cached entry is good, and we
+ do not want to pay the overhead of an extra round trip if the cached
+ entry is invalid, the HTTP/1.1 protocol supports the use of
+ conditional methods.
+
+ The key protocol features for supporting conditional methods are
+ those concerned with "cache validators." When an origin server
+ generates a full response, it attaches some sort of validator to it,
+ which is kept with the cache entry. When a client (user agent or
+ proxy cache) makes a conditional request for a resource for which it
+ has a cache entry, it includes the associated validator in the
+ request.
+
+ The server then checks that validator against the current validator
+ for the entity, and, if they match (see section 13.3.3), it responds
+ with a special status code (usually, 304 (Not Modified)) and no
+ entity-body. Otherwise, it returns a full response (including
+ entity-body). Thus, we avoid transmitting the full response if the
+ validator matches, and we avoid an extra round trip if it does not
+ match.
+
+ In HTTP/1.1, a conditional request looks exactly the same as a normal
+ request for the same resource, except that it carries a special
+ header (which includes the validator) that implicitly turns the
+ method (usually, GET) into a conditional.
+
+ The protocol includes both positive and negative senses of cache-
+ validating conditions. That is, it is possible to request either that
+ a method be performed if and only if a validator matches or if and
+ only if no validators match.
+
+
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 85]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ Note: a response that lacks a validator may still be cached, and
+ served from cache until it expires, unless this is explicitly
+ prohibited by a cache-control directive. However, a cache cannot
+ do a conditional retrieval if it does not have a validator for the
+ entity, which means it will not be refreshable after it expires.
+
+13.3.1 Last-Modified Dates
+
+ The Last-Modified entity-header field value is often used as a cache
+ validator. In simple terms, a cache entry is considered to be valid
+ if the entity has not been modified since the Last-Modified value.
+
+13.3.2 Entity Tag Cache Validators
+
+ The ETag response-header field value, an entity tag, provides for an
+ "opaque" cache validator. This might allow more reliable validation
+ in situations where it is inconvenient to store modification dates,
+ where the one-second resolution of HTTP date values is not
+ sufficient, or where the origin server wishes to avoid certain
+ paradoxes that might arise from the use of modification dates.
+
+ Entity Tags are described in section 3.11. The headers used with
+ entity tags are described in sections 14.19, 14.24, 14.26 and 14.44.
+
+13.3.3 Weak and Strong Validators
+
+ Since both origin servers and caches will compare two validators to
+ decide if they represent the same or different entities, one normally
+ would expect that if the entity (the entity-body or any entity-
+ headers) changes in any way, then the associated validator would
+ change as well. If this is true, then we call this validator a
+ "strong validator."
+
+ However, there might be cases when a server prefers to change the
+ validator only on semantically significant changes, and not when
+ insignificant aspects of the entity change. A validator that does not
+ always change when the resource changes is a "weak validator."
+
+ Entity tags are normally "strong validators," but the protocol
+ provides a mechanism to tag an entity tag as "weak." One can think of
+ a strong validator as one that changes whenever the bits of an entity
+ changes, while a weak value changes whenever the meaning of an entity
+ changes. Alternatively, one can think of a strong validator as part
+ of an identifier for a specific entity, while a weak validator is
+ part of an identifier for a set of semantically equivalent entities.
+
+ Note: One example of a strong validator is an integer that is
+ incremented in stable storage every time an entity is changed.
+
+
+
+Fielding, et al. Standards Track [Page 86]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ An entity's modification time, if represented with one-second
+ resolution, could be a weak validator, since it is possible that
+ the resource might be modified twice during a single second.
+
+ Support for weak validators is optional. However, weak validators
+ allow for more efficient caching of equivalent objects; for
+ example, a hit counter on a site is probably good enough if it is
+ updated every few days or weeks, and any value during that period
+ is likely "good enough" to be equivalent.
+
+ A "use" of a validator is either when a client generates a request
+ and includes the validator in a validating header field, or when a
+ server compares two validators.
+
+ Strong validators are usable in any context. Weak validators are only
+ usable in contexts that do not depend on exact equality of an entity.
+ For example, either kind is usable for a conditional GET of a full
+ entity. However, only a strong validator is usable for a sub-range
+ retrieval, since otherwise the client might end up with an internally
+ inconsistent entity.
+
+ Clients MAY issue simple (non-subrange) GET requests with either weak
+ validators or strong validators. Clients MUST NOT use weak validators
+ in other forms of request.
+
+ The only function that the HTTP/1.1 protocol defines on validators is
+ comparison. There are two validator comparison functions, depending
+ on whether the comparison context allows the use of weak validators
+ or not:
+
+ - The strong comparison function: in order to be considered equal,
+ both validators MUST be identical in every way, and both MUST
+ NOT be weak.
+
+ - The weak comparison function: in order to be considered equal,
+ both validators MUST be identical in every way, but either or
+ both of them MAY be tagged as "weak" without affecting the
+ result.
+
+ An entity tag is strong unless it is explicitly tagged as weak.
+ Section 3.11 gives the syntax for entity tags.
+
+ A Last-Modified time, when used as a validator in a request, is
+ implicitly weak unless it is possible to deduce that it is strong,
+ using the following rules:
+
+ - The validator is being compared by an origin server to the
+ actual current validator for the entity and,
+
+
+
+Fielding, et al. Standards Track [Page 87]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ - That origin server reliably knows that the associated entity did
+ not change twice during the second covered by the presented
+ validator.
+
+ or
+
+ - The validator is about to be used by a client in an If-
+ Modified-Since or If-Unmodified-Since header, because the client
+ has a cache entry for the associated entity, and
+
+ - That cache entry includes a Date value, which gives the time
+ when the origin server sent the original response, and
+
+ - The presented Last-Modified time is at least 60 seconds before
+ the Date value.
+
+ or
+
+ - The validator is being compared by an intermediate cache to the
+ validator stored in its cache entry for the entity, and
+
+ - That cache entry includes a Date value, which gives the time
+ when the origin server sent the original response, and
+
+ - The presented Last-Modified time is at least 60 seconds before
+ the Date value.
+
+ This method relies on the fact that if two different responses were
+ sent by the origin server during the same second, but both had the
+ same Last-Modified time, then at least one of those responses would
+ have a Date value equal to its Last-Modified time. The arbitrary 60-
+ second limit guards against the possibility that the Date and Last-
+ Modified values are generated from different clocks, or at somewhat
+ different times during the preparation of the response. An
+ implementation MAY use a value larger than 60 seconds, if it is
+ believed that 60 seconds is too short.
+
+ If a client wishes to perform a sub-range retrieval on a value for
+ which it has only a Last-Modified time and no opaque validator, it
+ MAY do this only if the Last-Modified time is strong in the sense
+ described here.
+
+ A cache or origin server receiving a conditional request, other than
+ a full-body GET request, MUST use the strong comparison function to
+ evaluate the condition.
+
+ These rules allow HTTP/1.1 caches and clients to safely perform sub-
+ range retrievals on values that have been obtained from HTTP/1.0
+
+
+
+Fielding, et al. Standards Track [Page 88]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ servers.
+
+13.3.4 Rules for When to Use Entity Tags and Last-Modified Dates
+
+ We adopt a set of rules and recommendations for origin servers,
+ clients, and caches regarding when various validator types ought to
+ be used, and for what purposes.
+
+ HTTP/1.1 origin servers:
+
+ - SHOULD send an entity tag validator unless it is not feasible to
+ generate one.
+
+ - MAY send a weak entity tag instead of a strong entity tag, if
+ performance considerations support the use of weak entity tags,
+ or if it is unfeasible to send a strong entity tag.
+
+ - SHOULD send a Last-Modified value if it is feasible to send one,
+ unless the risk of a breakdown in semantic transparency that
+ could result from using this date in an If-Modified-Since header
+ would lead to serious problems.
+
+ In other words, the preferred behavior for an HTTP/1.1 origin server
+ is to send both a strong entity tag and a Last-Modified value.
+
+ In order to be legal, a strong entity tag MUST change whenever the
+ associated entity value changes in any way. A weak entity tag SHOULD
+ change whenever the associated entity changes in a semantically
+ significant way.
+
+ Note: in order to provide semantically transparent caching, an
+ origin server must avoid reusing a specific strong entity tag
+ value for two different entities, or reusing a specific weak
+ entity tag value for two semantically different entities. Cache
+ entries might persist for arbitrarily long periods, regardless of
+ expiration times, so it might be inappropriate to expect that a
+ cache will never again attempt to validate an entry using a
+ validator that it obtained at some point in the past.
+
+ HTTP/1.1 clients:
+
+ - If an entity tag has been provided by the origin server, MUST
+ use that entity tag in any cache-conditional request (using If-
+ Match or If-None-Match).
+
+ - If only a Last-Modified value has been provided by the origin
+ server, SHOULD use that value in non-subrange cache-conditional
+ requests (using If-Modified-Since).
+
+
+
+Fielding, et al. Standards Track [Page 89]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ - If only a Last-Modified value has been provided by an HTTP/1.0
+ origin server, MAY use that value in subrange cache-conditional
+ requests (using If-Unmodified-Since:). The user agent SHOULD
+ provide a way to disable this, in case of difficulty.
+
+ - If both an entity tag and a Last-Modified value have been
+ provided by the origin server, SHOULD use both validators in
+ cache-conditional requests. This allows both HTTP/1.0 and
+ HTTP/1.1 caches to respond appropriately.
+
+ An HTTP/1.1 origin server, upon receiving a conditional request that
+ includes both a Last-Modified date (e.g., in an If-Modified-Since or
+ If-Unmodified-Since header field) and one or more entity tags (e.g.,
+ in an If-Match, If-None-Match, or If-Range header field) as cache
+ validators, MUST NOT return a response status of 304 (Not Modified)
+ unless doing so is consistent with all of the conditional header
+ fields in the request.
+
+ An HTTP/1.1 caching proxy, upon receiving a conditional request that
+ includes both a Last-Modified date and one or more entity tags as
+ cache validators, MUST NOT return a locally cached response to the
+ client unless that cached response is consistent with all of the
+ conditional header fields in the request.
+
+ Note: The general principle behind these rules is that HTTP/1.1
+ servers and clients should transmit as much non-redundant
+ information as is available in their responses and requests.
+ HTTP/1.1 systems receiving this information will make the most
+ conservative assumptions about the validators they receive.
+
+ HTTP/1.0 clients and caches will ignore entity tags. Generally,
+ last-modified values received or used by these systems will
+ support transparent and efficient caching, and so HTTP/1.1 origin
+ servers should provide Last-Modified values. In those rare cases
+ where the use of a Last-Modified value as a validator by an
+ HTTP/1.0 system could result in a serious problem, then HTTP/1.1
+ origin servers should not provide one.
+
+13.3.5 Non-validating Conditionals
+
+ The principle behind entity tags is that only the service author
+ knows the semantics of a resource well enough to select an
+ appropriate cache validation mechanism, and the specification of any
+ validator comparison function more complex than byte-equality would
+ open up a can of worms. Thus, comparisons of any other headers
+ (except Last-Modified, for compatibility with HTTP/1.0) are never
+ used for purposes of validating a cache entry.
+
+
+
+
+Fielding, et al. Standards Track [Page 90]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+13.4 Response Cacheability
+
+ Unless specifically constrained by a cache-control (section 14.9)
+ directive, a caching system MAY always store a successful response
+ (see section 13.8) as a cache entry, MAY return it without validation
+ if it is fresh, and MAY return it after successful validation. If
+ there is neither a cache validator nor an explicit expiration time
+ associated with a response, we do not expect it to be cached, but
+ certain caches MAY violate this expectation (for example, when little
+ or no network connectivity is available). A client can usually detect
+ that such a response was taken from a cache by comparing the Date
+ header to the current time.
+
+ Note: some HTTP/1.0 caches are known to violate this expectation
+ without providing any Warning.
+
+ However, in some cases it might be inappropriate for a cache to
+ retain an entity, or to return it in response to a subsequent
+ request. This might be because absolute semantic transparency is
+ deemed necessary by the service author, or because of security or
+ privacy considerations. Certain cache-control directives are
+ therefore provided so that the server can indicate that certain
+ resource entities, or portions thereof, are not to be cached
+ regardless of other considerations.
+
+ Note that section 14.8 normally prevents a shared cache from saving
+ and returning a response to a previous request if that request
+ included an Authorization header.
+
+ A response received with a status code of 200, 203, 206, 300, 301 or
+ 410 MAY be stored by a cache and used in reply to a subsequent
+ request, subject to the expiration mechanism, unless a cache-control
+ directive prohibits caching. However, a cache that does not support
+ the Range and Content-Range headers MUST NOT cache 206 (Partial
+ Content) responses.
+
+ A response received with any other status code (e.g. status codes 302
+ and 307) MUST NOT be returned in a reply to a subsequent request
+ unless there are cache-control directives or another header(s) that
+ explicitly allow it. For example, these include the following: an
+ Expires header (section 14.21); a "max-age", "s-maxage", "must-
+ revalidate", "proxy-revalidate", "public" or "private" cache-control
+ directive (section 14.9).
+
+
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 91]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+13.5 Constructing Responses From Caches
+
+ The purpose of an HTTP cache is to store information received in
+ response to requests for use in responding to future requests. In
+ many cases, a cache simply returns the appropriate parts of a
+ response to the requester. However, if the cache holds a cache entry
+ based on a previous response, it might have to combine parts of a new
+ response with what is held in the cache entry.
+
+13.5.1 End-to-end and Hop-by-hop Headers
+
+ For the purpose of defining the behavior of caches and non-caching
+ proxies, we divide HTTP headers into two categories:
+
+ - End-to-end headers, which are transmitted to the ultimate
+ recipient of a request or response. End-to-end headers in
+ responses MUST be stored as part of a cache entry and MUST be
+ transmitted in any response formed from a cache entry.
+
+ - Hop-by-hop headers, which are meaningful only for a single
+ transport-level connection, and are not stored by caches or
+ forwarded by proxies.
+
+ The following HTTP/1.1 headers are hop-by-hop headers:
+
+ - Connection
+ - Keep-Alive
+ - Proxy-Authenticate
+ - Proxy-Authorization
+ - TE
+ - Trailers
+ - Transfer-Encoding
+ - Upgrade
+
+ All other headers defined by HTTP/1.1 are end-to-end headers.
+
+ Other hop-by-hop headers MUST be listed in a Connection header,
+ (section 14.10) to be introduced into HTTP/1.1 (or later).
+
+13.5.2 Non-modifiable Headers
+
+ Some features of the HTTP/1.1 protocol, such as Digest
+ Authentication, depend on the value of certain end-to-end headers. A
+ transparent proxy SHOULD NOT modify an end-to-end header unless the
+ definition of that header requires or specifically allows that.
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 92]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ A transparent proxy MUST NOT modify any of the following fields in a
+ request or response, and it MUST NOT add any of these fields if not
+ already present:
+
+ - Content-Location
+
+ - Content-MD5
+
+ - ETag
+
+ - Last-Modified
+
+ A transparent proxy MUST NOT modify any of the following fields in a
+ response:
+
+ - Expires
+
+ but it MAY add any of these fields if not already present. If an
+ Expires header is added, it MUST be given a field-value identical to
+ that of the Date header in that response.
+
+ A proxy MUST NOT modify or add any of the following fields in a
+ message that contains the no-transform cache-control directive, or in
+ any request:
+
+ - Content-Encoding
+
+ - Content-Range
+
+ - Content-Type
+
+ A non-transparent proxy MAY modify or add these fields to a message
+ that does not include no-transform, but if it does so, it MUST add a
+ Warning 214 (Transformation applied) if one does not already appear
+ in the message (see section 14.46).
+
+ Warning: unnecessary modification of end-to-end headers might
+ cause authentication failures if stronger authentication
+ mechanisms are introduced in later versions of HTTP. Such
+ authentication mechanisms MAY rely on the values of header fields
+ not listed here.
+
+ The Content-Length field of a request or response is added or deleted
+ according to the rules in section 4.4. A transparent proxy MUST
+ preserve the entity-length (section 7.2.2) of the entity-body,
+ although it MAY change the transfer-length (section 4.4).
+
+
+
+
+
+Fielding, et al. Standards Track [Page 93]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+13.5.3 Combining Headers
+
+ When a cache makes a validating request to a server, and the server
+ provides a 304 (Not Modified) response or a 206 (Partial Content)
+ response, the cache then constructs a response to send to the
+ requesting client.
+
+ If the status code is 304 (Not Modified), the cache uses the entity-
+ body stored in the cache entry as the entity-body of this outgoing
+ response. If the status code is 206 (Partial Content) and the ETag or
+ Last-Modified headers match exactly, the cache MAY combine the
+ contents stored in the cache entry with the new contents received in
+ the response and use the result as the entity-body of this outgoing
+ response, (see 13.5.4).
+
+ The end-to-end headers stored in the cache entry are used for the
+ constructed response, except that
+
+ - any stored Warning headers with warn-code 1xx (see section
+ 14.46) MUST be deleted from the cache entry and the forwarded
+ response.
+
+ - any stored Warning headers with warn-code 2xx MUST be retained
+ in the cache entry and the forwarded response.
+
+ - any end-to-end headers provided in the 304 or 206 response MUST
+ replace the corresponding headers from the cache entry.
+
+ Unless the cache decides to remove the cache entry, it MUST also
+ replace the end-to-end headers stored with the cache entry with
+ corresponding headers received in the incoming response, except for
+ Warning headers as described immediately above. If a header field-
+ name in the incoming response matches more than one header in the
+ cache entry, all such old headers MUST be replaced.
+
+ In other words, the set of end-to-end headers received in the
+ incoming response overrides all corresponding end-to-end headers
+ stored with the cache entry (except for stored Warning headers with
+ warn-code 1xx, which are deleted even if not overridden).
+
+ Note: this rule allows an origin server to use a 304 (Not
+ Modified) or a 206 (Partial Content) response to update any header
+ associated with a previous response for the same entity or sub-
+ ranges thereof, although it might not always be meaningful or
+ correct to do so. This rule does not allow an origin server to use
+ a 304 (Not Modified) or a 206 (Partial Content) response to
+ entirely delete a header that it had provided with a previous
+ response.
+
+
+
+Fielding, et al. Standards Track [Page 94]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+13.5.4 Combining Byte Ranges
+
+ A response might transfer only a subrange of the bytes of an entity-
+ body, either because the request included one or more Range
+ specifications, or because a connection was broken prematurely. After
+ several such transfers, a cache might have received several ranges of
+ the same entity-body.
+
+ If a cache has a stored non-empty set of subranges for an entity, and
+ an incoming response transfers another subrange, the cache MAY
+ combine the new subrange with the existing set if both the following
+ conditions are met:
+
+ - Both the incoming response and the cache entry have a cache
+ validator.
+
+ - The two cache validators match using the strong comparison
+ function (see section 13.3.3).
+
+ If either requirement is not met, the cache MUST use only the most
+ recent partial response (based on the Date values transmitted with
+ every response, and using the incoming response if these values are
+ equal or missing), and MUST discard the other partial information.
+
+13.6 Caching Negotiated Responses
+
+ Use of server-driven content negotiation (section 12.1), as indicated
+ by the presence of a Vary header field in a response, alters the
+ conditions and procedure by which a cache can use the response for
+ subsequent requests. See section 14.44 for use of the Vary header
+ field by servers.
+
+ A server SHOULD use the Vary header field to inform a cache of what
+ request-header fields were used to select among multiple
+ representations of a cacheable response subject to server-driven
+ negotiation. The set of header fields named by the Vary field value
+ is known as the "selecting" request-headers.
+
+ When the cache receives a subsequent request whose Request-URI
+ specifies one or more cache entries including a Vary header field,
+ the cache MUST NOT use such a cache entry to construct a response to
+ the new request unless all of the selecting request-headers present
+ in the new request match the corresponding stored request-headers in
+ the original request.
+
+ The selecting request-headers from two requests are defined to match
+ if and only if the selecting request-headers in the first request can
+ be transformed to the selecting request-headers in the second request
+
+
+
+Fielding, et al. Standards Track [Page 95]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ by adding or removing linear white space (LWS) at places where this
+ is allowed by the corresponding BNF, and/or combining multiple
+ message-header fields with the same field name following the rules
+ about message headers in section 4.2.
+
+ A Vary header field-value of "*" always fails to match and subsequent
+ requests on that resource can only be properly interpreted by the
+ origin server.
+
+ If the selecting request header fields for the cached entry do not
+ match the selecting request header fields of the new request, then
+ the cache MUST NOT use a cached entry to satisfy the request unless
+ it first relays the new request to the origin server in a conditional
+ request and the server responds with 304 (Not Modified), including an
+ entity tag or Content-Location that indicates the entity to be used.
+
+ If an entity tag was assigned to a cached representation, the
+ forwarded request SHOULD be conditional and include the entity tags
+ in an If-None-Match header field from all its cache entries for the
+ resource. This conveys to the server the set of entities currently
+ held by the cache, so that if any one of these entities matches the
+ requested entity, the server can use the ETag header field in its 304
+ (Not Modified) response to tell the cache which entry is appropriate.
+ If the entity-tag of the new response matches that of an existing
+ entry, the new response SHOULD be used to update the header fields of
+ the existing entry, and the result MUST be returned to the client.
+
+ If any of the existing cache entries contains only partial content
+ for the associated entity, its entity-tag SHOULD NOT be included in
+ the If-None-Match header field unless the request is for a range that
+ would be fully satisfied by that entry.
+
+ If a cache receives a successful response whose Content-Location
+ field matches that of an existing cache entry for the same Request-
+ ]URI, whose entity-tag differs from that of the existing entry, and
+ whose Date is more recent than that of the existing entry, the
+ existing entry SHOULD NOT be returned in response to future requests
+ and SHOULD be deleted from the cache.
+
+13.7 Shared and Non-Shared Caches
+
+ For reasons of security and privacy, it is necessary to make a
+ distinction between "shared" and "non-shared" caches. A non-shared
+ cache is one that is accessible only to a single user. Accessibility
+ in this case SHOULD be enforced by appropriate security mechanisms.
+ All other caches are considered to be "shared." Other sections of
+
+
+
+
+
+Fielding, et al. Standards Track [Page 96]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ this specification place certain constraints on the operation of
+ shared caches in order to prevent loss of privacy or failure of
+ access controls.
+
+13.8 Errors or Incomplete Response Cache Behavior
+
+ A cache that receives an incomplete response (for example, with fewer
+ bytes of data than specified in a Content-Length header) MAY store
+ the response. However, the cache MUST treat this as a partial
+ response. Partial responses MAY be combined as described in section
+ 13.5.4; the result might be a full response or might still be
+ partial. A cache MUST NOT return a partial response to a client
+ without explicitly marking it as such, using the 206 (Partial
+ Content) status code. A cache MUST NOT return a partial response
+ using a status code of 200 (OK).
+
+ If a cache receives a 5xx response while attempting to revalidate an
+ entry, it MAY either forward this response to the requesting client,
+ or act as if the server failed to respond. In the latter case, it MAY
+ return a previously received response unless the cached entry
+ includes the "must-revalidate" cache-control directive (see section
+ 14.9).
+
+13.9 Side Effects of GET and HEAD
+
+ Unless the origin server explicitly prohibits the caching of their
+ responses, the application of GET and HEAD methods to any resources
+ SHOULD NOT have side effects that would lead to erroneous behavior if
+ these responses are taken from a cache. They MAY still have side
+ effects, but a cache is not required to consider such side effects in
+ its caching decisions. Caches are always expected to observe an
+ origin server's explicit restrictions on caching.
+
+ We note one exception to this rule: since some applications have
+ traditionally used GETs and HEADs with query URLs (those containing a
+ "?" in the rel_path part) to perform operations with significant side
+ effects, caches MUST NOT treat responses to such URIs as fresh unless
+ the server provides an explicit expiration time. This specifically
+ means that responses from HTTP/1.0 servers for such URIs SHOULD NOT
+ be taken from a cache. See section 9.1.1 for related information.
+
+13.10 Invalidation After Updates or Deletions
+
+ The effect of certain methods performed on a resource at the origin
+ server might cause one or more existing cache entries to become non-
+ transparently invalid. That is, although they might continue to be
+ "fresh," they do not accurately reflect what the origin server would
+ return for a new request on that resource.
+
+
+
+Fielding, et al. Standards Track [Page 97]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ There is no way for the HTTP protocol to guarantee that all such
+ cache entries are marked invalid. For example, the request that
+ caused the change at the origin server might not have gone through
+ the proxy where a cache entry is stored. However, several rules help
+ reduce the likelihood of erroneous behavior.
+
+ In this section, the phrase "invalidate an entity" means that the
+ cache will either remove all instances of that entity from its
+ storage, or will mark these as "invalid" and in need of a mandatory
+ revalidation before they can be returned in response to a subsequent
+ request.
+
+ Some HTTP methods MUST cause a cache to invalidate an entity. This is
+ either the entity referred to by the Request-URI, or by the Location
+ or Content-Location headers (if present). These methods are:
+
+ - PUT
+
+ - DELETE
+
+ - POST
+
+ In order to prevent denial of service attacks, an invalidation based
+ on the URI in a Location or Content-Location header MUST only be
+ performed if the host part is the same as in the Request-URI.
+
+ A cache that passes through requests for methods it does not
+ understand SHOULD invalidate any entities referred to by the
+ Request-URI.
+
+13.11 Write-Through Mandatory
+
+ All methods that might be expected to cause modifications to the
+ origin server's resources MUST be written through to the origin
+ server. This currently includes all methods except for GET and HEAD.
+ A cache MUST NOT reply to such a request from a client before having
+ transmitted the request to the inbound server, and having received a
+ corresponding response from the inbound server. This does not prevent
+ a proxy cache from sending a 100 (Continue) response before the
+ inbound server has sent its final reply.
+
+ The alternative (known as "write-back" or "copy-back" caching) is not
+ allowed in HTTP/1.1, due to the difficulty of providing consistent
+ updates and the problems arising from server, cache, or network
+ failure prior to write-back.
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 98]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+13.12 Cache Replacement
+
+ If a new cacheable (see sections 14.9.2, 13.2.5, 13.2.6 and 13.8)
+ response is received from a resource while any existing responses for
+ the same resource are cached, the cache SHOULD use the new response
+ to reply to the current request. It MAY insert it into cache storage
+ and MAY, if it meets all other requirements, use it to respond to any
+ future requests that would previously have caused the old response to
+ be returned. If it inserts the new response into cache storage the
+ rules in section 13.5.3 apply.
+
+ Note: a new response that has an older Date header value than
+ existing cached responses is not cacheable.
+
+13.13 History Lists
+
+ User agents often have history mechanisms, such as "Back" buttons and
+ history lists, which can be used to redisplay an entity retrieved
+ earlier in a session.
+
+ History mechanisms and caches are different. In particular history
+ mechanisms SHOULD NOT try to show a semantically transparent view of
+ the current state of a resource. Rather, a history mechanism is meant
+ to show exactly what the user saw at the time when the resource was
+ retrieved.
+
+ By default, an expiration time does not apply to history mechanisms.
+ If the entity is still in storage, a history mechanism SHOULD display
+ it even if the entity has expired, unless the user has specifically
+ configured the agent to refresh expired history documents.
+
+ This is not to be construed to prohibit the history mechanism from
+ telling the user that a view might be stale.
+
+ Note: if history list mechanisms unnecessarily prevent users from
+ viewing stale resources, this will tend to force service authors
+ to avoid using HTTP expiration controls and cache controls when
+ they would otherwise like to. Service authors may consider it
+ important that users not be presented with error messages or
+ warning messages when they use navigation controls (such as BACK)
+ to view previously fetched resources. Even though sometimes such
+ resources ought not to cached, or ought to expire quickly, user
+ interface considerations may force service authors to resort to
+ other means of preventing caching (e.g. "once-only" URLs) in order
+ not to suffer the effects of improperly functioning history
+ mechanisms.
+
+
+
+
+
+Fielding, et al. Standards Track [Page 99]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+14 Header Field Definitions
+
+ This section defines the syntax and semantics of all standard
+ HTTP/1.1 header fields. For entity-header fields, both sender and
+ recipient refer to either the client or the server, depending on who
+ sends and who receives the entity.
+
+14.1 Accept
+
+ The Accept request-header field can be used to specify certain media
+ types which are acceptable for the response. Accept headers can be
+ used to indicate that the request is specifically limited to a small
+ set of desired types, as in the case of a request for an in-line
+ image.
+
+ Accept = "Accept" ":"
+ #( media-range [ accept-params ] )
+
+ media-range = ( "*/*"
+ | ( type "/" "*" )
+ | ( type "/" subtype )
+ ) *( ";" parameter )
+ accept-params = ";" "q" "=" qvalue *( accept-extension )
+ accept-extension = ";" token [ "=" ( token | quoted-string ) ]
+
+ The asterisk "*" character is used to group media types into ranges,
+ with "*/*" indicating all media types and "type/*" indicating all
+ subtypes of that type. The media-range MAY include media type
+ parameters that are applicable to that range.
+
+ Each media-range MAY be followed by one or more accept-params,
+ beginning with the "q" parameter for indicating a relative quality
+ factor. The first "q" parameter (if any) separates the media-range
+ parameter(s) from the accept-params. Quality factors allow the user
+ or user agent to indicate the relative degree of preference for that
+ media-range, using the qvalue scale from 0 to 1 (section 3.9). The
+ default value is q=1.
+
+ Note: Use of the "q" parameter name to separate media type
+ parameters from Accept extension parameters is due to historical
+ practice. Although this prevents any media type parameter named
+ "q" from being used with a media range, such an event is believed
+ to be unlikely given the lack of any "q" parameters in the IANA
+ media type registry and the rare usage of any media type
+ parameters in Accept. Future media types are discouraged from
+ registering any parameter named "q".
+
+
+
+
+
+Fielding, et al. Standards Track [Page 100]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ The example
+
+ Accept: audio/*; q=0.2, audio/basic
+
+ SHOULD be interpreted as "I prefer audio/basic, but send me any audio
+ type if it is the best available after an 80% mark-down in quality."
+
+ If no Accept header field is present, then it is assumed that the
+ client accepts all media types. If an Accept header field is present,
+ and if the server cannot send a response which is acceptable
+ according to the combined Accept field value, then the server SHOULD
+ send a 406 (not acceptable) response.
+
+ A more elaborate example is
+
+ Accept: text/plain; q=0.5, text/html,
+ text/x-dvi; q=0.8, text/x-c
+
+ Verbally, this would be interpreted as "text/html and text/x-c are
+ the preferred media types, but if they do not exist, then send the
+ text/x-dvi entity, and if that does not exist, send the text/plain
+ entity."
+
+ Media ranges can be overridden by more specific media ranges or
+ specific media types. If more than one media range applies to a given
+ type, the most specific reference has precedence. For example,
+
+ Accept: text/*, text/html, text/html;level=1, */*
+
+ have the following precedence:
+
+ 1) text/html;level=1
+ 2) text/html
+ 3) text/*
+ 4) */*
+
+ The media type quality factor associated with a given type is
+ determined by finding the media range with the highest precedence
+ which matches that type. For example,
+
+ Accept: text/*;q=0.3, text/html;q=0.7, text/html;level=1,
+ text/html;level=2;q=0.4, */*;q=0.5
+
+ would cause the following values to be associated:
+
+ text/html;level=1 = 1
+ text/html = 0.7
+ text/plain = 0.3
+
+
+
+Fielding, et al. Standards Track [Page 101]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ image/jpeg = 0.5
+ text/html;level=2 = 0.4
+ text/html;level=3 = 0.7
+
+ Note: A user agent might be provided with a default set of quality
+ values for certain media ranges. However, unless the user agent is
+ a closed system which cannot interact with other rendering agents,
+ this default set ought to be configurable by the user.
+
+14.2 Accept-Charset
+
+ The Accept-Charset request-header field can be used to indicate what
+ character sets are acceptable for the response. This field allows
+ clients capable of understanding more comprehensive or special-
+ purpose character sets to signal that capability to a server which is
+ capable of representing documents in those character sets.
+
+ Accept-Charset = "Accept-Charset" ":"
+ 1#( ( charset | "*" )[ ";" "q" "=" qvalue ] )
+
+
+ Character set values are described in section 3.4. Each charset MAY
+ be given an associated quality value which represents the user's
+ preference for that charset. The default value is q=1. An example is
+
+ Accept-Charset: iso-8859-5, unicode-1-1;q=0.8
+
+ The special value "*", if present in the Accept-Charset field,
+ matches every character set (including ISO-8859-1) which is not
+ mentioned elsewhere in the Accept-Charset field. If no "*" is present
+ in an Accept-Charset field, then all character sets not explicitly
+ mentioned get a quality value of 0, except for ISO-8859-1, which gets
+ a quality value of 1 if not explicitly mentioned.
+
+ If no Accept-Charset header is present, the default is that any
+ character set is acceptable. If an Accept-Charset header is present,
+ and if the server cannot send a response which is acceptable
+ according to the Accept-Charset header, then the server SHOULD send
+ an error response with the 406 (not acceptable) status code, though
+ the sending of an unacceptable response is also allowed.
+
+14.3 Accept-Encoding
+
+ The Accept-Encoding request-header field is similar to Accept, but
+ restricts the content-codings (section 3.5) that are acceptable in
+ the response.
+
+ Accept-Encoding = "Accept-Encoding" ":"
+
+
+
+Fielding, et al. Standards Track [Page 102]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ 1#( codings [ ";" "q" "=" qvalue ] )
+ codings = ( content-coding | "*" )
+
+ Examples of its use are:
+
+ Accept-Encoding: compress, gzip
+ Accept-Encoding:
+ Accept-Encoding: *
+ Accept-Encoding: compress;q=0.5, gzip;q=1.0
+ Accept-Encoding: gzip;q=1.0, identity; q=0.5, *;q=0
+
+ A server tests whether a content-coding is acceptable, according to
+ an Accept-Encoding field, using these rules:
+
+ 1. If the content-coding is one of the content-codings listed in
+ the Accept-Encoding field, then it is acceptable, unless it is
+ accompanied by a qvalue of 0. (As defined in section 3.9, a
+ qvalue of 0 means "not acceptable.")
+
+ 2. The special "*" symbol in an Accept-Encoding field matches any
+ available content-coding not explicitly listed in the header
+ field.
+
+ 3. If multiple content-codings are acceptable, then the acceptable
+ content-coding with the highest non-zero qvalue is preferred.
+
+ 4. The "identity" content-coding is always acceptable, unless
+ specifically refused because the Accept-Encoding field includes
+ "identity;q=0", or because the field includes "*;q=0" and does
+ not explicitly include the "identity" content-coding. If the
+ Accept-Encoding field-value is empty, then only the "identity"
+ encoding is acceptable.
+
+ If an Accept-Encoding field is present in a request, and if the
+ server cannot send a response which is acceptable according to the
+ Accept-Encoding header, then the server SHOULD send an error response
+ with the 406 (Not Acceptable) status code.
+
+ If no Accept-Encoding field is present in a request, the server MAY
+ assume that the client will accept any content coding. In this case,
+ if "identity" is one of the available content-codings, then the
+ server SHOULD use the "identity" content-coding, unless it has
+ additional information that a different content-coding is meaningful
+ to the client.
+
+ Note: If the request does not include an Accept-Encoding field,
+ and if the "identity" content-coding is unavailable, then
+ content-codings commonly understood by HTTP/1.0 clients (i.e.,
+
+
+
+Fielding, et al. Standards Track [Page 103]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ "gzip" and "compress") are preferred; some older clients
+ improperly display messages sent with other content-codings. The
+ server might also make this decision based on information about
+ the particular user-agent or client.
+
+ Note: Most HTTP/1.0 applications do not recognize or obey qvalues
+ associated with content-codings. This means that qvalues will not
+ work and are not permitted with x-gzip or x-compress.
+
+14.4 Accept-Language
+
+ The Accept-Language request-header field is similar to Accept, but
+ restricts the set of natural languages that are preferred as a
+ response to the request. Language tags are defined in section 3.10.
+
+ Accept-Language = "Accept-Language" ":"
+ 1#( language-range [ ";" "q" "=" qvalue ] )
+ language-range = ( ( 1*8ALPHA *( "-" 1*8ALPHA ) ) | "*" )
+
+ Each language-range MAY be given an associated quality value which
+ represents an estimate of the user's preference for the languages
+ specified by that range. The quality value defaults to "q=1". For
+ example,
+
+ Accept-Language: da, en-gb;q=0.8, en;q=0.7
+
+ would mean: "I prefer Danish, but will accept British English and
+ other types of English." A language-range matches a language-tag if
+ it exactly equals the tag, or if it exactly equals a prefix of the
+ tag such that the first tag character following the prefix is "-".
+ The special range "*", if present in the Accept-Language field,
+ matches every tag not matched by any other range present in the
+ Accept-Language field.
+
+ Note: This use of a prefix matching rule does not imply that
+ language tags are assigned to languages in such a way that it is
+ always true that if a user understands a language with a certain
+ tag, then this user will also understand all languages with tags
+ for which this tag is a prefix. The prefix rule simply allows the
+ use of prefix tags if this is the case.
+
+ The language quality factor assigned to a language-tag by the
+ Accept-Language field is the quality value of the longest language-
+ range in the field that matches the language-tag. If no language-
+ range in the field matches the tag, the language quality factor
+ assigned is 0. If no Accept-Language header is present in the
+ request, the server
+
+
+
+
+Fielding, et al. Standards Track [Page 104]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ SHOULD assume that all languages are equally acceptable. If an
+ Accept-Language header is present, then all languages which are
+ assigned a quality factor greater than 0 are acceptable.
+
+ It might be contrary to the privacy expectations of the user to send
+ an Accept-Language header with the complete linguistic preferences of
+ the user in every request. For a discussion of this issue, see
+ section 15.1.4.
+
+ As intelligibility is highly dependent on the individual user, it is
+ recommended that client applications make the choice of linguistic
+ preference available to the user. If the choice is not made
+ available, then the Accept-Language header field MUST NOT be given in
+ the request.
+
+ Note: When making the choice of linguistic preference available to
+ the user, we remind implementors of the fact that users are not
+ familiar with the details of language matching as described above,
+ and should provide appropriate guidance. As an example, users
+ might assume that on selecting "en-gb", they will be served any
+ kind of English document if British English is not available. A
+ user agent might suggest in such a case to add "en" to get the
+ best matching behavior.
+
+14.5 Accept-Ranges
+
+ The Accept-Ranges response-header field allows the server to
+ indicate its acceptance of range requests for a resource:
+
+ Accept-Ranges = "Accept-Ranges" ":" acceptable-ranges
+ acceptable-ranges = 1#range-unit | "none"
+
+ Origin servers that accept byte-range requests MAY send
+
+ Accept-Ranges: bytes
+
+ but are not required to do so. Clients MAY generate byte-range
+ requests without having received this header for the resource
+ involved. Range units are defined in section 3.12.
+
+ Servers that do not accept any kind of range request for a
+ resource MAY send
+
+ Accept-Ranges: none
+
+ to advise the client not to attempt a range request.
+
+
+
+
+
+Fielding, et al. Standards Track [Page 105]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+14.6 Age
+
+ The Age response-header field conveys the sender's estimate of the
+ amount of time since the response (or its revalidation) was
+ generated at the origin server. A cached response is "fresh" if
+ its age does not exceed its freshness lifetime. Age values are
+ calculated as specified in section 13.2.3.
+
+ Age = "Age" ":" age-value
+ age-value = delta-seconds
+
+ Age values are non-negative decimal integers, representing time in
+ seconds.
+
+ If a cache receives a value larger than the largest positive
+ integer it can represent, or if any of its age calculations
+ overflows, it MUST transmit an Age header with a value of
+ 2147483648 (2^31). An HTTP/1.1 server that includes a cache MUST
+ include an Age header field in every response generated from its
+ own cache. Caches SHOULD use an arithmetic type of at least 31
+ bits of range.
+
+14.7 Allow
+
+ The Allow entity-header field lists the set of methods supported
+ by the resource identified by the Request-URI. The purpose of this
+ field is strictly to inform the recipient of valid methods
+ associated with the resource. An Allow header field MUST be
+ present in a 405 (Method Not Allowed) response.
+
+ Allow = "Allow" ":" #Method
+
+ Example of use:
+
+ Allow: GET, HEAD, PUT
+
+ This field cannot prevent a client from trying other methods.
+ However, the indications given by the Allow header field value
+ SHOULD be followed. The actual set of allowed methods is defined
+ by the origin server at the time of each request.
+
+ The Allow header field MAY be provided with a PUT request to
+ recommend the methods to be supported by the new or modified
+ resource. The server is not required to support these methods and
+ SHOULD include an Allow header in the response giving the actual
+ supported methods.
+
+
+
+
+
+Fielding, et al. Standards Track [Page 106]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ A proxy MUST NOT modify the Allow header field even if it does not
+ understand all the methods specified, since the user agent might
+ have other means of communicating with the origin server.
+
+14.8 Authorization
+
+ A user agent that wishes to authenticate itself with a server--
+ usually, but not necessarily, after receiving a 401 response--does
+ so by including an Authorization request-header field with the
+ request. The Authorization field value consists of credentials
+ containing the authentication information of the user agent for
+ the realm of the resource being requested.
+
+ Authorization = "Authorization" ":" credentials
+
+ HTTP access authentication is described in "HTTP Authentication:
+ Basic and Digest Access Authentication" [43]. If a request is
+ authenticated and a realm specified, the same credentials SHOULD
+ be valid for all other requests within this realm (assuming that
+ the authentication scheme itself does not require otherwise, such
+ as credentials that vary according to a challenge value or using
+ synchronized clocks).
+
+ When a shared cache (see section 13.7) receives a request
+ containing an Authorization field, it MUST NOT return the
+ corresponding response as a reply to any other request, unless one
+ of the following specific exceptions holds:
+
+ 1. If the response includes the "s-maxage" cache-control
+ directive, the cache MAY use that response in replying to a
+ subsequent request. But (if the specified maximum age has
+ passed) a proxy cache MUST first revalidate it with the origin
+ server, using the request-headers from the new request to allow
+ the origin server to authenticate the new request. (This is the
+ defined behavior for s-maxage.) If the response includes "s-
+ maxage=0", the proxy MUST always revalidate it before re-using
+ it.
+
+ 2. If the response includes the "must-revalidate" cache-control
+ directive, the cache MAY use that response in replying to a
+ subsequent request. But if the response is stale, all caches
+ MUST first revalidate it with the origin server, using the
+ request-headers from the new request to allow the origin server
+ to authenticate the new request.
+
+ 3. If the response includes the "public" cache-control directive,
+ it MAY be returned in reply to any subsequent request.
+
+
+
+
+Fielding, et al. Standards Track [Page 107]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+14.9 Cache-Control
+
+ The Cache-Control general-header field is used to specify directives
+ that MUST be obeyed by all caching mechanisms along the
+ request/response chain. The directives specify behavior intended to
+ prevent caches from adversely interfering with the request or
+ response. These directives typically override the default caching
+ algorithms. Cache directives are unidirectional in that the presence
+ of a directive in a request does not imply that the same directive is
+ to be given in the response.
+
+ Note that HTTP/1.0 caches might not implement Cache-Control and
+ might only implement Pragma: no-cache (see section 14.32).
+
+ Cache directives MUST be passed through by a proxy or gateway
+ application, regardless of their significance to that application,
+ since the directives might be applicable to all recipients along the
+ request/response chain. It is not possible to specify a cache-
+ directive for a specific cache.
+
+ Cache-Control = "Cache-Control" ":" 1#cache-directive
+
+ cache-directive = cache-request-directive
+ | cache-response-directive
+
+ cache-request-directive =
+ "no-cache" ; Section 14.9.1
+ | "no-store" ; Section 14.9.2
+ | "max-age" "=" delta-seconds ; Section 14.9.3, 14.9.4
+ | "max-stale" [ "=" delta-seconds ] ; Section 14.9.3
+ | "min-fresh" "=" delta-seconds ; Section 14.9.3
+ | "no-transform" ; Section 14.9.5
+ | "only-if-cached" ; Section 14.9.4
+ | cache-extension ; Section 14.9.6
+
+ cache-response-directive =
+ "public" ; Section 14.9.1
+ | "private" [ "=" <"> 1#field-name <"> ] ; Section 14.9.1
+ | "no-cache" [ "=" <"> 1#field-name <"> ]; Section 14.9.1
+ | "no-store" ; Section 14.9.2
+ | "no-transform" ; Section 14.9.5
+ | "must-revalidate" ; Section 14.9.4
+ | "proxy-revalidate" ; Section 14.9.4
+ | "max-age" "=" delta-seconds ; Section 14.9.3
+ | "s-maxage" "=" delta-seconds ; Section 14.9.3
+ | cache-extension ; Section 14.9.6
+
+ cache-extension = token [ "=" ( token | quoted-string ) ]
+
+
+
+Fielding, et al. Standards Track [Page 108]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ When a directive appears without any 1#field-name parameter, the
+ directive applies to the entire request or response. When such a
+ directive appears with a 1#field-name parameter, it applies only to
+ the named field or fields, and not to the rest of the request or
+ response. This mechanism supports extensibility; implementations of
+ future versions of the HTTP protocol might apply these directives to
+ header fields not defined in HTTP/1.1.
+
+ The cache-control directives can be broken down into these general
+ categories:
+
+ - Restrictions on what are cacheable; these may only be imposed by
+ the origin server.
+
+ - Restrictions on what may be stored by a cache; these may be
+ imposed by either the origin server or the user agent.
+
+ - Modifications of the basic expiration mechanism; these may be
+ imposed by either the origin server or the user agent.
+
+ - Controls over cache revalidation and reload; these may only be
+ imposed by a user agent.
+
+ - Control over transformation of entities.
+
+ - Extensions to the caching system.
+
+14.9.1 What is Cacheable
+
+ By default, a response is cacheable if the requirements of the
+ request method, request header fields, and the response status
+ indicate that it is cacheable. Section 13.4 summarizes these defaults
+ for cacheability. The following Cache-Control response directives
+ allow an origin server to override the default cacheability of a
+ response:
+
+ public
+ Indicates that the response MAY be cached by any cache, even if it
+ would normally be non-cacheable or cacheable only within a non-
+ shared cache. (See also Authorization, section 14.8, for
+ additional details.)
+
+ private
+ Indicates that all or part of the response message is intended for
+ a single user and MUST NOT be cached by a shared cache. This
+ allows an origin server to state that the specified parts of the
+
+
+
+
+
+Fielding, et al. Standards Track [Page 109]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ response are intended for only one user and are not a valid
+ response for requests by other users. A private (non-shared) cache
+ MAY cache the response.
+
+ Note: This usage of the word private only controls where the
+ response may be cached, and cannot ensure the privacy of the
+ message content.
+
+ no-cache
+ If the no-cache directive does not specify a field-name, then a
+ cache MUST NOT use the response to satisfy a subsequent request
+ without successful revalidation with the origin server. This
+ allows an origin server to prevent caching even by caches that
+ have been configured to return stale responses to client requests.
+
+ If the no-cache directive does specify one or more field-names,
+ then a cache MAY use the response to satisfy a subsequent request,
+ subject to any other restrictions on caching. However, the
+ specified field-name(s) MUST NOT be sent in the response to a
+ subsequent request without successful revalidation with the origin
+ server. This allows an origin server to prevent the re-use of
+ certain header fields in a response, while still allowing caching
+ of the rest of the response.
+
+ Note: Most HTTP/1.0 caches will not recognize or obey this
+ directive.
+
+14.9.2 What May be Stored by Caches
+
+ no-store
+ The purpose of the no-store directive is to prevent the
+ inadvertent release or retention of sensitive information (for
+ example, on backup tapes). The no-store directive applies to the
+ entire message, and MAY be sent either in a response or in a
+ request. If sent in a request, a cache MUST NOT store any part of
+ either this request or any response to it. If sent in a response,
+ a cache MUST NOT store any part of either this response or the
+ request that elicited it. This directive applies to both non-
+ shared and shared caches. "MUST NOT store" in this context means
+ that the cache MUST NOT intentionally store the information in
+ non-volatile storage, and MUST make a best-effort attempt to
+ remove the information from volatile storage as promptly as
+ possible after forwarding it.
+
+ Even when this directive is associated with a response, users
+ might explicitly store such a response outside of the caching
+ system (e.g., with a "Save As" dialog). History buffers MAY store
+ such responses as part of their normal operation.
+
+
+
+Fielding, et al. Standards Track [Page 110]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ The purpose of this directive is to meet the stated requirements
+ of certain users and service authors who are concerned about
+ accidental releases of information via unanticipated accesses to
+ cache data structures. While the use of this directive might
+ improve privacy in some cases, we caution that it is NOT in any
+ way a reliable or sufficient mechanism for ensuring privacy. In
+ particular, malicious or compromised caches might not recognize or
+ obey this directive, and communications networks might be
+ vulnerable to eavesdropping.
+
+14.9.3 Modifications of the Basic Expiration Mechanism
+
+ The expiration time of an entity MAY be specified by the origin
+ server using the Expires header (see section 14.21). Alternatively,
+ it MAY be specified using the max-age directive in a response. When
+ the max-age cache-control directive is present in a cached response,
+ the response is stale if its current age is greater than the age
+ value given (in seconds) at the time of a new request for that
+ resource. The max-age directive on a response implies that the
+ response is cacheable (i.e., "public") unless some other, more
+ restrictive cache directive is also present.
+
+ If a response includes both an Expires header and a max-age
+ directive, the max-age directive overrides the Expires header, even
+ if the Expires header is more restrictive. This rule allows an origin
+ server to provide, for a given response, a longer expiration time to
+ an HTTP/1.1 (or later) cache than to an HTTP/1.0 cache. This might be
+ useful if certain HTTP/1.0 caches improperly calculate ages or
+ expiration times, perhaps due to desynchronized clocks.
+
+ Many HTTP/1.0 cache implementations will treat an Expires value that
+ is less than or equal to the response Date value as being equivalent
+ to the Cache-Control response directive "no-cache". If an HTTP/1.1
+ cache receives such a response, and the response does not include a
+ Cache-Control header field, it SHOULD consider the response to be
+ non-cacheable in order to retain compatibility with HTTP/1.0 servers.
+
+ Note: An origin server might wish to use a relatively new HTTP
+ cache control feature, such as the "private" directive, on a
+ network including older caches that do not understand that
+ feature. The origin server will need to combine the new feature
+ with an Expires field whose value is less than or equal to the
+ Date value. This will prevent older caches from improperly
+ caching the response.
+
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 111]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ s-maxage
+ If a response includes an s-maxage directive, then for a shared
+ cache (but not for a private cache), the maximum age specified by
+ this directive overrides the maximum age specified by either the
+ max-age directive or the Expires header. The s-maxage directive
+ also implies the semantics of the proxy-revalidate directive (see
+ section 14.9.4), i.e., that the shared cache must not use the
+ entry after it becomes stale to respond to a subsequent request
+ without first revalidating it with the origin server. The s-
+ maxage directive is always ignored by a private cache.
+
+ Note that most older caches, not compliant with this specification,
+ do not implement any cache-control directives. An origin server
+ wishing to use a cache-control directive that restricts, but does not
+ prevent, caching by an HTTP/1.1-compliant cache MAY exploit the
+ requirement that the max-age directive overrides the Expires header,
+ and the fact that pre-HTTP/1.1-compliant caches do not observe the
+ max-age directive.
+
+ Other directives allow a user agent to modify the basic expiration
+ mechanism. These directives MAY be specified on a request:
+
+ max-age
+ Indicates that the client is willing to accept a response whose
+ age is no greater than the specified time in seconds. Unless max-
+ stale directive is also included, the client is not willing to
+ accept a stale response.
+
+ min-fresh
+ Indicates that the client is willing to accept a response whose
+ freshness lifetime is no less than its current age plus the
+ specified time in seconds. That is, the client wants a response
+ that will still be fresh for at least the specified number of
+ seconds.
+
+ max-stale
+ Indicates that the client is willing to accept a response that has
+ exceeded its expiration time. If max-stale is assigned a value,
+ then the client is willing to accept a response that has exceeded
+ its expiration time by no more than the specified number of
+ seconds. If no value is assigned to max-stale, then the client is
+ willing to accept a stale response of any age.
+
+ If a cache returns a stale response, either because of a max-stale
+ directive on a request, or because the cache is configured to
+ override the expiration time of a response, the cache MUST attach a
+ Warning header to the stale response, using Warning 110 (Response is
+ stale).
+
+
+
+Fielding, et al. Standards Track [Page 112]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ A cache MAY be configured to return stale responses without
+ validation, but only if this does not conflict with any "MUST"-level
+ requirements concerning cache validation (e.g., a "must-revalidate"
+ cache-control directive).
+
+ If both the new request and the cached entry include "max-age"
+ directives, then the lesser of the two values is used for determining
+ the freshness of the cached entry for that request.
+
+14.9.4 Cache Revalidation and Reload Controls
+
+ Sometimes a user agent might want or need to insist that a cache
+ revalidate its cache entry with the origin server (and not just with
+ the next cache along the path to the origin server), or to reload its
+ cache entry from the origin server. End-to-end revalidation might be
+ necessary if either the cache or the origin server has overestimated
+ the expiration time of the cached response. End-to-end reload may be
+ necessary if the cache entry has become corrupted for some reason.
+
+ End-to-end revalidation may be requested either when the client does
+ not have its own local cached copy, in which case we call it
+ "unspecified end-to-end revalidation", or when the client does have a
+ local cached copy, in which case we call it "specific end-to-end
+ revalidation."
+
+ The client can specify these three kinds of action using Cache-
+ Control request directives:
+
+ End-to-end reload
+ The request includes a "no-cache" cache-control directive or, for
+ compatibility with HTTP/1.0 clients, "Pragma: no-cache". Field
+ names MUST NOT be included with the no-cache directive in a
+ request. The server MUST NOT use a cached copy when responding to
+ such a request.
+
+ Specific end-to-end revalidation
+ The request includes a "max-age=0" cache-control directive, which
+ forces each cache along the path to the origin server to
+ revalidate its own entry, if any, with the next cache or server.
+ The initial request includes a cache-validating conditional with
+ the client's current validator.
+
+ Unspecified end-to-end revalidation
+ The request includes "max-age=0" cache-control directive, which
+ forces each cache along the path to the origin server to
+ revalidate its own entry, if any, with the next cache or server.
+ The initial request does not include a cache-validating
+
+
+
+
+Fielding, et al. Standards Track [Page 113]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ conditional; the first cache along the path (if any) that holds a
+ cache entry for this resource includes a cache-validating
+ conditional with its current validator.
+
+ max-age
+ When an intermediate cache is forced, by means of a max-age=0
+ directive, to revalidate its own cache entry, and the client has
+ supplied its own validator in the request, the supplied validator
+ might differ from the validator currently stored with the cache
+ entry. In this case, the cache MAY use either validator in making
+ its own request without affecting semantic transparency.
+
+ However, the choice of validator might affect performance. The
+ best approach is for the intermediate cache to use its own
+ validator when making its request. If the server replies with 304
+ (Not Modified), then the cache can return its now validated copy
+ to the client with a 200 (OK) response. If the server replies with
+ a new entity and cache validator, however, the intermediate cache
+ can compare the returned validator with the one provided in the
+ client's request, using the strong comparison function. If the
+ client's validator is equal to the origin server's, then the
+ intermediate cache simply returns 304 (Not Modified). Otherwise,
+ it returns the new entity with a 200 (OK) response.
+
+ If a request includes the no-cache directive, it SHOULD NOT
+ include min-fresh, max-stale, or max-age.
+
+ only-if-cached
+ In some cases, such as times of extremely poor network
+ connectivity, a client may want a cache to return only those
+ responses that it currently has stored, and not to reload or
+ revalidate with the origin server. To do this, the client may
+ include the only-if-cached directive in a request. If it receives
+ this directive, a cache SHOULD either respond using a cached entry
+ that is consistent with the other constraints of the request, or
+ respond with a 504 (Gateway Timeout) status. However, if a group
+ of caches is being operated as a unified system with good internal
+ connectivity, such a request MAY be forwarded within that group of
+ caches.
+
+ must-revalidate
+ Because a cache MAY be configured to ignore a server's specified
+ expiration time, and because a client request MAY include a max-
+ stale directive (which has a similar effect), the protocol also
+ includes a mechanism for the origin server to require revalidation
+ of a cache entry on any subsequent use. When the must-revalidate
+ directive is present in a response received by a cache, that cache
+ MUST NOT use the entry after it becomes stale to respond to a
+
+
+
+Fielding, et al. Standards Track [Page 114]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ subsequent request without first revalidating it with the origin
+ server. (I.e., the cache MUST do an end-to-end revalidation every
+ time, if, based solely on the origin server's Expires or max-age
+ value, the cached response is stale.)
+
+ The must-revalidate directive is necessary to support reliable
+ operation for certain protocol features. In all circumstances an
+ HTTP/1.1 cache MUST obey the must-revalidate directive; in
+ particular, if the cache cannot reach the origin server for any
+ reason, it MUST generate a 504 (Gateway Timeout) response.
+
+ Servers SHOULD send the must-revalidate directive if and only if
+ failure to revalidate a request on the entity could result in
+ incorrect operation, such as a silently unexecuted financial
+ transaction. Recipients MUST NOT take any automated action that
+ violates this directive, and MUST NOT automatically provide an
+ unvalidated copy of the entity if revalidation fails.
+
+ Although this is not recommended, user agents operating under
+ severe connectivity constraints MAY violate this directive but, if
+ so, MUST explicitly warn the user that an unvalidated response has
+ been provided. The warning MUST be provided on each unvalidated
+ access, and SHOULD require explicit user confirmation.
+
+ proxy-revalidate
+ The proxy-revalidate directive has the same meaning as the must-
+ revalidate directive, except that it does not apply to non-shared
+ user agent caches. It can be used on a response to an
+ authenticated request to permit the user's cache to store and
+ later return the response without needing to revalidate it (since
+ it has already been authenticated once by that user), while still
+ requiring proxies that service many users to revalidate each time
+ (in order to make sure that each user has been authenticated).
+ Note that such authenticated responses also need the public cache
+ control directive in order to allow them to be cached at all.
+
+14.9.5 No-Transform Directive
+
+ no-transform
+ Implementors of intermediate caches (proxies) have found it useful
+ to convert the media type of certain entity bodies. A non-
+ transparent proxy might, for example, convert between image
+ formats in order to save cache space or to reduce the amount of
+ traffic on a slow link.
+
+ Serious operational problems occur, however, when these
+ transformations are applied to entity bodies intended for certain
+ kinds of applications. For example, applications for medical
+
+
+
+Fielding, et al. Standards Track [Page 115]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ imaging, scientific data analysis and those using end-to-end
+ authentication, all depend on receiving an entity body that is bit
+ for bit identical to the original entity-body.
+
+ Therefore, if a message includes the no-transform directive, an
+ intermediate cache or proxy MUST NOT change those headers that are
+ listed in section 13.5.2 as being subject to the no-transform
+ directive. This implies that the cache or proxy MUST NOT change
+ any aspect of the entity-body that is specified by these headers,
+ including the value of the entity-body itself.
+
+14.9.6 Cache Control Extensions
+
+ The Cache-Control header field can be extended through the use of one
+ or more cache-extension tokens, each with an optional assigned value.
+ Informational extensions (those which do not require a change in
+ cache behavior) MAY be added without changing the semantics of other
+ directives. Behavioral extensions are designed to work by acting as
+ modifiers to the existing base of cache directives. Both the new
+ directive and the standard directive are supplied, such that
+ applications which do not understand the new directive will default
+ to the behavior specified by the standard directive, and those that
+ understand the new directive will recognize it as modifying the
+ requirements associated with the standard directive. In this way,
+ extensions to the cache-control directives can be made without
+ requiring changes to the base protocol.
+
+ This extension mechanism depends on an HTTP cache obeying all of the
+ cache-control directives defined for its native HTTP-version, obeying
+ certain extensions, and ignoring all directives that it does not
+ understand.
+
+ For example, consider a hypothetical new response directive called
+ community which acts as a modifier to the private directive. We
+ define this new directive to mean that, in addition to any non-shared
+ cache, any cache which is shared only by members of the community
+ named within its value may cache the response. An origin server
+ wishing to allow the UCI community to use an otherwise private
+ response in their shared cache(s) could do so by including
+
+ Cache-Control: private, community="UCI"
+
+ A cache seeing this header field will act correctly even if the cache
+ does not understand the community cache-extension, since it will also
+ see and understand the private directive and thus default to the safe
+ behavior.
+
+
+
+
+
+Fielding, et al. Standards Track [Page 116]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ Unrecognized cache-directives MUST be ignored; it is assumed that any
+ cache-directive likely to be unrecognized by an HTTP/1.1 cache will
+ be combined with standard directives (or the response's default
+ cacheability) such that the cache behavior will remain minimally
+ correct even if the cache does not understand the extension(s).
+
+14.10 Connection
+
+ The Connection general-header field allows the sender to specify
+ options that are desired for that particular connection and MUST NOT
+ be communicated by proxies over further connections.
+
+ The Connection header has the following grammar:
+
+ Connection = "Connection" ":" 1#(connection-token)
+ connection-token = token
+
+ HTTP/1.1 proxies MUST parse the Connection header field before a
+ message is forwarded and, for each connection-token in this field,
+ remove any header field(s) from the message with the same name as the
+ connection-token. Connection options are signaled by the presence of
+ a connection-token in the Connection header field, not by any
+ corresponding additional header field(s), since the additional header
+ field may not be sent if there are no parameters associated with that
+ connection option.
+
+ Message headers listed in the Connection header MUST NOT include
+ end-to-end headers, such as Cache-Control.
+
+ HTTP/1.1 defines the "close" connection option for the sender to
+ signal that the connection will be closed after completion of the
+ response. For example,
+
+ Connection: close
+
+ in either the request or the response header fields indicates that
+ the connection SHOULD NOT be considered `persistent' (section 8.1)
+ after the current request/response is complete.
+
+ HTTP/1.1 applications that do not support persistent connections MUST
+ include the "close" connection option in every message.
+
+ A system receiving an HTTP/1.0 (or lower-version) message that
+ includes a Connection header MUST, for each connection-token in this
+ field, remove and ignore any header field(s) from the message with
+ the same name as the connection-token. This protects against mistaken
+ forwarding of such header fields by pre-HTTP/1.1 proxies. See section
+ 19.6.2.
+
+
+
+Fielding, et al. Standards Track [Page 117]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+14.11 Content-Encoding
+
+ The Content-Encoding entity-header field is used as a modifier to the
+ media-type. When present, its value indicates what additional content
+ codings have been applied to the entity-body, and thus what decoding
+ mechanisms must be applied in order to obtain the media-type
+ referenced by the Content-Type header field. Content-Encoding is
+ primarily used to allow a document to be compressed without losing
+ the identity of its underlying media type.
+
+ Content-Encoding = "Content-Encoding" ":" 1#content-coding
+
+ Content codings are defined in section 3.5. An example of its use is
+
+ Content-Encoding: gzip
+
+ The content-coding is a characteristic of the entity identified by
+ the Request-URI. Typically, the entity-body is stored with this
+ encoding and is only decoded before rendering or analogous usage.
+ However, a non-transparent proxy MAY modify the content-coding if the
+ new coding is known to be acceptable to the recipient, unless the
+ "no-transform" cache-control directive is present in the message.
+
+ If the content-coding of an entity is not "identity", then the
+ response MUST include a Content-Encoding entity-header (section
+ 14.11) that lists the non-identity content-coding(s) used.
+
+ If the content-coding of an entity in a request message is not
+ acceptable to the origin server, the server SHOULD respond with a
+ status code of 415 (Unsupported Media Type).
+
+ If multiple encodings have been applied to an entity, the content
+ codings MUST be listed in the order in which they were applied.
+ Additional information about the encoding parameters MAY be provided
+ by other entity-header fields not defined by this specification.
+
+14.12 Content-Language
+
+ The Content-Language entity-header field describes the natural
+ language(s) of the intended audience for the enclosed entity. Note
+ that this might not be equivalent to all the languages used within
+ the entity-body.
+
+ Content-Language = "Content-Language" ":" 1#language-tag
+
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 118]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ Language tags are defined in section 3.10. The primary purpose of
+ Content-Language is to allow a user to identify and differentiate
+ entities according to the user's own preferred language. Thus, if the
+ body content is intended only for a Danish-literate audience, the
+ appropriate field is
+
+ Content-Language: da
+
+ If no Content-Language is specified, the default is that the content
+ is intended for all language audiences. This might mean that the
+ sender does not consider it to be specific to any natural language,
+ or that the sender does not know for which language it is intended.
+
+ Multiple languages MAY be listed for content that is intended for
+ multiple audiences. For example, a rendition of the "Treaty of
+ Waitangi," presented simultaneously in the original Maori and English
+ versions, would call for
+
+ Content-Language: mi, en
+
+ However, just because multiple languages are present within an entity
+ does not mean that it is intended for multiple linguistic audiences.
+ An example would be a beginner's language primer, such as "A First
+ Lesson in Latin," which is clearly intended to be used by an
+ English-literate audience. In this case, the Content-Language would
+ properly only include "en".
+
+ Content-Language MAY be applied to any media type -- it is not
+ limited to textual documents.
+
+14.13 Content-Length
+
+ The Content-Length entity-header field indicates the size of the
+ entity-body, in decimal number of OCTETs, sent to the recipient or,
+ in the case of the HEAD method, the size of the entity-body that
+ would have been sent had the request been a GET.
+
+ Content-Length = "Content-Length" ":" 1*DIGIT
+
+ An example is
+
+ Content-Length: 3495
+
+ Applications SHOULD use this field to indicate the transfer-length of
+ the message-body, unless this is prohibited by the rules in section
+ 4.4.
+
+
+
+
+
+Fielding, et al. Standards Track [Page 119]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ Any Content-Length greater than or equal to zero is a valid value.
+ Section 4.4 describes how to determine the length of a message-body
+ if a Content-Length is not given.
+
+ Note that the meaning of this field is significantly different from
+ the corresponding definition in MIME, where it is an optional field
+ used within the "message/external-body" content-type. In HTTP, it
+ SHOULD be sent whenever the message's length can be determined prior
+ to being transferred, unless this is prohibited by the rules in
+ section 4.4.
+
+14.14 Content-Location
+
+ The Content-Location entity-header field MAY be used to supply the
+ resource location for the entity enclosed in the message when that
+ entity is accessible from a location separate from the requested
+ resource's URI. A server SHOULD provide a Content-Location for the
+ variant corresponding to the response entity; especially in the case
+ where a resource has multiple entities associated with it, and those
+ entities actually have separate locations by which they might be
+ individually accessed, the server SHOULD provide a Content-Location
+ for the particular variant which is returned.
+
+ Content-Location = "Content-Location" ":"
+ ( absoluteURI | relativeURI )
+
+ The value of Content-Location also defines the base URI for the
+ entity.
+
+ The Content-Location value is not a replacement for the original
+ requested URI; it is only a statement of the location of the resource
+ corresponding to this particular entity at the time of the request.
+ Future requests MAY specify the Content-Location URI as the request-
+ URI if the desire is to identify the source of that particular
+ entity.
+
+ A cache cannot assume that an entity with a Content-Location
+ different from the URI used to retrieve it can be used to respond to
+ later requests on that Content-Location URI. However, the Content-
+ Location can be used to differentiate between multiple entities
+ retrieved from a single requested resource, as described in section
+ 13.6.
+
+ If the Content-Location is a relative URI, the relative URI is
+ interpreted relative to the Request-URI.
+
+ The meaning of the Content-Location header in PUT or POST requests is
+ undefined; servers are free to ignore it in those cases.
+
+
+
+Fielding, et al. Standards Track [Page 120]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+14.15 Content-MD5
+
+ The Content-MD5 entity-header field, as defined in RFC 1864 [23], is
+ an MD5 digest of the entity-body for the purpose of providing an
+ end-to-end message integrity check (MIC) of the entity-body. (Note: a
+ MIC is good for detecting accidental modification of the entity-body
+ in transit, but is not proof against malicious attacks.)
+
+ Content-MD5 = "Content-MD5" ":" md5-digest
+ md5-digest = <base64 of 128 bit MD5 digest as per RFC 1864>
+
+ The Content-MD5 header field MAY be generated by an origin server or
+ client to function as an integrity check of the entity-body. Only
+ origin servers or clients MAY generate the Content-MD5 header field;
+ proxies and gateways MUST NOT generate it, as this would defeat its
+ value as an end-to-end integrity check. Any recipient of the entity-
+ body, including gateways and proxies, MAY check that the digest value
+ in this header field matches that of the entity-body as received.
+
+ The MD5 digest is computed based on the content of the entity-body,
+ including any content-coding that has been applied, but not including
+ any transfer-encoding applied to the message-body. If the message is
+ received with a transfer-encoding, that encoding MUST be removed
+ prior to checking the Content-MD5 value against the received entity.
+
+ This has the result that the digest is computed on the octets of the
+ entity-body exactly as, and in the order that, they would be sent if
+ no transfer-encoding were being applied.
+
+ HTTP extends RFC 1864 to permit the digest to be computed for MIME
+ composite media-types (e.g., multipart/* and message/rfc822), but
+ this does not change how the digest is computed as defined in the
+ preceding paragraph.
+
+ There are several consequences of this. The entity-body for composite
+ types MAY contain many body-parts, each with its own MIME and HTTP
+ headers (including Content-MD5, Content-Transfer-Encoding, and
+ Content-Encoding headers). If a body-part has a Content-Transfer-
+ Encoding or Content-Encoding header, it is assumed that the content
+ of the body-part has had the encoding applied, and the body-part is
+ included in the Content-MD5 digest as is -- i.e., after the
+ application. The Transfer-Encoding header field is not allowed within
+ body-parts.
+
+ Conversion of all line breaks to CRLF MUST NOT be done before
+ computing or checking the digest: the line break convention used in
+ the text actually transmitted MUST be left unaltered when computing
+ the digest.
+
+
+
+Fielding, et al. Standards Track [Page 121]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ Note: while the definition of Content-MD5 is exactly the same for
+ HTTP as in RFC 1864 for MIME entity-bodies, there are several ways
+ in which the application of Content-MD5 to HTTP entity-bodies
+ differs from its application to MIME entity-bodies. One is that
+ HTTP, unlike MIME, does not use Content-Transfer-Encoding, and
+ does use Transfer-Encoding and Content-Encoding. Another is that
+ HTTP more frequently uses binary content types than MIME, so it is
+ worth noting that, in such cases, the byte order used to compute
+ the digest is the transmission byte order defined for the type.
+ Lastly, HTTP allows transmission of text types with any of several
+ line break conventions and not just the canonical form using CRLF.
+
+14.16 Content-Range
+
+ The Content-Range entity-header is sent with a partial entity-body to
+ specify where in the full entity-body the partial body should be
+ applied. Range units are defined in section 3.12.
+
+ Content-Range = "Content-Range" ":" content-range-spec
+
+ content-range-spec = byte-content-range-spec
+ byte-content-range-spec = bytes-unit SP
+ byte-range-resp-spec "/"
+ ( instance-length | "*" )
+
+ byte-range-resp-spec = (first-byte-pos "-" last-byte-pos)
+ | "*"
+ instance-length = 1*DIGIT
+
+ The header SHOULD indicate the total length of the full entity-body,
+ unless this length is unknown or difficult to determine. The asterisk
+ "*" character means that the instance-length is unknown at the time
+ when the response was generated.
+
+ Unlike byte-ranges-specifier values (see section 14.35.1), a byte-
+ range-resp-spec MUST only specify one range, and MUST contain
+ absolute byte positions for both the first and last byte of the
+ range.
+
+ A byte-content-range-spec with a byte-range-resp-spec whose last-
+ byte-pos value is less than its first-byte-pos value, or whose
+ instance-length value is less than or equal to its last-byte-pos
+ value, is invalid. The recipient of an invalid byte-content-range-
+ spec MUST ignore it and any content transferred along with it.
+
+ A server sending a response with status code 416 (Requested range not
+ satisfiable) SHOULD include a Content-Range field with a byte-range-
+ resp-spec of "*". The instance-length specifies the current length of
+
+
+
+Fielding, et al. Standards Track [Page 122]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ the selected resource. A response with status code 206 (Partial
+ Content) MUST NOT include a Content-Range field with a byte-range-
+ resp-spec of "*".
+
+ Examples of byte-content-range-spec values, assuming that the entity
+ contains a total of 1234 bytes:
+
+ . The first 500 bytes:
+ bytes 0-499/1234
+
+ . The second 500 bytes:
+ bytes 500-999/1234
+
+ . All except for the first 500 bytes:
+ bytes 500-1233/1234
+
+ . The last 500 bytes:
+ bytes 734-1233/1234
+
+ When an HTTP message includes the content of a single range (for
+ example, a response to a request for a single range, or to a request
+ for a set of ranges that overlap without any holes), this content is
+ transmitted with a Content-Range header, and a Content-Length header
+ showing the number of bytes actually transferred. For example,
+
+ HTTP/1.1 206 Partial content
+ Date: Wed, 15 Nov 1995 06:25:24 GMT
+ Last-Modified: Wed, 15 Nov 1995 04:58:08 GMT
+ Content-Range: bytes 21010-47021/47022
+ Content-Length: 26012
+ Content-Type: image/gif
+
+ When an HTTP message includes the content of multiple ranges (for
+ example, a response to a request for multiple non-overlapping
+ ranges), these are transmitted as a multipart message. The multipart
+ media type used for this purpose is "multipart/byteranges" as defined
+ in appendix 19.2. See appendix 19.6.3 for a compatibility issue.
+
+ A response to a request for a single range MUST NOT be sent using the
+ multipart/byteranges media type. A response to a request for
+ multiple ranges, whose result is a single range, MAY be sent as a
+ multipart/byteranges media type with one part. A client that cannot
+ decode a multipart/byteranges message MUST NOT ask for multiple
+ byte-ranges in a single request.
+
+ When a client requests multiple byte-ranges in one request, the
+ server SHOULD return them in the order that they appeared in the
+ request.
+
+
+
+Fielding, et al. Standards Track [Page 123]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ If the server ignores a byte-range-spec because it is syntactically
+ invalid, the server SHOULD treat the request as if the invalid Range
+ header field did not exist. (Normally, this means return a 200
+ response containing the full entity).
+
+ If the server receives a request (other than one including an If-
+ Range request-header field) with an unsatisfiable Range request-
+ header field (that is, all of whose byte-range-spec values have a
+ first-byte-pos value greater than the current length of the selected
+ resource), it SHOULD return a response code of 416 (Requested range
+ not satisfiable) (section 10.4.17).
+
+ Note: clients cannot depend on servers to send a 416 (Requested
+ range not satisfiable) response instead of a 200 (OK) response for
+ an unsatisfiable Range request-header, since not all servers
+ implement this request-header.
+
+14.17 Content-Type
+
+ The Content-Type entity-header field indicates the media type of the
+ entity-body sent to the recipient or, in the case of the HEAD method,
+ the media type that would have been sent had the request been a GET.
+
+ Content-Type = "Content-Type" ":" media-type
+
+ Media types are defined in section 3.7. An example of the field is
+
+ Content-Type: text/html; charset=ISO-8859-4
+
+ Further discussion of methods for identifying the media type of an
+ entity is provided in section 7.2.1.
+
+14.18 Date
+
+ The Date general-header field represents the date and time at which
+ the message was originated, having the same semantics as orig-date in
+ RFC 822. The field value is an HTTP-date, as described in section
+ 3.3.1; it MUST be sent in RFC 1123 [8]-date format.
+
+ Date = "Date" ":" HTTP-date
+
+ An example is
+
+ Date: Tue, 15 Nov 1994 08:12:31 GMT
+
+ Origin servers MUST include a Date header field in all responses,
+ except in these cases:
+
+
+
+
+Fielding, et al. Standards Track [Page 124]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ 1. If the response status code is 100 (Continue) or 101 (Switching
+ Protocols), the response MAY include a Date header field, at
+ the server's option.
+
+ 2. If the response status code conveys a server error, e.g. 500
+ (Internal Server Error) or 503 (Service Unavailable), and it is
+ inconvenient or impossible to generate a valid Date.
+
+ 3. If the server does not have a clock that can provide a
+ reasonable approximation of the current time, its responses
+ MUST NOT include a Date header field. In this case, the rules
+ in section 14.18.1 MUST be followed.
+
+ A received message that does not have a Date header field MUST be
+ assigned one by the recipient if the message will be cached by that
+ recipient or gatewayed via a protocol which requires a Date. An HTTP
+ implementation without a clock MUST NOT cache responses without
+ revalidating them on every use. An HTTP cache, especially a shared
+ cache, SHOULD use a mechanism, such as NTP [28], to synchronize its
+ clock with a reliable external standard.
+
+ Clients SHOULD only send a Date header field in messages that include
+ an entity-body, as in the case of the PUT and POST requests, and even
+ then it is optional. A client without a clock MUST NOT send a Date
+ header field in a request.
+
+ The HTTP-date sent in a Date header SHOULD NOT represent a date and
+ time subsequent to the generation of the message. It SHOULD represent
+ the best available approximation of the date and time of message
+ generation, unless the implementation has no means of generating a
+ reasonably accurate date and time. In theory, the date ought to
+ represent the moment just before the entity is generated. In
+ practice, the date can be generated at any time during the message
+ origination without affecting its semantic value.
+
+14.18.1 Clockless Origin Server Operation
+
+ Some origin server implementations might not have a clock available.
+ An origin server without a clock MUST NOT assign Expires or Last-
+ Modified values to a response, unless these values were associated
+ with the resource by a system or user with a reliable clock. It MAY
+ assign an Expires value that is known, at or before server
+ configuration time, to be in the past (this allows "pre-expiration"
+ of responses without storing separate Expires values for each
+ resource).
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 125]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+14.19 ETag
+
+ The ETag response-header field provides the current value of the
+ entity tag for the requested variant. The headers used with entity
+ tags are described in sections 14.24, 14.26 and 14.44. The entity tag
+ MAY be used for comparison with other entities from the same resource
+ (see section 13.3.3).
+
+ ETag = "ETag" ":" entity-tag
+
+ Examples:
+
+ ETag: "xyzzy"
+ ETag: W/"xyzzy"
+ ETag: ""
+
+14.20 Expect
+
+ The Expect request-header field is used to indicate that particular
+ server behaviors are required by the client.
+
+ Expect = "Expect" ":" 1#expectation
+
+ expectation = "100-continue" | expectation-extension
+ expectation-extension = token [ "=" ( token | quoted-string )
+ *expect-params ]
+ expect-params = ";" token [ "=" ( token | quoted-string ) ]
+
+
+ A server that does not understand or is unable to comply with any of
+ the expectation values in the Expect field of a request MUST respond
+ with appropriate error status. The server MUST respond with a 417
+ (Expectation Failed) status if any of the expectations cannot be met
+ or, if there are other problems with the request, some other 4xx
+ status.
+
+ This header field is defined with extensible syntax to allow for
+ future extensions. If a server receives a request containing an
+ Expect field that includes an expectation-extension that it does not
+ support, it MUST respond with a 417 (Expectation Failed) status.
+
+ Comparison of expectation values is case-insensitive for unquoted
+ tokens (including the 100-continue token), and is case-sensitive for
+ quoted-string expectation-extensions.
+
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 126]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ The Expect mechanism is hop-by-hop: that is, an HTTP/1.1 proxy MUST
+ return a 417 (Expectation Failed) status if it receives a request
+ with an expectation that it cannot meet. However, the Expect
+ request-header itself is end-to-end; it MUST be forwarded if the
+ request is forwarded.
+
+ Many older HTTP/1.0 and HTTP/1.1 applications do not understand the
+ Expect header.
+
+ See section 8.2.3 for the use of the 100 (continue) status.
+
+14.21 Expires
+
+ The Expires entity-header field gives the date/time after which the
+ response is considered stale. A stale cache entry may not normally be
+ returned by a cache (either a proxy cache or a user agent cache)
+ unless it is first validated with the origin server (or with an
+ intermediate cache that has a fresh copy of the entity). See section
+ 13.2 for further discussion of the expiration model.
+
+ The presence of an Expires field does not imply that the original
+ resource will change or cease to exist at, before, or after that
+ time.
+
+ The format is an absolute date and time as defined by HTTP-date in
+ section 3.3.1; it MUST be in RFC 1123 date format:
+
+ Expires = "Expires" ":" HTTP-date
+
+ An example of its use is
+
+ Expires: Thu, 01 Dec 1994 16:00:00 GMT
+
+ Note: if a response includes a Cache-Control field with the max-
+ age directive (see section 14.9.3), that directive overrides the
+ Expires field.
+
+ HTTP/1.1 clients and caches MUST treat other invalid date formats,
+ especially including the value "0", as in the past (i.e., "already
+ expired").
+
+ To mark a response as "already expired," an origin server sends an
+ Expires date that is equal to the Date header value. (See the rules
+ for expiration calculations in section 13.2.4.)
+
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 127]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ To mark a response as "never expires," an origin server sends an
+ Expires date approximately one year from the time the response is
+ sent. HTTP/1.1 servers SHOULD NOT send Expires dates more than one
+ year in the future.
+
+ The presence of an Expires header field with a date value of some
+ time in the future on a response that otherwise would by default be
+ non-cacheable indicates that the response is cacheable, unless
+ indicated otherwise by a Cache-Control header field (section 14.9).
+
+14.22 From
+
+ The From request-header field, if given, SHOULD contain an Internet
+ e-mail address for the human user who controls the requesting user
+ agent. The address SHOULD be machine-usable, as defined by "mailbox"
+ in RFC 822 [9] as updated by RFC 1123 [8]:
+
+ From = "From" ":" mailbox
+
+ An example is:
+
+ From: webmaster@w3.org
+
+ This header field MAY be used for logging purposes and as a means for
+ identifying the source of invalid or unwanted requests. It SHOULD NOT
+ be used as an insecure form of access protection. The interpretation
+ of this field is that the request is being performed on behalf of the
+ person given, who accepts responsibility for the method performed. In
+ particular, robot agents SHOULD include this header so that the
+ person responsible for running the robot can be contacted if problems
+ occur on the receiving end.
+
+ The Internet e-mail address in this field MAY be separate from the
+ Internet host which issued the request. For example, when a request
+ is passed through a proxy the original issuer's address SHOULD be
+ used.
+
+ The client SHOULD NOT send the From header field without the user's
+ approval, as it might conflict with the user's privacy interests or
+ their site's security policy. It is strongly recommended that the
+ user be able to disable, enable, and modify the value of this field
+ at any time prior to a request.
+
+14.23 Host
+
+ The Host request-header field specifies the Internet host and port
+ number of the resource being requested, as obtained from the original
+ URI given by the user or referring resource (generally an HTTP URL,
+
+
+
+Fielding, et al. Standards Track [Page 128]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ as described in section 3.2.2). The Host field value MUST represent
+ the naming authority of the origin server or gateway given by the
+ original URL. This allows the origin server or gateway to
+ differentiate between internally-ambiguous URLs, such as the root "/"
+ URL of a server for multiple host names on a single IP address.
+
+ Host = "Host" ":" host [ ":" port ] ; Section 3.2.2
+
+ A "host" without any trailing port information implies the default
+ port for the service requested (e.g., "80" for an HTTP URL). For
+ example, a request on the origin server for
+ <http://www.w3.org/pub/WWW/> would properly include:
+
+ GET /pub/WWW/ HTTP/1.1
+ Host: www.w3.org
+
+ A client MUST include a Host header field in all HTTP/1.1 request
+ messages . If the requested URI does not include an Internet host
+ name for the service being requested, then the Host header field MUST
+ be given with an empty value. An HTTP/1.1 proxy MUST ensure that any
+ request message it forwards does contain an appropriate Host header
+ field that identifies the service being requested by the proxy. All
+ Internet-based HTTP/1.1 servers MUST respond with a 400 (Bad Request)
+ status code to any HTTP/1.1 request message which lacks a Host header
+ field.
+
+ See sections 5.2 and 19.6.1.1 for other requirements relating to
+ Host.
+
+14.24 If-Match
+
+ The If-Match request-header field is used with a method to make it
+ conditional. A client that has one or more entities previously
+ obtained from the resource can verify that one of those entities is
+ current by including a list of their associated entity tags in the
+ If-Match header field. Entity tags are defined in section 3.11. The
+ purpose of this feature is to allow efficient updates of cached
+ information with a minimum amount of transaction overhead. It is also
+ used, on updating requests, to prevent inadvertent modification of
+ the wrong version of a resource. As a special case, the value "*"
+ matches any current entity of the resource.
+
+ If-Match = "If-Match" ":" ( "*" | 1#entity-tag )
+
+ If any of the entity tags match the entity tag of the entity that
+ would have been returned in the response to a similar GET request
+ (without the If-Match header) on that resource, or if "*" is given
+
+
+
+
+Fielding, et al. Standards Track [Page 129]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ and any current entity exists for that resource, then the server MAY
+ perform the requested method as if the If-Match header field did not
+ exist.
+
+ A server MUST use the strong comparison function (see section 13.3.3)
+ to compare the entity tags in If-Match.
+
+ If none of the entity tags match, or if "*" is given and no current
+ entity exists, the server MUST NOT perform the requested method, and
+ MUST return a 412 (Precondition Failed) response. This behavior is
+ most useful when the client wants to prevent an updating method, such
+ as PUT, from modifying a resource that has changed since the client
+ last retrieved it.
+
+ If the request would, without the If-Match header field, result in
+ anything other than a 2xx or 412 status, then the If-Match header
+ MUST be ignored.
+
+ The meaning of "If-Match: *" is that the method SHOULD be performed
+ if the representation selected by the origin server (or by a cache,
+ possibly using the Vary mechanism, see section 14.44) exists, and
+ MUST NOT be performed if the representation does not exist.
+
+ A request intended to update a resource (e.g., a PUT) MAY include an
+ If-Match header field to signal that the request method MUST NOT be
+ applied if the entity corresponding to the If-Match value (a single
+ entity tag) is no longer a representation of that resource. This
+ allows the user to indicate that they do not wish the request to be
+ successful if the resource has been changed without their knowledge.
+ Examples:
+
+ If-Match: "xyzzy"
+ If-Match: "xyzzy", "r2d2xxxx", "c3piozzzz"
+ If-Match: *
+
+ The result of a request having both an If-Match header field and
+ either an If-None-Match or an If-Modified-Since header fields is
+ undefined by this specification.
+
+14.25 If-Modified-Since
+
+ The If-Modified-Since request-header field is used with a method to
+ make it conditional: if the requested variant has not been modified
+ since the time specified in this field, an entity will not be
+ returned from the server; instead, a 304 (not modified) response will
+ be returned without any message-body.
+
+ If-Modified-Since = "If-Modified-Since" ":" HTTP-date
+
+
+
+Fielding, et al. Standards Track [Page 130]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ An example of the field is:
+
+ If-Modified-Since: Sat, 29 Oct 1994 19:43:31 GMT
+
+ A GET method with an If-Modified-Since header and no Range header
+ requests that the identified entity be transferred only if it has
+ been modified since the date given by the If-Modified-Since header.
+ The algorithm for determining this includes the following cases:
+
+ a) If the request would normally result in anything other than a
+ 200 (OK) status, or if the passed If-Modified-Since date is
+ invalid, the response is exactly the same as for a normal GET.
+ A date which is later than the server's current time is
+ invalid.
+
+ b) If the variant has been modified since the If-Modified-Since
+ date, the response is exactly the same as for a normal GET.
+
+ c) If the variant has not been modified since a valid If-
+ Modified-Since date, the server SHOULD return a 304 (Not
+ Modified) response.
+
+ The purpose of this feature is to allow efficient updates of cached
+ information with a minimum amount of transaction overhead.
+
+ Note: The Range request-header field modifies the meaning of If-
+ Modified-Since; see section 14.35 for full details.
+
+ Note: If-Modified-Since times are interpreted by the server, whose
+ clock might not be synchronized with the client.
+
+ Note: When handling an If-Modified-Since header field, some
+ servers will use an exact date comparison function, rather than a
+ less-than function, for deciding whether to send a 304 (Not
+ Modified) response. To get best results when sending an If-
+ Modified-Since header field for cache validation, clients are
+ advised to use the exact date string received in a previous Last-
+ Modified header field whenever possible.
+
+ Note: If a client uses an arbitrary date in the If-Modified-Since
+ header instead of a date taken from the Last-Modified header for
+ the same request, the client should be aware of the fact that this
+ date is interpreted in the server's understanding of time. The
+ client should consider unsynchronized clocks and rounding problems
+ due to the different encodings of time between the client and
+ server. This includes the possibility of race conditions if the
+ document has changed between the time it was first requested and
+ the If-Modified-Since date of a subsequent request, and the
+
+
+
+Fielding, et al. Standards Track [Page 131]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ possibility of clock-skew-related problems if the If-Modified-
+ Since date is derived from the client's clock without correction
+ to the server's clock. Corrections for different time bases
+ between client and server are at best approximate due to network
+ latency.
+
+ The result of a request having both an If-Modified-Since header field
+ and either an If-Match or an If-Unmodified-Since header fields is
+ undefined by this specification.
+
+14.26 If-None-Match
+
+ The If-None-Match request-header field is used with a method to make
+ it conditional. A client that has one or more entities previously
+ obtained from the resource can verify that none of those entities is
+ current by including a list of their associated entity tags in the
+ If-None-Match header field. The purpose of this feature is to allow
+ efficient updates of cached information with a minimum amount of
+ transaction overhead. It is also used to prevent a method (e.g. PUT)
+ from inadvertently modifying an existing resource when the client
+ believes that the resource does not exist.
+
+ As a special case, the value "*" matches any current entity of the
+ resource.
+
+ If-None-Match = "If-None-Match" ":" ( "*" | 1#entity-tag )
+
+ If any of the entity tags match the entity tag of the entity that
+ would have been returned in the response to a similar GET request
+ (without the If-None-Match header) on that resource, or if "*" is
+ given and any current entity exists for that resource, then the
+ server MUST NOT perform the requested method, unless required to do
+ so because the resource's modification date fails to match that
+ supplied in an If-Modified-Since header field in the request.
+ Instead, if the request method was GET or HEAD, the server SHOULD
+ respond with a 304 (Not Modified) response, including the cache-
+ related header fields (particularly ETag) of one of the entities that
+ matched. For all other request methods, the server MUST respond with
+ a status of 412 (Precondition Failed).
+
+ See section 13.3.3 for rules on how to determine if two entities tags
+ match. The weak comparison function can only be used with GET or HEAD
+ requests.
+
+
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 132]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ If none of the entity tags match, then the server MAY perform the
+ requested method as if the If-None-Match header field did not exist,
+ but MUST also ignore any If-Modified-Since header field(s) in the
+ request. That is, if no entity tags match, then the server MUST NOT
+ return a 304 (Not Modified) response.
+
+ If the request would, without the If-None-Match header field, result
+ in anything other than a 2xx or 304 status, then the If-None-Match
+ header MUST be ignored. (See section 13.3.4 for a discussion of
+ server behavior when both If-Modified-Since and If-None-Match appear
+ in the same request.)
+
+ The meaning of "If-None-Match: *" is that the method MUST NOT be
+ performed if the representation selected by the origin server (or by
+ a cache, possibly using the Vary mechanism, see section 14.44)
+ exists, and SHOULD be performed if the representation does not exist.
+ This feature is intended to be useful in preventing races between PUT
+ operations.
+
+ Examples:
+
+ If-None-Match: "xyzzy"
+ If-None-Match: W/"xyzzy"
+ If-None-Match: "xyzzy", "r2d2xxxx", "c3piozzzz"
+ If-None-Match: W/"xyzzy", W/"r2d2xxxx", W/"c3piozzzz"
+ If-None-Match: *
+
+ The result of a request having both an If-None-Match header field and
+ either an If-Match or an If-Unmodified-Since header fields is
+ undefined by this specification.
+
+14.27 If-Range
+
+ If a client has a partial copy of an entity in its cache, and wishes
+ to have an up-to-date copy of the entire entity in its cache, it
+ could use the Range request-header with a conditional GET (using
+ either or both of If-Unmodified-Since and If-Match.) However, if the
+ condition fails because the entity has been modified, the client
+ would then have to make a second request to obtain the entire current
+ entity-body.
+
+ The If-Range header allows a client to "short-circuit" the second
+ request. Informally, its meaning is `if the entity is unchanged, send
+ me the part(s) that I am missing; otherwise, send me the entire new
+ entity'.
+
+ If-Range = "If-Range" ":" ( entity-tag | HTTP-date )
+
+
+
+
+Fielding, et al. Standards Track [Page 133]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ If the client has no entity tag for an entity, but does have a Last-
+ Modified date, it MAY use that date in an If-Range header. (The
+ server can distinguish between a valid HTTP-date and any form of
+ entity-tag by examining no more than two characters.) The If-Range
+ header SHOULD only be used together with a Range header, and MUST be
+ ignored if the request does not include a Range header, or if the
+ server does not support the sub-range operation.
+
+ If the entity tag given in the If-Range header matches the current
+ entity tag for the entity, then the server SHOULD provide the
+ specified sub-range of the entity using a 206 (Partial content)
+ response. If the entity tag does not match, then the server SHOULD
+ return the entire entity using a 200 (OK) response.
+
+14.28 If-Unmodified-Since
+
+ The If-Unmodified-Since request-header field is used with a method to
+ make it conditional. If the requested resource has not been modified
+ since the time specified in this field, the server SHOULD perform the
+ requested operation as if the If-Unmodified-Since header were not
+ present.
+
+ If the requested variant has been modified since the specified time,
+ the server MUST NOT perform the requested operation, and MUST return
+ a 412 (Precondition Failed).
+
+ If-Unmodified-Since = "If-Unmodified-Since" ":" HTTP-date
+
+ An example of the field is:
+
+ If-Unmodified-Since: Sat, 29 Oct 1994 19:43:31 GMT
+
+ If the request normally (i.e., without the If-Unmodified-Since
+ header) would result in anything other than a 2xx or 412 status, the
+ If-Unmodified-Since header SHOULD be ignored.
+
+ If the specified date is invalid, the header is ignored.
+
+ The result of a request having both an If-Unmodified-Since header
+ field and either an If-None-Match or an If-Modified-Since header
+ fields is undefined by this specification.
+
+14.29 Last-Modified
+
+ The Last-Modified entity-header field indicates the date and time at
+ which the origin server believes the variant was last modified.
+
+ Last-Modified = "Last-Modified" ":" HTTP-date
+
+
+
+Fielding, et al. Standards Track [Page 134]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ An example of its use is
+
+ Last-Modified: Tue, 15 Nov 1994 12:45:26 GMT
+
+ The exact meaning of this header field depends on the implementation
+ of the origin server and the nature of the original resource. For
+ files, it may be just the file system last-modified time. For
+ entities with dynamically included parts, it may be the most recent
+ of the set of last-modify times for its component parts. For database
+ gateways, it may be the last-update time stamp of the record. For
+ virtual objects, it may be the last time the internal state changed.
+
+ An origin server MUST NOT send a Last-Modified date which is later
+ than the server's time of message origination. In such cases, where
+ the resource's last modification would indicate some time in the
+ future, the server MUST replace that date with the message
+ origination date.
+
+ An origin server SHOULD obtain the Last-Modified value of the entity
+ as close as possible to the time that it generates the Date value of
+ its response. This allows a recipient to make an accurate assessment
+ of the entity's modification time, especially if the entity changes
+ near the time that the response is generated.
+
+ HTTP/1.1 servers SHOULD send Last-Modified whenever feasible.
+
+14.30 Location
+
+ The Location response-header field is used to redirect the recipient
+ to a location other than the Request-URI for completion of the
+ request or identification of a new resource. For 201 (Created)
+ responses, the Location is that of the new resource which was created
+ by the request. For 3xx responses, the location SHOULD indicate the
+ server's preferred URI for automatic redirection to the resource. The
+ field value consists of a single absolute URI.
+
+ Location = "Location" ":" absoluteURI
+
+ An example is:
+
+ Location: http://www.w3.org/pub/WWW/People.html
+
+ Note: The Content-Location header field (section 14.14) differs
+ from Location in that the Content-Location identifies the original
+ location of the entity enclosed in the request. It is therefore
+ possible for a response to contain header fields for both Location
+ and Content-Location. Also see section 13.10 for cache
+ requirements of some methods.
+
+
+
+Fielding, et al. Standards Track [Page 135]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+14.31 Max-Forwards
+
+ The Max-Forwards request-header field provides a mechanism with the
+ TRACE (section 9.8) and OPTIONS (section 9.2) methods to limit the
+ number of proxies or gateways that can forward the request to the
+ next inbound server. This can be useful when the client is attempting
+ to trace a request chain which appears to be failing or looping in
+ mid-chain.
+
+ Max-Forwards = "Max-Forwards" ":" 1*DIGIT
+
+ The Max-Forwards value is a decimal integer indicating the remaining
+ number of times this request message may be forwarded.
+
+ Each proxy or gateway recipient of a TRACE or OPTIONS request
+ containing a Max-Forwards header field MUST check and update its
+ value prior to forwarding the request. If the received value is zero
+ (0), the recipient MUST NOT forward the request; instead, it MUST
+ respond as the final recipient. If the received Max-Forwards value is
+ greater than zero, then the forwarded message MUST contain an updated
+ Max-Forwards field with a value decremented by one (1).
+
+ The Max-Forwards header field MAY be ignored for all other methods
+ defined by this specification and for any extension methods for which
+ it is not explicitly referred to as part of that method definition.
+
+14.32 Pragma
+
+ The Pragma general-header field is used to include implementation-
+ specific directives that might apply to any recipient along the
+ request/response chain. All pragma directives specify optional
+ behavior from the viewpoint of the protocol; however, some systems
+ MAY require that behavior be consistent with the directives.
+
+ Pragma = "Pragma" ":" 1#pragma-directive
+ pragma-directive = "no-cache" | extension-pragma
+ extension-pragma = token [ "=" ( token | quoted-string ) ]
+
+ When the no-cache directive is present in a request message, an
+ application SHOULD forward the request toward the origin server even
+ if it has a cached copy of what is being requested. This pragma
+ directive has the same semantics as the no-cache cache-directive (see
+ section 14.9) and is defined here for backward compatibility with
+ HTTP/1.0. Clients SHOULD include both header fields when a no-cache
+ request is sent to a server not known to be HTTP/1.1 compliant.
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 136]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ Pragma directives MUST be passed through by a proxy or gateway
+ application, regardless of their significance to that application,
+ since the directives might be applicable to all recipients along the
+ request/response chain. It is not possible to specify a pragma for a
+ specific recipient; however, any pragma directive not relevant to a
+ recipient SHOULD be ignored by that recipient.
+
+ HTTP/1.1 caches SHOULD treat "Pragma: no-cache" as if the client had
+ sent "Cache-Control: no-cache". No new Pragma directives will be
+ defined in HTTP.
+
+ Note: because the meaning of "Pragma: no-cache as a response
+ header field is not actually specified, it does not provide a
+ reliable replacement for "Cache-Control: no-cache" in a response
+
+14.33 Proxy-Authenticate
+
+ The Proxy-Authenticate response-header field MUST be included as part
+ of a 407 (Proxy Authentication Required) response. The field value
+ consists of a challenge that indicates the authentication scheme and
+ parameters applicable to the proxy for this Request-URI.
+
+ Proxy-Authenticate = "Proxy-Authenticate" ":" 1#challenge
+
+ The HTTP access authentication process is described in "HTTP
+ Authentication: Basic and Digest Access Authentication" [43]. Unlike
+ WWW-Authenticate, the Proxy-Authenticate header field applies only to
+ the current connection and SHOULD NOT be passed on to downstream
+ clients. However, an intermediate proxy might need to obtain its own
+ credentials by requesting them from the downstream client, which in
+ some circumstances will appear as if the proxy is forwarding the
+ Proxy-Authenticate header field.
+
+14.34 Proxy-Authorization
+
+ The Proxy-Authorization request-header field allows the client to
+ identify itself (or its user) to a proxy which requires
+ authentication. The Proxy-Authorization field value consists of
+ credentials containing the authentication information of the user
+ agent for the proxy and/or realm of the resource being requested.
+
+ Proxy-Authorization = "Proxy-Authorization" ":" credentials
+
+ The HTTP access authentication process is described in "HTTP
+ Authentication: Basic and Digest Access Authentication" [43] . Unlike
+ Authorization, the Proxy-Authorization header field applies only to
+ the next outbound proxy that demanded authentication using the Proxy-
+ Authenticate field. When multiple proxies are used in a chain, the
+
+
+
+Fielding, et al. Standards Track [Page 137]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ Proxy-Authorization header field is consumed by the first outbound
+ proxy that was expecting to receive credentials. A proxy MAY relay
+ the credentials from the client request to the next proxy if that is
+ the mechanism by which the proxies cooperatively authenticate a given
+ request.
+
+14.35 Range
+
+14.35.1 Byte Ranges
+
+ Since all HTTP entities are represented in HTTP messages as sequences
+ of bytes, the concept of a byte range is meaningful for any HTTP
+ entity. (However, not all clients and servers need to support byte-
+ range operations.)
+
+ Byte range specifications in HTTP apply to the sequence of bytes in
+ the entity-body (not necessarily the same as the message-body).
+
+ A byte range operation MAY specify a single range of bytes, or a set
+ of ranges within a single entity.
+
+ ranges-specifier = byte-ranges-specifier
+ byte-ranges-specifier = bytes-unit "=" byte-range-set
+ byte-range-set = 1#( byte-range-spec | suffix-byte-range-spec )
+ byte-range-spec = first-byte-pos "-" [last-byte-pos]
+ first-byte-pos = 1*DIGIT
+ last-byte-pos = 1*DIGIT
+
+ The first-byte-pos value in a byte-range-spec gives the byte-offset
+ of the first byte in a range. The last-byte-pos value gives the
+ byte-offset of the last byte in the range; that is, the byte
+ positions specified are inclusive. Byte offsets start at zero.
+
+ If the last-byte-pos value is present, it MUST be greater than or
+ equal to the first-byte-pos in that byte-range-spec, or the byte-
+ range-spec is syntactically invalid. The recipient of a byte-range-
+ set that includes one or more syntactically invalid byte-range-spec
+ values MUST ignore the header field that includes that byte-range-
+ set.
+
+ If the last-byte-pos value is absent, or if the value is greater than
+ or equal to the current length of the entity-body, last-byte-pos is
+ taken to be equal to one less than the current length of the entity-
+ body in bytes.
+
+ By its choice of last-byte-pos, a client can limit the number of
+ bytes retrieved without knowing the size of the entity.
+
+
+
+
+Fielding, et al. Standards Track [Page 138]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ suffix-byte-range-spec = "-" suffix-length
+ suffix-length = 1*DIGIT
+
+ A suffix-byte-range-spec is used to specify the suffix of the
+ entity-body, of a length given by the suffix-length value. (That is,
+ this form specifies the last N bytes of an entity-body.) If the
+ entity is shorter than the specified suffix-length, the entire
+ entity-body is used.
+
+ If a syntactically valid byte-range-set includes at least one byte-
+ range-spec whose first-byte-pos is less than the current length of
+ the entity-body, or at least one suffix-byte-range-spec with a non-
+ zero suffix-length, then the byte-range-set is satisfiable.
+ Otherwise, the byte-range-set is unsatisfiable. If the byte-range-set
+ is unsatisfiable, the server SHOULD return a response with a status
+ of 416 (Requested range not satisfiable). Otherwise, the server
+ SHOULD return a response with a status of 206 (Partial Content)
+ containing the satisfiable ranges of the entity-body.
+
+ Examples of byte-ranges-specifier values (assuming an entity-body of
+ length 10000):
+
+ - The first 500 bytes (byte offsets 0-499, inclusive): bytes=0-
+ 499
+
+ - The second 500 bytes (byte offsets 500-999, inclusive):
+ bytes=500-999
+
+ - The final 500 bytes (byte offsets 9500-9999, inclusive):
+ bytes=-500
+
+ - Or bytes=9500-
+
+ - The first and last bytes only (bytes 0 and 9999): bytes=0-0,-1
+
+ - Several legal but not canonical specifications of the second 500
+ bytes (byte offsets 500-999, inclusive):
+ bytes=500-600,601-999
+ bytes=500-700,601-999
+
+14.35.2 Range Retrieval Requests
+
+ HTTP retrieval requests using conditional or unconditional GET
+ methods MAY request one or more sub-ranges of the entity, instead of
+ the entire entity, using the Range request header, which applies to
+ the entity returned as the result of the request:
+
+ Range = "Range" ":" ranges-specifier
+
+
+
+Fielding, et al. Standards Track [Page 139]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ A server MAY ignore the Range header. However, HTTP/1.1 origin
+ servers and intermediate caches ought to support byte ranges when
+ possible, since Range supports efficient recovery from partially
+ failed transfers, and supports efficient partial retrieval of large
+ entities.
+
+ If the server supports the Range header and the specified range or
+ ranges are appropriate for the entity:
+
+ - The presence of a Range header in an unconditional GET modifies
+ what is returned if the GET is otherwise successful. In other
+ words, the response carries a status code of 206 (Partial
+ Content) instead of 200 (OK).
+
+ - The presence of a Range header in a conditional GET (a request
+ using one or both of If-Modified-Since and If-None-Match, or
+ one or both of If-Unmodified-Since and If-Match) modifies what
+ is returned if the GET is otherwise successful and the
+ condition is true. It does not affect the 304 (Not Modified)
+ response returned if the conditional is false.
+
+ In some cases, it might be more appropriate to use the If-Range
+ header (see section 14.27) in addition to the Range header.
+
+ If a proxy that supports ranges receives a Range request, forwards
+ the request to an inbound server, and receives an entire entity in
+ reply, it SHOULD only return the requested range to its client. It
+ SHOULD store the entire received response in its cache if that is
+ consistent with its cache allocation policies.
+
+14.36 Referer
+
+ The Referer[sic] request-header field allows the client to specify,
+ for the server's benefit, the address (URI) of the resource from
+ which the Request-URI was obtained (the "referrer", although the
+ header field is misspelled.) The Referer request-header allows a
+ server to generate lists of back-links to resources for interest,
+ logging, optimized caching, etc. It also allows obsolete or mistyped
+ links to be traced for maintenance. The Referer field MUST NOT be
+ sent if the Request-URI was obtained from a source that does not have
+ its own URI, such as input from the user keyboard.
+
+ Referer = "Referer" ":" ( absoluteURI | relativeURI )
+
+ Example:
+
+ Referer: http://www.w3.org/hypertext/DataSources/Overview.html
+
+
+
+
+Fielding, et al. Standards Track [Page 140]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ If the field value is a relative URI, it SHOULD be interpreted
+ relative to the Request-URI. The URI MUST NOT include a fragment. See
+ section 15.1.3 for security considerations.
+
+14.37 Retry-After
+
+ The Retry-After response-header field can be used with a 503 (Service
+ Unavailable) response to indicate how long the service is expected to
+ be unavailable to the requesting client. This field MAY also be used
+ with any 3xx (Redirection) response to indicate the minimum time the
+ user-agent is asked wait before issuing the redirected request. The
+ value of this field can be either an HTTP-date or an integer number
+ of seconds (in decimal) after the time of the response.
+
+ Retry-After = "Retry-After" ":" ( HTTP-date | delta-seconds )
+
+ Two examples of its use are
+
+ Retry-After: Fri, 31 Dec 1999 23:59:59 GMT
+ Retry-After: 120
+
+ In the latter example, the delay is 2 minutes.
+
+14.38 Server
+
+ The Server response-header field contains information about the
+ software used by the origin server to handle the request. The field
+ can contain multiple product tokens (section 3.8) and comments
+ identifying the server and any significant subproducts. The product
+ tokens are listed in order of their significance for identifying the
+ application.
+
+ Server = "Server" ":" 1*( product | comment )
+
+ Example:
+
+ Server: CERN/3.0 libwww/2.17
+
+ If the response is being forwarded through a proxy, the proxy
+ application MUST NOT modify the Server response-header. Instead, it
+ SHOULD include a Via field (as described in section 14.45).
+
+ Note: Revealing the specific software version of the server might
+ allow the server machine to become more vulnerable to attacks
+ against software that is known to contain security holes. Server
+ implementors are encouraged to make this field a configurable
+ option.
+
+
+
+
+Fielding, et al. Standards Track [Page 141]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+14.39 TE
+
+ The TE request-header field indicates what extension transfer-codings
+ it is willing to accept in the response and whether or not it is
+ willing to accept trailer fields in a chunked transfer-coding. Its
+ value may consist of the keyword "trailers" and/or a comma-separated
+ list of extension transfer-coding names with optional accept
+ parameters (as described in section 3.6).
+
+ TE = "TE" ":" #( t-codings )
+ t-codings = "trailers" | ( transfer-extension [ accept-params ] )
+
+ The presence of the keyword "trailers" indicates that the client is
+ willing to accept trailer fields in a chunked transfer-coding, as
+ defined in section 3.6.1. This keyword is reserved for use with
+ transfer-coding values even though it does not itself represent a
+ transfer-coding.
+
+ Examples of its use are:
+
+ TE: deflate
+ TE:
+ TE: trailers, deflate;q=0.5
+
+ The TE header field only applies to the immediate connection.
+ Therefore, the keyword MUST be supplied within a Connection header
+ field (section 14.10) whenever TE is present in an HTTP/1.1 message.
+
+ A server tests whether a transfer-coding is acceptable, according to
+ a TE field, using these rules:
+
+ 1. The "chunked" transfer-coding is always acceptable. If the
+ keyword "trailers" is listed, the client indicates that it is
+ willing to accept trailer fields in the chunked response on
+ behalf of itself and any downstream clients. The implication is
+ that, if given, the client is stating that either all
+ downstream clients are willing to accept trailer fields in the
+ forwarded response, or that it will attempt to buffer the
+ response on behalf of downstream recipients.
+
+ Note: HTTP/1.1 does not define any means to limit the size of a
+ chunked response such that a client can be assured of buffering
+ the entire response.
+
+ 2. If the transfer-coding being tested is one of the transfer-
+ codings listed in the TE field, then it is acceptable unless it
+ is accompanied by a qvalue of 0. (As defined in section 3.9, a
+ qvalue of 0 means "not acceptable.")
+
+
+
+Fielding, et al. Standards Track [Page 142]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ 3. If multiple transfer-codings are acceptable, then the
+ acceptable transfer-coding with the highest non-zero qvalue is
+ preferred. The "chunked" transfer-coding always has a qvalue
+ of 1.
+
+ If the TE field-value is empty or if no TE field is present, the only
+ transfer-coding is "chunked". A message with no transfer-coding is
+ always acceptable.
+
+14.40 Trailer
+
+ The Trailer general field value indicates that the given set of
+ header fields is present in the trailer of a message encoded with
+ chunked transfer-coding.
+
+ Trailer = "Trailer" ":" 1#field-name
+
+ An HTTP/1.1 message SHOULD include a Trailer header field in a
+ message using chunked transfer-coding with a non-empty trailer. Doing
+ so allows the recipient to know which header fields to expect in the
+ trailer.
+
+ If no Trailer header field is present, the trailer SHOULD NOT include
+ any header fields. See section 3.6.1 for restrictions on the use of
+ trailer fields in a "chunked" transfer-coding.
+
+ Message header fields listed in the Trailer header field MUST NOT
+ include the following header fields:
+
+ . Transfer-Encoding
+
+ . Content-Length
+
+ . Trailer
+
+14.41 Transfer-Encoding
+
+ The Transfer-Encoding general-header field indicates what (if any)
+ type of transformation has been applied to the message body in order
+ to safely transfer it between the sender and the recipient. This
+ differs from the content-coding in that the transfer-coding is a
+ property of the message, not of the entity.
+
+ Transfer-Encoding = "Transfer-Encoding" ":" 1#transfer-coding
+
+ Transfer-codings are defined in section 3.6. An example is:
+
+ Transfer-Encoding: chunked
+
+
+
+Fielding, et al. Standards Track [Page 143]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ If multiple encodings have been applied to an entity, the transfer-
+ codings MUST be listed in the order in which they were applied.
+ Additional information about the encoding parameters MAY be provided
+ by other entity-header fields not defined by this specification.
+
+ Many older HTTP/1.0 applications do not understand the Transfer-
+ Encoding header.
+
+14.42 Upgrade
+
+ The Upgrade general-header allows the client to specify what
+ additional communication protocols it supports and would like to use
+ if the server finds it appropriate to switch protocols. The server
+ MUST use the Upgrade header field within a 101 (Switching Protocols)
+ response to indicate which protocol(s) are being switched.
+
+ Upgrade = "Upgrade" ":" 1#product
+
+ For example,
+
+ Upgrade: HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11
+
+ The Upgrade header field is intended to provide a simple mechanism
+ for transition from HTTP/1.1 to some other, incompatible protocol. It
+ does so by allowing the client to advertise its desire to use another
+ protocol, such as a later version of HTTP with a higher major version
+ number, even though the current request has been made using HTTP/1.1.
+ This eases the difficult transition between incompatible protocols by
+ allowing the client to initiate a request in the more commonly
+ supported protocol while indicating to the server that it would like
+ to use a "better" protocol if available (where "better" is determined
+ by the server, possibly according to the nature of the method and/or
+ resource being requested).
+
+ The Upgrade header field only applies to switching application-layer
+ protocols upon the existing transport-layer connection. Upgrade
+ cannot be used to insist on a protocol change; its acceptance and use
+ by the server is optional. The capabilities and nature of the
+ application-layer communication after the protocol change is entirely
+ dependent upon the new protocol chosen, although the first action
+ after changing the protocol MUST be a response to the initial HTTP
+ request containing the Upgrade header field.
+
+ The Upgrade header field only applies to the immediate connection.
+ Therefore, the upgrade keyword MUST be supplied within a Connection
+ header field (section 14.10) whenever Upgrade is present in an
+ HTTP/1.1 message.
+
+
+
+
+Fielding, et al. Standards Track [Page 144]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ The Upgrade header field cannot be used to indicate a switch to a
+ protocol on a different connection. For that purpose, it is more
+ appropriate to use a 301, 302, 303, or 305 redirection response.
+
+ This specification only defines the protocol name "HTTP" for use by
+ the family of Hypertext Transfer Protocols, as defined by the HTTP
+ version rules of section 3.1 and future updates to this
+ specification. Any token can be used as a protocol name; however, it
+ will only be useful if both the client and server associate the name
+ with the same protocol.
+
+14.43 User-Agent
+
+ The User-Agent request-header field contains information about the
+ user agent originating the request. This is for statistical purposes,
+ the tracing of protocol violations, and automated recognition of user
+ agents for the sake of tailoring responses to avoid particular user
+ agent limitations. User agents SHOULD include this field with
+ requests. The field can contain multiple product tokens (section 3.8)
+ and comments identifying the agent and any subproducts which form a
+ significant part of the user agent. By convention, the product tokens
+ are listed in order of their significance for identifying the
+ application.
+
+ User-Agent = "User-Agent" ":" 1*( product | comment )
+
+ Example:
+
+ User-Agent: CERN-LineMode/2.15 libwww/2.17b3
+
+14.44 Vary
+
+ The Vary field value indicates the set of request-header fields that
+ fully determines, while the response is fresh, whether a cache is
+ permitted to use the response to reply to a subsequent request
+ without revalidation. For uncacheable or stale responses, the Vary
+ field value advises the user agent about the criteria that were used
+ to select the representation. A Vary field value of "*" implies that
+ a cache cannot determine from the request headers of a subsequent
+ request whether this response is the appropriate representation. See
+ section 13.6 for use of the Vary header field by caches.
+
+ Vary = "Vary" ":" ( "*" | 1#field-name )
+
+ An HTTP/1.1 server SHOULD include a Vary header field with any
+ cacheable response that is subject to server-driven negotiation.
+ Doing so allows a cache to properly interpret future requests on that
+ resource and informs the user agent about the presence of negotiation
+
+
+
+Fielding, et al. Standards Track [Page 145]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ on that resource. A server MAY include a Vary header field with a
+ non-cacheable response that is subject to server-driven negotiation,
+ since this might provide the user agent with useful information about
+ the dimensions over which the response varies at the time of the
+ response.
+
+ A Vary field value consisting of a list of field-names signals that
+ the representation selected for the response is based on a selection
+ algorithm which considers ONLY the listed request-header field values
+ in selecting the most appropriate representation. A cache MAY assume
+ that the same selection will be made for future requests with the
+ same values for the listed field names, for the duration of time for
+ which the response is fresh.
+
+ The field-names given are not limited to the set of standard
+ request-header fields defined by this specification. Field names are
+ case-insensitive.
+
+ A Vary field value of "*" signals that unspecified parameters not
+ limited to the request-headers (e.g., the network address of the
+ client), play a role in the selection of the response representation.
+ The "*" value MUST NOT be generated by a proxy server; it may only be
+ generated by an origin server.
+
+14.45 Via
+
+ The Via general-header field MUST be used by gateways and proxies to
+ indicate the intermediate protocols and recipients between the user
+ agent and the server on requests, and between the origin server and
+ the client on responses. It is analogous to the "Received" field of
+ RFC 822 [9] and is intended to be used for tracking message forwards,
+ avoiding request loops, and identifying the protocol capabilities of
+ all senders along the request/response chain.
+
+ Via = "Via" ":" 1#( received-protocol received-by [ comment ] )
+ received-protocol = [ protocol-name "/" ] protocol-version
+ protocol-name = token
+ protocol-version = token
+ received-by = ( host [ ":" port ] ) | pseudonym
+ pseudonym = token
+
+ The received-protocol indicates the protocol version of the message
+ received by the server or client along each segment of the
+ request/response chain. The received-protocol version is appended to
+ the Via field value when the message is forwarded so that information
+ about the protocol capabilities of upstream applications remains
+ visible to all recipients.
+
+
+
+
+Fielding, et al. Standards Track [Page 146]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ The protocol-name is optional if and only if it would be "HTTP". The
+ received-by field is normally the host and optional port number of a
+ recipient server or client that subsequently forwarded the message.
+ However, if the real host is considered to be sensitive information,
+ it MAY be replaced by a pseudonym. If the port is not given, it MAY
+ be assumed to be the default port of the received-protocol.
+
+ Multiple Via field values represents each proxy or gateway that has
+ forwarded the message. Each recipient MUST append its information
+ such that the end result is ordered according to the sequence of
+ forwarding applications.
+
+ Comments MAY be used in the Via header field to identify the software
+ of the recipient proxy or gateway, analogous to the User-Agent and
+ Server header fields. However, all comments in the Via field are
+ optional and MAY be removed by any recipient prior to forwarding the
+ message.
+
+ For example, a request message could be sent from an HTTP/1.0 user
+ agent to an internal proxy code-named "fred", which uses HTTP/1.1 to
+ forward the request to a public proxy at nowhere.com, which completes
+ the request by forwarding it to the origin server at www.ics.uci.edu.
+ The request received by www.ics.uci.edu would then have the following
+ Via header field:
+
+ Via: 1.0 fred, 1.1 nowhere.com (Apache/1.1)
+
+ Proxies and gateways used as a portal through a network firewall
+ SHOULD NOT, by default, forward the names and ports of hosts within
+ the firewall region. This information SHOULD only be propagated if
+ explicitly enabled. If not enabled, the received-by host of any host
+ behind the firewall SHOULD be replaced by an appropriate pseudonym
+ for that host.
+
+ For organizations that have strong privacy requirements for hiding
+ internal structures, a proxy MAY combine an ordered subsequence of
+ Via header field entries with identical received-protocol values into
+ a single such entry. For example,
+
+ Via: 1.0 ricky, 1.1 ethel, 1.1 fred, 1.0 lucy
+
+ could be collapsed to
+
+ Via: 1.0 ricky, 1.1 mertz, 1.0 lucy
+
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 147]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ Applications SHOULD NOT combine multiple entries unless they are all
+ under the same organizational control and the hosts have already been
+ replaced by pseudonyms. Applications MUST NOT combine entries which
+ have different received-protocol values.
+
+14.46 Warning
+
+ The Warning general-header field is used to carry additional
+ information about the status or transformation of a message which
+ might not be reflected in the message. This information is typically
+ used to warn about a possible lack of semantic transparency from
+ caching operations or transformations applied to the entity body of
+ the message.
+
+ Warning headers are sent with responses using:
+
+ Warning = "Warning" ":" 1#warning-value
+
+ warning-value = warn-code SP warn-agent SP warn-text
+ [SP warn-date]
+
+ warn-code = 3DIGIT
+ warn-agent = ( host [ ":" port ] ) | pseudonym
+ ; the name or pseudonym of the server adding
+ ; the Warning header, for use in debugging
+ warn-text = quoted-string
+ warn-date = <"> HTTP-date <">
+
+ A response MAY carry more than one Warning header.
+
+ The warn-text SHOULD be in a natural language and character set that
+ is most likely to be intelligible to the human user receiving the
+ response. This decision MAY be based on any available knowledge, such
+ as the location of the cache or user, the Accept-Language field in a
+ request, the Content-Language field in a response, etc. The default
+ language is English and the default character set is ISO-8859-1.
+
+ If a character set other than ISO-8859-1 is used, it MUST be encoded
+ in the warn-text using the method described in RFC 2047 [14].
+
+ Warning headers can in general be applied to any message, however
+ some specific warn-codes are specific to caches and can only be
+ applied to response messages. New Warning headers SHOULD be added
+ after any existing Warning headers. A cache MUST NOT delete any
+ Warning header that it received with a message. However, if a cache
+ successfully validates a cache entry, it SHOULD remove any Warning
+ headers previously attached to that entry except as specified for
+
+
+
+
+Fielding, et al. Standards Track [Page 148]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ specific Warning codes. It MUST then add any Warning headers received
+ in the validating response. In other words, Warning headers are those
+ that would be attached to the most recent relevant response.
+
+ When multiple Warning headers are attached to a response, the user
+ agent ought to inform the user of as many of them as possible, in the
+ order that they appear in the response. If it is not possible to
+ inform the user of all of the warnings, the user agent SHOULD follow
+ these heuristics:
+
+ - Warnings that appear early in the response take priority over
+ those appearing later in the response.
+
+ - Warnings in the user's preferred character set take priority
+ over warnings in other character sets but with identical warn-
+ codes and warn-agents.
+
+ Systems that generate multiple Warning headers SHOULD order them with
+ this user agent behavior in mind.
+
+ Requirements for the behavior of caches with respect to Warnings are
+ stated in section 13.1.2.
+
+ This is a list of the currently-defined warn-codes, each with a
+ recommended warn-text in English, and a description of its meaning.
+
+ 110 Response is stale
+ MUST be included whenever the returned response is stale.
+
+ 111 Revalidation failed
+ MUST be included if a cache returns a stale response because an
+ attempt to revalidate the response failed, due to an inability to
+ reach the server.
+
+ 112 Disconnected operation
+ SHOULD be included if the cache is intentionally disconnected from
+ the rest of the network for a period of time.
+
+ 113 Heuristic expiration
+ MUST be included if the cache heuristically chose a freshness
+ lifetime greater than 24 hours and the response's age is greater
+ than 24 hours.
+
+ 199 Miscellaneous warning
+ The warning text MAY include arbitrary information to be presented
+ to a human user, or logged. A system receiving this warning MUST
+ NOT take any automated action, besides presenting the warning to
+ the user.
+
+
+
+Fielding, et al. Standards Track [Page 149]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ 214 Transformation applied
+ MUST be added by an intermediate cache or proxy if it applies any
+ transformation changing the content-coding (as specified in the
+ Content-Encoding header) or media-type (as specified in the
+ Content-Type header) of the response, or the entity-body of the
+ response, unless this Warning code already appears in the response.
+
+ 299 Miscellaneous persistent warning
+ The warning text MAY include arbitrary information to be presented
+ to a human user, or logged. A system receiving this warning MUST
+ NOT take any automated action.
+
+ If an implementation sends a message with one or more Warning headers
+ whose version is HTTP/1.0 or lower, then the sender MUST include in
+ each warning-value a warn-date that matches the date in the response.
+
+ If an implementation receives a message with a warning-value that
+ includes a warn-date, and that warn-date is different from the Date
+ value in the response, then that warning-value MUST be deleted from
+ the message before storing, forwarding, or using it. (This prevents
+ bad consequences of naive caching of Warning header fields.) If all
+ of the warning-values are deleted for this reason, the Warning header
+ MUST be deleted as well.
+
+14.47 WWW-Authenticate
+
+ The WWW-Authenticate response-header field MUST be included in 401
+ (Unauthorized) response messages. The field value consists of at
+ least one challenge that indicates the authentication scheme(s) and
+ parameters applicable to the Request-URI.
+
+ WWW-Authenticate = "WWW-Authenticate" ":" 1#challenge
+
+ The HTTP access authentication process is described in "HTTP
+ Authentication: Basic and Digest Access Authentication" [43]. User
+ agents are advised to take special care in parsing the WWW-
+ Authenticate field value as it might contain more than one challenge,
+ or if more than one WWW-Authenticate header field is provided, the
+ contents of a challenge itself can contain a comma-separated list of
+ authentication parameters.
+
+15 Security Considerations
+
+ This section is meant to inform application developers, information
+ providers, and users of the security limitations in HTTP/1.1 as
+ described by this document. The discussion does not include
+ definitive solutions to the problems revealed, though it does make
+ some suggestions for reducing security risks.
+
+
+
+Fielding, et al. Standards Track [Page 150]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+15.1 Personal Information
+
+ HTTP clients are often privy to large amounts of personal information
+ (e.g. the user's name, location, mail address, passwords, encryption
+ keys, etc.), and SHOULD be very careful to prevent unintentional
+ leakage of this information via the HTTP protocol to other sources.
+ We very strongly recommend that a convenient interface be provided
+ for the user to control dissemination of such information, and that
+ designers and implementors be particularly careful in this area.
+ History shows that errors in this area often create serious security
+ and/or privacy problems and generate highly adverse publicity for the
+ implementor's company.
+
+15.1.1 Abuse of Server Log Information
+
+ A server is in the position to save personal data about a user's
+ requests which might identify their reading patterns or subjects of
+ interest. This information is clearly confidential in nature and its
+ handling can be constrained by law in certain countries. People using
+ the HTTP protocol to provide data are responsible for ensuring that
+ such material is not distributed without the permission of any
+ individuals that are identifiable by the published results.
+
+15.1.2 Transfer of Sensitive Information
+
+ Like any generic data transfer protocol, HTTP cannot regulate the
+ content of the data that is transferred, nor is there any a priori
+ method of determining the sensitivity of any particular piece of
+ information within the context of any given request. Therefore,
+ applications SHOULD supply as much control over this information as
+ possible to the provider of that information. Four header fields are
+ worth special mention in this context: Server, Via, Referer and From.
+
+ Revealing the specific software version of the server might allow the
+ server machine to become more vulnerable to attacks against software
+ that is known to contain security holes. Implementors SHOULD make the
+ Server header field a configurable option.
+
+ Proxies which serve as a portal through a network firewall SHOULD
+ take special precautions regarding the transfer of header information
+ that identifies the hosts behind the firewall. In particular, they
+ SHOULD remove, or replace with sanitized versions, any Via fields
+ generated behind the firewall.
+
+ The Referer header allows reading patterns to be studied and reverse
+ links drawn. Although it can be very useful, its power can be abused
+ if user details are not separated from the information contained in
+
+
+
+
+Fielding, et al. Standards Track [Page 151]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ the Referer. Even when the personal information has been removed, the
+ Referer header might indicate a private document's URI whose
+ publication would be inappropriate.
+
+ The information sent in the From field might conflict with the user's
+ privacy interests or their site's security policy, and hence it
+ SHOULD NOT be transmitted without the user being able to disable,
+ enable, and modify the contents of the field. The user MUST be able
+ to set the contents of this field within a user preference or
+ application defaults configuration.
+
+ We suggest, though do not require, that a convenient toggle interface
+ be provided for the user to enable or disable the sending of From and
+ Referer information.
+
+ The User-Agent (section 14.43) or Server (section 14.38) header
+ fields can sometimes be used to determine that a specific client or
+ server have a particular security hole which might be exploited.
+ Unfortunately, this same information is often used for other valuable
+ purposes for which HTTP currently has no better mechanism.
+
+15.1.3 Encoding Sensitive Information in URI's
+
+ Because the source of a link might be private information or might
+ reveal an otherwise private information source, it is strongly
+ recommended that the user be able to select whether or not the
+ Referer field is sent. For example, a browser client could have a
+ toggle switch for browsing openly/anonymously, which would
+ respectively enable/disable the sending of Referer and From
+ information.
+
+ Clients SHOULD NOT include a Referer header field in a (non-secure)
+ HTTP request if the referring page was transferred with a secure
+ protocol.
+
+ Authors of services which use the HTTP protocol SHOULD NOT use GET
+ based forms for the submission of sensitive data, because this will
+ cause this data to be encoded in the Request-URI. Many existing
+ servers, proxies, and user agents will log the request URI in some
+ place where it might be visible to third parties. Servers can use
+ POST-based form submission instead
+
+15.1.4 Privacy Issues Connected to Accept Headers
+
+ Accept request-headers can reveal information about the user to all
+ servers which are accessed. The Accept-Language header in particular
+ can reveal information the user would consider to be of a private
+ nature, because the understanding of particular languages is often
+
+
+
+Fielding, et al. Standards Track [Page 152]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ strongly correlated to the membership of a particular ethnic group.
+ User agents which offer the option to configure the contents of an
+ Accept-Language header to be sent in every request are strongly
+ encouraged to let the configuration process include a message which
+ makes the user aware of the loss of privacy involved.
+
+ An approach that limits the loss of privacy would be for a user agent
+ to omit the sending of Accept-Language headers by default, and to ask
+ the user whether or not to start sending Accept-Language headers to a
+ server if it detects, by looking for any Vary response-header fields
+ generated by the server, that such sending could improve the quality
+ of service.
+
+ Elaborate user-customized accept header fields sent in every request,
+ in particular if these include quality values, can be used by servers
+ as relatively reliable and long-lived user identifiers. Such user
+ identifiers would allow content providers to do click-trail tracking,
+ and would allow collaborating content providers to match cross-server
+ click-trails or form submissions of individual users. Note that for
+ many users not behind a proxy, the network address of the host
+ running the user agent will also serve as a long-lived user
+ identifier. In environments where proxies are used to enhance
+ privacy, user agents ought to be conservative in offering accept
+ header configuration options to end users. As an extreme privacy
+ measure, proxies could filter the accept headers in relayed requests.
+ General purpose user agents which provide a high degree of header
+ configurability SHOULD warn users about the loss of privacy which can
+ be involved.
+
+15.2 Attacks Based On File and Path Names
+
+ Implementations of HTTP origin servers SHOULD be careful to restrict
+ the documents returned by HTTP requests to be only those that were
+ intended by the server administrators. If an HTTP server translates
+ HTTP URIs directly into file system calls, the server MUST take
+ special care not to serve files that were not intended to be
+ delivered to HTTP clients. For example, UNIX, Microsoft Windows, and
+ other operating systems use ".." as a path component to indicate a
+ directory level above the current one. On such a system, an HTTP
+ server MUST disallow any such construct in the Request-URI if it
+ would otherwise allow access to a resource outside those intended to
+ be accessible via the HTTP server. Similarly, files intended for
+ reference only internally to the server (such as access control
+ files, configuration files, and script code) MUST be protected from
+ inappropriate retrieval, since they might contain sensitive
+ information. Experience has shown that minor bugs in such HTTP server
+ implementations have turned into security risks.
+
+
+
+
+Fielding, et al. Standards Track [Page 153]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+15.3 DNS Spoofing
+
+ Clients using HTTP rely heavily on the Domain Name Service, and are
+ thus generally prone to security attacks based on the deliberate
+ mis-association of IP addresses and DNS names. Clients need to be
+ cautious in assuming the continuing validity of an IP number/DNS name
+ association.
+
+ In particular, HTTP clients SHOULD rely on their name resolver for
+ confirmation of an IP number/DNS name association, rather than
+ caching the result of previous host name lookups. Many platforms
+ already can cache host name lookups locally when appropriate, and
+ they SHOULD be configured to do so. It is proper for these lookups to
+ be cached, however, only when the TTL (Time To Live) information
+ reported by the name server makes it likely that the cached
+ information will remain useful.
+
+ If HTTP clients cache the results of host name lookups in order to
+ achieve a performance improvement, they MUST observe the TTL
+ information reported by DNS.
+
+ If HTTP clients do not observe this rule, they could be spoofed when
+ a previously-accessed server's IP address changes. As network
+ renumbering is expected to become increasingly common [24], the
+ possibility of this form of attack will grow. Observing this
+ requirement thus reduces this potential security vulnerability.
+
+ This requirement also improves the load-balancing behavior of clients
+ for replicated servers using the same DNS name and reduces the
+ likelihood of a user's experiencing failure in accessing sites which
+ use that strategy.
+
+15.4 Location Headers and Spoofing
+
+ If a single server supports multiple organizations that do not trust
+ one another, then it MUST check the values of Location and Content-
+ Location headers in responses that are generated under control of
+ said organizations to make sure that they do not attempt to
+ invalidate resources over which they have no authority.
+
+15.5 Content-Disposition Issues
+
+ RFC 1806 [35], from which the often implemented Content-Disposition
+ (see section 19.5.1) header in HTTP is derived, has a number of very
+ serious security considerations. Content-Disposition is not part of
+ the HTTP standard, but since it is widely implemented, we are
+ documenting its use and risks for implementors. See RFC 2183 [49]
+ (which updates RFC 1806) for details.
+
+
+
+Fielding, et al. Standards Track [Page 154]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+15.6 Authentication Credentials and Idle Clients
+
+ Existing HTTP clients and user agents typically retain authentication
+ information indefinitely. HTTP/1.1. does not provide a method for a
+ server to direct clients to discard these cached credentials. This is
+ a significant defect that requires further extensions to HTTP.
+ Circumstances under which credential caching can interfere with the
+ application's security model include but are not limited to:
+
+ - Clients which have been idle for an extended period following
+ which the server might wish to cause the client to reprompt the
+ user for credentials.
+
+ - Applications which include a session termination indication
+ (such as a `logout' or `commit' button on a page) after which
+ the server side of the application `knows' that there is no
+ further reason for the client to retain the credentials.
+
+ This is currently under separate study. There are a number of work-
+ arounds to parts of this problem, and we encourage the use of
+ password protection in screen savers, idle time-outs, and other
+ methods which mitigate the security problems inherent in this
+ problem. In particular, user agents which cache credentials are
+ encouraged to provide a readily accessible mechanism for discarding
+ cached credentials under user control.
+
+15.7 Proxies and Caching
+
+ By their very nature, HTTP proxies are men-in-the-middle, and
+ represent an opportunity for man-in-the-middle attacks. Compromise of
+ the systems on which the proxies run can result in serious security
+ and privacy problems. Proxies have access to security-related
+ information, personal information about individual users and
+ organizations, and proprietary information belonging to users and
+ content providers. A compromised proxy, or a proxy implemented or
+ configured without regard to security and privacy considerations,
+ might be used in the commission of a wide range of potential attacks.
+
+ Proxy operators should protect the systems on which proxies run as
+ they would protect any system that contains or transports sensitive
+ information. In particular, log information gathered at proxies often
+ contains highly sensitive personal information, and/or information
+ about organizations. Log information should be carefully guarded, and
+ appropriate guidelines for use developed and followed. (Section
+ 15.1.1).
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 155]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ Caching proxies provide additional potential vulnerabilities, since
+ the contents of the cache represent an attractive target for
+ malicious exploitation. Because cache contents persist after an HTTP
+ request is complete, an attack on the cache can reveal information
+ long after a user believes that the information has been removed from
+ the network. Therefore, cache contents should be protected as
+ sensitive information.
+
+ Proxy implementors should consider the privacy and security
+ implications of their design and coding decisions, and of the
+ configuration options they provide to proxy operators (especially the
+ default configuration).
+
+ Users of a proxy need to be aware that they are no trustworthier than
+ the people who run the proxy; HTTP itself cannot solve this problem.
+
+ The judicious use of cryptography, when appropriate, may suffice to
+ protect against a broad range of security and privacy attacks. Such
+ cryptography is beyond the scope of the HTTP/1.1 specification.
+
+15.7.1 Denial of Service Attacks on Proxies
+
+ They exist. They are hard to defend against. Research continues.
+ Beware.
+
+16 Acknowledgments
+
+ This specification makes heavy use of the augmented BNF and generic
+ constructs defined by David H. Crocker for RFC 822 [9]. Similarly, it
+ reuses many of the definitions provided by Nathaniel Borenstein and
+ Ned Freed for MIME [7]. We hope that their inclusion in this
+ specification will help reduce past confusion over the relationship
+ between HTTP and Internet mail message formats.
+
+ The HTTP protocol has evolved considerably over the years. It has
+ benefited from a large and active developer community--the many
+ people who have participated on the www-talk mailing list--and it is
+ that community which has been most responsible for the success of
+ HTTP and of the World-Wide Web in general. Marc Andreessen, Robert
+ Cailliau, Daniel W. Connolly, Bob Denny, John Franks, Jean-Francois
+ Groff, Phillip M. Hallam-Baker, Hakon W. Lie, Ari Luotonen, Rob
+ McCool, Lou Montulli, Dave Raggett, Tony Sanders, and Marc
+ VanHeyningen deserve special recognition for their efforts in
+ defining early aspects of the protocol.
+
+ This document has benefited greatly from the comments of all those
+ participating in the HTTP-WG. In addition to those already mentioned,
+ the following individuals have contributed to this specification:
+
+
+
+Fielding, et al. Standards Track [Page 156]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ Gary Adams Ross Patterson
+ Harald Tveit Alvestrand Albert Lunde
+ Keith Ball John C. Mallery
+ Brian Behlendorf Jean-Philippe Martin-Flatin
+ Paul Burchard Mitra
+ Maurizio Codogno David Morris
+ Mike Cowlishaw Gavin Nicol
+ Roman Czyborra Bill Perry
+ Michael A. Dolan Jeffrey Perry
+ David J. Fiander Scott Powers
+ Alan Freier Owen Rees
+ Marc Hedlund Luigi Rizzo
+ Greg Herlihy David Robinson
+ Koen Holtman Marc Salomon
+ Alex Hopmann Rich Salz
+ Bob Jernigan Allan M. Schiffman
+ Shel Kaphan Jim Seidman
+ Rohit Khare Chuck Shotton
+ John Klensin Eric W. Sink
+ Martijn Koster Simon E. Spero
+ Alexei Kosut Richard N. Taylor
+ David M. Kristol Robert S. Thau
+ Daniel LaLiberte Bill (BearHeart) Weinman
+ Ben Laurie Francois Yergeau
+ Paul J. Leach Mary Ellen Zurko
+ Daniel DuBois Josh Cohen
+
+
+ Much of the content and presentation of the caching design is due to
+ suggestions and comments from individuals including: Shel Kaphan,
+ Paul Leach, Koen Holtman, David Morris, and Larry Masinter.
+
+ Most of the specification of ranges is based on work originally done
+ by Ari Luotonen and John Franks, with additional input from Steve
+ Zilles.
+
+ Thanks to the "cave men" of Palo Alto. You know who you are.
+
+ Jim Gettys (the current editor of this document) wishes particularly
+ to thank Roy Fielding, the previous editor of this document, along
+ with John Klensin, Jeff Mogul, Paul Leach, Dave Kristol, Koen
+ Holtman, John Franks, Josh Cohen, Alex Hopmann, Scott Lawrence, and
+ Larry Masinter for their help. And thanks go particularly to Jeff
+ Mogul and Scott Lawrence for performing the "MUST/MAY/SHOULD" audit.
+
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 157]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ The Apache Group, Anselm Baird-Smith, author of Jigsaw, and Henrik
+ Frystyk implemented RFC 2068 early, and we wish to thank them for the
+ discovery of many of the problems that this document attempts to
+ rectify.
+
+17 References
+
+ [1] Alvestrand, H., "Tags for the Identification of Languages", RFC
+ 1766, March 1995.
+
+ [2] Anklesaria, F., McCahill, M., Lindner, P., Johnson, D., Torrey,
+ D. and B. Alberti, "The Internet Gopher Protocol (a distributed
+ document search and retrieval protocol)", RFC 1436, March 1993.
+
+ [3] Berners-Lee, T., "Universal Resource Identifiers in WWW", RFC
+ 1630, June 1994.
+
+ [4] Berners-Lee, T., Masinter, L. and M. McCahill, "Uniform Resource
+ Locators (URL)", RFC 1738, December 1994.
+
+ [5] Berners-Lee, T. and D. Connolly, "Hypertext Markup Language -
+ 2.0", RFC 1866, November 1995.
+
+ [6] Berners-Lee, T., Fielding, R. and H. Frystyk, "Hypertext Transfer
+ Protocol -- HTTP/1.0", RFC 1945, May 1996.
+
+ [7] Freed, N. and N. Borenstein, "Multipurpose Internet Mail
+ Extensions (MIME) Part One: Format of Internet Message Bodies",
+ RFC 2045, November 1996.
+
+ [8] Braden, R., "Requirements for Internet Hosts -- Communication
+ Layers", STD 3, RFC 1123, October 1989.
+
+ [9] Crocker, D., "Standard for The Format of ARPA Internet Text
+ Messages", STD 11, RFC 822, August 1982.
+
+ [10] Davis, F., Kahle, B., Morris, H., Salem, J., Shen, T., Wang, R.,
+ Sui, J., and M. Grinbaum, "WAIS Interface Protocol Prototype
+ Functional Specification," (v1.5), Thinking Machines
+ Corporation, April 1990.
+
+ [11] Fielding, R., "Relative Uniform Resource Locators", RFC 1808,
+ June 1995.
+
+ [12] Horton, M. and R. Adams, "Standard for Interchange of USENET
+ Messages", RFC 1036, December 1987.
+
+
+
+
+
+Fielding, et al. Standards Track [Page 158]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ [13] Kantor, B. and P. Lapsley, "Network News Transfer Protocol", RFC
+ 977, February 1986.
+
+ [14] Moore, K., "MIME (Multipurpose Internet Mail Extensions) Part
+ Three: Message Header Extensions for Non-ASCII Text", RFC 2047,
+ November 1996.
+
+ [15] Nebel, E. and L. Masinter, "Form-based File Upload in HTML", RFC
+ 1867, November 1995.
+
+ [16] Postel, J., "Simple Mail Transfer Protocol", STD 10, RFC 821,
+ August 1982.
+
+ [17] Postel, J., "Media Type Registration Procedure", RFC 1590,
+ November 1996.
+
+ [18] Postel, J. and J. Reynolds, "File Transfer Protocol", STD 9, RFC
+ 959, October 1985.
+
+ [19] Reynolds, J. and J. Postel, "Assigned Numbers", STD 2, RFC 1700,
+ October 1994.
+
+ [20] Sollins, K. and L. Masinter, "Functional Requirements for
+ Uniform Resource Names", RFC 1737, December 1994.
+
+ [21] US-ASCII. Coded Character Set - 7-Bit American Standard Code for
+ Information Interchange. Standard ANSI X3.4-1986, ANSI, 1986.
+
+ [22] ISO-8859. International Standard -- Information Processing --
+ 8-bit Single-Byte Coded Graphic Character Sets --
+ Part 1: Latin alphabet No. 1, ISO-8859-1:1987.
+ Part 2: Latin alphabet No. 2, ISO-8859-2, 1987.
+ Part 3: Latin alphabet No. 3, ISO-8859-3, 1988.
+ Part 4: Latin alphabet No. 4, ISO-8859-4, 1988.
+ Part 5: Latin/Cyrillic alphabet, ISO-8859-5, 1988.
+ Part 6: Latin/Arabic alphabet, ISO-8859-6, 1987.
+ Part 7: Latin/Greek alphabet, ISO-8859-7, 1987.
+ Part 8: Latin/Hebrew alphabet, ISO-8859-8, 1988.
+ Part 9: Latin alphabet No. 5, ISO-8859-9, 1990.
+
+ [23] Meyers, J. and M. Rose, "The Content-MD5 Header Field", RFC
+ 1864, October 1995.
+
+ [24] Carpenter, B. and Y. Rekhter, "Renumbering Needs Work", RFC
+ 1900, February 1996.
+
+ [25] Deutsch, P., "GZIP file format specification version 4.3", RFC
+ 1952, May 1996.
+
+
+
+Fielding, et al. Standards Track [Page 159]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ [26] Venkata N. Padmanabhan, and Jeffrey C. Mogul. "Improving HTTP
+ Latency", Computer Networks and ISDN Systems, v. 28, pp. 25-35,
+ Dec. 1995. Slightly revised version of paper in Proc. 2nd
+ International WWW Conference '94: Mosaic and the Web, Oct. 1994,
+ which is available at
+ http://www.ncsa.uiuc.edu/SDG/IT94/Proceedings/DDay/mogul/HTTPLat
+ ency.html.
+
+ [27] Joe Touch, John Heidemann, and Katia Obraczka. "Analysis of HTTP
+ Performance", <URL: http://www.isi.edu/touch/pubs/http-perf96/>,
+ ISI Research Report ISI/RR-98-463, (original report dated Aug.
+ 1996), USC/Information Sciences Institute, August 1998.
+
+ [28] Mills, D., "Network Time Protocol (Version 3) Specification,
+ Implementation and Analysis", RFC 1305, March 1992.
+
+ [29] Deutsch, P., "DEFLATE Compressed Data Format Specification
+ version 1.3", RFC 1951, May 1996.
+
+ [30] S. Spero, "Analysis of HTTP Performance Problems,"
+ http://sunsite.unc.edu/mdma-release/http-prob.html.
+
+ [31] Deutsch, P. and J. Gailly, "ZLIB Compressed Data Format
+ Specification version 3.3", RFC 1950, May 1996.
+
+ [32] Franks, J., Hallam-Baker, P., Hostetler, J., Leach, P.,
+ Luotonen, A., Sink, E. and L. Stewart, "An Extension to HTTP:
+ Digest Access Authentication", RFC 2069, January 1997.
+
+ [33] Fielding, R., Gettys, J., Mogul, J., Frystyk, H. and T.
+ Berners-Lee, "Hypertext Transfer Protocol -- HTTP/1.1", RFC
+ 2068, January 1997.
+
+ [34] Bradner, S., "Key words for use in RFCs to Indicate Requirement
+ Levels", BCP 14, RFC 2119, March 1997.
+
+ [35] Troost, R. and Dorner, S., "Communicating Presentation
+ Information in Internet Messages: The Content-Disposition
+ Header", RFC 1806, June 1995.
+
+ [36] Mogul, J., Fielding, R., Gettys, J. and H. Frystyk, "Use and
+ Interpretation of HTTP Version Numbers", RFC 2145, May 1997.
+ [jg639]
+
+ [37] Palme, J., "Common Internet Message Headers", RFC 2076, February
+ 1997. [jg640]
+
+
+
+
+
+Fielding, et al. Standards Track [Page 160]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ [38] Yergeau, F., "UTF-8, a transformation format of Unicode and
+ ISO-10646", RFC 2279, January 1998. [jg641]
+
+ [39] Nielsen, H.F., Gettys, J., Baird-Smith, A., Prud'hommeaux, E.,
+ Lie, H., and C. Lilley. "Network Performance Effects of
+ HTTP/1.1, CSS1, and PNG," Proceedings of ACM SIGCOMM '97, Cannes
+ France, September 1997.[jg642]
+
+ [40] Freed, N. and N. Borenstein, "Multipurpose Internet Mail
+ Extensions (MIME) Part Two: Media Types", RFC 2046, November
+ 1996. [jg643]
+
+ [41] Alvestrand, H., "IETF Policy on Character Sets and Languages",
+ BCP 18, RFC 2277, January 1998. [jg644]
+
+ [42] Berners-Lee, T., Fielding, R. and L. Masinter, "Uniform Resource
+ Identifiers (URI): Generic Syntax and Semantics", RFC 2396,
+ August 1998. [jg645]
+
+ [43] Franks, J., Hallam-Baker, P., Hostetler, J., Lawrence, S.,
+ Leach, P., Luotonen, A., Sink, E. and L. Stewart, "HTTP
+ Authentication: Basic and Digest Access Authentication", RFC
+ 2617, June 1999. [jg646]
+
+ [44] Luotonen, A., "Tunneling TCP based protocols through Web proxy
+ servers," Work in Progress. [jg647]
+
+ [45] Palme, J. and A. Hopmann, "MIME E-mail Encapsulation of
+ Aggregate Documents, such as HTML (MHTML)", RFC 2110, March
+ 1997.
+
+ [46] Bradner, S., "The Internet Standards Process -- Revision 3", BCP
+ 9, RFC 2026, October 1996.
+
+ [47] Masinter, L., "Hyper Text Coffee Pot Control Protocol
+ (HTCPCP/1.0)", RFC 2324, 1 April 1998.
+
+ [48] Freed, N. and N. Borenstein, "Multipurpose Internet Mail
+ Extensions (MIME) Part Five: Conformance Criteria and Examples",
+ RFC 2049, November 1996.
+
+ [49] Troost, R., Dorner, S. and K. Moore, "Communicating Presentation
+ Information in Internet Messages: The Content-Disposition Header
+ Field", RFC 2183, August 1997.
+
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 161]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+18 Authors' Addresses
+
+ Roy T. Fielding
+ Information and Computer Science
+ University of California, Irvine
+ Irvine, CA 92697-3425, USA
+
+ Fax: +1 (949) 824-1715
+ EMail: fielding@ics.uci.edu
+
+
+ James Gettys
+ World Wide Web Consortium
+ MIT Laboratory for Computer Science
+ 545 Technology Square
+ Cambridge, MA 02139, USA
+
+ Fax: +1 (617) 258 8682
+ EMail: jg@w3.org
+
+
+ Jeffrey C. Mogul
+ Western Research Laboratory
+ Compaq Computer Corporation
+ 250 University Avenue
+ Palo Alto, California, 94305, USA
+
+ EMail: mogul@wrl.dec.com
+
+
+ Henrik Frystyk Nielsen
+ World Wide Web Consortium
+ MIT Laboratory for Computer Science
+ 545 Technology Square
+ Cambridge, MA 02139, USA
+
+ Fax: +1 (617) 258 8682
+ EMail: frystyk@w3.org
+
+
+ Larry Masinter
+ Xerox Corporation
+ 3333 Coyote Hill Road
+ Palo Alto, CA 94034, USA
+
+ EMail: masinter@parc.xerox.com
+
+
+
+
+
+Fielding, et al. Standards Track [Page 162]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ Paul J. Leach
+ Microsoft Corporation
+ 1 Microsoft Way
+ Redmond, WA 98052, USA
+
+ EMail: paulle@microsoft.com
+
+
+ Tim Berners-Lee
+ Director, World Wide Web Consortium
+ MIT Laboratory for Computer Science
+ 545 Technology Square
+ Cambridge, MA 02139, USA
+
+ Fax: +1 (617) 258 8682
+ EMail: timbl@w3.org
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 163]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+19 Appendices
+
+19.1 Internet Media Type message/http and application/http
+
+ In addition to defining the HTTP/1.1 protocol, this document serves
+ as the specification for the Internet media type "message/http" and
+ "application/http". The message/http type can be used to enclose a
+ single HTTP request or response message, provided that it obeys the
+ MIME restrictions for all "message" types regarding line length and
+ encodings. The application/http type can be used to enclose a
+ pipeline of one or more HTTP request or response messages (not
+ intermixed). The following is to be registered with IANA [17].
+
+ Media Type name: message
+ Media subtype name: http
+ Required parameters: none
+ Optional parameters: version, msgtype
+ version: The HTTP-Version number of the enclosed message
+ (e.g., "1.1"). If not present, the version can be
+ determined from the first line of the body.
+ msgtype: The message type -- "request" or "response". If not
+ present, the type can be determined from the first
+ line of the body.
+ Encoding considerations: only "7bit", "8bit", or "binary" are
+ permitted
+ Security considerations: none
+
+ Media Type name: application
+ Media subtype name: http
+ Required parameters: none
+ Optional parameters: version, msgtype
+ version: The HTTP-Version number of the enclosed messages
+ (e.g., "1.1"). If not present, the version can be
+ determined from the first line of the body.
+ msgtype: The message type -- "request" or "response". If not
+ present, the type can be determined from the first
+ line of the body.
+ Encoding considerations: HTTP messages enclosed by this type
+ are in "binary" format; use of an appropriate
+ Content-Transfer-Encoding is required when
+ transmitted via E-mail.
+ Security considerations: none
+
+
+
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 164]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+19.2 Internet Media Type multipart/byteranges
+
+ When an HTTP 206 (Partial Content) response message includes the
+ content of multiple ranges (a response to a request for multiple
+ non-overlapping ranges), these are transmitted as a multipart
+ message-body. The media type for this purpose is called
+ "multipart/byteranges".
+
+ The multipart/byteranges media type includes two or more parts, each
+ with its own Content-Type and Content-Range fields. The required
+ boundary parameter specifies the boundary string used to separate
+ each body-part.
+
+ Media Type name: multipart
+ Media subtype name: byteranges
+ Required parameters: boundary
+ Optional parameters: none
+ Encoding considerations: only "7bit", "8bit", or "binary" are
+ permitted
+ Security considerations: none
+
+
+ For example:
+
+ HTTP/1.1 206 Partial Content
+ Date: Wed, 15 Nov 1995 06:25:24 GMT
+ Last-Modified: Wed, 15 Nov 1995 04:58:08 GMT
+ Content-type: multipart/byteranges; boundary=THIS_STRING_SEPARATES
+
+ --THIS_STRING_SEPARATES
+ Content-type: application/pdf
+ Content-range: bytes 500-999/8000
+
+ ...the first range...
+ --THIS_STRING_SEPARATES
+ Content-type: application/pdf
+ Content-range: bytes 7000-7999/8000
+
+ ...the second range
+ --THIS_STRING_SEPARATES--
+
+ Notes:
+
+ 1) Additional CRLFs may precede the first boundary string in the
+ entity.
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 165]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ 2) Although RFC 2046 [40] permits the boundary string to be
+ quoted, some existing implementations handle a quoted boundary
+ string incorrectly.
+
+ 3) A number of browsers and servers were coded to an early draft
+ of the byteranges specification to use a media type of
+ multipart/x-byteranges, which is almost, but not quite
+ compatible with the version documented in HTTP/1.1.
+
+19.3 Tolerant Applications
+
+ Although this document specifies the requirements for the generation
+ of HTTP/1.1 messages, not all applications will be correct in their
+ implementation. We therefore recommend that operational applications
+ be tolerant of deviations whenever those deviations can be
+ interpreted unambiguously.
+
+ Clients SHOULD be tolerant in parsing the Status-Line and servers
+ tolerant when parsing the Request-Line. In particular, they SHOULD
+ accept any amount of SP or HT characters between fields, even though
+ only a single SP is required.
+
+ The line terminator for message-header fields is the sequence CRLF.
+ However, we recommend that applications, when parsing such headers,
+ recognize a single LF as a line terminator and ignore the leading CR.
+
+ The character set of an entity-body SHOULD be labeled as the lowest
+ common denominator of the character codes used within that body, with
+ the exception that not labeling the entity is preferred over labeling
+ the entity with the labels US-ASCII or ISO-8859-1. See section 3.7.1
+ and 3.4.1.
+
+ Additional rules for requirements on parsing and encoding of dates
+ and other potential problems with date encodings include:
+
+ - HTTP/1.1 clients and caches SHOULD assume that an RFC-850 date
+ which appears to be more than 50 years in the future is in fact
+ in the past (this helps solve the "year 2000" problem).
+
+ - An HTTP/1.1 implementation MAY internally represent a parsed
+ Expires date as earlier than the proper value, but MUST NOT
+ internally represent a parsed Expires date as later than the
+ proper value.
+
+ - All expiration-related calculations MUST be done in GMT. The
+ local time zone MUST NOT influence the calculation or comparison
+ of an age or expiration time.
+
+
+
+
+Fielding, et al. Standards Track [Page 166]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ - If an HTTP header incorrectly carries a date value with a time
+ zone other than GMT, it MUST be converted into GMT using the
+ most conservative possible conversion.
+
+19.4 Differences Between HTTP Entities and RFC 2045 Entities
+
+ HTTP/1.1 uses many of the constructs defined for Internet Mail (RFC
+ 822 [9]) and the Multipurpose Internet Mail Extensions (MIME [7]) to
+ allow entities to be transmitted in an open variety of
+ representations and with extensible mechanisms. However, RFC 2045
+ discusses mail, and HTTP has a few features that are different from
+ those described in RFC 2045. These differences were carefully chosen
+ to optimize performance over binary connections, to allow greater
+ freedom in the use of new media types, to make date comparisons
+ easier, and to acknowledge the practice of some early HTTP servers
+ and clients.
+
+ This appendix describes specific areas where HTTP differs from RFC
+ 2045. Proxies and gateways to strict MIME environments SHOULD be
+ aware of these differences and provide the appropriate conversions
+ where necessary. Proxies and gateways from MIME environments to HTTP
+ also need to be aware of the differences because some conversions
+ might be required.
+
+19.4.1 MIME-Version
+
+ HTTP is not a MIME-compliant protocol. However, HTTP/1.1 messages MAY
+ include a single MIME-Version general-header field to indicate what
+ version of the MIME protocol was used to construct the message. Use
+ of the MIME-Version header field indicates that the message is in
+ full compliance with the MIME protocol (as defined in RFC 2045[7]).
+ Proxies/gateways are responsible for ensuring full compliance (where
+ possible) when exporting HTTP messages to strict MIME environments.
+
+ MIME-Version = "MIME-Version" ":" 1*DIGIT "." 1*DIGIT
+
+ MIME version "1.0" is the default for use in HTTP/1.1. However,
+ HTTP/1.1 message parsing and semantics are defined by this document
+ and not the MIME specification.
+
+19.4.2 Conversion to Canonical Form
+
+ RFC 2045 [7] requires that an Internet mail entity be converted to
+ canonical form prior to being transferred, as described in section 4
+ of RFC 2049 [48]. Section 3.7.1 of this document describes the forms
+ allowed for subtypes of the "text" media type when transmitted over
+ HTTP. RFC 2046 requires that content with a type of "text" represent
+ line breaks as CRLF and forbids the use of CR or LF outside of line
+
+
+
+Fielding, et al. Standards Track [Page 167]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ break sequences. HTTP allows CRLF, bare CR, and bare LF to indicate a
+ line break within text content when a message is transmitted over
+ HTTP.
+
+ Where it is possible, a proxy or gateway from HTTP to a strict MIME
+ environment SHOULD translate all line breaks within the text media
+ types described in section 3.7.1 of this document to the RFC 2049
+ canonical form of CRLF. Note, however, that this might be complicated
+ by the presence of a Content-Encoding and by the fact that HTTP
+ allows the use of some character sets which do not use octets 13 and
+ 10 to represent CR and LF, as is the case for some multi-byte
+ character sets.
+
+ Implementors should note that conversion will break any cryptographic
+ checksums applied to the original content unless the original content
+ is already in canonical form. Therefore, the canonical form is
+ recommended for any content that uses such checksums in HTTP.
+
+19.4.3 Conversion of Date Formats
+
+ HTTP/1.1 uses a restricted set of date formats (section 3.3.1) to
+ simplify the process of date comparison. Proxies and gateways from
+ other protocols SHOULD ensure that any Date header field present in a
+ message conforms to one of the HTTP/1.1 formats and rewrite the date
+ if necessary.
+
+19.4.4 Introduction of Content-Encoding
+
+ RFC 2045 does not include any concept equivalent to HTTP/1.1's
+ Content-Encoding header field. Since this acts as a modifier on the
+ media type, proxies and gateways from HTTP to MIME-compliant
+ protocols MUST either change the value of the Content-Type header
+ field or decode the entity-body before forwarding the message. (Some
+ experimental applications of Content-Type for Internet mail have used
+ a media-type parameter of ";conversions=<content-coding>" to perform
+ a function equivalent to Content-Encoding. However, this parameter is
+ not part of RFC 2045.)
+
+19.4.5 No Content-Transfer-Encoding
+
+ HTTP does not use the Content-Transfer-Encoding (CTE) field of RFC
+ 2045. Proxies and gateways from MIME-compliant protocols to HTTP MUST
+ remove any non-identity CTE ("quoted-printable" or "base64") encoding
+ prior to delivering the response message to an HTTP client.
+
+ Proxies and gateways from HTTP to MIME-compliant protocols are
+ responsible for ensuring that the message is in the correct format
+ and encoding for safe transport on that protocol, where "safe
+
+
+
+Fielding, et al. Standards Track [Page 168]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ transport" is defined by the limitations of the protocol being used.
+ Such a proxy or gateway SHOULD label the data with an appropriate
+ Content-Transfer-Encoding if doing so will improve the likelihood of
+ safe transport over the destination protocol.
+
+19.4.6 Introduction of Transfer-Encoding
+
+ HTTP/1.1 introduces the Transfer-Encoding header field (section
+ 14.41). Proxies/gateways MUST remove any transfer-coding prior to
+ forwarding a message via a MIME-compliant protocol.
+
+ A process for decoding the "chunked" transfer-coding (section 3.6)
+ can be represented in pseudo-code as:
+
+ length := 0
+ read chunk-size, chunk-extension (if any) and CRLF
+ while (chunk-size > 0) {
+ read chunk-data and CRLF
+ append chunk-data to entity-body
+ length := length + chunk-size
+ read chunk-size and CRLF
+ }
+ read entity-header
+ while (entity-header not empty) {
+ append entity-header to existing header fields
+ read entity-header
+ }
+ Content-Length := length
+ Remove "chunked" from Transfer-Encoding
+
+19.4.7 MHTML and Line Length Limitations
+
+ HTTP implementations which share code with MHTML [45] implementations
+ need to be aware of MIME line length limitations. Since HTTP does not
+ have this limitation, HTTP does not fold long lines. MHTML messages
+ being transported by HTTP follow all conventions of MHTML, including
+ line length limitations and folding, canonicalization, etc., since
+ HTTP transports all message-bodies as payload (see section 3.7.2) and
+ does not interpret the content or any MIME header lines that might be
+ contained therein.
+
+19.5 Additional Features
+
+ RFC 1945 and RFC 2068 document protocol elements used by some
+ existing HTTP implementations, but not consistently and correctly
+ across most HTTP/1.1 applications. Implementors are advised to be
+ aware of these features, but cannot rely upon their presence in, or
+ interoperability with, other HTTP/1.1 applications. Some of these
+
+
+
+Fielding, et al. Standards Track [Page 169]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ describe proposed experimental features, and some describe features
+ that experimental deployment found lacking that are now addressed in
+ the base HTTP/1.1 specification.
+
+ A number of other headers, such as Content-Disposition and Title,
+ from SMTP and MIME are also often implemented (see RFC 2076 [37]).
+
+19.5.1 Content-Disposition
+
+ The Content-Disposition response-header field has been proposed as a
+ means for the origin server to suggest a default filename if the user
+ requests that the content is saved to a file. This usage is derived
+ from the definition of Content-Disposition in RFC 1806 [35].
+
+ content-disposition = "Content-Disposition" ":"
+ disposition-type *( ";" disposition-parm )
+ disposition-type = "attachment" | disp-extension-token
+ disposition-parm = filename-parm | disp-extension-parm
+ filename-parm = "filename" "=" quoted-string
+ disp-extension-token = token
+ disp-extension-parm = token "=" ( token | quoted-string )
+
+ An example is
+
+ Content-Disposition: attachment; filename="fname.ext"
+
+ The receiving user agent SHOULD NOT respect any directory path
+ information present in the filename-parm parameter, which is the only
+ parameter believed to apply to HTTP implementations at this time. The
+ filename SHOULD be treated as a terminal component only.
+
+ If this header is used in a response with the application/octet-
+ stream content-type, the implied suggestion is that the user agent
+ should not display the response, but directly enter a `save response
+ as...' dialog.
+
+ See section 15.5 for Content-Disposition security issues.
+
+19.6 Compatibility with Previous Versions
+
+ It is beyond the scope of a protocol specification to mandate
+ compliance with previous versions. HTTP/1.1 was deliberately
+ designed, however, to make supporting previous versions easy. It is
+ worth noting that, at the time of composing this specification
+ (1996), we would expect commercial HTTP/1.1 servers to:
+
+ - recognize the format of the Request-Line for HTTP/0.9, 1.0, and
+ 1.1 requests;
+
+
+
+Fielding, et al. Standards Track [Page 170]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ - understand any valid request in the format of HTTP/0.9, 1.0, or
+ 1.1;
+
+ - respond appropriately with a message in the same major version
+ used by the client.
+
+ And we would expect HTTP/1.1 clients to:
+
+ - recognize the format of the Status-Line for HTTP/1.0 and 1.1
+ responses;
+
+ - understand any valid response in the format of HTTP/0.9, 1.0, or
+ 1.1.
+
+ For most implementations of HTTP/1.0, each connection is established
+ by the client prior to the request and closed by the server after
+ sending the response. Some implementations implement the Keep-Alive
+ version of persistent connections described in section 19.7.1 of RFC
+ 2068 [33].
+
+19.6.1 Changes from HTTP/1.0
+
+ This section summarizes major differences between versions HTTP/1.0
+ and HTTP/1.1.
+
+19.6.1.1 Changes to Simplify Multi-homed Web Servers and Conserve IP
+ Addresses
+
+ The requirements that clients and servers support the Host request-
+ header, report an error if the Host request-header (section 14.23) is
+ missing from an HTTP/1.1 request, and accept absolute URIs (section
+ 5.1.2) are among the most important changes defined by this
+ specification.
+
+ Older HTTP/1.0 clients assumed a one-to-one relationship of IP
+ addresses and servers; there was no other established mechanism for
+ distinguishing the intended server of a request than the IP address
+ to which that request was directed. The changes outlined above will
+ allow the Internet, once older HTTP clients are no longer common, to
+ support multiple Web sites from a single IP address, greatly
+ simplifying large operational Web servers, where allocation of many
+ IP addresses to a single host has created serious problems. The
+ Internet will also be able to recover the IP addresses that have been
+ allocated for the sole purpose of allowing special-purpose domain
+ names to be used in root-level HTTP URLs. Given the rate of growth of
+ the Web, and the number of servers already deployed, it is extremely
+
+
+
+
+
+Fielding, et al. Standards Track [Page 171]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ important that all implementations of HTTP (including updates to
+ existing HTTP/1.0 applications) correctly implement these
+ requirements:
+
+ - Both clients and servers MUST support the Host request-header.
+
+ - A client that sends an HTTP/1.1 request MUST send a Host header.
+
+ - Servers MUST report a 400 (Bad Request) error if an HTTP/1.1
+ request does not include a Host request-header.
+
+ - Servers MUST accept absolute URIs.
+
+19.6.2 Compatibility with HTTP/1.0 Persistent Connections
+
+ Some clients and servers might wish to be compatible with some
+ previous implementations of persistent connections in HTTP/1.0
+ clients and servers. Persistent connections in HTTP/1.0 are
+ explicitly negotiated as they are not the default behavior. HTTP/1.0
+ experimental implementations of persistent connections are faulty,
+ and the new facilities in HTTP/1.1 are designed to rectify these
+ problems. The problem was that some existing 1.0 clients may be
+ sending Keep-Alive to a proxy server that doesn't understand
+ Connection, which would then erroneously forward it to the next
+ inbound server, which would establish the Keep-Alive connection and
+ result in a hung HTTP/1.0 proxy waiting for the close on the
+ response. The result is that HTTP/1.0 clients must be prevented from
+ using Keep-Alive when talking to proxies.
+
+ However, talking to proxies is the most important use of persistent
+ connections, so that prohibition is clearly unacceptable. Therefore,
+ we need some other mechanism for indicating a persistent connection
+ is desired, which is safe to use even when talking to an old proxy
+ that ignores Connection. Persistent connections are the default for
+ HTTP/1.1 messages; we introduce a new keyword (Connection: close) for
+ declaring non-persistence. See section 14.10.
+
+ The original HTTP/1.0 form of persistent connections (the Connection:
+ Keep-Alive and Keep-Alive header) is documented in RFC 2068. [33]
+
+19.6.3 Changes from RFC 2068
+
+ This specification has been carefully audited to correct and
+ disambiguate key word usage; RFC 2068 had many problems in respect to
+ the conventions laid out in RFC 2119 [34].
+
+ Clarified which error code should be used for inbound server failures
+ (e.g. DNS failures). (Section 10.5.5).
+
+
+
+Fielding, et al. Standards Track [Page 172]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ CREATE had a race that required an Etag be sent when a resource is
+ first created. (Section 10.2.2).
+
+ Content-Base was deleted from the specification: it was not
+ implemented widely, and there is no simple, safe way to introduce it
+ without a robust extension mechanism. In addition, it is used in a
+ similar, but not identical fashion in MHTML [45].
+
+ Transfer-coding and message lengths all interact in ways that
+ required fixing exactly when chunked encoding is used (to allow for
+ transfer encoding that may not be self delimiting); it was important
+ to straighten out exactly how message lengths are computed. (Sections
+ 3.6, 4.4, 7.2.2, 13.5.2, 14.13, 14.16)
+
+ A content-coding of "identity" was introduced, to solve problems
+ discovered in caching. (section 3.5)
+
+ Quality Values of zero should indicate that "I don't want something"
+ to allow clients to refuse a representation. (Section 3.9)
+
+ The use and interpretation of HTTP version numbers has been clarified
+ by RFC 2145. Require proxies to upgrade requests to highest protocol
+ version they support to deal with problems discovered in HTTP/1.0
+ implementations (Section 3.1)
+
+ Charset wildcarding is introduced to avoid explosion of character set
+ names in accept headers. (Section 14.2)
+
+ A case was missed in the Cache-Control model of HTTP/1.1; s-maxage
+ was introduced to add this missing case. (Sections 13.4, 14.8, 14.9,
+ 14.9.3)
+
+ The Cache-Control: max-age directive was not properly defined for
+ responses. (Section 14.9.3)
+
+ There are situations where a server (especially a proxy) does not
+ know the full length of a response but is capable of serving a
+ byterange request. We therefore need a mechanism to allow byteranges
+ with a content-range not indicating the full length of the message.
+ (Section 14.16)
+
+ Range request responses would become very verbose if all meta-data
+ were always returned; by allowing the server to only send needed
+ headers in a 206 response, this problem can be avoided. (Section
+ 10.2.7, 13.5.3, and 14.27)
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 173]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ Fix problem with unsatisfiable range requests; there are two cases:
+ syntactic problems, and range doesn't exist in the document. The 416
+ status code was needed to resolve this ambiguity needed to indicate
+ an error for a byte range request that falls outside of the actual
+ contents of a document. (Section 10.4.17, 14.16)
+
+ Rewrite of message transmission requirements to make it much harder
+ for implementors to get it wrong, as the consequences of errors here
+ can have significant impact on the Internet, and to deal with the
+ following problems:
+
+ 1. Changing "HTTP/1.1 or later" to "HTTP/1.1", in contexts where
+ this was incorrectly placing a requirement on the behavior of
+ an implementation of a future version of HTTP/1.x
+
+ 2. Made it clear that user-agents should retry requests, not
+ "clients" in general.
+
+ 3. Converted requirements for clients to ignore unexpected 100
+ (Continue) responses, and for proxies to forward 100 responses,
+ into a general requirement for 1xx responses.
+
+ 4. Modified some TCP-specific language, to make it clearer that
+ non-TCP transports are possible for HTTP.
+
+ 5. Require that the origin server MUST NOT wait for the request
+ body before it sends a required 100 (Continue) response.
+
+ 6. Allow, rather than require, a server to omit 100 (Continue) if
+ it has already seen some of the request body.
+
+ 7. Allow servers to defend against denial-of-service attacks and
+ broken clients.
+
+ This change adds the Expect header and 417 status code. The message
+ transmission requirements fixes are in sections 8.2, 10.4.18,
+ 8.1.2.2, 13.11, and 14.20.
+
+ Proxies should be able to add Content-Length when appropriate.
+ (Section 13.5.2)
+
+ Clean up confusion between 403 and 404 responses. (Section 10.4.4,
+ 10.4.5, and 10.4.11)
+
+ Warnings could be cached incorrectly, or not updated appropriately.
+ (Section 13.1.2, 13.2.4, 13.5.2, 13.5.3, 14.9.3, and 14.46) Warning
+ also needed to be a general header, as PUT or other methods may have
+ need for it in requests.
+
+
+
+Fielding, et al. Standards Track [Page 174]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ Transfer-coding had significant problems, particularly with
+ interactions with chunked encoding. The solution is that transfer-
+ codings become as full fledged as content-codings. This involves
+ adding an IANA registry for transfer-codings (separate from content
+ codings), a new header field (TE) and enabling trailer headers in the
+ future. Transfer encoding is a major performance benefit, so it was
+ worth fixing [39]. TE also solves another, obscure, downward
+ interoperability problem that could have occurred due to interactions
+ between authentication trailers, chunked encoding and HTTP/1.0
+ clients.(Section 3.6, 3.6.1, and 14.39)
+
+ The PATCH, LINK, UNLINK methods were defined but not commonly
+ implemented in previous versions of this specification. See RFC 2068
+ [33].
+
+ The Alternates, Content-Version, Derived-From, Link, URI, Public and
+ Content-Base header fields were defined in previous versions of this
+ specification, but not commonly implemented. See RFC 2068 [33].
+
+20 Index
+
+ Please see the PostScript version of this RFC for the INDEX.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 175]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+21. Full Copyright Statement
+
+ Copyright (C) The Internet Society (1999). All Rights Reserved.
+
+ This document and translations of it may be copied and furnished to
+ others, and derivative works that comment on or otherwise explain it
+ or assist in its implementation may be prepared, copied, published
+ and distributed, in whole or in part, without restriction of any
+ kind, provided that the above copyright notice and this paragraph are
+ included on all such copies and derivative works. However, this
+ document itself may not be modified in any way, such as by removing
+ the copyright notice or references to the Internet Society or other
+ Internet organizations, except as needed for the purpose of
+ developing Internet standards in which case the procedures for
+ copyrights defined in the Internet Standards process must be
+ followed, or as required to translate it into languages other than
+ English.
+
+ The limited permissions granted above are perpetual and will not be
+ revoked by the Internet Society or its successors or assigns.
+
+ This document and the information contained herein is provided on an
+ "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING
+ TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING
+ BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION
+ HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF
+ MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+
+Acknowledgement
+
+ Funding for the RFC Editor function is currently provided by the
+ Internet Society.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 176]
+
diff --git a/vendor/sabre/dav/docs/rfc2617.txt b/vendor/sabre/dav/docs/rfc2617.txt
new file mode 100644
index 000000000..771aa924a
--- /dev/null
+++ b/vendor/sabre/dav/docs/rfc2617.txt
@@ -0,0 +1,1907 @@
+
+
+
+
+
+
+Network Working Group J. Franks
+Request for Comments: 2617 Northwestern University
+Obsoletes: 2069 P. Hallam-Baker
+Category: Standards Track Verisign, Inc.
+ J. Hostetler
+ AbiSource, Inc.
+ S. Lawrence
+ Agranat Systems, Inc.
+ P. Leach
+ Microsoft Corporation
+ A. Luotonen
+ Netscape Communications Corporation
+ L. Stewart
+ Open Market, Inc.
+ June 1999
+
+
+ HTTP Authentication: Basic and Digest Access Authentication
+
+Status of this Memo
+
+ This document specifies an Internet standards track protocol for the
+ Internet community, and requests discussion and suggestions for
+ improvements. Please refer to the current edition of the "Internet
+ Official Protocol Standards" (STD 1) for the standardization state
+ and status of this protocol. Distribution of this memo is unlimited.
+
+Copyright Notice
+
+ Copyright (C) The Internet Society (1999). All Rights Reserved.
+
+Abstract
+
+ "HTTP/1.0", includes the specification for a Basic Access
+ Authentication scheme. This scheme is not considered to be a secure
+ method of user authentication (unless used in conjunction with some
+ external secure system such as SSL [5]), as the user name and
+ password are passed over the network as cleartext.
+
+ This document also provides the specification for HTTP's
+ authentication framework, the original Basic authentication scheme
+ and a scheme based on cryptographic hashes, referred to as "Digest
+ Access Authentication". It is therefore also intended to serve as a
+ replacement for RFC 2069 [6]. Some optional elements specified by
+ RFC 2069 have been removed from this specification due to problems
+ found since its publication; other new elements have been added for
+ compatibility, those new elements have been made optional, but are
+ strongly recommended.
+
+
+
+Franks, et al. Standards Track [Page 1]
+
+RFC 2617 HTTP Authentication June 1999
+
+
+ Like Basic, Digest access authentication verifies that both parties
+ to a communication know a shared secret (a password); unlike Basic,
+ this verification can be done without sending the password in the
+ clear, which is Basic's biggest weakness. As with most other
+ authentication protocols, the greatest sources of risks are usually
+ found not in the core protocol itself but in policies and procedures
+ surrounding its use.
+
+Table of Contents
+
+ 1 Access Authentication................................ 3
+ 1.1 Reliance on the HTTP/1.1 Specification............ 3
+ 1.2 Access Authentication Framework................... 3
+ 2 Basic Authentication Scheme.......................... 5
+ 3 Digest Access Authentication Scheme.................. 6
+ 3.1 Introduction...................................... 6
+ 3.1.1 Purpose......................................... 6
+ 3.1.2 Overall Operation............................... 6
+ 3.1.3 Representation of digest values................. 7
+ 3.1.4 Limitations..................................... 7
+ 3.2 Specification of Digest Headers................... 7
+ 3.2.1 The WWW-Authenticate Response Header............ 8
+ 3.2.2 The Authorization Request Header................ 11
+ 3.2.3 The Authentication-Info Header.................. 15
+ 3.3 Digest Operation.................................. 17
+ 3.4 Security Protocol Negotiation..................... 18
+ 3.5 Example........................................... 18
+ 3.6 Proxy-Authentication and Proxy-Authorization...... 19
+ 4 Security Considerations.............................. 19
+ 4.1 Authentication of Clients using Basic
+ Authentication.................................... 19
+ 4.2 Authentication of Clients using Digest
+ Authentication.................................... 20
+ 4.3 Limited Use Nonce Values.......................... 21
+ 4.4 Comparison of Digest with Basic Authentication.... 22
+ 4.5 Replay Attacks.................................... 22
+ 4.6 Weakness Created by Multiple Authentication
+ Schemes........................................... 23
+ 4.7 Online dictionary attacks......................... 23
+ 4.8 Man in the Middle................................. 24
+ 4.9 Chosen plaintext attacks.......................... 24
+ 4.10 Precomputed dictionary attacks.................... 25
+ 4.11 Batch brute force attacks......................... 25
+ 4.12 Spoofing by Counterfeit Servers................... 25
+ 4.13 Storing passwords................................. 26
+ 4.14 Summary........................................... 26
+ 5 Sample implementation................................ 27
+ 6 Acknowledgments...................................... 31
+
+
+
+Franks, et al. Standards Track [Page 2]
+
+RFC 2617 HTTP Authentication June 1999
+
+
+ 7 References........................................... 31
+ 8 Authors' Addresses................................... 32
+ 9 Full Copyright Statement............................. 34
+
+1 Access Authentication
+
+1.1 Reliance on the HTTP/1.1 Specification
+
+ This specification is a companion to the HTTP/1.1 specification [2].
+ It uses the augmented BNF section 2.1 of that document, and relies on
+ both the non-terminals defined in that document and other aspects of
+ the HTTP/1.1 specification.
+
+1.2 Access Authentication Framework
+
+ HTTP provides a simple challenge-response authentication mechanism
+ that MAY be used by a server to challenge a client request and by a
+ client to provide authentication information. It uses an extensible,
+ case-insensitive token to identify the authentication scheme,
+ followed by a comma-separated list of attribute-value pairs which
+ carry the parameters necessary for achieving authentication via that
+ scheme.
+
+ auth-scheme = token
+ auth-param = token "=" ( token | quoted-string )
+
+ The 401 (Unauthorized) response message is used by an origin server
+ to challenge the authorization of a user agent. This response MUST
+ include a WWW-Authenticate header field containing at least one
+ challenge applicable to the requested resource. The 407 (Proxy
+ Authentication Required) response message is used by a proxy to
+ challenge the authorization of a client and MUST include a Proxy-
+ Authenticate header field containing at least one challenge
+ applicable to the proxy for the requested resource.
+
+ challenge = auth-scheme 1*SP 1#auth-param
+
+ Note: User agents will need to take special care in parsing the WWW-
+ Authenticate or Proxy-Authenticate header field value if it contains
+ more than one challenge, or if more than one WWW-Authenticate header
+ field is provided, since the contents of a challenge may itself
+ contain a comma-separated list of authentication parameters.
+
+ The authentication parameter realm is defined for all authentication
+ schemes:
+
+ realm = "realm" "=" realm-value
+ realm-value = quoted-string
+
+
+
+Franks, et al. Standards Track [Page 3]
+
+RFC 2617 HTTP Authentication June 1999
+
+
+ The realm directive (case-insensitive) is required for all
+ authentication schemes that issue a challenge. The realm value
+ (case-sensitive), in combination with the canonical root URL (the
+ absoluteURI for the server whose abs_path is empty; see section 5.1.2
+ of [2]) of the server being accessed, defines the protection space.
+ These realms allow the protected resources on a server to be
+ partitioned into a set of protection spaces, each with its own
+ authentication scheme and/or authorization database. The realm value
+ is a string, generally assigned by the origin server, which may have
+ additional semantics specific to the authentication scheme. Note that
+ there may be multiple challenges with the same auth-scheme but
+ different realms.
+
+ A user agent that wishes to authenticate itself with an origin
+ server--usually, but not necessarily, after receiving a 401
+ (Unauthorized)--MAY do so by including an Authorization header field
+ with the request. A client that wishes to authenticate itself with a
+ proxy--usually, but not necessarily, after receiving a 407 (Proxy
+ Authentication Required)--MAY do so by including a Proxy-
+ Authorization header field with the request. Both the Authorization
+ field value and the Proxy-Authorization field value consist of
+ credentials containing the authentication information of the client
+ for the realm of the resource being requested. The user agent MUST
+ choose to use one of the challenges with the strongest auth-scheme it
+ understands and request credentials from the user based upon that
+ challenge.
+
+ credentials = auth-scheme #auth-param
+
+ Note that many browsers will only recognize Basic and will require
+ that it be the first auth-scheme presented. Servers should only
+ include Basic if it is minimally acceptable.
+
+ The protection space determines the domain over which credentials can
+ be automatically applied. If a prior request has been authorized, the
+ same credentials MAY be reused for all other requests within that
+ protection space for a period of time determined by the
+ authentication scheme, parameters, and/or user preference. Unless
+ otherwise defined by the authentication scheme, a single protection
+ space cannot extend outside the scope of its server.
+
+ If the origin server does not wish to accept the credentials sent
+ with a request, it SHOULD return a 401 (Unauthorized) response. The
+ response MUST include a WWW-Authenticate header field containing at
+ least one (possibly new) challenge applicable to the requested
+ resource. If a proxy does not accept the credentials sent with a
+ request, it SHOULD return a 407 (Proxy Authentication Required). The
+ response MUST include a Proxy-Authenticate header field containing a
+
+
+
+Franks, et al. Standards Track [Page 4]
+
+RFC 2617 HTTP Authentication June 1999
+
+
+ (possibly new) challenge applicable to the proxy for the requested
+ resource.
+
+ The HTTP protocol does not restrict applications to this simple
+ challenge-response mechanism for access authentication. Additional
+ mechanisms MAY be used, such as encryption at the transport level or
+ via message encapsulation, and with additional header fields
+ specifying authentication information. However, these additional
+ mechanisms are not defined by this specification.
+
+ Proxies MUST be completely transparent regarding user agent
+ authentication by origin servers. That is, they must forward the
+ WWW-Authenticate and Authorization headers untouched, and follow the
+ rules found in section 14.8 of [2]. Both the Proxy-Authenticate and
+ the Proxy-Authorization header fields are hop-by-hop headers (see
+ section 13.5.1 of [2]).
+
+2 Basic Authentication Scheme
+
+ The "basic" authentication scheme is based on the model that the
+ client must authenticate itself with a user-ID and a password for
+ each realm. The realm value should be considered an opaque string
+ which can only be compared for equality with other realms on that
+ server. The server will service the request only if it can validate
+ the user-ID and password for the protection space of the Request-URI.
+ There are no optional authentication parameters.
+
+ For Basic, the framework above is utilized as follows:
+
+ challenge = "Basic" realm
+ credentials = "Basic" basic-credentials
+
+ Upon receipt of an unauthorized request for a URI within the
+ protection space, the origin server MAY respond with a challenge like
+ the following:
+
+ WWW-Authenticate: Basic realm="WallyWorld"
+
+ where "WallyWorld" is the string assigned by the server to identify
+ the protection space of the Request-URI. A proxy may respond with the
+ same challenge using the Proxy-Authenticate header field.
+
+ To receive authorization, the client sends the userid and password,
+ separated by a single colon (":") character, within a base64 [7]
+ encoded string in the credentials.
+
+ basic-credentials = base64-user-pass
+ base64-user-pass = <base64 [4] encoding of user-pass,
+
+
+
+Franks, et al. Standards Track [Page 5]
+
+RFC 2617 HTTP Authentication June 1999
+
+
+ except not limited to 76 char/line>
+ user-pass = userid ":" password
+ userid = *<TEXT excluding ":">
+ password = *TEXT
+
+ Userids might be case sensitive.
+
+ If the user agent wishes to send the userid "Aladdin" and password
+ "open sesame", it would use the following header field:
+
+ Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
+
+ A client SHOULD assume that all paths at or deeper than the depth of
+ the last symbolic element in the path field of the Request-URI also
+ are within the protection space specified by the Basic realm value of
+ the current challenge. A client MAY preemptively send the
+ corresponding Authorization header with requests for resources in
+ that space without receipt of another challenge from the server.
+ Similarly, when a client sends a request to a proxy, it may reuse a
+ userid and password in the Proxy-Authorization header field without
+ receiving another challenge from the proxy server. See section 4 for
+ security considerations associated with Basic authentication.
+
+3 Digest Access Authentication Scheme
+
+3.1 Introduction
+
+3.1.1 Purpose
+
+ The protocol referred to as "HTTP/1.0" includes the specification for
+ a Basic Access Authentication scheme[1]. That scheme is not
+ considered to be a secure method of user authentication, as the user
+ name and password are passed over the network in an unencrypted form.
+ This section provides the specification for a scheme that does not
+ send the password in cleartext, referred to as "Digest Access
+ Authentication".
+
+ The Digest Access Authentication scheme is not intended to be a
+ complete answer to the need for security in the World Wide Web. This
+ scheme provides no encryption of message content. The intent is
+ simply to create an access authentication method that avoids the most
+ serious flaws of Basic authentication.
+
+3.1.2 Overall Operation
+
+ Like Basic Access Authentication, the Digest scheme is based on a
+ simple challenge-response paradigm. The Digest scheme challenges
+ using a nonce value. A valid response contains a checksum (by
+
+
+
+Franks, et al. Standards Track [Page 6]
+
+RFC 2617 HTTP Authentication June 1999
+
+
+ default, the MD5 checksum) of the username, the password, the given
+ nonce value, the HTTP method, and the requested URI. In this way, the
+ password is never sent in the clear. Just as with the Basic scheme,
+ the username and password must be prearranged in some fashion not
+ addressed by this document.
+
+3.1.3 Representation of digest values
+
+ An optional header allows the server to specify the algorithm used to
+ create the checksum or digest. By default the MD5 algorithm is used
+ and that is the only algorithm described in this document.
+
+ For the purposes of this document, an MD5 digest of 128 bits is
+ represented as 32 ASCII printable characters. The bits in the 128 bit
+ digest are converted from most significant to least significant bit,
+ four bits at a time to their ASCII presentation as follows. Each four
+ bits is represented by its familiar hexadecimal notation from the
+ characters 0123456789abcdef. That is, binary 0000 gets represented by
+ the character '0', 0001, by '1', and so on up to the representation
+ of 1111 as 'f'.
+
+3.1.4 Limitations
+
+ The Digest authentication scheme described in this document suffers
+ from many known limitations. It is intended as a replacement for
+ Basic authentication and nothing more. It is a password-based system
+ and (on the server side) suffers from all the same problems of any
+ password system. In particular, no provision is made in this protocol
+ for the initial secure arrangement between user and server to
+ establish the user's password.
+
+ Users and implementors should be aware that this protocol is not as
+ secure as Kerberos, and not as secure as any client-side private-key
+ scheme. Nevertheless it is better than nothing, better than what is
+ commonly used with telnet and ftp, and better than Basic
+ authentication.
+
+3.2 Specification of Digest Headers
+
+ The Digest Access Authentication scheme is conceptually similar to
+ the Basic scheme. The formats of the modified WWW-Authenticate header
+ line and the Authorization header line are specified below. In
+ addition, a new header, Authentication-Info, is specified.
+
+
+
+
+
+
+
+
+Franks, et al. Standards Track [Page 7]
+
+RFC 2617 HTTP Authentication June 1999
+
+
+3.2.1 The WWW-Authenticate Response Header
+
+ If a server receives a request for an access-protected object, and an
+ acceptable Authorization header is not sent, the server responds with
+ a "401 Unauthorized" status code, and a WWW-Authenticate header as
+ per the framework defined above, which for the digest scheme is
+ utilized as follows:
+
+ challenge = "Digest" digest-challenge
+
+ digest-challenge = 1#( realm | [ domain ] | nonce |
+ [ opaque ] |[ stale ] | [ algorithm ] |
+ [ qop-options ] | [auth-param] )
+
+
+ domain = "domain" "=" <"> URI ( 1*SP URI ) <">
+ URI = absoluteURI | abs_path
+ nonce = "nonce" "=" nonce-value
+ nonce-value = quoted-string
+ opaque = "opaque" "=" quoted-string
+ stale = "stale" "=" ( "true" | "false" )
+ algorithm = "algorithm" "=" ( "MD5" | "MD5-sess" |
+ token )
+ qop-options = "qop" "=" <"> 1#qop-value <">
+ qop-value = "auth" | "auth-int" | token
+
+ The meanings of the values of the directives used above are as
+ follows:
+
+ realm
+ A string to be displayed to users so they know which username and
+ password to use. This string should contain at least the name of
+ the host performing the authentication and might additionally
+ indicate the collection of users who might have access. An example
+ might be "registered_users@gotham.news.com".
+
+ domain
+ A quoted, space-separated list of URIs, as specified in RFC XURI
+ [7], that define the protection space. If a URI is an abs_path, it
+ is relative to the canonical root URL (see section 1.2 above) of
+ the server being accessed. An absoluteURI in this list may refer to
+ a different server than the one being accessed. The client can use
+ this list to determine the set of URIs for which the same
+ authentication information may be sent: any URI that has a URI in
+ this list as a prefix (after both have been made absolute) may be
+ assumed to be in the same protection space. If this directive is
+ omitted or its value is empty, the client should assume that the
+ protection space consists of all URIs on the responding server.
+
+
+
+Franks, et al. Standards Track [Page 8]
+
+RFC 2617 HTTP Authentication June 1999
+
+
+ This directive is not meaningful in Proxy-Authenticate headers, for
+ which the protection space is always the entire proxy; if present
+ it should be ignored.
+
+ nonce
+ A server-specified data string which should be uniquely generated
+ each time a 401 response is made. It is recommended that this
+ string be base64 or hexadecimal data. Specifically, since the
+ string is passed in the header lines as a quoted string, the
+ double-quote character is not allowed.
+
+ The contents of the nonce are implementation dependent. The quality
+ of the implementation depends on a good choice. A nonce might, for
+ example, be constructed as the base 64 encoding of
+
+ time-stamp H(time-stamp ":" ETag ":" private-key)
+
+ where time-stamp is a server-generated time or other non-repeating
+ value, ETag is the value of the HTTP ETag header associated with
+ the requested entity, and private-key is data known only to the
+ server. With a nonce of this form a server would recalculate the
+ hash portion after receiving the client authentication header and
+ reject the request if it did not match the nonce from that header
+ or if the time-stamp value is not recent enough. In this way the
+ server can limit the time of the nonce's validity. The inclusion of
+ the ETag prevents a replay request for an updated version of the
+ resource. (Note: including the IP address of the client in the
+ nonce would appear to offer the server the ability to limit the
+ reuse of the nonce to the same client that originally got it.
+ However, that would break proxy farms, where requests from a single
+ user often go through different proxies in the farm. Also, IP
+ address spoofing is not that hard.)
+
+ An implementation might choose not to accept a previously used
+ nonce or a previously used digest, in order to protect against a
+ replay attack. Or, an implementation might choose to use one-time
+ nonces or digests for POST or PUT requests and a time-stamp for GET
+ requests. For more details on the issues involved see section 4.
+ of this document.
+
+ The nonce is opaque to the client.
+
+ opaque
+ A string of data, specified by the server, which should be returned
+ by the client unchanged in the Authorization header of subsequent
+ requests with URIs in the same protection space. It is recommended
+ that this string be base64 or hexadecimal data.
+
+
+
+
+Franks, et al. Standards Track [Page 9]
+
+RFC 2617 HTTP Authentication June 1999
+
+
+ stale
+ A flag, indicating that the previous request from the client was
+ rejected because the nonce value was stale. If stale is TRUE
+ (case-insensitive), the client may wish to simply retry the request
+ with a new encrypted response, without reprompting the user for a
+ new username and password. The server should only set stale to TRUE
+ if it receives a request for which the nonce is invalid but with a
+ valid digest for that nonce (indicating that the client knows the
+ correct username/password). If stale is FALSE, or anything other
+ than TRUE, or the stale directive is not present, the username
+ and/or password are invalid, and new values must be obtained.
+
+ algorithm
+ A string indicating a pair of algorithms used to produce the digest
+ and a checksum. If this is not present it is assumed to be "MD5".
+ If the algorithm is not understood, the challenge should be ignored
+ (and a different one used, if there is more than one).
+
+ In this document the string obtained by applying the digest
+ algorithm to the data "data" with secret "secret" will be denoted
+ by KD(secret, data), and the string obtained by applying the
+ checksum algorithm to the data "data" will be denoted H(data). The
+ notation unq(X) means the value of the quoted-string X without the
+ surrounding quotes.
+
+ For the "MD5" and "MD5-sess" algorithms
+
+ H(data) = MD5(data)
+
+ and
+
+ KD(secret, data) = H(concat(secret, ":", data))
+
+ i.e., the digest is the MD5 of the secret concatenated with a colon
+ concatenated with the data. The "MD5-sess" algorithm is intended to
+ allow efficient 3rd party authentication servers; for the
+ difference in usage, see the description in section 3.2.2.2.
+
+ qop-options
+ This directive is optional, but is made so only for backward
+ compatibility with RFC 2069 [6]; it SHOULD be used by all
+ implementations compliant with this version of the Digest scheme.
+ If present, it is a quoted string of one or more tokens indicating
+ the "quality of protection" values supported by the server. The
+ value "auth" indicates authentication; the value "auth-int"
+ indicates authentication with integrity protection; see the
+
+
+
+
+
+Franks, et al. Standards Track [Page 10]
+
+RFC 2617 HTTP Authentication June 1999
+
+
+ descriptions below for calculating the response directive value for
+ the application of this choice. Unrecognized options MUST be
+ ignored.
+
+ auth-param
+ This directive allows for future extensions. Any unrecognized
+ directive MUST be ignored.
+
+3.2.2 The Authorization Request Header
+
+ The client is expected to retry the request, passing an Authorization
+ header line, which is defined according to the framework above,
+ utilized as follows.
+
+ credentials = "Digest" digest-response
+ digest-response = 1#( username | realm | nonce | digest-uri
+ | response | [ algorithm ] | [cnonce] |
+ [opaque] | [message-qop] |
+ [nonce-count] | [auth-param] )
+
+ username = "username" "=" username-value
+ username-value = quoted-string
+ digest-uri = "uri" "=" digest-uri-value
+ digest-uri-value = request-uri ; As specified by HTTP/1.1
+ message-qop = "qop" "=" qop-value
+ cnonce = "cnonce" "=" cnonce-value
+ cnonce-value = nonce-value
+ nonce-count = "nc" "=" nc-value
+ nc-value = 8LHEX
+ response = "response" "=" request-digest
+ request-digest = <"> 32LHEX <">
+ LHEX = "0" | "1" | "2" | "3" |
+ "4" | "5" | "6" | "7" |
+ "8" | "9" | "a" | "b" |
+ "c" | "d" | "e" | "f"
+
+ The values of the opaque and algorithm fields must be those supplied
+ in the WWW-Authenticate response header for the entity being
+ requested.
+
+ response
+ A string of 32 hex digits computed as defined below, which proves
+ that the user knows a password
+
+ username
+ The user's name in the specified realm.
+
+
+
+
+
+Franks, et al. Standards Track [Page 11]
+
+RFC 2617 HTTP Authentication June 1999
+
+
+ digest-uri
+ The URI from Request-URI of the Request-Line; duplicated here
+ because proxies are allowed to change the Request-Line in transit.
+
+ qop
+ Indicates what "quality of protection" the client has applied to
+ the message. If present, its value MUST be one of the alternatives
+ the server indicated it supports in the WWW-Authenticate header.
+ These values affect the computation of the request-digest. Note
+ that this is a single token, not a quoted list of alternatives as
+ in WWW- Authenticate. This directive is optional in order to
+ preserve backward compatibility with a minimal implementation of
+ RFC 2069 [6], but SHOULD be used if the server indicated that qop
+ is supported by providing a qop directive in the WWW-Authenticate
+ header field.
+
+ cnonce
+ This MUST be specified if a qop directive is sent (see above), and
+ MUST NOT be specified if the server did not send a qop directive in
+ the WWW-Authenticate header field. The cnonce-value is an opaque
+ quoted string value provided by the client and used by both client
+ and server to avoid chosen plaintext attacks, to provide mutual
+ authentication, and to provide some message integrity protection.
+ See the descriptions below of the calculation of the response-
+ digest and request-digest values.
+
+ nonce-count
+ This MUST be specified if a qop directive is sent (see above), and
+ MUST NOT be specified if the server did not send a qop directive in
+ the WWW-Authenticate header field. The nc-value is the hexadecimal
+ count of the number of requests (including the current request)
+ that the client has sent with the nonce value in this request. For
+ example, in the first request sent in response to a given nonce
+ value, the client sends "nc=00000001". The purpose of this
+ directive is to allow the server to detect request replays by
+ maintaining its own copy of this count - if the same nc-value is
+ seen twice, then the request is a replay. See the description
+ below of the construction of the request-digest value.
+
+ auth-param
+ This directive allows for future extensions. Any unrecognized
+ directive MUST be ignored.
+
+ If a directive or its value is improper, or required directives are
+ missing, the proper response is 400 Bad Request. If the request-
+ digest is invalid, then a login failure should be logged, since
+ repeated login failures from a single client may indicate an attacker
+ attempting to guess passwords.
+
+
+
+Franks, et al. Standards Track [Page 12]
+
+RFC 2617 HTTP Authentication June 1999
+
+
+ The definition of request-digest above indicates the encoding for its
+ value. The following definitions show how the value is computed.
+
+3.2.2.1 Request-Digest
+
+ If the "qop" value is "auth" or "auth-int":
+
+ request-digest = <"> < KD ( H(A1), unq(nonce-value)
+ ":" nc-value
+ ":" unq(cnonce-value)
+ ":" unq(qop-value)
+ ":" H(A2)
+ ) <">
+
+ If the "qop" directive is not present (this construction is for
+ compatibility with RFC 2069):
+
+ request-digest =
+ <"> < KD ( H(A1), unq(nonce-value) ":" H(A2) ) >
+ <">
+
+ See below for the definitions for A1 and A2.
+
+3.2.2.2 A1
+
+ If the "algorithm" directive's value is "MD5" or is unspecified, then
+ A1 is:
+
+ A1 = unq(username-value) ":" unq(realm-value) ":" passwd
+
+ where
+
+ passwd = < user's password >
+
+ If the "algorithm" directive's value is "MD5-sess", then A1 is
+ calculated only once - on the first request by the client following
+ receipt of a WWW-Authenticate challenge from the server. It uses the
+ server nonce from that challenge, and the first client nonce value to
+ construct A1 as follows:
+
+ A1 = H( unq(username-value) ":" unq(realm-value)
+ ":" passwd )
+ ":" unq(nonce-value) ":" unq(cnonce-value)
+
+ This creates a 'session key' for the authentication of subsequent
+ requests and responses which is different for each "authentication
+ session", thus limiting the amount of material hashed with any one
+ key. (Note: see further discussion of the authentication session in
+
+
+
+Franks, et al. Standards Track [Page 13]
+
+RFC 2617 HTTP Authentication June 1999
+
+
+ section 3.3.) Because the server need only use the hash of the user
+ credentials in order to create the A1 value, this construction could
+ be used in conjunction with a third party authentication service so
+ that the web server would not need the actual password value. The
+ specification of such a protocol is beyond the scope of this
+ specification.
+
+3.2.2.3 A2
+
+ If the "qop" directive's value is "auth" or is unspecified, then A2
+ is:
+
+ A2 = Method ":" digest-uri-value
+
+ If the "qop" value is "auth-int", then A2 is:
+
+ A2 = Method ":" digest-uri-value ":" H(entity-body)
+
+3.2.2.4 Directive values and quoted-string
+
+ Note that the value of many of the directives, such as "username-
+ value", are defined as a "quoted-string". However, the "unq" notation
+ indicates that surrounding quotation marks are removed in forming the
+ string A1. Thus if the Authorization header includes the fields
+
+ username="Mufasa", realm=myhost@testrealm.com
+
+ and the user Mufasa has password "Circle Of Life" then H(A1) would be
+ H(Mufasa:myhost@testrealm.com:Circle Of Life) with no quotation marks
+ in the digested string.
+
+ No white space is allowed in any of the strings to which the digest
+ function H() is applied unless that white space exists in the quoted
+ strings or entity body whose contents make up the string to be
+ digested. For example, the string A1 illustrated above must be
+
+ Mufasa:myhost@testrealm.com:Circle Of Life
+
+ with no white space on either side of the colons, but with the white
+ space between the words used in the password value. Likewise, the
+ other strings digested by H() must not have white space on either
+ side of the colons which delimit their fields unless that white space
+ was in the quoted strings or entity body being digested.
+
+ Also note that if integrity protection is applied (qop=auth-int), the
+ H(entity-body) is the hash of the entity body, not the message body -
+ it is computed before any transfer encoding is applied by the sender
+
+
+
+
+Franks, et al. Standards Track [Page 14]
+
+RFC 2617 HTTP Authentication June 1999
+
+
+ and after it has been removed by the recipient. Note that this
+ includes multipart boundaries and embedded headers in each part of
+ any multipart content-type.
+
+3.2.2.5 Various considerations
+
+ The "Method" value is the HTTP request method as specified in section
+ 5.1.1 of [2]. The "request-uri" value is the Request-URI from the
+ request line as specified in section 5.1.2 of [2]. This may be "*",
+ an "absoluteURL" or an "abs_path" as specified in section 5.1.2 of
+ [2], but it MUST agree with the Request-URI. In particular, it MUST
+ be an "absoluteURL" if the Request-URI is an "absoluteURL". The
+ "cnonce-value" is an optional client-chosen value whose purpose is
+ to foil chosen plaintext attacks.
+
+ The authenticating server must assure that the resource designated by
+ the "uri" directive is the same as the resource specified in the
+ Request-Line; if they are not, the server SHOULD return a 400 Bad
+ Request error. (Since this may be a symptom of an attack, server
+ implementers may want to consider logging such errors.) The purpose
+ of duplicating information from the request URL in this field is to
+ deal with the possibility that an intermediate proxy may alter the
+ client's Request-Line. This altered (but presumably semantically
+ equivalent) request would not result in the same digest as that
+ calculated by the client.
+
+ Implementers should be aware of how authenticated transactions
+ interact with shared caches. The HTTP/1.1 protocol specifies that
+ when a shared cache (see section 13.7 of [2]) has received a request
+ containing an Authorization header and a response from relaying that
+ request, it MUST NOT return that response as a reply to any other
+ request, unless one of two Cache-Control (see section 14.9 of [2])
+ directives was present in the response. If the original response
+ included the "must-revalidate" Cache-Control directive, the cache MAY
+ use the entity of that response in replying to a subsequent request,
+ but MUST first revalidate it with the origin server, using the
+ request headers from the new request to allow the origin server to
+ authenticate the new request. Alternatively, if the original response
+ included the "public" Cache-Control directive, the response entity
+ MAY be returned in reply to any subsequent request.
+
+3.2.3 The Authentication-Info Header
+
+ The Authentication-Info header is used by the server to communicate
+ some information regarding the successful authentication in the
+ response.
+
+
+
+
+
+Franks, et al. Standards Track [Page 15]
+
+RFC 2617 HTTP Authentication June 1999
+
+
+ AuthenticationInfo = "Authentication-Info" ":" auth-info
+ auth-info = 1#(nextnonce | [ message-qop ]
+ | [ response-auth ] | [ cnonce ]
+ | [nonce-count] )
+ nextnonce = "nextnonce" "=" nonce-value
+ response-auth = "rspauth" "=" response-digest
+ response-digest = <"> *LHEX <">
+
+ The value of the nextnonce directive is the nonce the server wishes
+ the client to use for a future authentication response. The server
+ may send the Authentication-Info header with a nextnonce field as a
+ means of implementing one-time or otherwise changing nonces. If the
+ nextnonce field is present the client SHOULD use it when constructing
+ the Authorization header for its next request. Failure of the client
+ to do so may result in a request to re-authenticate from the server
+ with the "stale=TRUE".
+
+ Server implementations should carefully consider the performance
+ implications of the use of this mechanism; pipelined requests will
+ not be possible if every response includes a nextnonce directive
+ that must be used on the next request received by the server.
+ Consideration should be given to the performance vs. security
+ tradeoffs of allowing an old nonce value to be used for a limited
+ time to permit request pipelining. Use of the nonce-count can
+ retain most of the security advantages of a new server nonce
+ without the deleterious affects on pipelining.
+
+ message-qop
+ Indicates the "quality of protection" options applied to the
+ response by the server. The value "auth" indicates authentication;
+ the value "auth-int" indicates authentication with integrity
+ protection. The server SHOULD use the same value for the message-
+ qop directive in the response as was sent by the client in the
+ corresponding request.
+
+ The optional response digest in the "response-auth" directive
+ supports mutual authentication -- the server proves that it knows the
+ user's secret, and with qop=auth-int also provides limited integrity
+ protection of the response. The "response-digest" value is calculated
+ as for the "request-digest" in the Authorization header, except that
+ if "qop=auth" or is not specified in the Authorization header for the
+ request, A2 is
+
+ A2 = ":" digest-uri-value
+
+ and if "qop=auth-int", then A2 is
+
+ A2 = ":" digest-uri-value ":" H(entity-body)
+
+
+
+Franks, et al. Standards Track [Page 16]
+
+RFC 2617 HTTP Authentication June 1999
+
+
+ where "digest-uri-value" is the value of the "uri" directive on the
+ Authorization header in the request. The "cnonce-value" and "nc-
+ value" MUST be the ones for the client request to which this message
+ is the response. The "response-auth", "cnonce", and "nonce-count"
+ directives MUST BE present if "qop=auth" or "qop=auth-int" is
+ specified.
+
+ The Authentication-Info header is allowed in the trailer of an HTTP
+ message transferred via chunked transfer-coding.
+
+3.3 Digest Operation
+
+ Upon receiving the Authorization header, the server may check its
+ validity by looking up the password that corresponds to the submitted
+ username. Then, the server must perform the same digest operation
+ (e.g., MD5) performed by the client, and compare the result to the
+ given request-digest value.
+
+ Note that the HTTP server does not actually need to know the user's
+ cleartext password. As long as H(A1) is available to the server, the
+ validity of an Authorization header may be verified.
+
+ The client response to a WWW-Authenticate challenge for a protection
+ space starts an authentication session with that protection space.
+ The authentication session lasts until the client receives another
+ WWW-Authenticate challenge from any server in the protection space. A
+ client should remember the username, password, nonce, nonce count and
+ opaque values associated with an authentication session to use to
+ construct the Authorization header in future requests within that
+ protection space. The Authorization header may be included
+ preemptively; doing so improves server efficiency and avoids extra
+ round trips for authentication challenges. The server may choose to
+ accept the old Authorization header information, even though the
+ nonce value included might not be fresh. Alternatively, the server
+ may return a 401 response with a new nonce value, causing the client
+ to retry the request; by specifying stale=TRUE with this response,
+ the server tells the client to retry with the new nonce, but without
+ prompting for a new username and password.
+
+ Because the client is required to return the value of the opaque
+ directive given to it by the server for the duration of a session,
+ the opaque data may be used to transport authentication session state
+ information. (Note that any such use can also be accomplished more
+ easily and safely by including the state in the nonce.) For example,
+ a server could be responsible for authenticating content that
+ actually sits on another server. It would achieve this by having the
+ first 401 response include a domain directive whose value includes a
+ URI on the second server, and an opaque directive whose value
+
+
+
+Franks, et al. Standards Track [Page 17]
+
+RFC 2617 HTTP Authentication June 1999
+
+
+ contains the state information. The client will retry the request, at
+ which time the server might respond with a 301/302 redirection,
+ pointing to the URI on the second server. The client will follow the
+ redirection, and pass an Authorization header , including the
+ <opaque> data.
+
+ As with the basic scheme, proxies must be completely transparent in
+ the Digest access authentication scheme. That is, they must forward
+ the WWW-Authenticate, Authentication-Info and Authorization headers
+ untouched. If a proxy wants to authenticate a client before a request
+ is forwarded to the server, it can be done using the Proxy-
+ Authenticate and Proxy-Authorization headers described in section 3.6
+ below.
+
+3.4 Security Protocol Negotiation
+
+ It is useful for a server to be able to know which security schemes a
+ client is capable of handling.
+
+ It is possible that a server may want to require Digest as its
+ authentication method, even if the server does not know that the
+ client supports it. A client is encouraged to fail gracefully if the
+ server specifies only authentication schemes it cannot handle.
+
+3.5 Example
+
+ The following example assumes that an access-protected document is
+ being requested from the server via a GET request. The URI of the
+ document is "http://www.nowhere.org/dir/index.html". Both client and
+ server know that the username for this document is "Mufasa", and the
+ password is "Circle Of Life" (with one space between each of the
+ three words).
+
+ The first time the client requests the document, no Authorization
+ header is sent, so the server responds with:
+
+ HTTP/1.1 401 Unauthorized
+ WWW-Authenticate: Digest
+ realm="testrealm@host.com",
+ qop="auth,auth-int",
+ nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093",
+ opaque="5ccc069c403ebaf9f0171e9517f40e41"
+
+ The client may prompt the user for the username and password, after
+ which it will respond with a new request, including the following
+ Authorization header:
+
+
+
+
+
+Franks, et al. Standards Track [Page 18]
+
+RFC 2617 HTTP Authentication June 1999
+
+
+ Authorization: Digest username="Mufasa",
+ realm="testrealm@host.com",
+ nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093",
+ uri="/dir/index.html",
+ qop=auth,
+ nc=00000001,
+ cnonce="0a4f113b",
+ response="6629fae49393a05397450978507c4ef1",
+ opaque="5ccc069c403ebaf9f0171e9517f40e41"
+
+3.6 Proxy-Authentication and Proxy-Authorization
+
+ The digest authentication scheme may also be used for authenticating
+ users to proxies, proxies to proxies, or proxies to origin servers by
+ use of the Proxy-Authenticate and Proxy-Authorization headers. These
+ headers are instances of the Proxy-Authenticate and Proxy-
+ Authorization headers specified in sections 10.33 and 10.34 of the
+ HTTP/1.1 specification [2] and their behavior is subject to
+ restrictions described there. The transactions for proxy
+ authentication are very similar to those already described. Upon
+ receiving a request which requires authentication, the proxy/server
+ must issue the "407 Proxy Authentication Required" response with a
+ "Proxy-Authenticate" header. The digest-challenge used in the
+ Proxy-Authenticate header is the same as that for the WWW-
+ Authenticate header as defined above in section 3.2.1.
+
+ The client/proxy must then re-issue the request with a Proxy-
+ Authorization header, with directives as specified for the
+ Authorization header in section 3.2.2 above.
+
+ On subsequent responses, the server sends Proxy-Authentication-Info
+ with directives the same as those for the Authentication-Info header
+ field.
+
+ Note that in principle a client could be asked to authenticate itself
+ to both a proxy and an end-server, but never in the same response.
+
+4 Security Considerations
+
+4.1 Authentication of Clients using Basic Authentication
+
+ The Basic authentication scheme is not a secure method of user
+ authentication, nor does it in any way protect the entity, which is
+ transmitted in cleartext across the physical network used as the
+ carrier. HTTP does not prevent additional authentication schemes and
+ encryption mechanisms from being employed to increase security or the
+ addition of enhancements (such as schemes to use one-time passwords)
+ to Basic authentication.
+
+
+
+Franks, et al. Standards Track [Page 19]
+
+RFC 2617 HTTP Authentication June 1999
+
+
+ The most serious flaw in Basic authentication is that it results in
+ the essentially cleartext transmission of the user's password over
+ the physical network. It is this problem which Digest Authentication
+ attempts to address.
+
+ Because Basic authentication involves the cleartext transmission of
+ passwords it SHOULD NOT be used (without enhancements) to protect
+ sensitive or valuable information.
+
+ A common use of Basic authentication is for identification purposes
+ -- requiring the user to provide a user name and password as a means
+ of identification, for example, for purposes of gathering accurate
+ usage statistics on a server. When used in this way it is tempting to
+ think that there is no danger in its use if illicit access to the
+ protected documents is not a major concern. This is only correct if
+ the server issues both user name and password to the users and in
+ particular does not allow the user to choose his or her own password.
+ The danger arises because naive users frequently reuse a single
+ password to avoid the task of maintaining multiple passwords.
+
+ If a server permits users to select their own passwords, then the
+ threat is not only unauthorized access to documents on the server but
+ also unauthorized access to any other resources on other systems that
+ the user protects with the same password. Furthermore, in the
+ server's password database, many of the passwords may also be users'
+ passwords for other sites. The owner or administrator of such a
+ system could therefore expose all users of the system to the risk of
+ unauthorized access to all those sites if this information is not
+ maintained in a secure fashion.
+
+ Basic Authentication is also vulnerable to spoofing by counterfeit
+ servers. If a user can be led to believe that he is connecting to a
+ host containing information protected by Basic authentication when,
+ in fact, he is connecting to a hostile server or gateway, then the
+ attacker can request a password, store it for later use, and feign an
+ error. This type of attack is not possible with Digest
+ Authentication. Server implementers SHOULD guard against the
+ possibility of this sort of counterfeiting by gateways or CGI
+ scripts. In particular it is very dangerous for a server to simply
+ turn over a connection to a gateway. That gateway can then use the
+ persistent connection mechanism to engage in multiple transactions
+ with the client while impersonating the original server in a way that
+ is not detectable by the client.
+
+4.2 Authentication of Clients using Digest Authentication
+
+ Digest Authentication does not provide a strong authentication
+ mechanism, when compared to public key based mechanisms, for example.
+
+
+
+Franks, et al. Standards Track [Page 20]
+
+RFC 2617 HTTP Authentication June 1999
+
+
+ However, it is significantly stronger than (e.g.) CRAM-MD5, which has
+ been proposed for use with LDAP [10], POP and IMAP (see RFC 2195
+ [9]). It is intended to replace the much weaker and even more
+ dangerous Basic mechanism.
+
+ Digest Authentication offers no confidentiality protection beyond
+ protecting the actual password. All of the rest of the request and
+ response are available to an eavesdropper.
+
+ Digest Authentication offers only limited integrity protection for
+ the messages in either direction. If qop=auth-int mechanism is used,
+ those parts of the message used in the calculation of the WWW-
+ Authenticate and Authorization header field response directive values
+ (see section 3.2 above) are protected. Most header fields and their
+ values could be modified as a part of a man-in-the-middle attack.
+
+ Many needs for secure HTTP transactions cannot be met by Digest
+ Authentication. For those needs TLS or SHTTP are more appropriate
+ protocols. In particular Digest authentication cannot be used for any
+ transaction requiring confidentiality protection. Nevertheless many
+ functions remain for which Digest authentication is both useful and
+ appropriate. Any service in present use that uses Basic should be
+ switched to Digest as soon as practical.
+
+4.3 Limited Use Nonce Values
+
+ The Digest scheme uses a server-specified nonce to seed the
+ generation of the request-digest value (as specified in section
+ 3.2.2.1 above). As shown in the example nonce in section 3.2.1, the
+ server is free to construct the nonce such that it may only be used
+ from a particular client, for a particular resource, for a limited
+ period of time or number of uses, or any other restrictions. Doing
+ so strengthens the protection provided against, for example, replay
+ attacks (see 4.5). However, it should be noted that the method
+ chosen for generating and checking the nonce also has performance and
+ resource implications. For example, a server may choose to allow
+ each nonce value to be used only once by maintaining a record of
+ whether or not each recently issued nonce has been returned and
+ sending a next-nonce directive in the Authentication-Info header
+ field of every response. This protects against even an immediate
+ replay attack, but has a high cost checking nonce values, and perhaps
+ more important will cause authentication failures for any pipelined
+ requests (presumably returning a stale nonce indication). Similarly,
+ incorporating a request-specific element such as the Etag value for a
+ resource limits the use of the nonce to that version of the resource
+ and also defeats pipelining. Thus it may be useful to do so for
+ methods with side effects but have unacceptable performance for those
+ that do not.
+
+
+
+Franks, et al. Standards Track [Page 21]
+
+RFC 2617 HTTP Authentication June 1999
+
+
+4.4 Comparison of Digest with Basic Authentication
+
+ Both Digest and Basic Authentication are very much on the weak end of
+ the security strength spectrum. But a comparison between the two
+ points out the utility, even necessity, of replacing Basic by Digest.
+
+ The greatest threat to the type of transactions for which these
+ protocols are used is network snooping. This kind of transaction
+ might involve, for example, online access to a database whose use is
+ restricted to paying subscribers. With Basic authentication an
+ eavesdropper can obtain the password of the user. This not only
+ permits him to access anything in the database, but, often worse,
+ will permit access to anything else the user protects with the same
+ password.
+
+ By contrast, with Digest Authentication the eavesdropper only gets
+ access to the transaction in question and not to the user's password.
+ The information gained by the eavesdropper would permit a replay
+ attack, but only with a request for the same document, and even that
+ may be limited by the server's choice of nonce.
+
+4.5 Replay Attacks
+
+ A replay attack against Digest authentication would usually be
+ pointless for a simple GET request since an eavesdropper would
+ already have seen the only document he could obtain with a replay.
+ This is because the URI of the requested document is digested in the
+ client request and the server will only deliver that document. By
+ contrast under Basic Authentication once the eavesdropper has the
+ user's password, any document protected by that password is open to
+ him.
+
+ Thus, for some purposes, it is necessary to protect against replay
+ attacks. A good Digest implementation can do this in various ways.
+ The server created "nonce" value is implementation dependent, but if
+ it contains a digest of the client IP, a time-stamp, the resource
+ ETag, and a private server key (as recommended above) then a replay
+ attack is not simple. An attacker must convince the server that the
+ request is coming from a false IP address and must cause the server
+ to deliver the document to an IP address different from the address
+ to which it believes it is sending the document. An attack can only
+ succeed in the period before the time-stamp expires. Digesting the
+ client IP and time-stamp in the nonce permits an implementation which
+ does not maintain state between transactions.
+
+ For applications where no possibility of replay attack can be
+ tolerated the server can use one-time nonce values which will not be
+ honored for a second use. This requires the overhead of the server
+
+
+
+Franks, et al. Standards Track [Page 22]
+
+RFC 2617 HTTP Authentication June 1999
+
+
+ remembering which nonce values have been used until the nonce time-
+ stamp (and hence the digest built with it) has expired, but it
+ effectively protects against replay attacks.
+
+ An implementation must give special attention to the possibility of
+ replay attacks with POST and PUT requests. Unless the server employs
+ one-time or otherwise limited-use nonces and/or insists on the use of
+ the integrity protection of qop=auth-int, an attacker could replay
+ valid credentials from a successful request with counterfeit form
+ data or other message body. Even with the use of integrity protection
+ most metadata in header fields is not protected. Proper nonce
+ generation and checking provides some protection against replay of
+ previously used valid credentials, but see 4.8.
+
+4.6 Weakness Created by Multiple Authentication Schemes
+
+ An HTTP/1.1 server may return multiple challenges with a 401
+ (Authenticate) response, and each challenge may use a different
+ auth-scheme. A user agent MUST choose to use the strongest auth-
+ scheme it understands and request credentials from the user based
+ upon that challenge.
+
+ Note that many browsers will only recognize Basic and will require
+ that it be the first auth-scheme presented. Servers should only
+ include Basic if it is minimally acceptable.
+
+ When the server offers choices of authentication schemes using the
+ WWW-Authenticate header, the strength of the resulting authentication
+ is only as good as that of the of the weakest of the authentication
+ schemes. See section 4.8 below for discussion of particular attack
+ scenarios that exploit multiple authentication schemes.
+
+4.7 Online dictionary attacks
+
+ If the attacker can eavesdrop, then it can test any overheard
+ nonce/response pairs against a list of common words. Such a list is
+ usually much smaller than the total number of possible passwords. The
+ cost of computing the response for each password on the list is paid
+ once for each challenge.
+
+ The server can mitigate this attack by not allowing users to select
+ passwords that are in a dictionary.
+
+
+
+
+
+
+
+
+
+Franks, et al. Standards Track [Page 23]
+
+RFC 2617 HTTP Authentication June 1999
+
+
+4.8 Man in the Middle
+
+ Both Basic and Digest authentication are vulnerable to "man in the
+ middle" (MITM) attacks, for example, from a hostile or compromised
+ proxy. Clearly, this would present all the problems of eavesdropping.
+ But it also offers some additional opportunities to the attacker.
+
+ A possible man-in-the-middle attack would be to add a weak
+ authentication scheme to the set of choices, hoping that the client
+ will use one that exposes the user's credentials (e.g. password). For
+ this reason, the client should always use the strongest scheme that
+ it understands from the choices offered.
+
+ An even better MITM attack would be to remove all offered choices,
+ replacing them with a challenge that requests only Basic
+ authentication, then uses the cleartext credentials from the Basic
+ authentication to authenticate to the origin server using the
+ stronger scheme it requested. A particularly insidious way to mount
+ such a MITM attack would be to offer a "free" proxy caching service
+ to gullible users.
+
+ User agents should consider measures such as presenting a visual
+ indication at the time of the credentials request of what
+ authentication scheme is to be used, or remembering the strongest
+ authentication scheme ever requested by a server and produce a
+ warning message before using a weaker one. It might also be a good
+ idea for the user agent to be configured to demand Digest
+ authentication in general, or from specific sites.
+
+ Or, a hostile proxy might spoof the client into making a request the
+ attacker wanted rather than one the client wanted. Of course, this is
+ still much harder than a comparable attack against Basic
+ Authentication.
+
+4.9 Chosen plaintext attacks
+
+ With Digest authentication, a MITM or a malicious server can
+ arbitrarily choose the nonce that the client will use to compute the
+ response. This is called a "chosen plaintext" attack. The ability to
+ choose the nonce is known to make cryptanalysis much easier [8].
+
+ However, no way to analyze the MD5 one-way function used by Digest
+ using chosen plaintext is currently known.
+
+ The countermeasure against this attack is for clients to be
+ configured to require the use of the optional "cnonce" directive;
+ this allows the client to vary the input to the hash in a way not
+ chosen by the attacker.
+
+
+
+Franks, et al. Standards Track [Page 24]
+
+RFC 2617 HTTP Authentication June 1999
+
+
+4.10 Precomputed dictionary attacks
+
+ With Digest authentication, if the attacker can execute a chosen
+ plaintext attack, the attacker can precompute the response for many
+ common words to a nonce of its choice, and store a dictionary of
+ (response, password) pairs. Such precomputation can often be done in
+ parallel on many machines. It can then use the chosen plaintext
+ attack to acquire a response corresponding to that challenge, and
+ just look up the password in the dictionary. Even if most passwords
+ are not in the dictionary, some might be. Since the attacker gets to
+ pick the challenge, the cost of computing the response for each
+ password on the list can be amortized over finding many passwords. A
+ dictionary with 100 million password/response pairs would take about
+ 3.2 gigabytes of disk storage.
+
+ The countermeasure against this attack is to for clients to be
+ configured to require the use of the optional "cnonce" directive.
+
+4.11 Batch brute force attacks
+
+ With Digest authentication, a MITM can execute a chosen plaintext
+ attack, and can gather responses from many users to the same nonce.
+ It can then find all the passwords within any subset of password
+ space that would generate one of the nonce/response pairs in a single
+ pass over that space. It also reduces the time to find the first
+ password by a factor equal to the number of nonce/response pairs
+ gathered. This search of the password space can often be done in
+ parallel on many machines, and even a single machine can search large
+ subsets of the password space very quickly -- reports exist of
+ searching all passwords with six or fewer letters in a few hours.
+
+ The countermeasure against this attack is to for clients to be
+ configured to require the use of the optional "cnonce" directive.
+
+4.12 Spoofing by Counterfeit Servers
+
+ Basic Authentication is vulnerable to spoofing by counterfeit
+ servers. If a user can be led to believe that she is connecting to a
+ host containing information protected by a password she knows, when
+ in fact she is connecting to a hostile server, then the hostile
+ server can request a password, store it away for later use, and feign
+ an error. This type of attack is more difficult with Digest
+ Authentication -- but the client must know to demand that Digest
+ authentication be used, perhaps using some of the techniques
+ described above to counter "man-in-the-middle" attacks. Again, the
+ user can be helped in detecting this attack by a visual indication of
+ the authentication mechanism in use with appropriate guidance in
+ interpreting the implications of each scheme.
+
+
+
+Franks, et al. Standards Track [Page 25]
+
+RFC 2617 HTTP Authentication June 1999
+
+
+4.13 Storing passwords
+
+ Digest authentication requires that the authenticating agent (usually
+ the server) store some data derived from the user's name and password
+ in a "password file" associated with a given realm. Normally this
+ might contain pairs consisting of username and H(A1), where H(A1) is
+ the digested value of the username, realm, and password as described
+ above.
+
+ The security implications of this are that if this password file is
+ compromised, then an attacker gains immediate access to documents on
+ the server using this realm. Unlike, say a standard UNIX password
+ file, this information need not be decrypted in order to access
+ documents in the server realm associated with this file. On the other
+ hand, decryption, or more likely a brute force attack, would be
+ necessary to obtain the user's password. This is the reason that the
+ realm is part of the digested data stored in the password file. It
+ means that if one Digest authentication password file is compromised,
+ it does not automatically compromise others with the same username
+ and password (though it does expose them to brute force attack).
+
+ There are two important security consequences of this. First the
+ password file must be protected as if it contained unencrypted
+ passwords, because for the purpose of accessing documents in its
+ realm, it effectively does.
+
+ A second consequence of this is that the realm string should be
+ unique among all realms which any single user is likely to use. In
+ particular a realm string should include the name of the host doing
+ the authentication. The inability of the client to authenticate the
+ server is a weakness of Digest Authentication.
+
+4.14 Summary
+
+ By modern cryptographic standards Digest Authentication is weak. But
+ for a large range of purposes it is valuable as a replacement for
+ Basic Authentication. It remedies some, but not all, weaknesses of
+ Basic Authentication. Its strength may vary depending on the
+ implementation. In particular the structure of the nonce (which is
+ dependent on the server implementation) may affect the ease of
+ mounting a replay attack. A range of server options is appropriate
+ since, for example, some implementations may be willing to accept the
+ server overhead of one-time nonces or digests to eliminate the
+ possibility of replay. Others may satisfied with a nonce like the one
+ recommended above restricted to a single IP address and a single ETag
+ or with a limited lifetime.
+
+
+
+
+
+Franks, et al. Standards Track [Page 26]
+
+RFC 2617 HTTP Authentication June 1999
+
+
+ The bottom line is that *any* compliant implementation will be
+ relatively weak by cryptographic standards, but *any* compliant
+ implementation will be far superior to Basic Authentication.
+
+5 Sample implementation
+
+ The following code implements the calculations of H(A1), H(A2),
+ request-digest and response-digest, and a test program which computes
+ the values used in the example of section 3.5. It uses the MD5
+ implementation from RFC 1321.
+
+ File "digcalc.h":
+
+#define HASHLEN 16
+typedef char HASH[HASHLEN];
+#define HASHHEXLEN 32
+typedef char HASHHEX[HASHHEXLEN+1];
+#define IN
+#define OUT
+
+/* calculate H(A1) as per HTTP Digest spec */
+void DigestCalcHA1(
+ IN char * pszAlg,
+ IN char * pszUserName,
+ IN char * pszRealm,
+ IN char * pszPassword,
+ IN char * pszNonce,
+ IN char * pszCNonce,
+ OUT HASHHEX SessionKey
+ );
+
+/* calculate request-digest/response-digest as per HTTP Digest spec */
+void DigestCalcResponse(
+ IN HASHHEX HA1, /* H(A1) */
+ IN char * pszNonce, /* nonce from server */
+ IN char * pszNonceCount, /* 8 hex digits */
+ IN char * pszCNonce, /* client nonce */
+ IN char * pszQop, /* qop-value: "", "auth", "auth-int" */
+ IN char * pszMethod, /* method from the request */
+ IN char * pszDigestUri, /* requested URL */
+ IN HASHHEX HEntity, /* H(entity body) if qop="auth-int" */
+ OUT HASHHEX Response /* request-digest or response-digest */
+ );
+
+File "digcalc.c":
+
+#include <global.h>
+#include <md5.h>
+
+
+
+Franks, et al. Standards Track [Page 27]
+
+RFC 2617 HTTP Authentication June 1999
+
+
+#include <string.h>
+#include "digcalc.h"
+
+void CvtHex(
+ IN HASH Bin,
+ OUT HASHHEX Hex
+ )
+{
+ unsigned short i;
+ unsigned char j;
+
+ for (i = 0; i < HASHLEN; i++) {
+ j = (Bin[i] >> 4) & 0xf;
+ if (j <= 9)
+ Hex[i*2] = (j + '0');
+ else
+ Hex[i*2] = (j + 'a' - 10);
+ j = Bin[i] & 0xf;
+ if (j <= 9)
+ Hex[i*2+1] = (j + '0');
+ else
+ Hex[i*2+1] = (j + 'a' - 10);
+ };
+ Hex[HASHHEXLEN] = '\0';
+};
+
+/* calculate H(A1) as per spec */
+void DigestCalcHA1(
+ IN char * pszAlg,
+ IN char * pszUserName,
+ IN char * pszRealm,
+ IN char * pszPassword,
+ IN char * pszNonce,
+ IN char * pszCNonce,
+ OUT HASHHEX SessionKey
+ )
+{
+ MD5_CTX Md5Ctx;
+ HASH HA1;
+
+ MD5Init(&Md5Ctx);
+ MD5Update(&Md5Ctx, pszUserName, strlen(pszUserName));
+ MD5Update(&Md5Ctx, ":", 1);
+ MD5Update(&Md5Ctx, pszRealm, strlen(pszRealm));
+ MD5Update(&Md5Ctx, ":", 1);
+ MD5Update(&Md5Ctx, pszPassword, strlen(pszPassword));
+ MD5Final(HA1, &Md5Ctx);
+ if (stricmp(pszAlg, "md5-sess") == 0) {
+
+
+
+Franks, et al. Standards Track [Page 28]
+
+RFC 2617 HTTP Authentication June 1999
+
+
+ MD5Init(&Md5Ctx);
+ MD5Update(&Md5Ctx, HA1, HASHLEN);
+ MD5Update(&Md5Ctx, ":", 1);
+ MD5Update(&Md5Ctx, pszNonce, strlen(pszNonce));
+ MD5Update(&Md5Ctx, ":", 1);
+ MD5Update(&Md5Ctx, pszCNonce, strlen(pszCNonce));
+ MD5Final(HA1, &Md5Ctx);
+ };
+ CvtHex(HA1, SessionKey);
+};
+
+/* calculate request-digest/response-digest as per HTTP Digest spec */
+void DigestCalcResponse(
+ IN HASHHEX HA1, /* H(A1) */
+ IN char * pszNonce, /* nonce from server */
+ IN char * pszNonceCount, /* 8 hex digits */
+ IN char * pszCNonce, /* client nonce */
+ IN char * pszQop, /* qop-value: "", "auth", "auth-int" */
+ IN char * pszMethod, /* method from the request */
+ IN char * pszDigestUri, /* requested URL */
+ IN HASHHEX HEntity, /* H(entity body) if qop="auth-int" */
+ OUT HASHHEX Response /* request-digest or response-digest */
+ )
+{
+ MD5_CTX Md5Ctx;
+ HASH HA2;
+ HASH RespHash;
+ HASHHEX HA2Hex;
+
+ // calculate H(A2)
+ MD5Init(&Md5Ctx);
+ MD5Update(&Md5Ctx, pszMethod, strlen(pszMethod));
+ MD5Update(&Md5Ctx, ":", 1);
+ MD5Update(&Md5Ctx, pszDigestUri, strlen(pszDigestUri));
+ if (stricmp(pszQop, "auth-int") == 0) {
+ MD5Update(&Md5Ctx, ":", 1);
+ MD5Update(&Md5Ctx, HEntity, HASHHEXLEN);
+ };
+ MD5Final(HA2, &Md5Ctx);
+ CvtHex(HA2, HA2Hex);
+
+ // calculate response
+ MD5Init(&Md5Ctx);
+ MD5Update(&Md5Ctx, HA1, HASHHEXLEN);
+ MD5Update(&Md5Ctx, ":", 1);
+ MD5Update(&Md5Ctx, pszNonce, strlen(pszNonce));
+ MD5Update(&Md5Ctx, ":", 1);
+ if (*pszQop) {
+
+
+
+Franks, et al. Standards Track [Page 29]
+
+RFC 2617 HTTP Authentication June 1999
+
+
+ MD5Update(&Md5Ctx, pszNonceCount, strlen(pszNonceCount));
+ MD5Update(&Md5Ctx, ":", 1);
+ MD5Update(&Md5Ctx, pszCNonce, strlen(pszCNonce));
+ MD5Update(&Md5Ctx, ":", 1);
+ MD5Update(&Md5Ctx, pszQop, strlen(pszQop));
+ MD5Update(&Md5Ctx, ":", 1);
+ };
+ MD5Update(&Md5Ctx, HA2Hex, HASHHEXLEN);
+ MD5Final(RespHash, &Md5Ctx);
+ CvtHex(RespHash, Response);
+};
+
+File "digtest.c":
+
+
+#include <stdio.h>
+#include "digcalc.h"
+
+void main(int argc, char ** argv) {
+
+ char * pszNonce = "dcd98b7102dd2f0e8b11d0f600bfb0c093";
+ char * pszCNonce = "0a4f113b";
+ char * pszUser = "Mufasa";
+ char * pszRealm = "testrealm@host.com";
+ char * pszPass = "Circle Of Life";
+ char * pszAlg = "md5";
+ char szNonceCount[9] = "00000001";
+ char * pszMethod = "GET";
+ char * pszQop = "auth";
+ char * pszURI = "/dir/index.html";
+ HASHHEX HA1;
+ HASHHEX HA2 = "";
+ HASHHEX Response;
+
+ DigestCalcHA1(pszAlg, pszUser, pszRealm, pszPass, pszNonce,
+pszCNonce, HA1);
+ DigestCalcResponse(HA1, pszNonce, szNonceCount, pszCNonce, pszQop,
+ pszMethod, pszURI, HA2, Response);
+ printf("Response = %s\n", Response);
+};
+
+
+
+
+
+
+
+
+
+
+
+Franks, et al. Standards Track [Page 30]
+
+RFC 2617 HTTP Authentication June 1999
+
+
+6 Acknowledgments
+
+ Eric W. Sink, of AbiSource, Inc., was one of the original authors
+ before the specification underwent substantial revision.
+
+ In addition to the authors, valuable discussion instrumental in
+ creating this document has come from Peter J. Churchyard, Ned Freed,
+ and David M. Kristol.
+
+ Jim Gettys and Larry Masinter edited this document for update.
+
+7 References
+
+ [1] Berners-Lee, T., Fielding, R. and H. Frystyk, "Hypertext
+ Transfer Protocol -- HTTP/1.0", RFC 1945, May 1996.
+
+ [2] Fielding, R., Gettys, J., Mogul, J., Frysyk, H., Masinter, L.,
+ Leach, P. and T. Berners-Lee, "Hypertext Transfer Protocol --
+ HTTP/1.1", RFC 2616, June 1999.
+
+ [3] Rivest, R., "The MD5 Message-Digest Algorithm", RFC 1321, April
+ 1992.
+
+ [4] Freed, N. and N. Borenstein. "Multipurpose Internet Mail
+ Extensions (MIME) Part One: Format of Internet Message Bodies",
+ RFC 2045, November 1996.
+
+ [5] Dierks, T. and C. Allen "The TLS Protocol, Version 1.0", RFC
+ 2246, January 1999.
+
+ [6] Franks, J., Hallam-Baker, P., Hostetler, J., Leach, P.,
+ Luotonen, A., Sink, E. and L. Stewart, "An Extension to HTTP :
+ Digest Access Authentication", RFC 2069, January 1997.
+
+ [7] Berners Lee, T, Fielding, R. and L. Masinter, "Uniform Resource
+ Identifiers (URI): Generic Syntax", RFC 2396, August 1998.
+
+ [8] Kaliski, B.,Robshaw, M., "Message Authentication with MD5",
+ CryptoBytes, Sping 1995, RSA Inc,
+ (http://www.rsa.com/rsalabs/pubs/cryptobytes/spring95/md5.htm)
+
+ [9] Klensin, J., Catoe, R. and P. Krumviede, "IMAP/POP AUTHorize
+ Extension for Simple Challenge/Response", RFC 2195, September
+ 1997.
+
+ [10] Morgan, B., Alvestrand, H., Hodges, J., Wahl, M.,
+ "Authentication Methods for LDAP", Work in Progress.
+
+
+
+
+Franks, et al. Standards Track [Page 31]
+
+RFC 2617 HTTP Authentication June 1999
+
+
+8 Authors' Addresses
+
+ John Franks
+ Professor of Mathematics
+ Department of Mathematics
+ Northwestern University
+ Evanston, IL 60208-2730, USA
+
+ EMail: john@math.nwu.edu
+
+
+ Phillip M. Hallam-Baker
+ Principal Consultant
+ Verisign Inc.
+ 301 Edgewater Place
+ Suite 210
+ Wakefield MA 01880, USA
+
+ EMail: pbaker@verisign.com
+
+
+ Jeffery L. Hostetler
+ Software Craftsman
+ AbiSource, Inc.
+ 6 Dunlap Court
+ Savoy, IL 61874
+
+ EMail: jeff@AbiSource.com
+
+
+ Scott D. Lawrence
+ Agranat Systems, Inc.
+ 5 Clocktower Place, Suite 400
+ Maynard, MA 01754, USA
+
+ EMail: lawrence@agranat.com
+
+
+ Paul J. Leach
+ Microsoft Corporation
+ 1 Microsoft Way
+ Redmond, WA 98052, USA
+
+ EMail: paulle@microsoft.com
+
+
+
+
+
+
+
+Franks, et al. Standards Track [Page 32]
+
+RFC 2617 HTTP Authentication June 1999
+
+
+ Ari Luotonen
+ Member of Technical Staff
+ Netscape Communications Corporation
+ 501 East Middlefield Road
+ Mountain View, CA 94043, USA
+
+
+ Lawrence C. Stewart
+ Open Market, Inc.
+ 215 First Street
+ Cambridge, MA 02142, USA
+
+ EMail: stewart@OpenMarket.com
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Franks, et al. Standards Track [Page 33]
+
+RFC 2617 HTTP Authentication June 1999
+
+
+9. Full Copyright Statement
+
+ Copyright (C) The Internet Society (1999). All Rights Reserved.
+
+ This document and translations of it may be copied and furnished to
+ others, and derivative works that comment on or otherwise explain it
+ or assist in its implementation may be prepared, copied, published
+ and distributed, in whole or in part, without restriction of any
+ kind, provided that the above copyright notice and this paragraph are
+ included on all such copies and derivative works. However, this
+ document itself may not be modified in any way, such as by removing
+ the copyright notice or references to the Internet Society or other
+ Internet organizations, except as needed for the purpose of
+ developing Internet standards in which case the procedures for
+ copyrights defined in the Internet Standards process must be
+ followed, or as required to translate it into languages other than
+ English.
+
+ The limited permissions granted above are perpetual and will not be
+ revoked by the Internet Society or its successors or assigns.
+
+ This document and the information contained herein is provided on an
+ "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING
+ TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING
+ BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION
+ HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF
+ MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+
+Acknowledgement
+
+ Funding for the RFC Editor function is currently provided by the
+ Internet Society.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Franks, et al. Standards Track [Page 34]
+
diff --git a/vendor/sabre/dav/docs/rfc3253.pdf b/vendor/sabre/dav/docs/rfc3253.pdf
new file mode 100644
index 000000000..4f4b3e6b7
--- /dev/null
+++ b/vendor/sabre/dav/docs/rfc3253.pdf
@@ -0,0 +1,10329 @@
+%PDF-1.3
+%ª«¬­
+4 0 obj
+<< /Type /Info
+/Producer (FOP 0.20.5) >>
+endobj
+5 0 obj
+<< /Length 1433 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm;968iG&AJ$Cn7^,n1r6YIF(2%A=skA\8If_M0F:=<Oou/C<odWFKc\0!U*S'liu-SOpOR6)hZE8(Zc`l97fkpEMWrgZ:O*_#ZSUSEn3ai>KY<=t50:I3nU@!XApPW]h\Y/(0JW.]hdOLYRGIXDMS=^S'II8L:F8)<q=aFWRPi?DpX:WVm<ArYi8pR/dkdi&el51N68T-e[JJ-cJ[<G!Z5fs]qOVFS>$>-e#;Oa:.bU3TF:o"bhc%d368"Dj#>Ns1b"C?h6IO9b+X22pRuL2Li`2a'f'YLiK"t.p0?khrWrhP@e2:<::FUsa&2-cL60[FAgHE`Z:I6^/1(+.drfbo,NZBJ>dPr7HDL![bJfsH:`d-]Z'/,?.5nmi-53JBZ)6J)4ZIk3=DAWn!?[[='#MNpME[psQ>n[n2a'M@^HU]L.\^_"=+Pc0cI`OX7YKM0k:U7d^inR19aDhos9mgGK6"N"jHh0n:f'K+6COn1FVsCC%4/X<#kf<K%;AAt!(9ai))Hj+cc'=UmWRn4<e^<]nONmm"]^3M,nF6RTMd:G*_Mt>G%l_S&8p-1+LabYHkNL)@CW'W6[f=qLA7ZYVOcAJ>dB5mjS+a0MWad?IEi(N7qu=];1YFObYhr9'dnlNF-\W>4W"1S4T!Mr#9-B&)ja-ab5`Ffn?dqhGf>rSX5[JG1p<'2kJ0EIhAmi]^*TsB6!A)Q579HMdmqP<,_^Cm.3F7.EfWpjl#sPE"G0]:5*N;5W@C.,W0@M@'\REYZ:djf")iD8@N"!'!L1B<,r1UX/94FprF:u&/_-a,K#<lgE./L,"q/&9g$k1C+,^S*2A%T_i;GMrh@JRX>Gm!,0q5:e`MLi>/F@4lY>=q)KUD/+lR[<A?a$s[p*jP8Q-3Od^iuRb79$[&AB@X6RirpKF2(F?-is_WrB8Xgo=+Cfip.gcFr2uWU+Td'!CRCuJT)8h>6=2H`SGe0C:KIm#L`(8!cA+t[M-cJrY'Sc0YBis+YDQ&"MhQ.?[NihIIl1@%X"R-Z)i=T'hJ@D.8*2'Y0ddtEIh]lX-$7/S*o)I+]oHK[@uGKGEVVK)Kk>Zl'M]JN?-Rh<>gYO_A^(ZK+%k)Kg,R1%N]u!0g^lE8,W[9'`Gk#V>bd2b._fUGh+#<5:4sjLCcE^+K]3n&Xsb^*V),SgEOr$Sj>D/GFhoT*3k;iJfg>(@Z#k="T9=A'btGW("HS9D8@R_7:4u*[IfqT5[g(2hQT7Dp^m=8N<FunGepZY!7'B#]W64.Xc:G8CDu5hQgq$Y?fUG`;KNM1m,D^Q:X[a">14iD>Sn4psR"%TeT&AI&43TK1"t[ujSVA!u_c64"ri]1@nCe`+[Bs@(a0\_8a'NC%]N*$rY*mldEf\>3Y*apYb9QU+7pg*Ybq^+Yk%X\P%PXU2b([>$qf?h?S)WdA>5uNq~>
+endstream
+endobj
+6 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 5 0 R
+>>
+endobj
+7 0 obj
+<< /Length 2417 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!$JhfIL2&BE]"=7DU&*'X>.XhHYt3nLuZaA=M&S$ij1;%cY)F1+Zps8F:s?u7G[@9Qq/Tn2]=ljp_/?*Ur-T)JLH)IO>R_=[F0%IVO2!3(Hm&/"S?KLC?)31)<&+3pe+kIGsp(_VkYYKlaop?,;eXQ6Z:?OT+-VLR)R;/I!!$Y'lYeC_[`X7bpY^_%@@?r5Vf[Z\-FH*aT0I'ueN/73;Fm58Al#D,<7n1u^d&0n=a``mP4#J-!#KP]!=#N5t)E%%0rH(r-?pXuSFkc2;oq7Z_(gT)7u=Fs?\a3\)Km.Aa(6=TP=bZJ[;,C[jQd8aKjB#u#PqkJ1T:"&-UJcm?R<r0hC=o'35d%\IU7K$oQU8][Z:+#73q30G(c,*t)>g,U6E:Ul>c&;DfZ:3A6^61qXXnAfcAA4@)KHUgL%-;p/kq7*'OjNiRd8OM:-DkgS:$cg7_l0>WZcoGnNlN.SSZs%NLpjk.Om-ug)]&ol4.+*(Cd=mH<AL];lkj\0D+RttK=rMI!ZPb(aXj<Nfthd]0XGnsI'HisNJn$75^Rnmj84?q"9LZPcPg3"mNU!?10G[;$\\WDcs3ceC1N_&4j6l'#0aS)1L$b,Y*\m:]KOQ^BV<Lh@'=c`+`e=GHR<B5#<9fJm$U+L$IfNOX(3Bs<K^O&aZj_DC*-^+jeD092U>p"F&(eGC9t%r-^*T8rb]2D-(\]E,+iGlc'bS9NYoFSmt$XTHUncXP77C\g7l'^]$EZ[PA.b$APHb%KQ<WMQ2RG[7tt!P@,R$YK3rmKCYGa.nVTUs&Gjs"5^3#]=fgsZG\FJh^L*$#*</0=T.-B.fU&\ND]e6%?`_FcpfS*UH^R(=g!Foi@dA[fdL<,-VsrE#+r3Xp]F9?s+nG4[>;Vcr7<Y/s8_p^7:CkIss0e!Fa[Mr8X0g[$D#>]>01Ap`QW$s:C+Kt0L*,>g(-ZL&&JmVHK,,X(_?WIfZ7$HtCjFV6Vuq6FLq_JSg4t1>l%:cg<J-/3I'Xp7BfE`&L>1)0H#ghiQ!6[uSHnK<\0JOTat0qY<!V"+19&iY]DGKc!tM$D'>niC;kVXp/_q&pEIbup#T2D0oK5A?+qKF[8c"P(3>iHpRH"QVr#,8enOoGC9<$1[mf3ZM4IB7XcN-`C;$9Vec]%3UVDf,W#XIOa`rb(q:pC9K,oq_-IHXqso=9NC>J;^fB<</I+:dB-S;c*t.!?iQ(aAS<mt'o/.SaosI<T;'N.^S?)IB\Z1<c8u&;%DS>C3$4aAlQr0%S;@.Re@Pne9gO0h_952(<uf"/Y:X<1A;a3sUV]*Q\s*l>2s8>n[AU6Sj-(X-^PH>bAMpL\=HB2Mc>DD%cNs2hC2CXR;GA6d%COSojr!%[6)iF9^"`8rn[V*XGTb#pABB"TY+]N7**IgNT!"79C@:5g^M]kH[]92^F,$,gW7sF9[ob/+[40bKA?tq6is4mZSh9n//2&`ZrPG4;:(DSk1!e1nJa$d[=G7eI0ha%81DXiucTKRre+\0:^'#;8<LFH9+Bi8)$U+,qqU*o=u.*+JF)S.#4kco^S?B@TB@)B`&!`U-3m#%/G,hc2o$I;ja<<\K7P1)//XIF+K-$7W([VpkSp<g986l,/;"CDi`p.egNA)3`L77ec+(oH<`[/@Z[h-)]PG+$/9IFGL26R$ZHMkSWHR$<)!"9M@]pP\[)=-#*l9jI/$f*R&^FIBcnggou?(W1.T_R]ZEP_B/V$M@1+1r2/Y6W=3$(9<LnLGmIl9-m.2Y1MK"V3]^[FTB*VeXISLA#_F,L3^\VhXY;;AOm["R-aZ&qWPL=eXaI,_5=fTWmm!"KXc;^#nfb5((/6?kPm1:8kM#>89JEUU/P.Y6t[jhuE(A_VG=$(ljp*mo\0^mZ#F\\S"N^)(%#S%=;Jr0*TR'9s0P@s([?!VBGDFeItNoFY=GsJ(.dj&Ts%+-+g0nkiSq`:D)-?>BjT*`X+GJI<&PkHFQF1W$8Qopj"T[T9snnD2J$[;mr2$4<'>$meg+UD^5`uO/\^Msl/]"+?DHS`ASNlG/Lak.LPfh=mq95u;OQ!W*"I%$`][i7&`]")bE#.f3b%ip%Xg`6PDKGJp-7*JLJl-*3I0-]="`G^tFLaJJ?j2ofgH#RHr632m<:#j$(LM1kX_B=L.NJ%:oSX6?C9"TN!#;"/0;fO&/9])LpL6Xco,L1ibN'J;B]]7>hm>J_(:_IXQ"k6IcD[V4N1@8C&aQS'd1U]adO^D23Eje-QoRVToQ@aid$,m(I%RK8[655;BLoAEYY=Ish;SoDV8l[@)J-t8,34Slia^ke!r*4^V1fX"Bg,lGM>#M0I#So_I3U`b-=MF_DIkDOq?WrFpVBp9s3\40uK=]'HQ28"R_B*E[(.n@!:T$Wi&;tdPro#oKZQ*4UJGK4DF!6n!Zi:'CEAZJ~>
+endstream
+endobj
+8 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 7 0 R
+/Annots 9 0 R
+>>
+endobj
+9 0 obj
+[
+10 0 R
+12 0 R
+14 0 R
+16 0 R
+18 0 R
+20 0 R
+22 0 R
+24 0 R
+26 0 R
+28 0 R
+30 0 R
+32 0 R
+34 0 R
+36 0 R
+38 0 R
+40 0 R
+42 0 R
+44 0 R
+46 0 R
+48 0 R
+50 0 R
+52 0 R
+54 0 R
+56 0 R
+58 0 R
+60 0 R
+62 0 R
+64 0 R
+66 0 R
+68 0 R
+70 0 R
+72 0 R
+74 0 R
+76 0 R
+78 0 R
+80 0 R
+82 0 R
+84 0 R
+86 0 R
+88 0 R
+90 0 R
+92 0 R
+94 0 R
+96 0 R
+98 0 R
+]
+endobj
+10 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 82.0 686.866 136.45 676.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 11 0 R
+/H /I
+>>
+endobj
+12 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 671.056 198.38 661.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 13 0 R
+/H /I
+>>
+endobj
+14 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 655.056 189.78 645.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 15 0 R
+/H /I
+>>
+endobj
+16 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 94.5 639.056 120.05 629.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 17 0 R
+/H /I
+>>
+endobj
+18 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 623.056 159.21 613.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 19 0 R
+/H /I
+>>
+endobj
+20 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 612.056 194.21 602.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 21 0 R
+/H /I
+>>
+endobj
+22 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 601.056 208.09 591.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 23 0 R
+/H /I
+>>
+endobj
+24 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 590.056 211.99 580.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 25 0 R
+/H /I
+>>
+endobj
+26 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 579.056 203.65 569.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 27 0 R
+/H /I
+>>
+endobj
+28 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 568.056 210.86 558.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 29 0 R
+/H /I
+>>
+endobj
+30 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 552.056 362.24 542.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 31 0 R
+/H /I
+>>
+endobj
+32 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 536.056 261.45 526.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 33 0 R
+/H /I
+>>
+endobj
+34 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 525.056 400.83 515.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 35 0 R
+/H /I
+>>
+endobj
+36 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 509.056 300.87 499.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 37 0 R
+/H /I
+>>
+endobj
+38 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 493.056 245.59 483.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 39 0 R
+/H /I
+>>
+endobj
+40 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 472.056 193.66 462.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 41 0 R
+/H /I
+>>
+endobj
+42 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 456.246 203.37 446.246 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 43 0 R
+/H /I
+>>
+endobj
+44 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 440.246 207.27 430.246 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 45 0 R
+/H /I
+>>
+endobj
+46 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 429.246 268.36 419.246 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 47 0 R
+/H /I
+>>
+endobj
+48 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 418.246 276.7 408.246 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 49 0 R
+/H /I
+>>
+endobj
+50 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 107.0 407.246 147.0 397.246 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 51 0 R
+/H /I
+>>
+endobj
+52 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 386.246 187.81 376.246 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 53 0 R
+/H /I
+>>
+endobj
+54 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 370.436 220.04 360.436 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 55 0 R
+/H /I
+>>
+endobj
+56 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 107.0 359.436 168.66 349.436 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 57 0 R
+/H /I
+>>
+endobj
+58 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 107.0 348.436 213.08 338.436 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 59 0 R
+/H /I
+>>
+endobj
+60 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 337.436 265.02 327.436 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 61 0 R
+/H /I
+>>
+endobj
+62 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 326.436 287.23 316.436 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 63 0 R
+/H /I
+>>
+endobj
+64 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 315.436 258.9 305.436 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 65 0 R
+/H /I
+>>
+endobj
+66 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 299.436 255.03 289.436 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 67 0 R
+/H /I
+>>
+endobj
+68 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 288.436 221.68 278.436 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 69 0 R
+/H /I
+>>
+endobj
+70 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 107.0 277.436 181.43 267.436 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 71 0 R
+/H /I
+>>
+endobj
+72 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 261.436 230.58 251.436 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 73 0 R
+/H /I
+>>
+endobj
+74 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 250.436 226.68 240.436 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 75 0 R
+/H /I
+>>
+endobj
+76 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 107.0 239.436 193.08 229.436 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 77 0 R
+/H /I
+>>
+endobj
+78 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 223.436 169.21 213.436 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 79 0 R
+/H /I
+>>
+endobj
+80 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 212.436 239.45 202.436 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 81 0 R
+/H /I
+>>
+endobj
+82 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 201.436 232.8 191.436 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 83 0 R
+/H /I
+>>
+endobj
+84 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 190.436 230.58 180.436 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 85 0 R
+/H /I
+>>
+endobj
+86 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 179.436 232.24 169.436 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 87 0 R
+/H /I
+>>
+endobj
+88 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 163.436 221.99 153.436 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 89 0 R
+/H /I
+>>
+endobj
+90 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 152.436 244.76 142.436 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 91 0 R
+/H /I
+>>
+endobj
+92 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 136.436 166.45 126.436 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 93 0 R
+/H /I
+>>
+endobj
+94 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 120.436 196.42 110.436 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 95 0 R
+/H /I
+>>
+endobj
+96 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 109.436 252.8 99.436 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 97 0 R
+/H /I
+>>
+endobj
+98 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 93.436 214.75 83.436 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 99 0 R
+/H /I
+>>
+endobj
+100 0 obj
+<< /Length 2167 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GauaBhfIL2&BE]"=84M@3P1SfrOTHX-.?+?^_"r>:"'=`gk6!MN,a12It+aYGQkCTU_GgF%JB3rj:Algh6lh*jQu7[ohZKYhW3EokhVjS02t0Wj'8/8#R?04P:,hj3=/*(hKWD?akpaM>JboF82AN7m_,.uL&81TO8*Fs8D\STVT$TGqt8-V(E`ZNI]VPjb[4rG.`q7R]+:iAJg1n!U_sV:IAf#u:_midUfuaf'NV-"A,qk\_Bbn,C7:(6CnAu%A\=u+$qHM^iS^RsEK`N(bBuKZRil/4m3'[9aW]35`!04P6mY0M$AG%PAAJV/9WU^m'2)*c>NA,WkD0f0KlMs-)KE"fip)K<%5&bYiYi=tQWJf`QHY-n0[YijiDes8-;K\RS?O"]+DTmm\sW-H>Coc8R*_q+*YKZ6hF(a<8&UE#&=Fr[lX0B6IJZ.GQtGp-Lbr(.M2E0J+dg\TA;:N"kOdVMoWKPh_un.=K8r2sY]/(r/(B_C[=]4&-hVtD+0E4+$jb5h\n-S?1Fjr^N6\M,6'7#SmGN<Cqd>o>EBnZ1c9Oft"82ANn#B5*)C#9C2N-r27Bs&[^$k\Z$u[Nme\E84?hAkQ?1oou\)Y1WRn#oH!:;a3Zq9Fi7u0&7MKhBg7B!gr02#-?0mV<i,[7<Ji.e`je)uQJA[+Kmc039#l0KhHfP/#.,n0@Mm;8Mtk[11tan.<9cM_Zqp1Su.U]O%CR7et$;+;XGiIe,LVmE+tp]0!-c[=E%8'hkZ:q6e:4k]n$!N0+X)GkXo=U#kmoEm@qbTB%3Fb#I8Fo%V&'AJTn,RB*9eeK\\EO.Gi;F"9k_$4I(#W=)PK&beQ$FWKENK7YT6(*/*6'Z4>gS6:O,)uYrm_5M'2Q5;0!2-nsnqV<fs8VLL?EG"7"J!W`qK6&Xr4]]lqU9PSBB`k+-!:ttGAdof$!#BqZumAs*g3#X>T1;6Kb0huoDr+L)"3Q'qX)hk9\9V($8K&\UL;im_c;\=!3c#W<<h%D]%b$Ko73^6F#@q&GgXP$^p9!BYAuf>)P'[[U&[Dnk6&"bk:?$?D?`37=>P'+MgkV%G))g1KoGGSi16OQOY5H!BPn("WQp#b#*IF-Y5&3nE'GUIH:A/JGA?MA5h>'o&>3IYT^L&uZfRDbNg`+f8=9(^`sdYL6-Z[+8O/d586*t]aL8BhS2:eS@Y/E^gDPHL?VtsirqlLP:U?[$cB-!?F(W"s'e@1j&P&)Z&%-XZY+:Xp["dO,;;"cL6*hOp5g@-<iIG9^)\f<H)/0jl_^h?\8<'4,`CPY*1#"5`AOXSQ/IC!"%P*E:QKH:G:M.Ue!3<JXUh7dr-@o>S&Yrj@ClG$g^m([0mXO,<ZFf^BqQtQd`2&>[=L7+J&IO40;Ajn=!_@Ku#cMGTrV8TDXnfgW"UT/kOS4OG',<uR@Abja5\1sZ5R,-o@6[J/\PuF^9?l716d^JkabGm-]EnrH&D=JF:ij!01,O;t8ieZ[P+o2W(\"_Q.4@9090mVO#dq8YK3@!4LPD7LcQ\q"H/a>PGt;V=XO8XY3g(tmKP'N1Cc"`u\+l)s(]_\3O+=<IZdl)nEZ,4\IE[OU+h$WQN8'.BJVi0b:PP<JFZ7\0.C_4-Wk'/0VN53C:nt=3"JOu0pO&'3cNc;kL_SY;dD.5bAN@50"Z4!*klV`k5+k2SUafQu[LY/G,T*1#XCsoE0CJ[5"XP=\6.`>!q`]gUhZr-p^YA,fKc4H,eK<\IPi_XoK?8@_D95NFV4;>0:P=M1d%N.c>Aah&,%K^$cedEc`GF=d\kVAm2enj_+eg_BhQ4+@YD[hJV_ia*Y@?/)[7mQe#T2+a0'KY^ASNm-'+qq\f.aBpMD24loe=R7("=)I[<=CWP?2G726Q=D5C)'ne&kQ&15O)]/;:C(o_`W#bhkS%hj[cVG<%-c+g+s2%3%UWBF6DU+Wt8RFo`4S_KtJ?&$-+l#T>i,PX\V3@a/digiI42epg78btdno=f;)t3Afe0&X"a6`0h%0XEJ-7073@\&kklj`h@,iM3PW'b'\JA^T7AZ:R8uQ[J<DbVrXn1=P-JR>WIhE[Gl$!:qm$d+Z:.U!Cbb`fo+qUl&T!M@lReZf,/Lm:Xg;$np!0QZPclj,`AR]AS]=H$\T5Nq<(V&&&(h^S`T;neO'+rZi:&qp;6G~>
+endstream
+endobj
+101 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 100 0 R
+/Annots 102 0 R
+>>
+endobj
+102 0 obj
+[
+103 0 R
+105 0 R
+107 0 R
+109 0 R
+111 0 R
+113 0 R
+115 0 R
+117 0 R
+119 0 R
+121 0 R
+123 0 R
+125 0 R
+127 0 R
+129 0 R
+131 0 R
+133 0 R
+135 0 R
+137 0 R
+139 0 R
+141 0 R
+143 0 R
+145 0 R
+147 0 R
+149 0 R
+151 0 R
+153 0 R
+155 0 R
+157 0 R
+159 0 R
+161 0 R
+163 0 R
+165 0 R
+167 0 R
+169 0 R
+171 0 R
+173 0 R
+175 0 R
+177 0 R
+179 0 R
+181 0 R
+183 0 R
+185 0 R
+187 0 R
+189 0 R
+]
+endobj
+103 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 719.0 241.41 709.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 104 0 R
+/H /I
+>>
+endobj
+105 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 703.0 225.61 693.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 106 0 R
+/H /I
+>>
+endobj
+107 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 687.0 207.28 677.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 108 0 R
+/H /I
+>>
+endobj
+109 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 671.0 236.73 661.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 110 0 R
+/H /I
+>>
+endobj
+111 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 655.0 246.18 645.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 112 0 R
+/H /I
+>>
+endobj
+113 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 639.0 226.16 629.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 114 0 R
+/H /I
+>>
+endobj
+115 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 623.0 215.06 613.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 116 0 R
+/H /I
+>>
+endobj
+117 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 607.0 217.83 597.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 118 0 R
+/H /I
+>>
+endobj
+119 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 591.0 230.05 581.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 120 0 R
+/H /I
+>>
+endobj
+121 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 570.0 242.28 560.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 122 0 R
+/H /I
+>>
+endobj
+123 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 554.19 214.49 544.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 124 0 R
+/H /I
+>>
+endobj
+125 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 107.0 543.19 187.53 533.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 126 0 R
+/H /I
+>>
+endobj
+127 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 107.0 532.19 182.53 522.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 128 0 R
+/H /I
+>>
+endobj
+129 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 516.19 230.58 506.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 130 0 R
+/H /I
+>>
+endobj
+131 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 107.0 505.19 187.53 495.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 132 0 R
+/H /I
+>>
+endobj
+133 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 107.0 494.19 182.53 484.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 134 0 R
+/H /I
+>>
+endobj
+135 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 478.19 350.56 468.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 136 0 R
+/H /I
+>>
+endobj
+137 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 467.19 335.28 457.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 138 0 R
+/H /I
+>>
+endobj
+139 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 451.19 340.56 441.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 140 0 R
+/H /I
+>>
+endobj
+141 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 440.19 195.32 430.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 142 0 R
+/H /I
+>>
+endobj
+143 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 424.19 196.99 414.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 144 0 R
+/H /I
+>>
+endobj
+145 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 413.19 219.76 403.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 146 0 R
+/H /I
+>>
+endobj
+147 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 397.19 225.61 387.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 148 0 R
+/H /I
+>>
+endobj
+149 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 376.19 186.7 366.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 150 0 R
+/H /I
+>>
+endobj
+151 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 360.38 201.71 350.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 152 0 R
+/H /I
+>>
+endobj
+153 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 349.38 221.69 339.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 154 0 R
+/H /I
+>>
+endobj
+155 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 338.38 228.92 328.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 156 0 R
+/H /I
+>>
+endobj
+157 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 322.38 300.31 312.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 158 0 R
+/H /I
+>>
+endobj
+159 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 311.38 240.59 301.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 160 0 R
+/H /I
+>>
+endobj
+161 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 295.38 214.49 285.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 162 0 R
+/H /I
+>>
+endobj
+163 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 284.38 240.59 274.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 164 0 R
+/H /I
+>>
+endobj
+165 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 268.38 216.98 258.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 166 0 R
+/H /I
+>>
+endobj
+167 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 257.38 273.36 247.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 168 0 R
+/H /I
+>>
+endobj
+169 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 241.38 225.61 231.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 170 0 R
+/H /I
+>>
+endobj
+171 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 225.38 221.16 215.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 172 0 R
+/H /I
+>>
+endobj
+173 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 209.38 210.06 199.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 174 0 R
+/H /I
+>>
+endobj
+175 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 193.38 212.83 183.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 176 0 R
+/H /I
+>>
+endobj
+177 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 177.38 277.27 167.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 178 0 R
+/H /I
+>>
+endobj
+179 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 161.38 232.83 151.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 180 0 R
+/H /I
+>>
+endobj
+181 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 140.38 166.15 130.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 182 0 R
+/H /I
+>>
+endobj
+183 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 124.57 182.53 114.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 184 0 R
+/H /I
+>>
+endobj
+185 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 113.57 276.67 103.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 186 0 R
+/H /I
+>>
+endobj
+187 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 97.57 220.04 87.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 188 0 R
+/H /I
+>>
+endobj
+189 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 86.57 220.57 76.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 190 0 R
+/H /I
+>>
+endobj
+191 0 obj
+<< /Length 2112 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GauaA9iL(3&;KZO$6PsVj09k&ZM'T8Yf$$o'ZiUWc-4"f(eBc"at^6h^L'QPi`78Xg=h'>LS7DuNq1QqWn$Y&dF"k5)PAL;K$hJ5'KdG1+Hlb$^p1Pm,9A$MN97sc@ht5ki(#Kto16P;$>G.r$\J:2fP3eo;F>MRH/HBM*"KQX]p#+AWHt2sl`>>7::@F-\&;,V&n(nKrEaNlL`s0>_TN+$q/CVK#mU3YW/V@GG%J@rFT+&=.Qe_:$KBg\78Sf-&^2=C&o1+]/gZcO/;XA'fI;`OVE:2>Ms58Ec71[L_<@VC1TYI&Z[',1VW3r$'M^uJN0o&bBiKqnUXGRH"@V@A:dETr:g7[]Lle8Q1ZEX'A6]J.cmpK\RTYjT>gt@3JB!mXB>(A&W99UO,\5+)l'57OKm$K"H9$%V"Z/,<fDRd4;M^'\(]h=4>/S3J<R,S(=^b_A?u\,-5\#Fhf=N'GlKau6Daq57.n=J^KUa!d56qe)e'W>kTV6F>QNFH>Q`:5^rV1Lm>s).HdREhMp,61k`c$?<q+CVqWZ+b)(!HNImjAmt,a!P6NA^\GH:YJ"&DsC,^?r4b7&+c]_"%:">15%U<I>gWFeMm-B5-n)B/Y7+D+mV3nKAS.0UE!QY"H>17r,n[&e\5sCX57OThr(RY-oiL>lNU0qW;<pl8-B.TOq.RAJgSNX]?icWn%VM91siR"<2?.UXGM&rl!)TB3*4V0C5!-5]`lI'uom$WbbaHdctA1.YlEp:#)6I.'D!jg!%RZi`L&R;!SE_qc.L.EN>X!,,DTAkA"Wp@r42KpV0#.I*(qgRb9bZ((+IQourF?K:QFcYt,uj=&XaWZgQZ<1R3-S768aUX/piB`_4#sZ>l"$XPEq)nt;3aiVYCXKk+VfDTD=7'dGX^K:8k/kMDKI%OiD^+bnJKN91L)r:YNt#dSKr-Qm3Y,_oN2p82Qsj(rR\Q@b(VOW;)fGD,'d4Jp\OUD+hm)\tcbc5,mq9.*k[9/l)C-oRlM_:2ce7*Z^$&a9%.F"sUR<20J(H:1ak)U+(2m\:LH[m:PSfMMOo)`_Abo]uY!o7RG@g=VgaQZT-_QeS_LC2CNe\,F/=`Qaeq1_PS2(dWS4iXMQ:JA1J1k^aWkW71b(0A!1jgbP90cjM*!$cd5h/IjAH[EDq+!ZESk0>5iXr`@]TN$D>\0W6'eAbGG=/Yk*uB^ESF'5]Z$h0DGqYA;%-+[7#G/ZRM<,U(U9n9VdMd#q\RrA&kg/QV$m>:j4R1$HO?&!Jt>C?Po?p]>"LgPcZ^(0SneO^K1"Eh4WuO,ZtWY[\mdl5<oRCu"n#6tIN-#kE"Qo:\hu)okb-pj)[=F<4u@=[ug3*&1tfTi@@:Gi$4`M@;\NLW5JfODXee(U\K#Wpp(SD_RZ]$'6VrSAYDhgR/sp8scQ8CYu9ub"Z&$1.(iWKg^>Q@87ptf6W')Pu$X[Z0]-;9[Wu]C7Wa[fm7*PQ:FPedQiXtK9B`p6.pa,,q/?fAER]K,tsH;VffFEnt?iNDKR8(ndT2P[CR!E!0Gt!"`!aXnBJ2@.^o!2AN%fKX^YubB9hAcg.P>H2F5>eIi,piS&3P&SY+qoZDQmD52PBg'0@-n.a<nhn+\'e.Xp^]UXmI3e<>4o5IX3"e7_)`2hsr=^NVWh]\Ho^htfhgN4?-YpOn>*YsVK,Ol-eFCD&s:CD&tR2*"bHd$BrRHuEFEiSF!?+_%MlI#;a.L_@3t\.&e=k"mj6)"X;\1nZ=2Wmpl.2e$aTE17G+bs=g+0VBdg>?^.PX+jY+!%kZG+k.LmnMqH52lu[OLK4rNe4b"H/-rfLlSYH9NEa8D,i-SGF>8Ni?d:#-O"*X^p4CeT8]-p%_3GOFdcuC@Rb816'dC^'SAT;9W0@B.2fs[or1#t%TG&I]7SJ<e&nGB+:^I=t[@bSV.A1Y_29PL#]f("K#3'o[<.`hGC0"6&M,9$!!QWsde*>s*X:u\.,:ZJk6J*IRhMQ-Cm]PoIfR<Hl*jnre7#5r0Bl[oOI]?_)UWD`(=T5-nq6\W8/=Xt8"-7VW-Ss2=/u"`V:FXmT/CMK_bpQmZUKhE<H4Ao)Ko&?Pj)5$fiRKGhK<"tO;(eY'3r0X_p.`*~>
+endstream
+endobj
+192 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 191 0 R
+/Annots 193 0 R
+>>
+endobj
+193 0 obj
+[
+194 0 R
+196 0 R
+198 0 R
+200 0 R
+202 0 R
+204 0 R
+206 0 R
+208 0 R
+210 0 R
+212 0 R
+214 0 R
+216 0 R
+218 0 R
+220 0 R
+222 0 R
+224 0 R
+226 0 R
+228 0 R
+230 0 R
+232 0 R
+234 0 R
+236 0 R
+238 0 R
+240 0 R
+242 0 R
+244 0 R
+246 0 R
+248 0 R
+250 0 R
+252 0 R
+254 0 R
+256 0 R
+258 0 R
+260 0 R
+262 0 R
+264 0 R
+266 0 R
+268 0 R
+270 0 R
+272 0 R
+274 0 R
+276 0 R
+]
+endobj
+194 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 714.0 205.89 704.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 195 0 R
+/H /I
+>>
+endobj
+196 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 703.0 228.66 693.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 197 0 R
+/H /I
+>>
+endobj
+198 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 687.0 225.61 677.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 199 0 R
+/H /I
+>>
+endobj
+200 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 676.0 193.1 666.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 201 0 R
+/H /I
+>>
+endobj
+202 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 660.0 221.16 650.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 203 0 R
+/H /I
+>>
+endobj
+204 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 644.0 212.83 634.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 205 0 R
+/H /I
+>>
+endobj
+206 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 628.0 277.27 618.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 207 0 R
+/H /I
+>>
+endobj
+208 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 617.0 383.92 607.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 209 0 R
+/H /I
+>>
+endobj
+210 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 596.0 158.93 586.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 211 0 R
+/H /I
+>>
+endobj
+212 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 580.19 167.55 570.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 213 0 R
+/H /I
+>>
+endobj
+214 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 569.19 190.32 559.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 215 0 R
+/H /I
+>>
+endobj
+216 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 553.19 225.61 543.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 217 0 R
+/H /I
+>>
+endobj
+218 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 532.19 142.27 522.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 219 0 R
+/H /I
+>>
+endobj
+220 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 516.38 214.49 506.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 221 0 R
+/H /I
+>>
+endobj
+222 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 505.38 236.68 495.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 223 0 R
+/H /I
+>>
+endobj
+224 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 489.38 160.33 479.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 225 0 R
+/H /I
+>>
+endobj
+226 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 478.38 208.1 468.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 227 0 R
+/H /I
+>>
+endobj
+228 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 462.38 148.64 452.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 229 0 R
+/H /I
+>>
+endobj
+230 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 446.38 225.61 436.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 231 0 R
+/H /I
+>>
+endobj
+232 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 430.38 202.83 420.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 233 0 R
+/H /I
+>>
+endobj
+234 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 414.38 231.73 404.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 235 0 R
+/H /I
+>>
+endobj
+236 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 398.38 210.06 388.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 237 0 R
+/H /I
+>>
+endobj
+238 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 382.38 237.83 372.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 239 0 R
+/H /I
+>>
+endobj
+240 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 366.38 222.83 356.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 241 0 R
+/H /I
+>>
+endobj
+242 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 345.38 198.92 335.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 243 0 R
+/H /I
+>>
+endobj
+244 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 329.57 214.49 319.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 245 0 R
+/H /I
+>>
+endobj
+246 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 107.0 318.57 187.53 308.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 247 0 R
+/H /I
+>>
+endobj
+248 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 107.0 307.57 182.53 297.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 249 0 R
+/H /I
+>>
+endobj
+250 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 291.57 212.81 281.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 251 0 R
+/H /I
+>>
+endobj
+252 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 280.57 225.02 270.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 253 0 R
+/H /I
+>>
+endobj
+254 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 107.0 269.57 187.53 259.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 255 0 R
+/H /I
+>>
+endobj
+256 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 107.0 258.57 182.53 248.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 257 0 R
+/H /I
+>>
+endobj
+258 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 242.57 270.31 232.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 259 0 R
+/H /I
+>>
+endobj
+260 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 231.57 255.03 221.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 261 0 R
+/H /I
+>>
+endobj
+262 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 215.57 300.57 205.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 263 0 R
+/H /I
+>>
+endobj
+264 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 204.57 285.29 194.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 265 0 R
+/H /I
+>>
+endobj
+266 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 188.57 225.61 178.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 267 0 R
+/H /I
+>>
+endobj
+268 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 172.57 210.06 162.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 269 0 R
+/H /I
+>>
+endobj
+270 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 156.57 212.83 146.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 271 0 R
+/H /I
+>>
+endobj
+272 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 135.57 218.66 125.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 273 0 R
+/H /I
+>>
+endobj
+274 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 119.76 226.69 109.76 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 275 0 R
+/H /I
+>>
+endobj
+276 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 103.76 215.03 93.76 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 277 0 R
+/H /I
+>>
+endobj
+278 0 obj
+<< /Length 2227 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!$J?$"IS'Sc)R.t$$qCkO,#_qr!<dTmXBFP=OU%WLARVI[d"3)5$S^QS!&kHqOsZG^'j;9&5kNh<sF3][m,-RUQ"PXg/]H]uc'^3>&n4^\5_SmqPfneklkRk25`Vj*cuT=i9Q-g'<7,((;#cV*`?K-XEW,aV)KT:C0/-HlQe09S<LV9'lSoe7isieL&trf<Cp(E+/FVa?WOn_ukTp`Xf9PU)?;G,1C0'G5makHii(S$,o`U-^j;P"`V;Zb^mQ<B"iZm<Y*o!U8ol]h-XgSnp!_=W!N=^diMK:3$L*!6_lA.Y2!8j._c$d_.\ks815(DQlhjS&nW#!ehmiIrG'3-PSBKdeF@sk"#dA%&%p4XTsiQU6%bOl2#!Z$9WcNa-47b%j@NF35oP5U<Cs/+/<QR>pe6kouu\FT1Fj8IC$bV+VdHU7LBhRjZM%CDY-(uDAFAR$img>Ur?Crm=Zl]hl-)r+*^4L=&rrg$@)emc2s^i05].u@@hk!R<u88D1dpI8S!LkoZS_Z3MOl8.6R\u7*_)"\gC)K'LARZWBu[0$C,VBQ'HW-&YV>4Sa6JJ[^':g4aB3)\ufl*-HgY!c)9.g5L<aK756kI@j=u#WlRe)Tp.1b8-+j4e>q!Od:D;DMM4Gj'XANO"fd)3T[F,TTTX2kJB1o0r](n2H%"dh.U?$X-tZ8J(f^hU>i9"'>S"TBK[s<\jGOs*Go:Oa`I-dU^6(Sc6R;,Q:@hI[KT[D/eLYS@'1@X>43,;L'YR;jXnLLW\6`b2HEg"Q^j,1qkP>'/NK#0R(H"3VpkWgDq$I^$o:hlt;0&3DU!Cl1GGWgodfV3#=8cWd$%4qlV!C_39kGKn/<Bq*',@20a(3)&d$RnqHBeNX\CKnAA6fNAP]ML';2A['%>p^?@.b;p3q#=/XqlUMA"i;Xmbf;d\rZZU'h?+n3RlJc>W15*;2E8p3/=6+=hN-5<(2I1-plgI^h(0CQg'Z9]qf9a#g:mo5kcZI4[00+1DL62ZVs+gM?ZC0_Lrnu/5Tt"D9d71ff;Lk\t`1Ynfp5kr*B!d!AJOu^d+$aepM?C;bnusUSqI.WbCc5Phf2q+^30$%d8kH*m/d8<<1Ulmc3PR^"hshCB,9AFYSi)*%^2$\AgqNKNR$\G#2^*dGO9^lZNrR]?%'V-jk;('J?I(XVl)t6:$9>D;f4QW,&R\+6TV8'/<d0UB_bB$dI9E2&6N5b11BF?7:,FIQMlQqJ%i(Niscgj0oNC?`"XuHMWCoIf52:Z"]Zj",VnNl0K7[C[/r'-"j3W'k%_Dlkg;Wq^%D0]d$?S<c6b+3$k%+&uWk0mR[^fhiqYs>8KcoP0,"978$]cG6n>2$>\a>+eWUdl2D+,0^n;DVfY4>5F5N^Sc[[T$/Nf.7),as)g'g3W$,/_FJZ@-nkmPigdhI.NR['Z+jAce%:/Yj;tP[@+B<eo4"(l<)OpT*K?r^!'pMi_]&W++>Y4/g,uMIl:_gO22o&=i7FHW[V1]"_[I*GQ]87adr@:0aJp'qhk^:uYOsm$52nVdU5ka(o$$ZJBp=VTC"iYIs]="P9K&Y#]rS@.IF6AO\@P\1Bm%+k7A_e5:%&J%!g'T6"Z'L'':LZ/5njs[lLjae')bWU[[@dJ7pRRZn'$3a^XmX@+SY5%K0@q9-fakQ5FV/%Qh%-*sb>b4T>ZbjreSI=8_fojF*mp[2R26E2oFtV)]2t+K5S<ji"YMJmTBloSgJf!aOHsYk%s@]1YnGbuhh6;NX+3c:PX$rb"XG#]-m/&#m.Nadi\NH=;X7W^4@"dmQ7i[#)4e(\X*cE=SNIITp6i/#"*A*1r'74KaIseO+^m;8RP47I"q>s)M#"F(Ig$pebEp&W1eh$(i7ktoq+UZV&k"-]7r0TMFu]:j"t3E^mI*B(XYM:8%6/8=:_H2FBGY2oH&3GE\X+.*e]up^:kqqGbs2[.1RM"h+-K,qFo8&T;8.R:gpVO&kfDrOiM3u8`U!I:EQ$#M:-`FHZs0BK2G"u'lTs`rOcVoOdGN[NWchA.FS$B(kW$lb5it8]J>dB;LC4MJl_t4;,FphpnYpFZL=JNpQjAY>q1@jF-T^>Lq<G]jXjQko=dcnVl<^n')g08n#+/10J^2P-YPI1"qPF#lk53^m+/Zdn=ro=:/s>>e[n6bcb]o8b,?J+^r>BO[GVtE.)>H1T1nK0@3@I%AL/I0*I^kEss&KbF?N0Opq*@K6PCEV;=Q>M~>
+endstream
+endobj
+279 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 278 0 R
+/Annots 280 0 R
+>>
+endobj
+280 0 obj
+[
+281 0 R
+283 0 R
+285 0 R
+287 0 R
+289 0 R
+291 0 R
+293 0 R
+295 0 R
+297 0 R
+299 0 R
+301 0 R
+303 0 R
+305 0 R
+307 0 R
+309 0 R
+311 0 R
+313 0 R
+315 0 R
+317 0 R
+319 0 R
+321 0 R
+323 0 R
+325 0 R
+327 0 R
+329 0 R
+331 0 R
+333 0 R
+335 0 R
+337 0 R
+339 0 R
+341 0 R
+343 0 R
+345 0 R
+347 0 R
+349 0 R
+351 0 R
+353 0 R
+355 0 R
+357 0 R
+359 0 R
+361 0 R
+363 0 R
+365 0 R
+367 0 R
+369 0 R
+]
+endobj
+281 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 709.0 150.58 699.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 282 0 R
+/H /I
+>>
+endobj
+283 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 693.19 280.86 683.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 284 0 R
+/H /I
+>>
+endobj
+285 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 112.0 682.19 175.87 672.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 286 0 R
+/H /I
+>>
+endobj
+287 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 112.0 671.19 196.42 661.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 288 0 R
+/H /I
+>>
+endobj
+289 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 655.19 168.11 645.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 290 0 R
+/H /I
+>>
+endobj
+291 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 644.19 190.88 634.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 292 0 R
+/H /I
+>>
+endobj
+293 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 628.19 214.19 618.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 294 0 R
+/H /I
+>>
+endobj
+295 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 617.19 270.57 607.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 296 0 R
+/H /I
+>>
+endobj
+297 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 601.19 230.61 591.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 298 0 R
+/H /I
+>>
+endobj
+299 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 585.19 226.16 575.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 300 0 R
+/H /I
+>>
+endobj
+301 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 569.19 232.83 559.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 302 0 R
+/H /I
+>>
+endobj
+303 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 548.19 158.38 538.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 304 0 R
+/H /I
+>>
+endobj
+305 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 532.38 278.93 522.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 306 0 R
+/H /I
+>>
+endobj
+307 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 521.38 302.23 511.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 308 0 R
+/H /I
+>>
+endobj
+309 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 505.38 254.48 495.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 310 0 R
+/H /I
+>>
+endobj
+311 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 112.0 494.38 197.54 484.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 312 0 R
+/H /I
+>>
+endobj
+313 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 478.38 176.99 468.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 314 0 R
+/H /I
+>>
+endobj
+315 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 467.38 258.35 457.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 316 0 R
+/H /I
+>>
+endobj
+317 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 456.38 243.91 446.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 318 0 R
+/H /I
+>>
+endobj
+319 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 440.38 225.04 430.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 320 0 R
+/H /I
+>>
+endobj
+321 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 429.38 315.57 419.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 322 0 R
+/H /I
+>>
+endobj
+323 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 413.38 232.81 403.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 324 0 R
+/H /I
+>>
+endobj
+325 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 402.38 318.9 392.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 326 0 R
+/H /I
+>>
+endobj
+327 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 386.38 231.99 376.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 328 0 R
+/H /I
+>>
+endobj
+329 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 375.38 254.76 365.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 330 0 R
+/H /I
+>>
+endobj
+331 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 359.38 224.19 349.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 332 0 R
+/H /I
+>>
+endobj
+333 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 348.38 280.57 338.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 334 0 R
+/H /I
+>>
+endobj
+335 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 332.38 230.61 322.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 336 0 R
+/H /I
+>>
+endobj
+337 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 316.38 224.5 306.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 338 0 R
+/H /I
+>>
+endobj
+339 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 300.38 220.06 290.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 340 0 R
+/H /I
+>>
+endobj
+341 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 284.38 247.83 274.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 342 0 R
+/H /I
+>>
+endobj
+343 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 268.38 237.83 258.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 344 0 R
+/H /I
+>>
+endobj
+345 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 252.38 232.83 242.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 346 0 R
+/H /I
+>>
+endobj
+347 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 236.38 228.39 226.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 348 0 R
+/H /I
+>>
+endobj
+349 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 215.38 156.7 205.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 350 0 R
+/H /I
+>>
+endobj
+351 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 199.57 175.33 189.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 352 0 R
+/H /I
+>>
+endobj
+353 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 188.57 262.25 178.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 354 0 R
+/H /I
+>>
+endobj
+355 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 177.57 268.91 167.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 356 0 R
+/H /I
+>>
+endobj
+357 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 112.0 166.57 194.77 156.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 358 0 R
+/H /I
+>>
+endobj
+359 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 155.57 273.89 145.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 360 0 R
+/H /I
+>>
+endobj
+361 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 139.57 219.49 129.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 362 0 R
+/H /I
+>>
+endobj
+363 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 112.0 128.57 180.88 118.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 364 0 R
+/H /I
+>>
+endobj
+365 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 112.57 280.86 102.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 366 0 R
+/H /I
+>>
+endobj
+367 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 112.0 101.57 180.31 91.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 368 0 R
+/H /I
+>>
+endobj
+369 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 112.0 90.57 180.88 80.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 370 0 R
+/H /I
+>>
+endobj
+371 0 obj
+<< /Length 2195 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!$IhfIL2&BE]"=7DU&*3(;fQ@3Zk+a71\O@^jk:>6#o.)]&g);Ff(rUhP]#-Wiul<T"B4<uoQ>($*[[CbuOe$IYmXG7hWoVN.3:2b-,H]J$?4\k&qmVmi)Dn>4^4NA/HYBlgfe%a5OG;tC=3:M7-CsguT"T`)$d9o/!M`=GJjf;^[Yjt!@n'gVr^()C8>e8&*[E+5-jL[K11Ehu+MD_lAK2Ko0#N]b^Y%P:T`T:Yan2+/O\'`'[m+GYQB"pj*//(V&&#1?J)AbX7\L:-N0LH?#XLk,,l+#MB7t""eJTR9EP+^4QS&'&)SrKWi)VJAPi\?uCi8DC@!S-PKKMrCAEU4ZQU_Mkn)C'#$!P?bRE4'#(V:>g\!5bX[+rG=E<MuL;2.KC?>%/1do'E^dN65_?$k&2M<VBF'\I;FHX]r&*1ZQW!.AC'gfEEGbd3FIG(:^mq,'l@j:N!&ian8q\iD-JkUkg7:e<Y?`k4@Yu[\WiZ#Uua"5g$P\"cQ-N/k0bLdubq)iZldu>]p1K6:G16MAf>P%&+*q:]VdSWiO7c)O,k&eJr`8$J!f05Ko#\=tI]hCFFC38ILuTBFXt[%Gsk99eD2V71;6UFXWNA)>A8G2I#%PiNY!'.BdZ0n^tJ]6,;Aq"X]<p6-RmIH4kD(VqAOLKm?'rf1rJH(be%MYjo,t^t_Oi^upVs0nQDoAd7@3M)coKTR`FbE/ec8[#J>?6%5JP4?]P[(&"kdlLcI\eUKV<_@U^&CortpchC+F<BeqTVFcoHbGCTL5NT)Id'B`G&Jgj0(k\0537E8HR[(O.M9=SH@L#^i!M\Ed<I5-Q)^@1c$4ACU"1@1^ZKIo(d/9Mt)6;i;:#XroAJsQ>>MqcY13XP^11'-A;5uJ06MY^EV5s9d&G&]$N/LNs$2Q[tQ@261Y+@=FT2fbdJ5L*d;HeZA-G@XsMjr`.P)5LnCJHr7[Ddh_E^WhGCV6`+"meiUeb*96C?!clSBU#(Z*1HUQ51,&!LZeTY!,X&s+4odQ*1!R,r#VG:cfs(UZ\WXU!K'7d0=>i".DeY/UlH^3MFhVeUZ"X-_Rgbd#<iYLrul]#E=\Ae=5FXXXu!92iE\]WR^/O!Te8+b-";>NJu!TjQ;(@-^bQ&:NP/'-reeR7oVnZ/Vr/hX.[kHF;COeDHYNON0tF4_Ra$j$6#=7bso0d19UA,PO%J8oih"L=2d&S-_XK34TcoKVF>O;()8ZPL8KmPPaGQsYoH<U9Zbh:\8?9oRQXa<!;\f8-4<X<$f\TX(2.:]p$UsO!)nM(!VP<qoG(n7;_C=UZ690hq&SfDP_lV;CNch*K'FFCPAsKV/.!hKnNW^Rd)\O6O67]cQd,)aF246b(Iho3jf5]:2kGj=T-99FKN]#l70o@;M.i*PI\en:*:2SWoMA4kQV7-b-`[?_(?.p1Dqe0]AZl7U%6!="9GRl!h_Y]c&`1RO".`gi7X(Requu!jltc68@Z3W_Fr^a"1esc=KK3j@>mpGm+jHGlK.%@XY)0G8W/YR,UHlRo-hJ6;!fq@-c`W(Y7Sd+MoJ&ut$ZHA+\^.bR1$%jW,$=G]H:BqJ*ZW!r5"3iVZE'dpd=k,#\5fC:E%B/H`f[6%N4DoNY;tm4dZ[P.N9g_X"8aEb*9?,u@;@/gm0^X>4LcI1b`:WMhm7)tc"M8(it3eBc\PPj>,rdb$!<GVL$Fk>T\A\>W+dDamN[cY(L?&%6Zm7G-tYRC_m1,q6-ZF;.&pAMP<nge8\ZjrHm)N7.?$<NpE<eJl5GODG+#DWN.e-jW*`8h[+7SZ+^f=@*^h?<aOj;/<9>X4pAV4/*#hLDlJU@iN2XnMde7(UQ'C(<Lh:ZXnoU)3Va#s[0[Jd733&0i6]b2K4S7&ZV!Viel191)lA?U@]^:lfaBUmHM.UiQQ:3e!&(B'T)9]#k<0YKS>d%R2p?i]<EB]qK#Q@XaL;8f(.V,[WTT4`7f93N:40-+Xo>sMU%\h[1rsr/);q4F)"j@HeHU=bu!h7(I)fZcO1%j0@E:]#DqG2e0-NMDI\?&MY@(YPRLWsJ-1>sjfALTtX%>*F+TN2bd^)&!8X/o_W(*J>*ir3C@/,`jJM9Ou)YJMgl=fomsbUK:aNpubDE[b%ih\mGYck\7aB6:]-OdtH;+j75HRtKsiV:la)JTD@t1''N;GS;\pA<HCTrVg%tA2HIH(S]fXFo~>
+endstream
+endobj
+372 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 371 0 R
+/Annots 373 0 R
+>>
+endobj
+373 0 obj
+[
+374 0 R
+376 0 R
+378 0 R
+380 0 R
+382 0 R
+384 0 R
+386 0 R
+388 0 R
+390 0 R
+392 0 R
+394 0 R
+396 0 R
+398 0 R
+400 0 R
+402 0 R
+404 0 R
+406 0 R
+408 0 R
+410 0 R
+412 0 R
+414 0 R
+416 0 R
+418 0 R
+420 0 R
+422 0 R
+424 0 R
+426 0 R
+428 0 R
+430 0 R
+432 0 R
+434 0 R
+436 0 R
+438 0 R
+440 0 R
+442 0 R
+444 0 R
+446 0 R
+448 0 R
+450 0 R
+]
+endobj
+374 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 714.0 232.81 704.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 375 0 R
+/H /I
+>>
+endobj
+376 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 112.0 703.0 212.53 693.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 377 0 R
+/H /I
+>>
+endobj
+378 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 687.0 196.43 677.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 379 0 R
+/H /I
+>>
+endobj
+380 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 676.0 219.2 666.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 381 0 R
+/H /I
+>>
+endobj
+382 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 660.0 240.87 650.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 383 0 R
+/H /I
+>>
+endobj
+384 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 644.0 230.61 634.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 385 0 R
+/H /I
+>>
+endobj
+386 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 628.0 226.16 618.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 387 0 R
+/H /I
+>>
+endobj
+388 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 612.0 217.83 602.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 389 0 R
+/H /I
+>>
+endobj
+390 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 596.0 247.83 586.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 391 0 R
+/H /I
+>>
+endobj
+392 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 585.0 280.04 575.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 393 0 R
+/H /I
+>>
+endobj
+394 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 569.0 237.83 559.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 395 0 R
+/H /I
+>>
+endobj
+396 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 553.0 228.39 543.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 397 0 R
+/H /I
+>>
+endobj
+398 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 532.0 252.25 522.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 399 0 R
+/H /I
+>>
+endobj
+400 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 516.19 264.49 506.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 401 0 R
+/H /I
+>>
+endobj
+402 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 505.19 232.25 495.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 403 0 R
+/H /I
+>>
+endobj
+404 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 489.19 218.38 479.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 405 0 R
+/H /I
+>>
+endobj
+406 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 478.19 304.46 468.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 407 0 R
+/H /I
+>>
+endobj
+408 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 462.19 230.61 452.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 409 0 R
+/H /I
+>>
+endobj
+410 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 446.19 226.16 436.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 411 0 R
+/H /I
+>>
+endobj
+412 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 430.19 224.5 420.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 413 0 R
+/H /I
+>>
+endobj
+414 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 414.19 215.06 404.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 415 0 R
+/H /I
+>>
+endobj
+416 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 398.19 217.83 388.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 417 0 R
+/H /I
+>>
+endobj
+418 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 382.19 282.27 372.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 419 0 R
+/H /I
+>>
+endobj
+420 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 366.19 242.83 356.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 421 0 R
+/H /I
+>>
+endobj
+422 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 350.19 237.83 340.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 423 0 R
+/H /I
+>>
+endobj
+424 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 334.19 287.27 324.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 425 0 R
+/H /I
+>>
+endobj
+426 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 313.19 239.51 303.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 427 0 R
+/H /I
+>>
+endobj
+428 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 292.38 189.5 282.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 429 0 R
+/H /I
+>>
+endobj
+430 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 276.57 202.82 266.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 431 0 R
+/H /I
+>>
+endobj
+432 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 260.57 239.45 250.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 433 0 R
+/H /I
+>>
+endobj
+434 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 244.57 211.71 234.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 435 0 R
+/H /I
+>>
+endobj
+436 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 228.57 169.48 218.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 437 0 R
+/H /I
+>>
+endobj
+438 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 207.57 179.5 197.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 439 0 R
+/H /I
+>>
+endobj
+440 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 186.76 176.15 176.76 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 441 0 R
+/H /I
+>>
+endobj
+442 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 87.0 165.95 169.77 155.95 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 443 0 R
+/H /I
+>>
+endobj
+444 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 87.0 145.14 133.64 135.14 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 445 0 R
+/H /I
+>>
+endobj
+446 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 124.33 183.93 114.33 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 447 0 R
+/H /I
+>>
+endobj
+448 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 108.52 382.23 98.52 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 449 0 R
+/H /I
+>>
+endobj
+450 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 92.52 210.87 82.52 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 451 0 R
+/H /I
+>>
+endobj
+452 0 obj
+<< /Length 1220 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!$G?#S1G'Sc)R.rn--;9p>(CgW4="@re$e[QH$A?BR@V+HrJI/J>]YND4_8VFs<GHo<`3OYQoH$u2!bLttdpBX7@>CN&MD_iUZ2LiXYeFX%u&/!c>kM=Cd&A.GGHHWe(EWAQK',>au[dfA4.R8Sh5qd@cKXZm*FLR=+0I\We"m+i^oBS5nor<hrjI!?ES.^AuZSJ6G[;sZ,6"\MB1lJai"c<:Pr]!M(kZ2?,!>42/\c_S%kNO-oBa5\'"esdEECN&kX4CXOP"nu."&sXn.M1+&15\\]XH_(X'JW3R-7dK3+\CGkM(8QT(^UKO23;(c@2MRM%6c.qiFYoKJG-5<).4a[Z3!>D>J5@0lc#?h'@Pcq/Ds'>/,PN>l?hqI1ibSh'*r>-]g!4k/5"=4U?I*ci1P2sV4=1aoPuf%'F8`2)CMJlkKA6Q-:n`e,"`XJ3*b]$(CnHD1W8Y5Va<cQH(#=Hd)653Jj_:A.D`77C%`)aRsk]/l9U?0q9B:telE!=:BFr].`m!-$0^H'N$Tbi?J]^J*T]_YrIU]V2tG\R?b&0Oo8>(Kob2?I]SNOjbc2D$!XkZl'06mG#V2a:n&*1DW]JsP9GV)M3<L3*.OKL=q9[R3?ub%tJmkPUrZ2f?QGTNF$&XN=Ohf+ZDG797aS[)i%%96qXOLHblqsbMFE2W&H2MWaNY1D`47Ip,'BBgBg?JB?e\d/E`]dLr[sUH.MnpVGq^X(^,A'Y-%21*89(?Uf^9UF\YWctR_6AA'-/YHA+Ue;adX@MK3(cqJR&#NoCQa1d`rb@(pL6R]TVQ/]K>i*D$A?*+p,ncG0c)@CX;q81_rq;"5<#g^ZLksg]`f/[eEPH*NL>ueEGO]n3RtU,,H&^(!FA]qi))l6"%<(lih>#%=oPMWf@>1ab/moO0(!UlC,@HWKU\F1Q#L8Nie->i%E.%GHrf_!9iC2tAe/>*62?V=H_%u6+A=>Cm!iToAd]=GW<`mFdn/NX8;.Y2Yi^?X/jWKqX20G%k(8!qd$DjYs)`'G8YijRnd0Ip<ND/WqD%!Ma/F@>CVT*C'N1rVPX"#0G<[s[S<]KjjqKPHNcnmfhd674FAhhp?!i_;T0MZ=QWLY-*l=:)WkA/>0O&D+!>K&/njIO3F&R,1jqd:=mWfVDJKi"Ag930RM52VP-L3?iKB4YjE:m&,7$o`1.d>4H5(jko[[7`.qZ!s+aK+Fh2f=]/k5~>
+endstream
+endobj
+453 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 452 0 R
+/Annots 454 0 R
+>>
+endobj
+454 0 obj
+[
+455 0 R
+457 0 R
+459 0 R
+461 0 R
+463 0 R
+465 0 R
+467 0 R
+469 0 R
+471 0 R
+473 0 R
+475 0 R
+477 0 R
+479 0 R
+481 0 R
+483 0 R
+485 0 R
+487 0 R
+489 0 R
+491 0 R
+]
+endobj
+455 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 714.0 215.33 704.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 456 0 R
+/H /I
+>>
+endobj
+457 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 698.0 184.75 688.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 458 0 R
+/H /I
+>>
+endobj
+459 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 682.0 214.2 672.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 460 0 R
+/H /I
+>>
+endobj
+461 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 96.72 666.0 128.38 656.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 462 0 R
+/H /I
+>>
+endobj
+463 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 650.0 263.35 640.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 464 0 R
+/H /I
+>>
+endobj
+465 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 634.0 189.75 624.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 466 0 R
+/H /I
+>>
+endobj
+467 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 618.0 350.82 608.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 468 0 R
+/H /I
+>>
+endobj
+469 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 602.0 256.67 592.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 470 0 R
+/H /I
+>>
+endobj
+471 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 586.0 235.59 576.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 472 0 R
+/H /I
+>>
+endobj
+473 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 570.0 198.62 560.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 474 0 R
+/H /I
+>>
+endobj
+475 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 554.0 173.66 544.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 476 0 R
+/H /I
+>>
+endobj
+477 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 538.0 348.91 528.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 478 0 R
+/H /I
+>>
+endobj
+479 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 522.0 302.8 512.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 480 0 R
+/H /I
+>>
+endobj
+481 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 506.0 280.03 496.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 482 0 R
+/H /I
+>>
+endobj
+483 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 490.0 178.09 480.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 484 0 R
+/H /I
+>>
+endobj
+485 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 474.0 335.85 464.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 486 0 R
+/H /I
+>>
+endobj
+487 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 453.0 155.61 443.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 488 0 R
+/H /I
+>>
+endobj
+489 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 432.19 275.87 422.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 490 0 R
+/H /I
+>>
+endobj
+491 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 411.38 96.45 401.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 492 0 R
+/H /I
+>>
+endobj
+493 0 obj
+<< /Length 2691 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!#^9lo&Y'#"0DY]Q&/*!?9360'@cG1g)cjd#%?;cXAq?q=$1`*`fPdGA6F4l?RVJJj>?2H<sA3#D^LmPh>]?T7V'ro3+Mkp2'IIkkBFn0b7Q_8M-/Jk6lt>3]a,0MNncc/d&Zi4YZY'`1(q?bW_NP!tjU+fgrn5:5uO^ddi>n95fl2Ta/iaXm/`_^=u_BOI;`m^=QThJRS7qj"&@\QB3!DIVg2Nc(-*rr4o^Y@Z+ol;uQ,'jT]4<YbR%X^o\A-83e_L:/c1;H+Y9MCsA<MjpbSqs-bYdU1je7Ot`W2)"[e:dia18*$ZRe!6k4%SM9T0*#RniULKoqK-!0fD%;L/$k+]Oq&#Zc0(^J%_R<WU1GrMch?dU%A-u[X.65J,BL=\YH9u9e)"`>=T6k<1<Xaq1urji4)d_`p"`@HZ)OSJN0$XfN=QrbNnCbY8#UYW>Es7tTVfuckWoGBiRJ)^-)M1*\7R7O+J'Om/9&R:&(cD75Xt/1^d\K)3M;!<e%cXo:?9^&<+W<LL!(!(j^hZc?`_h61G:portpJF4;J(3kH;fAUQ["&+t*/p\eM^%-V-KOKE*t+1n(3XE3%DRj/6rES&U#u'2q6+%68":-t4%e@Ejm27B=G(-KkV^C>]KJ*kiU:C:NTFfGG2gY4q-]<gIca/6aO4*13L3]0[48=ef9tQ5TgsC%6jbg+i-n837eR1A.d/s)-dlb3s!$j!QuR)d,GBaP!^1fo>AsCpOoMR5r2pWZqNoU#FfR%Z@/_Rt3FV*$L>f\b']H'5,$8D!jf:$p"*-`#fd&VU-P<33J/*YUIoF(#-7a@?/71BkroDC$bpbPkb"^^pl4cUABbU#Ft:/<DqSscuT&(Re8A&9sHr[!5cfP`3\&nYKqGF[X#AGp;+W"MIWQ(!U]r-_lriu.h3<E;88)<j7'>TPb@Yq+L(HF#t"]Qrh?M%$mpY&5aR1$4N@Se7MK>-n/@u%lJbAL,i9%/5?4SA?D)VWVu+O:4!l])WQfXc#9-o_9QG6J+=g'!C32$2<)h'J\0dqC2Z0p(TG+RV%=3?D99`Y(Oqa$o073)..6,tf)/E=n3)P86;g&a]ntkA'##:_gY>EfZjLu2i_kF`Ol-LFf\=eu*?Eco[Y'No,0aP*p6m_DUAQs<U%4a^mfPU>E8:+'<B\RN/K%l"k7n]nMMIp`\oncN.<7Mo*nsQbh1B;_eQN9$TP&8gd9)PiuX6Eur0i%^3)r%q(Jto4IN_3+adM2VL<kef=h5o0ZWJ-B#U#K:7rt]f'[o0_:S60Q@X`+nk1amW4HL(CcCpacfCu=3C'lLVb5oTct&A%pa"JnIYe4d\UE0<2QGU[DhC*:"d[?b:PWdtr<YR9*lh/a>b6&-Mp`$dLueZ;o#bf6)WVEZgpTp/dheXS_DYY@Fi1qOraSHDiAmOfqYG$dA('ph0e#S-$r#55CC^_BRA::b*`dbjBaR2'?&3Kd';\5V&0A]HrtW%@q3M$fAeQn).MFCKq_)OlJnP;CLb=j+7l^jO+LeXqAciV>aj5$mXt2XWo/o7JT^9[mft6m.@201mYt%m6c;)u.HjqS?c#b=58Gfl[(=42gYcB)K*Yo!VpEGqja:nYLFLRAQ1`ClCi\h;!,k6H+qZ_q`cNl1Tb]HR-o'ZL=HW:(Lp6B"MURL,jR-_nLtep^\HC`WQZR#b#mk@7lcD4ob%j?,<4[^Df6qEr9&.;sk&5;3E8O,?E@!m#E;>"A0ZMpn9/%:oO*5S>K4ul?>^)r8mqFFVk@i5:eVuB8IGCoR;J;FtN2sE]7I3@mYrcHWSP_eBEi#gs7D?]ieh71C4\`T:fo2.&?TAMdr."qE(j!m2P3T%9(LioRM;D>g#T(rSQ-26D$QU[6WLP-i+3lClZd)IGd#KZ_D3F*W<AsMc]VEi6YY=eQlUHp9;o4@#LVb@U%:[kG<]TK*PY?N3Nk\!:.h*m53q1-1Z9S*T2%nmtN:$pm#f?A-,?#Y\4].ld,[&$tA5[3&P)oZ$(ohZBd!j*q6i^8VX&'"-uUXSP1&W2>1].&d]Wu;eQ;KJL66d/!0-G8;qVE)0-&3^(BDDQV16bTBnG1[%8E9!^\66e/:b[c]qT@--S05-r%?"Thp\@\<kp4;Ab?6IC=fa60uRsn5.!>^4_!k:E2*_Y%@9:^.<@!4^GUN%"q7h*ng[KmT5G/:F\ID]"%_:0Y_ii=QhD&hU,^!hu**;qti<2AF\X7eV=[q(&'<kn*WAh)"(guCb-$-@IMk$T'O#CgG^3m"t&/4rI3^?*%pYCc/7E,]_ZSUf=LgHSr+d%=*j(t?7W0ah>NsTlOK"5kQ.BN)?cI.Ceh["5%ZC<h4VPU+YtN4!1Lh.0u=<W+S)We=mkQ#TF1u]f=^(<@ko8_pQs^=j9cfiNq($72R6k>3YVaY:hBEI?r+*M'2)ej9F-[kO,U_!ch?q$mN9Zu_`X9T])DY^r*\7Y#]VYH5)K'aNAuC<JN-3_j"8$JnTQXfC&W75neWr>9`b*;c0\UH$nn9:s+1`^qiFi7f:;I-TuV/5cQspkl@s\RGDZgpkC*K_mdGOdbfd<AP%ge%%&`Sn&Gjbj::&/.Mgt=lcZIYt!Mh,WD't[Z9];!Xo_m-K=:"O*p3lNi*6ncMH;;2C(dSa%Bp<pOj$WQ2(o./Wc(CMnH]f)-^atsL0#)dC.teXnTC1T(?h.h.ikO&0)^b~>
+endstream
+endobj
+494 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 493 0 R
+/Annots 495 0 R
+>>
+endobj
+495 0 obj
+[
+496 0 R
+497 0 R
+498 0 R
+500 0 R
+502 0 R
+503 0 R
+505 0 R
+506 0 R
+]
+endobj
+496 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 444.47 369.866 486.97 359.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 273 0 R
+/H /I
+>>
+endobj
+497 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 92.0 358.866 134.5 348.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 399 0 R
+/H /I
+>>
+endobj
+498 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 240.59 295.894 286.15 285.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 499 0 R
+/H /I
+>>
+endobj
+500 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 490.86 295.894 536.42 285.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 501 0 R
+/H /I
+>>
+endobj
+502 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 476.66 251.894 521.66 241.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 37 0 R
+/H /I
+>>
+endobj
+503 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 92.0 177.922 133.4 167.922 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 504 0 R
+/H /I
+>>
+endobj
+505 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 485.91 156.922 538.41 146.922 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 23 0 R
+/H /I
+>>
+endobj
+506 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 92.0 113.922 144.5 103.922 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 25 0 R
+/H /I
+>>
+endobj
+507 0 obj
+<< /Length 2361 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0F968lH%)2U?B_Gu_fS\Nhop4_p8Z-8Yc8L`?F.aiIXsOdhV'J.jY:m9o&J.N*G14PVO\HJ(#N,\Lk1A/:Ze(o43jrP#en:#N3HHcBr,JjW'0hDGfQLb?<E`bU$+mFE]WbUdrqYC=nmfqdVPL<(PWrok<.<=+ce1d:04$jBprc!QhrdEO^M^m5*N/6$#L1'#PsG[-BVtt-mDFt<(Y1N\oc(=g>"62"T=,G97H?[+g2&8^2m;>X1SGM89'$I2KpGbR4+IM@.InB*>cj.IBuRBjaX[RU,7I-!<HY'@A;4#[HsL`j3GGjF`F4hZ!>\mWHFl'qSX+pdH!9MCKY^'+#TQZoN1k_od8Kh9Te)tl@hC'@!B=!$6X>=;'_JmtfbXY2kB]RIqV:"V4]#nagcfC;g(>r(FA(rt+1N6NGb8:\*(%E\ThDt*7.n-&idcEIe(V1ga_'FdE2,qZ3mAX+FPJ.I/AAB8AUQ5=QSDD4"&8;OXr[2U81O7AB=RQqil!Fp?H8At*Vf65+l;8=q0',M*nIs30;O9H?HS/rZL51pqSf["Y3dRVm40chaIfgs7MRuC+D_g=?,(h35J5's0'B;Dh'L9/2N&I="8);Of)e1B@iqJ>\BV?CNSB%r@!dO.#P3^QWBhOONnea91:c_2nlf^W8ZTu^8G6)g&hb<Q&e%(hR@I8G[<[kM'^;A9N"W,9a+JJZdYiu?]IHB;apjOE$ZsVSLep#;Pk?]<2#U1UX1)n5O=,'Wl-1%*\ZrI>,j<R_))H!!F^Z-@d:qW-5pe`;"1es*!<V</:aj6gU4FIJCLARn,.?%8p-_[AWoY[#`=u?9=:Enh7N,2[:s[gMQ4f./0L!>e";7<u'IGjlBJ*26lVeU%[7HA(aVb'nEcf'jC)aCQDM3inSj86WB5lj`:WRET4?s^*?TL`*?UAeJbmS:56NnOjKrGN-\HceUr,e+6NfrJa(@$,"X#,qS5nZa65qjnYFN9t(SPBh5'3rD6+hh`#\M=<W^u:K-"gP62G',(J!Z&?B\-\bnEAL>pUECJdYp\07X)A)K9rjHBrH%Pu<N8?YG;CQa9o]@m;Sk-Na;GS/iWYF<L`kVh7u@ARW[P!DED4KI0jI(nC()2!O!$SsPe\H"=$+PDe<JhTGpDfgM2=c:Q4XU%HF$eg2mD$aH7MHk@*X56WMdYg%1G\qnSp-A:G!XgZMlk30Jg.s;o3#m(+DD-A,SA.Br#A$kst_$^M:!ceAl'iQ`+em:4VZ&9#^pI;'bh(dqT,gj]]8eN/"(qD%"2c36TVeR;SIhnO$+3KTa3:LGp$5>0S39I4qFA#9oXXg3$hk#]QN2DB<pc&6Tj@3_TTV@\V7oL$qn6*R(FA)$LTjkWdhZUnf+;(^3%uf/:4LK2G02\i":b@V0N6+GNDg^AVFR)1q_BRLZN'N_oP%[U=YG?7*Gq%JHGa!=1",h24Tdj9!fmBX#T'8p-O:eoQJtLfZ&_hTXn:B8ka)M"mo.!,=FNH-'=.gC@dWPl[-pruXia:b>T.&@:[Z!UD<<hs&d7-?kG2faGi<"9'G)%"AK?9Reg;gl2&SE64_iWu?0-O@u&tJqI3TTX.@^f79A@2E!)2bq:;7f=WR<.dHrtK6_dY.HBrmjVUE.5WU!Pj04E8-!jN1R)j4rU7[SKUUT=02#Z#&-rNgk@H%<&kb;WLIN:-+^?7>J.BVor'?j;mpibZWSYI!'@Y,K#s3RXlEY?t6]LU$TKD'9_F!eg^ULLeo$KCkj4?l]o^SH!E`>$1dDopdG1k2Tt3U!0f8Mf'<qZSC]DJs=eG:TC)<WM6kS=(E7Q&s%3G#)jibdoO%^N&X2a6fE+??dK&H50AVTs:1fSU#7Qmq^Ar7mql^n9RT'e1-`#dH%o+cZ%^bYH2-[4NKmoH36!GD'SPD$'^9`5]BS;nl-<>rB"%Oq1b?.+K?#ibG88@:aIi<n:\Mr1LeF^MD:PXVUoV#o]<t%$CpI4%neH'K[;#V`V%6fF>!9r.CJ,p#oQ&`'bGd2E!+J`/BEqUNEPe-N]Un0!i'P/Cdmt`H>ZcV!/n@d.PC!b%9X)BkRd:#TXW!g\mB''A(s!Y3<jEF@Ief;CrWh95g[5Q3X%hDA\-?S<E+27BB*4S$kj&3jZ2fC@HbM!AQT0%WReAs^*Wlef6()EF.Rj0Zikc/Z=:Y4K`?MkUcm$\F,cMD_rK-d(N-qqKGBL)"q*T+a&-:namkc?4]M;bfKI*0BF6oW:QjQbLfIf)s.NuMGXL?U06:FNpH:UFcJK3D02Fusk33Qn5odJ`nM7SHAI4HPO,p)`pUG6r3/DFFj+lYh1Jh`'8c$,)'?+s%01BuQIsk+#m7T(5rSQLmMS*,`r<iXs13!~>
+endstream
+endobj
+508 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 507 0 R
+/Annots 509 0 R
+>>
+endobj
+509 0 obj
+[
+510 0 R
+511 0 R
+]
+endobj
+510 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 325.87 660.0 370.87 650.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 33 0 R
+/H /I
+>>
+endobj
+511 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 436.73 608.028 481.73 598.028 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 45 0 R
+/H /I
+>>
+endobj
+512 0 obj
+<< /Length 2185 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm=gMYb*&:O:S#^o=lQk;baQ^7m(96Rp\Mf.jX%s89,&fh@B-*JRU%BpqhUi%/EPjN<H!<QEd$tmkU)9soh(:3=2C1/(7em^eKXns!ED"3E8N#hH:[mT6Pem`EC]u\flf%cs>m0,`Di^nRBWsp`38+C/YjI(=VJEL[bWZt.q8Qk/o'=tQb=c5LuH!YDqB3H]8o)]H]f!6rSnPJXU`0HdP]Zg,(I+,*h,;kI9T'u:mhC/24O(4_LX7P!Zn/SrD-JMi&AC:K)P#=G!obce)b+hSH6AI&5Z\g%H'F3N5o+HGnZd//n[iXtND5!Rp]nP6)*kSH/XJ)Q-mec(\Zd\GD0:!D#mu3I-fne?AoIR&Q[sDhH=;qgrgeU:Z]O$G(/I;JHFLgMpBeGN5j&2&rrsY)2GEPOd`h#\u8[77%"-;X@^,d%!W8Ob/iEJH2&qQ;o0+K[7+bSEdff\E_,_LD-Ise:\4DnQbR@.u\%/C*q+P9q="u^uhL5f;XPcDo"1Rp%O@#o_iJ4j%64Rhsi2jn,qgfA!_Zgc,Ib9T6pm_h6L>-.BN,h8;2,h^;HTRPOk`N?B8BEf"^\sgRf&bQtG_r^?3EIU$iW(22:^C9q9fIMOU>V5\I`6/c/0J22A(]mXta!_4&=D]mFlPqaZnM=$)+(2Nm24fje0qF'TRn9f1=T]Tl<MaDG1aH!tD8;RF:TJ#m!X!WMO*Lh>q/]AKAXrcJ/8ek>otn.KTEL.2Wer(%bh0G*7%In>R49^0R>S#dJ2,4JXr3=be,W<2P1EHpb=_j-$C2m5F]]A3nf9C9.NSDZeX%[YGQuZ^Rs^jJ\gJhpLoP-?#!5jZAPLBO3^p#J%R1DmB/"*?msg<FRN"sqZW5+MCpa0g:%LjaW&S5["ks(ldW@.0Um&ET]eFOFSme(]!jtCYn$QUW%bO1X2'npgCDLW?rI@QW8kK[ZF*<P9ck,<HhD$?pW7i=b>tB\7Oi)KD4m&2E&;V".J^SOTW5o-<=Ui:rf`<XAi>V]JM%1JrUP[:V8$MY,R;B&8&-RFm!AN"Ce2n!g\FV)W3HG*mX2>V9[%IbKeYG8#C*NXiQl>QOi`XK5IF+73fXudC-nTKbYeD%)"p*/M)`^2ZZol.<FkqfE?Q:"1n!j\$J@]UHFI]8T2\m*odb_f)L'Ij7DOos(;f0uaam6q4n!P#54RjX#R-s55R:%5H>h?0%bJ/+RLi97mE,.?.C\C*?m%G.<XZ^]p>!V^[35ge6cfaoqo3j)W"6<Re."\6NqI?*i[lq@nZ?Np/0lMMi;fDXIO#Tt^SKo9CeX@btF^:`02"t1Amm@]HUVJ&s7aqeb&\3OtFu(]\`5*/91R?Vs&YG`3_.J=S+q7ksF%*^pi\a'd4kjut0*#%t_C=EU&VrAoC7?cP*jY_N-mtN"4MkM7jg?A/gFQ\aRnY8@`V=6]0bk@W.Tta3=mAa)(:mDp$'@jc+M1An@O,P9Ag?U<.[29O&`C[Y)L&.:&!1Q=N0/%f!.L9/\jaXkCfH5$/oUeLTd;CcSLQFjS5@F&[)M`kG2QaSptq@g-oqAtG&SH!3LP\OX$W%fa$((@H:B$iJOf,)=5]T'D=@:V&Fu#+1^I"l0%pNp'0Lj%0oe,d4*k6U@s:WK`siUi5fI^FTVpQ&qFH?`H>M[&2GaXOB:.HZ@raX6UO\j?P&D+Y*#*^0Hr*LC#2i<YK1=cN>Of':R$uQFi/1JOhhS%+qXiTFes'0EZOjrr#Yn_'Eb[!O\\)63YA7G\q=_Id7q^8WJa&uXX=TS4Cj:GB(r:0>F>\mF7)*eupJunI%sEhbgH]/Z2A)3X!7#^VNrU0Riaf_<4^N=.p-7N4\t&>ng35e8^W+-Uj:<._0QLaQ2O+5<cbU?0_sUX<Q]m<TLeSf,5+_*4)A-"2hoI5U%XA_W*(c#KMaZ579jP*Ek:@?*#r\ao\&!NK7_>Y)e7PeU<>,`F\+\A$DXtAYE!<=M/Se#NBYP;@]p`?`0DdSD^.%5:_l8^Qg1W5*Sc"6PQSpYu?OJUGM:5&/+1D));1(#b@G&!6[kF#:BU;82i)'^kd<B`hU3<a0qFAL\q%aH-TN$?uX&h6(;@b+m&_"P74''-I!HDj7-GsBgKY>C.Qbp!Z#R/h724='gogO'QD#@7hq1ob?0P=7e8.JhUPFXr]4o+r*_-%*!QWF(S9arrZ!_tG0S,~>
+endstream
+endobj
+513 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 512 0 R
+/Annots 514 0 R
+>>
+endobj
+514 0 obj
+[
+515 0 R
+]
+endobj
+515 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 350.83 668.5 388.33 658.5 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 182 0 R
+/H /I
+>>
+endobj
+516 0 obj
+<< /Length 2510 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!;fgQ(#H&:NH>0`89Y@]cT@;RA]poetQJ'.<+A"kl/]&nMZ;-'b4U]741&-(@8Y[%(GDRK.mio.kC4baBWF2sZC&)h3U(@F!HgKfRmoTUEq%U7#riG<Z&HnXS9Y2uE!*58r+2ftoU@rmg+fQ41eB-iB7k*aVj6Z7#2)F-JWY`U&Z=qFA8`4%!Vhdp\TIh8SFS>(5,knk4]F0g?;3eS+J.<=Z)\*0ZW*ilr9;,jK(Xf4@<Z/DcIl4O:'\O7S^t/^*W4Wua<g%j0i1-qYgMDnpQkPsc78AHB8sf[,=b*+eI<,d9At)1INa"YG!t_RIE6.hanEb"59/%Yc>j,m?+fWWujm@]OQ]bg-;X6bKu685p14,]<1/^/S9@M+CSGjI64D0jA!Rc^q@7Bu0)pqpk!)qYDe^s3Co$%(Pqi>H,LCXL0>b0E[OdX6m%/)$pDF/?fa02\Z6dB*t;>df9n('IPGgptuS0Y=VRN-mD!\,cU?NA@T?*UrjHNF^=F8k$Lt8A/TP%I'ljDU([4O5YWC1N#3rKS30D+!Ykgd?*/hn=P%E91DDUMM/'^65rC/#L'nj.&oeqmMAS.3^o`BI@#_:/AglZA"He>5A:_qRjUR>F;hW][Pt\+:FcCTB_'Nb5gnAtacX#*3*@'a%VEca_j(??jf+fO#VEF1i6$6ig,ePO`76J^0'l//Zk@uI22'+.&r$S?kE:QAIe).E:>6U%ik`elDa.u6\V9k0cQ9/qq.FN5N1+A01N_?L=FOpn"klub<ol+CE=;q-qnpU-55G+0g:te_2\*KE9(Ka#=*MMA/ath!KjhE8%Y/M1erGI[C8KUn4_P/\cl0$-ZJRZN)`^Ek!GoGd%Su^CXc=hjnP?9i=D>57e=LeL6mpCQnPu4(NA$?s10g*qN2Hdpo*H1K6h9Wms*:K[AEOH.%]X\e"//JI4jmID%8\*67@e!%,bYhm3\-B7!7i<1!Z-KspL[-FAIC&"iZ?*2"37'O2Re$69Y?Vi#L4PRO8)+4\Q=Y;aDu/diVgYlTIHW>/,Ip'8)F6k_CjI<QoaF(Ug7LY$Ua$#u&4Ro@F?1sf_!+$-EHYgOZ*HAP+-'0ZD,F3%3Kgmm:?uSO+UTs'Lg3R2mLoW'CD8$8MK('#IC`d<=F7e`"5VK'2?>=a<oCn`qhS0B-g70d;a4YnoB_Z9Fi2)O'KLqO=2rRQLpIS]Ueh_K]3O5aJheb`[Z:jX*Xe#VK]-h,i/1$!=X9fn+]n_QHEG>Y_*OtTgNEY9oD6-d9qGEoX8+#&6REFNa-:D9=sipK][+rhX$PW9+#)5"\nc%TbLBQID9m7&[q"Na!8+_5&E@>]0>>>\]!If+OGs3$N)@_m/CL#j!6k!:?l?VTfjK'_C"pEC1C;7Zo5K;tWpXXJ+uGD_2AfFJ-kB4N?Lro^*]3$^N?%4hb?CZ'CY?cD:heT&)(1?R<%nQjT4<J5jnHrfP*aB<_8YjrJ?*>O>Ot$$:Gfk'UmVs`0=!JqNZ&01!E8*$dBMG&,Eff@U1ZLe4j!"$H@9'7.G&d@F.2=9_Vf5RVgnmcG7I`Z,MPnE9si#N`g%+C]$)8#AqRVf6;n*`jCY_C3qL;Oi#"s7YQ^&r;F2[m!0iS@]\GjZRA:R;:8DWoEEdL`QG[C&U/^\U@e,U`[JEcZ+Z1K5I!,b1Sgr!U=&dd_9Hqa[Y/Q=o&MEm2(.YU@4AW@1Il4O..3IRh?i:GmnO@lJSn[;M'itEtLBKk@2Q.W[F\0k5-MTk[^erW'XXTB)jloUg$S',sU"US0j93^5'ZZLq"ZH9O'fN.p(-2*rk[8c$`KWu=O(Y'me6P"`CtLg6?WZY%S5J3]aiH`fFU+LX/DdBOd5$+r0Qnjp\SH4T(AE75*;ZHUrZ&`IEWtL.JmgWRnPf]m]A^T)Y'$eV0NP\rJ\Jb*C@]rpihqCToo97\"2-Z8'panXgHGpR(?4l\mIL+OpRg"]G$rFG]%&jiG(kh`?Gm_A^YiW'Tb,UnqK.8iAGCV':%[7c+."'5/_eKqT!_g1r-?+!i[8Jj[QQhQE"Vm4<8TTqM.Vben4sEB1jj(.nSE::iSr+nT?O2^#+LA%N_G3Q4oQK_Q4X8`H&QV6CCWkGNnZ14cHpJ+I\^`UX.)q<NFs.1lEL?uGo`MYBiu>lgZ@GFg\#l8Kj)pFnV#[U2#>bZEY3^Gk3_ni@uiQ?oO*o*43<o0STb*IpT+&Wm['"lo_^6<JLKRsp<i\i',ln+-V>;)MC?g2lZD'+f=E9Y4In;!H1QLCf<N8@9(R#L.0qmug[ufJiCCUL7lKKWF:?>VOPTkg[93$T"45!U,J/9WjkkkqE>Hq?ZZ#"99,GEL[;b%@[QdmhB3]7U#*s`!InoLirD*eS1r@/\Zucgn>Ai2V+j4sZ_[aT;j_)PDbd+pOX6#6GfHD:h#naI[MkbcI(K&g+EHSSl*qlUH\>U4WCT`m`T_B;3^Nj%"OQ/F:_/88`U.?Js!-?^JMSHN.4NmJXT_7BTQ#nO334I3EIu&@L$Xk;\bQ~>
+endstream
+endobj
+517 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 516 0 R
+>>
+endobj
+518 0 obj
+<< /Length 2128 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm<9lo&I&A@C2E--tM/=NC0+aTSh&kcrf-?3cNc?/%c+;1t6+UNl+/c4EAUhF7>!bB9p_)!D@?l*b=^0T[AHn_$#ILKKI7fN?@QpeAm7;coHQ6/f]s!'b:IG_''[2AftGgfH4jRf"BNr2\u>Ahapj`hWbH!rWXE;C$Q-O,#BG<'2GB=a_6Z[MC&[Tl<4c^3I8f9.p@f8@8mALFcHf:(mRf,)38]$%E)CD8hslkd.<WYmHr%UIg,WaT'V4CuLVb@)W]UC$_WeaH#Z2f&C/[LgH@4UucGdo0FM]M`O@`M,Pe^)TmT?_%[N2J>l"aohM1is'd-Mp[-:Oqg^*dr`Nc'><3MZGU[sm%cT<0_=@Bn;%BW'tAG:YBj8@5J<`];lj*'^??TZbD[L[hl6INk`:JL!rU3ks(?i,cMg$-4BEaT9?upikcjN2Q@rhbhL[)MWTi7cd(b/7j#p4HAmmp@&6Z/k@>Hr]4O<a!aT`!,Lg1p9!d9llMChstK]ImAP:s`YcThB/^+O+p$GdA5hO9:dqDss2>?=MFe+lqi$0'TtK&3Vf[qBFh05r;ZctJ%0S(JD/=.clCK%?h\h?;4ofbhF*k9;Us2/fLJ6;"IcJ27gH+@doL_29i>8<Fgf5GFp-<g9DedRSaG+/4aFNO!"5XFcrnBsm#%0!j9i7Dd7FXe.GkKon^)VU[8?o#'Y6q2R`m[aWq,fmIC@bA^'HYr[ST?F#0>HZ3k/r!`90Z*];?6i!E:e/W@,2H@k-;SjEhH;W-X8DU*<R))>?U2DFfpOP_9ngrg:'IEfbRs,t[8<t9@Eo>,ugen6!29GN"*sW.HKXW<4/gFu+P.?[9>k1-6BV3cYlNsbj]-T+.FF;=F==P>Q&d9S"Z-D,WW?-K%Gcq=T?`[<C7R<O>)C.FP+b=>8G.:ti0J/1m<jd?&K7m^L%B`KL+[tQ2.a[ISI`K-jL6%uN_p=i=".))ME1*G@I:TBuUrFa4'eD9jjfT%t_bnde9%"Fc#NkAZgjW#qEJgrY).:ZQa&=\[3[=&ckh7ial[Zm(TH0Ls\%<Z`$Qm^2`r[EN;*e-bnY-UV2#Q!+B]..oISH6Q%KI8M%V&l\_>gQSOH'bC$O6NMRP/>c8cc.YA&tc0X&hhngL?gACZ=]$kLj,L`)%,[K3AjtAZMO[i!g/J]dkn)0Ti&NXW+s.Dg*$]F)<Kq6#<M".9eF$@%ag>TOLWh\p$7m'l6Tb5rM`MbXcdL@UmA+k^),IFL.r>RP;jLHS$'uk`&_Onk'J33n/-:>*;UBi0?T+(DJZtYX6DqaI?s=O1'aq4XNa!6X)tda;%b9OS!E2_h52;,QY3\M:S[2ShXo/'3RI$eX$[YOPW#NF9O]?C\%tEQgs,ujosfT8Rr;UBdlHh1GhpdWl5dub1Y#Hl<;qVWm?%Kk`O[,l!B)cCU*Fq?eoGl,<5T=DJURf0,4b_9j"!I$8:=T"l'uGeg;fql\5MQif@=e2ITaB8W`/>f.!VplTH[iW-X3\m_ejc<q%/"?9^0pUb_0)NjX-KPAq$-j..\CDJfuq"TG^-ha*Ola\-X^gljBAj"R^N."$8BR2eB(XB]W!gX,pAW*"$fC5C&?n@QJ_W=&;s:FK^[G)MR@^7gtY!]k'bL8Oj`6G4jB,[QEBSsR]&dI5e_HPhqmeouL9K6`UMUrd2'@sW1Mh>ERLYl#G#3Hc,Y`qD2kOlFCA.?_?GCh\b8BeaX3VQP$Q@RuSafHC:1_ib?M@7?>:.=To*(u!7/98<9Y.ao6)..:iIL!+NO>cb%XBp4p4d"N#VCO>).\d0'YbW_S)J8jR3D(kR:jtrh9_N*.C<tS5\L(c'o[P5AEV"4\kcN4)P5@s/KL][pnolSiLbKsjc6s`lV7b/Y[Nbs-(>O_@.>)/4V:D?:<(=i0!lJoI>17DMkWNl09[Xmd(hs:%0[sDaE5JLr3FAGf/dbONDp`U!A#7PdV`#@thOhu!+>;krcgYGA$AYLlej#GILP`NMN7G@F)^pD($XKO^l4*f"d7h,Fh(V6!J^2!C^a(*F*,T0.<JC&V&j67PIne&D1J^-$>kC@@_omJDd>sIm)>P`RnmhmRR?mV=EU_??ZPi^DdZmY\GM;3V8\^H,uT5VCjZh`ND34ZuG~>
+endstream
+endobj
+519 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 518 0 R
+>>
+endobj
+520 0 obj
+<< /Length 2536 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau`Vhf"uT&:Vr4@HAr#C(@I&ESjYQ<I8JM-uiI^RQdf]*Nt'Gj%%n[?[m^EAqlk!8/pCLFJf3C1],EUhotHLc2?ddGQ,Aq>P;I=4L,398'\o)J"2)Y_EHeJ>0^e:R'-bP:L*4-0_B0#m[q-(\I.9CosU2oAX9AB<q0IBn!t.]RE>AKn7+0P'C9rGa0+grCeQ>uP;COjG;_'AY\HD-TN3*N/'HX=HR"bJ'j"F[2rr:O`moG"?BO1'<F1c*^7W`Tg+*bjmDV#pG^KFt]jAlkQ%\r`oJeV4O\s's'$F"%$cTt)[o`WR8XT`qD8g!7Z)pP[TO6/!8S(pNnd+d"n^cEL"@DS*ODMfu)36Aq)t1Z34=fi$,.JG54lYnHIj^5<oCi,fAe=2"qU>7Ikf5GQPH;RcHYb?eAA(gE.);\QB!UdBTF-rI!KrFq7hL[eIkV88J!`lE's"b=#D[+AM194BHn-8ki&a[A#khGhq:?iYJk4"nGkFt,l\=TbrT0B,D\#5aM'X7&/MmkE("7=[/<_JS2T1/UPtCVej0[e"EI7.TQ\AZ[q<dE^cCj>r/8o1jeoa-#bAlh!Ak=>)#?^t/")A`!EKMOZCM@5s/T!:ZGdBh_pasVUF'+fWL-ZO4c0k7+qU6rk]-M_k^B?&)ga?[LH<_o86'#Y_HG,!PJF@HTH0D.]%7Phd6t.<bG[6P!F..=b7ZP_&Gr5@AWK*XAM!T(Y/<C,hP%)Bn4VSid)+g&14]]SIK?OB;PT"[NA(`p3A%$gq>mhopAWEA+A-WG#EEd:).25&jo,KtJ+&l/#RZHZ-8+^m'`m\W05_i'r%'f7YO"BuTrgA<b*W=aVUe^[7bp[h9a96a?.Xq`S,YHKB!M68`#FC#e:"uI]86<=M:drZ=0_&#FfcUcT%nh%HAd?I,.;JYcpn^pbn6/L+$=Vsuggf?H7!rWVS&.;TXFOHd2ea)C;:$#B#egiaZHO)TU*C)?'/AQ0/r4X,GiF^qf'\=G!9f`%_n+,'bnS)-i\iTpnBVKZLqE]o7;1d"A/,pM0+LoiEijNM2i+uQYi,]EN_s3VV<]]f/3O;IEW*Sk<<iS\I[=S"N-Q/To$ih9ShT`<GNLS=32>[$>^palOp^AEn#YN;$?PVNR>CG\ac!;J5bBETN<TKI<eVl!KYP\]=W88Q->K>+e_,i,Rd1CH;ZQT'ik8&CFhfCRgb-MOLWF.d)OlWQIF9-i#s3+Y)ldruQ*5EPjj,d"]`N_a3k3Q\"K.!*D6/c[XH8Hi]=3mQhruManqkkqV%S\)ZJ@#b8Ogcgoq4#1`_aZF*bpN1PKJk_kM%nG3?d_hLJoI^,(/GX5jLQbl!<h(:q9atSLeFC)5C5n-Q&HGn]!mo=Epg#EKUS%=JPj:3AdE&02_E7P8bRH,"7S?JfFjALlY6I??shH2F>)#fZQAQatM(?((.nkQnV3l0k+n+an)INb[@8#aVe49M.(5aiuf5V!/6O$/qHdU=Q.ec.[*.14a,E.BhtA56=`5Tn;"7I=.:O4P/ZsI!bn+$0pqS>$aP=4;lWAj?M1Q1:Yk=l.TD9/JXMRo4Q6%NMuf`#YVGcu*P!ssOc=\AAuWGOJ1#Rb3h:8L1AQ-n15rCH7CTCuhN9gYmHob;m];FC]#?tD24gp:3Zd^2K^n!>M1J/-N=Gu3(;5+gASuH#5BM=!F`fm?]tZ]f22^4OpLt=_[8*LBoO-;RFjEklgl5Y5)-Q>QFQtt`LDgd<^r*hpXi#:RA#R@W[icH%fprHcGa^6c[/+u67G1r0+L?KWl_BJb-1EY10D*;LY6f@_k(Sg"0`H&7rm)VUp5pDo.ilIXG!B[frQ>,l7cE/0@$]U13fu6["Hi)1hBs:=+)AEiD0]d^mT@XqIEo+KNEci.rdu1pE>U29$u;WErL#)p5+=k494_+:<eiK.DI;j$n*m$>""q*lUCTg!%]s,<&+0lUfUN`HUAX#Q-j*'TDaA\tk*,kZ!mMHT'&7?"AQN[>b]+t)$_^mCb*W1^pd]>V*rd(eNT,A+IIlFgo5JmKH%(2;;(KujcMga\YtKZrp.GJJ@Bs,O#pq$7iV#Ar^s2X4?RoDk&'u;0N;_SqS]YfaId[A&B;hbIR&7<iiOb"X%8r1=];Q\oLbRMAR_]Z7^HnZ*`Yt!&lAk5.G#'k5gTNkp^3L7CQg9^0EWjii0>#q'X@tG4W[Lajq8!E,M=qim5sJE0Idg`m6`)qg%aiYY+3no25aT-=jVH"hm]l%#ODimA:'Q@;DU?,\HIdb`G67p\$)k?58G`WEc=CHG*IF\HcqRXg1E5^sRf*Ok&8CV+]6n*;`o`GUb$2=lgn>VC_be>[Unla$%-t[0#mjVahS]*BDn.MS#Q*jHJ1\X"*'5";*i:ElfKVKql!TY3/Zu"KU&$FE-<"\@okVpWhp'k67]n\%/'#%\f,@A]I!]o(`*YOls3ef)7O-OU"t-$2L.UX`[`^[3oh8-0c-0S`=QAdHdMl8$3+II)>N"O9!Qu5rNl8Tp1Rs<f:TUm;-/YoIK]Kp8\,Z&pn`4/.oIlNB\:"~>
+endstream
+endobj
+521 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 520 0 R
+/Annots 522 0 R
+>>
+endobj
+522 0 obj
+[
+523 0 R
+]
+endobj
+523 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 125.6 111.531 163.1 101.531 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 150 0 R
+/H /I
+>>
+endobj
+524 0 obj
+<< /Length 2793 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!#^>Ar99&q9SY+S$5A(<tr@%,_2dS$XW5`3kjG7GS3+>ZohNeg5$##Q=1*-rK%V\P#gq%r`L2TW$]"R;Z_N^7!MqX0^!YN^aH5crQVl6[Ld;RK<Eo]^t'XBDB((BraZ!j(6NBSFViji`o]T:-IcO[csC,/aY`toVq`W89r%W[!TW'O]=M3irb<+FH9jrmo7JA"eD>YZZr^7kthDoHaU_S$Hccud\nSH6OJSJWNCX7@H@:.(8J(N5VY-*7ENu^6mL0ZqbX-Umg=pIFSiE$;q*aA4dTc]Vc=](*QGiE1#+3+=r,H#Z?sL;16\1"U(OV[F\87E0o^p.?Dobnc=H_\H).j\T$5Ui4#'cZNQm8-N862#c?cC=V?dfS&+I*%*1+h;hA0#Qk.:(u1d)@/&hKUcVJp/!^ecnh?78d4,.Y#:^]*n+\>A.s)D)fsq'Ld]OLut2(dA3Zp>pV0!g]ka;1SHmA!-]5=Ir8+3'Lk!<Gh$VND^bTiUdF(Q\NaA.htO?]3H)YO##,7pFhqp>meC&8\m.;(*$@j)c`T)N^B5h4-%M8RbaS\Ioodn#Tge8]W[/SB;@W:hJmU:)d--cSuDg"66Y_%:1%q7"<-:,d)>8_8W[N2Li-=P2gU[E7OL1(p.oZY,n$aV@`sIQ0H=+o$D&mRkr:lKjPu#0j&hJbK+KLubck<i@"$&FrdnDH/I%)]$",?BlkbH\S>B$bi4^:]qC<^>$?9#mmf$HT.Zdftpf;1lggl;TQd,9S?f0Yq^&.S5EW,FFlLs8arVaB*lmEas4u8s3?Y'NR^dX8C9Ghg(da.McC$^%Kdd$T[<G8iBNNspt5)d&2-Hl$uRDa/TSoTZ/TthNf8'`ZEE:=iX^'7G.*]@R_ge*-KDi_[^h2G8TV1mj2@7Y*3>R9o2.[cPt3'&q%.u8tb'X+</N[K5\S7T]a@j!9G]4:Z=n["RG;.S4#WcXe>`KO`+&2q77q#UXu;0LX_PFuA;>?$VuX%D.^4[a$*ag*BWbiX(HltW;'!CaAOBFkW;gT)M!J940ko8R/-`ON-`3K*rTk*6mtA=]FC&EGh\\.FFG2?S>aq<RC*P&=ZG*%HC:P3NQ=g>!KgjFta]jmg7PGb[<KhObmbnse1_he.\XFQ$#BBV0`5>C*lUfoT)@c$&C;AO/Sg95KSdD12-$flqRg_q09ahqi#s*RiSVc!D%=\,:js='&J:89T.KD8/@,QM!'NG`#9,e,BBMM7#26H@N8O^Mi%iCP^gqPN"R5Fi7Z@ALU;V^am_n]W/_)mI%LshhJ@A't;[ec*gp6[OiBC+@td;;'E?!Gc<^G$@BN1e4G\dMZEh?>/kM=o_#LG9-t@)MX*>/TpI`qg-_k7HZ,kpHbc6JqU3;DkVQI,p;`BNF)5=L^>8-UM[Ho:;EuSI3;4[O3NR&4EUg,*dq6lGl(7oPkb9!0kl/::&NR,\HhFJ/bkh;f^`7d6O2<2fo;-)*!ZIE$=U]L$L%o)e9AOUC_n)mc<="us-j=L^X=6Or<>:tL?@#T4#qqF;1%%o93:itcQKKsS$X'.0+K2]&"sQ!)W]j%T[[[\1c9-Ui)s]TP27>UTNM8_K'shSh;DIuT5+b!3Uem:A3DHh2Lg[@L?0Zj7fZ9HlO3J]9+Rk!Qfh-"98B;f:h"OAH#+!_HE+30f^:k8fjOl]u-P:PE]#R0p->02@@h-`b#o\o5>;T(tX!>7!'NLBBTNdsj4>VquKY,Q9?WhX^S\0gPjfUtPJa883\[nLD/'`^1`\LFULT&M]qI9JJ$<E#.O=a\+AY&?.r2t@u.MR;K/Kdt6pRNS<ImoF-:/$W@]jV2$l&uU9[4;35QPP-KA1;HKK[ASca7Oi(DA&&$krrPh+CBuXAj\T8>dRJdEMR_)1an.'l@@1.kg0nEB6hT3p)f5*7.]=;QVKk`00,eg6L+IJp*p@cY2=f8iE>_)D)GLFd)HSo&`>j'b(fZ^F1uUu+El$8G@:_]*(2U_WX</Je_\mKV#=M3J'kV7]DI][,`(KO]QlZscH5)h`5^-iqk7!6b,sGYq?:n8M"B[AA]A?qZ\ZMI\c`0M&\[qBIn+faAX3=D@?!q+>,3=_7Gl8a5uXnje,,qM4'5%?6(oQmY]:JFJu^h@=98jrgb2SHJc<t0hLE+@+ceiNlnd04C'YLVTD^>O>XpFbAPL7::FNiPWK(]F"0/-/-#X,`%k:[e-nN&8'_,FVg%64W*WCTuk>7hccQM?9KY>8-2505;&rLSGd&X6_#o%`hlO<5$1+p'aL8;[HH>rNhZd7k$Rnq*_KIh4dqsih2p$2BDq'$F?NDS9^A.Q]8N/*m\-RZRcIM8Xg>Fb\H\o7#UP)oZ%N8ouoUbs#%=]F@QpmY(qM9%Qb1omErAd$8mf'nM#IpWGHaqMsCqcj]SC!aIH(rmB1MLJ!A)Uk#mj5[2*4=&DchS+oH<YRSTZFuI>_'.nfCFV%.5]oY\__;GJEIj1f8O$:=&dVrKSXHO-d8d*j`PD7Wfl[g.jG77s*13usHrnelK@[2<g-g^?_MWR9lZDG(1)ig@:C0bQf'V=)Hu&^GX.1A;;P(*lIUrW][H_QaKK0]-)gRb/W2aMooXc$ThZoDm:%D1*VB8T&gAROdMU':;<YVX-&&G,0plS#a``5E6ol/Vt71\Ychf&AK[r8ItL7=3G^;!Qb9\o:<2A$:Ao$%ut^OE5fr\qCmJ$%fDbCU?JP&8!SJ'g(];l5ogY"G/$IgmA[_&Z,Vrgp\5gTs$`FM'+IqZRu.l&#`)kB`)&eeFdcjGt7RkTff3[X\(Y]9N.F575:<~>
+endstream
+endobj
+525 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 524 0 R
+/Annots 526 0 R
+>>
+endobj
+526 0 obj
+[
+527 0 R
+]
+endobj
+527 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 241.96 110.495 294.46 100.495 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 71 0 R
+/H /I
+>>
+endobj
+528 0 obj
+<< /Length 2458 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!;fgN)%,&:N/3n1gNQ0ELYe5.ED*la1BS343>l+jL0X5o(f[.(iZ%`ue[X,%3chP&.V<3&;Eb,-e`bB+K//]pan??Fpu]O_mhT,MTdI@EXu:YS@^0k1^C:Hts@!+.lgPiZ;3W(q\>IcX&C>a]m3K'aq0^1B+-2H%FJd7/o5Bb:N"m+QTaF@>VSX?^Hl\7A31GIQou@HZhF6R8a:[1fH@&h',kN;rC$5cGWuWR2WVbQ?2Q2"V2!'-IU"3f&VlhKp%F#)[DsGAN/0E31!P("r_U/jrK./[XC0:(XUE*/=Gmo)\\)17scaO"C]dW:@HTr"4TN5/[FR:6]:lJ/CKn#,%OPmVk=;34T(_8`SgSO$iE=#/U8[E,T_3(_*2BE^+UT8^hU)*Y)$VD-f)::n3(\'pgbNJrHOKl)BXk@"4?[DScKr(Jec(73oAm*+=8q-Z1'R1ht1eoSt'HA!<CU`/k$%e8"(tRn0(1lc`rSp\[VfDOtrX"bRC$-DLdAe9!@e479#"uj9GCFE=(1>9LB`r">l>r!8,6MQ9%Tgc`9_Rr%LaD`ID<NRuEV'4>@;r6Z4%/H,j'O^h,]@!cjt-NR&*BPq%ul[ssc3a%DhcD6n0/E-ePm3#?UEYS!tGP"86J/1kcU@(ek'Q.*D"=VBZgjnj77-Z?J14ke0pmq9u]\ujJ]&2Df,)\a0D;D%WX#DQ&,GdP\S&Q^XN.2rRFI!2!:fmrI$Q:>?/ZT<`_^9/a`OCts4&QC\\N6$g2)^sC%oM8PWUEG@<9b)@O!XjR"3R]7$Y>(fn/_C$u<%HtpG#to]oEEE@(*+PQXd,e@lbCu:<D=!&$+EVJ@/s+O<uNgrRC#t4LA'S@HSkia.Rb;TCu;l1?nZlkeCLJN.n/I-LgnV4>JR7q*+UNm8RQc"]KR0!TW[#MZs)/=a[iqM>PBIMX(%3I=T$'X1RsJ<k1R=n0o8`D=5/TJ^"=:d>?f@>.lPtbTW(eVYSG@>A@4N/OXX#!rTA'22PER)Jp-f`WuIPTp-oIBqp8>%BIY(QeD4CXKK,,Pm?>_`JYEH_m2cVC9q2!KJSF@b-)c7T27;=k^Y$:iLEV*kSMbrU"?lgZQJ[+4_eAbA'aPI*A#4dGDBr5_]&1ZHFOp/jD7%rMK\#7`8fAUsh!T"n%EG4LDjkr*ml^!&MDN(d1'S@ZqH`6h!A=Z1_WQ!NI@Ai`4h/f$UL$S?X5d"i,e+Zbfl.e*8KeK,aJ>:p"C/5u5gog4jLs6sJ4uCUc0g=^+MWi4Ba!D@`Jb`VT;Gt(Q#_G,r`p([6X`EGnYHXe11LUeYfnkNX-1Qf9aM5P`n=$Q?0YiAHM'XXR=dGc4lG+-j7;\b%Eo1dbeEQnr9HV/1(<di"SrH,IJ#:e0@/Ol]ZIbT)"=<o#/BStIQA?p);/]iaZip8Y-39nNIBkk%^(N/Xo:O11dF6EXGgB4d9iYMeZj4("fOVMhFO1g?AR^q/dc:=QomPr?K^)5nLr<rC>6/2nq.I>PMTE2PP)F<UUW'KAMZj.i>g+k'J53P=rbk+Tf2%Fqrp0@$?CQ8+tIMgH5O2!lhL'=q=hP=f4eR*#M2cOct$I_K,;%Wq0V5r"]<nG"4KHmEVbp?9jp!qN=#Ro.*DCE=HkipE*A!dZj0fRP2e'5^V2dn>TCJ[Su$&i8HY3a$ZmXoq8fH<lD^IX\CEj.Z0fej^3r&nk,L>cp&,A^lWgFI^uGo*O8dL:IZ0D-dlneW:71bGWZ&mQDrO99eJ,Gf,^m9Kn1@J?`KS@e.<'hD3$:0fU3PV+acu*8H]7u;;[o[cLPYp-W(_V-WI`41bRCc^WID3U9js5?Enp+LAR?@aLigKS""K@_P/HTOm^1HqaN+(te(>LsWP<eK4X.eLZ3i_*s'/e%g[u3Q[[b@cfTA044OS$?b5n^n`,:)Fa(qQ#T,*(X@__/)"!LkaqKK/rB4*MZ(C@1]lXk41Ao5^M[t_=-SclmDNlgu=/0bA6P2-o-J=.k07;+0VYqoF*)@ktX88/Ojj-lg<K1N,DfBboZ\&W51[%WC2Ps_I-?\_-^$9Cn'";+U1fPUD,cBkN#V!?c[:ep/F]AD0md[9def+%dK;B:jAcILTis)X8#0331,92;^Y(Xb.U&JB$(_p6S&=Hl,g=/&e*c#3Ng9:n1DM73ZmKWO]'N69i#Tj>j_X[ipDY]dc#aNJ/&RN8RH/(M&oJU*E:Br&5nCFZE@@NI.(,4\k91,3%$Y`Pt-^nQkCr!hlcl%cV:$+*S];RfKkYa<6004pg&Ql(#L0[)#p<(E8n(HSU(+TZGrA&9#C/Z4UI2K]6#?@[X#h7_*@T;]eA6UI9Z6+2h2#io#q+Mhcu?MYNg34emS:Ode<<R$.F-*m>rp*\$M5]9elFGl+30rYR6DM@O)i\=\P..Adf3/ns9nWEJ6U6$;6Z5IUo;Z42(HH%2DLW3=>+$ZtK!$$.mXSUq?3ktG+p\$h5~>
+endstream
+endobj
+529 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 528 0 R
+/Annots 530 0 R
+>>
+endobj
+530 0 obj
+[
+531 0 R
+532 0 R
+533 0 R
+]
+endobj
+531 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 533.59 711.5 538.59 701.5 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 122 0 R
+/H /I
+>>
+endobj
+532 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 123.94 700.5 143.94 690.5 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 253 0 R
+/H /I
+>>
+endobj
+533 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 245.31 564.5 290.31 554.5 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 140 0 R
+/H /I
+>>
+endobj
+534 0 obj
+<< /Length 731 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat%`9lldX&;KZQ'ft&)[42IoVRJC)%\;i@j"SRuc9]:PXXPA:+<UWti*`o!l?"dd,db10pXri#:M4%<,")_a.,E2T3m8urh+(>Z\plGk0o]%6T_j!\9V\mO(M85a/F$O'7b5..RDef#HB`TZ=^V3cUip+dk,<KIYA+p?WDuE>e&ODZI[6j3\l@eM$SZ65&.>Qq;$&6jW3,"^$<WS)>hVgdkQ.ME>o5]_,E+_[puCAbHHXo0QG%3r]rl?3\u+2mM*0BC?jea2Pq53j%Ie[YV#b6J8A$^hP$Ob,+KP7^N>&7uT84/)0XX-*WbsYXiS7n/FX8iO<tP6?CROFm0fmYX1Cl8_Nm,ds#&>l,Q219o@I^FBOG&fq=28`e.?0JJ`5kOi!.R)6qr<m[?6R,sTa=61*7-)pi!E.ZNpI^Q2%Htna(#rJC*=$NH>XO,Ub9F_B`j9q?_lAadu&Hs7_opj;S;a_*I<F`NhTKqi?-YPmQ\]k<)rq[KU\X$YE^M[bFr>l>!>MBN"R+b:6H[p.hDT7KHE@d$if,k0@u;FNrP`7F!lGm4[p&X'BcMiHBBR8(37W)^Jeo.BuHpI^2Mn>Yh<8e!c0Cp\fG?-@Q6mk1r&\lgNn5JrTqN?PL:R]3(!4D_IQ/P^^+@4@B9Ptq7EfQ>S[Kf"=.XoOnU(f_`3TpVt$YK\kAD2OHUTFrTS/YM`G,:RG;/-"/lCb$ZoQ7$qf+8ln8Ck\0q~>
+endstream
+endobj
+535 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 534 0 R
+/Annots 536 0 R
+>>
+endobj
+536 0 obj
+[
+537 0 R
+538 0 R
+539 0 R
+]
+endobj
+537 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 369.98 671.0 414.98 661.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 95 0 R
+/H /I
+>>
+endobj
+538 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 459.44 660.0 504.44 650.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 99 0 R
+/H /I
+>>
+endobj
+539 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 209.19 649.0 246.69 639.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 150 0 R
+/H /I
+>>
+endobj
+540 0 obj
+<< /Length 1826 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!#]gN)%,&:O:SYfTPnWDS6MGfb%gUY<j9D.:+8P>3LN"%>NlVA-$#@TS%dcm";M#tUL1]o6<3&DUP2loD\.IYpn7J)sn%+PVd>-an/IJh:4)@EWl5Qu@`c]:Kb>XcG,?FD@@DgD8g&5-V?P7=KDdjE4U9ie9al?G'`eh3@9UqIE#Z$ffaRp<Io$3,B%N!C_0M3*J%Ni1[KIN%H]0bPf5R/09&Y.QLBaRnZc2i1$GDo:*>Rq7Rc(j^ZE4U+$a`]ua2R:;W.r?$tO\O]"TG3WSd3W[\W&f.?<n;=X.4`+&p9ep_'<1sXQ5@BOiT(ZfhD!J$hn1F`,$HK9>fE#Ys>W/X0jZH@N0=FhE!jAC%/[k+MD5TJi-4BRbl7U1Q7k[Pl&Rt9C,jTF9NSu4[_J:d:V<=F&Cf35+9=*j-e7PXF9agg!?^lkcjPtY#U<ctCSHo?$:9YWM/?'h'mUFjo?\sRmGWPILm`D6jPFX0),0p+Jc,-SdQ?0HA.l8j64Fa4?ZrNfp4%JKHN3WJOGD$3+ZT^Hu$akS0N%r>&cehuR_e"14Q+]ne$$&DC=LS\[G5G>3>.Xt7*l=#W"-,$Hj.BKj4jXkI]JATQaZI`Zm@:d^<gtscl1^K62OY7>NhG-V2KUHMZ'I$O>.QMo5s7Q>[S,%a^f0dbcI9*f?2muPG\!JZM>-*:@H5O1L(ncT@$B$R$@_HB!I1S=]jN;[ngu()7$eag/TW)<+6AF!$SG](Wo:k:SjQ[<90Qg5L[J%eCRZA^j8P`[5Mi8P3h[!H'CTP[e6?-S%jd=:kl;/9i&/F[>-8)^gVpuR*$`(HRm_1g)OiQ#'K[[lu,?3Ntapr,+)Nr+;aN*+_J,!XTG5cB.g$4i8O#FEc\9mcDqYXe<c0e>Ve,`*,M?;KLgs)'*5K$^B?HW<FZEg)E7$Kp.plZ`EL`c"fMt/F\eL$3`H+Z>nbRm/Qopk'Pd`P;.F+%?K[3$>F"_!E>ZI=MR`6A6?9o/+-r/?!l+&Smp*RipHLCUVCfE&jt@qLR@og^dW%0PZ&kA)imofRI)''2PnbY\#ZeuW0mkukt*.X*HLC=*Kso^;>_P?d+@OQ%Lc:+Ggr0=e>=n%pffa)SZ)I9LFrG!R_2[-9ZU#<F-DQbA*TmH-8&m8AdCgX_d=ZXU%Yi(B<9\cFOSL7sF>j,,37fYN+$bpI5JZq&93UG6ME4NejbM<M[RAWp[*Y"Dg"Q4Uh))\#7HOVhqmWYQMclS>O$6N[R!c1sinh-s(hCN:rf*gLeP;gNgDmFIp2"1o2)Bif#q/11]7$*d@6$lUgUf(f3Q#5N<;!."#&IcR!OjmRMR?@[EQYW.Q8[r6/FZD\-!jh'aAQhdHtGi#q)HFG^r+n"-cQGtBob=?sdqrQLN4;?FIatkcoF2f<S=g+T-T[JkfULW&LK-K+U2)2nkQQ#mcC2:^@*,uIhpbX(3kREpD[9^Q&BdBb3"D,R'YlHj_m^&3ALOgrGX`n?hV.fJO,aeJ85eXViEal)g.A-c<0e<?\o45.-2&0MPBot7;60p*L)5n=nrT*A3X7pNcFAOAC9O5"0-(bSorB$7s?QLm-&b_5]D4LfDMM*b0<%G0l,4esd?qf*O]j3!RKGY0-Q4B6%N'l+P_MC3BWW+eEQ8/'J>]2P+$UWbrileqk6r!?IAF7:t'nY8f,@62CYWGM8]K2Bk>_fbc"ROdj6#IML^R-ETe,6D<jd"O2_=Q;u$&5_N3f"+dM+cK?3k"F7d,3AA)pphkcNT&=^dkog3,?JC$b1R0@_AfH=lU,9)5?QI$@@ddl>4(qO4Wnb+:7a;Xf$qM>pT%*jDVb8LJ@~>
+endstream
+endobj
+541 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 540 0 R
+/Annots 542 0 R
+>>
+endobj
+542 0 obj
+[
+543 0 R
+]
+endobj
+543 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 381.65 680.866 434.15 670.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 47 0 R
+/H /I
+>>
+endobj
+544 0 obj
+<< /Length 1681 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!;eD/\/e&H88.Tm_iSRM@8K0?(.=F'YkOPB`MEU8[s?Om#oG/U;Z!B4*rQP\$=SM0.O[BiY?B,#Z"=kFT:10>ENCT"h!8[ZPEdV^JoqH\*hRr*V$#@a2B1KRIXKYWeS;B1^LWqLmEQT.]_Oan'O)=-ArKAMQt>GcR?Sq2k2ZQC#`H/*.Gf_7N.DXC(+p>e4&WjVD!a7i_3'O4O)MiDI,Z8Fa\-0_05DbtgP4h[Ihd(LnW/ZW3Rp`mT=P9=[.Km/K'0rOc.0WpqeNkg=/+:@kQRl!Y9\7[\*bB,C%0@OOOpBuGgOj9KmF?L\j&R@.XX3F@S5bCsuMjEp*=$PO8$J"mhcLq#aGfg/#R9q/?Do"7N!Zp2X[1=,*()"O_EAECt4U"tH6>E)T(C`644dpU4%+QI@?0krPfN@ALO"^.5B0>pk$V"@V'S?7tH(>(bIoD8.1n7<tIPf/r$3FKSK2?f'mcNVs'"#ffRA5fc=)ds'IbHnZ2U)B"U$2u6M'L&M@/9rLc3U,@XXW*qK40gKCjcZqi]TT*pf6(+7"332?/Hu$_HIPC;</kM6'_?o.\1Y7hj%E3`K:=.6R20iZ+6J>UqiM$7/_sX<$i'NA]7]ZT1S,N/a?,fX'O"=h#=)uI%%'kVVWa;&DAL8b.q$aP8DS-]f1I6==JpPs6*OtsK,nfKemqpHhV46mNKJ#R`lbGp`P*)3E^#cEa&iUP01:h[AK_%r[k7fb.^T+<&J"!:.pTsDCLk,M)W9mQh8<QC(d3cRRO%[Thu&V4cV2^e@9mEKaR=qMMP?X@?1FYBr$\RYVWLpGWNHn,s$kW#kG,*$dHGC/p^Jt^ROnm$4Ft=%Zc=P3/P<Gk</_IJ0*EI2S'T\i5=m!r>in0.Z0@M'p-FAPOKD5!4B;ppU+T!+!$\PMp%e1uOKM4=fd90qT7*?LQnAA6kXbcGP";m44I@iWe@W+`9Jm@a<'kQ6*2aZN\&sntpRA[A9`uMql]1.W$a)]+[<9GbK)p*?#2^l;2-r<(0d@'!f@'n*j#4a%D4$=_O4O(0@Ft:3_<L/;)b:P*ft[RneM:__2hJ04EJICS>W<fK,8?TaS!>FW)Pm;(ebg*rM??;070uls7]W>T)0iI'9g7,.Ju81CFWH!i1gfN"lJ/6`V]=Lo/^lgdk_"A5n`Fl]#Ja5%.qj$?@.V1-WD"(4TJl$8\._dIlB4QG"tT(`c,%:,LPU(j7EU1]V,<o(^^MPGflf4AT>b@NH5)mZ*o>.u"&:F\nuIB*U;4n6o<\0&NG2C[ZG&MF(pI^3#U>)d(=Sf_5i"@a7ajD_,?8@H-VO,V&4400B0-W@Glq\jC8(\ZX.+\[CQ=9J'"8V2HSriPJ3<*7YN@D^pQtLF<EAPdgJdS6\uS=?YFr<L#`p-G/^XjOC1nUq-G<dISp!)P7C`jJZbL+eL?G>:Ic-0u&D@$p1:o4[+e4:Ci;83M--Ha[F!0*e1^tXgo5BR:Ed`-jM/dk=3QtmcX=n!tqi\e)p_=#$G;f3P*EeU2h]@"mM#)^+@CR>J?+h/tcQ#8eHnhlT5u&9bs2Ueb48c#;BtXk%"?#Wg^CfS5Q@nMp3u+TOj`$/HCn'Vs,;u8X;@_i:YlL%%<\$)3%g,q<_FMJ_^Ijg3/<>?Bj1Ld,@ZU:*$>N@#N7]_<!tKY.k)YR-98;JjrrDR/oND~>
+endstream
+endobj
+545 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 544 0 R
+>>
+endobj
+546 0 obj
+<< /Length 1507 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm<gMYb*&:Ml+B[N/W\*!7UCU$taS%(^!c"11i`M2UL,13YRP3>eCdes'l=,nntSY-6"=JS'L3HJfpd!ncNIX`G!KHTVTB1LUb59^TgJ&DYl?46CclatHLE5!AL`"4qK7NTQqlhLDMo=JPYP6[\>7'6(coi<$@`sX=1:D?TC:JREucLc%'MWYP`5%T(-Zol1Vs(N%H:RKG6b1P*B(0mkPZ]_/t<7rh_i%6hLk2DHG.MF,`NIb_<ERePM2/@E^(;hiYX;pdCT%>ZiZ@Z;h,d0Tf'>=LJ#uF/$5`Gb%rg3k["_=4uJltAE$LnBr4jA8_f@`>\*N-1Um5PZ"3'^LP^?;2OCh!>&Qgok$jnNSjD>4qdh9]uEG^DQ>I!0l-kK^^`EeD:oALJ\FOI.pt]T>8;$*Pg%7ho*P)2he]dI8j0VHe+DA>PQr]ai]^M:q3^YEN#M$90c(U1e*i/+6p#TW)La?#"Zt1Iu=rJU65'M:fLeC+NFkC<+TjjlsP,kPoW;JX*'VZ%,+g@6PJOc"9?)CIK+M)Ku`5-)+@:j>eK.44l`3Y6/tNK`09?m&j7rG5p-f2sm<J7s%rFr@P]g6gi9;:>DrH[-F:$,^1Jlr5dcY]M#U`/:^S[<jdTt@JN5n-W]Z]1ofQ76+b86T2-8enTh#:)EiQsjA="G^5h.J'LgCZZ1_/'1?Crgc#jm2Z1n+:`oCS>^U&"(edgUM#)_fjpd`1;aoZ%Y_[E/!QJTL;O?q4TE%%!GYPqfs%2L(LlE)Yn:-WNa!aAmSisJh.aa6>.>H0:c&9GP:QKkXY9Hk6sLb_6.eg.9\Un;ge-l2JAXCIi_Yil!:eofF11`+]9NO<,ros8a"2iM2+7BSL,D;\`j)&e4M%7?<seg#:Er-3X!["^pVZ_*MM?KL".Aj,DDrT9eWq_cKjSo036)ch.egR%)`&eqRcjN_W)DEG,G(^faKol>qtIduW1a]hN[3%JFLC+GlQb%Fll!_#s8fbfB:q$%AZ12"V':6)09mjVWmm!rI;fcsJoh=d=<9$$2@rM&'48ONtfmBBt@=s*5hKci538@*&na3U&Wi-ML["`pIloBa;:e+tosE2`94&%ntumpm$n3L&_RI+$;Cm[)kM,gTNeliAo\#0aSNiPDOHPnhIX>'io.kR/8gW3p/?-+,8V2`GC4VpeRCZq[UhEr9dUY29@/j1OOC5YKugB3>'Eh%?$`/U\.Chsodf`V%dFm.tHX\HYX?jD$<qI0C^IBIg'uFiA)po'\Gk.O9j:mG)\#+5d;LO]k$A+[urJ7Jau#lfPqPEhnTneF>u^m;Cp8@#"rF-!i.nbSEt*rV.uer#)3%7gCUdF=1l'OQAu9nS`$XjSbMB)Um_<57rc9MO;*mCp-Qm^,>n`He!/eEr5dOn+<P]g*'.*>u1&CQEY!uN+nno<7a(^@!e42U4A+<?@MKWb(q##$`3ReUXIC0Q76cc.c]Suq2S5Q+,.m/^>?g&!+6G133*SI2P,l*8,i\&m-KB~>
+endstream
+endobj
+547 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 546 0 R
+>>
+endobj
+548 0 obj
+<< /Length 2342 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GauHMgN)%,&:O:SW,KsT7Is9re&b:H.ZIZi@`rII8KJueZHuF$6@r7nYOD$+E^9bklq'6e&SYXXHhMUuHp'\TH0^G@dkF;`jcMR75I*a*r)oeo%IX?S0W\Y=?]RAlT.OE/`jSr"4VfR%5,@gd:,=W=]/ae:ZA9iZ/K)geGGP355gt\^KIgS(:r`)`Ud$B=,]qeqhnE3t9^q\Z0+=h5<!cJq"HB!o;Bb2oB`>W&PX"g[Uh\lUQL0QB8<Ju]!mj5G-YRKf$$t=$Hp^gUj-WHU2@Q4c9_hlPW.RCVl?$8o"R8-sTS\?#!iLn,i:Q?9&#\BDL0nUNAkC>28#uh*l8)S["=#Yu(LnS40+]F<=FeQIL/N*MrLpbU0#AgoEJuJHG\<()rlHsIs1]m360IB%6rWL+C;W340mkT^8)fnSeOG6IP<p8$A3mIaA1PVT8'l-T'WaagEqDHP6@!T@dg*O@jFXRl?m03AU0s/m[H;m.eX.eZEp^:B<00`'i%h#5kdl#;4^hR;&4G6%R,-Ph?!WKJ>[>WnY0O:TARqN%6!0ZAii3Aq-9s#MTerPW9C@SaTRCg"G<8k2!5K%t]/BBED:%o"fm(t^N5$KL[K:r1#,f^0YIDi`MN-K22uI+6HMT7=oVhHo9>WZLUt3?l1)(a1'Y[?)[K$0j!dTdFF:ENFJhtppl2-3P<CZuYe*MI*0tStN.8]?nH2EY(Q[cd*O.^8,'5J,1fnLlabK1;JEU)P"c,5WTfeSTn]^\5E5OKIe3^QHU)@_&IT[EUK\*K4;7$/FTgj((bk%gqe7NAlCWPCrEaV&Dao%8k`9EVbgRKE_&#Css/CXUj?3#84&aG&cT_dKX4=*qP7>LV;?P3'2r0VDDlFW_&-1X$pV<,="d^<9cG>?.O%kAB#O%>\2]J#7:$`:Z=jc>LIT[D*ioPJD.M6ONthMlJOGC9m09L0Ga?bqfCK,2crRBRa0.Tr:ZN]q<GLJX/DNHgS><h5;'eXng<(?7:O<SO:a6?&/lseo6srR3K:KW#e%,CQ8#JDQo&%a9/"9\jOO07jj/nJ)<%^J3[g_!U7iF#mLY36"^G&`UdN<4ChWn><H[p;:'c/<'\jaJY8E%PXa2u,`3`#po'\N$L;l^Lr[b:1`mK.q@5&49X7\diP6_PK7ZY@8OKjc]:CY]p1/b8q0Gu)Ca(-g6G+^OECgbtO^]@ETsONNM)UYT%SY:+SAEZJnd*-&WjN]XVCftl1dbZAi=I@J4(01o<(",]T#]6OrTH"g-\J\N^qqn$_5'$E*KXH"i&4\#ERa.AD+9^uCq0[j0kYc>WQ7Z41SP`'"d,4sipe-J.[)_^m6sm+L[R'Em*fb&ke:frF0L!0</7F%*M.&ah4R+peiD(\T\8@E7?W!YVV`L@@AY$RjaPEpn`/hgJn`0M;t8dF?TtFTEVs]^bDee+/"]IC3p&ShX'Au)LC.mX+C2J<)A)8D'&p#5:F5s7/Xr`4'n[f!\uW%DM;/;h<qb$!!nXR(EX^9u5_rM3lIe*o[$at[\Gb*M!jirYUu-@R)kK!jNd:HkB(l4A<hNdeRa$o-*Wa6'/Lq[o2nsf'K#%GqqCq#)VSM+;n2,<cL,U!HFL4#RJ+S%nDh`+d`MVT//!o(WTZbEb@APt9f)WRhA9M%#Y#bllA8-16]i'!cC&k9<nN=^Yf%BVmX*ViI=`SD]`#@Hf]UR6N:TVECr<kS(1_6*[kW>_IVsV4cG&(pY+sIO%:[aR\*RC)Up$OaREuUb#jBepL*-8=89pd%)jRq9nX3968G.Ub'aP",XZj`j`Der.-M6D-2[!9[Bet`SNb($j&b>c+MTV^c?]9Q04[5F?jVR?"fj1ZP,[V</\=+BRhf7O!8mA-:Ebnf21cmk#P4iFV4/,s;##$3)+Q#`dM,?jg+;#]9\Q&=>Xp4[T5_1Z\ukRMe7i3kb[Kh_Bj9WNeNJ6,/17=fBa"oLH2>f2.4O6X`gDR36Vi`[ob_gP&j5KXT/d*Gd)Ha4CRab$DO42J'_q/(2aR9a1UTN6J,@I/mFV$uFWjjrEfS9BSqhWs/5X1ib@/nNV@TFEG>o7RgiHr7+;l&u6C@)]]5bE7KH%2<=]3VtFcfba=`5YKr0:(J['*]p!hbhB4%\Cr%o)&Ru<GT_"/r=E*1;]Sr&dMne;nI;67d1+(*,,#cPpNh)&;8Sf>B\;:UX?3XWJ<^-Qps@Hd2.AL_hm=>Qh`:1:fd>2b#Q"8dLFU@k:X<#7ZtM)lP:dtX$TXO5f[*WU01a_#cm*@l@aM5>bHF!N9\4'55K.&1Q3_GU0k60&DZs)\P"&!5GtPq,`>ZL!D3Mi"O4ON`?lRg!q;ZPNb5VPlr\_n~>
+endstream
+endobj
+549 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 548 0 R
+>>
+endobj
+550 0 obj
+<< /Length 1658 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GauHLD3(/G&H9DYK);u,2&q>N+Zc1$f;;GA]A(kRqPL\C*,mg7J90@ZgA^q)K]"T;+ku]c/$6%nN+\`-k/I8+4T#)RD^!/EXQB<&Yo_2PjbQ-37BY8NS^9j"[EPb6kBDj=f6>CGCZ>3`lfTSiV]q)CN>51%aV?E@\O[,(bVqpB7[7is:.WLn$gY.,r**8BG1J./#.'u/oGX'4K<m*\*p0#`5EJ72&I_r,BEaaL1t<VX#-L,*I^UPB\kWQq>J!TJDkP1;Q9ZVtYHE]N@A'/:c[[`H1W_EN0=ZP+8Wo=9[(oh&:(NHeFblj4R[,t:hhD`]^tr?(%p]2=.n0LD30hg0`Al,kn&.JL4XRVo]W&(FfDtg7b7B\dEE4AR)oWV(b;XjpflH*f#_#'0jReRNO,&j5V!!d;IEYfYPJdHP)jqgV>?W^*Ma]>-!3dr5$"N9N3sOl;Hbf9@(*":b\mt#^0h#F3cmsOAorp=gMNbm>a'hnp?0Q(`3['T`17h8/3T_%Ye/;]Yi#!IoNiZ'%]?O60.O//&@SSZiAXI1hT/"SG'!'-EE^heiH""cs%+@<dq+?l_I=3(u;_9+cPS^e-AruK#r=NZWd?DY4O?P1$>eZbI9=gBM,U5;u\DDV78e/sOb+a[`OVBM'N)jM+ACV3&:sTUl&2U3d6A>8DdV(`8IG+C69-R'c[gY1O;#RB;j\H>;XP26[P@Uuni7#[#O<B<rH,OE<Ap24FT1uC*`[4C_+aRc3`-#I71-=6X:#=Z2N?ddX&n/rX;]qZ$ILkFi:3)d/oAc]LRh>'!/32Z.R[E$HGmtN.r!;n?K8Tu2^T1LEE&GHsas<]\b>k+$Uu]dVUqq79Rs)Lq=UHMp/[&Fp]!0TEMeL@IHZbocf5KR2;Z0IW1kFM:QNTY+1=-l&-D"/^Yu*>6PTRU$5.;3Bi\FfU@<&@q5kMG&$s%46=_j2K-BGnKW/uo4XYc*Z8f[TpTLcrKl8)+9RRp?5ehqE69(N)`R[7UAOcgl5^iYYV:J=Y`%Cp2U(!T^;Hb:Nl(K'rM["GBl#KW<)J=n<mpqVr>")Kf=Zgak1pqtW^iRr`7#DeWa8TJ)4BWT3,KO,3\1nJe6o]d?g`Gst]Hd^8SNlCn]X20H5h2G%YMZ2X^XgNZV[^]LG05bM\!_5P_4fdDP]_V&p[bQ23CO9Kj::p`EeW\TiY-E@b2(h<+oJcH9IJuu6$@XGcF&#@Ne%3bpafSk&b^P<\3>?%4714Nbp;DG&JY[&$5kRPD39et'\)5?ZEc^FuYl!kMF1H8/EPR/&DY.d)KPH00.Hl)O4[XN&rbja.,6Z<Xb78=U3^:ep(PT;AJ/RSL<G4mt?m?bTj?EbDaF#`9%;FnW@(`[V8<'K;qDu+i.K0ke^JYM5qC`a&Nf0JcPkT,99]*o4c@JOQMW3"-JMr[Ti8Q94[i&")3@Th59o7jOEclTUER^-an%eBBP0oh*mV%lb@pr9Ol]$MG>'*cU;a)cCcI^;IrBf1&)$Z3D7>HrB9m3s3T'L`4Kj7,YQkr3Bq:kisb/oRFihk(l7,^i4NiWBK[2r<A3o?sL3M`P<33LO\f+Csmp3&S8<6rC27f_jp<Y(p<)GWY(fQb`]BS+D1R'S>`r2"iiE5TJ_eXh0$`=Dqj=7E,5ptT&Y=J#I!Pu+Wm~>
+endstream
+endobj
+551 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 550 0 R
+>>
+endobj
+552 0 obj
+<< /Length 1490 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0C>BALf(k(RKBR"PEeS;k4C>G=PPMg&!ZX^'(6]qZ_1,&l",WW;Go&KW3`lbMn\`;ZeNtCJ9HTUEWmb=[!N-\iXP_9B.hK8A]9/"d_HC@\t4Wu]^pPgM'G\QMMpHJ<-7_Ra0GQrYRDL*!i_5$c1*e]8%:XbCBDS0ZII6+r2&i.XsMcZLRBYerc@@lRPqXDZ)i^LV"8f9$.<<`^GW(LFo^Almr$Q7or/(f'AL9T\:DO\0<GH'^m#_&]US-Vn>6):O$&0NL$(%(21gNY3)n<B/*)/8VmmD202$\"d?a;tk6;rd.D?,e`Vie`4BHtL70G@ChQ[(?X!$`j*P4UY#]#IG+06X^g\=&b8nL'N?hiQ&]fQVh$fCX*4$jdU.Z9$L4/)G.;&d=m;<J;49EQKkJZ/DC>,<%J)h[XeeCQPp?,#]N^@DBl!>NSL.XQEAb0=6kQ#S.d,eJt'`k(nR@*7!;!#LJaf04P3r:M@*prCAE6JZM`@@h;-nL]D-\-qF6Wil7>u+kZY%UP#WR,E^+kPa"<H:^<_H/jl/f-C-3H3=e),VDt=o4loU%M.`a_!r]OR^o3%"J*^@qZ/kG$eTAJA4BB!-cB(KPUdK`,9p3""d-^4@@C:i!nnn-frJI.9p\qTn!263@IESTj9Ej<cIhk0Pus*StEhr-#M>65.:DKs`HZJNSe.0,3"OCkE,eS#g*mL!A*C!;>Ij"qfc=Se5,[U+n6%Ma_MKR-Rah2]NqQ=23pfhP+!$DC>ec"mON@?f4fPU%A'YWZoWVnt]lNL7(]E-Zp+kN/q=##K1[FTMi/?>=<<F%g#;p*RR"n=]t5#/Eh6a2a(b*<9B,A_Rsh=nWXC&lu'LHFqQFUY:1mj*$R2rQBSQhe(.[_(E*PfGAZa7qkNm+!&RJ84*-%3g_E[>$+-DMeU?!=aGgR\\r<n/kb5@SZK-Lm49kd_:Dbq1qjjOnpGj*"DPMD>$2fgk#oKEJ:e<6TWh#pG-dnr"?ahg@N[a?<Xp)CAGJXO@!X".$rQH.),rbFoZGEE%1*P7d,6a?-O#q(2^]t/L6t-gZr;NGUS<>QJ7m1hgH4^9CIgBuoGlHA['Z11)PO%(3V+$-_a>tVPpm+OIQ2jnUngDdVQWts^m-(mIQ@;-lplbPC(Lo4,i%)S>Tt^^__>n$CDYW9RL79ckGG#j(]\"B"dcf0V*MQYBJ@)?&.'?c"sFO(pDAj31DjdJg:XN'5QT`P3c=ujQmMa`?/u6B&I'm@5N$dEP9&adoL,(,ncN8fFj5-'N9KHfqr(3sR;pD*>pCDo#..%?j1-9*"oP5j/e,BeBY%k[/'R-&S1dXp't6\9/g4kj(\^G4io3Sh^3as%&`\mg;8[`C,nt8Rq^t\2oAB'qm_f8>E*RC>VjgOESll'9L2DpXlkmWb"BD'_(@cG@K<9uOq`J&DJmE&@QXfIi:JIn3.%R`V';_Jo56XM2NVDjM,bN@Pe%!p5lp:I:`?%bR"nkA&J,~>
+endstream
+endobj
+553 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 552 0 R
+>>
+endobj
+554 0 obj
+<< /Length 2310 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GatU5gN)%,&:O:SYj+m0M.g3`;KNplP$2SJpla9'g6jo2'F@p4ntLYrATdk>?'(;T+@/Ro4l[Cl>V,T=]jLlT$'$@KdJ"ka]8-FDO2dc/BV+JSN](ptn9aBp\m]<;B[`_P7rK;c"2m9q#5eP5=^01*ES'o,Ip@hhNCI>\cl"j:jUfOKkseLWp@2?o1L[R)bURm:!t!6%9RF]p2E]eN[33r45!(nlM'r[56&0GX0%+^0LD`+a%F]EIHE;Sk>l1B%J$bHO^8K`2<b]+',#X^\ZR"nI1W?Zp'S%q/RjkSmJej7c8^Gjk>:=,->F&pjK&G[oWLM5ATkeVScRcsF&(_o5dRL[I[UR:"4l,^?"1W__g?/mVNi2cO&>l7.'RAB*_ljIi_%]BFB?QMcZ73h44[<*GBJ\8@k*iaH]&S+BXcELF;^4>QrT/\p0#B^lE`39UCNsPRe]So;-n*h"GI@Mp)<U]ZR+Eb$%!/5;X7@E-Q_Y>A+XQ+k-F4sF0m\a(`D:CDS<DP50iUuG,X`!&R<;Mc&X&<9jK-kM:bX9fN"/cl2`Zt.>;g.^+QDE)M2<-N7\Y0q-Y4WZAf):0N$dU/am[2NOs>33_8>)\B='M5=;h/G[U_jcX@F8iZ<5N\9*:'A-*m`$CV%OWMioLaEIG[LJR1l>Cl:u$?=4<,.C(*D][W1uC^F.Vbbg&nj.kS:PXc?Y@MEq5-!EB(b5so)`N!k8P0aHJY_!mo]N]Ord[)8*OsU-i++R7P77]cmq(kEV@l2EQ0Ob?QSh=8ADU7=c4=2mj97[EE8l-pqPu..1Y(UY=!quVpl\gJOGLrH?cB3T1kK=#FmYb09f?SVRo8n*Zp$crWq07<$i5C@dLilsuQ$(SuE?1n;*/jq#:NdF[ZRY^0@HjqX^.oQ5(,8.(q=upFdhNqfK"iok3lrn6qE5%D`YPohNPVMW9eIcZPH-t8Zea`3(O+Ucjd3UBh&X#R%6L0Ko]uK2V60uM`E)6h+LlZG]2L.sCW+]PAT7TVE[:p=^6sBFr;L;KhQrdU*jqL1A6%.iH6Sru>uid'&Hcj_BU@gm`K:=`b>T"=M_NigF23E@d"B`ST_h"l>KSulF7HjP]<3<(&nM2_Wai%BV/F!C11f%g@+7p8CakX1<mi"YAuMX)^F<ddL45<j81u0o,`(iW\%eW6(J&iq*cFWX4,<o>_;@noD4r3cp9bub/]Zs5l.^,9;d;c#CJ\r"S]OKm7B5_IR]<o40UnrT]Y?s7J<J)k(YDJ`HHWZ$S'B$$R3::>90Kh%QO5L$`"mCFhAe9O'<k*]*+K6bUu6r;/lFs-eQC!ejHd*<Z)YSZ&2I*KlgbTgm>QW!C[;E=\e&'DCC6o<Y76VFFK8:e8lp-d4s`/AD,Zdc?&>A/mu9EuPGare8:SSEcA]Ktg=*DOB8:b.kU^GN7dkX)I8o8Y`7&n5MkV,^*oq4F.T_NBJP.0MdiKkcc;_G+PR6d8-'Zkr_ard1TAEsu:jor*)!S@ePThT66REfWi'^K&o?*(6E[?tqH'Q8T?p!MmCrSCkTFhKA7EgCk<'qb$3[ZR#S?#rC.SX3LVQtnP(aPDNo8>##67'dLSt\+#DBBk(<FCH)6#PouO8jAbUk*WL1%jsOPK!D"e(WY:<S(s0IFI73bbS&VmW%1Q]-l&doWdLpH44%l8UI;$PS$We\1Z$a'qts[+=$tfQf[@;4625nM_rC1Aohihl\l,p'[H5sB6Xp$FZ2@_>Q=,Bg%9ZC)[MY8nAG/k_UcW]l`X?"24tH41Y\).3>fD00-b,q+k62AqeY)f+N#3E1<OX*oq1$)pFt@bqH2X!D6pL^"*k)G>N.,T=81:2WSC<;G7;rE23$I.>MJO;<\du<g5R:hX$kaQo?Q3TkM8:&?E9G<:WT&snK[4Mf@`d%^A6CZO_K-7IIjN8?=DR%DE?Y:MZpl&F*kZ(aML$R=nlrpp*p[#BN4\QZT(4Urao"8me^T>'4\TLfPQGt?Iq#hS)[XKk]<&d@Rtk^:loLF'h4ta>u<A!_HO'BqMIu,n3J^@]612f_hf)_<6tOQ&d,^s@/u()UkOq$G5R`(^P\^uc8SSnEj0)\iHV$DlpFi0DCN:Bq)t2leW93tRd<=rD>6,>on^.lZJagE9)h-b_mWP6r`GPpH1U<;7hr3c$kIaLq\s`Y#LOmtD9K3Cag;JsdV[mnSpaI@/5@5e>q+Z<il_-GR6k';H;*)%+@Q"t>(h&^b:p"5%J<I#nH>OeEsO@%LAEbOh>QoU"b),X!ul.rPiRqGaIId8dGJ3K[607.No]NHn/g*g$\28B^53!k&(sG>C&~>
+endstream
+endobj
+555 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 554 0 R
+/Annots 556 0 R
+>>
+endobj
+556 0 obj
+[
+557 0 R
+]
+endobj
+557 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 350.0 175.657 387.5 165.657 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 150 0 R
+/H /I
+>>
+endobj
+558 0 obj
+<< /Length 1718 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm<968iG&AJ$CE--tM_Bn^r82jQr%m*M?1iBClLJ/2:#[*ZiUd@tfp$]MG-ioL(LXZ$k+i/SUqs=ISlbV9)i9^>D#RMkHH?\\QGA"16d$#^UiGfIiZQI4!a'PUTDeFQj]j@\4dZ/!s:FJ0UQA]]F@Nc;_7H1+!\1K,=5V&a'C=f#LbBIorGU15h_+;`_%ja?t-+"+APX('aR!N,2]m+mt*bT2Lq6R)kWN'*kH[Z[;Wm;`aPG5d9HeEcClLRHJJ*qaX#/;$SXk+t`^r4sVY)OWrWls84Wp75Jr,H%%A[U0q7<GUCB#TstNRb&^2+61%,:OdF7h#nXQ!u_%QIiH7\nDn,_&eMs"=]C89SZ>kT/R,ugTIMeQ9mpD69d04h"Ypf'dj:Q+B]*u0u@.K?0MLD@a0m,I6rL.qYgDkX4s,)J)4LS>+0b*;lOPq-tEmkki[$,+PGX!)o@C,KL?+XY!k>1SOn%#S0Y,JGEU!-AHNC(&7?N8IN8i7!Wp<iRtfA(I$d]ugqR^SAmW(V,@U_eA'^XMBN3CSK>gMi(__mTC]\F_?d-r;S6!_+bMKlLq/O_p=;$G2VVsa=ES$.$duX:e<#,Vr'jY.?DkkagfO^+/fJC^N(m\<2gmO7)?X>c".6.<q5+K&8eK%7X(c$\?+K"ra<R8g^<poYofWWL-[rJ66rGg<1/qW$?i;k"L[k,4JZFUE5AI7C/3b_eeMn/4`;t/$<f;@II'-a4p2CI.;+>PhH38u.l10a?i7u'U::.ufp!<u8=/fB=[(b.BnD&go:5hTHXQKB@qj9-0-$Q0as4\,4>&@ZUuc@GAXJ>D(b:GcfGA&N?i2"rt@+J/^#JF3NF%gEs;&eG9;E>U+OR,Q+Z%`=qaAXFDk-ocCHrcP'C2DWmnD;VEH!K/s7K9X&&ohFngfTRi;@7^sA"45jh%s<u5qk-\3PD))ULkDpTYKkhTIBYrA^^\p/=XH*r#2/*/l+;[lBO3n%hAYclS^h;A6d.GIgTJ24>^IDcF-O'od>8iS;uh2!8*OHB1*V7?b#&o]?mfoX-3D+oNo%3$GS3S^/0NY>;F_9r5^XJTBIcW[bXW8H^t9`(Zb<:h@u1=6(0,j?QW.>nIQfD6NdpmiGc>=-AJ$V1N,0!YA,.\]4/I0g,<motjlSm$"HiKLr:H$'67%iOr61IQ1e565P9ba5rQH8S0nQdq;#/!hCAnl\h:mO@o@20o4i,%ml<*\m5c7R4c^flQGuKdgF>d"BmI/31ZpurCG8gRqDJVr"D.LA&2j.EKY0536Vd1GtdCe*EF[3p`Fh2E0(>DW(BkqhgEGHRY=B`46QM#E%<K5./>r.>mgT6gm8RNiS)DAG4ZNQ^.9<,YIZFn$;;Tm,$S&'HaYF1)K2,/uU+4eKB&]].Dl.ir/LInTtKZ&2/ce:5@_c?;`GUoac/'JURB3s7*bH6qTq"o5B(OA'/B9q*)QJ%i5Yn]iF\]`MK4$Xgej=VK^a/u%<oqk`<Q"Dp$UT0j<c#B=8Q23[G[8"ZXem-jjFZHX[appON%M`G?]gE3HD6EkbI_J6DH_mgP+OR9TGaD0+-_*uaDi?e"B,J>p)@F-0iR.DQB8?)Z8%b^:F`^QNkC:u?>n!>:L)3(*Ue%QFfEgErV67T^?L185?%s_A3jhkjgHM/nCRn*N!Fs&`H]b.)Aq`%>dc%sC9LNHFG@Zs7Eg,?_-(t1kdgog1^IS8*Ggm<&~>
+endstream
+endobj
+559 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 558 0 R
+>>
+endobj
+560 0 obj
+<< /Length 2065 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!Sn>>s99'Ro4Hpp&%"XsMt7hH1+`G$88rFD%ND6*V0aW@qCYL3A(Fb'"C<`KKV-fjT)LZ%[=ro:>>t3g0'gm,5dLCEUg-N7m4+1@>[7@IZQm"IQ[oQ>[u)R&.g3G:@+H4=\TCj1@&CSbM^bK\LsF5(<Iuq7c)fVemg97+S%dENOP?GK3PpZT-9%_V;<LZsDM5`6/Ta8]KboKS*Ct+O.hef/6F0*^j_NTOFG"mH)aHSD,cR)CIWPRGPs?h7J`g?]RO:AN?6UGn_o\9cdtFE`3WhPSJJ,d&;5c)7qsm'#U:o`%tUqnP[`K.U'."mIb,>(e;5g]SL8Ng'I%Dk#Dup.uuDh8tS"ZmC6V0_Ni-',n5@nq8Sid\gm7c/_I9$rR2Jj?Z'dIS/*@S=BAWl9Ai-".&g=_!DWKi'_)nj-,<L9/LC<&OsIflm\)nUf=3/Rk7uJBdm@cKD-HY3keCH&f)n,[*,<gTW@p@QR^$N3$VHduWYp6OUF9=Z?mmY8Z/&;4+X)gfRj)$XO9'E<1Cuf?+G3]Kn^X$%T"nm!K<`.^?Jh8[?;+*H04rh&+F7S+Jl?9,5EP#hI(?CC+CBE9p<bPF%X&`FA71TD4>"Q.[j*k#9`gTWF="6EnhMkt3^.d<$^b*j2A-58`pjCIhSt)(jYF"P0W-oOjQ>/jNP`ou$Wi77AB[LANf:e_+KQ2C5mSBCWr82Z=YikiP"ZPXOqnQ^f47laP)&3EUg]Ss%gsZEWed@t0\tqg)HJE7mKYOebBCrE;K*/HKG6JDI3;)b??9DP^kGd/\P#StNF"l?^_MC@JXL<8G1:V6FT?7*@]oi:LZA.1>MiBc9HA\79ZB)h''IaAJOXTIaJ,8OnKfBR+YR!h@T(Y2f]dsJ1TntJM>r=kLM4e,JltTAQriCpB.>0S>@#Z+R0U:;J=+,#o0aE]S'CNoTisli=J9d)k\!`<lP`0KJa>0;X9+tGMEKF:g)<lLi*d`@j'3ELS`\@uX=CN<7,$2:g-Z4"_&4!tl;Sk"h2/-SEP]YK$OY';\^e*\A%TE36Mh=TY&`DdXl*UM^JQLP6lKj77SMo#Z8DgPs._^?=c-0l=?mQiQ3Y`q$^5)-mD!$?Y88caFr+*]&pAe5%J>B86lkObhA)F+D$N.Z\'Eb\P3nBg#6'FA#Y)RK5i+43itk]15Z;VY_W7[*U&uSu)dQ<SXnKXjKYLctme5M/25jSRgB2fA\^'K@<K++_SpXWn@&cXqKnBd,R4hm\m-2Y3.oTDd3BjN$Sl!.ON9VijC`E='7om3'&"IQd3W=*G2,N/2BTB](5[^6c@ueC$V+`o`P>7;A='tpq96EONVc2&7hY)O$*VNhO>[Lg.SR6aY/_sW_m]fl8b_A:,`-=GnZ)hd^TN]M7`p%I/k0rGZBCNaVjU?TDVkll0[!AiYjW_9l1WU/2Uu@_VP_W8]eUBHB>5)<(\3H2REUWM>hP4aU'6[@YEe$rXo*ED\?1>E]k*(CuH'HHFR%#@U3><f_chFYR*%mr&&1QkjXiVikDd"_$o/`6GS/b&W"=$@X*teum*$Sg_Xt$BU]?+0po*"tQOUr(_!%>cs=_Yfk5;E`j9k/!lS9b+Y)R]^rhq2^gSRo34jTX[u7IBn];c2n(])nX5N2A++Wae?3:qE,?*M<F)T9+<0X,'*_;(r^j-uQh2D'2V:O4o2cRsh1_(_g`'jjSFDX\e%dTtWRZSUB^$C(9K*SV"$9@]Vr*Abm?m,O]\\Q&"b28ffIk4n[($MG#?/I`ZpX"gd-<N-*Bpa1pJm[5MrkY(Zr'0T(3e4!M\Y3CWM#2`-a0'\Wro[3>)+!UP%-hArU(5%N?A@eF?mZ:0.Zr"\(0q?,nNKVbQS-Zp@I'K"Y5W=+ROoga[f_>'\7UcH^]nF)?c=8VVKb9M+5EmelS%*Thrs1%1elib+Z?(8SPCq83*K7MRnMONc$-_jfn(Y$g@5NnU>=5-$LND5at2^r,`K.RJ3-H=5XG>fQT,W&3rjl"enWUKa4aRT)GN6h$kY'`bPJa(Acdel3/H'h*D>'oi-MVJ<^@e\5_*kngjE]Q;W#C&E3_Z~>
+endstream
+endobj
+561 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 560 0 R
+/Annots 562 0 R
+>>
+endobj
+562 0 obj
+[
+563 0 R
+564 0 R
+]
+endobj
+563 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 227.81 126.584 277.81 116.584 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 108 0 R
+/H /I
+>>
+endobj
+564 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 130.6 99.584 180.6 89.584 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 108 0 R
+/H /I
+>>
+endobj
+565 0 obj
+<< /Length 1952 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!SmgMWNP&:O:Sn7YILd+la4f<M1=-5juJ4'KUKBL@gc)7is'G5V*hb]'P9L&l4u>-0>Y0LHXVVlEKtk-t$2]1Z?o\u%"Dc&o.k*[*u8In2lHi#fPAY;rbk:6]\;+UcGGd,O[c;%:,uEfBVXqLM',Z+E^d<fiss@JA0(A_g(c`C5"F'N+?BgN;$ba]Y#8"MFF!mEHP?`DN_-.,U<_mlfbQhe\Rm5Q5VFpHC7ZP\")K23+8bb&pBL<kR:]]^OpP;.*a.O<b!U(9G,C=;Ym]_8Clp42K`#+k]6tK(8=;Z%rCA&tC%9TYns=j[=!jB=%m+,f-jD![&=mUq<</La85^-5]epSBFLt9X7%BBPuFRAQoeF3IGUK6C#KN!,r-^`:3g56u`V;:Tu>&7*q$^/YR3h>h"??!T?l6,'t&V)S3]-a\:UD%dO[2i0cK4B=k%_Km/l$S(N_^rm#K+dnjoV=VsUs`$bh7?Eq-K(u9\(^Mh*E"*$2[VU\<q>S^!B[Np*,AK`>Na3BG.)>U<Y3A>iI?%OF)`Z`1W&9/8G3DL&,%^*!Q5lfg6Vjm%QXOK+38%t`HfqZt6DL"eEO^Rto-Td>i-cjf!hTG)-eM[Y&mnZFJ$[G[dmOod\Ig!7c5^+%)Mk'dg%c1J`(h*oce\1A(RcA\jkIFua^W+k!jZntP+"f`_X=q0^S'Lrre?a!Eh"N.90-a+fcSg&oDWL1PKJJgV5gI]V+c/cV`8]?\$c(e8Iu6&mHo\Y]p435V<@`3RSS[@,J7p)hft,SOW(]Q`<99a*,TqBX1,UH>6oD=QE''$M4lG;`8.#h<(FnS`57?_E``T1\R(gG@2^BV)+JKr',\$SJ1LI5f"(NN)27eC@LR#Lj_33&@n-'b@V+K(0VeVa"K1hNnQL/H?EnWXbVXs_5FTlepG*Z@0Wu6Z`e$@aa9[.G8bpW9/,<X+iWI$%=)7J1-SJ^^LWX=tuNWP5Ni8B'gQ8F8W5);%5IZ^lPNY8Rm9-HRkYibsi9SC7Amc+**j6DPK^A>.L?@;ln85lHBj=M72#FWa,qu^hCaAaLi6ENt/VFo"D:jGF,<r(5V4)[\\7[L),oF2JT(fbueNUkX&)/6QSa6JWDed.heW%SY!ks!$ufi3<@CoE5)?3i]TQi]W78'1"Gb'PCF!8/L<78S?l\%uW,W6PJR`n`G295jk@2_V7k__L%cU&E@Xm1Y0>ULBIt+?AuKV$hE+=;FI-KG7Vp`9(X8S^E6[dK"4cr5\WuPIr%t%B#hkD]!U`*ek9G@Q,7JH+I_OC;,WMHBQOo^XAC:#gh),[TkdQ2YJ!%5Des:\`Z22[`hq$K@\?<JuNOGG]'r+]YVum0=XL/$bI<VG82U*!O]aSSgXA._;m2VfQ@&o:WYE+5'\V:g-M:WR#]W=gt+e+.@\`f<g:Kf3a,rAKZ"a\:-?([+d=.e^MXVa`&n_/T4kL6<Er@=iE/1i]fsNhWJ1_8.#$Koo(H*t2L=b&cHEc&AmC(qfUK]o.-<<c&;`:=,q?@H,/=1p0sHo:=9ZlSqa!,YlS#bc+o)Ju.1QkTgYGdrAfu+U"+SGb+<*b3a%N+;[A0[K1-(5@?JW;+iIi1L1MlBTNM=MR.FH5;Wrf0KJ<CMeb@*aKMft9Km54l)$Mia[D'gWuIr*.\R"EA.//ebQ[s?Gq/KF,Ws#nm,KY(Fn8S1#$\H(MgJ`#uO/**NT@F%7YAh9':l,sX.!Q//E%g2NkU_M6SB.t-H.[BQtB@MbE9'k;Ye'bOZ-%H0R4ZINi,>faoJs``cJ5(2]r/LZ0D9"$,j(lA9YIq%lcTs3tf[W/))7jZuVXH%UG@7pqT"=\o&=SN9$,-A(4Rfk_j<2o.1n3Nb1H9"b\o,S'1O'SfXPD*2OsD.ei3j0bIQ'Z\CUkA8nYY4QO0]CrZd*OZ<'B7YY+p9--/Ylp,65c':6aSRpKEc=p!MY'Q&\r~>
+endstream
+endobj
+566 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 565 0 R
+/Annots 567 0 R
+>>
+endobj
+567 0 obj
+[
+568 0 R
+569 0 R
+570 0 R
+571 0 R
+]
+endobj
+568 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 481.91 641.5 531.91 631.5 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 108 0 R
+/H /I
+>>
+endobj
+569 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 112.0 614.5 162.0 604.5 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 108 0 R
+/H /I
+>>
+endobj
+570 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 112.0 322.556 162.0 312.556 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 108 0 R
+/H /I
+>>
+endobj
+571 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 130.6 295.556 180.6 285.556 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 108 0 R
+/H /I
+>>
+endobj
+572 0 obj
+<< /Length 1275 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm<9lldX&A@7.E(jjFjhlVj/PXufI\iTi["kL`=idkFJ6YZhl@3/l_-4'R]/(L85Y0Vb\*r]VI[siYHC$ZYkkRt;^[RfWMnnl506#?O/.Ht[R80<cEdh=a?BADPDX@8cbN3S<:e=fL8i7C(mF^ItV_<69p%nij:b=+3=3`HHs.F2I:>g&-oldX\Nj@UI=_Hoh8YYs@$RF[M&`BG2#5TLM>a??-3b*12Q8:5"f$EFGZD<j[HRPE^=V2g\_0TM]Kp8G0$ack&LDs91%DcOqY_.BU)?/I.2hW_V2.SLpd0]qrE3l*"Zm'<44[&Am]PP[rB(\(>^]k$"R#m%O(tCJGW6Sf=OJH>\8TAT5aQT]Hq#'oKlaQaE\IkY`d3p`.=5;PM0stt?''ghjQ@B'OLmnLr%U*-a;;`c!ISZ;KDSP)1#o@?]]:_JG^2^,k,q%d<lGf?O&TLu$\rY`4ks8JaV#uFK0I@>a#l[O*G5u%>KaL:i<gKP37Kcq89LbCm&V[rZBW05n$AAK/NE23B.chM4:nO:k+;-r3QNa?a+pSk0FX=+DX)-O4(^L5,^o,jt[+keAT4q,j,V.7V";;pqG6J!a0jA7L=ji]l'-C[g&:mDYW0/Q(0ZP'cB>Y&AFu'RU`7\+bd*Z($SAULEfWtVF&4qq_2GT=4(07@IA/cnCZ>D#V[U.DY**NLS4-*Fe4`c/]F08spiu*Cd3E<-_*tL7Q$7WLfF,tE9cBa.,NNFRMJD.rG5\m\eis;RsF+U1krL1A=cicL07t;ssmT\dp!qlGQr%(Zt5b]aC$sUObd+0i+^#4\D1GnBjPMhh5VJIP$jc!ZJ+g/s&%T1o:!?Ta*$ibiY"*)+JZA&QELGhW;p8'`h:E_O0#r\q2q/3"39S:+fJdR<?.iia8\2K-.-c6/=4"E854h)Ups1a[:(6Q:[@C@.$HHoZ99!:'>43:qPD',_d>'MBp;.V1bB*iPXi8?WtkA[i(>ECkI+WTdYY_(\;Po*\73QB6q`cNu_]To+4,[05oA&W*p_kG4R2oX-uV2CkV"A[ANP+t/nrblrI44WR#VM!.J-9tKt]88s2.bpn'PAhrI4rS0L]=&>i\m?AAK/`@6qi=(,H!-GNh>-d4:9TPl3)XZ\kf9A5AXRW8ICg#lTCo:pIoR(#Ym\_<#FVP6Rsfl:$GBObLc>Tg!JJ0/RN,7MRQ*jHIbg9bW^'%HAl76c0pnc#e5JOp8<kgG$fFe*;0t5.Ot]VCBbSV7YNQjs'rG&-qs^ZXjDBA9&'!"$9E~>
+endstream
+endobj
+573 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 572 0 R
+>>
+endobj
+574 0 obj
+<< /Length 1672 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!Sm=`<%a&:XAW@,DqH@`Tj^7h?A2'cM3640Cmt0S2F6jN?2FLWVuEs*]Y8W?$jh8\TeR0OSjdhDr;1^>\oIs6.^aXluX^.K8[);f7V;7=u[fYmKdMR]G_.V>,o<p"35N.3kj,Y^\e2h4+?<n^8MMSrYKfN$f[Z,'<MC`#JT?;qUlBpj[g=Wp&/?Hn3pQ79^7%[8uo9?I"7XEmDU4amt$rkpXd(1='G"@`F#*b1UR8o7^Jb++G'l3"'YMH6Y>b+;KfMUnfJBK_/p:3ETlU)DH"/p@&sCK+\S,gY&Z@I=W[IAV3\n&).eCggsKE[-"Hgi_lj<d_J,e]iZUa`+M3f19'<]+LX#jlHH7jm(+-9+oWE+.V3fe\Z4<PCYU11>D@)XS?q]CX3)#M7uK@BWgd+7Cg$=b+^B##K=GH;$5b>AObAG[+QZ%t*=Hj:cL)%=G@A]u>0?AGh\S!XGo<A*XB\%/;.2=r,_^i5/LXH.;lNdq&7N2f*'e!E$!(!/cjr[V?rt%W,"/9WCjU^cR_^t@Gb&aRWm8q+WFFm3cPA&bGoa4SSY;?a22ZcdE"C&%?Dhn9YFXCb-aGeiSc1>9rjk4_HLEq@[]s!Ub]d&c#=r,%,_b+[FZ)Ko.%u.(h096`DYJ]NWM/Ucd=T>qT'\Khf6'91a>KFl99-^'XfQC8@cqXSjGCG&%XnsV1.K=tD!/rJgf?JtK$B\go("?3&E6r*\LOX2C(^Qpl"n.\$1]hcG'Sq8Wl9ORCE>nqI4[V>#;g)n<3/@1T3Zn4Y@dl+'o#;1UGE#-+i2.E"YR=(FPC7hR#;+UnkS.c:N)r<aB?I4nJN'X+LE*_=Z#E^^RrJ)*(bm#*Xp(OSG'u/.1S`Z3+/5Op9[O1OW2TF*GMmO*YC%l&/F!)#UKc;o)(Ms7H/5Ke@#9VBag-gjmDF`)mHtWYRi,i>d&e-5JZ@G/@q0KXm%g^at_>jEel%4H$k=bs33mS[:RIC7>VsiL6DjSV>C;J+5IGqs**QVgU(eIef2rlrSi7pcFi`e,>7@.>be^[*hQg<.Kt^`W^C!`cEG0CAIqr0/Wq4tM`M@4MEmZ%PuGp`Mcg,Q:*FfKecU6)>.'.J3QVW8>1]8ja:'B*e9KGC>o2*63kOXK4j2n(@mJ$N_mjk`BfE`3$\&.Xii'd:(+6Ai,A`JA%2\lDAIJJb')mXmk7IJKCgD0(ntYFKo__kErt$6<2:kb*'k(45!25J3O.^J$bY,7O]]I;N-k4W?Ye2*:5CnjhO_?D&]T@FHQ/>/`a&))s6hp3d>+6l/Rb5LC_hlpj/91$+7BFG4<(b5L@ML?"LKB=LWKou%:0o64V)fN?(1&:$'#koGomsbJJFYR1=PQ3T._D>r)A%)8WeaS$bo$HmO7C]Uh9"Ul'Y6Y?JG\U!-h_u6m%.C&lDU/[\c*aJ]!]nY@6;&If[phAP3!!G#Ed`f;0IFPatB-lH*ti2)!3qR[_U_8VK1\ETnRE(3'7n*]&%m$e=h-(!9q;_7%EEM7$"hW]5^sQT>Q7Xa_aN<l,c>`0F0ODV%\h$eSs?hc"9J$pUt,%p-h1i`6EcY+D_6Z.BmTLj'dUS)Nbn,1mR@NV=4V6FFqLM4G3lX4\Ft9?%5X!a.LKsNIj8Zk4j5+\l.+]Rb4.aPHPeLZ]P^B.qSDCXg,h9O8];T=CTG~>
+endstream
+endobj
+575 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 574 0 R
+>>
+endobj
+576 0 obj
+<< /Length 1720 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!;egN)%,&:N/3Y]&)d#nu5#Uo*/ia&VE%OlI^/g.n.CMM*O@.7,1,/*YY%U`a(pOjk\@`Z;f*0X01mHhIO)L#4tABku?dL?;9XLA'!3RN_[7jq0=<%>ljir0d9K/7U\IA0F<gm??\I&f[g)a_Kj^'.q67V9!Z4eLh5tI8.21nq=?Mlf$A9Dsi!-6gSQ"`/6")eG0"oR*Ut`JZ47%mm):bYq1r]WeW\g17fb1b?EHnr^Kt#ABdB[[Lr5/Y*VbtY,3*6]O6#Y-Ggm*K/!I#*b[i!A`4kloJf"ZWYWEB_O#!sj&%pq_k7Rho(n@ROZEi8V,/S;i.Ou=Q3++>'PJ2c!0$%XT<kVT)*![Q^tI2036kFOW%9ZgZG00RTfp2>P9<WkT:pGDm$qWR5;4^AJjE%4aJ(YBB\C+@f]_b:hb4eoC;D\AeY9(+W<Q43O+JpT$BGQ0"s"Du<IEN'Mjuq\m:\WEd8r2_JP5#[9GS4u!-[luVLmiW^&0R_kg(&QlX-F=C;:H?'?jCbG\uS'/g@/Ln!BZ$YD8n39rW_SW%_GH,A/WIrk@$GRRN=M(+XP.jp&qZ%Fk.cnj^E^_@VD%+ADo>0&pCJ!!69H3:mDN=WP-]cQ76.GR@]/+Hs7OV'O6@iTSiW!&)N:O@T&M/>%iB`7elOc>MF(0>`h4q.,V00_Tj6<8Z6=,&8bl8K:u>iGc#&/B:4<hG7UZa>%M>/-Fk=I(u8R[OnPT,GApKZ[pIr^KP4<6-Al)S5B6XMYb,o]rB8n%W^.Ch2:"1djV@+fDaiC)5]1U^2hqDOVdk]l)MJSpHc<tE:^T^$ct;=[7VR&"i7f!%cZG(GcJ[:^b/Oc[P<!Dd&eW](?2OPj\q&0c8K,NG4CF'`h?(#HGoB9V,<<iHCX:F4NDFUZ$&6F<Nmg\9Im^n[P\Dn=`Y0#)pP4N8%G>HIkmY!9P`r"p6>3TRfLku.0e@[!t3MR_2bM"97l-T%#o*QB]<LE3mk-!XN[>"drSQsnA99Cj@'dGTnncfJOMe\)2*GlAcUk_.lWms_'$g-DV2u=p!6'qLtOq.#=L)7Z`mCgWjD@PaN?uFKpRPA`QNB*/;J#$rn"^G&<@CS;eA/l>QnO&XFmW+D1[;L*DtP4dRJAjlPsoc$,$*(\W#29J"FhYi(apqY[otj.\=YNkE,.9)e2c]N5^eGR*M)cG/f-k!/qi2CNk@4*Or"q4i%AG2t%mqL:qPI9K'Yg5n1CIEn5f$>(A[%dSS!Mk09%%5BcS+pAPnPd#o'A+B4H@s"Jl%'klc#BA[Yr]f_0b:$06o(LH-e;(^+uE,dCNC2-=Af4#Mjh:HR=9]TWfH2U4B^Noi#IL0WX"Iu?iceTsAr[er:mUpHS=GRUcY^^Z_DYWpC\A<FRpHJ<[jB3<um:#VZ>L0-TX61VCVOD).@\=B1aO)c?NI,Sj07:<3m+P`\+M1l<fj<luGsP*TUt$+,O:o#=g6R_WK2u#cbCrZ'2a,&XYdc$SN^O'G6U%lI:H1kn@[<slCYulia/+]<hl3U5JK]_QMqgHlgQp#/>-`,^4<^:ZF?$=1'QlP!GuE)&QWM>c-F(a$="l@FJkXM>c9A>N;9NXj0*P#?h;87ahg_r:@!sI/RjJ_<Q-[VsGaB\16+/>?WsXJqlq"W!2Of8p!bR*..J"pqW'uiqnU2"*X()nGFo3crb:8Dj665-QQ@-=[D$nY+lYG%k-cOM`!Lq-#i;~>
+endstream
+endobj
+577 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 576 0 R
+>>
+endobj
+578 0 obj
+<< /Length 2030 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!Sm>Ar7S'RnB3d,#D.;FOln?mq+Kmaa6eZc;B51jtH33YiotXs>sNIf59Pg,tTjbO&J@fLm@/j>lE#cBZWFg!Onbo]aH*,*.i4\D'1FH8Gp[gB^A]q1e'.i7WeH8RRe4Qll9HoR+7c2@Yu+n-&%mrH/-g&#.,h?G".\\\S22ht'.V+Y-dII%a1,dhe-4D"p+s[-NPL.h#lT:1LRM=q39!/*"P;3@eiJeE-odmcrouM.$U3ZgZO10g6M^ha*F?P9`^+-H'r8P\8>!9Q.(@?enEOY1?Ft.cus"Tjn71@ne>V6:]4u[!"+%Sn!%@]>V+f6k-+#XR(%Q$cbf'W<d=`ofFXPS'A+.&rR#B*SV>_Y?u:(A-'D]GnKdAS1LYmpn_L]E_+$jV"n`S090]@>h7("p,d`8^KtN;Gb\X*eN0U(nF'>hI&:J?Z,00q1NJqAhb%(W9pq[):D\smbBfG3:KSDMS_R]]Cf=P"(nj58)+N8kqiPe/Hd^mB/.Zq$*>.JL:![1[]Fs3VBt\%Jr9\L:?KW3W=>TIeIiZbfP;1)U-<pj9oh7mn(g>?`)d:dJR2@qtNYjnn!2nBN7_dK!=Rs%6km%0D<#,%6TL'C:IR"#T%nfqHECj5KOSf15QI7aXCg#5mc7"RG\<MZK-&NHa>A:rW8^it498UNl"cAWS,pVIL?,TlPl#Nl"-.%J)laWf/5>>g['mH,6"(dg;DeA9J!i.\(BdtF"16S?!m8.00A[RKg*)&?JP6.OS?f)>E1;_YYi]0XReKlFjP'iJA'QKH[";Rp5jm:f;lhCl7fjC'^W!MO-"lUkC):nNlSN$)@^usp1rb6[5]prER6u<]SpkQ2VpWn.o`?g5P'h6q]EV3XSq&JQ:MX(/.GcVhCMDd-`(Uan$*(;0f4Cn+_]Z%:'?EjjNZ%B!8%"'RG\WI>\pQVgT3Jh;.86_S2LT0.E1b'9B]JnOB5]T(N\V4>i,E1J&H@r,^f/&t9g]6'<?Kf0m8X;P!4STolA%>I==b1@bS/e2+\Za^4$*C5H-9oo@fal:XF(fff@L@Ee(fto<*1V=m(r9lBRX3VH@1MRNj8,?YDoL&`qUu0$F2Ni6G6Vc9'9h2EpEaoB>)nnY(IhDSCYUf>"'24#%=P](0?>aP"gHb4AZJO*RraJYiqDG4=>a$a(\@$`$S;H0GVE>al2nOUB^i%/-_.WUWX9g200;.@1jE!O"t-_RaL;fpN53dG+3glBl]S]OSJ"%l?Oa53"32B)QWeI*'&%P%S((uF=](DlCn]N>7Y(Z0Yer>o=.d#PXV+g5ERuGTbU=>JcB8G!)m&+2CMMLPYYk237)8!.1]cMrr;bJNM7/)TT6Z`S6`'#HWkhsf],C3:W$$h6BmjBY*(<X9D^oo&(bj(0BGFL-#cN0El3>%nD8uYI#<lOsf/,t2b)/?24"/HW$r?<a&taN^;*`.(ENJ3hF_mLH$"QJP8(7KhCPhd;Y!j?.=.T4VNRr=WhG',bdQu7NnOinr>199KT!c@ukE+)'9VD<@AdlTDf5tL8"G=cI.@g-+cH0`Eeck7mreu1p.l:8GT)&FOb1:fC+1)0)GDYc=U02PY@=8Y9i8i#n/K'Ws2,%tsL)t'odJ#4-V.d)NcU'*:4I"Q]0==9S%.EI=HD/d;JRT6B*\hU3@=\Ff#uiId5<djMs+2[W2_HQ^qlVd@9j-].*BEtj#m)Q)LP*9&Nq_lXcI#bqBclNkhn/54q8JX+*]M'WPs22CH5%m@b:g5udCj[6rOA_[6lI,9^MPOX?T.NtqMs0K&qp[W;6REE]i)d!q?%=%r+Rcs]1Y=DV2J$)f(QOb?TF;6JmpW/?3LoSmgp[Hh3t*(Y:q@76Fo?XaZ;7aURu)a?%3\Z<YU7Yh/?ViMd<LG]C890)eOCTMN$S>SRC\gFSZ0(WFmUPa.IG`Cc$1*\i?!o1j>Dq3fH,.mALG7i;?:NrdU?+Y#Zt4Yk-nfM,N>e?>+nL2`9Z+>c,T4=W&U3kX#=u%'3$QjMNh`BaC_e@^HXf`W+<a!H<qd#Q~>
+endstream
+endobj
+579 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 578 0 R
+>>
+endobj
+580 0 obj
+<< /Length 1796 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0D>Ar7S'Roe[d,%Z.U.*lQ$jGA/=h>tog*kd3[L]`5a$O?/Q0>%>pH,sM&nT8BL&ccMPNVLbk=32Z(X#HE_&C`9J$[LdLBU^8pqmHY3dc$+&)!!&n!$U\T?ht7p$k/sdblVbeL:7kir"M)l;kIkm-U["Am=!(jRh2u(/2FAE7KGs6CP,l'@EQS7f(.qRMShiW'QlV4H3hho(%Z[T*LkjP/,CN'`[oYmC)2$[[3;0V)2+To@#k_bi-c:;XT;aUHrT@Va!c`45,0dVr@6n'8q,]"]M]hc"PCoq_.1F=dc=ne%'cCGh;\6IfHi&O5+Yh8eZ[B/q)f7<Ob]S';OWMCMZYriLlQ[fWdMn'DaNmSKDj5KHUee>b.u+dU3ncPK>LCo)A5gP<!)u6;IGl%(7h;rVn4ep/sp'%fo<n&b8%m9GIggV[[j;*A,OZ9*Z6_eZ[fi<-pG<RC67:16IDIkcqKecg!UFAML)bm2n"<X=jKsHddi?Meaj"/&b_qLNLS;`P6fr@J0VK<C0[P>5=(p$OqA.`XYu/p?B$iA9k^#@Su_2drODA2*>E[8ktZEir.lEhe\$aP/S?Fb*AIT8fPKK-N'ljeXH'VQ*%DeWt[U-Bs#*P.9"!ooHpfI?"DjtRgr6EY/+I_dM-QO0((s;nbq2g/f>;CYD%O>dqXQL8IK^umsBA,6;M\DP"1c!&(9:2M_)%h"UZ`tT6`qi#I`aTBLgb,F_#h=gNU-qDXLOfh7.45/]H@1RQd'I@IYLu9uhc\RRQbJV3Un#j_5EE(cb(/8k34rW31+n(HJTJ_O)Cn_oQ]$kUI#IK@K%>feSka0:+]D;NBu&2Cb$(Z%Q#Z1j#^%(]JUj8>+&'(Nh[uKI<`;PWp05hm@3Q>@DH(K$IGI=r.pVL7d&<q7MeGQ_mUNXbB\2e]JE3<^D2X;C@/iObN#a^mIKM:oJM.Tf000Cr9rp[FLW.qjXU1]Y!?1cS]:g1d"6qi>DojNQbIoa"idP<ZDZga-n)LZRh-6H5d`A,rX<&U4JX>p&m4$+nj,72$O23kOdD$+[eR=963.Ug!:1j0-^K$K)h;o;Ts-&32P.8fXQ-U+2Q$t$uSTM(K7)U6$"`"C:;eC+\ujibpjUQ=[Y4nk[m0a<m8A?JCQu<8:qfFG6c;Kabqa-j!]145EH'AggoV&A4lqd15O(G7$IiE*_'rUfSE8\.--@I:%+8q6%nV"l^Bn@d[9Hq;>8.j]27O\#,U!i*;nore^`r2FlW3B?I72LHZerSbG3/C0QoJE1$"3C9aWobh'UCCqhfe5d%]1Zir^k1^UU=SgFE=NZaXh!4VG)XdG^I%k];R=9f\%R*QFCGK.e:JL;&KM2/l/r&ncoI6Kh0.P_:kXR^+t6@^a;4jqLEr(mVF%EBIqiN-_%)oiZFH0:9>Jr!?=C=';p_Y/4&e5C/YP5\G1,,LX*;Nn'VE>&SbFfQK#@%j#DF!fnq("!12F-Qs#@bQ79Wl^b[9&AW]>nU=5_S:A3b#o>&g<QcrP'ne@-FJnkSX>S0G^2ib-M!PIYC'spel`r,$]U%D^affqC`^BHg.AmNro&'cHW?GfVg1ZIZ0hl;eBu7J[bfC1Nk3Ji=8ELH4ONnriV.hR7RSE(-p]4qUp'.uU_LV&>#OoCGO:RZor@UIH%!]\$#&._cq=s;d/I//:Ib!^Fi)kF[j?`Gd?%Z:V*,NE9_,AE!-f?HW<7BeTc`*rrZEW0/]?lsh>UWLA\/:LZ9uhps=3g4N0M1hs1WRg5n?lM2l]-t[dZ[J9jFK\NJ-0Z]n>/AArrY75[''~>
+endstream
+endobj
+581 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 580 0 R
+>>
+endobj
+582 0 obj
+<< /Length 1087 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat%"?#u3''Y_ns@(^5eA?uXp">?:mR+gi+XbQ+pirt-2?j%73NR`OY*ko4@9%l=o@G&Knf^h5g,Hml]ngq!^,LhTo$Yo&FbbFT:<oAKZJ1mM_=]&m]47NS(m*r=$V=<_[o/eSj6@cl1S\R.ef,rW-S+Z[%lfcjpDFO":$F^l>UPof%2M)H8-OBST0401bI(J0N8#o@kppm%CoG@toC?+('`@>Oq="a#WBR+t/-ef(:?Wg!'2iCIif?mt7Ai%Son5aUS?df7jn%"*5@Ai/5_<65@md\lm;cNY`KB?G6j]Qg2Rt)*;%G5&ZD82uV\W`1e\h&g(4Gp;-XQ?EKE9baS2Yl;">W2G4Z+I]_-+Dk\NIMP>p9W>?&KVG5CKY@KC&:+lm<+0]cpnCd3:T@(q"F"Dj*$%mB3cC8/2MP-+_Nk[$(U$,:Qur1RDX)7Hg4ispmc!m8ZH(k;=i[IVB-'!Od/$)7R.tdc/J6l*&B_LaD1(8Fe!!ZDY[/85f?XM:>/L)n\b;?#tJVEQ0E"Rjc)9W^AFP_mq<I^I=2qu>c$SEMAVn!-#92r/s(Fj46$%%:e`Pm46[D0"EL;+,7c7ig3F$laEKYq](n.?+V.9#RF_%hj`9&g\CnltPaFkj;W1/M:6N[58g>qu38[nr7&5+95E^0rh24QG'6)?0R)L`0ZRL788bjgFP.TG!Q/PDPVcsrWg<U.ZEF&?O=hIAU>_E%nTm(bs>sR]p_,cdTd$6GKeYj9N?d^+C"\LX1YDlA?'076#=t8>J/(dN@5NG,bH"GSrN/M?s@XV(_e8p<AL[-P/4g1%.O<W^tIlVt4Y1q0,*U:%'Z-OY=Ie2jJ*3\5A1["g_[B(9WPsP"M@!5/.\5+1h8;Ws8[4$<'@EUkG[:3Ksa4ZiI&(NZ(#;[]uj#ESK,`ugWPJB&CPX9"<D9+lZrZ@1CP&Mu2cY%%RfQF\3-g"7n&/R7Wad8E"DLTLYCSePfclDg1DE?Kf`a%,H%<:q^<_6m;@,<td(NWuT0RoJ[Kd]TYZbV4%+K]i@n6hnT:MH3/YtEDd+r)Ii=rlK,?sg=0I(P:1!iL?ZFYDXs>5fU!mUA?~>
+endstream
+endobj
+583 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 582 0 R
+>>
+endobj
+584 0 obj
+<< /Length 1450 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!;d>Ar7S'RnB3d,#COk!W,!@2P*&%b>)03lgV/l9<Q-AIFbLK;-$RhiG&po2$61ZF8Bs"J@A0qTa<!F.n)ShYd04>M)6M2,.t)CN4tY>Q&!R-gI:ALBpi)R]``Q[k>7u7]pU/qmRZW.+9@^rK`bT&6ngX\@W!,SB4Cm46r(fIA;b5(:NtW)oH*$fF(qp2hk[4]g"+A\k"*mojq.oUrr>;/G+812I'Uo.,ngks!H4<c/&b7V<n`L5QFL:&`>Ff3jqLTO\8P^)3=GH_98Pc$Bi,g'Yof81>.:pa.UPCmqC95?qh-n*(#^3`[-\.^2pKE,o7Na=N&##[4!qIbTU.,USQ$WWSk'5PlSuIXNP@l/qcpi`AQ-e8M`*qOQ',3b2mgD--&coBZ>ln/(7mAReN7bP8j*=c(R1=[c6D;_%3e5L0s%o/%l?6Y&]gR4He'%c$g1#0%!(lI+qPS5oZ'OWn?eUc[kCNEi&:&Fn`(l"W:YtTrpi,,^=U*)77t+TSF9f"'X]o2i>"_/tg'U0kA6INDr3r)Mk\`%ojcT4%cJKQi6RM#SN4Z>lsb,h1,3V5Hg>s7U<NUf/]e5B1eOcQ*/65O_a"(ZRiAc>5V3$oCKmF;^`=`7k;/r@-Y4FcL(lDbac.&Mu,MuD.agPQ$bid=4R/=HnPm/Qt6i_Ag6>uCl"eL>!9a?Tr)HE+"2_g5V34:"tIqa055]kNr<*<Iq&-7?/p-]&@nsm1k+6Er7Y[o"F.BlhbO'HVZ>=I1@Yi]l"IU6Lto0/(PqP7pJ97eeNkdp#Vt@"h>l?^DU9GoECe,B<QVa+L&jZoM5m8ghaXrBN;n;*H89s".7`X\89"YdL'DUh#&o*k)]U^8<A9ehZPo=goqOS.:WM?!eTg?-L/;",]+n"N?S9gGn<pUrH,<LY'm"1O:J*SHfaj1*&!2;?DZ'D,mJ)`G=.X7W@8G&)k3R8j>57iu]3ij'm\jaYftQU=R%0)/OJ<<\fkj]if%"?%'8"a6b;hN2>3#Fu!O+9c4Ydk)(.1Oo=omh;I'fIlO.$=?hoB`J+*9C&jqRI71]'j,mH!iL80-6@_uEK&JKHpYAPS8:B.FHl+UNa1f-*KrVrRb6#s^h7]J07M$1O+gU366HFeWQkUX)%DV$#a;I&EpgARDp)Oaq-FH^"$;+:]YFnH^<q4Bisd;:jqY+]L=rA!*Q'-0\(nO=7/\kPlV;nSGA-^5K4NO!K1>>f/0_U$mE9>Vi;8>/i,<%<F[Q5HAHk.<;]f'bq`MaJ6eekEqCQMFa9K8+URV(6cY8DD2Fp?h(c?L#G>;PK*pAT+\WY*_^C:+KC;cP:_M/a3Tq3XYU2E)u[b=$>43G0h%2)Ao/mQ@&ELNZqA_0O_rA/6cN3.+2DOp!m.bEb_mM!nWC]`,h3d!M&=$r$5S&mhslNkTqM,?j#a[Lih=NBh;Zlaa`r.'&"k44h>~>
+endstream
+endobj
+585 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 584 0 R
+/Annots 586 0 R
+>>
+endobj
+586 0 obj
+[
+587 0 R
+]
+endobj
+587 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 92.0 636.866 137.0 626.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 99 0 R
+/H /I
+>>
+endobj
+588 0 obj
+<< /Length 1840 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0DD0)1+&H;*)_<"TO<sp8b0=`p1C[8EQPI,&`p26bl#E2)Z%YG.0Sc&@h@2X_1[aUX&1E@_/Y'-GnI<P.]l,\6F%;[32R)UAo\0#.sJj4&S"O9-Q6eF2l$fgQZX"]#c29(:ViFg?>=L+*fXD6)03Ql[d.oKgQnHUSF[)h!S\1AE_;cPC$*oSBHGYpZ!p>dm0>c]n^`1/96X,=lsXF95"qg#'o(sXn6QXXs)7O^`k.=l&!'QVb2oU@T6]8N7"\.*a>U2a/n]I^@Ic!0:m<Q1ts'Q\7k.aB:_IhFTe6o"AscS&oMDo]3)YnU7-?5BAH4ppl^J<nA0<P;EfdYI;?-N$Df*:]'LWe"G<\Jg&pH,17P2@,IL&H*OFR3X1]W[3SO\:_as;REZQ:'8]5;BuFj[pIOB>pX59NEB4QQt9u\J(Ei2SfYnZU)b@X.X(*OAD^Ii;D=RTF/:Ll52T*?$K:4&qY08QBqpV=TS_AnK-?:qJ-b"VI/_m]EcO&5+C&n<V,Fo!afk-$"O"!g($!Wpmfd@[SR1Y.7G_b_aJOU!C(.0;-7+S"+#6QC!'.m8ZuG!*eZ9U'+)]rLDBB/'^>f!+;ucCg/7X&]qp]eN9=<HVQ:5,bU%AlHr[Ne-<HT^t=%Pp6c=3&Y!&Wc;C4Fd4>`eP2c(XhG+iqrHX3(-nh8K?#k!+`!G"JWgT>4iT>'>.$p,HGF@QaX;F89'\-!,3?8KmZ(6NR2DU**k$.H]J`J(-HW:=u'W&b7V%mXj<Q+J+7C5%G$[+cFM"2]Y?:HR^Ym&)FF-+WY[j,`Ruc92q/jX%Wu;F/'T'.QBTS1fu_geOdM6hWh%iFej"rFu_0+On/M;P!T,m;pbs&iT]IN[X[`kAO%'UfQa<KmnV24Y9oqMo$L13Bar2U5@5>?F?$'pRR=a`Zu(,n]/o2m?')bR+7REmS;flM_/]THk[qt2*l>lo?&Zfo&-!TZ=:SrQXpmIs&YX5)?<l8Z5(0".&8J>hFS'ulTtnLKqV4$%hMlnYW;7!uIK27b_p]GiQ$KN011N6=1jV$Eg7Y@+[La1:nZJYqk6/E<-:'59?!eN+'r;BD43,Io%W"RV%d94P%6T^q&kI7b-J'>XPb#`t=6=N\bL3=PHU"'-Ri#Siib?#dBNlC%?W:957+UZ]>-lmEr.0ar?E6d,U7Tk`%5S]uF$+kU1;sT5&);P7A:LsV;$,K%j"F/.4<FAI>0G8(*o=/LamseM.(15UT2qEm'PnpRIgNUY[^Hu";"l@)1!?>$%N@h%eFoAu],TPf$4P,P(:`rpg8a%V\]B<QhRkf[h/UlL-;nbd;"@q.9g^r>4]3+EcmoTD'ueUHO`8#s1JKSAPQ[F_bTunm.Ac\1HlGq/]KP.4@*\q\%Z\#R8MF\Z#)]oKo'O+UR<h;h)M*LE(jH-84$\!!Uh9'*]m3_[)pT'g3r='Y&E4fo:aCCQF)d!Y0jNrG$:3NTJ,F7I;&L"u^Y24Z`.!5ad]t&$ojLnf9(-7YcU,>rM%3k=S3<ZmP\>KYP^F)i@a@EK@BkRTReJ/PCEK^tqo/>2^0pU),A)]-9/mAZ&,AH7C"NVTIP%I+iZk0S=8,_]GW$3=Ah1R'h%B>YL+OLp!=J.QTQ[i5%jm';$71(^m3a#qaJI_$(D6=nM#b>HBcS2O#\\<.;BH([/@;U3lh/DA".2mT(RWGt^>+fdi$iof`.HAdB]@^3NU>$7mGn:_8";%J])'V'5AUPW&U(Bq_h^4hmmHC>9.Z"f"BITRT]*+*.hjnrL%8]PDS9I*?CnC]3?A5DTptUu=O%Y*VI^VC-Y-KA\]>SLI(^$YQ*o"_:6#+f\!FQ'#BEh&"o~>
+endstream
+endobj
+589 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 588 0 R
+>>
+endobj
+590 0 obj
+<< /Length 2168 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!#]D0)19&H;*)61`4`=GZ!;GVY\,&uA;A4)Ra?B&\1tM8Ne[J8iS)rd>T9FF.sLS?t*Ni#+e,Hb7Tfqf:l__9!l\q/Sg/48A^7AFA]:jq1sE1u"G9o@3AS_pf$j/Pl@*H/=>r+Pm\fi!JJ=[[[`_?-CjuGqCd1)MN#oa*'_k(s.*i7SpMem$4ad=KD['/Pe3bd"k/-\$F]VFH^CS7f.<(o]>n[@*u<'=m"nR=i'Z&IpgH]hWn<a2d==MAm.uCNRUAnX9H?FFd?=diHr/t2!R?sSeXB5dOD7LZf52%O_IjS^]iI/Mt/(8HR(aMGHHM*]VOYT5Pm;DY%L-M'5d"QQ)COW@>L8Z^K4#Hfs]TQ);"P'c]\g:jP/+3Ks'`d\kduu_0DQJS99L#K5F_BnCVQ@16tY&]lFVQOk53.UfmRU"b04Dp88$I`>e\H2gN9cnF*GdiY;i6C%;_J+gHHk<`rTA=d$!cr3g%',qI?Z83G3>pak;TPB_d5TV^?B3c7=#1trcrVM(1q""[;MoXKNJ"@2HL_9a^Yfd`"k]Qn"Sps>,3CED*H2]SN](1k/4-F>a2!B'a8.iC#5Fh()n0\$ph>R*Ua>os=/regp/@".DH>'c9P1+g3)h=1p0Flth:*8LY/c7[Ks_D!UY-AoH^HQBbJHZ^Psgoq5^!?HWJrXP_6nX=l4pP"g;iZ;$^Dt?(Aau5Q&dWIkp1!%H<VbrC$I/3ag5ej+qA/c_p:KhM*+Mt2$%ua.JXKfh&QPU`C6uX\Q@'_LO.):dr(mLu?2TUi!+?Ti)Z3>.*XMQJ&8^Ngth+1)[)p%%2%cn/L>m@:Gp_hqd<eJ+c>ZP6A\cS')/([qFFetbi#f-lTlZU$pm"3Gb<MZ4,L7D`[gTVAJjPlqZ=gAN?`WWo+rA"`m@V(:9KWoeCTjNMM]H*+e"L`4nXJhpA/Le-tERdmM%TQ-USqW8-</XCQn23oQ@)_q,I3<Z@Z5m:r<<WF;r3+:&UB/@LGTX@k"TcZ5b(Rq.<_+Kg)B&q?r'"Ir^,&@@ldMIAD\e[tX$Flg@[lMt`RW#sXA`miI@/CT0t@'.QJBr"bKc4Wn]36=dQ6"S)b/htnH/+W&=72&<`b";H'<7?<jun1OYBA]IUhH;]Tc.<O-7P8$o%V"Of)JsAbJYH(9rC.=-+@`g*Qnir"#bcm2B=.V1@Bj>6:&:gpC<"L@V+p`-*+FWTBL$OT3WuC=spR"Fcl:/Zg^Y&\fF4Z('O?<i<<sD^Rp8N89dH*83MT/j-!UWYkZI4n#IRpr?<0!P&N7nq6r_KB.FGoLJb+E-2A@I7KV.U4K1j31Eq(>NM+4#cG[coiO9'>biD3Uk=i7DT!M?#;XKF@6OD`L*/+F_]'@X:a,\N/>5PR[08Tnc,2SKX]t!QFuGL\]STQL,_p@R_>,(+IWpN4&ROECe/[r^2,jfUY/WoIrV\g#iAVcM^ld%Sj;D7^_iS?R_q9b<mE9M[.M58jn!fj!oR7XX0fc+O&8LmS_7GE[&-^_;@A`W;__K]*Cdh"0*93d_WPSc%Ptu2_!a&r]oT3rWV4SEFIn4c2K89)cct.e4U29"OhD<NBq-:C&[st'c#1nC@]-$h<R@\Z352Rm'XeQn'W@Z_E+*<>.mGqO=d!IRq.HEQZ-nO2tW-0KuFJ?T(d@tVnj.<8=>YB>!QmB)i*c#^m86n\;"Lr<-E1!N]3<(ri@kK-fA6pmNT[g2F0Ym>4L7s<uo]6i<k^Gq#oGG/L&Du$Fi_C/e@E8J?P4"f_f7D>m3[bVBjegj>HTP*NDo?\N$uX[t22,HU3oIclj+5e86*I2iIQ.:,#agW;@#-br4J_q9<6/(b9F#uBh<oEu5iN[T+i9RVpa;MBeLgWJk(,&N</h5NQ&WXO:g)?_QNU=8Q6?Erk#f>T4'!cLUck=GUis(=HHQV<>"Wcl0!ZW//5Zq\`97uQJVZM.(bM.`Gf,23q-(,JS%dT(ED6?Jaoh#Sf.KXA@]G5$+/c"5O+A<br_UT#]s2?SY^1E\>[R7(k.b?n?G/VS&]R4`,GkKqd.2VPoRl-9GO`(OC!/[+d[t>YheGpnYq/gtl<?J8F.7nmWXL\WY4"lL(N=cUTQoFm8!AhT`:fj=K8hf9"HsTE1++L6lL.?b2*InhPp`3,koIXoE[Fugn@>f7&Y/b$%LRN7~>
+endstream
+endobj
+591 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 590 0 R
+/Annots 592 0 R
+>>
+endobj
+592 0 obj
+[
+593 0 R
+]
+endobj
+593 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 197.26 159.656 247.26 149.656 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 114 0 R
+/H /I
+>>
+endobj
+594 0 obj
+<< /Length 1036 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!;b9lo#B&A@ZcHjhg9.a)0Y2bM1;D1WXEdci#;.(4pp!K5*TP^d$Xj(JH4P"^2cE:GR/mb>3sdXDX/?d;s%+:)c!UkQ4SQD%a_1GlT1\HYMuVkXDOmI%n^DHkS,N9)-/h'bndKVroAIDfIhHN*E#ZGp]Mdl[rC[e??thoeEt9N3>.MBjqX1;$>E]!t,D6CsMBm-HU"]besr(ZMq?EiOBY-f;MEB-BuJT'IPlYOjfrE\:Dem5($dEh^;>QmkD,h[>b3qT\4r3Ko9@_BoT4P`Mij,nl\7WZ7LeVh]=Aa7[\::tC:H;Zrbj)Zk2?G"bmm(D.<')ctpj?o/,1WT5@[Mjr'Da%OW4[^Q9V&^r%AW&:>+@*,S6P"LNW;F\SQYi^P`RE-]=]0+ZL@2$TaSJQWAZ;l*LOIh3B_nd5#m>o8Rr]orJK4*bIJW.:#Id`&A'*-X'gD]n*@5mCUS2QV>Nc7"Wa))\$pZ>]\@V6'n9HF60)3#Jb66k7-=KC,k*c_^f;KM$*R]l\ErWgqhG?dOlo4_sJ>nabK]IbuKQHI\K^ZtW6X)*%m>g'-NjW/6hc>ieRf*i0%gH*\=T&oEU)j\f='sMLYb$O]LQQKtrmNiY!G"ZHCB<<[;[Mmt*Su&H`djYgbL+d%'6I[5<8Q*'IlZc/a]ZXfR+0Vk^rH:1'J$1bQgTkD-(YKLUHBh'$cU#SS*2I!&c3kk!`YTh09c)jkODG4*D#g\QH*4G0_N<!;cq:V(]H5V*AP:jjUscArO%`6t>OZOH>!r_+6U";MQ6?E9"Y9gMUI`^VX]E&P40*o1_n+Xl<h8g2bK%D)#nq%Y:-22AJV>[UCf+qi04bQjKf<:.a(<l4Fo?d./:;&lc56@U7QYk<1#2;\kIDnod<SOT15Tj?b90n^4Jq;`\"J\DUeb`*s,S/+G(qhEdnfZcE><I%dj3##lr+M9C&u/<e,^d2g!r@8S$L]UBGrWtf+Y5o\X&.!`c3U7:IPEE"G2BS`>XNA%dFang^WK]@*WlJgA9i<K;9TrrW5Rl+LD~>
+endstream
+endobj
+595 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 594 0 R
+>>
+endobj
+596 0 obj
+<< /Length 2412 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!;f=`<%a&:XAW;"GA;&^08^W@/+`N`*BDO4m3X,0n)`>ZhI+lB8O6rq[+IECS`[Ua1@:!X.L?47g_ic)uPcSG`"kcsrYYpEm3[]D$9]H8b\2]n$:[#56,IDU=ju]h^9`la5:<D&_oXr0XJ(,3PYM>E6J2og\GV;K1Z;Dt4-hom=nhM;<t-eKTX>DqQ(l(MWJhVBV_&b;*j^o/P#2c"0elV9EGVG#\fJkeCDRVTi,.V.$3b8B^cG/WJ9<;'aVGk5#B0b:GMA0BYlaJg[;c@<5p2M_\5WYF7PY7)+X;EYPX,f:\Cd:_X(7cXrD.?4+AO<)]K^0\C51_mp$p7F]X5Un\Pk<[gk>\M_R[2kaY;GK*D[4dRs@8*ql;3e?%YPGL>A6*]77arcIi_`:L7KYb@7D>Pi"/h]pl/n>qH/@%[.1;V-bA22[h)Ce%cLm3.H/,9;Y?aP>PC@O,)/kNItq+_#4?<qs#ZU1%<Cq1-B7#K!W,Rt6e*I7K"]5#.knXQZH8Oc)_m)W=pL*c'#@p'u^OiTs0U%aL;&B5@J5]clP6r$(D<'5QXK'+j&G:6:!M&'D6)Ots6!e8dlC^@NW5lgp3QIRi'/Eq(@+OE#8\q+WD;h5!>DSi6Yf=$'rNIkJ44nQ/oGeRg9'SAKPF@@Ec\/!G6'Q:pk&cI`WL'nfbUU8+SG4YBNNZA%_aiFU!.PODhlK*.`'I@mEGuu4r`LnZ*AI;m,\hW@prAGBr!uW%8O<n//-'pTBOn:-^kXctC$;iX\:a&K*W:0A,JqXh[k!rN,S.bjEd'$HuJ7&m,&.V>7II%ZK8@N]!pqoD(aMaa@0b_AX.Z5e)?#f,\aOm0Y!hjbf\SA`#8H!R;(<=$Y]pLH7K?!CHJ3lpT;o6Pa&fh"YmO3KkAmdhSMOor@8E$DJQZ]!Cg#=kn9F)q0<FDi90L2]S3^)o8*R-C'Z^II\TZnj@Q!i9=5#dE+oHg"f*/C;_V&Y.&=a%uH&UkO"mbmtuP]kDsTN["G*_*LHd9N<CKE5h>s%*uH)B1m&l+6,d"LK#<"q_@XdGkX+WhQ<:[o4ES]%no5hdJ9ZCQW8/G-(KHPaBfU&@dNmR\3&`iD,$-Y4@Aa#TP1R/Fo0MI;3Lh].h&L,+TDr!qbkX$:Bj@2#fuP3IM-?m-*D/U]oub(%g--P^ojP,tb*@ikKh2IBej43Dc'19=8M329%IXc"06mf_P+;e:?nM(F#10nbRO>CB\OHIZBF]H=.UHlW4@b18PBeS2"3.eb^4g6J7AtdMqHOUZ;^b>E[r5-FN'IA0Za7'ugJM#35k5C,9p/ipTL>(8Ym.iscTI4=i=e,30IZ+jn9jq"FG:rjnV48.A`4J]*0WB?177\I@Y.Ml\aW++;K0#)G&J)etSAI2jjKI<_sq^;XBK,t"#a/_BLCqkb9Kg4Sns7!_-#Ui1GmHu5O#qH-s]lQUn[Yq.2^j(He-;&N,L4:E:[Z;qo&&b>#5Tj6+jSb@-;(69Y<F#5^cch0@Mgd7;TTjVh6,HfB++3!mFf`rFRU;0]5;;mbX,O3PNM4nQe^-05[LCj@P%;6X-f0Ls1+)Ds8VtbWVhqhXD?hMaKY9pa1n(P!Rp2&_%m8RjsK*:'ocP/ba$Jf;X_^.ZCf0/77lI[gW%_O=1&6:5g1n*^7o&O5D<N`W+re$Q)U3mY^TY&TT[U-5C[RUg[*if`>7h3^@%!Uo=0XGRj0nA_7*+RbH@b?*li<DP2!q/42qntM$X?Q;"-Jsj`I"-,tIZ;"Gde4Q.VD"rRSHrIo#FFa[Y!:^YK`QfunFK[YIlX35<S8a0kWQF>aX`2!RZ[!ROEhT\\/Pire@/.VZN7qr"in$KF&*++#Vr4iUQ/?)D@^GX*pG8#7]nUVCWh5'@Jk"j3PMMoARJG.]-skThnP[31&LM?o[eNMn%cFsFP4[+:?0U*.$CWj:_[CkZjtCf#A-6QA,haOBK%il-&`/ifH(GkrYA=?K&E.!]h0^*LEm$BqNg;[:cp^6%1Mm%%Dg6^GEZ(Kj!6%Hm`nKfpID48mT")]D,'1BI\#mTPg?neS%Huhgs\=0.ubM8"p9j_5WPb>Inet[>9]I'>,0LE$F*eL%]B\mq%g<G2;W0Oq"!gmleAmm2eV;e9"S>(C#*b:rrm3j'5^*P-*HL\/rA.t7[*e;NZcnkKC9k)?_73b4tW&<1Q.8-e[gmjV'_;kkT-r5!:Y=a_^ae@kBjip0s1(\W4V5VKUP?('Ik8ZMhL?c:B?9o41e_,!G]a;9P"OXMqGZ<o8m>_!BO=#I/E'=H/3W@3i89Sqp5ruLc5I/<:B@D;PY=_?*UNYN4I;=I./.X\DKBVmH>7*Cs-I,`d8bb,XHBZWl!dWA=,=F"r?EI[iU![3g8)3E1[=,B%jJtjO4RYe%[t(m4Eg8?>D<fSGWa4=3io~>
+endstream
+endobj
+597 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 596 0 R
+/Annots 598 0 R
+>>
+endobj
+598 0 obj
+[
+599 0 R
+600 0 R
+601 0 R
+]
+endobj
+599 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 454.4 647.866 491.9 637.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 219 0 R
+/H /I
+>>
+endobj
+600 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 276.13 517.866 318.63 507.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 282 0 R
+/H /I
+>>
+endobj
+601 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 403.61 517.866 446.11 507.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 304 0 R
+/H /I
+>>
+endobj
+602 0 obj
+<< /Length 1803 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!#\>B?8n'Roe[@/H24/2@io94fP-C"CsLRp-QSDPu_$#2*U?&Oj3)p=HLX(^VF'k@&"Ir.=FKIc&Q#&b#\Gp]>6X!/BX^7YWfC6-\=PW-O36Esr:=8+W)$\"hj,5+eojrlhYj,^N"FKS2cf;k9'1=ORj7N?$d2q3SQL&)p#QI]Ng=,bC#5+ii;\c2Via\hX7DTP&%D51a!,-8^8_48p=:GJ]FNXO`>dgViNgk0l%u"?X`YY2+t?c@k"=4C3O8EdRiViU6&[Z6Q,I&1?gGYq?e[//ZKYP$D0,5p?2tjWl*KSB_AhHd8c9++1>^G!oJ!EtW>Q*FCcXZe`Q:ga7IjjD5DR$'4#?e\aO5#V/=PJ\<#-?G'2T]o#h6UusR.<Y:06jPke)Q/%Wn\U8;<;Z-(:op&X@KIf\u#[k<="AK.5X:tO!Qc[e=H?)pg@2kK&Y,CFDg!/-trQ#in\8Vt!/>FX=6dX(kY1-s^0I2V%<lkgerajmXIde'QSP<01JN^&&ia?)s@f[5b_M]DU>6r*3$bXK3hq`h;R<8OFcr?`]*eXoqT@:0gBl]A74Y0rrrtcr:8A9;_@YB<_`-02u"\kc%CkZ^*Nl;R<Bg#ItnU0OMk<LV#XO*k5:KL-YFF5:,3pS%u#nJ>3F"8i`9.ZE7+?cc/Rf7P][G@28TIg[m"YJq4BGa^H%XmaJm14FYUb1S[(XHEQ]PX0p2sUXheJp)c:Dfn`%A_.o[FuV<SFA=CJ)@\N.-c>gi[ojl=j@e[EQWEV,lX:sD%8pUOHT:^N%=2HS%2U`-PpLeRS!P+fp5VQY,:%;W<dUU\Wq'O:pVZ3L"TdC40[F?LP)!<gs<'#1U'Nb;eh_J00,=uX4b8kOF+ieA":17b:JcBdg%4l_:kp3dWB;UYueOs4h[J8HCU3K<a$/doODD3c[pQ(R(#k@N*N8[[2n2:Sn@Mdc-UR]"5).EU.n.M7dp:FRB%ciq:JeAcF,$E/=MF*Uu></QI4@?QGaOkN?09I]5JrpmStW9N=El-HOVmhBsKai`bRKX<mr<(`OcYpIlE*.<W/oIjC(,^A+9Zi![g<Q]j?=KR7>"g5kDNagZ3F3dqG'Q'<aUuMPTiQ+k\UD;Jp`pF!SmMmeG-nOZA3I9YTK=JA?!+duakT1sC#2GSe]Ii?dsDjI&JI;pFo"U6YV8jI:B`Xp=_RVI?<tDZ_CCUr@W8mT&m%`rg:eQ+GFsckgcADNYPh!SSC&9]Za/O+X7r!n&nRSSn<C^MG=RjJ=m@(.F@VN5s`]'t)r`@n>"f&2Jgs31E*DM(WreeV@NTc+gqrkQ=rl][)=K05/#nOLtCMe%=&1ZAdr:q7#f$QuSp&3B:aSmgYZQ>(c:>n<bu\=\OuL[P\U@5M((<]_.qtW`\I&!j>a%QVn[b%RPJ#'RAC>daq5N>;KrtO=RAmIRfqb`HZNIDV/)e1QiP/O`0VIWQ[nOj9sS&'FPg6jbEtPHiLF@#nf^S^'7j4:(fb><M@I4Sg>kQ1:#;n'a5MgDmj=9kj,nA'Jt=,R9&?^3l6J*Kc]pkWju)$d%#MaO*mFTn,`DrcY&5(6G#J0M+B^MQURuH*n_b5A^E/q(4dI!U.@23L$cQI5QaY%.sgEK^'o8u36E6aL"lDKo,i?-U=g:c]=nl"%NgIEE6i=J]>$<A=scIEq$J;J,@L(.n*%*Phb7AOSAhr3QV-BJRFVfa6IS>Mi[DVR(IA*>##YVZpill-AmF7#/1$894V8t$Ka(^UGmi]2@DOmCO@N2.INF0gV2UE/3:E0$I(KdK&t5\EXAoeg`L-B1"qaf@~>
+endstream
+endobj
+603 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 602 0 R
+/Annots 604 0 R
+>>
+endobj
+604 0 obj
+[
+605 0 R
+]
+endobj
+605 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 313.61 714.0 358.61 704.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 199 0 R
+/H /I
+>>
+endobj
+606 0 obj
+<< /Length 1937 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!#\D0+/c&H88.OmAq=VH,8&nk60N.5W%"[8<g\NWD>RNm`/kCh#P$qsSIbQY7Bi0-0Im%VCT/<f_DGmB.N'Kg-EfnqL*kqTtiEo\nVV%X%P>LQi_HdErgdkg5q4^DrjE1;4`8NSjS&6d=3$P/B+,UGOF\L\&!Ic]3b;LAi915dn^ha_DqPOt5sQGem/eJfGR(a+>Z^8,H$BR)aU"P7h`HN67QY"f33bdfReBKWBNC)6pj.a,BOb-d+@H?=Z@C[4mSM*f=(-JsSVB8-:es`E$6H6/1n>JUShq0Nd^Q,0,1??-5aaM[Z!7o#kl2H'GXLRNiM,//D[8Mdj8R0c'7\&^Yo]$8bMpGVS0@A+U(q?@BKVOUk^-W?A65"g.6<'pjeqb?Ju7,LY=7Uu;s@gm*uRMk-8-?/djDo?>]iimFC>bUslV4[QiA,jn/%H8s+Do[g9:B0.oAfd:\QRD0u*/X_L2aDj6#>;BM!cgaKbT.`&:aimijhXdXL<ahG]!=gH$.Sn</,AJPZNM_b6EejC'<u76^!3M^qNs`X$iE:7;hTETbaMm=6c^P1^Sob1aErK4tCq9k;VWDukFK4E-bW/`D+_FQ>"ECM$?d>Bb[RQ^C,?%rhe2q.dBfAoF<LW.tRSJ.b3S8rHpH1t/(ZIMEm#n::<eN$Fb<d4NLZXX>d!_,]F'a-=XMe-C:HasB7CpP`<4)%ig+?\[3Lck9ZGH>k$gtK&[9r/tD'#=#O1iAtWsTIXZTMYbF`#@d3":KQf)m?f&W@h6iD/ud^:Bk9ABW0G!H5T`fb)M6N_>aTe_]'!+r!:Eh;QBb_*!VfW[<MiY5L<JhVN'_rE]ZR4CWUG3G2tH`pZ-P7G"S@NW$\SJPJ=c;?p0648OB`3n7+V*5dDY?'o=?=LNuF+5RLa%po%U@T]K]ed3"Udre;&^73KUCp4U3<;1.OF\?=$JD&,Qg:jsoD6MAB2)hC*/@4;I`FjP2N[AHgB<Qa`H:5a2F:tgt!BJ*P"FLY-K(R3+\Kjgs3sk=HRboPq$gH+IJX=_E+QG<Y0uL#hj:CA9@35Fq5D?EdLD"oVYUHE<H_<c]'6DhFng.*"ar/'FJ3U'aVU-\B4/^D5GGNBSq*Bj#4+N8R5^Fdadg99&d])qiT!->OH4.b<7SDP$`C]ME".LXVai1Rgd7"OkdS[IVM!Ye48s%%OD&*jtRQms_SC%NP-kjTGaJP!J>@,>N,2-pmlu]TAA=G9R(E,W,U$B;$L)_2nntafWYUN/-1."i0g(&*\f4<KZ>>8#=-Ec/=RdE#+lD!([[W8#uI8X(6\j>+0mpt+Z.:MGOS@n_tFW:V`oGmLXPRE`KCUb^b<,(5:;fecWLGL!#:D]iC-!D(BRs6O@N`VXDgrV:-Z!NRm9!'&*n5k&;agH"g-F'-A[+5]8,VJK7]&Jj^:XL+X3$-h`kkf9n>@:8mng&s79qBPO1-6A5Eh9,+DiXm"e9,>sFpNO8->EQWoV_hbSjc=cG8F/t6X>U(WfF!(%?7[4D&e8)jlW4N7)pK0gCH$"mQjH^K<.GI/_TZIl+SlQ8OSt84L<pY=';o:j$GsUHAh9i,Cf5>Qe0AqdqcABs7d$cM1h&IpnG[@c,oPK*Y^33I2N7nRaR4B`c'Za965b#,Y5N'#"95@[:e4E/jr!FX>jna[.?\&2F;F(1DNS1O^S-caQ`_r!6ak(QZk=b`YVMd!#"O=`V$W`Z,W;c);UG!FETs'p0]s#hb\!6`rU2=ZkB!&JUcNQ)5,%0`V=K?O3qa-cNAFjKZ08,Y'0mijE]!.+'uXF&>m9;Qr-4`7Wh?DISu^4p]3",@dWn&W>trWDsMM@e2.WEbR^n/*5B;JC,XXFXW0.Tk,3BD28sr,8""uOJO(hBN`qJ)&Ff4eKMr6K$$+)4KCHLWYmgr6Ko"g5F`<*G`Uo1Fe_lo2;?$XMb/tP~>
+endstream
+endobj
+607 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 606 0 R
+>>
+endobj
+608 0 obj
+<< /Length 2086 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm==`^''&:W67@/XV9Kb=(<Fe&"`asL>LmF]?]WAkCo7MZ^K"ct&!YMTNbe%hVd2p'7e0[nLkf3_=sIlO4F4&_4e+plPB,RI6k=chRV/D(<2R?C-P;fEr>gZbR'#C2ELDE&D"75'[khBlCn-1U[rFuC,M$dN*%;K"tSiafT]B@n[g.X@)QD_E3XHlCG'MX)PdOY'k"M@kh[1sI)^BC)&tF#J3pYW9XfJrG\uUA\0WD#D-s.F"#UM@\kX2b0Ti)X"q!T\7[%FFS"Ka&YiIC^ji!2b*oW(N@T#VTG!u3R[WMQ[=M4B!c1tBq,_(<8,VV97:3[@9Hfg$t=_i>q./i,5^We@EN3V1igDM?A:,t7(<AYTia^kX^?l$=X-Bfn?MAa$7fSM4B$_@0_p=[T`89E//Q(VI7,+bHo?hF4pG>:_sc-kAY%cM0I!L?\n"?G+#FI:\+&#]+;XB$`UKO6kA'7n!"^D<)*6E]2KL*"HZm:AR_%0\7b>h9`\$!\I*D8D%ZkG<j!A,)]s\F]nJL5C2N8`]qO`"IR);-*2]ZM!;fG?eRM)^;!!tOWa*a?cS_<AtNS$E)qTk6Rbo8DIM2^\f9u=hiG6OW)P.dBaX"#i8UZOsc2^^d_n*WEq>`2ZBf?W1]$@&0aqfGleUFs_X;6'LG&!1&TM_00kN1Gu6SdkMM9.:!r$cSEiT:tV'`?NZMSeg#A@m.EBEh8p@@\r98.$F%uK>F\gi7u?Ol99kL31-KpKWR3A>gV:\9\)SD;d)0eO@*j-#)q;*M?>34F0QcVX"Y'M@CHr8T$]*YH):U]7eRR%c*.bRG_OpIZNYR`,/U@^4]#uQ9dbfq8NZrhqJl@GH<oUE+n=@/5$VED^#5'6VWpR5CAk<M,$@?#3C>"C0Iou7jhGQ,N+Fl$pJ(hoS$A6$O>#7fUk3>$,oN-t0bRX9?5#Ppk))oUXjXknP@%!?8LKh0f5#3]nT4dWpc-"?(L7bXb2*lhgQWcNRSn9tBXPKif`OQl-]dKf^6g9WS\/D8jMRu?E[?=W&;A@A+!jJ>=d6uM^^XbCpKXo&R`0)W"g]G"k]t1Mh<c,)I=ik.++lG-n.DCp9%WOZ$EfstZ-p5FBW(1O!\O^?HZj[CaMaWM<Pes!P)ZVAOC2OiC;nme,!78gA<l20k^Fi'GcF)b2QF4UQS#2gl14Z\BYDnlkm3;r(\7%IFtrpamVb&Deh!XbEA!s/EK+FCbVa8D<>9dm`d]r6.]9o&g&#ks09WCME,S%U*rmKi8TB$qH]f+.redO-,Pr!U?E;t0OnY#RSgMiMkkDgu#4o<JZj%n4>WctmbHlQQ%gl9hh%f(nL0`2QX8oHJ?**Or3qq[VqA&a?q'bBV84=eEggdlGWu,+;0iiI\U:@KtkUfEt+bA=J_Km0SBrb<g^q*tD%lRhh_KUN^W$6.1FZ?7Z"7Qln*_7!#ja*D^3^p5G*LZPh7i@[m;4?@(aQ'.ES8R,\I-B0;75c.PocBf^/,LZ*E!J\2Y<tGD38W8@b,.oZ<SqP?EH*r9r+11]=,3b2qDj^pXi[jt4>ilu8![9t2%62t\tJ:'bXC20VC&*<R#O:jrc"mTE/_,+,'pM8hVDn]\cLYdoQ#k,=!G6qFm)PqK6EQI<uZF/oD5)]@s!]$B'#D/S>t3<A=ZG\X'$9aPF7o'738-lke6$3:?2Har>nbc!&/F>r]Ta#l@.=M2-JCrmllp\jn@!*WY&77:1%iu5]g=u\;/5k-D,+Kn9;>%/YE-?q<O5E4r:=7Y2ge1m>g7g1k*R`8G38eEDK4G0l*\X^Y*"5<#C%3!r6oSQD(c\HiPs$WrDRdgI7E05bcr>hp1,"Sq+5+;$\K5mH]sf%Sh<Z.4?YP(8+4eam(gg#4.%+O_qP9G_KKUnpG^@RA=qmTR]`Zq'NC&!HF;.omBYShN<X@KpW'D?b?.Z_;2^RQHZA'X"]_P8QU^_gV=b49j8Skh*A'!<D7#gVk:`g$sZZNOc'uC07OK$(2SUI8P7%q;DA>1VZ'lf$6"^+nM%qY-S0_KOYp&n$0ZW+"%g,(O48/IfDAG30bi(Z<aj+Z>PAGDUF(tSEq#Vsd(^FpS,i~>
+endstream
+endobj
+609 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 608 0 R
+>>
+endobj
+610 0 obj
+<< /Length 760 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm8bAu;j']&?q>*>;JQQNN#:1bCGIE]'p_*]$,/7^!0VoGU>'@M>XjTe<f[pdYnF*2oV\b@.NE>&hZiS`l!6gbT(^ucKI*s<!]^^,]:E4nNW,K_1)5Y2Lr^("ri<)%Z>`B)GWof:=LGsC5K"qAMeS_uNTF$6XG$*l#9!W-W,)$^<1FLZ5X"D@o\3p5'W@g4@_i>12ZhkJlqP>l*sjO[Jk!JI)*?r$#3S3b2BJK;]u?E#,1E6ufj(-L\7!o8ldI=4%[beJU09KQ92%r(n+SG.F==`Bf%-eNopmni6D(O:K2ZE;pa?h=9H$4fLj[oRk^_`8p&>_/#uC[dEplS)16<-$N9+YJM`e#H)0SB0*R]o'(gkJ\jP5J;A'`.b;AqNu%^obr:EUnp)nB<g9(nr:`s'BX=R%VNtIeIrq:.9RFI.[DDkf8'q>+%oQ[7f*hc*ht9G;'ZiLWbhsbf.aHdlcLul\0ACM=&S[;MOgLQ4&tXCW`!PR=0-7WjF<S(.,0VAX\t:X^MQ_GQoL7Yl(A_p>I:bG74BmWTkiCtAu-MAf4k9aH2@9n<V4J=P,d5q&Q3XN^qG\-iX$B8KCgK66BNmPQ4?"jA@3QO3TQ^<MKcC`O`[PbkS'ZBUX7s>%$th7Btc=#l*J+o3a;;^pK^7tn!:?kEU$U5L7a0W'*FmEe%Wi#Ib2O,?<S\b>O)G`Hc;Fj,VF-Ue3,E6]lQNBXEHoViZC%tVp'o^4j!Y-Cog9Kp#BtB#P6RB#JfM\N;~>
+endstream
+endobj
+611 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 610 0 R
+>>
+endobj
+612 0 obj
+<< /Length 1983 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm=>B?8n'Roe[@.TW,`.U3!]A&`3FgnuHFOHIsGGjj2!SK0Gi.;prs*g$==@XL<dnMsp+<_brbBIjp)h2nuc;esZeJ*Knd?N0L=#B^9MJL"tX*L^_3f:[Q^7Mq$R520-%H^ITDVr2%k:eg\CAa(pFBah_jdY90"Z1'bf4pa+4ce!3B""_Io_b(q!o$E`:c)Le"P\c-OZt*'.JZZQ+4hcsK.JJ'Ld5;9!IMFNZ5'"*q!aFRBBMqP+^n']mj+>K)4u6u7@E5i1s@aZjCq41riRAT^+DZ>R-'B[7&@C/=3<[4*X?e;X"4JVMB3j1r$#JY8D@>f-RI#q-i$U`'<OsnhU6oq6aUrh*65?agU:;HkekcX+Z.K>K?,e*gT`$Fl-`cpo_.<-8sTbfNh?hn3Kd7@>I6C7!?(tC2l*)JYnmY'"<b;$ARC8[T6)*/#/uJHPJrpq]CoCG='cr&ICULE;d_G6TL2E'Z3a4<0L-pf@rQ4kG)Y]d)&:p!#&jh%2L/=9\XioAIM\[]q6;4lJfM_:N/iIrAJ)Uo@#a6WIi@*JSTg+]1$%70_J(2R7`],'BZQT]%?]a-$/)a$1"/QYO?I$Pi$q9T:+T/ER]uQQP#;"0TW[k=q'5Yi1NY(T$@P\-#gtQeU"A%`-C\!"Tsj?/*Cu,HjFM_(MJe"$&0st?\F4u`EE\Nk=iRJ=g7%FiMGgO?4nkhMWQ%Wms"at\i-l6qF`U?8QO'I$pGO\MK[_+PjgOFCof#06`h7%-mW'QXkZ*eN+UQd'cIe9Y5*$8rDXK^cEXO!!^O?(BZ3sZqOu8o#bN',;VLao;L:,ofR:"9Yjr`6DN[FTf1Of;]hcCgDeV#L#O^U,#?kqSi&>WNNM+I-VP)5fbLjg'^S**7sP0`J-)Y6hfs3:-r0@;2o&4rakI;"pd4u6/Zecpa&9QWgj<hFjcbIKc5\tQ]D!%JN6(q'Ik/'Z#l1bQjiEAh22a&&<BD2aHIXDl,?Vfu3i@+b>BS.E.d2&"3%oRf[n4]e0la/'fMd_uf.)aY)cQeQW#:QFuS6Z^Wb('gb0+\ZfIPYu[$Ns`8u)DF6RiNoV/nJD5\>YA(8c5\H#LJjTHZ@R)n\e2i1/C-ZL)9oKsHAmI]9Uua5b4@F[iNQcPNbZ!>6n3R5.!gZ2W9N*:%NnUO;j)k!2Nf<MMIlbN<F(SiB)/e`"-B+JmO#oh<+<@6HaM#Q66LjU/kVLqjl(#b3#7isJ\qGokm=3uZ_kCt?^tDB#6.qg@(fXW4pSs"M/8728?17Gn8-`((KX!^0!#7;.tdN$C@ko4Qt70SBoi&-5XY)UD,d82$fqV]-4fq<o^:3$\ZfU8=YJH.MRNA,ktU6[_dS&5k+Y9LHcPY_:=;lIWdW*Xc3JGq&WhifBO(HY#WAOslnnTk*I78*M2X=cSdsBi2)bGq<1:k(67<j83S8.=JBA$HI&@\HL\Lh<LuhX+m[;lb>`_ZdcsoBqWXpJ]9S0\8"lAj%`A3cCjtN4u1IK*W-r*S$_k((Jm3lC5m<_M^(cQE!YB@7&/#_4L,3ZB3XWY=oS3I5D%IS25r3:*^a6s:VdtC3@XJrs\okFEqDU+JHm@*p9*tqBA/7!InLM`[_R*8gDeZ`#r0bqldJc]'F<)Y6%E^0@ZH/gi1@@(LV6l!.Nfj3jX4;8VB/7_BnXes`VB3VgE*ODt2\lgCB=]Ro@>%&G,gLt/JCXA;r(X"pBA%GG2e9g)f]r3L2^ZWs$B"s)OH`4DM*P1"me/c)\Jd4.d<jLQNA_G>jX/<h0:E/*<;Y!@3*nTY[Hn()-U*TC*P:^'8B.#IOb_<\>iG4UYBT,JH_VYWNlJFZC:\?iZVGu0q%0B6PT4"H6)M>9W.ApP<+>*MkE9R;cDfQAka63LuJSBhoItTO`?tc"VOjL5j]P?cW:BXbWVJ?m6#VIo2Q8E^,[9OGkKJ"j7Jg*PJpdGaCB58L)KdM^Lo(=nC+ht@6KBhD7GFea6c:q46~>
+endstream
+endobj
+613 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 612 0 R
+/Annots 614 0 R
+>>
+endobj
+614 0 obj
+[
+615 0 R
+]
+endobj
+615 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 340.28 563.894 395.28 553.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 346 0 R
+/H /I
+>>
+endobj
+616 0 obj
+<< /Length 1278 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0B>B?8n'Roe[@/Q87_u]s+`nS#Pk-CK4G*B&]mR*l_"D#E7>D8S,s1S_7OK``iQh>t9M=5iTU@0)l+dcL>P91GGq(B\:f^qtS:Z`?o#/rbML.g[u4S*rR4bGQN@Ihb*_i#r\*C)3$!o/)DkJ=mqqIo<*&8FeRI3<M9Yag;]>ta+CDtCt-YQ`dt]#A.]&-b%?]*[/baMp]2)dgqJ^>%c&)bAClctADuf4eAm9JNiMC7>r8)5kI9@_*<?fj&mqDY_<IAd!Sn4a9.Z%Zqg8(>C;K"]InKZD\R@(XoGZ?P_+=#&LgZ"f1AY4bX=2!/nMp9.BG%*h.,W?7&!<$e+1<.a\oVLr2_^nr9'5[:q]Ld$]pces,+_#X!tmQ)s,q&A!N$76Xc)0&mbHGshGW(n*JS0?og+ce#5p]>%G!d],HHg`E&OV.Vm2Grb@3`cL2^(Zk_qRPG1[lc`Q="u3`n8Fn*?lWk]aV9NF+0W7aHk)UXp2_i0A1q#j'imTe!l"hY4Z)pOB_ZF&AT$+DNX:V_r\RGq8+kTPWTZ#a;<g89MAjWKpOI5e[3R3`],:bYrdAV9Y)`=3sj@VjHL/Gg"%0\C@c*f$5;=ePPhSY/4s0H\O_.^!_/oSm;b:9.8]mb%\`!%pHOIXj$=k)fBHQ,9Q9n;JApHC`'l-6gm99b5p45..aT5>eXpO$9Ab:u:cC2ruL6Ro@9j+(MV\O<k#ISr\*ghjVr)Vu7fdO(Lb@2>gWgP'p<Z#fk,;i@U'RbA%*==mttC9*5Y(#pKL)L].sc_l^kbn2%N;5Hs---EoG%jg=8d\e`u3f?&PB0$dWZeY+BF4QuXq2r#h'l)5(I1q$AnLQ7%Wpr2XMr'6CdSH^/j$s^d"Yr8h23P]:p?A2IGgson)V?+RM7/'I9O_qs0u??h!K^'on)HAB:u5#Ak3bFCKf__?XB6MZ,)tkpaqhW'.fJ/*O&Wf)r)#+6]re;tMu!^lrt:FZ21pYD]'<3gj.H<V"koFib-nQe4RLduRQ<:?U#mY4=f`8WQdA!YD1?>L"'qee]&mQfHK9&@oT]fB<t9kh+'Vc])4)7&/=m*olue(S6Le78#Ni>^i$K9['Bcs!Q:BUX[>]/ROts2f?Il52.=<N?^7=5UD_@<?A!:Mr@+ukZR=3sPq_Af0oaV12Z`@k3laHiG6[(^24)e[@O@RBe6ig\egLGffnG*)ldG:poYrpX$A,8U<:rD^!(V]"(;$>+3ON1Na!=tso%E>`R#PTL:^>=Vam8.%Y[!h_H52q"mOotP?~>
+endstream
+endobj
+617 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 616 0 R
+>>
+endobj
+618 0 obj
+<< /Length 2207 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0EgN)%,&:O:SYj"g9YuojSGrhKn@X4,smA@=^1_]$Q-6\9\?;uN`lbDmTU4`[V:lHbB^Bc*ifKFRC$bogarH]M'[V&d`@X2K%%nF':_4PRt%Qk-$WG/tqZ,hnXY9WYkR.usNcX1%@H^_e!nMeX49'W:Ja2V1jnHXmB%GTTogkhM@EC&ZTekY!oCk&5q9?TXaGa3:EYJc'XM;L`!A9F.Q%q8hJ81dk6b%c1WUhiKIrj&1!8#M(3Uu$;G&7/D`ik_oMF0meln<EU'<]sSZIH]7:%?N>iTdRY)WFLf5#iA>L<_T`W9jQnW:1MWf=`]WX,)i?/"\m@uB=0g7"cAin_i`J`XjQ&q8&\V'Mcu*J=X=pQ\l?Na\,sru<Bd8d<M#FR;EtpJ)h_TbEqJl7Rjj,#lR0)E*n!P^oY)@/[UIOmanrP<S\/KH24Os6;M%8eT^N-h&)#CN-]3o\VUiAcDpegu2?Jkq*l+OIVkY.b;P<fce!qU`?BmD83aMiNB+((t<j0[.@ASpi%Ygb7^Kq"g5M5jR2$:WjQ:o%Y_UAV!<Al<LF=dOPB[cii<]2F!QV1LR@Abh,V9Dp("mp<5f/]u80s,2BCJmpDnHhR]Ue;.`(&b&(XIe3R?_FS9:c)IT<8@ga`@#Y.e5_oJ(mBi_ZDh;ZU>.aeb1N0&r-Td"djk7ipsVdle"I2PPmD+sUp>CRm:=6c\4k*</UJBQ7eL0UO+@P5-_GHIj')"^A@d+BK&8PLQCXRja6GpI8].LH=^/Y@pPk248Ra=W)9orB>u-^^:$YN-/##iW3fr-PGttp"*BkeUbrnQ"g;t's*-">+I6TQ:hqM"'qfpFIB1\8,cOpp\+1pfeW6.!YhBl$Qaf+Y0)%G;P(+Xf1>40J6LjLg/Bk!Tj&r917^3l*2l1OtXg\9=k1\#"heJ'f1>XA5./O=$MTX-u6oqOZl(qd3.a4$#R'@'l1N$?$mEF%j(N:@T!L<YWAEp2q!_o03+&W[&CK0#O64^APq\>a^q`iO9O$?uY:^PC9;@mU`qU"u1,gJ@F!q;qNh!HJ67W.f5+TAQ>$^YBk0Y0&O2_Dh&+aMr7Mrp]Vt[[?;iHD*?i[PG=!MTq2-CZqa"mma&1/G&XEBA:$pEC?I)bhgQ@hmmRhgMg!!;.'Tgh&G]A_Kn*>Kq)bJ>iG/B&mG5)Mdik3BZ$oXWZNt3m@qLn%p!F(oECQOTQ,7(ZV]\iLAK&J08/!,$Bn%DIGp^T`?"CkKiGE&QmbKoQ@>"8`auk2SJh@)lrgl'Ec[W%=UEF_4FqY=dBaIc^_9P\&/uj#NGBssIPprS%]j,foBsrZ$WNmt^/&8M6Z"4g1o*Y6#uJ&:AMI=t88f=-P=R6=&XNfQhdXZK_j;(G.WcE@poYT(CB!M0NqhtS3_g3^Y]MZW12GnbNPF_FjEFL)#p%lPLs5kj3MY))!Kpq#OJL?M:Migo-nP.#.$Lt56KR'>GY'Bn,$>+1Gred1m7gf(J/-eMSI<CJJrhLHk>A2#piHiCPgpb"qG<)f2%-(P"SQdV(!G:\kAKU%jnOBE=hDt$oi^03;,:cYp``0ZHK2j8GA@9o:S-!\,ut.GL3DY78L]`lNXeXD'=HP#?r"C9D>kgmOV9"=P3#Y"0-=n(`GX,5ZCT?a*'L[%Pa_49kt*DP#2VAu.kQV+$3VR=>C(j+F2uA/VkFuQ#6JX&0l)J0re-F4,%d^q8NUlb2]@sFQa>#JL;mAk\\mdXhV1n3*?@%+hN'l"N3;K3iqV=3gj4kK^clo,Boc%b3kJ0>9rha)aX(D;;Zlb;<MDqdL;c;*M6%Jf3@X5MmPI7X""(9&eRd&7qPb_ek.RO2n$0V_dbYr`\oa+c`k=M#dZ,(i`tL/g1r"h>2M0GW[.!L(kitjbjZ@If8N]^l*K&"uk^&@]QR'hC)D9bZE(N"8pt#6Pl%/TpZ='Hi"Cs\1=gXsGl?!(V:cI*r89kB,AUR#;N@Umb:TG0coSjG4<%LuKqq$LSaj=pg=<T"XF\EGLIH4q)UUuUr9ak&Xl!Hc0M6*XNGTclI2Dsa"rV%V\>#"VGr^/W3RaYu\7HOCDXk;_r^'cIGZ$_(O3o/\q8]0B^hjR>(d]GP_%%l`HkfMr=I(8YTc:>.g*QrJ&ME.!eg[4[p>;.0i:uT#9P4?K!]o_-.Ln]mY=]?[G`kMhM&@`gkjN@f!JC*l"@q5,jCTGR)EV(@L]lse~>
+endstream
+endobj
+619 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 618 0 R
+/Annots 620 0 R
+>>
+endobj
+620 0 obj
+[
+621 0 R
+]
+endobj
+621 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 196.4 604.866 241.4 594.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 229 0 R
+/H /I
+>>
+endobj
+622 0 obj
+<< /Length 1887 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!Sl>?BQK&:XAWE;]q&</YpBG6p979Lqg,J4NI3aFc%GYtnoPO_$6H^9bE<Y.QZi.8=#kYuWr]R;]gMllPtn]i2+mFej6[;+L*3GApW=J)&#1^nRT.Lu>F#m=*pFs(QF9pb95IGIs<G1Qe4f(t)O0k^8[CF3<)F0E*r`m=+<r^Ogp8d4ago*=o]GDL]m+M,d(SqPoek[l6L#RNu=SLkO@\s*5T;A#^QI8Y2bu5=r8E/b&LE)FQDLNH*7$EF*(CAL!tUm4+l>RRE?e!_2jTGKV7k>B`.VLS+Fl`B;b,<!,M)Y;FZSak^j,S+M0JJ*/Qsh\HnoDm.Ijk9HGVPL5'/Q2X"pC^tW'@>R6C,72tDObNGjf(TN,>##pEEFKlPlU!HChGip$ECB)Q@nVO6SAmD0[G%-BU5^Pl4O'JKU+,#@cBu0ED4;>nD=\LV$'kffZq\bD^?K7igFIr_I[JGpa>=8KZ&F2QV\7`YAr(E-q<5uH.R&5'*@X:Z4JMpGV/[^_C(=C,e)F1879Z7=$%:;14P!E.P#)fYJaQ]<<gYd=USmPiS'#0oDB-C#'LEb_Ai.T;Y`u\'(A&l>;Fn9%%NHkre*F8kM[&uh*iLcsGi<n%*er:@8*P:b&@r"f2DQMPe+A4jLWDd:`neD#&'@^3gL2\$/=I'<cL[C0=OY0FjA%LCj%Ju)c/b4SRm/m8MFa2=hRG2)n5kG3Ag=?I$Z8OQ;7>n(,t[4.bqo&H<N6`iB.MR51PJJ-KM9R&dC?8.>>Y*%?%A`<X8E_[jSr)$P"Hd]l]tKE%Go##=$#anJhZDmaqN63),+\J@$&BXhU"BW,koIG9WSr.Jm$T,"6M*IHf^"n%^$$YD[0"7)#0Y?*?BDP`X\O=l<j!@Y/<Y5'02op>]o!s_q7DTh9BVWf_O/[ngeF9;s`(t`HI9q4)J(I[Y5^Q/,!B;<D)"M/^jbag[-R$W4/c8&5Tkm4:iO^Wo,m%4;tHa<csS])l4u%kL5eOSb`98*bN6P\6Z,?$*q39eJYa%5*pVDHpj$;(^1Euc0gkF(.!sX8[C3(S.E")Bgr7X3F1cobA$k^?OFh>#5Rbc\&_(.gJ_j!.He&pT@;jb*t,ZHn>DKt#/W5_qeqfF)AW)*oRQHp^.a_ENI\CkW;=cn"6Co7JOg7*r^jjW/@B'<(^>VV2a(1GH>O*.%TT/g#F6<6"[KB!&_i6iO:IT*qGpHo%O*q@(3.('-`nj_7pH-VF]'pp`V0_kL]_5F&iLMo2r0OZ@]"c?91[d+X36EjJXEjT\?DkeQ,#p`)X;+V6Om7gW:K)1M5knn\'*hgoLe;84PaUbq>"dgMpdh$)gP.q2+^nKK]kIH\GT&=$1&eijHjse`'sKmdH:43(d^frm(LnM`,88l_S31N[Mih_,%+4&g7_`j;ZG"j%IK>92f7c"@U!W*S^bf<U6T.+,KFii<bChjf",NTX6ruZ_333nY10#",C)hd4:iO#dX7QS![`+Q'\t#5r,1F#?sd2H?CegF34[cY(+2?9`[t"!'>sXIn\7ML0G(l=DB?hdTYBIW94V$>/B"#[$*H$!C,s\im:j1!cgkO;PT;rEZ>:"Li!G7S%aS"<:1%oFI*kqo@B4$^;l+:!LEKo"oqtjr^ic=bX,#adCM_`S(W]g&Fj[P7>T-9ZD_sKcK:074ej%\i+[Mt&hQAuDU?5W![9a%_#t1(#+_+4MD3B/rUBEG!Lh$90H!'(\DjaSS6jHJcSlaTeI<s+k$t?IKM2;]EScLEZk>TJ<8bHHt;]/dS6RF)$mrSh8Sa!tF!FmGr[t6.No*s%IM97LR%2R\uf8Jm8.RmCMoOW/P_kt<u%leanE1RRqZ.AbS&:S2;CuX*gAY+:`$LS)=9P_+Ar:n,6Ps5;_P$@\~>
+endstream
+endobj
+623 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 622 0 R
+>>
+endobj
+624 0 obj
+<< /Length 1485 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb"/'gMYb*&:O:S#R(P\5g0tBHesoBl"8=$DPCaJB_oM8<%P+%\YPI-rdIACCf4?hM_%a/I7QV#_r8huR5qWLrQ2T7q*)XK"8oj)\.6qE#CFP?9Zr.['ZR;XEMhPf5#4phEuiIdVE0[O/o'.o0Q2:Z_Id@Go\*a.cn[3BZAW;%F`#d?pMUk>L38mWUWOWn@%h#R,A"s-K*^'+L%b2t"2/?hnY%kKp!WbgZ\22lh@fc$)2Hp)c2Rm9=W:u_8%+><;*-f>+2k1,<'KF(SC*F<q>Bd+NN^!kO%_a6R2iO]@R2W=ZW)sa*-1bd?p_-q1!^!g]UsY`rZET+N!XW.AU,9$1lnE0hT[)Z(NGa9K.P8mQ6\#_0l#_-kSmbd'3W-RL8:#+-'9M8GoRM)j[VoKq9Oaq%8!X1eceLqRlB\[!4'6H5b6Hs=QC?L6G3a9[uYN\n],'qEL%DGKgQaXmea=>7Tdsk;QcO<S%Rk!dl<?9LI&YprQ'm@#ac0#Of4D!AX9@kk?795J-HS,IDU:r+c\muf(n/C0_Bl0EkO^3mgbTlk>WaW)C.a2E6c.>NAaMJd4f8m$)`0Z49rF8?%qGc'-(,T??6a6E=PK7'rP+hs75I(NL[Le$OYr&`3s8g3>OB/HCrAOc&`Aj723pV`cEkBShsB+(^2CoSP$;E;GOm(S@qdmm=uSE/.)4<e;3MJamBq/g<>P$[V45WQV!K[8dmdOdG\-$a.uLjBW@pg7'eN2NTG:UBGB-_B1iHBP)1E+T?<-KUUH`tbNE"V[PQDeO_`WcL0EUGL&)ZsV_c+`f\*Lp4o3r_Ug2,XP!II9,?2]`#,^S#`Luqecb'-[nU'iY#UfAHm_6?XZKfI#RW/NpF#>UoaNVXZZb)C\a,:#k8AMnaaJWhPNRMSn'6f5PMR#^`Ut3A\>q3,C5SgA!%96^FM.`TplJsL%-F]JC2JsH#ni@\F6S)A:H<-?=)HjCHXh`aegBZK\OH(j!)>0b6GS69*Q_PC6B.13t0JjI=?51p]S"b#89V/-Ij3P&G"ZHh@HlXKs0R`Z,H]:?K5i).YCmCRM.0]JdKel-FY$s7[=l6Rj<gR_*QmT@e/VXa83JAcl*tMFSfh!+`d9Qh+S&KdoAXLj7?$!,Fp:*T:Y-2FRQ_3.5#GEmYP`'0<P>E.dhd(SU;5#2:2kJWm6:F072OV6:Td"Fdga)VeW7InLL.(/!Ko-`D(5D6+<!8Gh7F>0^<('dpnE1N9q7Gbgf.--T.R@E6X0><[LWN`#S8kYl]:(1.IqP=hVN+>:Sk5h6W1LKlp7aU%F^mP;4`q*BDj/ghP:=P;\c#F*<Ui(-*4Y155e4TgPP,4E(Hc,>S-4Mbdgg8B^9a@0"8D)$<rF;@I$FPmh60")@;Hb`=]M.!F(mm]Sb*(TFCaA,*ds?Y`Bo-FWG!U>VfHT7VLp#2RiM2hH)QDVEuOs^g=X=m'b7=ZcKKl^SdG/OC@J?cjP6C*$XFEX'`~>
+endstream
+endobj
+625 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 624 0 R
+>>
+endobj
+626 0 obj
+<< /Length 1868 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!;egMZ%0&:Ml+\EHQe<2r@P)AE@fM&3iNfjNiV&T%/l[cggqh'u#grV*.+k"$[Ba78kT]SMe0S2iBHk"'d,3;N*X3RK]aRk3,<g>qKdT4mReTBJ=FS$qIZQ9AB(PL$/[L7CsPA/7BnI3pE9j%*=l;3o3f5WjKK,rEor'iE:(?RC]gfFdiFLrR)3=LT8CeSFJ,cgrr)&I7+<D+la/5]q^Nn'%1_F-X5#NHX/BSmK]+S`:t%[Rs0kbR)OY/62hb,g9DfpAa[LS0.LkRU<OUD4\NBGf;UiO$oDNp'Ki-piQRf#:$E`V$s^ES>G\+].0Q=q8YEP"FDBt^&fDTBGKSLnU;;bQ>^$ch^s@mr!\%eMA%($f!:O9EC/*TN=ZN*^kRE]2r\]Z6o_F*%1Y3<X!.^R%sJQqAsQ>.(ItUXd.mp54)3BF?$`Y8WoZ4*l]16a';eg!&/G5a0Ct+Z5MQA)mmr7;afXbl,F!Uf\u`*jqB0KP;j'=3?tc,WELKbHcX5](WujJRrSig#_KSgPTFJ&9n)g9W\qM$]/RL&[c)+*a1GL;J%9\)_%cl;^hE$?iJ`N1<,g&YdQ,2LH>8_8URO^s@PjM/fi!5,pIZ7:;_*Pk5*p5SjBS4=Y@^pu%%m==>a_K9sQ)sMcO?FT8D+\-Pihep$O]=4Zk)=_h*&YsBplVlPBbmUN.>c584,>U;/1)GR!qnB,`.L.g#a)C%X@d'2?@b3!#/k#QgNKMr$#1-T!#<E%3@Y7IDo\_l$HjiT1SkptPn[%s.[<UP0Qf(H$BA@fH]R)rlts^-1/?L+g!8g+#I#W7__?!O'!@EX!rO[OMi^s'-jplH5/IB)'QXJRPtq>X4Z-:N*-MmH:fNmX'^6Bo6dW8Il1[sf=C58@M7b,XY]<hYI+_nnM)I^'c.K)%,>;G^TWHlQ4FI[^!-C$Zn9S(%:$noplW,8)ggRa;IsX1[bRY83;c?a0Z:;d(KMk4T(Wtd@=$8>sZ&$#hkh1i),9-btC/0mkB:a?-"7$An:B[3PG9q!2geA6;K-JBEe*[$s*8h3-Pmt=^4'\Ye^I;K8_*K[YB:['$S&Y7S;E-^*VOGCcgKPl6OpQ`-_FIXDmAKF8=7bbR9u1k9eon?*cYaeQ(:"`c;Spd![r*8^,L8?jaZ2&k0549Ad0eMZdAjD9(8-'<`QpGi<PFaLf3q@h.ZT&$DMO(=[nP=/C?OWar@C`agFp;2Ge2,8ZJs>ZZ&H$6j-a"u+d4Xp,6u!&$bNaZ^V+$.1OD6J,f268Vl>aBVt+*>/7iBJW\Y2qa_bi8ksam#,\8aC02a!2'#c*Am60IPVp@6jmkLYa83GhK?,ei4Vde2.FG$@J[G@R)1dP!Ch2<;#T_]Zb_qK^gSY4o\p3Xo4X=eQ5SBWHP%$NU20SLcWZ@:M[*_"qp^I1qhq/e30^/HCjj\*a3X=B"+l_'3>Yocdc>WQBj*F(:C*,VCciHJLL5@L`,@&L,5Qf=l1RLPk0K?RD!$Y28_jZrT9&-RDO_>SKb&:N7,X%arI&Lrgd;<dCo9\[p[9ftO.FjjCITfMtl:GTK^f\fJrA4F)%._C>_,d]=MSgXnDd)gu$Q;ugljYP'+U\hdH!5]F9Jj?g56_n0;TPIT;GfkT3<;PpMP_t:]5XO^QoJJ_N(ib/[?#u[Fs$)^N=WCqg#uGXB]=_kINQ='SPSc_/%nF#QN:U7\91maFTBW<O=g.aD?sBf!](Q*55/+ei%nr*GALed8-;pbE4$!7=FaWN!q-P"rMHq\qp(+H>?!,`fXG9c]I'8-c$>CCk3JKB@CqaRf0\Qt%5JT4">l6NKd1+i<F,2>@i6EOcjaV5k$e^j2'TmdW`D6J(K2(\&i_/[\Hu\^99gtFY~>
+endstream
+endobj
+627 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 626 0 R
+>>
+endobj
+628 0 obj
+<< /Length 613 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat$u_/?#%&A@6WHmDU0YmCt^laDe[Pq#eGW-`3)0JEs7@'dkPR_Q%#8F0'-e.n=<Z2NOKnM<D8g#Y7],esH'?=s;mbQnRJ7h?hC(R#u\EItJ34aAWd3QQZ0HlACTSp7ZJWgL(p+drTB<==7aMg`hXYUSTjhKC2D0TF:mpo`j=VI'V3UnK37-uH)g2jLGD@XJ9\At?T-m-^\63*i+6?.Id2oo2K&bB7hFmsuc*8<O7BOlWMnCNG:h(@"3X9)#l'kZ:9akR6/o3[RAEcecpsj,.tbZh#L@h*S;m-2`MZTP*DJ@sjlO/D\Y:M&VuDR*Sq$N)&E?^n&b.))0Y^2*VuN+W1I:68$F:`A_['0-;)h#5FOV4'!b\3E[^u#?')kf"(95LIp^K<k9&a[r*9&H["%]J1h+N^m&fI\nXW_jrp689PE>IW8DlB?ju9TkIYg'*A/8&E$W>>+AQpFNZ>gbfChm/UJPTV"qeg_RNh3?0;7MI]Bf/X?^IbcdhDKY\TXFX+^mo]KY2XYMooq15sV?$d/ZZ^hWqc(SnoDlJa3iqQVSC=,/IICDl!o\AEh1W,V.`qSsUiZ?CFW\*gli:==iWK#[TtH\(U*]SQAJp~>
+endstream
+endobj
+629 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 628 0 R
+>>
+endobj
+630 0 obj
+<< /Length 1895 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!;eD/\/e&H88.Tm^^,=qgRDD8UlTFg,]Jg8/]XU$2e_U*:eeW)6Hur;3%$=ZX]i-$MV*+\3_Sk4.lMkMDS5en<lI"U8s@b?--)QLSo`$k%N?&_O<'=J8;+hcOfU:Tm+VgfSfe"m`A[KRDkV_r?E9U6ZCD2n$2DF2_fm93Ct*XFC?:SjBHKoY'=iOmF_ae(RH$Vb"UE.p=!M:A1FV$\]9j4D&0>6?Ddh<D;P^i_O5\-.)8QfWq/?cV&rX5Ep:f#[)_Y80KHsQEdO!?F;b3H])D-`%k2+=C.Eop5aL=+5+aC^.)I%R2ck?5]Op*IN]>L_B3M!&.+#Z8G_Ks-;/T_+H.VB/:(js6I_:OADcWGhYRu.iokYTH!\<?<Y0&CQr5[GR_:n:e4^)6:G#()NBoCu=Hr?H9/U+%2J,([^#YY,isB@.C@(:U^qobJ6_:Dd#_t'm,<CSf/2.n('sLY"UQ>@`?/gKU\BkMOG9Tk?'Up7,QiOZ4.@6\uiCO*@cB7ZdqGQm?B)P=KU@#cCJtf?A'IdCL.7F9)'\b1%KL\##eF0;EK4!W&n=9%X8"ZRgjhO7uiYTM]p@_p`2VcZpi`J>p<D';(=3Scs]G)6c0Kfnn1I)8!rLfl,V)3ZuZ4>HFk>*:K_FK0bFJIpA18RTTl>d%0]$;h/:TPf]_du_G*/0MgU8h[i)Fu5@X((U[#\RJ?7pM](31>_dJIn#8g];Doo`f*C_%Ba(A:Kfc21SiQ*j?g[D8opJ5Z^iK1"3[E"<o7/nmuJ:<c'\0J`Jj2.'>;umCV,<5,Lu(6,7Cu()o]M/@F`q>6[5=fD=N_Bt/!\`f)sP%Ol[-ajb'kD<`\egBGn>75iO$+N6!`?![I/mc,2frc\g)efk_$4VA?,b$KhXqZWN#m)5TLW^\7"0g0YLUBDO0Zl:i'YaMIV!u`or6]JI@6[Y->YI1(cq5CFoHKLaYkF(+nAE-q[BIKPT_F*/I>X&\@#k!3mKgd6^@?(jgS!1:IjnTK,m<W'ERr2VWC90kQc$"!qCtAdmp2^m-mfo\J39Er5JrA(E:@!Af]bCX&d=RW^A!CWB?f1g#@h`jsMX+q44"$b:(R7h1=oJ$`qI]Dt?R_)brC2(V:C<+MK;/f1PN+5V*&3Up/oH1&iWKa;SANGA4Hfo.XoWH`8')4TNEN"$-!f9Z8@M:=,,&olo"jN"Zp@2h4n/W4eDAj6g!^;n-Z@a\9VUsG#0IELf+32#C^j4&9P35dm=DsX^ElYM6nM1-3)4_eA7.I7dd61N0Y/3hU;MnKq*F7i^?LaZ>>1&X@oW(aE+Me<]$0WQ?>'4q4r=q=\$c!CiCJI6Q(bWSq)Y?ES,./a`EMEtYU^t8;8#i\g+bi?/k6o%m;PBg+-1K`nkJ$,$B%&@LpX>'U+ToO=PbtP<tJC`^-A56Y75oa9>[+E*s3.r/hTmLaQi9gbjdrooFP4/Of7H-NSV\"Uu7qrChSG_+Bi,]K(Qba8!&B4*dXr=T>"P.Z$O%YZg"7_S\J-2[>Xd_;TY+!o:MqJ?k^UlT$oJ]Qgs7)7M:HQmk;Fab#_>#Yr!qW-UWUk`!h(+#Kll=dRZLT%"dDAie1)iYr!qW-VG\h*RbM34\c9Z_\(fYX&9Pi$q#pSVYuY&ril!`c9h`[?<XHl(WY[#DNrZ]-oc.8W8u#>0L!kG%,Io.WMf'u'l'QZ(1m3!)3&cQC)Q_!l,l/\PYOr3<9ik07.E%mKL6U,r/M0W6%VO8QMN6`5;^9^-2#O5A\Z+`f#&kE>JPS5%(j>JZ#]LJJ3<V!#'TGUqZ9ooO[C,/2E`0EQ1u[DimQC,Aj[8rG2U'XfOfcI'W,t$%06`n2Lu/qI]1',<5qJ"[A;Ob$fX*&B\?MYkrm"\YoB8RgP=+W-EHgm^R`BiU]~>
+endstream
+endobj
+631 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 630 0 R
+/Annots 632 0 R
+>>
+endobj
+632 0 obj
+[
+633 0 R
+634 0 R
+635 0 R
+636 0 R
+]
+endobj
+633 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 200.6 462.003 253.1 452.003 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 126 0 R
+/H /I
+>>
+endobj
+634 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 200.6 415.112 253.1 405.112 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 128 0 R
+/H /I
+>>
+endobj
+635 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 200.6 206.498 253.1 196.498 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 126 0 R
+/H /I
+>>
+endobj
+636 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 200.6 159.607 253.1 149.607 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 128 0 R
+/H /I
+>>
+endobj
+637 0 obj
+<< /Length 1961 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!#]>BA7Q'RnB3n@l^I<\3"2im&#icj^A!>7*sTh#SQ:>A62ZG-DuZpXek2Ce'X5j[*BgV_=>[S]gcl>bjQU%YcX8KcT5Ve+peaD?ng7i"'%c$Zjgk#ZGNMZp$U`N65lIAQbJZSisMG=ju!,QYcD>q_7.OK?utO]CFGLZ":P#YBpt?c]W]ZZ`4cSZQcprUU62uo/Kr%/9rF68K0=$-<!JEe#N<4g&&+#_;`e[>2&i)jb4PUN%J1=UTJa6aZJc2(H:4LqTJYCHo\q#('MoPNhiPCH$8lTdoL3Z'(M&*2NhI1f^UiAf'H(n+?h:c>TP[U;p<4)lU3%2ma?D)7Zh64ZDaQrO\6lY>g[;Oh:m'\Iq<2V(:i9(+.2a?&#)2^/k,B+r+m1AGFUpENLknR257j$Fna)Snp5'1_=^W<Aou'Y7?fe@82rp=*sdL6<TKEeB[o'Be_5H%3f[?Cc.CX?OSYA2AFE^9M'`\CA43m\*$&Q8TZA8]K1n152qmt%j're1ihm0mNt<%p(.Tr?(I]=oc'`?[(+`'[WB\JB,sU7>o*CG_c\oFgMsMuJm$LS9%$Is3P50sp,2Cmq?*^u]PE^Dp*R=W_BXDpJUO$I.Go)`(cUrAtWgMm>Ph1(^fl5GRBp,^uj5Vq(n:\&I-!0(KinuMpXRarrlLf`/Kq>#`_IAc9+*h'FU<<9KpNPo5nu;M7:*jTh([EifA]`&3d/\Gk;15NM0(/0b\4)!4DJd*j@e4$kie)K-Q#<6C4jkK,,lO8<LOA9,LE=;E#n^1E*_VXUpGO(O8KUkCP>G+P$;/A)j&31]B(d702JD?")?gCUV>qajXBNkFRn@2J]T`2i'TPSPc;U$B1K+\V'8+B^gprmYS)gClh@%;*=0j3g<(CY?:oeh;k\G:cm_kb%9JLU@*"l1B2W#Rmk2;(<<b8OFAUUc6Y?7d55R51tPdSdj@i9"U\i8gerR:Jl8@&4IP+%<[5KT+3D8Lqs!K&2!F(o+c'^n;OZK_^Wp>SE0UN)\N`ib>#rmSM8*hSaj50Q(N+\?h%F)e7D-&d&/7;5iiqbEqA%$!V2boq!o=o+2,AElLrGlOJe-(W`&*X5tNGuHWU(W=]>DADJ;!bq8@JaDZ]1go4hb&ATr]Ue1QTA8gZ=Y.$^0[73Rpu@RPc:V06VQT^69qRlr]/sN!6D;>\rbAIFnl.+TpImBo!UXr]WE,S)*2!9$k%:Xf'8og7>Jk;Q9aBMlo!6(nc5Mbt6h&?Y\gLM<U`5%9OXW"]="Kh6EVAbK6E;KG3V&$CWKY`WHS+%e9"'DU@^cOCA,iST@]8iYmjL>U;l*pA8Ei2"7\EP>n,&*_&:"P6&CS:cI#F;k9X<C'L"Cmq9RW;VFhaEcfl]g+-1*MCe#2ZSDf<XZ/pPFc_3]_*6F[A#kg-lEhZkCK\)Is];$]+A&WCOeO0"LIZbbD4o4bfS[V6MpI=\SlpK%PQO"%/P_Ta"/!]2\0.u@%ebY_"llFW<Bot#@5"ri=A#j)=1$2F3GA[k:3+a/Wko^KOAk$Ll]f0dag<=[GH,S#BKY8-jG/h5:2B$"'W\mr&lqML09hlAWhq.gT0/8Elgqh!q=og0;P*$QC.:i<4"qW.LteRU5;N]6^;Q>'#Tj>]XbXY/JR1k\on*lmn-9,mQkb*/44+HtfFQ7[S,TWTLKcF[VeTuV6$W!fKjdO#R4W9`!eE7cC]GZPA0Tj!""`8(%h.aM0_Wd)V=c[#j^G-YF'[9g!NX@YUQnpY\EfmOfem`1?jC2#:qVS]um,MWHDj9tu`/>*mD;CS:35n=o8qd&G5q9pGh>2+8tG;%6q/C,U^%H*eea9-3"]l*mPN#dD#^ur%eM/pZ/-_!Cbj`3'DIu2/E6PV8m!nVEsSRHKm#S,SKQEfOL_HX__72`;hfV_Qb^rAqTA40uQR56FiR/^(b#;-J4LjS^O3kCUG-'4u^+.ksXq%kGOY9j~>
+endstream
+endobj
+638 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 637 0 R
+/Annots 639 0 R
+>>
+endobj
+639 0 obj
+[
+640 0 R
+641 0 R
+642 0 R
+643 0 R
+]
+endobj
+640 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 366.93 495.48 411.93 485.48 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 136 0 R
+/H /I
+>>
+endobj
+641 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 376.37 479.48 421.37 469.48 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 136 0 R
+/H /I
+>>
+endobj
+642 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 350.26 463.48 395.26 453.48 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 136 0 R
+/H /I
+>>
+endobj
+643 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 359.7 447.48 404.7 437.48 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 136 0 R
+/H /I
+>>
+endobj
+644 0 obj
+<< /Length 2175 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0ED0)19&H8h>6,2)/"`_0^:F@rYUGQ\%a,+fi9UlV@3*T&f."JD/^V1'q\ciQM29gBc"396SZd6AASmM8Wl"a?DL8HL#_aIQI-UcA@O!nm+jq:s@Ai%D5.A'BubrSj(>M%iOai0bF`Lh(P@DK+JJLabPdnm^7T@!6lNYiZa;XmH"j#5/r7`hDBaB5$OZ@Lc'Sgn(]rsunY.n$Qq2Yaot+(3QRa75].#sEAJqmKpY+U/":LmJ94^j[!*I-!C^_[ZU$6mZY"?Ck8b7k"MK?)BVc(SjX=&u5h.&D3)lOH\6Bb&mkbJ7[!2,%<QqP0's4l2"PqV%6,/2Qla$2M*>O%)!Zbr9F4?);Q"+\ljfq?nFQ8*<rdj!(^dC*'m6TJ6RmJar)CO_#h3alAnkh5]i)B:_&n5Jb1E4o!p%URAY)tGBZ4`*#6X,/;`5l/bH2*/iQXYkFVQ6`"[&O&.ErO=up;^`\H&@dJ_YtZ4=q?2Mu"OD4Dg^?,('0hSkA*!Qu)a84'98B<>9MHQ"Jrj$?H&U8>c;aHGWoD3m$6JWsl96LcRpj\$N4i*L&CE\46tKVNm_e#^J"9D@(VObUrD,K+&U"S!gL+nCNs/\J[,p#Yh=m7Pt>Q7RQ"'8(dA?&BF6ZPC!#TZ%kscCT<M@<1aaqdk4:^RAMr#b8KaM/E%'q=UX%*RE`.>Yd03VC5`"&keg0]O>GDKQt^6if_GGpdet>rlhdk`<Zuqr`8h;IpSs3H:nnsZD?deEg)r@Pp:K8bpFEULUk](bL9^7R'#0sc+s8B`o$;DlsmJ4C$%]'bL^H[,Ga^;Yd\^[^'Ok,k7=&,O2(Z^%orMB.p&"`92%XhBG\*"^qIW<N,eK<H.Y"j*!u"%]T3_'?a2LJS4Io/UB!s#W"\;rP,^f.+MKKP*OG*?>-l!fo`j2G`ZPA=;#ptX5Fg@Wdh[hs=!h-gnj6V9[A&V6C:Yk^:X90D>Lq<S;NS'73q41YaW?_<CnhCNX"F78"\#K'>320@b7SB*_m=Y^j`+rGY7&%C6-CZ0dd1+rEj`tjFdP>s]hL>A[,m?<n+;nUT\%F@qSl%+"9ST=;&HV"B^Y8Ujqqt2,LN!bVRoffhOM-'d>(R?5fKX^/3Fic1XgHD]u*tMO?0sG#Oo@$M]]eh"om7f;8Lc$Z\je"/J\8Go6Mo][uYAMk[_^]R4=4L</JD!MWgbihYcQC.R)_.N8e#<f@E<e1qk'7.h0:F'7Z(jFiHaKeugi.X#<@8JVCu.M!jI,f`MPof&1fq_*_jG>[\M?@b?b]jE-)K#!RR\$[g%dJ0cAXh/TF'N%K)tfTMZg#HZH0MU/)R%!$.tENgLQ`('D2NeGFe6rWPcL:Tfjg;B]WR6`YHCWRT$9qXrD/sYTUA(E0j;$&5r3;R9C>ie,B$9b"2R_*&E1(?K[\$m?HTHW]GQOYG)oSWOl9ZTGe,%Q6kjbh_>qMrh@Lu>n7=6KR1cY6^+)7$Gk*_LWLqLlHi`mDrCpP!`tb8@J=itrX&&@31O+g_UgW;Hup'mHWe]S.#thL2nufMu6R7pL5FmT1TX7Q(ZS_Fm>31:C5[Y(nMuP+iK_RKX]:N0=.>[[Y@34/rlR@SjHA_H)gHm6k/aY7j^`9[hX"YA<3@GJQKC:06`uD4mVpWI&3Baue]JYkR%U'?F%hEbf&9?@8-T^RLPj;6?;aPA_+?o.345aD9&Lmh7[$_G\G$/D!lQLiH]t9h8\K-"G),np^/XkDNc:A26,03V/q+dt)LJ(sil,eJq6F1:o>Zb:\L/R9FOTB?IZL[FmDr5UDh<DM0<\-U$9t;e!@Ji/R3_9M&sOrZrfjGc&;G]n%AemY3L*::2ZXK_.i/1[49a0m1`])C2tu?*`Or=<^'-6"B5HAin)d[l<cYDs,d,UoIeW_OdmSG,2)AFLfDaJQm3ig"3Jda/s1_>1F8IjrH7ag7(l#b.'6@rq+2Q43KK\)EN2TBJ/]LL2fq$hmnup1n`s8!*Ni8'^N*iZt&&D2!e/YS3f(5&)(O#qNj3%)gEF]j2:0j&`]`sS+&lUh(HCq;bfO-oqdo[k24!Z3dh=;>^s!^,iMW2JID_CQ$:1J.].s')]d`b?tC6(%en)4X]?jJia5Mq>lO^)8HpXf@(\(a8C/nUE;YY!jUECZ$.f2:Jm"^aTUQ]QCbSBPn3o>&^KtF7Gl~>
+endstream
+endobj
+645 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 644 0 R
+/Annots 646 0 R
+>>
+endobj
+646 0 obj
+[
+647 0 R
+648 0 R
+649 0 R
+650 0 R
+651 0 R
+652 0 R
+]
+endobj
+647 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 249.74 442.368 294.74 432.368 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 140 0 R
+/H /I
+>>
+endobj
+648 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 251.41 426.368 296.41 416.368 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 140 0 R
+/H /I
+>>
+endobj
+649 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 258.62 410.368 303.62 400.368 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 140 0 R
+/H /I
+>>
+endobj
+650 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 268.06 394.368 313.06 384.368 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 140 0 R
+/H /I
+>>
+endobj
+651 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 221.96 308.368 266.96 298.368 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 140 0 R
+/H /I
+>>
+endobj
+652 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 326.95 292.368 371.95 282.368 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 140 0 R
+/H /I
+>>
+endobj
+653 0 obj
+<< /Length 1327 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm;>B?8n'Roe[@/?,3'[09Vr0CsDSa:/NfuD93VsT*FEm+YZ</A'[pNs]o*8,l&mQN<L`6l,Ek<%\@Hu_*:r0TI`,<W_:U<p3*d"s>`p`tI!$0run,Vp4"^F(+,E>uh,6u?%Wgi?aSJGgUN/]Vct>e="G01^Hl>2CIVQu3*)Cem:8L1A-pI+cS&#"TSk&\GHoG%eFH0jbl,cRrq;@cjNF8rA">DO>u\+$8N"9^5F:`ckql#O!BoI@@;]E\+EEFj8mX9:GHeQ'L/EqaoC.cJIUMXF&V+q3:EiDF:^-<&-``duBkY,j[G)\)`CBh+#DHHHOVOg+>>>F>(s6QC1!5A![kNW5AD1C3-)h+54@%=%X46ku=rT=<"\>l*D\sitO7'FhK5+K*\Pa6:8Y1on8'Z66Bt17U(iP/T?5V96-/lR0%kPhDo_*2o!**lb;,`B5>XiQBXlIk<tX![<A^>"-k='"M`?2<>7d"EkILr@JuLRbt;FJA?&kkI(l658g\hKU;QHnotEe).=2H9bZM$!A&.-^/fo>^$8&R,%Tk:c0@?a6UFAs];Mm=9hai;DqbaU2`Jssiq9)kRW"i<B[EsrCkgoU1OJ6,\AZU9?m5/S)Nf\ZL+`YljABiUrUubH5P9@(R'"l(A(l._EmG4*`/;O1+-GFDD6#38ln!tk,,5Ck!3?.2lVhp"M2=\*^^XXHp-),W=\"lih5U/?AIQO0EL?9=W+Aq71d\t?(F]rJjG2GQ?=[20jHIF@q`m`/92BFK\fn.+8[`"eJU-#`:;5\P4$:rH%<>pdQ+Yp$tCCT>s,N_?(DCuJQBViWcN$^C-&`=J,5B]-R@P92F9#\1b4r=NAE_p6sWhE+&CTUV(ZlJBG\A6cN99Ec]0\U&PFV4cR3:*qi&1NPd,p^Xp_=Uq=M'L&skaSQH5p%B^59Nu@q6-S+Ng%K-mDII-OG<4NQ5BECU`nD?SDh*,A$>`4cCg[8"\cbsR[O%?9I#S6$/Ef6oCJkE;>[7"@Y>WN:BQ4P13<QO%Ac8L^dVZJQ]BK?c#W,PT"UL2an(AMm(ns.0@<d^!aO!=(sMCDs%%&-(%Np^f5@<9]kR/tijao@NWD/t2mA(KYKpEYikP!0ME[eR$cW`lCjj977=V*92+Hs9*P@AG<0E/MFL%DTUUB8j6T&9`>B(X#Sbr'LZ9.3Z`.L"h[>>7kNfCB#Sf?51:W7Rl>O$KY?2qeXbn\]L*7&]b+78ELaol^nCYNa!A+8eSS<g?3F1,C"9JI5AXZOmOr6Ps+nF9i$Y7HmIEb@"=nl3d8D?uT63g-[joF[pjJ-X?YHg;"9BDr8jot>e~>
+endstream
+endobj
+654 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 653 0 R
+>>
+endobj
+655 0 obj
+<< /Length 2496 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!#^D/Yn7&H88.Jc$sZ@Lb(FVVfh/^$DZ2WuAItWTf0q/G<CpnL`ZUpZlb6fK3Sd_+pil<)p6UYWMI#bVRR1?7mjZGnV%'CKe_%\Zh%CKl'rOT5=^k=:;4WZtI+XaGd<h[Uib_;pVbf&!o6FQK/X;`JW]`/"\7D=cp%<-.h!M;Uq;'=2m1/n[gd(1MgiNf)D2D3QIb=VR8Xd^\(X422PhJES9]l?`M[VIbF4"RF2NA>U86/_F^3E<3F/]9@I@6dC]O9jM6YOa:l"^3N7Z`E]G@)=]'QRF&_H[p+gT`QW]k[Cm+pY93Q&2AU-^)V^\Sf.`2.Yjq01>\[LEAArV5U];KH&#d7>s,2E92O]7Bp;^EF8d#]ZX@h]/Cs/?lSr@b@>?McPCF\GH:!oV$d<:=aj361Yp'8)1.!9T)npk)5kA.)XE;@6/Cnm`jReGq<B@t=4g\c`;EMIIs=%;05[Pl_WF)9RUjhU@_N&'B.?V>JHn(@U.3@oo1:eguE=Ln!rPI)#XQXUa/R<"L_OY>F4TG]A'6n1l;d(<K8FoNg^pCJ4,!SeO:K_HW/*eXBGk[Q.&!=@d\!BpaEe2CXQE:3^['(MMttVG]B;Z_ZUnfoRLQ7CC!g$8A,]"W,]9m",s"b`-@'#EWo!29AperO+8S)FO_jS<OblUP><sLXRMW&K@O`MALk4A#65L#VoXPOo*HRiQuh\/^c4kq6="9k+SW-p>t4ud^CcH*h&\`*a4nYDX[EeU'G-"B^bNi^pO%-TUW;l(\MOFjIMJ)/ZbQ<2h-B#lcl<b#j`p<:!5F,F?)IRMMD1Ur>8BmfT=/#^8_1P^iGaGIucCc+*c-',odp3Yj+ei2.G$92kSE=-qYBF:d;VQEKKU;qt&:K=%Z7o:O:_&?]e9pc_qHi;*`)F118Smh$`>4NXM#PF(fmOg-#=3n:sos%ef@Sp]Y&#;R0uIo5a][^S<k3/>TLQ$=,B>BS$C0[b[B$Cqjg3G`M1'R/^FGh74bI=8%/c+RP>g4?M<<>6`1K*DV,Q=Ts%!09gni[e+XiQr$gsPHkfFFK?RU';D+WKu.?WOre+qOV&bT`.,#+7OkdD^tRD)qp#TMhi44PYUt9jQ3@\0+#H.U--V4C-5<DgTgY`BUP6bnj<RJJ<*O[G*q.jd&.[RP3V71OgqLIp4<&.kZVWLGcr&<!Js"$Ng!*J=3kJ=T1:]$2NQW\D17Zt%-#gT<V8/EMh)<,$g*N^6$+gY^b]ca!IilbP8T`Tp!osE)>(58Q-6PJ&71%-W=,<fML0?F?K,?CP0r7DHjcs/9DV?pa-ilkjAIU:gb<kHER(bGtOK9gL46/M.+u^,1XI5$jaYa3PUA5*4[C[=W)[j,WK%TE%;8C42\+5I;flK]=BaOqEph/#U0?W+0AkU8oC3MC>*DulVefR>'XSb+A>YF(-l"eZ;;A4=EId+^!W!Np1RP`h3Y)+oSqj>[ZMDYGmVC(\4bc!O%S!&W5'Gl'W_5^mc64)rhOA2UpDtibT:ESK1<*qMhf_lPh>?qsAZG&iNV9?!I;X=<sSD,S([iI=-:b2jp8*J8*8*R3Id!^FPd6e4<1,/blS[L'(6`?JLM^lQ$.8dCB2J3b=jidaPFXBf@:u@<JS?j>4;'`5c7Q9S2Hb]qL_2p6qP(a3FdX@?!pB1Y&G3BkL?Ps*0h*<Ogf]Ba*0\Gf%)u1?+Z^[Wlhq9>-:iIn'"7%d_#MF'pfJOC*FOiWYJb<rhjgh896W$o`Q;9Fg;N[Lo_'Z3:n,RBLqN](c=oG.*M]h[DTs:-I8)mEe[@SN)MHZo""9ePISa^(0#j<a'gpmPUfikfBBZ.QfAD/DAAManho05KG"iMsR5i?=GC"tkOK:PHRh'O.oWr4<L'0\K"<:SBbWSqIP1p>qMZU4iX=>R97>r)T;N6?LK(fn;%^li>4fL'@M'\.0,;'aM9\J#jZ#pA4%G7EFB8Wf`<7=,M8WnS>e"4f-Pdr>VQ,VUcIA8]^6"Bk2a$Oim"8^+\a)Uc%raAE(!&<u/fc*NMok_]$3*Sb)MmqRi<N9ZKE[W1@6We#;%Wkn3+DsbOe9rs,T^DE(SMq0j)W\P8&!oFCRWt-O*_o`9^E6OJuin$Tn/K)r\rsV8Uq*G7Vk=b:S4E?&K[q@M=LG)4j;[/krT<.[%4&hF(ZFB#MZ@9Ol]&E:d;$1U;h49kF\u^R_1f^Q<.CKC.!8`4LoW#hn6&aQ,BEgXaVD#q0Kc##=a)m@06t6'GfV+`+=]D;PX2Rk!l6A[JX..Eg=p[IS.2rmG0M6FgP7!\pi3Wf!GbRCe]unXi"&,O&>Xs`,!a>=H7H+7dd"/&nIO>*fIIAQ)1S#U2KOOH,r>h1GRUI'"^d??JB9"nahe^@(*-2mMl=]+[^K371<hZ?T3$2Ilg4F,]dk`W6'+Q#t_U;:!k(jAR]=7^I.EsVECT(gB9g79Ki!-'_nZEM)JFFDCZf!*TBWglr^c1G9-XT*22ar_$m>#VN-*J+$rrHY2\DI~>
+endstream
+endobj
+656 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 655 0 R
+/Annots 657 0 R
+>>
+endobj
+657 0 obj
+[
+658 0 R
+659 0 R
+]
+endobj
+658 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 470.56 288.422 513.06 278.422 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 399 0 R
+/H /I
+>>
+endobj
+659 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 199.76 115.422 242.26 105.422 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 304 0 R
+/H /I
+>>
+endobj
+660 0 obj
+<< /Length 1003 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GatU2_/?#%&A@6WXIKp&ojY]JNbPpbXL-EU)mtI0#DY?j8oS@*B(tcG["*p>'&$><`po#F]Ql<nX7bQ.%7S4O%U*cu%SA&N3Vl5W+g0Z1SHoHD>49hU9QDHQ1?RkANp#U4Xab$ETJ^TqUWP2k"IR\^=%r-H/,83u'VuLhcCa:`d\W5bCfPo(AL<;c-1/8@^_2<<Me-Tb9K.t2f]#,5rD1[MVTbL^cC2GK'Kbo/8@(95T?YWr?-IihL4_]9B-ft>3)c@!6!%JUQoZK"&<[?7,POQ_4k^5@pG#(q[U)Z(-jfF<CH*YXIak7^N_?5;)9?!dc'#bN>pQne6I)LWUXiDYeT]_'Bt^iMjn-FV$#.s?gV)a!^N'SO31q,]b2\HBFhC4!\pbUY93-RI`7D"cTogptbta\4EWD>%6:9ucm#[L3(&#_+!V%t%+5XV2d'aX3.Yu\SnPKMnSlr/LMs:CEG4N4dfZJD;Oa2UfDp^j2Y/i`jiC2Af]uV+eqihoJ"PBA6<]?bqS;g+\eFP-RFBGrHqn`gncZfI.L!?]c33t12Tr7+JN:G@JCd=u>.?AW5,ZZ7*6s:qU^)RF7\7fS/cKf+>q#AN3PDQKcg!3@YX%.f%[tS=,nI.LlQdsE(jtWR#SOf!"m6k,mPIIUr*/kpue2J\b";n&<kO[.)V/\5!?C^?F=rj&uJQ]l`41B?Ie1fWThtnm\UIG^\Yj'(^SOR=Qj8a9SOt<cUT$\`4&e<ncUg3K>;GtPD6V2Em?%@VSH\4Jhf5/l/PsU)pCk]6Cl35_=9,fCakrR-q`LV0TVGccEF=7[_Z&Y8RDAZd=m3(Xh/'g,Ua9"k;6h;R>%YaATrZK'T<1g_7=W,8O9==(Yi]>T.?50*qRFpaJf7-D!*,?08m[e@20CLAT`7$K:B_IW]pono^a0bqh2'XCA^pV>\D?hElbCep,'IJ:mLKJ'a?0Z=Kj>2=mQ7RKac3+lSM^jmF?Ru3bT`,qE0:lo(fB^OCl./#s~>
+endstream
+endobj
+661 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 660 0 R
+/Annots 662 0 R
+>>
+endobj
+662 0 obj
+[
+663 0 R
+664 0 R
+665 0 R
+]
+endobj
+663 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 475.35 679.5 517.85 669.5 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 304 0 R
+/H /I
+>>
+endobj
+664 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 311.38 620.5 353.88 610.5 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 304 0 R
+/H /I
+>>
+endobj
+665 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 276.42 528.5 318.92 518.5 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 350 0 R
+/H /I
+>>
+endobj
+666 0 obj
+<< /Length 2495 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau`VgN)%,&:Ml+W.'TZYuP*u;<i6aj1%_I2GR1@8Z!0a!?r\F%8!K@C"IjlV+_3-+@+>7duId/8d)A2c^qgH0BUTpHPm=KdEicTQd;2<oeUgM^n3[o4h):he"Q)g#P2d$n^)E67t[#@ESuJe$SJVC>^F6Kng.p[-/lkA_>IA:1DmXIrL2L6VY,8q8MG7pl[;n*>ckfk^K&+H]"2Hu=fBMATP(!TY=nN@$6:R!Z2C&c-a+#$I]G)>\1A8T(KX,j)$tKU=P[*7WW*?gEKR":GZsTHFd\nd,\Z'\>74Sc($\gPd)B?l;,[9L+B%.7OTM[ha)FY/fo9,^OiU0EdM,n1Gp+XT@8N-BZ;0e?kNIi56@LQ</4*^S:!+3"=qp0f,M!.&,0;'=",8?><D(SCV54cjZ*/,_[N$i#oJt$seK%MP#9E/E)6^2D%"0d=0rNm6!78n$6Zqi[01sOLj)2V@OLA[W^_1m(=;W`17A?jMem_(q?_G^TZ9%F6"&'hp5mN,?,%@dsGEk=4""_Mr8PohO_H&4I,1G^/lHWRjRj>H5--;K?Aum7*aZ5FPWYhY$QX",oDN!L+j091#=?K*i6D!)EM3&+u_IT'&<Q_+sCDdk2SIbs#H%ZZO]1Se4^VR9l\HPKI$FH'84NfHWJe.Q"GTu-L:mY'j2CO859*aOd*I,hS/VlisfH[kk"LZTB749pJNC1=sa`>KL0s='@kQs\Kjq8TnS_dcN=trTKB''9GM1p3oICVC*eCoDB0#b@K)ooP"W,SVNaX4o0\!'Y'D-N8j\RK7(=uBEFlZuq=C(`"h;K86q/@>[#p+*7V?p!@YQH.Wp$seE`XZ8eZNA0KOKej;QfSeGEcSI+GIodWA.hTtL#_MnW`"0d1qJ69b*%S5rp+g:.WcdHqg.a_3)j!T!:/TuXRHC&M$g7c''qRX\^AiZRkR%&[itk@#\i7t9aV\%%)rPsg6D-%MN3J&4Q']V`c>qK:9Q[>%N?kl;_Wh3#>6DL#7>eehaV(^,5k+24WFk;,!Ls-i`Es;lUi5H#E^?]Hbcla_[t[C5m9iJFH]TN2D&V$ZpfVLG.g'B.<&(^=epo^G?m\C%nmH.TTn"YHUr7a&d`+=%n5*D;DHdpuG[ocD`7BldOd(W$.I&Am*0R%P!UeJ!SXlLd:gaK4SGnB)UoSQPLlU&kYupb2!@Sa!b[81JfN-)?9-ap!3.Rj/6a3m4HkuYQb%Z3YA#&/YI)9!RI#1ApT@tL.C`-VnLGc/IZR[>d35aSA,TO>%-"qP/)9.V%B*aC()ofBX]4oJ<`,XU\?m.OGr:`;Hhdsu\Dicl#%rXo^W;4FX6PH=7\(hIGPf"Y=a&Q[;T9bSW`@ZZ8Eq[Pco?5f_h'u0i`&,p0PEl[+XpJh+X8HA"ON(C<l$X(S%Qk^,>Kj>+g\!gqX,2DI_T/*j*mo`+rB"G"58:#-g\lsb%,Jqs+24/VRU+-DcXENPUJB6n;02'gE$b>NgT.(kpUSA#1cBMDj<BYrW/e]XhL>%/d;\/ls,ip7ZPB#h4e]?DQ!9J"QK$&2I0GJa.RC4@-8OmuTV`4;^'2P5i$QilZI),]EB738#pp<E6og>;]XrQF[%]].0Nd^eb%_TNSuriT\6N/<c'u5\l.E<H>0DTEBJZJ+Y:^`Y*hlK[g;=:.m:Ep`g-!a6?tr4Xg1jcsR`:DdW21+$`L9;>1o$%6nU!]K3m]6b)b1q,<s^]]c.fYjk;h!31(W\kpRJHuE*:$anVG@hqAHCkVjZ+T#EJsh%P^f>'V/J!FoTRI4.Y^LC;o!eNc9]/GJrA^Z.<s*[4F5qC)`s`I,8\!HdJdjB&;ucKOYY_i4(gAd&ClcUWC%pQ:g?qm^+3JVSO-)X\"Q[m@u6KM=U?DZYPZMB>h)o*s6oL=KuQB16)lLBgl?5QL/ejgsfORBnD6KCg3O?d,KYT*d$%s)@%0YfPe2bJBgKIodKQK-6Wmr/,K^SW028J?BiA=%heuW`%k^;N-6%U$SQYH(sFXIMe%I'e52:Keg]4*e[Y(uf_&ol__8o;%U8@hLtI.Hn@Hht$=jP#6_hDSkZ229Tq`9[7i$]4,,b2N%$D8V--fWD=h3jF4$]lQYf8Em*Z1le%1hS?-5dWKLKpBEbf.3'F0mSn;R<d4/:"\4TR$7Sm-M4Qf>c:,MB`3oT">*(>r'gb0AtGOY],#l46k$1kDZ`=f24u=oqsC4boWE!FX7I>T^;^#,F2L:T=^*6A;VA5V!jM^@TouEBetL?:#Mo\\p4X69IZ*^'@gBVWs(k;d2IPDnHi3\]C-3a6H")6(Y;!nQu/3W:^5W\$gGMo1Qa9sG+J*cofHg"]$(_5mXLW_Sdq[IB)ZlInk;4)H[u]/Y3,rEd%=&<L[X]>K#lg8*sdU]2tnEh!rQ9+j8-13Jtt,X7m*C'Gc$,DXf^?:T?gE,A]PW^.du)(mO0'/6TF,\'#Kc&>YiZlX/5j7*ICVZ:23Ec^0qlH+?19UrqY'6A2\r20=%n5/H~>
+endstream
+endobj
+667 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 666 0 R
+>>
+endobj
+668 0 obj
+<< /Length 1942 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0E>Ar7S'RnB3d,#Bd<^k,nXC)mlAa[ngl&+'Z2Dfhi,W[8%M_7RYbJ,-AM0(/0P0s_i"=DB7Gg:O$b\ru7B.lRVH*6=H[O7YfGCgf1r?*KXeR%U]/rH4EhYD,:]mfRnqTN+;@<MF2PKtNeZJW0@pNG#hE0g/)\Kh(4h4(Ho_7#Y.\<Lg7-iAu)5(]%^"c"A0;#gOmrC,%@+UF2$^tF9Xq(O#27q_Fk%RcOL*=t)(5_7H`Scd@J+EG<Z9R0,rFo/9M,YN2N$?2RP),7@]!a^N<!UtAi_6GYHdk)l6NR.mQ.dUR-nHSa(.r\6>!7NO(5Xoc<BlRd:B>AZR#+A&!3SVmR$CfS1pM/.'0d@TEM3f56eYNLG16N7n(p@h"NAP(jLK^*=HH;uq!8s`a!6E$@#EfQJ9>OI6:+D7^Q0*>#\YA5q0VG9gh_K'`VnLpeeC*f93_D`ciA)S`hpVYl52dMLcVeYkf-8G-YGSVc/^&[Z@h!rNBD:E&W%2&^;60#BmtZc-Tn_pqG$K-X.D[OX$R<;6i!!]23E-4fI/CSp=Zg,!Z\*W(O4@g(Z9iSc-8[\0%C>X<X/A%BINmGH#0)f)]&bH@1_l.QPb&O8W7,aH<8S;E0FiRD]P/[>.YlmOXWS7Hm[e%.3<k;**=>h<pU>g:)>72&mqJ[GlI)#b6/.X/d&NMU1icXR4YS&Cm77\#qA')EqFb%5Rk<?YfAPZ)Le6NUmV9s.Yk__HQJRlHlNZ@-8a&9,?-KfVAn>S+Be,4`_e'Xg&Kd6Zp`(uS1bEdmXo-4[M[%""d)!$c(u)-V&AR0epH'^6A;,oI5t>jioh<@e8#t'/D&7GHXEM@`UI$_RWR'%aW$R+odK@!$hH)BE4Nf"A4b2a!lj:s'mg>pq<Falh`fW9"*HaR*^^;en?3ZO:e.q6u^pGj6H1iQNZM#iE>@9tRX/Bd;>&$XK/.4$9n'?^@-rE5.I#XH"\6<e\LE][*3erIf$FmH'JS_ePXhN,tXlU_D&>V?upZ*eTiBT$'ZZOQN)\<DSa_6`L+k<cb4!$QQfo*@eN6pej0HFRSFu[e_h*jgM*ml-1'<9P"NKdWI^"/nCY8M;R!pFf;42A4k(ks3`$KD;%@D7&6R[SH%r\SEEJQ^agNB2<t&JL'WJlUb*W6tX3T@R*0lh.:cjiGo8D3rRUrVNW-`ZPcH+Df]/6TrC)S<r:<E9KND9&_#ult`!Cc`Q?(hmoY*#L4*8:kMMUE8L%'2lM`&;;a'j2?6hgU$[kl/[RI%dAo;:-[F9s[B?MVnNu?25pP5F>uWsmNQPKj[rdO`IZ]gUS3t1ch.A"5Q[p*rRaf-;D/sGo9a6"+Q_l(tQP=h$Fa\Sc#!/.s4](r(Z$Z>oI;Vf(S8<\h3O:]X^N@09b0Aoolg*.A>6H+7L6F?Ha81h$o9O:@H;.uG$YV^Hd@1r=rPB)m$95uYDUN8Y'PE(Go=H(i>s&SeqlgU9]ekR$Xkr3KANl:8B%7"@MZH9>LpqW0.V'tnftQ>UDX0URH;]l^R]?DITBe!Pn@l[&[!t^A*^ZXR53$1?CZnGKCchOuE[M!Go(8el]!1sEGjnlA"9<m(5>3E[&?-(kk.)Z%8\`LXBp%OhAp2-DQ4=,Z*PiU5XK/%ul+S_4ld+iMGdLra\Ms@3$N(BsUPUM_"Nsq3:a[GjR+!TQd9P>e6[)Zj\VnXC-E\k2[4qf)Z=R$cU/nYQS1(a#=rB_%pT/A_.<X)R+']LR[f<c9KCRqU&9#iHHMKHpmdkO:?Mt%YC3%.CL6Q;,\/%(sga$T,E"cRFn\>Y;[6hSDqJMB?cKY5G))TB<s!LB8mD>(h!p+?@X#-gNTKr<QkYtI\Hp@6dcSl0mHZ"Y67]oC\pE$,>fQ?/dRf1Sg?H0.2;5NY(_`S%\CcG0S<G*L_NP__gP7OiOm*<N4bc*gSCaE5&:AtL$cmZ1~>
+endstream
+endobj
+669 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 668 0 R
+>>
+endobj
+670 0 obj
+<< /Length 2261 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!;f>BA7Q'RnB3aRlIU@)qio>poel8p?UgTddT0^k6*s8I!3F[aVV`IcX5(,=cdEO=n.!"-IYHFO#*uEo)b$K+"`@1f`k&mWr&ddR/GBr^D6gFSaA34OnWOUNum_Ys0Q6G7l=o14.SRF=Z6jS<,R6-9b;[UYkOmkA3cCir&K4PEM@t,9`J=#V_bPF?-t&Od&#Hm%YYX+n;mA*'KXY_C4'CX4s*U>J:%:(/oTV2h1.Srb/6JHZ#rH&7A8qA!4X60pGugobQaZa1HYGr7;"]JdLP36uf*^0T9'Yq"j>F%",c4MO!iUZ%V@npc6h)pc=SRRZJUaOoe,53-YQaQt8%_a+2>W:=IlUPT]Ce>3.:>Rn.Q9-Zb,PF-954E])%;SAGF4ZY74IE*qYh&UYgEh8UTUVTUNU=O+3e2-u%]cm']_*!N\(2q&7lSm;iPrqp^CTSt<6R!3D[=G/pAL`7EOPp`@H\3feJ+5>&Tep)/me6-:`]iQV#kUNTs^Q-d%.=>$3[5PHo^`g2Gni64)TlHg^P9ctuV!a8PQtgDi<X1$PhCQc)#QQ/G)DK;X)0k*s:*iZ<3OP#m<)\N*n1%kb'#753'H=ZWWbpVJ'HWhmJL_kB:SIj,be5TQ"CP?'?%Z!H+j9.TXL^:*ZXcH(6M!0Mj?I>Y>R`p2*JssUEj^YZ13g6RmOh\GE-ljBplNjrGO\bXp3-13?;R#kWdrqhj_hR5A:&ZOrd$D;c',eqLn$f-]ENT]RV4]_Of$ha<eU?J/iCK+SD0$=N,SpF%L<9>7?T0kEBOst"]jQ_[.Jh:[rls?pe7">RO4I:.LBoRJF'YZ!@KN:M`AgLE0/SrQ45=qjr+DKQatp7,")j*n3g=3XT@*Fa].D[5NNa.,sZQ$4!L&6ej=L\%0o1spaeIaAJQeM5RN:fD?^+20\Y8b1pIU^LiG[lN<;kaQrf%)o*+Nc^kmPJ]jluF),&iI2]:^_^:<Hr?F*i<?&:leb7`\3D;d;,4W61Qd"p%O"O;m/)Q3qm`M]`)lm!H&7+s`r4q[R22%kQU2`QZ,);m&gkM0m5KA$F&*9K\/fIS3AnM1M4SVutP8^iLEc"XgrSF40G;i!IN/]hPV^e8F,G)rk0/n3;fiR2'<r-hA31R`T,\Hm.D=S:mDik!HQq_eJ][bO5%L-r3Vn9IM4K$KP<5-pk<+71hMb-.(6.Xr*:EIqj\!DRkP,08oh_genafKZ)uqJ%P`5#%[f/t4]0h<d$>A-s"-TmFVKR/kg=:9D59&r5S?K1u>->^E1k\`\PlL8MZ-n(HfW?\X^t!!WnmaioNcWM/DpG=mVW2"$SR-JBmeJ#PdV`"tj==oZJuq@pDYV.3-a;n`'9@Eb'/&J-9^DMNTgZ@@#_%,1];9p13QYL2b`,enh+R"Mc[FNV_D/]j1W.rsGuLP`ACY95a2g!ZOS3<dPuWt)^ulgPBo:4&*T?I^0`Hf*iD]'?H!R^Q?K9.=rt;%AmmE#:dsq'#qm'qf\u(#JL>Vg&fLgRbE,?HN0<o[E<imI4^N=U[g6+$E?k9SAr8V#L"p7q_7;X/=U>7jee5XqZP03Vs-IO*_sqDar8p\kbSnWE)c>f;,e<F(?KF2SF\H+g5A/,dh;<coTSj!j"s^!Xp\D#s>)c)Q87c!`ZEtlj'S5YZQq'REqI1N^hV&PZrt8g6*8C:e[qLFW%+1$/;pmXje('#P_VbPDO7fm])RSm63$.M3:"S#iLl.LMZH6%tA)Mr$bBS&p\c0bjH2>8B@2;c7p6-hiVT89`a\fqF@n3H(M%<&UNu)T$I%/,Lag\lISPm0o:9]6D=c"CAlDX;rJ=qj$[\@?C]Vk"`)6B@?d@R^HBX`oVfk4BkGZ-Tl09Q(1gP(TV]O-rL\gtBe\6iD4s_&=gg:-%!Xkq*Y=G16&NSLn\q.F'anDpWjRknS5_%*WNYQc%Ka"k_Pc-T)<ln@+qVmUf,rl,$t1]^ig1lir$#[NW"')e*bq.lnE#M]_Ul4q>q7._k+Rs73-`&3(5GtE4%1dMFOdLgXU`O^e**7<(0@jJSgcT9cBc_pUYnT@nX?.13^i2BL5P\b4NCitq[E@#U7@KmWF0ZDgQMK8(>gQuN'i$Mo;[]El/IY%&OX#9\jEu?l)I$H3<!/P2>:=7i<,?.jaSrbH^qjlQpt`6#8r7k/U2Ys'7\.1FA:4'8s\"gRN'qFP-ifc6$E?V=WHR0-8HUj;5oN(Q;N0r!/NF'Yl?kaZ$")fh-?-sf,1rB(3PJn_`&>err>a=$P!~>
+endstream
+endobj
+671 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 670 0 R
+>>
+endobj
+672 0 obj
+<< /Length 1738 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0DgN)%,&:N/3Y^V`s&Oc*mdUPA&`,a;WDGu<^3tp_,U*,A(MGQR\Z=j%(?!^3V'L9cXqHsg?/Jbs2cgG9<efRT`_=mu]DW1'_^a2P'#kj@^=ge^a,Aam21c.t8g#12mgIbcWq&NTYSj72@Q#g?hp2oB*Ka9TL8n1rN[VSc]OD&WY,q1p(I-G?ILLks4aC>Z)1ots,X>q=fVQKYEmHa96otr7Cejb[k9+UJ?:Eu0q*FY`c29Rf_ffVlEc]0p:@cRm2]KSR2^1mSMSJ/e&bH"CJ3*C+X/5!5kgSE(h3&aE)0$]J0hL%=DlDh\3Q0TRr3G,CKdr`itPjSfe-Ppq3,,>u\Ek45;B%d#k4PjtbBM3"0i#XV%45Qjpok"t0iAfrXGTH:<U@<80m?&p.$1`&;]QE<6KC=:0@tYf)$sddXrqJ'H>04o-ZljNfTc!NK=A#&8_VUu*jNKKR#KN>t_6M3bnK(*&M_+GZ&^anFi;JHG4L70e&HP(HBM\3Z9=rK&p0M2N\(^^P![\h/@:H[(dcQNQ"KQZ=?\uPHjsB2.\>8((SW=s\8X2etU'50[Kp"%JGNh-oKdC<'k4F+m#''Rna9J/,Z#OaMhhpu/3cDGp8]DIa<0iS3Q=QN)Z+(6P_)=EOWMo%d3*!6p23Rr:mLoHojH@FsH!UkD-$-&)S+V@@PRH'GTE6_i&WYP>_KSbiDePT5RXtZ7H(0D]nAi>cKF2$FK]*eJfQp8n,&3l1VtUeZ2VN*5Rdk29]e)baQW1QR#]A]qS(A\JF..hGRYeP_Hjc9,EngRNaMb<$i\k9h,mCk2qIq>@:"M3a'_!*EOq'h@`cOY59ZA:bg/EujP/1-4L#^ka;8j#"T4YG4pL0Ka`+VG]%LtUbFJI/@=3]`H(p_\L-1Ra,_#c&4`+^n3o>D.q#fuYJ`F::FCqJAG%=,=6q?3.=P9,V@+s/AZ5j$Njru'HrJ,\NPnIF9K:o)Iqf2k%%C&IU&k!HY*\2*gNVodKMHLe]*1q2m]eadfa`cZU?gIM^[q0uVN[Uqt105o!m2Dr2qgcZZ^Nc3TN<<+ZhQXZD$67BD/@MALSl=J?\nZ&bj[ih*!"*^OCK2eHl$&`LZE.=l%9o#524NJeqrMOpoQFVNpP4]/N[gD*&T'>dk#DCLSO_=*Jnf5LeZb"\*Vj=.,E-0f#(;QtQes@pNi7bO"Ce]1%<loML.(b6SD]#<c0*AbMh0-Y7mGrS6o6qmL4L+S&TP3`\JC,slXlO0)5:MQg8S`PlgniPs<KV3'Sa^B,Jl<C'_tDr6XZi]o]V=&#Zk3i:heI"n0e]M3L2Fbg.OVnTdJb6A[tC.d\qp)p3ZukJM;4]nUokl(=I6^L'I6M=1WK;ociZ*5>aD8h\okeEEL'o"<7jZ\<(d>34RQAsQ@KjrQMi6ai@ssrj*s#<>BSu!a\T9<P[U&_#7P/eHXT4VKHT+;UKKO[cV@;QA)o&L;S1&a4?`G#Agt0FK^D'"*EDTrM3n$5e!__AA*FF&V8nAHdgmuDf[(5uBaHj4f)_,s52=pJg7:H6*SJAE`m<YN9f7Graq#SRh4oU?epE2$iaCb2YP5&X7lQe'Rf0*lk>O'ZDo6DLH.qa\kme+9NR[#4UIf*)'^)L2kR;:OojH6*OKIVc8LW'm6e@;m:e=duOc>p[Y'3.^Q#MLl0dt>^<a^hf"G)Q)18%U^kCP]X&&Pq``\I&+.ei#ia$=13m2g&^_mddOM*LbOj`6N0~>
+endstream
+endobj
+673 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 672 0 R
+>>
+endobj
+674 0 obj
+<< /Length 1766 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0C>>s99'RnB3nDjmfLht2!03Oss6<MlHT\su8g-1<p+dp>n.P$2Oq`V[3OqTn`41d21Z/p&U3T#%@oIfKu=4G#$ZA`bNZ](e'2D"XD7R1A+_ZXDo#\2oLdJ<V:kjt.g6[3GF0Z(SNUTjKnB;*,W+RrDqrRpeU>gotj2&to!o)N8B3NaO8n_!`oHP]_oTX?(]_%Xma2W\1GVnRe^;i"g$<#.D=WC+MG6)'))9!Z^RGnni.Br&]W0I"##bPgYmp)\60E33C;aBW<=@ei!UNRca*(uCYti@8nC><YM7/T"dkR2d]aeS9e=r%V[,-l#O[arX#I:b#hJM<'L5aPRB.)3OhcRP44/&%+6c16HR%emHSA_!e`NFtn%)VVr%JH'2+NoF(T).Q\IN<I.EtJ8_:TbXFE_PI!GB<aRHMA=Q,qj@P'4rpo3aeUn=G<ROVqLG9T@I'=1[H,`ohI.9>@L6lQObI:i6rCoZ3EcOeU&0B>eZ?.P8HqP0c\L<QU[VO9ii03c3P`)5L2Ck%[+QC`07.BEiX<cQ6>6Hr$^N.G>pViFIr46!e2YOf7d)k(mG$X0;7HB69gJ8>)S]SD"I`5W^ZXHRc!<HcDS%]?j?2Q!6)se@b`:YUDmJK+<[.%Bn^5B\9%r]_'R[\*F&Bds)\*mOZ@8l6*n1OVlGXi&_mGIJp>#;-sQ$6!],,^';"2PeQOKYFOP642"Dk&-fkaZZ,f1dGM*e7B*;)3qoDMaMr&.UtWpC?8#fs]-sR\Hd?kFL*SK:m`YNK5)WPd6=)0\(=aa([;:ad?]r'ciFk*[3mcjE[Kmd&44o,dn":2R1"EC>pDW<`/;nV,Y;QU+2!7Q9)mk]XlK1*k"FZLM[8;nu2u..tdt&2Y;\Gd.b$T<2GoD,HO/<>XV8'p",2%>TXRH+<9+^St,M]FQ2ePM$%^14$KD20HAfTO5/Zt6JCqpG>Gi`Qph0!;H2$"'.'.K"7OS<=olJY[<C/rBM9ZW&>:,nZ0G#0LEuEVqC$NN5U.M\Cuqlsou:?@]U8:(rB"(6KkL(Y%OKXlh'K,r=VB!!Ye<`>a#&>s<GJ4!*4<LQQh*b]5&LQ>ktYHHk`U8l/cAN#0h\6h!NpFi).-NH9kt^D>/6>^FK\U41L%(<Dqtt)BC!5Y29dJkG,7s2qdWb^mGU%)+mB$pRZR0!*>"0Wf.XU`iNNiiBfTMW7aXmrhO0\,gUlqZ%X)UGJ]B=(ZZ3Daq\TSA/[,;+=10n;TW$TAEfm+WlO_t3_Ls_U'KU;I)U:Qrafh![c/\UTdZjW_Z+brYbq%85bkQPfl)h5,TgU8>[RcTU0-"Ve^=.p0j#2^%hcG)5ac97)rbDg-<\<O"@EIt-1rVVNX!;Fn]qJd&&WV![)bLoOa;N<!F?bHsD']pCn`2NdZFpgg0\ZH?XW^;\6hGEk@2+`F+k5gCW"!B8X7F_Oq$q;g0^Hmmfl.2UENp)a=2/-[n9YY$@Dq=K-;BakQl?\ki/Gmp*tOVYSK2Msm2GW(!gSM8PKo%eNjOtI?00sePdCXZDlB1YE9Z#Db!cN->]g8Cg?5JP.FWjF^B#W4qBg:V\Kc?h54`G@L:dKi`2Op@mY9*-p#tE6c)909\^HNHNn3BTql:*9_Bq)]<L?l&L*.HXO1r'LB_2?bZ@"NF0@\nWZ0WtXgGXW+kg;mI``"/`G>#5=MR(RGbnX<6\<ukIerZURT?U5Nh=9Dm!AQc/R)DZd=u`3`j.El@9Al9"k<&K_a7M8`K4C[$pn@-UrrD3jmFq~>
+endstream
+endobj
+675 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 674 0 R
+>>
+endobj
+676 0 obj
+<< /Length 433 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GarVJ_/@+D%))BcEbqR092aJ?DN)D?dNgY1FoW#K25R$a:mt#Cn!?@21,S*%43u7Afe83R]\nSY9MfbK#V$gOLjg&W9\28_Qu\G@B]DkZ]Mt_@d`Op@$i:]`.3TALXklf8ZpVs)Adn-e^MK/.FAX%9BV=+kYLE0?#$HI`GHLH1i+JcJ=.ise:!ARW#UV8h/LXOmS,=odm?I,?!K)MdPtdbh+Zi!XMbX^>*i+kM?+P\iF>C26h`k2!anF9re7\Gkc'KbpKI%$ZAZP=<BR[W\']V.o7Xlt$VC,b[TJO_]aD_^2aBaF7odS%\0W=e96.8n>bITCt([Uh7H6*t-%#<P2.^PlN0LFEA_AL*4NGc=>("Do?A]Hu0KmWM*+*"A>Y*?Y$.W\6X,1Go.@j8o;4RSbVQ>'d00d7[M#.m1C4E5fM'Q^5*~>
+endstream
+endobj
+677 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 676 0 R
+>>
+endobj
+678 0 obj
+<< /Length 2248 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!;f>Ar7S'RnB3nG8@LZ(d.&fu5Wf9jODZRs'YC@As&gbI#M_&d=.blM^QV^@BQ2[-V<O0GGpO>!+q1j*.ZKS'fp>]=?no*4I_mS[k<eRFcH/5HbatC+XT6NYb*S;:bPdmeP-sV]34MqVh>].;?qFW`K%:[IT=j=UDM*]efLjM%)P<],&!n3N,A9rQoPn,-U\5K]b-LY69uHkB`P]qD6M@9.KTN51?,-/U8WT$F\%[OiBC-.qOQU#=f'FNGWB%'2piQ:ViASeR()#9rP:d@Hq>eAqd":?/3o]d2rZH,S\EpH3+XGcm'8P3L:+'/9g4>p%I]fgk@")a0.HK@Lb6=X'.k)Ppk"XZu@03\OhK)UW8m"11'&Xb*<-%^nV*$+CiA8'`b>_K%Uj]a9*!p^q#0W$T;FV4jnGOQg'Q_.U#&g?':sbKtbQ!d.OfalN%Vj8L1\u!hQOLM<4?[]:T(W';;.SYmE\g<q1M+ROKC?PAh0gQFK*eqQnGA*#+LM6c7<I&`5.%86otER(6e!Q1UlNj(*ErlBEQP`kgKbM*u2+#Y+^cC'ekbr"q`BG;W8mGSHVn(X(:tC2A8Q"5.8gPQiAa<g+0[InQDq#:opW<.s0I4C-=p_;HcG,`7W)PWNuG`1V!,59u=ni^H-H7R0^G];G@_*b%I"N<q>3B\j1JBV-eL#f;&JP1c>(drYmePq&Cmju/();%DK3^ppKlMfg.7C_tt2Kt/neWhV)cr#G3cc=SV91e26m`pk3"@TehnTWGG.Xif`]!qRSrXAPX957l;.A^#*)B`&!/T@WiIn`DuI@0#G[A@:;=3(=M(@k!P"jG-("D8!;l!&Q@mRddO:_YpkK[h30]JnV0o8r`>)UG$j=G\0'q!#L7X],_=q5#cJZ"!G+GN/G19UL?_m_$N[S@,s-!W5T]A6s8,>qYS>!^OVhHnk:3/LB8%/Mb:EDe*CGh]Hf<s)6of:6Ja$k?/c\g>gdb"dErG==&R4)]Xb`uIX$?(m,!-$*Sl/?!:N^+%==m=J-eJl]oSqNY@\1RWi'?_B,D.YYLe#I@4=D''UFQUlMe*fB)#%t'B3/[RW.XF;4%'.9<=!q3,aeDAQItN>PD]Gmq,g8H[J'YF[>\inp0UZHIJpJB*HTrjiUZ7DN/fL/LQV'URT-Q6K/kSV![+'ANf@lTnu]di&5O0q_,pPWNCt5:>I&HWlWa&>7khc,YRW0UCM&d*.f"C\:>i92;+R/AI4M6:^?HCTS+<$D=,f>e*gG[Uj<Xr"]9"8*1iN#m?YnJ.`+IY!pZ6QkGfM!&f7Xb+.&m0L1&Pi@E3@]B<;'bigg5b.WJK=4PFKC?f-Ku_A;2E0.361$=!CX.#U>,7#*Q]["6t`M$7(r2En%agpq7?i2U%J=$KI!":5'D6!#kf`tt'XH$]]V!fdd@`']01(\$E3@Cj,Jk67e.d!23M>b>C(%El2M137.*o@ZsD>tp+l?T>ZsI,(]:-odK!%Jk^+cO%MGDU@iXlmD[<2a`-8Ui!i^:&$:)`_!IAmq-te&4Gg`BQNT)b7i[BUB_HW:cMA$G#i'$$l9&(K]@O!'+/-[,pkO<'ni0ui><Re!Lui]m*Oqrko$t6D0@8XLJFng3h`)6HJi5=I<WRn^:_3"^29OIK\Ol<IF*&CjY*#jXgmb,gfAe4_S5.jAG=jEYHO)1:`#$tj4Yu^<p=^RdDg!P&3*u9CeGX:a!N]\W][cYSnse'cd8-L;@ETHE!ksfS&*Z(XX9AA)2>koo)$-Z[r#YKc'a,*[:&M$&fLe54,"C'Feans%;?16m_oaU]\(]q=d.bmA?qFkc\QZb^YFkg<*J_]"L0Cr)cq3?]+$=0%gGeqD8cGMbOEF=j7'KX0QN-aA-HZ<h"Z7?k\PY:>?gOdearaTg\J=^^&)EZfhZR#n`$A+`I0,tH#6,glS,tdn'N]>$5N*[daV,tTRE=H`>YHM;gs&D27@*>:Urk-KUSV3)$ol]h:3XHKn-o'oYTWdbEPUK1@tHG,A8s[\'&Q(ltm&$&Z/0/.;qt^&&/rcVZDHamU1gg5t:SF]B>1p,RaIXdI7euBi[J,?r*Ebl!Dk&(?8?+mbh<Zoq1S="(s<Df;@E<]?ts-57H%#7@m<j7"`=YZo:f'et]=[lj`@[P>7?"[2^h*Hm_md&HUc^X)RE8MCHi*hPPM.8SOKA(]`M;p$B0Rp#9<E-lqb&aeqO#JN>$\IZ<8SIN1BHg6-BH$2ek(8GUm&_tT-;_pR/PQp".j~>
+endstream
+endobj
+679 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 678 0 R
+>>
+endobj
+680 0 obj
+<< /Length 1476 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!;d9lm(!&A@sBOIMMm-GY!O;Q3XK?>Ys+[W`tVh8<t<#R63m"=b6kn\<CX+\rUW!]eq$8f'<L:\X2,YC!bfc@5`U>E4\Z.nIs%lg`3(D#&-'hj%uKm30f\K!k:=r:ch\2q-OG>qiS(bc]e^0=Qj.=RoI\nSu[)\hQEV(-MD<55Jc"ICFemjY!.d\GKPA4*];*`[5BY:A.o5-a5EopI6cNdrNF(Y:H6'I)?>So(($VI</_9S.UK0Y0@/D@,o/DQer-Vk1_*>iai5[jGCGXe`EOe`pLZl!:De)+.bu;q**%I51"OX)BX@h7@E;+=uaIi$[>[MlX^@hXB%2d3_5VfO9>]#"+]fjVpd@3s#%;,`c3Kh$c$[tlS]pn&&ku-&7qTWj)"q4dqg<*C6e89lqo@ZVLLa6c__eC34MB8?j]'=MkermOQDLRjj[q!@99]R3K!!]1uh-<c6K#+3j5%dEg=]:;'5D/k931)"7m\,lHike8sEs49J\Kd8m]U"NanYOa'uIU0Y?S)7`>B@]j#NE7ik,mol&+,$XT4r-F>a+)!u+ESQj7(JqKta-=Dac\L;5cO"5=0C+g.rJ__FsBs`MJA[lW66aYq%'9C1Jf%LVDP%bl<6BOG64.0\<e<=N1J5V*:Z-\LY^egap/#MB\U;N-b@449"Y_/W=KiA3s"*3MZM)BfML]YQVElNA5_\0L\8'bo)j`k.L\gh:tl]fck*S'UfjA3G6Nc!>bX_Tka[RnccKV?N+!HR>fEn29?hBQTbH&2:?d);a`!A;/s'$Xb?kt5.hotE%7S;B(J0d]Q"":HMo-qq<s$+cfG$#m)[f=(KJ-r\L"9-l.cb,T7]RR4kC5hN%a#=>EsfB^d<4Npa:1uLYJ^uGR\HRju`'Y0V0a;Gi<El+'RPnR$6FAYh,+i&-LC-fc#@a$Np0OcH0+$Omkf3O^e[T0LuO"b1eU$<1TRc@CP>H>pmIG>THF4Q6>ok$9VT<Q4pn)=5Rf3MX!:CJ6griuGaYYT?FPp/2K^X#,CS(qV\8a]7uMJ]B?Wgu(mmsg,=8T)C2=SafqBucCs_t0?AC#o>-*E/ul^plSUJ5I3N'dqTXLcW%ES-JK^=RS2*Pq*B)%'/5\O,MQ?]QbnbiVV-IFlYiF3<'Msg)VC)Pq-Jk-ZVlqKL\di+E%Kg2^bWaK&t(kO@t?L%8H1QjhSkFaE5tSIj$e28qm>^F2O$UYp=.+UKsFN4?ac>1B\ob$bf6k8!jG91rhR\Nd;GU_$#&_OEnU18LG$"^/T,W[9KN\H[0Tq]t(kHNitY&"g_"_6bt>jb<.u*cr\C3o9&LnkEjlB/+l)LC%Z>iEG[09*56?^J(]aL<l!2!"ja2KQrn<LqoT_\^a_DU`j502?XWt,mFo#'TYXt.Calaa'R7%FlSV5D2?L(^53ic@GY%[U0B>eH(,9bU.)P2IHA8u%4@W>5I/=mIK'Y;X_<])7g665ip()gTB&i~>
+endstream
+endobj
+681 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 680 0 R
+>>
+endobj
+682 0 obj
+<< /Length 2012 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GauHM?#Q3''Re<2@,DSG:d,;TBN6M+3`9%9;^H=n<RZ^XN,97;?GLR0?b_60bT43'Y`l3e!Z6Z=c9:o3/fuDfn#gNHco#*sbYE7kIUX]dq\b9(Z>6W2C5/c_QHJsNb;2REmGcDi5D^TLk@#!UCBU/$.6h--`2<W#?cN1A_6"uX;&E6AHCUm)`%PrDI)4,75Q#Kr0Y7'>*iW4bj2q8U%K@fPs/p(%C])?,"c^nu0JHpYVYj7;IuA,&Sl;t8/?3c?-!u2;s18,KnP%DjRA!Zj7PlM'BAn6/'%+EnR]L1k^[Nbq9X:l2hX3@u3I!;FE=_FTG8S[d%qdODPqh+aP;X>1$k<Y)BsN8doj4>I$N1/$TATdm)W2r^J-'p"2=Okt:M[Kp(0R_W9I\(t2d:.8b`W[OPiS3-2:QHsWm1N&6f6^KSY1fSotso\`<Z'972f8h$"!>)]V8/T.or80+m2UW+`n.:RLY0j2IR<Y\e0eVd<=B.c;B]?`aKpO./X6o(::te&VMJf+I7+0AUgHX=@Q$#As$X&*Kj!5VDM`j5"!)H-&$Q@i4jg)1gMlj^^AO,$#>@jG-'_5B>k5lH^qGZkYOA5C@<if)(SM2(OYI&qLb),_g(#o//s.9<r"e17#Tj^6EY#+;4B`'o4muFWU#(\djmsqT+UoG!IHeRlQi]uj1B*9m\%LB3kTgN-#'e1&USDE;*S^&Shl>mK.MR8q\(rXG%Gs=O4Jk)mgqU+qtXZP_^;+IG.?('KD*VCBYA(IQ`N^8m!(:MQDL!=M=StW7Q7*sdC?F!d05uTl`,Fea5>`4HsEde>+0#(mHXHcJ)ZkaCO-"^i.kH$AF*6DAZN3'\,qla.oeB/SS`LH*A<TbS0]ml'%2P>DHPW..kPZN.,HrQ/Br<!8`Nkn:DYIN4eB@U<8G>-C0$\dZ5'DI<$j]#B*$=iCYu$m2Hr[u'`:$LX)\=[\[G]uE1Ed1QD8a(2%@bq`4a2kL8!;NCF3LLeo[!E<Q-K2f+h_N=M619]8.-N0.qcI7g[r1FCm[oAQldQm8HUpdNC(RD:Y9P/Cnb.?p45;&uj&sQE,"gX7Rbi`/eOIgtp03q^Y&JQ=JH']lr.1m[_4$I8CY"lKA$`R55^s+OL6TShmI!gRr]4g6AU!4mqL880C&<Mb1&`3`(G*&^,2f6cepa'EcRRE!I6EXs>Qd3l]U"4B!R\'bO6l'FEhl&nbQh?FpN]E9U\gCZ""8G:9mB'5u9F1nV;49[@I`NE';mR:scGhZ6\Z'WY6o^-1<uku5#75*buM)emPs-7AjMH"bbUf5CioL=ae8"[!:2D=rLdp,i0o-3?[c]d[NO-^RoF*b,Co`Dg"Ca*4iGJL/eLU_jOIiAGR]J@Mo=D.D3<So%dqqi`G3:M<>Vd?m'g+:LMEl/!57FlTD0Q"`:l[:%ha+h`SDR#O4*DU,N*0!HOq">BsCDV0f$=#D?bn"h#[&<sLceK(Y/8P-^=Y;*C'S?bn@73:2Y*Cf?,XdZU;_<_;Qjk_a?,N@q'2J.n2Cll[7a"/]%fJ&oW?!15`P-n#rb`1ciA>%Uk4G.jp(g>:5^&b)/)N-%u`LumXUYS:XlnBnT?39YXJHYp`G9bS3Q,Z3A+&B;AN'dB<C_t]4\joPQ87Nm1<GAt2p/,pf#Xt(<k_XASRh-L.JF-9>8ehCm?A^4RA\D$?Kbta5:HfY!2J2)*NghhIW7=Xg&:"mabGd`L9V(o<L>AK';qT/B+JkQ>YD)#fXZc'fL:#,GN3a?hA^&SlQk=N21RT>=mgh.LJa=<`PK._]aFm#`Km_<F(orR4CQ?%=-9Ul/_>ssf]Y:lchWM+rgKdsBphJ5%PoTFUY]Vafkloj[$/<okY8Z9R?XN=N/CV&[R:5BhWEGgjS:2p#+N21]-VGnJDdH6g?g3f;=fc+8(3?EPN:^Oj20I`n%,6dWSC4Pj[LHCAi34u!W6dc0Q`OXO)]s*dGt8hRF!`@+T8It8P<!nj+Sl"nbQ2nt"1gYj;->ZCSGWUFn"\#~>
+endstream
+endobj
+683 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 682 0 R
+>>
+endobj
+684 0 obj
+<< /Length 2135 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0EgN&cS&:N/3:k#]C@DlE$)6`("XN6mt3cSUZfnUg`#`UAb#Sb(?^#b=47Xu>O6'p:nY#98-3INtPh(;tB42";A^_X57iM9s$G9(L%n:qI3#s<;]JK38YcA\sIINlI!N_^(If_L83YJ,tVU:qLjW=4DMek`//R`3C4Z8L+JUb[4WM)gk8fWIdAHunsIfaoU9hLE6[.Y>;<7I:'$3/HkcCmqF%h&-.!jrHt]Q$6Dk7eMu(<-eH)op=-BPNg+r./b]Q's[9s<C-&THIF+T=@QFIH."`>-[%5(;lM^B].7r8E]0(Pg?/3c^8X%imLgC`=eIC-)XeWmc(3okV>ioC9f433P-gpjQaR/Q=+Z4&/BQ.:co6p)?*6!=F]O5U^_?P8?Da.9U"dGeZY5rKF.$Q7LW4h5IIM%cgta>a1Vs;]FET_=b0E`<m,fE?;1"W^+;ST^-,EjoTJg6h.jTX9#@Tm&XX2-Jd@8BJ7>=rP?G*um>eU"g0`0HDL,[^c.m`je<=':26.eKA'nr=Po:*Roc\%M1K43qUa$PAdm)"T\?2`FWI`#1o=DeFtfc9ER89't6M)7\m:S!DP\J_hi(0el*=&.=J3q1q5322F8Xq@DH>[M2$)drAC\eJMRe;<X"$GC@o@3^Y&heY@)FGb&0d_r?Xh@>;_HT2O;K/WrVLT&oQi7g69:@!=d`<%XPB^@mT34[N+G&:cJEd&U-%(nBO:NNM.AF_J@4jLo/l::j'92_1k4M&ic-9op&".``/L3t;B]54KT5Jfq&RlSQigiW5sUt9t9UjI@i,X8:NbK,ab6$-0Y<P<[#Xqa5G!@l-\]huth178k'B47$r^3P!g+!4#=@+\pK)?J-A)Jtqaan[d:k,5n!1CUrbcK!b0SG"Z(JLs$6ego?feV%IBPooU_l[#/k8k14YRoDu"gQ0r.D?jo?iaqRUjri\$nJ/6%.ZhnZF0N3">7NECOir[$@TJ>bcb[;\(?3N&#N[(L^ng7CWcP3J2mKI\k5'"%:a"_Y>LBeG5tNg.75P]r8$V=AYI":'+E$Yj%Vo]j#t:S?H.V8K!i<3Fic'Cp;GM=n89k28I>e4c%m=:%F8+'a-JM^uP,E.[A-4obhhTIZE=la1/PX,.M.\<Bf%Emd<aLrMcl'\TTe2qfUY!8`hL@U>')o`AH^O;@-[Nrp]4KM_?CJl_Yg"nJ]O#92[r?23"11505nmj\(C'oJb<)Z//%aLuqatFpQSdFM"ptJB8?9lR4m<qOiV6V;+?O6BW+%];d+N0p>._[o0)]/j1pkt-L_[!h"2:>5orJg'/7(.M3tAp8`1(JCF[^.a&;Kpn#)nd`%=05IqllIuBa3l<;kl6LQfB9)[WUAVca'Z'Y*LBQ2Q5Z#a0`H0.DSO#Lf.4CZW]0r3".1L@o+,u#f6sr]&l2KmWsF:J=r[qG1lgX?W:J&X8FQ1h7cJb7Z)uIB3Wc_MaXQ+F.$-4n8bQ:UYefL_Nn-ghoj/j5V5AP.7&$\D^MTsIVP-#kSBJQQuA5iEsB#_%?:eL.Y'Q4@Ks4G@_<'%cK.GjjP\jp$ge75d%NM86i0a]1tUN^!q<%.^7K>h-r?rkh<ls.a=b;1lr2)%^6c*QBh4nT_O1:*)A6_+#ZFj8hS9m`<)Tm)[Yfo*jTp7O\T4@K3Zs:l'5F*qMA)laWC('f`Wt\D%c:\%'.D>*E;cOQ[eM"+942#`mdEeO$j3XDcFt`cTfujNp<?b,EZig`0BX5]BAYPb0Fgp']eV"bpWD$F2et^KMmPhAiC(r;UADbsQRJ:8CFb:%O[F;3^:OU],KR98[/n;Dr)Y&mjSU0e;@3Q]-U`W%6aY0^P=\Rs5V@W8d43'/d'E><ja%#l0LQ<XZT"a=2]ZP3iKfCX]rR`H<?CPG'HBtF2Q=5rGK%L<;hP@4_pE1=%0_Xo1p8rE<T3F9GL_GN;S9R[Y;E11bjUS+3%,M-kt91kk=0ruOJm;&?N0le6CJ9ZSpWJ`rOS2h`25uGfE>%pN8q3E2u;OM,7NgPo19_LfDio((m*cC"qX?!j7cm>.jG^<,['`T;DDk6Cg?h0+3N81R?XQEYF6"SbIPfhf//M+1RR=;A?;^c9K`>F^;_<KFM#(0?U&j\9%344'4Z=X^$aYT",JfYE<~>
+endstream
+endobj
+685 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 684 0 R
+>>
+endobj
+686 0 obj
+<< /Length 1881 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!Sl=``=U&:W67@.e%f+[gh`%l\JTLQ]#S[uR5ZmDO:C8BB4I+r-410p<^:"](3_,ro[#D4R('.:TK!pKM%qCc[qW#G25*Ec(U#Y,\C$"4oh<F,5AUc(Y^GY7hj8QE,#&bm&(jc_c?b92G0;bB,p%5Se,>r50G]$tO.6i?HV?[-:ckE:cEaq0OgDFOMpsQ(p!Bc8P3;(5su%T<VVu4OQE.dpFTt-7Cc;4aaW9;Z257@f2C(fZ5'aV*+nK[R60G81sg]"NC_lCrJMI]RET8qDmKX:KdW;Z((T$jsOuQN*%:'Rb,mGKEi$af.>55!!4ILAAOTpR7X9-"UdN!:t!$O+80r"c$6OQUZ;uo=[]Q!hL[cnbI2/i+A<P-KP#E@?45?S6kA9*jmd(3$a&*.#+lDmbE'MpL$3FXEZ+NqgY\f2c<?>ZYb>Zg9sE`L7;4?<UlC7o@n[\YE^-X%<Rd%`8[G@dbSO_4ccTOE"V,4=3J1X#I=E6Tl]'5Y?<1gCrrOn8l!DLL(g.$uT%:cj<V&P""Y58h0BM20<(sflcP\tba?5oroS1IZDhrLP/jm^rEkXZ77QL@YAP&o:]/WfeQ[2+9oOUsA=GV-+).&@"Mg(NNabBsNa-V3oGHJoZ'P,tO,"5+:)hk+\4ghs1Keo>K$\&>S=3!Bp#%nZC.7IPd35(+ABCF\PeHGRVXh6mD:?r_[=_fFC3`*$+@2&?g@`s)i_rPo[2Yg?t@N.c3G0C\./rpd<bqDR7q_8[IHV-tp%J4Mg#Kf0k8fX"2!.7B#gXQd]^D]t_:#W8XeoEoaRg0%"=`%!@:uurCECs"&@E:dKBV2]L0D/f\:8WBh":IH*Wn1L9Ib^PdMd"2DPRXnb<"giPX%JWPkU8t<^+A*l7^G5>4.Ru_OH)MM6^$fu)c#;)e_UN=1b>t"6eJRt)2R*"8:0_^4R[,cdW&['Pq\$R*T?ZLcd'\P1.bu)fB8idHIkc`#/hc%+TH8$A4'^jL>K'"!2<t^4PWU%*kEEL5#'Wu'J!><-2RXlGDaNu@<a4Eptc>Wn+"\VBr)W:IlZtDgY[J:R?iO8g<7+b:%04J__/6A#(Yk0Gu*S!2c;Aq,="3ZP/Nm2lQ-<FIsnMPCDL%W^8e+?Vi(H-Ms>YQ<f3f!qP["\&M<P>.U#7c&-l4oj>C/tm4V/mfEgq*;Kka2;4%m[+51kk1TV-ILlfL13G1$cL._P\Z@?+&"AY7hH*S-@=`7_,SCQfNbL(<h_mGt(iSafCn6X".5oAjuhb?(.V\,E#E2m+l>qeec>gWpK1a8.ISM5LEGJ1>\Il8NS2K)/t2CZ]&`afTYA>^^7Z!EO=3Nie=+B=dj>!\Jp7HBHu(SgE3$ASS[.p]5!4K>Pb-F`u#Z]_]\Xlf,4f.NH-\_8RN4#sj=]QlFJooVf\GIJV5\t&-T2Lim;DF"uF":(l5;/osC_q8K2l1-_K"u4)+"&Z=DhHgM$0?pAM^]5mN\430t]oZD3)$d:fN#)k%[T/;5#6rK*<dDB+0ff:$6L$&\fh)tP(__-4A#oV"H9+22A!+UqD%@tTkd$FZa%:S^bDCcah6:&G?_a8mM7L-pNO%(tO/!DVX&&1B9N%([gN7hT?N&C;J379)j5Dnelg@TK)+r\\/^:1E\k3d%mT]Hb8\6=d,uBYoJFQg=kdlh1;"qm(B,1Yj#i)M0._e)+;-@k2jd*D>HD.A7d`(kd)Y&a+6U?^jXtrSf4NI/Wk7pA6`QRF%Gt^P!Gf.Im,icqmq`L*48"&-6;Q[9XI*;CKRt2eN%lU,OW$\[VJjmA'(^=[Xm,U;7cBrd;%liUNV<sDekD9odg+C?c&GZ#YKal_uU#aL`qnXYb`YKMi.jFe.mU&P6_PSP0Hh^^Lr\*;Q7Fh~>
+endstream
+endobj
+687 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 686 0 R
+>>
+endobj
+688 0 obj
+<< /Length 1781 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GauHL>BA7Q'RoMSnDoGO@)\9^ZEmd?6<LfadqoOU42?JY.u=Mc$FU#ths^(]QJC,4@2\p'Ol^Z[c8jcBP5F$!>PMi<c4&c:(fP;#Y5UP).5E`;4_/>omD<$S*hl'GRC50Rqs=,E'pO_H%9S2:qQ?=jqi9tci`78#d29MHBNmAs\W::_\e4<#4alR/fRRgg?--Rc,W#pV<f,M&Lg\J'[1<ch]pNYX[XPLs@Q0cOF11,m)d>bI=2a^TFHu(E\<p_,X!tJ!9cNVDm??]4e_9[eM8uC4Zl?=o)"Mbbj@ina"\[j6*L*ESm1rsY!6*#o$p8fU]stUV?J[4OXX\L!`R7`-E<r:opiT7ZEe`o0&O'2CbI*Gl<$I^@NQM/lh+P-GhFNZlWgaIP5aGJaj-B(?9ejNJRdM#hn,m,:nmV@*[iUid*4%OWkF#_Gd/EDp2Ns#Mh2:H6Rf"><_JPAN9K\p5`EII5]nT0dd]VOf/DGu_@epl>HBg3S`doF3_7*D>b46b=g#EB09]S+T66=,!7RB/KH.pS3"#AuGoY*sc^#XDj'VoH+'se^;-SM()T2"aBXBW^<0J^o(Ae7B^dMohh)V?Jr>Tbi9=-Jmi7a*<KS%:s-f"ceGENj8adl;(W#:"!,Ci"`?1Q(#.aS"t^h5dbi1'kV&C-d!d+1CHoUr4Ma;e>6Q"B[/dJkS0*,F1#<RM8HLl#[I20JZ;red-SS+PW+D8!$^J[c!L@_fN70puo5q*!a$6SVmpQJ_9Wl!;Q,Ah$3*r@1Uo_9Kkl7HHgJD;5WQYR/"[g@e'LnmU/\jK.K&4C<JJAbOsMMV)ZP!D^'&19gB]7'T:QtMbom%WaX?#)m.VGK1sIjog$@t7s7$fSjcL-TPd%>SM.2E$TQ2f`XPQCn.c_6"Yrd4g5Vj8-1X;R$^LlrPir"J/:K<MY2elO=WmFK>2NH'p"O[L^@ETYPC95T:Cd(F$FlfH.&8bX<)Wl)@0k&3S/",W(!>ho$_fE5j(b%PgLb5lo2I$gM/q\DbFTG@bWJf]^N\&oI3(-YGp#lD^8'QW1n8)sDjU&9b=0X4LT6uhN3^?d$E$R6GuTaNe9"Ap;Q$@jGFGCI?dG'W:6Ce7PLP7iL?ga8q@$a$6A.J%?PKg[UrQIT-@osn_;IIZ+7'/,"+V=9M3@Db?M'F9A)C7r0S^u_$9LVH,V1JIbIr<>W@j5n$%`jO:R&-c)?ie^%n^@$]6%r]!2iS]LZd!$(2kfX(]&N)l!LKF$?eKg'Yt%NWiGM9Ba@sC/]2<pK8n?]R4kcCr<^m`\<M6jqK8SWQA_hs6'X9t*#uA4?2-^GS0ipCqV;_f52n+AV,]:LVqc4KEY#"&8S+3:43%jBs.@I\lc,o?fZ5h)UbX!bnuKb-p%"[R'6M5HN)tq-TQAD-K[&0>OEIf%YriY3l+R^T`eD.a78R?:fop"FGWq<4a*L"#GHE.)^&@S%/7n'<jTQ_]%RI8XbruYQ>4k]'_^BCB>0_D+lje4RA=t=0IRM",JVS-H7g#H3hcU2(1<MB]f0N%NZdla1N+Nlm5Jo7d%XRc6Oj#W8n'd_7):ubX$U;Pl#N#oS@9(W$YV/qYf:47<4m@8`6bO7MF,<d[%Bsba7%H*[`,pUp*H5$S.J0Wa.*M;,\Pt8>D8Hs@5m1PaSu4_rhfAm)g^9>^h/TD(^44e8^(Opl_PaOG*"DIX.g:`;O?R'j5W3M)3DWbG.N)Y]bml5*>L]AQ0]!'pW.I-0i:qR/IP,1O6K+-5N9%lVYYj]O39OJQpa#lDpE.I!9%O~>
+endstream
+endobj
+689 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 688 0 R
+>>
+endobj
+690 0 obj
+<< /Length 1848 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!;f966Rn&AJ$CE3uYI@>;70hScSNXkg!V/8#K5%O3^6W9']VA?Yu\"pCA9QpD#"NjjBiY8R3,Far5,I[aVj]Q5o?)Q#Ds?C9Hq"k$*<LGXZ<]BGZ6iHj3/dCrt:^A2q8-O#L)Pj4/X/b:NRBuge;^I9#Ol'8,UVqUGl>Opfp7JY%]bmX4j=O6H@CWkpUP7qr>^E2fUr+lj$>HI&J+!s:<)HYW'D>$IiH8i)%dQc=RB2%quKJh$I<E,2c^9*H#h&`c&q($nq.?`/02mb"+LTc3uMc!$o10R/Si7H&SnhRIu]GFeVaTmMN"YJi5DdHP]7k7q4X3\7o=&PX;=4KVMJ_P/<,V)KtqB"@kchu=WLL40G=TUKW[far7Sd$Nh=j``Lq$Hh=ZiptbqgeL:V;*8t\[RAGRcK(g_5MH6fVo2f*_uY03mUoEP[GBIQXKB;-?GW:a8lY0o.1R!$GfWDQW_<lR%N;`%je5IkQd3lne57O;pY"<p"m<9+I[g2jCXbCMnQg<K&jm_hX5Sgh^NdPTakul8=F.eSn)9:h!4k*F^`m/cQFQ1(dh%'4!,J'0<;06NS%ZmE+F/a:84??o;HT/W1oq2M.1qB8Rkp<"/$s01=LSQFZ@<7X`%O?30pW0n`[.Z9A%)bM;rHnCd>'rH#cF]":;bAaurhH"NtUu."/c"p'#$.:Je+P3!O-I\I$0PH5Qb/q8*I?-HY[FEP:8Tl##%>a6lB1:.\$"8`k<QLce'=8mGStMTq/0YuCMI&*qX>N!T)^7KL\6jI%KN.7bX"3+fUD<bRP=<2[SgOohDYGd&!l6l"oKq3@g>WTB8AB_$tN&<KMu/Yb_UMg]ur8^@lc-_)*`qh<NXVJm]!D1%op7T,]eTL/;u(O2;A(*+K^g%h#/?f9!^oun(+'gerLfdY$OKa7B,8tWno1a1)4$YZ"%3o12pJAnn_e`'UUXmb`>APXG,mGOB)%Ph(0q""5mG0A5#q2:$m`^[+^!e5`=EdA/MfHuN;G/$OYC1rcgSno8CkNpb`<Ll?r,\XC``20!F9ebVGnMgXncD`R-I?P%#4kH9JAoZ%Ba`?c$,\jeiXhnZj^3M:c[D.p)k#blroCdSF_:piI!S<,O?f<0Ol[%b0><..@kP_)L"-tVr_6M/e5GH+]JOR2r3+jTedh"NE_im.",>\G(oP1M$9NT]7OHkBN,FF8D7kZ8f'*fXo9^33E.qXN-qoC)r4)QtX'XZAFM5DThPCc"=^t.up:M*`K"H+IA:M9RPp$*g2a-Q\lfO!oLk7h*pkJe^0l\,B)7JW<"[]5[RC6RC&<BpCId&giDJ?"V?.1(@:&rVM/]s5c_#V/&b`8I@qAUpG+!CE.dMbQn9CT/!r#^Gc^`7SKk&_aA#RDt=]37%o(p;EIW1jWh!2GHJC87O-B/eZD45?Yf:S+aXS]uhb;c]'\_F_T>7W#M_!b#uM'o0)Cks8TgZBbfe<ha]!bG+C9srcSl46pH_\V\;Q:I1Uaagm8G:.DUc7Bi`0uUuAl64Yd+!TRqFg\7M0i!k6$;pD>E?a51]W*d.tISku^pWS_`H,BeNE/;_Zm&ILO*<Y6&<5ec=Sc?!0jX0NA`\.1GQ43\>X4^HMb&N)?%jKJqq2/9o7]<egG%FPeMWo9Q=q&3iX&KS'CA0pC4*H$dA5^-D\dGGF%Uo;9R@augV<,[lfl?TDm#"B.\oA?`qTD/Hq44S-^@FN&I'a37P2p!3:p-2SLG((\>IJYso1TT%+ZRfoP$oB5bm`),\AV+@>E0.\qlVgK@"B;GkpI_5"h<;rRCsQKEhD[6(+O2McF^p>7m(%jXC%D31Gli/2]dp3KpsDWQ41k7oce0>0~>
+endstream
+endobj
+691 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 690 0 R
+>>
+endobj
+692 0 obj
+<< /Length 1608 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!#\_/c;1&A@6W3$qW-K)gJE/MiSamFH/T.X#D7P;t$nNiC[h"[#rfrCStM%C?*sM(=ia%&2;@WF'kM^J)p:hb\sXQ>K<-B=@>P7LWN!&VE&oGSo(a706u)1k)#4F&lN_VF0J1oA;[Rj"sUDk&F_'fg\,\_96<5eW4WM5;"$\c51K;bpZjKGZ<0dV)-A_eQ:=Un]R<tWLP8pGjUP]Q<u]MYh`m(R^.O7q>.Am14QgD<;-=<D3XR?f/s:WGF#,k!GbOUTHlrQiIGM!fdqSUB<7-_AY/$(#8%)c&.P?`lR6E:22dY<oaijP?7u'EO_<tR/-S8dKF^$Y88ru;L=#\h#eN[3CjrC$gD*c:S4CnW+W,R,/7%eIfF5Q8`(ANs8VLQ6.G[?TkUc_I+&@F*fP`/B%]O+FBT^0.9dc'eZee:j(]g5;-fB6[BG*k6/n/&t9qpT$Jn6TLp7/<gUsZ4.Jk1X'IS_m344@WD_t\2@>424mC-7;o$kje29IEjciXH?2UVnb5Bft.;2*Tls`k=ZaA]Y,]1)cGi#3rSeFB)N>"<@RpiYk<@Ab;b;^]c2@LsqauHpH%]\pV7"(8Y0Ro2V5Qj5apAPe&9o.@p<qY"LdJS^ZQ"X:7#6#%r+T#7M%fGXle!=>^a<N$VaYOp[5EL9!":TUg:V>&6YiL>9-0aR_a"@Mu9/lQS40m:tUEo-I%e3.cZ]X2Ur.>+]^7@r#FV.]Nr1m=)KWd79tfL11>VKEZ+//R2#JZ#lHe5lYnRp\e:o*34M2IFRATg*`-^GU))i@C_FW""nlm"RB[2c6D+l??gbF=tQ-:=nGl\U=e"""#Om]Z)V\S[34+A'i;kLIfT_W?fjK24YH@tB1V8NJsr:6%jAd`F<p?n^Z-aZ+ZYIS=-";[J[4F,pNM,;["?<%k:2fPESP.gP)3L/cS%@*Z.$;IKU,uu/";=%n0LX6Zb.\2BtW"iN7ej/"j$i(s81Ph<tc_5L\&q_l'-$^RtSLaA5C5%:QJ>1qK5<K9tk2iE;,[J^qpKGf#J:;GT5`V[n0$,&kPLE:A'm:PHs2[Q:RE$T*M\haf+m;@RV5_DJ8d_?CD[c"J6Y.Xl,CgEZ]>>HIe;A<oh8'FXlVo^Z<!j<=mn&)#>R'%<Zd8o8&;KS:K5FACTPsY[NCN@o.FUhf[RnWk7NZg..KUMCQa8[aWk47*[[JO#^#je!LR.4Bk`YkQ#8C]Vh'[n3!APcIVZ=^)<uj`uN]sAU*r@#+_.Ie5'oEr8eC13hF5pU<+g=:O>m.<A66f4c\D13b^o'3[#(5.l3T*B_"oEkW3\lkQo904U+nR-FN:`dhqQS,`.R9Zc*eG>V[-sT.$e=+52/La^DK3'mj*oPYt<JI'$p5DdBPL6U^f[G/pSmZ^@BW%cDV5(tSX+IPV>Kf#P@kOX'9%c)TJV@=BNrSF\r>Y"1+.e=@Ngh[*I.\)D8G;h6Ti.d(5a2d_hif:g'i8K=3\Q7LTMs+/D5Y5^"s,+eqP:]g[d8&;.26Y&PQL$2VCRnC`0*R$6.cpIZ$?XFUs\HG6SBq6hdD'30C"d\Xt>`SH,4-PUlcZ5$6Lb%.L,5HN-?nUt>(WQ0@?_o.%PI(8iOY8eX~>
+endstream
+endobj
+693 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 692 0 R
+/Annots 694 0 R
+>>
+endobj
+694 0 obj
+[
+695 0 R
+696 0 R
+697 0 R
+698 0 R
+]
+endobj
+695 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 415.56 436.528 470.56 426.528 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 346 0 R
+/H /I
+>>
+endobj
+696 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 463.88 420.528 518.88 410.528 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 346 0 R
+/H /I
+>>
+endobj
+697 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 444.99 241.528 499.99 231.528 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 346 0 R
+/H /I
+>>
+endobj
+698 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 372.51 225.528 427.51 215.528 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 346 0 R
+/H /I
+>>
+endobj
+699 0 obj
+<< /Length 2520 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GauHN968iG&AJ$CE.!P@'gqK8hU:!>@jX!GWk*ts#DdsW9_^)&g<!$;Hl!tQ/kCMY4_^+<9G39>DdVCRr-j(eqJG5Rd.Nq%m`KVE=2aXe5B.;XXsIE:Os"r!V=W:h'"BmG.e5^3n`ij*nd"$#L+@^p]^hB9[M/#Iq:f'P$=Y68GeMana@qGLe&_2W,2ZA[H9.82-+Z2;'MR)KaOtg74j\BM9<s02Xa.$ZkeVR(rdJ6Ao"'uBTi@]`lH1ZJ=8N%^G$XTpRCCp+RBrp,rcYsHG[Pb,,^1m'#dFkT&rs1+d[rp*Z@=o9jVAm"OQ:Oa!OQZ)?J6NOaY(o-PdS<@.VPl9*-`^anbOnP+1`9l1N1Rhg53Bt@M/nj-=p8c]YX"R"H=3->dh&u9R_np@(ns&[DRN6,`pFOnDo&>f!:L\Bq+9Uglhd%)K?+4P`j\TAVi?`7(k$OBhOSo#2dgo8IKj8[-0D-S`?!jRYff4fCc:XQ"D]dFG%tTCLded]3:HOPMdNd+9?l!K8`cDA:Q3R,@j6Vk;ck;+)&(6XLZQ'O1"a2)k&PsJ@+$FGZIpX'n#q1'f^r8fUL'?lo*Gcf,e\nSYn'V=Os.20V[WT,>)V/E#i%u!')Y@)a0FoAmGOTTKd,/D^f&;FtQbU7=AB+o8gE2(5:m4,=^$hcPW3VRl0s_2/UJSJs>#_?kC(uCQii`'Za@*C;G[%*=CO.g-[CUU;.,\S$gDl3=JcNN\KN!Q@HhNlE7PFA-`@gDe-b+"c:/=jL>O93m=;c$Ja(6^S.4[S8&f<OgbQ?%Ma=qW:glpEZ?$Cb?V9nIRi0&OJU&)R4eI6*Z;XTJY#rQD-LbY?C.*a8oCcDIFU(SfMKud]IPE$W$O&npTKRa-V@jtr1PN*]OS"H9!fL/fMWmDR*IG15&2@MW2'kZb=8GO=UI;b?[-eliMToH0q`7/gq0=PUXKl<T'YD/2G4GA$/OGXl-G9kOs6)?Aueu<qLBC,pmNBc>/*#U&^GYUm\Vu0Pa>7^Y;(7TBJ$XIJAE#l1B-&r/&hnABSl-PYIWJ6iEjEe51Ft<XVl/q!+(0]o7jZ6Cr)\aPl$r.]D4QC+<2Kuek-cPVK/5#[-J24(Nd7mR<"IE32D=S?YX$S'RW<(^LAM>Ri(^<??"/;)XSE*hjUEeh"V!SKndV&$$I)<Oe(hnBlO?u#bo5[Rh"fp7u^s>.qo0X^tN4!,s+eRVPOYHq0Ze\'\u@S5!?#"*"ZN3?pI@*Tq#i%c6a;_kTtuqQ]-U\p:dk`G\I?298#E(bDF6G0?m5)Iq<N`@>a8(9Je9Kn7^4p[d3mO:+e%)$F:nSUt_6C$pAQObj<"3`VqcGR&%&8Bk/#gKIH!ZTWtYoW#rEVZfQ9^YUs5i1d.NS$&njMJTj%I[_'W#;6[#lnsoBA6/U5#HY?%TmelDUHZ0Bb""YVTQ;G:r^278MWH=JUD8S82][/?3J62`ls0q<pJ$(mmNT$M95QCTE$Drg(#m4O?kQA_*OYh7!e.KpX>lAj=]fJm5*(WnRl:W70I4+ZDRsIpB)=g5O+".)90!:o::!K+jUH-6t_4ZhoZnG$tn_^EKX)DAdn^;mJE'[\uZ4PRj=lb`&(d1I)W.i.#06]g$+.nV,Vmg021'+$\GhFm;nH%4f$'N49K)qb-7_o)E(\@6<l:*M=jS<,c.!+G@"X$*uUr3b+568mXD^T..6K2UnZTo]h"B(mPC-7%=)V,$t^Z>B##p>oF!<P/=JKMHK,NIc^[.T>Q]2'51KW)j8EW\(J0+'RjcSuchN++*QK:E88BEm`Thhl$Eni!l3:5u:N)'j-j]j,\EnGmo#:#.cr!Le9L[/7n-bY<M+_;c)oiGh^1:@MOglBha($mdo"GYSg,-@c9rmEDY)'L8=%:[;J<cfP%cSC,t6AgE'g%DrDk?+%YH4.`m[i!^E<>lH6Wg.n+"o>&^DZto6=Cfr4S1Xa82kj54Q3GmJf_?K+>eL/HEg!`Ht[MJs-bq$/BA:8DafNq@7P9aqIs*$"H-L2'%)t8MQF2mfsW,)U=o"tM?e+c4YG>2!Dr5NVQit81*X^qQG9Ep!f$_0D+qZH?V\jCVV*$>==rsXu-[/%R83W:iU;]=.Tb2mo(T!^7tPLpp-jG('c^4BXp@`MYYRgc!'+bh<ABK6kQBfP+J1"A_!QOa.:\A9;3HMH26s4XV=.eAYTF&>[Pip0&/pcS^VVklt0rglF'46m+\mmZ%dd2233=qA9hNRH0--N3`%m^pq&;>[o/]`;=h/+<K4I;O^88Y=_>.n5=`Z2$;ie+Xek.qqGcm;hOgS7)X"E;SB3^O3Qi&OeQDEEjoXNRo.A%$";g-:p]l@S^H4<i>ON/MQWn2/G;jOm[-'I+s,P'5)3K%BSX.gE/m6!K_u+X$s`A!*M:@Yo4gqT:dl45:o1gi(pc^Koa_@:gjM+V?-u]:dKTjgSD%@DFB5Lr1RM0M5mA;KnUuu,YZ(n"W`)2U"iPN7I$u)CJ4=olmKSFPpLpnV`:eg?qJB\IudOf^KT-no`~>
+endstream
+endobj
+700 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 699 0 R
+>>
+endobj
+701 0 obj
+<< /Length 1647 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!#\gMZ%0&:Ml+\5,hV%9Jc^?&G@ARWX-d2!m3eh4iQg"!c2O)d,!G.W57"<+8KfMj3QN"cBrP\o;9,ba^Ja?Y1[(YK-inaICE9-f/BRJg[/h_irU%f4$C&31e>pPHUmj-*PT@k<<T$5$^gdAl:d8=*W"_`TNbBV\m[Eh1#r/<a:mFL!<LpXS_bJ`KqZ\VYC6pO676Va')DrLV&aHGNl[k'OMZXkE:;]gLU#o$pI:Y2L$q]#BrB_?7meLFVhDT8k@la7`!nBn7ooLQ78,P]APRAeh42q.gL0#0C07a!=!:XT,*+qKS6]TN#V$>gg-=@Z*H^*i")nO#.[`>.6DY@[=RBQ]S%qhN974aF?-nE<_I%Y-4X6nU_%qkm)IP<%R%C_)f71@]h7&Q1p)rA`VA-_:Z"lrSR,*AS*=E,cR=si4DjQDSh;=Ys)<>YF)*+o?u29gT?Q4!7:,b*#6tMZ?QVYJIar"&QJII&R2'^gRYfS+eqJO!f%M>AO@U:b&>u^#2bspgr*7#mQ`Lh-bWm<k9L;6Hc>`>F*2/Umj4W/hp#u%1+@QSC5l(O<I8t].7QZbWha:8*]N0o5VHr"4(NK]L"kKVOY5X#90,?[F"Y:!a0#.R59X=ktkI%=dMhOY)k+]3p"nC"N[!p)?Ce5]k7MPd_+>U*[@XRAiqa[nHGK8f[!:.H4D-&pu."l<_U!T)0n;*D5*pqK,_#/Up<X$h7K$$$4Zhb#?RN2UWJDp@rVqER+Op.g1mZ=a<'Sqa7^q7i(.]R>rfH3'=^"(RWh1e1MR9\r@>Q>R>Z"chf?AphH*%$@A7SU0?N$b`EGZ!*lf0mZ"A3H!8m^rqkUsq\^]"%MClHS3)B)o89Cpf#5.fl`0SBls/ZU`WUT!W'X<0G+K+Q#h^P16sgZkrt8!O1_h0a^W0b%`AJI@kG2]W]mC@kXH#JiH'\l`DeA7tYm#cN!olIL&Jr64uADjT9HVA\Ka-3(5)>D9BZ`GEM&nl->%KqIRFp5<`TU'_?:\Hp.CQ$/$V`ohba;`+YpoOAhAXH(?Z+7Ee1tLlESN2q'uT^V?2N)_)8Kq"bDU`[]i+;A@&`#9UgCl1ok_X0IZ5nDtsu/?%u"!(eqYMTM-g1dS:u/33&.a/%guoq!dH677o]SWm,,JJ6W)b1AFeMp&h9g3m@NE9S>3O07)napLmj#AZT$,Kl;r'CLh^_S&\-UU;.ePD'/[5O#tg9rnT?0Wuus-.&Nu>k8^_C<+nR+:.r"G'o85AISEKBRHS\]Mj)'c2(b*iZK4JdpC+u3(igded3PQc"u`m\QrluLC<KDDkT=aF)`%j+S,O;S86K5Mff7@qGAlb=RR=WlG29>ik!WP2*I%^iKg>hgjOMe,@X0J*r'`,Qap^."jt^r^4ocO5^2sb3?\b$%)\W"M^1k1E8O5j<?gJQpis@.C?]\Wr)960&f+M3IhE,p?dN?@1#lbZZXaTma=\XsHeW!OT/c9.GnjL=UHYXGNFItAi/snk!V,=;Z?n1m8OG;dpP=l^1i8"+UJ[r6.^lf76TY10h<E:TF)V]cLhO2h&dki2H+qNXha7NbS+*^kWtj!-#S/L*OhtNH`^p"%8a/NkarIoIP;KmiSr%j.kTrqK?U%H`D(#&&-;Qk?D*=<4:AtDDVa7$~>
+endstream
+endobj
+702 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 701 0 R
+>>
+endobj
+703 0 obj
+<< /Length 1972 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0Dhf%7-&:Vr4iF+C]&@;4%9+H[XY3TP"Rl!d&G"'jb=e]CMZKP1ah!D3dAP;/_,3>WQO;EfuO*BJ%^\c)2iR+]MG[Oas)MF"nCN+c6%kR6`&&sVHo.;';rZGGT^)g'F#"&Vs1QOQ<bI!AgCa"9E9*-Ji0.A8!Oqhq*"MUT=r/M0]8;eiUZ79oLGJX%]ba(J7RbalLhiq_@mp8?O\E+04jo&(mp7=G\i8,^;3FuT+8b7ORi%E8M#2]XDT.5_nnS!uX)E_<@:t($!@2/6p`"++2ZEd<2B-iU1Y/'Vc\0(8/mJo`?7[XQQ#_.L@BND@ooOsm(n/e#FqkmiF/:E,L!q%WgLSZa(@lAabIOPL[1eiN+AK2AH+?B"I#hX[@-tC+Xf2mt,:];#aM.(DMFkCF?n\%(01cmQ_?fo^82:`NubNKNhKGdr*ISWZ%;[]ul@Y9_U<"S7aVuC_"P.6#W1k.8@+K7X/fuVu:[btt5Z=,coVm$L@,oSI_`=fa9<TDiUVmA6.#nd!Z)'A"Z8<5t;/'&)m"FY,-d/\_<"4>VlUO(IkGN1jNWtnqZq=`+Nn%[(1bV!LoTeJ:.\u37`]0$#bCAN)d:@:k`CRoK^']>P(h*egI0hP)Z-GS`&V5-./[?pm.[T,!Zas7HZjEob/VX5QD3Pl!/p8M`*AXA2+(tOJ$7i5YshAH]f'V+&<B5>@m5D#kn?C]&h'SNYXDp!FL8G2q,Xscb#AZh?9Y'Fe%'ulhu69Rop#R-2T\puk-fUBSfbbLrVUP"]jqtiL%15h>ATnS:H!lXf#nV;K45t%o"YY^K)9XEh'*;E6s+nKnWa+?]Ja]3*:/1G(=iYF(>fg`g@HM5tXq=X)k?Off$HdbB?%NP^K[#6'2-%s??O$[)l/f8*nOsApoN.bkihN=`CM&NXuGA^,OBQ3-EC6Bc^U*(s+W0Er)4\Wg#U"gHI6L4^H'j8f9)PDFN4O95\(j8h8@@sCuh$;*=N-,\ZdMpH_,d-Vq_U0,?/XH6>MDf;a)@&l*`PlsG/ug7dX4d^a0t"`il5[WYc1PIHB$j)uW[Uq:4TMZj-UNX]+#?'#RjF&\I9@tCe0[U9YBl3RJZ8*+.Kn'a]U<aoq4^A[&9#Ca.]N'o@36.:]4+U=YtRNI#PE]s=OqI^7KHp'CbI*#S1K,Q6GhA8>TroJ//8/NUj)?X1(DPoSVI3@$W8NYEesEocU,IhlWeXV(@,H48s#6/mqV/>,FcD&!r]DB!kWCD(,od=a`sHRX_4XV!&_$A7/Mqd1uc*hFe,dj,Sj*L#^0W+#BV\UC]ZIklV&dpTtM'ocq_aCQHt!21$KKfXbqK,IOQ1./iAc[CBkK'O&t<9a30rI)(9?*='Eo%QW>^_ShC8p$0F55WC_G@q2Wh5DR8n=00_P;3+n)A=jS]pbCh.FlTf3q]a=AedR%pGcn2W>00[GfEOW!?IJOeU%T"/,Z/liP6eSF[Rp:DfI2Ft'5hJ,N>eUtb6VPjp"PWQ4+jUs9g676j(\_@ipMBtr'!@@9I#5f5'4^jZnt)$^kfQORA-Y"22*6KV_dPVb'qlO@/POVaW1;h2<LQ'6bLeMO#3>fN,YA>,G[tY2+M2X]MNaE=].6I%ps@`[6>Y60D%kN_r31Lq*6uY[/(=.Yj@mbmh5d:hroHZ>6%2X4Fg.]d*b.We%WAO8+DmP!:=/]\TAbNdL[7<H3]-229O(YNoWeC-8^p8AhF;.*DVOmIjD`6n$rS_=cqACC[bK`f9WX4Oq@D9F*E0fc."lGpo,$TBW%XY:.\>4GGB2LKY5RLiM`\.Rgh%IW`RM')XePDW@l,7Yp[d]p;n:D#YUdG(a2/=,a5b#+Vqh`9U:b,'$BjMN#(Sbt1RSUm.Qb*)3X?7r2@S]\@p+i;0ulW5Xqg>'E9@R)3)o!:=s7dA$b;=OO#KLl,nWq'4(38;W90$YItWD'P-7q!I"M%1jaI$d>OBN`4Sfk[0if.~>
+endstream
+endobj
+704 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 703 0 R
+>>
+endobj
+705 0 obj
+<< /Length 1772 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0DD0)1+&H;*)_=^_^;p,dr?8=I-EHBD_G=e5M1j>Lf+(UH8Eu8.-43bN)J\dM/0QoOKb[cC>g6_!U>qN\s#,=iC5R9V"Qjo_Y4?s)bJ&lS'Z01m!fT'eOF5tFMZ2b*me/2X#`G[,fmps.'WRrnE[5!ohS%lu[_:@RGnG1T/C'9"m1Y=s3D5K&H=!h/WR'+1^EIN@$q=n[p&CdU)_;O&J!oHJg'tuQ+56mca*d(`G5i8fN-_?'Y&$T[\e<g_0%c.B^@<"sc$iqt,B=j=efQU"*@+2;iCfp#YQ,GR5Po_-\2IB,Bb`=CT%W!g'(94W:+WWUZ$:Z<%,>K*uR[2`W*s?d4<)Q_I\?/[(D<"g]qjd14H*3fu*5'X46rkE`T!cTj%'X(\^W83+1HrIKfe\[(7Bi,#kQAk,8:S/HE;M=d=[uIE2G?K#Tc<WYV@Qq<S*;N`I8",e!Y;HuZXBn6ch'MtQ2*o?.&O94!S;("g$mSnC-q%@U7d1g84O264lA3:F@!d2%SMtB4B:%UnmPZ"e41.k-L_sc=.(UW*[aWFd<-CQ.sHeSB(SOF%sbHQpoE1Ion6%A)f[L^1$=J$d:ampeas*9E'uoH\&51k)&>!9mr!H>,<OR#j2\Kj</MS9LFZQ4,Zg_S(Ua_.$X/sGYdP1_8p<D=85U>ZJ3oJBVi!C<=JUe2(=0AkZn)LNG[A&J%jmF;k@CIhWeRa$IueUkX/)$I[WBslTgX^aP_NDDc\d,,V6E1Ol)PSRk@@#fFs:hcN/gWenYNEJUgPoKdj09(gQMi?b!'%:DQM*8JpppATfC:A`Ts!hjmAtBr5`.>pZ>YYdZi#\[kcrd,H;b#*?NqBj1kUP\XqSMD?JQT]$8e-:FC-JB2>Ggr>:g/J??kJ/b4kJ/s'[jTuD^;_iQW3>Gcc:r`Oo0]1)R+5[0fjOEWP.de_@9>E/klYH'UI>3&G]XSFU#Cnob6:g,m6Bm-D+%qoa\<hut4eWjlg`,2saB27Vg=rcI$$!`B37euQd[4b%5.;^dd8d(R1Z6RLYRRJL^#KGUOFYW0#Z&uudVd`_U3k,8ra9-$ariVo&Sj`r%Q<8VI[\,3XJ#`F;01AH,l)(JP:=#_74XH5$*D@O)dG#C%qJIY91h2FC*lOO^`g,#s3*IOpPU?1a0";N-[bQ,#F-/4LaSH+0;VjaJTrY>,B!b[>ai'L'Z:hG4nTM4a`:15ee1!0;CtVAqVTVM-pSQ@47PUU_qH6/6kQ"?]rVLnI9M&4'gE(9,nJ]!TCO;FGM/EpR8g:[TOmI56Rs\@l<:sLuXZ#lWa6Q>4;iKL9'`!=r4JD,DC8Xt)m&7D]SFSY#(sl_7MKXWg\>*PeH!8LBXens&TF1MTchct=c@\LJlm^?\1U-M9F^[H]Y?E'A.tJ86Mj%[ibAX=j]mUKL(K_!KVW*Z*<`.OEF@As9k/eZ0eN9\&l(Hbe1QLRT*=@73mR#p-[kR6?];1j@@sn1L>^J=PgD"Rj%0sAbGF91;QW/7l*m5i[J]k(YD%+_N\rK+^rfZbQ4qVAqS**Ijatp&AdP?A`eP>Nc^hk/YJ(BGB2Qc#Fjql>9^G+i*D9&]e1jJnX`8ojHF>7ajhNV!QB]l7QVeT1M`Cm;iI/(4d]T=jM-8%M%+qp8"iVUX:UZQTaI-3=r45E\HR/bOtqR/f5'$5m/h@mn,^kC(i_.l-N5_+tqJ#j8Zbn[\:)hFfXe8Dn,$\XQO>YN/5L_P&bJqX/h161T[^agZ*E^u]9\m42[[J2491B%e_d"U3~>
+endstream
+endobj
+706 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 705 0 R
+>>
+endobj
+707 0 obj
+<< /Length 1840 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!;d=``=U&:XAW:uAA*@L/R"Vir"KOf(]s9ME(YM=U_2OMrqC-j46cSc8D9LPUWe:pQ;W(qgIp\Au'#Fr1$SGjsiP(a.9]#N>$b*'>46J]WCTJ<7`WqPJ%1BFld#*tKa^\&6&'1TScU:H0rJYujf?,9rgRP!qdOTel44;R.EJ_8Mi+UmR&T0#[@519dJj(\qbVrjlO5(V#4e2E&:=g`5@Q8=kuR22Z(9'#($lLll/i"@FccG7Dl9V#C)Eo_nDuH6*.ZFpYoFSEFGVrS?s[/,memgB"s\au'X/<V8ugOlb.<qOM:Y,n)nK;-LsbL2Y"O0dgFm=2A<1c97.g8(u4(8M`ish-r7:\QE80aN>nTN6TLETid#Z*HXQ:?!i<FX,(?kL<e]n_UQRD+;=?X10Z'X"&uW+RR&>UphkXaI:b?[,_Tl6AW8b^-eXeC$&kE/7_CgPgk$X[?+_R;qW6(l'$;CG7(imL"'C0(<5&6USj`0UTW.EHIYWu;jne#<Urb%P1/;F;P"U@;,_%!uLgPfk=a<ck?3s8p(JO4_"S;;ApL99D"[=:m,"K>Pq,*ktc;+V*YCXR_3[c8]N,'',3JFA5il<$'og?.=af.'Y$pb/YkpJ+4=E^mni%E@6CR7s<i;uW*oMtZai;hBPEk9V1ZT84YQ^I_;XWAa"^Ga-=%EfVJp)r*,EuAk"k2JA"*5mA!ms's#VgtdXJN5V#K6fE_5Z$cd9Z)'Y4Y"R?gc&!`jpuXJZ_4fD5=K@=GBK9_ScB-RlCuO=;[$PsmY8bK&Ze0@40='$%*MBj4,/#(>=#o+<?N>^QX1DqjK,PZ%J#1a&uRaPO(>i.nm:o@XC9Z)W6?cHNSntFB;n#L9CuE7-PGlYQSWdnbP+&@"o[dK]=<+q[i>nrrn.*ogi=B@_:AZ,DO&D4+4X4F-da/q8$ji@Tbkcdikt.^Whs#1nQ-m(d%b!7A,F-r^"SOiPmRMJ/BaP98Ie=oVb[D,X>[cc9]m-%P*'C^W&(E]qQ&"?G;"u11pMNr?;\,(,H6oN22/jHDs)ppQuH$MoCL<hYD`FqO`8$j0a^G<+:sRIRRq9Je4d0g[Y@B"1k2V(W,G0Pd&*t2I1_`Drp^][q:B?.(,Zg9";(U>>bZhf6OGerQ:Ta;%,5m8&rFj3)L:oFo]3K>COjEJS_UA`Fe,mb[lm3_W_&i(XdcZHfs2o\poRGHj^tXqr@6"qdPnkidF_J!Xg&93;Y:baB6/N_j7cqYqu][`[lhhN]8h%aZ7^Xdc/efrXgB#G1SZ/u#qaaaJtOu-0iD1.'L>n1cJmfs""G_$b]pe#CMBlqL6g)jTs'5OD+ufpqE_dh90Dc4.je%2at2:dOBu(2hV6$AlnZ6(aPdBPmGWY9=sHec=Yr#GcgB]XAPQR[Z6IURcrsaSCj:b(YK$15.([r<T!3h/X1l0/CDp,6e0g.@<^Ua1at+hIaHEMIlVdoh\XmcHa[=0>P>!LM2c>Qu=6+-QE2FPQlrj.n[^L/?.b=Da#SF%*#Q9(C\r:B^%rtp+M_YM%;i,blfq8f#Oou/ur0I^6(F5CSni3U<]_Yle!?)=S[K<Mu4FibQ@1gUj%#6^gpedJ'aolQ=C56d^URf&IPA1!_X#=)acAl0&_Ya!CD3?NnppW4WrZoqB5U'RF?^IH,A\R.2/d]O:oL@;o5'O/%*M)X&]E\7mHQQ!Y`)jD/g3eT*PF$!4"W8<:1]`jGo[?#3P&4"sG-8TDHgZ;.#MHOs\939'-de5o=t7E@dr81=TUtZP@KDLIjCh^k6BU:i^;4[!.X4a>o,*i.ju@[gp3;nLHcjKpO-fVBT]gGel\A9<-.DAADj";^Du~>
+endstream
+endobj
+708 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 707 0 R
+>>
+endobj
+709 0 obj
+<< /Length 2056 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GauHMgJZcs&:O:S\GSap<jG2=YmDjG9WeL"-<j\G*ldaVX.kM.P-M?#^HIlo[B,KE_7T1\7QmlfS^Ta>X)W'&DY8j`CAi/!e,"8Odb!EDoEioRdErr!3;mjPs*F<3f<&\6Kb-n5+2&'?&&!4:IJW%b@EWC/bc9iBcMT@%fsFqWk]K(!F[ag+_tu.fV.;,I)O$I=SGc]s$qX4Bl*!<d_ItI%*bttH+0ARkc=i5tT"rP<rUKb77(NKd[V'MG<&6(8r17nR9GSM8Wk7QI&[u&J/`N+iShJ!?+n*:@iBt]5LF?f+R5e#Fo3%Ne7p+3u^MWtQs#'ZsoN@P.MOu4U:SS1Wbup>b\Bj6H5p[/MG_/k]##_^;b(!rCMA=QM\mq,/F=^qfX/LDq_)Y//7?2o*buMmKC\VE8s,f78Ppp6hgCs7^5-Mj]A,Zus<RO=maSV`@7pORsc!P5s'*n`#_LIrY8>'DpR]#&7*EUs<)6a`@\Y7hQGVK%Q.]dRsptJ7Q-8TYedlHHUqHBXHNHc+2(Ul>5A2nlkaSCDsaqP91*O)m64f-tp0\^Ufe[3T<D?:p]:';l/[T5.ed<H]UX\/82p3(QOiURb4IMq9(N(Y&ODlfp!@;1_1[`3>fh=1hf:/7r^T5R6:_=atY\G*>-WLc\SqX:jgDgJQO\7KudXa,=.<+l=F0)3u[X?Yrtm_'NWG/HM#[&."n1>%l!@GNaseMb+K$mFIsl)psr>+fLmfsLjWW6BeN\^qH85e]NBiBd"CMeiihfl4Zm7%lgRdSue!EE'W!4!%`<M+DNdGRM4#Of#P6q_l^ij(dIl\Q"o318X_[b3u.<M5+6\Bb`H*6*0*RF,%'_Cm>N4EV*nOjNf4Z#'r"+jFQ;#Um_<_Nj5AT,>7Iq):H3M+5(P\L!Z.5HN%r=UTrd\(B_IkTNYraT2*;bXtm#)oC><G$--%;)7\k5$_Aml>8e;J8Tt%.`B\CZ?rmZ^9VKF[WqRtpR%PB[Lb3d8eX/h6A&_Yj1<]:bnSlS&4@L,,K!o)!Y*@&f:=5'a_i;%Y'%9j_&q<6TbEO1PL9!?<m3k>@ndsAHTM:aqXP[8gI_$D*Y`naE]E,MK(6U7Y'\u\.]bTFIi@]KsNhLcFJQ]d!Ti2Hi]gUJE0-q]oDSm^!]1(ZoY%8pDRTBB,q*C;T_^2=l73[Fb-tgLqL>\5jMD&:!PTRep8h61?X*$\_kZQ:Wg'3RLQb](<%)@Vo,ND)4j1W%t?Idp!5dc?F9,aOugT"P>=/$k4G'H'=_PE>A1tls=h5>#HL;c!k6U/IqOp5%<W4r(j9_B-50N/eRfl9NrM?u]FTV^k[aXRW27eq5MXj'hC$(=4"ZeTR:qD3EF>#WjG!elf8r.*g&D:W&0'=D?dK+Xi87)qT;$N3@dM0K5k:+bR"^si'tPP&k?GVYVZLMU8!3Ka)1ADsN]aG5&sdW]Jek%Ph3e]DR.2,%3:H.aaOgg5JXI%K%OB_Qi2iq./R;Ar$\`lK/Z8`b3aC*7eB^$gT]>.Kn]\%V33-r,M!(X8EM7!n`i8$W[CLi9T<7%u![s,0'8Oq]"TRaJu\;'07K?/2?#Z7F/0O.fY7)7u`*%^$ZF[8J)2OX+[cB+9TtF2Nsn1E8].DQR`of-T[6`'R^^n2dXaN2cXC(QF1q,%B:9,5Mfe#iD^IKn2;5Q7[KWJ1OejOW8S`Z4PR4k>BL*k4F@_PK$l5XoLq2bMTWf*K$O;.D@nmfL"`5Bd2^Z/5dDuC/k,#"SL]c.*StkX-sjtmWn>3FT#h$2(c7qj"T7Si]#>2f3R3MJlos#W89[F-bTe4C)]VD!U_H1@XE?A'Xu7"8.;+,W9b&uZemZ;%CI'A_f,IVTt:H]5TS7b(9N4:%#)=\U7C+L[O=/@>kjQGXR.7W]?>='415C7`XSfJcd/U#L2Mi('[\e*o*dSe*doK-XJK@4b#oohE=5%Ene[c\@1#090Q]8_+'h^'ZO]Q1?"TH6-YHn,NjDR%0hMW3&K6K+&CW?S'l:P)JHdNp,'1boqEKWAE/1R,_NV0)'F3&@TCpeHhl@]PIfX:!_t3~>
+endstream
+endobj
+710 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 709 0 R
+>>
+endobj
+711 0 obj
+<< /Length 715 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat=(>Aoub'RnB3?uLn/\2M8:U1mMl&Zt@s74[[\[=*#0,ZY4^fVH^*T=GXG\[9i(MiZ-YcM*ma-bjj[UB\O?)h-;S`i;N;X?U1(VS7,UK8=%4)rnZIj-^Tq+pZ-7UkM0CnsBZ>L[E?,hk!sPc@HTiU#9_+>=5NDE?%IK,b`#kkKCKZ$hU[s)bR9e5Oq3L6&*]PXksQbB_YrHM6L9t8]9r#4-2<[_>dMpba4;3/HjU//nRjWUb4<U2S:Z[:kqXV(:TZPQH;"BA!*i>%@2?o77[_S9k9Com)(pRRlC(ZI#V^t&h@)Ui(51]:sAdTRkO\H+5c-O>\&ug>SjA=6(1a`ZDC4?dDZfZCV5EXH\W"O#*Ti%.dEo-KUeC/^`MD(5XYZS)]#YVm>V(j\HL`t9Z-gU3"Z]J3eL>=6(2Ee5A7u-20DEKC>F[bSuD[c#5gds;ok2bmIC*@1$ruW`LC1@h7OA;ro;RJXYni6C.li<,ael<QSQ_DG^iosfP:&bm5FBs7\rpG;o]5QgaG=tKJkqs!OJd28Bs#HXs$k/gBbK+ciIdWgnM68>dp<Qn$?`oBURAu(,<'84j.u-r`upboXqV^H%-N(%X'$qqNERTdhFd[Z:m[0Yn+X=1GLd`&Ml/9`3+>ZFY@SsIGkrQ0e1O?cH&;?j/pb#bd%f,nM:qC(&up`A#"%;jF4pQ$6;/]b/7`6`:J>*!<<OtNW~>
+endstream
+endobj
+712 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 711 0 R
+>>
+endobj
+713 0 obj
+<< /Length 2497 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!#^gN)%,&:N/3E:T5e/=HPE?96QZ,\c&@1[VQ/l9<.3J0`3F,EW=)q3(9gGBo=]+@(g]SP5T0:a-23Sis]4!:%gFEdHkP`3gV$[[K2,jb-_Gr$.M'iB,p'D8JDN[^A:_LJ]_+.<ccAnbcXh=d6kR[n3*fa^ucaE!cOrEqgE);-j_oP9Sn^nqHbYRf*S/EJlg,>).7;@N@,[[W>R6Fk/[)*TcVLPDF.H%p,#"@_RuLQ`82lICbLfBSs2c#)VJ_@B_[WC[^tBo3i^oAZ@>B-S'0r0s7=3?:S.iUpmqkW[/s).T!k6!4>>u?+FdCaV32I&]L1NaMCl.4Nc8"f*5"epYe!gAiF)rJlYKA"Y4E>%NLbu(%O0(7D'?!;Hl5?09$6^X?dtm>7p&G!]bDN$[f5u9SI;Rlo3"e3'm>`OU'WO)6KWbLDMVfnMa1GRhfoV67`++jB!$_\@/-#_uL1C%4kt[@.*/m3@qK--scuAR2IZC+USScp+XqI1QWT7N>)^*RG<W5-uK0qJpeeA=Rgcrhm(hVCaX1ZXjU`AEp<]h)<]YSk'AH[!d0hV4.55nbYF*^;$R9mBrJWZ."j<1HRlRHQl!#LNenCf=g$Cp?m3,,d>ac)TDtQ_CK`N/R`X@K4S4tekA-`.3s&M[V+)0n#/,[PW8M-4V-'h,fo.?n!>!U\Ct]a#V3$]>%g,e^NV.F:U;c@/`MW&5rQ1*,T0Ot"reHn@FsA:uaJ`3I&#Zi:T>5C7d6i,[<pEY5fgi#hHIFbk*(i3so;iu2c3CE-2Cb,nTVVZ1heV.aJ[#d`%&XD6Gnh(Ea;jA'A3<U;-upNG"NhrAT&F-+Do?h._.I<Vh(Hgn7Jkc<&qj1MT4pdN[N^IZGr/n5<'2EUE?%bm:2`p^^!=)+-,[H,3pG_@"tGm<YM#\l><$IfM7]>6=UV=\<1<HtW`OqT:&.*;f.k06`"/PtH/?h%ddOjM8XGFek)TKG1&1JG4kQ6XoDRc#\s^//'.4q]dJshG)AR)gH9,sliTj.PjU%mbomaf?VofPQPSD7*j,'Pir!(?Y)"T)kH4VUA/^Pr)PhgMc8B^W<h>2>fTo"_]"6l'.0XW1GFcq2k$23@8T\S3;!%H2.%Y3IiK=.ju2+,j4kVra)D*7-OFX],.,(7nHc.k?^=E\49?*Y\2l3Oq/W+=eZSG(</3?Z,1IQLu<nj_A`4FTe.!%'tjqn$b\Y_$26e5@:O-YOh74;H7`CIEWqQGiHEe!?f9&h:pHRK=R2G<7'.,2[3]ho)oRb9JS"4,\$Sn>Ub5BgC!3MB&NIhMj#i&'>CK7#g`B9+H)8D.SO&/GI,kDg,Rh_<'f8+9gg@31aA*[+G$d7;K\\8sLltb2Zp1c<kOe5Ydoc-gli^1$jMbr&o2Qdq*>g0p*%TL<j_K8pJC"^fWt9Z=)>,Xgtbek=-AMkL=>)n\^Yf<%(YgG\uh]BsEt^cZ2$'*,$Q>5"%+XeC\0J[Ap>WK'Z[uS>eZ\l`:e?+c0E,j_1\M5XLQ%IO7lt)Rb_*OEXT)8\__!)Idkg59=7*P"(gm^]"+>L'+>%llo1/e/Va(pRZ>J7BKQ+3Wl#se/F\&`IfA6*Z[*Y#o5Q2&oDQu_Y)0dU$e:'V69uA'c4]7RR62RD[OYZ2PB"Rc$SlIlW4*J_I@$n;U=ScWq#\@6?F8jR7,lORri>dmq.b:'?:SFpp2UAYC<&G^<J7ln_sr"jWO>+$32^N!\9PeI.HI]:%<rtZiESndaiQN9eF@j4)fG(DMb)#!YuK20i.lo,Lr`Ze&1'9o3_blE5*<=#9J0@lfOPa'2oNCTC:!"e%d:2e"4:k:R3j,HD_p[c(&aS&[2pk)/l*9_l(`CI2'g@pW/^lMm.KC=Q!l.m!p&XNqWND6eerGmm<tjHU8E;]<mu@W(g#`fMkCTNuN="V67YI5)?3FJ`%e!6Qg^E$H-Sr$>s6-i]$>s#]20Pk\-n3'D2R<@j$*9UQCt0Ksp<u&M7sKV6&-FN?>4,3,"l#/aQZ=-XJ`9#l!Zc9QYgP2-Wff\43j0)2IO8&[*5W%O\]#;+bXXjNYic1X(<']KC%VI))epSe:17YS,$fJ>2%))X!0;.SptVl7b;ArPKLJ#P:!cK`hn!,GChpTdnk@+me9;2Th$V$;`T;6T@Wp6"8D5\@<@gO(snS_0IQq3au%YO8-H6.*'M/o.8dVN+Jl<YI;WrOA$+<B<#C-)KWY@k0OdW/fra%pKK@:>/8dc$WpE2#tPrkd9G$t<9ni6QU#GC:XWXn/kQsO-dG6Ui$-X?5]9FJ]YQ>m63p+<B<2XeNb:/f`[Hqq#9&A-SdY[i#@h0EL$t48W.d9IVV`Ru^NoH<3t,m)s#PM]aD*+=XJu]!g'e>>iE),`(AZc\0&uYpJ$do*8'XE0(\81BK]0/o'e)=8L('h/=%gFZZqF<cA_q=cG)NdK&foDWnjO(/IFksE`Xh_Qm#X66<%L5"AX<0h#n'NmrZUds)]uY8H1@le6i72eXQJ[~>
+endstream
+endobj
+714 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 713 0 R
+>>
+endobj
+715 0 obj
+<< /Length 2288 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GauHM=`<%a&:W67@+,q(Yo)=f:_Z`B3_4$jN^>f5i]O<@Q*^fc.QjfBk`>11UpRJfP+lKr%M3<q4m)NOk1eiV^ZYF++$E&9/G^a=[_L\n**Y<I>>o'$1/+2:hq'F42B40^d^]%VpWi6@\TB-a^@A*aKs"E%L&P!sh'jE!MBfaE/,9S;lcDAh;VtB0]hVo.qu,,gW&j%-^A92PJ(@ZLQ^1dW/s_`OYH,c`/kno;b+gm'?&ajrgQW.A/(\(H#sCg8fB8gjM%(*q,KFN<*^#s#Gp]/g#8c6^kBl.'p$a"4c\Ju:*_tBJRj5/n,+alF_'q@8rHuOT9&cck`)2i=@>H;th3^SD'$]']GUhJnR,d*dT(GU]A%p@uQGKZLG$Ik&K8dN.K<!iF93pG'o%@]68B=8G']LrdfVt>[m+EBKjqF\-l:fH\_>RT&B5t[ILTOi/nId5&;j4Og,Qp.BHRqu_!YgAb3sGq-ag2d]F#D!G7)65V'e4'69^)ms'3R:n;q]A\R*FZ=2A`,[+BQgHE>3F*'ZA,S(gg>U#>:O?/ct4-3"f>Ek)$2T7#G:]^;)P"$k_uP*,"k\HD(TQ,!)]]&S1V!VI<&%-.@")8p,3L"@GHTU@MuLP84s9a.>.:79uGABahH]&@<0sJL2&/0?h?J*9%C@>`f)W5gFMVnS,3CDZ[7)cCnB:(cS='Z[H`N%)\9;i]&cH!jp2B"BG[iV@^,^PXJ@11`rV4S./t_$b\Aa:u]0n"VCG0-;B`O*12L0Bam8"rCi.&Dt!L=jrmk79nImYWhdql=9qrFD*:Fq\6Dp2H/^pmE!jfCL1''DN&rjAO(+UtJ>7qmJAKYdq7\\lQ!Ol@%FBdS>TEmK8oaD-ZUUB:QZ80GV>aJb'VX:=*"BCZ7YQ?2GR?ch,FAO?@VI@,LB\nY?]\YJ=G/6C;ut1@[+c6bG>UoFA"ehdZa&&N"EQP8?(ddCD1R]S+;J,-**M#a+bOM0folf(;j0A3P;J2]-]t]hX8W@H*goM[=bFM[(m0cMOSfQai'=uL0ETK>V2[IM>srd0@,77h5b;*;?qjCI&"aaM.*-bkb5FrNI^dI$h2-fB>C\Hu<22Hd!0@!GS-<5Xl&<;5[N!S%T$+V`%-^`N1Vk!7L``,%J7s4s_sG&O8mipn&M`AW'X\)J>mV]&oRSnOp`jkkAWuUqP3+HL_HZ-hSUVunKE2otERSi8`7KL0&$LM7)N3gq@D2n$MgKFF\bARc4q)B+kJJ6g1q\FcfX\PNmurJ9fNQ2S(G1ssC%<%:L]DMj--S,j3eVR4adV"9;;l5?NZ);1LC+=#P2Ko-Ju4dPZ+gRJ\Gj=5C4M"43H[:H#ddG<^?tIWbXlA_&WB2%*bLomVFeGQ_(,2N*"`>U726giUg6I*WDIB#7;.5k@'[P;h2OZB9jt1V+nh(,QFB"O>>bj:5u5r^`k&:qY#/AR\mD5&Qt>aY^2j.^!642R"EOr')sr&Qh4u$iC;16nQ92C-#MX'bFbH*SmMAC=\IIl9PcYr5<sPO=-sNb!qF0*VVh1QUa^/81@-Gu%PFO.tgr<:(9>'9"2"EieI2I5G22aYhMGYq;kieJIeaB[8aVqaj#eGmCgBPGG6uS4!0YR34;ed7(;*E8^(<`61bG)u4N`=9NACIWo1\c$YXm8G!'7.dUl-/aeE)1JHhSDd:!0CF<+O<gemcPN]6(T?$5d'`+_A]*#.atsc,):u7aDXu>+Dhr&g]eSBA>6T!YePEahR.Q+HpajH#jl#mHMXj;l2;fis7UF.LX6Nc.VkNW9Y]3RL3p_LJ%\"[)#/`\?$0/um:t6n-<pD(_Ap=%j0D]bK+uWIlTW<0d*gV8k(!KJ_qcn-bQHu4Y.40pn%l%C^Z29dCu'J"&.ZS<qHP;rc)WlXe"2U#Y$gaI9s1)V<-Rd(%Z9pT>1e+$E+F>Th!QsNhZP@H]B);N^$RN@O-Ks?K"b_Ik@)M/E>16l+"2)c8->i@<<_Kb!uU(0_R4NS<6JmBGHl67?[]B5GZ):tJZaD0*fHN[jYu1R?le*N&#UGp?s:c$0;fK_\VsJ\?*KGqWZ&S8](WQtCTKXV#itq:F7.=%<Q11;`NE(\:/0K0kE5EY%ufh@-?jUI]*>U]s$c`ER!eWi_&=T-7J$0V,brP([S#.FSW6ZD0f<+3-%:IX:0-grL83aB6a-#9*`F[nm%`i,ATK\S:]dh'Zs7>i_)+S=<NBl`KQsa%rdoM1KnZ.!__u00P"n2P1a=44la<@XobRh_dVMR"$;J7kU)EHOD4aGd+5\P>4MUVDeSY2K~>
+endstream
+endobj
+716 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 715 0 R
+>>
+endobj
+717 0 obj
+<< /Length 1575 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!;d>Ap9+'RnB3T\C9p$C$t;)HE&#Y?0G$'1W@uW`nl/"NE/G[fsG!r;-s@R"IP0-gPYS7C'c1kOs>]3Q(dSSc/?'<Y3]$`ESntb2X@;FT.%0)tPqVh_?ZLnRCUt";r-/cr<k:?0Cr/Y:o>t5-qm-dmWlXUs.:9@Y+@e-:+"]WWapKZe2@O>u%[f/X]tO?oac-*u46Gmb(R$^@g9-FXsX2s2DFYp$/Zs6J16t17"8&@`>6J\]G_6VHbosOjFqMd3K8>D=$%DRHD:q\e>$!lEBqh&a>1"@8aBnToiH6=o?'U\QoOtW!rJJ\#XY:E<dt',L&MKAUaJnrbd0B^\5/d9-8tn%nCKMZfk@(/Yoph@rXM<i.pFdk?S1481+@Z?P8MY*.pUS\o?B].hp>(D)THE77OLNm,?$YEO!*FI"*r!IHb#I=iFK!>6qZ5K"u',@2Ir"rTu[d;6\*.-$q&i7M43&o5G9F<P)qr3Eq>:CGk-9F)!"j2UQ?qmZ^CuN\?#-XOmcW]=@Cf0!=Z]_B"PK;MKX?8A(gV2!d&ZhQ@&n=g7f[PX_q"Z8=4i<%K2T:lT^9`G!d0c@IB0&%[(:k<ZZTd3\iW?B%!k-%jH!FHJ(*V!;9?/F%A7JJ<Ag'c4NTASG%mgM97\=Kkes`iuY+5aSfQ)chJU^lm++WTQ1qj?A2>dW,bmhWml:-.8rSKj@QWVN6M63/?p;lX2"B)98g`Va7!s@_1O0R\Q>mduA@E^ZK"sk$pfgj[;%D>9g*:,I;c]1JXe6H>t[6)cZ!/=G6ElZYb-@FS0@2Uno!-6+D5=rAF3HjJ31t25<2#,g5G+n2;]&#(C^LMcq#'r;D^u;bl&O3S0GTI)fS)nKoPG)nM8W$f.00MM@dG?e0$a-SjLZ@FB*f]Hd<o)!OD5;+1BEaVm\q46B@M!(sam,$"]Y(&W/PVJ9TI[a'o+?+IfX'X)g7VYg`=78H#(")2Vp,60"cF)sC@:Vm@M6V++NF'P>=^WdOE\4=`+fTnu8E\_nQMfZG:G=ZPC0KGas""HsrQfEF2O-F[<Z\\GhPYKRF)1,%lJ-7F!O@L0>OH^f>chadk/(grlkI5Y_$E:AN[<E#KUKIdg0%9>WC'S1ec2j<]U3ma%S<AYImQi498]SUM(&51=os+^;[/rdOS5)J<rs2^^l/V(#`Bp-fX`<UO(,p`U5l'&Oq7[rA9_k'CRa^!V%;%iLT"lDPmFB8%j^#Ep8,&7Aq';YB'@H6LhD6aW#f_TiH[f->"<2>7*67H^[L`$+`ViGQ@E@"WdXHY:!,Q1LRcCt,hh@U@m1X?aOC=#opO%J64k^9e@E6ll\(d&\J/G!\s7S&R%fGL,[s!p$c8^^a%We#a\nh82)(j$+[io8C9HWp*/K#"Tr3[U_0'Gq-]5J',+#&`NgmiQ0^-/7">g7D\F+r@-1[u[*Ap)=OYg1!NX!'4.#:C5Q;tIarQ5':7'AVjMc5sE,1C+SE23W*;k3u1alT1=8L3:a/ei'[6`8VV!!mel#2+pq[fS6Nu)"1(c">gWS3*oAGnfeIr>9Za)gsAPV2;=NKofjOf8ESd^h^]$L(B~>
+endstream
+endobj
+718 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 717 0 R
+>>
+endobj
+719 0 obj
+<< /Length 1842 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!#]>>sQ?(k(RKp^q,hXsMui'4nN;[U!8`d"c0SPZSLC3d,7"V"E8?FtWW%9=!TpbRQF&I$+&loA,Gf?`#28I0pC9/_cXVS_1sR#r6>jLQ%n?k=:QoLS6G.)IH:&CP?DUl.ItAEdA><8X8?S8_H8n2>8.=[s+IJYKY2UX6K$ETDZMG?';9]k2i$$c'\LE?.@^`\mI.+((?:YU>:F,-#O&Nca3$;o)(24f9m++TR8Dsr;D#(V]RQ5cK?Iro#b5"EUra:c51U%S]59)R4D1^XElujkGs#[ikMMtjVQZqq/ridZ(QTMBj$ku[t'L7jM)$$a_f_iC12+1Nobs1-)87dA5l!hVDJMKeCX;\TauIMpl-s$G>it`6kVc\3_O/n/?VPilRFi;2Xi(?GOtgb-:q,r)TUlOlKOUfN?i67g*-Z]]WN@u!j7:*@J,?s1JJs?H!).$IpNhtj"I/HZYQ_cXW/+-*>d#l(f6R;/3]8q";4"2S9-`,a,Ir\?3mi/2AN3O8I%!FC/.<_8^5hs3QWaS#gQW%jbsrtXE/>Haa>6:(P"?C*@>dW/7B]`4bLg_d<UXe#XRB65GqZ4+a!so/d('ZSQZ%6]33L4.V?uI&mUPMQ<V'oaso&N#FO66(bl#&D9HJb4BHXQSir)+8ge_R8A$s0*T^!gPK>R^Y/=]@o;:^rmFS"D^h]FPpg1,ES:49J#,=RgNO@+:>XPut^t3!p7:$<SQ]3q86ohajhgF)%TgC'K9,L^!]PT\0-\gZaP,eFe$3@%T:^&HBFYTdY".![72b>I.5RnVU%To^:3_a%H<"#\s93StnJ!IAn-d^WYX%J_YpfB2]+>7-pN)E(R@kErrK[hOe'!fXped/CS'j@gpWR=EN$!;$/N@8t&cjGka&B0c<'OUht\btLa*oJ-AL0`-70_XC!Njp^MK)L@,3Kdoh0M.IXWS+;,q\iLq'I4&a[_7%o7%H9Waco0iU)Rf'\IRWGlQRVHDqRJBY/E>!5gX54NcopT\#Q5_j#RLTY:Y9ER0$@S/6m"4DVdpb^f8dmYrCF-OCapI*jQ7."4HT.eVJ$_I$SW@qf^ZTGV%VC'.U>j9C$R(f@jEnFhb"B8HQbK&[u#QSU=LegSF@ipedlg/-BHK*Ld-O.e[(pAC#M"JC5==dA[#GFP%q[5nV/6'."[ZqRZU?/U#;WgM(:eCH?N<P/0?7g^1=]b6CZ[kS7Vf!m*T1OS(,t_m8hh&T-j0N)f@b`^h):nMgXhJ!?<B5Tl#)Z,<Ol'IDELq?jf+fe0&-Kp*Yj5RBt2ON":*$)^W(-$k9X930$/DckqsZ#>GG]@Y)si"Ht/*iKgU#T=Zh_i5MnbdK%R=U_Ft3+?NO*3L6$\22:mWU_<F"=CrV,L$G_1K>D/?mcfF[skE5bI02k<5Uk>,HK[+.U+VshV2)^?HJ-menkN5,r<tBk51X/(Xn4mTJ)M`?bs(bC)Zoh_BF@i22tiVo(ra&)IgC;=[go6VN4UeTE*Q8M8Xktf"+#:D33e!]=!DD!tVu(e`6W,[8[<?h^90W>jQI?s0(^+h&F7T$@;h'=<+JB;Oko>@K-i=pkZ2qL*EuFHSLJM@o'7M?t,R&5s6KDBgHq7=!;f$S)ps(f^TC\C.`<(P9Wl1a0_%RQF)arpC*birpCFL3(UgIjFul&hhVA0?=E,:Ul,>+Ml*-PIUklEYiXm<dj6*o@*bg/_7#+N-]3l3LTR[Fn!O#OdB(%i4!rT<r'b8B71I(nK.W/C+U++pfXA'/0PjtMrZq+kV9:0`82*_.UM3g6B/Q44GZV-c6])_J1G)/hW>G@in?&oao(@`"!ucgUb\2HQgK?;"T)8h,0k[6~>
+endstream
+endobj
+720 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 719 0 R
+>>
+endobj
+721 0 obj
+<< /Length 865 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0B_/e6`'YO#P5/L!4D)oVG[kpfkg6k\tNLLtU%`3\7.TiFN#YDeF&l@m3CdQ<eEf#JI[(C7ad^u=Lju.=/ch3eRms33[k<#:7o,XGkH8>%8f8lGtF<:9W`\YVI"(t.ko0K"t''q#VGn.-c'=egR*N9+BI=HD>G#rS6XHEsJ^S/f1Sof*%\=G$MV1a6$'9)DIpZNkEpDAnL;9d1tfMrrhJh&8c$cn'POB$gS(O66%%dPIH["*8$b@!0=?/0j!4u&/=?4CU88>ncErU"f1*W$hN`[WBuS1a/%$0;k_Y+NGa,tLN%K]l)1&FNL!<Ohh8^d$;_l;#mdOAT8hB,P[-Ee\e.^)SlTg"h"O@2B3i8i:?S<+Scc\:rt3)].<>l%F8^c`%e[WZh4'*$<eXI)oMrql98AQs\S*fOrB(8?d7rXbE9H9:A0`)nODAb`F[h>.%BlVP&T7XCQW`r*2'^a4o,MD!5tra"aO5O73jKr3<8$WtG[54m=a=>_J_i@>s$-n62@(TM$>NeoGTL\+(hSc2X#_+A[GELt8YZVU"rRke,rC1.N'8m1MKa9!JMu(a-#P(@7sQhS8EarTU<)3)bbgfIs=c'(,WuKrEo43X>YdQB:NGm9-pe5u>&TiruhS&q7!V;B>Rcj76SrS07j&L,J,uDjLtFo`Z#TNLLg'#5Mfbd3;I*P?OajElK9WIlKjYh%8h?1QHYe^YW;OiW0>fo84Ys8DG>JSc8R'?/tk?4R7W0Ae?T\ZL9KtfAl!N&d6,^[=tSR$bLq6*bb^G4?)n&>?obf-qg?R1d]tShnP-BAYCj8.=H<;bRg:4dWBBXN(>dGa+h^R(HOphO1g+Nq<)aQj<j-i#1'N^C&~>
+endstream
+endobj
+722 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 721 0 R
+>>
+endobj
+723 0 obj
+<< /Length 1842 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat=,9lo>Q%)(h*B_I\7`2^O_mk)d21[ZOEbf6,o-G'LdU2@@8W^rt+IsiJENW>KSSW5@h7$57enF3)XB4o!7`g.RrN\t%23S*cF[2etP<p[Z9fU:Bp+'Gr*H9$1:qna8*NWTg;VhO,Q_3?>UQAL)MJ)I:BDOt1$KbPu>2n.n&p!]B."t,+jlYKANSMFnTM8l7VlqWtNK^:X\'i2b7,_Q%s%'>q=NZP$%MIjWQrf/JugAZS"k#Ea1U&&!n#dluPY0cIuc0VmRH71S3XSZemr/0#U!I4HFO'Ei\=b3ZdA&Y`^9>3cm`Po)La.5Va<A1HT<,p8Pp%%MDg@O>!kPM<.pfp%l_hbJ)O[2'6ZYY&Hr*St4q7LH_<fCe=;DukJIApsY/<NI#9h5D^-k%5!FfENZbg;Il+NI<pPsCZBJ13M8RiDe:9SCR>*<HqUaR=PDMCG-kF%^Vr+8:!X7F'l96HC-:%&;6A;g*#aF_u)Hc]rYu'U,RS(#+$Y0nDLKs+q%uUI?L$H;mr3PoHf9F--d:eiO5Sf3CqcX$@%ec*I=<f&\kXIpmSGl\;OLgin+gmn90i`pHMjMl&%#Z<ba"BW?rr>5p4VY'@&OQRINm8J&"3meUtsoJlsD<*>8[+fgR($^Pk('iKsDkO_lPHm&dUbu*,D,Phd$FN9_/@kkA$;?Bq[/'AjD3/<H!Ymd7a]n<o%ad%FnGBHS1HPLSU4EgH7D96OcJ0+@n7C(7QUuW4o/g9]g0'5T#VXXB/n@[n52koF[n!PqU#VIB!,@rIs"tVV_k8DTkJ_S,_)T#YE=o/2PPAq*u/dd_"3I7Ze`*lObhe0EnnZg*o3Ir3^oU)fS9Q[DW",7+l\pfG$#phZ]r7YMf:)$)EhjR4>/[]DHl4L%n^a1cuaLW*s8Bs.CU;:jipI6)r"F6ab<hn?Z_H[2ZjY^Z<Eli$:4.n5t147g7oa(jF3,@A!:(-h3FOm./R=_,'6"sSaUY]QZ5aCF5[C*f`npYn7@jhjTqP2+oC^>f<^_8J4c`&ME-<Q*BR)qW4-3,3$.o@;0rX^?U(K-JUS>nk169<\A4C>#0gqAt"MI`,+pHjiYr1O>,7s#'<p0'K`CaWQ5AFY4'Snnd&lBa7XGTftb:npW.9u]jNX^b!;FHBRk8-]cKHM..Mk2[hE=4"YF&NnI$5G5(HA!n";_c&f@,Mh!rU.CIl!B^ern,9a]:tA-4Nagb<)\?&0r/'Rkd.(u1V6BPWBHe37I805d%KN-Xo'CG0WK,U>fhrg8!PLheGgE2)&*L76RG6i/Jb.`XQWhWPH:Vn&iL+.N6q:i00b^rCMM+SUjMebD)*5L20Mt(+3=&5.)"?<)S,&[=1#PLI&I4*g:'GcT7H:_4FF#m]%ls@uFnuB`P(R&9"An2Ud?8c,pqf-U;:FE&"[nS(D?.T,UI[/3-p0/jJ@2"K:0"O=2!RS7J`-*pq%Mj3$r1B=bgmW[Us&j:U6?H0H\R7mN$lMtWGPA(J7G'72O#PK0a<S/Q^jrT[87$1DE)HG,HY]]aJu=9N,Y4;V[+7oUBD0le^)Uqb`aRQG_YenB?Qei,q\c[ip[YAO(X2#24?hYfH]g_9gc0UkuS@hU]E$*Z+d&F^a1E]7HDi9$B8$+o*Tt]Uu-_ek0Bf3nRfR#+_)##mJFB)&I;ZCOf<_Hb\`te^^?1I*DDK_@<%ZugX!gc`1BY3S]('8[]!KXJYCG_9W[h5?FOu=g%jb>3p^8.a3A>Qf@kXXhhU/'8t"6)PD\N_T$B##jH82BEt*-jcc*EN=Oosp%H8M=_8]!qG(_nFk0/@?s(^.R*_ZXqeruF*6F11r_V4q@c,;QIZi:#?U99L~>
+endstream
+endobj
+724 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 723 0 R
+/Annots 725 0 R
+>>
+endobj
+725 0 obj
+[
+726 0 R
+728 0 R
+730 0 R
+732 0 R
+733 0 R
+735 0 R
+]
+endobj
+726 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 92.0 680.866 137.56 670.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 727 0 R
+/H /I
+>>
+endobj
+728 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 204.51 604.866 250.07 594.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 729 0 R
+/H /I
+>>
+endobj
+730 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 510.25 582.866 529.15 572.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 731 0 R
+/H /I
+>>
+endobj
+732 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 92.0 571.866 112.0 561.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 731 0 R
+/H /I
+>>
+endobj
+733 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 409.14 560.866 450.54 550.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 734 0 R
+/H /I
+>>
+endobj
+735 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 467.2 560.866 500.81 550.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 736 0 R
+/H /I
+>>
+endobj
+737 0 obj
+<< /Length 2718 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm>=c_T$&q6H[@E_X\d&km`,B(8Z%$3W87A`"h8Ff#=Zq[nQC.ZR>hI"#dq-]IUg0S175f5WV<djYk8cRoF_t056/BOZ3p:C&2caFpY=U]f%CluTJ7D+M@Cd*2_B"pPUoB=ZiWJG&/nF2^0]b9HJm\Ig@kHf!4W46;+^o'u75A.0LL"2)a&g(1>YIq.kc^.'7T3$K@CU]>Z\Bed-h1_G:=cTr_/b'ceJ,f)?]<6f>H`_STDMcqmroM=9GEEZ_o$L`pc?:FV,?_P&XO\"iF^9t020(1nJ.KV0OZQ81>\Vha[+bjX+<(FhdiCsnd$m;`(3B42-&jH%6@Qu@%]s&;MJIVLIjO`V`]+k_X1lO)Y2@9g,='kon_u7K*"ESq;-.il=c4RS'k`sK)"^f<%6>Vf?g/A[eicOX0ngZLgb;S=Fa5PLd=qMV=t(cti)]G#Mi&^n\5hPdlD:\;+a.<H>5qU-P-_Qp#9@]l=HZ)Br3XZ"%F.N/!+RF7#@Vf>C*uVqaUjiPOTp6;X9EN:^fZSt`!0FtCY>a$MhIW1D0+WNA5Zk2Qr?a+JSd?UW/#:,qD1sWJ?aLlH^nb1W=6]@MKU4E_e@P%F(/J_c?TCb)Vt[W?;#-sL0RQA0KUTX/M]l#nRJ_d7$m]?n\lq"`H(&?BilrZ+a`$31n]jq<k9s^qB?M[`Jl!./IF4K?1Z&XDRM],?k#li2EPO?!dnp/o:iHk@Tn"-M+,g.+3H$c5B`G+J"#4Jct@rrILIpJ&qRrXgb0?1=Pu$Sp(4Cj%NEUs`JkLXcY?&g%lEm3K*D`pj=plaHMlD..gl1K0n@A;9gf%kQ[C08hF"0\cA_^3lUUTO_`h)g=M)OF*&n/*@20=3N+mFeaTh#*gTZG<U10-+qDVps'?VOr/L]:$_$h^Rl2da4L_B,W+m^OP2;BZ2FE8gUA^))fYVlNU]bF9i5aMeM\BGh"Zj2o0+Nui8HkKIJ.(dY3M31tX>Hn3N>(]\)0F[7;!*klGl&uu=!k<5FU'9a'XIj5d.b.Ij)Y;.):R4(i#5?-mUVY=^3(-ZQAYR^7qiFJcMFYAE'u*nW'QG0/bOe]<Uon8(nWYbj-pM^!77d#JQ6`+jgAk5`IB/aWQgfKiqMUb,GoPoDSjAmap;*W-7>n5#2)bc#H)Gn(*>33833?A':j73F5*C7c=<CK47H+lP<=-oi.#a61.i!J&.e0.Y.mr\h.OZ]`"&X_PHJ#?7Bd4I<%qs^V^cq%=kmJ8hIq)2Sit*e#?<lWt_rZ&R_1lVLL<Ug)D;,168>sR;,C5\HH9^6i)BhF3iP>EV&i1*dfC`pXjh.8J.mt^JNc`m*Uico"&MMe'@W$M#,1"N4aAeN^O:<[U#;"sUk8cILfRo8O&%kp7[mN:L^m6PmCnjn.(:;Ks\KNCYJ3LXjc9aWLnd:L1S.I?P1:a=T*\gL[A7(OLepW9\$5kc*37J!E;&<4Xig\1IIQjQIln89^q"\iXHjX8F`u0=>K#:bk5XtVS%k@+>0Y.?U#$X`6^7*=M.[dP7'5#l6_3GTXd9rpg[p:0Q3XO(K(Ys</j^;nmqT\uTP5.Ac<eUXTA"Z?Ff5/kY?4=s4rR<fj1dmA)&D@[e84`6N3304"*=-g9\j)`00H&?0iO_72b*KS*Lua?kS,V?Ahj$90^@CJ[i#W1hO?FWc?rPghcFWlKVQ4q^allTKO\PG`bp"mcZY5q8C..Bj_/]#2G\Zd?>+a]_?4(:Y&gc^5E$oVO+Vc[(aRZHu#GAku=GV4]7sPm.j#tonY*([^3uQ'29Z(!]!M5d5a4k'a)BM<7Xcup"B_bg4/LG&$a/f:))*430GI$>?GNcR'0XAa^\F1/E8"5C`?tL6.,:+^;bJ/N%]>!ud6KZZ38=2A-ogU^+X":,%UoW#L#.nOk*,g+<cPAk+Ggu;`4df5YiCI7`Sn&@:?HVr<f-T7;*%ZaKM8N&a(p;<SBT^jcpgm9s)5e&WABX'<12h1>RLsW@j3F%[]BA@:P\[.j;DujE!65WH=gQg?ANJP5VFDWZM!Zf/FnN6e@>$0kZ''[GGMJN;()IFnEd%"6?Y0$_cT^3EKPA/Vk1T;<$?I!j^ZV_,Jb-%J^`mdWCbPpfBb;ZeBlu1dKg[2YI"bmO.Wk?f-GX&/Y.bB>([tgmW@b9Iqdth9"DdECrf?4&[R)qP1-A9OLPH:43fYhM=KA.^-V#5F,^iaV3h3!e?^Pip%&om]3HuWfcL:Md7r'?MFO6S?*%aZ%5OlR0#,g\().q@tdMITJ6]c!3'uK8miDHh2A0&h?r7d8)g4[B^k0TK8-0ll[^OVP=Fp'lpWi>JWO9GPiJE6EsEb'>MZ,AIP)<pf_BHf]N+.a1R6SE8$JoMiqN8Q<-DY#gXY?JRBen<a>4bOs^c4F[UR>8D^!NHWHSd1ZpifL\lG=Z."4psN^X2mgb@flq.X8$e:(,dh3Vq4=gMUr'=B$@bX.2HSD)psNI)MJcU4ch7)#?`Ku^l[`S'l<YLVaae%)Pe7A2ht:%+9L-"I.J3>lB)gIi+/;(+e9^=@c];SQ;'cj.St])Q'8.k%^(*t(6?4YRBN@8C2r$fr%'*d$esA\Bj@H2[T^osIeCML_`))gS7E2nq]3aVP%7]6'si[F0SM;Z)TSgQYV_AtjRhbocS]Y1W<1*l8o5RpaVRd3J;dhEfR^"/M.;$0?tl7We&=FQ>"sJG-_^,E,T&`CH'76Df+7lbH@Q#p~>
+endstream
+endobj
+738 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 737 0 R
+>>
+endobj
+739 0 obj
+<< /Length 450 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GasbV?VA9j'ZJu,.It!"`[#Dik-<2@'IVnW'ZM3"2Vj8h1Qi7?gRG>ba^g5"-0OFan@RlG?3GI.#&j\W&4M,b2S]=G%g,:;N?JdO(^!WfeHdrj#.G9iHSKh??W*p14fV*.Qnh`HG,7?]_&A+WlV%=KKCdc]pTAL&+Zd5m?"og+hI_OH24^cfN:QDKST:He[5*)sH)4a\AYX9IfR1=&gMGjPTf@%lBXJKqo4KFMV0X6d>q)m*-X)GhrHjr*FtK'(/6Lu=.!/\n$Wh(]Am(PQ;u:uCAo^gq*M%ESXu6gTdcmUV`kn"c(B3;4?9l^XkA9(g+:8DaXhk3<!^k7]/(ZZWl;V8Jl2S]<3"-+h?o432gNeDr7';(Q"=ZOr2R,?DDnMW`IQIGiE5Wq)/`WRh9eLSVi<V$Acb:bR/;?_\am)lD^&/L)kjbl@O\A45"5^5t4T~>
+endstream
+endobj
+740 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 739 0 R
+>>
+endobj
+741 0 obj
+<< /Length 1302 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat%#9lJcG&A@7.ka2F2<ZdW=@8GW7!Eu-]cl1_-d/tst1/WnXP*AoFq[RDb*6MfUKeF35%H"gDo:^B_S%g#f-sae`Zu'`EW4PWr"Fb&aB!>;_<Li4;BKJW>DUV>X-Ft^j"?(-^E)$5$ep8N'XCfH?eL)e8.eW=+oKCoW"PZA0-7@QSh9+AUDi-NBm;D[J>%g@^MeC$k]>TD82*/U=rEkJFd0@9:`GiQH>aNAtP#glsP$N/qOQDsV?+:_85MfTh=d#m?7P#e;#'LgO]sVd,!A^&#Foa^4fdCm)E.k`pWg7HkO]*/31()!*]:o`SrU@%>4QCV</lrg./U0u9G8OrK@#gR]?J+ZP)\CAI2!B86&]U*Ui,GV5;,7;U3qblknphiX:0gPV+.+K0r^<!H*Kc?AWPd>=oW2KR5p>WF"ko]"ed4S?J+Bg\!BAH$ADLQR![*<=_<cJ>>@j,-*F6SiVhN,Q!A"M@J(*A3%:`1.aN-\u#l:?1cn.uX4Vtfq&.>i")bf0_P4;oH@&6)qF3lo.@4Y2+A']L&mfPlCU#L%Xg;FrsR[W`HbP7VQjo`<LK%afYE!XR:Yb(3-qDUH/R7hKDE&'+X9%$R7jYGhO$6S,gX.8l[QR.qYLF_)e68#4O>giZWefFoMqe1pcmW5Tp/ChcC&qH4IBer?)aU>LsIX23-0mRMeI.hooN3uNdLFm20(UfQ_M@YtCh.]IG++Zmh:J'7RNAG+jK*;oGiI:=(@cDqAH[#L3Q_oT!Hdb7_N%O?YhRh3`5W;->6+WIaNNjZnO4+RoDrIS2Os;'Ce0G@mZN/!d(+Xk[0k6,:2T%pW4'6bn/Q8kO!-!IEeoVc%.i@$*Q8&eMm+fHPm,*hD.WPL!.UWb2<";SNLZLGXTNgE<GAd,CN[G^p6ls5qg#9q2[hgNZ+",hpK?7pJKnm<]N=lcMR'g"I$KfTii9P[Z'bpkK5A>LX`'</o7;1\'m4`us)CtMrec<BD`F1%;R,KGu]#,%2bW%(ARXCNFGjZ7*nJ'*Spg3Pi+EFASA8WCM`)_elno2!'oBKe^Ga6Deo+Q+K3P72Cr8I%6PP>)O9EqCGW:]LjM`]Y:eK.`MVk+NkC8>Pdep`nIBO#^n2IFW9:3`r8*e)O`dd2Jo]E\s_/`]gYVm"!\'j"E"q1?bq,)<'Q98Y:GX"(^Z$CM<i*'HKQRE_f;$M;)Tp\peg`_Muc=^4A(T8:E3-VKWH#7O(e,!E8R%lIraP+u-E]qIYrQ)cYEN*k]WCenln%6Ij.:foWqPAa6m6O[hi)t3Nnmq3mVgRDPFJ&I-~>
+endstream
+endobj
+742 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 741 0 R
+/Annots 743 0 R
+>>
+endobj
+743 0 obj
+[
+744 0 R
+]
+endobj
+744 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 238.65 691.866 280.05 681.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 745 0 R
+/H /I
+>>
+endobj
+746 0 obj
+<< /Length 931 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat=)9lK#F&A@ZcEWiAd-@q7jD_3&(dF)&PC3N[((m531E8o#s@G,#&#23\E#,tef'&,3\hE9,CYG0UWEF?=?gTdK[j]JRLCH;64Xh`D4JJ6aT[r4^Gp!e.P]47E/Nh[-=QgqWu>E6f4F"F>s@m+&D<298TlQ"=/OMX.Ys2)792l%j3g>UiY%o=oW<$E*jhP$iIL@ml;EEEPS(#,C4OJo[h2ahrn!*#3i8`6:5:7+X)^OeF5?GT"B:9\90Jf#`nhs9BhOR,[m;kTdb$Zm]G@U$"g)0(lj-=I,l<f2Q5Zu<ke3F?lac]mOEW)-,l;i_g7;WO3!0YE.E@76?RP(lMcp@Z]/Xl8f6Ps?A4&jc&f1!P0V:34h^[F=kI)IS1k`J!@jFu8o[EP0-1nG!Gj&1N&6XpL<`)+Xfg!KKW-7>5c_`@DAD#o7PO^#W'_K?=V10IDu4j@G/DU5J6;;$GjX<L@5fMJEu7VC>+UkVg"1U>00G%Han<Km?$[e.g%?&t.m\1^pW+,qC+BpMmVFq:@/7)2j(a\0K+)ie.UCPIuR9j2%QXLRq.r?:)MK8&7#l3(Wgn[h;c\TL)\@;km*c+sYc)5Zn-L2:jWP'VHDbY.#KEASd(["HKfG3NN@?>*$N61EmR68.P.q*mc6,Kl#8:ldYbZ;H_3!M,9fKgr[D*Ls+c=_[5i[;0;PX65*Jo6Bg)7/C%q!YKqD&4-Z,&\j_6,.lP0X/GBV/+I7JLhSi)!P9nRAP3Q3E5>lkKn67'fX<:NQP!ZjHp'441pTksq@2Kt5c,YIjWU'@c]lH8+O+M6dl3]s_l3]8=7t3!>p:Kr_'Fhud\(gRls"Nd&9mD]Y2%fF"gNR#$)K<oAU-FfR&,<k#gg8>8lu:j$=rNJ/TbGPCb&6)EqY%llPG^L8X`36CXM`BU/!Ei[q?LUe%MS~>
+endstream
+endobj
+747 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 746 0 R
+>>
+endobj
+748 0 obj
+<< /Length 3107 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm>?$"c/&q0MXi8i"JM,Al^lq8[Km)5mZptA>e4)#`Q)4!:JW0X1+\A/"q8-7Qm#mftSnV^!,So[GR#M:=t(Ip\pU`PSamk#T@HuF/G4Wj[5QNhC]olJ-j`*7&jcc:V:dQ:$1+3ktcM?d":C+4<Z]eA7%"2MhrpH'2nOlUI^6%$DZqj<'4(BEGt&5&bAWY'AR2!).qeo3h:#X6h?U+61WcOXY1[e4TYf+cb`;;_+FYD+P\J7^bB_B4&pASa>K[_3I]eE.?KWPtL;fSQUGl.A0.s&[0/56Z2m4NQTcVtk;t3+ZApX*q5c48&`TIf9-9E6nt>W87&=6M*BY0?sV`8D4=68+L:T5-9b?9%4.ANo=X"K:X`Vr]9=`^"[bf&c<\$Muc+UiAVh(;jQb0[HFl\8)E.[h9g_4:)>Cf??sFo.gVqi+Wol0+i3&\Ja]qdbVr:piK,+$(7Wd<7[8]RFsBg?#+ZH1&k236i2Vuo6[BZVaE!nVBV1'5WWBjj.AbCS.q\TuSgfZVGbLb6a>+%.=I"]lhUGc6#F!^NZD>WFDP<L#OE^c`0hWKUJ5/L9:JOS=.B$e!(q6_C!D#<Q`$&YNaAe!ek,nDZmTLj((JCGJ=2G"Hf+`bR"$j`*!*ZHr6t4&?-(\'m*f@iNG^=Nh*9?;bptTg2*=lHQ\88T\7?+u::Zf>H8k7a[H2`<cc7%)s$-pliM<C6RQM?Yg17BR6OR<E-ARV+_-]&(Y!++X:$nrN3T87Ug]sX4?`K`h/M_%7p!"oeBOjCQ!<jbhjLm5>HrObm_.VSsM4QhRLGQ<O];`q!W,pJoWSS?dtTh:cTFa[nn1`cW0G^0ArSLP69/59G-!gP;S9._\n!"oeB\UB-HR48fjKNHth54e<&O@RlGG7"o/=##@e,g@?_W^J,>fc'$H!\.=s(0F\9!$iTc_Lsq^mlCuY]WCPEA^Qm"-q0FqH#(-s8kD"<6NrSt%SHU\r4@m%p15g6Y_"fJV;RLgADG$["X*=S0B,"8**t"`M"G#1DdpDLR5d&P$8tYL4>P3P0]0R4Y>rGM5e\l9jWg0he+rer^pT`':P1LCoBDb;2mI.5=LKDBn(GQh;@WJRa)a()7JbYJ:/qj-k2lEu_D5+[KWqRT9SCl:*%m3gQK*f^J!d.f4=p&8].TGI\UT:e:G`i]fdVRS,^+]H#3b'N<9%_8"PV*#[c]A("-EBgrKN#0K?QLkb<1,&l=/EPe+>lAQ=TL)=idH?,TZr;eccS@<I%^5SS3t)'1%m7Xm%jH,iOh+FX?'6Q!GFH#qr\X,6a>`h3u;c-&i.[/8'OO!*+kXkETejbgdq$/rhmFC1ahQYW[*q6W*6/qM?&fTpYue2)\9/OSgHjPpl>3r5,QYl'<*6W89ZIV.$;u\.p8P#*SaqEH./T1;31A6^#;)cpBbs+S!m1@<,,f!;_CNM+DAi1jO[%8RNUJOA#[G49.Y.k/Rr]<?b<ikJeMV-(DWb3%p[48B-J)(<.d'M3hM,Xq!ZE=X>96SQ]O<KE+ZBXs`0XFVHJ<%W4Hk/6+&AWNt]%E)?Zd=l;b$/5lN]0.kIf)at!CW^J,=m8b0rPb<2Kc(FOLO5a_@-aNj_:>.'>S_Suhm;,iOS&E%FG\-lX]J@d<O]R8tD1'MZDS8-B&crZ,[H9n,f(Wa`_W'co[%5as_%lfWE*_g&fdM#_?TD9+PTFJ:Id"!G:%\f/pXL,EVE\(WI/-I;PXMf(/@D]W!D#=P1,)8ibR?3'rd?!=H7O0nID%J&La-TTQ*A?H2$G,m!!&imll]=V,-dL/:`u&7-&`n/?A]57EX4ct09$3e'HUH=TN<E`]tYY=]"S%?jc:an'O#On1<76h"X*=S0BPIAEX/j!&W(o`i2nPsVNjbXIE&8SS3i'pB)71C8`cXlq!P+rMXNA#UbN=t1\E,7'm/ifI^S&j0(tP!OZgZG_tN_?];B`?DqK8_I4Q?--jgr5:9:KEs!b3,I.=;:Ro.r:f'$jeOfNmAeP9'rSsI::)Z2#ReX1r2'KY46BaOr*WV;=iNG05.#"],DKnXOS5iMeeJKca$"6a0p&s:Q4mgVB0=JQfdJq?Y([V+VQQc9+m``oK)-s%]=\`QBU#Z];p?L4bW`e-@g]4_;n3`RBPq6o'9Fnp1;#ZEV6^Zgl\"Zb?ikPE+?LPSfApL`;FDJPX>9iMfF\5Fq`o1#kh!0*<F=Z\&S'\b!E[Dn8j,>_dir,r-bQ:^+J%2?p,k$a[+,*r&jq<?Wm^Wb?5!l_ufgPndMI3H>UPBC:tDnP&=L/'^2(EQoT]b=-3[)8qBI._ftg98W;1OT"2J>XIbSrk4FB'"8kY@!,qq1t&LfE\0q09CD,p$PLL2\,=i<mtF`K6DYTk^=QDWM]NF;l`/l+MRSGIgVR-^7-Uk&WPk*b/hF]"X*@+'578kap9]6COID`VUF&S`pVaj>.->:fk>CA4,TA3(Sc/%In6Y9UcU)qm;ffsI`Wk^P,mte\r3ET>ph_[*Q4sGQ`UuI:s%.'$#u;'j5lW>Xq!H?;^LG^$L<cq39,'DVI0k&(9!:Fq-^DY=2Mqor6`N;cjrJ0@FrI?n=*od_%q%BYcD5?6P3h^\R8YBrj7)q>5n?3D!&dPr_+Z.=d_J4[/<i>k[+:9I:Xt($%ZWG=^kg0!g%Z;)huNgTb1Z\^&(3no30q9VN0XA\)61T+e%5r6NCMGkGa)3Q&(YW^isEqh$VW-#a3*Oet`V"T?e#..-KWAS0SSO":b;Jo=)P(ILV?Y[0-qj[KEU+\:#@`0p(B`YqkcX+Um0jQIJ5][uVg]!0PUEg^J`-Z*]?_bPMld[uViAd*1leaTqm2c`el_XA^DhSW.Xdk6P)9UiHe.Y*6kL:$p$`H)a9.;g!VV[QaVFTPJH.cZlglpo_.:2<.!E3Y=rl2Ra93fA+Y&/9B)'Mu^p'Dr`$>,pJc.cYj/Wc[-<#r"c,@[n;g5j]3h[H[24J4[KDe<[Z>'!^DEp$'5)\(KbFictJ>-h4R%s!PNu1Mjc]dCKh^JE#uk/3VLHS.mR5k-S4aibgi'G[Ff<Bm0V:%.b<$.H'Cd=$N]*,XR3AIQ@HuC,Y/Sn4X'+^%K%257$bLXg4-gFj6;%Mb3Tu~>
+endstream
+endobj
+749 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 748 0 R
+/Annots 750 0 R
+>>
+endobj
+750 0 obj
+[
+751 0 R
+752 0 R
+753 0 R
+754 0 R
+755 0 R
+756 0 R
+757 0 R
+758 0 R
+759 0 R
+760 0 R
+761 0 R
+]
+endobj
+751 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 175.77 669.866 361.21 659.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc2026.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+752 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 175.77 653.866 419.82 643.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc2119.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+753 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 197.71 626.866 389.26 616.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc2277.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+754 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 177.43 610.866 368.15 600.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc2279.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+755 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 323.25 594.866 510.89 584.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc2396.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+756 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 128.0 583.866 155.78 573.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc2396.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+757 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 389.35 567.866 528.98 557.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc2518.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+758 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 128.0 556.866 224.65 546.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc2518.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+759 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 128.0 529.866 296.77 519.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc2616.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+760 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 294.38 513.866 378.17 503.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc3023.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+761 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 200.21 497.866 368.14 487.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc3066.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+762 0 obj
+<< /Length 1647 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0D>BALZ&:Vs/n7.glXsI;doSla0jYS>q^e*Z^dKdaIi5&g@Q_aQVY./`\ZCrZ1oS"dGlJ$6l]guMIMbi4mK/f`>KTceeGe"rO"ojD;;-<Fk^a-@(KQH2DZ=C>%2R=r:^Dr+n/[J!`$>&OgDSl!-T#;3oicNR'IN%00@%8+Qg)/]b%]!ObB;W'm*)>P,1,Mb$E\8+r[1Y-M/01(>5[WX4<Fe3XgZ$=CABMVh]GRCql(n.bRra)t04(ZdD!P#KKoRUWC%X]^+'E8IWC3'u@][&Gk!A[rF"6(VB(259<(&MsDBn4Rd0u3l`^e+M"e`=qZ^&O`=flh.Dc%,LOZ4\-*i37G@fi>l7rfTK%!Ei!`DiqG]XW.(bFBfiP8O05,;RDH9M2+4,/mli'tM1/Vn$L5iTYBG+tpng5$oYr8q4XHc]GQH52o4'nN*atG+r[hj4qJnN$F$Hlo8NEW?mSPMR[aWo.PT.RG(GR;LR7^%!+U,b@KDH+?sJA>'XGRbf+=G6/7SnGuBNgjA\>@g:@6RQcis/'p')M!APS'F&Ck_j[*dSQ*+:;ZUj!m7eU:2GYbHaqiQ[A,u&3>R.fB3<=+NBQqZ?5e>`h;MDg;u7=1H!99BsirrLiNe>2dUYT40h)p4+PfAk`IMX.%Q2-!/I.M`/sR\T(@TJEB_M@:,r7Z-9`ns[qoM8Ylj7C*@,)'e7+@lu`_3A0_UV9#1]/5QLuQpUi#dc:3>4WK/nPH23O9a!,l%(W>&I4,C<ipFE#>h+Q+(^n3b8<p^'aK$VRD0RONO_]ZD+is7)JeSMBpq3J!W`\.!]`(=BY?#S?b[EMK`29G*'5>+Es/@@a%UHR':`EWd&6b>nS`nQV5)P\Na@PXL#+(&bL??`FK.A6]mcR^iQDH`$c`RLa7[_AcZQ#-#CHj7t'hQ71gYEPJM4!>noPQDHb9_?3DKq.&"L%XE6*S?o'+E_aU%MOSZM$3fjii;WbhY<73\J/$CAM('Yi>s8g[0E`Pef7E2Z%C\_Gd"c:uAV^e]QqA>F2q>rMaLKRkm4>p<8#9F9gDF:N`&h'%P;(<(?f^;jl6VC8W$En,)'n8fXO7^W+6-*s'o`6Yc#EpP,IBi25<Ngk<Rr,*',hS)m;'ii61IJuhE:0Gsd+h0-BCArF';[f^$^V`VH<F6$Y5)4OW>HSD/uZrVm',Cig\[LCa4fDuG%<f>E%k,t]:.c\sa21m*AAo5$s/JGkPF=N7f)2JJQqUnnZ#Hm(Lg!NKaa6'=Zi*#1t+b/"qn`gGC8YQS,^*^\@Y-.agLh?^..YXk^RD+QQ.>+JOcj#a'[3I87:88/cC*@`$>#'gcgVGSnm\8!P9HFYN+$q2,4VbiU6:`^.DZKbXL:<e2Cn[aM4-#2mWF\o`3s9u;XV9$G%:WQ(luU<S=2"i,kIc?XO;Red3_)GUmMV_Nif9%=+(+33,IJCULt;dE.7"4J)Du3CF@Nt0r_62?nt(+Z&eL);j$@oSRXqROL[K)P7btig!cN-&aKF5#'jiGE:lA0fC'&)/RQF(/=!8=aDaaA?BpZ<eKl'bP6/1N>^9:GXU,l\$he-L"_B\2aF:#`9&3Q*,+6%NA5lp#EJ=A@@E12M!O(Rr%QU2bgdZ_^UrdkFH]p>r&YtMT5Gju_D*bcM~>
+endstream
+endobj
+763 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 762 0 R
+/Annots 764 0 R
+>>
+endobj
+764 0 obj
+[
+765 0 R
+766 0 R
+767 0 R
+768 0 R
+769 0 R
+770 0 R
+771 0 R
+]
+endobj
+765 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 486.66 637.866 539.16 627.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 61 0 R
+/H /I
+>>
+endobj
+766 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 322.23 626.866 374.73 616.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 63 0 R
+/H /I
+>>
+endobj
+767 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 128.39 496.394 173.95 486.394 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 501 0 R
+/H /I
+>>
+endobj
+768 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 145.61 480.394 191.17 470.394 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 499 0 R
+/H /I
+>>
+endobj
+769 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 247.8 284.422 293.36 274.422 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 499 0 R
+/H /I
+>>
+endobj
+770 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 241.7 231.422 287.26 221.422 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 499 0 R
+/H /I
+>>
+endobj
+771 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 241.44 215.422 287.0 205.422 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 501 0 R
+/H /I
+>>
+endobj
+772 0 obj
+<< /Length 940 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GauI59lldX&;KZQ'c`F*U.Ra=OB^^(rCZ+16et+mK8^P7.0`8_C%LdDYVFc7`GM-*0:EXQm'?NViesK(reaha")%k!4_W)daFa8D/6:D.hZ9nC=i%td4#mQ,e?UNVqVl$:A0.QRT>X&80eJA0Of(hiC<M5EI+DtG+h0j?=MMd0"H^C<hCc,cPtF_c:)lDSW0p=8+]TfYZSctH7N$.qfKI5RHQoh;]f[C/rCZ1t4QBk&G^m"RhOh53#r49.<c;o3Bqf,Va'r3l+/@LeEhtFXTdDl<EKkQ6_R)*3O5h.#.:U9:3m8e+,G(k17W,6??STnG'4PJI(IHBqBm[7ekB5oK*fOu$%<(V4n0St]Y?ThjXH*:kl[6N<G."'Re4^/O%(VXll(4@2rhc<;05?A,J?aG@;,^!cX'dL\j@bclCDF;R'AY"!IjO#uPcIbI2tab'eLk(#$Yn]$bKpjd*gH9^LQ3'8k_Sk36Uq\Db/6&X"?N+L*\_\ra#`%k%RqNEc,qVkS9:(@d;/XCANP!Y*QJDDOD9$r^#=BR5+SDKPT4="SY@>DX@91X'N5U$4AVfE$e:!I799nRHl9Wu.,&)0KQ@b)9UDd.T2MG62/`e.LfXPM,DX3ee8sN3=HqH@XOhu.4],R`Z9B)j,"cJEib;IA`o`SO_0"o@PRTHnpU(AGq<$h[Hm7RUFfY5fq!t9ab05b$To,Ecot63allB'ZXcp6J[`EHJ_f"2:#ij3XYKnj+f8!B?\t,Aja$KaKn9_D:H.32-c,0&1nVaraK=CP,F+*!DC_^o2eZZY+9V!@gL(ja1pG\RdCJ4rIPt26t?JAF_T7;ZRQ<*esNe7A_T-Q&,H2R_t&@Ws?+e[AX\UH(FMg)R);k?)U"e@?aJBm[cnRTf([#n*+H!%-NjC76QYBZ8CDg^+aOQW0<jl'X=aWTgG!?FBq6i~>
+endstream
+endobj
+773 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 772 0 R
+>>
+endobj
+774 0 obj
+<< /Length 955 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GauHK_,B#A&A@6WHjhg=.`mufF/'mPBrAasJHOlh3[/ffCl^-Fo^=:VEKh#-,b;a3ilKf^Dg1+,.c97Bf/)\7%%n7uoq4,*+U?.#Ei;$o#_F0-STsE^oM5HMEa/[>I*j#uZh/s2h=Et)@5:'ZA%^+0_B"kpi+8LdZ$poAlE]@t4)uC5pkSK6*!@'a>E=p;.(oWq/NqrI<E4(ENg"*3VS?-DX;D`kX,iU_Rpa_N5moTfQq0l'(8duWGK8r'LofgI-DAgJa`G^9[Z!<8LmtU-hW>5-]m@VcJ12/Xjk(+t7RkCMn&)ufbM-,DNV`8Ab=9PU\5f,rCin/5$],Jhp?M8q*j1,ReMn-F,SEQgOj[f9^e.j8dMm3RKE@$_<mK[4S1bhd^Li<R)90L$1eV?gBa\P#CoNeFR*/[dbU^uY/7is0EjoYO&AB^D]*sp=SkB!f?MRVjDYjh?ZK1lXO#5%;a`]t^2<.X(I6,gL-a?M]ZET`P5%0AnC+AgB".jEaGLD;qh&@'_7F2`(8B,<.+s$??<+N=/r&%kK].."M[l!KN?5QdKa#<<Ig!_9;o4`Dt@3'Ml4h,YQGU,!>hABe$//QF!S7C"tc]UV2lYQSUk$]?.hf$P;oZe<.D(Y4^'oWgQK,A"U+(bR`Gm0imfVe+BXOOV8f8Th/s6fg+RPC<$Z.q8bWj`djd<A]ekTa"&7_"p?Tm+krmb/qBb/$\igE['i0"HHno"2KK3!YC:J5f*-I$c6GWl?XCTa$JLg$)Ck@i(JYG<i&bV$hpbe`'fg,s-5a6>Nk9rNl9#'1<t#ked&iCnRmm9K^8r6\9k*7B>CX+d_/g@"gYDopI6$o0)t&,FHO3Go.*js"!'mZi0u[&9e`(&<QU33lourqF0/?Dq-*<$JhUD"d7o*8;_E(a(od+SttX0KE=gL&?88BY*-n1F[EVsjq!MG-H!@f&%MjljT~>
+endstream
+endobj
+775 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 774 0 R
+>>
+endobj
+776 0 obj
+<< /Length 905 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau1-9lJ`>(ru)mMB"oc4MNuBXeW"q8X$"d[>30t)S?\?`0"Q^qX*GGM4mX;Uf)1TH*I=pg[?lr2B.(X@0(r[#.$N=(d*jU!::!p0t&t@A&(Me>6PPt3Q>kJKF"i/of1'7qhB;Jku+B3EY5=ZECMN1[FV=!QBa:"[A^kdGRS1KXD8Cj]Q;o=(%jX)!q7Vlq7Qn:=U>;A&pI5TR4=`hpT-,B^H08[]\0CnQb/mPPLc@!odEP[(dRWJhsJ!+Pr<[A,kGhnO@?-K.CI9.Fg2`H(8D0)7dNjsXtK/qRcl583k&V]h6*"uiMNS@a8WY]4o::dFsV3ngkD_2Q$JZ0hT!*j6'k@_EGtgLIIA^'ZQ28W]L+tp'EWi1$Q=2]h(/G%Q-#`bI/LH.Sn<kR#[km&_\@_;LdnHJMDhVV4,J+hqs^=WjAgLu.[aq''iKb5.aRK]VtF,+>%h2)Ral78Nd]S!qg>5UX^tqX`+j3GoD2M$Z1k1QhQ&gO*1,;ce0uQt[e`gu./o0]LVce1!<f5Nm)6_h\Z`BLqRrg@c2_JK4K&pJJ7uk^TP7gpEK1[KL?Y4s(fGS&,?1e;NWJR0JA`tc%"]GY*[+dtYXdo`%X6-r\%=i`lQp2)G:;q4T"m\NQ?W2n((j<r6dEeL4%@HM.6<O/dj'HR%WI*I1En6Qk@u6mJWie!XK65k4VT'bHhSV)jaGQ!i!<3>/V/s-K]CC7GUQ.g!:DVb*(F54]XshcKUo5h_.+%sqcijaS#MSuR+6sO_N81kijeZQ(!gdJofj[Zg0-M+;==6d5$;X/'dWtb(6!_i3aK<#(de.t/%Yh7J2N[kBeEJf05f+p5C&EE>+H!MJ;s*M,fLtTMh>t\3_<]D2&lu6U,nKn?chn*X("$p[L\Gr8?QU#s+>_Xa8~>
+endstream
+endobj
+777 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 776 0 R
+>>
+endobj
+778 0 obj
+<< /Length 707 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau1-c#;;i(l.SX'g@4+>^q7qf!9=`1i6Ekp/$&@M$m0JJt,[)c^t;2$r`<4<lBPsm)Qm8bnJ!C0Y3ZnJ.Y0lGT.g1)I\0O$Nj,YQp_Qr$%`V2)*dPtgYA)ASq&9KeV\@8Hl2ltC\+[5AR^PO$$ZWi[o8U>'T/?e+G@@\(`ue-]mI?h0XaOCC`;D<C%F/=nT:10EK[H$Kdf*7;YC./2"eCoE`Z)ialR?;k`%%CH/)=C6^L6AThV,J\HJ9>DG%6dgi%]W'M9Bh\:[mC"@mgW;r,5lgH^gD@rKJ(B>a:Nf>VtP(+)a2Z^A*]HQ>jRj%;S<e`XHX>qr()Fi_qJ3jp33hP*@<*CMN+M-[5J,5^i1.Is$h3pZ!/Ki:%bPTa*ff%3H?Y";;Y.'[G[P2<#3]).hN_?>XILsHZeE=?C\)]!#+%S$7:VV!J);U9'ph!OAor7>pU[2A8^O@*!0$U^Jc$$F]CA$%*#CGK+`khSCh5B`md?MP;06p\]CkK$(HK<g&6Ad-S^(NK.9*-M#;+5RRN#?rqD%2&AMZ2ZTF`$Qoie@PX1r&(,B<KqH+Kcl0b8@<>0Edn)eXG>]0af<b*O-R8jIPsiCj7^Gg8g"B!n"G`lIKDfkF9Nlpo&_WrV.R(0in'PB]u(ObF=*E/0&pFZAoVMEUH!f6U\AM`+AtI)<V#]:>THtHnHA23?L&jI_<;Dmemo$~>
+endstream
+endobj
+779 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 778 0 R
+>>
+endobj
+780 0 obj
+<< /Length 2183 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GatU4>BALX'Ro4HphecRXOgO4G@*[nPL'NTK%"P6l0KffJ2Y,<fa^T'rQ5]@-R+n]4.YUY7H`m)msO:BIgB8nSU6gik_9ku>)"qRR@5;uR@7cF4jWV?dr&r0U4%IA/W3';o3^?i^KRc`rq`cZST:1^1k2]We&%.b?,f@#Uo3#\]3@E71n2`LIBN88@[\Q(*H$Li[U8>;PCd?pM/+,qCf[VCV_;dq;7BJ^>"1)#+S1ar1>@e.7]&ceN`U#+U/*>2(Kl%cR_&01_f@;,WPrc,>&G\0,F2OU#mQ(%^V:`r_UeJ4k+joLcs!=*k[$ab3,=(5ZReo@\@[`&1N^rb[$<O`rRq#YDIrWKgKhA=!LM)=_P9V$<)35sdX%-(MD2f>9\XN$>p!2NCe=1H9b2s2p$Gqss'_Q%amE4');DBDTMieY'o?Fd.g8'L3(.g[GdOE'6dA4`O+@hnKKgk"[>dP9F<1Ck8@hRZ-'G.@_"W$l7mp7doH1A.r3X[jG+ZE)J?B't&n1in$J+Q_"AS?(":`G*bED$Ceq5=!*?TNPbL1&io7D!R_hh6%hKEIY*%KK\J>+upPXdk5\DTB=[7s$I)JgB*4R(:G-%FAQi2>\S0`cB$aH#,/Zb4AF$d*6i5*<?Yr]H.""1^0p&^PJp@[1?SO:7ludKd_!>IWZrWPc[>:8^[L:*HdL:gSRFj'#%q7d!TGg:hc9>]%6h9?O^2Ge8q[i[S4P4]L@3-<k$;)HGO-2q6C4"Y8egmM]/:7-un.cV4qUL85!()Tp5FJGg?k(4*[<Alro6AQ^.`-5!"eV!Pt,$Ya7BDS)4GA900:PCc`5A=DmNLA]il*\p3L)b6mR[LP(4165t)AS`7EF`b[ZD&gG1]TiE%3fS0[QVeggFBTkmRKb^OlCs$@;/fj]0ue&*bQZi,!_s)kd'WQSKD`.2G";;9C))Wo//QHI\:@K(:BaNlMRR2L.g;194#*3Bf%kZq>8Jk5=-r$Q((Hcud]'qs[uI@r@b[:h/f;Z(Z`)Z(]A4XpZsFH:Uj9ToHZD"2)2KUB4LbWOUMS'9[,I$Ja]"KYnF&dMQPH6$k9g_U;p*dgYjW0A>@m^5X=Y3`5Z8;OXpgL28Tujg]mXMph_SoaEk%/o/RuXq2's_Enm"!o3%)guaXgT7CD*e4IfmJZ:7#GJa#:3=*&a,EICt?A%&L1fZ[5Qe:l;)AW5Oq5K5.g8E)&f^d6h>M!K'rP4J>A46Th!ZrK6G$;N7L1r<&7Pif[r8CasEq$@@@"8+*]RR@X5sRq;h^BEM(bPX3/<1?W2Y:uWb#dLIXVY:D?4`MI*!\kOm1o+D<"F^4O8(cJ2me<.pj73A?tYrGPm"?1$'JWOOnTMfhdaeil$V*2+m*D?WEL(2'FcR2F@&?tpNbi(Aj9M"=UTmoG2Oh[F3.'K(!es!1$pD_9OX%K+LIZ946ri[gcT9GN<fG%o4LH\.93`.,d;CZ['L5&5o/5*_$Ye"6I:'GWH_*<VI[F][I3(`m%=%@_I?kT(<hBq!oZUcou:A5j7)c/S-%>s5n0$)+K3b)k;)%VGk[6n`YEnEq*]HIet=WE?a_eLJV"f0oIl5NDa-epUiX<LP$W=CFtnr+Kb=?PkA1.OOsnPI_05UK%b<RXd)'rH4`_cQqO`@MUB34Q5h4COu]8RmFPR]1CDY:`K@;J91\U;YA_;WV+;/=DJdM:9N3!Umt\nUIiih7j[Afe=_0$<E99j*;:QE]+`5R]GC*s76r6O;a2$Q"4g;Lb^]#aS?uM6)=TNB)c2HQ'rNe^9]BfO7!-YSVSj&n0^53l=T!d!.r*B(_;6q$&ntLgLSh"#N;"QZ9(01W,p#RiC/55"QTLN!bAm+:\F"#2"#pTZi6bEea3m_a6qJX]t!Hia5(1V%jiYRdsW(/K"nJ/_#tI3`aJ,jqPkX-SY5YhX.(oedLS:pbA[TBX8\b6"pi-Q&c2(@i%Kmh2f(bKAcdn<\]Vf"N'MaR$Rc89YWj&CF:sOb5-/]"#c?[GOK[XX2#&fn?X/<p?qLZ2OB%!.oa:EHU?q^4bNG:7pi^%LXt<\OA[n%DqnDdlZZs';7$AO$n5RbVY7tH6^SU[;h9V?-Z[.hIeYd]Wdqn\4<#I%>eulR^el@.&`o-o56X3?<VW1\&6=k?K3JefW1Mt<Nl^c1^YLfLae0fWP_>;3]q?t*RGua8>~>
+endstream
+endobj
+781 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 780 0 R
+/Annots 782 0 R
+>>
+endobj
+782 0 obj
+[
+783 0 R
+784 0 R
+785 0 R
+786 0 R
+787 0 R
+]
+endobj
+783 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 104.78 631.866 227.85 621.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (mailto:geoffrey.clemm@rational.com)
+/S /URI >>
+/H /I
+>>
+endobj
+784 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 104.78 555.866 193.99 545.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (mailto:jamsden@us.ibm.com)
+/S /URI >>
+/H /I
+>>
+endobj
+785 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 104.78 479.866 206.78 469.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (mailto:tim_ellison@uk.ibm.com)
+/S /URI >>
+/H /I
+>>
+endobj
+786 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 104.78 403.866 196.47 393.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (mailto:ckaler@microsoft.com)
+/S /URI >>
+/H /I
+>>
+endobj
+787 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 104.78 327.866 178.41 317.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (mailto:ejw@cse.ucsc.edu)
+/S /URI >>
+/H /I
+>>
+endobj
+788 0 obj
+<< /Length 331 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GarW3_/@+D&4H!_MEM0CF_qB(p!KRlRYm7V0d)-/\DX6_,Y0)6IXZ-!FUjZij-eTNgR/D?1'Rk+%-fXaciaKUI09\\*lf64%]Y5"=C`(iUs)iVpU!P!j[.'l50qd!#=[`sQE*GXf-=dq8hWh?WB=>/jX;aJ<E[g#R_TE_gE.0F;T/\DEQ>)b`(rgd7J95"Ae[[#5e&TJj`p3R?/o/RcX8fs?G&4e]j@1h(V+R58/+q>m(L!fJ,'/bR/R=[0k)EBE@!!][L[i,$sr65EndL>b)p8:#MgDBIi..C?LPX7-`0!qcgHs5W>jk:_B+"<]/rTaJm\Q<B0-~>
+endstream
+endobj
+789 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 788 0 R
+>>
+endobj
+790 0 obj
+<< /Length 1278 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gasap;/_pd'RfGRi9a16PlV2bBMVd_8t@f<qAO2]gE$cj`%'E`2X0f$G8[*g-MA-RW\Bg`\`]Q2II_B)p&6*Bi`-g!g\NB,G#rYp_-\0m$/E^u4H,Wm@+tnC(QVhMVP0jS8TPp-,\[BC(/IhM<9iLdn2&^GL2^i<7q9%X<'Gt=hkjg=L"bsoM=>c)I5!0G?DoVP0$JGc'[o`pF%=Y!OVQn<oKEb5+:YC(!,f@mUq'MP5Y$lMF%nW?LH-%:h@b%O(4ZK=-/7gp_C17!X*/`6,1%Yg>8birKXGV%CMAJ(@\*Q8@GLh.ieOpI6X.\jZ$F<VoZG(6'hQkpcUB(%Ll[Fn;R-AAZr$--@\aWJ59OruYeEPUCMVslSqFZJdW"rlBB@uKhM.;[j!8tXiS(7P^H/RZWHKo@ZU\8n"YM,^&Cur;Tc_Wnb%q5]!k/>#Td9"N<Al(f]^Y&H_:V=JS^aKmU!DYTf!USqlJFd(!<uRH4Z'ca%+,dI&@n@tOF&6,b`)Qu-I@\tXa5gaH3FL-9<*U[G!hl<Fc`STQ;qa7;4?t]L6&pnP*@UZBr#sZ9@AQ.g^98'B.91#]2_aeSpNN_j5&0Y*$[6-7)ptr\8D8+%aVI;EVfmEN0$:Oq-pEr\QrQ-Mp9\W=L*$8Pj0RRV%<U*?'W$bR'@8%=dQh6@)RS!qF8'thuXLmC"qk[(lNIQ(^;MuHWCf$\YGZeI,pel.Z7mg>GdY(EpZTJ44W^V*=b*OW$_*!=%Rthb3;;+;RpeaQ_gUej,)\:0=jT3#Aq]M1I6<`AgA4;?7eVCO1A_#ca8p(mYpAVKe'j]0(LiX+.1'*4gPrt2etBp`,ZWZ_PQXDn-$a2)5PC;9o!20q)OJ#I##Hu]]?'Ip^i/F\uDsbXJm1EAS]36bT0ubZIoiH&hB:NNor/B1WP4,0!*(meMHH4<\Wer1ni769]I1RihqMDjW"Tk)ED8)<M0B9+_%)+3ZPi9c5,=9Dd)k'*RKO:OC8G9)SVV_o,GL9s610q8')$V;nd5@g<aS)8#,cr_k0D$Qr!07^tE;@ej#T%J%.l(_7em"FjE^M"_PAs"1SnA]]+/J8"6MiS1-G>D5*X!Y-\&O#/5PjISfrE4Dp`L5Ha/O@f623cGMcj7LlN<Q:\Z@<LcJ8[?c(Z/AAu'KZl!5mK]XOh"@1\he;Ooo6#j&0;2?ZYkUO1mZI^Qk5pr;@2bc6G6\5^7K#l!M`69Qj&NO>@KIX8SM<47-he:X'Bnr?+d;@jA;<_"=4b:GMk;@BpY2`5FSCtU~>
+endstream
+endobj
+791 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 790 0 R
+>>
+endobj
+792 0 obj
+<< /Length 4141 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!#`gQL@#&Ui84bbJES1;k3SS%Xs-8o2U\Dk%'e&)8&jC.`R#E4D(%Y>9fF-:%\Q:+kY.Xjn>LF1MBo+'`El^45gRDq'O238*(O^.L:ZYK/&As2[Z,pmXlL9UOVj+#gsIIXBd[^ONNaD0,a/d`PNYa?XJQCJ?=3YM.!*fGL&C@r#Q=[bG9kBj^f.`?q<'JcGQBRk--tnn\_JHUqV.&0j-'r+XW'8iVZe@AmOI`[(Cu<^\3maWuujZci.jh_n/?i-!6Q6+mT]=q*1iNG4#jg1H]2S9kj(L_WFW`YG,^-q_Kg/m)]S[;SkiMkq\Aj7JKTp8;`_VuXD0\78)sL4uj69iD??(D@`>E-Hn.%SX`Kh4fAke!og_^3^OL]mk8+j88:+oOCpL3:@X$JL1Ms#K?X73ZeT:Z%QPjBe6too?2p]!24Z.3mR)6;:o3d*3Wa,Uk,Dr&*HTj4eHop@XgRIr#lh1Q+2Se+N7j=!p/)J*"jcQ4)j2D,:OlC<eL2]h47>1IQeaW>rS-pp>9(I_99V"(e'G]DHHYh.MNF=:3gDjk?3K?L/,$8O5><+[NDh]o[_?K_Dj6#c-9dHTX>\i]RMC.o83O*`qIk0OL2A.Aar*Q1,_b`*iEuk&XsR1gGa>+Hi%\iq4cQaNJs(@map(ToCHDJT.@mkq`X=qrKQC[Qp9!L0tm/3_-arZOtU4G;^c.3%ncup"kOBep0nOrTC\+T<`qp3_G5s-,_RQ$=1"6GC"6mP?'Q&N6cWhJ:'(J'Tt";R*Ri!1ku#VWrL(I>@V@'QUOS`rED(6M'["s^Q#c*q9'I)g.@"CDb-db>d=K9WAk-K2,1dP.9Q@6kE=NHr[gX)n)#R82Y/.U=Fk"h]4:oLW<mJO\JgY*QRqAWEGaIcaSr3L?dT_b/i^<GnT0Ai<,Hr4L_%^LKEgRTBR//Z"$r[Jo6spAI0rpZsg"!U5R!t[h:KPnR-Dhp#&\aW=2cOrhng^(mf9N0G0%!4n?q;KRqAAE2+f:\TIG:0+ON=T7Y4Cl4^"rKh0s<kF;ML#fZ[9f\):]JL.jQsWB?iWYq7*7c:N7?IJQ5o+a)5S@("K?13pOQKLu>%_IQrL?]bNGoEC6_.jBT"l5TNOCOc11_GQBN;(cf8X"X]G5bPe9QI/is<&;A5Zl;I.]Kt0a6&ZK4-b:t::S;C2j\a$Kis+(SJHt\TH9Q^ZqV-'&E!>%iX(u-K_M*7TP\>=];BbQu0Q($Jo1TJ$\E]^7Z\oi@$94cU.==POGVg","?IjTNQ#Zhf`JY>Ye[V)?=k)b*nAr+NY`qRWZVksLs,E73<\mZ-;(F0sC+5&h9J`M7G;]&C,@qI@Bdl]_m`OZl9YX4BZGRC$TJXil>p,licJlAk99nqFjaTeY;Q+>Ij]s9ROmR7NTHIq%JpE&X7/#+6dg/Fm10?4S/)aAkPoEtP<V%]VLjF#%;@,hB0N9_MUDZ"Xm`ONHJe<,ZiC,M:(b-AbOjf4d0N+otkH3]5cI=UZfR3PpJeHm$Dsa5,QJ3/;YM/8NM%O?U5V;F7@%.bo@,Ig$m,D4*<\Ca^o.OJLr9(Gi(t$nU+7FQ)r;-7--M9,cCesOX##RK*d92GuS?rdhD/+KWc6!Y+I-K$-Nt'<!"JeAE:5L`3%PFaJG1#jA;FD$uFNQd;#@&@Ri!/Is$]U:Y#iR+)QZ*m]k<-=dKnItIdH!#`'Vg?O&uNjF%Bnb2I2F"r>f-oKW4hdj)"$S+/1\g1!jScoL8.P^AU@FaljX<B-mGJ0'5"fi=7UqPi?(pgrUU3Vfsm;W$)RM74=QL/HXhn/\L2i*ZE_fD92InmnAV=uNK"^I6F%U.l5:6BK<iYOC/CmLm.[BSJJhWB_'98E`;i_ibWCo')U5nRI,&Y8foiR!\%sPZ!b6qL"P>dR`9me0_G.%pL<6MR7\E$t2+\#&ZfQ;shn!-`ek/h'#jP!i`2KrgU'6^A3Y[!Ahm+NLfI5Z#5r]jSgpb*11)]>G9S6qlp5s_'[lSMBZRF[h6>dZKqSI*A?;4hQmZL)c9a4fL",UN?rURToMeq4F<q^eM7K*,OWu5F:7n"Osc+>Gul(NB4d[bhVa6`R$'sUbKg\M)lI^l_dqh.)"1jpuPAP>okYR5S!4_^ZXQA3Asjio)tbg4>n!cm*GNYYOR2Vq9A&>&O<l'`eA7G=ZL[Hcu&`cQ'Hj']u__)NuZ/kErj2P>4S(Jub6ZelpFqpX"g!iYLld28$n*er/qAa^pQO6-*5%$e3U.loQC@[<+dKZ&tp;t=^i!jofYb?N&/%]dMrK7SF@]]R4:/03N+p+Em?&Ym"p<F6h9@;e*(^o/H9./[$sU?CA3nW-upMOr9Z3u+g9)G7[$$tK.R](BiQ[%pG'6=RYGPpU"97AuG4I.c8beO)Z+XJ^haQe<'M*@0E^G\V?;\nVti&/3o#OYPhXr*2M(!1NE3F-[X.dMcpUN51fEWDh1YL?$F1C#1&%fmPuY>_M/_a33l2^rS$`\?bC8$Hh>?k+eA)G.t.Ni7H$Jdn?8nNn<S\(%3WqocaN]itW`#N/a,S9IB-9`_ob^`^Yk_Q#ZR;[(>T;@TP:U*P#Wj/eE2I!2'T[E1%%#/BcLiDikfMCsKWo(eC!5B*![%H7L:WmpICF$<%PFLq"p#c0[t<b6X,jI(QnW*8u-HK?;ZiKQ!T'm+Z,^hlHJpL$(6(2+r;LNEGm4<bo&cm'r%<\Grcr!&n@`LO+"1nXNZ)E?2Yh9a_Bk42@uOBe_"MebMU[PdZShZR=TH6j9\k%OmdUGX9837_AV1$e$YTl9?Q*@\QFBi7q]ohd^u8o[q5l^blhqTp>3a=m`s<K/1gJ++??=GIqZs16>)<]F^=ZHYLJh!V3(e/')JNHQ`S^V)^^iGL)&^q=Dak#67j`(as@BE&$#22;HK<BWKaL^AS5]=,40Bp3j`&Bna.g]nU<u'f,??A>?&aQ1K%.p5Fkp:%LlU2nNA#,,2+F.q7&t-9,%SU[VCYXla'rHf&i5WajSta$,ZkS&0#cg81^ASm@I7<"'+J>7YV60^VM>UF>Q_)nb`fEF@j')>8]F6`ZX50eFE"bTFLnai9RX`L[<W'0=g.;=J*`<cde_p:.o&VgWiV(>5O3*T30&M\UcU#iu3,q%RIeQ8pd*ZN&qX,';I'R"Aj8%SBM7P,NS^5CP_9<FG/NJ\cS>BC_#)5m=8:g-L'&4\iZ\,a8[jJ_EoLc?!K9YeR3Jh;\F+1Iqi#?js5HiQ9`nT7+4tC+ul\&M/m`6(()XcQ'<nLkhXHQnW^A-kSJlbZ/atGB(fM-+]o(`tCZS')!bm&jWY3K'Jna[^42?b,J6D+h>H1]26[0QMl9Lr1Wh@>i2/ZG0%Ikp:3M]4_Cp\^.lBTRL5Jop:1NO&8\64Xn^QW!K#2lclkE7$<O8/_+V6-NfVp"@iXO5TUdPI$5\Yig4*K^)%7:(*t<9,=,S-7bB"#kW4n3s=jB]D1([XAocpCN>V^KU1WVDn-2u=e*bD2;6iaq+9f4;uE'E`I`g`2Jqs>Vc@@XS#VgWWCEqfR?0D=X=s0(cYLGn61k$T1dHdeEeU2f%5:g:\6m41FR0pjW=fb:ZRd3;"n(Z5SLo,=]f$8EG@!;<,g;gOdIZcf1kqRU\R>,<GuSp.M<;:HL#W#ipE'4e<us"r@g?8HC;AitYP%%u%Y3q_.u"]bhc1Hi,^%/XjH9!_l8!e3T$5.,*#rJ*<1X]sn`e3R_Wp+m=*+<%ZCI+Y'7:ki#*_Oe\]$lsN'D86'BHJ$f8/iTMn<*q21J-3>;N=/UECKiAl/co(r%"uQNmKEpI\0C;n[sR(E^C!Y+N"MF;LrS!/A!T:8NgQ)CjVutr9%^P0I3OSa;>Cj<H>ls"]3;$^lnVWHKD7W;;"6:F(B_9P:NLaA?EA?MR:?%)hSKO;gnDue]#^(5a<8^"XKE!b3Rq?5gRMV);(f1=7+glgW)tr)e\9Ho+.oZY??b^E58f!%AA>()AB_1PejXrW@T6q0j#;0&#tF=&XWg(F6":,IXnaXeqVJ).^I*Rb<1f1lI9cdof`QJ8q]UpG=HoG2htB6q8X#r15srR=pdsahK=j9Va5`MW9jc>ELY2;1!s?D\oD5?dC3?!6H?ATHFDF)k73kkgf%-$lIRs@&UB]:Oq9*\6P;i6>rXHk2[]T~>
+endstream
+endobj
+793 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 792 0 R
+/Annots 794 0 R
+>>
+endobj
+794 0 obj
+[
+]
+endobj
+795 0 obj
+<< /Length 4293 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm@?-h96'u&"tn6Jtco#,IPGAYo?(cJJZJdt0&$cQ0'f;NP3ZJVJRpH,0]MaucBP*1rs`%h'M4QQ>!Ttc*WjtArVQ!'HSpE/:WX/@me<Pfi`1*q=F#[JCc<ppR"?f1kU]3i98eEp1?S6nI-W6Y'bGHB+tY6lcGGMiDnp=,Tc^O?(RlM&j+^Vd^!Ql#b'77iGCXkK]'%>:$nc'?4,;Vu)r_lRD7&i"11]8p<V9lp6BH[9D,bH<iXj$rgtBSMYF]$H@62BDEa%OqX=9McrHThJ/cAYF,W=DQ&C8Aj!]mDI-C;LGF$C3/'Vg0MFc4_X/_/Kb7XL!gf+d1fcQX_EUBp"V0p-/d8c$mJhbO%MSVPdO#S.qXA_;M:arRY?F"H*0)UeD"GV>TsY]JiG$l0[rM/!STCKPU-e@iYYJ,PJeWtRbncKo5[t\&(<9)EEF*BLRo!eb2\Mi@%A#1;1dSXNE7ab>!uCtI&bpWfM63R05\&Q_oHVBDI2$kh9V#BjD6EOF3`,Y&=-c4:W#`G2DV^ATuHX3=DE)jiY[;<[]j6F4/22J.\:kI9@GLKMj0OCNaXKY;qM[?o&l=pF7lLbN_O3M&,"l`I(FuJ#7T1e9Jr)QKJ5OH=H:W0%Vp3?+JeuM,e6!#GueaU\_0/R9;bPkS>PYbcog6**8TcLjXOG,pXD+!\fEfNCnd*)",^Kc9HgE\^_p7KmMP;k&,!Z8Nn^9hSb?EJ9CiF;U-R1HK>DgYQKm\fKa-eUS@6sZE9JEW33erEfU'bq/?-%p#ZjIu9,4!-b&V)dFls7.`a[3Y@@`>1$!?]5-R=CnK(HfXhmNZ2!Mk4O+hPcs3Y$=8)@RL)nl1_8TWHr\!k*0/)ES&*$^3kZW6th")Ei@liEA+0YuX5XXgL5\N-ii-Adln.6k18h]LHE53f9/3DgncPLYUr@[O9h0$QD)5%'(S7F@Xh-WsM1L88]#6$Uuja;KO0,<@D4L)6t(S"U1!\1)PhDpdGZa*Jucu+S*EZcd.QY]a0>2>`6EQgOo$P:l7f5VGfU&bW0ffPe^TI<p(qZ]?Tn=M9C[^_&tQ\L?DHBmgc]C3"MY9STX=,MWt?HONu<.nfpiE8L53L,V]F/+@ZdC#BgJ-D](5'^aVB48IFK;(YB$Qa84(!FXIa;cE!,=^B`(:'8);BgpDR$:Xs(1)F`lt+)'f4'S',5Xfl$*dn-U%Fp6JAPJ=J9d3&-k:,0%Hi^s>3^m=:,".Ze;V&ZSh@lM;t3QZA!33)&I"caDjLaj>I>rA-[i)i\.;2)e&j^J4<Y1l`p+:['WX^H3c=U`;DdU8pt2T[=+e1\ioLi7BQQ4[YNa!la98nj]XfJpA5a1AC6S)D,3>iE?u(XbrL;DaJTM(N1@+.?t7]?J%Clr>KnOAot*9]?sj>G%AXnu0Gr$lhIM0FX#la!mtdA5HUoQ+6AuRQr,I-C*5VhlPeE8p5U8mhZiN@LJnE,I,no$)Q*:H'^G?NK5D_.H(FT'"\U7#[#L"K@e/%X2Ji?CAT]3AX/\l%%L:8AYm8KH_9icl>T%aT?WE`LoVdj9@A:sb!7YqHVs[@1&3AA7CD\1ns!ApNQBFW0jmW,`n$N=^H''!X>'d5luuhbK6>:Pos6LaJ[&mi?=U0$a+L\IO&6]^A(2279VoTYDNIG&WL!e_[Zm^F85`VZKu-DO?gG@Y]/NNu:tLrTit5NoZtlEX)'\iJ\sAu.G<QAmLm3g)S*?mP1I%.SORtM#"\`=B2!KSHFblf*o,ea>$<NWbOKf(b,=rUC9KgM3"/K7Hd6`e3Qe;Wj.>G(Yi+7ETB]lh\eE:o%/nSb@(jq(2P3`K0)Z-2!g]JL-])!0D8i$E7CRc+3eF$?n#7!7`:5RDO[@M@A+B/IA`q(Gj4,MJ>CA1B3A]Tq\E!G0X8W9"3iC%?q^dh:G<8HAAR]*bdGO2Y)mE^tCC8S6rNFdRXm=*@"Ku);i^Xq=WAp+TUBp'Z.@XBXmMn,-+SuZq[2U+SK61*4(`b6nL>I5n2n+#/'Mb@8-X/ae^!%BW<NHV_Wl(GZlakgrr-A]+K0KC-fDi*H7Pj@We1#RhK_&dF6^?J8M7J"PTJ_MZ35sV].e1oDVgZsDnB.40lh:O>:E5L_=5#bE7:`5cqGheUKK)EV(XF,sD.0_gll;i=glV[BeN@g/>DX\'d"V+7fjS)6[qq"XD*EIQd0@.mdAG6pnn)H=Gn$^uAV,hm7Ndk*sq753HR.(f"b\a4g%%d'6Di5HVfRDF[#l?"%-a;[fJ"3;''R#%(4=q#YF7:<9Daq.%F1N.I;7A&[1qt0^DoUrVEm![5@%d=lR)<:".4][VHi,M9i:aO#cL(u5R#X3__n3gahi+`K!i'cuM?W0uLh$##K\`>#<l)\u-(2YXasej;?f)m=]s8"3cFH,<a3/A\"o"X5Qfm=7hbRus5M"BHV6-Ll[>f>4VJtuHq(82EW;ZnNb>W\<\Yb<pr-S.Yn+W?ko9VX#H8iP`8Rs@poi-l[-:&sB)>h+?O'ld6kBC7m8B><9*M/,R@Zj'^:[m"`LYM8(?*pcLNA"ZqG(MJC,\Tnu_L=0&/AhGOZ`fuKh(Yge+eGME1\&Ud.N"olE$QrB>;qB)6`4WtKB!B6`0sVR$a^,4cZQXtgYeb;i3C4Cd&&gnp:C[._OGsrp13dF[B0.'7[1olG'/*6(42Lto+PRbF80$6-X$@LhZW.q`EHi!IU&sS%_l4@_X:Nrp(.C?&TtRa'Vhrj5sk@LF,7E.cn'2qb(Nk:+iV"pHZB[MQlL.LYaBV;m1U+dO[Q"Fd?B3YXNVj><LE@0!@rkdGbdsZP:Pa`jH(>2A?o;El*=lR8L%";3h"hpY^uC[i_!\jBhOa"Kc-g[:>M,bEm<a.mRo7EZ?<i=5%^l-eC0(uPipE+ee>5'l?O/DCPkKPZ-/H)-Q'$<=*#l+A.dlK-oqQjPu'OABt$?Rrq"n/X2J^Bm,cEic;\mS'ulCk1Xsh4Ej5@'^$`JSJ!P<Le+9Y.BV1#o%&ID?hQ^R20`"^kf&<<\QJhm*?U]>jPuR,/[c\jU/m,VFH22NYGIA#l&R)9BUF-=ED&FV/=DG2G;B-q"Uh2,8P<h2d>[&]9'@\j9P\T\?8/,.s])3](/iSKHdZfh220]^'DS$qcOm:9Q#-tce8JtUS7W>UZZC[ajK*/Y>m&i>rjCXkf:dg;*'$8h)94N"/B%i5+T,MOJ&JuqIdbf,0C@E(#)`T3<C\joF5!/.8ne"jf,.hImVAVHCpYr?Xs7ZR?XUO%J6C@C![Pf&3%sJS,/=q(Uols;njli&Se_l#,EX4KI$^&8CN"BKG!Y/*Z5SRb7`YbF$(TgR*aVp@p+tFZ"f.YBW[jg_J+#?W_^,CjpJ8)7nZ`QfTU[9UY>Z>7g@^O'-Z!5SH):9\<IUe+=+"oBnQC<jJCSBe*9F#,hGPg`LJf7KaDP+VVL3glPWk\[gjh=LJV&fdN^;(h8-Ea8sa,:;]Pg_p$JiC@.`^Zm]Md3RPTW$e&qlu^DTVd==7ZRTq/,2C0f:7)Ffk"Y!OVD_1X[g3(W98-6@3B>q0M(Q$=O51)`/XAW'C@Rlg*-Ng'\ZHa8+FnukWSqs;Sr+#+U!thIOITX..!AqNB\O5\*")ca]M!,A&gH%am]5C^`:I9><(d_.$5ItfQ#g;DI5k3CR;1H9UVaap1b_@k$hNr+1^PR#WGVT`*d4!U=qQg'qnu/_UgHsS>@+IlcdG,.C)uZi43=C$9EFd=\D+T3Yrmmk"qSK6QJ_CAk%#7]@6h3`dX,OkG\p!iu=JXmDD0*1u"P4hc*Dh/G@eok@aDZ&O5%$fVc3f="fUIV1#UdIgQ_FVY*(agM@Lql@+#u;m_)6T1RSe#**\up%OIr"KM#MWfJYJ./QbG@C3D)!T=7;s.3U7p>B!T@ja-8SCX#^L7q$S>@t*0\?bLO$uu&RUf5gpa3/M+mb&Gn^p1"c$QK]"0-Cg1_9BOZ5st2N#T,9Fj<CtL*X2#R[^K53.o/ZZBDa*h7j-pO'Cn9o\*q<^Sg@6Xb7].;]JT-5(GI]=2XllGp1^ibe/BRP;R2<6jCMiiic0C2-02*'rDF^hRPJV8)&#f7:%p1o#W,i#/q^kGY<Lq<2Me4!<^Y"eC/TW\^K`5W!X<[*#PRbMmtT5Kg(rBD<'nqhK='pt.HL>0YM]38cV&[KGAW>KE51q3Fm9KCk6iGl;:%qi-G/fZH"^@/Oet*ITS_[^C%H4L*tI0:A,MFpg99o1>hQ%QX1/,C<6&k+DEU&LgM16eP),o+Y-hQWY<Q#_T'81AY2*H6n!X+CrltHDFce;l~>
+endstream
+endobj
+796 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 795 0 R
+/Annots 797 0 R
+>>
+endobj
+797 0 obj
+[
+]
+endobj
+798 0 obj
+<< /Length 4097 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0H998,C&\cSpn8T4G.h\IPDTQMb&0Sb4Bl"9;4fE4@[kP7%aR8K\r;%*R=^mM8PBnba(sEDcp_A_+HLXr6rSbq,Ic6b?8N./U?dd3jQY_l&YABD8n8C',8\sZRiOJ^^l`NG=X(t_-Ib=S'H2&`mb#&_!,s9EZZ.Ut[RphR5P6p1N0-oV_JepHm_A2oe$7\a`3>n(tY0\Fn`]SUm5=b+bSC/[r8c7Ue^\r:VSkes$H`Ztle&V/V2&@tD((T9Ve;&\1[sqATlOTI:i@1ktp"ZM>I'u0X>$ht#a_pE?4Ma?++N$h`*jI/V;imNTWH2"1<HJ+ph3FcB?+;D+M7?gtRP<'j)KdNjCAUn7Y'&dX_*n5-AI0#1L8,q^5u&)B?btUc.k&K&64aPqU(h,p&bd#fYFBI\ko'JHWF)-c>-=iXlc:KojWm;o8g,CGR_G`V2fR9hZsS6lcAIPa(bfS>KOurR&XqcH[>):-YE>%UP8R[kMhtdbULV4u26(#eb>a)T$a#QuO;0K"V9B:GUIs:=]%J-)o;n6",Cur4"N>UJOD7r.H,7LV3bVWd[cQp\]i?Hhc;cKL.$Ea19#cNEShhmApWA'O^+DHF3(d%U";:40X<=[mUtc@ZT1qa#WGmQ/W1OniF`h97+D.^I(&)opIso1=Xh<tD-Rm`9ip;lam]4M@_JK%Lp<*Oij,g;e7\jb6`gjS+@2n\UidiDpZb&+,bY$Td%H+_9C;3hc,Xh_=RUNk%"W2H;+tSh-(KaS-=9-Rh*=MMEE9W)%4+B(1_A?Ce6;oKn8[IjQ9L0]%V@W?`$dDs_r>5<R25dQPE`];;/i9pQ_L%NYMCK-lqL+@H9XD/E5\P._%8'^2C=;t/:KoU_h`?;QE]4DPl[B=E*pSq89ds8%"KI>`;i66[B7&r4OVCU[Sh24([ugIAG5h!m[p7(r,%Znub_;cCB*uU^cBPnY3<nTP>>=dV]34I5]"W"TlEX?dI<iCbT'':9ja9b-1Ts[\pKKD5f*WFU8lmEW1e&*e97:8+aZ[$tfP$#_Gt]R[R$!]'bZl[PA>W29a\8[09ZHn!7!_^'HQ?em-,U!c]afZ%!b[2_GdO>81V,kC!4fn'B/'^C;/R\1qKOV9,X%G0Ff8&)f@?g@h-;>XnH:Tu`u$#Id1dLW&O&\BJ!J:?"]AoSH4It=5[kAL%u;hH'FR82s4-W<9@sh4fFhN+MpiO]H5#)kf&r+]Y#4:\?+)-RmMhhCD'M&c-7^c^B\#NREJ5`>GQNb:H\&-+%5!6u$X0kFrjU_JH/n=Mk?r@j_fYPu0kb7Ogo6\LX2jYXe;*3nQ.c"r]Y-$*:!aaUUp.-lVk6%;S?#hn#>Pm6"l#kI\3^cb2H9[aeGXQIK(#uA>IPsL:Xq7#&F6i)#LCAV!ohL_#qH1$$@ag*SaGmWiQO##%iecN,BUs]6HAIl;]iL/:ig_<\(I?M>7OMUp*c4n$,AQ-/8e,=N.nU7]$Y*Nq+uP(M>!Yp9JX]+Jmk=N/55#Ci<8])1f+kpj2Jt@bAB@rOCZQ<Rm?_?q/k)gE&j9C",iFs:.6*16-5KM-+Us&H*7\bgiTc)URi05]B3ZkQnmg@'.Ip?m^9\rW)],4_fphYGt_X=KZ%<K;A()Bli`YATh7!UN>ZaM/o`K#X7mtF9dgVc,*0;b9]Ej*kh+^UUH1Sj4kD+RGZuU>8/?>ZFQ\@C4@@TmHJV#:?Ta4gMBXKi%)QI?+<_@^PSmcnH:87ims#]SM].i96I_["g)[3b"`iJj<\eN-,_R;8F@pVE2:VAAH1F,C:N,(c3AH+.JQUOt<*>?E0mlIVL?&S-BCB"i'_n^B3(%tirhieFPCkXlG=H7C=Yl7%%f%1E<XPf?Wo\h@`)'Xc0;4EQUkVYM8I(O"=@V@2cPVt!TX.]]Fh'b;[Z5?pB]h2X1c1]eeDrX82hmd)-ce3GGs_]'"inY+,U'f[6UERZmV$;-5&D<#L4r7qdZ8STS^DhDiq#]&BSfQtR&.Y7$4d:r4aa]6m^J+#>a\*LX`#(!/$R=`H%hL=TkCnJjeEeM/T?sKkh@n]<`GC+!q&"fkY_1C!Kc,7GGp/FaQ,co8=F3KLAm>P<o1?&r</M@EtYSl6T@pD#7QV*`]'a>/$#P*Db1O=Lr;[f9.XhW<pidJWl+Q*HF[qDGAt:8FX%$%W6?MV@Y)Ol=3`.'G072q[ACh[UU9,>+Uf-BcCJ-pK\<>I<>VF,GH0B=<>sn'l%l!C@-U?m9,?K-6CC;ShNhkHIXq(KR&%tu,BfOAVeNeo+/h!)c1TR"fs:,_K/5YiQP,CY&Q#FOddKP`d$-SLnY5DQ0P[*[g>p[L]k]"]+"m/-]'E5l!%'B*%9TBL$'X+(a7W,Ob3lm58_0EnHALtQ"mQM5F$*[<iel%`9_5D0fcd""=hWG3Ap\^4[?:>`5HZ!PH:5%9G3#CX5b!!B;"+',g?d-\78W'I;X[8+P_aKPK'AjMZaIN"8=22\'ZglImbSuLB".NRBrcZ+iHTVhPt`8+@^"2Fj3=2tW%OK3gEHrT`At:m&*uMX=SZY9@N./F(1f/k;Q-!'NmOS8?[uE%e::h,;7Jqk:cT4KmU"pK_knp?!m>n((D)I/@&.1idj\pnmr$9n,4f($oV6)NO[<u:9YXZ_6Bf&MlM"-p2=>YBI(pg:GX"igB,&bB789j[$`*6\,;dLjGu#56(PliL&DtfH'^NquGug%j#M'"c%7GqF:#[nm0Z7cVmm*]+^J/82m,'`?)4t0\kbqk<U]SiK)$QLDOr.@QY%)T&L:9=JohEu=-::%l#FJgVPORb_D7'o'5ejc)5_(\kH#VDjXc>'rS(aHKT/3u1>B`79m+406HrJjQV<sW]XV$H%4flm6Cq$7OfXmL@"EdI$c-Yp9#,T.#I(?R:PCYZ:?fi7PcD>=qhmb=62=&R]n&t=Yk0+Hplge6:!#%H42!`[Lq0>Nef#,'"Nh0C?kO[YBHYkq6NknEsT&/P`=9B"kA3!sLoQ&Wc@+5"-h/n^X!A<+hICXgL'Gf_("K\ejUE_TAbB=hr7%`c`.O6bUOii>]Lf("J_q8a#"V(SD@&2ke(Ml*RR4[%8`!mG(4JT(+UtT+h:cbNu2h7C`#gI;jPFiZ.m+oHI"J"BSP7X.d74'0uLK>?%#9mH\8*I_S4[oStLB4AWWF#G]H;n'Co[gek@tu+]H?Ds%j<s5q8*T!$OXDi%>cm.-2,.B4cnTn$OL;86#VGZ^"F:5gU*c+;B&.@c*fhE<F"60MhC\)kmLaJ7OV`94:r;MjZ'h)ca*-fJmFE3MkXN:J(l:Y')@gs)PcMVfhOCMa[[40o^T9i,d^,Ns>;XV:2m(QXiGfcYI)f/iTdS";R"1jh.RJp3=eA[7GG1$;?G=b[l9dsmoK>IcghK=4+V%[>Xp8s&Q?oULQUuKJ_\8`K_o3Pgi$PEXoQo&GfW7QEmjI'Tnm"kCi1Fs@Lk$<Wl5^)'\PIQJX,RZNT^"1C&:1RXmM*)iM>-75F'cRL94g[:TeG2CkNW=IRc6(#;\g^Sp=?J$OQW42jlq6m*2ps_J'i^=KK52md129Y>@$4M^Rk/W=OtGp+gpR<n8aFg)0I)BNoe&TTDi\e56rD*i:MiFFNtGBQ+.[tO:W@RXDa;X'l;0;Xhukegb@I@*Hoc#X*X2n<.M2Ti(\pA?6#YQcPG#A3ek`-]hrUGj,e%oUXR]XiNU1X*l=8^BH^7kbF'S2mG1+\9NXKs0^ap0nf<(P5^lUeoXS%7JGD2c?Zdu\M4JVngW[j<Y'oC1)9Id"7m[Uq,boHBR=%]1;a2BCk.iLQ3:m_[ar,qm$s,=l'XE(a3kk?fM*DWB4Nc?.fN]\(_JnJT9H0:2euscF2&N\<TU49NeNU<TBi,H:9oRGSCd!^(U44)7M\WVY&7]a6+Tb`21$6PNXlPk/Br77KF[7>$Q4WoI"PJY0qj3qpX])GQr%0-B-ODA^c.Cj-dVeti5C\IPGNj?Y[su$@j.H@P*l5X<SW$I0n;Sdils@^35gkm!Q_[W?^d^--l1NLk*KNFF1?Jn.LIA>k,[:`(nNU(\`+?86e9P`MSc1oMR35BQ\_bHs^R"#C\1?M6["%kGfAu+M0E28I$lIn~>
+endstream
+endobj
+799 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 798 0 R
+/Annots 800 0 R
+>>
+endobj
+800 0 obj
+[
+]
+endobj
+801 0 obj
+<< /Length 3593 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau`W>AkIi&q801csmG_H^8mH]K)##puLGM;&gPiI?::b/]<s,Q(5;_^;IX?4'HC@h::aUJCG#f1EVCiD_=\tSA4jNCG@P83gkJGO\Y=OO@]e/a@$^:2aqCh"ImW--GTNOlJhNp]BA92g[2HFFI2BESkQ+S@G+H6oBl9'huEB@jS-do5G1n7Q1-.5.5>iuamUS^rBuQs.uI%4F3r87.V22/6%/dIc1fn+qRHNe9cY&U03`<QX7^qTh=Q4gR0JHU)l+YZU,4DE&J.HZOYW>D.Bu15@N]EOcj5G[I4#\#))ain$o#X5jp1UEm2rd;nP1=e1o7FQ32]?6E'LcnZTjD03I;d2`0Mg._'W8.]!.aADeW[V_3X*Y``XLTfUb$I[`e4`fkML`-j:tiY^VkW+CZm!#grCs@\6@2bPh:X)K'/YIEh>!Zcj<f\%DU31Z]8IL.s-5"-TrXq`m@6\'sp21SCKe0q)K[K#YSN$tk>&hXVgoIY4lZ54?h_7^s(c1MetpO"&*eUB\<cm'Frc]%F*!^0>6^F!0T+7;:K;0eO2qj2=e<IEM-Xm-"K]"\1C'N5;AZbUjU!j-3Dl"0,R:hQgN;6qFs[C2>RRGmMB/nu*]!T'u(_]BjON3Qq4r^o%pU-?T_\L^`^fpERk*J>%e?I/E[E[qBFTZa@g3oUkPZ!<t`ib[LI%4),hB2*r"eS74o:VCWCN+)u\=[6M+q\)$et1-7!&#UmqWa$ui65VS4Ts2aj:hY$#[T`6Hb,Wa*J9gs($-QKIt-`6=_J-bj,\e<r$W/Qj5'm0OTJZ79@q4"SRqr`?(qJH^:!DS:_fW'lR@Vu;qiXjE"dkeq\B"O[IJ$+"*&G1\aLB`R+,?0aK)06%m&st!2brl'tD>r.sR`s-3CPIhQ!%aS%[a6[U:-,d_9M_^c1ShgNI*rm/Z>Q<+-@J1,Pk?T#.Ab[-*(U?Gd/e:aYh2\AmIhOA(M[Ze,rWkS\mEYcc2bm-f=U92ca#>`k-dk@fH:Wf0U.d0:p1Gj[V\-)^]MbM_*Fp"G4:f3@hn&IG3jH#r&JW#GfiKNBqTTG!aCJLdVrkMZk(XL_3+-\1tEamLPYFI80!h9,MrTb%4mD0LK\k2D=LT:[.Jg0miE7*:nlg%_LpLii!RZVPMs?:`4>52P)VR0=\S=HH5=t#0Sh4D"]Y2U[W*9mU/5'_#])"$*UJ^[d62B6A[:3B3s1>mg-f@j/>e/2;W<Ys!1&o8oP'42.tam=n=d_mGg(8`$&R,2"6#Z@;-RU>6ZLJ'`EeXq]pm8Z%S\rk4K?tiX3-fO"F.1$nLblRkf;gTG/5++;4/&SeK-d,->3I7BPV05JIl<(E@c6'ijeR-m?QW579CMZ_>d%j*)qFcPfbm6@=7q1)@aL.dl+3ns4AN1#&n\Ikr1REip\Dp1W<Nn*'S)?N&Z1jY%+FuGLkUjOY1Q(4Ib)::Q*JH]kfO@J#rATmf+o>TrIpUf@aX5S7gejJC]Df%&)\u;W[K*+JeJn*3DG!AtX$#fY09_$^fElQOjD<]WEZIbHfgf%p8?i0ohB@,HM$LQ-5<Q!,T:-bJX7ra/9WO\3ni*g_D!0L__7_3j,G]/o?U%eXPSoYfAIpL4OS@\ATn^b@Q=qIVIDVYt0TI>XpIPk)8^QM;%cd9;:*WR;Gt)/U2eBZNFQEET>7=cCUc]*n?)oZAOrkQH.o+9N'#1B^NGeR$r]X$UYmL<=skV0aoRuJSqH;@e2IZ-!jW9l>]X:IAF)V):Of]D%]lB]Na0&-g;ucL[DZ1a'(Ka_4aQ>CPbgCNl/\kY?XW!#Y[*J*"klC>2o.o<u9,5EQGu;inFK3)u;Hl!YHcA[7"P[M!OT[@c2n2LHb$iLq$%+#t2f_?oU?mWXroK;h;,<,sKE)qA<Ribi:`k",JAV+.>K[LaYgF&mqXl%6(E"ifHMa`=N(gi).uk;b*1j$ke7_g49OIR\O&)6;g=DY5q9MUSK></d)QF1a8b]AIW3H.I_*qUVL6lLhc<n*p=CXKAHmKC\"kA4m"mI1)`(Ulf>d#Y-Ql2YVa'sjUbA!=[HjbbbN3LUUqg6kd*D`db89Gq;Q'a):b/I:?)ITTT!@W>]tlH,JldU?\Rh:k0<-uKEQ$k$gr999t".=T-c]E-m@cQUJ)_WM4(S(7Y[1I?h%=e_9QQV$[$SG,Z!b-)SWSm;HKKn-1b$b8Seg>$*6Smk+>>qp<$bFc(JIB/cAO:.?&,?FQN,@;$q!Lm.7pA$(ZgjAT97lP5#57Pm-B:`0#c4bg)G$;DHT<WobcRi)=n&a?pQX]l;U75T207JSM@)!?I1]i4+"lHZt(eUMsnV\40u)6%9T8;a:khCQT[KJ14dJrfR,pUrNsDM5f,"j*deI67(4@B7SDC1hl3j;BLe*DH$ZfBUi\dF\Bp"9^0OCFb:[&E2HH)&\;jVF)ihaESEHP@H,ADR+nKrScrg;odggh84N.MA9RS1W?HIjPcJ;Z5nlaUE9M:@/TR^,#jG<dUQIo&UUt=QX+?@9l'jhUVV<VR.>MtJN3SM0GC*SVp<'Ug+krr[Dno;^%g(X1\o1+KLU;B@='GnKot#Wr,g@q*EIo@4e,7?+F<73ML;l@s;!h6o(daQjTc^&)T_98p<]6X+A$sS&IG(?s3.e#D=0+_%k\.YZ.RipfFD&F_?U!uKTN$e**8]Is/EtZ(m>t;)'_o.:j9_\]a/8<``8L)1QqSN=]Y+"rH[#-k2SHd&0Yb/If-?W$0M=FFqEck+.L:4/>)QY"R9dP?qTuQlV-IIeU$"MgSLpO!O,!#;X();W0Sce(bDB`%@_^Nek<4aP!ddiV%?,rWFP/7>?5nV'80'5=J`0D4@7D5t<MauR?"nM`Z')UpS5J9jYpu&cfTjF0C[-_VNYiq"hVQ#\\=?p^?HrN)bL]"D9OgdH0"C8#95"1Gp!)5e+"o8Dm$suJG^kTMKuSM:F_\[,f-3/[O4Q>(!o'#k6=MN'FH]A8RQ+XOr*d[KZ4/u/(t-?sHqkDrA6XOTkeUV?ENtUkd"d7rYU#6FDeD#$Y-'ttiGN+o+c=g(*Wq^RL-j:&I'GlF.H/3oi6k_K>jTAu3GKI/0-GQ%*BTO0(j/e7W*V_-\h$_DfOmagJ/%bfQ0/EZDfF:hor72t&\aJjME"s!L=Ah&PuBVOBOu9AL8;Hm%Ee(k-h!dNHUF5JUp\CWVN-N4591#]i&ul'WhPNcrh0gT5W<[jX.C=;P4]n_E@pP/G2piE_tgEpJu7hClq05V`G\;=FT`c`4c\E]L+Z,`NT2sn^i-/68AZ;CG't<U)d:'Ng&HZ\OBV,=Xd\+nb%Q)g;VoH`orP-jrbC#;U^k.:N:]at"MZd1<8L]/jmbT/F+/:M.Qqc0]X9H+2.h`DRnY'ge]r;Q@Dp"/(8MW,63^haZ3@3PD.tm`CQ0D*2%cM=*@5Eh>)PlQ$6mf`\o2kBktEl_5f8i5'R\,`3Fo.AGO&885PNiC=,,DeGK@4P#CP4\X,C2_#FH+KWgJl$)geI?i$/RY+3;8flOV('O4i"202AD?M\M)i`+nI#o*Jh&ZsRWMMgX'*1X?k1qo]G1qNO[\h8sRW(X3I.#0sUNiV*]$D#WF4<QO5s~>
+endstream
+endobj
+802 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 801 0 R
+/Annots 803 0 R
+>>
+endobj
+803 0 obj
+[
+]
+endobj
+804 0 obj
+<< /Length 3953 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!#`>AkIi&q801csmGO>Mco;hH\)eEgk"&,Nh0'I?<Pb,/gpCQ(0]2^;IWt3?iZ=XpjBa5jBcY2]k&t\WA'9^3K2&CH3n#10]-P6"Z`rcl%E7kc>orRAMMc,bHY0Aq0cb]XqD:f:0hBrNEOfPNLbPfp*)ka8L=llTb6[hLFeip9C]B0P>jKH/)I?CZar'\UUX%?Y=l7(B8ekA<KV!>,^,UqE-jd?s7*0$d=:'_mEpjKP0@+$/_(nn0@jLAWU*#8>I_[7QZ`pX.luBR%S],cA,GsEh9OK=k0#7DSN0"9MtuQQj=e`K$ldA-h7/mVY[lQr&h_HGFPLF<MgGTJM=u8,TA#1GU?04]\>':0U3!4;TqFgG1pl<[I83PAloG'.B8gSQ\Pm&j4k*hW>WoKQ8?nu^081_I/fo'qG?UpD!nsubsYTSo?KI&oB3F5I9GFaK=ZYHY>lp,!b698d0e-p47Zqo5;0=Z_=ns#>3,+m+?fnriipkK<^gRh\m^f(l3t>N\+P3eGnmW)0K+UsVF5%g1o?j9Xt0/_Qn3c&-egfQ=4Lne<r7$M$Yj%*9]Q6WHEF61$RWkh>4_4+>mY+-iQ)B15tteqC=&MD%>WmfVWVkMcMtDe=j5d;T3o8n42:876HMoE@U<E3/T.^EJpYdGVBqhV#L,q7RAlAcnnr_W:.QQg\6.%\Hni:kE-V"H2#f,-cP+NS6WUu0/700F1qDs9qBVLg=0Kmb(D@u.L$b+lJDc&BRI%WK:JE#F'.*ni;g"hl:/2uZ;8!',9Hqm>i?V;8Wcs@c2(:mdL6FBTWtQNGkt)cPE6'<EOtr^f6m:C1\-aKm6L%5ZZ5m28GNGj[m5@s@ouoBPJ`lnM73b7b9_VGFi[N`*Y-Yb[qWdG-J!OpU11,GY='mm^qt[DMqmKoY-.Cf$&?mML^:<H@)H&C6PsbfhN(u'c(LfWQ)0[F@9T]ZoTH1!gB&,;iLj.\4>-F*h!F@,m#Zh`q9LtaP`8kXIR6R(kQHDMTE1Cs--tNMd%Z*5f3';'HQMWGZ#b$\[_24ORi-Co6LHqnt,R32/\]/kNO("]&W&cI6[r't^?QI1O3.#%U15'$MM]i.*PQO;`EGcC:E4'i.K-[C_e&#\QHb_>57(WUE$bW^*\?-BhmrAl>g3j$fFdgSEg3FmL31Jkep>_]knDHk@niA!aE&?k4YT/#YR_\c>rX!%SP33t'5[unlfE/&[G>aUuen3r@V8C&h-:Q]mBU>dh`H#.[9r[oH&=8Xu^X3uGQ,M(>M>PDP'9-690Xuhm^>"k"'ULb*PU*Y8JPYR8W.MTc]c2;p5nZ@+dUb;13)\[B4Z-Z#32K>oYjnHJ4=^aYW`P[FL[m/k\B.^(^ee"N#_tMUL$;S@RJs(PhlV+WqrNmZj[2q[!%+D5<'da.7!+!Tp$/NV?l.s(e(<0O+P`n`P(=F64so1!Z7(u1!LYd@(cX"3B4+[e8scUUol^T1.+L;H1_/L/.(+j4#NU5QP;G41OdsV[3[Q%=+_!G#!XIgYWO*8\3<kC6V1CH5akOPf9\tDr3?C(ha@R6+lqC#lmcO0k<GK-fJtlMWg$C(4nIT#ONq#)i@6b-Bcb$+0W?+@A+V5V\`Z7DP7-o`J+^\!R!6,b.$t\dJF?Z:\Ac^fu*N:b"3JB[X?M\E2ksO+d(ba#9BhiVTfKF)\Rq`I/n:(><S8XmTR8ds0PguTDJrbdg<"g5nH:#kt?ugL"[<"gIED.Ls=+2JrBmrU5R8$#'E9!<VK#>OU@o_s>lJ(:b.]%#MBMg.A$A(W5GNWI9Za]8@4*(k#BID#/"&UU8a4-9:'-&qnSD_F`ld&AW1:?W7-Agke7biQ,'YF!teX*GX+mF/B$]6)p?Cbiu:.k1j/6-GkF@pO(l'@p0jI/_:80ngRS1c*$#EjpFPNJB#3(7d`>6)&Io&ej,S,NQT`a9l;*oeJcMZ%dl:/<FOQruW7#WTbU1Q`^NB3eeM?G1gbr`,VlK6*V)2+jFlefe^([m_E5n+19=)g+=>A7'1sHgiH.56TmB"f-d(1(<Jc&JI9N7g9?@+]p(PB8nLhDNaQCY:<IO-fJQi;44Vg6#beC%'L0+#]`%CCiq-"G"m>$(V6QKXc`N9SgV!hSbhV&WNKU!&JMA1R_u5B)bTu]?_&dohaF#I-$Z;YhrJTQ5Oh3(r2K]\[b>=K[agHJjbKtP=i>/4jh8!K7^lsHNpSS6iuWQ9Nc!8Xl*:l6oD>LJ7SK3A`EA,3l$o`QW-HoBGs2'Ph\ZT5B"G^d]"B)iO-nkN:!Q!<7V.-ST\X\$>q$p<S!Q8i1nN%WY\riWUGO2RYF/'mKJ?&Aa&%r4nm'\(Ai>0H:npCie*"<F+clL@>"3\=:O?fh>up(bp<_S2X_P[C?-FEb'tB]JC"PR2o`aSEgZ@JOiDLeP"\:Qg`X%_2P3Rc*C<UBE8b_>l]"1YO0b^4a])09teq!n+ARkJke8.#ni%r.H0qlTCh%.MPi.di5>qoX.2NR"SG$C6hf&cWO%Sa3d!+hf+D`K5rHOmaHg/hjKM40>YNo=*ueuh#16E8n1\/et8+'YY<W24C#?#AlM6W8'='/bbZ6=Hrl%neFEX57@=%0B,\c*KcgYsPo6Xa$^h7s*HB7;Y5?@S"[qeVNc=Fricop$6Zg%eUEC5I>kC"fe@8-MR1/E_Y>O_&@urrld?Le'+&:Dk`JKY6$f;k`=raMgjk.><8g_,kF4t%'Ho:%4VdTM\loo6<dadTL%kXW!R,K_>%2&3M\,#G[Q1+M$H5O_9Ki;h)f/R0]ml2$SBSWah<Nsa3bqGD42;+DIm#GDSB9,,aI%:j"%H+`ifg0a/r$L.mo&V8UjZ:BOs*GW%m!.j,MHX7K"0,\0E62$$TNL?Q1d[0-]ZUjq&QZo&dLb;S7,N!kai:b)]>V$2hW,4T'V7%hP7,iQnpTMYj,:SM$_u994?*T72Lb=BZPK$($o!?[F=UN3@;hQ1WpgjrR/'j."&d.""TKQ57E*VX_cJ%mKlTe733$HrCA3pqH]nb[YAGo@s%2e!fa8<B%`Zj20GVqsk"sqlmp-ALb-a%W=#/,3cbVk(e2Bk$QncKFR'NH'Y?S?ocI=p^j,s(.H/hJRLMMA/Y'+;1X<'U&+46$LWq5MBVh@QJY1Fjc5:U+k1)bpL0"Si,<(\_b*C0m+d!K@SBYUU-FaE,>_%^@m&!0/]N#\-%d3K)q8dZH1$]OYa<q`&AC)8'BY;`la*oQH^<PqW1:['?tK&58:*)K8K$)X;Osmlj'HQC4N^ipq-qK#MklN7AUtuqOHZ_t(,K;mYnMJL[f/1i7keG04W50.fOK/EBPeF[7/SsJa8"L&fI$<KphaL/`ueBAq6H$W(f'uf\fo&F0Vc$$)AugR@f30.P*rNOTTuKJ->15TYKS%*^G:K2[CKm0k,Uh(j_Qi%k5h[aTYEo)(Mn6GWK#_(O-,2Ndj2$,0;Et%4a`s;g(.J=A2pu4qO#Xr3-M1f8ES0URijdZ1ToG%]USZOY;A5tC!KrgMLo8I*kDfah6m(LLZkU/Ga_"kq='"SKnNHLj!Hq6+bVRARV(h-Bu8==!q6StoiO0"p3M+1H2^=`o/hZs,k'kYht&p]AR9$,L_ilKN/F7ur/OUoUiViaDVS$9IRd*0N#OW1.#AFK*rSM@Z-VV;GVTCP6;K9E'?IT7&<f]Sq'N^?W'MVe&g;D[@jX%+k71pX@0;+776LV/Yu-3.dH`j]m"*OnGP3<D>FN+%4!#5Y]r)iBg@r"dB&dp_]?b+Op,8jNBjEBa4YXI4c^ps!b(12W2!\LPTp:JjqN-C'bMu8_U,f-182)kS\B^5d2VO/%ph*qtm[>0[521"W?c5gu^,l.)E$ttk+_t"`=l+u9mj##C'8*ScG)\THpZ9<1bC33#j]9S%bb,?"XVl*UY[9TN/ZUskcD"LF^7$d6BpIdl-%B2PmGH>jJ.^9qr7s-==M4DF4q#c@~>
+endstream
+endobj
+805 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 804 0 R
+/Annots 806 0 R
+>>
+endobj
+806 0 obj
+[
+]
+endobj
+807 0 obj
+<< /Length 1195 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GauHK95iNL&AI`dHq^B@g%XNod%Ig>P:/`=+j+3q%RDhZZ5p@OpDma[Zc7n4OX^j.AS/YpG+QF8%*lj:0F.oIf)ZBD!to#:OMG6`;hQ>>=>3k^:FC<D>@`Y:AYUopOG`u9P;HOu<OS9lp!N4sp/_4)Y\=q+<agD3%W1p%^qk(Gq(]t,0G9`i)$J&DW:27&829($OK)2o1;s[\:GKPg04Ar^9dUH`eA^TWRaNlX5"5&d9N'4TNoF')`).5oi"<]#\YTb:$`P#<-"KfT#Vh-Uip&#Roh$sW9!P!H8`+=e6(`A<0S'p>Y!/ai(s*=B`GX]mS&VMg#1H<m/eF;NKaR$[XP,-hd2\?k,`+'/*\)lDA4g9)EactMVL0Un"KIL;-=Ye1$0"Fd`nIT0J>=/&0BBT2R`3D+qVWu"j,[a)SH(.C53A=.P99p808XJVm)FZOi**^Xr-2<dil16N,?KE;>\dY>@3C1@R):DLm9RV$/FQ;s[HEQuU38>0Q]W&><K&R!m_@Xa%nAS1PIm<bRaEn7hW!33KT&==:tIfaq['Cj;^_o\WH$eCg^\$-OFZ+'f-\PPef^bR@NY5nm6XI!$$FKJfn)sACcdfXSbA%/U8c].*Q<>+ZI:u`CmUF%Ig[E]gj=B>Gf\uD32Wk/<p,8^]95<0%t`9[g>a0[IT;:(T91XsRoQTf^ldsHmdZ0l\hS]WX.:-UGOnZO2BS8VCP`aQM6%Zn;1'JGj?<HQVamhO!d6Cm>Rl+,$'t6H3+A@soViX])d,,tUUD&\67^E/:;Cu)RM.cnlmsQgMtokPZ_QY3A2!9X`5NDF9.TK#I;&;Fk?9+*WGC-Jcaf9_C[A"hj/4u8nFiTeMl($Gl-:GdAWpIkXnLL.E,eP*p)326."<IW0X<?/GXS>Q79h:nU1n\CZ&Nh)OOgF.GjO)&3RJ*OYn;`YZ**&<\I)S0E8)<$(E:S6dJt<==J(D="s/Z5!5)en>>o!#,J$T`D\qf[76jm(k#uAFG#ef)b4]f=*u+kq6sP(=<,r0GHZDYK"8hI4L[N0W)P"XE0)Qn-K7=;qcSE\7`4>f0Kr_Roe)a^JDp>9Njm2_0DMKnMS'ZKKSSell$Hl(PCKM7Fi+`"a3Jt]8o!HsSZhi?E.(@K1ef`mqT@qc=-F59bPJg5REuC[E(P9l[XdsCd1;Rp.l_inTOitl)+.<Z]ci~>
+endstream
+endobj
+808 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 807 0 R
+/Annots 809 0 R
+>>
+endobj
+809 0 obj
+[
+]
+endobj
+812 0 obj
+<<
+ /Title (\376\377\0\123\0\164\0\141\0\164\0\165\0\163\0\40\0\157\0\146\0\40\0\164\0\150\0\151\0\163\0\40\0\115\0\145\0\155\0\157)
+ /Parent 810 0 R
+ /Next 814 0 R
+ /A 811 0 R
+>> endobj
+814 0 obj
+<<
+ /Title (\376\377\0\103\0\157\0\160\0\171\0\162\0\151\0\147\0\150\0\164\0\40\0\116\0\157\0\164\0\151\0\143\0\145)
+ /Parent 810 0 R
+ /Prev 812 0 R
+ /Next 816 0 R
+ /A 813 0 R
+>> endobj
+816 0 obj
+<<
+ /Title (\376\377\0\101\0\142\0\163\0\164\0\162\0\141\0\143\0\164)
+ /Parent 810 0 R
+ /Prev 814 0 R
+ /Next 818 0 R
+ /A 815 0 R
+>> endobj
+818 0 obj
+<<
+ /Title (\376\377\0\124\0\141\0\142\0\154\0\145\0\40\0\157\0\146\0\40\0\103\0\157\0\156\0\164\0\145\0\156\0\164\0\163)
+ /Parent 810 0 R
+ /Prev 816 0 R
+ /Next 819 0 R
+ /A 817 0 R
+>> endobj
+819 0 obj
+<<
+ /Title (\376\377\0\61\0\40\0\111\0\156\0\164\0\162\0\157\0\144\0\165\0\143\0\164\0\151\0\157\0\156)
+ /Parent 810 0 R
+ /First 820 0 R
+ /Last 837 0 R
+ /Prev 818 0 R
+ /Next 838 0 R
+ /Count -14
+ /A 11 0 R
+>> endobj
+820 0 obj
+<<
+ /Title (\376\377\0\61\0\56\0\61\0\40\0\122\0\145\0\154\0\141\0\164\0\151\0\157\0\156\0\163\0\150\0\151\0\160\0\40\0\164\0\157\0\40\0\127\0\145\0\142\0\104\0\101\0\126)
+ /Parent 819 0 R
+ /Next 821 0 R
+ /A 13 0 R
+>> endobj
+821 0 obj
+<<
+ /Title (\376\377\0\61\0\56\0\62\0\40\0\116\0\157\0\164\0\141\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\103\0\157\0\156\0\166\0\145\0\156\0\164\0\151\0\157\0\156\0\163)
+ /Parent 819 0 R
+ /Prev 820 0 R
+ /Next 822 0 R
+ /A 15 0 R
+>> endobj
+822 0 obj
+<<
+ /Title (\376\377\0\61\0\56\0\63\0\40\0\124\0\145\0\162\0\155\0\163)
+ /Parent 819 0 R
+ /Prev 821 0 R
+ /Next 823 0 R
+ /A 17 0 R
+>> endobj
+823 0 obj
+<<
+ /Title (\376\377\0\61\0\56\0\64\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\171\0\40\0\126\0\141\0\154\0\165\0\145\0\163)
+ /Parent 819 0 R
+ /First 824 0 R
+ /Last 830 0 R
+ /Prev 822 0 R
+ /Next 831 0 R
+ /Count -5
+ /A 19 0 R
+>> endobj
+824 0 obj
+<<
+ /Title (\376\377\0\61\0\56\0\64\0\56\0\61\0\40\0\111\0\156\0\151\0\164\0\151\0\141\0\154\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\171\0\40\0\126\0\141\0\154\0\165\0\145)
+ /Parent 823 0 R
+ /Next 826 0 R
+ /A 21 0 R
+>> endobj
+826 0 obj
+<<
+ /Title (\376\377\0\61\0\56\0\64\0\56\0\62\0\40\0\120\0\162\0\157\0\164\0\145\0\143\0\164\0\145\0\144\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\171\0\40\0\126\0\141\0\154\0\165\0\145)
+ /Parent 823 0 R
+ /Prev 824 0 R
+ /Next 828 0 R
+ /A 825 0 R
+>> endobj
+828 0 obj
+<<
+ /Title (\376\377\0\61\0\56\0\64\0\56\0\63\0\40\0\103\0\157\0\155\0\160\0\165\0\164\0\145\0\144\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\171\0\40\0\126\0\141\0\154\0\165\0\145)
+ /Parent 823 0 R
+ /Prev 826 0 R
+ /Next 829 0 R
+ /A 827 0 R
+>> endobj
+829 0 obj
+<<
+ /Title (\376\377\0\61\0\56\0\64\0\56\0\64\0\40\0\102\0\157\0\157\0\154\0\145\0\141\0\156\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\171\0\40\0\126\0\141\0\154\0\165\0\145)
+ /Parent 823 0 R
+ /Prev 828 0 R
+ /Next 830 0 R
+ /A 27 0 R
+>> endobj
+830 0 obj
+<<
+ /Title (\376\377\0\61\0\56\0\64\0\56\0\65\0\40\0\104\0\101\0\126\0\72\0\150\0\162\0\145\0\146\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\171\0\40\0\126\0\141\0\154\0\165\0\145)
+ /Parent 823 0 R
+ /Prev 829 0 R
+ /A 29 0 R
+>> endobj
+831 0 obj
+<<
+ /Title (\376\377\0\61\0\56\0\65\0\40\0\104\0\101\0\126\0\40\0\116\0\141\0\155\0\145\0\163\0\160\0\141\0\143\0\145\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164\0\163\0\40\0\151\0\156\0\40\0\122\0\145\0\161\0\165\0\145\0\163\0\164\0\40\0\141\0\156\0\144\0\40\0\122\0\145\0\163\0\160\0\157\0\156\0\163\0\145\0\40\0\102\0\157\0\144\0\151\0\145\0\163)
+ /Parent 819 0 R
+ /Prev 823 0 R
+ /Next 833 0 R
+ /A 31 0 R
+>> endobj
+833 0 obj
+<<
+ /Title (\376\377\0\61\0\56\0\66\0\40\0\115\0\145\0\164\0\150\0\157\0\144\0\40\0\120\0\162\0\145\0\143\0\157\0\156\0\144\0\151\0\164\0\151\0\157\0\156\0\163\0\40\0\141\0\156\0\144\0\40\0\120\0\157\0\163\0\164\0\143\0\157\0\156\0\144\0\151\0\164\0\151\0\157\0\156\0\163)
+ /Parent 819 0 R
+ /First 834 0 R
+ /Last 834 0 R
+ /Prev 831 0 R
+ /Next 836 0 R
+ /Count -1
+ /A 832 0 R
+>> endobj
+834 0 obj
+<<
+ /Title (\376\377\0\61\0\56\0\66\0\56\0\61\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\103\0\110\0\105\0\103\0\113\0\117\0\125\0\124\0\40\0\162\0\145\0\161\0\165\0\145\0\163\0\164\0\40\0\167\0\151\0\164\0\150\0\40\0\104\0\101\0\126\0\72\0\155\0\165\0\163\0\164\0\55\0\142\0\145\0\55\0\143\0\150\0\145\0\143\0\153\0\145\0\144\0\55\0\151\0\156\0\40\0\162\0\145\0\163\0\160\0\157\0\156\0\163\0\145)
+ /Parent 833 0 R
+ /A 35 0 R
+>> endobj
+836 0 obj
+<<
+ /Title (\376\377\0\61\0\56\0\67\0\40\0\103\0\154\0\141\0\162\0\151\0\146\0\151\0\143\0\141\0\164\0\151\0\157\0\156\0\40\0\157\0\146\0\40\0\103\0\117\0\120\0\131\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163\0\40\0\167\0\151\0\164\0\150\0\40\0\117\0\166\0\145\0\162\0\167\0\162\0\151\0\164\0\145\0\72\0\124)
+ /Parent 819 0 R
+ /Prev 833 0 R
+ /Next 837 0 R
+ /A 835 0 R
+>> endobj
+837 0 obj
+<<
+ /Title (\376\377\0\61\0\56\0\70\0\40\0\126\0\145\0\162\0\163\0\151\0\157\0\156\0\151\0\156\0\147\0\40\0\115\0\145\0\164\0\150\0\157\0\144\0\163\0\40\0\141\0\156\0\144\0\40\0\127\0\162\0\151\0\164\0\145\0\40\0\114\0\157\0\143\0\153\0\163)
+ /Parent 819 0 R
+ /Prev 836 0 R
+ /A 39 0 R
+>> endobj
+838 0 obj
+<<
+ /Title (\376\377\0\62\0\40\0\102\0\141\0\163\0\151\0\143\0\40\0\126\0\145\0\162\0\163\0\151\0\157\0\156\0\151\0\156\0\147\0\40\0\106\0\145\0\141\0\164\0\165\0\162\0\145\0\163)
+ /Parent 810 0 R
+ /First 839 0 R
+ /Last 841 0 R
+ /Prev 819 0 R
+ /Next 846 0 R
+ /Count -5
+ /A 41 0 R
+>> endobj
+839 0 obj
+<<
+ /Title (\376\377\0\62\0\56\0\61\0\40\0\102\0\141\0\163\0\151\0\143\0\40\0\126\0\145\0\162\0\163\0\151\0\157\0\156\0\151\0\156\0\147\0\40\0\120\0\141\0\143\0\153\0\141\0\147\0\145\0\163)
+ /Parent 838 0 R
+ /Next 841 0 R
+ /A 43 0 R
+>> endobj
+841 0 obj
+<<
+ /Title (\376\377\0\62\0\56\0\62\0\40\0\102\0\141\0\163\0\151\0\143\0\40\0\126\0\145\0\162\0\163\0\151\0\157\0\156\0\151\0\156\0\147\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 838 0 R
+ /First 843 0 R
+ /Last 845 0 R
+ /Prev 839 0 R
+ /Count -3
+ /A 840 0 R
+>> endobj
+843 0 obj
+<<
+ /Title (\376\377\0\62\0\56\0\62\0\56\0\61\0\40\0\103\0\162\0\145\0\141\0\164\0\151\0\156\0\147\0\40\0\141\0\40\0\126\0\145\0\162\0\163\0\151\0\157\0\156\0\55\0\103\0\157\0\156\0\164\0\162\0\157\0\154\0\154\0\145\0\144\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145)
+ /Parent 841 0 R
+ /Next 844 0 R
+ /A 842 0 R
+>> endobj
+844 0 obj
+<<
+ /Title (\376\377\0\62\0\56\0\62\0\56\0\62\0\40\0\115\0\157\0\144\0\151\0\146\0\171\0\151\0\156\0\147\0\40\0\141\0\40\0\126\0\145\0\162\0\163\0\151\0\157\0\156\0\55\0\103\0\157\0\156\0\164\0\162\0\157\0\154\0\154\0\145\0\144\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145)
+ /Parent 841 0 R
+ /Prev 843 0 R
+ /Next 845 0 R
+ /A 49 0 R
+>> endobj
+845 0 obj
+<<
+ /Title (\376\377\0\62\0\56\0\62\0\56\0\63\0\40\0\122\0\145\0\160\0\157\0\162\0\164\0\151\0\156\0\147)
+ /Parent 841 0 R
+ /Prev 844 0 R
+ /A 51 0 R
+>> endobj
+846 0 obj
+<<
+ /Title (\376\377\0\63\0\40\0\126\0\145\0\162\0\163\0\151\0\157\0\156\0\55\0\103\0\157\0\156\0\164\0\162\0\157\0\154\0\40\0\106\0\145\0\141\0\164\0\165\0\162\0\145)
+ /Parent 810 0 R
+ /First 847 0 R
+ /Last 896 0 R
+ /Prev 838 0 R
+ /Next 898 0 R
+ /Count -32
+ /A 53 0 R
+>> endobj
+847 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\61\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163)
+ /Parent 846 0 R
+ /First 849 0 R
+ /Last 857 0 R
+ /Next 858 0 R
+ /Count -5
+ /A 55 0 R
+>> endobj
+849 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\61\0\56\0\61\0\40\0\104\0\101\0\126\0\72\0\143\0\157\0\155\0\155\0\145\0\156\0\164)
+ /Parent 847 0 R
+ /Next 851 0 R
+ /A 848 0 R
+>> endobj
+851 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\61\0\56\0\62\0\40\0\104\0\101\0\126\0\72\0\143\0\162\0\145\0\141\0\164\0\157\0\162\0\55\0\144\0\151\0\163\0\160\0\154\0\141\0\171\0\156\0\141\0\155\0\145)
+ /Parent 847 0 R
+ /Prev 849 0 R
+ /Next 853 0 R
+ /A 850 0 R
+>> endobj
+853 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\61\0\56\0\63\0\40\0\104\0\101\0\126\0\72\0\163\0\165\0\160\0\160\0\157\0\162\0\164\0\145\0\144\0\55\0\155\0\145\0\164\0\150\0\157\0\144\0\55\0\163\0\145\0\164\0\40\0\50\0\160\0\162\0\157\0\164\0\145\0\143\0\164\0\145\0\144\0\51)
+ /Parent 847 0 R
+ /Prev 851 0 R
+ /Next 855 0 R
+ /A 852 0 R
+>> endobj
+855 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\61\0\56\0\64\0\40\0\104\0\101\0\126\0\72\0\163\0\165\0\160\0\160\0\157\0\162\0\164\0\145\0\144\0\55\0\154\0\151\0\166\0\145\0\55\0\160\0\162\0\157\0\160\0\145\0\162\0\164\0\171\0\55\0\163\0\145\0\164\0\40\0\50\0\160\0\162\0\157\0\164\0\145\0\143\0\164\0\145\0\144\0\51)
+ /Parent 847 0 R
+ /Prev 853 0 R
+ /Next 857 0 R
+ /A 854 0 R
+>> endobj
+857 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\61\0\56\0\65\0\40\0\104\0\101\0\126\0\72\0\163\0\165\0\160\0\160\0\157\0\162\0\164\0\145\0\144\0\55\0\162\0\145\0\160\0\157\0\162\0\164\0\55\0\163\0\145\0\164\0\40\0\50\0\160\0\162\0\157\0\164\0\145\0\143\0\164\0\145\0\144\0\51)
+ /Parent 847 0 R
+ /Prev 855 0 R
+ /A 856 0 R
+>> endobj
+858 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\62\0\40\0\126\0\145\0\162\0\163\0\151\0\157\0\156\0\55\0\103\0\157\0\156\0\164\0\162\0\157\0\154\0\154\0\145\0\144\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163)
+ /Parent 846 0 R
+ /First 860 0 R
+ /Last 862 0 R
+ /Prev 847 0 R
+ /Next 863 0 R
+ /Count -2
+ /A 67 0 R
+>> endobj
+860 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\62\0\56\0\61\0\40\0\104\0\101\0\126\0\72\0\143\0\150\0\145\0\143\0\153\0\145\0\144\0\55\0\151\0\156\0\40\0\50\0\160\0\162\0\157\0\164\0\145\0\143\0\164\0\145\0\144\0\51)
+ /Parent 858 0 R
+ /Next 862 0 R
+ /A 859 0 R
+>> endobj
+862 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\62\0\56\0\62\0\40\0\104\0\101\0\126\0\72\0\141\0\165\0\164\0\157\0\55\0\166\0\145\0\162\0\163\0\151\0\157\0\156)
+ /Parent 858 0 R
+ /Prev 860 0 R
+ /A 861 0 R
+>> endobj
+863 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\63\0\40\0\103\0\150\0\145\0\143\0\153\0\145\0\144\0\55\0\117\0\165\0\164\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163)
+ /Parent 846 0 R
+ /First 865 0 R
+ /Last 867 0 R
+ /Prev 858 0 R
+ /Next 868 0 R
+ /Count -2
+ /A 73 0 R
+>> endobj
+865 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\63\0\56\0\61\0\40\0\104\0\101\0\126\0\72\0\143\0\150\0\145\0\143\0\153\0\145\0\144\0\55\0\157\0\165\0\164\0\40\0\50\0\160\0\162\0\157\0\164\0\145\0\143\0\164\0\145\0\144\0\51)
+ /Parent 863 0 R
+ /Next 867 0 R
+ /A 864 0 R
+>> endobj
+867 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\63\0\56\0\62\0\40\0\104\0\101\0\126\0\72\0\160\0\162\0\145\0\144\0\145\0\143\0\145\0\163\0\163\0\157\0\162\0\55\0\163\0\145\0\164)
+ /Parent 863 0 R
+ /Prev 865 0 R
+ /A 866 0 R
+>> endobj
+868 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\64\0\40\0\126\0\145\0\162\0\163\0\151\0\157\0\156\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163)
+ /Parent 846 0 R
+ /First 869 0 R
+ /Last 875 0 R
+ /Prev 863 0 R
+ /Next 877 0 R
+ /Count -4
+ /A 79 0 R
+>> endobj
+869 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\64\0\56\0\61\0\40\0\104\0\101\0\126\0\72\0\160\0\162\0\145\0\144\0\145\0\143\0\145\0\163\0\163\0\157\0\162\0\55\0\163\0\145\0\164\0\40\0\50\0\160\0\162\0\157\0\164\0\145\0\143\0\164\0\145\0\144\0\51)
+ /Parent 868 0 R
+ /Next 871 0 R
+ /A 81 0 R
+>> endobj
+871 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\64\0\56\0\62\0\40\0\104\0\101\0\126\0\72\0\163\0\165\0\143\0\143\0\145\0\163\0\163\0\157\0\162\0\55\0\163\0\145\0\164\0\40\0\50\0\143\0\157\0\155\0\160\0\165\0\164\0\145\0\144\0\51)
+ /Parent 868 0 R
+ /Prev 869 0 R
+ /Next 873 0 R
+ /A 870 0 R
+>> endobj
+873 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\64\0\56\0\63\0\40\0\104\0\101\0\126\0\72\0\143\0\150\0\145\0\143\0\153\0\157\0\165\0\164\0\55\0\163\0\145\0\164\0\40\0\50\0\143\0\157\0\155\0\160\0\165\0\164\0\145\0\144\0\51)
+ /Parent 868 0 R
+ /Prev 871 0 R
+ /Next 875 0 R
+ /A 872 0 R
+>> endobj
+875 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\64\0\56\0\64\0\40\0\104\0\101\0\126\0\72\0\166\0\145\0\162\0\163\0\151\0\157\0\156\0\55\0\156\0\141\0\155\0\145\0\40\0\50\0\160\0\162\0\157\0\164\0\145\0\143\0\164\0\145\0\144\0\51)
+ /Parent 868 0 R
+ /Prev 873 0 R
+ /A 874 0 R
+>> endobj
+877 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\65\0\40\0\126\0\105\0\122\0\123\0\111\0\117\0\116\0\55\0\103\0\117\0\116\0\124\0\122\0\117\0\114\0\40\0\115\0\145\0\164\0\150\0\157\0\144)
+ /Parent 846 0 R
+ /First 878 0 R
+ /Last 878 0 R
+ /Prev 868 0 R
+ /Next 880 0 R
+ /Count -1
+ /A 876 0 R
+>> endobj
+878 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\65\0\56\0\61\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\126\0\105\0\122\0\123\0\111\0\117\0\116\0\55\0\103\0\117\0\116\0\124\0\122\0\117\0\114)
+ /Parent 877 0 R
+ /A 91 0 R
+>> endobj
+880 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\66\0\40\0\122\0\105\0\120\0\117\0\122\0\124\0\40\0\115\0\145\0\164\0\150\0\157\0\144)
+ /Parent 846 0 R
+ /Prev 877 0 R
+ /Next 882 0 R
+ /A 879 0 R
+>> endobj
+882 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\67\0\40\0\104\0\101\0\126\0\72\0\166\0\145\0\162\0\163\0\151\0\157\0\156\0\55\0\164\0\162\0\145\0\145\0\40\0\122\0\145\0\160\0\157\0\162\0\164)
+ /Parent 846 0 R
+ /First 883 0 R
+ /Last 883 0 R
+ /Prev 880 0 R
+ /Next 885 0 R
+ /Count -1
+ /A 881 0 R
+>> endobj
+883 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\67\0\56\0\61\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\104\0\101\0\126\0\72\0\166\0\145\0\162\0\163\0\151\0\157\0\156\0\55\0\164\0\162\0\145\0\145\0\40\0\122\0\145\0\160\0\157\0\162\0\164)
+ /Parent 882 0 R
+ /A 97 0 R
+>> endobj
+885 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\70\0\40\0\104\0\101\0\126\0\72\0\145\0\170\0\160\0\141\0\156\0\144\0\55\0\160\0\162\0\157\0\160\0\145\0\162\0\164\0\171\0\40\0\122\0\145\0\160\0\157\0\162\0\164)
+ /Parent 846 0 R
+ /First 886 0 R
+ /Last 886 0 R
+ /Prev 882 0 R
+ /Next 887 0 R
+ /Count -1
+ /A 884 0 R
+>> endobj
+886 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\70\0\56\0\61\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\104\0\101\0\126\0\72\0\145\0\170\0\160\0\141\0\156\0\144\0\55\0\160\0\162\0\157\0\160\0\145\0\162\0\164\0\171)
+ /Parent 885 0 R
+ /A 104 0 R
+>> endobj
+887 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\71\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\117\0\120\0\124\0\111\0\117\0\116\0\123\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 846 0 R
+ /Prev 885 0 R
+ /Next 889 0 R
+ /A 106 0 R
+>> endobj
+889 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\61\0\60\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\120\0\125\0\124\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 846 0 R
+ /Prev 887 0 R
+ /Next 890 0 R
+ /A 888 0 R
+>> endobj
+890 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\61\0\61\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\120\0\122\0\117\0\120\0\106\0\111\0\116\0\104\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 846 0 R
+ /Prev 889 0 R
+ /Next 891 0 R
+ /A 110 0 R
+>> endobj
+891 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\61\0\62\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\120\0\122\0\117\0\120\0\120\0\101\0\124\0\103\0\110\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 846 0 R
+ /Prev 890 0 R
+ /Next 893 0 R
+ /A 112 0 R
+>> endobj
+893 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\61\0\63\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\104\0\105\0\114\0\105\0\124\0\105\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 846 0 R
+ /Prev 891 0 R
+ /Next 894 0 R
+ /A 892 0 R
+>> endobj
+894 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\61\0\64\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\103\0\117\0\120\0\131\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 846 0 R
+ /Prev 893 0 R
+ /Next 895 0 R
+ /A 116 0 R
+>> endobj
+895 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\61\0\65\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\115\0\117\0\126\0\105\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 846 0 R
+ /Prev 894 0 R
+ /Next 896 0 R
+ /A 118 0 R
+>> endobj
+896 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\61\0\66\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\125\0\116\0\114\0\117\0\103\0\113\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 846 0 R
+ /Prev 895 0 R
+ /A 120 0 R
+>> endobj
+898 0 obj
+<<
+ /Title (\376\377\0\64\0\40\0\103\0\110\0\105\0\103\0\113\0\117\0\125\0\124\0\55\0\111\0\116\0\55\0\120\0\114\0\101\0\103\0\105\0\40\0\106\0\105\0\101\0\124\0\125\0\122\0\105)
+ /Parent 810 0 R
+ /First 899 0 R
+ /Last 916 0 R
+ /Prev 846 0 R
+ /Next 918 0 R
+ /Count -13
+ /A 897 0 R
+>> endobj
+899 0 obj
+<<
+ /Title (\376\377\0\64\0\56\0\61\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\126\0\145\0\162\0\163\0\151\0\157\0\156\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163)
+ /Parent 898 0 R
+ /First 901 0 R
+ /Last 903 0 R
+ /Next 904 0 R
+ /Count -2
+ /A 124 0 R
+>> endobj
+901 0 obj
+<<
+ /Title (\376\377\0\64\0\56\0\61\0\56\0\61\0\40\0\104\0\101\0\126\0\72\0\143\0\150\0\145\0\143\0\153\0\157\0\165\0\164\0\55\0\146\0\157\0\162\0\153)
+ /Parent 899 0 R
+ /Next 903 0 R
+ /A 900 0 R
+>> endobj
+903 0 obj
+<<
+ /Title (\376\377\0\64\0\56\0\61\0\56\0\62\0\40\0\104\0\101\0\126\0\72\0\143\0\150\0\145\0\143\0\153\0\151\0\156\0\55\0\146\0\157\0\162\0\153)
+ /Parent 899 0 R
+ /Prev 901 0 R
+ /A 902 0 R
+>> endobj
+904 0 obj
+<<
+ /Title (\376\377\0\64\0\56\0\62\0\40\0\103\0\150\0\145\0\143\0\153\0\145\0\144\0\55\0\117\0\165\0\164\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163)
+ /Parent 898 0 R
+ /First 905 0 R
+ /Last 906 0 R
+ /Prev 899 0 R
+ /Next 908 0 R
+ /Count -2
+ /A 130 0 R
+>> endobj
+905 0 obj
+<<
+ /Title (\376\377\0\64\0\56\0\62\0\56\0\61\0\40\0\104\0\101\0\126\0\72\0\143\0\150\0\145\0\143\0\153\0\157\0\165\0\164\0\55\0\146\0\157\0\162\0\153)
+ /Parent 904 0 R
+ /Next 906 0 R
+ /A 132 0 R
+>> endobj
+906 0 obj
+<<
+ /Title (\376\377\0\64\0\56\0\62\0\56\0\62\0\40\0\104\0\101\0\126\0\72\0\143\0\150\0\145\0\143\0\153\0\151\0\156\0\55\0\146\0\157\0\162\0\153)
+ /Parent 904 0 R
+ /Prev 905 0 R
+ /A 134 0 R
+>> endobj
+908 0 obj
+<<
+ /Title (\376\377\0\64\0\56\0\63\0\40\0\103\0\110\0\105\0\103\0\113\0\117\0\125\0\124\0\40\0\115\0\145\0\164\0\150\0\157\0\144\0\40\0\50\0\141\0\160\0\160\0\154\0\151\0\145\0\144\0\40\0\164\0\157\0\40\0\141\0\40\0\166\0\145\0\162\0\163\0\151\0\157\0\156\0\55\0\143\0\157\0\156\0\164\0\162\0\157\0\154\0\154\0\145\0\144\0\40\0\162\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\51)
+ /Parent 898 0 R
+ /First 909 0 R
+ /Last 909 0 R
+ /Prev 904 0 R
+ /Next 911 0 R
+ /Count -1
+ /A 907 0 R
+>> endobj
+909 0 obj
+<<
+ /Title (\376\377\0\64\0\56\0\63\0\56\0\61\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\103\0\110\0\105\0\103\0\113\0\117\0\125\0\124\0\40\0\157\0\146\0\40\0\141\0\40\0\166\0\145\0\162\0\163\0\151\0\157\0\156\0\55\0\143\0\157\0\156\0\164\0\162\0\157\0\154\0\154\0\145\0\144\0\40\0\162\0\145\0\163\0\157\0\165\0\162\0\143\0\145)
+ /Parent 908 0 R
+ /A 138 0 R
+>> endobj
+911 0 obj
+<<
+ /Title (\376\377\0\64\0\56\0\64\0\40\0\103\0\110\0\105\0\103\0\113\0\111\0\116\0\40\0\115\0\145\0\164\0\150\0\157\0\144\0\40\0\50\0\141\0\160\0\160\0\154\0\151\0\145\0\144\0\40\0\164\0\157\0\40\0\141\0\40\0\166\0\145\0\162\0\163\0\151\0\157\0\156\0\55\0\143\0\157\0\156\0\164\0\162\0\157\0\154\0\154\0\145\0\144\0\40\0\162\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\51)
+ /Parent 898 0 R
+ /First 912 0 R
+ /Last 912 0 R
+ /Prev 908 0 R
+ /Next 914 0 R
+ /Count -1
+ /A 910 0 R
+>> endobj
+912 0 obj
+<<
+ /Title (\376\377\0\64\0\56\0\64\0\56\0\61\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\103\0\110\0\105\0\103\0\113\0\111\0\116)
+ /Parent 911 0 R
+ /A 142 0 R
+>> endobj
+914 0 obj
+<<
+ /Title (\376\377\0\64\0\56\0\65\0\40\0\125\0\116\0\103\0\110\0\105\0\103\0\113\0\117\0\125\0\124\0\40\0\115\0\145\0\164\0\150\0\157\0\144)
+ /Parent 898 0 R
+ /First 915 0 R
+ /Last 915 0 R
+ /Prev 911 0 R
+ /Next 916 0 R
+ /Count -1
+ /A 913 0 R
+>> endobj
+915 0 obj
+<<
+ /Title (\376\377\0\64\0\56\0\65\0\56\0\61\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\125\0\116\0\103\0\110\0\105\0\103\0\113\0\117\0\125\0\124)
+ /Parent 914 0 R
+ /A 146 0 R
+>> endobj
+916 0 obj
+<<
+ /Title (\376\377\0\64\0\56\0\66\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\117\0\120\0\124\0\111\0\117\0\116\0\123\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 898 0 R
+ /Prev 914 0 R
+ /A 148 0 R
+>> endobj
+918 0 obj
+<<
+ /Title (\376\377\0\65\0\40\0\126\0\145\0\162\0\163\0\151\0\157\0\156\0\55\0\110\0\151\0\163\0\164\0\157\0\162\0\171\0\40\0\106\0\145\0\141\0\164\0\165\0\162\0\145)
+ /Parent 810 0 R
+ /First 919 0 R
+ /Last 937 0 R
+ /Prev 898 0 R
+ /Next 939 0 R
+ /Count -15
+ /A 917 0 R
+>> endobj
+919 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\61\0\40\0\126\0\145\0\162\0\163\0\151\0\157\0\156\0\40\0\110\0\151\0\163\0\164\0\157\0\162\0\171\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163)
+ /Parent 918 0 R
+ /First 921 0 R
+ /Last 923 0 R
+ /Next 924 0 R
+ /Count -2
+ /A 152 0 R
+>> endobj
+921 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\61\0\56\0\61\0\40\0\104\0\101\0\126\0\72\0\166\0\145\0\162\0\163\0\151\0\157\0\156\0\55\0\163\0\145\0\164\0\40\0\50\0\160\0\162\0\157\0\164\0\145\0\143\0\164\0\145\0\144\0\51)
+ /Parent 919 0 R
+ /Next 923 0 R
+ /A 920 0 R
+>> endobj
+923 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\61\0\56\0\62\0\40\0\104\0\101\0\126\0\72\0\162\0\157\0\157\0\164\0\55\0\166\0\145\0\162\0\163\0\151\0\157\0\156\0\40\0\50\0\143\0\157\0\155\0\160\0\165\0\164\0\145\0\144\0\51)
+ /Parent 919 0 R
+ /Prev 921 0 R
+ /A 922 0 R
+>> endobj
+924 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\62\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\126\0\145\0\162\0\163\0\151\0\157\0\156\0\55\0\103\0\157\0\156\0\164\0\162\0\157\0\154\0\154\0\145\0\144\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163)
+ /Parent 918 0 R
+ /First 926 0 R
+ /Last 926 0 R
+ /Prev 919 0 R
+ /Next 927 0 R
+ /Count -1
+ /A 158 0 R
+>> endobj
+926 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\62\0\56\0\61\0\40\0\104\0\101\0\126\0\72\0\166\0\145\0\162\0\163\0\151\0\157\0\156\0\55\0\150\0\151\0\163\0\164\0\157\0\162\0\171\0\40\0\50\0\143\0\157\0\155\0\160\0\165\0\164\0\145\0\144\0\51)
+ /Parent 924 0 R
+ /A 925 0 R
+>> endobj
+927 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\63\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\126\0\145\0\162\0\163\0\151\0\157\0\156\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163)
+ /Parent 918 0 R
+ /First 928 0 R
+ /Last 928 0 R
+ /Prev 924 0 R
+ /Next 930 0 R
+ /Count -1
+ /A 162 0 R
+>> endobj
+928 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\63\0\56\0\61\0\40\0\104\0\101\0\126\0\72\0\166\0\145\0\162\0\163\0\151\0\157\0\156\0\55\0\150\0\151\0\163\0\164\0\157\0\162\0\171\0\40\0\50\0\143\0\157\0\155\0\160\0\165\0\164\0\145\0\144\0\51)
+ /Parent 927 0 R
+ /A 164 0 R
+>> endobj
+930 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\64\0\40\0\104\0\101\0\126\0\72\0\154\0\157\0\143\0\141\0\164\0\145\0\55\0\142\0\171\0\55\0\150\0\151\0\163\0\164\0\157\0\162\0\171\0\40\0\122\0\145\0\160\0\157\0\162\0\164)
+ /Parent 918 0 R
+ /First 931 0 R
+ /Last 931 0 R
+ /Prev 927 0 R
+ /Next 932 0 R
+ /Count -1
+ /A 929 0 R
+>> endobj
+931 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\64\0\56\0\61\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\104\0\101\0\126\0\72\0\154\0\157\0\143\0\141\0\164\0\145\0\55\0\142\0\171\0\55\0\150\0\151\0\163\0\164\0\157\0\162\0\171\0\40\0\122\0\145\0\160\0\157\0\162\0\164)
+ /Parent 930 0 R
+ /A 168 0 R
+>> endobj
+932 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\65\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\117\0\120\0\124\0\111\0\117\0\116\0\123\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 918 0 R
+ /Prev 930 0 R
+ /Next 933 0 R
+ /A 170 0 R
+>> endobj
+933 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\66\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\104\0\105\0\114\0\105\0\124\0\105\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 918 0 R
+ /Prev 932 0 R
+ /Next 934 0 R
+ /A 172 0 R
+>> endobj
+934 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\67\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\103\0\117\0\120\0\131\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 918 0 R
+ /Prev 933 0 R
+ /Next 935 0 R
+ /A 174 0 R
+>> endobj
+935 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\70\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\115\0\117\0\126\0\105\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 918 0 R
+ /Prev 934 0 R
+ /Next 936 0 R
+ /A 176 0 R
+>> endobj
+936 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\71\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\126\0\105\0\122\0\123\0\111\0\117\0\116\0\55\0\103\0\117\0\116\0\124\0\122\0\117\0\114\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 918 0 R
+ /Prev 935 0 R
+ /Next 937 0 R
+ /A 178 0 R
+>> endobj
+937 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\61\0\60\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\103\0\110\0\105\0\103\0\113\0\111\0\116\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 918 0 R
+ /Prev 936 0 R
+ /A 180 0 R
+>> endobj
+939 0 obj
+<<
+ /Title (\376\377\0\66\0\40\0\127\0\157\0\162\0\153\0\163\0\160\0\141\0\143\0\145\0\40\0\106\0\145\0\141\0\164\0\165\0\162\0\145)
+ /Parent 810 0 R
+ /First 940 0 R
+ /Last 954 0 R
+ /Prev 918 0 R
+ /Next 956 0 R
+ /Count -12
+ /A 938 0 R
+>> endobj
+940 0 obj
+<<
+ /Title (\376\377\0\66\0\56\0\61\0\40\0\127\0\157\0\162\0\153\0\163\0\160\0\141\0\143\0\145\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163)
+ /Parent 939 0 R
+ /First 942 0 R
+ /Last 942 0 R
+ /Next 943 0 R
+ /Count -1
+ /A 184 0 R
+>> endobj
+942 0 obj
+<<
+ /Title (\376\377\0\66\0\56\0\61\0\56\0\61\0\40\0\104\0\101\0\126\0\72\0\167\0\157\0\162\0\153\0\163\0\160\0\141\0\143\0\145\0\55\0\143\0\150\0\145\0\143\0\153\0\157\0\165\0\164\0\55\0\163\0\145\0\164\0\40\0\50\0\143\0\157\0\155\0\160\0\165\0\164\0\145\0\144\0\51)
+ /Parent 940 0 R
+ /A 941 0 R
+>> endobj
+943 0 obj
+<<
+ /Title (\376\377\0\66\0\56\0\62\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163)
+ /Parent 939 0 R
+ /First 945 0 R
+ /Last 945 0 R
+ /Prev 940 0 R
+ /Next 947 0 R
+ /Count -1
+ /A 188 0 R
+>> endobj
+945 0 obj
+<<
+ /Title (\376\377\0\66\0\56\0\62\0\56\0\61\0\40\0\104\0\101\0\126\0\72\0\167\0\157\0\162\0\153\0\163\0\160\0\141\0\143\0\145\0\40\0\50\0\160\0\162\0\157\0\164\0\145\0\143\0\164\0\145\0\144\0\51)
+ /Parent 943 0 R
+ /A 944 0 R
+>> endobj
+947 0 obj
+<<
+ /Title (\376\377\0\66\0\56\0\63\0\40\0\115\0\113\0\127\0\117\0\122\0\113\0\123\0\120\0\101\0\103\0\105\0\40\0\115\0\145\0\164\0\150\0\157\0\144)
+ /Parent 939 0 R
+ /First 948 0 R
+ /Last 948 0 R
+ /Prev 943 0 R
+ /Next 950 0 R
+ /Count -1
+ /A 946 0 R
+>> endobj
+948 0 obj
+<<
+ /Title (\376\377\0\66\0\56\0\63\0\56\0\61\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\115\0\113\0\127\0\117\0\122\0\113\0\123\0\120\0\101\0\103\0\105)
+ /Parent 947 0 R
+ /A 197 0 R
+>> endobj
+950 0 obj
+<<
+ /Title (\376\377\0\66\0\56\0\64\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\117\0\120\0\124\0\111\0\117\0\116\0\123\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 939 0 R
+ /First 951 0 R
+ /Last 951 0 R
+ /Prev 947 0 R
+ /Next 952 0 R
+ /Count -1
+ /A 949 0 R
+>> endobj
+951 0 obj
+<<
+ /Title (\376\377\0\66\0\56\0\64\0\56\0\61\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\117\0\120\0\124\0\111\0\117\0\116\0\123)
+ /Parent 950 0 R
+ /A 201 0 R
+>> endobj
+952 0 obj
+<<
+ /Title (\376\377\0\66\0\56\0\65\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\104\0\105\0\114\0\105\0\124\0\105\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 939 0 R
+ /Prev 950 0 R
+ /Next 953 0 R
+ /A 203 0 R
+>> endobj
+953 0 obj
+<<
+ /Title (\376\377\0\66\0\56\0\66\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\115\0\117\0\126\0\105\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 939 0 R
+ /Prev 952 0 R
+ /Next 954 0 R
+ /A 205 0 R
+>> endobj
+954 0 obj
+<<
+ /Title (\376\377\0\66\0\56\0\67\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\126\0\105\0\122\0\123\0\111\0\117\0\116\0\55\0\103\0\117\0\116\0\124\0\122\0\117\0\114\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 939 0 R
+ /First 955 0 R
+ /Last 955 0 R
+ /Prev 953 0 R
+ /Count -1
+ /A 207 0 R
+>> endobj
+955 0 obj
+<<
+ /Title (\376\377\0\66\0\56\0\67\0\56\0\61\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\126\0\105\0\122\0\123\0\111\0\117\0\116\0\55\0\103\0\117\0\116\0\124\0\122\0\117\0\114\0\40\0\50\0\165\0\163\0\151\0\156\0\147\0\40\0\141\0\156\0\40\0\145\0\170\0\151\0\163\0\164\0\151\0\156\0\147\0\40\0\166\0\145\0\162\0\163\0\151\0\157\0\156\0\40\0\150\0\151\0\163\0\164\0\157\0\162\0\171\0\51)
+ /Parent 954 0 R
+ /A 209 0 R
+>> endobj
+956 0 obj
+<<
+ /Title (\376\377\0\67\0\40\0\125\0\120\0\104\0\101\0\124\0\105\0\40\0\106\0\145\0\141\0\164\0\165\0\162\0\145)
+ /Parent 810 0 R
+ /First 958 0 R
+ /Last 960 0 R
+ /Prev 939 0 R
+ /Next 962 0 R
+ /Count -3
+ /A 211 0 R
+>> endobj
+958 0 obj
+<<
+ /Title (\376\377\0\67\0\56\0\61\0\40\0\125\0\120\0\104\0\101\0\124\0\105\0\40\0\115\0\145\0\164\0\150\0\157\0\144)
+ /Parent 956 0 R
+ /First 959 0 R
+ /Last 959 0 R
+ /Next 960 0 R
+ /Count -1
+ /A 957 0 R
+>> endobj
+959 0 obj
+<<
+ /Title (\376\377\0\67\0\56\0\61\0\56\0\61\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\125\0\120\0\104\0\101\0\124\0\105)
+ /Parent 958 0 R
+ /A 215 0 R
+>> endobj
+960 0 obj
+<<
+ /Title (\376\377\0\67\0\56\0\62\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\117\0\120\0\124\0\111\0\117\0\116\0\123\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 956 0 R
+ /Prev 958 0 R
+ /A 217 0 R
+>> endobj
+962 0 obj
+<<
+ /Title (\376\377\0\70\0\40\0\114\0\141\0\142\0\145\0\154\0\40\0\106\0\145\0\141\0\164\0\165\0\162\0\145)
+ /Parent 810 0 R
+ /First 963 0 R
+ /Last 976 0 R
+ /Prev 956 0 R
+ /Next 977 0 R
+ /Count -11
+ /A 961 0 R
+>> endobj
+963 0 obj
+<<
+ /Title (\376\377\0\70\0\56\0\61\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\126\0\145\0\162\0\163\0\151\0\157\0\156\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163)
+ /Parent 962 0 R
+ /First 965 0 R
+ /Last 965 0 R
+ /Next 967 0 R
+ /Count -1
+ /A 221 0 R
+>> endobj
+965 0 obj
+<<
+ /Title (\376\377\0\70\0\56\0\61\0\56\0\61\0\40\0\104\0\101\0\126\0\72\0\154\0\141\0\142\0\145\0\154\0\55\0\156\0\141\0\155\0\145\0\55\0\163\0\145\0\164\0\40\0\50\0\160\0\162\0\157\0\164\0\145\0\143\0\164\0\145\0\144\0\51)
+ /Parent 963 0 R
+ /A 964 0 R
+>> endobj
+967 0 obj
+<<
+ /Title (\376\377\0\70\0\56\0\62\0\40\0\114\0\101\0\102\0\105\0\114\0\40\0\115\0\145\0\164\0\150\0\157\0\144)
+ /Parent 962 0 R
+ /First 968 0 R
+ /Last 968 0 R
+ /Prev 963 0 R
+ /Next 970 0 R
+ /Count -1
+ /A 966 0 R
+>> endobj
+968 0 obj
+<<
+ /Title (\376\377\0\70\0\56\0\62\0\56\0\61\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\123\0\145\0\164\0\164\0\151\0\156\0\147\0\40\0\141\0\40\0\154\0\141\0\142\0\145\0\154)
+ /Parent 967 0 R
+ /A 227 0 R
+>> endobj
+970 0 obj
+<<
+ /Title (\376\377\0\70\0\56\0\63\0\40\0\114\0\141\0\142\0\145\0\154\0\40\0\110\0\145\0\141\0\144\0\145\0\162)
+ /Parent 962 0 R
+ /Prev 967 0 R
+ /Next 971 0 R
+ /A 969 0 R
+>> endobj
+971 0 obj
+<<
+ /Title (\376\377\0\70\0\56\0\64\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\117\0\120\0\124\0\111\0\117\0\116\0\123\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 962 0 R
+ /Prev 970 0 R
+ /Next 972 0 R
+ /A 231 0 R
+>> endobj
+972 0 obj
+<<
+ /Title (\376\377\0\70\0\56\0\65\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\107\0\105\0\124\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 962 0 R
+ /Prev 971 0 R
+ /Next 973 0 R
+ /A 233 0 R
+>> endobj
+973 0 obj
+<<
+ /Title (\376\377\0\70\0\56\0\66\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\120\0\122\0\117\0\120\0\106\0\111\0\116\0\104\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 962 0 R
+ /Prev 972 0 R
+ /Next 974 0 R
+ /A 235 0 R
+>> endobj
+974 0 obj
+<<
+ /Title (\376\377\0\70\0\56\0\67\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\103\0\117\0\120\0\131\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 962 0 R
+ /Prev 973 0 R
+ /Next 975 0 R
+ /A 237 0 R
+>> endobj
+975 0 obj
+<<
+ /Title (\376\377\0\70\0\56\0\70\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\103\0\110\0\105\0\103\0\113\0\117\0\125\0\124\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 962 0 R
+ /Prev 974 0 R
+ /Next 976 0 R
+ /A 239 0 R
+>> endobj
+976 0 obj
+<<
+ /Title (\376\377\0\70\0\56\0\71\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\125\0\120\0\104\0\101\0\124\0\105\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 962 0 R
+ /Prev 975 0 R
+ /A 241 0 R
+>> endobj
+977 0 obj
+<<
+ /Title (\376\377\0\71\0\40\0\127\0\157\0\162\0\153\0\151\0\156\0\147\0\55\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\40\0\106\0\145\0\141\0\164\0\165\0\162\0\145)
+ /Parent 810 0 R
+ /First 978 0 R
+ /Last 992 0 R
+ /Prev 962 0 R
+ /Next 994 0 R
+ /Count -14
+ /A 243 0 R
+>> endobj
+978 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\61\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\126\0\145\0\162\0\163\0\151\0\157\0\156\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163)
+ /Parent 977 0 R
+ /First 979 0 R
+ /Last 980 0 R
+ /Next 981 0 R
+ /Count -2
+ /A 245 0 R
+>> endobj
+979 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\61\0\56\0\61\0\40\0\104\0\101\0\126\0\72\0\143\0\150\0\145\0\143\0\153\0\157\0\165\0\164\0\55\0\146\0\157\0\162\0\153)
+ /Parent 978 0 R
+ /Next 980 0 R
+ /A 247 0 R
+>> endobj
+980 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\61\0\56\0\62\0\40\0\104\0\101\0\126\0\72\0\143\0\150\0\145\0\143\0\153\0\151\0\156\0\55\0\146\0\157\0\162\0\153)
+ /Parent 978 0 R
+ /Prev 979 0 R
+ /A 249 0 R
+>> endobj
+981 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\62\0\40\0\127\0\157\0\162\0\153\0\151\0\156\0\147\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163)
+ /Parent 977 0 R
+ /First 983 0 R
+ /Last 985 0 R
+ /Prev 978 0 R
+ /Next 986 0 R
+ /Count -3
+ /A 251 0 R
+>> endobj
+983 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\62\0\56\0\61\0\40\0\104\0\101\0\126\0\72\0\141\0\165\0\164\0\157\0\55\0\165\0\160\0\144\0\141\0\164\0\145\0\40\0\50\0\160\0\162\0\157\0\164\0\145\0\143\0\164\0\145\0\144\0\51)
+ /Parent 981 0 R
+ /Next 984 0 R
+ /A 982 0 R
+>> endobj
+984 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\62\0\56\0\62\0\40\0\104\0\101\0\126\0\72\0\143\0\150\0\145\0\143\0\153\0\157\0\165\0\164\0\55\0\146\0\157\0\162\0\153)
+ /Parent 981 0 R
+ /Prev 983 0 R
+ /Next 985 0 R
+ /A 255 0 R
+>> endobj
+985 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\62\0\56\0\63\0\40\0\104\0\101\0\126\0\72\0\143\0\150\0\145\0\143\0\153\0\151\0\156\0\55\0\146\0\157\0\162\0\153)
+ /Parent 981 0 R
+ /Prev 984 0 R
+ /A 257 0 R
+>> endobj
+986 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\63\0\40\0\103\0\110\0\105\0\103\0\113\0\117\0\125\0\124\0\40\0\115\0\145\0\164\0\150\0\157\0\144\0\40\0\50\0\141\0\160\0\160\0\154\0\151\0\145\0\144\0\40\0\164\0\157\0\40\0\141\0\40\0\166\0\145\0\162\0\163\0\151\0\157\0\156\0\51)
+ /Parent 977 0 R
+ /First 987 0 R
+ /Last 987 0 R
+ /Prev 981 0 R
+ /Next 988 0 R
+ /Count -1
+ /A 259 0 R
+>> endobj
+987 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\63\0\56\0\61\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\103\0\110\0\105\0\103\0\113\0\117\0\125\0\124\0\40\0\157\0\146\0\40\0\141\0\40\0\166\0\145\0\162\0\163\0\151\0\157\0\156)
+ /Parent 986 0 R
+ /A 261 0 R
+>> endobj
+988 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\64\0\40\0\103\0\110\0\105\0\103\0\113\0\111\0\116\0\40\0\115\0\145\0\164\0\150\0\157\0\144\0\40\0\50\0\141\0\160\0\160\0\154\0\151\0\145\0\144\0\40\0\164\0\157\0\40\0\141\0\40\0\167\0\157\0\162\0\153\0\151\0\156\0\147\0\40\0\162\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\51)
+ /Parent 977 0 R
+ /First 989 0 R
+ /Last 989 0 R
+ /Prev 986 0 R
+ /Next 990 0 R
+ /Count -1
+ /A 263 0 R
+>> endobj
+989 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\64\0\56\0\61\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\103\0\110\0\105\0\103\0\113\0\111\0\116\0\40\0\157\0\146\0\40\0\141\0\40\0\167\0\157\0\162\0\153\0\151\0\156\0\147\0\40\0\162\0\145\0\163\0\157\0\165\0\162\0\143\0\145)
+ /Parent 988 0 R
+ /A 265 0 R
+>> endobj
+990 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\65\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\117\0\120\0\124\0\111\0\117\0\116\0\123\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 977 0 R
+ /Prev 988 0 R
+ /Next 991 0 R
+ /A 267 0 R
+>> endobj
+991 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\66\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\103\0\117\0\120\0\131\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 977 0 R
+ /Prev 990 0 R
+ /Next 992 0 R
+ /A 269 0 R
+>> endobj
+992 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\67\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\115\0\117\0\126\0\105\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 977 0 R
+ /Prev 991 0 R
+ /A 271 0 R
+>> endobj
+994 0 obj
+<<
+ /Title (\376\377\0\61\0\60\0\40\0\101\0\144\0\166\0\141\0\156\0\143\0\145\0\144\0\40\0\126\0\145\0\162\0\163\0\151\0\157\0\156\0\151\0\156\0\147\0\40\0\106\0\145\0\141\0\164\0\165\0\162\0\145\0\163)
+ /Parent 810 0 R
+ /First 995 0 R
+ /Last 996 0 R
+ /Prev 977 0 R
+ /Next 998 0 R
+ /Count -2
+ /A 993 0 R
+>> endobj
+995 0 obj
+<<
+ /Title (\376\377\0\61\0\60\0\56\0\61\0\40\0\101\0\144\0\166\0\141\0\156\0\143\0\145\0\144\0\40\0\126\0\145\0\162\0\163\0\151\0\157\0\156\0\151\0\156\0\147\0\40\0\120\0\141\0\143\0\153\0\141\0\147\0\145\0\163)
+ /Parent 994 0 R
+ /Next 996 0 R
+ /A 275 0 R
+>> endobj
+996 0 obj
+<<
+ /Title (\376\377\0\61\0\60\0\56\0\62\0\40\0\101\0\144\0\166\0\141\0\156\0\143\0\145\0\144\0\40\0\126\0\145\0\162\0\163\0\151\0\157\0\156\0\151\0\156\0\147\0\40\0\124\0\145\0\162\0\155\0\163)
+ /Parent 994 0 R
+ /Prev 995 0 R
+ /A 277 0 R
+>> endobj
+998 0 obj
+<<
+ /Title (\376\377\0\61\0\61\0\40\0\115\0\145\0\162\0\147\0\145\0\40\0\106\0\145\0\141\0\164\0\165\0\162\0\145)
+ /Parent 810 0 R
+ /First 999 0 R
+ /Last 1011 0 R
+ /Prev 994 0 R
+ /Next 1013 0 R
+ /Count -10
+ /A 997 0 R
+>> endobj
+999 0 obj
+<<
+ /Title (\376\377\0\61\0\61\0\56\0\61\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\103\0\150\0\145\0\143\0\153\0\145\0\144\0\55\0\117\0\165\0\164\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163)
+ /Parent 998 0 R
+ /First 1001 0 R
+ /Last 1003 0 R
+ /Next 1005 0 R
+ /Count -2
+ /A 284 0 R
+>> endobj
+1001 0 obj
+<<
+ /Title (\376\377\0\61\0\61\0\56\0\61\0\56\0\61\0\40\0\104\0\101\0\126\0\72\0\155\0\145\0\162\0\147\0\145\0\55\0\163\0\145\0\164)
+ /Parent 999 0 R
+ /Next 1003 0 R
+ /A 1000 0 R
+>> endobj
+1003 0 obj
+<<
+ /Title (\376\377\0\61\0\61\0\56\0\61\0\56\0\62\0\40\0\104\0\101\0\126\0\72\0\141\0\165\0\164\0\157\0\55\0\155\0\145\0\162\0\147\0\145\0\55\0\163\0\145\0\164)
+ /Parent 999 0 R
+ /Prev 1001 0 R
+ /A 1002 0 R
+>> endobj
+1005 0 obj
+<<
+ /Title (\376\377\0\61\0\61\0\56\0\62\0\40\0\115\0\105\0\122\0\107\0\105\0\40\0\115\0\145\0\164\0\150\0\157\0\144)
+ /Parent 998 0 R
+ /First 1006 0 R
+ /Last 1006 0 R
+ /Prev 999 0 R
+ /Next 1007 0 R
+ /Count -1
+ /A 1004 0 R
+>> endobj
+1006 0 obj
+<<
+ /Title (\376\377\0\61\0\61\0\56\0\62\0\56\0\61\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\115\0\105\0\122\0\107\0\105)
+ /Parent 1005 0 R
+ /A 292 0 R
+>> endobj
+1007 0 obj
+<<
+ /Title (\376\377\0\61\0\61\0\56\0\63\0\40\0\104\0\101\0\126\0\72\0\155\0\145\0\162\0\147\0\145\0\55\0\160\0\162\0\145\0\166\0\151\0\145\0\167\0\40\0\122\0\145\0\160\0\157\0\162\0\164)
+ /Parent 998 0 R
+ /First 1008 0 R
+ /Last 1008 0 R
+ /Prev 1005 0 R
+ /Next 1009 0 R
+ /Count -1
+ /A 294 0 R
+>> endobj
+1008 0 obj
+<<
+ /Title (\376\377\0\61\0\61\0\56\0\63\0\56\0\61\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\104\0\101\0\126\0\72\0\155\0\145\0\162\0\147\0\145\0\55\0\160\0\162\0\145\0\166\0\151\0\145\0\167\0\40\0\122\0\145\0\160\0\157\0\162\0\164)
+ /Parent 1007 0 R
+ /A 296 0 R
+>> endobj
+1009 0 obj
+<<
+ /Title (\376\377\0\61\0\61\0\56\0\64\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\117\0\120\0\124\0\111\0\117\0\116\0\123\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 998 0 R
+ /Prev 1007 0 R
+ /Next 1010 0 R
+ /A 298 0 R
+>> endobj
+1010 0 obj
+<<
+ /Title (\376\377\0\61\0\61\0\56\0\65\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\104\0\105\0\114\0\105\0\124\0\105\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 998 0 R
+ /Prev 1009 0 R
+ /Next 1011 0 R
+ /A 300 0 R
+>> endobj
+1011 0 obj
+<<
+ /Title (\376\377\0\61\0\61\0\56\0\66\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\103\0\110\0\105\0\103\0\113\0\111\0\116\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 998 0 R
+ /Prev 1010 0 R
+ /A 302 0 R
+>> endobj
+1013 0 obj
+<<
+ /Title (\376\377\0\61\0\62\0\40\0\102\0\141\0\163\0\145\0\154\0\151\0\156\0\145\0\40\0\106\0\145\0\141\0\164\0\165\0\162\0\145)
+ /Parent 810 0 R
+ /First 1014 0 R
+ /Last 1042 0 R
+ /Prev 998 0 R
+ /Next 1044 0 R
+ /Count -22
+ /A 1012 0 R
+>> endobj
+1014 0 obj
+<<
+ /Title (\376\377\0\61\0\62\0\56\0\61\0\40\0\126\0\145\0\162\0\163\0\151\0\157\0\156\0\55\0\103\0\157\0\156\0\164\0\162\0\157\0\154\0\154\0\145\0\144\0\40\0\103\0\157\0\156\0\146\0\151\0\147\0\165\0\162\0\141\0\164\0\151\0\157\0\156\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163)
+ /Parent 1013 0 R
+ /First 1016 0 R
+ /Last 1016 0 R
+ /Next 1017 0 R
+ /Count -1
+ /A 306 0 R
+>> endobj
+1016 0 obj
+<<
+ /Title (\376\377\0\61\0\62\0\56\0\61\0\56\0\61\0\40\0\104\0\101\0\126\0\72\0\142\0\141\0\163\0\145\0\154\0\151\0\156\0\145\0\55\0\143\0\157\0\156\0\164\0\162\0\157\0\154\0\154\0\145\0\144\0\55\0\143\0\157\0\154\0\154\0\145\0\143\0\164\0\151\0\157\0\156\0\40\0\50\0\160\0\162\0\157\0\164\0\145\0\143\0\164\0\145\0\144\0\51)
+ /Parent 1014 0 R
+ /A 1015 0 R
+>> endobj
+1017 0 obj
+<<
+ /Title (\376\377\0\61\0\62\0\56\0\62\0\40\0\103\0\150\0\145\0\143\0\153\0\145\0\144\0\55\0\117\0\165\0\164\0\40\0\103\0\157\0\156\0\146\0\151\0\147\0\165\0\162\0\141\0\164\0\151\0\157\0\156\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163)
+ /Parent 1013 0 R
+ /First 1019 0 R
+ /Last 1019 0 R
+ /Prev 1014 0 R
+ /Next 1020 0 R
+ /Count -1
+ /A 310 0 R
+>> endobj
+1019 0 obj
+<<
+ /Title (\376\377\0\61\0\62\0\56\0\62\0\56\0\61\0\40\0\104\0\101\0\126\0\72\0\163\0\165\0\142\0\142\0\141\0\163\0\145\0\154\0\151\0\156\0\145\0\55\0\163\0\145\0\164)
+ /Parent 1017 0 R
+ /A 1018 0 R
+>> endobj
+1020 0 obj
+<<
+ /Title (\376\377\0\61\0\62\0\56\0\63\0\40\0\102\0\141\0\163\0\145\0\154\0\151\0\156\0\145\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163)
+ /Parent 1013 0 R
+ /First 1022 0 R
+ /Last 1023 0 R
+ /Prev 1017 0 R
+ /Next 1024 0 R
+ /Count -2
+ /A 314 0 R
+>> endobj
+1022 0 obj
+<<
+ /Title (\376\377\0\61\0\62\0\56\0\63\0\56\0\61\0\40\0\104\0\101\0\126\0\72\0\142\0\141\0\163\0\145\0\154\0\151\0\156\0\145\0\55\0\143\0\157\0\154\0\154\0\145\0\143\0\164\0\151\0\157\0\156\0\40\0\50\0\160\0\162\0\157\0\164\0\145\0\143\0\164\0\145\0\144\0\51)
+ /Parent 1020 0 R
+ /Next 1023 0 R
+ /A 1021 0 R
+>> endobj
+1023 0 obj
+<<
+ /Title (\376\377\0\61\0\62\0\56\0\63\0\56\0\62\0\40\0\104\0\101\0\126\0\72\0\163\0\165\0\142\0\142\0\141\0\163\0\145\0\154\0\151\0\156\0\145\0\55\0\163\0\145\0\164\0\40\0\50\0\160\0\162\0\157\0\164\0\145\0\143\0\164\0\145\0\144\0\51)
+ /Parent 1020 0 R
+ /Prev 1022 0 R
+ /A 318 0 R
+>> endobj
+1024 0 obj
+<<
+ /Title (\376\377\0\61\0\62\0\56\0\64\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163)
+ /Parent 1013 0 R
+ /First 1026 0 R
+ /Last 1026 0 R
+ /Prev 1020 0 R
+ /Next 1027 0 R
+ /Count -1
+ /A 320 0 R
+>> endobj
+1026 0 obj
+<<
+ /Title (\376\377\0\61\0\62\0\56\0\64\0\56\0\61\0\40\0\104\0\101\0\126\0\72\0\166\0\145\0\162\0\163\0\151\0\157\0\156\0\55\0\143\0\157\0\156\0\164\0\162\0\157\0\154\0\154\0\145\0\144\0\55\0\143\0\157\0\156\0\146\0\151\0\147\0\165\0\162\0\141\0\164\0\151\0\157\0\156\0\40\0\50\0\143\0\157\0\155\0\160\0\165\0\164\0\145\0\144\0\51)
+ /Parent 1024 0 R
+ /A 1025 0 R
+>> endobj
+1027 0 obj
+<<
+ /Title (\376\377\0\61\0\62\0\56\0\65\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\127\0\157\0\162\0\153\0\163\0\160\0\141\0\143\0\145\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163)
+ /Parent 1013 0 R
+ /First 1029 0 R
+ /Last 1029 0 R
+ /Prev 1024 0 R
+ /Next 1031 0 R
+ /Count -1
+ /A 324 0 R
+>> endobj
+1029 0 obj
+<<
+ /Title (\376\377\0\61\0\62\0\56\0\65\0\56\0\61\0\40\0\104\0\101\0\126\0\72\0\142\0\141\0\163\0\145\0\154\0\151\0\156\0\145\0\55\0\143\0\157\0\156\0\164\0\162\0\157\0\154\0\154\0\145\0\144\0\55\0\143\0\157\0\154\0\154\0\145\0\143\0\164\0\151\0\157\0\156\0\55\0\163\0\145\0\164\0\40\0\50\0\143\0\157\0\155\0\160\0\165\0\164\0\145\0\144\0\51)
+ /Parent 1027 0 R
+ /A 1028 0 R
+>> endobj
+1031 0 obj
+<<
+ /Title (\376\377\0\61\0\62\0\56\0\66\0\40\0\102\0\101\0\123\0\105\0\114\0\111\0\116\0\105\0\55\0\103\0\117\0\116\0\124\0\122\0\117\0\114\0\40\0\115\0\145\0\164\0\150\0\157\0\144)
+ /Parent 1013 0 R
+ /First 1032 0 R
+ /Last 1032 0 R
+ /Prev 1027 0 R
+ /Next 1033 0 R
+ /Count -1
+ /A 1030 0 R
+>> endobj
+1032 0 obj
+<<
+ /Title (\376\377\0\61\0\62\0\56\0\66\0\56\0\61\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\102\0\101\0\123\0\105\0\114\0\111\0\116\0\105\0\55\0\103\0\117\0\116\0\124\0\122\0\117\0\114)
+ /Parent 1031 0 R
+ /A 330 0 R
+>> endobj
+1033 0 obj
+<<
+ /Title (\376\377\0\61\0\62\0\56\0\67\0\40\0\104\0\101\0\126\0\72\0\143\0\157\0\155\0\160\0\141\0\162\0\145\0\55\0\142\0\141\0\163\0\145\0\154\0\151\0\156\0\145\0\40\0\122\0\145\0\160\0\157\0\162\0\164)
+ /Parent 1013 0 R
+ /First 1034 0 R
+ /Last 1034 0 R
+ /Prev 1031 0 R
+ /Next 1035 0 R
+ /Count -1
+ /A 332 0 R
+>> endobj
+1034 0 obj
+<<
+ /Title (\376\377\0\61\0\62\0\56\0\67\0\56\0\61\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\104\0\101\0\126\0\72\0\143\0\157\0\155\0\160\0\141\0\162\0\145\0\55\0\142\0\141\0\163\0\145\0\154\0\151\0\156\0\145\0\40\0\122\0\145\0\160\0\157\0\162\0\164)
+ /Parent 1033 0 R
+ /A 334 0 R
+>> endobj
+1035 0 obj
+<<
+ /Title (\376\377\0\61\0\62\0\56\0\70\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\117\0\120\0\124\0\111\0\117\0\116\0\123\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 1013 0 R
+ /Prev 1033 0 R
+ /Next 1036 0 R
+ /A 336 0 R
+>> endobj
+1036 0 obj
+<<
+ /Title (\376\377\0\61\0\62\0\56\0\71\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\115\0\113\0\103\0\117\0\114\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 1013 0 R
+ /Prev 1035 0 R
+ /Next 1037 0 R
+ /A 338 0 R
+>> endobj
+1037 0 obj
+<<
+ /Title (\376\377\0\61\0\62\0\56\0\61\0\60\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\103\0\117\0\120\0\131\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 1013 0 R
+ /Prev 1036 0 R
+ /Next 1038 0 R
+ /A 340 0 R
+>> endobj
+1038 0 obj
+<<
+ /Title (\376\377\0\61\0\62\0\56\0\61\0\61\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\103\0\110\0\105\0\103\0\113\0\117\0\125\0\124\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 1013 0 R
+ /Prev 1037 0 R
+ /Next 1039 0 R
+ /A 342 0 R
+>> endobj
+1039 0 obj
+<<
+ /Title (\376\377\0\61\0\62\0\56\0\61\0\62\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\103\0\110\0\105\0\103\0\113\0\111\0\116\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 1013 0 R
+ /Prev 1038 0 R
+ /Next 1041 0 R
+ /A 344 0 R
+>> endobj
+1041 0 obj
+<<
+ /Title (\376\377\0\61\0\62\0\56\0\61\0\63\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\125\0\120\0\104\0\101\0\124\0\105\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 1013 0 R
+ /Prev 1039 0 R
+ /Next 1042 0 R
+ /A 1040 0 R
+>> endobj
+1042 0 obj
+<<
+ /Title (\376\377\0\61\0\62\0\56\0\61\0\64\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\115\0\105\0\122\0\107\0\105\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 1013 0 R
+ /Prev 1041 0 R
+ /A 348 0 R
+>> endobj
+1044 0 obj
+<<
+ /Title (\376\377\0\61\0\63\0\40\0\101\0\143\0\164\0\151\0\166\0\151\0\164\0\171\0\40\0\106\0\145\0\141\0\164\0\165\0\162\0\145)
+ /Parent 810 0 R
+ /First 1045 0 R
+ /Last 1074 0 R
+ /Prev 1013 0 R
+ /Next 1076 0 R
+ /Count -22
+ /A 1043 0 R
+>> endobj
+1045 0 obj
+<<
+ /Title (\376\377\0\61\0\63\0\56\0\61\0\40\0\101\0\143\0\164\0\151\0\166\0\151\0\164\0\171\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163)
+ /Parent 1044 0 R
+ /First 1047 0 R
+ /Last 1053 0 R
+ /Next 1054 0 R
+ /Count -4
+ /A 352 0 R
+>> endobj
+1047 0 obj
+<<
+ /Title (\376\377\0\61\0\63\0\56\0\61\0\56\0\61\0\40\0\104\0\101\0\126\0\72\0\141\0\143\0\164\0\151\0\166\0\151\0\164\0\171\0\55\0\166\0\145\0\162\0\163\0\151\0\157\0\156\0\55\0\163\0\145\0\164\0\40\0\50\0\143\0\157\0\155\0\160\0\165\0\164\0\145\0\144\0\51)
+ /Parent 1045 0 R
+ /Next 1049 0 R
+ /A 1046 0 R
+>> endobj
+1049 0 obj
+<<
+ /Title (\376\377\0\61\0\63\0\56\0\61\0\56\0\62\0\40\0\104\0\101\0\126\0\72\0\141\0\143\0\164\0\151\0\166\0\151\0\164\0\171\0\55\0\143\0\150\0\145\0\143\0\153\0\157\0\165\0\164\0\55\0\163\0\145\0\164\0\40\0\50\0\143\0\157\0\155\0\160\0\165\0\164\0\145\0\144\0\51)
+ /Parent 1045 0 R
+ /Prev 1047 0 R
+ /Next 1051 0 R
+ /A 1048 0 R
+>> endobj
+1051 0 obj
+<<
+ /Title (\376\377\0\61\0\63\0\56\0\61\0\56\0\63\0\40\0\104\0\101\0\126\0\72\0\163\0\165\0\142\0\141\0\143\0\164\0\151\0\166\0\151\0\164\0\171\0\55\0\163\0\145\0\164)
+ /Parent 1045 0 R
+ /Prev 1049 0 R
+ /Next 1053 0 R
+ /A 1050 0 R
+>> endobj
+1053 0 obj
+<<
+ /Title (\376\377\0\61\0\63\0\56\0\61\0\56\0\64\0\40\0\104\0\101\0\126\0\72\0\143\0\165\0\162\0\162\0\145\0\156\0\164\0\55\0\167\0\157\0\162\0\153\0\163\0\160\0\141\0\143\0\145\0\55\0\163\0\145\0\164\0\40\0\50\0\143\0\157\0\155\0\160\0\165\0\164\0\145\0\144\0\51)
+ /Parent 1045 0 R
+ /Prev 1051 0 R
+ /A 1052 0 R
+>> endobj
+1054 0 obj
+<<
+ /Title (\376\377\0\61\0\63\0\56\0\62\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\126\0\145\0\162\0\163\0\151\0\157\0\156\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163)
+ /Parent 1044 0 R
+ /First 1056 0 R
+ /Last 1056 0 R
+ /Prev 1045 0 R
+ /Next 1057 0 R
+ /Count -1
+ /A 362 0 R
+>> endobj
+1056 0 obj
+<<
+ /Title (\376\377\0\61\0\63\0\56\0\62\0\56\0\61\0\40\0\104\0\101\0\126\0\72\0\141\0\143\0\164\0\151\0\166\0\151\0\164\0\171\0\55\0\163\0\145\0\164)
+ /Parent 1054 0 R
+ /A 1055 0 R
+>> endobj
+1057 0 obj
+<<
+ /Title (\376\377\0\61\0\63\0\56\0\63\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\103\0\150\0\145\0\143\0\153\0\145\0\144\0\55\0\117\0\165\0\164\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163)
+ /Parent 1044 0 R
+ /First 1059 0 R
+ /Last 1060 0 R
+ /Prev 1054 0 R
+ /Next 1061 0 R
+ /Count -2
+ /A 366 0 R
+>> endobj
+1059 0 obj
+<<
+ /Title (\376\377\0\61\0\63\0\56\0\63\0\56\0\61\0\40\0\104\0\101\0\126\0\72\0\165\0\156\0\162\0\145\0\163\0\145\0\162\0\166\0\145\0\144)
+ /Parent 1057 0 R
+ /Next 1060 0 R
+ /A 1058 0 R
+>> endobj
+1060 0 obj
+<<
+ /Title (\376\377\0\61\0\63\0\56\0\63\0\56\0\62\0\40\0\104\0\101\0\126\0\72\0\141\0\143\0\164\0\151\0\166\0\151\0\164\0\171\0\55\0\163\0\145\0\164)
+ /Parent 1057 0 R
+ /Prev 1059 0 R
+ /A 370 0 R
+>> endobj
+1061 0 obj
+<<
+ /Title (\376\377\0\61\0\63\0\56\0\64\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\127\0\157\0\162\0\153\0\163\0\160\0\141\0\143\0\145\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163)
+ /Parent 1044 0 R
+ /First 1063 0 R
+ /Last 1063 0 R
+ /Prev 1057 0 R
+ /Next 1065 0 R
+ /Count -1
+ /A 375 0 R
+>> endobj
+1063 0 obj
+<<
+ /Title (\376\377\0\61\0\63\0\56\0\64\0\56\0\61\0\40\0\104\0\101\0\126\0\72\0\143\0\165\0\162\0\162\0\145\0\156\0\164\0\55\0\141\0\143\0\164\0\151\0\166\0\151\0\164\0\171\0\55\0\163\0\145\0\164)
+ /Parent 1061 0 R
+ /A 1062 0 R
+>> endobj
+1065 0 obj
+<<
+ /Title (\376\377\0\61\0\63\0\56\0\65\0\40\0\115\0\113\0\101\0\103\0\124\0\111\0\126\0\111\0\124\0\131\0\40\0\115\0\145\0\164\0\150\0\157\0\144)
+ /Parent 1044 0 R
+ /First 1066 0 R
+ /Last 1066 0 R
+ /Prev 1061 0 R
+ /Next 1067 0 R
+ /Count -1
+ /A 1064 0 R
+>> endobj
+1066 0 obj
+<<
+ /Title (\376\377\0\61\0\63\0\56\0\65\0\56\0\61\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\115\0\113\0\101\0\103\0\124\0\111\0\126\0\111\0\124\0\131)
+ /Parent 1065 0 R
+ /A 381 0 R
+>> endobj
+1067 0 obj
+<<
+ /Title (\376\377\0\61\0\63\0\56\0\66\0\40\0\104\0\101\0\126\0\72\0\154\0\141\0\164\0\145\0\163\0\164\0\55\0\141\0\143\0\164\0\151\0\166\0\151\0\164\0\171\0\55\0\166\0\145\0\162\0\163\0\151\0\157\0\156\0\40\0\122\0\145\0\160\0\157\0\162\0\164)
+ /Parent 1044 0 R
+ /Prev 1065 0 R
+ /Next 1068 0 R
+ /A 383 0 R
+>> endobj
+1068 0 obj
+<<
+ /Title (\376\377\0\61\0\63\0\56\0\67\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\117\0\120\0\124\0\111\0\117\0\116\0\123\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 1044 0 R
+ /Prev 1067 0 R
+ /Next 1069 0 R
+ /A 385 0 R
+>> endobj
+1069 0 obj
+<<
+ /Title (\376\377\0\61\0\63\0\56\0\70\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\104\0\105\0\114\0\105\0\124\0\105\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 1044 0 R
+ /Prev 1068 0 R
+ /Next 1070 0 R
+ /A 387 0 R
+>> endobj
+1070 0 obj
+<<
+ /Title (\376\377\0\61\0\63\0\56\0\71\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\115\0\117\0\126\0\105\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 1044 0 R
+ /Prev 1069 0 R
+ /Next 1071 0 R
+ /A 389 0 R
+>> endobj
+1071 0 obj
+<<
+ /Title (\376\377\0\61\0\63\0\56\0\61\0\60\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\103\0\110\0\105\0\103\0\113\0\117\0\125\0\124\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 1044 0 R
+ /First 1072 0 R
+ /Last 1072 0 R
+ /Prev 1070 0 R
+ /Next 1073 0 R
+ /Count -1
+ /A 391 0 R
+>> endobj
+1072 0 obj
+<<
+ /Title (\376\377\0\61\0\63\0\56\0\61\0\60\0\56\0\61\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\103\0\110\0\105\0\103\0\113\0\117\0\125\0\124\0\40\0\167\0\151\0\164\0\150\0\40\0\141\0\156\0\40\0\141\0\143\0\164\0\151\0\166\0\151\0\164\0\171)
+ /Parent 1071 0 R
+ /A 393 0 R
+>> endobj
+1073 0 obj
+<<
+ /Title (\376\377\0\61\0\63\0\56\0\61\0\61\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\103\0\110\0\105\0\103\0\113\0\111\0\116\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 1044 0 R
+ /Prev 1071 0 R
+ /Next 1074 0 R
+ /A 395 0 R
+>> endobj
+1074 0 obj
+<<
+ /Title (\376\377\0\61\0\63\0\56\0\61\0\62\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\115\0\105\0\122\0\107\0\105\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 1044 0 R
+ /Prev 1073 0 R
+ /A 397 0 R
+>> endobj
+1076 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\40\0\126\0\145\0\162\0\163\0\151\0\157\0\156\0\55\0\103\0\157\0\156\0\164\0\162\0\157\0\154\0\154\0\145\0\144\0\55\0\103\0\157\0\154\0\154\0\145\0\143\0\164\0\151\0\157\0\156\0\40\0\106\0\145\0\141\0\164\0\165\0\162\0\145)
+ /Parent 810 0 R
+ /First 1077 0 R
+ /Last 1091 0 R
+ /Prev 1044 0 R
+ /Next 1092 0 R
+ /Count -13
+ /A 1075 0 R
+>> endobj
+1077 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\61\0\40\0\126\0\145\0\162\0\163\0\151\0\157\0\156\0\55\0\103\0\157\0\156\0\164\0\162\0\157\0\154\0\154\0\145\0\144\0\40\0\103\0\157\0\154\0\154\0\145\0\143\0\164\0\151\0\157\0\156\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163)
+ /Parent 1076 0 R
+ /First 1079 0 R
+ /Last 1079 0 R
+ /Next 1080 0 R
+ /Count -1
+ /A 401 0 R
+>> endobj
+1079 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\61\0\56\0\61\0\40\0\104\0\101\0\126\0\72\0\145\0\143\0\154\0\151\0\160\0\163\0\145\0\144\0\55\0\163\0\145\0\164\0\40\0\50\0\143\0\157\0\155\0\160\0\165\0\164\0\145\0\144\0\51)
+ /Parent 1077 0 R
+ /A 1078 0 R
+>> endobj
+1080 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\62\0\40\0\103\0\157\0\154\0\154\0\145\0\143\0\164\0\151\0\157\0\156\0\40\0\126\0\145\0\162\0\163\0\151\0\157\0\156\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163)
+ /Parent 1076 0 R
+ /First 1082 0 R
+ /Last 1082 0 R
+ /Prev 1077 0 R
+ /Next 1083 0 R
+ /Count -1
+ /A 405 0 R
+>> endobj
+1082 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\62\0\56\0\61\0\40\0\104\0\101\0\126\0\72\0\166\0\145\0\162\0\163\0\151\0\157\0\156\0\55\0\143\0\157\0\156\0\164\0\162\0\157\0\154\0\154\0\145\0\144\0\55\0\142\0\151\0\156\0\144\0\151\0\156\0\147\0\55\0\163\0\145\0\164\0\40\0\50\0\160\0\162\0\157\0\164\0\145\0\143\0\164\0\145\0\144\0\51)
+ /Parent 1080 0 R
+ /A 1081 0 R
+>> endobj
+1083 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\63\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\117\0\120\0\124\0\111\0\117\0\116\0\123\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 1076 0 R
+ /Prev 1080 0 R
+ /Next 1084 0 R
+ /A 409 0 R
+>> endobj
+1084 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\64\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\104\0\105\0\114\0\105\0\124\0\105\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 1076 0 R
+ /Prev 1083 0 R
+ /Next 1085 0 R
+ /A 411 0 R
+>> endobj
+1085 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\65\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\115\0\113\0\103\0\117\0\114\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 1076 0 R
+ /Prev 1084 0 R
+ /Next 1086 0 R
+ /A 413 0 R
+>> endobj
+1086 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\66\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\103\0\117\0\120\0\131\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 1076 0 R
+ /Prev 1085 0 R
+ /Next 1087 0 R
+ /A 415 0 R
+>> endobj
+1087 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\67\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\115\0\117\0\126\0\105\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 1076 0 R
+ /Prev 1086 0 R
+ /Next 1088 0 R
+ /A 417 0 R
+>> endobj
+1088 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\70\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\126\0\105\0\122\0\123\0\111\0\117\0\116\0\55\0\103\0\117\0\116\0\124\0\122\0\117\0\114\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 1076 0 R
+ /Prev 1087 0 R
+ /Next 1089 0 R
+ /A 419 0 R
+>> endobj
+1089 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\71\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\103\0\110\0\105\0\103\0\113\0\117\0\125\0\124\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 1076 0 R
+ /Prev 1088 0 R
+ /Next 1090 0 R
+ /A 421 0 R
+>> endobj
+1090 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\61\0\60\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\103\0\110\0\105\0\103\0\113\0\111\0\116\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 1076 0 R
+ /Prev 1089 0 R
+ /Next 1091 0 R
+ /A 423 0 R
+>> endobj
+1091 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\61\0\61\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\125\0\120\0\104\0\101\0\124\0\105\0\40\0\141\0\156\0\144\0\40\0\115\0\105\0\122\0\107\0\105\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 1076 0 R
+ /Prev 1090 0 R
+ /A 425 0 R
+>> endobj
+1092 0 obj
+<<
+ /Title (\376\377\0\61\0\65\0\40\0\111\0\156\0\164\0\145\0\162\0\156\0\141\0\164\0\151\0\157\0\156\0\141\0\154\0\151\0\172\0\141\0\164\0\151\0\157\0\156\0\40\0\103\0\157\0\156\0\163\0\151\0\144\0\145\0\162\0\141\0\164\0\151\0\157\0\156\0\163)
+ /Parent 810 0 R
+ /Prev 1076 0 R
+ /Next 1093 0 R
+ /A 427 0 R
+>> endobj
+1093 0 obj
+<<
+ /Title (\376\377\0\61\0\66\0\40\0\123\0\145\0\143\0\165\0\162\0\151\0\164\0\171\0\40\0\103\0\157\0\156\0\163\0\151\0\144\0\145\0\162\0\141\0\164\0\151\0\157\0\156\0\163)
+ /Parent 810 0 R
+ /First 1094 0 R
+ /Last 1097 0 R
+ /Prev 1092 0 R
+ /Next 1098 0 R
+ /Count -4
+ /A 429 0 R
+>> endobj
+1094 0 obj
+<<
+ /Title (\376\377\0\61\0\66\0\56\0\61\0\40\0\101\0\165\0\144\0\151\0\164\0\151\0\156\0\147\0\40\0\141\0\156\0\144\0\40\0\124\0\162\0\141\0\143\0\145\0\141\0\142\0\151\0\154\0\151\0\164\0\171)
+ /Parent 1093 0 R
+ /Next 1095 0 R
+ /A 431 0 R
+>> endobj
+1095 0 obj
+<<
+ /Title (\376\377\0\61\0\66\0\56\0\62\0\40\0\111\0\156\0\143\0\162\0\145\0\141\0\163\0\145\0\144\0\40\0\116\0\145\0\145\0\144\0\40\0\146\0\157\0\162\0\40\0\101\0\143\0\143\0\145\0\163\0\163\0\40\0\103\0\157\0\156\0\164\0\162\0\157\0\154)
+ /Parent 1093 0 R
+ /Prev 1094 0 R
+ /Next 1096 0 R
+ /A 433 0 R
+>> endobj
+1096 0 obj
+<<
+ /Title (\376\377\0\61\0\66\0\56\0\63\0\40\0\123\0\145\0\143\0\165\0\162\0\151\0\164\0\171\0\40\0\124\0\150\0\162\0\157\0\165\0\147\0\150\0\40\0\117\0\142\0\163\0\143\0\165\0\162\0\151\0\164\0\171)
+ /Parent 1093 0 R
+ /Prev 1095 0 R
+ /Next 1097 0 R
+ /A 435 0 R
+>> endobj
+1097 0 obj
+<<
+ /Title (\376\377\0\61\0\66\0\56\0\64\0\40\0\104\0\145\0\156\0\151\0\141\0\154\0\40\0\157\0\146\0\40\0\123\0\145\0\162\0\166\0\151\0\143\0\145)
+ /Parent 1093 0 R
+ /Prev 1096 0 R
+ /A 437 0 R
+>> endobj
+1098 0 obj
+<<
+ /Title (\376\377\0\61\0\67\0\40\0\111\0\101\0\116\0\101\0\40\0\103\0\157\0\156\0\163\0\151\0\144\0\145\0\162\0\141\0\164\0\151\0\157\0\156\0\163)
+ /Parent 810 0 R
+ /Prev 1093 0 R
+ /Next 1099 0 R
+ /A 439 0 R
+>> endobj
+1099 0 obj
+<<
+ /Title (\376\377\0\61\0\70\0\40\0\111\0\156\0\164\0\145\0\154\0\154\0\145\0\143\0\164\0\165\0\141\0\154\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\171)
+ /Parent 810 0 R
+ /Prev 1098 0 R
+ /Next 1100 0 R
+ /A 441 0 R
+>> endobj
+1100 0 obj
+<<
+ /Title (\376\377\0\61\0\71\0\40\0\101\0\143\0\153\0\156\0\157\0\167\0\154\0\145\0\144\0\147\0\145\0\155\0\145\0\156\0\164\0\163)
+ /Parent 810 0 R
+ /Prev 1099 0 R
+ /Next 1101 0 R
+ /A 443 0 R
+>> endobj
+1101 0 obj
+<<
+ /Title (\376\377\0\62\0\60\0\40\0\122\0\145\0\146\0\145\0\162\0\145\0\156\0\143\0\145\0\163)
+ /Parent 810 0 R
+ /Prev 1100 0 R
+ /Next 1102 0 R
+ /A 445 0 R
+>> endobj
+1102 0 obj
+<<
+ /Title (\376\377\0\101\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\40\0\103\0\154\0\141\0\163\0\163\0\151\0\146\0\151\0\143\0\141\0\164\0\151\0\157\0\156)
+ /Parent 810 0 R
+ /First 1103 0 R
+ /Last 1120 0 R
+ /Prev 1101 0 R
+ /Next 1121 0 R
+ /Count -18
+ /A 447 0 R
+>> endobj
+1103 0 obj
+<<
+ /Title (\376\377\0\101\0\56\0\61\0\40\0\104\0\145\0\154\0\164\0\141\0\126\0\55\0\103\0\157\0\155\0\160\0\154\0\151\0\141\0\156\0\164\0\40\0\125\0\156\0\155\0\141\0\160\0\160\0\145\0\144\0\40\0\125\0\122\0\114\0\40\0\50\0\141\0\40\0\125\0\122\0\114\0\40\0\164\0\150\0\141\0\164\0\40\0\151\0\144\0\145\0\156\0\164\0\151\0\146\0\151\0\145\0\163\0\40\0\156\0\157\0\40\0\162\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\51)
+ /Parent 1102 0 R
+ /Next 1104 0 R
+ /A 449 0 R
+>> endobj
+1104 0 obj
+<<
+ /Title (\376\377\0\101\0\56\0\62\0\40\0\104\0\145\0\154\0\164\0\141\0\126\0\55\0\103\0\157\0\155\0\160\0\154\0\151\0\141\0\156\0\164\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145)
+ /Parent 1102 0 R
+ /Prev 1103 0 R
+ /Next 1105 0 R
+ /A 451 0 R
+>> endobj
+1105 0 obj
+<<
+ /Title (\376\377\0\101\0\56\0\63\0\40\0\104\0\145\0\154\0\164\0\141\0\126\0\55\0\103\0\157\0\155\0\160\0\154\0\151\0\141\0\156\0\164\0\40\0\103\0\157\0\154\0\154\0\145\0\143\0\164\0\151\0\157\0\156)
+ /Parent 1102 0 R
+ /Prev 1104 0 R
+ /Next 1106 0 R
+ /A 456 0 R
+>> endobj
+1106 0 obj
+<<
+ /Title (\376\377\0\101\0\56\0\64\0\40\0\126\0\145\0\162\0\163\0\151\0\157\0\156\0\141\0\142\0\154\0\145\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145)
+ /Parent 1102 0 R
+ /Prev 1105 0 R
+ /Next 1107 0 R
+ /A 458 0 R
+>> endobj
+1107 0 obj
+<<
+ /Title (\376\377\0\101\0\56\0\65\0\40\0\126\0\145\0\162\0\163\0\151\0\157\0\156\0\55\0\103\0\157\0\156\0\164\0\162\0\157\0\154\0\154\0\145\0\144\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145)
+ /Parent 1102 0 R
+ /Prev 1106 0 R
+ /Next 1108 0 R
+ /A 460 0 R
+>> endobj
+1108 0 obj
+<<
+ /Title (\376\377\0\101\0\56\0\66\0\40\0\126\0\145\0\162\0\163\0\151\0\157\0\156)
+ /Parent 1102 0 R
+ /Prev 1107 0 R
+ /Next 1109 0 R
+ /A 462 0 R
+>> endobj
+1109 0 obj
+<<
+ /Title (\376\377\0\101\0\56\0\67\0\40\0\103\0\150\0\145\0\143\0\153\0\145\0\144\0\55\0\111\0\156\0\40\0\126\0\145\0\162\0\163\0\151\0\157\0\156\0\55\0\103\0\157\0\156\0\164\0\162\0\157\0\154\0\154\0\145\0\144\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145)
+ /Parent 1102 0 R
+ /Prev 1108 0 R
+ /Next 1110 0 R
+ /A 464 0 R
+>> endobj
+1110 0 obj
+<<
+ /Title (\376\377\0\101\0\56\0\70\0\40\0\103\0\150\0\145\0\143\0\153\0\145\0\144\0\55\0\117\0\165\0\164\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145)
+ /Parent 1102 0 R
+ /Prev 1109 0 R
+ /Next 1111 0 R
+ /A 466 0 R
+>> endobj
+1111 0 obj
+<<
+ /Title (\376\377\0\101\0\56\0\71\0\40\0\103\0\150\0\145\0\143\0\153\0\145\0\144\0\55\0\117\0\165\0\164\0\40\0\126\0\145\0\162\0\163\0\151\0\157\0\156\0\55\0\103\0\157\0\156\0\164\0\162\0\157\0\154\0\154\0\145\0\144\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\40\0\50\0\143\0\150\0\145\0\143\0\153\0\157\0\165\0\164\0\55\0\151\0\156\0\55\0\160\0\154\0\141\0\143\0\145\0\51)
+ /Parent 1102 0 R
+ /Prev 1110 0 R
+ /Next 1112 0 R
+ /A 468 0 R
+>> endobj
+1112 0 obj
+<<
+ /Title (\376\377\0\101\0\56\0\61\0\60\0\40\0\127\0\157\0\162\0\153\0\151\0\156\0\147\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\40\0\50\0\167\0\157\0\162\0\153\0\151\0\156\0\147\0\55\0\162\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\51)
+ /Parent 1102 0 R
+ /Prev 1111 0 R
+ /Next 1113 0 R
+ /A 470 0 R
+>> endobj
+1113 0 obj
+<<
+ /Title (\376\377\0\101\0\56\0\61\0\61\0\40\0\126\0\145\0\162\0\163\0\151\0\157\0\156\0\40\0\110\0\151\0\163\0\164\0\157\0\162\0\171\0\40\0\50\0\166\0\145\0\162\0\163\0\151\0\157\0\156\0\55\0\150\0\151\0\163\0\164\0\157\0\162\0\171\0\51)
+ /Parent 1102 0 R
+ /Prev 1112 0 R
+ /Next 1114 0 R
+ /A 472 0 R
+>> endobj
+1114 0 obj
+<<
+ /Title (\376\377\0\101\0\56\0\61\0\62\0\40\0\127\0\157\0\162\0\153\0\163\0\160\0\141\0\143\0\145\0\40\0\50\0\167\0\157\0\162\0\153\0\163\0\160\0\141\0\143\0\145\0\51)
+ /Parent 1102 0 R
+ /Prev 1113 0 R
+ /Next 1115 0 R
+ /A 474 0 R
+>> endobj
+1115 0 obj
+<<
+ /Title (\376\377\0\101\0\56\0\61\0\63\0\40\0\101\0\143\0\164\0\151\0\166\0\151\0\164\0\171\0\40\0\50\0\141\0\143\0\164\0\151\0\166\0\151\0\164\0\171\0\51)
+ /Parent 1102 0 R
+ /Prev 1114 0 R
+ /Next 1116 0 R
+ /A 476 0 R
+>> endobj
+1116 0 obj
+<<
+ /Title (\376\377\0\101\0\56\0\61\0\64\0\40\0\126\0\145\0\162\0\163\0\151\0\157\0\156\0\55\0\103\0\157\0\156\0\164\0\162\0\157\0\154\0\154\0\145\0\144\0\40\0\103\0\157\0\154\0\154\0\145\0\143\0\164\0\151\0\157\0\156\0\40\0\50\0\166\0\145\0\162\0\163\0\151\0\157\0\156\0\55\0\143\0\157\0\156\0\164\0\162\0\157\0\154\0\154\0\145\0\144\0\55\0\143\0\157\0\154\0\154\0\145\0\143\0\164\0\151\0\157\0\156\0\51)
+ /Parent 1102 0 R
+ /Prev 1115 0 R
+ /Next 1117 0 R
+ /A 478 0 R
+>> endobj
+1117 0 obj
+<<
+ /Title (\376\377\0\101\0\56\0\61\0\65\0\40\0\103\0\157\0\154\0\154\0\145\0\143\0\164\0\151\0\157\0\156\0\40\0\126\0\145\0\162\0\163\0\151\0\157\0\156\0\40\0\50\0\166\0\145\0\162\0\163\0\151\0\157\0\156\0\55\0\143\0\157\0\156\0\164\0\162\0\157\0\154\0\154\0\145\0\144\0\55\0\143\0\157\0\154\0\154\0\145\0\143\0\164\0\151\0\157\0\156\0\51)
+ /Parent 1102 0 R
+ /Prev 1116 0 R
+ /Next 1118 0 R
+ /A 480 0 R
+>> endobj
+1118 0 obj
+<<
+ /Title (\376\377\0\101\0\56\0\61\0\66\0\40\0\126\0\145\0\162\0\163\0\151\0\157\0\156\0\55\0\103\0\157\0\156\0\164\0\162\0\157\0\154\0\154\0\145\0\144\0\40\0\103\0\157\0\156\0\146\0\151\0\147\0\165\0\162\0\141\0\164\0\151\0\157\0\156\0\40\0\50\0\142\0\141\0\163\0\145\0\154\0\151\0\156\0\145\0\51)
+ /Parent 1102 0 R
+ /Prev 1117 0 R
+ /Next 1119 0 R
+ /A 482 0 R
+>> endobj
+1119 0 obj
+<<
+ /Title (\376\377\0\101\0\56\0\61\0\67\0\40\0\102\0\141\0\163\0\145\0\154\0\151\0\156\0\145\0\40\0\50\0\142\0\141\0\163\0\145\0\154\0\151\0\156\0\145\0\51)
+ /Parent 1102 0 R
+ /Prev 1118 0 R
+ /Next 1120 0 R
+ /A 484 0 R
+>> endobj
+1120 0 obj
+<<
+ /Title (\376\377\0\101\0\56\0\61\0\70\0\40\0\103\0\150\0\145\0\143\0\153\0\145\0\144\0\55\0\117\0\165\0\164\0\40\0\126\0\145\0\162\0\163\0\151\0\157\0\156\0\55\0\103\0\157\0\156\0\164\0\162\0\157\0\154\0\154\0\145\0\144\0\40\0\103\0\157\0\156\0\146\0\151\0\147\0\165\0\162\0\141\0\164\0\151\0\157\0\156\0\40\0\50\0\142\0\141\0\163\0\145\0\154\0\151\0\156\0\145\0\51)
+ /Parent 1102 0 R
+ /Prev 1119 0 R
+ /A 486 0 R
+>> endobj
+1121 0 obj
+<<
+ /Title (\376\377\0\101\0\165\0\164\0\150\0\157\0\162\0\163\0\47\0\40\0\101\0\144\0\144\0\162\0\145\0\163\0\163\0\145\0\163)
+ /Parent 810 0 R
+ /Prev 1102 0 R
+ /Next 1122 0 R
+ /A 488 0 R
+>> endobj
+1122 0 obj
+<<
+ /Title (\376\377\0\111\0\156\0\164\0\145\0\154\0\154\0\145\0\143\0\164\0\165\0\141\0\154\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\171\0\40\0\141\0\156\0\144\0\40\0\103\0\157\0\160\0\171\0\162\0\151\0\147\0\150\0\164\0\40\0\123\0\164\0\141\0\164\0\145\0\155\0\145\0\156\0\164\0\163)
+ /Parent 810 0 R
+ /Prev 1121 0 R
+ /Next 1123 0 R
+ /A 490 0 R
+>> endobj
+1123 0 obj
+<<
+ /Title (\376\377\0\111\0\156\0\144\0\145\0\170)
+ /Parent 810 0 R
+ /Prev 1122 0 R
+ /A 492 0 R
+>> endobj
+1124 0 obj
+<< /Type /Font
+/Subtype /Type1
+/Name /F5
+/BaseFont /Times-Roman
+/Encoding /WinAnsiEncoding >>
+endobj
+1125 0 obj
+<< /Type /Font
+/Subtype /Type1
+/Name /F6
+/BaseFont /Times-Italic
+/Encoding /WinAnsiEncoding >>
+endobj
+1126 0 obj
+<< /Type /Font
+/Subtype /Type1
+/Name /F9
+/BaseFont /Courier
+/Encoding /WinAnsiEncoding >>
+endobj
+1127 0 obj
+<< /Type /Font
+/Subtype /Type1
+/Name /F7
+/BaseFont /Times-Bold
+/Encoding /WinAnsiEncoding >>
+endobj
+1 0 obj
+<< /Type /Pages
+/Count 100
+/Kids [6 0 R 8 0 R 101 0 R 192 0 R 279 0 R 372 0 R 453 0 R 494 0 R 508 0 R 513 0 R 517 0 R 519 0 R 521 0 R 525 0 R 529 0 R 535 0 R 541 0 R 545 0 R 547 0 R 549 0 R 551 0 R 553 0 R 555 0 R 559 0 R 561 0 R 566 0 R 573 0 R 575 0 R 577 0 R 579 0 R 581 0 R 583 0 R 585 0 R 589 0 R 591 0 R 595 0 R 597 0 R 603 0 R 607 0 R 609 0 R 611 0 R 613 0 R 617 0 R 619 0 R 623 0 R 625 0 R 627 0 R 629 0 R 631 0 R 638 0 R 645 0 R 654 0 R 656 0 R 661 0 R 667 0 R 669 0 R 671 0 R 673 0 R 675 0 R 677 0 R 679 0 R 681 0 R 683 0 R 685 0 R 687 0 R 689 0 R 691 0 R 693 0 R 700 0 R 702 0 R 704 0 R 706 0 R 708 0 R 710 0 R 712 0 R 714 0 R 716 0 R 718 0 R 720 0 R 722 0 R 724 0 R 738 0 R 740 0 R 742 0 R 747 0 R 749 0 R 763 0 R 773 0 R 775 0 R 777 0 R 779 0 R 781 0 R 789 0 R 791 0 R 793 0 R 796 0 R 799 0 R 802 0 R 805 0 R 808 0 R ] >>
+endobj
+2 0 obj
+<< /Type /Catalog
+/Pages 1 0 R
+ /Outlines 810 0 R
+ /PageMode /UseOutlines
+ /Names << /Dests << /Names [ (rfc.status) [ 6 0 R /XYZ 67.0 454.084 null ] (rfc.copyrightnotice) [ 6 0 R /XYZ 67.0 363.95 null ] (rfc.abstract) [ 6 0 R /XYZ 67.0 306.816 null ] (rfc.toc) [ 8 0 R /XYZ 67.0 725.0 null ] (rfc.section.1) [ 494 0 R /XYZ 67.0 725.0 null ] (rfc.section.1.1) [ 494 0 R /XYZ 67.0 336.866 null ] (rfc.xref.RFC2518.1) [ 494 0 R /XYZ 67.0 301.894 null ] (rfc.xref.RFC2616.1) [ 494 0 R /XYZ 67.0 301.894 null ] (rfc.section.1.2) [ 494 0 R /XYZ 67.0 229.894 null ] (rfc.xref.RFC2119.1) [ 494 0 R /XYZ 67.0 194.922 null ] (rfc.section.1.3) [ 508 0 R /XYZ 67.0 638.0 null ] (rfc.iref.1) [ 508 0 R /XYZ 67.0 582.028 null ] (rfc.iref.2) [ 508 0 R /XYZ 67.0 582.028 null ] (rfc.iref.3) [ 508 0 R /XYZ 67.0 582.028 null ] (rfc.iref.4) [ 508 0 R /XYZ 67.0 523.028 null ] (rfc.iref.5) [ 508 0 R /XYZ 67.0 486.028 null ] (rfc.iref.6) [ 508 0 R /XYZ 67.0 427.028 null ] (rfc.iref.7) [ 508 0 R /XYZ 67.0 390.028 null ] (rfc.iref.8) [ 508 0 R /XYZ 67.0 320.028 null ] (rfc.iref.9) [ 508 0 R /XYZ 67.0 272.028 null ] (rfc.iref.10) [ 508 0 R /XYZ 67.0 213.028 null ] (rfc.iref.11) [ 508 0 R /XYZ 67.0 213.028 null ] (rfc.iref.12) [ 508 0 R /XYZ 67.0 213.028 null ] (rfc.iref.13) [ 508 0 R /XYZ 67.0 213.028 null ] (rfc.iref.14) [ 508 0 R /XYZ 67.0 110.028 null ] (rfc.iref.15) [ 513 0 R /XYZ 67.0 699.0 null ] (rfc.iref.16) [ 513 0 R /XYZ 67.0 651.0 null ] (rfc.iref.17) [ 513 0 R /XYZ 67.0 592.0 null ] (rfc.iref.18) [ 513 0 R /XYZ 67.0 592.0 null ] (rfc.figure.u.1) [ 513 0 R /XYZ 67.0 468.0 null ] (rfc.iref.19) [ 513 0 R /XYZ 67.0 211.15 null ] (rfc.section.1.4) [ 513 0 R /XYZ 67.0 156.15 null ] (rfc.section.1.4.1) [ 513 0 R /XYZ 67.0 126.178 null ] (rfc.section.1.4.2) [ 513 0 R /XYZ 67.0 68.287 null ] (protected.property.value) [ 517 0 R /XYZ 67.0 725.0 null ] (rfc.section.1.4.3) [ 517 0 R /XYZ 67.0 645.109 null ] (computed.property.value) [ 517 0 R /XYZ 67.0 645.109 null ] (rfc.section.1.4.4) [ 517 0 R /XYZ 67.0 554.218 null ] (rfc.section.1.4.5) [ 517 0 R /XYZ 67.0 507.327 null ] (rfc.xref.RFC2518.2) [ 517 0 R /XYZ 67.0 487.436 null ] (rfc.section.1.5) [ 517 0 R /XYZ 67.0 459.436 null ] (rfc.section.1.6) [ 517 0 R /XYZ 67.0 385.464 null ] (method.preconditions.and.postconditions) [ 517 0 R /XYZ 67.0 385.464 null ] (rfc.section.1.6.1) [ 517 0 R /XYZ 67.0 214.492 null ] (rfc.figure.u.2) [ 517 0 R /XYZ 67.0 194.601 null ] (rfc.figure.u.3) [ 517 0 R /XYZ 67.0 137.881 null ] (rfc.section.1.7) [ 519 0 R /XYZ 67.0 636.56 null ] (clarification.of.copy.semantics.with.overwrite-t) [ 519 0 R /XYZ 67.0 636.56 null ] (rfc.xref.RFC2518.3) [ 519 0 R /XYZ 67.0 612.588 null ] (rfc.section.1.8) [ 519 0 R /XYZ 67.0 379.588 null ] (rfc.section.2) [ 521 0 R /XYZ 67.0 725.0 null ] (rfc.section.2.1) [ 521 0 R /XYZ 67.0 658.866 null ] (rfc.section.2.2) [ 521 0 R /XYZ 67.0 234.894 null ] (basic.versioning.semantics) [ 521 0 R /XYZ 67.0 234.894 null ] (rfc.section.2.2.1) [ 521 0 R /XYZ 67.0 204.922 null ] (creating.a.version-controlled.resource) [ 521 0 R /XYZ 67.0 204.922 null ] (rfc.figure.u.4) [ 525 0 R /XYZ 67.0 498.0 null ] (rfc.section.2.2.2) [ 525 0 R /XYZ 67.0 190.386 null ] (rfc.figure.u.5) [ 529 0 R /XYZ 67.0 422.0 null ] (rfc.section.2.2.3) [ 529 0 R /XYZ 67.0 134.276 null ] (rfc.section.3) [ 541 0 R /XYZ 67.0 725.0 null ] (rfc.section.3.1) [ 541 0 R /XYZ 67.0 625.866 null ] (rfc.section.3.1.1) [ 541 0 R /XYZ 67.0 574.894 null ] (PROPERTY_comment) [ 541 0 R /XYZ 67.0 574.894 null ] (rfc.figure.u.6) [ 541 0 R /XYZ 67.0 523.003 null ] (rfc.section.3.1.2) [ 541 0 R /XYZ 67.0 477.283 null ] (PROPERTY_creator-displayname) [ 541 0 R /XYZ 67.0 477.283 null ] (rfc.figure.u.7) [ 541 0 R /XYZ 67.0 425.392 null ] (rfc.section.3.1.3) [ 541 0 R /XYZ 67.0 379.672 null ] (PROPERTY_supported-method-set) [ 541 0 R /XYZ 67.0 379.672 null ] (rfc.figure.u.8) [ 541 0 R /XYZ 67.0 305.781 null ] (rfc.section.3.1.4) [ 541 0 R /XYZ 67.0 240.341 null ] (PROPERTY_supported-live-property-set) [ 541 0 R /XYZ 67.0 240.341 null ] (rfc.figure.u.9) [ 541 0 R /XYZ 67.0 166.45 null ] (rfc.section.3.1.5) [ 541 0 R /XYZ 67.0 101.01 null ] (PROPERTY_supported-report-set) [ 541 0 R /XYZ 67.0 101.01 null ] (rfc.figure.u.10) [ 545 0 R /XYZ 67.0 699.0 null ] (rfc.section.3.2) [ 545 0 R /XYZ 67.0 632.56 null ] (rfc.section.3.2.1) [ 545 0 R /XYZ 67.0 581.588 null ] (PROPERTY_checked-in) [ 545 0 R /XYZ 67.0 581.588 null ] (rfc.figure.u.11) [ 545 0 R /XYZ 67.0 518.697 null ] (rfc.section.3.2.2) [ 545 0 R /XYZ 67.0 482.837 null ] (PROPERTY_auto-version) [ 545 0 R /XYZ 67.0 482.837 null ] (rfc.figure.u.12) [ 545 0 R /XYZ 67.0 215.946 null ] (rfc.section.3.3) [ 545 0 R /XYZ 67.0 129.786 null ] (rfc.section.3.3.1) [ 545 0 R /XYZ 67.0 78.814 null ] (PROPERTY_checked-out) [ 547 0 R /XYZ 67.0 725.0 null ] (rfc.figure.u.13) [ 547 0 R /XYZ 67.0 673.109 null ] (rfc.section.3.3.2) [ 547 0 R /XYZ 67.0 637.249 null ] (PROPERTY_predecessor-set) [ 547 0 R /XYZ 67.0 637.249 null ] (rfc.figure.u.14) [ 547 0 R /XYZ 67.0 564.358 null ] (rfc.section.3.4) [ 547 0 R /XYZ 67.0 527.498 null ] (rfc.section.3.4.1) [ 547 0 R /XYZ 67.0 476.526 null ] (rfc.figure.u.15) [ 547 0 R /XYZ 67.0 424.635 null ] (rfc.section.3.4.2) [ 547 0 R /XYZ 67.0 388.775 null ] (PROPERTY_successor-set) [ 547 0 R /XYZ 67.0 388.775 null ] (rfc.figure.u.16) [ 547 0 R /XYZ 67.0 347.884 null ] (rfc.section.3.4.3) [ 547 0 R /XYZ 67.0 312.024 null ] (PROPERTY_checkout-set) [ 547 0 R /XYZ 67.0 312.024 null ] (rfc.figure.u.17) [ 547 0 R /XYZ 67.0 271.133 null ] (rfc.section.3.4.4) [ 547 0 R /XYZ 67.0 235.273 null ] (PROPERTY_version-name) [ 547 0 R /XYZ 67.0 235.273 null ] (rfc.figure.u.18) [ 547 0 R /XYZ 67.0 172.382 null ] (rfc.section.3.5) [ 547 0 R /XYZ 67.0 125.662 null ] (METHOD_VERSION-CONTROL) [ 547 0 R /XYZ 67.0 125.662 null ] (rfc.iref.50) [ 549 0 R /XYZ 67.0 613.0 null ] (rfc.figure.u.19) [ 549 0 R /XYZ 67.0 583.5 null ] (rfc.figure.u.20) [ 549 0 R /XYZ 67.0 504.64 null ] (rfc.iref.51) [ 549 0 R /XYZ 67.0 467.28 null ] (rfc.iref.52) [ 549 0 R /XYZ 67.0 453.78 null ] (rfc.iref.53) [ 549 0 R /XYZ 67.0 453.78 null ] (rfc.iref.54) [ 549 0 R /XYZ 67.0 360.78 null ] (rfc.iref.55) [ 549 0 R /XYZ 67.0 360.78 null ] (rfc.section.3.5.1) [ 549 0 R /XYZ 67.0 309.28 null ] (rfc.figure.u.21) [ 549 0 R /XYZ 67.0 289.389 null ] (rfc.figure.u.22) [ 549 0 R /XYZ 67.0 222.809 null ] (rfc.section.3.6) [ 549 0 R /XYZ 67.0 125.949 null ] (METHOD_REPORT) [ 549 0 R /XYZ 67.0 125.949 null ] (rfc.iref.58) [ 551 0 R /XYZ 67.0 699.0 null ] (rfc.iref.59) [ 551 0 R /XYZ 67.0 570.0 null ] (rfc.iref.60) [ 551 0 R /XYZ 67.0 556.5 null ] (rfc.iref.61) [ 551 0 R /XYZ 67.0 556.5 null ] (rfc.iref.62) [ 551 0 R /XYZ 67.0 522.0 null ] (rfc.iref.63) [ 551 0 R /XYZ 67.0 508.5 null ] (rfc.iref.64) [ 551 0 R /XYZ 67.0 508.5 null ] (rfc.section.3.7) [ 551 0 R /XYZ 67.0 467.0 null ] (REPORT_version-tree) [ 551 0 R /XYZ 67.0 467.0 null ] (rfc.iref.67) [ 551 0 R /XYZ 67.0 379.028 null ] (rfc.figure.u.23) [ 551 0 R /XYZ 67.0 349.528 null ] (rfc.xref.RFC2518.4) [ 551 0 R /XYZ 67.0 314.948 null ] (rfc.figure.u.24) [ 551 0 R /XYZ 67.0 234.648 null ] (rfc.xref.RFC2518.5) [ 551 0 R /XYZ 67.0 229.648 null ] (rfc.section.3.7.1) [ 551 0 R /XYZ 67.0 124.848 null ] (rfc.figure.u.25) [ 551 0 R /XYZ 67.0 83.957 null ] (rfc.figure.u.26) [ 553 0 R /XYZ 67.0 617.26 null ] (rfc.figure.u.27) [ 553 0 R /XYZ 67.0 452.08 null ] (rfc.section.3.8) [ 555 0 R /XYZ 67.0 627.98 null ] (REPORT_expand-property) [ 555 0 R /XYZ 67.0 627.98 null ] (rfc.iref.70) [ 555 0 R /XYZ 67.0 529.008 null ] (rfc.figure.u.28) [ 555 0 R /XYZ 67.0 499.508 null ] (rfc.figure.u.29) [ 555 0 R /XYZ 67.0 404.348 null ] (rfc.xref.RFC2518.6) [ 555 0 R /XYZ 67.0 399.348 null ] (rfc.section.3.8.1) [ 555 0 R /XYZ 67.0 223.548 null ] (rfc.figure.u.30) [ 555 0 R /XYZ 67.0 160.657 null ] (rfc.figure.u.31) [ 559 0 R /XYZ 67.0 625.12 null ] (rfc.section.3.9) [ 559 0 R /XYZ 67.0 125.14 null ] (rfc.section.3.10) [ 561 0 R /XYZ 67.0 692.0 null ] (additional.put.semantics) [ 561 0 R /XYZ 67.0 692.0 null ] (rfc.iref.74) [ 561 0 R /XYZ 67.0 668.028 null ] (rfc.iref.75) [ 561 0 R /XYZ 67.0 654.528 null ] (rfc.iref.76) [ 561 0 R /XYZ 67.0 654.528 null ] (rfc.iref.77) [ 561 0 R /XYZ 67.0 616.528 null ] (rfc.iref.78) [ 561 0 R /XYZ 67.0 616.528 null ] (rfc.iref.79) [ 561 0 R /XYZ 67.0 566.028 null ] (rfc.iref.80) [ 561 0 R /XYZ 67.0 552.528 null ] (rfc.iref.81) [ 561 0 R /XYZ 67.0 552.528 null ] (rfc.iref.82) [ 561 0 R /XYZ 67.0 448.528 null ] (rfc.iref.83) [ 561 0 R /XYZ 67.0 448.528 null ] (rfc.section.3.11) [ 561 0 R /XYZ 67.0 303.028 null ] (rfc.iref.85) [ 561 0 R /XYZ 67.0 236.056 null ] (rfc.iref.86) [ 561 0 R /XYZ 67.0 222.556 null ] (rfc.iref.87) [ 561 0 R /XYZ 67.0 222.556 null ] (rfc.section.3.12) [ 561 0 R /XYZ 67.0 181.056 null ] (rfc.iref.89) [ 561 0 R /XYZ 67.0 157.084 null ] (rfc.iref.90) [ 561 0 R /XYZ 67.0 143.584 null ] (rfc.iref.91) [ 561 0 R /XYZ 67.0 143.584 null ] (rfc.iref.92) [ 561 0 R /XYZ 67.0 116.584 null ] (rfc.iref.93) [ 561 0 R /XYZ 67.0 116.584 null ] (rfc.iref.94) [ 561 0 R /XYZ 67.0 89.584 null ] (rfc.iref.95) [ 561 0 R /XYZ 67.0 89.584 null ] (rfc.iref.96) [ 566 0 R /XYZ 67.0 706.5 null ] (rfc.iref.97) [ 566 0 R /XYZ 67.0 706.5 null ] (rfc.iref.98) [ 566 0 R /XYZ 67.0 661.0 null ] (rfc.iref.99) [ 566 0 R /XYZ 67.0 647.5 null ] (rfc.iref.100) [ 566 0 R /XYZ 67.0 647.5 null ] (rfc.iref.101) [ 566 0 R /XYZ 67.0 631.5 null ] (rfc.iref.102) [ 566 0 R /XYZ 67.0 631.5 null ] (rfc.section.3.13) [ 566 0 R /XYZ 67.0 590.0 null ] (additional.delete.semantics) [ 566 0 R /XYZ 67.0 590.0 null ] (rfc.iref.104) [ 566 0 R /XYZ 67.0 566.028 null ] (rfc.iref.105) [ 566 0 R /XYZ 67.0 552.528 null ] (rfc.iref.106) [ 566 0 R /XYZ 67.0 552.528 null ] (rfc.iref.107) [ 566 0 R /XYZ 67.0 529.028 null ] (rfc.iref.108) [ 566 0 R /XYZ 67.0 515.528 null ] (rfc.iref.109) [ 566 0 R /XYZ 67.0 515.528 null ] (rfc.section.3.14) [ 566 0 R /XYZ 67.0 474.028 null ] (rfc.iref.111) [ 566 0 R /XYZ 67.0 450.056 null ] (rfc.iref.112) [ 566 0 R /XYZ 67.0 402.056 null ] (rfc.iref.113) [ 566 0 R /XYZ 67.0 388.556 null ] (rfc.iref.114) [ 566 0 R /XYZ 67.0 388.556 null ] (rfc.iref.115) [ 566 0 R /XYZ 67.0 339.556 null ] (rfc.iref.116) [ 566 0 R /XYZ 67.0 339.556 null ] (rfc.iref.117) [ 566 0 R /XYZ 67.0 312.556 null ] (rfc.iref.118) [ 566 0 R /XYZ 67.0 312.556 null ] (rfc.iref.119) [ 566 0 R /XYZ 67.0 285.556 null ] (rfc.iref.120) [ 566 0 R /XYZ 67.0 285.556 null ] (rfc.section.3.15) [ 566 0 R /XYZ 67.0 200.056 null ] (rfc.iref.122) [ 566 0 R /XYZ 67.0 176.084 null ] (rfc.iref.123) [ 566 0 R /XYZ 67.0 162.584 null ] (rfc.iref.124) [ 566 0 R /XYZ 67.0 162.584 null ] (rfc.iref.125) [ 566 0 R /XYZ 67.0 139.084 null ] (rfc.iref.126) [ 566 0 R /XYZ 67.0 125.584 null ] (rfc.iref.127) [ 566 0 R /XYZ 67.0 125.584 null ] (rfc.section.3.16) [ 566 0 R /XYZ 67.0 73.084 null ] (rfc.iref.129) [ 573 0 R /XYZ 67.0 658.028 null ] (rfc.iref.130) [ 573 0 R /XYZ 67.0 644.528 null ] (rfc.iref.131) [ 573 0 R /XYZ 67.0 644.528 null ] (rfc.iref.132) [ 573 0 R /XYZ 67.0 588.028 null ] (rfc.iref.133) [ 573 0 R /XYZ 67.0 574.528 null ] (rfc.iref.134) [ 573 0 R /XYZ 67.0 574.528 null ] (rfc.section.4) [ 575 0 R /XYZ 67.0 725.0 null ] (checkout-in-place.feature) [ 575 0 R /XYZ 67.0 725.0 null ] (rfc.section.4.1) [ 575 0 R /XYZ 67.0 636.866 null ] (rfc.section.4.1.1) [ 575 0 R /XYZ 67.0 585.894 null ] (PROPERTY_checkout-fork) [ 575 0 R /XYZ 67.0 585.894 null ] (rfc.figure.u.32) [ 575 0 R /XYZ 67.0 485.003 null ] (rfc.section.4.1.2) [ 575 0 R /XYZ 67.0 404.703 null ] (PROPERTY_checkin-fork) [ 575 0 R /XYZ 67.0 404.703 null ] (rfc.figure.u.33) [ 575 0 R /XYZ 67.0 303.812 null ] (rfc.section.4.2) [ 575 0 R /XYZ 67.0 222.512 null ] (rfc.section.4.2.1) [ 575 0 R /XYZ 67.0 171.54 null ] (rfc.section.4.2.2) [ 575 0 R /XYZ 67.0 113.649 null ] (rfc.section.4.3) [ 577 0 R /XYZ 67.0 692.0 null ] (checkout.method.applied.to.a.version-controlled.resource) [ 577 0 R /XYZ 67.0 692.0 null ] (rfc.iref.145) [ 577 0 R /XYZ 67.0 615.028 null ] (rfc.figure.u.34) [ 577 0 R /XYZ 67.0 585.528 null ] (rfc.figure.u.35) [ 577 0 R /XYZ 67.0 539.668 null ] (rfc.figure.u.36) [ 577 0 R /XYZ 67.0 482.808 null ] (rfc.iref.146) [ 577 0 R /XYZ 67.0 429.448 null ] (rfc.iref.147) [ 577 0 R /XYZ 67.0 415.948 null ] (rfc.iref.148) [ 577 0 R /XYZ 67.0 415.948 null ] (rfc.iref.149) [ 577 0 R /XYZ 67.0 388.948 null ] (rfc.iref.150) [ 577 0 R /XYZ 67.0 388.948 null ] (rfc.iref.151) [ 577 0 R /XYZ 67.0 350.948 null ] (rfc.iref.152) [ 577 0 R /XYZ 67.0 350.948 null ] (rfc.iref.153) [ 577 0 R /XYZ 67.0 312.948 null ] (rfc.iref.154) [ 577 0 R /XYZ 67.0 312.948 null ] (rfc.iref.155) [ 577 0 R /XYZ 67.0 274.948 null ] (rfc.iref.156) [ 577 0 R /XYZ 67.0 274.948 null ] (rfc.iref.157) [ 577 0 R /XYZ 67.0 229.448 null ] (rfc.iref.158) [ 577 0 R /XYZ 67.0 215.948 null ] (rfc.iref.159) [ 577 0 R /XYZ 67.0 215.948 null ] (rfc.iref.160) [ 577 0 R /XYZ 67.0 177.948 null ] (rfc.iref.161) [ 577 0 R /XYZ 67.0 177.948 null ] (rfc.section.4.3.1) [ 577 0 R /XYZ 67.0 137.448 null ] (rfc.figure.u.37) [ 577 0 R /XYZ 67.0 117.557 null ] (rfc.figure.u.38) [ 579 0 R /XYZ 67.0 694.14 null ] (rfc.section.4.4) [ 579 0 R /XYZ 67.0 609.42 null ] (checkin.method.applied.to.a.version-controlled.resource) [ 579 0 R /XYZ 67.0 609.42 null ] (rfc.iref.164) [ 579 0 R /XYZ 67.0 532.448 null ] (rfc.figure.u.39) [ 579 0 R /XYZ 67.0 502.948 null ] (rfc.figure.u.40) [ 579 0 R /XYZ 67.0 396.788 null ] (rfc.iref.165) [ 579 0 R /XYZ 67.0 343.428 null ] (rfc.iref.166) [ 579 0 R /XYZ 67.0 329.928 null ] (rfc.iref.167) [ 579 0 R /XYZ 67.0 329.928 null ] (rfc.iref.168) [ 579 0 R /XYZ 67.0 302.928 null ] (rfc.iref.169) [ 579 0 R /XYZ 67.0 302.928 null ] (rfc.iref.170) [ 579 0 R /XYZ 67.0 264.928 null ] (rfc.iref.171) [ 579 0 R /XYZ 67.0 264.928 null ] (rfc.iref.172) [ 579 0 R /XYZ 67.0 237.928 null ] (rfc.iref.173) [ 579 0 R /XYZ 67.0 237.928 null ] (rfc.iref.174) [ 579 0 R /XYZ 67.0 192.428 null ] (rfc.iref.175) [ 579 0 R /XYZ 67.0 178.928 null ] (rfc.iref.176) [ 579 0 R /XYZ 67.0 178.928 null ] (rfc.iref.177) [ 579 0 R /XYZ 67.0 129.928 null ] (rfc.iref.178) [ 579 0 R /XYZ 67.0 129.928 null ] (rfc.iref.179) [ 581 0 R /XYZ 67.0 722.5 null ] (rfc.iref.180) [ 581 0 R /XYZ 67.0 722.5 null ] (rfc.iref.181) [ 581 0 R /XYZ 67.0 673.5 null ] (rfc.iref.182) [ 581 0 R /XYZ 67.0 673.5 null ] (rfc.section.4.4.1) [ 581 0 R /XYZ 67.0 622.0 null ] (rfc.figure.u.41) [ 581 0 R /XYZ 67.0 602.109 null ] (rfc.figure.u.42) [ 581 0 R /XYZ 67.0 535.529 null ] (rfc.section.4.5) [ 581 0 R /XYZ 67.0 429.949 null ] (METHOD_UNCHECKOUT) [ 581 0 R /XYZ 67.0 429.949 null ] (rfc.iref.185) [ 581 0 R /XYZ 67.0 352.977 null ] (rfc.figure.u.43) [ 581 0 R /XYZ 67.0 323.477 null ] (rfc.figure.u.44) [ 581 0 R /XYZ 67.0 266.617 null ] (rfc.iref.186) [ 581 0 R /XYZ 67.0 213.257 null ] (rfc.iref.187) [ 581 0 R /XYZ 67.0 199.757 null ] (rfc.iref.188) [ 581 0 R /XYZ 67.0 199.757 null ] (rfc.iref.189) [ 581 0 R /XYZ 67.0 165.257 null ] (rfc.iref.190) [ 581 0 R /XYZ 67.0 151.757 null ] (rfc.iref.191) [ 581 0 R /XYZ 67.0 151.757 null ] (rfc.iref.192) [ 581 0 R /XYZ 67.0 124.757 null ] (rfc.iref.193) [ 581 0 R /XYZ 67.0 124.757 null ] (rfc.section.4.5.1) [ 581 0 R /XYZ 67.0 84.257 null ] (rfc.figure.u.45) [ 583 0 R /XYZ 67.0 705.109 null ] (rfc.figure.u.46) [ 583 0 R /XYZ 67.0 638.529 null ] (rfc.section.4.6) [ 583 0 R /XYZ 67.0 531.809 null ] (rfc.section.5) [ 585 0 R /XYZ 67.0 725.0 null ] (version-history.feature) [ 585 0 R /XYZ 67.0 725.0 null ] (rfc.section.5.1) [ 585 0 R /XYZ 67.0 603.866 null ] (rfc.section.5.1.1) [ 585 0 R /XYZ 67.0 531.894 null ] (PROPERTY_version-set) [ 585 0 R /XYZ 67.0 531.894 null ] (rfc.figure.u.47) [ 585 0 R /XYZ 67.0 496.003 null ] (rfc.section.5.1.2) [ 585 0 R /XYZ 67.0 455.143 null ] (PROPERTY_root-version) [ 585 0 R /XYZ 67.0 455.143 null ] (rfc.figure.u.48) [ 585 0 R /XYZ 67.0 419.252 null ] (rfc.section.5.2) [ 585 0 R /XYZ 67.0 377.392 null ] (rfc.section.5.2.1) [ 585 0 R /XYZ 67.0 326.42 null ] (PROPERTY_version-history) [ 585 0 R /XYZ 67.0 326.42 null ] (rfc.figure.u.49) [ 585 0 R /XYZ 67.0 279.529 null ] (rfc.section.5.3) [ 585 0 R /XYZ 67.0 237.669 null ] (rfc.section.5.3.1) [ 585 0 R /XYZ 67.0 186.697 null ] (rfc.figure.u.50) [ 585 0 R /XYZ 67.0 150.806 null ] (rfc.section.5.4) [ 585 0 R /XYZ 67.0 108.946 null ] (REPORT_locate-by-history) [ 585 0 R /XYZ 67.0 108.946 null ] (rfc.iref.210) [ 589 0 R /XYZ 67.0 666.0 null ] (rfc.figure.u.51) [ 589 0 R /XYZ 67.0 636.5 null ] (rfc.xref.RFC2518.7) [ 589 0 R /XYZ 67.0 611.78 null ] (rfc.iref.211) [ 589 0 R /XYZ 67.0 479.98 null ] (rfc.iref.212) [ 589 0 R /XYZ 67.0 466.48 null ] (rfc.iref.213) [ 589 0 R /XYZ 67.0 466.48 null ] (rfc.section.5.4.1) [ 589 0 R /XYZ 67.0 425.98 null ] (rfc.figure.u.52) [ 589 0 R /XYZ 67.0 406.089 null ] (rfc.figure.u.53) [ 589 0 R /XYZ 67.0 211.329 null ] (rfc.section.5.5) [ 591 0 R /XYZ 67.0 584.98 null ] (rfc.iref.216) [ 591 0 R /XYZ 67.0 486.008 null ] (rfc.figure.u.54) [ 591 0 R /XYZ 67.0 456.508 null ] (rfc.figure.u.55) [ 591 0 R /XYZ 67.0 379.928 null ] (rfc.section.5.6) [ 591 0 R /XYZ 67.0 225.128 null ] (rfc.iref.218) [ 591 0 R /XYZ 67.0 201.156 null ] (rfc.iref.219) [ 591 0 R /XYZ 67.0 187.656 null ] (rfc.iref.220) [ 591 0 R /XYZ 67.0 187.656 null ] (rfc.iref.221) [ 591 0 R /XYZ 67.0 149.656 null ] (rfc.iref.222) [ 591 0 R /XYZ 67.0 149.656 null ] (rfc.section.5.7) [ 591 0 R /XYZ 67.0 75.156 null ] (rfc.iref.224) [ 595 0 R /XYZ 67.0 701.028 null ] (rfc.iref.225) [ 595 0 R /XYZ 67.0 687.528 null ] (rfc.iref.226) [ 595 0 R /XYZ 67.0 687.528 null ] (rfc.section.5.8) [ 595 0 R /XYZ 67.0 624.028 null ] (rfc.iref.228) [ 595 0 R /XYZ 67.0 600.056 null ] (rfc.iref.229) [ 595 0 R /XYZ 67.0 586.556 null ] (rfc.iref.230) [ 595 0 R /XYZ 67.0 586.556 null ] (rfc.section.5.9) [ 595 0 R /XYZ 67.0 556.056 null ] (rfc.iref.232) [ 595 0 R /XYZ 67.0 532.084 null ] (rfc.iref.233) [ 595 0 R /XYZ 67.0 518.584 null ] (rfc.iref.234) [ 595 0 R /XYZ 67.0 518.584 null ] (rfc.section.5.10) [ 595 0 R /XYZ 67.0 466.084 null ] (rfc.iref.236) [ 595 0 R /XYZ 67.0 442.112 null ] (rfc.iref.237) [ 595 0 R /XYZ 67.0 428.612 null ] (rfc.iref.238) [ 595 0 R /XYZ 67.0 428.612 null ] (rfc.section.6) [ 597 0 R /XYZ 67.0 725.0 null ] (workspace.feature) [ 597 0 R /XYZ 67.0 725.0 null ] (rfc.section.6.1) [ 597 0 R /XYZ 67.0 397.866 null ] (rfc.section.6.1.1) [ 597 0 R /XYZ 67.0 346.894 null ] (PROPERTY_workspace-checkout-set) [ 597 0 R /XYZ 67.0 346.894 null ] (rfc.figure.u.56) [ 597 0 R /XYZ 67.0 311.003 null ] (rfc.section.6.2) [ 597 0 R /XYZ 67.0 269.143 null ] (rfc.section.6.2.1) [ 597 0 R /XYZ 67.0 218.171 null ] (PROPERTY_workspace) [ 597 0 R /XYZ 67.0 218.171 null ] (rfc.figure.u.57) [ 597 0 R /XYZ 67.0 171.28 null ] (rfc.section.6.3) [ 597 0 R /XYZ 67.0 129.42 null ] (METHOD_MKWORKSPACE) [ 597 0 R /XYZ 67.0 129.42 null ] (rfc.iref.247) [ 603 0 R /XYZ 67.0 678.0 null ] (rfc.figure.u.58) [ 603 0 R /XYZ 67.0 648.5 null ] (rfc.figure.u.59) [ 603 0 R /XYZ 67.0 591.64 null ] (rfc.iref.248) [ 603 0 R /XYZ 67.0 538.28 null ] (rfc.iref.249) [ 603 0 R /XYZ 67.0 524.78 null ] (rfc.iref.250) [ 603 0 R /XYZ 67.0 524.78 null ] (rfc.iref.251) [ 603 0 R /XYZ 67.0 508.78 null ] (rfc.iref.252) [ 603 0 R /XYZ 67.0 508.78 null ] (rfc.iref.253) [ 603 0 R /XYZ 67.0 474.28 null ] (rfc.iref.254) [ 603 0 R /XYZ 67.0 460.78 null ] (rfc.iref.255) [ 603 0 R /XYZ 67.0 460.78 null ] (rfc.section.6.3.1) [ 603 0 R /XYZ 67.0 409.28 null ] (rfc.figure.u.60) [ 603 0 R /XYZ 67.0 389.389 null ] (rfc.figure.u.61) [ 603 0 R /XYZ 67.0 322.809 null ] (rfc.section.6.4) [ 603 0 R /XYZ 67.0 238.089 null ] (additional.options.semantics.with.workspace.feature) [ 603 0 R /XYZ 67.0 238.089 null ] (rfc.iref.258) [ 603 0 R /XYZ 67.0 118.117 null ] (rfc.figure.u.62) [ 603 0 R /XYZ 67.0 88.617 null ] (rfc.figure.u.63) [ 607 0 R /XYZ 67.0 645.92 null ] (rfc.section.6.4.1) [ 607 0 R /XYZ 67.0 492.12 null ] (rfc.figure.u.64) [ 607 0 R /XYZ 67.0 472.229 null ] (rfc.figure.u.65) [ 607 0 R /XYZ 67.0 336.629 null ] (rfc.section.6.5) [ 607 0 R /XYZ 67.0 91.869 null ] (rfc.iref.260) [ 609 0 R /XYZ 67.0 720.0 null ] (rfc.iref.261) [ 609 0 R /XYZ 67.0 706.5 null ] (rfc.iref.262) [ 609 0 R /XYZ 67.0 706.5 null ] (rfc.section.6.6) [ 609 0 R /XYZ 67.0 665.0 null ] (rfc.iref.264) [ 609 0 R /XYZ 67.0 641.028 null ] (rfc.iref.265) [ 609 0 R /XYZ 67.0 627.528 null ] (rfc.iref.266) [ 609 0 R /XYZ 67.0 627.528 null ] (rfc.iref.267) [ 609 0 R /XYZ 67.0 589.528 null ] (rfc.iref.268) [ 609 0 R /XYZ 67.0 589.528 null ] (rfc.section.6.7) [ 609 0 R /XYZ 67.0 548.028 null ] (rfc.iref.270) [ 609 0 R /XYZ 67.0 481.056 null ] (rfc.figure.u.66) [ 609 0 R /XYZ 67.0 462.556 null ] (rfc.iref.271) [ 609 0 R /XYZ 67.0 385.756 null ] (rfc.iref.272) [ 609 0 R /XYZ 67.0 372.256 null ] (rfc.iref.273) [ 609 0 R /XYZ 67.0 372.256 null ] (rfc.iref.274) [ 609 0 R /XYZ 67.0 345.256 null ] (rfc.iref.275) [ 609 0 R /XYZ 67.0 345.256 null ] (rfc.iref.276) [ 609 0 R /XYZ 67.0 329.256 null ] (rfc.iref.277) [ 609 0 R /XYZ 67.0 329.256 null ] (rfc.iref.278) [ 609 0 R /XYZ 67.0 272.756 null ] (rfc.iref.279) [ 609 0 R /XYZ 67.0 259.256 null ] (rfc.iref.280) [ 609 0 R /XYZ 67.0 259.256 null ] (rfc.section.6.7.1) [ 609 0 R /XYZ 67.0 207.756 null ] (rfc.figure.u.67) [ 609 0 R /XYZ 67.0 187.865 null ] (rfc.figure.u.68) [ 611 0 R /XYZ 67.0 684.28 null ] (rfc.section.7) [ 613 0 R /XYZ 67.0 725.0 null ] (rfc.section.7.1) [ 613 0 R /XYZ 67.0 658.866 null ] (METHOD_UPDATE) [ 613 0 R /XYZ 67.0 658.866 null ] (rfc.iref.285) [ 613 0 R /XYZ 67.0 548.894 null ] (rfc.figure.u.69) [ 613 0 R /XYZ 67.0 519.394 null ] (rfc.xref.RFC2518.8) [ 613 0 R /XYZ 67.0 474.954 null ] (rfc.figure.u.70) [ 613 0 R /XYZ 67.0 383.654 null ] (rfc.xref.RFC2518.9) [ 613 0 R /XYZ 67.0 378.654 null ] (rfc.iref.286) [ 613 0 R /XYZ 67.0 290.854 null ] (rfc.iref.287) [ 613 0 R /XYZ 67.0 277.354 null ] (rfc.iref.288) [ 613 0 R /XYZ 67.0 277.354 null ] (rfc.iref.289) [ 613 0 R /XYZ 67.0 206.354 null ] (rfc.iref.290) [ 613 0 R /XYZ 67.0 206.354 null ] (rfc.section.7.1.1) [ 613 0 R /XYZ 67.0 165.854 null ] (rfc.figure.u.71) [ 613 0 R /XYZ 67.0 145.963 null ] (rfc.figure.u.72) [ 617 0 R /XYZ 67.0 644.84 null ] (rfc.section.7.2) [ 617 0 R /XYZ 67.0 449.38 null ] (rfc.section.8) [ 619 0 R /XYZ 67.0 725.0 null ] (label.feature) [ 619 0 R /XYZ 67.0 725.0 null ] (rfc.section.8.1) [ 619 0 R /XYZ 67.0 571.866 null ] (rfc.section.8.1.1) [ 619 0 R /XYZ 67.0 520.894 null ] (PROPERTY_label-name-set) [ 619 0 R /XYZ 67.0 520.894 null ] (rfc.figure.u.73) [ 619 0 R /XYZ 67.0 485.003 null ] (rfc.section.8.2) [ 619 0 R /XYZ 67.0 423.423 null ] (METHOD_LABEL) [ 619 0 R /XYZ 67.0 423.423 null ] (rfc.iref.299) [ 619 0 R /XYZ 67.0 313.451 null ] (rfc.figure.u.74) [ 619 0 R /XYZ 67.0 283.951 null ] (rfc.figure.u.75) [ 619 0 R /XYZ 67.0 83.211 null ] (rfc.iref.300) [ 623 0 R /XYZ 67.0 669.14 null ] (rfc.iref.301) [ 623 0 R /XYZ 67.0 655.64 null ] (rfc.iref.302) [ 623 0 R /XYZ 67.0 655.64 null ] (rfc.iref.303) [ 623 0 R /XYZ 67.0 628.64 null ] (rfc.iref.304) [ 623 0 R /XYZ 67.0 628.64 null ] (rfc.iref.305) [ 623 0 R /XYZ 67.0 590.64 null ] (rfc.iref.306) [ 623 0 R /XYZ 67.0 590.64 null ] (rfc.iref.307) [ 623 0 R /XYZ 67.0 552.64 null ] (rfc.iref.308) [ 623 0 R /XYZ 67.0 552.64 null ] (rfc.iref.309) [ 623 0 R /XYZ 67.0 518.14 null ] (rfc.iref.310) [ 623 0 R /XYZ 67.0 504.64 null ] (rfc.iref.311) [ 623 0 R /XYZ 67.0 504.64 null ] (rfc.iref.312) [ 623 0 R /XYZ 67.0 466.64 null ] (rfc.iref.313) [ 623 0 R /XYZ 67.0 466.64 null ] (rfc.section.8.2.1) [ 623 0 R /XYZ 67.0 426.14 null ] (rfc.figure.u.76) [ 623 0 R /XYZ 67.0 406.249 null ] (rfc.figure.u.77) [ 623 0 R /XYZ 67.0 260.789 null ] (rfc.section.8.3) [ 623 0 R /XYZ 67.0 176.069 null ] (label.header) [ 623 0 R /XYZ 67.0 176.069 null ] (rfc.figure.u.78) [ 623 0 R /XYZ 67.0 77.097 null ] (rfc.section.8.4) [ 625 0 R /XYZ 67.0 612.14 null ] (rfc.section.8.5) [ 625 0 R /XYZ 67.0 549.168 null ] (rfc.iref.319) [ 625 0 R /XYZ 67.0 525.196 null ] (rfc.iref.320) [ 625 0 R /XYZ 67.0 488.196 null ] (rfc.iref.321) [ 625 0 R /XYZ 67.0 474.696 null ] (rfc.iref.322) [ 625 0 R /XYZ 67.0 474.696 null ] (rfc.iref.323) [ 625 0 R /XYZ 67.0 429.196 null ] (rfc.iref.324) [ 625 0 R /XYZ 67.0 415.696 null ] (rfc.iref.325) [ 625 0 R /XYZ 67.0 415.696 null ] (rfc.section.8.6) [ 625 0 R /XYZ 67.0 363.196 null ] (rfc.iref.327) [ 625 0 R /XYZ 67.0 339.224 null ] (rfc.iref.328) [ 625 0 R /XYZ 67.0 302.224 null ] (rfc.iref.329) [ 625 0 R /XYZ 67.0 288.724 null ] (rfc.iref.330) [ 625 0 R /XYZ 67.0 288.724 null ] (rfc.iref.331) [ 625 0 R /XYZ 67.0 243.224 null ] (rfc.iref.332) [ 625 0 R /XYZ 67.0 229.724 null ] (rfc.iref.333) [ 625 0 R /XYZ 67.0 229.724 null ] (rfc.section.8.7) [ 625 0 R /XYZ 67.0 177.224 null ] (rfc.iref.335) [ 625 0 R /XYZ 67.0 153.252 null ] (rfc.iref.336) [ 625 0 R /XYZ 67.0 116.252 null ] (rfc.iref.337) [ 625 0 R /XYZ 67.0 102.752 null ] (rfc.iref.338) [ 625 0 R /XYZ 67.0 102.752 null ] (rfc.iref.339) [ 627 0 R /XYZ 67.0 699.0 null ] (rfc.iref.340) [ 627 0 R /XYZ 67.0 685.5 null ] (rfc.iref.341) [ 627 0 R /XYZ 67.0 685.5 null ] (rfc.section.8.8) [ 627 0 R /XYZ 67.0 633.0 null ] (rfc.iref.344) [ 627 0 R /XYZ 67.0 577.028 null ] (rfc.iref.345) [ 627 0 R /XYZ 67.0 540.028 null ] (rfc.iref.346) [ 627 0 R /XYZ 67.0 526.528 null ] (rfc.iref.347) [ 627 0 R /XYZ 67.0 526.528 null ] (rfc.iref.348) [ 627 0 R /XYZ 67.0 488.528 null ] (rfc.iref.349) [ 627 0 R /XYZ 67.0 488.528 null ] (rfc.iref.350) [ 627 0 R /XYZ 67.0 454.028 null ] (rfc.iref.351) [ 627 0 R /XYZ 67.0 440.528 null ] (rfc.iref.352) [ 627 0 R /XYZ 67.0 440.528 null ] (rfc.section.8.9) [ 627 0 R /XYZ 67.0 388.028 null ] (rfc.iref.354) [ 627 0 R /XYZ 67.0 321.056 null ] (rfc.figure.u.79) [ 627 0 R /XYZ 67.0 302.556 null ] (rfc.iref.355) [ 627 0 R /XYZ 67.0 170.756 null ] (rfc.iref.356) [ 627 0 R /XYZ 67.0 157.256 null ] (rfc.iref.357) [ 627 0 R /XYZ 67.0 157.256 null ] (rfc.iref.358) [ 627 0 R /XYZ 67.0 119.256 null ] (rfc.iref.359) [ 627 0 R /XYZ 67.0 119.256 null ] (rfc.iref.360) [ 629 0 R /XYZ 67.0 688.0 null ] (rfc.iref.361) [ 629 0 R /XYZ 67.0 674.5 null ] (rfc.iref.362) [ 629 0 R /XYZ 67.0 674.5 null ] (rfc.section.9) [ 631 0 R /XYZ 67.0 725.0 null ] (rfc.section.9.1) [ 631 0 R /XYZ 67.0 538.866 null ] (rfc.section.9.1.1) [ 631 0 R /XYZ 67.0 487.894 null ] (rfc.section.9.1.2) [ 631 0 R /XYZ 67.0 441.003 null ] (rfc.section.9.2) [ 631 0 R /XYZ 67.0 393.112 null ] (rfc.section.9.2.1) [ 631 0 R /XYZ 67.0 320.14 null ] (PROPERTY_auto-update) [ 631 0 R /XYZ 67.0 320.14 null ] (rfc.figure.u.80) [ 631 0 R /XYZ 67.0 273.249 null ] (rfc.section.9.2.2) [ 631 0 R /XYZ 67.0 232.389 null ] (rfc.section.9.2.3) [ 631 0 R /XYZ 67.0 185.498 null ] (rfc.section.9.3) [ 631 0 R /XYZ 67.0 137.607 null ] (rfc.iref.376) [ 638 0 R /XYZ 67.0 720.0 null ] (rfc.figure.u.81) [ 638 0 R /XYZ 67.0 690.5 null ] (rfc.figure.u.82) [ 638 0 R /XYZ 67.0 584.34 null ] (rfc.iref.377) [ 638 0 R /XYZ 67.0 514.98 null ] (rfc.iref.378) [ 638 0 R /XYZ 67.0 501.48 null ] (rfc.iref.379) [ 638 0 R /XYZ 67.0 501.48 null ] (rfc.iref.380) [ 638 0 R /XYZ 67.0 485.48 null ] (rfc.iref.381) [ 638 0 R /XYZ 67.0 485.48 null ] (rfc.iref.382) [ 638 0 R /XYZ 67.0 469.48 null ] (rfc.iref.383) [ 638 0 R /XYZ 67.0 469.48 null ] (rfc.iref.384) [ 638 0 R /XYZ 67.0 453.48 null ] (rfc.iref.385) [ 638 0 R /XYZ 67.0 453.48 null ] (rfc.iref.386) [ 638 0 R /XYZ 67.0 429.98 null ] (rfc.iref.387) [ 638 0 R /XYZ 67.0 416.48 null ] (rfc.iref.388) [ 638 0 R /XYZ 67.0 416.48 null ] (rfc.iref.389) [ 638 0 R /XYZ 67.0 345.48 null ] (rfc.iref.390) [ 638 0 R /XYZ 67.0 345.48 null ] (rfc.section.9.3.1) [ 638 0 R /XYZ 67.0 260.98 null ] (rfc.figure.u.83) [ 638 0 R /XYZ 67.0 241.089 null ] (rfc.figure.u.84) [ 638 0 R /XYZ 67.0 174.509 null ] (rfc.section.9.4) [ 638 0 R /XYZ 67.0 68.929 null ] (rfc.iref.393) [ 645 0 R /XYZ 67.0 636.028 null ] (rfc.figure.u.85) [ 645 0 R /XYZ 67.0 606.528 null ] (rfc.figure.u.86) [ 645 0 R /XYZ 67.0 510.228 null ] (rfc.iref.394) [ 645 0 R /XYZ 67.0 461.868 null ] (rfc.iref.395) [ 645 0 R /XYZ 67.0 448.368 null ] (rfc.iref.396) [ 645 0 R /XYZ 67.0 448.368 null ] (rfc.iref.397) [ 645 0 R /XYZ 67.0 432.368 null ] (rfc.iref.398) [ 645 0 R /XYZ 67.0 432.368 null ] (rfc.iref.399) [ 645 0 R /XYZ 67.0 416.368 null ] (rfc.iref.400) [ 645 0 R /XYZ 67.0 416.368 null ] (rfc.iref.401) [ 645 0 R /XYZ 67.0 400.368 null ] (rfc.iref.402) [ 645 0 R /XYZ 67.0 400.368 null ] (rfc.iref.403) [ 645 0 R /XYZ 67.0 384.368 null ] (rfc.iref.404) [ 645 0 R /XYZ 67.0 384.368 null ] (rfc.iref.405) [ 645 0 R /XYZ 67.0 327.868 null ] (rfc.iref.406) [ 645 0 R /XYZ 67.0 314.368 null ] (rfc.iref.407) [ 645 0 R /XYZ 67.0 314.368 null ] (rfc.iref.408) [ 645 0 R /XYZ 67.0 298.368 null ] (rfc.iref.409) [ 645 0 R /XYZ 67.0 298.368 null ] (rfc.iref.410) [ 645 0 R /XYZ 67.0 282.368 null ] (rfc.iref.411) [ 645 0 R /XYZ 67.0 282.368 null ] (rfc.iref.412) [ 645 0 R /XYZ 67.0 244.368 null ] (rfc.iref.413) [ 645 0 R /XYZ 67.0 244.368 null ] (rfc.section.9.4.1) [ 645 0 R /XYZ 67.0 203.868 null ] (rfc.figure.u.87) [ 645 0 R /XYZ 67.0 183.977 null ] (rfc.figure.u.88) [ 645 0 R /XYZ 67.0 117.397 null ] (rfc.section.9.5) [ 654 0 R /XYZ 67.0 655.14 null ] (rfc.section.9.6) [ 654 0 R /XYZ 67.0 581.168 null ] (rfc.iref.417) [ 654 0 R /XYZ 67.0 557.196 null ] (rfc.iref.418) [ 654 0 R /XYZ 67.0 543.696 null ] (rfc.iref.419) [ 654 0 R /XYZ 67.0 543.696 null ] (rfc.section.9.7) [ 654 0 R /XYZ 67.0 480.196 null ] (rfc.iref.421) [ 654 0 R /XYZ 67.0 456.224 null ] (rfc.iref.422) [ 654 0 R /XYZ 67.0 442.724 null ] (rfc.iref.423) [ 654 0 R /XYZ 67.0 442.724 null ] (rfc.iref.424) [ 654 0 R /XYZ 67.0 408.224 null ] (rfc.iref.425) [ 654 0 R /XYZ 67.0 394.724 null ] (rfc.iref.426) [ 654 0 R /XYZ 67.0 394.724 null ] (rfc.section.10) [ 656 0 R /XYZ 67.0 725.0 null ] (advanced.versioning.features) [ 656 0 R /XYZ 67.0 725.0 null ] (rfc.section.10.1) [ 656 0 R /XYZ 67.0 603.866 null ] (rfc.section.10.2) [ 656 0 R /XYZ 67.0 433.894 null ] (rfc.iref.427) [ 656 0 R /XYZ 67.0 388.922 null ] (rfc.iref.428) [ 656 0 R /XYZ 67.0 318.922 null ] (rfc.iref.429) [ 656 0 R /XYZ 67.0 226.922 null ] (rfc.iref.430) [ 656 0 R /XYZ 67.0 145.922 null ] (rfc.iref.431) [ 661 0 R /XYZ 67.0 699.0 null ] (rfc.iref.432) [ 661 0 R /XYZ 67.0 662.0 null ] (rfc.iref.433) [ 661 0 R /XYZ 67.0 570.0 null ] (rfc.section.11) [ 667 0 R /XYZ 67.0 725.0 null ] (merge.feature) [ 667 0 R /XYZ 67.0 725.0 null ] (rfc.section.11.1) [ 667 0 R /XYZ 67.0 484.866 null ] (rfc.section.11.1.1) [ 667 0 R /XYZ 67.0 433.894 null ] (PROPERTY_merge-set) [ 667 0 R /XYZ 67.0 433.894 null ] (rfc.figure.u.89) [ 667 0 R /XYZ 67.0 398.003 null ] (rfc.section.11.1.2) [ 667 0 R /XYZ 67.0 357.143 null ] (PROPERTY_auto-merge-set) [ 667 0 R /XYZ 67.0 357.143 null ] (rfc.figure.u.90) [ 667 0 R /XYZ 67.0 299.252 null ] (rfc.section.11.2) [ 667 0 R /XYZ 67.0 257.392 null ] (METHOD_MERGE) [ 667 0 R /XYZ 67.0 257.392 null ] (rfc.iref.442) [ 669 0 R /XYZ 67.0 446.0 null ] (rfc.figure.u.91) [ 669 0 R /XYZ 67.0 400.5 null ] (rfc.xref.RFC2518.10) [ 669 0 R /XYZ 67.0 316.62 null ] (rfc.figure.u.92) [ 669 0 R /XYZ 67.0 225.32 null ] (rfc.xref.RFC2518.11) [ 669 0 R /XYZ 67.0 220.32 null ] (rfc.iref.443) [ 669 0 R /XYZ 67.0 105.52 null ] (rfc.iref.444) [ 669 0 R /XYZ 67.0 92.02 null ] (rfc.iref.445) [ 669 0 R /XYZ 67.0 92.02 null ] (rfc.iref.446) [ 671 0 R /XYZ 67.0 695.5 null ] (rfc.iref.447) [ 671 0 R /XYZ 67.0 695.5 null ] (rfc.iref.448) [ 671 0 R /XYZ 67.0 645.0 null ] (rfc.iref.449) [ 671 0 R /XYZ 67.0 631.5 null ] (rfc.iref.450) [ 671 0 R /XYZ 67.0 631.5 null ] (rfc.iref.451) [ 671 0 R /XYZ 67.0 593.5 null ] (rfc.iref.452) [ 671 0 R /XYZ 67.0 593.5 null ] (rfc.iref.453) [ 671 0 R /XYZ 67.0 511.5 null ] (rfc.iref.454) [ 671 0 R /XYZ 67.0 511.5 null ] (rfc.iref.455) [ 671 0 R /XYZ 67.0 451.5 null ] (rfc.iref.456) [ 671 0 R /XYZ 67.0 451.5 null ] (rfc.iref.457) [ 671 0 R /XYZ 67.0 342.5 null ] (rfc.iref.458) [ 671 0 R /XYZ 67.0 342.5 null ] (rfc.section.11.2.1) [ 671 0 R /XYZ 67.0 302.0 null ] (rfc.figure.u.93) [ 671 0 R /XYZ 67.0 282.109 null ] (rfc.figure.u.94) [ 671 0 R /XYZ 67.0 136.649 null ] (rfc.section.11.3) [ 673 0 R /XYZ 67.0 535.68 null ] (rfc.iref.461) [ 673 0 R /XYZ 67.0 468.708 null ] (rfc.figure.u.95) [ 673 0 R /XYZ 67.0 439.208 null ] (rfc.figure.u.96) [ 673 0 R /XYZ 67.0 383.488 null ] (rfc.figure.u.97) [ 673 0 R /XYZ 67.0 316.768 null ] (rfc.figure.u.98) [ 673 0 R /XYZ 67.0 251.188 null ] (rfc.figure.u.99) [ 673 0 R /XYZ 67.0 194.328 null ] (rfc.figure.u.100) [ 673 0 R /XYZ 67.0 137.468 null ] (rfc.section.11.3.1) [ 673 0 R /XYZ 67.0 94.108 null ] (rfc.figure.u.101) [ 673 0 R /XYZ 67.0 74.217 null ] (rfc.figure.u.102) [ 675 0 R /XYZ 67.0 579.54 null ] (rfc.section.11.4) [ 675 0 R /XYZ 67.0 236.18 null ] (rfc.section.11.5) [ 675 0 R /XYZ 67.0 173.208 null ] (rfc.iref.465) [ 675 0 R /XYZ 67.0 149.236 null ] (rfc.iref.466) [ 675 0 R /XYZ 67.0 135.736 null ] (rfc.iref.467) [ 675 0 R /XYZ 67.0 135.736 null ] (rfc.section.11.6) [ 675 0 R /XYZ 67.0 94.236 null ] (rfc.iref.469) [ 677 0 R /XYZ 67.0 720.0 null ] (rfc.iref.470) [ 677 0 R /XYZ 67.0 706.5 null ] (rfc.iref.471) [ 677 0 R /XYZ 67.0 706.5 null ] (rfc.section.12) [ 679 0 R /XYZ 67.0 725.0 null ] (baseline.feature) [ 679 0 R /XYZ 67.0 725.0 null ] (rfc.section.12.1) [ 679 0 R /XYZ 67.0 398.866 null ] (rfc.section.12.1.1) [ 679 0 R /XYZ 67.0 325.894 null ] (PROPERTY_baseline-controlled-collection) [ 679 0 R /XYZ 67.0 325.894 null ] (rfc.figure.u.103) [ 679 0 R /XYZ 67.0 257.003 null ] (rfc.section.12.2) [ 679 0 R /XYZ 67.0 215.143 null ] (rfc.section.12.2.1) [ 679 0 R /XYZ 67.0 153.171 null ] (PROPERTY_subbaseline-set) [ 679 0 R /XYZ 67.0 153.171 null ] (rfc.figure.u.104) [ 679 0 R /XYZ 67.0 85.28 null ] (rfc.section.12.3) [ 681 0 R /XYZ 67.0 683.14 null ] (rfc.section.12.3.1) [ 681 0 R /XYZ 67.0 610.168 null ] (PROPERTY_baseline-collection) [ 681 0 R /XYZ 67.0 610.168 null ] (rfc.figure.u.105) [ 681 0 R /XYZ 67.0 541.277 null ] (rfc.section.12.3.2) [ 681 0 R /XYZ 67.0 500.417 null ] (rfc.figure.u.106) [ 681 0 R /XYZ 67.0 442.526 null ] (rfc.section.12.4) [ 681 0 R /XYZ 67.0 400.666 null ] (rfc.section.12.4.1) [ 681 0 R /XYZ 67.0 349.694 null ] (PROPERTY_version-controlled-configuration) [ 681 0 R /XYZ 67.0 349.694 null ] (rfc.figure.u.107) [ 681 0 R /XYZ 67.0 291.803 null ] (rfc.section.12.5) [ 681 0 R /XYZ 67.0 249.943 null ] (rfc.section.12.5.1) [ 681 0 R /XYZ 67.0 198.971 null ] (PROPERTY_baseline-controlled-collection-set) [ 681 0 R /XYZ 67.0 198.971 null ] (rfc.figure.u.108) [ 681 0 R /XYZ 67.0 152.08 null ] (rfc.section.12.6) [ 681 0 R /XYZ 67.0 110.22 null ] (METHOD_BASELINE-CONTROL) [ 681 0 R /XYZ 67.0 110.22 null ] (rfc.iref.490) [ 683 0 R /XYZ 67.0 580.0 null ] (rfc.figure.u.109) [ 683 0 R /XYZ 67.0 550.5 null ] (rfc.figure.u.110) [ 683 0 R /XYZ 67.0 454.2 null ] (rfc.iref.491) [ 683 0 R /XYZ 67.0 400.84 null ] (rfc.iref.492) [ 683 0 R /XYZ 67.0 387.34 null ] (rfc.iref.493) [ 683 0 R /XYZ 67.0 387.34 null ] (rfc.iref.494) [ 683 0 R /XYZ 67.0 360.34 null ] (rfc.iref.495) [ 683 0 R /XYZ 67.0 360.34 null ] (rfc.iref.496) [ 683 0 R /XYZ 67.0 333.34 null ] (rfc.iref.497) [ 683 0 R /XYZ 67.0 333.34 null ] (rfc.iref.498) [ 683 0 R /XYZ 67.0 306.34 null ] (rfc.iref.499) [ 683 0 R /XYZ 67.0 306.34 null ] (rfc.iref.500) [ 683 0 R /XYZ 67.0 238.84 null ] (rfc.iref.501) [ 683 0 R /XYZ 67.0 225.34 null ] (rfc.iref.502) [ 683 0 R /XYZ 67.0 225.34 null ] (rfc.iref.503) [ 683 0 R /XYZ 67.0 198.34 null ] (rfc.iref.504) [ 683 0 R /XYZ 67.0 198.34 null ] (rfc.iref.505) [ 683 0 R /XYZ 67.0 171.34 null ] (rfc.iref.506) [ 683 0 R /XYZ 67.0 171.34 null ] (rfc.iref.507) [ 683 0 R /XYZ 67.0 89.34 null ] (rfc.iref.508) [ 683 0 R /XYZ 67.0 89.34 null ] (rfc.section.12.6.1) [ 685 0 R /XYZ 67.0 649.0 null ] (rfc.figure.u.111) [ 685 0 R /XYZ 67.0 629.109 null ] (rfc.figure.u.112) [ 685 0 R /XYZ 67.0 503.369 null ] (rfc.figure.u.113) [ 685 0 R /XYZ 67.0 371.789 null ] (rfc.section.12.7) [ 687 0 R /XYZ 67.0 638.252 null ] (rfc.iref.511) [ 687 0 R /XYZ 67.0 582.28 null ] (rfc.figure.u.114) [ 687 0 R /XYZ 67.0 552.78 null ] (rfc.figure.u.115) [ 687 0 R /XYZ 67.0 506.92 null ] (rfc.figure.u.116) [ 687 0 R /XYZ 67.0 429.2 null ] (rfc.figure.u.117) [ 687 0 R /XYZ 67.0 361.34 null ] (rfc.figure.u.118) [ 687 0 R /XYZ 67.0 293.48 null ] (rfc.iref.512) [ 687 0 R /XYZ 67.0 256.12 null ] (rfc.iref.513) [ 687 0 R /XYZ 67.0 242.62 null ] (rfc.iref.514) [ 687 0 R /XYZ 67.0 242.62 null ] (rfc.iref.515) [ 687 0 R /XYZ 67.0 226.62 null ] (rfc.iref.516) [ 687 0 R /XYZ 67.0 226.62 null ] (rfc.section.12.7.1) [ 687 0 R /XYZ 67.0 186.12 null ] (rfc.figure.u.119) [ 687 0 R /XYZ 67.0 166.229 null ] (rfc.figure.u.120) [ 689 0 R /XYZ 67.0 684.28 null ] (rfc.section.12.8) [ 689 0 R /XYZ 67.0 440.66 null ] (rfc.section.12.9) [ 689 0 R /XYZ 67.0 377.688 null ] (rfc.iref.520) [ 689 0 R /XYZ 67.0 353.716 null ] (rfc.section.12.10) [ 689 0 R /XYZ 67.0 298.716 null ] (rfc.iref.522) [ 689 0 R /XYZ 67.0 274.744 null ] (rfc.section.12.11) [ 689 0 R /XYZ 67.0 219.744 null ] (rfc.iref.524) [ 689 0 R /XYZ 67.0 195.772 null ] (rfc.iref.525) [ 689 0 R /XYZ 67.0 182.272 null ] (rfc.iref.526) [ 689 0 R /XYZ 67.0 182.272 null ] (rfc.section.12.12) [ 689 0 R /XYZ 67.0 140.772 null ] (rfc.iref.528) [ 689 0 R /XYZ 67.0 116.8 null ] (rfc.iref.529) [ 689 0 R /XYZ 67.0 103.3 null ] (rfc.iref.530) [ 689 0 R /XYZ 67.0 103.3 null ] (rfc.iref.531) [ 691 0 R /XYZ 67.0 706.5 null ] (rfc.iref.532) [ 691 0 R /XYZ 67.0 706.5 null ] (rfc.iref.533) [ 691 0 R /XYZ 67.0 624.5 null ] (rfc.iref.534) [ 691 0 R /XYZ 67.0 624.5 null ] (rfc.iref.535) [ 691 0 R /XYZ 67.0 568.0 null ] (rfc.iref.536) [ 691 0 R /XYZ 67.0 554.5 null ] (rfc.iref.537) [ 691 0 R /XYZ 67.0 554.5 null ] (rfc.iref.538) [ 691 0 R /XYZ 67.0 505.5 null ] (rfc.iref.539) [ 691 0 R /XYZ 67.0 505.5 null ] (rfc.section.12.13) [ 691 0 R /XYZ 67.0 453.0 null ] (additional.update.semantics.with.baseline.feature) [ 691 0 R /XYZ 67.0 453.0 null ] (rfc.iref.541) [ 691 0 R /XYZ 67.0 429.028 null ] (rfc.iref.542) [ 691 0 R /XYZ 67.0 415.528 null ] (rfc.iref.543) [ 691 0 R /XYZ 67.0 415.528 null ] (rfc.iref.544) [ 691 0 R /XYZ 67.0 377.528 null ] (rfc.iref.545) [ 691 0 R /XYZ 67.0 377.528 null ] (rfc.iref.546) [ 691 0 R /XYZ 67.0 350.528 null ] (rfc.iref.547) [ 691 0 R /XYZ 67.0 350.528 null ] (rfc.iref.548) [ 691 0 R /XYZ 67.0 283.028 null ] (rfc.iref.549) [ 691 0 R /XYZ 67.0 269.528 null ] (rfc.iref.550) [ 691 0 R /XYZ 67.0 269.528 null ] (rfc.iref.551) [ 693 0 R /XYZ 67.0 701.5 null ] (rfc.iref.552) [ 693 0 R /XYZ 67.0 701.5 null ] (rfc.iref.553) [ 693 0 R /XYZ 67.0 608.5 null ] (rfc.iref.554) [ 693 0 R /XYZ 67.0 608.5 null ] (rfc.section.12.14) [ 693 0 R /XYZ 67.0 523.0 null ] (rfc.iref.556) [ 693 0 R /XYZ 67.0 456.028 null ] (rfc.iref.557) [ 693 0 R /XYZ 67.0 442.528 null ] (rfc.iref.558) [ 693 0 R /XYZ 67.0 442.528 null ] (rfc.iref.559) [ 693 0 R /XYZ 67.0 426.528 null ] (rfc.iref.560) [ 693 0 R /XYZ 67.0 426.528 null ] (rfc.iref.561) [ 693 0 R /XYZ 67.0 403.028 null ] (rfc.iref.562) [ 693 0 R /XYZ 67.0 389.528 null ] (rfc.iref.563) [ 693 0 R /XYZ 67.0 389.528 null ] (rfc.iref.564) [ 693 0 R /XYZ 67.0 329.528 null ] (rfc.iref.565) [ 693 0 R /XYZ 67.0 329.528 null ] (rfc.iref.566) [ 693 0 R /XYZ 67.0 247.528 null ] (rfc.iref.567) [ 693 0 R /XYZ 67.0 247.528 null ] (rfc.iref.568) [ 693 0 R /XYZ 67.0 231.528 null ] (rfc.iref.569) [ 693 0 R /XYZ 67.0 231.528 null ] (rfc.section.13) [ 700 0 R /XYZ 67.0 725.0 null ] (activity.feature) [ 700 0 R /XYZ 67.0 725.0 null ] (rfc.figure.u.121) [ 700 0 R /XYZ 67.0 437.866 null ] (rfc.section.13.1) [ 700 0 R /XYZ 67.0 169.386 null ] (rfc.section.13.1.1) [ 700 0 R /XYZ 67.0 97.414 null ] (PROPERTY_activity-version-set) [ 700 0 R /XYZ 67.0 97.414 null ] (rfc.figure.u.122) [ 702 0 R /XYZ 67.0 671.0 null ] (rfc.section.13.1.2) [ 702 0 R /XYZ 67.0 630.14 null ] (PROPERTY_activity-checkout-set) [ 702 0 R /XYZ 67.0 630.14 null ] (rfc.figure.u.123) [ 702 0 R /XYZ 67.0 594.249 null ] (rfc.section.13.1.3) [ 702 0 R /XYZ 67.0 553.389 null ] (PROPERTY_subactivity-set) [ 702 0 R /XYZ 67.0 553.389 null ] (rfc.figure.u.124) [ 702 0 R /XYZ 67.0 452.498 null ] (rfc.section.13.1.4) [ 702 0 R /XYZ 67.0 411.638 null ] (PROPERTY_current-workspace-set) [ 702 0 R /XYZ 67.0 411.638 null ] (rfc.figure.u.125) [ 702 0 R /XYZ 67.0 375.747 null ] (rfc.section.13.2) [ 702 0 R /XYZ 67.0 333.887 null ] (rfc.section.13.2.1) [ 702 0 R /XYZ 67.0 282.915 null ] (PROPERTY_activity-set) [ 702 0 R /XYZ 67.0 282.915 null ] (rfc.figure.u.126) [ 702 0 R /XYZ 67.0 225.024 null ] (rfc.section.13.3) [ 702 0 R /XYZ 67.0 183.164 null ] (rfc.section.13.3.1) [ 702 0 R /XYZ 67.0 132.192 null ] (PROPERTY_unreserved) [ 702 0 R /XYZ 67.0 132.192 null ] (rfc.figure.u.127) [ 704 0 R /XYZ 67.0 649.0 null ] (rfc.section.13.3.2) [ 704 0 R /XYZ 67.0 598.28 null ] (rfc.section.13.4) [ 704 0 R /XYZ 67.0 539.389 null ] (rfc.section.13.4.1) [ 704 0 R /XYZ 67.0 488.417 null ] (PROPERTY_current-activity-set) [ 704 0 R /XYZ 67.0 488.417 null ] (rfc.figure.u.128) [ 704 0 R /XYZ 67.0 419.526 null ] (rfc.section.13.5) [ 704 0 R /XYZ 67.0 377.666 null ] (METHOD_MKACTIVITY) [ 704 0 R /XYZ 67.0 377.666 null ] (rfc.iref.592) [ 704 0 R /XYZ 67.0 310.694 null ] (rfc.figure.u.129) [ 704 0 R /XYZ 67.0 281.194 null ] (rfc.figure.u.130) [ 704 0 R /XYZ 67.0 224.334 null ] (rfc.iref.593) [ 704 0 R /XYZ 67.0 170.974 null ] (rfc.iref.594) [ 704 0 R /XYZ 67.0 157.474 null ] (rfc.iref.595) [ 704 0 R /XYZ 67.0 157.474 null ] (rfc.iref.596) [ 704 0 R /XYZ 67.0 141.474 null ] (rfc.iref.597) [ 704 0 R /XYZ 67.0 141.474 null ] (rfc.iref.598) [ 704 0 R /XYZ 67.0 117.974 null ] (rfc.iref.599) [ 704 0 R /XYZ 67.0 104.474 null ] (rfc.iref.600) [ 704 0 R /XYZ 67.0 104.474 null ] (rfc.section.13.5.1) [ 706 0 R /XYZ 67.0 709.0 null ] (rfc.figure.u.131) [ 706 0 R /XYZ 67.0 689.109 null ] (rfc.figure.u.132) [ 706 0 R /XYZ 67.0 622.529 null ] (rfc.section.13.6) [ 706 0 R /XYZ 67.0 537.809 null ] (rfc.iref.603) [ 706 0 R /XYZ 67.0 481.837 null ] (rfc.figure.u.133) [ 706 0 R /XYZ 67.0 452.337 null ] (rfc.figure.u.134) [ 706 0 R /XYZ 67.0 406.477 null ] (rfc.iref.604) [ 706 0 R /XYZ 67.0 331.117 null ] (rfc.iref.605) [ 706 0 R /XYZ 67.0 317.617 null ] (rfc.iref.606) [ 706 0 R /XYZ 67.0 317.617 null ] (rfc.section.13.7) [ 706 0 R /XYZ 67.0 287.117 null ] (rfc.iref.609) [ 706 0 R /XYZ 67.0 199.145 null ] (rfc.figure.u.135) [ 706 0 R /XYZ 67.0 169.645 null ] (rfc.figure.u.136) [ 706 0 R /XYZ 67.0 93.065 null ] (rfc.section.13.8) [ 708 0 R /XYZ 67.0 577.56 null ] (rfc.iref.611) [ 708 0 R /XYZ 67.0 553.588 null ] (rfc.iref.612) [ 708 0 R /XYZ 67.0 540.088 null ] (rfc.iref.613) [ 708 0 R /XYZ 67.0 540.088 null ] (rfc.section.13.9) [ 708 0 R /XYZ 67.0 498.588 null ] (rfc.iref.615) [ 708 0 R /XYZ 67.0 474.616 null ] (rfc.iref.616) [ 708 0 R /XYZ 67.0 461.116 null ] (rfc.iref.617) [ 708 0 R /XYZ 67.0 461.116 null ] (rfc.iref.618) [ 708 0 R /XYZ 67.0 434.116 null ] (rfc.iref.619) [ 708 0 R /XYZ 67.0 434.116 null ] (rfc.iref.620) [ 708 0 R /XYZ 67.0 396.116 null ] (rfc.iref.621) [ 708 0 R /XYZ 67.0 396.116 null ] (rfc.section.13.10) [ 708 0 R /XYZ 67.0 343.616 null ] (rfc.iref.623) [ 708 0 R /XYZ 67.0 298.644 null ] (rfc.figure.u.137) [ 708 0 R /XYZ 67.0 280.144 null ] (rfc.iref.624) [ 708 0 R /XYZ 67.0 193.484 null ] (rfc.iref.625) [ 708 0 R /XYZ 67.0 179.984 null ] (rfc.iref.626) [ 708 0 R /XYZ 67.0 179.984 null ] (rfc.iref.627) [ 708 0 R /XYZ 67.0 141.984 null ] (rfc.iref.628) [ 708 0 R /XYZ 67.0 141.984 null ] (rfc.iref.629) [ 708 0 R /XYZ 67.0 107.484 null ] (rfc.iref.630) [ 708 0 R /XYZ 67.0 93.984 null ] (rfc.iref.631) [ 708 0 R /XYZ 67.0 93.984 null ] (rfc.iref.632) [ 710 0 R /XYZ 67.0 631.5 null ] (rfc.iref.633) [ 710 0 R /XYZ 67.0 631.5 null ] (rfc.section.13.10.1) [ 710 0 R /XYZ 67.0 591.0 null ] (rfc.figure.u.138) [ 710 0 R /XYZ 67.0 571.109 null ] (rfc.figure.u.139) [ 710 0 R /XYZ 67.0 425.649 null ] (rfc.section.13.11) [ 710 0 R /XYZ 67.0 340.929 null ] (rfc.iref.635) [ 710 0 R /XYZ 67.0 316.957 null ] (rfc.iref.636) [ 710 0 R /XYZ 67.0 303.457 null ] (rfc.iref.637) [ 710 0 R /XYZ 67.0 303.457 null ] (rfc.iref.638) [ 710 0 R /XYZ 67.0 265.457 null ] (rfc.iref.639) [ 710 0 R /XYZ 67.0 265.457 null ] (rfc.iref.640) [ 710 0 R /XYZ 67.0 219.957 null ] (rfc.iref.641) [ 710 0 R /XYZ 67.0 206.457 null ] (rfc.iref.642) [ 710 0 R /XYZ 67.0 206.457 null ] (rfc.iref.643) [ 710 0 R /XYZ 67.0 179.457 null ] (rfc.iref.644) [ 710 0 R /XYZ 67.0 179.457 null ] (rfc.section.13.12) [ 710 0 R /XYZ 67.0 126.957 null ] (rfc.iref.646) [ 712 0 R /XYZ 67.0 688.0 null ] (rfc.figure.u.140) [ 712 0 R /XYZ 67.0 669.5 null ] (rfc.iref.647) [ 712 0 R /XYZ 67.0 632.14 null ] (rfc.iref.648) [ 712 0 R /XYZ 67.0 618.64 null ] (rfc.iref.649) [ 712 0 R /XYZ 67.0 618.64 null ] (rfc.section.14) [ 714 0 R /XYZ 67.0 725.0 null ] (version-controlled-collection.feature) [ 714 0 R /XYZ 67.0 725.0 null ] (rfc.figure.u.141) [ 714 0 R /XYZ 67.0 370.866 null ] (rfc.section.14.1) [ 716 0 R /XYZ 67.0 388.252 null ] (rfc.section.14.1.1) [ 716 0 R /XYZ 67.0 315.28 null ] (PROPERTY_eclipsed-set) [ 716 0 R /XYZ 67.0 315.28 null ] (rfc.figure.u.142) [ 716 0 R /XYZ 67.0 268.389 null ] (rfc.section.14.2) [ 716 0 R /XYZ 67.0 141.809 null ] (rfc.section.14.2.1) [ 716 0 R /XYZ 67.0 79.837 null ] (PROPERTY_version-controlled-binding-set) [ 718 0 R /XYZ 67.0 725.0 null ] (rfc.figure.u.143) [ 718 0 R /XYZ 67.0 689.109 null ] (rfc.section.14.3) [ 718 0 R /XYZ 67.0 588.089 null ] (rfc.section.14.4) [ 718 0 R /XYZ 67.0 514.117 null ] (rfc.iref.659) [ 718 0 R /XYZ 67.0 490.145 null ] (rfc.iref.660) [ 718 0 R /XYZ 67.0 476.645 null ] (rfc.iref.661) [ 718 0 R /XYZ 67.0 476.645 null ] (rfc.section.14.5) [ 718 0 R /XYZ 67.0 413.145 null ] (rfc.iref.663) [ 718 0 R /XYZ 67.0 389.173 null ] (rfc.iref.664) [ 718 0 R /XYZ 67.0 341.173 null ] (rfc.section.14.6) [ 718 0 R /XYZ 67.0 286.173 null ] (rfc.iref.666) [ 718 0 R /XYZ 67.0 262.201 null ] (rfc.iref.667) [ 718 0 R /XYZ 67.0 248.701 null ] (rfc.iref.668) [ 718 0 R /XYZ 67.0 248.701 null ] (rfc.section.14.7) [ 718 0 R /XYZ 67.0 207.201 null ] (rfc.iref.670) [ 718 0 R /XYZ 67.0 183.229 null ] (rfc.iref.671) [ 718 0 R /XYZ 67.0 169.729 null ] (rfc.iref.672) [ 718 0 R /XYZ 67.0 169.729 null ] (rfc.iref.673) [ 718 0 R /XYZ 67.0 131.729 null ] (rfc.iref.674) [ 718 0 R /XYZ 67.0 131.729 null ] (rfc.section.14.8) [ 720 0 R /XYZ 67.0 708.0 null ] (rfc.iref.676) [ 720 0 R /XYZ 67.0 684.028 null ] (rfc.iref.677) [ 720 0 R /XYZ 67.0 670.528 null ] (rfc.iref.678) [ 720 0 R /XYZ 67.0 670.528 null ] (rfc.iref.679) [ 720 0 R /XYZ 67.0 625.028 null ] (rfc.iref.680) [ 720 0 R /XYZ 67.0 611.528 null ] (rfc.iref.681) [ 720 0 R /XYZ 67.0 611.528 null ] (rfc.section.14.9) [ 720 0 R /XYZ 67.0 493.028 null ] (rfc.iref.683) [ 720 0 R /XYZ 67.0 469.056 null ] (rfc.iref.684) [ 720 0 R /XYZ 67.0 455.556 null ] (rfc.iref.685) [ 720 0 R /XYZ 67.0 455.556 null ] (rfc.section.14.10) [ 720 0 R /XYZ 67.0 403.056 null ] (rfc.iref.687) [ 720 0 R /XYZ 67.0 379.084 null ] (rfc.iref.688) [ 720 0 R /XYZ 67.0 365.584 null ] (rfc.iref.689) [ 720 0 R /XYZ 67.0 365.584 null ] (rfc.iref.690) [ 720 0 R /XYZ 67.0 316.584 null ] (rfc.iref.691) [ 720 0 R /XYZ 67.0 316.584 null ] (rfc.section.14.11) [ 720 0 R /XYZ 67.0 198.084 null ] (rfc.iref.694) [ 720 0 R /XYZ 67.0 174.112 null ] (rfc.iref.695) [ 720 0 R /XYZ 67.0 174.112 null ] (rfc.iref.696) [ 720 0 R /XYZ 67.0 160.612 null ] (rfc.iref.697) [ 720 0 R /XYZ 67.0 160.612 null ] (rfc.section.15) [ 724 0 R /XYZ 67.0 725.0 null ] (rfc.xref.RFC2277.1) [ 724 0 R /XYZ 67.0 697.866 null ] (rfc.xref.RFC2279.1) [ 724 0 R /XYZ 67.0 610.866 null ] (rfc.xref.RFC3023.1) [ 724 0 R /XYZ 67.0 588.866 null ] (rfc.xref.RFC3066.1) [ 724 0 R /XYZ 67.0 566.866 null ] (rfc.xref.ISO639.1) [ 724 0 R /XYZ 67.0 566.866 null ] (rfc.xref.RFC2518.12) [ 724 0 R /XYZ 67.0 523.866 null ] (rfc.section.16) [ 738 0 R /XYZ 67.0 725.0 null ] (rfc.xref.RFC2518.13) [ 738 0 R /XYZ 67.0 697.866 null ] (rfc.section.16.1) [ 738 0 R /XYZ 67.0 647.866 null ] (rfc.section.16.2) [ 738 0 R /XYZ 67.0 518.894 null ] (rfc.section.16.3) [ 738 0 R /XYZ 67.0 357.922 null ] (rfc.section.16.4) [ 738 0 R /XYZ 67.0 261.95 null ] (rfc.section.17) [ 740 0 R /XYZ 67.0 725.0 null ] (rfc.section.18) [ 742 0 R /XYZ 67.0 725.0 null ] (rfc.xref.RFC2026.1) [ 742 0 R /XYZ 67.0 697.866 null ] (rfc.xref.RFC2026.2) [ 742 0 R /XYZ 67.0 697.866 null ] (rfc.section.19) [ 747 0 R /XYZ 67.0 725.0 null ] (rfc.references) [ 749 0 R /XYZ 67.0 725.0 null ] (ISO639) [ 749 0 R /XYZ 67.0 702.866 null ] (RFC2026) [ 749 0 R /XYZ 67.0 675.866 null ] (RFC2119) [ 749 0 R /XYZ 67.0 659.866 null ] (RFC2277) [ 749 0 R /XYZ 67.0 632.866 null ] (RFC2279) [ 749 0 R /XYZ 67.0 616.866 null ] (RFC2396) [ 749 0 R /XYZ 67.0 600.866 null ] (RFC2518) [ 749 0 R /XYZ 67.0 573.866 null ] (RFC2616) [ 749 0 R /XYZ 67.0 546.866 null ] (RFC3023) [ 749 0 R /XYZ 67.0 519.866 null ] (RFC3066) [ 749 0 R /XYZ 67.0 503.866 null ] (rfc.section.A) [ 763 0 R /XYZ 67.0 725.0 null ] (rfc.section.A.1) [ 763 0 R /XYZ 67.0 539.866 null ] (rfc.xref.RFC2616.2) [ 763 0 R /XYZ 67.0 502.394 null ] (rfc.xref.RFC2518.14) [ 763 0 R /XYZ 67.0 486.394 null ] (rfc.section.A.2) [ 763 0 R /XYZ 67.0 407.894 null ] (rfc.xref.RFC2518.15) [ 763 0 R /XYZ 67.0 290.422 null ] (rfc.xref.RFC2518.16) [ 763 0 R /XYZ 67.0 237.422 null ] (rfc.xref.RFC2616.3) [ 763 0 R /XYZ 67.0 221.422 null ] (rfc.section.A.3) [ 763 0 R /XYZ 67.0 190.922 null ] (rfc.section.A.4) [ 773 0 R /XYZ 67.0 708.0 null ] (rfc.section.A.5) [ 773 0 R /XYZ 67.0 555.028 null ] (rfc.section.A.6) [ 773 0 R /XYZ 67.0 354.056 null ] (rfc.section.A.7) [ 773 0 R /XYZ 67.0 73.084 null ] (rfc.section.A.8) [ 775 0 R /XYZ 67.0 572.028 null ] (rfc.section.A.9) [ 775 0 R /XYZ 67.0 339.056 null ] (rfc.section.A.10) [ 775 0 R /XYZ 67.0 186.084 null ] (rfc.section.A.11) [ 777 0 R /XYZ 67.0 692.0 null ] (rfc.section.A.12) [ 777 0 R /XYZ 67.0 555.028 null ] (rfc.section.A.13) [ 777 0 R /XYZ 67.0 402.056 null ] (rfc.section.A.14) [ 777 0 R /XYZ 67.0 233.084 null ] (rfc.section.A.15) [ 777 0 R /XYZ 67.0 112.112 null ] (rfc.section.A.16) [ 779 0 R /XYZ 67.0 623.0 null ] (rfc.section.A.17) [ 779 0 R /XYZ 67.0 502.028 null ] (rfc.section.A.18) [ 779 0 R /XYZ 67.0 365.056 null ] (rfc.authors) [ 781 0 R /XYZ 67.0 725.0 null ] (rfc.copyright) [ 781 0 R /XYZ 67.0 308.866 null ] (rfc.ipr) [ 791 0 R /XYZ 67.0 725.0 null ] (rfc.index) [ 793 0 R /XYZ 67.0 725.0 null ] ] >> >>
+ >>
+endobj
+3 0 obj
+<<
+/Font << /F5 1124 0 R /F6 1125 0 R /F9 1126 0 R /F7 1127 0 R >>
+/ProcSet [ /PDF /ImageC /Text ] >>
+endobj
+11 0 obj
+<<
+/S /GoTo
+/D [494 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+13 0 obj
+<<
+/S /GoTo
+/D [494 0 R /XYZ 67.0 336.866 null]
+>>
+endobj
+15 0 obj
+<<
+/S /GoTo
+/D [494 0 R /XYZ 67.0 229.894 null]
+>>
+endobj
+17 0 obj
+<<
+/S /GoTo
+/D [508 0 R /XYZ 67.0 638.0 null]
+>>
+endobj
+19 0 obj
+<<
+/S /GoTo
+/D [513 0 R /XYZ 67.0 156.15 null]
+>>
+endobj
+21 0 obj
+<<
+/S /GoTo
+/D [513 0 R /XYZ 67.0 126.178 null]
+>>
+endobj
+23 0 obj
+<<
+/S /GoTo
+/D [517 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+25 0 obj
+<<
+/S /GoTo
+/D [517 0 R /XYZ 67.0 645.109 null]
+>>
+endobj
+27 0 obj
+<<
+/S /GoTo
+/D [517 0 R /XYZ 67.0 554.218 null]
+>>
+endobj
+29 0 obj
+<<
+/S /GoTo
+/D [517 0 R /XYZ 67.0 507.327 null]
+>>
+endobj
+31 0 obj
+<<
+/S /GoTo
+/D [517 0 R /XYZ 67.0 459.436 null]
+>>
+endobj
+33 0 obj
+<<
+/S /GoTo
+/D [517 0 R /XYZ 67.0 385.464 null]
+>>
+endobj
+35 0 obj
+<<
+/S /GoTo
+/D [517 0 R /XYZ 67.0 214.492 null]
+>>
+endobj
+37 0 obj
+<<
+/S /GoTo
+/D [519 0 R /XYZ 67.0 636.56 null]
+>>
+endobj
+39 0 obj
+<<
+/S /GoTo
+/D [519 0 R /XYZ 67.0 379.588 null]
+>>
+endobj
+41 0 obj
+<<
+/S /GoTo
+/D [521 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+43 0 obj
+<<
+/S /GoTo
+/D [521 0 R /XYZ 67.0 658.866 null]
+>>
+endobj
+45 0 obj
+<<
+/S /GoTo
+/D [521 0 R /XYZ 67.0 234.894 null]
+>>
+endobj
+47 0 obj
+<<
+/S /GoTo
+/D [521 0 R /XYZ 67.0 204.922 null]
+>>
+endobj
+49 0 obj
+<<
+/S /GoTo
+/D [525 0 R /XYZ 67.0 190.386 null]
+>>
+endobj
+51 0 obj
+<<
+/S /GoTo
+/D [529 0 R /XYZ 67.0 134.276 null]
+>>
+endobj
+53 0 obj
+<<
+/S /GoTo
+/D [541 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+55 0 obj
+<<
+/S /GoTo
+/D [541 0 R /XYZ 67.0 625.866 null]
+>>
+endobj
+57 0 obj
+<<
+/S /GoTo
+/D [541 0 R /XYZ 67.0 574.894 null]
+>>
+endobj
+59 0 obj
+<<
+/S /GoTo
+/D [541 0 R /XYZ 67.0 477.283 null]
+>>
+endobj
+61 0 obj
+<<
+/S /GoTo
+/D [541 0 R /XYZ 67.0 379.672 null]
+>>
+endobj
+63 0 obj
+<<
+/S /GoTo
+/D [541 0 R /XYZ 67.0 240.341 null]
+>>
+endobj
+65 0 obj
+<<
+/S /GoTo
+/D [541 0 R /XYZ 67.0 101.01 null]
+>>
+endobj
+67 0 obj
+<<
+/S /GoTo
+/D [545 0 R /XYZ 67.0 632.56 null]
+>>
+endobj
+69 0 obj
+<<
+/S /GoTo
+/D [545 0 R /XYZ 67.0 581.588 null]
+>>
+endobj
+71 0 obj
+<<
+/S /GoTo
+/D [545 0 R /XYZ 67.0 482.837 null]
+>>
+endobj
+73 0 obj
+<<
+/S /GoTo
+/D [545 0 R /XYZ 67.0 129.786 null]
+>>
+endobj
+75 0 obj
+<<
+/S /GoTo
+/D [547 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+77 0 obj
+<<
+/S /GoTo
+/D [547 0 R /XYZ 67.0 637.249 null]
+>>
+endobj
+79 0 obj
+<<
+/S /GoTo
+/D [547 0 R /XYZ 67.0 527.498 null]
+>>
+endobj
+81 0 obj
+<<
+/S /GoTo
+/D [547 0 R /XYZ 67.0 476.526 null]
+>>
+endobj
+83 0 obj
+<<
+/S /GoTo
+/D [547 0 R /XYZ 67.0 388.775 null]
+>>
+endobj
+85 0 obj
+<<
+/S /GoTo
+/D [547 0 R /XYZ 67.0 312.024 null]
+>>
+endobj
+87 0 obj
+<<
+/S /GoTo
+/D [547 0 R /XYZ 67.0 235.273 null]
+>>
+endobj
+89 0 obj
+<<
+/S /GoTo
+/D [547 0 R /XYZ 67.0 125.662 null]
+>>
+endobj
+91 0 obj
+<<
+/S /GoTo
+/D [549 0 R /XYZ 67.0 309.28 null]
+>>
+endobj
+93 0 obj
+<<
+/S /GoTo
+/D [549 0 R /XYZ 67.0 125.949 null]
+>>
+endobj
+95 0 obj
+<<
+/S /GoTo
+/D [551 0 R /XYZ 67.0 467.0 null]
+>>
+endobj
+97 0 obj
+<<
+/S /GoTo
+/D [551 0 R /XYZ 67.0 124.848 null]
+>>
+endobj
+99 0 obj
+<<
+/S /GoTo
+/D [555 0 R /XYZ 67.0 627.98 null]
+>>
+endobj
+104 0 obj
+<<
+/S /GoTo
+/D [555 0 R /XYZ 67.0 223.548 null]
+>>
+endobj
+106 0 obj
+<<
+/S /GoTo
+/D [559 0 R /XYZ 67.0 125.14 null]
+>>
+endobj
+108 0 obj
+<<
+/S /GoTo
+/D [561 0 R /XYZ 67.0 692.0 null]
+>>
+endobj
+110 0 obj
+<<
+/S /GoTo
+/D [561 0 R /XYZ 67.0 303.028 null]
+>>
+endobj
+112 0 obj
+<<
+/S /GoTo
+/D [561 0 R /XYZ 67.0 181.056 null]
+>>
+endobj
+114 0 obj
+<<
+/S /GoTo
+/D [566 0 R /XYZ 67.0 590.0 null]
+>>
+endobj
+116 0 obj
+<<
+/S /GoTo
+/D [566 0 R /XYZ 67.0 474.028 null]
+>>
+endobj
+118 0 obj
+<<
+/S /GoTo
+/D [566 0 R /XYZ 67.0 200.056 null]
+>>
+endobj
+120 0 obj
+<<
+/S /GoTo
+/D [566 0 R /XYZ 67.0 73.084 null]
+>>
+endobj
+122 0 obj
+<<
+/S /GoTo
+/D [575 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+124 0 obj
+<<
+/S /GoTo
+/D [575 0 R /XYZ 67.0 636.866 null]
+>>
+endobj
+126 0 obj
+<<
+/S /GoTo
+/D [575 0 R /XYZ 67.0 585.894 null]
+>>
+endobj
+128 0 obj
+<<
+/S /GoTo
+/D [575 0 R /XYZ 67.0 404.703 null]
+>>
+endobj
+130 0 obj
+<<
+/S /GoTo
+/D [575 0 R /XYZ 67.0 222.512 null]
+>>
+endobj
+132 0 obj
+<<
+/S /GoTo
+/D [575 0 R /XYZ 67.0 171.54 null]
+>>
+endobj
+134 0 obj
+<<
+/S /GoTo
+/D [575 0 R /XYZ 67.0 113.649 null]
+>>
+endobj
+136 0 obj
+<<
+/S /GoTo
+/D [577 0 R /XYZ 67.0 692.0 null]
+>>
+endobj
+138 0 obj
+<<
+/S /GoTo
+/D [577 0 R /XYZ 67.0 137.448 null]
+>>
+endobj
+140 0 obj
+<<
+/S /GoTo
+/D [579 0 R /XYZ 67.0 609.42 null]
+>>
+endobj
+142 0 obj
+<<
+/S /GoTo
+/D [581 0 R /XYZ 67.0 622.0 null]
+>>
+endobj
+144 0 obj
+<<
+/S /GoTo
+/D [581 0 R /XYZ 67.0 429.949 null]
+>>
+endobj
+146 0 obj
+<<
+/S /GoTo
+/D [581 0 R /XYZ 67.0 84.257 null]
+>>
+endobj
+148 0 obj
+<<
+/S /GoTo
+/D [583 0 R /XYZ 67.0 531.809 null]
+>>
+endobj
+150 0 obj
+<<
+/S /GoTo
+/D [585 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+152 0 obj
+<<
+/S /GoTo
+/D [585 0 R /XYZ 67.0 603.866 null]
+>>
+endobj
+154 0 obj
+<<
+/S /GoTo
+/D [585 0 R /XYZ 67.0 531.894 null]
+>>
+endobj
+156 0 obj
+<<
+/S /GoTo
+/D [585 0 R /XYZ 67.0 455.143 null]
+>>
+endobj
+158 0 obj
+<<
+/S /GoTo
+/D [585 0 R /XYZ 67.0 377.392 null]
+>>
+endobj
+160 0 obj
+<<
+/S /GoTo
+/D [585 0 R /XYZ 67.0 326.42 null]
+>>
+endobj
+162 0 obj
+<<
+/S /GoTo
+/D [585 0 R /XYZ 67.0 237.669 null]
+>>
+endobj
+164 0 obj
+<<
+/S /GoTo
+/D [585 0 R /XYZ 67.0 186.697 null]
+>>
+endobj
+166 0 obj
+<<
+/S /GoTo
+/D [585 0 R /XYZ 67.0 108.946 null]
+>>
+endobj
+168 0 obj
+<<
+/S /GoTo
+/D [589 0 R /XYZ 67.0 425.98 null]
+>>
+endobj
+170 0 obj
+<<
+/S /GoTo
+/D [591 0 R /XYZ 67.0 584.98 null]
+>>
+endobj
+172 0 obj
+<<
+/S /GoTo
+/D [591 0 R /XYZ 67.0 225.128 null]
+>>
+endobj
+174 0 obj
+<<
+/S /GoTo
+/D [591 0 R /XYZ 67.0 75.156 null]
+>>
+endobj
+176 0 obj
+<<
+/S /GoTo
+/D [595 0 R /XYZ 67.0 624.028 null]
+>>
+endobj
+178 0 obj
+<<
+/S /GoTo
+/D [595 0 R /XYZ 67.0 556.056 null]
+>>
+endobj
+180 0 obj
+<<
+/S /GoTo
+/D [595 0 R /XYZ 67.0 466.084 null]
+>>
+endobj
+182 0 obj
+<<
+/S /GoTo
+/D [597 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+184 0 obj
+<<
+/S /GoTo
+/D [597 0 R /XYZ 67.0 397.866 null]
+>>
+endobj
+186 0 obj
+<<
+/S /GoTo
+/D [597 0 R /XYZ 67.0 346.894 null]
+>>
+endobj
+188 0 obj
+<<
+/S /GoTo
+/D [597 0 R /XYZ 67.0 269.143 null]
+>>
+endobj
+190 0 obj
+<<
+/S /GoTo
+/D [597 0 R /XYZ 67.0 218.171 null]
+>>
+endobj
+195 0 obj
+<<
+/S /GoTo
+/D [597 0 R /XYZ 67.0 129.42 null]
+>>
+endobj
+197 0 obj
+<<
+/S /GoTo
+/D [603 0 R /XYZ 67.0 409.28 null]
+>>
+endobj
+199 0 obj
+<<
+/S /GoTo
+/D [603 0 R /XYZ 67.0 238.089 null]
+>>
+endobj
+201 0 obj
+<<
+/S /GoTo
+/D [607 0 R /XYZ 67.0 492.12 null]
+>>
+endobj
+203 0 obj
+<<
+/S /GoTo
+/D [607 0 R /XYZ 67.0 91.869 null]
+>>
+endobj
+205 0 obj
+<<
+/S /GoTo
+/D [609 0 R /XYZ 67.0 665.0 null]
+>>
+endobj
+207 0 obj
+<<
+/S /GoTo
+/D [609 0 R /XYZ 67.0 548.028 null]
+>>
+endobj
+209 0 obj
+<<
+/S /GoTo
+/D [609 0 R /XYZ 67.0 207.756 null]
+>>
+endobj
+211 0 obj
+<<
+/S /GoTo
+/D [613 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+213 0 obj
+<<
+/S /GoTo
+/D [613 0 R /XYZ 67.0 658.866 null]
+>>
+endobj
+215 0 obj
+<<
+/S /GoTo
+/D [613 0 R /XYZ 67.0 165.854 null]
+>>
+endobj
+217 0 obj
+<<
+/S /GoTo
+/D [617 0 R /XYZ 67.0 449.38 null]
+>>
+endobj
+219 0 obj
+<<
+/S /GoTo
+/D [619 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+221 0 obj
+<<
+/S /GoTo
+/D [619 0 R /XYZ 67.0 571.866 null]
+>>
+endobj
+223 0 obj
+<<
+/S /GoTo
+/D [619 0 R /XYZ 67.0 520.894 null]
+>>
+endobj
+225 0 obj
+<<
+/S /GoTo
+/D [619 0 R /XYZ 67.0 423.423 null]
+>>
+endobj
+227 0 obj
+<<
+/S /GoTo
+/D [623 0 R /XYZ 67.0 426.14 null]
+>>
+endobj
+229 0 obj
+<<
+/S /GoTo
+/D [623 0 R /XYZ 67.0 176.069 null]
+>>
+endobj
+231 0 obj
+<<
+/S /GoTo
+/D [625 0 R /XYZ 67.0 612.14 null]
+>>
+endobj
+233 0 obj
+<<
+/S /GoTo
+/D [625 0 R /XYZ 67.0 549.168 null]
+>>
+endobj
+235 0 obj
+<<
+/S /GoTo
+/D [625 0 R /XYZ 67.0 363.196 null]
+>>
+endobj
+237 0 obj
+<<
+/S /GoTo
+/D [625 0 R /XYZ 67.0 177.224 null]
+>>
+endobj
+239 0 obj
+<<
+/S /GoTo
+/D [627 0 R /XYZ 67.0 633.0 null]
+>>
+endobj
+241 0 obj
+<<
+/S /GoTo
+/D [627 0 R /XYZ 67.0 388.028 null]
+>>
+endobj
+243 0 obj
+<<
+/S /GoTo
+/D [631 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+245 0 obj
+<<
+/S /GoTo
+/D [631 0 R /XYZ 67.0 538.866 null]
+>>
+endobj
+247 0 obj
+<<
+/S /GoTo
+/D [631 0 R /XYZ 67.0 487.894 null]
+>>
+endobj
+249 0 obj
+<<
+/S /GoTo
+/D [631 0 R /XYZ 67.0 441.003 null]
+>>
+endobj
+251 0 obj
+<<
+/S /GoTo
+/D [631 0 R /XYZ 67.0 393.112 null]
+>>
+endobj
+253 0 obj
+<<
+/S /GoTo
+/D [631 0 R /XYZ 67.0 320.14 null]
+>>
+endobj
+255 0 obj
+<<
+/S /GoTo
+/D [631 0 R /XYZ 67.0 232.389 null]
+>>
+endobj
+257 0 obj
+<<
+/S /GoTo
+/D [631 0 R /XYZ 67.0 185.498 null]
+>>
+endobj
+259 0 obj
+<<
+/S /GoTo
+/D [631 0 R /XYZ 67.0 137.607 null]
+>>
+endobj
+261 0 obj
+<<
+/S /GoTo
+/D [638 0 R /XYZ 67.0 260.98 null]
+>>
+endobj
+263 0 obj
+<<
+/S /GoTo
+/D [638 0 R /XYZ 67.0 68.929 null]
+>>
+endobj
+265 0 obj
+<<
+/S /GoTo
+/D [645 0 R /XYZ 67.0 203.868 null]
+>>
+endobj
+267 0 obj
+<<
+/S /GoTo
+/D [654 0 R /XYZ 67.0 655.14 null]
+>>
+endobj
+269 0 obj
+<<
+/S /GoTo
+/D [654 0 R /XYZ 67.0 581.168 null]
+>>
+endobj
+271 0 obj
+<<
+/S /GoTo
+/D [654 0 R /XYZ 67.0 480.196 null]
+>>
+endobj
+273 0 obj
+<<
+/S /GoTo
+/D [656 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+275 0 obj
+<<
+/S /GoTo
+/D [656 0 R /XYZ 67.0 603.866 null]
+>>
+endobj
+277 0 obj
+<<
+/S /GoTo
+/D [656 0 R /XYZ 67.0 433.894 null]
+>>
+endobj
+282 0 obj
+<<
+/S /GoTo
+/D [667 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+284 0 obj
+<<
+/S /GoTo
+/D [667 0 R /XYZ 67.0 484.866 null]
+>>
+endobj
+286 0 obj
+<<
+/S /GoTo
+/D [667 0 R /XYZ 67.0 433.894 null]
+>>
+endobj
+288 0 obj
+<<
+/S /GoTo
+/D [667 0 R /XYZ 67.0 357.143 null]
+>>
+endobj
+290 0 obj
+<<
+/S /GoTo
+/D [667 0 R /XYZ 67.0 257.392 null]
+>>
+endobj
+292 0 obj
+<<
+/S /GoTo
+/D [671 0 R /XYZ 67.0 302.0 null]
+>>
+endobj
+294 0 obj
+<<
+/S /GoTo
+/D [673 0 R /XYZ 67.0 535.68 null]
+>>
+endobj
+296 0 obj
+<<
+/S /GoTo
+/D [673 0 R /XYZ 67.0 94.108 null]
+>>
+endobj
+298 0 obj
+<<
+/S /GoTo
+/D [675 0 R /XYZ 67.0 236.18 null]
+>>
+endobj
+300 0 obj
+<<
+/S /GoTo
+/D [675 0 R /XYZ 67.0 173.208 null]
+>>
+endobj
+302 0 obj
+<<
+/S /GoTo
+/D [675 0 R /XYZ 67.0 94.236 null]
+>>
+endobj
+304 0 obj
+<<
+/S /GoTo
+/D [679 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+306 0 obj
+<<
+/S /GoTo
+/D [679 0 R /XYZ 67.0 398.866 null]
+>>
+endobj
+308 0 obj
+<<
+/S /GoTo
+/D [679 0 R /XYZ 67.0 325.894 null]
+>>
+endobj
+310 0 obj
+<<
+/S /GoTo
+/D [679 0 R /XYZ 67.0 215.143 null]
+>>
+endobj
+312 0 obj
+<<
+/S /GoTo
+/D [679 0 R /XYZ 67.0 153.171 null]
+>>
+endobj
+314 0 obj
+<<
+/S /GoTo
+/D [681 0 R /XYZ 67.0 683.14 null]
+>>
+endobj
+316 0 obj
+<<
+/S /GoTo
+/D [681 0 R /XYZ 67.0 610.168 null]
+>>
+endobj
+318 0 obj
+<<
+/S /GoTo
+/D [681 0 R /XYZ 67.0 500.417 null]
+>>
+endobj
+320 0 obj
+<<
+/S /GoTo
+/D [681 0 R /XYZ 67.0 400.666 null]
+>>
+endobj
+322 0 obj
+<<
+/S /GoTo
+/D [681 0 R /XYZ 67.0 349.694 null]
+>>
+endobj
+324 0 obj
+<<
+/S /GoTo
+/D [681 0 R /XYZ 67.0 249.943 null]
+>>
+endobj
+326 0 obj
+<<
+/S /GoTo
+/D [681 0 R /XYZ 67.0 198.971 null]
+>>
+endobj
+328 0 obj
+<<
+/S /GoTo
+/D [681 0 R /XYZ 67.0 110.22 null]
+>>
+endobj
+330 0 obj
+<<
+/S /GoTo
+/D [685 0 R /XYZ 67.0 649.0 null]
+>>
+endobj
+332 0 obj
+<<
+/S /GoTo
+/D [687 0 R /XYZ 67.0 638.252 null]
+>>
+endobj
+334 0 obj
+<<
+/S /GoTo
+/D [687 0 R /XYZ 67.0 186.12 null]
+>>
+endobj
+336 0 obj
+<<
+/S /GoTo
+/D [689 0 R /XYZ 67.0 440.66 null]
+>>
+endobj
+338 0 obj
+<<
+/S /GoTo
+/D [689 0 R /XYZ 67.0 377.688 null]
+>>
+endobj
+340 0 obj
+<<
+/S /GoTo
+/D [689 0 R /XYZ 67.0 298.716 null]
+>>
+endobj
+342 0 obj
+<<
+/S /GoTo
+/D [689 0 R /XYZ 67.0 219.744 null]
+>>
+endobj
+344 0 obj
+<<
+/S /GoTo
+/D [689 0 R /XYZ 67.0 140.772 null]
+>>
+endobj
+346 0 obj
+<<
+/S /GoTo
+/D [691 0 R /XYZ 67.0 453.0 null]
+>>
+endobj
+348 0 obj
+<<
+/S /GoTo
+/D [693 0 R /XYZ 67.0 523.0 null]
+>>
+endobj
+350 0 obj
+<<
+/S /GoTo
+/D [700 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+352 0 obj
+<<
+/S /GoTo
+/D [700 0 R /XYZ 67.0 169.386 null]
+>>
+endobj
+354 0 obj
+<<
+/S /GoTo
+/D [700 0 R /XYZ 67.0 97.414 null]
+>>
+endobj
+356 0 obj
+<<
+/S /GoTo
+/D [702 0 R /XYZ 67.0 630.14 null]
+>>
+endobj
+358 0 obj
+<<
+/S /GoTo
+/D [702 0 R /XYZ 67.0 553.389 null]
+>>
+endobj
+360 0 obj
+<<
+/S /GoTo
+/D [702 0 R /XYZ 67.0 411.638 null]
+>>
+endobj
+362 0 obj
+<<
+/S /GoTo
+/D [702 0 R /XYZ 67.0 333.887 null]
+>>
+endobj
+364 0 obj
+<<
+/S /GoTo
+/D [702 0 R /XYZ 67.0 282.915 null]
+>>
+endobj
+366 0 obj
+<<
+/S /GoTo
+/D [702 0 R /XYZ 67.0 183.164 null]
+>>
+endobj
+368 0 obj
+<<
+/S /GoTo
+/D [702 0 R /XYZ 67.0 132.192 null]
+>>
+endobj
+370 0 obj
+<<
+/S /GoTo
+/D [704 0 R /XYZ 67.0 598.28 null]
+>>
+endobj
+375 0 obj
+<<
+/S /GoTo
+/D [704 0 R /XYZ 67.0 539.389 null]
+>>
+endobj
+377 0 obj
+<<
+/S /GoTo
+/D [704 0 R /XYZ 67.0 488.417 null]
+>>
+endobj
+379 0 obj
+<<
+/S /GoTo
+/D [704 0 R /XYZ 67.0 377.666 null]
+>>
+endobj
+381 0 obj
+<<
+/S /GoTo
+/D [706 0 R /XYZ 67.0 709.0 null]
+>>
+endobj
+383 0 obj
+<<
+/S /GoTo
+/D [706 0 R /XYZ 67.0 537.809 null]
+>>
+endobj
+385 0 obj
+<<
+/S /GoTo
+/D [706 0 R /XYZ 67.0 287.117 null]
+>>
+endobj
+387 0 obj
+<<
+/S /GoTo
+/D [708 0 R /XYZ 67.0 577.56 null]
+>>
+endobj
+389 0 obj
+<<
+/S /GoTo
+/D [708 0 R /XYZ 67.0 498.588 null]
+>>
+endobj
+391 0 obj
+<<
+/S /GoTo
+/D [708 0 R /XYZ 67.0 343.616 null]
+>>
+endobj
+393 0 obj
+<<
+/S /GoTo
+/D [710 0 R /XYZ 67.0 591.0 null]
+>>
+endobj
+395 0 obj
+<<
+/S /GoTo
+/D [710 0 R /XYZ 67.0 340.929 null]
+>>
+endobj
+397 0 obj
+<<
+/S /GoTo
+/D [710 0 R /XYZ 67.0 126.957 null]
+>>
+endobj
+399 0 obj
+<<
+/S /GoTo
+/D [714 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+401 0 obj
+<<
+/S /GoTo
+/D [716 0 R /XYZ 67.0 388.252 null]
+>>
+endobj
+403 0 obj
+<<
+/S /GoTo
+/D [716 0 R /XYZ 67.0 315.28 null]
+>>
+endobj
+405 0 obj
+<<
+/S /GoTo
+/D [716 0 R /XYZ 67.0 141.809 null]
+>>
+endobj
+407 0 obj
+<<
+/S /GoTo
+/D [718 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+409 0 obj
+<<
+/S /GoTo
+/D [718 0 R /XYZ 67.0 588.089 null]
+>>
+endobj
+411 0 obj
+<<
+/S /GoTo
+/D [718 0 R /XYZ 67.0 514.117 null]
+>>
+endobj
+413 0 obj
+<<
+/S /GoTo
+/D [718 0 R /XYZ 67.0 413.145 null]
+>>
+endobj
+415 0 obj
+<<
+/S /GoTo
+/D [718 0 R /XYZ 67.0 286.173 null]
+>>
+endobj
+417 0 obj
+<<
+/S /GoTo
+/D [718 0 R /XYZ 67.0 207.201 null]
+>>
+endobj
+419 0 obj
+<<
+/S /GoTo
+/D [720 0 R /XYZ 67.0 708.0 null]
+>>
+endobj
+421 0 obj
+<<
+/S /GoTo
+/D [720 0 R /XYZ 67.0 493.028 null]
+>>
+endobj
+423 0 obj
+<<
+/S /GoTo
+/D [720 0 R /XYZ 67.0 403.056 null]
+>>
+endobj
+425 0 obj
+<<
+/S /GoTo
+/D [720 0 R /XYZ 67.0 198.084 null]
+>>
+endobj
+427 0 obj
+<<
+/S /GoTo
+/D [724 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+429 0 obj
+<<
+/S /GoTo
+/D [738 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+431 0 obj
+<<
+/S /GoTo
+/D [738 0 R /XYZ 67.0 647.866 null]
+>>
+endobj
+433 0 obj
+<<
+/S /GoTo
+/D [738 0 R /XYZ 67.0 518.894 null]
+>>
+endobj
+435 0 obj
+<<
+/S /GoTo
+/D [738 0 R /XYZ 67.0 357.922 null]
+>>
+endobj
+437 0 obj
+<<
+/S /GoTo
+/D [738 0 R /XYZ 67.0 261.95 null]
+>>
+endobj
+439 0 obj
+<<
+/S /GoTo
+/D [740 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+441 0 obj
+<<
+/S /GoTo
+/D [742 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+443 0 obj
+<<
+/S /GoTo
+/D [747 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+445 0 obj
+<<
+/S /GoTo
+/D [749 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+447 0 obj
+<<
+/S /GoTo
+/D [763 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+449 0 obj
+<<
+/S /GoTo
+/D [763 0 R /XYZ 67.0 539.866 null]
+>>
+endobj
+451 0 obj
+<<
+/S /GoTo
+/D [763 0 R /XYZ 67.0 407.894 null]
+>>
+endobj
+456 0 obj
+<<
+/S /GoTo
+/D [763 0 R /XYZ 67.0 190.922 null]
+>>
+endobj
+458 0 obj
+<<
+/S /GoTo
+/D [773 0 R /XYZ 67.0 708.0 null]
+>>
+endobj
+460 0 obj
+<<
+/S /GoTo
+/D [773 0 R /XYZ 67.0 555.028 null]
+>>
+endobj
+462 0 obj
+<<
+/S /GoTo
+/D [773 0 R /XYZ 67.0 354.056 null]
+>>
+endobj
+464 0 obj
+<<
+/S /GoTo
+/D [773 0 R /XYZ 67.0 73.084 null]
+>>
+endobj
+466 0 obj
+<<
+/S /GoTo
+/D [775 0 R /XYZ 67.0 572.028 null]
+>>
+endobj
+468 0 obj
+<<
+/S /GoTo
+/D [775 0 R /XYZ 67.0 339.056 null]
+>>
+endobj
+470 0 obj
+<<
+/S /GoTo
+/D [775 0 R /XYZ 67.0 186.084 null]
+>>
+endobj
+472 0 obj
+<<
+/S /GoTo
+/D [777 0 R /XYZ 67.0 692.0 null]
+>>
+endobj
+474 0 obj
+<<
+/S /GoTo
+/D [777 0 R /XYZ 67.0 555.028 null]
+>>
+endobj
+476 0 obj
+<<
+/S /GoTo
+/D [777 0 R /XYZ 67.0 402.056 null]
+>>
+endobj
+478 0 obj
+<<
+/S /GoTo
+/D [777 0 R /XYZ 67.0 233.084 null]
+>>
+endobj
+480 0 obj
+<<
+/S /GoTo
+/D [777 0 R /XYZ 67.0 112.112 null]
+>>
+endobj
+482 0 obj
+<<
+/S /GoTo
+/D [779 0 R /XYZ 67.0 623.0 null]
+>>
+endobj
+484 0 obj
+<<
+/S /GoTo
+/D [779 0 R /XYZ 67.0 502.028 null]
+>>
+endobj
+486 0 obj
+<<
+/S /GoTo
+/D [779 0 R /XYZ 67.0 365.056 null]
+>>
+endobj
+488 0 obj
+<<
+/S /GoTo
+/D [781 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+490 0 obj
+<<
+/S /GoTo
+/D [791 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+492 0 obj
+<<
+/S /GoTo
+/D [793 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+499 0 obj
+<<
+/S /GoTo
+/D [749 0 R /XYZ 67.0 573.866 null]
+>>
+endobj
+501 0 obj
+<<
+/S /GoTo
+/D [749 0 R /XYZ 67.0 546.866 null]
+>>
+endobj
+504 0 obj
+<<
+/S /GoTo
+/D [749 0 R /XYZ 67.0 659.866 null]
+>>
+endobj
+727 0 obj
+<<
+/S /GoTo
+/D [749 0 R /XYZ 67.0 632.866 null]
+>>
+endobj
+729 0 obj
+<<
+/S /GoTo
+/D [749 0 R /XYZ 67.0 616.866 null]
+>>
+endobj
+731 0 obj
+<<
+/S /GoTo
+/D [749 0 R /XYZ 67.0 519.866 null]
+>>
+endobj
+734 0 obj
+<<
+/S /GoTo
+/D [749 0 R /XYZ 67.0 503.866 null]
+>>
+endobj
+736 0 obj
+<<
+/S /GoTo
+/D [749 0 R /XYZ 67.0 702.866 null]
+>>
+endobj
+745 0 obj
+<<
+/S /GoTo
+/D [749 0 R /XYZ 67.0 675.866 null]
+>>
+endobj
+810 0 obj
+<<
+ /First 812 0 R
+ /Last 1123 0 R
+>> endobj
+811 0 obj
+<<
+/S /GoTo
+/D [6 0 R /XYZ 67.0 454.084 null]
+>>
+endobj
+813 0 obj
+<<
+/S /GoTo
+/D [6 0 R /XYZ 67.0 363.95 null]
+>>
+endobj
+815 0 obj
+<<
+/S /GoTo
+/D [6 0 R /XYZ 67.0 306.816 null]
+>>
+endobj
+817 0 obj
+<<
+/S /GoTo
+/D [8 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+825 0 obj
+<<
+/S /GoTo
+/D [513 0 R /XYZ 67.0 68.287 null]
+>>
+endobj
+827 0 obj
+<<
+/S /GoTo
+/D [517 0 R /XYZ 67.0 645.109 null]
+>>
+endobj
+832 0 obj
+<<
+/S /GoTo
+/D [517 0 R /XYZ 67.0 385.464 null]
+>>
+endobj
+835 0 obj
+<<
+/S /GoTo
+/D [519 0 R /XYZ 67.0 636.56 null]
+>>
+endobj
+840 0 obj
+<<
+/S /GoTo
+/D [521 0 R /XYZ 67.0 234.894 null]
+>>
+endobj
+842 0 obj
+<<
+/S /GoTo
+/D [521 0 R /XYZ 67.0 204.922 null]
+>>
+endobj
+848 0 obj
+<<
+/S /GoTo
+/D [541 0 R /XYZ 67.0 574.894 null]
+>>
+endobj
+850 0 obj
+<<
+/S /GoTo
+/D [541 0 R /XYZ 67.0 477.283 null]
+>>
+endobj
+852 0 obj
+<<
+/S /GoTo
+/D [541 0 R /XYZ 67.0 379.672 null]
+>>
+endobj
+854 0 obj
+<<
+/S /GoTo
+/D [541 0 R /XYZ 67.0 240.341 null]
+>>
+endobj
+856 0 obj
+<<
+/S /GoTo
+/D [541 0 R /XYZ 67.0 101.01 null]
+>>
+endobj
+859 0 obj
+<<
+/S /GoTo
+/D [545 0 R /XYZ 67.0 581.588 null]
+>>
+endobj
+861 0 obj
+<<
+/S /GoTo
+/D [545 0 R /XYZ 67.0 482.837 null]
+>>
+endobj
+864 0 obj
+<<
+/S /GoTo
+/D [545 0 R /XYZ 67.0 78.814 null]
+>>
+endobj
+866 0 obj
+<<
+/S /GoTo
+/D [547 0 R /XYZ 67.0 637.249 null]
+>>
+endobj
+870 0 obj
+<<
+/S /GoTo
+/D [547 0 R /XYZ 67.0 388.775 null]
+>>
+endobj
+872 0 obj
+<<
+/S /GoTo
+/D [547 0 R /XYZ 67.0 312.024 null]
+>>
+endobj
+874 0 obj
+<<
+/S /GoTo
+/D [547 0 R /XYZ 67.0 235.273 null]
+>>
+endobj
+876 0 obj
+<<
+/S /GoTo
+/D [547 0 R /XYZ 67.0 125.662 null]
+>>
+endobj
+879 0 obj
+<<
+/S /GoTo
+/D [549 0 R /XYZ 67.0 125.949 null]
+>>
+endobj
+881 0 obj
+<<
+/S /GoTo
+/D [551 0 R /XYZ 67.0 467.0 null]
+>>
+endobj
+884 0 obj
+<<
+/S /GoTo
+/D [555 0 R /XYZ 67.0 627.98 null]
+>>
+endobj
+888 0 obj
+<<
+/S /GoTo
+/D [561 0 R /XYZ 67.0 692.0 null]
+>>
+endobj
+892 0 obj
+<<
+/S /GoTo
+/D [566 0 R /XYZ 67.0 590.0 null]
+>>
+endobj
+897 0 obj
+<<
+/S /GoTo
+/D [575 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+900 0 obj
+<<
+/S /GoTo
+/D [575 0 R /XYZ 67.0 585.894 null]
+>>
+endobj
+902 0 obj
+<<
+/S /GoTo
+/D [575 0 R /XYZ 67.0 404.703 null]
+>>
+endobj
+907 0 obj
+<<
+/S /GoTo
+/D [577 0 R /XYZ 67.0 692.0 null]
+>>
+endobj
+910 0 obj
+<<
+/S /GoTo
+/D [579 0 R /XYZ 67.0 609.42 null]
+>>
+endobj
+913 0 obj
+<<
+/S /GoTo
+/D [581 0 R /XYZ 67.0 429.949 null]
+>>
+endobj
+917 0 obj
+<<
+/S /GoTo
+/D [585 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+920 0 obj
+<<
+/S /GoTo
+/D [585 0 R /XYZ 67.0 531.894 null]
+>>
+endobj
+922 0 obj
+<<
+/S /GoTo
+/D [585 0 R /XYZ 67.0 455.143 null]
+>>
+endobj
+925 0 obj
+<<
+/S /GoTo
+/D [585 0 R /XYZ 67.0 326.42 null]
+>>
+endobj
+929 0 obj
+<<
+/S /GoTo
+/D [585 0 R /XYZ 67.0 108.946 null]
+>>
+endobj
+938 0 obj
+<<
+/S /GoTo
+/D [597 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+941 0 obj
+<<
+/S /GoTo
+/D [597 0 R /XYZ 67.0 346.894 null]
+>>
+endobj
+944 0 obj
+<<
+/S /GoTo
+/D [597 0 R /XYZ 67.0 218.171 null]
+>>
+endobj
+946 0 obj
+<<
+/S /GoTo
+/D [597 0 R /XYZ 67.0 129.42 null]
+>>
+endobj
+949 0 obj
+<<
+/S /GoTo
+/D [603 0 R /XYZ 67.0 238.089 null]
+>>
+endobj
+957 0 obj
+<<
+/S /GoTo
+/D [613 0 R /XYZ 67.0 658.866 null]
+>>
+endobj
+961 0 obj
+<<
+/S /GoTo
+/D [619 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+964 0 obj
+<<
+/S /GoTo
+/D [619 0 R /XYZ 67.0 520.894 null]
+>>
+endobj
+966 0 obj
+<<
+/S /GoTo
+/D [619 0 R /XYZ 67.0 423.423 null]
+>>
+endobj
+969 0 obj
+<<
+/S /GoTo
+/D [623 0 R /XYZ 67.0 176.069 null]
+>>
+endobj
+982 0 obj
+<<
+/S /GoTo
+/D [631 0 R /XYZ 67.0 320.14 null]
+>>
+endobj
+993 0 obj
+<<
+/S /GoTo
+/D [656 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+997 0 obj
+<<
+/S /GoTo
+/D [667 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+1000 0 obj
+<<
+/S /GoTo
+/D [667 0 R /XYZ 67.0 433.894 null]
+>>
+endobj
+1002 0 obj
+<<
+/S /GoTo
+/D [667 0 R /XYZ 67.0 357.143 null]
+>>
+endobj
+1004 0 obj
+<<
+/S /GoTo
+/D [667 0 R /XYZ 67.0 257.392 null]
+>>
+endobj
+1012 0 obj
+<<
+/S /GoTo
+/D [679 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+1015 0 obj
+<<
+/S /GoTo
+/D [679 0 R /XYZ 67.0 325.894 null]
+>>
+endobj
+1018 0 obj
+<<
+/S /GoTo
+/D [679 0 R /XYZ 67.0 153.171 null]
+>>
+endobj
+1021 0 obj
+<<
+/S /GoTo
+/D [681 0 R /XYZ 67.0 610.168 null]
+>>
+endobj
+1025 0 obj
+<<
+/S /GoTo
+/D [681 0 R /XYZ 67.0 349.694 null]
+>>
+endobj
+1028 0 obj
+<<
+/S /GoTo
+/D [681 0 R /XYZ 67.0 198.971 null]
+>>
+endobj
+1030 0 obj
+<<
+/S /GoTo
+/D [681 0 R /XYZ 67.0 110.22 null]
+>>
+endobj
+1040 0 obj
+<<
+/S /GoTo
+/D [691 0 R /XYZ 67.0 453.0 null]
+>>
+endobj
+1043 0 obj
+<<
+/S /GoTo
+/D [700 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+1046 0 obj
+<<
+/S /GoTo
+/D [700 0 R /XYZ 67.0 97.414 null]
+>>
+endobj
+1048 0 obj
+<<
+/S /GoTo
+/D [702 0 R /XYZ 67.0 630.14 null]
+>>
+endobj
+1050 0 obj
+<<
+/S /GoTo
+/D [702 0 R /XYZ 67.0 553.389 null]
+>>
+endobj
+1052 0 obj
+<<
+/S /GoTo
+/D [702 0 R /XYZ 67.0 411.638 null]
+>>
+endobj
+1055 0 obj
+<<
+/S /GoTo
+/D [702 0 R /XYZ 67.0 282.915 null]
+>>
+endobj
+1058 0 obj
+<<
+/S /GoTo
+/D [702 0 R /XYZ 67.0 132.192 null]
+>>
+endobj
+1062 0 obj
+<<
+/S /GoTo
+/D [704 0 R /XYZ 67.0 488.417 null]
+>>
+endobj
+1064 0 obj
+<<
+/S /GoTo
+/D [704 0 R /XYZ 67.0 377.666 null]
+>>
+endobj
+1075 0 obj
+<<
+/S /GoTo
+/D [714 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+1078 0 obj
+<<
+/S /GoTo
+/D [716 0 R /XYZ 67.0 315.28 null]
+>>
+endobj
+1081 0 obj
+<<
+/S /GoTo
+/D [716 0 R /XYZ 67.0 79.837 null]
+>>
+endobj
+xref
+0 1128
+0000000000 65535 f
+0000326507 00000 n
+0000327357 00000 n
+0000377446 00000 n
+0000000015 00000 n
+0000000071 00000 n
+0000001596 00000 n
+0000001702 00000 n
+0000004211 00000 n
+0000004331 00000 n
+0000004665 00000 n
+0000377566 00000 n
+0000004800 00000 n
+0000377631 00000 n
+0000004935 00000 n
+0000377698 00000 n
+0000005070 00000 n
+0000377765 00000 n
+0000005205 00000 n
+0000377830 00000 n
+0000005340 00000 n
+0000377896 00000 n
+0000005475 00000 n
+0000377963 00000 n
+0000005610 00000 n
+0000378028 00000 n
+0000005745 00000 n
+0000378095 00000 n
+0000005880 00000 n
+0000378162 00000 n
+0000006015 00000 n
+0000378229 00000 n
+0000006150 00000 n
+0000378296 00000 n
+0000006285 00000 n
+0000378363 00000 n
+0000006420 00000 n
+0000378430 00000 n
+0000006555 00000 n
+0000378496 00000 n
+0000006690 00000 n
+0000378563 00000 n
+0000006825 00000 n
+0000378628 00000 n
+0000006960 00000 n
+0000378695 00000 n
+0000007095 00000 n
+0000378762 00000 n
+0000007230 00000 n
+0000378829 00000 n
+0000007364 00000 n
+0000378896 00000 n
+0000007499 00000 n
+0000378963 00000 n
+0000007634 00000 n
+0000379028 00000 n
+0000007769 00000 n
+0000379095 00000 n
+0000007905 00000 n
+0000379162 00000 n
+0000008041 00000 n
+0000379229 00000 n
+0000008176 00000 n
+0000379296 00000 n
+0000008311 00000 n
+0000379363 00000 n
+0000008445 00000 n
+0000379429 00000 n
+0000008580 00000 n
+0000379495 00000 n
+0000008715 00000 n
+0000379562 00000 n
+0000008851 00000 n
+0000379629 00000 n
+0000008986 00000 n
+0000379696 00000 n
+0000009121 00000 n
+0000379761 00000 n
+0000009257 00000 n
+0000379828 00000 n
+0000009392 00000 n
+0000379895 00000 n
+0000009527 00000 n
+0000379962 00000 n
+0000009661 00000 n
+0000380029 00000 n
+0000009796 00000 n
+0000380096 00000 n
+0000009931 00000 n
+0000380163 00000 n
+0000010066 00000 n
+0000380230 00000 n
+0000010201 00000 n
+0000380296 00000 n
+0000010336 00000 n
+0000380363 00000 n
+0000010471 00000 n
+0000380428 00000 n
+0000010604 00000 n
+0000380495 00000 n
+0000010737 00000 n
+0000012998 00000 n
+0000013124 00000 n
+0000013497 00000 n
+0000380561 00000 n
+0000013630 00000 n
+0000380629 00000 n
+0000013763 00000 n
+0000380696 00000 n
+0000013896 00000 n
+0000380762 00000 n
+0000014029 00000 n
+0000380830 00000 n
+0000014162 00000 n
+0000380898 00000 n
+0000014295 00000 n
+0000380964 00000 n
+0000014428 00000 n
+0000381032 00000 n
+0000014561 00000 n
+0000381100 00000 n
+0000014694 00000 n
+0000381167 00000 n
+0000014827 00000 n
+0000381233 00000 n
+0000014962 00000 n
+0000381301 00000 n
+0000015098 00000 n
+0000381369 00000 n
+0000015234 00000 n
+0000381437 00000 n
+0000015369 00000 n
+0000381505 00000 n
+0000015505 00000 n
+0000381572 00000 n
+0000015641 00000 n
+0000381640 00000 n
+0000015776 00000 n
+0000381706 00000 n
+0000015911 00000 n
+0000381774 00000 n
+0000016046 00000 n
+0000381841 00000 n
+0000016181 00000 n
+0000381907 00000 n
+0000016316 00000 n
+0000381975 00000 n
+0000016451 00000 n
+0000382042 00000 n
+0000016586 00000 n
+0000382110 00000 n
+0000016720 00000 n
+0000382176 00000 n
+0000016855 00000 n
+0000382244 00000 n
+0000016990 00000 n
+0000382312 00000 n
+0000017125 00000 n
+0000382380 00000 n
+0000017260 00000 n
+0000382448 00000 n
+0000017395 00000 n
+0000382515 00000 n
+0000017530 00000 n
+0000382583 00000 n
+0000017665 00000 n
+0000382651 00000 n
+0000017800 00000 n
+0000382719 00000 n
+0000017935 00000 n
+0000382786 00000 n
+0000018070 00000 n
+0000382853 00000 n
+0000018205 00000 n
+0000382921 00000 n
+0000018340 00000 n
+0000382988 00000 n
+0000018475 00000 n
+0000383056 00000 n
+0000018610 00000 n
+0000383124 00000 n
+0000018745 00000 n
+0000383192 00000 n
+0000018880 00000 n
+0000383258 00000 n
+0000019015 00000 n
+0000383326 00000 n
+0000019150 00000 n
+0000383394 00000 n
+0000019283 00000 n
+0000383462 00000 n
+0000019416 00000 n
+0000021622 00000 n
+0000021748 00000 n
+0000022105 00000 n
+0000383530 00000 n
+0000022238 00000 n
+0000383597 00000 n
+0000022371 00000 n
+0000383664 00000 n
+0000022504 00000 n
+0000383732 00000 n
+0000022636 00000 n
+0000383799 00000 n
+0000022769 00000 n
+0000383866 00000 n
+0000022902 00000 n
+0000383932 00000 n
+0000023035 00000 n
+0000384000 00000 n
+0000023168 00000 n
+0000384068 00000 n
+0000023301 00000 n
+0000384134 00000 n
+0000023436 00000 n
+0000384202 00000 n
+0000023571 00000 n
+0000384270 00000 n
+0000023706 00000 n
+0000384337 00000 n
+0000023841 00000 n
+0000384403 00000 n
+0000023976 00000 n
+0000384471 00000 n
+0000024111 00000 n
+0000384539 00000 n
+0000024246 00000 n
+0000384607 00000 n
+0000024380 00000 n
+0000384674 00000 n
+0000024515 00000 n
+0000384742 00000 n
+0000024650 00000 n
+0000384809 00000 n
+0000024785 00000 n
+0000384877 00000 n
+0000024920 00000 n
+0000384945 00000 n
+0000025055 00000 n
+0000385013 00000 n
+0000025190 00000 n
+0000385079 00000 n
+0000025325 00000 n
+0000385147 00000 n
+0000025460 00000 n
+0000385213 00000 n
+0000025595 00000 n
+0000385281 00000 n
+0000025731 00000 n
+0000385349 00000 n
+0000025867 00000 n
+0000385417 00000 n
+0000026002 00000 n
+0000385485 00000 n
+0000026137 00000 n
+0000385552 00000 n
+0000026273 00000 n
+0000385620 00000 n
+0000026409 00000 n
+0000385688 00000 n
+0000026544 00000 n
+0000385756 00000 n
+0000026679 00000 n
+0000385823 00000 n
+0000026814 00000 n
+0000385890 00000 n
+0000026949 00000 n
+0000385958 00000 n
+0000027084 00000 n
+0000386025 00000 n
+0000027219 00000 n
+0000386093 00000 n
+0000027354 00000 n
+0000386161 00000 n
+0000027489 00000 n
+0000386227 00000 n
+0000027624 00000 n
+0000386295 00000 n
+0000027758 00000 n
+0000030079 00000 n
+0000030205 00000 n
+0000030586 00000 n
+0000386363 00000 n
+0000030719 00000 n
+0000386429 00000 n
+0000030854 00000 n
+0000386497 00000 n
+0000030990 00000 n
+0000386565 00000 n
+0000031126 00000 n
+0000386633 00000 n
+0000031261 00000 n
+0000386701 00000 n
+0000031396 00000 n
+0000386767 00000 n
+0000031531 00000 n
+0000386834 00000 n
+0000031666 00000 n
+0000386901 00000 n
+0000031801 00000 n
+0000386968 00000 n
+0000031936 00000 n
+0000387036 00000 n
+0000032071 00000 n
+0000387103 00000 n
+0000032206 00000 n
+0000387169 00000 n
+0000032341 00000 n
+0000387237 00000 n
+0000032476 00000 n
+0000387305 00000 n
+0000032611 00000 n
+0000387373 00000 n
+0000032747 00000 n
+0000387441 00000 n
+0000032882 00000 n
+0000387508 00000 n
+0000033017 00000 n
+0000387576 00000 n
+0000033152 00000 n
+0000387644 00000 n
+0000033287 00000 n
+0000387712 00000 n
+0000033422 00000 n
+0000387780 00000 n
+0000033557 00000 n
+0000387848 00000 n
+0000033691 00000 n
+0000387916 00000 n
+0000033826 00000 n
+0000387983 00000 n
+0000033961 00000 n
+0000388049 00000 n
+0000034096 00000 n
+0000388117 00000 n
+0000034231 00000 n
+0000388184 00000 n
+0000034366 00000 n
+0000388251 00000 n
+0000034500 00000 n
+0000388319 00000 n
+0000034635 00000 n
+0000388387 00000 n
+0000034770 00000 n
+0000388455 00000 n
+0000034905 00000 n
+0000388523 00000 n
+0000035040 00000 n
+0000388589 00000 n
+0000035175 00000 n
+0000388655 00000 n
+0000035309 00000 n
+0000388721 00000 n
+0000035444 00000 n
+0000388789 00000 n
+0000035579 00000 n
+0000388856 00000 n
+0000035714 00000 n
+0000388923 00000 n
+0000035850 00000 n
+0000388991 00000 n
+0000035985 00000 n
+0000389059 00000 n
+0000036120 00000 n
+0000389127 00000 n
+0000036256 00000 n
+0000389195 00000 n
+0000036391 00000 n
+0000389263 00000 n
+0000036526 00000 n
+0000389331 00000 n
+0000036660 00000 n
+0000038949 00000 n
+0000039075 00000 n
+0000039408 00000 n
+0000389398 00000 n
+0000039541 00000 n
+0000389466 00000 n
+0000039675 00000 n
+0000389534 00000 n
+0000039808 00000 n
+0000389602 00000 n
+0000039940 00000 n
+0000389668 00000 n
+0000040073 00000 n
+0000389736 00000 n
+0000040206 00000 n
+0000389804 00000 n
+0000040339 00000 n
+0000389871 00000 n
+0000040472 00000 n
+0000389939 00000 n
+0000040605 00000 n
+0000390007 00000 n
+0000040738 00000 n
+0000390073 00000 n
+0000040871 00000 n
+0000390141 00000 n
+0000041004 00000 n
+0000390209 00000 n
+0000041137 00000 n
+0000390275 00000 n
+0000041272 00000 n
+0000390343 00000 n
+0000041407 00000 n
+0000390410 00000 n
+0000041542 00000 n
+0000390478 00000 n
+0000041677 00000 n
+0000390544 00000 n
+0000041812 00000 n
+0000390612 00000 n
+0000041947 00000 n
+0000390680 00000 n
+0000042081 00000 n
+0000390748 00000 n
+0000042216 00000 n
+0000390816 00000 n
+0000042351 00000 n
+0000390884 00000 n
+0000042486 00000 n
+0000390950 00000 n
+0000042621 00000 n
+0000391018 00000 n
+0000042756 00000 n
+0000391086 00000 n
+0000042891 00000 n
+0000391154 00000 n
+0000043026 00000 n
+0000391220 00000 n
+0000043160 00000 n
+0000391286 00000 n
+0000043295 00000 n
+0000391354 00000 n
+0000043430 00000 n
+0000391422 00000 n
+0000043565 00000 n
+0000391490 00000 n
+0000043700 00000 n
+0000391557 00000 n
+0000043834 00000 n
+0000391623 00000 n
+0000043969 00000 n
+0000391689 00000 n
+0000044104 00000 n
+0000391755 00000 n
+0000044239 00000 n
+0000391821 00000 n
+0000044374 00000 n
+0000391887 00000 n
+0000044508 00000 n
+0000391955 00000 n
+0000044641 00000 n
+0000045955 00000 n
+0000046081 00000 n
+0000046254 00000 n
+0000392023 00000 n
+0000046387 00000 n
+0000392091 00000 n
+0000046520 00000 n
+0000392157 00000 n
+0000046652 00000 n
+0000392225 00000 n
+0000046786 00000 n
+0000392293 00000 n
+0000046919 00000 n
+0000392360 00000 n
+0000047052 00000 n
+0000392428 00000 n
+0000047185 00000 n
+0000392496 00000 n
+0000047318 00000 n
+0000392564 00000 n
+0000047451 00000 n
+0000392630 00000 n
+0000047584 00000 n
+0000392698 00000 n
+0000047717 00000 n
+0000392766 00000 n
+0000047850 00000 n
+0000392834 00000 n
+0000047982 00000 n
+0000392902 00000 n
+0000048115 00000 n
+0000392968 00000 n
+0000048248 00000 n
+0000393036 00000 n
+0000048381 00000 n
+0000393104 00000 n
+0000048514 00000 n
+0000393170 00000 n
+0000048649 00000 n
+0000393236 00000 n
+0000048783 00000 n
+0000051568 00000 n
+0000051694 00000 n
+0000051779 00000 n
+0000051918 00000 n
+0000052054 00000 n
+0000393302 00000 n
+0000052193 00000 n
+0000393370 00000 n
+0000052332 00000 n
+0000052470 00000 n
+0000393438 00000 n
+0000052606 00000 n
+0000052744 00000 n
+0000052879 00000 n
+0000055334 00000 n
+0000055460 00000 n
+0000055497 00000 n
+0000055631 00000 n
+0000055769 00000 n
+0000058048 00000 n
+0000058174 00000 n
+0000058203 00000 n
+0000058338 00000 n
+0000060942 00000 n
+0000061052 00000 n
+0000063274 00000 n
+0000063384 00000 n
+0000066014 00000 n
+0000066140 00000 n
+0000066169 00000 n
+0000066306 00000 n
+0000069193 00000 n
+0000069319 00000 n
+0000069348 00000 n
+0000069486 00000 n
+0000072038 00000 n
+0000072164 00000 n
+0000072209 00000 n
+0000072344 00000 n
+0000072479 00000 n
+0000072614 00000 n
+0000073438 00000 n
+0000073564 00000 n
+0000073609 00000 n
+0000073743 00000 n
+0000073877 00000 n
+0000074012 00000 n
+0000075932 00000 n
+0000076058 00000 n
+0000076087 00000 n
+0000076225 00000 n
+0000078000 00000 n
+0000078110 00000 n
+0000079711 00000 n
+0000079821 00000 n
+0000082257 00000 n
+0000082367 00000 n
+0000084119 00000 n
+0000084229 00000 n
+0000085813 00000 n
+0000085923 00000 n
+0000088327 00000 n
+0000088453 00000 n
+0000088482 00000 n
+0000088619 00000 n
+0000090431 00000 n
+0000090541 00000 n
+0000092700 00000 n
+0000092826 00000 n
+0000092863 00000 n
+0000093002 00000 n
+0000093137 00000 n
+0000095183 00000 n
+0000095309 00000 n
+0000095362 00000 n
+0000095497 00000 n
+0000095630 00000 n
+0000095767 00000 n
+0000095904 00000 n
+0000097273 00000 n
+0000097383 00000 n
+0000099149 00000 n
+0000099259 00000 n
+0000101073 00000 n
+0000101183 00000 n
+0000103307 00000 n
+0000103417 00000 n
+0000105307 00000 n
+0000105417 00000 n
+0000106598 00000 n
+0000106708 00000 n
+0000108252 00000 n
+0000108378 00000 n
+0000108407 00000 n
+0000108542 00000 n
+0000110476 00000 n
+0000110586 00000 n
+0000112848 00000 n
+0000112974 00000 n
+0000113003 00000 n
+0000113142 00000 n
+0000114272 00000 n
+0000114382 00000 n
+0000116888 00000 n
+0000117014 00000 n
+0000117059 00000 n
+0000117196 00000 n
+0000117335 00000 n
+0000117474 00000 n
+0000119371 00000 n
+0000119497 00000 n
+0000119526 00000 n
+0000119661 00000 n
+0000121692 00000 n
+0000121802 00000 n
+0000123982 00000 n
+0000124092 00000 n
+0000124945 00000 n
+0000125055 00000 n
+0000127132 00000 n
+0000127258 00000 n
+0000127287 00000 n
+0000127426 00000 n
+0000128798 00000 n
+0000128908 00000 n
+0000131209 00000 n
+0000131335 00000 n
+0000131364 00000 n
+0000131501 00000 n
+0000133482 00000 n
+0000133592 00000 n
+0000135171 00000 n
+0000135281 00000 n
+0000137243 00000 n
+0000137353 00000 n
+0000138059 00000 n
+0000138169 00000 n
+0000140158 00000 n
+0000140284 00000 n
+0000140337 00000 n
+0000140474 00000 n
+0000140611 00000 n
+0000140748 00000 n
+0000140885 00000 n
+0000142940 00000 n
+0000143066 00000 n
+0000143119 00000 n
+0000143256 00000 n
+0000143393 00000 n
+0000143530 00000 n
+0000143665 00000 n
+0000145934 00000 n
+0000146060 00000 n
+0000146129 00000 n
+0000146268 00000 n
+0000146407 00000 n
+0000146546 00000 n
+0000146685 00000 n
+0000146824 00000 n
+0000146963 00000 n
+0000148384 00000 n
+0000148494 00000 n
+0000151084 00000 n
+0000151210 00000 n
+0000151247 00000 n
+0000151386 00000 n
+0000151525 00000 n
+0000152622 00000 n
+0000152748 00000 n
+0000152793 00000 n
+0000152928 00000 n
+0000153063 00000 n
+0000153198 00000 n
+0000155787 00000 n
+0000155897 00000 n
+0000157933 00000 n
+0000158043 00000 n
+0000160398 00000 n
+0000160508 00000 n
+0000162340 00000 n
+0000162450 00000 n
+0000164310 00000 n
+0000164420 00000 n
+0000164946 00000 n
+0000165056 00000 n
+0000167398 00000 n
+0000167508 00000 n
+0000169078 00000 n
+0000169188 00000 n
+0000171294 00000 n
+0000171404 00000 n
+0000173633 00000 n
+0000173743 00000 n
+0000175718 00000 n
+0000175828 00000 n
+0000177703 00000 n
+0000177813 00000 n
+0000179755 00000 n
+0000179865 00000 n
+0000181567 00000 n
+0000181693 00000 n
+0000181746 00000 n
+0000181885 00000 n
+0000182024 00000 n
+0000182163 00000 n
+0000182302 00000 n
+0000184916 00000 n
+0000185026 00000 n
+0000186767 00000 n
+0000186877 00000 n
+0000188943 00000 n
+0000189053 00000 n
+0000190919 00000 n
+0000191029 00000 n
+0000192963 00000 n
+0000193073 00000 n
+0000195223 00000 n
+0000195333 00000 n
+0000196141 00000 n
+0000196251 00000 n
+0000198842 00000 n
+0000198952 00000 n
+0000201334 00000 n
+0000201444 00000 n
+0000203113 00000 n
+0000203223 00000 n
+0000205159 00000 n
+0000205269 00000 n
+0000206227 00000 n
+0000206337 00000 n
+0000208273 00000 n
+0000208399 00000 n
+0000208468 00000 n
+0000393506 00000 n
+0000208605 00000 n
+0000393574 00000 n
+0000208744 00000 n
+0000393642 00000 n
+0000208883 00000 n
+0000209019 00000 n
+0000393710 00000 n
+0000209158 00000 n
+0000393778 00000 n
+0000209296 00000 n
+0000212108 00000 n
+0000212218 00000 n
+0000212761 00000 n
+0000212871 00000 n
+0000214267 00000 n
+0000214393 00000 n
+0000214422 00000 n
+0000393846 00000 n
+0000214561 00000 n
+0000215585 00000 n
+0000215695 00000 n
+0000218896 00000 n
+0000219022 00000 n
+0000219131 00000 n
+0000219322 00000 n
+0000219513 00000 n
+0000219704 00000 n
+0000219895 00000 n
+0000220086 00000 n
+0000220276 00000 n
+0000220467 00000 n
+0000220657 00000 n
+0000220847 00000 n
+0000221038 00000 n
+0000221229 00000 n
+0000222970 00000 n
+0000223096 00000 n
+0000223173 00000 n
+0000223311 00000 n
+0000223449 00000 n
+0000223588 00000 n
+0000223727 00000 n
+0000223865 00000 n
+0000224003 00000 n
+0000224141 00000 n
+0000225174 00000 n
+0000225284 00000 n
+0000226332 00000 n
+0000226442 00000 n
+0000227440 00000 n
+0000227550 00000 n
+0000228350 00000 n
+0000228460 00000 n
+0000230737 00000 n
+0000230863 00000 n
+0000230924 00000 n
+0000231111 00000 n
+0000231289 00000 n
+0000231471 00000 n
+0000231651 00000 n
+0000231827 00000 n
+0000232251 00000 n
+0000232361 00000 n
+0000233733 00000 n
+0000233843 00000 n
+0000238078 00000 n
+0000238204 00000 n
+0000238225 00000 n
+0000242612 00000 n
+0000242738 00000 n
+0000242759 00000 n
+0000246950 00000 n
+0000247076 00000 n
+0000247097 00000 n
+0000250784 00000 n
+0000250910 00000 n
+0000250931 00000 n
+0000254978 00000 n
+0000255104 00000 n
+0000255125 00000 n
+0000256414 00000 n
+0000256540 00000 n
+0000393914 00000 n
+0000393969 00000 n
+0000256561 00000 n
+0000394035 00000 n
+0000256758 00000 n
+0000394100 00000 n
+0000256954 00000 n
+0000394166 00000 n
+0000257103 00000 n
+0000257304 00000 n
+0000257529 00000 n
+0000257764 00000 n
+0000258015 00000 n
+0000258165 00000 n
+0000258416 00000 n
+0000394230 00000 n
+0000258661 00000 n
+0000394297 00000 n
+0000258934 00000 n
+0000259201 00000 n
+0000259461 00000 n
+0000259711 00000 n
+0000394365 00000 n
+0000260165 00000 n
+0000260559 00000 n
+0000394433 00000 n
+0000261026 00000 n
+0000261429 00000 n
+0000261734 00000 n
+0000262034 00000 n
+0000394500 00000 n
+0000262287 00000 n
+0000394568 00000 n
+0000262589 00000 n
+0000262929 00000 n
+0000263289 00000 n
+0000263458 00000 n
+0000263747 00000 n
+0000394636 00000 n
+0000264072 00000 n
+0000394704 00000 n
+0000264253 00000 n
+0000394772 00000 n
+0000264520 00000 n
+0000394840 00000 n
+0000264861 00000 n
+0000394908 00000 n
+0000265243 00000 n
+0000265569 00000 n
+0000394975 00000 n
+0000265956 00000 n
+0000395043 00000 n
+0000266223 00000 n
+0000266433 00000 n
+0000395111 00000 n
+0000266778 00000 n
+0000395178 00000 n
+0000267051 00000 n
+0000267279 00000 n
+0000267548 00000 n
+0000395246 00000 n
+0000267844 00000 n
+0000395314 00000 n
+0000268138 00000 n
+0000395382 00000 n
+0000268426 00000 n
+0000395450 00000 n
+0000268705 00000 n
+0000268998 00000 n
+0000395518 00000 n
+0000269244 00000 n
+0000395586 00000 n
+0000269442 00000 n
+0000269740 00000 n
+0000395652 00000 n
+0000270032 00000 n
+0000270348 00000 n
+0000270618 00000 n
+0000395719 00000 n
+0000270905 00000 n
+0000271173 00000 n
+0000271471 00000 n
+0000395785 00000 n
+0000271775 00000 n
+0000272061 00000 n
+0000272335 00000 n
+0000272609 00000 n
+0000395851 00000 n
+0000272880 00000 n
+0000273181 00000 n
+0000395917 00000 n
+0000273501 00000 n
+0000395985 00000 n
+0000273717 00000 n
+0000273927 00000 n
+0000274273 00000 n
+0000274489 00000 n
+0000396053 00000 n
+0000274699 00000 n
+0000275201 00000 n
+0000396119 00000 n
+0000275600 00000 n
+0000276096 00000 n
+0000396186 00000 n
+0000276296 00000 n
+0000276560 00000 n
+0000276778 00000 n
+0000396254 00000 n
+0000277050 00000 n
+0000277340 00000 n
+0000396320 00000 n
+0000277642 00000 n
+0000396388 00000 n
+0000277915 00000 n
+0000278188 00000 n
+0000396456 00000 n
+0000278641 00000 n
+0000278917 00000 n
+0000279252 00000 n
+0000396523 00000 n
+0000279528 00000 n
+0000279855 00000 n
+0000280177 00000 n
+0000280464 00000 n
+0000280745 00000 n
+0000281014 00000 n
+0000281283 00000 n
+0000281617 00000 n
+0000396591 00000 n
+0000281894 00000 n
+0000282149 00000 n
+0000396657 00000 n
+0000282416 00000 n
+0000282733 00000 n
+0000396725 00000 n
+0000283074 00000 n
+0000396793 00000 n
+0000283321 00000 n
+0000283591 00000 n
+0000396860 00000 n
+0000283815 00000 n
+0000284144 00000 n
+0000284344 00000 n
+0000284625 00000 n
+0000284894 00000 n
+0000285255 00000 n
+0000285711 00000 n
+0000396928 00000 n
+0000285947 00000 n
+0000286172 00000 n
+0000286366 00000 n
+0000396996 00000 n
+0000286638 00000 n
+0000286869 00000 n
+0000397062 00000 n
+0000287189 00000 n
+0000397130 00000 n
+0000287464 00000 n
+0000287698 00000 n
+0000397198 00000 n
+0000287944 00000 n
+0000288136 00000 n
+0000288423 00000 n
+0000288686 00000 n
+0000288979 00000 n
+0000289248 00000 n
+0000289541 00000 n
+0000289807 00000 n
+0000290103 00000 n
+0000290423 00000 n
+0000290639 00000 n
+0000290849 00000 n
+0000397266 00000 n
+0000291172 00000 n
+0000291445 00000 n
+0000291676 00000 n
+0000291886 00000 n
+0000292270 00000 n
+0000292551 00000 n
+0000292982 00000 n
+0000293310 00000 n
+0000293597 00000 n
+0000293866 00000 n
+0000397333 00000 n
+0000294120 00000 n
+0000294444 00000 n
+0000294721 00000 n
+0000397399 00000 n
+0000294980 00000 n
+0000295218 00000 n
+0000397465 00000 n
+0000295622 00000 n
+0000397534 00000 n
+0000295822 00000 n
+0000397603 00000 n
+0000296051 00000 n
+0000296295 00000 n
+0000296490 00000 n
+0000296804 00000 n
+0000297110 00000 n
+0000297405 00000 n
+0000297694 00000 n
+0000397672 00000 n
+0000297973 00000 n
+0000298232 00000 n
+0000397739 00000 n
+0000298645 00000 n
+0000299024 00000 n
+0000397808 00000 n
+0000299411 00000 n
+0000299632 00000 n
+0000397877 00000 n
+0000299919 00000 n
+0000300249 00000 n
+0000300554 00000 n
+0000397946 00000 n
+0000300906 00000 n
+0000301291 00000 n
+0000398015 00000 n
+0000301649 00000 n
+0000398084 00000 n
+0000302045 00000 n
+0000302356 00000 n
+0000302616 00000 n
+0000302949 00000 n
+0000303273 00000 n
+0000303569 00000 n
+0000303853 00000 n
+0000304136 00000 n
+0000304443 00000 n
+0000398152 00000 n
+0000304744 00000 n
+0000305040 00000 n
+0000398219 00000 n
+0000305313 00000 n
+0000305573 00000 n
+0000398286 00000 n
+0000305844 00000 n
+0000398354 00000 n
+0000306173 00000 n
+0000398422 00000 n
+0000306524 00000 n
+0000398491 00000 n
+0000306777 00000 n
+0000307112 00000 n
+0000398560 00000 n
+0000307458 00000 n
+0000307661 00000 n
+0000398629 00000 n
+0000308083 00000 n
+0000308291 00000 n
+0000308509 00000 n
+0000398698 00000 n
+0000308867 00000 n
+0000398767 00000 n
+0000309117 00000 n
+0000309393 00000 n
+0000309618 00000 n
+0000309948 00000 n
+0000310244 00000 n
+0000310534 00000 n
+0000310812 00000 n
+0000311163 00000 n
+0000311480 00000 n
+0000311781 00000 n
+0000398836 00000 n
+0000312054 00000 n
+0000312438 00000 n
+0000398903 00000 n
+0000312833 00000 n
+0000313099 00000 n
+0000398971 00000 n
+0000313445 00000 n
+0000313823 00000 n
+0000314119 00000 n
+0000314409 00000 n
+0000314693 00000 n
+0000314971 00000 n
+0000315249 00000 n
+0000315592 00000 n
+0000315894 00000 n
+0000316195 00000 n
+0000316532 00000 n
+0000316860 00000 n
+0000317160 00000 n
+0000317422 00000 n
+0000317746 00000 n
+0000318030 00000 n
+0000318244 00000 n
+0000318476 00000 n
+0000318720 00000 n
+0000318935 00000 n
+0000319114 00000 n
+0000319411 00000 n
+0000319900 00000 n
+0000320174 00000 n
+0000320460 00000 n
+0000320705 00000 n
+0000320991 00000 n
+0000321159 00000 n
+0000321509 00000 n
+0000321753 00000 n
+0000322224 00000 n
+0000322560 00000 n
+0000322884 00000 n
+0000323138 00000 n
+0000323380 00000 n
+0000323870 00000 n
+0000324295 00000 n
+0000324679 00000 n
+0000324921 00000 n
+0000325359 00000 n
+0000325569 00000 n
+0000325945 00000 n
+0000326063 00000 n
+0000326175 00000 n
+0000326288 00000 n
+0000326396 00000 n
+trailer
+<<
+/Size 1128
+/Root 2 0 R
+/Info 4 0 R
+>>
+startxref
+399039
+%%EOF
diff --git a/vendor/sabre/dav/docs/rfc3744.pdf b/vendor/sabre/dav/docs/rfc3744.pdf
new file mode 100644
index 000000000..45e8560d4
--- /dev/null
+++ b/vendor/sabre/dav/docs/rfc3744.pdf
@@ -0,0 +1,6295 @@
+%PDF-1.3
+%ª«¬­
+4 0 obj
+<< /Type /Info
+/Producer (FOP 0.20.5) >>
+endobj
+5 0 obj
+<< /Length 1466 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GatU3>B?8p&:Vs/i%^YATce6MDf4!n[PMV\$)`'Iq]LN-1^1g[6rNd2T>_UK!I!0WPF37'm:uCMh/B-6ai0a]^iCIMZ'+e!mO,\eXNcH73Ul38&HQ%q'&/DIUpRjAIV/FFa<+L7?R0=:?Tu:FY;X)PD^h+n?9Jo4c]7$'M!Y-49u5!Cb5-!%T*DneDR[dkqmU!+pKD>UOU4mNXO?BN0Cg=E*uGFmfQ.M.+5bmMm2X,@\)`9Y[LmP<Cd2Z<AQ39A(F>6A/I%d[q,&[;KHe&rcOW^Gq%#C9eW3'ZS6987GPc8'A(>=pR2Uh=Gdcd>@6!T(^.0,)ZE0^>BKmbc5ccYq3h7q^EPX>`Z5/U</ukW9/@)&'$N72-`mHs2>dKsJCoA-F[NAVF(NaElfJhG]>%rj6ONjs@/3>s\icca;l*aY:NcRnbS%Ha^BD\ttWlN&<^k3d!Cr[cIr?o&=ol%ChP-5eKZ<fM/F=s@d_3"*ajXZN%5Va*+>J%B9YKNt4"N9s5GjrP%hoO^P0MbWE'Sa?M;A?fP+b^\G/*UR8c.I2^lMIh\%Y6oCl38+@li(&M*.>A1V<BK)c&PU&b65+oYacQaR7NgUfm8LT=j#?d.1B>Yr3=[D<X^L;qaVb)kO;Z!!)3*ucIk5T.F:@ZEP9%LO[?TkP@8+k,6t$*O_7pqNDdBSQo(V-bm"Tm!d2@[?:$3hCe%:"p(mn-MIDRs$jS1U"Ih;I)W7r\CVr@mmmqRmLc<?=bBhE3:5_[lJ8($?/4LNA=:bo<\.p'Kg]#`?>N5<$*_V+bU1QCS6*jMRs)uL+lNq-qlhrX'@2!502$QSmr',ddf/H^G945c`I]\OA+L[hDGSiB6hFbN(;2ROFbu==>a*O=qa(MJ)8`6=gFhWJL7EV%TiiKRn]=^H1c3mS[&+*sWH5L]s56"CI0TG,NJDYaN=sD=s`CclGSd#.HT$UOY2U6cn?jpQQ;+Ne/JGZP?)PuX%+h84'CijM.?Ho9(K``rZZ&>=)3CPQ3Cs=K;_f9jY$^$*N&'AR]Yb.@aas=!N/@-F1Im,4rj#0OWq[c>dKJ&\<9j2K\PLs6Q4)c$m:-]Ep4X;?7ArTEO%]42+KWO+sFC'1qO>Nr.FF70eM!A;e.&Kr@:5_HOTGj%Sq%[q[XX#rp2,.r3-B*uuND)),_mE$W[!90>I(tI'_\T[STQH-FDP`:p24b6"b7@1M^r4!+-B-ff8GBCIAZP3//0"T4:m<gO?-6r?bA<3f##t639_O)k"%8fNka:fd5_.<e#=>nj19j3k156ft=%tjAE"79-OV=<[`;[V0Hq^1JVAlVc.%HNb<^9>*&[kB.\;$Sdb.'-%g"++F%#"7,9NBuCFPGggS96+&,,RD?MUtRB-L`Ic)eEt^hN[eW=j_7+c1hoA*'8,#o<>o<+pQ&_^TSm6D_H"ufuop*7M0TUH\).(0R+ZdlgFNE_3+K6`ID;&`cM~>
+endstream
+endobj
+6 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 5 0 R
+>>
+endobj
+7 0 obj
+<< /Length 2193 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!$JbAu>q'Sc@2$LXq<<%%`u!19>C,b9&*NlP/R74&CGJe_$,;F=;VoC`>QR`(=R&^J?PZA;$0Iggce3&`V-/hVTu,9ju9NYZgT3*K[N#jX]#&la?-E/I31UW#.f0O&(s)tbDDdfeudR[&*qcW=[TX.nIcLd":dh]&&pYmKc:M%RS+4bDD2blnq1R%uj%Wccg*,XVmf]IiEK>TK,Q?5B*Ch_\aEYp0R$`_-sj3&(Q"%UCi?N\a(;LMe)<.ZRL:<GhIoC/f*pJ_*XkApbKbA!S-Rmg8PodcEn"H+Bq>b;qG>Q>M/MheQ$>T6a)+$jd6B9[0PBjq\AlR2A)_<$7X<]-$4e*)]jZ?00$\hdm`[U)9Ym6,D&e`g1%'\:H$@Y(erGZFuSa&=BNG_!^fR=tBX;P_aB/Ql='014_#8=_3nZ"h#\qLuXM%?sj):=-nEOXAlXnO(h,6#?7KiE+iZp?=;I-k-BWP"EShl"u`,0]KTDBXTF&FrO"lu;^6=KEO?Jkj%?,*C]&E8\6N$hCVHjlSZ:u1*7PO?3XHouTsZ=0@;0mYYSS"K/gqJ@b#S,-Q;'X^8;ST_$>=0(8e7_BI"mmb<ZP(0+=UB'80*R^\bnDY#jRd'TT(B43Qp3n3EQE;G9.$JGf'>?>AaL^R5umM<i5"iQehWp/=(n?0#Cus<<m;bW%*2ukD-aNFPpnBc1`^[<9cM5:h]bupbX^_GkhUVb[hn=i=4q1n0YiF'UnjV,fZ0FI,k\e%K^qp#`Bc.o\7"a/Za'K*QQODe<'N<Mg04G(B[N?LQ4)q"J=nH\GcbEBk!40B,9)h@E#Ha+0XC&=Rf6ncShJP:^E:2d(n.qSCLC[#(R9sfu\Klh?%b@Qg8djelag,o$--r/%&9!H(fWRkA)\aU/Nh"^ZDH*OdH5gK7f"?eXI<@0$!9VgLgU_2jeRKoG,'[kB+TaToCFr1U_+rC8X*<*p^.BI=O`>d0o<IJZ:`7[Ao*XkKil]DjtLY'@eou%^f61ZHMfJJ/;b7M9@<O[g">"B_UFtRaF38U81=XW1+]"[qt8pB,Kkek:d6ZW.E)F>$'fo2rCY&XY*D)gdiPZTQFp0W!/EW!CTj&:gbLW<6'O_TCSO+H=MBM)3dljVbMmC-n#OYF=`R8mFK;skpE4<R`jejm@@sMGnO,B_#`Clp(CQ!)BW]Eq^/D*4r9si_Gk[]"2d/r)/h#i(TR$i;3NDfiUp.0)-D't,lk?5PeC^$+K:Hs2:W0AKWkF![_%NFfmDA2WiKC\kJb%4ll8oE3)U'b:;A?QB2AmC;2(78(6pC47<RkEXd=14[QA+=;4%7-J%8L8ZS;'$FXdR0pM'Cc,Y@IR8")+J?sk,Y<*^"'Sk=R4JCd$%?%:DikC^WE.[D]d^iBLT%&s26[k"L_Xc>nWSnTuN!ZIFCO2QK0p-u$3G_1R6.gueh=o[NoHs[DlR!h'LS^n&@Nhl0u]i"[t:b@))IOmH&%.=!3_*2t,I`EZU*<_[B5\1r(gmHX`4=ELPJ4@8>,CL#nZoOL$&'jO4@LW&8HQGA?"+6\AIrZT!^=OW[E_Euun3D#5IIhKoce%-nO'%e$1uNht&ZDooJU3+K7"Up?pt,kNC]eRpet1JC'#`bJhp#)K_!3#qT!GYG/RldNeG4Xao'/)OKnnWJB@)8C-Vuo_,.J%8Bq%kD11.E(3/,.7.lJLQ^j`=>pXEdB9`())^'sX4Z%+a1-AU@]\c_F7!o],?+Y>fXGiW^QXTi-2'T$tAj;F`ohf>6HH?h4RH&X2tQBs*)]\XEr<0c'<iN3R5.m$Ekq:(LreTFdm\7c4hNJIKKQRdH*%JN\7\[cg(>ga=8Vl<S_,`^i<^->"<r"*`=,Tn<7^./0&D>'K$C9PH*#@HJTYmk1'3@4hUPar4)m1!P40a/q"Ho)F=S+&WqMiB[BlU$@lc.$9oj]!%&81B+K6??^a<;RKn4>6,&j^^poeF`"RSsJJl[hjkf.m<.(3M>]`.J&[b(m55#N3:Hf>3U?AI]MnZ9$Ps^?/_2`9>k<_SH-_C*"iWD*W+_=\.4:nB_HcDk,SIDA&4O0;tHf87C.KnXiBjd3,Il8EbRbc7W`F97'f+`0Du'cC[phLl>MB`poZMi]D]:l\:%;aZ+%aVe,?`CWH@E2A_"rVe"Y"OlY2"[rVL.UUY1FgD!c=Z3`+SG5IMMV]t!hZ47FWk~>
+endstream
+endobj
+8 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 7 0 R
+/Annots 9 0 R
+>>
+endobj
+9 0 obj
+[
+10 0 R
+12 0 R
+14 0 R
+16 0 R
+18 0 R
+20 0 R
+22 0 R
+24 0 R
+26 0 R
+28 0 R
+30 0 R
+32 0 R
+34 0 R
+36 0 R
+38 0 R
+40 0 R
+42 0 R
+44 0 R
+46 0 R
+48 0 R
+50 0 R
+52 0 R
+54 0 R
+56 0 R
+58 0 R
+60 0 R
+62 0 R
+64 0 R
+66 0 R
+68 0 R
+70 0 R
+72 0 R
+74 0 R
+76 0 R
+78 0 R
+80 0 R
+82 0 R
+84 0 R
+86 0 R
+88 0 R
+90 0 R
+]
+endobj
+10 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 84.5 686.866 138.95 676.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 11 0 R
+/H /I
+>>
+endobj
+12 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 97.0 671.056 122.55 661.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 13 0 R
+/H /I
+>>
+endobj
+14 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 655.056 192.28 645.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 15 0 R
+/H /I
+>>
+endobj
+16 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 84.5 634.056 127.84 624.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 17 0 R
+/H /I
+>>
+endobj
+18 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 84.5 613.246 126.16 603.246 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 19 0 R
+/H /I
+>>
+endobj
+20 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 597.436 177.26 587.436 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 21 0 R
+/H /I
+>>
+endobj
+22 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 581.436 180.6 571.436 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 23 0 R
+/H /I
+>>
+endobj
+24 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 565.436 223.92 555.436 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 25 0 R
+/H /I
+>>
+endobj
+26 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 549.436 213.37 539.436 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 27 0 R
+/H /I
+>>
+endobj
+28 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 533.436 187.27 523.436 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 29 0 R
+/H /I
+>>
+endobj
+30 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 517.436 192.25 507.436 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 31 0 R
+/H /I
+>>
+endobj
+32 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 501.436 282.22 491.436 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 33 0 R
+/H /I
+>>
+endobj
+34 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 485.436 195.59 475.436 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 35 0 R
+/H /I
+>>
+endobj
+36 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 469.436 177.83 459.436 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 37 0 R
+/H /I
+>>
+endobj
+38 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 453.436 192.83 443.436 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 39 0 R
+/H /I
+>>
+endobj
+40 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 437.436 175.05 427.436 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 41 0 R
+/H /I
+>>
+endobj
+42 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 421.436 251.14 411.436 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 43 0 R
+/H /I
+>>
+endobj
+44 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 400.436 170.88 390.436 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 45 0 R
+/H /I
+>>
+endobj
+46 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 97.0 384.626 190.86 374.626 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 47 0 R
+/H /I
+>>
+endobj
+48 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 97.0 368.626 180.32 358.626 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 49 0 R
+/H /I
+>>
+endobj
+50 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 97.0 352.626 195.31 342.626 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 51 0 R
+/H /I
+>>
+endobj
+52 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 97.0 336.626 197.54 326.626 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 53 0 R
+/H /I
+>>
+endobj
+54 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 315.626 195.58 305.626 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 55 0 R
+/H /I
+>>
+endobj
+56 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 97.0 299.816 146.43 289.816 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 57 0 R
+/H /I
+>>
+endobj
+58 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 288.816 244.48 278.816 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 59 0 R
+/H /I
+>>
+endobj
+60 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 277.816 275.32 267.816 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 61 0 R
+/H /I
+>>
+endobj
+62 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 97.0 261.816 144.77 251.816 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 63 0 R
+/H /I
+>>
+endobj
+64 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 97.0 245.816 214.2 235.816 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 65 0 R
+/H /I
+>>
+endobj
+66 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 234.816 373.64 224.816 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 67 0 R
+/H /I
+>>
+endobj
+68 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 97.0 218.816 223.07 208.816 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 69 0 R
+/H /I
+>>
+endobj
+70 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 207.816 375.72 197.816 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 71 0 R
+/H /I
+>>
+endobj
+72 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 97.0 191.816 133.1 181.816 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 73 0 R
+/H /I
+>>
+endobj
+74 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 180.816 168.11 170.816 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 75 0 R
+/H /I
+>>
+endobj
+76 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 169.816 195.87 159.816 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 77 0 R
+/H /I
+>>
+endobj
+78 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 158.816 173.11 148.816 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 79 0 R
+/H /I
+>>
+endobj
+80 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 147.816 176.98 137.816 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 81 0 R
+/H /I
+>>
+endobj
+82 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 136.816 326.83 126.816 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 83 0 R
+/H /I
+>>
+endobj
+84 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 97.0 120.816 180.87 110.816 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 85 0 R
+/H /I
+>>
+endobj
+86 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 109.5 109.816 175.6 99.816 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 87 0 R
+/H /I
+>>
+endobj
+88 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 98.816 237.27 88.816 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 89 0 R
+/H /I
+>>
+endobj
+90 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 109.5 87.816 206.13 77.816 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 91 0 R
+/H /I
+>>
+endobj
+92 0 obj
+<< /Length 2423 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!$JgN)%,&;KZP'YJO".YKeOO?;!tVf!GXj/?ZRR9Zs1Ci_p?.Rg1*T=t:rM$jV(BL`hrbTmh?*s=b[(5i@ej7M^2(&+qnHuF=\k'IVOf^n2Hm"M.G(1Ml7kY:6sa)d7B`6^%'P;iI99\n_Rmc-:r]^innb-2s4DWpN,hs7?XZWH">E:omq8XU<-[S68B[^Pn?35u4/7LeR2;.TPYAZG]^2=3;)q:K)oqm$:7bHK$8R>X!UX#j1DRJ;p[&+-d6it$'k1`qul-%AUhCf/hUOpE:%N;?=;acGeQLqF]q*)I!5N8eeHUcP+_O.siJ0cMPM.oG!d.#Lhp%-bt0^/k>k\.qjP"%6!^6pROZ/N70UPV2N3BHuaa7<!cDUOn']7(s\%mO+&(34S-"K=_&Wlj4@TAgfL.o29rA5@?S^HL//>nGps#SB9USjQcU(D0r*_[%GM[SS52PBe!/ap3XA!WcF62(RF/l.EX+R2QoOu7?e`c3]92Be,Y-`nZT.5m1a6N,T%+o2^348N0pn,+;nPag33>`99QIlAO&.d`C!%&6[[BY+/u3q@+?.[>A_^\&YjL?h4D=""XN+K]=HS%S"p$MK_V"<.V$9>7J40X=_C&j;%OQT)hM?/5#APm4)VMhY1W4Q8@ON+K,BKc`OD/V:XeQ=Q]fSt6TGSeURIB63`'>t_T9N*bR6P/#-tu7!n:MAje;n5UqPmD_CVboMMNDsRZC><5jb5@%8?VfQ58_!?pJfqR9ne-]XOSC=ITo4H"\,P`FW""0JN/X.\LS>e(1TimDf;C@i7`QoaHfeeLiEH%p0S>!A<*TWds<hm>"=R$mJ&aB&#C'$:iJeI\980.k(lI]R*XaP6.J:gW?'g;Ls^oi1361E"tMhdV`#XNeA15HVpnB6.)mF(Vb'bP(!bp3A_(EBtY7(7BT>\YCP-YEj$U.-jD!C;!_J#XJJ$I'H4@gc)iTZn?3:\\H4H#a@V>-nF[4*TLak;qeWL**T2?56g7Gn\,)XoCYF]g+!IYuF!T6Q$`-EDjGIrCFeuKbZn!5e:fCVlBP`3>7pQQPT\EhD=-"K20K=4[qLlrIc$BVK7[RMB;es+&agiKkF%6rS25&^%Ad,U<I\10H\cc,JC[_Mi5*k<)&nqMjgZ+2b,P,oIB;mao_umr^dEEio<;flX""R+d)E@U@oV(]lE$e$NH(3fA#211b6#8CR#Zr=!J?"S$+P"3*J#GF8eYK4`Hs,-@e9T<`Q\R=F.Td"%p.W9o63c`\[E4\T/p?+.hRd63R7I_tLL1-lFT`Di+s7eD']HVqG8aFN5Z$I!JF:?r;-*As9(n)[[=,7W*N<_$U#m0'66I2b.&Ir44[U>?]"=KfhG&2]7VabJqB9`iLB_<*m8UWIbs]N"5h.Z[!_&Rf]lq"RV8u0HJ?8._Rb[NI26%UKOH(f,KQLiE0aRF]&ts4#6%0oaR%f*L:O$SAR"bj)8?PHe6p6_]:h8uqc''W*";mTDBF+lCU']EBU(e+/WKTtkDf\3g'm#"'D\E15]*UV&RbCoB7b+C;jD+j,fOdAoL(:h.:'leO(<n2^2`[CkZ6,>sLU=;.Q_so;kcgCV'=gLO"orK9)@t?2;o[4i*?`I#C>=6;Sj0@@I=^+,p6'9]PPcA?lFTN>])=q'>3fS]I[tZl]Vc\f%4IspGjmHOi':plRJ#nR#r&%$1DL3bAuFt/_S0*bI#j=4DH(rc_rsHW7mP;08lq",A9s:iTQ<-VkM`.7NqUP=d':\\7"]KN-6Q8p<DARi4'*\r:Fl8$SWP.$W"IS=NRZ=2T_><I5"<rn<+Cif,>D>HNZ2#:A#`Z4c#lm?ZI#L$P!&WN3HbGSEiX"'b,"Xi*0\Q3Ct(EI,$*$'eo4J,Dj)ib-KK@!RLmu]([8NTWc(\+Jn)5faiU7/au8Y0rTsmW=OX9eHbO(Ba%>ZsY)BY$aU2XVm]tC+p=nRJ!hDts2:%69Ip7cXC3!Q$<s6i1/]-X<,.AW[_)q_Qq?-s`.KsNtVdq'WQ,f5AosrA.jHI/DRVjR3C:'9\e`uTrQAYuVc3TWYAa:Kq)5G=S*jkE^e9H3<RTu2gd/)h*G>pLD2g;YX`TL_#:G-5i_@H.JaJpclf^*r]KOKNoI*U-aW=M!_q9GApQo4Q.=`Y,c].)<k%VWjtBjjGqV;5eQ3/V04F*]%uU8L\UKBCbH?Q>anBJ?t5Ii8u^>`WgC:RMQ3^(fddVR%lACg]E#U6Z1V60Sm;2'j@_VqWpcQSrD$'/C8V:c(!@USrC<pV8e39pVKqa2XVK`,TqIRKj;PqIkNgO^j,kkJ)qiUfRb\a-A`QiG5hlobCV$W1:(s?@u@5pqD.[-=7F(9^X)@oD&pT5UbEjaRsdd+d;B24+CVZ.3p?TTM<lj8O)Mq(!>]0ETE[?S0ZIj8jN71:JF2/Ve?#1/;\Kh~>
+endstream
+endobj
+93 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 92 0 R
+/Annots 94 0 R
+>>
+endobj
+94 0 obj
+[
+95 0 R
+97 0 R
+99 0 R
+101 0 R
+103 0 R
+105 0 R
+107 0 R
+109 0 R
+111 0 R
+113 0 R
+115 0 R
+117 0 R
+119 0 R
+121 0 R
+123 0 R
+125 0 R
+127 0 R
+129 0 R
+131 0 R
+133 0 R
+135 0 R
+137 0 R
+139 0 R
+141 0 R
+143 0 R
+145 0 R
+147 0 R
+149 0 R
+151 0 R
+153 0 R
+155 0 R
+157 0 R
+159 0 R
+161 0 R
+163 0 R
+165 0 R
+167 0 R
+169 0 R
+171 0 R
+173 0 R
+175 0 R
+177 0 R
+]
+endobj
+95 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 719.0 188.66 709.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 96 0 R
+/H /I
+>>
+endobj
+97 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 708.0 278.92 698.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 98 0 R
+/H /I
+>>
+endobj
+99 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 97.0 692.0 186.42 682.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 100 0 R
+/H /I
+>>
+endobj
+101 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 97.0 676.0 214.2 666.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 102 0 R
+/H /I
+>>
+endobj
+103 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 665.0 312.25 655.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 104 0 R
+/H /I
+>>
+endobj
+105 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 649.0 330.85 639.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 106 0 R
+/H /I
+>>
+endobj
+107 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 628.0 154.79 618.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 108 0 R
+/H /I
+>>
+endobj
+109 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 607.19 241.16 597.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 110 0 R
+/H /I
+>>
+endobj
+111 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 591.38 174.22 581.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 112 0 R
+/H /I
+>>
+endobj
+113 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 580.38 170.32 570.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 114 0 R
+/H /I
+>>
+endobj
+115 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 97.0 564.38 139.22 554.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 116 0 R
+/H /I
+>>
+endobj
+117 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 553.38 195.6 543.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 118 0 R
+/H /I
+>>
+endobj
+119 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 97.0 537.38 126.44 527.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 120 0 R
+/H /I
+>>
+endobj
+121 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 97.0 521.38 123.67 511.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 122 0 R
+/H /I
+>>
+endobj
+123 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 97.0 505.38 124.22 495.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 124 0 R
+/H /I
+>>
+endobj
+125 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 484.38 188.37 474.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 126 0 R
+/H /I
+>>
+endobj
+127 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 97.0 468.57 117.0 458.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 128 0 R
+/H /I
+>>
+endobj
+129 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 457.57 187.0 447.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 130 0 R
+/H /I
+>>
+endobj
+131 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 446.57 217.55 436.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 132 0 R
+/H /I
+>>
+endobj
+133 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 435.57 353.91 425.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 134 0 R
+/H /I
+>>
+endobj
+135 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 424.57 364.19 414.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 136 0 R
+/H /I
+>>
+endobj
+137 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 413.57 455.02 403.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 138 0 R
+/H /I
+>>
+endobj
+139 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 392.57 185.03 382.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 140 0 R
+/H /I
+>>
+endobj
+141 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 376.76 168.95 366.76 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 142 0 R
+/H /I
+>>
+endobj
+143 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 360.76 237.8 350.76 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 144 0 R
+/H /I
+>>
+endobj
+145 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 349.76 291.13 339.76 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 146 0 R
+/H /I
+>>
+endobj
+147 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 333.76 225.6 323.76 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 148 0 R
+/H /I
+>>
+endobj
+149 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 322.76 278.93 312.76 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 150 0 R
+/H /I
+>>
+endobj
+151 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 306.76 263.91 296.76 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 152 0 R
+/H /I
+>>
+endobj
+153 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 109.5 295.76 147.83 285.76 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 154 0 R
+/H /I
+>>
+endobj
+155 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 284.76 360.84 274.76 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 156 0 R
+/H /I
+>>
+endobj
+157 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 268.76 278.35 258.76 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 158 0 R
+/H /I
+>>
+endobj
+159 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 257.76 331.68 247.76 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 160 0 R
+/H /I
+>>
+endobj
+161 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 236.76 160.88 226.76 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 162 0 R
+/H /I
+>>
+endobj
+163 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 215.95 242.01 205.95 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 164 0 R
+/H /I
+>>
+endobj
+165 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 195.14 192.0 185.14 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 166 0 R
+/H /I
+>>
+endobj
+167 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 179.33 256.42 169.33 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 168 0 R
+/H /I
+>>
+endobj
+169 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 163.33 396.93 153.33 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 170 0 R
+/H /I
+>>
+endobj
+171 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 147.33 238.65 137.33 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 172 0 R
+/H /I
+>>
+endobj
+173 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 89.5 126.33 153.39 116.33 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 174 0 R
+/H /I
+>>
+endobj
+175 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 105.52 182.0 95.52 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 176 0 R
+/H /I
+>>
+endobj
+177 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 89.5 84.71 172.27 74.71 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 178 0 R
+/H /I
+>>
+endobj
+179 0 obj
+<< /Length 747 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!$E>AqtE'Z],&.JuXcJS.'$099C3,nNKY7"DZ3+\UTC,+$Gl-i34Md\sF_TG4a@c9pY;+.mV'rqg^RGo'*X0S0QuCCbuULB0.P#)jB<6NiPP6j:)l?j`gi(.97XAcRE+_L_i^2W3f:"UlED06/Y0//)/.?2Fo[kE#nnGkh<I.<pVrC7%]3TI]/6)'70cfI3ZEVakQJ'HBT?DP&FZ`&`7,-8#Uo+<rR/!3pL?G\po,1[/uI:if2_A<S5#P-Wk,Pj?(rAVB5.PIre#fEmM-#`S^J@"EiZIn4uG^+CdE`:<XUmhW6J4g#m-:OQkQ-+cL0]!k*)Xi5H,f3+O+X=ASO/59]DmYV&!4s?$b:AF![8+;(83%-Rl<h(.]?_5.C1WS[Cf1P?*.dd+7.XT6W\ZmPOnQg$TDu(K&1EE,V3/<;O6(a[q,A(&>Q5LbhEe&r_jL>lZc2^]6)b0p$f(JNe$TZ/XRGaKkqj5k60fN2:7%=E+jGi636V,B_Q\jS<\Li_S/!\ucQFO;$1U"66Q#5rkSb?((=uMjg#U<atqTKHH6<'o@j@7OB<%)U$U(0gGIgo@d%U]l0,@@+,VeQYQ'XgF!fLp`l!JOq;CM5`s=5%:Qd*+l`2?tIOFMuB9F*Z<E=A#\F='W=/>)Sf%;=jFKXC=h<"JNXnQ^G1uh7YbnAPp,-IAE^Y3,_G!=MUSCV-0\#9!+U-'dl4MJM7b0$P"N8=0[/\RKV@ED3r?@aSQF`#pnF~>
+endstream
+endobj
+180 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 179 0 R
+/Annots 181 0 R
+>>
+endobj
+181 0 obj
+[
+182 0 R
+184 0 R
+186 0 R
+188 0 R
+190 0 R
+192 0 R
+194 0 R
+196 0 R
+]
+endobj
+182 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 89.5 709.0 136.14 699.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 183 0 R
+/H /I
+>>
+endobj
+184 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 693.19 191.69 683.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 185 0 R
+/H /I
+>>
+endobj
+186 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 677.19 196.13 667.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 187 0 R
+/H /I
+>>
+endobj
+188 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 656.19 320.33 646.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 189 0 R
+/H /I
+>>
+endobj
+190 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 635.38 285.58 625.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 191 0 R
+/H /I
+>>
+endobj
+192 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 614.57 155.61 604.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 193 0 R
+/H /I
+>>
+endobj
+194 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 593.76 275.87 583.76 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 195 0 R
+/H /I
+>>
+endobj
+196 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 572.95 96.45 562.95 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 197 0 R
+/H /I
+>>
+endobj
+198 0 obj
+<< /Length 3722 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat=/gN)%.&q/)-W;NqrPq@n.Fius[F4nf=2G#3dSZRe4!?r[!'9_:(U_W(Y(Y"GB_1nb]r".$cEB2j'qK)i8a8N?V\$J@3%7c'Je[*Y2r@AeElq]=&L%]Gkd:*rOVh=konF\gZ4s/QT7O.g)lZYd7FOJ+8d`(go++sH?gOU](@'gm:0Z]t/A3-=k7u'Cu;e\`.-ehML>%HG:^$:'MnS>n_jm/95m66FfQ;uI`NchrP(eK1[APq-W_3Yl6?L.%Rdca2d^hf`qQ\nrb>tQ?-)13`sE@M;qjkZP0g2nG'_^&1"HB/J'@hs3#,cZ`]CdActkpJA[Ao"$]U;e3!\COh/U)*57;2DW5Y:Q=D=BEp58lH1K_&CPSVrM[`0`o#kFB)XZ1:K?^2<s2>L5da,V.sk3KS=5AS`3,u`i'eQL@80t8bm"A.UXn$;?6C!&+BK&p/*eOoi0Hs^Yq]?a=O)^(u-HHLKgnjNigK(<OI\fJLf?/bg:)Mm[>>^-@=HmBGUoRL_TrAD"X;k.PG8#'Z06/2_ZZJ,`t"9E`EYaD?jVNM1Q5!D1'nkg;u1ie*NE<oK_K3B7W@.XE7r]l,3#UjL249?kU#U)t\e)9RaCYL<+>,`&bS8.;AbkVR-A-JSW5mg4ffafm)"T<p<VtZ0R'%pQ:JRMEJ1&\g]/d3=&iU7Qr<X^fOJ)8=o:Z`pM"9Z<+eOjXXdS(6r8.FF8&Do+n?Bn6i>&SIL\)L+04eiVMZ:pCGS)oICq4)TJ#Y:4).sfY/ApY!a\V%JM#/gihHaK@soJ1u:m>p9WjhB<,sNLZdT!RoEk`9+e)3qDYXo;T>hSnB5I7M0SD641/Q\>/"<907sk.P1CrmddPlq-WM#o[)ld3N`IQU"U,4'qRAi8^o?BTMa=+QQFX"-4F$N9;eW536!FW@X8fcGs$X?_dg&p(UcLe;a5%(<X80-?lJUrh?#_q$h'Vi=%lXb;B#lR-_$c;JCM]A<T's/&$Ii%"^\48Vd?-h)&3j7i%$i*sANNdiFX!<l1]q/\5]J'm_9>8iPR.WD06TMBlP@#Y!mN/t+^=7lh'4<b'UV"+[,O8X\\#G'Wm`:bccqr:`0W"S=c=O9Y34;a,r96C,8=4%MCO.7l$Mu\4mBp\E8"i`Bsk*:)m1#\<Ld7SgjT1ho6X9dZT$2DZ`7%-0G'1/K5ORU8-80f`OH@[8%t`smg.o2(+$)_%Y=%]!#uq4.UY4$7Vl40,30RB`&/tn#:)G)g*?g#fjTOo)?i5=1:ac0;QNqo`nS<%;:tVI8o^T-:2[#p?ejIS2Oi\)i@rjY?#pfWVU7AFOs.02[ST2)atm-K[JfddT15u=?YYEc8F4%>W)5+VWl44R`$Va,Z@k`n3k?\#pAL;?]uX?E(G-D]("(Dc3as]T14qnrm#WF/iVf"+$6N't:jA,$Wm&C[+``_b>)'qHFjIRN=]i7mjri$ZY'"NU88,N\fpq]NjX<$67+7P_H^n+`rqcYV3BYf_2d&i_e^hpZ5RL]t6<2lAD]uQN?nDWjlB'$mgbqFW3ePE<R?.G]11`S.Vm<-EP8Lj9XCn40!#2X3f'6*Fh>[\,qH_?AVt*_i;*hjGfH2GZoC*Woj61*d1g"qEekUt\j#3@!&ekWjD_Kl@`Vfk=AJLC"C1X`]hfJX:#?u=@j6/&C*b_&(4[G$NF-1GJb@#c]-WsPYG;A@d`oAj']DiG,'1::dYUJ)4Hkg>0BfU_Y!#MR_,QDMC6#tW:ktt,4-ZpO1,U-,r#^@:5QA.,2*(,eg/HDnAZ1c-cKAVEJM6W$])KK\gK@p&!MGSHMZdtqHEn$afn-'(AUDqmp$m%&GKFu;12Kp3$IS8hjB?uA!rHR^CUZ#_t/>e&N=V$N+KY_Ia):L%KaI%9J1^oH*FJgGD2!ho5_L,p:I];-?^]/hh/F*'7qBu,[qjIFa&R2LlT(-:>D$4@*.PoeNqXjUDVml+Y]_5@bI@H%/,G$CE#`\A?Pa!ohdTK!oSq>Jhh:FpHp#M5rWV`MdOVjL2\=cT>;d!u)l%bF"l8%HE%+Qdd>cKa\1.7Ge,CdtMX-NM#e9D%(&Z7d!K&^$X<U[+FAApPX1=Ja@=d0[`dOt0_lqt@!07i0'3m6=":6c")`$sq.[KA:P7A+t-OpVjdlHltm4i(m$0IURk-=?W'-f#!Ra.AO>'&pq^\N.?j;AsFP:LeZ'>NhLmI)]+/qF#`%.@eJ;ba)@6h_6Ij8R)qI=3@3!3Fd%de9K-qMQ&turW&<U[gUX/-7rl.q.M-L]W9]nIg3\"FK[)LD)mZTfI?,4G'4C?_Z&>PcV+0u*"M5^+8D'YKcQG.>(mM\AHH^99@0`A*f"fh%;c[/aHlr1LDAV)!!N%%F][I;LW-P)rHYI7]un_lp8q?YAQ*s$+7-lb3TRA5RO<-SeiGGSi$g4)/nJfaS_sjZ_Gu;nVfW1`5#%&&R$4;R`/)Z9`8CL?7`;^`EqGt+.oN>\8Oi8VOa.GjEe41s';mgqGIlL3_m6f`f#4L<,E\2R%GPS-(Er@;dEUB85Gp7EmP$rsckM1M:YWrB&1^RL6:-CV-u2[Q]&(&r7&<IT5?V0:<fH%39j9=/[mG"<l,>nBkPCmN.9fRpVcDe5KJmUMM>lH$*[#;Z($8X@5FZ&N`al^&WYBH&A\pH$g7GOT8BaOG!`DWkQElY8+['NQqjO"&"4L@^G'ci5EQ$(A5o;28$SJBKpW"UEV7u?aX,L;m+d]@e9,L[8XDA?%:9gQhH&6FMS0PHGLn_h/hW;fLrc'3_>4s<b]Mm;N$q7Q?4e1p.Gpt6#25l`7_bi_F;p#6g_a!f,+Ak!VH'!0m]2/cjpjPTCZ4r$QFaoaRWi2Ale>AN<9^<ZR.,c$1nDWu.:EMgYGFs)7cSl-&[sk$=qF"c;ZU"SSpVCQ<*%Kk#h(1Kt3t^Fn(ssLRNJPP-iYiE8^jVD;<J$M]/'mj2SON\t9Y#\(?hR3SC(?(MA$68pUPU)@h2$l'I3-sQ1n7'X>R&ddL[0?9HhH>X)[aD$'^3T03"[>$gSMhNcCKfRhDO]-oBg#59o'HW?dc<Z#Nr3mn@7"dZ,lmWVA+[:Cjbfd,T#@nK.l`4>0!("Wg/$5m1Xqj-X10?A6jM)b[/BL'aM8aBX`l>GF;9hnhAd`P.-h7RI:bh0Ek&%)?[YRWO9"3.-c3bs4J=rC4"F<]q:gg51_W.[4U?LInbVQ3F.:#+tR`-h=Vt(f+XlB?+]hf/I<j+p/Gg]Xql*#rXbnea"ucGCcDab@_[A@q^S*?ZTf:I):,GRcfk,>;I;6r=D*u@ib"ShW76=;Mr*cGXk"+Pje^:bmY)4:A+#&T[\1p1^t.N8b-u`8e%&Ve4g=I4kIk\FCE[<i+XgS6rg9S$UJMgk-H@PpVRW#f/lq!5?EYW>q+A+*?UBCFWZ&((dZ$a&=0^#=3%d5h-T@?6gpDf]_6%ek%4=ZD$:C:ADhDHd.HdkO3^':e\qIg?i2Q^WYdD-sACqX^+#9@si8+@niEC\kA]Yoc+()eHs#L9-X+^d:VC0/Y4g!5V)%l`uY-q-d`Y]*^D6)6+O2p(YdNOe!MJF^%;W6pA[/NWAC57@ej(nC]J#8._@PQX)^p7&9g3=B%Xf]JpYU["%iND]X\]4[!0t/062B>NsfDe/((lh&t\#.OCD6O9<Q)0G0PU8pd/UmuP/=I"aQ9f9oXt\LK\Mq,9="p2uq<*\3i;2aeJaI[IcJ*gZN;_o<g&D()(b.c~>
+endstream
+endobj
+199 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 198 0 R
+/Annots 200 0 R
+>>
+endobj
+200 0 obj
+[
+201 0 R
+202 0 R
+203 0 R
+204 0 R
+]
+endobj
+201 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 217.53 407.866 262.53 397.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 49 0 R
+/H /I
+>>
+endobj
+202 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 226.4 222.866 271.4 212.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 152 0 R
+/H /I
+>>
+endobj
+203 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 240.84 211.866 285.84 201.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 158 0 R
+/H /I
+>>
+endobj
+204 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 337.51 157.866 383.07 147.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 205 0 R
+/H /I
+>>
+endobj
+206 0 obj
+<< /Length 2716 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm>=`<%a&:Vs/+S'%F1!A\'^8Z.3[V-U)&_[;++4fLV>*S"R,SeAqoc5)#B?4@UG)?9V`,Oo7k+:+!Rl<Re";Z&pa4`YgENJOHAi]@9=c!O4+t'Y5aP-!_cPLf.)dHQJN!7J\(EZX0Y3pQ]13i#+cRP%u93FK=:[ThVGG5f3"$V/bJ\q16ji.#V?=9K/r=?*=['HT]mq'Z5*&5dXK.O6SgJT%&j&bn-IQj"%8EGEce_T?!9C![8o.,M=9KWt&T+3'1&&>lEWmHs5G=\K!re.[E7ons5d.p!=S#FiA9G'FEW6%BWP3;D*aRj48d<DNtPdTB<)SL;RjAI,"[^iuI[](!f4jW<V<U\9j%eu<B>@AY./BZ.>VT53nF5jVDRZNr1=dNTL$87KJmC=c_;=FWk"lhKhKc_>nW@2LaCm!(2*H4t+,^cWcLL]/__%C(&$UbQb];[H!7;bJdR_Z_/W5/MkGfF1O_j(6_2mQS9@^Eu?=Qt5@^S8k&0,f>j#Pj"pF7iWuo51uuG2TSM[&e:`%>)*`CWDBink#XA/[O+qB$>?<Ud'p3lnSg/ia;5/%0;2I@*FZW%G!T@GIpeoRXf$973ABX*/#JYP;?l+kPHWD.-q[D_6USn5l;WpPd3oB<FlU9d@me6/Qp$`Hoh[k.Pm!m3dX8tmF$&f56fNLaBWQ#Ma[/bf8c$CU3R[)r7J:1A0RI*T"-H'5sX-9e&^g5l3%b26],:&3kT_uG9D9>(5ib+8d?u2@]$N9;;)2M*I?"A%A#nHX%9&9;!,#p,=&"CQh1FAZ]hApKjkO1OSFHYY6'OUNZH/nc4$@2!t^B"gS<qn:Me7O+%iKR_RQQ'DFf06q2s:GO:j<GV5:hSRGM6igMq7;mnaf0DJ4BR8aeOD!8*B-P#5RSM,G%%/UH$rfJW@,qD3n!q17GHS2?eWMU^,d\!p_gr:0$$"O)R+0_'s,1Vb2=S(kT#H4iO;$i#1m>='&_J,Mobi2%iK3#65[-FC9r+GCN1/MH+aXCt,po4E&ZM"\U%rUoGO<+\P3;jkb&%7k7BA1<t5.`4DVj!tL/h-k.;,2MB^dCD!a,c9`uiG1hf"#4n]6T,Q7"gp])APpMOn+7+d\lA,E[d+PDAl-FW<$-g;7*d#)DBKOT#$.#!$)03UAGRr76eLL@05EU#QB2TZ.e6UdGa[u'YV_`a4$t?>%X^8e%GquV;!-c!YaRkEkb.N1gS<pCF?Krcp*+g4s8Er<Y&Q5V05!+G&Nl(KMp364pG:-=kX!X6[5k5MV[iO)Dr`da!LH/V]!6"l-TWo]_1KH4$*C`R\fRFhZ-C?MU;VF6nTkd1#Kg>X+JUjhqk5#WAg(k9FbGDR_r5]X3hs0<[bD<.jO6#r&H#*ROUoFC3ar-QduD?pgj%P8Fo%cP=Q.,?3/AcB?XKOF'<a+'@90EHR?]C4"2H?0#I1jgr\?$>8Ani8oXH9^cK=AAo$DO.lcZ7JY;b(#+6eAK0l2,L^h)Q=.WVel>CbCS@B?k8_mGq_\;;cfE7m>^>bgGn+%LJ[eZr`o<MHa/i,hSLEaK:=a/pPJg(.VL87LDX+Ig1Q@s)@E]'brVV/Fo%/@Z:6A77aBqu#trmD>t!O1(0\G/WVAg?*&lR3\lU$$3NUMfiia05>*/nigb1Oh54nm.Ukq@Hn*s8?H)GOQnX<H;\6Wi-ua5*ZFD5GpAAY^-1F,XE?b"-%Jd@Cc/MH4-4]fDk$66\8>qYjB&tR*XD9s9=D4)nVLJ@DWb2e>VTq,nMjT85Hi4ZE@9:t\->UWD4&[E?&+FRO6AjGW`?(iG?POhjBB'*iA).nV#7I;`'*E@h<AX_38.$Nil0!Pqka7CUNdC"4%ajIfh"$q/F//<6]4`QQ/ON)?&u%WAJG'0KM8l<>"/SY^F<\S&dXJGJ2u)"(UiX!%&cZR)k^p"[;aa&N"ohN%r\qRfKqh9f[#5s9d0]^''np6Z=c2MZNPRZCJ4armruBF^CFP&b`,HMkP&!4C`Zo:=Qk^"O`>ZMZ=\210o.uf[jXs6mK@A.F#*0P4E(eoJeoSrHbg(gCS;oAntJqd*-sh@8cd1`R\]?IW2)#JEr+&k2ias3He^T\_W4R,7uutja;("/b+YDuEf.*W+V:)0)m9p+_<C.eoK[c6BP%jsc/Okk\C@8_J*Xui==csZVlMH>cF'0^6.0mN0-L$1pRF^rZT*5]jTfE\@@=n@&k_l)n\LHH9+QQ*T4$V=;01,T=m1jkU;1I?pW3+rdO_s]3ADLkrA%6sNRKCnin[%sMQ>o^812aZPnobt(K_/!`j57>GJm;nJ-"KQSMilsYnn?5ee9mZ>VTZ&BXRBSVu+_/[=duPEI91bhN6pbO"JGV*%"Z#L"#Xg^M(m?]:Y!bM5alNa`PQ2@W,hHf"nkCNpfe$`D%6NK;MRAGoCQCHeXZ;&<A7JIc^@7F&fV=M&Z)rJ5;*KPrPXAek"9J?OE^ba.96WfB,]mb[Q&aAG#FeHu4<>J6k.h^pa]$HjlI6<7WFHY/L!3?\J92<ZX<'PB_@Zm`]Z+baN$.1!Ph.XSF=K+!pn8!b-<Ln\ab]C:!nbJjR))MSd;,P(*B&nRap*o-3(IDp3?,@f,b$Wn!ofXf#1e[ND;,,#N"Yf#@(tWTQ=&YER(Nm!se\88BW=HNYKE")VYa@XdB.G%+a)Wd0`s&mq/GTI)K'!Z"8@56bn1I(n^P,7Q<.p>>$ZdJM1Xrr@GPF:/~>
+endstream
+endobj
+207 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 206 0 R
+/Annots 208 0 R
+>>
+endobj
+208 0 obj
+[
+209 0 R
+210 0 R
+211 0 R
+212 0 R
+213 0 R
+214 0 R
+215 0 R
+216 0 R
+217 0 R
+218 0 R
+219 0 R
+220 0 R
+221 0 R
+222 0 R
+223 0 R
+224 0 R
+226 0 R
+]
+endobj
+209 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 262.81 634.0 307.81 624.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 13 0 R
+/H /I
+>>
+endobj
+210 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 334.75 623.0 372.25 613.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 17 0 R
+/H /I
+>>
+endobj
+211 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 442.79 623.0 480.29 613.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 19 0 R
+/H /I
+>>
+endobj
+212 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 242.52 612.0 280.02 602.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 45 0 R
+/H /I
+>>
+endobj
+213 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 140.88 601.0 178.38 591.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 55 0 R
+/H /I
+>>
+endobj
+214 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 388.89 601.0 426.39 591.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 108 0 R
+/H /I
+>>
+endobj
+215 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 293.93 590.0 338.93 580.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 116 0 R
+/H /I
+>>
+endobj
+216 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 401.38 579.0 438.88 569.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 110 0 R
+/H /I
+>>
+endobj
+217 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 239.22 568.0 276.72 558.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 126 0 R
+/H /I
+>>
+endobj
+218 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 205.86 557.0 243.36 547.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 140 0 R
+/H /I
+>>
+endobj
+219 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 370.57 557.0 413.07 547.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 162 0 R
+/H /I
+>>
+endobj
+220 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 155.6 546.0 198.1 536.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 164 0 R
+/H /I
+>>
+endobj
+221 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 304.19 546.0 346.69 536.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 166 0 R
+/H /I
+>>
+endobj
+222 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 434.45 546.0 476.95 536.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 174 0 R
+/H /I
+>>
+endobj
+223 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 205.31 535.0 254.47 525.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 189 0 R
+/H /I
+>>
+endobj
+224 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 283.65 472.028 329.21 462.028 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 225 0 R
+/H /I
+>>
+endobj
+226 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 391.69 472.028 437.25 462.028 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 227 0 R
+/H /I
+>>
+endobj
+228 0 obj
+<< /Length 996 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat%">B?eu&:X@T0L"/-b97-ZcC7fqm?st;Q(H1O5"(?q.=rp40E;#&<gsO-[>kc\c0gqSD_K48d.heP)T4B_,?QiTA(;]V"[?H-@Y9bG^?JK>=<"T4i;X.UjlVD>DZi;?O;_=D0\dVpEpZ_=HJS"Y&M\,V3-D@oLt4Q1=WXCGMa:se>?O0bSp4.*ZZfsEdN7*!,.k!Lr#KhI^a07:<bh]o$Rn+UT?BZciN;pVr6?CY9Wf.F=Hl'a5=N1H$UlmBkAE\VVdYJ"i@utd&>k&o6U8pbM>Wt9YTuOBCm2q/]%dls;IZ&s7=<E8`6,$_j>`=!g!+g"p5!qmDMh?ITr..TqBdDJLCAF.UZr5OB@mt#bukg9$Aj\8'"B?!C^qpjdGbGcm,MgGFH3+*laLl0.42/0#hs1T=+,33W^MSbT6VFF)c;Rr>#O6%NuX_fS;IK%CQ<;16*ji/aQ7Z@mbSA%hHo%I#E!JHdC[!d.&f_)?;,7?WYhR')jj')?m#@3:I_,<GYiBoeGG0U/3sHhS6Q;cPB$&kW@t9(kn%*l7m%k;BFqE\>\OjpGT_C-?<uHge12^A-hXM'CMUu`I&SjYb:&3j@i;c(rqk"IV,fDFNhB:<1-/YCot'+L]eF&M<P5tC(ga(.;DU8?7qm3e]824Qh?JiF"6@>T8c)n-CM-]2\=(mP+fe$(FU!85$:3pVTL0m5<7OLVrq?Lb^9B(Y?d+:oFKQqAU!eMST_Ib6lG&"SH+%-)L.&!TI)uOf_E(F&eQH):);HG4H<+p^0SRMpan;+1lmr=phMLV<e1;D5ZI6&,n`j8&NahXr:nJiVV(\2Gog7W0A?P")3X3%]2[X'1pNMZ^Qn,+'WT1dOfJ`7o#E"8^_,\&'$U^MZ%)C=E(\hul/Y>Z969WdT=sJdi-/5^FSPM09!:eoNl9ch46nu_L\\&YQM*muZHt]f*7QsbR\j3LhZ.+>;Wb6L+o@E8sXUnG'`7Y(X]4`$<rWD9PQ@8~>
+endstream
+endobj
+229 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 228 0 R
+/Annots 230 0 R
+>>
+endobj
+230 0 obj
+[
+231 0 R
+232 0 R
+233 0 R
+235 0 R
+]
+endobj
+231 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 92.0 651.028 137.56 641.028 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 225 0 R
+/H /I
+>>
+endobj
+232 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 92.0 640.028 137.56 630.028 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 225 0 R
+/H /I
+>>
+endobj
+233 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 92.0 597.028 137.56 587.028 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 234 0 R
+/H /I
+>>
+endobj
+235 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 327.51 565.028 379.17 555.028 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 236 0 R
+/H /I
+>>
+endobj
+237 0 obj
+<< /Length 1222 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat%#>B?8n(k'`6i6dra.+hp8qW&um9m4t9P;qsr[!f_4)pJFn-/i\>rQ7*VNef+/j<<a\?-`7`rj4`^E"tB^i-N[`F5f47'Ar?0TC50H[24+Fld+_=WcEP^VXCF)*dXF3T.E")1YSY$3-B[1X1smdd.+f%Qkp@V?Gnr9?115#6:mQ!SV6,oK&34gJ#E.L-M!;hJ+NpmK!d]cH:JaM`:HH(+gn]#bGgRq2`rMB.]rB,EW)H5WbH#o.BCkG1m<1-e5'j0BdsFhcS?\P/_Mpt-<=!:Yo7^g\9dU0&<:Mj>VEOU[1+0t@_ml9Mc<gR&a5V]<eroT8_''$;W9a5`('f+('KbGC(M2iZ/RI0BcLrD(p9eN#'MdGkdi#>&k(Qnh2SC=,7!(]XAI4+p#j<OHEi3W<Zlc&bb2KJK5NqfC;KTq\R>+gHR(\ic`@D+;iQlrJXmAWYADR3Ma<4,-5r&p%F$rN^t"5;Q!TUQ'V+54_iYsr\3cWUg&.@rT;TcNm?q9D(,RNGl[]4n^c17`7n^-V7f#NAH.jree-P-]ig0DM89Yo'Gu"5oU>`0s>Z)c]780tVLlBe?)SFD#cHj1jSf<!)13X_PF^?(!eAZZE\pdF1PJuH[MD"*Y*4rQ66\r0tFuG*Kbd1jAn&fZ_Y\sMB[ABZK8r_=gTNDY9R&RbA.FJ5$0i(<6YTG2A.^=AcZ=*(.0Z@2anIpnC=V(Vrl`Ui.Q_:p,)TEr'Q?Q]&=#XJ=;&]Xo;2VH9Q]'D5[2kEZ(G[7;/FVkh`A'"Ma6F,o<R7^fc!"h7c^Tdme5GXu?r"t*-N7pVq+u@]iEJ"fAp"q\`ss//,I^:;"sU%u?]F>>pht&1c8cZXhDNmj!d?A/H7`5X<,67UUUeAr9?YcATKnT0[5Rjk.Q)*e!'j04D!VEUC$_CCfN-s^]LeC38)lZh8WIteE":@a!KVg-@Q86>;E-!?dnJrNOe@.ecr!UJ[<gI.]:5=$/JiM!^d>Da%T#)Fc<J'lKB'c5RJZ1'Ee2IBX4[Df1t1<Zl]]Fj4[@%)!X>hQ``TGP?mOSJeZX7RheVi%9p4^ZlgF%)9:\M&)@Fdgku;f)^mTQtlc[7+BQCf;E5?;2)>LMu9X:bS;*n6A#Z\fOQ(3/,@'aRI`Yea/n-db[.tA9`<a+p$fajf"EYHtOV;aAo3S:^uBt"%)jNf'I5>G[#nmeX+JA)Vf3o0gCc\DA&3r'lPrKkS~>
+endstream
+endobj
+238 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 237 0 R
+/Annots 239 0 R
+>>
+endobj
+239 0 obj
+[
+240 0 R
+]
+endobj
+240 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 450.83 647.866 488.33 637.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 45 0 R
+/H /I
+>>
+endobj
+241 0 obj
+<< /Length 3186 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm>>BAQ/'n4K4;"IRt-=TQ'e>;PS`m*5nFHY:?..-B>qZ)b?KNX1?!Re:NlO3!tmskE"9fdQU8WeekI-:2D!.S@gqU=hR&B-pp=KGh_KCu9Y&=S*r?og(;VVsXn`fn5J48<tV%c.VK8Jmon=8,<LMO^l\IP^bAYkY+.P742T+QaqYhM@QCOrulD\6b%t<6n%Z.+ueCAG^SmeOliYH\8_UY/MV=g<2(O2DT'OA`8#0E@ksko(LALY?r(4eIm=&APjnEk8_DmTCETaYZ.9R<:EP+"t"#%?IqYPV;_C'&N1!H1iB!:Q)nLGoCaL0<:N9_=b*/[_lED[j"#[q(4=_?r4H.egB`D,00e?BrU<a4X\57C'`bJmLihZ4[(Z3!&DLtFMRB:A_sYV`m68X?lbT'U-'='>AA"_c^U`,_]Re^#="4-@=t'#eD_tK6DSq5^-HHn#-lKO4-RsYLOSpl-)U&Li126je4[G\06D2/rGkM:H92huV9$sS!.00@IMk%MoiP##&=d<k9!X8sZrU,E9WNK3k<fIt,AE'OVVUdS!:l1gIs7L#jkARIa-;f%cM3JnRT(m)mWseJDfVWqbal1o@OrTq^UX"k=@??/iHnlP;p#'XS*)D1VN109jVj5%)QNTkkSL(Zi4.acMRJ$-g)[OkF>Wm,(S\U6&p*CVBMO.4@,U?08`o4G@G^V*m;Ih,o?:3+<$GdB+ItS,F#:atK5Gc!q,t-^3Cs"S>m5>q_hN#K@lB+oGPXm;dF<,Tpo+j"1f@GC$jNaMd2g+q[ckTSF[*u%jeC$=8_%iRf@!+!c+p4HR)5t+lqGajPGZ35*(+1H?c5,;!b*H+Fdor/R9QgY's(t"u%_mB-%Rq545mi([eJ=AA2-[7!?^hIIIJbrJc?ft(-TJF]Bjl19_q89G<fj&,$.>s&n99r)#Z^!cY3&rsY?6&[#W5?GOl`I+\\iWp/ZGM2]$KG-c5P:o!1HYdJC+*;+jLj8/rsBsAEIK)2l;+pDG`:j`3s6;^`\r;q/'oKB!f"0+L_([bHg)mDjM<CXDg(lA<L>YhTA@FH.CUF8S^JP;BK(jA]O"L.G8<YUQ)UOgD\5"o<G]dFbtOc`&g[Zm4=\t'"`tVs2Ej+bXc?-2g%Q<lSIjDa,W?-m:;dJ^i1H_OWJif9+h=EDRd\]$"q813UZ.P2MVE$2m#16kf5mR`Q4,b]=_AQAIO7DRtW]7Hd^0phkK<rqch(hS9Y>GI.B.!)M5fR$G,a7MjAkRFg16$m"m/A$D[p*T]R;UjX&t^$ol%=Q3g;o]#OsoT"9o@34+ddYd[\\)ZEW8"I#!#F&*ZUEfphY5G=7\>OLs(+c'dP&5fQ5o2V?.,%)oWSeGB^[u!8!g'L)nC!q8IcC[_.0m"K@,CtJn**+>6"Ht9R86Q:XFOSW/-oSu#Y@D&O-H#L+2]UOh'Z/DrrRK5Jpjif`DOK$E\F#ge/Ng,51_ZY3s5g=N\=6J'*^Yp6@pS\h.Fr"Dif'+#HV2sa[if!+l!#^4ii_0eE'ffi6#8dDiO(,c,@--G(DE5GlKN(`*E$QG57^ncs)9rfeO.)M0&V7'#2XT</@M0iL%La^^+Oo*]Qth[aWoSXHs_"X$/Sa=gKP1iR\B0[T]S6e`mG^5Oa6*7TlEa4;'X7s0KKd.2m7:GbSOa`Pc9dKOF4nT:R\/-SoK;B5_j=)Rdf=J4>[3H5,0j@>2%3&a_fQsl30G)>0FLgN#$+c^B6NPF7"[j2E;dC6pMAJ';@@`]T?*SC-st02ue8u=P^+rQ!-8`EIeZ4:/1M-K:rCL&Ep8rCK?8kimrZ:q45,:pYGI+et"Bq<QM!fI8#WRN:E=kna%nSW>%9JM+mNS"mE1Dfen+=%pQA)h(:ZKUF.qF="eLAh2JY-G39O:=.BB7GQJ"g@3r?DW@q1=<gL:7`;nsQ<Je(@c)6U,OFcVX.GQHuSBTB4&$i4ud_eqPl_N`mB<N."^b9mO=TKcE6Ih+VE0Z:1b![(9lNR+k@BlIVFt9hfLn`m$Q<\S.bf0drq#i/C4hSU>D*17ick$iWFJh'()Mj-m!d2m46P!6\=9jjg[r1T"$lk=2?0(qIn\2oJnYFq3LM<k/-Oidu<5Z&66XsFE+5#$PGb?iB,Q5H)`L6En9ss[hqhD>Cb.b15H-Y@FQF`V0N"Xm[QhS/i;AXtOckL7C`e<YYBPXXd^K8pP=srhc@%7Aq_WI2)qE1KaJ,=WjDNmPq?X<P7ZV_90l1<ircG%uA@@n$sUY%B$CRK6A/N;+mX<J#3>3u5!FEB%)8JI=AmFeih%3uTJQ&eWoaU-W9!>"%56I'alB8s=Sf;D71DXDF^ZAugW'!4fENP\OHRaJUUH^YHE7WJ1A*c1Zc`"T@cGP'1iV.`CrT`ru5Nk87Q+h5e>1Kj*b1c+\[1Tj^ZpPquYloJT4#KGNgCG)uLMirP9=d,^'n;h\TAT\LOmUu?]!TZ*NBpjknA385U8UEp*ZM4=77A,^n^Y#4[m_NruY5Yljc][E88bDHlp0ArsmDqlO;sBXEb+.U_Q[hErnHmsPX[5K]-:#V[>aLCiYC]$5.meRTL+YX;@E*#0$q0jf5u`om!?2i]%oEkkko./qdQVL>S#V&P8Z*L0@!hkFo7p7\ma&p2>/J+arRn\X1_5`p5+R[ki,i4J&qCk!s0u;j2k4au4%MRNkSST*:uI@fIE9T<M/Tj"d?Vt5-Yo--/S4<RhWWWn]>WUO*1kbbG6tPo*RS]O,'&j"<N5@m\2%n,I7j4i3a`q,!&adrZbTs7pO0cf^O?.H-i<rcSY?u]lst'L\Xsd"9j.Y$BoOY^F<0.\8F*Q=J5,E@\uo>_]#_Bk?)G:k"Ct'JpN2Go-D7\!7[(@$VU&Gd5XLM8jarG8A9R'1VJ;;;7jm574Wf0o?GeR[NehK6&-tJ0@?3PSY2a$tCrmN%]+i@i[O4#Y;OJ'0MoCI[Rf7a5]DKSE]2)f#e8-Z'gf#.^dpNe0Xnq?*DEcj']_U')FV:F3a/b\jpPWDXG,^AFa2)jS3Yh1I<Q)!kn<[,E_n#$R4IFHm#I.lmBgmuYEH=l*)E$n,*aJZ50?o9f)4%Vdfgsu/kCS\Tkp/e.p__5MYW3"Z@cGb<$osB/:%k-W<a.[l7qtd$6535UBeVJE<+Y'E.?*MF@d.gU1R"g6rbOb;>^a4s(_-'qKDkhJWU4<fl@01YGt7~>
+endstream
+endobj
+242 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 241 0 R
+/Annots 243 0 R
+>>
+endobj
+243 0 obj
+[
+244 0 R
+245 0 R
+246 0 R
+]
+endobj
+244 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 446.38 647.866 498.88 637.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 75 0 R
+/H /I
+>>
+endobj
+245 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 436.91 331.866 482.47 321.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 227 0 R
+/H /I
+>>
+endobj
+246 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 102.28 309.866 139.78 299.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 55 0 R
+/H /I
+>>
+endobj
+247 0 obj
+<< /Length 2073 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!#]>Ar7S'RnB3d,#D.;+9:u$j/7D_(KG:Us=^gklYGC2Gm'<8D.n[r@$?]%OG"MdPNBC@aW?W3T%Ap+6hZp7rL$^$TYY*bn`g0[6-dA,QEjj\8j0A+r`u%/@Re`cW9,F3d$)?h;]NR-$W[9\tp9IJu(IX9$T3>Y2lB`YnSaR.pTMY)4Q+iT5a[i'>ZSS%W!p2XKn'Cm\/$g';R&6Zn!TA.J0+3#qm_>DtMV!O(i%.NJ2cVCsDrY0aj2L_2KtQ&^=IEOa0N$EI.cWamTKO/%Pr!/.B-TJ-,WaS,!D-#CrE&beP"u!+:-O@6-Q@9n'S+[4;G[X!UE&(k,V?:Zo4pV-ToaMb>$H\DU&b?E%H<34>Yc/Ibl7@9Nd7DLC5lfe*E9Vd`c?;`WmjJV0-4ZM;j_r,\XSNfi>[VsB7t)kctIo=o-XGck\+On/A9#ttJXN@Yj1F'E_Si;&lK!AjW1L<B.W;K0\!<R7$:m`9=ZCYD](b+Rcm&+>-H\a1VUJqO(8Z3\C#Oq^mD=TKG)k3K+W:fkhS8f"cV8h]mML`3e3B_8,:H>TX(i%9M>hF-'.'.*;@,=Fa^g0PlhoR%lkP$rnmQ^fU<hgo&l77t'JoY><1Is:V\cZNiNo>Fthi/tkW"["o:>db/9Nn(cQ5cWR;*Ldq3E.YSSW"JTC/[7&G5QUS@9gJJ]nJ$YP*@E^`q5AiP@U=fu!J`D4n91ISiLAj3Dsc-1Mko<?eO:2)&_aklb>7;fkO6a#.]]8<[-loCr;Ca2n#q_qa?m%E1TI%!(tl/5mu>Iu<qU:eW!PT:<VEf=q635ZpGrQmg[em6F;Wlm-'Z?@,T+qBho*)()@QJQKgJ;>s/_#[c/jfm6_ZCHXP8^g($u%@EHR2ui6E&1dNJh.9h@p$Y)`4fDDF$kGu4s48enO)-t<f,6QQ&%e&:O+D6,c\T>^uoqWmeN;h69'3Pq58FoI@HM`GlQi!%5/O$%OKpdU_!+Q`Cp=Y\,4IMCOV'G$C\=q=Eg$fC^G7&oAO?hdg=3%1V9OG3/7;O3)jAC7a_h3k"H,;XEIq+=*/dEBjF$6PrW#H8_maN<%djb8r"ml51R"*oBM$"g9Q=.3'9E4e/E_>-sJ=4?>)V%-cQ.!c^UEjm4m0YC^b4:Q0oA2cq0hh?"*>lUL6TKuJ9ap,sJ-aGdA2*_RorJ$&UUe3@\Z=*/a$oO18Jto6#@+!fX@^qtskuMON&*6D02TO-68]2!!g[W0O8>PXn-S^F4&fZQ("+p^s#2'^Up"sHJE0JWY,Mta,?*g:c6c!gg+R5hf_9LNlLWNn/g<h8e/++*m]#I"#ZgLBbRkh*8`cd&bXL`Du!d*0GQN$ku^[CtDeN0o%Y=q'KmI38$_%85g,M+mE*kU/?jZk)TA-cBN"!bu_ENnVD"k>Xr0D-rd25!Be$X1=>WM99DdVa?UMTjT)!p;3T8lrc@DU"jX+ag=-<c$_G@pn;50rJgi?N)-]P#f!#U"=mmBV\V!"/Rj6\7FC1*Sh3RE*K::1/6'*?%bcsRG0l'jB@o*i!tGT=IN9;<6;b'gS3,e&+=F#![<$3!H/L<XkhVsmD`e"b_o?cb=Ttn/RU=@EMGj:<02Gi%k=*d47/%8k?O-BlBWanU.>O1Rs6/0'kR"6KE`sYBsEi=0!/HHiYWBZ9GrX#*`^;tDGBf=ok7rRb$]K2%+nWMf-#dH>4g[596i55134oqgS/ISK9MLL(>lqYRH[(dn-8:785'uDkTX!H03srQH32TNqD+auP.3r]l3##@GO#<lPY:[RRM3,,Wn:-s\GimNZqN=Yp8HP1O_;;I2epUWnrlHgnu>>qpH`>E*K_ei9R;TZTH-MF9S>_op0E<pll1C>Tip1Q?2S^8:=#Q&Pamo=8M*s!FW@INJF<)WBs5,j9kJun06W>c"R,'UfuLbNAeZS8OrSq@\\=H<Sp?Ieb9uA^nl4R@]h%R%TKiX%pjCN'qjqh/Z?a,-NC9H\85=nKaE8K;e(W2u&D@.G*0DQca`BuXaotF<HcV9GaA/hsO/3g9R):`UN8qLb;-<3--h=B8;[a$<3@@l+iSc`Zo@_Okh*sTm~>
+endstream
+endobj
+248 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 247 0 R
+/Annots 249 0 R
+>>
+endobj
+249 0 obj
+[
+250 0 R
+]
+endobj
+250 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 277.81 692.0 323.37 682.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 227 0 R
+/H /I
+>>
+endobj
+251 0 obj
+<< /Length 1760 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!;d=`<=Y&:Vs/:u;m.Ap#2RU-P/lJ[DtL-sICTI@t0*AuihB,\Q`;4*"kQ.$K[Tm7S&,#S52Uc,UuW994Q$**J:pCb)%sg"-)BZ#'2VXJhTr'9@fdCo)jYp"1K$3O)&)D8XNd`S$SRK$ig2CP?/-1MU\P7SCR!4D/^nW`]Fnh-dqlDDQ]MIC%AZ6"s^ep8cW$_ITc&EeoqO$I]0B,2T/7.J7PTZDq_/Q.L&R_;[bL*)n_)qYfg;kKB>&oN`dC(T\4=Xk5o(g.Bi"d$B]7^)Z9)[:H"Wd9EL#03DMf,%F$Age4I6o:1G>'F-+L**tP)S?f-N>pW+fK%Km9`?27-h9nE8_2>*PUQ)!OnVmo:I(Vl%)HJ7hUlE3W.9gu0P\@`[hp.H*b@#lo"g;]JQ*id^F>jB$Eb\Vu-eNWH/9AHd61L<MqSLE9daC%cZ4D#hXO,+ri!l7<#%Z?uXuA534#M\XCUU$*akockKr/0jQ6VGn7L(&F_Opp`[U^^Q!iW,33@q0K\_bjP(77AfCV:\i(kO#$@+[jM8#ZS]djXA;]'RUF[7QCMNi+JX>JtN@.P\hpP!P$G"ZM>8a31@o"M!UufPfD'CNG`=Zh#]44"82r^e93$!LgWPdY'1^ACskS()2=+!U9e*6^Jgc#d+4;=4@-sdh^NXB$E#.2>@;7WCImA>FRRL#$hR'@k&=gm<O8GR8K3T'kbj>PFr4qjNE''\\T#u^+WX?Qq@P&[qN)OEiFRE@S1U=6Bi4>T@pKPhEP$G)R=oRUD2&f8VY`,R-/`(-'1"<^kLYE!`k-kGQrq!j_pS>aL6XkoF4LP73qGMID>\:^)C@>Dc.,Zg=m2+DdiL%j6O>LY@"d(A<WlIBS#Q53!_GP>!-KF3ppW1"!?<Uq6<<"0Jp.G)T`4A?,f'$6&U?aJcPi\QnGBfT=l);FES-Fr,=l39Xl/I,dB^H_Ju7*Q!3(!?e=222Ar<6_Jr!aS5h468Ds;uXK"TE$!eX^HIgl<-9@]4^F:lL(9Em2:3aFddS!O'(atHk33Lu:!]J5.cR*qal?Y0*@sDuE,IHIOg:PB>+U:TNro<qMlKJGB/=21W0LPGW=U?=jr'6SrIBMI\X9Y8/8%oS@4UU&"<mU09)"%U1TN?h_>CI9jG"<h32#qeJp:l6]?q#e<Fn@qlWa5*)5]mm2DA(#eC_851$=r-",W-S]d!GS#r;Qeu)qi1&>pEI\#^@.j>q^lKD2VG-J6&+gjMZ-\3.W<"`E/i`2]Iuu3hHd<=8H/2Lt0T7p>ZM*]#IgMSWs,le+H'1:"[r]K:[-_VtmT]e,eS%*FkgNU\V&D4+U0/GPcakHXrSkqRA&PV`akWo\#1i9ZL?0>?Gi,ptbRn%ns&Y@IUF?$V8`M]r;m?$"g[cC+uE9I&Si+QYX*Z%_'iB_Ku!Wq9YIEms=/u9`j'@6H^!_C[8_WqZQ&G#XImgT?0#]5Db1\fK"7NI$_Srfb&.<j9JFRgqhR>'-4JAXs:F*mGr2O2$[N9<cs1UErF:/_>ClodVA(*kFm[Hh+*Xo`s:+-gt\Vi?hrt1fL\&&Vq,.ODQ_HaSaUo8cK\?!fl<`irVBB(%_rnf`$`J(:U\/2WHHl`@7$-Q-dqn<k>J#jq*'`Wf6%_c>K;6!#q1r%B7h"lo@NjE0&Wb/ZLnV3M*_h?\FGK1CYQSK-5WoMKUWcW<YWVf9Wp;A36(J559^E`9EQ)4.]1:a<7(!(DGSpLNt^1=oo<LeGG&!fs*X,a)5g")!f,dKkl~>
+endstream
+endobj
+252 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 251 0 R
+/Annots 253 0 R
+>>
+endobj
+253 0 obj
+[
+254 0 R
+255 0 R
+]
+endobj
+254 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 484.96 138.868 497.46 128.868 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 21 0 R
+/H /I
+>>
+endobj
+255 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 500.79 138.868 518.29 128.868 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 39 0 R
+/H /I
+>>
+endobj
+256 0 obj
+<< /Length 458 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!#X5u5?O'Ya$;oJdIbgX<L\)kn<G<$G<QKL72R/AalfU%.$p%DiH/7Z7SYbMLk>^%ZsDV7i&>q&fhX5m67aKYT^e!4`UB5odlVLR81S"QT9gpO)dFZcXOc0014!Bq6!r4cNtkh*6.80(MVGGmit2SF'h;W*',#)gQC24(&-NmCkt8fUg#.;6R)ZH'PI(A!<2&hQqp(S"qkU%+aA$.5h*eGt,^K$/;93A+oB9r*9"/jja5?EjVIR?,CJu6%!7%Q*F>$b&<5UW-(Vn/8PFIT?f_MI@B8Q,@BU7n5+:TWq+gLZ?c$I0EHm[l@'`Fg\`\%e4#`9/0G,dMj_/>m<MKC;gQ^cY)=mEa(&e@WmD47MJrbu2[8s.&dUf\Ukp4]@^_EK?^Ts')h<E(<IGMn9KD32J9Y$Rs2rVL:!tNi<c_C!s$A]rGc9c]?81Vok%Cu"E[.>4)GX%+~>
+endstream
+endobj
+257 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 256 0 R
+>>
+endobj
+258 0 obj
+<< /Length 2187 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau`UgMZ%0&:Ml+W;@8FYq#$R/W'_[`/ANl,];W6K(V=S&oA<4`MMXkq>4'uAI^"aZ56d\$Nq*/iXF/WS2mBpRU,j\0ee])>/kB(@2Z*RA6AaO1'3r+"]f:\a#@V0nbLTj#KG,s/3\MCAMf>/"t+f>p'sIcL9Qi(@UOR<B#!i#4TejaQ0VGfC/ocER9%#dEMYuQKc(IU.F..?'IAUT=IG*1.%qn:iRdR%4T8(k\(ABOG=II;b9CsQL1ne4U.Yhf/`)_m4[2\8nTHK*2f3*nStBWSD2hnY[,_]J)5+b[!+gF6,jD0/IdhcuO(kjjn6:WG!fcYX!2e$pA$VmJg_%fLo+QsQRY(Y%R'q7_QO!77k:G)g;!8i&>8]q\*?Xe[OZi^Aq!lAtd-/[CA!'fpjdU]Ic^t_5$uct4!O)3%LTGmX&1)5.,?Fb=YR&Rk_KH!%KOcaIYcpWXklgSTq#I9l*7N%VS0W#S8lU,CNKHr\8l.N`,%Cs\:]Te6_R2Vr-K7seOH^Q>)G/&l$Vn,uL/I8q*8kF0"(Z$5bEagPk:qf+bci)AA^8T;_*nD1>.d'T>c;'jjI'=nR/c2jj2q(6Hs]=][p!3%%#s_QZTg\H;5Y46-E7lRX_ArP<9@&L^l;FK?>/h7k"1`NdVK("l^2TBn0qU4!`,)@+Au!_#[!oG9G%I0=hoReZQWI;?V%rRK!6'.<&*ur:d>1'"sYFh6mCS<+pHV+P\2:p8CEIO:Nn70V1DPl@Yr(8/"gQg\ch`UcO\?c>Od1B0N4adpU+R88+0>`jGsF5e&R7.a%uHF'^)%0,A?**/T8Ui;IR$tP?r*i$P.>[\(NR=jE;?W3dZUHk3j/\:h<o.fQ*8EA<5o4Ga!/`fn4hEWMfkG-".ZDamf,re$'s+Dq-&hZn5?\[2^"h>"s3;R"1D]l@CHG@56#KV9[mJeG5Gnnhk'0[8dg+s%:IW2b1f^L`"s4]8BU!RH9:mK2Mc/0(Q-I8Z>7WKjgb*+,*tImJ&-bT3kK[QnT@g([u\S93oY5DWhEid[W0=2'5(/0X-jPYX_glgl5d4PUG\G]ikUE!&:W1XB--CIqAFk6K48H3o\[4pQ=n-4_2\lEI"f1@B!F\>Sc'\f+,s;Cs^^$;<A:j1t2r'e)^4Kg<32KT8M]8m't124=)q+;R-@LIM&\R.]%d[Pek1D6gcuD--;m/RrN2s`Bo,/kI..^p?mH*(u9&'Mnpj8fJZNJ,b$uJJs;G.RMa-;H[<.F9iE%6Gp=4_Jn)GaTGF>^VcD#MG!JAlTZ.L%!jtsO8p?X_SChr&XX$A<O;&aVWs!t%GhA?B,#EN$2mW)UlC)u<s8)ZXEI<,0`.uY>=VY`!BkSX!I,f/rpGs]l%UE.F9.1]m;<gQL[\Is1GaG=Hi4<)4Y>>;nJ'BXuN%D`9%mKWb%>S`qO`/id_euE4UUS-HATfS`MH$,(YZCM#K[`]V98O?qD\2#%!HNM6VuZ(bAdcR$lqgSaI&Cq=>C!+sNRei*FE3I6$'N7cUKjrKDlU0e]KcI>O:1?6H'80RBt,rEg-iDsq*5HVjZD(!MR@ZX/GN6GW07-"f,$D4e?<e@_hW<L2eAW<@]^PfM!Y+.pV)aM69V#;m877p:0j_lUJ+`?hen/t8Jf#qT5Z-]IFn+57tLpbOt6W[XYSQM;hY]^;dlBC53X\Ch`a?>n$]8W>KB+e3NKn2BQ'rBMmhdg+k'%lh"4@>mdc7I)HPCTC^lm\di:AEFu#'*X;A(kiBiDs-bPT^W!t1@F):s3IQdLe;8Y]Rq`K#,/'Ij\Mb4gRr?^Q%nkm[jXPU^ENr)&Sn_9@J=sGVa./&.6gIM/p$:ctG\/frpXQcUC:QQNa61+5EoVZ#qfJup0'BF:1UUB5G'eQgK2c9>+rUrOchWH2!`a&%>I4H_2CcaS;1D6)6l8nR%qM0Lm>;/hXYRrM!b+tRal:T1W.L0l+kh(GOV]#G7q-]R%SJ$JZEKS&8mX?j&0gl2J&JHe';jutErf'g^k3p%F<'Z4d!T!buKgL6#F\ed96_<N+X3EU#T8*<k%)ZIkK:h@]QOZ57nMb"5-oBcR&$OTEg\.-!D>R<1P/.q@I+.-#!]F?=ZJ5ZNH\H("*]dQthBX@@5uk`J[Fauj%G\`-\J-Lg\J;FfpbZJ?WicMf?eHNTI+IJ[FB+!aJ['R#Y;+&'MgkbGSrb5~>
+endstream
+endobj
+259 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 258 0 R
+/Annots 260 0 R
+>>
+endobj
+260 0 obj
+[
+261 0 R
+262 0 R
+263 0 R
+264 0 R
+266 0 R
+]
+endobj
+261 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 361.13 680.866 406.69 670.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 227 0 R
+/H /I
+>>
+endobj
+262 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 237.81 669.866 283.37 659.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 227 0 R
+/H /I
+>>
+endobj
+263 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 337.81 575.006 383.37 565.006 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 227 0 R
+/H /I
+>>
+endobj
+264 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 320.01 490.034 365.57 480.034 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 265 0 R
+/H /I
+>>
+endobj
+266 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 224.21 479.034 269.77 469.034 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 267 0 R
+/H /I
+>>
+endobj
+268 0 obj
+<< /Length 250 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gaqco4V*,u&;GCX`Jlb&g=AUXLa[n4$.23I_GHp]a@?;;r:^s`WM[kpHVa+%SI3q^#aA]ul4FT+!t)t0$A,f^6kW-A5dc]KF.+Xf`PMpN)o9)N-t?4c%d7NmqtTI>EES`MoR5/3G3BkeA4(;4E_bC&&`F;J8\[C'#]UXf:re&57W:nnO&FDn[U&_o`qijtGhUCG(K^aM=PZu'W.(8dTZcN:7+;+:FB"jrg3A31K=NDE-3k9u!>M+nrV~>
+endstream
+endobj
+269 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 268 0 R
+>>
+endobj
+270 0 obj
+<< /Length 2372 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0E>Beg]%Xua-d/#1OVkumgX_a/<Vb+A(VeNcB]9h"=JX1#>;r'p+j(*W;J?fl@1?H*RZR7CA"bOMphufqU1cq,<#qbESgR9]iChn/[/K=\f'frQ7g(C#r@*MU8bGe:_XKc]uY^ZEuNd4X@Zf=!jYOehJo0b0X/G"I[[GW2"eXHF=cLEK$n':1CLu]Gie0fE``b[5geuIZ5=GiKr,1"d0JhKR4OW7:aZV<LDV0^FRkT/Q\LB8@GXY"V$oA=qErT[bT\`?c).D]kqf(q)=I2GYUV!P)"7)pJC'Fo2E&$ARA+8A/SrN`D;oot8N83F*-r.#a/U).Qa;i,=e*^KmcjP>TPDgm.bN?$mL3aX!H5)Cg[3s;huLQaq<4KHC&Ik^qKatbb0JZGHCGko-JCjhlCK8#KKHSH-N(m-^:L6Su2#d>S:39"Fth/F?tqbr6pgh#gRT8CqTZ(Bk&+]+;#:Z;QnM2=rSRmqs?Pq/m?POBoe^>-DImJ(f"om*U<D<cko%s7XE1M"nf&"h`&GMdn;BaAY"C`lk9Q>2,A+eKiYZGA26Bkg767<9$V>%`g8T#@!f/laP(U$B<UjUEe-$9Y:f.'[h/-Nfs`[j$I1'K'6V6#Krt)?\8WI_aK]#jmY8N1N)=nl./b<WeOpXn/FkX`qB^*e1p$fc7)GV9r<F-;!9e-m:Pgig#b[l(c+M0h`o])5D_t8dq@X5C3TG7grjuTPY2@3L=WH=qp`h5k8C"KI4;9nG4ATVPAYu=&<@.GF;ODBVcYaX93r5<C"3fbs!'Bge\]b9i9t_4^_U2h]+F$e9R!SDEiW>l"De+<!(6*8b0"7]bHoIf>CFqrdL%V#@5*"Eie7ub`?@SpIBJ_nO#(^9fb\tY3cj`e)W6Ekf@JFr?oD5N/A671r;+[U@1B4n\&g6UhEShe<b)03KY:&"+:Eo^q_acJZU5SYFbR649QE.m#F"2/$T^(;FJ>T8#+m]5!/k*)@&`%FKR6IL1_`*]EMnt@h#Cf#PAS%IEp$&2+I[RZi2AT3WD6?MHRdX+q]1hO0$D6$2,?B2U*AFEMq<fK!<,9#82?dgr`)HDYg=5"K6la&0Rt`,2k&$Ithcs'*1/aa=UG.FN-XH7DafUT)i'MX^2_KoP.=hJi,3JXN?6G8%bgr*;Qt2C/HFpqCba265rPkE9c,qoU;b1R4rFDQ]X2%BF"6d4GJ=V[&BT,)T)Bk11N9:6Ad#@\$"=[1$UL29eOU"K^*ik2n)i]^dQ%I##HQ]R0h%-HkP)6[24>'H$==Vo3N&G?u%.!O8#R<OtU2!T3Yn!U^$PbW(Xd:Wn8!VkKP68Ys6:h=`_L.kiuiIFX)sWe2=K^hjoEKA"@P_r48r4]pTD?',6(/a!=C)OB)/qZ7PUsC`p*kIUCqbl`I,;VS%#KXodkZh)e#2F^:M5-JRpRZuD-e:F?;J_l=#PrL&,,fkW`"q_m5Jp>FF5Fp#%sr*lN<GOG`c/QRi8K6*,qcd!\F],Qs]rW=l2KP>CE4U+L9r/'L]C9jjSBZZ([[j<P^i>\H['''6r3@es325tctk8%4MP*V61?-cPtY-)^up-NnAdI+c;Sc!eCPK9LUKF+gYp%OYa-l'T^2"4bno3i-<`Y?G.a==_X5PaKa:U>4#Cbl@7*%<2#IE;K?C$607,c(nQl,Y.7"-M9WM)NCuP,@7Eg!Z]/EW$Y-FA$H'Yq$^"+tk)Q._g9Hi.l*;(U_EBk#Hi4p@U2^[,$Q_'"I=PH2iCKO6`]q,;h?.X=''CnlN45Y?;2+oZPXZ?B1p.UZQ8Y_Q]s6*R@dZ)X2]uHo,^N,8*-e-SMhi[Wr+jlTfk%[@<NB\#+8pcE?fOB3A"#ZcqOp(Qj_ao^l$cIf"6hS'VZ'P-ZD;Y@SUN%7)N=G"T(\VV93*+_4+gP_7_!^+%%_W!bUd".WW;:B8_0SssH1TWiU_7O26."<DY%0-P:LYFM?fP04FogQ>\%=e%-q,ZQt=2_V@n7lWC540UB@cXluVMIp>_igM2sFaea!P0>]H.qs!RlBk&PQ9@eX84d$7RSo:XX\R)DB`s^Ljk[noXL@YN:([SOP1#>jmu7\(pPEPF]Nrm=8<5YFes>Nu(Q_H**Mg@8$kf*`I#.!<O>tOG]V]kQd`cdQ82c74Jj71oeFeXLjbRBM/jUI=<"HJ/CXVuVc0C:.)Q&Nbr2@X^ZTj)=-sR_/55uYH;A"HSs"1T,be0n"R]gU/$e(0$>3HV)<EdEpLD#%0:Ta\B3!sjKn(t]XH0p?X#>`ihTUU6,gUAb2'$AE]]u:d`a0r[Q1Q>,E4[*^In@XLl,Xm=s`ttdE%W0]'4ZPct6?ZoJ<\BJ.Z]`;bUeDoWT10srjWe!'lD=KJebo3BWq^cA:!9.~>
+endstream
+endobj
+271 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 270 0 R
+/Annots 272 0 R
+>>
+endobj
+272 0 obj
+[
+273 0 R
+274 0 R
+]
+endobj
+273 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 92.0 658.866 137.56 648.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 227 0 R
+/H /I
+>>
+endobj
+274 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 257.8 583.866 303.36 573.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 227 0 R
+/H /I
+>>
+endobj
+275 0 obj
+<< /Length 2080 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0D968iG&AJ$CE--,4,)CIUUh_K'ijbC7RCJ:2*g.LV$F\UXTo`77o[e<'LB(5FXE<0K4TtEE@UE7(m`WSklc$u4'C7ishbPW65cu>NJ@NM,&)U<EIDe7GONu\(Y9tu-]F4KtX:&Bc]-$#pf_8YGQ.6ES,Rqd;Ou!SaNe5i;[n,9<Zg5EC/o33/CHQb?iF(U-.B-U(#^-u_oC;JNl>0JAqt[7len;>BG.U360hg2U6rBQ$f&9dJjm7BG_O`c[S]/nWIU4-.jZ@qW,%$[:=RCZr'%@$:=jR9>!LXSV'*<H$#L'ZF/G>0q.&85P&4bsu7`fIF.[;'t9#fP_@Z:XuTV+*jCeTRQ/I)6cL0F7bOOQd&)aIP@;pO8O(,n%.n2"^Wr9?>@`-(b4r@a%BMmYVIQrD]T_!2)i.C=tJU!\QFf6LE>+ZcRhlh\[Yb`H_*.dkJ8]+uMZ'6"to:paJXE%Yp^3PpRpd#'bc]l#rR#!7Li4-uB*>u`Xc=*gXap%J]*r,?fSHfLTd1jg,=4\[p1OP^q*Z'(QpI@__[2U3B9<Z<uDUKlp8;D1E9)'uQ3%"Sc]AL#A1dF3I\hg[G21ZeBM-6$H_hiH\(Q+JX0EEQ6Fk<']W#']7",*Fj&X#.2id5J..Rd@N<[sE%C0P/IjiN"qr%Z;C_bmG@h190F+GU6'Zl`d>IBTn+'<DUcESraT!b2TrT;9t`sE\%[FIBsb''3FD:VpfkTVG'5(=67o;+idKLP)%&6;4^crSCt$]>\]jMSJQM?E[`g9JED$D%%"Y801H!fN!q.7n6,*IW+i`@l<TjLF%u[e%qF'_5%F\13CfVA&"/=XcZ+gIB6Q%<(bs`/qW$u9/&JRkGt4sn3T:;/Om1hkZAa\9:)[0D\UAsKF1HPgk#fO?)43#cPr?r!k_HFnE0t<QT%4dk!2k7F6TS^:gCO.*Mp=J0S+1bP3l>dEVli=9OZ.lg#a=^s1kS;OOaX&TiRF_]j5=V.Y-]A#EZ$Bi_o1gV(MdJ_'^"LJ_kLCi8MA#/\&T+J@In@Sp+^&e4K$0(6oOk.mqV[\F%pj?HtCUL>Pb3n6iiZRJ@2tl[_cVF11Rg8?&bo-2`=k"p<eYq>Tt#ZDU?n9J_r5jQat.FCB6K[;h],HBFl"EDiJ?iW@b'[b#[up$I%K2(8)d`\\6,.l:fY9hEO*4M_K"i?U8Rb@UWGg>>'TC,p02@A"*=g\"XU*T<'XlS*GIf:TU(cMhi3hIOha[C1Zm`I!i:6',Ro+Ycd&u8)mc%^t-0)lK+mHj[K)kSIQ+OX8&BFb''oPm4:rm`T5?)SNOC4UC<f%BAc+28IAY%3rMRd[#2;%RcR@E>YG\q,91Ct\#-M-VMHlPS]a_c?)lY!l@-h++^D0^gL^aA+B3Mqr!RJ6VM.X:"I!(aTHKiiD4/4M!guIRZhrj<[Hsb3<6Mr3.]Lj/ZX/BO1q];)=a>150i;lX`*Vn2NY)_ZY!_V9#'CkNiMGZ.M>jUE@jm&<0/V,6*7]HO,t<VP\jM*`)/[\<$/i&oFp8lPcPjLT20FPEh]LNg7DSbQ)Gl?sC'P?C+=[RX[>3m?FX%%#&LOT9IJ<g:1OF%H6'spOX0]?OS&o>%n"UE=/-=o.D1WOPbB%3+E=B4B=Z"4g9'(_H`4P6<ouTNRq?;ktAV;:h&+\iA^W==rF!Q?eR>IUI6E^)jZO$i6'&sH?:&Oa^&e#dD2:Bq*kb,J1fRk"ONk>-X%@]%V)K1_1`huOuGt<`W3pVsZCjpV,K;jWX@n&=M8(K;9rRc[X9uER<NNa8*WF+9B<OJ`'.-2!uCg,Gl8ujAaZFlVa",?'Cd[YK+WDU0VgGulB$?jG&%c_(u(_9>(`+ZnYBtWqI9rkb75/#eJUjGJZWEK]3FXT&pkqNCA@ffPdLBi*LI.d^M;K0f6L[oRNb7^DH!o'[l1aPV\,8c%J-:Ei0S^Tga*@P]^ZD'mU7RNj>6]i`c)Z^_uUO!04#aKm8hhB(7K=ENQBN*(W,ojs3Rro@3VFFp-Nl](*2<:,2aSu;5E##`o@:@G<(.B)=V(eK%hhUtfrHJu>(lo5_0!G9LX<43e!$gBfM?~>
+endstream
+endobj
+276 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 275 0 R
+/Annots 277 0 R
+>>
+endobj
+277 0 obj
+[
+278 0 R
+279 0 R
+280 0 R
+]
+endobj
+278 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 241.43 530.649 286.99 520.649 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 227 0 R
+/H /I
+>>
+endobj
+279 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 102.83 519.649 148.39 509.649 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 227 0 R
+/H /I
+>>
+endobj
+280 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 411.42 519.649 456.98 509.649 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 281 0 R
+/H /I
+>>
+endobj
+282 0 obj
+<< /Length 2177 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat=-lVlP-&HC$_TnY51K8&.m-I[nU:=B[a)P"5Ri58\]gGbC>MB4\RpKbnH[3qLrg<>54Nn(l<\%B]$fu\>Zo&E,><q-.@'@0Z9`RTCe<\3!Xk:o)GNfm:OIe(P$a-p68nd_W':I)C*dlDC8pqEb4'oAX7%,6HDAHS:.:fa<+6CI1u:VNQ=E'.?*oXY)<MQZ_DWNtZdL9A`Ejmh^9`V!eAKK74rOr)e),NW'rr=7_sMJhdphgasXmgf9f$ubmFXW$Iq);A=Dl0N`ekN+2T7<7<p+*8(T41;#TB$FhoAf:(lm#";rnq<n9CNI?.1sXd;;+*k"#:.Ps:kU+59NW:=KS8Oso_"`[Gh'IhCYHG6Wsj7)*:RMMAP+abU]FJbUHqi*DZ_%L4:Y_6?]"b:rPh&p?Gm5I:Q/:EGfFcq$I6cF,Y'Vb,bu$^YfD]@0maKp[p^Fc@=Aeqcqp"mWI'Vr%lE+h'Rb0eq0l9PPV06iJbsI+jE,CcUBJ1u&=CnY87P?H4OY^p9I,MB[^)`A&dLZF*?<GVDF;8B\XFZV!g987`4UA5Bu8jU:Eu#Y*-duEA4'Hijrm_8A`q7[cLuA1F),XMs"qEWhG3NO^rat,an=uKffGtQ%o8rd9X$*MomLJ6$"aPYZ6Dkb$BZ;MdVGB#HjD$7_cCX!OeDpD_1K.l9WL9$kT\N3X<JF%a^Qe)68XW6"2QGbAN@H?l#gGK/d]YG3-m`:[TlIJp6)=!=A+TCmS4BeE1,aT`C9Lpm7jLMcC:$bR\lJ>C6d3^aTjpM6CX-rcAMG-Q@]hY;%MlEE\+1ojHa:6rXlIA\@bFM(_!iaHE-E3VdQtk.pK`!!<*loS#=8bo7dpHB6d+$qu\uacn%^j;F8P%;4/hZ7.gTT/Z2s(S2U&fjR2nQ,+?6FC4!B&N8:lR7hbLfgV^+<]DI1dk(p+[E8e*o%PbM_p/X+I!6Gf!m=U""90d:'9TnRM@mZnd=4id!qPkJLdk_p:*HBb?G+,k73a.#X&b#R,H@%l'6[VU62>2DF(etV;3!f'?+sQP:V.<H3]E'(`i4#i*'dpCa2?c4g;]]BoJq.IC9CTCqS](sP<8])0)pJ'^Y6_@3fo!"p`2eJt-$oYelA["R++%@hn?V+.A7NdE"U8LGfR!>jjkJ%fi33WYBjVt[4Ib/"Xk.rb'B%jq+5_/K:$I^j@cUl`!ao0X9ou1h1kHhdXQ=G_hl>K[_5VMnW4K.X#&D9K9[u;S`l6$KLSslJf9=luY^d-aoZTJihs_>4169EoQ2u=@F!>:kEr(^>@7%lAG;CRM,';s9`*ubJI*OX[6:*"maBMu(8>On;Kj6TZRcD(f^h-a;(bg+Sgp(64j=&r-rc6kZ\hFifD3&S]*cMH2":j"QM_f]B5(^).S-t9OiG4L6@fI&6b(6fG:FR$b6/jKFBtOU]/rL8sjf=V6jdm'7HX>gV7g(Cj>8i7VIq$-OO6cMh*LGrFIldaPYN6<6oU=kQ7ZoA8o4hjYSjqA-V8a/>@@K6D0D2#@,O+`OSI8(=HBI#RA6!h=3pr?nC98E`FC1P0R.6K(Suc,u1/"14>E)P_?E3\8nt,an[2+O6^(o!1XN,(r75W'YA,I>sR(:SpN[3&)AP#F!"[*>/H&K5O':RU!U4W_$hLKaV])h6#%6Hn_!:+;%T"^<7F-d?ZY7u:5h2&'hO#I,^@V=LiSFt6':**((I]\CUTf/[`r+F]kD"4Aa>>WnQq,T\Y[JN=hL\EIH7kY;_A@4=BCpnElQN^^)m)I\#SgTj@(Ye=XXY!PH.P;>8P-U"[6>^$"oM/ute#]-4=Mt7l'Z$'Q?INZUQ/d"&:ji!cXR^Q\U00ea,TJ\qO@0&(J`I^)U#LC$03jTe<.<ru1qKd]hd(Q/Scf"We`!L=WeV9H@&re>)u/trHu).j]BHQ7SCDphP!eLR7U<<\ASCSa*/;caFL-#'&]nWj2BTc[]&osrr7"`QG4V\t!n=I0)KAMJ:E.SrD9?]cY"i',jT#V2TT3XVaK?pr96Kuqpk,lm,\X``D7U-J.U7'9?hJhk-g9loX!Z,hCK^/()i!d]Q=LVFX]nl=Ka_H7cZr?X!#)j>'?f&\6$[$TRaj1Mh*J_hla>WRTVFq(I>'8b]_!92Q<W3`!mYteNu9q9T9@2Cja00f4l-R)MscUilJ]:qjaR:WoRC6~>
+endstream
+endobj
+283 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 282 0 R
+>>
+endobj
+284 0 obj
+<< /Length 1811 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0DgN)%,&:N/3E9%g\-A%$]!Q)783cWu_PI.KfBch.UckJ%9Th'ok&uAsm"YV&F;)[6g4l[^%h6Xo5m_QbYVLotfK?jW9q&FjRq<$q^JM3,J#i[&[@@i"aA)B3eSQn/cKAQlOVM!!UF<l7%4q:ie`Jt>@fYNNaTQ#<)WH>"1kB:rhFEHl.\SKP]\!IoGT=eprEtup=i@</RU;s<$jl7nQ^-o5pX)Xj*I;=*e$6BPF#GJjn5'H@bl-F3C#Y-!cfQ"))g1eDM7TeXkoD4nG>&?d%cZ:rS[+Z$tY*o.i;(N31Y=o'fN7#Aua$CR:,bTbP%!fJrlP4f5VjY\MUl,%e4O6B"HG/jc1srOeHXIT]!9k0pjR,iq,SN?#XcbXQ5;e!=<urJ`\_&#s@MXJCU+WJHVi.JR"QG[PRk/?1FKV](gGhd4rK8f9*IY2/mm_%4Wm!6HMnjXsXQNhO`[]JlD6'6rD\=]q'+8Ce.gohs*nJpkWMqU_\B&`rjGoGMSK3/addluAB!iA*,"smKG(oCqhAsA:VOPf`QXu8+ZUdlM,'o'qZeJli/BH@*!8>PeE]'GLgF8\c[pD#Yo1BbK*h8hQrj;_uL7rSLS#9-a!Dj?G.0BnKN<E]e6>7lVjU?#I`k]-iI,)-j0[;@>">#NA#&Dn'kqUM?D]dF`Ht1hEhFMd%I<aO9Pgt^uhu%eKp!YR\D3[i$!;)tPZm5%:e*@<2BIEbo/b<b^GA3aH/:I<i'rc>[b[BbRFP5p(>f95$rjG^fZ2U%<$V%2)Sue:KGO85:#]_mPcA!kJ3;/,uaOEY1mi]AHa]pJMm.G\\kmW??Cm+&rC>AN&4$>8eDF<^.8h\UTqQ$](bO[KX<uKZs)Ou1HYZ,8QGo3UDEqjBF+dp/iJc(743'-(G/0%oQmk&^<Q;AoB&csIJkPufZ'9P2[YO^mnf^/HRl]a$-1auV(k!PR@:g;Ih(E#nS`#JPJ?c1a.^0_uiY];W)^4u$Z9#>Zc-1c:QRkLtk4%!tG7)Sc`jbZ"J*huVdR]Tl88TAcr2Dh>QE#5>4_8F@g[o)iMYrNPed6H&_(98uZF00'/S]g(Z*(gc[P4<YB*N3-XYnXXO1^cBpmb":t,M"H"eM\IH6<qZ\XaUu`MH9[(L1YrXPeV)$VrS@D_@r31;'<6_m$>CmVIfPVnjVh6Ka6F9,?PmrCU/])U4)jAMKLcTVus^_\i,Ie%se/7`_?C?oqKfdM-XERX'V#W`r<a77gV]<._hfgWi1c#8HkP'-<::.RaYPre:emOWc.ueebMPtlsqm)3Gf[#1Gr.#FTN1()NSeEJ6Bm`2)-OL+I.ZXN*J'CFs<UJA^AN<T!N(N-(H4E5O#iDa:4O?H50-?q).=('#a>$]Mat]+CuQ*-4mF1Bs&QTdT4>?p75?VbZ#2:;-#W@D'kdkJOqM[lmIB5GCmWtF)uktrT!%I;0gt&GK%T(EShC&CB=`QljC7d]St]fMHE1qa:HX5Y-cOF>G8j/)ZMn9I'ZUN_!S*Elis2nhSBtU%t?p,h`V_B,MJKraobP[HQdU`Cmbf+rWIH-gA;k>'b^2%n+OlLarDm4Z5:p%:$0FLp\h&,'"KogrU\0sM#7oaV*q\SdiE4%Y/HZG-+&s2aoB0sTMnD"fiEI*'=4`(&Ot:RQUo9qSpthSf",lg,6r.S&>5+FUHd61S/CYfM_J+aFZD;A@@kL+^ic761b;,s7$rF5oHCHATKiM3=\^t)B_+C2lVlAVi7<lg=]`Wd7L#=gAhJ]\kQm>SOO(!g9d'[))&lmS^BCUllbL6n@fP(0+7@nGlYeQ3\#'~>
+endstream
+endobj
+285 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 284 0 R
+/Annots 286 0 R
+>>
+endobj
+286 0 obj
+[
+287 0 R
+]
+endobj
+287 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 489.16 620.134 539.16 610.134 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 43 0 R
+/H /I
+>>
+endobj
+288 0 obj
+<< /Length 1807 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GatU4gN)%,&:N/3Y^)Bn(/06$6$Q;R30)HlP.HLu9IJ*f6pVG!?;qQEj1k'R@KDQ==csln+i(d]4hFfIokHV!*Y85h?tTt!^CESb>_caJI#%PA4HCo`:e7-D3g7D;K3+VV$h>7B/j+^?CgAZDIDUAbK1:Mlg0%[IoVi@5p(D54GERC2ce`UG]<FGi2=fB##mWOOXC[gC&AcXOFhS8k^-3?s;ACBRB,;r@=(hHORWQ=_o)+dF<0gAn03+NT-dF,ZCG3RIBl]f$D#VTcRCu]]6Q2?m0N6hsq&mXU.n<T:a@tiXWg&3D/W9BV:?5[FX\pY?ID1r"HKYU[(^dncr0`7f,?bl4$3<MQBn`ir0(VEOl"Gc\6SY7AU<aCka!agcWqkI@Y=7`1#kO=QQA3A,&M&-M;<)oD$42jX4X7QZcT">"U[<-i>\f8a5qhfN2]8TD,]8D>HpF]Z*[5bEE=GqjreJ+A)i5tgMS.LQj2cWYH0s#K"-.=bH'_TNq`XfrH$b_).Su/(^W2a\WV)pfn\^6p<?rP=mtdK!,7W>/S92e6QK<RpWS8MDIVRe*p3T`5!VHMegdQl<:sLn>&bV1BS2+dWlu:6ai$*o"E?=50K$M"FiRE'Kq#"oZ;AX?096_W']IG+8Vo.,Ia280)deP?.L`Fn>.E7/be+ou$Oafd^pGbXYQ3LB$8KN<;X7^f_7cErC^W/%f*H.PgmsQYNo,eNspZu;t?_1%)nIHi_<'ZQYj;lmuBH;Wd&`iCEP9Uo62O$d#$m@#Q$E@t\>9kphTg"=0&umE7IN+>dcCftNST%!hiibQc7'5ge=kjST'#]2;5V9_omFLV:mNL1)$$*N!ZZ:[9?8G2?%hXG]Zq=;6@l\nR+M;k%IFMhf/dsic%9mBc;$8WLD+q,ds#KPf_,3?!g,,uAqlA],#"8T\<'.unR2Q[PE>b,>=m/B69#7;IVq+m-BKkk6rC=e/SB^_u>"H>g5=B&WZ5i$`dr^Ai!-:49V<KI8<Yh4IqS_-/J:5[nK`sHGPJupGhO,0(ZV7BH9,nt7M%R@u5U'-H,V0UOdHX_+4OVErq7Mf1U#bX_75hPm`5MrB[EG0"To`?lpKB0Xf*N.mS=8q`i$0sp5>*&'Mp)gd_UY2J.bUG+[4nXuZ^ski`UmA7RWYW&)kQR,Z<5==,l90iik+^b$5+9DqTRC7LS4gOk_h5/7C"K)8RcAj%OIR=;nEBrH?ug@6=(N1(l'W,=_1&L;a\S2Cf2^IB4f92bh)TI3*P[O=KBfS-shd!DbY;Z2R;,"?AQ5d9<4m;,Y!L0,)q/I4>Vk.r'ZRIIZp#,Q./s%Cl*9a<UJ'!2>7Je2AGX+]&XpWM,iVE&4!%h]hH5L^LH1d<XUG2^n9Etc,u&G,ndPNa<*1;bcY?*=G;H0rL`iYInY:cYj3FFr9=(Fot0Paj,G-!qQGNHk#V59T5RMOmlp*Sjm$],e+842jnjN\T";ThlirM_J"Q+t_mNNQjF3l;)^hjpas`k#;,8E#2*D>t,@MR&X$o`nP&F"ig/W714_TI=`ImEZ00btB*c4]@C"9$EEDEpeYq./"^WD6FB"sIb9W_:4fp6mWSOGHK`Oenfa+f4\IH/ToXH[T8!+Yh^J1T#9O!"6\;`QB!F9h^qPOBiA["bLsq,kGkX0.qG5J4PTC*',a<gXHB&Tri#jTO?VGB.a2l1GeHs$^f^X;`#+nu14B,HUmPFnj65&f@'O+!q%rbrBA[>sTr=1XY?uQ./fb.AI;kBD>??GTr$EJS>PRefR%7W;VM@q)\Fo,><,45B3-IY8reln_eo#Q*`@~>
+endstream
+endobj
+289 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 288 0 R
+>>
+endobj
+290 0 obj
+<< /Length 2162 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0E968iG&AII3Ye!g%=:i;-?!F:Db=u.fEG`*H`&YUI,]Q/5$;"AqIsmY:@mP[34OZu94Ml-Df]S#qjO\*aFQI8%&m_!PHb-ZL;,)gq<-&MA\a[RY/8_uH4q2=;&PA(jTrmYMD(p6EX*)?VJ7@.Wjd,(Da</<E+_^\7MoB$@:OgU,qI5Yc4O+,hNh]#u(Ve;&/6p,@-7Cfep_ZJJ_*QpjD>H=r@V\rH/8;3T$S*4lCUeh)`C1F&@D(jUO]Q-$_E:OnoaumSS_-!r*DK0Cg@I</22H+m-f+;8&!L*$ZAD0:ZR"LE_m,'Tg3eje$aUZ!bEg6cI:qPP&;?9g;uUpWZ[CBs;Bsk+*Yl7kT)X3O<08):+G.LRj8*2=j0_XG2,Eg^D:^5mSFS5aU]I3+_gI;=jn;k/Q?g2.)3))Z/ZJ+b6*_E2)4[%QLgZ`rR,dJKSAKrHXggF>,UL:R3!e+e&u69>d[`J-LBR]KY5`(T;Vjp+AMM?jbA\VAAK)0i\Jd.^Mm,`+"\B![Qdn.4:UVqSUbH*bdB4^0'2d[)de865Uu<M/EK8S9<%`2Dj_Q9_U.RIW`Z8a6?S=]Z]&a7I!rrWC`n;E\6P`'qd;2np.i\S$%IJV+EP;s,/-D.1ADIcN*QuoggY.%)FPL:\ap*Rk9NT;[FclkY`js7'EoR#V)XC=Q9ij@B"RIuOL/RATZK7-04]\"g35Y$Q"'H<YX)k.,hPO`,^Lo0M]>Ysh&9eh#AIU,*UUID/'3QAZ[-7S=Q[Om!ONBq=5F<h_T%i`58CH[*LT0V`b>T0)]gEJg;#3JeO<:bkIdF:Qhkfo/OuZVV*'%89k80<t'Xqs;QG9M@QbR@o6rsXi=!;['8PGA]0'[]$A)'V`ma9M4HN.O0qqBMUDc,d$Q8QF+lZm@kcnUBPqjM)CYSpEo-,,[cm@j8en(29e)7Cu]!FH5[H(37`\tqbG!,',8J_O7Gg(ndMLU!/c2k6o.7p!F9Q*kI$9Nlf0k4[i[e[l?Yi$P@:ad\;]:u4sF2^A0Xs0=<d\pM%)p,:%`'="akC+6W]Ph807X,BTr^TBL/POk]"oX'L)(8Lq.)$&Tr^WGY+YHO1,:u[oqak&X]j@^cql01dM).jZQ\TR"LBofFPTu5d-WTVWO-#*-mfla!Zcg=lKDMn'[ZuqOB$Fg+&L'),L@_hJH"a7f/lkea<Z6cTk`X)Xc=e?8R-..@6BtV/O_m=e*F=[X-lZEhQ6;mCu=YhJ.MQHB&jhN"fGjk86KMLlfCTo5KZTa>+I6m"8ON[\f6q!LtDoTpECkK6W]2((UMG&.7Q5<j@fi8`!-^SKE!h&q&+giCCK6XgUAVZI1"fH&Gh\Vg=QdVhm-j(Bd-65lPlE_th-j%/<Z`n;ZDalSb'217t<fuac6<\PS2?'#H7pL^s5d\1!!0k$$!^Q$<X(^"]k'=@22$+i=>:S"(^'Xp9a!"KI4p'T0gbEnP/Db<>4<35>/Dk!<GaUHlB=ED'qL:btBfX+GKB&X:AjTkhJ);G,WCnWh_H#QoXEN*/lHn%Soga/W+HMuGn0-%R/M9sc+29qo(M-ROW<GU4fqo/[Kc+VR0O0r(mN0_/MI\O`Q[&-6d+I#i'tuJ]ejG%eHHWhj&Y"d"'g=Hb[2(HckrutJ=/\t6Cr1/#&%ZLV371..WKL\kW\@^055nDMXa/G/U)pRR9*Jm_.X'VmNfD]'&unW8l2u]J#GF6qR-T>cAL&^32lU9fP.8d&VN'FjbP<`Gp7XBu%a$_F#ubP9$.Ws7@!iFd3gZEag<XAOpRSF3&C*Z"obp]7r9=lQ"Tcrr[c1F79i)W:WK`/.Wrib7RIgij?%r@u:1bL61]2!cSeRE.92/^%9:FB$"AL+cSD=dl1Yf\u/N.O+j>i5@G7'%1gi@/K:4JX9:Ynl29LY7KZ['6oLF)u"*'nA_hV6ig@O$?=YWJmR_p?X@?V.H0qnetJ4di@@L&Lq":PAh6,<tTYc=&*HGT9<dG=X,SFdR^rO_X;QU\DCobH$jaec.op5.#79o5:`a`!4\u/6GceTK]Wf_*@hugkfXu<r-11e,KW00aUGZ#]YbtBCMLd63O6n<&toDX&,_.g`^&U<%g3NQ*&PVX^Vh^5U-of=?8f19iDgT.<qBBHk2ldnEGZZ37d%Z.t;p^D;Ti->XD3~>
+endstream
+endobj
+291 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 290 0 R
+/Annots 292 0 R
+>>
+endobj
+292 0 obj
+[
+293 0 R
+294 0 R
+]
+endobj
+293 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 212.55 699.109 265.05 689.109 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 67 0 R
+/H /I
+>>
+endobj
+294 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 428.28 655.109 480.78 645.109 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 67 0 R
+/H /I
+>>
+endobj
+295 0 obj
+<< /Length 1630 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!#\9lo&I&A@sBYW$8c5mVoFA1*S$lc>W?@`RLWrKnu<Lk[4a'Z#<q<R(<Z#G`bh5m!dNqU!VY,_<r&gU@\$r&d2jIHatg7^b1h5I7KB)7FAW_cH!BGJkg6'5P=e5*+Qks8F7&P-O]&nZ22T9^n!t@b8>NoCbE'AArH75,TCGN703#BVM-1&i;2m?2K5N4([tMS?N_qA*]%1s%Pro5"2,h57K:jGjkU#+(jtS=0q5'1c2W7<[60Z/E@>Qe\$?Is2O;UN-6qI^e(r7O*</2.3Bfl"cHn"5><%D&!#VAp5EAnpj:?HFNm3YNEqM#5(uBUN7F"\4ja]Nn\"fo+8H18'OLV4<R3=1/PJ*?0TAZ]J<FCeh[fH.kA/Y;W%tMI'hd26V$4r2N5(2;@g6sU5XQG7"e`bV*Cjm)'p:ihMIp!8QPn#[+8X%g6Y#C=R9kj'K&(2u:D5l9BIT^@O[jN>f)CI\m>OoP&-eE#JWCe[EV32&d%S&IG&ru)6adh0/(9@W=-qX>'LKoMR5<5SD.jN`@6,ng2#&nGGacFj^PDW[7`-pd?2+o5_2ot$doH:T(ia!^8:gYSZ\5B"$!)hMC*IDs]V#F$VbdVa"(.D,Z(CKXDVkQ#H!8QS2,AmM*KW`o+!'p#$)Pb0mdbo39:cYqQL,f]Qn(h/Q.a^4r3&DPH=Vn"nkq"rYf]X@A\qjQSr]"pO2S6RKG0JeV?l4K6D>hk_cW_IphjJMTMs_V9])=P6/rS,P6^[g=nT(pe7"cb4G?+@KIid!U$:B1/5c<;&kWe`TN1p*^rh7W/QlCR9Rc9UfiJ/tlErUU=;hdLKuCsXLqq)C=Vr!\j9=26(EMUpo>qSG3oF`so3F5k7fH9dOLpGB^Ng5\,A0HZ(i/fnFe*]8s&<B*%CP($lZSB>3.IU+L:j@E<&lU#"N!.,.t_7@1b"jL]O?#+*S_j:gBs!'XYQaAGI'_)JAM!icO1S"Vaj`+P<Z7df%]hsVR$)@qs-hH[&[l%Oa>PJ7Sf9s;OFhgGQoPq+2&B4do1KsII*`kKH\^IJ*A:Q(]_Or>^`mMN[1'ZlV07%Dc7uh^GYOi!:_Wo'4A'\Ku(oOJj@koPI0>f6@N'pe,_!d(co[-e.c[P+[j;FcHGH]!h;;ba^Bb\aNfbb4VMuL>j'_VI>K1Q2E-#_QE<4"^%?cI7I)e)*S9Y&5i]5.a*nCt8,9MaEWiW0'ET)KLs*TI'^Y5j0=-N/;dV4Q6.SM[!n:UkHS(!+\-HdMP5p<>\J?))5-%&kZ@DHV2F$aA^f@u<^k<mgJ9-"(AR'`sc7`c@odiaZW[MkC&^NOe1miXg@=GMnooR[?edSYl9KP@iFOmTVkC3-/kHlo\.QjIml?&Fjd3/nM=6I^X=[[h;-#AX-D@&r,<_-cGE1D7M[uK@7TUN:'-lqFm-HJAkPHZu%mbc\,?BPL6$AmNoOZK@$dU0$/>=0e3N`DFk7`s<jO_KWgYdkjj]tA#k]>X=%'6Y?8,0q2+_3P]P5k-733QU*3lrO;p38Y!Jn>Ld\NK>U[XjIlb)TT;"%_p(k*KZ>[H^??qZ8RfX0\Es._]J=R$E_^r6:Obi*UmbqB_5(XAm2;Y8AuHp^7d'm&I4B!qTkMJPM,m#)ji8CRf~>
+endstream
+endobj
+296 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 295 0 R
+>>
+endobj
+297 0 obj
+<< /Length 2445 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0E=``W5&UsJX@$HH!PnD"4E5o&*a-u@jAgYf^2Q>2P+(,G=:uSf-1pZl-Dc8dF+9BS_Q'>TG&D_#IrUg3TLXjB']l2PhBc3trKk5'RCr:jsD8ZpCKiVm@Ts;b!T.cNVfj,J:a)<;3hV\:tH<ZN%MkQl.5Hef#,"?6<1Q&*^,u*$Hd96tK*C\j7f"D[AA];BgP\qeh69IIU-'WsUACo4>\lKaZ"uH/d.m9?pMm<,j$r@K?"$lg>erm"X_Ffu[@dNN4#pRAX6EcLt8ZJ@R`+)7%@UCEPo$^BA=%Fl<dJ?FsF2DrD&s5C$OVdh`4Oq(g$(i&A:FUf*CQrTn<:A#9W5*oSJHKsF:&'b<ks!A;p;QoRTY7uK5;km@h8e87/3baO/O)1="I:0lG^U9Br:At!XV)I(2BuS0Y]K;Xk]:5iNj\]fGqjF8q*2@+[R7s@j_]cCXUs_ojL&`Ndl6*;Z@8_0h,5Bk:_fKIS/(jmdoSp$8!+\]VBXaG[/,N0P3$JF&<>e=+<!eO1Gl(I/]%()HGO?[FMDG`p&q-).OHmIV'Hn4iqe9['^sn,e:ur3]m^e*d&,4D7GqsS3^E+3`r,(\^JV$YSC=Q-Yi+kMdB*+4nc!Op8QK].,!,sm!g+T:Lre7`6WeXmU4(?G*VWOO#Um9Xjemmaq3^]SfX+pc`/LUPR1D;W+i[*FcuVM571e<^e1+a4GY2?GbqU(m3PFr9CKEVclq-!SNoN2@DV@'LX<i4]jFpinVnA<3DR<2ri.[;DL-ah[UZ-j"?XhS^?Vh#O+f)/",9V1Fh+TN@jZGa6KEPIFE^2tIWFWto[$rqRJ<oF-$HT,.<rs%g#ai9ePcQ`5aN6u>fr"b2*I??mg^Gt;C1:`Nq@!A$EedsDG5)s7oi8PWiNQ5u.!\2J5"ULc8?G1>jbu!YZJS2O&C";$66<!Ci1[:SQ;kr;<)sLTo`[fF4\1Q:7>^)\WJ;!87IB*K7\:_TfgZ(td)%qPRG[$.LalSB)L-*fRjO!k3A%\$b#5n6H:KHtj1,dY`tOg\^eUmf@pcBq7(Vp95`]]IDPTJW7*W_H+I`g7F:=GqE$_1*61&KgD7u^H!H"$q5gFO1FXj/6=(no1-uf7+E@6Cd+(@]`>!&^,WE2/Q8_SjEL8VJo@(CEBm(:,R\f#L]-ha9*gPfP;L,2+oK>_IhgQ/jn@(MIFq@OhB,Kj__PpsB^2LhF5@e?-`9`2FIcC](D9+kF'pNOF?W^)OAaD-1,_f=MZ[,^SQfP"[g?JhU.eo"b>qUuuZqL5,@`\MtcNW[1t[`5PWj#+N&]QSA;Ym3R7p#1S4l&FhgI!p/EE31(=Qgg54\CPci)]cI9&Ce>O:b/*&UeGOn.f/J&f)5.`k]flWNH!JUKQ5?aQaGa*3^9-+K(<&4C<(LfQe./7iG^K_NLEG$/P6*1eI,>U<ho;G?haXJA3'Q8;(S@&e?,T`qdT#UV63g^SCk`C:ceTNI4a,(?FEk=09Ii!]%GUW"n#S7e^fWe$I,ib`MN6)G0\/1>WHQ=Q+(!njGJqk2'/sN=`e]-f!+L;0jI#"HOAimY>"3n*\TH3i@BN^S"NkpH<d&Gs!TVR`..rH'ub^5=rC#8.6X"7Crebj0C/Jg?_R+\[)pCp9m\/`GbrY")(""mcB.@(>!aL_WB[L^?l`Hnh&2-0C-sbZ%4Td2ALla7[P!R['M!AW2&^@5-))Kf=diet882O"bR#4<l0.bh,&+ZF!XR*b5YS03MpA/Wh.(#b9M+qX"fZ&CI=*?uQG/YGA98fQ;i9RT9bPN\p*>JOGt,&K-Pedm2-DZ*&m[$d_09oC5-8K2OqV7eU/RUtRR>=Ap3M(D40<"T('AL4G4Ni,`NL'n1bQ3W6;Ha:rcSm-0[Gbhds"-ro-8LLgCEiiN_r[6l/J<O5HHn[OAjAX7+KN:N+W>K*a3/hKuYW#pnuY&T':U9Bt\ELEVXLLC3=C"CkJPDG)/;/q8^DM&"i;ZA)-ea@cYS[l="*3GuRf[L8Go5b'kmVIP'VM,ulB8KVi[_Y-m3iIjlgE_s&sa4D3nc`)$N5:nYnSCsP'3BVs;GLJT$]RQo5JbBHMOoCK:dfF,s.-e1@3,oK?)!Bk)NK6k"^ZWbmb9H_H([VZo8]f2b58OdV@/8L&7>0Yo_PhVMUBEo/R4j"=rBa.d[P/goA^5Zs43A2MGhTS[Be7l97e*2G@=6sPMq]2_gQEu6SJC)eq-qXQgeIJY<LuCJIj7i8]\JHom?UVpfn7Q'7hquYH,VU2;-.CT#r6aKG8gY5=TS\9A$pubSC#*Z&S<o8V\hIgsnEGV?]RM="KH#6o<>5.f*LiX?q/?*47XiBtXnaWJ8<+pf,]&)4ne4;<dBP6@[#qT;AIo898(j,=)6,/G+h%Du!_Is?1"8r.3L3W[ACIP&aa]d?6*l"S_lTIP#k"r;kK5bJr$&H+n#"6;If~>
+endstream
+endobj
+298 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 297 0 R
+/Annots 299 0 R
+>>
+endobj
+299 0 obj
+[
+300 0 R
+301 0 R
+302 0 R
+]
+endobj
+300 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 248.94 344.027 268.94 334.027 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 67 0 R
+/H /I
+>>
+endobj
+301 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 288.38 344.027 308.38 334.027 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 71 0 R
+/H /I
+>>
+endobj
+302 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 148.65 279.027 201.15 269.027 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 67 0 R
+/H /I
+>>
+endobj
+303 0 obj
+<< /Length 1757 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm<9:),+'].0>TX1)W'4g`%i(bUHa\:,Qd\a!>]1B58Y\_ct+<]"jhtK`N9,P`pdDa<1n_Mf@YO7\RH?",73;[k7TU9.=]_17Jh,u""i!CAJmP,d!ZVP$ULf[7<p?[jHf6^@+)F+CL!o3&X(W(J8`J?nd6A&%l0p"1$>#%@%diEDOp?ZY_i;f/[.tbk`+?U'J9`#e87'O/QHCliCB@laT/uu$chH+Xcb5iIoD'9[Nnih#X(!Aabp6HfEoE>CfX:r5JZqn2d?$qf0<>LS$/!lTn/e]0^^33Wb6\<6?5+b`5BJc-4*r()=THlpFb:X5cNT5jT"_he^^o-bM-O?GZED+YSMoE^S7MnZ&"%*D%KRN[#b>m^)W=lUS7[(al'[g%4S$Gkr;#]IZP&mZjaTj\Mf]GEPV0%pNNDqRVGA?50kG*oWq2)iFpTdo%NMH@/iF,\$@he8[kBakm0f3/A#LRBp2"U#LkLZp:R\(Z<?sBX>!5ue\4`sgj"#(2cb[ZS[4b,K!>[;32WogY@rV\mB&';9&,tcAJX@asF2`"ah"u`V;JgqN@ICf8t$j/32M<@_++msmd5c3T(+\'=HPGJ!WNaidB%W3+@f2Qeqs/BKf/(1LkL0?r=.&R2VdGnm[7gPhp3)_)Sla(_>m]'m-9sR+%+-8P*C$R>tLX+8TPUUf\GX)hL,cp=-)"MSbAl*]G8&JVubI,!7QhrgBEd$!dldeSnZ&#&D=SKfERf"j*;;cQDYlqJMO<Vo@:*ej6OndEo1.Dk^nKrNFRnua,io4Lg)50UZP8M=S7=:Wq=shGA#S/>@j-'bH0gh=WT5_+OBuCPp/oVYC$PX#S-O+"7KS[0u[;BJVA">]c0>IOeQ$1g-%RW6D@GH'7[)JDE8/XdW6blY[1`_r]L15o@VZkiF/Kh_*F:q%Yr9$r,$?Hn*Ll&Sql!=gHqI!OX=fO5ri2P0*&O9d[WEX2E`f>NS=NOOaAT%m$Z[/u/9*p@`kt%e5F+R4Bl^VnTb!*RdoA9;km&I(eHa[f6?)=]6NNDSZrS73Rg?7P"bT&3KT##5bKF95q\SR_i;88DhA]8sH<?r9E+'I3,h&n6CpI5pYl!q&[LNV/mWH=nTE(SGeaM-G@aTTXIfN,"H\U6RAD2E>\M*jT]s++u^81$sND5C!`@-H>NWB@P`->mEGR:`Kn/ffrgY/42,kN0D!ePT'7pk<d.Q6o4!\CKIZUQFL=DKh*3<o+`ESRRkbZL0I'<RaEGkG,C<4]"4D/krhJb9DGcLNFMl+>fQm(6>Vu)^g6UFeL3(LRnB$@Md>2eo"@]=TN*.N*/hXZTjp*GCTTVVP,GAdn>MADlNC'_o<K9b[,->ceZ#cc,*>XdWAPd-Rs-/(n8Q\LJD=rG1Pn]IbSGA>l*mXem=Q+\$cnis6_gK\oI&F':WHPDd[tah+Cb6CeWB&4b)ICK>S7<-%#ZA\9WSqiT@V'SW1N)ZN'LW_H,dAkB?f#1O?;r(^W&"_hJu%ZT-%sPRrJJ)t&B6/AM,RX>_^#aKWT"VD9KA=Q6)qBu>42:rXWl5Ig@KUs.r/f.4.8cIF6Z'\8s!1:<OMlnhL]NBCpI-+Yn$cIq7+n0#Rb:3)p"TAI;e;K0ihHCkk&A&McLa]m]BEA^I!=P@tIfrRhZ-[p_I6CF8W:a5Nhro/Pl=5_`M`dAu7o5WDg@=c:t1UVNR1"SG'9J?K+q$X]K(X&U\3^,.\,lLeS6>\r=,O<>3O3-*!MU6"-H2)-(dJ+7Bo4j`~>
+endstream
+endobj
+304 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 303 0 R
+>>
+endobj
+305 0 obj
+<< /Length 1718 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm;;0/Kj&:XAWTRKLNcE[QS6(7S;9:WW[,Zcp9g?IDK"2V:f'SB3>f]i%KGJP[?Neime)o$pUrNs2olI5TXfGe-#(;U8\iN.g:H&l&EI`)S0=C[^A7]^QCI5s@eBm`(X)1N-WXau6XO/'7AZ>u%>l%<.Yhb:o%8&s1>/,U-tR751,>QV5=fOHQ)0\mni,I.nH\3#Mio06$VI#qn5>a2I/]Ckaj`E9fYjB5?;.*9WPXk^rZ=ugi1LF<IP>D8!2:`qm^9:fj%,hY#2UQTCNjW\H[TRGQ?j[-H;lK*+(rTKZo,,*\&\c*mLo*q=da4,^$e/XDK2sB<m0B0%rE<@<YY+t3#p?7q8lsXkRB=ZrQ\dK"Qi3E?.T)W;&JGQ42.[2Q;QKpkY>6uAB.IY&dda3OT'&^>8g">a=^egn0&n0ON?s=4/2'Qr6pN7\T<!>Ds8JW\S-nPr"JSc)4-Mc#G,+bI1,jH&gZr/95CRNC'.Q321?5QL"q,p,[3]U?`d@]u4P3MK_fs1>aSmP_EUl[?dW674NPiW`q<N$KU$Gj*$nJH;!#3K^O=mm'EJ*Jal6\J:7WkYHDPBHR#UOoC"o9Y0hZT#!>m;VA@5fSU?9t2^9Y<X?ShL%I-*U4U/fZ928=1Q[]@N-n#.=^*g`@S2\/]m/$*;l\bS`bHo>kJ`m=W-IP&?3]BYOYE-L#.a"N*@<GEj/QJLO:FQjmp@>)RA_aAXX>]QY683p\r7d1JY^s-43O<21k!Pi8NmAW%IIhe1isI6fbM#LSg^SMN$T,#eNK]N2qfZGXq(V.b-+(7DeLt<*!-kEB4*ji+$"=E'5:X--("fms2N^5IJdUl[!fiYMqBadR+R6d:%JGV/,HUT68eS'ADmsUcB]AY)A]kL;DJ4SP<,`J9VS;WpLB#M%r9K0PC6=CB\Mckpf0T?0B=+3b40Y4"@\d812/)Y;YU72ZDa@pUph'#URjGo>da>4m5^Yfn#&Pi.:Cmn2>f_7=cbpFk?N(pHED`_9HAHO]tu6p+;t6/`M#2JRrC[^cF/P\eP#<AZ#.odaGLNV`<<m>c>03f];b8ajm<8QV%dCWsI?+L2,g[(f#eg&QALBjrd>:Y`F',Sg_@uAqQO.J`;&kFS?bCr5Ka(jUu5JPRf:I_3B=O%RHq?<_Ms,&d9r7qWi/[nG>[cf0PG1LO@@QH+D;+\(e%4R6$/HVRkihQ4Gm"3"Gj\BKXT!7-,Wg[m!WWkMs[JpLh<2(+o>b^CYB18hTsYNV[GF%Uu`dJk,&<;?uCE(TkE:YF;Aq(gmqB?&/WDN@b!2,\MPI]++q3Z3!$`8Ff-^MVrUDQ;-H`!C]BlnFRa*VgMps0;'q1I8K^Q>38tX:I,$rWUe4oj*a7AMB#dhk"^MJC\kW3NA-5<D504u,[P'H;<7SrEaNmC*?2fPc"%p=9@B=AePoRQ<Z)ntFU/#10PfU,^Fg*Dp#"t&po8V_<l4#&OD^uc[>gdl4pHaP-Y=&OOCm<qM.OAGA,%P(KE$d1G)Htifd\mllK)WKQHA'G1+Ln0M(%7OK^L9^p`hVRq8hD/_e17<e.;5>`4Q'REl>`+\kr#\N)FmF[S6fkXeWZ+*?5Q+\;Xp(BX`4$KugZkH6Vo8O6[M\@26UK2j$"ig)/;Ph!18Ci/,P1@%:P<@hN_YA$/9965conh'6;NRmpke`>"1Xrhm'lWr;krXM.B&\^oh"6r6*q;pG;+BeisL~>
+endstream
+endobj
+306 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 305 0 R
+>>
+endobj
+307 0 obj
+<< /Length 2473 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GauHM=``?+(4Q"]@/X!8'1:Ok:Qg`R/)?@8:"7q^`-m.a8A^T8)3D5cJ):?#+q?"dG1o$+Y_RlAcLRM@i-2Mkl0RK[M<Ctun,&;*+g.#R)2Xk;9&]T_K;C8E"EW]Q^Rfh^UN_:gJC]E%TNdH@@T\ZmO$nFmihbn"j-VS/,@L*gdU)^/dNj83.W[]gQ=nC4hK+4anXRgY[5^fM&37(VoC;2C\">Uu\T8@pP5=O*M2#*nMc5\HVeVWbH*uSllG[Jh/h^,pbI9.NSNi[u:Ep/Y[;75Lk&Soc/T4hHG)b2^Em*V9k/HT0ec.6ta)!jsP^JXI`505ZYbnSGL)ghPYp>>COsC/">-R,3FkbK6PKEe%4^juIVCi_-X3IH;2&JB"51u'dq*bV3]RaEAW`n+q5jV/=it22[)Y!i:..*%IP^!NRRMQcJ<\&FO!q=INVPqNKA-<6pQ(V]8;3f,<`'WoYi$8T;:E:6fED[*Mk.IS1_7$k/gJ(8@/>bjEi?)V[8bU_1Sg9sf5(\;[1UZ[Kl[*HC,U73"FrA-P;T9UEPhk)UHhkQqp28k%:W8po]'ADEc][OQeee]jP``c1'ekA/+1+n4O\c/#*4:3l6idu5KEt284oOGA!p4?@H+u<&pUUt,h/p7h+pe:>U9.-FVg,aaK"'YQ$$4#<JR:7`##1F<oh"01ps%Ap-EA6]r4q<XjhOMnJg>(Qe4O&4/`e;47b)!%J,`Cueam_J?_\Y/RNaf,?tINJ84M-];<en#XZDS#.gK67Q*-gZ$;AYTD%;LYV[=)03"Gm'-D&(jY74A+Ar+KrhD$65O>V6p?n:kb<>m=\&tZ)!ZGOCD9i,btY%]Jr?<t<($e+(hb>Tq#B2-Wk^>q6hG\Ia7it.s2Lg99rj:6eKLPT*2gN0dR=%%rV"1ecFH&&><KKL,-U`Q<,qA<bT-pEZY!?e<c"$i0*[O:+qpn9+,/sh[Ur/ML&cQ5HY)53(mRQjntkFE.mHUn7&$8V\/.L,sVI_!:XmWlGDIqbq[Da7H(Q41_gZP61g+F^[rpA%e=f@)\-?Y6=]R%1Y_l1Rd\+lD(H5?dRZk_)57mjiiJWq\sU]u[7K@!th!9&U;TR&"HoNse142++YFD``Uf$_kMg;5%I\\'sioj:#Es+!;MA\$mN3/,pXO"e?HqEj$A-0QDjehT1"'d;Apb9ec:5+ka'Kj6pdoEJ&]YFhm<_^O-:F;!!tITEdc]+R'fG2-jq<T3#<L!X`UXAHV#Zf&=+u*qH0\/f9P9m*6qQ10j=G0'GYo2d/f+LV1H>5>YrVg)WCo<E'@3D!:$S,,>2ud^`["4-!E'K1t/s8/1>e5JDVim71LZkHJ*[q"uN_hFPb01S-;hCK:!LVX8HA2GEf#+W)i;&"FC*#`6QpDF7&6s64!^$O1:<#S($2O!%_o'oFZXJe+m9P?a$\3V)gfrAOCI/SYG9C7/2P51,BL$=BBarRfgPN^U7f?W[ZI+2e,lX:N*JZP8kBhNYKU6m1["`2JZQJUp0_Ke6N:9S8M2?@'rK<1@V3]FD3]]khHJ]<7UR'OQqX$D'1XJ"Rh9W,>GoBsm,a(*.2[EBp^FL3E3Rl.TO%4C7J.H(&W>]f61Q.]6Ifa!_n"OQb]B'\14SN=G'G;,fB`f`k+Jlq8r/nAF#<?Jh-0Pnuj0;PF,BrK=A;Au$r_it^G)0UR&ESrdWr^oSrkIpQe&:^7pF"I&u;BYKf_o>eb"k#0%\8m%./GjakZf$R-3T:E9A2OdflrDcnm-tWn\(kqrF$VGgPJLZ]oVVq;-d&a^Agjg'FaT3dVLeO;8gZT:N_F78urOfAM3[-gQY:5tX3SmYQ==@6qhHDJ?ZkV6[__\V(Nqnf/TPWYImc(N%fb$FiU'/r!6Ku"L:gUTAVsuT.YIYM&Lb%*URc>`c;sVqWGeiP/-t6cVheZ6#&&`-s&h.%mZ8:M>jWimp,+u1Xe)Xo\'9Z"T["eYB:k<&%5CN;"rQJrI]Ya>s3HW*']Gu-Xj.iFuYGQG+#NKPg6GnoLV87E>m5[dilZ(q<8,b0[_3>^X<HeVR0MMTbRWMtk&8(%?J750>EMm)'TELQPDt^FSU\1Ln/Sun9%V@ABA1dQ\k8f`!/W*nN=ZG[u(n>?DT5P0AcV)W%6ar(7TG4,ont$ZO:5Ki%<m:3bh3VgcVZf8-m.e`s?q-EQ_(B8M1L7cR*=[BYmg@eqa,7:,G*Y-.D@O)ZB\KguR2ET1*H\[$d1.Meq<E8un4aOO4h+)SgjfOA\k)D=<RQ!dV<eh+gU7W--NBPCV_f[UrX7eJg2r8A/p:UgCc@O3nA3rM'+EWtXUlSRnja%KXlLER_/*`r`F9Mr]d&\",?_JPAd.@B[4b';W3mG5ms@lRs4(\?A<P%&ct@8F;V?9Md%lj9mD7N\l?0p$)rq&/!\Is4G[V43,_J+hK`R3k"k%*3B`=?oM5C,,"0.FN./qTP8*<YIYeRi<c;+?Cd8J8D~>
+endstream
+endobj
+308 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 307 0 R
+/Annots 309 0 R
+>>
+endobj
+309 0 obj
+[
+310 0 R
+311 0 R
+]
+endobj
+310 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 207.54 330.716 253.1 320.716 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 227 0 R
+/H /I
+>>
+endobj
+311 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 138.1 170.856 183.1 160.856 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 152 0 R
+/H /I
+>>
+endobj
+312 0 obj
+<< /Length 1983 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0D=``=U&:W67i93b(YonW$Gdt32,`\A&8`RDI0pCZ!VBC^o?K#>GrUjIc&3pPdj\.FU+i2t<p=nC6]6Z=Vc*"$s9k516jiB8Z,A`b:_hN*GRVTJ?]>crk5#--)UfAK*'4YcSTeHch4=S0Za;8mamSQ1JH2C@NXNN@\S'<j\%H7mLc6A:#1nJ80j*<@H;K0?N[`J"R^6a`)+AGHD-A>\R<J>IWp'sohSf")Zq(I02*8fHG2/k5b7'im)B9W$kZ?Xe@Tsr1n.P#,/$7oo%Q>`7_AXSEZR)nHkQ[bR.F2$.qgS<MEs79P_QUa/m?k`s.=5f#QV/l><J:`"LX:3RR#OsrF;?8VqGo^$'.>uA+++QJs_^#LD(<Ij71tX-X%B'D,#TFngM[nFO38`>Mmr>j@/$CsG7@LHmkYXKa'VucA$t5iEI&VDtD*g*N]hBo#`kWh\3&e;gDQ\Kgm:st=R[L/O[EM!ecZ]rJ!'op'!$W3p@?F"F0k'Ug\k&.i=N<P<K/>bYZKH3-f^V5&MPBr],3r^2/<g52FOD[TJ\B'/@Vsp1'?IJ(-U36jMH#1)%LhMs^2+q*j]`*s0*bWU<QXDX.=&X<._56C*@bMGSQQNn6EM,uV*%aM!-/h6?0H@b_HWWc0;Zt]DFU4i\*@noUG!i*q#l?,CA[YPaE*%uCa!O)lG<'+;]#7!cAfH`n"WtU<Y^km6qqn-\`Kua;bK@nee/g1I@V?('T="T=E!!9kr,,=qqE'g&!L]O$TBagjX-9^U:"'X>^8E'hol('*TY^/O\Hd!DptFCPA3/fY1<5>7/TOO2+/@74"VO1Y#m.K6TKLLUEAPpY\&0sbDU@?/uRQ.CY1M,A+pGIj2n<+/#FC0*jiM=M;4+>Gh,eJ[0i!pIZ*A^\.-kKr3%_27<*Zi[-s_a"SH#Y+'G0^X7>V+MG59g'9#W=2$tml_.c1J5:XGUe]quo-3;ae#RqZY+cn;8<?>J*]5XfOTI%^1T;81K6^fa.Uh3bf"NH8)d%.q%W(GNdfE<>-(kY1c\]g6[>lXuJ@!5m`>\\I:0lgI!c`bUs?SB<c-bH%k;,Woi?&Ss-O*>Ft+:oV>QhHC)$"?C1H5LqA,1tbn;p"#taMccI2D1N09u?LiI\5=Ci^g6?"GKpJYhDbD'l=1Y>/G%V35g'ODFdut,F47X/^*rBZH466WNq:mcE_iY3XpN5?>ED6F@V2=S%"R,i];Z?ZJ0bh4Otg:A\.HoI2/%+oT,0#Q1dZn-:NU]3G&1AaNF3*UAic,Q0hK1IFj@_*N0*DENqd.BL-r>dFf4G"'K^da63oW-BQlcn3l/_H$IaLF]44_m6REW]3"O>LHT'=Um>j`$G2)XJI'#-YjLEtl![AUf!q.Yo&rq'b*ctjbM&`qj-P68C<ALnBX@E[K$qP"&j+O`)G81q[feQVJPCeKa$iC*fjra3Y%19&o&3YY[$B12Ks$E`rW0BgYB/2;5]=B$*_Okl0J(sISq;o!)3VL8!2<7^DQR^.L_-aeVT9P_4`,RmdmWHecq&8'!.(r+DPs"d(Je<j(`G6'HCD+DR/qZJH^eBbFLP"(auS&<bkU6Bog9*c?IY+66Xen+PH#H@RO,WD0uf5,rJru2Fpi^4QFmXW!up%%W8bi+MLn"?9u?MNr`W01=dk\)0nno)%jSgJU?$KnJh#*ceKL;h:Jg)?(b7Z!HD@>k#5k.;([]k/Tb+Yu^;\l]iM*eDYNncYO6j]CUb@(n-\5),&/6>8iS26jaUs-Lbh'p!WuhqTjSRfln5Z@=XSjZ0k=<g*=T"Y%HXAjfq1>?SmkBE?K$h98lYB`kgYUm49ZL<o]=O_OrV"sU]m_OHcuo_H2f)V6JnIdVk')pSo)$TN<dMI&8iM$!VEqls7U2'WPP7aZ)RuE\N^GDY,Dr$-N/5NZ;S??64#%@l!@BE2IlC&o*DI;#?RTQUk:HC0a>dXY%kde%`uDHbGf4VtN;DM>/@YW[i_kO=~>
+endstream
+endobj
+313 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 312 0 R
+>>
+endobj
+314 0 obj
+<< /Length 1532 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0C9lo&I&A@sBE-+uiU*]=u!35-[M<f=Gc&Ctgbor8Q9u4,5MI]7-P5FPQOH`"&PYK]W$\nf@mK.<NT<Rcs(I-.s^0Pt+.72fmm,*9+&0*ff,72Sf9^)3_+p*jF1?I:ur-n0bB</.pYb$<m\;*GAYLf335i<9,Lo``\+rOtG9eU/t]LI'5GAj:04M<k(..PC+#R<@&Rn\5L0QLbUkOWZ(/fp3mq+jg<PBd#F)>TjY)dY06.PL/WFfr#0=K0D-IGG=g^2^kHZX<HEO[h:MQQ-:3r+7F7<g/(hbC<LG@$O1g_IR4OG<Y%4%^eY(39<sYPKM&,3a5>`DNU`4R)DFtN)f!uSRj9HP;p&NFrul(ppR>l&#,;)pc\r.X!!bt[]@K<Ib1(@ZqLZ0]Ra?hEL=t:nNn>$GSl:WQZlN%&JtaUo6kmI:9u3o=N5DtVLunapj+^*T)LSg*;ZVETK:8tjl?]'Hil2?/,-hiA!f:X`<$=u6h>Gh-<[&)UGQ2(?Uee(7_(!D)']0Hmu>5-QDqA2R>gmHpB:8WPou$GJ`Y"A'Yno?GIroBo#uae+ko7LoFC6EY^KHW%=JYj2S@K%&S>T\mcp7H/!lU1YHeg=fib_!0LgW[\oC+A!IS'0>2\RsKBnT*6r60bO57Cp#?bbA$%,<%g&t:OX:+-Vg$I9YJ8G$jO4t`uf28dmrD<^:3q#`T_1:gVq4Kh&eBI8.<=S=Ee@'==:]+Ue_T*eJV.;Zj__K.r:ttMY.UEgM%G0A%[aWgF^uYNp!E;:oD7,X;.Bc>.Q@Zq[&>^?E'K(4PHo`--(.C9-h9BO6%Ae2A8"C2)apE=$pNG9Dh5JgNJ?8<(B'S@?7*)f!RiX-.h/8YK&D7[Q6c]iVRl[C1!%#sl+#P<A6@eU7qAg_^8L5_!;6OJps'kC?N7;Tbnk`>26pNT9W]PY5ouLH]:5a&bhMJ%YSe^Z<45]+i(hMV7)L#j>^l]Dj8iE=9_(!`cDVsVG(5*\X?_R.Vg#AF#4Ns+j\SSY<IN/NgQW/?;YhTp#d<b'/A52*^k.eONK$%A#F@nh1RuTu5'AFfI,X74>C4DTO6J]TFX3gbjAh,6b!Ibbb_Xn3*(m(2e4!!&o#;,*+^T+O%g^'2SfK$<I_8,6bTQ`\2c9S&oq8PT#ah%<)ABR=4+riE;PW_XL6;ns[H$+EenU]1pI55%*&,F'<C4Q0BV_ZVVla*p2Y4h/V^h">,drD>PqIQ6k2b<cf?c*j91!!U,G#sGSHBYq,R&bDImHE#W3TSq_VJg$IL<Rpqk>70e#G6*:^/!k).4:+SjqX+j41b>m7R*Mce/2G:;=6:GQug262Pum`lpPWNl()8>RU96TR]AuM9N9U\_TTLFQhj0Jn)Wp!K,m&GIkK9d&B76BFbZO<]tP`Fn'`siH#A,$qeqcgG2Y>PMBj`SZkI=(MrD_7aT?Rql+ngl4^gJs+M[>)F8pN$D,as$K*[ESb'!MPB;k;!nN=nTNBPOn[/Onr^54N8eS"[Q2HVej/$-dIo&YcMZMk$3b@\*~>
+endstream
+endobj
+315 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 314 0 R
+>>
+endobj
+316 0 obj
+<< /Length 1303 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GatU3gMZ%0&:O:S#lEZ_c'VR0%,(^7UhS3aRVn,Q_dX]%RrR5K-'aYZc/3^nBg^R>CcOtH5Z5nOS2iANL[V.9+/bl`7l4?+mn]]L!=9Ij+9Nc3I(g"8!?G8U4HBC\]l2g3iHnCQ:PaAO`J+(MN.=rZ:t"(R/kcV/5*"['YSF5ilJu7VPi1`h;h[\Rpd5.`6H>B??o47RJktFqn#kfMR+Z%W0!k0O'.(qAr,n90-#pNkiLNQt?!d`,KBY&G:#nWq=ojttRlch$dWkAnjXPWTa3;\3(DW,Fdh'*!1>/D-(GccN5UcuL2^m7&T%VQ906=c'DjcuHkqNS]..s&#&A+C)<1pp**fVi(`:M/sQ;"G%Q",gWC*q7CSR]n``BI[WDd5K8oY7s8Xd]KPJFc\BV\'4-(;WQF+['+MW?Y6F>O[VXQ=dA\&d=3cfnrG!JM`O<F9G@'>_X/q3^Id82/ml1jH;MjTg?cK%#*^o3Gr4#T]'HjarY&i61J$EB5;9W>$e?>@um#/UiG^Z<<!"]<pI[21-'E@f#_;OBhQ;VZDm2E-GY#T@G#J7+sJ.S$eM_BKYi^s9:^15bi=,T<NCt<JFYHX>Out8>aG39A?sm)^jM,CH"(0IXX5Zo@U][#:L`WFXh`a4nE>d6Re2fBi@'BQ&hIjhmYb)ojV0+mHg,;nMur>0T5)+Xk(Q\EB/WSW4eX!&@WeSUo`3SX_UbaQC4[?@;2>E5$Wf;=$uQh%18)ORARVof?;+Dn9:7CB2[`-qCj<:*_19#hkk(^,/S?3Pk`n1I@h<Np`?!oPaXMju%]KnGT]P^t0[514Ts\;@#M.0YbDe)\>dE$02>17_c0+MNM??q4/&=O^Oq(X'9QCDc:?[m2+so8tI:2:L??M3Jd!X3?@gigrJBBVsg/E$AAVkXPK=<>rN"XJ:OSDc_56i8ET16[.^i*K`<!bbtpW?K'nS`4B?)Grf<G(+*:<N9lHY?2(Zi';f6LcBj>MEY;kc.mPbH8mpX'X<g9pse*BY2Q'jp"%BV4V.bjjo&0Z9>N0AR)Brl^t*(LC'PkIRI_"pm43oX[]E2]BbbD27<)JCD5UApV=_hL%e6g9&H']cdH8u"7<J4>.#a+eN,.GgI*C_o(<([buE5j)Gg+Ipr!%^k/1_p%p)*U)eBF*3Y@<8R`E%0^]"1NAi!@"rr"`J9:I7,_h64VCfYsM-d(83a1oYJ*e<g<STH>V$tgh(es(%cZW_e?D+s2dirkljT`j6:K(32ZSBbV+DfM6"GkT*b65Ml'0kU@J+^UNOLZfq\*^2MVn4*CAPs5gd~>
+endstream
+endobj
+317 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 316 0 R
+>>
+endobj
+318 0 obj
+<< /Length 1543 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0DgQ(#H&:O:S#h^"I&BhXXoNSWG(+k[n:#-2]]+8/7[Y;ec9$utemlQbMBdf+PP99laT]jdBc5Fpd:iD\aGK\+C'A(sRhp7K3[N-lAM&fbcR)!t/3q,@Hf(7tsakNSu"4e\i#=`+1*nj%:+$8OsiOZ/'Tii4cdbdL*G1jl/\*X#6?Bl*Uf8[=VJVE2h`.PUV\@*>\bFS;[?#J>t2=j.K4+3gu*^,hTIOq_Z:N-59P_Xk\I]DC=`OP]kcX_/_VZ!aEMG6;([H.fKp!8Efr<(6rNYS:\8BX?HX8jo.i;WZHrX&oGc\aQ[BRX_[=j(.W"=6f5OP!I<3hWX\7gtQe]%lnAfij^cq0pWTI8uP;Ygj0!J&u`>@C)DZDodOgbckciL;Hs&)"R>Zh:G7/?9L,jdi]0a%f($ba6JPZB^OFM0J?@n(LZh+$:S,B0Itc_fc%\:1u2mJICri*6YQqJ:*TH<F`86V'cpP@+#X9JMePXi3t>)DcgQ]Zg(I9aH+m"#dNX"!H'&pfVr]naTDGJ+.G\f"gJG_jc#YHr9uZ/[J1oMGCsRuD#V$0cs#56;-aI%;*_gNiHJcVb32<N%XcF%_qPV9%ol8oX@,HMbLuA"]8aISh%B*Ho(fW=9\qmd]</^SME&cM:5J!n9AuFa.:=C1OO94&]:p"ZVN_&ri^A$1#loT7T`7&>Y.c2`f3K<Jc9;-!^i0l4=9[CMZ_+tWp:@)>WD<qP#,t]>6E9`uL\f>Hb]&t'5FgeIk^L"('lAdaq;!O;/[CVe0O/?Tq)ZMEEg&:QK&auu2Ktu:H<E?3,'_8D?5!BJkM*=6q@I2rs:b:i4"XGN_i`kK"J1[l4hW]*IB:(3NN"VcA^!j5sU?Bb$OuXXZa&2p&EFNXP`j3)cN04G%MI3\YE-HlB(I$F$Y\a@3k3cNgd)([8%MfoSDqqi16cc3i(n=MB:AXPu"!pRS@aGLnA*Q(Tfd`m*#!Ug$S/07")eJSB,9"p+fR]?CN<3?`9tJ3kG!?#+O.KD@,-CMKjE8A`I9"U;r3O2P%->P@XI5&meNibTKg`>M3e#Gqs$\@LSBGDuY78Q04&,h2dA3t.#.-QgY%L:h^UPV.GipSd2RK@AMXTCjcKg@a!"g-hgp@+-geprarW\)-EoFMK(JHaO<"/17=!IZQQR^8`ce&U]*dkjWPnhG*7`S#YDZ^l70H8o^e?"Xdo804V_WAr]XpKIh.8?$V]D[gW.ST$M3.TD1;Phmu7U2mlDNgZoE"-)-_)5kW4P1NaPoiZk3>q9H]rQ;2%hjR\"H&3M8n/F5WP`E[s#enPg.sk,'oV3^PW+W/Vqu\>4qfRJ+Y0up'"64$'D1\=R[:VomE`b(8X,K;8LYa/&BT!ZM@B5aWlSH:OWp)>ieZ6?*%r8'mdL#(r&=u?an7dLo7Le`B-8"qQDU`QbM7YLn.I&4,;2KR2Da8:Q64#A+"1#FcZ'"l9V,aLDUaD_#IV02]\mD*/NbtJ+VVe_rZP[];nbRQ/`CmL=kZ8arIf^O_ah:(e9^3,C'IK4f7X)(R0;2&~>
+endstream
+endobj
+319 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 318 0 R
+>>
+endobj
+320 0 obj
+<< /Length 2028 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau`UgMYb8&:N/3&:(5a<9q6g&f:fc-SA<(7[gh]JKta_[?;<!87b@qn_\O]9&cqZFP,`L$"B"gE%YeK>aBY\2n?GT![\3_mcG0$/1)p@n<X:jLM%2n#SUWc[gG<jL#b@`.SA[qfo,1Ri.e<+k4M*1Dpm@(`Hgr5\GI"_WdrJlk?_NDkR1lhk[*-OIK/TO?bIB)=nR!<ebtKq/Eg7:a;"SqAQC-RD?""/(556PBf0Fu6u"oQ@TIBo05p<@MIOBrmEPM5\I6%VPnHMg&dEnm"Gc3;P!gcYrf?McY([M\oASdPr>'#-b'uH".#L1=0#!J7jddBZl:EhuZG3!q>2,;k&H:F\Y*U!P&mZ;bNF9ma>p3EVPNVo#4jpmFC#Sh@a%B9pQ6Vu'rH4m9)M<&.qNs8aCdQNZZV!qh_nR?a+nP$LegB-2r$q)-gRe_lnNH#PMV91H;@HA^7la]r4mOF@<<Y6\\O[QqFl,Cn]Us&BeO=n<U),8tH_ctlK>n5I`CUCk&BM_3BsK%BTJY<8j./P;NS95M^)]:@9\fgkE=fmtEuC,'boHODgK7B*NZ@X5,[$1)mk4m>^V$*$ipk0"CObp^W*!\*a6;!/gJlmU3Zk<e+tJ4Ng5`/5[5AIAf*aa/Z6eq.:74=]FOQAhK9Dlj8uGqiT,7R]0Fe,$;Nl$<c/N@!dbh%Se*9";H:g.M4tPsgZ+AZM2>4QtNos_1KK4^-C-s:eDr\:-EL=pkW#dGu',8#!*gETZ_(SZX.G`CE^R;)c/Y[m_a/[^k$7gJAJRNrX!/brT`.LXdcT&0[SLr=-<%GnlVB:+LM'FhabdV(9*sZK0k0b83Qq+!*6Fp@`)S)"slS^PXPRDaGVG`>R4gWm]c^l]>.U20Q\qeij0FRlmIIfDcH/<jI;:reG@bY$Pd?pUnjm?+OAW5Ls\'DuO3!e]e6$5T!+6.GL:06beQoS.85^mWd^TgCXB;l6c#3V)I.pB]/:9OiG-t'(l^lmIZqVQ-!(%0nf`Lc#cP65F-=V'#91LV7TgX>5jUUAY,(*"%u>J4Do[,-+=_alnre#D.ui?tY"Q!#Z/dH)-WD)[kMRG<2;cZd+9^70M@:_JQQ#Boe=eLqSL-RqruI/p<31m_T"huFK")-@p7:]?`oCee/*!"Jth:o&>&@]I#</mgb;Zi'):H:C1<#Z?fkL'71++;6"/'Ec#u3X>eJMp/9O;nX02-#hKJKZ+"LQN1q%GQl]9=^G?=?D,>FRkg*oct''8i[LXn4</46kbE$ReaK,`^8+)M_s,=LER<um[eF_?fP`I&8/Ok1K78_1dSe%0AtkXb6/>,T"EKZQ5:<a>)+-8>-W4p#')$r<iIV=NNR%n5e$:@<DK5?[7hqgFnYZMuUer!A8P$]dp$R+m[4ht:Z'_j0#n^$.&fH*^+X2L>O2T\(Llanh&oU+jhDci*!_udJX3h4c;@oh[Qm*,/&f!k8]gt19>`jgL^QtuZ[2tZ;(.,Tq;7.`a6kZ=cUm<CT53!7RO!g023kG@]Qk:M>rGQdm3V7Zt`qM\=$DLueU=M:t]nd-)^Tk2dV1N\$NN"cf6B["3RNL^3\;3X357T%]c@!m?$fPh/@#P^A8(@[=N'P#T_1BF13ibZ-+u,$PaAMLRB'lg8OX.2RfRAX#n?XQB%A11DM0,&c9@,PM4gqdGCC\\@'jeg:q96VJbk0]h&=-AB`l$O!P3nP;XoLJHi9c2N/LO3t$dk!`X[qr58!q/V"Hr@d8WX6FkSFhL7A)5V.ZX`J:md9+ClRldIC>V>bRZPWLJ*(=:/Ob\nGl"-iD1fE9+gpXq_&$"@4Kag;g\+7nc$51LqStU<.uLiG,?uu5cZ+6`_jL2I<RbXq4\#3-3m3sSr1rdi9pUWJ1!po/')onf0._R,UM5#hR!Q6qQ]e6dJ<4A/8AC`Y:sm3=dN:g"I(a4@W;$&rhR=YPt,8j5/B"Vf^:;1Sa.$iCk,;PC#5@eR#E<7WSm.Am[T;b]!H,EV3)''q_9W.B-6$.ps^_UH-flFmL/>&TNiV<~>
+endstream
+endobj
+321 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 320 0 R
+/Annots 322 0 R
+>>
+endobj
+322 0 obj
+[
+323 0 R
+]
+endobj
+323 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 454.45 691.866 500.01 681.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 324 0 R
+/H /I
+>>
+endobj
+325 0 obj
+<< /Length 731 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gasammr+[L&H0m]iK$B1(oAR3WN)2[l*P0,\rHZMg3ta<8C7iX`_"qbIRfQd,:2&-,e>eXn*[lqI@`FA`;/e>[_gpKB,5bVMg4S_=?)^W4Q\j,)doZ:ff@rbI71h:qA:A.5K$994n@VrK(C#=+`%cd>/#LGG%J.eTsASiEGO<KP&K<L+bF\L#Il[O\]5q\PjHu7eeU_k*)'P?CEJ5+)>POX!>YDY7F`]D/X5PK'bDK)UJ95!\^=uTM(\^LrS],t"LA-XjTR5;(URtKP;n9ZU08QLE@Rb&)ec<%Ub-]=S@tU2UfqEcc1`dbGi79!J+;mtigin<5=.92%IP]\U!>]j4',rqY6SgmI'KJ65SeX[@H,?944/h09Q+=h&ZrWrB%Xg=Cqf[4C8Z@[G9]F`#0iOT4Yn@BV64imVY5C.T1Mn$0GiQa#.2MKZ?dNDs$m>WM6^1O8dq,lBR5"E!j76^Kj6,oO'Kk0ii*a]=W'$tYMNV2)CS%.*2J<CoPSB;=R)4LC"SH1?9;$=[=PD`GqA="&IY&%mf6*j9lAqt.PO3:q.:aH1@!To*Ck<>]E?ha.m(WDa73L1Qchh,ocsl3b]j]WM\n5D#G`1-mpq_^6:2_rkfOf<cM*=G<m0k;P!n]4l!=[:NWS)KLO'<s!T_^89+)_D8`id?,GDc94,h%tMjaImMCK8d,<[>BaBpN2g=Dn8Lq:83.q6j3+0f[%^[D;tjZhnBIMD~>
+endstream
+endobj
+326 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 325 0 R
+>>
+endobj
+327 0 obj
+<< /Length 2076 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat%$968iI%)2U?G^W2-C0B%jfebL!ij@N5g,*f]LUIFkU16skE$[N*J%qX-R@m6mmc7h4+:*@FJ.I#d)bdF4+`Rp33*Qg8iPU0S:&#r#hh"#K$k6Zm_c]%uIcMHg_m+!GY^^a97BA%KD7T?9,1!85:ZM`)@_#mm]W?AO+Ep^a/b9enr#F#]"WQ5?0fM"tpP7aW05qB,]mmKOkf/cS(!e\H&[MYe(m:h`9J1S$U/<5gq#]7'E@0s3ZWLl5AMiAr$dt.Xi1dLL&TG0X+)?fuf/6gbBe^qOjUBu=@5babC<*oB::K=&[Mqcn=SoHRncJ'2O<q:>HX^H9,2[9JJh[1bbqIDXan>JK2)[EtdYsNlga^tF2(s8C[P$eHdmm)m7CsVC$3i5D\VOBK6@gb/\s-(.k7!pAfdl;U%'Mrd6,O-pM$>m.mcqZt>T4t$#5e>pqK6^EhJ@n0A<3tM=OK]m)+>%^GQS4?atQX?s(RY#=R.PdO'?NGegD>FnT\('8"QpiL5l2Bd$sQOkSBC13(RiG9U4X7Q0ZD@8"=-*G,I4Y9i"MM[]LZ"d*=b7?hAOj#=jegCD$(WM9&\'b]t27%-8I-^Ts?4pG95*:n2^OSYlPJqYV5ZQ`q0o7LhU6H*l(6EO@F)S_O"T[o6!dca5l_[e+jK4hJ2c)?-]L3,)]@m=BfLlQTfM#aF!'Qq(+-^E"h.4nq[,qsm>=Z>3$u[:uKp]Vd'XH;I@MoLgo<C.%/e_+qFm37JaR(Q,h#)OjM%RU/d.VOp7sH(4Ze$)RR?O"D87NrPF"qH+EW#i,DP&?]7)o(TFt$b:R.Ir<LtkDja\l"ra^8.;CRl^h`KY[sE#eP:g7\djm*-P]u7BP5;APaA61*r9chH_eVHXZTi[;Wn*0<D+nZ&FmX)#hL8o4qX'.2aU8I8gl*"$oFOHLG_mD<0j4dA)ERKo,WojV7]i$<msHN,Vkt9eg&M)g08[<>X<1k(DV+<gs[g*]59b-%X8/P-)c<g7E#W\.V_G;XE\7ZZ7;[XWCpR/7eV5P$XT(/m\@Su7GnNb`h'/KmR6Am'1`qb:]\4]i%TQMl"P3f3ZIu<Qq$9NiWGNcJ%Zp,^//KuL*,&8`slE6L)!P&Jdpmq08"JTjtIe(#b-Q!,Ss`X&,,B%,Ybn:EQgmb=425AaWDj5?f+K@Y4&KKNo_3TfH>A/q:ekLPR3o)-ZUY<a9:_2(3eaWT&")UOI+LS4SSL?A2H"sU--sI#Cc#X3>*!(6(J'JbHe-K-^.+lfd*$)qs'an&0p\P3RK-2C/U.>Ztg;jp2._$Jib;#=R>]mJh$_&-<R,I)7Ko*nUa604r"QkXUSr4s!S\"&$it;N\]C,#\lEP0"/De(Jie>af>:J`LI<iBKUWE0bhul4]dj12#0XZ_6d.*XEls3=,V&PdV<s@Up-WiRUm#[''XjoIb#RKTEDWjE-cfXo$$f,RUkO%jkGn?;58#E-`3:+D3u2(,$"!gIKZSL*&<B0]CHLWBWAEcJn76?%RMTr#f52ISkb`HqEk9CBZibIPKmR@cK7Cd->,Z!r.ij&b=A@&aS4E"&bdio-3nl%N6lRVSjdugF"G3<HTXCF0AA70q[gO-0O'hhCPEBbK]?:T2GA]4[<'FTNu>kHTQZLl_8/Ia%A.QO+$Y7dhcJcm$NmfcBY[!2dX!i8*3IgCdATo@ms3DKoSfOTWfCWo;[95J7bP<!dIX(t0f*3/cbk@oL@STT4.@i?NJ3_2i?;#b[jWhc*5/B1@=*nmk&h#R^jJ`tO1PMCQA/hn2TN_A_@JRK_Ts'T(XZdLo<cu-oaZit=DULEU4CubW=O505dER\r\X@'2-+WffHX&=GVhN%T?";!h=SnBO*B&GP[057I^2k0J7V@Vaq]gojC3$W@eq20d9>1r4BUki'gpSlCfc)Fb+%CFc=f6:JH`j`%*SS_d]:)a"7HafIrkVWl9`YJ^>m"d=;HJ85kA0imn*DbaK%G'G<h!<#g^m-*ZZf\FEBED5ZpYLLj];r:l:,A;^NuF,]S4P2o=P$I0Fm]$Tu&H$6&jU17l!?#XRbQXn#)!>K=YXa%shVrWc=f^((~>
+endstream
+endobj
+328 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 327 0 R
+>>
+endobj
+329 0 obj
+<< /Length 1648 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat=,gN)"=&:N^loSBQ"XLlh[.TM/SERkq.>=iQ[cGLb60XYAE8A`;pT@O1q,;arF`MJ^/H[<sth:(@nfXhK;^NtVU32YqUMuD,fhU'j`br5a\eJrc=cN>,XLK[<X=mr!>a.4_?*LIc7"EsCFSHnUH5L:FO1i\I8@,'%N>_mE\A[ur#fX:J8FeG-,]FO,$]r?R:AnllsUhoh;ASU0rqpD$0__74/V[IA")23M=E\<$ZbZ@C-l6Zq;Q_nY,BKrooD`O+"pq#inZ#2sqs4+Vr[p,F&-ED8Uogl/F^#9r+:jJ**cRI0FGEacO-&Q3^SsS'sr_.>Hcd^c3b(gMcBXsu",L+ekB=)sUrd>ff"O\iPW@@RH9+S,q31"HBP&=J"coI$V1G#T?/&P;]b5ah!c`TjnPI\T_15og"\aAJ"2K[i[!dko76faX':a#C(U53F7+9GG>O`\UMT]g,*NfleH;:Jd7.,O-f&?Vg:V:FU:HMusa;sVtU'TR+Y]@$EAP`jf%\>XKF_Ah=l99qH9>1E$1s,kBkP,_lb#<HBXAeE.!L-q&-&MU!E$Vf#pZX/PH8'Vk'c$BothLNYHX`2,Fg^3FYbT/`kFI(tkTBAqj,V2=[Y=-UsN2$5^Y6lCE#5<R'?]%tC;sJ.q,ua)q8\:#N>/Mh*kZ-OpE%=60:VL,*<.k^1mFqO9Os3a7M.*Y\,E,0J:\]O&2c#?D\6B9"]Fk7F?ihiS?kNXYJV4SQW5>icX:Eo/qJ/I)>U<Z.pjdA:KB5)Q;EZ%HYfm<@_KDE,S48\-BRGMq?sKsVd8WYi1]jB%1sM-q`*D8J#laeSVm';e9[I6<0e\g_&/l`mCsiW"-Ra\-G+d%c9/=3N])a/j`Y[I/;B_)T3<?;dF`En&Q:R/]'K8.OF2i2./=Zlj3RW.SdIpTP[M3H,FaPPBd.%eGS'>'P0TT<<9<jcOIdPc\3pZlLKOa#Ri.=Wu2@7EVqqh!h9u91j@Q^(XH`BXs%c#97m2iuAf;b9!e@"k%Ld?uY[os$&(2=-*J\"JX=,2/,OVQ.Dlg4PTglcQsfNs2:PZ![F/d&sFs"Sk/nV/=0[Of<fW9d0$pYr_ZonAEP_#<YFEei4"Ccl't+s&*?A;MG]Z>:s)26Nl8,ZU(+$`+=M/@U2h%,I!n(&44d'LuVl$oq<f4+ItpfK1=/FipM'.28H__9!K'U'"lM7CqdH\=(u[UeI[PWlV1lHrWUT\ihC+\!<9gA<r,f:P=[>@SRIs7%3e9U2-r`;DqJ"Q6KlJa95:^WbJL92oBNP.u(9lIF7b*p_IjmIF1K3nSU+r4k1?c(C#PcFrs:cc@=Yl*M'/XcShbKAemL+%?@P"[iF:?&XHZ^'>.c\?7@fYWAHZtR/Q&(\R^Z%og@#@piP7Xpfs<rIn*$Ia?l$)3-kpb7+p8=6tXX5jcQicoinDJ.]![a9Q(_>7klXM;$VbTcp4OsThrF69HGXC_BYo07L09&rEm3:h$c*KWt;selEYM[(hnSprapYm*]IuFml7O,/^"QE8*bZ&1[+N\SQ85u\%ggtJ>%eA2\<n\Id$"Q'6J3:0V#;9i/?JMli&\pl#)2_Vc]*R+VrPs@BKsErY%tN0hGl>;j`_G2l9[C57G?ma-8+dDmk(fPn-*KT7$V<N01>'~>
+endstream
+endobj
+330 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 329 0 R
+>>
+endobj
+331 0 obj
+<< /Length 2768 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!Sn968iG&AI=/kgj:A;Fubq,<+5ZVsZBuVcNY]\-IhC,YUd]"Y%RmpB<"&r0@I23]Zge\V)d?m!ej.G+n@@YJ.W>%U=ME$l5mFc=$Un*B<nf4.(?jh:.jRh!npZ8-Y\ncUMgW_n^9aqq"nXaR`Y$HU7=P/^m&.\9[V9(E47V0E)e>IQSV0*=a4t9W""N&GW.*>Wh$BVg<J>E#lN9?EF^Ei033d`J-=l=,Tib8L4a,b=J];#Or1,b?DK2D;AZ`(X:Fhlhs;+)u-#$c,1/P<h+^T42EHL]Y"%%/IUOQ9Z`6oiq`+=o1lGR@QYm%>8?_V&Nbl:5Aot:aEXXl#[&-3Iqt2-/;u?DT0YrL&lI_,PXAIW$$[-sGJ>:Z@"9_*+@[j>0-]4k,mk]Ecn(1Q/Cc]q4Od$Kk`!1ZSZB+F$6n<J[ZXo$dibDZl*/aUU."fO/ZoO<Oe25sDbpG';]B]Fg]e#KlY&H\`52R=+CPG.6-GC.>)+nrU1/IHCeu/Ms7tUJm6+R,a#r<0M9c%Wk<,K.=*g3:4/9T2kEE_IXTp]pr^=Mm;CETn/VogI;,H`1,gO133_O=@>A7]R5ah"7CDHkbbL$Sg)*O#\>+;E.(IElUoW[PH`"q/aIAmN<_G=l>I#lpd'b"A%K)*%[j5i#DJbroBmBQ@!@6KeQ2N&Ca%q>l0m)0PtEQ@(@d8tqQXF\FOl^)\id8tYEJW=)7:KfIb)tRi!R5U5b@7CKCAMVTN1?KtjeqGn_ALH1^V.ErB<Jk=DD9g[ujIWNt,`G,#g(TIj:h)rC8rj)e"Hs&4:aT>h$eRW*KmC:2BV[PNJOQ)8h%?X5AAT,9+j2kpdX<-nic]mUoi/Bn%Ki/Kd%L1iVm16'8><bMKWs!!-S/NsN*iI"NZW%*bQ6f+rOkQ/;A&a]Wl0'Y+G\]k[F_BZV!BgS*c>)k7YR/S.)47k_/Wm71erj#qesaN_[dhRrU^S6b$SAHb^o=8?Y[]Ok?*Ig)I[W:j[r`.G>n:"YG<@L'M@j8J`^_tLk28Qi_L-">OXJTKPa^p["KZ?[*$-KX5m<PQTpt#K%aAMN)<X?(30;GMs8tP?'j`u7[&Aj[Fg+Yl!0I7>c.%ic9NkZ/30.fka;e:9!kAI1<C!T*[MKkBDb=7=^oMe,:3nB`+h>KoJ<q*O;JdslrbZFOV8cenp\EJ'8eB`h>dECrq>a^6qY'%5p25[b:T2(\V.BIFSskrOY5cR6moaIoE!=bR'Q%TV;3WL%(reHVlI42"WOX<:"Mfhq,g7\[u8<>&RCT97-HDknSGmVG<TXJE(T3_)hZom8tJ8]_1HRNN/?s*8??oJX@[nI7;Mi.Ws?*n6eQ>3ZQ1?FC%k@?Uk->m'9_sdh:`Seh_#R>']"XSJn+.+E3)IM@WI>0>:]BZd*,X&fJ'o[[DEr,LN:,hO2f#;)9R*AEckP`>fUG%NZ%ioZu.u67dbBRSZ`;l255L&:UMoD>>ADE30no#)(eut..,02V0H;jUfR349o"6_KQbM*[>%[.dP@Ej%62'X`gh*#eP\dI:WXFSI+WZ*q#.To=0W#=r*2%<9T.&1kUt1/AB[#$J"`tdZAY^Fgp%&;-K>:=K/>RhZSocl`0_"Xe>nZKe.Gt3+YLrCb*>;,47Wc;!thZIBHN!f#$lY\d<2^VgGQ);\4NhJA=IdrZW3GO:Gr$,Z'XHGR?fG6TuiK,frMB6TVpK+Xq>"IX3khAh_0GVO;`We]+$I$/2#dB^4Cg/q#eofJ+YnWV">m03i]iHM)jR@W'jYl/0,O'5fG2h<;]uWJ&.F_+7Yj*MX.8`U6a@qB%Crmafr)1"bQJg6cbT7+_cE>JLI<ShPRl*eb`SB%9h!V<-_hn!pYBnEZJq_0>omt`EjXU(p2cAB$DK[<ROG"OG/'!eqs-<Zd6KPYr_H40-8`uI,Mn43n^WgC>Me,aVdk@X'QjZS'ItQ!6B99!.kNf]FZ1g]Tl_h)0JSDMd;H<+Y.7D*[dSR'eipi7;I@e@>*s?pRfU:f`<qYmlE^.C]D#L@$rp!4qP3H"8>G%(\"S3;JMh+Bi@^lrTEVg$Rmcf$T1heZoe497q/pNBgcVCltrl*#PPl(UnPk3D!d7&g9[\KM'U,QMg+G5Qr9,S9gHa-%'F4`Y\4[Gg]oD57,HQoc?#:j"'k!8F$)hReXbk&0(dpZO<DFhi85)l8$VV+mR-/YA51)-F?S+_h<Df,JBJ?<d?hdj*WQ/W?o>_W!FF87L5jX7K=,lL8N(>>.oj&aGdt-;/%*I8?6GFsG[",iiYg?)d__j:!8-%s[<&"9#=38f%VkX#)un7,+beJ72eMtbeXVh]Pnm'u7u2/bUkrqtSNlXb*6bL8jo`(kgDHiu&MM9KrSV4'^YokVHIpL;(*RAe`Z$XL>_ZtARcCb.mR5:@4Vc^+&YJ<>!8%d24C<nLYJUBNO]41dh'PdtL2p9pUYK10%c<[!i?,!pr$g^>h0'YMGC^1r=/#24h#9a/cTgX$4*')UeJoXu=r:l%S1FQ/23@EH7O&_qNB*c#d-]aJJDp:db)j^kD>pFL`hpsp$hpfKF\2HK3S$f?1S`":`bgJa$d%ll,9KsA&mrE=nWUG&#Fib1b@QQd*4s0R^Sn2dUAME"48d<&QcJoLHI2'BgZrInGj>2&an7c?54Z=0ckh0:Ha!;W)-1\J-KVF:[:]1Q&^PHEP>%Q($J`a;jMR/a*!(-XU%[b.XV:ATnG8iKSM5cl`='Z-Mt3Q'.F4X2oiIdSfc%(7CC.$@r,It^B(>/)pT(_&~>
+endstream
+endobj
+332 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 331 0 R
+/Annots 333 0 R
+>>
+endobj
+333 0 obj
+[
+334 0 R
+]
+endobj
+334 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 460.57 627.894 505.57 617.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 73 0 R
+/H /I
+>>
+endobj
+335 0 obj
+<< /Length 2150 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau`TlYkN9&HD156LZ?-W$tRVouN;<?'D?/g9#/HD*ZP\MG2dAoVs1g8cSW-ocgA3Nj>?l!u)r)GJ*h/PQ#8Re$"U_%:j.Qc-4PC1TVJ`LGdtB4kFWbG-t>EI9bPY/mnO%\h/N@>%VJrIrfXVU+K*VGSdD$jbjp.Y=cMYpU<^n<HQKpU6L./1?WGe.-ThW/M"R*k/7'2?iB]q8sC14qm@Oqi1FeRhFl!7;==cirM6QEPmqqbV`-^kBUGX^W/<>rmi]s:L^J;\9_dnWUD&V<X!.n=Cf/bqKGV_9I1amPQ:pkUbP47<"SW*t=t-TJLu@tah*gMSI5M[J0b?(Dmq>n0eTr[sndq,*]VhH^+$kEr08IRgp'p*()OqqHP)_\]bqrWokndN&a$TA:";nb_\X;j5QmOYl*e[_+H;[QgN$hYEr7"OnB``hsL&W[Kas2Jgj0+KLDXTeYPYHO9>E[gbO>7Oo75.3FbW?S=QME53Jm2hRpar3iJ@_-/!c=4mmlG@j?PR&s/J'/*<E>'ckXuW=/JUEF;Yh6i%3Qu]L:=!O@*9QENe)$a&&>?6jZ_"s!ntW!=8[DhRTh8udAeQ6hiHR?-'?W%iq`cCPGg%-FLu);6q%2C)Feu`NroA`lshb@`Y/+sp?mMc@\FJ!@N(&==Xs<#0/d:HdNI<o+`KQ;agSVb^4Ri;U.mK,cTq_`#TH#.qi,!3>FM0&,`e6e&ZCKXF*c+DiZ?9'17E8.j%.H-b8E\glU0D`qDoO5=&@:u#Zm\riSEgtK)%q?[][AH3a8;onP$i2?uln"fjS'9od"";a_>uF0!"G>TbN5#HpVRB('#qI)_#@f=BXsuY,-6T$^*WLc]l^*B`[bBf.aiOJo#^)%JF`qbIKli9VlVT28LuBV/i`JI6IaTFpLtUffg0(JpnsNAI'?FIc+JeXP)PrI=a'1&0U\<I5tI<;_`0m"R)PSK_"/r<5sg_n]>Eo_SGY<;``E.B(T2L)6.&U)N88#Za3TKXVE!;Z5pR)"Sr3U=e$)!WC9NpSW:3G8st?5]56;1a'ZB_h%i;RlSmGo17!ifN*u_2q,il6HN^OuTg6P3@$uq0TLM\H+JKQ*0+$^>5@,U#?rf[&#P:(rXD&h_>gJSNfj,0nVTmMUfTJbF+/pjYW[^6`ou#a=>3&MI,s&rFe0-0jE?KdUZ\T/]cUJ$JJ8Vp\2^`(I"_)#>_W"B[Q.gJ!8]E^,BDEC%IEEX0;6;3.XdHE;+H2@1/>"H#PF.*);V&g`H*)Wg!J=g\?r4:4bJTkDidqPf2saUYB.a/6CA)pb+Q(18DRTMqcSLWA0G`.<a7,c0Gd(@T#!nh];!iH"a6]^(b7&1o@Ml$\j^q'J^qShO$O@W,AN5[j+X+)s1+#lLQa_XJ]CfrH?#2(45Se7rC5S;*'K3YIEZH4E'g.aqU%<n<X4:DppV2s6iW*/,(H:>[AS$#,q$)\QA@FjA^L_m$G=-7$=8+]i`)QB3ddN@o#JLr@Jtf'kq0ZOdQJPjqfeSY)%4&]cl*f:PZL?_DP1qgTf*.F=hur2cB\UI,]4NoD%2*t>eQka+L2dKpZ`_dQ!-02W^_0\%IMC_?CN_3gc(K]\cOiKR&e4>+kD"BsS^.Pt'W"+hk?1u/J_`VX#EU^c[L*`_;U+V`4aRZ&iOk9,-,=Rc#Lhg_S#0W6OPm;,:7bf@YAc3?*Um^.VbP:t]TpELH$Xa"BB.3`aPS+K3Z,D0'L3`O@YYO.N'+r`qc<<=ggoY\g)0WL-f5Y\F"sMdSEVW1=pt%>:CjFR9T=e`'Ik?+;:jG4NNn=V//d*id0j'\b,\mV(Ui(5.8Ym.)3Ih+Ku_-]H=QHIisU%1'sCo!@1Mot9N42l.&$M6mK@04#A.j9g"D`X)jZH.E`uH:biZLWFuHhal8rhj=oNNp@`q*VRcIXg>0(]E\<aPf8aaPOE-PkYdWbY(/iG9APA)ZCiBMgLLHQIYXU,J\D.L1,s"^I=)^%4-23QQE!8$`agY93Y]Bbf2Lp1.=L(uU@lm#_=r'bOt)@=m^i!$u$:QYs)e(Z(IZEW0d+YF]C(2j7_J2IeR*nXT\">,I<Vep*%9bLn&U=(9K]iMB)g+Ms(`VU!sZCk;-3j"8^r.iZZm!]HbZ2")P&:^7YaGErII,ZC"^Wt`SH2~>
+endstream
+endobj
+336 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 335 0 R
+/Annots 337 0 R
+>>
+endobj
+337 0 obj
+[
+338 0 R
+339 0 R
+340 0 R
+341 0 R
+]
+endobj
+338 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 138.1 692.0 190.6 682.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 87 0 R
+/H /I
+>>
+endobj
+339 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 459.43 660.0 511.93 650.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 89 0 R
+/H /I
+>>
+endobj
+340 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 92.0 628.0 137.0 618.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 65 0 R
+/H /I
+>>
+endobj
+341 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 92.0 564.0 137.0 554.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 73 0 R
+/H /I
+>>
+endobj
+342 0 obj
+<< /Length 2022 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!#\968iG&AJ$CE7Be$'7n)S&%K's`/^%il-rGWp5n?#;inq^%g@V;Vn]r=MA/;n[,koJW=L$Og0O&oporDiMs8X4l-\Z=%rm>DkU^maYE#=gGts/Unf?j_n3-;%U5fr5p!I\J002hS\Kg@T(WakqjT:e[^e36M"Q%_b^6m5oYjnr&Zg:`:[]Fht*ULW7FP_g`#:(;U?l[\aH6FKbRHDfln]Ac?6H4^?HfBEpVE\cd;HjTTLoA(P>flUbc,;r=_*Em&k+8-Rk4HBMB"7o3A\9n[%^"p!=u6Xb5db9qgp+sm/Jj'g$r+:6PB/DU?0H\WL/HIcS:U<cppJcLXf,93;$fC,EmiZVi5Q4T/LLTl&a;7U],h-.UbG7+,m>VD@Z:Z`>(Zpa3'_MroN(H)B(Y$_PIr3\lfn&a`<ZPkJ_*.R4AQK:rHX0@#^b>c(=pM'-plEn>AFhfLa#[i\*>Vbj*[,K@h&5)o/CuW$ahNuH9@8;Cb:Y6RB;I".eWO.Q:`DpbY625ocP]AH'TfB+f>#87i8^orNS$l>8f$<b:G/&BsH#`;LDf/8j1]\lUj]2)U23Cbs5iNLr='_>GsB8H_+SodGJXm04c3*Zn0GC!QUda_,@.[n&[6A]F&@*XH^e-Wp54^pTXHYUE(=1;1'6`(XbR2UoQI2I%8`L6.?!fp%3``CTq3GeEY\/2k(6h>J?c+bhX2`aq^2/A[):&LN/1SH9,GYD\H=Ad>')qE[+L/XMM5>#JWoR("0*`1+f>nO?G8bP,%dC`Uc=Z1tH1.8k<Nd<=\E+'NM]0M(o*3=)hE2\As@HPRleHFD00+5RR$8%ie(lS3;+1T](/$2LC\[OcS_ONc>L_#"belCMlU_61bXf%8OG_b\aup?@<n5d2'(fcg;2]AA,U?e$#Qg_dEk-Lp$o/*3mt-+Q>O@b4u.h(lIn@e=.44A[7Xll?$i%FY/c$?.k8KAif:M;q:_*:Y!@>g/r!OWo[XFZ*Ci`cIR`HS$^E!5/$g<M7f]m;VBIb3SH(p!$N9_N)P^$^ZK3M_,/6.=H]tG+U5@(XoO%DN"&f1IHgWD&-Dk6O#Jh]8$,X8'lo[Xj$5!gW'Z/'"bHUfZn4Gq]#.P0b3^sRFS-0U?Eri_5S2nV\^tDhNj[a#+ge9H">SW1T>TBE!@H8K.q+fBi`<V!H1nqC8sZ``KK:-UeU/!hXHj_iI^j%dN@5QWC"U.R5H?[g..!n_]C??lMfc48=Z`dM9G-IIZr`&cl>T4cJF)t0&o3e#,^"k<_18R8@TprD=X7Aj+Z*^A8lFM__ciq8UV5J?Xi\!sh\kd0-s&,CSF*Zm'ab2+FI8X^K0@Vn2rHm8F#no)Fekp(Od%^9HE4VaSlo8.)H"F6i(kuZ41j7L4=dGlMpkOOj,E=f%LjlXIFGtsha@R(!m]'YCO75XHSt(e'N$HrP[])baDFj7:lV^8$Ut^=NV75ANNG<#Z9Gcq(Q8G+'8D=hmG2>p>p%R&;Rg<e2]T3-\:l"'qij>#?P:X\&G!k!Qm@K\.CEdb7s(+$>(4--R1j80U1c6upP&(Zn2U&:8@DY_iiPq%Jj2f5=h^)I<.62k;+DWmmWP&CUO$l^b3O-R)f"1S)C"U!MptF8Ie!S=ZW5\247V(fT_dC8NADoWCg)ojA0DB"$B2l(P`oAn21]6ll"Vp(mQh+`2\03SJj(@\mfJkBaj6r8(L[9^]0P0;R[9aD/RSBEJ-d1q0DYlk"QInmJ+5XoA1B&jTQ#RAKsg&];K<"8DqR*A6rio1<jFQNX"6+9i^`XP"*\!U?DPP6gnLXfZX3ZAG#]<)Yo384[$&HB]'&D+JQ%iA-%M06T[!F?r!r2g`'_f-^MQs]HYiMb0jb,+IV@sLh&Q;Gi)'?ZDm+(4ca<rd)1rMJ"EVMOnXneZP*U[>*c''q=`Xa<X%\s"0G;r<h>!>h#aBQTZh[#I]#$b&i\Q_[7SprE@bacbZOj8kmYp&&\<t6UB)"3JEUm0_'@c><O;5h)YMt7e$Or[ec,W>&mJd8KgtBO~>
+endstream
+endobj
+343 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 342 0 R
+/Annots 344 0 R
+>>
+endobj
+344 0 obj
+[
+345 0 R
+]
+endobj
+345 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 92.0 542.949 144.5 532.949 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 79 0 R
+/H /I
+>>
+endobj
+346 0 obj
+<< /Length 2341 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0E=``=U&:XAWd&8Vk9EYs?l.YQf`(`=-S#0rtOS47&+:0V1"b\G=^V7l)$OW-[Bp-\N88<)00#$.h]/Z;;H4t$*CU.'5=d/LrSQPBJ:*LXk"]dm%0NhqM&*HmbpO;u%`PlA"HPQMT7`t,[I(nM,$%%K7D9>CIAFlq]pZ6cU\7Dp*9bi)H0@e7HDgoG8/7-W]"HcZr4Cr;/'(teX>Wp7>0@a:K`'"be/gc'B(-h#KqiTc?r`hgqMARe'f5&4RZ"+&keYf4aA^#4eYB=c!75'[SUU;@=M:&$4lQ,gchlqtT$2EZEC\@7PXe+,gc=NtXS0r\'Vn-n#!-5se:WhV&fhg#^%:*@-JplFZ;PFFfag*KV:)<VD0r]Kso/n\s)=KnB1D5:i!k`(>UNR!5>D>+Vi/i?*EEqrR8,.R\s46DIlTCGV4%S+H%b65\ie3F1,H<3tola/eII86@R)jMTnfgSH[*WOmdWCcF"@msfjT\.@-(2SDa6qd5;i`,^58Dg!\V]F(LJ*s&b$&j5#du;f:57P;V6L^q2pKlYDF*fM-YC&hAqT/D#F[ru`3P6++\FXm;9B8c=e$rPHa$/*GFS@K"V/\`fOO*PYi]ad&f0ir*Q(@gYndM+O]@L,kdS29)6Tc=QQ[Dhd<+ndpMmb`\12YN)sIQ"-EEZ^OfeKidj'15n!dGFmuQ07`&Lc(K\VsK5*g:4o/+0SRG!-nj)/%]0kn9Sl@X2"UU].kgZR*ebPlg-p@6?NO\:7Dh*6=3('_0/Mg,oe$fQA#K7Naj7'Oehfe7!q/m;T>3hWUHJ8R6?o.(0k-;I[,cld-N%OjQm"#20cf#h2hPP4fhe:SGu=FNeWg@ZWQa>;_RK/8k5G0]\*HQX8qV<WgpMoE:gPbg,,T\AoSBlAl,?7NBL'/ssD+`X93q^$am.-9.AEQaFXaWBO@+\TRLT9;o"T^&\X41Uf6;km_*io]HVhm.V]2b<QCr%Tt]+UP_$[$-tGn:0c06bKVt]#h&I]t/1R3+LS5>r0E#e8d(M1aGp;H%6-6"s-_[gXdiG'l,010'rcE&jjS@=qS$ni9pf`Sdpbl$PTVs(3un?F[$Sp(ojD-Cl3rT`T=J#]_^mo-O)Efl3b+o;IWANB9jpa&n$ART^J/MDN#KcLq%<7Y?kKmn?tER/BuA]=4bpdb+9*Xhd0*>,1YpS?P>BMO,-So6?YUarJJmY8Ds/_I1nZ7G&"!o7)Gn#h?^R$Gm_l&c!*N@IM[D!69d\H5XXt<])iD>@I+Fce4=5$;b:Z:R=esQ`1]ek+Y(`N6!&%h9\5bd#:#5K$!lP9V?Yj%j]I;8olS`-AI%.@fJU9D(fi;"?!3pces>_"hhhK`]FegpasRbORN&hNF_&O:Lt<u6lEsop]9]3uD@:I)Qcf_:*1i,L3@&Q-6T9,fTngJ5h:0M]_ee@]cM$3nQe8>+Qk4rgCEVchGMli[kp>DER[%9jA?uaXc].eg#a.8G"]6538g8fNe.4^@\U7!nheh"46A\c<!FB:.l_[`g@Q='^]juZQ$A9^,!2F]=%gT^$8;1^JAsPPfPcVL:#f`u97QalliEHW/M,BiG];$sqG&=aBUMbB")_p'LM@fPjoQsgZ.2Y1d(k#HdF30VJNm4[g?WHl+a4bnLgM.i3Tk5&nlWm00,kr3YLFUO"C`qVsCCX?AM3EUXqKsb]JS'e(Q`!)iJ-Ntf,j<Fm[C,(8<ohFaP^^9J#Ho$#88GNn.rAtN:AQPCeDbJ#@rV>;Nkm<6mZuS&0[(gWeaa:V^na$:1dsp5ASK8l3'SMd4bXFUcS,,YAA@(0RdZ;U?NsN)Km52,h%hF\=dp8f!YDPrbMbA@M$%O4`X:-H?QuP3m&*UYo)H<:)Hd3j-rdo%or'J-=c(#qXG)`KE3L,s?efe]h@t<[Y8&r;/5$Dc!B<pOSUs6L0UtW/[NaJ&P&Jh0nRg#]Ur5D+0<(>I;b"OW'mP.\MX9tqhs*D!99q7QN>5W"%%%G8%"&f+K>hMH"X:uV0>MF%i.Y(Z3Za5A"mUA*h5=@):cBNHME:YB1QOE-<R?S`!E_Q/*_[S30XY)HAd!GfAZ`TkHkqI=7\Gi4VR=:'>N=_=*<QHN)>+"*fh2NA_>EG;C`025&_i/6#0',C*-oKe'(#F0#)$b#Lc4m]8,HKc"KM`oVu5rgRT77f@m.DI(kmAq/.Q&EO.mCa^V>2rb01/s(Z)*-dtkMto0:kJZtn/f#&*5^&.Q;dKe/D`$O@'=i]7#n7]jnC/9g$""4a(LW8F1%[(?`(0("-nWpSjU8f*@DR[jC-iI#*c0A_D=PCG&#^X=2j;P&A_(ZS`O#qdRt_dBFCr!,mYpqQ~>
+endstream
+endobj
+347 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 346 0 R
+>>
+endobj
+348 0 obj
+<< /Length 967 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat%"D/Ymt&H88.Jat7T)M>lG&1+=P\nTlqY!^s!WZPJb&i='1i&&]nha%N-/T!:4ML<Hccb9,Ai$.Gl8%lZ##DE:jB$HgoVd@0#@kerIC(VB"H&*n:Tp6#OZ1k#;Yr;i]=&9,sJ=F6jq4OWL7^tcm^kQ,S8goc@!N[:0E*\LkS']"^W2!K!#<)?cd#g(kLERI<dF,TJW"o?E(6^pKW./8>=OEH>*4g[n_%R-!f^[Yd1-;aq^/Io?SjZn\8l#4"3W2u1A?:qnc6rRuSdbe^ak=&M"(TFHC(FAj*ZH`IT.EH5PQ',.Y>P=rq(<WDB8A:[?G+-`^VlD(L`>,!:M$'!GkML3QM'kVr6kk`aMhu,d!@RTmEK6q`%tc'14`oB[+>Hq_OfkgO@_18CN+J+?@_OZReD(om,/G4f9U$?F/c'Va9>B+Bh>O-FW9?@&U&91:4R`i+8Kg;.cW9%(@(j_Bc%s^O%u)I!=H[jN^UtU@E+S0ZOnSnOlNj@3]`sL39l8)1DABY@c,OED@UN>LYUTq$L"0VWs66N`Ce6=[$pNpk,N#.=2S,.'^?:kmrsX.,3HVM;bZDe3s@D6JdUKt2;oKIjTsqmoa^cE=ue-plQWP#T$L8UCVsUrVjKG=.pVS>(%)2UT0dbY&p=kdqrUdJ/YjG:'lpGnUXn;tkh\j5V4-MXd`+H7"kTl@cHIX?/Dit-="LBHCZ/+rfh+j4PU=7lS4]mlhMi\K?X=PHXf/$5RXqLDg]544*FVqXam$&JD:CU>bQOP+f7ac*Ro1<i?#6A"Ytef#AQsdgA6CG-<5'%QHGRftAd/>TL@oZEh-@BX*[:e5m(2\H-._"`G_A#,;8kL17FB7hUZBSeHCHFei^s:uX;mYE2f8c_3Y(D3abA$\IbfI@=>#SR$DVi.6R=["V#3Utr7#[O4AUp'U7B8R8rR-R%miP;ht"<t,@5=u<JQ?QFo2>`SH*[~>
+endstream
+endobj
+349 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 348 0 R
+>>
+endobj
+350 0 obj
+<< /Length 2483 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm=>>O9='Ro4HFQWt+Bo$hE)KrM$_\@sX^p'B8(CftD;O:LL9/gi=r;/WKPPR8D.Ein[Pdn0J3T%Apa3KIZ_=;e),+`A,(97OaFFQPF2Z/\7i4rH&LDFkWUI@6?H5KgUUTnal0Re6b7BA'!h=7!/ZTJmiT#cIC>N^]j);doA5INnKXUmq:,a_]Jmr\[;&i$"aJ"A=SNgEGXq/Ws<59dPI@G#D[K.W:1_aVe27_ScKG/*JDp2J,S4C`&\BCbj+MZhARJ87m?9>5-UX&ZDVh^7;m1b.o`47/PP?qhYA^T[8#1Y;0QDnEt$J(JfpGH/s'4d$H07K1)h%/GDtjk->9=ip+FL(0/PRdi.u6`[jb2V\V]1S3F3g8MN-Y1/):YV;n'*qV(g"F?>o"Y92ELmTKDDR+qF8%K#nWU'BClgp%8O*tBKQNN_E7kp;PWZir&q`W<%@]HVTcPc]_JW]'uqB_mc>A@Sd*=3+`ABbIt=o$pIahAUNYRc$QO=(R_Uf3MUl\%DN&Q'o%37'ERjJ@_A<C-fnHpgUI?(753dPVRq6pdPK>I*7>+\ZC'UU=/h7#l^h'"toAmBofY0t,"LN4/uRe11s^%Ibq$IhaJ28DbJS'ok>o*;Kl@MPo2R'E^2@#>\XA3ojIlGK(f:S%M@ZWa6[k9rg\O2>1O\3mpgGFOff4ZV9QpK=iZnHS?c2)ge62/CWS=LS;Yc29jQE%&S()WAtMY9Td/&[;NNIX4?+omc3P=npN1a>o1&m,<U!lo49Y<B+P<R:>"SF6>#$(P:,^Xm7NB&P5t-kX/Tq3)Cg@?bB$[GcV^+j&M"9:.NVaiH3<%6/0?:Hm0t&b)q6"X-io!G(@a7V)Q^q)6`A9b<lTU)-ba/INi$0.M2]_%4WZqhYN26Pf67%WH7o`%!gHQ>I4mKrc'<=`c'e+Hr1\'P1sof[&d:-SW)AnH:b)6tj2ef!3lF@dTh=<.j_"Ju)2Q\U$`Rn+d(16$->Is`jHY"RUesUa=k'cmi/&Uj?Kb#.qE-h^O1Tf8KR!=0jQW+V#HXtWBa9Fq24D*_1KknGLFaTn3c%eQG"s&lkDs/->5krjnd=jXW!`j.#)#*3T(&5tG(/\BhVR,%e,g0m#sdB-gec7.J)4GSB-4PBjOJ=_>s@;_'?WI;A/p"tBaeQ(ml=Z[6/usMikDa,FK)^&=[UE=d&cdfHS/B=.PH(X:?YVgi-*EU,q<3Sj8+>/B,%g^)Ws>[(q/r+lk9_`Kn:b&"uiW``"4LtSs?%KJ4f,@'3\:A"U&p01h''uTemj2^+gLMH8a5=k"I(3MM\NUC#+Lm%'1[DcOQbH9;j0l0UOsFl:@0s<:3(eoX1d#Xc'&SEMkI<0<%8;>bYEC&s`T=8UJ@KhJPL7#-LDM<q"ppR=1N0cE:o9-JQ8P.(0$Po]k>kHS0(mT"(("Zl?n6\YS2d'-on.Q8M]>^uS%M%,GuZIjjB!HVA85>2,N-h[XM5LljrRQ^4?n5rAj-5;:*$/WV#@W.>dVlkdJR#S/,s8,7Ucm6u=g5:KqZT1k@JZ@Qit+Qs*a+-gAO&UtU^0<M$"UC92!TP.j6@r$Yd3JK(ASqh[kb<,UWY=JiL[ckt9ZnI!c%<YH1HFAg6p]oM;Q*rA4f'd!]>=Vq\=]+*<#f>1i$8Ke3j[.oE.e__Zq#j#V(&dK]!Wk(beG6&,d9Y=sT1_J(\Kl5plaY!+3+fI$ku(Ui$%WfKrA34Eq:_j>3=oj<]P>#%0h)X"9SfE/)K$iqD4CrLkY>'1<Y%"me#GDE.ss?*p+J&e9s\$8WC$=EC,ui<DDB=V4HO1>d$TJ!NN-NdX+4+4K=5tGa99tt+f#I$h0!@O,jkkdm!Kq%`s(Q71Oi.E6k_V3HrN+Q[aj1rY(o7"3h/2]?&PWZ9^T?@2<d.1,kA)$,i$Qi%fCMZ4jMfYd#2d&p74@s["HB+^?AWtd.uHDd_8loA'c&DgY8k!]1p']XSuft^*MWde+nE2\M2C+#u;!7,d\j%")DnQ<K@qPPbHH?rQM[0nKOb*Wq(0m9m8pNcN.Q3Z%<I?CZl?RKU09rR6'7!j9^BTEJNLi@rbVHGH;YEX"b=8-t_RcMpaTD.2Uq''<.mm=keXVE13nnZ^C08/Ziu$XHX[7c;hG@n5-E/YER#oX\n^394W\SE,-+:mH7*)4OX)4K0ieP*:AnX-LgmL+/!TO0DPK/:]O5n*2KOa0O!E,m#5X3o5tVSW#kRp8OQOgZ-Y2CriBOhU4<Ba]ll`#q\ORn.o)oRbetE+.hejsp2hL^Q17B-g"%/lrnd(CGtP0b-='j3:Yr[uSK&_i2B/]V#qO0IA"G:*UD8\$`Mr\S9tf.TUD^\>?jtAOm8@$aiX`.f#bCWhbD%k.-#VXdn4"CQKU2@RhaLq:qSPNO'1M>4CtmG'jM6n/Zjo0M,+PBD_/>o;m7H:@?=8IPl[i_A=tGe2Mh4FUlT(/4r\T:2?`to=0c,Y\H0A!DZc0c\s18P9~>
+endstream
+endobj
+351 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 350 0 R
+/Annots 352 0 R
+>>
+endobj
+352 0 obj
+[
+353 0 R
+354 0 R
+355 0 R
+]
+endobj
+353 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 287.82 660.894 333.38 650.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 281 0 R
+/H /I
+>>
+endobj
+354 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 196.43 573.894 241.99 563.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 281 0 R
+/H /I
+>>
+endobj
+355 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 251.41 313.982 296.97 303.982 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 281 0 R
+/H /I
+>>
+endobj
+356 0 obj
+<< /Length 1883 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0D968iI%)2U?Ge=i*-Dj4hH=bQIdW`=j1n2(gLSb;FVJXT#P"JSsr;-XD=X7iFFo"W],5hNf4oukBB=#GHPrHVkEe^p>^_na0Gj)q-*_$:p![g5m(s^^M0B;Ze09:i$i^rM3%t()Uk?4Yd,u=+X/`Wp1F'%B<kPq'j=a"q`-<K^H;^2V,/=ro131o[=4@s;5=Y;%D`V9Se\k+]dA<VlW9eo:B<M?2HfAZ(eBojG5HOM*e6*h<4(o4%W3G]jEUeKP%ot=t+&EV#UH@(!sfNl-B1PV'%4Y9e;T@7?t=ISRB#^njMR2V&goLNUIeYldE3#?TW(0^mE[oN!Cb>Z6;9hq1g8Xs>3(9V*"TV:In&$[236`dn\fHi39nu#&rZrGMa(9<$gHW_A3JC2sE5JepnGBs.Yh`coj6M^io`YM"/'t7nk<)XePC8+lH\!e>B\JNo<Uj$MI.S;L=3%GASN5*oE'#p(=Y>XUIXi`3/cf;DF2FY`t\@5[uEGsf?@l[EX]\9^C9q9bfYZMmLNCC[+oi4k18.Ij&Wm04#b]000S4C/i(3eB<`^F-h4[sOm<"l@k4IOK_m`>76Tet%h(9YZB*XnYohcl/e$_lM/ZSR<MCct3]S=Xo`05#oU!s_7/KA<d4H9DOd7\>=G+n\1sSmW0TQOGkn?4[#V4I^K!+LQie?[u?sj*Z]V)#7SB_'J;&DBh=0JXV4ac/Kbl[efVreDHrH=TBeY-0t-``Q-.>n0>UMpmJ#TSDBm(=D)C>c"qPXL"NUb:OsLh<VE;g`/,,]ni!PU)^63.da&<BD/b?WmRsEk&aW7dn(-0aC+<B**"p2R;(WQIE+DrWBBHh'iqG!2MNt(8%fWQH3(1S0Qa5&$EGP\5MNH;LE;K3%kO+)p.P:3=,E/.TRV$hCbTVNd)`GGn4gV:&JqJ88S\EaK0fPE#Zb/>EnRNp*EjVq\4&i55QuUqgV,X`&`4cBN&Y_Q%e2#a"O(L%3Ick+:;nM>G.N5"r;a@rt)c=9s1t<-RKq9mmX0Tes[P.Pu;d"8e:GEP1Rn*UnhZf9%j:1HC0ol?dgH[)l?jF+`IgE>_])t5Hii,:AfQiMbk)H\Y-W#F+FXGPY-P;9JZ5o>P\]Ac?6c?R0.UX;<Z**O>qHF'Koj$RW!*i0cWfEpr7%F^.>+hUMG:mWk4P'bW<fslNCiOVhD'3>f!Sb!pfEaA:?Ws`;-ITe:$mi:TE0d0FH5FdMOY'4r^#j.1=SfDXTan?19d5Inqf!V@O<I&a,-!en1RkF,C@LaHWO0QHR3DZ#_,_bd;Ula=nS+VM,^Sq4[V4l!U?Fj4+HRhPH]TJ>2;Q0A5[4h^i':'\`'Y4\i!BOlUZYcCiD\KqF9eK+nb^&YGfYpUnHBnX.!0sL0At2E;/iHehuHr,r-_pcEXVSh6o;s3P)HpK!\hqom6Mu_@MD-4fEfBK%d!6!F8D>1h59L?,V/8"ljCL_DcZ4Tarn'5I0V41Q2>^#pX5egl*[qe3nE2-enfcZb[rmo3X8Au/upnDER<GqUO>e.HY&%a)oCJ(n"*Po.SB?2!(1VTGYC;.^=<h8L:Q\78+2W6T&#XeinLi=I>fr=DNGdNeLW:^0%-Q@@]jikl!q4qi2Vgdgfc3n^!\^5$p<CAICmZuoNq%@I#Ihi*qUkaq"YTUAI,S0cd6qa(sc]ShQZAGkE"YSk69<Io>spXRb9fhlkAa'`;[&PH(qqi1UKQj>>,/O'+nK)?%0J7oiqg6!Mr;l$RZefOQ#tAFq)P`rI3TcXK&NV*dOH]HGKtd,g?`G$"R=*rX`jW_+d13HQl9mA%sNc1U^V*Vd_dUAhq"Q%;:89=l;R+`dFrVBu]2o5DeplqB=Ykj"D5=;WF=bA^l*T<?96^qSfI6~>
+endstream
+endobj
+357 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 356 0 R
+>>
+endobj
+358 0 obj
+<< /Length 2466 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0EgN)%,&:N/3W-Ya^@YirBFDRjH/3!"8WFIHl9Ul?VJg=);JcVk'me#POi!i<dPbg:GB/BYrm,dTMmK.\jkm];94uJ/DT?MUNJ)6rK"9*#l2rU0;G_CDAaf>C:i;E8Oa8@)mipQ<T@K4DjjJ%9C_:1`SKSrN`_]W!4HSf`5Z71sQeb<b"i[gN]W@,N&W<Ol]\n<3e&,<6DQB3bd/Bf;u9R'\/'MV.%:RK4p2RGs_Ba>4G?i#tYS%uPJ>6C(F-k<!t=COo)"N)_1_?C_.1it;PBPi8EL`0T=Ta'j<==$Vk#XFXB(]hIY[>6o+m0$=kPcmN3m>p624?CP@OH#bKZ:2]"+Mu)r(M&(^(.d""]%fOK9-eH-8J@X4L3>Y?pta3ij/:(inMr&S*+!m_(2CGIg9o+*JOgT-GSJJblZLLm3_K!tTZA]$:7B#o\n3Csl^gla**8bM-i+j=_B_'\c.Sk^SEf5)=76aUQ>?_T.R3l+HS,'/KhmmJp7D19IQtObIuoDp7_-q#g<(4Un?6/mrE-f6>CB6!E`Q_B=t!0Qh&W)p\5jMY)T6Z>0PFDJlOSJea9:C;^Q8bce;A1\Em9Wp38\f=pC]gcTZTQFXVs)1:aN:/Za<brR[V4%S0'e5iO*G9k-E#12J,ct_b(`n;=#O@9mL?tc&73S^+W^1U"N45'E[IFUQEN!&B1X"AB-Wb=4/.B\.EJb"k#/KChV06rTWHBmolBXLYg1962YW+9;8H6q!*1R_'d9u`,M^p_NSI\"'L"mnQ$)mLQ9_.\?/D/q#JhJV9e9?a**:)<;C+W]Z9%Yau**UM]-m:@DPcGBOp7HQ=MDc/6FT;..o1oUnqO-3?/lgQcK:@.p@!5eu.g[[U*=>Cr9)%]7W&YZlPe@--NGg\g\9\h''q$6K%\@\e?-_$l,9C4C]3?8^gq*e7'!0TYB1LMg<'<%,iKjD.rnWn[D34qGOLs9puB*M!m3uUXnA3h>^Tq7B]W\#gKLT=5^$X+*],uQnU6b!YYP>[Oj6Wb4Mp-<p^?X/:`Oc/%IR6/_8it"rN#&dOM.`be!(RUHq0!dWGg);*%o7Z)gu?hROK,^r&]4@u^E1$aC0^poMh>osn7KfsLq"!.,#V<A^)r(cIhdQu@VXZlna"&]g7OB8LM=>;D\4dNN$qKu>I_X5Yp`MER\eQ6dLgo"?f^s(p]&*J\mR[^#^Y9\e@[h2JOe\X=H*9&$Y?2KW_D@G>tmQW2kaPR`aVJ8Hi4H2?@pllkhET"TU-/870./Z[jC[_(<aDPV^W66#&f&:"PIir`F35WT/CapY"g3G3KC7g0g.=eej'Zb)#F3jY7qlPM423]d_b]5/"i&FO)TQLk,7HZ_MN\h=/oZOFHI2O(fdkh5B:CO2rU5Fn""kN]j[ko-T0k-F*o[//p:YEN#?hed`&/+kI6H_ZiXFI+rrYpl2IZtun!n!bseBNZRF&MId6oQd/A?jc)((B6FpYIt>-.`<VD)kcPmCt%_[,&[*93`nM0.grNIXM2=DBO&L&B&3-#XgUZgO^4pYM++AuISP/V/+1oIpFMu.Ps2tZYtUWh^95o1TP!_L.%VYJ$4HR#n:/%Th(pXl)puMgC+0B(=dC$<LCXn+V"B@oHo7GbYcBDV0,K#"4\FVf_-e;cIoZZ!VSda8=G(Y0.1C6WC*53("i36:K_.Bq2teR2#,,_.N*MkZc"SctljPVO^!TVNb4Xddmq^5l51CYbNeQ#mT6__X$3]dDV@QDa#Y%>6nVH'=XFK.)fR#D'(W/#QA2p+%RBuT\(S4P4e:sB3%Y`TMDPk'T0QrqSX06.#eEcu,!\r:L[T+MP2n!9^0%i0__fq<doan]a/b/nB;e;eL4O)6(TZ(X4EZ5?qFf]fsJ`\0Q.uuKL;\PlF9/ap#[*sne0A?6MYbc.q[u?h<@0Xp*ks-jqImca8d((FaE<nl;+^G^TTLmC3&Y0Dd8H?.A*F^a'ZE5G'=(Y#(Cb-WC_12Y^X-gPRdfZiRB_%DG$dstsB#D[>ntgXH/cq0@%%PLQ7jG]X3:E8A9CdEFca*e<r<Rnae^TpE.ohWWmkE*46bC3fo48*TaXaSs/bfNp6$uH5:i-F%0oJC_Kfl$`W8>1%hZ4KB>Y7I#==<:#U/Q?F>/ogsq<:/1VSU9#@NJY::uZg_@9!uPZ&ZD9SLs:=e[kZK^0ud,b9U[ga-5I78d\'_PU`0gE_k#QX/E[)Cjg2;2[.Ie8FtTA1*ONT#j"FGN82^+fU09&*P*;sh'0hSc71+)Zf*MmF5>rr]lKh0&>s!#b'!C=L#K#IQ+ZoP\h3AY3cWJ--dVH/>Ej@&`I1:6ZfTm6U&5eF"<_P@`NX\3VgAA(^R.i-\RPe5?1t\a)%Z<d+N0IG*aAlIp7$eF\&dVFM1@S8/b=M:SZ(da\E5F8haqY1QA+c-*0-qJQm/"H+pe45F'P\o"9^g]Hl^ECRqr'Zs7/U`l5tWQJ[b~>
+endstream
+endobj
+359 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 358 0 R
+/Annots 360 0 R
+>>
+endobj
+360 0 obj
+[
+361 0 R
+]
+endobj
+361 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 251.41 541.48 296.97 531.48 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 281 0 R
+/H /I
+>>
+endobj
+362 0 obj
+<< /Length 2827 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm>D,]IS')p1[nF:4k,EA>iQ(+,/))?Qo_8&CI];f:(.#sIh`jWOG!p&6GgTfe),6c`Uh:gT$DRK>STC22[H8M$2rI3g29DItBUF<Ji.s,:U[lcm,cNDdOs*7X:XkD+*7pd0\#O(nq*V]bZM`tDHci)4qj.I`=]t!%RVt<+ofY!*K^:^/hh*1`P>HS'hVi.##[=H,7Xa!eOm=b2S[AKAbj5!e.9:F&?FApPm'5J.=eZ!bU50Mo+QN!Y+PcRD)W;LVIQA\%NHt*%d:&h%F%cYhVq^UW!RP3b0Z$qFW["lQG%`[8@mm"YEh2t32$HDZJa0+eLGE6I0n2\[YSOi.;:EQu'"JHijbmiiKffGBl80ZXe8XH9a3'7.ZI/`q+B?,EYY2`N0r6UJ[*M8LPK'.aR&\C=t>Qp5(,@6XWnSojdEAee#4[%KjR:J`Ym=],i3DYA;cL$n@deCY6<mPk-fl"H4\lIbM5Guu"Tkh922C$9,^0L]M@bT2o'cTU8\95XWJ7`##2mU-d[:XA%4)ePD#*pir1K)q"[Q&(05E>*Ws3!"Q8!+h203b02.mJ\D7:no<e^=uCKpFgSk$r`rXNu3a%3`#?*8@%o;YjTHWsC7KQ7&aVl(BGM5tea+#YN6M"_8jm-G,i(>i/;#p\;A5=(NA2CtEUnRBC4Irf,O:hgoOYb=m"R8GBB=(aou%RNaZWc%scrM@5;5C69?%,RIEd_K)b;>dr1h.U"*['O<pN&kOQS7!@HC,*NbU7q,-a[7X$qS/KniTF"gV3q"+i6>F&ro_13XddE]3kNFdO#$qp`>%=>s"_Pp\k$.<fl%IqcY-f+bgWj8L-5-<6%Al[EIs\.2JnTOhh?q(47ML9BQs=@O0A.R=<WhLmNkXOU>*aPAFC/[M^:0au(r?j6b4I'&P#:;+WFF`Lo=bOE-q5QEfT@i.UtWCP7dr[*P"d7A.8C5)@h4JSV[Jf#b@56)ZH^s8&O_?t!BIO,rp6OL7cfLP#p(4<iCko2'ZD-tZE[NXKIiD_\eCuD(!uf&cr-Pr#n[lo="]kNO%aF4::.T!'CS%Q;`:Bs`+Q[/gGl#;UeR+EL([?5ra]#1b5_bZafni#"7QkOHMNBV<1HBujaJI$:="M"_.G,?KlU(+%H@V_@5="0AM"A&@j<8DYkKbjebVliV^42;bGZkQqj#tD].2u7=D/B[=CdmC)J-s<V_$-CSl``<OsNFJ,=/W=o/SDON=r^)96YBhDpkXt6b)]-du/0KQ8l,mdg:P_K9?g_n&cRu(&F@VniGT$#tPMj_ARQ1^[YAn4C'L?_>plO't<FZ9,T\`;/Q`,5c3IK\h;K-VlQu_9%\_&'ZZij"g7+@2=l6;N+7ODFEg6.)2a=d27M0M,uI\3KN'(58[;)_M:L<q]h](&XkZs(fHfO<Pr8W^+[T=UI8BJSm@3_C&;[lfr-Ej44#sc)[]\I0bj3hfHgJR>fa<"5#gDaB<g0^!5*)_c`E.=6^%%5\CBH=ZhYJmrJaRjcBP9=3QA3K('>k8T1ee2i&BAAAIohsba[hFuXgY<WP>lD#ER6/%i0jl,9%USrO;s+ZJ_3H9H_3)2g$/"cmX!ePJJTFd--/[#q5Gea)=IJA([0DqS3Q*RM1f32eN+rRd@mh]aR<r,P'jfp;N33F3VKfl"gC#I@Zr/c&P<eRNiOWccGZGR$5Z9+0#X@*4#k[2L2:n/Sa(<>4m[+&9It*ZP9O-OL8hjE+$eS*A9F<miIP#B?5g3./,ZENE>rQqbr9+N]#<m@L;pXM)VFP,M0hk&;HfDpfX]k`'qA)=nF9Hkhq`ps-E>gC=XAr8qi2U#Q;oQ>STNn,UD'WdrODlVnb)a+ir-;Ih/2`&Z"HR:o`,='>*#Cm_n:VQ;Mbgt51-@\9HttV6!)oUU4;h1lOI()O00BK*$[2&7^-.(3Dh7DTYk"J^ksK_ZP[0BRRksX'Y0c$,[GGXh,g"h\VH+Fs"E[]$ElO_)6pChCXbWl3f)i'2n"$D?\"'Tjn\'Y*VM>"9u&j3L_gHAa@?D&"%6Nd,h;HS)6GX9#.0el`]'e>.G7B$#"gRA+;3tTCb66_LNhf,1C[M@GN3F=e?t6`oB?\ATj6*8[9X<Bo+;*bm[Y1(DK-EJHf<Wn];1c:C1cmaZ"_me"rU`RclC&ABo'foP"0$!NDTj>\45fQ%ZG84>"t:34=gE)8Xu3WI=&;dRPpVeCDG<$@t`"NN39s6WloF!F!ZV)9!Gt*>U$]K(:8Lg(=nl1NR<(9MNhQRr<4f<<;Euf]9-_+cco^K[-)Lp0j"*n;nZb`S$`AuN!`/1)o8#'Z3hd^j]a[^OCF^=8MA4#%$$n'Mi&(4acm+\%S&Ia.`43!OPesuHU[_Um(4"goXM^H9Ng9PJn""G]8aO*PQN_-DQ/Y[7Q6>XX16&G0E*8?VsCj=i-I*La,R7js#.EX>YVq6dG"N@F<Di/bDiPEZ<X>p!!9Xb*oPr4Tt`g^S7:?fpk6B!plK@tOq5,s!?%\;e-6oRVn02le/r$m==:?5<gkZiUme<.C:(`n-%epqCgf)fc'0p_g,IlPjN>`$>iGZu%"_5q<%R34Ti?N11%+pV[o"ul^V/ha5IT^2rQ[G?]kukhY0cp75Od-a=u=JVkn,Fm"q\4e-Y*bPF^pC7TV1a)TRsI6D1/g^Rr#RK5<2OS":TEtmWb!ZMUqH][:'X$ESUKQIJ`DIG@2D:*di%&cc<K'O"W^FM1WgK^Q']sFMI(U4>7)B^DVS<MaSIDNi/(T"QQ9s1k0QI9eF7M+O6g05^0og$gkGC9T`#tOsE7BR\75VMLk'5N<9$kd>:kQBEuu-o]Z;Z6/Vn~>
+endstream
+endobj
+363 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 362 0 R
+/Annots 364 0 R
+>>
+endobj
+364 0 obj
+[
+365 0 R
+]
+endobj
+365 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 338.18 310.488 394.83 300.488 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 366 0 R
+/H /I
+>>
+endobj
+367 0 obj
+<< /Length 2423 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm=gMYb8&:O:SYj.,U=;:3<>pk0_9Aq":>[(nLfQgRt.u>iH.cea4;<6UrbM1=*91_m2!.h]9h79(:1IJjFm#<W&bqsN0S':R7D8'Xt#5g87e$NN12Zhh,[E2=YhnQ!pf/.-X:Uc\eJbDO%]PhZ\!k[,J=jR7fBY"''rNh\PO&fDpU)A:qk*0E86G0*K?.+C_KeQ4<M3;,F&Fh-_B#@c?XHtag/5#&6O^VNF4X,dOB;t\'&a_/MV,O0]10'f-[MmVW[S+IOVB0nsm8pdaXdit,\b?'e,%uS[-tMoQca.`://:5Fjo!$lebSk@Y42qe"Vcs]`C'1\:b3;-4<002[quA7nm"hsh,5</iCFs0.2<B&(T69/Em6<OF[ne7V28:Sf:&R?S.5J+Hd/Vi?9S:6F*`!b3U,7J_;>TuiTjMji+a:=BGG_We-flAXY`CakZlWnruA:4PUNeDVpP_H5=]^p`c@:tR]S?fW#EKii&(^[*L%J\kr]:ZP&PGiVWIr(Cc'a<((i;UUT64=.cY_e'#07#.@im6cG&HF7@oY4jG^7Gc3m7A'R>-nOH_+*YL1aK1&)3W!7thb]or(L";/7GkpXS+`5BLl44</205/!td;+kZFa15$_Zs_UdNka%=Lq6F`?$2(P/F+5\nd[aVeOghCBR#Ml&I2a^5&Mk/_C!MS/#VN!a#T>ZlRP\aOk5.$35CC1VtE//bEg`2uBj^@_a6<\e*5ZbOc]-[G0MW@h!sI5X]t!!U3$I3g1-)P6Hu#Z@I*cM/kJE,3[?lglW6F3Xf_ocdjhbWrS/^\GC;+;3O8'9F<uC6!>N)s18'R+W,mBbJ"An#rW#d25=oYfOj.W<pj_P_[f>Ma^$cD*qj7L7(:Geo%;Vt2:C]/`Ep")>o/h*WY%K/Io\Q<[MCK.m-;$Z$2^-P.k=J]K[G[q_qo-QH[bSVG&jf;;QFD#dR!sWa*/F0\K\`Fkcp*[XCG`E`bq4qMLBtOaJ%S:B.lDEm'L^^)FcN]UG?u;UF0=&\0"\iHa[I4D\U]Sj>_U0r,U?u-uLUjp+),B2FW$Nd"sJI=^RJpRdnu8gS#kWP+g#M[b&$clq_d?hbQsu/Gr8G#)-$<4g(U;A/*rdNAr7E>AVE%3sZaYYLA/B'4q'D&=)DE<O-"sW+A++2T(XL8@)_c)]"Dkc%fl^3fKhF`:A\9,N0)gK?Ai3,$J4t%71N4&NZ4nN3*u6m;C`@.fsNSf2LFce*ICJYLDtP$`'>bZSVt'^^Gul^6']uoFelXjtqNV(.@`tP7cK<c(b"R.O)kRndm/0c((O!J7CDWGYZjFOqEk":4"*iekpS.8:hku14VN*hd_hoGDps@6upS?1)g,.%)Ah+3MdaImcYu.NE[1>Ws1o(O=miT$4LT_K;M35p)l@!Uu9\:S"-'N&ON$Y;PP_&.p[OhZTQ6nPUr'[Oi4&9LP9.`958l-;:I5o('uRhKD[toBTP_(ir^9GKH=j7OpAL95r''.WHh:4(,&mg04K#P[fI+q5En=[k./Kd<nm+Sc0oSs:P[<V%54n<52Mi+<!/.jNr`)J\VGghjEnM7PTKJ:i]d$**:Z/dHQ>U%5osoTB^7`XV[-"lHkhj3KIf(U/b30(*eW>d8tbU3k2G;A3nQ3*DKCKs$V.#7&@Om4^e(s[=hZ#`jH4PmK7S&KQ>!am.<Ub7TBpt0om$+Yh])Gt4U7EI,L@DI#n:`b#5[!$19*M*rNZ*7;BFb8;/?FRnt!,\:(Po-bLQbC./$b4F_?'!laZl@?+-'YX.:a1WemPD^CC44Q2cok>+VfBMf6cU3e=Ur"7GKkgBIuWPYr^aGU+<eoF\2>D0WX+#)ZPONapf;+eXa$Bd-3eF=R$!R#e)5[`j#FUkJ;Di]MMUh843gS1k%H3+`QorLe3iA[=]H(o\F-:/G]&3)RR-\<$A$FP<'rBc+"ZhSQ('pD;lsF$]Fm]"D5S>2PG46Wq0GNT8M0e;>08ZOYM649BS)j,rbR>H$VMT=]o2TOQGT?PV8;$EJkjgl'.a%ugOhaqggK@D6L`o1qH=bn_E3#[\NYI<s1Z,03h2`-#b0f]m-,H@C=oX)b7.A4QR?Ho+)pW!\=Pqof8E2keY]%=J^,kT6:$Wg>Y_UAFBsg6%Q46&5#'2:M$"ZOgG[Hkjts(6GY&oDIbr;U*/n_gd-A`OhZ_G798aD0ic.<-S?]:'i0)B&bsDisB,-D8.j@+-5]2lAM?&34;YPDm_XX=Nr_ZGP64qHijXJh/i(lKekX;X(&O,4m2p!qUa$Pb?P3$gNOW^1+`kP"@q5H9HTs+MYAL;-Sk3#)8i`obmcU7b0mLrJP1BN)jjZ&b#jDWZn1aj)QLErSsFX-*l'(Y,/PKXDpqD#GG*d?p?rhp"NdN3V[8I'5CAO4jc:RTqtE#P:M>c:TG;s(&NTJ*/rNdh~>
+endstream
+endobj
+368 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 367 0 R
+/Annots 369 0 R
+>>
+endobj
+369 0 obj
+[
+370 0 R
+371 0 R
+]
+endobj
+370 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 251.41 576.06 296.97 566.06 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 281 0 R
+/H /I
+>>
+endobj
+371 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 342.06 286.809 438.16 276.809 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 372 0 R
+/H /I
+>>
+endobj
+373 0 obj
+<< /Length 2017 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm<>>s9G'Ro4HB`(81@'0;u'ZbqmRV%^3-#Pfn,S,gG[PZA`dMg#Fq!U?rg!X#KAY9]]Yu^&aSa5QMFte@-)4!ifA%"?NNTG_&R.,#3TabYaUr9"I/2P![rg(;SNbqRT*f;qVqko8#r2>+hR#'`I?hPk7\E)27W%pR*Ns[/#ZRA;%q)l2\jsu`AD+-(?jf2E+Tf)kTid&J)bQ[!^=iDT$.kFd@_*ilt-\>tgl(=fmhi-4n'b`h(4%r&$<:YC%Ppnb%\&B?lL1,^;KcR9aV'*3!<[gB!Q=Ks$P#W>`;;fM<dRCF@n5GbkCILsu[Q`C>Gr7\Y!RAh5q"5c&db2D_T&Ftrr'#9kijqUuNSB(M%PD?F\]gH^;A4K[h-rq<_n#49S_oNZ&ZrhlU$$`"i\MueeLdIip[hbDV7.@4C(f99_t\.,B0o).2]GlC7r@14P;o/*_pWTsZU6m2XljXti]DGrB?Pj!<opbp69!]+QjI#K7q68,X0JOTH2Xgllj=YF-urQ/8kB,%s3S<dGr?b*`a;pH?J>0#bNHL%)R)r6K?JNc*P0b)//;G?aZ\o&drnrA-j=)'?K&<.\S@'&"P)'QMKiD[<X@=#2h.B_:i]E2ZLkZ.$33ja*"TZtc.2LU2m]EVm<Ll%SFENG]P1#/,<[5C':tsmWFRN]76Nuo=l1>"H1MVFj2T8?7(0+@Kek22C9Aa::[0]H%lqfIKe5j\!+8B)lU!'?7u)q1GeL[/2VH3b\=/@ec+puK84:TJqoh\'&]gb4Fij,pR`%OW-e%<KZ@#kU-%VXOc0HgArtT('(,1P?.]rT.gUdtC/g(1'`8PAeNdQ8OK<qoP1J<!V),.mWVYN?:F7]DZe0;HX%<-pR%A%7Cf2Q"VWZ9@!FX#gr+W=I!Vh\i-4m@!u)h]]MBogft+FuC)7qYG?n#C@0lPXFqM6gNlael;Oan(1+%SMGq+>P?_AIOP:\*_-YM=<gU;H>qoXbC39=Z_P,(tE2[j5R&u@]f89SCh:VBHj.+K5hXbm)V.&,Ok'd<@*\=E/G)[G4M>_&]C">+);"CIiapIK&8nPC2nd#W5IS8#2+guAesk&A<Rd9U`)1S4af[2IOkV1Po!%A[cN,dS1&1E=Kg=9mKC%s^+0pEe:_KR!6W94O'*=+4/HT5KN-\4CSn,;IUl%!j[T):`>RNtQ.`YV$.4'4dGDe4F#9JD%\93N"kk5qCV^Hgg&9VUe#jQ$b7D)JZjl?*)3""4.eUN8g9P/c%Dmk>QFt'/:Am</`dfZ*Mq2VJDFX``J@=9D[N"S?f`@uK_>DpPH>4$b#JVLCYVq[$(UZ6eq$-YuAZ'Kioeu/T@E(SK*R>d!Nl23P0;eJHqFc;`mtrt=B.L5H%^^8)9'gL>pES"N,"@aaiD7Ya;;uJ7lB7J@PH!Y_.%si^:1&X]4i8;5$&O-iJTZ+`+2^g_QpX$.9c>\3S(Hh,'fI?6(95j,]c67f^F[XqPKU:h*.*mC<6KB[=K%iG`*sHi4%tqnREU1`Nln^rC!21:_gpCHVaTQfWg@Q-!HC1LV^'&_;Ap)W6..:nkHHU3[e<#QZgA"9%gOTX3Se_$W0][a.GG;&86)NqJ1f.@9oKZh*U#R*8f&l"_Dm:K*>7+R*hl\+S8a9tZY;UW.5XB;Gq#Uk(_Zl3_UJ9g"YfGJQ_^0@6P=].T`$>uaoF>S4[ZQQNR>TaAii.m]>BO>_mj`#:Y`)p]>Q:O0!tPSWhnr%Q=CP7c%;&^Z=P,kdn80?e'?b-<iHR7jf;B0#AZP:6UL1f0rr[hrGDct9>;L;i,:,cjL`qu.,42k/`DTlCu>l9c&I1"G$gM.g-9sgV'7r!/=9OR0?_igU%;20Ub87`2\YIDmY@:8V)Rl"p>L(klbX;d):04*j7$u9$aZXYs(8Lu8HZ!p>n!m:653:<!^`godGZI-[VOVSh1==?9t&8]J)b^pZOEtRpgV';\]J&.F^^:JLO`kuB@S!T1ojaN?./LGIfNn;r,U&J-qU7rc&ZdkZMk*W*NR!~>
+endstream
+endobj
+374 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 373 0 R
+>>
+endobj
+375 0 obj
+<< /Length 2023 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0DD0)1+&H;*)_;nNM;p,G<#Vo+8c.cNNf5$hbf9pFO6,BkO'p'qbdbM%@"_/)\@]n<p-5e&sla+3aQCLZ>Qda@6&[iJEqod(@aL4)%&[NnWi:E=FMB(6rd^gC2)kE8b2TY@.g@,F0k&!*pcA>7-VhGDqXL-WGA<_Y56)'));R4LCjN=s9%EHqC+ce4:Yd!4NH-eH>%^r7>p$qNV-(.H4naA59ABX!XC[BcchVgEg3O1hQe(7<*(L0mgU\t&/[lCBfm\NZGQ(/h%A09=A1'uG]9GSu\lYJcYN,N$mG'`'d\YSk:E?)0W/5.j^X]$IU3(hWZMj&dOQ[^%u[*R&n%[L8+3hB$j_Ss(6.hnq,P,+:o[R1H7Jk).Pc7=rZVCRq-E^ptY\M3'ba-H-lbP>l:mG[")a_rA07C)Em:'$L!h_QRN:J/`HP8#Lf.[)Bb<dDPD_G4ENQZrf5%H/<nRY0RN32pnfL$:'"O,8\Sl"d\#C="RknX0I7#-isI(8eFuR9U&h`R$cG+2Z\tB!oT^&]s\@U`n3(de8c\/!I$19&us=ka4,lk6<glS\!&>&8.92Ra8kOP\iY:/"\j7A=eRh/V90-#WIq%7s5@#V@-1LSPH@9(u[M_a0t;h\%h#o9A.U:1Y5-a2Zr7ppdU_JLu<j?_5NDC)pfUa!-@rNHDu^RI[p$IFaV-L+M`L<4h`!lC6SMQ9'Ns,2Nu6hgi?$)")ocfRXoV*C?aT[/u5Ib,KCnI!S"Ff-3&Mur^l-(><^:5PQQ^4JT[imNAqtUB?G&OYtc)0lYusTF=4IV\_B+<Z2oZo^>Hm6^PM>h"%o4X8-^)QQdIs45TPe'hIZkKkrq"u(aFon1cMfs@dJlV!V%mbrLn$m4H)BXYY,8BaQEZ:KX_N/GShA2jrfEg!K9h[&cZLK!?hq^A1/B.a$D?8cN_>q6El))UF2!@A1KmTifN86_qODHr7U%J901p!))rBtC95']@9Hat0F>U]LrQD.3`qF6Y[IYViAmMJLD?OBQe-.oVNif8D0([r*QF1:8mg&DXS'?Geb2!+m'CXPb-X@UQ7=bnQ\JZf_Cumda84c?:u-dKBD'A-L#p[g,J-S-:g0dNbg&a0\)!\0Vo+pmLPb7X9M/s./)XbRqlXMpKiNCGYUqZdoRABD$oZqq$s^B/SU0&9-`*sAkm2F/k7H+Tc?JO,r1!Gi7N1N;[8K&$61tC1De:8hW.#"O'Q$`C48P`VkIs:"e5VjmMeHtGY3&1RI4<^_1pbltfSM6cP-)C22"M+WRAOSr8Z#M;0Uo&W4NXdK_nZ=]0_O$pUUar3SUc6@<RU<rs)1=f!.^?2![(ERIPPbN?i^4L/bPlAh+[+E#gAN4:XDgtk";,2B0):ONN',P9=r@P4)d>(mJ_$+c^&!SqJ(nVhq_POHiNBnncG5DhP+.XE',I"m!GT+=8?a#0/93C!Iq%A*^@Kn:B%E6R^R*6Cg\#H+db,2HjItG>`*lL<g(NP9bbJ(AkleRBIOT.#[s*`q.1n"&N%3NpV?2TNSm]NF`?Z@0$nZASaiS*`Egu=SY5iK<ROst5c!sRB>6?o/e/[jZ`dHWl9X(D)^*tMHn'Q0RSBY*N'ibrW:+&)k0;N^"f=-kGIoPuVK.,9MJ2(N"[pukPt7Lf7Q($.RE^sJ[9>5LSM3OU[#u69]DR:sq)2qo"XP-HWSrXZfLj";mV0j$>U1NiH0+=c#STLsXgN''Dm:be+S75PM%.I!pOFYQOTF%6JE\^P-eL*,KOR\O1]G<L-0J1h2`fal#%fsghoKS(B\hEodPIkpRGU<6Mg_Ya"rqjk1;N]0UN!3^bg[;SgX2'sOsVse[=HiWUFVL1T6d5jR.?>*D>$^Z\HOYr/;gnGm_ZrQIDrh/3j7'>Vm)AFZ/]6E:9DDEndZEAUJ4pMcZsm-\ZQ_j0Z*F2@irE>3s"2ZBidt<m*XH;s1\tDASe#I/h8-g],"=?3V';igC,3>cHoOKi(G]_k5ILcUcr,&_Gs6*G%;=05*qC::.P<cT6]e-~>
+endstream
+endobj
+376 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 375 0 R
+/Annots 377 0 R
+>>
+endobj
+377 0 obj
+[
+378 0 R
+]
+endobj
+378 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 307.51 251.768 352.51 241.768 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 152 0 R
+/H /I
+>>
+endobj
+379 0 obj
+<< /Length 2197 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0DgN)%,&:N/3Yj+UCNWg"?6&L]iN3>fV4)o)5BdV+-76q\&?5/Rn-"#Qk7Dse0UtCl+AhjPnlse</=WHpEf]f"_NTrp`L6IY#h0,`o_`t.uC;?X?]>Sm"@AJ>.RO%.+eh^F5GUoEW!"C_*E^((tQu$PF[,GA"enN>\9Y,pHHXILj>J0IRD!H^_&Dun6qq0?2l6s)N1e/EY\aZ0\mrP)^@UbR\+3!I'_t=T>L,O@_pmXd[*,R_sr+C5>#-f8o]Wd`B0D26V=dmQZRQnY+H2I?q*17+Y`8c5r67W+LUBlG[LG2A!A/#!/`$%1oQqr=$O2]'9PfH[*:_8#?:W7:q]eN#;RsN0!SJTT!eumkXJW9_Be(.^eo[u@FVah!_`1N?uMo!ZhOZ-=9A?c?8X"(M9gBcap`H;I#B1\V5,,X3D3QHr#H0qO!U(aD&f@I>$<biZoN"V%@Sj-SQ*Ld6h^GL9@2%8(`Xs5OU&Itup,)?Phf]_KLpMp[KFhS'kan'P0$RSW1_&34U"c3^#jD*=AX,.%<b_(l6;^TYO[]1[B8/8L`"a$u+a&OU]60)BB>_J<5`46]&d$l:NWebbpM.j$kotJCue7lJV:N8SQVW7f9]LOhKePW-f&`ANrX%a0GF6s^Y+]Jiu_UR-#jh%Q:@cS[r7XBgtpYt\+(kb0h?o$fr]'@'gq/q]N!)sK^HmC"$BbO/Tnj!buMTm)oHmo:$cS2Qc(]mKBG_1ts#2_E.kVs!@Y^+59o5Fj:;0rW/S>RG#S3+q#hrbk<6W)'AJuncVJF9E9RCdk4R`,E9))5fY`SPO2kGK,oD[R?7H4@hsWla1fG%$Ie@^=/7c0G7WQ9E"VEj/C\0Z,2SD=pjPbV(,Mh$XdequIq\Bh[M4Z72j:E<iC]//>:e(84qb!ZUaT:P5'_].=\=gY_-5>OI#DmaH5.QJ@_]G/OMElI-A[3@<-Z`U-L`0pt0R92\ZV37`4N%.4!MnCnt(<?K*pYafp]>Ase[4kc-Bb;L7MT%\6Ejk?HI2Cm71Z!EK^N,p]Rq'-*:Ns7#C6K-E-E+hj&Vj?&T0GUQef(Dpa-%qBnRR^]>90j*1Y\tf1]e$hU+u,\%4I8J4Ej:.2YN/]\Q9(>WRY\/jJjJO03>9?k_"VBub$.`;42d%qkMGS5l'6/iGFhC37b[>CKtE%eKQ`rb_.]E5:FFZ&Y$\s@E.4NL^iZ[_!MF'@8?,\\qg(677$7R'YZ]gE?OCo>[F^_]nq3liR,W(\VLWZE5k>19>X[G>(PHg7/YLEJF3TAEju=mgWgoK'o(U>fPJc@QWb'&"R`]N<&n2F?e@$hc/n'DKb)993:ER4T,2.I25d#FU)IAa@HBVP%)QLF"S!E@!eOapbAA?P;\84I]7.A^N<btm;lI:%HWn&8"#G]>93a:a'<94hr\g\28#/7+L7uB/uP'%C<^6AQ;f#I[I$4._;$,cIX'on)WMdo:N0F<"$Z!Kn;_#I-i(qjXTcZ]3aqtk_<-_C*)e-A^;B)QnZX@tWRQo[2l.('Ar[o`#_*Ho/@FQ-Jg3q,7=r:R'GE!h6+8PHW_/N/,VO6Z6$e5EH/3q#.#_g4+T;_6K+.ooF!.rCZO$p#<./Cr2-l^2E5ZP])*WMQHg`CcDB<I^tZA'b^!NEB+PFk`jg()',`m8H?:fRkTFXL@a^a`=0a=t*Eg2^pK:HM]FQ0IW@Gn8ZI1R@HM&ICNHeLaaH\$H9I2S`c3nTW>G9:h#hEbND"%c)8YV_o%+I1UKf`W2S9qJp-`fd]H,73[N&Ql,,MDkgJBZW>1McUVlCV82H6bZhZ"1b<LF!D#`&=&)SAaq9f(fQ$qpq10EIAId'.AFla*HrH&(ahFdiLCa`fu*,WFujjD%eqT0T.RD=1>bKC!a$P9#O!ku@3ND48PN$sXkh37eTd0RA_Fc*qS"0Y$ic273e?R@rg^W=r9VhRPY6$DB'F!]H"[Hk>?42e8sC[76S2:I%a@Hk@0pEZ2+b)!GR5/H5JS!RJ^lbU3JQ'hamb1Qa1:R;[*:&LW[Vo(p;s()qH.^N#!3OVRcGO\hHI,*4OANH+\,7;-(-'l"4OcQ/WAL33uV&Zs/V-KlhT(qCU(ibGMft+tki?1Qi$N[/?.tgd37Lu(P&\<1k:@Q+ed8A)lTR9"BkFfQ&FH"L%9KiD[Z,SEo%j30&T._MDCt[QHq8X;fU&P+ab>M%~>
+endstream
+endobj
+380 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 379 0 R
+/Annots 381 0 R
+>>
+endobj
+381 0 obj
+[
+382 0 R
+]
+endobj
+382 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 251.41 652.5 296.97 642.5 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 281 0 R
+/H /I
+>>
+endobj
+383 0 obj
+<< /Length 671 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat=h>Ar4L'Z],&.4h&U)NLB`&kA]pJMF.PUi)+!LT1k3Ubl7mF#%J.p,b0`:`(,:",\bHoCoe7c91V\,i2=XU+Q:,HBH,K8ZFI7N(:+D;?e4t9SV-TB5cYu"Sad=^^@TL;bk+gQNSht&B[tUGY3"r609ZH4l2BPHei$X6jXh\:QD=Y#Xjd^XOBSsJ>/i-&**E-\1r8ok)D!jD5L&(4DddJA>X^)I5aGj6*/H.G?Im^]UXtI\)62mblg2(jR+-a#m3^HM*q8\jYL[%X>NDbe<+n0S:Q6N<Chs8GQ9[JgD'L\dUhQJ:_j[:fc0]&Uj")N=:MgoA8Q)PVT\;j<@6]l=52CVX%#%K?UZ^)=XWPD7tqgXAcGm1fVNA)[5/=<9\#Ug%;?6g=.)6(oR&QCm^ab=rHZ+_e>C&r?2@ReT9k".',k;f:[pR8nufK)%2*)8YGh_-&XN?EWc;+DLF_Q+<Rp#)KHp/EC:K#X')FGt_V01_?GU"=6]:B_Uh`c"YYom!^T81^:V^6uTk"RT1^ILU0Jrd#Xe?VfqqEsPg32+%lDcX_0c\u<\uSbR![?&fVXZ&41&q=ulm+p\;ZPj3MOdCu+tLi\K8gf_rE:#iC,<u)NR7H9VlPe8Rj4O<UXL<N&bc/o!VLE8\(O##3C.QQfR!Zumgi,CB2S~>
+endstream
+endobj
+384 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 383 0 R
+>>
+endobj
+385 0 obj
+<< /Length 647 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gasam9okbt&A@7.pm=U3CP.W*R&3:*WejacrK*a:\6p_"^rRj&qsWjdAj'[gWoCmSBAPa85Pn_EHb0lG1/(MFc3UF^'G:(:,Qa;G,f)<r:tD;WS.`J"92::IR"*k>F@!]ti6gan=^/Ac!^37DK*14kOqI<fR%+2PQt(.;Ht^*dC/is2^=KFZGe3PIrJqkufM:ON=m&/-:N&Jd1Ji2Y3c02!TmSP&Y!rIV;-0kXT\>orlAZ>9CG)Ueh13s\jWhl5Of8\>GnkoBLH(Z=IV:`#&BkGT,(rXD?8-%`E#;>I%\GZFJCF;XV:cq:'cb99Zl\Y7/cJ8?SSXPXA.HRU\SdpdK`jKN90;2SF)ao9>qb$$j_hJ#pUA4"k.7:$(VV=J%t2DlpBke1Jg3H^FjFf1iVi&"&),W^LTWJV.e=#dU"&5^NjEs%mu6\!l2P#5p0jZ;]"R8eGuGOqG[YFW`^s+]AT),Y'*nUEVnX7-HFTA5T7'8:NK9UeY)d"=184n!M&</$,2Wt>``toaJ0pYWq,d6;,4[3J59`9tlaA_j&9,rhYO`pt5X^:9]D3(1'bJ6"E=/3Xl*CA*Vgeg(YCJFinbg7$-CDT*]>5;cHq!`[)NE&6j2=q<*b>M&_;YV:IP,5-Ze8\oe3\N~>
+endstream
+endobj
+386 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 385 0 R
+/Annots 387 0 R
+>>
+endobj
+387 0 obj
+[
+388 0 R
+389 0 R
+]
+endobj
+388 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 130.33 680.866 175.89 670.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 227 0 R
+/H /I
+>>
+endobj
+389 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 355.57 680.866 445.56 670.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 390 0 R
+/H /I
+>>
+endobj
+391 0 obj
+<< /Length 2026 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm=9lo&I&A@sBE,oYT'/:cO%l$#pZ);K'8L@<(cIb-B'I7)gIM;c6]>)'Qaqf1M5]Wcn>RUnV/frl`h*ldaT=qq`]J0$]Dn\7?]_,Fk"n42;Z3]Tu+SWcflHMujp2q5KkM@Hj!r1aI9kCi7Qk=J[V"hS%"+H5mrn#?)dUL<u5HW8Fn)!tDY`sB@Yd<t<-1@q2Zc!BGXk]RdbXUf)U`3WrPplK'hr%L^(t=gu*(HF+ACX(f[U]c&<Y[L%?Pt]:OP'e@\Z4D!3=J@<Ye/u-:njX;r;#m#0]8+\@.VXZhE<h4O=VFQfa<8GAbQ)A+7F=+1po)d3GF_f(Qtut7!!I[7b%rLk0Y9Jjoj?bf-igV<+lS"%B:.pH8Y9KEnYUrS@2f7>6l[:i0sM;C+20SMT)@@]0-A^ZkrFg.'?cg>YMFEk5_Kee],n)rZi=&%#*[M=GNG8[C0P-6j"dW'5aXV$0Mj/@JGR+<^;V<pu+[e:qhgei;`'.QpRQ-)3Yi0rf&R][>4*:pE2pp/GR0BJBo919TRmB10^I!LnQWsiS*&O/-UJ8KR)j.C@1DJ8(#g^VptY3Q`J:9I/A?lnXuURQM=<Pf;!sRN7irL$R(ZYq)t\@RM0=`6G?)nX]r*HYk>S?Qdlr4LBZLJ0XscO"C/$pA60bTQsJ$I/LA,6U53d["kU=d3';1sM+X"Lq3#-\O_/>JBl*%<s$UN^_8:SMTKb:\=/uW3KO;L?Y:$YT4G!l(Sl.)J?`l&[Bp;hI'ZYZm>J)//*/O"Ri9'@'@1WWWS;ssDMN0k5h$jo&9.0u3JX)ld%Pc[KD%!/U%'^-eF"BF"Ln'%5JRc&-.SA"=0q+t&@!KeM"?Jc]g_BsUq.#%h2o$H:E4frPl:P$'<#Zglolp\i+U+UTocT^WDEWhS5KN'bOZ/%L-[CH(#;2k/I<'^U]<@f_oa6JN;.@okNm)E#U=eCs>BAF2TagO?%oqPM.tV+O"Wl)W<3'2fUIggk"s7bI?B(c*!lZ]2TQ!F4iqRZNq-V^1^DXB2>(^:Hq5]4VJerHMO0K7%^iX>/7VNiX'hJ%T*4unh0%&9VT!b.P6R=V#lA&9Ol]Qt`DMP2Qn/i+Snq+Fbq-c[dl9s?",<q$a=3&bO'KVD50#'Jl;t&sO\;T3l`Hj(:^7\(mdb%`ciA,Jb'YB*UjLc:-6#Z$h/hnAq+<O%+WPXMo.PBa@n3*!&9/Q77.!T5K+814ecCLWnr0R6Wo2m($<*jab$ON=b0?qXXOFEX$8L?BulL;5A3CW'#2:`((_VZS*(!CFG^M<6JHb+4]3i#I--n/!/Q?`K[[K7thJT>@MknZ6&<,OnOf>CZ)Ud^8jhR?2H-)>_NfnF3",%j,bjnobf3!]\6!6rPk]/]7o4:QeU86/b^\sEZ&+@:4EN`XZ3_KcE+A:=nt4CX;s:e<g5HcK!B/qGNIeDq9gaZqB.]])Nt_h>(c3cMt@9Uql@ZL',-r8EqkdXE:YrJd4"HFFFk1rZmK[?i6Q)Q@t*DcSTKZ^F/h\5IPWI:KCj%NK*so(F;>]d5$C;7U^3G'$XX2Y9A<D9TBJ;.E1,%/OtsdXlq7hY6FoP4U<[&_nqYUo6,'Cnn4T>ubYhoI5?7Qf#aZh.uG^IC+>8"SgSE^YPI<SKkRmgB\G?GjD6X=tE.ej:=QrP45_1ikVR0Kd3QnCh799BCCH4"BCL*#WUS1NXIE;TV\+Nk&uK'Se+5M2cf9$CE!"JKfX:/=BDoi-[]q`oeFFA;-AVu&tB$b;1^WC#A87pAc=>LCfc8qeSa!@U.J]3IEF03:YA:E>gNNZVClW=Gc?<f@PMa@XdG'DrOpQR`O`J9M*k7D>sLJMdrOa#ZVa)2lLbO&5,MAlr\[<bRJle/n5HoGHp>7CAk6u-ca2F7fPb_IR`."?_C,b45<d#\.pt5drc7a04A:,D:(3V&WLlHELa*Xf.CT$dFfkM(e!En"PpfOL^1X`MYqXJ_bg2t_1-ea7E/um^Rf;O%Un.He%]aJ3'4/`T\_$lO%-#h8llVSp=Q'~>
+endstream
+endobj
+392 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 391 0 R
+/Annots 393 0 R
+>>
+endobj
+393 0 obj
+[
+394 0 R
+395 0 R
+397 0 R
+399 0 R
+400 0 R
+]
+endobj
+394 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 223.63 647.866 275.29 637.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 236 0 R
+/H /I
+>>
+endobj
+395 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 196.43 625.866 241.99 615.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 396 0 R
+/H /I
+>>
+endobj
+397 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 480.51 614.866 526.07 604.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 398 0 R
+/H /I
+>>
+endobj
+399 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 262.54 581.866 314.2 571.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 236 0 R
+/H /I
+>>
+endobj
+400 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 225.04 419.866 270.6 409.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 227 0 R
+/H /I
+>>
+endobj
+401 0 obj
+<< /Length 3116 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm>gQ(#X&q0LUk\\@jLZ)7"I@D6i&23%]YdI%&3tEpK2/8LhCO)%)q>.5EKfheI9/Fl1J2*k@B%?.G;l>NNfCIH&&$nh=Hi@QdIcX?H?Nh+8rWSKg8EXUa_@*+&A6DSihZTYIH?,MM55fHl8Z$@$RO:-0-AODO\u\mY/(#dAlh0>ban">rH85g)j6Gfm(M;dn4Rr@@b'2TWY0up$k64;Bo`o=c/,2iBqnJV[_Rn5qeo7/EZDhs&T@d2Ud4(Zd2nI8m=Xsg%m6r>gc`Q;h]Z#"_R%t.S2^_E]&@8kO,*S!_\R`/0HLLOImn0f9bEQ-HT[3rPfU]!&D<mWrX@a:`R82L'QH^AhC=aGZPsu8RVb/Hbe#8&_VrdKe%tPP4e$h)4lVkHdmPf@e?K)3Jl"![T::^U]q:pnjI*'\V+7@$\0`A>i\I\QkMS)C%YBRhP]3N%_qlN)3X6QQ[X0t<Dn(MBK.oee,V`p%an0K^+Z^GIt-jf#oO-23fkdmHX(>+hT^OdaRoD4OB5PGEOAYqkF\:!#QqE*L?PGu$YE@ZuTOWR%N^EVPh#f$@:-D*ZT'o_-MI#Cn`:URdT5SccJTXX=44'kF:7(a\@`WPI#K>:-C\0Kf0B_Pf#<`7H2_ad^V[@;<B$[QK[f]E,n''WtN:?Dr1T:S`$2pBnaPZ9<YeA7.FB-G``-rjRFVq/HE%k:`G7cj\p6'lNESDjbEjsme%P^kW%X0UJYe#GEqD/.6YY_5iq')V4/jnR'^4[-4tRCQS`\44G(YM0>e:7(0"Ys^/UP?PFqMV5p%gM^'&EU8VRVa&mk$e95I.l*%7KiGk(MV071.ruub=V"#r1Wk"*Bq]b+F"f82\Ko%F')0"Q>b3CNiE;Z@WqUuS""t1Re<X?0j=L?D[rh\U%2gFUar0SS4Z>Cn#T)CSs6L(&0RHf6!<uSP%7EsT.2@%1f)Kb8]gqON*L`;2kgnPYjgD-iQ>NnDjmgHY=Dp*lYlYdjOE_RP>Ma=r?TnAD?0u.k8AR0:m#jeC`>I9r:'HK`8("iJba#^=q<of+(;-BOa(m3u(7j9"+M9UALHeZ3PID`IWM4P]jW5_kY=`;RI95?LgOHUd-@Y;-o<>9SfT;IUkUb'LA5[7D1do?S@rfUp63<f(;EmSBD<Lb4/K<2Z4X-6YBfr<n(FR+ecVAaqVi*$Z6uL\K0/n$KSU+q%b$_\9-$Agt1)`0-h/7T9TsQX-]H);_Scq8<-fD6d69TLijU7W-cMmMS@*uDPq`0C._LMm!P_IZZWS`'*b*)TRh4fKEIS'h[QqJVWLC+)mSPl49Pc&98:gL89g,L39qh)2QD?t_7]q=rRFMP'-RHNVl@'q6:=<NG:4X>A[jk6d+>-.9\mDJ+=)b@mpVr:+h0%sO0RY;bUq/%A1\ku"U[1j@5Xu4O\C\mF#e*MI_8s'^Obpi38YXJ((Q<^Tg`YGo*GPE^ZA$]tBP+$Isa^JC.jBD0f[E;+IfK3u2W>&r1a,FIX.S<s/ns)icS?iX/UGc<DE3rM6_Dee&'@(o35(*;$_o')nhS-gcUh5YW`h)G<[rRC^Wa)Tf&MhOSN"BGD'_r\:aARCJ@:7f),OI<M5d%(T<jWj6.%D%2!0%t+Bn7Rtp99M.*<Z%iCoE`jq3B@V>.8(_p)*lj#N)343VAO4[`u4#l6B_[gC+82DGsW60SoMnY1b>3>r7O3^LA=Y:i\L!"A4OJ1TU[P(s8s;2%42d>,07$&>_SKH=ukc.83eOGb0!$8i's2U.#K5eL<j]rL2Pbg/(qQ!G,)PG%-FqE>F,N@<"qGRrh)R&^51_ih8K@l&4N%LQsrCn<((*QQ[:GF/TImA=9GL2>,VoTM-Wt.2gUN`7$n(Lo)9pYK5&-cd0eU0e0gH]]PY%9f>!FQ!CeD5+IE,-*<+G,p;CE)bc;d;G'._RMo53q]T+/$3R-jS8l;3dU>!uTq]]#cB2Fa[@9d!;Qm?:[e<s'm.^Lgon`)ciTh8Q5><):"N!u^Z'UDleNj7&&.dMu@[a]48qd_XLk\JK](1UVh5SV%Jt`g@S1HUNC'A)bUV6jQjeS=tW_+$MQ:A`[LNnC'jmJtgq;d`U>]FC6L.QX4(6-pYLTJ'bNhQMQS"ot&=a4APdFCSiPdcF$.[YI"O2Ju@^3K::d^@=hNO?u;^@F6BY__B*EAK;qJs?j5DU=@?[jA"b]R3J0T33k1j\Age1afJ%)8b(NRg.]1+bClT0*')rFdl`2^!C9PRV]V]--6kBTgcRU.L;6V$c;GpSOq-b7;HDjWF;VDn%"j+jmj>oTi7sohN@A13QN8<3@.dQa>D<OX3;d2.aI3n^g#Em]G;r)*-Vs2o\PTq5p_EU$dP8BSJp>G1;^V>p3^GMjao3l]7'C[J<ri/5ALIa4TF(cM8)k(oahl]USn:cDdf@[p%`:*'n]EPa+3Y#Om-UrhpW<#@OFYU5&\Y&RcR_g$H!?)6"*qf<tKTPC&ip6Qobc`?>_[6%7asKlLt(]Z]bi!&Kgj8kNJJMJL,Zt]_T8J$qh[^))Y_/01;!MJ;/!H;2/7`SL$/E)&DE@[&r:!/Gou8RkPrZN=$&>/;V3![PDc3$7[hbi9<RUATOO7#S8'T`D!Df`snK#X0:#pilI<fcGaH5eeUM_$O#P5hQ@\:_E"tbFK81IF(hTodqYTeeqTQ9N`U65[c0f#pYILILEfphT*;"S]Yhh]hULmV('u>=<q]4[7Ll6qZ('/iN0,#Yi@I8rk_\@fNCgFjoZm/.j]G*;13b[Zb%a>JSN);EXFnk[j.Ph]8p*EVm;Dn[r1&\6U.40)d.7W,=#QL%#0t9D!q!78h1KXh)VflO?_._fmTL/>_i;rcr/Le4/Z5\RXb3k0U,!\#N<Di?qIm&U13.q7b#'saFiu,)//ldkM`i'V[B#NP!iVl,X3X'b0"3l#P?HLl[<9Z(0;%R!%ut2.'BUSBQuhB&Y,ul+CAc5nJ@8u-7fMr$cKW2M/7qC:5<dlsG=8bsVP>7BK7t,&^N(:=A+#-0<5@[6[)d(K-'Ohm-q6S]O)6e/^6\u#YGLZ.=VNj8`rJ>_LOsadcb.6Xk#4W5-`RSk>#r[HDD3roT.fE.cQ?7NOSH",LHj(VQMn=@ofr'#_u9~>
+endstream
+endobj
+402 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 401 0 R
+/Annots 403 0 R
+>>
+endobj
+403 0 obj
+[
+404 0 R
+405 0 R
+406 0 R
+]
+endobj
+404 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 188.38 669.866 233.94 659.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 225 0 R
+/H /I
+>>
+endobj
+405 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 477.8 669.866 523.36 659.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 227 0 R
+/H /I
+>>
+endobj
+406 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 256.97 658.866 302.53 648.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 398 0 R
+/H /I
+>>
+endobj
+407 0 obj
+<< /Length 605 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GatU0_2b!=&A@6WHq^?=CP0Ih@lE(A>A^48U$X#WK9qtD.U["\<rMoac*ACbE2pG;4>RM_2`'5(Mt[`%;2,B,WWb]/"[s\!'_*H=E?[)2F&Xu0^SE;bTpq"&&6Q)^Io<E#V=`KK/+eLPc[dT6Pao9R*\m0F[i$M;cXl?8P.a[MW]\C(]>hgrK;s$o%e62I2M0eb#l\LeMWePICa5)pT_P4Pn(6G_Y]^5DY,hRlkX!:^[%!srQ_e`jeVU8OcD(/pBtZBHXP6q=9kim:nONa`3ba4HI4[%`#gduISM"QNhWpqW*X)M`H9J]^O@F1YW5oRV8+`[EALSC:Wd"L9@?]c:5J7fP).Q!@`i&Y-We5R81Hm[%XdUBm6A2=M**R8%,B01TDHZY5f2an6.K-oi'E;I\Wl\3]5j6D#>lcS2_Wc@N[rd&M)=+!Vk-qWtmDtH(LJqc&!KX^qFTW;Q0#;9nTXK+#>oJ/ur*3VQq"Y;kK<ZW^N!2V5KSJX6YJH$-kP\)kF.<Dp,VUMfKO)2g&n[/a>8/EW!@B<VjRr#7U5Umg"^:>A=:&[P:plSMcQOYX^4.Y"ep]-1^r227d*'Tl[NCCG5LtEKrr~>
+endstream
+endobj
+408 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 407 0 R
+/Annots 409 0 R
+>>
+endobj
+409 0 obj
+[
+410 0 R
+]
+endobj
+410 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 453.91 680.866 499.47 670.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 205 0 R
+/H /I
+>>
+endobj
+411 0 obj
+<< /Length 606 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GasbW9oIa[&;KZL'k0rK[&TqsZaVdY_No(B[dFBR4XdV!LcUiaS3m4'a3J9S2X++ed>Z($Y9(CR:sRqRAq\3hO`ENnA2iP%_8f+o+IB?bnjQ0n"'J,j2(*;U`aC%&>CKjE,a'<SfuBLR44tKRc,gVJ5==UeE-CYsl!!^bdla>jd^@jL*u\-[*=oaG6K[Jhg@+_r"H>NWhb&T#Q/7s!=!=h/4fdi11R^"(UkH5uH''@m-kp/glc7bF89k.+noFf;&34=t\:/4!)#<Ls9*fXAqt#%N;WV5Zo,7Q4*tQ9YX]B%Le3J.KAC*3RR`.S?#h7,>jcB-p+o_IcGD.6hd5q6HfV>WG+m8LCpeEnEf/3N;RaD8Ap&Mp)>IbE!ZE3@'=QkHhNkM<mH#3s6>m(^%I41VcIbbZ"cDH"rZNMqs$gG0-3eTlOhP-rcCUhnhN@I!d?S8"8o:B<'>0s"bc>u9`pihk>0go7P?I5'-5P55^J>aup4dlQC\8rGA`.PCe<C6tZA1:5DF>&b,"CpsZ9`hiqB+uk@!sdm>h-i(P$%OrG01b`;P>*?/Kf#&iWo&5!g<\(QW*2F,*Fb@k3>iU!]D5FOrW372,fp~>
+endstream
+endobj
+412 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 411 0 R
+/Annots 413 0 R
+>>
+endobj
+413 0 obj
+[
+414 0 R
+415 0 R
+]
+endobj
+414 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 280.02 691.866 325.58 681.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 227 0 R
+/H /I
+>>
+endobj
+415 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 147.0 669.866 192.56 659.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 227 0 R
+/H /I
+>>
+endobj
+416 0 obj
+<< /Length 1148 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gasaod;mr%&:Ml+pp$6\^,B@=qF1`BPEIAYHJ5pYl,-s`=G&.ZZ5h$E=-2M.R#B]-05)Z6c^m9idVX1#cc7kuLLCm-l`2Gd>fB"iIW:JC>qCuT@6>A1=V^jZ(FS0an32[Q2t:dKDjB0P/iHt>ZLrA01W\ui[Np[(kA7>i`lCcJRj<r!1M*D%)rC=Q;lZD9<p*Z_#gV.erP5Ou[*j]1GiDbYU<0MJk]KCIn%?6$I.QC?FQ!H.f4(L_-WB]S%r^,L15-649<Kk9Sr\8.]nT<Y-!++8Kpjn?l-Rm6;$nGkokl9Z%9[VkR"HJ5KIUC'.hc;s*)sbOV?<oe)3NtU6;e2ui=/Ib((+YF6,iSm!\R,S\R[0V+3Ta^C2BjYoTBVi,\&\#A8GLlH/3uhf%P4fZX?GCC!]?Y57-1jT[.cRU/_cMP:/-$lHiDqUoFel@dX^=M*EnTV*nXDdPtUc)J1'0A';bY3g.4T@p04N8^bmU^5!W*$(s+tc.#;=C\;\,ph$8'L"a>"%*P,3.;Fk8rC]Vtr_M75Mn6N1V9l/^We@a]'FSZ75\ZG8Sc!N%k[Eh9T&j0/>?76"WCUIc7g+$3\R(t@VPQRpT9\&naNc#3d-(^LnrfR5>1d&VHQ^@8g[+YQ9)E)OV(^LRL@<N`dO4lDPWjnNkq0`#Amn=dS7@(!g9Lb"I0U=l,di'<p:#9>-t*:1%5%U+b6bd:6KM[34.XQ"gF]Yoe8"RF+rTq'P>QC=KiU'q]/0R4n$R^u;%i%>4ln]U+Gj>RCNLNWko,.2-,F!.%-_%`Nk;=WkkLWmQ@pX@Jgi?+CEpF\FSsteF1lMFAkB:CBsrGY,K*)%gtgL(XM&KsCm8CeWmf&[J'W]VIB7Rd$9GU1nrY>>"Z3`ggB@PKU1Bd?MX2GRT2*ejZ*a/*LW,mb#C2eOg%(38Bm*V7^(bjL++F+I8()qt(L7J4eSp)%Ruq>OW$d`;XX*Uj\QHCC6,_ueK:?p3Ng=`&M%=E]DKatVOQYfeBH3&QkqeFAO&Nf+O:I%`'_hLMn&#P%Z88sbceZ2)]X]<P-qoY61cV]]7DhccqGEWuYF"Ruqs8G9_Z<9uk_48K%b#BE]M9L=c<GfJ1X?cTUZ;)e`bs=f-)'gl_0'_noCE.-/A(`f:.NK&~>
+endstream
+endobj
+417 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 416 0 R
+>>
+endobj
+418 0 obj
+<< /Length 4878 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb"/+=`5ND&q9SY&FqXYU.ufsCTppVBBHFhM64m9OQ<)eENFm@oq^+VO8%7EZ-Oo*aef;GC_k(r=H)IDYJ+n:Fck1qiop8tE#(J%D"7&:S_YB51Dg&^Ak<&6ET24_3a6E5^V93OSc(`V]W("V7_Y'\"!PjX0SgY#6b.Q3n*bEQh8&ct,`IpQ4.^_VWlMhMG>lQJoY&?AFuBk:(]Np`L4A81h_"XFA,%8c;&hT)aEe7K3fh/sjLQbK=d=L!0]\!Mgi2DdA%5t4\5A1]lco7ir*NNl^B7Au"QEQjS<V^UG6@EQ5p+rp`?n*Ihr$`UIcBH00CS(*bF]97n'I\%SLZ7:Q#1c&5+gk"B"QU_iPHK3r<m$)m!qL=Bcm%rEV.:Ko8L#F+(e"o8KE'S;4,jo\t+P+kCcDkYaN$sm'57(m.TY@UQ\-E>Md^&QdoT=f6.(hik'Vf\)A7C?<Y*Q(:SI85B*?q+&M<I`]CeDY]Z4r%u3q!3te\M">du(8-L.,!"aiZQqfI)'bT!>Cj1BMmWC0OJekd[fjIGV+S#Mo7SXk+OR3_og#$,OI/iS<*ES+L9Vi4TQr3s@r,rj#SfQEX&TRI`=2Rs''kZ+)GY7N,^gKb0dl_tGnkL"e]Nj^2;Ij4YG=$p2'nF@-5TDh9"k??Y;*A:J<F5%g$%To]#E-O86/L`kE/GVf36j23c.mMKk5$_-Y/QT*F:\sb(]:EuAED8?,*\4@J#o^9dnBHET@2kOD"clcaaqLq%lfac_5'[H&!ZY#r?V&i4E**Uil_Glj8bYP<Qq&X"/k_*r/3\CPm94)cC[C/OdH>as)b(4g#N4KVre'Pf@Lg'hOZAg:>c@k'>KIGCe*L!-=5T&5:h](HtO%nrA8U=2Z%C\b*(IcZi`5&\q<8/"&GZaSHL#C_S8Ei5m;e]!s$7W5Lfl.%]3/m4C@P@2X+JOe+'9u_YjML_41QljT-J1S1qD0gF4>\\%L/ZUo;-=jPgA".KGUgc5:q-$+&RC.=*s#h=>-^dfh$()JjtF@'HI-:jE$HRH#/s;4gs6MOn*Ql>\sS=;m)\Si\@9g/_]b%T@;l.icJ']_h/"p&?&57OCNjU/L-SU/rt.m,W_YP:qA<%rcfeqTD9$jf94/UEMT\22ki`?_-)3+<%bm2cWtp.Q/4OUnfJ(doOH..*>k.:YX)?bQ\Y=U_q2L]m#0]YTL*+ZTSM=i9P4&pReaboq8m"@Rh7F*8b.+"X*AqYBC"25jp`q779)dKin^]=Fk^/YbD11GlV6GnHBF8TiFK;L\-;=JdsM[?7Z@lIj,Zp`4%`#@%P!%LE6>_Ce"SYOSLsL4>ROnnj*'LJNp2K)4M][8hMXrJ`?F1a_7EYGpO$Gs,<;?3,o+$):0'f+fmQ^eLs[GcV&sVNu@7%V5kX,fXHl8\\fU=J2JlCg3+=7B!3;\WcpK47.DjYdPg$>J[X6EYW1@Q,61=#UnJi;BY_$5M!&8FY&p@(_A2GshdH^VC+W$<Ta#K[HT""O:dMOILaa$M\l_R%Kpg#=T(,8rGu=4NPI"tp]cuH]f]u_E&um@&i@tdRe5DXS"$kd*^2Lio;[b6EY66>VpeGY0U&kmO!!ph*]VjF3,+>acFn8O`'m:5Mg/S.d\eG6K+])WD'C?JGdAkQjH3CTn:tX6mnrV#(Y%+`nHTf=<okp$JZV!/F.C-/leBZ[/.2?d$n0j`;g?ISbSc<]N9>9LL?&(cK(Y3'#)e.-Zao_WSEf%bUl4jog9E(>tp1%67#E"1SQ?[HH%]+68eo_f`Z6W6o!9,-SbU]#qOrhX'n^KpSofA\]#`bfI'VY^saM6YPqI,prI*K!_DVsq-bQ!Rr-BI[=:U@?i6M6>H]K/FAeJl6WF.;`XL#?\hM>-$/X(?OkC<s0&5]>r<@e!4*c,jL[Z,6ts<<+6#m#qXf*ak@DXWlV)Bf8J>S^)Mho*PP$)r'1p'=/XFfGk?+[$@AHbS$kY;K#ZPXf)4f*WSOQ#gd2qSKd'=QLCk0^H5D"f8#U;KfSa/;$#__:0Ckt:\*le&`;V9[4]ULGHYl6'5V).G'nos'nFA``$qYJn0Ha`&[@nQ[HSP0D:14PYVMN90`h?55ObOap54[gL\$_9j.FBc)`pkAN;YU+]!0hG%9cVqO#gU5P$K,J]TF"=a*Ws?bmM1,C`5CU+*^dKm<-H5Y)<+o7ear]nnDGo4lB'O4UA@>GLS?SikJjkCq7RK:UE<4+[:;52-AiJc[N`(W7Ub79?qD>Zqr"p/5H)AmQ)od#HZ(T"p/jjp%4)../KZ20dJ8D"dBqLN`A=n"pk.J8Kp:tY(20LB"KIth>SYNQ9c3gfW#J,=Hf$27A<t0lmBhtMO<bBZD`XlZ-ao;"M.=@%CSa4C'"CYMg6(K>=D4dn%1!HYQ@\Y?pt5AntOqY3hBaa%D.%J,+5TqI=1KDhH6)s_I@MupB$\6IDfR7D*1n<'[IL-cNWq360jqFAXcE&SY'F'`5B6_LXBECqheJI5h[04\tSJq5$UVKa"t&sWgSfkU_*3:0+TaJG9jpcf"/@aPa:0,r"2h1S$kQBEcD(k]<8M#'nZ^lgAW*^5\GiF^lL.<$m"55;?\36U*tshG=DroSG6e5&Q+\>5Y3><:e4>gC<KF_6("`X;:_6`GlS+ta,?iUpPOdu$,jfZN[_p^L7g"R(fCBj]\',Q75o"NBr?cSB)3NkMCOKp:UI:kGuAnfLh"i6RHE0O,+`HC4l:&@H4%<eSXOK$U_Zir*XX>TEC+8'[8Y!WG.H[\EtQBYLT2$-qLOJIMD8JI0Le0PO,]At*^9Q1&+<$<_[!=d?k7aP4b/I/.3gin>WJ/(!ISrW>dI.5s0c%am@$@<KLE]g4'r2gYF"k`G.XV'#'s=fnK_j7=A5:,?r7(MnkB0.]V5mD3(D@H,+_k`Q"Sg1?%OR820$L!W?f6\Vjd*l;bVO,`,l$Jok6:c_i--YZ'^!/\F#u-R^+C-M`q'E#p,nA1r5mR`Y88l_m`iTCuO&o]\Tdd:7'k.D`7F*^jd\D$JnCQlqb%T![$SEla,i&??OU'df,b"]S.Wu#OHbC/I$Ms5=:\?/kOrUBYG+a;Hb^jKXKXSlC<9a4K!$B@1-S%',Z\-!(;9?n(tm>S7LA),.cL"^B?$f,U-FHe"lQZ-D0a0d-MGYbn'_i]][[pC(=CqeHfqZhe@g&kDuf,I+k9#F(+"d20Z[pT/QP:g[c.s*CCQ]^F!T0:9_Nn39Noc+fPndlU/33*d-;(':s'ODOI*ZHV3p&=i;Q!._sg739XWaTDA&o@V,H+U0)j!Vk"2l4Gp,j%bU/G2\:ef26S'Znj-oPg(4q%nKp;llL$BhDn;.L\**gH8_GR;Xr"YBQB)1'>S9U;G/c.kU_lA(1RJ?l:(Nu;I=h$4X)64ZjD,/*c[!M<V;e3W)O]*1:";^mSAr7V\CKHITt%t"nTCeqdShLcg"pG7XWHKt\VWH&e;OB[V6iG0CX86f$\6;(cr9<G&Qbi>8MR\s3&\G\'gR(=;0#"7A\kZP6nG1;*6HDc=O"s")@O?9j36^cR;YVI#f^A*I#9;-Hub*7]iB;cGD`<TNt6u/.WM#B#.gA\;%M>h+H#V((\?]LXbS/[KSOY<#-Kh`H:T55!:#_R$SZhH<Y83ZPm%et0G<!:M*4KU0D\2#]8&9q>=Ep1U2FC8?*U%,KLMis%2MqD,2ZX&o=\k\]coU`"DkLE@0.u2_5&be;?;T$HVK,q;!er/e`*@T<>*Zu.>J*XA%jk>!6g.2AMFL;7=5=$p.&uWO.\D57dh5P]HlD.r@E3eMMS/8s,&Y);O5j[9(6dZ[9]:3+!OF%)rT0d,"p_JM-Z`.pStp3/e5jSM;R2m(C0<])sdGKVm!_=0%RG"qIgtd%mB9t5@j)>/kLLl4EA)'YgA]P\%"ScD`0McKL&H3E*l:_@+_QX[/Xsm*pOlp6XJpLlfsUjs#2L5Ph6_mN7RE!PDCB)k1;1]XZl.b1!9/?0DVn'9&9#9$!OEl]'3qR<K\/hjEcYYP3itr>@VkW!X;:A2gNDYQ/hrgXj?3);sb82eVO`0$!Pu]:Z^5mV=NAD."9FX0R8#NSK]9TgPaCokl%n1'FB7FmY1Qu)J!N*)&>?;YPD)e:tfDl^.;ERh[s>TU&#"RHapriDqhp.gSB[&Ysn0Oi`@CoAL`#'X<4[YgtH/o#?e/$7t-;GD6nM#YW04&8,ucM,bZ90lk2(roCD6M^Iq+*Rk-3HfGR?9!Wiq$!J[,FOi'TEhe;oWO^]Xl^5oP:[.HX_o/D7sdj>^R$_/0!_aLL#p@Xn4YQhg^3Jg2R0;nQrY>9X14(n6T`rn]\[(B.nJ%s0n`<m'E(;"ul<r$0>'3nhXIO:F2h-@,/(O#s^dC$l"G,pB8B^UVq#)cu8_d``Zf%#it!8e6h'bSdkm:j-Y"Bh+lb9))6<*i8BqDA+,f1lot]rf(QB)3SMU!UYW=N>#hZ;eR&C-^l;9t!tgA@722.&NpI4Acr!Z]sP*eql?1Z<'FFIl93[,\1>`Xpj^.;L,PE(>Eir'G4Ets&9H`HYX5H\5PFpXi(_#qubhppld$R#Qg7(*UXGI)]okCJ!%p1#C/SF,c=n>?HNAmmDP8PTNn8hYM=*p4D@gs<NbpB:TG%*?BBc4&:=GlH-+3'E942PpC=)IL>1eLgRGpeOBaG4+&_;^km)%A?3fF"CZkBXagE`qV$;Ulf^TCd<<+3rXr*T.qW,(`6psOoBQ*NUrVS'\=@Z-)\mO2JoFcPm?t.7/BTa#20I/n.F[uL4"+9[t\O7InmrS14XfX3Q\l4jtC/b^$SH'8:nL+#fV;KrC9tX^Yo\,(bcO=dR&[RIaGohm[oqo&Z/0doJ10ZpJR7Pt+;NUbJ?2aA3SO<_ll@8^qba8>0kd\>G~>
+endstream
+endobj
+419 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 418 0 R
+/Annots 420 0 R
+>>
+endobj
+420 0 obj
+[
+421 0 R
+422 0 R
+423 0 R
+424 0 R
+425 0 R
+426 0 R
+427 0 R
+428 0 R
+429 0 R
+430 0 R
+431 0 R
+432 0 R
+433 0 R
+434 0 R
+435 0 R
+436 0 R
+437 0 R
+438 0 R
+439 0 R
+]
+endobj
+421 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 482.78 665.894 531.58 655.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://www.w3.org/TR/2004/REC-xml-20040204)
+/S /URI >>
+/H /I
+>>
+endobj
+422 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 192.0 654.894 375.3 644.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://www.w3.org/TR/2004/REC-xml-20040204)
+/S /URI >>
+/H /I
+>>
+endobj
+423 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 289.22 627.894 454.12 617.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://www.w3.org/TR/2004/REC-xml-infoset-20040204/)
+/S /URI >>
+/H /I
+>>
+endobj
+424 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 354.19 589.894 445.75 579.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://www.w3.org/TR/1999/REC-xml-names-19990114)
+/S /URI >>
+/H /I
+>>
+endobj
+425 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 239.77 551.894 483.82 541.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc2119.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+426 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 453.35 524.894 531.32 514.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc2518.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+427 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 192.0 513.894 350.31 503.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc2518.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+428 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 243.92 486.894 415.19 476.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc2616.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+429 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 311.15 459.894 508.54 449.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc2617.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+430 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 192.0 448.894 251.44 438.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc2617.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+431 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 358.38 432.894 442.17 422.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc3023.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+432 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 450.87 405.894 501.89 395.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc3253.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+433 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 192.0 394.894 289.21 384.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc3253.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+434 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 237.82 367.894 432.73 357.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc3530.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+435 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 241.43 351.894 432.15 341.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc3629.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+436 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 331.43 293.922 514.09 283.922 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc2251.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+437 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 293.11 266.922 397.74 256.922 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc2255.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+438 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 296.16 250.922 447.71 240.922 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://www.unicode.org/versions/Unicode4.0.0/)
+/S /URI >>
+/H /I
+>>
+endobj
+439 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 192.0 228.922 267.28 218.922 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (urn:isbn:0321185781)
+/S /URI >>
+/H /I
+>>
+endobj
+440 0 obj
+<< /Length 1522 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GatU4>Ap!%'RnB3@+?(*$F=g4\lpu^`ei2F;FN%jMrHo3R+Q(,+M`gXouHM%f4KPA^p5.QjtLj/hgFV(r8CrZH>@<75ZmVa0!Mdu+<#u!U=g5k2Kf[@QKE%lVqD-r2;Q1fjKlVso5a@;4B&S8roa9`H!$r[DTe6LOa-=4(Z+bM.#H(p9cD\/%!`KR[WCiJk5>TmR2WngY7;VaPt.-M,(0#2NX&hI0s<\f)G+$Kj^BBi"RG.r.aIX82-YCMe[uJVo/KIqJr*G`-Ya<79`-Iq1-a\f0]$uu>Q2R>NJhX1\.kES(Pe_<c0s8?^POZ>Jo4p$a?L`eGQa:)LPIEV?_ah5FR=&//k.07Y,,k.>!#3hW/[<j#Z$Mjf@2(kpZ(+bR`o@Lf!X(92YOlUTRA__+bHM_RB4g*q_,P;m!6[If-ocs0#/^G?d6TB,*n&kD;49b`['M?9TdlY\=.n.AqiC/)2ocg4pH(LGB89*`<0&i5%Sg'LX";mrIak5-RgI.,+B#,H-;tG:JsS/Em,+a3q+HUGo>-tO6Zpb>^&kSO=''QIn(6B/o)r,7,]bTe)7u4RN.(G#l_CW`059D_[XR&e@L6;SjSb=Y2D=Uplhn-_5@HS0k?<9c;]:EX-VaIStfg/pIp2_7sQ#:2)0hj`G,,;:gepXa2F"*@%D%p"B"=%U.F58oV1<q7AFFo=#:=gd9q+EBPeI<Ofj`\&ArK!;33CDJfMbeYT1RqN:>kjkD9]`qtBfqc.UW`POk-%:!%0$2BbBj7?1]+ik)AA+e=@?/-T2-H+M2k/`/`ZVOc]sF-*.^<7G,gU.h8)OHg#aPmWY=M]gr35eh(_Mg9V,7k)DrZu*]DNg__`RaC1Y)s&&V7EFEe5_LgQrKb/D4R^8]ISrS\<>]Kjl:6M`/1/:&D*9WBQq`[CW5OGk>L^0O5Rh=-@YsOT=0q@#i%QEOgQ2Ot.L",aD*8UnC*B[W0o#a)#HeEW*<`OtAQbIg4R@4HF.flp,&PL9,\?Qk,A)/_M*OrD,H@]A_Z:jQPq3fQMH-HG;/IVZ\n[a-N<M9_;f6b`HRUe>kG$3!TY(nJ+YSF0aspdPPr8m'2__NPX:q*fL_a@Y9p.8j>QsO#s/.\Y8dW?A</%h$iJ33Sjhb5\-:B_W=Rsk;8dON(H<*d#0Z:B$99MV"%l)4Q>>NHM@RK6TFRL[M\%p09c(#WR3&#GohG<0E!(n6?CINiQ[!+=$]CSu]WJd.<c*]_m<q+13o8el!8pWg/A>lBLJ;ZHiZ5N@+o.s!F!R]Hq;V\Y)rM9?'o&RLW!kql3J<#CbETpOPJmDn-;EIK/]_\-*Y6J_K*/f0tjF*D.A[\;$irdXpFKJ=[;8+P>^uHhnBfqW_fHm(GK.Pm:)Hm[^,[]rSj6a6nh-h7aX?(oA"UEYo7[u6=Q>'/g5`#rVK/U@9KcGW"`9:T,qa?-ME?4Z<<k'grbEO)M2fHX=@BO[Zg"4YJ69btaT00'neV+"..f556X.CC1[;[4"63>\%%[U6UhSoMEd./4~>
+endstream
+endobj
+441 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 440 0 R
+/Annots 442 0 R
+>>
+endobj
+442 0 obj
+[
+443 0 R
+444 0 R
+445 0 R
+446 0 R
+447 0 R
+448 0 R
+449 0 R
+450 0 R
+451 0 R
+]
+endobj
+443 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 327.8 680.866 373.36 670.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 227 0 R
+/H /I
+>>
+endobj
+444 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 165.12 659.866 202.62 649.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 19 0 R
+/H /I
+>>
+endobj
+445 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 195.12 515.406 232.62 505.406 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 45 0 R
+/H /I
+>>
+endobj
+446 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 220.39 420.246 257.89 410.246 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 55 0 R
+/H /I
+>>
+endobj
+447 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 202.33 399.246 247.33 389.246 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 57 0 R
+/H /I
+>>
+endobj
+448 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 200.67 353.386 245.67 343.386 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 63 0 R
+/H /I
+>>
+endobj
+449 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 270.1 307.526 315.1 297.526 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 65 0 R
+/H /I
+>>
+endobj
+450 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 278.97 202.506 323.97 192.506 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 69 0 R
+/H /I
+>>
+endobj
+451 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 189.0 156.646 234.0 146.646 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 73 0 R
+/H /I
+>>
+endobj
+452 0 obj
+<< /Length 1346 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm<;/`4!&:Vs/TPmRDk1F6RfrAeOVU!*DEfG*?X6P'C"KrhF$ngIR;r*N'/9Y."G9'MT86/i9^>54Qk*rW*St3R,'b9cLF(WTOcWQeNa2:.$L^;VBa+4n:[WXi1^7@?'kc(,:9j):C=[25;cHAglbPCs0kKXlVp0PX6Hl#6lK\4->ptbS[oPXMFVCggZdgsp>qq3'''HR;Fm3p`c8`k/a`3ihY_@%T]gkrSca!1d#0OdI5%c?qL$P84=#cp9@e:[0V,Db[u9Co?3SaQI)4@qJOAd7i0&A*"a1<qs`F+s<Fc/_KGDdc'W"Al^o$^j5?_i"ZmG*]Q0YD5=J"b_&2?lj*O%-0gl":2W+C&TC$["gN24I*3N9(-YM[Sm"LP]^*f\d1TS#3)!8hgUBFbUmC+QYB?q7:,5fpR6m7Q2+s?Q9t<gn;%>jVd)7LJ^b3]oA5V%A-8o1!XN!I/LWG"LR.OQD</:^:LWeBA)No>O(1]782dPkM`c@#]%$%kiU44Z(AfOZlGj#0\h>#A6MF>0Mc.+q=;Rm"Ir3Y40&3mUXt8@=*5-iuGa`CXTbIkPKQ]tqh@7=/(iXh<O5(h1km-/"bNCj"`[&n2kWWHseKV/T?)OUJjt-g)DVh07ebhlOj+[#X,QN=dL2Sa!IPIL5rMV4QLNV?$Jua]5angK&/u.@RhO0,8ji51!LR'.mf1-imG&j!5m:kLO@'Zpp*!WaGR%"dm[e'A*@`ghV]ormKN=7!'OYV@&Yn<frK_CFT_VNUjV+>XlRf[r-,dQ_-PFEc"b9GCCEPBd1dsofG:@j`W\Wc\bZ)C,\4QI(%hOTZnDW7nh@DMb`,9orD=7+0\[W3a+]@!A)Ha"k4gG4o_o*`6J'MRVZY]kj=TItIrT.YI)3#m"(a04PB77+J]?ES31k_F;E3;pK=AQ%TIoO,BMOA6L6eiWOQRlK^90rYfJ6hF'm-C!NQamL#o''goPAiNTql$&@g+Ej/?`-,T0O6rWggC(a[oiaf)@2&QLG%t[S\q/,8lUP*h`DR^Q%0DP<KPra8&5IekdBl8-$IKeg4!a=34.2f;&Vnh[?r!("jFl;&[9IK,S"d!r\haWFpVF<dAXuj:WjHQ1c3Af/?Xi^S.@jT&l+a!%M%@GE*tF1C#@L_X08_fEgQfI-l2@drZVd/\Jd/:YH),/kTP$[Nf;>.-=jLFJF*2D]K9[!pRQTB^BEOk_L/3J#K!Ue"q-?2D*&OC6j#g9W8[F!k4G3\RG2*srW95naSL?s]KY&bjA9,Ate2H-6/'^Cgj#8/.jHE@s:()'p*=$1Y/:XZ_TfPCN\Eia7gp$]f]#$+hbs,S/2jqt:rW?/1D(k~>
+endstream
+endobj
+453 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 452 0 R
+/Annots 454 0 R
+>>
+endobj
+454 0 obj
+[
+455 0 R
+456 0 R
+457 0 R
+458 0 R
+459 0 R
+460 0 R
+]
+endobj
+455 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 236.77 531.38 281.77 521.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 85 0 R
+/H /I
+>>
+endobj
+456 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 242.32 396.78 287.32 386.78 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 100 0 R
+/H /I
+>>
+endobj
+457 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 270.1 350.92 315.1 340.92 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 102 0 R
+/H /I
+>>
+endobj
+458 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 267.62 305.06 305.12 295.06 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 110 0 R
+/H /I
+>>
+endobj
+459 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 225.4 249.34 277.9 239.34 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 130 0 R
+/H /I
+>>
+endobj
+460 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 158.19 95.02 195.69 85.02 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 140 0 R
+/H /I
+>>
+endobj
+461 0 obj
+<< /Length 795 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat%!gPun$(r#/^C:kDu\oVc$0cFRGdE%'DUW+j3;+oT13%&@M.Z"[SB)l//".6X`r29#\:[Qo8G;U\^Z(VW$<R1l14U9X1Er^3V%+tn1#=KH>[pD4eI$i,)[o"4U6bDlm-qf>,Q/jJFBlbcH@EjMSO)D_HmXk`U^#'>>&d33Y#qKkW_bZ^bnS8S!*GbZ7M<BgJ8[6^h\ZVm\3@cRR_c*/s>grj%qNZk=!u/=^/Ii=#WF,i8fq`XEqL%*5i<Tr44[TW`e6-!Uf8L'6;-_1\^Z`<CCSh'+f.:2Zq?&lo;8-3*btSKuoXfHu$F7"a5)-mBIEmmgVKF:>C4>*AIZpTb:0%\)NFT:>$^E,tc(4J\%(Deg^IuiT'hP)29/Hb`G;I\1EmHA9).+F`e#_/4_J#BQ,$*cV-@'H=lsbda%:d)'EQ)!,l7$1jaq]Gho;B3Ek00c41lN\#$q^2\2^>@%-F7u.*i4AukQ_&ASan,%ea_M_.:8O06OCt)0S(9*6)51.;/(":>+^R;"9r0[gqhh9Hp57^7AFoY!s8!=S%d!10<*;33fK&ffKOjsgS`=^0@$K_9AQQsG=4Vlmj5/?Q'BNgT83/Wk]U$5$["c&YGT.N(NtRcg=J3H[G(#fh/k2Rh4So`ORL@Wa)rC(I:.K^hrNgloHVA#?*""1>iMbSQ!do5U0t)k#!jC@J2O*;A`2:NIuns!agGR8KH!NnH#mKujjSC&H_tLuUH1U0jnf:aO+QLe=tMU,;+914`[5NkZ$[h!q`0)cas'*!clO7:9I<X*0.q)VW;~>
+endstream
+endobj
+462 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 461 0 R
+>>
+endobj
+463 0 obj
+<< /Length 3412 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GauI;D/\/g'$&nm;s7coCilBs;UXQDJEsd`/e@Y&DAL37?RRgr#jYSq=\eD!rR!N;%;AEU`l=]#?o^SprkmViI$"#8I.E=OM+;#>nA^M:JbO7Q]KlB>?4r.aOs'?f`4YVupW)MGs3*R&5p3m+rLH0#mbNfeOKPdjH2UuCS*NpO]G37%`1*sMq83VGr]IkCX-^IOhY>F'1[e+Xr,:O%ogl=W7JW(Jr*UuH"6ISu)-$30c=Z0b0n3rPWqD+ha6'_mp<21W"nX8L=&]*#bW1bbbaZqf?i&#984iXc\7C8DbBsfbLdE#^'W^QA/?arOJqJ7(T8Ug4F8;hf\WCgZA!=i*D"7o]YP@"uU4WA/Q5/n(1?"-[b9)!>4kR]pDn`_1CX>oVSCd7fgO3/\c&+s7V]\1B,E2H2d/J:grGE%<PqNrd>shmUT-(R#>V'X,[:p'5qGt?%2dV'tT*1hY2Q:unEUh1!U)PIFe][9;^[QM#+>6"qf=`7Q@Ls:DGrdNX7IqDD^Kf:MM^?+2(ei(t?'R3]+D;%jl%gSaO6A5K_dqJO-p?a3RRKCB5/RfYi$da:@Zo?):`D(:&mii+)L@RUGE/B]]mrj@!'d'THsX!:Y_4GP9piMrTB29Or\'^A>lFD9d6!2n.-;16,&f6>l=.%5"-k`1;:%_0%JlD2\?)S^n6l'2D?2eJHE-b(*jasUb,Z&+GYadl@0?\MW-\q"=VHDC@CP6WR^6R`j-+%SM9s(jMfMt:??tI4T"S1db#(;W1Q?o_1f:q&0][8UC5<sj:]=\XrP`&,U`KoB0CE4S(e$X]!qF%bhW)^r-_JDoPkYRXBGUJB^t(u.paNJ97\W)JmD]6>C@bgr@khR%8[9e1paMKaE'5%f)h'[KMFu8'?/2;Sjq&$2:SZ>QM+UHMUYC_(MlX\G_4@Fs!fs4H:PEZ0;K:7DH.33n['j5m6j^2(dWcLAPj,c)A_Go;VNZ_3D#l=F'-3UC\?;:bkUqOfCgUB"+krQF9#soia,0/@YCgg&@46+*/h=_6JRJB9R=%:ps8;e1`Ui?/i2g%<>SRkd"XITL=$:h'4d>e"dHe@''E&s`q.*]*Zd=NIMS^pU>nK'gQq7]r9d]9O#%9"9Q^1o#Q'AMsc]jr<K3m:tKMpmhVnrS5SmaK*9VA=O0S/mV@KMIr@aZFA`.Z.oJH]I3gR"339PE-V59,Y9L,V2h3hi61ii41+'``uRV+?0K%Nu#,j%'M.g.Ftm,a4HP64YIM;q\ml7$&%f#5lmC0aqZb=&0f0)qQUK`NEf@5CQ"X+peu,L6\l3K";+Wmo<6Vo@8M"b`pqFb)"AA]g<*)Ymm[gm1b8$33WUn1R^>:'u5i#QiKSY4]ERuAc'mg!FS<bHnk\lQgOYD_2&DJK.I0N.Td)u!X0g-JUm8V/2\H'2<L*)YK+LfAf]ID:=1s(`I_B"7o%4[b\T`&Toa\7-+"mZ-D=ju*[22nZ@-GD+>f%m&:$>WNI'Xa[l3Y.Z5fB7gn@'MYeh)u:t^"''T;um?I]3d3&)6T,-I&7VhMt.`aG>''Q(OkG/uJM#u^E:L+nn[91oCHU7uKsp%ha,`*`^.\>b9MM.]p^MAW:+92%O;\IDVsk\.X^$Rr'7'U"n2>=%LMAUkC@FIQQ5g^+>-FORt07"?InQJ)?1jl3.[@>@_Ai2`XW(BK9@V.bFs%[jK;H5rjKYUI/frB,M!/\un5FAK3DmDV[TE=1<RqgBis:K+rk`HPqa4egV);<YW8n>@7m]=d=M"g=B^mdgUcg[lcU8+aSp(-P6E*j%`,#G+M+53:8%V!`i\9^9-UWpNGoKW/cP`m/@0Q8E)NIlR:E^rd"\g-LWhH;oP7<k#pQ$9oZt[<gVk?7YmDlk_6Vba"bW28jl'G#&QL$Fp:=WM)3%Om7]rdDUGlMY?m\S"`c"j#)a`b62T+A$E+T>JkV=BBD7s[^RnEM<rH/KW/d[Zu<>k\K6<YX-r8Y/7MHgE6tHP*Yg8]NIgBZ-p#Mq?E;+$miuZMU$',\U,o12DO0\_a1A4pd[d,2C^J"VJ-cTgD-QV.UT]W(M))L[q=iqX`cT\DZ:*a]!J`G^_u%9Tnc][-#@0)lE7&.I(oY.qqVg(Im_8)+f%WAl9t#ueX=L:+Z>KJ&k0jC?I@p1lb0%*4c!tR-C%\uQDJ;PE)m&qbXfJMIFA$*0m0R8PgJ@O8o5E&/9#80p9K1!+6`G7UU/DC7+bnN!dF3dC^`k"Q.,R"o4mX^'5ELhDR/!Z;,WZa*SYE6N_?YFprDce.W,l1t?C!Z^C9l&Mm%t]@<44G3&M,^l!W>-j)N4o<Ugc/@GcF;'l"=*uWjeY&K5Lls9o_.7XmAOf!N^*[7)<Dl''r(P``0B"/J2gH\4N*h@K5n[E>#&#6&VHJ'd8=^XltDSO)Z#:<TnTCWYKC*#3sWK1*m!W*Np$OZ@-GD?n.2*PVSXf@&f-BJ:fJn(FiSs)["%q%)N$D5cl*:.A0`6BL>uo#YYZE'KrfH9P++L&qOIZ^_H:D5AWE@6:l3:<,mVTc`j,X=&@Ej>et_+\Um82``5M79WeXg%rV_Pffm6TjJ*9fXM3S."un\H(ekL3.^2bG)-3"(.h%C$fW:V@jZ"9UX,UDe-4=#,3ZAHMMRM@J4%,L8";F!%+\ZJE!VVa6$Gc50s)$,t*.DgQar.%u_,gdJ.KU$Z9>L[`*U,![X\Q@'.(#_NfQ>1jYR.WA42PB!2si-=rRcc@4@`UaF)fYu%7ZS7X-+B+!#Sb&UdigU,\j\Ih5J_Y[SbL"c_MlsZ%EM*<44G3&_*V`8V5^5BR&8ie=\WYGcIE&l"=*u$5t>YJ27tC*k*p@Xf24aKsi!1Iil3"Tc0P!oH18RG*OXPSGf!q_Nk>g+UVX-gR"33fTNbdSbp7jh8SmG]Ka%HhmQ:d;;rR#<n*fE_6EJEF\pu#L+6<'j%oo;[aNVJc_Q>.kb/>l.bglR_rHi01V`7lmFScU9p?n.7hmg.q$\cG0`tDr@nTCoctuEI/(t>(LGfg5)#^L$N2^VXhZ'oC#n2NcVjG./D_LQK]m_Ii(h!pB.VqpI?s%+M)bMYKbot`dm^(:nCae:Ve9,K_'ak\]YZ\*p3AnaBb4\3hH7b)kdtaQAGCurSS&)hn)Fg9Mc\aSZ,T'RS@P,`_^2DEbFM+_E>u,h$NqgK<[dZC)=i0T,B32BlLfJ(hkEt`Pr2LE=.bc?7<@:Ar(u+A;0CCL55ME?^k]6/n@?69H_^\U7&DP(n&8Fc1Wj@U%OrRndh0.WNh,::\nn*_`q8&CH77f%83@A6+1-aWDCK&Q(a%>09HcN'7lZ0<17T?[B?,>b_HiZeU"L64L:kXn./W:QsGl`sI^b_U1[X'e:M%_TfADZQV/Q+g:i/=DNe`M!.KWWs(1L]ss.#775U$7uSrpXP&li-t^E(Ve~>
+endstream
+endobj
+464 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 463 0 R
+/Annots 465 0 R
+>>
+endobj
+465 0 obj
+[
+466 0 R
+467 0 R
+468 0 R
+469 0 R
+470 0 R
+471 0 R
+472 0 R
+473 0 R
+474 0 R
+475 0 R
+476 0 R
+477 0 R
+478 0 R
+479 0 R
+480 0 R
+481 0 R
+482 0 R
+483 0 R
+484 0 R
+485 0 R
+486 0 R
+487 0 R
+488 0 R
+489 0 R
+490 0 R
+491 0 R
+492 0 R
+493 0 R
+494 0 R
+495 0 R
+496 0 R
+497 0 R
+]
+endobj
+466 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 355.57 587.556 400.57 577.556 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 21 0 R
+/H /I
+>>
+endobj
+467 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 355.57 576.056 400.57 566.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 21 0 R
+/H /I
+>>
+endobj
+468 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 355.57 564.556 400.57 554.556 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 21 0 R
+/H /I
+>>
+endobj
+469 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 391.68 553.056 436.68 543.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 27 0 R
+/H /I
+>>
+endobj
+470 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 356.14 541.556 401.14 531.556 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 37 0 R
+/H /I
+>>
+endobj
+471 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 402.23 530.056 447.23 520.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 25 0 R
+/H /I
+>>
+endobj
+472 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 373.9 518.556 418.9 508.556 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 35 0 R
+/H /I
+>>
+endobj
+473 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 355.57 507.056 400.57 497.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 21 0 R
+/H /I
+>>
+endobj
+474 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 488.21 507.056 533.21 497.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 31 0 R
+/H /I
+>>
+endobj
+475 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 314.58 485.056 359.58 475.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 33 0 R
+/H /I
+>>
+endobj
+476 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 355.57 473.556 400.57 463.556 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 21 0 R
+/H /I
+>>
+endobj
+477 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 489.33 473.556 534.33 463.556 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 27 0 R
+/H /I
+>>
+endobj
+478 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 473.33 462.556 518.33 452.556 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 25 0 R
+/H /I
+>>
+endobj
+479 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 355.57 440.056 400.57 430.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 21 0 R
+/H /I
+>>
+endobj
+480 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 453.79 440.056 498.79 430.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 37 0 R
+/H /I
+>>
+endobj
+481 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 366.14 417.556 416.14 407.556 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 39 0 R
+/H /I
+>>
+endobj
+482 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 356.14 406.556 401.14 396.556 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 37 0 R
+/H /I
+>>
+endobj
+483 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 427.8 395.056 477.8 385.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 39 0 R
+/H /I
+>>
+endobj
+484 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 366.14 372.556 416.14 362.556 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 39 0 R
+/H /I
+>>
+endobj
+485 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 391.68 361.056 436.68 351.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 27 0 R
+/H /I
+>>
+endobj
+486 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 356.14 349.556 401.14 339.556 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 37 0 R
+/H /I
+>>
+endobj
+487 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 356.14 338.056 401.14 328.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 37 0 R
+/H /I
+>>
+endobj
+488 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 365.58 326.556 410.58 316.556 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 29 0 R
+/H /I
+>>
+endobj
+489 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 402.23 315.056 447.23 305.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 25 0 R
+/H /I
+>>
+endobj
+490 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 402.23 303.556 447.23 293.556 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 25 0 R
+/H /I
+>>
+endobj
+491 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 355.57 292.056 400.57 282.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 21 0 R
+/H /I
+>>
+endobj
+492 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 402.23 280.556 447.23 270.556 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 25 0 R
+/H /I
+>>
+endobj
+493 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 391.68 269.056 436.68 259.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 27 0 R
+/H /I
+>>
+endobj
+494 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 391.68 257.556 436.68 247.556 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 27 0 R
+/H /I
+>>
+endobj
+495 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 402.23 246.056 447.23 236.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 25 0 R
+/H /I
+>>
+endobj
+496 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 391.68 235.056 436.68 225.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 27 0 R
+/H /I
+>>
+endobj
+497 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 391.68 223.556 436.68 213.556 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 27 0 R
+/H /I
+>>
+endobj
+498 0 obj
+<< /Length 1613 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat%#;0/I&&:X@Tn91;$*6TH,E_etiAQR7]]Nf?\%gWgp&]bE#g$GoW6.BVmR#RB2PRQATGCSF3h=Q?FkE-o29ie(JTqb0E%[%P"LEo5uB80m<W2iQW.Xh2)<TPR*`G\i+mj_AjgJ:ii;c4=*\<=R!_3Y@!Bs:c#HB4U<E5j/QGbF,_is`@A9og.d%#/Y?%&Z>EbI;&%O3=I/[kJ3A<C.!VnFA7K,%q0NR$&O_[P%1<)B`2\\"[Ue&u'JjNag>OAGaDRbRQ]6FrEro)bV3IBX6#q$@&J18ueo5.R"ni,t0_R-G;s!kKcmf39\euF>S9]!(PReP3&Y)p80>#A<k;7SdJBg-LEk2*9g,(9u;ho4d#i(Ukgp)jHliU%W]lD+kc.gXK1K61JV!b&WbT2E^`4Jr_13\.nU_cU>sr5X$Yp>b*?TS@>]_i9Y._2\(3q!'S7/-<\@qn]F*bBjg'hTC`YCXfJ\`p(M(0ioPp3FR5QM)iAA_4q+/qR(\F%gPDHR*PB\%p?Y(+UT_[_,A<dC'4K$Lc%Eg$CK_-G7G$"d9HO@+cl-i9Rc@H$8^a&ABT#VrZG'T2OjF7.jg!g]VM_I"%?^=d<eFn/VVC?"s4LcN;/Yduq68!F!\B/r*I'ekj"16mN,j""ADN^0!aRKU"Ro<#d%ChW-T_JC=.mq*!XaU=lLZGuK_YF9bL%MobXU(SoKObZ,nrH'M,D:3B2+c@<J5NV(080rUJsXQ*?FNOYQ'3Q5lX&6/RX/XiAFsCA*=jbO$##Pc^>)*[OfPF:A.htJ(s\+]9k"&:[/h+EgFZ+?o.+B_QB9@q,UpjXG7)9i@Cq7;Rg3$rd(P;KIgS*,PF[XI5t7NtS/"?s(5$rl`"h\=8j:?a@iF[gFKe?P4Gi[.C:ld$^pcb?H6a)I=m"X$FE&**]JHuf`9%=F?"!s*(j<`[XBk-r%Z!M5X19K#5VN3@[6Id_#GZKk#+POH=AOL70I"Tt6VbgaO>%,b_H<=m,]L)(734A1*Xo02!=6IJ@]B_tV+mI:[bcBkBs%/7mNia/1>S"TGBe"W"Gh"%I&?^h8IWQ])VfW+<OHW<TQGU*U@IDH==!'E,+."L,#B(4cJ/jkVnWZ&hXu`fE=R;)bB<fh!b^qQ44*un6Rg>fGd_P&JIaW3j.P-BF4[%2p(3JJ*UGq%"BKsFmf)M$2aLF0Q8qFr\:O%XFoY4]#EBh[6.k.aGi("*mauMrgN2.)d'<MP?oOX'"+W+Jr5$m'B#*8F.WS`N&U4-'niY))*8:_gg4._mSmuoOQoas1)L=W8/r)#S=a%XL3<p'nBBB=N%Df\G4IFl_CNmW4fJaT7XGI[^+a3+fWZ%G)T5cl<;f/,nJEL.7VGe<Fe#sErT*`GW`fkI$\e>dra1hRuBf1ja@>6(&*8Jd3"qr=kopr&a.hGl*3J#pWnu1Xd=@+SmE!FLb"^WjJhI>p-Vmg"(*F8P[)Z.d$1uMPC6`]YfUoMM#2&6F"%B[Bqd3rI2fPjl(--a9V]:aG;8%TE=@d#SM^NRF%XXC'g-WOU0l$f>YI=Qt@L#XH6epABGb9WSL]?MIV6Q-'!!k+@XeM;Gf^Lo=$Di8QDDVFsACA6aMhj"*Fcoo%d~>
+endstream
+endobj
+499 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 498 0 R
+/Annots 500 0 R
+>>
+endobj
+500 0 obj
+[
+501 0 R
+502 0 R
+503 0 R
+504 0 R
+]
+endobj
+501 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 104.78 642.866 224.25 632.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (mailto:geoffrey.clemm@us.ibm.com)
+/S /URI >>
+/H /I
+>>
+endobj
+502 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 104.78 566.866 225.07 556.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (mailto:julian.reschke@greenbytes.de)
+/S /URI >>
+/H /I
+>>
+endobj
+503 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 104.78 501.866 199.51 491.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (mailto:eric.sedlar@oracle.com)
+/S /URI >>
+/H /I
+>>
+endobj
+504 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 104.78 436.866 178.41 426.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (mailto:ejw@cse.ucsc.edu)
+/S /URI >>
+/H /I
+>>
+endobj
+505 0 obj
+<< /Length 1982 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat%%d>j\U'Re;/n2MZ#'ESF$Y#[WTmB!259!^>$mR,_6#Fr^^!G\.KcJPfgM=J83VP'&@5^^j?55)DSjhlE7mOn$1Ic.?;Mnn(!68+FMTpK?]=do.pRX=@Qp\?;Op:bk=:Ts/lF*l_$O&Xld:SQCMm=DK62"):sgUF9G^T.aWiOb[*othPeUeAZ=jF4%!mV>+hMAG2BWb_(j1'qKLWs@LgP`$?N-4DFcMJAD&I\<[kHYODc5HaJ!SKQg'B5[%T>dmGJ"D_cDK[Ut#-*)4i&#i@#@O4t4oTP$!l`Q>t_,"9V9ko4S=i^3!8%.01DE(ZAFb*bGC&7*4p.:9KmuuB;@6b&$1:J3q]r22uck=t2I?QDmX+u0mI^)7Ed0$KS_*5c.*'8pgLe5s&?T1uk"9+Ol.lc9KR7Pl"!V=I23%?4V`.23q#l4]Md/O6c_d5Rr=g</ZGJsnm_bM9=&rp7AKMZOq\i!%*3U<TSE==0Sa`JhuMZ*YrF6F',&I)o.D)q!&\'Z0nN<`-NQH$j+J__IqFninN/M37f?o5IN2V__%;bbs=`PFLoWt2O51*>k>M<5=Fg@D,6jcMp*Ssb*0B\1Cs`_m&CM*kd44kO`M52P,p3.!sGK%.]U]kug5)s7';qd=<i$lW3Y>35`k2jT$Z`bj0[BFN,EqhI\g%Fu7odpX3cP]3cOGZfNj"fHrk"t(Y\"e#gpP<hcG\5ZdTZl@Qsh6eT6:9?H>?!$+<2nZ:a1QI_;ecj*]#XK!'Qss=,_$`(SQTJAL%elM9Q7'0taJJmO\dmiC(,eE@EA$?4'kK#*S>jm<,@m^hk%2WQ,gVF-rU*"_A!`F3\7<JIm\!IED-::!#L4;N)[pq^/T2,_Ao:P^XX)DY+`bD!D^>k"##=\q0<T\-0>9*b`d!PoHAaaYV(pDjo[TRdQ\:2;V>Z%h$iDi?]k?eJnb;%\>%@BRlQ,CRJB*![g@pVp<X9^%F9`gu#SDc<,u$iWZrdD6C>V%:@TFL^3CbP'8.)m1k0XHgOfG*RUfsi\:,G><"],n*_$EI_[>+g_cVCI,<QBsZ8AtR#&ZKajTeKA%FFr$6ifU>q61Wf<0)L!.L^P]'^lJaS!CD!`6$rqD_BAL"0ns#07KSjh6`!MW_i.\P9X-u"nmE;.E77('<9BF&=`p6JN`6E`'UbT6,8<VIL'"@(.2B2S3:Ruf(a(7oA_%-@OfG*?Wc1P;=EU-EL/\PR.-*r^)568jp.ulSl]d90Fe$u%W>M9V;El%o0N'cM8m5B!3_h_+.L&G$j`6m.8C^NZ[;edG=EU-ML/\PR-k\bf7OWS^4VUHK:8sU\a3!L8`;iIA"lg:dWeLSS4-rp)ob(nt;VYRj7/grDk\D<&l$BbA3-C<#gQW.D'IuCC-L=Y83b@un=EU,o)jLSg'_:<J8n"N1.$3/oUfsi\cCBm:![rrY:U;Jh<=^+k-s5mpN1f-JK1GfL[@1&tAbCldG\"7_3V$9A3s!Yu/OB&(FN!=Ol3b]sn5uV!_)4EPTs-u7^7:7IDdZh$CFA>%95n$pZu'qG#^/EqeL([%6<c>#8]P):,"ka6:69@l!]kqiTF/U2,NGqIDL[Ug*f^E'9>X=u4F="Tl0+cb0rR$pZBTD1FVe)6LFR6VlT`>\MR/7?Ijt-O34e0K'LmQ,hbQ6;pCs8JmS=jU?WSHIrZG;(3:i>bcR\\oNCY*%Eu`NpRl`g1,k>LrO>"\YX`')8Fn8kcEd&DBnS]e[>ZPm)]fXg?MhepYK1_:K93%hhY[^tsTnIJX-Gt\*E!gJh-4TTAH!iMq"IJ`@"Bmr/gD3eDDe/JRqDRs,lMfr1k0(0Gb+1acX`?YPe$B:XA+K70b<,O*''=5s>l@;SJ)'r(!u5KEh_qn#%K;M8Rc=!s,Y;'dia)KdF)r3%nW5)CpeF.];jB@g!:(/L92q`c0oT$k;0-Hj,sQsX2(-@%eRkZ;B=VjOq17m_J#hM]HbK2h''XnGW(E?~>
+endstream
+endobj
+506 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 505 0 R
+/Annots 507 0 R
+>>
+endobj
+507 0 obj
+[
+508 0 R
+509 0 R
+510 0 R
+]
+endobj
+508 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 488.89 604.866 535.374 594.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://www.ietf.org/ipr)
+/S /URI >>
+/H /I
+>>
+endobj
+509 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 92.0 593.866 144.783 583.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://www.ietf.org/ipr)
+/S /URI >>
+/H /I
+>>
+endobj
+510 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 247.26 550.866 313.4 540.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (mailto:ietf-ipr@ietf.org)
+/S /URI >>
+/H /I
+>>
+endobj
+511 0 obj
+<< /Length 3465 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm@>BAQ/'n4K4d+^T;+\LO@I</\lP>7Wo&oZNmh0kr-`o^5E<D),trUi;r.1(d*9L/5\`flO9o6iSX3&a,%oA.#CIFJWS8@l>.r[qJ=^8$T#rm?F3n<m$'Tj02;er*lg5*ZZSJ);o.?ekU^R:Y,EBS&"((rP&6Q\WD_58]-k?oQ'5A$c("Y0N?FTmSdB,r2;t/Je$>iZNkO8shkAe.C#7;i@XmTmP;N1>d!,0+oU1psm?h.X-$C3e!0ono\8.Yu60eV@cK5/]e8+V6qe];4N;W2!%"+;%eiWDZ&VHFUVXb>9f8\+@+5.2unCk"4.\m"NVFB52]b`l[8G+4i@oin1g*H70iq:Lt_=oj("WEB"Rt3@oF1n'W_-dO'r+%/@7^;pUV1]E+q<eP..3h-I/YKi$T6+#$9nRYq)jFaS&98cF9@'rC#t#,IJY95OgCns7eTYXf<K=6NZR(Qc1<C9`$bNFT1%lQj$\g"KW<2E;@*=>@)8LREt1B040n>r-MH,a^^mPK0P-X+]\r/11_1P0.@2$Gr8iiWa*6],,?YiL;r5j'I<m\fH[aQf#8+WY^Bd7kB0[N:U4QGSO8E7ck\khW%`(.6)7:o?#6u=q3]\-J"DSpXiu_Y$Npon$e$.17/6u/]Hu+"m9+2!`e(c1`o&D$'h!J0=B3Ht$I>t4:9;Ip_pjnX@etbDGllC^ql6#Tar!qgL'TOe@7=[l5,k9(b3R(FhhiIbS-[4j=r9IKO$<BTmuP,QV_4fR%lKXo[#%+Bm-9/JVQP+<nnn%'H@l)`BOUa8'"e(Ig*PM:c).Lbrh5kLau"h[;kB6+miUBO3nl6YnnmrmfKBs\deI2933)?uNhqE5Bda2Ip2uf4$tD!U6O]tiM<tZ^4@D1riYYYXbNc>`rqC"74p<#O%0el[gE:VO9G%G2Fj"DAFV7Xc_qBV=OloZ74ll9<eg+-QK_mdQC;!ab=h4/UF1KHk.cI;6Ce2-PiMS)^9k!8n6V^(4Aml[BYLHe/ce3@#kHED?>gZ2DXTH*7'dOF9dL[lt6a;NJ*%f'RThVi;4hjqYmaOa0#cL6"N&5Zf>&G6.YWfNWLM.'e&<c8E4IoWAfL_%=-4X&!9526TYLRB"q;M%n;Cn6a&2)6OosgNl&iT1I*t")84',,\N1d%QF%[!8BSjjuo"'Kh/c"Mo-Yujsll\s[!%N\2B[@609pAH?^*k)c<fl5>/]XU'[ZG3tI59"/]$@!kH/:k)4)gUk0$)!TJm^\ZF:bE@Nqg#Fmqa5ti$B4p$L.ib<$0rbWOhOl<YT!MUiR@taRgA"Ypj9b4`BIC/.!1,O?oV?%Ntq24<9MTep3H-bs-qZHtnO9JrV#'#!7(%fCl22V_8j2>YbTuK^hqE4*\Mb=j9taHiV)=$4AU=YQ3bNV`G1J*_,Q-UW%IDLQOkF6QSIfX`,mci@5%c0uFJK2q\)$ln+`#c"4kSRL^*s)DYoD0GnX\SF+T=BZskG0TAA@B)8l(ldE*sVONk[!X^_Dd'`7<RqajOD/mcW6kEf=7qsW9"sXS4F8+2*-7U-oTKRF'0\Ra/eTEiUEP1Q$,02I_Bo>?sAF!Zac\&QT!5nH-/<1L^%1(R73/ah\%0_ZP-bBpt."b)G?&3[/dN1cm<"#Fk+Y4*0eW8//mW/H.K!\3U/=He1't;ieO+\aV0WXBjmhtIu2Gp:N<4\MQ$l5(P:e9",-p9PJX&\#@]l-^Q\B:.H[%IPT;N&H.O^DV`1YMtk++oZ3+@Ja.K;KCh!8P;-aoRc=[A+P'UM7lUE"N`!.9*/.31Z@hcRQ)[!o&uD$m7mF%B:7+cKLUuT4b%,Xttn7JdgJ2fW3VL2S8r(NeoE6_BEs^?>sQb3RRg]G>BOL2<<c]#YLS\#`5Gmk1h[`3CsI7_O:O=&;?WN#_>jNqA(Y[AN?HOk\JH)1BXu1D3kL$9a0[>T](S""@j)[g"o[Vd<JRm2H?&er%oeVkP&6,DaXnu8R%4/#B$J\2en/pW`oCK/ft6%dph9E-UC=!UsJ4Z9Bt]gE?7b]fg22r5n^4&Cu3$/Lo.qEj9KQ>k<oh0\]]rESEh#:Rq*\$^jT_L".:C9mVioN^cmMk`+1GRb^gY+6`$QA_GAlKaSY;f9;e)g[$%Zl'iikn$`:q57q3GF)1+p(16[g@F/.JuT-fsT76kfRqG?/mFW'r/N,*Y#+L0EtW5?]a2!qN:8ZGJiWDiUeo.I-EaGGOT\Rut<V#,^_ce#tC\`[a!_P*hH=TG6nD#][eG%q&p\iQbD))%@GYVTYn&dt.Q?IqI^=4J:aUX-s]g(tG-X^/ooc+*HC@3[i]PcGjImhRIE,a]TnY7Z.:P?tF]QEEXFOP?EG@JO:j_I,BTd))%M*d!m]7R/b3Xi,7WU/-R2ZMknc)goNM%Hs<2/8N\1\+&1LpjMqhP1#-h8eYqkL'ZQEk0e[=eNSPA:^LoS_3YiA:/f"aGag9RJ5`0cpI:;IpVYg8qVYXo'Och2YUL>%A;M;+4ZS%Q2T<,LL4k9FSO8C7LA6P"-R':Y+O('*(oD`l7>W(+n2$T5r(f[f68HFk/[!Ns#J9AUpF&ClJ6Z1:L;><mS-qoVH=>5&$]7+!n/4`LY+1M3Q9"VOUSGXSp0],+&L)Hbe:RT.$(^@/F?CDZ53m'UW%^r\$;$l$h!YMGMZ$Y!dd&Mf"il3A/)V1)V:^b:Dl1EP!9HIeNdR7'Hbq>Q/o>hF*C0cI.p#hb+:X,3aKpl]4%GYdn6cG.Sa,ch4>b%6X_ZT[=@AY.+[K$9q@6_,SD9ZQJO^[ik;BL-5YXe,SS#'J)WeIG2csI\<="?XkK,>WZpK/^@4a!cfgggA\1O6$5i]!LBdaaF\e&G;PHO'JH9b?f<?+Xl+Eg3>fB]Ku?T4Ut<d?I_M'b5N@e:Kn"l?^QnAA\m6lgkk#s0KKb>KSH6b5Ki2(me/1\eT3EPP2(iMI%.Lg!PQDe"r+?U"Jfg\"jj#)SR'PqE\n\<Z\p"_GT6djq4hK=tE=.l7fsqCDJaH#rp9`W3,U+tF9Qbh2bs0&%HcY_1l3qm5?s&#EPG=KFM6Wk%+.:H#33`9mlEp8g6Jl/t*B$qm2'oBs[ji9ldHgfd2/lE4Y_,,]<-3u1-o3mQa_CW_(ZLP/H/;g*OJ/7k?t]R*6O@CE_EoDtiW.6IEYTDWA0rHn=OQd(BHL:SH&k[J":;F.QA01N^"g/Hr6RZCO/Np#7H"-*1)0#_;>!t@6TrkO%LP7GQe\M5Ts57Qo[0k[T2QU8aJo:DX?0OS%X;2.:aCfNrL^:@CsW-M.>b*V\aWr.FaX7@W0s/?],LWaH4n:7g_>('N(n_epkOH<;YTPbL&Mgsm`kkd3'^$j6RotNS<$^k>/Cd%kC=qS<T\B2AgegsNampn>H(p%_,ol@I_fBWt(h[/diW3R.XZ@s'_fYth=>uj."on1<LY0NK:8?*ZDYqYIpgWY0CV8+pWs8:_.\\<FbIp'IhC]~>
+endstream
+endobj
+512 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 511 0 R
+/Annots 513 0 R
+>>
+endobj
+513 0 obj
+[
+]
+endobj
+514 0 obj
+<< /Length 1438 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat=l991#N%*.i6.H\,@&lfJ-F\F_#ciS':`b>rL%^+hEMXIVJa-V8PE]c"sif"r2Mg%knr$R8o8H$'1qr*1l4QG8cmlTAhhMI9QTBMf\B3%Rc[H_q]h3\#r5<MIggoKjY\,.&0l"(b31!PD2?$CbaAqgkWiK>$f7R6`Y6:tj.%:@G9CNsPl]Vk6k[,@3@nUa\ed&CTJ%mEu>'ZJ\,7DD]QIZeV\MgfG6ofM!(hfD-!VYK",ka,NdqC0,m/a4\fOe..sIjp4JbOZGroTOYkA6PQ8OK+ISHo-t"H+p_d.W?*Z&=JjI>EPoeW]isDA6PSn+B>8;qB.q`Bj(F3JMBal%$q):GKGhIQL'1e!jY'!?&9?P-)uN*j6!;*/YkpZ:[,B0MHtjE0`5B`n`b;.r,[10e\.*Vs70L@KRs;#C'OGe,*F=6oZZ22(7[@Gi^JufY2=eG/o"GKUr(R\9['$Q]hK5B0t""_HN>InFLWKK+a'r+Rl^'"K2iqd9#U?G6Y)Sj/;eaZ"NCN._?"gV&oq(-"d<+*ZjU>6^5--\I%Zj0pCss4lE+Qun$=[#dV`OGQ!!2)6rif$Pq6rSoi6CW:#FrB#Sj@-L/cC!b.oY\j,J&g^@i*GY!bhLns5BKbs',lK]]<3on5.AQLgcA;,"2Wb@d%FZSeLGL;br@[*!:1.$aRI7`j\A\)><C-<`jH3'ouI=g/cLWbUr<[ZXEr&$p_^f,ccdJJU%XM$O>*Vlm,&H_ZCYR1XG`Ir/US*f'[&%J_)Sa<>?Cs2_E(s'r\a2h4IO$SmsEWcAt6`6H)<U1;smQW7>>'XnW@:)@sW6HatO4k,*t'ts:;&Cg6jXW@"k!f'ucLOm?bD$aI'+ii.oE1pigi:?dpE-;(-E-_Fb'.`lg9oN+%E]u:f7K7Vc'D'>aFeV>)GhH$2pX#Xa]^3c3,ptIMi7^YtWdq*O;A,C`kDtrm0qW3"V'7[si*+28qT3Lr+>U(Wg.%p=b0FgRXZ:r4[;FB4))>9:\O\<1G.G:lV.>FL$9#m,m###ETa4gYIVK0.@tJG'G0$JgoG$Z=Z96cb4sjQE=\r"EWf#T[_RLB[=Aff4jHf4,C4gtJ#lR1p+CJ\K_hkQC$UU`]gF@r<Ja6u;_a]X;r:&2jKG[.d6;to9>*a@@iMrVQ#eXIjL>FX0X"FEBa!/`>%iJLc3u4q**4(l>R*4]\2,"<4XSA;T,*%70$r_4(rq31Ehql&%RP:CUrMGB15^#8"3K,Ksb0*VGU/a6R./6CSXQcqgm/2Hf]jh'LDf@0=Sj@T#kOGa"DuWqRIsX-p^OKViIlP,HcDRT%_8l03E]RHt+9^`,]DGt/rrr!=kEEnVP=-dr=7bp'I"$OXX>sUQchf*@Zbc>OLY_p,bPpVXrqn@pZod^es7S@Js*a(XlH@6Hj)M=Xp_L"S^5bhBn*^/[Pdq@L~>
+endstream
+endobj
+515 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 514 0 R
+/Annots 516 0 R
+>>
+endobj
+516 0 obj
+[
+]
+endobj
+519 0 obj
+<<
+ /Title (\376\377\0\123\0\164\0\141\0\164\0\165\0\163\0\40\0\157\0\146\0\40\0\164\0\150\0\151\0\163\0\40\0\115\0\145\0\155\0\157)
+ /Parent 517 0 R
+ /Next 521 0 R
+ /A 518 0 R
+>> endobj
+521 0 obj
+<<
+ /Title (\376\377\0\103\0\157\0\160\0\171\0\162\0\151\0\147\0\150\0\164\0\40\0\116\0\157\0\164\0\151\0\143\0\145)
+ /Parent 517 0 R
+ /Prev 519 0 R
+ /Next 523 0 R
+ /A 520 0 R
+>> endobj
+523 0 obj
+<<
+ /Title (\376\377\0\101\0\142\0\163\0\164\0\162\0\141\0\143\0\164)
+ /Parent 517 0 R
+ /Prev 521 0 R
+ /Next 525 0 R
+ /A 522 0 R
+>> endobj
+525 0 obj
+<<
+ /Title (\376\377\0\124\0\141\0\142\0\154\0\145\0\40\0\157\0\146\0\40\0\103\0\157\0\156\0\164\0\145\0\156\0\164\0\163)
+ /Parent 517 0 R
+ /Prev 523 0 R
+ /Next 526 0 R
+ /A 524 0 R
+>> endobj
+526 0 obj
+<<
+ /Title (\376\377\0\61\0\56\0\40\0\111\0\156\0\164\0\162\0\157\0\144\0\165\0\143\0\164\0\151\0\157\0\156)
+ /Parent 517 0 R
+ /First 528 0 R
+ /Last 529 0 R
+ /Prev 525 0 R
+ /Next 531 0 R
+ /Count -2
+ /A 11 0 R
+>> endobj
+528 0 obj
+<<
+ /Title (\376\377\0\61\0\56\0\61\0\56\0\40\0\124\0\145\0\162\0\155\0\163)
+ /Parent 526 0 R
+ /Next 529 0 R
+ /A 527 0 R
+>> endobj
+529 0 obj
+<<
+ /Title (\376\377\0\61\0\56\0\62\0\56\0\40\0\116\0\157\0\164\0\141\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\103\0\157\0\156\0\166\0\145\0\156\0\164\0\151\0\157\0\156\0\163)
+ /Parent 526 0 R
+ /Prev 528 0 R
+ /A 15 0 R
+>> endobj
+531 0 obj
+<<
+ /Title (\376\377\0\62\0\56\0\40\0\120\0\162\0\151\0\156\0\143\0\151\0\160\0\141\0\154\0\163)
+ /Parent 517 0 R
+ /Prev 526 0 R
+ /Next 533 0 R
+ /A 530 0 R
+>> endobj
+533 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\40\0\120\0\162\0\151\0\166\0\151\0\154\0\145\0\147\0\145\0\163)
+ /Parent 517 0 R
+ /First 535 0 R
+ /Last 557 0 R
+ /Prev 531 0 R
+ /Next 559 0 R
+ /Count -12
+ /A 532 0 R
+>> endobj
+535 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\61\0\56\0\40\0\104\0\101\0\126\0\72\0\162\0\145\0\141\0\144\0\40\0\120\0\162\0\151\0\166\0\151\0\154\0\145\0\147\0\145)
+ /Parent 533 0 R
+ /Next 537 0 R
+ /A 534 0 R
+>> endobj
+537 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\62\0\56\0\40\0\104\0\101\0\126\0\72\0\167\0\162\0\151\0\164\0\145\0\40\0\120\0\162\0\151\0\166\0\151\0\154\0\145\0\147\0\145)
+ /Parent 533 0 R
+ /Prev 535 0 R
+ /Next 539 0 R
+ /A 536 0 R
+>> endobj
+539 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\63\0\56\0\40\0\104\0\101\0\126\0\72\0\167\0\162\0\151\0\164\0\145\0\55\0\160\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163\0\40\0\120\0\162\0\151\0\166\0\151\0\154\0\145\0\147\0\145)
+ /Parent 533 0 R
+ /Prev 537 0 R
+ /Next 541 0 R
+ /A 538 0 R
+>> endobj
+541 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\64\0\56\0\40\0\104\0\101\0\126\0\72\0\167\0\162\0\151\0\164\0\145\0\55\0\143\0\157\0\156\0\164\0\145\0\156\0\164\0\40\0\120\0\162\0\151\0\166\0\151\0\154\0\145\0\147\0\145)
+ /Parent 533 0 R
+ /Prev 539 0 R
+ /Next 543 0 R
+ /A 540 0 R
+>> endobj
+543 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\65\0\56\0\40\0\104\0\101\0\126\0\72\0\165\0\156\0\154\0\157\0\143\0\153\0\40\0\120\0\162\0\151\0\166\0\151\0\154\0\145\0\147\0\145)
+ /Parent 533 0 R
+ /Prev 541 0 R
+ /Next 545 0 R
+ /A 542 0 R
+>> endobj
+545 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\66\0\56\0\40\0\104\0\101\0\126\0\72\0\162\0\145\0\141\0\144\0\55\0\141\0\143\0\154\0\40\0\120\0\162\0\151\0\166\0\151\0\154\0\145\0\147\0\145)
+ /Parent 533 0 R
+ /Prev 543 0 R
+ /Next 547 0 R
+ /A 544 0 R
+>> endobj
+547 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\67\0\56\0\40\0\104\0\101\0\126\0\72\0\162\0\145\0\141\0\144\0\55\0\143\0\165\0\162\0\162\0\145\0\156\0\164\0\55\0\165\0\163\0\145\0\162\0\55\0\160\0\162\0\151\0\166\0\151\0\154\0\145\0\147\0\145\0\55\0\163\0\145\0\164\0\40\0\120\0\162\0\151\0\166\0\151\0\154\0\145\0\147\0\145)
+ /Parent 533 0 R
+ /Prev 545 0 R
+ /Next 549 0 R
+ /A 546 0 R
+>> endobj
+549 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\70\0\56\0\40\0\104\0\101\0\126\0\72\0\167\0\162\0\151\0\164\0\145\0\55\0\141\0\143\0\154\0\40\0\120\0\162\0\151\0\166\0\151\0\154\0\145\0\147\0\145)
+ /Parent 533 0 R
+ /Prev 547 0 R
+ /Next 551 0 R
+ /A 548 0 R
+>> endobj
+551 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\71\0\56\0\40\0\104\0\101\0\126\0\72\0\142\0\151\0\156\0\144\0\40\0\120\0\162\0\151\0\166\0\151\0\154\0\145\0\147\0\145)
+ /Parent 533 0 R
+ /Prev 549 0 R
+ /Next 553 0 R
+ /A 550 0 R
+>> endobj
+553 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\61\0\60\0\56\0\40\0\104\0\101\0\126\0\72\0\165\0\156\0\142\0\151\0\156\0\144\0\40\0\120\0\162\0\151\0\166\0\151\0\154\0\145\0\147\0\145)
+ /Parent 533 0 R
+ /Prev 551 0 R
+ /Next 555 0 R
+ /A 552 0 R
+>> endobj
+555 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\61\0\61\0\56\0\40\0\104\0\101\0\126\0\72\0\141\0\154\0\154\0\40\0\120\0\162\0\151\0\166\0\151\0\154\0\145\0\147\0\145)
+ /Parent 533 0 R
+ /Prev 553 0 R
+ /Next 557 0 R
+ /A 554 0 R
+>> endobj
+557 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\61\0\62\0\56\0\40\0\101\0\147\0\147\0\162\0\145\0\147\0\141\0\164\0\151\0\157\0\156\0\40\0\157\0\146\0\40\0\120\0\162\0\145\0\144\0\145\0\146\0\151\0\156\0\145\0\144\0\40\0\120\0\162\0\151\0\166\0\151\0\154\0\145\0\147\0\145\0\163)
+ /Parent 533 0 R
+ /Prev 555 0 R
+ /A 556 0 R
+>> endobj
+559 0 obj
+<<
+ /Title (\376\377\0\64\0\56\0\40\0\120\0\162\0\151\0\156\0\143\0\151\0\160\0\141\0\154\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163)
+ /Parent 517 0 R
+ /First 561 0 R
+ /Last 565 0 R
+ /Prev 533 0 R
+ /Next 567 0 R
+ /Count -4
+ /A 558 0 R
+>> endobj
+561 0 obj
+<<
+ /Title (\376\377\0\64\0\56\0\61\0\56\0\40\0\104\0\101\0\126\0\72\0\141\0\154\0\164\0\145\0\162\0\156\0\141\0\164\0\145\0\55\0\125\0\122\0\111\0\55\0\163\0\145\0\164)
+ /Parent 559 0 R
+ /Next 563 0 R
+ /A 560 0 R
+>> endobj
+563 0 obj
+<<
+ /Title (\376\377\0\64\0\56\0\62\0\56\0\40\0\104\0\101\0\126\0\72\0\160\0\162\0\151\0\156\0\143\0\151\0\160\0\141\0\154\0\55\0\125\0\122\0\114)
+ /Parent 559 0 R
+ /Prev 561 0 R
+ /Next 564 0 R
+ /A 562 0 R
+>> endobj
+564 0 obj
+<<
+ /Title (\376\377\0\64\0\56\0\63\0\56\0\40\0\104\0\101\0\126\0\72\0\147\0\162\0\157\0\165\0\160\0\55\0\155\0\145\0\155\0\142\0\145\0\162\0\55\0\163\0\145\0\164)
+ /Parent 559 0 R
+ /Prev 563 0 R
+ /Next 565 0 R
+ /A 51 0 R
+>> endobj
+565 0 obj
+<<
+ /Title (\376\377\0\64\0\56\0\64\0\56\0\40\0\104\0\101\0\126\0\72\0\147\0\162\0\157\0\165\0\160\0\55\0\155\0\145\0\155\0\142\0\145\0\162\0\163\0\150\0\151\0\160)
+ /Parent 559 0 R
+ /Prev 564 0 R
+ /A 53 0 R
+>> endobj
+567 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\40\0\101\0\143\0\143\0\145\0\163\0\163\0\40\0\103\0\157\0\156\0\164\0\162\0\157\0\154\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163)
+ /Parent 517 0 R
+ /First 569 0 R
+ /Last 605 0 R
+ /Prev 559 0 R
+ /Next 607 0 R
+ /Count -24
+ /A 566 0 R
+>> endobj
+569 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\61\0\56\0\40\0\104\0\101\0\126\0\72\0\157\0\167\0\156\0\145\0\162)
+ /Parent 567 0 R
+ /First 570 0 R
+ /Last 571 0 R
+ /Next 573 0 R
+ /Count -2
+ /A 568 0 R
+>> endobj
+570 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\61\0\56\0\61\0\56\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\72\0\40\0\122\0\145\0\164\0\162\0\151\0\145\0\166\0\151\0\156\0\147\0\40\0\104\0\101\0\126\0\72\0\157\0\167\0\156\0\145\0\162)
+ /Parent 569 0 R
+ /Next 571 0 R
+ /A 59 0 R
+>> endobj
+571 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\61\0\56\0\62\0\56\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\72\0\40\0\101\0\156\0\40\0\101\0\164\0\164\0\145\0\155\0\160\0\164\0\40\0\164\0\157\0\40\0\123\0\145\0\164\0\40\0\104\0\101\0\126\0\72\0\157\0\167\0\156\0\145\0\162)
+ /Parent 569 0 R
+ /Prev 570 0 R
+ /A 61 0 R
+>> endobj
+573 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\62\0\56\0\40\0\104\0\101\0\126\0\72\0\147\0\162\0\157\0\165\0\160)
+ /Parent 567 0 R
+ /Prev 569 0 R
+ /Next 575 0 R
+ /A 572 0 R
+>> endobj
+575 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\63\0\56\0\40\0\104\0\101\0\126\0\72\0\163\0\165\0\160\0\160\0\157\0\162\0\164\0\145\0\144\0\55\0\160\0\162\0\151\0\166\0\151\0\154\0\145\0\147\0\145\0\55\0\163\0\145\0\164)
+ /Parent 567 0 R
+ /First 577 0 R
+ /Last 577 0 R
+ /Prev 573 0 R
+ /Next 579 0 R
+ /Count -1
+ /A 574 0 R
+>> endobj
+577 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\63\0\56\0\61\0\56\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\72\0\40\0\122\0\145\0\164\0\162\0\151\0\145\0\166\0\151\0\156\0\147\0\40\0\141\0\40\0\114\0\151\0\163\0\164\0\40\0\157\0\146\0\40\0\120\0\162\0\151\0\166\0\151\0\154\0\145\0\147\0\145\0\163\0\40\0\123\0\165\0\160\0\160\0\157\0\162\0\164\0\145\0\144\0\40\0\157\0\156\0\40\0\141\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145)
+ /Parent 575 0 R
+ /A 576 0 R
+>> endobj
+579 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\64\0\56\0\40\0\104\0\101\0\126\0\72\0\143\0\165\0\162\0\162\0\145\0\156\0\164\0\55\0\165\0\163\0\145\0\162\0\55\0\160\0\162\0\151\0\166\0\151\0\154\0\145\0\147\0\145\0\55\0\163\0\145\0\164)
+ /Parent 567 0 R
+ /First 581 0 R
+ /Last 581 0 R
+ /Prev 575 0 R
+ /Next 583 0 R
+ /Count -1
+ /A 578 0 R
+>> endobj
+581 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\64\0\56\0\61\0\56\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\72\0\40\0\122\0\145\0\164\0\162\0\151\0\145\0\166\0\151\0\156\0\147\0\40\0\164\0\150\0\145\0\40\0\125\0\163\0\145\0\162\0\47\0\163\0\40\0\103\0\165\0\162\0\162\0\145\0\156\0\164\0\40\0\123\0\145\0\164\0\40\0\157\0\146\0\40\0\101\0\163\0\163\0\151\0\147\0\156\0\145\0\144\0\40\0\120\0\162\0\151\0\166\0\151\0\154\0\145\0\147\0\145\0\163)
+ /Parent 579 0 R
+ /A 580 0 R
+>> endobj
+583 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\65\0\56\0\40\0\104\0\101\0\126\0\72\0\141\0\143\0\154)
+ /Parent 567 0 R
+ /First 585 0 R
+ /Last 590 0 R
+ /Prev 579 0 R
+ /Next 592 0 R
+ /Count -5
+ /A 582 0 R
+>> endobj
+585 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\65\0\56\0\61\0\56\0\40\0\101\0\103\0\105\0\40\0\120\0\162\0\151\0\156\0\143\0\151\0\160\0\141\0\154)
+ /Parent 583 0 R
+ /Next 586 0 R
+ /A 584 0 R
+>> endobj
+586 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\65\0\56\0\62\0\56\0\40\0\101\0\103\0\105\0\40\0\107\0\162\0\141\0\156\0\164\0\40\0\141\0\156\0\144\0\40\0\104\0\145\0\156\0\171)
+ /Parent 583 0 R
+ /Prev 585 0 R
+ /Next 588 0 R
+ /A 77 0 R
+>> endobj
+588 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\65\0\56\0\63\0\56\0\40\0\101\0\103\0\105\0\40\0\120\0\162\0\157\0\164\0\145\0\143\0\164\0\151\0\157\0\156)
+ /Parent 583 0 R
+ /Prev 586 0 R
+ /Next 589 0 R
+ /A 587 0 R
+>> endobj
+589 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\65\0\56\0\64\0\56\0\40\0\101\0\103\0\105\0\40\0\111\0\156\0\150\0\145\0\162\0\151\0\164\0\141\0\156\0\143\0\145)
+ /Parent 583 0 R
+ /Prev 588 0 R
+ /Next 590 0 R
+ /A 81 0 R
+>> endobj
+590 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\65\0\56\0\65\0\56\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\72\0\40\0\122\0\145\0\164\0\162\0\151\0\145\0\166\0\151\0\156\0\147\0\40\0\141\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\47\0\163\0\40\0\101\0\143\0\143\0\145\0\163\0\163\0\40\0\103\0\157\0\156\0\164\0\162\0\157\0\154\0\40\0\114\0\151\0\163\0\164)
+ /Parent 583 0 R
+ /Prev 589 0 R
+ /A 83 0 R
+>> endobj
+592 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\66\0\56\0\40\0\104\0\101\0\126\0\72\0\141\0\143\0\154\0\55\0\162\0\145\0\163\0\164\0\162\0\151\0\143\0\164\0\151\0\157\0\156\0\163)
+ /Parent 567 0 R
+ /First 594 0 R
+ /Last 599 0 R
+ /Prev 583 0 R
+ /Next 601 0 R
+ /Count -5
+ /A 591 0 R
+>> endobj
+594 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\66\0\56\0\61\0\56\0\40\0\104\0\101\0\126\0\72\0\147\0\162\0\141\0\156\0\164\0\55\0\157\0\156\0\154\0\171)
+ /Parent 592 0 R
+ /Next 596 0 R
+ /A 593 0 R
+>> endobj
+596 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\66\0\56\0\62\0\56\0\40\0\104\0\101\0\126\0\72\0\156\0\157\0\55\0\151\0\156\0\166\0\145\0\162\0\164\0\40\0\101\0\103\0\105\0\40\0\103\0\157\0\156\0\163\0\164\0\162\0\141\0\151\0\156\0\164)
+ /Parent 592 0 R
+ /Prev 594 0 R
+ /Next 597 0 R
+ /A 595 0 R
+>> endobj
+597 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\66\0\56\0\63\0\56\0\40\0\104\0\101\0\126\0\72\0\144\0\145\0\156\0\171\0\55\0\142\0\145\0\146\0\157\0\162\0\145\0\55\0\147\0\162\0\141\0\156\0\164)
+ /Parent 592 0 R
+ /Prev 596 0 R
+ /Next 598 0 R
+ /A 91 0 R
+>> endobj
+598 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\66\0\56\0\64\0\56\0\40\0\122\0\145\0\161\0\165\0\151\0\162\0\145\0\144\0\40\0\120\0\162\0\151\0\156\0\143\0\151\0\160\0\141\0\154\0\163)
+ /Parent 592 0 R
+ /Prev 597 0 R
+ /Next 599 0 R
+ /A 96 0 R
+>> endobj
+599 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\66\0\56\0\65\0\56\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\72\0\40\0\122\0\145\0\164\0\162\0\151\0\145\0\166\0\151\0\156\0\147\0\40\0\104\0\101\0\126\0\72\0\141\0\143\0\154\0\55\0\162\0\145\0\163\0\164\0\162\0\151\0\143\0\164\0\151\0\157\0\156\0\163)
+ /Parent 592 0 R
+ /Prev 598 0 R
+ /A 98 0 R
+>> endobj
+601 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\67\0\56\0\40\0\104\0\101\0\126\0\72\0\151\0\156\0\150\0\145\0\162\0\151\0\164\0\145\0\144\0\55\0\141\0\143\0\154\0\55\0\163\0\145\0\164)
+ /Parent 567 0 R
+ /Prev 592 0 R
+ /Next 603 0 R
+ /A 600 0 R
+>> endobj
+603 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\70\0\56\0\40\0\104\0\101\0\126\0\72\0\160\0\162\0\151\0\156\0\143\0\151\0\160\0\141\0\154\0\55\0\143\0\157\0\154\0\154\0\145\0\143\0\164\0\151\0\157\0\156\0\55\0\163\0\145\0\164)
+ /Parent 567 0 R
+ /First 604 0 R
+ /Last 604 0 R
+ /Prev 601 0 R
+ /Next 605 0 R
+ /Count -1
+ /A 602 0 R
+>> endobj
+604 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\70\0\56\0\61\0\56\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\72\0\40\0\122\0\145\0\164\0\162\0\151\0\145\0\166\0\151\0\156\0\147\0\40\0\104\0\101\0\126\0\72\0\160\0\162\0\151\0\156\0\143\0\151\0\160\0\141\0\154\0\55\0\143\0\157\0\154\0\154\0\145\0\143\0\164\0\151\0\157\0\156\0\55\0\163\0\145\0\164)
+ /Parent 603 0 R
+ /A 104 0 R
+>> endobj
+605 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\71\0\56\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\72\0\40\0\120\0\122\0\117\0\120\0\106\0\111\0\116\0\104\0\40\0\164\0\157\0\40\0\162\0\145\0\164\0\162\0\151\0\145\0\166\0\145\0\40\0\141\0\143\0\143\0\145\0\163\0\163\0\40\0\143\0\157\0\156\0\164\0\162\0\157\0\154\0\40\0\160\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163)
+ /Parent 567 0 R
+ /Prev 603 0 R
+ /A 106 0 R
+>> endobj
+607 0 obj
+<<
+ /Title (\376\377\0\66\0\56\0\40\0\101\0\103\0\114\0\40\0\105\0\166\0\141\0\154\0\165\0\141\0\164\0\151\0\157\0\156)
+ /Parent 517 0 R
+ /Prev 567 0 R
+ /Next 609 0 R
+ /A 606 0 R
+>> endobj
+609 0 obj
+<<
+ /Title (\376\377\0\67\0\56\0\40\0\101\0\143\0\143\0\145\0\163\0\163\0\40\0\103\0\157\0\156\0\164\0\162\0\157\0\154\0\40\0\141\0\156\0\144\0\40\0\145\0\170\0\151\0\163\0\164\0\151\0\156\0\147\0\40\0\155\0\145\0\164\0\150\0\157\0\144\0\163)
+ /Parent 517 0 R
+ /First 610 0 R
+ /Last 617 0 R
+ /Prev 607 0 R
+ /Next 619 0 R
+ /Count -7
+ /A 608 0 R
+>> endobj
+610 0 obj
+<<
+ /Title (\376\377\0\67\0\56\0\61\0\56\0\40\0\101\0\156\0\171\0\40\0\110\0\124\0\124\0\120\0\40\0\155\0\145\0\164\0\150\0\157\0\144)
+ /Parent 609 0 R
+ /First 611 0 R
+ /Last 611 0 R
+ /Next 613 0 R
+ /Count -1
+ /A 112 0 R
+>> endobj
+611 0 obj
+<<
+ /Title (\376\377\0\67\0\56\0\61\0\56\0\61\0\56\0\40\0\105\0\162\0\162\0\157\0\162\0\40\0\110\0\141\0\156\0\144\0\154\0\151\0\156\0\147)
+ /Parent 610 0 R
+ /A 114 0 R
+>> endobj
+613 0 obj
+<<
+ /Title (\376\377\0\67\0\56\0\62\0\56\0\40\0\117\0\120\0\124\0\111\0\117\0\116\0\123)
+ /Parent 609 0 R
+ /First 614 0 R
+ /Last 614 0 R
+ /Prev 610 0 R
+ /Next 615 0 R
+ /Count -1
+ /A 612 0 R
+>> endobj
+614 0 obj
+<<
+ /Title (\376\377\0\67\0\56\0\62\0\56\0\61\0\56\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\117\0\120\0\124\0\111\0\117\0\116\0\123)
+ /Parent 613 0 R
+ /A 118 0 R
+>> endobj
+615 0 obj
+<<
+ /Title (\376\377\0\67\0\56\0\63\0\56\0\40\0\115\0\117\0\126\0\105)
+ /Parent 609 0 R
+ /Prev 613 0 R
+ /Next 616 0 R
+ /A 120 0 R
+>> endobj
+616 0 obj
+<<
+ /Title (\376\377\0\67\0\56\0\64\0\56\0\40\0\103\0\117\0\120\0\131)
+ /Parent 609 0 R
+ /Prev 615 0 R
+ /Next 617 0 R
+ /A 122 0 R
+>> endobj
+617 0 obj
+<<
+ /Title (\376\377\0\67\0\56\0\65\0\56\0\40\0\114\0\117\0\103\0\113)
+ /Parent 609 0 R
+ /Prev 616 0 R
+ /A 124 0 R
+>> endobj
+619 0 obj
+<<
+ /Title (\376\377\0\70\0\56\0\40\0\101\0\143\0\143\0\145\0\163\0\163\0\40\0\103\0\157\0\156\0\164\0\162\0\157\0\154\0\40\0\115\0\145\0\164\0\150\0\157\0\144\0\163)
+ /Parent 517 0 R
+ /First 621 0 R
+ /Last 621 0 R
+ /Prev 609 0 R
+ /Next 629 0 R
+ /Count -6
+ /A 618 0 R
+>> endobj
+621 0 obj
+<<
+ /Title (\376\377\0\70\0\56\0\61\0\56\0\40\0\101\0\103\0\114)
+ /Parent 619 0 R
+ /First 623 0 R
+ /Last 627 0 R
+ /Count -5
+ /A 620 0 R
+>> endobj
+623 0 obj
+<<
+ /Title (\376\377\0\70\0\56\0\61\0\56\0\61\0\56\0\40\0\101\0\103\0\114\0\40\0\120\0\162\0\145\0\143\0\157\0\156\0\144\0\151\0\164\0\151\0\157\0\156\0\163)
+ /Parent 621 0 R
+ /Next 624 0 R
+ /A 622 0 R
+>> endobj
+624 0 obj
+<<
+ /Title (\376\377\0\70\0\56\0\61\0\56\0\62\0\56\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\72\0\40\0\164\0\150\0\145\0\40\0\101\0\103\0\114\0\40\0\155\0\145\0\164\0\150\0\157\0\144)
+ /Parent 621 0 R
+ /Prev 623 0 R
+ /Next 625 0 R
+ /A 132 0 R
+>> endobj
+625 0 obj
+<<
+ /Title (\376\377\0\70\0\56\0\61\0\56\0\63\0\56\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\72\0\40\0\101\0\103\0\114\0\40\0\155\0\145\0\164\0\150\0\157\0\144\0\40\0\146\0\141\0\151\0\154\0\165\0\162\0\145\0\40\0\144\0\165\0\145\0\40\0\164\0\157\0\40\0\160\0\162\0\157\0\164\0\145\0\143\0\164\0\145\0\144\0\40\0\101\0\103\0\105\0\40\0\143\0\157\0\156\0\146\0\154\0\151\0\143\0\164)
+ /Parent 621 0 R
+ /Prev 624 0 R
+ /Next 626 0 R
+ /A 134 0 R
+>> endobj
+626 0 obj
+<<
+ /Title (\376\377\0\70\0\56\0\61\0\56\0\64\0\56\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\72\0\40\0\101\0\103\0\114\0\40\0\155\0\145\0\164\0\150\0\157\0\144\0\40\0\146\0\141\0\151\0\154\0\165\0\162\0\145\0\40\0\144\0\165\0\145\0\40\0\164\0\157\0\40\0\141\0\156\0\40\0\151\0\156\0\150\0\145\0\162\0\151\0\164\0\145\0\144\0\40\0\101\0\103\0\105\0\40\0\143\0\157\0\156\0\146\0\154\0\151\0\143\0\164)
+ /Parent 621 0 R
+ /Prev 625 0 R
+ /Next 627 0 R
+ /A 136 0 R
+>> endobj
+627 0 obj
+<<
+ /Title (\376\377\0\70\0\56\0\61\0\56\0\65\0\56\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\72\0\40\0\101\0\103\0\114\0\40\0\155\0\145\0\164\0\150\0\157\0\144\0\40\0\146\0\141\0\151\0\154\0\165\0\162\0\145\0\40\0\144\0\165\0\145\0\40\0\164\0\157\0\40\0\141\0\156\0\40\0\141\0\164\0\164\0\145\0\155\0\160\0\164\0\40\0\164\0\157\0\40\0\163\0\145\0\164\0\40\0\147\0\162\0\141\0\156\0\164\0\40\0\141\0\156\0\144\0\40\0\144\0\145\0\156\0\171\0\40\0\151\0\156\0\40\0\141\0\40\0\163\0\151\0\156\0\147\0\154\0\145\0\40\0\101\0\103\0\105)
+ /Parent 621 0 R
+ /Prev 626 0 R
+ /A 138 0 R
+>> endobj
+629 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\40\0\101\0\143\0\143\0\145\0\163\0\163\0\40\0\103\0\157\0\156\0\164\0\162\0\157\0\154\0\40\0\122\0\145\0\160\0\157\0\162\0\164\0\163)
+ /Parent 517 0 R
+ /First 630 0 R
+ /Last 642 0 R
+ /Prev 619 0 R
+ /Next 645 0 R
+ /Count -10
+ /A 628 0 R
+>> endobj
+630 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\61\0\56\0\40\0\122\0\105\0\120\0\117\0\122\0\124\0\40\0\115\0\145\0\164\0\150\0\157\0\144)
+ /Parent 629 0 R
+ /Next 632 0 R
+ /A 142 0 R
+>> endobj
+632 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\62\0\56\0\40\0\104\0\101\0\126\0\72\0\141\0\143\0\154\0\55\0\160\0\162\0\151\0\156\0\143\0\151\0\160\0\141\0\154\0\55\0\160\0\162\0\157\0\160\0\55\0\163\0\145\0\164\0\40\0\122\0\145\0\160\0\157\0\162\0\164)
+ /Parent 629 0 R
+ /First 633 0 R
+ /Last 633 0 R
+ /Prev 630 0 R
+ /Next 635 0 R
+ /Count -1
+ /A 631 0 R
+>> endobj
+633 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\62\0\56\0\61\0\56\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\72\0\40\0\104\0\101\0\126\0\72\0\141\0\143\0\154\0\55\0\160\0\162\0\151\0\156\0\143\0\151\0\160\0\141\0\154\0\55\0\160\0\162\0\157\0\160\0\55\0\163\0\145\0\164\0\40\0\122\0\145\0\160\0\157\0\162\0\164)
+ /Parent 632 0 R
+ /A 146 0 R
+>> endobj
+635 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\63\0\56\0\40\0\104\0\101\0\126\0\72\0\160\0\162\0\151\0\156\0\143\0\151\0\160\0\141\0\154\0\55\0\155\0\141\0\164\0\143\0\150\0\40\0\122\0\105\0\120\0\117\0\122\0\124)
+ /Parent 629 0 R
+ /First 636 0 R
+ /Last 636 0 R
+ /Prev 632 0 R
+ /Next 638 0 R
+ /Count -1
+ /A 634 0 R
+>> endobj
+636 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\63\0\56\0\61\0\56\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\72\0\40\0\104\0\101\0\126\0\72\0\160\0\162\0\151\0\156\0\143\0\151\0\160\0\141\0\154\0\55\0\155\0\141\0\164\0\143\0\150\0\40\0\122\0\105\0\120\0\117\0\122\0\124)
+ /Parent 635 0 R
+ /A 150 0 R
+>> endobj
+638 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\64\0\56\0\40\0\104\0\101\0\126\0\72\0\160\0\162\0\151\0\156\0\143\0\151\0\160\0\141\0\154\0\55\0\160\0\162\0\157\0\160\0\145\0\162\0\164\0\171\0\55\0\163\0\145\0\141\0\162\0\143\0\150\0\40\0\122\0\105\0\120\0\117\0\122\0\124)
+ /Parent 629 0 R
+ /First 639 0 R
+ /Last 640 0 R
+ /Prev 635 0 R
+ /Next 642 0 R
+ /Count -2
+ /A 637 0 R
+>> endobj
+639 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\64\0\56\0\61\0\56\0\40\0\115\0\141\0\164\0\143\0\150\0\151\0\156\0\147)
+ /Parent 638 0 R
+ /Next 640 0 R
+ /A 154 0 R
+>> endobj
+640 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\64\0\56\0\62\0\56\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\72\0\40\0\163\0\165\0\143\0\143\0\145\0\163\0\163\0\146\0\165\0\154\0\40\0\104\0\101\0\126\0\72\0\160\0\162\0\151\0\156\0\143\0\151\0\160\0\141\0\154\0\55\0\160\0\162\0\157\0\160\0\145\0\162\0\164\0\171\0\55\0\163\0\145\0\141\0\162\0\143\0\150\0\40\0\122\0\105\0\120\0\117\0\122\0\124)
+ /Parent 638 0 R
+ /Prev 639 0 R
+ /A 156 0 R
+>> endobj
+642 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\65\0\56\0\40\0\104\0\101\0\126\0\72\0\160\0\162\0\151\0\156\0\143\0\151\0\160\0\141\0\154\0\55\0\163\0\145\0\141\0\162\0\143\0\150\0\55\0\160\0\162\0\157\0\160\0\145\0\162\0\164\0\171\0\55\0\163\0\145\0\164\0\40\0\122\0\105\0\120\0\117\0\122\0\124)
+ /Parent 629 0 R
+ /First 643 0 R
+ /Last 643 0 R
+ /Prev 638 0 R
+ /Count -1
+ /A 641 0 R
+>> endobj
+643 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\65\0\56\0\61\0\56\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\72\0\40\0\104\0\101\0\126\0\72\0\160\0\162\0\151\0\156\0\143\0\151\0\160\0\141\0\154\0\55\0\163\0\145\0\141\0\162\0\143\0\150\0\55\0\160\0\162\0\157\0\160\0\145\0\162\0\164\0\171\0\55\0\163\0\145\0\164\0\40\0\122\0\105\0\120\0\117\0\122\0\124)
+ /Parent 642 0 R
+ /A 160 0 R
+>> endobj
+645 0 obj
+<<
+ /Title (\376\377\0\61\0\60\0\56\0\40\0\130\0\115\0\114\0\40\0\120\0\162\0\157\0\143\0\145\0\163\0\163\0\151\0\156\0\147)
+ /Parent 517 0 R
+ /Prev 629 0 R
+ /Next 647 0 R
+ /A 644 0 R
+>> endobj
+647 0 obj
+<<
+ /Title (\376\377\0\61\0\61\0\56\0\40\0\111\0\156\0\164\0\145\0\162\0\156\0\141\0\164\0\151\0\157\0\156\0\141\0\154\0\151\0\172\0\141\0\164\0\151\0\157\0\156\0\40\0\103\0\157\0\156\0\163\0\151\0\144\0\145\0\162\0\141\0\164\0\151\0\157\0\156\0\163)
+ /Parent 517 0 R
+ /Prev 645 0 R
+ /Next 649 0 R
+ /A 646 0 R
+>> endobj
+649 0 obj
+<<
+ /Title (\376\377\0\61\0\62\0\56\0\40\0\123\0\145\0\143\0\165\0\162\0\151\0\164\0\171\0\40\0\103\0\157\0\156\0\163\0\151\0\144\0\145\0\162\0\141\0\164\0\151\0\157\0\156\0\163)
+ /Parent 517 0 R
+ /First 650 0 R
+ /Last 652 0 R
+ /Prev 647 0 R
+ /Next 654 0 R
+ /Count -3
+ /A 648 0 R
+>> endobj
+650 0 obj
+<<
+ /Title (\376\377\0\61\0\62\0\56\0\61\0\56\0\40\0\111\0\156\0\143\0\162\0\145\0\141\0\163\0\145\0\144\0\40\0\122\0\151\0\163\0\153\0\40\0\157\0\146\0\40\0\103\0\157\0\155\0\160\0\162\0\157\0\155\0\151\0\163\0\145\0\144\0\40\0\125\0\163\0\145\0\162\0\163)
+ /Parent 649 0 R
+ /Next 651 0 R
+ /A 168 0 R
+>> endobj
+651 0 obj
+<<
+ /Title (\376\377\0\61\0\62\0\56\0\62\0\56\0\40\0\122\0\151\0\163\0\153\0\163\0\40\0\157\0\146\0\40\0\164\0\150\0\145\0\40\0\104\0\101\0\126\0\72\0\162\0\145\0\141\0\144\0\55\0\141\0\143\0\154\0\40\0\141\0\156\0\144\0\40\0\104\0\101\0\126\0\72\0\143\0\165\0\162\0\162\0\145\0\156\0\164\0\55\0\165\0\163\0\145\0\162\0\55\0\160\0\162\0\151\0\166\0\151\0\154\0\145\0\147\0\145\0\55\0\163\0\145\0\164\0\40\0\120\0\162\0\151\0\166\0\151\0\154\0\145\0\147\0\145\0\163)
+ /Parent 649 0 R
+ /Prev 650 0 R
+ /Next 652 0 R
+ /A 170 0 R
+>> endobj
+652 0 obj
+<<
+ /Title (\376\377\0\61\0\62\0\56\0\63\0\56\0\40\0\116\0\157\0\40\0\106\0\157\0\162\0\145\0\153\0\156\0\157\0\167\0\154\0\145\0\144\0\147\0\145\0\40\0\157\0\146\0\40\0\111\0\156\0\151\0\164\0\151\0\141\0\154\0\40\0\101\0\103\0\114)
+ /Parent 649 0 R
+ /Prev 651 0 R
+ /A 172 0 R
+>> endobj
+654 0 obj
+<<
+ /Title (\376\377\0\61\0\63\0\56\0\40\0\101\0\165\0\164\0\150\0\145\0\156\0\164\0\151\0\143\0\141\0\164\0\151\0\157\0\156)
+ /Parent 517 0 R
+ /Prev 649 0 R
+ /Next 655 0 R
+ /A 653 0 R
+>> endobj
+655 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\40\0\111\0\101\0\116\0\101\0\40\0\103\0\157\0\156\0\163\0\151\0\144\0\145\0\162\0\141\0\164\0\151\0\157\0\156\0\163)
+ /Parent 517 0 R
+ /Prev 654 0 R
+ /Next 656 0 R
+ /A 176 0 R
+>> endobj
+656 0 obj
+<<
+ /Title (\376\377\0\61\0\65\0\56\0\40\0\101\0\143\0\153\0\156\0\157\0\167\0\154\0\145\0\144\0\147\0\145\0\155\0\145\0\156\0\164\0\163)
+ /Parent 517 0 R
+ /Prev 655 0 R
+ /Next 657 0 R
+ /A 178 0 R
+>> endobj
+657 0 obj
+<<
+ /Title (\376\377\0\61\0\66\0\56\0\40\0\122\0\145\0\146\0\145\0\162\0\145\0\156\0\143\0\145\0\163)
+ /Parent 517 0 R
+ /First 658 0 R
+ /Last 659 0 R
+ /Prev 656 0 R
+ /Next 661 0 R
+ /Count -2
+ /A 183 0 R
+>> endobj
+658 0 obj
+<<
+ /Title (\376\377\0\61\0\66\0\56\0\61\0\56\0\40\0\116\0\157\0\162\0\155\0\141\0\164\0\151\0\166\0\145\0\40\0\122\0\145\0\146\0\145\0\162\0\145\0\156\0\143\0\145\0\163)
+ /Parent 657 0 R
+ /Next 659 0 R
+ /A 185 0 R
+>> endobj
+659 0 obj
+<<
+ /Title (\376\377\0\61\0\66\0\56\0\62\0\56\0\40\0\111\0\156\0\146\0\157\0\162\0\155\0\141\0\164\0\151\0\166\0\145\0\40\0\122\0\145\0\146\0\145\0\162\0\145\0\156\0\143\0\145\0\163)
+ /Parent 657 0 R
+ /Prev 658 0 R
+ /A 187 0 R
+>> endobj
+661 0 obj
+<<
+ /Title (\376\377\0\101\0\56\0\40\0\127\0\145\0\142\0\104\0\101\0\126\0\40\0\130\0\115\0\114\0\40\0\104\0\157\0\143\0\165\0\155\0\145\0\156\0\164\0\40\0\124\0\171\0\160\0\145\0\40\0\104\0\145\0\146\0\151\0\156\0\151\0\164\0\151\0\157\0\156\0\40\0\101\0\144\0\144\0\145\0\156\0\144\0\165\0\155)
+ /Parent 517 0 R
+ /Prev 657 0 R
+ /Next 662 0 R
+ /A 660 0 R
+>> endobj
+662 0 obj
+<<
+ /Title (\376\377\0\102\0\56\0\40\0\127\0\145\0\142\0\104\0\101\0\126\0\40\0\115\0\145\0\164\0\150\0\157\0\144\0\40\0\120\0\162\0\151\0\166\0\151\0\154\0\145\0\147\0\145\0\40\0\124\0\141\0\142\0\154\0\145\0\40\0\50\0\116\0\157\0\162\0\155\0\141\0\164\0\151\0\166\0\145\0\51)
+ /Parent 517 0 R
+ /Prev 661 0 R
+ /Next 663 0 R
+ /A 191 0 R
+>> endobj
+663 0 obj
+<<
+ /Title (\376\377\0\101\0\165\0\164\0\150\0\157\0\162\0\163\0\47\0\40\0\101\0\144\0\144\0\162\0\145\0\163\0\163\0\145\0\163)
+ /Parent 517 0 R
+ /Prev 662 0 R
+ /Next 664 0 R
+ /A 193 0 R
+>> endobj
+664 0 obj
+<<
+ /Title (\376\377\0\111\0\156\0\164\0\145\0\154\0\154\0\145\0\143\0\164\0\165\0\141\0\154\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\171\0\40\0\141\0\156\0\144\0\40\0\103\0\157\0\160\0\171\0\162\0\151\0\147\0\150\0\164\0\40\0\123\0\164\0\141\0\164\0\145\0\155\0\145\0\156\0\164\0\163)
+ /Parent 517 0 R
+ /Prev 663 0 R
+ /Next 665 0 R
+ /A 195 0 R
+>> endobj
+665 0 obj
+<<
+ /Title (\376\377\0\111\0\156\0\144\0\145\0\170)
+ /Parent 517 0 R
+ /Prev 664 0 R
+ /A 197 0 R
+>> endobj
+666 0 obj
+<< /Type /Font
+/Subtype /Type1
+/Name /F5
+/BaseFont /Times-Roman
+/Encoding /WinAnsiEncoding >>
+endobj
+667 0 obj
+<< /Type /Font
+/Subtype /Type1
+/Name /F6
+/BaseFont /Times-Italic
+/Encoding /WinAnsiEncoding >>
+endobj
+668 0 obj
+<< /Type /Font
+/Subtype /Type1
+/Name /F9
+/BaseFont /Courier
+/Encoding /WinAnsiEncoding >>
+endobj
+669 0 obj
+<< /Type /Font
+/Subtype /Type1
+/Name /F7
+/BaseFont /Times-Bold
+/Encoding /WinAnsiEncoding >>
+endobj
+1 0 obj
+<< /Type /Pages
+/Count 62
+/Kids [6 0 R 8 0 R 93 0 R 180 0 R 199 0 R 207 0 R 229 0 R 238 0 R 242 0 R 248 0 R 252 0 R 257 0 R 259 0 R 269 0 R 271 0 R 276 0 R 283 0 R 285 0 R 289 0 R 291 0 R 296 0 R 298 0 R 304 0 R 306 0 R 308 0 R 313 0 R 315 0 R 317 0 R 319 0 R 321 0 R 326 0 R 328 0 R 330 0 R 332 0 R 336 0 R 343 0 R 347 0 R 349 0 R 351 0 R 357 0 R 359 0 R 363 0 R 368 0 R 374 0 R 376 0 R 380 0 R 384 0 R 386 0 R 392 0 R 402 0 R 408 0 R 412 0 R 417 0 R 419 0 R 441 0 R 453 0 R 462 0 R 464 0 R 499 0 R 506 0 R 512 0 R 515 0 R ] >>
+endobj
+2 0 obj
+<< /Type /Catalog
+/Pages 1 0 R
+ /Outlines 517 0 R
+ /PageMode /UseOutlines
+ /Names << /Dests << /Names [ (rfc.status) [ 6 0 R /XYZ 67.0 465.084 null ] (rfc.copyrightnotice) [ 6 0 R /XYZ 67.0 374.95 null ] (rfc.abstract) [ 6 0 R /XYZ 67.0 317.816 null ] (rfc.toc) [ 8 0 R /XYZ 67.0 725.0 null ] (rfc.section.1) [ 199 0 R /XYZ 67.0 725.0 null ] (rfc.xref.RFC2617.1) [ 199 0 R /XYZ 67.0 163.866 null ] (rfc.section.1.1) [ 207 0 R /XYZ 67.0 502.0 null ] (terms) [ 207 0 R /XYZ 67.0 502.0 null ] (rfc.xref.RFC2616.1) [ 207 0 R /XYZ 67.0 478.028 null ] (rfc.xref.RFC2518.1) [ 207 0 R /XYZ 67.0 478.028 null ] (rfc.iref.1) [ 207 0 R /XYZ 67.0 446.028 null ] (rfc.iref.2) [ 207 0 R /XYZ 67.0 398.028 null ] (rfc.iref.3) [ 207 0 R /XYZ 67.0 361.028 null ] (rfc.iref.4) [ 207 0 R /XYZ 67.0 324.028 null ] (rfc.iref.5) [ 207 0 R /XYZ 67.0 287.028 null ] (rfc.iref.6) [ 207 0 R /XYZ 67.0 239.028 null ] (rfc.iref.7) [ 207 0 R /XYZ 67.0 239.028 null ] (rfc.iref.8) [ 207 0 R /XYZ 67.0 202.028 null ] (rfc.iref.9) [ 207 0 R /XYZ 67.0 202.028 null ] (rfc.iref.10) [ 207 0 R /XYZ 67.0 165.028 null ] (rfc.iref.11) [ 207 0 R /XYZ 67.0 117.028 null ] (rfc.section.1.2) [ 229 0 R /XYZ 67.0 692.0 null ] (rfc.xref.RFC2616.2) [ 229 0 R /XYZ 67.0 668.028 null ] (rfc.xref.RFC2616.3) [ 229 0 R /XYZ 67.0 657.028 null ] (rfc.xref.RFC2119.1) [ 229 0 R /XYZ 67.0 614.028 null ] (rfc.xref.REC-XML.1) [ 229 0 R /XYZ 67.0 571.028 null ] (rfc.section.2) [ 238 0 R /XYZ 67.0 725.0 null ] (principals) [ 238 0 R /XYZ 67.0 725.0 null ] (rfc.section.3) [ 242 0 R /XYZ 67.0 725.0 null ] (privileges) [ 242 0 R /XYZ 67.0 725.0 null ] (rfc.xref.RFC2518.2) [ 242 0 R /XYZ 67.0 337.866 null ] (rfc.section.3.1) [ 242 0 R /XYZ 67.0 233.866 null ] (PRIVILEGE_read) [ 242 0 R /XYZ 67.0 233.866 null ] (rfc.figure.u.1) [ 242 0 R /XYZ 67.0 144.894 null ] (rfc.section.3.2) [ 242 0 R /XYZ 67.0 108.034 null ] (PRIVILEGE_write) [ 242 0 R /XYZ 67.0 108.034 null ] (rfc.xref.RFC2518.3) [ 248 0 R /XYZ 67.0 698.0 null ] (rfc.figure.u.2) [ 248 0 R /XYZ 67.0 633.0 null ] (rfc.section.3.3) [ 248 0 R /XYZ 67.0 596.14 null ] (PRIVILEGE_write-properties) [ 248 0 R /XYZ 67.0 596.14 null ] (rfc.figure.u.3) [ 248 0 R /XYZ 67.0 496.168 null ] (rfc.section.3.4) [ 248 0 R /XYZ 67.0 459.308 null ] (PRIVILEGE_write-content) [ 248 0 R /XYZ 67.0 459.308 null ] (rfc.figure.u.4) [ 248 0 R /XYZ 67.0 370.336 null ] (rfc.section.3.5) [ 248 0 R /XYZ 67.0 333.476 null ] (PRIVILEGE_unlock) [ 248 0 R /XYZ 67.0 333.476 null ] (rfc.figure.u.5) [ 248 0 R /XYZ 67.0 190.504 null ] (rfc.section.3.6) [ 248 0 R /XYZ 67.0 153.644 null ] (PRIVILEGE_read-acl) [ 248 0 R /XYZ 67.0 153.644 null ] (rfc.figure.u.6) [ 248 0 R /XYZ 67.0 108.672 null ] (rfc.section.3.7) [ 252 0 R /XYZ 67.0 708.0 null ] (PRIVILEGE_read-current-user-privilege-set) [ 252 0 R /XYZ 67.0 708.0 null ] (rfc.figure.u.7) [ 252 0 R /XYZ 67.0 555.028 null ] (rfc.section.3.8) [ 252 0 R /XYZ 67.0 518.168 null ] (PRIVILEGE_write-acl) [ 252 0 R /XYZ 67.0 518.168 null ] (rfc.figure.u.8) [ 252 0 R /XYZ 67.0 473.196 null ] (rfc.section.3.9) [ 252 0 R /XYZ 67.0 436.336 null ] (PRIVILEGE_bind) [ 252 0 R /XYZ 67.0 436.336 null ] (rfc.figure.u.9) [ 252 0 R /XYZ 67.0 380.364 null ] (rfc.section.3.10) [ 252 0 R /XYZ 67.0 343.504 null ] (PRIVILEGE_unbind) [ 252 0 R /XYZ 67.0 343.504 null ] (rfc.figure.u.10) [ 252 0 R /XYZ 67.0 287.532 null ] (rfc.section.3.11) [ 252 0 R /XYZ 67.0 250.672 null ] (PRIVILEGE_all) [ 252 0 R /XYZ 67.0 250.672 null ] (rfc.figure.u.11) [ 252 0 R /XYZ 67.0 205.7 null ] (rfc.section.3.12) [ 252 0 R /XYZ 67.0 168.84 null ] (aggregation.of.predefined.privileges) [ 252 0 R /XYZ 67.0 168.84 null ] (rfc.section.4) [ 259 0 R /XYZ 67.0 725.0 null ] (principal.properties) [ 259 0 R /XYZ 67.0 725.0 null ] (rfc.xref.RFC2518.4) [ 259 0 R /XYZ 67.0 686.866 null ] (rfc.xref.RFC2518.5) [ 259 0 R /XYZ 67.0 675.866 null ] (rfc.figure.u.12) [ 259 0 R /XYZ 67.0 632.866 null ] (rfc.xref.RFC2518.6) [ 259 0 R /XYZ 67.0 581.006 null ] (rfc.section.4.1) [ 259 0 R /XYZ 67.0 553.006 null ] (PROPERTY_alternate-URI-set) [ 259 0 R /XYZ 67.0 553.006 null ] (rfc.xref.RFC2255.1) [ 259 0 R /XYZ 67.0 496.034 null ] (rfc.xref.RFC2251.1) [ 259 0 R /XYZ 67.0 485.034 null ] (rfc.figure.u.13) [ 259 0 R /XYZ 67.0 442.034 null ] (rfc.section.4.2) [ 259 0 R /XYZ 67.0 405.174 null ] (PROPERTY_principal-URL) [ 259 0 R /XYZ 67.0 405.174 null ] (rfc.figure.u.14) [ 259 0 R /XYZ 67.0 338.202 null ] (rfc.section.4.3) [ 259 0 R /XYZ 67.0 301.342 null ] (rfc.figure.u.15) [ 259 0 R /XYZ 67.0 223.37 null ] (rfc.section.4.4) [ 259 0 R /XYZ 67.0 186.51 null ] (rfc.figure.u.16) [ 259 0 R /XYZ 67.0 108.538 null ] (rfc.section.5) [ 271 0 R /XYZ 67.0 725.0 null ] (access.control.properties) [ 271 0 R /XYZ 67.0 725.0 null ] (rfc.xref.RFC2518.7) [ 271 0 R /XYZ 67.0 675.866 null ] (rfc.xref.RFC2518.8) [ 271 0 R /XYZ 67.0 589.866 null ] (rfc.section.5.1) [ 271 0 R /XYZ 67.0 561.866 null ] (PROPERTY_owner) [ 271 0 R /XYZ 67.0 561.866 null ] (rfc.figure.u.17) [ 271 0 R /XYZ 67.0 462.894 null ] (rfc.section.5.1.1) [ 271 0 R /XYZ 67.0 427.034 null ] (rfc.figure.u.18) [ 271 0 R /XYZ 67.0 353.143 null ] (rfc.figure.u.19) [ 271 0 R /XYZ 67.0 168.243 null ] (rfc.section.5.1.2) [ 276 0 R /XYZ 67.0 589.54 null ] (rfc.xref.RFC2518.9) [ 276 0 R /XYZ 67.0 536.649 null ] (rfc.xref.RFC2518.10) [ 276 0 R /XYZ 67.0 525.649 null ] (rfc.xref.RFC3253.1) [ 276 0 R /XYZ 67.0 525.649 null ] (rfc.xref.RFC3253.2) [ 276 0 R /XYZ 67.0 525.649 null ] (rfc.xref.RFC3253.3) [ 276 0 R /XYZ 67.0 525.649 null ] (rfc.figure.u.20) [ 276 0 R /XYZ 67.0 493.649 null ] (rfc.figure.u.21) [ 276 0 R /XYZ 67.0 269.309 null ] (rfc.section.5.2) [ 283 0 R /XYZ 67.0 687.14 null ] (PROPERTY_group) [ 283 0 R /XYZ 67.0 687.14 null ] (rfc.figure.u.22) [ 283 0 R /XYZ 67.0 599.168 null ] (rfc.section.5.3) [ 283 0 R /XYZ 67.0 562.308 null ] (PROPERTY_supported-privilege-set) [ 283 0 R /XYZ 67.0 562.308 null ] (rfc.figure.u.23) [ 283 0 R /XYZ 67.0 517.336 null ] (rfc.figure.u.24) [ 283 0 R /XYZ 67.0 455.476 null ] (rfc.figure.u.25) [ 283 0 R /XYZ 67.0 373.896 null ] (rfc.figure.u.26) [ 283 0 R /XYZ 67.0 301.036 null ] (rfc.section.5.3.1) [ 283 0 R /XYZ 67.0 189.176 null ] (example.retrieving.a.list.of.privileges.supported.on.a.resource) [ 283 0 R /XYZ 67.0 189.176 null ] (rfc.figure.u.27) [ 283 0 R /XYZ 67.0 126.285 null ] (rfc.figure.u.28) [ 285 0 R /XYZ 67.0 594.134 null ] (rfc.figure.u.29) [ 285 0 R /XYZ 67.0 409.234 null ] (rfc.section.5.4) [ 289 0 R /XYZ 67.0 263.16 null ] (PROPERTY_current-user-privilege-set) [ 289 0 R /XYZ 67.0 263.16 null ] (rfc.figure.u.30) [ 289 0 R /XYZ 67.0 163.188 null ] (rfc.section.5.4.1) [ 289 0 R /XYZ 67.0 74.468 null ] (example.retrieving.the.users.current.set.of.assigned.privileges) [ 291 0 R /XYZ 67.0 725.0 null ] (rfc.figure.u.31) [ 291 0 R /XYZ 67.0 585.109 null ] (rfc.figure.u.32) [ 291 0 R /XYZ 67.0 400.209 null ] (rfc.section.5.5) [ 291 0 R /XYZ 67.0 178.729 null ] (PROPERTY_acl) [ 291 0 R /XYZ 67.0 178.729 null ] (rfc.figure.u.33) [ 291 0 R /XYZ 67.0 122.757 null ] (rfc.figure.u.34) [ 296 0 R /XYZ 67.0 699.0 null ] (rfc.section.5.5.1) [ 296 0 R /XYZ 67.0 653.28 null ] (ace.principal) [ 296 0 R /XYZ 67.0 653.28 null ] (rfc.figure.u.35) [ 296 0 R /XYZ 67.0 612.389 null ] (rfc.figure.u.36) [ 296 0 R /XYZ 67.0 519.669 null ] (rfc.figure.u.37) [ 296 0 R /XYZ 67.0 468.809 null ] (rfc.figure.u.38) [ 296 0 R /XYZ 67.0 417.949 null ] (rfc.figure.u.39) [ 296 0 R /XYZ 67.0 269.089 null ] (rfc.figure.u.40) [ 296 0 R /XYZ 67.0 196.229 null ] (rfc.figure.u.41) [ 296 0 R /XYZ 67.0 134.369 null ] (rfc.section.5.5.2) [ 296 0 R /XYZ 67.0 98.509 null ] (rfc.figure.u.42) [ 298 0 R /XYZ 67.0 677.0 null ] (rfc.section.5.5.3) [ 298 0 R /XYZ 67.0 621.42 null ] (ace.protection) [ 298 0 R /XYZ 67.0 621.42 null ] (rfc.figure.u.43) [ 298 0 R /XYZ 67.0 558.529 null ] (rfc.section.5.5.4) [ 298 0 R /XYZ 67.0 522.669 null ] (rfc.figure.u.44) [ 298 0 R /XYZ 67.0 405.778 null ] (rfc.section.5.5.5) [ 298 0 R /XYZ 67.0 369.918 null ] (rfc.figure.u.45) [ 298 0 R /XYZ 67.0 221.027 null ] (rfc.figure.u.46) [ 304 0 R /XYZ 67.0 684.28 null ] (rfc.section.5.6) [ 304 0 R /XYZ 67.0 314.9 null ] (PROPERTY_acl-restrictions) [ 304 0 R /XYZ 67.0 314.9 null ] (rfc.figure.u.47) [ 304 0 R /XYZ 67.0 183.928 null ] (rfc.section.5.6.1) [ 304 0 R /XYZ 67.0 128.348 null ] (RESTRICTIONS_grant-only) [ 304 0 R /XYZ 67.0 128.348 null ] (rfc.figure.u.48) [ 304 0 R /XYZ 67.0 87.457 null ] (rfc.section.5.6.2) [ 306 0 R /XYZ 67.0 689.14 null ] (CONSTRAINT_no-invert) [ 306 0 R /XYZ 67.0 689.14 null ] (rfc.figure.u.49) [ 306 0 R /XYZ 67.0 648.249 null ] (rfc.section.5.6.3) [ 306 0 R /XYZ 67.0 612.389 null ] (rfc.figure.u.50) [ 306 0 R /XYZ 67.0 571.498 null ] (rfc.section.5.6.4) [ 306 0 R /XYZ 67.0 535.638 null ] (rfc.figure.u.51) [ 306 0 R /XYZ 67.0 494.747 null ] (rfc.figure.u.52) [ 306 0 R /XYZ 67.0 424.167 null ] (rfc.section.5.6.5) [ 306 0 R /XYZ 67.0 368.587 null ] (rfc.figure.u.53) [ 306 0 R /XYZ 67.0 316.696 null ] (rfc.figure.u.54) [ 306 0 R /XYZ 67.0 131.796 null ] (rfc.section.5.7) [ 308 0 R /XYZ 67.0 519.52 null ] (PROPERTY_inherited-acl-set) [ 308 0 R /XYZ 67.0 519.52 null ] (rfc.figure.u.55) [ 308 0 R /XYZ 67.0 430.548 null ] (rfc.section.5.8) [ 308 0 R /XYZ 67.0 393.688 null ] (PROPERTY_principal-collection-set) [ 308 0 R /XYZ 67.0 393.688 null ] (rfc.xref.RFC2518.11) [ 308 0 R /XYZ 67.0 336.716 null ] (rfc.figure.u.56) [ 308 0 R /XYZ 67.0 304.716 null ] (rfc.section.5.8.1) [ 308 0 R /XYZ 67.0 116.856 null ] (rfc.figure.u.57) [ 313 0 R /XYZ 67.0 634.0 null ] (rfc.figure.u.58) [ 313 0 R /XYZ 67.0 449.1 null ] (rfc.section.5.9) [ 313 0 R /XYZ 67.0 217.76 null ] (rfc.figure.u.59) [ 313 0 R /XYZ 67.0 150.788 null ] (rfc.figure.u.60) [ 315 0 R /XYZ 67.0 575.82 null ] (rfc.figure.u.61) [ 319 0 R /XYZ 67.0 640.0 null ] (rfc.section.6) [ 321 0 R /XYZ 67.0 725.0 null ] (acl.evaluation) [ 321 0 R /XYZ 67.0 725.0 null ] (rfc.xref.RFC3530.1) [ 321 0 R /XYZ 67.0 697.866 null ] (rfc.figure.u.62) [ 321 0 R /XYZ 67.0 545.866 null ] (rfc.figure.u.63) [ 321 0 R /XYZ 67.0 142.032 null ] (rfc.section.7) [ 328 0 R /XYZ 67.0 725.0 null ] (access.control.and.existing.methods) [ 328 0 R /XYZ 67.0 725.0 null ] (rfc.section.7.1) [ 328 0 R /XYZ 67.0 669.866 null ] (rfc.section.7.1.1) [ 328 0 R /XYZ 67.0 639.894 null ] (rfc.xref.RFC3253.4) [ 328 0 R /XYZ 67.0 620.003 null ] (rfc.figure.u.64) [ 328 0 R /XYZ 67.0 544.003 null ] (rfc.figure.u.65) [ 328 0 R /XYZ 67.0 461.283 null ] (rfc.figure.u.66) [ 328 0 R /XYZ 67.0 394.703 null ] (rfc.section.7.2) [ 328 0 R /XYZ 67.0 192.943 null ] (METHOD_options) [ 328 0 R /XYZ 67.0 192.943 null ] (rfc.section.7.2.1) [ 328 0 R /XYZ 67.0 108.971 null ] (rfc.figure.u.67) [ 328 0 R /XYZ 67.0 89.08 null ] (rfc.figure.u.68) [ 330 0 R /XYZ 67.0 674.42 null ] (rfc.section.7.3) [ 330 0 R /XYZ 67.0 568.84 null ] (rfc.section.7.4) [ 330 0 R /XYZ 67.0 483.868 null ] (rfc.section.7.5) [ 330 0 R /XYZ 67.0 387.896 null ] (rfc.section.8) [ 332 0 R /XYZ 67.0 725.0 null ] (access.control.methods) [ 332 0 R /XYZ 67.0 725.0 null ] (rfc.section.8.1) [ 332 0 R /XYZ 67.0 690.866 null ] (METHOD_ACL) [ 332 0 R /XYZ 67.0 690.866 null ] (rfc.section.8.1.1) [ 332 0 R /XYZ 67.0 417.894 null ] (acl.preconditions) [ 332 0 R /XYZ 67.0 417.894 null ] (rfc.iref.65) [ 332 0 R /XYZ 67.0 301.003 null ] (rfc.iref.66) [ 332 0 R /XYZ 67.0 301.003 null ] (rfc.iref.67) [ 332 0 R /XYZ 67.0 269.003 null ] (rfc.iref.68) [ 332 0 R /XYZ 67.0 269.003 null ] (rfc.iref.69) [ 332 0 R /XYZ 67.0 215.003 null ] (rfc.iref.70) [ 332 0 R /XYZ 67.0 215.003 null ] (rfc.iref.71) [ 332 0 R /XYZ 67.0 139.003 null ] (rfc.iref.72) [ 332 0 R /XYZ 67.0 139.003 null ] (rfc.iref.73) [ 332 0 R /XYZ 67.0 96.003 null ] (rfc.iref.74) [ 332 0 R /XYZ 67.0 96.003 null ] (rfc.iref.75) [ 336 0 R /XYZ 67.0 720.0 null ] (rfc.iref.76) [ 336 0 R /XYZ 67.0 720.0 null ] (rfc.iref.77) [ 336 0 R /XYZ 67.0 677.0 null ] (rfc.iref.78) [ 336 0 R /XYZ 67.0 677.0 null ] (rfc.iref.79) [ 336 0 R /XYZ 67.0 645.0 null ] (rfc.iref.80) [ 336 0 R /XYZ 67.0 645.0 null ] (rfc.iref.81) [ 336 0 R /XYZ 67.0 613.0 null ] (rfc.iref.82) [ 336 0 R /XYZ 67.0 613.0 null ] (rfc.iref.83) [ 336 0 R /XYZ 67.0 592.0 null ] (rfc.iref.84) [ 336 0 R /XYZ 67.0 592.0 null ] (rfc.iref.85) [ 336 0 R /XYZ 67.0 549.0 null ] (rfc.iref.86) [ 336 0 R /XYZ 67.0 549.0 null ] (rfc.iref.87) [ 336 0 R /XYZ 67.0 528.0 null ] (rfc.iref.88) [ 336 0 R /XYZ 67.0 528.0 null ] (rfc.section.8.1.2) [ 336 0 R /XYZ 67.0 468.0 null ] (rfc.figure.u.69) [ 336 0 R /XYZ 67.0 394.109 null ] (rfc.figure.u.70) [ 343 0 R /XYZ 67.0 654.7 null ] (rfc.section.8.1.3) [ 343 0 R /XYZ 67.0 601.84 null ] (rfc.figure.u.71) [ 343 0 R /XYZ 67.0 505.949 null ] (rfc.figure.u.72) [ 343 0 R /XYZ 67.0 281.609 null ] (rfc.section.8.1.4) [ 343 0 R /XYZ 67.0 159.729 null ] (rfc.figure.u.73) [ 347 0 R /XYZ 67.0 602.0 null ] (rfc.figure.u.74) [ 347 0 R /XYZ 67.0 397.38 null ] (rfc.section.8.1.5) [ 347 0 R /XYZ 67.0 275.5 null ] (rfc.figure.u.75) [ 347 0 R /XYZ 67.0 168.609 null ] (rfc.figure.u.76) [ 349 0 R /XYZ 67.0 556.1 null ] (rfc.section.9) [ 351 0 R /XYZ 67.0 725.0 null ] (access.control.reports) [ 351 0 R /XYZ 67.0 725.0 null ] (rfc.section.9.1) [ 351 0 R /XYZ 67.0 690.866 null ] (rfc.xref.RFC3253.5) [ 351 0 R /XYZ 67.0 666.894 null ] (rfc.xref.RFC3253.6) [ 351 0 R /XYZ 67.0 579.894 null ] (rfc.section.9.2) [ 351 0 R /XYZ 67.0 551.894 null ] (REPORT_acl-principal-prop-set) [ 351 0 R /XYZ 67.0 551.894 null ] (rfc.figure.u.77) [ 351 0 R /XYZ 67.0 390.422 null ] (rfc.xref.RFC3253.7) [ 351 0 R /XYZ 67.0 319.982 null ] (rfc.figure.u.78) [ 351 0 R /XYZ 67.0 254.982 null ] (rfc.iref.91) [ 351 0 R /XYZ 67.0 166.122 null ] (rfc.iref.92) [ 351 0 R /XYZ 67.0 166.122 null ] (rfc.section.9.2.1) [ 351 0 R /XYZ 67.0 114.622 null ] (rfc.figure.u.79) [ 357 0 R /XYZ 67.0 592.0 null ] (rfc.figure.u.80) [ 357 0 R /XYZ 67.0 436.68 null ] (rfc.section.9.3) [ 357 0 R /XYZ 67.0 146.18 null ] (REPORT_principal-match) [ 357 0 R /XYZ 67.0 146.18 null ] (rfc.figure.u.81) [ 359 0 R /XYZ 67.0 647.5 null ] (rfc.xref.RFC3253.8) [ 359 0 R /XYZ 67.0 547.48 null ] (rfc.figure.u.82) [ 359 0 R /XYZ 67.0 498.48 null ] (rfc.section.9.3.1) [ 359 0 R /XYZ 67.0 357.12 null ] (rfc.figure.u.83) [ 359 0 R /XYZ 67.0 294.229 null ] (rfc.figure.u.84) [ 359 0 R /XYZ 67.0 109.329 null ] (rfc.section.9.4) [ 363 0 R /XYZ 67.0 558.96 null ] (REPORT_principal-property-search) [ 363 0 R /XYZ 67.0 558.96 null ] (rfc.xref.UNICODE4.1) [ 363 0 R /XYZ 67.0 316.488 null ] (rfc.figure.u.85) [ 363 0 R /XYZ 67.0 159.488 null ] (rfc.figure.u.86) [ 368 0 R /XYZ 67.0 679.5 null ] (rfc.xref.RFC3253.9) [ 368 0 R /XYZ 67.0 582.06 null ] (rfc.figure.u.87) [ 368 0 R /XYZ 67.0 528.06 null ] (rfc.iref.97) [ 368 0 R /XYZ 67.0 375.2 null ] (rfc.iref.98) [ 368 0 R /XYZ 67.0 375.2 null ] (rfc.section.9.4.1) [ 368 0 R /XYZ 67.0 323.7 null ] (rfc.xref.REC-XML-INFOSET.1) [ 368 0 R /XYZ 67.0 292.809 null ] (rfc.figure.u.88) [ 368 0 R /XYZ 67.0 249.809 null ] (rfc.figure.u.89) [ 368 0 R /XYZ 67.0 143.949 null ] (rfc.figure.u.90) [ 374 0 R /XYZ 67.0 688.0 null ] (rfc.section.9.4.2) [ 374 0 R /XYZ 67.0 589.56 null ] (rfc.figure.u.91) [ 374 0 R /XYZ 67.0 430.669 null ] (rfc.figure.u.92) [ 374 0 R /XYZ 67.0 117.589 null ] (rfc.section.9.5) [ 376 0 R /XYZ 67.0 292.74 null ] (REPORT_principal-search-property-set) [ 376 0 R /XYZ 67.0 292.74 null ] (rfc.xref.RFC3253.10) [ 380 0 R /XYZ 67.0 658.5 null ] (rfc.figure.u.93) [ 380 0 R /XYZ 67.0 582.5 null ] (rfc.figure.u.94) [ 380 0 R /XYZ 67.0 515.78 null ] (rfc.figure.u.95) [ 380 0 R /XYZ 67.0 458.92 null ] (rfc.figure.u.96) [ 380 0 R /XYZ 67.0 391.06 null ] (rfc.section.9.5.1) [ 380 0 R /XYZ 67.0 347.7 null ] (rfc.figure.u.97) [ 380 0 R /XYZ 67.0 284.809 null ] (rfc.figure.u.98) [ 380 0 R /XYZ 67.0 149.209 null ] (rfc.section.10) [ 386 0 R /XYZ 67.0 725.0 null ] (xml.processing) [ 386 0 R /XYZ 67.0 725.0 null ] (rfc.xref.RFC2518.12) [ 386 0 R /XYZ 67.0 686.866 null ] (rfc.xref.REC-XML-NAMES.1) [ 386 0 R /XYZ 67.0 686.866 null ] (rfc.section.11) [ 392 0 R /XYZ 67.0 725.0 null ] (internationalization.considerations) [ 392 0 R /XYZ 67.0 725.0 null ] (rfc.xref.REC-XML.2) [ 392 0 R /XYZ 67.0 653.866 null ] (rfc.xref.RFC3629.1) [ 392 0 R /XYZ 67.0 631.866 null ] (rfc.xref.RFC3023.1) [ 392 0 R /XYZ 67.0 620.866 null ] (rfc.xref.REC-XML.3) [ 392 0 R /XYZ 67.0 587.866 null ] (rfc.xref.RFC2518.13) [ 392 0 R /XYZ 67.0 425.866 null ] (rfc.section.12) [ 402 0 R /XYZ 67.0 725.0 null ] (security.considerations) [ 402 0 R /XYZ 67.0 725.0 null ] (rfc.xref.RFC2616.4) [ 402 0 R /XYZ 67.0 675.866 null ] (rfc.xref.RFC2518.14) [ 402 0 R /XYZ 67.0 675.866 null ] (rfc.xref.RFC3023.2) [ 402 0 R /XYZ 67.0 664.866 null ] (rfc.section.12.1) [ 402 0 R /XYZ 67.0 625.866 null ] (rfc.section.12.2) [ 402 0 R /XYZ 67.0 518.894 null ] (rfc.section.12.3) [ 402 0 R /XYZ 67.0 291.922 null ] (rfc.section.13) [ 408 0 R /XYZ 67.0 725.0 null ] (authentication) [ 408 0 R /XYZ 67.0 725.0 null ] (rfc.xref.RFC2617.2) [ 408 0 R /XYZ 67.0 686.866 null ] (rfc.section.14) [ 412 0 R /XYZ 67.0 725.0 null ] (rfc.xref.RFC2518.15) [ 412 0 R /XYZ 67.0 697.866 null ] (rfc.xref.RFC2518.16) [ 412 0 R /XYZ 67.0 675.866 null ] (rfc.section.15) [ 417 0 R /XYZ 67.0 725.0 null ] (rfc.references) [ 419 0 R /XYZ 67.0 725.0 null ] (rfc.references.1) [ 419 0 R /XYZ 67.0 690.866 null ] (REC-XML) [ 419 0 R /XYZ 67.0 671.894 null ] (REC-XML-INFOSET) [ 419 0 R /XYZ 67.0 633.894 null ] (REC-XML-NAMES) [ 419 0 R /XYZ 67.0 595.894 null ] (RFC2119) [ 419 0 R /XYZ 67.0 557.894 null ] (RFC2518) [ 419 0 R /XYZ 67.0 530.894 null ] (RFC2616) [ 419 0 R /XYZ 67.0 503.894 null ] (RFC2617) [ 419 0 R /XYZ 67.0 476.894 null ] (RFC3023) [ 419 0 R /XYZ 67.0 438.894 null ] (RFC3253) [ 419 0 R /XYZ 67.0 411.894 null ] (RFC3530) [ 419 0 R /XYZ 67.0 384.894 null ] (RFC3629) [ 419 0 R /XYZ 67.0 357.894 null ] (rfc.references.2) [ 419 0 R /XYZ 67.0 318.894 null ] (RFC2251) [ 419 0 R /XYZ 67.0 299.922 null ] (RFC2255) [ 419 0 R /XYZ 67.0 272.922 null ] (UNICODE4) [ 419 0 R /XYZ 67.0 256.922 null ] (rfc.section.A) [ 441 0 R /XYZ 67.0 725.0 null ] (webdav.xml.document.type.definition.addendum) [ 441 0 R /XYZ 67.0 725.0 null ] (rfc.xref.RFC2518.17) [ 441 0 R /XYZ 67.0 686.866 null ] (rfc.figure.u.99) [ 441 0 R /XYZ 67.0 665.866 null ] (rfc.figure.u.100) [ 441 0 R /XYZ 67.0 521.406 null ] (rfc.figure.u.101) [ 441 0 R /XYZ 67.0 405.246 null ] (rfc.figure.u.102) [ 441 0 R /XYZ 67.0 359.386 null ] (rfc.figure.u.103) [ 441 0 R /XYZ 67.0 313.526 null ] (rfc.figure.u.104) [ 441 0 R /XYZ 67.0 208.506 null ] (rfc.figure.u.105) [ 441 0 R /XYZ 67.0 162.646 null ] (rfc.figure.u.106) [ 453 0 R /XYZ 67.0 537.38 null ] (rfc.figure.u.107) [ 453 0 R /XYZ 67.0 402.78 null ] (rfc.figure.u.108) [ 453 0 R /XYZ 67.0 356.92 null ] (rfc.figure.u.109) [ 453 0 R /XYZ 67.0 311.06 null ] (rfc.figure.u.110) [ 453 0 R /XYZ 67.0 255.34 null ] (rfc.figure.u.111) [ 453 0 R /XYZ 67.0 101.02 null ] (rfc.section.B) [ 464 0 R /XYZ 67.0 725.0 null ] (rfc.table.u.1) [ 464 0 R /XYZ 67.0 610.866 null ] (rfc.authors) [ 499 0 R /XYZ 67.0 725.0 null ] (rfc.copyright) [ 499 0 R /XYZ 67.0 417.866 null ] (rfc.ipr) [ 506 0 R /XYZ 67.0 725.0 null ] (rfc.index) [ 512 0 R /XYZ 67.0 725.0 null ] ] >> >>
+ >>
+endobj
+3 0 obj
+<<
+/Font << /F5 666 0 R /F6 667 0 R /F9 668 0 R /F7 669 0 R >>
+/ProcSet [ /PDF /ImageC /Text ] >>
+endobj
+11 0 obj
+<<
+/S /GoTo
+/D [199 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+13 0 obj
+<<
+/S /GoTo
+/D [207 0 R /XYZ 67.0 502.0 null]
+>>
+endobj
+15 0 obj
+<<
+/S /GoTo
+/D [229 0 R /XYZ 67.0 692.0 null]
+>>
+endobj
+17 0 obj
+<<
+/S /GoTo
+/D [238 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+19 0 obj
+<<
+/S /GoTo
+/D [242 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+21 0 obj
+<<
+/S /GoTo
+/D [242 0 R /XYZ 67.0 233.866 null]
+>>
+endobj
+23 0 obj
+<<
+/S /GoTo
+/D [242 0 R /XYZ 67.0 108.034 null]
+>>
+endobj
+25 0 obj
+<<
+/S /GoTo
+/D [248 0 R /XYZ 67.0 596.14 null]
+>>
+endobj
+27 0 obj
+<<
+/S /GoTo
+/D [248 0 R /XYZ 67.0 459.308 null]
+>>
+endobj
+29 0 obj
+<<
+/S /GoTo
+/D [248 0 R /XYZ 67.0 333.476 null]
+>>
+endobj
+31 0 obj
+<<
+/S /GoTo
+/D [248 0 R /XYZ 67.0 153.644 null]
+>>
+endobj
+33 0 obj
+<<
+/S /GoTo
+/D [252 0 R /XYZ 67.0 708.0 null]
+>>
+endobj
+35 0 obj
+<<
+/S /GoTo
+/D [252 0 R /XYZ 67.0 518.168 null]
+>>
+endobj
+37 0 obj
+<<
+/S /GoTo
+/D [252 0 R /XYZ 67.0 436.336 null]
+>>
+endobj
+39 0 obj
+<<
+/S /GoTo
+/D [252 0 R /XYZ 67.0 343.504 null]
+>>
+endobj
+41 0 obj
+<<
+/S /GoTo
+/D [252 0 R /XYZ 67.0 250.672 null]
+>>
+endobj
+43 0 obj
+<<
+/S /GoTo
+/D [252 0 R /XYZ 67.0 168.84 null]
+>>
+endobj
+45 0 obj
+<<
+/S /GoTo
+/D [259 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+47 0 obj
+<<
+/S /GoTo
+/D [259 0 R /XYZ 67.0 553.006 null]
+>>
+endobj
+49 0 obj
+<<
+/S /GoTo
+/D [259 0 R /XYZ 67.0 405.174 null]
+>>
+endobj
+51 0 obj
+<<
+/S /GoTo
+/D [259 0 R /XYZ 67.0 301.342 null]
+>>
+endobj
+53 0 obj
+<<
+/S /GoTo
+/D [259 0 R /XYZ 67.0 186.51 null]
+>>
+endobj
+55 0 obj
+<<
+/S /GoTo
+/D [271 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+57 0 obj
+<<
+/S /GoTo
+/D [271 0 R /XYZ 67.0 561.866 null]
+>>
+endobj
+59 0 obj
+<<
+/S /GoTo
+/D [271 0 R /XYZ 67.0 427.034 null]
+>>
+endobj
+61 0 obj
+<<
+/S /GoTo
+/D [276 0 R /XYZ 67.0 589.54 null]
+>>
+endobj
+63 0 obj
+<<
+/S /GoTo
+/D [283 0 R /XYZ 67.0 687.14 null]
+>>
+endobj
+65 0 obj
+<<
+/S /GoTo
+/D [283 0 R /XYZ 67.0 562.308 null]
+>>
+endobj
+67 0 obj
+<<
+/S /GoTo
+/D [283 0 R /XYZ 67.0 189.176 null]
+>>
+endobj
+69 0 obj
+<<
+/S /GoTo
+/D [289 0 R /XYZ 67.0 263.16 null]
+>>
+endobj
+71 0 obj
+<<
+/S /GoTo
+/D [291 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+73 0 obj
+<<
+/S /GoTo
+/D [291 0 R /XYZ 67.0 178.729 null]
+>>
+endobj
+75 0 obj
+<<
+/S /GoTo
+/D [296 0 R /XYZ 67.0 653.28 null]
+>>
+endobj
+77 0 obj
+<<
+/S /GoTo
+/D [296 0 R /XYZ 67.0 98.509 null]
+>>
+endobj
+79 0 obj
+<<
+/S /GoTo
+/D [298 0 R /XYZ 67.0 621.42 null]
+>>
+endobj
+81 0 obj
+<<
+/S /GoTo
+/D [298 0 R /XYZ 67.0 522.669 null]
+>>
+endobj
+83 0 obj
+<<
+/S /GoTo
+/D [298 0 R /XYZ 67.0 369.918 null]
+>>
+endobj
+85 0 obj
+<<
+/S /GoTo
+/D [304 0 R /XYZ 67.0 314.9 null]
+>>
+endobj
+87 0 obj
+<<
+/S /GoTo
+/D [304 0 R /XYZ 67.0 128.348 null]
+>>
+endobj
+89 0 obj
+<<
+/S /GoTo
+/D [306 0 R /XYZ 67.0 689.14 null]
+>>
+endobj
+91 0 obj
+<<
+/S /GoTo
+/D [306 0 R /XYZ 67.0 612.389 null]
+>>
+endobj
+96 0 obj
+<<
+/S /GoTo
+/D [306 0 R /XYZ 67.0 535.638 null]
+>>
+endobj
+98 0 obj
+<<
+/S /GoTo
+/D [306 0 R /XYZ 67.0 368.587 null]
+>>
+endobj
+100 0 obj
+<<
+/S /GoTo
+/D [308 0 R /XYZ 67.0 519.52 null]
+>>
+endobj
+102 0 obj
+<<
+/S /GoTo
+/D [308 0 R /XYZ 67.0 393.688 null]
+>>
+endobj
+104 0 obj
+<<
+/S /GoTo
+/D [308 0 R /XYZ 67.0 116.856 null]
+>>
+endobj
+106 0 obj
+<<
+/S /GoTo
+/D [313 0 R /XYZ 67.0 217.76 null]
+>>
+endobj
+108 0 obj
+<<
+/S /GoTo
+/D [321 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+110 0 obj
+<<
+/S /GoTo
+/D [328 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+112 0 obj
+<<
+/S /GoTo
+/D [328 0 R /XYZ 67.0 669.866 null]
+>>
+endobj
+114 0 obj
+<<
+/S /GoTo
+/D [328 0 R /XYZ 67.0 639.894 null]
+>>
+endobj
+116 0 obj
+<<
+/S /GoTo
+/D [328 0 R /XYZ 67.0 192.943 null]
+>>
+endobj
+118 0 obj
+<<
+/S /GoTo
+/D [328 0 R /XYZ 67.0 108.971 null]
+>>
+endobj
+120 0 obj
+<<
+/S /GoTo
+/D [330 0 R /XYZ 67.0 568.84 null]
+>>
+endobj
+122 0 obj
+<<
+/S /GoTo
+/D [330 0 R /XYZ 67.0 483.868 null]
+>>
+endobj
+124 0 obj
+<<
+/S /GoTo
+/D [330 0 R /XYZ 67.0 387.896 null]
+>>
+endobj
+126 0 obj
+<<
+/S /GoTo
+/D [332 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+128 0 obj
+<<
+/S /GoTo
+/D [332 0 R /XYZ 67.0 690.866 null]
+>>
+endobj
+130 0 obj
+<<
+/S /GoTo
+/D [332 0 R /XYZ 67.0 417.894 null]
+>>
+endobj
+132 0 obj
+<<
+/S /GoTo
+/D [336 0 R /XYZ 67.0 468.0 null]
+>>
+endobj
+134 0 obj
+<<
+/S /GoTo
+/D [343 0 R /XYZ 67.0 601.84 null]
+>>
+endobj
+136 0 obj
+<<
+/S /GoTo
+/D [343 0 R /XYZ 67.0 159.729 null]
+>>
+endobj
+138 0 obj
+<<
+/S /GoTo
+/D [347 0 R /XYZ 67.0 275.5 null]
+>>
+endobj
+140 0 obj
+<<
+/S /GoTo
+/D [351 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+142 0 obj
+<<
+/S /GoTo
+/D [351 0 R /XYZ 67.0 690.866 null]
+>>
+endobj
+144 0 obj
+<<
+/S /GoTo
+/D [351 0 R /XYZ 67.0 551.894 null]
+>>
+endobj
+146 0 obj
+<<
+/S /GoTo
+/D [351 0 R /XYZ 67.0 114.622 null]
+>>
+endobj
+148 0 obj
+<<
+/S /GoTo
+/D [357 0 R /XYZ 67.0 146.18 null]
+>>
+endobj
+150 0 obj
+<<
+/S /GoTo
+/D [359 0 R /XYZ 67.0 357.12 null]
+>>
+endobj
+152 0 obj
+<<
+/S /GoTo
+/D [363 0 R /XYZ 67.0 558.96 null]
+>>
+endobj
+154 0 obj
+<<
+/S /GoTo
+/D [368 0 R /XYZ 67.0 323.7 null]
+>>
+endobj
+156 0 obj
+<<
+/S /GoTo
+/D [374 0 R /XYZ 67.0 589.56 null]
+>>
+endobj
+158 0 obj
+<<
+/S /GoTo
+/D [376 0 R /XYZ 67.0 292.74 null]
+>>
+endobj
+160 0 obj
+<<
+/S /GoTo
+/D [380 0 R /XYZ 67.0 347.7 null]
+>>
+endobj
+162 0 obj
+<<
+/S /GoTo
+/D [386 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+164 0 obj
+<<
+/S /GoTo
+/D [392 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+166 0 obj
+<<
+/S /GoTo
+/D [402 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+168 0 obj
+<<
+/S /GoTo
+/D [402 0 R /XYZ 67.0 625.866 null]
+>>
+endobj
+170 0 obj
+<<
+/S /GoTo
+/D [402 0 R /XYZ 67.0 518.894 null]
+>>
+endobj
+172 0 obj
+<<
+/S /GoTo
+/D [402 0 R /XYZ 67.0 291.922 null]
+>>
+endobj
+174 0 obj
+<<
+/S /GoTo
+/D [408 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+176 0 obj
+<<
+/S /GoTo
+/D [412 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+178 0 obj
+<<
+/S /GoTo
+/D [417 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+183 0 obj
+<<
+/S /GoTo
+/D [419 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+185 0 obj
+<<
+/S /GoTo
+/D [419 0 R /XYZ 67.0 690.866 null]
+>>
+endobj
+187 0 obj
+<<
+/S /GoTo
+/D [419 0 R /XYZ 67.0 318.894 null]
+>>
+endobj
+189 0 obj
+<<
+/S /GoTo
+/D [441 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+191 0 obj
+<<
+/S /GoTo
+/D [464 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+193 0 obj
+<<
+/S /GoTo
+/D [499 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+195 0 obj
+<<
+/S /GoTo
+/D [506 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+197 0 obj
+<<
+/S /GoTo
+/D [512 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+205 0 obj
+<<
+/S /GoTo
+/D [419 0 R /XYZ 67.0 476.894 null]
+>>
+endobj
+225 0 obj
+<<
+/S /GoTo
+/D [419 0 R /XYZ 67.0 503.894 null]
+>>
+endobj
+227 0 obj
+<<
+/S /GoTo
+/D [419 0 R /XYZ 67.0 530.894 null]
+>>
+endobj
+234 0 obj
+<<
+/S /GoTo
+/D [419 0 R /XYZ 67.0 557.894 null]
+>>
+endobj
+236 0 obj
+<<
+/S /GoTo
+/D [419 0 R /XYZ 67.0 671.894 null]
+>>
+endobj
+265 0 obj
+<<
+/S /GoTo
+/D [419 0 R /XYZ 67.0 272.922 null]
+>>
+endobj
+267 0 obj
+<<
+/S /GoTo
+/D [419 0 R /XYZ 67.0 299.922 null]
+>>
+endobj
+281 0 obj
+<<
+/S /GoTo
+/D [419 0 R /XYZ 67.0 411.894 null]
+>>
+endobj
+324 0 obj
+<<
+/S /GoTo
+/D [419 0 R /XYZ 67.0 384.894 null]
+>>
+endobj
+366 0 obj
+<<
+/S /GoTo
+/D [419 0 R /XYZ 67.0 256.922 null]
+>>
+endobj
+372 0 obj
+<<
+/S /GoTo
+/D [419 0 R /XYZ 67.0 633.894 null]
+>>
+endobj
+390 0 obj
+<<
+/S /GoTo
+/D [419 0 R /XYZ 67.0 595.894 null]
+>>
+endobj
+396 0 obj
+<<
+/S /GoTo
+/D [419 0 R /XYZ 67.0 357.894 null]
+>>
+endobj
+398 0 obj
+<<
+/S /GoTo
+/D [419 0 R /XYZ 67.0 438.894 null]
+>>
+endobj
+517 0 obj
+<<
+ /First 519 0 R
+ /Last 665 0 R
+>> endobj
+518 0 obj
+<<
+/S /GoTo
+/D [6 0 R /XYZ 67.0 465.084 null]
+>>
+endobj
+520 0 obj
+<<
+/S /GoTo
+/D [6 0 R /XYZ 67.0 374.95 null]
+>>
+endobj
+522 0 obj
+<<
+/S /GoTo
+/D [6 0 R /XYZ 67.0 317.816 null]
+>>
+endobj
+524 0 obj
+<<
+/S /GoTo
+/D [8 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+527 0 obj
+<<
+/S /GoTo
+/D [207 0 R /XYZ 67.0 502.0 null]
+>>
+endobj
+530 0 obj
+<<
+/S /GoTo
+/D [238 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+532 0 obj
+<<
+/S /GoTo
+/D [242 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+534 0 obj
+<<
+/S /GoTo
+/D [242 0 R /XYZ 67.0 233.866 null]
+>>
+endobj
+536 0 obj
+<<
+/S /GoTo
+/D [242 0 R /XYZ 67.0 108.034 null]
+>>
+endobj
+538 0 obj
+<<
+/S /GoTo
+/D [248 0 R /XYZ 67.0 596.14 null]
+>>
+endobj
+540 0 obj
+<<
+/S /GoTo
+/D [248 0 R /XYZ 67.0 459.308 null]
+>>
+endobj
+542 0 obj
+<<
+/S /GoTo
+/D [248 0 R /XYZ 67.0 333.476 null]
+>>
+endobj
+544 0 obj
+<<
+/S /GoTo
+/D [248 0 R /XYZ 67.0 153.644 null]
+>>
+endobj
+546 0 obj
+<<
+/S /GoTo
+/D [252 0 R /XYZ 67.0 708.0 null]
+>>
+endobj
+548 0 obj
+<<
+/S /GoTo
+/D [252 0 R /XYZ 67.0 518.168 null]
+>>
+endobj
+550 0 obj
+<<
+/S /GoTo
+/D [252 0 R /XYZ 67.0 436.336 null]
+>>
+endobj
+552 0 obj
+<<
+/S /GoTo
+/D [252 0 R /XYZ 67.0 343.504 null]
+>>
+endobj
+554 0 obj
+<<
+/S /GoTo
+/D [252 0 R /XYZ 67.0 250.672 null]
+>>
+endobj
+556 0 obj
+<<
+/S /GoTo
+/D [252 0 R /XYZ 67.0 168.84 null]
+>>
+endobj
+558 0 obj
+<<
+/S /GoTo
+/D [259 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+560 0 obj
+<<
+/S /GoTo
+/D [259 0 R /XYZ 67.0 553.006 null]
+>>
+endobj
+562 0 obj
+<<
+/S /GoTo
+/D [259 0 R /XYZ 67.0 405.174 null]
+>>
+endobj
+566 0 obj
+<<
+/S /GoTo
+/D [271 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+568 0 obj
+<<
+/S /GoTo
+/D [271 0 R /XYZ 67.0 561.866 null]
+>>
+endobj
+572 0 obj
+<<
+/S /GoTo
+/D [283 0 R /XYZ 67.0 687.14 null]
+>>
+endobj
+574 0 obj
+<<
+/S /GoTo
+/D [283 0 R /XYZ 67.0 562.308 null]
+>>
+endobj
+576 0 obj
+<<
+/S /GoTo
+/D [283 0 R /XYZ 67.0 189.176 null]
+>>
+endobj
+578 0 obj
+<<
+/S /GoTo
+/D [289 0 R /XYZ 67.0 263.16 null]
+>>
+endobj
+580 0 obj
+<<
+/S /GoTo
+/D [289 0 R /XYZ 67.0 74.468 null]
+>>
+endobj
+582 0 obj
+<<
+/S /GoTo
+/D [291 0 R /XYZ 67.0 178.729 null]
+>>
+endobj
+584 0 obj
+<<
+/S /GoTo
+/D [296 0 R /XYZ 67.0 653.28 null]
+>>
+endobj
+587 0 obj
+<<
+/S /GoTo
+/D [298 0 R /XYZ 67.0 621.42 null]
+>>
+endobj
+591 0 obj
+<<
+/S /GoTo
+/D [304 0 R /XYZ 67.0 314.9 null]
+>>
+endobj
+593 0 obj
+<<
+/S /GoTo
+/D [304 0 R /XYZ 67.0 128.348 null]
+>>
+endobj
+595 0 obj
+<<
+/S /GoTo
+/D [306 0 R /XYZ 67.0 689.14 null]
+>>
+endobj
+600 0 obj
+<<
+/S /GoTo
+/D [308 0 R /XYZ 67.0 519.52 null]
+>>
+endobj
+602 0 obj
+<<
+/S /GoTo
+/D [308 0 R /XYZ 67.0 393.688 null]
+>>
+endobj
+606 0 obj
+<<
+/S /GoTo
+/D [321 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+608 0 obj
+<<
+/S /GoTo
+/D [328 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+612 0 obj
+<<
+/S /GoTo
+/D [328 0 R /XYZ 67.0 192.943 null]
+>>
+endobj
+618 0 obj
+<<
+/S /GoTo
+/D [332 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+620 0 obj
+<<
+/S /GoTo
+/D [332 0 R /XYZ 67.0 690.866 null]
+>>
+endobj
+622 0 obj
+<<
+/S /GoTo
+/D [332 0 R /XYZ 67.0 417.894 null]
+>>
+endobj
+628 0 obj
+<<
+/S /GoTo
+/D [351 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+631 0 obj
+<<
+/S /GoTo
+/D [351 0 R /XYZ 67.0 551.894 null]
+>>
+endobj
+634 0 obj
+<<
+/S /GoTo
+/D [357 0 R /XYZ 67.0 146.18 null]
+>>
+endobj
+637 0 obj
+<<
+/S /GoTo
+/D [363 0 R /XYZ 67.0 558.96 null]
+>>
+endobj
+641 0 obj
+<<
+/S /GoTo
+/D [376 0 R /XYZ 67.0 292.74 null]
+>>
+endobj
+644 0 obj
+<<
+/S /GoTo
+/D [386 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+646 0 obj
+<<
+/S /GoTo
+/D [392 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+648 0 obj
+<<
+/S /GoTo
+/D [402 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+653 0 obj
+<<
+/S /GoTo
+/D [408 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+660 0 obj
+<<
+/S /GoTo
+/D [441 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+xref
+0 670
+0000000000 65535 f
+0000195902 00000 n
+0000196446 00000 n
+0000215528 00000 n
+0000000015 00000 n
+0000000071 00000 n
+0000001629 00000 n
+0000001735 00000 n
+0000004020 00000 n
+0000004140 00000 n
+0000004446 00000 n
+0000215644 00000 n
+0000004581 00000 n
+0000215709 00000 n
+0000004716 00000 n
+0000215774 00000 n
+0000004851 00000 n
+0000215839 00000 n
+0000004986 00000 n
+0000215904 00000 n
+0000005121 00000 n
+0000215969 00000 n
+0000005256 00000 n
+0000216036 00000 n
+0000005390 00000 n
+0000216103 00000 n
+0000005525 00000 n
+0000216169 00000 n
+0000005660 00000 n
+0000216236 00000 n
+0000005795 00000 n
+0000216303 00000 n
+0000005930 00000 n
+0000216370 00000 n
+0000006065 00000 n
+0000216435 00000 n
+0000006200 00000 n
+0000216502 00000 n
+0000006335 00000 n
+0000216569 00000 n
+0000006470 00000 n
+0000216636 00000 n
+0000006605 00000 n
+0000216703 00000 n
+0000006740 00000 n
+0000216769 00000 n
+0000006875 00000 n
+0000216834 00000 n
+0000007010 00000 n
+0000216901 00000 n
+0000007145 00000 n
+0000216968 00000 n
+0000007280 00000 n
+0000217035 00000 n
+0000007415 00000 n
+0000217101 00000 n
+0000007550 00000 n
+0000217166 00000 n
+0000007685 00000 n
+0000217233 00000 n
+0000007820 00000 n
+0000217300 00000 n
+0000007955 00000 n
+0000217366 00000 n
+0000008090 00000 n
+0000217432 00000 n
+0000008224 00000 n
+0000217499 00000 n
+0000008359 00000 n
+0000217566 00000 n
+0000008494 00000 n
+0000217632 00000 n
+0000008629 00000 n
+0000217697 00000 n
+0000008763 00000 n
+0000217764 00000 n
+0000008898 00000 n
+0000217830 00000 n
+0000009033 00000 n
+0000217896 00000 n
+0000009168 00000 n
+0000217962 00000 n
+0000009303 00000 n
+0000218029 00000 n
+0000009438 00000 n
+0000218096 00000 n
+0000009573 00000 n
+0000218161 00000 n
+0000009707 00000 n
+0000218228 00000 n
+0000009840 00000 n
+0000218294 00000 n
+0000009974 00000 n
+0000012490 00000 n
+0000012613 00000 n
+0000012966 00000 n
+0000218361 00000 n
+0000013097 00000 n
+0000218428 00000 n
+0000013228 00000 n
+0000218495 00000 n
+0000013360 00000 n
+0000218562 00000 n
+0000013492 00000 n
+0000218630 00000 n
+0000013625 00000 n
+0000218698 00000 n
+0000013758 00000 n
+0000218765 00000 n
+0000013891 00000 n
+0000218831 00000 n
+0000014026 00000 n
+0000218897 00000 n
+0000014161 00000 n
+0000218965 00000 n
+0000014296 00000 n
+0000219033 00000 n
+0000014431 00000 n
+0000219101 00000 n
+0000014565 00000 n
+0000219169 00000 n
+0000014700 00000 n
+0000219236 00000 n
+0000014835 00000 n
+0000219304 00000 n
+0000014970 00000 n
+0000219372 00000 n
+0000015105 00000 n
+0000219438 00000 n
+0000015239 00000 n
+0000219506 00000 n
+0000015373 00000 n
+0000219574 00000 n
+0000015508 00000 n
+0000219640 00000 n
+0000015643 00000 n
+0000219707 00000 n
+0000015778 00000 n
+0000219775 00000 n
+0000015913 00000 n
+0000219841 00000 n
+0000016048 00000 n
+0000219907 00000 n
+0000016183 00000 n
+0000219975 00000 n
+0000016317 00000 n
+0000220043 00000 n
+0000016452 00000 n
+0000220111 00000 n
+0000016586 00000 n
+0000220178 00000 n
+0000016721 00000 n
+0000220245 00000 n
+0000016856 00000 n
+0000220312 00000 n
+0000016992 00000 n
+0000220378 00000 n
+0000017127 00000 n
+0000220445 00000 n
+0000017262 00000 n
+0000220512 00000 n
+0000017397 00000 n
+0000220578 00000 n
+0000017532 00000 n
+0000220644 00000 n
+0000017667 00000 n
+0000220710 00000 n
+0000017801 00000 n
+0000220776 00000 n
+0000017936 00000 n
+0000220844 00000 n
+0000018071 00000 n
+0000220912 00000 n
+0000018206 00000 n
+0000220980 00000 n
+0000018341 00000 n
+0000221046 00000 n
+0000018474 00000 n
+0000221112 00000 n
+0000018607 00000 n
+0000019447 00000 n
+0000019573 00000 n
+0000019658 00000 n
+0000221178 00000 n
+0000019791 00000 n
+0000221244 00000 n
+0000019926 00000 n
+0000221312 00000 n
+0000020061 00000 n
+0000221380 00000 n
+0000020196 00000 n
+0000221446 00000 n
+0000020331 00000 n
+0000221512 00000 n
+0000020466 00000 n
+0000221578 00000 n
+0000020601 00000 n
+0000221644 00000 n
+0000020735 00000 n
+0000024551 00000 n
+0000024677 00000 n
+0000024730 00000 n
+0000024868 00000 n
+0000025005 00000 n
+0000025144 00000 n
+0000221710 00000 n
+0000025283 00000 n
+0000028093 00000 n
+0000028219 00000 n
+0000028376 00000 n
+0000028510 00000 n
+0000028644 00000 n
+0000028778 00000 n
+0000028912 00000 n
+0000029046 00000 n
+0000029181 00000 n
+0000029316 00000 n
+0000029451 00000 n
+0000029586 00000 n
+0000029721 00000 n
+0000029856 00000 n
+0000029989 00000 n
+0000030124 00000 n
+0000030259 00000 n
+0000030394 00000 n
+0000221778 00000 n
+0000030533 00000 n
+0000221846 00000 n
+0000030672 00000 n
+0000031761 00000 n
+0000031887 00000 n
+0000031940 00000 n
+0000032077 00000 n
+0000032214 00000 n
+0000221914 00000 n
+0000032351 00000 n
+0000221982 00000 n
+0000032490 00000 n
+0000033806 00000 n
+0000033932 00000 n
+0000033961 00000 n
+0000034099 00000 n
+0000037379 00000 n
+0000037505 00000 n
+0000037550 00000 n
+0000037688 00000 n
+0000037827 00000 n
+0000037965 00000 n
+0000040132 00000 n
+0000040258 00000 n
+0000040287 00000 n
+0000040422 00000 n
+0000042276 00000 n
+0000042402 00000 n
+0000042439 00000 n
+0000042577 00000 n
+0000042715 00000 n
+0000043266 00000 n
+0000043376 00000 n
+0000045657 00000 n
+0000045783 00000 n
+0000045844 00000 n
+0000045983 00000 n
+0000046122 00000 n
+0000046261 00000 n
+0000222050 00000 n
+0000046400 00000 n
+0000222118 00000 n
+0000046539 00000 n
+0000046882 00000 n
+0000046992 00000 n
+0000049458 00000 n
+0000049584 00000 n
+0000049621 00000 n
+0000049758 00000 n
+0000049896 00000 n
+0000052070 00000 n
+0000052196 00000 n
+0000052241 00000 n
+0000052380 00000 n
+0000052519 00000 n
+0000222186 00000 n
+0000052658 00000 n
+0000054929 00000 n
+0000055039 00000 n
+0000056944 00000 n
+0000057070 00000 n
+0000057099 00000 n
+0000057237 00000 n
+0000059138 00000 n
+0000059248 00000 n
+0000061504 00000 n
+0000061630 00000 n
+0000061667 00000 n
+0000061805 00000 n
+0000061943 00000 n
+0000063667 00000 n
+0000063777 00000 n
+0000066316 00000 n
+0000066442 00000 n
+0000066487 00000 n
+0000066625 00000 n
+0000066763 00000 n
+0000066901 00000 n
+0000068752 00000 n
+0000068862 00000 n
+0000070674 00000 n
+0000070784 00000 n
+0000073351 00000 n
+0000073477 00000 n
+0000073514 00000 n
+0000073652 00000 n
+0000073789 00000 n
+0000075866 00000 n
+0000075976 00000 n
+0000077602 00000 n
+0000077712 00000 n
+0000079109 00000 n
+0000079219 00000 n
+0000080856 00000 n
+0000080966 00000 n
+0000083088 00000 n
+0000083214 00000 n
+0000083243 00000 n
+0000222254 00000 n
+0000083382 00000 n
+0000084206 00000 n
+0000084316 00000 n
+0000086486 00000 n
+0000086596 00000 n
+0000088338 00000 n
+0000088448 00000 n
+0000091310 00000 n
+0000091436 00000 n
+0000091465 00000 n
+0000091603 00000 n
+0000093847 00000 n
+0000093973 00000 n
+0000094026 00000 n
+0000094158 00000 n
+0000094292 00000 n
+0000094423 00000 n
+0000094554 00000 n
+0000096670 00000 n
+0000096796 00000 n
+0000096825 00000 n
+0000096960 00000 n
+0000099395 00000 n
+0000099505 00000 n
+0000100565 00000 n
+0000100675 00000 n
+0000103252 00000 n
+0000103378 00000 n
+0000103423 00000 n
+0000103562 00000 n
+0000103701 00000 n
+0000103840 00000 n
+0000105817 00000 n
+0000105927 00000 n
+0000108487 00000 n
+0000108613 00000 n
+0000108642 00000 n
+0000108779 00000 n
+0000111700 00000 n
+0000111826 00000 n
+0000111855 00000 n
+0000222322 00000 n
+0000111994 00000 n
+0000114511 00000 n
+0000114637 00000 n
+0000114674 00000 n
+0000114811 00000 n
+0000222390 00000 n
+0000114950 00000 n
+0000117061 00000 n
+0000117171 00000 n
+0000119288 00000 n
+0000119414 00000 n
+0000119443 00000 n
+0000119582 00000 n
+0000121873 00000 n
+0000121999 00000 n
+0000122028 00000 n
+0000122163 00000 n
+0000122927 00000 n
+0000123037 00000 n
+0000123777 00000 n
+0000123903 00000 n
+0000123940 00000 n
+0000124079 00000 n
+0000222458 00000 n
+0000124218 00000 n
+0000126338 00000 n
+0000126464 00000 n
+0000126525 00000 n
+0000126664 00000 n
+0000222526 00000 n
+0000126803 00000 n
+0000222594 00000 n
+0000126942 00000 n
+0000127080 00000 n
+0000127218 00000 n
+0000130428 00000 n
+0000130554 00000 n
+0000130599 00000 n
+0000130738 00000 n
+0000130876 00000 n
+0000131015 00000 n
+0000131713 00000 n
+0000131839 00000 n
+0000131868 00000 n
+0000132007 00000 n
+0000132706 00000 n
+0000132832 00000 n
+0000132869 00000 n
+0000133008 00000 n
+0000133146 00000 n
+0000134388 00000 n
+0000134498 00000 n
+0000139470 00000 n
+0000139596 00000 n
+0000139769 00000 n
+0000139964 00000 n
+0000140157 00000 n
+0000140361 00000 n
+0000140562 00000 n
+0000140753 00000 n
+0000140944 00000 n
+0000141134 00000 n
+0000141325 00000 n
+0000141516 00000 n
+0000141706 00000 n
+0000141897 00000 n
+0000142088 00000 n
+0000142278 00000 n
+0000142469 00000 n
+0000142660 00000 n
+0000142851 00000 n
+0000143042 00000 n
+0000143240 00000 n
+0000143411 00000 n
+0000145027 00000 n
+0000145153 00000 n
+0000145246 00000 n
+0000145384 00000 n
+0000145522 00000 n
+0000145660 00000 n
+0000145798 00000 n
+0000145936 00000 n
+0000146074 00000 n
+0000146210 00000 n
+0000146348 00000 n
+0000146484 00000 n
+0000147924 00000 n
+0000148050 00000 n
+0000148119 00000 n
+0000148255 00000 n
+0000148392 00000 n
+0000148527 00000 n
+0000148664 00000 n
+0000148799 00000 n
+0000148934 00000 n
+0000149822 00000 n
+0000149932 00000 n
+0000153438 00000 n
+0000153564 00000 n
+0000153841 00000 n
+0000153979 00000 n
+0000154117 00000 n
+0000154255 00000 n
+0000154393 00000 n
+0000154531 00000 n
+0000154669 00000 n
+0000154805 00000 n
+0000154943 00000 n
+0000155081 00000 n
+0000155219 00000 n
+0000155357 00000 n
+0000155495 00000 n
+0000155633 00000 n
+0000155771 00000 n
+0000155909 00000 n
+0000156047 00000 n
+0000156185 00000 n
+0000156321 00000 n
+0000156459 00000 n
+0000156597 00000 n
+0000156735 00000 n
+0000156873 00000 n
+0000157011 00000 n
+0000157149 00000 n
+0000157287 00000 n
+0000157425 00000 n
+0000157563 00000 n
+0000157701 00000 n
+0000157839 00000 n
+0000157977 00000 n
+0000158115 00000 n
+0000158253 00000 n
+0000159960 00000 n
+0000160086 00000 n
+0000160139 00000 n
+0000160324 00000 n
+0000160512 00000 n
+0000160694 00000 n
+0000160870 00000 n
+0000162946 00000 n
+0000163072 00000 n
+0000163117 00000 n
+0000163294 00000 n
+0000163469 00000 n
+0000163645 00000 n
+0000167204 00000 n
+0000167330 00000 n
+0000167351 00000 n
+0000168883 00000 n
+0000169009 00000 n
+0000222662 00000 n
+0000222716 00000 n
+0000169030 00000 n
+0000222782 00000 n
+0000169227 00000 n
+0000222847 00000 n
+0000169423 00000 n
+0000222913 00000 n
+0000169572 00000 n
+0000169773 00000 n
+0000222977 00000 n
+0000170002 00000 n
+0000170143 00000 n
+0000223043 00000 n
+0000170384 00000 n
+0000223109 00000 n
+0000170560 00000 n
+0000223175 00000 n
+0000170779 00000 n
+0000223243 00000 n
+0000170996 00000 n
+0000223311 00000 n
+0000171234 00000 n
+0000223378 00000 n
+0000171537 00000 n
+0000223446 00000 n
+0000171822 00000 n
+0000223514 00000 n
+0000172066 00000 n
+0000223582 00000 n
+0000172321 00000 n
+0000223648 00000 n
+0000172711 00000 n
+0000223716 00000 n
+0000172972 00000 n
+0000223784 00000 n
+0000173204 00000 n
+0000223852 00000 n
+0000173453 00000 n
+0000223920 00000 n
+0000173684 00000 n
+0000223987 00000 n
+0000174013 00000 n
+0000224053 00000 n
+0000174290 00000 n
+0000224121 00000 n
+0000174524 00000 n
+0000174750 00000 n
+0000174992 00000 n
+0000224189 00000 n
+0000175220 00000 n
+0000224255 00000 n
+0000175527 00000 n
+0000175733 00000 n
+0000176023 00000 n
+0000224323 00000 n
+0000176352 00000 n
+0000224390 00000 n
+0000176531 00000 n
+0000224458 00000 n
+0000176858 00000 n
+0000224526 00000 n
+0000177338 00000 n
+0000224593 00000 n
+0000177682 00000 n
+0000224660 00000 n
+0000178168 00000 n
+0000224728 00000 n
+0000178377 00000 n
+0000178575 00000 n
+0000224795 00000 n
+0000178815 00000 n
+0000179034 00000 n
+0000179258 00000 n
+0000224862 00000 n
+0000179682 00000 n
+0000224928 00000 n
+0000179968 00000 n
+0000224996 00000 n
+0000180171 00000 n
+0000180471 00000 n
+0000180729 00000 n
+0000180977 00000 n
+0000225063 00000 n
+0000181332 00000 n
+0000225130 00000 n
+0000181581 00000 n
+0000181914 00000 n
+0000182302 00000 n
+0000225198 00000 n
+0000182736 00000 n
+0000225264 00000 n
+0000182935 00000 n
+0000183299 00000 n
+0000183540 00000 n
+0000225330 00000 n
+0000183729 00000 n
+0000183939 00000 n
+0000184144 00000 n
+0000184294 00000 n
+0000184444 00000 n
+0000225398 00000 n
+0000184579 00000 n
+0000225464 00000 n
+0000184867 00000 n
+0000225532 00000 n
+0000185023 00000 n
+0000185245 00000 n
+0000185515 00000 n
+0000185984 00000 n
+0000186470 00000 n
+0000225600 00000 n
+0000187072 00000 n
+0000187361 00000 n
+0000225666 00000 n
+0000187549 00000 n
+0000187910 00000 n
+0000225734 00000 n
+0000188261 00000 n
+0000188582 00000 n
+0000225801 00000 n
+0000188893 00000 n
+0000189273 00000 n
+0000189442 00000 n
+0000225868 00000 n
+0000189892 00000 n
+0000190280 00000 n
+0000225935 00000 n
+0000190673 00000 n
+0000226001 00000 n
+0000190877 00000 n
+0000226067 00000 n
+0000191207 00000 n
+0000191507 00000 n
+0000191829 00000 n
+0000192374 00000 n
+0000226133 00000 n
+0000192672 00000 n
+0000192877 00000 n
+0000193111 00000 n
+0000193328 00000 n
+0000193551 00000 n
+0000193786 00000 n
+0000226199 00000 n
+0000194033 00000 n
+0000194409 00000 n
+0000194766 00000 n
+0000194973 00000 n
+0000195346 00000 n
+0000195462 00000 n
+0000195573 00000 n
+0000195685 00000 n
+0000195792 00000 n
+trailer
+<<
+/Size 670
+/Root 2 0 R
+/Info 4 0 R
+>>
+startxref
+226265
+%%EOF
diff --git a/vendor/sabre/dav/docs/rfc4437.pdf b/vendor/sabre/dav/docs/rfc4437.pdf
new file mode 100644
index 000000000..dbbc0ced0
--- /dev/null
+++ b/vendor/sabre/dav/docs/rfc4437.pdf
@@ -0,0 +1,3127 @@
+%PDF-1.3
+%ª«¬­
+4 0 obj
+<< /Type /Info
+/Producer (FOP 0.20.5) >>
+endobj
+5 0 obj
+<< /Length 1426 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau1.9lo&I&;KZQ'g0Jl/M2EE]fAiX3\sMo[ZVWi*$B8j@S@Cc!8:J'I@$0d/83IS%NQX%JA<f2_7L*5rVGUA131$]]5Z?UPPupm=ZH56k:H,KEtTSl'$kd8`*$0eO*=qr57..)lMU'?h=u3OZ,Q%aFF97GD6On&@FB@IG0/s"CFF^EVp8(NrH[I:i=16RiU7PH2D_g/R`:&[.]BcO_fUT@OE@U9\;Ilk=8.=A]jnH^AA2m[R9Dnh=pupk?lF&/GJqPBk6<4#4L9&b4^9Sp+Ku9%E^sU`"<Bq>P7jm14Np;(SeEKP@G'--l`n2QG2pMtj5htNEkWh!hh"IY#Pa:sO`B49*(>AnQVJMHK>h'se=3!5ojY#cL/&`._pE0Ge&$A!(Q8&BkNjsD]]EI.a8%7C9u=u.'&9M&hcojc)`.Kr='G/hX!'9ikH-@i[)Bt!o)0Lu`C4VQ\F8d53<+/O3XW^@&/LDs6rE#78U+3?`[.FL_V9Zq3X(G>BOs4iklV@]!.-SWM<F_jkjC:VXYNAaf)2]Z:;0t#,mMO>3=.aR*9&:c/?c2/<BpB5b$`D.:mBS%RZG-@;J;2ME[LC"5tG82)Is9[=,Mjfem.["riX?:9[M>>Jp^H*UjTeD?E<U,D;lU+&.^IZ7R]#!9nR%80oo<bF"PA-Xm5O7UFt*Z3E@CFTOujGWfc9Q3hjQI,f&KTWkldH?L!jBH%"=,bf?]n8)d#@P-uug`V2Q'f5&aX?,hZB,at:bGsOdm+uJa$iH8uAET4--Z#];'SnY<6f@-9]3G>^6pO-bd5:$<U9-VsAc5E=0aU7V//\q[c]8@*Bc8W6\/Cjb</+tTja[Fq-RA\9cf2ja@Si,$+"?"lus1^lqH"CP9Su+p<Y?!"F[,g%o4Cb*mQ>-B0?Jj,*(`-KRZKOnZFH9^'Khu0>ASl-a;%4j&fZ>nf]j&f#*kJ3rG^cNCNopJLHZ>/6=Y,noKc8M<<+J8eqMV%Km"'o9all3%`S-P1K0;Y0FA$;MBdRoJ0*)`o@"IZG=73!r]\_`Rj[d+7]tKl1P9blX`L;O-Te!QPpe/1@I,C6Fo*5lN121`ld&ktn)QQ!\/SX?XQ_UU59dPf/'q-0Vo!W))".l!"790C-VC4lI'WN]"5gLP<0WO@lJsA9]S6"@VAJ/q+<btGY/BH&83DWlrDqq]+#'g"`(_!cB!.U[f#`/o:K%4++1qdQPZVlpi2C.'Yc)H`""c#U:)cVQL<M[$>lQ.f3/Qg4hZW[7?;!A+F0I2oo>.f8TVNSiT*5``o9_jD$U,TPsiu>u=o#rPG+fnQu@g@0dde,d=N4A"k-#(gmpa2(*JO+mU-j?AaNS+Ab"0jabj(DJDh#$j\o+%+OiDE4=8@14ZZJ.;k=9X+oFDpl9!8g)ps5Sjq`&jP;rU8'bqiC',IfWendaS~>
+endstream
+endobj
+6 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 5 0 R
+>>
+endobj
+7 0 obj
+<< /Length 2115 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!$I>>s99'Z],,'Rk_'7;L^1X)D8LZg=!D8^m(P[!cm,"[$;SXCK]%VdIPc@N@tY,!]%MVD'>eQ@Jb'MiRAKkihaK&R^@1?o1"RK:=)*K_cc#"OZs3-kW=R0Y.WU*KQAeR5tXL#nQ^$Nq6uVqcQ*5eZ<#G"CHc.?`Pp!eX0aW-k6h!lgZ[/5AiXr+s(22"[R,ACi!R834-5dPsmmI+.$\*gK6Cu`XF*C1-r\EV$Z.C)hP/?)i0DF6tH6;`"SJSo/868K.>!Y=tTDNl+7<>_-!@t_,1\:Blf]/^l`mKm_hP(`8Z*ke.\0c1K)1t3m4l-k(cl?>7W_NOG>FtCUN)_P8+i]'(p#o:KFpK];7!CWVY`e#X^I@$T0R(4&].XfiZq:(AWA5<\>DU84T9&,PR$IY.RZBcuBqs33)/[rQkS7GB6b0[0(=)c(5T?Lli0si1^#LLS[Qha0Chud*Bi##t:HHCn%K?LP,3AiS\N/**b<OY#K\9:L#"r5r"('lik=[LklhST!d?a9CC)k4ORq;CiK(19.ARqKC?q<4B&Gbn6[TG^"H,$-eV@Bc(/ceH#'Md>bnJj@:=g7L\';P,-O*CLOD#bV`L*JqDlDkFLKGLlgr`'_'=Y(,:!O7k9\X=_9'UsbmF-ENDN$<%4>MjfiHjBq_4YTYhC(tZ`Q2ZX*A=(eJDR5cRaNN3XZ7'lWQ=Be<t1&QPRm;/5tT[#=c0oGlm:#,^ms;6?PF>,b4)d=sO5P0PR-rFbPN/hn\ju,I#l;j7Votou6%IF#Vso7Cl-7:Zj2fiW@DM8#TNf!#:)"Tae;W'<qUQ>PWf&FC*;VfoOTZI_*OpJ!p9Ce@D^eKRg8XBQJliof5'C&k/V)Q@=i(D#,-"PS?'V[/]okPr0iri<[_B7ur*qQLQGB3_O-U@MIjF+!Bo_-k/PuBW*\GE2afo/9#b\4Fd=UX$TP($EbmjF+O[P:O.+9IF*eOTZ+V7;%$OT#%2q2`8R$<[UU94ABXCgh9"H3gp4W)ccYnPI@6>o$h1g>Fp$i"4F0"ISFG"SneTphpSLjg^ZeU@1oZElJ^FQPC;"t^GGKCP0c;4Yi%ps#FcTseUT42X6C1VLJIu5_N3GgaWWHfPrMbs:.\(?),':bXT0<7,a'<5!=f".,>C0;^RA%,VkNgF/cCJbj(L,d";0M1tLH`l>TSJ/T,7"e]di0eV=MNR)@('?:R5.bAh5a!/"3sRT_nl(<MD3_H=]]:SH@a\]9C1%LXZY)kg2Y;Z?0&TZ.FX;XT.\81pmcc[>8;TeV*[_VQYHisYefMiV7,3[%&rocV,LBkG8@1(a7CK.p#"9[o8*hj$PAM?aM#EAe1dO"8.i21Yt4]%-a7A$Cu0ihR8jZNg-;8hY*cRQf&<>MPjifs%!shnNJdk5J$7]cYQgN,ZOZ+_9'$*d!Gr@kaa';@WHMmL[qf@Q@3ce:^((M:f$7FN\\JC!WP(h5"NUBCpr0b^Y=j8S!"eH#)>6&DW5N<f%DJ0D[X_Rd]?i-JX]W&Qn90*:7_QMjbmWE'KhM&3(\E[%3BnE0%]bmFELtjH:a!=:/RXW,Nf'NIFI(.7YA';g5:fdu@[o)OiB3IVb:<i<j(5$nbI-S"'AhodfPGLpK?i(sJ_g$semdfWW4]m;ch!l(@S^pO6nsSW'VA,7Z`o.j_kXKi0Wbj.YfH!`;'Rc@YK$;?d,LI:Y&r+!YdO]a=aQBGOj[13c&"E:HDRS75U:*SGtZPn].VNC15=l0Wc0a-HIG<UrLnMi=*8<s"*bBE3U*i"q,VmYDVNk$jS@Sf933]b%':&"W-qZm=RlGI?.RZLqY+JW1>D6%nS-I@Rn]siWFi..'d4,0c.>(tc46DJYS`)CGq"h[4MXfA5+?&3d9Lb"m=oATOplFr/,(W\/]MdCbVNo.0nEiK#RkW^D0PBk&UL3?2m$VOK1hCPCn&UNWInCQ4gXcn!`*c]ZNXbu>@9/E+`Psp'[`6b6mRnZU/oOX=nAML;.4iYQ\P^Ki:s)DW[ll\9*nm:d\n)K.OiBg0c13aV]ubd?L.=6a4mt#[jmgDf%AZfkTm4g':!Z>B7HPS+uQ3?'aLt9XQoG,\k[.Eg$.m>p%(iTpqc1XInfOj6N~>
+endstream
+endobj
+8 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 7 0 R
+/Annots 9 0 R
+>>
+endobj
+9 0 obj
+[
+10 0 R
+12 0 R
+14 0 R
+16 0 R
+18 0 R
+20 0 R
+22 0 R
+24 0 R
+26 0 R
+28 0 R
+30 0 R
+32 0 R
+34 0 R
+36 0 R
+38 0 R
+40 0 R
+42 0 R
+44 0 R
+46 0 R
+48 0 R
+50 0 R
+52 0 R
+54 0 R
+56 0 R
+58 0 R
+60 0 R
+62 0 R
+64 0 R
+66 0 R
+68 0 R
+70 0 R
+72 0 R
+74 0 R
+]
+endobj
+10 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 84.5 686.866 138.95 676.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 11 0 R
+/H /I
+>>
+endobj
+12 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 666.056 185.34 656.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 13 0 R
+/H /I
+>>
+endobj
+14 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 84.5 645.246 139.5 635.246 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 15 0 R
+/H /I
+>>
+endobj
+16 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 624.436 266.65 614.436 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 17 0 R
+/H /I
+>>
+endobj
+18 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 603.626 275.56 593.626 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 19 0 R
+/H /I
+>>
+endobj
+20 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 582.816 210.33 572.816 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 21 0 R
+/H /I
+>>
+endobj
+22 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 567.006 404.45 557.006 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 23 0 R
+/H /I
+>>
+endobj
+24 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 546.006 234.22 536.006 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 25 0 R
+/H /I
+>>
+endobj
+26 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 530.196 430.56 520.196 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 27 0 R
+/H /I
+>>
+endobj
+28 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 509.196 385.29 499.196 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 29 0 R
+/H /I
+>>
+endobj
+30 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 493.386 393.07 483.386 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 31 0 R
+/H /I
+>>
+endobj
+32 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 477.386 510.27 467.386 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 33 0 R
+/H /I
+>>
+endobj
+34 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 456.386 321.66 446.386 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 35 0 R
+/H /I
+>>
+endobj
+36 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 435.576 249.71 425.576 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 37 0 R
+/H /I
+>>
+endobj
+38 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 419.766 379.75 409.766 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 39 0 R
+/H /I
+>>
+endobj
+40 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 398.766 235.84 388.766 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 41 0 R
+/H /I
+>>
+endobj
+42 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 89.5 377.956 125.05 367.956 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 43 0 R
+/H /I
+>>
+endobj
+44 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 362.146 225.85 352.146 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 45 0 R
+/H /I
+>>
+endobj
+46 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 346.146 262.51 336.146 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 47 0 R
+/H /I
+>>
+endobj
+48 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 325.146 260.26 315.146 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 49 0 R
+/H /I
+>>
+endobj
+50 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 309.336 237.79 299.336 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 51 0 R
+/H /I
+>>
+endobj
+52 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 293.336 206.68 283.336 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 53 0 R
+/H /I
+>>
+endobj
+54 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 272.336 154.77 262.336 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 55 0 R
+/H /I
+>>
+endobj
+56 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 256.526 204.19 246.526 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 57 0 R
+/H /I
+>>
+endobj
+58 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 235.526 408.92 225.526 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 59 0 R
+/H /I
+>>
+endobj
+60 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 214.716 179.22 204.716 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 61 0 R
+/H /I
+>>
+endobj
+62 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 198.906 366.1 188.906 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 63 0 R
+/H /I
+>>
+endobj
+64 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 177.906 192.0 167.906 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 65 0 R
+/H /I
+>>
+endobj
+66 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 162.096 172.82 152.096 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 67 0 R
+/H /I
+>>
+endobj
+68 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 146.096 163.38 136.096 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 69 0 R
+/H /I
+>>
+endobj
+70 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 130.096 311.93 120.096 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 71 0 R
+/H /I
+>>
+endobj
+72 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 114.096 215.32 104.096 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 73 0 R
+/H /I
+>>
+endobj
+74 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 93.096 242.01 83.096 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 75 0 R
+/H /I
+>>
+endobj
+76 0 obj
+<< /Length 801 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!$E9lJ`>(ru)m$K"=LiVG-T3G)RE2JH1A7I-Z4+XJa/$OI/P/)Pf!P*22dKu;F,iBXX<\,H5LhEF>kbIITi5m3qF#m/9V#0;6I&B(^X6m,n\>(_SZ<q$/QK':Cr]msL@Yi5YI95r6K"TqQl3P5YO^l/EaJE^'rDpq+@Yt=?3@C,Z$/D8DTn:*1Y7I:5?c,D@!_#^&2NCsa15=!,=fJ#@PI>XcRQJ5$PQ<Gpq:11k"l.D[.0]r]$*kDG+iVXIBO6[3^fYpE`Gc-b4e-e(Ee'G^t,il[KCb/(g.:F.mKbA#^-#tW7N\K7)ZMc=(AcoOK`fLd.3^+Q0O4$go83]QeU\1_q3j3.<27?,F14@lEU-Ib,KG]&nES6j=#L.SXTW-t5W^%-t3GC_f-X@1]UBq`$o&<`JPGMUOh"8Gr$jtsm`hqa`X%h(UU8XCi_GK6Hcu?kPKK>QkU0QGbpJ\Q/ga8ODFhZ6$rJs;u]e.5NoP2qZ8LdV_#Xa:uOP&Z,'dl)LZFTV1Kb,S&WOLW2#!nM]*W=WnpK3ngPamM],D]>U']hesRB=383,=r;QGl=[B&Bc0H.&7S2Z#78Y"ZJ"c,AaTjq/a[(#HK>`.ceL7F1!\'r:Dc9;5d>>Yu-6^jGY^4S`&ZFfqaJ;`6Hl$Eg%"U7#]W=7'A>(_pp9gB7gn@!]#K5).t,<Mf-H4a!X6Zn6H4<I*r%.'Igj)OH@^q[PoJpJjQ78-@Y+!r&bFBK)-hDfrX4FI^n1N2"kKlPCMlWJf4Tgp*OF2#)#/00?YLnPXd"2TK/pPM\nuMq7~>
+endstream
+endobj
+77 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 76 0 R
+/Annots 78 0 R
+>>
+endobj
+78 0 obj
+[
+79 0 R
+81 0 R
+83 0 R
+85 0 R
+87 0 R
+89 0 R
+91 0 R
+93 0 R
+95 0 R
+97 0 R
+]
+endobj
+79 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 709.0 182.0 699.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 80 0 R
+/H /I
+>>
+endobj
+81 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 693.19 160.04 683.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 82 0 R
+/H /I
+>>
+endobj
+83 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 114.5 682.19 166.15 672.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 84 0 R
+/H /I
+>>
+endobj
+85 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 114.5 671.19 208.92 661.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 86 0 R
+/H /I
+>>
+endobj
+87 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 89.5 650.19 145.61 640.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 88 0 R
+/H /I
+>>
+endobj
+89 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 89.5 629.38 172.27 619.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 90 0 R
+/H /I
+>>
+endobj
+91 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 608.57 184.18 598.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 92 0 R
+/H /I
+>>
+endobj
+93 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 587.76 155.61 577.76 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 94 0 R
+/H /I
+>>
+endobj
+95 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 566.95 275.87 556.95 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 96 0 R
+/H /I
+>>
+endobj
+97 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 546.14 96.45 536.14 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 98 0 R
+/H /I
+>>
+endobj
+99 0 obj
+<< /Length 2872 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm>>E@OI&q801n7)Od;0B2kpMG92+Bu3AYhaA(T]lP1d2!<c<(Y5=pXbb=^"/-![(T1qLQ,hZaSBH1Ru?ppe!k:4B<ruq_V*E79fUn?M.WI[(X98<hTNcI&1*7f;`"=2D%sXPrF[1+pAWg%egO\pKb:V=2u@[ioV3-XT1.^9d#4!^'=,^B622YbW=mpBM<>*u]&SKHMh2u2]\MYqL:8I2B.?)Mr5MgU`V2\<-!%_<j`'h*2jI@:h$gbV.VWE:lf$,:-g:I)s*o>"p6"8E/R-b5gS,Ir24@iV.*`6'h"'8-((<Wt%T'C(i#9]&R&N4-q6O'7l(bbS]s7]ki?$"I?l`I.>+#8-&,tF$^?u"CCT2hmpm*F2_u5sgXkSi^C7Yi;*C1\eCtNA1Fqk30/@?6!A#Q_5)qKn]_64rPSj!bm!9#LD:^O1S.dS7*#<&\eJWR7QebDOKPjCKD)@H8pb$@ZWON,)Gck<Xeq&r_1*)eSB"]I\67`$[6]VpAn=%_m;FEc<%&FWYAIEbSRfY'Op0jnXp*&PIBL5-ZW%_V.\gc=Q-,Cq1]8YQ5%`W,3,eBZ&thq2?8Hc,r]AHqNEo-%/X!ehWQ%gZRXdK`?WF3u33R&[a4,:/\6m8g=`4P\Ui*$\8;'8I-kUD@61kXnQV)puL>Dcn[7.@c22hS[_&c`FAamV$GTTdtr@2;"9tU4=U?\Ls-1$oV94>JijU#WY4qRpaOQK/iDJ;Sa&(0D,.,A4CpI1)u6RKu)e-/('C4_/B.0PCGmo6M<9!%Bh'')$hr5eto$;0Zp7(c'S5+d6l#Y?1/AbcmAb\?B*881dC%D9YtQk)i1PoJ1KI-[G2r)I!o=K\bP(BK/^B^aml#N!D]3qi:sW(LimU><1n!X)rGY4JoIHO`[,S9g8p4OE:OO$6-g+l)X_#)kb[n7MW'Et-]q<.D4P66$!bOA?u_T"0aJNKK&sZ`'c3rJ&t7$VU-4><$-+#"M's6FPLd6;.:?o.G.>?YA2:d6N$u1Sk1mpR6NNE&H,l.`C]r+!8%&u7<nPWq&Sd<X<&!F*!errgKs`/%(JSeA[?*6j7YC_J.omMQCd,1t(``Hk)7"?a&KUIH2P]>jlH#0Q!L-Y>m]b;e8o@(SU>eQL"@*8A6i@8$;C>"/c=`>HaJdb=:R*]ZY6M.`PoT?(X/8_;>7Y3Fkc2<3#h_OfLd%IBpt.A,'rrPj(g(F@^@b=7<KaC7iYW+S+5O1'`KEWpD<H\%XP9dQ,Zsk3=iWmD*THKW#;_DmIQ+c2n3m$Z"9_V"1p,/UaK6:*;:Z\3i!PgRJ`D-u&P;lEI5,elS^rom7/Ens3p>?]husrcVH`KIRn88^5&+0k?5qb:oA/-0)E_>f$:ZoZLk9>9VWBX=_I3W-NRB^;"Y'l1>k)Si[,c#M6LClJ0T_>(8#EMF45UdanS!:=&aW<$iQ@Fh0J7;5('9:\IS45U8b)deJjnF^?!N25Mp1b0]j2pA7(cSA\fj201FPQ)1XC#=bI+MXB'm\"Vs8Z83<DChe:sGgn)2jX3%N\2&AVnu(4$JSCMitO,!cLNNpT!OMn.ghp3)cpJ).:H6"?66DT*+5o+@9]39&M#!^$pFR9CS2Yu7>#?h(M:`j&03Q-odL`cqQ^%5U.^[7`.gk\/*01H:`ENmJL_:EWc,O:+*#q$MB)Oh.b,LoJ2hOF/"Z!@I_9[s&9\!iJ#KAn[Xm6Vo/EQEtI@W1E>H&QBcP"r1gMm)@.PT`7WMSd>hb%(V!crK5aY1\%uRp(Y2N)./h5'l_NEl5UpZ&\X"g$_TPNG$3fG,s+6=jM[JTi8_J('-T=fg/Y@,qfU[#^CHG)EcHoh=lEOXf.THj7SJ?M*(R'3S6b+@lRt0/Fb>%.-k)]_RiP1BZA5@q-+YUK:3t9<'X(LN8JZpWX?tUq^$hY`%q)/&^JUZI8-O;NHSCDtNn;"ndFY=C*!e]SF`_(/TH[0p>bB6,A;a7EoOE`*'AK-f,2"YAEc8eKf\e>i!l[;KjMFe14e@7u6JSNR0Kn\S@A'gcTsFIeF?k&_0URXCE\X&_c0Ti;,dt1'I-+eVj^)tn1;(k*(=NMLKfLt-=,kg`4#DXXS\)nCA7K@Qae$^S8Xt'8!5/^KXoT+diZO;e\-W]q!CRo&+!cRlYe8iH/mlE^'7.L\\tZ6OV,8"=aVDMOKO1f&+$V_B0KfV3,#F>8lh)j$nNhT$SP[3u,tjK1cmt`kZW/c&&@04K.d/2%/;UPl'CZbOGff$W;Wsk,)PU<T*Nd;*<'e7[9#<S^P-<5ZSAHph&3Gb?nTGQW1+G$pdg$0nqQ=Ah<nO%3DK,A>OQT]*S!+=HI?6FkFa9Z/Hc4,"U=6loMok^:j:(hl4TAZdiF.rmfJEua%'-oaED2#HB\eN_YATKc/ubL6UPRR?4r]0MKdU)eVTBKbRaIH=URkM"h*ZfF-;ZmX%3%o!#:@?5IhAs#g-BX!`&UjVMCAq0@??HahJ/`8%?fgd%l/Ro2O[)CO6P\>p4tNO&>:Oi`L3j"d)RNs[`m?ir;Q:`^dQ4<!F#6mq1L+,Fl.=TjS>WA]S`me36NV&+JLX8&ZJ3@OfPE6QJ=5sJaEDjLW/j1==/:ILo1/?OH(+5k[B=;J#B&).%X#)fVKCkYd;]ORMf1[]]bUa"+@.g)Xkh7eYc2TI%KtLs3!RiYB/'F=^E_^`1-S?qsba($uOE\TR<^d\`2$GI*7c4`\RWU3P</">+B46j+cal:#f\sI5X1Ps7lT.TO,'LOM-OG0TUj.2YiSSg4;F_UZiAtJs"%J+R*P5Edq1)LZ*hGRO_[<Qga,f@CTeY?seq+Yn$=Q=XJpI+.b'h#fd^9>S1P()m[cGrpc,el(2_u%Y+L@D?%N&RstF8YBEt~>
+endstream
+endobj
+100 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 99 0 R
+/Annots 101 0 R
+>>
+endobj
+101 0 obj
+[
+102 0 R
+103 0 R
+104 0 R
+105 0 R
+106 0 R
+107 0 R
+108 0 R
+109 0 R
+110 0 R
+111 0 R
+112 0 R
+113 0 R
+114 0 R
+]
+endobj
+102 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 320.58 344.866 358.08 334.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 15 0 R
+/H /I
+>>
+endobj
+103 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 162.82 333.866 200.32 323.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 17 0 R
+/H /I
+>>
+endobj
+104 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 417.73 333.866 455.23 323.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 19 0 R
+/H /I
+>>
+endobj
+105 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 397.2 322.866 434.7 312.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 21 0 R
+/H /I
+>>
+endobj
+106 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 220.54 311.866 258.04 301.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 25 0 R
+/H /I
+>>
+endobj
+107 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 416.88 311.866 454.38 301.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 29 0 R
+/H /I
+>>
+endobj
+108 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 447.47 300.866 452.47 290.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 35 0 R
+/H /I
+>>
+endobj
+109 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 488.58 300.866 498.58 290.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 41 0 R
+/H /I
+>>
+endobj
+110 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 428.28 289.866 438.28 279.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 43 0 R
+/H /I
+>>
+endobj
+111 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 474.39 289.866 484.39 279.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 59 0 R
+/H /I
+>>
+endobj
+112 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 497.99 278.866 507.99 268.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 61 0 R
+/H /I
+>>
+endobj
+113 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 253.93 267.866 263.93 257.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 65 0 R
+/H /I
+>>
+endobj
+114 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 300.04 267.866 310.04 257.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 80 0 R
+/H /I
+>>
+endobj
+115 0 obj
+<< /Length 887 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat%"b>.(O']&L6XKFeiA*9CoTg^[#CYCIUKNOVk[+9o+MA'CsI[p&hlSe!X\nHJ3I=:PR\TY-NcIK%XW.PD6?989A3tr;"UWBnYk*$?TgI'@-H9/D%3P';=;>Ag(.p*t#PU-[Cg`!fHdW_9`W'!Sr./KWX]82VEmTn\Rb3K3`-G-p3OiCY(.98e#d3=Ll2jG+#>fO=!i?3s@8'+&1p8Xb\B>INW+h(f.K?F<+O8Pj3qk_>]+Ub\i=n%+LHY'J)Efht31sN?NMmHquIoS5>/tnto:qf>E&Y-YS$8Z4;Rbch&/e+EHPP&Ot[Y8#1N5+#bRDSf\NY$p*$'9\6%<?h^NOpU-?;XBRZJO/Xd5$?>bA,M!>1_e=4X_V([Gj2bVQnnAj-;nV$*Vn]gF?a/1nLhGiL_YRP.rU@-$t9`aC@Pe]`8\jH!D2T>#;WLNi.;6"Va&JUg!Z4UL'-;CeOTF2rcWcF/lR\YXbufT,/hCgo.JnBd.;m(?L)gH'uIL.cakd^7hFs/N#[%417`GUmdP-0JqfaLJ-K-$<s\C5@n]C+.m5n?lqL&E20cueZA2fs(--7bWd)/r5eF4R+iWEbbOUF!MG5.M>;<Qq"\kn)tXSYIb,MKO--1g%2E&7=/]_**eoHL/*I\>S&o>#)#"OhNI&@uR&.T:h8qLbT8\-7/dQ,PNo32K<9rW2S/VpURSOuIMs^sg3C-D%R6!7'AtI_tP_Mn%VEo_qc\t(Fe`M>T6KNHA';6%R:6&i]C.'KW/F4A6LblaV\`utH]W-&.3,iJ7An<%8D*eu$3n&oHnI"nF+^Pg>AHnK=\Nd5b_,m-Y^b3KNSlI@`8aXm-LP*o1cUH@fp#cYSD9&^HV^YgOG4%Ajs*"e[U<Yukr>2X~>
+endstream
+endobj
+116 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 115 0 R
+/Annots 117 0 R
+>>
+endobj
+117 0 obj
+[
+118 0 R
+120 0 R
+122 0 R
+123 0 R
+]
+endobj
+118 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 486.96 691.866 532.52 681.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 119 0 R
+/H /I
+>>
+endobj
+120 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 281.41 669.866 326.97 659.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 121 0 R
+/H /I
+>>
+endobj
+122 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 266.43 658.866 311.99 648.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 121 0 R
+/H /I
+>>
+endobj
+123 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 143.1 615.866 188.66 605.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 124 0 R
+/H /I
+>>
+endobj
+125 0 obj
+<< /Length 1268 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GatU3>B?8n'RnB3@.G#X,Uu,O^gh]4Cj4U(N(^SiE??mU7Pcsn$IL4#IYAHn877r_-P%*:3k+R*kJI,gin[o$i=Pfk]".=Dm0332o7t"-0R&YO+AA/hm_-XkJem2PomLn2Q#a8KQ/'LKo>:C`V10FIeAM9DSk_f(l<l>8I]"DB\PX!dUCn$$FI,_HMr@WU"U$`(\!+Sli?G><>Q1FD<IeG!RH`ZU.ejCuqOOfShYoU,5DiVpZ#2C?jL3I4<2/(V=8,=%REOD:!-Z^d3!<M/GV1luca8ealg+8HO/S*Qk':_-p#7s,LtV?[bI\8c`UT!qG"<9A0Z)+^"Cg=/;2NjV^dW-9+OMO3mdnOiq$[mf&n2eY]U"Q"q$[^'&>LMT`NEjt&4/kT+"FOXC-VL)m-SsTT*nt>K/6Rb^4]pHU<qK)\sdUcU]gLUj37)cS-`e$3%1mEf+)Rl)bd2'TK`,WU+nF9)e8G-)V3"j5VSr]NbpqcJ7'$sJ8Kjmjd.t@EJtlgeH3Me9DkID:JnpM'5'rbTF<-/D4n!KP/M1:Ar%NO9'l:c-K5i7_Z0aD#fUiol*rIMWe/kVcW:=j8(FJ#BW(]M:nU;BbSAI*[\P3smQ-X#G4=\p)I@4+#PM<:Vc=$4kh=NegWMi(r@:V2LJt<2h#RDaK_dW"mSEHqo(3(_bc380T(X[U9&LFK*"DZXD9&t*b1)aC0rekB:(pHUs2aKf:NB-=s,B$^VA?tRP1kLscnY+7!mSfOD,^@\"D@p-[tE_q6P%9M]!VN3":tG0<JnGZj0-um3qgJ@YFeVKjVGuAJcMTq#<5L/5^lf_CHb<p8qI)3XErHo<G=?)7LFL"FE?nMj?P>%f5bL^S)NKhbIYUVWoj4a]-S_=8#YPICqDRS-h_UXhNsd+2o_')eH/H>3GS7aYX?:%-tM3$%04r`Be=nr"fJgm\*KEY&i/54_6?C0K`HJT'^Z!7qKZV0?=(CoClI-1_)<fZr>*"u0SJK8G-,V,c3_?)$=Yr;WL`T8<sPo#g_W3mqC"oTQ[hR[O`'2C5PU;p#a<mYqZ/",X"lD>K%]TYFarH:-We*WY7KMg=Q'La1^ou5]Q5jWO1J$O)?j8W#?p<Qqn`ebn0>EM@Dkq.mSeht(=:6[S6=PYZQm/"06\KBYqRGc3FV9p!=HkS6bg%o[-h<(mSVHb9Yp]Kpcb0f/MO0CYNbgg$I)58'nE^I>%lWC@?Q`4n^E]\T4il&g-l6:,\6<@j*e?>hANZ?ruEOPV&0.6\/]n5~>
+endstream
+endobj
+126 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 125 0 R
+/Annots 127 0 R
+>>
+endobj
+127 0 obj
+[
+128 0 R
+129 0 R
+131 0 R
+132 0 R
+]
+endobj
+128 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 145.6 680.866 191.16 670.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 119 0 R
+/H /I
+>>
+endobj
+129 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 256.97 669.866 302.53 659.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 130 0 R
+/H /I
+>>
+endobj
+131 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 334.74 539.366 380.3 529.366 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 130 0 R
+/H /I
+>>
+endobj
+132 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 92.0 504.866 137.56 494.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 133 0 R
+/H /I
+>>
+endobj
+134 0 obj
+<< /Length 1805 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm=?#uJp'Re<2i2t*p9_l-Q\*UPkAuBK$.D'jrqB1EH2$M)P^a/r/0A$S4+PCOk-P%peP0Q3OpIkK155TRf[G8Q@X>i:_XQMCkEo>9OVB1[jS[n.aOVJ\`j*>$>=Hh*O@/TqG:$%hk#"H80)\H6Qq4=HWd\O`))3pF6'G$J'Q3f,rXC#$+(B=anf@^.L"#4^[7'k6`hEY<Rfe5Y^*!'/=8Lc'3foMEkU0ptidse5.BR]tYNZcM"A@[DAM3_A?mo,[;3`jl\<r`N>_Fj4h^>nks:LIbYe#/,I/N#!ue"EUk,`*pMKJRH(imiSJm9CuW*<#)aP*ASO4kRS1?BOb0Oqrg_LQ4HW/5&02n'HI&[q@K3geZQ0cD+adokaANTjDJ_31c$V?I2q6:D\gGSf/%8-5*%j3AtcI-,JBErBNgCG^o[i(V.pH%JnG4m.gq"k1h/1(H$d244qW;<dN.C#60+$UN]#cXbt24>)dZ@pHoIm>2n4;Vi57T(*0Y,jX3'`*:8h!Y&)_cTjb+"s44Os=KCC6oQpL397gb3hsEA73\jD$,FkpA#YA<YQHo[8)"L[7\KN^[8(<cL,r"G=rF\5&bAn/H<=V-hk?oGNIl8ubOodcu.#7;CTb6oWBDf4_Xo@qDq"lua91;_pTW&PA&23:K6":9R7S/FLo9Fi'&B65p`jZ0%0C#5r23^?iI&DYf[E-t,:kXnY'-'&"pm[0gVs,u=3m]@?#9@HY3%68^mLE.`T)q(khR>WZj_,I;C+/0^O_?m(SBZ@PDG8>7N"8N!"OU^D>n[(0@F@'gA)K>:SfkAG*T=(_G@NHK/`,W"%<9j2:Rn5GA9;\^YoT2r+Bgs9rUU>%*NE`u>J;TJ4NAcDWGfD"ML:r9I,!,GahSkA*@H+hdOYPSSCSsh[6>Ht;86Qa3o;j+_9(-eNCb+o&:,8W^"r5VpiI5Ti@36@Th+:ThQL6eL.J0L<QN=IQ*&rpXBZeQ'VW^G.("[&W#XiL:Ne=6\_l,CqY!Noj+!P@<JF90Jq4.IR;-&0S;-H*=.BIkQ:@#5^7h_94]J%km+@g7:j8nj`Y%u/(R43aS*>f=?(^%Dj13&=U3@+QQ&\(sU4Ql2`EmK1Um-HtR=XZc@gPM'X.5U3f)M3VoG(IqES!kgZ"Qg;gCNs7c[dBTN1jR/;6Q0c9_<bsW"1j^@lg+6d9O(Gf9g;oQ9UtQX"hRc!.S@^'Or`foZeH3ee!i;+BhME7FJ')1+B3IJl87?DO-qXV#s#%^L*KJ,^k1WO7JpOACg5_Ti/M(TS/*OW1W]>Npf.qcijP%Hlu(fB!=DKbSr%N^d`$^nO:[F$TbPM<&H"*Uf?U+TkVR[.$5d_*3*@U>)5f54\da(!Fs'Hb@*bjif6q8mk-p:bJ_DDA;H^h>Ke3Te_l<UBSl&F8DFo3?!3_f/A&O/]t;#SnbLUD9NP7::oio>C=+0L[s=M:m8/"Zg3tun\-tK!RGJXY]^$:;Y4b4^o[AgN:`&u/-reg0eQd5(DD6)JV/bmCB_&4I>.q44&_UE^aX#&o`=.;a,7-<ID:&UjA0@=R89\E0e)%5M"cS&ncqbCPP%'&C)R6$E_'R"t54fj,Vj*-I$@F^/;@,nARK^N"?_sRH#7MuqS/;dZE9Er2--?BK('>of/QY=Hc%cSl*QEk3NUV$EXNNLd00kJgc_h_oTSi-7"bAml-eEKQSfLqr_ao:@0+8L1q!1uW:1SqXM!$a[%[mXAKY(gn@EC"Q"uLG+fV;!ob0fnFIeWX!"^#9*X1*)lSbbY%N^)A4I/*m<FoU@Ap+PshJ+FIE@/~>
+endstream
+endobj
+135 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 134 0 R
+/Annots 136 0 R
+>>
+endobj
+136 0 obj
+[
+137 0 R
+138 0 R
+139 0 R
+140 0 R
+141 0 R
+142 0 R
+]
+endobj
+137 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 303.88 680.866 353.88 670.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 45 0 R
+/H /I
+>>
+endobj
+138 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 491.34 680.866 536.9 670.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 121 0 R
+/H /I
+>>
+endobj
+139 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 373.14 583.866 423.14 573.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 53 0 R
+/H /I
+>>
+endobj
+140 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 429.1 540.866 474.66 530.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 119 0 R
+/H /I
+>>
+endobj
+141 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 215.02 529.866 265.02 519.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 57 0 R
+/H /I
+>>
+endobj
+142 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 389.69 497.866 439.69 487.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 47 0 R
+/H /I
+>>
+endobj
+143 0 obj
+<< /Length 1357 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GauHL9lldp&A@sB:d2iu(<\W\2^`URZF0KV#B()q%O2gdWF/1WJ8FVVh\MC!)`/s8;S2%C`<^cr^[?CGd&Zg*\$rX(#.A$<`L15\cWnYe5M(cU>)SriG5]KS+0<'jTm^?D6H>em(E\uKYsug7VDU$nen!<\^>ZV!4DSo4i/1SRa/)tJ.cV6'X-NZM:dW?J[SZZOOq!@`)VWIX``:\CA34/jE@P*ce1SD4jqII0'PrtuJl`B]budt;J<hY0)L+Lf6</B2Qi1*oi9UBB-;\:1?dIYE2CmadOml=3HP"FSIm)sSk]9f&n!;Rm6aKTM$&%HJ%#0$Pk-ZANONoM,p?(YD"+'?`-2e!V$q*L4:IHAL;EdEtaoo75P>)_t"d_p-\IKTsIUM%Eg-S'OV6"Gud%M<o,g=erj$!k%+NTM"'g`o$crD!(jFC_dR'roDY0b)#)'6[?S^FXR^\s\^pJ%\<A#fOW'AUX.3<ZmB('0STq[;>[@82Ys.!&q)X\)o8S^*;C,H@h]F.H&N/V+9BZ<W^]8Lc*7K_1u%,:kfo%L&r#4;5]&UnqE[:XA]o+!([jP`IbY:A)?748^&iNZC/u&m:Nh>L*TZ?;.on.G`gmII0I@o_&%=?HNAunhAJ[#Jr]D9@PVV#5a`V&q-[=0P_iP8($O(<9#FRF0XDLPu,PfWr1;TM%eS$IZo-)$gAhd2=UOAba8m13dF:AM3"!$V`U)B_h>S.Df=K@0@u_DY:RC0gRb>'hiu)UVT,q:;pUK%qYeIWio;3177H:eEM="lm+cEb%VBi<T\agiVlVQYHRu'i'\cU+0MYBDiaL+()XS%087'=HY]`3-^5#G!2M\FnjEfhL1K,/cJP(dH1HDYW5@Z,_at]rV*I<m5CZ9t#g57j4.Fu5bENgA9YE3Mkc=`\,pHjE(mAG6\$lg7O;W+>TJd/r.)"1A_D.gd^RlUXQ0qoSb/DXS9C4'uGLOqGN</`5jp(]oWSN@'YEen7"(Z8!UQcO)d<=uGM0A""-cjTDOO_Nat"%+Jpd;=?TqA]o!)#6YUn.J^_r-tZ8JIbh'Hm^0gR[TQHeG,TCMpU=GC4:GC-$A>#N':)dpkTWT3bX6ST`%=t)]DZXAWD\5*M5S=5)pnr29%a;MI%t?YB6U8QdNg+]5lh"HWaXY'gS/.>\Gde^L*l`XF.TR%n['GlAbg2]ftqi9U&"5U80/)hei-X&3)k"0:G!ZOd!bp^DKk^rKVsY-V:t19SNoV"b,5E%u7euE&^sKoOj&<9,Vi6hD:E_#+jjC->4G\7<b*iQ\B,J7Mh_&W4f:fS4M7-r9j.PM6oN1d%KZOZQ&d-Zrt0@`:,X"H=:srpC?dU4o6&5"^L'~>
+endstream
+endobj
+144 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 143 0 R
+/Annots 145 0 R
+>>
+endobj
+145 0 obj
+[
+146 0 R
+147 0 R
+]
+endobj
+146 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 427.03 647.866 472.59 637.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 121 0 R
+/H /I
+>>
+endobj
+147 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 337.22 613.366 382.78 603.366 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 130 0 R
+/H /I
+>>
+endobj
+148 0 obj
+<< /Length 1962 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GatU5?#SIU'Re<2d,&6)de#,l(cGp("([>=b]25DFWY:RZA?Yt-W*G;m)P0MAb/eD*="qR>1)?k4nn!l6hT'm`K)s?iV8^U/@,`=fN^Cjc2TamjRT_"N\/9ZNTJadEZ&$o_[L@NY@#S)?d(^h/nW_Y`U&=4]>8q6Z^dm+j/]H_NEZl$a51#a=H-OciA@e*K@OOn_1&fFD/].;>iC/N>dIV80PDc30Of^$@YJFRh[%q-8VIf^=#+%>1;Rq/VG3=`X+qug$%2j9<dfi0<"D;HA;Crm3t8&*=&6=-cO;Pto8^`H@*4I@qrk9[VoPWY>0D..jcNF#of[kMJa4=.CCKcq<HS,QJfsr5s&%feJs%+O+BYRkorPfS7fg_Q"f.<I-;!`N7i<q1>Gq\df=k4Z9ZkWrQ&I!(M%sC9rH[dE[M@Fi*#_;S0ocaR]ZXPeG2^X(k1U98nEY)#BM-U-XJu+YLqt;hAZ>$Ao<'FkYoP&`4$&BU2b-l=US?sE8__7Fdr#TRa9n/[4A+q.VD%*H+/kP;=+@sAIQOnbDbT]M?h6ALJ.'$O\IpUVOh4r/&-S-W"hhN4r@kjQc"HdQ+5rg?L55HFX-OG:W]$6X)q7Y*#!]Ek\@6f=@2:-+N,8#;X3&\?D7r#KA4;X;S`?]rQ(5$m%GFb(5(RY5)Do+E'eeOKjqSI+G\T5DM#W?\XR25Z<A-D*r+Kj@-U<8n%nj8)_t%`*[:!`<-P.?Td9+kaZL<(52Pa5gb:o9_Y:hl?5X=)%3$T^RA3n@>8Kcr>)TsaT,S2q6,mi4djTb;QX)[`P>i'4iTeO"Z'3[.Z^g9_0oVe!kq.XgVk,S?>WcD?GGZj!W&*>6U9(>$%.@l99N@UK6KB1!M,u_B-+&l27r@q<(`-IeBq3ENjFF_UGKlK*M9.JPSWq4LbVL""2OqDETSQ#b[@a3:6,ZeBBW3sb].N5MnlD>=&BJ;k;]JpJmGXa/*l9KYmX:F<*%9#2WJoQ+FAs/of@FeDNk$?_m20n#88=[O,C,K'kCES;%)M04npNfCi(,Mt.\IN7XB2*@i(pImKR1r@FPmo`HqjeY?k1KWM%]b0nJ?BRWq5ER,PccQ-$pI7!8s;_^O-DuA=]5#n8%l-d6#:m$C/)(g)7L0.?No,,"QVJC+SP,UBhg]:aDW"V$r@Hel__P'//YN<+1Z&Z$Gp+W%BsK(5r3$\laEgTH8\=^GHR-FR7ZLnVGs1][j4Du4KkeL2mt=$KEBPU^]48t*lnSGJp+]1F:W"HE*K\C8O$Qg&KWR>:`WQoWh1(($`COPC1aWR=Z/^RR_0HXYGACE0;!B>_VYZq%&>Ds`L^=.53pa8k<eRIpNhVi]pY9ukP8\'"CS2h9e:0Rg$%ku"bJ.GdSl,aEjs-Ki-.83:Wl#fX(@4TKE>OJMdik+1st6H15JDV[b0Zm./M_Z&0:?$[-L[M$'c*T["+_Z.F>ZARa,Y_N@[>m.]W`LNdrqYLCkqJndVL/ZV1*2<JEh%kXE-SM'J,Jeh:rucW_lVj_C.pB\$%l?iloM_GTc3+NosHir[s%3&ao,qQ.Tu2n2.<\;p\!Z991]lEH=K7#k-%.nu1Z;:CSZX][SEXq99sWIEqr6%:Ud([-.eH708'_#+b@oos.ViTUL.3"#u+JGa[4g5oKZ+L>(e[@$p_M9D(n!8;Kh@'^s2<2&sdJTc,l]T=Y(rqN_1rHNg7Vl:4T*mjuETY`g?bKt=(We/cHmnAU/m=c822IHCg(5H:Le!dsYKMUD9qr;<&W!Whf!5`)qhS.rQZoU[urlP;CK%:%3$,7r1kcWBf:_)W$8<d#Xp]!)^``='LrKlH3CU(_M]nem5Nm/g/)jd2eR\(#AH&-Ps7_7fG[Z3>U(Nu,,W(M+#%\LA,au.eZ!iJi8kF<3*bA*\Q+F$kmS`tC(f0.Eno2(O72nBX^K[72[YCCg_)rP!a0tP+1?QNh&MuNbtX=Q(~>
+endstream
+endobj
+149 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 148 0 R
+/Annots 150 0 R
+>>
+endobj
+150 0 obj
+[
+151 0 R
+152 0 R
+153 0 R
+]
+endobj
+151 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 272.24 638.866 317.8 628.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 121 0 R
+/H /I
+>>
+endobj
+152 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 259.19 440.186 304.75 430.186 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 119 0 R
+/H /I
+>>
+endobj
+153 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 177.52 429.186 223.08 419.186 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 130 0 R
+/H /I
+>>
+endobj
+154 0 obj
+<< /Length 1233 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat=*9p;&)(r#lK0YV(A-3so'!Ud*Hc*"P/[[B]LZoMZ;^pYpjD'2/OHS>?b'c8L<b59TV"hfBAn'@'BaLNN2JcJtO14n)'KIeO$a?mt56m%/6qGsu2^0a"@RiT,JCmWZ@MlL=2/BQO:Og85?Mc@T7p2e8(Ta6Qcoa!1P+'/$G[(s-hA^Z0*]3i=PmfOI28*q!5a^>e7nBVU7[bS*DP'FlI/@'Z*.'`W=ZW5#u;Ws?uEL&8G:9'0lf.$SjV!@XKO88/9IQkB#k-M[`m4*FQm9sKd+TR4umF/&;V$Y,:'ekP85=Z9<(a36U^\dkE'_o'M9EB,8$^3iiCkMk?WPt:5(k!EQN*:,@B0\gLC1K(f8rQ2D*tT>I(kfb,kR^??O`Fc`D%,X$-3KdMn4]W?$s]uqe0)ah4f7!0GFrK!V(>q5X8'N1CC^W"ZUA4c7F;nV!Rq=^YJ\>po336-MC/6AhgW<Flr["j=_s)a#QoZ^p7!6B//NL%=>EU0?jGX1[[UV<BpluR@cD^H'8[`gNKPFhPRJi;amui12;*c&_8K"K%)OW;=!+5Y`U^fhPnj,f(]cTsA6JHA8p6&sWVbkre>U6N--uh`l?9K3LUXD8MnN)\=-MD)na3N0:W>an83/1g;$(!u6qID'k%c<8^_*^-Z@P-4i2OXjS]mB'^uIi8Ha]$$@$eM;`Nn.KZ5geK>WFCaCk=3OgbiXP4_qs_H&hsjC%._ge!EN(OgEO2N$FuFMnEN4)1\1/g\*d]12U"`I0bGrD;PR_fCh1S^k]s2G$uoMh"@k&2X3BbS!kB'!UrkoH0X1fSm83WR`Sm>RHMJIW=+;QA<^]V1[Bh&C:=eY>$]<`Y8#^J7:P%,3SWj,L'rc$>r_c(_MNuG%P^8lZW)a$i])RiFacTif@F)n/[^"-(0N8s.#HsMp)_qUXlPuj/H<]LJDK,hL<>X)<1Ne\Z\fPFj.a6t3mrF02gSrf#eWB3pe\E8Om7p$FcX<"pI5\LnASA?1rD/rUOF-<:fHg4UNuE\(aS#F(NPp,c%.lMPo`i:BT<-i"&d<7SEm;S(S/i]DmG%QD#::[Bj@3#8UI'J]S:mmCVdGj_..pT6$m7B:I>\JmEn#1]29J#pAE,1%"j*=Y]]Jq/YooVH"PWF+R%3Bdc["`Xm&/C9r?$(9Fs?jp8r+T/^AZSi_<]La:#]T@[;S0Z->^BT*^;X\6cKXhnR*FbrPt\XleZ!>#,(urCulS~>
+endstream
+endobj
+155 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 154 0 R
+>>
+endobj
+156 0 obj
+<< /Length 2043 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!#]h/f&F&:aF]_<'dIR6V=UVB<pUWH7H$e'#;_HC^oD(kg-J,7:0*?g_hsaTbB>a`_t`2kB1M_6.s2]DL?Jni@b]htS+/$r[P_Of?Sq5VpMHT_T@+o?G&N[\ngPmE7<C37W-&1s,U#qn"dgiFFupo56V"%]>L0o#bu3YAPLiT]B)LWeJ2$mB-Z;XnGM25W*muf.];2i;te14fXjNlL)37h]#\XR]Tt(;c>"Tk+5GmIRh&:,cb=3q3;XpY_XI;<26=JU!YnJ3o`6ER<S4-p:/Ya_%tHIbNgs<=#I(.^l!KYJs.L#KfE&U(#jkjDXTfEltIgCN"J?Gm^$CZT;SnG;,K\5&o!&crtu*i[L[j9%#q$,!>>sIW'4t2"oV3URVae2$<653PR7Fn7Kq(HDN>%.#[:;.O_M<P#Wth^k1WQh(^GfUMqYp>DltZ&G[G[3X9'uCQAG<!kMo'qZ5G.E!\)ZT;e&mR^7t)s@-VX)Wa8)=^.B,P_#ck*h7tsSBuLS!2FGU_QiuHTim$"\caWT$Pp7_EpA474pZqqCE!Zor>RcE7gN::)IDb\]P@+;EGsAj1I%[om-:\X,L@)#H8cguPjq(mkZ/tCX4jR#^ZR*8335%9[Sa./"B?/%;1;t.NJ^YG$L"hfe%.K"'.B92"-SWf&9[q0?,`TkT"&;4GoY9WVd\i!="-UnjRs9rEd(qm"J?srgX1c)tEL(3'rU2&V4er]DU1+TIHMU\4@.bqVCFCqX/;N2gCGZCBbjhs*oj[E?_es/>!'Q2=%\XjP.qP39UZ[Se*'L"iD]>%#]2ZaJ2fT8l3c4FN1rpo4'li(U!moUt:&#8ilHBDL#/825:lslnRKs;[M_P1L4-Q>I&X+\1I.&^"s,-@Umng81=A^R[`s2f9RE'3\kDUt)>RY3R<pXu8m%`i]lT7V(Qn)EDe4g,B'Hqgs&m!C2b;6es]B=-t0S=TR+iiJSK*@P0&X-K+`Rh-*-:f/VVZ]MMoY))XD\a<ZEDH"V(;2rim=<"$%4P@#5$o9JLMY9or(c11m"(%)dhM,#?/9ZU_s0W32@5SBp_up!XjK0IXO%;$&#[aa+KM!Op4+;^UfEZlKj43o<u23l;-B&mW\WOPJC-;^@)tAa80,M$gbfL(D>Dmt^Nmg>:u_UH$*<4#D-Lm"f4@ljI0OgH%g5iB+dnEKm[64B/&\>i>P7mX417Zh369Em&!A\<aglc]kg8U.+-DBA96tn(d4CS.Clp43+Zu,7oXZJE<8h0_*c]K1Hseqn*_-[C2PG^fPZ*r6*YdJXr3cf0?I5s3"7>gI1Z-tH1;2()IABn;?o#oRY*R3>g#M`5,s-'#:/LI25#]FJa'/C=,+O`&H29G,W]enc]SO)fL0dK6k+W-<4/ggPcD+Y%:%M0+,0MgE5ZE,1)Hj4]pcZHGVddgR>T5pcIR5-\J?kVW^Y1#DU?8MK5%q4QD(9,p&GC1c'?g#n:)_o?/YX>7Nu+[Sel0kJ3(=XrMosX<"=t/)buH"X8\A<+]4qK(A`Mi+>*_20n@PS[#mJGun8pq5e"Il4!Ssn6]Jr#i.PEUZR0J&B[K#5qcqg7B$7=`qqoC%\F9$]O[GA%D7Ur'*E?)kA-[<ZPP:,/s%+EWSW6Ie]Na@LC0G0Lr9WEntRJ+DfaL^OOY4$0j)4RbNreIZ:)Wjn(DDlDtPjL&lp9kg#.N=j/7^@BOG3D$fB=/lR%NQ2-PN^%ID/#e+#T#=9_sm(6(dN7q#:r,JD>/=62W/e"X4>@CgOq=kH:97pV[5D%`NRE>?gAl`]<ibH;GLRIeR4OMA[NGZ&K0pCXG?*SEe9YekN@oLqup:KIAX"fIWa)s<$.aR1m@rUYG_.Y/EV2nWIB5BPf](Lo/]iW?BVFY"RUqsls?4__`VANUh11??Y310k&T@]fCj+f?=3nehd-lO>dK<,*8;i:!19RE45.#:E(9Wi-OZ:s*\_GLUZj\:@]kM=e+@rOpfin;>gRNHV_6H.jsn_s:72C?J_b>Y+khkrM`/6\G[ndhlX0'(rpg/Q]\NG[b0']jHQP-c~>
+endstream
+endobj
+157 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 156 0 R
+/Annots 158 0 R
+>>
+endobj
+158 0 obj
+[
+159 0 R
+160 0 R
+161 0 R
+162 0 R
+]
+endobj
+159 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 189.47 638.866 235.03 628.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 121 0 R
+/H /I
+>>
+endobj
+160 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 128.94 563.506 166.44 553.506 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 21 0 R
+/H /I
+>>
+endobj
+161 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 271.4 305.066 308.9 295.066 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 21 0 R
+/H /I
+>>
+endobj
+162 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 220.29 262.066 257.79 252.066 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 21 0 R
+/H /I
+>>
+endobj
+163 0 obj
+<< /Length 861 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GasambAQ&g&A7lj#[_<K'h.CR8o>OiBp'5`g89VO*0M:TMm<N-P!`*'oCo(&()b/RhT4gFE-?HHb@ki8%A!b0L*">K/GdoK5sQRp'Sk$?Sfao=jbM1dJqMb7ceri5WH-i=O]j2=ZATqW:)"(Q&-TC_].i.6'ut#nF);<>GHH9,!fU)<8fBYn$3;gdSQ[V>d(pi.Jc!jJeYHBh9QIu0<:IF44;e6ZTK7A*=_2k=\b\G$](e?)Sr^]4Lq`Uo(jWNFO@%Rffi5[r@_q.f1aY(`$2;:X]i=KB41/NZ(+bU!$_PE)fij;#(@r`V:b[NB,L>]d\mGK7OLQ=/I7-D#4WtM;WmU:Xhe(P#Ic&&P$m(-ha)J3.QK'p[RdtK)j<^F?"O4/ie,@Qh`-%c[Fd2Gj5Rpu?KH@N8G$s5c&-m?2#>Fe4aS+m7Gfj*+H_Mq+c;WVpkgm`bCEGPBl-8Z=V]+oW8oI38/^mV,=R`5GQVn'SbW'H0)=)fXE\k0FYo--_i:Au/@$&l=miA4Ab*$NmjJtRQm'E$#GeNh0BkIr6+3W[HFle<#AA2UMia@nNqR03N9+rr,Q#Z`GZAM#_s&DU-1,6>W];IpZl2iWilg3/Z$>[5dF39^*Z$C=)F.r?/aul44@]GU3TCfQgEl:USnrF$r]5uLq;.["X?<3J6SE<<,O1F=[jDHjdj1W,K:>ZH,]mcMS8g^SOmNg6C$RR#*_sS&'hL*^BT''"Z_\`OeoYB[NcdYY5:M*\cFR.pF5>b:73NkT!O\6UiT1mIq)Pc.7fdBKWA07"9g"eEK]H3KgFRrA6XS*9M6at`TDq#FtI`j%\l8T*_qTg8>hm.s0%Qe1I/0=ISq%'0HbHV~>
+endstream
+endobj
+164 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 163 0 R
+>>
+endobj
+165 0 obj
+<< /Length 3180 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm?D/\/g')nJ0+o'6g5V.hf?A#\EDNen?f3WK#@i'o<5:AE1CKHh7P+7kgJ!;LQ6^b;N_6lO<a[:*?BBC(0e`>ohg$Cc,LhAg#I!+RR%qih$pg7Ka0#&2`Yt\n>br=5J2j+'iRei&^n%ZEdZ8/E.,-Uc)f5L*m\buB)a>13f)9g](%8HCS8\pcU[S0=X#i8^hP3!&UDcOcZ>VJA/%r;/u]C/tBft/nBNuQ]'aL<2KqT$RL.$nZI+=F1IDMDb^A,?am"3W/9XMZm5$g]iR-i/:9rQ4_(o]%W-1.M&M^9?7_b6<COo-&%j[L9h+Y^0S+!F)tKeiJ'Z/1fI(c.Q"O8Fr8TUegba>-Hn<@"ucLgXb\I]MYuLGH?BHZ=M)"%];p9kXgHX]%CT0P@V;M?GL-<JILKiP_2V0C66AHQ7UU+lokq&"nH`B.(7?cf:RsKp;kDJSssI]XAc@o[S69]]$6W!R?gJT1BEcb9Kk@M9]sAoA2aIlRN++7Y'50&.`r3rmn"gLPPbRr"7"=Z[Z1;2an-WqK8aYL?CML->II((Hic/uiTIf)JhL/.#(0K-^n0#T<_0Aqq5?\@a^OUJ<FNhk,JM?9ICsbaHfjbJ:_NZ%jRk[r)G5;'aBP0OH*PFgcAkbP9AirZ5SfWP-mEHsn*?<p.?@#s)DWVcIN9t.*NUB2(u9i]\6WEnPeY<L:A%#bjq0R3R'pQQmH)7.@!kpNqWZ6t61G(FTCJA8-afNdl:?(.TehpfH\M'.Q7gT(Wi.G7[WWh.`>o`*L'aQrULZqrjQEDD%I2WM>T"pl<?$OhT,>aI&?BKa=CmMdqJddS%MrL9<!%0)<,?m\12VIAYELHTaa./,O6I9tOsk](MTQZj*po)I&=_\!R=mGJB=ah^PCh?s(56.kCErad#c4E0nF&:Nb8se4'(9Rap31joi.ii7\,;?A!=:;D!o%Y=+BHUce_,GtI\$X?@Y`_qE,FkCXUu_"7!,:OMU8f&#G%j>KD&^*4'@9rI["b@IRhRF-@j6L_tn=D'Vk2Y!C7`U"?Gu`@X4(,NaQTs>^_ia=u=AVSpRV%Jrp%kP4D3@.')0I>Em8g\nm7"e]6sc'TI6os#uE4n3XB^4Z>F=$5@h4:+grZjG3QHncE,R:MA4d]J+"N)k2ZI%=PG=&nBTI/dtN/^/m#_dtGGB6TgB8OP27,6@B-gDZ.jY?U9^Ec+48A`ARt3&&bB8g]*]l"pWlhT7uW.9Z0<nbYO7)!J)Xp4ZU)9lZnL@p>D_Yfs.O-@/(T?>"BAsAMD%u^X>Alc8dGPm4n4O<+I[*7sHY$%#PRQ"Y!%P"?DlG$p4KG$2^a!Sh,QtW^W:ulZ\Ym!-Lo1TcFM'QWIOtk#Wn3@PEf2<2;)QIlrC!:ob-T7]XmBd;!@C.YaQ-TLHkqW!on-(KuO^L@g<'2Sr[l:D=$J$V]at!]006`.WPeEa[O*'k,guhcV/qkm"HMI(f@J09\FOLdq.g&f$*a*l9b4:5BOX:2$i0P7Wp?0a*J$/J9,DAUk6$O=.t*Ah1iN*9"Gi.Z+ao"Y$5S6(4Wr@`#iY3I08Z'Of^thcV/!8j$7&^>8^!gdj/U7eeEq(54pn_DEZ@L_:q4BWk%Y0hE*Icj8,FiDEhafUrVO6@<:=M?,`SF!4Nt*u#)\8/6_59D-5V4fNaIN87JgVYg%?,snUAQ)3[;mcO6>TDuV^aVBGCKWe\@iY[K,E"0r),/qV<g+.2d9kqZ:1BMZbo/J3%Cts_J+Zu](1.&Mg^`uZtb/J?fZ%.OK+lG1aZSJZUl9."=?bJSVOW,mlZs1;O**06Z'3U=_Y&81Gjp(4I0TGR$UbN4+4G7H?]*chQ]@?N<$1059+J5VR(po4\B*;n1odD9lCt(Q6.e$cD>nl3/."lb@ge]Q[::gkke(Qr>Bj\J\JDPP`VVV*>,so5+,O<b9D4k4J(f2G^'mY`^+<H+l-BVZqJk/3BYQ4&B+q%c<K$XN*(r`A2ciM?.H2:KHja'*LFZZ)Mf?D_bTm;\,heO=I"uN_29KG=39YD2>pSRmQW`@HR9??GeB_Dte)>.ROWPq:nLDNQDNZ&=`6['XArb7q?#-88,@&o]uT*h6>9X5\KHq5>f"I,8NK5FOsS&.#GBctgtHc9=E3:is,PgZ#nWr/:"3cj"+!;6`c)?S_VM3](3#Do,``J'gkI\PZ].62:,@7ru7eMnW@:Z%,:=JrjPY^K.m#iZg:Q6gY_4_&cF/(mdtQ\GqJ=PHa\!&'?F>2]H&;V2&MFKDR,'RV3rfO40rT=[]mp`eBkC;1X&ED]8&+@jGCZ<,,&5;O;$VsD>3pN7LjnSPFC8F=dq6mFDeXi+;e8^j+6Lm8M+"0G,"b8AY:HX?`e4iPoh%[nDq?^k@.(lIAgJtmK>ePB+]l)R@_]AKE,D5ngQ[Fjpm8nD<KBKJ0KdjmDIqmJ<I3#/CT84IhIH304B1@kR=h+7E6o#k1b<Fo$on*?+fDTn+ujlZ_1C:<p7hJkejCcIGCbsB0_rcPm)LASEOo=,gYkL6(tgZ=-cDY_t.Ce0khGf1U[ZYqKP=_BlEM;-`GT'aqNrXW<`ngW(%i$]NBj/ou'9U#%d?ItZ?4#(rrp;=edTG/C.6nOVko&Odl%uJ46,!-@ZIJ<eRek/2!$-/&h6:+GSpsc-q)t5Qeb,<2<5<NG)W7Im;KCEMB0A$N#G]>[A5!a.rXTQF^</.p\&/Gn^s1aMEms`Q<qk*'CgDR8Q:6.":m7?I2F4%9F`j'rc[26eO44F`,=QJeA*d(t>O3QrT_@*qG>iU[7S*4$;K>S5_,%[5#$Xn<DS\JtY(g+--HM2`NipCt'8%(p6j1hnt6,E'7s(FoX4CJE_G<`KNLbVW13bSKkK\4R<hYublFs<OROW`Z>ji+YZ[[acPE++sle]$YIalUS#J7k)FFMqmB,DYc!MF2O#r`ige:Y'[%]pR&0G\;M,NGUO7SsV`:3GgMb+t".@Y;t]#_[ma06N?Js`F%unW@4+`Z2*7!2n%t%e(NT%4_]RNIbM,E=SjdOBOY]]<*O"8/O+e,p)`lcRY$o>H.`)Qi:SHXbk#MhY6]+lfCl:)^U&8.V:Qe8VSo/o44C[7KVr&+E<;\H/h\1)n:[7]X>s.1*L_PUPH6c1nY"7s%)iaKC"!(<rqZjq7'?pNS+!i."7V>t[oWCbLTJ>l"%U?7#6~>
+endstream
+endobj
+166 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 165 0 R
+/Annots 167 0 R
+>>
+endobj
+167 0 obj
+[
+168 0 R
+169 0 R
+170 0 R
+171 0 R
+172 0 R
+173 0 R
+174 0 R
+]
+endobj
+168 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 146.99 691.866 192.55 681.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 119 0 R
+/H /I
+>>
+endobj
+169 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 194.25 555.556 239.81 545.556 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 119 0 R
+/H /I
+>>
+endobj
+170 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 194.25 544.056 239.81 534.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 119 0 R
+/H /I
+>>
+endobj
+171 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 194.25 532.556 239.81 522.556 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 119 0 R
+/H /I
+>>
+endobj
+172 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 194.25 521.056 239.81 511.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 119 0 R
+/H /I
+>>
+endobj
+173 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 194.25 509.556 239.81 499.556 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 119 0 R
+/H /I
+>>
+endobj
+174 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 194.25 498.056 239.81 488.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 133 0 R
+/H /I
+>>
+endobj
+175 0 obj
+<< /Length 1976 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0DgN)%,&:O:SE:d\e6m+bq]P&9r&j'uo2N=c9bsS!+>(S<6'WI1UD>el!]E+6^8a42MSfscG@e]6B>l\f?B5a\\hp8P"!<59S"[6rX+,>YTPQgP>,a9I==uj([c[Is&;p.6F^F/?_(W\1OjZJnX5!cnaM@f(')L!JFm,a`a>&IY>RWc/Y645k/4^F<CfE)?e>G3R,G'r@[CV$gcT"gaiDf(I&Kf/KB\_u7cHo:]/8OP]=/0_>J0!'!BoKu]F(]&rl9%?q-$D*.6FM$Z[V*aZa@6^q.j)XXAL>Ct+nFT!t2$M=qB3ag!aS2aSQ`nOPRO+"W0B+O23P`]RW9IAnUE8QmY_M3/HF/hf(U_;c%BCa+7b99uf<>2k%<go!]GrJV=H@9f5=_bs_U0o=fmae'4BiWq@!>]=:q803Yd&B+S/:KB/bknkp7sAK&.Vq'A^2*%qr@B"9+jE%i2V3>f@/mTDL`",f9_5CMgN=DUlpK87/`/8Sfj<dHVT)RXLjR2nei6/J2*!qb.=i7YOfA'+U\D52jet0rPc6A=["LYo/On%0,3b-:^+4_6CV1kp\-Bq/o>Hrd6/6J-toilHi0oir=Csr[>GZ.;p%(7nEFSb[$EQRK6\WWIb+R01eO>n(*\?qF>$K@Bc81A.]XD;l?/1g-1GRs<lnd!0fMN"WVg4%1kSa%`FK92o?6Q)!AVA;&4km0,>Y\'7C7pc?"+*t+Nq77ksRlD\L5d]"qIC-4e8M^[Jsbu;9qQ-a`O9$6,BOBU(DqG+J$qT)EhuV@4kCYBUf&9EEkB2aYrD]-rMZeXs.28bp$k&:UDfF'R.7DXn%Spjhd&,9e;;=@-V.<R"E"qmh0dV@cW6`K2hOt&muCb-*/u.7c(jfm;\f2Q8'*)CYu#iVou+<!;``nmI(G]GHM/%HnCY!\E)&-kA%)6._*iiA=??+LsoIB[6:7+hQu2,ofCb9VqH%+kA_!eJrdmc1gk8Y5\`-@gDQZ]["V.q2mmH+B:()B[JdC1ZhsL=HekGf1F8X1fdC)k"4I6HT6]h&5-obTR*N3*<Ro,q5IB<@(28=op^6^p'8nF1_-C,NJ;'(#Q32;E&W4eM[`>NT4Y<[6]%;SH.cKhKHKZ!>ZXbl\!E5TKRf(W+%`cni41,HW:7*G$Z6q6r8IV?56S`Z;(*6aKc:&fG8)Am.XQ)DZ*D5OG`'X>e7/6p$#J"gJ^TcZ"5,t#r`m"cTX_eVA1U.b:?7Wa.i"X8q-IDUpTF-oANjOTYS,63er>:)C9>-YH:-RLj]`7YNcNl<u3p(V65>HEu%&cF,CJZa,G$XU^4<)jHDp:2-BU0B&U*5q$FiX!F%sC$h0?:4+D35$f<<7+dbcL*GDlYcN3eZ'_XLF'3Kj8h%bMOg;jmD?(R#=u+!0al2YB"$Vce:t8g>Z6'F:%TbTN:]1ZX.i@NIH[>?1S:j>Vo]`K:]YU[c3FpZDt&#1rGLDSc%.cmli=/QR]`dR4Nu1qOfd`-9NsX*:0K?MQcI,^93m3bau2g6N0POQ%nY?f!nO;#km!H)S"/t^!AQAiBn,6(hi?#l59ed[?XMYK?Zu^jn=\pYnrl>gc0s[W*@0q4\kI:>>+blDO4Z]Ig>'l*U:&C4tek&\a6!^S@\'T'uOmU33?Yl"gg<dg8;Re*(qs/#boRej0>2KAb'pk!JM03lTP=)I+@l)E+8ECaG9=Qn+P2).t!-o*^_Q_64T?n8u7prVb!,Cf7H6,%H9]/XteAI9TAZs>FKh[QeKc')/If6pUdNF\QPiDDAed-_seVB[[!e>Z=teN@A2_UTV61?mAgsr9c??MS;&Qoi#OQq#h,@+LYa1KUb/'omtG]aY-44VRk)H]8r7ps`RkJ>B%HboILeTte?[TJU#%WE%e3.c+/=4\eQ*K:0_RZf'Wul^ZA\sRf-IIbl_hcOO_l,&OOT71c3LU:)b0C\'mftHGM;Yl\']h?*MsWRq=.1Uk2-Tc[_2~>
+endstream
+endobj
+176 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 175 0 R
+>>
+endobj
+177 0 obj
+<< /Length 1320 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0C?#SIU'Rf_Z&Fu%co9CrCBrir<UfjrSD:]Zk6dZ.hTjn25m)aA.r;2V>Ce;'O1K]tK6WD@E,S/53\pQ=!]cHeFkp;u?U5Y];:VZUfKHu_ZJObYLpY8gWP_sJpII$jbHa=*&5tB;?4ZV<Y&1?7[5ncL]5a8Da*We@^/kZJUR(<?BboP^-#SZrY1b%o23CJO_-@X'n"G5$7&Uh4hq=Snc^PVe2n`]<--=>)bfrHWVjJm\-H?^*ONCL[jo*?q!ng_uA@$NBHP?IT]LUkpfH>rWDlL("R#?Q[@0O[/%gBuE3,Y(*6*[i<?\d.A0^"h[YA"QgL4qSq`8D/fdfJJ(5p(X#id+Ek5c>k_LrV:8=ltk'(9=Y)ckhiWVGOM3#M^h!J#("",i:ro4c`A.C"@s7eFQbpI"hgPPHF:uJAl'd%e:GSQ=#q*'"gLusT+_9hS5aM:Hqqg6!EK1[TiJsI,mOF.R1%dr)7M$Q)M(puGW-OhN"N;F*D'd)GhC7-XT+V]m:P0s/6j@&8gUsibaQcL7o!$93e]Fq)](^&#aYeugYmXLm)`!A$+B9*1RKC8rSO0eRJX,"Z1(t(=$(kf)*'!n9uiJ"lh67''<V3gFoE<!&'q`.q:sZCXZcA-04&kC4'An5q=&/`!Y_aFSe0fraoq>5A<%5S>pb;D4K_aEoZM%K^N4"a#UjuTh\B$e88:K6!uQ4'1T:U$IeQDaCaW"P:r%\bdn*Mqk&ar]0!`V:"\(j]V%e/N.4sN8mk6/ej`6H7\kl!LUoRL!?`'8<X<,#]g3R_QgglJ4W2H'bdK&P?pJAhZ1mE%/4saAf?l8)b.N!,Rc>/KI1k17Z?-LX,NcG=J<$.>Z:a,\.P_#-O+6PC:iIDbceeC+UrkiSA'+Rusg59PRS-ID2'F,c`BHr[m_I-R[_*RZ/gPTsZ"!']c@0-`5hebf\!%L?Q7>P_?0[s.Aboh8(X[jX$l>sDV2Hfm)A']K/[/_3s%eM>KLcA3hg@XDYg$\LgWWG@qAOb'^f_9DJ6?D$`+E)Db`V-4\Xp/l^[cq6Y2_\"e1q3!+gW]$KYC/DiCUER#\]IK(4m:]4V!],)B!GP%Y3bQLIu*@OT/>:";f4"E'cW_BO"3>[*8^inX'_oUUO,c672tH.WiTX07N6U?NZj<BU!W4[=p9De^TDDlY"/!;1qI81IP&/1CqdFiZ?Zg,BlC_RR+u4^e%2Ong@Y=l-<(\I*n#EuXYGi*ENlKQBuJg6:m<L-4IoV22<j-sFe!/>S^,'t5W(-JDmq6\4!eDqorU(Y`V^$IJ,,Hq2-,M1-7U(Nei0RX!O#2Y)?~>
+endstream
+endobj
+178 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 177 0 R
+>>
+endobj
+179 0 obj
+<< /Length 420 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GarnSZ#7E4&Dcpm()'6X[@ND@DR>+k;Pbk&?pG-<\.D:V[N)'NIpXQGCt_?bmbU,(h*'Y**o*r2L_<BX?3UNQ!fDds'W'#_$"92J-pOHnpg#][9[K$K3qh3*?8>\4<I[ec3R(qb1_dq6jb"f=,8XFspRkeE=r/[u/MuU-5fZojCg%?`/,@j.Ya(L]Zk;4.A3'GW\a^![U&=$'L,c#2)`3ePiPl5ZPrrb&&^>hu+m[j>#jDpX[hS4:i-lE*ZnjND#B:Q7KR$l@DGDe_2*oZ?A=VX9]o8&TT%p.j$58n+9'-OPBY8nWkJc0*Z`>_hq;X_`EM,+VOtc<2HKD`:*/>+=s48/6GXg_7B:DL1kk;nu!:Ze0NB;hJ%Jt8CAcGgOmDAA(_rH"VGPLlk+2%$?ea8"F7=U^157D#2p]~>
+endstream
+endobj
+180 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 179 0 R
+>>
+endobj
+181 0 obj
+<< /Length 367 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat=fa\K`-&4#^[$6OmgbrCUp+'I;"&cu&K4]FS3FL"GSJm<s'I%3$Y*OPs%EZ%)'1X@kkPJPKf,:oNRA/PBH!_0tSN+A&^)$nAo:?8"J6U@os/-W7?I""Sf9[gBSbG')d?0bt!FG7`l/7#p,D54?i4t0?=>G.#eh1mW0k1C7@BK];2i95H,'YPa;;[Onmhn70/?M_l=T6k;8F[EM4oFA7!Mm4f\q'IRKri$GL)_`9@(K?4WGj4>LhYi`cEFr:25p"F,KI_Fs\:+=*o4Q9*GKBEPFA]Y+&HKSA('.._30%"p(p$SOYJ$NPV:D_u;_/^SYag3rnMPZ0NS=&qk6^VQqF+DU*O?P%K$@DI/q\(cIB@h~>
+endstream
+endobj
+182 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 181 0 R
+>>
+endobj
+183 0 obj
+<< /Length 1896 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm<>Ar7S'Roe[&Fu%c2,-uu/SJFs9s\D8gW]7i$q27KLUIB-Ot+j^oC$n%Mb2'Um1`!?e=t6Jh`9l[U#+'bPM<kr$t3e_)I[8A+qB?W`!Iin"ZSieoptp0q/T%\\oPe3`phu.`m\$8NuV3!f<23"ag3:se68$7h`#KQ\M!\M`9!GG/*ErhrsbKF%`+.rc>b*Mqk8dakBO_gh#'=IZeH;-e-8%g`T"^i]&f[1$XS]<[IW;$^Zo7DXiAKc5fsQJUt4smJ.iBlAR+aA"1q^O])`%&DFR[EC-idl"m)oH%n^8qQ[6/ASj"LS>/O(e*Q8Bth$It$g1kra^da:0bub0Kq<NEWYF`28Wo>nFa-AdV9I-[:!D=_g84pT1Q5!JQo3DNi6t]RR#9<cQ8X>hHY@gqiJu<n&Y)kLV7TD"32gi-=p,OT0*gZuBBEYih1VphAWk$\A>(qIYV'6fW-"=-[N3Xo'bc"g\Cm'>T%be.lU/lQ^[ua<Ik#b`ZEJ]9:mNkW6b3GpWi_Fig0o;WIW\plo4caToj*$s:Afe=\"iJMRSLWZnSiP6sVtr?\i^L+Yeq:&H#)iK]:5?o,A$#tK;=RV4\M,4C@XV[GXOi(t"#dh<\%>8"*\8GM_.WChqIgFQ;X-140_4dcCK]%fU/(M[b]o3(ISqN]<WaCBl43@TU/9fk;!U\q4H#ppC\,Pc$#Cd-h,5)(.J)plnC;O]60\5M+<2WKMiA:e`R#KM[.j7R.b?1\_rJ<J/;T"26>VaQ9E&eK/"m+]B+G*MZUT*HR%aJ+"iHo'VTi38@-;e9niX?&m"dRR^&K-lMj.T7Q>P-Gh@>Qt-b8,`VTeb3_=8u%F(%]5gKdLN#>e[7#2[ZrhaSGON0"$/h!WcI,FJYSUHW]CjtI<\fGP>,s"UG4c=6G/kj?%5#!Il$7\5iLod,#gGComLJ?b=^/8C1<76Lj%3)d6qTG+^:0Y*/IOFe(:i"i<hfr+`%]8nn$Qf"TdZKCt/U7UJj2'IcX$PtTe=_gW1qmFl4:$J=Im))1j(,=m)Xm2CM8>!onHou2b1AJ-&CsB't6A@VV>.EOFfOu2SE#FVLITIc_jJ\9!nbfBER\CdO-Ju;3<SqF;`'+&`Gd]M8B3AhHQHAMPr:5!tU/Q?uAX2?0Ws]bO0%BIXWRVPZ3plY>o&a+NO/o(RJlWCuB@Z\"Ws_MJ(O[NiHYJ1[aRr7X#Em#lP/K^/<g);6.fd*$J-u"3cZGHGCcR``K5i+H"ab&4p1Wa9]5SXHBMVOoIX6ko>T["GPoq!"0c5MlfADl/>`U"Ohe$@*/WIY6<\UA2Yl^.g&2]AAV.qt`$>54HmT[eG;1e+'MEFnVGP+@DTH6dq[Ub1`M"[>!),97V#eB:,RuBfKo'*,#S"+@O)Fc.%g1)XW?$0f/1]!%7&W4g#WN4;#3&CWQ>3![ACYCJJ/GAqfXpEQP6F34o\-LG]QA)DfQ_%l>-ML'i0D"SU5DA93Su0<TJEp_q,;e93ICg?lpdD<pU2W7%1c--KVmZZGlJ^4\dV::J#7HtCm*gq/X[X9D`>g81,nYg]-WZE5O7/Nj^`W?1>r0^S_oH#\LYI3C4e+ii"9^H&%LR>%';$CC#Ap].)f]9%J=^!>KFnppf".1[<G3Vcl1#6+0(^_Z4%ke^_TqBG!^eaQLHD1+Op$?,d/o;!9G+%cj7,CiP?\6DjRod?3s.Z=QIVePMk-BLT`n"%"im=:rJ)'jfZ<-8ru*Dt-%u4X3Hj19T8S-U]dRR$B".6YH-;R*NtXi6`5.tec[5ckWLq60:NMg``2j,FZ8$pB;f1bd>jBpi?j4<STfP#<'p%^rT-]*4S!eH%1-V8*nhrnkaDLB5"YUO7UQ+BW6Muqeg:R9'Dg[?diK[@Apo7q`rrE,hQ[o~>
+endstream
+endobj
+184 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 183 0 R
+>>
+endobj
+185 0 obj
+<< /Length 773 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GasanbAQ&g&A7<ZLn&:STh%>K+=PSn8XgJa;aYC35n:7r=Ti8,V'm_iq^uHrUhn`O_16\h>gCPGl'p259:arM7;M[HEb7$Q.&I:\;%V%2q_C]]&0T*B_YN0GoPam$,:J*r^h&;2#kCgq\>Y%5Ub?ru%"f+kr"$(p\d+7dmG94H&kJp'LSkChLa#G9c'cN&UF=rkkK3Da<MPprS+iQ(o[0M&:=3W@o\PEpL^CeF]ls/&.=+;EQ\2S@&n=/mb6#,<<NYd]BG+u8BF#6'QFs2tZJgT&`7*X(`fY2TS$l.&aMkh'pQC;Y6]0oQmm@D5]W`'FEm^81^TgL=n9=Re2hC#n;dqi0A6e\GBr*F=,G6?KNE]J,X1)')9+s!+=.A3d5jb<m=04%Lb%+UqK#X)kXVFmi!H,idJF(hDIeX()B8Xeg=(\Au':8!Fa^gZ!l,/WuBO'([4!Re=<$E!aUkMf4LFOWkf=Y;!g:F/&$(Id@5'j`^2Gg?,(Y0KDle@4Q?F%%PYKIi7f3BluU!@,jmFG5P4/M3mfBpTa0<<?#>m'r$]"ML2(&aXeSES=[R4-\e*8V8@kj6q)Md&4*rGH^PFbhW"8#oC)[\n7Y$uHs/\U!=hi<+e=<Z&_1$%SSbq>Eg)8eCbP7$Nk&LBBAYiX<7?Apqs+6LptY1Ihr"qsi;).Ij19dPiN?d=I'0)PcH2X%f?0Z_q%VSo_?G-IB2VFTY&1`:(RT2n62'!uHq33ZlTJr<?&h+5,@W8!>Ce5$n*Wi@j7Ffm:%Z~>
+endstream
+endobj
+186 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 185 0 R
+>>
+endobj
+187 0 obj
+<< /Length 1905 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!;eh/D%+&:aF]+nT=POO0`#cTVbNdroTUDI)8)(m7'Z&oA#?-!-8cACr!=ZYZ%"R8f\eI9;C/(+%hnmruhL?scYuj#;NX?".$%l,^;F,APp$QWeqBCOmK<b'\!1Yc^bM-)]>)BA;q8jAMdV-'AI5*,i;A'pU0[;9QAEPeSlo4GOAK=hk8LXiYodm9.rqWp\A+)mt.Y&\D!=Y)kCu<qgGWlK8$9jZC"4Y/P3#MM?:=SF-VD6W/e'q+shK\T<<D.Y/XbEY,_a7q/b<?=qYJXf^+S=]IuCNX?MMi(Ed0W682+#U24bS6Ungj(=cT4I\gSAQ:O%08Y">:fip)IJN#W7A9a(^KLCP"HYnI*)Umeopf8p">`(j/,>9aBi\b+8*ai;[cG^2)>6RX?LEVu7W(u_lFX%3ICl\F,Lg\[Yj4(O;&_qc?Y29\O7fATg:H[q&7+dS#m?reX1,ilrpWNDa$Qhth;4l&Qsc=tT!*g=nlE5S$dXr?HmfZ23dE?&.OmTjpRoV^G;YDF4>4J$caD=X.]lR0j^Qppar4-k$))nu0V3$]_j`Z)I_>R$R/g.sS_l5^J`jS0'ZZN8BMi7qnO]b"P#o:F.mlX@q@)]SbF16#>:Zu&Gp8?ips(#\^;t[9[m/DH^7]$(q0M_nO67XZi>$<mJu:)bU2#dt2m(SWNR;.:36j!.I(=!R71`-OVl!BqM$;34jW$E73\feh=hl0q"oR[hHH:aUKp%:)Nl>hoLhQMcJ_]j4fnehf*3<7j1s;UaOV,:r7jVPZ.Ls]6,IT"YF0SiI1"#:;OQ?;+=GTbOIn87%Kel^[AiO]=TtWNEPmaOh4?"s)bfWHQ"V[$8gSJqhHg$L[JVGu,;`K,SCH0rK.T1]11=WO55RkjMA+X'dmJ(Ss2jlU_*$*b6eT+gD$;atB@$AF>VjE/,F&d5+@GMDn^P3+$FZ.@Uh*r7V=OEQ`-kmi41uQRRO`9C(h%P?2K/<jC%0?tPeA4iV8&2PVo2NKlTd8[*Mnp1FlcJAFa<mSkJ"SObIf2#/"6*H9A91kW>RrTsF\Y4n'Y7<kXEaC7kiHE<M_$9)#K)c6gI'`MEe-Ql`uCk6JFjs0&Yn*As"Sm&k'OrDPB5X<*>&&Dr+ECnn%s9XI$d\r2Q-qn;eAPS:Y%Qk].P<\l`fo+YX,;Yr*aE%8,Q29%7D/^`Hji"-QsL"B*U]p&3:SX5Q)'t4G8\_2PJM@2AT3-W!8_*X9I71WEs8r&9,LZ?C82aIh8O@&jPZ#p@K4U#oMF8TlYHMTXHlfYDknOP%VqeTGHt_W$7j89.Zra3RG4gBEcC4,n[NE&MgCo<SISIhr-^\R:jL_@(If=BT".2OebT`:2<_/EP:.2RN=7>Znjm`8uca14egJ(aAK_;L/?BDU3!GAigBSZ^/k?a.UHY1:,7dGbRPpp#B2@1a<jjCs%mI\dHUs6)*`ks6_^)!^dRG_21e\]N;nqqFucQuUP>bpQV9Ol9TPq\2%u-BbXHH%3071EP!k,5-MtFp*9:Bt>=cIq]FNA-7PpuWb+SWNe3/\=@km04%!%\>8k#:M=cA+I*g^Y)@H"7gfWW%>K=Fcr$7er*(s*OdNdJRi1e3De1eYVeM;d05!>A(pWI*1!--N%r31<;Fn_9m[CaLq'm:>d%^kXVs_:BN@;,>Ya5Wr&U!-40aO"^Jp3+>At)qT9+W*NW%XrH6!PeK?#A]-F2-d$iZju\uhj=d>d[WcB?6S<V`]Y3db9Y%hXQjmd]6nE),pj!WB4^9'Ci9gQ>p^r@W?12q3joR:$Z2gIE[6s/RXHP:]L9Y$u+8C=$]Hj8,_VEU4qT(0LhDr%3lV)B8;fjrII@4`-fNe9I:r,j1Dpo)*&SiIqh_*k]D9-NL$hZm=hlL17i\Q-CT3CWCYB&"c(EWHb*<~>
+endstream
+endobj
+188 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 187 0 R
+/Annots 189 0 R
+>>
+endobj
+189 0 obj
+[
+190 0 R
+]
+endobj
+190 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 151.14 680.866 196.7 670.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 130 0 R
+/H /I
+>>
+endobj
+191 0 obj
+<< /Length 972 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat=*9lJc?%)(h*#WX1rUIkHHm1)4"?%[8b]-2=K6ed7Zd"sL/c=EhdJc5AcM.=qnSUM[tM3/i$a[]NArP>D26b#Q&nY6+0MZG2!rA\d*ATO5/\LE@788^rQTOTa^),l$D^-aRZR?,HQnUG@@N%IR&5WFAL[T*EK">POS/0QPk1Ph:GYUaM'b0h9:Aa?Aij:T\+T"L%1bG0YhSm'KMlgTg=%e5D9U&O(iF?M_;gOFMu+UO&$#pp:Z]5^9;8\t%t@oX4,l^J7O=RU9\l>h08;4DQ$&0_pd7cUr3L:a!N:JK.Mp[qft.YI285LTP6<0VBgC4k3]h=.B/mW6EG^FtD#'uiBRKFmP2LOub/;(KNO;$=5([DVR%J2PoS]OdqGh*0-WHC_qnrKHMhO<f-^5!S@mXH\ZO,+1UR"'Z\r&qP]mKEb&WQ6G<ggD[mj"j%[o=Vpj<&uU5j.W9[2:/_bG"X$,46H`FA`_h[.0ji*`?$n=MD$_KkAU3NUj2;^J;DFpf-[6i+XB*Hd`6TcYF62j/El@<]A&U>Hb3[8\T8Sa*dWlPOR:11#%"5KO6YAA!f!D5TkVhU'lo6o1Ofcd5#"YGkA?"Ae@=Y0QJ<660Ol;$c?Z<,O=YDOPnq4eFST(ogZr>I(I<A.k"H2#EV#V[XC/7]#3V:[![6!U;Z+Y*0Y-7ck"9tk;NF'IS>+feITt&/eM2lmk6(.-\;-bWX>Yh9%)9:jbStI>CCRN&0Foi"P".i"GdCrPPrBn/iagW`4CH#2)OJb4)kZ/H>Wl>/%nJi)=:8rH5aEDZ_%b/0fIlYRtbdglbG`cUDTp^(p[Z<W2;9s<`QdkY,?a)*1;*3'kCJ[ZH+$=p4q7Zf6`Kn1SB"JRWM8W)m6+R>4\C>."`^CV#6bP=$oc1YJ`W_TI5fm\e\rq)/E76U%gU$&XaS8X*qdpggiEG>q@s%Su=<Mbk+-XrYpI717#QFhR^80<~>
+endstream
+endobj
+192 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 191 0 R
+/Annots 193 0 R
+>>
+endobj
+193 0 obj
+[
+194 0 R
+195 0 R
+]
+endobj
+194 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 158.0 646.034 212.0 636.034 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 130 0 R
+/H /I
+>>
+endobj
+195 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 212.0 636.174 266.0 626.174 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 130 0 R
+/H /I
+>>
+endobj
+196 0 obj
+<< /Length 1038 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0B>Ar4L'Ro4HA8an?;`e&99pN:JBPaMV/6t,u5+'7h9=]/aBns&;56hgK63:@=9h<>hM9k9FhfkS$618XRC=pss(;rA3/UCMdnqT*SO>[o#3]8!18@=3dD!HH9e4)tm3183NE>f0u1$m$q;bjZ\6IRD;34)A(r^=;)FOeta[G[5WDeg2,_q1Tq1:/jAF]=,+QGCNSn57pa)RGAlatT_brh?iS_mK=pGGD-eV(?nhf">!#DcarZb#Z*Z?%=].\!,e7k3@mN8XV1npnOK4;,uMTfX4\t?U*E(?%WQ(D?K)j'HEoBZ8JR,<bq5?gfObV1\b]+(+IL]^?_:7Nm[4KL,=p%l*bHr8:pq[XtIH%WrYCY=A/lk6&N!(8Kj_RB\*2.6O`eZ=>`HRY#VIeL?4glY]Q2M3DYK>Yk_h$(ZGFDm;sN$Us1$tN=g+J&eK!lgefEYEO@I9P%CF7PH[E94pJj!P<g$96rnnq!n;!0>[k:fI4p\Tku5k6?ag-fqmK")ed"VR$VAMgiC"aL#rn*2ofi0OKMf\1G*#,FSk2gr<*""TlfNe93BF;nJ,dO'p;d/,W>Gjt=op]c4d)<;(g"^aC:OFYej&U)h8YIm%h=B_nEu>b_=p];f"ffJ3p[8uWQWs\;-LCBU1*CVBs^8G$c3^e_6[4!d5$jPR)Zmu&P@Yp0ah-:nh6(_0r/]SP]$V!+pS6\X"]$XP%k:!DE@WPZ+1B<4o,3LS+XWUl"i-K'NU`ekVUVKoeF6Q/792d2!1/>%?sO7?'[6\N$!"H,H1e*W0mo2:+M,$]HtAO)h40_Wk;IfK;h(Oh0BIFBI>KITRb]gEt;81\sAMlJ3F96)rq=s9G!%Y[eO2l3'NhUJWuaA*19MnHBkJ0W7mda&`<:<c1,o%F12aY_b68jAXT^V@>kDFDJ:KmF=n/X?YHY<N%6u?jVQ(Ze!TWDWST?@EqW\J8^0N3*0Aq!m[$VoV<%MXcn,ft,UGm`l'^;Bp/@uAQ+btW)`n-^jJDf`65C\*_rtm*`FBY?%sktkatBD^~>
+endstream
+endobj
+197 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 196 0 R
+>>
+endobj
+198 0 obj
+<< /Length 536 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gas1\a\K`-&A@fgbcR/GfQ$77#U-I+"/8dqKh\KNP>7Q;/W#u3_;F9(Xdq?m?T^,nn'1!aE,^9p+mNNg_K\>mC-WBYLEb'l5*,K+14d:OH6;ER,BUp3d=L9BjA?j+YDlp!)u(tB&R(jsTqQQHapt!3"QnLqdnu$"_(o"%PmUtfgo%FoiJ<Z"LgQ'ZMRdChVK)bTPmCmfO\3mI`A6;h(:fB=!_+W>#k"jf07&c12osZQj]PI@gpXkn!g]\t=dXQ(J2+e!H>ApOr5ZE!%0]2/<=tH[\J<4dQ@gZ:/7<)X71N05gVH:DIq\3DX`-cZ[>L%N4e^-5ak/F]f6UXD"pLVrO!`^Zg$bOg*tp1r97;'u49h!W)JUJD[na%]R*<E+@p],?9$R2?+8`e(Ls5=+9qJN24Ddqf`X[1>n-)#J85+D[<:'OmfQg\;eON6!W0nu17>Z<M&0_U1>GpTpb\?r/?]qdL"Q].'i4tMAlft*>k-Lomhg.T:l79u!jVME.<;uW[>Zo`?CkV)sU=Bdk_(XB^r2K~>
+endstream
+endobj
+199 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 198 0 R
+>>
+endobj
+200 0 obj
+<< /Length 767 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat%!?#Q2d'Re<2nD;$J:n-rW9rkjc4A=!VV.cE!qVVneQ3_$@BWJK^59!.0'!eX^MgaU^Fmcf,O4!$'klG=a&4GacJo$#='L)^_94/eL9XJb)Zia*&jHp.=3tR96VVs1'b*l@B/MP@^0j\SWS>aW/gMb]&e9g^h6bfhmeKlcfNg*cLBuSS5eJ+P!+#rDBM"_=Pcbhm$5Z@`c0$eY^l1"7Ykl:ju$4g0'CZPb4E3Qq($JCS'@<=lF$DM,#:"ht`JLGI<?l:r87#l&/B^#)>,[>;ah"XAmMJ4?![n[?EIpoX]&j5eY:<D8L(NnDEp5JKqQ)B>LU1n86W`5Oo3a0llBiIU5j/XAZ>u`=s0k]O`_F7?#<7dq=,+T)c'X!nLNq,JiPj&^-1o.ir5+mO<Q4Z=M>r=/Vs($_D/S.6R3g(+F8ngB(OR4KO%RJ=dQ^4[YhFYjX0dSJZ/r=46;HhMBFS)A940rR'89.sIjF>fU/(mBqB%P'H%5&&<7&Fhq<PEqrhM80$9-cX1E$,sN`7%sF4O\ikHE1IsX1HsY*DcF2g<8fofSGO?$.BZQ8N6`+*FC\#NS&*)^#\cSo6_D$S(LQqLTq%E4u,:eEbX7#%n[d^4LX=^'e\*1i:X-jH)GsrgC#a2F+g3)R5UErP)X.dqL<o?gpIctJi\V.VB`Ti>>HcnP$HlJclLlpQIqt2s0t2RP`qWqXX7A&gi+E$5%kNZqTmKZ0IkV.$]2L0m7R<@/'bNg/DC0liOP!k7[$%sYHJo~>
+endstream
+endobj
+201 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 200 0 R
+/Annots 202 0 R
+>>
+endobj
+202 0 obj
+[
+203 0 R
+]
+endobj
+203 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 156.71 676.732 194.21 666.732 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 29 0 R
+/H /I
+>>
+endobj
+204 0 obj
+<< /Length 1641 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0D95iQE&AJ$Ckh#rn,"g@cLB=XG1u:@]Fd*Z"TEeVo@f`ms8oiAXq]3AoTg[SZ!Xi@+H8pt(B#p&0jpeJrD1ted;nUXG;dKYrdGRM/>DG(?F&c[OMRQHS57pQeXB_3_#(M"=q)a'D`DQUECV!ZONMA$q?<IV.^D-,i:i.[MX&M#mh*S7*R&\`9I:PVb-/4CE!LnJrDaQ]3-6FV9g.\2B;b`7]QD10.b/"j5%+VXOCX7q)O_tfpf3pHG=Z;.Ol_8dJZ65-mN8)V/BX5sOkYX,GP0GV>r,$u`%q7cH(^fmeb1Ae6a29!HZ=\R,;Eg/MI%7KY#O#U(Gu=kpJo4L.enjbKB+L%>i[1fmMul46m_#Zs!4f]4dl`g!/k#5n/VQH_6?5>4T/2_]iBCTrBs`:SqU6]cJgAWfoKppH5/l/dqqWk*Vc:CkXeSPsKOo*FZ5j=I<=ph4+Q"-D<OB`4qWQ64]\sl<@=N=+bleK2,kRD#%c3Sakg$I(1^ln)*)Rc243`hsc\G`uG".moap@o)0(L;SdaYfX.1;mbH9#Oe]R,p:_A1edJ#n)R;ib&[pRYq_R7p[[R(=RZ-J2!tE)Kddl,&$0Y?8pIEXYm"ql,EE*`TT_])hJVNW5$4CH$FNp2fSS(bTiJM:BJj`^7EIaX[`mJr68DMrfn4PUHM/OqB=/o-:f\>ti8e`FS$]-J&N$"pYoAki8FWb="<95S+a&5Q'=%8t)p#-%E(#Vsm($pCA%]"VsV$jR9^P>HQWo!B(X/K6SIFkHleb]fCK5j*d!M;GMh*@rm;K-%Pi>S-WM6P5A"aDK&qg?=ka:`Po5pksf>n^C,Rfqi@H)CO8oimdb'H<=^Vg#[Doa@Tb"&1JM(29mRq#"OX^#+!4[GI?B[O)?,]AE@3p$(S*5rh(TXfR+Wp7BGs.OXP33J?TZYbW>/+>_=)rP\s*aFm`B)5I8CW3@d97o\5].K1_H[*$Z;:dANBO4nBJ!m_`!?*>h=\jW\%r$3ctHpS!GgKU/a8/OsYkgc4_eS2j,rf=4_=#9L.?h7Kl*`=BSXYYHh]VJ3q3i]e64]ct]O!c^S:(Jo=;.9;AL^C]-1`M0lRi<V<+6l-$&B;VP%X.a;RJb6dDY-/kh%81doN%^929<s:a8.27JsV@X5FgSjZEY#IH/;L"48A\OK.:^SYYW8TQE+*,c%XD8`Hb\gu`U(j&$Y;HaK3-dko67flXq*+>qlt/!mUZm1"M#X#1iRrHr2t85._-7=<GWqS@s$>-2foM!>@Ddgi=c^Jp\"hUsG%!+p?V_c`Xekj?)r70p]@lB`9qNJ1$a"b\ifn>]:=DgSN?FPnd\ESBGdX)U!KF$qUYblD7(<-mC%9*%h-f%HkJV)^=@)4^p<$i.m<c+I`,lmnL9#<=)@e1"'4eRug4UYB-b]\5IS7%gr%e<m`[uK6?9hZ`__<S0](d\:%IH6@.7c/!?1)!n?[VerF(Lsa/$ou?dmJeXf2N8$>RCKbJKtQjIedU`_fC!0a1uLIk3@R6>QV'D=1]Wrg_tm!#A/X&NipguVhpI4QqILnZda*cVtf!P*86_&2'$Fq*4UB\ZQ]dUE#:@ta$h>3i>ORX"-+79fJ`J^?6Y\&X^_6Sm_9n5FRuh:%Y!peoj;)F[U&~>
+endstream
+endobj
+205 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 204 0 R
+/Annots 206 0 R
+>>
+endobj
+206 0 obj
+[
+207 0 R
+208 0 R
+209 0 R
+]
+endobj
+207 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 183.66 691.866 229.22 681.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 119 0 R
+/H /I
+>>
+endobj
+208 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 292.52 669.866 338.08 659.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 119 0 R
+/H /I
+>>
+endobj
+209 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 190.6 397.734 236.16 387.734 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 119 0 R
+/H /I
+>>
+endobj
+210 0 obj
+<< /Length 2148 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm=9lo&K%)(h*GkTY4UoM.Gmk)f)[_(ct`c9a#gB/\J2CF[OP*-jcqh=CX"D#r#ZTG^"'EsX1%hA[3@=%YHAiL'*cQ>hnBDu:f((>Tc$O4K[`eOKF$_h_s/I11j"@MYFi*G@>nD_\UcPe+p%?,t^G2uP%>3&qn>/7>NK:de\hdASb"TH\mB6i99:.L0(GF#-7ToC5?ZdsdI^b;$HY$dOMN7?;R0%hI.:MdQm7+Ua<5C^LaA@l(^]]<(P-hJ1UAL7dqG0L_)7F(D#S=H>Z;7kK>L0=[`YUDcSfDoI>P%X_GM9L/[7IdC;Aj'MT9RN@*n(n:UJ:OV>`sU`!_pu_-o6_j+Xi*S*@n0i^og1-*c-=Vk!Vgu_1GO4\d<bdO2!8M*QBVn!4)nTt3Eaohj.?lW=e:QFoskr<4;S@gN(7JbnLERD8BXJ6*,Rr?[?>g!&LX]r+)":^?e\h!5pQdG,2h.5/*p3o2,RqB1X-qh<'ih'fq;o5k4'g<0_&\e!5#X.cqP;rY9UDl0E`Z@EaCP!@'Voa6E\#8b(,5#<+WN7Q26&u,k53U!i04J8uu,a"md+qj3j2$a.Ane)uY;^VEH+`okXMeeW1jb<MN.,BWck#Li<Dg)eQJ,>!*L4eX9Cf2&6feLF9Af<C_o!693c8IPdUA8B2tr)>H&/ls$nNWA,hOfOi6=3l!hmi%R%O[0&eg];ZJt(klr3Ya0s3(d,rer2,-tTD*.f+KQa*+K&m=r1+Q(&FEEP!`Up35Ul]5!@g,#?6sAA_pZ!WH0']1cuG=Y9j(A2nFU'!Y8D2^VQanGqHqiQ1_WU\G^XRcJH#Y(70c9iL$p=:0MViT2';24M,W:N;0]fNDD&g`8:U'B23gkpV]No$R=B)X4AO.[q`Y^e"d'TE[mkg[*c>Lejkc'-0.Bd3Ug>e`pPKY/7@G3p`N>BJ(\K0t6_uIH]8R7l[$`S-Bi)(@g-)T!Q<I=>MWMq,LXI=W.W#oN0_0g:#JI^57R;1&naeu/l`3gFlc\PRqSq[!GSHQEQQ/b[@UlIW,b$da-<p#?EN.q`T]2'f/`?htAJl1Y<QtkUEa\2ZK3D*m7Md"K:q4ElR5h;;Zu#'dTdcS'W$e%@ZE5*ndB"UY8M:DCMTb]F4uU:<!>CN5$ptKWTCB>1NLh=S9Du87MVO(h)AoQWIROb#lB;Mi/RMDV?j+AW]#ZV:$H(@$&j$%4YA_f7o_so.9uj$,-h!+_Zmg_r0b*j)'HNI9aWV`RLP6.FhA*3sF#50:5SLE#Z<QYKL@c@JA*.lGDSM=FB%c3o;8!52Q54dR-F[mLOd/0:U#s1JS7kY@TVfMC)bj(Y$8p+0U9I\rd<N#g$,/p\TFo(a$"tTdaF?^`*F\aCBWhU[$AJcU;nQsu@Plk-n]V#Uilf'QB=MWSjLTiB@qkVCdba7UjQsPB+1iflFh<_ggiMgQBYe>KmdYiX''$+5]Q3SMh)a4KZjACo@hBDWBf+No9M?.4`??JSm_@?`gmV._Q\d,L]c\A=[nAR-(!04aY'S>N:(1LqEg$"Cp7++f/1h?YO:>A?P=<l#F:HK&<]=b4_%sciO[7np-saFto[Uq45N*T17P0m1EeQ0#E5]/gD-i&-4r4o(Js$n_r\F:[?_,F+DnK;o%Z;DI=>$V5XH9:O!_(and;"\W="'YFV--56(HRa1g,\]`Y$\J\JZ!"<(6HO2fk?/p+[k9K0G#B]X][unX-8uFQ]iCTZ@L_\A$W+?SaSIDR`@qFm"4DAkPZt"hN*DVPs40R2qZnEZPca3O?a.N)M$>_R_hdjQLtSl/s\VPAm+?GQ&#paW/o_0@!)7SE_q)3aH^tq1&e>+Gdctk!^JM!!$#f*gJulq6GP.d46kW4c'0dLmT:p<hPK2q3^kY5#Y2M.6'><0Bra4<SE)_>]iu!,&IFFCU`rlp53tc.%UPVsG1jbZR'\M6R0@=)!r*(BA$.<F$,[o]S>Y1p<Tr*,D40It#GTu?f6DBD.'gsS0+,"Ge'GL*"00Co/@bTW<BBinj5KDccuYUni]%jn;\8`!d#/G76h/n?:Z+b-f$\3.1*k2>n#*UrL!UP=c^44[(/X8'UdTYU?$Z=NSp*IWNjb##:V_3PDJp?FnT<8e>RfP;^LLC@6<JI/U['\=Ve?#2#bU=B~>
+endstream
+endobj
+211 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 210 0 R
+/Annots 212 0 R
+>>
+endobj
+212 0 obj
+[
+213 0 R
+214 0 R
+]
+endobj
+213 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 460.8 563.894 506.36 553.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 121 0 R
+/H /I
+>>
+endobj
+214 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 180.59 467.922 226.15 457.922 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 121 0 R
+/H /I
+>>
+endobj
+215 0 obj
+<< /Length 423 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gas2F;/:e<&BE],'_g7sQ6fC<I-eE[2AhAslU0o(VUl`j>,$^fT72X!N?)O(P5AVSIfIUeQj"#D"B\&?A@mB/5%$YC`us>A95$q"-m1UeB#5g]_L5+W9h_/E%Sa&dh:/IQhu1B'H/*&q:#5(99eWtSfL#:@8MMoF-4Q3h;1sl7*@S7onpU/FPl)>/cjs5?"cIAqM[>08,c3+-!+laC-R%S>nlmc:eT/rF-F_T9s$!,n/EQ8I<OIg!WoLA\nmOILFep/T/XlUu4Hg08Fp0'9BptOmerMJBU+iha@oRI]_.8NI:U>8;?X]W;k1s.mTtre1Z.(ZZPG>J%ll^_S=(UsNhr0fW^T;GPOR+b!]$qadW/<ZDLEj1+gs<mT2!i-!k7N\s6S#W`-=eBl^3NZSOZRFcljpu<(0U,/PMiA2~>
+endstream
+endobj
+216 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 215 0 R
+/Annots 217 0 R
+>>
+endobj
+217 0 obj
+[
+218 0 R
+]
+endobj
+218 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 302.82 691.866 348.38 681.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 119 0 R
+/H /I
+>>
+endobj
+219 0 obj
+<< /Length 825 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau`QbAQ&g&A7ljGdN$jiEK9"Y+$Occm!F^k)eXhbB,:#OUR(9R_LLEgEN%62:<6gFO;_KZbtb'paI/Q>pKD+Ld8Bi+n.2&!8.U0K\0O];M_:Pfd"!IitP8(PTs]T`a<?8B/Ush7J"**Mj81E.I>dlgk4so7HOTF4n91Bm8/Mt&04V\Aa+2DeGKL81&n2Q/u)K3<E+aN>oNo,_PmO.GlW8*pE>HAh_$PDKO];b(]4/p<'hRSY0+3H/_,#K55W\094h**FB<V!lR9YW(TTNPF`D.(c6;AP<uVBj?Y7uVLYQQSFZD$1V%AIc?oCQuBA0K5Mfk`JE$%+HSq7t`qT/t\E'#DhU,Cn4/Tk2\7:P0u0bB,)b<V"_NeLdSNR#djU"?2Ai0$EhcoogRA*:td%@7+)8j2I#2T18HnOB8j>U1A<Ah?m@C0:bHD4B8/H!NI1S8dgO11iV(As[kOCST+VF`e!^&pHf7<@cV$#&>XuR-`%oDU.A`<B]PZU.eLPV/A?HP[WgRmQA)u7's7H2LBf3DAZaXaO*Cd^V/;"m;V1CpsdA__4d)HB\9YI@-f/tJam=HFm\#GPj+Q/+VRFT3YIg_45T.7<_qW54pqT/8cHq^^Zu_\Z,66@rn<+N>,b#=V[]&Zbqo/32IqUJD#Tn5@i>G-,]DEkWpOX??aV)3BmR"T]pCi<@l/2'L*V<YN,S@ZoB_6>5C+QuXEC;=>_f;ehDMk@]462_3M^SnaZ'2<JrghD7]\09E!P69$DY4?r!-T,K@['h"pWP@](#X\<]<Hk19.tKZ&m0Iqt<X9L*1L<gro4750l^5!(t!7'E~>
+endstream
+endobj
+220 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 219 0 R
+/Annots 221 0 R
+>>
+endobj
+221 0 obj
+[
+222 0 R
+223 0 R
+224 0 R
+]
+endobj
+222 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 250.04 691.866 295.6 681.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 119 0 R
+/H /I
+>>
+endobj
+223 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 365.88 526.503 415.88 516.503 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 45 0 R
+/H /I
+>>
+endobj
+224 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 365.88 410.612 415.88 400.612 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 47 0 R
+/H /I
+>>
+endobj
+225 0 obj
+<< /Length 465 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GarVKbAP0N&A7TL5(_:]G+RdI"um_K<AZ01e:U=NM$;PQED$'(3W\<<WcIXr3]",&IEP,6MhJ=]UEm$4PggpIW;RQ)Hs96WlEMHYq2oL654p8`3MP"]`gMuZMd9t[DC=M'j@dZ1&OrrtGF#UKM5QJ+mjotA0:'V="rbs0\Si'\m_%V_Oq))mT.?b]-Zh]q*LQA8d@t7(FN*+Q"i$]WQR/Bj8mrWn57Se]\pSCWX+DQlL@5/N1ftrWX]l$RU3>J5[6[`ll5&>gCe<i"1CXsp>1>n0K<(6`MHW2!\r6g@C/7Z^8eg%d-+uOSf11m#027Y2mWt#+J&<s2/7OQ5I4ll+%I@]1T<>r;o4o`_Y#M&[(4]&[l?!'?-YDN\Qr[H.kQQ?+j8Z46'o^csO\I&/1r/WJ!0ZK"IU-*<"p:CqS3VuW82K>Hib98(p$FiEOZPduOQ#\Oe">fu?SS.dEr~>
+endstream
+endobj
+226 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 225 0 R
+>>
+endobj
+227 0 obj
+<< /Length 860 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gas1^92FS%&AIm?jL@aB:&:[+;IE@+G#=)3XUp8%15S_2]CH'f^L*mmob`ro0(F>\r+<s_-p$7h7nMQ5Z_XN]=jhE_,kGB7N4N=Rb/S/P)^`NNH2Q7<e!&j/OC]L.2C[6U]aChZgn;%:,^E">RJ/U1o'G<%_pc-g1cukUfnZJWEGogI*UI'3WcYA(+CROn'hYR<`@?[YXZ#-KR;rbC[1gJ+2l/<b.nL`J_Z,Q.#Et.H:n@m-*EptO3!CmmU'gW1?SGCI"p?T&VN&6d,c5#"%l?rtB<VJI2b0&";uuZ;,m7drW`YMWKm"b:8OMO4Pd`&6>1Fq3Y.6AWjVIKWi]D`DiL.FlcjAL%4f.Es]V5`OA9E3_K4-EPYi#_aPq`P>fU1tC#VB-5pJj+.2aocSbu%FprWb9NK-*]*;Yt+$l#>Ht9>aO.^(F1Y2]sQQ1Y<gabDh]DVUWrN;&0Al^qpMKBRZgPdpC?d7.;d!oh8f39*SW^!>-oBPGO^(cknW6HE+i-!=QV.5KI3X\Za"n>5SH/hGN'P-JjCnf(IG]qfsUi[[biiCo0bU?eWNSk;:=RPI[*^b%X@<a/Yl_4*.>>\m%gLp(O9ub=fP^&Ih!CMksYFU:l1O+<f^X%0b,nr8cu9-jdR<ODrNB82MZ&JP"Q(%HSMC`!bG3s.E-1W8]hOE.U=DVMQo>^E_^1/44:&:IQ8[LuC<6O%4sLQIjSneF3-$rflU!GrP-f&@f<Ar/SA,23sP#r"ug8'GVMIFLg;6glo/?e?0Mo3o)>+*_WW)V1\]:h?Ue(a:RRp,7+gRIGOJN\9GGohR9A.q^b%F,PgiA5A]GBGCEPE<A-F*p-2@AnZRhq?[`j5@f~>
+endstream
+endobj
+228 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 227 0 R
+>>
+endobj
+229 0 obj
+<< /Length 2112 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat%%9llga&A?DnTQ7?=@Kcel@rM?A*%0ij-:r'n3KP-3VKN/%^a,NMp"LBScjbfYQ7k^L^\7`mF\?d6T=qdm*$-fcR6Su%k@qpV(]LoXGq^#E$0-Kubh(.L,L8Gp:*SZ6psI-V>c2`<9>ZeB%,K)s=iu+8X(1>)1VWs$iGc7l-E(>SUDig[rRJI!H1Du;\/QhB7qZDEb[pU]"96<d`N)/<ja?cCf&/U`f?T>q*qP(!`lS^>mI18Xj6aY)EEU3^kI:%sp?1dYY&hc6V\Q-bYf-9VCLX(BCWCKV',-=QJ6k><G_.6Y%%qb.7'-!(;(aAOdN5P8MHMW!1^"rk!"cZ!:HWBmFJ"AS4r0td-Uh#l*Xi"o)l<')+Q1?D$_@/_XE.<3P>7"8B](TmBSHL4*WX'=H(K`8I3R71jX-B0<3a@mRU@!7OE^arVIt-(F.\8"_GW><c_S;eP$i=t%KQXB'Ra(,;.:\jT883PKgB;]<3ZSMRp[*8OE^cp6Y<U[FWOTZ/mi4KZo1WUMQE0XA\Q_f8N<LJFVn:1D=YblQTmE3.G$>Y9j0!U@e1J0?lK0/ppCe)KZ+_M8LIu\\+5kjl'[EeU'ATQY>Adk42:)6G_#4teF,"h]mIGJD[R*.,eUQ6l&\-*jl.0:,tZ%$=\V$grE_W%4N@'d\lbg)&uk[7Qd`.a=Y67WM?>JN^f?j%S"].HI.KHPlX$R)a7k.p]=;8)s#2^:A8Y8qr<04QLSse:VtF:W?rPW\%.pFRcKBBUarZ20oN<k63<UJp!"_WDpWNX)%+C&(kiGGHmj]i.PBll;'jEIiXl[uU!/NWC@LK_-&]lmHpE$?/nQ@V51B\ijCIc1?R0%&El9qH>,-0uaqm!-^da[,2CJo--:VtS\k%$\aACGg17s;JCT8PJJT1i2u)Rq!*CI_''!rs7C!+P(Z(1MD1;L<FnP"@rj,mN!.Q=5hLi`.'=YY\HCe;6`Yf?:LYdk;q0h1DBZ=%5+Q\&</3J!?G0g_/XA`f1ca/2c:GLY-jT1:^T*8&s-3*3WpZD_!Y`KC=7;Si/+Jc)Ykhe_@jdaBOgs<`r1Wq%hl&Q0I9G?/HM_H]C5c9U;n9X%mQ/ZnUnJ?CQJKi![5%Tf!BI4()RR/I$OMDn#a;-os#YAn&OQ?k2C3b?5gm",E2E-T\8QRH>7NCQ5B\+=jIBq%H^p!"uKDXK]K,$`uH%M7kEt\l]Xsj(=QAX3E,E:N-b%X!D!P6nIg;Mes,]KuN[L'hcE,$'l_7M-!n;QW^<Ck96+j7sMoh+7kj_Wj&`Fn--Id2n?<#(H8&]id8P_p2[m1lSZ*a]SKA8eWTQ+`',eTX/mf?m5_oZ5$\ch3&fR/%C1bo:=@qJq7C,;2qGZm+0de>#OK%54U-4.?bi;,<AIY0*Y/ee0(UHH#66SeFYU*ZMp27(Qg$m`pMb%@_%g1qU'\7O!/Up\f^OdF6EX'OEfD$u*iNP)Qoi,>"<d67=@CA&V9VFX^WIX(?SGe,KM$#"=05uh%NMDW,)JCQ#K:5JTs0Ep"(3q2&:h^"dL]+SZpJmZ;JOVF;Y6hI9YHdtl9HEC$b4oU*7W^i,/&ccjW:iSo@6=K?7h.TcL7De*`f<TOkQ?L)NG+1W]GXaPsThg1gV1^`D$%B3cuXpfm2VqnOQ)aTi$]PUo@NcqFu!2!T2BGX_AtK/buQH,r',%a'258S.9\lUd!V?j/Jp.=IqXX%SfHopF3ffl@_b?=Ht7nJKFW.T#(DND.9=eMD\G4;b#=]!/Y(O%R-O]1]k$fFX#7[0<8P\/r\tO'O#KFWZ/A_9B0"[!6nJZ+]]s7Z1"@=WO'XhfW4b^Rta:(Y`1LMJcJ%HmKJC-[Y[QC_pRZEG7V`D(f,5Z[,Q[H4M`lX+RuHQa/\qp/64,BZ.BVSA@=1XIY%un)[nm$T]uXOigWl;cskG3M+Hs1D-j+n,OX-7p<Ee1:16T0&`ES]Z\pLoqB>VNDRS#a*[6+ZMGZm&6J-H,;>U_mQP.*P;9m6gcl>#^>LWQ1]$*dWW(2;h`C%loY'(lPLHD<*>DH_:4I6AWH`E4b?6\ZVV2U^-9A]"g?=8hcW>#;RV8gD4#hA^Z]CZE/o3l:>qr`;b\c)[jlWGe~>
+endstream
+endobj
+230 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 229 0 R
+/Annots 231 0 R
+>>
+endobj
+231 0 obj
+[
+232 0 R
+233 0 R
+234 0 R
+235 0 R
+236 0 R
+237 0 R
+238 0 R
+239 0 R
+]
+endobj
+232 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 175.77 696.866 419.82 686.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc2119.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+233 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 389.35 669.866 528.98 659.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc2518.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+234 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 128.0 658.866 224.65 648.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc2518.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+235 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 492.97 642.866 539.54 632.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc2616.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+236 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 128.0 631.866 250.2 621.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc2616.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+237 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 386.87 615.866 537.6 605.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc3253.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+238 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 128.0 604.866 308.53 594.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc3253.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+239 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 314.64 588.866 528.67 578.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc3986.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+240 0 obj
+<< /Length 1787 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat%$>Bcf4&:X@Tn@$Hl/4.h@js`\qaXXke2Og8]"(Fcg<QK3K,l?o:&YTR9`uNFqcqW%lf<2.9cKk-n.OS\3i4PDJ^o_r--d\L,WJKuAK$K:;_Ke62l]mTFRlEuh\`S?.Z9[;R)66b(dZgQZgc*Nj0<p0CX+@$ZFLT,t%sJHAE>)qp6i9pn+a61"3eMYo0Eg!g17p-'8cITV>7Sbj`j97S!\!*bCS$Xk5Qr<f!ch,6.:1SmGYs\?`\e(S)h=%sKOh1r=Ci',[2p1O=dK9q\)Ksdn;,gkJn.>[cMVYYjZmF(]mkAT-0L5tSg[uQeL1OV1[I(ueT`Xr)d?(q<=s:jSD3q9GNVu=adT8!eegY#q>POVUkI'H1uQJ*Don6-XA]8G!6-:5JO/%Rh<npd,3ojDYjQ+?Y)tT[BTU"TbkuT)-A64qELiXp"BAt<;t:u!lR\&]'PAPG!l@KE78\`178_)$kFsA7m1;]S_h[<!itG:+#[J648B;#X'^i`\;a+ISp`SF!&l'<qUN<&G6U,%/)1f]iO>PVf6dA)$UkB@u,!K@r<LCbIo6%,&6u_A@oOp_;O/sa3Q-f&=3GE%=_!.<_0-kigCW7\ND+n%:WB\QtPg]C01;\KNcWCil\J7MJUjo]AUQ8G:'kI,L'1\i[/J*t"b(-M09td9rHK2<<3+)`[^LFlL@T*8lL]eckOa$rSUo+3UHkrC+ZXO&`,$F9\Z\_kA3U`A7J7Ct2dlDq^c\`>"W<oT)#R=X2%MDf-aVt!D?/aAX81A#EP#.#sCg7V?$3FKIlm@1D?=aPV"J03uK>,DBq(+eu`/5.4'^R/]+m-FI:'$@a<R=kKQBVVDF<#,%1Y=JH/sd9#/.6UJVc?9i2a1+2)a_=.9/W?+<V_pq:OY_n[DoG?3EBdM@UA3$Ut6ON]W0I#(M2eO!K,WBg$=uR^S,:),Jg8W7[>S)7isXiY)*sQoNsk=1R;sgE*dqj8Ed.A_-t[9aGr[AR@^5kY`_HhTRq"]HJW:O[IQ4`r3.C!6QuT.`cOu#4odM^?j,TeRQkO#V.`;+U:j8,HJ^1^nl#@"#JNq(j`_>fQWX`gTo+2,;UFU8@6f/]CpSSt!q[b_Otato3!(?k9Ln(r,(M?MPJZ-`_%s%odt(6M"$6"*Qd?r?`KrR+2Q[IQA`b[]B0npEeMSoPb<$:mXfqg;^^Qs=@<1_Cp7P"Pnt7l,Dl=IAeB4=h3;T_K9-XH]S:=n0pd_iGj:Db1F3b+`L'po2V)t'HQ[Tirjb,QI>9/8?E,asJk?)p=hV>Y%iiEo:B5H5OhhGdgD/_p"q_"[bb_9Q<VX:pU'.OJegL>'4F2o8P<.':1cPh?RZ2O<BIB6Y2<OBou<`ukD3k"8ROn4-8H;>)qfO=4tZY>IPgGBqo*WmJ$r>c=&F(YJ,L6aog)V,><Rnd2<(.>%nUZ"1em9-:olo"em*8BT*fj\]a_],QQ@/;QnBM,$-k2eU*9Wa`E_(^-*L?$*?Ki5=V2B.`1J<MiF]FMtG\1jsQSaNDiS=O2[@p3:=BGKrO[>FGjJMK:qENJ]+.nB>e/bZ/)8?L>#-_@"tCH$-C3eI_b0^c$A"Z$]^*a,)j#kFpf(OKC(Nb8eBV?V:YG]4F>f0$3^jl[tElE71am`l)cjM=qrl&*c5o\,>)*Fq/ere+@n'tprkB'#*j>1E7QF27`0cBDYnQ:*blm#bn/&qJ:e73cYJNSZ-qnM"Y+hlK'i_p77[MbC0#ku)dRhHrhe(+%]gH@`#.==NsY0)RTR:.!Rfro"fcRJmHKG#`A~>
+endstream
+endobj
+241 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 240 0 R
+/Annots 242 0 R
+>>
+endobj
+242 0 obj
+[
+243 0 R
+244 0 R
+245 0 R
+246 0 R
+247 0 R
+248 0 R
+]
+endobj
+243 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 104.78 631.866 178.41 621.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (mailto:ejw@cse.ucsc.edu)
+/S /URI >>
+/H /I
+>>
+endobj
+244 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 104.78 555.866 224.25 545.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (mailto:geoffrey.clemm@us.ibm.com)
+/S /URI >>
+/H /I
+>>
+endobj
+245 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 479.866 172.92 469.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (tel:+492512807760)
+/S /URI >>
+/H /I
+>>
+endobj
+246 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 468.866 162.92 458.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (tel:+492512807761)
+/S /URI >>
+/H /I
+>>
+endobj
+247 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 104.78 457.866 225.07 447.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (mailto:julian.reschke@greenbytes.de)
+/S /URI >>
+/H /I
+>>
+endobj
+248 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 94.5 446.866 229.76 436.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://greenbytes.de/tech/webdav/)
+/S /URI >>
+/H /I
+>>
+endobj
+249 0 obj
+<< /Length 1992 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat%%?#SIU'Rf_Zcsm-aW]i#6)hoYE1Shg:/2>_2[L]`5gI,UEV.?M"pEONR]U'?J#lt*!juN2*OI$ZbDHDa?GHnJr4_M0*Gg:Kk4.c6=SMV)-P19/gbZX>(03A.\o?CEd3jhc0m8_mlP\hX(%[Z@eHc!q.Ia;]:H-7-*Vn?ta^?m?^a,_oE&kEKcF+$Jt?Zi_,C#0k$H0r6R@SaA@HJip5H1qBipmrX!;D$AMob>qk7lA3_a46`plc=;(lJ&>if1k),Nn'DD_WdBUJlQ$*LX\glZ@YYfl:K7nFdid'i2;RK-5F>/eoCBDO_o;J3uk::]"fo41d-,=I1kSkqpb"(Va5Y9d^O"b4YI,rdfS/%I1n@BX+l*lI^+<"dQO]nJpiA:3OBRJ&5u*j>ud6a(ALhT2WnlcAKk,9#0\U_r#h84&HdJ66g,>J5_!q_%t"8fA,4D*ga1-X"Zq".$934r!CF=Okf+`2kDZ%5g+o&V.+4B^9DTTDbb6sL72V]V[,JC2h*uHV2BFP,%^_'S!kUf,C@R,e>8f!j_.[qsWO]ui-C_<cMhQ)j<u5JB@,@@d'?qVl[,H.&MZ\`(4gPV&TPYoo)G;*T-M"Q%k$Z*kqfqkof@^Pck+in:mS,8[fJ)LULBi6kUsQWgegb_G]+K;!)^"@"6"=:<h`j5TDQl#PlPA62VhB1E_9;ZgbrP.sB5fW#?D+ho=qQuu\P;038)%Gmcs:,_X42IelFJ1J^>X3'QuOOd@9mi28_;@<dnMR"?K23XkfYQ[.#7]F0?Y#6)8oFfB5NQIA-3dDSlh>"S;JMW)U@F-JIsY9@JqtB@[s:K`I<$)gp0Q[6/46TG^#7Kb;Ln1Q31o_SIL<8c\C'K8MdiYhNe4XaUk`8b.!NP=p(\tmh]%hXqj5;B4IIP^R[fX-,LMX:NH#=n&0\AL.VE<F?DMP,Nma*>5Z"B>q%>^3k`Eo#OluiFj58+9I#4Jl.^h#1\cbm]TU8Z'M>H]!k%Ku8hmB('?lSr!J3WhJQXs!Tqs7&'WD;;MA+9sC&fN5<%pYd9C8E<lEaJ?AlWiF3DqRs:kWjo7jt`D"e?e/]Qg6q99:]GK:ougL:En>$2fVK'#:tH(rZ<%_"W48).Vkf.O7jT>#^rd.a3\`_\<-G&-kR@Jt!YcUb\uMbc9ZUF/38qUe';m)PPMU'bj38<iMHd`JN_J`;i3_9=%)9Zr@24;EL@IK2omIB1Ol[P!Y\Wit7/TC(CJG2ccoF<Q/+dObs1&,&uWt$8#7DVkfToWo>:FUgekI#_I%'/QG)feCl8"?r_3p),^ooUkmh`*MM\np.uls>GYe0'doIq'a"S-k`&MSW<s!.DJ`8\ek;Mn8o]2L&A$%6UT]25VX;pNi)E!SCf;ZG;CpWPT!2")k`jWT?r_4/CfCU(:l(>0.#!teTKm7%PA7>%3--u-"!B$:2bBo`<'>=GUL:W61P1@2$m+frj`471PuU?*_'?9`bn7uOg32tEe.>U:6q;'RX0/\N"-80,&7"0])@Dtcc-,o2q$+k+E:!cKE="8`OesQ\#Jp,a;gfX<.^W':STN(5.^B2"jTt+*.\J$M26&A.3&#5#kOur0lf#>u<C(j1MJ!GG,qU-Z,QdXN;A<RMT^K\^n5':+@f;)7??(QFE<EH^8)Yb\69fRerdN!M\>K<iZ%)$Ur43MupBRrQ8#[F<HsSNlBS>AqR,N:-hq[cO,o/.4Sp3Ob[D'bt=7pW+MsY'ua1n05@Tgeep?kc90-9i`%Ot&!/7b.M^^aA)LD%lUOUO`\^aZdBR5E8L`L^)2mC8N28'pPccnq[VHm>@-dC5OI=8+XL2d`c5<UTc6C72V8QCL*'*K-XG&U1s6ZOXpt\b]"OJ)1#->bHdA-<TM\U`6Si<B7FD[e53Dl]&UqeJ$CrKYoiQi-EKhC#TOBqj2TtGph1q*@1kkMC;`38strnR"a]hq:STi:1%7:M9fP+OdqtD?QR9(W!gLYkB-5gB@6bIi_'X~>
+endstream
+endobj
+250 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 249 0 R
+/Annots 251 0 R
+>>
+endobj
+251 0 obj
+[
+252 0 R
+253 0 R
+254 0 R
+]
+endobj
+252 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 488.89 604.866 535.374 594.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://www.ietf.org/ipr)
+/S /URI >>
+/H /I
+>>
+endobj
+253 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 92.0 593.866 144.783 583.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://www.ietf.org/ipr)
+/S /URI >>
+/H /I
+>>
+endobj
+254 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 247.26 550.866 313.4 540.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (mailto:ietf-ipr@ietf.org)
+/S /URI >>
+/H /I
+>>
+endobj
+255 0 obj
+<< /Length 2383 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm>=`4sF&:WeDpl.\Y]m]YI^9J4P]*grf=ce/h_4Dnf^1:"Bq=e)VQb16nRI5(%0-o:PhcE>"d?D=Wci/0!-;5%5RGC!#PM9_d6K(-e0cYXTW$P.$a_X-9HLYmZaF7Jk^/&?j(K.[U6392V,Y<50n?P'Ug5"W(*-NO73kO.K*i?:2oK$2-pXqZaJ)":(VHctXH#]1IMemkMm^,ic.'n4Tg##OC!+mO>=s+7!.Kq2CC*a-eU-/-aLpe"jRT5-PS&I-iDDt(g+4>:TW-$O@f)6[B"AuSbl^.YM\]Sg=eT@G>jQZY%bE"-e?0q:<\'#V8'1o:2(rMqKig\4+94V8h7H:.Lc\bXHf&bW6BJ,*17W7HSZc2Qc[n-+,R]]]G?eOEYdlGmR)*ZK!l($5N#[c^_$n,2TTT'b6:eQQt6&b8op&-&+rl?2mb08c?M*Jit'[foON"a2>,SQg'"u?!',#fhc:,'IKKF12kjVhTmrTa()p5m>"Z5f*=N$)#+%J<<[dXARGJ_+=W^Ro/f3hVu0B"GN[Xj2g$Jio5$K*JS;Ot`M>mC)7oH'@>_M!X)L\(g?B1N/n)2^uRf6aok$bL;W2\p_GeJd1>HdZX+?h,77M616oK1IJ7N(otD<.OBr8U'(d/O]e3>kaXtje/0RW=]-;&?-01=iod0tF1mfJ,hpqJ'bjruA]8;T9e3)3,'ZJhB:-I=;akLS1Z,?ZX(Al1B1LAF.Qnc35<eg.Fa+s-HX$U[%*6uZ0e(>0<YObdeNZGe/EY";,cZ>rD(s>`Kr,00Y9bta8T;[FOZMr&BmHF])!/St`)unBEH8..\A<c/91sZ#W.J(2InP?:7r<`>(eqO/Q1[qf4_e0qilh4KO$@0UC^gh(asW]u$tVf9Bh\`mk1;Mi-G/[-O?FUYbD=0:"+_t:.]ADak$o(XfX0YNW,r;]W!\m`UaF6^f0,FjF5;hq-p_/QRV5*iD`2YGCD8YGMQma:"]=<K(nY",KJqD>0Si8r0QPMTJ`S1D<3uNah%Y/7<4@H8+u.I&Fp)(W9>jP;Zjk*%8D%<FZ+_kdAhuYH>OYVk&Ckj\jr'-;n`l0tYQhSl/m_<f.i9-]"rrMc[Y/(GW)sqb"q6BS8.9CU60lMBgEg-PeJNDL0?SFeQ;!NU<,r<a<3V'2\0]2^(`b5T,^>Enb$`$a!D7$XgMpl6Y)DB22u1?DMn3PQ5Zbd@>_G'H(+7d&n8o<^h,`=[%C?k'()C"dE$t(D]&O0^L?[AFX?N^@$%mT/:Zs7>#6G6H_1EW]Jd5>sdDJ"h2'&BEZsCKVDS(2&L7=Ru+.h2+5#>)172#--(Q!nn&N.)cQ8^C5;P1DKks@28ag%s9\rX["g!\5MfntOcDP.;><??KKn1`c]VPMaPs4cNbT_#^c.gs;6UYdH9c#G%u-Whf.H%^1^:Y-4hd7"-26Xa:!T0lj1)-q[aGsC@bpQTQq8"'*SI^`U)]+_&eg78''qWdacl`4*nl`2sAV%VR^1fbC_*6K]TX;:U'nb()YeOTm9;LBr\$A5npKC+ot31qmVlb\-KFJ*8CNKo8YKE3IJYY"SE44ksJS(jmC;T(in7B1sD%@"k9i1o2L%l*QO&[&CE+EYkaC='Z.'*lg=;-6og]-WX\Y+I.=I2KIi0P_:OX'52t(0%g/:lNdXjE38R%=G34jgP\p;g4Y_B$;NO$=*C?LbY/_0O6cIR"(FXT0V46g%o7*-5BBU_5gC1I@Wa;90jba6t$_QckI(A$/cT`C;>6c_%^l2dNtU[\a+]o$LU*sCG:Usn(`'-pS0r6+f'WD!HCO6\r1`'"O%Nr,%l@m(XUU4_5`8/@E$5LZ5hQ)f9@/S.IEoE69%9`W`AZHTY:+g0R#87=C&8cS-E7dJ^R,4m:V&;LME:-1X)r.<J8@n,d?#?Mj4`VpkgWHNDrn:rmMumQl104+`t*?dJZ`g<m4&>@&Uc);-"J+c":].e^9%AMN3Ej"en@/QF4ftSgN67Ts:mgHl+P;K0QZB$+Q5HeW?rZWOp@lV37PY(?`E%Xr994P_=s%GJUHDWr)?:!SV:nP7JYlM8`lfa3"T%`<r3K5Cl/jh4%8$'1fD3lO@>*(3#n&pJ`+B%Vq?LWWm&^aTQ$S,%`?j:fghN6X+890""+Bk+4@Z\?_9*Ps].69a$c<10`3c@$oWq6CqYmj/8(rb",N/MTH"0;]jeA(5W4h<<]39P))mg,Tc/b"7*10mUIml_/pAC5(E@=;$gmBBBV8-&o0"[lSl#-D,`h=i?ngS3="@VT<fX'0,gQs7/-E`N!`j(Jj)304.bDql;eWP?NfS4bl)pubVM3O]f=11ZV%eQ%RF2or-7lRlI=84pXHnN0c9hqqu,--l)i!$aNI0FO7*h_ea1uh,$Kr+~>
+endstream
+endobj
+256 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 255 0 R
+/Annots 257 0 R
+>>
+endobj
+257 0 obj
+[
+]
+endobj
+260 0 obj
+<<
+ /Title (\376\377\0\123\0\164\0\141\0\164\0\165\0\163\0\40\0\157\0\146\0\40\0\164\0\150\0\151\0\163\0\40\0\115\0\145\0\155\0\157)
+ /Parent 258 0 R
+ /Next 262 0 R
+ /A 259 0 R
+>> endobj
+262 0 obj
+<<
+ /Title (\376\377\0\103\0\157\0\160\0\171\0\162\0\151\0\147\0\150\0\164\0\40\0\116\0\157\0\164\0\151\0\143\0\145)
+ /Parent 258 0 R
+ /Prev 260 0 R
+ /Next 264 0 R
+ /A 261 0 R
+>> endobj
+264 0 obj
+<<
+ /Title (\376\377\0\101\0\142\0\163\0\164\0\162\0\141\0\143\0\164)
+ /Parent 258 0 R
+ /Prev 262 0 R
+ /Next 266 0 R
+ /A 263 0 R
+>> endobj
+266 0 obj
+<<
+ /Title (\376\377\0\124\0\141\0\142\0\154\0\145\0\40\0\157\0\146\0\40\0\103\0\157\0\156\0\164\0\145\0\156\0\164\0\163)
+ /Parent 258 0 R
+ /Prev 264 0 R
+ /Next 267 0 R
+ /A 265 0 R
+>> endobj
+267 0 obj
+<<
+ /Title (\376\377\0\61\0\56\0\40\0\111\0\156\0\164\0\162\0\157\0\144\0\165\0\143\0\164\0\151\0\157\0\156)
+ /Parent 258 0 R
+ /Prev 266 0 R
+ /Next 268 0 R
+ /A 11 0 R
+>> endobj
+268 0 obj
+<<
+ /Title (\376\377\0\62\0\56\0\40\0\116\0\157\0\164\0\141\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\103\0\157\0\156\0\166\0\145\0\156\0\164\0\151\0\157\0\156\0\163)
+ /Parent 258 0 R
+ /Prev 267 0 R
+ /Next 270 0 R
+ /A 13 0 R
+>> endobj
+270 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\40\0\124\0\145\0\162\0\155\0\151\0\156\0\157\0\154\0\157\0\147\0\171)
+ /Parent 258 0 R
+ /Prev 268 0 R
+ /Next 272 0 R
+ /A 269 0 R
+>> endobj
+272 0 obj
+<<
+ /Title (\376\377\0\64\0\56\0\40\0\117\0\166\0\145\0\162\0\166\0\151\0\145\0\167\0\40\0\157\0\146\0\40\0\122\0\145\0\144\0\151\0\162\0\145\0\143\0\164\0\40\0\122\0\145\0\146\0\145\0\162\0\145\0\156\0\143\0\145\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\163)
+ /Parent 258 0 R
+ /Prev 270 0 R
+ /Next 274 0 R
+ /A 271 0 R
+>> endobj
+274 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\40\0\117\0\160\0\145\0\162\0\141\0\164\0\151\0\157\0\156\0\163\0\40\0\157\0\156\0\40\0\122\0\145\0\144\0\151\0\162\0\145\0\143\0\164\0\40\0\122\0\145\0\146\0\145\0\162\0\145\0\156\0\143\0\145\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\163)
+ /Parent 258 0 R
+ /Prev 272 0 R
+ /Next 276 0 R
+ /A 273 0 R
+>> endobj
+276 0 obj
+<<
+ /Title (\376\377\0\66\0\56\0\40\0\115\0\113\0\122\0\105\0\104\0\111\0\122\0\105\0\103\0\124\0\122\0\105\0\106\0\40\0\115\0\145\0\164\0\150\0\157\0\144)
+ /Parent 258 0 R
+ /First 277 0 R
+ /Last 277 0 R
+ /Prev 274 0 R
+ /Next 279 0 R
+ /Count -1
+ /A 275 0 R
+>> endobj
+277 0 obj
+<<
+ /Title (\376\377\0\66\0\56\0\61\0\56\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\72\0\40\0\103\0\162\0\145\0\141\0\164\0\151\0\156\0\147\0\40\0\141\0\40\0\122\0\145\0\144\0\151\0\162\0\145\0\143\0\164\0\40\0\122\0\145\0\146\0\145\0\162\0\145\0\156\0\143\0\145\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\40\0\167\0\151\0\164\0\150\0\40\0\115\0\113\0\122\0\105\0\104\0\111\0\122\0\105\0\103\0\124\0\122\0\105\0\106)
+ /Parent 276 0 R
+ /A 23 0 R
+>> endobj
+279 0 obj
+<<
+ /Title (\376\377\0\67\0\56\0\40\0\125\0\120\0\104\0\101\0\124\0\105\0\122\0\105\0\104\0\111\0\122\0\105\0\103\0\124\0\122\0\105\0\106\0\40\0\115\0\145\0\164\0\150\0\157\0\144)
+ /Parent 258 0 R
+ /First 280 0 R
+ /Last 280 0 R
+ /Prev 276 0 R
+ /Next 282 0 R
+ /Count -1
+ /A 278 0 R
+>> endobj
+280 0 obj
+<<
+ /Title (\376\377\0\67\0\56\0\61\0\56\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\72\0\40\0\125\0\160\0\144\0\141\0\164\0\151\0\156\0\147\0\40\0\141\0\40\0\122\0\145\0\144\0\151\0\162\0\145\0\143\0\164\0\40\0\122\0\145\0\146\0\145\0\162\0\145\0\156\0\143\0\145\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\40\0\167\0\151\0\164\0\150\0\40\0\125\0\120\0\104\0\101\0\124\0\105\0\122\0\105\0\104\0\111\0\122\0\105\0\103\0\124\0\122\0\105\0\106)
+ /Parent 279 0 R
+ /A 27 0 R
+>> endobj
+282 0 obj
+<<
+ /Title (\376\377\0\70\0\56\0\40\0\117\0\160\0\145\0\162\0\141\0\164\0\151\0\157\0\156\0\163\0\40\0\157\0\156\0\40\0\103\0\157\0\154\0\154\0\145\0\143\0\164\0\151\0\157\0\156\0\163\0\40\0\124\0\150\0\141\0\164\0\40\0\103\0\157\0\156\0\164\0\141\0\151\0\156\0\40\0\122\0\145\0\144\0\151\0\162\0\145\0\143\0\164\0\40\0\122\0\145\0\146\0\145\0\162\0\145\0\156\0\143\0\145\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\163)
+ /Parent 258 0 R
+ /First 283 0 R
+ /Last 284 0 R
+ /Prev 279 0 R
+ /Next 286 0 R
+ /Count -2
+ /A 281 0 R
+>> endobj
+283 0 obj
+<<
+ /Title (\376\377\0\70\0\56\0\61\0\56\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\72\0\40\0\120\0\122\0\117\0\120\0\106\0\111\0\116\0\104\0\40\0\157\0\156\0\40\0\141\0\40\0\103\0\157\0\154\0\154\0\145\0\143\0\164\0\151\0\157\0\156\0\40\0\167\0\151\0\164\0\150\0\40\0\122\0\145\0\144\0\151\0\162\0\145\0\143\0\164\0\40\0\122\0\145\0\146\0\145\0\162\0\145\0\156\0\143\0\145\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\163)
+ /Parent 282 0 R
+ /Next 284 0 R
+ /A 31 0 R
+>> endobj
+284 0 obj
+<<
+ /Title (\376\377\0\70\0\56\0\62\0\56\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\72\0\40\0\120\0\122\0\117\0\120\0\106\0\111\0\116\0\104\0\40\0\167\0\151\0\164\0\150\0\40\0\101\0\160\0\160\0\154\0\171\0\55\0\124\0\157\0\55\0\122\0\145\0\144\0\151\0\162\0\145\0\143\0\164\0\55\0\122\0\145\0\146\0\40\0\157\0\156\0\40\0\141\0\40\0\103\0\157\0\154\0\154\0\145\0\143\0\164\0\151\0\157\0\156\0\40\0\167\0\151\0\164\0\150\0\40\0\122\0\145\0\144\0\151\0\162\0\145\0\143\0\164\0\40\0\122\0\145\0\146\0\145\0\162\0\145\0\156\0\143\0\145\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\163)
+ /Parent 282 0 R
+ /Prev 283 0 R
+ /A 33 0 R
+>> endobj
+286 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\40\0\117\0\160\0\145\0\162\0\141\0\164\0\151\0\157\0\156\0\163\0\40\0\157\0\156\0\40\0\124\0\141\0\162\0\147\0\145\0\164\0\163\0\40\0\157\0\146\0\40\0\122\0\145\0\144\0\151\0\162\0\145\0\143\0\164\0\40\0\122\0\145\0\146\0\145\0\162\0\145\0\156\0\143\0\145\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\163)
+ /Parent 258 0 R
+ /Prev 282 0 R
+ /Next 287 0 R
+ /A 285 0 R
+>> endobj
+287 0 obj
+<<
+ /Title (\376\377\0\61\0\60\0\56\0\40\0\122\0\145\0\154\0\141\0\164\0\151\0\166\0\145\0\40\0\122\0\145\0\146\0\145\0\162\0\145\0\156\0\143\0\145\0\163\0\40\0\151\0\156\0\40\0\104\0\101\0\126\0\72\0\162\0\145\0\146\0\164\0\141\0\162\0\147\0\145\0\164)
+ /Parent 258 0 R
+ /First 288 0 R
+ /Last 288 0 R
+ /Prev 286 0 R
+ /Next 290 0 R
+ /Count -1
+ /A 37 0 R
+>> endobj
+288 0 obj
+<<
+ /Title (\376\377\0\61\0\60\0\56\0\61\0\56\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\72\0\40\0\122\0\145\0\163\0\157\0\154\0\166\0\151\0\156\0\147\0\40\0\141\0\40\0\122\0\145\0\154\0\141\0\164\0\151\0\166\0\145\0\40\0\122\0\145\0\146\0\145\0\162\0\145\0\156\0\143\0\145\0\40\0\151\0\156\0\40\0\141\0\40\0\115\0\165\0\154\0\164\0\151\0\55\0\123\0\164\0\141\0\164\0\165\0\163\0\40\0\122\0\145\0\163\0\160\0\157\0\156\0\163\0\145)
+ /Parent 287 0 R
+ /A 39 0 R
+>> endobj
+290 0 obj
+<<
+ /Title (\376\377\0\61\0\61\0\56\0\40\0\122\0\145\0\144\0\151\0\162\0\145\0\143\0\164\0\40\0\122\0\145\0\146\0\145\0\162\0\145\0\156\0\143\0\145\0\163\0\40\0\164\0\157\0\40\0\103\0\157\0\154\0\154\0\145\0\143\0\164\0\151\0\157\0\156\0\163)
+ /Parent 258 0 R
+ /Prev 287 0 R
+ /Next 292 0 R
+ /A 289 0 R
+>> endobj
+292 0 obj
+<<
+ /Title (\376\377\0\61\0\62\0\56\0\40\0\110\0\145\0\141\0\144\0\145\0\162\0\163)
+ /Parent 258 0 R
+ /First 294 0 R
+ /Last 296 0 R
+ /Prev 290 0 R
+ /Next 298 0 R
+ /Count -2
+ /A 291 0 R
+>> endobj
+294 0 obj
+<<
+ /Title (\376\377\0\61\0\62\0\56\0\61\0\56\0\40\0\122\0\145\0\144\0\151\0\162\0\145\0\143\0\164\0\55\0\122\0\145\0\146\0\40\0\122\0\145\0\163\0\160\0\157\0\156\0\163\0\145\0\40\0\110\0\145\0\141\0\144\0\145\0\162)
+ /Parent 292 0 R
+ /Next 296 0 R
+ /A 293 0 R
+>> endobj
+296 0 obj
+<<
+ /Title (\376\377\0\61\0\62\0\56\0\62\0\56\0\40\0\101\0\160\0\160\0\154\0\171\0\55\0\124\0\157\0\55\0\122\0\145\0\144\0\151\0\162\0\145\0\143\0\164\0\55\0\122\0\145\0\146\0\40\0\122\0\145\0\161\0\165\0\145\0\163\0\164\0\40\0\110\0\145\0\141\0\144\0\145\0\162)
+ /Parent 292 0 R
+ /Prev 294 0 R
+ /A 295 0 R
+>> endobj
+298 0 obj
+<<
+ /Title (\376\377\0\61\0\63\0\56\0\40\0\122\0\145\0\144\0\151\0\162\0\145\0\143\0\164\0\40\0\122\0\145\0\146\0\145\0\162\0\145\0\156\0\143\0\145\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163)
+ /Parent 258 0 R
+ /First 300 0 R
+ /Last 302 0 R
+ /Prev 292 0 R
+ /Next 304 0 R
+ /Count -2
+ /A 297 0 R
+>> endobj
+300 0 obj
+<<
+ /Title (\376\377\0\61\0\63\0\56\0\61\0\56\0\40\0\104\0\101\0\126\0\72\0\162\0\145\0\144\0\151\0\162\0\145\0\143\0\164\0\55\0\154\0\151\0\146\0\145\0\164\0\151\0\155\0\145\0\40\0\50\0\160\0\162\0\157\0\164\0\145\0\143\0\164\0\145\0\144\0\51)
+ /Parent 298 0 R
+ /Next 302 0 R
+ /A 299 0 R
+>> endobj
+302 0 obj
+<<
+ /Title (\376\377\0\61\0\63\0\56\0\62\0\56\0\40\0\104\0\101\0\126\0\72\0\162\0\145\0\146\0\164\0\141\0\162\0\147\0\145\0\164\0\40\0\50\0\160\0\162\0\157\0\164\0\145\0\143\0\164\0\145\0\144\0\51)
+ /Parent 298 0 R
+ /Prev 300 0 R
+ /A 301 0 R
+>> endobj
+304 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164\0\163)
+ /Parent 258 0 R
+ /First 306 0 R
+ /Last 306 0 R
+ /Prev 298 0 R
+ /Next 308 0 R
+ /Count -1
+ /A 303 0 R
+>> endobj
+306 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\61\0\56\0\40\0\162\0\145\0\144\0\151\0\162\0\145\0\143\0\164\0\162\0\145\0\146\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164)
+ /Parent 304 0 R
+ /A 305 0 R
+>> endobj
+308 0 obj
+<<
+ /Title (\376\377\0\61\0\65\0\56\0\40\0\105\0\170\0\164\0\145\0\156\0\163\0\151\0\157\0\156\0\163\0\40\0\164\0\157\0\40\0\164\0\150\0\145\0\40\0\104\0\101\0\126\0\72\0\162\0\145\0\163\0\160\0\157\0\156\0\163\0\145\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164\0\40\0\146\0\157\0\162\0\40\0\115\0\165\0\154\0\164\0\151\0\55\0\123\0\164\0\141\0\164\0\165\0\163\0\40\0\122\0\145\0\163\0\160\0\157\0\156\0\163\0\145\0\163)
+ /Parent 258 0 R
+ /Prev 304 0 R
+ /Next 310 0 R
+ /A 307 0 R
+>> endobj
+310 0 obj
+<<
+ /Title (\376\377\0\61\0\66\0\56\0\40\0\103\0\141\0\160\0\141\0\142\0\151\0\154\0\151\0\164\0\171\0\40\0\104\0\151\0\163\0\143\0\157\0\166\0\145\0\162\0\171)
+ /Parent 258 0 R
+ /First 311 0 R
+ /Last 311 0 R
+ /Prev 308 0 R
+ /Next 313 0 R
+ /Count -1
+ /A 309 0 R
+>> endobj
+311 0 obj
+<<
+ /Title (\376\377\0\61\0\66\0\56\0\61\0\56\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\72\0\40\0\104\0\151\0\163\0\143\0\157\0\166\0\145\0\162\0\171\0\40\0\157\0\146\0\40\0\123\0\165\0\160\0\160\0\157\0\162\0\164\0\40\0\146\0\157\0\162\0\40\0\122\0\145\0\144\0\151\0\162\0\145\0\143\0\164\0\40\0\122\0\145\0\146\0\145\0\162\0\145\0\156\0\143\0\145\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\163)
+ /Parent 310 0 R
+ /A 63 0 R
+>> endobj
+313 0 obj
+<<
+ /Title (\376\377\0\61\0\67\0\56\0\40\0\123\0\145\0\143\0\165\0\162\0\151\0\164\0\171\0\40\0\103\0\157\0\156\0\163\0\151\0\144\0\145\0\162\0\141\0\164\0\151\0\157\0\156\0\163)
+ /Parent 258 0 R
+ /First 314 0 R
+ /Last 317 0 R
+ /Prev 310 0 R
+ /Next 318 0 R
+ /Count -4
+ /A 312 0 R
+>> endobj
+314 0 obj
+<<
+ /Title (\376\377\0\61\0\67\0\56\0\61\0\56\0\40\0\120\0\162\0\151\0\166\0\141\0\143\0\171\0\40\0\103\0\157\0\156\0\143\0\145\0\162\0\156\0\163)
+ /Parent 313 0 R
+ /Next 315 0 R
+ /A 67 0 R
+>> endobj
+315 0 obj
+<<
+ /Title (\376\377\0\61\0\67\0\56\0\62\0\56\0\40\0\122\0\145\0\144\0\151\0\162\0\145\0\143\0\164\0\40\0\114\0\157\0\157\0\160\0\163)
+ /Parent 313 0 R
+ /Prev 314 0 R
+ /Next 316 0 R
+ /A 69 0 R
+>> endobj
+316 0 obj
+<<
+ /Title (\376\377\0\61\0\67\0\56\0\63\0\56\0\40\0\122\0\145\0\144\0\151\0\162\0\145\0\143\0\164\0\40\0\122\0\145\0\146\0\145\0\162\0\145\0\156\0\143\0\145\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\163\0\40\0\141\0\156\0\144\0\40\0\104\0\145\0\156\0\151\0\141\0\154\0\40\0\157\0\146\0\40\0\123\0\145\0\162\0\166\0\151\0\143\0\145)
+ /Parent 313 0 R
+ /Prev 315 0 R
+ /Next 317 0 R
+ /A 71 0 R
+>> endobj
+317 0 obj
+<<
+ /Title (\376\377\0\61\0\67\0\56\0\64\0\56\0\40\0\122\0\145\0\166\0\145\0\141\0\154\0\151\0\156\0\147\0\40\0\120\0\162\0\151\0\166\0\141\0\164\0\145\0\40\0\114\0\157\0\143\0\141\0\164\0\151\0\157\0\156\0\163)
+ /Parent 313 0 R
+ /Prev 316 0 R
+ /A 73 0 R
+>> endobj
+318 0 obj
+<<
+ /Title (\376\377\0\61\0\70\0\56\0\40\0\111\0\156\0\164\0\145\0\162\0\156\0\141\0\164\0\151\0\157\0\156\0\141\0\154\0\151\0\172\0\141\0\164\0\151\0\157\0\156\0\40\0\103\0\157\0\156\0\163\0\151\0\144\0\145\0\162\0\141\0\164\0\151\0\157\0\156\0\163)
+ /Parent 258 0 R
+ /Prev 313 0 R
+ /Next 320 0 R
+ /A 75 0 R
+>> endobj
+320 0 obj
+<<
+ /Title (\376\377\0\61\0\71\0\56\0\40\0\111\0\101\0\116\0\101\0\40\0\103\0\157\0\156\0\163\0\151\0\144\0\145\0\162\0\141\0\164\0\151\0\157\0\156\0\163)
+ /Parent 258 0 R
+ /First 321 0 R
+ /Last 321 0 R
+ /Prev 318 0 R
+ /Next 324 0 R
+ /Count -3
+ /A 319 0 R
+>> endobj
+321 0 obj
+<<
+ /Title (\376\377\0\61\0\71\0\56\0\61\0\56\0\40\0\110\0\124\0\124\0\120\0\40\0\150\0\145\0\141\0\144\0\145\0\162\0\163)
+ /Parent 320 0 R
+ /First 322 0 R
+ /Last 323 0 R
+ /Count -2
+ /A 82 0 R
+>> endobj
+322 0 obj
+<<
+ /Title (\376\377\0\61\0\71\0\56\0\61\0\56\0\61\0\56\0\40\0\122\0\145\0\144\0\151\0\162\0\145\0\143\0\164\0\55\0\122\0\145\0\146)
+ /Parent 321 0 R
+ /Next 323 0 R
+ /A 84 0 R
+>> endobj
+323 0 obj
+<<
+ /Title (\376\377\0\61\0\71\0\56\0\61\0\56\0\62\0\56\0\40\0\101\0\160\0\160\0\154\0\171\0\55\0\124\0\157\0\55\0\122\0\145\0\144\0\151\0\162\0\145\0\143\0\164\0\55\0\122\0\145\0\146)
+ /Parent 321 0 R
+ /Prev 322 0 R
+ /A 86 0 R
+>> endobj
+324 0 obj
+<<
+ /Title (\376\377\0\62\0\60\0\56\0\40\0\103\0\157\0\156\0\164\0\162\0\151\0\142\0\165\0\164\0\157\0\162\0\163)
+ /Parent 258 0 R
+ /Prev 320 0 R
+ /Next 325 0 R
+ /A 88 0 R
+>> endobj
+325 0 obj
+<<
+ /Title (\376\377\0\62\0\61\0\56\0\40\0\101\0\143\0\153\0\156\0\157\0\167\0\154\0\145\0\144\0\147\0\145\0\155\0\145\0\156\0\164\0\163)
+ /Parent 258 0 R
+ /Prev 324 0 R
+ /Next 326 0 R
+ /A 90 0 R
+>> endobj
+326 0 obj
+<<
+ /Title (\376\377\0\62\0\62\0\56\0\40\0\116\0\157\0\162\0\155\0\141\0\164\0\151\0\166\0\145\0\40\0\122\0\145\0\146\0\145\0\162\0\145\0\156\0\143\0\145\0\163)
+ /Parent 258 0 R
+ /Prev 325 0 R
+ /Next 327 0 R
+ /A 92 0 R
+>> endobj
+327 0 obj
+<<
+ /Title (\376\377\0\101\0\165\0\164\0\150\0\157\0\162\0\163\0\47\0\40\0\101\0\144\0\144\0\162\0\145\0\163\0\163\0\145\0\163)
+ /Parent 258 0 R
+ /Prev 326 0 R
+ /Next 328 0 R
+ /A 94 0 R
+>> endobj
+328 0 obj
+<<
+ /Title (\376\377\0\111\0\156\0\164\0\145\0\154\0\154\0\145\0\143\0\164\0\165\0\141\0\154\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\171\0\40\0\141\0\156\0\144\0\40\0\103\0\157\0\160\0\171\0\162\0\151\0\147\0\150\0\164\0\40\0\123\0\164\0\141\0\164\0\145\0\155\0\145\0\156\0\164\0\163)
+ /Parent 258 0 R
+ /Prev 327 0 R
+ /Next 329 0 R
+ /A 96 0 R
+>> endobj
+329 0 obj
+<<
+ /Title (\376\377\0\111\0\156\0\144\0\145\0\170)
+ /Parent 258 0 R
+ /Prev 328 0 R
+ /A 98 0 R
+>> endobj
+330 0 obj
+<< /Type /Font
+/Subtype /Type1
+/Name /F5
+/BaseFont /Times-Roman
+/Encoding /WinAnsiEncoding >>
+endobj
+331 0 obj
+<< /Type /Font
+/Subtype /Type1
+/Name /F6
+/BaseFont /Times-Italic
+/Encoding /WinAnsiEncoding >>
+endobj
+332 0 obj
+<< /Type /Font
+/Subtype /Type1
+/Name /F9
+/BaseFont /Courier
+/Encoding /WinAnsiEncoding >>
+endobj
+333 0 obj
+<< /Type /Font
+/Subtype /Type1
+/Name /F7
+/BaseFont /Times-Bold
+/Encoding /WinAnsiEncoding >>
+endobj
+1 0 obj
+<< /Type /Pages
+/Count 34
+/Kids [6 0 R 8 0 R 77 0 R 100 0 R 116 0 R 126 0 R 135 0 R 144 0 R 149 0 R 155 0 R 157 0 R 164 0 R 166 0 R 176 0 R 178 0 R 180 0 R 182 0 R 184 0 R 186 0 R 188 0 R 192 0 R 197 0 R 199 0 R 201 0 R 205 0 R 211 0 R 216 0 R 220 0 R 226 0 R 228 0 R 230 0 R 241 0 R 250 0 R 256 0 R ] >>
+endobj
+2 0 obj
+<< /Type /Catalog
+/Pages 1 0 R
+ /Outlines 258 0 R
+ /PageMode /UseOutlines
+ /Names << /Dests << /Names [ (rfc.status) [ 6 0 R /XYZ 67.0 487.084 null ] (rfc.copyrightnotice) [ 6 0 R /XYZ 67.0 407.95 null ] (rfc.abstract) [ 6 0 R /XYZ 67.0 350.816 null ] (rfc.toc) [ 8 0 R /XYZ 67.0 725.0 null ] (rfc.section.1) [ 100 0 R /XYZ 67.0 725.0 null ] (rfc.section.2) [ 116 0 R /XYZ 67.0 725.0 null ] (rfc.section.3) [ 126 0 R /XYZ 67.0 725.0 null ] (terminology) [ 126 0 R /XYZ 67.0 725.0 null ] (rfc.iref.1) [ 126 0 R /XYZ 67.0 654.866 null ] (rfc.iref.2) [ 126 0 R /XYZ 67.0 606.866 null ] (rfc.iref.3) [ 126 0 R /XYZ 67.0 569.866 null ] (rfc.section.4) [ 135 0 R /XYZ 67.0 725.0 null ] (overview) [ 135 0 R /XYZ 67.0 725.0 null ] (rfc.section.5) [ 144 0 R /XYZ 67.0 725.0 null ] (operations.on.redirect.reference.resources) [ 144 0 R /XYZ 67.0 725.0 null ] (rfc.section.6) [ 149 0 R /XYZ 67.0 725.0 null ] (METHOD_MKREDIRECTREF) [ 149 0 R /XYZ 67.0 725.0 null ] (rfc.iref.6) [ 149 0 R /XYZ 67.0 623.866 null ] (rfc.figure.u.1) [ 149 0 R /XYZ 67.0 594.366 null ] (rfc.iref.7) [ 149 0 R /XYZ 67.0 579.506 null ] (rfc.iref.8) [ 149 0 R /XYZ 67.0 569.646 null ] (rfc.iref.9) [ 149 0 R /XYZ 67.0 549.926 null ] (rfc.iref.10) [ 149 0 R /XYZ 67.0 540.066 null ] (rfc.iref.11) [ 149 0 R /XYZ 67.0 530.206 null ] (rfc.iref.12) [ 149 0 R /XYZ 67.0 520.346 null ] (rfc.iref.13) [ 149 0 R /XYZ 67.0 500.626 null ] (rfc.iref.14) [ 149 0 R /XYZ 67.0 490.766 null ] (rfc.iref.15) [ 149 0 R /XYZ 67.0 480.906 null ] (rfc.iref.16) [ 149 0 R /XYZ 67.0 471.046 null ] (rfc.figure.u.2) [ 149 0 R /XYZ 67.0 327.186 null ] (rfc.iref.17) [ 149 0 R /XYZ 67.0 312.326 null ] (rfc.iref.18) [ 149 0 R /XYZ 67.0 302.466 null ] (rfc.iref.19) [ 149 0 R /XYZ 67.0 270.106 null ] (rfc.iref.20) [ 149 0 R /XYZ 67.0 256.606 null ] (rfc.iref.21) [ 149 0 R /XYZ 67.0 256.606 null ] (rfc.iref.22) [ 149 0 R /XYZ 67.0 240.606 null ] (rfc.iref.23) [ 149 0 R /XYZ 67.0 240.606 null ] (rfc.iref.24) [ 149 0 R /XYZ 67.0 213.606 null ] (rfc.iref.25) [ 149 0 R /XYZ 67.0 213.606 null ] (rfc.iref.26) [ 149 0 R /XYZ 67.0 197.606 null ] (rfc.iref.27) [ 149 0 R /XYZ 67.0 197.606 null ] (rfc.iref.28) [ 149 0 R /XYZ 67.0 170.606 null ] (rfc.iref.29) [ 149 0 R /XYZ 67.0 170.606 null ] (rfc.iref.30) [ 149 0 R /XYZ 67.0 132.606 null ] (rfc.iref.31) [ 149 0 R /XYZ 67.0 132.606 null ] (rfc.iref.32) [ 149 0 R /XYZ 67.0 109.106 null ] (rfc.iref.33) [ 149 0 R /XYZ 67.0 95.606 null ] (rfc.iref.34) [ 149 0 R /XYZ 67.0 95.606 null ] (rfc.section.6.1) [ 155 0 R /XYZ 67.0 692.0 null ] (rfc.figure.u.3) [ 155 0 R /XYZ 67.0 668.028 null ] (rfc.figure.u.4) [ 155 0 R /XYZ 67.0 522.568 null ] (rfc.section.7) [ 157 0 R /XYZ 67.0 725.0 null ] (METHOD_UPDATEREDIRECTREF) [ 157 0 R /XYZ 67.0 725.0 null ] (rfc.iref.37) [ 157 0 R /XYZ 67.0 623.866 null ] (rfc.figure.u.5) [ 157 0 R /XYZ 67.0 594.366 null ] (rfc.figure.u.6) [ 157 0 R /XYZ 67.0 445.506 null ] (rfc.iref.38) [ 157 0 R /XYZ 67.0 430.646 null ] (rfc.iref.39) [ 157 0 R /XYZ 67.0 420.786 null ] (rfc.iref.40) [ 157 0 R /XYZ 67.0 378.566 null ] (rfc.iref.41) [ 157 0 R /XYZ 67.0 365.066 null ] (rfc.iref.42) [ 157 0 R /XYZ 67.0 365.066 null ] (rfc.iref.43) [ 157 0 R /XYZ 67.0 338.066 null ] (rfc.iref.44) [ 157 0 R /XYZ 67.0 338.066 null ] (rfc.iref.45) [ 157 0 R /XYZ 67.0 311.066 null ] (rfc.iref.46) [ 157 0 R /XYZ 67.0 311.066 null ] (rfc.iref.47) [ 157 0 R /XYZ 67.0 295.066 null ] (rfc.iref.48) [ 157 0 R /XYZ 67.0 295.066 null ] (rfc.iref.49) [ 157 0 R /XYZ 67.0 268.066 null ] (rfc.iref.50) [ 157 0 R /XYZ 67.0 268.066 null ] (rfc.iref.51) [ 157 0 R /XYZ 67.0 244.566 null ] (rfc.iref.52) [ 157 0 R /XYZ 67.0 231.066 null ] (rfc.iref.53) [ 157 0 R /XYZ 67.0 231.066 null ] (rfc.section.7.1) [ 157 0 R /XYZ 67.0 189.566 null ] (rfc.figure.u.7) [ 157 0 R /XYZ 67.0 165.594 null ] (rfc.figure.u.8) [ 164 0 R /XYZ 67.0 654.7 null ] (rfc.section.8) [ 166 0 R /XYZ 67.0 725.0 null ] (operations.on.collections.that.contain.redirect.reference.resources) [ 166 0 R /XYZ 67.0 725.0 null ] (rfc.table.u.1) [ 166 0 R /XYZ 67.0 578.866 null ] (rfc.section.8.1) [ 166 0 R /XYZ 67.0 388.056 null ] (rfc.figure.u.9) [ 166 0 R /XYZ 67.0 332.084 null ] (rfc.figure.u.10) [ 166 0 R /XYZ 67.0 281.504 null ] (rfc.figure.u.11) [ 166 0 R /XYZ 67.0 106.464 null ] (rfc.section.8.2) [ 176 0 R /XYZ 67.0 285.76 null ] (rfc.figure.u.12) [ 176 0 R /XYZ 67.0 216.816 null ] (rfc.figure.u.13) [ 176 0 R /XYZ 67.0 166.236 null ] (rfc.figure.u.14) [ 178 0 R /XYZ 67.0 625.12 null ] (rfc.section.9) [ 182 0 R /XYZ 67.0 725.0 null ] (operations.on.targets.of.redirect.reference.resources) [ 182 0 R /XYZ 67.0 725.0 null ] (rfc.section.10) [ 184 0 R /XYZ 67.0 725.0 null ] (rfc.section.10.1) [ 184 0 R /XYZ 67.0 571.866 null ] (rfc.figure.u.15) [ 184 0 R /XYZ 67.0 547.894 null ] (rfc.figure.u.16) [ 184 0 R /XYZ 67.0 372.854 null ] (rfc.section.11) [ 188 0 R /XYZ 67.0 725.0 null ] (redirect.references.to.collections) [ 188 0 R /XYZ 67.0 725.0 null ] (rfc.figure.u.17) [ 188 0 R /XYZ 67.0 503.866 null ] (rfc.section.12) [ 192 0 R /XYZ 67.0 725.0 null ] (headers) [ 192 0 R /XYZ 67.0 725.0 null ] (rfc.section.12.1) [ 192 0 R /XYZ 67.0 690.866 null ] (header.redirect-ref) [ 192 0 R /XYZ 67.0 690.866 null ] (rfc.figure.u.18) [ 192 0 R /XYZ 67.0 666.894 null ] (rfc.section.12.2) [ 192 0 R /XYZ 67.0 578.314 null ] (header.apply-to-redirect-ref) [ 192 0 R /XYZ 67.0 578.314 null ] (rfc.figure.u.19) [ 192 0 R /XYZ 67.0 554.342 null ] (rfc.section.13) [ 197 0 R /XYZ 67.0 725.0 null ] (properties) [ 197 0 R /XYZ 67.0 725.0 null ] (rfc.section.13.1) [ 197 0 R /XYZ 67.0 658.866 null ] (redirect-lifetime.property) [ 197 0 R /XYZ 67.0 658.866 null ] (rfc.figure.u.20) [ 197 0 R /XYZ 67.0 602.894 null ] (rfc.iref.60) [ 197 0 R /XYZ 67.0 578.174 null ] (rfc.iref.61) [ 197 0 R /XYZ 67.0 558.454 null ] (rfc.iref.62) [ 197 0 R /XYZ 67.0 548.594 null ] (rfc.iref.63) [ 197 0 R /XYZ 67.0 528.874 null ] (rfc.iref.64) [ 197 0 R /XYZ 67.0 519.014 null ] (rfc.iref.65) [ 197 0 R /XYZ 67.0 499.294 null ] (rfc.section.13.2) [ 197 0 R /XYZ 67.0 467.434 null ] (reftarget.property) [ 197 0 R /XYZ 67.0 467.434 null ] (rfc.figure.u.21) [ 197 0 R /XYZ 67.0 400.462 null ] (rfc.section.14) [ 199 0 R /XYZ 67.0 725.0 null ] (xml.elements) [ 199 0 R /XYZ 67.0 725.0 null ] (rfc.section.14.1) [ 199 0 R /XYZ 67.0 690.866 null ] (redirectref.xml.element) [ 199 0 R /XYZ 67.0 690.866 null ] (rfc.figure.u.22) [ 199 0 R /XYZ 67.0 597.894 null ] (rfc.section.15) [ 201 0 R /XYZ 67.0 725.0 null ] (extensions.to.response.element) [ 201 0 R /XYZ 67.0 725.0 null ] (rfc.figure.u.23) [ 201 0 R /XYZ 67.0 618.732 null ] (rfc.section.16) [ 205 0 R /XYZ 67.0 725.0 null ] (capability.discovery) [ 205 0 R /XYZ 67.0 725.0 null ] (rfc.section.16.1) [ 205 0 R /XYZ 67.0 571.866 null ] (rfc.figure.u.24) [ 205 0 R /XYZ 67.0 547.894 null ] (rfc.figure.u.25) [ 205 0 R /XYZ 67.0 491.174 null ] (rfc.section.17) [ 211 0 R /XYZ 67.0 725.0 null ] (security.considerations) [ 211 0 R /XYZ 67.0 725.0 null ] (rfc.section.17.1) [ 211 0 R /XYZ 67.0 615.866 null ] (rfc.section.17.2) [ 211 0 R /XYZ 67.0 530.894 null ] (rfc.section.17.3) [ 211 0 R /XYZ 67.0 445.922 null ] (rfc.section.17.4) [ 211 0 R /XYZ 67.0 360.95 null ] (rfc.section.18) [ 216 0 R /XYZ 67.0 725.0 null ] (rfc.section.19) [ 220 0 R /XYZ 67.0 725.0 null ] (iana.considerations) [ 220 0 R /XYZ 67.0 725.0 null ] (rfc.section.19.1) [ 220 0 R /XYZ 67.0 669.866 null ] (rfc.section.19.1.1) [ 220 0 R /XYZ 67.0 618.894 null ] (rfc.section.19.1.2) [ 220 0 R /XYZ 67.0 503.003 null ] (rfc.section.20) [ 226 0 R /XYZ 67.0 725.0 null ] (rfc.section.21) [ 228 0 R /XYZ 67.0 725.0 null ] (rfc.references) [ 230 0 R /XYZ 67.0 725.0 null ] (RFC2119) [ 230 0 R /XYZ 67.0 702.866 null ] (RFC2518) [ 230 0 R /XYZ 67.0 675.866 null ] (RFC2616) [ 230 0 R /XYZ 67.0 648.866 null ] (RFC3253) [ 230 0 R /XYZ 67.0 621.866 null ] (RFC3986) [ 230 0 R /XYZ 67.0 594.866 null ] (rfc.authors) [ 241 0 R /XYZ 67.0 725.0 null ] (rfc.copyright) [ 241 0 R /XYZ 67.0 427.866 null ] (rfc.ipr) [ 250 0 R /XYZ 67.0 725.0 null ] (rfc.index) [ 256 0 R /XYZ 67.0 725.0 null ] ] >> >>
+ >>
+endobj
+3 0 obj
+<<
+/Font << /F5 330 0 R /F6 331 0 R /F9 332 0 R /F7 333 0 R >>
+/ProcSet [ /PDF /ImageC /Text ] >>
+endobj
+11 0 obj
+<<
+/S /GoTo
+/D [100 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+13 0 obj
+<<
+/S /GoTo
+/D [116 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+15 0 obj
+<<
+/S /GoTo
+/D [126 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+17 0 obj
+<<
+/S /GoTo
+/D [135 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+19 0 obj
+<<
+/S /GoTo
+/D [144 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+21 0 obj
+<<
+/S /GoTo
+/D [149 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+23 0 obj
+<<
+/S /GoTo
+/D [155 0 R /XYZ 67.0 692.0 null]
+>>
+endobj
+25 0 obj
+<<
+/S /GoTo
+/D [157 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+27 0 obj
+<<
+/S /GoTo
+/D [157 0 R /XYZ 67.0 189.566 null]
+>>
+endobj
+29 0 obj
+<<
+/S /GoTo
+/D [166 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+31 0 obj
+<<
+/S /GoTo
+/D [166 0 R /XYZ 67.0 388.056 null]
+>>
+endobj
+33 0 obj
+<<
+/S /GoTo
+/D [176 0 R /XYZ 67.0 285.76 null]
+>>
+endobj
+35 0 obj
+<<
+/S /GoTo
+/D [182 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+37 0 obj
+<<
+/S /GoTo
+/D [184 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+39 0 obj
+<<
+/S /GoTo
+/D [184 0 R /XYZ 67.0 571.866 null]
+>>
+endobj
+41 0 obj
+<<
+/S /GoTo
+/D [188 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+43 0 obj
+<<
+/S /GoTo
+/D [192 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+45 0 obj
+<<
+/S /GoTo
+/D [192 0 R /XYZ 67.0 690.866 null]
+>>
+endobj
+47 0 obj
+<<
+/S /GoTo
+/D [192 0 R /XYZ 67.0 578.314 null]
+>>
+endobj
+49 0 obj
+<<
+/S /GoTo
+/D [197 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+51 0 obj
+<<
+/S /GoTo
+/D [197 0 R /XYZ 67.0 658.866 null]
+>>
+endobj
+53 0 obj
+<<
+/S /GoTo
+/D [197 0 R /XYZ 67.0 467.434 null]
+>>
+endobj
+55 0 obj
+<<
+/S /GoTo
+/D [199 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+57 0 obj
+<<
+/S /GoTo
+/D [199 0 R /XYZ 67.0 690.866 null]
+>>
+endobj
+59 0 obj
+<<
+/S /GoTo
+/D [201 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+61 0 obj
+<<
+/S /GoTo
+/D [205 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+63 0 obj
+<<
+/S /GoTo
+/D [205 0 R /XYZ 67.0 571.866 null]
+>>
+endobj
+65 0 obj
+<<
+/S /GoTo
+/D [211 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+67 0 obj
+<<
+/S /GoTo
+/D [211 0 R /XYZ 67.0 615.866 null]
+>>
+endobj
+69 0 obj
+<<
+/S /GoTo
+/D [211 0 R /XYZ 67.0 530.894 null]
+>>
+endobj
+71 0 obj
+<<
+/S /GoTo
+/D [211 0 R /XYZ 67.0 445.922 null]
+>>
+endobj
+73 0 obj
+<<
+/S /GoTo
+/D [211 0 R /XYZ 67.0 360.95 null]
+>>
+endobj
+75 0 obj
+<<
+/S /GoTo
+/D [216 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+80 0 obj
+<<
+/S /GoTo
+/D [220 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+82 0 obj
+<<
+/S /GoTo
+/D [220 0 R /XYZ 67.0 669.866 null]
+>>
+endobj
+84 0 obj
+<<
+/S /GoTo
+/D [220 0 R /XYZ 67.0 618.894 null]
+>>
+endobj
+86 0 obj
+<<
+/S /GoTo
+/D [220 0 R /XYZ 67.0 503.003 null]
+>>
+endobj
+88 0 obj
+<<
+/S /GoTo
+/D [226 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+90 0 obj
+<<
+/S /GoTo
+/D [228 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+92 0 obj
+<<
+/S /GoTo
+/D [230 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+94 0 obj
+<<
+/S /GoTo
+/D [241 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+96 0 obj
+<<
+/S /GoTo
+/D [250 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+98 0 obj
+<<
+/S /GoTo
+/D [256 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+119 0 obj
+<<
+/S /GoTo
+/D [230 0 R /XYZ 67.0 675.866 null]
+>>
+endobj
+121 0 obj
+<<
+/S /GoTo
+/D [230 0 R /XYZ 67.0 648.866 null]
+>>
+endobj
+124 0 obj
+<<
+/S /GoTo
+/D [230 0 R /XYZ 67.0 702.866 null]
+>>
+endobj
+130 0 obj
+<<
+/S /GoTo
+/D [230 0 R /XYZ 67.0 594.866 null]
+>>
+endobj
+133 0 obj
+<<
+/S /GoTo
+/D [230 0 R /XYZ 67.0 621.866 null]
+>>
+endobj
+258 0 obj
+<<
+ /First 260 0 R
+ /Last 329 0 R
+>> endobj
+259 0 obj
+<<
+/S /GoTo
+/D [6 0 R /XYZ 67.0 487.084 null]
+>>
+endobj
+261 0 obj
+<<
+/S /GoTo
+/D [6 0 R /XYZ 67.0 407.95 null]
+>>
+endobj
+263 0 obj
+<<
+/S /GoTo
+/D [6 0 R /XYZ 67.0 350.816 null]
+>>
+endobj
+265 0 obj
+<<
+/S /GoTo
+/D [8 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+269 0 obj
+<<
+/S /GoTo
+/D [126 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+271 0 obj
+<<
+/S /GoTo
+/D [135 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+273 0 obj
+<<
+/S /GoTo
+/D [144 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+275 0 obj
+<<
+/S /GoTo
+/D [149 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+278 0 obj
+<<
+/S /GoTo
+/D [157 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+281 0 obj
+<<
+/S /GoTo
+/D [166 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+285 0 obj
+<<
+/S /GoTo
+/D [182 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+289 0 obj
+<<
+/S /GoTo
+/D [188 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+291 0 obj
+<<
+/S /GoTo
+/D [192 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+293 0 obj
+<<
+/S /GoTo
+/D [192 0 R /XYZ 67.0 690.866 null]
+>>
+endobj
+295 0 obj
+<<
+/S /GoTo
+/D [192 0 R /XYZ 67.0 578.314 null]
+>>
+endobj
+297 0 obj
+<<
+/S /GoTo
+/D [197 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+299 0 obj
+<<
+/S /GoTo
+/D [197 0 R /XYZ 67.0 658.866 null]
+>>
+endobj
+301 0 obj
+<<
+/S /GoTo
+/D [197 0 R /XYZ 67.0 467.434 null]
+>>
+endobj
+303 0 obj
+<<
+/S /GoTo
+/D [199 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+305 0 obj
+<<
+/S /GoTo
+/D [199 0 R /XYZ 67.0 690.866 null]
+>>
+endobj
+307 0 obj
+<<
+/S /GoTo
+/D [201 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+309 0 obj
+<<
+/S /GoTo
+/D [205 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+312 0 obj
+<<
+/S /GoTo
+/D [211 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+319 0 obj
+<<
+/S /GoTo
+/D [220 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+xref
+0 334
+0000000000 65535 f
+0000088634 00000 n
+0000088954 00000 n
+0000097019 00000 n
+0000000015 00000 n
+0000000071 00000 n
+0000001589 00000 n
+0000001695 00000 n
+0000003902 00000 n
+0000004022 00000 n
+0000004272 00000 n
+0000097135 00000 n
+0000004407 00000 n
+0000097200 00000 n
+0000004542 00000 n
+0000097265 00000 n
+0000004676 00000 n
+0000097330 00000 n
+0000004811 00000 n
+0000097395 00000 n
+0000004946 00000 n
+0000097460 00000 n
+0000005081 00000 n
+0000097525 00000 n
+0000005216 00000 n
+0000097590 00000 n
+0000005351 00000 n
+0000097655 00000 n
+0000005486 00000 n
+0000097722 00000 n
+0000005621 00000 n
+0000097787 00000 n
+0000005756 00000 n
+0000097854 00000 n
+0000005891 00000 n
+0000097920 00000 n
+0000006026 00000 n
+0000097985 00000 n
+0000006161 00000 n
+0000098050 00000 n
+0000006296 00000 n
+0000098117 00000 n
+0000006431 00000 n
+0000098182 00000 n
+0000006566 00000 n
+0000098247 00000 n
+0000006701 00000 n
+0000098314 00000 n
+0000006836 00000 n
+0000098381 00000 n
+0000006971 00000 n
+0000098446 00000 n
+0000007106 00000 n
+0000098513 00000 n
+0000007241 00000 n
+0000098580 00000 n
+0000007376 00000 n
+0000098645 00000 n
+0000007511 00000 n
+0000098712 00000 n
+0000007646 00000 n
+0000098777 00000 n
+0000007781 00000 n
+0000098842 00000 n
+0000007915 00000 n
+0000098909 00000 n
+0000008049 00000 n
+0000098974 00000 n
+0000008184 00000 n
+0000099041 00000 n
+0000008319 00000 n
+0000099108 00000 n
+0000008454 00000 n
+0000099175 00000 n
+0000008589 00000 n
+0000099241 00000 n
+0000008722 00000 n
+0000009615 00000 n
+0000009738 00000 n
+0000009828 00000 n
+0000099306 00000 n
+0000009958 00000 n
+0000099371 00000 n
+0000010091 00000 n
+0000099438 00000 n
+0000010225 00000 n
+0000099505 00000 n
+0000010359 00000 n
+0000099572 00000 n
+0000010492 00000 n
+0000099637 00000 n
+0000010625 00000 n
+0000099702 00000 n
+0000010758 00000 n
+0000099767 00000 n
+0000010891 00000 n
+0000099832 00000 n
+0000011024 00000 n
+0000099897 00000 n
+0000011156 00000 n
+0000014121 00000 n
+0000014246 00000 n
+0000014371 00000 n
+0000014509 00000 n
+0000014647 00000 n
+0000014785 00000 n
+0000014921 00000 n
+0000015059 00000 n
+0000015197 00000 n
+0000015335 00000 n
+0000015473 00000 n
+0000015611 00000 n
+0000015749 00000 n
+0000015887 00000 n
+0000016025 00000 n
+0000016163 00000 n
+0000017143 00000 n
+0000017269 00000 n
+0000017322 00000 n
+0000099962 00000 n
+0000017461 00000 n
+0000100030 00000 n
+0000017600 00000 n
+0000017739 00000 n
+0000100098 00000 n
+0000017877 00000 n
+0000019239 00000 n
+0000019365 00000 n
+0000019418 00000 n
+0000019556 00000 n
+0000100166 00000 n
+0000019695 00000 n
+0000019833 00000 n
+0000100234 00000 n
+0000019970 00000 n
+0000021869 00000 n
+0000021995 00000 n
+0000022064 00000 n
+0000022202 00000 n
+0000022340 00000 n
+0000022478 00000 n
+0000022616 00000 n
+0000022754 00000 n
+0000022892 00000 n
+0000024343 00000 n
+0000024469 00000 n
+0000024506 00000 n
+0000024645 00000 n
+0000024784 00000 n
+0000026840 00000 n
+0000026966 00000 n
+0000027011 00000 n
+0000027149 00000 n
+0000027288 00000 n
+0000027427 00000 n
+0000028754 00000 n
+0000028864 00000 n
+0000031001 00000 n
+0000031127 00000 n
+0000031180 00000 n
+0000031319 00000 n
+0000031457 00000 n
+0000031593 00000 n
+0000031731 00000 n
+0000032685 00000 n
+0000032795 00000 n
+0000036069 00000 n
+0000036195 00000 n
+0000036272 00000 n
+0000036411 00000 n
+0000036550 00000 n
+0000036689 00000 n
+0000036828 00000 n
+0000036967 00000 n
+0000037106 00000 n
+0000037245 00000 n
+0000039315 00000 n
+0000039425 00000 n
+0000040839 00000 n
+0000040949 00000 n
+0000041462 00000 n
+0000041572 00000 n
+0000042032 00000 n
+0000042142 00000 n
+0000044132 00000 n
+0000044242 00000 n
+0000045108 00000 n
+0000045218 00000 n
+0000047217 00000 n
+0000047343 00000 n
+0000047372 00000 n
+0000047510 00000 n
+0000048575 00000 n
+0000048701 00000 n
+0000048738 00000 n
+0000048875 00000 n
+0000049012 00000 n
+0000050144 00000 n
+0000050254 00000 n
+0000050883 00000 n
+0000050993 00000 n
+0000051853 00000 n
+0000051979 00000 n
+0000052008 00000 n
+0000052146 00000 n
+0000053881 00000 n
+0000054007 00000 n
+0000054052 00000 n
+0000054191 00000 n
+0000054330 00000 n
+0000054468 00000 n
+0000056710 00000 n
+0000056836 00000 n
+0000056873 00000 n
+0000057011 00000 n
+0000057150 00000 n
+0000057666 00000 n
+0000057792 00000 n
+0000057821 00000 n
+0000057960 00000 n
+0000058878 00000 n
+0000059004 00000 n
+0000059049 00000 n
+0000059187 00000 n
+0000059325 00000 n
+0000059463 00000 n
+0000060021 00000 n
+0000060131 00000 n
+0000061084 00000 n
+0000061194 00000 n
+0000063400 00000 n
+0000063526 00000 n
+0000063611 00000 n
+0000063802 00000 n
+0000063993 00000 n
+0000064183 00000 n
+0000064374 00000 n
+0000064563 00000 n
+0000064753 00000 n
+0000064943 00000 n
+0000065134 00000 n
+0000067015 00000 n
+0000067141 00000 n
+0000067210 00000 n
+0000067386 00000 n
+0000067571 00000 n
+0000067739 00000 n
+0000067907 00000 n
+0000068095 00000 n
+0000068279 00000 n
+0000070365 00000 n
+0000070491 00000 n
+0000070536 00000 n
+0000070713 00000 n
+0000070888 00000 n
+0000071064 00000 n
+0000073541 00000 n
+0000073667 00000 n
+0000100302 00000 n
+0000100356 00000 n
+0000073688 00000 n
+0000100422 00000 n
+0000073885 00000 n
+0000100487 00000 n
+0000074081 00000 n
+0000100553 00000 n
+0000074230 00000 n
+0000074431 00000 n
+0000074618 00000 n
+0000100617 00000 n
+0000074864 00000 n
+0000100683 00000 n
+0000075046 00000 n
+0000100749 00000 n
+0000075398 00000 n
+0000100815 00000 n
+0000075762 00000 n
+0000076039 00000 n
+0000100881 00000 n
+0000076522 00000 n
+0000076823 00000 n
+0000100947 00000 n
+0000077330 00000 n
+0000077883 00000 n
+0000078386 00000 n
+0000101013 00000 n
+0000079046 00000 n
+0000079474 00000 n
+0000079848 00000 n
+0000101079 00000 n
+0000080334 00000 n
+0000101145 00000 n
+0000080656 00000 n
+0000101211 00000 n
+0000080861 00000 n
+0000101279 00000 n
+0000081142 00000 n
+0000101347 00000 n
+0000081469 00000 n
+0000101413 00000 n
+0000081857 00000 n
+0000101481 00000 n
+0000082166 00000 n
+0000101549 00000 n
+0000082428 00000 n
+0000101615 00000 n
+0000082662 00000 n
+0000101683 00000 n
+0000082899 00000 n
+0000101749 00000 n
+0000083424 00000 n
+0000083706 00000 n
+0000101815 00000 n
+0000084170 00000 n
+0000084470 00000 n
+0000084680 00000 n
+0000084893 00000 n
+0000085317 00000 n
+0000085592 00000 n
+0000101881 00000 n
+0000085921 00000 n
+0000086197 00000 n
+0000086410 00000 n
+0000086606 00000 n
+0000086854 00000 n
+0000087046 00000 n
+0000087262 00000 n
+0000087501 00000 n
+0000087707 00000 n
+0000088079 00000 n
+0000088194 00000 n
+0000088305 00000 n
+0000088417 00000 n
+0000088524 00000 n
+trailer
+<<
+/Size 334
+/Root 2 0 R
+/Info 4 0 R
+>>
+startxref
+101947
+%%EOF
diff --git a/vendor/sabre/dav/docs/rfc4790.txt b/vendor/sabre/dav/docs/rfc4790.txt
new file mode 100644
index 000000000..d58191c09
--- /dev/null
+++ b/vendor/sabre/dav/docs/rfc4790.txt
@@ -0,0 +1,1459 @@
+
+
+
+
+
+
+Network Working Group C. Newman
+Request for Comments: 4790 Sun Microsystems
+Category: Standards Track M. Duerst
+ Aoyama Gakuin University
+ A. Gulbrandsen
+ Oryx
+ March 2007
+
+
+ Internet Application Protocol Collation Registry
+
+Status of This Memo
+
+ This document specifies an Internet standards track protocol for the
+ Internet community, and requests discussion and suggestions for
+ improvements. Please refer to the current edition of the "Internet
+ Official Protocol Standards" (STD 1) for the standardization state
+ and status of this protocol. Distribution of this memo is unlimited.
+
+Copyright Notice
+
+ Copyright (C) The IETF Trust (2007).
+
+Abstract
+
+ Many Internet application protocols include string-based lookup,
+ searching, or sorting operations. However, the problem space for
+ searching and sorting international strings is large, not fully
+ explored, and is outside the area of expertise for the Internet
+ Engineering Task Force (IETF). Rather than attempt to solve such a
+ large problem, this specification creates an abstraction framework so
+ that application protocols can precisely identify a comparison
+ function, and the repertoire of comparison functions can be extended
+ in the future.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Newman, et al. Standards Track [Page 1]
+
+RFC 4790 Collation Registry March 2007
+
+
+Table of Contents
+
+ 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 4
+ 1.1. Conventions Used in This Document . . . . . . . . . . . . 4
+ 2. Collation Definition and Purpose . . . . . . . . . . . . . . . 4
+ 2.1. Definition . . . . . . . . . . . . . . . . . . . . . . . . 4
+ 2.2. Purpose . . . . . . . . . . . . . . . . . . . . . . . . . 4
+ 2.3. Some Other Terms Used in this Document . . . . . . . . . . 5
+ 2.4. Sort Keys . . . . . . . . . . . . . . . . . . . . . . . . 5
+ 3. Collation Identifier Syntax . . . . . . . . . . . . . . . . . 6
+ 3.1. Basic Syntax . . . . . . . . . . . . . . . . . . . . . . . 6
+ 3.2. Wildcards . . . . . . . . . . . . . . . . . . . . . . . . 6
+ 3.3. Ordering Direction . . . . . . . . . . . . . . . . . . . . 7
+ 3.4. URIs . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
+ 3.5. Naming Guidelines . . . . . . . . . . . . . . . . . . . . 7
+ 4. Collation Specification Requirements . . . . . . . . . . . . . 8
+ 4.1. Collation/Server Interface . . . . . . . . . . . . . . . . 8
+ 4.2. Operations Supported . . . . . . . . . . . . . . . . . . . 8
+ 4.2.1. Validity . . . . . . . . . . . . . . . . . . . . . . . 9
+ 4.2.2. Equality . . . . . . . . . . . . . . . . . . . . . . . 9
+ 4.2.3. Substring . . . . . . . . . . . . . . . . . . . . . . 9
+ 4.2.4. Ordering . . . . . . . . . . . . . . . . . . . . . . . 10
+ 4.3. Sort Keys . . . . . . . . . . . . . . . . . . . . . . . . 10
+ 4.4. Use of Lookup Tables . . . . . . . . . . . . . . . . . . . 11
+ 5. Application Protocol Requirements . . . . . . . . . . . . . . 11
+ 5.1. Character Encoding . . . . . . . . . . . . . . . . . . . . 11
+ 5.2. Operations . . . . . . . . . . . . . . . . . . . . . . . . 11
+ 5.3. Wildcards . . . . . . . . . . . . . . . . . . . . . . . . 12
+ 5.4. String Comparison . . . . . . . . . . . . . . . . . . . . 12
+ 5.5. Disconnected Clients . . . . . . . . . . . . . . . . . . . 12
+ 5.6. Error Codes . . . . . . . . . . . . . . . . . . . . . . . 13
+ 5.7. Octet Collation . . . . . . . . . . . . . . . . . . . . . 13
+ 6. Use by Existing Protocols . . . . . . . . . . . . . . . . . . 13
+ 7. Collation Registration . . . . . . . . . . . . . . . . . . . . 14
+ 7.1. Collation Registration Procedure . . . . . . . . . . . . . 14
+ 7.2. Collation Registration Format . . . . . . . . . . . . . . 15
+ 7.2.1. Registration Template . . . . . . . . . . . . . . . . 15
+ 7.2.2. The Collation Element . . . . . . . . . . . . . . . . 15
+ 7.2.3. The Identifier Element . . . . . . . . . . . . . . . . 16
+ 7.2.4. The Title Element . . . . . . . . . . . . . . . . . . 16
+ 7.2.5. The Operations Element . . . . . . . . . . . . . . . . 16
+ 7.2.6. The Specification Element . . . . . . . . . . . . . . 16
+ 7.2.7. The Submitter Element . . . . . . . . . . . . . . . . 16
+ 7.2.8. The Owner Element . . . . . . . . . . . . . . . . . . 16
+ 7.2.9. The Version Element . . . . . . . . . . . . . . . . . 17
+ 7.2.10. The Variable Element . . . . . . . . . . . . . . . . . 17
+ 7.3. Structure of Collation Registry . . . . . . . . . . . . . 17
+ 7.4. Example Initial Registry Summary . . . . . . . . . . . . . 18
+
+
+
+Newman, et al. Standards Track [Page 2]
+
+RFC 4790 Collation Registry March 2007
+
+
+ 8. Guidelines for Expert Reviewer . . . . . . . . . . . . . . . . 18
+ 9. Initial Collations . . . . . . . . . . . . . . . . . . . . . . 19
+ 9.1. ASCII Numeric Collation . . . . . . . . . . . . . . . . . 20
+ 9.1.1. ASCII Numeric Collation Description . . . . . . . . . 20
+ 9.1.2. ASCII Numeric Collation Registration . . . . . . . . . 20
+ 9.2. ASCII Casemap Collation . . . . . . . . . . . . . . . . . 21
+ 9.2.1. ASCII Casemap Collation Description . . . . . . . . . 21
+ 9.2.2. ASCII Casemap Collation Registration . . . . . . . . . 22
+ 9.3. Octet Collation . . . . . . . . . . . . . . . . . . . . . 22
+ 9.3.1. Octet Collation Description . . . . . . . . . . . . . 22
+ 9.3.2. Octet Collation Registration . . . . . . . . . . . . . 23
+ 10. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 23
+ 11. Security Considerations . . . . . . . . . . . . . . . . . . . 23
+ 12. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . 23
+ 13. References . . . . . . . . . . . . . . . . . . . . . . . . . . 24
+ 13.1. Normative References . . . . . . . . . . . . . . . . . . . 24
+ 13.2. Informative References . . . . . . . . . . . . . . . . . . 24
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Newman, et al. Standards Track [Page 3]
+
+RFC 4790 Collation Registry March 2007
+
+
+1. Introduction
+
+ The Application Configuration Access Protocol ACAP [11] specification
+ introduced the concept of a comparator (which we call collation in
+ this document), but failed to create an IANA registry. With the
+ introduction of stringprep [6] and the Unicode Collation Algorithm
+ [7], it is now time to create that registry and populate it with some
+ initial values appropriate for an international community. This
+ specification replaces and generalizes the definition of a comparator
+ in ACAP, and creates a collation registry.
+
+1.1. Conventions Used in This Document
+
+ The key words "MUST", "MUST NOT", "SHOULD", "SHOULD NOT", and "MAY"
+ in this document are to be interpreted as defined in "Key words for
+ use in RFCs to Indicate Requirement Levels" [1].
+
+ The attribute syntax specifications use the Augmented Backus-Naur
+ Form (ABNF) [2] notation, including the core rules defined in
+ Appendix A. The ABNF production "Language-tag" is imported from
+ Language Tags [5] and "reg-name" from URI: Generic Syntax [4].
+
+2. Collation Definition and Purpose
+
+2.1. Definition
+
+ A collation is a named function which takes two arbitrary length
+ strings as input and can be used to perform one or more of three
+ basic comparison operations: equality test, substring match, and
+ ordering test.
+
+2.2. Purpose
+
+ Collations are an abstraction for comparison functions so that these
+ comparison functions can be used in multiple protocols. The details
+ of a particular comparison operation can be specified by someone with
+ appropriate expertise, independent of the application protocols that
+ use that collation. This is similar to the way a charset [13]
+ separates the details of octet to character mapping from a protocol
+ specification, such as MIME [9], or the way SASL [10] separates the
+ details of an authentication mechanism from a protocol specification,
+ such as ACAP [11].
+
+
+
+
+
+
+
+
+
+Newman, et al. Standards Track [Page 4]
+
+RFC 4790 Collation Registry March 2007
+
+
+ Here is a small diagram to help illustrate the value of this
+ abstraction:
+
+ +-------------------+ +-----------------+
+ | IMAP i18n SEARCH |--+ | Basic |
+ +-------------------+ | +--| Collation Spec |
+ | | +-----------------+
+ +-------------------+ | +-------------+ | +-----------------+
+ | ACAP i18n SEARCH |--+--| Collation |--+--| A stringprep |
+ +-------------------+ | | Registry | | | Collation Spec |
+ | +-------------+ | +-----------------+
+ +-------------------+ | | +-----------------+
+ | ...other protocol |--+ | | locale-specific |
+ +-------------------+ +--| Collation Spec |
+ +-----------------+
+
+ Thus IMAP, ACAP, and future application protocols with international
+ search capability simply specify how to interface to the collation
+ registry instead of each protocol specification having to specify all
+ the collations it supports.
+
+2.3. Some Other Terms Used in this Document
+
+ The terms client, server, and protocol are used in somewhat unusual
+ senses.
+
+ Client means a user, or a program acting directly on behalf of a
+ user. This may be a mail reader acting as an IMAP client, or it may
+ be an interactive shell, where the user can type protocol commands/
+ requests directly, or it may be a script or program written by the
+ user.
+
+ Server means a program that performs services requested by the
+ client. This may be a traditional server such as an HTTP server, or
+ it may be a Sieve [14] interpreter running a Sieve script written by
+ a user. A server needs to use the operations provided by collations
+ in order to fulfill the client's requests.
+
+ The protocol describes how the client tells the server what it wants
+ done, and (if applicable) how the server tells the client about the
+ results. IMAP is a protocol by this definition, and so is the Sieve
+ language.
+
+2.4. Sort Keys
+
+ One component of a collation is a transformation, which turns a
+ string into a sort key, which is then used while sorting.
+
+
+
+
+Newman, et al. Standards Track [Page 5]
+
+RFC 4790 Collation Registry March 2007
+
+
+ The transformation can range from an identity mapping (e.g., the
+ i;octet collation Section 9.3) to a mapping that makes the string
+ unreadable to a human.
+
+ This is an implementation detail of collations or servers. A
+ protocol SHOULD NOT expose it to clients, since some collations leave
+ the sort key's format up to the implementation, and current
+ conformant implementations are known to use different formats.
+
+3. Collation Identifier Syntax
+
+3.1. Basic Syntax
+
+ The collation identifier itself is a single US-ASCII string. The
+ identifier MUST NOT be longer than 254 characters, and obeys the
+ following grammar:
+
+ collation-char = ALPHA / DIGIT / "-" / ";" / "=" / "."
+
+ collation-id = collation-prefix ";" collation-core-name
+ *collation-arg
+
+ collation-scope = Language-tag / "vnd-" reg-name
+
+ collation-core-name = ALPHA *( ALPHA / DIGIT / "-" )
+
+ collation-arg = ";" ALPHA *( ALPHA / DIGIT ) "="
+ 1*( ALPHA / DIGIT / "." )
+
+
+ Note: the ABNF production "Language-tag" is imported from Language
+ Tags [5] and "reg-name" from URI: Generic Syntax [4].
+
+ There is a special identifier called "default". For protocols that
+ have a default collation, "default" refers to that collation. For
+ other protocols, the identifier "default" MUST match no collations,
+ and servers SHOULD treat it in the same way as they treat nonexistent
+ collations.
+
+3.2. Wildcards
+
+ The string a client uses to select a collation MAY contain one or
+ more wildcard ("*") characters that match zero or more collation-
+ chars. Wildcard characters MUST NOT be adjacent. If the wildcard
+ string matches multiple collations, the server SHOULD attempt to
+ select a widely useful collation in preference to a narrowly useful
+ one.
+
+
+
+
+Newman, et al. Standards Track [Page 6]
+
+RFC 4790 Collation Registry March 2007
+
+
+ collation-wild = ("*" / (ALPHA ["*"])) *(collation-char ["*"])
+ ; MUST NOT exceed 254 characters total
+
+3.3. Ordering Direction
+
+ When used as a protocol element for ordering, the collation
+ identifier MAY be prefixed by either "+" or "-" to explicitly specify
+ an ordering direction. "+" has no effect on the ordering operation,
+ while "-" inverts the result of the ordering operation. In general,
+ collation-order is used when a client requests a collation, and
+ collation-selected is used when the server informs the client of the
+ selected collation.
+
+ collation-selected = ["+" / "-"] collation-id
+
+ collation-order = ["+" / "-"] collation-wild
+
+3.4. URIs
+
+ Some protocols are designed to use URIs [4] to refer to collations
+ rather than simple tokens. A special section of the IANA URL space
+ is reserved for such usage. The "collation-uri" form is used to
+ refer to a specific named collation (the collation registration may
+ not actually be present). The "collation-auri" form is an abstract
+ name for an ordering, a collation pattern or a vendor private
+ collator.
+
+ collation-uri = "http://www.iana.org/assignments/collation/"
+ collation-id ".xml"
+
+ collation-auri = ( "http://www.iana.org/assignments/collation/"
+ collation-order ".xml" ) / other-uri
+
+ other-uri = <absoluteURI>
+ ; excluding the IANA collation namespace.
+
+3.5. Naming Guidelines
+
+ While this specification makes no absolute requirements on the
+ structure of collation identifiers, naming consistency is important,
+ so the following initial guidelines are provided.
+
+ Collation identifiers with an international audience typically begin
+ with "i;". Collation identifiers intended for a particular language
+ or locale typically begin with a language tag [5] followed by a ";".
+ After the first ";" is normally the name of the general collation
+ algorithm, followed by a series of algorithm modifications separated
+ by the ";" delimiter. Parameterized modifications will use "=" to
+
+
+
+Newman, et al. Standards Track [Page 7]
+
+RFC 4790 Collation Registry March 2007
+
+
+ delimit the parameter from the value. The version numbers of any
+ lookup tables used by the algorithm SHOULD be present as
+ parameterized modifications.
+
+ Collation identifiers of the form *;vnd-hostname;* are reserved for
+ vendor-specific collations created by the owner of the hostname
+ following the "vnd-" prefix (e.g., vnd-example.com for the vendor
+ example.com). Registration of such collations (or the name space as
+ a whole), with intended use of the "Vendor", is encouraged when a
+ public specification or open-source implementation is available, but
+ is not required.
+
+4. Collation Specification Requirements
+
+4.1. Collation/Server Interface
+
+ The collation itself defines what it operates on. Most collations
+ are expected to operate on character strings. The i;octet
+ (Section 9.3) collation operates on octet strings. The i;ascii-
+ numeric (Section 9.1) operation operates on numbers.
+
+ This specification defines the collation interface in terms of octet
+ strings. However, implementations may choose to use character
+ strings instead. Such implementations may not be able to implement
+ e.g., i;octet. Since i;octet is not currently mandatory to implement
+ for any protocol, this should not be a problem.
+
+4.2. Operations Supported
+
+ A collation specification MUST state which of the three basic
+ operations are supported (equality, substring, ordering) and how to
+ perform each of the supported operations on any two input character
+ strings, including empty strings. Collations must be deterministic,
+ i.e., given a collation with a specific identifier, and any two fixed
+ input strings, the result MUST be the same for the same operation.
+
+ In general, collation operations should behave as their names
+ suggest. While a collation may be new, the operations are not, so
+ the new collation's operations should be similar to those of older
+ collations. For example, a date/time collation should not provide a
+ "substring" operation that would morph IMAP substring SEARCH into
+ e.g., a date-range search.
+
+ A non-obvious consequence of the rules for each collation operation
+ is that, for any single collation, either none or all of the
+ operations can return "undefined". For example, it is not possible
+ to have an equality operation that never returns "undefined", and a
+ substring operation that occasionally does.
+
+
+
+Newman, et al. Standards Track [Page 8]
+
+RFC 4790 Collation Registry March 2007
+
+
+4.2.1. Validity
+
+ The validity test takes one string as argument. It returns valid if
+ its input string is a valid input to the collation's other
+ operations, and invalid if not. (In other words, a string is valid
+ if it is equal to itself according to the collation's equality
+ operation.)
+
+ The validity test is provided by all collations. It MUST NOT be
+ listed separately in the collation registration.
+
+4.2.2. Equality
+
+ The equality test always returns "match" or "no-match" when it is
+ supplied valid input, and MAY return "undefined" if one or both input
+ strings are not valid.
+
+ The equality test MUST be reflexive and symmetric. For valid input,
+ it MUST be transitive.
+
+ If a collation provides either a substring or an ordering test, it
+ MUST also provide an equality test. The substring and/or ordering
+ tests MUST be consistent with the equality test.
+
+ The return values of the equality test are called "match", "no-match"
+ and "undefined" in this document.
+
+4.2.3. Substring
+
+ The substring matching operation determines if the first string is a
+ substring of the second string, i.e., if one or more substrings of
+ the second string is equal to the first, as defined by the
+ collation's equality operation.
+
+ A collation that supports substring matching will automatically
+ support two special cases of substring matching: prefix and suffix
+ matching, if those special cases are supported by the application
+ protocol. It returns "match" or "no-match" when it is supplied valid
+ input and returns "undefined" when supplied invalid input.
+
+ Application protocols MAY return position information for substring
+ matches. If this is done, the position information SHOULD include
+ both the starting offset and the ending offset for each match. This
+ is important because more sophisticated collations can match strings
+ of unequal length (for example, a pre-composed accented character can
+ match a decomposed accented character). In general, overlapping
+ matches SHOULD be reported (as when "ana" occurs twice within
+ "banana"), although there are cases where a collation may decide not
+
+
+
+Newman, et al. Standards Track [Page 9]
+
+RFC 4790 Collation Registry March 2007
+
+
+ to. For example, in a collation which treats all whitespace
+ sequences as identical, the substring operation could be defined such
+ that " 1 " (SP "1" SP) is reported just once within " 1 " (SP SP
+ "1" SP SP), not four times (SP SP "1" SP, SP "1" SP, SP "1" SP SP and
+ SP SP "1" SP SP), since the four matches are, in a sense, the same
+ match.
+
+ A string is a substring of itself. The empty string is a substring
+ of all strings.
+
+ Note that the substring operation of some collations can match
+ strings of unequal length. For example, a pre-composed accented
+ character can match a decomposed accented character. The Unicode
+ Collation Algorithm [7] discusses this in more detail.
+
+ The return values of the substring operation are called "match", "no-
+ match", and "undefined" in this document.
+
+4.2.4. Ordering
+
+ The ordering operation determines how two strings are ordered. It
+ MUST be reflexive. For valid input, it MUST be transitive and
+ trichotomous.
+
+ Ordering returns "less" if the first string is listed before the
+ second string, according to the collation; "greater", if the second
+ string is listed before the first string; and "equal", if the two
+ strings are equal, as defined by the collation's equality operation.
+ If one or both strings are invalid, the result of ordering is
+ "undefined".
+
+ When the collation is used with a "+" prefix, the behavior is the
+ same as when used with no prefix. When the collation is used with a
+ "-" prefix, the result of the ordering operation of the collation
+ MUST be reversed.
+
+ The return values of the ordering operation are called "less",
+ "equal", "greater", and "undefined" in this document.
+
+4.3. Sort Keys
+
+ A collation specification SHOULD describe the internal transformation
+ algorithm to generate sort keys. This algorithm can be applied to
+ individual strings, and the result can be stored to potentially
+ optimize future comparison operations. A collation MAY specify that
+ the sort key is generated by the identity function. The sort key may
+ have no meaning to a human. The sort key may not be valid input to
+ the collation.
+
+
+
+Newman, et al. Standards Track [Page 10]
+
+RFC 4790 Collation Registry March 2007
+
+
+4.4. Use of Lookup Tables
+
+ Some collations use customizable lookup tables, e.g., because the
+ tables depend on locale, and may be modified after shipping the
+ software. Collations that use more than one customizable lookup
+ table in a documented format MUST assign numbers to the tables they
+ use. This permits an application protocol command to access the
+ tables used by a server collation, so that clients and servers use
+ the same tables.
+
+5. Application Protocol Requirements
+
+ This section describes the requirements and issues that an
+ application protocol needs to consider if it offers searching,
+ substring matching and/or sorting, and permits the use of characters
+ outside the US-ASCII charset.
+
+5.1. Character Encoding
+
+ The protocol specification has to make sure that it is clear on which
+ characters (rather than just octets) the collations are used. This
+ can be done by specifying the protocol itself in terms of characters
+ (e.g., in the case of a query language), by specifying a single
+ character encoding for the protocol (e.g., UTF-8 [3]), or by
+ carefully describing the relevant issues of character encoding
+ labeling and conversion. In the later case, details to consider
+ include how to handle unknown charsets, any charsets that are
+ mandatory-to-implement, any issues with byte-order that might apply,
+ and any transfer encodings that need to be supported.
+
+5.2. Operations
+
+ The protocol must specify which of the operations defined in this
+ specification (equality matching, substring matching, and ordering)
+ can be invoked in the protocol, and how they are invoked. There may
+ be more than one way to invoke an operation.
+
+ The protocol MUST provide a mechanism for the client to select the
+ collation to use with equality matching, substring matching, and
+ ordering.
+
+ If a protocol needs a total ordering and the collation chosen does
+ not provide it because the ordering operation returns "undefined" at
+ least once, the recommended fallback is to sort all invalid strings
+ after the valid ones, and use i;octet to order the invalid strings.
+
+ Although the collation's substring function provides a list of
+ matches, a protocol need not provide all that to the client. It may
+
+
+
+Newman, et al. Standards Track [Page 11]
+
+RFC 4790 Collation Registry March 2007
+
+
+ provide only the first matching substring, or even just the
+ information that the substring search matched. In this way,
+ collations can be used with protocols that are defined such that "x
+ is a substring of y" returns true-false.
+
+ If the protocol provides positional information for the results of a
+ substring match, that positional information SHOULD fully specify the
+ substring(s) in the result that matches, independent of the length of
+ the search string. For example, returning both the starting and
+ ending offset of the match would suffice, as would the starting
+ offset and a length. Returning just the starting offset is not
+ acceptable. This rule is necessary because advanced collations can
+ treat strings of different lengths as equal (for example, pre-
+ composed and decomposed accented characters).
+
+5.3. Wildcards
+
+ The protocol MUST specify whether it allows the use of wildcards in
+ collation identifiers. If the protocol allows wildcards, then:
+ The protocol MUST specify how comparisons behave in the absence of
+ explicit collation negotiation, or when a collation of "default"
+ is requested. The protocol MAY specify that the default collation
+ used in such circumstances is sensitive to server configuration.
+
+ The protocol SHOULD provide a way to list available collations
+ matching a given wildcard pattern, or patterns.
+
+5.4. String Comparison
+
+ If a protocol compares strings in any nontrivial way, using a
+ collation may be appropriate. As an example, many protocols use
+ case-independent strings. In many cases, a simple ASCII mapping to
+ upper/lower case works well. In other cases, it may be better to use
+ a specifiable collation; for example, so that a server can treat "i"
+ and "I" as equivalent in Italy, and different in Turkey (Turkish also
+ has a dotted upper-case" I" and a dotless lower-case "i").
+
+ Protocol designers should consider, in each case, whether to use a
+ specifiable collation. Keywords often have other needs than user
+ variables, and search arguments may be different again.
+
+5.5. Disconnected Clients
+
+ If the protocol supports disconnected clients, and a collation is
+ used that can use configurable tables (e.g., to support
+ locale-specific extensions), then the client may not be able to
+ reproduce the server's collation operations while offline.
+
+
+
+
+Newman, et al. Standards Track [Page 12]
+
+RFC 4790 Collation Registry March 2007
+
+
+ A mechanism to download such tables has been discussed. Such a
+ mechanism is not included in the present specification, since the
+ problem is not yet well understood.
+
+5.6. Error Codes
+
+ The protocol specification should consider assigning protocol error
+ codes for the following circumstances:
+
+ o The client requests the use of a collation by identifier or
+ pattern, but no implemented collation matches that pattern.
+
+ o The client attempts to use a collation for an operation that is
+ not supported by that collation -- for example, attempting to use
+ the "i;ascii-numeric" collation for substring matching.
+
+ o The client uses an equality or substring matching collation, and
+ the result is an error. It may be appropriate to distinguish
+ between the two input strings, particularly when one is supplied
+ by the client and the other is stored by the server. It might
+ also be appropriate to distinguish the specific case of an invalid
+ UTF-8 string.
+
+5.7. Octet Collation
+
+ The i;octet (Section 9.3) collation is only usable with protocols
+ based on octet-strings. Clients and servers MUST NOT use i;octet
+ with other protocols.
+
+ If the protocol permits the use of collations with data structures
+ other than strings, the protocol MUST describe the default behavior
+ for a collation with those data structures.
+
+6. Use by Existing Protocols
+
+ This section is informative.
+
+ Both ACAP [11] and Sieve [14] are standards track specifications that
+ used collations prior to the creation of this specification and
+ registry. Those standards do not meet all the application protocol
+ requirements described in Section 5.
+
+ These protocols allow the use of the i;octet (Section 9.3) collation
+ working directly on UTF-8 data, as used in these protocols.
+
+
+
+
+
+
+
+Newman, et al. Standards Track [Page 13]
+
+RFC 4790 Collation Registry March 2007
+
+
+ In Sieve, all matches are either true or false. Accordingly, Sieve
+ servers must treat "undefined" and "no-match" results of the equality
+ and substring operations as false, and only "match" as true.
+
+ In ACAP and Sieve, there are no invalid strings. In this document's
+ terms, invalid strings sort after valid strings.
+
+ IMAP [15] also collates, although that is explicit only when the
+ COMPARATOR [17] extension is used. The built-in IMAP substring
+ operation and the ordering provided by the SORT [16] extension may
+ not meet the requirements made in this document.
+
+ Other protocols may be in a similar position.
+
+ In IMAP, the default collation is i;ascii-casemap, because its
+ operations are understood to match IMAP's built-in operations.
+
+7. Collation Registration
+
+7.1. Collation Registration Procedure
+
+ The IETF will create a mailing list, collation@ietf.org, which can be
+ used for public discussion of collation proposals prior to
+ registration. Use of the mailing list is strongly encouraged. The
+ IESG will appoint a designated expert who will monitor the
+ collation@ietf.org mailing list and review registrations.
+
+ The registration procedure begins when a completed registration
+ template is sent to iana@iana.org and collation@ietf.org. The
+ designated expert is expected to tell IANA and the submitter of the
+ registration within two weeks whether the registration is approved,
+ approved with minor changes, or rejected with cause. When a
+ registration is rejected with cause, it can be re-submitted if the
+ concerns listed in the cause are addressed. Decisions made by the
+ designated expert can be appealed to the IESG Applications Area
+ Director, then to the IESG. They follow the normal appeals procedure
+ for IESG decisions.
+
+ Collation registrations in a standards track, BCP, or IESG-approved
+ experimental RFC are owned by the IETF, and changes to the
+ registration follow normal procedures for updating such documents.
+ Collation registrations in other RFCs are owned by the RFC author(s).
+ Other collation registrations are owned by the individual(s) listed
+ in the contact field of the registration, and IANA will preserve this
+ information.
+
+ If the registration is a change of an existing collation, it MUST be
+ approved by the owner. In the event the owner cannot be contacted
+
+
+
+Newman, et al. Standards Track [Page 14]
+
+RFC 4790 Collation Registry March 2007
+
+
+ for a period of one month, and the designated expert deems the change
+ necessary, the IESG MAY re-assign ownership to an appropriate party.
+
+7.2. Collation Registration Format
+
+ Registration of a collation is done by sending a well-formed XML
+ document to collation@ietf.org and iana@iana.org.
+
+7.2.1. Registration Template
+
+ Here is a template for the registration:
+
+ <?xml version='1.0'?>
+ <!DOCTYPE collation SYSTEM 'collationreg.dtd'>
+ <collation rfc="YYYY" scope="global" intendedUse="common">
+ <identifier>collation identifier</identifier>
+ <title>technical title for collation</title>
+ <operations>equality order substring</operations>
+ <specification>specification reference</specification>
+ <owner>email address of owner or IETF</owner>
+ <submitter>email address of submitter</submitter>
+ <version>1</version>
+ </collation>
+
+7.2.2. The Collation Element
+
+ The root of the registration document MUST be a <collation> element.
+ The collation element contains the other elements in the
+ registration, which are described in the following sub-subsections,
+ in the order given here.
+
+ The <collation> element MAY include an "rfc=" attribute if the
+ specification is in an RFC. The "rfc=" attribute gives only the
+ number of the RFC, without any prefix, such as "RFC", or suffix, such
+ as ".txt".
+
+ The <collation> element MUST include a "scope=" attribute, which MUST
+ have one of the values "global", "local", or "other".
+
+ The <collation> element MUST include an "intendedUse=" attribute,
+ which must have one of the values "common", "limited", "vendor", or
+ "deprecated". Collation specifications intended for "common" use are
+ expected to reference standards from standards bodies with
+ significant experience dealing with the details of international
+ character sets.
+
+ Be aware that future revisions of this specification may add
+ additional function types, as well as additional XML attributes,
+
+
+
+Newman, et al. Standards Track [Page 15]
+
+RFC 4790 Collation Registry March 2007
+
+
+ values, and elements. Any system that automatically parses these XML
+ documents MUST take this into account to preserve future
+ compatibility.
+
+7.2.3. The Identifier Element
+
+ The <identifier> element gives the precise identifier of the
+ collation, e.g., i;ascii-casemap. The <identifier> element is
+ mandatory.
+
+7.2.4. The Title Element
+
+ The <title> element gives the title of the collation. The <title>
+ element is mandatory.
+
+7.2.5. The Operations Element
+
+ The <operations> element lists which of the three operations
+ ("equality", "order" or "substring") the collation provides,
+ separated by single spaces. The <operations> element is mandatory.
+
+7.2.6. The Specification Element
+
+ The <specification> element describes where to find the
+ specification. The <specification> element is mandatory. It MAY
+ have a URI attribute. There may be more than one <specification>
+ element, in which case, they together form the specification.
+
+ If it is discovered that parts of a collation specification conflict,
+ a new revision of the collation is necessary, and the
+ collation@ietf.org mailing list should be notified.
+
+7.2.7. The Submitter Element
+
+ The <submitter> element provides an RFC 2822 [12] email address for
+ the person who submitted the registration. It is optional if the
+ <owner> element contains an email address.
+
+ There may be more than one <submitter> element.
+
+7.2.8. The Owner Element
+
+ The <owner> element contains either the four letters "IETF" or an
+ email address of the owner of the registration. The <owner> element
+ is mandatory. There may be more than one <owner> element. If so,
+ all owners are equal. Each owner can speak for all.
+
+
+
+
+
+Newman, et al. Standards Track [Page 16]
+
+RFC 4790 Collation Registry March 2007
+
+
+7.2.9. The Version Element
+
+ The <version> element MUST be included when the registration is
+ likely to be revised, or has been revised in such a way that the
+ results change for one or more input strings. The <version> element
+ is optional.
+
+7.2.10. The Variable Element
+
+ The <variable> element specifies an optional variable to control the
+ collation's behaviour, for example whether it is case sensitive. The
+ <variable> element is optional. When <variable> is used, it must
+ contain <name> and <default> elements, and it may contain one or more
+ <value> elements.
+
+7.2.10.1. The Name Element
+
+ The <name> element specifies the name value of a variable. The
+ <name> element is mandatory.
+
+7.2.10.2. The Default Element
+
+ The <default> element specifies the default value of a variable. The
+ <default> element is mandatory.
+
+7.2.10.3. The Value Element
+
+ The <value> element specifies a legal value of a variable. The
+ <value> element is optional. If one or more <value> elements are
+ present, only those values are legal. If none are, then the
+ variable's legal values do not form an enumerated set, and the rules
+ MUST be specified in an RFC accompanying the registration.
+
+7.3. Structure of Collation Registry
+
+ Once the registration is approved, IANA will store each XML
+ registration document in a URL of the form
+ http://www.iana.org/assignments/collation/collation-id.xml, where
+ collation-id is the content of the identifier element in the
+ registration. Both the submitter and the designated expert are
+ responsible for verifying that the XML is well-formed. The
+ registration document should avoid using new elements. If any are
+ necessary, it is important to be consistent with other registrations.
+
+ IANA will also maintain a text summary of the registry under the name
+ http://www.iana.org/assignments/collation/collation-index.html. This
+ summary is divided into four sections. The first section is for
+ collations intended for common use. This section is intended for
+
+
+
+Newman, et al. Standards Track [Page 17]
+
+RFC 4790 Collation Registry March 2007
+
+
+ collation registrations published in IESG-approved RFCs, or for
+ locally scoped collations from the primary standards body for that
+ locale. The designated expert is encouraged to reject collation
+ registrations with an intended use of "common" if the expert believes
+ it should be "limited", as it is desirable to keep the number of
+ "common" registrations small and of high quality. The second section
+ is reserved for limited-use collations. The third section is
+ reserved for registered vendor-specific collations. The final
+ section is reserved for deprecated collations.
+
+7.4. Example Initial Registry Summary
+
+ The following is an example of how IANA might structure the initial
+ registry summary.html file:
+
+ Collation Functions Scope Reference
+ --------- --------- ----- ---------
+ Common Use Collations:
+ i;ascii-casemap e, o, s Local [RFC 4790]
+
+ Limited Use Collations:
+ i;octet e, o, s Other [RFC 4790]
+ i;ascii-numeric e, o Other [RFC 4790]
+
+ Vendor Collations:
+
+ Deprecated Collations:
+
+
+ References
+ ----------
+ [RFC 4790] Newman, C., Duerst, M., Gulbrandsen, A., "Internet
+ Application Protocol Collation Registry", RFC 4790,
+ Sun Microsystems, March 2007.
+
+8. Guidelines for Expert Reviewer
+
+ The expert reviewer appointed by the IESG has fairly broad latitude
+ for this registry. While a number of collations are expected
+ (particularly customizations of the UCA for localized use), an
+ explosion of collations (particularly common-use collations) is not
+ desirable for widespread interoperability. However, it is important
+ for the expert reviewer to provide cause when rejecting a
+ registration, and, when possible, to describe corrective action to
+
+
+
+
+
+
+
+Newman, et al. Standards Track [Page 18]
+
+RFC 4790 Collation Registry March 2007
+
+
+ permit the registration to proceed. The following table includes
+ some example reasons to reject a registration with cause:
+
+ o The registration is not a well-formed XML document.
+
+ o The registration has an intended use of "common", but there is no
+ evidence the collation will be widely deployed, so it should be
+ listed as "limited".
+
+ o The registration has an intended use of "common", but it is
+ redundant with the functionality of a previously registered
+ "common" collation.
+
+ o The registration has an intended use of "common", but the
+ specification is not detailed enough to allow interoperable
+ implementations by others.
+
+ o The collation identifier fails to precisely identify the version
+ numbers of relevant tables to use.
+
+ o The registration fails to meet one of the "MUST" requirements in
+ Section 4.
+
+ o The collation identifier fails to meet the syntax in Section 3.
+
+ o The collation specification referenced in the registration is
+ vague or has optional features without a clear behavior specified.
+
+ o The referenced specification does not adequately address security
+ considerations specific to that collation.
+
+ o The registration's operations are needlessly different from those
+ of traditional operations.
+
+ o The registration's XML is needlessly different from that of
+ already registered collations.
+
+9. Initial Collations
+
+ This section registers the three collations that were originally
+ defined in [11], and are implemented in most [14] engines. Some of
+ the behavior of these collations is perhaps not ideal, such as
+ i;ascii-casemap accepting non-ASCII input. Compatibility with widely
+ deployed code was judged more important than fixing the collations.
+ Some of the aspects of these collations are necessary to maintain
+ compatibility with widely deployed code.
+
+
+
+
+
+Newman, et al. Standards Track [Page 19]
+
+RFC 4790 Collation Registry March 2007
+
+
+9.1. ASCII Numeric Collation
+
+9.1.1. ASCII Numeric Collation Description
+
+ The "i;ascii-numeric" collation is a simple collation intended for
+ use with arbitrarily-sized, unsigned decimal integer numbers stored
+ as octet strings. US-ASCII digits (0x30 to 0x39) represent digits of
+ the numbers. Before converting from string to integer, the input
+ string is truncated at the first non-digit character. All input is
+ valid; strings that do not start with a digit represent positive
+ infinity.
+
+ The collation supports equality and ordering, but does not support
+ the substring operation.
+
+ The equality operation returns "match" if the two strings represent
+ the same number (i.e., leading zeroes and trailing non-digits are
+ disregarded), and "no-match" if the two strings represent different
+ numbers.
+
+ The ordering operation returns "less" if the first string represents
+ a smaller number than the second, "equal" if they represent the same
+ number, and "greater" if the first string represents a larger number
+ than the second.
+
+ Some examples: "0" is less than "1", and "1" is less than
+ "4294967298". "4294967298", "04294967298", and "4294967298b" are all
+ equal. "04294967298" is less than "". "", "x", and "y" are equal.
+
+9.1.2. ASCII Numeric Collation Registration
+
+ <?xml version='1.0'?>
+ <!DOCTYPE collation SYSTEM 'collationreg.dtd'>
+ <collation rfc="4790" scope="other" intendedUse="limited">
+ <identifier>i;ascii-numeric</identifier>
+ <title>ASCII Numeric</title>
+ <operations>equality order</operations>
+ <specification>RFC 4790</specification>
+ <owner>IETF</owner>
+ <submitter>chris.newman@sun.com</submitter>
+ </collation>
+
+
+
+
+
+
+
+
+
+
+Newman, et al. Standards Track [Page 20]
+
+RFC 4790 Collation Registry March 2007
+
+
+9.2. ASCII Casemap Collation
+
+9.2.1. ASCII Casemap Collation Description
+
+ The "i;ascii-casemap" collation is a simple collation that operates
+ on octet strings and treats US-ASCII letters case-insensitively. It
+ provides equality, substring, and ordering operations. All input is
+ valid. Note that letters outside ASCII are not treated case-
+ insensitively.
+
+ Its equality, ordering, and substring operations are as for i;octet,
+ except that at first, the lower-case letters (octet values 97-122) in
+ each input string are changed to upper case (octet values 65-90).
+
+ Care should be taken when using OS-supplied functions to implement
+ this collation, as it is not locale sensitive. Functions, such as
+ strcasecmp and toupper, are sometimes locale sensitive, and may
+ inappropriately map lower-case letters other than a-z to upper case.
+
+ The i;ascii-casemap collation is well-suited for use with many
+ Internet protocols and computer languages. Use with natural language
+ is often inappropriate; even though the collation apparently supports
+ languages such as Swahili and English, in real-world use, it tends to
+ mis-sort a number of types of string:
+
+ o people and place names containing non-ASCII,
+
+ o words such as "naive" (if spelled with an accent, the accented
+ character could push the word to the wrong spot in a sorted list),
+
+ o names such as "Lloyd" (which, in Welsh, sorts after "Lyon", unlike
+ in English),
+
+ o strings containing euro and pound sterling symbols, quotation
+ marks other than '"', dashes/hyphens, etc.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Newman, et al. Standards Track [Page 21]
+
+RFC 4790 Collation Registry March 2007
+
+
+9.2.2. ASCII Casemap Collation Registration
+
+ <?xml version='1.0'?>
+ <!DOCTYPE collation SYSTEM 'collationreg.dtd'>
+ <collation rfc="4790" scope="local" intendedUse="common">
+ <identifier>i;ascii-casemap</identifier>
+ <title>ASCII Casemap</title>
+ <operations>equality order substring</operations>
+ <specification>RFC 4790</specification>
+ <owner>IETF</owner>
+ <submitter>chris.newman@sun.com</submitter>
+ </collation>
+
+9.3. Octet Collation
+
+9.3.1. Octet Collation Description
+
+ The "i;octet" collation is a simple and fast collation intended for
+ use on binary octet strings rather than on character data. Protocols
+ that want to make this collation available have to do so by
+ explicitly allowing it. If not explicitly allowed, it MUST NOT be
+ used. It never returns an "undefined" result. It provides equality,
+ substring, and ordering operations.
+
+ The ordering algorithm is as follows:
+
+ 1. If both strings are the empty string, return the result "equal".
+
+ 2. If the first string is empty and the second is not, return the
+ result "less".
+
+ 3. If the second string is empty and the first is not, return the
+ result "greater".
+
+ 4. If both strings begin with the same octet value, remove the first
+ octet from both strings and repeat this algorithm from step 1.
+
+ 5. If the unsigned value (0 to 255) of the first octet of the first
+ string is less than the unsigned value of the first octet of the
+ second string, then return "less".
+
+ 6. If this step is reached, return "greater".
+
+ This algorithm is roughly equivalent to the C library function
+ memcmp, with appropriate length checks added.
+
+
+
+
+
+
+Newman, et al. Standards Track [Page 22]
+
+RFC 4790 Collation Registry March 2007
+
+
+ The matching operation returns "match" if the sorting algorithm would
+ return "equal". Otherwise, the matching operation returns "no-
+ match".
+
+ The substring operation returns "match" if the first string is the
+ empty string, or if there exists a substring of the second string of
+ length equal to the length of the first string, which would result in
+ a "match" result from the equality function. Otherwise, the
+ substring operation returns "no-match".
+
+9.3.2. Octet Collation Registration
+
+ This collation is defined with intendedUse="limited" because it can
+ only be used by protocols that explicitly allow it.
+
+ <?xml version='1.0'?>
+ <!DOCTYPE collation SYSTEM 'collationreg.dtd'>
+ <collation rfc="4790" scope="global" intendedUse="limited">
+ <identifier>i;octet</identifier>
+ <title>Octet</title>
+ <operations>equality order substring</operations>
+ <specification>RFC 4790</specification>
+ <owner>IETF</owner>
+ <submitter>chris.newman@sun.com</submitter>
+ </collation>
+
+10. IANA Considerations
+
+ Section 7 defines how to register collations with IANA. Section 9
+ defines a list of predefined collations that have been registered
+ with IANA.
+
+11. Security Considerations
+
+ Collations will normally be used with UTF-8 strings. Thus, the
+ security considerations for UTF-8 [3], stringprep [6], and Unicode
+ TR-36 [8] also apply, and are normative to this specification.
+
+12. Acknowledgements
+
+ The authors want to thank all who have contributed to this document,
+ including Brian Carpenter, John Cowan, Dave Cridland, Mark Davis,
+ Spencer Dawkins, Lisa Dusseault, Lars Eggert, Frank Ellermann, Philip
+ Guenther, Tony Hansen, Ted Hardie, Sam Hartman, Kjetil Torgrim Homme,
+ Michael Kay, John Klensin, Alexey Melnikov, Jim Melton, and Abhijit
+ Menon-Sen.
+
+
+
+
+
+Newman, et al. Standards Track [Page 23]
+
+RFC 4790 Collation Registry March 2007
+
+
+13. References
+
+13.1. Normative References
+
+ [1] Bradner, S., "Key words for use in RFCs to Indicate Requirement
+ Levels", BCP 14, RFC 2119, March 1997.
+
+ [2] Crocker, D. and P. Overell, "Augmented BNF for Syntax
+ Specifications: ABNF", RFC 4234, October 2005.
+
+ [3] Yergeau, F., "UTF-8, a transformation format of ISO 10646",
+ STD 63, RFC 3629, November 2003.
+
+ [4] Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform
+ Resource Identifier (URI): Generic Syntax", RFC 3986,
+ January 2005.
+
+ [5] Phillips, A. and M. Davis, "Tags for Identifying Languages",
+ BCP 47, RFC 4646, September 2006.
+
+ [6] Hoffman, P. and M. Blanchet, "Preparation of Internationalized
+ Strings ("stringprep")", RFC 3454, December 2002.
+
+ [7] Davis, M. and K. Whistler, "Unicode Collation Algorithm version
+ 14", May 2005,
+ <http://www.unicode.org/reports/tr10/tr10-14.html>.
+
+ [8] Davis, M. and M. Suignard, "Unicode Security Considerations",
+ February 2006, <http://www.unicode.org/reports/tr36/>.
+
+13.2. Informative References
+
+ [9] Freed, N. and N. Borenstein, "Multipurpose Internet Mail
+ Extensions (MIME) Part One: Format of Internet Message Bodies",
+ RFC 2045, November 1996.
+
+ [10] Melnikov, A., "Simple Authentication and Security Layer
+ (SASL)", RFC 4422, June 2006.
+
+ [11] Newman, C. and J. Myers, "ACAP -- Application Configuration
+ Access Protocol", RFC 2244, November 1997.
+
+ [12] Resnick, P., "Internet Message Format", RFC 2822, April 2001.
+
+ [13] Freed, N. and J. Postel, "IANA Charset Registration
+ Procedures", BCP 19, RFC 2978, October 2000.
+
+
+
+
+
+Newman, et al. Standards Track [Page 24]
+
+RFC 4790 Collation Registry March 2007
+
+
+ [14] Showalter, T., "Sieve: A Mail Filtering Language", RFC 3028,
+ January 2001.
+
+ [15] Crispin, M., "Internet Message Access Protocol - Version
+ 4rev1", RFC 3501, March 2003.
+
+ [16] Crispin, M. and K. Murchison, "Internet Message Access Protocol
+ - Sort and Thread Extensions", Work in Progress, May 2004.
+
+ [17] Newman, C. and A. Gulbrandsen, "Internet Message Access
+ Protocol Internationalization", Work in Progress, January 2006.
+
+Authors' Addresses
+
+ Chris Newman
+ Sun Microsystems
+ 1050 Lakes Drive
+ West Covina, CA 91790
+ USA
+
+ EMail: chris.newman@sun.com
+
+
+ Martin Duerst
+ Aoyama Gakuin University
+ 5-10-1 Fuchinobe
+ Sagamihara, Kanagawa 229-8558
+ Japan
+
+ Phone: +81 42 759 6329
+ Fax: +81 42 759 6495
+ EMail: duerst@it.aoyama.ac.jp
+ URI: http://www.sw.it.aoyama.ac.jp/D%C3%BCrst/
+
+ Note: Please write "Duerst" with u-umlaut wherever possible, for
+ example as "D&#252;rst" in XML and HTML.
+
+
+ Arnt Gulbrandsen
+ Oryx Mail Systems GmbH
+ Schweppermannstr. 8
+ 81671 Munich
+ Germany
+
+ Fax: +49 89 4502 9758
+ EMail: arnt@oryx.com
+ URI: http://www.oryx.com/arnt/
+
+
+
+
+Newman, et al. Standards Track [Page 25]
+
+RFC 4790 Collation Registry March 2007
+
+
+Full Copyright Statement
+
+ Copyright (C) The IETF Trust (2007).
+
+ This document is subject to the rights, licenses and restrictions
+ contained in BCP 78, and except as set forth therein, the authors
+ retain all their rights.
+
+ This document and the information contained herein are provided on an
+ "AS IS" basis and THE CONTRIBUTOR, THE ORGANIZATION HE/SHE REPRESENTS
+ OR IS SPONSORED BY (IF ANY), THE INTERNET SOCIETY, THE IETF TRUST AND
+ THE INTERNET ENGINEERING TASK FORCE DISCLAIM ALL WARRANTIES, EXPRESS
+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF
+ THE INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED
+ WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+
+Intellectual Property
+
+ The IETF takes no position regarding the validity or scope of any
+ Intellectual Property Rights or other rights that might be claimed to
+ pertain to the implementation or use of the technology described in
+ this document or the extent to which any license under such rights
+ might or might not be available; nor does it represent that it has
+ made any independent effort to identify any such rights. Information
+ on the procedures with respect to rights in RFC documents can be
+ found in BCP 78 and BCP 79.
+
+ Copies of IPR disclosures made to the IETF Secretariat and any
+ assurances of licenses to be made available, or the result of an
+ attempt made to obtain a general license or permission for the use of
+ such proprietary rights by implementers or users of this
+ specification can be obtained from the IETF on-line IPR repository at
+ http://www.ietf.org/ipr.
+
+ The IETF invites any interested party to bring to its attention any
+ copyrights, patents or patent applications, or other proprietary
+ rights that may cover technology that may be required to implement
+ this standard. Please address the information to the IETF at
+ ietf-ipr@ietf.org.
+
+Acknowledgement
+
+ Funding for the RFC Editor function is currently provided by the
+ Internet Society.
+
+
+
+
+
+
+
+Newman, et al. Standards Track [Page 26]
+
diff --git a/vendor/sabre/dav/docs/rfc4791.txt b/vendor/sabre/dav/docs/rfc4791.txt
new file mode 100644
index 000000000..7a30bb214
--- /dev/null
+++ b/vendor/sabre/dav/docs/rfc4791.txt
@@ -0,0 +1,5995 @@
+
+
+
+
+
+
+Network Working Group C. Daboo
+Request for Comments: 4791 Apple
+Category: Standards Track B. Desruisseaux
+ Oracle
+ L. Dusseault
+ CommerceNet
+ March 2007
+
+
+ Calendaring Extensions to WebDAV (CalDAV)
+
+Status of This Memo
+
+ This document specifies an Internet standards track protocol for the
+ Internet community, and requests discussion and suggestions for
+ improvements. Please refer to the current edition of the "Internet
+ Official Protocol Standards" (STD 1) for the standardization state
+ and status of this protocol. Distribution of this memo is unlimited.
+
+Copyright Notice
+
+ Copyright (C) The IETF Trust (2007).
+
+Abstract
+
+ This document defines extensions to the Web Distributed Authoring and
+ Versioning (WebDAV) protocol to specify a standard way of accessing,
+ managing, and sharing calendaring and scheduling information based on
+ the iCalendar format. This document defines the "calendar-access"
+ feature of CalDAV.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 1]
+
+RFC 4791 CalDAV March 2007
+
+
+Table of Contents
+
+ 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 5
+ 1.1. Notational Conventions . . . . . . . . . . . . . . . . . . 5
+ 1.2. XML Namespaces and Processing . . . . . . . . . . . . . . 5
+ 1.3. Method Preconditions and Postconditions . . . . . . . . . 6
+ 2. Requirements Overview . . . . . . . . . . . . . . . . . . . . 6
+ 3. Calendaring Data Model . . . . . . . . . . . . . . . . . . . . 7
+ 3.1. Calendar Server . . . . . . . . . . . . . . . . . . . . . 7
+ 3.2. Recurrence and the Data Model . . . . . . . . . . . . . . 8
+ 4. Calendar Resources . . . . . . . . . . . . . . . . . . . . . . 9
+ 4.1. Calendar Object Resources . . . . . . . . . . . . . . . . 9
+ 4.2. Calendar Collection . . . . . . . . . . . . . . . . . . . 10
+ 5. Calendar Access Feature . . . . . . . . . . . . . . . . . . . 11
+ 5.1. Calendar Access Support . . . . . . . . . . . . . . . . . 11
+ 5.1.1. Example: Using OPTIONS for the Discovery of
+ Calendar Access Support . . . . . . . . . . . . . . . 12
+ 5.2. Calendar Collection Properties . . . . . . . . . . . . . . 12
+ 5.2.1. CALDAV:calendar-description Property . . . . . . . . . 12
+ 5.2.2. CALDAV:calendar-timezone Property . . . . . . . . . . 13
+ 5.2.3. CALDAV:supported-calendar-component-set Property . . . 14
+ 5.2.4. CALDAV:supported-calendar-data Property . . . . . . . 15
+ 5.2.5. CALDAV:max-resource-size Property . . . . . . . . . . 16
+ 5.2.6. CALDAV:min-date-time Property . . . . . . . . . . . . 17
+ 5.2.7. CALDAV:max-date-time Property . . . . . . . . . . . . 18
+ 5.2.8. CALDAV:max-instances Property . . . . . . . . . . . . 19
+ 5.2.9. CALDAV:max-attendees-per-instance Property . . . . . . 19
+ 5.2.10. Additional Precondition for PROPPATCH . . . . . . . . 20
+ 5.3. Creating Resources . . . . . . . . . . . . . . . . . . . . 20
+ 5.3.1. MKCALENDAR Method . . . . . . . . . . . . . . . . . . 20
+ 5.3.1.1. Status Codes . . . . . . . . . . . . . . . . . . . 22
+ 5.3.1.2. Example: Successful MKCALENDAR Request . . . . . . 23
+ 5.3.2. Creating Calendar Object Resources . . . . . . . . . . 25
+ 5.3.2.1. Additional Preconditions for PUT, COPY, and
+ MOVE . . . . . . . . . . . . . . . . . . . . . . . 26
+ 5.3.3. Non-Standard Components, Properties, and Parameters . 28
+ 5.3.4. Calendar Object Resource Entity Tag . . . . . . . . . 28
+ 6. Calendaring Access Control . . . . . . . . . . . . . . . . . . 29
+ 6.1. Calendaring Privilege . . . . . . . . . . . . . . . . . . 29
+ 6.1.1. CALDAV:read-free-busy Privilege . . . . . . . . . . . 29
+ 6.2. Additional Principal Property . . . . . . . . . . . . . . 30
+ 6.2.1. CALDAV:calendar-home-set Property . . . . . . . . . . 30
+ 7. Calendaring Reports . . . . . . . . . . . . . . . . . . . . . 31
+ 7.1. REPORT Method . . . . . . . . . . . . . . . . . . . . . . 31
+ 7.2. Ordinary Collections . . . . . . . . . . . . . . . . . . . 31
+ 7.3. Date and Floating Time . . . . . . . . . . . . . . . . . . 32
+ 7.4. Time Range Filtering . . . . . . . . . . . . . . . . . . . 32
+ 7.5. Searching Text: Collations . . . . . . . . . . . . . . . . 33
+
+
+
+Daboo, et al. Standards Track [Page 2]
+
+RFC 4791 CalDAV March 2007
+
+
+ 7.5.1. CALDAV:supported-collation-set Property . . . . . . . 34
+ 7.6. Partial Retrieval . . . . . . . . . . . . . . . . . . . . 34
+ 7.7. Non-Standard Components, Properties, and Parameters . . . 35
+ 7.8. CALDAV:calendar-query REPORT . . . . . . . . . . . . . . . 36
+ 7.8.1. Example: Partial Retrieval of Events by Time Range . . 38
+ 7.8.2. Example: Partial Retrieval of Recurring Events . . . . 42
+ 7.8.3. Example: Expanded Retrieval of Recurring Events . . . 45
+ 7.8.4. Example: Partial Retrieval of Stored Free Busy
+ Components . . . . . . . . . . . . . . . . . . . . . . 48
+ 7.8.5. Example: Retrieval of To-Dos by Alarm Time Range . . . 50
+ 7.8.6. Example: Retrieval of Event by UID . . . . . . . . . . 51
+ 7.8.7. Example: Retrieval of Events by PARTSTAT . . . . . . . 53
+ 7.8.8. Example: Retrieval of Events Only . . . . . . . . . . 55
+ 7.8.9. Example: Retrieval of All Pending To-Dos . . . . . . . 59
+ 7.8.10. Example: Attempt to Query Unsupported Property . . . . 62
+ 7.9. CALDAV:calendar-multiget REPORT . . . . . . . . . . . . . 63
+ 7.9.1. Example: Successful CALDAV:calendar-multiget REPORT . 64
+ 7.10. CALDAV:free-busy-query REPORT . . . . . . . . . . . . . . 66
+ 7.10.1. Example: Successful CALDAV:free-busy-query REPORT . . 68
+ 8. Guidelines . . . . . . . . . . . . . . . . . . . . . . . . . . 69
+ 8.1. Client-to-Client Interoperability . . . . . . . . . . . . 69
+ 8.2. Synchronization Operations . . . . . . . . . . . . . . . . 69
+ 8.2.1. Use of Reports . . . . . . . . . . . . . . . . . . . . 69
+ 8.2.1.1. Restrict the Time Range . . . . . . . . . . . . . 69
+ 8.2.1.2. Synchronize by Time Range . . . . . . . . . . . . 70
+ 8.2.1.3. Synchronization Process . . . . . . . . . . . . . 70
+ 8.2.2. Restrict the Properties Returned . . . . . . . . . . . 72
+ 8.3. Use of Locking . . . . . . . . . . . . . . . . . . . . . . 72
+ 8.4. Finding Calendars . . . . . . . . . . . . . . . . . . . . 72
+ 8.5. Storing and Using Attachments . . . . . . . . . . . . . . 74
+ 8.5.1. Inline Attachments . . . . . . . . . . . . . . . . . . 74
+ 8.5.2. External Attachments . . . . . . . . . . . . . . . . . 75
+ 8.6. Storing and Using Alarms . . . . . . . . . . . . . . . . . 76
+ 9. XML Element Definitions . . . . . . . . . . . . . . . . . . . 77
+ 9.1. CALDAV:calendar XML Element . . . . . . . . . . . . . . . 77
+ 9.2. CALDAV:mkcalendar XML Element . . . . . . . . . . . . . . 77
+ 9.3. CALDAV:mkcalendar-response XML Element . . . . . . . . . . 78
+ 9.4. CALDAV:supported-collation XML Element . . . . . . . . . . 78
+ 9.5. CALDAV:calendar-query XML Element . . . . . . . . . . . . 78
+ 9.6. CALDAV:calendar-data XML Element . . . . . . . . . . . . . 79
+ 9.6.1. CALDAV:comp XML Element . . . . . . . . . . . . . . . 80
+ 9.6.2. CALDAV:allcomp XML Element . . . . . . . . . . . . . . 81
+ 9.6.3. CALDAV:allprop XML Element . . . . . . . . . . . . . . 81
+ 9.6.4. CALDAV:prop XML Element . . . . . . . . . . . . . . . 82
+ 9.6.5. CALDAV:expand XML Element . . . . . . . . . . . . . . 82
+ 9.6.6. CALDAV:limit-recurrence-set XML Element . . . . . . . 83
+ 9.6.7. CALDAV:limit-freebusy-set XML Element . . . . . . . . 84
+ 9.7. CALDAV:filter XML Element . . . . . . . . . . . . . . . . 85
+
+
+
+Daboo, et al. Standards Track [Page 3]
+
+RFC 4791 CalDAV March 2007
+
+
+ 9.7.1. CALDAV:comp-filter XML Element . . . . . . . . . . . . 85
+ 9.7.2. CALDAV:prop-filter XML Element . . . . . . . . . . . . 86
+ 9.7.3. CALDAV:param-filter XML Element . . . . . . . . . . . 87
+ 9.7.4. CALDAV:is-not-defined XML Element . . . . . . . . . . 88
+ 9.7.5. CALDAV:text-match XML Element . . . . . . . . . . . . 88
+ 9.8. CALDAV:timezone XML Element . . . . . . . . . . . . . . . 89
+ 9.9. CALDAV:time-range XML Element . . . . . . . . . . . . . . 90
+ 9.10. CALDAV:calendar-multiget XML Element . . . . . . . . . . . 94
+ 9.11. CALDAV:free-busy-query XML Element . . . . . . . . . . . . 95
+ 10. Internationalization Considerations . . . . . . . . . . . . . 95
+ 11. Security Considerations . . . . . . . . . . . . . . . . . . . 95
+ 12. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 96
+ 12.1. Namespace Registration . . . . . . . . . . . . . . . . . . 96
+ 13. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . 96
+ 14. References . . . . . . . . . . . . . . . . . . . . . . . . . . 97
+ 14.1. Normative References . . . . . . . . . . . . . . . . . . . 97
+ 14.2. Informative References . . . . . . . . . . . . . . . . . . 98
+ Appendix A. CalDAV Method Privilege Table (Normative) . . . . . . 99
+ Appendix B. Calendar Collections Used in the Examples . . . . . . 99
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 4]
+
+RFC 4791 CalDAV March 2007
+
+
+1. Introduction
+
+ The concept of using HTTP [RFC2616] and WebDAV [RFC2518] as a basis
+ for a calendar access protocol is by no means a new concept: it was
+ discussed in the IETF CALSCH working group as early as 1997 or 1998.
+ Several companies have implemented calendar access protocols using
+ HTTP to upload and download iCalendar [RFC2445] objects, and using
+ WebDAV to get listings of resources. However, those implementations
+ do not interoperate because there are many small and big decisions to
+ be made in how to model calendaring data as WebDAV resources, as well
+ as how to implement required features that aren't already part of
+ WebDAV. This document proposes a way to model calendar data in
+ WebDAV, with additional features to make an interoperable calendar
+ access protocol.
+
+1.1. Notational Conventions
+
+ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
+ "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
+ document are to be interpreted as described in [RFC2119].
+
+ The term "protected" is used in the Conformance field of property
+ definitions as defined in Section 1.4.2 of [RFC3253].
+
+ When XML element types in the namespaces "DAV:" and
+ "urn:ietf:params:xml:ns:caldav" are referenced in this document
+ outside of the context of an XML fragment, the string "DAV:" and
+ "CALDAV:" will be prefixed to the element type names, respectively.
+
+1.2. XML Namespaces and Processing
+
+ Definitions of XML elements in this document use XML element type
+ declarations (as found in XML Document Type Declarations), described
+ in Section 3.2 of [W3C.REC-xml-20060816].
+
+ The namespace "urn:ietf:params:xml:ns:caldav" is reserved for the XML
+ elements defined in this specification, its revisions, and related
+ CalDAV specifications. XML elements defined by individual
+ implementations MUST NOT use the "urn:ietf:params:xml:ns:caldav"
+ namespace, and instead should use a namespace that they control.
+
+ The XML declarations used in this document do not include namespace
+ information. Thus, implementers must not use these declarations as
+ the only way to create valid CalDAV properties or to validate CalDAV
+ XML element types. Some of the declarations refer to XML elements
+ defined by WebDAV [RFC2518], which use the "DAV:" namespace.
+ Wherever such XML elements appear, they are explicitly prefixed with
+ "DAV:" to avoid confusion.
+
+
+
+Daboo, et al. Standards Track [Page 5]
+
+RFC 4791 CalDAV March 2007
+
+
+ Also note that some CalDAV XML element names are identical to WebDAV
+ XML element names, though their namespace differs. Care must be
+ taken not to confuse the two sets of names.
+
+ Processing of XML by CalDAV clients and servers MUST follow the rules
+ described in [RFC2518]; in particular, Section 14, and Appendix 3 of
+ that specification.
+
+1.3. Method Preconditions and Postconditions
+
+ A "precondition" of a method describes the state of the server that
+ must be true for that method to be performed. A "postcondition" of a
+ method describes the state of the server that must be true after that
+ method has been completed. If a method precondition or postcondition
+ for a request is not satisfied, the response status of the request
+ MUST either be 403 (Forbidden), if the request should not be repeated
+ because it will always fail, or 409 (Conflict), if it is expected
+ that the user might be able to resolve the conflict and resubmit the
+ request.
+
+ In order to allow better client handling of 403 and 409 responses, a
+ distinct XML element type is associated with each method precondition
+ and postcondition of a request. When a particular precondition is
+ not satisfied or a particular postcondition cannot be achieved, the
+ appropriate XML element MUST be returned as the child of a top-level
+ DAV:error element in the response body, unless otherwise negotiated
+ by the request.
+
+2. Requirements Overview
+
+ This section lists what functionality is required of a CalDAV server.
+ To advertise support for CalDAV, a server:
+
+ o MUST support iCalendar [RFC2445] as a media type for the calendar
+ object resource format;
+
+ o MUST support WebDAV Class 1 [RFC2518] (note that [rfc2518bis]
+ describes clarifications to [RFC2518] that aid interoperability);
+
+ o MUST support WebDAV ACL [RFC3744] with the additional privilege
+ defined in Section 6.1 of this document;
+
+ o MUST support transport over TLS [RFC2246] as defined in [RFC2818]
+ (note that [RFC2246] has been obsoleted by [RFC4346]);
+
+ o MUST support ETags [RFC2616] with additional requirements
+ specified in Section 5.3.4 of this document;
+
+
+
+
+Daboo, et al. Standards Track [Page 6]
+
+RFC 4791 CalDAV March 2007
+
+
+ o MUST support all calendaring reports defined in Section 7 of this
+ document; and
+
+ o MUST advertise support on all calendar collections and calendar
+ object resources for the calendaring reports in the DAV:supported-
+ report-set property, as defined in Versioning Extensions to WebDAV
+ [RFC3253].
+
+ In addition, a server:
+
+ o SHOULD support the MKCALENDAR method defined in Section 5.3.1 of
+ this document.
+
+3. Calendaring Data Model
+
+ One of the features that has made WebDAV a successful protocol is its
+ firm data model. This makes it a useful framework for other
+ applications such as calendaring. This specification follows the
+ same pattern by developing all features based on a well-described
+ data model.
+
+ As a brief overview, a CalDAV calendar is modeled as a WebDAV
+ collection with a defined structure; each calendar collection
+ contains a number of resources representing calendar objects as its
+ direct child resource. Each resource representing a calendar object
+ (event, to-do, journal entry, or other calendar components) is called
+ a "calendar object resource". Each calendar object resource and each
+ calendar collection can be individually locked and have individual
+ WebDAV properties. Requirements derived from this model are provided
+ in Section 4.1 and Section 4.2.
+
+3.1. Calendar Server
+
+ A CalDAV server is a calendaring-aware engine combined with a WebDAV
+ repository. A WebDAV repository is a set of WebDAV collections,
+ containing other WebDAV resources, within a unified URL namespace.
+ For example, the repository "http://www.example.com/webdav/" may
+ contain WebDAV collections and resources, all of which have URLs
+ beginning with "http://www.example.com/webdav/". Note that the root
+ URL, "http://www.example.com/", may not itself be a WebDAV repository
+ (for example, if the WebDAV support is implemented through a servlet
+ or other Web server extension).
+
+ A WebDAV repository MAY include calendar data in some parts of its
+ URL namespace, and non-calendaring data in other parts.
+
+ A WebDAV repository can advertise itself as a CalDAV server if it
+ supports the functionality defined in this specification at any point
+
+
+
+Daboo, et al. Standards Track [Page 7]
+
+RFC 4791 CalDAV March 2007
+
+
+ within the root of the repository. That might mean that calendaring
+ data is spread throughout the repository and mixed with non-calendar
+ data in nearby collections (e.g., calendar data may be found in
+ /home/lisa/calendars/ as well as in /home/bernard/calendars/, and
+ non-calendar data in /home/lisa/contacts/). Or, it might mean that
+ calendar data can be found only in certain sections of the repository
+ (e.g., /calendar/). Calendaring features are only required in the
+ repository sections that are or contain calendar object resources.
+ Therefore, a repository confining calendar data to the /calendar/
+ collection would only need to support the CalDAV required features
+ within that collection.
+
+ The CalDAV server or repository is the canonical location for
+ calendar data and state information. Clients may submit requests to
+ change data or download data. Clients may store calendar objects
+ offline and attempt to synchronize at a later time. However, clients
+ MUST be prepared for calendar data on the server to change between
+ the time of last synchronization and when attempting an update, as
+ calendar collections may be shared and accessible via multiple
+ clients. Entity tags and other features make this possible.
+
+3.2. Recurrence and the Data Model
+
+ Recurrence is an important part of the data model because it governs
+ how many resources are expected to exist. This specification models
+ a recurring calendar component and its recurrence exceptions as a
+ single resource. In this model, recurrence rules, recurrence dates,
+ exception rules, and exception dates are all part of the data in a
+ single calendar object resource. This model avoids problems of
+ limiting how many recurrence instances to store in the repository,
+ how to keep recurrence instances in sync with the recurring calendar
+ component, and how to link recurrence exceptions with the recurring
+ calendar component. It also results in less data to synchronize
+ between client and server, and makes it easier to make changes to all
+ recurrence instances or to a recurrence rule. It makes it easier to
+ create a recurring calendar component and to delete all recurrence
+ instances.
+
+ Clients are not forced to retrieve information about all recurrence
+ instances of a recurring component. The CALDAV:calendar-query and
+ CALDAV:calendar-multiget reports defined in this document allow
+ clients to retrieve only recurrence instances that overlap a given
+ time range.
+
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 8]
+
+RFC 4791 CalDAV March 2007
+
+
+4. Calendar Resources
+
+4.1. Calendar Object Resources
+
+ Calendar object resources contained in calendar collections MUST NOT
+ contain more than one type of calendar component (e.g., VEVENT,
+ VTODO, VJOURNAL, VFREEBUSY, etc.) with the exception of VTIMEZONE
+ components, which MUST be specified for each unique TZID parameter
+ value specified in the iCalendar object. For instance, a calendar
+ object resource can contain one VEVENT component and one VTIMEZONE
+ component, but it cannot contain one VEVENT component and one VTODO
+ component. Instead, the VEVENT and VTODO components would have to be
+ stored in separate calendar object resources in the same collection.
+
+ Calendar object resources contained in calendar collections MUST NOT
+ specify the iCalendar METHOD property.
+
+ The UID property value of the calendar components contained in a
+ calendar object resource MUST be unique in the scope of the calendar
+ collection in which they are stored.
+
+ Calendar components in a calendar collection that have different UID
+ property values MUST be stored in separate calendar object resources.
+
+ Calendar components with the same UID property value, in a given
+ calendar collection, MUST be contained in the same calendar object
+ resource. This ensures that all components in a recurrence "set" are
+ contained in the same calendar object resource. It is possible for a
+ calendar object resource to just contain components that represent
+ "overridden" instances (ones that modify the behavior of a regular
+ instance, and thus include a RECURRENCE-ID property) without also
+ including the "master" recurring component (the one that defines the
+ recurrence "set" and does not contain any RECURRENCE-ID property).
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 9]
+
+RFC 4791 CalDAV March 2007
+
+
+ For example, given the following iCalendar object:
+
+ BEGIN:VCALENDAR
+ PRODID:-//Example Corp.//CalDAV Client//EN
+ VERSION:2.0
+ BEGIN:VEVENT
+ UID:1@example.com
+ SUMMARY:One-off Meeting
+ DTSTAMP:20041210T183904Z
+ DTSTART:20041207T120000Z
+ DTEND:20041207T130000Z
+ END:VEVENT
+ BEGIN:VEVENT
+ UID:2@example.com
+ SUMMARY:Weekly Meeting
+ DTSTAMP:20041210T183838Z
+ DTSTART:20041206T120000Z
+ DTEND:20041206T130000Z
+ RRULE:FREQ=WEEKLY
+ END:VEVENT
+ BEGIN:VEVENT
+ UID:2@example.com
+ SUMMARY:Weekly Meeting
+ RECURRENCE-ID:20041213T120000Z
+ DTSTAMP:20041210T183838Z
+ DTSTART:20041213T130000Z
+ DTEND:20041213T140000Z
+ END:VEVENT
+ END:VCALENDAR
+
+ The VEVENT component with the UID value "1@example.com" would be
+ stored in its own calendar object resource. The two VEVENT
+ components with the UID value "2@example.com", which represent a
+ recurring event where one recurrence instance has been overridden,
+ would be stored in the same calendar object resource.
+
+4.2. Calendar Collection
+
+ A calendar collection contains calendar object resources that
+ represent calendar components within a calendar. A calendar
+ collection is manifested to clients as a WebDAV resource collection
+ identified by a URL. A calendar collection MUST report the DAV:
+ collection and CALDAV:calendar XML elements in the value of the DAV:
+ resourcetype property. The element type declaration for CALDAV:
+ calendar is:
+
+ <!ELEMENT calendar EMPTY>
+
+
+
+
+Daboo, et al. Standards Track [Page 10]
+
+RFC 4791 CalDAV March 2007
+
+
+ A calendar collection can be created through provisioning (i.e.,
+ automatically created when a user's account is provisioned), or it
+ can be created with the MKCALENDAR method (see Section 5.3.1). This
+ method can be useful for a user to create additional calendars (e.g.,
+ soccer schedule) or for users to share a calendar (e.g., team events
+ or conference rooms). However, note that this document doesn't
+ define the purpose of extra calendar collections. Users must rely on
+ non-standard cues to find out what a calendar collection is for, or
+ use the CALDAV:calendar-description property defined in Section 5.2.1
+ to provide such a cue.
+
+ The following restrictions are applied to the resources within a
+ calendar collection:
+
+ a. Calendar collections MUST only contain calendar object resources
+ and collections that are not calendar collections, i.e., the only
+ "top-level" non-collection resources allowed in a calendar
+ collection are calendar object resources. This ensures that
+ calendar clients do not have to deal with non-calendar data in a
+ calendar collection, though they do have to distinguish between
+ calendar object resources and collections when using standard
+ WebDAV techniques to examine the contents of a collection.
+
+ b. Collections contained in calendar collections MUST NOT contain
+ calendar collections at any depth, i.e., "nesting" of calendar
+ collections within other calendar collections at any depth is not
+ allowed. This specification does not define how collections
+ contained in a calendar collection are used or how they relate to
+ any calendar object resources contained in the calendar
+ collection.
+
+ Multiple calendar collections MAY be children of the same collection.
+
+5. Calendar Access Feature
+
+5.1. Calendar Access Support
+
+ A server supporting the features described in this document MUST
+ include "calendar-access" as a field in the DAV response header from
+ an OPTIONS request on any resource that supports any calendar
+ properties, reports, method, or privilege. A value of "calendar-
+ access" in the DAV response header MUST indicate that the server
+ supports all MUST level requirements specified in this document.
+
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 11]
+
+RFC 4791 CalDAV March 2007
+
+
+5.1.1. Example: Using OPTIONS for the Discovery of Calendar Access
+ Support
+
+ >> Request <<
+
+ OPTIONS /home/bernard/calendars/ HTTP/1.1
+ Host: cal.example.com
+
+ >> Response <<
+
+ HTTP/1.1 200 OK
+ Allow: OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, COPY, MOVE
+ Allow: PROPFIND, PROPPATCH, LOCK, UNLOCK, REPORT, ACL
+ DAV: 1, 2, access-control, calendar-access
+ Date: Sat, 11 Nov 2006 09:32:12 GMT
+ Content-Length: 0
+
+ In this example, the OPTIONS method returns the value "calendar-
+ access" in the DAV response header to indicate that the collection
+ "/home/bernard/calendars/" supports the properties, reports, method,
+ or privilege defined in this specification.
+
+5.2. Calendar Collection Properties
+
+ This section defines properties for calendar collections.
+
+5.2.1. CALDAV:calendar-description Property
+
+ Name: calendar-description
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: Provides a human-readable description of the calendar
+ collection.
+
+ Conformance: This property MAY be defined on any calendar
+ collection. If defined, it MAY be protected and SHOULD NOT be
+ returned by a PROPFIND DAV:allprop request (as defined in Section
+ 12.14.1 of [RFC2518]). An xml:lang attribute indicating the human
+ language of the description SHOULD be set for this property by
+ clients or through server provisioning. Servers MUST return any
+ xml:lang attribute if set for the property.
+
+ Description: If present, the property contains a description of the
+ calendar collection that is suitable for presentation to a user.
+ If not present, the client should assume no description for the
+ calendar collection.
+
+
+
+
+Daboo, et al. Standards Track [Page 12]
+
+RFC 4791 CalDAV March 2007
+
+
+ Definition:
+
+ <!ELEMENT calendar-description (#PCDATA)>
+ PCDATA value: string
+
+ Example:
+
+ <C:calendar-description xml:lang="fr-CA"
+ xmlns:C="urn:ietf:params:xml:ns:caldav"
+ >Calendrier de Mathilde Desruisseaux</C:calendar-description>
+
+5.2.2. CALDAV:calendar-timezone Property
+
+ Name: calendar-timezone
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: Specifies a time zone on a calendar collection.
+
+ Conformance: This property SHOULD be defined on all calendar
+ collections. If defined, it SHOULD NOT be returned by a PROPFIND
+ DAV:allprop request (as defined in Section 12.14.1 of [RFC2518]).
+
+ Description: The CALDAV:calendar-timezone property is used to
+ specify the time zone the server should rely on to resolve "date"
+ values and "date with local time" values (i.e., floating time) to
+ "date with UTC time" values. The server will require this
+ information to determine if a calendar component scheduled with
+ "date" values or "date with local time" values overlaps a CALDAV:
+ time-range specified in a CALDAV:calendar-query REPORT. The
+ server will also require this information to compute the proper
+ FREEBUSY time period as "date with UTC time" in the VFREEBUSY
+ component returned in a response to a CALDAV:free-busy-query
+ REPORT request that takes into account calendar components
+ scheduled with "date" values or "date with local time" values. In
+ the absence of this property, the server MAY rely on the time zone
+ of their choice.
+
+ Note: The iCalendar data embedded within the CALDAV:calendar-
+ timezone XML element MUST follow the standard XML character data
+ encoding rules, including use of &lt;, &gt;, &amp; etc. entity
+ encoding or the use of a <![CDATA[ ... ]]> construct. In the
+ later case, the iCalendar data cannot contain the character
+ sequence "]]>", which is the end delimiter for the CDATA section.
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 13]
+
+RFC 4791 CalDAV March 2007
+
+
+ Definition:
+
+ <!ELEMENT calendar-timezone (#PCDATA)>
+ PCDATA value: an iCalendar object with exactly one VTIMEZONE
+ component.
+
+ Example:
+
+ <C:calendar-timezone
+ xmlns:C="urn:ietf:params:xml:ns:caldav">BEGIN:VCALENDAR
+ PRODID:-//Example Corp.//CalDAV Client//EN
+ VERSION:2.0
+ BEGIN:VTIMEZONE
+ TZID:US-Eastern
+ LAST-MODIFIED:19870101T000000Z
+ BEGIN:STANDARD
+ DTSTART:19671029T020000
+ RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+ TZOFFSETFROM:-0400
+ TZOFFSETTO:-0500
+ TZNAME:Eastern Standard Time (US &amp; Canada)
+ END:STANDARD
+ BEGIN:DAYLIGHT
+ DTSTART:19870405T020000
+ RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+ TZOFFSETFROM:-0500
+ TZOFFSETTO:-0400
+ TZNAME:Eastern Daylight Time (US &amp; Canada)
+ END:DAYLIGHT
+ END:VTIMEZONE
+ END:VCALENDAR
+ </C:calendar-timezone>
+
+5.2.3. CALDAV:supported-calendar-component-set Property
+
+ Name: supported-calendar-component-set
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: Specifies the calendar component types (e.g., VEVENT,
+ VTODO, etc.) that calendar object resources can contain in the
+ calendar collection.
+
+ Conformance: This property MAY be defined on any calendar
+ collection. If defined, it MUST be protected and SHOULD NOT be
+ returned by a PROPFIND DAV:allprop request (as defined in Section
+ 12.14.1 of [RFC2518]).
+
+
+
+
+Daboo, et al. Standards Track [Page 14]
+
+RFC 4791 CalDAV March 2007
+
+
+ Description: The CALDAV:supported-calendar-component-set property is
+ used to specify restrictions on the calendar component types that
+ calendar object resources may contain in a calendar collection.
+ Any attempt by the client to store calendar object resources with
+ component types not listed in this property, if it exists, MUST
+ result in an error, with the CALDAV:supported-calendar-component
+ precondition (Section 5.3.2.1) being violated. Since this
+ property is protected, it cannot be changed by clients using a
+ PROPPATCH request. However, clients can initialize the value of
+ this property when creating a new calendar collection with
+ MKCALENDAR. The empty-element tag <C:comp name="VTIMEZONE"/> MUST
+ only be specified if support for calendar object resources that
+ only contain VTIMEZONE components is provided or desired. Support
+ for VTIMEZONE components in calendar object resources that contain
+ VEVENT or VTODO components is always assumed. In the absence of
+ this property, the server MUST accept all component types, and the
+ client can assume that all component types are accepted.
+
+ Definition:
+
+ <!ELEMENT supported-calendar-component-set (comp+)>
+
+ Example:
+
+ <C:supported-calendar-component-set
+ xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <C:comp name="VEVENT"/>
+ <C:comp name="VTODO"/>
+ </C:supported-calendar-component-set>
+
+5.2.4. CALDAV:supported-calendar-data Property
+
+ Name: supported-calendar-data
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: Specifies what media types are allowed for calendar object
+ resources in a calendar collection.
+
+ Conformance: This property MAY be defined on any calendar
+ collection. If defined, it MUST be protected and SHOULD NOT be
+ returned by a PROPFIND DAV:allprop request (as defined in Section
+ 12.14.1 of [RFC2518]).
+
+ Description: The CALDAV:supported-calendar-data property is used to
+ specify the media type supported for the calendar object resources
+ contained in a given calendar collection (e.g., iCalendar version
+ 2.0). Any attempt by the client to store calendar object
+
+
+
+Daboo, et al. Standards Track [Page 15]
+
+RFC 4791 CalDAV March 2007
+
+
+ resources with a media type not listed in this property MUST
+ result in an error, with the CALDAV:supported-calendar-data
+ precondition (Section 5.3.2.1) being violated. In the absence of
+ this property, the server MUST only accept data with the media
+ type "text/calendar" and iCalendar version 2.0, and clients can
+ assume that the server will only accept this data.
+
+ Definition:
+
+ <!ELEMENT supported-calendar-data (calendar-data+)>
+
+ Example:
+
+ <C:supported-calendar-data
+ xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <C:calendar-data content-type="text/calendar" version="2.0"/>
+ </C:supported-calendar-data>
+
+5.2.5. CALDAV:max-resource-size Property
+
+ Name: max-resource-size
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: Provides a numeric value indicating the maximum size of a
+ resource in octets that the server is willing to accept when a
+ calendar object resource is stored in a calendar collection.
+
+ Conformance: This property MAY be defined on any calendar
+ collection. If defined, it MUST be protected and SHOULD NOT be
+ returned by a PROPFIND DAV:allprop request (as defined in Section
+ 12.14.1 of [RFC2518]).
+
+ Description: The CALDAV:max-resource-size is used to specify a
+ numeric value that represents the maximum size in octets that the
+ server is willing to accept when a calendar object resource is
+ stored in a calendar collection. Any attempt to store a calendar
+ object resource exceeding this size MUST result in an error, with
+ the CALDAV:max-resource-size precondition (Section 5.3.2.1) being
+ violated. In the absence of this property, the client can assume
+ that the server will allow storing a resource of any reasonable
+ size.
+
+ Definition:
+
+ <!ELEMENT max-resource-size (#PCDATA)>
+ PCDATA value: a numeric value (positive integer)
+
+
+
+
+Daboo, et al. Standards Track [Page 16]
+
+RFC 4791 CalDAV March 2007
+
+
+ Example:
+
+ <C:max-resource-size xmlns:C="urn:ietf:params:xml:ns:caldav"
+ >102400</C:max-resource-size>
+
+5.2.6. CALDAV:min-date-time Property
+
+ Name: min-date-time
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: Provides a DATE-TIME value indicating the earliest date and
+ time (in UTC) that the server is willing to accept for any DATE or
+ DATE-TIME value in a calendar object resource stored in a calendar
+ collection.
+
+ Conformance: This property MAY be defined on any calendar
+ collection. If defined, it MUST be protected and SHOULD NOT be
+ returned by a PROPFIND DAV:allprop request (as defined in Section
+ 12.14.1 of [RFC2518]).
+
+ Description: The CALDAV:min-date-time is used to specify an
+ iCalendar DATE-TIME value in UTC that indicates the earliest
+ inclusive date that the server is willing to accept for any
+ explicit DATE or DATE-TIME value in a calendar object resource
+ stored in a calendar collection. Any attempt to store a calendar
+ object resource using a DATE or DATE-TIME value earlier than this
+ value MUST result in an error, with the CALDAV:min-date-time
+ precondition (Section 5.3.2.1) being violated. Note that servers
+ MUST accept recurring components that specify instances beyond
+ this limit, provided none of those instances have been overridden.
+ In that case, the server MAY simply ignore those instances outside
+ of the acceptable range when processing reports on the calendar
+ object resource. In the absence of this property, the client can
+ assume any valid iCalendar date may be used at least up to the
+ CALDAV:max-date-time value, if that is defined.
+
+ Definition:
+
+ <!ELEMENT min-date-time (#PCDATA)>
+ PCDATA value: an iCalendar format DATE-TIME value in UTC
+
+ Example:
+
+ <C:min-date-time xmlns:C="urn:ietf:params:xml:ns:caldav"
+ >19000101T000000Z</C:min-date-time>
+
+
+
+
+
+Daboo, et al. Standards Track [Page 17]
+
+RFC 4791 CalDAV March 2007
+
+
+5.2.7. CALDAV:max-date-time Property
+
+ Name: max-date-time
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: Provides a DATE-TIME value indicating the latest date and
+ time (in UTC) that the server is willing to accept for any DATE or
+ DATE-TIME value in a calendar object resource stored in a calendar
+ collection.
+
+ Conformance: This property MAY be defined on any calendar
+ collection. If defined, it MUST be protected and SHOULD NOT be
+ returned by a PROPFIND DAV:allprop request (as defined in Section
+ 12.14.1 of [RFC2518]).
+
+ Description: The CALDAV:max-date-time is used to specify an
+ iCalendar DATE-TIME value in UTC that indicates the inclusive
+ latest date that the server is willing to accept for any date or
+ time value in a calendar object resource stored in a calendar
+ collection. Any attempt to store a calendar object resource using
+ a DATE or DATE-TIME value later than this value MUST result in an
+ error, with the CALDAV:max-date-time precondition
+ (Section 5.3.2.1) being violated. Note that servers MUST accept
+ recurring components that specify instances beyond this limit,
+ provided none of those instances have been overridden. In that
+ case, the server MAY simply ignore those instances outside of the
+ acceptable range when processing reports on the calendar object
+ resource. In the absence of this property, the client can assume
+ any valid iCalendar date may be used at least down to the CALDAV:
+ min-date-time value, if that is defined.
+
+ Definition:
+
+ <!ELEMENT max-date-time (#PCDATA)>
+ PCDATA value: an iCalendar format DATE-TIME value in UTC
+
+ Example:
+
+ <C:max-date-time xmlns:C="urn:ietf:params:xml:ns:caldav"
+ >20491231T235959Z</C:max-date-time>
+
+
+
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 18]
+
+RFC 4791 CalDAV March 2007
+
+
+5.2.8. CALDAV:max-instances Property
+
+ Name: max-instances
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: Provides a numeric value indicating the maximum number of
+ recurrence instances that a calendar object resource stored in a
+ calendar collection can generate.
+
+ Conformance: This property MAY be defined on any calendar
+ collection. If defined, it MUST be protected and SHOULD NOT be
+ returned by a PROPFIND DAV:allprop request (as defined in Section
+ 12.14.1 of [RFC2518]).
+
+ Description: The CALDAV:max-instances is used to specify a numeric
+ value that indicates the maximum number of recurrence instances
+ that a calendar object resource stored in a calendar collection
+ can generate. Any attempt to store a calendar object resource
+ with a recurrence pattern that generates more instances than this
+ value MUST result in an error, with the CALDAV:max-instances
+ precondition (Section 5.3.2.1) being violated. In the absence of
+ this property, the client can assume that the server has no limits
+ on the number of recurrence instances it can handle or expand.
+
+ Definition:
+
+ <!ELEMENT max-instances (#PCDATA)>
+ PCDATA value: a numeric value (integer greater than zero)
+
+ Example:
+
+ <C:max-instances xmlns:C="urn:ietf:params:xml:ns:caldav"
+ >100</C:max-instances>
+
+5.2.9. CALDAV:max-attendees-per-instance Property
+
+ Name: max-attendees-per-instance
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: Provides a numeric value indicating the maximum number of
+ ATTENDEE properties in any instance of a calendar object resource
+ stored in a calendar collection.
+
+ Conformance: This property MAY be defined on any calendar
+ collection. If defined, it MUST be protected and SHOULD NOT be
+
+
+
+
+Daboo, et al. Standards Track [Page 19]
+
+RFC 4791 CalDAV March 2007
+
+
+ returned by a PROPFIND DAV:allprop request (as defined in Section
+ 12.14.1 of [RFC2518]).
+
+ Description: The CALDAV:max-attendees-per-instance is used to
+ specify a numeric value that indicates the maximum number of
+ iCalendar ATTENDEE properties on any one instance of a calendar
+ object resource stored in a calendar collection. Any attempt to
+ store a calendar object resource with more ATTENDEE properties per
+ instance than this value MUST result in an error, with the CALDAV:
+ max-attendees-per-instance precondition (Section 5.3.2.1) being
+ violated. In the absence of this property, the client can assume
+ that the server can handle any number of ATTENDEE properties in a
+ calendar component.
+
+ Definition:
+
+ <!ELEMENT max-attendees-per-instance (#PCDATA)>
+ PCDATA value: a numeric value (integer greater than zero)
+
+ Example:
+
+ <C:max-attendees-per-instance
+ xmlns:C="urn:ietf:params:xml:ns:caldav"
+ >25</C:max-attendees-per-instance>
+
+5.2.10. Additional Precondition for PROPPATCH
+
+ This specification requires an additional Precondition for the
+ PROPPATCH method. The precondition is:
+
+ (CALDAV:valid-calendar-data): The time zone specified in CALDAV:
+ calendar-timezone property MUST be a valid iCalendar object
+ containing a single valid VTIMEZONE component.
+
+5.3. Creating Resources
+
+ Calendar collections and calendar object resources may be created by
+ either a CalDAV client or by the CalDAV server. This specification
+ defines restrictions and a data model that both clients and servers
+ MUST adhere to when manipulating such calendar data.
+
+5.3.1. MKCALENDAR Method
+
+ An HTTP request using the MKCALENDAR method creates a new calendar
+ collection resource. A server MAY restrict calendar collection
+ creation to particular collections.
+
+
+
+
+
+Daboo, et al. Standards Track [Page 20]
+
+RFC 4791 CalDAV March 2007
+
+
+ Support for MKCALENDAR on the server is only RECOMMENDED and not
+ REQUIRED because some calendar stores only support one calendar per
+ user (or principal), and those are typically pre-created for each
+ account. However, servers and clients are strongly encouraged to
+ support MKCALENDAR whenever possible to allow users to create
+ multiple calendar collections to help organize their data better.
+
+ Clients SHOULD use the DAV:displayname property for a human-readable
+ name of the calendar. Clients can either specify the value of the
+ DAV:displayname property in the request body of the MKCALENDAR
+ request, or alternatively issue a PROPPATCH request to change the
+ DAV:displayname property to the appropriate value immediately after
+ issuing the MKCALENDAR request. Clients SHOULD NOT set the DAV:
+ displayname property to be the same as any other calendar collection
+ at the same URI "level". When displaying calendar collections to
+ users, clients SHOULD check the DAV:displayname property and use that
+ value as the name of the calendar. In the event that the DAV:
+ displayname property is empty, the client MAY use the last part of
+ the calendar collection URI as the name; however, that path segment
+ may be "opaque" and not represent any meaningful human-readable text.
+
+ If a MKCALENDAR request fails, the server state preceding the request
+ MUST be restored.
+
+ Marshalling:
+ If a request body is included, it MUST be a CALDAV:mkcalendar XML
+ element. Instruction processing MUST occur in the order
+ instructions are received (i.e., from top to bottom).
+ Instructions MUST either all be executed or none executed. Thus,
+ if any error occurs during processing, all executed instructions
+ MUST be undone and a proper error result returned. Instruction
+ processing details can be found in the definition of the DAV:set
+ instruction in Section 12.13.2 of [RFC2518].
+
+ <!ELEMENT mkcalendar (DAV:set)>
+
+ If a response body for a successful request is included, it MUST
+ be a CALDAV:mkcalendar-response XML element.
+
+ <!ELEMENT mkcalendar-response ANY>
+
+ The response MUST include a Cache-Control:no-cache header.
+
+ Preconditions:
+
+ (DAV:resource-must-be-null): A resource MUST NOT exist at the
+ Request-URI;
+
+
+
+
+Daboo, et al. Standards Track [Page 21]
+
+RFC 4791 CalDAV March 2007
+
+
+ (CALDAV:calendar-collection-location-ok): The Request-URI MUST
+ identify a location where a calendar collection can be created;
+
+ (CALDAV:valid-calendar-data): The time zone specified in the
+ CALDAV:calendar-timezone property MUST be a valid iCalendar object
+ containing a single valid VTIMEZONE component;
+
+ (DAV:needs-privilege): The DAV:bind privilege MUST be granted to
+ the current user on the parent collection of the Request-URI.
+
+ Postconditions:
+
+ (CALDAV:initialize-calendar-collection): A new calendar collection
+ exists at the Request-URI. The DAV:resourcetype of the calendar
+ collection MUST contain both DAV:collection and CALDAV:calendar
+ XML elements.
+
+5.3.1.1. Status Codes
+
+ The following are examples of response codes one would expect to get
+ in a response to a MKCALENDAR request. Note that this list is by no
+ means exhaustive.
+
+ 201 (Created) - The calendar collection resource was created in
+ its entirety;
+
+ 207 (Multi-Status) - The calendar collection resource was not
+ created since one or more DAV:set instructions specified in the
+ request body could not be processed successfully. The following
+ are examples of response codes one would expect to be used in a
+ 207 (Multi-Status) response in this situation:
+
+ 403 (Forbidden) - The client, for reasons the server chooses
+ not to specify, cannot alter one of the properties;
+
+ 409 (Conflict) - The client has provided a value whose
+ semantics are not appropriate for the property. This includes
+ trying to set read-only properties;
+
+ 424 (Failed Dependency) - The DAV:set instruction on the
+ specified resource would have succeeded if it were not for the
+ failure of another DAV:set instruction specified in the request
+ body;
+
+ 423 (Locked) - The specified resource is locked and the client
+ either is not a lock owner or the lock type requires a lock
+ token to be submitted and the client did not submit it; and
+
+
+
+
+Daboo, et al. Standards Track [Page 22]
+
+RFC 4791 CalDAV March 2007
+
+
+ 507 (Insufficient Storage) - The server did not have sufficient
+ space to record the property;
+
+ 403 (Forbidden) - This indicates at least one of two conditions:
+ 1) the server does not allow the creation of calendar collections
+ at the given location in its namespace, or 2) the parent
+ collection of the Request-URI exists but cannot accept members;
+
+ 409 (Conflict) - A collection cannot be made at the Request-URI
+ until one or more intermediate collections have been created;
+
+ 415 (Unsupported Media Type) - The server does not support the
+ request type of the body; and
+
+ 507 (Insufficient Storage) - The resource does not have sufficient
+ space to record the state of the resource after the execution of
+ this method.
+
+5.3.1.2. Example: Successful MKCALENDAR Request
+
+ This example creates a calendar collection called /home/lisa/
+ calendars/events/ on the server cal.example.com with specific values
+ for the properties DAV:displayname, CALDAV:calendar-description,
+ CALDAV:supported-calendar-component-set, and CALDAV:calendar-
+ timezone.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 23]
+
+RFC 4791 CalDAV March 2007
+
+
+ >> Request <<
+
+ MKCALENDAR /home/lisa/calendars/events/ HTTP/1.1
+ Host: cal.example.com
+ Content-Type: application/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <C:mkcalendar xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:set>
+ <D:prop>
+ <D:displayname>Lisa's Events</D:displayname>
+ <C:calendar-description xml:lang="en"
+ >Calendar restricted to events.</C:calendar-description>
+ <C:supported-calendar-component-set>
+ <C:comp name="VEVENT"/>
+ </C:supported-calendar-component-set>
+ <C:calendar-timezone><![CDATA[BEGIN:VCALENDAR
+ PRODID:-//Example Corp.//CalDAV Client//EN
+ VERSION:2.0
+ BEGIN:VTIMEZONE
+ TZID:US-Eastern
+ LAST-MODIFIED:19870101T000000Z
+ BEGIN:STANDARD
+ DTSTART:19671029T020000
+ RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+ TZOFFSETFROM:-0400
+ TZOFFSETTO:-0500
+ TZNAME:Eastern Standard Time (US & Canada)
+ END:STANDARD
+ BEGIN:DAYLIGHT
+ DTSTART:19870405T020000
+ RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+ TZOFFSETFROM:-0500
+ TZOFFSETTO:-0400
+ TZNAME:Eastern Daylight Time (US & Canada)
+ END:DAYLIGHT
+ END:VTIMEZONE
+ END:VCALENDAR
+ ]]></C:calendar-timezone>
+ </D:prop>
+ </D:set>
+ </C:mkcalendar>
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 24]
+
+RFC 4791 CalDAV March 2007
+
+
+ >> Response <<
+
+ HTTP/1.1 201 Created
+ Cache-Control: no-cache
+ Date: Sat, 11 Nov 2006 09:32:12 GMT
+ Content-Length: 0
+
+5.3.2. Creating Calendar Object Resources
+
+ Clients populate calendar collections with calendar object resources.
+ The URL for each calendar object resource is entirely arbitrary and
+ does not need to bear a specific relationship to the calendar object
+ resource's iCalendar properties or other metadata. New calendar
+ object resources MUST be created with a PUT request targeted at an
+ unmapped URI. A PUT request targeted at a mapped URI updates an
+ existing calendar object resource.
+
+ When servers create new resources, it's not hard for the server to
+ choose an unmapped URI. It's slightly tougher for clients, because a
+ client might not want to examine all resources in the collection and
+ might not want to lock the entire collection to ensure that a new
+ resource isn't created with a name collision. However, there is an
+ HTTP feature to mitigate this. If the client intends to create a new
+ non-collection resource, such as a new VEVENT, the client SHOULD use
+ the HTTP request header "If-None-Match: *" on the PUT request. The
+ Request-URI on the PUT request MUST include the target collection,
+ where the resource is to be created, plus the name of the resource in
+ the last path segment. The "If-None-Match: *" request header ensures
+ that the client will not inadvertently overwrite an existing resource
+ if the last path segment turned out to already be used.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 25]
+
+RFC 4791 CalDAV March 2007
+
+
+ >> Request <<
+
+ PUT /home/lisa/calendars/events/qwue23489.ics HTTP/1.1
+ If-None-Match: *
+ Host: cal.example.com
+ Content-Type: text/calendar
+ Content-Length: xxxx
+
+ BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//Example Corp.//CalDAV Client//EN
+ BEGIN:VEVENT
+ UID:20010712T182145Z-123401@example.com
+ DTSTAMP:20060712T182145Z
+ DTSTART:20060714T170000Z
+ DTEND:20060715T040000Z
+ SUMMARY:Bastille Day Party
+ END:VEVENT
+ END:VCALENDAR
+
+ >> Response <<
+
+ HTTP/1.1 201 Created
+ Content-Length: 0
+ Date: Sat, 11 Nov 2006 09:32:12 GMT
+ ETag: "123456789-000-111"
+
+ The request to change an existing event is the same, but with a
+ specific ETag in the "If-Match" header, rather than the "If-None-
+ Match" header.
+
+ As indicated in Section 3.10 of [RFC2445], the URL of calendar object
+ resources containing (an arbitrary set of) calendaring and scheduling
+ information may be suffixed by ".ics", and the URL of calendar object
+ resources containing free or busy time information may be suffixed by
+ ".ifb".
+
+5.3.2.1. Additional Preconditions for PUT, COPY, and MOVE
+
+ This specification creates additional Preconditions for PUT, COPY,
+ and MOVE methods. These preconditions apply when a PUT operation of
+ a calendar object resource into a calendar collection occurs, or when
+ a COPY or MOVE operation of a calendar object resource into a
+ calendar collection occurs, or when a COPY or MOVE operation occurs
+ on a calendar collection.
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 26]
+
+RFC 4791 CalDAV March 2007
+
+
+ The new preconditions are:
+
+ (CALDAV:supported-calendar-data): The resource submitted in the
+ PUT request, or targeted by a COPY or MOVE request, MUST be a
+ supported media type (i.e., iCalendar) for calendar object
+ resources;
+
+ (CALDAV:valid-calendar-data): The resource submitted in the PUT
+ request, or targeted by a COPY or MOVE request, MUST be valid data
+ for the media type being specified (i.e., MUST contain valid
+ iCalendar data);
+
+ (CALDAV:valid-calendar-object-resource): The resource submitted in
+ the PUT request, or targeted by a COPY or MOVE request, MUST obey
+ all restrictions specified in Section 4.1 (e.g., calendar object
+ resources MUST NOT contain more than one type of calendar
+ component, calendar object resources MUST NOT specify the
+ iCalendar METHOD property, etc.);
+
+ (CALDAV:supported-calendar-component): The resource submitted in
+ the PUT request, or targeted by a COPY or MOVE request, MUST
+ contain a type of calendar component that is supported in the
+ targeted calendar collection;
+
+ (CALDAV:no-uid-conflict): The resource submitted in the PUT
+ request, or targeted by a COPY or MOVE request, MUST NOT specify
+ an iCalendar UID property value already in use in the targeted
+ calendar collection or overwrite an existing calendar object
+ resource with one that has a different UID property value.
+ Servers SHOULD report the URL of the resource that is already
+ making use of the same UID property value in the DAV:href element;
+
+ <!ELEMENT no-uid-conflict (DAV:href)>
+
+ (CALDAV:calendar-collection-location-ok): In a COPY or MOVE
+ request, when the Request-URI is a calendar collection, the
+ Destination-URI MUST identify a location where a calendar
+ collection can be created;
+
+ (CALDAV:max-resource-size): The resource submitted in the PUT
+ request, or targeted by a COPY or MOVE request, MUST have an octet
+ size less than or equal to the value of the CALDAV:max-resource-
+ size property value (Section 5.2.5) on the calendar collection
+ where the resource will be stored;
+
+ (CALDAV:min-date-time): The resource submitted in the PUT request,
+ or targeted by a COPY or MOVE request, MUST have all of its
+ iCalendar DATE or DATE-TIME property values (for each recurring
+
+
+
+Daboo, et al. Standards Track [Page 27]
+
+RFC 4791 CalDAV March 2007
+
+
+ instance) greater than or equal to the value of the CALDAV:min-
+ date-time property value (Section 5.2.6) on the calendar
+ collection where the resource will be stored;
+
+ (CALDAV:max-date-time): The resource submitted in the PUT request,
+ or targeted by a COPY or MOVE request, MUST have all of its
+ iCalendar DATE or DATE-TIME property values (for each recurring
+ instance) less than the value of the CALDAV:max-date-time property
+ value (Section 5.2.7) on the calendar collection where the
+ resource will be stored;
+
+ (CALDAV:max-instances): The resource submitted in the PUT request,
+ or targeted by a COPY or MOVE request, MUST generate a number of
+ recurring instances less than or equal to the value of the CALDAV:
+ max-instances property value (Section 5.2.8) on the calendar
+ collection where the resource will be stored;
+
+ (CALDAV:max-attendees-per-instance): The resource submitted in the
+ PUT request, or targeted by a COPY or MOVE request, MUST have a
+ number of ATTENDEE properties on any one instance less than or
+ equal to the value of the CALDAV:max-attendees-per-instance
+ property value (Section 5.2.9) on the calendar collection where
+ the resource will be stored;
+
+5.3.3. Non-Standard Components, Properties, and Parameters
+
+ iCalendar provides a "standard mechanism for doing non-standard
+ things". This extension support allows implementers to make use of
+ non-standard components, properties, and parameters whose names are
+ prefixed with the text "X-".
+
+ Servers MUST support the use of non-standard components, properties,
+ and parameters in calendar object resources stored via the PUT
+ method.
+
+ Servers may need to enforce rules for their own "private" components,
+ properties, or parameters, so servers MAY reject any attempt by the
+ client to change those or use values for those outside of any
+ restrictions the server may have. Servers SHOULD ensure that any
+ "private" components, properties, or parameters it uses follow the
+ convention of including a vendor id in the "X-" name, as described in
+ Section 4.2 of [RFC2445], e.g., "X-ABC-PRIVATE".
+
+5.3.4. Calendar Object Resource Entity Tag
+
+ The DAV:getetag property MUST be defined and set to a strong entity
+ tag on all calendar object resources.
+
+
+
+
+Daboo, et al. Standards Track [Page 28]
+
+RFC 4791 CalDAV March 2007
+
+
+ A response to a GET request targeted at a calendar object resource
+ MUST contain an ETag response header field indicating the current
+ value of the strong entity tag of the calendar object resource.
+
+ Servers SHOULD return a strong entity tag (ETag header) in a PUT
+ response when the stored calendar object resource is equivalent by
+ octet equality to the calendar object resource submitted in the body
+ of the PUT request. This allows clients to reliably use the returned
+ strong entity tag for data synchronization purposes. For instance,
+ the client can do a PROPFIND request on the stored calendar object
+ resource and have the DAV:getetag property returned, and compare that
+ value with the strong entity tag it received on the PUT response, and
+ know that if they are equal, then the calendar object resource on the
+ server has not been changed.
+
+ In the case where the data stored by a server as a result of a PUT
+ request is not equivalent by octet equality to the submitted calendar
+ object resource, the behavior of the ETag response header is not
+ specified here, with the exception that a strong entity tag MUST NOT
+ be returned in the response. As a result, clients may need to
+ retrieve the modified calendar object resource (and ETag) as a basis
+ for further changes, rather than use the calendar object resource it
+ had sent with the PUT request.
+
+6. Calendaring Access Control
+
+6.1. Calendaring Privilege
+
+ CalDAV servers MUST support and adhere to the requirements of WebDAV
+ ACL [RFC3744]. WebDAV ACL provides a framework for an extensible set
+ of privileges that can be applied to WebDAV collections and ordinary
+ resources. CalDAV servers MUST also support the calendaring
+ privilege defined in this section.
+
+6.1.1. CALDAV:read-free-busy Privilege
+
+ Calendar users often wish to allow other users to see their busy time
+ information, without viewing the other details of the calendar
+ components (e.g., location, summary, attendees). This allows a
+ significant amount of privacy while still allowing other users to
+ schedule meetings at times when the user is likely to be free.
+
+ The CALDAV:read-free-busy privilege controls which calendar
+ collections, regular collections, and calendar object resources are
+ examined when a CALDAV:free-busy-query REPORT request is processed
+ (see Section 7.10). This privilege can be granted on calendar
+ collections, regular collections, or calendar object resources.
+
+
+
+
+Daboo, et al. Standards Track [Page 29]
+
+RFC 4791 CalDAV March 2007
+
+
+ Servers MUST support this privilege on all calendar collections,
+ regular collections, and calendar object resources.
+
+
+ <!ELEMENT read-free-busy EMPTY>
+
+ The CALDAV:read-free-busy privilege MUST be aggregated in the DAV:
+ read privilege. Servers MUST allow the CALDAV:read-free-busy to be
+ granted without the DAV:read privilege being granted.
+
+ Clients should note that when only the CALDAV:read-free-busy
+ privilege has been granted on a resource, access to GET, HEAD,
+ OPTIONS, and PROPFIND on the resource is not implied (those
+ operations are governed by the DAV:read privilege).
+
+6.2. Additional Principal Property
+
+ This section defines an additional property for WebDAV principal
+ resources, as defined in [RFC3744].
+
+6.2.1. CALDAV:calendar-home-set Property
+
+ Name: calendar-home-set
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: Identifies the URL of any WebDAV collections that contain
+ calendar collections owned by the associated principal resource.
+
+ Conformance: This property SHOULD be defined on a principal
+ resource. If defined, it MAY be protected and SHOULD NOT be
+ returned by a PROPFIND DAV:allprop request (as defined in Section
+ 12.14.1 of [RFC2518]).
+
+ Description: The CALDAV:calendar-home-set property is meant to allow
+ users to easily find the calendar collections owned by the
+ principal. Typically, users will group all the calendar
+ collections that they own under a common collection. This
+ property specifies the URL of collections that are either calendar
+ collections or ordinary collections that have child or descendant
+ calendar collections owned by the principal.
+
+ Definition:
+
+ <!ELEMENT calendar-home-set (DAV:href*)>
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 30]
+
+RFC 4791 CalDAV March 2007
+
+
+ Example:
+
+ <C:calendar-home-set xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:href>http://cal.example.com/home/bernard/calendars/</D:href>
+ </C:calendar-home-set>
+
+7. Calendaring Reports
+
+ This section defines the reports that CalDAV servers MUST support on
+ calendar collections and calendar object resources.
+
+ CalDAV servers MUST advertise support for these reports on all
+ calendar collections and calendar object resources with the DAV:
+ supported-report-set property, defined in Section 3.1.5 of [RFC3253].
+ CalDAV servers MAY also advertise support for these reports on
+ ordinary collections.
+
+ Some of these reports allow calendar data (from possibly multiple
+ resources) to be returned.
+
+7.1. REPORT Method
+
+ The REPORT method (defined in Section 3.6 of [RFC3253]) provides an
+ extensible mechanism for obtaining information about one or more
+ resources. Unlike the PROPFIND method, which returns the value of
+ one or more named properties, the REPORT method can involve more
+ complex processing. REPORT is valuable in cases where the server has
+ access to all of the information needed to perform the complex
+ request (such as a query), and where it would require multiple
+ requests for the client to retrieve the information needed to perform
+ the same request.
+
+ CalDAV servers MUST support the DAV:expand-property REPORT defined in
+ Section 3.8 of [RFC3253].
+
+7.2. Ordinary Collections
+
+ Servers MAY support the reports defined in this document on ordinary
+ collections (collections that are not calendar collections), in
+ addition to calendar collections or calendar object resources. In
+ computing responses to the reports on ordinary collections, servers
+ MUST only consider calendar object resources contained in calendar
+ collections that are targeted by the REPORT request, based on the
+ value of the Depth request header.
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 31]
+
+RFC 4791 CalDAV March 2007
+
+
+7.3. Date and Floating Time
+
+ iCalendar provides a way to specify DATE and DATE-TIME values that
+ are not bound to any time zone in particular, hereafter called
+ "floating date" and "floating time", respectively. These values are
+ used to represent the same day, hour, minute, and second value,
+ regardless of which time zone is being observed. For instance, the
+ DATE value "20051111", represents November 11, 2005 in no specific
+ time zone, while the DATE-TIME value "20051111T111100" represents
+ November 11, 2005, at 11:11 A.M. in no specific time zone.
+
+ CalDAV servers may need to convert "floating date" and "floating
+ time" values in date with UTC time values in the processing of
+ calendaring REPORT requests.
+
+ For the CALDAV:calendar-query REPORT, CalDAV servers MUST rely on the
+ value of the CALDAV:timezone XML element, if specified as part of the
+ request body, to perform the proper conversion of "floating date" and
+ "floating time" values to date with UTC time values. If the CALDAV:
+ timezone XML element is not specified in the request body, CalDAV
+ servers MUST rely on the value of the CALDAV:calendar-timezone
+ property, if defined, or else the CalDAV servers MAY rely on the time
+ zone of their choice.
+
+ For the CALDAV:free-busy-query REPORT, CalDAV servers MUST rely on
+ the value of the CALDAV:calendar-timezone property, if defined, to
+ compute the proper FREEBUSY time period value as date with UTC time
+ for calendar components scheduled with "floating date" or "floating
+ time". If the CALDAV:calendar-timezone property is not defined,
+ CalDAV servers MAY rely on the time zone of their choice.
+
+7.4. Time Range Filtering
+
+ Some of the reports defined in this section can include a time range
+ filter that is used to restrict the set of calendar object resources
+ returned to just those that overlap the specified time range. The
+ time range filter can be applied to a calendar component as a whole,
+ or to specific calendar component properties with DATE or DATE-TIME
+ value types.
+
+ To determine whether a calendar object resource matches the time
+ range filter element, the start and end times for the targeted
+ component or property are determined and then compared to the
+ requested time range. If there is an overlap with the requested time
+ range, then the calendar object resource matches the filter element.
+ The rules defined in [RFC2445] for determining the actual start and
+ end times of calendar components MUST be used, and these are fully
+ enumerated in Section 9.9 of this document.
+
+
+
+Daboo, et al. Standards Track [Page 32]
+
+RFC 4791 CalDAV March 2007
+
+
+ When such time range filtering is used, special consideration must be
+ given to recurring calendar components, such as VEVENT and VTODO.
+ The server MUST expand recurring components to determine whether any
+ recurrence instances overlap the specified time range. If one or
+ more recurrence instances overlap the time range, then the calendar
+ object resource matches the filter element.
+
+7.5. Searching Text: Collations
+
+ Some of the reports defined in this section do text matches of
+ character strings provided by the client and are compared to stored
+ calendar data. Since iCalendar data is, by default, encoded in the
+ UTF-8 charset and may include characters outside the US-ASCII charset
+ range in some property and parameter values, there is a need to
+ ensure that text matching follows well-defined rules.
+
+ To deal with this, this specification makes use of the IANA Collation
+ Registry defined in [RFC4790] to specify collations that may be used
+ to carry out the text comparison operations with a well-defined rule.
+
+ The comparisons used in CalDAV are all "substring" matches, as per
+ [RFC4790], Section 4.2. Collations supported by the server MUST
+ support "substring" match operations.
+
+ CalDAV servers are REQUIRED to support the "i;ascii-casemap" and
+ "i;octet" collations, as described in [RFC4790], and MAY support
+ other collations.
+
+ Servers MUST advertise the set of collations that they support via
+ the CALDAV:supported-collation-set property defined on any resource
+ that supports reports that use collations.
+
+ Clients MUST only use collations from the list advertised by the
+ server.
+
+ In the absence of a collation explicitly specified by the client, or
+ if the client specifies the "default" collation identifier (as
+ defined in [RFC4790], Section 3.1), the server MUST default to using
+ "i;ascii-casemap" as the collation.
+
+ Wildcards (as defined in [RFC4790], Section 3.2) MUST NOT be used in
+ the collation identifier.
+
+ If the client chooses a collation not supported by the server, the
+ server MUST respond with a CALDAV:supported-collation precondition
+ error response.
+
+
+
+
+
+Daboo, et al. Standards Track [Page 33]
+
+RFC 4791 CalDAV March 2007
+
+
+7.5.1. CALDAV:supported-collation-set Property
+
+ Name: supported-collation-set
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: Identifies the set of collations supported by the server
+ for text matching operations.
+
+ Conformance: This property MUST be defined on any resource that
+ supports a report that does text matching. If defined, it MUST be
+ protected and SHOULD NOT be returned by a PROPFIND DAV:allprop
+ request (as defined in Section 12.14.1 of [RFC2518]).
+
+ Description: The CALDAV:supported-collation-set property contains
+ zero or more CALDAV:supported-collation elements, which specify
+ the collection identifiers of the collations supported by the
+ server.
+
+ Definition:
+
+ <!ELEMENT supported-collation-set (supported-collation*)>
+
+ <!ELEMENT supported-collation (#PCDATA)>
+
+ Example:
+
+ <C:supported-collation-set
+ xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <C:supported-collation>i;ascii-casemap</C:supported-collation>
+ <C:supported-collation>i;octet</C:supported-collation>
+ </C:supported-collation-set>
+
+7.6. Partial Retrieval
+
+ Some calendaring reports defined in this document allow partial
+ retrieval of calendar object resources. A CalDAV client can specify
+ what information to return in the body of a calendaring REPORT
+ request.
+
+ A CalDAV client can request particular WebDAV property values, all
+ WebDAV property values, or a list of the names of the resource's
+ WebDAV properties. A CalDAV client can also request calendar data to
+ be returned and specify whether all calendar components and
+ properties should be returned, or only particular ones. See CALDAV:
+ calendar-data in Section 9.6.
+
+
+
+
+
+Daboo, et al. Standards Track [Page 34]
+
+RFC 4791 CalDAV March 2007
+
+
+ By default, the returned calendar data will include the component
+ that defines the recurrence set, referred to as the "master
+ component", as well as the components that define exceptions to the
+ recurrence set, referred to as the "overridden components".
+
+ A CalDAV client that is only interested in the recurrence instances
+ that overlap a specified time range can request to receive only the
+ "master component", along with the "overridden components" that
+ impact the specified time range, and thus, limit the data returned by
+ the server (see CALDAV:limit-recurrence-set in Section 9.6.6). An
+ overridden component impacts a time range if its current start and
+ end times overlap the time range, or if the original start and end
+ times -- the ones that would have been used if the instance were not
+ overridden -- overlap the time range, or if it affects other
+ instances that overlap the time range.
+
+ A CalDAV client with no support for recurrence properties (i.e.,
+ EXDATE, EXRULE, RDATE, and RRULE) and possibly VTIMEZONE components,
+ or a client unwilling to perform recurrence expansion because of
+ limited processing capability, can request to receive only the
+ recurrence instances that overlap a specified time range as separate
+ calendar components that each define exactly one recurrence instance
+ (see CALDAV:expand in Section 9.6.5.)
+
+ Finally, in the case of VFREEBUSY components, a CalDAV client can
+ request to receive only the FREEBUSY property values that overlap a
+ specified time range (see CALDAV:limit-freebusy-set in
+ Section 9.6.7.)
+
+7.7. Non-Standard Components, Properties, and Parameters
+
+ Servers MUST support the use of non-standard component, property, or
+ parameter names in the CALDAV:calendar-data XML element in
+ calendaring REPORT requests to allow clients to request that non-
+ standard components, properties, and parameters be returned in the
+ calendar data provided in the response.
+
+ Servers MAY support the use of non-standard component, property, or
+ parameter names in the CALDAV:comp-filter, CALDAV:prop-filter, and
+ CALDAV:param-filter XML elements specified in the CALDAV:filter XML
+ element of calendaring REPORT requests.
+
+ Servers MUST fail with the CALDAV:supported-filter precondition if a
+ calendaring REPORT request uses a CALDAV:comp-filter, CALDAV:prop-
+ filter, or CALDAV:param-filter XML element that makes reference to a
+ non-standard component, property, or parameter name on which the
+ server does not support queries.
+
+
+
+
+Daboo, et al. Standards Track [Page 35]
+
+RFC 4791 CalDAV March 2007
+
+
+7.8. CALDAV:calendar-query REPORT
+
+ The CALDAV:calendar-query REPORT performs a search for all calendar
+ object resources that match a specified filter. The response of this
+ report will contain all the WebDAV properties and calendar object
+ resource data specified in the request. In the case of the CALDAV:
+ calendar-data XML element, one can explicitly specify the calendar
+ components and properties that should be returned in the calendar
+ object resource data that matches the filter.
+
+ The format of this report is modeled on the PROPFIND method. The
+ request and response bodies of the CALDAV:calendar-query REPORT use
+ XML elements that are also used by PROPFIND. In particular, the
+ request can include XML elements to request WebDAV properties to be
+ returned. When that occurs, the response should follow the same
+ behavior as PROPFIND with respect to the DAV:multistatus response
+ elements used to return specific property results. For instance, a
+ request to retrieve the value of a property that does not exist is an
+ error and MUST be noted with a response XML element that contains a
+ 404 (Not Found) status value.
+
+ Support for the CALDAV:calendar-query REPORT is REQUIRED.
+
+ Marshalling:
+
+ The request body MUST be a CALDAV:calendar-query XML element, as
+ defined in Section 9.5.
+
+ The request MAY include a Depth header. If no Depth header is
+ included, Depth:0 is assumed.
+
+ The response body for a successful request MUST be a DAV:
+ multistatus XML element (i.e., the response uses the same format
+ as the response for PROPFIND). In the case where there are no
+ response elements, the returned DAV:multistatus XML element is
+ empty.
+
+ The response body for a successful CALDAV:calendar-query REPORT
+ request MUST contain a DAV:response element for each iCalendar
+ object that matched the search filter. Calendar data is being
+ returned in the CALDAV:calendar-data XML element inside the DAV:
+ propstat XML element.
+
+ Preconditions:
+
+ (CALDAV:supported-calendar-data): The attributes "content-type"
+ and "version" of the CALDAV:calendar-data XML element (see
+
+
+
+
+Daboo, et al. Standards Track [Page 36]
+
+RFC 4791 CalDAV March 2007
+
+
+ Section 9.6) specify a media type supported by the server for
+ calendar object resources.
+
+ (CALDAV:valid-filter): The CALDAV:filter XML element (see
+ Section 9.7) specified in the REPORT request MUST be valid. For
+ instance, a CALDAV:filter cannot nest a <C:comp name="VEVENT">
+ element in a <C:comp name="VTODO"> element, and a CALDAV:filter
+ cannot nest a <C:time-range start="..." end="..."> element in a
+ <C:prop name="SUMMARY"> element.
+
+ (CALDAV:supported-filter): The CALDAV:comp-filter (see
+ Section 9.7.1), CALDAV:prop-filter (see Section 9.7.2), and
+ CALDAV:param-filter (see Section 9.7.3) XML elements used in the
+ CALDAV:filter XML element (see Section 9.7) in the REPORT request
+ only make reference to components, properties, and parameters for
+ which queries are supported by the server, i.e., if the CALDAV:
+ filter element attempts to reference an unsupported component,
+ property, or parameter, this precondition is violated. Servers
+ SHOULD report the CALDAV:comp-filter, CALDAV:prop-filter, or
+ CALDAV:param-filter for which it does not provide support.
+
+ <!ELEMENT supported-filter (comp-filter*,
+ prop-filter*,
+ param-filter*)>
+
+ (CALDAV:valid-calendar-data): The time zone specified in the
+ REPORT request MUST be a valid iCalendar object containing a
+ single valid VTIMEZONE component.
+
+ (CALDAV:min-date-time): Any XML element specifying a range of time
+ MUST have its start or end DATE or DATE-TIME values greater than
+ or equal to the value of the CALDAV:min-date-time property value
+ (Section 5.2.6) on the calendar collections being targeted by the
+ REPORT request;
+
+ (CALDAV:max-date-time): Any XML element specifying a range of time
+ MUST have its start or end DATE or DATE-TIME values less than or
+ equal to the value of the CALDAV:max-date-time property value
+ (Section 5.2.7) on the calendar collections being targeted by the
+ REPORT request;
+
+ (CALDAV:supported-collation): Any XML attribute specifying a
+ collation MUST specify a collation supported by the server as
+ described in Section 7.5.
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 37]
+
+RFC 4791 CalDAV March 2007
+
+
+ Postconditions:
+
+ (DAV:number-of-matches-within-limits): The number of matching
+ calendar object resources must fall within server-specific,
+ predefined limits. For example, this condition might be triggered
+ if a search specification would cause the return of an extremely
+ large number of responses.
+
+7.8.1. Example: Partial Retrieval of Events by Time Range
+
+ In this example, the client requests the server to return specific
+ components and properties of the VEVENT components that overlap the
+ time range from January 4, 2006, at 00:00:00 A.M. UTC to January 5,
+ 2006, at 00:00:00 A.M. UTC. In addition, the DAV:getetag property is
+ also requested and returned as part of the response. Note that the
+ first calendar object returned is a recurring event whose first
+ instance lies outside the requested time range, but whose third
+ instance does overlap the time range. Note that due to the CALDAV:
+ calendar-data element restrictions, the DTSTAMP property in VEVENT
+ components has not been returned, and the only property returned in
+ the VCALENDAR object is VERSION.
+
+ See Appendix B for the calendar data being targeted by this example.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 38]
+
+RFC 4791 CalDAV March 2007
+
+
+ >> Request <<
+
+ REPORT /bernard/work/ HTTP/1.1
+ Host: cal.example.com
+ Depth: 1
+ Content-Type: application/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <C:calendar-query xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:prop>
+ <D:getetag/>
+ <C:calendar-data>
+ <C:comp name="VCALENDAR">
+ <C:prop name="VERSION"/>
+ <C:comp name="VEVENT">
+ <C:prop name="SUMMARY"/>
+ <C:prop name="UID"/>
+ <C:prop name="DTSTART"/>
+ <C:prop name="DTEND"/>
+ <C:prop name="DURATION"/>
+ <C:prop name="RRULE"/>
+ <C:prop name="RDATE"/>
+ <C:prop name="EXRULE"/>
+ <C:prop name="EXDATE"/>
+ <C:prop name="RECURRENCE-ID"/>
+ </C:comp>
+ <C:comp name="VTIMEZONE"/>
+ </C:comp>
+ </C:calendar-data>
+ </D:prop>
+ <C:filter>
+ <C:comp-filter name="VCALENDAR">
+ <C:comp-filter name="VEVENT">
+ <C:time-range start="20060104T000000Z"
+ end="20060105T000000Z"/>
+ </C:comp-filter>
+ </C:comp-filter>
+ </C:filter>
+ </C:calendar-query>
+
+ >> Response <<
+
+ HTTP/1.1 207 Multi-Status
+ Date: Sat, 11 Nov 2006 09:32:12 GMT
+ Content-Type: application/xml; charset="utf-8"
+ Content-Length: xxxx
+
+
+
+Daboo, et al. Standards Track [Page 39]
+
+RFC 4791 CalDAV March 2007
+
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:multistatus xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:response>
+ <D:href>http://cal.example.com/bernard/work/abcd2.ics</D:href>
+ <D:propstat>
+ <D:prop>
+ <D:getetag>"fffff-abcd2"</D:getetag>
+ <C:calendar-data>BEGIN:VCALENDAR
+ VERSION:2.0
+ BEGIN:VTIMEZONE
+ LAST-MODIFIED:20040110T032845Z
+ TZID:US/Eastern
+ BEGIN:DAYLIGHT
+ DTSTART:20000404T020000
+ RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+ TZNAME:EDT
+ TZOFFSETFROM:-0500
+ TZOFFSETTO:-0400
+ END:DAYLIGHT
+ BEGIN:STANDARD
+ DTSTART:20001026T020000
+ RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+ TZNAME:EST
+ TZOFFSETFROM:-0400
+ TZOFFSETTO:-0500
+ END:STANDARD
+ END:VTIMEZONE
+ BEGIN:VEVENT
+ DTSTART;TZID=US/Eastern:20060102T120000
+ DURATION:PT1H
+ RRULE:FREQ=DAILY;COUNT=5
+ SUMMARY:Event #2
+ UID:00959BC664CA650E933C892C@example.com
+ END:VEVENT
+ BEGIN:VEVENT
+ DTSTART;TZID=US/Eastern:20060104T140000
+ DURATION:PT1H
+ RECURRENCE-ID;TZID=US/Eastern:20060104T120000
+ SUMMARY:Event #2 bis
+ UID:00959BC664CA650E933C892C@example.com
+ END:VEVENT
+ BEGIN:VEVENT
+ DTSTART;TZID=US/Eastern:20060106T140000
+ DURATION:PT1H
+ RECURRENCE-ID;TZID=US/Eastern:20060106T120000
+ SUMMARY:Event #2 bis bis
+ UID:00959BC664CA650E933C892C@example.com
+
+
+
+Daboo, et al. Standards Track [Page 40]
+
+RFC 4791 CalDAV March 2007
+
+
+ END:VEVENT
+ END:VCALENDAR
+ </C:calendar-data>
+ </D:prop>
+ <D:status>HTTP/1.1 200 OK</D:status>
+ </D:propstat>
+ </D:response>
+ <D:response>
+ <D:href>http://cal.example.com/bernard/work/abcd3.ics</D:href>
+ <D:propstat>
+ <D:prop>
+ <D:getetag>"fffff-abcd3"</D:getetag>
+ <C:calendar-data>BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//Example Corp.//CalDAV Client//EN
+ BEGIN:VTIMEZONE
+ LAST-MODIFIED:20040110T032845Z
+ TZID:US/Eastern
+ BEGIN:DAYLIGHT
+ DTSTART:20000404T020000
+ RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+ TZNAME:EDT
+ TZOFFSETFROM:-0500
+ TZOFFSETTO:-0400
+ END:DAYLIGHT
+ BEGIN:STANDARD
+ DTSTART:20001026T020000
+ RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+ TZNAME:EST
+ TZOFFSETFROM:-0400
+ TZOFFSETTO:-0500
+ END:STANDARD
+ END:VTIMEZONE
+ BEGIN:VEVENT
+ DTSTART;TZID=US/Eastern:20060104T100000
+ DURATION:PT1H
+ SUMMARY:Event #3
+ UID:DC6C50A017428C5216A2F1CD@example.com
+ END:VEVENT
+ END:VCALENDAR
+ </C:calendar-data>
+ </D:prop>
+ <D:status>HTTP/1.1 200 OK</D:status>
+ </D:propstat>
+ </D:response>
+ </D:multistatus>
+
+
+
+
+
+Daboo, et al. Standards Track [Page 41]
+
+RFC 4791 CalDAV March 2007
+
+
+7.8.2. Example: Partial Retrieval of Recurring Events
+
+ In this example, the client requests the server to return VEVENT
+ components that overlap the time range from January 3, 2006, at 00:
+ 00:00 A.M. UTC to January 5, 2006, at 00:00:00 A.M. UTC. Use of the
+ CALDAV:limit-recurrence-set element causes the server to only return
+ overridden recurrence components that overlap the time range
+ specified in that element or that affect other instances that overlap
+ the time range (e.g., in the case of a THISANDFUTURE behavior). In
+ this example, the first overridden component in the matching resource
+ is returned, but the second one is not.
+
+ See Appendix B for the calendar data being targeted by this example.
+
+ >> Request <<
+
+ REPORT /bernard/work/ HTTP/1.1
+ Host: cal.example.com
+ Depth: 1
+ Content-Type: application/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <C:calendar-query xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:prop>
+ <C:calendar-data>
+ <C:limit-recurrence-set start="20060103T000000Z"
+ end="20060105T000000Z"/>
+ </C:calendar-data>
+ </D:prop>
+ <C:filter>
+ <C:comp-filter name="VCALENDAR">
+ <C:comp-filter name="VEVENT">
+ <C:time-range start="20060103T000000Z"
+ end="20060105T000000Z"/>
+ </C:comp-filter>
+ </C:comp-filter>
+ </C:filter>
+ </C:calendar-query>
+
+ >> Response <<
+
+ HTTP/1.1 207 Multi-Status
+ Date: Sat, 11 Nov 2006 09:32:12 GMT
+ Content-Type: application/xml; charset="utf-8"
+ Content-Length: xxxx
+
+
+
+
+Daboo, et al. Standards Track [Page 42]
+
+RFC 4791 CalDAV March 2007
+
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:multistatus xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:response>
+ <D:href>http://cal.example.com/bernard/work/abcd2.ics</D:href>
+ <D:propstat>
+ <D:prop>
+ <D:getetag>"fffff-abcd2"</D:getetag>
+ <C:calendar-data>BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//Example Corp.//CalDAV Client//EN
+ BEGIN:VTIMEZONE
+ LAST-MODIFIED:20040110T032845Z
+ TZID:US/Eastern
+ BEGIN:DAYLIGHT
+ DTSTART:20000404T020000
+ RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+ TZNAME:EDT
+ TZOFFSETFROM:-0500
+ TZOFFSETTO:-0400
+ END:DAYLIGHT
+ BEGIN:STANDARD
+ DTSTART:20001026T020000
+ RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+ TZNAME:EST
+ TZOFFSETFROM:-0400
+ TZOFFSETTO:-0500
+ END:STANDARD
+ END:VTIMEZONE
+ BEGIN:VEVENT
+ DTSTAMP:20060206T001121Z
+ DTSTART;TZID=US/Eastern:20060102T120000
+ DURATION:PT1H
+ RRULE:FREQ=DAILY;COUNT=5
+ SUMMARY:Event #2
+ UID:00959BC664CA650E933C892C@example.com
+ END:VEVENT
+ BEGIN:VEVENT
+ DTSTAMP:20060206T001121Z
+ DTSTART;TZID=US/Eastern:20060104T140000
+ DURATION:PT1H
+ RECURRENCE-ID;TZID=US/Eastern:20060104T120000
+ SUMMARY:Event #2 bis
+ UID:00959BC664CA650E933C892C@example.com
+ END:VEVENT
+ END:VCALENDAR
+ </C:calendar-data>
+ </D:prop>
+
+
+
+Daboo, et al. Standards Track [Page 43]
+
+RFC 4791 CalDAV March 2007
+
+
+ <D:status>HTTP/1.1 200 OK</D:status>
+ </D:propstat>
+ </D:response>
+ <D:response>
+ <D:href>http://cal.example.com/bernard/work/abcd3.ics</D:href>
+ <D:propstat>
+ <D:prop>
+ <D:getetag>"fffff-abcd3"</D:getetag>
+ <C:calendar-data>BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//Example Corp.//CalDAV Client//EN
+ BEGIN:VTIMEZONE
+ LAST-MODIFIED:20040110T032845Z
+ TZID:US/Eastern
+ BEGIN:DAYLIGHT
+ DTSTART:20000404T020000
+ RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+ TZNAME:EDT
+ TZOFFSETFROM:-0500
+ TZOFFSETTO:-0400
+ END:DAYLIGHT
+ BEGIN:STANDARD
+ DTSTART:20001026T020000
+ RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+ TZNAME:EST
+ TZOFFSETFROM:-0400
+ TZOFFSETTO:-0500
+ END:STANDARD
+ END:VTIMEZONE
+ BEGIN:VEVENT
+ ATTENDEE;PARTSTAT=ACCEPTED;ROLE=CHAIR:mailto:cyrus@example.com
+ ATTENDEE;PARTSTAT=NEEDS-ACTION:mailto:lisa@example.com
+ DTSTAMP:20060206T001220Z
+ DTSTART;TZID=US/Eastern:20060104T100000
+ DURATION:PT1H
+ LAST-MODIFIED:20060206T001330Z
+ ORGANIZER:mailto:cyrus@example.com
+ SEQUENCE:1
+ STATUS:TENTATIVE
+ SUMMARY:Event #3
+ UID:DC6C50A017428C5216A2F1CD@example.com
+ X-ABC-GUID:E1CX5Dr-0007ym-Hz@example.com
+ END:VEVENT
+ END:VCALENDAR
+ </C:calendar-data>
+ </D:prop>
+ <D:status>HTTP/1.1 200 OK</D:status>
+ </D:propstat>
+
+
+
+Daboo, et al. Standards Track [Page 44]
+
+RFC 4791 CalDAV March 2007
+
+
+ </D:response>
+ </D:multistatus>
+
+7.8.3. Example: Expanded Retrieval of Recurring Events
+
+ In this example, the client requests the server to return VEVENT
+ components that overlap the time range from January 2, 2006, at 00:
+ 00:00 A.M. UTC to January 5, 2006, at 00:00:00 A.M. UTC and to return
+ recurring calendar components expanded into individual recurrence
+ instance calendar components. Use of the CALDAV:expand element
+ causes the server to only return overridden recurrence instances that
+ overlap the time range specified in that element.
+
+ See Appendix B for the calendar data being targeted by this example.
+
+ >> Request <<
+
+ REPORT /bernard/work/ HTTP/1.1
+ Host: cal.example.com
+ Depth: 1
+ Content-Type: application/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <C:calendar-query xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:prop>
+ <C:calendar-data>
+ <C:expand start="20060103T000000Z"
+ end="20060105T000000Z"/>
+ </C:calendar-data>
+ </D:prop>
+ <C:filter>
+ <C:comp-filter name="VCALENDAR">
+ <C:comp-filter name="VEVENT">
+ <C:time-range start="20060103T000000Z"
+ end="20060105T000000Z"/>
+ </C:comp-filter>
+ </C:comp-filter>
+ </C:filter>
+ </C:calendar-query>
+
+ >> Response <<
+
+ HTTP/1.1 207 Multi-Status
+ Date: Sat, 11 Nov 2006 09:32:12 GMT
+ Content-Type: application/xml; charset="utf-8"
+ Content-Length: xxxx
+
+
+
+Daboo, et al. Standards Track [Page 45]
+
+RFC 4791 CalDAV March 2007
+
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:multistatus xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:response>
+ <D:href>http://cal.example.com/bernard/work/abcd2.ics</D:href>
+ <D:propstat>
+ <D:prop>
+ <D:getetag>"fffff-abcd2"</D:getetag>
+ <C:calendar-data>BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//Example Corp.//CalDAV Client//EN
+ BEGIN:VEVENT
+ DTSTAMP:20060206T001121Z
+ DTSTART:20060103T170000
+ DURATION:PT1H
+ RECURRENCE-ID:20060103T170000
+ SUMMARY:Event #2
+ UID:00959BC664CA650E933C892C@example.com
+ END:VEVENT
+ BEGIN:VEVENT
+ DTSTAMP:20060206T001121Z
+ DTSTART:20060104T190000
+ DURATION:PT1H
+ RECURRENCE-ID:20060104T170000
+ SUMMARY:Event #2 bis
+ UID:00959BC664CA650E933C892C@example.com
+ END:VEVENT
+ END:VCALENDAR
+ </C:calendar-data>
+ </D:prop>
+ <D:status>HTTP/1.1 200 OK</D:status>
+ </D:propstat>
+ </D:response>
+ <D:response>
+ <D:href>http://cal.example.com/bernard/work/abcd3.ics</D:href>
+ <D:propstat>
+ <D:prop>
+ <D:getetag>"fffff-abcd3"</D:getetag>
+ <C:calendar-data>BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//Example Corp.//CalDAV Client//EN
+ BEGIN:VEVENT
+ ATTENDEE;PARTSTAT=ACCEPTED;ROLE=CHAIR:mailto:cyrus@example.com
+ ATTENDEE;PARTSTAT=NEEDS-ACTION:mailto:lisa@example.com
+ DTSTAMP:20060206T001220Z
+ DTSTART:20060104T150000
+ DURATION:PT1H
+ LAST-MODIFIED:20060206T001330Z
+
+
+
+Daboo, et al. Standards Track [Page 46]
+
+RFC 4791 CalDAV March 2007
+
+
+ ORGANIZER:mailto:cyrus@example.com
+ SEQUENCE:1
+ STATUS:TENTATIVE
+ SUMMARY:Event #3
+ UID:DC6C50A017428C5216A2F1CD@example.com
+ X-ABC-GUID:E1CX5Dr-0007ym-Hz@example.com
+ END:VEVENT
+ END:VCALENDAR
+ </C:calendar-data>
+ </D:prop>
+ <D:status>HTTP/1.1 200 OK</D:status>
+ </D:propstat>
+ </D:response>
+ </D:multistatus>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 47]
+
+RFC 4791 CalDAV March 2007
+
+
+7.8.4. Example: Partial Retrieval of Stored Free Busy Components
+
+ In this example, the client requests the server to return the
+ VFREEBUSY components that have free busy information that overlap the
+ time range from January 2, 2006, at 00:00:00 A.M. UTC (inclusively)
+ to January 3, 2006, at 00:00:00 A.M. UTC (exclusively). Use of the
+ CALDAV:limit-freebusy-set element causes the server to only return
+ the FREEBUSY property values that overlap the time range specified in
+ that element. Note that this is not an example of discovering when
+ the calendar owner is busy.
+
+ See Appendix B for the calendar data being targeted by this example.
+
+ >> Request <<
+
+ REPORT /bernard/work/ HTTP/1.1
+ Host: cal.example.com
+ Depth: 1
+ Content-Type: application/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <C:calendar-query xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:prop>
+ <C:calendar-data>
+ <C:limit-freebusy-set start="20060102T000000Z"
+ end="20060103T000000Z"/>
+ </C:calendar-data>
+ </D:prop>
+ <C:filter>
+ <C:comp-filter name="VCALENDAR">
+ <C:comp-filter name="VFREEBUSY">
+ <C:time-range start="20060102T000000Z"
+ end="20060103T000000Z"/>
+ </C:comp-filter>
+ </C:comp-filter>
+ </C:filter>
+ </C:calendar-query>
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 48]
+
+RFC 4791 CalDAV March 2007
+
+
+ >> Response <<
+
+ HTTP/1.1 207 Multi-Status
+ Date: Sat, 11 Nov 2006 09:32:12 GMT
+ Content-Type: application/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:multistatus xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:response>
+ <D:href>http://cal.example.com/bernard/work/abcd8.ics</D:href>
+ <D:propstat>
+ <D:prop>
+ <D:getetag>"fffff-abcd8"</D:getetag>
+ <C:calendar-data>BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//Example Corp.//CalDAV Client//EN
+ BEGIN:VFREEBUSY
+ ORGANIZER;CN="Bernard Desruisseaux":mailto:bernard@example.com
+ UID:76ef34-54a3d2@example.com
+ DTSTAMP:20050530T123421Z
+ DTSTART:20060101T100000Z
+ DTEND:20060108T100000Z
+ FREEBUSY;FBTYPE=BUSY-TENTATIVE:20060102T100000Z/20060102T120000Z
+ END:VFREEBUSY
+ END:VCALENDAR
+ </C:calendar-data>
+ </D:prop>
+ <D:status>HTTP/1.1 200 OK</D:status>
+ </D:propstat>
+ </D:response>
+ </D:multistatus>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 49]
+
+RFC 4791 CalDAV March 2007
+
+
+7.8.5. Example: Retrieval of To-Dos by Alarm Time Range
+
+ In this example, the client requests the server to return the VTODO
+ components that have an alarm trigger scheduled in the specified time
+ range.
+
+ See Appendix B for the calendar data being targeted by this example.
+
+ >> Request <<
+
+ REPORT /bernard/work/ HTTP/1.1
+ Host: cal.example.com
+ Depth: 1
+ Content-Type: application/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <C:calendar-query xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:prop xmlns:D="DAV:">
+ <D:getetag/>
+ <C:calendar-data/>
+ </D:prop>
+ <C:filter>
+ <C:comp-filter name="VCALENDAR">
+ <C:comp-filter name="VTODO">
+ <C:comp-filter name="VALARM">
+ <C:time-range start="20060106T100000Z"
+ end="20060107T100000Z"/>
+ </C:comp-filter>
+ </C:comp-filter>
+ </C:comp-filter>
+ </C:filter>
+ </C:calendar-query>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 50]
+
+RFC 4791 CalDAV March 2007
+
+
+ >> Response <<
+
+ HTTP/1.1 207 Multi-Status
+ Date: Sat, 11 Nov 2006 09:32:12 GMT
+ Content-Type: application/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:multistatus xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:response>
+ <D:href>http://cal.example.com/bernard/work/abcd4.ics</D:href>
+ <D:propstat>
+ <D:prop>
+ <D:getetag>"fffff-abcd4"</D:getetag>
+ <C:calendar-data>BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//Example Corp.//CalDAV Client//EN
+ BEGIN:VTODO
+ DTSTAMP:20060205T235300Z
+ DUE;TZID=US/Eastern:20060106T120000
+ LAST-MODIFIED:20060205T235308Z
+ SEQUENCE:1
+ STATUS:NEEDS-ACTION
+ SUMMARY:Task #2
+ UID:E10BA47467C5C69BB74E8720@example.com
+ BEGIN:VALARM
+ ACTION:AUDIO
+ TRIGGER;RELATED=START:-PT10M
+ END:VALARM
+ END:VTODO
+ END:VCALENDAR
+ </C:calendar-data>
+ </D:prop>
+ <D:status>HTTP/1.1 200 OK</D:status>
+ </D:propstat>
+ </D:response>
+ </D:multistatus>
+
+7.8.6. Example: Retrieval of Event by UID
+
+ In this example, the client requests the server to return the VEVENT
+ component that has the UID property set to
+ "DC6C50A017428C5216A2F1CD@example.com".
+
+ See Appendix B for the calendar data being targeted by this example.
+
+
+
+
+
+Daboo, et al. Standards Track [Page 51]
+
+RFC 4791 CalDAV March 2007
+
+
+ >> Request <<
+
+ REPORT /bernard/work/ HTTP/1.1
+ Host: cal.example.com
+ Depth: 1
+ Content-Type: application/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <C:calendar-query xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:prop xmlns:D="DAV:">
+ <D:getetag/>
+ <C:calendar-data/>
+ </D:prop>
+ <C:filter>
+ <C:comp-filter name="VCALENDAR">
+ <C:comp-filter name="VEVENT">
+ <C:prop-filter name="UID">
+ <C:text-match collation="i;octet"
+ >DC6C50A017428C5216A2F1CD@example.com</C:text-match>
+ </C:prop-filter>
+ </C:comp-filter>
+ </C:comp-filter>
+ </C:filter>
+ </C:calendar-query>
+
+ >> Response <<
+
+ HTTP/1.1 207 Multi-Status
+ Date: Sat, 11 Nov 2006 09:32:12 GMT
+ Content-Type: application/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:multistatus xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:response>
+ <D:href>http://cal.example.com/bernard/work/abcd3.ics</D:href>
+ <D:propstat>
+ <D:prop>
+ <D:getetag>"fffff-abcd3"</D:getetag>
+ <C:calendar-data>BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//Example Corp.//CalDAV Client//EN
+ BEGIN:VTIMEZONE
+ LAST-MODIFIED:20040110T032845Z
+ TZID:US/Eastern
+ BEGIN:DAYLIGHT
+
+
+
+Daboo, et al. Standards Track [Page 52]
+
+RFC 4791 CalDAV March 2007
+
+
+ DTSTART:20000404T020000
+ RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+ TZNAME:EDT
+ TZOFFSETFROM:-0500
+ TZOFFSETTO:-0400
+ END:DAYLIGHT
+ BEGIN:STANDARD
+ DTSTART:20001026T020000
+ RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+ TZNAME:EST
+ TZOFFSETFROM:-0400
+ TZOFFSETTO:-0500
+ END:STANDARD
+ END:VTIMEZONE
+ BEGIN:VEVENT
+ ATTENDEE;PARTSTAT=ACCEPTED;ROLE=CHAIR:mailto:cyrus@example.com
+ ATTENDEE;PARTSTAT=NEEDS-ACTION:mailto:lisa@example.com
+ DTSTAMP:20060206T001220Z
+ DTSTART;TZID=US/Eastern:20060104T100000
+ DURATION:PT1H
+ LAST-MODIFIED:20060206T001330Z
+ ORGANIZER:mailto:cyrus@example.com
+ SEQUENCE:1
+ STATUS:TENTATIVE
+ SUMMARY:Event #3
+ UID:DC6C50A017428C5216A2F1CD@example.com
+ X-ABC-GUID:E1CX5Dr-0007ym-Hz@example.com
+ END:VEVENT
+ END:VCALENDAR
+ </C:calendar-data>
+ </D:prop>
+ <D:status>HTTP/1.1 200 OK</D:status>
+ </D:propstat>
+ </D:response>
+ </D:multistatus>
+
+7.8.7. Example: Retrieval of Events by PARTSTAT
+
+ In this example, the client requests the server to return the VEVENT
+ components that have the ATTENDEE property with the value
+ "mailto:lisa@example.com" and for which the PARTSTAT parameter is set
+ to NEEDS-ACTION.
+
+ See Appendix B for the calendar data being targeted by this example.
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 53]
+
+RFC 4791 CalDAV March 2007
+
+
+ >> Request <<
+
+ REPORT /bernard/work/ HTTP/1.1
+ Host: cal.example.com
+ Depth: 1
+ Content-Type: application/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <C:calendar-query xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:prop xmlns:D="DAV:">
+ <D:getetag/>
+ <C:calendar-data/>
+ </D:prop>
+ <C:filter>
+ <C:comp-filter name="VCALENDAR">
+ <C:comp-filter name="VEVENT">
+ <C:prop-filter name="ATTENDEE">
+ <C:text-match collation="i;ascii-casemap"
+ >mailto:lisa@example.com</C:text-match>
+ <C:param-filter name="PARTSTAT">
+ <C:text-match collation="i;ascii-casemap"
+ >NEEDS-ACTION</C:text-match>
+ </C:param-filter>
+ </C:prop-filter>
+ </C:comp-filter>
+ </C:comp-filter>
+ </C:filter>
+ </C:calendar-query>
+
+ >> Response <<
+
+ HTTP/1.1 207 Multi-Status
+ Date: Sat, 11 Nov 2006 09:32:12 GMT
+ Content-Type: application/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:multistatus xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:response>
+ <D:href>http://cal.example.com/bernard/work/abcd3.ics</D:href>
+ <D:propstat>
+ <D:prop>
+ <D:getetag>"fffff-abcd3"</D:getetag>
+ <C:calendar-data>BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//Example Corp.//CalDAV Client//EN
+
+
+
+Daboo, et al. Standards Track [Page 54]
+
+RFC 4791 CalDAV March 2007
+
+
+ BEGIN:VTIMEZONE
+ LAST-MODIFIED:20040110T032845Z
+ TZID:US/Eastern
+ BEGIN:DAYLIGHT
+ DTSTART:20000404T020000
+ RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+ TZNAME:EDT
+ TZOFFSETFROM:-0500
+ TZOFFSETTO:-0400
+ END:DAYLIGHT
+ BEGIN:STANDARD
+ DTSTART:20001026T020000
+ RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+ TZNAME:EST
+ TZOFFSETFROM:-0400
+ TZOFFSETTO:-0500
+ END:STANDARD
+ END:VTIMEZONE
+ BEGIN:VEVENT
+ ATTENDEE;PARTSTAT=ACCEPTED;ROLE=CHAIR:mailto:cyrus@example.com
+ ATTENDEE;PARTSTAT=NEEDS-ACTION:mailto:lisa@example.com
+ DTSTAMP:20060206T001220Z
+ DTSTART;TZID=US/Eastern:20060104T100000
+ DURATION:PT1H
+ LAST-MODIFIED:20060206T001330Z
+ ORGANIZER:mailto:cyrus@example.com
+ SEQUENCE:1
+ STATUS:TENTATIVE
+ SUMMARY:Event #3
+ UID:DC6C50A017428C5216A2F1CD@example.com
+ X-ABC-GUID:E1CX5Dr-0007ym-Hz@example.com
+ END:VEVENT
+ END:VCALENDAR
+ </C:calendar-data>
+ </D:prop>
+ <D:status>HTTP/1.1 200 OK</D:status>
+ </D:propstat>
+ </D:response>
+ </D:multistatus>
+
+7.8.8. Example: Retrieval of Events Only
+
+ In this example, the client requests the server to return all VEVENT
+ components.
+
+ See Appendix B for the calendar data being targeted by this example.
+
+
+
+
+
+Daboo, et al. Standards Track [Page 55]
+
+RFC 4791 CalDAV March 2007
+
+
+ >> Request <<
+
+ REPORT /bernard/work/ HTTP/1.1
+ Host: cal.example.com
+ Depth: 1
+ Content-Type: application/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <C:calendar-query xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:prop xmlns:D="DAV:">
+ <D:getetag/>
+ <C:calendar-data/>
+ </D:prop>
+ <C:filter>
+ <C:comp-filter name="VCALENDAR">
+ <C:comp-filter name="VEVENT"/>
+ </C:comp-filter>
+ </C:filter>
+ </C:calendar-query>
+
+ >> Response <<
+
+ HTTP/1.1 207 Multi-Status
+ Date: Sat, 11 Nov 2006 09:32:12 GMT
+ Content-Type: application/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:multistatus xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:response>
+ <D:href>http://cal.example.com/bernard/work/abcd1.ics</D:href>
+ <D:propstat>
+ <D:prop>
+ <D:getetag>"fffff-abcd1"</D:getetag>
+ <C:calendar-data>BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//Example Corp.//CalDAV Client//EN
+ BEGIN:VTIMEZONE
+ LAST-MODIFIED:20040110T032845Z
+ TZID:US/Eastern
+ BEGIN:DAYLIGHT
+ DTSTART:20000404T020000
+ RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+ TZNAME:EDT
+ TZOFFSETFROM:-0500
+ TZOFFSETTO:-0400
+
+
+
+Daboo, et al. Standards Track [Page 56]
+
+RFC 4791 CalDAV March 2007
+
+
+ END:DAYLIGHT
+ BEGIN:STANDARD
+ DTSTART:20001026T020000
+ RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+ TZNAME:EST
+ TZOFFSETFROM:-0400
+ TZOFFSETTO:-0500
+ END:STANDARD
+ END:VTIMEZONE
+ BEGIN:VEVENT
+ DTSTAMP:20060206T001102Z
+ DTSTART;TZID=US/Eastern:20060102T100000
+ DURATION:PT1H
+ SUMMARY:Event #1
+ Description:Go Steelers!
+ UID:74855313FA803DA593CD579A@example.com
+ END:VEVENT
+ END:VCALENDAR
+ </C:calendar-data>
+ </D:prop>
+ <D:status>HTTP/1.1 200 OK</D:status>
+ </D:propstat>
+ </D:response>
+ <D:response>
+ <D:href>http://cal.example.com/bernard/work/abcd2.ics</D:href>
+ <D:propstat>
+ <D:prop>
+ <D:getetag>"fffff-abcd2"</D:getetag>
+ <C:calendar-data>BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//Example Corp.//CalDAV Client//EN
+ BEGIN:VTIMEZONE
+ LAST-MODIFIED:20040110T032845Z
+ TZID:US/Eastern
+ BEGIN:DAYLIGHT
+ DTSTART:20000404T020000
+ RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+ TZNAME:EDT
+ TZOFFSETFROM:-0500
+ TZOFFSETTO:-0400
+ END:DAYLIGHT
+ BEGIN:STANDARD
+ DTSTART:20001026T020000
+ RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+ TZNAME:EST
+ TZOFFSETFROM:-0400
+ TZOFFSETTO:-0500
+ END:STANDARD
+
+
+
+Daboo, et al. Standards Track [Page 57]
+
+RFC 4791 CalDAV March 2007
+
+
+ END:VTIMEZONE
+ BEGIN:VEVENT
+ DTSTAMP:20060206T001121Z
+ DTSTART;TZID=US/Eastern:20060102T120000
+ DURATION:PT1H
+ RRULE:FREQ=DAILY;COUNT=5
+ SUMMARY:Event #2
+ UID:00959BC664CA650E933C892C@example.com
+ END:VEVENT
+ BEGIN:VEVENT
+ DTSTAMP:20060206T001121Z
+ DTSTART;TZID=US/Eastern:20060104T140000
+ DURATION:PT1H
+ RECURRENCE-ID;TZID=US/Eastern:20060104T120000
+ SUMMARY:Event #2 bis
+ UID:00959BC664CA650E933C892C@example.com
+ END:VEVENT
+ BEGIN:VEVENT
+ DTSTAMP:20060206T001121Z
+ DTSTART;TZID=US/Eastern:20060106T140000
+ DURATION:PT1H
+ RECURRENCE-ID;TZID=US/Eastern:20060106T120000
+ SUMMARY:Event #2 bis bis
+ UID:00959BC664CA650E933C892C@example.com
+ END:VEVENT
+ END:VCALENDAR
+ </C:calendar-data>
+ </D:prop>
+ <D:status>HTTP/1.1 200 OK</D:status>
+ </D:propstat>
+ </D:response>
+ <D:response>
+ <D:href>http://cal.example.com/bernard/work/abcd3.ics</D:href>
+ <D:propstat>
+ <D:prop>
+ <D:getetag>"fffff-abcd3"</D:getetag>
+ <C:calendar-data>BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//Example Corp.//CalDAV Client//EN
+ BEGIN:VTIMEZONE
+ LAST-MODIFIED:20040110T032845Z
+ TZID:US/Eastern
+ BEGIN:DAYLIGHT
+ DTSTART:20000404T020000
+ RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+ TZNAME:EDT
+ TZOFFSETFROM:-0500
+ TZOFFSETTO:-0400
+
+
+
+Daboo, et al. Standards Track [Page 58]
+
+RFC 4791 CalDAV March 2007
+
+
+ END:DAYLIGHT
+ BEGIN:STANDARD
+ DTSTART:20001026T020000
+ RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+ TZNAME:EST
+ TZOFFSETFROM:-0400
+ TZOFFSETTO:-0500
+ END:STANDARD
+ END:VTIMEZONE
+ BEGIN:VEVENT
+ ATTENDEE;PARTSTAT=ACCEPTED;ROLE=CHAIR:mailto:cyrus@example.com
+ ATTENDEE;PARTSTAT=NEEDS-ACTION:mailto:lisa@example.com
+ DTSTAMP:20060206T001220Z
+ DTSTART;TZID=US/Eastern:20060104T100000
+ DURATION:PT1H
+ LAST-MODIFIED:20060206T001330Z
+ ORGANIZER:mailto:cyrus@example.com
+ SEQUENCE:1
+ STATUS:TENTATIVE
+ SUMMARY:Event #3
+ UID:DC6C50A017428C5216A2F1CD@example.com
+ X-ABC-GUID:E1CX5Dr-0007ym-Hz@example.com
+ END:VEVENT
+ END:VCALENDAR
+ </C:calendar-data>
+ </D:prop>
+ <D:status>HTTP/1.1 200 OK</D:status>
+ </D:propstat>
+ </D:response>
+ </D:multistatus>
+
+7.8.9. Example: Retrieval of All Pending To-Dos
+
+ In this example, the client requests the server to return all VTODO
+ components that do not include a COMPLETED property and do not have a
+ STATUS property value matching CANCELLED, i.e., VTODOs that still
+ need to be worked on.
+
+ See Appendix B for the calendar data being targeted by this example.
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 59]
+
+RFC 4791 CalDAV March 2007
+
+
+ >> Request <<
+
+ REPORT /bernard/work/ HTTP/1.1
+ Host: cal.example.com
+ Depth: 1
+ Content-Type: application/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <C:calendar-query xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:prop xmlns:D="DAV:">
+ <D:getetag/>
+ <C:calendar-data/>
+ </D:prop>
+ <C:filter>
+ <C:comp-filter name="VCALENDAR">
+ <C:comp-filter name="VTODO">
+ <C:prop-filter name="COMPLETED">
+ <C:is-not-defined/>
+ </C:prop-filter>
+ <C:prop-filter name="STATUS">
+ <C:text-match
+ negate-condition="yes">CANCELLED</C:text-match>
+ </C:prop-filter>
+ </C:comp-filter>
+ </C:comp-filter>
+ </C:filter>
+ </C:calendar-query>
+
+ >> Response <<
+
+ HTTP/1.1 207 Multi-Status
+ Date: Sat, 11 Nov 2006 09:32:12 GMT
+ Content-Type: application/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:multistatus xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:response>
+ <D:href>http://cal.example.com/bernard/work/abcd4.ics</D:href>
+ <D:propstat>
+ <D:prop>
+ <D:getetag>"fffff-abcd4"</D:getetag>
+ <C:calendar-data>BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//Example Corp.//CalDAV Client//EN
+ BEGIN:VTODO
+
+
+
+Daboo, et al. Standards Track [Page 60]
+
+RFC 4791 CalDAV March 2007
+
+
+ DTSTAMP:20060205T235335Z
+ DUE;VALUE=DATE:20060104
+ STATUS:NEEDS-ACTION
+ SUMMARY:Task #1
+ UID:DDDEEB7915FA61233B861457@example.com
+ BEGIN:VALARM
+ ACTION:AUDIO
+ TRIGGER;RELATED=START:-PT10M
+ END:VALARM
+ END:VTODO
+ END:VCALENDAR
+ </C:calendar-data>
+ </D:prop>
+ <D:status>HTTP/1.1 200 OK</D:status>
+ </D:propstat>
+ </D:response>
+
+ <D:response>
+ <D:href>http://cal.example.com/bernard/work/abcd5.ics</D:href>
+ <D:propstat>
+ <D:prop>
+ <D:getetag>"fffff-abcd5"</D:getetag>
+ <C:calendar-data>BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//Example Corp.//CalDAV Client//EN
+ BEGIN:VTODO
+ DTSTAMP:20060205T235300Z
+ DUE;VALUE=DATE:20060106
+ LAST-MODIFIED:20060205T235308Z
+ SEQUENCE:1
+ STATUS:NEEDS-ACTION
+ SUMMARY:Task #2
+ UID:E10BA47467C5C69BB74E8720@example.com
+ BEGIN:VALARM
+ ACTION:AUDIO
+ TRIGGER;RELATED=START:-PT10M
+ END:VALARM
+ END:VTODO
+ END:VCALENDAR
+ </C:calendar-data>
+ </D:prop>
+ <D:status>HTTP/1.1 200 OK</D:status>
+ </D:propstat>
+ </D:response>
+ </D:multistatus>
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 61]
+
+RFC 4791 CalDAV March 2007
+
+
+7.8.10. Example: Attempt to Query Unsupported Property
+
+ In this example, the client requests the server to return all VEVENT
+ components that include an X-ABC-GUID property with a value matching
+ "ABC". However, the server does not support querying that non-
+ standard property, and instead returns an error response.
+
+ See Appendix B for the calendar data being targeted by this example.
+
+ >> Request <<
+
+ REPORT /bernard/work/ HTTP/1.1
+ Host: cal.example.com
+ Depth: 1
+ Content-Type: application/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <C:calendar-query xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:prop xmlns:D="DAV:">
+ <D:getetag/>
+ <C:calendar-data/>
+ </D:prop>
+ <C:filter>
+ <C:comp-filter name="VCALENDAR">
+ <C:comp-filter name="VEVENT">
+ <C:prop-filter name="X-ABC-GUID">
+ <C:text-match>ABC</C:text-match>
+ </C:prop-filter>
+ </C:comp-filter>
+ </C:comp-filter>
+ </C:filter>
+ </C:calendar-query>
+
+ >> Response <<
+
+ HTTP/1.1 403 Forbidden
+ Date: Sat, 11 Nov 2005 09:32:12 GMT
+ Content-Type: application/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:error>
+ <C:supported-filter>
+ <C:prop-filter name="X-ABC-GUID"/>
+ </C:supported-filter>
+ </D:error>
+
+
+
+
+Daboo, et al. Standards Track [Page 62]
+
+RFC 4791 CalDAV March 2007
+
+
+7.9. CALDAV:calendar-multiget REPORT
+
+ The CALDAV:calendar-multiget REPORT is used to retrieve specific
+ calendar object resources from within a collection, if the Request-
+ URI is a collection, or to retrieve a specific calendar object
+ resource, if the Request-URI is a calendar object resource. This
+ report is similar to the CALDAV:calendar-query REPORT (see
+ Section 7.8), except that it takes a list of DAV:href elements,
+ instead of a CALDAV:filter element, to determine which calendar
+ object resources to return.
+
+ Support for the CALDAV:calendar-multiget REPORT is REQUIRED.
+
+ Marshalling:
+
+ The request body MUST be a CALDAV:calendar-multiget XML element
+ (see Section 9.10). If the Request-URI is a collection resource,
+ then the DAV:href elements MUST refer to calendar object resources
+ within that collection, and they MAY refer to calendar object
+ resources at any depth within the collection. As a result, the
+ "Depth" header MUST be ignored by the server and SHOULD NOT be
+ sent by the client. If the Request-URI refers to a non-collection
+ resource, then there MUST be a single DAV:href element that is
+ equivalent to the Request-URI.
+
+ The response body for a successful request MUST be a DAV:
+ multistatus XML element.
+
+ The response body for a successful CALDAV:calendar-multiget REPORT
+ request MUST contain a DAV:response element for each calendar
+ object resource referenced by the provided set of DAV:href
+ elements. Calendar data is being returned in the CALDAV:calendar-
+ data element inside the DAV:prop element.
+
+ In the case of an error accessing any of the provided DAV:href
+ resources, the server MUST return the appropriate error status
+ code in the DAV:status element of the corresponding DAV:response
+ element.
+
+ Preconditions:
+
+ (CALDAV:supported-calendar-data): The attributes "content-type"
+ and "version" of the CALDAV:calendar-data XML elements (see
+ Section 9.6) specify a media type supported by the server for
+ calendar object resources.
+
+ (CALDAV:min-date-time): Any XML element specifying a range of time
+ MUST have its start or end DATE or DATE-TIME values greater than
+
+
+
+Daboo, et al. Standards Track [Page 63]
+
+RFC 4791 CalDAV March 2007
+
+
+ or equal to the value of the CALDAV:min-date-time property value
+ (Section 5.2.6) on the calendar collections being targeted by the
+ REPORT request;
+
+ (CALDAV:max-date-time): Any XML element specifying a range of time
+ MUST have its start or end DATE or DATE-TIME values less than or
+ equal to the value of the CALDAV:max-date-time property value
+ (Section 5.2.7) on the calendar collections being targeted by the
+ REPORT request;
+
+ Postconditions:
+
+ None.
+
+7.9.1. Example: Successful CALDAV:calendar-multiget REPORT
+
+ In this example, the client requests the server to return specific
+ properties of the VEVENT components referenced by specific URIs. In
+ addition, the DAV:getetag property is also requested and returned as
+ part of the response. Note that in this example, the resource at
+ http://cal.example.com/bernard/work/mtg1.ics does not exist,
+ resulting in an error status response.
+
+ See Appendix B for the calendar data being targeted by this example.
+
+ >> Request <<
+
+ REPORT /bernard/work/ HTTP/1.1
+ Host: cal.example.com
+ Content-Type: application/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <C:calendar-multiget xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:prop>
+ <D:getetag/>
+ <C:calendar-data/>
+ </D:prop>
+ <D:href>/bernard/work/abcd1.ics</D:href>
+ <D:href>/bernard/work/mtg1.ics</D:href>
+ </C:calendar-multiget>
+
+ >> Response <<
+
+ HTTP/1.1 207 Multi-Status
+ Date: Sat, 11 Nov 2006 09:32:12 GMT
+ Content-Type: application/xml; charset="utf-8"
+
+
+
+Daboo, et al. Standards Track [Page 64]
+
+RFC 4791 CalDAV March 2007
+
+
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:multistatus xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:response>
+ <D:href>http://cal.example.com/bernard/work/abcd1.ics</D:href>
+ <D:propstat>
+ <D:prop>
+ <D:getetag>"fffff-abcd1"</D:getetag>
+ <C:calendar-data>BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//Example Corp.//CalDAV Client//EN
+ BEGIN:VTIMEZONE
+ LAST-MODIFIED:20040110T032845Z
+ TZID:US/Eastern
+ BEGIN:DAYLIGHT
+ DTSTART:20000404T020000
+ RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+ TZNAME:EDT
+ TZOFFSETFROM:-0500
+ TZOFFSETTO:-0400
+ END:DAYLIGHT
+ BEGIN:STANDARD
+ DTSTART:20001026T020000
+ RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+ TZNAME:EST
+ TZOFFSETFROM:-0400
+ TZOFFSETTO:-0500
+ END:STANDARD
+ END:VTIMEZONE
+ BEGIN:VEVENT
+ DTSTAMP:20060206T001102Z
+ DTSTART;TZID=US/Eastern:20060102T100000
+ DURATION:PT1H
+ SUMMARY:Event #1
+ Description:Go Steelers!
+ UID:74855313FA803DA593CD579A@example.com
+ END:VEVENT
+ END:VCALENDAR
+ </C:calendar-data>
+ </D:prop>
+ <D:status>HTTP/1.1 200 OK</D:status>
+ </D:propstat>
+ </D:response>
+ <D:response>
+ <D:href>http://cal.example.com/bernard/work/mtg1.ics</D:href>
+ <D:status>HTTP/1.1 404 Not Found</D:status>
+
+
+
+Daboo, et al. Standards Track [Page 65]
+
+RFC 4791 CalDAV March 2007
+
+
+ </D:response>
+ </D:multistatus>
+
+7.10. CALDAV:free-busy-query REPORT
+
+ The CALDAV:free-busy-query REPORT generates a VFREEBUSY component
+ containing free busy information for all the calendar object
+ resources targeted by the request and that have the CALDAV:read-free-
+ busy or DAV:read privilege granted to the current user.
+
+ Only VEVENT components without a TRANSP property or with the TRANSP
+ property set to OPAQUE, and VFREEBUSY components SHOULD be considered
+ in generating the free busy time information.
+
+ In the case of VEVENT components, the free or busy time type (FBTYPE)
+ of the FREEBUSY properties in the returned VFREEBUSY component SHOULD
+ be derived from the value of the TRANSP and STATUS properties, as
+ outlined in the table below:
+
+ +---------------------------++------------------+
+ | VEVENT || VFREEBUSY |
+ +-------------+-------------++------------------+
+ | TRANSP | STATUS || FBTYPE |
+ +=============+=============++==================+
+ | | CONFIRMED || BUSY |
+ | | (default) || |
+ | OPAQUE +-------------++------------------+
+ | (default) | CANCELLED || FREE |
+ | +-------------++------------------+
+ | | TENTATIVE || BUSY-TENTATIVE |
+ | +-------------++------------------+
+ | | x-name || BUSY or |
+ | | || x-name |
+ +-------------+-------------++------------------+
+ | | CONFIRMED || |
+ | TRANSPARENT | CANCELLED || FREE |
+ | | TENTATIVE || |
+ | | x-name || |
+ +-------------+-------------++------------------+
+
+ Duplicate busy time periods with the same FBTYPE parameter value
+ SHOULD NOT be specified in the returned VFREEBUSY component. Servers
+ SHOULD coalesce consecutive or overlapping busy time periods of the
+ same type. Busy time periods with different FBTYPE parameter values
+ MAY overlap.
+
+ Support for the CALDAV:free-busy-query REPORT is REQUIRED.
+
+
+
+
+Daboo, et al. Standards Track [Page 66]
+
+RFC 4791 CalDAV March 2007
+
+
+ Marshalling:
+
+ The request body MUST be a CALDAV:free-busy-query XML element (see
+ Section 9.11), which MUST contain exactly one CALDAV:time-range
+ XML element, as defined in Section 9.9.
+
+ The request MAY include a Depth header. If no Depth header is
+ included, Depth:0 is assumed.
+
+ The response body for a successful request MUST be an iCalendar
+ object that contains exactly one VFREEBUSY component that
+ describes the busy time intervals for the calendar object
+ resources containing VEVENT, or VFREEBUSY components that satisfy
+ the Depth value and for which the current user is at least granted
+ the CALDAV:read-free-busy privilege. If no calendar object
+ resources are found to satisfy these conditions, a VFREEBUSY
+ component with no FREEBUSY property MUST be returned. This report
+ only returns busy time information. Free time information can be
+ inferred from the returned busy time information.
+
+ If the current user is not granted the CALDAV:read-free-busy or
+ DAV:read privileges on the Request-URI, the CALDAV:free-busy-query
+ REPORT request MUST fail and return a 404 (Not Found) status
+ value. This restriction will prevent users from discovering URLs
+ of resources for which they are only granted the CALDAV:read-free-
+ busy privilege.
+
+ The CALDAV:free-busy-query REPORT request can only be run against
+ a collection (either a regular collection or a calendar
+ collection). An attempt to run the report on a calendar object
+ resource MUST fail and return a 403 (Forbidden) status value.
+
+ Preconditions:
+
+ None.
+
+ Postconditions:
+
+ (DAV:number-of-matches-within-limits): The number of matching
+ calendar object resources must fall within server-specific,
+ predefined limits. For example, this postcondition might fail if
+ the specified CALDAV:time-range would cause an extremely large
+ number of calendar object resources to be considered in computing
+ the response.
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 67]
+
+RFC 4791 CalDAV March 2007
+
+
+7.10.1. Example: Successful CALDAV:free-busy-query REPORT
+
+ In this example, the client requests the server to return free busy
+ information on the calendar collection /bernard/work/, between 9:00
+ A.M. and 5:00 P.M. EST (2:00 P.M. and 10:00 P.M. UTC) on the January
+ 4, 2006. The server responds, indicating two busy time intervals of
+ one hour, one of which is tentative.
+
+ See Appendix B for the calendar data being targeted by this example.
+
+ >> Request <<
+
+ REPORT /bernard/work/ HTTP/1.1
+ Host: cal.example.com
+ Depth: 1
+ Content-Type: application/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <C:free-busy-query xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <C:time-range start="20060104T140000Z"
+ end="20060105T220000Z"/>
+ </C:free-busy-query>
+
+ >> Response <<
+
+ HTTP/1.1 200 OK
+ Date: Sat, 11 Nov 2006 09:32:12 GMT
+ Content-Type: text/calendar
+ Content-Length: xxxx
+
+ BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//Example Corp.//CalDAV Server//EN
+ BEGIN:VFREEBUSY
+ DTSTAMP:20050125T090000Z
+ DTSTART:20060104T140000Z
+ DTEND:20060105T220000Z
+ FREEBUSY;FBTYPE=BUSY-TENTATIVE:20060104T150000Z/PT1H
+ FREEBUSY:20060104T190000Z/PT1H
+ END:VFREEBUSY
+ END:VCALENDAR
+
+
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 68]
+
+RFC 4791 CalDAV March 2007
+
+
+8. Guidelines
+
+8.1. Client-to-Client Interoperability
+
+ There are a number of actions clients can take that will be legal
+ (the server will not return errors), but that can degrade
+ interoperability with other client implementations accessing the same
+ data. For example, a recurrence rule could be replaced with a set of
+ recurrence dates, a single recurring event could be replaced with a
+ set of independent resources to represent each recurrence, or the
+ start/end time values can be translated from the original time zone
+ to another time zone. Although this advice amounts to iCalendar
+ interoperability best practices and is not limited only to CalDAV
+ usage, interoperability problems are likely to be more evident in
+ CalDAV use cases.
+
+8.2. Synchronization Operations
+
+ WebDAV already provides functionality required to synchronize a
+ collection or set of collections, to make changes offline, and
+ provides a simple way to resolve conflicts when reconnected. ETags
+ are the key to making this work, but these are not required of all
+ WebDAV servers. Since offline functionality is more important to
+ calendar applications than to some other WebDAV applications, CalDAV
+ servers MUST support ETags, as specified in Section 5.3.4.
+
+8.2.1. Use of Reports
+
+8.2.1.1. Restrict the Time Range
+
+ The reports provided in CalDAV can be used by clients to optimize
+ their performance in terms of network bandwidth usage and resource
+ consumption on the local client machine. Both are certainly major
+ considerations for mobile or handheld devices with limited capacity,
+ but they are also relevant to desktop client applications in cases
+ where the calendar collections contain large amounts of data.
+
+ Typically, clients present calendar data to users in views that span
+ a finite time interval, so whenever possible, clients should only
+ retrieve calendar components from the server using CALDAV:calendar-
+ query REPORT, combined with a CALDAV:time-range element, to limit the
+ set of returned components to just those needed to populate the
+ current view.
+
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 69]
+
+RFC 4791 CalDAV March 2007
+
+
+8.2.1.2. Synchronize by Time Range
+
+ Typically in a calendar, historical data (events, to-dos, etc. that
+ have completed prior to the current date) do not change, though they
+ may be deleted. As a result, a client can speed up the
+ synchronization process by only considering data for the present time
+ and the future up to a reasonable limit (e.g., one week, one month).
+ If the user then tries to examine a portion of the calendar outside
+ the range that has been synchronized, the client can perform another
+ synchronization operation on the new time interval being examined.
+ This "just-in-time" synchronization can minimize bandwidth for common
+ user interaction behaviors.
+
+8.2.1.3. Synchronization Process
+
+ If a client wants to support calendar data synchronization, as
+ opposed to downloading calendar data each time it is needed, the
+ client needs to cache the calendar object resource's URI and ETag,
+ along with the actual calendar data. While the URI remains static
+ for the lifetime of the calendar object resource, the ETag will
+ change with each successive change to the calendar object resource.
+ Thus, to synchronize a local data cache with the server, the client
+ can first fetch the URI/ETag pairs for the time interval being
+ considered, and compare those results with the cached data. Any
+ cached component whose ETag differs from that on the server needs to
+ be refreshed.
+
+ In order to properly detect the changes between the server and client
+ data, the client will need to keep a record of which calendar object
+ resources have been created, changed, or deleted since the last
+ synchronization operation so that it can reconcile those changes with
+ the data on the server.
+
+ Here's an example of how to do that:
+
+ The client issues a CALDAV:calendar-query REPORT request for a
+ specific time range and asks for only the DAV:getetag property to be
+ returned:
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 70]
+
+RFC 4791 CalDAV March 2007
+
+
+ REPORT /bernard/work/ HTTP/1.1
+ Host: cal.example.com
+ Depth: 1
+ Content-Type: application/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <C:calendar-query xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:prop>
+ <D:getetag/>
+ </D:prop>
+ <C:filter>
+ <C:comp-filter name="VCALENDAR">
+ <C:comp-filter name="VEVENT">
+ <C:time-range start="20040902T000000Z"
+ end="20040903T000000Z"/>
+ </C:comp-filter>
+ </C:comp-filter>
+ </C:filter>
+ </C:calendar-query>
+
+ The client then uses the results to determine which calendar object
+ resources have changed, been created, or deleted on the server, and
+ how those relate to locally cached calendar object resources that may
+ have changed, been created, or deleted. If the client determines
+ that there are calendar object resources on the server that need to
+ be fetched, the client issues a CALDAV:calendar-multiget REPORT
+ request to fetch its calendar data:
+
+ REPORT /bernard/work/ HTTP/1.1
+ Host: cal.example.com
+ Content-Type: application/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <C:calendar-multiget xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:prop>
+ <D:getetag/>
+ <C:calendar-data/>
+ </D:prop>
+ <D:href>/bernard/work/abcd1.ics</D:href>
+ <D:href>/bernard/work/mtg1.ics</D:href>
+ </C:calendar-multiget>
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 71]
+
+RFC 4791 CalDAV March 2007
+
+
+8.2.2. Restrict the Properties Returned
+
+ A client may not need all the calendar properties of a calendar
+ object resource when presenting information to the user. Since some
+ calendar property values can be large (e.g., ATTACH or ATTENDEE), a
+ client can choose to restrict the calendar properties to be returned
+ in a calendaring REPORT request to those it knows it will use.
+
+ However, if a client needs to make a change to a calendar object
+ resource, it can only change the entire calendar object resource via
+ a PUT request. There is currently no way to incrementally make a
+ change to a set of calendar properties of a calendar object resource.
+ As a result, the client will have to get the entire calendar object
+ resource that is being changed.
+
+8.3. Use of Locking
+
+ WebDAV locks can be used to prevent two clients that are modifying
+ the same resource from either overwriting each others' changes
+ (though that problem can also be solved by using ETags) or wasting
+ time making changes that will conflict with another set of changes.
+ In a multi-user calendar system, an interactive calendar client could
+ lock an event while the user is editing the event, and unlock the
+ event when the user finishes or cancels. Locks can also be used to
+ prevent changes while data is being reorganized. For example, a
+ calendar client might lock two calendar collections prior to moving a
+ bunch of calendar resources from one to another.
+
+ Clients are responsible for requesting a lock timeout period that is
+ appropriate to the use case. When the user explicitly decides to
+ reserve a resource and prevent other changes, a long timeout might be
+ appropriate, but in cases where the client automatically decides to
+ lock the resource, the timeout should be short (and the client can
+ always refresh the lock should it need to). A short lock timeout
+ means that if the client is unable to remove the lock, the other
+ calendar users aren't prevented from making changes.
+
+8.4. Finding Calendars
+
+ Much of the time, a calendar client (or agent) will discover a new
+ calendar's location by being provided directly with the URL. For
+ example, a user will type his or her own calendar location into
+ client configuration information or copy and paste a URL from email
+ into the calendar application. The client need only confirm that the
+ URL points to a resource that is a calendar collection. The client
+ may also be able to browse WebDAV collections to find calendar
+ collections.
+
+
+
+
+Daboo, et al. Standards Track [Page 72]
+
+RFC 4791 CalDAV March 2007
+
+
+ The choice of HTTP URLs means that calendar object resources are
+ backward compatible with existing software, but does have the
+ disadvantage that existing software does not usually know to look at
+ the OPTIONS response to that URL to determine what can be done with
+ it. This is somewhat of a barrier for WebDAV usage as well as with
+ CalDAV usage. This specification does not offer a way through this
+ other than making the information available in the OPTIONS response
+ should this be requested.
+
+ For calendar sharing and scheduling use cases, one might wish to find
+ the calendar belonging to another user. If the other user has a
+ calendar in the same repository, that calendar can be found by using
+ the principal namespace required by WebDAV ACL support. For other
+ cases, the authors have no universal solution, but implementers can
+ consider whether to use vCard [RFC2426] or LDAP [RFC4511] standards
+ together with calendar attributes [RFC2739].
+
+ Because CalDAV requires servers to support WebDAV ACL [RFC3744],
+ including principal namespaces, and with the addition of the CALDAV:
+ calendar-home-set property, there are a couple options for CalDAV
+ clients to find one's own calendar or another user's calendar.
+
+ In this case, a DAV:principal-match REPORT is used to find a named
+ property (the CALDAV:calendar-home-set) on the Principal-URL of the
+ current user. Using this, a WebDAV client can learn "who am I" and
+ "where are my calendars". The REPORT request body looks like this:
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:principal-match xmlns:D="DAV:">
+ <D:self/>
+ <D:prop>
+ <C:calendar-home-set
+ xmlns:C="urn:ietf:params:xml:ns:caldav"/>
+ </D:prop>
+ </D:principal-match>
+
+ To find other users' calendars, the DAV:principal-property-search
+ REPORT can be used to filter on some properties and return others.
+ To search for a calendar owned by a user named "Laurie", the REPORT
+ request body would look like this:
+
+
+
+
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 73]
+
+RFC 4791 CalDAV March 2007
+
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:principal-property-search xmlns:D="DAV:">
+ <D:property-search>
+ <D:prop>
+ <D:displayname/>
+ </D:prop>
+ <D:match>Laurie</D:match>
+ </D:property-search>
+ <D:prop>
+ <C:calendar-home-set
+ xmlns:C="urn:ietf:params:xml:ns:caldav"/>
+ <D:displayname/>
+ </D:prop>
+ </D:principal-property-search>
+
+ The server performs a case-sensitive or caseless search for a
+ matching string subset of "Laurie" within the DAV:displayname
+ property. Thus, the server might return "Laurie Dusseault", "Laurier
+ Desruisseaux", or "Wilfrid Laurier" as matching DAV:displayname
+ values, and return the calendars for each of these.
+
+8.5. Storing and Using Attachments
+
+ CalDAV clients MAY create attachments in calendar components either
+ as inline or external. This section contains some guidelines for
+ creating and managing attachments.
+
+8.5.1. Inline Attachments
+
+ CalDAV clients MUST support inline attachments as specified in
+ iCalendar [RFC2445]. CalDAV servers MUST support inline attachments,
+ so clients can rely on being able to create attachments this way. On
+ the other hand, inline attachments have some drawbacks:
+
+ o Servers MAY impose limitations on the size of calendar object
+ resources (i.e., refusing PUT requests of very large iCalendar
+ objects). Servers that impose such limitations MUST use the
+ CALDAV:max-resource-size property on a calendar collection to
+ inform the client as to what the limitation is (see
+ Section 5.2.5).
+
+ o Servers MAY impose storage quota limitations on calendar
+ collections (See [RFC4331]).
+
+ o Any change to a calendar object resource containing an inline
+ attachment requires the entire inline attachment to be re-
+ uploaded.
+
+
+
+
+Daboo, et al. Standards Track [Page 74]
+
+RFC 4791 CalDAV March 2007
+
+
+ o Clients synchronizing a changed calendar object resource have to
+ download the entire calendar object resource, even if the
+ attachment is unchanged.
+
+8.5.2. External Attachments
+
+ CalDAV clients SHOULD support downloading of external attachments
+ referenced by arbitrary URI schemes, by either processing them
+ directly, or by passing the attachment URI to a suitable "helper
+ application" for processing, if such an application exists. CalDAV
+ clients MUST support downloading of external attachments referenced
+ by the "http" or "https" URI schemes. An external attachment could
+ be:
+
+ o In a collection in the calendar collection containing the calendar
+ object resource;
+
+ o Somewhere else in the same repository that hosts the calendar
+ collection; or
+
+ o On an HTTP or FTP server elsewhere.
+
+ CalDAV servers MAY provide support for child collections in calendar
+ collections. CalDAV servers MAY allow the MKCOL method to create
+ child collections in calendar collections. Child collections of
+ calendar collections MAY contain any type of resource except calendar
+ collections that they MUST NOT contain. Some CalDAV servers won't
+ allow child collections in calendar collections, and it may be
+ possible on such a server to discover other locations where
+ attachments can be stored.
+
+ Clients are entirely responsible for maintaining reference
+ consistency with calendar components that link to external
+ attachments. A client deleting a calendar component with an external
+ attachment might therefore also delete the attachment if that's
+ appropriate; however, appropriateness can be very hard to determine.
+ A new component might easily reference some pre-existing Web resource
+ that is intended to have independent existence from the calendar
+ component (the "attachment" could be a major proposal to be discussed
+ in a meeting, for instance). Best practices will probably emerge and
+ should probably be documented, but for now, clients should be wary of
+ engaging in aggressive "cleanup" of external attachments. A client
+ could involve the user in making decisions about removing
+ unreferenced documents, or a client could be conservative in only
+ deleting attachments it had created.
+
+ Also, clients are responsible for consistency of permissions when
+ using external attachments. One reason for servers to support the
+
+
+
+Daboo, et al. Standards Track [Page 75]
+
+RFC 4791 CalDAV March 2007
+
+
+ storage of attachments within child collections of calendar
+ collections is that ACL inheritance might make it easier to grant the
+ same permissions to attachments that are granted on the calendar
+ collection. Otherwise, it can be very difficult to keep permissions
+ synchronized. With attachments stored on separate repositories, it
+ can be impossible to keep permissions consistent -- the two
+ repositories may not support the same permissions or have the same
+ set of principals. Some systems have used tickets or other anonymous
+ access control mechanisms to provide partially satisfactory solutions
+ to these kinds of problems.
+
+8.6. Storing and Using Alarms
+
+ Note that all CalDAV calendar collections (including those the user
+ might treat as public or group calendars) can contain alarm
+ information on events and to-dos. Users can synchronize a calendar
+ between multiple devices and decide to have alarms execute on a
+ different device than the device that created the alarm. Not all
+ alarm action types are completely interoperable (e.g., those that
+ name a sound file to play).
+
+ When the action is AUDIO and the client is configured to execute
+ the alarm, the client SHOULD play the suggested sound if it's
+ available or play another sound, but SHOULD NOT rewrite the alarm
+ just to replace the suggested sound with a sound that's locally
+ available.
+
+ When the action is DISPLAY and the client is configured to execute
+ the alarm, the client SHOULD execute a display alarm by displaying
+ according to the suggested description or some reasonable
+ replacement, but SHOULD NOT rewrite the alarm for its own
+ convenience.
+
+ When the action is EMAIL and the client is incapable of sending
+ email, it SHOULD ignore the alarm, but it MUST continue to
+ synchronize the alarm itself.
+
+ This specification makes no recommendations about executing alarms
+ of type PROCEDURE, except to note that clients are advised to take
+ care to avoid creating security holes by executing these.
+
+ Non-interoperable alarm information (e.g., should somebody define a
+ color to be used in a display alarm) should be put in non-standard
+ properties inside the VALARM component in order to keep the basic
+ alarm usable on all devices.
+
+ Clients that allow changes to calendar object resources MUST
+ synchronize the alarm data that already exists in the resources.
+
+
+
+Daboo, et al. Standards Track [Page 76]
+
+RFC 4791 CalDAV March 2007
+
+
+ Clients MAY execute alarms that are downloaded in this fashion,
+ possibly based on user preference. If a client is only doing read
+ operations on a calendar and there is no risk of losing alarm
+ information, then the client MAY discard alarm information.
+
+ This specification makes no attempt to provide multi-user alarms on
+ group calendars or to find out for whom an alarm is intended.
+ Addressing those issues might require extensions to iCalendar; for
+ example, to store alarms per-user, or to indicate for which user a
+ VALARM was intended. In the meantime, clients might maximize
+ interoperability by generally not uploading alarm information to
+ public, group, or resource calendars.
+
+9. XML Element Definitions
+
+9.1. CALDAV:calendar XML Element
+
+ Name: calendar
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: Specifies the resource type of a calendar collection.
+
+ Description: See Section 4.2.
+
+ Definition:
+
+ <!ELEMENT calendar EMPTY>
+
+9.2. CALDAV:mkcalendar XML Element
+
+ Name: mkcalendar
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: Specifies a request that includes the WebDAV property
+ values to be set for a calendar collection resource when it is
+ created.
+
+ Description: See Section 5.3.1.
+
+ Definition:
+
+ <!ELEMENT mkcalendar (DAV:set)>
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 77]
+
+RFC 4791 CalDAV March 2007
+
+
+9.3. CALDAV:mkcalendar-response XML Element
+
+ Name: mkcalendar-response
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: Specifies a response body for a successful MKCALENDAR
+ request.
+
+ Description: See Section 5.3.1.
+
+ Definition:
+
+ <!ELEMENT mkcalendar-response ANY>
+
+9.4. CALDAV:supported-collation XML Element
+
+ Name: supported-collation
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: Identifies a single collation via its collation identifier,
+ as defined by [RFC4790].
+
+ Description: The CALDAV:supported-collation contains the text of a
+ collation identifier, as described in Section 7.5.1.
+
+ Definition:
+
+ <!ELEMENT supported-collation (#PCDATA)>
+ PCDATA value: collation identifier
+
+9.5. CALDAV:calendar-query XML Element
+
+ Name: calendar-query
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: Defines a report for querying calendar object resources.
+
+ Description: See Section 7.8.
+
+ Definition:
+
+ <!ELEMENT calendar-query ((DAV:allprop |
+ DAV:propname |
+ DAV:prop)?, filter, timezone?)>
+
+
+
+
+Daboo, et al. Standards Track [Page 78]
+
+RFC 4791 CalDAV March 2007
+
+
+9.6. CALDAV:calendar-data XML Element
+
+ Name: calendar-data
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: Specified one of the following:
+
+ 1. A supported media type for calendar object resources when
+ nested in the CALDAV:supported-calendar-data property;
+
+ 2. The parts of a calendar object resource should be returned by
+ a calendaring report;
+
+ 3. The content of a calendar object resource in a response to a
+ calendaring report.
+
+ Description: When nested in the CALDAV:supported-calendar-data
+ property, the CALDAV:calendar-data XML element specifies a media
+ type supported by the CalDAV server for calendar object resources.
+
+ When used in a calendaring REPORT request, the CALDAV:calendar-
+ data XML element specifies which parts of calendar object
+ resources need to be returned in the response. If the CALDAV:
+ calendar-data XML element doesn't contain any CALDAV:comp element,
+ calendar object resources will be returned in their entirety.
+
+ Finally, when used in a calendaring REPORT response, the CALDAV:
+ calendar-data XML element specifies the content of a calendar
+ object resource. Given that XML parsers normalize the two-
+ character sequence CRLF (US-ASCII decimal 13 and US-ASCII decimal
+ 10) to a single LF character (US-ASCII decimal 10), the CR
+ character (US-ASCII decimal 13) MAY be omitted in calendar object
+ resources specified in the CALDAV:calendar-data XML element.
+ Furthermore, calendar object resources specified in the CALDAV:
+ calendar-data XML element MAY be invalid per their media type
+ specification if the CALDAV:calendar-data XML element part of the
+ calendaring REPORT request did not specify required properties
+ (e.g., UID, DTSTAMP, etc.), or specified a CALDAV:prop XML element
+ with the "novalue" attribute set to "yes".
+
+ Note: The CALDAV:calendar-data XML element is specified in requests
+ and responses inside the DAV:prop XML element as if it were a
+ WebDAV property. However, the CALDAV:calendar-data XML element is
+ not a WebDAV property and, as such, is not returned in PROPFIND
+ responses, nor used in PROPPATCH requests.
+
+
+
+
+
+Daboo, et al. Standards Track [Page 79]
+
+RFC 4791 CalDAV March 2007
+
+
+ Note: The iCalendar data embedded within the CALDAV:calendar-data
+ XML element MUST follow the standard XML character data encoding
+ rules, including use of &lt;, &gt;, &amp; etc. entity encoding or
+ the use of a <![CDATA[ ... ]]> construct. In the later case, the
+ iCalendar data cannot contain the character sequence "]]>", which
+ is the end delimiter for the CDATA section.
+
+ Definition:
+
+ <!ELEMENT calendar-data EMPTY>
+
+ when nested in the CALDAV:supported-calendar-data property
+ to specify a supported media type for calendar object
+ resources;
+
+ <!ELEMENT calendar-data (comp?,
+ (expand | limit-recurrence-set)?,
+ limit-freebusy-set?)>
+
+ when nested in the DAV:prop XML element in a calendaring
+ REPORT request to specify which parts of calendar object
+ resources should be returned in the response;
+
+ <!ELEMENT calendar-data (#PCDATA)>
+ PCDATA value: iCalendar object
+
+ when nested in the DAV:prop XML element in a calendaring
+ REPORT response to specify the content of a returned
+ calendar object resource.
+
+ <!ATTLIST calendar-data content-type CDATA "text/calendar"
+ version CDATA "2.0">
+ content-type value: a MIME media type
+ version value: a version string
+
+ attributes can be used on all three variants of the
+ CALDAV:calendar-data XML element.
+
+9.6.1. CALDAV:comp XML Element
+
+ Name: comp
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: Defines which component types to return.
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 80]
+
+RFC 4791 CalDAV March 2007
+
+
+ Description: The name value is a calendar component name (e.g.,
+ VEVENT).
+
+ Definition:
+
+ <!ELEMENT comp ((allprop | prop*), (allcomp | comp*))>
+
+ <!ATTLIST comp name CDATA #REQUIRED>
+ name value: a calendar component name
+
+ Note: The CALDAV:prop and CALDAV:allprop elements have the same name
+ as the DAV:prop and DAV:allprop elements defined in [RFC2518].
+ However, the CALDAV:prop and CALDAV:allprop elements are defined
+ in the "urn:ietf:params:xml:ns:caldav" namespace instead of the
+ "DAV:" namespace.
+
+9.6.2. CALDAV:allcomp XML Element
+
+ Name: allcomp
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: Specifies that all components shall be returned.
+
+ Description: The CALDAV:allcomp XML element can be used when the
+ client wants all types of components returned by a calendaring
+ REPORT request.
+
+ Definition:
+
+ <!ELEMENT allcomp EMPTY>
+
+9.6.3. CALDAV:allprop XML Element
+
+ Name: allprop
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: Specifies that all properties shall be returned.
+
+ Description: The CALDAV:allprop XML element can be used when the
+ client wants all properties of components returned by a
+ calendaring REPORT request.
+
+ Definition:
+
+ <!ELEMENT allprop EMPTY>
+
+
+
+
+Daboo, et al. Standards Track [Page 81]
+
+RFC 4791 CalDAV March 2007
+
+
+ Note: The CALDAV:allprop element has the same name as the DAV:
+ allprop element defined in [RFC2518]. However, the CALDAV:allprop
+ element is defined in the "urn:ietf:params:xml:ns:caldav"
+ namespace instead of the "DAV:" namespace.
+
+9.6.4. CALDAV:prop XML Element
+
+ Name: prop
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: Defines which properties to return in the response.
+
+ Description: The "name" attribute specifies the name of the calendar
+ property to return (e.g., ATTENDEE). The "novalue" attribute can
+ be used by clients to request that the actual value of the
+ property not be returned (if the "novalue" attribute is set to
+ "yes"). In that case, the server will return just the iCalendar
+ property name and any iCalendar parameters and a trailing ":"
+ without the subsequent value data.
+
+ Definition:
+
+ <!ELEMENT prop EMPTY>
+
+ <!ATTLIST prop name CDATA #REQUIRED
+ novalue (yes | no) "no">
+ name value: a calendar property name
+ novalue value: "yes" or "no"
+
+ Note: The CALDAV:prop element has the same name as the DAV:prop
+ element defined in [RFC2518]. However, the CALDAV:prop element is
+ defined in the "urn:ietf:params:xml:ns:caldav" namespace instead
+ of the "DAV:" namespace.
+
+9.6.5. CALDAV:expand XML Element
+
+ Name: expand
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: Forces the server to expand recurring components into
+ individual recurrence instances.
+
+ Description: The CALDAV:expand XML element specifies that for a
+ given calendaring REPORT request, the server MUST expand the
+ recurrence set into calendar components that define exactly one
+
+
+
+
+Daboo, et al. Standards Track [Page 82]
+
+RFC 4791 CalDAV March 2007
+
+
+ recurrence instance, and MUST return only those whose scheduled
+ time intersect a specified time range.
+
+ The "start" attribute specifies the inclusive start of the time
+ range, and the "end" attribute specifies the non-inclusive end of
+ the time range. Both attributes are specified as date with UTC
+ time value. The value of the "end" attribute MUST be greater than
+ the value of the "start" attribute.
+
+ The server MUST use the same logic as defined for CALDAV:time-
+ range to determine if a recurrence instance intersects the
+ specified time range.
+
+ Recurring components, other than the initial instance, MUST
+ include a RECURRENCE-ID property indicating which instance they
+ refer to.
+
+ The returned calendar components MUST NOT use recurrence
+ properties (i.e., EXDATE, EXRULE, RDATE, and RRULE) and MUST NOT
+ have reference to or include VTIMEZONE components. Date and local
+ time with reference to time zone information MUST be converted
+ into date with UTC time.
+
+ Definition:
+
+ <!ELEMENT expand EMPTY>
+
+ <!ATTLIST expand start CDATA #REQUIRED
+ end CDATA #REQUIRED>
+ start value: an iCalendar "date with UTC time"
+ end value: an iCalendar "date with UTC time"
+
+9.6.6. CALDAV:limit-recurrence-set XML Element
+
+ Name: limit-recurrence-set
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: Specifies a time range to limit the set of "overridden
+ components" returned by the server.
+
+ Description: The CALDAV:limit-recurrence-set XML element specifies
+ that for a given calendaring REPORT request, the server MUST
+ return, in addition to the "master component", only the
+ "overridden components" that impact a specified time range. An
+ overridden component impacts a time range if its current start and
+ end times overlap the time range, or if the original start and end
+
+
+
+
+Daboo, et al. Standards Track [Page 83]
+
+RFC 4791 CalDAV March 2007
+
+
+ times -- the ones that would have been used if the instance were
+ not overridden -- overlap the time range.
+
+ The "start" attribute specifies the inclusive start of the time
+ range, and the "end" attribute specifies the non-inclusive end of
+ the time range. Both attributes are specified as date with UTC
+ time value. The value of the "end" attribute MUST be greater than
+ the value of the "start" attribute.
+
+ The server MUST use the same logic as defined for CALDAV:time-
+ range to determine if the current or original scheduled time of an
+ "overridden" recurrence instance intersects the specified time
+ range.
+
+ Overridden components that have a RANGE parameter on their
+ RECURRENCE-ID property may specify one or more instances in the
+ recurrence set, and some of those instances may fall within the
+ specified time range or may have originally fallen within the
+ specified time range prior to being overridden. If that is the
+ case, the overridden component MUST be included in the results, as
+ it has a direct impact on the interpretation of instances within
+ the specified time range.
+
+ Definition:
+
+ <!ELEMENT limit-recurrence-set EMPTY>
+
+ <!ATTLIST limit-recurrence-set start CDATA #REQUIRED
+ end CDATA #REQUIRED>
+ start value: an iCalendar "date with UTC time"
+ end value: an iCalendar "date with UTC time"
+
+9.6.7. CALDAV:limit-freebusy-set XML Element
+
+ Name: limit-freebusy-set
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: Specifies a time range to limit the set of FREEBUSY values
+ returned by the server.
+
+ Description: The CALDAV:limit-freebusy-set XML element specifies
+ that for a given calendaring REPORT request, the server MUST only
+ return the FREEBUSY property values of a VFREEBUSY component that
+ intersects a specified time range.
+
+ The "start" attribute specifies the inclusive start of the time
+ range, and the "end" attribute specifies the non-inclusive end of
+
+
+
+Daboo, et al. Standards Track [Page 84]
+
+RFC 4791 CalDAV March 2007
+
+
+ the time range. Both attributes are specified as "date with UTC
+ time" value. The value of the "end" attribute MUST be greater
+ than the value of the "start" attribute.
+
+ The server MUST use the same logic as defined for CALDAV:time-
+ range to determine if a FREEBUSY property value intersects the
+ specified time range.
+
+ Definition:
+
+ <!ELEMENT limit-freebusy-set EMPTY>
+
+ <!ATTLIST limit-freebusy-set start CDATA #REQUIRED
+ end CDATA #REQUIRED>
+ start value: an iCalendar "date with UTC time"
+ end value: an iCalendar "date with UTC time"
+
+9.7. CALDAV:filter XML Element
+
+ Name: filter
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: Specifies a filter to limit the set of calendar components
+ returned by the server.
+
+ Description: The CALDAV:filter XML element specifies the search
+ filter used to limit the calendar components returned by a
+ calendaring REPORT request.
+
+ Definition:
+
+ <!ELEMENT filter (comp-filter)>
+
+9.7.1. CALDAV:comp-filter XML Element
+
+ Name: comp-filter
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: Specifies search criteria on calendar components.
+
+ Description: The CALDAV:comp-filter XML element specifies a query
+ targeted at the calendar object (i.e., VCALENDAR) or at a specific
+ calendar component type (e.g., VEVENT). The scope of the
+ CALDAV:comp-filter XML element is the calendar object when used as
+ a child of the CALDAV:filter XML element. The scope of the
+ CALDAV:comp-filter XML element is the enclosing calendar component
+
+
+
+Daboo, et al. Standards Track [Page 85]
+
+RFC 4791 CalDAV March 2007
+
+
+ when used as a child of another CALDAV:comp-filter XML element. A
+ CALDAV:comp-filter is said to match if:
+
+ * The CALDAV:comp-filter XML element is empty and the calendar
+ object or calendar component type specified by the "name"
+ attribute exists in the current scope;
+
+ or:
+
+ * The CALDAV:comp-filter XML element contains a CALDAV:is-not-
+ defined XML element and the calendar object or calendar
+ component type specified by the "name" attribute does not exist
+ in the current scope;
+
+ or:
+
+ * The CALDAV:comp-filter XML element contains a CALDAV:time-range
+ XML element and at least one recurrence instance in the
+ targeted calendar component is scheduled to overlap the
+ specified time range, and all specified CALDAV:prop-filter and
+ CALDAV:comp-filter child XML elements also match the targeted
+ calendar component;
+
+ or:
+
+ * The CALDAV:comp-filter XML element only contains CALDAV:prop-
+ filter and CALDAV:comp-filter child XML elements that all match
+ the targeted calendar component.
+
+ Definition:
+
+ <!ELEMENT comp-filter (is-not-defined | (time-range?,
+ prop-filter*, comp-filter*))>
+
+ <!ATTLIST comp-filter name CDATA #REQUIRED>
+ name value: a calendar object or calendar component
+ type (e.g., VEVENT)
+
+9.7.2. CALDAV:prop-filter XML Element
+
+ Name: prop-filter
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: Specifies search criteria on calendar properties.
+
+ Description: The CALDAV:prop-filter XML element specifies a query
+ targeted at a specific calendar property (e.g., CATEGORIES) in the
+
+
+
+Daboo, et al. Standards Track [Page 86]
+
+RFC 4791 CalDAV March 2007
+
+
+ scope of the enclosing calendar component. A calendar property is
+ said to match a CALDAV:prop-filter if:
+
+ * The CALDAV:prop-filter XML element is empty and a property of
+ the type specified by the "name" attribute exists in the
+ enclosing calendar component;
+
+ or:
+
+ * The CALDAV:prop-filter XML element contains a CALDAV:is-not-
+ defined XML element and no property of the type specified by
+ the "name" attribute exists in the enclosing calendar
+ component;
+
+ or:
+
+ * The CALDAV:prop-filter XML element contains a CALDAV:time-range
+ XML element and the property value overlaps the specified time
+ range, and all specified CALDAV:param-filter child XML elements
+ also match the targeted property;
+
+ or:
+
+ * The CALDAV:prop-filter XML element contains a CALDAV:text-match
+ XML element and the property value matches it, and all
+ specified CALDAV:param-filter child XML elements also match the
+ targeted property;
+
+ Definition:
+
+ <!ELEMENT prop-filter (is-not-defined |
+ ((time-range | text-match)?,
+ param-filter*))>
+
+ <!ATTLIST prop-filter name CDATA #REQUIRED>
+ name value: a calendar property name (e.g., ATTENDEE)
+
+9.7.3. CALDAV:param-filter XML Element
+
+ Name: param-filter
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: Limits the search to specific parameter values.
+
+ Description: The CALDAV:param-filter XML element specifies a query
+ targeted at a specific calendar property parameter (e.g.,
+ PARTSTAT) in the scope of the calendar property on which it is
+
+
+
+Daboo, et al. Standards Track [Page 87]
+
+RFC 4791 CalDAV March 2007
+
+
+ defined. A calendar property parameter is said to match a CALDAV:
+ param-filter if:
+
+ * The CALDAV:param-filter XML element is empty and a parameter of
+ the type specified by the "name" attribute exists on the
+ calendar property being examined;
+
+ or:
+
+ * The CALDAV:param-filter XML element contains a CALDAV:is-not-
+ defined XML element and no parameter of the type specified by
+ the "name" attribute exists on the calendar property being
+ examined;
+
+ Definition:
+
+ <!ELEMENT param-filter (is-not-defined | text-match?)>
+
+ <!ATTLIST param-filter name CDATA #REQUIRED>
+ name value: a property parameter name (e.g., PARTSTAT)
+
+9.7.4. CALDAV:is-not-defined XML Element
+
+ Name: is-not-defined
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: Specifies that a match should occur if the enclosing
+ component, property, or parameter does not exist.
+
+ Description: The CALDAV:is-not-defined XML element specifies that a
+ match occurs if the enclosing component, property, or parameter
+ value specified in a calendaring REPORT request does not exist in
+ the calendar data being tested.
+
+ Definition:
+
+ <!ELEMENT is-not-defined EMPTY>
+
+9.7.5. CALDAV:text-match XML Element
+
+ Name: text-match
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: Specifies a substring match on a property or parameter
+ value.
+
+
+
+
+Daboo, et al. Standards Track [Page 88]
+
+RFC 4791 CalDAV March 2007
+
+
+ Description: The CALDAV:text-match XML element specifies text used
+ for a substring match against the property or parameter value
+ specified in a calendaring REPORT request.
+
+ The "collation" attribute is used to select the collation that the
+ server MUST use for character string matching. In the absence of
+ this attribute, the server MUST use the "i;ascii-casemap"
+ collation.
+
+ The "negate-condition" attribute is used to indicate that this
+ test returns a match if the text matches when the attribute value
+ is set to "no", or return a match if the text does not match, if
+ the attribute value is set to "yes". For example, this can be
+ used to match components with a STATUS property not set to
+ CANCELLED.
+
+ Definition:
+
+ <!ELEMENT text-match (#PCDATA)>
+ PCDATA value: string
+
+ <!ATTLIST text-match collation CDATA "i;ascii-casemap"
+ negate-condition (yes | no) "no">
+
+9.8. CALDAV:timezone XML Element
+
+ Name: timezone
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: Specifies the time zone component to use when determining
+ the results of a report.
+
+ Description: The CALDAV:timezone XML element specifies that for a
+ given calendaring REPORT request, the server MUST rely on the
+ specified VTIMEZONE component instead of the CALDAV:calendar-
+ timezone property of the calendar collection, in which the
+ calendar object resource is contained to resolve "date" values and
+ "date with local time" values (i.e., floating time) to "date with
+ UTC time" values. The server will require this information to
+ determine if a calendar component scheduled with "date" values or
+ "date with local time" values intersects a CALDAV:time-range
+ specified in a CALDAV:calendar-query REPORT.
+
+ Note: The iCalendar data embedded within the CALDAV:timezone XML
+ element MUST follow the standard XML character data encoding
+ rules, including use of &lt;, &gt;, &amp; etc. entity encoding or
+ the use of a <![CDATA[ ... ]]> construct. In the later case, the
+
+
+
+Daboo, et al. Standards Track [Page 89]
+
+RFC 4791 CalDAV March 2007
+
+
+ iCalendar data cannot contain the character sequence "]]>", which
+ is the end delimiter for the CDATA section.
+
+ Definition:
+
+ <!ELEMENT timezone (#PCDATA)>
+ PCDATA value: an iCalendar object with exactly one VTIMEZONE
+
+9.9. CALDAV:time-range XML Element
+
+ Name: time-range
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: Specifies a time range to limit the set of calendar
+ components returned by the server.
+
+ Description: The CALDAV:time-range XML element specifies that for a
+ given calendaring REPORT request, the server MUST only return the
+ calendar object resources that, depending on the context, have a
+ component or property whose value intersects a specified time
+ range.
+
+ The "start" attribute specifies the inclusive start of the time
+ range, and the "end" attribute specifies the non-inclusive end of
+ the time range. Both attributes MUST be specified as "date with
+ UTC time" value. Time ranges open at one end can be specified by
+ including only one attribute; however, at least one attribute MUST
+ always be present in the CALDAV:time-range element. If either the
+ "start" or "end" attribute is not specified in the CALDAV:time-
+ range XML element, assume "-infinity" and "+infinity" as their
+ value, respectively. If both "start" and "end" are present, the
+ value of the "end" attribute MUST be greater than the value of the
+ "start" attribute.
+
+ Time range tests MUST consider every recurrence instance when
+ testing the time range condition; if any one instance matches,
+ then the test returns true. Testing recurrence instances requires
+ the server to infer an effective value for DTSTART, DTEND,
+ DURATION, and DUE properties for an instance based on the
+ recurrence patterns and any overrides.
+
+ A VEVENT component overlaps a given time range if the condition
+ for the corresponding component state specified in the table below
+ is satisfied. Note that, as specified in [RFC2445], the DTSTART
+ property is REQUIRED in the VEVENT component. The conditions
+ depend on the presence of the DTEND and DURATION properties in the
+ VEVENT component. Furthermore, the value of the DTEND property
+
+
+
+Daboo, et al. Standards Track [Page 90]
+
+RFC 4791 CalDAV March 2007
+
+
+ MUST be later in time than the value of the DTSTART property. The
+ duration of a VEVENT component with no DTEND and DURATION
+ properties is 1 day (+P1D) when the DTSTART is a DATE value, and 0
+ seconds when the DTSTART is a DATE-TIME value.
+
+ +---------------------------------------------------------------+
+ | VEVENT has the DTEND property? |
+ | +-----------------------------------------------------------+
+ | | VEVENT has the DURATION property? |
+ | | +-------------------------------------------------------+
+ | | | DURATION property value is greater than 0 seconds? |
+ | | | +---------------------------------------------------+
+ | | | | DTSTART property is a DATE-TIME value? |
+ | | | | +-----------------------------------------------+
+ | | | | | Condition to evaluate |
+ +---+---+---+---+-----------------------------------------------+
+ | Y | N | N | * | (start < DTEND AND end > DTSTART) |
+ +---+---+---+---+-----------------------------------------------+
+ | N | Y | Y | * | (start < DTSTART+DURATION AND end > DTSTART) |
+ | | +---+---+-----------------------------------------------+
+ | | | N | * | (start <= DTSTART AND end > DTSTART) |
+ +---+---+---+---+-----------------------------------------------+
+ | N | N | N | Y | (start <= DTSTART AND end > DTSTART) |
+ +---+---+---+---+-----------------------------------------------+
+ | N | N | N | N | (start < DTSTART+P1D AND end > DTSTART) |
+ +---+---+---+---+-----------------------------------------------+
+
+ A VTODO component is said to overlap a given time range if the
+ condition for the corresponding component state specified in the
+ table below is satisfied. The conditions depend on the presence
+ of the DTSTART, DURATION, DUE, COMPLETED, and CREATED properties
+ in the VTODO component. Note that, as specified in [RFC2445], the
+ DUE value MUST be a DATE-TIME value equal to or after the DTSTART
+ value if specified.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 91]
+
+RFC 4791 CalDAV March 2007
+
+
+ +-------------------------------------------------------------------+
+ | VTODO has the DTSTART property? |
+ | +---------------------------------------------------------------+
+ | | VTODO has the DURATION property? |
+ | | +-----------------------------------------------------------+
+ | | | VTODO has the DUE property? |
+ | | | +-------------------------------------------------------+
+ | | | | VTODO has the COMPLETED property? |
+ | | | | +---------------------------------------------------+
+ | | | | | VTODO has the CREATED property? |
+ | | | | | +-----------------------------------------------+
+ | | | | | | Condition to evaluate |
+ +---+---+---+---+---+-----------------------------------------------+
+ | Y | Y | N | * | * | (start <= DTSTART+DURATION) AND |
+ | | | | | | ((end > DTSTART) OR |
+ | | | | | | (end >= DTSTART+DURATION)) |
+ +---+---+---+---+---+-----------------------------------------------+
+ | Y | N | Y | * | * | ((start < DUE) OR (start <= DTSTART)) |
+ | | | | | | AND |
+ | | | | | | ((end > DTSTART) OR (end >= DUE)) |
+ +---+---+---+---+---+-----------------------------------------------+
+ | Y | N | N | * | * | (start <= DTSTART) AND (end > DTSTART) |
+ +---+---+---+---+---+-----------------------------------------------+
+ | N | N | Y | * | * | (start < DUE) AND (end >= DUE) |
+ +---+---+---+---+---+-----------------------------------------------+
+ | N | N | N | Y | Y | ((start <= CREATED) OR (start <= COMPLETED))|
+ | | | | | | AND |
+ | | | | | | ((end >= CREATED) OR (end >= COMPLETED))|
+ +---+---+---+---+---+-----------------------------------------------+
+ | N | N | N | Y | N | (start <= COMPLETED) AND (end >= COMPLETED) |
+ +---+---+---+---+---+-----------------------------------------------+
+ | N | N | N | N | Y | (end > CREATED) |
+ +---+---+---+---+---+-----------------------------------------------+
+ | N | N | N | N | N | TRUE |
+ +---+---+---+---+---+-----------------------------------------------+
+
+ A VJOURNAL component overlaps a given time range if the condition
+ for the corresponding component state specified in the table below
+ is satisfied. The conditions depend on the presence of the
+ DTSTART property in the VJOURNAL component and on whether the
+ DTSTART is a DATE-TIME or DATE value. The effective "duration" of
+ a VJOURNAL component is 1 day (+P1D) when the DTSTART is a DATE
+ value, and 0 seconds when the DTSTART is a DATE-TIME value.
+
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 92]
+
+RFC 4791 CalDAV March 2007
+
+
+ +----------------------------------------------------+
+ | VJOURNAL has the DTSTART property? |
+ | +------------------------------------------------+
+ | | DTSTART property is a DATE-TIME value? |
+ | | +--------------------------------------------+
+ | | | Condition to evaluate |
+ +---+---+--------------------------------------------+
+ | Y | Y | (start <= DTSTART) AND (end > DTSTART) |
+ +---+---+--------------------------------------------+
+ | Y | N | (start < DTSTART+P1D) AND (end > DTSTART) |
+ +---+---+--------------------------------------------+
+ | N | * | FALSE |
+ +---+---+--------------------------------------------+
+
+ A VFREEBUSY component overlaps a given time range if the condition
+ for the corresponding component state specified in the table below
+ is satisfied. The conditions depend on the presence in the
+ VFREEBUSY component of the DTSTART and DTEND properties, and any
+ FREEBUSY properties in the absence of DTSTART and DTEND. Any
+ DURATION property is ignored, as it has a special meaning when
+ used in a VFREEBUSY component.
+
+ When only FREEBUSY properties are used, each period in each
+ FREEBUSY property is compared against the time range, irrespective
+ of the type of free busy information (free, busy, busy-tentative,
+ busy-unavailable) represented by the property.
+
+
+ +------------------------------------------------------+
+ | VFREEBUSY has both the DTSTART and DTEND properties? |
+ | +--------------------------------------------------+
+ | | VFREEBUSY has the FREEBUSY property? |
+ | | +----------------------------------------------+
+ | | | Condition to evaluate |
+ +---+---+----------------------------------------------+
+ | Y | * | (start <= DTEND) AND (end > DTSTART) |
+ +---+---+----------------------------------------------+
+ | N | Y | (start < freebusy-period-end) AND |
+ | | | (end > freebusy-period-start) |
+ +---+---+----------------------------------------------+
+ | N | N | FALSE |
+ +---+---+----------------------------------------------+
+
+ A VALARM component is said to overlap a given time range if the
+ following condition holds:
+
+ (start <= trigger-time) AND (end > trigger-time)
+
+
+
+
+Daboo, et al. Standards Track [Page 93]
+
+RFC 4791 CalDAV March 2007
+
+
+ A VALARM component can be defined such that it triggers repeatedly.
+ Such a VALARM component is said to overlap a given time range if at
+ least one of its triggers overlaps the time range.
+
+ The calendar properties COMPLETED, CREATED, DTEND, DTSTAMP,
+ DTSTART, DUE, and LAST-MODIFIED overlap a given time range if the
+ following condition holds:
+
+ (start <= date-time) AND (end > date-time)
+
+ Note that if DTEND is not present in a VEVENT, but DURATION is, then
+ the test should instead operate on the 'effective' DTEND, i.e.,
+ DTSTART+DURATION. Similarly, if DUE is not present in a VTODO, but
+ DTSTART and DURATION are, then the test should instead operate on the
+ 'effective' DUE, i.e., DTSTART+DURATION.
+
+ The semantic of CALDAV:time-range is not defined for any other
+ calendar components and properties.
+
+ Definition:
+
+ <!ELEMENT time-range EMPTY>
+
+ <!ATTLIST time-range start CDATA #IMPLIED
+ end CDATA #IMPLIED>
+ start value: an iCalendar "date with UTC time"
+ end value: an iCalendar "date with UTC time"
+
+9.10. CALDAV:calendar-multiget XML Element
+
+ Name: calendar-multiget
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: CalDAV report used to retrieve specific calendar object
+ resources.
+
+ Description: See Section 7.9.
+
+ Definition:
+
+ <!ELEMENT calendar-multiget ((DAV:allprop |
+ DAV:propname |
+ DAV:prop)?, DAV:href+)>
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 94]
+
+RFC 4791 CalDAV March 2007
+
+
+9.11. CALDAV:free-busy-query XML Element
+
+ Name: free-busy-query
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: CalDAV report used to generate a VFREEBUSY to determine
+ busy time over a specific time range.
+
+ Description: See Section 7.10.
+
+ Definition:
+
+ <!ELEMENT free-busy-query (time-range)>
+
+10. Internationalization Considerations
+
+ CalDAV allows internationalized strings to be stored and retrieved
+ for the description of calendar collections (see Section 5.2.1).
+
+ The CALDAV:calendar-query REPORT (Section 7.8) includes a text
+ searching option controlled by the CALDAV:text-match element, and
+ details of character handling are covered in the description of that
+ element (see Section 9.7.5).
+
+11. Security Considerations
+
+ HTTP protocol transactions are sent in the clear over the network
+ unless protection from snooping is negotiated. This can be
+ accomplished by use of TLS, as defined in [RFC2818]. In particular,
+ HTTP Basic authentication MUST NOT be used unless TLS is in effect.
+
+ Servers MUST take adequate precautions to ensure that malicious
+ clients cannot consume excessive server resources (CPU, memory, disk,
+ etc.) through carefully crafted reports. For example, a client could
+ upload an event with a recurrence rule that specifies a recurring
+ event occurring every second for the next 100 years, which would
+ result in approximately 3 x 10^9 instances! A report that asks for
+ recurrences to be expanded over that range would likely constitute a
+ denial-of-service attack on the server.
+
+ When creating new resources (including calendar collections), clients
+ MUST ensure that the resource name (the last path segment of the
+ resource URI) assigned to the new resource does not expose any data
+ from within the iCalendar resource itself or information about the
+ nature of a calendar collection. This is required to ensure that the
+ presence of a specific iCalendar component or nature of components in
+ a collection cannot be inferred based on the name of a resource.
+
+
+
+Daboo, et al. Standards Track [Page 95]
+
+RFC 4791 CalDAV March 2007
+
+
+ When rolling up free-busy information, more information about a
+ user's events is exposed if busy periods overlap or are adjacent
+ (this tells the client requesting the free-busy information that the
+ calendar owner has at least two events, rather than knowing only that
+ the calendar owner has one or more events during the busy period).
+ Thus, a conservative approach to calendar data privacy would have
+ servers always coalesce such busy periods when they are the same
+ type.
+
+ Procedure alarms are a known security risk for either clients or
+ servers to handle, particularly when the alarm was created by another
+ agent. Clients and servers are not required to execute such
+ procedure alarms.
+
+ Security considerations described in iCalendar [RFC2445] and iTIP
+ [RFC2446] are also applicable to CalDAV.
+
+ Beyond these, CalDAV does not raise any security considerations that
+ are not present in HTTP [RFC2616] and WebDAV [RFC2518], [RFC3253],
+ [RFC3744].
+
+12. IANA Considerations
+
+ This document uses one new URN to identify a new XML namespace. The
+ URN conforms to a registry mechanism described in [RFC3688].
+
+12.1. Namespace Registration
+
+ Registration request for the CalDAV namespace:
+
+ URI: urn:ietf:params:xml:ns:caldav
+
+ Registrant Contact: See the "Authors' Addresses" section of this
+ document.
+
+ XML: None. Namespace URIs do not represent an XML specification.
+
+13. Acknowledgements
+
+ The authors would like to thank the following individuals for
+ contributing their ideas and support for writing this specification:
+ Michael Arick, Mario Bonin, Chris Bryant, Scott Carr, Andre
+ Courtemanche, Mike Douglass, Ted Hardie, Marten den Haring, Jeffrey
+ Harris, Sam Hartman, Helge Hess, Jeff McCullough, Alexey Melnikov,
+ Dan Mosedale, Brian Moseley, Francois Perrault, Kervin L. Pierre,
+ Julian F. Reschke, Wilfredo Sanchez Vega, Mike Shaver, Jari
+ Urpalainen, Simon Vaillancourt, and Jim Whitehead.
+
+
+
+
+Daboo, et al. Standards Track [Page 96]
+
+RFC 4791 CalDAV March 2007
+
+
+ The authors would also like to thank the Calendaring and Scheduling
+ Consortium for advice with this specification, and for organizing
+ interoperability testing events to help refine it.
+
+14. References
+
+14.1. Normative References
+
+ [RFC2119] Bradner, S., "Key words for use in RFCs to
+ Indicate Requirement Levels", BCP 14,
+ RFC 2119, March 1997.
+
+ [RFC2246] Dierks, T. and C. Allen, "The TLS Protocol
+ Version 1.0", RFC 2246, January 1999.
+
+ [RFC2445] Dawson, F. and Stenerson, D., "Internet
+ Calendaring and Scheduling Core Object
+ Specification (iCalendar)", RFC 2445,
+ November 1998.
+
+ [RFC2446] Silverberg, S., Mansour, S., Dawson, F., and
+ R. Hopson, "iCalendar Transport-Independent
+ Interoperability Protocol (iTIP) Scheduling
+ Events, BusyTime, To-dos and Journal
+ Entries", RFC 2446, November 1998.
+
+ [RFC2518] Goland, Y., Whitehead, E., Faizi, A., Carter,
+ S., and D. Jensen, "HTTP Extensions for
+ Distributed Authoring -- WEBDAV", RFC 2518,
+ February 1999.
+
+ [RFC2616] Fielding, R., Gettys, J., Mogul, J., Frystyk,
+ H., Masinter, L., Leach, P., and T. Berners-
+ Lee, "Hypertext Transfer Protocol --
+ HTTP/1.1", RFC 2616, June 1999.
+
+ [RFC2818] Rescorla, E., "HTTP Over TLS", RFC 2818,
+ May 2000.
+
+ [RFC3253] Clemm, G., Amsden, J., Ellison, T., Kaler,
+ C., and J. Whitehead, "Versioning Extensions
+ to WebDAV (Web Distributed Authoring and
+ Versioning)", RFC 3253, March 2002.
+
+ [RFC3688] Mealling, M., "The IETF XML Registry",
+ BCP 81, RFC 3688, January 2004.
+
+
+
+
+
+Daboo, et al. Standards Track [Page 97]
+
+RFC 4791 CalDAV March 2007
+
+
+ [RFC3744] Clemm, G., Reschke, J., Sedlar, E., and J.
+ Whitehead, "Web Distributed Authoring and
+ Versioning (WebDAV) Access Control Protocol",
+ RFC 3744, May 2004.
+
+ [RFC4346] Dierks, T. and E. Rescorla, "The Transport
+ Layer Security (TLS) Protocol Version 1.1",
+ RFC 4346, April 2006.
+
+ [RFC4790] Newman, C., Duerst, M., and A. Gulbrandsen,
+ "Internet Application Protocol Collation
+ Registry", RFC 4790, March 2007.
+
+ [W3C.REC-xml-20060816] Paoli, J., Maler, E., Yergeau, F., Sperberg-
+ McQueen, C., and T. Bray, "Extensible Markup
+ Language (XML) 1.0 (Fourth Edition)", World
+ Wide Web Consortium Recommendation REC-xml-
+ 20060816, August 2006,
+ <http://www.w3.org/TR/2006/REC-xml-20060816>.
+
+14.2. Informative References
+
+ [RFC2426] Dawson, F. and T. Howes, "vCard MIME
+ Directory Profile", RFC 2426, September 1998.
+
+ [RFC2739] Small, T., Hennessy, D., and F. Dawson,
+ "Calendar Attributes for vCard and LDAP",
+ RFC 2739, January 2000.
+
+ [RFC4331] Korver, B. and L. Dusseault, "Quota and Size
+ Properties for Distributed Authoring and
+ Versioning (DAV) Collections", RFC 4331,
+ February 2006.
+
+ [RFC4511] Sermersheim, J., "Lightweight Directory
+ Access Protocol (LDAP): The Protocol",
+ RFC 4511, June 2006.
+
+ [rfc2518bis] Dusseault, L., "HTTP Extensions for
+ Distributed Authoring - WebDAV", Work
+ in Progress, December 2006.
+
+
+
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 98]
+
+RFC 4791 CalDAV March 2007
+
+
+Appendix A. CalDAV Method Privilege Table (Normative)
+
+ The following table extends the WebDAV Method Privilege Table
+ specified in Appendix B of [RFC3744].
+
+ +------------+------------------------------------------------------+
+ | METHOD | PRIVILEGES |
+ +------------+------------------------------------------------------+
+ | MKCALENDAR | DAV:bind |
+ | REPORT | DAV:read or CALDAV:read-free-busy (on all referenced |
+ | | resources) |
+ +------------+------------------------------------------------------+
+
+Appendix B. Calendar Collections Used in the Examples
+
+ This appendix shows the calendar object resources contained in the
+ calendar collection queried in the examples throughout this document.
+
+ The content of the calendar collection is being shown as if it were
+ returned by a CALDAV:calendar-query REPORT request designed to return
+ all the calendar data in the collection:
+
+ >> Request <<
+
+ REPORT /bernard/work/ HTTP/1.1
+ Host: cal.example.com
+ Depth: 1
+ Content-Type: application/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <C:calendar-query xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:prop>
+ <D:getetag/>
+ <C:calendar-data/>
+ </D:prop>
+ <C:filter>
+ <C:comp-filter name="VCALENDAR"/>
+ </C:filter>
+ </C:calendar-query>
+
+ >> Response <<
+
+ HTTP/1.1 207 Multi-Status
+ Content-Type: application/xml; charset="utf-8"
+ Content-Length: xxxx
+
+
+
+
+Daboo, et al. Standards Track [Page 99]
+
+RFC 4791 CalDAV March 2007
+
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:multistatus xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:caldav">
+
+ <D:response>
+ <D:href>http://cal.example.com/bernard/work/abcd1.ics</D:href>
+ <D:propstat>
+ <D:prop>
+ <D:getetag>"fffff-abcd1"</D:getetag>
+ <C:calendar-data>BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//Example Corp.//CalDAV Client//EN
+ BEGIN:VTIMEZONE
+ LAST-MODIFIED:20040110T032845Z
+ TZID:US/Eastern
+ BEGIN:DAYLIGHT
+ DTSTART:20000404T020000
+ RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+ TZNAME:EDT
+ TZOFFSETFROM:-0500
+ TZOFFSETTO:-0400
+ END:DAYLIGHT
+ BEGIN:STANDARD
+ DTSTART:20001026T020000
+ RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+ TZNAME:EST
+ TZOFFSETFROM:-0400
+ TZOFFSETTO:-0500
+ END:STANDARD
+ END:VTIMEZONE
+ BEGIN:VEVENT
+ DTSTAMP:20060206T001102Z
+ DTSTART;TZID=US/Eastern:20060102T100000
+ DURATION:PT1H
+ SUMMARY:Event #1
+ Description:Go Steelers!
+ UID:74855313FA803DA593CD579A@example.com
+ END:VEVENT
+ END:VCALENDAR
+ </C:calendar-data>
+ </D:prop>
+ <D:status>HTTP/1.1 200 OK</D:status>
+ </D:propstat>
+ </D:response>
+
+ <D:response>
+ <D:href>http://cal.example.com/bernard/work/abcd2.ics</D:href>
+ <D:propstat>
+
+
+
+Daboo, et al. Standards Track [Page 100]
+
+RFC 4791 CalDAV March 2007
+
+
+ <D:prop>
+ <D:getetag>"fffff-abcd2"</D:getetag>
+ <C:calendar-data>BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//Example Corp.//CalDAV Client//EN
+ BEGIN:VTIMEZONE
+ LAST-MODIFIED:20040110T032845Z
+ TZID:US/Eastern
+ BEGIN:DAYLIGHT
+ DTSTART:20000404T020000
+ RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+ TZNAME:EDT
+ TZOFFSETFROM:-0500
+ TZOFFSETTO:-0400
+ END:DAYLIGHT
+ BEGIN:STANDARD
+ DTSTART:20001026T020000
+ RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+ TZNAME:EST
+ TZOFFSETFROM:-0400
+ TZOFFSETTO:-0500
+ END:STANDARD
+ END:VTIMEZONE
+ BEGIN:VEVENT
+ DTSTAMP:20060206T001121Z
+ DTSTART;TZID=US/Eastern:20060102T120000
+ DURATION:PT1H
+ RRULE:FREQ=DAILY;COUNT=5
+ SUMMARY:Event #2
+ UID:00959BC664CA650E933C892C@example.com
+ END:VEVENT
+ BEGIN:VEVENT
+ DTSTAMP:20060206T001121Z
+ DTSTART;TZID=US/Eastern:20060104T140000
+ DURATION:PT1H
+ RECURRENCE-ID;TZID=US/Eastern:20060104T120000
+ SUMMARY:Event #2 bis
+ UID:00959BC664CA650E933C892C@example.com
+ END:VEVENT
+ END:VCALENDAR
+ </C:calendar-data>
+ </D:prop>
+ <D:status>HTTP/1.1 200 OK</D:status>
+ </D:propstat>
+ </D:response>
+
+ <D:response>
+ <D:href>http://cal.example.com/bernard/work/abcd3.ics</D:href>
+
+
+
+Daboo, et al. Standards Track [Page 101]
+
+RFC 4791 CalDAV March 2007
+
+
+ <D:propstat>
+ <D:prop>
+ <D:getetag>"fffff-abcd3"</D:getetag>
+ <C:calendar-data>BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//Example Corp.//CalDAV Client//EN
+ BEGIN:VTIMEZONE
+ LAST-MODIFIED:20040110T032845Z
+ TZID:US/Eastern
+ BEGIN:DAYLIGHT
+ DTSTART:20000404T020000
+ RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+ TZNAME:EDT
+ TZOFFSETFROM:-0500
+ TZOFFSETTO:-0400
+ END:DAYLIGHT
+ BEGIN:STANDARD
+ DTSTART:20001026T020000
+ RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+ TZNAME:EST
+ TZOFFSETFROM:-0400
+ TZOFFSETTO:-0500
+ END:STANDARD
+ END:VTIMEZONE
+ BEGIN:VEVENT
+ ATTENDEE;PARTSTAT=ACCEPTED;ROLE=CHAIR:mailto:cyrus@example.com
+ ATTENDEE;PARTSTAT=NEEDS-ACTION:mailto:lisa@example.com
+ DTSTAMP:20060206T001220Z
+ DTSTART;TZID=US/Eastern:20060104T100000
+ DURATION:PT1H
+ LAST-MODIFIED:20060206T001330Z
+ ORGANIZER:mailto:cyrus@example.com
+ SEQUENCE:1
+ STATUS:TENTATIVE
+ SUMMARY:Event #3
+ UID:DC6C50A017428C5216A2F1CD@example.com
+ END:VEVENT
+ END:VCALENDAR
+ </C:calendar-data>
+ </D:prop>
+ <D:status>HTTP/1.1 200 OK</D:status>
+ </D:propstat>
+ </D:response>
+
+ <D:response>
+ <D:href>http://cal.example.com/bernard/work/abcd4.ics</D:href>
+ <D:propstat>
+ <D:prop>
+
+
+
+Daboo, et al. Standards Track [Page 102]
+
+RFC 4791 CalDAV March 2007
+
+
+ <D:getetag>"fffff-abcd4"</D:getetag>
+ <C:calendar-data>BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//Example Corp.//CalDAV Client//EN
+ BEGIN:VTODO
+ DTSTAMP:20060205T235335Z
+ DUE;VALUE=DATE:20060104
+ STATUS:NEEDS-ACTION
+ SUMMARY:Task #1
+ UID:DDDEEB7915FA61233B861457@example.com
+ BEGIN:VALARM
+ ACTION:AUDIO
+ TRIGGER;RELATED=START:-PT10M
+ END:VALARM
+ END:VTODO
+ END:VCALENDAR
+ </C:calendar-data>
+ </D:prop>
+ <D:status>HTTP/1.1 200 OK</D:status>
+ </D:propstat>
+ </D:response>
+
+ <D:response>
+ <D:href>http://cal.example.com/bernard/work/abcd5.ics</D:href>
+ <D:propstat>
+ <D:prop>
+ <D:getetag>"fffff-abcd5"</D:getetag>
+ <C:calendar-data>BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//Example Corp.//CalDAV Client//EN
+ BEGIN:VTODO
+ DTSTAMP:20060205T235300Z
+ DUE;VALUE=DATE:20060106
+ LAST-MODIFIED:20060205T235308Z
+ SEQUENCE:1
+ STATUS:NEEDS-ACTION
+ SUMMARY:Task #2
+ UID:E10BA47467C5C69BB74E8720@example.com
+ BEGIN:VALARM
+ ACTION:AUDIO
+ TRIGGER;RELATED=START:-PT10M
+ END:VALARM
+ END:VTODO
+ END:VCALENDAR
+ </C:calendar-data>
+ </D:prop>
+ <D:status>HTTP/1.1 200 OK</D:status>
+ </D:propstat>
+
+
+
+Daboo, et al. Standards Track [Page 103]
+
+RFC 4791 CalDAV March 2007
+
+
+ </D:response>
+
+ <D:response>
+ <D:href>http://cal.example.com/bernard/work/abcd6.ics</D:href>
+ <D:propstat>
+ <D:prop>
+ <D:getetag>"fffff-abcd6"</D:getetag>
+ <C:calendar-data>BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//Example Corp.//CalDAV Client//EN
+ BEGIN:VTODO
+ COMPLETED:20051223T122322Z
+ DTSTAMP:20060205T235400Z
+ DUE;VALUE=DATE:20051225
+ LAST-MODIFIED:20060205T235308Z
+ SEQUENCE:1
+ STATUS:COMPLETED
+ SUMMARY:Task #3
+ UID:E10BA47467C5C69BB74E8722@example.com
+ END:VTODO
+ END:VCALENDAR
+ </C:calendar-data>
+ </D:prop>
+ <D:status>HTTP/1.1 200 OK</D:status>
+ </D:propstat>
+ </D:response>
+
+ <D:response>
+ <D:href>http://cal.example.com/bernard/work/abcd7.ics</D:href>
+ <D:propstat>
+ <D:prop>
+ <D:getetag>"fffff-abcd7"</D:getetag>
+ <C:calendar-data>BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//Example Corp.//CalDAV Client//EN
+ BEGIN:VTODO
+ DTSTAMP:20060205T235600Z
+ DUE;VALUE=DATE:20060101
+ LAST-MODIFIED:20060205T235308Z
+ SEQUENCE:1
+ STATUS:CANCELLED
+ SUMMARY:Task #4
+ UID:E10BA47467C5C69BB74E8725@example.com
+ END:VTODO
+ END:VCALENDAR
+ </C:calendar-data>
+ </D:prop>
+ <D:status>HTTP/1.1 200 OK</D:status>
+
+
+
+Daboo, et al. Standards Track [Page 104]
+
+RFC 4791 CalDAV March 2007
+
+
+ </D:propstat>
+ </D:response>
+
+ <D:response>
+ <D:href>http://cal.example.com/bernard/work/abcd8.ics</D:href>
+ <D:propstat>
+ <D:prop>
+ <D:getetag>"fffff-abcd8"</D:getetag>
+ <C:calendar-data>BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//Example Corp.//CalDAV Client//EN
+ BEGIN:VFREEBUSY
+ ORGANIZER;CN="Bernard Desruisseaux":mailto:bernard@example.com
+ UID:76ef34-54a3d2@example.com
+ DTSTAMP:20050530T123421Z
+ DTSTART:20060101T000000Z
+ DTEND:20060108T000000Z
+ FREEBUSY:20050531T230000Z/20050601T010000Z
+ FREEBUSY;FBTYPE=BUSY-TENTATIVE:20060102T100000Z/20060102T120000Z
+ FREEBUSY:20060103T100000Z/20060103T120000Z
+ FREEBUSY:20060104T100000Z/20060104T120000Z
+ FREEBUSY;FBTYPE=BUSY-UNAVAILABLE:20060105T100000Z/20060105T120000Z
+ FREEBUSY:20060106T100000Z/20060106T120000Z
+ END:VFREEBUSY
+ END:VCALENDAR
+ </C:calendar-data>
+ </D:prop>
+ <D:status>HTTP/1.1 200 OK</D:status>
+ </D:propstat>
+ </D:response>
+
+ </D:multistatus>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 105]
+
+RFC 4791 CalDAV March 2007
+
+
+Authors' Addresses
+
+ Cyrus Daboo
+ Apple Inc.
+ 1 Infinite Loop
+ Cupertino, CA 95014
+ USA
+
+ EMail: cyrus@daboo.name
+ URI: http://www.apple.com/
+
+
+ Bernard Desruisseaux
+ Oracle Corporation
+ 600 Blvd. de Maisonneuve West
+ Suite 1900
+ Montreal, QC H3A 3J2
+ CANADA
+
+ EMail: bernard.desruisseaux@oracle.com
+ URI: http://www.oracle.com/
+
+
+ Lisa Dusseault
+ CommerceNet
+ 169 University Ave.
+ Palo Alto, CA 94301
+ USA
+
+ EMail: ldusseault@commerce.net
+ URI: http://commerce.net/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 106]
+
+RFC 4791 CalDAV March 2007
+
+
+Full Copyright Statement
+
+ Copyright (C) The IETF Trust (2007).
+
+ This document is subject to the rights, licenses and restrictions
+ contained in BCP 78, and except as set forth therein, the authors
+ retain all their rights.
+
+ This document and the information contained herein are provided on an
+ "AS IS" basis and THE CONTRIBUTOR, THE ORGANIZATION HE/SHE REPRESENTS
+ OR IS SPONSORED BY (IF ANY), THE INTERNET SOCIETY, THE IETF TRUST AND
+ THE INTERNET ENGINEERING TASK FORCE DISCLAIM ALL WARRANTIES, EXPRESS
+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF
+ THE INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED
+ WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+
+Intellectual Property
+
+ The IETF takes no position regarding the validity or scope of any
+ Intellectual Property Rights or other rights that might be claimed to
+ pertain to the implementation or use of the technology described in
+ this document or the extent to which any license under such rights
+ might or might not be available; nor does it represent that it has
+ made any independent effort to identify any such rights. Information
+ on the procedures with respect to rights in RFC documents can be
+ found in BCP 78 and BCP 79.
+
+ Copies of IPR disclosures made to the IETF Secretariat and any
+ assurances of licenses to be made available, or the result of an
+ attempt made to obtain a general license or permission for the use of
+ such proprietary rights by implementers or users of this
+ specification can be obtained from the IETF on-line IPR repository at
+ http://www.ietf.org/ipr.
+
+ The IETF invites any interested party to bring to its attention any
+ copyrights, patents or patent applications, or other proprietary
+ rights that may cover technology that may be required to implement
+ this standard. Please address the information to the IETF at
+ ietf-ipr@ietf.org.
+
+Acknowledgement
+
+ Funding for the RFC Editor function is currently provided by the
+ Internet Society.
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 107]
+
diff --git a/vendor/sabre/dav/docs/rfc4918.pdf b/vendor/sabre/dav/docs/rfc4918.pdf
new file mode 100644
index 000000000..566ac4ddd
--- /dev/null
+++ b/vendor/sabre/dav/docs/rfc4918.pdf
@@ -0,0 +1,13609 @@
+%PDF-1.3
+%ª«¬­
+4 0 obj
+<< /Type /Info
+/Producer (FOP 0.20.5) >>
+endobj
+5 0 obj
+<< /Length 1281 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat=*99Yi)&AJ$CkW#_;(r0NeDj,HW2jMG%6]sg,",=7d)F0<.B&`d^gVO.5`fI)N+7,<Dh>4kRrhOc.kjm#3Nc!H#?B4<SFC_`.aC-uU*#?&o(-&JY"=u1Xc\p,BT7qY4Za[)Up0[__MjLJ^iOorU`gD;n"_Q_gouZLu^8[?KUrrA"DXB@B>0&Gq`SqD\e@*i'T#'k&Pj[=m`htPo78Z=LeR.-q(HJ1o,1d.U/M[LJE%'<pZJ/Vk(/!Y\_1\k5hSu>JUYTN?Hd>0A1UR:N9uG'I'[2tA4(ku:3$*EY&#6>'GB)Xl=00["6m,W<h]0/O7uQ:oF\o[@6WHGXe@"]%+JKun4g#G-.j;BTT*LpO=X#ZP/]BJ:+8;H]mfHN'LTSsWNC(er68l5kIH'Z=ruK/SUm?KeP_tAs*@]JK=HIFY8kZms1h>G%<Me;6p6l=!3WS@fIC:.N57B,.n9.=t%aq0@\^!phS#c#L0u`8IERf1,[V*-t:rnX!#R%F!Id8j=s*TDb[#qt/C)Jgi]b!iGNu[o,1Qb_8Dn?alJWqfJ.#Pb9rD0CYQ9ZHsQ;R+nfU*U,Zq*W7U`t*oVrFU62H@llp<B6ON?NLuW<O*k+eM4Unr0U`V]Q:g,`o$,.h$NoH$FmBStMZs+tE=I,RWalQ9YJ.,@Jtmar^A/9%5q0^[B$_m^eUK>^]a-H-2?K+;K@X;K;`2,4.'n@#oL"6[[@NNp5Qp7;Q.Zs-rZ>i#`ktZ2a*TDu,=5H8EVifV9UIDJK"nGsP(9h-ZF-00%+-F`*("ZPlU5W[B]/a]E7UU<c0t'[BG>"GJs!&S6u+9k:Rh6+?A)<Rco_=n>guk@6j7<DM7UB$q7G1Jf3d?3,E4:T_^q1O$6'7KW3bPS;XU)lN]hb`-U;IQL!7)a`d6]p=bGUpEMa'S%RQ'N(Y`,T3IDVGW]nmj7p5D`;W3W$\[r;3@(lcgsPB%r7!3nLj??nsWE,Otp0+?fELI#te/P,p#$O)ittV!!4L40Grmm][pdVJ/hdg7?1<;6X!,:ao6/NYqsOu!4>DH5"NDeo(n$[Di#Xa>bmF5?8:^?i.cIh4Mub94Z"gQn)C.Oa.M0nP@p#mHiNK7kCb<e[D4n?g>&4Z]Rtp>HKB@F-p!*aYAF+53usPY1bVHVgF!KSopX7N9A3_cT(r;=Fb#Jpm-#jNdQ'UU<J5hTdG3MfVX9NMcge"_2rYoajad7>frnu-[4U:hb@LLW7rN&*i,QU^3q^_8>sU0`>p6iTH&iD.p`?d<qcEOkrXZu4*U!~>
+endstream
+endobj
+6 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 5 0 R
+/Annots 7 0 R
+>>
+endobj
+7 0 obj
+[
+8 0 R
+]
+endobj
+8 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 116.72 697.0 136.72 687.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc2518)
+/S /URI >>
+/H /I
+>>
+endobj
+9 0 obj
+<< /Length 2108 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!$I?$"IS'Sc)R.stJP&<\TtdO!Y6"f<iAeqMpg\8W+hooR*pa6CIU?cc(43Jh4G1V5AN#"[bJfRA4Do-+."S\0947SF@3AbRQ/H8o=F[=;;CEr0-72.:J;Ab5-/BpRZ$b_t[2Qdl"V>2FK'5:[PX=k'JgdFTdnhqFm.9k5nSPVB\Ra#6H"h^O\Pkp2.dLZkX(m7H.dlDgAW-Zr9=I]C"qB!EO`@L;jqLF($?F9L.VFtbPJ$.kXciF06hjH$Ul*NFLA*n?I&<;,(3O._X](>-d^OLjE=JgKh;Zko'Wr'G8'3Y'%2-(1ap`M/lf%mR_PV2<-BZ$GsMMlM3^N-\@+PU,MU2FJB3-ooW>]^r*5jjX8H].^5Q_mNX4lY6J:NiT0bR]8!!cN1SG_Y@Brcss/ra*t1*o"^\`)+h;Y7?G>c9ag,R:m=,3!+%n`GjiPVfG)6C8"^)8Ei'F;6r)IT#*9d/i#6W,"C5^L-XTQZ%r\f@$@FW)e5Tb`ZfLnAnI`l#k[Y476pl!ICL'RCMY<V+;a+E4V^+p:4#&9.PDt(E)bCS8>3^o8Knp2a;b$M'(Z4i['';G4qe#(W7K!MSD"6=TpG+(f/#JOZKhm(QKIl'k6gjV._'-_4YgIb;'^\9a,G4]k*E4,9_K/30FKlW!:EV>/"q6B,G%/9G3ZM>l5-F55](R2[mq=W$@iD!.\EjoFfSQ<-6/!;]-(@OIUo<u4BB<rA-C^OW=20,@GCe!)or/X059_mJ7[Ct%7lcg6#c3C7-Ef0Y<C%fK:N*EiG@pD$LYd>2:Z6J;A&G&C<#"l?bgI=`$VOBZW:R_W+(NlQH&?HtLM(h@He<JM"4L:AH_B0L5nZ"kOlWg<Hn,sC5"%<2PRJWs2OK#'fnhUlUk;T':'oZU5Y:0=Kd'$*GUbIWN@.gg2PrjZ/Tn<`r%Kq=X8lj`;\b0B^/&A,<Ug4CYbr6#5289_(!PYW@rIa=\YBkkpA"-e8:'4IO9XWsPnZc2D>miX#g^bA\L]7<P04JBWQ&%)18*IN<3L!<bhJYGD>41J_QmSq_DChc13j<j-Rc73Wf!]`AfgkQ$.VElCj^VVP4ubu_%"0fbD_Ph_op2@`o#.M$a.iY3\m-k_]`MQa<ZWKKCQ<;-4`S!XI,Jtm@Bb*XD3<oA&IhsVL@=(C#4S`/5ST&_iR13c4nNiq->^*?ibU\X=!%mWI-:-DO7i"@uJ)%1X8r11QLIF$=a9/YALEM,:I0Va,=Y(@YV"Ec)Vjj/!JGUZo=k6fML=/rh.T:4iuleW;#e,[Nf6j.o<#]Ro8_=Z8Xu";s-c8G["OQJ_;[hGp"0nRIor<f_$Q0VLJW.D8FB.]jYgY#4044?mL's<#3r[nETMF5Z?oj3R)>hl09U7N3/)!WuYJ(GCZ,U+LSHG(Q"aBEOUjO^0JNKq=a[5^Dgbu99.=S&j8^RTY\=4@4it((R>FRd51![DP!anf//MMnM-+KG\rY3H^hsD$cjqO'h4p1YcH_`j#bTgFiBi$PJ#^%o<sWqi8OG<Nm6%dkhu^1AiOEX!ZJZ#K62NG4l-2+GL_aUJ,'W_l1,g9_P8;#.&.A\MNhV.K7RQ#&aK3@Ssu.I;3ZWM'U\]e!OXUtf&mm`nLb7ll7T3'.DEUtJL]-RT;nCI9VF-R<l?0/Eu%C6IBPh^r,gn7_+R)u2Z7"#GQtNLCPmICn17#U-*3%mU2+gWRFNPQ2Es`.8n/s@`ob8BKgt*;$rK)gOu-I+m<a55-(WbRr,*:IJo?e=KaZsdf4MFtd2C;ZCO_uPHhhOu;K@0!j'i^>0M.#!&m'+qm<4*hX@eT<W\P5D2%-oc<e,%\MlM@L^clKa+Y:XaO%@NNOi8d/LtUJB)mB^N8s&7[Fl;B15<iD!)h7Pf@1-T9ko%`6VEO,kKBU0E'-opAZoq1'Cn6]/X<!djDn(a0q11OBZnNZ,d/4Esq@].$ZEhprf#*&`?.pY`3mS)m[R%gC$^<!,BUs%8k*r^F^4^ZHl'Es_0djPXA`EX\VtM(=OWU..?S;C5:9!srgtk3K^.#V>X\?I#e]g_q9QQr820;c$L3YW[Gth?$9p3ba1em=6.Q[NKPs<(U]ni,,^MZemOe)CX;,1du~>
+endstream
+endobj
+10 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 9 0 R
+/Annots 11 0 R
+>>
+endobj
+11 0 obj
+[
+12 0 R
+14 0 R
+16 0 R
+18 0 R
+20 0 R
+22 0 R
+24 0 R
+26 0 R
+28 0 R
+30 0 R
+32 0 R
+34 0 R
+36 0 R
+38 0 R
+40 0 R
+42 0 R
+44 0 R
+46 0 R
+48 0 R
+50 0 R
+52 0 R
+54 0 R
+56 0 R
+58 0 R
+60 0 R
+62 0 R
+64 0 R
+66 0 R
+68 0 R
+70 0 R
+72 0 R
+74 0 R
+76 0 R
+78 0 R
+80 0 R
+82 0 R
+84 0 R
+]
+endobj
+12 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 82.0 686.866 136.45 676.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 13 0 R
+/H /I
+>>
+endobj
+14 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 666.056 182.84 656.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 15 0 R
+/H /I
+>>
+endobj
+16 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 82.0 645.246 137.0 635.246 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 17 0 R
+/H /I
+>>
+endobj
+18 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 624.436 236.4 614.436 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 19 0 R
+/H /I
+>>
+endobj
+20 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 608.626 215.31 598.626 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 21 0 R
+/H /I
+>>
+endobj
+22 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 592.626 214.75 582.626 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 23 0 R
+/H /I
+>>
+endobj
+24 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 576.626 159.21 566.626 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 25 0 R
+/H /I
+>>
+endobj
+26 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 565.626 268.38 555.626 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 27 0 R
+/H /I
+>>
+endobj
+28 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 549.626 159.21 539.626 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 29 0 R
+/H /I
+>>
+endobj
+30 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 533.626 256.69 523.626 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 31 0 R
+/H /I
+>>
+endobj
+32 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 512.626 208.37 502.626 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 33 0 R
+/H /I
+>>
+endobj
+34 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 496.816 219.2 486.816 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 35 0 R
+/H /I
+>>
+endobj
+36 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 480.816 179.77 470.816 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 37 0 R
+/H /I
+>>
+endobj
+38 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 82.0 459.816 117.01 449.816 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 39 0 R
+/H /I
+>>
+endobj
+40 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 444.006 143.66 434.006 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 41 0 R
+/H /I
+>>
+endobj
+42 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 428.006 205.04 418.006 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 43 0 R
+/H /I
+>>
+endobj
+44 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 412.006 165.33 402.006 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 45 0 R
+/H /I
+>>
+endobj
+46 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 396.006 206.98 386.006 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 47 0 R
+/H /I
+>>
+endobj
+48 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 380.006 146.99 370.006 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 49 0 R
+/H /I
+>>
+endobj
+50 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 364.006 151.44 354.006 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 51 0 R
+/H /I
+>>
+endobj
+52 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 348.006 202.82 338.006 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 53 0 R
+/H /I
+>>
+endobj
+54 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 332.006 187.81 322.006 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 55 0 R
+/H /I
+>>
+endobj
+56 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 311.006 131.16 301.006 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 57 0 R
+/H /I
+>>
+endobj
+58 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 295.196 204.2 285.196 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 59 0 R
+/H /I
+>>
+endobj
+60 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 279.196 187.83 269.196 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 61 0 R
+/H /I
+>>
+endobj
+62 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 263.196 233.92 253.196 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 63 0 R
+/H /I
+>>
+endobj
+64 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 247.196 209.21 237.196 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 65 0 R
+/H /I
+>>
+endobj
+66 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 231.196 251.12 221.196 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 67 0 R
+/H /I
+>>
+endobj
+68 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 220.196 242.81 210.196 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 69 0 R
+/H /I
+>>
+endobj
+70 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 209.196 323.07 199.196 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 71 0 R
+/H /I
+>>
+endobj
+72 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 193.196 222.54 183.196 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 73 0 R
+/H /I
+>>
+endobj
+74 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 177.196 190.59 167.196 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 75 0 R
+/H /I
+>>
+endobj
+76 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 156.196 257.02 146.196 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 77 0 R
+/H /I
+>>
+endobj
+78 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 140.386 213.63 130.386 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 79 0 R
+/H /I
+>>
+endobj
+80 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 124.386 145.6 114.386 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 81 0 R
+/H /I
+>>
+endobj
+82 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 108.386 154.22 98.386 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 83 0 R
+/H /I
+>>
+endobj
+84 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 97.386 243.09 87.386 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 85 0 R
+/H /I
+>>
+endobj
+86 0 obj
+<< /Length 2593 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!$JhfIL2&BE]"=7DN!k2K"=/6S#_+kIfM?kUnWRnb%FiZt*?QntW,rV%ZI'CUNhMdBncqTo6A9'4$+GI<Uk:648%#6RR\176o?OhnpI*>&11%OBNl8Kp;I#LfTeQWKm$?Osj\VB:hU$]#T1Wl/;,4Udo>ML,BP>fD2rP:XFp4ZHk91!$E)l!4q*Wn5@eqRa6u?KJ6N@B-qJP^/s`qY'c%`D'96gbb5Vm36L9;#i4f!XCUOVUJ*?k$8t_`>P=lT4ZW3RoO:fq+#gZG5Bl]P;>ua1ghs>)/UKE"$f\m&HnQM1jZBRF\6dh!aXLT=$O?3=OcLCYQ=u98N0a:o6rE`YO@Xn6Y/BT/;$E8'sEqf!a=<$-LY0*Y<V3Ks5'\//e#/78r`^u>3JEbB\ks*UKLn88ai^p0;Bmh/=HTIj(4`LH(l_h$(.m5B_D]aruB:I]-pH2)e5L\:GR#N08;/K"Q,`mkBMPl1?L=*\JNf91>Gl;L\E7C+4Ih_LNf&cngq=Wk:j-1Y-fN2-G48Z,4LCRj1P`#)M!2kF4E(_TS=R$ShE]f*d+eZTUB&E-g0qOcZV>&gn5'=L"0H@EG1'<,6<Di%&sTEJI3NuG#X^mb4\tDk>Aqt-9"Wem-[TG,#"]UHDaaI;ELtA,?W/%(6I(>3@l+0?=rGBV0b6-6"V0&`J`M@=W8bdkUsG48X3`K'.Z`?,F6%g9->2PLn9oR^utn*=mai#D^Z)3JHWKnM1uj[Gtm@bqALFbf)[_3oQ%6gRp_%VlUmo4#%UH`DH7%2Z*]5I"tV?%pFq66:?V43`;f0,F'B=gQkrS@S%fH21,u6JB0['Sf(DIg'?C[!H(CPNUA5d4iN[i;5X)UoTcQWo1tXI4EX9@o2t31L*[_5"ldDM\#@rVB@RY&/f(UG>";`=1pPu@(L%GG$L@1'Fj!O<f\Lhq6(^qmr+iU6,:fE&)am!pBc6ZNu6]WI77hFBX&M4-j6S]uU@C0FfBaTsp(jThn5m0U4^rhfo`6pN$+`7kpfV9bO1M%3O<<kcm=S]\%<A?LZ#hKZj3Js5p;"Nr3E.$V"0nh"kThsGrR/NnsL"s0m@C%F9iBkD*SY8lg"3Ys)5tJ7+Kg#+R$8,@pE!_PD3DMmhCRTo&8kT.\*`o;0^.FTl82W;#b?C4l3eUPHgreeVoD<4t)lNh!:=!Z[s"N"!frV8,=WJ@R;9upcgK6oc2]k)-\*?!'9ZG]5T-?]kh\-XqeLrAuJCh7tUX8>=(!NB6CihD#Nppp[P*ml;MFoTVA>k9t$(5D*+e]p?ECL)BI,XG_JS^\&+]FM>>T*@p\GZUJ<d\gmEJ2N_j[317bMT&$R$URZ!n:#lTZUlDTrCc_ekH<T6D*_T'a$=WS#Q9)PeO%TP4sq@2<3kRSX$Gm]tOZO>j!;q+^A\)?D`XEC,2NSXE:#Xlrfaj,a;tmmYM7bJQO$+1"YXqAG*lE@\Y-=TW"o/g!mE]=h(Gsm1mF]N'mgk[r"=-)3-(o\u^VfrH!W_ff'dQ1]-T`=N47+K!:cC,`lG@HZO4Nn=116B4usYGu524!2C\=juO`<X8uF5\XtA/o0_#-QXjj#EFMX#7O1=_\;LE"%ER89Ql]%s^A>k2Q,H?3`i]+c9F4,2EW60a0X59lWqk[nEV;OgE`BP4Mc]b7k^[rY#EriB(FBo\#%1kiJ3!%Z5acC6Vtf4qJ>=jo`IG$j46kV4UVnEJ]Grk!TWBTea2Wln5do5[>7[`J%k#aY]qF,UA2WS(O3k;3r$=D_[O9j`mP8q'(mpIM*3s()S'jL0DTK)5+b6[4=pZm%/+$hsn;LCY$Q<%rUn1It^^fm7'S@<[7Asc]N"E,SY=t)e24qm\5t.QBjKCegb3i-62,hL))@VYBi8AS&W\c[X_mg1JfgJ]gJ6hhBX(YL1KDS\YPTsXt8M65b&8Nea;3)(6=5UOGJ_V/O`(.T_;d:`g^ehn6_fMQfn`06#<_oTBA;Z-+JR!K/Kj-L\Mn1YhkEtO$fn#P1P]fcr]n+DPc7>]HQXcm#AW;%Wa9l^WkAI9DH2uQpB[@7b1"p/VOs#46R4jg'B7;Gc#PY#Z"*VWn6/6]Hl[]-VTHg>02>ba4MF89@iCBg4_`S)*Q(=[`CW>5,SWtoLNfK26L[9Z!*SiE-,J71b`cR?grW3kEJ2%1ss7qeYE#79:IEdls`R$2Y6aEf+eW<22`0t4`<jEkTFBA!\(9\bkL]X5tF'(LYL?'@OE,*q#-at/PTT!>ZmJ4g-(!rMj9=X[`#t]]lroceUnrjc1e2OI'.o$;J#%Eg)@dSH^L)A9#;gCR#[s3dr96cQlk3BgPo.o;3e5riHMQNLS;G(@om0SRL"_?7q%F_5Op27@]4Fq.LVpXnelC4_$kc0)T#:ut!3j+`J(h-P5abF4-A2mJ)T?=LP/)bIX[69+-XkFQQeh[P/@S6#&2+%\kRPM27"Fl*,YC$Pb-4f,DNm\0BZ3Fi&!@3@o@+FtulgnQXXgk*66!Z5d]N"Q7E:H]%MK_7c(Ouf:`&`Kn9**kgKCrso8*bH71&BlhOAb3@jPhf7i59oj/2E$\OAb;C_SN9+PNW%+Vo+Yms(aXYBR9;(86Ceu~>
+endstream
+endobj
+87 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 86 0 R
+/Annots 88 0 R
+>>
+endobj
+88 0 obj
+[
+89 0 R
+91 0 R
+93 0 R
+95 0 R
+97 0 R
+99 0 R
+101 0 R
+103 0 R
+105 0 R
+107 0 R
+109 0 R
+111 0 R
+113 0 R
+115 0 R
+117 0 R
+119 0 R
+121 0 R
+123 0 R
+125 0 R
+127 0 R
+129 0 R
+131 0 R
+133 0 R
+135 0 R
+137 0 R
+139 0 R
+141 0 R
+143 0 R
+145 0 R
+147 0 R
+149 0 R
+151 0 R
+153 0 R
+155 0 R
+157 0 R
+159 0 R
+161 0 R
+163 0 R
+165 0 R
+167 0 R
+169 0 R
+171 0 R
+173 0 R
+175 0 R
+177 0 R
+179 0 R
+181 0 R
+183 0 R
+185 0 R
+187 0 R
+189 0 R
+]
+endobj
+89 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 714.0 210.33 704.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 90 0 R
+/H /I
+>>
+endobj
+91 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 698.0 240.29 688.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 92 0 R
+/H /I
+>>
+endobj
+93 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 94.5 682.0 116.16 672.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 94 0 R
+/H /I
+>>
+endobj
+95 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 666.0 227.54 656.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 96 0 R
+/H /I
+>>
+endobj
+97 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 650.0 312.22 640.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 98 0 R
+/H /I
+>>
+endobj
+99 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 629.0 262.56 619.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 100 0 R
+/H /I
+>>
+endobj
+101 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 613.19 176.45 603.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 102 0 R
+/H /I
+>>
+endobj
+103 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 602.19 209.79 592.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 104 0 R
+/H /I
+>>
+endobj
+105 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 591.19 275.59 581.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 106 0 R
+/H /I
+>>
+endobj
+107 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 580.19 267.53 570.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 108 0 R
+/H /I
+>>
+endobj
+109 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 569.19 350.01 559.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 110 0 R
+/H /I
+>>
+endobj
+111 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 558.19 249.47 548.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 112 0 R
+/H /I
+>>
+endobj
+113 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 547.19 265.02 537.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 114 0 R
+/H /I
+>>
+endobj
+115 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 531.19 185.9 521.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 116 0 R
+/H /I
+>>
+endobj
+117 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 520.19 275.59 510.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 118 0 R
+/H /I
+>>
+endobj
+119 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 509.19 208.67 499.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 120 0 R
+/H /I
+>>
+endobj
+121 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 493.19 164.22 483.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 122 0 R
+/H /I
+>>
+endobj
+123 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 482.19 197.56 472.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 124 0 R
+/H /I
+>>
+endobj
+125 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 471.19 186.99 461.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 126 0 R
+/H /I
+>>
+endobj
+127 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 455.19 208.93 445.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 128 0 R
+/H /I
+>>
+endobj
+129 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 439.19 181.17 429.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 130 0 R
+/H /I
+>>
+endobj
+131 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 423.19 190.32 413.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 132 0 R
+/H /I
+>>
+endobj
+133 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 412.19 206.99 402.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 134 0 R
+/H /I
+>>
+endobj
+135 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 401.19 188.65 391.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 136 0 R
+/H /I
+>>
+endobj
+137 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 385.19 171.44 375.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 138 0 R
+/H /I
+>>
+endobj
+139 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 374.19 248.37 364.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 140 0 R
+/H /I
+>>
+endobj
+141 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 363.19 188.11 353.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 142 0 R
+/H /I
+>>
+endobj
+143 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 347.19 154.78 337.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 144 0 R
+/H /I
+>>
+endobj
+145 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 336.19 253.92 326.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 146 0 R
+/H /I
+>>
+endobj
+147 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 325.19 190.88 315.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 148 0 R
+/H /I
+>>
+endobj
+149 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 314.19 195.89 304.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 150 0 R
+/H /I
+>>
+endobj
+151 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 303.19 294.2 293.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 152 0 R
+/H /I
+>>
+endobj
+153 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 292.19 158.95 282.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 154 0 R
+/H /I
+>>
+endobj
+155 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 281.19 240.87 271.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 156 0 R
+/H /I
+>>
+endobj
+157 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 270.19 255.59 260.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 158 0 R
+/H /I
+>>
+endobj
+159 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 259.19 239.49 249.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 160 0 R
+/H /I
+>>
+endobj
+161 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 243.19 157.55 233.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 162 0 R
+/H /I
+>>
+endobj
+163 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 232.19 193.65 222.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 164 0 R
+/H /I
+>>
+endobj
+165 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 221.19 198.66 211.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 166 0 R
+/H /I
+>>
+endobj
+167 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 210.19 242.51 200.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 168 0 R
+/H /I
+>>
+endobj
+169 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 199.19 158.95 189.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 170 0 R
+/H /I
+>>
+endobj
+171 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 188.19 262.81 178.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 172 0 R
+/H /I
+>>
+endobj
+173 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 177.19 242.26 167.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 174 0 R
+/H /I
+>>
+endobj
+175 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 161.19 160.33 151.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 176 0 R
+/H /I
+>>
+endobj
+177 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 150.19 276.42 140.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 178 0 R
+/H /I
+>>
+endobj
+179 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 139.19 182.82 129.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 180 0 R
+/H /I
+>>
+endobj
+181 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 128.19 189.21 118.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 182 0 R
+/H /I
+>>
+endobj
+183 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 117.19 218.1 107.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 184 0 R
+/H /I
+>>
+endobj
+185 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 106.19 215.89 96.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 186 0 R
+/H /I
+>>
+endobj
+187 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 95.19 183.94 85.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 188 0 R
+/H /I
+>>
+endobj
+189 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 84.19 241.99 74.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 190 0 R
+/H /I
+>>
+endobj
+191 0 obj
+<< /Length 2416 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!$I?#uJp'Sc)J/"""B/khChKQPnla#)U/c(rX.G<3F12GTW#i!%o3s*b+gF,hh;fh'Gg1MuLL$@&<:.K)FnH?6nCijkX:>o\.8r=O$3rJ*?uTYCj?F\1Lb+.Y(*b12j#'BcDPI=G4&j13qi8iTRhmqcQ'/$SI>3IG'`UD%9,H$Q%B8c.Ob[)f!>+\qI[n&"e=cWOKQiDhr9^:f$nUm)*:Vs'`?iC<Wf9U:a[)E8S-7kd8@M%JnI&:R_7Mg07]jlngqmD3O's0IaV_F-&=Y+k-'LS72MR[Vs,<kc8/*)\"Kb`m-.'&?i#I6@H1@#BhsFDc>QU45fm5hZ=Q^\'#4^b9&FH`#=>!er\FK;@e_"a-GpYZU'?Wmc&2jX*kl\;VZsfQ;:,[B+T`0&^;Fe.NSEobh8GlLq@(e,Rb@4Cb_O\1W>G]t"EWd/Y+2UFp-NP7qkjRLF?bn#"R'(=TlDS4=H!Ef2bi5Ff]<Oi?5/75SqtI(Ru'RoP#K+0L^.YL*4X8!"!S&YrW_]Rq=AXtL]F_hM@,1a"i+qr]RuPEg1%rd?%S&<%EbC@)1\*2]PE!Et,!>13PIZY3?$=Rc`'8W\%12MP)C#Z9Ef\7-#9DhSRVc?+4@-XdUbM%-gW\P/_(`[1hCIK<1o<ka]]c?K=>B#b77/f-F%Qrhube;__LHN7j:6WSZ\7=^KQVAW3SZd)Tc*Z7f]2k]BoZ%7!+%4[H&S@HA)/Fs7Jqt)Zn_Ik)?*T&-RG&//SUKg[(%5K.V`\FDXO0nulFB<HbcnpK%rZb[N2u_"YYIH(t;ND7m%Zj/IC&&1d)Y@/O>!Vg*/7uE=0(XOR`_P"O;$(dD0ELFiq)#`CeHAi5=t7mY%ZZRTMB"R<e&;tEa">C6S]T\,+^M"f6ml]4[ngE:^trVdF)7qVBHUP'd*3'=9_L3i";!@taUID0MPTQ[;M=e#c[7nAY[$HlQSUJm+V:'/278SbRR]'=^_.R4oi@A=ZJFE@e)Ik1j&6A-h%p+c4m'le4iaaZ8Gm@[9R3#!A[`9:qA>fYlb':KGa]uN(h^TP$Hg]V;tr0+M`-^nl=m[bjZ,NV0<`a_^)C$PLC[hSWj?ideZo>bFa[M;Cq,8.3Y'A^mP>'W:I!_6D/oVS\;[(nGnjup4?_64;okMGGd&>XaKDbVVn3bGEAr)#<+GMa9pa%:L=^IF2ank(CgAR`@'9j@G>[qeP/<rjfG2+/i[0Lr5!hGWa^_ha_*r`qHY!=LWqHdILfXYd9<Tecp?5MRa\]Jbb\F-r(5g6<0r``d9e@lp/!9a2]^pUk<LluM4V*LE-n7%X;jeO<&:OHgAP[OmWi%H.]8@a,fR2$GNm/!U6\/]#KrJJ]d56<2dPZ"CgO5tcG#Th38tt"Y`W\Fq%?&L9\M'f&r!g8(=&q3"Tu=;E"$G1VTcLl@khlf8E0Tb_2fS?nE%Pj3Np\b+77uiN)7d`=d3\P[hjcVB/\C(?7(luPF0o@kf[8,^K&h]!1GJI%0SRSV>$O<rG$T,:@[+_P\B<6&Piq!a(fSbE+te<_9i`o!MWXdXn=i>E!+R&QB%JDc,"@!N<COo%Ac583$44a"dkOH*7s]DW#'nnpb+XVgf(-BXj!DpScD"='bbJ]\>$ZIB1*FBS`eIKR2C+Z@GnL1b9?a&b6iV:sjQjc/T#FP.@d'^6c,+g;-XB;Fi;(CTj_i6??2rdo7]DE,Jo:>mqQhZ16HNLC**9_e&JDQ:D2p_TcS'L.i>opm$(JnK.%8S7\3[H::G&=j'JT[K_bCokp=gjP;&^;r+_\Hlfsrt(W=V7PN,sg!/u1fG,A]%5S_W%-_X]jD0uSI:JZpn]^kp+O`ci5)QO3Pjgek6]%S#+)KRj9hCb<_UV:/eHe!&>E%\.$.<+*)A._J&OeTm'f$4,P?<e72<[!0g8\08j,P)mipNja3Yp<IYXX?6hm=W/_#]aL&"&iGG^UNrs>)`i(_q@G=CBFS!t/Bo,B3`6+E*X=&>r,,t3$:rAnnV*^\Ukl<%>eW=V&oHVJ:NfPkh4s8@nK%5fn7q(L7rQ:`0Fb1T)GpA)i<n(5bNKQ"F(`lE:9(7-c9_(k*6pH#2?]$Kq)+mROu+&I`Q=6gjT/4</)hYu&p;"75`PT/^pB#[%V3I]G*nVV@t9o:DhFd'\^Yd"lG]u`nm!Wk<+E878*/K=%l#*D!&7.(#"18bNf!E9,HapX[]sh'A?CKN%T7hD>u;,$F*tFEG'usE"p(0+Cf&l+dN#SP'@WW_!4+3@JL8MpGei"$=4Ilfo8HDC*SW3&R9(Mq[Yi<qpY1VTp2ucIZF&ef4P6?tj3Q,^qHUB+7[I]_S+l4OUp)oV)7M)o##C\oX6Vm/6<uM!l*d=t*)KXaP0Cg[%T8O*(04:cL`d9*.d7q&\Z&a]gZLY<Wdhd$DL+K0qA3(mT`k~>
+endstream
+endobj
+192 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 191 0 R
+/Annots 193 0 R
+>>
+endobj
+193 0 obj
+[
+194 0 R
+196 0 R
+198 0 R
+200 0 R
+202 0 R
+204 0 R
+206 0 R
+208 0 R
+210 0 R
+212 0 R
+214 0 R
+216 0 R
+218 0 R
+220 0 R
+222 0 R
+224 0 R
+226 0 R
+228 0 R
+230 0 R
+232 0 R
+234 0 R
+236 0 R
+238 0 R
+240 0 R
+242 0 R
+244 0 R
+246 0 R
+248 0 R
+250 0 R
+252 0 R
+254 0 R
+256 0 R
+258 0 R
+260 0 R
+262 0 R
+264 0 R
+266 0 R
+268 0 R
+270 0 R
+272 0 R
+274 0 R
+276 0 R
+278 0 R
+]
+endobj
+194 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 719.0 255.02 709.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 195 0 R
+/H /I
+>>
+endobj
+196 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 708.0 276.42 698.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 197 0 R
+/H /I
+>>
+endobj
+198 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 692.0 174.77 682.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 199 0 R
+/H /I
+>>
+endobj
+200 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 681.0 163.95 671.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 201 0 R
+/H /I
+>>
+endobj
+202 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 670.0 197.54 660.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 203 0 R
+/H /I
+>>
+endobj
+204 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 649.0 265.89 639.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 205 0 R
+/H /I
+>>
+endobj
+206 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 633.19 152.53 623.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 207 0 R
+/H /I
+>>
+endobj
+208 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 617.19 155.31 607.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 209 0 R
+/H /I
+>>
+endobj
+210 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 601.19 176.98 591.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 211 0 R
+/H /I
+>>
+endobj
+212 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 585.19 137.53 575.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 213 0 R
+/H /I
+>>
+endobj
+214 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 112.0 574.19 144.22 564.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 215 0 R
+/H /I
+>>
+endobj
+216 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 112.0 563.19 139.78 553.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 217 0 R
+/H /I
+>>
+endobj
+218 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 552.19 173.39 542.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 219 0 R
+/H /I
+>>
+endobj
+220 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 541.19 249.76 531.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 221 0 R
+/H /I
+>>
+endobj
+222 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 530.19 274.16 520.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 223 0 R
+/H /I
+>>
+endobj
+224 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 519.19 230.04 509.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 225 0 R
+/H /I
+>>
+endobj
+226 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 508.19 302.37 498.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 227 0 R
+/H /I
+>>
+endobj
+228 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 497.19 350.59 487.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 229 0 R
+/H /I
+>>
+endobj
+230 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 486.19 283.91 476.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 231 0 R
+/H /I
+>>
+endobj
+232 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 475.19 345.59 465.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 233 0 R
+/H /I
+>>
+endobj
+234 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 464.19 312.53 454.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 235 0 R
+/H /I
+>>
+endobj
+236 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 448.19 180.3 438.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 237 0 R
+/H /I
+>>
+endobj
+238 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 432.19 171.41 422.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 239 0 R
+/H /I
+>>
+endobj
+240 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 416.19 199.48 406.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 241 0 R
+/H /I
+>>
+endobj
+242 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 395.19 242.85 385.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 243 0 R
+/H /I
+>>
+endobj
+244 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 379.38 167.01 369.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 245 0 R
+/H /I
+>>
+endobj
+246 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 363.38 202.82 353.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 247 0 R
+/H /I
+>>
+endobj
+248 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 347.38 146.99 337.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 249 0 R
+/H /I
+>>
+endobj
+250 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 331.38 194.48 321.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 251 0 R
+/H /I
+>>
+endobj
+252 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 315.38 196.15 305.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 253 0 R
+/H /I
+>>
+endobj
+254 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 294.38 200.89 284.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 255 0 R
+/H /I
+>>
+endobj
+256 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 278.57 195.61 268.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 257 0 R
+/H /I
+>>
+endobj
+258 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 262.57 211.99 252.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 259 0 R
+/H /I
+>>
+endobj
+260 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 241.57 183.39 231.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 261 0 R
+/H /I
+>>
+endobj
+262 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 225.76 173.09 215.76 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 263 0 R
+/H /I
+>>
+endobj
+264 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 209.76 250.87 199.76 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 265 0 R
+/H /I
+>>
+endobj
+266 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 193.76 185.05 183.76 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 267 0 R
+/H /I
+>>
+endobj
+268 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 172.76 197.55 162.76 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 269 0 R
+/H /I
+>>
+endobj
+270 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 156.95 201.15 146.95 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 271 0 R
+/H /I
+>>
+endobj
+272 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 140.95 188.38 130.95 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 273 0 R
+/H /I
+>>
+endobj
+274 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 124.95 199.49 114.95 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 275 0 R
+/H /I
+>>
+endobj
+276 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 108.95 182.27 98.95 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 277 0 R
+/H /I
+>>
+endobj
+278 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 92.95 179.48 82.95 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 279 0 R
+/H /I
+>>
+endobj
+280 0 obj
+<< /Length 1891 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!$I_/H).'ZTV?.l_\^Fg2Ammqm9H4cFQ\C,VMdBf$&AEDn\#6pNg#J%mn'n6X*<#H;k%6^oL]KD]J6I*_<&io9em%VSDM?u^Z.#3uX8K_gH.K'E"t-jUR(@N0^.U_-0^"Q+gMV[N*QOMi<-8J"kei$abO`(6\qQCE;n5H571'oU=F0)thGYMmIF7Vu/Q*:"*TB44=j6cFlU@8<>ik/7qaT/5Jl8.'VK-XKXA:oX>u;,NI="P</Q$4QkB.$$lcM&8!@h3\4??KaDX3e)l]btCZ.au?A=k`_(l#d@Dt@+#K$&8fR$f&UBsK:&7Z!nHkdWZC6Wq$=3\6XVa@,"BJk+9OBYm"]1N4jWW&f_?:7p)\2G0#k$+(ik$s*I.[RiKY5RjXf.^;cLq!Y0Ols2?Jg]gS`7-(m#VC<EV5dJ^O4&r_pUAM*.DN2dfHoJCVh`2^_`6&kAmfIp=Ns7W8[ppb[$0-'7<iBM.Z#1N4Z&1'rka`W[uVG$G@Iqq)K^K)NE/Si+(4:]YA-VDZUK_L=]eo6Xe/[bYkj]Pb#e?_<BQ>??L$H,i@k0!RlH?6%_uABaLf!Eo6):t:O&`EMHan&al%nh3'YMX>jJj7g?>Cfcn6o6I1;\Mh;c^/5mT\3aA]71ri(ABOA&6(($9WoeTA>@l%f-Y#1]8lX1_.nN65V9&+nA%m^R_s0E=<ce3\f()38"7,nL[dm%Ph_W<#%qUJsO_n`d03HC^XFkfOBuS0\R:Ea^1.05i*+p,&1^uCFjdDDP6b@1?`f]"3a)DQ#Q.hN[p'dqe-5V/5IQoj/.'e0]R-pZL;Y@1Dl8d%m9bagtDd8B*@c\>6]6B5.:j1d);Y@?<GI'3FbW3f[Q1[BlAhSer.JA&->RtDRRUKB34$#Z=hAXVZBXab3&SM7#]jnR-ZMG`FeG2sn8oD*-@3sg8g&X,$mDNK#pQ"JZb%>gW</-'I<67)#DR;L,U.$E1a>gVUa)hi'9tjWhISQ\0$)OSbDd&s+A#UFK`fTA)a+t7;5HB0$(IV2]$e=d,WZQ(V'I%#<\)MW_(Xpi7Go$)F-81^b30AUdrQB`VY3RQY<SM3+D9iL,^,]=#kU4h(]%E%'V$Z,&!?ISEQ.h^E:pd<'Ha=1Ui'#%ll\lK&V5T,e@/XbE9d4JBPmAP6a[W7>"[oE(hJKQ2gfTT2OsH3hKPs?Y(clUtWAoL*-9J#`'G.BHZRh#(He'Mof)':N#)pr_#ZSl$UpP1sBnaK(#\gRrl6$*>J>A'FoAG?ON(JWDpdEVA3]OgD'4[-QUq_,DJ8!koDg@;D4Pa_L$ruhWM4bgBG#BJ=F192XTLb8E9t#44P]V_uGN\"A1#N\<%9FLP#@).B1I7/C[E7]G>H[Po*-O`FlVFuS#qFu)'5SRo+=3,A]04%77HT&o^A9G)7g5M>)-qg)-&YS3hiu>%2K&^]-"V*C9fO=SSZ!rJ-b>eFCqJF%UUhBCr2c>:=-%V-(9,T_^RYB(FkW\'q2Wg1hLZL(0<f3+F!MkY[g0U>W)@cKYEnG^>M#M*W5bl:E#S,NC)^nrIDh%aMIO/,IgBWYI^^i.7]jm6EO;`B7g3#42^T@W`%Ul]g\&TR%*E,^SdOX3^_=AH"Xj[E7sTM\.0fHSs/[#;`-Z*[TqQ=qJ`<h13aJk.dfa"7Q$%.q280r:l`Z`'p*=)>=,(fb7?b0N&_9#\B#Bu.HmVcYb6KHbGCS$q[*HGLS%JdR_7W$sagr84SL.J59up")':i\D)`05715J=2.JjROcaSB6h_pY[Bo+>i(hZ5@QiF)Sh0+a+8$<d.cDQ'k<hf:5lNWea=#'(Yf#N2EX),Ob])SgA,aGsf5>>1[Z>'R:@2DqpHD/Wi,13#TK?LHBW7f\lU&Fql5NpAOid]b][or~>
+endstream
+endobj
+281 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 280 0 R
+/Annots 282 0 R
+>>
+endobj
+282 0 obj
+[
+283 0 R
+285 0 R
+287 0 R
+289 0 R
+291 0 R
+293 0 R
+295 0 R
+297 0 R
+299 0 R
+301 0 R
+303 0 R
+305 0 R
+307 0 R
+309 0 R
+311 0 R
+313 0 R
+315 0 R
+317 0 R
+319 0 R
+321 0 R
+323 0 R
+325 0 R
+327 0 R
+329 0 R
+331 0 R
+333 0 R
+335 0 R
+337 0 R
+339 0 R
+341 0 R
+343 0 R
+345 0 R
+347 0 R
+349 0 R
+351 0 R
+353 0 R
+355 0 R
+357 0 R
+359 0 R
+361 0 R
+]
+endobj
+283 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 714.0 197.82 704.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 284 0 R
+/H /I
+>>
+endobj
+285 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 698.0 176.15 688.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 286 0 R
+/H /I
+>>
+endobj
+287 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 682.0 189.49 672.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 288 0 R
+/H /I
+>>
+endobj
+289 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 666.0 192.27 656.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 290 0 R
+/H /I
+>>
+endobj
+291 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 650.0 202.82 640.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 292 0 R
+/H /I
+>>
+endobj
+293 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 634.0 198.38 624.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 294 0 R
+/H /I
+>>
+endobj
+295 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 618.0 198.38 608.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 296 0 R
+/H /I
+>>
+endobj
+297 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 602.0 205.04 592.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 298 0 R
+/H /I
+>>
+endobj
+299 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 586.0 204.49 576.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 300 0 R
+/H /I
+>>
+endobj
+301 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 570.0 199.49 560.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 302 0 R
+/H /I
+>>
+endobj
+303 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 554.0 208.95 544.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 304 0 R
+/H /I
+>>
+endobj
+305 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 538.0 190.04 528.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 306 0 R
+/H /I
+>>
+endobj
+307 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 522.0 183.38 512.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 308 0 R
+/H /I
+>>
+endobj
+309 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 506.0 225.59 496.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 310 0 R
+/H /I
+>>
+endobj
+311 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 490.0 199.49 480.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 312 0 R
+/H /I
+>>
+endobj
+313 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 474.0 205.04 464.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 314 0 R
+/H /I
+>>
+endobj
+315 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 458.0 197.27 448.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 316 0 R
+/H /I
+>>
+endobj
+317 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 442.0 195.04 432.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 318 0 R
+/H /I
+>>
+endobj
+319 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 426.0 200.04 416.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 320 0 R
+/H /I
+>>
+endobj
+321 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 410.0 244.48 400.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 322 0 R
+/H /I
+>>
+endobj
+323 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 394.0 176.16 384.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 324 0 R
+/H /I
+>>
+endobj
+325 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 378.0 191.15 368.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 326 0 R
+/H /I
+>>
+endobj
+327 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 362.0 187.83 352.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 328 0 R
+/H /I
+>>
+endobj
+329 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 346.0 195.61 336.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 330 0 R
+/H /I
+>>
+endobj
+331 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 330.0 185.6 320.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 332 0 R
+/H /I
+>>
+endobj
+333 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 309.0 155.59 299.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 334 0 R
+/H /I
+>>
+endobj
+335 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 293.19 185.31 283.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 336 0 R
+/H /I
+>>
+endobj
+337 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 277.19 186.99 267.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 338 0 R
+/H /I
+>>
+endobj
+339 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 261.19 214.2 251.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 340 0 R
+/H /I
+>>
+endobj
+341 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 245.19 203.1 235.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 342 0 R
+/H /I
+>>
+endobj
+343 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 229.19 195.32 219.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 344 0 R
+/H /I
+>>
+endobj
+345 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 213.19 165.32 203.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 346 0 R
+/H /I
+>>
+endobj
+347 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 197.19 198.66 187.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 348 0 R
+/H /I
+>>
+endobj
+349 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 181.19 192.54 171.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 350 0 R
+/H /I
+>>
+endobj
+351 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 170.19 281.14 160.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 352 0 R
+/H /I
+>>
+endobj
+353 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 154.19 187.53 144.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 354 0 R
+/H /I
+>>
+endobj
+355 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 138.19 198.1 128.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 356 0 R
+/H /I
+>>
+endobj
+357 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 127.19 286.7 117.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 358 0 R
+/H /I
+>>
+endobj
+359 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 106.19 270.89 96.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 360 0 R
+/H /I
+>>
+endobj
+361 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 85.38 201.73 75.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 362 0 R
+/H /I
+>>
+endobj
+363 0 obj
+<< /Length 2146 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GauaA9lJcG&;KZL'tS7.#V/N36lt/26!^kN+E;TA.!e^+`XuZQL*S/6rq[oifq,IJO(*ZZ$8dUAQa@eELGM;GR%:q*:-@eThjZd#q;1\$HG95G]d-FX-%8)\k0;K6pN+L7GsAspk;3(N:ElEgf^m7^\!QUF89-`dl^`537!eY"O2ZFOb0kYi_/$*YWarLZpb4iGS:hlA7bjL0j>>FqcBB9.pXdfa+(?&XR"Y!i*MGjmKHLj>))qk%e4(m_KI07O)H"7`J7466@VCT/T`sJL!RVLdTEcB3\]3'9K?teHTnVO"!RVLdYQl(C\]3'9(2,DO@=[W0(:F4^W%\H&e%CuXT%7&,VlT/ko*^M(H'KslBjS6%\q$d+5gbB_E%td7$*0!3JAabFi<"KK+X"=^o50oG^OCeB(!#p[4VXBb>A3GTqa3G1,[uq@*OLqj!#//9oomVcCjtGC`?X/)1NeQ)YPaJYM?\/3c`B_k&3c&3q[hGjp^]f[1=+C6*S%hS?S\1$S2sk@M;W%if;,WbY7#Z\`=-2p[f\nCklRuZb$qu13kXtF6aaPgeCBf`F,i_3cDs[h3e/ppJ['41JEXGc?ICjl26Em\XAFGjjh-leJ@%<6rhYuHgGac)'>[XCkk07+(dN>n3-[^\J)T4L`C?/9B!!&)L_F-gq;)l-("BI_<d#2E$1Tuu5W%"ke9n`Bg;;W0?b[T[\5M'O(FVF27>&>u-k!M-A$C%GdDh9,is%nq=nUS=@BWi4KGWk2Y?CBH4-DN;ne*dC$[+hgNK/"c3=M5D"s"D+.]PPQQNnF9<LQ"qMCmsnX$!1fD[74!nBD91i)2bBGm-R#!K0=^C!1BJJMVR)PY<G`PMaK-q=0tm8O5H!^#;fEb?.)!\:Z[pmtIJTq0J_-m;<8/\G;=ngD`Tg-SZ[^2)8R:)N>:lN(fMg!84lp(Q)&9^I]089fh_CV;aYd\qU;]h$!J!37/"P)OKYSd8sINkn:?G5KQkVai!#fR9V?1"_g@kM?\,29:LcM_G8=.,G-,g_on1ji(.MW\<`FW9PBA;F:G"kbS"IBTL'6":kO\1!<mV4Ehd[]$S"mS6^PC(d:8W0+8:jpgCthh\-uS>5^+Z":=8bm:3jf*22)+`:ehIqXEI8D`L$k1bSCl=9cn4ooVNP%lWgb52R*+HQ'V9h&ZrmTZD@_H3bQ2]WOgWXbi49,]4Q(mB&t=%OI3hF#4';F'%$UQ,0SRnX0$fS8ED6.?1&Vfc1IUJiZ:cSgd4\ej^O,Sk[rLO(0b!/6Q%8F5Sq$:dUB!\7dZ_ir<=[3O6_B`dAP[a(*r'c>2u&j@F%3LRL9YeRaf0t&r[C.cK[+Up&>K8_/-q%LHmS^5Ng#O8hQF0U9Sq3WL>,(TZAu2Ckp"tCicdFIEtm"Hj4Wp_ZreU9;0QN[WPFKVh0?4fi&+3\_kJRp:*=<3Gh0_!\@kq$<PU.p-W;cVDbB7\'tVKA4$esoU-9m#$Z_(f,qi^GQ])PJ?./ko&5rg0\Hp-orUaC6)[+Ld_ZsI+<#JiE[Mr?.J&S:=k>_D?1/\%T:(A5nM@E\A/u\[5V;#@[o/u`*?-E<.E]&%G;#VnmUmuIf"rS8o4gtn+"2_q6)j2ZJ/[%;JYHlXptMa3gP';Pf9!?WpI^J$$U.266,[0,4=3W."4eP:@SIVr;H?g6.PXXWP.Tl'@JXk8S.aDE4H1R0U)(OPQsq<HOQ<:;iGf`_2W2"pPTNo(?]S!9<h9&@%W.0"RG=HN:*2nY'Xt$TV)B)b7YEAT2?=H`J@o'(i-G*2L&iZAN$`P[YiXM<gj>,"Spk_kD`Et=n:7GBhK6/g9DBJ2_?YM=ie4"CjMQi0iJW$O;%E()GG6%(5]lZT?#NbO)n>+IFoNtqe"=GQb-EFt-Z+In.@bqCj(fS/*V=GJZ_o`eGrG;FW/ofE>lNLuSaP4_YP%,\<LZlCe!kER^,QIL*VH>5AD/9Y%tg@->#bl.oW2A(ei-Bli<Qnn!qVMU3Z\K7+^o>e[ftD>N#Uqi6X*(o$R3MAs+g7Z'=pB=:doUG&E02[/K^Ddg=7]YkZ9rdF5VS"n(S42omP1F>IiNiPt\Zf\nTEFJ8cZ*k9OE1jT9fOZSFBK+OE)>@W`F[cG/82P:KXSS"Dq!8Zu`=rrGokL33~>
+endstream
+endobj
+364 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 363 0 R
+/Annots 365 0 R
+>>
+endobj
+365 0 obj
+[
+366 0 R
+368 0 R
+370 0 R
+372 0 R
+374 0 R
+376 0 R
+378 0 R
+380 0 R
+382 0 R
+384 0 R
+386 0 R
+388 0 R
+390 0 R
+392 0 R
+394 0 R
+396 0 R
+398 0 R
+400 0 R
+402 0 R
+404 0 R
+406 0 R
+408 0 R
+410 0 R
+412 0 R
+414 0 R
+416 0 R
+418 0 R
+420 0 R
+422 0 R
+424 0 R
+426 0 R
+428 0 R
+430 0 R
+432 0 R
+434 0 R
+436 0 R
+438 0 R
+440 0 R
+442 0 R
+]
+endobj
+366 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 709.0 195.88 699.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 367 0 R
+/H /I
+>>
+endobj
+368 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 693.19 128.67 683.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 369 0 R
+/H /I
+>>
+endobj
+370 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 677.19 128.67 667.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 371 0 R
+/H /I
+>>
+endobj
+372 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 661.19 128.67 651.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 373 0 R
+/H /I
+>>
+endobj
+374 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 640.19 239.51 630.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 375 0 R
+/H /I
+>>
+endobj
+376 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 619.38 189.5 609.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 377 0 R
+/H /I
+>>
+endobj
+378 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 603.57 200.61 593.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 379 0 R
+/H /I
+>>
+endobj
+380 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 587.57 169.48 577.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 381 0 R
+/H /I
+>>
+endobj
+382 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 571.57 208.38 561.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 383 0 R
+/H /I
+>>
+endobj
+384 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 555.57 239.48 545.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 385 0 R
+/H /I
+>>
+endobj
+386 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 539.57 255.59 529.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 387 0 R
+/H /I
+>>
+endobj
+388 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 523.57 218.11 513.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 389 0 R
+/H /I
+>>
+endobj
+390 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 507.57 242.27 497.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 391 0 R
+/H /I
+>>
+endobj
+392 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 491.57 207.84 481.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 393 0 R
+/H /I
+>>
+endobj
+394 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 470.57 179.5 460.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 395 0 R
+/H /I
+>>
+endobj
+396 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 454.76 176.15 444.76 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 397 0 R
+/H /I
+>>
+endobj
+398 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 438.76 174.2 428.76 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 399 0 R
+/H /I
+>>
+endobj
+400 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 422.76 192.81 412.76 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 401 0 R
+/H /I
+>>
+endobj
+402 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 112.0 411.76 133.66 401.76 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 403 0 R
+/H /I
+>>
+endobj
+404 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 112.0 400.76 136.44 390.76 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 405 0 R
+/H /I
+>>
+endobj
+406 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 112.0 389.76 158.11 379.76 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 407 0 R
+/H /I
+>>
+endobj
+408 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 112.0 378.76 118.66 368.76 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 409 0 R
+/H /I
+>>
+endobj
+410 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 112.0 367.76 161.43 357.76 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 411 0 R
+/H /I
+>>
+endobj
+412 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 112.0 356.76 152.54 346.76 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 413 0 R
+/H /I
+>>
+endobj
+414 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 112.0 345.76 145.89 335.76 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 415 0 R
+/H /I
+>>
+endobj
+416 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 329.76 178.95 319.76 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 417 0 R
+/H /I
+>>
+endobj
+418 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 87.0 308.76 169.77 298.76 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 419 0 R
+/H /I
+>>
+endobj
+420 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 287.95 232.84 277.95 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 421 0 R
+/H /I
+>>
+endobj
+422 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 267.14 178.38 257.14 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 423 0 R
+/H /I
+>>
+endobj
+424 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 87.0 246.33 133.64 236.33 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 425 0 R
+/H /I
+>>
+endobj
+426 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 230.52 189.19 220.52 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 427 0 R
+/H /I
+>>
+endobj
+428 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 214.52 193.63 204.52 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 429 0 R
+/H /I
+>>
+endobj
+430 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 193.52 147.28 183.52 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 431 0 R
+/H /I
+>>
+endobj
+432 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 172.71 236.98 162.71 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 433 0 R
+/H /I
+>>
+endobj
+434 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 156.9 226.16 146.9 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 435 0 R
+/H /I
+>>
+endobj
+436 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 140.9 231.15 130.9 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 437 0 R
+/H /I
+>>
+endobj
+438 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 124.9 216.7 114.9 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 439 0 R
+/H /I
+>>
+endobj
+440 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 108.9 248.91 98.9 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 441 0 R
+/H /I
+>>
+endobj
+442 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 87.9 240.9 77.9 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 443 0 R
+/H /I
+>>
+endobj
+444 0 obj
+<< /Length 900 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GauI69lldX&;KZQ'tV@E=@!":*>9gg,gB"<0l7Gh*%7+i-5]tgSbh5FI)JQ1Nlat2q;;iug"hF-[Go=N>YGu"%Wm4c+#mX_5etc3";o_AR"HRUJA203_soa3!WLoJ]^7uD+@-$)$a@%s*lQ\dnX&edN%c\&5<MTj_4O'6C&"-pY;/+RDb\-G>T$1eACaM)4PaURf55o&@`XDf%\@F"_')\\-V+o>KoL*U4gtpd\fWiZjBa&L,t/f_&>!Eu(+PPS,S8^U_T>@@)*//F.p008raJ4&R^9h-!XWSV6$*C'TTEU*kZ\YDJg<1[1f%+5)97k5o#qYH(+"l^HN,\uhTk]AYZ*C!A\T&@@K_g/`H;lpaCXhEZ9;;Q%oQY&EcY'</u6]Hq(1$2R759XC6H4\ntfY7Kb_qi]%/VP_Xda"n2aqi<3]u)oo*1t;'!lV#=!kmPA.:*"_uL18EU2jAWSI=6#WpSQ(bP+\=I#ZGS`,r6GY7?a%*QG&6Al-_&@M7'[8g!ku$JeT;@k$/hp:a=)#BrYK]5$ALc5;Bpdb[f!4X18KQqiRWMT=cH*t*1e6S_&\!9o&;`XV7,/<IC%O-uc]c2V?9N2:3"D@;TtM,5c&<6eRG3pn@J$3O0%Eh0],d:nLm_h$EYpr/R>P5=&fi!'0:3Y).F14YC:?bej&h%]&Jum]8!U6Rau=Z^Dk*sh.U"B_g72o#<?gbYQTdaGb]J1=4G[$cOE5B1WhHpD7,j3K9`F?K6uXQ1[IWO<I+9Wr32?b1%rLos$Jia*SYFZR4Ag:,&RsD3:k7LXq>:$ZB75Jlo#b7#(l&Re31X=mlPG+cF'(!!9EmqU="b!hrGA2<&Z):d=eKBH53JshI'$F(7eJ5@L<kps_XOIo<W=_3di3f++6@m\M?~>
+endstream
+endobj
+445 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 444 0 R
+/Annots 446 0 R
+>>
+endobj
+446 0 obj
+[
+447 0 R
+449 0 R
+451 0 R
+453 0 R
+455 0 R
+457 0 R
+459 0 R
+461 0 R
+463 0 R
+465 0 R
+]
+endobj
+447 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 709.0 260.35 699.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 448 0 R
+/H /I
+>>
+endobj
+449 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 688.19 171.72 678.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 450 0 R
+/H /I
+>>
+endobj
+451 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 672.38 318.63 662.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 452 0 R
+/H /I
+>>
+endobj
+453 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 651.38 279.49 641.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 454 0 R
+/H /I
+>>
+endobj
+455 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 630.57 244.48 620.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 456 0 R
+/H /I
+>>
+endobj
+457 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 614.76 307.82 604.76 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 458 0 R
+/H /I
+>>
+endobj
+459 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 598.76 241.98 588.76 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 460 0 R
+/H /I
+>>
+endobj
+461 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 582.76 154.77 572.76 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 462 0 R
+/H /I
+>>
+endobj
+463 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 561.76 275.87 551.76 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 464 0 R
+/H /I
+>>
+endobj
+465 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 540.95 96.45 530.95 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 466 0 R
+/H /I
+>>
+endobj
+467 0 obj
+<< /Length 2858 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GatU699\*g'#+6EW-l^sb(C7QMRd<sf\Mdul`ue#X6^fK&s?'Y&mUOJGkTa-;ib?G#`LT3q;;iR!8V"+J,Oos[X.K(qeX)Y(+`LU(VsSXJhI3#`tqkaca"[+4A$EjHL^Z_ZWE(>,RE?(bs.]Sk]/(tV41PE58L;,@&%8KKB#Ga:%E:fFIBAk]ZFod3nPcQ%bm5Z(i%ark_\X5UXg'k,b!t9q7W+hG<#6mW7U8%SX_nAA$u1.,A2CMdMgs-6<AD_5_k8tdeDtdU/E+=k<>r3Atr'`4YX1m4Z`V$>b@[_E+JJA8"lEDkV%[>Vi>H"dj#;LM%Ss39b/\5%Tl!J]da>K827fAL7I!ioKdDm^M=,WQ/1cja\I^k)Z7Oprsl>%)o1%)J!`F'Fnst6,)mp#7PmPppD$DZ&*[955[HM5r9:SZcdjIk>VM@)IWEROLQgL8c+(,^ZMOs_#Al'DWZmU85:VU+]mNQQBJ4cf!7D)=Ume'M`:dZB#GgY$&KgZ]>DY*&L15p='"k"q[V(Un*I'slq=LTsOf&<cnX6[9QueaZ5L/#rd8_J'"S5]6,p&)2__-CMU!<a#hUT^(.(RAbTZBsf6DiD766M;fA\EhCfr9.@<iN5L62h<7h9fNkp`t,KiDV3.n7_.sZX$SkP]NTL%*V)jbPKsDVb*%f3?@o](O*+`T/+HXPXtgX)i6]eF1cD;<tJLTG,:2GLiVsl\YEEo<d:3K0GT\Nd>8c7VJ8,$>mEu92PJV=n.1sGn,Y0mNN$r39B)ha9C#4$042>nGRr*-_`3rs"7BdkQGD_4o5KA$Peg]=i/cjrROEa'D)=AjhqoC'9/en'MV%rG]u=^M?GSppY%h[Z`2EgQ_m-Y;5N&>c4M^@/&Lp6K"d\R[;4u26rKm]dP`MlBlO=Os51bs0O(B\TV:u66DM`5C\#Tk#'D5`?6E[IRG"d;o4MoaZN(<SFZn4!>%E.-fIINImO!;.E&tf<a'9j(oC/7^s;)<df$h>C%\\!sP8Sjp?bn:uC;_ln*BP:R2YmLR4V-=0KUQaEl**!\kJ]C'VTuV3P4Kf/"1qs,kJp?@1O0aGi7LM5B2AOs6$Rq+OlX$1$*eb)+'(A"h/Bi;-W(45==WUF7^4(D.-4Ftpa5c0Y_h]HQj.*jPFHSWDcY+FX-5U&='S!59eE4TBs5&=!bC@*3$hQbZZ[TE?9pW+:Tpe*#9pi/@e+ZET_YIukK'8C@pg?k+>hagOM@-R_[_e-]jDoL3gV#\X,9BS[DgM<Pn!>%E9Nf63:a9XNQp`RRU9S@Ukkf7QMK8&[KVAjtghR3Z+\C"eD89/+lig?hKM-9Rm"/\"N7((+@tPF)E.OD,_.QptP+C;<Vog0_j1a>SJj'G6Ms-n]dS_<5R".[M>?VEL]gD]r9N=4_Zcu`0o^ud8_jIct?][3da;[HkS+A#gXe=a'Q7*?+).-\]-$=KO_HFIW7<&S$<]33:Q*3\?P[],.LH*Nr:G1jm3HRfDPblK,#DYNa<&#JOH0h!"#A:hAGtJ.HPO8G@AGI,VG<8c57b[8uG_j/iZV]*ej$3p;WJA=2ZZ$@/(36G"%+j:"%cWjeejA^BZsCYnaR9+hXb$X_4JOtIGb1ZJ#E)(ih.EN%%pY'U"`.nT`2X7e2VQe7ppos+&sOgEILHq75EM7)kG2be!/5ApOc2b(J!tT77B-Gj4R5'>Yg>-FdkfuBUrXPpX%'e<Lf)0TO:!ZtaO81d?jLPA4!kV?\prCqOTKBHHI:a]=(j@T4CqJfABot?"IF#Y5_pmf!TN`tY4$?h70]$s@)IV@PfiP*fb=F809*<tUQFE=TZ9',7u_YbMJ52-3/Hf>AX5kq;XeRS:si?BoG&5aH:R/h]0/_8J3:<fIRsJMqN8bEV#Z2S:C0\);%<4$MlA=R9e#g5R'kQn,_S>E5:_pf.Ec3NopjL@ZOkAaCp!?X[H#8:%R9'I1H#`!6WEqdOBoc`!DDYuF+lstM5LsGF<T$J8O<0":4UF!5-(RML;ZL_f)kdEZ&uqf!A]L_!Wg"$R]7@E_h!#^3f.4!W`Q[%/]XF>>?kTmje;Z#]?`&@\`c-!`WD[3`2;/ndbE]BhRQdOrmCIJR^j50lQ'%=,UhsjTGAo4Vl)mjNp=^[WYt+i@M;F"VuGN.<S61!W%1G-nr`r8Z._P8E4g6djVP3JU'f-Sl=p^dGV"g;8o2lSr;$F+7qGJfP`psA-*"\]*'!]E[4[`j6>>`2GQXpfLnN@Q!-FBo*q8jO]/R4'O/r'eUR9"<I37K;*:_N/UR5u>@Bdf;P^)nr)Pm+n;H04$$3;,L[4pESXAU&=-OD-l\uisT/'5K'ZP^*pH$.t5[88LjY(YZ7hKf[r+aN+,#-$E2UMr&QZK18\72Vd\o\-hZ=YpXFf-#T6#Mu8sq,0,5hn"oZ&<Bo:1=D8<aX%s4_j;d-a!%3Z#Cl#%3T/Q]+?,^PAl0#OT+l,&^#`-5LQ53c@"o#,LG_3lUnK&&O=^uo)QDZGE@m'[HXY(bp+XYXeJ]g0Hh$U<<h:Zi8Z4Og/%K7;E<8gOXn5l4L--aW:N\`[T&--5U-4i)VJ1rCT>QeL7bhH$E^(qaSMP;Bq1KAZ*cB)[ZmK`&8,N5@F6skMW5/,*HpsohQfGa_fkbOu=0Khhc=1Q8R3$*H?:iV9m]Y.?/2=c1D7/W#,Bkui>gc8c]>dFi3-.Z`OINHp&Q9Ht+nqU1KM%ai*aXpaFNoR"jcZI6/Z0U=a'YjC3Qq$\FHQ@tc*VP^O1)[^=VuiD7k=^;`Z(ttbqB15,RK)GF.E<U9u>3mF@4YO!S-PH:!19iQT8jbV12F('SB;c!STQHQ";DW[9VL7r@%.m.gU@os'4'd>J9erXibs#~>
+endstream
+endobj
+468 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 467 0 R
+/Annots 469 0 R
+>>
+endobj
+469 0 obj
+[
+470 0 R
+472 0 R
+473 0 R
+475 0 R
+476 0 R
+477 0 R
+478 0 R
+479 0 R
+480 0 R
+481 0 R
+482 0 R
+483 0 R
+484 0 R
+485 0 R
+486 0 R
+488 0 R
+489 0 R
+490 0 R
+491 0 R
+492 0 R
+493 0 R
+]
+endobj
+470 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 389.93 498.866 435.49 488.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 471 0 R
+/H /I
+>>
+endobj
+472 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 379.75 477.866 425.31 467.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 471 0 R
+/H /I
+>>
+endobj
+473 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 326.51 466.866 372.07 456.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 474 0 R
+/H /I
+>>
+endobj
+475 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 95.33 434.866 132.83 424.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 19 0 R
+/H /I
+>>
+endobj
+476 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 241.41 434.866 278.91 424.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 33 0 R
+/H /I
+>>
+endobj
+477 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 314.18 434.866 351.68 424.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 39 0 R
+/H /I
+>>
+endobj
+478 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 469.15 434.866 506.65 424.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 57 0 R
+/H /I
+>>
+endobj
+479 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 407.21 402.866 444.71 392.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 100 0 R
+/H /I
+>>
+endobj
+480 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 128.37 391.866 170.87 381.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 205 0 R
+/H /I
+>>
+endobj
+481 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 237.52 380.866 275.02 370.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 77 0 R
+/H /I
+>>
+endobj
+482 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 336.94 337.866 379.44 327.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 243 0 R
+/H /I
+>>
+endobj
+483 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 120.6 326.866 163.1 316.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 255 0 R
+/H /I
+>>
+endobj
+484 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 185.33 315.866 227.83 305.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 261 0 R
+/H /I
+>>
+endobj
+485 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 402.53 304.866 445.03 294.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 360 0 R
+/H /I
+>>
+endobj
+486 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 182.81 272.866 234.47 262.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 487 0 R
+/H /I
+>>
+endobj
+488 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 95.33 250.866 137.83 240.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 334 0 R
+/H /I
+>>
+endobj
+489 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 262.25 250.866 304.75 240.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 269 0 R
+/H /I
+>>
+endobj
+490 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 415.55 239.866 458.05 229.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 362 0 R
+/H /I
+>>
+endobj
+491 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 148.93 207.866 191.43 197.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 367 0 R
+/H /I
+>>
+endobj
+492 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 328.36 207.866 370.86 197.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 375 0 R
+/H /I
+>>
+endobj
+493 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 446.12 207.866 488.62 197.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 377 0 R
+/H /I
+>>
+endobj
+494 0 obj
+<< /Length 1017 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat%"=\n'3&:WeD=FDY3)r`^;^(jfSWu`f$HO00"->p(ZPKJ&.rr"l,XiG9V=ReX=Z,cGV1X/@9Ede`Glrl<)(FM+ESmZ*05E#Y6`<&-,E6h&E$9`JOlP+d=Cg4ljP<oo(MO\3,k'2%8ZH-Bd?:Dg^H:796Q.n[YhW3PUNN0X?kZRU;mu6?7eS4(X'7,oZ8\%`%6%k,KZT/2YLjg$PCb6G!RD)7]MbS3'WsX)'W8TdtDpP\BF_&`)=X6FZeoHA,bGn7)lHmN28hWd;?Th7]=`,!Q1M3p,\=06Gm)+td`f*qe!/-G+qF2*c]sdtQA-LqJ6c).fYkAr/.a<+OJ\4tqeAs+E[cQ1%ne'kS["IWn7ld7Lp>PH)ddaUB\3$dOl+3H$]&ruJ=B^lQ.Ee&03-gohdE&cRdg=./."RN5C7R(M5fRh:\6cp60hK?Q,h)n>*&I:)$mSpub_]_aiIeMme)1<Sf^co-:DI[g`H*jbNog2"YS[UGfJ?GG',E)!HBGbqCc?@4j,VFXg9>bJ`r"^[JR3i&=U#R>A$/fspm`/+74TNQSeBnWZ?X\AH#"?4XB?2QCOun9)t9Pq='1H;**XMB@>3#AnFg&T']A88mq6Y'CbGe`R@8'_L-P-FmY1fg34nU>7Yd-"/@4[,rFeDc'l!lKI\M#$%dUZqNlT&Z@'?AGs"@V-M87=!D1".1oLGJ7DY_dW**NRA&C,0j3hNT92>[=\6hbiGeV&0E\CYX97udJu$S9U_pG[E=$N`T`?:tj_9N+\sal2DK7e1+^Q5&n-9W0i1&m-kucc/C]d7H="5<i$iC$/S2;`L.Rd/WbZ*;qZ7_:ht[@;^78"#IZpR1[Dq9"'=MM:2Xi*/Y"2!VNV]Bn<Z?5_mZGI:;\p?`;64RNG[0'Ptohb3MuDKL</aJ^\\A#^(XG\[l_n$)9!@UW`aDa0pVt)q5Sln-@f9.0Lr.<Z(o7=:l08.adTmiW4!Q-cpGC.gUO1.n&3K>@duO,<A9ds/f(Pn]=#;aEuh~>
+endstream
+endobj
+495 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 494 0 R
+/Annots 496 0 R
+>>
+endobj
+496 0 obj
+[
+497 0 R
+499 0 R
+500 0 R
+]
+endobj
+497 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 400.28 680.866 445.84 670.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 498 0 R
+/H /I
+>>
+endobj
+499 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 117.83 658.866 163.39 648.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 498 0 R
+/H /I
+>>
+endobj
+500 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 92.0 604.866 137.56 594.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 501 0 R
+/H /I
+>>
+endobj
+502 0 obj
+<< /Length 2087 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau`U968iG&AI=/E.!OU*1H=dHV0L3FiKj>3(eNgEe#Q/ig9ic!-Ft7qLXqXmRdI.47.-3Tg3"0Z2<pt$h1XYMp&0NnKZY,B$2!^Z[1RlT)SO\)X+HUb?[>+S6>6,IMo`[cE#Uho_?TI'm7WC`E/OMkGpCcYN7$imqq1QAE9;?,`>rH-f`\3omV@;1uJ$_2bELrb7XQan%2G=W8V>^6Q!=9Lf_7;gBuqh>H`h&:TRfA;%EbQ<:X'(F;VPp:o;BH8]<AQf]#IXDKnG](DjuFTX(8F.N`?3EJNN+RS'eZklAf`mh`'-Xm)SoE%'.Jf_2&(Wao9FB>_SH<So6:85fEJ*:-H$,8PB(1(*Z>lqqVte8o-GcP+>2.q`cj&BA[S?qW]@?+gR9/GZka4MWZCFGL#]hjoF**$WI0p7U%Uq11@sa];n"8[l3]@a$54Zm$/),k-(3H.=D&_EK-%i#r@=4_t*<53gMBdE09s!DO-4d5*Uu6.?V9Y[kOB'FYIJCSE@>?lZgfg&YI66]F^&oRY4:$=HU/HG@q/1;?\%N_k4=_Zeg!GQo?1/nM#)%jO+_:\:1:_t0<ZJ2_sV_1?XPTIE]d:"[JLgX&0X`F22r:C3c/L[:5,L7ph9/(L.!s(.mfgP3\9gf%q\m]f9U7bQ(&3;\cilkZZ;>k*DI7[F87i"A>j[8\Vi<mhYOh#jcIhEnRA/ggrNcL\l8>GB[kn`["@ZcC?4;=:;1Q3#XuRWUK=<7U-J@UZMgJeX[4_<.)sL#d3k19r*E9i4>=]0(_i>r!XP[dMfH]/hhZVPB:C#L>LJPN0a(=Z6%!F@2->bGgBXqe9-;Obg9"i?qepNos1C4@t=]Dg59U]pLm<`:['AE%9#j=c9hmOt_e%Qj>Ai5\.^!,!%gfH[!iHUk7m3@7dG->ulkn"6BYHN8]d1R)n;LI5K]k-V9SK2`m0B8VmZ5Xk`%j<5VDa[Ci[l79kNAk?D-tqC(4YNX0`rcfgep0^8rJMV0B3:/#Ir"l7*%#7IG.+TSXq2:FD##cQ#jBKbf,Al"@2E8q4^q1<&\i]EqSUoGg'OTi.)d%Fq&.A"Je?1pIY(<3TUTRE>KN&$A04[SsaNa!nKQP$aHnX)glE(\?0RPB-.b!J#tZ-;A5i:VY)@pBmna.`0KDuBi[U?iCT/$la<G/9p&ElNtld+9#*Opm%I\*d8.^`A:TAVEVMJe!4W<3;.1-;[ZZc`%k1:LnP#1iO)SZ;"7bTM'Q\(]AR-E42FFTPQo]3j[c,)16B)e=MD]-o^)gSL2_N5g]ql?OiHI4_DP[`_V@PaGrW:+uAGr#!S@BmkY&`0Ao]hQ9#<2\\T7uJn#o(fh0\-BfR<%&fYA3L_"gUT<RoTPT7,E-WcEa#ArA#i!gE91YP1]JJ^$ra-VpW?9XIN7ANul]?uBsA]FtKCq=C>)"X=bE3RER\'!nkE"+V^L_M[N2b<$ZDV:U'OV"j'R_>r]aEN#=,&+14Y:OKqXk[SSr;\M0XUaa2;nuE92DGL0P)>$d3WO4&5sIorTZ\Fa\EY)V%/V^Z*TZ`khnK*]QPEM+W-*Bd-sOM3\0gG1!rV:kA@:MaN&AklM@-Ht<4.>2S-;1Mqn!_NeR*>^->sXf&6X*ta647_.B-qpD+2t'Ji!Mb&G0gX.06/=!H/s#'T[qF+5fRhP!=T[g$r8H%qZ,Gi55Y9_8X:B],e,EKs):@%Qi;@C9'X#M&S\d+X`b^s0^a?es\T\p9_;eNt&H[q/"9@A!\7VM&D@I@0`X"cO@(.P%Q+=*b=bp:["+WCe-EeXRoXV_s>O^hL/K,ACT27eUYptGhoa,00uh>P<s8)Fjm$]V+u?((e$`ej^Q8L+[96!9R%ueS_?SN-4&prhp]s\ZDdeZJje8&[qj`!pKoF%f0e19$UbDq:MtDs&&"gK!]<4i6!2tj]LDdmR*jYd[4[H*76q?N^$\O$\^\Rup0[S&D3DMVSo1I`?+h*i7(JrSIsr;LjQ=b2^Z\phbjC2jYo\2J115OgH)XA&i46,-.gN2@PdFF,+[>M)_-*oEBk6F;(?2il+MER/,Y4-dXO"@d"n_WI\^Ne0/ofdn?Mjn)L.\?~>
+endstream
+endobj
+503 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 502 0 R
+/Annots 504 0 R
+>>
+endobj
+504 0 obj
+[
+505 0 R
+507 0 R
+508 0 R
+]
+endobj
+505 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 255.86 680.866 301.42 670.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 506 0 R
+/H /I
+>>
+endobj
+507 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 117.83 594.866 163.39 584.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 506 0 R
+/H /I
+>>
+endobj
+508 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 134.77 551.866 172.27 541.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 33 0 R
+/H /I
+>>
+endobj
+509 0 obj
+<< /Length 2955 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GauHN;01JM&q9SYi:t:]9Iu<j-q\B\1N!h4dqO--U\=+&aTFpt&fMD0!MF$(qccsm\4_F:EgOE.Mb/N9mYBV:^BO;jr*jmmHbjsbHh6?Qn#\2Dc\K9NMaOujqm/RBRX"GZqtOV_\FseahhV(^?8Kd_.ZCC.G:M]WF1G8]\Tm%%'ft<uSbH<)\@.!YC[\Sgs*86D\2/[e5D^b?-lU^\#L3,:2*YT-kDkDrocc'Yl$B[N]a0.Um+9-ef!@&i(>/tbi.l(#r1=ULm$_)LN134n"ins:KsAjBpT/%#^%Zg1`mncW22Wtb@Hk\G*Ztg4B_3%4'S`O1Q&oY[@4\oo=?M*KG-/-5X6(1aO$Y@bF(s#G<[$D/H5%gs#roY(MF>87AEcKFEfK(08Rt98,[9f/]MmhX!$_mk0^:eTBG9fj.8MMPAGi9F#Hph+pld*!ME'/ogK^i2a=*?cC>7c-#pLNkr^:-?EKk%j84$];T#n>@Xg0n^AID'7;F/YP`D@OZmIpI-ijN?lZ/8cKLH@SZgM?M=k1XQY/XQ6LOfZr6.OhA?F_4?)o,IE1>J7cJj/D:.9+rT\,Yelp8=&l+,KgEf92'"=O_""QKp1<?2%$W`>-T>e:OoWU\O$DBZaB)@#u3V#Z%4[XE6(Hu'%7>p<pjJo6!M:U'Z.C.P$@g=)+F-CfBu/G3a?]oG-KdC&CH^F"=?j[TQZ5o:S8K)J0=aSbiZ^]\'<1@9K_mh*\/mBcI,?"+*YuEja5%b@*QoF"Ul`'8E,:aR3NWj%8nc-_NS_*FQCIq0&m7W67,idlUJ`"I_K[db,=Qs[9FMmIMs*pe,kbq@Rt9t!(_g^"$0gL^`,udn9,ZAV:+?fn^!WrD@b(ai33r!=gF0h$S5$m4--K$)M0D&&rk#%-XUOEPYU_b#_?&.o!/=m/R1!=hVgdN,Y0lI.g]'`X<:ISCRn)0GJAWpj,*i*!n3UBlQ2j"^(aIITeJnRUCtD!?gT;b.d92G5jGjpAQ`3lZr/[)s-m'7%(PcON3O@i!J@P#U3(.?0_n6mJ"s@P>8GG?HuQ)q)TSU=1_&c2.D.id9MX]0iV[CRIuga?caYm23i6m".W6(DBaum-1EfgbQ5Z:V\4&Y3OpOZC:3Kh[hX_dG4U2,jEZW3Oc5.1b5H-64bkO&d8pAV%A&!Qq2_].6&$Z8Lq+)\Z@iF)QMgU'Xcs?9j,_Y5@`O98>o1cjCdqul[S2JA)DCltjeD(gC&jcdIEZ?qSI\]uK>5)n.\rK`k%>*kD[t@'](HjjDo46+A0Y)PA%^<=6.,,G'k&gY:9H-5T&5\59Yfsd^HeJAa1_meg5<M>`+4HsUN^4@S$Ue\)<=?7,)Mhi?[N?28Y'GL4L/`M2SDn/I`u)GBc',4gMW;MuW(D!Y+[lP'+'".^7=1dX)?cb/\bd/bOC_YiCn*/-HElR7G#QO(SmqNhO*A>q(JE"Rq(C[=(lh)GKB_GK;M>o,$^@IB&;d#+X>'FZ_=kBjN66\H(Z[9gn8*BVk9D)Or5@kE!KOs87Sg3[#T/C9HtA2[7VSqL1l6J[MD07Ok9q;ji+_7ND`cZ=!q/+61-:\U#DdS]b_f,LouWY:#5nQdHf5_V1"\Y;DGrA(BsA;m,;^^=SOc!q"Z4h%Hf#0QSGB\+n0cCjg*b"8@Aem1)6_@cl<CGATn_;YJZFE&#h&s5NA$[`E7=s:@3$O*<Ch^[AZ@2ggPL\-*:W0.4.VjEBIp]iVbC'nP7TYlSs3k?4m/g*9i*/e+Ydic+mobCg/3Zk<&d/.:$?XO<A"!X@"gE:!*18dq@'K'l6N0E1;ecep$Hh_7-G^NVLX-TVNe,tOWB_I]s/&%Q1icu:"l8+mWIG#9b4bD*CI?@>\&HZ*+=t#J[!Zp8E;95Y:s`E1F?0,BQ)+]KkUq.k2Pq\cYgpmn7e0DMsm!-<6"G/'i8XZL/lOho,OcOa[,,>HuVm@d!i%Y5!h=Q,.%Zk.SK-HV6!/-$-$Y!!5g&nV/D3b=Y7"3IKNYR'Hbu?B"?39+L]+kMc4<8*!fYH*<D9.3%BUF!Hi$=[b53`'Y5=J%[=i/;oj:.=<TJ@J;fc<&VX25FO24+M+VgSp7-)=V@k!t1pYiUe,fT;nT#=L-+!<UMZ^/U;2@iQ`GJDs9Es'&hV@op)M%8IGBa(/;ej==(@P"pa\(sth3fmn$AT!d$a^Oj1\YnH$XeH)E;<$ZMWGI1#=n,(hf5oEg0X>\B6cGi?!B%cFDVG`NL%1<L=WUn7.Ul[Ic+K2d33*7dTj;<U&;(Dqham^JQPJW-ka]CU4#$S1<o+pAE$)/3P"=9S/^An,0Fi9\8U2Qmd3:R5m&D94&amh*,>01GToY:/[`HN-V(!@r@(&l3?/T))D,$]hVITi]pW7*$\jt^)>WU;1bOQD-\HF"NQZ6GhG#[C9IHFohW!P(M]_,on`=[_\mt\)<"<0A#>X3+&5JnaYD.`0I`D)sBH3:9ShY8pp26O=mG\#Fe+3gpNM,X.pV2FXro)E8>OD+%Y7%6b[h!u!>[+hN*=fR5m9h"IK1+fgBnhs=Hp?E$pVWsDL;9Dk_TCE#0V$3%W1BH@K/-!6Zqhg8=do5nULe&_cpX8YM1#(BY[/Y`m[I\s=,>/]"'C5"9)1b;/+(%O'&$J:o(<*r^`-H)l$#/XKUHGe!eTAup#uIm9Ui/A6Zm;T\5[$t6L:a8lM:q";>^8lmZ'ZULRtu@j)8D!NXBcf^:B=T;_-r'N`N0FbB4t(r*VGQ4MC:qVM%cKU+nRgj27?f2dl7%gL'FLp>O9oo3mO=a(;#j3gc#<n6m*8FN,e)PQF!ce4c<9(dgD55K'Rj/qVsJQYk)lc=ZTanV@!Cbo>\G0SQPM%S,Jck.UOO?gN6I!I(EIo$5Pb(-A5Ya0$/-JYJSc?5LV##"?.oAeMoY9kQ0-LU&@@eT[fV&j[W1V&C)gPMN0umg/t[E:$[*Hu<Wmhe-*=`W~>
+endstream
+endobj
+510 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 509 0 R
+/Annots 511 0 R
+>>
+endobj
+511 0 obj
+[
+512 0 R
+]
+endobj
+512 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 282.54 93.09 378.64 83.09 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 513 0 R
+/H /I
+>>
+endobj
+514 0 obj
+<< /Length 1747 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GauHK>Bf'b&:WeDG^1GmV\mVPJiO.8fs'-fB@EXcgYJGP&&K*TY-=iX5l0e.^4=5CUcE_QPD:9+B(Y>WdAPCh8ZR&FCW+R/D)-#Ig7h"m"9+,=R5!e:;^\_+=_UZElU\0]P].BKcaB`1\ZM;]*]]VEaQQmpRW]J?/6O_c."aX_R?4SupCDkX=I?%D?c0F5<]&bj7$@p]W=_p8-K]GIK]K'O=*I89:YAY9Rej+sqR"r)-H]7XT8H]qokieZP9f.o1h#p]l5Q[1HaaVT6,Q,qc!g<ZLq&=@Iu-AV_]pWB8[/e*2hNBI!pMAK#U1$.LiSN]pUiuc=ZnnbWkY>Aob/)uQ&"`eL[qrF.&dbraaW$XkPqNh%2C=-/em%thcM;8mC],hCs+e8-r%^Yp#?]tON)rZ*EV'XbECu$of-1$>E6%$U#R,)RhYd-I!g":Fl/]Rb;:16]2ka-GlIQr!#O&q&mkjf]BQs$@5j60oIBpoSF7<38gEsgNA4cTJWa.2^YXB*>CZk$;F)Ofj*j)eqEP^qJ73C@^n\YT/,GHuR,c%r41\T'p?`h;`%9WH#d*gqbPgU"j$kdD$f-[kpH5i_7DE2NR@VLl93K5;;P^'JM8VR8Y-=2MMA]:u,tR6a87WifSD_'.RG8phG?99n_5pfk3F0^Kp3^>i77Iin!!njii#lhAhqdJ9M&Q>9Ns610BG"CDGh#?MTrtF6j5H_@$bDdr@,*UlU/YM=[k\\c3"\e?>-BYY9MN=b1_kgs7,i<)N[4_O%O*P8!Cg=Na$Z@%$!]l&*](Kd&9E@)TRKk?eFNhl,s.7=9&2@H0NgJ:'6QLBOcSt;M?JTKK@LC+#Bu$Le:@s]$Y6_Pnt^`:J4UlV#b%0$Po>$aE5j:%KNM`T8&&PAP0^[7_dpN&n&C&KYNOa<*eg)YYT2J>X9+-QpN6OWCnk[E$Fs)d]B\Rs&Y^kt&pjl3NYoKr@?U4hU/>ia.OV*oS$#hc!M>_a3&),6+Uqc;VaJpD.AIAF=N"nD.KLtD!\K>?SP(-ep@+=B0PUIf>KEC#+'Sh+gB-X*No=]<4b-Cr=RaYb,,WUg^UN&q$BOPie6m.WG%Nb<><4J,fXg$d\I#OR11o@jL;(QMSS>fcC"]k>n&@H3&M^?q1N[ki;C:X;4NtkOJfNfi&@6T&AXeD@b&eI2a-Z2`eXsbQkib3N^kfd)d'ECsGJbVYobb<ac8%uB_d9OZNce^3H=>Sh$>O1b+p4RoSdLoDD51;R1)5!afgW+BdN$.N]%c,_Gh;=4h^hYQ<b!3Y*L\31_;UDRUMfhE$IEAp>_Oqm\8o_qo?.X9-!YQWhJQpkCcFQSN6i\T_.CYD%(f/'f5s'KbVPC!^B(AV8G4h`0&&?:Fomp4]r:lRW\'^2^sk;cdlW-&m>T1-DRWjKeSq0=[e_D;Z=l'Ejfpq47i$F*f4D>Q&^U&p]4J8\a&QU1BV?TTp\\*n@nG&d1WDa=g</W+EQ@Mqkd)14/;J%!8u0,`jhK:]+gI5!&T\t-_Io7I]?bHYhPFH!$TT_C,IZPca2.?0h&aePVsEm'jQc!hO.0q6-A0]f3i_(1"jN^YK1"(6--a[^G$sU,LJ3U>HXrVhL'r4K+aLaf2F]?)#l4/S3ZbA!hNECo$*iTS!K;hM6D8\YfbZOKBdmWu?8ckoL.Kgfp=pRhiW989,>PMZ3/qEKG"Zcu1Ep4NB9*ASj"q+i2)'Rtd.c><FIg;6l%.iCJ=,M'raVt2MZ3\LA?;U~>
+endstream
+endobj
+515 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 514 0 R
+>>
+endobj
+516 0 obj
+<< /Length 2668 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat%%=``=U&:XAWi:s"+B4=IIDoMG"M3C[iD5U+Y@j]J'6p`)$?7%q\lEB[I&@nG6eTpWm8M(^9n(SM)]/k;R3dWuqN%Ou+E#/62h!hGmF:H8"i;!_O"4*pEYs/'XltnC>#Os%d3BVlJAh)u[G:sA!b@sB\o3UBTcuiU?ne0&flX!Dqp[!NJ=EF8Mg9gF:!>:,uKSsGJ@%"H7X>8hZX$78d?Q)uR[h4'8'#qu$Z78IMM>d2Qs'!gjRW:^SfAeeF5&sgid;"'TfJX=d[A^-RH"hX`<hC'7Gb/i"c9MECq0EMriDV!]J=%@a,*j&;.b-)_8@73dQW2EF%Q#.RYi\\jZKmsfgMq1\^MKPIE4gH(c?#<6I!L3_EI[`'o&BA3e06?A*ihSfgN!V?3anokQ7Z$uDf77AI\E(9?.6+bC"VMBjrtD3>g?sRR:Kl$c)A]q3S1?>\>J_ip#!43Em;tJ]-kMmh/6lnCpU(K1FimOflJ@Co\t%oB@1,Rbrp,s_!ZK9PDn@I+upYE]J&LAXT(_g_@8ZW$3q;g`F,qcFK7tQe+i'Q0qZ'ZQ?BV)c:?,g?dbEbRLtjW:Gk4nKF<fPpCQ4?@\R!(%E=fU6,,o<2>4kp)Y8@&FSlrDk9$,$UMGj/SnE@4"1JR3(Ye%tVN6fl"Q`.:h+iuC#!KaW2[SI'bF5m(VgmG9eNYVBU(:d!^0E$YRb`jq\=U*(j"G+t(DTK98>t6))^;b(WEFX<G(`.6)cp)4M/e8m'q=ah]2ZH=r8HJK[=[kUif0p,CZ1c6J]4#e0$A#u/Up=5f<[*dO!NJuiQcl#3D_Eq1<2ZnB725h4-9!gIaQJL"j6&_m,.]YEahJ8YK:q#^5'\ED7n?_QE:dqrC^;@%=A(8Ib>DMhN4>/2GNrj9*M6XApiJJA1U!(2:8l/i6&F(SRW-"q%[PsS8D@rEe+@;$*>UV:""-2.DY":FhS/\D-_,Y!Mh*+6EqLH-KL"mj)>UMjt!+6/KOIOLl/<M9^fIW>L?`qKYX4'9I/Y&>h&'R/Usi@LW7%2m/VtT>)4d@pn(afd!h*JiaRsMYUSHZbb8N-TS*#f\AV*6N_ED[<`Cg9377TU2pp1ZYF7?u$4\rkUkOt';\GS6MII3o#lfX0UFFH$Nm9_G^^'Y/M+=(:GQdn7!B.>V6)5OT"('$&8pbQ8itmg*S/2fAKX4(_R:$jPVF(]X/W6-ko#8L>"EFqK#;^lM&^cImo^tlI$O2tmn5Z.t/4TAP?uI(cfGe\Rds9t+JNCkF&kR@8lm+4tA1Jr@XZI"YJS9S=@,GR!lq&kaFpJ6lqRk/qfU_=<r9jQ%Fbe2a,?"(n-*hG[*`p`E"\[7:j?sk3U]Oo@=bLfl.qQ2FWK.'4fYr#&S`3&&ncD12]SCArW]R]gZEs^nh_`nuVMdAUTe,`u+!dJL(k/LG&F:i76ogSVC'mR58!>>)b8r:6*ERGgBRUG.cGuf-C!JOYZ>%1A;Oh5e,krZ0*.&U-,K)<#0oak^E^_f4'e:sfnjZL!^c(h37eYIP*c$ML77%PGJ,T#7P];@M*EQ[UJ19"h''`=n.U7/15Paog#s`T4<<<JNK'M(IdX:i\;;8'.4M<oZ/PeEg<.GSa""8rK4g(hsDa_l#kd.cKne<6h>bp*19+C'(2NYMo!H#"2!'."I[7a(97Zad3P'dmA'1Ys9iqoLSOK*lJ*(C>YVAiGP1&Q3S"!`@5FGh-fJPFp;<r1n`R@g2!i;YaB5diFR^K5Z($L#U%^m2^b3GT6Yi4PC?5%9P&s'.ggVNhX98NZ)=J1^DI!#$"l1a>&hE2Y/:>cR9I.V4&!;G^ma,<B@@BY,>"LD9NB9Z#U=#F")]&_\&qm)jKKR<^Atf*6<QdYQCXm@OV8(]5TWSKR<!^dG"W^;RCSprml;b<[*?>Y^r-$K8sCHBP.+Hl>l`HI+3:0BYAmTGnh83HeU><<^DXTM>Y@;n;?Jl3bZX3ioc\k7W[CO>GQ=At'6/,CJYA\e]4;gC8R`HK<'nDN)n??upWKeKO$Y,?!5/%WJA1=aM.uiM%:a,[F*m*baBEZ2LL(h%7X/Ri5jHJ\YgK<F`UKGrpe[isMRd@&0h<W<[)\B[T"U'WO^LGUD6`0O1lfa_RiKR\B9GcQAuD]sk>Q&r`;aTk>4meeeh)D/ahp2Z:h^&+Aj=n@fBja8\``5#`#!QBqf!.3hAq@T__CdM'Qt1n%,/&t<2OFI:f+%U8/?V<"Ad3\&Rb]e&4_f/lar;FYpUeR#9'1#5lpC9fUO1N45qN59Y/,V*n4'rfoJX?bf9l>epGT]Fl^)SOOb8&SVlfL_a5Ot')tl8,F'OtS''PXS9A;Ni(80Ne?JA(2g-OrBh*0Q*cuIA]IBL?c%b8f@;tY1[#q3DcO^/:u3rV7+tm=D;0)D]Fd6ct>(r9:0jS/PfK*"(OCL@h00`6:DT+c'<8_H6[YJ/nlRg9sP:$s$VMI9CNeGp:&:Pb%*VI\:8B`[[+O[[I!L)*U,/;[?3EQH6gPld\U[`.ZWC50-(--TSE.O%rd\2K<D#CmBM'm1rHQtNrikAEM4%L!PDS7!g7J8]_[hpn*g8>^'%m9j\q]p";^U>YM*Cc3S<o6%IS#W.=n@l;<(euKHLCd^Bo]!;T/ol'hg.XZr.:hl_M8m6FLPlbJ#geLI2)e^H26&0pK=*~>
+endstream
+endobj
+517 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 516 0 R
+/Annots 518 0 R
+>>
+endobj
+518 0 obj
+[
+519 0 R
+]
+endobj
+519 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 332.51 157.408 378.07 147.408 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 506 0 R
+/H /I
+>>
+endobj
+520 0 obj
+<< /Length 1005 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gasao966RV&AJ$CE,.4m&g0*"A(oG]aebDYBb-UOA.V4/+Ye;qotR\@8@5\a,f<%`X8R4VIHarn]3[(`1l7EpC1g,FRAEbi^,.;qF&jPTS/+uP8'_u%_@WR@X39^B[]gQ#L]VAVer55'".,1P.<[(r]6/a1_Vi0=CaA;^D@h326LB?nNmp=E1Ufh=$Xjt[0<jM@e/1/s,d[Q_ZK%B3DHe>;E=eu/PS-Qh%51S$n'dYjq&><HSalF(XtT?/T:+Y+%]ID;"E_=,U,3hLpBk(D5k@+`Qcft`*\WJ47<6cFFMMlW+"(S!N#;'\QWA`>62AV*QU8FDo6HjlP6k#)7e:7m4e2?Y/J(1Yfc.[tD=c'oDD8s0.1@b5n'@gC(0`>!GHg)D':",>a=C%SGfbc<ma2s,KDuO_A2+!A2i\,g`.#rMBW,?Rk@8A=0qF^`G"3S16.:oV2*P96Dk$hX.R+:i;C7B77g;dn/[Wl+h\$:V#-44hM%a8Bb8_`Kk!G+/c"jNDch%tDj6@:e4^tXhg$P^0M9jt^Isd^(RA_fa$eHD.7.rl&gf2_o*//is<ESm"P;W/IdlH($hG56+`LqWR<=+JT(h=hbr!:jE?NIh^jOBm/_Y!_j!;o;iF]L1]SEYWD`#0bF&>WNFDWsl>DB>1"Ch=Q@c-_%qj.Y"0QWeaT9t.W`'9npCfG9O\$2Fh0mr!UWZ$nC"R&R>IJbNi9+VYDub$nL7LNfQ1d(T\pPj`#oh%@g2$tQKIhg2CL?:,(*"<:]oLkpAD3J4mp4@$29f7EAJ<L,g`eYefM@&6sd<jkgH5FQdD5sP8!)$B5,DO;V.i0q#bUab<:>N"<(i4EM.Y2cb*69lqPpYk$LODXdN.^-8)V>,k2_kWpHbIB+$Von&b]=TsSe"t`o7<Xm6--/r)@e.^4ghU$[=csIBKIhrrBg)URBdkdbe2!ERW<pbR1l@lhT`KuSG[CbVs#ina76X=,5G/J$9BVYh@IZ+HrhsH/!L)iO(]~>
+endstream
+endobj
+521 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 520 0 R
+>>
+endobj
+522 0 obj
+<< /Length 2903 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0FgN)%<&q0LUYkV\.aoVm2"Ne<u(F;hY[47S:.V7^M#S+i,i8t%_=o7kRi,)3k4eNL%9/#?31YmJjVu(RgmhW)2Qd_Njp4g9"qUMfos2sd>c(Em_#%h^5S9t5`ln+CWf/FB3XEQiG%aFj>pK8KZW)Qo'R)NI=?-LmnoC$^6^YHmSX)oW3Z[_Za^D`N(Sj2#P4NO#Do"s(u)]n&l2@9pIG2hjTY-SA@P44:3+3f,-<DIb2Idh1LPfm\VU%_$hKq018(`acN-UbNIV,S%,7=cqh'#16=e=qfbUFJ3LgaH4PZ,MT6o#kK^D84o`r6'O\73[Xp7+.dg:)JIW,0N]h.Qk>K5cK%*o;lmR.6*jOfE)h=5ad09fh078*9"uU@:btLl7^Y$q&cpQBA^CbhRs.8>H8U40:n&!-Kmd5p1IRNipMcBVGc"#6L"fT?PeY34P#O4@-tI[A%V3I`Gap:QK5:`C"^K9,^d?)Z2b?64O5kNpjli+_gad0Q]YH%#naP,>,p(6hK4re!d`>)R3a\jPKET]=aZ]B3Y]/?/+a_=_3n=NF0cdF%r(-D>Hdg4ZVfl=l=cq:&U3YmXMJoOiGcjO0@!\!&lhQe>pY:!#CX+$)c:5_WS)NcKQE'r7J]eF;[<PAipC$7I$kbmgb+Os"XugTH6OYA>%6gOh"C#2V>''7Q.i+_TC=jX^IWDnT,cG@7G^XG5b#tKBG;l7O!Sq\r,0a@,DjU'j[PKQZr3j0E;cD2,#Cmh(7Jo-0j#*W/>X]6\FR;XZ4c_>N@G%WG\R7/ZhupDLr\>+@_Em*B#:ZB=/bOFQHY5"P[BAAq->=-+LTd'iXhJmq4P##2X;iY/jR37#)H,iJbX^ubo<3c?u[YjPph;dnWQ<eVkB06QAm0)F<)Ki72ArN@OZQu1'o9CR+HuBG/sEh,7+X;MOEOiL09BB!!#\Jh9sg(mJFgAgI2h]F`!16Af<eSj[qWD4O:'2!FtJ8ClQ,kWm1l,dgl:m%6V32rbYc9.K*B<^K$#C3)]fs8<&T-gBI%F^.)01cLC@OA.@E6ZK3beA=(BDg'!L^RtU<$4@g[I3`$LWCc'&[r?ZflP<ZQ3P.FDfDSZ"b(M%9h.ZA"k2:f,^)muIVS#.1s`2\\ciA*)dEU!+3,c[S#6`BY@VT<^U[c3?8+"BJJ+8ED/R1Wc?)PQP,ohe(p1A'a<YG^i9a4#H8'uLnPs6Iqkq]POK5ED:NM\upjD`XcADnD-L0gRL&`Jiq8?Ar;P5sl&pd@T'3pm+/`=/uP?E47M)D#JbOa6AQ%32h;iTID3CR]fD$?ld'/GC/of6N3-%TC9Y,((Csp,LFpi?Ca!+9=p#eAX1;Aaeq,O-]A-@"1-q4-Nn)+#f7YYlp68\'lQ(h+3U4nFB'j!?=V]d[lL3DS_:3:Us<c[gdGBIAN%c'-Zj\^-oH2/?a@V,G<:fGH-HKG!B?NB/NR$,kX*8n%QjSj<hOb)1u!rN:8JJ1kR-[2S\0eJ^?/!^cEkP'4>#/sTo8@nQq]r+)-_B8hoKDBEO7aK>VdeUFPns2?5-&+STCf5d40uUACo1\[>uS0=#)-dB@cQ#=SmY58u+"`"N-'bYfW%,.l@UedVV=q)H"Y@g:K.W>VKSEg69.t[(%jDX2dQ*_',i:TjqJ.28DbJR^c9BO3V9Pd:qA814@8=l;A@`U.Q6EaF1W]@sQ%,1pS$+E8'4aX=-NjAs\Nl1<,uDm/g31*%=O0HX_TU'Q?$Z.Eb5<fC9RN-h),`T&SLu'E_SO=PsT<bRG^qLjeF.)f38i(,B46:&ID&PG(ki<OJCD,m3TY0.75PU]o)9r\T8120\#\AC0prMdBV##Xh*S#')05A<2_-<a<2X](rgFM@Dh6\=rd7;sbTM?$NHi>^Ymm_[MP_Xg/*]V*,Eq/&M`cnn8CC13E\0mnG,hFo@DTHP/DYjZpojV7ajZ(4o<Y7Tt9FEfOdWSL<jACi1DlD_7PPg^iqu-J0FDdX'1!M&("q^IR'0];;=%R-oLU0gX4k@!!SeV-/-$fd<7"=9a9^n5@\>2.cojh=qd2Ti#`c.baAmekJkqPGW/mBH\oWm::u:IpDKW)Z`+7FL#'eOdpmF"1XIEnd]T\M'f?B_X+c2D;T>Fs0qu3U.en*WFc6N?(fVVAe(JXQGFt7!r/m<?0)"Pi60055C^=LTMC"AIK,"4k6GYe8B+l%NjOH;K8,Bf5^G?\(X!?kJ)"&a86s6j7HSsq9j-UC%0l\9J7jIMYS;DfN5_[Q)]F`m81Q;aP[K44/B*R:N7C9<PV2?1W]=pS3o<5U^.F#)mfa:li1[%gCM_aGIh%FAQ'5!C>T/A,ml#f[OZ`k3FV1+/Zb#$*+;<IFF^9k<ZlW,#fg];\2lj*>?aCD-i#0sbp*/W:m`X-li!P5T/nYE0U7ku]+`EhU4fr(8ni:FY>6Ea8V3^+pD%i[$f#_iqH4VfNdTr'82;@oo&IsH]G`M!ro[/Yf+<@RS#MW_i#g79]h]B>*:-YBjj8<bLI98Tp^1D7&bn.?R=HG"FBUg71$2,:3OQYp\VF,:GC2Ia#5M-7M'1hf8&ds!bJpnI'qQ<#oJ+4!T$d1$t?qOP?5%ku7ZYMNilNMPK6XCrnJu%Te*[>)hem*hY-8f%>V0"^5ip-C&hq+3eY!.rRWjlU0nq!c<[hc9PDiR06@5XB$IL(dYi^W3)00A#RpS`]-cXN-.K"rb2+`c+8dUJL%F_`L#L:'DUZE[C3SJ.1"#e$>N`\2eidEu.*7qq1q]'F]?$feVXH1._h[C]eIL3%8sTC0q:\U8>)NT^;bI.O8P..HB7&C$*sgWdmE'tPS+%]>hMqLt0Ks*`aZqWFAXH]cVPY\%aY\N/kHBsNuMpo\2%7J,4*WF-Y4T)*abmQmF/3U:NH*8Y+Q>eKnTSuJ1S~>
+endstream
+endobj
+523 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 522 0 R
+/Annots 524 0 R
+>>
+endobj
+524 0 obj
+[
+525 0 R
+526 0 R
+]
+endobj
+525 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 158.68 467.894 204.24 457.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 498 0 R
+/H /I
+>>
+endobj
+526 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 223.68 467.894 269.24 457.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 506 0 R
+/H /I
+>>
+endobj
+527 0 obj
+<< /Length 2155 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm=gN)%,&:O:SB_3"bfXbG=-T?l$VbZT8PpW%I%hJo$R#hGDJ9(;V"XQf$$NZE\G4Ztb!:6:?]6aPW4umCbpM9.sUK*f-cW[`q=hE6?^NOJL1&$F)@A>ue:"%bI(U;m%/#%92?G#RrWt@"^V7%2Ai:\@Yn>,"BPbR(lHUga+Ig5q<CtOY]=kF,]PGNQA0C0]6`tagiM[0ad@fJV!*S[Vj+)gO84k;ZDfk`jshM>^rS?ekL9itYUV:9eXHYr>6Jhn5SG2Np]5P+.*X2"#/R5IbCb7LakG0'N\OS*a*I_^9:I)[rok(5*cqiIXG_BUXCG2`+=eDGPQA"IrT:)P_g6V&70^gab5?MdWdk9=-_)tQCnJ;+^bUt(fdf7QA-kJ>F@!%+&(T^BcKAdVg)AJ1,>?=YSf-[@c7Ku-p,V&5MF4.4k/R%1FGX.320H+`QhpXAnh/.u.W3G8[5M!s:(0_NKCEmYuNDJ/.],j%P2%[^(,PBDOQOj'+kIRrH]"3Vbm11';ElP=lnMm1Bd#sp-\7[j4;e6&*@?m6cNW._/F_MP#m\5%AUSDqMN6]/UmqA[PIbn;)U728_'cnm$;4>86m1jD[qR2_0SpcqWb+d#+,,Gn"U!7N"GhL2t`NOJ/YTOIN/A=DKnVH;1kD5Jt)A]/9'A'SZl?nc__-b7HWM7GINJ:N1b+eqW/F,.`A6]c<\B)U=".Pa.!]ZU,"M#-0%%O.#ejc;Zn8\(NLA-)eYe&"dU[kE+RFYuFWDs&bAGE3c!P:!XC$<VHaM.LQSk_99_9Lbct-Bu^nKUrE9'6-"NGG6UP.38fC)10$Rr]Qh2)n(#3*tD-efE"X2Pl/%h^sgV03@@[6iIL'ES<Zs%GpI;d,rq?3hVs!C<ZW4b<Y`3"7q>Ipc9`g7&DobG>O]k`0ED87M$cMXbEqL^9A@Y#/3nF$\IU2D)L\Y'f+J8#R3/XRG6LB-r,5>lZ.gJ3>E\TGo(-Ba)cY+7?!_NcZ7uH?)N(JZ>'C4TdcpM-Apre#oI(?6P&l3M:HUH`mc@KTkuCKKW%+6j\sUWlZnA-OVGml+:nJsMLL<s-LoLb<T#1WYgU-i`.s-j9a*tW67eQ_XLP\7T%M0KE1='O*"1V>$"JS?hX1JhqHB.FQqaS&0-8OYQaHXK_P0*'240?R!QIUMt`I:Z5!#+eg-T?5k*qjjg1nYdI:H,4ECVk48`g0=<6ep-/rF<DQpMS-#@k6;==J$cOWp+C1Lfd+r%o]K%Bbop]>lb0A>b_4u>!f9O$&`8H86-364H9rm6,tR9b*rdP^(i6(P;d'i!"J$Y76EBW8;m_8>!u2(X1^SMe5V0$l?bCG@I&\7HTPe124>r1=<?5$H*Ys&<6pFA-\i4''UC$8&XG1HlA+rZ@G;\%]a(liY?6JKf9?KGo8PGTlW%OS.m&9IWE@+885q^5FKOD.+oPc%boa?Q-$>HV8[[egKXN]i\<!f4FX0-+*J%5H<X36e9U>e,@E]g3-Ff;H"i`iYn8DXc3d?liW_cQea-FBC3<5H3a>*(dH#6FlGk)tTOg$%G_]WoB[PF;R.KRZVEhbQN:7\]p:/:$e4O[M]j8l&n<R.jZ^GQFbUH]^&:6R^>O+]6bB/6W_E,7_/4IoL\g>8J%OZ4lZk+)aLQBa@`C?5!WcJ&i?,:e`pAEj`I"=B3YB$U\#p%ZY&$3oKt7gP]kKM+L*rX)+ZokH,a6`Z=2=AANcSXe8)$Pag0l@hC3R$NRE3N>_aE.d\fJJ+_;_p3TKH,Lq4>1[C5*bYaY@YkH,e<*I_?^dS(N?Zn^8Sa_$VWrnt$jmq6bLeqkgAeOb$BRQ9PLQ_pYWPK<RA%RY-LDD$3cif?#F(gF?hGr4gQAn<$9=F!1.OKj#j!$3U.5I=cPiF%i2iRY$18[,<\CuA9`'a+,4NkI_'5_f.HXXqh6%K`eb=V@9?aV=cgg3/NW73K-6`nsbikAK4dgf*(uCrhYc`7rcsh+(M3Jm0X$j3I!=t-BpI(h3YnHX,j5'\,bm/8G^"G+,l1Es2F6m;i(lt9nJ%U5Aa7[I>Oh#3;45EYA$p.(&B/HdZ]IOQte%^XO'frHd^HL4#n@DSV1K0R=Ba/EarFg!oHDj$&YQBkU-3]<VXP`:O#Fi3:h@jnU*h:j5J%e.LqIXdA0@sNV"9~>
+endstream
+endobj
+528 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 527 0 R
+>>
+endobj
+529 0 obj
+<< /Length 2952 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm>fok*u&q0LUW9.f!2:a(QKi6cT*P8UNQAXeiLJ/a3&s?'<$&'KJ.pjB[>'Ls%84q^&X'?l%5kjO2dgPs.`N0#dL^2m`(^q1\=2A;C.NATb?T<idHS#`i_f.FQ/FpXGO43(R_4+"-f^"UE3r,M-p$9F9K>e@ENQE:ONbb0BT/Z47B9QbCIXeVbG(F>T/g-H0;q7SR;!IE:bcVG:G(5h+kdjGqSSb?M.[>a:4I=/Z'[#LmV3N[F+%DPgAEp@!PKWhp,)tObX#?^;9/GoeI55mrWm_X:.8JMm]]*pdQ`-sE0$/E2VIT]?,gA(S'HZ1cd=k\7E-klK;A>C\55dmCX,SZM#?<$a/$eTk?=iWL^&[B_<36XSg2Xl).%>g2P[U8SN]O,)P/&>A<QPs!npQ'M.^8>I*1g7EDa5mujDK[crK(^qpZcTF.eu=<AIXb4=gc6]7LY/h[PC]1Q&&%HO@<]JhSWi_UNtX=-VCUuhP"ee]loZjF4sKg+M7<7>ZS-e:EJn]3a^m`HGqiT#cNWOc?@GR$lYnF6f[9*ISI-%W#b651LOh$&Z&0.?D@n+*\j_5<q8R`,Ch)[:E)I\B%1.d:?n?o8LdfAOH-H!k7W*h7>BqSA7%e1Z7+oZCQnr`m7SB7+RaN#DuI3<=je:I8pmIdGR:XYPq7m"If/7mHRm9E<Q;@g)a?28M9!<W1,n-cA9A&"S(.d4Ap?mX2Ant@OgU$b'$l>sanVA36^e=n9n1Tjb\h"2aWqo3dkMg%183u?c#8HId:<7-r4"ltcURB,+M!^UZ'-"uc^(r\Sn(B_K_g&K-eB[B8nB:_4KdB82]5CQA;nes&P>0b!C:VNd>/a-EeS6Z"e(A3G'O6`;cu)KBL[f,en&aT(&=eT%RnJ*`K]9Rq3Q:i3heF?N$]PtT73[+=?>;P=P]9*Bh$8Mb[!bJ.pXB#WpjEO2ngW"C4]\@&*AY\%89uV@%D6QE6!!PJKl(WE$R9$M;mHK7\EDW77.o*Qf]ZbQ((mJS2Uiq%u?9b]VQbTr2(k]V5gm>&j@r\q#5[hO#,<"/*_@;mR3%Z;>]J,;C4<UbVaYbGn;NBe:JErH=n],X<j0"kksr$Vr+(o_9UTdi7unk.M"f\dc!;)Z7q(Rbi2KTfto3"OtU`GXfD]!FRmRtI.!dK=iIXD`BqLE?rlPFAirBJ9CE"'7A:HrGd6*$\4c=):88<DZb?,XRfFf,/N/919;@G9X(,ffOnlYVNu4@.0(P#V@_faHdZYUEjmf^$Za+/#+Il44K5s-=ctSs-1#;8mS+!8mkd!t8N(9Y9pF;K>2@$B?PuK"j<uVZ#3e`_K"B+*GW.s#q*CMOWG,+t2[lguAk<1`R?$,_Zd*]_^fbD:1aNldC,[pWCl/MhCqC`6.and]TjQc6Ak"5)(B8?(Rk:q5>#?6TqITbfZ%V6C:F;]bBWG;L4[Z9(S;2+C8aD?U"i>H,C9>Ff\cL7hjE\f%M?e4P`l,bf7=U3D;>NW"5kp'J*bXQGpa#8(W,JX=1<\*0E:1[Dp>POIn!;_H#G;P)Tmj3i<p<>:%o#,AYn;\[?e48n$M1%k4g[l_Qh\P3Db_aOJ>md5^IE@b='/]eIRZW3K';ZhaX`m0m7B9db>LFTdVgi=R-/<k0SUE>crVOSnQ/3Dnh)DHXQb(UnnZLio't;O@a;EQ!3;.6Q2a4\!s#9d++cf+.1_V"mpB$2hT:TjH>ZB#4Crt!iRu&j;b@Z'7Bb_\l$Y9]+hmSgLJnX&E6Q3UL+k;^S6RGJI1(L&8X"UZ%#U?8LVk0p2D.S(=K'gB#.IN$K;'9OUUFb4CA259:]s&]u%rmZTO0YVo#O'Ao'6A^HL9psOq%-9q>^+X8,+:kb(#RKP3Z`u95+$YaX3.FKrK-T84H;.1a+tu>VT07E-^j#aio0bLCqR$@!mPiApW(*l3/T+24l;;\cQA4&1Zq32oY\q5-dcm.?iSnT@tBJ?)tZ(\c\A^2n\Z%+3>&_!WA7%^%)rdrhm%3;=CVUJb"uk'1+aZu`B@4u/W)^8&5@^=B&JcB[+=iD2K`BeKXP=PP8@qd>dsGTFnEM]E-l'K8`,m5k_:qcM9Ipa%@i8,GBYAt'$`Z,E5M,,SD2U4_hn'X'5Q?/oK;;cJ)fnW@sdo9h:^SPKL`jl(sF4:n</t[[&#H++eG%lk4Q&:>0taBK/S[smQ>Bb'cFUN81fP@PY-72MJ:3KWtdd1D#5,'DSkQ91K^!(s,!n[CWG^tSfe^H:UD`Q<OaD/Zra_sjE'M5U_bmG8ZA$(4&bjEB<k2C`aPc"HWZ!h,j?nM&Xf9f:l2SLlY)lBr-h(hASCbfam_Qk`>.67Prct+AXOt0o)['ecDb?Ref0R0R[o[ue"B(4'TQ`jg1qc@h"lt]44V<XS!lG_K+ppQ<iQ6cD$.Z(Q(C78I@F[Ur<Q"89efJ(k8dN>YbQ!)T^lY\lK!dUGiFU%.#0LIO'\>TrOgE*[E[e2W7rpqWZ?"TL[Dg>77*0nJ_>dsbVfM=bc"AtGi#dVAE)Yea_n@^R3^6$1<p'FG9Tsld)\56^V0B$@<`7hj%dS>KY'5PRX=i:5I[T6)RGusrBmg4,0hm"+#0??Od*FT,rpbFD9<MsDphDW=RRD[BIiHXDXFn5D/kE;pabC@qi1:mf#UM<.h[$rX2qd2CP5r;Vb!@@I-`iCXEQA<5lN[nQg`o>+O)UD$Pd\k8sFM]?#HbAbE@4erUA&h3SM"fIjIXP6-9i\Jp;"?RHu(I,=Q(XSC^i4>EZ6cRtsB#f#)p"Ya=J[&Y$M?m!pH9-F[&I1;+;q9k!0I>JJ4qN`GK+/ls&Xf::-Ao6G]dlaIDn\i7Y#E+XTREAVG,d)XIQq<cr:*O!]Lc'9Acr4XQdJsb:9ZH[62qJt`QVS*[%0/^pHS*G)R[gRVc/9d!bbJH\nr9>Jr7e--GeF1/02=).5h:b*m3:6Qkn`k%5:eFd~>
+endstream
+endobj
+530 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 529 0 R
+/Annots 531 0 R
+>>
+endobj
+531 0 obj
+[
+532 0 R
+533 0 R
+534 0 R
+535 0 R
+]
+endobj
+532 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 185.04 453.394 230.04 443.394 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 43 0 R
+/H /I
+>>
+endobj
+533 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 357.81 345.394 402.81 335.394 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 49 0 R
+/H /I
+>>
+endobj
+534 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 406.32 302.394 443.82 292.394 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 57 0 R
+/H /I
+>>
+endobj
+535 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 446.32 302.394 498.72 292.394 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 57 0 R
+/H /I
+>>
+endobj
+536 0 obj
+<< /Length 3117 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat=._33ie&\[X7kiR#Q8!YQ[P*4:)mB,#\]NZH1Y1/IB&.+68O8oB5RaL!tUbq(H&tm5s+*L2=@/!%_ldlUEA,#EGO/pBM2P!Qcft5qun8:FX\c:fUD<1,eBC"f04kZ*a0CKu6doOQ-f9<g[e\(DN=kLC!i^^.Ih.<FA&c70t*A(eG.TUZ#PjJCX3B[1kZs67A^ZfVBGd^SkG#q/cRTZ>[$*8;\pisp[X0f*=X3/MA`b2Y_qiAke7uC*TNN`+>MZQ#)$GMn6,:rZW4q<o18[q(0(&Yi7c\"2t5X9CcC7Xj.GO&0CE8Qn=Qr]Q#Y/-\L^6kobAN&n9;<?PPgT7QfPmhg[jbZO=+,iS31imZQM44Q/iMj&3,h)6rVE)1b-1&ASh4AtMP$&q@>]('qeqR]:In9ukCBUe,,u4_(bF,MAnJ29=;![3XVu\e:#E,[d1!"^_,cW9F?>4!dIWZoJ4dblmHrg*C]6^8-="2=h'q"?Bj7:ktj7]!N9LHBob6(hY\AEr,^hE@prFi-2>aN=4R?EV<6ZgEairN'\m*&`HVDJ^q5oW2n'ImXjFD:a@0%ugunoYHsX69nLLPJG2mQ'*5Z3rt<#"%m.IPJTdIYVk?cM-5Ps+ZBk_T)5H*;8Wh]A7*a=cqX-*'qUK.]n^VM[22?&;;I2/8H\tI[R1&bmf-2+[q-.d-[bJO_?Z.OFYf:;E>PUNT;9VX>gP;3-*733ED([AbdM`l.fnc#nn6J'$G!+mo4J>D_o>lqJ:M$S_shrk=eKSr+.kaeAS8?.JT46K\opTfDLQ[k;5[2Ulq+>NXIDtkQ6_WTUZe.'=RW8c'TX[X6o$V!bJgY'e2&Unq'rRP-d2/FuHF7.PI2<nCf3fA1WmhNOLZ.a>XA5((!BFJQ*_!XXC*>")Q2>-FQ%0D:X0hn7KfEcUJ4V'mIO__3ZSOQ/Qb\W)J(icP&cGKtk-D,.L<uEl=+">q1f`@UE>EMq'_0dZpWua]OQL,A.5*8XnKZACqY*O2n:rP'Q-4R+!N0$"=WcV%s;u![les7)Jg=Is<s^"-h*#WgWYJDq4J28R8Ql8gG7bRaBFThdCa'K`9M(?N'-$>i%dX&lWj@G/R<KO^P\:A-$hgoI,U3I6Hs'Kpg9qNN'-h],WaQ"C3\Y4SUHCI_'S.\0eIK@o1C.KcR/fXE\>)6e6Ci'rQW;.FnNR@I_4WWo-:9EBeTU`=JDgd>;H^-`!s'Yfo,[4^^^L=EE#ciD$+K-WQ"VGFX0a>0CM`Z:fYtlXYU_2LVd5X1+haDL)$8j84bZNQ&6gC,XthPDMIsY"gNKRqWiS2]d31.ssI=YKM#TLZN@"IkrL`=]u0cYbWe%QtretV1c\(hHs@HSNIAQN96r\++eW8Q>ssQ#^S/e,o9;!#@`QL.Rt<]UL6f+7p"@]RAS?0C'61cruT8Gb9js^6\T8[n/sRRj=3VDq$cTq5!qM'P1Jrn[iR3SSS#Nil;tGnLo`4JS,QK1CkYHH1W0^oa10FjpTG)hP!a?m*tY-;keJLr4_Yk^=\])]ZU<V_`i);P6;FFsm<:_'`LY5c!7TusMomE3?Xn3j?uSRjc.=/d7_5RokW?dl+*$2R"C;OGCfi](m[C5p]P0kW*i)i-[`#]"7V*,DddTih&I/H59(Y6J6OZHd\3[7EhgSg+k)I3hm-;BtFWaj`j3?`Q5s/G_24CUhC]*0M?4a1[lDdb9?C1"J^_E!#dtHK#+RRH[qjhNZW^8E+,$sepnA4g#O[o:L+k`;c$P?/I\sRW9rG9CbK_#_JSpk?gWj&cI!YPNGZ!DOg>V*dW#uPQ&.n,]SR)d,oL\8CGH%TA];4Ssn^&<D9,k9'1q=LY$V[OVGer($'*JKq"1d%Nj"Ci]-pl!d_Jdgj3E8!/TMb4^.JQJ=!lA5cB<-h/%c7a4`FJ(e2&Oe"0m(c9B>mEhBM`Bu5CKc%n^#SK#G:BFbUqm2/O%]p]@gotAm#45O.qOCG91ME4HKp&W%5J]O;Hg2AIWhLl$b0+^PY8'&LB57SfNL><h@muZJ<Y;lpMjI'e&)R.qat<Z0hBp*e2'/^76.7uk5cWOQ8?=3fJ".S%ZK[q3,^jS#TJ%5'E$\n"rVGP26r9R>$[fn\Aq,fFmtn,PS$#[7GA;&;eMLhKZca$//:p[CQb4/#US*DhA=7"Uml=?)&ArtYF01`C/"nePj_;b'9N_NT`$ce#\*#%e#:,6"W-c)LCJSr)pfnQ&'Bd$23$0T2pVQ`VBh!VS*>5?^IjZ#-V8b2lKCUMaX*5<ZPH%IL'MU6l'3ZWVbn.T$IGH*%`iUhg;khIh'bBBWPC,n.+P(KQ9b3o(S@V@CYmorA@@#)j;2FG.#D!*%`6d85t31\)WmL84`-@FS.d8A/YHrjm4P7&%k>95<&Pn0Q4[($48qbcA(lmI86;LtGV#1%*j&3p^$uJ#<et,kfldA:eGJR"U/t#Wd39.F"5NAF6hhA9lIQlLB9gQmMN0"<7YP$J)ZX@fVlnFslK!pD]$03:.9o,TGn>$:F@Akd9D"+)$\e\@/D?Wp7FYUjFWRQ2jT-,09&:PHS]=sQcnE.]r309VQ[a8"@?!+$2tZoYjJ8#Q6GE8oPNH7sWpPe\q0#Nm:\Ug*=6V@>O\/ud^$"#WrS#55)ATp\e#*`VU5QX^_H)5XRZN0WIZ3UN>>iRA8MkMcXril#XMa+3AV8XtlkgYVdcdSL-g?\]?_Cd4B6E/`5(B8dKPCV?Q1<`[OnsGK&.`$HD$QE2>1/:ZK)Tef6V^4[WXh+AV+Y_e%V0uhAI.[1a06u>k`h6mOml`kj`,[Y!QPF0KN!5]eDXc-NReP?A*U5q%P"Zm'75a=?Bs+lUqCm<>j@WXg,`BE=q8P;UP9s_5km:e"2EU1dM%&?*6g-,CMkXYd[o8Sp$8/aI8@G4&_Z=S;F29-1:d";D2/_.=`k#D4M)#Y6S5tlQ@<f56dbNb_3Ffl'3m6W3iFOTpU!/6W&1uYgImQmOUf1bB6NR(B,d$"GWX`!0,%AfoXZuIg\Jipc.C>eRVq(S613$1gYDV07aRp`D!h*djGNA@\+*a@$tn`XrB-[`:"X:<64_XE(XjfmZI>oJEumj;q#&X.cX^Y9=P*QB>,/ji^&("p'""5~>
+endstream
+endobj
+537 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 536 0 R
+/Annots 538 0 R
+>>
+endobj
+538 0 obj
+[
+539 0 R
+540 0 R
+]
+endobj
+539 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 358.62 529.0 403.62 519.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 51 0 R
+/H /I
+>>
+endobj
+540 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 303.62 219.056 349.18 209.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 541 0 R
+/H /I
+>>
+endobj
+542 0 obj
+<< /Length 3117 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!#^968iI'#*O1W,`cf.b9E?6qY"8mC:0BR:Ih6B5/rg"%7_beg/'48^$u)gX(l7GUW.6*4C5,9q[(:]$^J!KE#&dqtY+j#Y)_Z@$/,A%9DqL_$L$l_*!DN`M7Yp`.LK=pjVa9-I8$2X)P'D?aTBl=8h1>\,3%PqX*f]d6B4.s1>>M?QFH)M38=:ablgB:qVp]8iV-h8`^iFMNSMIa$hU!F4lH2V%QogX^\#>M+"mD@u@D6Ih!7/;I#rAFMqaK7"^VAX57sA;RA#OrRs=IAec6AE:q'_HFjr0/j#jo`YehKAjkIVCP8c#8.VFe\>_'b0]%Ylm.^UpFi#u)*aqYJ_(jHS?2rZtL.FD2WW#ao(odN/4]4E*/EI_5b.5duHShtOn[pd#/&44tP*9l;(>F#4_F>@/d"taZ3F_YOcJ=ufr:T3EB\Ah)edAKTU,ZqFs7AN+^8A,`n>Kh+o]+i!eC98?%OG0a.LP[KiC%_@E"8tHj!.SRc\/^kG)DkF)GWf=4;nXXC2fCLN$lM&-;kn06@jfO3'GFKULGp`VW'sn%kB.KGm5$WR;Ue-Q4,jjj7]$`Lbphq"?C-AHTq>BfA3_D8[6+$?n#:q8A`gZ+0L>?cHu1VqY-%s]i6hFKH28A[F1Z%DOrIXD#0%8</:Dr@JFQ+&KHmc_%@;V>#_PDe[Ca]?B/kp:HF>8e`s.G0A%l@U'Zi+94I'^P'P61h]p?q[B=JaHD9HE!5.(""$(?!"*/G814$Nf8?,T;<]Q>8ZPU9c@SMjdiC(EQM5l.`82TL;>G;+1'es6#T@b"NVGFB%YAp.uato</(I!nA4n[em@ak/NLtL`()Pap%,Tgu9oX*mOargl:4R+`T__5@=5Mu1\?bS.Ki4#W1?+05^)lno#B^S@jJ'trQL88NG4(:Oe=B"fZA0N``(U"HjB=>\!bMkUN>O=?+5<i18%gEBM+o`g8o0*<m@!*[dl/M7'rjI*`o_=1l?ML8/hOt%2W9;RH;T/6Y7$AXUk_,=+%U85sp&Bu&#m/-)n_4l@Coi9u`"N%j:\dkbSP8)&1a_L;s)rTB$,Z1-7s:G`+K^[GnEhZJ!'9KRpb-[460Ab+r.]1B9QBKD.=-fMNQ3kVd`[k+nO2Eq1eGtcNhOEp6mi@!)=8=uif`oAnb<QrDB)JIH4mCU?_)]]"6OMuFM,NJc<j^W(S7#d_@#6rC.<;"nc@$V]@s<\nU;QeSLV@?2$4llHJ;HVS*2mj+&Dk?RY[eFf/9a0n_/o3EK\91E',?Yh+es^/Fq7"ooDXT@+-2Za:KH"=ccB6`inBd-W`TqNilJ(9s7#22G3*4O-Wr@I_W\EGOZg&_P*Ja//IR7$#D)[c$$-V_[%$HNj]>C_L;N.oX:RNMsItWAFG]fpsjaFmb6h9KR6T`J9-s*ifA%)O`@FnkOs657I+!97D*p5,Ulp[<dl;hM%>L'&4r>GG$<YK'6njlb:(&i?0g2!/rZJ+;Lm2Wo5JA=E[_sqM[]!hR-=Hk"BKRD#.!<kl'/BGCH.jDPS!!ja<DpDOCh=M`n*tRN9<>dr3[<PZIX;7-Gcc*]/Zc@&;mL,!;cRj@*"W_i\LX55A"'SkOCUMJh3O,-4**)X@&@;!Kd57Gr-KO7q8R2<O)[\ULEAB8!=er2.dMFm"Wo=]l"&r,Zs9%jJP3BRhSa[nX<1>>u\&;2P*A9f'[rd[,iK9BB'HgK_S/AC2$UP7hpe%^*c7P;p^-VA,n<MA-mu"1C*9YPnU?Gg>c`[/L>=VM6+&'ZM?"H](;Ys\UWj2euiR[Ob&^t_qRK)[SO)_p%OU$JW=Wf*RLdrdUX>5XS]/fV]g;,DaT?qB=\T"<2/3Y*Hs9YBDN<^Aa,+d\5@&^Ib,!@KgHD%gU<R?'DSC/VJV&11!=<90?HgIJWb&0-DM#>%6*YDGnE<AF?t]hJn7IXG.R-b^olMCT%S'V`!bLQ-3k(nejs6p0^kOj%HJCNEbfoTS&8N#o-NX6,H-i3PK#nFNEpOr:XFaRCse;2`8_?Jd)SnI4COea4[LjYp'-hW+K0WWoBJam=d>5/_&:.8XE0Nb*W[UlUbBC`g"5RKV\3[0DRTubRkpPj1<ZU+,iYnnd[NPjF7!krK.2?=S\&U;D]t\Y6c9JN)WVG$/e'I>Cl]bUdZi<oS'<J2E,V(BB-nSFE/k4^8PN,lAo"$NHX!RJ![l;r\XYt8eHH%1Mqq>t#c0<@W3_ek@Ok4Rf5*]aq0*[t!S@g#3NOWYD0:8fA^^j9ANK-RPB>COiss)9/sm6nE3`V<qC9Yq.)qhB0T9IR?"mRd&h6\U->T'Q,a8Wti.&?#Pk(a:@SVcAk)S\OhFM79'%hjk._-kg:8Se%,93Bf`6pAZN%!LpE3M4(L%AKkrs*4<d\>i96JJl#=7B;=CqEm]KL/)mDKa7C#Jt2goaV7_a,+"P7B;dgfXe%q+I&#CH#Ls&JO6@e^1&QDaN"\F<,)Qq'uY+<ICY,3K`U2.<dS4u-gN9'4i;89^mOIkT=90Pj>hQ!ddocBa[uXO5WU/GWDZSJI-[.*"]9YkL#Hj<L*OVh;\Ym]X3)^Pe/RTog2iTl,10.fONUJYWWcbWcDWZ-mfJ)>^;9fooJZ0WR$l7.gTXN_k(liODuJJZf6!D)Tl$tN+mO_CO;$hrHRYP:^!CX:%FIrsUdOM,kYB=U:(<q*(^JH^SJkj]g8R$4[Wq:YIg(;4aVp-$__Bk!@XP7eHFsh']=O<N_[pC]CI)!kQQ',9Tr%O`!i*5TFZJhAD+lfX,iuo,r[;+_B5Buna>mK]SFpj`&snOUqqrbS6dP;Tf7HO2=]1[O*VMe>2\6hVPdan_!e13T[^$EuD!tiMHQZ"Hp[7"cP!KZR0[[L:r;4$fCMZr8ZT2fN)[?GS'(YoBnVT9BU\b+2`<D[e*TT[e&!>kR')]`+YL9&Wlm;7fDXR#YMpi6DBtq_H%bVuo.Zofq"N)Y@LQ7*b><D[]f#\sUAOfdKq2rN^]57\1U\Sjmhd:k]]=[=*:ZfJ%Sq8pALVrrGiX`a+M7`f3k5%<WG1cZMBGA'Z#Y2es+[k429u@j5e65N[!5>d"#^V$nT)uVkQn/s+=t#3D380Agr\#\fq@URAEj5L^\AS<QGkYQpq1Qr~>
+endstream
+endobj
+543 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 542 0 R
+/Annots 544 0 R
+>>
+endobj
+544 0 obj
+[
+545 0 R
+546 0 R
+548 0 R
+549 0 R
+]
+endobj
+545 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 134.77 660.0 184.77 650.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 237 0 R
+/H /I
+>>
+endobj
+546 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 457.57 574.0 503.13 564.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 547 0 R
+/H /I
+>>
+endobj
+548 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 134.77 541.0 183.38 531.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 448 0 R
+/H /I
+>>
+endobj
+549 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 423.03 425.028 480.53 415.028 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 180 0 R
+/H /I
+>>
+endobj
+550 0 obj
+<< /Length 660 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gasamhf"u<&:Vr4iQ">i4\PneHcqjH>1[K;au2so*um7l<J$?M;WYYH5I1-!82p(U*IRU0pYFLEj2q0m5aY&)&n_l=lm@[9c,3*52`^;GauG7PjF19H<IqSK3[5.\^1i+f0Y[kl"n=J\3N(hVfqUmFS<9kfCDj"M`6&0=Yoe)XX\'X?[$E%9#LLL-!iKk-.LZC$U(bB+bZ,4NZ8lTbW3e)h=c("lMMBS&LjRZ[<36h0cfW*)r]3sO8X^Vq@B0qp8\g^;/g4(pM*SJ"X@>W7V6Lpabs8#GoM%bV_%oeC%ZO^ES<78b^c4<;Qq>h!r)9aN#gB)&p.]t`:`!r&SRPNt>$&k^"ePDPf8"OHWS8K7fl-5ef?Mp"9HchKif86$Vto-DFC)A:`o<75MLf!OMDCIYmaVfAF\'=o>&FT2PCpf6*%O8SJHtagou@5TJF]e^$e?&Fj(HmeP_P4lhjj;)r`A3$i;Q`Np/N8)M5L6TUL`Yi;VIQI_J[+oIrWjWCp%`l5O[U<;ZFKP,OKdCI(ZYBkcQfb7Pout(ZLM#[3JjCXM*g7pZF`"aRhE-)t#nrN7uKM>p<^kkOC82hkL2[H\-BW%#DK.Rq!UWZnA,Ncs=7Z6Dqo<=Gq']/G+5?s)n?Iliqhnd_.c5=?jcgBCKe]56~>
+endstream
+endobj
+551 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 550 0 R
+>>
+endobj
+552 0 obj
+<< /Length 2570 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm>?#uLV&q/*0cs,KZRfF'f\o3Vhh#23CY#sQ1ep8E-0Tr:7%*OD@n#sKcON_F+Od3%QIPI4(]$L#=52H"Oim%?riQ.KJmV&kOj,V]/]TGiOhC/$\?KfZTD`f$lda=]U6K`0,&\'ILJ+p?IQ)%&;fNm@tkhFeSYL2>GZ58H^\$^Fa2/d;*B7](aCb7QFm$<tnWg(f?)mLrh67jKG;f*d484?RY#]8WX;C`Ku$>iqZjj#58k?jg.cDAuq/l#`/!Jt<8WN<0h(4dXB@S:o)EpUY7LY^>7F',$QAsX>93_Q'*!AN:8[$m[gA_7+4m&"8$,T(`V>_4-p4\G!;4e7IR?Kd9P`f,0d93i?rr!tbmiEH%&1L(l97(1*O><X:-ca["eOig)o?kTgM66\/mlo]s"OJ:/lDsn+%:&GJW"J7[iM%['<QfL_E<;N'eS%,#W#11M=RB!:(7!O),S[ENV5n.'l'Z&&f/s9fAD\1D9>\nKpX)*20bf;M\(A_?mkgds?nE0>[rLtCC0s9XJ(Hq];"U"ib6.FFS([<)q&36c1%CGPE+oe]V=Y[;A.b-8E5\WCu]+]>7\1Psnee%QVQbsuPO^Y!2$`(#XLR&,5OQe,bb4sM/l+BDDL`YR<5S(O<AlC':GjRBVL@(_YrW+t<cJZZ$=?<R+P3=Jj2pq+8Ae*j@[*!qYckMD\F2K?+&?,0IpB+U_Gm<;)U/4euccoLBn2)Z#']9lMd9II;Zc2.H43_HU#lS/\QFk4$%9?r+_!4F5oNj8"gf0gj6iPc=P1@72b%0j$Sf(JPpUc[]+ltm2T1>,$Xg0D%/W#$K`Kj#=$7]1h=F3r6/s/1:^AJE&p$tW)=s_9E,`]8]8Na2o-mB(!b`=u[_56L._A!57UFZ]ri`O2#F!4KA)n^f-6b\Y2Zk=ZFYTd_bBGp%'ZUT8%<>j=uaYtt26UN'o"WE$;6)RQ*5sgu*=Qqm4.CJ!tS!VSS?#MnINJdDm`?0Tp3MFJ6]'jQVkY,=LF:H+>SIUr(X6jFUl(/`]q>'])^rSJMH-WA@qIH;-V+SGP&jYSMeIs@4HM#_1+]6I?LJ'F?>%PdA$'g)Y":(smj7U[iin>T!-39A'>:Z;.Ue(uO[&6-p*r0NT\?f`0=1S6Rq)^Q[pTVH6gO",>jnA-1EcLacgq1,1q@tV)Id>hbI/Ee`^FHXRNoqPMDX[S?d]m8.Yi-$dV6XFe*HpK5Ck/jofD>F2ea3hDN@@)$PGkcY*tnYtM'p2I_[sLGl_8;Uk^C&X5I/<UjPri4?l'X8n,L(-R'RtQ"a/mK@U$@BZ[UlS@[YE@U#O!7_>:I!_dq&;2oI]Y/BQssi.@6L6KeMT4Z'n8?rKPnL=q21;D>Q,gZ/1eX4&6o8%6E#h,U6DFH,:6Ue`MKSX0p^3:[t9?j*eTkD[=*$%g9-SE$.\S*/F]cs801G,=g*`+L%mN]Z(3md!?9"J]44r@5dbCNGtfF:OB>a;id8MPNRB#(o:RLfnGZ,J:0CLdU[!k*gr'PFQdtH4ie$/PSV`F,)b>SkM1UF4_%&R;%!i/8%c2Z#9BWZqUli*S6UkM:YmF9,2.nhFdP-XTApRBHpH,7!Hh/;T=0=lS\:DA3:oWfGOJgAnAc0ib7YnG^WkUJiYQAb?5;b\&!s6+j6k`GkFJ:U^Ul7iC*S!M8"AcMGH`[1cF\2Gq>uIc`fX/<c>^%_.D&bde1VC"367X^jdQ]NTDM+@?+$%94;PTFY&i3`DX1MS27q4Cb0)No!32D5R\)G5;gK.Qu%68G49&'-Y3!MEdo7_YP.@F"\?P4To<O50Y_T/i_S^-(Q0jl?%9?fR[^SY#>9sCaq72jRhh6nWpDOO+b@@EMZ.g4;l.T?"Jdt#"?0JIB2tZ()'bEb,;VdKOPM#)3Y_JVWO6XXJ#JlHNJYRDmTYE,J;F><$K<H`(F_R?"L:nmpg2TuI0@R0XmBoDNEWbBekr"/E0j[sH&,9N8K?G,>0=6>IC2ij@nbCLg10teo:snclqt,NqZ$%@$r6AW.Z>i9EbP,FGBjunHc;l"5jGt!am<ds3@RaQ^lN*!gMf=uMB\EUHi/r+QN;*qiU-,MN&cio]"_&^s2r06X),ioa'FB5,uaTn%@]c&gA^&L4uVXrK/$Ak1'.FP'kUgZcp!YOWi?ROaU\&/WM7<ELJkHsSp"d$.VRf2r=0m'p7N%#5<\Ad#*2.tpr<^=i)!o0`gR_.1oDIaI,_huM8Ipn9>O0>_Q(k-$;"kS*lMG]+V,jC]o7%KT*Y=#jC48eP[tV,b<!sl;>gd)f(i:oouYA),SuX?%9;Wo#N0<fm*rQ/c_"FpAUq`'.>-bSW(%_R>@QieW7hn+rQdZd&5lZ4)$J"G1g9@VZo]u[V>)iI.EP!l75(--s,$V'Zi.^$WY8te[`[`JSFp*8f:#&Dl5MY87+^8FHV8pAqo$:iqe"u/s+t5HGNSM$Fnj.XX)?<qm`jt<$iR@!b^oNP%Ris5I];jiX7*WnkmbAm"Q"Ueo!'f?.I*^[eXLl<fPF<;mOQE^;;h@d;2CbEnYUapD4g[r:10"@HY9,007WBHHG+Rp5Dju!NW~>
+endstream
+endobj
+553 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 552 0 R
+/Annots 554 0 R
+>>
+endobj
+554 0 obj
+[
+555 0 R
+]
+endobj
+555 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 261.71 507.366 306.71 497.366 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 65 0 R
+/H /I
+>>
+endobj
+556 0 obj
+<< /Length 2802 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm>;0/3r&:Vs/d.AXSN3*@r+ji7#W@)PQg(Q"(FJ:shi$@+]3!tF@p"+DMD"ne6A0o^pMnsAAp[,H%h_+nBrp&mqADiH%UVV?NC,B&-ncg?8nHP[_pSO_Md$kO-l/9aS5NMCkeaI.'$\)&=rhbq!UFaR]L=lh7J$/?I(N:VHd8uU8gDc9rg5A;;<?uQ=\4G+NRAc+rZ"pfs;)0q8bZ6#]HR5CW`Un[OP$NE9PPs6&);%N<BQH*,CG>dR!tg2P",&#UMV#(6Zk:tp_N!Xe&,(4D$@_KIYsrf%nEj+T7Dot..p[\IWK,MDa#5%Bdp[V!:t:>AqJE:6"Fuc<Q&LZJPVlDU,\E5EM7eq2FHZ@Rp[e3/HfY],i.<M'5Na$fB3"0fk\1upL/rYR9.,F?HSJ,F!TZ,u?DNPV=(Vr'=!]Xu\:"/hO'i;`=BbaWU$15\j6MrJ0UZA=kS=#eb<d&BdFuPYN1E@odTE34N#V!MJ?`@9.PZi;Y]1mDZG0ceKND,baG^CJh(#b9Jn31`0;P#!K1lcZP@<f:-i+SgINpMkiF%^M`Jb>R=bkn9F%Xc/f=`.+.j(H)]rMS>fnad-^9BraHOVgHX=c[DK1TPt7Egr"G@/qCGd90Ob0\6hLPS,SS4B@*b`";c\gKEf-Shr=VPXDq(WONQ#AZ$fp@;?b+WR2YdQEY+%<k%O?^+N1E,?UmN@SrsW"&]h:1dpUdU)<'Ta5c#W/']nS*@`[&!d0?kNRHY8N7,jZbtACiL&2`N"0Xo<-1cFQ,j#GlfTf6GqSX4Vq\N1\eQ7`csm\.iQRmr$,T3LPS";)&PJC.g4O06M8him\\5WSd,V9W%86hgm<Cb5)A3c>b?p_6Us<k<"(`[1.rr.b-@X;c<g=<_rd:Iplq?[?b<:V(3e[[PI3s#;Rcr1)<-^#'BDdpe"+\H4Y=F<56nq^r0K,-L5+u+bb;u&U*Ck6/QN^*%_U*+kVk!OOcD3TX!h?f[e4Ll=O:)T,[).HAQU=!qkMBECgGBgD7U?o?#/to8QoXl;6f7']Iee),m0?te=7^I5j2Z^8SBgp$M_eb_0>R:@E!7%RAkT/t.qS)Hl6RrUlIpq-i('-9I=9GA1mP<iHD,fF7mpP_*<N1c1gO3VbN3QqRdce)/1e&VI0]G-GskMV:/PS*FT]?4>URXE4000Q"?Z@u&(c#eKpZ]().J@FL6fWjefD7S`EI8VU=%oMg3N*G0s5HZ^sHWfO"*5f[94Ofr!/'S=MO&V6dFgdf[^4.EkH_D;/e(u9XFd6GV)0N"c1=dD+[kqYk>h'osHWr*I7SP-t@:_e%1tEeIJcbTske6Q>"CAI873n6]\TWl-6L8>^GHhXIR75QJ$$n!U,KpKYVJ.rQdpK\85r>W(fR$B#mW?;\`GA5A->unhgetE)&h+:`InGOTh%jfYYKQ)-^Boh5>27>McH0lO&YY7ATe&<L()(n:.F/O.RNVX?KRLBWm'G=8m!9EUs>7S6`M,>BckY>Xm1PV1j+KF_pI_W=6a*)l>.s%C\oPk>j*MGi+"B++\dd0nQ0qMaBnQjZB6Pap_KoLJ%!p1(FE1g\ZUaWXgoL)+">bjD+LBg1L0`K-uq,"0BZ;'E\kkg!8_-FP7\cLP&sXGI\`j)$hVFo(g7/C<S2C3E[E%S3!Z+c/@!oo%hc^"]iM-4%+K28L7ZU=M\O3;hgVJ[9k,\"f<a4[uPLnnFp=j22.#;@quG;8*rU1`!E/KT#<(5-):VdX$6D=@]Rit9=YXqZ85$cefq<7>-.*&p<G1hLDNP^O:H-aCi=ml&el1,.;L)&Z0DIj;*'N"W8d;Bk&uB;iG-2s]WE]cFa"nI/.=([NBr\L!u^WLanDUV>F\"7YG`)um0QU;_pI@u4"Z,rfiu7F*1rk8,feOB-'mgu-MHHM/\rIj4e))=D%E6G:=,q&hk/8BT(h;0f7]F1(P=/IQm=H(SWoQK]OlPJFKXDK`;gZIAVhFCZT<[+%%VO+#Y9AKSQHnF6"r5tU3&i`9,'$`P0.m'<<i,\_MU[SR&,/\?Wh1Q/tKF6]YF>kq[PI!*Me<iQ""Yn$g#T@'j!A1c*1hPCsd1<d]2BnUZfoo3P.oKnk-=.&K!0.M%mTYWq$WV*XPNWL2'ci8Q[/8>F\NR3'=[^nAnSB1Y6Bq&%al1YLYOP`2TMsnAeJ*T0HZ\l#:Y`-#Q/g:aHuK#;?K,W4UgXlJ:"Z5>pP:Ue?nXDWW.LhO8S>98W#@9]^F1TAD<Bf_t,'p,]G'Nh,?n?Y>Zd%$4S,_pRi8EtQH8of5;<g$5lnE\DN)2fJ)NgR$^>\d@Q[:Y&6$Em=4#q(].uNE?LP=;UC!.kL''`Z1!n4.iBrOBQ>Vbol@[g6q]c5e?rjl_W=oLg2Sm'"JE7c7`oj</,9P)SU?5ek)=YHDJ+BAHfMkmcb+]N-SHB1P#ED'@1raq50e#V2HWLMcD%XmHIL4b66ae%X*;Q4_=WjK0OtVbh%UbIlMV?87T-?E3\mFP0S9#dcto#15F1J6\5_6,iL>6F6)ABi4hSG5-Sr:bbMfOi8pI;`;NXN,ulKX@,(2@_\Sjhm!W@)m^2iGrqaAsD@_U:9Pik37NSYUrJ.DFEK0b*T.YF7itKp+ph)sfNl)(+175n)hhI?rW&t%!^^:n$/%I9Jc"?nZV%DcHpRgmAn#tm*n%3Q,^N32'E#==*T@cBa>ds$+L>K",3)b=n%n$,X:3U;YIHT2hLVq'tWGMlTW[;'A`4Ds"V)X-`(O0KV/>Rt@%%U'+0fWuULjc/m!e2+.T)*KR`/jAZ%JIP!J+<D]rou_SNkD=~>
+endstream
+endobj
+557 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 556 0 R
+/Annots 558 0 R
+>>
+endobj
+558 0 obj
+[
+559 0 R
+]
+endobj
+559 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 317.22 522.028 362.78 512.028 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 498 0 R
+/H /I
+>>
+endobj
+560 0 obj
+<< /Length 2443 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GauHN>B?8n'RnB3nFWR%9L9-lA+hLDbP'pPS]#BCe+>p13S"<EMaZ@uq\@b<F0L>fDS+Aa5`p06GJ8-`s-t+#?$c[#BFP3Q`R/YoG[q>>lCU3F*;.T!qNgLZB$'!.S+Bb14=-.Re+i$LE9_]0W])2_RYM'mRtj!1T2m4u7.Vnh8Z$ZuZ^==gLZHL.++r8DU[mWBjULTb4;d.?K3B1+&m2l'jS=7KIGoGEj@?nl&UlS-XHAK+5A?,k1k2A_&F8KV>P#Xn/>`_JAb0ZZ_l(tE73"7im\o&4*`B7'*PjWD`q?kQDl+WF`5=;h+;L%PJD,X=Lc1;+?*KPb``'BZ01([[dmHWtB,ODgp9WH7;M17p='-W6O0*$=7EcG_d"hf17YtN7%P1U2i>Kms"=h[,>W,A.#+p(?+dW=>08_=@\^\JYnS43J&fer%J8W4K$4L!>_n]Tc7nse%'b)@%hMX%U^L+s;,k,$,A<>jIQ8#KB/E$PRMS)R(E]m&;Rs1JgcbKbnKemu'io@X.51A8E&(ohZ#b&Md1a.`55`<s4;rBYb#F;prE,drC$35)F\sf0,5__=pm;`qBOM6hV,,6;cYcrD:<@j>m$GASp4'NY'cE@+smAsgQ(*UFZaE=WTA?ps2[p6>r)ck.sjpVm4MuY3Y>js_M@Hjti5-KgBfHQ>cftlg`fokLU#Qc+/$<ZMKV3+'eYWa#9(Da^FV#^LB%O4[pQ`%aHV0[KMD@r+QUj@fdRd-5QBPZ?383/P>EFIS3$9os?5+9i/%R!5mg41K04$;%#$u!=XZ5@tAaLhNRn[SgSOqd$qkWVgW%6fZC2*Oif[]4V:URG0"(-RUS_^PbK_1Et!:&nO%l%2h0S4?3L'6k9/-FT+?n/^k/K[S3WD-:&=aVPscSgkOkLjgMHT34QVe.X+$]**X'^qVVWFN:'lZ\)(I'!704>l4nKX\KJ-9$>#E-?`PGK06n/kiufX4r,iSW-X!V.jjJ:(B/38!CB[bDM1Ag<u=8oc0=*h("-WW'e`r8&`seX1dKi\Y'+f96)dLK%=%<N!O#d0BLC0s:b/FMIth^3Wj>2PeJkC?Qou.@>2![u;FQ$Ddt+r4P4T?`>NElt&XWMHnnb+5g+Ie2B^$PUG$u[n#e_JTbjV*eLM[DsFJ1VU/!QgM\rQSR-aF["XmoHQ#KQAa1>?-=]=aS=c*$c=n/=h40i_W)rSX5[,uKAu8WoRt02R[]fZX`&\$I5Tl@ngV^I:-T"ojo%\P>qWi!DE_]K]*DZH"c>]m\>/7b/jP`U0RA^BQod4=C2DKX8oeJGM'(cF"Rehii3nME[elO8=rdhMPg%jA-IV0<f?:ZQgk7O?JJ)Et'@j4&<eKe3W3r\tT@_L@m6aHEFV)9*:t#;RN/8.H_cBM]QsNjK!JC=S+&8?1$nh,)\l[fPdUFomCB-Yj*cjeufTAp.W.T4/h2SU>_/VDD?/tDX::$`#sl5"H1D,A\k<R&qQBjhBrhA"0e?W(;I5M0bu_[D[*>R"+JcZBcn@S)TYkeC_/kXb@+e;C$2_9fi.#_)FJaHWsIr@6CL@h2*fr\q0JV5j-J^efHD7@MA(sFJR[KF$`gSqL@%g@_P<1KXXo6>HbJ"jp/WK3oq2m?A.SVOU'W4u[_(kA*1Kn'rs0r+Dqa'R#IK9X<0I0A[O9`I/6-Sd&^h]&g,-[p?@2rP:`'gKb(1qlo9LGkd6'NWT5?IQK(D:C6jJb<lG2XiTWD7r"fb_]7#S2\#+@[u:U#I$E]ehR2jU2,>\X,O!L(cPLBY@l$HMc9SWXU(RgDrZeCi;cQ;^CE44GHt%obKE(/OMmY0/T@#3/B^$DSbQ=QHJ.l/]IMiCHM.6AaI'[r`3<<'0%H.R[4""#9+"f6H-'FJF]X%^F=RD:DQWWO\pJ<Jk^s"SG1&)9f%SLLYCF[,K01.I7%n9lE5QK77Du=DS$E5j^TW#fsA.&A7oTP"7RG%s^Q;APp(:b>c:bhV>lZrB.dK+ff&Ml]e#Z9s)K^>2&DP(5*!_OfCGd?'j_XQaXs6?C/Ygg%!US'Z)h0mPA8*c%s`ck<2JF?U"5=5Gkp'6O0.h)j>jI<2Z,/#a@[H7(#CU.`4Pk3A`=>*p4Gbs7@ZfIo0Te3NI!RaLImEe4&LUE]-/2a88$kekR#sJT_goO(_NuOD^=kU![D>1TCVUCu)qaS_8Pu`f]#$&%)(_fH.ViDi_@D`+@nRp]WAR)9.KEFsqT.8Q8dG``ltRG<=)>-?(Q6U'UZc^a#:VURO?$>XT5?<[IaY`fhk`@iE/qGt0"eCtGt8V&g[3__KG[$is]!1UsChBSYZkB)XcoJme2^LV)j[OIZH"U7Q2Y)*(`jCe3`Uk?leY-:.IiI0$O"S`.rIS`$Hr^*Ua0+Ts)[>[hQ2D.TA3TJjBJM?<Rn:U?Qj=P73)+0WHUreWn!bN)h)Z2IDGea2KA$hu?8~>
+endstream
+endobj
+561 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 560 0 R
+/Annots 562 0 R
+>>
+endobj
+562 0 obj
+[
+563 0 R
+565 0 R
+566 0 R
+]
+endobj
+563 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 289.75 714.0 335.31 704.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 564 0 R
+/H /I
+>>
+endobj
+565 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 226.15 703.0 275.31 693.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 450 0 R
+/H /I
+>>
+endobj
+566 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 388.6 217.028 433.6 207.028 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 41 0 R
+/H /I
+>>
+endobj
+567 0 obj
+<< /Length 2711 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GauHN=``=W&q9SY;!DP^WefY_GTBR+Z+ZPSc]34Dm*sTs*Zu)[:a$,S&'NgbrU&@t+Z(TDO__#KIP;;*]CGRe!VD/t`U_lT=f,WQ<p>;ugK[i:'7R&dAAbah$k+YRXn(06QbV$S>4,N^hnGL1Cema8KLbS[j]TUtXOtTa<D3cu1+o3[CpU8*/W\qh2!"Ur`J!_H&lQFoq5,FJI./2j//ojKr?AG[<4(.NWQ@)&+k%??-]sbmP1<sm+1'Kn.Th/\+2H$Dr!eK4[$"$bnYV6o>6!W-9coIJ,cg_?[)+C\lRS'uD[#$21ta"eGrjmjF_Loa@KJB&e4F;dcrpfjkT'ZZd5'fp?>4t<r3AX)nIpZ+j<XY<pbAR='7YmY`It7J@nICkI8+5"<$PoB@S69Q<#(H3WNi^T<c=82CZ#P)$!56+R-dH<(->bCd(O46TG7c>AlG8i,7`(q<AL?^UIjHKW>"R^%`Y8Wq$WW3QSbC)c'6a-i^G$-k_Y\R!9QB'pmUn/MNUaXr/$_3@O7op;A0KUK=-jr8)a;F&*9BA=Yesg/U>39%!IM[<R[qa3b6'2/OH%g6AhYI//>q)U8fX[!A/;a't?gSEsXge,=-,EN*ap^0%jFUUt?[Y,0a4plh)_p+WPKO\S^Q[V!hhU1-VW+Q5$FC[?.rM!AZ43J:]Hb8VGTWJlKTb^fl$57hq2SQ5g&GM.7m<!b*7:?+)2llEX:G3OaHYdJZjDUS`"r!t@5MGlX`d3NdX%]`h(/9kqZU6T`nY%WcW\k%0,r4,GJT<@MpPAZPreQ/9o`<lYrRIfAmUQ2EN%.a:!j.@97l,fT;ZWDYs@arcipV7I[+[:?k^-p6EF,WU&GQKV7'VdL,m-RZuY&bl]+-q?InP+n\9&sf5mI"*L(8r=[B]\b2kna^ib8kLq0'rjJTn:d&%reS)2(@%Gg;XQ7DoU4dP$r^]&C/H$7U0elM@N8N2eFNfIN^JaI-/\g)OXao`<*O%UD;J"VOY4XQk(DF1?JAc!@#>H'?:Cp>S#Y&C=6!gLe]<cAKIl8>Z;I$Ig64cN,=hEG=sS]D-u7$'?tNP2]B'qR$X1X,cu=EB_^mKlrIQ$8CusGpOX1/ajQ1=9Q=RLR:s`7onF;jcIiYVP)aDkmG%B5ke6-d4o.0dGU")ETmoC6S?C44C>2\/[iTb=tO=k"BBgA5\\R#Pc$SO9*=\38lMgnuZ=S6`DQ=d44G[b2E*pLR`f/J[#7Z&p>l0&=tXp7kM);-J]#3qF+n"V+8/CP=\S"\eC4Ye%B$bpc/ninRu=TY^Kabka8)r!F"jQfUBe`5'jr_sN,'C.u]G.h5K-XP>)EoMP_2u97X`-fcgqY=Q5GYp^*<lQ'kZ`WQLeT*[5[M8),>,Frpm5ds-BEV'e<(3V@qXkbE`[^>Zoh9%P6hGf?]PbmOWbGRUQ%i?!VM$RRKZ4DC9$@GFHuEG^`/Gq!qWlYGq>06#dI"NR&`MrVG0p7<%WAC2#3eM/F^2hH+`0Y;kYK4*3r!5Z>7RH((TEK%S]lq`5%eQ,^*!0^W-3$nAVb(=W.S`"e!2kAkOSHo0C"j/SHdj]a!-02kmd?+k7l\\O64[k27WZr]Aj'le4M5O8QX4&CWDF`&]YsD+Tp6&F']rX5(8sc9jcd#9!_DX_bQb4S-8gJa\fLK3JTa.S#"8C#9+abBJ:-5+TmJ7<j3$-6""mO:\&R<8UIkQ$=M1@000U+7QHbZ)g,rO#YnC+GSHOfM4N;E0]#c$1l;Cb&hi@'&Ht-'39&_'!!d@Q%l0WcK"^60P@M<gkF>@J&o9Y53UF4/1S+rs#$OE_]r:i.Oq^`l98$G;?<SP%RSu5,B0]aeSB=$V;r,l\WeXOZet6Zj`nod&P5d3sEVp+>9aJD__quo3Q>bE!fJ<tM:e]R'+rrD$3BWca],ERtENG`RU;?I^cC0VRiE/h<Y21d5Og9Sh.,$N20Qh31luJfLjh$B0RR@-Mob/3bR'IiE1=AI!H4ls"jH'CnAbTY_V3>;BY*AE:U2("*iHaCt$@ji9p*;.b#G5H/2Dfg%$/71pfuqmOK!U2TlMH^I@g+b)$/=pb\\3@">MUI2X.Xedc*]^TE6V3PF,qd<A89aTA?d#D:#Kgq#j#Lj$O\rl1kAR1T5p3.K$SfA`UsN=GLk,Ar@mf-Xtmg92k2(2Y3j<"#MjZ&-cQ4^k(g8)#]dCV^$I0<'A;cY^.BoKoB`[O%<R`<U@l-D;l>OmY1EZpL%\'T""cG((?p'u+8p:G0W`+^f0;CX%Fu2/1Vfr5F6EXG'N[`I`O8.&28&bDB`$3An,gKKYe7]`U1MGDJ:l.A]"3;K^O?..X8.k`W7pam%1FVK,"/Rb>&(Q,n36g-a)W<0D)lZAde%.m[HhE(5d(m-_B73+$p@7![q%">]eGo/Y5.4,Go0[R1sB-?Rqh63=I_+"lARr6d&Bt6cKqkSmYH+'cCuU2m>JVP@nsa4I(\aZk[BL1>F=t)J^as_-h/'?HpBc25G9M,*.?S3,ZVm?>k7m[AOVA0.+CNXJ8LiAS!BJr6*h#?Ce'BNcXZeOmWK+]jF7;g\"fp3].Jkqi`EeK!U?/5ch(F^(AO"(7K"CgYP0.#'K<<a\?c7kJc5H3ni+.7Pj=ooOa-FqKD.^:Y!Alc2U%cSpKal".S?.'psnpeE'bCmT[,J,(K08=[B#ItiFVh.i-1rFIjFgIgBN>bMa(b4q(K_LmRI~>
+endstream
+endobj
+568 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 567 0 R
+/Annots 569 0 R
+>>
+endobj
+569 0 obj
+[
+570 0 R
+]
+endobj
+570 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 200.29 87.738 250.29 77.738 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 213 0 R
+/H /I
+>>
+endobj
+571 0 obj
+<< /Length 2330 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0EgMYb*&:O:S#^L+c`3SftCf)<LS)&8:VVAUd'MTZ_M6`!'if]J\r;BNZD%.dh[]p)>"I;^kB?n_kRA!t`8!@.Y1C`0eVTHp+js*e\pn+O>(4YKd^2Ef$1t012T7&91;`#TR&QYK/BOf5fGF^)bbtr\.U&E?8mmh;oUL.7o/`tAVi:@+YB^;h`\,lUl2FBXs1lA]okb$8gBsYH9[C=ZDTD6!n]?]I*4l=gbB=#N3[K=&K?,s&n*jN"2\lgFCHZC(n!SW*7)G[sp0QkQTd!:ss#f`I@_;t.aAOZ3kWZptuko,+g@;BZaN^%]gfGt4E%$-Cd8Z^93/2'V%4^MspKAI/%iOQ+/DpLK)DOBHdmYOTq7Jh&4.*L`&A:f<+Cme`q.^DWL6pGZR3?.IZA*Vn\Qa%:j^85up>W_.6e'oCRZc"c1&f(C-@V'V(Zg^B_EI2M'ikLgpXBob;g.S`'c1.LqKT2d?E5#O(7ef*kcYte[F<C]k5L`'d\.B5&%Y]H!E&ks,^_$sDP;hf&o=sVe\n@Ytrrt*$'Y(<Lqu61UJSj\g<rC"4`3"C0L"c4]!\@SWFBL<eU.F"aXI<^r/4i$,m&hK3?PPeFI]6G,U9[+b(nU+n>[Wl4.,,P#FA#=-BO@jO75%d?9Q>qk-jNr^'CG75Ud;(/r@MK6/-3=8QP`RBT&^5/hZ<?b(r_jD4A[)C2*=bB34WQZ"lFA0dL)6Vg0T<U[)2Z'N-l\4@Mnq6ZP/e=*<Zg$49>5#[gDq].=k?=a$F/AHZ&79I@GVos8)FccoPL+#N>B`CJb*$5;!a@$kZh]&Lp?QOT4h3@G3nn]E\se[7gm6%g+M8!mr83Q?E[p9!X%/TlN(B.N6h;mp>olXRSo)3g7OV_hhe4_NNmn.4UVb"`p9\0b?\bKaK#?;6_B5/AS(r2u5j?@B^k&-V\S+_C\5.bdN64!P5(38B&Sn=Y@]>:In7'-W.[U'IUq:ET5!:*76]^9iAbb1DgC;%$_RUV+V-+<%6"U7PLm;#W%cGi8>q,=uCe0QiRmE^&TNPGX@\medeKB<iiOB6HLr3-VDdPULQ>:3rOHi">Y\Y-u]RP\DOs*&W2[KWKKe^>jpFOL8ldZ9NR<_73HlS./)2i%XOoe<YD2:]1!(jWj7iYm"T%l$`j-41HC1F`0ecqcP%,tEl<R*!!:e4SAZZ\`.X\0TPXTL!&_h@^lE%T$YVtEkDKg+!fpX-0r^M41jr8H$4Z=S+]\nMHiuS>.s]uoi`]2#Uqs(6&%1-6Q>%#_nh:^.ThNR.O69W;l^(,5puV+<'KP&aOj!Q7Cl*h(VAM[MF5DFDc(5WieZ(f>W!MT0Obg9!jp9]65O-tjnJr<FF?#maM9C([(9&nUYYNNNGM<a#,U$:RjgIKkOaJuAbg=fq3nN*M.<KYZ&C5XcZA>]rHTCIFQ">`aX[3O./0F)^ZO3"4#kN3fJd+Y4??3L\,moKZ6b`o5KeStgn<]m<J-NU*c`ec%BmO_(Yj2Z)e(Y<4rl'<lpl#k-PmbDhq-Yo3q")=&%kY!:2FT(2E/kn$AK'or,)F(lVUpTgCEiE@rFoGAgcDGC*DF%6:[iXhKP%-gXm]mQE*Kub#7_4'6Nl'uG_RGB0nhf#n<5t,X'!n>%L2Y6F0^0l6%uKbVq$4=_-F6m#@c<d6--aU_Q0hV.&C2K:2RtTZo,9s]@BA+.]NS$6f<W8(4^gWpG[R4GeMQj*6Eo@W["7:jJU=]p^)+*5ikb19lYj.W_8]l`#PgHlm1W^6Ib<LIYkQfKf]AZ&$Ju!59@^-J\`L9E[b4^",9*u71O5B?p;@E`A9TA_J,JkS8e';D+G`'+.k<>4e?:'eb'GB1CRVs*4%+.H6@c:iS@1!1(5hj&7\-s:oV0;(a(*OfaoBG/hS5!jGD"efH-r[9eO:(GpjQ.>^IVYRVZI(0L0_L8r>#.=C:8@>CLH=Tdj9U53t]N"$-1]8OQRbf$peENi@GSbV3l'+nN?sQ0g7,Oqp[C4Z?'5\jZc/g7.0,^C<H'CsS>i=(U!b-)RJ7hWW*t\etW&E%sos5""Bt6\A>aF*C9%Jjp1Y8?6#LAM2q5`JOr-KMZMp%Wb4/o$Td2b"acD)hNeG-%PeT/E"2AB?MK3nr"pF"oTdLDZ[7B$=P*p0+;u_l4,H&UZH#;1_Un+V/3=R%o6l!3DW\DZ=b'5aL1r+g2u*ko_ldA1HbFRkC[aN]?9<kRoZs2RK7mnIEUc<S.?*Sp?)3eo-Ob/2t*deBP&-:00@#0F5h'uGuHGP;3f_`R@^t"*9)Pk8kohO`k[:,MDg3XT&k=DWpcS,*1k2`aN]J^mE_@'!T$i2[K~>
+endstream
+endobj
+572 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 571 0 R
+/Annots 573 0 R
+>>
+endobj
+573 0 obj
+[
+574 0 R
+]
+endobj
+574 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 194.48 366.728 239.48 356.728 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 67 0 R
+/H /I
+>>
+endobj
+575 0 obj
+<< /Length 2892 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm>D/\/g')p`p@I0==5cs>-efGT^DI9PPoF6Xu]8NI,BUOm*OXVk23Q^90r/KbRbtt4"`?#@#&hT6`B4d`\36KR*B<U1<-:."oPK!Bd5Il%T9RQUO9P,H,c2>cnU3*]n9Wh^G]sGg;nU27(nLlN*@O2G98O%1>s(Jr\L&iW&pfCa&;Y+>X"8lI4H#kn>5$@fhZQe1-5qGQ>WL"n#_1H&KiLAge?ZDL/=bRiuh^MR)'+6.N^o%QPrIP?+OmX$ui+gH#*bP4qH*J4S'Q70/Q=Oi2<(d)1)H!2:hH?T?<n</3\Y?]LWo:O($EhUP]O>2F#W+?l<apdN9?qGP4V(2h/%%+uA':lhp:*pMib6-%<`R'/L9L+GFk*L^UD9t>E::enM'a;so29Oa6DQ%I\m#Q!9rC4M=UMD8YE+Z.+PdF]TW+4f_mSWs!.lPX_e?RU<9:U/<fIC)?=M=i?PF">0j2VR:"<u@Vi`c[9(;_&O4S%$UC#t9?8<$%#nmdTF,@$&f#.0!T0GK)(!.FbZi-sI&c*RbMf5d#00gT9E6&(`?-O(90c\3a0YCm6q_0[-/[i;[c@[sQ<nJq>YQRB$B.H_4j\hE(Q<Pp_].Q[]@DBSJjkJDe2U0TuJ&bg@m)IdgdW!Qp@=*VgF+#_3K.NQeeBR'aK*[F^1:i7Ao65,M0[KLRb6-;8@GmsgIK'*07%?RZM[&ug=fi`A!)t>SA:Ze0&'N[s8D"D4YWWlM[[c&3mKn?kNi:`4NS$#'JXB\5cEa8p#tfk)<bMhhh^E*(Do!lo%63m@Dnlb7Z-SF1$-h^([5epOY*#?,dC3RRSc_p$e7*(e59/2nD]+L^Y+N4<'7O^li.1WJn^WLbPR^4e^p#8f0a7>+-`O"ho>n(gKGS0;#V/F,>IS`\WQ)95&gVX,":#;qbm4VbJiaZR)Nf"r)Slo_i*]!;]2&1>/3/-p6`[:g[4s8aG5Cjk!>Z($A0hk0NfZ?i+h$)[fruE3XHO4HR%@"(5mZ"XKB3K<!a_2d?\F*AX8rs[,?.2@mUC=J2i53V431f@r7kDW(`Z74n>683AM[USe2SGhh8P/QQ_3-/q(U@LFXcn<.Bi.uV&b@eSK'Fs;st!nJ&eOl=e>5r_0]i&A01qL\""[R%&<1R0`mJ2@7=%4U+4A2AD)5H$p,OMNBP&9E$!*4!b98)7Oma^%S"P0BjLh?JmjAH;r$*?4]B'nr(2Sgi<o4Q8XVEr\jA&Rm(*k$,>YA-315&#8G@L(`?[b-7<A<Q^YRA^m!oNs;JH!hp#gN8[\\S$cj;8o(5`FX)$6:sVbJVM%noZ1QLo?HDTOVg+lkRKMG:]K^J\+u.PeGP5`c$_+ONZq6pfST2'Yt`<slgU.3B*l*t^^^<n%#()t,WHE!jr%5\\m0<0C6KpGguGNH1[;GA]4\F8p_t43"<:OF4.^5VjoSEj1rF(._ol+)\5gr6.]AV4XSK(I!GPH2@NT,ARg+;R(CBHeJX5*2<r,4`_Rl1LIlUntC3<_.?5&1^-&@mlDQA&:e,<\K"*J6br3(-&2P#<Y3tB.qtb<EuAtR6OP;`Ucca:KpCt)k$?eq]is_mPTkDHV/!N`m3(4-OYst67#>fJ)ppVU7/.>J8iVH:nu16OfeE&9c3UU%Tl1768831@YdCMISC;L0GVo1dJ\\YXeL695U4F=-Y`4.>N9\pYY,CnoPmQSo09,3W(HeTN2Y8T/-B&!Z0]")>542:^rnU:K4^E.ZH<H9MM"^AI1c;?-VBAb45eNcod@sYf'ZETF>+#JElhV$8D,#?`\m[A7r:0MP'=f!FBM63X7>QTW1>6?R4->I^%cmcuD^uY:P(ihJ/t%gh6P<oRG\ltbq_.LB0+AEI^TO8Ukl.-J[!c[F4IfthYW!.@^d>?03HOh<2F+Xjnrek2Mu5a^:j4Z"=1@TC=OgZ9=q-!*=+[m/T-Q7'&=R.1=6K&0KLml,2TrDE$WHW+/uh!NPt>CF5<_N(Q!uSul(,O8_=4ue)_o#[_UP:^<rrCn9(fbIEALT7c<uZglQ4),1\sdb%`a@1V%gAtCEX^#J=\u5JR`(UK8G:Ogr'Q4(^+C?c?iDH:T_c&"!4%ra%:W_eYH^mbXt(S0\(ul/TDCom]&eP[%,%u#f*iD>9#Hj0LGAkB$]?20Bo2Hm,R`J?S6K%S/$MfM$;XCW?Z*paLfa6^#Kb1Bb?GQK:hF54)jQ*a%%+p,Ub`.>lA'\Q7ebCaB(-67U4Op5ag#4N<R6K3J(ATda@+qIu\P2ODO<0!FbL<6#C3]Ie+.45QS-+$*_"HRnZS%gM$e)2VBc?j"n]X95d6MN/reJEO![8d#X3j/Z9SR.srfsYjTJ#SY@<sD988/:=RKn7D,fRQ5<g+3"37LopJYH&s1cZosEmO/5-D5UHB.<93&MKL[5u2BcFr/@pfB5rrC8L`(Vi15<;!A+IagH_^i6$@1jW=130fa9cP8l'hScgR^]A7NOnI9-(YT`m%H&d/Ki:?<-*'O0RT>DI<r-;?]b-))9i(?:&L<AhF\^XdmEb]!4!ua^jNf`Q3.o*DD#/eFW$*-eeEaWbXPbhkQc\fp<rosH<g+-?j_Y)/Eonqr\Rk$QKY&])#`oBfmTYY>^*5EO\u#7X5WW)J,V.W5Zmc3[(lR"-9Z]LY6KI,M6epX@"Vfa@&@GH#h9s^3P;)d<LXqECXVZ6C*9!!pM'rH)ggep%ZkOiA"4APH1>6=90GfgJIWNfPY0?I92b\p2-FOtj6s`$8POeM$m/>M*O.]<R:!Z\IPfX4rHV<@TmO3q`:n0]W*(g0]3lCDTpMJ!?na@^\rg?'S?8LRcYP+b!+W7jhV2(Hc@DIsC!r$"k8?qr9I3b6iP/Z$.$ica:PH,spXI_PG(\C>cR+G:mT4hGGkO@tN#<B~>
+endstream
+endobj
+576 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 575 0 R
+/Annots 577 0 R
+>>
+endobj
+577 0 obj
+[
+578 0 R
+579 0 R
+580 0 R
+582 0 R
+583 0 R
+584 0 R
+585 0 R
+]
+endobj
+578 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 369.99 575.922 421.65 565.922 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 487 0 R
+/H /I
+>>
+endobj
+579 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 457.22 446.922 508.88 436.922 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 487 0 R
+/H /I
+>>
+endobj
+580 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 92.0 435.922 181.99 425.922 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 581 0 R
+/H /I
+>>
+endobj
+582 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 188.64 359.922 231.14 349.922 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 377 0 R
+/H /I
+>>
+endobj
+583 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 447.2 285.95 492.76 275.95 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 564 0 R
+/H /I
+>>
+endobj
+584 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 153.11 263.95 198.67 253.95 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 506 0 R
+/H /I
+>>
+endobj
+585 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 493.88 116.09 539.44 106.09 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 506 0 R
+/H /I
+>>
+endobj
+586 0 obj
+<< /Length 2787 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat%%=`<%c&q9SY&-=DQ!&;`fi]IW'3P<HVf@of@!qAC[aHk=kP0I^(Fu$g]Mhfe^<4CtC?V%2XWirS/b&:<nQWMSOEufJ0g75^3m?tG&iQk`(5($#Ye;9C.Wa'q$H0>(PX2TeU7K)M<?,PXG+(''A?8R%6nu?R!f=RA&S/;$%.fK:^EF.G6H;/neF0YS4hB/YHmJ\,Q5Q]GmDo<0H/oPs8`<,>f8tmD"en."V$QXQ<s6=jX?JJk:`(G03W4&!DR4N-N6mF5\9m$UT/-e`sT'HmgXhE[r/+D]:nXTZr[$b=e6#rO;p!S)i:trqi2pY3Ei0O?C\F8$NDuJ=Hs#b,J<q[`pM.3dgmZh9=7?fji[,b^,L)(`E("-lMm@24l(f`jPDE`H]rU`k"o?)XdduW[YkNLD9;_2^pg.Q[9Pq5%9FPa^<aWPHY3FNnfi\$e;n_fYQ*DUn[K9^S1N-:m:hb'_1DZ/PfqNHC(^oG$aN'H.$6\f.4q2V)Cj6^ac"-IY9op@m?qV//ilX)7tq'`0D:3G4uO-b1;UM+Ln.k6(J@Kl=C?EUO9K2r0q]:P>C/d2',n$WcEaC*Y`7$_cC?b]lpr.;#Q`i.<-f"@**^R4)=QEHP:f3bG#gb4)j3rA6eFjeV=^YBm%rcts=,9TT@-[*s-(bO_6,"S8<\PR[Y55WsbS(4k`[M]iJ>kKU+o9D%XO2/"E598=.mW@T=AJ@W4U!Hk&?9bPK?%7-b*]]YOLA``\aM=:l5rco[Rj48f^3j%b^0Q&5-kN>Te&'T@UZo,rEe&GM&c$s&Di\csm=!%@G)%u&VkPL.+Na(rJ#ok!$'[S.f'q9,05J(D_#E0VA67jEkLr\iP93Xb38[$l5ZrgXHre<D=g^q&,jfZ/5Ai#UI@B^"qTPtj\NQt</`H??Q@0mIT.Hes1:55H;M(\@N*!s#2WGV,Ebm72MtmH&7[Dl]QHA94/_Npi2pfEB.XP0eVa&->fr<2W1(/1f6QU3,9%"]!JTTZ*9s(5.)DHf:4()*1&?0CtGa6Aj'84CH"q6;(.@Ya*0pYR$>JS4gJs4U14+J-\*`3Gt.%8I/*^LE!IRmK(WCN%&NRT3F?"Z`q&(G*=j)7@R8Xn8(ONn$eijq'6@":CBl:Zt026A:Rr[I=G%)g:F.uqk1GC`*i1`<?NN?OkNMuN>DPMoQ\,$E*N%lPG?Z,?rg+@$crkX0;.;"53YMOA5T#-%k#Fo4BY>WSQ*>(+("$>]H,joTU4XRT9GRoAFCpTqf1m^nT-VbW-A`Z7[j+)sJpXHR-hDJKbPZAr`\."Ju&B#mg4W6_q3.qE9`g>i6gh+Jbf2Nh`Cmer!d9iEIb&'SS=+:^8BrF'@up(jAbs%u-Yi&O[OQfl(*2ae!a:.3-]NsL8o4S3V&j?U)Z6SFM-WoJUBgI`)[>Q6P&100W<4Mh)+'PIKGN>;IHBc5!K8%MXU*dSDnaL>0ue[8@.f&SX5"k$fOZfWN1Xp@`7(&1U>9)r*<#eY@h2M"d3abI1C?M!$u%+'[AL5*)f0C+qT@ME*YCqu,knK0?<=sg;^=16UN1nd*t;9pA&]I%\$RIQ#2:i!A,A(>XR.NcOd6q.;Gl\EkO,=X^=p'b1Jpjod,hEp*XKV.Jk5PY*2DuW"d-N2G:P%YJ[hE*'l"rk7m<hG:=XcQtl@;P,FjB,l<hBRC]E^1(.1Wct1YXM+rI3Ro3ARo)n;JKlI%6dW>_-.6%jK_7^*Li$GM!PR"8->u)o/VVl`HKcg*28<pM%;JEL\[AWCTl!lh[SihTS]!RRaD_=J]bf:BJ$M^/Xo52MuSEUHI/cFp$:q-g_3!sTY`oNoa7G7=iPQsAaJN6M-dN7W]-V?!Ab)6!SpT3Dap#9G!*BTYU;^6o@`RXOchDp`WrB0MuJ)tIn'U4bZDL`$n_k[q'stklMZU2*-QTVn?HP48i/>bK[(;NleLWdUbq#.m\N1<'H9,P'GCc&&fB=lA2C<<0(T9II6+H?)4eiKXcgY=N&r%uWHjMt]^4:/4D;J?(c?8Y[AEgMCIj2q'serb2_,f20ohi+D,C?p)JMAOB?VhRi@KhXMR$kGN0['\q8rm)/qDAi@ft^:JO\ms$50(Z&--!#S3b.to8F9HAnhkZ<P1!b9OVsD8:1a*B8%TSMXA8%Up*QV$e_m'?(I1R!d+^1@#8)m,7:]Z;4)Ed;J^R@Fi-UUQ4A4hh!m(uOt@<D)&)k7p(fG1Z[;>.-uo6Qh6Y,=7iVmU0$?Z_Ns7Y1Odf'23\!.j:^0<4:ErI:6R'ha9/I4$Y_R=C+W2o[J'@dCRs)KU/D`4if+HA?hK4bfJML#km&8L\g6)3lMpT#fpqo5$nj6EqWH^':iR:h;6^0(D`ENHKcJ,ubC=O*_il5RHg;i26aroO":6d*oP2Z5)Y^(T;+iAkl,J-1*B[gJa@0"YM21QtOSr=-5/;[5FUK)`V"nXk'O9+ZpWfC'Tg/kaR@@snk'sO?'AfH3(k2(,&oa8c!Zg'0&&-?E'5U_2=4Y"iChs$u^b&^J4<s+W.BH^W%b0R/TBK;*R-hPHlffE4V4W:5k<M+\D8D^\HQ2s!)dE%G6\WOi5JWL@RL>mn;.9!Zhq'49&s"]7dO_?CX/_81^OId8%-(0-YAcg=s3[BQM/!9K]12%>[7rFjQ>NIs"h#pJ\r22_ej[kt'Bf_5RTUF3n_fTRP]Yk>.-UmD[Hs*?FQesl0+aqs:9K2an96p("?b<IT39uIY+2$5.P:TWlkQZ9;c4oF-.qiVbLK/d9O/p!E@p==&gbq:]Ha!1EZi:&7>r82~>
+endstream
+endobj
+587 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 586 0 R
+/Annots 588 0 R
+>>
+endobj
+588 0 obj
+[
+589 0 R
+590 0 R
+591 0 R
+592 0 R
+]
+endobj
+589 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 107.0 689.5 152.56 679.5 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 498 0 R
+/H /I
+>>
+endobj
+590 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 375.24 456.529 420.8 446.529 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 506 0 R
+/H /I
+>>
+endobj
+591 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 310.3 275.585 355.86 265.585 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 498 0 R
+/H /I
+>>
+endobj
+592 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 493.86 93.613 539.42 83.613 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 498 0 R
+/H /I
+>>
+endobj
+593 0 obj
+<< /Length 2752 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm>hfG8H&:Vr4iQ5"[P>K%QR(cktj4[hfA.g7K2bbB)ODR\mE=sPAIt%j7@2C30S[n!C@tV/bG5'a0=8as?qJ\G8H*61fk0"unZo[bI0)Y<1OUp?'T'pp_BV(3t^O(:q]H<^@e,%aApH2r2.H9b7rbj*S=j$?'G@/?@n,?F^+'A9BdX52okT't&'IA(/6@Y58LAjei_=L'=?cX3OMDe.=>\-%</%l_NTKKKlabh8W0e5]+p5dW!CC_W@CE]^E4L(t:nrbM+E5`S:($06*9.!\TA='<Y<6,%k1Mk?/EDB:R'mdBC?(""ubGs&9iKhsW=CN-.&jI`TZF\u!=LLJV1Cd7g,.C#&o6c"F6KaghnSqGYD;K^"lt?(E`LO&l4_sbM"-'@EM&`:h9-rTO=H/luIBLg]cJm-l3?]MZ)T]J-0o:@3!)CaBHs*%IZSGi+&IP9KTf$Hh=5#Am2k@A&;<TE1`2abg\]@ia^Z(cb5rIDW1A(9K:4Onr;m[F&&ctt$Ei)_Kkm:^S*.u36R'"R:d-r":YI(rdGBmf=E>#]>qLKH)00Ho]%`c;5=`\<n_3RDg,HVLI#ll>''jH3PEQQDQV,XA;-NgR3FerZ1KhPgt:+))[%Q-L.%U+['(4m5]1#oqh+jJOnr\9^=MO[Et2e/5E16LUFi\en\glfH`:I$OBAP%NGfDthB_T)jU(MO),r+V'c<F?ltV,V9M8WfO,#f`K>O,*4']#$=X,ZIViNq3S=khgc-rl8Me*AaD!PP,EWGg%YSF/a\bC[<+LhgtnNj&F#Q=X]]s$4^8gD>$W5<q6EbkQUFaEIY:7Mo+UFR\eau3[)iZTp\C1(7IF[rLgn)I.M<"Nlp)#]YE>iVEOV15S%0U?(PBG"Ni>_>%A1W`"U.P(_R<iV`!d/U]HQ[VuNcEi!r@<7.-jkUD-6[=@#cr!,H<0;+`9?BpC,j!ZVi'5%'KnE7B&B/U9hH_G1k]Obo<2qSYZpaIK/!$00qr)XUW6DO3U-n*G)o_dtguC.ghDmjnhcb9ieob[qgCAkiU^9\k\5alBa##_cS5KgE?j'`Ur?T!_;I4hG$PU>^[UM.W;"Zp[VQkn9+dTIH_i6\(h_h4.&r9.N0\:>):a8SVff?A!Vc/XXt&OlC?$2s#fCisPXXZtH-W:>B!-N(%4i.is76iE,<@?P(q[8mNE;KAquZ8gY;3DaYQ_Y@C/fbe0BX_?:Zl8_THs+\\f)6t(:C,APd2DjNAlQs*aPl1U^hFA#.0\o;/'D7/\'>qZOS,IJGt#8rTCNZ6EAHjA%Zp8?pmmE8c[4Uu+"0W*1jA-04]J=bKQ(nlpKc[p$jBOHBRPTUBl*D1A:"XH+Jp@UA[V=fO5LQ_Tm\,Z)RUt8Bf\$Zu&<R<Oq(F^/(fAC`oIImsSL=6Vu$goT*1Ebhi8nkVAKH5`P\]:]X>_Uaf--e2"8#]]&N&#Pg1eg!uP+O.Jn6[^s;QMN!Y)CAk)4UFn0^5gOgGB*>fsVo4@-t_nF:eYC3\jO6@/n?BcN=hPV')Bbmb:Ke-^NU8X'ue$20\F"mG!^]?nraHQlM?eSS(5Yp*U(A.ED0*SYpSU+cQX0o'rVC5.ro4<!X.em"A]L;[>1T&@-o,Q6tl9bCC-@eseVk\>qQ?_'Yd?77E8%Z;`(X)Q>[g`5M<gh[b0W.RJj0OM1q8G'm/meZhQD*#!UXSpGupJ\P>V_Q\#/5"JsJlHt9aMG/C>HpXGq!PXNtA@kq+XMo;Vbt#P!c,;<Qa-#+n7FH'-`[Pk:oPf#.Z(MOWVtHgIfh_'R1K1S0*O@>:S(MX_$0T9eCg6SOr/ur'VRs`oDafn"Xt)@81';,se7$@Hn[P;,$,Y55QQ<NmA]lC0e^b?FSF^1[5o:63_qj2&c0[_$o]r!e$hWWX`RVpIIrY?>[ufkI?Y;<!QM:bu*>Z#H2pIq?V@$Yf.JEI]!I*m4)0QbhUN,VA`!LWl5Pb9mhXnJ*X-]Vd`r9(sB3^r-h\-Cif$o1]Bn`.jI^l$1"2q2u\`XNG\9a'l>IJ?0jBfbQ?<4't7KS5*L,BG`<EgI,]^!h$_75*<L0=db[<N#fXgO@I1Otk7$C^0m<SQ>/>(aT&nGi1uQ6F<AYi/D3OZC^=G^qO\+W6)h-'/K-/bPJh\]dHRi#!\.IPg<;kmPc?"XR<u0b;hSHRI;pmhn"l?)pnM=&r:JpNjf-bZg:/N>rn$pThal:s\mkF="0$aF!0(Ggha=r\Wm_+>)b_ju!]sQ)@mI@B`Hk-O;h^1Y1lsH!2$^B:cj2CT#"2PHiZ#gX-^<k$[@%I`ap[YMMl/Rm27DCcd+Z*pNj:pS*58c.EW3!22n8>Kc.AdH'Vuhk=Sk#U=CPqn4<.M#0F]@WLuljrP9gBg(=r>,K&3n=aBuQ&SfQ\66o*GGBeu27Yc0:%f#!5J?$XDpp;UcYd^OU.)7n24<CWeP2lskT\WFGXJ,Nd[]@!k3,]P82N`2R6ZF;WrnJDDU/`?_)Z5rMh62[OfSfg1+V%a:]b0)ifsKb=tY&;N!'Z;PkGZT^muq5M>gK%1nrhS6K.$e/$Q*c6m3rM#upA=R6p/Z[Zpr%JP]03%K^"a82[D?j.V*u47lEBeA]o9ER6;cQ=7UV,H3YgWZJ=@YC3XEVE521-]5>k#0e1^m`e>aeLe9IeeAiBgu4`*<.FMIb0`tul\;8WHtYol?2]&F2.oom)sd_LS9u*g6MK774b?Ed#C5jGH--YMbu<M<)8=ns_7JdHY&D"@+8lFGE6Rh~>
+endstream
+endobj
+594 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 593 0 R
+/Annots 595 0 R
+>>
+endobj
+595 0 obj
+[
+596 0 R
+597 0 R
+598 0 R
+]
+endobj
+596 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 333.07 504.028 378.63 494.028 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 474 0 R
+/H /I
+>>
+endobj
+597 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 216.15 460.028 258.65 450.028 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 360 0 R
+/H /I
+>>
+endobj
+598 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 377.15 408.056 422.71 398.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 498 0 R
+/H /I
+>>
+endobj
+599 0 obj
+<< /Length 2960 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GauHN966l<(>eehE+P5.<T4$qCbr];P=\KGqN4D*o;KqcA<:<W_2'U-deWV^^c('N#s5K'Ptf%:Sb&E(GE2IEo%ag8o8u6XH_]^!SMtk@kDqaskE"bV\Ms8WYs4Y9QJ9frpX/bFF;9+n\c;Yqjmp]%"^uiPM&.,!kk<#"WqPFUkX(,+=n&6#q4TXK.$6YuN;a_IIr3+0)DR$RZh\DWL=<gAIOi=lrKk-cgX"JW3=[Qo,N#7H7eMY4;0THQEOk&qqu%8=]+t(lMAoRj1C%3,-$-3rJbKek()a,&ZhFD#[o?VU;T3TF,WmTq>2\_I=3'Y$r-p$E`RWT;gIkXXh0HX;KRtnKZlo!p80k4!aeHK$Y\/3BAK[G_$Ec.M,(A8]<uPU:chK_tJs+!O\LacR=IQs-d?t+h3hju,L&-tt+nu;lJu)WID_0A%a+^/d0k(<7*;B1'lhs=:L?M:hg$90`?,^iRVh/K6'og#tq[.0>l0H6m^!^J`93!qo3$)PI:?:4\dS*o^c[U?=fO"'3Dg;O+5JH#h;sE;$6dLg*UQKj@*RpP_PB#Y^"Wt=kS*Uu:LR$R%3LqgL00`cn,,qZlg]$b4'H?s)[6e/1XSlTdm=pc4ah">2Y.^e^m1pbt`!I5W/'\ChcVtIO],n31$MY>UqjQ[rabI,)h6_f3qsQ=69@-0qKUmC$&:8'hR3UCTM9Om(MV#0Jp?T>iC3#1P-K>Ej5O-pt]T^7NaR=(sUC17p+L`!h[R$8YSZb(Oh9/l[4Wf.Ko(D%N79kc%Z[&UZ%Ge^VOEbY/aBUG5Bed@B!/J)VD@:o9'T5a/re*%XF\QPX8pLJb-KnQcFQFRHN%A2!`R]&JL9hX'!iY7$W=1DHgs%#m6ORQZA&/F:l@pijMA8'==@`V2p:RPDa?jlYO3&DiFDG$n.=a"+9LD&JMq-Omn6*HqO$.9R6hSk2/V7tG-9SP'BJ;RuO_ksQC*8S.mq^>HWPqE<\B[\nYbuSaLQ7Y2FYhu;2DeX"RR8jD6*t[kVRfnanpqEOG9`%6,cQni`&2FbjB-.K9Yb(irFjr5C+;r&W1lQhRQ#W/H0)c@HHlrVNm!Z<0C3@35Zu\IjCQCK1U\T%onZ)0dVGPf!U;LVm2tKnmdNc>Qc_:2gC<PDn\'4%N@?LcCsYIaEhZ)DY$_cQ;A;op<$r8n?"]SGMbC)WB>GN\kV/>Joc$ua7h*tA6e"*ZPre*5kp9e.M;I9>7trk',.?SKa^(L(A8ddd9c*XX-EYc-V_#71-dN63I%sW2mo&/l.l#66:1<pmZPltW_87WVe*r]D[fs"P1\Fpr)X"CZa\khkW:bb7P=/BY`"ja9cUU*PnmIXW#<L]Vk5^q07B't$Dj46T6??4qQr8$HQn["pJ&!mKEZ(m25;@!H:<7En*F&F\8$7$<7..[`[<,2-s6ZXEhFNe`Lcs.j#&8Ohi`;<_RqMeWDfa-6cM#(Sp1]S<EEMfj[#']6#qJT>6sbf.$`O@Jq3HgXC3V']kR0Vu!p(^oAQa4b[+#6-M'[__[O^"H>YS#DX_!_^)QYI89u/SZn67"@U$(InF.R(j6i)*DZa?GR`+CEAb-S!To4jI)1V)ZGf^pADWpE;'q0%8Zdj,2HIouskPK@8r$g@2)Y;3c8,Rj(pbbnCo2H@QhSScGQ"P]\>T'-R#g^'=e1fJ']=_`mfiqCrf-ZeV%m2A]6!HX>P=a$3(Q-=PoK67B?1_"+L8XZ=nrHQlPhb>9(m(d<9@5>`o>poMK+t(;*]PKWOXr;\O[,-H`+F?K8o8$9U!PQ(^;pAZ!p'Q,o`)=>o."A;"A3hDi::-^DY=-X8@,#1VQAspZ_KBFX,,HV-dcCnsUf=G_\_+gN(8I[liJpU+)S(Z\8NG;2bg?*HBZ)YV83&;/F0#`HHh##JD/+ioja"FIj7FK%H*mkjA8ku[,`&+Sh3Mb`ie8+<f7uH\Y+sNa2<Bg^$(3@boSYiRMP?gONl8.d=`V1Qb`n3f"0$8U&E[q`ED&_e&jQpLOO,C%<DPZBDsZ;PKI`p\hQm;G<Ht+PN:m>qHPgmb<;S;R2[_RN^c2Geq'L/CkLC@#SA+0`8p(knZPc@!FX([FE]8J-"l&(kSUt!pXF<=ZV;[NB`qfVkWAd87oGKs*O_'h$e`[3dD&.K2"Me]#WcU![OVMTNV*T=H/11r/f8]oH47DJW(/feXS)Ad/(k48J(a:YH1&-=]M"--DfP6;Z6=<f8L_GBiRJ)i<n$-#+G7+?FM[_r[.NVJY4QEk9gHV039A:>hbMek0[Ar&8*)Q6>@Z:Dn>Rn+K1Rn6<#=.rjRuQFnTe29n13&&t>c&SK(a^mT&T8Y-*h/5a*^2HACP,bt>6*.-O]o!AI?uFndQrA1+RQT/[(J][X%tpI4jgE28pAA`&KSpCdqcQA%;^p]Df+2*3KR>U!EqTsorOH=s3Su@%:MQ"7!,X\1[P!Mjt>gL]CkL#U[UL9joJ.VF^oY'l9'_^XD^CDL9-`T](FDiq9iT73BfsI9EFs*j/aT^fZC$U"nHqO#sogX1(RZnrl`FE(l,o3ae@@PS*Zk[l8W+IAV[f7(JDA/=H[N+\aRQYhu"%H0L\Il31"MRSHZBWmg&sZVDL5hVi:e\^G@]gYK]KZ:HD7O)5hX5I#"I<8rr<-8W0t<=h)kNf3:KI]G@<NP$<.TfG"8`+q[Yb#Doc+X/".6m8P>hopC,/5\Y;`a>AOsRcnM.1>1?2j<Tk0:9_/hhQT[eJ;*'aXgGPt$fHQdiTZMqT663da^MGBXYj=HM)2l1Qu6"ASHGs>m('mtI>ZR&rs;PMA9'[h0184?C2dmU\s[\[),/*BO?EMedIj0p]@^7CNhUgjN*3D#C)ZmUF61`#8MH04ZtSkYU?^%--!$>IoB*J%N1Yn)m_dfF;JXRHY1TBB`aXkI/G)aU4IO(TDO67"J(II"o3(\7[la;:qaD<rqO]nN5;1pm!rt3jlM~>
+endstream
+endobj
+600 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 599 0 R
+/Annots 601 0 R
+>>
+endobj
+601 0 obj
+[
+602 0 R
+603 0 R
+604 0 R
+605 0 R
+]
+endobj
+602 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 423.91 627.894 478.91 617.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 312 0 R
+/H /I
+>>
+endobj
+603 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 290.56 364.894 336.12 354.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 474 0 R
+/H /I
+>>
+endobj
+604 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 355.56 364.894 401.12 354.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 541 0 R
+/H /I
+>>
+endobj
+605 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 379.19 94.894 424.75 84.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 498 0 R
+/H /I
+>>
+endobj
+606 0 obj
+<< /Length 2171 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0D=``%_&:XAW;#,fAKh%TZ*>2;%OG.X!CWp[5!=uIm[^E0Rk_Pf.p"R&54gLR\MCkieB%6SFFXo-.,PAoS-mb<;?]HsS255s4s/9B_\?k.R@2[3M<k]QaKG+,\R@'EIYE#bu=4\7,5G#b%1[CN+KiaML358&f%``M1r"@MH$Ip%PSI2i(@DOV'h+#A2*?tKQqaHl!cbtfuhJU5?NG-3hN4`tf))3[@oK"ST*$&NqXOA:^W]""+'@um78PEVH:9-,Y]Ym<!Bd0-oQ=4WZ.S92oTFHf!$AXL8CbkFV8J(Tc^f!+*?4>5/4UUs>9R%\__PC16WRH[&;:e^1Co,oi^atDr<4:aa'13pt>'FFDV<F@@=HE(>;o)G7]`LV`>clCnJHE@OZ6Jp687Q`lDTeP'bNMdZ].,(Y!OXamP+h,lm39dj@1[D=gI+/qiA/PnE1qY=qb%nar\m5Yh\]&W^#XI$%p+U[7aYP1b5MQlK9'g9"k]>e.A"Ru'?GK%glA!9,[Lt>iJPEef:e7)pg/u$&gI'6]t+";r`mSSc8':n?N&&260mJn'6PodN&WtOB&%oT_5)79:[4l@_-Z84^^k,Bfs4/$>B5Kk!rO>%ZPY!cXUF&s!r*8@g`XggQ=?9S>fo>Fo&=f1A"FAF,,WA9mPp2CDj1(A0Af$7nQ`("YV>e3G^G@U/20d0!rA0gKG0Vg3&E&W'rO1S7@Eg68']8=cb/dN6EcpNLX<%2K]uAHLjc?[#\*sU71HlTqt2Cq&,2l;8<^oCU.\N(^@.-4PJ"&[I4t%*qj>=o>"<+6^W0&='-;Ih%JR0"3o&gb*9L?n']p$38*Le?@i<<0oj:r:P(dnE92<M^p+>_j;K#//]KE3]Sg/JR[iF?&fjHon=2`";6FlCPF]q68p/HVl(erYM,"4P$RR_T3O>dQElDgPH]:CcWUb6s9%areCUM+VrR>)s!A""`HY22;uj4ZO\1RIPsBkW'U.Yb>B^V'*2&u-H?XRpq4k:j[@7.64HfF_^'7gtA$/5<bi[^<'kJjGac"3lDHqHf>\#?HnTODhDRC1'Vm#7Ue;Zd:36=(b=bZbtX5(A?n<)os[S-0$L/K*oln'!damJ6iN[_d41?M7kSGo1*W979V$&Q'ic6oe(Mj=5nkmg+[AQ3D>BI?&\+$4"oIK#"<^[GQFpk,N7WP0?2t_mXslB\SUI>0jM=F@QL&;X'a'CH9V0hdYM[8C;VajSphV=eMK%K9,qPr*tFef'Ui/\P`.,NdI3iso9L?j#,kro<g:ckV$6Upg;tAIVP16c2+%29VI>(Ha3iHBFJM8.W#+l.Gc54RAlG1dH5ds5X&r)fe7D`pWBIt`c`bmqK2\ej<g3ga[TcUI@)s;q`pIqBGa!1M'5*D6GAZ?dQN%]D@VC9`EP(1#%Wm*J2MJ`#UZ^Wr^\4t'(T6<!=AGCVYQbAtC\BTtkK0`+,9=C%2&D#"/VgP_<[TOc^L2WoQ\//5A*ATN\E4+A%B*fG<qkaqFBAcY:[`m[EdldqfuUfc9(M$6e+*7e+33D).FbAn5cpJSQI;*R3utM_@WSWN8WIke0%+%nYBfK6qpJVI><;D@eV3O(G.\)^^nVqnL0r[M`!ngN,,PiiF[:BbTf[T35DSI].p'%\r=!9^GVC*Ok#S+m*O4<dAN1(AJ[NG_O]H1`5(kl=dYVBV]P2P;$okWNHWuS?VEo#gJ.,[$c9[PSWUBp,b9DttieHL#15@UH;5CVrQL`'-L)EZ-YQ0cf(n"uo_hTus_FaJR2j>/M&PMS8nGH?s"CmDCp.o0$dr_=Ps"?i<=!uK4h&TQo]A$D:!%+Y>'3uE+ZFalM<DYtuBEnZQl\mKpXfUAQW(0S4CGjA@1h\MB#A]U^HdkMr4>h7jRkjXXV-,Z-20@ifI6cP^[Hc]9n;AFSA\+r-D[QN&YZ4UpSBal/5rWT[1C1Z%PBtT-L)<+KFkT@8"4ffT(^R.B4_f:7/r?h#10l8QRT*JV[t?_IK:"9smsr\EmLEWhrXd<)PdWjt<#eU=:PUVj'8NW4Q-bij*]S':<Y"#RDJ/b2ig!Uh%@9+pU36\hY&a.^?U1MG2h:mHF'0i'5m84oSeJL9"uo/U7_sA<kM1]-XMe3T#(kmHp"uX0!7lS*:<t`Bs/2`'[ae3&\b9&pT+3L*&)Y=lp^[t?d5:~>
+endstream
+endobj
+607 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 606 0 R
+/Annots 608 0 R
+>>
+endobj
+608 0 obj
+[
+609 0 R
+610 0 R
+]
+endobj
+609 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 266.71 688.109 309.21 678.109 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 360 0 R
+/H /I
+>>
+endobj
+610 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 92.0 598.218 147.0 588.218 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 316 0 R
+/H /I
+>>
+endobj
+611 0 obj
+<< /Length 1885 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0DgMYb*&:Ml+#^L+kX=9:Cdd+DVRqCDm03PLQ!Yg'EA_InL9.DAJakuP`2c@)K3"*)Y"-P^8)%Pg<BDcLip1AUDr<sWLq#B)Oi$6G70h&8(\,hO9QitJW#%ts@m#SJS%Gh0a&_;OGi&6?M&(Y$$+YTc:R*\=^+jtL<&9AJk;ViOO[%#[s^_SIS2\dAQJ2"2NNrrEe4sJW]mYrk91\5@Mo.1\H=NmBV?]F1E"11RHA@i<I!O*gAH!m%-Hf4^90tiInmE6%0a-<o!R'*bY$le"IU3n&.FsfoI/B.PSEd;/(KV'1sc]YL?a0O7V3od8c]k47.h/!spmeOru46`8l4A,i^1D0.:0B+OR/#g]4;j1*5Y%I!Y#rPA^6;;X^%rGMf78.CA,1FP0Ic&63p,pqs[(3-\Kkd+L*TP+%)Eshs\*'bq*^8T1L"cXFoRu_LSjZ5+fZ._rco=;9'AUm$mSD)U/&kK3\`pW!J&GJ&9$(h)ELu\FYLNh\!V5a/]Oj/=)[#/:mbX:%&bdNs]QQA;[[S_.H[UKtB(%fq-ZPWcLkV;&]5XAilkd'MZhSohrU/.">3Y'M<#0;P<\dBmW.o#P:80:2=Oaj[=bj=r-'+EsfbHq>29jn1>LZc-,%0sgL4MZCO2AFkV2)Z]b*^o$WFjo"+$XG9-Z%,W67n"`7I_^:6?eH%=;pV8=gh2f%3.[Y)Tq[Th<m%lD>k+oV>`L9g;ar/);'5u4(,nFg?HX20FENH]`HHppXV-'RbVZ[DR2ilB=`AY'dZZ/>)Nt)Vtpkr]U!X6)!>>%#EU?\8*k)+cDq`3nQLtum7WZA=t@b?-B@*BST[D<Ku_qRTjMaskUW-G^(P8KADh^8=Vg:b-6o8;%Cm3r7.h]DoSMj7atZ37EGFkT@H;qU[n\DkC-j>Z'/f\\oR-L/Wg"\(XFJrI]O1o(RI7hVM0;BJ:#8r%T0S]e/B^$BQb#n#T?e>@>unT&dK38N@il&4G1>#0:>d6-d'bEeWQlA5MYc7das&otM?h9-M4q;=3F!>j"Kg1_aN*S?Ien58N$rP5UZL%g`A"&</]'JYgf033()_?-*"PBTD?R\u6nq[\&+\oQI[;2:2u?s7G2UYVH(Qle:7139**&&hH+-Ru<F;J+a9=(Hcc]cR$-n;`3!;8:5f3hmDMt'_isu%tD^P[5XiG$,5em$T1+pA@bB"fR\b>Hg;76ZU.'qV\08:QK#P](A:7Q$Z7VgdC8]Bfee]Y_*kJIIY@mSK=\cg,:F'+u-D1kpRe*;;PrO+jl:i":TCBg>5]b\M?cucl2SIcor'o_^_O+)m\15<K2,=HDY`qa]h[-;Q[jO<='4!#S_XuWZ<M<1e[7p.98riA_giG5\]ACI/B"e1&>m/Kc`g[\0kIkDHAoi1XVC";<DfMGjra4\j<]kRWToO"EShN"qeI&-[=\T)4^\7'YJ'"c3&nMZOqj5XShHZ7-lipsae-5A[R<nX%"G&/7ha$+Gg=c!6/A`q.RF;8_&cZ)FQ_)AZW<.VrmfO]F=9V>\W4;Mp;L#Y3F#4bL%!P0GTF3-HYGnSsEkGK4/bt477Ao2g"!#%g[@!J[<m]</,o8H&ERUjgTiuOEJE<$FdmA7T1TF[#[GM(=2S62)GI/\P+N\oitLgU`#$brTe]^`q%OJke&&,2XIU!O4?(ARB66i[%j^u')JU0Y$"*hkpmK8t?u"lLDQ:AO'L!*^/+g_2+ZX"F&P5oi4=:/?r8!)D%SABTk/cFul8I*IG<hPqdo4UQ=9o8CKFqR*>[*Jsrd@@u1K!Z2aRYSC]gH3J,<Q1njiQ.QYIrdfcP9fbg6?LoC8.0L#%pI[0u5uJ`r!o>R!#[_AlbE@Y.[gGQOY=<rN$+H?e)d#uI^8a6Q5?.F\jT~>
+endstream
+endobj
+612 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 611 0 R
+>>
+endobj
+613 0 obj
+<< /Length 2190 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0D=`<%S&:Vs/&G"6`La>p-Z:TqNBt!F&aJRer./G(0ZqXMc</F5;J%qbri_ZMBUtZYU+jr.dcLK-fk@/c,H@#)ZJ7qUNqu%Z,F]7m'W4SMY#4Oc!AtXKS6+,C^T*H/Q\I%=YUaCHih-rq<_7iE5h.\9n)7J];l!28_6QSPG#]Am+JrQfBG[Ys1BZQ#7'H5ATCXj4ZIGH+$FKKsO3aGW)B.9`-kP$tocC\lZ[HY:(LDTfum0X?GUZE=A>g3QYBbH\YS^#i>dJ4W;n*?S$YnXRhWZn>;DWCQ(ms"D8Q02;dkrd)IDn?EQD$A8Yol-t9OV_.a6K`kJ[q_3ki`1:'AidU`LeaOW'@3b:N\&WnMbehm)BIr/8?;HBB*UI(Z07X&LR*0B/TB?H3uD@]4A/>Y6Ye`BmfVD!g;$fl$"rfdN%;@JJLtY>>L/$'h2_)D$CY(7UBt;4;QT(/>3?2T(-C,,T<>BSI_6@VR%C.`ff(r.)jte)'oP%E&fPhG$+<SF4"JVJ'>q>l]@4Bmk]+$hl;3IB8dbaWm#LV$=@E==[7U\"=1WRlJu.\6s*f3R1f*<Rd"!e)aCOOU7&0Uo1g8B,#GMU0Bsd%_q5A+\<(dj,.P3WTa:%)ZWtM5\N%0hGS%UN`b,Z__F'UJJAh!FARYgK+RU]:"BJcW@3ZrJ4WN7sE2N>kb>2u).NYZ]IL`iG2`bgr>,;qPm.6*O]qno%6i.ap60K55jB5$ud`Hm1^:\*_b#%^KWH'Ik)r$sJNHW$O<UnOmpY99l2ZB/O#L<q'Skq1)Y]t*),n;Bg^X<H?b%rmC7i1DNb[/=6%CiRHjONH-qQ>OXs;=RY@"+&1rLRim..B*P"Qgos9,NDT1[ka"RCbSFq>gTF0Oa4l"c((&E'&D1+a%CKJBF#H5W];CqWg&Rlnabf!-Rq9D&a"aaJ",\[riat)j@hN/MQ[\p$\nD%L@`\#KR4I11Q`^[PfG"7#e<<j#FrT_Rg8fB<$_a'F5\e[Ir:oB0$Y1-q0&s6*.?Qd7(8Q1FNIV,T*@U6oo&AND@729jCcE969e8Q5#7,TLS3j31eKa(QPg9i25FG_JB>tH(K]]h23PNVKlbEsbG?[9R7WRH;c0g2,DCWkLplLg%QE]!/Wgbmc3lP23#8&nc-pL<ZVk6Pb0GTUN^r_=KmK=<&fPEWHh?J=p)#9r1l[^#`$"LE[h;j/%8`$LLko(t5.<TW.hlu>V@b'#%HnN_Sfi1@<e'>44f6'<hQ9m2Q[3cAN$ar,:^&nVc+:FP),7^`[M7jY73Agf39//:Q]Ng_=o=`3%ST%TS<bbV!K&#CD'*/hL\R?pcbE'Y*hTc1$pMMAI0T!uP<XEXeRX"pp\aG&pG%l6O8[_'LatLLaY8Y&km^PW^d/,LH'TZF"`@.K;>ff6.cqBm$99C+),$V;`hLN$f/AR9cu*QK@\G;kpW>2!JYk@2i#S/s7)E4dh`4S$l$1KGfIbq*]2NY$k^0b^Bahs-D@3$l`S4EA<'!7YU#.A(nrC!r]]c%VLp&E-YARHQ>7e2Sppb=+9Y>:OA-!N6TR=]!kY\.8patSp@j?9S@"V)NG)h,#!SnGXmd%JZ0f`+T0<?kS"1LA]9ia/(HH/!Y%+Y8ATSHsrh`OQZ!@&e:80)m+5D&0$AMSs/"*$4fU^[q=C>3[dQZs5[-08cp'jjXd@<1ZZGbK$N!t"Fc7L@2h^cs]g"1;WSPLC<j?SDL=9=WL)+U$,bfS2Ei9iS\<f@p5p69R95C^?''h+fV!cnK!W]t1#3>b8>p>Wo'l!%WUP:?cfUmeEoL#rOI0q]V=<qV\H4KYWX'foF!).&Emp$!c:P5cf`Oj%,E6pPs,Sh/PJtJMPNbiU(,Gg[T,Rq(s3,B[Op;LoT.(0,>YpWSliY1DWqNL3U.E\\Aah`3j_Lr*_u)gD2gF(EnB4[N5tlb@m4<1f+`ml_,g=)BI`oKAf9Z!oaR`h/efNCRd5.8oDFuA]lK&cBXm(2S<41?R?h/G'!BH6W6.,pYe^!>OU^MIFt./f1!-I6g=NCH09A!l?Ae$]f\.T?2`T!mn!m]5NkJ+%E#?.]X`>7b.JCN!*7%ICeG;HUOVJ94P&p'@D2988l8YuR5J@t[2K>ei/r7iFfENHG-;/1&P,Rrq!A?+"Y]+LNgbo@&N)4>i`X"I;LQ*9Q:RTa4kH-`Y9Jc##9R]8;u~>
+endstream
+endobj
+614 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 613 0 R
+>>
+endobj
+615 0 obj
+<< /Length 2082 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GauHLD0)I1&H88._;rdF3f/e@KTPB^RANRDV9N;7A(o5`o`N%9bo?otE8os1<s"!W&IrMmqS?[TXB,3\>4&IPoaf@HKC9&l>)M4l"-3N<U6#Cb3Q)Tu'8L&T+=lX+c+tJ,V`T0.a?Piq78(]RqJr_U7h,R<X$drmlnnD^M%Hu5M,p,7,YbmH/slfZ1$gPCH"[Kj$X/W7BsgY9JsO0[^:\o94Uj=2.a;V#oeBS?ft1X`7mZ]XZKo]R:?9Lma7;Ie[(2+s9Qo.8VI@c&1.maU;">K7N1N:V@RD6cWIq&RT%MoL[bjc)P%N5GVo)]go;Kaii'*9(SSs.'(@rd:`3go<f3oT<4I#]<DI(bnRSr)'<cu]GFH_Km][$^i@9]dL16_Pqo4E\/"dHG&MbTM6H-,5h)Ld%?_KFoH632`+$7X&[1;A;a9jK48LgqbPkorf:C\]lI2aqi3CLbnb=VLK/A0"ARm(5A02'k`![I)$;\=miHchLZ`HGH5LU"UQ,Tc%UM$?A<PKp+2$;"?B3`:JN"`o*qgJ5?GdNL'NLi(1m7/d%38-!?gO"-S<<XCs'*T\L6fGJ8PaJH2^>J8AG455eO8;9S[`+rNCs_gk+c#"\P[d]ao1Mhn8C+tc?N-H0KkC2(TdmG'J'E,CC:VOhgk<R)De8XLi9&1'H2/99,@X)]6(IB2$%2$1:^Bb4%aWF-$qNj.M\]8i(aHN!HoW[tL@A<IXWf3no;l$@B6DMrJQf>6OpljXH2!Ffo9]nr%aM2\d=l.21R-iVY6dKrqB</03ucE,j.J^aI!X55C#7=Ln*a(TCKkVH_Uj4]%#EA@<\J,-_A2)05Q]QT)?4EXIn?:rNT=#&jZZ<YWoJr!CuBYpiF*'Rj:D,hi0q6leMNn0[UX2Eou@U1!-KB;IhiSjcEHaqO&%@NP-#S>OQa$ES*ds8<VptQ^Q*!h,%@srNg-HD!ELfF7=OD#;dH)bM`.3_^MWfacWrm"JkqZ2mt#RE/^c\ZoNAe;K=3Va86&9rG9d_HOu7XmgT`%D*&^+=21JJjTtq%5[o?oAoQ7Y'D5k=:IBE9RaM63KD13^7'm!CiZG*tcE+An1BVnh<?(LZ_/QScG.<c&]rbJA;cmd?aDJJq9umZ/3E1e2:iY6/#5N=j/.X#gp)nGqZ?],'=r07>:$o'%X<+\[qc^Fn,IkR2WUDZis<IRspPuV\r#e]".)_QX5[<o&SW_>piLL*3SZHPq1Am<:c&]Ei)3)NE>W(i*Gk\c?%7MKk`sal^A&MPUm%?I,FFfeBH">38thoANC`VOD(.QV5>MC7I`M'amjnc#%%/W,17k=XtjU1Qn_s+gLXp9-7q;@^5%7EEP/>op?_A-Be3<L-D'N)jX))?,+8!,Lq*uS%6#B75VSjL/mQ:^&7eO/O9Eo$Z?+N:/r5"Ch\R1uRE.&]'>RJb7tUi9aET*GHWZPU^rVarUCC/9.@=f'_ub.NMrJ[]rMCD3R.FFIE80>o_8S8<Gqjt>'7M5L!3[G(D.2;&IstBg2M2gf?\/5Sd;GdNfHT$5o/(SkN68->6='5!4EUMe<W1`c&"Nn+#]'flqVfnGo-+Q/4k6)$nn7+hd@8RArn`T?:ECIW'H+ZjZ3+74mSjq`;\i/'j!i0o=7m?GM#BgiMCmBSMr0?X:RW5G]]V]E5u_GfUVtp2L<R',Htg!3@RL393gP5t^IW(<NjN!>2a6ScWhm<=W$S(27/,ZLkItPm"tW@=JDLhu'HQ:-"3\.L!7RJ%ER+ZTNd,^E[%HWeY;o^:StkqMHXDg<cDH6WM--tQd+GHtkaO48;rq--&Y<s8U(B]grdiW^Cr;*Qf/a(>FhrgJSFM]EDtHq!09>2C?a!)/I7aCFp?GPFf;"+%[$8tl8;O2/[>-TdcGJ$3UEEXUEn@98oE[&jVn+DN,Kn[`c-B(keI:hW@U8liGsAX7&&<u!IC6<0ff&&V5c\hj/d&2#QX4%sWl,n^,nZ4_nXO)`oVb8B-:^79FOnC:Kpm0M,()YbhV`2pS1,#1#cYgtiYXd)'R_T&N"#9f7Z3lDiO;DdM8s!Mp#RZ*CAVFeA6"V=G.X@C#QFjI0j?U~>
+endstream
+endobj
+616 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 615 0 R
+/Annots 617 0 R
+>>
+endobj
+617 0 obj
+[
+618 0 R
+]
+endobj
+618 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 325.54 126.58 368.04 116.58 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 334 0 R
+/H /I
+>>
+endobj
+619 0 obj
+<< /Length 2743 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0F>BAQ-&q8H9i98/*N(&SI;5Zu5NU>Gf\Fk]DF3[J7#De$Y2S9b-/LeHK$]6,E,\XeQe)WqC(Q7+g\%CNAq.VjX?9=T1dq@BT4dp)SOeL%XYG(b=]^lP12`trFBOB)</<4G[UF^hg9h\&.3G5_?8f#eI%6rq;l1+]BrI5S1.IlfqbshMtUga-sP^/iT?F4Y75)@B+H9qs_/E1bB_3Qbn%a)don-tW^VCb#US=CIVP=L7@;eRT14MK3CX5*NP=gd&5k@1aY4C:d[]A65[H]mGEeUoE@#$K)?PYsDF1\dqfGnQl@"@XL<Z1]VZ=\]iq.$=l#)J"s(pm<8>:qGT[N=0C"BX>kTB4qlT^p/OPg7Pa6gk"!EYb_YoNfi9GTg_]X#nnT/5U"$L'qD(%-sI4!I^F1OMoJ'ITfm<Vm%I4FFMK::O:DSpSPNZnj=rY#%m"&UP`)lC.?A2SiS22p@a"a@b/rd4Bs$JSf%.,].<q#0d5n"17ha1JTq(D!=Uer[<C7Xi:PtYHY^Q"'r(']#.stq34cNZrUP%<0KNAC5K\oE@ct%hB@j$gAhtM'id)PLjoG4<DIs7U+2,T*<k-Ue<&epDq),A(08ldnXjNNW">`Ij;n!;epL`n2*;lTgcc7-0pn^T?9gG_(7]2/CR1fh0Spi`PDU(!.,2EJ8kcr$(11.#iLm?gZGZoW/bTLWR.%IJLdHZq?sFJO_3]'%N\GRC)+<l\i5Grsgh[AK0YU?"-HONi:VhnL8Ij)XgKbCHBqap4((mF/$;W70d%JEMG>I3`Mu(c'DkPm,4ug@c"Z1`sf5RD1GHL#Y?)j%ck*#0Ai`8WKREV@uKt64("c'Pb2(7//]YT,C_)#ZDX1FPJK%pq&q+Q/Ru&7qdm0(]snQHL5F$TiYLfjJl:lC0A.8g.,M$'^4PXSQVeo=&UI5cS'uo)J:=U7<_!J@M`J)c_;,$&*[5,:eO"6fGh8:HN)<bGOI`E5K^"'<i`BhUH_4(h7!hQSk\hBkL&&u9;-aF1LIJZ3BU"ETE$cP@oQZlr]U*l=g*R&$L*uH#g%3jdY7F]"7iU%aV_Hn/+&3T[KCh^-X.I-&lff'^%Qg30kN>VY^K0RN&j/sT7=Ph^A[.+ip7`4Cml=DgXGl8c#S(o"ZU^F?7UXXBKNW-S#d0;n[,Mf>1Mq%96^;[r?]_a(+C*Qd^=2CWgA)m(>R"EdL**%GofIAeJkF`,lUmB-%M4.."=<2q0Fgb<q^hEa3s-WB898_;aGcsiK&;q"l8Y^P958/=4FlhoL)g_7_Kg0.ZN371_$,QV46&;e!D06WV8(IjJTNdE4HOZ""ZW(js>"N/2#h?78f1n>(F)5(.]1pC:2PO3$"*8SK4o!XqS)gC^N"&5RBQJ'lM1:,_kkI3AKt/S4.q>UP?=]cQ/8T7`>o2d`PJ2ZZX$>c?.^g.[HA.Us26SVdR5cWRP%9YFDGT\'iV:8],5,"K:OZZr?T:\u.hSaCtD,RM_Nq<qV:TGFSs.c;G:UqO.R8dl<k>M"SlU6>taQ1I2RB'&d?@dTd4Up-dmQdlbj6!3)oX8Ib2i,Ao>_=Jqjh.N[fpEbN+Vr>"iW]J_qs-)&J_6)Asq@G]#fs6X9,Ts,&r_p%UU9k,-E1"e<pOC>HB?U%nIYY<+6X]aH9lWC<jgP.7DFOgGH4A-(SArp"-gME3K4Mt.f$klg9kBJAG@C@^S,h)_hjbFdCCFS.QiCiEN6K4K;C3imY9PTjV$ioPrPqo8qXK4s$+&Kl=PG2*AQ'VE'GZ6s'JEeLno/)Y/1!,.MdmpP)fPMV"]a]:]p-bSkDId*ULOnPE0q3RdI&jn`0S*=a<kZQL0('LJVEp+fE]L,b&&Q/L#;g;I*FusW=.Hg#1hGK#**r]aETg4YCRVB3"D>FM5%W+ZAGR[%..b`t']<P9lKFu(IsCI\0hpS*EDaKNqNH#j4*^!*7SJb4:NE%KMm"<I0PiQHl(17qCFJ%#&=4i/fB):AfO(19,`n'\9^aNjV&+*,,a-u54o?@=If8j%&mM+4TYbt&ClS%*E*PGBW=Q:7";^!JIAlN]PK`OoJJ-Tc71$niClj<TRj>'6;HCnr<*sLW$Js)r<p_Tb8r^_!PR0\UlC:m7UJ>lHJ!^CN,4V7`KpXe^b4chO!6--1\M.WlBVZM=#f8)BnZY/UCCJs56VuG[_$g#%LbT1t'B$O7#roW4<B;]:O%/\/]u8Q('Kb)[]*u<=.V'jV;;u=%@2PjIT9M(32[b6&hGk./b=16kP_2n%!o@2k\CPjo%1tU(3$;cN8kr$eRRjmJ35Q[HTcTK(<1eEW;CQeQ*0lX?&O1"na/&u<29$@F,8pBccH>c:"K5cOd49Q:QN@V?[$S,kJY'S>c^AXRilk;6`.aDOi6/RtoOKI.TARKdrX34ZD[TXOKk#[17oipiAr,L'WbZ`SPsb2#F)fB\kmJP/a>XF$"2-s&^(Fh_,i&lkKBN,&Y<tIE7lo0R#57JApBHe0e9jYM)&5gH-h\IVgG[c%-Vu<BXp$!onRX=Y92hB2V^.a#Mj81<]*,c&@gs4hr!soH(8AnQ-QEYhI:YfL*p4lA'oIN1X1pQ8)RcI]P+%0ors\s'dbHcjZl>*'Y-bQookIIu>[R7(=p!j><jD$2ih,'9ca6C%f?XCh=2<sYDs"cYo<H61(PnHVg&VCja)L?Kb7^[;E\+VQCI"!D4t)$XVBK@k$Ls:Ai*.L=HL=Yqlb,]c/GkE-rA]eo=3K!`'7i*O~>
+endstream
+endobj
+620 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 619 0 R
+/Annots 621 0 R
+>>
+endobj
+621 0 obj
+[
+622 0 R
+623 0 R
+624 0 R
+625 0 R
+]
+endobj
+622 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 320.85 324.069 366.41 314.069 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 474 0 R
+/H /I
+>>
+endobj
+623 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 470.85 132.097 493.35 122.097 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 318 0 R
+/H /I
+>>
+endobj
+624 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 512.79 132.097 535.29 122.097 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 324 0 R
+/H /I
+>>
+endobj
+625 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 143.1 89.097 195.6 79.097 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 118 0 R
+/H /I
+>>
+endobj
+626 0 obj
+<< /Length 2247 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0DD/\/e&H;*)+ll98+I5F/.nrpK8[Gd>QRm,8TM7Yt&oA#?6rfuAUq_@+aYo3gjESY$!en`9ah-`-H]HV1dD3862.GjJ2OY%JD)rf.$3,es=to-/^.s&mP\FK3Nb1k*W!t>f2L_&K1#oMYj1clpb6fk(/ro#RGV8&"k@d]>$'V.]QPDm*3u3[+kAhcrM&c$,U%V2"I2LHtS%<Bud*o@BWia1CD(p'r5ec)]Sm*9+^9-#0W,:GB4iR9s:m^A$ZDui.`DEdjUYe-VqXjT$,Y*>hO-\rZLjPi)5'i0,LhJVTZ+aIP>l#?^D:2J.rFWSVk`4i5lU0KC^iI[88jUE9q01+o*6<f"Eq$V+B.!ua(IcH($?g_=kME$dK4M06PCuh$F2/q`CjgYkp:RrL^:AMF3kphVjU12rliste;3_W5bV?Ac4AHr\GYV0t=*r.`Ol0VeSk:?lA^2uto*RIi4)!1L?#;<?2]l6Llp)c"`Gji#QIWfGiqT!Ymgg!o$n-]5_fJ,-4NXK,XF)s)0<0aNgJRCqG+Z^/)=,R=7gW;3N0"eYUZKL8kdNh-3PoF)8VN0HZ]m,)jNOq=G5\*K11$OA8dRQ%E,=&o,t2Ppc)^faoL_m(pjtZ5nu*34i^l8,1f7CWc1jD\EMOFa<mVI@K@O^+o/K1i*"Y@J?l?E3)"-E/3fB7q'g70O7DBWi:%b[QgsD>6=f.&Al2(/O6TH4]A9u@p-gW3Q*gX2>@\,@!K.(1[DM3-abg<mS.k$^M8Y=YE4RJ>2Sp0sfV+j(];[78m,Cuo;o<\l<>Vlf:=%\C`M<>]UhQr:NSg@6c&)dec[A\:^h6WsLNbROT?h/6-`%fI08UakS7m4AKN)gKp:BWrG#H"_XF/?>rf+\W]<Nmm>i!`(3=0-*c=<@S=UrOXXMqt$deio`Imt;&"5N]-\E+ou6>+nn0<BM&D^[SN=H:+*oc@h7lGk9PWPR/]#'U@VR#u4pbSWsE+<aH"p2F/'TQFo?61\5flf:P96-jnh#+pKVQ:=NlW$Qi:AQ41Zia$>gH)Pc6u)Ur.R]0g4JFp;`M1>"=BT/nF]KH[3dLadDjo1>B=@fJ4Li=:ME2[R\/`/k4m@Q@T8GblZ0UU`o>bet.m?*1*##-^cL(20Q$];hh8(a!%Y*6V2oM'a[3k(4=!LXM'OI]a].G+D1kfLh+4I:j6MA'?-sn.NnMbr<6.o3SepXTKFO?,%]q'\s$UkZZu75">$i?Hji2kRIr6mK>3-PjJS4Aq@rn+(-o$TJZ<.A#k2N4UnMGjtbeW5J<+1LBP3Sg[`_q\+eFJleNf1$@L#`&YjQrm['+H<GVn+Hbe=f/c._EeLGk57YC.3;\'lMn&FVgf5H;WDjHj':BJd\!uMJ!GhH8(agCTrcb\A`E\T-20S]<pD)p:VoO+6n[Vg\.D.Au"]B?&flaX1D?Dc!;/'G*UNQZ8K)e(k9dnn/H[0-_!-+u2=`gE(g9Ot,m\f-QG$rXj"'j<9bK."%l/bcl/GJLIg\6(;(en.m:7mZlqnD6*jlTo%Hmi]Nq;o-gETOa_.c&9\gbgKS`02SJk1u$K3\X3eXKC0DC5S'BE'0`^L.V@n'a2e&AhR2,GFg;)8jRj`e#)]PbVbRbQk6H#GZk%Ic5*^#frpooeq[<OKYQF@UicnHro-/)&Hf\e(k10"@ks9_0fS\6saDZgEZbj&Vs)NE>';@HEN4d%'0]56[a0^dUj+eYlo@l7WEXs3iVIi+[\W1bB&Do7MC(a]9W-a(6a-NQ#LB:AP#A[;R*5@o"))&$Bj!H+r$h_m$1d:euA.k?GB8L"P7cP.lD:#VWW=s>gZWmDS2nMac=sn:0?>UCL9\(+!UHa\Q*E]Z!V%]U/Sec;blIeM$?')O]E3\pEF\7ti#M.o884$^%U^&#%kJ^Af9P7gZ]uX>jS3>o&=fWliY34#`g*D@*fF1r(qs6<t-_@@P/EY(qY>I^9I.^Vl3,q6'V1JqKqa%E;X2_ac*4e8;>?(lf[p+"`pcb"giCh)g-Jub@5Bj6jFtLogi`aUG@QF3?:IR$DIE1]sNU>r<pFEY<=:XQ;:MXnI^E<AWm0t(!Zt)mA2/);/2>c]W!4hk'?eP*Xh(it]\(';81<g!GYN7NEIMKW24I9+t-R8_OLi:t4*eJ(20gsO:!*Nam_]1nSU!ilKf:!@<F'R_4#@,KRMGZX@hSpd:Zp>NeT?l77d?V,8d6EVUja4,[f,KT#fsZ7+2*\gsqYh9h59s/~>
+endstream
+endobj
+627 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 626 0 R
+/Annots 628 0 R
+>>
+endobj
+628 0 obj
+[
+629 0 R
+630 0 R
+]
+endobj
+629 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 330.04 714.0 375.6 704.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 498 0 R
+/H /I
+>>
+endobj
+630 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 92.0 645.109 147.0 635.109 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 316 0 R
+/H /I
+>>
+endobj
+631 0 obj
+<< /Length 2646 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm==``U]&q9SY@/4MAAb/)k;m(0-GVe#H-F)Z+<Q9<784__M75-j*nc&AA8;_5FJ7S,oK3\Q.3;Vt,6gKNHacD@D^J?Ct%=eC=#m9#5!\;\^c1OEuHso%/DM;7c[H5O!-U77o-HOMD:&"j3X/VU"o3Q+qU"tT.:=S_lQ1S;l[X"-OH[%1m45IE)1s:R:`N#341m$'8c*Flr?j=2ZBoB+ejk]ggb=tQ0=.?cR/e)="gZe>LfbPIUA%"7\Usq?r2LBB7EbF*5g>_;;L40j#N]1cVPcUfu;U:#%IO-'gmm_oueb_QaYFBjUb0%6R8%"QOeNol*cEN`Zdo9C5/Jc)=Q>W7-(V\#1hRU'V%dllVd:=6SdXpTfc/TUh=MKVr1I'6=TKg^]TNW`1"aX^m('bYAGV^=W=Rf:dlV2ftBp[<>-m%/0UK?A^7cWE]jf9qll_E1OJ&ciBp/\-(_/P[&<X$YsRa<N:e"TT?IYFuPX#Wq_qMrI\j>fS70Br6lTc'u;79M'0`sd+*2[IN?>1,h%MTG65DIE9&`hH9?]Ff_n_O7dq[LjDB@5LSpS#f@RJ;lX/Ls5hWaQ@8d>EAWg+*,`Pp0,`+9j3OO4uUaWpN.Cn=\A:3*1-<dL/rGn&?fdCgd8aTP2YkE`N!R62/('3$G"VLUef#[mQe.\?cJKjT<&f9m?$k>!L_D#:Z[k'V?#X=+_=Ohs+R!-R0G].-X/8CM(rZd/_@S0>P:`*$I*L=3f2G:[j_MF\lYtb>>"=bO)khG*ij0:\]1<na/mCEnm.(EK-d'4Odoq/6i1b(P-36#n5r$V`o=KWFfG(X1haY>b&jVp+$>P)]:Tt)pX:"#f/CdURL.\g`C^;S]oO4Xd=ggSKdaf(8Rejp38TK'D[?'8Wek3mM'nEp!\&5P8W)LW77Pus(/rj]X_-@$I'cUOD^O%1oC`.K?i#l@!iQ<4H40N#%=)35SSF;T^_U7C\j-2kk0l!DNZT\e,WV/B?)YrDeSdD"+YKa-/V;oT3t+`Id>@65_6^#WJOWUa0OpZ_,MNtjL*4:g\pRAV^@+tk`T-n%']^?8aV9RV\#<h4jEgf]%ESU0"NMr?$ED0rA<):EBr3n-0\XI"Nt2WZPn:`%`S77(*,Vts4=[4."X<-XMbRuQGh/1.Q)7`OF6bt9a+5O-d52*bOHU(n6FTU8"XZVec6]8#b44\78@Kql5i9&>IAfENWPX(&\q[#e_:eq,oo(YK5WS6<'`A7&V,EG8D',a\ZMN`c3tG+8PIUHA&WPTqbN<KZA'&mjSe2[,795<^3^oHqNru:Pdn&qfcjs,s:[*qj6tDHBI).hJ`:ZVk%'<$W#t+h7Y6'(/3r9pUP<k/(&K?QMp[]t.PQ\-r3_gq/4,ZoZVa_:-1Xg3qi)/skF(Lo`)O2%#IH'$aV)3[6?Z@RX[Ur843nTcMGu<f,0p,nef>=."`rG"q:QN9GW`TX(-=-JKj@BF9Lr?\6L,mVB!m)A$#SB%3?5$#2aao]s)!'cdOhjD9Y-9S`4]A4Kk2c1Bm,n+<JrUY,kjWrA*<U1^$$??"f`:bPV7FCcQe6#XFIUj]$K&FH:jtoA^koe7nPNDa'b)umWFB_Zn[T>Th@UW]$]a_JAr=4#l3Ym0Sr?/EQIX6404aPoRQ`5od4l^DS#5sh;83h/.*V3-#ttDeK/di#'Ep"&\\d-7b4^gB/jE.55[BR`P*k<!aRX9^HHc8%@/'OhP8#TOJC8?a;F`;`_8SnA2h?KTKVt=/gA_\C<V1a3ECklW;Yj`:^A&!X"Ac1D#UNsl4lu0V$56J[nQ"<$1aj?p)H?j>KdcS;[IsGK4$kK?+[!32j@Q;K$/HAu"rpUa;;_Kj=Wt2F^noEI@9OeK[[i:LcsE2Kg4Yfp(&=;!Y-gP+`rSJ-eE"gOh2Uf+ra3S&Yr1tQT'hNr:M2'emeb;)_NjG>+GoXel_fFNoFQ"Jg^8p1]V12O`!="4HfEeOV`U2-4RlXgjH'4oM'Lf[2F\4lq/+1(/N]?/84eu?U9-goO=G%7_s8L.m#njm1O+d0eIC+Fe/Gb/$L3`o-f(Gu@h9krM?8#b=f.Th/#4`N[_399(?8&eR-BW?[V90J^Zif_%atdhH]ldr*Pnb!HV$TY!q.&qi0k.i"2%$fBp-hJGmf`nch_Xk8!?f%ZSp!,^$6X#78WGV+0$s68IJng+>#SBi#pf@<(s-"@i3K7YDCgsHk"_"l&Du?[0F'kp7M)\0Wc+Z(Q\;=?tE&S>chfg<9bN\_CS43+'hrWP2IXZq%a$Ks'sIuY;iD5nGZ8!C%tIqaE%O)o5Tq,J&R1JF42X,CYH27Q(6t2rJ#AJrC5hE<q-a68!?_QI:,p_Jl[O>4PEk%8mEGrlkK/inA<'`HDL^:?(_4qP@4`9N+8a2E3HqAjD?nGOZ+M\*?`N67rZE-]qdWp`oJLASqm3/D+PLe_K`<MD/'KX2Ds5U^rMOj?DP"?"(_9.T?XE/`u>ZRlm6_+PmboOOXNHa++8_7XuCsFn;JXF6Sc78j?S6pjYh\9J#qpT!Z!^IE?cue&Ys*\eg'S<B=bahrhGqh,<k^?KAG!7bs6H(%4oru])ur?WhQ<2\=/N!^eeGR[B-A)PnS^RP5&fCAI!Z3p#S-+*THj,>5M`(3e(D)qu^!nI_P~>
+endstream
+endobj
+632 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 631 0 R
+/Annots 633 0 R
+>>
+endobj
+633 0 obj
+[
+634 0 R
+]
+endobj
+634 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 330.04 300.848 375.6 290.848 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 498 0 R
+/H /I
+>>
+endobj
+635 0 obj
+<< /Length 2365 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm=95iQE&AI=/#e=aZ,dQ9f*X]8KZ>$dbZAH2?BR6<tg*S;+/g\L,^Yb/"91,,SdpQ%GLns!KpjMb0hbR#p=2&*IVI`Ha-^M"sYmh*?fgb>D]?gmZ4#EhFnbj1U?5r'fhh]#Co%/YdcblNN^M6qQjk9.'A48h?a(i^goPm;52J3>q(tP-r=r)TekQRN`!bigsjp^QDT1URSW>M5sFrC0KZd%uEE3r-SOck$uihDSo*$,m^Ob0u*N9M]-V'$7oP\*$H9<-6o5.ie=MaG0cjBLTIk2Fk2U9*MX&#0<6jhB`+/3r%\l?rAJMSTk2jL)eu2pc:>=HZ15ULND,73jKGhC7D-eT"KL$9dsj7W.*g19VTO'rV:BO.)ks51-0lh+?H64%)iE,u8`l9Wg_"[bD)?D&."JEs'l!]QUd:FA3!>psrKbjV,a;)-(_)77X8'#VZ!!G%`pFga\pgk0^I%6r6,]8J(NRB,OG)P:$Li+]]q*3_NVD9V1AtUZDVe<9Uh2`RB.H2ESOpK]bsop)sqB,JAMPf4K_3noB'IlbkPgcNa@arEk&G6t*D9rXZ*_nGEQ`cCNSr*CEY5G4PCLqe<MVQ77J=dr-MpA'"`-qgN4i;7r06X\S%]deEZ/l#T8Im5mnip62P%O)E_CRT0pfY2+Z8bFa?^j/;cp4e:G)CssHAh5Lg1e+5Ydf=\3A$k#RQ*V2bXND8;#e<MOjPSA1ODi;Mn07YJ90fZXP1CEc%8\t`.!on[+-,HiISJo56,MI%m8cC&DG%CI>%c!Y1*PRPf*^4E#1WB1.;</BDnk<\_]jfG0ZH8`*;cMDP0Ag%D:NMQ5n3\;bjY9B@^]lG%G6p`rm@4k*91j?0"Ck9*&SPTY,YM#dE,&N/.7tao[E9?cN,+,&C$Ah+aUF[\gTCNn6?(t).VL+F`AMMG"Ekj:"i^)8!@:bHf_MHrH%=M8,hY_h0dLE=e5B=aE8AO3@;5=]/tk2XBK#3TlM7p$O/LfJR^7N?>BUu'L0,;kn_>gQ*%N-#qq]d--a84FrSjO0o,Ji=6P;=(2U5XO\cR"5*d1CA6V\0s5\Vfl,UC%$!()Z$@j4ZNOjYUu=ln?$IeRh/g"^dA28mWt`-4gc\0O9o\pd+aF4e")Vudte3e@i:#pjND)-/;Ma(6Q7VQu(45_KK_k;=ie,I:#0Sh"-59KIG&dA1^AlE&DFTo!S*C.I!H29R`h,a>5P)B,Xt]n0aZ6I9N_h:P`(ZfEs8;,Jt!l<,t4XAq/J/i6&28bXcK)%kQad'SI1pEn]NI;:?7$`<>)--4[Hg>BJ>$AuRg%mZ@*bT-t6(if1XfYQ"ag8Y-$ncs\7,q%m?-p@Q!p//BJ0&TCo=M]0/BP9PY=0VXs@,Khr,=#U>U0ZA.6f6esL#`?G#,kclJt4/e9i,ZMTi0(n.k7!&V5lBBH/r]JUKB,b>]"m-:CX*jYp358\!4%/O^^gX%bIlD$lDR*XbZsQX"tsn\^gN=N5E*J0O<<oAJAJ3B';>`.AT7V-3Y,5+D&mb$su[:Y-,P@7arK7),3Y]K2e2O!M"jcpJD`4qh/_#FBOq`$tpN`s"e\\[GY`:3fsLhW4Ru?@#3HnbKlO(9=^<sK'$om4rgJ\&+*!=BcS]bfUB,*=IWo@LB;aZ6Z&:@bf6>-O3"pTB0-Yd;^6[YdYq5<ZEo$0oAWMF=VDf/)@g`2f1gmX%/lO<0&HPZHsf$\i&a>?H\SFQ.3P0n;GSPLheIe6E%pLH5,YLcLY>Ttb)s#rFjbYlaOXSIh3Yhn:\@qYG&2,RSK2(OiV6#ROl-N9N$gh%-A(grZ_OW=/b>s!D1tE%*9f!U5l%2#KlRH<$)Y8kq/Lo3jF^pJDm#8E-DGf18%Gb6=F;91*3/5ZF=>[!mANQf-'daWcD%sccD>:4<0E$glB.mD5o61o<6E[FmVmJcq^,%`27^E4\\7k7ojZ5PeR2%I=%s.'N_hTV$[H.O/.Y,A'plli%Q.t1,hLnmg0S/j@=NV:Ci<f?ao/%FRI(,h'K_16POT.M's]mMNf5\J<'W?f^_[+<iT]udY,^S&luLkCE.^X6-&enQjXo$kI=oOW<hZAjA\]RTIh-3'TQ!'K+40n2K+82?Rks`QYs$A5di&-WoS!.n*%C-jM<0k12/X6#PdCNrR<2nV3;Qs::dEa;'7:1,@#.idh#1V=mOXs%8Ym\$n/0tW6dIFX%%i1fOAUpJpt,ftEX,FpH$WTemHubO<H72X1XU$RC5qc@Aqr'rbrG-s"11iPpV_4X:Nks3NZ"V;!o?=boB&u2Iq3Z&k1@-A*?8bMm%@ju/k\gj]+-p,iNQ0!2a>[jc:$TaAh$@BF"?@*5qDX,<Z7lAfPUN+O5[PG5@jNs_u~>
+endstream
+endobj
+636 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 635 0 R
+/Annots 637 0 R
+>>
+endobj
+637 0 obj
+[
+638 0 R
+639 0 R
+]
+endobj
+638 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 379.94 457.557 425.5 447.557 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 498 0 R
+/H /I
+>>
+endobj
+639 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 184.21 266.613 229.77 256.613 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 498 0 R
+/H /I
+>>
+endobj
+640 0 obj
+<< /Length 2593 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm=D/\/e&H88.@H>U8+I;[Q.r/(*:""2U]<697$u8)S&fhY5M^qYMfrs:1D`gXVisnEf^nSn3hK-`tF/NAG7uL#YAsnB6>A]DEg!,X:1Z?ZKKf4knAme`WCmE<FIeJ6^HoAGs1%cF+*p#aTbIf;K.S!T71X7n;`c>mT<Y5'_V<OEao(i.RQ$eBYQK9+.5WWAC:ep$a3Pr6^6TUAu53*Yog/.`D,rR?L--lrUo\oYi8j7\$%3E7.<kkY2q4Z\5[==f[NjKre*0$kLAK:[sJB:>Sb8nEd7sS.@P1(t.1pm,f]RG@6Z2:to`"\]aZ7)\]m(7Va\+8e]ip'uq0a/)rSa:NV&d6j[?',6;--L2e(ql]`hT3PNBi*Abm^^$mIk!1IKYl*;Pk&[Op:eM[MXkjjCXh$iI*MF#:1.:kE'6$Gj&Z.Y.-PMlS;@?,5VJ!7S\R@F.NApU[#14D*8e$A^>eD;f/`W!^`FXtr])OSYi0U3-FV`?nsOs1i4.+:5JR6pHnq#spTXgui1l)%XMhmOBq#.Cj9,1Kc+e57X7GRt!sK!WJZM2QWtO.pkY3$-QGkC!*50&CZ=p:-`3O\W+RdZ$,KUdI-2aeHD5'd^LF)13\Z"ID*K*c9e!#mpI3RLIgXsqb2rV+LndmuO<@2`--X!Oi__c^&#!-m7&Ci(aiXK<f<D_c895G`!+<lr<9WZf8_`Ei#-[jBSDf$&G6W_P!AZKL'Lpme>6sSK_TmW+q[l"*\*,T+.d7f<2g(;Q88M+,8fK=Z:DeOhJ.qs!Y1WkL)Ipmc<.eJSKI<ZS20a&!^W?D'nQ[83uo[jT#8tCggaMD<8>rdc@IeVUtH-!rG\f=7%V`P7U%nm"ND.p78Hg("C]AKcpc4;o+UC;NH$JZGn)gl+`CK_7"j5ZNBB4NJZQXg2KU55Q`jFY$BaCfqJ%nn\O%.hg"/AG7QKhmNPYYWJKpKj\K7.:n3efndS..L#<JO<oT)GtZJ'c&s#dhQe9NQ6,\=Odl**`;oa*QO,F*:cYkL^o_f.P^r8h1T_;9FrTlAG)NNdB.u<P3d0Dk*s#hQ\YJe&Ql$SJWtF<M'5dugTks]OIe\8dJ%.TWH,B4atk@(N9Q'F,e'j!_3*7ne",U>AM=31;HKT`a?YQ'Tlb:&[uhOH^0uWoc`@:T1`**T3$5#T?Fm4ZPmt>H#RnR>qUsQb/e?R7/lkL"O%^d?/[4K:s7Q)!)2P,NF+#hI&PIA;gS#53Z\$KR8&$/EZ>(2n1<j@YnANPqE2F0+Xq_f!19BXuAh.p^drRYqoT6&3qKA`2rSfRP@:P_.=QOd^A$t7e'p<,ei%L`a&QL;4(,5#4KC;jA:CH*EKA^G)6%X*i<o1I$jJR%WrVaFWnf\)f];PShKV@@MaD]nB+WY4GrJ]<1:1tQh*WWEQBfOSu;J5IiQL2S-r5JmUKRgDL?&-\,2pb:t0n24"ddY*`hqf"e`(ff:+&m9[EL$\H.r\[#D)Rcb*d8;YXY0.;b^afAGY"$jjdTpVMN[Os`tdLUQcFC]@,*LSBXjei%Gr?M%hF8]l'=EH9"PXZnI"p376goIf[S)Sa=,)L(g'Qdaq)%bm`hdg]af"Fh')V=5"u2q4]golQmPs])S\BuJ,RFPnOSc'$UIg,\;h9QnXS!C><(Cm+h@b9HX"kAfp;6cl!cA,.-M@gUqh8\BU<CdK0;\38`>XhBB+5NW.+Wj&:G_4SZe@hQ,:t5ZKn"R%"8I;5Nhhoc/rTF:)O9HZ8`NWROMFe+>FgDO8`T!C:1D7!"(Xi9h4&$HRb`AY%u\GiqM-U"oC^07_l0KL\Vt%;B+mIT+?/0FBpT[V7>^,7b-"FmaANa8"*a#`KEZi!jGt>Qlml4>OULL8lJgf+S,+n\/5E+Y&M#q#?kW;D+dg"`#ksOE8S*DJjS(hEb_L>\h'k48OE-cfEa>!^Y"oS\,b?J41a<ujD^DR;l.m%'T2\kFS4`\PpHcGA/qqr/PCg==q)C3^1;15AumEk@G+':7P=,Y)CVe,:_9C:$qb7ShG$doYd92'N%,j2VY,D4<>)?)E+-hn%EfSYPq5,pUb&QGRkr&t=cgCFZj,D[e:os6OR%68;4]$i'');$q6i")q/DB6JJWDR5EHTZdl"/:"?gB$9d-7RVs4Ho(pW7.]u^%^dg9$sWK2<_J(*j*C[O96qsP+)2WFphql*!k:fQjr!Ep59-lCt?q#P@eV.2Qhr<p20LshPf>kdqYrUMXUY_Y1uNh+;<AY!:P6p;>GfYSNW%<Wc9oGn,Di:"M(Vi'Q?JLPl_iJXUk``T&_NOUGP]N!rLhjr?.d6hkC>rf"Za,54uTd-$9"H&@!SnRUK[@]70#S(7'd'/ugXM)a.5Eh\!)A8%d!ae15Z\.tHBJNA2aI;`)=lW*ohc6K3Gm[P<,e>lN*F=guq$JHD"]8'%F$Yh;Jm,&WC=)mq])mb+(l,dRMKcVZZmTSrV%)ZtS$>^=JM/uspAsOLNEk\%ee4RU^ijN=S3?b5Y+ZtO7_l&YnnXL>]c^15NA]@M\#e/bo;X?UgI8Ap$OgAD++EoPI(LLiN4-D$-u\ESG2P<crr,<'O?Nnm=9&%BX5na22[mgL~>
+endstream
+endobj
+641 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 640 0 R
+>>
+endobj
+642 0 obj
+<< /Length 2780 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GauHND0)1+&H:NniTZ];1CXR+KDCm-0@RQ!9."Y]F49c6%)UR0,>JNVq=c7qNHRV):9JZ%R>eC:g3r\^fbM7S?Mnh,Rs;*r:);LjGHuPR9jIAS9k%IX(V,[g7?b]&o(D\;S&p@KC[QRuF2-'<E_W@Dg@74"oqe<]SV*P;!?\-6+q^&1`kft`e"6qMOk1cXO7&B?o,;F3^ac-2"YU$(P3.i%lRLj>"`fnsciPb\n3!TT(?jfWSPo@>AFTm/.?).SUl;Mt94h-IE+==dnG8"Y=j@ZUnA[2#&C!sR6-t*r>!W_jSF7rfmRb]cZB@QWV(>JO!@<hU2`,)R.J[(D1[o,a-3<+!Sq="#WSYMT;RdfKSfrVT@/F\ur@;$7@Ke#bR1[4gkQ'[J.X$D88IJ$Q[oh6Q+?N\Lmm#]ZGR$?$n1@;4nQBF)[>hh$+I"W6N-?([2s062`^9d2AAH@F$bh7>r=0mcnTIaP!7ku?JX(6_(,*2qht2A5Oh7>s$_?><jkm`s@M[(U2P=qGnI5a-IYSK6.^gg?$KU:ahaO7Pja`iK&qoYH-_WCF$fC9'qnsWr3)PmPadO`$IM+JG-2.5u??!HL"ViN-4IS-hN?qu`O<c+blql5DWE_-bf`S+7pP[#8=Jg^RY#\`*kZ5*%g\?j2+'%ZfpqUWD$DR*>K(,Ld^8fC@ZDra(aqT#Hm68-l3@GLc8LS\62DQq?!"D5AGYO`oK+dG/#Z,;/dRK6?.'ko$5ZuMM.gf=YCo2K'oYHmkHI]Pbg:YrRJ<t9^AA:sWb$/Cm<=:&P8ce)@_ThUK;K4FMr?\FNenk9"!6T]GJV"$GR"2E,3D$0_QF->g]-X7tL%O8b`sS7E"r4TZ-F./B.^1W);PkX?_KD5T(c<mkrf(<PQkUZbQY<?DY>\sR@`0qJjO%d"Mh`AFg+V(*`:KK^2*J)^m8jd,-O>?Jl.Ch4?S+!RpIcW0KM'Nia6BUA"3l8!kYp+'UU],fZ%ftjPq"_)%7`bGE26C/1h24KpEa+//V@MQ>KK@'WFW6qWC9b^K2iO%8FtLAGj<sm&eud8Y^!EBCi"So4^:=(p153lLGD!QQpO'G*u(oMJb=@$I=ar!CpFOF/W;cIkKs2n[Z>oEIK!V5"8%i/m\q)C5#oE'ddHQCgcl)-:)$2gpRc6a^\W?LpCMjp?Oqb8RC\MH=1h^DeQ)cnLQU/fG2Y?rlIPphCgatkdnF;N(rCrZQFh!^pYu2GGE@K[I:l.k:H\ie_%EP#%F0Hf9M'>\5jt@2K=n-ub^#6LB@qF3VJn&N?:k[]lL]iU7Rh4l5\'D=4>uV..4o7r!k5I95[:"SlsJnjGGeWB91[OGd,hm_^Fg/5;6EW$V*$A4ft_L(*#J/PDua+T=(t8]WOF+qU"k,%e3gXAl@5`*81?@#hK)7[_FsBVTf3'W?fQ/r'^2bIXD"R9OiWCT8rsJnHp\t6hLuY++#Vcfd0r"Z4cNB/2M9!`(0>QlCaW[G2+`_M#^I,g>kNlqS3@Tu93KjgF5COg^"0&3.=p7qXoej8L2IBi!T1s%p`:#)gntE#W*-@iN`BVTXu@YFLa^&g#tKaVo87'Djp*1D\@h.V):_%3CpY"j&__A>XqukWM-*J54f4*G\cLCClg=A1+*unTmU88>SOPC_`4)N8l]tSJ+qN14(-)^7c<$W%)s<a?koAi4i,L#Fe+=o$T.9[L\m@m2p37I3$VG*)G]@/dO1.0%`sIbJHVWLQmClrYeEW9rM23`:_KfQ;WbmF>T8>e=:dST^2bH:hE$WH'n'>:!VO^="^YGr:"Yl<f5R.P/6OL(A10HsraZ6Sr[Nk,dP$A;!4(\3I1"1_6]48`*g43'<CQrM;AV(^;e6`k.+#(Qf$3Q7#P[t`OB,:oPif&<^TVSul11Z:BEL?0>/Lr[S`ToEP.qURHW\?Alli#MliaQar5[4RU#dK'd=]Te@!MqPJJYiH[K%g(eKSsHV!gY@9+MF0Bq/s@o61$Cm!OEosQl4V]k7/NVC#P<:_K`$pp8TE+^7WRN?Iik6.NhFVr._?nOI:hA)2.sCX6?g2CEm]6cVs4QWku+%o>NrAfD>J?K@94EX;0NK,:<Nr*/r]C$M]To_F(WXQ.h/YcHMn$]!"e*o7<#2H53P^<Wcn%riF`n3%Q&06R5U\*eVN9,'G."I%J\L,=Dk8(n9d2<^VLb@AKS7N<nI8+4um>/#cQA"C"3$n72S0[!5Je7Lqj^.7u930;Q0&2^^G#(2AQXKEVU<q+9,.<aZC"NqUJcTT/s`_'![3LEqUtkBOB\Gtm67p9&mGEeMtn8he_mm!1XjX_JID'SKS>c4$9d&SE=\'2h1Y3&hjCKi0+tSdMbZ68B!,,`8,bCU4'ham0:HA?nUAN*pF0NXA]f<Yp*t:[jV/`2bB'e70l3'o-+9L4]kEK#=hG!0BFq!+E`t"ZW,0TfWdjiO:nmM>M78!piVf5&)&YB`dpJ@Qft:n:YAW.XZI"0^c<]IU^L8T!(H@V4q]5=q\N=d3'eYhUm#8NIF_e&CnRcPs8RH2@Q/'TDe'*d!eWFckEdS2qmitbPeu/!AW3TLgBV`87.g>W=1WKDus#WVa%0`m1pc-kD`UNehbr*e]"C'CB5IEDa0U@JPkm75Hs.gaiK=1H\90kBA^sPZg:KR&28H[(9+Gm4rt-g?=2q%K%Ok!M7gp%qG)F.B"-[Aj5ugqC)B7NlUI`lHj0J22SQ5mMNZQ2][0TSRE''94/ol`#WT\.#a0SmhrR@:He6jg!oMb$`c!4$&'*)LDi5G3!gg@an,~>
+endstream
+endobj
+643 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 642 0 R
+/Annots 644 0 R
+>>
+endobj
+644 0 obj
+[
+645 0 R
+]
+endobj
+645 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 330.04 356.137 375.6 346.137 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 498 0 R
+/H /I
+>>
+endobj
+646 0 obj
+<< /Length 2941 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!#^?#udN&q-BZiQ>(sQ!j(tB&9i8:!IS#c>4eu]6.np%l252C,"Y!R#M(D$F%chO>**9&%D*B0M&=@maJ(<r3CW-I[H0Yf5X<]br^.Ao$/2bqTg)a'7J2NIE1qLX53"*V+c0SP`X#;k[lS'hmeUjc^j4hU\N-(X#)?a:kIlT4gek$\RHF=T(/0s*l5/qJ';JdL%'>SnWkoUQ['0\@<@n2rq>7<O)IF4Rcga6[sT]a)!9Y[EYX(`<khK_(;]!`L"^R026VC?EIl<W3Nb+GAJU-`-/L_=EQ8UhaRa/jO)t*H*/gXL>KlA(!b^akof.$%)X$P[+9-%Eh+3q5:<#"!bJiS@)4Fj-X-a(9`"2,N<a.hRNkaUh.fgAQR_^nPAo@%M$N4_5N6gDQ<5BVm3K#jJjS(<'.n!.#[o7*lB(46Oet+ac(F%Og7&^'<EUTgK#.7NA8eT-4`$5P?>C\(:4ForffH.]$=RX1(_.;4-\q=qV1#p/'O<ib5iEj;1R0cI*#j'!CTR>bPGFmnS#KVf[Po2i_cs_b7/;_T?3=sUrf5WGhg4BV/ak)tKDF1m,A&3+WO49D`=6hK-e_\/n#7L?%7.$^q.$@hH7B!:%8cUS_D3m7OUg6l7"ENmUD]/,.s&V"G](tpl.u]#@8Al'V8O],n]C=$sGlnSF30n!2hqqs'[5Y?QFg%,YP1Db'B3\YGMo@CZX9]IfSg=eohXTD?II-#EQ5%ukdX]qif&1+kfFYr+,cam;E](Q\e29E.(0Rf4N="%$/7,b#:h$T"`\?+Kco8N$<bRVXL"ec[kpNIW<%9%(,>A*DJSA5^Tp=Zm1"fT!IemW79-DY+euiK`ojC/m=lSCJ6R#s(>O@"sDRELZqL-mB$G-02"A!1HMD$H&I,E^%jIY;ls)UdVnO,^BOc84MCQoG7(.13T,Dg.r"(F%s*TgTLIsLsJ(A7qe,t.?R9jC@)?uF4X#.ZH2GLPBFM%pJ0WD7.e,1<=E&WL_3eSB5%a*4u\m_[_"!]@[^)Zr&P#ZgpLe;d/6a\"3LjDNb,flCe(`]YR"U*NN[=LqpY0eP3j8Wji$ppQ\$/G\Ip-U!rVHW%IsMkUZ2pqA%7S"falA];(=OWNb$glEVQA1+.<Ks\qVPcM)E=eR:R'Rg7Z(*N/V_Smid9Zc]o![,ABgLk*NQpI%4EV;]\Qs*[2gk'sT<;M&+k!,4K^>.-4(WIahD@,4R*#.8_NAF8;*`ETcZ@uO$hIY_d*1:G#&0$ZADQM=p7&e7i0TGCgc-EC(4kR8>D6'(l-D4saR&f0Lr"c?aWfH&6h9n!j"VI1hl7U1m]X#"uUQL-aa[N@'*NTo&jE.ijH-.gnFS(4e'b<]mO\VN%F+/MEI*m*!XqrWYU[2Q6)U"U'S04K"4ghh;mWbXLRL\#hSN4%-X*3'SGbkDB/n%$(KNu$:^&j>i+CE;3C`s,i'C[P?K4J)!:(/6WS&'51;J5?Q!+:K8g1%$Q%Q8(JX/b(>=e@m]E3OGF',u&6)q:K7nMMX#UGeVH/n35QI*\.riQffh;I[b_M6q-:l*k-(1<uMq:ho.$VdF-e;FdO"cV-'=E^4GPD,b5]!>Ic6kYicS2A`?_cj!:H-L(5kT0@Z%o'mdX7dZ&s]*tmudf8-ccEL;(b"TI(Q8><9)9cT&T36]19VnW:Fj,?dA(hB,9m'QV1Ssk!<G#'2p?R!Ci7c#O*RW$nf];H':JWd=P\HSV6_6[s1"Ta\3QOnI7q=P%.qgB[KO[H4L;Bc1c%reP9RTIM!uTS>9fVGe7""Jt:VYqUrjmqs[$CaY1i\:]njG3pjJF*EQqou4l(Q]e<EDa?CG0LKVWm0'C=6nh=<3Gd'*1M\CH4I%'WQk\mM7krZRjt.9iguZ5j[b-/;l7kp(LgE(*JnURG83dj!)15%%H=d)!Z1uTj2\M@fn&1W7:i7P!3;s?t1Ee9U;@5IN9c8Ye9!\GZ`<dp]cT3O_;,R:=gFgbc[qu<[A/9&EqWF#-<4!Lt70la,Eu]'AVj::c88J>T_GYmmX=rc')V:aJhr"PbuJ/;L2H9b])Lqc9:7a%23`DR;lD\IV^$DVC?0/'1s1!F[ITo\Y7]7Vm\D<fjoj,4_Um9fC+!b'6RT!+PW4O@^mT#[e1N#mqW!(.^Gl%aTh-QT+>co\MGEb!Bk&^Ok0%.8O6jQ)giF+^c96^k%mE19]Sqs;B`5hku$5f5l9L7PpF"\M0pVcDJNG?UAfjVd3Rtu\H+,ie<hBdBHecaYIE%tB7fhT1ELT,SZ5R<q:b.OSJ1\#=Na*0<IV9A,l*;_Ts*;&SW)a4YqGL)!9&e&oAq>jDKf9=krI)/%UB!ci5(r7rr*$&l]&.PUX[+J6`#]rLI\js"Q_InLq&PF_>h!lK8kK,(0D1+0F\%V<J4r@X0kB/^XVch^,,M]c'LI;Yo:C,+fX\3<`?2iTG#)n/pqKh)uX.9GdF5&>qQST`Put%SZJ;"Uc4*VE\nRo_S'=,%/b;0iPJbso]9K[6f`JuB]VB%U,qmQ)a/H22ZURc;,ub+X*giW2J-UJ>;Xg::2T>rf?08\io'2M!6aDgRYNYA;NEnJWtKOM*0N]dInKmZh3tmlSMsA5Q1t>H_13Qjr,)(B1;adXqH/sb<W0lHg8MQMT!sJ+ASVkcqMjL.D%(\XM6Npn_fO)`fi4:K*aR@Ka+l`^DGU9fFHFZZ2W(FYP>:S!\Ok1;170pDcs2Lf>^_CKq@@ML:N?"ANSMk^YpBr*?61n)hGl+RiMt4k2:i-Ufj!/VGcQdg`l`]iD/a6Z.a=WCj<fjX?X@nY&Sp0$YG4L^\J&12N,A/RQ!+#RhupmT6W<A7c&8pD>O!`bT4gFs^r>u;APh7ZX[n8,/ouMdL5C([DfIb:.e9)O18;8I1e>eT&#9@q'!WthB38^rr)Ps<nJCjs?iOLe=C&F<U["JHYQ&D2mVe.afNe~>
+endstream
+endobj
+647 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 646 0 R
+/Annots 648 0 R
+>>
+endobj
+648 0 obj
+[
+649 0 R
+650 0 R
+]
+endobj
+649 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 156.99 419.109 201.99 409.109 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 35 0 R
+/H /I
+>>
+endobj
+650 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 432.21 112.218 477.77 102.218 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 474 0 R
+/H /I
+>>
+endobj
+651 0 obj
+<< /Length 2505 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GauHM95iQE&AJ$C(jfru1pSCmfgC<IO/>A"A.rU67G@nr;)&YS<(SN60)OCiHIs.YU`WlMOc-#s6d@XJHo%Q_bXRdhGAN\%3M%NAF8S#'`hrO;`h=uuq5/(4rcj`g^E7l.i;@hI@_;<k,LeqI1ehsh&dnV4GlLI00j?D2Q8jBKIk;JHJ&uXfa,DZB!N%03_(k'uacX6/C(i!E1"-uu<>8leP:Gt7S_`*#I6@KhSpco%n3V&Q!lMc&Z$nq%bJX:[J"'s(H77P,0B0RBZsjX(JTmF=R%P(iYAc9(A\&?$c5QZICf0`3E.dM>jGuni!dBXDmg!jr'[#IL,7K-tO'($<;'u)^["1?a.0uumn#T%db"F$!^9^:=NYgoI:hD*\]$p>f:LFEg36)H(!.+c$Mc,/u&o=l9+41:XQ\#:RRmIX0f+;%AWL'Er+B#QJQk`:SY;QF>CpRsNp>ZDtO2bDs/4!XaOd%t<-+&]GL:1Ks^oSfKn+MHDNlrNbZ7+u$dmaDEU.PFt*('c0GL%qF04l$cc0UJ4c4lS4+Xp@'Ooh_a[0@$%]TTB15(I:bjiO>`[]Ho2XR,bB4`b?tT$nSdNPKLe"kRQAg^?/D^u?5klaV$@qmn"hcj^u4p;>-K6#fS/FL5.n8L5_gge$#`ABeB%3LQdI=.^,!4`o?_igpp>'#;.2E't<O!G;b5.1r#4Pa&@dO6Z5K;h`TkVEI8SBu+UH@ou8er8Y<eGQLloMZer_&&'T':$O5UX>(;=#`]A=&i)i?bT-+VXBDAG<"uH`8%!!XA12@e$']6"5im7$l)R^^?'-<2?O,Tf'aBKVU8KI?B<6:aCr%fS+gm[;\gl6A3sm/n!=D"YiJRs[3GHrHj*ie[8/4;j5F5K8+,s$j,S>_PH9Qi/OJF3C8E)W\:RElZ?sfA?pgj64R7Z$pMicP;fgO$j_]COH>70L?MupU;HBQ-FUo4UClMZ0!5T4S;f1aNp4^p$DdU@($,iq>p>Xi/d&F(P+-mSV3'?XWV!Da:!nE;nEk^_:h7f0Q9EuMg]Z-TL[m81:r/ITs)6F8BhZM4T[rXWc_1luoc;f%QZ$?U[17jk.\'BHdT*=k1AWGR?'UHNfAe0/`k+SCS.N*o9D3Tesm-mI9&P>FHscm[GcEP3D7a-7!hE6Uroj*Vpp<hppUHBOOF5_mfS+bu%GKXfMZ!92)=D\+f%TSQ2LAG[I4'Tb=m&",b3Oo?1@*EKXM$-.3s>XGD+Tm7iN**n+Xh-:$@RVRa#[65#h6jK?Id8aKc&4)aPG!JWa3c?3AT65p*(fePK[-df+=BV;8Rq%h@SP-OXMIZ>gKj;?6pj+_8>(Uuqrd/OUWhc&u/jc9?;$MLgK)WotC`*(SL*N,t48)<8;JgUb#Z3!_0//8,%+,,H:E]NQj$;pb7nX-P9rF"RD]\2\+.%IjZEUU6^a?:/=$-(Y-l"Ii'eQIdG'DuU2,U7mB]jOgYtdHkQ3[IJbTfO_'K+mSH^^P!?kKALDG-jk5X\agVbSY^@T34%C%k[f&(fu`jh+"8c+^0D4XoV/c;/[Bcg#6a^Y-S9SDm4aOm4pZTM'<".Ao?P5_>%@K9te%)`>^8%)MokMCR6m*nV#89acr6?;'*d.p?j7&]?]!Pa&jrQm-*0/rC2nOH.U%BU:?-]^jVd]!`"EUf_gOaK)&.9Y0sI?DU^$YR@#pl5Bs#().UQTI3XI`Ge^ph*i.n-d4nY2h@,?ARKa#-LkkCpd,&n"2d</bU0e01IrY(mb>@CgWNB"cR8D'mHO!(8qhd9Jej.&]G.rVUl4V%0WV"em&-@TM)\_]0&6o,M?DCY(<*sh2Rk>:ChF;_Lh\LrCfleMo6/mp/"hL'9:K7(qb[O3i2G)]dE'ptR5g_bFgSOMMtYXX>^tJb07(\)qo+KeBVp`MgjRAD&lAJ7haQ7bB2!rN?!N[p4C"@/k`TkBs.V'&GE^-h\MUn>7RXT)57,/?/0ndnnef+YM_YCjko<?*ZgA)j$AGEO>2?DW\+`M$.j5mk:QgQDF#m/Xm&!I!IgV'lW0tL'8\?rW8XlkcU!pW^GmgLBo0GkOWT+!ACSg/qrj:S+qtG<8qtXjb`GG0^A/_.O=oS29rUb(Dq"7V40mkJ_Vqs\OSP2Dg%E8g;kG(73+(j>>0hjCT1u*Cf1*#P8n!5r7H./E(j-ZC^iCI#i)pS>9[``k><Qe/j_i;U?9W+KDg4j*]i,lNp[99WTM!j/%Ze=`a19:N;SQWuk>d#r17="^3T/`LRHN)DPI'];lhGXEA3BU_nWJi.gG[LTIXEr<d.9?&`I)h7$0W[.i-^G<4:J213lo&bV^>\s+]PY!]W2@Qu,Fc*QJVOg^E/hY9"`PLI(&4oNF>&WjFO-MpCk90s-GC97@G(PVFa&,^B<r7TJU"MK>>QF^++;&uo@(J.00r]iq-<$Eg=9J^7%q%q#tHSN,>c?>7TEW-N9+1dfKg?45E"VX@PQ5m)+2Y?f(*Y7CI`ff($u7YT0T)qpt>8u?[,O;i;~>
+endstream
+endobj
+652 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 651 0 R
+>>
+endobj
+653 0 obj
+<< /Length 2247 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GatU4968iG&AII3BQU40@t=d?F;&5K3c:+c)cr0Nl,5U/,\1o3LB<X)h*Z[=QS2c=JWf$H(BRe,/jAWNMoFGi8@btFPS/,O=H:o$rJ6J6pnqV+K/q+4M.%:^76LQqiY%%!0?-ph<T0j>GE6(CNYkH'Ai2:XT>,fcr`b=>@D3AL5>q%Ml%/@6%s-+gD7oWLcBr+Af$:X_\<S;I75Wc$*EfJ*eR]XfkpB*l`>%WbQEAS0-AFNeT6W.0q<@`IN7'TD?65u#R(?cJ;]r;<H-Ck=,Z<\jHgb'+Rr>3*bR57Xc7u+E:E,P0aB5<)Ao^0a@_j#Ra]Z&IP73jOQf?bmRMahO>]]&*8J$&hIc5tm$Z9=-R4uM_nq&5?^e"9-JLu%'+0[:,P9.4mo1QW;0B.Kj3gnW)YHb>P"dLHhaYX,oJ4<^]T+S&uXp`A)CsIJDi+jS5DDCuB;Mf0cC.#;6?b_XA]3M?R`)>Er@6-*2)D3b'0k]OYd@[2CMe4[pP6e5-/1$X28IOZT)^I#EP(>493r>);@=jrC6n@l2Us-JliU3Kb<K5F@WY(d[i&"SSeU4%f]*qgV5^Fhe'!Om3b2Z%jr-ko\<[aY)a;_Oe7LZV#q``9q1U1o*foRPUM4_f9od63!kr.kR7;*i%X#sa].8!C*!YNR2AZ84KQW\>c@dB#MD$D4H(Pes51bI_N.)+EZ'ELZR*c?SP1`Sik#;r>C_q&3lFbTPoQ"C\"XWp85)k@'sFc:!N^6/?(TJCYR3,QZl3,&u,fr5k]\>]YFihe<uU7ue1RAlL?Xc$rV4K"WViq/<De03u+DX@r7_gtNDc>s92Yb<+:k;\(X$L`lV6N]p73JLq%'!9D;P!9`jL8>Q`3DtH[K?q4b@9bgU<X]WOgiAu\.u'`26Zntd.k)/oNr>5WLI)+=g1k!X/#5*tQ=1Eg:BuMD[>AHS8$e'?3lKjGb*;2,(X?CoFf"hdOCkI[F6g?/]%\Wua3\h3Pln/PcNTF@/m3%Gm1P;Rg1##$7!UcjS9oOD8WQGuX/E:`82sM5jO;)s)O!A?7\\85@RGF"UL1tnrlX8?MgI<1o&\Aha=UL0ENPgd9:"@W,2s46jNA"%BPe$fI/Sl%/ek5mS9d$n5+IFCQM>/sm=\^20<]#/)aNb%$c:*F/1sfC)UPo6`_hni"g999Dn_`9FqdfS<(%m9/YT,VR-mL\jal`4=\j_CMR2F2\<NIub"JR6+k<^*2NXud?12APWBZh(#+)=hSHYkP7UE7PE<O75DT6tEBCHMLnnF\EB?;t\mc#qH=eNu2Fg[#>1X1*![KU$k"'ThJ^j&8VO>o;&fc`Q,%(M/%M`Zo!`DFIS$GNYZ8]#k@AKF?CG&O;]$eWl0%rpd:nfGZ4bA2"!)CNsJm%\;Ho<?[sppo2':gWB6/Q_E7%[p,rH7ahHL-]$hSVDtEDn"[k`8$+N6\tKc,Qd6tj#"s@!-Z.r>G2HWoqE/p\9hC]!Adon@@Tp*J\0qX*,)]Hgq[KT?Ui8FLnZ9(j7hem!Jd3eZnLS(W0^dJpVQsXP@AYOnYdW5jQ]s+DN9GjY?tXO<)cqliZZ2S+`q'<3_p9-%AAr\aZsc/f7$"la"4rWP0cEEA0gMXC)?mqmC>3T/-=,5i%OVDnl:RPgA82b&;<3e(8.>9!2fo(fn1o31lT>%H3_WOLh-_`$l[gd)(:TG$QW$l1Us/h\GGjZS^;Q!?q8$VG,9p^%+gZHCKI"diG!i+i8CN=/84X$JGue;.(tDJ98)7#;1oHd"LjJF>u14.m'\,$gD?d_d*(U_:(BHZ:DnJo/M^/AZSHb<^[pM"Q8^$A_4+X"[%n.%N.X#7h?PT@q*<eY*sjGK0unEXgP[8gOu*#?FY`_H$a8>L+A+rI$irsK%tJ]h\8U2X%a*d"QSX[+(PLA14mmSaAc)QF2Op5\(=De_*I'S3W[d!J33LD_"<+9JB]AXb*tHd5<3U=1Y:Om"Zu^7Ho1N<nWuEAY`(L<Cht6EeS,%i"4A)8#J:%]j+WH*=Q`k61T+7N_L.O#tBaD$8Ofa<g@@I@QDsnpM6O.l&>c+NNmCBh(]YHrRk;1;m]TWbo<L5E"MLKQ.-,G\VRN;[_G&N_[UdE@9E%/[3GRp"<<7hu9#M6+ER:#k=()SYUT:2^\ko+Q^-\&B_BT_Qta":pf(:\g/C>#<K>(@!F8K61*M_&A_]pW%<:;q3=&N$dbi,K1EJp[Lk8kLU<fi%,$[<I\u)0!Wq5/)ktKDtop@6u1~>
+endstream
+endobj
+654 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 653 0 R
+>>
+endobj
+655 0 obj
+<< /Length 3075 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm>>Ap%Q&q801)!0l3P)[!\0^P9i^"-e\N?`e5ePWsi%5^GE!'R4\49#!/J5'*22`&`#7>_N&\,*,iX%W'QmCS8qJ*#=K^"R)em+(NpZa/[WB,.uJ?"f"Z'<\e*lJ"moe'ljXlZZi7Y&6K(7m66rB[d^AeDFrf+1GU,<DOoXEh6J"`FVoFLHfL#IJNOuiT7d]U]S^I>4Yc?Zj$nf\_jEb]%ug84O>g<phR;9*QoL?Jl27=l&lo#Dcg@0V];;?iaBl698""D;T$?sAd)tA_64jF_]Rja3El8n"RD-qD*`\[.BOOiObWB5kint.?%Z5BO*K%o7-]c'!MrW'!GT>0p4D`9.01D7!Rd++Bh;0P2[QZ+_1@TA/Baubco>doJ-DVmC<VE6#,l<8_C$fSW;lp7F1J?Y!%8q)[$V!^&JHE1dX2I#iH<E)_P"(kW;29-3NKN>.k+f<-cd]V!Y.WlHV-].5=8*P?L@C"*J:'jV6r7VoH?:o55Ko^:tNYHnA'k+%M)]s'J`XH(+<i`JY/-0.n7c]H;:<e-HG_S"u":Cn`"mFVR"`hr*Qg`;+4C&7^/\XDf?XPr)RS%8MKAI3@1XrXc>1YF.4uLkS%!M^Ia+$4`@,t",Z"Q8:u;f-5eefK/>CRGY]!Se&ZR6R/O"r1Y\464&N4cM;;n\_t2s)2%o!)h9D3(35Jt^>ST"WaaaC1rGW*Wj%_Y+`0hPAW`au\LU^-h>:njC4`1_R1Ef=ba!c.O'<^C6qhY854m]'Co)Ej:*p,uD!1%P=_AWc2T1*CG%I4.Dfg)AJk^:,5=`,&c)gl1W3#[a6!4PW)MkOL_aokhhPI<lai;U4?0-@Cj%bhREFB;.M*I!r8VIp(nD@%4uA0Su@F4L)%=$`#`lk#G@bW$BX1ae=mT"-fdk:mCU.&bf,.k1X:9a$)]>X/mVL.>.K[+98Rml:`@:V8E:XI@$ANrVNi!&@S@HT53*,d(hb@t]t+?Od,+a\>'1:D9&!"HiebOKos'W3rtWcu]_AY-#L_$=^A]?I=JO=9bUp25Xt`V$;debaE5\/Ds,`Em;M$BdrE5E`YeEP!mXgfX4:`M-12foctbp]3Li+q0&R\P%(jg@m&#!>%<H:'==e[9Y&"::XG)=G[%$5ot/A>?ISq^'UM/WL!5-6OSN:i^V_[Tdi7B*:L&;!@CD1S$F9mHImTS%5KM?///%1?&sT(-@>/.H$W:/g=bi[`!ZMLU0UWd9LD8@k:pD`+<XL1o)FD-==V*^2J27CNs3=>!ADJLYeIHpRgdK^qa?UAE'LN?5it[?Us#$oK2#mf2!_ClHdWPa\[2]rW(1Ao(!hC;h_FYmpORD'\RZ7B0>>T1eqYDnL:Q`%i?[ht8Fc!IA<!/$H.o>@Zd)Rta/g=t#N1>KJLL^k$G[N%mXm.Ll>H>)9b7&e:F.?J6?dkg'3To*+/3ic+cKUoAPB1&iL4(c?oJWE)D)T9AQ_q!;AU/c"pJ(VpA7CrMYiZgcZ`K_OUbNc@!^q;X=J=(-11oMW[(tM5@-:nb4rgE"=j8la'/'b.1*fSjdXX#)Bo"eHL(:!%+G\Cl']0KUBUU`4^d5WR.d8/m!@sJCN1o!R\bg'_rbupG$WQ%7TGDK!GX<ab[%N,#ok<!<_+[JJU_U9W>9Fjr]\VZRg^5N$+&f`9bV*U.&<Z&"=q:)RCF/TGp^S\'pRH=1^q<$B`rZu@qNfJ_5!#&RbX91W3-Z[gCg^In)UtYdBX%(jKjA&dO&"6F-#9mYo\u7!DSQu;isjpV_BY=+G+l51rJ7c9C)e%O/R3CZ#Pi16ZmerT4qa1**2@%2;A`P/L:aT05T,dX)$(5Ug`^$4=AAS>!+J"s&GdW68k*PLHL(^0i`7luCY'8N@Ie&3#=-jpfolOB%,4AM!\<8tNUDb:NTY8kOfdP>Aufh[\3Znps-ZeaFBU"B</1/A9t6Ih9PDlBf:/X:_))`m.2:R<W`e.#7Zh+O4_X]a7%9j]r^Ho#F*$)I@d#3_CV)hb%FsPuWU#8(n)73h>-ED,9q8Ubh2Q@+PH!]V[D#GSbRUELC]lbD7a9TCpf#38:o,kik`'Wm1.`quo!G2#hLHSd<6.Yr5TE1"[$`3ng9PS+%\C.b+_qsOrXES."q;)RO$gL$9IA1&l#:WJCjJ'L(:B0f]khK:#lN!AL5EUdc4eXcGT^L:,:LO5-q&KF#bQ?G^uP/!IaE+?O?gt(Vt']4G%!2If^8*1@.:\97SG+\8P%5\h$aQ&]\$Q1q^(oM>0Ah@E%0U'CRns32:sl2d4A/TeS%?UYT:XW5.5La':I[T^<O=U*,Afb,YZ$Ge'N,R\87XB.JJB$%sA3$P$'G<".'I;bFb`&jK]1TcdZqN)DJ*9fNleL.OCAE_AuOE_=No[,At6Y5W>+FD_hX<M*U>d-$.&5I0?8,.F,B,U7eDUqj0f$9r3H%^+RJ1&3r\dB[bd=%"qWgDM]:6&RQA+6iNBV)!gH9lrpJK+=j";Y%b!&O)h,T@:oHC]EP.\1>C<j%:U$rEKU]C/Z`Id&]M)E%qYCrD&6cC1"_FaBVWutY5j!G3nN'%]XgA`AGgE3=JJ$F`VpH`X%:uJZ3DQr,iV$_g6tj5j)Jobi-6Aqr34++@)$EuL+D70*DVu,Ei,i0R*X:p['?k?\pdc1$iBT=)/)<V62nGl:ocfd4+q&6O1&`Sq0bW![Pm$ubu5'"l74"Hh>pV>PHIa^.?[7of]6]>VZ#Y'Ha*Z?GAHTKTu]0VFS2*jA^h[A$-7--,`pFt[7u&[V<9R2?IOes.)T0:N6WD4rt`8s+VK>7e_"5tIC$K'2mY[*-r$i9P'3Jb^c!Pn=bH##R!.-a2+TrK`8Rc?mhL=-,rF)ogDttO&]_#n3D,e64SaSD8$UD8Ol*O.A9R.8TRnMT4lW!Z89!]XHFP>U:!PT_lg!mg'B%KF%DJ0T34Ts=)%WV]Y.^FBe)0;@6"EF3b83]n2cmes,%i-mSC$q6.sh0.GBgHN\i7C5'sd;R^umeh[cKTebKX'lf9?^<oM3cpJ"&t],eZJ*V'6'cD$<MFpS6Lt(e/rN9QneM^!g!]a6SLd^M_s-%2ut[KE~>
+endstream
+endobj
+656 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 655 0 R
+/Annots 657 0 R
+>>
+endobj
+657 0 obj
+[
+658 0 R
+659 0 R
+]
+endobj
+658 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 330.04 618.0 375.6 608.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 498 0 R
+/H /I
+>>
+endobj
+659 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 237.53 265.218 282.53 255.218 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 35 0 R
+/H /I
+>>
+endobj
+660 0 obj
+<< /Length 2478 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau`UcZ>R8'YaIJ?ufs:;e*UN+G\7<8_e22D7Y_]4Z#=C+C\%F\OaZ`AcMH=`jVI(ZCUFMm,S495Ml;0hY4`3^RYg'e%fuEgTbAD^p+pbY2tI(f8;`]/Ta>6%BWcAI6YD0rC"u5TbfP<:G6G(EQR[qjJN?k,qU!Ho$cFlgTNP;o)7&)9YS_*SBL5u`2WZd^bS\6YMld_Pg>p7b*W"SO*/ain;\`"ZNJ3Y'eR4Mo'tc-[qklbqI.W4W,PGiaUX?a!].K5r</C3B,Sj2r[cr@5raY6cZ+PO\2mu)0HO6Z^Z8%F1F)r#>Lc;s))R5JQu/B59gd*HgU#cu)Qk*O7(,>M>>J`j[`;j2^tGC`Cai;8/[nNc>#g6.:[^#1EOFP+#+g^X+5:*=\"!D[Bobg#:$X80CZAcTESr8)7Z803-/sTD^ZiaIj2N\k_6t_tPLmrL@$>.j.%&"?3\>?:dAe>NK>ELu52k+as(MOV*(f?2Y+D;S+2?[WH95lh]t1qgSq078&\\5t?K!2;SATHm84iUJ#mfed-0T8Ce!?Wa\c9s#BX%"nL^hrX`6$MVIYo.F!8):$7IhGF$R5D_6jr#,%`5JE1g_S594F!';p5^t:CoP[3/TW9"!]p&M/"Yb>B0$2Qbk]>$L:fW[$L&FM)%Q_GqV@*8C0Js.j_V7XLLMkO=uq[+W3k%1Ws?)&i:uH#WpS3rkSi'=@1H?f=?'h+3@BOj2.O2=^`Q])V1+GI%3K0]<p'8WYMUO)h-)t*#=2Sfi*Eu_G24L9>$E@?bbBH'a-i1i6&2old$WXeDN+m,sEH0[=pAT-P/rnJpBUMr:e"l1B8;Sj9l6RZ3SMUNp3m-3_m)=pi-9G3D-UX.+UbO\]0,,cO)2>!&t56#KeflW,gq/F8A]=JM<VG!!un1ZiZ^aAmr&s9W:p8TnOlb,s9?X5Dc>SVNS$S?<,0goV_om1.OrV\a'jMg)G!m,';06ArtF(!u=pf6#'Ed<,2]2&lDM';>_"bUS7o<*(s,>dB7G?[]53=L(6&FM-uT*<OOoA1#90WkMnU<]0sB`_#WjO6l,eh`DS-"7'H+(q5sa5i^of-'[:@_W"9t;/YR:s?:tXNCu3QGl#E`]0M<kUd[gb=@<5-<hADEqc.XsE([Y)`fuJ:_5ea!E,`ZM4dM/#PlFA;kbbYB++?Hs-+*rm5#QS!*/*3V\9ZbRTkG?:A"ad2VFYX"dQ<"7eA"\o5SC""GAI=&XYup8.<l^j1iV_1Z\@JqUW5/8)F^fU&Z(bH9R0fEpWim69i`($'`e6=Q+8.a%Q^e%u8P;U4OG,-:K8>C]'f]3-1_JG>PV]%e>Upon=H-g`n`C[[ji/T3>H7PPgIj!I)XU-.&'B@I%9.CP#j`0L6k$<d[PB<!Y*j&XeDLl=/Q\908RSAH'lhVPBrVkL+Kb:C`bLVL\4T[1EQ*bIq_2GHeA,Cj@:7!irQ$ki2;2HN(SL#F,m5.[eJ=!`fQ]09%_P]\O=.DOqlKZND7Y`0TEBVoK8+bkfVn/FBiEDL)LIMQ(dbp8h8VEY0==je61?r+:SloCnLQ@lR*it\TRYRdir^1/pR5Z>@YgPl-a$EVE`gZR_9lLWkmuPO,48hJ5IUGdmZEOD?SU!KT%3Qf#\%/*Y*-QNYL3%G)JiXhQJu4<-cD*DV7tSo8[6''NEB.P!7=>AO?T6$D39Diodn\hm/T0?WnDR:kp%g9XIcnF_2q[(XFP@CA.."DS-SM5!_;4:[g9qD4&LW2kh-f'd/*m\VBAHF=D#d_8:)&hco3/B30Y2Z>L-WCl.bG@Lu=h#KsOsn\QA>a8at.rAt"Y$ffk]i3MZTVMY2A<g<`'Y;E%3H$X!JJ;tjZl0o7KEj?VabV^LR",kC#UB5k;kn[rb/6Z"Z'=p'3%pkb<Sb?^\]\h!H,JUY9/4U9u']9]Z)?*XCFK3HIonpE8tX]G.-Z7T7<dGGhXH.25@LhJPmfaD*d>r0Mn-a`&_8ek8]6,5e:.08PU.>(JAg+,)(7N1#T!]Xn4lIZ[LFC`?mWMuRtq6o:qn!tE:dQ>%&&fg$CH')6e(-(Gsmj2FNqrnV;XVH.I$l3DD8k$fRPRBXn]I(\L/t-SG$6tDZ^D@7U'%lZ_\'Lp5FD]-?K2C:tk04_?Zc6hIdIh>FF5Y]Un%,4cY^:[T&8dAnl:6$YKpFCeag$S1_'kFG@;A(%F7=@]R4P4L#!7"TN6JjX-[*BEOWF;WHAq</f'JD*r1I3bR%`p@Rut;L8(4t<;m,.>Zc9kTE@?=P&@bJ=`\d5/k25W?Zd0lJFute(QLuTu,hssJ?M#l5EajeYo^gmq*Gp99^QROYQKe"e541GLf<I;\(W=BQ()>TT74&`14l1qBQg(=T6pGi>n`GS_fX#)RoIi>A](jj*&_nSEI&Q"PKV6dj[t?%<c^em"Y8P6Ihqd+F.r:4)Gl@MFRA)/73AIR2o!fb&M=,CIlMG5d!,q]21McsY6O*QTn$>6d~>
+endstream
+endobj
+661 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 660 0 R
+>>
+endobj
+662 0 obj
+<< /Length 2606 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat=-gN)%.&q0LUYk$e`aoVn+ktO"r36ikWp1,LI1:rgq"%@eW.jUhI`No4'[s8W*&g8cpWh`1cdHEbRI2YB-/C&,LB7HONm/d4co??rbTm8I;Nb1@:4O;6%Gc"LsD0biqfpfh5!:p:k".m:\fsc%]]B]^?oK*`0(`_r_3jo,s:9j/_*Xnt/f&$WL2;n'Ml0PAR()hmFFrRdH&X-sf>l46crF5</:'nV\B!0OAG\J)[jecQsc/K,u05^7FSf9WXLun8HmW]Gs.5.jBcrFATYB53!fb!ikk3ItgM!'(_Z*Mdk4\8clVo=:[(,:.[X#eR]=nHp07VNtB32:,p'=p*lCqH;o+9?Ij2Q*27[\!UbQqmBa-6DV?I_?J74;#o5GeE!<`hGAH>o:is__I+C$Nl^:EIpB5q>:p']4"]&N9Zac"?*(t!'`XV`,[GrpjOnpb7+`"Q.1tVO-.V*@6r/2Zgj!jk;9eG1@:q\/YD(T*[sdP35GU?!;o(f4lSmNV?JJmnPSdoMI@27g_u]rk>dN*[E#?4naNaN%HH?_,,N88/EQP^PrRV,mnNk5d_Yh$7ojNMZt@DR]BNb<6g.(5%gfQArpj&f(0=4o``EJA^7CX-jt[^sC`48!aE*o?6,P[&>imZ*pAFg,rX<C3:rdX53N`C+b&#*nXMgQ];%-2?1RpICjNS)XFJ=:@Hg,gmWNlLD4!7RS$D:SoU11V6,WU#6<l]BbVl!6@[A(gpa(Q!K7097I1'O)SNi;5W[Trm.l-Bt!JZS2Y=!ptt'/0)S<i<:MF]^TQ1e4K?S<:<?5XST%Zc.*IfbL[A=k]pZrfh'q&ALW6YcLt*qF+=11]PGd%#.P?\i7MI.j!sjRc=_R9FeO[T*-AB?N'HEMYB(9.\VHe?G?ILIj%"^,3#`_Mm13.I[O!XiIO+OLq\bMneSWJ!,WN\Se]dUr;-?Yp"-89"%UjX*J)M)So@X=KKZOtgBG'WJCmh'Y=b,):QpVS;h(VS,GolVjm6.Uq!PJV+4A+d/b&neo`pCZc\)2'D[RIm+FLN$jQ.@&1)N3Uq%$NMWb.Zs2)KE'hR`#IVD3]AnTWpW7mQCl$FW6OLWn.Tc(EGuck9fHK0L'E-eGE+&oRmAQhYdSn=qN<%ZC']LrSiqTBuMFP:p'!]gZV^6Sl/),/9VS?7Fk_qgAJW?`oH9`D3`J"ikT32&FS3[^R#8RS]G71ahih36IIOZ#4R*'lV5#A%^k^_u=9O@Y$Y^U;L;HPO/RS":[s2"_:WOf5,aN,eKSs.iq>O#gpe)dUZYNO@c*-mhFJE@AW&?\qGUW;jS44ZJ[.hk>k0C';7OVQ0X=/:6mKMdY3p6c9fa!)<a5tmup,*VEft.-ArU8/FbLe8(H$JN_&^MMo)?#;HT<('(-oHOA>eNl(C2=_S="i(CHI#6d?tp>D9o1+b_mf3kiAlS$k)K3@AgND1P'@NcL!ceG'<cGf>\2)`JU?Y$f%/SnX>Ll$ir8mV($ZX?rn8WGhll&!D[&%89UJ__u.'gF(p`/-3f&A</0XWXS,2O.rL&0as*ll2r2a!-V4.>30F:;cd\W'ZluI?#?d3"Jk/lcd59oFi8*5i1+%a>D](s$.ZTK-%[ZU\#^kM-uG-bUU4T7E(olCUGOjH8c%l8c+hWY\Wbb13k4Flm_p$u/TA9-*38m)$G,M`fpH*IMTU%?Jl[oq5l<RA1dWc$Wu&j/U3G2I%jimq,R\-GQYm9?7&r#!=G9aq]2nUGHErRUp*`,a#J3LQda^/^fMgMHs+;;d,i9#snfcXjeU=?'5.3qn^nnFd+Vi2<[W%MF,K/S@X]^l8C%NrO:*=NPM;Y3V#j&`jbgm4%_6TgehW#!G*%'-Jae\SKp5+Z%B3N$jppujFX/Q*%RWYY>ec3&2pKp*;n/`)8m:<oP0+VYm9_@fN]7XW/.oXSL#r3'h-\-a0Q%ucC+:3-qjJq#;Ur>0dL5X#ChX/B<i84m-[MoVHA'FL$Y9i<F\,fW=JoLJp21]'uO-bjdLS-a/+Y%Vs[rEA*0kfK[>5=iY;R('%FhXBi[nlI19UE>?m08KLhtC11g9U\O$R?_P2%CsleEN"pead8YCDo0A]&,\(E#"2l.#_2Ys2t4Gl?^B,W+]?T@LfuKQ3n#apmnMHM@Ou[TWOi020QY4;;3HFFb_GH("iW`0tt[srik&:6XnR$e">(+<9erm6e[DAW%p!+j]4*`\-8LQq=NWdOpI@$&;"36,C#8F%n1V]$8Y48hTFM\a796O_#c^k,YOoqHKi`WUcdBUJ0se@?%L=b_'tACPe6#SP[:babAk3;W2Z`o,O?o47Ra^k'6\sI5"^0r;]EZ<a4j0'Vpl<78LjrlMFT5IEZf<RkR800V+'9H,],^jXKiE2YG%2639M5?-_@*5cWGYMcq.B.#0F(a+?^rDpXfFBXrT!R1hY7nGm2_HNZV.I^*P!!F+l8::8="p-e&+)V!;,q5I\A3?0t)2ob>^]82)*<TRD]+G!LJ#URl1f,g]lsad-kK^\2%4T`+FsKC8h7UV5YOSABmP4m)^OW@AZA=c4,>.H'1ji954kgRtd0;20uam#n9Ll++LX\)6.dN8en2[-hAhp:#sdrrM5FC&J~>
+endstream
+endobj
+663 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 662 0 R
+/Annots 664 0 R
+>>
+endobj
+664 0 obj
+[
+665 0 R
+]
+endobj
+665 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 343.08 212.937 388.64 202.937 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 498 0 R
+/H /I
+>>
+endobj
+666 0 obj
+<< /Length 2872 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm>>>sQ?'Ro4HAGWSc"0V%dg,HSo/_qso+`,m^I8Fa6W-.H+[\;G_?holK**I=+9S\r_aO9muF8I6GqrPr/fDa"!/UOp2T@gL5'5(p85A(bDik*S2X<=#b\$OsfT3Tu4RpA"6hon:_o_>X)6an!\7:$Rlb:e\L\15q1EqIMSN>tq;.L.UPX22#B)s1F3IebTHP.smq-H-AS@.bNnG*H(d)hV#46ok,:dm=OX7^k4X/G[P2_of==+1(')#C7@O'`SL!q15._KHLE`3m41Ql[j%H`<p;EWi.Gcisg5nqQhfj`+Mj9MPfQenI<\*gNG*cG$GNL:<O+*1jqF&2AeuAg]Ju7Du1pM4tgjBDD)flnl-QB5nH_J1mTLlSPfPG$XqT)ZM9=ZCn-g'+tpd6%4*IA2\M;h?Ak%ZOY@sbT(I,"?SQ&;m,)-)1WSacDU1]&nh:S*0CV"H@S:7/.ou0,G(k:S(19$OJ&[;f_l>JY0tU1o\RF9qH>*^3kUbS-"`^\1<g>L;OVo:L(3f43_M.ul.1FS'0TbsP&!@JN5=*"7C7\8G^+mr%IFq8n.(sCco"CgG%O@#9?oUo"n%`<u?DnVMY)O\3F>Mt*jc1[(%;Y6`,o`%L+lBt7offKNjAA=l]:8K*WVJo'eG6@&WG=E7N:fk9\Ymn#c[_EPDL?It^q:C&i.fWQ.]l&f[\Zc4-l1/jWm<>JS(7_/@U2rB3tBTE>Xb7F9(=K8ZD@C%H3)\cP(`63=dNqqrbSU-C!Dq"_!+mm6EsCT'$_JCk.93RIDGX>#fJV31lR-0aV]BM$Z:Q?-!8j!?I/cn.;<WUC&=:d]@)i];nX'7Ymg`QGA@"<LW^L1iWl\1JUGs-=g)O;R;+f<\PqKO\113U'.bEP^)f.$6^Hn+Z;M5bGl^6Ua6AN/A#<'H>6k@9]]R0K<Wj,TLSCGcUh`WXQH(h:)Fq#s+u#Nf2:%u8`o]/./OHu3.mYbm]e"l;*%CR7[LA\71<Rl08I\+3%,7Ij/adIoOiPB1@,TtFa+C)WbDR?5'GDV(k%=qpV:6")XdbtsUMF+jH%BbUUIZ%u7gbHb[FOA,/W0MAV'8K0ONLoKRa!^g&j8UBCbQAhID-JVU,%$8Bqcc,@>&p?,O$,_p4$'7!@*pK8uJh$Q\Z990kJ&Q'mr,tn5^m%oIFXsnSCdWQ2ti2o:/oHFuc*\d*%Z<Zlq2f6]+-'a2_.J.#^+*:@L#;_a7/VGD5GDnbtucIi_)m^9KsG+Tn&)Or@l^4r[=.Ua+Fh3,2sB"K4VbB*IXGMFpAt&60$b\6Vs<C8L/W$71%4$"V=3XB''*C,1.R-mq.15`Uq,JUFU78O6:-B[h4CZHeC6Widf:>O1gSME]8$5SEb*[O`XCBd<ln\7"dG>?i[TW#^u9!tkKe-8e\B=Iuis1&0N8"hMkd:#/adjM2KpdQF6"kQuW.b)YtKO_fPC%ipKTaB,XaV\Q!<0U;,l*R2Cb%nphb!2YdLN9fJ(Deqq#IcJ(#:9K=3hil8)(t[!$cR2[N*5i0*&\BaCqV+Dd65"-f4?%)V5Kcbl_+u7rfu6<IWZ#/>WHrW)$aKa,DEmldQ807IZMs:D&5KIeB9^2\L2J;l[2`t9r^;B`2>_%Y&2Uue*O#;nh,m*HYdTf(`CZ3WK@'_"9[Vl3k*iNUL2$7$9!)_6f]q.2pttChY?77A*1h92qOWW-0A8g=3^X]AL,19JIMP`#fN$Q(eLOM_P_Lq4BXK)>pI@%#e.LZ4k1.A1GE7Y4W#:g-F$jOZC>EP19Mca[NE;Q[n4c:iMaM[C#Y7j,?5J`6`q9R.j=\dOjPX4O$RV<=Fu1!YQ@.3u:cC)L6WghTU(6M>Q;trmI-fR7WcfAqMC(okG7W/0Z@C?_qeiTE^B$l^p6b"=5S^FM[.AhJkgA.-@k3@?E:e%\fH7d;a6Q+mcF7>nK=!i!093aOELTtgE,bNu8]J4Zfi362eEI:;b3`qPd"-;NK*UXN/S.V)4Q3=Jo7L.Ukre@OYp;"PZA^+>**BCO;4NZ\]1H.?fY$I1XJednEuBpV;OJYa8-&Tr+TsC.$SVmOO`q,X;"^L!NVV/,GG']..$>S8b("Kg?:&A+%gClN*0%I+1hf;'-&qj#q>TgRp!)k=>.e\XYY)836tqGah]nhu+Wq1*!K)nQ?eW3TI/p\rKTuJKKI!Yspqm?DeAtk;$#'`UN%,'jO]QGsPR@Q7Q>;-(Fpi,40DZf+N-el^-,h\k>T6r3gjpAWP`l"-(CQZrO#G!?AVm@8E4:<G#;EH4L%/4&bTeWs*RH9`ga\t2gRZu:`A2Ng\a5RLGdhW3d?3c\F'5OLk7u5KE+>He1?!&'mg@J7%2%.8W1/\jWB!pTVM_CfSl&r4QM)n]'$qaep<gM@eK:))J%%WL'!/\S8V,tkJLFoW(!ZsH1JVTKPFkXb?\58;(&G8hZ_B-ek6MSfNc(`[7oh`hC:A[W;n%/o.Z+a*Q"_9P`RaF)pqGl1,tW0VUafKu(Hi8$S]=cI6MgrqF4!&3;jh>Of]1L!YfGr3?98gNHt_CPK)UOWjR/cM\$7HP#kncFI'Lu85j0ee!8"QjFs_b:i?-I<8d9cPE=?hk6Xnej`#>5oqt<Q3qm.tk-aj:crB/tQG+(+ih79.:^2k7_i`K^uGU;7cRe-$Q[lkA('4uEWpCm5Q2QW9O[RFXsYP67XHRGQ4XZ`lpWAVNK4t7q"cu-URG!*#PSgCQFGl#dXJnMZ[IHjKo*_jN#B9!!'lE4P<QIuY+qs3u3Q+Yb+`5i8@\LVharIqDW0#)Mc7*XSd5Lo6E9IP`o[t?2IFF#I?lE[4]4$>TT,8tJ7a),D5;o2J[_Np_!H0k`P(j**5s%M>]=hN[/epdB]qWU5GVAul~>
+endstream
+endobj
+667 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 666 0 R
+>>
+endobj
+668 0 obj
+<< /Length 2807 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!#^97,F5(#A1Wi7#\H^2SnE)lfaaZ)h,c>ItO(0&eEI?q;IG0FT"seO=q6/q<tB#98hegI:K=LR>W5F3f7CW#lggD\m'$TBY)+bVb2bCG,::CMVF@Lo]dYeoIXicMi+_,Ml#X/["LRbA-`I8j'--C"OKsVem16gRTheo35:k3mk@SW]<=%*WB!^F^)I,nU58:C;7E/;rp$_apW&uf_'f^%qSSC$gh#4nIr@U-W]]?knAQjiFfZ/qE?X3K$tV\>ZM]g\S*s'CMN=u_^<H-e@YLILL9o.LS'@Yeol>f]R>MB[cpSa6>+)JD_9d[:$oWBq__'I,(=(O*<n^lTZnaBY??kjMfCZ0RcEXc[K[TblrEjreX@h$Cc%&ua#+7IRq%[)A=VZ^+p)@DX]mK%_Tl2mfVm(SH_54sXuX3j*.!R!l:_kO:<9dKp'[0]_PC&d\U$<_Y^_SD3iF$F.\HEI\s4J)-@5)Snjd4'p?+>)M?AW/Ea_L,+La4fLo5G(jm>O&ncAPKMbn_o/1C=<"L)eu]8Q"i-sH;\_[66./h5n(RK;;RAk0XNY'Z?Pl3K@kkW@a#\'JtbV?=NLBm77'CR.DUI9bMhlrI3da$f1pC%0V*QKZ7J&$h?eV#Nn,HW&q^5<URoeNZ5KVCMB/l42&]EIg;$$!RX+s2BlYr?CGiDY#gqj"9+kE[>nuYer)+^K7L%WlkjWZNsGek%_Gb6Um=2%=^$\J]3>\=\G&_[$+S#j=@'r3@f?>LJ3]Y)A5/"O0TAD'"08gNZAXU;Pi(@87r]t=Xm68HD.U;c#HV?4u[5q.aG:*3T$e:V4JUP(g*"=/1b;&SHb,C7\"7"QU*/l9Et9mUcbVMM&/o89Od]Q8@JmmfZ.a+`F+4X[9t%l=G$7skU9ihh*%hHJrNVNaKXb29kE*,JHCbD+2PAoQ3g_]WoQrj;<P!k+J!#\Z7$381="HQGVGH:K1]6S)J0s@Q:qIQm5o[YqI8%BCT^uc0FB^N*1p'^C(J-NSN*:^f%X7'iQ]]^dX,#2GuiE?'J^3>bLR.2qM?F$s#Up^+GsVg/*^<:KE@SIbAl(6lVN;N%XE`V@EXQQ?:o=)PF<j*harAY+`S0'!YnoT`iD'ec>9rr"Et_2EVZF(W5e:()(EJh&MeIA5Oo[E6D#q-oaE]Sm#N-TK8*6&@E;QhU^W)LY^$Y?C8Ad@qefa?la!C$'GhpBA2k%,3T%-T*(^QPJOpRs/\VRNW7tgH$gs]&i6dao/mFD@#[<1kI?QJNB$pVYi*B0X@u^poQ)28/m.[FTpL=V[Fq!-"s%HBDcgK0eCH/25WJp3i]gk`cruJS1iKHh9F8R(+9D9_FnSAAs?]MASoc[53`WXs\+l>M"ab`h7lP!*mTVi2b=(Ps%l6Xb1m&7+c4<G%`.>qYLb(J@lBa:#XJuHK-2LDNk$r;2d,rB(%3EE@(6J\i+%-jr?N!D#Mc&JAGGm`2X6'@00h_\1!%2/u]^7EgY"He2W9,J#q=raOQEOk=80/>^!"`9n;c"a,j^^OlFFP%PuIPb*'U_%"u'#5q_G)T1Gr(*+ZdOL>5BTJ*7aC$MDMMF=M!o238-)74bKB!'qB;!N5bg\'\2J%/g$^OUu5$t7@&#2oBHtm'.+-giW%H:n`M*^cL)eUJs_Qk%50ANd@-JY+kH2M"]iHYmucs>*fZW\88UHubFm1*.d%IfA=h`gXd8M&[]GB'lr,J>sI.q%NWEsB+t)K\r'hXMV5PRNfehhu`,]"_1\jJ%2WM@hipY/:DcOT?G=7aU;+;]=]Sjq?4@Aej@u=?_]aD&>34H]Pg^OXK$oe7L_@&SJuoTYSr@6_.oHV^$eFL-+'#S3gQ@X/>4qbS^"T<o7)Y88_fTJSHY,+;f:]doS0NdYZqMkfW!nm&sZ4gKV-Bh&g,%Oo,=(I@'KE04uVrE8C1jmFTt\WV-K=nL[@=D8#uA[kl@4O&CU4\d&\Zr^gWiiCh@ph\e$OY87qc7p^(Z:@je",*q2qD_+%I#X/+Y`WeHPp,3+s>?(mODuBc_W*]KDA3q7a(&3TRlEmgams+i.fENLgn(9B&*p<30b)7Ac&J+bemhUhBF%YX=!F#;R&(.k?r-,e%0DgC]Pm`-qVEX>1`:V%%7@Z,>iT#.8.aI%Z)9g'$%o#9V=]?4;e8eh[`tWQ&]WL@bg#?_hODo3qXZP#0CRY0tIhHXN]O9jOGu_"ZhRQgBUD(ZgBR%k/Fh'e!^;<,-EM0hn"m'k1_d=JbVm-Dr^5:HY`tRbG`lfo(g!r+[D-+K;OTe[]((@b;GL:rg.7p#bImoJZ7rW'&$UGgWA5&R$g!rLsHMc7gERKf&JL!*H:VQ_oolepUD#h]4I]\?!Vo8"2Hh@JoXZm6-YQ4U(cGAF[7)9;/%HuVr1qP,">UsqnT+\%hnC:6SM2S\T7o<!EXLPpRH;WSi?5uLM*2Xc'XtNF^]$3)`p@%V8f<=?3R9Gg_1TDm^.\Bm9],]7oQdU8`(?-0ZQ%Xd;Qa-HrX&0ZKC)b*arRMEO.G(&pgg8:h*K><XT)Si(RR9!!6!0:ER3o<Vc"=?eQ9i_XY4F@]g).VZ`U_F5/dU(,\cL?T!;i]6F>r9p*RNq%2+.iATm[l.#AAQa(i'-"hIH69Fc#Lm-/Hq%7!80pZEqq12En>:HT#k)iq,+@UN-1":+Z*gXe>TO^%oPL#6nu$D5H(G^?HTEj\l[je2?N<VY9T<C^HNWIT'&&g<6*<I!Gt9mNCkU#!fu$icX]a<>6utIfl>RL"L^chu)/$('Su:#.$`>1fFK1gi_=V^O-I@8=p(>RLd1,2#%`ohh#D~>
+endstream
+endobj
+669 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 668 0 R
+>>
+endobj
+670 0 obj
+<< /Length 1978 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0D968iG&AJ$CBQUOm,*3rBJncf1ihUjERP`F!LH#O-Jj_L2Toboh4nQ4-6')-rPDYSr4l[DpYqLLW>qG^Fr8cu;jP't^Xl05gP;#8q.)6OB,M*=^HfFfa,6"NKURRH3:7aEB2Xirj[G_MgQFhNnc/Bf&X]ZW.BJf-tHEIKf%UuQ"2k5<IX]KUtD'7/k2*W,_`s;dlQ!W2GEq!bV*dp5cipkXBS:>,GoP?ASD(0RQ?5<:CWm\kN"aJuY,<#'-/=niH_OiA^j@sGPZ=Ac[J&C'pg$$UmrcZ><:Vh<P)0s&>_/_8u5AZ]q-JE:A1lauHF6e:GrM!BQ,UuD50#j/Y:;V"c!<Bs4>m".Z?\u]TE=[QtdXZ0G.-^?$?sUt2ZD%Jg0#ea]@ngQ\bSP!-dS@2#:BqI#!^mupcS)2cJo;(<elc<S0/(>3ci0Gp+">"><8bX8H<UOj*7Z5b@h&u44HaYo'_iqAQu44E=JWE"aus3XV&)<$&^iBVi.u"7I934r=gN1m+SY3;+``3q%WG8o@J=bBQ/I6pUt5B"fcfoD?441RaXk]'BqC1e.Bb/5Z5sHPTV:@h3@c.j6G<G4(nshoPS@po98(qk/W8FTlV5A1036Z=m-d"dL9L^f;'OSZFJ*76[i\FW[n'[i%ObAM,-1eYl'h-7bW[bc[Xdjd6ednVg4au%*^p3U:JN8,^n+hh>d(KsIQdhpXMJLl<"8U43Y"T0J^1L3MB/^3fF=g3o>aBMT4OS2#ODoj%Q>6k*dGo\ef?EXQCB:7efDA*7(8K+='e?6>4?e:p0;>WLN^/YlYrDiE5'CN^t=jHFVSitW9llPqf!FO/!'#N.)9"SDPcI%??t;+Tp;>b+IBSdCkUqB>!f?34B;1k9U\d)r6AC\M7H[+0e:FYQ"aE,Ye%tm$=E)e-oXjX'gn2M8u-sZm2L?[fn,L%.UoggM;"Ie[[TAPn<#U`2g;:h[?O&D8?[6ifm6`kVRZ_G,HV8K'7$k>5nlil-W6^XY+"9m3$l"#].I.d!GCaV.f5:2Nb><CPFJL]$cA.-B:?'`E;MkegG7?cB]("M]S4M`^?@t$HSeNW0M9bQ0gLSqOq#BL2oYtZ2HL2;OcQ7g1L.]ZKZ+j-e(AoP'IIeOn;/m;cLn.dr[-du:+3<lN'mE3S(SpI8G'_dTHpp!FgdV-]E8Na[GcCFP+p`NSo:?APp*n9=gfa'0Y$L`(FCO]2Z_7a.Z8t:9UZJ3^p?WY]L`(UM=H1K0;W)$@F9ZABNs0lW0uJi(=[$m"@6TuE5:iKfROH-F^d"JX4p$lIUl(O."SPIJ4G+geLaKsFkH&aZG\'9'Xi5PlsmZ&>"\J^Lq4EAK[odsH'f0&+U:'bk%Q%:QuMP+dUh;02K@[.&c/ls$#-0@s(ucfCMgfIr8-J0HZ'M:6*tJoY26p<Vu,TS-!KoRT$KW'(ua=uO^NcWg?=%294>IIN9d-DegAH]NU0p#1.1u!l;R"2C.M&hk@2(!ldb;tJk48PIBtb0?6B%S]0>Pi&/+'3+kOge_q8P3;OQ)5L?_n%d@+@"i;sr_l0V07J0;Ti0">GtFj9lc!ThtLUFn\G@t`3j5"O.q4eAZE0?3lbI7T>&.7Ua`WVX'2gNoV%Rj*>8BcYm:&L2"T:,?ZI,6S5i=L*qc$'t$>G;*%/h"sta3l00?l%bt/=$$4WocR9m_bclDAZB6mBH+??k?;hqqA*jq]RSNPQC,fD`6JJaVbRM:-q=h54<hRiJGf,js/-_8p>d&W5=^bV&n!ZF(Wp/b!_hZ[iUARQPeseCioiB'`cBYW<Utcp!c6&BK3!-EUk$T2K9k=L.1#$+iMTHY!]b]`*fD$DqC5=t_#uqjPW#_\O0;mRVSf642D[=3#[EtJPHZ!^(.Ed9)CTO)gh9S.21lpiC'tNI55(7mbGm*r<+YVa^jq_L]6sHH5\h2OB)=M?U:O@E^(^:!lgomFA_;(?]DCQG/slS=',O<n~>
+endstream
+endobj
+671 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 670 0 R
+>>
+endobj
+672 0 obj
+<< /Length 2156 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0D968iG&AJ$CBQS9,/<JctKH!!Iijq^M[V;IM&"+DF&i*<_"@Id,h*Z[=QS/r485&3SRaDNMln0(2^A2Mho#(%ZlNs0=_Z.Z?O<Am>0Lbubo0[b/?me@F1Fr7ek2a"8<uns`oR!r'49=8QQS*f2T@t\!)\VMa:?!n&n+e*g.+78INcOK.l^H,'%Elpp6]YkF0uGg6eVh?maMG4EHM71,q:3"gCG%,[q2%TsM\gs3Ksps8)E+23^<Do3G(^!_+P5KX8S*"Aj;lS?W-tS@#)tdWV+qB3)Q+e_"`?tW=V]V8<JgL@'-)?L`YX*JUP7aH_.(BO^T_Qe7hkRQL3p>F[Fbe&"+ggCcF9BC[jCbTU=ct\+ltm#Xj.t)^d$grDMW7e_.B??IVr<dJZ\O.UI_PiN@aM?S425en=,g$>BqB5=gAa\1-0Bfg.blEHD:g/[BB]m7%OSeMj1a72:!=,%Vg;O6if3Ba.eOR4YIlN=DY22bn(J:@&^?X;d.fPeiA(0=p*i<n\^B$R>CFeCuP.HiG$-C<kMDL_F@R?XRE>"?7*RA9).mRl[(P&18Xb,=!G9,kbTo5jD%"\(D>be#%be5_ok29.rDK6GpHFBCGugXTb@m">J,PqMc[bubR68sr?@M_F?'Ys\l=n$SnX[q][Kkba[4b*FIcJW'5C%jiQVAfVOBQ[j97N+VG8=Hai>P?\!\fBKV6U`1_AL^W7E"IJth^P;=)0iCs&V1MtBa5P[%gs^;Mc93LR4W]%t3`Brnjf_X7lt3aA1j\jn<2Wg'KX4Q^4O&m:%*QkD1/6Us5OGF:'5$&#o.Q))5$EX)6M(*JJWE[f*!m7,)+/RX4X`UNYDPq''6a@fYN\gP4IE#d^up1bVh%?Q4@he18.PH1gDLjBmOW-8,<=3t__SWI_^H<n%nac^O>5?63=gHckp[AHnj^2&F_=7tTe)[1Q96Zq3Y\/t-;g>VZ&f@N4f_Eht4^75T^DjJQW(.NO*FaF8Xm<4ZLaASQ>N*<b1k7'c=OH+P<AhK)AD3ls%L8D';n?CaI`oR7;?=,dtGchZRC6sYra#ThQqn:n"QC3=u[obiV>SFpD4;C^,0%Rp$rGL8E&lq7P\<p?4[0YsU-U:fFkfsM'H$3sOq#J0LFpP:ULYE)?NVc?'[\;Hh=-,3o[cSBIro[mB2HmLOW:I=)7DW-<DQ(>%CcL#TdH%`o3C7COSdiNngRp%7`Vet\AO;>K.<>?g>&=>sT%e&0B$PRF'K2:CkM=&LqurI)@"rDo!e(r,88!"gH*^&];"Y'/p,aqIRi")W-m7#Q"2WZdB%;$mQ023bo;e4mT?kQi-eG7E`244P%X8<+Rf]>#]%hJ)p%#U(Nt1EX'*8VF.tp2UBiRJ-2b7]X-:EFMF:]`W))&uK7G!5ukaHAcDW`L->O-4s.gt?=5pqL%[8&*]eQ)dm7d_$nCJ'<3#*A8#9[2_+2T!:JdKr)#>.'78\scq\N4I7X51GRc9[k<&A<ej*T;iN#LlgM,I\<Re7H,`Dk4kP=gM2BT\1$R3BW(sF1HRK4?J=E;8MO64G"nM]haM'7mJWr>eaZm4h1(tt*QNd]p]&JL%ea99*WfkXUK2Q2I7o`B5b+_UAY0g[it>:0m/q@]9U'Bp/pUE82&VU[8;J%Ujgt-uQht+Kg$\?M/W1P[a#pDVG:]N`_o.1Y=psB4$b#*s`.NOr*72N3H8HTHJ:LI<h.(tS4:MQCd\]%n$T?=V#.R'^#Ea"S(rhV&VXZY4pd8)_aYfDHQkH+bP+L8FYk`/Y?RBfgmB\2&LroI3>F2_-]eJTfe//A]Bgk*;P%i&`F-n]%/=*0e=JRd]UI:nt_6YLZ_OZVP%Y+?h@i,\0m`s)adj0stq;rMH[-*gC!c7o/W4b`kr&=Fg6``-DHZ2T#@uR`,Y#K4j5$i"qmsX#RRQ.KjrdHsEC"aD7+!!ZPFNUJm0+TM1R:eN8cta\fWM\)#WZgCmh,0gI&QuYS5[ulR#,nh0mu5AC2]M[?+gOZ"9QN,2mYoI_Epk6.JPS't'Bgnpm68:5]RHt+9Q:>VQoM5N`W,Q@IKLmk>mY5Ynug+lKcI_-f_[$UFitJ@_bsL#S3`16`B`F%:^EK['FK1&ZU4[/Yq/ujN&YcIcr,;k^i$]chm6JWn7?:-rW+"mX]b~>
+endstream
+endobj
+673 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 672 0 R
+>>
+endobj
+674 0 obj
+<< /Length 2397 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm=gN)%<%"7kOB`)=d-DF%g=&5$ZS]$M/EDf;@+6#DaaHa`!,+2`bMYm&M0@BnG=7W_hb[a+f(CM2_#JfnNFu6aM8![kVUY4YJ*8M]>,8:&ZUX4a>^?HT&5FS]D?Vf-5qL1=@gMX_"F?EU=P>(p-Q\e[;&X3-\H=Z=(T7!d_$?jbGe!Jh``nBS1B_I`Ais":?RFr3ii'QK+W?VXDFNg_1\3%CH`B8ueT&#s:f7M0icQn[E'AGKLRTC\"DjFs;S51L0-X.<72kk[W=n?p_*[[%?JsV3qHH@C4iF?'D#&O"hXj-eXUV'3/opFj;HC1IM[Hi)8%'RmZNJdls,!aaboE6DVDXnG=RAD[ZU04HU#eB21j+A$+i0:EiL,L]h^Df`Hd!<nP\m,0/ij'PR\\1IP;G*N)e!Ea;pc.hlP!s("F+cDW.mSD))B8t2E2HhsY-j,7"jJh452`UMs)EZ'cE.LhQPU&=7X-4AN?pLUJOhG:L.<eSWg&e$oL,#Y(KJ#i7IiAf':^tT"b.)RWP&IJa]Zj,#/eQJ5I0XAQ8VtFArC@B?4aJj6Gp+e+P1Fdj6$<\Qg`G?+#rHtDZqV^,<E>cBindt^am%f<h2?afIDBda[+:HI$ju`PR7*cm@QU,Bks,dVm32RocA:9B6<YZqlT$?-uWG9L9nqn6A<QiqL&)/H.K;4=i@N[]?IZX+T?M<a=&^56;KI4K/r*UJPr(;&g\^<_:isbJ8K;E:."&9j:?d]^N(ra-BaZ,UjF:Y_LaY$8:<H$.3qR-g2XK1fmT%>&#(oR'hW=Z9112oAJ-0V/5:JMLY52r^0^#3U+.8%KnO.dFmQX,5V8WHkCh1m4)b0cgJ\CGfDgSjPlM47$,Tr6!`(\QJCK1<5XH-Sm'oYR\\h7"'giI:EL&Ij10!.--:8Wi8PSYu1M(H]OQe6JY&Mo\6=gltO!,;SM6Pf2X<anN#,.#^?$&Ui*\_u+[pnPQb,;(N9lP]^O+W0JJYNXmhV6/A?:.-fM&'],Mq_hOO]P!iL_sFB=%Q!+p0QU4=JkI,X/so;QMS\Y'[6Z7r2G:H=.#pj(+`%4EHZ1FjPmqm&>lNrPs3L(N^rBYd<Y?!^d,DdfBP/SUlTrb&W^0-p/-i[@4GoX2Sa!j'Kgu=,glifP`$<pQuE/P`4e?+X!Gur*1rMPirJ4+TtncYYM6!G]>tOOY:fek_k^;.$,`UE%lT,-<^i./;V/PJNs6N&SYuYT5\1BC3=S@2M"V^(3-(ZgXbsce<FB.l;MX:4Z3=.p%d4KfIc_70h*E:8@4XIICSabC26G4ENPtd/CWCN($QX!(fA!?m[V'mC[[Yen_\C*pO"S1/6d^A;A['Yfh`d.#Rr1F8#!ibrX,'n3@aS)5FNldS)?"PclC!A?g1hT^cp7.>HE[`jpbIo@4>`*m+d]+h^r4=R[e)a,&at"b"YS2C8!Bn%AD9T7;C6J`r40nt1g^n/3$=>!Z9H[?!`Cpco-@&Q7r$G%P9?s8OL,mJ5.JlHeN2H,E1GhHfFM,U0DOZ7?"`![oL<,#fiM8C:'IE[2p`"SP\llSiT!!&ZV3-u;EG9:mkqfD8V$?<Zdt.Wo/s1fc9>KV(auo8rP?5%p]NSMPfpN*`4A</=Y`)I19,Xf#Qr6H^/Eh(YhbjV11X$:]P=#9`"$M+8DDr/#fAcB],oPin?!p5LYP*^'pRUW,`]%meuOJJ+h_/)+H2Hb8*q?>d+g1^=='(.3aufA3Ae[I*Pq-BMa7V'#`sKC8:GLa*eqaHGZ"nj2_GrN=:%qXa'HkJY!d;^:$:9)j=mA32\A^g;m5NS>rjI7g)D[!FqbGIX;-Y9SS9a%l-0TQAb63)n!>TZ.L;#aiL(I]K!q\2YM6\660F>D6!FsRaE>Po>4F7Pg_.,(c]3GoR7?CBQ4L+:k1=NAJR<?g!lK4EQl?*O)Z-4:g*=F(o:t3(/na!PfJ]rN3h1NX@X"XRmt8ukD6I(TR%;=SKs'HfPc(U!%dt/CSNXLjHb`a\;eleHj1$/5Mu^$4!^BiNik$aD`&Ab^P&-7"E?;):De?=OPGW%;Z.hio^t,`Rr[*un\_;j'Et%N.HA4ZOp8T&g,iP(^AEQsX`95@Pgh=NoYoCT1[`trE_O\;Kdq#?9>25T#r"m8KfU`]Mh'qFa)'/?!\Sk!_m^\KcA8K5W+7m7ua1H@DYEisT9/[A03(m>tia7hua3U!gk'm=*Z!eKi]9Tgg=+<cqp^%5mq/P:P:fO(u@qk<QNL8'Olu9"*>B[KrDNnigs4c.P193uOh[>DtgjCEYHDr[K$*=3!/Dm&Q7bE*mK3>7'"/-'?hGtN]>l5V5RhK1MF#Q@uWhe^W8o%d9ScuYFKON=VB/((p"3!s<VA<C-m<e6#YFim;65M,#oAc>"JU[[.!q&e~>
+endstream
+endobj
+675 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 674 0 R
+/Annots 676 0 R
+>>
+endobj
+676 0 obj
+[
+677 0 R
+]
+endobj
+677 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 330.04 406.028 375.6 396.028 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 498 0 R
+/H /I
+>>
+endobj
+678 0 obj
+<< /Length 748 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GatU19lJc?%))O>#X,$","mgTNuSN!A(fSRcum?O.!gtl\aeZMWFWEmIf3ftMj;d4!Xo)<P("Yu?O6KPp&"ss(dS;QdR2s?_Z8@3"pqQ>#SW"=OKQFujQu5nl\uUIT7R<0hKU,@n&`H$PYYU*[;[sT'Eg8$p(Sl.%Y<U^o=fMekn`-!GQUCcZFKH:(YX*NcQE]Y#XNmT6Qci:X`=iUCY]*5HM`V2-cTL:0FHO0"@IdM8pjC_>9?4[$Dnt]d1_+`_>,8[qbi<+Ml'S"eTt$S0Vi[==2,M/S^9"&=]Tk<pa]QeCAu%tcNgA6q.fE!_Y1+SMAJW2qfPkQ,?NYDEFP0")cIJm7PW.\(//FN+,"Sq/SR\P#Vd#ibepN@:)jVPT6l&g)XM(d-I96RV5\6cRc8,Ym.)co>ee0]E@m0mS]J*N2KRdE`IbX*q_(jLoS2J_J)OPHT)D9G&f*6X6eZ\YT'Q]nMS(i9bALjt@(%"k/JWI[1.T`a7Q5rI`Q1/3rlP"MeQ?+lm@qY`)C#4>!(Z3"jT!h68?k+flE?3]@`"ff2seXGq0(lc_J-Jic[41_jYQ>mH-Y^1e>tZ&K6,KmV5f!NVNSeBCUrY@<#gj@i[d)?\2r+nl:u5a^a//_mbQlCW#[-C[N:IMN5,QiIdl^hr;/Ab-Z.qa\>r"/MT.^0lUZ$*D/a'nk02>W-of/2BUm^Ah\n"";m)(Y@bp2*O@8%CFaqRUSUT'0`6NTE4qN2DWVM4[~>
+endstream
+endobj
+679 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 678 0 R
+>>
+endobj
+680 0 obj
+<< /Length 2460 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GatU5=``=U&:XAWd&7J_3u5`';L6Qs3@<%I[O5+ELH#eU$(2W/Ue65^h!'kQGR:tb+K=Vh7=[d6pY5#gjmUBV(N6(*j'24f\N[8GpF"8)(*@0%\RI4t(RF*8PN?EIjj^Q;ZcOc&D=PO.]B/TQXPBIQ;3K;3OrN_]P`+.pi[%gZS0i:JU?6/eZMa]<no_6c0B<BcNnqf3aKT>g#j6bM%l.C#)*%BM:Us"r&[JK_P&$Xe\Z!RRXB)-+0bSq&3,`@Ip<#Fki,Ab3@jlX`/@i)\)>H/6j/c#6=eh`Jp-@RdV`d?`Q,o;j`'l;SXU/W/%V3cagaRiLOPf)-ZYJqG2XX>6m4,[n-/nLa9^Zc_N3d@jTi)UQGmr4Oeji$`_'R]UKjY_FD+Fc+#(aRR#^iL"j:*A+J1UU).%Ja6G^c6g"u_Vn-Ih(0FeN%m'"SiD-4gpY,VKV)>cnN*]7-R;;ouP$f+*p$H<hLJD<-GSB*Ek$Md/c,/ct<DO+2Z56A\"KDN[Ak#d)JAO6[:CqqZ8,MXP!JFXhj.K&oY0pu1X?/qdB:)/D?H(2'GCj=cLb+^=^8cU05RrP@;a:BObXF]/MNndjAs%Ju`GT75h-[Eek^UX5IUHXZ"lWf4-=KI4$$+$XFWj2D,F7i/\\]X]/D/DKPFpfVlO=>GDcFO&i8nAgT.?ce!@3oRVShU8o0/&UhAX4Q'`/:T>ceBFPcNq*PXR&m;3'?*98r=]%i\#E\X2mS%GWr#d>^Ge`JP]H_eMAWA%,c8pQ5(((]Ze?Nk;_C`L!I]&F3KY%jm%N%tGZ/jFq-I"pQ?T9RqLL/F&Qb]RRa[F1ZZ-=!gT<^OV.#b5;!KM6X@6Hh;NS+b'F^?m;o6f*(NgV5PZi"77EI't""8FpECr0#PW[JgiVSYR?s=DZL^T=4@4e[k1hLMm'2ZHaS7=J<+0Ol0Nr%ebm1TDLf;/dB%?Ze=-cT(a&BD>bs.rG1)Wa+d.Z`co<9sBmH$Og\Wu;`dR7m$k9Id"-;bB]Ud't&_[k%%9=Y[CbC^T_6:c<A%>!>9sEksKaGX$u/TnUNi89cs>r)M2Q3\M`k76VY@Wpt_RT(8S*R_G.U7WnUrqU:5OEd`'>>_aRk2pSEdq"?+NH'1]B0EZi(*_BC2]obQV[1mF8n3CBZN)^):+P2bt$hggjZ@iPd/&JIe^KCY`l`9F`%3Y75!i!AS6\'rp^br_Z!<'H]mNDokZ9:l6$:.o[p[U2ifiDKBMf:F#mjC2J4kC8T(`)q*W"DadrjmGYG&:P6GhN6!s6^<8YYO)C^qA$kIsj;>r#$t:ns&"m+9BpILlG&8mV"Y<KTlf?)a_NmZDd4jK0rnX=h^0%Y(dE(Ub"nn<eedYK7PQs\l>>r\>27FVW6$/C"kKu$m[#X07o%7k-8lDEY%64F!`Y>/el\8mecSMMg^/^WF=.SW%AuXV6`C@)$kIF3jUR_lKSJle(nR`4[!]a7dHgVDP6MeU$nX;c]a_:Oee-AB(`gpcsWBJlr\OP&2c(pWmmV4aPo6*jjAr-Tp.Le:P4i=(aN"kWK+&ZZgd^IirYG%A<^%Al)uO.[>/g90G\"NkeY=&\g/3Iis1\jRfY(1d)Pj:i#JGs!G_ooe\1PWNi7>$>N9l.Us0J=!mn``!fdt60&@`F</=":Zqs^=@cDX`U/t1Y/7=@*.TGf5WF#$)n@K&k_bjNB8&<MGBIaNjdlEj8Q8iA22_[c37QQ=@*C.MZJQ&X!&Y6msMjkWEJL>5P$33`C.8>c?RcW@Q[.?,r[Mh$te3uc>/".j+U0HduY2:^/J?kIdIP:nZP.@qSkk^A^EnCZ7aCs`t'fpIW8.X&s27,,VA.\;1:G*!&"ENqMJ9mQ?"oVTU)/R,u&S;Fl(6^_CPBi+I#H/YYI'plcn3k^4,KmRPh*ePW!lIEhDP;h-Sk6@0cJ5l+TKdBT663@+gRh/Lah-$$D&<>CL5$lP=O-^5F>s1T:1'MVPb:<1e9d0S5%n;X>q(>jLBhZE:CA!NoG`e[Rhm%M9#$7s=>8,24M)>n6Z?Fb*%3+oBE5tbg!8&Hmr8J+h;PW4S!A!;5)bV#>/PG%A[Y?P4^RV_fZf7J7q=3)$rkD0oiG;h?12?4_J]hV3<-/!$r\]InC8P&%&R3b\3sg0/_3T?Y(O\F9K4!0"f2dO"bfoDdKfjt93]W2-F"O(:A^dKnGESf1<(C/j1(^o\?aJ"9hJq9hB?(L7tt@G+Z`cVEN0;?eUQNpeF27:mX8N#]&".kf/9N`&Fq>$!h)C]c0`\6lu;MT1s=De%G"bT4mdnl"\;UG*C,<d3i.?I?!aLf"6ik4A)fmD'=JYs#U4=><04s@s-M"d2Jr2c?1?@_,3hQd!t9\,1at4.E]r#X!#@/0k)3j7I1>)k]!`XDDK&%.jRfWK?e;"Sl)jB,NkfPH&-q$kHtq@+.495,Thb3_0/mQ$&Vrd1IMq9FDjDdN!ce"Z-i~>
+endstream
+endobj
+681 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 680 0 R
+/Annots 682 0 R
+>>
+endobj
+682 0 obj
+[
+683 0 R
+684 0 R
+]
+endobj
+683 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 321.13 394.714 366.69 384.714 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 498 0 R
+/H /I
+>>
+endobj
+684 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 325.0 329.714 367.5 319.714 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 367 0 R
+/H /I
+>>
+endobj
+685 0 obj
+<< /Length 2720 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0F>E>8p&q801Yib&k8/^!/bpCe`aDI0C2EOdUfqY=d5.#=aD?X^^)oe:qIgWER$G*KdpT,QM!X%7Y?X:CLMnE3+puuZVF6Chr[bAH_cZUtsfc:"$Ze0nWiB25;E43o$hl]36E\BBJAp3JllfYIp4Y-C[>nr&m-2odj0Ac5nh"R.^c8Jr#f,8r'09X#5)SMV5]W.LSP,2lB+h&4kg<KYO4F(CM`R-Qd2\t.+Hn07:'((k>b^Q1dI\sUYER<[aOCq8Yg\(/TrNj8NAm4Db(1YsDc^oeh(\j7Q!U?ilHB;DP$DB&m(Q*""QVN%n%\(FeYcLC+c&YZp^V)QM'eMMCL(;9eI3(frR<R2knd='A6Zb`lI.bo#bC9^/[$s=q4U@R</A[1Cce;oRc3Rpik[5C!^Lmh'2<R!RY:*;b2i_n"V;Em#(7rZ'oUii]XSSu)n'QjK3,2G:d=0cQL[ZBJWCi<ABLVU?B5=Zso7Q*?fM00s;[NB;i*p>?A66TH.?Z/l\?ZgbN>.qobSORj&]saA>M,2u-XO)VAg0N#jXJfW\ajHELW.,[5U[:C@djaOT>UroTrS;BqQ=:bjX'*DS,o59\bDB-Z1AJBRbbE)^u]]aiR%u^\CsQ?RB%_\No;f,3,b59@[D.H>KQM]o9+f\LY!u4"6h*C+`gN]S"<GT]W>(MF<+Ni5`0hP(H`;aB9FSH_QfoK?rIpt'6>El&d`thke4qEq[QgW;M#TdFsDtaZ]*nhpBQP<@lmC"$tE8&4=_tIs7ZH`IuSE=WZPe:+`;hB9!P.)7kHNMh?:S'RaIe('3PU"(P0-Q_gki+Fbg(-Qr./_.dRTZ,7L*J;=9k3g.6,A2$#j+&]17W/7BVX>Zi:_YbF^CeI?05KMg/u/:W18ZeE<UW%E<)Fp8;rAntZA/OA)I#u43HrKl*ngTOsJR[G35>.]VL02#CTZ<1-W_5/q5NjajRC,n=n5fiE%f2uZpe^MZI"9YW9H4Xc+2(,]aX-AZWg!fe1-=L:;O:$s;l3S)l)n<OP?o1jI-,oj2,[i0dmhd"l=pQ]'57b7a0h^k!?Ts&/1.""qc-c];9HYLe'k0pj*'&(tTKU6uB'hUer&]@J,"9L+ZWEg&esQM1Yf_gBU+nokfL%JXBHPgt^f`[DCEg)$@5!mHIj0pX8"@#2\P3>.NPcmX9^s-%)b\a>h*5O$?E@R!a,CZf"kEZNd-ID4mK!jo"h%[%TRXN@K1M6,58a?@(XCgiM:K%U.VtXGk=uRWX]HYCHrsi<5ONCP<Zd>;**;Mt0,1EHLk7TAVN\7g)ADf7]HSmq9,3HtGr^*c"oQ6'9R=P=&3+?dg6=aL*;5I&<$9apopc'E`aLOig*QWVFn.g2$oBi9lb[U3!h7pG3!LuV"jUt&ps9745<>bR$r50H`P;;"?D.V,d-Xoui^)'lq,[%Q\YSa]n+`f_5MCD-&?odGAL9@1bh$$q<QV5?H+\Ua$!hJse,a;]NTIRMF([LWj'XcD]3/d\mtFM)mJlnAm]@R$_=-3lrFF=eIE)l^o8bhr+Ug@6j9uEESAo$Mjf5$./h+>W_DUu<8.e3uJr&^90W[VhPdh3FZKE*T]WnhDb3FV2)HrK3S930++UV!gAT<Q[<BQK,BM/`W[$0&ga0Pp9H]&rT@gbY#r(8lF9r[i::/f6L<^)XQT%]<\m`^.>)3TuZ5\$Xcfs!mNJg<40oOAm[^i=degt1?73A8FVpNO,F340BeDa_:IDUN=5^'B/fs-lG+&[&)Y;`u[8lJpnji7UVc1Q\_-=V!9(kLj:h5CC!@qTCr?831QibicK`hr$6QnU/op%0JYRgS4iZa@Mi#PhP`9+C\R9oos1k)P'6!j0k8CkHgVp>ImS:$p)Y<kVWU*jCM6,o3uC1JO+$U+GJ'C:i!LeA"+H8IA]L\aB3LfjUIW^<0W_kWK5fg:TU').86&hLq;Mtl7IrTiC5t,k;geXHVWYN[q\h4!nTtXmK+Ggl1:hmIZOe0]<Cn[1*6JYS!8BX_FKWLOZlFaE**;b3;K(qIe/$-G5-%G)Qia=5aN]cd:W)BjahuYNcl<"0FrM`#3H9!82VAcD'+QBO5`#3[fg)XN\c2H2,1WC-qIui%@t<E@jaO$_/]A'n@;Fco3$4I+1Q8^>D10UrEu.*Qj'^qhM@Uen0kPT%FM@Qd<.b)`M`)F4`:Yq\Sh9gZ">MN*\V9',pWuA$".MdfPr<7ht>o[A3/'\KWW=h$0V+,5>o9&(E28!T#uh'LnNot=hmfEUE+_"m>I`M`d-I+YSf/RcGm,tZ>*J]LFL[0[B*c4Fad(Lm8)bDX3^&#J-e54UE+BM>aU\`erO#Cf>IIFZf57AqtkT^8!_17l<K%tl+LrF0c\(5?oETRB/`j7c-1,hjYjpX]!R(rca.23a]*E#FeZemD`&QYULj)P_Kadkr)*Skl2lZjbT<X*)uRG]-m)@C-Z(VL";=NqruFk$-kLf-:dflp#'Ah$a86&uiB`i__8D7RdsH?41s<,B_R.:&3IKD&dYR6!rUo=&@+/amias0OmZr6bU5-UjGd*$nU>UtMn1<RHMX`II`Z;ToON]N&(IN#[<B&[H)R^<2A&I\B&3FlZS=bCp7"$D*UDh\0o-"sWli6JI]@Xg*GG;U]o5fVde!nZNdgdG[KR6Z/mjbG"CVQ7JJI@U!@T_ifKIij]j-=)5A9%c*%,.VnI:bRJh\%]Oq8Z)$^0eSK+0*UL0)~>
+endstream
+endobj
+686 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 685 0 R
+/Annots 687 0 R
+>>
+endobj
+687 0 obj
+[
+688 0 R
+689 0 R
+690 0 R
+691 0 R
+]
+endobj
+688 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 327.8 353.168 373.36 343.168 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 506 0 R
+/H /I
+>>
+endobj
+689 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 102.83 225.196 148.39 215.196 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 498 0 R
+/H /I
+>>
+endobj
+690 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 186.16 109.805 211.16 99.805 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 219 0 R
+/H /I
+>>
+endobj
+691 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 230.6 109.805 255.6 99.805 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 221 0 R
+/H /I
+>>
+endobj
+692 0 obj
+<< /Length 2521 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0F9lo&I&A@7.BQU6&M&DHh8MU12C"$VP:7B;C8pdd`J4N3t,*=?>@XFt:^.V'4hNECuVs3t#P2HCdqf_]ck[3M6T"YV&T'Nn]q=9Y0>!;FG0)^';0;=qu)`qIbRVt\tB@U0L*hE0o1\e&5J(M!-*.?uoe%\s>PD.XOd<DUu.eOPUY"P2"\/[tLWCfQ)d>Fml$6CK4,r9eU(,3e,/AKlZF9U^rV9NgZnN$2:14t##Roqt7k.gY`$KKeOW`!_'<iH4fYfmKBU0_Y9<N0f2mtoLDd$L`eaUB<8iL-]Rb3EjL<j)622L4km2an&Pg23W6RD5)oi,39aBFo-R_"H]+1b)P$,:M#[ilkkdb,%c]KrYZD7PsSTPV_:e>sELYLrXrHGSE-o@E=r9,Y`5*eI>>k<u8K]PQ4l6D00$UO[>4h?sp!,EbA9em[ei\99[$6cu[:aKk*##:oB`9!(f.56:0)K&r!&hF(aY6but`>"bR.oP/V'].$CSG)mmRn9R[bHRY/K%E<J0&)"JI)g$PR`0O&'Q9S(\0S!)qBgPu_>"d:01!us!kZJ:mhE_9/udC9^4].7F6ZJ1@H)55@D7C?<Br."Pu)L:1'=a.K7g>2OT1C^8Zm8,j93^-[Pgt'@(>ulg:UP\c5mr\]$2DuuSAmW-ZERE,YgqWlQr].\pNoB7@>[3ochqn*Go(,JTc4=5Fh#7OKbf+<Ce)#oHa+N1$/1m7:-KDUoFb=C1j6QDiaU1>q:C^Eadt<p0ZHVVYOlnP4QYj2QpeK2PpY'5&I!mnBF3fD)a!$Majr(&1'*a40$noIS=(BC/it(@Eb9m56]>QMtaS6)X7NnS-]*;mbn6p-Scbt%%c94CZX?=rj9.BOf/d[:P'U53'3ejfFbkUS@_"XD0oBb#>Qd>WW$U5K.b@/*@`,VR2HJdf!U;&>R"f8p1V@DV(NJ4HO,Q^R$4ZNu/5&k9fNCZh)M)4C$D"JQ(q0APEKAXFjD)N,'S?ToLb\#qtO5Tt0[AE_L:,O*tr+oLjebR::V7+eGr>-I=q0f:GP0BGQe[JK"l`p1kI&gX%NnY_.#(m'4<g9RJdg9F-9&CcmF0VsL<OnEsdW_MPUbTR6A1:hBi=/C+O:Bt61tKc%Rt5Z@DY7')m(I6F_id(R+q4NPE@et/h0P(!*au"@9`\<gKl\m7/?chCpE:4S(Ea?.enQGu^&@tVW<T$N:]j-1+d"5&GfVq@oUX2-D;Z6%MgU!]M2");qD3+o2Lo6]eW_iU%-lY3TZZ>4ooT-6DE[FN$X+T(:s!cAfsErIiC%3M`hC-#W`pgt'XaqPK*$L/J9G6lOii:KKshJX9as8%ZHh1B-GT`%Z)UX65%u/R;6q=`bc;'35(F5VOsLe#1-a?dH(F%X0?=Ti:hWLRYE:]/n1rTu?/&B?C#.NS"2*$5RFH(@>-P4KYgJ!J'LWl#%PoV`:Chmt&m4"+[N0)c8tJqbbK;V'Fo[c8Gl^^$K!#5SnQDJ')@i,kPtRAcQ]]=R/@LiJ,/osj0s%q8RcK;;1FeAF[8A354l/#-ElGXYCMp&o\5Y`E<mqsMjj2qia</<=5#JV,BoV=G5_)r%9r3#8IT/e8AVme05?pZlFs2Sc&V%\j;u\iF'o<iDhk0Q7DSRk+g%&lAIsZZAg7@79^b,AOQa6TWq^.e"!sD(=7:):Xd+f2QYoY':#\dFDO4B[XiOqR8:I[T9O>4rV-k?dYOj9n9\J(nJY4&3-h3m<Kpf+0f(8!?D[J+K"?naQCU]+VmRTWDqW#;ImIfcMPUoV++".nLYlq_iZ8P[H:hfkX<T+//a+aNV14Ino:OT,>A$XPk6='9'2F6Wh>@Y_oM-/hm(#ugN*Y\R"b4.&oK-A>VGc$IEAf?GI=d?aj%pSn"jdMeB=]+>_bS_h/$6^*0!Z&gNCWU*9bT":^j"2;5F2d<"N%4#k\5.C8ElUB[="bH%I&)?jc@L0BnS0`@`gEM4ZUa0(Qr!!(r"Cu*i)^ljn[*Pap?1p'.X(L:H^.?SVHSm)ra_hIl"#R>T6N_=;3HFl2:_,deLeIlR,<=0_p)sfTX,r00)R0eLAtAN3JW'?h:`'$c$i0s\aVG-a>!\h/1)q&oBO06'CoOMSigVT3EsaMpk62]mY>g*fK@]kgO=/8tcoT]HP0)3C&n=_S:qh.cYSD@ud?QtrFAL0;p9pJiG=2CXA(hb2o-YG2O]fELoY3OG4$IYana4uZX+#d#Y-\5`[##PO1fuQVMV]KYk(4qR,qKQG=_rW:o/2a7Ei5p"9l>]*b74p%@o#nl;IrR\@uJB6DE?<jr83nL+`BR6<Yf%F+Ya0T`YXQj+`&s]L,u=V``gEA-!TO7JR+.-.;f(MIg>r4rT,#eq2kf?<Bdd,=^Rm?o'k0#H[)q*4UP[HNXqa2WBYnL@W+_;?K=n0-Q\iW,o=>po&ou^Fi/=apDR?&]5D/J_/K2CE'M0WF]h>A(Hc$fOiM&g)7lX32&/Oei6;YWrqh3^qGFaEFnJens&T?!nCesi47cq\k[3'o9XF~>
+endstream
+endobj
+693 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 692 0 R
+/Annots 694 0 R
+>>
+endobj
+694 0 obj
+[
+695 0 R
+696 0 R
+697 0 R
+698 0 R
+699 0 R
+]
+endobj
+695 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 463.89 705.5 501.39 695.5 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 39 0 R
+/H /I
+>>
+endobj
+696 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 200.0 529.229 254.0 519.229 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 498 0 R
+/H /I
+>>
+endobj
+697 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 212.0 470.069 278.0 460.069 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 83 0 R
+/H /I
+>>
+endobj
+698 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 208.08 274.349 253.64 264.349 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 498 0 R
+/H /I
+>>
+endobj
+699 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 405.55 216.458 463.05 206.458 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 221 0 R
+/H /I
+>>
+endobj
+700 0 obj
+<< /Length 2420 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0E>Ar7S'RnB3&G!+@W)Snj#K))KZ=_bC/9SFWV@U%%4%(AL';[\apS0"g4HrFVkqM0eOq5n#4*Ti3ioJWYj<3@OS]0m4GLe._n`:j51+^0dIc@'>=]E\uZ^\;%L??-$=Nbsf_JsSF+$7(WXJEh[$hZrqV!Wi55(%*`BsV6"^/X"R"3iou'47_OGs]2$oUh/$<di$q3-NpCSC0`P+@84I)p__\$JMHQ%2&8//`]M-X]oMY2eVZMKILmP)I_>cPk5O+8`k_H3+=.a%)#ImM>VqH+/I/"=hRjP5>,gC((:,4ej*M="$>?maBIrl.lV/pMIYP]8N+`kqj'QVBX?\mV9-JWfc_2_'LL6_[")3('s!bYCIC<d#GqmboX6\!YQ9VPgfaL[8-r\AK\=g)?C#s`cF8>g+9e/7l*BOKY9#R_#`L[X]-aH=^eK,3Nk_&`@O$($"*43N_=PkC,uC;r:nnJ8D_9!6k^\^rX^SVlZ:cOOW9-O8pC;SM6Z9aKV[>5\"kR7!\sapAT<:@Y,L<<BX?_+a%b&N2.DTdU*?&ZiHoB!!i2'U`*dNnS_/gq*]f=/uVJ+Z%(FYrKBld&h@0.k"@K=cAcO0`dJG-:_#[>g2;"EG4MAhmr)_FI!?JU`u$!7[<?(L9b@ON/A5StQ7l%BrYT)@'\b@#I2ZgU=Hb$rD*f$5=k0TlZ-*JgoN(N4;Pic"_3Wj@C^l=E#e1%_1cRL;8W3Lc#A`_nOufQnZc4,H=$7qfN.Y\6eE1KRqOmFYZ6d+T)2*tO#B:l@\pg9elSF>u#b?@sH=oC#2=%`"A4N0)I+.&l</`3&(;HkVT<D'fabRVkAc`pk*1On1YRgc?AH31-I"^l$kOl,Zb\hQF$&h&SoBbOt<*`:!l2!_X"RfQJl%#)UG8!fdp',p:!a)V(Wqo:]W,hN/Hd80;C:0c*`H5elX#R=`=W:il-T/\/>J(i`(;M4Of/:JR-_(3i[hJ;H%-Z(EFQ[XOUeerRIehnB$4ID$dX%^-fM_!$t\AXJ-WOJ\c_4'"a^FgkkWqHR1WE8n:5WuMlt&2/&BeX]8RNtU*qP)mO#6?9_<mF[35ilVrh@2p\SqA"]AHCWLQ<X[32WA$RCbKgfeN4$T_(81Zkj1Xfn<EHMs[*1]mp<(-:*]e80D8aan-50(dO!B@pq?SV;[7N_qGP[WH8]lJ)CH4J@k7A[nmsdBP\N<scVX6nSUkf1?\[UC1#&*;o`e+7p27s!@=7U"71mN$iC\0ajM@sqZA%Ak1LETRZbjVhN*Eq*sH@W*r0.89Ap:Pm^k>/9"ZED7ZqT+1Qi%#6.aV9K?N#e!#/,Sg-.Leik/1X*OB1hS2RM.86@3]+-RPk;5O>6N]#:f9MiFpI_OC_#.+k"`#a^6-`f3/MO]\6Uq=l%N'U.)gh9KWNHBh(^6cbsq.3J8cAj6n$1;JsRNJ0?\iT&0MDi#qZ>R#UK"Q:*ajho!$-p&1@q$NXE$qks=#OSE.P@aGp$eJI+-OQm=%_1f#<eTS=#rQ;Ycq0m>SO-J1u#eut,8M;Sd]bDj"b,+[R%5KS/SVB2KP<Vk"/B.ej:15924%`;ZRSq/rH[o!I$'ToeoX?r\PYi:j9TL>;`G[2"ia5u%#7VaM@=Kbk$3f1r]usEJp$i=Lc.UEK;kJ7S/'_"LMJu"_RhTT),#n=i8`IhaIH'E-U@E8XJ!i\B6?1=9LqPe$o)F#^WVDYa4P/l/+"L.%obWH3Fu]1nFVQpSODjku1KWn\'1h\1-X`YB%!p6E#=A4DmZ;X(Tr.p,X<Zq-H\>hC[4ZC;lPEZlqYf?n]*L*p*```?AdTT-q3l,(g?c2R<8P1)oiX4eVsjbiJm,,9+U%F=o`k<<s.Z2(0$TBC-E4j]f?.tHf<9/ugPft\7gTH73$EFQ@$JiQ$^k($S+fRmC=p[>&Vl?4"-;"%6HQ[h*N%ESD$6N,&,c\19J81!Vd`4j^,`[RHlQ`>hUbU`PssM8o6'''RZF2e9B3:=b9T\mCAq)+KD6JKo4gIT2*$Tg7FYFQ0p_aD/I`B]=?tZUDVUaFX"On]'&$CFf,rn<V4kiF].UJ(F`j\Mei.53[uA4b0cK@*?Ee31()iD`?F7n<:Y01s$$c@NBIHHb,^ZC+VFG.G1R>Qk9Pq%08goM.+@'=48rfC*^?>lGqN87[E9b-s#Gru("#!@-?&%=^9<^:kFQ0h>b5r2EnN\:"Nfg.u_2b3/KPq0hQX33D"/W8BV#!(;%boV83+%Z^I(<\FXY@^J8lsZc,^1ug=$8q3/eK]]6gP'*&ncZJJ!lj^L'UC\g$X%bI=:Wd\N.l1.c4'S"70T>-`'JH^5QFq)8S?1Xb2$&qgL:T@$#mbWbAI4]1rW(]!@(s`CRG@1s:XRQ.?+Q$;gF4%2hVG']UG[WP2]$238VC0:_"[RgR&_!?*+\,l~>
+endstream
+endobj
+701 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 700 0 R
+/Annots 702 0 R
+>>
+endobj
+702 0 obj
+[
+703 0 R
+]
+endobj
+703 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 453.34 603.109 498.9 593.109 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 498 0 R
+/H /I
+>>
+endobj
+704 0 obj
+<< /Length 2521 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm=gMYb*&:Ml+#_$Ihe?hd&K-EQ>QYhY(gMPIVMl%#l7)ds(P,h73r;BMPCFE,e@k@1[.78,f3&BaAkR[]0EG&uf8%RhQB=deUL,E97@Eg%VSYJ7P4.<q8^7G-OSmQ/P@TC;.YG;*kMU@MsrH#u-Q98YB\ld>]4u"IUVe$Wo2sW4(_FY(UQ9ZurK-)Z2T=;I8ohSO&"No/"4F%c@7M[T(+"XtL^2*]efe'XFn(^fQa^nWGn.N>m1aC0*:?Vn'N'i"g*S[%K3n4<C1OBuOTO/=l=Zg9Vo'lu!AP\h,TPNp6BXn`&#n?$M"Ar_QShDf)Kn2WNX<mCYZ*rJ*ET_!P2c8,mm*n+$%Phn-fil=bM-Qa8V:YS!rhf!U%+LjB5Hedh9,@iW^J9uS(HbEbC&RLenWl@jBY=:4j,t0O/a[0sgKDqeL?p#"7E"`-`*aGk?i$_8bCJ_/-arS$?qq8SQ5&gPo9GP75hiqVXuVTgMh,<rL@aRnTb7Wd.Edofn0FH]kNU<U_(^RH7$Paje%^#b/#%n\^"8Q$&3%a$:/dS.5B9omTZf15@5N77V\ql#S+d6ESBFd<Kf94\$<*lE/:W'.3d;:UAZ3=D<Kp*u&T7Fi8[n!7`-1T;GVgF/3Lbuu6:<g>MnBI+nV!2TQ`V18rn1)@9*GoWT".UmMb]A9H^\ZZib;.Mj:EnQg@FV!ZTnA"6%p`p@3&L9A2KOX`Ht6W$H)OO)+/?:*(jD3-+5g+Zp)3f<#r``oCh_plXmQIduf2cDnh<c/*;"RX7";@4K7s[h-USn'8r=o-b,lV>3uXjkC;$$f:MNlk2hrQ,b8":]3dd+Pq:*H<k$TfXIW)*Qmt32p.ImINPK6ga!U@QJMJ>ahsUL\-q0u,R-4Aj)$<.7@^&P)r*5LBQ>,u?M:+@Y\)S0q9XlKm$-RC'ISFM,_FX/SA9j:,-.Is!.9i>q@SFh6X_HI@[St6Y2s]2'8tT3.QN`KS]7"upAr)6b/q#?TOg-=Z,fE8"qD;MslY$<-Op<LG/lI#E+T;-8Wg(j6dZ_p&I['am'>Zh1`uBi3l-b'c@OcXJ4A(4d-?>`>GXYK7a/\J3*`Q]Om6uVR08aiA$=8o?IN6gJ]1O5Y:%@[(O5n+r+,((89g+2%>,"p^lo^C\bP&aKCY2E;9L6GrAGUG1Ssh8tY%7TZl5`AjIJWF5eTf7\=+[pSC2dBRiTp4[r]*s>:"qqAm5?G#?%)'a=c^rknk:Uuqnqi'Mq=g+#g[QR]XBtVm8:N^Kr=Fo&D_qH\@%9j[sP.FqC'bfpeLBoG\rlP3I:"]`g\!90"Odkp[;GareCYHG_jSg?D>fWB"QZq1bSk*DmrrhRW(MX\lQ!^"F4msr^PZT:M<a%/epDZoa]V>R(*LsnY3MT8kCO,h*@coOsb;cjd(X6+LC\,\$(_C9Ag=MJ+QOG+rb.O/&K`@V/N]QaO1t:p8"PfhQS#OUn&;I/:dE.]adlO<^j:(>V$)'-,kE:8!ZgMXWZG=R+SWF*]SZu/&,NG]fBG$1:Y.aOqk#S<9kCk%$m4eC/7hB",A<f1Hq8c@u@_qY-;/qJ=YftL'9^!A)(sF6HjUg]@cK.UP[7h$,gHQ7Z,HAe4b:EL=mO*%i>WB-fYpj"90p4EU8O7XT;9k!T_Irj@MVaCA:l_:Q400(&ausG@eMsEl/8UhC3F<_$^?g*TbUEV1odLWKoRr%[%+W$)4R95U*F]*/f&3MdRir+1YPF#L/DO)V:^k)7C1.qYVa^5[6[hE&r#IHH7p5aal!*71P-p'jZ#u)50s7Vj\SF-/'?r8j84S&-jH7C<)c%[r63`>6)WB6-:!H'G(YaW;$hun4B'6ClB@[3LM4Mj,dn5.Zb`$h2S:HO=#PZl&Kg/mN2XCJud:C]DimF`^=Ee\9g2?)MRi'RZ/J]F92uRe<U-4_`+7=G/`G$9:G1_m@Mj'Ig/p;PAS'$'&Dj/Uf(cGNq)r*gESD\(pk6ee8B*.1b<Fu^t8ha+NKtKEfALOs'K+]p3h`[ZhL/F/gt1B/DTrRfC(nQnc>;U4GLc5$FR?*Q_To1'DhrI)$AF[1'e^)iFHJ>go]l('b1gEGNY&4"qP3lr3S)?W>Weq5IueC;&)Bl;mtigWn`7E0!TGq`iebpLrJ#POQg//`V<C`Y0\8h"OlCPZ5+]*g*?/J5?(=]@3adcr=FcXP6!XP<M\]W!<P5XPGi0fF_;t6K/>%@BQ71]ob-OE)dm0C"uB@`7U*05j>*$aUERDPR/r48g;\<V9X%TX6-#@L/3LmFYYGb7lro/-m@J')Eg16YHn5"LAqJ!;K@n=9J'[jj(K+IS''pUe7_:!&]-HBng@RceU+r_apHuH:%7*>W0%ZnP'EI53^@%p!'2eA/*;G[@K5L\-CIeE$@TsWYa7bVHdCPB_fDQW:_pp\]lk"dl:Ga_@H1UT"o>^I'2fD=`\WI/pW]EEKP(hWu\LI-?d5%kh`\nSKk'CL3:PC4P1^eldr/B3\(>Hd4)l[`tkQ<fjZ7iT]a7hcmrW?a-"l'~>
+endstream
+endobj
+705 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 704 0 R
+/Annots 706 0 R
+>>
+endobj
+706 0 obj
+[
+707 0 R
+]
+endobj
+707 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 300.86 550.389 345.86 540.389 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 49 0 R
+/H /I
+>>
+endobj
+708 0 obj
+<< /Length 2310 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm==`<%a&:W67+Oh4>LhJBZ1Hb`Y8#"M<;k$?TfI=$KQPL0j<-[&7d3%6h7<)t^?-*S6!!,[YcLK.<a0+=pUSDm',?'#jq9`lUh2d@MKmuM^%/AsY*M#0Y^X@!1<jW:$EI*,59an)ZE)8/)Il[*LqIsaa`#7GQlA+(pc$qB=[9^D.HBfu@Aal#Wf-O//=8\>XD=\#b@l2-YZD]Y=bTD6<.r,+@Na/Kj_D-.*1G'E7-cFJ>>K`GC)#ZI@j):78E"&%-i<e((rH1#G[k0rpB!]FC[K?=6/^p^G5%E\Dok'mkpX-P'7;e#:R@<dqH`A#q"7SF!%<0tK#**&OMDYd!UHAklMn")#"i'Y9mg^tVP/#jkK)#$,Yf./P71AD(e7Ynta#HXMr]uhcm!H_"13qkdf`Oqu>,#\s)1'RY-Kbi+F_\]i]R<@Eb`79>LFe<](8;lef`TqHVlct&&HFp>Sul`&^"2F+5cnZ)g2C(i`YmbY^gcS@-]+a`i=OfZ2nr6E^7Zu'+r:?JBrq[:6e?)^,mJ7STgdX%q&;s7]aLa5&OQu);nlQ)9Qpqi@kDq;JHTc+M2Nq[2XtQ;>jApZk?=Pl;DoUJbLTssPq'jhq=YbW*:r(.kj*$VEfu,-S:%o^fLJ\P"qfMQoeGA[BC_Ln7B*F<0oAD"?t):=j\c]E:R;l!-\%d[Z#Z7dngHiOdkZrT'VZ3o>/#!mYT#*#H)U<fr_UZi_^m3**EK"m9WY8D56U#%:H/8*T;g7K89H(K8fHaf&5:8MO]?\B#+B!@\AaXGMlFb%\DHu_I%/=&%)p%g/QaX-@&E8(Ll96`Y+P_M).,YJ1lMOAK']5+@!n%lfGX*G$_4;];@8`ME3QW=]"=nmJ/(LP,qAp!9Z.EYN0Hq0fq[cqhQgjaNp]4)fTo7$Qd)Q9Q9XLd<qX\:#q]8OR]TC;7T)(TT2dc?mU5CVf722RoC;f<5P$G^hV'0X=5r,o$;aMBFWr#54>*$]oniX0jUZrnAQC+5@+im4O_;@*Y_#ou'[1J0%k0M[9o_IEm_pUi#D&`qFgFT'$gee!F)psD04[,HN)uXt:u+=tO7h"U-Y/GS&AMQ'(J5l(R6*-/<B+N'L0iF^O0X/0&2a#LJt=dYkgaRF%I82c6,b3LW-S[9)0R+]/.]%>*=2GN9#$$l]BZ[%@[mWo'k5bQ[S!Bpf`jr`2f/cP-]XXq#!P]iYre:pPuR2=V)^1"3.s"="[Xk5?N_rmI@Cc\bUgUcK:7S4qILNlWeMiL@t"#mc(I'l/juYB=spp#AlPVO\Uc)Iq':0`.`@3q^_tInabP2\J'Gb,4B@qt#MIAq*H!cSR8XUImIg:3@2&O=j>959Nc*P0qR],5ZE8rb@#7_@ZW)'r&[4S8QZ2@_W?Yr>;UDDE>U[UK]iA3%2<&U,k!('`).fSF]sqs5\.pE_hpF3Na*cEG[6HR,'dKG-)T]j"<*nX_/k=;7#%mDGSACR7`aT(s5m7Y^T`qp=$6^8%#uPgFlM!Hhr"(fD$67=NIsM5)Q7VfcPV!^TM"Q5ch3R$h@M7$eH2oZ^LL\aU5a-YQUpMruRr:L1=#-\oT-lq5JukasU=cm\'Ilq:C;%o5<?G$MB^aSi^t;=sZQ#C)_es;ait]`eV"2+SD4WaV)b,6!f'931?<-3`$d[2%9%=&=I]=4Z:[<JaC%]:A1CNI#XHY,b;>d;bo`RjAd'Uf@DSdrme)tEZVtGl'NU*,=&94oSesTi[_(U2rA]C>q^>/2oRO$Qr;cq`aFgf<R>%X\M`.Lf=CXjlX7p_CO:ZlZZrk=!hYq=ea8j.b!Od;B#a/GB6!u4H"5%bQ7&NlqHK2IS*;gO`\:fVcGi'"$^AA?D<.srp0cMPYE@9sVjjNoHa'\<rp$qB2jeQsR0<YiS-%XU+P>porE=$gb+XRLa1?QK_h]1C>VYjFIa>g+)+-0q0IBe$MbFqZ(%VSk0uFJ4i(=ZdH?DUX&mcL@V[O<gsn$R9q`/fO9&_jku+c4[_.;-gEsO^T<dk>:c(Y,%Qn`64^fr%GmB&<>.mpSu&(:]q4c>=!HB0L]$q")`3BX]4ugZHp2?0GNJn)+JH[fc:C'O@'(LYCkoM\SG*kdeJ0$9Sep]NlS!OllYHubYldg`*L'k=4m35e8W(0Cu#eL$6Z%lJO=[Da(t?Ih7FZna'ulNoHDKa_b2cu34>`3?MbO*30*KFVFOm9,E=K7F:V,fC]RgSo>UCf0CPqU"VKI^,LZYaJ482Vkd2fH7[m&l$*ae%mWp#>V?G2m*9Woce&EhGfAfl;lLlI98,=d`ei[bE:M9[j5F%],JH~>
+endstream
+endobj
+709 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 708 0 R
+/Annots 710 0 R
+>>
+endobj
+710 0 obj
+[
+711 0 R
+712 0 R
+713 0 R
+]
+endobj
+711 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 213.92 620.14 271.42 610.14 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 221 0 R
+/H /I
+>>
+endobj
+712 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 92.0 347.476 137.56 337.476 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 498 0 R
+/H /I
+>>
+endobj
+713 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 108.94 86.064 153.94 76.064 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 51 0 R
+/H /I
+>>
+endobj
+714 0 obj
+<< /Length 1706 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GauHLgMYb*&:Ml+kUd)PX1HK#Cm,'?d;4D&h-H]A""htV;2Oq.<%`[XOe%:qRBcq%=9Jm\RH2S^3HJfr&*;3NbM3I=5OchW;;g7PKjFb/TpJ:=/e8:RN&.YR]^I4Vkb!0b1^N#tP<2K\X5H!12p^Yr6-[m!-V_-\Jtj&aR*VDIo&a6ALSru>YP\GcUg=mSI<`/,FS<%Tl3FNdb8%=e'QkuK)8A,6eA.mf>XFK>U?uKrTF85IH6j8/\Y)U8nQNq&j6/T9r%n\;bk'o/f*;t%Oe5*d38\X-c_E&8Ie9*=pdm14K;lQ@n%jU/75e8;A7]K?VeOR,.l>q:K%r>6e^g0`?5%Q+!HIH2=lMu&Fl^b-FEY5[.HY=r`<3HP1gId0dQB@WO`aB<1)=t+i?-\6V-$Yf[*?><M5'W=RZb&Io>D.8N`Ot5k+j\S,V0CfSXm4T6GAnt!KJA1K5oPmCg<U'*mAg8#GfhIcZ`pjSOASprJ^p''ig.80m"MJB);<7!R_tE(6O4LQAsRH.rT&g6]!*-fV5,2JKdclaLd,cpgS&0-+LC^TqBs#CU"l4-g?+4<G3Jn@+bM\B6o)?-S*=iX>:-c0^V\7m<U@[`ene*(CVlH_8j"e`Y>Q[ZA'p3,pO=g3(&/a`>GQ">a))C_$#,E^aGNgHn$9ce.^u(?K'Nj?9s+nI39qigT<,Y"=<ZY]LADT'""Ls2QLi4GbP'W#*Ng*EF9IC"rkRIQL..XP]%&A`%"*G8-A^4L5k0=W0DNe(get$]c)JX-E=(7bLmLA`dId[lK]K0bf/Re-XPl_,H^9'Ve_[jZP2J"s3(dAPSm:Uli^!3;V.5"%?E&t>M2r^+adp,#7m`,<G*Pm%<A[[J!2)JZ`oeR(s?i6cMT/lT7-Q+FZ.>T5BP(bN+(J4p4r9>ZkA93V@GFo%>A8T8(*q[Qnm;D9Mp%H68$cW#S=mHMo&k3%HomCAWk"q89^]/^O<fJ+eG1>W8M[S;Fc:G&Cs0^a-$p@`$!T2.qB"+EnnVpdGcP8'@kAIVEss;D-N#Ke#8>uR#;8qYcJ_(P2B'H"-3sK'8DAqT(^Z-0JsN>/VMZa.PG+?WTrDD!93@#ajeGa"S6ck`,BU^i/YOGj1ME\>GF\@Y\ml!:cVK'SFAfdHnBs+eA]nR^bVf&C%53?eP<A@170n*7b\NQ#Xl#9j3VcBT]]h3L.dl&/A8a_0R)2OU1l0Z<]rJEbGPQKS(m7uS+l%?Vt#F`N[h+.;3&[:'P#$?CYIoe4H9-Y0K/U:KS94?X(u7N<l0"jYLH)[7LI%a8X:;hE4m6mq\\IP/2PoNeC8o(YA9b=$=,8e`N7bf:('Y]l(QOd_pf3<f:>%3YCq8)r0\&gs44eBl(tU)\V#6:&'j%T$[^oYWO.cI)?N&q!PF%Kbpa\3GltWX2m+df_*HON\3;$9UJ9Lj,i,q\W/(mHYY2h"?]M[S1T"jgf-V]6OUn)AHr[H%&,JJ$&!g3GRf.W@/d=\?[.T6R+I*)pm&9VSV&[QN,D4cHJ61Xr9(V],Fm2@-#XaI!F'=roO^p1`B5gYURQim/;fka02.sJZo`lXXIr3C:^F8YiLpr`683;`K$;Y(O`K=MP-i_Qh`V[EZDkQ4/RkHA&I[o]!B\,QbphBMTiC0d]-/4*,=U6-GMdl:q-=7=@'u-!/qRK`Djk4h-pR@.?p<!WsD*GW3R.mjJq?>i+/q*~>
+endstream
+endobj
+715 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 714 0 R
+/Annots 716 0 R
+>>
+endobj
+716 0 obj
+[
+717 0 R
+718 0 R
+]
+endobj
+717 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 362.52 691.866 408.08 681.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 498 0 R
+/H /I
+>>
+endobj
+718 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 459.74 639.894 502.24 629.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 261 0 R
+/H /I
+>>
+endobj
+719 0 obj
+<< /Length 1165 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat%#_/c#!&A@6WR%0>-RNcR`*7L^OVUIGkKX?N3#8n;P#"u*Eio]\[)r"O.W0?b*'getqp?A^W+Zk""R<W9%#@:FP"lB05G_,Z&0+#m*&u7]/a'Q4DI\)YJ5P7KC&==7]pBjS*7[lZ-pA%XQh:Upd;r&i@T8NbEprgiES'7!bJi<3QCV%e0:Er*VA^)^?WSHV,G.CmL-(;r0[Xj)59#dQLB?+TnR\20=dY84Va\W<j(9jeeq@`dBhusg.iFi&c"(i?^heg"+?&8XOR29'k>RlpRjZp\TL.PJIf?1Rp??,j)#7cpJ#i:1(k98\]V^ri0F,F"iJO9g^aZ(VL/Hs1rBn8Q6j/IMH;#9!5WI?cupZKVsg5Eut.iqp#%$Fl$g!E32L!*VT]NN^@=T'R'6:#B5nAi'0h:a??:EYGbprLF3pXA0$D&`\R)P3UFe8*4!l^)^gA.O;jMF,Jr:g$"mAi*&`1t%esRVDC`RhDFF9@7^sBO8$Q(_HnbPcuupMggHhYV[h\&b!OuS>&'7*MB4/\$,OM)62\=f#u$c=>#>n]rJl1%!7DDj,2iK,CsUB&4IduQ*Ynda;g\nWt1E#SaBkVpRZ-T4EN`/j5_p<IM>NM:/7mU:Io0N].l>[]O707[%U.8C+'SfFu2ql+Pu6?lT+M<%V$,dMXaX.?+Uu3MI-B9E"084hG:$7Hk.T+jle5FH%l0/4X:A81+5V9N9>`JJ^44L;q1-o5UDGob%#YL9DM#ue1u,nD1o9Z9Z-D$n>]OkFra=0+ZIJ_\m?(0O)b4j=5`R9lc,l,]sU%[7#J[1Q+b\cM5A5bfcEGF7Z_:Npioc4`a)npN\]`$Ur;A"GJPFeR5nnT2q$'6fXr92$Xk7"/NDT,)_+2?YGg@f&\)PA4UafbA^IBcDD7TiSgcRNk[jYZ;Z%UkopBi>'C9DBkIP]\nY.`2UM75^]F[0]`%H5fiYgS0?J3.g+@U\jI"'H>!cq^A_qgmVd-_Llb+[`n-:Toe]i,cg%DB]37aTZ3F_grY5A*Kt[:h]kq&T"5rtOJB:Xc,YIsZHY^RM$0C*Jgoj3UTLXiZNhL1*P82]NDB#!p\(+Un:)CchA[UD2(P?K3._0bp(Ql/pk-0;uh@lV,b)EAK+=ic`o!)`gLbU@csi4T*oFrKnW("7n&h!r~>
+endstream
+endobj
+720 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 719 0 R
+>>
+endobj
+721 0 obj
+<< /Length 2717 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GatU6gN&fD&:Ml+nE.7'+c&5Wk&o[h[rQJJa*XdF%iWg=W5?>$(H^<R?NJ'C)^H7JjVJ"cC)qGh52FHOb?&Vc","+\ALuH:/7\:/(maqA7UV.$JJFTknVuYUq!sk5k.1$%ZRkY)ouB+qpm_/<<cokZg0T,M_9.1tQ0d<$C+TArF*e+r]".]`ULmgsoLu<XpJS`/T!^Q'g>@bYm"tZ@6[6&bM]JpET#mIDQ.M;6gbk;a;hcXElQTqS,5H`1X1Fi74Fc4nJkaKm%ZHJ?Um]!:"(MnP&q_4^Ck8Q90Ho9@MgSlN=trt4?#IK?KWV4-jQ/A(o&L&.3uCWP^D6WP^&>Z<jdj%Lk+t1X@D[Y7QHM@8`NkA&@'+'JD3_'pN^O$fERl>iJU7U0PilH//7goJ&:j#V/h1jMUESiOZAQM/[k6o4?9.5l79;<=jFmjJi!$4?d&f-2d9gcn`X6_$M%UHIQB3A7_6XS1*9[Vh<c)nc'$m0?mUuSGj;70q^\RfsiLRX\oQdEZg4I:hOYC=(d^dYLVZ_eOpW!e:**a\-O@QDiBNp!m;LqEQfn(Me.fcV9YHLT41+b@Ck>1*EdM-SC(g/=20/V,aYkXfJh8ie<@gQC'8,c\d?q58qhMhCp?Oql@!#%1BWCR6Il-utmPcu25h'q]LG#?hq?tHhS3'HA;%7tfO6X;gYmjtUHiNQ9Ki^KPoAA%f#QiF!)++"RA-Jb8D'C9F1ELKX=)\EKQb?R4'#SEK8PQBbIJ_V6f,VPioH"3>Acs-N[7BShc>n3u9`Vu6s&TM>Gi5>pP!1]"f+Nh;!F,C2PnF:pgKJGM]_Ol'N;]P\:L]BX3*a(8':#JhYpOGlFoEcuI@):O)@-aeK+B@p,8\8bgfmn:,Q7FY.IncYo5_/Bo_0CZRO+R*D(nV'mjB2nGG"5Z/)pj8OYbKgT2EuA6rL7i>2DMn?dV[8bkhZ>E59%S\#^r'qi[mq>bso1?K`Um0Oij(E,n10-JeQ=jDSV5V.;EfBk6tf'%:VZW*t^SZ)MdD*]9aEVTE1VfIt1CWG^Z0?]k&qBSgE\sC((_e==!GHUY$DR)so%/>o+H*cXOQ5aRi4(30UFl*06K7i8r"#&E*<YDBd=23R0EE-ldnr(X/S-dM9bo-r3C"j^(K4234[.#/!ViB%9e8,3YROLP[u'W<jUl,aB-m,rq%N!'k^k5I2`Uf12<0LkMHi"EPffNE4DGTTr`D3oRCb.hX.5^p^i(ZUcUt+ne?q6EJr%f;X:_%hbPTS"Q<qCH(`V42gW9=^5=e54QB;4P:BG3-=\8-/H2-hER%)!WQHC=M.jc^:V,X"=aDI:n#FKQclEKS^Qmf)kKq6&!d6$7+'+3<'a3Ka]VOe2hsH=Tk22VU;2-6Hp5UT4m>>ieqPq8k*2N=M20)e-<),::cFE6U!?bXH)V#b4rY/)'.g/sH[t^:ijdA9NhW8,$bk'.7D_G)SuSD'@]#Y'%O^mC'&Y?0-;fGMCQ[#cf(,6m,G@]MDuirCE?36p#:%K'="H$r'6Bfseoof:krm?UG2%]3ICj>NdT8BEP?Cc.FkW?V86PsH-Z7%J4J`]**tFhD&?P8V)Pq_@-VD]"q.._WPY`D:+/\+R?:%Uqki0oZ;'^u8YH>Pr[BJ&d,("hUm,+7seXM?5/^u#hgmAoC=i\AqjiXa!>M$ZsmiIeaol`VqV2H-^Gep$mm[#Pg1`>K0)Hqo=+]ih6SYe3r6S^ds\6rEndbTe!C>@V!1(6:HqC&ufI\8._O<<CmK3$b#Ld4.U]j"GK_EnHHC0aScVgtg^=nZgJ0SZf'kiG_N/WKgIRQk7MR\g(h3]h#<=UK0ha7M^q83s\[TUSDJTqo.W\0R$C.pV]tA;>SfV[,#ZaR6rBlg$5U*Qrch=:T)sHFdAB=Ma%nM'<E#,\`,1E03"L(4f];Dee#'=U%lN=E=O,364ZHp'cQ[Ya1k[)]>LK$8U`^LsNZRGFAg=CP"g?p>;hRr2so.N+&s.8A_$u/e@jj_fqqo1$/Ysn-j%d=ghbBQmjkGk_K:V>H>h.&ulYVj"u0!4?h^1oIqPPE?bbah*.Yi46aC\nYGcf@oYRR-1)h>k+:dY.PEi3ERUr??E"E$-csCTQ87aNdR2Y]<<<9,0SM!@r8T4XLCP^sO?ee`4kGW,5!duOX17!4Sff^"=2ZLWiSC0%)Sps1c\0/3e)VX(._Ndojc6Ku/I7Z]GqBXErh).52=l"T0LB-H$3gf!f;Xdo>\V/\o+da5!kmLhTf&g%Sn_"/1[;);pP^V.kQ6iA%X.($o<'AA0SH&Y$HC8p*ccs^g*QhXc(L3'%T^AW]9)+Hc2_"=`H2Xo$<=#\NE-_)Lgfn'23T8mLH7'l%S9L[91"N,-3.Wm*XSC71@57:,6cq@'8n7`%R]Lgr0BXLjG5Gl'.1NJb+71YksX`8;-,8@GN+X;?Hc153TK@\Z>_2-B^#BdJ\l_?D12%slYT:'IFt(FBR8E6=c`4EbZ_/^3mM+bFc3"d=!8VG9Zp5=i&PnPR4boHj6;Mi*3"d7#SHU:\+:l)JTu7GZb\"(R\:]*$e/)ncT3tAEK?^ZpP`k@"(INn_0Mfgh#4=t(PaJ.CKG=X?ci&tLkOcF"L_g0On&9$[X*/nB6Qio<cR;`)WG./<hNX4(>_IiIBRk&&ES])-OF]'V\)Bq9.j@6$i&\*=jZqJ43A'2DUb"7oWcQJcAhOi?<Y*N^A8qnEFI/~>
+endstream
+endobj
+722 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 721 0 R
+/Annots 723 0 R
+>>
+endobj
+723 0 obj
+[
+724 0 R
+725 0 R
+726 0 R
+727 0 R
+728 0 R
+729 0 R
+730 0 R
+731 0 R
+732 0 R
+733 0 R
+734 0 R
+]
+endobj
+724 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 299.44 517.366 351.94 507.366 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 136 0 R
+/H /I
+>>
+endobj
+725 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 475.28 495.366 520.84 485.366 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 498 0 R
+/H /I
+>>
+endobj
+726 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 386.17 457.366 398.67 447.366 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 102 0 R
+/H /I
+>>
+endobj
+727 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 418.11 457.366 430.61 447.366 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 116 0 R
+/H /I
+>>
+endobj
+728 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 286.97 295.922 332.53 285.922 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 564 0 R
+/H /I
+>>
+endobj
+729 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 92.0 273.922 142.0 263.922 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 290 0 R
+/H /I
+>>
+endobj
+730 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 128.39 167.95 148.39 157.95 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 118 0 R
+/H /I
+>>
+endobj
+731 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 153.39 167.95 173.39 157.95 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 106 0 R
+/H /I
+>>
+endobj
+732 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 178.39 167.95 198.39 157.95 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 134 0 R
+/H /I
+>>
+endobj
+733 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 203.39 167.95 223.39 157.95 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 150 0 R
+/H /I
+>>
+endobj
+734 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 245.33 167.95 265.33 157.95 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 166 0 R
+/H /I
+>>
+endobj
+735 0 obj
+<< /Length 1852 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GatU495iQE&AI=/BX<I@5cYVGMNWk90%.Z=;D^\d\D8a**b^CMLruHc8)++Aj*,%Wk"q<%-A=*"`Hcn'i!eL;&,nPL*(!rWRGJs/cMW2P*rLg-q61Z\M+[p49Gc"+,<0i4]Ep_34rjNJq#M7[\6_jLYn0@+2pT@4/7^>4;&qaUSEYA3'0=(dLtRYV=qN:q?#M7QU<l$fHWfT5-.8+8C]%K%"c23L?KSOY+4Zq]06he]ERc"Lq&l[L)5;%\rO>7f1Qgh4j<hX=P/VfBB2pR/N>[6],1@L:keLumo%_S:$$2VWmdq'LW(-:Ba3!QbE6bp5WHK_aJ]jF+hUUV_=Ll>q4E&.]7Te^hJq%nr8p#MbM@.-b#HFUk,u>aEn!Xk#..mcUeYPsO5hYt6(dX,D\Q\N+Nj_hce0)4=p@ar$NJ!')$T%oS,[3J#3UkkT\R+&48QWD],h5]C3b$i2Mt`#F>lVK$4Zf('=:3q,,=c(>>$rd=a8j*?5o'57W_ODZdY_0`.MhqZ04m21IXp$*9ZY[^Q'n$lC':TCai.1Nlqa,oVCi0LlYcR<J4'K27"+4'*[S]&"QTC.GR`S+M<<,=VK+4L%aRm6^I9#En:dg,4;I:e#",Babo45Io8F5>%-aq='4'c]@.GF\Q%%>DLMQq=ANl'@)mW5W'km:V=O8apI3CK_@H;.Nl_[peC/#^:??b(%Bdm[S,#H.DWakdt6]de;.5=`BL`+]dRFg]okAQOpPKV(uFC2D;d%[pA`\HV>\:=MOBV,jnVgY;*I?gh/(m5J611'DaOa'5;2YWjj+UFYm+UBY+R98&76gS=Kk^N66'@j*rX7SZK>=\_MbF_[*Vck^+C?crKnI$UaTbR9>7'R-LG>Scofjk!@qdjl3e<a#^2.VF`=W6*;s0]&kcm3dEk3kp&O%N0=02&_N[<b38^l9RgUu#o6fYrT"Oes'G2E,e\o>CgE0#?aUJL^[u(Od\j3n`dJb$'h219Q0JlH7S_eg3/"`4TX2",=#q2+j9+-<"Vg2G2taXD6el*c9rGeJ;;?00"@HcO@+j.7*F97@HR=9Si_C,&P\qEFS'qf0;C.]UjQQD:p74p1?Ro*di,;&Ej6f<M&r3OdG,o^gMBIb/H.&/-mZ[;%=kf70_2B/AV7d.[<V4iuf<1qXBKH<>ulPg.#_uc5a^4E(BHRl_=[d3s^G/YsZmmMI1hDR@5?+Q_Ta[f*!:%/l:9[P=7PEjuH=G/=+qS=^r]s[*Y'u3>qcRca$u+gRG=O[q]Mn[U&1T]^c^YO'e,PR+)I+]Cj"\T:8nG6p4-$?"-[%=C!HI.ll\rU$HVslR*Eb<D4m*BW?W:qGcEI\PpN#fT"HOD=(KS^J!Wijlj]q4MqMMNb;HfCA,rYfXt=:j4<8QJ=0`:c!3IU?uulA1n=K!jq]_X%g(KeUrUB$JOq&)$@Q&f)RO"f-Agd^dG(GR2m`;HnM>c\^fVC,rLaqki"TaZrVhu<,_W]o`6@.uU(.#@J(n`AjR9$DE3a#LfYg_tU2^K.7oUmMQ5j(e[)mTMWu(F1]f9*T9P0^.!uUH7W0c_eW@I=VR2XCCC*D;;)V7W5ZY#o48K(hD?fFJCLLPM<iK-JT;i]a2<^qGF19tOmWa^u=]@laSpn<S7OB&$&&1+XEo&NHYf>18mRKbS'c86bR[SB/5LWY]o<YC`0FSQD'G5WdCI&"DZ8(B,#=*GT%eLJ8!H"M'_\!`^%B9p&!&oC>=G^bMO,U"nD8E@[eOZ5l2L`,gcRiQH&m(@9+X"Uhnd?"JQM?2rq4):ign0W(U,E+lK`!J-/W?F*DR3D#m9>7Q_K_Z57SGIQVk=?X=a3OP-p??]T4np,u?$15~>
+endstream
+endobj
+736 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 735 0 R
+/Annots 737 0 R
+>>
+endobj
+737 0 obj
+[
+738 0 R
+739 0 R
+740 0 R
+741 0 R
+742 0 R
+743 0 R
+744 0 R
+745 0 R
+746 0 R
+747 0 R
+748 0 R
+749 0 R
+750 0 R
+]
+endobj
+738 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 92.0 680.866 143.66 670.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 487 0 R
+/H /I
+>>
+endobj
+739 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 384.15 658.866 426.65 648.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 362 0 R
+/H /I
+>>
+endobj
+740 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 152.0 548.894 212.0 538.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 271 0 R
+/H /I
+>>
+endobj
+741 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 224.0 548.894 278.0 538.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 298 0 R
+/H /I
+>>
+endobj
+742 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 290.0 548.894 338.0 538.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 302 0 R
+/H /I
+>>
+endobj
+743 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 350.0 548.894 380.0 538.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 277 0 R
+/H /I
+>>
+endobj
+744 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 392.0 548.894 422.0 538.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 306 0 R
+/H /I
+>>
+endobj
+745 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 440.0 548.894 482.0 538.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 330 0 R
+/H /I
+>>
+endobj
+746 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 152.0 539.034 206.0 529.034 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 300 0 R
+/H /I
+>>
+endobj
+747 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 224.0 539.034 272.0 529.034 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 296 0 R
+/H /I
+>>
+endobj
+748 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 152.0 425.202 194.0 415.202 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 273 0 R
+/H /I
+>>
+endobj
+749 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 152.0 300.37 212.0 290.37 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 275 0 R
+/H /I
+>>
+endobj
+750 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 152.0 181.538 182.0 171.538 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 277 0 R
+/H /I
+>>
+endobj
+751 0 obj
+<< /Length 1786 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GatU4D/\/e&H88.TlhFs"0F'<Kp%1!J<r5tM^1.mV:uRUK-J]$;-=P(P*c.DSKurP8lX4ca;:'!na<!\Hg[gsK;4K?N^aH5d"9f1TrjB3B##M9LehI.211t+>-QOpO*SstMQ`Ur\t3XY9W&I`cGQC9;4WAofSd$ljqZ3?]G7bNT5*8ji:B6gDo08fD]L[)Z8*nShMD.8ZB"</2B8?"Bbg3G'\A&(pmnXn7*@,m@e%d`\QH(hD8Cl!kaF=DMi4(j5ccTQ"Hl-3!Fhg5O'!_!IEN^8/5(T?^?6NHe2%W<cdJ_BV+BJJHd"2W8CrSD89MAXnd(Hd.uLEq4JNB:!"V\XI"Au21@b7%.?2FWVFZ=D.2<CH3<51SAMoW9\ldgbc2Hsms+g!q3Dtk@(#-m_Ba.?",P1HL5Ep_hT=1T.UpKI_?fpPCMtpqg'5EOF\mp7,RT?LIiKhq/D)"82Tec5PhT=I4^L/?F=tBV4R-/5&Pg+8R*DiE#l#i`=enJ&ASLf,HP.K`KA+_P5LOH):;$5a$[dI9[%@?%>25P"KQJL"E/8^/g6?5p>&DC1;E]XB,Eu+9\B/lGZa;+Cr=nM[3LcMo;H`m+CO@ca+kA]3M1,qJ4=9Li%3ldo)%qb/qkDIW'$FY7be84%Y_k;&">doVpGPs4'2Pi_G"cW;4U7):fLs#b[lB@YYd@#S4@3pUDbQ=M1,GsfAG&q>8h+4RP2K/\+j7#WGr<_A%bS-@Y,dP&nP8Z#-WD4?K&WOd]B>@`]4-!Y%p'%FNTSk,>l4W^F<J-Br6Z(!_k[9".oTie)7A7r.Z7QSBLj_LuCu%Wh-lKo]8fbME^U4&CI\%o8=?*Kd(i9h+@6'JmVBlfKg;FH`r&*Bo$2Yi#J!</KhpDn&^5>-#=]AugjUY*=O+1H*SBc`>Er$ts=Hr$&g'?@$"E!WB#V1?KhcglHM/00frh*[*^L\<M:;QYPK[ZDj"qsPD@"9Ze?7mOE$APO\7iF_"S/'S<3^]`XT^s[7-_R8\EV3m_p?D.T?\PifaF\S_!!,4'+ieU$cB@8!EJ:m.QF\)3FuE)b_E5P0B'Yhd3$+''fLXi-A`S;+/%d]e:O"=>""n5/&MZCY-e0QEf;O9E1J3+_%#oOqj,;Ta@-Z+7.%h*<m9>_k,:B^or"8TOh`Y'9hLR_V24,iQ/?7h,i3o!RMJ--nn2(H0\4!;08CtNdm5I49<.;H8(4+;q;(=G?:H+./.Op]oA_rORZ'J[k_`p(GK:$OZk(-<V_5Au)p)<%.#aKYKDV:n5'GDsNN(R>J#V*j!^Ofk@0CU^1I!<;'oM4ai=;^)">BWa<q;>B)dN'glG'e@T@T#P-.H4hrN+gAs&Na7(84L+GL9[8+N>9ab)OKgnY;XO+Leq"u.l5s0TX(S$HJZXY1Ou.<_a]I]B,Un/F$,&]AJfY!.O9aceLd\tXT.-2\^QdZe2iEi]?s:5]gIJIK8tO%b-k%ph>oD0)Xr3o]u`HJTDO-MiPp"!0Npoe^qoc.V6*d`Hgp/Y\/.V3[`u]hr[;nQW7ud$[q!*lMBo&NY5e#&;CLU6$LVd%>AaF@Qc//t?(,bZ0+n#DcpLjoH"n>iOn[S?RYH!A'3)RaOtST*%mfd1<tRY4mEq\&r3UZmH2NhWma[>/7V6bk)I/:Lo-)MjS]%?g4Qq"HZ%*Gj]XCV)0qGhOAa2Gn4hEeHII23N42B/))@pK-eD+@Y\m>PHOo5Zt/kZsH#rgI4!iUH0>]dY$*RNkDK[KPf<7Ae?;n%[(NV$(hWjP(b$pG2^rWhLQ0s:~>
+endstream
+endobj
+752 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 751 0 R
+/Annots 753 0 R
+>>
+endobj
+753 0 obj
+[
+754 0 R
+755 0 R
+756 0 R
+757 0 R
+758 0 R
+759 0 R
+760 0 R
+]
+endobj
+754 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 152.0 650.0 182.0 640.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 279 0 R
+/H /I
+>>
+endobj
+755 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 152.0 547.168 206.0 537.168 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 284 0 R
+/H /I
+>>
+endobj
+756 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 152.0 401.336 176.0 391.336 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 286 0 R
+/H /I
+>>
+endobj
+757 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 152.0 254.504 194.0 244.504 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 288 0 R
+/H /I
+>>
+endobj
+758 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 363.56 180.172 409.12 170.172 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 498 0 R
+/H /I
+>>
+endobj
+759 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 152.0 96.672 200.0 86.672 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 290 0 R
+/H /I
+>>
+endobj
+760 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 212.0 96.672 236.0 86.672 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 286 0 R
+/H /I
+>>
+endobj
+761 0 obj
+<< /Length 1381 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GatU4gMZ%0&:Ml+W)&l_>F'JiMkWWZHdQ`E(F2a[@(QqQRC7c0P"SA<"8(VHq*n8XHq=kp0PSh&dI<Zo;1>*CI.oOZ&-ahWc7`S4\3LYU5:DE$4e<oas$kK7kjp*p!5Y`">6^f#l>g$=J'5,p:O3DTp"#c(-Y>)>b'X*c<V.T+^=+be6?!%5K+Mf(:&l)7L_&a`I%stD7VE<BmDZK/Z*F5VW`<'&NCgbhE$XU8.;KSoP=o]]['IHIk2p`?lBnE-=_2;](1/YKD(TC4oiO'H!4%c1eZ);pI;6\cC6/EMffn?ghi&rCpYue5X]9QT!X=eF;5=uTh@q]j[\$%dSh]ers)iSq"/@,p;.nEOL+m'Ij7Q9*KSCV\CC;6ri]kDI:-%3.iJ2i]%G;brZ\3m_EC4j/'"o^Ve]W3_3!9QN_`ZgApbZWJ)T)R"V`)"jm6&'#LfWr<h/*l!BbX=ea2uBfhot@l2L/l%2--I:Q->-]dfBab/$N[I,R3ckD2]$iR;?"cch1Di\KcPRX?:p8J28M#7a@%:O[00SjNj!aA)"V47k'Po:S4B$+N0ok\VG00NH#S_(fDSB++Xt6TmA8d$G#?Vd3$tT8,,K_e*\ld7deoo];hmnATF][3C,u;\]:t;qZap(4!hrb>&re8'Adk32JH"u[5Bo6]:2Ao@#dqtc>-'5H'.4I!o]M,cC8'=m33YE''t/"l*TkO>]^s[(n,9:Z^J7DC/e%?5e&[Daa[Js2^"K,8.EL.esS!g9i70]dMZWOX0K3u<[PM3R[nLc#O_e_V%Z*GeO(^Ch>6i3O*?eMSWmsDcKmlegR$RS/<FTjLm@8edMRplqYa,)c`GJ>73c%0I&1qE;2r!TO=jbLm\])^Qj'OjXR/!J,8XH(/^f;.!+Yl,,44%V2!PlkkOb`Bg+h:ma`gO.pZKaU6rspFYUOJ./T0=Wn<3'+F9XG;_o%GhHQ5[0TWno!1Ul\,Ts,F,R-P'rk'QC9,[@A90jXdZ"]6'H__nV)]<Cg*g#ZhHb/4q3*!8n)ZRG%i*c0iW4+?JImMK*+$&n9.nc+V9#hZW>-#m<dE1c)/U19\n@a48hj`sehQ_'Q6*('cu4P[la&3e?9'(6839mkYJol^ddU/($cb)1(#4^g%Rl03p9UO>,b[lD-tfb,aV`U_NV\\%Z[GgOg);@Q=dU#(#rKnp@,dBc5SS+^dRf:[Qg<!h8:6X>4gcHjlBJc[WBrTAq.`:<KJ*h_E:)*.29)sc=qM(Icj#dG]9c.d"99Ee&".6bcJD-fVsJ&ng>o[rLUU>'tFQ<)L]g5eT,H=g]$>8Kc2*Z3@Lg!*cXla@'3TcMrIH7he>bbEikV/,3;Naod`p%_OtYjf/?V!AOu[]&6N`W+C0ADR~>
+endstream
+endobj
+762 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 761 0 R
+/Annots 763 0 R
+>>
+endobj
+763 0 obj
+[
+764 0 R
+765 0 R
+766 0 R
+767 0 R
+768 0 R
+769 0 R
+770 0 R
+771 0 R
+772 0 R
+773 0 R
+774 0 R
+775 0 R
+776 0 R
+777 0 R
+]
+endobj
+764 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 152.0 626.028 206.0 616.028 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 292 0 R
+/H /I
+>>
+endobj
+765 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 218.0 626.028 272.0 616.028 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 298 0 R
+/H /I
+>>
+endobj
+766 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 284.0 626.028 332.0 616.028 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 302 0 R
+/H /I
+>>
+endobj
+767 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 152.0 512.196 200.0 502.196 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 294 0 R
+/H /I
+>>
+endobj
+768 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 212.0 512.196 266.0 502.196 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 298 0 R
+/H /I
+>>
+endobj
+769 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 278.0 512.196 326.0 502.196 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 302 0 R
+/H /I
+>>
+endobj
+770 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 338.0 512.196 368.0 502.196 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 306 0 R
+/H /I
+>>
+endobj
+771 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 152.0 371.364 200.0 361.364 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 296 0 R
+/H /I
+>>
+endobj
+772 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 212.0 371.364 236.0 361.364 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 286 0 R
+/H /I
+>>
+endobj
+773 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 152.0 268.532 206.0 258.532 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 298 0 R
+/H /I
+>>
+endobj
+774 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 218.0 268.532 272.0 258.532 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 284 0 R
+/H /I
+>>
+endobj
+775 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 290.0 268.532 326.0 258.532 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 326 0 R
+/H /I
+>>
+endobj
+776 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 152.0 149.7 206.0 139.7 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 300 0 R
+/H /I
+>>
+endobj
+777 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 218.0 149.7 242.0 139.7 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 286 0 R
+/H /I
+>>
+endobj
+778 0 obj
+<< /Length 2008 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GatU4=]=*8&:WeDGb9L<iqP^G[W[R'L'f@r;D@H7+V,Jq_l-U"b-Hflmirp5\o!iY;"HHNea!/1pq!<:Q3V?SI)EBdb?1nX/E?062D"[1NS'B^67XsHcrao"f:sun<>L2cG&4g26`ZJ3\h7^6er0t3cLJMJonKIOOsF#BNt3Q3>-,P4op6K:s/(*)Xk!HWU4VP##uns\rh?kL+Z1cjTIAt6l7&QFQ:$joS7:m<@&`O_Z2D+QN#d06;\2G\cQLI+'s$R%9t/$pZZtYJjQ7Slbg>c:qu)l#`T#A+E]FE5b:M,Olo6\XlHW4Lpg_]P=7>-7;FT'>K$iT4UO<IhH`UVj2Vm1.YIm#a/dV;)q-sXo1qG7>r3-iV"#Ftl?IJO@4-7=.0:Xo4AtgVp"![I-V[N1%i&$WhYuBZ.pt3%"a;pLMP,q=;0Qb!b()6.2erP5*$gJjjHR%D_GthBN/F58G3Cj:@\n.!3n0X@,611[*[49'rWI.K1;R*OPl;k%Uq/%sLQ8%b;*u1SdnY,eQ+2,%^\9b#cl_4OH9=L.d7p'Se<!B++R20"m668sQmq>HH_T+MK[t+B!;O@^X^q+B&X]U$2@sG8D4'0N.XiP'IWu9>OdZ<eue8pZ$6L7pn)le)ifb2<HMGJMma689c,69&Yb*#Pf.jGSGiBS[pT?Os:P#Ms4i66JUYrlSQ>RfXjB8jO]A_":Y#%1c1J0fV0^]_2\dY7K<kDR#Ql.[s`_WXEnM.EM1Nu6.3`WFI/9\10j.7[-5K[G&;Y:"ZsoY/nU!"mXmoB_<NIs*)S43qGO0Cm=hg9Y;R:pG+^0<=qlr9OUXXVG5mNnp;!L]+,-l$8k`!mDVnL4(Ip$ApXu9UbNA1i9M6lt#q'W3T:nO]BfQZ"-a0;AYV4k,-Ud`c<G)QB);8[!I<gjh/)>g3n;ncfAFb3mk%jW.]@t6UXmS/<">d.[nk+Pj6CR_;%@H@/DCiZU9GTXB;'u&e`Kl1agt,?1b(2fuD/D)VFU-><sb_Jjh#s=?YMGS_kK\ka*LS.2,;-9r=_cK@Z&`08,'XlK7A@D`V`mN0^b$G,>)WX;_`J/h^XFcVN,*Hl+o5#+mE$++UOf/[58QS*Qns>/<L6@Z!@J.I(2:6V4<sA/XYN[*"'Y98I]8FW#[8dnC9,nfU?R0WT%<46N_h!DGQ@KZh^"JaaS\X>Nc12>E^%it@eu0Z?3fYL%\I?E8i!"_1#Q6Oh;_q>iS9$s!aH,oJ]Ej$g8JJXaN,Z!;UP%5q?Dc="Rl[(`Fpf>@t9"YXHQ26Dtn',Xm*2kVdr!gGoRO/2j9%G@K(4Fbg-'M@S?s7CL2[^&h)^kd#-..AC%dV;1fl?:%7fh0PHR*/)s*mg=Ck"d,7rp]aGik6Cs#C:KKHXe5'^B=tPqL?#SkSfsajLEKd7u(Ts9SjuA*Hi/P4lU.eXm:KE?[T%k/m+`gh)R*lq_CA6:JYQ/Pt8sUls:CAko'@^cCE9VL=@sRY4#@G$fs[QWLkmtGOqOF]P(P>Z>]ktF/9mGj/&Z?XV[UVpig73gOZ9Bb".MWD(g.i<9^od*)o*"WP@>>ROjJ//"pSrpP5W"DSdmGEVkA5)M.3Bd8UG&k,i.hb*8<0J5`jWGIhD.LnP[N*/H+eLA)Kpn2Qh3XVL>_Nq6uQ_t"Ub[fM8dr^6'udZ-JE*//i^Q%?PcDuM7r1Hq4MGX81KNkQs24&Go35pW#jEBbLp7'6SHSSiJ9P]/7Td+f,^!=SAT[/ahWHNFT7jh9q,Z,]@XVEat4ZBBDCdirM3=mdd/R6ht1o9<4R5a)s%4e@ZlR^IldT-I?La2#_V0EJ-OJVX!jXR3Tr@s]lg=X4A7$.J6Ojj2=j*1O+s.$fiIbI1!iPUV/bf0@BdSXM6gbr?d4`NRSDW=?MM@s47iY%,Jkd6DaGrq,[Y9bb'T4uTW]*Qnd[n`fq)oVDG1Ci4p!Uu?0LA_:N=U0);TrKpP,V^g,S<-I2Q6,2^N(Nd>-GfN;JkM)YPYrqd^NJS00~>
+endstream
+endobj
+779 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 778 0 R
+/Annots 780 0 R
+>>
+endobj
+780 0 obj
+[
+781 0 R
+782 0 R
+783 0 R
+784 0 R
+785 0 R
+786 0 R
+787 0 R
+]
+endobj
+781 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 152.0 677.0 200.0 667.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 302 0 R
+/H /I
+>>
+endobj
+782 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 212.0 677.0 242.0 667.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 332 0 R
+/H /I
+>>
+endobj
+783 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 152.0 525.168 218.0 515.168 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 304 0 R
+/H /I
+>>
+endobj
+784 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 230.0 525.168 278.0 515.168 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 320 0 R
+/H /I
+>>
+endobj
+785 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 296.0 525.168 410.0 515.168 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 322 0 R
+/H /I
+>>
+endobj
+786 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 152.0 302.336 182.0 292.336 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 306 0 R
+/H /I
+>>
+endobj
+787 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 152.0 139.504 176.0 129.504 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 308 0 R
+/H /I
+>>
+endobj
+788 0 obj
+<< /Length 1802 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm<=`<%S&:Vs/cosJ+FqmlKY%"Y%[rI9@8STO-$V_^BMiNLV7B_`[#5[AHPSA1`aE$&[0+lGh3V1Kcr]WP,^[`u;fT%grSiG<]$*kQELTK->CS;Er6"nNpeq_`/A5-C%=hfW`LY5J$S!%Y[=`9d(RagEBqIn.2ajNKAmA+Ah\Y3$(+G_%Un+8Ihl6Il0[cI;P8g=6daaXc!C9^T6YV31O$%?%in^4t6&YPI+"#_X_PRCq>SI`W/o9Z7VPhDqZBYaf?Yodr\q'lJ9rk>oY+!`4L;?6GIF-qk<#;DSm*==AKfPg)/]-/OO.nOL$e=*8fEi\DfJjhDT,m]*.Zssu<Hr>$1IMM=o8^=4MfcfW3r;+n7H?qB\SbGHuRq)=*o>S#X7nYi)X.mV6K6?Kh<TN+\b`%H)7A_>GqUqf2G*K,d`jC)Ql;9ubK5/_4<Bm#Pbkn5PQeus(%P?ba)%KjY%^mT@l9l5m?&.%3Zg3K[<hoiZ3diL0hL]Z06U-OsaGXRk^qRU:c@k%JIc(Mu!!Q]]\Tbe3MejhBgh9X(1B/V"ADNIRCkuXof>d6Jh7]Fd]tM)^rBfca9l7.S`N!-i<SYnGfD6IFGH#^e_"6Tm;Vn7ClJkSDg:jOO5[UgC-,(^%H(MZJ(+1cN6B^Nc>#m3F-7*U_JL/]Y.G1n#5Q]dp<AS5`@kOfPhZo1(#b8_ZQ4d+Q^o7b#k05"BF7FDM*dmV4WDs7T]?a'oVT:/Dq1t;K(``cTP-!(6&o]g]]))J86BT@m59lAK:ikii^lJT![FchJpLRl%.o.tp@MB,'<b;,r1`;+VKO$^1M0ML0(F)Yj5V*c<B*0]E+tmQ<(c1bFj@(ipG3AN]aGYK(G+;qWGsP$CJmKu2%n5=X1a"Ajcqj^)o*j&']%knmgq2aR#rBMY+oZ/I@t\Y'#=nHt,eL5dgHLsI:N'k:J"BM4*i#;84%20?E]I,W4J63,a^ZKf&.]HOc@fM!SehYu"/gWIdUj^EfcuubOPV=)SICH$DSH3u1d3K-WPks?MR"C2_r3)+;!:6_=N.#V'B%h[<KcI^8<Z3g(ZG*P)/g$,]/]19%UL4kL9p&J[J8joW/X,IOJ+f*f.3DDUugi3$u'_A8477A&,:el2>:=P:Cp#Q$@#frA-A*)9/<38eC#=Q'T-;=M!:7+[TF!+@pmpLY_\'2EO6UHbpLb?Sn#u"D+fr=<`:td!5fuH8CEIc5A.Z8n%K8`R0edd6OQ?f7F;4W=Hfpb19[Vr`R^R!Tkg\Jq"rBh+),IbECXV2B85`+CnB[^AqhS3^oBRSUtpfF6_asOH;@I(9%CL'Yp:OpJ>>EHcds7S5*</3G9Ff:=PJ.A+Ou^0%$bPdK"`#q`O!XYlZb<4a's@A@X:7%.t#\07U]hSfJUuml.nZA$X=ieR,$:%(Os[%RsT+qm<e<n)e,%ZkO-+c]i25Y/sg_6/F#MR3uX@B?ERTg_<)JLnoSdc!$ZVTH^bb27O1?m0B-!O"B,K]*8lWH[!9#H_5C667LFSg?_sH`%IHgH(uX3Wid6sR",Sq\l:OgU.3U;Z#m"J7D\+/>Y0)+/5jfuTGo`te-5c71aa-m(i<,![mG[Z]'J$e@RLe:@8Ua3/[]`ZifBrrjF;@?I7O.Z+;$]Sq+'2<uQ)t:M_%sbXbg7&G2<@;0f3u.Boe><Jr;MQNmcq2N+-'4:^/4$>XrU`EJ!!NnYQ!lhU6r-sCESaO*f!?*oRk'T;1E/iCoW@<*Bcdk@bHfOVWba+A1K*-E9-UG=o@%Bi_6N2ojO.K!dfKJB!qYdm&a%G-iX9Gh@]#~>
+endstream
+endobj
+789 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 788 0 R
+/Annots 790 0 R
+>>
+endobj
+790 0 obj
+[
+791 0 R
+792 0 R
+793 0 R
+794 0 R
+795 0 R
+796 0 R
+797 0 R
+798 0 R
+799 0 R
+800 0 R
+801 0 R
+802 0 R
+803 0 R
+804 0 R
+805 0 R
+806 0 R
+]
+endobj
+791 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 152.0 645.0 236.0 635.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 310 0 R
+/H /I
+>>
+endobj
+792 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 248.0 645.0 284.0 635.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 318 0 R
+/H /I
+>>
+endobj
+793 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 302.0 645.0 320.0 635.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 324 0 R
+/H /I
+>>
+endobj
+794 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 152.0 520.168 200.0 510.168 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 312 0 R
+/H /I
+>>
+endobj
+795 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 218.0 520.168 266.0 510.168 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 314 0 R
+/H /I
+>>
+endobj
+796 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 290.0 520.168 332.0 510.168 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 273 0 R
+/H /I
+>>
+endobj
+797 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 344.0 520.168 386.0 510.168 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 288 0 R
+/H /I
+>>
+endobj
+798 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 416.0 520.168 440.0 510.168 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 308 0 R
+/H /I
+>>
+endobj
+799 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 152.0 417.336 200.0 407.336 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 314 0 R
+/H /I
+>>
+endobj
+800 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 152.0 243.504 200.0 233.504 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 316 0 R
+/H /I
+>>
+endobj
+801 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 212.0 243.504 236.0 233.504 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 308 0 R
+/H /I
+>>
+endobj
+802 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 248.0 243.504 284.0 233.504 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 328 0 R
+/H /I
+>>
+endobj
+803 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 296.0 243.504 326.0 233.504 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 279 0 R
+/H /I
+>>
+endobj
+804 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 344.0 243.504 458.0 233.504 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 322 0 R
+/H /I
+>>
+endobj
+805 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 152.0 91.672 188.0 81.672 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 318 0 R
+/H /I
+>>
+endobj
+806 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 200.0 91.672 224.0 81.672 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 308 0 R
+/H /I
+>>
+endobj
+807 0 obj
+<< /Length 1996 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GatU5>Ar7S'RnB3d(4uX>H6t;.>A:7j.\,ge4>j1;"oO,Bj7Me\tkS!^jc3Aj9lJe.S`n&-"P)<q=pMMnn3.<icT(JT']Y5r5c,Y8$:shO))`%?Bk;0PU';<Z9FkiJaEW=f(77.i(k_jMD_F;KcMi5G5f%`P`&C1=1"u'X\W!k%^^nTlYNrp1o-[s.']OhX5TMKkXuI!a*s\]k_,lN6Vh#.2gik<G;i,Qk.P3b9Ls5\r)FH]U-rVZNm+HCGqk"oEj&fD"*?`)GqIWaDUc%foodSHYtEEd)P/1IUmeu)>crugoGi)(W:`8lV<;X>es+bi't+]#09g*&3k*[__5\9M0F1m&-Q2XEGff4J(jW]>`na,0WgXV:L),(--HjDLFaJ`HZ"?F)X,o(]C4F^s`VEm8+n]tL.l0#tdCm/OTEtFh)L0Hch>8:0:/YuQ]lW6A!Q=T,,^^H=4&Rt-bLQ!89WkPUUBOf(.@.>M][-ATGE+>iX-XZI<[g]T"2<p@U;VF9e(02.'&+<RRVG=&=k9T%lU'*sDF@j%_8S)s;8#t^hB6#<!YaTe;t-A-pcq8h.Kn_fbqrg5Yo;*]1SnmZhOM!*'_:B[e4A,[WW&B792OF/8I):LJU<asFg7YHL63&*F$[t>q\aism/*7#4#hn:QK2p;quitAQ]Hl8_-+*&3u^8;X)%g):glmt%T%6P$o33fhJX'>$7.+@eE7N3Z=I;C"cdaUL/mX:UTeK!poHj*jB%^@^H,m>9W(9M3]Q(;'801F5rZD49hOM5+YCrrG5h_F]6_6'-SV6kR,&$Eg"j^G9GRnEBMH8#r/];:"NF_%_sku1-=OfM$A)bV<(k>t2)V7])VDZ\D_g.0E>Xr`phh45HGoX]GiPOC'oe<Qm!Z@+R_+j38aY0flMg1KdH0S,FId8e[HAMkFMLSniX8E5*GTeFSIKJL4=BEdSt$cuiOPD7Q>S&>^*^Q'O(d!"9cg#ZEZV52$2Q$!3BJMCG;NAZjhmb,pCe":e,Koii.i3VD'RTr0k^k5c&H'XVj#S^Y&%Dj85hU,G;YBOQ?PAhJTg[H_t(F+:bEVPfn<QLB\F^<%R3gZoWOT4-NhMC+OZKK:8PPZpJE:c&S2:UU<lZOLA_f!l;NMumuIl&!HcqR'AYm7kif$%T^1IX0[(lIZl]&e3>.B,gOL+^@D3M=;CgehX0s7"rh1!6*#\ldqVM.$TjbUUr.eMg9i7*g3KTl2'UKHd2Dr!j%a51)fCOW_g4s:`$)/eYC?=m$!m6G/Mj'?sa0.,@Zh$\,h%*uLN<75p89/"_qT$,5H_0WEJXP8`FI`h(Pb\0t".(YKV%6U!mWLQYmG"N&3Qq]HeUDGmD\J'Tp/4E7rLh7KFP\tOWY=026H$!4q;#`GEJoE$Gc:/er`Np7E+Ime\3o&u-[B\]!>mKl8$>`-\bbR;Lc*G8H/HJe!tM^(oqqm:1S.A'B+D8O;'LFBaV\Yb5"$nZoL2%FhuM->]JV?shV`"p><]g8H&LPPXa.S1UOn`#Or;uHhqG"i1]&*1fN3sC-noLaBWD%(\g0;,+^6Tk[:mV_1Oq"lb%tRj;;K9NhRNYl71P?Ihfk1#61bEq:PO!VqmIt]QJgg[A:%VR@bT=V@Or5AFX=$1haXInoo!hkNs=ce*Y:3he3&>.IOJJH-,U;&eb_U,75cY^1i/k!VP<1OC*BJT!khNjFJF<N(uMtJ^OCNXENn_S:2G8pn>*(bgm,ha='7JBq?IQ*qJN$!D_W6%]N"E^WSMIYgV3-ug)ZsB]d+S1O/J4\(P[)tnC7"LK\Q(2<M3D[fD">`<5JNXA(l\j?PdhBCO+6FB_4M2jFI[PPFm(qidl,OnOfKA)YD@9Y/]/0VWZCdm%,_f;A^qDc/kGHYG@4Fl6``U@h55*d2-NL8^_eF>uRG9nJiqE+WkVnB8>oXO)BWD"Bt7p9]Q7K8IC'B%BjAsj*t'>SE-<S;]bGA48!TpUuhrO_X<ad>HO[ek^O-I,AI~>
+endstream
+endobj
+808 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 807 0 R
+/Annots 809 0 R
+>>
+endobj
+809 0 obj
+[
+810 0 R
+811 0 R
+812 0 R
+813 0 R
+814 0 R
+815 0 R
+816 0 R
+817 0 R
+818 0 R
+819 0 R
+820 0 R
+821 0 R
+]
+endobj
+810 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 152.0 516.028 200.0 506.028 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 320 0 R
+/H /I
+>>
+endobj
+811 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 212.0 516.028 236.0 506.028 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 286 0 R
+/H /I
+>>
+endobj
+812 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 260.0 516.028 284.0 506.028 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 286 0 R
+/H /I
+>>
+endobj
+813 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 302.0 516.028 338.0 506.028 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 328 0 R
+/H /I
+>>
+endobj
+814 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 356.0 516.028 404.0 506.028 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 316 0 R
+/H /I
+>>
+endobj
+815 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 212.0 506.168 242.0 496.168 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 279 0 R
+/H /I
+>>
+endobj
+816 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 260.0 506.168 374.0 496.168 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 322 0 R
+/H /I
+>>
+endobj
+817 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 398.0 506.168 446.0 496.168 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 290 0 R
+/H /I
+>>
+endobj
+818 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 152.0 387.336 266.0 377.336 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 322 0 R
+/H /I
+>>
+endobj
+819 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 152.0 213.504 170.0 203.504 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 324 0 R
+/H /I
+>>
+endobj
+820 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 182.0 213.504 206.0 203.504 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 308 0 R
+/H /I
+>>
+endobj
+821 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 152.0 110.672 188.0 100.672 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 326 0 R
+/H /I
+>>
+endobj
+822 0 obj
+<< /Length 801 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GatUq?#SFN'Sc)P'qTRN(O3CKO*I*?Z'),e8qi#MD1Z's0J$Bu:d3Crhp4l-S<0gcX`@pDpmgs0kOJ'Y2>D,B!%&6X[2U6m+(0WCLOgji![Gcl(T7F<%P`[U*J#q4aSZsRR@iT?R1iWH^X)?7`!c6(8(e/1!d/:!0S!#cj#Oh)icCGP/l2$+rIb)_6;ZgkAqDd+gPnkl2U@RsS<fb,W2/7fiO5H(\&1%Yp7\qd)l;\V^LbE)(do;9k%0Rtqr!6TO5A=>L0P1sH=nd5CC27I?Kb*!`!lg(fM:G^8O]<R6&)W)!$lnfbArKgdC-:@fBXs(0n69qD,hT'+E&o?NTr"8IoM7Y.%JcW:[bqXDs#lV9@>N[ppM[+P_CDH?b75jT3k;?C/X77o;]$eCT/*'(9gJAkV@%,Pnr"'39W?JhF9'V*4h[7'3f,5U;KZjg91`aos4ZnPTSI;Bld*,W]+qIUcZs/5DTa"f!O#?375DU+H/7olqIFC#)Q*%@5%=R/+13UbZ<8dj(6YGL4h6Z,Mp_r\J(hOU5rm8omIEa>T+I=:a5nR1lIB4]@otj"M<iT?\^EP%Rc!$3'54@r0.>PIN-Lq)P%B*L\VY!$O1a0p$+hgER^Ic([1i.HmZJ`&RK3;e5R=mqPjbLnnmfoeULiuI&T&oWulbdlCMS[<15a;8l7U<%W&UF,qbc`/;Q;G$&7@0H9->M/?UNT[s@Se+:*h1F"]<\ZV,\_Bpts!p@GNPAsd(L9!1"%(7?7]rM8*f<8s6'*ciNM[;%_rpPjRUA1Io2%u-tdIfW,6dFA~>
+endstream
+endobj
+823 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 822 0 R
+/Annots 824 0 R
+>>
+endobj
+824 0 obj
+[
+825 0 R
+826 0 R
+827 0 R
+828 0 R
+829 0 R
+]
+endobj
+825 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 312.04 660.528 357.6 650.528 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 498 0 R
+/H /I
+>>
+endobj
+826 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 152.0 632.028 188.0 622.028 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 328 0 R
+/H /I
+>>
+endobj
+827 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 254.26 541.696 304.26 531.696 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 241 0 R
+/H /I
+>>
+endobj
+828 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 170.0 513.196 212.0 503.196 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 330 0 R
+/H /I
+>>
+endobj
+829 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 152.0 410.364 182.0 400.364 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 332 0 R
+/H /I
+>>
+endobj
+830 0 obj
+<< /Length 2397 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GatU59lo&I&A@sBW:%Xme-s/h1"5BGle"p1a4AmXdZ0Rp6p_M5,bYjH?00ZS,UIGs"Crkt?OR6Clor'f]S1g(*kf,l8&Vb#d<'A=O-W:HA?.pM$6AeBBL`hXK@)Lp4e*)@3ZXde[]R8'H#rsN%33,#9FA%:7ELr[*ISi#h^P?"LtJiWS\_6_(lWmdhANs=7:u]?>ji.$gjN;-=?"<8#"E'1R'nlZks"(3qk'``(`#_ST??VDj6u`oh12=Q@sJBY;D<ts?;dB`TZ$>R?3_Q*JQImhXdIXus2[ocZ+/irHoku?GV[+Ji&OND@ENXY\;\G.".Lk;,;Waf`+-+X?RIC"BgK#;9(I@DnlZZ0%B'KF_!U&QQjSj"J/S0+9teEPI%*O?BN-NQHR$K%X>%S)*ptX6cIDZ=g+Vl7Ll;GZF7FWs7T8ODnV?rDO!4-H9u+;%X]U.Ac(mZ89TX$*o*'n/0<.?)"0tTP.LY)Q%[\S:A>-!^#+_YcMl,rb@F_GZmRTK&^*4G@-i;ZC<B$;9E/Rk\X5X;f)Vf!]`o&KR[I)tuq=K'mnEeZQ@cEO\PB1tPU/X,Rl#sQn$(,D>!^ZE_JFOW'N)qiC_HiaX\^JN@G<;4_:G:Qk_#@>iPaJ/+EuEft[hX>P)ajH7k1C\@33Xc-V$T2t.Ks2N>T63QZCVa%.o0Q-._WtarKc'E(Olph"Z$r&[?ITF28$i6e"EKhhE=KrC4)S0piF;`/07s!Bumb>E22DJ;$H`"=5a!QlnLtZc44:g9*XN..c)kYe9QqOL`+:kGm0^,U]t$5dIEuOLCWs0juk%Tmu95br@l`uE@eD<orVA59Z8%tZkq1T+BE%!(Tl97hOQYgR8[f\6U]==0o*9UAM(h=e:O>\D%/=qr^q]/eSkVJ6\`)Ybt*s;W^EmgPV:p6S2>Yg)lZ:(0OK6X!6do.4;S:9Mqc?<L,4((qr&1MlA@cGJKeI*!`gF?'NHT5RdS/,e8@40P'Y`:CQS6N.L\jsJ=CJTdn)LprGmcjGc_qe'Nd)YT[7=GrEQZ!VqJ%@k-g2,);-O"4HIr@d:sl_#+FcPj#mD9;"--"Sj?mI"P\F9]=Mq_''Q-h6Q2q]k(DmdqZ>T[*".4$4@2/T[VfZ;JB6T^^&@9n%ELsa\(9K'K]+QkOWj4j7Z%ZFoHKs+k"J?nYcK2e+i5>S>h;eiqKlECL/iB4onK,JD)u&X+I;JCq[T!`mT\VZ?qi[-'OJS=rD&,0@F#B65M-mg;/PB0AV7L1>la`027P%L[9l(rMRAPJ!GC`R*K*@KQo%@U;0NCh*_1i`mE-lfdNI\3cRdHZ#LE*)J"'1<Kj/JAL7Oc]9:!*UfQ'?l>Fd'TT1G:pmb"ok(XIjW'f/-qNqsB55n>`o[t8L*bt`EN\Do;'cJ;LK5XZgBDeef&W7"jh#4iYeMR(?9FH<E0XrGsb;,:eKD9VlFFSs.$-'e2,&)%P-5i#!\1U^fgo[-`sLb%7+l?EPo_^I>!AY(ce6l/]#1,EDs=&ij0V>?jHUQpL$F*=:\9<:St4>.&6RprMNWDHYrJeZIO<RpPK\knX\kRK!%\3o`:n!i&\M?UQuOjf+3&=2,4nZ!-\s3fAgWEA^._UE=po@a<2\@oOX8XFB\=fO",d"K"@aJN.t][G!"3kk`Cm'RZONj,DeqU!'3r63aMpl_Ym\(%bTb1%O'rXHD,MgtrSlaO&S"caDcN9@k72!&)k_gn_s*EIH7.+sPb9as44OR0a'D8!DEZH3gs>/k1bae!tuf^:u"LD,6No*png;CscoD7R(QT]H:.c<MKI6oi2E_2X1qf/,oXC>j3M#UHcl?W'X?9ckZ)ndFZ"s4*3HT:RobeeLfC1]n*2pr&MU[U/8D#XEE>&q6>&^mYue*qU-JQ(q7HFPXZH_H:pJqB3E";+iP-eei%%/[`gkd6$KX1fg5'gYrDE-_la9b<b<j#;W:$#@)$d:SHNY;#l-,Dd^"Z$"`,+/$Q4[,/'"ZaOgjdmC'e-E-Zm-rpj[tCcgYfenQH`C1pka^LDBWA,A;kM^h`K)omGV:=0_Tn3b7L.sgB#YNQWPf.#P6+*Cm>k_UBaU$ENu4Yf1%8]5\^`B$/c]QiKDe#+O9GThq\kEK*jablEE6Pd20D[K'sfY+aq%82QDFFi"h8R%nq$+a9WG2YOgkuY1j9"bgj>_f:Z<$,()c\_!U&$H)W^$hV`3cR,>>,9/g:/.YTPHhQOW<j31ko!j2J28]T4u/QDQ/1'+QfHslTd>?AS3:S#&WSsAlh>L-1gp"&[J`r`Lo`!3gW9eicFOgSEIGKnUKA:_<rhoM_FK%FY(A=4NbsQ_*U;dUllP%7.2cuPL`c^qbSj!od!_n)Ar8Y9BgLe*bq(4Ng0"q"$@eKMP]tA:]5tWT*rQUk$]O$~>
+endstream
+endobj
+831 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 830 0 R
+/Annots 832 0 R
+>>
+endobj
+832 0 obj
+[
+833 0 R
+834 0 R
+835 0 R
+837 0 R
+838 0 R
+]
+endobj
+833 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 134.77 669.866 186.43 659.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 487 0 R
+/H /I
+>>
+endobj
+834 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 169.21 508.866 214.77 498.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 498 0 R
+/H /I
+>>
+endobj
+835 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 338.37 411.394 383.93 401.394 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 836 0 R
+/H /I
+>>
+endobj
+837 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 152.0 224.894 224.0 214.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 336 0 R
+/H /I
+>>
+endobj
+838 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 252.0 96.562 297.56 86.562 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 564 0 R
+/H /I
+>>
+endobj
+839 0 obj
+<< /Length 1925 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!SlgMYe)&:O:SW9B-Ke;?fQK;*m34)G$\2XIi(,0g9BdCVfSP+mjDpZjo*G/^/@g5VZcV$IX6BO9!.S=)Cun$B\dmsL$Q[U[Q'p)Ik^7k=oE&M'_4(-8]@K[ssRIGR3&\GY[;q8MacJTXM3\RPT10A*$JWjaYr30>T/Ad_J:).cg4]P=%ga<Sl3Y!0&h]XTs`_->p<]]R`h:XtQJeSbabIBabdlX>7IAfh5(W%SSeib1#:,%HT\o%G/0m;*:W3_V]qF]+&o:6r=$iqPeETu\0"Eb$k&5?"s\%2KK>GI'QSJuqIG,olrQ299f[8DT/Xh.LEh6W&j@#/KkpS&4NSO:5_Fn1AnA<hI!uMZ9.9#Ee&>BdcY5s"Y2+"j[ha=%lWtc<pfpP#!'"ZR,Gd;,QC'00/rs2r>1M/,ls<F`VeKoj75nWdA!=g/NZ6@%oA[ii/0SK-T+hGpb&,A_W#gN^7NCbWW#A.2GC"jOPZ:Y0%sX=iD'*nFZ,K&a%P/@"-CHc7>#"9/6Ns7`^p*^-I-C79sNlGlm?XZ8+jl)@jPCAt#O-k3*;HqS#6jJ\2b>0F*5KCG`R*%TRYH;-?\,c'Teq('U/\jg#1T#mTlcZ;`qKCK+E6;lp:D+FbWAC]_N!eJS_NnUfkD]FAKDajKM1<HN75S^Ih:48o4A0=6U;j,bjN7slR7BLu'Y.6)X&bB?aV38V..^fi;4$umWYbV[mg3"K(3=To52q6;lG##Sod.;R9WPIUm_7QcR8A_C\bE7'(`[K\[!k^]4(c\+N'<K!=RlR9*4L7qP<"Os%m1\GLP'NrEhfot"Sp<C3oO<.TkomP^-8WW2hT2*^-cVHdN<f?#qa7^Md#F8B7X^NOGa%J:2<f<6YU!t%+^YAeao(_9ZG'%rT$(;@tDZeY=,#eddFsg0s7l9M?+MR6[>2NI_]d<c6!3)CfdoqLJFubekeb6`1(LA*6Oh9?H,FHmc&D)'<W=q1dN#+KhO3=s]Mn7f#Y(1ET(bLiir=Oft)ceLLK3C3*QFm*NW`Yu*h@i-`&C2]QOCsbSmYU65YqkP7e[o;u`USj8aDknjJNgi,mQ0HLX[K#FWG"(eP-HKj:>T$?^:?`k"f;5@V_^J5$=&NlP45apHdXH64l99/Dl&@L'!+HMfW[C0]m5"+<5Z8Z&M2N\c:_X.KomDAi4$\JLP5:$ID1Z*_&mQNpfnOC+Q[=@b[\u.S]uN#a,??GSE5&Wl5I(]?Z>&^O=aWFQF_FCbHHOQ%e,A&'PBEKRKCi[36YRiBm_A[J<U,i"6)WfE2e:g(D39-VMKIRZ=0=_J#(Qc[^-)H:J"Js2B44/YkJ]eD+]l>;^VkB4Y5bl3(.+X;0<@)VOAI!9(B[+o"%\o/D>+,FePQ>F/LY(1JDR5)n*/b9lHQZ>Yh0Ter(crT?ZL%"@55_4d:/d9JER)GMTCuP5bF9:Z=5toMPM9)oPK#jALe)(qiNLBko)]K%;Q,@(boMU5/m8@R.=:7@m?jnU01E?7q(J!,:U!]-Yj>s%T(`02alZO!#?D0IF_fX;)0!U<j5P9=AO?$8Qak\>^XS3Nc1*RHD5Zot(3^LAIUuHG:E@_P>F9RfTui'ffdiJ&tnps.H)DIgC/8i=9bR#Y%?1MA;r='[75HIX&s[+_(J4/X\]k6^S6.#nX':8I>?1oXJDV+`i$Y7&h?XdWJ9tq1q"U6Pf]\?5\^N;I5!g)nkF/a&A004\$Bl4hGAhO6i6%Yj$^QRmt%V%ia8-*Kco2$XVBK['^Pf5\kJU2dZ0g7L,n\!cR:D^8]F9cfN>&rr(,]B8ts%lO9"Q[=]9Z8Cj)g\eHc!qk*XHA8sg8[0T5cZoL103_hXY8`->[Tk%F5g:HFJbp6.W5Th1H$l`Kq=%lYkLu5Or-%C-FBGgBJ5$r'1.#8D8m`2oeT?d00"j)L+K`~>
+endstream
+endobj
+840 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 839 0 R
+/Annots 841 0 R
+>>
+endobj
+841 0 obj
+[
+842 0 R
+843 0 R
+844 0 R
+845 0 R
+846 0 R
+847 0 R
+848 0 R
+]
+endobj
+842 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 152.0 562.0 218.0 552.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 338 0 R
+/H /I
+>>
+endobj
+843 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 252.0 476.668 297.56 466.668 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 498 0 R
+/H /I
+>>
+endobj
+844 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 478.9 460.668 524.46 450.668 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 498 0 R
+/H /I
+>>
+endobj
+845 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 380.32 433.668 425.88 423.668 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 564 0 R
+/H /I
+>>
+endobj
+846 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 152.0 329.168 260.0 319.168 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 340 0 R
+/H /I
+>>
+endobj
+847 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 337.27 227.836 382.83 217.836 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 498 0 R
+/H /I
+>>
+endobj
+848 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 152.0 118.336 248.0 108.336 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 342 0 R
+/H /I
+>>
+endobj
+849 0 obj
+<< /Length 2012 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!#]D/\/e&H88.Tj_:JTN4LpWu)%OH!+!$XjO'fL8H%0M7/8`OseW`o'^piD!<?FNh(<.OY7Jm4Pn8&G7Ts'iff^1Sj=pV1?/+dALpT4@DO$?+rf)7b;K76Lf_UZaZI(CY>1'+E?*#QGEW1D8WaCH$h:`=VoBMtI\UfT_m%r\gQ_#uC,FS7,u:&$_fj2o$J&TVY)"Ci*mP_le$rGn>?s"QZEehkVqD9f^7EKk@b!X!YXIt)mhU^pP+[.Qk$-$*h3R;.,k;D>>SsRn[TE>="Ka>L5?sc654QCp>J%Du;.+^a,(=mm*Cl6u>]d_&MG9C[O*A[?P)2o$1]6qY.I;N_Go7i\>V(dB3e8Ua>DmqM.oVosT=!1!P4;Nb^LAXi;k[a`G*9-k=01KYSh)k`;)rSIa,FiRY'il\h8j\*79h0*j/D9d#V?DbB!SdeQ:13LCmu.PK:HNk$Mo&rMS,L@TX\Im4iZg!A93PgOtJFN._\/Vg(kM<L8^l\32BeY4VtTKFh/bL*cddWMBP?$<Zt+6?6pPp7QDWA.Sl)nQqjS"3CnR/"t%_DNHf'6m_(d6_io1jjo#)Dn!DYp5@*:.=jhY'PVS<6("Sb3Qb65e[q;I%)=;R/S(I*n^:hnF,:'M=km5e85q&Zl&o5_@V9%r5KsZf]M!7R]M`OO=YUV*t=pd3U[64I#B<OPV`-U;F7>qmMF/7jUm*dd?<pP]CN),7(Ypg?^;Cnfo3phW%lUfRcrnS^48H:Qt&4(+:Xtlhdm_\nm.V^?))KIMj+H<)0rGq`-o(qo_r)=sRYJ4(!09srDp:&gPI\!$:SAf.6#k=C`q0Qmq?k?PM2lJT!H%^@nW.:W5@IJC!JdkE#7Ha]P"ijZAViQBJ3G.K.j&D[K42e0-K<X2,$kdLs@roE*n;iSJ4978b:\A2SjRI%q\jVhPc[SY@\A$kBs1H"["d.B[+Yf(2;ER\hJ/qDo#W[n_fV\&:QL1RSO;V8ff5h$1SEc3:,mWIi<5T:8=@+r=92aJc&'FZI;DP8N;Po=f.V4`R@n<QA8V];FQ#soAoLZM'QN*FoMhP*<ApLD<*fLW+3<69sL8^Dg0WF!XDG++Y?tTR(9k9b"<T@tk^$,1QKc&4mo4uj-@73S5m*F.O4_D0F<\l\*,GE^L!`lXi1B9`V:NsJ3.)H4J,Dt!'"uQkM86:W`)/Rh)d.*l+@\!$4Ig0ENJ)NZ("F/l:8UYKP2Y>B_.#*?c@GldN<Tr\m!BmmAEcnPZ_aQ^R[T6@["ZhrY9L3'RkQdESVMnPH`E!OLSlC#=MKDCHn,g?seMnOh]ltHG07\K<<Bi6%Fluj\FLN^cNc^srGIua^YrfbSP9e\`!,4ao/=*=&<OnXZDb\juiTCeP4)gnarKa)\$:2pM-!!IWk8Y;sTgZ:(\,:6?Wi@.a)d>r&'Kh#P^'4Jal[f#lJ[sK)1"QW]2@TE4RfgB/.Io^a_psVF5t-,i$*0ptfb/0alh:uoLfPl_,dQMo+iJQ$WPU$CVm;>.*1%t5"'[X#0:2>T=eR=KkHZ@$<MAT]q`f?gc"="cKc*>!J\iSSXQUlu7Wo(1l.&>\>W#Y3^^jW3kZZ:.Ot2qnBX6^p!aFQ$<\u^Rk<@CidHT1s!]m*-)>'T%TAC)OSh.o7%7=HShe#"Nb#3Wg\>W;S/lF>A1r@M1PG\4K^+RtHl'tbpJ"K^?BTfPThF=?B+oh"WZlV"q[3kcXU:DO_.nE:)p@iI(b(V@`$6Le7<dLeu<0M(:L)JOl\b:7j6E`ir6EOg`#:eA#0R^U_a#uc^q8=Xf1s4;t@eU:f4Y58gra3_9lq%Ph%?nf_0^*??p[Mcco>SOriHYgKnN1)gRA$f(\p$b,U&<dW(,+?*)d_NRA.7T(DLjYd't7rs)*m)?U?rcXqW>*<i'nuVZRrC%gPg:q\lf=a\aj?rUEBQC%<Ns_l$6fTo*+W-7Q6`o(@_]Qd1C3!P8aN^ULf<VO%YphXekC"DkoSCkQ7:k=JnXe@i)>lpuEAi<qth~>
+endstream
+endobj
+850 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 849 0 R
+/Annots 851 0 R
+>>
+endobj
+851 0 obj
+[
+852 0 R
+853 0 R
+854 0 R
+855 0 R
+856 0 R
+857 0 R
+858 0 R
+859 0 R
+860 0 R
+861 0 R
+862 0 R
+863 0 R
+]
+endobj
+852 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 252.0 684.5 297.56 674.5 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 498 0 R
+/H /I
+>>
+endobj
+853 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 403.92 668.5 449.48 658.5 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 498 0 R
+/H /I
+>>
+endobj
+854 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 363.38 641.5 415.88 631.5 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 140 0 R
+/H /I
+>>
+endobj
+855 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 152.0 559.0 236.0 549.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 344 0 R
+/H /I
+>>
+endobj
+856 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 475.85 484.668 521.41 474.668 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 498 0 R
+/H /I
+>>
+endobj
+857 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 402.26 457.668 447.82 447.668 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 498 0 R
+/H /I
+>>
+endobj
+858 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 356.99 392.668 401.99 382.668 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 98 0 R
+/H /I
+>>
+endobj
+859 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 252.0 343.668 297.0 333.668 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 94 0 R
+/H /I
+>>
+endobj
+860 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 152.0 315.168 194.0 305.168 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 346 0 R
+/H /I
+>>
+endobj
+861 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 252.0 229.836 297.56 219.836 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 498 0 R
+/H /I
+>>
+endobj
+862 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 417.52 202.836 463.08 192.836 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 498 0 R
+/H /I
+>>
+endobj
+863 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 390.86 93.836 436.42 83.836 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 498 0 R
+/H /I
+>>
+endobj
+864 0 obj
+<< /Length 2335 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0DlVlP-&HC$_iR/6%#Ko0A70sh=-7%^3Js&kUjF`Q?[O/<@k^an,IJ79o[s(":BrB'H@S+&th;@YW+2QOdbjH'KdsJoA9CGTa85G#UUhA<a]QA:'F51(UmsWk0#2urAlh(^V*T(/JBMSB`,0q=i0cf`S=!@THd/8IWr&L?%&iuq))5gF4<g"#J.=0(8[,d8cI/;P)5"PN2^:2ZP8n&?^pf3"j%B2:iU)AHlVe(^MS^V6fVK"?RYK@a6D4ZaI8K<FqS>!FPYbXhd,g4^fHgY)!CbeTA'R@*28u#O\V=>(QH'Vr)75KfaQ'Q]]B`-+p;Io\Sbt<jF&P3?9@U9EmeEXWj>2?[t!^!&j[SD4Jf?:'T:?*1[i<_o]1_NOQ1iLWnkF\`c18Q<HjOa5fqYIuV/YY@60_PaeT+Kh%R"PIoR"Ro]?U]p6`Ft+mV9"jj(0Qnmkhtk(ouDth9UIs$o90=$71P'bRGt<(47_%`FXKT@4rYaGGN-Ye_a)Rk!C<O#h&]I4dLl<+17U5-g7m.*pAbCKBO3m%9eq!.MI)HoG]b%bjK=BCFF@.;b=o>H6.A&7po>)eghn[R4T:;1LX!ZGoAA'rQ=`bjE)ZG?%'XlBa(:#H`)5\1I>eOGJ6@&h$kV^do_?nOPa9OL9cJ?<f+.Y%)dkn2<R^?CC1B:*kSpT$(oC)\-N,?F%MFQ,-#=>ETX=4%XR`a^#gNS]cK3b6KsJ.*Xd,I)E%LXf<7%Bm4E[`%\Nm^6O>])if3ML/2qr=/Q`Pi]r\D,'?4O/jQVa%$1?h9d2Xo;%4Gi3<pXdg7l#CZI",N`(3ZkI=G'h.='m=AlVP/88gbfIK1MlO7/(u8,^5_.s@d/ce3>,0k%j[l"THe\n_tbdPdi.7@e$Kh52]IJ4'2C`knjQT\3#IX$X6st'].tXb^@d$")'ft<l)MluKhAM-<6Cmf7jT1Z>*j0\l7t[P[lTQWp-aWa)7W*tK(<!P#0F4b7Z_AB-DZRcP<X&,WXHge/8j=b.n52b(WMPL,`HWD8#,,&jBUC1/P+GMkEG5ZkJ?9QV]kc_/:<8[r1Heice8B*LG5^+g@fP&(P7u"?lRPu9ue9*(]=_J7&+!9:)I9-GYAu'f+ZfNg8u^%"2ToAC/V]2[LAgdWSdtAAs.7EX<]44)hOaJ*9smUCCGuff.grpd:NujrM@dS!0]:TXpOVfmL;]h,'QWF^?#c3q^h*l!++@!1tZC$e"S'=`;IGk!^Z]]#SipfI@j_M`cISKST=$7<osN0`#19?j&C+j=4T5QpKo-k/;c!9TgI7#@="m17DG)?2k$HD]j@RFB84B@/o=D$oS,XhS&])sLQE@l,=^P-(t!4q?+RYH?4.*Q=W]pJ^DG'*f8NZo;PE&8<X>g(e'dMe</X22j!Gr@lHCU\<TYV^/n9hJ@]Q52GM/ZAgK-aIkW`a@/DXJ%?)HZmInNkp#K?:P<#K,>Sh%<0_i$J1YNK%@A#YR=YLF;L//C(djh$*:nIT%sLrnLnm9s1se%W3@"YV\lr)Hk<Qn%'C6?1)iR368gCqFr[D>"XB;5e:c9lA/1mYa"4&5UahWA^mr>h-Uth8,9\n+L'-aA#c>4P0I3'=gB/)H[1A9LgFTKf?(B3BSUQ[k&K]n+M4b;igfDgDoqsf@4'Wi8_O@p=9?Gn1eJJHoqme4@bW]9HSp__H'?q><5ge_mVDVCNd"YUDs'CU26^/WJ87?pFT\B/OE\r\c)2=bB"OMbh#$@=uP,^qS&l<<\LAaqlRWArWjEO+B'6aca/fKq4n,]M8bct[lso]GK!KEC"K]iX,bcjgQO,WW^J-oRs5C`Cr^4Z_rg3ipK+7T["AR,Bg1H.c\#U^+=r76AMsr+Lip<1T4^T<^^6@NV++PFemLF<dh>[OonNGKU]W%=05*BuB8G"]r)&ZaIk?L>J11[7"0s8u7I8rPT)?mK^a>9^[!]2cQ'8qkXcu(Y;_VF:*PM[]S0$+`!3U7KTaJ7(CRR_s;l<R>\,Gmk81h`e1okcYiTUB\haq)!7BH[S8Qm+(^=crVYd;0"0N]I%=uj18jTti%Wb69m3+tLT<IsFT>DKXWR4^u_eK$AP*4&Jt[5T/>n48No9sG9tf>p"(qj+Egh8L]^I]h=.>r0])!<I^Qcd^Za:=d:OK0NFOK\]>/0Z6V_%B,u4r8FqRb.)p/b?uXj^D/Oi,2N#YZQ)GKiqu1ZWj8;;Ib4*IhetL1S=OUA[sZ'\I>D[+L?A5Rs/,OPbc<[ocea&Jn?ccj\h!$Vl7NVKi\[]?<>77mmkH^1@GTZC7c;C1*9MJh&+ZrrR0]IXZT@bj']Nm>(SXk.prZP/+-a3OEr~>
+endstream
+endobj
+865 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 864 0 R
+/Annots 866 0 R
+>>
+endobj
+866 0 obj
+[
+867 0 R
+868 0 R
+869 0 R
+870 0 R
+871 0 R
+]
+endobj
+867 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 262.28 683.5 307.28 673.5 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 98 0 R
+/H /I
+>>
+endobj
+868 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 152.0 573.0 242.0 563.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 348 0 R
+/H /I
+>>
+endobj
+869 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 255.33 340.668 292.83 330.668 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 57 0 R
+/H /I
+>>
+endobj
+870 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 152.0 312.168 230.0 302.168 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 350 0 R
+/H /I
+>>
+endobj
+871 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 242.0 312.168 302.0 302.168 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 271 0 R
+/H /I
+>>
+endobj
+872 0 obj
+<< /Length 2136 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm<=`<%S&:Vs/&Ftte=OWus8k.j89mRoO2Js=hV@SPPgHoK!X!<JqfC)P!c&kCA?(_]/A7j,*Aj.7hk=;`<8,jQ+@gRX'NdO;iK@,4ZL?&."4gLGF/Bc,FEI7?@dE>SI"SmVM$""gakf\6L_QaC<CCuK0em`"7F^-Wl9;8ic<`8+/r&QO1$-Vp//Pch;0IX"_127Kh;IdF!^7RT9rif/DN0.aFn^BRk(Q$5YO!ufEeM>Gp&LZ9&r4"3m,9QmIq=Mo+@EdX'>^-8o[bJC'S?/cu9StSVX$We;j/eVQStB9%pbk,MfV+nD".;3dhG2@SNQ;Gj&@Nhg*oQ/5Hf7uM(XlAeDC4E6rV\n<&)hhuEY=6%3"f@3-5k.Mcc3)_hPA0t@saE/>\mph"(=]3jLL3PZm.[EF=es*J8L!8.\`PT;FCT5h[VO/3,G3`KgQ]BaW6^o"*(N!++guhNe;AaiD]Ncc]aNQV_[Z<ZJGfYM8MA4+N28*Iu)OQJ.Rs=k'q\MVGB=.9?]?VC2-A[k#8>A#!QH&,B475R_B:gXr?MMSWkX=VYR.HN:.Ee!EUU`/uisg/mBS=!$SaoCO1CE&@7.fprTjn1m@=lH3'_@dt-3WE8?&s/L&XncR)YW`05mN@r@"jLb7t<'[g3$j=KY2A=B20"Z-WsjrJ9i-<_c>c475OA)T?*2UGOP8M1fgLd[Gr'bL)nVQ94to]`]"\CprJ)/pms;'l1^&2YLsQd?cjLW?Kf?mdXb'dsga#WIp\8K<FR_eml3oD*2r#us-'RATh#og'L5A[QpG0HbDe%7!QG2*3jj8JjeT+?e;Gm'nD4&KZamG7*B^mXF'G.0gJY#DsV1](8oG=kn&`SA;&$nqa?3<J^VpWm:`)O;,h(8OP/\jJ77IMQ'r,;r:1B#LWYl5T[1446C:S*Hn_aQiZd6KNXj"<6Xn1-=c>(!)0n7-Y#`=b4#fh`Ue-I'Tt@qJQ?!mT>NOYJ.68J[PP;H.:T%]`3Ipc<V])uN<-'hmWudGA<Ch1JoZR^bb3`OqCNHf"F#t>D&A:m_T50fUQWZ?+>g$X0rNWAYJ,Iu<;(3lmEJCYW3n:253h-cHZ$rV>J`5QWhgQ\Nd6SIa[NUBos3nZ@b!;DgQouNehAWgghK^3@3o,AJWj9J3W8U/ip*:B\3lt9^<UZB;"&"j6l9e6&R#mBrT.cPHSN9[X"TEg]'J?jp@n@2e[JVi$ENYK&c&4L-,8lY2a]FLe7ss#Sd?K+!`jh];"dJ(!6#!DiDAW)Ih-BmYl[Fl3qOGY#@,6\J9'40ej=%)?eN-R7?f/=.GT$Skt9qurUfc/Y4(bF"6JH1`4Z:%Wul<I*PlX(8WthYLG0KW3*q:NlJuWDUrWR4q3jqa3fr:t\k`M7,V+6&JGHaLNp':[SnS"*fS[!]jrK$L]VocRG_\887%+/r!5p77k`Z"jpIX/D&o9!W7!'Wj%6Y-/S(jTN[p*YbHeH6bUPYJhK'rt7"qUU@8H[9mntja[a$E(=h5%1^;2<eN46l*CRfh311XmW;%MANN4ne9lSB_TFL[4JPcg</EPug%QnSC%Z@2pZCE/;N,b&SP[AX<8;LCO[@64%[6X@.d&dHh-`-qh\@fR3.DU5Rbm>F^<+2^+b!gmc4Rol0ZQd"P3ADUq>Bs$3;&bsj12mJ1/!2"/lZ+p@I,]3q",^&;1P^PVYF^>>+/NWVD"".6]rr:t(kVuTG^59N[_X7(3%d&@.]Jeo-?MbLl[;n+rgNi@n6XFGYIE+7b2!3XU/`u1R(A*:52j*-a4!iMpOXEBpbFNTh9WSJu%$ch7te>qa.2o1.Q,hX:5p6MZ'$ek7pMZW<8Egrjr\\1"=,8e/H;25b<gqA?"j:0a%pgD\gIdG0O5%&Z\3ul2fR+/n'rJG.Q]G5hZ_6/.*UGhn?/]uB\-GA/(k:Q)[r)g\0*UBo1E(>HUYd1(%H@.sYmQFUT;cl^#*p1jbUeZ%QkDSrl"4%!NEBNm?,U\YRp<LRcS)%S@de]!D4LgU[m;;[BlO26):-a5Q>[nNhmK;MA07F;E1b4"t=5I!rl9`"WZX/0`@3ac0Y<<4n"TZnG)YGM;J00<8lS?]D0TXWZcL\9S[o-!c+4jEJBAjL!A(I&FJ,E,[r?#TTK22~>
+endstream
+endobj
+873 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 872 0 R
+/Annots 874 0 R
+>>
+endobj
+874 0 obj
+[
+875 0 R
+]
+endobj
+875 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 252.0 252.308 302.0 242.308 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 275 0 R
+/H /I
+>>
+endobj
+876 0 obj
+<< /Length 2023 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0DgN)%,&:N/3Y^Wl>2+2t=f28E%SYg+KWNE&H8b,,FOMqMp1*A""rVA-3;?//mG1qd9@nYbJ_=#.2`Cd>rPNeRP_?AQCHo\I6gBk<)pr-8VecKY457F[igA8=?4bW2)ld2tTGdLi.AQ^]^(KllJJS!i_j\&X=PjsM2la&Hu#On==m0::WNWc^2HH;.Nkjs$nNrT8DNoM%n,uidXO-KNQc,ubq&4dbs]ML>JXOs<VWYT(:1.s-hk-o*!=K9u#V)e5?9]@hA8[FYZZr3sZ\CK$P_[%<Y<Dg)U,%H(nUZKN':(omX)</a1K`B_tf5kdJg<6t17r%F[Z41Bq:MM1/\<]mUd[]Wa(R.k,:3-m=DADad+2-$X-Y%@WMLA3_<Lfu;>%9!ne3KFi#N@88f,'d':X:XWSEagli_<T1_2N;fZ?YN4[-Ee$(1an[M6g@n5W<#rP3*-[6E>lhjSZ`fq8-ApJsjZ;6K_3tRV9X.65EObC!>$M+$7?e5R7+F(AKL\4(3#*P*Pod/[q/#Y0*Ol7"#_Df4A<B>Z7gcFn:f!5I`:0>*Q(^c5%XH[G..4/'<j>G`a=Gr^<<:ZDRkA/:&rTe1N,U8m#7(j$s$Vk6mA%b%m;E7Q-jqe<49hdtUbgc)V!<dWX#r5#)_oBn#uRe@QljrPCstYGlggCRjX+X=@qI/lQ%7Bl;5*f:!TU=p)[g:ki#Zh9n<jc=$oHh`0S;S=.jt2!$&Qc:)LhBn(ZDY%Y8kGnVg3aKi'dA4V&_YBTHX/<`\`ceSDn3_\5:RX,.H.FSCZO'T,,^+@o_+No37b)>GFLpgI9Hr[ECT<Z'[WZP_l#FMf:1^3>_<o<oS6G$SnM8_EAIN,/3eLMpof9(5sa&5*g,d_t`mC/483,Ra03:\YZh-/R[>sC`;f8okKG3dNoCf/[rkLgm`#EGDdcuqC,beoif$_5fIpkR>mVe;pjo;A>$hN"dRNmm#5N^%W2RLS9Elm(G^N7`bsO(``uK-03f+F0GnfmlX2pXtX,YT!Rh%ah.]K[h&iH69=`]e0fF9BabSV41dA55F<XOboCO8_NcAjLRX`rG6Z-FZ8Q-3hLejfI1bp%Nss&eZY/j&?[]9#!i5#+hTmq656pFUXm]NO3+GJlO7Y8@piVF/r,`VX?/'4FTQ7j74mZKdZ[VpZV9KSSY^%I;k[Z)%!sU+[Mu[9>[C]@^A70o7%N^E[)Nr;=>j0;Ds-`8.2HRKlOPQiJ\rfdi7k!c8':AimLIY,\.Mu9Aq00?^i00Y2nf7\4j@p@8jg1F+1&THTZA1acf&'XSE$p!dR6"Dl2<[?=Zq=5S&+=Z@^"q;_f3r3K*+IrmMJ$7#lr+T$tb%d@Lm"RVj;%g'FQ<uL"eb93A^+9\B*o*4?bb<I<O;&b8gWL/?b(/?L.tYm-UHR+^)j@_Y<pU1\fj+cZF=mD',05!VQ4.Tq/0=AbMAV*!1/c2;M7Y$qXD7*gUZ?'q7PjAQus*"R=Y^='OSY0ss:X$DU'V`!omDZeD!^.^s=J^J/O)*Ir`'D/<5%SLLfGp#`@$G^=VZ@pT[!iWb?0!=Ha5=m72bjN)h:+q^0ErI'AdJH'J)LXKK:euG%CDp\o36f`q.LpbdE@njmm'*h-6e)uV9j_Vn]Gr2'%R[hqpKmKPk)&*"("1="[G-"u3'YtBem=D^$Q?&Q>G(d(h;,@-P0"t^._bEKT1:GZJNd2bW_dS4'dPmMbH:5*5pISCel%V*U7QiOp"VL>'5*Yh=,`q'uW)2Q\3IF%hNMeQka5>Nr&IR@WVs?f#$:iOH5Z`'t]NjD<1&8Sp3]82]ZZ;>]J>$hk3]E+dK<-s*aG`6*E!;2fg>WK9Xk9E`B;T!JX#Cj0b=EOUUGsG:Kk(aG;&iKX+cLD%-UTVXY,pd_>,[r>C-AcW]N.t/)rXV@HOpaDTZGjeMr$]XBi^o)@HCdsJ(4f""bYHZ7ZGL,If%AX>u`_9N[8(\*/Q0LJ=u)gMjQ*':H3D2b7EeR-7cj9qKNn8CAS1[JL+ZN<qkpp3-]ZO~>
+endstream
+endobj
+877 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 876 0 R
+/Annots 878 0 R
+>>
+endobj
+878 0 obj
+[
+879 0 R
+880 0 R
+881 0 R
+]
+endobj
+879 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 468.35 540.528 505.85 530.528 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 57 0 R
+/H /I
+>>
+endobj
+880 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 152.0 512.028 230.0 502.028 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 356 0 R
+/H /I
+>>
+endobj
+881 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 242.0 512.028 296.0 502.028 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 292 0 R
+/H /I
+>>
+endobj
+882 0 obj
+<< /Length 335 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GasbT4&5r5&;5E1MCim<*3\mJ&OIZ]5tV=!Jg*hGO@t6LOgrI3BC>kP5XAgm4Sj55m:d7n;7m9i*M6OJ]N!gOU]k61lS7_`TIaJ&m_s:`($!&*`JV4n.Hf?-6kW4LBJfpaK%=%!q%).Y&)^gNP8OBN[c=gV&XWQ/ca5ba0/Z)O_fBiRaj9_+>Q%IMWG\`Z$s!r&*+6M_5)6ghB,sPfh[_rqXtpo1gO^Y;)#/hlT4pkNH7IMAeRS%NC7TWk.#tr@aq&>R)Yh\q?!i[P<E1;NYDmNm=pEuZ7@apX<,S^G=tJ.oCI`+-H>7_lG2N//ae0<JTp:-!"44`!@f~>
+endstream
+endobj
+883 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 882 0 R
+>>
+endobj
+884 0 obj
+<< /Length 3076 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!;f>B?9+&q9SY;!Gr=<J7k,Z:RgQ`::r0Q0`+DQ+^.[LCoIj._q,H/:2mF2BYCHbfEQ0^23?a@&CQ6Y@%&!fCd,R-C@r=@F!HY$ZibgY\#6[[q:1#mfG:%/B=BbZe:[XQ>^$Q(7o6WLM*5)O$k$:<?h"q-W*pB-Wjl*m@&NQr%L7G96nPKWk=dKS#u\j[bf4`417;qY[Qe"4N$Mg^*s9g8R=t#f+F)6]-Fk@J8'8*(&G8)gs&SN/`/<7T2NAa&J]D!"=H6_#&Mb\CjeK`iqJ^K=HoqL)5DlTD_@lJ_rF<qk_Kg<lSfdsO4$'1T=k20mEs@AL`_]YgYm@rEqH30=B5+HTG@ggiP:VC"j"bXA(\BL-V3HAXNc]PkNKP=5O(Z1``Hl/aBt9=/O!;p;C4PK`hP]?P;4(`Yrl'3&s<K&19\"nQV,NtcCc%+>CiM7_mE7\80m1q[gH`MN<3P@0gA*g5D^N+oSaO@8O_+JT&oc;B[Nr'[36C<FL;qKODpLV-6'$g@^a;@SmpQ>b<%?H7oge9Fbu]/S5cd`:KsM?0bV,3Pb>l5NeN_?AJ=Gn7T&\T'7%%FH6[I[2mc%h1/^ZPrkI3DD6#H\NhS&*@@MlZp8l363!ldi89r`(C.cGQ_h#rl(@D,<&P]&eG,Y#n#<k/INkDEQBOb2&-ils`L52Qk&ge?6^>EuX:YQ;4LQ?R]-&YuEhY1'OC#4?BZ2T%55CU=P,Ct`(1M#Pl09[7M!##::c0Ud0BPT+?Y`YZA$$"kGk$@#qaJ4kGQi/otPo9s\5pI%/@U=#XI_J`^[DO&uQhiV'9BBDIOX;>)"fBMo-cgs/?^fGa=V3D7$OVkUTEe?;#cgnk`eV5uq8i.ARe-JDF"C%J1fPp!6@OM*7$%+r'a5Z_O-4>m[CGN8I@0dAKa=%M+HBReju<f$2$)ThJjKX4GK+oAKPZGjW`nOEm[5\-8,FQ#lSJd<'#c'VG<A$`SYnt\D]u,`Uq\rdH!-.9IRm(B<V9UM206JFeL9Tt*jfrQ2D$GtR&'l),0cF4#21n29[D64A:f0Uf1b*(#B_B25,"a+GJmaWL)gCP)0UG[FG>RScYeEk,]V'"Y?/e_\oN5K(D:C7C@"*ockL:&H#@.,*\i8qP7$UrLHA->liA,RbE<Ro$l;mp%.X/MML:m?;5H>qAt#YuBd5IXmibbo@o0BamQtlQ9m1lCEnD_Xa[m$[&Et4e0SkaEe#3=+f:+>=M0CeRc8QgUmuMDdX]1[ATI#Cr0q8J<l%Z+rVN-C9T:<71?J.(I27-hme.0_^e6Y9t,->_c=B&glSjNerh9[,u65s9#Ri)T=\O]+gckYl(9Zh>5`G)t;$,/Z-4VABB'4LrY/!jAmWf3]*.P]g-UuKaa95QTbI_T3=HEL4NJ8k0,=jT,.aHLE:L2lp3>3&O\,FqEO8s.S^&\oIDaFT<t)]Mge/VuU/UD@.SS/A+XK\G+,KYZK'!u,U/OsNj.eC,\hKJqBAS811AcL,r=i=W?&jcF<'TToSq$da)[eoo8-cjSA.g97Pu]'CM5?ITTQ))aDH>?-`9ius+'$PJ[6C16IaZ*:YA/<R&,UuiZV:]^oO+GC?:c;'8.(n"qTpBjX)5/p>&XC^L`#sD]V1_.e6=[=$JI#\VC%HK!$ot[#1UK%PqkLXYOnRAYo7]SMKJB`U1k8m%T"sb\jiue@$qn)OG!qNb#+LNAes5Y,\$^D;I^D#/,[aES/b>h=$`flOj/d_VR)('^-N>Z'[^AlsN&(c,#l!0dF=_OIK:'<m4;*F*XgJu-?WWj+;ek%<aN<DFe/>@I?FJ,g]M+Cc<->YV-h`.V[Q.4]dMLSAXSM-$UXFX;FM"#&FA-K+Pd9b2LoiR"?BRqP!.HO6-&_&r`H:h?>*@ZG@MV-8@@YLIdP*Zp5#*!8*PV\&3O(C5DK@-bd)2E_fdCCT3"jThT3gauH?&76KS<)3>$4-'uW<,]Z"=B_R7:MT2s#E:rC.g!u;!_K!X/$h[Jt35Y]<+rFL1;FL+^$_p,dp:mUr&Z^1`s(ij^c6@WHUH!Y0<>pMheJ0X;T@pHPaTG5:9c00to\kFmbo1CEmZgqXm+d?2AGenH7?$Q[cbUXFb&t'cN,$"5\QVZ\;tn%"BW"Cif.@MdP)lL?>p@Z.LnGB'"3KdYIS*AK!J.Ct;^#f[1\BoN\>":KuPYmoQOA05n_l7;K6R0k"kEK2$me9?XP)O+);hle9YRn3KJ"q.(&o:pIpRYcT,bkh)R\Wtt#VK"i.G[tDr.[OpsSoIn+KVBD5<H8Vn,m:%qS14U$!hMAuQT'r[B@W;qYPe6n0n9_4NqusS@HQ[*h+O[;N,c:D,RciTqi4O\=rKgkt.p2ip%=11O]RJ6EVI$PZc-$pTY<)G7VI6g/Z/*2$XarkIl<[HL43n`!(]`jZA7m^QR+Vt*i!hdBP&F\\)\CIbX6"nN@Wo5.\NG==Z\Qn@0$ZO&bGXn!c>K`ma$DfA_tQg3GPi49NI+!(g+(=YjIe+ej2S@Lfn#fGbqq9>7C?JJGlt<k8o)_22X?gB!dNd:n<^$4$h3uA!#*t%eGpKGU]q#qcAG6GWb(+P>MUi0,t,bb>O4.42&J]F/2[Fqba#`mo"@?+>EN@edb6ab,<t'J%Ia#o\^1_tZhSQGmkLghIT?%W2i8i,mVq6i42>]=N@tT@hk?Y;o97P*.EsMqhRmt4fDVTCP7n>0WDD,q"b];b&9(%.15Wj.jA/q\UW_f?a0/Rj*u!1U,SYn==`)J^am+Nh,\FW:4P;mDdBu*S<cRcfQ&;@&S&T3];=1fP1TYhRa3iff"Ple,![NJ500utY/A;rgq<,"XjE*ndCH/&kn-q$A1X*tkodQ[hPlm8JE1E/6rYd^U2^9=Bai'#CA?cB9=eK;Y4la;/`gZbkHB-aXhdab/TH&NN(<7TmU6^Xng<(J8I3,0%L:#u#@>e[c[DL\Igmq:.rn7g52%5+t,l$?&b71Qg4B[7&!*;!7J2aO5H1OOc#ALV\"tC*@`'IbnYNrLTXA0^_>J:8R>(o6*[XuS/1.J9N9@hZ@bI7Sg>P7(kgED#sG;X/cHlMSAIfZ2T^%h~>
+endstream
+endobj
+885 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 884 0 R
+/Annots 886 0 R
+>>
+endobj
+886 0 obj
+[
+887 0 R
+888 0 R
+889 0 R
+890 0 R
+]
+endobj
+887 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 161.16 691.866 206.16 681.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 96 0 R
+/H /I
+>>
+endobj
+888 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 169.2 161.266 214.76 151.266 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 541 0 R
+/H /I
+>>
+endobj
+889 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 347.79 161.266 393.35 151.266 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 474 0 R
+/H /I
+>>
+endobj
+890 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 415.29 161.266 460.85 151.266 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 891 0 R
+/H /I
+>>
+endobj
+892 0 obj
+<< /Length 2131 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0EgMZ%0&:Ml+\GMMtX&Km.Z5,l[1`'u:\KPt$=D[\^Q=ubI/?0?EXT-!ZfbT>Ukr?Wt!<Po[L7C&4cHOXbN":BNn-=u%C_+P7"+)^`E!A5u3J5D,H_DH##N9('(jnKZX,<F6oY](lnj9s;j7):e05/S9KF,Z)V^(uZop]kN97B'e*t.p@78"eB/BCFiYUiPMKZY6%I_=\1ZSgmk1m@[rPU*Vtf7G5O$-`UBY-c2H0IF!#*8?juqVMM;:G!,Q0SD*2B[e6rG]S"SqBp<8ME+Imjc,?!Ke@*0*c5QD=^l_t^IH.f]YB[i'2D2GQ#QrZPbb:kH=::.15"gHjuL$6VCemsd.od2>G!j!17H9#-S'g<;9.q7Bj7rHii#"f]R@FRPLifk/^5/"JeeMC&C0=M)d6^qa\pHb%Rac$KH>t(BT^pZS0!5UTgm],aJ\b[k#Ik;4A&^Inskkp-Mpm\C)SNt9apY)HqB$.8Q&U\?$WXdN51X/EC1M$=q#gt\95l-f!`_9Z=$",1A/%CA)6fg&n7<ZH-ch\#OB;#d.LB&W)qF"Zbp)>VU2@k?(Hd"6n#)qVFml8Qmfm2W_k-'ja:.f-WGA7MlMpaFTQ8$l:7#c1o1RNDhD@^>Y=\Dlc4c8"sO]`Wt7QfUm,96G_UDAG^lQVV[b['8D"<RMR]"[BX:@a/:PP`l2F4oH4sQega-th-7-r_][c?&cfYS%e(_Jfk`TIi+(sb<kMpVOg,U`5L+uD:>a&Of*\C(To8n\h>q-`<0Ki")pGs;&?;D7ER8-miV7>(n'dQNlJ?5re;hgk*Q,"HIGlF#]/r3A!HhfWI$rodPJ5#GRN,/cq[WG.VY!G0C=3?hMSs=,T;?Le?'igC$Ch?3>OGZ1D0bqCi:9RI-FI1R*lanqL_8>Ih;;!V_b^h8=U*l355ZiFgVk5dE;C]j46dQZe9@C![;;9PLK($=hj3Ur@rS(,0O4WPR[?:]:lair["l!p=?I7pi9q/c*om=<DY?u5S.Q_\Coe>DA8EVg@OS%5M;Tlj>j`!2b>N7fgiHUWo)"9gghQoNYJM#V&1_gY2p1d7%bt^rpUbX7i]%g]-.A['sRC%JN!'*K_ZVi2F63+%p7gX=UKot.YRlq>!(6qXaLA*W(e@NCDlj6>seSK,R7$E3nE'()248E1g8t^h<a-=g8/"OuaU"d-h@c&"oHO=5\V.rM-='!eCJ.hp8LJ*42DeQQl4^9N?I9mcAlkVK7BaU4;"OCdJGV*#)V-%Gh'uqo%EEk:t)YY7Fc;[BS6P%F55qqJ#cC_.ba4`TS>q%u+lK)F[M0WB!hVf$_HrZ!QX2=5>s,h46B"_.n])6[Bo,Df)"!8`EW6=hFTLD=JWucQjUYQ]3D.>P?D=!i`Co"HT]U5oKU#!;m2X.cSao?bFEbSuX[ok-ChiPCFQ6b9SkQsh!U=lY1'97cm1G[mbomM_\3\;K/THLqOUU0e=%iY9VE[0I4S>L>CRYd<8-+,Yl2mC=3UOCf/aY-HEd\3oO*UI\7n5?pASt56pY`FBOM&Nj(2?<a9KpC/&%L>m4$:>GP$lQ/0V&jDK5UQd/Fa]Z+:]ls@HND>g#?(5"Ke8Q6,D1Xo@,_lR*9R<\isbfP\s#TfC2)LlO;`CL(emMoP@"(3JM<>1Z'5"KbYhJec3p0:-"":k+H3H!/lWTpR$9]/!+]Vl(G!CS<QQ#%WZ:!2/f(U&[s.lV\mf*nC"ll$CA7%Neq/BF:b/5b9ocq"BCs*BJJ8$5C+r\AXilYDLRBhLn/%p<;@qL;^Uq7o]=>L6_m+'a=Qq*=nT"]Q?[;KFC1H=LB&-`#J@4;AS$$MZ'hqcA(#WsC]=-nh/\cXfbC308pBoNTDA3<'74q9)D+W:""f8Heo_B+<>tu%j]QYa`duX(N;s2AVkRSLT8`$e;cQ?au:dJ\h7nEV#-pA5;9>3,[S$A$&gPLNuTU60lb:YKg`Kn9q?^uGFmsT!/PeUUOG&SE*q!%Ntl-<.qGO2hFk(V&u?i_r-g74GDEq5K(jG`"(d^3oH#)@]U$$a%q1Q(HZT.56<j4\[T>6-d!h[)2;<FnbDqA9_5UMbu70_?JYQB3:V8Mr+kdfhga)[>W+^>=ti=t^;E#0hoT3p5OUIf]&Xc_g~>
+endstream
+endobj
+893 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 892 0 R
+/Annots 894 0 R
+>>
+endobj
+894 0 obj
+[
+895 0 R
+]
+endobj
+895 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 261.2 99.78 306.76 89.78 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 474 0 R
+/H /I
+>>
+endobj
+896 0 obj
+<< /Length 2513 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GauHNgMYb8&:O:S#jt%n^fF%lb.O^YN?j<#,?C6;E?80A>$Qa?Wk:lG^V3'-(=/)SP$A]T?USV=ZZBa@b[pbMo]3K^;9/'JS^-ld`9GKAgl=aODJ/%XG9b/s]"MNb]'+Nkjc6pU46H^dTc[V>H2WjH]Ku40q3]>N;_o/hr2K[!-2$GZaWI]J5<@7(,]M+MSW1Et@=BYA3$*14B497[eh8gfM-.i8.0B9MDWGSpGQ2D.Xq]f9#EJ*\4.UKMfu`m!6+=mgIfFfkp7-f,hb:1+msaVHW);fiK<FD/\*dUUb$"\RaCJrg,EHeL[Zl>h:k?]U#5EdF6^bgg])F8?=Kh&2#7]u3\_cVeJKFLMdkbfO//L(`1UF"t5VBnb[9K[odR=Z/O9,od+6q1'Naig(ABs(e`Hd-ZDU6gOJ8Y<JM+cNCf\rm$<W;^iSBASRRH6mhL:nK5ObEL-[a[kQ3mVoH,[_:A`!fE&NsqWuKS;s0.SiJ??Q"iB"oq(ALlN%Jk(uiMEcVX<JhRjZBnU$TeW?TfRnH2jJ^^96e&cH%&)pC,5&X3j#5-fa:L?:leB^(GVIl\!`L/PB5oio0N;[9TVsi4#'M1tXU-Oh_N=ENJ+.'5><$$\&6M[8eRq?>cpQs@0qW[V%>?#C7jP&mTp4ul;oHt$oH)cd6f*I2qe::dIW6J%R>VabFr`_.M`Q0qSQno?P>`1G_c3(a^&o5qD1YZe5X>loYXYQ<IA.$'u'#DEes%JMd,CCo+)/u;)\\hu*,I%<(er^(C((!!O%!%Sl5SaZ[Tq3XsDd5T^0:4Z01l1Fo/-H$R<\agKA-QNR]1d?4c:qUFi:>+"OJ7uiepZJ;CYa84][.eQ?gaen1UT*GkRd$PBI#D8T@Li.)mn';406Np<6^:?F2IlfM#ie0#SKiO"!Wkb_\E&859.!-o?"61=A-#DU2r.1rIucmJFg1i$GBuJ2H!Hb(Eqe2'8b_&1&2;K_]"_m!,=QThaPtl'`sre'Et^:@:<CF:E+fg?LQ(Mb4mY@0HmK%/mra$KIr+(WAB8<R(&)296r6-)iu"*!?1/GAZ8<X6o(%hba?&uMY2AB`&$RU#q<2oPbq,;8tE=NgO\T2b#qS50P6A3^Q1gu@^2JdUBOo0LbgT2Q]sG*V-ITbhoKDs%(ElkAi:=GA$jicVV(.76sSY)ee*g/;i"F9A\b&Gok9hERRPW\iicXYaL2_r@ODdVEZreO5thRf?+5d%[E>;uR'-0-@tn1@6F*ubPM*+,bdk?>;M=pAV)U>8+PA"^WtkB3ja!l%lkD6E),^[O*;;]CAq[]ZG3[[+@Aldt8]6fM;?)F81DC1l*K1f39ERfY>=>2rE^[gejAnC(Pa4Nc)^dAU2Y=7&_1%C=$cBNVr;fP\BC\nNQE9"\e8d*E$![1Ag'\R9&:_/rVIg(s6[<fia<2rUHP_s\Z.uVWD(f?5,gBV=M#I**.Zd-QG_>ZOAWt>urS0(D2"![&['qi%/nrJ2Ao,i]2OtY=7[4!U/B(LMYB4M;O#s_%ou.W*rK)n^Zb/ud728)6*0I)^gc@''kE*B:jdsj6R/!4Y9;4YT1@ZAFK<`Sb3s,j1CP=f'#!s-%m&Db:Js'B,:"_c_H*RDk(=N,<@JWf:VBbc2VEP@hTnqAql95'R'U4-"JhlR0'0Nt5gE#WmM4QZ!2dLY!l=J.`pZ+5YEKn/@2eY1:`GqtXR5<m>W<PM)E+$1rK$!$aR>IF]Q7IN)1olsKklL)3Jnce,iVL:eE,GK?>.Nt@2mY_LZVRo,WnqPi=f:(jY]p5M6<#fj$BrEmjQ>4]RDk*h^>`Eq]tK,(Gg"r)m"Rf.]usUWk'3$ijZ9.L.F5&W6AJNBL1&MN)>o0<+Mu4=4_OOS=lbq([hk7m"Kc,UMDcLHb0`93XIRS7U?=VYWH`*\DUfS'g*@s[aJYBV\'o7Kf6_F\R5H!O'l]phC%DSiQtigGj&hq290oSQNeUOXYpQRGr#`8iG(1R'CqL62XqYKEE],8gd.F$oprXM&Q340mg1]Z+Hc>#B[g#j$K9OUQ9%mCGS35j].EZFe/0LZM9%]&Z-/^lf3'FpWUYZGd1_ob?Xq'9]gNEC@gI^)=K^,i!Cgsn=oN\<KCRjR1Qb?=%AQrB.q.@tBIWr8"f3.;Jf'=:3PO.8)XV7,-pA1(-b;boDA%eP:MaSJT#<K4$bekeX?)S1+T(m[p`!Dc@R:F>&r>U()A@&Pt3]X8rh-%,[Z?^rV/1RR1O'\c1K_Vgo(i,\mU+r0Qga';$E.+,7)!G5pR&22B!Tp_$gTAg$CRbK$pEhu,Z";>bPYZVPJuL<R8@B6H#"ZaOCGOKmM2l>Ng9/c!e9[f,o.;jn7h4I)>@&Q@b?3j0W&j?iQm0I(2qY'<5\K0-kVV$`[X@\-,t#H5qkMDVG%KA$h/QT5N4bb6omto^S$?=Lo:\E34NA>-,^@8_me/aZ7@$MB`$NREh/qS[:E/-OP\Ni%KFgeu/#u\,BXh4<rK_HfLnn#mT)Ut7EdI9ebCH=d~>
+endstream
+endobj
+897 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 896 0 R
+/Annots 898 0 R
+>>
+endobj
+898 0 obj
+[
+899 0 R
+900 0 R
+]
+endobj
+899 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 225.3 691.866 315.29 681.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 581 0 R
+/H /I
+>>
+endobj
+900 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 161.14 241.866 210.3 231.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 433 0 R
+/H /I
+>>
+endobj
+901 0 obj
+<< /Length 1866 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!;egN)%,&:N/3E;U>]`b#K_`On3+gbcG!Zt=WPN#sG\Z7mF.Kckg>qZ=>?]-8ACgs1"&GqgIM04tg@/t$q:jNU-QOO3ZjCd.BZ]*WI>q2[Ll0@pgiF\*-+=m^Su-<'ZHEuK=qr8IGLg$eLJO&ceS]O"ViD[Hj&Wa#fZ?9>Vkp.9Re*9+*6Cd"T:6Tg?5DsQ@U+.)[sMiHCb0=OpM^4h#n][778Gu*1T$1PR"E[e3-JSefL"[3/U%[jhQnI-IN'ZPd<QV8)uHIFD#JspLo5f#]2Ta"tEN;5XsAl&8AqFHOYA'LQN])IlkI/WjF(iCnPN_S\2$#Si_CQNCTr(%Um83\_??:&$@(9CX%7ja1V`.<Z=V-Vt:ZikOIbWFa&REN_hI?h:l'+??LcpsUV[9NorC'JH'BIbS?pZF,=f91W]NMTCCIPZkS)OLu>a\\cA*A6nhQrt*u)BtRSQS>ZgY93t"f7pjD1C*L,e7$^P"W/BYjc[(qjH@dNZpiSV:30PqF;m:BEk^JI^7s,_U*hT#As(tLFNskd82O;?T:NE4aT_!T$a=r=<'Z[<g7n"Q\L5"HI0WQ*2iQcYnc27d6'.BTAZ8_G-NeJ-9HO"!Q5eZug_`lp4H0[l6<-;b!%p`@#n<bBZPZBl0[pQC"XJ33MnVYK.B+_!2M8*,Nu`'OJ7,M>(:j7.ARF:*QN0$ZH,g;!!Gn$/ebF$T/._@m,m*,.UN?ic>I=^3(/Qi!9TKVEGkL_VKD4/o&>6nA>APK[r]N428/aQbHfke\q+9qM.1YXtD\qSc9]FgcYjV(5n%2GMpD]#0-&Jm&O5!'8eZi+UduQ[hT[p\)fS`>WM[icdE!r2g-nuQ]LJ^JM6p;Yl<l7`J-5*@u(l!j<L<`<OpJ3r70;kC$*231e0_[koku:U8=dXZ6FriqJ5C1mYFXM`eAsEI%FSK<c,ZLYQDJ#.MC)k594sP@=AQmCfn0UKU-me*C',WQ*m_%iD/45HATV+Yc,2Sl7XNE$a=@sk'Nl[3R$I_7-KcH.c\sddM?680K.*&B%l48:9XaKgQnMsR^2>%LMfmd$o?bg=O]eM;^WUa_a60MW]TDu2)m4N;ceP^7,$]&?5gS"pT]_ILJ_G\+Q4P?+#NiEcI=,X!>+3dn^:TsY5bV_IV&MCNA8?,V#Pd-ckGQq31;^fh)0=D[sJ&IG<O4R_lhqL3-rlQ^@36&uU\.Jj^W^.Js[XED>*u`kIdL1P2?%NB\U/kh6VMTIM^5i5m1'5Wi)A*HLrkC+T#+4Ja1VdPK;PW9=MImF>DG18Z%'5m8*7E'H%p^rVbQD33kbG5'_)aEkNk]loW-4qO0^#l_'J7"2L7*Dgcl#66)^Qo+e]\nnWG1K']tfU0[(VcZ\$<n-9Pg%HUDJZR"G86%a:7!i#%W;H#?k,N^YhjnSc*]H!L1GqmI99>lNfU&-(<6(P,Z"99RhDM>hrTdC7[Y_#1BPdNp)&6I70sgGP4c#YReVu^-fh+'.IOJ=OMfG=ck37?B-\%YVBTsOSk=O+DpZOg,XfQ"hg/hp:Z[i'u3Y,$G$B1/\)F/VUW_<e^PPBP%#s.09+4>YM]X+2$0HYDDF)X:-V>U2]pW.Php<OIE3a"jCY5W5>>+4Fd0QnEl(B@F6?M_2Ug;mWAC%A3dI'opFGVLn!-MD2U6M*`cBmB9n02q^:1AW].jX;Ab$^#f=oiU9toLiUn\DeA=HJPjBHB#LJWh7]P^d27/ss(;m$'9+AU`L:"FK`Yj4&t.@J=+P5'UsVU"]RFLLW$Eb1]>Ptuf1lKES$Z;\&o#FToq"PO5Lo=e+M+>K!)SYji^9dfCAhNi\T=duU,BbIJm*iiT(^>sLR?Qu7LrGekEn2D+HrH\~>
+endstream
+endobj
+902 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 901 0 R
+/Annots 903 0 R
+>>
+endobj
+903 0 obj
+[
+904 0 R
+905 0 R
+]
+endobj
+904 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 276.99 604.866 322.55 594.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 498 0 R
+/H /I
+>>
+endobj
+905 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 355.57 330.95 401.13 320.95 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 564 0 R
+/H /I
+>>
+endobj
+906 0 obj
+<< /Length 2596 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm>9lJcU&A@7.#e;brCmH0;,kdNb2X7#SK32gq`'(3DQ*^h=Ab]\<rUh1/P50jfQ0k767A@lZR5]%rhCSWso$*5^o8,DKgrXU0`gs3gGS?GC]ZJs,CNDFT]O3X#As4n:]Z<+$S;"+=5J4VNCK]eo<]V%rqR?>e^\VC5lab:kQ,p8C>b+RfR4NiaS\g6HmWLYX'",?q(89b0G.E39lAb/FPZ";[s&H9!ccTY>.5%Bqr``CD=KPOb0KI]eOX^Yr5,`d;Z/t7[GmW>F6n)S#Ttb[oli,'tSZ6qH8"oV1F[F]<As5fsSif:n>qDM%A+A[0jgjj+kPmY-gW(ZMVTs;'ms"L"EHLAB)nK'P!5)$iM>W=J:W-NG&?M*i'6l\VYk/smW1,p6^Igg-O]&W4hi"k(k'2g`@o;MXQLu"Ees=k65ZsE?D$I@Z6'#%nX%KH2#OA82ARa<mDla:T5!1=d>1Hi-81.UH(kq0f,[N#O=e/_]Z:-.lPS,uq&48&@==<<#;lP0#J,T9@[o4M0U#0AOYYd,W\Il?f,Ge;>C)3[n<UGZ0:CIM.4O0W-F/Tl?2)A,a;RIRnc_m)d9DP\e,pmiL&N00Ifc!fIF]mZ)+u)D>om00].Pd8,7:6Ncg'B$9.T]c:SQ_f*ir44KH+%t#U'+fd"?s<"/LeN[O%^iG+RTIBIQrIih:7uX>KCJ^G<4U3T.`=U[Sto2j0p,i$0YgsG>K-.&\([%DZ8iAnD)]=#$<fuX\r?;&LkX]'tJE;Ul^Xhq?&KD]r[IlQP5c!s(cA,&qb#"E@fm^G-H':-sJIKd\VBEJ-gAc-VW0]kIV@H[bMX#:l+>Fl7JF;;PTD!S,rVRDY3b]*V!B!0JUA@-5J6/rO4/A.+jhsR[S_7!?4=ja>ao]7:L(t@C39"Z:HK/W+?95!=D&2Lff?o@oU!J;2@<.+*I`e$[;O%g9Z:AM4HZ=-sI<U0LjSBD?qF22N.D$3X9r:`;SRWB'E*n]l11BeYTim0F^EI8:^qG>8jtbDf?`66m8:j]@q]ML'eM32:J]V)F0b;TPtsBX8n\..A+d(0D$6&`n1(Xl/MW"4?)D_gD,!W5@[WY^T-G0(Ob\(<]0C7M2SVkLkt2H#siq;-1=%1s-#l.h3UB/qtfp/&f,DC6C5*>\hB6MV_<PZ3LO7uLr&[3B^/HHYF7T1cQ\b:ef87kB$CD]@bZ?8[PM3@CVD>$U4f):)sMa@DN-ga!H6%R8SB5MODI",oT]!lUMH8G-o>eUWSThn6GeF4%Cm(k>"ISsSC$<jYP9A.c8ICqanU-(BWnVB00h72+)9@_&I?t6=6:AFoR0@e-#o#JD+`FtM?a*qd_Y_J0o]Qn#qi0dheA^?faFCYe+Kafe4O-;Vm0SRfF?+>UpAR_Uk/NCraO.^6FWqnf/hKeqH1O7%2&f/#N<5@afpM[iL*/Q&'k_T*:8d=B:LP[p?6rn<c!Y(X?,o+otEg71t1D-"dTn9QNCk$A0,0nVQ##P6^krIALnMGLN23YQHP?_iTYroS>nJJQU`8T;Y0M)g&%91X"0*51C'O"$PNOjO,[FV3a4;??HJPMC+Sb_#,']'S"1&u8lfZ&#&b<8RLjSJ<&9B2^Igb.YJ1cYSD8]"&oB?_QbuR.J1Cas3g(-3N)ug0L<a:k.?_@.eonk"g6At0]2t?1<sI+RcZEcer7Z[*g"LH;46"^*a]AY_@(1VR<?@1tX8ue7IA?VPARJsRg>LXglA`r`Y/Utf+s%<7!c"`F4D/?r]KJ"HmX_NgT2Js/eki_'Sai,iT^QdU8S@Eu3qj`J17+hpO26+FjF]"%:U!]+cV7A=Ugj4YLa7ibGE$/9ksE<f5fQ/C1-jlOZ;\2qbstC'RSf9>o<C+p&Z8`=!)T0^9QL6?/+n_11;WXp?Hi/uT/@J[bfF*SGEb--pc?DLLd6?VK6L!8E7/5A_6Tj)%)CC&p5;)?m&(oN)/Ct(V%h3P(@(,=49brs:pef?(%!/-Et$5']CQ3U0H8*un(1f/@'eLiq2=K_`@tccJ-RSoo(+V$b'h0S(aF]T[tjI"@eLUb"V^3\>-0[&c"1mZ82cJl>L0n=hI?dr8^VZk@n@3.TPuP]2t#Qhoo?G.PFkT4Y[Oh;a#<q]r4\G#Cq(Laiu^G)"!6$fDV-+6_MSt_e?heL2Y%ZY;W'BB>)n<fJ4or`\(^>NG9kh_]!t^nh8KC9\G`?R:Ak0BrCt=>ATE.GFlb"!D,b7Ci^-]\n\H*GHrO+jVAD]pHs2lh&*$Qh\u'&Sa9R\dcu!PV$U*]#4dN-RFH53o*_Aah$ML27Mh=%WGW/Re>k>gGY\D`,%A7s=Cr\u$(H"hJ;R':U,N#V'^%M@0Y]+u%bSm;QpsE1Yr!5^YINW/D[m`j?aW@?p0`/+B>?OjT64KfgXcr*YNIm@r>%QjC[$uKqs&9iD2*eDHc+AJuJUVGjEWgBb.Sr-A'(:k,10%=EM?K@WXpq/5qtHF[j@%CCBA09,F!r/n\"IZrg^ec[K!SOiZA@3b^G\*&ke$9<["Ig.Tssdp6W6u_d'V:T1\1mB777O>e.c+aiW6r[B_JjGbFd+(GCB;.GWCg[-JaHp=m<orc$tJdef"~>
+endstream
+endobj
+907 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 906 0 R
+/Annots 908 0 R
+>>
+endobj
+908 0 obj
+[
+909 0 R
+911 0 R
+913 0 R
+915 0 R
+917 0 R
+918 0 R
+]
+endobj
+909 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 488.9 691.866 534.46 681.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 910 0 R
+/H /I
+>>
+endobj
+911 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 315.32 647.866 360.88 637.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 912 0 R
+/H /I
+>>
+endobj
+913 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 415.04 647.866 460.6 637.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 914 0 R
+/H /I
+>>
+endobj
+915 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 240.02 625.866 285.58 615.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 916 0 R
+/H /I
+>>
+endobj
+917 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 151.16 582.866 202.82 572.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 487 0 R
+/H /I
+>>
+endobj
+918 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 258.45 539.866 304.01 529.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 916 0 R
+/H /I
+>>
+endobj
+919 0 obj
+<< /Length 2760 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GatU6gN)%.&q/)-k\]?0S&:.T8WOp>?(7g(iej#GDT22IOcYAV$#fmm)UI#R;\ua/"=0gAWCi!Uf]YN_5(,_G?,$3t@5\FhSj-A\ht`J\]3sX9T3sD^iSD^bGX7QfQK@3)qp>)?-9&3u_`te`ib>/Vr<@2WGk^>q8L$!n=Y8R`e`;e5ni)XO:BH#!r?us=8l"NRk8u!'F('A\L8V/0rWW;A8ul%G-0sI<WrJX[RY_)qBc<#G:6eM`Q9oK1FotB*=VW,Dg2VM@f)>&S0%.C^r5Mh4\,Ylg=_/6hH)pWK((/#sg-^Fn=`G^-b;AspT>sh/q/'!]26M"Lb2dY`GW$06=tUnH$+up\oDCcc->e^Xk98nPb>q-jMu@%G9I>'Al-t`ffS]g2q"HEPG@;+0Irle,Xr,E3Da'r^T<Aea&oIZ@:EP'i_<F)Sk%"?65E'FT`SoU)FX-i9B/L.q-*/eXqTPGbX7u&Doe/M%i*]\7g-`KdpoLkW0*]=VF3S8j!U:Hl;UsD1RlXW>"H_bq2F?FUCTZZPCF]H`J.M]hYk'#;O9%JgV(1!Wm2BaD@^@C-[_7:9(-'7@Qn$$)9<",ad;Q0.Y#@)L!]&;r)=E#4B7D_.+W/g7Q"Y*4m,eD,G30aH?X&b@p+g)%d5`k$NYND:)8i-9W=Sn%MAL$nF[QWp+&X<>;1-$,&;[5)`<SQHh`?c&PJUTK@*)Q_O-@-;-\l!q)iUd@#Rc:j0<:T\bl1_&c4eTF%Z,Fkn;)^6HT,Qpjej-J/d/Hn/4#sT'mfX^@qqK3`:9o6LSZFY`\*ik6gCf%0/s;uC37T1)QT_^fTK@r)p/N5A8r<Be3N;9Gu5]FI:tHbX@oD#Mi`s=m.RDFV(XobYs:0@HDoDSgdtoXjgRApiJOA/.]!^oCSb<lD9]>*)#)eAU@W!:^bKBPj'58M5Y):.O:$m7!5l4*g^uOF1hT^,;WP>OAJmbL0R]:XiUfla3&iSMG,"Wc28r2Sn[?6_(6Y45bNr\nA!abGd:\D%@IVg_iB_-Wo*fp1'9G=[oIH"tHCb6FBRN`gJ]!Op3%D)i_\1W(=LR3lJb/lV0l$\(NaWBp=$dgEL(5/tF8`u\IeroJm%8b,]X22&Qm%fV+df]fG950#a/pg%kr[]IQa9pVbbL.K.#!i*;\2)>)N9*SSY`\,=s);"TJ6t'1es\PIZ[dB]'o]N,)Ut>$"dfoXS]JF2n.@JaZ6TGc[on_@-71pN3L#bht+T"oO2DHLS'Y&dA"fb2$Kt<XHJldGgSqLOhG07`a/')qrPjGgl0moLI.k7DhM5\'qBN"^tD`88?f%5XG^cq#pW$I&<2JR;VX)q(#!4./bS%!OsM/i0/hV8/rbsW2!6/LgHj+008ZXQLCS?:ld2Nf_@%-$]fQ`EFgZ`6cE)+W9E=.m>&Y*)%%4h-24>Ob9\4BkS`E[KQAll$p*/&<]&)Mp*Y=ZgI\sP0QmGaK"]X*`Ia$KGUF)H7W$]F9;];DRm+&YR;S)jI7q/YoA1kS72oSVkX9r9?g_V'"fRei"T6HE7/hjX!LK[&o3;tJ%bB6L$S:(a\)Q,Mbg?YW?gViUOB=J+Q,aVmJ9Ze[16CG0>Ai,FZGTM$fApDi`ReL%ojtQ<3W(a#b>_<p%_jA>.qHi$<>2P_-f:@nDc-dD0'2:$YGY5>(N">9;lKC>npPPtaO;_sVM%YPRi/Q:j)RUfcUS6?O(ePDRk_>Y#@GZ1hff)k$nfLE^YuE[5KG"H000Ul^*/61q(^,UfMhA9s:hUP"4doPgL4(\nS]tn[-^f<(b9"DNBgW!q["\^99C@CG][Iccdp\@\3\@p#04Z0Q,j:P3N-N=5<`t0Zd]$3GTV+p_lNnnb*!iJ/\i%p\M:+RT%d/\tZ;6E_<]3Au87>PUMAJV=1MD,STP91$@hF.>FK'\`!=0<H[kU/WnIpPLd8\sD3OD^bW,Fj5B4k]m5GR+\o"Rg8R!_H?JSS6Y"so3?\NkC@!2a7,B,Z."EpBGah>Z#d*YI"1\fbrId*Yi*F9dd6r/>CoiP,)[FYOc)X9s`#-$umU$qGuRX]S>N*m9aN&:isaZMurXrL6)!?tr_$KTC=Ck<'tVV"G8E:sC+qs0<I$]O;C-)t]$Br659;8>RoEB!j>`Z/_tNCuH66&RPUXcuTF$i7J091"CnqBhLh*f<f\k8S>puF^%]%;h01#entB:c7lB)":J2ZW2E;S(o']0kO(puE3LMllW,hV0Mf*e1M]q^o@;NG0:4E*,j=O,kj$+JELgmqC_2c%=6@$TFQ"#]1G<^OqVea4>bBZ)i:?[)oAd`DhsXG/"-+k;[nS/eB<f;rf-"eB&E^nf[H-G,P9Ss^9fY#JfKXsIl&>(("N('2BK+ju2.9Wb$8<UcY""8Of<*7u0$3U<eB+K'UdO7[-/@nq7JtiKqdW@#1F;;75Z%n9e%!:@'C3%sU"XI]h=c$%S\;X28[?ce,0h\US9Vde;HD`Ecdj3aUq'/b37PmEm]S0T7+2X*iRJPddTW^2bh8*D/`9pY)i`W.?na^E4E5f"iIeuRMI83i!`qWWSFMJ0g),l5!4`Q>G;Zf4KeVdg:d)/;:1\AL3PLO+H,NkV>I4L4Gt3>4T)9Xb&b0:KXa@O\Dd3PG;=/Vcabouq\<AJV`F?:5s3&;#b5@0*%SsnlN'_H6]F`p"@DeSl)MuZII=F/*FLM>h'aMkN6J!("+O""D8H=ju(Ehq@L:VrmOtZLB1^oOdQL%\$IjC$1*"%ncO5h5KT?DHY#B\u?L]~>
+endstream
+endobj
+920 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 919 0 R
+/Annots 921 0 R
+>>
+endobj
+921 0 obj
+[
+922 0 R
+923 0 R
+924 0 R
+]
+endobj
+922 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 335.31 659.866 380.87 649.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 498 0 R
+/H /I
+>>
+endobj
+923 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 482.8 659.866 528.36 649.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 916 0 R
+/H /I
+>>
+endobj
+924 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 383.63 444.894 429.19 434.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 925 0 R
+/H /I
+>>
+endobj
+926 0 obj
+<< /Length 3285 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0F968iI'#*O1W-kjUALlbERTh\Y2jqh4VIDPA;t1hM&s=pq#nB4(j+"fQ8J\p05`]HbHnd'4)IL7nDX_#^2fJ/ZJN"L-#1NC;d9uLa)iW_$)bbX(Q].*$QOKb1i7l4h93tp7Y5QEM^<k-+&9TSI7Ji+Qs5l(bC7c4?]A^?8Z4:_.=6PDC0C/>:?n^`Q>g'8QkZ9%c\QkD)S[U8$s5d2V0Gcjtg;enl-HAYg=gJgE/BYM&"fm?1/cH_`J#4@-PB[<F$uG+W9AVj3>\T$_XP"9?<Aq6p-H5P\]8+mLCs"TdmGhs''t9pO&I3#<1"_^AMuc@'Q(1FI8tj#o:lgr1/"Yd7LZ`c9Qf"taRm=QNMJ%0coh7=5^A_Xgb(NOO1KVZ].O>+r)SI:t`+MtQb=8<JgNf2qje/"t1_Esm%@c=i2G16)P_;,[;OQ]a-:*8^@:`!BgB&J1j9o+K%W:Fe8FeV!g9I+>eAM"1#J&iufTdKOJs@u+'X64?]_:k6\%iU]/M&Na]*]>"XEH'f04fd274E$LW[j5%*3BUWUj4+U=?An&giEYrUEeWFps6jU)rqlgKJg_OG(NaGO@9'XP*>7&Tm^$SITKo4=O22N1A4k$O!49L!I`:6@GPQ]NiH@+gguf`d[WK5HH7I/%M^8Z0`6El]<"BDIjd@oQ<-SKSGr\l@gcKmfeL*AJ-nb-TSs;_@JK4q1@Y2N(O2L4X=&rr_g"<#bj\-?#^2"nlQ&/.pIUKH+16!*%XKeOP,C0tE7eniDsU5<]b@+d,XgoG)%XF&<eu*"VYkIqoff^PLr"$SXC!H>Jm-QH)M>;J9:9Dt@+J&`Zo\a(Q)oOYNAN,Ioq6,cag<LqC"+u%Ms_('*Ck+tU/ade`D#=o,?,?JWOdBYCJ;8g8MDKRO=>a[LTYo"OR,25ZCp_b=3$(P9KBO1k$7B(GfFKQK%!\&@>WtZ(8(j@[N_0lKRU5-$=\;cSlq8-Tm4j#`WOQ>k*Q6OoIO,5I"EV6h+\s/Wd+mh;@mdfL7CP-c=LR@-&c#0\m"@;V1PV\%YZOBbF18kQm*nA0opHWO)hDIE0A)cp]pOQ[g(#(#a$A!["9lh:_j<eEeU,kR1[WkK9uqs;@,tJk%),$4mV?W#BiRm7$sL6<.i(3?rAM;D@/K6.":*_Q_T)N-T;Im?k*Mk_(bE=>n2bH*;$M7Eerl_*GpRee:4r=/WNC^@H%`EJ%Hq.5rVdi<Gg@YS>DcIqc#mFC<mE'r1=n%/46H#>Og"#j(E`l8lm0W&*]>r7QC$q4p>DD;KF`ehBQqO%gHc'fGupCiaFU9#QFGYpAHk=qTn!Y[Q+o=j'`ePnOVBa;W)pN9!G-=Xf_"+`hR\dbh*6[@*cj4Ur.Tp#@iJOk$i%9RQ$UDZ7HXn1(682LOAq=P,,9*,26:.UnTlLbTj[$W]1br>5<"P:0OS'R>ErGju?ab)$FA1pii=l-9`*DH+^YThE5+R44Q)DPTNJ/!XD3JJ]Xqms$K1+GQ_Me3i"cX*:,i#+B"T%$<O@E%9rO>EsaIBfVV;E?3>0^&?H2%Jjh@$fZuH-5l$6]OATiXBh>.!nPm`A1%qW*+RK5Z^RjtUUs:k-7%mj[''d%+k/2L@$Ru_[G,Spa(CRf$gkBd<;h@ub??#.bb;GeQ9K`k?b_E6XSfS';[D*JNUA!BO7k>l=1eWS@Ce;:]'Ib<kW(,Ah8<i%&KHZH@9K9+kAq+f*7$B<m],20]U%EeSda8P!c@ATbF:/IMit*RbA8`Qee'IF1^Mg%":k:VIm#g39&%;=/Tp?p;8[nF!HjeuE2g7M"E-47.HsLhuYY"tMeU1+LLfXg"K1.[ud!*K+7sC*^#.CFl,c91Lj/?(El_%:A[`Sdp'%;ZC!YpJ.,/mNFZtVd^%b_o@IZ"l%oG"`$->K,1MJ1]XY+=4nk['e::C)SM0V%o;hJZchh?P8iYS"_PW(AtGj%4q-O^[*d!?gdb.$>:O7ACn%<OSVRS@*uR+H@!\4iTu_FR+*sYlHYGQ\5b*bhJA!Y^8Y`s(H?@C^PGuR7f!Nbmd6oU`0IYR30]V(19HsZsQVs#YEi!/JN)f/0-9V)tUXHHVkClEn<=m>m\%eAq"(/ldmGc?Y>so/N8pNH?:5@k>Z'KSejnQ:/9US2p*tV1Su^9h*)cp,gjQ;lEo'h<#-3?2Pb$TgbA4IQS69$X'Hn8g9G$'ji7#`gT%:bPWs08a]HGh#B4`V;)^X%H$!AgVs<nE=)KZ\5p(AV;p7cL_GKmlS)e*_>#V.[N_bR#Qmc"`'Gl@EW7NU>agu:-NT`hHMUD:S>9A9r")U#eO#tJp5D`-g_WmbBKF"!:<isX)h!(lLV+dD"`^kQ#hXGQ,X0AK0G:#pp2ohLKrm-Rp%<,`p>[,7$JT4B(isHi1>!Xg\;TR,SL6ubVfUSb\XhE]O6`^MbKUO*)3+J'=6afu=*Y7m@2V9)/O^(EE+JaesLrU2LXGjTXhb)U<2/J7uJgbT>P.f8V)rX0&BHK%p:a=[1`aP*84oI?+Q?0<EPhgt?O763*C8T4?.8@c.WKPdpF$O5VnO0E`qIPS[X-W:eF1p5:'DSX*1YS!Jde.4<P]O&`m7k6%&r+$<FE4p-9Ria8gi=-%.F0C4WR"O-na^(Sg5CO;7%s!p):Gq/DR$l&EnsYT=hts_!=u"\G>U1e_+W-)b5Rh!=i`_H?lgsB*^5`Vj273jgP9-=!Gmsrr6/c0?8QOqqfm*7r^F^ITT`%e'7.B2%tLG6Ggb7J#tbgUr@Y/-.]Y_o+k_7I-J3ufer0=.\SLZUksn<`lJn_9,*j^">rsVVVLSqll?:glS$bREh4%A8:!AQ)AjG.t"@?l^pVN_kr@8]t3OX^%",qrlH=G#b;irDVH1sgib?0V<=UFa&9&?,"#AHjnK9`gjh#u1NK082fp9oAfO*iM5HRiPkg`jbD$of--h\t<I?R.8;PW88PB=lmEqSc_%3t&Bha_Oa^1/8@d?(Fr][&/+\!pV&D_O<n8N:j&RI:bDc5=/[E57U!5r/K$?hL.g?mH!,h^b&#a5%VQ@"!>Ci5LqX8iA@a_\ab;&LMfLgWS6P`*jg"Ti'6W[OK+_b%`UIZaE_3P>hcosSn*o0[O0P^@M7T-76a?ic!Sr0a+UYFauXnn[?eRIOeK\PPLB+ipT'eDQhm\6`0r2%OK9gnmAF$ILesV1G[l!h'#Qj[aAV!AG[fP-ggD5o8#+#2KD@Roop5Nqo_fVOX'$eC5SrGe/9G5dLh7"GJlBY>aio\A,i4LVp)+\K3[07<ofoX*o60um^Wf2H_>~>
+endstream
+endobj
+927 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 926 0 R
+/Annots 928 0 R
+>>
+endobj
+928 0 obj
+[
+929 0 R
+930 0 R
+931 0 R
+932 0 R
+933 0 R
+]
+endobj
+929 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 416.79 478.056 468.45 468.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 487 0 R
+/H /I
+>>
+endobj
+930 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 303.92 369.056 349.48 359.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 916 0 R
+/H /I
+>>
+endobj
+931 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 92.0 250.056 143.66 240.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 487 0 R
+/H /I
+>>
+endobj
+932 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 95.33 165.084 140.89 155.084 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 547 0 R
+/H /I
+>>
+endobj
+933 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 212.54 165.084 257.54 155.084 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 49 0 R
+/H /I
+>>
+endobj
+934 0 obj
+<< /Length 1477 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0D9on$e&A@P9cnPoM'hO]Ble#g]8-0J2)Q,`7F.ar8+sN.!5J6O$n&Y3k6]!Sl;X?iH.?a/ERlA7`D0u$VWJJtJ:87.D/rB:GBp?D?)H@Z6Pt<%#b@oX#cgUkTZJn&o8CM%<rU,l#QgFXo[<isjf"CF<)_hsg.me`Yf+uWsjam(uTQTAA4h!g:01;N04!f7JVJRoP$1E3>/\[:[8))?R_Y%O4(5+h2\sJl!'eXD)&)SCo&//JrKGpnY$D[<lcRD[k#VPggJ@NY7=oJ-]?\ei^%SVRJ.'rr9KSCAAH7mhO/7JF%#sTZA7@tS*(7n$-5?NP>R8J%f,E+jjiq.hPgL<#jY)utckR[i,(cora(j%:9Gp#hVR+;d*dB%?&IJ`a&dChhB1m^PLDWiUG#):num\;rh(sehm7?U^;-rTs+$>HnNa*Hs$HN*O#6_7oCpZo:@dIU?ZkG:,N@@AZP@r.UM3D#"O!ARP>109t269V(q&R>'DV4C"Og+rcQ)D=o34dacc+:U5b@j/)^M1b.)9,\beJKf;u$Q9S9pRu&89(n!F[GC5Sl?lA_-S5KMb/u5'UV^>+q>R@Pdd6>>Y90"hHVp%_37[h_/;Z<i8!0>8p^"r'qYhTXVd*C.mt2>:A?;,'SE"t:.`rr1X33+;\(`RgHLq9FUui[Va5nj;2PK2<Oa]$nT!bhqN'^"/\DW%5OEn^L-JF'hi$@$b9X@rm;h>cAjG.Zta&(]OFm^(JM;[L*TUfqsQ@kt7.5_t@b7l-$j2@][BD2oV*NbZfor!%T"mAR)kJ4[*FtBV[QYB`=,gQ"F\c]a+Plj54oH$XjT^XU80+D<SV\CTaAP1lC<74N>0bcuC`K>HE!m#a,.5lA83AT`UNlgk@TXc_N+a>k&5Z"%4JmP,<UDi-uKaE?0W$OkB[dLYC"2PDD"Mn&E8j1=Nl*!WCI,CBL!aOS(=E"Z%8K8VC/C&@V3\j_ih=;`1egeXTRFVa+g<c9(QOD\(]XIFUQC!'W;QoG4ATf>.foEX=^.^+kU"mtG79%O*fi>cANFuFmE!OGbK>3QO$JF)B[iN+'\k/MV-q8cfOmql1BZp=^)rmHZlN.8<LtBQ%&egm`M,TT&!D.OX9/A;r3nUJJ8`eTm7?C-r2)sgK@f6('j,+"GMW"M<YMZUpn\irg3X;E>29Sl:gJj]=],P!./,CO+V&4I5pH2]Y!\rjjY;VEQ=bD+[atE?T4mDm6a4Sm;RT'ailVE[b42[u/ODucq4\$cg7MPLMn3&L!*M;6"f>2L!DbA%T=Ijr,)PGjoML/P=9"i77.L+4U0ls+DNL)n&r(/ii^l>M\VC6%'1frEgN<>]8CWB$Ac?O(qbB4P$eYS+Vl\/P&YL9[?:!7@<`>'l?0X@[tOj=eM#.#R(6T]f-(?t\._5#PL&_i:IdWGmEh,LW*<s)^FXVd20^&3X/KdM.pT(W#8hu^R5m\A7KlYYk[mG38tTeC6~>
+endstream
+endobj
+935 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 934 0 R
+/Annots 936 0 R
+>>
+endobj
+936 0 obj
+[
+937 0 R
+]
+endobj
+937 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 386.41 656.0 431.97 646.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 547 0 R
+/H /I
+>>
+endobj
+938 0 obj
+<< /Length 1476 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau`TgJ6fh&:N^l,+_&/4g>[`_HSZ%>"1Se2>#1q"S7^Mgms7CS;e0_Im94j`T?%)0XK17[F>\hj790JQh9b<UCUG"6[drToAu,#XH'7>_B3ne#1#Up-I`Enq:`A@@?d9C^N%kZJ"0ciDJ$+^Hrs[q8emb-P.#mZVp9L!rb7#/2TQ);&-df/Iud2Zm#?8>W.0<-er/9>(Mf_L\O0X94!(Udga1T^cgsJ;"BCAe=;L/ZUjehjAPic@YC2WK5,aGOk?B=XK70*Uh8'1li>+$^)W=fLahOApAbscr#>lM&_8h"9qE[tqcg=M^_d")bNmk)"]d#)h"J-L6bj&A2=n./s[>3/Wp6\X#BNh!APGH@&GODSVgY(YY05"XQ?Y'qBoU$G/Y*T^8<]1MqZ@#-2&eqKD]oOGbA&RE)mrr-A/f:M6G8iE%971LBDimAl67(qdZ0IJf?2C$m^pWjHDIb>fp3B%NFi0e@l=oU9l^c]nTE!CK;$'g!Wuk<_)@P0$*"eU]W\(6rcoJ\U6;/!&PRTCi'6JWX276E#,[YJ<6gbg592J?Xliajm'-s1'?I@;<bVha*DoCif\O:mY5U3cp*+sJEUu1e(&aOS&ieo=Nksgsb-?8Q<JURK:IRS(P`PYg0YoAOrAHlQk'*]?)A.;PN)JT_aTsahFQ2R#67#+#7Up=d!Q,q$'Dar<lW,;tDc3Pp86):JV/SHJF$q#_+fd(99(iI6VRuM'a[jCH2KL]k9QC)P_"uS>qRb+#@VZCet/`K'BhciY.;?^n06_P@AWorWATF`5koMVpsa6!/T8R7Z9E]d'&1gB&-KPYKcL6K0iY\Ub3V1%JNZa>>pZ@9VsJLSK>Yc08(U_o&jkGh7JX9n76^*^jiQ80nJ9YqNMi1.UW=sk'G(HT.Fj^%3:m%@>'-8'3'/dJ`&%t##:IF<@$Bg)p$%%$u*M%R1s6Bp0>,k?@Q.,,2Q#];fFcU[cR/\\A%-*CE$QX+;>&u<]%RgOgG^O]_tN'UYm<\Um;M"UWY-,cL^`#i`JESGplnY3h.9dP6R8\g>QpSUKbW%D+*l,-"]$d[[^b[6Eb(N[Gq]WiQ6F.h9Pcad@sF;$D$2<&FN58L(L7,5paQ3\sYgY.P(4cOU=->fZBQ0oV-9:-$n(L<NRk/0WZ<*3H'^>:!Z^40>fJU["/`/BCE]0>9#Z*rLC1u4cDHk-KBM8GAg+uNdO^sk:1d[.E:Vh]rE,+)c+LP1AmkG>-3r/e9&e.L#bIS*cLho,.MNVSLl@Z5$&GDV6g'RB3jLl9+hM0A!1&sqj979jY4>__WSEDb"Pi%ZK0%uX)sMp:r2Y=jh#*qB3uk9MrL`C,I3\4?NeTuBtu]iA^7+)?Iq`:;Ck>)0QW@iE1@L(*?PN+NuQ'#jg5:E?%LR-TL8',V",DLW,,m$&,S=8&2G"r(='@K=!q3f'"YLQVLCfYt^8Zg7$4UN&d8cf*'Mds[`.r;b/jBqY~>
+endstream
+endobj
+939 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 938 0 R
+/Annots 940 0 R
+>>
+endobj
+940 0 obj
+[
+941 0 R
+942 0 R
+943 0 R
+945 0 R
+946 0 R
+]
+endobj
+941 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 275.96 647.394 324.57 637.394 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 448 0 R
+/H /I
+>>
+endobj
+942 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 332.35 631.394 377.91 621.394 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 564 0 R
+/H /I
+>>
+endobj
+943 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 416.09 448.95 461.65 438.95 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 944 0 R
+/H /I
+>>
+endobj
+945 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 265.87 318.059 315.87 308.059 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 207 0 R
+/H /I
+>>
+endobj
+946 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 265.87 187.168 315.87 177.168 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 209 0 R
+/H /I
+>>
+endobj
+947 0 obj
+<< /Length 957 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gaua=?#SFN'Sc)P'tsfbFlRCeG?nG&<L[$kflg5=OX?qn%1,YNVZ$C[O('&[10PsA%C(<;o:C"E>Q,?2cA)h$#Y#pXpEK+^6Qi[!";J:[+qbFn&5U,0s'fjm<IK<V8]k[/!,%ZNUAAS(R^ssU?%6sST<I;6!'Gl.2UpcMDtNI13mG]jR[C`;?"d98o;O@%Ve.9$j1^uU\5@aHE02c)/4,3r:d9Sl"3_XI,4qPW:rRU0Ciio<#hfS*%G(F%LB8U*C>eE,Yq22483'sm`s<;KD'Bat3],]H]DdT!+pqeQ<oGtua`QotNcSK:m^#Tag2I#$[J<?S_2I!JYW[@`]MZu>b#E(TGY/WZAo1^F$)_oa&i4I=W5^)oQIK&QUu7i&,;@(Ro;nGfWmF-A<HLH*6#8J\$k(,ZnZZI4X"RKLEY__0]'R:l71p4^hh'HTP!GC,iIp*F)<KXf*J><,b]@b,bUB?[PnRRARV9NrmDgc6mDb)5%_9M!B&$hgmC07ue@Et4PS#&]<T5TpD<D1I)0`[\KT$K)Zjq\H+R6Ks!b>CFccV(e$Vdun`qMh9`-+MVa=%bn+;56j31oJNDRpCse:JV/[icGu#ZWU#Wp^'!8(;5n";m<?F)_>u&BCB-'*/l;BE:fn#:tZ?!Q-L>+[R<gmLA<l^i&0,c=L:@`I2)oR;TU_6]8iIf';f*oI/2K][Vqu=`9OuV.RnKl<+I1fXD]DFYU2[g(8p<0fTe@i9S$0q:Tqfh.&h#^5?WdAp7tqU6_ceZ4jee>#9i>HY]8k]0&;MHgjqh1uW/]/kp6_*lK8.Dg<,ZD(>t&'ubA`7tV=V<A!_S>XA%/*I]):3bbUU>gt/U_,,^^0E$!8nT2)^eRIW`??ue7-k^A7YUp?eO2KM\Blmg>]TD*np/NTM7!j3qGVbEH,^ih`_Y-"(h">WQppZ-f-Y<,:ELlb`mem5CW)Mg~>
+endstream
+endobj
+948 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 947 0 R
+/Annots 949 0 R
+>>
+endobj
+949 0 obj
+[
+950 0 R
+951 0 R
+952 0 R
+953 0 R
+954 0 R
+955 0 R
+956 0 R
+]
+endobj
+950 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 265.87 693.0 315.87 683.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 211 0 R
+/H /I
+>>
+endobj
+951 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 265.87 562.109 315.87 552.109 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 213 0 R
+/H /I
+>>
+endobj
+952 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 265.87 431.218 315.87 421.218 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 237 0 R
+/H /I
+>>
+endobj
+953 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 265.87 300.327 315.87 290.327 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 239 0 R
+/H /I
+>>
+endobj
+954 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 265.87 169.436 315.87 159.436 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 241 0 R
+/H /I
+>>
+endobj
+955 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 180.34 103.964 230.34 93.964 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 245 0 R
+/H /I
+>>
+endobj
+956 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 216.15 87.964 266.15 77.964 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 247 0 R
+/H /I
+>>
+endobj
+957 0 obj
+<< /Length 1787 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat%f?Z4[W'ZJu..J/u-$S,-T]4!t9/6e%+a;SQ8B_nCUMBasD1L"1jDa-#NjlMb%kn8EDN-g$:8@3bT1[jJ42n)p8@hD6&a&sCaAho8:58dHn^K/:<aGX`GN]pf4.$\(-=&NXBqBApr5#R/g5;nF<bn?'Z/hWnPdJUo+Y[Wa6ZHAqU]8A.Gk-7Gk0t;-;ICna*,,Ig]#EpT^,(7!!iAaBfk>gN&T;'_Mh*/I@Djm#i>;k<s^Q;AlE?RqG9[B8-HL@$''C!C\Wp4JIp@O6ZGC!CsT_s5IgHRm1MmhkrI.b52D!P(7G(u8Q9B(<d%(!9QGTuf4>+Q(H*9fBfrouo-^F\^-?*VsPcp'OSgLf"(qQ7)c[;ue+3X5A%55Su9a:Ndr/Xe+778`:tM2ANu<#Q.4_""bF3e^8&n'V+#ce5oj.*8:e!hRV7hnQhs)%m$*P[;E%HKbKqW2(MCF'9^kIH(c.QscWi;Nc;-a@'A1!LOLQS<S[5-N;OW%r`=01[]\lV?A'>r9d3LR:)3K;poq#aN[?R!I,uDOHG\]_'J'=V"4deLa;QoCe?5=Ua/VfaTGG(Glt!53<I!\+N0M]S!#JAU^0L_ju&f.,#A+:9F4$Zg%nTE-CC%qP]Ya^$5")'J5'a3R'QF_,YTnk!`G2,%4KaT!)nI\;g,m>P^,(l\<LOZaE*Iu4tK">\;l4J%KWt)k7+'snH]+NJrk!4:aVP4e./&$J1;QC?qLu>b)J&#AV*K=mEg+\0HVp+g9Et<\b2gF9J?dO*BLrqP$!\F0I6uZjiWd-^]Y="m0r+d+<0]"8;Y4J#E8`t9_c"OQoBOfAArZXTQ'`C+#(Na?TWmc%?QE;oBFsp+f=&j;Gnj/n38E.o*/UZDpu+H6;C.i";?7O%-BE4RE(i^g-O\>Kb'P@'E0RYa,N2#PM:m9A),sp#S-dd)9ck]&s!)J,7(4%Hb]atIdIR+%A47IUNTIi.G*F@KF'"'g)8+MJGu^:jO:Mh6;6)-;Gnj/"M?,H]E&_A!1VCD)(SIM?kQ9tFC#&)Z]^:$YsRW_%pqrO"I"AiU%8J]+!=%!bGMX5`^_=dJk85pd!5`774B+^@tfjKVbAcNW#[q&!P'0R?qLtk57mWg;C7b6e./$.J5g%oUNW`#n\1gCK1Wkjd[`:*I7GtDj&*dPk5rIBTQB>0#3bNV@fVGn64E\L$V?ao'$rX\h>f$fa,J<K6;2[d]t#R+>QRNQc>,[ZlkuX0Ko?bE9J?c$*BJ*=qPI8Od]l-Yo/UB68O2OeGlobPLf$36aLRUi#po\^2kAP#rN12NJ13d?.JLQ@PR/Z;V*jDTTG2+Z-ljgK<$Pt+8O2Oeq/qqA\POMXQ7sTjSXY#cM)g*<$bpfgo,8b5-id_NE;F46!V:!A?ZA,EjS>1u7KaSU>^@(GB,p]c1RQboAJEV4K>QjXoDoV!pr,%V2h7,m4=E>*F5.3mjPen?n<5$O5YMhQnT!#:D`q<W^X)(eGdQf&I_We\`FeAYb#l1nV0C\=U=nqfDWPcb51M`=]<^\VD92D4?iPjllNh\fc(]W&(U_ptrR"L7cHuISO4PbKSFp;<p<47C'OKOlc2N"QSnHZah;1.nGLL]h4>trk>;ULl@c,aUq>-kmj7MU0(Bg^2QKP]1e&/Vu,9*e"nbS"HGpTKU*&t&/pdu;o1TKZun)ir\oj<JUFEQeK53tAolr7f0`_RWIgG"ie_;Jq?gGS['g$BEr>j?*,l3H(%qnDKaolfT$_gGZA^:d:@,!SbL^*C8TATes)roX[GHN+(VilJD~>
+endstream
+endobj
+958 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 957 0 R
+/Annots 959 0 R
+>>
+endobj
+959 0 obj
+[
+960 0 R
+961 0 R
+962 0 R
+963 0 R
+964 0 R
+]
+endobj
+960 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 160.32 716.5 210.32 706.5 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 249 0 R
+/H /I
+>>
+endobj
+961 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 207.81 700.5 257.81 690.5 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 251 0 R
+/H /I
+>>
+endobj
+962 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 209.48 684.5 259.48 674.5 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 253 0 R
+/H /I
+>>
+endobj
+963 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 213.65 671.0 424.602 661.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://www.iana.org/assignments/http-status-codes)
+/S /URI >>
+/H /I
+>>
+endobj
+964 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 208.08 639.0 249.48 629.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 564 0 R
+/H /I
+>>
+endobj
+965 0 obj
+<< /Length 2367 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gasar?#ppp&q/*0i,M\\E;@N'IDR<jlbqJ@U"8theinnXL=)_5EA\A^rUmW)K'+uA,[5_+o\"ZhW-):X?,$-dI,*usg7?f8rMJ&t]]ljcr7>eFHe^OI9\S>%W3siRJ,Ia\[GSFL%m(g"pgon1$[XRlDCDF"QZ$)X[[%H:g9B,pS6*>(1oXLoh$i&/b=Y]>V`-`?;sl']CRllWD#qm)am(NZf"ZX1`L#&#Jd,IjVo^6rf[ML0e"6:hFc3$.V?:X7V"MboqhuMr^32DiYrfr']O9Ppd)JoAgNC[p,FB'jB&*VA$.*on"13'jdlJ=eKXiu"kWaG?[d[%q63SZ%Z>LMo[`6sP!,+lGBBU@$OP(8Dkb?Rrber]NEmS1IqY+<aTN29Qp[rIYP<26b)"hYe9!?TIFN"Fh<`lhJ^Mn/I^qi=??MX!jQGiiNYlAEd=+Bjsh4($W][s:;?]oIA]r<_c!3RE/;^TJ4VQk>=58a$cJSilK9Z7XRP\b>p,%[o\*&0;XNl.u&kp1oLKdt[)V)Z=Pkarm!juZ)Q]Scur!p&A;/\+4,\p#%h7_&('4fcT/l0ghM12hnoF0l9dl`gbd]2028j@nYhiX(eL0;lqMI+N7>D5R$<K[*B3M'1sSE&+EKSuI?qs&$<Y/rJ6;3fX-`Lot?9NST0UnaE9-.J@+'LS:e6jtD:d!tpbK%RAL7WAFarRZilMHa;%O41r,'_3d%2.7^0GNk$buZ)T)8glWB.pLG;AK"8.H0-4Cq;\\]Bq]gjcCShQ:rf>2=Q+t(6>HuS7QqAY7bI-l<^d`\mO)(@(Ss('dU_>*f!E'K9O#eZ+k<d?:9Aa-5h;tXJrC)V>G)r$\q8]JA(!-L]ITF:!`9jT4#0EW.T(pPZS6M<5W&P]j;2rRCj`&O9Pt[ap!^_;:9T5raO#0l]M*@q;(Qs];SC/)hJ[$pBp@$&rAV=XW?nTT<NXFeS>9S&F'i&\B%M(kUHst0a@cAabrmH=l<u;O]_>lR;_L'!L!1C%OYEShcB"'.Qg@\Y1p,sS+:R%`s/"_h]r,d:A']F/um4PG1(%HYOEb.Q5^pb1"(K,h[_FU+[l7K5bZ/a=$rtYT^d!UTSWiXh5!cE&IBHp!&/Y83[T`k[lCn"q@<*PWe1=Na"`@\aC^9jY3oKf]4eWCN/8<tcH*ndEBLggQc>));hPZRJm@JF-?1fG>'c%-$$\i]*0h;U]'N4oA:@`Y1D9f!_\4:4FR<`u/k:rMB8#cVR03%c596O,;?b%Rd<%C6OC>"K3flD\)T!FJhKXEU-JGCq5K*RW2HP,VY@Kbgc.\^JGck5H;Hi,BX%%YG'9VMr`Z;M7HZFI-@"7u`\Gd_S8sDk%9KL&c;jU)?*F1(qd0^X842o&Z^a=PQT=U5feL?a7*C.e*+S'Q^"fd9o(&YV7nA9hE-jN9_2Ao'AB/APkKt3HCdiG^HKN5Qn2:C97+-5rBG&P%YM8ou\Cp;;SFL\nj&%?'Z>ho_PL*_rg046+]ce+6<sc(u`iPU_Z%2X]Gi2X0joqhtnQ1Q*8N\bP(bWftAZ1NmhSGlE&s@6$PlVG1B"e/Y^D3FceSp25E,:'kW'NlMNUSc&RE?BVf?]KEE!E1@.KcRn,uFErkhmG-?^dJiS!M`pT9EnXmkJouCl/Mu1s,.27:(L`M%;OWCA"J!EC6n#cCOXo+]':Dp3M<6fGZk=YcVYD"B<T1T-qVL*:e$U%>&Oq/J.L7JdCGfoK*An$EN"JJXP5%A0(+lfZB;9e2_84*J>If6L@?O$]i<C#QTl6/JAVnD[t:]`9W/3LR3<[NhdXYl27&1^h3=f4D6qs%X;NFIA=Ef9UAhDAJrca9-8J,ec6:k&m_At$$ilo6JRf2%r7c^$o;/7c3bn\\4R#YJgI%\73@9TnUTPsC8A2.MZ42<@+dCm>8n@c8mX2[/XQ&`]#e\^?:uc(U,*!^_Q4r'b'YkgTUSN;/I+9(.Te,WOh=nluH?X<JIHb97YhS&Q]r?H/N.-,.>)pePH)-<D/alYn[LdRFsr^Gcb(7"u1`]6K,]iPIL<D#lp#nPPd?<_g.U541c1TICL^p"4gElq5_R7_C!>iMXjS&6a-*7JUSUS+EUTR"Bp`EL=<[I8o9D1HU655YUWEF7=Z)'7T@sV,4N1&jJLNau:/fnPLSNFQ_04r-B<%]*#Xb4$F-faU)a5^agLqP+#&bY=4Hg%'N&\En[7HJs1C(-!hM8s+WcHYr_bi1hNA6rr1,i/OIb_Y8U-hPKEUd\<%JYa[oZXa1Zr*4h4f-kE_T/eaa7Y5c*)sN+4sA3pgAMo&(J0P#O+M*o0\[Ttd!h.P^InelYs-30!3_8*<a!Hkl\7\/DtsSUUM4IFf"Q2ua+la3Hj~>
+endstream
+endobj
+966 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 965 0 R
+>>
+endobj
+967 0 obj
+<< /Length 721 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau`P9lo#B&A@sBka9R.+kbFJVpce4!J[#d[)$SiR2gl35RH)F/2oqGIH?Mh/qje5(+uZ<5/#d#lb-&FiIh4O6NiQPJA=4]!4b;u/9F(1"N1lUaUUF<KFtj""+lWH\/6$m20rEY_N`=bP/_8FD^QL[]30M]WF"gg>$^3Ui"77+i&1nU"UK/6IZF6SRKf9J!iQB?#D`\-%h.G7`e"8e^bY[%>h=f?+POJ8F2l9e!9G&<7,"I"eQ,=531t-FpSpnGc`51H!9e/5&T30gejcWdpjTc_Wq?)NDE0cgVQPc/[G[HXWVf2e4V#q"rXa-ELd0`r.PInZ]niXC4.5Pu1D'[CO'8F84/o]-4n,GM(RheV;,]k]!mK/>D3$Z8fZC9<U_5F"+jm.GR!YB-kWDe@r2')f&p"m[SOfAnrS<0B]D(f(jmB>.l;_85/UK'QaP=pEN2_7GB6#e%BW!?"KR1j9Y;a-"X_X7$4%&I[I-#32&<0Ji,=jgV/s`M!2G-UGX0bQob,Vcn,!:II`FipRgf/@MNQYSq4T1V+[VDRJFu48,,PO'OJ"R?m"-"`):C<5O67hU4Kq;U?AatO>_[1>Hhj7-N0WBRhFE687`dRs.!crS&/<&AMEQqS.S#al;LPskBYB&ab6\O)X^(!Gc+Mll'^8]7Qa_GVWB.0o!V@[m>A=cAVp""%jAGY(LKoEH;%j0lDa2]3)@m'T*r!<WsCQe~>
+endstream
+endobj
+968 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 967 0 R
+>>
+endobj
+969 0 obj
+<< /Length 1033 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatn%>>O!-'Z],&.ImbmC4(6<-_S73,fWkGcnt.+,]<.<`[j\Im*kFad`#^qW4')eVl)NkTASOdO6=p,R>M;@31_cI*%rNLA,)3h;=H$9&RdGdYN!lTPb\2%+u"a9p5[_sSM)L4:sh?%@^'KXe):NH,h\6n`:NTaF<5jk0M3U<T[^u-'."!B=DHPL@P/A59a!gW`MJQ4UCYale#8:LfB9#$Jfu>(#sek5?'CnL*bEr5BYX)J.C-[KBCW3*bt&Y#iR6.UISgWL;d\DYdaZPYj7*c%-WCn3=kFm<,h\0&)G_O[+pmRub\X`Y7J82:3uVoEMkq*/Zl[Q3-"9u#R8,Dob?kdb:T!d'no2!N%&JE\)]Yjif3@2rCOmaeZ_#6P5iFi0DsgkIn#Qh^H![6821Z6klk,f@q`;f>\JX\B`PRtB*nA9`EZ\\lmaniu#L?E8Cm!F'FYT%NO7m)B*c+uiqIp6/61Lqr*L&4I$!-],HuR&LEhPe.Uds9)(BdK#i`'YM@@W5F6qJW]/]@&.a$Z1oBUq1pZh7(tKp7D?*FT=P/s\ZeUB&N+EBi6'_]VgNH^sP@?)?\4bD_fTN:[*\,)5H^VQ.P)Q=[U431C/SBASU9GX4Wf]V#+U?Pg+iJRGXOIG@;DA'W)8P")0M+IL;^LIJu)SbJY)`(KsE+=X%TDrnc#:/^g+Xo](h'Pb!k`BUX.%Ot*7#)[o7Gs;4t@S$)3#m'lip3/g!\P;N"TDRa!bD.1++<e/OEGuY/mb(#O-pl""]P-reci15WX+9'Iq-YQi_`jgL:/9)#CfH?<XNIo@h-n]kAnQpi@3c-7'dBT4Mp4O(St*6fm.gI5'<%SRbMY'?$FBa=N]""VWrEtW90c-:r$sb(5X,Pm#FD8ogY)N3mbgc(K&<aGh6fafUieoLh_$^hal"p1+c8$7F($crp>kGKo-Cp;S?LZd^uk3?Z$OuA>Ce],kjMM!l`.7&SN"S,Oe`jDBR0'HL)61*Zf$j$02;;FI>TN-4n\Wa=U+O3kcQeW%-%0kHPSO%~>
+endstream
+endobj
+970 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 969 0 R
+>>
+endobj
+971 0 obj
+<< /Length 6341 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb"/,968lH'#+6E9]]ed71942\$i`ff#*du3F6D4moGq\4ee`$cbl10fN*J"U.GFQ#)J%>fr?$T>WeDAY<R'KmRErP]pM%[iN/EO1l>r;gF)OXmKoB%idWj:\/6aU.Ukt5S$-J>535r>Cj)&^Z2!>C<HHp]Ra%S[5F_U0S%nB2G`P3Gnfj.#/6*N\J.u,knn,L<fBr-M,DLGT_p)dET#/aP.*`(Q?a!4cO8a3GnXDedb65!2l&/jGnGS/*O3iZkold`2T3pV3Y<OnV&'aP1k]64^6doku=3&]7QFs;#bmo.c`F%2cS+4C!2#dBe!kYEB8G'OQ@Sc/_IXfdQj6Z'mlq(A]Ogt@8<d'h@Sn/4dZ;M.5AoUeSFS99hrT)j3?Hf86mV\n>QGPnrlh"uID"c$_X2\V9<S]6%Mnq%/8X/CQ^p#>K8\K/OF]n/s*^3`nBXhFuO-mhH#sdPT5b:DIj_(S-&_2ecF*FSOCc=e8#$XFI@EScrncGK,UT+SB.hrZLpJ8d"rr/=F.n'Y@<KoO<R/fX(4\HV"j!kcU<u/ajSf0)G8KYoMP8=4u)aNsnMWCA#D%F8PhF9C\Cq5$['0uFpP+mhk/:ag$6tB)3QL/_);3(_Nh?k(@Ito#h]Ash)>i@cZY#e+UNq9bkq=auap/39WM"U[bGM'AL"K3O>J)7[%VgjNKi`"D-Qd23%i#VU`pjpL:Oa'm7qS5iJ\FWUjlN:3p's8(chLXGiC7%07#EJJ.UTaO8=s$ia3e%?Z6_`'8R/[Bg/(,Kj5!.]HbRTZYhjjXeI6*-7JL=G>dC3KJ%ES`(&c;ua1#IF^D?AfVYHg\eCE>"h-Jh7q#"$29KKtkKY/KU"$,/)ArfoJP)?<`C!/S_6.m&9%3)U@Y4Q"rf$/Ti8j%Ie9*t!CN3<OfS$\1!hZ6Fh&<(),;S(>TCU4SdqMB-;&!$]1LV;dgkdf>t;Ol7^2h(6#(Cec@;'O'-%b)+$%!C5`M5aFm`nJ%s%;_#)W.&Cl#ND`^&LW-%4AFs&_Vet=u&B3(ba!l<tc^GBV6bRghnLFK!?N'oa<VkmsX,.'*X3c7VRj-K_+5,i[\)&(=f*<4BT`$YjVf<Xb#sYBa;bT^,9_^Y)EkZgJH$Tp>1PoW(RpEe_Y#Z`iP,[sX(:^:beg0NE[n`I.-1%LK&s\<`'!<4A(gq)$B\G!ld+rqFYFGKgH7Vf.L8c1IS4AFRYR*SU"[JZrbg-VM]$`kVd9YJCXp,56EgYO7e"lO9TIcWm=OE@jLo*>+d85ObMEUBN;Yfu:Mqnnqi[GTS:\uD<6No9,qq3iPW:L;`<r.(k`?[E+(u/c?<5g/CMGan.8ip1l_d^60jYXD-B:p2g_=0Qdq1l`JS,],U4V_+@P`G]rB:q`(Y.YrIF>i.Q?[Z7MV&><=B?-OI$K?)gVR#K8ZQYJ*3XV:SVS\I+!^9Vl:#T!;)@2e38dn,Xa6(3A9dL!ub,rS@A3#qUPZ:[oG(?id3[c2D?adQc>?'3nTpEire7$EL!t]`4I>l.`a)S*=jF9uo9Z<OU2G9mF?m^s*8)-s9*pOL"b#:N#V20@;p9m#nL'gofEL@:mAsIth$\0L_3"Opr'bO5WQDB(`'cn)".jb7Y(BBm#$!/s[,,-MmFkcMe_1J6+q<j[O-%-LAnV.`X!)]_OLpgN'Z%mk0g/9n).PK5d30"'sGGU'sSo8M4Mn6;ZU(hn/bm*0HVGt2]T]EYUWRSi#Hh7,C\SKd@``AVX^qj1T93^@kWB=__,+f<hSWk>XHdR4Y<r8k*Ns%ng3$EZhr-&"RdciM`QDET,5T-8OK4JP:\%"qQ<E2`5;he=D\p2AU!lrdQX3]&)h2+-@T&<*0TV+>.GYB^+M+Ef0cTs9c66M`[Vt2]7W(O<\0or=##0fDe`PMQj;4?84a#MW8+d-cQX6%26q_d.Pco;G.L(FF%h#QK8h]R]Qg<7rM[iuful[DMr!.(2FQB`]r1o2CjH$iufl:'H0_`u*E@snY.Qn=R>!*/1c]k!r\,(&.Qeo4&S_+Nn_Jlr_+E6Uffe%I:;4[cTaf?brp=Qsmm:mRPt?\78<&#`BrkY%:bWtO$idS&D2BlU1.>2,lk<ObE/3`^04+^I(YEmh3Z"bf"gSE8D.Sh6G^c#Rl\d''ZPIG)!p_qrt>F1JtGXDD78m2kug_ai^j8Sm$42_CFB?'+>^;_RQYZ]MRS3S,pt^R](q(+W]J4#%i3+'g]t8BAm1j[b;%3Uf"#.l@kP13s5MiRPiDB%JqJD(1-MV4Z^G%^T(iS-f?D4HIY?%Y/1OTSV:H7C:n.gAN"FmX9TEYVkOn'*9;RU-/%2Q&:sqgYK<o0"*9GdS$6geCn>H12A3:iq5oH!80XMP<Ct4`XW%W<mmpe=>9i44=kG`&T^'#A+8[sal>FS^\r^LVkE;B#$<F:h&UWE3@Q/d5&;.s\Z0AiQ)BB"+t;K=GWn>q4k$HX[AqhK0C"V:_n;h:K<M`\[V9IMi9Q31U&%F6#t[`L-Z2H)0q%T')(H2)*5j)6Bu8G.0$sI<Fk_;CGAVjLK*8AKKNVI):/[)W6N!4f8Ec7GD9h.PaXlE]P9p9l+#8bu%PTeR%>ou*o0[jXVJIs,>])M#E2=Ei1"hh\JiRW;!^J#kXRL:3MMUj3&Jl6AVA'gTM-6aoO9n25"[H6W[E?fp.O(aM`/UKXhSl-E(!`#c$\4t%@Z6qW<(&iEQ6L%LcJ'f;\oVWA@EDaq,P&)*<(:"/5ZK;n#Bm@cp9p36E$D8b1D8:hdUP;q=YiZKDL4+8(60ZKA`62SnAR>2G`b9'&"b*R.AHjPHIuW?q\$N]di2MLfJ36^:%O&kEEc^[7n.I?Pi#)A"s=/&>c#A(f6(Q+DJ9m%A2i>LRPY&$4Cg<#.SDk=kUHhV4QL)):r,gD,n;^X!0N&NXfP0;]f`,8i]1AKXZ)K]Jt8W/CP.IAH'f;X!QP,C5n4L7f/"o$$C!PV[puEh9!0s],3UdH9r3YZ$9qqc?mDUu1<CPK9E69o#Fd^2Ft,r!o,QnMS#3RtEJiS-SEqtSQ-+_$(O%CfD,Q8F;n?o5or"cuJHA:JQA.K2'@S6.E0eH*Y%V;cTCfZc7CMLfT:9o]F3RuFB4217h%E+RaXo9\kgDp\&@QO<?m(=kcd.VN[DXakD*VMgL(r!Le?%+3Gl['6*%QQ6.MWQGg0+n3Qsc_?,jl6qM1!(q+jNDV%Z6'RgWf#3%DgNo=;33D_kIH&jC'7e^!U0/8eFqgfik;t";i[)i3gG$;Yd#c3";N1'bT!`XYhpI:pA@oM;^:j49Q,`=9Uei8eKH5^])>9'dBUTm#+$dQe1;RWDERjV20@OnZR>?r#d_V/5AsDk9o;F4L(`bi;9D-0&/:;r+>i:=atrg(ilh%[!Tc?<h4T>8lBPt/jke5/71is=r3PSW*6N5OXZ-d8#"_`;HCX!AR]F>S'#n##.ilf2bSC"XU,.c!\Np^<\CLTc'ESu%l(eUP/7\_[_r]6M!J'Ih]?qKC\C,hTfZ2K_%'[]G:&H-[`P\Acqd[l,-pAj0O).p>0F/h3+O\u*n=Z0R_/XYA].M3?)<A@^46"NebT)T[TmZoamrP'7+d!XW<(=52Skr(0,sFF=mI@Pn?B1J@;0al.fg3fod]K1<Jl$6bJU3Z^J7P4#>c2qcZ6'N'@+V*8gN1m2XRsFFuGKZF6p?*CGD/M]in9gFW&\"IU0/V#]WnLla!"@&#$>eYEIQ7,,Tb<!.cco\[@EPTS'd;arTV<!$^<EXmjaK0XgK[MMS*JW1QMk&3&7MLp*M)\I;YjKDB9Q&@$T&mVe:,'Ihqs%p##hJ\b5cHOH`Djnl&#]ObEL;A&XESbQG>"^cJS.(R6a#sdR*94]YH!n^+.`)_-4T?g<7)pKfe=A#;X49JQ1h)4t,bg08Ri@!RKNSEbHM0,Rc\"-h8pq/fY3Ds'HVOXW=7Io$P,rds;/6_jBlbOLdm[9>F*NT:4bJV.7C?O]f*N]@k\%(G-.B6k0.poKK-/CD955_^&CN?ohRE*(S?ae4-;r`$Nqlq"daD%7dZn<o1gTJ,q%1Y09E>=S:A^U95aDFQUF<aU0SpgVL2?\cXmWMbBS*F)q'#-&9[H`fqTMkg?ls7IH-odPG71Em$jT.W"NrYJD&(.bL/gt9!!81j1@WBI;;jTOgIuG"&=mk&#o#%/<h"tf1OU\b/n1'Br!KV<\76VWB[?9iO,W)s*P!Xf'%+^rM[S-ZF^[?D:ilk2!.3c4o]"Nh*AiLK+_Kf&TiLlDbJ>Z@74F[rWb]:=8gf=bGS<`*<Ac`P>FVe2D14ZN,7!*hd,nq86A["]<9NIAG(Ora?:KAngZB!08'G[q,(^a.!4K1Forc%(CoCJ3(Lo5['5st%kQjSV:WAUQ)!)t]>an,+gMMUH-m;?K@%AUF@Lr6[=E2HSUC+nCg2L_N$&Mm_LfU$L^/D02^Y6cPUanHI$1;HU5781)a0NlI9&<Wc:Q!'nIe)`XC8u2+(@g9$jOh=mS_AQCo8t9>'gob=roA<%a;.oRm&"J66rgr.rf4mCclubL^J\>qZq^,tYG#gn3Tj(U_J&!hY"!K+\_E`=fdJfnD!0]j93_YtB7(tm$/`Cl'Z(#3!6pue4f!ZNA7g2Zq)04a)+>c+:b8QO!`!:(N@&5sWb\G*"+S's@LC6?N2Q;LWqGSgP]ru^lmYV=D?Z7<=C_=Ha.O)U`ClDhUYp/0;@jV2<L])O)29sNK.O)=pekQS+mg;`/<_NK;ha_\m6p@&3&^buMqVpT302j6a8Pg[KGK<q=af`;4PiJ<PrSa8^NjgFYeFqGdp6IW)]X>0EI+t'LE:+\knSm^:OFNP"I6nEs[71WCk[Ir9H9AfVC0_MkJKM/O/Rl,&VIN#Ch%c[Cn[AOX5O>&!\CU?UTa9l/RdI=7fl'RbW]lAdBhCf^Ze6n<2g,G!5sk[;G7T'L=\TqMV79/)I:STe,&:Hbej.&D[q-hT-C'A:ZYkK>:K&_eRZ8+jM@*Kn[i?..PKNWtYIFSPA8k@54KU-L&sJ+G.H+M_M'HN5`0&)[4R'U_Pu7RH`&tm8lgh9\gY0([Enqq3F\s6(c))eD?q;42j7Y[8Yqb_$U03c(=0_,'S`N+uUQZPYWZB.;;$142/)sbaRK,aiD`i+)O"8Y2*hmr5gaoSh/HX\!"rE'DUuL^C=#NeO1o27&3Igf\]raspAc[rQ4G2+D3@iQUIqi,J9g@`bWBK>e6,QLonZ#`qD%4)&fDD&W>+Ro`Xd8i9rgGZ0r2:Y#Hu+3Wn4Aa@'/KIGW..E\R8:X[G$1eqYfY:CJaS`2c8GMFRB294;%N#*T!G<E6Y0-`r'nTlf3ArD0b])YYIi7P=Q*nn'G4X:R04Gl\sr*K%P(KFLH,AHY(3hYRSjaFI+N`_P@Lp:Nr\p$]*jB?F1OZu@FMWO)=RX+;@ucSO6S3,L.cL%OI-;5%%.)`^2GZK!K;<oT_PGm^4tJlSZWnfQ#r/sL'?j%$/d<K&RXG&;oA#BjYDUrWCFFW!:]CbDD,4jL_k$s4)lYuR-DbFiB4)e^JMnu!1m(#nJn+[oLYhk)QDB,SHq]NE0m;>U36Zn[546tYnl]sPgfc4JrB;h@f-D$TO'MQ`Vi<^qfd?"dU*H+I.361;D1PlU+6JcRUCFMI%_&E5n3JL`+0@9-301s-Tj!]Hr(6m@@hrBTqV5BDV#nt.X.'a*mRdUns,*"YLe2!m(SZ<G8QgLmH+PEJAkMQfg-.4Fa+Du.bC'*8J6#F!+rG^j<rXH@?.$q'pEcMSqoY655VW8L8r8^LCCut<uhQ'A1JiZgJ+*X$5SE!&h0>+ih\-t&CmCr2pKWSaJH]<DOmVE=>Bo5I"+Od(3!??,3!p]?*0Palc<*aF>0&t60c:62>R4WY)<&N.Rh9W>61U$dK(,?gZ+NS,PVDuAeE`kcJTZl&s>X6$D)a8TnWat>]=@o<d!&%d.uhgQH08<4qMcm>OEthEZf&,,r*b`Ym2u-!*II<WbJkS!YBWji/X?.j/dZ*6p(PQ(e"[NmQ4q\BGV(_Hq>3k="5E.^&Za]bt?R^@&5;Hj_'X`X[ioTlFdHKQmcCTXNcEtNlCla/9*In%&Fl:kjMb"csWkhd0O>V`;B5*3.U7dL7!93(PN&l)>*?P18WuYK2(GR.^]gbk;IO9$:_sT&5Eg1pM$o=6sbba(1MO$h6]8aGqp3PbZ#-fK1Q^G^-b$)r%&(17+2aD,\T`&*!-L.RS!B$%?obM&9KBV[l!iVVA4`iG$2Wp/q-Dm;1T=XdHX4)#SY2<11;/6D"tVd-\qZ7W=LL=I[]BV8BRra;S)??Fa%T%.O=HI`Q(^\dZ@5hf=0Sn'9a&?ok`4Xj1"RQr?%n'm8a~>
+endstream
+endobj
+972 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 971 0 R
+/Annots 973 0 R
+>>
+endobj
+973 0 obj
+[
+974 0 R
+975 0 R
+976 0 R
+977 0 R
+978 0 R
+979 0 R
+980 0 R
+981 0 R
+982 0 R
+983 0 R
+984 0 R
+985 0 R
+986 0 R
+987 0 R
+988 0 R
+989 0 R
+990 0 R
+991 0 R
+992 0 R
+993 0 R
+994 0 R
+995 0 R
+996 0 R
+997 0 R
+998 0 R
+999 0 R
+1000 0 R
+1001 0 R
+]
+endobj
+974 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 482.78 665.894 531.58 655.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://www.w3.org/TR/2006/REC-xml-20060816/)
+/S /URI >>
+/H /I
+>>
+endobj
+975 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 192.0 654.894 379.75 644.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://www.w3.org/TR/2006/REC-xml-20060816/)
+/S /URI >>
+/H /I
+>>
+endobj
+976 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 289.22 627.894 454.12 617.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://www.w3.org/TR/2004/REC-xml-infoset-20040204/)
+/S /URI >>
+/H /I
+>>
+endobj
+977 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 397.25 589.894 539.08 579.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://www.w3.org/TR/2006/REC-xml-names-20060816/)
+/S /URI >>
+/H /I
+>>
+endobj
+978 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 192.0 578.894 224.78 568.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://www.w3.org/TR/2006/REC-xml-names-20060816/)
+/S /URI >>
+/H /I
+>>
+endobj
+979 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 239.77 551.894 483.82 541.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc2119.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+980 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 261.71 524.894 453.26 514.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc2277.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+981 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 243.92 486.894 415.19 476.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc2616.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+982 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 311.15 459.894 508.54 449.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc2617.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+983 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 192.0 448.894 251.44 438.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc2617.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+984 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 319.48 432.894 500.48 422.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc3339.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+985 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 241.43 405.894 432.15 395.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc3629.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+986 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 378.64 378.894 528.24 368.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc3986.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+987 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 192.0 367.894 253.93 357.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc3986.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+988 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 340.32 351.894 534.91 341.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc4122.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+989 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 192.0 340.894 238.09 330.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc4122.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+990 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 393.37 293.922 524.1 283.922 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc2291.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+991 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 192.0 282.922 435.85 272.922 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc2291.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+992 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 453.35 255.922 531.32 245.922 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc2518.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+993 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 192.0 244.922 350.31 234.922 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc2518.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+994 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 307.53 228.922 456.87 218.922 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc2781.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+995 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 358.65 201.922 442.44 191.922 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc3023.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+996 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 450.87 174.922 501.89 164.922 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc3253.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+997 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 192.0 163.922 472.24 153.922 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc3253.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+998 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 340.59 136.922 521.04 126.922 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc3648.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+999 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 192.0 125.922 358.91 115.922 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc3648.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+1000 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 417.81 109.922 534.38 99.922 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc3744.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+1001 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 192.0 98.922 403.35 88.922 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc3744.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+1002 0 obj
+<< /Length 596 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat$u8WV=S'YaHG4O'jj^t=Y\a%&0X#8I^5Zk4:X*\pYiW5o$CK_Y;o.?5D`CP7#uHiCHuH)h@e>K8u8-BPn`!X5;`oT+T3\gJoD<'XL#@<'r%Dkf/Ja!JA5S9)BVpf.6qeJm=PZ&r/DA$>[_o_l<Q^?(X3I.._nI<*:2H`3eY8e60QKHk"HoH?Rdd3Tn$mK#aJJu-abWJOaYV_Lq`=TZEkEqffboS?P9-+3tN?TAG&n(ao%h">O@T:7lL40pZE.?9"_f45DoaU,j/bdKehbN7Nfc*KG?Xm/5%B?J4C`p>p1cJY-D&tI+rK3F^:qU2aELbhcc+`S4i\>K/m$=_.t'L)OGU8>DV&$"sd63Ugr3BdX6/iJY#S-iI*D(LT?/g")B;PCdkWu@<17q%a"\e!D7/o\s>%6;g@b4So&-[VijOYB?fm#Ca1=1;C88E-c8al*R_6bKh?qU)A/a_ZlP0g[l!lTZI]M8W<GGNt*,8Q/nl_'4U[/AA-^]D#YbSQ)''AuO8(6N#"mT0Z/7Mo"5rFXeKUhT-u)1fLB-p:VMOH#%TEWb$&Hr-^u<nNq$@@67dC[iJ*YruBkZrrItZ-Qr~>
+endstream
+endobj
+1003 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 1002 0 R
+/Annots 1004 0 R
+>>
+endobj
+1004 0 obj
+[
+1005 0 R
+1006 0 R
+]
+endobj
+1005 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 360.33 719.0 514.38 709.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc3864.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+1006 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 192.0 708.0 247.82 698.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc3864.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+1007 0 obj
+<< /Length 462 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GarW6b>,r/&4Q?hMV4+aeC`'a0e:Zg;?a#+!>]MgVDb+lBga$-mphf^:=Ub^n`7u`d@D.Df%l8cE=mrhbJFfp"L.k20WK1&F$puiU(l1%=I%cHIT$Y_83O'Sg7abA.Wf,-dC^gbRWLjc".a9X:]!Hq_PAXg-*!b'1V>4BE>ZRRP-V?Xgm;0X))R&6%=N,ij"*o)^/H\bm+$E5d8K>CB"4h!eM56XBA=L"10eE.$^"s?Mioj-2:$8U@dZ;0l,>Zs_7css-.F`6l*K"ipPiu-=he">K]OF\"M9Hn]"gHDUd2?&3bT05@)Rj/7p&otegP9Ko,,[U>"5E(,2:X2ll(Z,iGA&W-0^\6cKa-FCi!p,3=5>90^;KQ_>[9'POQ92"T1J?Y7A_=.E8I8&rMfARc-;?2'bBE'Eq`o<i%cHOiu#V8%I:NS5baK[;*AdEMjm+"#pHgj7".Wkd^`~>
+endstream
+endobj
+1008 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 1007 0 R
+/Annots 1009 0 R
+>>
+endobj
+1009 0 obj
+[
+1010 0 R
+]
+endobj
+1010 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 104.78 631.866 210.36 621.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (mailto:ldusseault@commerce.net)
+/S /URI >>
+/H /I
+>>
+endobj
+1011 0 obj
+<< /Length 2492 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GauHMgN)%,&:O:SB_7P5,S]\k4h6MW4)I$lUoA^/8b)kDOG/E7(m$TA^[G'b`*F";Q$1mOMZH,r`PJ.P]?oZag#C7sk4k6*]31cZZeI9KB#C5s>IlMtZt%;L_V%XIqs`[`H9-BofJ^r<q+9/MJtX-"LU%crJ#?hoX%F)8_q^kKr\+b`1S434L9H)qh0e*Ai:[Wlj5Dc#K#$7_G>>GmSX9#eWJ6%n@oL;8eo1V6KKI(^LT2drWG5tUDWNRnH*Uk4W,f7Q/_)Nd74JpN'5ZqCX+q9;%*nJ$q-bJ4(kY/LO#H?bj"1icM(EDo`YrH,2JDJ]W![Aen4D^O2i<mh%9TGhadD)fj>:n:&`El-Hl0Q,GkGNcn]KpA`Sl3Dg&D.ts+@))c:\USSiZpAS0t#+ErmA:3+)3G'f?+pQD'c`.ISXd7u:ii<Y2fgU:DW`m;80Z>F$-h`ZfAlCdA31Z)]#e^-%-hcM5(TAa'%@Wu8SUbUCW;S:/C)''LRcWX!s^<6Zo5/#g>sJ]j34KhRG5=uD[S#gbG%%*SfkNrshL=$[Z630kMGa\%j<F<DR5o1ON@;!_4U:A5kMFOVSp-.+>5]rG*W0c]l-SeWp,3Sm28)$)Z0]R"1A'45j6KoF+58e5;@%06*VY`]\SV.?P.X*ODhm_]mJr4Z4I>Kk4L:oBgp,W2s'hVc)JL9PZW&J`+2OsM)V1Y"+CEWm5MC!Z6$L\$FuielltK""ZI_Ue"*6n*kb5I\]:cHSilR,VHkJL(f1j@(A*JIPX+:BVCqZ4"[<82[=ne)OOLaQ8*X2E?O4O-.6tm"*Q!J)CII2S`gM6;%%3s3FLt'Hj7KA+^N]hMAEj-Sf$ppsste+aUN;#$p?p+\u+59>Hd-$!.ek</(h9'J1T3Na<W_Ck'5knZ'])$A143Q*bG.Yoe\I.>S)eEQW<Fb9'HFrmJ8BB:gch+^8:1Zb46;IVs]2f8$)4pVZc0WNJiUSgaQQ[2`7H2lpSVad0k1`ug<B=ihB$&?\S:'AgG&q;%OL5@#EIjn2(]$E@C)mI@d%3Vrk!G9+W2B@4$VfS_:F!67B-!MnB=Ar=o8B>9sBhXo"'L1@gE[XrDUHFsgCJXO!+X>&9Z$132Zn[cL@QCY=#CO*BaB6j"oSm6uUSabI^Ecu<IMq@]K(IV[R"F"*n3q[O]=S@-0k!^Im\>,D^VHuKJcmQ#(NG,OPiIp-3DrKuo90I'qNW.bc^h?T9?bMt:?2T.8TC*;7He>%RqhIm2._C*EqScbLpdW22_/c\]h:_P\2O:sgI'FM.I.^SYHZ0pd/rW^=h\VhU*KfL_!9%?[Fp1VLXQ,,9/YgF]7gWhQ,>N=l9q4KF8.,r2Db,n)DuqoX*m]lXJ?bBP1ZStGEkL!;X_Q:qBLTkD.\V4+<=^^6Beb3=_mf#AnF=UH6Q<],L$7PqD*IUIk]!o<TY7)8ji^-%*8!Xj,*b'h)AT>A^@'F-mMu#Co.IZ#%7idK.#_i(,5HV$!)5eD<JI^.WgQ>?(--"f"9ispGDUXD"n!Tf:f`6Q(]1,!@T;:tF:n!m0]%[$7n+hu=2M1-9oBM3DQlLa@tYG(Ia=4Tk$#Z$m^9@B;L6S+gcuIH6]Ltf7U-7Q6IdK_s)Iu[9_pRU8E^0nNC^]#.^Y_32?mXZ6;'ru2[U$b]1CDQP'4h71VLE@fL$"pN#+<3:+(nXAS,VTCXO<klBSUkU7d5rYVP).*E1%<!XE:3g+F[m/S%]"m3.tSQlH3]]VAY4aaA.%U^uh/GkC-B9J9:WI?Idh@50%#6Q5bM$NjNg(kg`HK7dTB,H#e?,iet0(_"#t`Q%;9@\&iR]F4YN"=QQCM7<%t]_6M3ht"En?[V`H:Fa)./,2:"MM-MkQf5u"(Y<Z.aH&0s9<%]WO:AaaOZtFef$7C#7]cu2@3kIQTV@fcpp"f75"IIU,rB"lM+#j\+e[k+HR!##liR=f;\om)H->H[)k1eV$&=-$]1E<:INcZ&:]FT`*a1="gc!O9TtMoYTu8sK[#C_49SSDk6c]r[-]/.BVDkg?"K61F9+],]LdV:ZRltQnV+V<+XWEaiN#q?nV*6t7RmPIGKOQ8lF5n#(=eUBSqQ9k%Sh+R,@qFq4,:``*aqS!(d-`[2%"qhT?EkCsD,aLKkpH0*'1$WekM;]o5misBQnnEj:>f=VlU_OE?$i[5N^7YniStsQ#n+5>GO)uGj*#g3hC/4r>AgA9BuZ--DS#M1\?=qH]1r.pf.Z<V\h;;FMmdK)?*%7,oI[Mf_,OSi[NVk/o^NFP6I4LMG(!-F`mCA?[L9cuoFF"TmUt-=P*<r(\_ZI0o9IOp,t?]=O@CcU*4$"P[N[$__W\0eV[K-%*?-fL.Fp&*15Dh@jSb/$@;NpQZ3TgrRr8iVYnOsp=h5/Qna+@>Hj'Q#cTp'3RI;)b@3E`GFV\4ibPp2ZWi7JnqU\RlFPu;U(cM55+&Stg;f(3h3hZp_]3Y*g*G!#q7I34/D?'DgBZo;RA$kb~>
+endstream
+endobj
+1012 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 1011 0 R
+>>
+endobj
+1013 0 obj
+<< /Length 1385 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0CD/\/e&H;*)+o"]n,,Re3Y=@!8=lQ-o\n.kG%;>WiQHlomM/k$o:B#[@(J@7ubdo_9#Y=7U*:LGu4nSDn11*$G22Q%K[hI6C9rMLC5AC=e>k:XM:sW7A`lI[\>jO,&RH7DfkO<_P"[o\La:<L1S-,Ee>`]?RZa"s<\Qr"F8E^E[a,09,O)D0ENaY#`*7*u%fX;s=fM$ab>d#+<l87CcRW9\@[R3,XY.M-LF))HR^B#;m3jqs1IYVLp\hP2r4^S@5E@91J^#8aO=L;N(jm0rDOc6e^c,^!C4O3`PPS/&k0*;`k.-A.BBj#7b55OjH<Qj=9Kh'8%BjKLFX"8's*qfE+=.V'`Y,4-rIToR&(k.`Tf;6Cq)N;]6p1h/lMSjHu59>jg*a*e[J:q&dcO7`;-DGlo-[\,.*6Y%o?*qY@pZFS?j'kpoc*\PN[2\"r$7bb"Mb?V?qK\=a@cLV=:J)["VQ3("Yg/I75!t$p5RP06lrR:+AtmEXK$#pS^V`MR50FHJ`nNK>5Q('NVZC:%gskcOQ6ut^cP8sE9Q5qB/tf.PhVqS7Z9h8(\:u/M7d%iJAaot^Wt,aWZ4)'ol?+M'$`Ld"lGcJE\bgAMk%N<MU7k,nQP-M__]<6fg!usr?T<W;:%IC8!Ml?kpLSe6^`?"#\`gmM<gqan(a9I<6h-t*?5G_EGML4^C7Lb@9nX,"NNnq<9Lf?!n2c/19P]g,N[83eDFZU;;quR'Y["">n-KrKh_X*EK#[q;Xou$25Vj0E1=-9Q<7<QPP=UmA%TR3t&LUBL-kAq$j^h<ummuWR+53UF:Hk=Vj+-Qe.fFHDcC&L`-dGb\^nK@C'*ji/?-GT%eM^'`m&47diVhD>d1b@[7YA7`s5e.kp?.pA<cO[&`(jJoEs"a7XlLt?cY9QLqo#Wh4L522Qe_$`X?ALcInt#6&"`O1$Eg^S83m3Gi&[/s9]nVR>do<Ls(S,GMmF,[)JdeJMj$9\0'-YoJ6>ngY?l%N4FcmANn6a7YQL6EhEMQr>@u]*2m1\+"qP]Sk24sfINcp[_.'P\'WJE-eMe5%@5mQ46FuZp5W]IP3+TPniVn],^,iJ"4]&V^'UfNWpsW>$Z(7P_VW&6l<g;WN3E;>MUq<]6pRlpfQ('T_PYQI2E\9<u5qasBR2AqV8).P0:p2q%lNe<8hf2Na/PG+LAuO[f5=3Z,XI]mo^#P_pTkL5fX#(ctfVrf0hX,@p'KpWPj-d\F.IU4o9$G.NMF=S!B7.N?KV_Ab:rg6FpRP97+D>3P=$IgE%&bgle?]o+#u2#cB#P:\Q$4NT29Rhi0b9S_p9NH)%W9EO#M(/N\l?]2#867<WR[[YRpb3I[?]jaNRc'2[R:%G`J%/"550Bt'fLK&_>~>
+endstream
+endobj
+1014 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 1013 0 R
+/Annots 1015 0 R
+>>
+endobj
+1015 0 obj
+[
+1016 0 R
+]
+endobj
+1016 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 208.09 621.56 250.59 611.56 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 362 0 R
+/H /I
+>>
+endobj
+1017 0 obj
+<< /Length 1987 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GatU59lo&Y%))O>BQ@fB;lc]>8nN!9i_5e4dnHmPLEqWi$&MlM>]iVAEIWC&8hqL0?,rLr0-mr4G^+H5eh>Vk5J1,n_Sn@!XLB"^A9SV\!r`QTWu6Ck"n=F>0.6'po',tnl&3Yp'En@4q$0hs`NQVHHSoC7r-#dQfY>,B23g&3RprR9^!XBnmpAc&9\/\-#gjn+N^l'I+1KuXYG,`MhYp=)]`./VI\h[K"/Jo\>tJc1V)J;DL;*+`<!f<T>\$2)G&0lO5%VEe8o>0^VO,EH[%-'9]$>]MK[Xno^TB;Zp@7nMi4p@0&tILH#NtdQqs3ot5Gt/81F^tR/0S2$/\oe@rs?'tXFVZ*FcVXVcV9+/Dsi$h-QP/8ORRXj4EpgG,f6B=F>c.0=jDA%:4&YKRMmc0F'G[<VQ>m3kk22Zc7_QW1Nc1n%FU-Jel8M1nEWccma[mA^"!Fq$6os,*7R+m2cF+S.<E:23O+HRrWl.$Z$S0!T"84Qj0U,fDJs78%YF4T@tF)-VBFh&A#X'=_<He*'=+GW"k)$Q/XWCn#(:j>3!dUb-Dkf>AeF_b3*7jg4AegAk`2+5fooEK<U2@nX9Jj21t%"Ll(p+A#8&BZ6&B-,8lIpfA?a\LGlV8nJpQ]%a][P1jGi;aGe.gH2peh_AJf_)=rA99ZItJ.'!j+]5Npun&7"@>8%AkpB`*3WWu<iG0e%ANLTE?KJa]sSN(+Lgok8/9Sst?bGQ"n3%Strras=;c;^6Xf&c`9?F]C:ur<VW2B&DY'grH*:=S4>>H/o$.Kh6On/lM_c_L^?#0YCT^(htmI^F*S]AV&5PV%WMW.1A":kIH(VnlcRMHOff7k8,OA!$:GAb-rko3TbgNRsFVh0Gmbp;mENS'oU-jmJ[S(=%e&B#HMp0gu:5.Y\@o?6`'s,qNps:aW4P\MJ=3VLqC>*#M`0J<[WMj*6!I>.WK\KB'[sN."Y>pe64X:LIWfQ%[0ZeWN(XXChSnUT$E9QYf0cGe^2R,ralc3^^p#LQDnr.E+$#&9!Zg\T:L,kJ_IZ;^hsPoat(]9RO$iC"U&A`(6RF9$I/X@VZufmkbTSjF2IE#j%Of\f"&$uqWRutNg6Ik`GrD7+Nm`Il!*t@c_5-dJjQ&<i0q]d9OU^I=>bga#+)X'`hI7LFP^+4SV_A!6@%fPK:5\>j``D*>UTO$E9M*qV-'IQU'E,+9(J#;/CV%B-?!TLTP)NZ_`I<*(E]IA`0!gO1aX6?<<iLIP`q!8hWk"p0/'pKL/eD8*]`pBplBaeCG!Og35qRi0,JWTg[K!8m+Do\&MM5J%rifZSsj0@4`M/OmaUY5>)[Ct?CM#FbsS<&$78&-d^#j>"].C20MX0#:d;]M*'g>J.jdlaf'UO[E(#ZE8i0IO6ubG#[6eL:P3P#=5.C3mHhdqsk^j>',uGa-d+t!S8;-'4Vc67M6u3/ep7V<BfI#[(Tt]eYkl1BI7WSOfed5+Def<<\$`I+3^%(i?/2#rI!XWp%p/\!YSMe[KBkRX'E2ot7W@DL(/1ae-C-uLM/P`oHIi_HF[s9A62g3!=DqrM5YC]10<4fb`o(g#9!R"r/^$.Pc7EMPue'YS,DG_mBPsrOaVL`jt-L\'/\cIDp%0k]ec[>J&\\8e=:>R"O,oOap!e&g2Qg8I^(3:m<H_SYLoW\eFOf)b.L5cY;L@u&:)S,!.ibu0A?&B(EUrN#]$(+rN*Z=Ad;Wm?*_Z02Hf,Qhq$)%.l)9hId)O6BI!mnB)0,XU>n+^Qa-)X>8G.u6lj<[YAUg0MUgsrq1,g491<`$XVTe!dfHFPgR6SXY,jR_5@VC$!aOo1TLK.Atk`'W9h[.%uq1dE<-B3b>qgNVV!r3s^%T#U<cB[1O7?M2b_EHoH@iG(9C9k.QZJ%:Hk0CKf1QFL+(\TX>DdjR?Qm]?5[Nh(4#$lR3gQl!>J>6iG_@.9V=l*_Ngj6")qp$!^mUE:(h1"&443UM.+^A&KY4'BN~>
+endstream
+endobj
+1018 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 1017 0 R
+>>
+endobj
+1019 0 obj
+<< /Length 1137 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm:9lJc?%)(h*(qm9W>0jK+4'o0Zedillf+!_O*nhSJ7nJXd;CBT0qX5e]7C6QC`A$?s.2)IOpdk7&4SWk9>0+/n.p`]*CGeACUOU>l?%!JLOc@#hMRV0cab;mbcEQ?mo94Dnou=tik*WoH*uWo(j@/STb)X_Rdpu1^i$r.CZ[''QaItJtiZ!jY>KA6je-Mcg5qp0a;^6Oj=)HT+A.-878@)IGA]cF:Pd1WnNkr!*K;-/e`6-fOEhh"$9jCKgf,$&/UY5XKiR.8%NJ$Blk9^^kY#;6tJ2l\0Aj%$hNLtu#N:iWt"VkXM\6122&k+<A9i=@9J<=bDO[Q#Pfkc2fKF:'ZeWW$djP-*^B.M-'.(hC#\qcUQ$[`8`4\RKi.?$hq[X\e%;!,PZ-K-PDbZkME]bZ=g_;@0-_,9,.N\Zo8W<$4[i"Fc#Cg]:McU:+9s%=tj/us(em8!\qC]'6%`ga:&;10p&.[a6[92qP!oS#[\OV*ka'u9OgE]^5(<38Hrc(psu,'`OY,BaTcfNZoF9W413!na<`F;.Upg7SUHnWO;N#II>E8\JbYf+Mdn(+Di+4jQ02#k1NRS_V9f-6uHkTnK(J"k?&g8Y#)`in>^088$]5Q\T8`E%Mj]Pj\p5Bl"J!F@%l9/p-ruk,<#3rAr\[kejjOL`j95:hYBX:-/%Bg=+FXT5=PoF-j`nA[Fa(IlgQ?2!M,q-9"in,UJG=bVNl"-Xq0O&Wr7fC-;''**,pb/ZSAB.k]+iG#gMPTUaH&bjq]4^)rE[J%8diHb-61R'enB.*15"SfOQJrHY$#UAn2.1M#f9R9<>YO=?U$%Qq)A#KC,*EH)TV?9Q/5)#MBs]8!SKrV#os1/VcJjGk%YT^lEhWnuPq::oc+SfL7TF?fmE#DR?tk<$c)S>mU+J-!7/m?B'Q5t&o*n!hY0F,1f^Ihd?n'dU6n9r05h\,A@]=.g6;<V/n(4a/'sT9'm3+t4W3#>s.R+q#Dt&-5pYd3tB)HuU3VpBHaTC084"%o%oW&K9bg$!klb,O=EQc7d5qbEGefTA3rcPds6r[MUMWkXLPIc7^t&.EOKY85OhYlP`4GcrB8T9#Lc>JQS"C[%P2DKC[UB2mNMa,!<5i731Pk4ST@3-IG`~>
+endstream
+endobj
+1020 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 1019 0 R
+/Annots 1021 0 R
+>>
+endobj
+1021 0 obj
+[
+1022 0 R
+1023 0 R
+1024 0 R
+]
+endobj
+1022 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 297.5 691.866 343.06 681.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 564 0 R
+/H /I
+>>
+endobj
+1023 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 200.0 570.146 254.0 560.146 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 547 0 R
+/H /I
+>>
+endobj
+1024 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 200.0 510.986 254.0 500.986 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 506 0 R
+/H /I
+>>
+endobj
+1025 0 obj
+<< /Length 2416 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!#^h/h:0&:`#5iQ98#2[O+!`mD1Q+.]c1?kUnWS#-_5#crlf>g!WEIt&u-nZFH@g?["*q@^oY[/8V8IaY^SUVEr5a6RqSB=^'CS`Q!s\F@gcJhHBnm\o1=#0q>PI!Tq_3H<>lf7j0)2_obE98Y]`XffFl]&u[$=if-Mo@]PGLP(#qF3B3:6V%""_9hY\eY1HJf13nU/4IG&Tmu[e`LDq]H6q_o4^Q42?GmtM8=&p<OfVZRnp.q?G^lLR<L@clj2]2[>HOu)laTl3:*ZI66EOAo!ED5Ff4rJFSt1RUQ,Y#D19^m5P[#AV7$@.8VEA?E&W?RVjWaf(neFr@Q4',1qe7Bin,Nd/jr$4//l\e2icChCH6_D7[V6/=%XPO[^XQ^gY8$0S/+nU6a*55E^i?ZVZ]h*Kqjj<KV0LoA"XE7'G3@ANmfC%iT0Af&)5A+/_=I.sM@F'+O26+Ig3Ij"c+"?j^K\l>k@qpp"L=1h2)Wut/sO4SjnkUQ@DZ.op``1"c9R%LTd.EV!<(7J[uV%ur'&OA.#A(hp"p@C)F*6``6=1%oXtId3l]d_DZ/:3Ej5E;U;CmPV,QG[OU*2mPmEBQW>WliaYS<"KE^l%3G'#r)X?4`9re&b6-%jp\D-]8CX4LqIma1\U)8kU\QBGYJr]srER_ihE@:@(FX;rVIVaojMJ"SAH^2`aNaicj*SjZofm!>GCA<?uAe[nP28Je<5beJhBnmHP)bKDC?ULFI(/mmJVo[l,+3qncBK_q\YK(htBP2?MSm5RY?(e<hnbEEsI([oI7fN7:d4[<@>[i%LEm9FY'^VKkS=0nHN3VBC)*U;<&79E&8:`]+JhrX2>Xg-Jc@4*>o66"tJm;oGE<fnTEf,h95kdZhH+^m=5u81AWH&m%+2S5?(8tOkM07I>=a8]if&4b30G>61#\4p%6C@gMUuWX^Je;-$1!A8^+_SNEd#V&J,F291'NV96<#lOt=#.UZY9Qe021!9WVBR7iHXHX)K%BO.d#+XChoGh27G^"7[tp<f?tb/:c*h2#d*1&@B4*6;$<CSV_5[5J\Lg+7fH';`,V\0]fs;0O=u*G%])A7BfI\cVPK-"@r.@uJY5'3Wj0-02>Tn(VF[TI_>Kq,f,(qFA/IHQYdN8sK6hlT[1?5daJc?Bm7UGe@!$MPZb$l5#SLco;":l!-CdMkWSI':H,iO\M.2)>HCET;eJ6;Ckl?-G@#[P$!HTEl;@Gk:V0\L,mQ$HeX_<md6?\lX(:I5ll>4\NSs(m+[ISU\m.WtHX#qIS2&m,8L82nn`XQQ@WP&P8OQ3eQ2M5[^r!VTe<Me>dr?Lf)K,6t1=D^dVth$rZ#i4RaVKFICB1I^B*$'q?5B+e:J["`F[KsGM&Z,KFJN%ECjbk@)N/6:SsDEu,Ze;+rgP/cUni]Fe'7Ymc$ZiXW\Y.l?:!YUgP,0-cMd7Dm;Q9#8=[%9;qE,a4/$=X]Aa!;W]iZ9H6]?=o$2\QQ=:EPL,@[fYf07XhVmoP-"mpn@kHWQ"`,=.337#S.-M?%3Xi-[?(W7M:#ms7fo]7[5eW:=QHlH1OUns$.m[FLj*7&lK,@\LhP,k%hQ1;`FG+S2o;Xq`iohWHO=1A%6thJ)t"<iB/V+/Dk5)XTV-/RZ`JUI'@>^H1i[hXIjcR,nc=]q?N*C.9&^(Dm;Qj<l'5`:Jss\-KG;:/k-ZP]HjfA$Qj_PjtjWA1b$_`.rn9RqXF"RHXK@\:t)l]9ZW1%(Ck$3WpV."^)skl[c);-U#SOE6<GC-/qS6XYu&]S6E^CqWOI0aVW3+eGsK2O<L*>S*8GRj/5M`lc"F!YD%ji&ia.28:efU@4:8a!Z'faZ%8<2^S]'VLW@6<6.RBLGN;1a!9]L)lc%O/bJU8=PM;h+a%R3tIi`+sYW8]EnY%a:TSIMQOta;*Onoh]du;$Qq"&q$`?LMHI6]%&Ork"WaM<IbSnOO:@SPf5GA^.9pU8rGb/Zt@<Qp]A/'5meJgE<;Flg9]6r$'5p;46pKkb(1_T3hM(nH^8s-Td448sKXK'Do(AYEhTFlep%(7("39jaZ?etTLiid,/.HWiNZK;LZ\&]S9qkU=fK_NGVWk!(^1IW9XS3P@7:V?^-:A1]WOV[T,KZ;js6-?.U1N,fmp-QneB")BubAq]Ya@$[`2W.M>7gOc4'bM^,Bb9j=_OK-1?;L5^)mE"LSX5jd:_hpSjJ*-W9Jc<4X@AK=SF[:8N.lPQ)LqVGUSuad`/g5129VlT>4!Du.NL'sN>Y3P:ARtXn*m"PoVm^-.Y@Uq"ArJ/<cN,;Fd3pCXJF^/JX?Z91Yk!B`YM0qgL')UR,JE]_^qt2!2_a'\8`EbMWBpOub)0;2mL;9,YD+8]kTL1E=GD<]RV$@lo'ck>?r4T1Bu62"^<tlWg&+]Ij-S5iIf\V(-cH~>
+endstream
+endobj
+1026 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 1025 0 R
+/Annots 1027 0 R
+>>
+endobj
+1027 0 obj
+[
+1028 0 R
+1029 0 R
+]
+endobj
+1028 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 255.31 669.866 300.31 659.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 63 0 R
+/H /I
+>>
+endobj
+1029 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 272.81 348.894 318.37 338.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 564 0 R
+/H /I
+>>
+endobj
+1030 0 obj
+<< /Length 2867 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0F?$"c/&q0MXd.epW9LY-Z.>k["c8Zo+e#?7n;<hlU4?sT+Tcj^X!%karr[oKh>X3fjVtVMk-4MML%sAHnQ@:\T3PS7660.jTna+3_btiq_&-%8g'#M9!:VC-im#?q[fB7(cZX,liI<bei?-T7BbUC+1j7SlZ(Z!!pSC(6Vm_p+pR:,-hH_Yi[o0obs0V2iDJ]2Q@nLrg$g^F%>>?dHB`hhWBpAD$cf;*fXbhUXgRu?19kKNQb/Vr\`(??P4:NAbC'Npo%>'<]CW,c'l3BD:da>.(gBE:\iJs_Z&GL%Qc=AFMi#=+u0=;'['/I9O(BQQ4sW.SS5@&^Y$-Jr0;g`5;Ah3lm.*%u(&PJ]gNi$\_7k>R<f>'uK33s\5IL7Kcj(2,XGO>A5ZZ=5U0+Dc:.i?\[+];AKL%bFHH.dj9$+B3sMZRO0&VWAQh"`\?,?>NB%@qC;sj!YkQ"j(ghc>idh?6&Up`6s6=*-QQm2<;hd8IC=d-ohu+H6sqqRD\=LTX1^&\gZ,qTiCp)nW)qSWWaZHXE2$sI"nBW`PHCDfR/5Yh\5Nf"X=@80UblO;^[&H(K:n_F(*0r@@6/nUikj?T(W!3e@PJJgWejW%r[t8$E@il&ua0%iLWV!d>LB_>%A=-`+E&7#(D?UNs1<EkQ)KOL>-N=J(U*c,76I.;".Y7ej//hgBB?ec,<V\4Wk:$@\W6NEXRb1*pKK*<QDA?&o9bPM]]$F4L6=e%*T@j`sQ.CN\G\rl;^9r.9gq5VGq/Z9lOtn9MLt1q1=fH6(Q'+U_N>u70IjB_\&@_[a!KLRQK/Gai/IN<(Wg\`86>\qIn2:%=9QCij2,216j@`?>E\qXYqu'E#osS@B]Hhl:2^jc]G=FQNe,e:(SpN_dS=aR<_8B0ArMM[MS8=4TrQ%P_75c`G=QB'*T\m*@P/rbs\6OKd8J>;EAF7B"G8ke*1?b`A,pf:_Jc6"HhC>jJT%jBdmiVg_ChV-TUV2>7i<(>sWWL$ke)WkTuI"p0B^87Up.qW>^$@_;&t1!?Va=/5SctR855b02STh71,#+0E]XGT(Ae-At.:\PjJLbMKbh]p@I5)bP2(k\q7nsHhr3B^EtF7S@Z&CQu0fZJE1SKe,+:<9mJfI#`3nkf2P]ELQO=6=?hgg/o%1"b*LHso+R@j1SIOGR<%T89L\>MKK)A_\+,:_p5e1\K[)E^eC`3t$C*CO&W8$9-O)78b-S_B$u<OlI.P&(&(4mi-g&+5])tl5@B)EeR:a%2,;7p,l)sT0,i5#:GD8^.bLQUrg*O_sBsP^c%mf.+#OBbWV1(B$XiUW8,K%f<g0QYF%q_;;BM61+NC#3L%?Z2=q<(Q-aLC2n^JB51NIi:(NS4='mUVQ`Vu#7X3:''gaJ`E0:;&qhd,*jEj2n?A3u;L3`^6OZ,A6/[+hWk`paqG@`\`lq"61eIC`Y<OZZnRY[eTZ0]%=.mr2-_575-c:OkF^7E776:DmkEZ>N2WIlJ>m-a#E14(Do-@jp!%`$sI^R>cJUr`8u%([>0@#2>:P6r,C^+icb<eH'+*8eS95AT,EU#-uEV2k+r+\l]3,;MInBM;Wh%T)W%fgn42>S@$p^(1/MBqr5Y76K2LhY<bX$t_aZkb:%_EoOiiBK(<mNX%[?pNQ!.7bI$E/(g!`o]kNf%hfASDS^0.Bcnma>5p$irc/JlVGm%I(f6n@iCJ6/4"p8`S&"PpqA>/j!r'<G@H&!nin2)>MIfXdg*jZ!$9KpOd]ijO8ZM>=k;QQHpU;Sde)$5=&n%]DP\Z;XGDI>^8A"R3"\RWK0lH?NK:+FRbBV,p'j9IgUhVCrk,%/32;C.)bPYuH%YS%GNP=u2q5bt2d-_(ngpc/+&bG_0IYb72?:1e-Y9[Xs15)F];WGOFC'jI8!>5m(58LW5[$H_f+>d^URc8$2<;-H*T!5r6[O[GJdLF2b92lOjuko<JZj:QDkJC&oMP3ZqN2_OI6ugOqUSN8ZH0m8Z>k?3/;T[ZSeZp4/`49k39UqJ:I+QqT<1SL3.APSTX<@0]^]OUM+t#.=S'7/,%J(,'Jn__ge?_C`r.!0@h7Hr#$>dTnW=YX:a_N)n*+,-#=hD!AYdmP3cup<<;Zp"Pg?2*TP0^W;M3El1b-c;q&jn'4UmOSU8dmf1"JF8b2V\f\76bNl/+,(4fbgV9tA"u8ho`[F$2X=TFZaXOKqpFmJ,61Y_kGdhOIU!ta[&jp*d-_TK>>^*Yq/WCWA.GG'>B.D;g\$7Rc"FXnNVTN/Y\&0'a/etN?gO8->\gBgX=C/e1WBm7^!GS061*S/b+RRR/5($:W.%Vm)D-_N)5U%Js9J49@BFfTN6@"8f328eP*8g2UM#09u;A4)ngnPLGVsCsfrCa(I@c&O`49HkK\EfnUB42#Snp%oV>1F;-EVtRH':.rUcS[$q=R0iA&ncVYJSD",ccmdi?XN_^I%?UMQc=L"KE4tb#PEW5lfLKYXK2/sl%Tp@ism@h?ump'EnG&6D0Q14P#MD,L;tMOal6HToZbk]*^S71l1uG-4GD)#LHbK0j("="EO=tBN;V8&^%$*daS"Q[^o-igJf#cXY4'coFLKGT.F7)Nfl9`I+<#Rj^M%or!sg-[V*-T@Q&4nga4o/(cZc"]a^<SHp?q\OrRHZc$SU&&+()ah0*5$10`*(emuOg\A$bb%WlY4hr<?.u8?-!fenWbXffLmL4Po#Dp;m[@=f80S2r'#[Fi)a[mF0A>"]N3*h[Xa72Lc;rC`4)2`eL?WUGNh(;ilZbcqDb.a1rY8+*dBMNJ0gbqha:nHA)q$C[:&N>"VCF%J=*G5f&FX0_AKK,7uY!oK3m7qn=*d-H"*,Y;ZU9Gm^USJ,%S0kC3LG7o"(~>
+endstream
+endobj
+1031 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 1030 0 R
+/Annots 1032 0 R
+>>
+endobj
+1032 0 obj
+[
+1033 0 R
+1034 0 R
+]
+endobj
+1033 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 330.29 528.866 375.29 518.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 92 0 R
+/H /I
+>>
+endobj
+1034 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 359.99 389.566 405.55 379.566 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 925 0 R
+/H /I
+>>
+endobj
+1035 0 obj
+<< /Length 3175 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0Fa`?-,'#"/m(r"(KYgC<X!.Ao]UTh@A>9VCcRBZNa!fCI?=?'D6l0fu#P/>C/!G(rCKJ!B1e<9Xuji]4Q[X@bkAMCGRCHbt*?Hm*nYO'r4rp3eGd(Ng.=gkr0/[O->2j`+[m*)*Jl2I1,-HegQ9K*s+]2>[+hred;5KKk>Ypt[5^Ugs<mk5[<%Sp_ecBc5o9)P)?hl^M)MPsh",4r#5IML&6JrqQ$f;cph)l]iPpjXX)(M/(6lRTT6oqRc@Ia*UCMR^c=?MAY3SkSM3/Zc#hAZbNYrm%:=f/QW)8\>`s9.=jR5@b+uY)Aje\<-ir2c;**-ACt(lqh8_<488/gi>L2=T+dp=oOXsKf_h(=CabuXVL8uC,VQUKS`cDI=Z;I>bOX#:i0aE<[uZ9I/e#i_nni(e4l>e0@Xc>Dd8AYPfR@IQ\l+sJ*jrk>9ge&na:1B6.Xp-3SJ$r73]P\G6D0-L@.lCmIo#sAo@Ec4'Kj?jhpFrKAPCg_LQQe,0#(WY7G!d)*Zb_pV72TA;.HM6YO$-)>q9j[7B[\Xd<EB>&ed@GEfCP?-DuU4f-doV[R8A_=Ll^d;tnZnZ^g.[_MgW&7=B'NHA[bepO`,iH^Q_0A\G/p.8fUDh/Jr]TK$Kf*Je[;.04s\aCHXVa5-G43A0:<ln%r[>JB-8@d>2T<Bn4I(JP1S5?S0b$oFDW&s'hB<e['LTfuDVqB&r31$_D^Nt)2+Wu6NG4$74Q801N&o:_dA'A'>S?r`F(48MuPsu5V4D:i;0)EPd4AMB!\,f-iEA1o8Q)h".hO^0g5?55$f'"\=,*EVM;E8Xa8@!jcmi,A5?JpNrAQ=Rb@?T!^6IF8:KZPWnh]$-C/!(J_/.F"#<7rJX-VJ?_PSDA]/!C#ZW[]bqG!MeI$9\[s.I5_uWQ!p!6[goG@c@!gk`T)&?E4*mpJNq.55D]XHlK/_(khq<aJtO4A=Bh\,8)L5]0HEW]]Vrg4LX1gXOgEo/(.*\n_N%MVKj"!raklnOD2Wtb(CFHN+o177mKsd9hmYO=PjYpe[i(]f'o3d)K"]PSb2O!\$1fn^uk7Jd0qK"<6IC4OOE277cDX`0Q6VXl0cY%h1>1l(5$a,;DUB,Xk>,*NCKUT^B_!"T7om>Cl9Q9X`m/oAZ;Jfjpc.7@kqcnQ\9(@<2+=.UNq&+H^Pdb*i!G-a"`;sj`_ocW>n(V13`;CgskXs5NEMAWdY/VDWT2XW&L6S=FT3I5*n#ZHZT`k36$=)4rs/i!l#V$Q&HQA_7#i@VlZY6@S)\!4mIa[W(0(8,#Dp]V#M?&]=L\N0+t]Uk%baAF\1hUQT?ZAIu4rVMu.n:>[F&<,Zf\+fGq%97dH.@4rW8A"X(u`dbU-!/on"SV_H+'8Ag?e6l=pV$iL0I?Sm%+QYJ<37*T9sQhEPfG0FIAYlMY)]mW]#VHSL@gmM_)5[dXd$.u]7TXLoq%Z#$NZ@W7PIiuIBcZ2.#r,tDFn8_lqnOT@9NiG+N[&s-$XO$M6qVQg#_>5X2;r9,#SJ8BP:MLlIbM"us7Y%gCAVHnA05ES"X'1_uP0Hr@9c6TF*RRp00,>8t1RG+c3o^Q'%Y#&'?sb7!]+GaDpF7Jtf-*)4*I$pTDTEXfmH3upFaWpZ;mkbA<oif641OW)]fh<U2]s[*HjiBI(n,aUFu4Ho3`MGmp7eb6hfk#=-:0qSZ<C1ImR5*;"lArPNf&Q!b!df3W1)!-@E"oi&UnMD_*]AsM7"h]#16&Y=H>;^p7s_^"V'Vk0/k!P.P5oh)2Obri+6tbaEI^abonBM,Kc!25k5[D909(9-jA#\@&L*TX(SVFgQUTu5fu5#Ai_SV9.[^kI_mE_A$)&rnD2,_NDe$uU8ea``%87N&=@gW+n/9QJ+;smfhg5f0PJZ;/sa5(3&mWQ/!=AZ,q5-9AVo9c0Krj8BhP%4U=7+OI(^t?>i],Qs$DEcrGi'QF=k[0j[E?8kfr+X7Bs9YQDr?L@=+6F"$XpCn(LWHKe@lS3,q4Ek@lRZ`PKEe%"+dqIEL#+PqV,:.U5Zn`&hJsIbjf=r:$nN<s,SHFM5P;1i)d\?:1-nL,Ja7)1Rm%D.9/gO),G9^<+7Ki)MJaROU_&=XdBA%t54rilo8jLb<3(UK/lX^1^Amil6@EjK*DkU*JE8)GHI:_B+mN48N^>4sDo@a[/(]aPjK_[F%Nm]Fs*n_\!RncD?ms^+:q`g<b,e*G\N0\43)^&nek2J];*]cIumsK)puZo4!u5*)%C1>4D9@0TAcMZNr-eS'^LWB;1P1'SV%k,BB%%]1.=BZk1"Nn*u\N2YGOFc1Ck+CgajtRFb%XK=`,)U0C/FV0Fs<Es#".CC$q_%Z4Z7pNdF!<Q%+^OLU<0?LSDaYd$&O))WaRJF,Y]^.rD9Z^f.\Qa-prs6e.^VjiPc"\hsRRoI=>;V"AAlaFjdUdFQJYp#5VijF51A+HDtPt/:s*(X\2qYAL@N_.smgffAYZ9bi%7d]OFrnpeB[?nPX_%Bp_pod`&0e!N;S9!TlFCUGWP1*rF42g3=LJkd*lH3`.<SMRiT>qGpKO,F(XD-K=R@,.T9.;Rh$>p*%5l>Zj$d11nf!Z2Gb:S<Y)H_*U.RL*Kk+anK%fFakE:,BOY!/KXd9lLb<t:_4rj"@6q;WR[T<HVd>33Ts'WS/OR/l)-9rOAQpp?r/6dOOq%#QBn*r@2[rjA%l&ENfY%Ao$a_&7<c*DZ=H`k%%@pPt>E`G3""`=h5P4n+j2l,!H0I\f2(1(D:MHFnILVAq_hBt-"Eq8\>QX^`-q%3N_YN_t=go\_B`#S<Jj._5TlV+1?7GQTDbmd%'q@ubf\3qI3S:=]-e4?UagE+$M`_(0>$:o2l7a@K@$CiFl:UM`lD9u2G##LHX@iX$FL*TK;XgCO-CBKs5k':9+O4"t5#8q?c]/;q27Yn]qIV&WKhjN9AmaoYcfK2V:0L>42a(A8=Z14e(&B^.8.SO1VJ>cS]'8hJ_a[D.]tePI4E@@F4UJt[d!L0I(/R"HJk721iWZi;))2LXBT=T@DO<huPSOn8VP`bPA_.oB%U"l$Ri3q/m;j3oeGE*UG@p5QEGSM4gIr8(hhm*+XDk0%WHLOa"*5(U=ZW_/09f9c3JVTji-%<Ph'L.$k=P9gs35J!b_@'P.FgGQ#O,?eCIA)BoTa7@c1!WFKm.f~>
+endstream
+endobj
+1036 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 1035 0 R
+/Annots 1037 0 R
+>>
+endobj
+1037 0 obj
+[
+1038 0 R
+1039 0 R
+1040 0 R
+1041 0 R
+1042 0 R
+1043 0 R
+1044 0 R
+1045 0 R
+1046 0 R
+1047 0 R
+1048 0 R
+1049 0 R
+1050 0 R
+1051 0 R
+1052 0 R
+]
+endobj
+1038 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 402.87 669.866 420.37 659.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 207 0 R
+/H /I
+>>
+endobj
+1039 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 439.81 669.866 457.31 659.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 373 0 R
+/H /I
+>>
+endobj
+1040 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 266.42 604.394 311.42 594.394 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 102 0 R
+/H /I
+>>
+endobj
+1041 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 229.76 473.394 284.76 463.394 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 320 0 R
+/H /I
+>>
+endobj
+1042 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 303.38 446.394 348.94 436.394 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 474 0 R
+/H /I
+>>
+endobj
+1043 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 374.21 446.394 419.21 436.394 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 144 0 R
+/H /I
+>>
+endobj
+1044 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 482.5 409.394 527.5 399.394 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 83 0 R
+/H /I
+>>
+endobj
+1045 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 149.77 360.394 195.33 350.394 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 474 0 R
+/H /I
+>>
+endobj
+1046 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 216.43 360.394 258.93 350.394 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 360 0 R
+/H /I
+>>
+endobj
+1047 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 191.7 349.394 241.7 339.394 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 279 0 R
+/H /I
+>>
+endobj
+1048 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 125.6 311.394 168.1 301.394 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 375 0 R
+/H /I
+>>
+endobj
+1049 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 230.68 236.394 275.68 226.394 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 63 0 R
+/H /I
+>>
+endobj
+1050 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 107.0 176.394 164.5 166.394 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 180 0 R
+/H /I
+>>
+endobj
+1051 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 175.03 149.394 230.03 139.394 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 306 0 R
+/H /I
+>>
+endobj
+1052 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 398.61 149.394 453.61 139.394 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 296 0 R
+/H /I
+>>
+endobj
+1053 0 obj
+<< /Length 2688 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm>9lo&K'#!I0W,f.K'm'0K0mf?KE@"O>RoHJWfr\ot&.+7s;ZrEi/UN!G2G$L,-378@h9*]i!3jlLqXnVXn!@sA\.'46D:sj/r>U*gH/gGlpua1@(WIX\Z,11Zgb-<JY$<oq>$O-ad*9<&cuOAOLBf-G^I>,H/Lt/6[4$]S*e1/(\M!ZcGrH5<U6%G@UZ9_7XLCk\A70dU-#?rJTB6%HpI/E[qht!4_s?N&;3$-EgHp`d1"E!)2/asI2B7JN>V(@gqSTQ_pc2%-UI0(qLs01HNj^RY<[aQ!"09V"oDP!2L:.iL:(f/pok#qm,=sGQ]]5$M8k?=/CjF',`aH?k5?YM-Z6fh?!uf2IWrlP0oKhq`Z)n38Zd))Ueu#Q!=XuiJ<K>pX;>"<ocYF"#'sbQhZ1rOd)mmjnB$Z3+Dn^Vt-c/l?I/iN!h`m,s3AZ=HEfR;r_6!H554Zo97m<9!i[fFH9bm=8D8a</61G5!Gl>]sLeltZ/QaUmKa(\8a$!n#Qa#U"hW3%?'l0HWf^WKYn(SY/4Er]idH69tF2pkRJBSsPqnm8m,USCW0=%,HoWNmC`A(XQS^CH?B0uTgWd2,U<0l1??"A3YWX(OUeni7saYFD,,:`cN#Xk&M.L*pc>DP3Vj)kHW`QQd#Ne3Oc[^SL,E+dCC;%>EUJ@E+;g(lnrH`XB3<P'6LXJo=Eh\d'n+2@e15*TkFbf8ho^?l=uoUu7R/hqcDM8#8grP5&.1iQocKI16bbgT8s")JMC/'V^Hmicu[8hSjB_b#lSf0[lB\42i/gmJoZbkTpc!5c[uPnN1JMiStjNdc6MiMYR_bX>AEm(!Mfg[f7=o02ja2L\2rk*6eQ+Q#PQQoDp5'5/NH`O=mTKdI(Y7\0.I/C4\UlMK(N>jj^`MI2GfBC17pO#^)_f+`VM$M5:+2t2?K;n>51\11UU[PH<QrsLjJGuboJ1MZi#7Cjb%B1pPnkeI^i"T8YL,RHK5bcG]&d"!>dNVjfA7ceYLKb\TT.<i,b74)E=PG,`oX)_@$s%HNFc$B04@.Zgn2uu@gS#/C]d]Al#[_VsbViEc5+V'q*3i<[d/f1%nSLclJO?Nrm6Qgl@l,+BInmh]BAJXg84t++b&]J<8PI)(#!(o@4XZ9<>R<CS+;_4JnW`r9$CLgYIr3+)]O$%KR6H_=-#qtZ*FB#e6j.BIGfT%5/b*b#19$%<EOtK;5F_Su3#sfiR<g9S^=FiA$)*4cC*/[I,)q-n"&A&0aSas[\#oGf:ekubgptWYCg(N?@7MVRf0u1M!&blDKU<&3TnriJ!DK"=GM>u)uF)GC)$(28UQ?<Y&?rtY<CfY#M:PYkm?Q]ql-WnF;Sf#l[!spQ#mHDJD6`9$m@mPht(\gD"lL[t+TY)K$06;^<bo%[4dN8o^U,DM<i4)VF4HGje$[Ddsf1?Bh[WKBe/g\W<a-mJ%*QQ(qgJ5Ih#POfKBP-)]+N@dVD7nN+S7KCl&hCnZhhtCZUL:f0APl-^g4bZ]jm@Eb7'MGbJPaL#OuMJ+)L,dM%XIl_,rIO>'o.['Go>@,,k/;%MW"??DkCB.d=^U+Hh?)Ek^hj\.,'TV.h/f4o+OJr3`S+<Q<Bu54<mJKlUpMS/FbU";"tr0nf0o55g;D[94$ga^-h)P(b$F&9aM0gs*CZ?FfQ=>n)mL)1sr_Lq@GWK3<W8<Ae9t#-"V^Y/?_9f>i(Jcr!Ah_L8o`gf<X5*7M$\W\;4Zu2T\f?J0]A-0[fTkcjp\Nn&dT'THY,S92(=\lu7%UWRp5'k&QHBYeR35GIsN@M$F`gnYY:poJ>`"@<ZO=9u06GYo,/^-)Qg%O_IlU82]0X:lD<P\a$/)mMRqiOCq8Ta(>gI)14fPk?6jK)/(;s2.YRN!<_Sle=Nj$&<n.0j.+G/CENXWjFIft9q6BEJK^4An4Mfp0/Voo]!CXrhlfd(T2+5e/+L:T(s1Ju9s/9Rc17qVgC:_tj0R)OI7E:@"ZS6Y=jHN-d%RSgj/#>@&>3Q_cUcbus%LOT,btMmSd8Ta'18=_0EAcqmfXuhqZaWu&T_SB8c[k4Y1)?7>DL,L;A79fQh?L"MpeNbnuGpPVD@2a:(5^?AL@I,%&e.nX02uci6_9J\lsEq.77uZ#Suk)@o3\Xp^T2X=,h]8XG(b!N4K..d]$"_s*lVo`CBUH9ok:1f^e-F2>]4U:,u;&NF]*ZdBr7]:8m$L@5E!K95`Y]?T_%@Oq(]#qja%0X'XDZ$VX'?QTG=3g=m9FeP8kfGH,3%C[O!C!kI.N7G;+Y)hm7$*a4n$qTI:^g.Co!>P%"'$(ro+rkA2D$Zmb@,HL!2CiU6(/iEA84l$3$5R[9o>KoVfTG7T$*%.atQZ\4[\Ukm[NXWk[Z1mdbZq8SSg/92ZLplW!JXc>J,TuB5JRrC9;I1"+7C!)A9@[Kt(#Su!!G5AGmr&cZ8$V;?(Oo%C_-kBAV'c/rh$KX__glQ`rp![8/kT&n*\O,MSK&k[",7::(%p'lg6b>!q&qQcOS4m0`ll7;%64e:n"[rtg'2aH/(aHC\jMRmK+W2-[q:UR+_(93j2;IV*_'RI--?/7L?Mo-EFO05,1gn<A9%DM?OtC*N5S:HnoK`DO=ih@Dh+i)38s@Y%kTUHHbnfs%R_L9P!6S&N7AfOI9@*BbR*)R*+jX!9"lc&ajm-cj.I#K0&QRCcIRdq~>
+endstream
+endobj
+1054 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 1053 0 R
+/Annots 1055 0 R
+>>
+endobj
+1055 0 obj
+[
+1056 0 R
+1057 0 R
+1058 0 R
+1059 0 R
+1060 0 R
+1061 0 R
+1062 0 R
+1063 0 R
+1064 0 R
+1065 0 R
+1066 0 R
+1067 0 R
+1068 0 R
+1069 0 R
+1070 0 R
+1071 0 R
+]
+endobj
+1056 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 199.2 705.5 244.2 695.5 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 83 0 R
+/H /I
+>>
+endobj
+1057 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 493.0 678.5 505.5 668.5 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 144 0 R
+/H /I
+>>
+endobj
+1058 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 524.94 678.5 537.44 668.5 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 162 0 R
+/H /I
+>>
+endobj
+1059 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 409.72 619.5 454.72 609.5 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 25 0 R
+/H /I
+>>
+endobj
+1060 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 337.62 592.5 380.12 582.5 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 334 0 R
+/H /I
+>>
+endobj
+1061 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 433.86 576.5 483.86 566.5 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 348 0 R
+/H /I
+>>
+endobj
+1062 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 489.95 539.5 534.95 529.5 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 92 0 R
+/H /I
+>>
+endobj
+1063 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 107.0 480.5 152.0 470.5 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 47 0 R
+/H /I
+>>
+endobj
+1064 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 177.83 453.5 223.39 443.5 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 564 0 R
+/H /I
+>>
+endobj
+1065 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 283.33 442.5 333.33 432.5 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 176 0 R
+/H /I
+>>
+endobj
+1066 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 92.0 377.028 137.0 367.028 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 37 0 R
+/H /I
+>>
+endobj
+1067 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 313.35 356.028 358.91 346.028 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 564 0 R
+/H /I
+>>
+endobj
+1068 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 251.95 302.028 301.95 292.028 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 207 0 R
+/H /I
+>>
+endobj
+1069 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 110.6 259.028 160.6 249.028 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 209 0 R
+/H /I
+>>
+endobj
+1070 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 255.32 238.028 309.21 228.028 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 564 0 R
+/H /I
+>>
+endobj
+1071 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 430.55 195.028 480.55 185.028 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 241 0 R
+/H /I
+>>
+endobj
+1072 0 obj
+<< /Length 591 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GarnU9lldX&A@sBE3s7U,"M]TPX3rkK#C2Q;s31+)E3G[3Q1IfY=KM;3&&)5>B]]5^"r2_(RISO"jCU#ra%;IAJ'12rW4_^D(]7R+!_p,oBqs5P,Mg<T[FW,mopWO9hX7J#F+(c$$R@T8XJ7i91,beW3n<GU7n,1#*LpQP"'/J]@:H]ieJfo%WT%/=Ime3ki'cg<1Ls\.$,ja'M''@"p4O?'(%WpLq5<3#KZ)^^@2E="Y#*/\KsDoI!;Mc3h'0SNWoYIR&o@FOX\H$JQo97QO(G>7H.shJN<V.\ce.&d,D=:a[_!;1N5T/!_TBkl+TuR2DhB\\K:D8"7N4O*+s))%)'AaepQdop#R[2!.o-?g,>+)qn"_B1EF@r_fjYfnq=1@C=#C$*jt`k:T\G:>:"C"ZNY^Y,uC?b70+f,.kX9n\?P*6+_s]Q-P]&.TV-1EXc2bqlB72mME(:XZnKotk2*jJK=+-6&mg9@C=O>rErP)TZVJ-Vc0=oZl9iRS.>Er[;%WI\Il\V]mHO(dpIlRZ8_9qiaLo!ccgBKYOkdcWqs.$Z'dZH,OknXV$XjD[>Bq=<@o"RnnK0la(jZ~>
+endstream
+endobj
+1073 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 1072 0 R
+>>
+endobj
+1074 0 obj
+<< /Length 1955 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat%%bAQ&o']&X:ZqQ!Nebd`3$mpC5OKL?q0sbQ*TI&;=.SD6;4-RE$1,d*u=](:m+HU-*Et8dg\lU!)X*;%XPIR3jhQAtR\+1P8r:s*RM.^PbqJ#B!&'icWs4[;:XM;ETcd(oXgH:^;,<$*rF5$e*<StH%[,8T//cSaU\..=)'WL+_Qm3%cLR5We,.Xb$>#hrnO/0@1h?L54>$TnTVPUqT#&8P3O<^`f/9X0F[GFj,E;+X+X7(B*K6I+"DY/)+FKB+LXe0RD,J7R[%cAN'M,^Qe;Oi']E.-OW69=mUX05)(0X#V(4aCGIIG^%)C4n3Yb:cRs4Ms@>E>s;jpS?E6K*:Gn%FAE\KH4_4Ck05+R=s,N59dkpTrmO0eigi5_k%i0Me@jFVo?AfWb)M6.;;k&[Xg2rW]^IHPtc7_9!F*`^QK0)"XMIpHA%'eIbM,;D].u#'sr^d4Oteu]C#rug_b-COJ$[7:N^.b9QCchQ#%rH)f3`l2fOU-5f7<ZBns<[k)aCA@U^<j'DDWQLQp<J',.g]<;_Brk]Y^"Ms3nnA_Ui*hjCT">_Re*?qsBPIt5t52[(do*#eLgH5M0UX]X%SlA.<[YH9Ma)c#:GgQ0+p?I6,'p%WKE)_o1K3Bqo(f/ICJN@SkJEd+l0JZ$-MZ"Y(4#-QstqZkIWeeM36@2na$YjNf^>CWFPV`iuI:.E_@1`&\1Js*^LWP#=[DHmEgf9j?gBt\e7?P,fcpq@rr3*-!f/i^kHn*-P5k8;fen-2VZjc7oV_fP"-m0W1h@]M_tY!Zu8$QGb1=LW=`'ZF6j3Kp3C7`\gAS*)LBj#kdC%]9]rQ;^Zeig(1sVh86cCs*/q40YlmZbc.lg%+8ZCZ[PJgIa^_.n"3`nu\^=f"`a6qo+iHlda>3fbio204u$]WA$g:PJ6g5E+2%T_fU-"3M)`:On7WrY5VaU==Yr[3J53O#Oluqp[*<#9I#4Jl.^iN1\cbm]TU8J'M>H]!k%Ku8hmB('.f9'!J3XSJU'4@Tqs7&*2s.CMA%V(C&fN5<%pTm80+?glB>3tAlWiF,uQH_:kWjo-Rc?$"e?h0]Qn&0,tOW>5qq(u6X3IP%":Th$/jP_N8f7Ni-W2-:,*.q'b[He/LjIm'kY=?EJa`nLr@Z0iMM>2WQZh,Z`6"D&uc]j.5EiC-7H6#"U.f'<@VT\EM=aW0gJS1d]<`^/QG)feD;P&?r_4+"]>e[U_&r=4@(\m*M>[_eg_E@W]8*5W>Ha,;E(2Acr(U#cE]3-<Le/f<"'<P5ql$,V(*mTg=W2>X=?uR5cOjH'X=-=',6)K!=GWCX&R<CioEb.@Xt*W]kIg*<C)2cSP?-#HASsr.;gdF68t;gq?dL=g0Q?>:).<U0kCD37H-f,N,qTYkNr0PX,=7ETJ?M!6=er:'O%Mg!i`:rWkk^p/30X;J>A"V1n/P_%FC4P"j=TJ&N'Dq1prC.A6*9,eL/qcPhE"tLpW+a4j9$lK'JgR`TF\q$HkOc/X/hGNKZ15[V4CXF"6ti`pId5"JrU2Qh<o(<gQ4YHSqjb@o.k;C9k1o>b`K9:fgDRDQEn#J_m%,_p9Rf[W:et7U)):T%#(F,q,A@=-RfKe<($dRn6b?3In[KX2AE^\=*"3@XH'#U=9Xj=WE-^[1rJ2)\)O_o&,'#oYga.A+](Z.,H&aXrM"j4S!d:r1FXZ">RsegnD:?;bATIVEFC#r6kG=pe`tG'eOWrJXl^_&rCHO=4l8;NPB_jlT;$jq72`$$330="Wg8qLW!X]YnBgJc1A#f^*sSoAmNa%4?7snO2n[tQ/NYorIho0I(Qu%H+`rrD=2H-:Jj^Ok';:H!-Kj8I9@H\di](;Y[%-"2kP!e3BtW+q;f^2eo(W99?/64<''_+_tiQLFd/E>I"((5;93cDoQXMA^o0+<`=LWO:=DT8qg)%]+I^BGY+:o[ms508&+TQX&-~>
+endstream
+endobj
+1075 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 1074 0 R
+/Annots 1076 0 R
+>>
+endobj
+1076 0 obj
+[
+1077 0 R
+1078 0 R
+1079 0 R
+]
+endobj
+1077 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 488.89 604.866 535.374 594.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://www.ietf.org/ipr)
+/S /URI >>
+/H /I
+>>
+endobj
+1078 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 92.0 593.866 144.783 583.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://www.ietf.org/ipr)
+/S /URI >>
+/H /I
+>>
+endobj
+1079 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 247.26 550.866 313.4 540.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (mailto:ietf-ipr@ietf.org)
+/S /URI >>
+/H /I
+>>
+endobj
+1080 0 obj
+<< /Length 3083 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm?968iI'#*O1kVg^P=M,`&b;rD;1J[:/PhFl]R0+\]%P'<6V5R)cn$g,gLmBKP'O@]JC_kCTLIOK/nm@;Vs*/0g9G0BjgqTSiLKA:]i?+O,%aPQ+KF'eG4O3r9\5$,qce#M<ArC$>=g"3H->:SY[ChsDp4LoS?l0*#r=i=oV>U"&c4u&r(O(/5N47OeI;#8OH*Jrq@^g3H/@/@SkNa&(Mkrg=k4EJU5KrglbUVVR6=<hW?cKF[CF'6fU7/pqQ6HKpRam%iBj#o;Xc$`hq1*h<C(RRY$Zh7dB/$]uH[QkdLJ%^KX'r;P3FEG"eCuAhg7!8SV5pC_ZF#&V/kX^bCAMO^Ar%$'j"&`dVMZ^c`3hF5$hl+Lh_*b$o.Q`=gP:\<C]Cod?Ga:`i'\K=R2dTUS0E&NQj7s9P&;bEO1qdWp@2-d,fS5jg'n9Si*9bEHb0S8i]2@)-.]@<Te_tl8*p6uo/;1[cn#5=7aid&>FP,mRD+Y>0a+n+q8+%^RM_'1*-Y)Q1_EL5_g3;$8PM%DK9?T%b]UMQh;9U',Yj9kl/s86UPJVuQY4-b_uZ4blf6pP]$;I;qUPlP^mR5U7EZnN&[0$Zl<2A.kD:^($#PFrkJL$+U3I\CQ<NLo%$EsXj]IUVa*^rL9A#iiH4Bkbl/F!@W95IO+[MP+86JhP+sD?"1G4#R/X7Paeol8*Xk3*K$L5N7PZ)$66R#*\%WG8o*APftjWQN_Vf9R46RSih'QdfR\Ke7WbHk1B0m\efSO>a_[$g^_c0t[;7VS;+o>b[4gcs'">RFSE]^igSiZ(J]9g6u1+_X-b5aY$5epPH";8PYchS&&?p,u16O&<1[(2rA]SNM+A15Vdu*#XJf*>.^"8P0:R6?9^8qNqs#c8MGs!@;A0"ra:%!C'"D/^<ES&DaN'Yi,.^?:Cn$bU?G3O?=*"0P6U`H,)!1=i>S(Xllsm,Ed:5Q($/+!tD#;5[[+lTXSq?".Wd/&\ddkWViEnO^N)5D&>K3gAk:Eb;T)d\sgNtUkn37GZ0!ZVE9S`"p=Nq/&RJL`-nGo]Y42\bMk6/^1F?"nQKUN/?hgq<NMM>6jRH[W3*JUP>)2CKJC/A@8$2r*3J4J<*HP<jbH7(NXkFO4u,lX1Llh9DUqCD/q`G%\W4+LNW$_C)8f*of@1YVoMhV$0?T+g_i(/+.mt8nM`^-/`paW(n3SOO]Ll\nQ4juMdtgu762g%es+FS3.>s;n3@G,>d>2R7c8;UFgh")[e84Z^M+9K$^?.mu]&S>&3BtcF62^:5o'BCS&Vk[J1c_'>aENAI"?gFJ'dkp#Zq@crFnCnbD)IFgR%+m.?l11s-&.X*iW9OfJAf!YdYAiXU<[/dWGcT4`mJZ01Ed#e_CSG(_RsuN`Z4KR*2<r&`<D.o!O'YU-aA:"b[QB:UmPh*F%n,:U5*H!+HUk,TklN\c1)O43+)h#[4(';&sfb7l,^3Z(h=105?!<DL@tW1#$:2EX2DGqNBkGsr)k%Kg<g1rbKmYFTLjep./<[,.XfAKK%VpV&a)q'6^`YpBeb8Y'(NZGU54<)76+RbOOPl%)Q#89E9ogFVG*ZGN5B8Gpdp#M_15kR>a#*IhYT_I3K0bq3%+>T/8&bGQ>JC/)b(Bb0pEZH$>=a#YeCKf(r>id#8JU5EGdb;aUZsna9Seebtt&pHK`\R`*$K[gMF/8,1iM9SeWMup-oT_$rD\B5mi,P%:-]-VBHWV"-%sD3X<#I#k(hR=,X+.mB+l+3e;qkF..g@rp%rt8*?>A^=m_V!MAl3dEFkQV9Q5cNZs1lMf]pHl9's*G\K^9X;UaJ]Cb<q=r>m4bHT@-[^tU0K<*A.:_k<jKH$HOCs)$3@aReiWIcQp5mOi@Fo3qf-EMgBc8a.V]Q6HJPf3%t8+k,],!i+b'EY8ioD6"&n$\<V]",W[pEJBZ6(3#bd5,?49rP2_&`372><,E&F+O"u1k`aKnnLb="ufiL):<DEJIOJ7@M-;n>G2rW()1e`&\*R7WNhP9\69QriW`.6_IYU+g0mjY-bS'p8e^#S\\9-f.N'd?@L3-&+Te-FMSBgr079`_C;m?'!<>\hI6kLI(Riugat;-#J*0BXk);_G#1sh%)MlWqpf]glOZ^Y:Xr)d"%?aQsMs3[5S<"OSRjm7cpqGMSW$/5[2'nV46,S;2^W$tf5"<9S$RS\O&_5YPHb2F*_^Ja'RXlaXg2TPJ>G@T98IAmPeK(G3@-m?jVs"j%g?Z/!RC'p#eWX$N;t.(ir:kE)Os$@m!YWWB/)=qi!c$&1.f1#e52D1U-,In)]+YH\c`=t)3$jO8YBSgp)B#;<2#$&iAHn`&r<e$t%!<q\3`(Tr[MSYa%7D5Gi0C/7q`r\jS762'cj<A:[sWM*UYEuL-<0+kW]Oju9\FIe<7<P.9F/sBb(Ro9QRB%/nuuNfYO?;3>sP4,T=Xb)fXVgOY>C>K/<DB"OLAlE/P5E;DJFb8p*/!Q6)UZ$W$juIH'T3$e/2t,BG.^Lcm`^o+U@qZ?"TSo=O/"7)%T,e:2o7?,3t=p&JS.Kgre(,-+JY\:3"_kHU;\DF[/[+QZ3-R8;f*]5KjK6;PS[qp-W1^n95>9\a:H18!U:-3L2EO#P`'<GmJe(f(Ao-WN&eU5Sd=L`'"JMi4GI<Iu(:tJ^k,7,IHOSAfo,+4ngupX;/\??UguTMFJ<4!%\;>dX*lO!?4=@1Sr6HUXj4V`A2c2?3TZ`SG)jMgZ@fN44'kk)j(]ZF)G4B6DI9L\@956dkV%:BU4bh3N-(m;A.PS\bgJqp[7n<gJO7Ios<(K%Nf:c64t>+hn</t^)quETiT\P$PFJ`fQU_Un*S$3h3Z)/gZ%-a%#YZ[=5>_`PAPR>no:a.)dXT)+=V&%OR^B@lG0@E0.K9Tc8dG_f>pT+::B,ZZLJ5Pr)X^RM<m+qP(]*;.!kM-M)6ktn#%pu'34]sNcsMs+6C.2mk.i4dP9DR3A^Z0"?3sfGPnjp&IY14kF_[`97p9#;ece/I#.j*<-p%.gMZ$WfQf3?3DM-(r8Mc0V5l"O"a=@44=W!?Qngi5bqB"*6gm^5+8D)8rDeJV/RJAt1N&MD~>
+endstream
+endobj
+1081 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 1080 0 R
+/Annots 1082 0 R
+>>
+endobj
+1082 0 obj
+[
+]
+endobj
+1083 0 obj
+<< /Length 4877 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GatmA>E@Ms(4OT5n7)glW8aB'[qm\L'MTMle*[9++5F+V0f$#I[\lRorK<<lOlDLJW!Ne6NC/0mG^-A:-2m0'g%TF'``2Wnp=$?oF8q28CAT++R+hP:#d'%nS(k-9hk'lBh2gH1DQ%OSn@X$[^,Cc4GFRJK[m)ur?0Y&3`5p3cI(pOq#e'eg`^#^]h7eB6TV3+.^Ic<n6=e^.kFof/eMl't2:fELPkU1;CsIO$pXa"fqmkDJRPQec/8nB'7:KYu;Ap_INf)g2pH=Od*JRuI_+Mg"iEJH6YRqFAY]abZX00M?S7%b`Zk7`HmIg'AoODqa&4HnjZ)Xs@$qb8n:oR`\J]@5#]fR9Yqs46+-lS[X8sgGh$-_m,<qS0E\QLdN2&54"`km^AbDM7RmgjX>e+TJGBHeqfL(8c2EYh2GeFtqnO!dJbKpEJFNLllf&^[2o.4HPn50Do1C<kFZEri73=UF!XeVdf7H$=/7DW,bCk8s+*'Y:$g`->059<_nKA0jSI]D^j`Yl4I'rE;\+fHhdt*0(#cPmRiQ2pQ`PG$Q/tL\o-ZI1["U%k3E&V8:MdEjYWKNTP3K*"/?kFg9NZ7?BJA<0!7dPIUU?.[#E`<Xq/[`,Qo7[/Z^bF5>[h"fJpN4G6TMHgV*Ae`[&1_&p+Pldt07s(UBWMAF$ki&l`^Ol/]g:;r??38T(gAoW%%Jc"o17GsG?1'U\\6U@d#dl7]tk&Pi3h_iAf@"gjGN2J(YJPr6VEt#YMZ`]IjDTZC3@fTT`NFLEpnpd"He*2+k2EN;XU594iEY4mPL^:kO)BDlIXGbYs3*V_(%OuXAY!sLUl::iKq7QZIDab+($Z:[!^I99'JAB_"(fE4P&'sb8'Z?l9*mpan5D`\P1`p@UX[gQXoKMXQ4,=_0HF1Gb&;u(7Qm9VX*j+i.LS*J=H2H'kER:o6p%,H0Q._g6f.t@B)/%e\;0k&d-__`ba!-[m1n5qM-j3]bO\Jqg.&-GhDI<D?.5Gpd"sG]TitrYR*S]Q7]"N\N@f"iH?Nd_Y,H?Bjig8Dt8B3(Op?*9UBjg#1"Cn71CeEA<q_3sR_%M^WFi@lu#_.*tntm-r.e["[`&^^8_a)EOF]H;SiBQl6WD;EOK^bC$>NYH993K++K!+'Nj%@0\&d[CWr[[cu1auiZ62<%;L;-C&VnEcYEen.>ptORR@AP.C:g74ko;;^h:Cs-"R[2!l*8ka5RnIcLCB*A/a2d>FX7s;cYYq[?4E&eGS7dp<.QC5@<SA(Za4*SQ3W,:j[f1tq$TRZ02fF1loCL#S[j;]0WA#,C*.\R@Ub*15j;c"3=)K1n$!J",dg?$Gin`p]-.<OQH<:R[q]SP[QMKc:B0DGb8qDFXUb*1-U/"kUg!l8?ePs99\bTu51FQcqA'hsC;aPX11`s$&XaJBtP`;l7r1LO-H3<nm.'pU8^NL^_q!d39\tJJ7*h()^1/i+7]PS3,UGsp)j5C%Ie@EJ8,1$ll6@.>tX3'Q@4gA:6\NB7UJTN)r`/rBc4G@8J1iQ\TARbZZIFXgRG*ZO)5$L_7qEg8\#)nhsD&#hbk&&>nEsXtO71hri(M2bu'mS;kRo]jt-NTfJfFj>-O\Qm)0AOJk)?!)f0a$-&DIOatS@nP'(,j)a=;Ka$TF@D`!$3FE5t6(^`$Pc"f:*FX#Xd:.5(kNXq@MV<_9b70Ua75L(F^k;6hl8:iGXY,KGC#A9=9MhXn#BhTKV#j?GU!,Pa)=G)nq'A0e"U^kmsls9g^3)1hEMWW:'e#3IaXI^`S_(AUpZ>nSK_EYVI>N%VT#eh^+`u5%J#"!h,FqGKFHK&'@BCR[2!<aX.L)".GOpmsHB.@kKaU"WfPE,$T+##\6i>BtM#T=]:_u]i9cuA*Y;m"R8fd&f;I&GLId1*"*]naXdg*&R0FE&E0]B=!Lfe&aMOB/.kf_PkX/C0l\aZ3p+ZeMk]R_ZNr9_/.>h:Tl>@;74_[E.O3.WM:N.oNDjjhMDVV7<C2qHN'(p3cL8'sI6LR6hIh%@-N_6eT?WUoF-BFp'LM80R5/m+&kWkpCnN;g/"(D_dJH&'%,KE(mX5jLKMJX^7re8`9Gol_'p:n/S'PKbcrlo[#LQ\S>^:G:Ok`C*>_nV7V;/nG6)Mei7opt0`5$apVoj]aGBcH2J_?J`Pq.d<.'FsV0c?dKbh]F[gZ>].Z?Zi[S',NX4LQ@=DeMG)9Q$<]Z/',)gkS8Y#udpq\'e2=*)[NK<B4tbVL/MGf(-C)k07ZrjWgFK_+C@sH#+FrVn><3RcmZkgZ>.CChPC\:\6)sD+!cV2g!r.MaX3.fYSoH6#;tQ;]a\Jh'm85#J!V%.?CTB_Afe+DA%B?A)!),jUHnL;()4)`>0`hDr?qCTSYkoZ"`4T,c'=L-2N;fh_q[:#ODWo*O`l^mg'kqGON;iYWMk*@5%EE1@3;9kHR,K?&%22mlYdV^WWiCruLf1$i[aD]D(3.Cm*uqeplkfBqeC*s..3mM*>AHG90s6qLnP!H#/o4'@qZrZ#ud:=T=r42MjV+rHEq.i4k2SHiG,[d0orc%%AUC/U,Lg\Q`c(EoO\V>:?jl#DFVSmc-^&3#:4J9_0f-p9Y#>+XZP[9tT?t29^D4bu8jQ;7!XTSB]@-_H#NJi`RJ$]d=Dd;M?;==iD25Yd.j76pfD],5`&c>:GI6,4IbYfnJnH1B`t&rSsuB90CA@T]Zo=JsimUDk"+%`*h/1@+]6A$Ic@.+qDe\'llI*X7,65=L'G>fPu_(Ud8.[B5-jXmNf`@=\YKr7/2sP#Jsf`K2#"fZiS.i:/e=eh'&Z6H'=\X;$T&f=@FIQ"Ll2OBnn;1dLLVT)e#h]pK<A<=BpLiD2%NRhIeQlq]t29+-I.QmsPu3[h!1JH@\.NSEVp/3DEY-]1^p[?RtmZRBdGRV]jjeedH6*`cjk=$tW/Ml1HTe_LP23^`5X4S1kXa86(I=&^#,/fq*@VYi)J^ZUoMl&ePaN2q,!t&?)#N8pif=ZDAlsMAEm,MGS:QLi=Zq,*=X;pI%>I,SA<<Os*>ka:pb!&/?#$"lg!DKHjB8-Ysn<U>k`T@=@Bf52h<^>f%J:KW*fpP0`cpQ3_!a,$38%.<.G9q2D%r&ol/a6WClu7,2+q,*A$Ep45bj8l7I8gI.Ei$BE2rV2nFhQTf/@?M^T:DX"\I96&#KeY:FN-Q8`%SAa0A@W#]=i5<2('Li!jFsigm%(OX#<1UHcm&kMESM<<uTsD$O.RQp4R@Kc3,U^PJFI_EV0$:l@j?a^Q'(mBXYU*Ur@B]#M<Au]W`[GG3`bJZk%/nC:R,s`i/b(X?j*R=F_tQ2(p4@G@W"o5U9i>$MZWWgJ/,6`V-0:1lH2"V9E94'$[IPILk\k$V'.7ON=SOq2L]+b=BhQC]Z]l20%NE!6^K6c+(BY1fCUo&sTIsY+%Nju'(&V@"S$5du3Q]nlr_0/i'NiY%\V@kLe.XCr-(nstI*#;f#1?;M!)5g#oB;F(6#BqJ-C0hlU0G=Fgl=';NWp4+WBDc5rq`2C#ZPB,lg"G=Fce$CF,Uh[QJTrA0^qZDG?J?II"]]'H^@`emiu)i$[73a4O\\W+P%u>Lmd(XD&89O3MtSL!G,DFcnAc0Z^@IT/^XqCotlDj[s:?9RIR#_gWqF(!IaSoZ`ka)Amm@Rb`n&Y%1?08htiap0P&;hU6bSBKtV(V_cb\+D0/W.G\-_6Ta]hVQ$IbL-PYS7Bk>d%k;8Qj$bLkf,-+I(,?0r_IdC$1aLJP'Eg6ud0]7RuK*m>bnL>C7j,D/n6rE)aFHJ*I1CIX4;B6je`6Tuqmu=@Vh]#XM&$CjMXs3e[\0Ci>j!qt@`YJ1K+*$sFGTf9$.4Z7M:VmM03Q:P*J>OJfGCej/!DPqWmKUjA!LebQ77@7Vn3'l=dh"I;ABG7l1[T?sbP@(MUo_@Ydt.RgL:C+";H@1>-5`CiaBPpn4`iRr:8e7F7cctUZL5_5KS_c(@72^f'bh]"H5[shN%a=-9D#35e-iW0^O]^Gmn`nW?HCZueO&rGMOl7;`#)t3>l!($TQ]2``uKKWC.=Sp[/8C4>,#(Sl32JL^RAa/IPkV_e?Kb=C>f^-I+S%-qP1[S=bV[b[;:6u<@Y"`32&d1(k(BY_2tKc1hqkB]V8`jB!Y:G$M"#3$\@1_?=imqnVZkq#EA!`r-dQ>j3M$$=i%jK]V8^lB18Y#\i72i]gG15$)&.&8X'rc4c'^^es,lF_ipAl:$g$>(k8n]n.Pta\6J9`fgYHRIfNg(2R.N$ekQ/RKM++L\S*WT@f&@NM[N4:rlnUI&GTk>Ss@RIaM@*4p=r>KT%aim+&i.S`$1iX@RQ^URhd*Lg[IQJ\&U-raXbc+:".o+E$NT^l^<)<b)@FbE:8I.SA)S:Q]E0H8Y=-Bj:_U2O'm+KKW/K1+%OP9q=;$g?8:('FAM7a,+rG<pZLRBF1LWJpN`e,,+"1l^_c&'@kptshi?9&*:r"H_f^J#0bc-Q4cOe'ZAF-$juWZ.(MZDij<U1Dpr*[Al^R;@@5*NAG>6e0=%)6R%*(MhHF-FBpc.,ck'rH:ja-OALUWtk+32.oGg*?&BC75kM8rcYj'KVXn=bD4IQ<oZ^"E>S&6RlV_f]>YL3+6Ygt)P#OcW4:f;$CEmS:SHMRtN1T*'$U_Do)ZO>n#Q*aK#K4Ok#CpK,V=3UE3P?(#qR(;a`A$BCIU8,ji$gNn4V4F[.6^Y?6CBD<Onolr+dR"eTG]5f):.&9>tP[""dBdGi*iH*cs!AJBrre;h9bAsq7rh&>6="f$iIW<YEoDFBa6_J>(Y1:I][3JeQ#p4\)4^KbceiFKM,Di+Z2TAI9He<2]]>-MbT""-o!]NLq-/DtD]l-=phVY_%f)FRqrLg?4TD]kB*QL>~>
+endstream
+endobj
+1084 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 1083 0 R
+/Annots 1085 0 R
+>>
+endobj
+1085 0 obj
+[
+]
+endobj
+1086 0 obj
+<< /Length 552 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GatU0a\K`-&A@fgHu'<%[c?muA?,it73sK_`?A%k.VM+^.XiJONK^rMU/dIOm(@W4c"(FHe(.r/&He8nD_4TP(*h<lN%",^'GWm$,jC[)g1c=)POu]q?jI$Gc.lG?!M#&O\/^Lqf;u&?!mXW'dfP\_Hb/Kba8ng2Tl!$]fM4bp&#"N<)+dA]PF@13%`\"*8?+^%?h'rqL]C)#YFt]/Z_8u9e<XjS8Nee9[#A_h0D0Ss,pK!_$eYE-,npX-?j4:4h4._.:<0ejru1=b<&gdF`2lM]4fju$6.!$#rqR%u7Y;=7AmehWEcc2c2+-A)g%Y5SP4/%(&eIOOSD1S^&np="[u2YG^bKHR:6S:XOleiqqi"7n=h@f%:=knqTO,DTs639X$;adXi27EWp94!UWB^[;53!Xqe`6&A0tM(+8`0'gYk>UUNOCN7]+\+*EU9M"BO=Mq*Yp]gpm[2p`&;j8WERD]Y/$UiYRjTCe#CT(T737`aUEA6mtgDSCbj4liO!#dMsU,SUKe,%(E;.Aq2uYkU-n']c^!]sgA1u<5;:1~>
+endstream
+endobj
+1087 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 1086 0 R
+/Annots 1088 0 R
+>>
+endobj
+1088 0 obj
+[
+]
+endobj
+1091 0 obj
+<<
+ /Title (\376\377\0\123\0\164\0\141\0\164\0\165\0\163\0\40\0\157\0\146\0\40\0\164\0\150\0\151\0\163\0\40\0\115\0\145\0\155\0\157)
+ /Parent 1089 0 R
+ /Next 1093 0 R
+ /A 1090 0 R
+>> endobj
+1093 0 obj
+<<
+ /Title (\376\377\0\103\0\157\0\160\0\171\0\162\0\151\0\147\0\150\0\164\0\40\0\116\0\157\0\164\0\151\0\143\0\145)
+ /Parent 1089 0 R
+ /Prev 1091 0 R
+ /Next 1095 0 R
+ /A 1092 0 R
+>> endobj
+1095 0 obj
+<<
+ /Title (\376\377\0\101\0\142\0\163\0\164\0\162\0\141\0\143\0\164)
+ /Parent 1089 0 R
+ /Prev 1093 0 R
+ /Next 1097 0 R
+ /A 1094 0 R
+>> endobj
+1097 0 obj
+<<
+ /Title (\376\377\0\124\0\141\0\142\0\154\0\145\0\40\0\157\0\146\0\40\0\103\0\157\0\156\0\164\0\145\0\156\0\164\0\163)
+ /Parent 1089 0 R
+ /Prev 1095 0 R
+ /Next 1099 0 R
+ /A 1096 0 R
+>> endobj
+1099 0 obj
+<<
+ /Title (\376\377\0\61\0\40\0\111\0\156\0\164\0\162\0\157\0\144\0\165\0\143\0\164\0\151\0\157\0\156)
+ /Parent 1089 0 R
+ /Prev 1097 0 R
+ /Next 1100 0 R
+ /A 1098 0 R
+>> endobj
+1100 0 obj
+<<
+ /Title (\376\377\0\62\0\40\0\116\0\157\0\164\0\141\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\103\0\157\0\156\0\166\0\145\0\156\0\164\0\151\0\157\0\156\0\163)
+ /Parent 1089 0 R
+ /Prev 1099 0 R
+ /Next 1101 0 R
+ /A 15 0 R
+>> endobj
+1101 0 obj
+<<
+ /Title (\376\377\0\63\0\40\0\124\0\145\0\162\0\155\0\151\0\156\0\157\0\154\0\157\0\147\0\171)
+ /Parent 1089 0 R
+ /Prev 1100 0 R
+ /Next 1103 0 R
+ /A 17 0 R
+>> endobj
+1103 0 obj
+<<
+ /Title (\376\377\0\64\0\40\0\104\0\141\0\164\0\141\0\40\0\115\0\157\0\144\0\145\0\154\0\40\0\146\0\157\0\162\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163)
+ /Parent 1089 0 R
+ /First 1104 0 R
+ /Last 1110 0 R
+ /Prev 1101 0 R
+ /Next 1112 0 R
+ /Count -6
+ /A 1102 0 R
+>> endobj
+1104 0 obj
+<<
+ /Title (\376\377\0\64\0\56\0\61\0\40\0\124\0\150\0\145\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\171\0\40\0\115\0\157\0\144\0\145\0\154)
+ /Parent 1103 0 R
+ /Next 1105 0 R
+ /A 21 0 R
+>> endobj
+1105 0 obj
+<<
+ /Title (\376\377\0\64\0\56\0\62\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163\0\40\0\141\0\156\0\144\0\40\0\110\0\124\0\124\0\120\0\40\0\110\0\145\0\141\0\144\0\145\0\162\0\163)
+ /Parent 1103 0 R
+ /Prev 1104 0 R
+ /Next 1107 0 R
+ /A 23 0 R
+>> endobj
+1107 0 obj
+<<
+ /Title (\376\377\0\64\0\56\0\63\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\171\0\40\0\126\0\141\0\154\0\165\0\145\0\163)
+ /Parent 1103 0 R
+ /First 1108 0 R
+ /Last 1108 0 R
+ /Prev 1105 0 R
+ /Next 1109 0 R
+ /Count -1
+ /A 1106 0 R
+>> endobj
+1108 0 obj
+<<
+ /Title (\376\377\0\64\0\56\0\63\0\56\0\61\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\171\0\40\0\167\0\151\0\164\0\150\0\40\0\115\0\151\0\170\0\145\0\144\0\40\0\103\0\157\0\156\0\164\0\145\0\156\0\164)
+ /Parent 1107 0 R
+ /A 27 0 R
+>> endobj
+1109 0 obj
+<<
+ /Title (\376\377\0\64\0\56\0\64\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\171\0\40\0\116\0\141\0\155\0\145\0\163)
+ /Parent 1103 0 R
+ /Prev 1107 0 R
+ /Next 1110 0 R
+ /A 29 0 R
+>> endobj
+1110 0 obj
+<<
+ /Title (\376\377\0\64\0\56\0\65\0\40\0\123\0\157\0\165\0\162\0\143\0\145\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\163\0\40\0\141\0\156\0\144\0\40\0\117\0\165\0\164\0\160\0\165\0\164\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\163)
+ /Parent 1103 0 R
+ /Prev 1109 0 R
+ /A 31 0 R
+>> endobj
+1112 0 obj
+<<
+ /Title (\376\377\0\65\0\40\0\103\0\157\0\154\0\154\0\145\0\143\0\164\0\151\0\157\0\156\0\163\0\40\0\157\0\146\0\40\0\127\0\145\0\142\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\163)
+ /Parent 1089 0 R
+ /First 1114 0 R
+ /Last 1116 0 R
+ /Prev 1103 0 R
+ /Next 1118 0 R
+ /Count -2
+ /A 1111 0 R
+>> endobj
+1114 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\61\0\40\0\110\0\124\0\124\0\120\0\40\0\125\0\122\0\114\0\40\0\116\0\141\0\155\0\145\0\163\0\160\0\141\0\143\0\145\0\40\0\115\0\157\0\144\0\145\0\154)
+ /Parent 1112 0 R
+ /Next 1116 0 R
+ /A 1113 0 R
+>> endobj
+1116 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\62\0\40\0\103\0\157\0\154\0\154\0\145\0\143\0\164\0\151\0\157\0\156\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\163)
+ /Parent 1112 0 R
+ /Prev 1114 0 R
+ /A 1115 0 R
+>> endobj
+1118 0 obj
+<<
+ /Title (\376\377\0\66\0\40\0\114\0\157\0\143\0\153\0\151\0\156\0\147)
+ /Parent 1089 0 R
+ /First 1120 0 R
+ /Last 1131 0 R
+ /Prev 1112 0 R
+ /Next 1133 0 R
+ /Count -8
+ /A 1117 0 R
+>> endobj
+1120 0 obj
+<<
+ /Title (\376\377\0\66\0\56\0\61\0\40\0\114\0\157\0\143\0\153\0\40\0\115\0\157\0\144\0\145\0\154)
+ /Parent 1118 0 R
+ /Next 1122 0 R
+ /A 1119 0 R
+>> endobj
+1122 0 obj
+<<
+ /Title (\376\377\0\66\0\56\0\62\0\40\0\105\0\170\0\143\0\154\0\165\0\163\0\151\0\166\0\145\0\40\0\166\0\163\0\56\0\40\0\123\0\150\0\141\0\162\0\145\0\144\0\40\0\114\0\157\0\143\0\153\0\163)
+ /Parent 1118 0 R
+ /Prev 1120 0 R
+ /Next 1123 0 R
+ /A 1121 0 R
+>> endobj
+1123 0 obj
+<<
+ /Title (\376\377\0\66\0\56\0\63\0\40\0\122\0\145\0\161\0\165\0\151\0\162\0\145\0\144\0\40\0\123\0\165\0\160\0\160\0\157\0\162\0\164)
+ /Parent 1118 0 R
+ /Prev 1122 0 R
+ /Next 1125 0 R
+ /A 45 0 R
+>> endobj
+1125 0 obj
+<<
+ /Title (\376\377\0\66\0\56\0\64\0\40\0\114\0\157\0\143\0\153\0\40\0\103\0\162\0\145\0\141\0\164\0\157\0\162\0\40\0\141\0\156\0\144\0\40\0\120\0\162\0\151\0\166\0\151\0\154\0\145\0\147\0\145\0\163)
+ /Parent 1118 0 R
+ /Prev 1123 0 R
+ /Next 1127 0 R
+ /A 1124 0 R
+>> endobj
+1127 0 obj
+<<
+ /Title (\376\377\0\66\0\56\0\65\0\40\0\114\0\157\0\143\0\153\0\40\0\124\0\157\0\153\0\145\0\156\0\163)
+ /Parent 1118 0 R
+ /Prev 1125 0 R
+ /Next 1129 0 R
+ /A 1126 0 R
+>> endobj
+1129 0 obj
+<<
+ /Title (\376\377\0\66\0\56\0\66\0\40\0\114\0\157\0\143\0\153\0\40\0\124\0\151\0\155\0\145\0\157\0\165\0\164)
+ /Parent 1118 0 R
+ /Prev 1127 0 R
+ /Next 1130 0 R
+ /A 1128 0 R
+>> endobj
+1130 0 obj
+<<
+ /Title (\376\377\0\66\0\56\0\67\0\40\0\114\0\157\0\143\0\153\0\40\0\103\0\141\0\160\0\141\0\142\0\151\0\154\0\151\0\164\0\171\0\40\0\104\0\151\0\163\0\143\0\157\0\166\0\145\0\162\0\171)
+ /Parent 1118 0 R
+ /Prev 1129 0 R
+ /Next 1131 0 R
+ /A 53 0 R
+>> endobj
+1131 0 obj
+<<
+ /Title (\376\377\0\66\0\56\0\70\0\40\0\101\0\143\0\164\0\151\0\166\0\145\0\40\0\114\0\157\0\143\0\153\0\40\0\104\0\151\0\163\0\143\0\157\0\166\0\145\0\162\0\171)
+ /Parent 1118 0 R
+ /Prev 1130 0 R
+ /A 55 0 R
+>> endobj
+1133 0 obj
+<<
+ /Title (\376\377\0\67\0\40\0\127\0\162\0\151\0\164\0\145\0\40\0\114\0\157\0\143\0\153)
+ /Parent 1089 0 R
+ /First 1134 0 R
+ /Last 1145 0 R
+ /Prev 1118 0 R
+ /Next 1147 0 R
+ /Count -9
+ /A 1132 0 R
+>> endobj
+1134 0 obj
+<<
+ /Title (\376\377\0\67\0\56\0\61\0\40\0\127\0\162\0\151\0\164\0\145\0\40\0\114\0\157\0\143\0\153\0\163\0\40\0\141\0\156\0\144\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163)
+ /Parent 1133 0 R
+ /Next 1135 0 R
+ /A 59 0 R
+>> endobj
+1135 0 obj
+<<
+ /Title (\376\377\0\67\0\56\0\62\0\40\0\101\0\166\0\157\0\151\0\144\0\151\0\156\0\147\0\40\0\114\0\157\0\163\0\164\0\40\0\125\0\160\0\144\0\141\0\164\0\145\0\163)
+ /Parent 1133 0 R
+ /Prev 1134 0 R
+ /Next 1137 0 R
+ /A 61 0 R
+>> endobj
+1137 0 obj
+<<
+ /Title (\376\377\0\67\0\56\0\63\0\40\0\127\0\162\0\151\0\164\0\145\0\40\0\114\0\157\0\143\0\153\0\163\0\40\0\141\0\156\0\144\0\40\0\125\0\156\0\155\0\141\0\160\0\160\0\145\0\144\0\40\0\125\0\122\0\114\0\163)
+ /Parent 1133 0 R
+ /Prev 1135 0 R
+ /Next 1139 0 R
+ /A 1136 0 R
+>> endobj
+1139 0 obj
+<<
+ /Title (\376\377\0\67\0\56\0\64\0\40\0\127\0\162\0\151\0\164\0\145\0\40\0\114\0\157\0\143\0\153\0\163\0\40\0\141\0\156\0\144\0\40\0\103\0\157\0\154\0\154\0\145\0\143\0\164\0\151\0\157\0\156\0\163)
+ /Parent 1133 0 R
+ /Prev 1137 0 R
+ /Next 1141 0 R
+ /A 1138 0 R
+>> endobj
+1141 0 obj
+<<
+ /Title (\376\377\0\67\0\56\0\65\0\40\0\127\0\162\0\151\0\164\0\145\0\40\0\114\0\157\0\143\0\153\0\163\0\40\0\141\0\156\0\144\0\40\0\164\0\150\0\145\0\40\0\111\0\146\0\40\0\122\0\145\0\161\0\165\0\145\0\163\0\164\0\40\0\110\0\145\0\141\0\144\0\145\0\162)
+ /Parent 1133 0 R
+ /First 1142 0 R
+ /Last 1143 0 R
+ /Prev 1139 0 R
+ /Next 1144 0 R
+ /Count -2
+ /A 1140 0 R
+>> endobj
+1142 0 obj
+<<
+ /Title (\376\377\0\67\0\56\0\65\0\56\0\61\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\127\0\162\0\151\0\164\0\145\0\40\0\114\0\157\0\143\0\153\0\40\0\141\0\156\0\144\0\40\0\103\0\117\0\120\0\131)
+ /Parent 1141 0 R
+ /Next 1143 0 R
+ /A 69 0 R
+>> endobj
+1143 0 obj
+<<
+ /Title (\376\377\0\67\0\56\0\65\0\56\0\62\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\104\0\145\0\154\0\145\0\164\0\151\0\156\0\147\0\40\0\141\0\40\0\115\0\145\0\155\0\142\0\145\0\162\0\40\0\157\0\146\0\40\0\141\0\40\0\114\0\157\0\143\0\153\0\145\0\144\0\40\0\103\0\157\0\154\0\154\0\145\0\143\0\164\0\151\0\157\0\156)
+ /Parent 1141 0 R
+ /Prev 1142 0 R
+ /A 71 0 R
+>> endobj
+1144 0 obj
+<<
+ /Title (\376\377\0\67\0\56\0\66\0\40\0\127\0\162\0\151\0\164\0\145\0\40\0\114\0\157\0\143\0\153\0\163\0\40\0\141\0\156\0\144\0\40\0\103\0\117\0\120\0\131\0\57\0\115\0\117\0\126\0\105)
+ /Parent 1133 0 R
+ /Prev 1141 0 R
+ /Next 1145 0 R
+ /A 73 0 R
+>> endobj
+1145 0 obj
+<<
+ /Title (\376\377\0\67\0\56\0\67\0\40\0\122\0\145\0\146\0\162\0\145\0\163\0\150\0\151\0\156\0\147\0\40\0\127\0\162\0\151\0\164\0\145\0\40\0\114\0\157\0\143\0\153\0\163)
+ /Parent 1133 0 R
+ /Prev 1144 0 R
+ /A 75 0 R
+>> endobj
+1147 0 obj
+<<
+ /Title (\376\377\0\70\0\40\0\107\0\145\0\156\0\145\0\162\0\141\0\154\0\40\0\122\0\145\0\161\0\165\0\145\0\163\0\164\0\40\0\141\0\156\0\144\0\40\0\122\0\145\0\163\0\160\0\157\0\156\0\163\0\145\0\40\0\110\0\141\0\156\0\144\0\154\0\151\0\156\0\147)
+ /Parent 1089 0 R
+ /First 1149 0 R
+ /Last 1162 0 R
+ /Prev 1133 0 R
+ /Next 1164 0 R
+ /Count -9
+ /A 1146 0 R
+>> endobj
+1149 0 obj
+<<
+ /Title (\376\377\0\70\0\56\0\61\0\40\0\120\0\162\0\145\0\143\0\145\0\144\0\145\0\156\0\143\0\145\0\40\0\151\0\156\0\40\0\105\0\162\0\162\0\157\0\162\0\40\0\110\0\141\0\156\0\144\0\154\0\151\0\156\0\147)
+ /Parent 1147 0 R
+ /Next 1150 0 R
+ /A 1148 0 R
+>> endobj
+1150 0 obj
+<<
+ /Title (\376\377\0\70\0\56\0\62\0\40\0\125\0\163\0\145\0\40\0\157\0\146\0\40\0\130\0\115\0\114)
+ /Parent 1147 0 R
+ /Prev 1149 0 R
+ /Next 1152 0 R
+ /A 81 0 R
+>> endobj
+1152 0 obj
+<<
+ /Title (\376\377\0\70\0\56\0\63\0\40\0\125\0\122\0\114\0\40\0\110\0\141\0\156\0\144\0\154\0\151\0\156\0\147)
+ /Parent 1147 0 R
+ /First 1153 0 R
+ /Last 1153 0 R
+ /Prev 1150 0 R
+ /Next 1154 0 R
+ /Count -1
+ /A 1151 0 R
+>> endobj
+1153 0 obj
+<<
+ /Title (\376\377\0\70\0\56\0\63\0\56\0\61\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\103\0\157\0\162\0\162\0\145\0\143\0\164\0\40\0\125\0\122\0\114\0\40\0\110\0\141\0\156\0\144\0\154\0\151\0\156\0\147)
+ /Parent 1152 0 R
+ /A 85 0 R
+>> endobj
+1154 0 obj
+<<
+ /Title (\376\377\0\70\0\56\0\64\0\40\0\122\0\145\0\161\0\165\0\151\0\162\0\145\0\144\0\40\0\102\0\157\0\144\0\151\0\145\0\163\0\40\0\151\0\156\0\40\0\122\0\145\0\161\0\165\0\145\0\163\0\164\0\163)
+ /Parent 1147 0 R
+ /Prev 1152 0 R
+ /Next 1156 0 R
+ /A 90 0 R
+>> endobj
+1156 0 obj
+<<
+ /Title (\376\377\0\70\0\56\0\65\0\40\0\110\0\124\0\124\0\120\0\40\0\110\0\145\0\141\0\144\0\145\0\162\0\163\0\40\0\146\0\157\0\162\0\40\0\125\0\163\0\145\0\40\0\151\0\156\0\40\0\127\0\145\0\142\0\104\0\101\0\126)
+ /Parent 1147 0 R
+ /Prev 1154 0 R
+ /Next 1158 0 R
+ /A 1155 0 R
+>> endobj
+1158 0 obj
+<<
+ /Title (\376\377\0\70\0\56\0\66\0\40\0\105\0\124\0\141\0\147)
+ /Parent 1147 0 R
+ /Prev 1156 0 R
+ /Next 1160 0 R
+ /A 1157 0 R
+>> endobj
+1160 0 obj
+<<
+ /Title (\376\377\0\70\0\56\0\67\0\40\0\111\0\156\0\143\0\154\0\165\0\144\0\151\0\156\0\147\0\40\0\105\0\162\0\162\0\157\0\162\0\40\0\122\0\145\0\163\0\160\0\157\0\156\0\163\0\145\0\40\0\102\0\157\0\144\0\151\0\145\0\163)
+ /Parent 1147 0 R
+ /Prev 1158 0 R
+ /Next 1162 0 R
+ /A 1159 0 R
+>> endobj
+1162 0 obj
+<<
+ /Title (\376\377\0\70\0\56\0\70\0\40\0\111\0\155\0\160\0\141\0\143\0\164\0\40\0\157\0\146\0\40\0\116\0\141\0\155\0\145\0\163\0\160\0\141\0\143\0\145\0\40\0\117\0\160\0\145\0\162\0\141\0\164\0\151\0\157\0\156\0\163\0\40\0\157\0\156\0\40\0\103\0\141\0\143\0\150\0\145\0\40\0\126\0\141\0\154\0\151\0\144\0\141\0\164\0\157\0\162\0\163)
+ /Parent 1147 0 R
+ /Prev 1160 0 R
+ /A 1161 0 R
+>> endobj
+1164 0 obj
+<<
+ /Title (\376\377\0\71\0\40\0\110\0\124\0\124\0\120\0\40\0\115\0\145\0\164\0\150\0\157\0\144\0\163\0\40\0\146\0\157\0\162\0\40\0\104\0\151\0\163\0\164\0\162\0\151\0\142\0\165\0\164\0\145\0\144\0\40\0\101\0\165\0\164\0\150\0\157\0\162\0\151\0\156\0\147)
+ /Parent 1089 0 R
+ /First 1166 0 R
+ /Last 1232 0 R
+ /Prev 1147 0 R
+ /Next 1236 0 R
+ /Count -50
+ /A 1163 0 R
+>> endobj
+1166 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\61\0\40\0\120\0\122\0\117\0\120\0\106\0\111\0\116\0\104\0\40\0\115\0\145\0\164\0\150\0\157\0\144)
+ /Parent 1164 0 R
+ /First 1167 0 R
+ /Last 1173 0 R
+ /Next 1175 0 R
+ /Count -6
+ /A 1165 0 R
+>> endobj
+1167 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\61\0\56\0\61\0\40\0\120\0\122\0\117\0\120\0\106\0\111\0\116\0\104\0\40\0\123\0\164\0\141\0\164\0\165\0\163\0\40\0\103\0\157\0\144\0\145\0\163)
+ /Parent 1166 0 R
+ /Next 1169 0 R
+ /A 104 0 R
+>> endobj
+1169 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\61\0\56\0\62\0\40\0\123\0\164\0\141\0\164\0\165\0\163\0\40\0\103\0\157\0\144\0\145\0\163\0\40\0\146\0\157\0\162\0\40\0\125\0\163\0\145\0\40\0\151\0\156\0\40\0\47\0\160\0\162\0\157\0\160\0\163\0\164\0\141\0\164\0\47\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164)
+ /Parent 1166 0 R
+ /Prev 1167 0 R
+ /Next 1170 0 R
+ /A 1168 0 R
+>> endobj
+1170 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\61\0\56\0\63\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\122\0\145\0\164\0\162\0\151\0\145\0\166\0\151\0\156\0\147\0\40\0\116\0\141\0\155\0\145\0\144\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163)
+ /Parent 1166 0 R
+ /Prev 1169 0 R
+ /Next 1171 0 R
+ /A 108 0 R
+>> endobj
+1171 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\61\0\56\0\64\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\125\0\163\0\151\0\156\0\147\0\40\0\47\0\160\0\162\0\157\0\160\0\156\0\141\0\155\0\145\0\47\0\40\0\164\0\157\0\40\0\122\0\145\0\164\0\162\0\151\0\145\0\166\0\145\0\40\0\101\0\154\0\154\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\171\0\40\0\116\0\141\0\155\0\145\0\163)
+ /Parent 1166 0 R
+ /Prev 1170 0 R
+ /Next 1172 0 R
+ /A 110 0 R
+>> endobj
+1172 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\61\0\56\0\65\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\125\0\163\0\151\0\156\0\147\0\40\0\123\0\157\0\55\0\143\0\141\0\154\0\154\0\145\0\144\0\40\0\47\0\141\0\154\0\154\0\160\0\162\0\157\0\160\0\47)
+ /Parent 1166 0 R
+ /Prev 1171 0 R
+ /Next 1173 0 R
+ /A 112 0 R
+>> endobj
+1173 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\61\0\56\0\66\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\125\0\163\0\151\0\156\0\147\0\40\0\47\0\141\0\154\0\154\0\160\0\162\0\157\0\160\0\47\0\40\0\167\0\151\0\164\0\150\0\40\0\47\0\151\0\156\0\143\0\154\0\165\0\144\0\145\0\47)
+ /Parent 1166 0 R
+ /Prev 1172 0 R
+ /A 114 0 R
+>> endobj
+1175 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\62\0\40\0\120\0\122\0\117\0\120\0\120\0\101\0\124\0\103\0\110\0\40\0\115\0\145\0\164\0\150\0\157\0\144)
+ /Parent 1164 0 R
+ /First 1177 0 R
+ /Last 1178 0 R
+ /Prev 1166 0 R
+ /Next 1180 0 R
+ /Count -2
+ /A 1174 0 R
+>> endobj
+1177 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\62\0\56\0\61\0\40\0\123\0\164\0\141\0\164\0\165\0\163\0\40\0\103\0\157\0\144\0\145\0\163\0\40\0\146\0\157\0\162\0\40\0\125\0\163\0\145\0\40\0\151\0\156\0\40\0\47\0\160\0\162\0\157\0\160\0\163\0\164\0\141\0\164\0\47\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164)
+ /Parent 1175 0 R
+ /Next 1178 0 R
+ /A 1176 0 R
+>> endobj
+1178 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\62\0\56\0\62\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\120\0\122\0\117\0\120\0\120\0\101\0\124\0\103\0\110)
+ /Parent 1175 0 R
+ /Prev 1177 0 R
+ /A 120 0 R
+>> endobj
+1180 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\63\0\40\0\115\0\113\0\103\0\117\0\114\0\40\0\115\0\145\0\164\0\150\0\157\0\144)
+ /Parent 1164 0 R
+ /First 1181 0 R
+ /Last 1182 0 R
+ /Prev 1175 0 R
+ /Next 1183 0 R
+ /Count -2
+ /A 1179 0 R
+>> endobj
+1181 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\63\0\56\0\61\0\40\0\115\0\113\0\103\0\117\0\114\0\40\0\123\0\164\0\141\0\164\0\165\0\163\0\40\0\103\0\157\0\144\0\145\0\163)
+ /Parent 1180 0 R
+ /Next 1182 0 R
+ /A 124 0 R
+>> endobj
+1182 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\63\0\56\0\62\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\115\0\113\0\103\0\117\0\114)
+ /Parent 1180 0 R
+ /Prev 1181 0 R
+ /A 126 0 R
+>> endobj
+1183 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\64\0\40\0\107\0\105\0\124\0\54\0\40\0\110\0\105\0\101\0\104\0\40\0\146\0\157\0\162\0\40\0\103\0\157\0\154\0\154\0\145\0\143\0\164\0\151\0\157\0\156\0\163)
+ /Parent 1164 0 R
+ /Prev 1180 0 R
+ /Next 1185 0 R
+ /A 128 0 R
+>> endobj
+1185 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\65\0\40\0\120\0\117\0\123\0\124\0\40\0\146\0\157\0\162\0\40\0\103\0\157\0\154\0\154\0\145\0\143\0\164\0\151\0\157\0\156\0\163)
+ /Parent 1164 0 R
+ /Prev 1183 0 R
+ /Next 1187 0 R
+ /A 1184 0 R
+>> endobj
+1187 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\66\0\40\0\104\0\105\0\114\0\105\0\124\0\105\0\40\0\122\0\145\0\161\0\165\0\151\0\162\0\145\0\155\0\145\0\156\0\164\0\163)
+ /Parent 1164 0 R
+ /First 1189 0 R
+ /Last 1191 0 R
+ /Prev 1185 0 R
+ /Next 1193 0 R
+ /Count -2
+ /A 1186 0 R
+>> endobj
+1189 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\66\0\56\0\61\0\40\0\104\0\105\0\114\0\105\0\124\0\105\0\40\0\146\0\157\0\162\0\40\0\103\0\157\0\154\0\154\0\145\0\143\0\164\0\151\0\157\0\156\0\163)
+ /Parent 1187 0 R
+ /Next 1191 0 R
+ /A 1188 0 R
+>> endobj
+1191 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\66\0\56\0\62\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\104\0\105\0\114\0\105\0\124\0\105)
+ /Parent 1187 0 R
+ /Prev 1189 0 R
+ /A 1190 0 R
+>> endobj
+1193 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\67\0\40\0\120\0\125\0\124\0\40\0\122\0\145\0\161\0\165\0\151\0\162\0\145\0\155\0\145\0\156\0\164\0\163)
+ /Parent 1164 0 R
+ /First 1195 0 R
+ /Last 1196 0 R
+ /Prev 1187 0 R
+ /Next 1198 0 R
+ /Count -2
+ /A 1192 0 R
+>> endobj
+1195 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\67\0\56\0\61\0\40\0\120\0\125\0\124\0\40\0\146\0\157\0\162\0\40\0\116\0\157\0\156\0\55\0\103\0\157\0\154\0\154\0\145\0\143\0\164\0\151\0\157\0\156\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\163)
+ /Parent 1193 0 R
+ /Next 1196 0 R
+ /A 1194 0 R
+>> endobj
+1196 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\67\0\56\0\62\0\40\0\120\0\125\0\124\0\40\0\146\0\157\0\162\0\40\0\103\0\157\0\154\0\154\0\145\0\143\0\164\0\151\0\157\0\156\0\163)
+ /Parent 1193 0 R
+ /Prev 1195 0 R
+ /A 142 0 R
+>> endobj
+1198 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\70\0\40\0\103\0\117\0\120\0\131\0\40\0\115\0\145\0\164\0\150\0\157\0\144)
+ /Parent 1164 0 R
+ /First 1199 0 R
+ /Last 1208 0 R
+ /Prev 1193 0 R
+ /Next 1210 0 R
+ /Count -8
+ /A 1197 0 R
+>> endobj
+1199 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\70\0\56\0\61\0\40\0\103\0\117\0\120\0\131\0\40\0\146\0\157\0\162\0\40\0\116\0\157\0\156\0\55\0\143\0\157\0\154\0\154\0\145\0\143\0\164\0\151\0\157\0\156\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\163)
+ /Parent 1198 0 R
+ /Next 1201 0 R
+ /A 146 0 R
+>> endobj
+1201 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\70\0\56\0\62\0\40\0\103\0\117\0\120\0\131\0\40\0\146\0\157\0\162\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163)
+ /Parent 1198 0 R
+ /Prev 1199 0 R
+ /Next 1203 0 R
+ /A 1200 0 R
+>> endobj
+1203 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\70\0\56\0\63\0\40\0\103\0\117\0\120\0\131\0\40\0\146\0\157\0\162\0\40\0\103\0\157\0\154\0\154\0\145\0\143\0\164\0\151\0\157\0\156\0\163)
+ /Parent 1198 0 R
+ /Prev 1201 0 R
+ /Next 1204 0 R
+ /A 1202 0 R
+>> endobj
+1204 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\70\0\56\0\64\0\40\0\103\0\117\0\120\0\131\0\40\0\141\0\156\0\144\0\40\0\117\0\166\0\145\0\162\0\167\0\162\0\151\0\164\0\151\0\156\0\147\0\40\0\104\0\145\0\163\0\164\0\151\0\156\0\141\0\164\0\151\0\157\0\156\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\163)
+ /Parent 1198 0 R
+ /Prev 1203 0 R
+ /Next 1205 0 R
+ /A 152 0 R
+>> endobj
+1205 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\70\0\56\0\65\0\40\0\123\0\164\0\141\0\164\0\165\0\163\0\40\0\103\0\157\0\144\0\145\0\163)
+ /Parent 1198 0 R
+ /Prev 1204 0 R
+ /Next 1206 0 R
+ /A 154 0 R
+>> endobj
+1206 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\70\0\56\0\66\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\103\0\117\0\120\0\131\0\40\0\167\0\151\0\164\0\150\0\40\0\117\0\166\0\145\0\162\0\167\0\162\0\151\0\164\0\145)
+ /Parent 1198 0 R
+ /Prev 1205 0 R
+ /Next 1207 0 R
+ /A 156 0 R
+>> endobj
+1207 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\70\0\56\0\67\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\103\0\117\0\120\0\131\0\40\0\167\0\151\0\164\0\150\0\40\0\116\0\157\0\40\0\117\0\166\0\145\0\162\0\167\0\162\0\151\0\164\0\145)
+ /Parent 1198 0 R
+ /Prev 1206 0 R
+ /Next 1208 0 R
+ /A 158 0 R
+>> endobj
+1208 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\70\0\56\0\70\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\103\0\117\0\120\0\131\0\40\0\157\0\146\0\40\0\141\0\40\0\103\0\157\0\154\0\154\0\145\0\143\0\164\0\151\0\157\0\156)
+ /Parent 1198 0 R
+ /Prev 1207 0 R
+ /A 160 0 R
+>> endobj
+1210 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\71\0\40\0\115\0\117\0\126\0\105\0\40\0\115\0\145\0\164\0\150\0\157\0\144)
+ /Parent 1164 0 R
+ /First 1212 0 R
+ /Last 1218 0 R
+ /Prev 1198 0 R
+ /Next 1220 0 R
+ /Count -6
+ /A 1209 0 R
+>> endobj
+1212 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\71\0\56\0\61\0\40\0\115\0\117\0\126\0\105\0\40\0\146\0\157\0\162\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163)
+ /Parent 1210 0 R
+ /Next 1214 0 R
+ /A 1211 0 R
+>> endobj
+1214 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\71\0\56\0\62\0\40\0\115\0\117\0\126\0\105\0\40\0\146\0\157\0\162\0\40\0\103\0\157\0\154\0\154\0\145\0\143\0\164\0\151\0\157\0\156\0\163)
+ /Parent 1210 0 R
+ /Prev 1212 0 R
+ /Next 1215 0 R
+ /A 1213 0 R
+>> endobj
+1215 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\71\0\56\0\63\0\40\0\115\0\117\0\126\0\105\0\40\0\141\0\156\0\144\0\40\0\164\0\150\0\145\0\40\0\117\0\166\0\145\0\162\0\167\0\162\0\151\0\164\0\145\0\40\0\110\0\145\0\141\0\144\0\145\0\162)
+ /Parent 1210 0 R
+ /Prev 1214 0 R
+ /Next 1216 0 R
+ /A 168 0 R
+>> endobj
+1216 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\71\0\56\0\64\0\40\0\123\0\164\0\141\0\164\0\165\0\163\0\40\0\103\0\157\0\144\0\145\0\163)
+ /Parent 1210 0 R
+ /Prev 1215 0 R
+ /Next 1217 0 R
+ /A 170 0 R
+>> endobj
+1217 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\71\0\56\0\65\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\115\0\117\0\126\0\105\0\40\0\157\0\146\0\40\0\141\0\40\0\116\0\157\0\156\0\55\0\103\0\157\0\154\0\154\0\145\0\143\0\164\0\151\0\157\0\156)
+ /Parent 1210 0 R
+ /Prev 1216 0 R
+ /Next 1218 0 R
+ /A 172 0 R
+>> endobj
+1218 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\71\0\56\0\66\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\115\0\117\0\126\0\105\0\40\0\157\0\146\0\40\0\141\0\40\0\103\0\157\0\154\0\154\0\145\0\143\0\164\0\151\0\157\0\156)
+ /Parent 1210 0 R
+ /Prev 1217 0 R
+ /A 174 0 R
+>> endobj
+1220 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\61\0\60\0\40\0\114\0\117\0\103\0\113\0\40\0\115\0\145\0\164\0\150\0\157\0\144)
+ /Parent 1164 0 R
+ /First 1221 0 R
+ /Last 1230 0 R
+ /Prev 1210 0 R
+ /Next 1232 0 R
+ /Count -9
+ /A 1219 0 R
+>> endobj
+1221 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\61\0\60\0\56\0\61\0\40\0\103\0\162\0\145\0\141\0\164\0\151\0\156\0\147\0\40\0\141\0\40\0\114\0\157\0\143\0\153\0\40\0\157\0\156\0\40\0\141\0\156\0\40\0\105\0\170\0\151\0\163\0\164\0\151\0\156\0\147\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145)
+ /Parent 1220 0 R
+ /Next 1223 0 R
+ /A 178 0 R
+>> endobj
+1223 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\61\0\60\0\56\0\62\0\40\0\122\0\145\0\146\0\162\0\145\0\163\0\150\0\151\0\156\0\147\0\40\0\114\0\157\0\143\0\153\0\163)
+ /Parent 1220 0 R
+ /Prev 1221 0 R
+ /Next 1224 0 R
+ /A 1222 0 R
+>> endobj
+1224 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\61\0\60\0\56\0\63\0\40\0\104\0\145\0\160\0\164\0\150\0\40\0\141\0\156\0\144\0\40\0\114\0\157\0\143\0\153\0\151\0\156\0\147)
+ /Parent 1220 0 R
+ /Prev 1223 0 R
+ /Next 1225 0 R
+ /A 182 0 R
+>> endobj
+1225 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\61\0\60\0\56\0\64\0\40\0\114\0\157\0\143\0\153\0\151\0\156\0\147\0\40\0\125\0\156\0\155\0\141\0\160\0\160\0\145\0\144\0\40\0\125\0\122\0\114\0\163)
+ /Parent 1220 0 R
+ /Prev 1224 0 R
+ /Next 1226 0 R
+ /A 184 0 R
+>> endobj
+1226 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\61\0\60\0\56\0\65\0\40\0\114\0\157\0\143\0\153\0\40\0\103\0\157\0\155\0\160\0\141\0\164\0\151\0\142\0\151\0\154\0\151\0\164\0\171\0\40\0\124\0\141\0\142\0\154\0\145)
+ /Parent 1220 0 R
+ /Prev 1225 0 R
+ /Next 1227 0 R
+ /A 186 0 R
+>> endobj
+1227 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\61\0\60\0\56\0\66\0\40\0\114\0\117\0\103\0\113\0\40\0\122\0\145\0\163\0\160\0\157\0\156\0\163\0\145\0\163)
+ /Parent 1220 0 R
+ /Prev 1226 0 R
+ /Next 1228 0 R
+ /A 188 0 R
+>> endobj
+1228 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\61\0\60\0\56\0\67\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\123\0\151\0\155\0\160\0\154\0\145\0\40\0\114\0\157\0\143\0\153\0\40\0\122\0\145\0\161\0\165\0\145\0\163\0\164)
+ /Parent 1220 0 R
+ /Prev 1227 0 R
+ /Next 1229 0 R
+ /A 190 0 R
+>> endobj
+1229 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\61\0\60\0\56\0\70\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\122\0\145\0\146\0\162\0\145\0\163\0\150\0\151\0\156\0\147\0\40\0\141\0\40\0\127\0\162\0\151\0\164\0\145\0\40\0\114\0\157\0\143\0\153)
+ /Parent 1220 0 R
+ /Prev 1228 0 R
+ /Next 1230 0 R
+ /A 195 0 R
+>> endobj
+1230 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\61\0\60\0\56\0\71\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\115\0\165\0\154\0\164\0\151\0\55\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\40\0\114\0\157\0\143\0\153\0\40\0\122\0\145\0\161\0\165\0\145\0\163\0\164)
+ /Parent 1220 0 R
+ /Prev 1229 0 R
+ /A 197 0 R
+>> endobj
+1232 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\61\0\61\0\40\0\125\0\116\0\114\0\117\0\103\0\113\0\40\0\115\0\145\0\164\0\150\0\157\0\144)
+ /Parent 1164 0 R
+ /First 1233 0 R
+ /Last 1234 0 R
+ /Prev 1220 0 R
+ /Count -2
+ /A 1231 0 R
+>> endobj
+1233 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\61\0\61\0\56\0\61\0\40\0\123\0\164\0\141\0\164\0\165\0\163\0\40\0\103\0\157\0\144\0\145\0\163)
+ /Parent 1232 0 R
+ /Next 1234 0 R
+ /A 201 0 R
+>> endobj
+1234 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\61\0\61\0\56\0\62\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\125\0\116\0\114\0\117\0\103\0\113)
+ /Parent 1232 0 R
+ /Prev 1233 0 R
+ /A 203 0 R
+>> endobj
+1236 0 obj
+<<
+ /Title (\376\377\0\61\0\60\0\40\0\110\0\124\0\124\0\120\0\40\0\110\0\145\0\141\0\144\0\145\0\162\0\163\0\40\0\146\0\157\0\162\0\40\0\104\0\151\0\163\0\164\0\162\0\151\0\142\0\165\0\164\0\145\0\144\0\40\0\101\0\165\0\164\0\150\0\157\0\162\0\151\0\156\0\147)
+ /Parent 1089 0 R
+ /First 1238 0 R
+ /Last 1266 0 R
+ /Prev 1164 0 R
+ /Next 1268 0 R
+ /Count -18
+ /A 1235 0 R
+>> endobj
+1238 0 obj
+<<
+ /Title (\376\377\0\61\0\60\0\56\0\61\0\40\0\104\0\101\0\126\0\40\0\110\0\145\0\141\0\144\0\145\0\162)
+ /Parent 1236 0 R
+ /Next 1240 0 R
+ /A 1237 0 R
+>> endobj
+1240 0 obj
+<<
+ /Title (\376\377\0\61\0\60\0\56\0\62\0\40\0\104\0\145\0\160\0\164\0\150\0\40\0\110\0\145\0\141\0\144\0\145\0\162)
+ /Parent 1236 0 R
+ /Prev 1238 0 R
+ /Next 1242 0 R
+ /A 1239 0 R
+>> endobj
+1242 0 obj
+<<
+ /Title (\376\377\0\61\0\60\0\56\0\63\0\40\0\104\0\145\0\163\0\164\0\151\0\156\0\141\0\164\0\151\0\157\0\156\0\40\0\110\0\145\0\141\0\144\0\145\0\162)
+ /Parent 1236 0 R
+ /Prev 1240 0 R
+ /Next 1244 0 R
+ /A 1241 0 R
+>> endobj
+1244 0 obj
+<<
+ /Title (\376\377\0\61\0\60\0\56\0\64\0\40\0\111\0\146\0\40\0\110\0\145\0\141\0\144\0\145\0\162)
+ /Parent 1236 0 R
+ /First 1246 0 R
+ /Last 1260 0 R
+ /Prev 1242 0 R
+ /Next 1262 0 R
+ /Count -11
+ /A 1243 0 R
+>> endobj
+1246 0 obj
+<<
+ /Title (\376\377\0\61\0\60\0\56\0\64\0\56\0\61\0\40\0\120\0\165\0\162\0\160\0\157\0\163\0\145)
+ /Parent 1244 0 R
+ /Next 1248 0 R
+ /A 1245 0 R
+>> endobj
+1248 0 obj
+<<
+ /Title (\376\377\0\61\0\60\0\56\0\64\0\56\0\62\0\40\0\123\0\171\0\156\0\164\0\141\0\170)
+ /Parent 1244 0 R
+ /Prev 1246 0 R
+ /Next 1250 0 R
+ /A 1247 0 R
+>> endobj
+1250 0 obj
+<<
+ /Title (\376\377\0\61\0\60\0\56\0\64\0\56\0\63\0\40\0\114\0\151\0\163\0\164\0\40\0\105\0\166\0\141\0\154\0\165\0\141\0\164\0\151\0\157\0\156)
+ /Parent 1244 0 R
+ /Prev 1248 0 R
+ /Next 1252 0 R
+ /A 1249 0 R
+>> endobj
+1252 0 obj
+<<
+ /Title (\376\377\0\61\0\60\0\56\0\64\0\56\0\64\0\40\0\115\0\141\0\164\0\143\0\150\0\151\0\156\0\147\0\40\0\123\0\164\0\141\0\164\0\145\0\40\0\124\0\157\0\153\0\145\0\156\0\163\0\40\0\141\0\156\0\144\0\40\0\105\0\124\0\141\0\147\0\163)
+ /Parent 1244 0 R
+ /Prev 1250 0 R
+ /Next 1253 0 R
+ /A 1251 0 R
+>> endobj
+1253 0 obj
+<<
+ /Title (\376\377\0\61\0\60\0\56\0\64\0\56\0\65\0\40\0\111\0\146\0\40\0\110\0\145\0\141\0\144\0\145\0\162\0\40\0\141\0\156\0\144\0\40\0\116\0\157\0\156\0\55\0\104\0\101\0\126\0\55\0\101\0\167\0\141\0\162\0\145\0\40\0\120\0\162\0\157\0\170\0\151\0\145\0\163)
+ /Parent 1244 0 R
+ /Prev 1252 0 R
+ /Next 1255 0 R
+ /A 223 0 R
+>> endobj
+1255 0 obj
+<<
+ /Title (\376\377\0\61\0\60\0\56\0\64\0\56\0\66\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\116\0\157\0\55\0\164\0\141\0\147\0\40\0\120\0\162\0\157\0\144\0\165\0\143\0\164\0\151\0\157\0\156)
+ /Parent 1244 0 R
+ /Prev 1253 0 R
+ /Next 1256 0 R
+ /A 1254 0 R
+>> endobj
+1256 0 obj
+<<
+ /Title (\376\377\0\61\0\60\0\56\0\64\0\56\0\67\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\125\0\163\0\151\0\156\0\147\0\40\0\42\0\116\0\157\0\164\0\42\0\40\0\167\0\151\0\164\0\150\0\40\0\116\0\157\0\55\0\164\0\141\0\147\0\40\0\120\0\162\0\157\0\144\0\165\0\143\0\164\0\151\0\157\0\156)
+ /Parent 1244 0 R
+ /Prev 1255 0 R
+ /Next 1257 0 R
+ /A 227 0 R
+>> endobj
+1257 0 obj
+<<
+ /Title (\376\377\0\61\0\60\0\56\0\64\0\56\0\70\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\103\0\141\0\165\0\163\0\151\0\156\0\147\0\40\0\141\0\40\0\103\0\157\0\156\0\144\0\151\0\164\0\151\0\157\0\156\0\40\0\164\0\157\0\40\0\101\0\154\0\167\0\141\0\171\0\163\0\40\0\105\0\166\0\141\0\154\0\165\0\141\0\164\0\145\0\40\0\164\0\157\0\40\0\124\0\162\0\165\0\145)
+ /Parent 1244 0 R
+ /Prev 1256 0 R
+ /Next 1258 0 R
+ /A 229 0 R
+>> endobj
+1258 0 obj
+<<
+ /Title (\376\377\0\61\0\60\0\56\0\64\0\56\0\71\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\124\0\141\0\147\0\147\0\145\0\144\0\40\0\114\0\151\0\163\0\164\0\40\0\111\0\146\0\40\0\110\0\145\0\141\0\144\0\145\0\162\0\40\0\151\0\156\0\40\0\103\0\117\0\120\0\131)
+ /Parent 1244 0 R
+ /Prev 1257 0 R
+ /Next 1259 0 R
+ /A 231 0 R
+>> endobj
+1259 0 obj
+<<
+ /Title (\376\377\0\61\0\60\0\56\0\64\0\56\0\61\0\60\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\115\0\141\0\164\0\143\0\150\0\151\0\156\0\147\0\40\0\114\0\157\0\143\0\153\0\40\0\124\0\157\0\153\0\145\0\156\0\163\0\40\0\167\0\151\0\164\0\150\0\40\0\103\0\157\0\154\0\154\0\145\0\143\0\164\0\151\0\157\0\156\0\40\0\114\0\157\0\143\0\153\0\163)
+ /Parent 1244 0 R
+ /Prev 1258 0 R
+ /Next 1260 0 R
+ /A 233 0 R
+>> endobj
+1260 0 obj
+<<
+ /Title (\376\377\0\61\0\60\0\56\0\64\0\56\0\61\0\61\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\115\0\141\0\164\0\143\0\150\0\151\0\156\0\147\0\40\0\105\0\124\0\141\0\147\0\163\0\40\0\157\0\156\0\40\0\125\0\156\0\155\0\141\0\160\0\160\0\145\0\144\0\40\0\125\0\122\0\114\0\163)
+ /Parent 1244 0 R
+ /Prev 1259 0 R
+ /A 235 0 R
+>> endobj
+1262 0 obj
+<<
+ /Title (\376\377\0\61\0\60\0\56\0\65\0\40\0\114\0\157\0\143\0\153\0\55\0\124\0\157\0\153\0\145\0\156\0\40\0\110\0\145\0\141\0\144\0\145\0\162)
+ /Parent 1236 0 R
+ /Prev 1244 0 R
+ /Next 1264 0 R
+ /A 1261 0 R
+>> endobj
+1264 0 obj
+<<
+ /Title (\376\377\0\61\0\60\0\56\0\66\0\40\0\117\0\166\0\145\0\162\0\167\0\162\0\151\0\164\0\145\0\40\0\110\0\145\0\141\0\144\0\145\0\162)
+ /Parent 1236 0 R
+ /Prev 1262 0 R
+ /Next 1266 0 R
+ /A 1263 0 R
+>> endobj
+1266 0 obj
+<<
+ /Title (\376\377\0\61\0\60\0\56\0\67\0\40\0\124\0\151\0\155\0\145\0\157\0\165\0\164\0\40\0\122\0\145\0\161\0\165\0\145\0\163\0\164\0\40\0\110\0\145\0\141\0\144\0\145\0\162)
+ /Parent 1236 0 R
+ /Prev 1264 0 R
+ /A 1265 0 R
+>> endobj
+1268 0 obj
+<<
+ /Title (\376\377\0\61\0\61\0\40\0\123\0\164\0\141\0\164\0\165\0\163\0\40\0\103\0\157\0\144\0\145\0\40\0\105\0\170\0\164\0\145\0\156\0\163\0\151\0\157\0\156\0\163\0\40\0\164\0\157\0\40\0\110\0\124\0\124\0\120\0\57\0\61\0\56\0\61)
+ /Parent 1089 0 R
+ /First 1270 0 R
+ /Last 1278 0 R
+ /Prev 1236 0 R
+ /Next 1280 0 R
+ /Count -5
+ /A 1267 0 R
+>> endobj
+1270 0 obj
+<<
+ /Title (\376\377\0\61\0\61\0\56\0\61\0\40\0\62\0\60\0\67\0\40\0\115\0\165\0\154\0\164\0\151\0\55\0\123\0\164\0\141\0\164\0\165\0\163)
+ /Parent 1268 0 R
+ /Next 1272 0 R
+ /A 1269 0 R
+>> endobj
+1272 0 obj
+<<
+ /Title (\376\377\0\61\0\61\0\56\0\62\0\40\0\64\0\62\0\62\0\40\0\125\0\156\0\160\0\162\0\157\0\143\0\145\0\163\0\163\0\141\0\142\0\154\0\145\0\40\0\105\0\156\0\164\0\151\0\164\0\171)
+ /Parent 1268 0 R
+ /Prev 1270 0 R
+ /Next 1274 0 R
+ /A 1271 0 R
+>> endobj
+1274 0 obj
+<<
+ /Title (\376\377\0\61\0\61\0\56\0\63\0\40\0\64\0\62\0\63\0\40\0\114\0\157\0\143\0\153\0\145\0\144)
+ /Parent 1268 0 R
+ /Prev 1272 0 R
+ /Next 1276 0 R
+ /A 1273 0 R
+>> endobj
+1276 0 obj
+<<
+ /Title (\376\377\0\61\0\61\0\56\0\64\0\40\0\64\0\62\0\64\0\40\0\106\0\141\0\151\0\154\0\145\0\144\0\40\0\104\0\145\0\160\0\145\0\156\0\144\0\145\0\156\0\143\0\171)
+ /Parent 1268 0 R
+ /Prev 1274 0 R
+ /Next 1278 0 R
+ /A 1275 0 R
+>> endobj
+1278 0 obj
+<<
+ /Title (\376\377\0\61\0\61\0\56\0\65\0\40\0\65\0\60\0\67\0\40\0\111\0\156\0\163\0\165\0\146\0\146\0\151\0\143\0\151\0\145\0\156\0\164\0\40\0\123\0\164\0\157\0\162\0\141\0\147\0\145)
+ /Parent 1268 0 R
+ /Prev 1276 0 R
+ /A 1277 0 R
+>> endobj
+1280 0 obj
+<<
+ /Title (\376\377\0\61\0\62\0\40\0\125\0\163\0\145\0\40\0\157\0\146\0\40\0\110\0\124\0\124\0\120\0\40\0\123\0\164\0\141\0\164\0\165\0\163\0\40\0\103\0\157\0\144\0\145\0\163)
+ /Parent 1089 0 R
+ /First 1281 0 R
+ /Last 1282 0 R
+ /Prev 1268 0 R
+ /Next 1284 0 R
+ /Count -2
+ /A 1279 0 R
+>> endobj
+1281 0 obj
+<<
+ /Title (\376\377\0\61\0\62\0\56\0\61\0\40\0\64\0\61\0\62\0\40\0\120\0\162\0\145\0\143\0\157\0\156\0\144\0\151\0\164\0\151\0\157\0\156\0\40\0\106\0\141\0\151\0\154\0\145\0\144)
+ /Parent 1280 0 R
+ /Next 1282 0 R
+ /A 257 0 R
+>> endobj
+1282 0 obj
+<<
+ /Title (\376\377\0\61\0\62\0\56\0\62\0\40\0\64\0\61\0\64\0\40\0\122\0\145\0\161\0\165\0\145\0\163\0\164\0\55\0\125\0\122\0\111\0\40\0\124\0\157\0\157\0\40\0\114\0\157\0\156\0\147)
+ /Parent 1280 0 R
+ /Prev 1281 0 R
+ /A 259 0 R
+>> endobj
+1284 0 obj
+<<
+ /Title (\376\377\0\61\0\63\0\40\0\115\0\165\0\154\0\164\0\151\0\55\0\123\0\164\0\141\0\164\0\165\0\163\0\40\0\122\0\145\0\163\0\160\0\157\0\156\0\163\0\145)
+ /Parent 1089 0 R
+ /First 1285 0 R
+ /Last 1287 0 R
+ /Prev 1280 0 R
+ /Next 1289 0 R
+ /Count -3
+ /A 1283 0 R
+>> endobj
+1285 0 obj
+<<
+ /Title (\376\377\0\61\0\63\0\56\0\61\0\40\0\122\0\145\0\163\0\160\0\157\0\156\0\163\0\145\0\40\0\110\0\145\0\141\0\144\0\145\0\162\0\163)
+ /Parent 1284 0 R
+ /Next 1286 0 R
+ /A 263 0 R
+>> endobj
+1286 0 obj
+<<
+ /Title (\376\377\0\61\0\63\0\56\0\62\0\40\0\110\0\141\0\156\0\144\0\154\0\151\0\156\0\147\0\40\0\122\0\145\0\144\0\151\0\162\0\145\0\143\0\164\0\145\0\144\0\40\0\103\0\150\0\151\0\154\0\144\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\163)
+ /Parent 1284 0 R
+ /Prev 1285 0 R
+ /Next 1287 0 R
+ /A 265 0 R
+>> endobj
+1287 0 obj
+<<
+ /Title (\376\377\0\61\0\63\0\56\0\63\0\40\0\111\0\156\0\164\0\145\0\162\0\156\0\141\0\154\0\40\0\123\0\164\0\141\0\164\0\165\0\163\0\40\0\103\0\157\0\144\0\145\0\163)
+ /Parent 1284 0 R
+ /Prev 1286 0 R
+ /A 267 0 R
+>> endobj
+1289 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164\0\40\0\104\0\145\0\146\0\151\0\156\0\151\0\164\0\151\0\157\0\156\0\163)
+ /Parent 1089 0 R
+ /First 1291 0 R
+ /Last 1349 0 R
+ /Prev 1284 0 R
+ /Next 1351 0 R
+ /Count -30
+ /A 1288 0 R
+>> endobj
+1291 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\61\0\40\0\141\0\143\0\164\0\151\0\166\0\145\0\154\0\157\0\143\0\153\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164)
+ /Parent 1289 0 R
+ /Next 1293 0 R
+ /A 1290 0 R
+>> endobj
+1293 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\62\0\40\0\141\0\154\0\154\0\160\0\162\0\157\0\160\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164)
+ /Parent 1289 0 R
+ /Prev 1291 0 R
+ /Next 1295 0 R
+ /A 1292 0 R
+>> endobj
+1295 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\63\0\40\0\143\0\157\0\154\0\154\0\145\0\143\0\164\0\151\0\157\0\156\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164)
+ /Parent 1289 0 R
+ /Prev 1293 0 R
+ /Next 1297 0 R
+ /A 1294 0 R
+>> endobj
+1297 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\64\0\40\0\144\0\145\0\160\0\164\0\150\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164)
+ /Parent 1289 0 R
+ /Prev 1295 0 R
+ /Next 1299 0 R
+ /A 1296 0 R
+>> endobj
+1299 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\65\0\40\0\145\0\162\0\162\0\157\0\162\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164)
+ /Parent 1289 0 R
+ /Prev 1297 0 R
+ /Next 1301 0 R
+ /A 1298 0 R
+>> endobj
+1301 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\66\0\40\0\145\0\170\0\143\0\154\0\165\0\163\0\151\0\166\0\145\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164)
+ /Parent 1289 0 R
+ /Prev 1299 0 R
+ /Next 1303 0 R
+ /A 1300 0 R
+>> endobj
+1303 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\67\0\40\0\150\0\162\0\145\0\146\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164)
+ /Parent 1289 0 R
+ /Prev 1301 0 R
+ /Next 1305 0 R
+ /A 1302 0 R
+>> endobj
+1305 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\70\0\40\0\151\0\156\0\143\0\154\0\165\0\144\0\145\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164)
+ /Parent 1289 0 R
+ /Prev 1303 0 R
+ /Next 1307 0 R
+ /A 1304 0 R
+>> endobj
+1307 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\71\0\40\0\154\0\157\0\143\0\141\0\164\0\151\0\157\0\156\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164)
+ /Parent 1289 0 R
+ /Prev 1305 0 R
+ /Next 1309 0 R
+ /A 1306 0 R
+>> endobj
+1309 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\61\0\60\0\40\0\154\0\157\0\143\0\153\0\145\0\156\0\164\0\162\0\171\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164)
+ /Parent 1289 0 R
+ /Prev 1307 0 R
+ /Next 1311 0 R
+ /A 1308 0 R
+>> endobj
+1311 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\61\0\61\0\40\0\154\0\157\0\143\0\153\0\151\0\156\0\146\0\157\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164)
+ /Parent 1289 0 R
+ /Prev 1309 0 R
+ /Next 1313 0 R
+ /A 1310 0 R
+>> endobj
+1313 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\61\0\62\0\40\0\154\0\157\0\143\0\153\0\162\0\157\0\157\0\164\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164)
+ /Parent 1289 0 R
+ /Prev 1311 0 R
+ /Next 1315 0 R
+ /A 1312 0 R
+>> endobj
+1315 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\61\0\63\0\40\0\154\0\157\0\143\0\153\0\163\0\143\0\157\0\160\0\145\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164)
+ /Parent 1289 0 R
+ /Prev 1313 0 R
+ /Next 1317 0 R
+ /A 1314 0 R
+>> endobj
+1317 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\61\0\64\0\40\0\154\0\157\0\143\0\153\0\164\0\157\0\153\0\145\0\156\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164)
+ /Parent 1289 0 R
+ /Prev 1315 0 R
+ /Next 1319 0 R
+ /A 1316 0 R
+>> endobj
+1319 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\61\0\65\0\40\0\154\0\157\0\143\0\153\0\164\0\171\0\160\0\145\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164)
+ /Parent 1289 0 R
+ /Prev 1317 0 R
+ /Next 1321 0 R
+ /A 1318 0 R
+>> endobj
+1321 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\61\0\66\0\40\0\155\0\165\0\154\0\164\0\151\0\163\0\164\0\141\0\164\0\165\0\163\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164)
+ /Parent 1289 0 R
+ /Prev 1319 0 R
+ /Next 1323 0 R
+ /A 1320 0 R
+>> endobj
+1323 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\61\0\67\0\40\0\157\0\167\0\156\0\145\0\162\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164)
+ /Parent 1289 0 R
+ /Prev 1321 0 R
+ /Next 1325 0 R
+ /A 1322 0 R
+>> endobj
+1325 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\61\0\70\0\40\0\160\0\162\0\157\0\160\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164)
+ /Parent 1289 0 R
+ /Prev 1323 0 R
+ /Next 1327 0 R
+ /A 1324 0 R
+>> endobj
+1327 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\61\0\71\0\40\0\160\0\162\0\157\0\160\0\145\0\162\0\164\0\171\0\165\0\160\0\144\0\141\0\164\0\145\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164)
+ /Parent 1289 0 R
+ /Prev 1325 0 R
+ /Next 1329 0 R
+ /A 1326 0 R
+>> endobj
+1329 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\62\0\60\0\40\0\160\0\162\0\157\0\160\0\146\0\151\0\156\0\144\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164)
+ /Parent 1289 0 R
+ /Prev 1327 0 R
+ /Next 1331 0 R
+ /A 1328 0 R
+>> endobj
+1331 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\62\0\61\0\40\0\160\0\162\0\157\0\160\0\156\0\141\0\155\0\145\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164)
+ /Parent 1289 0 R
+ /Prev 1329 0 R
+ /Next 1333 0 R
+ /A 1330 0 R
+>> endobj
+1333 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\62\0\62\0\40\0\160\0\162\0\157\0\160\0\163\0\164\0\141\0\164\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164)
+ /Parent 1289 0 R
+ /Prev 1331 0 R
+ /Next 1335 0 R
+ /A 1332 0 R
+>> endobj
+1335 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\62\0\63\0\40\0\162\0\145\0\155\0\157\0\166\0\145\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164)
+ /Parent 1289 0 R
+ /Prev 1333 0 R
+ /Next 1337 0 R
+ /A 1334 0 R
+>> endobj
+1337 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\62\0\64\0\40\0\162\0\145\0\163\0\160\0\157\0\156\0\163\0\145\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164)
+ /Parent 1289 0 R
+ /Prev 1335 0 R
+ /Next 1339 0 R
+ /A 1336 0 R
+>> endobj
+1339 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\62\0\65\0\40\0\162\0\145\0\163\0\160\0\157\0\156\0\163\0\145\0\144\0\145\0\163\0\143\0\162\0\151\0\160\0\164\0\151\0\157\0\156\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164)
+ /Parent 1289 0 R
+ /Prev 1337 0 R
+ /Next 1341 0 R
+ /A 1338 0 R
+>> endobj
+1341 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\62\0\66\0\40\0\163\0\145\0\164\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164)
+ /Parent 1289 0 R
+ /Prev 1339 0 R
+ /Next 1343 0 R
+ /A 1340 0 R
+>> endobj
+1343 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\62\0\67\0\40\0\163\0\150\0\141\0\162\0\145\0\144\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164)
+ /Parent 1289 0 R
+ /Prev 1341 0 R
+ /Next 1345 0 R
+ /A 1342 0 R
+>> endobj
+1345 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\62\0\70\0\40\0\163\0\164\0\141\0\164\0\165\0\163\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164)
+ /Parent 1289 0 R
+ /Prev 1343 0 R
+ /Next 1347 0 R
+ /A 1344 0 R
+>> endobj
+1347 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\62\0\71\0\40\0\164\0\151\0\155\0\145\0\157\0\165\0\164\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164)
+ /Parent 1289 0 R
+ /Prev 1345 0 R
+ /Next 1349 0 R
+ /A 1346 0 R
+>> endobj
+1349 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\63\0\60\0\40\0\167\0\162\0\151\0\164\0\145\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164)
+ /Parent 1289 0 R
+ /Prev 1347 0 R
+ /A 1348 0 R
+>> endobj
+1351 0 obj
+<<
+ /Title (\376\377\0\61\0\65\0\40\0\104\0\101\0\126\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163)
+ /Parent 1089 0 R
+ /First 1353 0 R
+ /Last 1372 0 R
+ /Prev 1289 0 R
+ /Next 1375 0 R
+ /Count -12
+ /A 1350 0 R
+>> endobj
+1353 0 obj
+<<
+ /Title (\376\377\0\61\0\65\0\56\0\61\0\40\0\143\0\162\0\145\0\141\0\164\0\151\0\157\0\156\0\144\0\141\0\164\0\145\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\171)
+ /Parent 1351 0 R
+ /Next 1355 0 R
+ /A 1352 0 R
+>> endobj
+1355 0 obj
+<<
+ /Title (\376\377\0\61\0\65\0\56\0\62\0\40\0\144\0\151\0\163\0\160\0\154\0\141\0\171\0\156\0\141\0\155\0\145\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\171)
+ /Parent 1351 0 R
+ /Prev 1353 0 R
+ /Next 1357 0 R
+ /A 1354 0 R
+>> endobj
+1357 0 obj
+<<
+ /Title (\376\377\0\61\0\65\0\56\0\63\0\40\0\147\0\145\0\164\0\143\0\157\0\156\0\164\0\145\0\156\0\164\0\154\0\141\0\156\0\147\0\165\0\141\0\147\0\145\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\171)
+ /Parent 1351 0 R
+ /Prev 1355 0 R
+ /Next 1359 0 R
+ /A 1356 0 R
+>> endobj
+1359 0 obj
+<<
+ /Title (\376\377\0\61\0\65\0\56\0\64\0\40\0\147\0\145\0\164\0\143\0\157\0\156\0\164\0\145\0\156\0\164\0\154\0\145\0\156\0\147\0\164\0\150\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\171)
+ /Parent 1351 0 R
+ /Prev 1357 0 R
+ /Next 1361 0 R
+ /A 1358 0 R
+>> endobj
+1361 0 obj
+<<
+ /Title (\376\377\0\61\0\65\0\56\0\65\0\40\0\147\0\145\0\164\0\143\0\157\0\156\0\164\0\145\0\156\0\164\0\164\0\171\0\160\0\145\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\171)
+ /Parent 1351 0 R
+ /Prev 1359 0 R
+ /Next 1363 0 R
+ /A 1360 0 R
+>> endobj
+1363 0 obj
+<<
+ /Title (\376\377\0\61\0\65\0\56\0\66\0\40\0\147\0\145\0\164\0\145\0\164\0\141\0\147\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\171)
+ /Parent 1351 0 R
+ /Prev 1361 0 R
+ /Next 1365 0 R
+ /A 1362 0 R
+>> endobj
+1365 0 obj
+<<
+ /Title (\376\377\0\61\0\65\0\56\0\67\0\40\0\147\0\145\0\164\0\154\0\141\0\163\0\164\0\155\0\157\0\144\0\151\0\146\0\151\0\145\0\144\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\171)
+ /Parent 1351 0 R
+ /Prev 1363 0 R
+ /Next 1367 0 R
+ /A 1364 0 R
+>> endobj
+1367 0 obj
+<<
+ /Title (\376\377\0\61\0\65\0\56\0\70\0\40\0\154\0\157\0\143\0\153\0\144\0\151\0\163\0\143\0\157\0\166\0\145\0\162\0\171\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\171)
+ /Parent 1351 0 R
+ /First 1368 0 R
+ /Last 1368 0 R
+ /Prev 1365 0 R
+ /Next 1370 0 R
+ /Count -1
+ /A 1366 0 R
+>> endobj
+1368 0 obj
+<<
+ /Title (\376\377\0\61\0\65\0\56\0\70\0\56\0\61\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\122\0\145\0\164\0\162\0\151\0\145\0\166\0\151\0\156\0\147\0\40\0\104\0\101\0\126\0\72\0\154\0\157\0\143\0\153\0\144\0\151\0\163\0\143\0\157\0\166\0\145\0\162\0\171)
+ /Parent 1367 0 R
+ /A 352 0 R
+>> endobj
+1370 0 obj
+<<
+ /Title (\376\377\0\61\0\65\0\56\0\71\0\40\0\162\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\164\0\171\0\160\0\145\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\171)
+ /Parent 1351 0 R
+ /Prev 1367 0 R
+ /Next 1372 0 R
+ /A 1369 0 R
+>> endobj
+1372 0 obj
+<<
+ /Title (\376\377\0\61\0\65\0\56\0\61\0\60\0\40\0\163\0\165\0\160\0\160\0\157\0\162\0\164\0\145\0\144\0\154\0\157\0\143\0\153\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\171)
+ /Parent 1351 0 R
+ /First 1373 0 R
+ /Last 1373 0 R
+ /Prev 1370 0 R
+ /Count -1
+ /A 1371 0 R
+>> endobj
+1373 0 obj
+<<
+ /Title (\376\377\0\61\0\65\0\56\0\61\0\60\0\56\0\61\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\122\0\145\0\164\0\162\0\151\0\145\0\166\0\151\0\156\0\147\0\40\0\104\0\101\0\126\0\72\0\163\0\165\0\160\0\160\0\157\0\162\0\164\0\145\0\144\0\154\0\157\0\143\0\153)
+ /Parent 1372 0 R
+ /A 358 0 R
+>> endobj
+1375 0 obj
+<<
+ /Title (\376\377\0\61\0\66\0\40\0\120\0\162\0\145\0\143\0\157\0\156\0\144\0\151\0\164\0\151\0\157\0\156\0\57\0\120\0\157\0\163\0\164\0\143\0\157\0\156\0\144\0\151\0\164\0\151\0\157\0\156\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164\0\163)
+ /Parent 1089 0 R
+ /Prev 1351 0 R
+ /Next 1377 0 R
+ /A 1374 0 R
+>> endobj
+1377 0 obj
+<<
+ /Title (\376\377\0\61\0\67\0\40\0\130\0\115\0\114\0\40\0\105\0\170\0\164\0\145\0\156\0\163\0\151\0\142\0\151\0\154\0\151\0\164\0\171\0\40\0\151\0\156\0\40\0\104\0\101\0\126)
+ /Parent 1089 0 R
+ /Prev 1375 0 R
+ /Next 1379 0 R
+ /A 1376 0 R
+>> endobj
+1379 0 obj
+<<
+ /Title (\376\377\0\61\0\70\0\40\0\104\0\101\0\126\0\40\0\103\0\157\0\155\0\160\0\154\0\151\0\141\0\156\0\143\0\145\0\40\0\103\0\154\0\141\0\163\0\163\0\145\0\163)
+ /Parent 1089 0 R
+ /First 1380 0 R
+ /Last 1383 0 R
+ /Prev 1377 0 R
+ /Next 1385 0 R
+ /Count -3
+ /A 1378 0 R
+>> endobj
+1380 0 obj
+<<
+ /Title (\376\377\0\61\0\70\0\56\0\61\0\40\0\103\0\154\0\141\0\163\0\163\0\40\0\61)
+ /Parent 1379 0 R
+ /Next 1381 0 R
+ /A 369 0 R
+>> endobj
+1381 0 obj
+<<
+ /Title (\376\377\0\61\0\70\0\56\0\62\0\40\0\103\0\154\0\141\0\163\0\163\0\40\0\62)
+ /Parent 1379 0 R
+ /Prev 1380 0 R
+ /Next 1383 0 R
+ /A 371 0 R
+>> endobj
+1383 0 obj
+<<
+ /Title (\376\377\0\61\0\70\0\56\0\63\0\40\0\103\0\154\0\141\0\163\0\163\0\40\0\63)
+ /Parent 1379 0 R
+ /Prev 1381 0 R
+ /A 1382 0 R
+>> endobj
+1385 0 obj
+<<
+ /Title (\376\377\0\61\0\71\0\40\0\111\0\156\0\164\0\145\0\162\0\156\0\141\0\164\0\151\0\157\0\156\0\141\0\154\0\151\0\172\0\141\0\164\0\151\0\157\0\156\0\40\0\103\0\157\0\156\0\163\0\151\0\144\0\145\0\162\0\141\0\164\0\151\0\157\0\156\0\163)
+ /Parent 1089 0 R
+ /Prev 1379 0 R
+ /Next 1387 0 R
+ /A 1384 0 R
+>> endobj
+1387 0 obj
+<<
+ /Title (\376\377\0\62\0\60\0\40\0\123\0\145\0\143\0\165\0\162\0\151\0\164\0\171\0\40\0\103\0\157\0\156\0\163\0\151\0\144\0\145\0\162\0\141\0\164\0\151\0\157\0\156\0\163)
+ /Parent 1089 0 R
+ /First 1388 0 R
+ /Last 1396 0 R
+ /Prev 1385 0 R
+ /Next 1397 0 R
+ /Count -8
+ /A 1386 0 R
+>> endobj
+1388 0 obj
+<<
+ /Title (\376\377\0\62\0\60\0\56\0\61\0\40\0\101\0\165\0\164\0\150\0\145\0\156\0\164\0\151\0\143\0\141\0\164\0\151\0\157\0\156\0\40\0\157\0\146\0\40\0\103\0\154\0\151\0\145\0\156\0\164\0\163)
+ /Parent 1387 0 R
+ /Next 1389 0 R
+ /A 379 0 R
+>> endobj
+1389 0 obj
+<<
+ /Title (\376\377\0\62\0\60\0\56\0\62\0\40\0\104\0\145\0\156\0\151\0\141\0\154\0\40\0\157\0\146\0\40\0\123\0\145\0\162\0\166\0\151\0\143\0\145)
+ /Parent 1387 0 R
+ /Prev 1388 0 R
+ /Next 1390 0 R
+ /A 381 0 R
+>> endobj
+1390 0 obj
+<<
+ /Title (\376\377\0\62\0\60\0\56\0\63\0\40\0\123\0\145\0\143\0\165\0\162\0\151\0\164\0\171\0\40\0\164\0\150\0\162\0\157\0\165\0\147\0\150\0\40\0\117\0\142\0\163\0\143\0\165\0\162\0\151\0\164\0\171)
+ /Parent 1387 0 R
+ /Prev 1389 0 R
+ /Next 1391 0 R
+ /A 383 0 R
+>> endobj
+1391 0 obj
+<<
+ /Title (\376\377\0\62\0\60\0\56\0\64\0\40\0\120\0\162\0\151\0\166\0\141\0\143\0\171\0\40\0\111\0\163\0\163\0\165\0\145\0\163\0\40\0\103\0\157\0\156\0\156\0\145\0\143\0\164\0\145\0\144\0\40\0\164\0\157\0\40\0\114\0\157\0\143\0\153\0\163)
+ /Parent 1387 0 R
+ /Prev 1390 0 R
+ /Next 1392 0 R
+ /A 385 0 R
+>> endobj
+1392 0 obj
+<<
+ /Title (\376\377\0\62\0\60\0\56\0\65\0\40\0\120\0\162\0\151\0\166\0\141\0\143\0\171\0\40\0\111\0\163\0\163\0\165\0\145\0\163\0\40\0\103\0\157\0\156\0\156\0\145\0\143\0\164\0\145\0\144\0\40\0\164\0\157\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163)
+ /Parent 1387 0 R
+ /Prev 1391 0 R
+ /Next 1393 0 R
+ /A 387 0 R
+>> endobj
+1393 0 obj
+<<
+ /Title (\376\377\0\62\0\60\0\56\0\66\0\40\0\111\0\155\0\160\0\154\0\151\0\143\0\141\0\164\0\151\0\157\0\156\0\163\0\40\0\157\0\146\0\40\0\130\0\115\0\114\0\40\0\105\0\156\0\164\0\151\0\164\0\151\0\145\0\163)
+ /Parent 1387 0 R
+ /Prev 1392 0 R
+ /Next 1395 0 R
+ /A 389 0 R
+>> endobj
+1395 0 obj
+<<
+ /Title (\376\377\0\62\0\60\0\56\0\67\0\40\0\122\0\151\0\163\0\153\0\163\0\40\0\103\0\157\0\156\0\156\0\145\0\143\0\164\0\145\0\144\0\40\0\167\0\151\0\164\0\150\0\40\0\114\0\157\0\143\0\153\0\40\0\124\0\157\0\153\0\145\0\156\0\163)
+ /Parent 1387 0 R
+ /Prev 1393 0 R
+ /Next 1396 0 R
+ /A 1394 0 R
+>> endobj
+1396 0 obj
+<<
+ /Title (\376\377\0\62\0\60\0\56\0\70\0\40\0\110\0\157\0\163\0\164\0\151\0\156\0\147\0\40\0\115\0\141\0\154\0\151\0\143\0\151\0\157\0\165\0\163\0\40\0\103\0\157\0\156\0\164\0\145\0\156\0\164)
+ /Parent 1387 0 R
+ /Prev 1395 0 R
+ /A 393 0 R
+>> endobj
+1397 0 obj
+<<
+ /Title (\376\377\0\62\0\61\0\40\0\111\0\101\0\116\0\101\0\40\0\103\0\157\0\156\0\163\0\151\0\144\0\145\0\162\0\141\0\164\0\151\0\157\0\156\0\163)
+ /Parent 1089 0 R
+ /First 1398 0 R
+ /Last 1408 0 R
+ /Prev 1387 0 R
+ /Next 1409 0 R
+ /Count -11
+ /A 395 0 R
+>> endobj
+1398 0 obj
+<<
+ /Title (\376\377\0\62\0\61\0\56\0\61\0\40\0\116\0\145\0\167\0\40\0\125\0\122\0\111\0\40\0\123\0\143\0\150\0\145\0\155\0\145\0\163)
+ /Parent 1397 0 R
+ /Next 1399 0 R
+ /A 397 0 R
+>> endobj
+1399 0 obj
+<<
+ /Title (\376\377\0\62\0\61\0\56\0\62\0\40\0\130\0\115\0\114\0\40\0\116\0\141\0\155\0\145\0\163\0\160\0\141\0\143\0\145\0\163)
+ /Parent 1397 0 R
+ /Prev 1398 0 R
+ /Next 1400 0 R
+ /A 399 0 R
+>> endobj
+1400 0 obj
+<<
+ /Title (\376\377\0\62\0\61\0\56\0\63\0\40\0\115\0\145\0\163\0\163\0\141\0\147\0\145\0\40\0\110\0\145\0\141\0\144\0\145\0\162\0\40\0\106\0\151\0\145\0\154\0\144\0\163)
+ /Parent 1397 0 R
+ /First 1401 0 R
+ /Last 1407 0 R
+ /Prev 1399 0 R
+ /Next 1408 0 R
+ /Count -7
+ /A 401 0 R
+>> endobj
+1401 0 obj
+<<
+ /Title (\376\377\0\62\0\61\0\56\0\63\0\56\0\61\0\40\0\104\0\101\0\126)
+ /Parent 1400 0 R
+ /Next 1402 0 R
+ /A 403 0 R
+>> endobj
+1402 0 obj
+<<
+ /Title (\376\377\0\62\0\61\0\56\0\63\0\56\0\62\0\40\0\104\0\145\0\160\0\164\0\150)
+ /Parent 1400 0 R
+ /Prev 1401 0 R
+ /Next 1403 0 R
+ /A 405 0 R
+>> endobj
+1403 0 obj
+<<
+ /Title (\376\377\0\62\0\61\0\56\0\63\0\56\0\63\0\40\0\104\0\145\0\163\0\164\0\151\0\156\0\141\0\164\0\151\0\157\0\156)
+ /Parent 1400 0 R
+ /Prev 1402 0 R
+ /Next 1404 0 R
+ /A 407 0 R
+>> endobj
+1404 0 obj
+<<
+ /Title (\376\377\0\62\0\61\0\56\0\63\0\56\0\64\0\40\0\111\0\146)
+ /Parent 1400 0 R
+ /Prev 1403 0 R
+ /Next 1405 0 R
+ /A 409 0 R
+>> endobj
+1405 0 obj
+<<
+ /Title (\376\377\0\62\0\61\0\56\0\63\0\56\0\65\0\40\0\114\0\157\0\143\0\153\0\55\0\124\0\157\0\153\0\145\0\156)
+ /Parent 1400 0 R
+ /Prev 1404 0 R
+ /Next 1406 0 R
+ /A 411 0 R
+>> endobj
+1406 0 obj
+<<
+ /Title (\376\377\0\62\0\61\0\56\0\63\0\56\0\66\0\40\0\117\0\166\0\145\0\162\0\167\0\162\0\151\0\164\0\145)
+ /Parent 1400 0 R
+ /Prev 1405 0 R
+ /Next 1407 0 R
+ /A 413 0 R
+>> endobj
+1407 0 obj
+<<
+ /Title (\376\377\0\62\0\61\0\56\0\63\0\56\0\67\0\40\0\124\0\151\0\155\0\145\0\157\0\165\0\164)
+ /Parent 1400 0 R
+ /Prev 1406 0 R
+ /A 415 0 R
+>> endobj
+1408 0 obj
+<<
+ /Title (\376\377\0\62\0\61\0\56\0\64\0\40\0\110\0\124\0\124\0\120\0\40\0\123\0\164\0\141\0\164\0\165\0\163\0\40\0\103\0\157\0\144\0\145\0\163)
+ /Parent 1397 0 R
+ /Prev 1400 0 R
+ /A 417 0 R
+>> endobj
+1409 0 obj
+<<
+ /Title (\376\377\0\62\0\62\0\40\0\101\0\143\0\153\0\156\0\157\0\167\0\154\0\145\0\144\0\147\0\145\0\155\0\145\0\156\0\164\0\163)
+ /Parent 1089 0 R
+ /Prev 1397 0 R
+ /Next 1410 0 R
+ /A 419 0 R
+>> endobj
+1410 0 obj
+<<
+ /Title (\376\377\0\62\0\63\0\40\0\103\0\157\0\156\0\164\0\162\0\151\0\142\0\165\0\164\0\157\0\162\0\163\0\40\0\164\0\157\0\40\0\124\0\150\0\151\0\163\0\40\0\123\0\160\0\145\0\143\0\151\0\146\0\151\0\143\0\141\0\164\0\151\0\157\0\156)
+ /Parent 1089 0 R
+ /Prev 1409 0 R
+ /Next 1411 0 R
+ /A 421 0 R
+>> endobj
+1411 0 obj
+<<
+ /Title (\376\377\0\62\0\64\0\40\0\101\0\165\0\164\0\150\0\157\0\162\0\163\0\40\0\157\0\146\0\40\0\122\0\106\0\103\0\40\0\62\0\65\0\61\0\70)
+ /Parent 1089 0 R
+ /Prev 1410 0 R
+ /Next 1412 0 R
+ /A 423 0 R
+>> endobj
+1412 0 obj
+<<
+ /Title (\376\377\0\62\0\65\0\40\0\122\0\145\0\146\0\145\0\162\0\145\0\156\0\143\0\145\0\163)
+ /Parent 1089 0 R
+ /First 1413 0 R
+ /Last 1414 0 R
+ /Prev 1411 0 R
+ /Next 1415 0 R
+ /Count -2
+ /A 425 0 R
+>> endobj
+1413 0 obj
+<<
+ /Title (\376\377\0\62\0\65\0\56\0\61\0\40\0\116\0\157\0\162\0\155\0\141\0\164\0\151\0\166\0\145\0\40\0\122\0\145\0\146\0\145\0\162\0\145\0\156\0\143\0\145\0\163)
+ /Parent 1412 0 R
+ /Next 1414 0 R
+ /A 427 0 R
+>> endobj
+1414 0 obj
+<<
+ /Title (\376\377\0\62\0\65\0\56\0\62\0\40\0\111\0\156\0\146\0\157\0\162\0\155\0\141\0\164\0\151\0\166\0\145\0\40\0\122\0\145\0\146\0\145\0\162\0\145\0\156\0\143\0\145\0\163)
+ /Parent 1412 0 R
+ /Prev 1413 0 R
+ /A 429 0 R
+>> endobj
+1415 0 obj
+<<
+ /Title (\376\377\0\101\0\165\0\164\0\150\0\157\0\162\0\47\0\163\0\40\0\101\0\144\0\144\0\162\0\145\0\163\0\163)
+ /Parent 1089 0 R
+ /Prev 1412 0 R
+ /Next 1417 0 R
+ /A 431 0 R
+>> endobj
+1417 0 obj
+<<
+ /Title (\376\377\0\101\0\40\0\116\0\157\0\164\0\145\0\163\0\40\0\157\0\156\0\40\0\120\0\162\0\157\0\143\0\145\0\163\0\163\0\151\0\156\0\147\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164\0\163)
+ /Parent 1089 0 R
+ /First 1418 0 R
+ /Last 1421 0 R
+ /Prev 1415 0 R
+ /Next 1422 0 R
+ /Count -4
+ /A 1416 0 R
+>> endobj
+1418 0 obj
+<<
+ /Title (\376\377\0\101\0\56\0\61\0\40\0\116\0\157\0\164\0\145\0\163\0\40\0\157\0\156\0\40\0\105\0\155\0\160\0\164\0\171\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164\0\163)
+ /Parent 1417 0 R
+ /Next 1419 0 R
+ /A 435 0 R
+>> endobj
+1419 0 obj
+<<
+ /Title (\376\377\0\101\0\56\0\62\0\40\0\116\0\157\0\164\0\145\0\163\0\40\0\157\0\156\0\40\0\111\0\154\0\154\0\145\0\147\0\141\0\154\0\40\0\130\0\115\0\114\0\40\0\120\0\162\0\157\0\143\0\145\0\163\0\163\0\151\0\156\0\147)
+ /Parent 1417 0 R
+ /Prev 1418 0 R
+ /Next 1420 0 R
+ /A 437 0 R
+>> endobj
+1420 0 obj
+<<
+ /Title (\376\377\0\101\0\56\0\63\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\130\0\115\0\114\0\40\0\123\0\171\0\156\0\164\0\141\0\170\0\40\0\105\0\162\0\162\0\157\0\162)
+ /Parent 1417 0 R
+ /Prev 1419 0 R
+ /Next 1421 0 R
+ /A 439 0 R
+>> endobj
+1421 0 obj
+<<
+ /Title (\376\377\0\101\0\56\0\64\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\125\0\156\0\145\0\170\0\160\0\145\0\143\0\164\0\145\0\144\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164)
+ /Parent 1417 0 R
+ /Prev 1420 0 R
+ /A 441 0 R
+>> endobj
+1422 0 obj
+<<
+ /Title (\376\377\0\102\0\40\0\116\0\157\0\164\0\145\0\163\0\40\0\157\0\156\0\40\0\110\0\124\0\124\0\120\0\40\0\103\0\154\0\151\0\145\0\156\0\164\0\40\0\103\0\157\0\155\0\160\0\141\0\164\0\151\0\142\0\151\0\154\0\151\0\164\0\171)
+ /Parent 1089 0 R
+ /Prev 1417 0 R
+ /Next 1424 0 R
+ /A 443 0 R
+>> endobj
+1424 0 obj
+<<
+ /Title (\376\377\0\103\0\40\0\124\0\150\0\145\0\40\0\47\0\157\0\160\0\141\0\161\0\165\0\145\0\154\0\157\0\143\0\153\0\164\0\157\0\153\0\145\0\156\0\47\0\40\0\123\0\143\0\150\0\145\0\155\0\145\0\40\0\141\0\156\0\144\0\40\0\125\0\122\0\111\0\163)
+ /Parent 1089 0 R
+ /Prev 1422 0 R
+ /Next 1426 0 R
+ /A 1423 0 R
+>> endobj
+1426 0 obj
+<<
+ /Title (\376\377\0\104\0\40\0\114\0\157\0\143\0\153\0\55\0\156\0\165\0\154\0\154\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\163)
+ /Parent 1089 0 R
+ /First 1427 0 R
+ /Last 1427 0 R
+ /Prev 1424 0 R
+ /Next 1428 0 R
+ /Count -1
+ /A 1425 0 R
+>> endobj
+1427 0 obj
+<<
+ /Title (\376\377\0\104\0\56\0\61\0\40\0\107\0\165\0\151\0\144\0\141\0\156\0\143\0\145\0\40\0\146\0\157\0\162\0\40\0\103\0\154\0\151\0\145\0\156\0\164\0\163\0\40\0\125\0\163\0\151\0\156\0\147\0\40\0\114\0\117\0\103\0\113\0\40\0\164\0\157\0\40\0\103\0\162\0\145\0\141\0\164\0\145\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\163)
+ /Parent 1426 0 R
+ /A 452 0 R
+>> endobj
+1428 0 obj
+<<
+ /Title (\376\377\0\105\0\40\0\107\0\165\0\151\0\144\0\141\0\156\0\143\0\145\0\40\0\146\0\157\0\162\0\40\0\103\0\154\0\151\0\145\0\156\0\164\0\163\0\40\0\104\0\145\0\163\0\151\0\162\0\151\0\156\0\147\0\40\0\164\0\157\0\40\0\101\0\165\0\164\0\150\0\145\0\156\0\164\0\151\0\143\0\141\0\164\0\145)
+ /Parent 1089 0 R
+ /Prev 1426 0 R
+ /Next 1429 0 R
+ /A 454 0 R
+>> endobj
+1429 0 obj
+<<
+ /Title (\376\377\0\106\0\40\0\123\0\165\0\155\0\155\0\141\0\162\0\171\0\40\0\157\0\146\0\40\0\103\0\150\0\141\0\156\0\147\0\145\0\163\0\40\0\146\0\162\0\157\0\155\0\40\0\122\0\106\0\103\0\40\0\62\0\65\0\61\0\70)
+ /Parent 1089 0 R
+ /First 1430 0 R
+ /Last 1432 0 R
+ /Prev 1428 0 R
+ /Next 1433 0 R
+ /Count -3
+ /A 456 0 R
+>> endobj
+1430 0 obj
+<<
+ /Title (\376\377\0\106\0\56\0\61\0\40\0\103\0\150\0\141\0\156\0\147\0\145\0\163\0\40\0\146\0\157\0\162\0\40\0\102\0\157\0\164\0\150\0\40\0\103\0\154\0\151\0\145\0\156\0\164\0\40\0\141\0\156\0\144\0\40\0\123\0\145\0\162\0\166\0\145\0\162\0\40\0\111\0\155\0\160\0\154\0\145\0\155\0\145\0\156\0\164\0\141\0\164\0\151\0\157\0\156\0\163)
+ /Parent 1429 0 R
+ /Next 1431 0 R
+ /A 458 0 R
+>> endobj
+1431 0 obj
+<<
+ /Title (\376\377\0\106\0\56\0\62\0\40\0\103\0\150\0\141\0\156\0\147\0\145\0\163\0\40\0\146\0\157\0\162\0\40\0\123\0\145\0\162\0\166\0\145\0\162\0\40\0\111\0\155\0\160\0\154\0\145\0\155\0\145\0\156\0\164\0\141\0\164\0\151\0\157\0\156\0\163)
+ /Parent 1429 0 R
+ /Prev 1430 0 R
+ /Next 1432 0 R
+ /A 460 0 R
+>> endobj
+1432 0 obj
+<<
+ /Title (\376\377\0\106\0\56\0\63\0\40\0\117\0\164\0\150\0\145\0\162\0\40\0\103\0\150\0\141\0\156\0\147\0\145\0\163)
+ /Parent 1429 0 R
+ /Prev 1431 0 R
+ /A 462 0 R
+>> endobj
+1433 0 obj
+<<
+ /Title (\376\377\0\111\0\156\0\164\0\145\0\154\0\154\0\145\0\143\0\164\0\165\0\141\0\154\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\171\0\40\0\141\0\156\0\144\0\40\0\103\0\157\0\160\0\171\0\162\0\151\0\147\0\150\0\164\0\40\0\123\0\164\0\141\0\164\0\145\0\155\0\145\0\156\0\164\0\163)
+ /Parent 1089 0 R
+ /Prev 1429 0 R
+ /Next 1434 0 R
+ /A 464 0 R
+>> endobj
+1434 0 obj
+<<
+ /Title (\376\377\0\111\0\156\0\144\0\145\0\170)
+ /Parent 1089 0 R
+ /Prev 1433 0 R
+ /A 466 0 R
+>> endobj
+1435 0 obj
+<< /Type /Font
+/Subtype /Type1
+/Name /F5
+/BaseFont /Times-Roman
+/Encoding /WinAnsiEncoding >>
+endobj
+1436 0 obj
+<< /Type /Font
+/Subtype /Type1
+/Name /F6
+/BaseFont /Times-Italic
+/Encoding /WinAnsiEncoding >>
+endobj
+1437 0 obj
+<< /Type /Font
+/Subtype /Type1
+/Name /F9
+/BaseFont /Courier
+/Encoding /WinAnsiEncoding >>
+endobj
+1438 0 obj
+<< /Type /Font
+/Subtype /Type1
+/Name /F7
+/BaseFont /Times-Bold
+/Encoding /WinAnsiEncoding >>
+endobj
+1 0 obj
+<< /Type /Pages
+/Count 104
+/Kids [6 0 R 10 0 R 87 0 R 192 0 R 281 0 R 364 0 R 445 0 R 468 0 R 495 0 R 503 0 R 510 0 R 515 0 R 517 0 R 521 0 R 523 0 R 528 0 R 530 0 R 537 0 R 543 0 R 551 0 R 553 0 R 557 0 R 561 0 R 568 0 R 572 0 R 576 0 R 587 0 R 594 0 R 600 0 R 607 0 R 612 0 R 614 0 R 616 0 R 620 0 R 627 0 R 632 0 R 636 0 R 641 0 R 643 0 R 647 0 R 652 0 R 654 0 R 656 0 R 661 0 R 663 0 R 667 0 R 669 0 R 671 0 R 673 0 R 675 0 R 679 0 R 681 0 R 686 0 R 693 0 R 701 0 R 705 0 R 709 0 R 715 0 R 720 0 R 722 0 R 736 0 R 752 0 R 762 0 R 779 0 R 789 0 R 808 0 R 823 0 R 831 0 R 840 0 R 850 0 R 865 0 R 873 0 R 877 0 R 883 0 R 885 0 R 893 0 R 897 0 R 902 0 R 907 0 R 920 0 R 927 0 R 935 0 R 939 0 R 948 0 R 958 0 R 966 0 R 968 0 R 970 0 R 972 0 R 1003 0 R 1008 0 R 1012 0 R 1014 0 R 1018 0 R 1020 0 R 1026 0 R 1031 0 R 1036 0 R 1054 0 R 1073 0 R 1075 0 R 1081 0 R 1084 0 R 1087 0 R ] >>
+endobj
+2 0 obj
+<< /Type /Catalog
+/Pages 1 0 R
+ /Outlines 1089 0 R
+ /PageMode /UseOutlines
+ /Names << /Dests << /Names [ (rfc.status) [ 6 0 R /XYZ 67.0 520.084 null ] (rfc.copyrightnotice) [ 6 0 R /XYZ 67.0 429.95 null ] (rfc.abstract) [ 6 0 R /XYZ 67.0 372.816 null ] (rfc.toc) [ 10 0 R /XYZ 67.0 725.0 null ] (rfc.section.1) [ 468 0 R /XYZ 67.0 725.0 null ] (intro) [ 468 0 R /XYZ 67.0 725.0 null ] (rfc.xref.RFC2291.1) [ 468 0 R /XYZ 67.0 504.866 null ] (rfc.xref.RFC2291.2) [ 468 0 R /XYZ 67.0 483.866 null ] (rfc.xref.RFC3253.1) [ 468 0 R /XYZ 67.0 472.866 null ] (rfc.xref.REC-XML.1) [ 468 0 R /XYZ 67.0 278.866 null ] (rfc.section.2) [ 495 0 R /XYZ 67.0 725.0 null ] (rfc.xref.RFC2616.1) [ 495 0 R /XYZ 67.0 686.866 null ] (rfc.xref.RFC2616.2) [ 495 0 R /XYZ 67.0 664.866 null ] (rfc.xref.RFC2119.1) [ 495 0 R /XYZ 67.0 621.866 null ] (rfc.section.3) [ 503 0 R /XYZ 67.0 725.0 null ] (rfc.iref.1) [ 503 0 R /XYZ 67.0 697.866 null ] (rfc.iref.2) [ 503 0 R /XYZ 67.0 697.866 null ] (rfc.xref.RFC3986.1) [ 503 0 R /XYZ 67.0 686.866 null ] (rfc.iref.3) [ 503 0 R /XYZ 67.0 665.866 null ] (rfc.iref.4) [ 503 0 R /XYZ 67.0 665.866 null ] (rfc.iref.5) [ 503 0 R /XYZ 67.0 611.866 null ] (rfc.xref.RFC3986.2) [ 503 0 R /XYZ 67.0 600.866 null ] (rfc.iref.6) [ 503 0 R /XYZ 67.0 579.866 null ] (rfc.iref.7) [ 503 0 R /XYZ 67.0 536.866 null ] (rfc.iref.8) [ 503 0 R /XYZ 67.0 504.866 null ] (rfc.iref.9) [ 503 0 R /XYZ 67.0 472.866 null ] (rfc.iref.10) [ 503 0 R /XYZ 67.0 440.866 null ] (rfc.iref.11) [ 503 0 R /XYZ 67.0 408.866 null ] (rfc.iref.12) [ 503 0 R /XYZ 67.0 387.866 null ] (rfc.iref.13) [ 503 0 R /XYZ 67.0 344.866 null ] (rfc.iref.14) [ 503 0 R /XYZ 67.0 301.866 null ] (rfc.iref.15) [ 503 0 R /XYZ 67.0 280.866 null ] (rfc.section.4) [ 510 0 R /XYZ 67.0 725.0 null ] (data.model.for.resource.properties) [ 510 0 R /XYZ 67.0 725.0 null ] (rfc.section.4.1) [ 510 0 R /XYZ 67.0 690.866 null ] (rfc.section.4.2) [ 510 0 R /XYZ 67.0 487.894 null ] (rfc.section.4.3) [ 510 0 R /XYZ 67.0 391.922 null ] (property_values) [ 510 0 R /XYZ 67.0 391.922 null ] (rfc.figure.u.1) [ 510 0 R /XYZ 67.0 151.95 null ] (rfc.xref.REC-XML-INFOSET.1) [ 510 0 R /XYZ 67.0 99.09 null ] (rfc.section.4.3.1) [ 515 0 R /XYZ 67.0 260.0 null ] (rfc.figure.u.2) [ 515 0 R /XYZ 67.0 219.109 null ] (rfc.figure.u.3) [ 517 0 R /XYZ 67.0 673.14 null ] (rfc.section.4.4) [ 517 0 R /XYZ 67.0 262.38 null ] (rfc.xref.RFC3986.3) [ 517 0 R /XYZ 67.0 163.408 null ] (rfc.section.4.5) [ 521 0 R /XYZ 67.0 681.0 null ] (rfc.section.5) [ 523 0 R /XYZ 67.0 725.0 null ] (collections.of.web.resources) [ 523 0 R /XYZ 67.0 725.0 null ] (rfc.section.5.1) [ 523 0 R /XYZ 67.0 626.866 null ] (http.url.namespace.model) [ 523 0 R /XYZ 67.0 626.866 null ] (rfc.xref.RFC2616.3) [ 523 0 R /XYZ 67.0 473.894 null ] (rfc.xref.RFC3986.4) [ 523 0 R /XYZ 67.0 473.894 null ] (rfc.section.5.2) [ 523 0 R /XYZ 67.0 434.894 null ] (collection.resources) [ 523 0 R /XYZ 67.0 434.894 null ] (rfc.section.6) [ 530 0 R /XYZ 67.0 725.0 null ] (locking) [ 530 0 R /XYZ 67.0 725.0 null ] (rfc.section.6.1) [ 530 0 R /XYZ 67.0 593.866 null ] (lock-model) [ 530 0 R /XYZ 67.0 593.866 null ] (rfc.section.6.2) [ 530 0 R /XYZ 67.0 239.894 null ] (exclusive-lock) [ 530 0 R /XYZ 67.0 239.894 null ] (rfc.section.6.3) [ 537 0 R /XYZ 67.0 442.0 null ] (rfc.section.6.4) [ 537 0 R /XYZ 67.0 303.028 null ] (lock-creator) [ 537 0 R /XYZ 67.0 303.028 null ] (rfc.xref.RFC3744.1) [ 537 0 R /XYZ 67.0 225.056 null ] (rfc.section.6.5) [ 537 0 R /XYZ 67.0 133.056 null ] (lock-tokens) [ 537 0 R /XYZ 67.0 133.056 null ] (rfc.xref.RFC4122.1) [ 543 0 R /XYZ 67.0 580.0 null ] (rfc.section.6.6) [ 543 0 R /XYZ 67.0 498.0 null ] (lock-timeout) [ 543 0 R /XYZ 67.0 498.0 null ] (rfc.section.6.7) [ 543 0 R /XYZ 67.0 176.028 null ] (rfc.section.6.8) [ 551 0 R /XYZ 67.0 692.0 null ] (rfc.section.7) [ 553 0 R /XYZ 67.0 725.0 null ] (write-lock) [ 553 0 R /XYZ 67.0 725.0 null ] (rfc.section.7.1) [ 553 0 R /XYZ 67.0 391.866 null ] (rfc.section.7.2) [ 553 0 R /XYZ 67.0 317.894 null ] (rfc.section.7.3) [ 557 0 R /XYZ 67.0 574.0 null ] (lock-unmapped-urls) [ 557 0 R /XYZ 67.0 574.0 null ] (rfc.xref.RFC2616.4) [ 557 0 R /XYZ 67.0 528.028 null ] (rfc.xref.RFC2518.1) [ 561 0 R /XYZ 67.0 720.0 null ] (rfc.section.7.4) [ 561 0 R /XYZ 67.0 659.0 null ] (write.locks.and.collections) [ 561 0 R /XYZ 67.0 659.0 null ] (rfc.section.7.5) [ 561 0 R /XYZ 67.0 119.028 null ] (write.locks.and.the.if.request.header) [ 561 0 R /XYZ 67.0 119.028 null ] (rfc.section.7.5.1) [ 568 0 R /XYZ 67.0 562.0 null ] (rfc.figure.u.4) [ 568 0 R /XYZ 67.0 542.109 null ] (rfc.figure.u.5) [ 568 0 R /XYZ 67.0 455.809 null ] (rfc.section.7.5.2) [ 568 0 R /XYZ 67.0 348.949 null ] (rfc.figure.u.6) [ 568 0 R /XYZ 67.0 297.058 null ] (rfc.figure.u.7) [ 568 0 R /XYZ 67.0 240.338 null ] (rfc.figure.u.8) [ 572 0 R /XYZ 67.0 699.0 null ] (rfc.figure.u.9) [ 572 0 R /XYZ 67.0 647.14 null ] (rfc.figure.u.10) [ 572 0 R /XYZ 67.0 585.42 null ] (rfc.section.7.6) [ 572 0 R /XYZ 67.0 505.7 null ] (rfc.section.7.7) [ 572 0 R /XYZ 67.0 333.728 null ] (rfc.section.8) [ 576 0 R /XYZ 67.0 725.0 null ] (response-handling) [ 576 0 R /XYZ 67.0 725.0 null ] (rfc.section.8.1) [ 576 0 R /XYZ 67.0 690.866 null ] (error-precedence) [ 576 0 R /XYZ 67.0 690.866 null ] (rfc.section.8.2) [ 576 0 R /XYZ 67.0 616.894 null ] (rfc.xref.REC-XML.2) [ 576 0 R /XYZ 67.0 581.922 null ] (rfc.xref.REC-XML.3) [ 576 0 R /XYZ 67.0 452.922 null ] (rfc.xref.REC-XML-NAMES.1) [ 576 0 R /XYZ 67.0 452.922 null ] (rfc.section.8.3) [ 576 0 R /XYZ 67.0 315.922 null ] (url-handling) [ 576 0 R /XYZ 67.0 315.922 null ] (rfc.xref.RFC2518.2) [ 576 0 R /XYZ 67.0 291.95 null ] (rfc.xref.RFC3986.5) [ 576 0 R /XYZ 67.0 269.95 null ] (rfc.figure.u.11) [ 576 0 R /XYZ 67.0 151.95 null ] (rfc.xref.RFC3986.6) [ 576 0 R /XYZ 67.0 122.09 null ] (rfc.xref.RFC3986.7) [ 576 0 R /XYZ 67.0 122.09 null ] (rfc.xref.RFC3986.8) [ 576 0 R /XYZ 67.0 122.09 null ] (rfc.xref.RFC3986.9) [ 576 0 R /XYZ 67.0 122.09 null ] (rfc.xref.RFC2616.5) [ 587 0 R /XYZ 67.0 706.5 null ] (rfc.section.8.3.1) [ 587 0 R /XYZ 67.0 645.0 null ] (rfc.figure.u.12) [ 587 0 R /XYZ 67.0 593.109 null ] (rfc.xref.RFC3986.10) [ 587 0 R /XYZ 67.0 462.529 null ] (rfc.section.8.4) [ 587 0 R /XYZ 67.0 412.529 null ] (rfc.section.8.5) [ 587 0 R /XYZ 67.0 327.557 null ] (http-headers) [ 587 0 R /XYZ 67.0 327.557 null ] (rfc.xref.RFC2616.6) [ 587 0 R /XYZ 67.0 281.585 null ] (rfc.xref.RFC2616.7) [ 587 0 R /XYZ 67.0 281.585 null ] (rfc.section.8.6) [ 587 0 R /XYZ 67.0 232.585 null ] (etag) [ 587 0 R /XYZ 67.0 232.585 null ] (rfc.xref.RFC2616.8) [ 587 0 R /XYZ 67.0 99.613 null ] (rfc.section.8.7) [ 594 0 R /XYZ 67.0 556.0 null ] (including.error.reponse.bodies) [ 594 0 R /XYZ 67.0 556.0 null ] (rfc.xref.RFC3253.2) [ 594 0 R /XYZ 67.0 510.028 null ] (rfc.section.8.8) [ 594 0 R /XYZ 67.0 438.028 null ] (cache-control) [ 594 0 R /XYZ 67.0 438.028 null ] (rfc.xref.RFC2616.9) [ 594 0 R /XYZ 67.0 414.056 null ] (rfc.xref.RFC2616.10) [ 594 0 R /XYZ 67.0 414.056 null ] (rfc.xref.RFC2616.11) [ 594 0 R /XYZ 67.0 414.056 null ] (rfc.section.9) [ 600 0 R /XYZ 67.0 725.0 null ] (http.methods.for.distributed.authoring) [ 600 0 R /XYZ 67.0 725.0 null ] (rfc.section.9.1) [ 600 0 R /XYZ 67.0 690.866 null ] (METHOD_PROPFIND) [ 600 0 R /XYZ 67.0 690.866 null ] (rfc.xref.RFC3253.3) [ 600 0 R /XYZ 67.0 370.894 null ] (rfc.xref.RFC3744.2) [ 600 0 R /XYZ 67.0 370.894 null ] (rfc.xref.RFC2616.12) [ 600 0 R /XYZ 67.0 100.894 null ] (rfc.section.9.1.1) [ 600 0 R /XYZ 67.0 73.894 null ] (rfc.section.9.1.2) [ 607 0 R /XYZ 67.0 635.109 null ] (PROPFIND-multistatus) [ 607 0 R /XYZ 67.0 635.109 null ] (rfc.section.9.1.3) [ 607 0 R /XYZ 67.0 471.218 null ] (rfc.figure.u.13) [ 607 0 R /XYZ 67.0 451.327 null ] (rfc.figure.u.14) [ 607 0 R /XYZ 67.0 276.287 null ] (rfc.section.9.1.4) [ 612 0 R /XYZ 67.0 525.68 null ] (rfc.figure.u.15) [ 612 0 R /XYZ 67.0 505.789 null ] (rfc.figure.u.16) [ 612 0 R /XYZ 67.0 380.049 null ] (rfc.section.9.1.5) [ 614 0 R /XYZ 67.0 394.4 null ] (rfc.figure.u.17) [ 614 0 R /XYZ 67.0 342.509 null ] (rfc.figure.u.18) [ 614 0 R /XYZ 67.0 206.909 null ] (rfc.section.9.1.6) [ 620 0 R /XYZ 67.0 547.0 null ] (rfc.figure.u.19) [ 620 0 R /XYZ 67.0 527.109 null ] (rfc.xref.RFC3253.4) [ 620 0 R /XYZ 67.0 330.069 null ] (rfc.section.9.2) [ 620 0 R /XYZ 67.0 302.069 null ] (METHOD_PROPPATCH) [ 620 0 R /XYZ 67.0 302.069 null ] (rfc.xref.RFC2616.13) [ 627 0 R /XYZ 67.0 720.0 null ] (rfc.section.9.2.1) [ 627 0 R /XYZ 67.0 682.0 null ] (PROPPATCH-status) [ 627 0 R /XYZ 67.0 682.0 null ] (rfc.section.9.2.2) [ 627 0 R /XYZ 67.0 432.109 null ] (rfc.figure.u.20) [ 627 0 R /XYZ 67.0 412.218 null ] (rfc.figure.u.21) [ 627 0 R /XYZ 67.0 178.018 null ] (rfc.section.9.3) [ 632 0 R /XYZ 67.0 503.82 null ] (METHOD_MKCOL) [ 632 0 R /XYZ 67.0 503.82 null ] (rfc.xref.RFC2616.14) [ 632 0 R /XYZ 67.0 306.848 null ] (rfc.section.9.3.1) [ 632 0 R /XYZ 67.0 268.848 null ] (rfc.section.9.3.2) [ 636 0 R /XYZ 67.0 650.0 null ] (rfc.figure.u.22) [ 636 0 R /XYZ 67.0 609.109 null ] (rfc.figure.u.23) [ 636 0 R /XYZ 67.0 552.389 null ] (rfc.section.9.4) [ 636 0 R /XYZ 67.0 498.529 null ] (rfc.xref.RFC2616.15) [ 636 0 R /XYZ 67.0 463.557 null ] (rfc.section.9.5) [ 636 0 R /XYZ 67.0 370.557 null ] (METHOD_POST) [ 636 0 R /XYZ 67.0 370.557 null ] (rfc.section.9.6) [ 636 0 R /XYZ 67.0 296.585 null ] (METHOD_DELETE) [ 636 0 R /XYZ 67.0 296.585 null ] (rfc.xref.RFC2616.16) [ 636 0 R /XYZ 67.0 272.613 null ] (rfc.section.9.6.1) [ 636 0 R /XYZ 67.0 159.613 null ] (delete-collections) [ 636 0 R /XYZ 67.0 159.613 null ] (rfc.section.9.6.2) [ 641 0 R /XYZ 67.0 489.0 null ] (DELETE-example) [ 641 0 R /XYZ 67.0 489.0 null ] (rfc.figure.u.24) [ 641 0 R /XYZ 67.0 469.109 null ] (rfc.figure.u.25) [ 641 0 R /XYZ 67.0 412.389 null ] (rfc.section.9.7) [ 641 0 R /XYZ 67.0 174.069 null ] (METHOD_PUT) [ 641 0 R /XYZ 67.0 174.069 null ] (rfc.section.9.7.1) [ 641 0 R /XYZ 67.0 144.097 null ] (put-resources) [ 641 0 R /XYZ 67.0 144.097 null ] (rfc.section.9.7.2) [ 643 0 R /XYZ 67.0 563.0 null ] (rfc.section.9.8) [ 643 0 R /XYZ 67.0 483.109 null ] (METHOD_COPY) [ 643 0 R /XYZ 67.0 483.109 null ] (rfc.xref.RFC2616.17) [ 643 0 R /XYZ 67.0 362.137 null ] (rfc.section.9.8.1) [ 643 0 R /XYZ 67.0 324.137 null ] (rfc.section.9.8.2) [ 643 0 R /XYZ 67.0 211.246 null ] (copy.for.properties) [ 643 0 R /XYZ 67.0 211.246 null ] (rfc.section.9.8.3) [ 647 0 R /XYZ 67.0 682.0 null ] (copy.for.collections) [ 647 0 R /XYZ 67.0 682.0 null ] (rfc.section.9.8.4) [ 647 0 R /XYZ 67.0 181.109 null ] (rfc.xref.RFC3253.5) [ 647 0 R /XYZ 67.0 118.218 null ] (rfc.section.9.8.5) [ 652 0 R /XYZ 67.0 617.0 null ] (rfc.section.9.8.6) [ 652 0 R /XYZ 67.0 249.109 null ] (rfc.figure.u.26) [ 652 0 R /XYZ 67.0 186.218 null ] (rfc.figure.u.27) [ 652 0 R /XYZ 67.0 119.638 null ] (rfc.section.9.8.7) [ 654 0 R /XYZ 67.0 709.0 null ] (rfc.figure.u.28) [ 654 0 R /XYZ 67.0 646.109 null ] (rfc.figure.u.29) [ 654 0 R /XYZ 67.0 569.669 null ] (rfc.section.9.8.8) [ 654 0 R /XYZ 67.0 516.809 null ] (rfc.figure.u.30) [ 654 0 R /XYZ 67.0 496.918 null ] (rfc.figure.u.31) [ 654 0 R /XYZ 67.0 420.478 null ] (rfc.section.9.9) [ 654 0 R /XYZ 67.0 183.298 null ] (METHOD_MOVE) [ 654 0 R /XYZ 67.0 183.298 null ] (rfc.xref.RFC2616.18) [ 656 0 R /XYZ 67.0 624.0 null ] (rfc.section.9.9.1) [ 656 0 R /XYZ 67.0 586.0 null ] (move-properties) [ 656 0 R /XYZ 67.0 586.0 null ] (rfc.section.9.9.2) [ 656 0 R /XYZ 67.0 420.109 null ] (move-collections) [ 656 0 R /XYZ 67.0 420.109 null ] (rfc.section.9.9.3) [ 661 0 R /XYZ 67.0 682.0 null ] (rfc.section.9.9.4) [ 661 0 R /XYZ 67.0 613.109 null ] (rfc.section.9.9.5) [ 661 0 R /XYZ 67.0 244.218 null ] (rfc.figure.u.32) [ 661 0 R /XYZ 67.0 170.327 null ] (rfc.figure.u.33) [ 661 0 R /XYZ 67.0 103.747 null ] (rfc.section.9.9.6) [ 663 0 R /XYZ 67.0 678.28 null ] (rfc.figure.u.34) [ 663 0 R /XYZ 67.0 658.389 null ] (rfc.figure.u.35) [ 663 0 R /XYZ 67.0 562.229 null ] (rfc.section.9.10) [ 663 0 R /XYZ 67.0 317.909 null ] (METHOD_LOCK) [ 663 0 R /XYZ 67.0 317.909 null ] (rfc.xref.RFC2616.19) [ 663 0 R /XYZ 67.0 218.937 null ] (rfc.section.9.10.1) [ 663 0 R /XYZ 67.0 180.937 null ] (rfc.section.9.10.2) [ 667 0 R /XYZ 67.0 650.0 null ] (refreshing-locks) [ 667 0 R /XYZ 67.0 650.0 null ] (rfc.section.9.10.3) [ 667 0 R /XYZ 67.0 495.109 null ] (rfc.section.9.10.4) [ 667 0 R /XYZ 67.0 243.218 null ] (rfc.section.9.10.5) [ 667 0 R /XYZ 67.0 152.327 null ] (rfc.table.u.1) [ 667 0 R /XYZ 67.0 111.436 null ] (rfc.section.9.10.6) [ 669 0 R /XYZ 67.0 582.69 null ] (rfc.section.9.10.7) [ 669 0 R /XYZ 67.0 353.799 null ] (rfc.figure.u.36) [ 669 0 R /XYZ 67.0 333.908 null ] (rfc.figure.u.37) [ 669 0 R /XYZ 67.0 119.428 null ] (rfc.section.9.10.8) [ 671 0 R /XYZ 67.0 376.64 null ] (rfc.figure.u.38) [ 671 0 R /XYZ 67.0 356.749 null ] (rfc.figure.u.39) [ 671 0 R /XYZ 67.0 240.869 null ] (rfc.section.9.10.9) [ 673 0 R /XYZ 67.0 541.68 null ] (rfc.figure.u.40) [ 673 0 R /XYZ 67.0 521.789 null ] (rfc.figure.u.41) [ 673 0 R /XYZ 67.0 297.449 null ] (rfc.section.9.11) [ 675 0 R /XYZ 67.0 617.0 null ] (METHOD_UNLOCK) [ 675 0 R /XYZ 67.0 617.0 null ] (rfc.xref.RFC2616.20) [ 675 0 R /XYZ 67.0 412.028 null ] (rfc.section.9.11.1) [ 675 0 R /XYZ 67.0 374.028 null ] (rfc.section.9.11.2) [ 675 0 R /XYZ 67.0 210.137 null ] (rfc.figure.u.42) [ 675 0 R /XYZ 67.0 190.246 null ] (rfc.figure.u.43) [ 675 0 R /XYZ 67.0 84.226 null ] (rfc.section.10) [ 681 0 R /XYZ 67.0 725.0 null ] (http.headers.for.distributed.authoring) [ 681 0 R /XYZ 67.0 725.0 null ] (rfc.section.10.1) [ 681 0 R /XYZ 67.0 637.866 null ] (HEADER_DAV) [ 681 0 R /XYZ 67.0 637.866 null ] (rfc.figure.u.44) [ 681 0 R /XYZ 67.0 613.894 null ] (rfc.xref.RFC2616.21) [ 681 0 R /XYZ 67.0 579.314 null ] (rfc.xref.RFC3986.11) [ 681 0 R /XYZ 67.0 530.014 null ] (rfc.xref.RFC2616.22) [ 681 0 R /XYZ 67.0 400.714 null ] (rfc.section.10.2) [ 681 0 R /XYZ 67.0 221.714 null ] (HEADER_Depth) [ 681 0 R /XYZ 67.0 221.714 null ] (rfc.figure.u.45) [ 681 0 R /XYZ 67.0 197.742 null ] (rfc.section.10.3) [ 686 0 R /XYZ 67.0 445.0 null ] (HEADER_Destination) [ 686 0 R /XYZ 67.0 445.0 null ] (rfc.figure.u.46) [ 686 0 R /XYZ 67.0 389.028 null ] (rfc.xref.RFC3986.12) [ 686 0 R /XYZ 67.0 359.168 null ] (rfc.section.10.4) [ 686 0 R /XYZ 67.0 266.168 null ] (HEADER_If) [ 686 0 R /XYZ 67.0 266.168 null ] (rfc.xref.RFC2616.23) [ 686 0 R /XYZ 67.0 231.196 null ] (rfc.section.10.4.1) [ 686 0 R /XYZ 67.0 193.196 null ] (if.header.purpose) [ 686 0 R /XYZ 67.0 193.196 null ] (rfc.section.10.4.2) [ 693 0 R /XYZ 67.0 639.0 null ] (if.header.syntax) [ 693 0 R /XYZ 67.0 639.0 null ] (rfc.figure.u.47) [ 693 0 R /XYZ 67.0 619.109 null ] (rfc.xref.RFC2616.24) [ 693 0 R /XYZ 67.0 545.089 null ] (rfc.xref.RFC2616.25) [ 693 0 R /XYZ 67.0 280.349 null ] (rfc.section.10.4.3) [ 693 0 R /XYZ 67.0 253.349 null ] (if.header.evaluation) [ 693 0 R /XYZ 67.0 253.349 null ] (rfc.section.10.4.4) [ 701 0 R /XYZ 67.0 693.0 null ] (if.header.matching.function) [ 701 0 R /XYZ 67.0 693.0 null ] (rfc.xref.RFC2616.26) [ 701 0 R /XYZ 67.0 609.109 null ] (rfc.section.10.4.5) [ 701 0 R /XYZ 67.0 507.109 null ] (rfc.section.10.4.6) [ 701 0 R /XYZ 67.0 384.218 null ] (if.header.evaluation.example.no-tag) [ 701 0 R /XYZ 67.0 384.218 null ] (rfc.figure.u.48) [ 701 0 R /XYZ 67.0 364.327 null ] (rfc.figure.u.49) [ 701 0 R /XYZ 67.0 270.747 null ] (rfc.section.10.4.7) [ 701 0 R /XYZ 67.0 148.867 null ] (rfc.figure.u.50) [ 701 0 R /XYZ 67.0 128.976 null ] (rfc.section.10.4.8) [ 705 0 R /XYZ 67.0 671.0 null ] (rfc.figure.u.51) [ 705 0 R /XYZ 67.0 608.109 null ] (rfc.section.10.4.9) [ 705 0 R /XYZ 67.0 496.389 null ] (rfc.figure.u.52) [ 705 0 R /XYZ 67.0 476.498 null ] (rfc.section.10.4.10) [ 705 0 R /XYZ 67.0 309.338 null ] (rfc.figure.u.53) [ 705 0 R /XYZ 67.0 289.447 null ] (rfc.section.10.4.11) [ 705 0 R /XYZ 67.0 169.007 null ] (rfc.figure.u.54) [ 705 0 R /XYZ 67.0 128.116 null ] (rfc.figure.u.55) [ 709 0 R /XYZ 67.0 678.0 null ] (rfc.section.10.5) [ 709 0 R /XYZ 67.0 598.14 null ] (HEADER_Lock-Token) [ 709 0 R /XYZ 67.0 598.14 null ] (rfc.figure.u.56) [ 709 0 R /XYZ 67.0 574.168 null ] (rfc.section.10.6) [ 709 0 R /XYZ 67.0 462.308 null ] (HEADER_Overwrite) [ 709 0 R /XYZ 67.0 462.308 null ] (rfc.figure.u.57) [ 709 0 R /XYZ 67.0 438.336 null ] (rfc.xref.RFC2616.27) [ 709 0 R /XYZ 67.0 364.476 null ] (rfc.section.10.7) [ 709 0 R /XYZ 67.0 261.476 null ] (HEADER_Timeout) [ 709 0 R /XYZ 67.0 261.476 null ] (rfc.figure.u.58) [ 709 0 R /XYZ 67.0 237.504 null ] (rfc.section.11) [ 715 0 R /XYZ 67.0 725.0 null ] (status.code.extensions.to.http11) [ 715 0 R /XYZ 67.0 725.0 null ] (rfc.xref.RFC2616.28) [ 715 0 R /XYZ 67.0 697.866 null ] (rfc.section.11.1) [ 715 0 R /XYZ 67.0 669.866 null ] (STATUS_207) [ 715 0 R /XYZ 67.0 669.866 null ] (rfc.section.11.2) [ 715 0 R /XYZ 67.0 606.894 null ] (STATUS_422) [ 715 0 R /XYZ 67.0 606.894 null ] (rfc.section.11.3) [ 715 0 R /XYZ 67.0 510.922 null ] (STATUS_423) [ 715 0 R /XYZ 67.0 510.922 null ] (rfc.section.11.4) [ 715 0 R /XYZ 67.0 436.95 null ] (STATUS_424) [ 715 0 R /XYZ 67.0 436.95 null ] (rfc.section.11.5) [ 715 0 R /XYZ 67.0 351.978 null ] (STATUS_507) [ 715 0 R /XYZ 67.0 351.978 null ] (rfc.section.12) [ 720 0 R /XYZ 67.0 725.0 null ] (http-status-codes) [ 720 0 R /XYZ 67.0 725.0 null ] (rfc.section.12.1) [ 720 0 R /XYZ 67.0 625.866 null ] (rfc.section.12.2) [ 720 0 R /XYZ 67.0 540.894 null ] (rfc.section.13) [ 722 0 R /XYZ 67.0 725.0 null ] (multi-status.response) [ 722 0 R /XYZ 67.0 725.0 null ] (rfc.xref.RFC2616.29) [ 722 0 R /XYZ 67.0 501.366 null ] (rfc.section.13.1) [ 722 0 R /XYZ 67.0 432.866 null ] (rfc.section.13.2) [ 722 0 R /XYZ 67.0 347.894 null ] (rfc.xref.RFC2518.3) [ 722 0 R /XYZ 67.0 301.922 null ] (rfc.section.13.3) [ 722 0 R /XYZ 67.0 197.922 null ] (rfc.section.14) [ 736 0 R /XYZ 67.0 725.0 null ] (xml.element.definitions) [ 736 0 R /XYZ 67.0 725.0 null ] (rfc.xref.REC-XML.4) [ 736 0 R /XYZ 67.0 697.866 null ] (rfc.section.14.1) [ 736 0 R /XYZ 67.0 625.866 null ] (ELEMENT_activelock) [ 736 0 R /XYZ 67.0 625.866 null ] (rfc.figure.u.59) [ 736 0 R /XYZ 67.0 559.894 null ] (rfc.section.14.2) [ 736 0 R /XYZ 67.0 513.174 null ] (ELEMENT_allprop) [ 736 0 R /XYZ 67.0 513.174 null ] (rfc.figure.u.60) [ 736 0 R /XYZ 67.0 436.202 null ] (rfc.section.14.3) [ 736 0 R /XYZ 67.0 399.342 null ] (ELEMENT_collection) [ 736 0 R /XYZ 67.0 399.342 null ] (rfc.figure.u.61) [ 736 0 R /XYZ 67.0 311.37 null ] (rfc.section.14.4) [ 736 0 R /XYZ 67.0 274.51 null ] (ELEMENT_depth) [ 736 0 R /XYZ 67.0 274.51 null ] (rfc.figure.u.62) [ 736 0 R /XYZ 67.0 192.538 null ] (rfc.section.14.5) [ 736 0 R /XYZ 67.0 155.678 null ] (ELEMENT_error) [ 736 0 R /XYZ 67.0 155.678 null ] (rfc.figure.u.63) [ 752 0 R /XYZ 67.0 661.0 null ] (rfc.section.14.6) [ 752 0 R /XYZ 67.0 624.14 null ] (ELEMENT_exclusive) [ 752 0 R /XYZ 67.0 624.14 null ] (rfc.figure.u.64) [ 752 0 R /XYZ 67.0 558.168 null ] (rfc.section.14.7) [ 752 0 R /XYZ 67.0 521.308 null ] (ELEMENT_href) [ 752 0 R /XYZ 67.0 521.308 null ] (rfc.figure.u.65) [ 752 0 R /XYZ 67.0 412.336 null ] (rfc.section.14.8) [ 752 0 R /XYZ 67.0 375.476 null ] (ELEMENT_include) [ 752 0 R /XYZ 67.0 375.476 null ] (rfc.figure.u.66) [ 752 0 R /XYZ 67.0 265.504 null ] (rfc.section.14.9) [ 752 0 R /XYZ 67.0 228.644 null ] (ELEMENT_location) [ 752 0 R /XYZ 67.0 228.644 null ] (rfc.xref.RFC2616.30) [ 752 0 R /XYZ 67.0 186.172 null ] (rfc.figure.u.67) [ 752 0 R /XYZ 67.0 107.672 null ] (rfc.section.14.10) [ 762 0 R /XYZ 67.0 703.0 null ] (ELEMENT_lockentry) [ 762 0 R /XYZ 67.0 703.0 null ] (rfc.figure.u.68) [ 762 0 R /XYZ 67.0 637.028 null ] (rfc.section.14.11) [ 762 0 R /XYZ 67.0 600.168 null ] (ELEMENT_lockinfo) [ 762 0 R /XYZ 67.0 600.168 null ] (rfc.figure.u.69) [ 762 0 R /XYZ 67.0 523.196 null ] (rfc.section.14.12) [ 762 0 R /XYZ 67.0 486.336 null ] (ELEMENT_lockroot) [ 762 0 R /XYZ 67.0 486.336 null ] (rfc.figure.u.70) [ 762 0 R /XYZ 67.0 382.364 null ] (rfc.section.14.13) [ 762 0 R /XYZ 67.0 345.504 null ] (ELEMENT_lockscope) [ 762 0 R /XYZ 67.0 345.504 null ] (rfc.figure.u.71) [ 762 0 R /XYZ 67.0 279.532 null ] (rfc.section.14.14) [ 762 0 R /XYZ 67.0 242.672 null ] (ELEMENT_locktoken) [ 762 0 R /XYZ 67.0 242.672 null ] (rfc.figure.u.72) [ 762 0 R /XYZ 67.0 160.7 null ] (rfc.section.14.15) [ 762 0 R /XYZ 67.0 123.84 null ] (ELEMENT_locktype) [ 762 0 R /XYZ 67.0 123.84 null ] (rfc.figure.u.73) [ 779 0 R /XYZ 67.0 688.0 null ] (rfc.section.14.16) [ 779 0 R /XYZ 67.0 651.14 null ] (ELEMENT_multistatus) [ 779 0 R /XYZ 67.0 651.14 null ] (rfc.figure.u.74) [ 779 0 R /XYZ 67.0 536.168 null ] (rfc.section.14.17) [ 779 0 R /XYZ 67.0 499.308 null ] (ELEMENT_owner) [ 779 0 R /XYZ 67.0 499.308 null ] (rfc.figure.u.75) [ 779 0 R /XYZ 67.0 313.336 null ] (rfc.section.14.18) [ 779 0 R /XYZ 67.0 276.476 null ] (ELEMENT_prop) [ 779 0 R /XYZ 67.0 276.476 null ] (rfc.figure.u.76) [ 779 0 R /XYZ 67.0 150.504 null ] (rfc.section.14.19) [ 779 0 R /XYZ 67.0 113.644 null ] (ELEMENT_propertyupdate) [ 779 0 R /XYZ 67.0 113.644 null ] (rfc.figure.u.77) [ 789 0 R /XYZ 67.0 656.0 null ] (rfc.section.14.20) [ 789 0 R /XYZ 67.0 619.14 null ] (ELEMENT_propfind) [ 789 0 R /XYZ 67.0 619.14 null ] (rfc.figure.u.78) [ 789 0 R /XYZ 67.0 531.168 null ] (rfc.section.14.21) [ 789 0 R /XYZ 67.0 494.308 null ] (ELEMENT_propname) [ 789 0 R /XYZ 67.0 494.308 null ] (rfc.figure.u.79) [ 789 0 R /XYZ 67.0 428.336 null ] (rfc.section.14.22) [ 789 0 R /XYZ 67.0 391.476 null ] (ELEMENT_propstat) [ 789 0 R /XYZ 67.0 391.476 null ] (rfc.figure.u.80) [ 789 0 R /XYZ 67.0 254.504 null ] (rfc.section.14.23) [ 789 0 R /XYZ 67.0 217.644 null ] (ELEMENT_remove) [ 789 0 R /XYZ 67.0 217.644 null ] (rfc.figure.u.81) [ 789 0 R /XYZ 67.0 102.672 null ] (rfc.section.14.24) [ 808 0 R /XYZ 67.0 708.0 null ] (ELEMENT_response) [ 808 0 R /XYZ 67.0 708.0 null ] (rfc.figure.u.82) [ 808 0 R /XYZ 67.0 527.028 null ] (rfc.section.14.25) [ 808 0 R /XYZ 67.0 480.308 null ] (ELEMENT_responsedescription) [ 808 0 R /XYZ 67.0 480.308 null ] (rfc.figure.u.83) [ 808 0 R /XYZ 67.0 398.336 null ] (rfc.section.14.26) [ 808 0 R /XYZ 67.0 361.476 null ] (ELEMENT_set) [ 808 0 R /XYZ 67.0 361.476 null ] (rfc.figure.u.84) [ 808 0 R /XYZ 67.0 224.504 null ] (rfc.section.14.27) [ 808 0 R /XYZ 67.0 187.644 null ] (ELEMENT_shared) [ 808 0 R /XYZ 67.0 187.644 null ] (rfc.figure.u.85) [ 808 0 R /XYZ 67.0 121.672 null ] (rfc.section.14.28) [ 808 0 R /XYZ 67.0 84.812 null ] (ELEMENT_status) [ 823 0 R /XYZ 67.0 725.0 null ] (rfc.xref.RFC2616.31) [ 823 0 R /XYZ 67.0 666.528 null ] (rfc.figure.u.86) [ 823 0 R /XYZ 67.0 643.028 null ] (rfc.section.14.29) [ 823 0 R /XYZ 67.0 606.168 null ] (ELEMENT_timeout) [ 823 0 R /XYZ 67.0 606.168 null ] (rfc.figure.u.87) [ 823 0 R /XYZ 67.0 524.196 null ] (rfc.section.14.30) [ 823 0 R /XYZ 67.0 487.336 null ] (ELEMENT_write) [ 823 0 R /XYZ 67.0 487.336 null ] (rfc.figure.u.88) [ 823 0 R /XYZ 67.0 421.364 null ] (rfc.section.15) [ 831 0 R /XYZ 67.0 725.0 null ] (dav.properties) [ 831 0 R /XYZ 67.0 725.0 null ] (rfc.xref.REC-XML.5) [ 831 0 R /XYZ 67.0 675.866 null ] (rfc.xref.RFC2616.32) [ 831 0 R /XYZ 67.0 514.866 null ] (rfc.section.15.1) [ 831 0 R /XYZ 67.0 475.866 null ] (PROPERTY_creationdate) [ 831 0 R /XYZ 67.0 475.866 null ] (rfc.xref.RFC3339.1) [ 831 0 R /XYZ 67.0 417.394 null ] (rfc.xref.RFC3339.2) [ 831 0 R /XYZ 67.0 417.394 null ] (rfc.figure.u.89) [ 831 0 R /XYZ 67.0 235.894 null ] (rfc.section.15.2) [ 831 0 R /XYZ 67.0 199.034 null ] (PROPERTY_displayname) [ 831 0 R /XYZ 67.0 199.034 null ] (rfc.xref.RFC2518.4) [ 831 0 R /XYZ 67.0 113.562 null ] (rfc.figure.u.90) [ 840 0 R /XYZ 67.0 573.0 null ] (rfc.section.15.3) [ 840 0 R /XYZ 67.0 536.14 null ] (PROPERTY_getcontentlanguage) [ 840 0 R /XYZ 67.0 536.14 null ] (rfc.xref.RFC2616.33) [ 840 0 R /XYZ 67.0 493.668 null ] (rfc.xref.RFC2616.34) [ 840 0 R /XYZ 67.0 466.668 null ] (rfc.xref.RFC2518.5) [ 840 0 R /XYZ 67.0 439.668 null ] (rfc.figure.u.91) [ 840 0 R /XYZ 67.0 340.168 null ] (rfc.section.15.4) [ 840 0 R /XYZ 67.0 303.308 null ] (PROPERTY_getcontentlength) [ 840 0 R /XYZ 67.0 303.308 null ] (rfc.xref.RFC2616.35) [ 840 0 R /XYZ 67.0 233.836 null ] (rfc.figure.u.92) [ 840 0 R /XYZ 67.0 129.336 null ] (rfc.section.15.5) [ 840 0 R /XYZ 67.0 92.476 null ] (PROPERTY_getcontenttype) [ 840 0 R /XYZ 67.0 92.476 null ] (rfc.xref.RFC2616.36) [ 850 0 R /XYZ 67.0 701.5 null ] (rfc.xref.RFC2616.37) [ 850 0 R /XYZ 67.0 674.5 null ] (rfc.figure.u.93) [ 850 0 R /XYZ 67.0 570.0 null ] (rfc.section.15.6) [ 850 0 R /XYZ 67.0 533.14 null ] (PROPERTY_getetag) [ 850 0 R /XYZ 67.0 533.14 null ] (rfc.xref.RFC2616.38) [ 850 0 R /XYZ 67.0 490.668 null ] (rfc.xref.RFC2616.39) [ 850 0 R /XYZ 67.0 463.668 null ] (rfc.xref.RFC2616.40) [ 850 0 R /XYZ 67.0 371.668 null ] (rfc.figure.u.94) [ 850 0 R /XYZ 67.0 326.168 null ] (rfc.section.15.7) [ 850 0 R /XYZ 67.0 289.308 null ] (PROPERTY_getlastmodified) [ 850 0 R /XYZ 67.0 289.308 null ] (rfc.xref.RFC2616.41) [ 850 0 R /XYZ 67.0 246.836 null ] (rfc.xref.RFC2616.42) [ 850 0 R /XYZ 67.0 208.836 null ] (rfc.xref.RFC2616.43) [ 850 0 R /XYZ 67.0 99.836 null ] (rfc.figure.u.95) [ 865 0 R /XYZ 67.0 584.0 null ] (rfc.section.15.8) [ 865 0 R /XYZ 67.0 547.14 null ] (PROPERTY_lockdiscovery) [ 865 0 R /XYZ 67.0 547.14 null ] (rfc.figure.u.96) [ 865 0 R /XYZ 67.0 323.168 null ] (rfc.section.15.8.1) [ 865 0 R /XYZ 67.0 287.308 null ] (rfc.figure.u.97) [ 865 0 R /XYZ 67.0 267.417 null ] (rfc.figure.u.98) [ 865 0 R /XYZ 67.0 141.677 null ] (rfc.section.15.9) [ 873 0 R /XYZ 67.0 414.78 null ] (PROPERTY_resourcetype) [ 873 0 R /XYZ 67.0 414.78 null ] (rfc.figure.u.99) [ 873 0 R /XYZ 67.0 168.808 null ] (rfc.section.15.10) [ 873 0 R /XYZ 67.0 85.368 null ] (PROPERTY_supportedlock) [ 877 0 R /XYZ 67.0 725.0 null ] (rfc.figure.u.100) [ 877 0 R /XYZ 67.0 523.028 null ] (rfc.section.15.10.1) [ 877 0 R /XYZ 67.0 487.168 null ] (rfc.figure.u.101) [ 877 0 R /XYZ 67.0 467.277 null ] (rfc.figure.u.102) [ 877 0 R /XYZ 67.0 341.537 null ] (rfc.section.16) [ 885 0 R /XYZ 67.0 725.0 null ] (precondition.postcondition.xml.elements) [ 885 0 R /XYZ 67.0 725.0 null ] (rfc.iref.114) [ 885 0 R /XYZ 67.0 654.866 null ] (rfc.iref.115) [ 885 0 R /XYZ 67.0 654.866 null ] (rfc.figure.u.103) [ 885 0 R /XYZ 67.0 340.866 null ] (rfc.xref.RFC3744.3) [ 885 0 R /XYZ 67.0 167.266 null ] (rfc.xref.RFC3744.4) [ 885 0 R /XYZ 67.0 167.266 null ] (rfc.xref.RFC3253.6) [ 885 0 R /XYZ 67.0 167.266 null ] (rfc.xref.RFC3648.1) [ 885 0 R /XYZ 67.0 167.266 null ] (rfc.iref.116) [ 885 0 R /XYZ 67.0 114.266 null ] (rfc.iref.117) [ 885 0 R /XYZ 67.0 114.266 null ] (rfc.iref.118) [ 893 0 R /XYZ 67.0 655.0 null ] (rfc.iref.119) [ 893 0 R /XYZ 67.0 655.0 null ] (rfc.figure.u.104) [ 893 0 R /XYZ 67.0 542.0 null ] (rfc.iref.120) [ 893 0 R /XYZ 67.0 512.14 null ] (rfc.iref.121) [ 893 0 R /XYZ 67.0 512.14 null ] (rfc.figure.u.105) [ 893 0 R /XYZ 67.0 410.14 null ] (rfc.iref.122) [ 893 0 R /XYZ 67.0 380.28 null ] (rfc.iref.123) [ 893 0 R /XYZ 67.0 380.28 null ] (rfc.iref.124) [ 893 0 R /XYZ 67.0 311.28 null ] (rfc.iref.125) [ 893 0 R /XYZ 67.0 311.28 null ] (rfc.iref.126) [ 893 0 R /XYZ 67.0 220.28 null ] (rfc.iref.127) [ 893 0 R /XYZ 67.0 220.28 null ] (rfc.iref.128) [ 893 0 R /XYZ 67.0 151.28 null ] (rfc.iref.129) [ 893 0 R /XYZ 67.0 151.28 null ] (rfc.xref.RFC3253.7) [ 893 0 R /XYZ 67.0 105.78 null ] (rfc.section.17) [ 897 0 R /XYZ 67.0 725.0 null ] (xml-extensibility) [ 897 0 R /XYZ 67.0 725.0 null ] (rfc.xref.REC-XML-NAMES.2) [ 897 0 R /XYZ 67.0 697.866 null ] (rfc.section.18) [ 902 0 R /XYZ 67.0 725.0 null ] (dav.compliance.classes) [ 902 0 R /XYZ 67.0 725.0 null ] (rfc.xref.RFC2616.44) [ 902 0 R /XYZ 67.0 610.866 null ] (rfc.section.18.1) [ 902 0 R /XYZ 67.0 561.866 null ] (rfc.section.18.2) [ 902 0 R /XYZ 67.0 477.894 null ] (rfc.section.18.3) [ 902 0 R /XYZ 67.0 360.922 null ] (compliance-class-3) [ 902 0 R /XYZ 67.0 360.922 null ] (rfc.xref.RFC2518.6) [ 902 0 R /XYZ 67.0 336.95 null ] (rfc.figure.u.106) [ 902 0 R /XYZ 67.0 271.95 null ] (rfc.section.19) [ 907 0 R /XYZ 67.0 725.0 null ] (internationalization.considerations) [ 907 0 R /XYZ 67.0 725.0 null ] (rfc.xref.RFC2277.1) [ 907 0 R /XYZ 67.0 697.866 null ] (rfc.xref.RFC3629.1) [ 907 0 R /XYZ 67.0 653.866 null ] (rfc.xref.RFC2781.1) [ 907 0 R /XYZ 67.0 653.866 null ] (rfc.xref.RFC3023.1) [ 907 0 R /XYZ 67.0 631.866 null ] (rfc.xref.REC-XML.6) [ 907 0 R /XYZ 67.0 588.866 null ] (rfc.xref.RFC3023.2) [ 907 0 R /XYZ 67.0 545.866 null ] (rfc.section.20) [ 920 0 R /XYZ 67.0 725.0 null ] (security.considerations) [ 920 0 R /XYZ 67.0 725.0 null ] (rfc.xref.RFC2616.45) [ 920 0 R /XYZ 67.0 665.866 null ] (rfc.xref.RFC3023.3) [ 920 0 R /XYZ 67.0 665.866 null ] (rfc.section.20.1) [ 920 0 R /XYZ 67.0 604.866 null ] (rfc.xref.RFC2617.1) [ 920 0 R /XYZ 67.0 450.894 null ] (rfc.section.20.2) [ 920 0 R /XYZ 67.0 389.894 null ] (rfc.section.20.3) [ 920 0 R /XYZ 67.0 203.922 null ] (rfc.section.20.4) [ 920 0 R /XYZ 67.0 107.95 null ] (rfc.section.20.5) [ 927 0 R /XYZ 67.0 615.0 null ] (rfc.section.20.6) [ 927 0 R /XYZ 67.0 508.028 null ] (rfc.xref.REC-XML.7) [ 927 0 R /XYZ 67.0 484.056 null ] (rfc.xref.RFC3023.4) [ 927 0 R /XYZ 67.0 375.056 null ] (rfc.xref.REC-XML.8) [ 927 0 R /XYZ 67.0 267.056 null ] (rfc.section.20.7) [ 927 0 R /XYZ 67.0 206.056 null ] (risks.connected.with.lock.tokens) [ 927 0 R /XYZ 67.0 206.056 null ] (rfc.xref.RFC4122.2) [ 927 0 R /XYZ 67.0 182.084 null ] (rfc.xref.RFC4122.3) [ 927 0 R /XYZ 67.0 160.084 null ] (rfc.xref.RFC4122.4) [ 935 0 R /XYZ 67.0 662.0 null ] (rfc.section.20.8) [ 935 0 R /XYZ 67.0 612.0 null ] (rfc.section.21) [ 939 0 R /XYZ 67.0 725.0 null ] (rfc.section.21.1) [ 939 0 R /XYZ 67.0 690.866 null ] (rfc.xref.RFC2518.7) [ 939 0 R /XYZ 67.0 637.394 null ] (rfc.section.21.2) [ 939 0 R /XYZ 67.0 552.894 null ] (rfc.section.21.3) [ 939 0 R /XYZ 67.0 478.922 null ] (rfc.xref.RFC3864.1) [ 939 0 R /XYZ 67.0 454.95 null ] (rfc.section.21.3.1) [ 939 0 R /XYZ 67.0 427.95 null ] (rfc.section.21.3.2) [ 939 0 R /XYZ 67.0 297.059 null ] (rfc.section.21.3.3) [ 939 0 R /XYZ 67.0 166.168 null ] (rfc.section.21.3.4) [ 948 0 R /XYZ 67.0 672.0 null ] (rfc.section.21.3.5) [ 948 0 R /XYZ 67.0 541.109 null ] (rfc.section.21.3.6) [ 948 0 R /XYZ 67.0 410.218 null ] (rfc.section.21.3.7) [ 948 0 R /XYZ 67.0 279.327 null ] (rfc.section.21.4) [ 948 0 R /XYZ 67.0 147.436 null ] (STATUS_102) [ 958 0 R /XYZ 67.0 656.0 null ] (rfc.iref.133) [ 958 0 R /XYZ 67.0 656.0 null ] (rfc.iref.134) [ 958 0 R /XYZ 67.0 656.0 null ] (rfc.xref.RFC2518.8) [ 958 0 R /XYZ 67.0 645.0 null ] (rfc.section.22) [ 966 0 R /XYZ 67.0 725.0 null ] (rfc.section.23) [ 968 0 R /XYZ 67.0 725.0 null ] (rfc.figure.u.107) [ 968 0 R /XYZ 67.0 697.866 null ] (rfc.figure.u.108) [ 968 0 R /XYZ 67.0 643.37 null ] (rfc.figure.u.109) [ 968 0 R /XYZ 67.0 588.874 null ] (rfc.section.24) [ 970 0 R /XYZ 67.0 725.0 null ] (rfc.figure.u.110) [ 970 0 R /XYZ 67.0 697.866 null ] (rfc.figure.u.111) [ 970 0 R /XYZ 67.0 634.496 null ] (rfc.figure.u.112) [ 970 0 R /XYZ 67.0 571.126 null ] (rfc.figure.u.113) [ 970 0 R /XYZ 67.0 507.756 null ] (rfc.figure.u.114) [ 970 0 R /XYZ 67.0 435.512 null ] (rfc.references) [ 972 0 R /XYZ 67.0 725.0 null ] (rfc.references.1) [ 972 0 R /XYZ 67.0 690.866 null ] (REC-XML) [ 972 0 R /XYZ 67.0 671.894 null ] (REC-XML-INFOSET) [ 972 0 R /XYZ 67.0 633.894 null ] (REC-XML-NAMES) [ 972 0 R /XYZ 67.0 595.894 null ] (RFC2119) [ 972 0 R /XYZ 67.0 557.894 null ] (RFC2277) [ 972 0 R /XYZ 67.0 530.894 null ] (RFC2616) [ 972 0 R /XYZ 67.0 503.894 null ] (RFC2617) [ 972 0 R /XYZ 67.0 476.894 null ] (RFC3339) [ 972 0 R /XYZ 67.0 438.894 null ] (RFC3629) [ 972 0 R /XYZ 67.0 411.894 null ] (RFC3986) [ 972 0 R /XYZ 67.0 384.894 null ] (RFC4122) [ 972 0 R /XYZ 67.0 357.894 null ] (rfc.references.2) [ 972 0 R /XYZ 67.0 318.894 null ] (RFC2291) [ 972 0 R /XYZ 67.0 299.922 null ] (RFC2518) [ 972 0 R /XYZ 67.0 261.922 null ] (RFC2781) [ 972 0 R /XYZ 67.0 234.922 null ] (RFC3023) [ 972 0 R /XYZ 67.0 207.922 null ] (RFC3253) [ 972 0 R /XYZ 67.0 180.922 null ] (RFC3648) [ 972 0 R /XYZ 67.0 142.922 null ] (RFC3744) [ 972 0 R /XYZ 67.0 115.922 null ] (RFC3864) [ 972 0 R /XYZ 67.0 88.922 null ] (rfc.authors) [ 1008 0 R /XYZ 67.0 725.0 null ] (rfc.section.A) [ 1012 0 R /XYZ 67.0 725.0 null ] (xml-appendix) [ 1012 0 R /XYZ 67.0 725.0 null ] (rfc.section.A.1) [ 1012 0 R /XYZ 67.0 690.866 null ] (rfc.section.A.2) [ 1012 0 R /XYZ 67.0 616.894 null ] (rfc.section.A.3) [ 1012 0 R /XYZ 67.0 488.922 null ] (rfc.figure.u.115) [ 1012 0 R /XYZ 67.0 443.95 null ] (rfc.section.A.4) [ 1012 0 R /XYZ 67.0 248.65 null ] (rfc.figure.u.116) [ 1012 0 R /XYZ 67.0 159.678 null ] (rfc.figure.u.117) [ 1014 0 R /XYZ 67.0 699.0 null ] (rfc.figure.u.118) [ 1014 0 R /XYZ 67.0 563.56 null ] (rfc.section.B) [ 1018 0 R /XYZ 67.0 725.0 null ] (rfc.section.C) [ 1020 0 R /XYZ 67.0 725.0 null ] (opaquelocktoken.lock.token.uri.scheme) [ 1020 0 R /XYZ 67.0 725.0 null ] (rfc.xref.RFC2518.9) [ 1020 0 R /XYZ 67.0 697.866 null ] (rfc.figure.u.119) [ 1020 0 R /XYZ 67.0 600.866 null ] (rfc.xref.RFC4122.5) [ 1020 0 R /XYZ 67.0 586.006 null ] (rfc.xref.RFC3986.13) [ 1020 0 R /XYZ 67.0 526.846 null ] (rfc.section.D) [ 1026 0 R /XYZ 67.0 725.0 null ] (lock-null) [ 1026 0 R /XYZ 67.0 725.0 null ] (rfc.section.D.1) [ 1026 0 R /XYZ 67.0 389.866 null ] (rfc.xref.RFC2518.10) [ 1026 0 R /XYZ 67.0 354.894 null ] (rfc.section.E) [ 1031 0 R /XYZ 67.0 725.0 null ] (rfc.figure.u.120) [ 1031 0 R /XYZ 67.0 481.866 null ] (rfc.xref.RFC2617.2) [ 1031 0 R /XYZ 67.0 395.566 null ] (rfc.figure.u.121) [ 1031 0 R /XYZ 67.0 190.566 null ] (rfc.section.F) [ 1036 0 R /XYZ 67.0 725.0 null ] (rfc.section.F.1) [ 1036 0 R /XYZ 67.0 647.866 null ] (rfc.xref.RFC3253.8) [ 1036 0 R /XYZ 67.0 452.394 null ] (rfc.xref.RFC3253.9) [ 1036 0 R /XYZ 67.0 366.394 null ] (rfc.section.F.2) [ 1036 0 R /XYZ 67.0 113.894 null ] (rfc.iref.135) [ 1054 0 R /XYZ 67.0 695.5 null ] (rfc.xref.RFC2518.11) [ 1054 0 R /XYZ 67.0 459.5 null ] (rfc.section.F.3) [ 1054 0 R /XYZ 67.0 418.0 null ] (PROPERTY_source) [ 1054 0 R /XYZ 67.0 362.028 null ] (rfc.iref.136) [ 1054 0 R /XYZ 67.0 362.028 null ] (rfc.iref.137) [ 1054 0 R /XYZ 67.0 362.028 null ] (rfc.xref.RFC2518.12) [ 1054 0 R /XYZ 67.0 362.028 null ] (rfc.xref.RFC2518.13) [ 1054 0 R /XYZ 67.0 287.028 null ] (HEADER_Status-URI) [ 1054 0 R /XYZ 67.0 244.028 null ] (rfc.xref.RFC2518.14) [ 1054 0 R /XYZ 67.0 244.028 null ] (rfc.xref.RFC2518.15) [ 1054 0 R /XYZ 67.0 233.028 null ] (rfc.copyright) [ 1054 0 R /XYZ 67.0 171.028 null ] (rfc.ipr) [ 1075 0 R /XYZ 67.0 725.0 null ] (rfc.index) [ 1081 0 R /XYZ 67.0 725.0 null ] ] >> >>
+ >>
+endobj
+3 0 obj
+<<
+/Font << /F5 1435 0 R /F6 1436 0 R /F9 1437 0 R /F7 1438 0 R >>
+/ProcSet [ /PDF /ImageC /Text ] >>
+endobj
+13 0 obj
+<<
+/S /GoTo
+/D [468 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+15 0 obj
+<<
+/S /GoTo
+/D [495 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+17 0 obj
+<<
+/S /GoTo
+/D [503 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+19 0 obj
+<<
+/S /GoTo
+/D [510 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+21 0 obj
+<<
+/S /GoTo
+/D [510 0 R /XYZ 67.0 690.866 null]
+>>
+endobj
+23 0 obj
+<<
+/S /GoTo
+/D [510 0 R /XYZ 67.0 487.894 null]
+>>
+endobj
+25 0 obj
+<<
+/S /GoTo
+/D [510 0 R /XYZ 67.0 391.922 null]
+>>
+endobj
+27 0 obj
+<<
+/S /GoTo
+/D [515 0 R /XYZ 67.0 260.0 null]
+>>
+endobj
+29 0 obj
+<<
+/S /GoTo
+/D [517 0 R /XYZ 67.0 262.38 null]
+>>
+endobj
+31 0 obj
+<<
+/S /GoTo
+/D [521 0 R /XYZ 67.0 681.0 null]
+>>
+endobj
+33 0 obj
+<<
+/S /GoTo
+/D [523 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+35 0 obj
+<<
+/S /GoTo
+/D [523 0 R /XYZ 67.0 626.866 null]
+>>
+endobj
+37 0 obj
+<<
+/S /GoTo
+/D [523 0 R /XYZ 67.0 434.894 null]
+>>
+endobj
+39 0 obj
+<<
+/S /GoTo
+/D [530 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+41 0 obj
+<<
+/S /GoTo
+/D [530 0 R /XYZ 67.0 593.866 null]
+>>
+endobj
+43 0 obj
+<<
+/S /GoTo
+/D [530 0 R /XYZ 67.0 239.894 null]
+>>
+endobj
+45 0 obj
+<<
+/S /GoTo
+/D [537 0 R /XYZ 67.0 442.0 null]
+>>
+endobj
+47 0 obj
+<<
+/S /GoTo
+/D [537 0 R /XYZ 67.0 303.028 null]
+>>
+endobj
+49 0 obj
+<<
+/S /GoTo
+/D [537 0 R /XYZ 67.0 133.056 null]
+>>
+endobj
+51 0 obj
+<<
+/S /GoTo
+/D [543 0 R /XYZ 67.0 498.0 null]
+>>
+endobj
+53 0 obj
+<<
+/S /GoTo
+/D [543 0 R /XYZ 67.0 176.028 null]
+>>
+endobj
+55 0 obj
+<<
+/S /GoTo
+/D [551 0 R /XYZ 67.0 692.0 null]
+>>
+endobj
+57 0 obj
+<<
+/S /GoTo
+/D [553 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+59 0 obj
+<<
+/S /GoTo
+/D [553 0 R /XYZ 67.0 391.866 null]
+>>
+endobj
+61 0 obj
+<<
+/S /GoTo
+/D [553 0 R /XYZ 67.0 317.894 null]
+>>
+endobj
+63 0 obj
+<<
+/S /GoTo
+/D [557 0 R /XYZ 67.0 574.0 null]
+>>
+endobj
+65 0 obj
+<<
+/S /GoTo
+/D [561 0 R /XYZ 67.0 659.0 null]
+>>
+endobj
+67 0 obj
+<<
+/S /GoTo
+/D [561 0 R /XYZ 67.0 119.028 null]
+>>
+endobj
+69 0 obj
+<<
+/S /GoTo
+/D [568 0 R /XYZ 67.0 562.0 null]
+>>
+endobj
+71 0 obj
+<<
+/S /GoTo
+/D [568 0 R /XYZ 67.0 348.949 null]
+>>
+endobj
+73 0 obj
+<<
+/S /GoTo
+/D [572 0 R /XYZ 67.0 505.7 null]
+>>
+endobj
+75 0 obj
+<<
+/S /GoTo
+/D [572 0 R /XYZ 67.0 333.728 null]
+>>
+endobj
+77 0 obj
+<<
+/S /GoTo
+/D [576 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+79 0 obj
+<<
+/S /GoTo
+/D [576 0 R /XYZ 67.0 690.866 null]
+>>
+endobj
+81 0 obj
+<<
+/S /GoTo
+/D [576 0 R /XYZ 67.0 616.894 null]
+>>
+endobj
+83 0 obj
+<<
+/S /GoTo
+/D [576 0 R /XYZ 67.0 315.922 null]
+>>
+endobj
+85 0 obj
+<<
+/S /GoTo
+/D [587 0 R /XYZ 67.0 645.0 null]
+>>
+endobj
+90 0 obj
+<<
+/S /GoTo
+/D [587 0 R /XYZ 67.0 412.529 null]
+>>
+endobj
+92 0 obj
+<<
+/S /GoTo
+/D [587 0 R /XYZ 67.0 327.557 null]
+>>
+endobj
+94 0 obj
+<<
+/S /GoTo
+/D [587 0 R /XYZ 67.0 232.585 null]
+>>
+endobj
+96 0 obj
+<<
+/S /GoTo
+/D [594 0 R /XYZ 67.0 556.0 null]
+>>
+endobj
+98 0 obj
+<<
+/S /GoTo
+/D [594 0 R /XYZ 67.0 438.028 null]
+>>
+endobj
+100 0 obj
+<<
+/S /GoTo
+/D [600 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+102 0 obj
+<<
+/S /GoTo
+/D [600 0 R /XYZ 67.0 690.866 null]
+>>
+endobj
+104 0 obj
+<<
+/S /GoTo
+/D [600 0 R /XYZ 67.0 73.894 null]
+>>
+endobj
+106 0 obj
+<<
+/S /GoTo
+/D [607 0 R /XYZ 67.0 635.109 null]
+>>
+endobj
+108 0 obj
+<<
+/S /GoTo
+/D [607 0 R /XYZ 67.0 471.218 null]
+>>
+endobj
+110 0 obj
+<<
+/S /GoTo
+/D [612 0 R /XYZ 67.0 525.68 null]
+>>
+endobj
+112 0 obj
+<<
+/S /GoTo
+/D [614 0 R /XYZ 67.0 394.4 null]
+>>
+endobj
+114 0 obj
+<<
+/S /GoTo
+/D [620 0 R /XYZ 67.0 547.0 null]
+>>
+endobj
+116 0 obj
+<<
+/S /GoTo
+/D [620 0 R /XYZ 67.0 302.069 null]
+>>
+endobj
+118 0 obj
+<<
+/S /GoTo
+/D [627 0 R /XYZ 67.0 682.0 null]
+>>
+endobj
+120 0 obj
+<<
+/S /GoTo
+/D [627 0 R /XYZ 67.0 432.109 null]
+>>
+endobj
+122 0 obj
+<<
+/S /GoTo
+/D [632 0 R /XYZ 67.0 503.82 null]
+>>
+endobj
+124 0 obj
+<<
+/S /GoTo
+/D [632 0 R /XYZ 67.0 268.848 null]
+>>
+endobj
+126 0 obj
+<<
+/S /GoTo
+/D [636 0 R /XYZ 67.0 650.0 null]
+>>
+endobj
+128 0 obj
+<<
+/S /GoTo
+/D [636 0 R /XYZ 67.0 498.529 null]
+>>
+endobj
+130 0 obj
+<<
+/S /GoTo
+/D [636 0 R /XYZ 67.0 370.557 null]
+>>
+endobj
+132 0 obj
+<<
+/S /GoTo
+/D [636 0 R /XYZ 67.0 296.585 null]
+>>
+endobj
+134 0 obj
+<<
+/S /GoTo
+/D [636 0 R /XYZ 67.0 159.613 null]
+>>
+endobj
+136 0 obj
+<<
+/S /GoTo
+/D [641 0 R /XYZ 67.0 489.0 null]
+>>
+endobj
+138 0 obj
+<<
+/S /GoTo
+/D [641 0 R /XYZ 67.0 174.069 null]
+>>
+endobj
+140 0 obj
+<<
+/S /GoTo
+/D [641 0 R /XYZ 67.0 144.097 null]
+>>
+endobj
+142 0 obj
+<<
+/S /GoTo
+/D [643 0 R /XYZ 67.0 563.0 null]
+>>
+endobj
+144 0 obj
+<<
+/S /GoTo
+/D [643 0 R /XYZ 67.0 483.109 null]
+>>
+endobj
+146 0 obj
+<<
+/S /GoTo
+/D [643 0 R /XYZ 67.0 324.137 null]
+>>
+endobj
+148 0 obj
+<<
+/S /GoTo
+/D [643 0 R /XYZ 67.0 211.246 null]
+>>
+endobj
+150 0 obj
+<<
+/S /GoTo
+/D [647 0 R /XYZ 67.0 682.0 null]
+>>
+endobj
+152 0 obj
+<<
+/S /GoTo
+/D [647 0 R /XYZ 67.0 181.109 null]
+>>
+endobj
+154 0 obj
+<<
+/S /GoTo
+/D [652 0 R /XYZ 67.0 617.0 null]
+>>
+endobj
+156 0 obj
+<<
+/S /GoTo
+/D [652 0 R /XYZ 67.0 249.109 null]
+>>
+endobj
+158 0 obj
+<<
+/S /GoTo
+/D [654 0 R /XYZ 67.0 709.0 null]
+>>
+endobj
+160 0 obj
+<<
+/S /GoTo
+/D [654 0 R /XYZ 67.0 516.809 null]
+>>
+endobj
+162 0 obj
+<<
+/S /GoTo
+/D [654 0 R /XYZ 67.0 183.298 null]
+>>
+endobj
+164 0 obj
+<<
+/S /GoTo
+/D [656 0 R /XYZ 67.0 586.0 null]
+>>
+endobj
+166 0 obj
+<<
+/S /GoTo
+/D [656 0 R /XYZ 67.0 420.109 null]
+>>
+endobj
+168 0 obj
+<<
+/S /GoTo
+/D [661 0 R /XYZ 67.0 682.0 null]
+>>
+endobj
+170 0 obj
+<<
+/S /GoTo
+/D [661 0 R /XYZ 67.0 613.109 null]
+>>
+endobj
+172 0 obj
+<<
+/S /GoTo
+/D [661 0 R /XYZ 67.0 244.218 null]
+>>
+endobj
+174 0 obj
+<<
+/S /GoTo
+/D [663 0 R /XYZ 67.0 678.28 null]
+>>
+endobj
+176 0 obj
+<<
+/S /GoTo
+/D [663 0 R /XYZ 67.0 317.909 null]
+>>
+endobj
+178 0 obj
+<<
+/S /GoTo
+/D [663 0 R /XYZ 67.0 180.937 null]
+>>
+endobj
+180 0 obj
+<<
+/S /GoTo
+/D [667 0 R /XYZ 67.0 650.0 null]
+>>
+endobj
+182 0 obj
+<<
+/S /GoTo
+/D [667 0 R /XYZ 67.0 495.109 null]
+>>
+endobj
+184 0 obj
+<<
+/S /GoTo
+/D [667 0 R /XYZ 67.0 243.218 null]
+>>
+endobj
+186 0 obj
+<<
+/S /GoTo
+/D [667 0 R /XYZ 67.0 152.327 null]
+>>
+endobj
+188 0 obj
+<<
+/S /GoTo
+/D [669 0 R /XYZ 67.0 582.69 null]
+>>
+endobj
+190 0 obj
+<<
+/S /GoTo
+/D [669 0 R /XYZ 67.0 353.799 null]
+>>
+endobj
+195 0 obj
+<<
+/S /GoTo
+/D [671 0 R /XYZ 67.0 376.64 null]
+>>
+endobj
+197 0 obj
+<<
+/S /GoTo
+/D [673 0 R /XYZ 67.0 541.68 null]
+>>
+endobj
+199 0 obj
+<<
+/S /GoTo
+/D [675 0 R /XYZ 67.0 617.0 null]
+>>
+endobj
+201 0 obj
+<<
+/S /GoTo
+/D [675 0 R /XYZ 67.0 374.028 null]
+>>
+endobj
+203 0 obj
+<<
+/S /GoTo
+/D [675 0 R /XYZ 67.0 210.137 null]
+>>
+endobj
+205 0 obj
+<<
+/S /GoTo
+/D [681 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+207 0 obj
+<<
+/S /GoTo
+/D [681 0 R /XYZ 67.0 637.866 null]
+>>
+endobj
+209 0 obj
+<<
+/S /GoTo
+/D [681 0 R /XYZ 67.0 221.714 null]
+>>
+endobj
+211 0 obj
+<<
+/S /GoTo
+/D [686 0 R /XYZ 67.0 445.0 null]
+>>
+endobj
+213 0 obj
+<<
+/S /GoTo
+/D [686 0 R /XYZ 67.0 266.168 null]
+>>
+endobj
+215 0 obj
+<<
+/S /GoTo
+/D [686 0 R /XYZ 67.0 193.196 null]
+>>
+endobj
+217 0 obj
+<<
+/S /GoTo
+/D [693 0 R /XYZ 67.0 639.0 null]
+>>
+endobj
+219 0 obj
+<<
+/S /GoTo
+/D [693 0 R /XYZ 67.0 253.349 null]
+>>
+endobj
+221 0 obj
+<<
+/S /GoTo
+/D [701 0 R /XYZ 67.0 693.0 null]
+>>
+endobj
+223 0 obj
+<<
+/S /GoTo
+/D [701 0 R /XYZ 67.0 507.109 null]
+>>
+endobj
+225 0 obj
+<<
+/S /GoTo
+/D [701 0 R /XYZ 67.0 384.218 null]
+>>
+endobj
+227 0 obj
+<<
+/S /GoTo
+/D [701 0 R /XYZ 67.0 148.867 null]
+>>
+endobj
+229 0 obj
+<<
+/S /GoTo
+/D [705 0 R /XYZ 67.0 671.0 null]
+>>
+endobj
+231 0 obj
+<<
+/S /GoTo
+/D [705 0 R /XYZ 67.0 496.389 null]
+>>
+endobj
+233 0 obj
+<<
+/S /GoTo
+/D [705 0 R /XYZ 67.0 309.338 null]
+>>
+endobj
+235 0 obj
+<<
+/S /GoTo
+/D [705 0 R /XYZ 67.0 169.007 null]
+>>
+endobj
+237 0 obj
+<<
+/S /GoTo
+/D [709 0 R /XYZ 67.0 598.14 null]
+>>
+endobj
+239 0 obj
+<<
+/S /GoTo
+/D [709 0 R /XYZ 67.0 462.308 null]
+>>
+endobj
+241 0 obj
+<<
+/S /GoTo
+/D [709 0 R /XYZ 67.0 261.476 null]
+>>
+endobj
+243 0 obj
+<<
+/S /GoTo
+/D [715 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+245 0 obj
+<<
+/S /GoTo
+/D [715 0 R /XYZ 67.0 669.866 null]
+>>
+endobj
+247 0 obj
+<<
+/S /GoTo
+/D [715 0 R /XYZ 67.0 606.894 null]
+>>
+endobj
+249 0 obj
+<<
+/S /GoTo
+/D [715 0 R /XYZ 67.0 510.922 null]
+>>
+endobj
+251 0 obj
+<<
+/S /GoTo
+/D [715 0 R /XYZ 67.0 436.95 null]
+>>
+endobj
+253 0 obj
+<<
+/S /GoTo
+/D [715 0 R /XYZ 67.0 351.978 null]
+>>
+endobj
+255 0 obj
+<<
+/S /GoTo
+/D [720 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+257 0 obj
+<<
+/S /GoTo
+/D [720 0 R /XYZ 67.0 625.866 null]
+>>
+endobj
+259 0 obj
+<<
+/S /GoTo
+/D [720 0 R /XYZ 67.0 540.894 null]
+>>
+endobj
+261 0 obj
+<<
+/S /GoTo
+/D [722 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+263 0 obj
+<<
+/S /GoTo
+/D [722 0 R /XYZ 67.0 432.866 null]
+>>
+endobj
+265 0 obj
+<<
+/S /GoTo
+/D [722 0 R /XYZ 67.0 347.894 null]
+>>
+endobj
+267 0 obj
+<<
+/S /GoTo
+/D [722 0 R /XYZ 67.0 197.922 null]
+>>
+endobj
+269 0 obj
+<<
+/S /GoTo
+/D [736 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+271 0 obj
+<<
+/S /GoTo
+/D [736 0 R /XYZ 67.0 625.866 null]
+>>
+endobj
+273 0 obj
+<<
+/S /GoTo
+/D [736 0 R /XYZ 67.0 513.174 null]
+>>
+endobj
+275 0 obj
+<<
+/S /GoTo
+/D [736 0 R /XYZ 67.0 399.342 null]
+>>
+endobj
+277 0 obj
+<<
+/S /GoTo
+/D [736 0 R /XYZ 67.0 274.51 null]
+>>
+endobj
+279 0 obj
+<<
+/S /GoTo
+/D [736 0 R /XYZ 67.0 155.678 null]
+>>
+endobj
+284 0 obj
+<<
+/S /GoTo
+/D [752 0 R /XYZ 67.0 624.14 null]
+>>
+endobj
+286 0 obj
+<<
+/S /GoTo
+/D [752 0 R /XYZ 67.0 521.308 null]
+>>
+endobj
+288 0 obj
+<<
+/S /GoTo
+/D [752 0 R /XYZ 67.0 375.476 null]
+>>
+endobj
+290 0 obj
+<<
+/S /GoTo
+/D [752 0 R /XYZ 67.0 228.644 null]
+>>
+endobj
+292 0 obj
+<<
+/S /GoTo
+/D [762 0 R /XYZ 67.0 703.0 null]
+>>
+endobj
+294 0 obj
+<<
+/S /GoTo
+/D [762 0 R /XYZ 67.0 600.168 null]
+>>
+endobj
+296 0 obj
+<<
+/S /GoTo
+/D [762 0 R /XYZ 67.0 486.336 null]
+>>
+endobj
+298 0 obj
+<<
+/S /GoTo
+/D [762 0 R /XYZ 67.0 345.504 null]
+>>
+endobj
+300 0 obj
+<<
+/S /GoTo
+/D [762 0 R /XYZ 67.0 242.672 null]
+>>
+endobj
+302 0 obj
+<<
+/S /GoTo
+/D [762 0 R /XYZ 67.0 123.84 null]
+>>
+endobj
+304 0 obj
+<<
+/S /GoTo
+/D [779 0 R /XYZ 67.0 651.14 null]
+>>
+endobj
+306 0 obj
+<<
+/S /GoTo
+/D [779 0 R /XYZ 67.0 499.308 null]
+>>
+endobj
+308 0 obj
+<<
+/S /GoTo
+/D [779 0 R /XYZ 67.0 276.476 null]
+>>
+endobj
+310 0 obj
+<<
+/S /GoTo
+/D [779 0 R /XYZ 67.0 113.644 null]
+>>
+endobj
+312 0 obj
+<<
+/S /GoTo
+/D [789 0 R /XYZ 67.0 619.14 null]
+>>
+endobj
+314 0 obj
+<<
+/S /GoTo
+/D [789 0 R /XYZ 67.0 494.308 null]
+>>
+endobj
+316 0 obj
+<<
+/S /GoTo
+/D [789 0 R /XYZ 67.0 391.476 null]
+>>
+endobj
+318 0 obj
+<<
+/S /GoTo
+/D [789 0 R /XYZ 67.0 217.644 null]
+>>
+endobj
+320 0 obj
+<<
+/S /GoTo
+/D [808 0 R /XYZ 67.0 708.0 null]
+>>
+endobj
+322 0 obj
+<<
+/S /GoTo
+/D [808 0 R /XYZ 67.0 480.308 null]
+>>
+endobj
+324 0 obj
+<<
+/S /GoTo
+/D [808 0 R /XYZ 67.0 361.476 null]
+>>
+endobj
+326 0 obj
+<<
+/S /GoTo
+/D [808 0 R /XYZ 67.0 187.644 null]
+>>
+endobj
+328 0 obj
+<<
+/S /GoTo
+/D [823 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+330 0 obj
+<<
+/S /GoTo
+/D [823 0 R /XYZ 67.0 606.168 null]
+>>
+endobj
+332 0 obj
+<<
+/S /GoTo
+/D [823 0 R /XYZ 67.0 487.336 null]
+>>
+endobj
+334 0 obj
+<<
+/S /GoTo
+/D [831 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+336 0 obj
+<<
+/S /GoTo
+/D [831 0 R /XYZ 67.0 475.866 null]
+>>
+endobj
+338 0 obj
+<<
+/S /GoTo
+/D [831 0 R /XYZ 67.0 199.034 null]
+>>
+endobj
+340 0 obj
+<<
+/S /GoTo
+/D [840 0 R /XYZ 67.0 536.14 null]
+>>
+endobj
+342 0 obj
+<<
+/S /GoTo
+/D [840 0 R /XYZ 67.0 303.308 null]
+>>
+endobj
+344 0 obj
+<<
+/S /GoTo
+/D [840 0 R /XYZ 67.0 92.476 null]
+>>
+endobj
+346 0 obj
+<<
+/S /GoTo
+/D [850 0 R /XYZ 67.0 533.14 null]
+>>
+endobj
+348 0 obj
+<<
+/S /GoTo
+/D [850 0 R /XYZ 67.0 289.308 null]
+>>
+endobj
+350 0 obj
+<<
+/S /GoTo
+/D [865 0 R /XYZ 67.0 547.14 null]
+>>
+endobj
+352 0 obj
+<<
+/S /GoTo
+/D [865 0 R /XYZ 67.0 287.308 null]
+>>
+endobj
+354 0 obj
+<<
+/S /GoTo
+/D [873 0 R /XYZ 67.0 414.78 null]
+>>
+endobj
+356 0 obj
+<<
+/S /GoTo
+/D [877 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+358 0 obj
+<<
+/S /GoTo
+/D [877 0 R /XYZ 67.0 487.168 null]
+>>
+endobj
+360 0 obj
+<<
+/S /GoTo
+/D [885 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+362 0 obj
+<<
+/S /GoTo
+/D [897 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+367 0 obj
+<<
+/S /GoTo
+/D [902 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+369 0 obj
+<<
+/S /GoTo
+/D [902 0 R /XYZ 67.0 561.866 null]
+>>
+endobj
+371 0 obj
+<<
+/S /GoTo
+/D [902 0 R /XYZ 67.0 477.894 null]
+>>
+endobj
+373 0 obj
+<<
+/S /GoTo
+/D [902 0 R /XYZ 67.0 360.922 null]
+>>
+endobj
+375 0 obj
+<<
+/S /GoTo
+/D [907 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+377 0 obj
+<<
+/S /GoTo
+/D [920 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+379 0 obj
+<<
+/S /GoTo
+/D [920 0 R /XYZ 67.0 604.866 null]
+>>
+endobj
+381 0 obj
+<<
+/S /GoTo
+/D [920 0 R /XYZ 67.0 389.894 null]
+>>
+endobj
+383 0 obj
+<<
+/S /GoTo
+/D [920 0 R /XYZ 67.0 203.922 null]
+>>
+endobj
+385 0 obj
+<<
+/S /GoTo
+/D [920 0 R /XYZ 67.0 107.95 null]
+>>
+endobj
+387 0 obj
+<<
+/S /GoTo
+/D [927 0 R /XYZ 67.0 615.0 null]
+>>
+endobj
+389 0 obj
+<<
+/S /GoTo
+/D [927 0 R /XYZ 67.0 508.028 null]
+>>
+endobj
+391 0 obj
+<<
+/S /GoTo
+/D [927 0 R /XYZ 67.0 206.056 null]
+>>
+endobj
+393 0 obj
+<<
+/S /GoTo
+/D [935 0 R /XYZ 67.0 612.0 null]
+>>
+endobj
+395 0 obj
+<<
+/S /GoTo
+/D [939 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+397 0 obj
+<<
+/S /GoTo
+/D [939 0 R /XYZ 67.0 690.866 null]
+>>
+endobj
+399 0 obj
+<<
+/S /GoTo
+/D [939 0 R /XYZ 67.0 552.894 null]
+>>
+endobj
+401 0 obj
+<<
+/S /GoTo
+/D [939 0 R /XYZ 67.0 478.922 null]
+>>
+endobj
+403 0 obj
+<<
+/S /GoTo
+/D [939 0 R /XYZ 67.0 427.95 null]
+>>
+endobj
+405 0 obj
+<<
+/S /GoTo
+/D [939 0 R /XYZ 67.0 297.059 null]
+>>
+endobj
+407 0 obj
+<<
+/S /GoTo
+/D [939 0 R /XYZ 67.0 166.168 null]
+>>
+endobj
+409 0 obj
+<<
+/S /GoTo
+/D [948 0 R /XYZ 67.0 672.0 null]
+>>
+endobj
+411 0 obj
+<<
+/S /GoTo
+/D [948 0 R /XYZ 67.0 541.109 null]
+>>
+endobj
+413 0 obj
+<<
+/S /GoTo
+/D [948 0 R /XYZ 67.0 410.218 null]
+>>
+endobj
+415 0 obj
+<<
+/S /GoTo
+/D [948 0 R /XYZ 67.0 279.327 null]
+>>
+endobj
+417 0 obj
+<<
+/S /GoTo
+/D [948 0 R /XYZ 67.0 147.436 null]
+>>
+endobj
+419 0 obj
+<<
+/S /GoTo
+/D [966 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+421 0 obj
+<<
+/S /GoTo
+/D [968 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+423 0 obj
+<<
+/S /GoTo
+/D [970 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+425 0 obj
+<<
+/S /GoTo
+/D [972 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+427 0 obj
+<<
+/S /GoTo
+/D [972 0 R /XYZ 67.0 690.866 null]
+>>
+endobj
+429 0 obj
+<<
+/S /GoTo
+/D [972 0 R /XYZ 67.0 318.894 null]
+>>
+endobj
+431 0 obj
+<<
+/S /GoTo
+/D [1008 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+433 0 obj
+<<
+/S /GoTo
+/D [1012 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+435 0 obj
+<<
+/S /GoTo
+/D [1012 0 R /XYZ 67.0 690.866 null]
+>>
+endobj
+437 0 obj
+<<
+/S /GoTo
+/D [1012 0 R /XYZ 67.0 616.894 null]
+>>
+endobj
+439 0 obj
+<<
+/S /GoTo
+/D [1012 0 R /XYZ 67.0 488.922 null]
+>>
+endobj
+441 0 obj
+<<
+/S /GoTo
+/D [1012 0 R /XYZ 67.0 248.65 null]
+>>
+endobj
+443 0 obj
+<<
+/S /GoTo
+/D [1018 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+448 0 obj
+<<
+/S /GoTo
+/D [1020 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+450 0 obj
+<<
+/S /GoTo
+/D [1026 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+452 0 obj
+<<
+/S /GoTo
+/D [1026 0 R /XYZ 67.0 389.866 null]
+>>
+endobj
+454 0 obj
+<<
+/S /GoTo
+/D [1031 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+456 0 obj
+<<
+/S /GoTo
+/D [1036 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+458 0 obj
+<<
+/S /GoTo
+/D [1036 0 R /XYZ 67.0 647.866 null]
+>>
+endobj
+460 0 obj
+<<
+/S /GoTo
+/D [1036 0 R /XYZ 67.0 113.894 null]
+>>
+endobj
+462 0 obj
+<<
+/S /GoTo
+/D [1054 0 R /XYZ 67.0 418.0 null]
+>>
+endobj
+464 0 obj
+<<
+/S /GoTo
+/D [1075 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+466 0 obj
+<<
+/S /GoTo
+/D [1081 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+471 0 obj
+<<
+/S /GoTo
+/D [972 0 R /XYZ 67.0 299.922 null]
+>>
+endobj
+474 0 obj
+<<
+/S /GoTo
+/D [972 0 R /XYZ 67.0 180.922 null]
+>>
+endobj
+487 0 obj
+<<
+/S /GoTo
+/D [972 0 R /XYZ 67.0 671.894 null]
+>>
+endobj
+498 0 obj
+<<
+/S /GoTo
+/D [972 0 R /XYZ 67.0 503.894 null]
+>>
+endobj
+501 0 obj
+<<
+/S /GoTo
+/D [972 0 R /XYZ 67.0 557.894 null]
+>>
+endobj
+506 0 obj
+<<
+/S /GoTo
+/D [972 0 R /XYZ 67.0 384.894 null]
+>>
+endobj
+513 0 obj
+<<
+/S /GoTo
+/D [972 0 R /XYZ 67.0 633.894 null]
+>>
+endobj
+541 0 obj
+<<
+/S /GoTo
+/D [972 0 R /XYZ 67.0 115.922 null]
+>>
+endobj
+547 0 obj
+<<
+/S /GoTo
+/D [972 0 R /XYZ 67.0 357.894 null]
+>>
+endobj
+564 0 obj
+<<
+/S /GoTo
+/D [972 0 R /XYZ 67.0 261.922 null]
+>>
+endobj
+581 0 obj
+<<
+/S /GoTo
+/D [972 0 R /XYZ 67.0 595.894 null]
+>>
+endobj
+836 0 obj
+<<
+/S /GoTo
+/D [972 0 R /XYZ 67.0 438.894 null]
+>>
+endobj
+891 0 obj
+<<
+/S /GoTo
+/D [972 0 R /XYZ 67.0 142.922 null]
+>>
+endobj
+910 0 obj
+<<
+/S /GoTo
+/D [972 0 R /XYZ 67.0 530.894 null]
+>>
+endobj
+912 0 obj
+<<
+/S /GoTo
+/D [972 0 R /XYZ 67.0 411.894 null]
+>>
+endobj
+914 0 obj
+<<
+/S /GoTo
+/D [972 0 R /XYZ 67.0 234.922 null]
+>>
+endobj
+916 0 obj
+<<
+/S /GoTo
+/D [972 0 R /XYZ 67.0 207.922 null]
+>>
+endobj
+925 0 obj
+<<
+/S /GoTo
+/D [972 0 R /XYZ 67.0 476.894 null]
+>>
+endobj
+944 0 obj
+<<
+/S /GoTo
+/D [972 0 R /XYZ 67.0 88.922 null]
+>>
+endobj
+1089 0 obj
+<<
+ /First 1091 0 R
+ /Last 1434 0 R
+>> endobj
+1090 0 obj
+<<
+/S /GoTo
+/D [6 0 R /XYZ 67.0 520.084 null]
+>>
+endobj
+1092 0 obj
+<<
+/S /GoTo
+/D [6 0 R /XYZ 67.0 429.95 null]
+>>
+endobj
+1094 0 obj
+<<
+/S /GoTo
+/D [6 0 R /XYZ 67.0 372.816 null]
+>>
+endobj
+1096 0 obj
+<<
+/S /GoTo
+/D [10 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+1098 0 obj
+<<
+/S /GoTo
+/D [468 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+1102 0 obj
+<<
+/S /GoTo
+/D [510 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+1106 0 obj
+<<
+/S /GoTo
+/D [510 0 R /XYZ 67.0 391.922 null]
+>>
+endobj
+1111 0 obj
+<<
+/S /GoTo
+/D [523 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+1113 0 obj
+<<
+/S /GoTo
+/D [523 0 R /XYZ 67.0 626.866 null]
+>>
+endobj
+1115 0 obj
+<<
+/S /GoTo
+/D [523 0 R /XYZ 67.0 434.894 null]
+>>
+endobj
+1117 0 obj
+<<
+/S /GoTo
+/D [530 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+1119 0 obj
+<<
+/S /GoTo
+/D [530 0 R /XYZ 67.0 593.866 null]
+>>
+endobj
+1121 0 obj
+<<
+/S /GoTo
+/D [530 0 R /XYZ 67.0 239.894 null]
+>>
+endobj
+1124 0 obj
+<<
+/S /GoTo
+/D [537 0 R /XYZ 67.0 303.028 null]
+>>
+endobj
+1126 0 obj
+<<
+/S /GoTo
+/D [537 0 R /XYZ 67.0 133.056 null]
+>>
+endobj
+1128 0 obj
+<<
+/S /GoTo
+/D [543 0 R /XYZ 67.0 498.0 null]
+>>
+endobj
+1132 0 obj
+<<
+/S /GoTo
+/D [553 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+1136 0 obj
+<<
+/S /GoTo
+/D [557 0 R /XYZ 67.0 574.0 null]
+>>
+endobj
+1138 0 obj
+<<
+/S /GoTo
+/D [561 0 R /XYZ 67.0 659.0 null]
+>>
+endobj
+1140 0 obj
+<<
+/S /GoTo
+/D [561 0 R /XYZ 67.0 119.028 null]
+>>
+endobj
+1146 0 obj
+<<
+/S /GoTo
+/D [576 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+1148 0 obj
+<<
+/S /GoTo
+/D [576 0 R /XYZ 67.0 690.866 null]
+>>
+endobj
+1151 0 obj
+<<
+/S /GoTo
+/D [576 0 R /XYZ 67.0 315.922 null]
+>>
+endobj
+1155 0 obj
+<<
+/S /GoTo
+/D [587 0 R /XYZ 67.0 327.557 null]
+>>
+endobj
+1157 0 obj
+<<
+/S /GoTo
+/D [587 0 R /XYZ 67.0 232.585 null]
+>>
+endobj
+1159 0 obj
+<<
+/S /GoTo
+/D [594 0 R /XYZ 67.0 556.0 null]
+>>
+endobj
+1161 0 obj
+<<
+/S /GoTo
+/D [594 0 R /XYZ 67.0 438.028 null]
+>>
+endobj
+1163 0 obj
+<<
+/S /GoTo
+/D [600 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+1165 0 obj
+<<
+/S /GoTo
+/D [600 0 R /XYZ 67.0 690.866 null]
+>>
+endobj
+1168 0 obj
+<<
+/S /GoTo
+/D [607 0 R /XYZ 67.0 635.109 null]
+>>
+endobj
+1174 0 obj
+<<
+/S /GoTo
+/D [620 0 R /XYZ 67.0 302.069 null]
+>>
+endobj
+1176 0 obj
+<<
+/S /GoTo
+/D [627 0 R /XYZ 67.0 682.0 null]
+>>
+endobj
+1179 0 obj
+<<
+/S /GoTo
+/D [632 0 R /XYZ 67.0 503.82 null]
+>>
+endobj
+1184 0 obj
+<<
+/S /GoTo
+/D [636 0 R /XYZ 67.0 370.557 null]
+>>
+endobj
+1186 0 obj
+<<
+/S /GoTo
+/D [636 0 R /XYZ 67.0 296.585 null]
+>>
+endobj
+1188 0 obj
+<<
+/S /GoTo
+/D [636 0 R /XYZ 67.0 159.613 null]
+>>
+endobj
+1190 0 obj
+<<
+/S /GoTo
+/D [641 0 R /XYZ 67.0 489.0 null]
+>>
+endobj
+1192 0 obj
+<<
+/S /GoTo
+/D [641 0 R /XYZ 67.0 174.069 null]
+>>
+endobj
+1194 0 obj
+<<
+/S /GoTo
+/D [641 0 R /XYZ 67.0 144.097 null]
+>>
+endobj
+1197 0 obj
+<<
+/S /GoTo
+/D [643 0 R /XYZ 67.0 483.109 null]
+>>
+endobj
+1200 0 obj
+<<
+/S /GoTo
+/D [643 0 R /XYZ 67.0 211.246 null]
+>>
+endobj
+1202 0 obj
+<<
+/S /GoTo
+/D [647 0 R /XYZ 67.0 682.0 null]
+>>
+endobj
+1209 0 obj
+<<
+/S /GoTo
+/D [654 0 R /XYZ 67.0 183.298 null]
+>>
+endobj
+1211 0 obj
+<<
+/S /GoTo
+/D [656 0 R /XYZ 67.0 586.0 null]
+>>
+endobj
+1213 0 obj
+<<
+/S /GoTo
+/D [656 0 R /XYZ 67.0 420.109 null]
+>>
+endobj
+1219 0 obj
+<<
+/S /GoTo
+/D [663 0 R /XYZ 67.0 317.909 null]
+>>
+endobj
+1222 0 obj
+<<
+/S /GoTo
+/D [667 0 R /XYZ 67.0 650.0 null]
+>>
+endobj
+1231 0 obj
+<<
+/S /GoTo
+/D [675 0 R /XYZ 67.0 617.0 null]
+>>
+endobj
+1235 0 obj
+<<
+/S /GoTo
+/D [681 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+1237 0 obj
+<<
+/S /GoTo
+/D [681 0 R /XYZ 67.0 637.866 null]
+>>
+endobj
+1239 0 obj
+<<
+/S /GoTo
+/D [681 0 R /XYZ 67.0 221.714 null]
+>>
+endobj
+1241 0 obj
+<<
+/S /GoTo
+/D [686 0 R /XYZ 67.0 445.0 null]
+>>
+endobj
+1243 0 obj
+<<
+/S /GoTo
+/D [686 0 R /XYZ 67.0 266.168 null]
+>>
+endobj
+1245 0 obj
+<<
+/S /GoTo
+/D [686 0 R /XYZ 67.0 193.196 null]
+>>
+endobj
+1247 0 obj
+<<
+/S /GoTo
+/D [693 0 R /XYZ 67.0 639.0 null]
+>>
+endobj
+1249 0 obj
+<<
+/S /GoTo
+/D [693 0 R /XYZ 67.0 253.349 null]
+>>
+endobj
+1251 0 obj
+<<
+/S /GoTo
+/D [701 0 R /XYZ 67.0 693.0 null]
+>>
+endobj
+1254 0 obj
+<<
+/S /GoTo
+/D [701 0 R /XYZ 67.0 384.218 null]
+>>
+endobj
+1261 0 obj
+<<
+/S /GoTo
+/D [709 0 R /XYZ 67.0 598.14 null]
+>>
+endobj
+1263 0 obj
+<<
+/S /GoTo
+/D [709 0 R /XYZ 67.0 462.308 null]
+>>
+endobj
+1265 0 obj
+<<
+/S /GoTo
+/D [709 0 R /XYZ 67.0 261.476 null]
+>>
+endobj
+1267 0 obj
+<<
+/S /GoTo
+/D [715 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+1269 0 obj
+<<
+/S /GoTo
+/D [715 0 R /XYZ 67.0 669.866 null]
+>>
+endobj
+1271 0 obj
+<<
+/S /GoTo
+/D [715 0 R /XYZ 67.0 606.894 null]
+>>
+endobj
+1273 0 obj
+<<
+/S /GoTo
+/D [715 0 R /XYZ 67.0 510.922 null]
+>>
+endobj
+1275 0 obj
+<<
+/S /GoTo
+/D [715 0 R /XYZ 67.0 436.95 null]
+>>
+endobj
+1277 0 obj
+<<
+/S /GoTo
+/D [715 0 R /XYZ 67.0 351.978 null]
+>>
+endobj
+1279 0 obj
+<<
+/S /GoTo
+/D [720 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+1283 0 obj
+<<
+/S /GoTo
+/D [722 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+1288 0 obj
+<<
+/S /GoTo
+/D [736 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+1290 0 obj
+<<
+/S /GoTo
+/D [736 0 R /XYZ 67.0 625.866 null]
+>>
+endobj
+1292 0 obj
+<<
+/S /GoTo
+/D [736 0 R /XYZ 67.0 513.174 null]
+>>
+endobj
+1294 0 obj
+<<
+/S /GoTo
+/D [736 0 R /XYZ 67.0 399.342 null]
+>>
+endobj
+1296 0 obj
+<<
+/S /GoTo
+/D [736 0 R /XYZ 67.0 274.51 null]
+>>
+endobj
+1298 0 obj
+<<
+/S /GoTo
+/D [736 0 R /XYZ 67.0 155.678 null]
+>>
+endobj
+1300 0 obj
+<<
+/S /GoTo
+/D [752 0 R /XYZ 67.0 624.14 null]
+>>
+endobj
+1302 0 obj
+<<
+/S /GoTo
+/D [752 0 R /XYZ 67.0 521.308 null]
+>>
+endobj
+1304 0 obj
+<<
+/S /GoTo
+/D [752 0 R /XYZ 67.0 375.476 null]
+>>
+endobj
+1306 0 obj
+<<
+/S /GoTo
+/D [752 0 R /XYZ 67.0 228.644 null]
+>>
+endobj
+1308 0 obj
+<<
+/S /GoTo
+/D [762 0 R /XYZ 67.0 703.0 null]
+>>
+endobj
+1310 0 obj
+<<
+/S /GoTo
+/D [762 0 R /XYZ 67.0 600.168 null]
+>>
+endobj
+1312 0 obj
+<<
+/S /GoTo
+/D [762 0 R /XYZ 67.0 486.336 null]
+>>
+endobj
+1314 0 obj
+<<
+/S /GoTo
+/D [762 0 R /XYZ 67.0 345.504 null]
+>>
+endobj
+1316 0 obj
+<<
+/S /GoTo
+/D [762 0 R /XYZ 67.0 242.672 null]
+>>
+endobj
+1318 0 obj
+<<
+/S /GoTo
+/D [762 0 R /XYZ 67.0 123.84 null]
+>>
+endobj
+1320 0 obj
+<<
+/S /GoTo
+/D [779 0 R /XYZ 67.0 651.14 null]
+>>
+endobj
+1322 0 obj
+<<
+/S /GoTo
+/D [779 0 R /XYZ 67.0 499.308 null]
+>>
+endobj
+1324 0 obj
+<<
+/S /GoTo
+/D [779 0 R /XYZ 67.0 276.476 null]
+>>
+endobj
+1326 0 obj
+<<
+/S /GoTo
+/D [779 0 R /XYZ 67.0 113.644 null]
+>>
+endobj
+1328 0 obj
+<<
+/S /GoTo
+/D [789 0 R /XYZ 67.0 619.14 null]
+>>
+endobj
+1330 0 obj
+<<
+/S /GoTo
+/D [789 0 R /XYZ 67.0 494.308 null]
+>>
+endobj
+1332 0 obj
+<<
+/S /GoTo
+/D [789 0 R /XYZ 67.0 391.476 null]
+>>
+endobj
+1334 0 obj
+<<
+/S /GoTo
+/D [789 0 R /XYZ 67.0 217.644 null]
+>>
+endobj
+1336 0 obj
+<<
+/S /GoTo
+/D [808 0 R /XYZ 67.0 708.0 null]
+>>
+endobj
+1338 0 obj
+<<
+/S /GoTo
+/D [808 0 R /XYZ 67.0 480.308 null]
+>>
+endobj
+1340 0 obj
+<<
+/S /GoTo
+/D [808 0 R /XYZ 67.0 361.476 null]
+>>
+endobj
+1342 0 obj
+<<
+/S /GoTo
+/D [808 0 R /XYZ 67.0 187.644 null]
+>>
+endobj
+1344 0 obj
+<<
+/S /GoTo
+/D [808 0 R /XYZ 67.0 84.812 null]
+>>
+endobj
+1346 0 obj
+<<
+/S /GoTo
+/D [823 0 R /XYZ 67.0 606.168 null]
+>>
+endobj
+1348 0 obj
+<<
+/S /GoTo
+/D [823 0 R /XYZ 67.0 487.336 null]
+>>
+endobj
+1350 0 obj
+<<
+/S /GoTo
+/D [831 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+1352 0 obj
+<<
+/S /GoTo
+/D [831 0 R /XYZ 67.0 475.866 null]
+>>
+endobj
+1354 0 obj
+<<
+/S /GoTo
+/D [831 0 R /XYZ 67.0 199.034 null]
+>>
+endobj
+1356 0 obj
+<<
+/S /GoTo
+/D [840 0 R /XYZ 67.0 536.14 null]
+>>
+endobj
+1358 0 obj
+<<
+/S /GoTo
+/D [840 0 R /XYZ 67.0 303.308 null]
+>>
+endobj
+1360 0 obj
+<<
+/S /GoTo
+/D [840 0 R /XYZ 67.0 92.476 null]
+>>
+endobj
+1362 0 obj
+<<
+/S /GoTo
+/D [850 0 R /XYZ 67.0 533.14 null]
+>>
+endobj
+1364 0 obj
+<<
+/S /GoTo
+/D [850 0 R /XYZ 67.0 289.308 null]
+>>
+endobj
+1366 0 obj
+<<
+/S /GoTo
+/D [865 0 R /XYZ 67.0 547.14 null]
+>>
+endobj
+1369 0 obj
+<<
+/S /GoTo
+/D [873 0 R /XYZ 67.0 414.78 null]
+>>
+endobj
+1371 0 obj
+<<
+/S /GoTo
+/D [873 0 R /XYZ 67.0 85.368 null]
+>>
+endobj
+1374 0 obj
+<<
+/S /GoTo
+/D [885 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+1376 0 obj
+<<
+/S /GoTo
+/D [897 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+1378 0 obj
+<<
+/S /GoTo
+/D [902 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+1382 0 obj
+<<
+/S /GoTo
+/D [902 0 R /XYZ 67.0 360.922 null]
+>>
+endobj
+1384 0 obj
+<<
+/S /GoTo
+/D [907 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+1386 0 obj
+<<
+/S /GoTo
+/D [920 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+1394 0 obj
+<<
+/S /GoTo
+/D [927 0 R /XYZ 67.0 206.056 null]
+>>
+endobj
+1416 0 obj
+<<
+/S /GoTo
+/D [1012 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+1423 0 obj
+<<
+/S /GoTo
+/D [1020 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+1425 0 obj
+<<
+/S /GoTo
+/D [1026 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+xref
+0 1439
+0000000000 65535 f
+0000396086 00000 n
+0000396983 00000 n
+0000431375 00000 n
+0000000015 00000 n
+0000000071 00000 n
+0000001444 00000 n
+0000001564 00000 n
+0000001589 00000 n
+0000001770 00000 n
+0000003970 00000 n
+0000004092 00000 n
+0000004371 00000 n
+0000431495 00000 n
+0000004506 00000 n
+0000431560 00000 n
+0000004641 00000 n
+0000431625 00000 n
+0000004775 00000 n
+0000431690 00000 n
+0000004909 00000 n
+0000431755 00000 n
+0000005044 00000 n
+0000431822 00000 n
+0000005179 00000 n
+0000431889 00000 n
+0000005314 00000 n
+0000431956 00000 n
+0000005449 00000 n
+0000432021 00000 n
+0000005584 00000 n
+0000432087 00000 n
+0000005719 00000 n
+0000432152 00000 n
+0000005854 00000 n
+0000432217 00000 n
+0000005988 00000 n
+0000432284 00000 n
+0000006123 00000 n
+0000432351 00000 n
+0000006258 00000 n
+0000432416 00000 n
+0000006393 00000 n
+0000432483 00000 n
+0000006528 00000 n
+0000432550 00000 n
+0000006663 00000 n
+0000432615 00000 n
+0000006798 00000 n
+0000432682 00000 n
+0000006933 00000 n
+0000432749 00000 n
+0000007068 00000 n
+0000432814 00000 n
+0000007203 00000 n
+0000432881 00000 n
+0000007338 00000 n
+0000432946 00000 n
+0000007473 00000 n
+0000433011 00000 n
+0000007607 00000 n
+0000433078 00000 n
+0000007742 00000 n
+0000433145 00000 n
+0000007877 00000 n
+0000433210 00000 n
+0000008012 00000 n
+0000433275 00000 n
+0000008147 00000 n
+0000433342 00000 n
+0000008282 00000 n
+0000433407 00000 n
+0000008417 00000 n
+0000433474 00000 n
+0000008552 00000 n
+0000433539 00000 n
+0000008687 00000 n
+0000433606 00000 n
+0000008822 00000 n
+0000433671 00000 n
+0000008957 00000 n
+0000433738 00000 n
+0000009091 00000 n
+0000433805 00000 n
+0000009225 00000 n
+0000433872 00000 n
+0000009358 00000 n
+0000012044 00000 n
+0000012167 00000 n
+0000012589 00000 n
+0000433937 00000 n
+0000012720 00000 n
+0000434004 00000 n
+0000012851 00000 n
+0000434071 00000 n
+0000012982 00000 n
+0000434138 00000 n
+0000013113 00000 n
+0000434203 00000 n
+0000013244 00000 n
+0000434270 00000 n
+0000013376 00000 n
+0000434336 00000 n
+0000013511 00000 n
+0000434404 00000 n
+0000013646 00000 n
+0000434471 00000 n
+0000013781 00000 n
+0000434539 00000 n
+0000013916 00000 n
+0000434607 00000 n
+0000014051 00000 n
+0000434674 00000 n
+0000014186 00000 n
+0000434740 00000 n
+0000014321 00000 n
+0000434806 00000 n
+0000014455 00000 n
+0000434874 00000 n
+0000014590 00000 n
+0000434940 00000 n
+0000014725 00000 n
+0000435008 00000 n
+0000014860 00000 n
+0000435075 00000 n
+0000014995 00000 n
+0000435143 00000 n
+0000015130 00000 n
+0000435209 00000 n
+0000015265 00000 n
+0000435277 00000 n
+0000015400 00000 n
+0000435345 00000 n
+0000015535 00000 n
+0000435413 00000 n
+0000015670 00000 n
+0000435481 00000 n
+0000015805 00000 n
+0000435547 00000 n
+0000015940 00000 n
+0000435615 00000 n
+0000016075 00000 n
+0000435683 00000 n
+0000016210 00000 n
+0000435749 00000 n
+0000016345 00000 n
+0000435817 00000 n
+0000016480 00000 n
+0000435885 00000 n
+0000016615 00000 n
+0000435953 00000 n
+0000016750 00000 n
+0000436019 00000 n
+0000016884 00000 n
+0000436087 00000 n
+0000017019 00000 n
+0000436153 00000 n
+0000017154 00000 n
+0000436221 00000 n
+0000017289 00000 n
+0000436287 00000 n
+0000017424 00000 n
+0000436355 00000 n
+0000017559 00000 n
+0000436423 00000 n
+0000017694 00000 n
+0000436489 00000 n
+0000017829 00000 n
+0000436557 00000 n
+0000017964 00000 n
+0000436623 00000 n
+0000018099 00000 n
+0000436691 00000 n
+0000018234 00000 n
+0000436759 00000 n
+0000018369 00000 n
+0000436826 00000 n
+0000018504 00000 n
+0000436894 00000 n
+0000018639 00000 n
+0000436962 00000 n
+0000018774 00000 n
+0000437028 00000 n
+0000018909 00000 n
+0000437096 00000 n
+0000019043 00000 n
+0000437164 00000 n
+0000019177 00000 n
+0000437232 00000 n
+0000019310 00000 n
+0000437299 00000 n
+0000019443 00000 n
+0000021953 00000 n
+0000022079 00000 n
+0000022444 00000 n
+0000437367 00000 n
+0000022577 00000 n
+0000437434 00000 n
+0000022710 00000 n
+0000437501 00000 n
+0000022843 00000 n
+0000437567 00000 n
+0000022976 00000 n
+0000437635 00000 n
+0000023109 00000 n
+0000437703 00000 n
+0000023242 00000 n
+0000437769 00000 n
+0000023377 00000 n
+0000437837 00000 n
+0000023512 00000 n
+0000437905 00000 n
+0000023647 00000 n
+0000437971 00000 n
+0000023782 00000 n
+0000438039 00000 n
+0000023918 00000 n
+0000438107 00000 n
+0000024054 00000 n
+0000438173 00000 n
+0000024189 00000 n
+0000438241 00000 n
+0000024324 00000 n
+0000438307 00000 n
+0000024459 00000 n
+0000438375 00000 n
+0000024594 00000 n
+0000438443 00000 n
+0000024729 00000 n
+0000438511 00000 n
+0000024864 00000 n
+0000438577 00000 n
+0000024999 00000 n
+0000438645 00000 n
+0000025134 00000 n
+0000438713 00000 n
+0000025269 00000 n
+0000438781 00000 n
+0000025403 00000 n
+0000438848 00000 n
+0000025538 00000 n
+0000438916 00000 n
+0000025673 00000 n
+0000438984 00000 n
+0000025808 00000 n
+0000439050 00000 n
+0000025943 00000 n
+0000439118 00000 n
+0000026078 00000 n
+0000439186 00000 n
+0000026213 00000 n
+0000439254 00000 n
+0000026348 00000 n
+0000439321 00000 n
+0000026483 00000 n
+0000439389 00000 n
+0000026618 00000 n
+0000439455 00000 n
+0000026753 00000 n
+0000439523 00000 n
+0000026888 00000 n
+0000439591 00000 n
+0000027023 00000 n
+0000439657 00000 n
+0000027158 00000 n
+0000439725 00000 n
+0000027293 00000 n
+0000439793 00000 n
+0000027428 00000 n
+0000439861 00000 n
+0000027563 00000 n
+0000439927 00000 n
+0000027698 00000 n
+0000439995 00000 n
+0000027833 00000 n
+0000440063 00000 n
+0000027968 00000 n
+0000440131 00000 n
+0000028102 00000 n
+0000440198 00000 n
+0000028235 00000 n
+0000030220 00000 n
+0000030346 00000 n
+0000030687 00000 n
+0000440266 00000 n
+0000030820 00000 n
+0000440333 00000 n
+0000030953 00000 n
+0000440401 00000 n
+0000031086 00000 n
+0000440469 00000 n
+0000031219 00000 n
+0000440537 00000 n
+0000031352 00000 n
+0000440603 00000 n
+0000031485 00000 n
+0000440671 00000 n
+0000031618 00000 n
+0000440739 00000 n
+0000031751 00000 n
+0000440807 00000 n
+0000031884 00000 n
+0000440875 00000 n
+0000032017 00000 n
+0000440942 00000 n
+0000032150 00000 n
+0000441009 00000 n
+0000032283 00000 n
+0000441077 00000 n
+0000032416 00000 n
+0000441145 00000 n
+0000032549 00000 n
+0000441213 00000 n
+0000032682 00000 n
+0000441280 00000 n
+0000032815 00000 n
+0000441348 00000 n
+0000032948 00000 n
+0000441416 00000 n
+0000033081 00000 n
+0000441484 00000 n
+0000033214 00000 n
+0000441550 00000 n
+0000033347 00000 n
+0000441618 00000 n
+0000033480 00000 n
+0000441686 00000 n
+0000033613 00000 n
+0000441754 00000 n
+0000033746 00000 n
+0000441820 00000 n
+0000033879 00000 n
+0000441888 00000 n
+0000034011 00000 n
+0000441956 00000 n
+0000034144 00000 n
+0000442022 00000 n
+0000034279 00000 n
+0000442090 00000 n
+0000034414 00000 n
+0000442158 00000 n
+0000034548 00000 n
+0000442225 00000 n
+0000034682 00000 n
+0000442293 00000 n
+0000034817 00000 n
+0000442360 00000 n
+0000034952 00000 n
+0000442427 00000 n
+0000035087 00000 n
+0000442495 00000 n
+0000035222 00000 n
+0000442562 00000 n
+0000035357 00000 n
+0000442630 00000 n
+0000035492 00000 n
+0000442697 00000 n
+0000035626 00000 n
+0000442763 00000 n
+0000035760 00000 n
+0000442831 00000 n
+0000035894 00000 n
+0000442897 00000 n
+0000036027 00000 n
+0000038267 00000 n
+0000038393 00000 n
+0000038726 00000 n
+0000442963 00000 n
+0000038859 00000 n
+0000443029 00000 n
+0000038994 00000 n
+0000443097 00000 n
+0000039129 00000 n
+0000443165 00000 n
+0000039264 00000 n
+0000443233 00000 n
+0000039399 00000 n
+0000443299 00000 n
+0000039533 00000 n
+0000443365 00000 n
+0000039668 00000 n
+0000443433 00000 n
+0000039803 00000 n
+0000443501 00000 n
+0000039938 00000 n
+0000443569 00000 n
+0000040073 00000 n
+0000443636 00000 n
+0000040208 00000 n
+0000443702 00000 n
+0000040343 00000 n
+0000443770 00000 n
+0000040478 00000 n
+0000443838 00000 n
+0000040613 00000 n
+0000443904 00000 n
+0000040747 00000 n
+0000443970 00000 n
+0000040882 00000 n
+0000444038 00000 n
+0000041016 00000 n
+0000444106 00000 n
+0000041151 00000 n
+0000444174 00000 n
+0000041287 00000 n
+0000444241 00000 n
+0000041423 00000 n
+0000444309 00000 n
+0000041559 00000 n
+0000444377 00000 n
+0000041695 00000 n
+0000444443 00000 n
+0000041831 00000 n
+0000444511 00000 n
+0000041967 00000 n
+0000444579 00000 n
+0000042103 00000 n
+0000444647 00000 n
+0000042238 00000 n
+0000444715 00000 n
+0000042373 00000 n
+0000444781 00000 n
+0000042508 00000 n
+0000444847 00000 n
+0000042643 00000 n
+0000444913 00000 n
+0000042778 00000 n
+0000444979 00000 n
+0000042913 00000 n
+0000445047 00000 n
+0000043048 00000 n
+0000445115 00000 n
+0000043183 00000 n
+0000445182 00000 n
+0000043318 00000 n
+0000445249 00000 n
+0000043451 00000 n
+0000445318 00000 n
+0000043584 00000 n
+0000445387 00000 n
+0000043716 00000 n
+0000445456 00000 n
+0000043848 00000 n
+0000445524 00000 n
+0000043978 00000 n
+0000044971 00000 n
+0000045097 00000 n
+0000045198 00000 n
+0000445591 00000 n
+0000045331 00000 n
+0000445658 00000 n
+0000045466 00000 n
+0000445725 00000 n
+0000045601 00000 n
+0000445794 00000 n
+0000045736 00000 n
+0000445861 00000 n
+0000045871 00000 n
+0000445928 00000 n
+0000046006 00000 n
+0000445997 00000 n
+0000046141 00000 n
+0000446066 00000 n
+0000046276 00000 n
+0000446133 00000 n
+0000046411 00000 n
+0000446200 00000 n
+0000046545 00000 n
+0000049497 00000 n
+0000049623 00000 n
+0000049812 00000 n
+0000446267 00000 n
+0000049951 00000 n
+0000050090 00000 n
+0000446335 00000 n
+0000050229 00000 n
+0000050366 00000 n
+0000050504 00000 n
+0000050642 00000 n
+0000050780 00000 n
+0000050919 00000 n
+0000051058 00000 n
+0000051196 00000 n
+0000051335 00000 n
+0000051472 00000 n
+0000051611 00000 n
+0000051750 00000 n
+0000446403 00000 n
+0000051889 00000 n
+0000052027 00000 n
+0000052166 00000 n
+0000052305 00000 n
+0000052444 00000 n
+0000052583 00000 n
+0000052722 00000 n
+0000053833 00000 n
+0000053959 00000 n
+0000054004 00000 n
+0000446471 00000 n
+0000054143 00000 n
+0000054282 00000 n
+0000446539 00000 n
+0000054419 00000 n
+0000056600 00000 n
+0000056726 00000 n
+0000056771 00000 n
+0000446607 00000 n
+0000056910 00000 n
+0000057049 00000 n
+0000057187 00000 n
+0000060236 00000 n
+0000060362 00000 n
+0000060391 00000 n
+0000446675 00000 n
+0000060526 00000 n
+0000062367 00000 n
+0000062477 00000 n
+0000065239 00000 n
+0000065365 00000 n
+0000065394 00000 n
+0000065533 00000 n
+0000066632 00000 n
+0000066742 00000 n
+0000069739 00000 n
+0000069865 00000 n
+0000069902 00000 n
+0000070041 00000 n
+0000070180 00000 n
+0000072429 00000 n
+0000072539 00000 n
+0000075585 00000 n
+0000075711 00000 n
+0000075764 00000 n
+0000075902 00000 n
+0000076040 00000 n
+0000076178 00000 n
+0000076316 00000 n
+0000079527 00000 n
+0000079653 00000 n
+0000079690 00000 n
+0000079824 00000 n
+0000446743 00000 n
+0000079963 00000 n
+0000083174 00000 n
+0000083300 00000 n
+0000083353 00000 n
+0000083488 00000 n
+0000446811 00000 n
+0000083623 00000 n
+0000083758 00000 n
+0000083897 00000 n
+0000084650 00000 n
+0000084760 00000 n
+0000087424 00000 n
+0000087550 00000 n
+0000087579 00000 n
+0000087717 00000 n
+0000090613 00000 n
+0000090739 00000 n
+0000090768 00000 n
+0000090907 00000 n
+0000093444 00000 n
+0000093570 00000 n
+0000093615 00000 n
+0000446879 00000 n
+0000093750 00000 n
+0000093885 00000 n
+0000094021 00000 n
+0000096826 00000 n
+0000096952 00000 n
+0000096981 00000 n
+0000097118 00000 n
+0000099542 00000 n
+0000099668 00000 n
+0000099697 00000 n
+0000099835 00000 n
+0000102821 00000 n
+0000102947 00000 n
+0000103024 00000 n
+0000103163 00000 n
+0000103302 00000 n
+0000446947 00000 n
+0000103439 00000 n
+0000103578 00000 n
+0000103714 00000 n
+0000103851 00000 n
+0000103988 00000 n
+0000106869 00000 n
+0000106995 00000 n
+0000107048 00000 n
+0000107182 00000 n
+0000107320 00000 n
+0000107458 00000 n
+0000107595 00000 n
+0000110441 00000 n
+0000110567 00000 n
+0000110612 00000 n
+0000110751 00000 n
+0000110890 00000 n
+0000111029 00000 n
+0000114083 00000 n
+0000114209 00000 n
+0000114262 00000 n
+0000114401 00000 n
+0000114540 00000 n
+0000114679 00000 n
+0000114816 00000 n
+0000117081 00000 n
+0000117207 00000 n
+0000117244 00000 n
+0000117383 00000 n
+0000117519 00000 n
+0000119498 00000 n
+0000119608 00000 n
+0000121892 00000 n
+0000122002 00000 n
+0000124178 00000 n
+0000124304 00000 n
+0000124333 00000 n
+0000124470 00000 n
+0000127307 00000 n
+0000127433 00000 n
+0000127486 00000 n
+0000127625 00000 n
+0000127764 00000 n
+0000127903 00000 n
+0000128038 00000 n
+0000130379 00000 n
+0000130505 00000 n
+0000130542 00000 n
+0000130676 00000 n
+0000130812 00000 n
+0000133552 00000 n
+0000133678 00000 n
+0000133707 00000 n
+0000133845 00000 n
+0000136304 00000 n
+0000136430 00000 n
+0000136467 00000 n
+0000136605 00000 n
+0000136744 00000 n
+0000139431 00000 n
+0000139541 00000 n
+0000142415 00000 n
+0000142541 00000 n
+0000142570 00000 n
+0000142708 00000 n
+0000145743 00000 n
+0000145869 00000 n
+0000145906 00000 n
+0000146044 00000 n
+0000146183 00000 n
+0000148782 00000 n
+0000148892 00000 n
+0000151233 00000 n
+0000151343 00000 n
+0000154512 00000 n
+0000154638 00000 n
+0000154675 00000 n
+0000154809 00000 n
+0000154947 00000 n
+0000157519 00000 n
+0000157629 00000 n
+0000160329 00000 n
+0000160455 00000 n
+0000160484 00000 n
+0000160623 00000 n
+0000163589 00000 n
+0000163699 00000 n
+0000166600 00000 n
+0000166710 00000 n
+0000168782 00000 n
+0000168892 00000 n
+0000171142 00000 n
+0000171252 00000 n
+0000173743 00000 n
+0000173869 00000 n
+0000173898 00000 n
+0000174036 00000 n
+0000174877 00000 n
+0000174987 00000 n
+0000177541 00000 n
+0000177667 00000 n
+0000177704 00000 n
+0000177843 00000 n
+0000177980 00000 n
+0000180794 00000 n
+0000180920 00000 n
+0000180973 00000 n
+0000181111 00000 n
+0000181250 00000 n
+0000181388 00000 n
+0000181524 00000 n
+0000184139 00000 n
+0000184265 00000 n
+0000184326 00000 n
+0000184460 00000 n
+0000184597 00000 n
+0000184733 00000 n
+0000184872 00000 n
+0000185011 00000 n
+0000187525 00000 n
+0000187651 00000 n
+0000187680 00000 n
+0000187818 00000 n
+0000190433 00000 n
+0000190559 00000 n
+0000190588 00000 n
+0000190726 00000 n
+0000193130 00000 n
+0000193256 00000 n
+0000193301 00000 n
+0000193438 00000 n
+0000193575 00000 n
+0000193711 00000 n
+0000195511 00000 n
+0000195637 00000 n
+0000195674 00000 n
+0000195813 00000 n
+0000195952 00000 n
+0000197211 00000 n
+0000197321 00000 n
+0000200132 00000 n
+0000200258 00000 n
+0000200367 00000 n
+0000200506 00000 n
+0000200645 00000 n
+0000200784 00000 n
+0000200923 00000 n
+0000201062 00000 n
+0000201198 00000 n
+0000201335 00000 n
+0000201472 00000 n
+0000201609 00000 n
+0000201746 00000 n
+0000201883 00000 n
+0000203829 00000 n
+0000203955 00000 n
+0000204080 00000 n
+0000204217 00000 n
+0000204356 00000 n
+0000204493 00000 n
+0000204630 00000 n
+0000204767 00000 n
+0000204904 00000 n
+0000205041 00000 n
+0000205178 00000 n
+0000205315 00000 n
+0000205452 00000 n
+0000205589 00000 n
+0000205724 00000 n
+0000205861 00000 n
+0000207741 00000 n
+0000207867 00000 n
+0000207944 00000 n
+0000208077 00000 n
+0000208214 00000 n
+0000208351 00000 n
+0000208488 00000 n
+0000208627 00000 n
+0000208762 00000 n
+0000208897 00000 n
+0000210372 00000 n
+0000210498 00000 n
+0000210631 00000 n
+0000210768 00000 n
+0000210905 00000 n
+0000211042 00000 n
+0000211179 00000 n
+0000211316 00000 n
+0000211453 00000 n
+0000211590 00000 n
+0000211727 00000 n
+0000211864 00000 n
+0000212001 00000 n
+0000212138 00000 n
+0000212275 00000 n
+0000212408 00000 n
+0000212541 00000 n
+0000214643 00000 n
+0000214769 00000 n
+0000214846 00000 n
+0000214979 00000 n
+0000215112 00000 n
+0000215249 00000 n
+0000215386 00000 n
+0000215523 00000 n
+0000215660 00000 n
+0000215797 00000 n
+0000217693 00000 n
+0000217819 00000 n
+0000217968 00000 n
+0000218101 00000 n
+0000218234 00000 n
+0000218367 00000 n
+0000218504 00000 n
+0000218641 00000 n
+0000218778 00000 n
+0000218915 00000 n
+0000219052 00000 n
+0000219189 00000 n
+0000219326 00000 n
+0000219463 00000 n
+0000219600 00000 n
+0000219737 00000 n
+0000219874 00000 n
+0000220009 00000 n
+0000220144 00000 n
+0000222234 00000 n
+0000222360 00000 n
+0000222477 00000 n
+0000222614 00000 n
+0000222751 00000 n
+0000222888 00000 n
+0000223025 00000 n
+0000223162 00000 n
+0000223299 00000 n
+0000223436 00000 n
+0000223573 00000 n
+0000223710 00000 n
+0000223847 00000 n
+0000223984 00000 n
+0000224121 00000 n
+0000225015 00000 n
+0000225141 00000 n
+0000225202 00000 n
+0000225340 00000 n
+0000225477 00000 n
+0000225616 00000 n
+0000225753 00000 n
+0000225890 00000 n
+0000228381 00000 n
+0000228507 00000 n
+0000228568 00000 n
+0000228707 00000 n
+0000228846 00000 n
+0000447015 00000 n
+0000228985 00000 n
+0000229122 00000 n
+0000229258 00000 n
+0000231277 00000 n
+0000231403 00000 n
+0000231480 00000 n
+0000231613 00000 n
+0000231751 00000 n
+0000231889 00000 n
+0000232028 00000 n
+0000232165 00000 n
+0000232304 00000 n
+0000232441 00000 n
+0000234547 00000 n
+0000234673 00000 n
+0000234790 00000 n
+0000234924 00000 n
+0000235059 00000 n
+0000235194 00000 n
+0000235327 00000 n
+0000235466 00000 n
+0000235605 00000 n
+0000235743 00000 n
+0000235879 00000 n
+0000236016 00000 n
+0000236154 00000 n
+0000236293 00000 n
+0000236430 00000 n
+0000238859 00000 n
+0000238985 00000 n
+0000239046 00000 n
+0000239180 00000 n
+0000239313 00000 n
+0000239451 00000 n
+0000239588 00000 n
+0000239725 00000 n
+0000241955 00000 n
+0000242081 00000 n
+0000242110 00000 n
+0000242247 00000 n
+0000244364 00000 n
+0000244490 00000 n
+0000244535 00000 n
+0000244673 00000 n
+0000244810 00000 n
+0000244947 00000 n
+0000245375 00000 n
+0000245485 00000 n
+0000248655 00000 n
+0000248781 00000 n
+0000248834 00000 n
+0000248972 00000 n
+0000249110 00000 n
+0000249249 00000 n
+0000447083 00000 n
+0000249388 00000 n
+0000251613 00000 n
+0000251739 00000 n
+0000251768 00000 n
+0000251902 00000 n
+0000254509 00000 n
+0000254635 00000 n
+0000254672 00000 n
+0000254810 00000 n
+0000254948 00000 n
+0000256908 00000 n
+0000257034 00000 n
+0000257071 00000 n
+0000257210 00000 n
+0000257347 00000 n
+0000260037 00000 n
+0000260163 00000 n
+0000260232 00000 n
+0000447151 00000 n
+0000260370 00000 n
+0000447219 00000 n
+0000260509 00000 n
+0000447287 00000 n
+0000260647 00000 n
+0000447355 00000 n
+0000260786 00000 n
+0000260925 00000 n
+0000261064 00000 n
+0000263918 00000 n
+0000264044 00000 n
+0000264089 00000 n
+0000264228 00000 n
+0000264366 00000 n
+0000447423 00000 n
+0000264505 00000 n
+0000267884 00000 n
+0000268010 00000 n
+0000268071 00000 n
+0000268210 00000 n
+0000268349 00000 n
+0000268486 00000 n
+0000268624 00000 n
+0000268762 00000 n
+0000270333 00000 n
+0000270459 00000 n
+0000270488 00000 n
+0000270623 00000 n
+0000272193 00000 n
+0000272319 00000 n
+0000272380 00000 n
+0000272519 00000 n
+0000272658 00000 n
+0000447491 00000 n
+0000272795 00000 n
+0000272934 00000 n
+0000273073 00000 n
+0000274123 00000 n
+0000274249 00000 n
+0000274326 00000 n
+0000274461 00000 n
+0000274600 00000 n
+0000274739 00000 n
+0000274878 00000 n
+0000275017 00000 n
+0000275155 00000 n
+0000275292 00000 n
+0000277173 00000 n
+0000277299 00000 n
+0000277360 00000 n
+0000277495 00000 n
+0000277630 00000 n
+0000277765 00000 n
+0000277964 00000 n
+0000278099 00000 n
+0000280560 00000 n
+0000280670 00000 n
+0000281484 00000 n
+0000281594 00000 n
+0000282721 00000 n
+0000282831 00000 n
+0000289266 00000 n
+0000289392 00000 n
+0000289639 00000 n
+0000289835 00000 n
+0000290030 00000 n
+0000290234 00000 n
+0000290436 00000 n
+0000290637 00000 n
+0000290828 00000 n
+0000291019 00000 n
+0000291210 00000 n
+0000291401 00000 n
+0000291591 00000 n
+0000291782 00000 n
+0000291973 00000 n
+0000292164 00000 n
+0000292354 00000 n
+0000292545 00000 n
+0000292735 00000 n
+0000292925 00000 n
+0000293115 00000 n
+0000293306 00000 n
+0000293496 00000 n
+0000293687 00000 n
+0000293878 00000 n
+0000294069 00000 n
+0000294259 00000 n
+0000294450 00000 n
+0000294640 00000 n
+0000294831 00000 n
+0000295020 00000 n
+0000295710 00000 n
+0000295839 00000 n
+0000295879 00000 n
+0000296067 00000 n
+0000296254 00000 n
+0000296810 00000 n
+0000296939 00000 n
+0000296970 00000 n
+0000297154 00000 n
+0000299741 00000 n
+0000299853 00000 n
+0000301333 00000 n
+0000301462 00000 n
+0000301493 00000 n
+0000301631 00000 n
+0000303713 00000 n
+0000303825 00000 n
+0000305057 00000 n
+0000305186 00000 n
+0000305235 00000 n
+0000305374 00000 n
+0000305512 00000 n
+0000305650 00000 n
+0000308161 00000 n
+0000308290 00000 n
+0000308330 00000 n
+0000308469 00000 n
+0000308609 00000 n
+0000311571 00000 n
+0000311700 00000 n
+0000311740 00000 n
+0000311879 00000 n
+0000312019 00000 n
+0000315289 00000 n
+0000315418 00000 n
+0000315575 00000 n
+0000315715 00000 n
+0000315855 00000 n
+0000315995 00000 n
+0000316135 00000 n
+0000316275 00000 n
+0000316415 00000 n
+0000316552 00000 n
+0000316692 00000 n
+0000316832 00000 n
+0000316970 00000 n
+0000317108 00000 n
+0000317247 00000 n
+0000317385 00000 n
+0000317525 00000 n
+0000317665 00000 n
+0000320448 00000 n
+0000320577 00000 n
+0000320743 00000 n
+0000320876 00000 n
+0000321010 00000 n
+0000321146 00000 n
+0000321281 00000 n
+0000321417 00000 n
+0000321553 00000 n
+0000321688 00000 n
+0000321821 00000 n
+0000321957 00000 n
+0000322093 00000 n
+0000322229 00000 n
+0000322369 00000 n
+0000322509 00000 n
+0000322647 00000 n
+0000322787 00000 n
+0000322927 00000 n
+0000323612 00000 n
+0000323724 00000 n
+0000325774 00000 n
+0000325903 00000 n
+0000325952 00000 n
+0000326130 00000 n
+0000326306 00000 n
+0000326483 00000 n
+0000329661 00000 n
+0000329790 00000 n
+0000329812 00000 n
+0000334784 00000 n
+0000334913 00000 n
+0000334935 00000 n
+0000335581 00000 n
+0000335710 00000 n
+0000447558 00000 n
+0000447615 00000 n
+0000335732 00000 n
+0000447682 00000 n
+0000335933 00000 n
+0000447748 00000 n
+0000336134 00000 n
+0000447815 00000 n
+0000336288 00000 n
+0000447881 00000 n
+0000336494 00000 n
+0000336682 00000 n
+0000336927 00000 n
+0000447948 00000 n
+0000337107 00000 n
+0000337467 00000 n
+0000337734 00000 n
+0000448015 00000 n
+0000338017 00000 n
+0000338276 00000 n
+0000338594 00000 n
+0000338801 00000 n
+0000448084 00000 n
+0000339127 00000 n
+0000448151 00000 n
+0000339452 00000 n
+0000448220 00000 n
+0000339703 00000 n
+0000448289 00000 n
+0000339932 00000 n
+0000448356 00000 n
+0000340134 00000 n
+0000448425 00000 n
+0000340303 00000 n
+0000340581 00000 n
+0000448494 00000 n
+0000340800 00000 n
+0000448563 00000 n
+0000341085 00000 n
+0000448632 00000 n
+0000341276 00000 n
+0000341473 00000 n
+0000341745 00000 n
+0000448699 00000 n
+0000341977 00000 n
+0000342196 00000 n
+0000342457 00000 n
+0000448766 00000 n
+0000342705 00000 n
+0000448833 00000 n
+0000343001 00000 n
+0000448900 00000 n
+0000343286 00000 n
+0000343672 00000 n
+0000343958 00000 n
+0000344367 00000 n
+0000344637 00000 n
+0000448969 00000 n
+0000344875 00000 n
+0000449036 00000 n
+0000345253 00000 n
+0000345528 00000 n
+0000449105 00000 n
+0000345710 00000 n
+0000345951 00000 n
+0000346228 00000 n
+0000449174 00000 n
+0000346511 00000 n
+0000449243 00000 n
+0000346812 00000 n
+0000449312 00000 n
+0000346962 00000 n
+0000449379 00000 n
+0000347271 00000 n
+0000449448 00000 n
+0000347675 00000 n
+0000449515 00000 n
+0000348060 00000 n
+0000348303 00000 n
+0000449584 00000 n
+0000348546 00000 n
+0000348926 00000 n
+0000349278 00000 n
+0000349744 00000 n
+0000350081 00000 n
+0000449653 00000 n
+0000350430 00000 n
+0000449722 00000 n
+0000350695 00000 n
+0000351059 00000 n
+0000449789 00000 n
+0000351289 00000 n
+0000351530 00000 n
+0000351755 00000 n
+0000351961 00000 n
+0000449857 00000 n
+0000352232 00000 n
+0000449926 00000 n
+0000352476 00000 n
+0000449995 00000 n
+0000352759 00000 n
+0000450064 00000 n
+0000353009 00000 n
+0000450131 00000 n
+0000353222 00000 n
+0000450200 00000 n
+0000353487 00000 n
+0000353795 00000 n
+0000450269 00000 n
+0000354026 00000 n
+0000354261 00000 n
+0000450338 00000 n
+0000354574 00000 n
+0000450407 00000 n
+0000354822 00000 n
+0000355076 00000 n
+0000355459 00000 n
+0000355665 00000 n
+0000355969 00000 n
+0000356290 00000 n
+0000450474 00000 n
+0000356583 00000 n
+0000450543 00000 n
+0000356818 00000 n
+0000450610 00000 n
+0000357050 00000 n
+0000357304 00000 n
+0000357609 00000 n
+0000357815 00000 n
+0000358147 00000 n
+0000450679 00000 n
+0000358440 00000 n
+0000358680 00000 n
+0000450748 00000 n
+0000359032 00000 n
+0000359268 00000 n
+0000359508 00000 n
+0000359772 00000 n
+0000360054 00000 n
+0000360277 00000 n
+0000360586 00000 n
+0000360918 00000 n
+0000450815 00000 n
+0000361258 00000 n
+0000361494 00000 n
+0000361689 00000 n
+0000450882 00000 n
+0000361906 00000 n
+0000450949 00000 n
+0000362296 00000 n
+0000451018 00000 n
+0000362470 00000 n
+0000451087 00000 n
+0000362672 00000 n
+0000451154 00000 n
+0000362910 00000 n
+0000451223 00000 n
+0000363139 00000 n
+0000451292 00000 n
+0000363306 00000 n
+0000451359 00000 n
+0000363483 00000 n
+0000451428 00000 n
+0000363713 00000 n
+0000364036 00000 n
+0000451495 00000 n
+0000364380 00000 n
+0000364678 00000 n
+0000365072 00000 n
+0000365538 00000 n
+0000365904 00000 n
+0000366353 00000 n
+0000451564 00000 n
+0000366721 00000 n
+0000451632 00000 n
+0000366952 00000 n
+0000451701 00000 n
+0000367178 00000 n
+0000451770 00000 n
+0000367423 00000 n
+0000451837 00000 n
+0000367784 00000 n
+0000451906 00000 n
+0000367990 00000 n
+0000451975 00000 n
+0000368260 00000 n
+0000452044 00000 n
+0000368447 00000 n
+0000452112 00000 n
+0000368699 00000 n
+0000452181 00000 n
+0000368953 00000 n
+0000369258 00000 n
+0000369505 00000 n
+0000452248 00000 n
+0000369756 00000 n
+0000370045 00000 n
+0000370254 00000 n
+0000370591 00000 n
+0000452315 00000 n
+0000370829 00000 n
+0000452382 00000 n
+0000371131 00000 n
+0000452451 00000 n
+0000371376 00000 n
+0000452520 00000 n
+0000371619 00000 n
+0000452589 00000 n
+0000371880 00000 n
+0000452657 00000 n
+0000372111 00000 n
+0000452726 00000 n
+0000372342 00000 n
+0000452794 00000 n
+0000372597 00000 n
+0000452863 00000 n
+0000372822 00000 n
+0000452932 00000 n
+0000373065 00000 n
+0000453001 00000 n
+0000373314 00000 n
+0000453068 00000 n
+0000373574 00000 n
+0000453137 00000 n
+0000373828 00000 n
+0000453206 00000 n
+0000374082 00000 n
+0000453275 00000 n
+0000374342 00000 n
+0000453344 00000 n
+0000374602 00000 n
+0000453412 00000 n
+0000374856 00000 n
+0000453480 00000 n
+0000375128 00000 n
+0000453549 00000 n
+0000375364 00000 n
+0000453618 00000 n
+0000375594 00000 n
+0000453687 00000 n
+0000375884 00000 n
+0000453755 00000 n
+0000376138 00000 n
+0000453824 00000 n
+0000376392 00000 n
+0000453893 00000 n
+0000376646 00000 n
+0000453962 00000 n
+0000376888 00000 n
+0000454029 00000 n
+0000377142 00000 n
+0000454098 00000 n
+0000377462 00000 n
+0000454167 00000 n
+0000377686 00000 n
+0000454236 00000 n
+0000377928 00000 n
+0000454304 00000 n
+0000378170 00000 n
+0000454373 00000 n
+0000378418 00000 n
+0000454442 00000 n
+0000378638 00000 n
+0000454509 00000 n
+0000378887 00000 n
+0000454578 00000 n
+0000379127 00000 n
+0000454647 00000 n
+0000379377 00000 n
+0000454715 00000 n
+0000379669 00000 n
+0000454784 00000 n
+0000379949 00000 n
+0000454852 00000 n
+0000380217 00000 n
+0000454920 00000 n
+0000380443 00000 n
+0000454989 00000 n
+0000380717 00000 n
+0000381023 00000 n
+0000455057 00000 n
+0000381354 00000 n
+0000455125 00000 n
+0000381610 00000 n
+0000381905 00000 n
+0000455193 00000 n
+0000382241 00000 n
+0000455260 00000 n
+0000382593 00000 n
+0000455327 00000 n
+0000382855 00000 n
+0000383150 00000 n
+0000383304 00000 n
+0000455394 00000 n
+0000383474 00000 n
+0000455463 00000 n
+0000383629 00000 n
+0000455530 00000 n
+0000383959 00000 n
+0000384261 00000 n
+0000384523 00000 n
+0000384753 00000 n
+0000385037 00000 n
+0000385361 00000 n
+0000385715 00000 n
+0000455597 00000 n
+0000386010 00000 n
+0000386329 00000 n
+0000386591 00000 n
+0000386869 00000 n
+0000387071 00000 n
+0000387284 00000 n
+0000387582 00000 n
+0000387724 00000 n
+0000387894 00000 n
+0000388100 00000 n
+0000388252 00000 n
+0000388451 00000 n
+0000388645 00000 n
+0000388811 00000 n
+0000389025 00000 n
+0000389241 00000 n
+0000389562 00000 n
+0000389789 00000 n
+0000390013 00000 n
+0000390246 00000 n
+0000390491 00000 n
+0000455666 00000 n
+0000390690 00000 n
+0000391039 00000 n
+0000391307 00000 n
+0000391615 00000 n
+0000391892 00000 n
+0000392189 00000 n
+0000455734 00000 n
+0000392505 00000 n
+0000455802 00000 n
+0000392838 00000 n
+0000393111 00000 n
+0000393504 00000 n
+0000393885 00000 n
+0000394228 00000 n
+0000394632 00000 n
+0000394959 00000 n
+0000395146 00000 n
+0000395523 00000 n
+0000395642 00000 n
+0000395754 00000 n
+0000395867 00000 n
+0000395975 00000 n
+trailer
+<<
+/Size 1439
+/Root 2 0 R
+/Info 4 0 R
+>>
+startxref
+455870
+%%EOF
diff --git a/vendor/sabre/dav/docs/rfc5051.txt b/vendor/sabre/dav/docs/rfc5051.txt
new file mode 100644
index 000000000..0a4479cad
--- /dev/null
+++ b/vendor/sabre/dav/docs/rfc5051.txt
@@ -0,0 +1,395 @@
+
+
+
+
+
+
+Network Working Group M. Crispin
+Request for Comments: 5051 University of Washington
+Category: Standards Track October 2007
+
+
+ i;unicode-casemap - Simple Unicode Collation Algorithm
+
+Status of This Memo
+
+ This document specifies an Internet standards track protocol for the
+ Internet community, and requests discussion and suggestions for
+ improvements. Please refer to the current edition of the "Internet
+ Official Protocol Standards" (STD 1) for the standardization state
+ and status of this protocol. Distribution of this memo is unlimited.
+
+Abstract
+
+ This document describes "i;unicode-casemap", a simple case-
+ insensitive collation for Unicode strings. It provides equality,
+ substring, and ordering operations.
+
+1. Introduction
+
+ The "i;ascii-casemap" collation described in [COMPARATOR] is quite
+ simple to implement and provides case-independent comparisons for the
+ 26 Latin alphabetics. It is specified as the default and/or baseline
+ comparator in some application protocols, e.g., [IMAP-SORT].
+
+ However, the "i;ascii-casemap" collation does not produce
+ satisfactory results with non-ASCII characters. It is possible, with
+ a modest extension, to provide a more sophisticated collation with
+ greater multilingual applicability than "i;ascii-casemap". This
+ extension provides case-independent comparisons for a much greater
+ number of characters. It also collates characters with diacriticals
+ with the non-diacritical character forms.
+
+ This collation, "i;unicode-casemap", is intended to be an alternative
+ to, and preferred over, "i;ascii-casemap". It does not replace the
+ "i;basic" collation described in [BASIC].
+
+2. Unicode Casemap Collation Description
+
+ The "i;unicode-casemap" collation is a simple collation which is
+ case-insensitive in its treatment of characters. It provides
+ equality, substring, and ordering operations. The validity test
+ operation returns "valid" for any input.
+
+
+
+
+
+Crispin Standards Track [Page 1]
+
+RFC 5051 i;unicode-casemap October 2007
+
+
+ This collation allows strings in arbitrary (and mixed) character
+ sets, as long as the character set for each string is identified and
+ it is possible to convert the string to Unicode. Strings which have
+ an unidentified character set and/or cannot be converted to Unicode
+ are not rejected, but are treated as binary.
+
+ Each input string is prepared by converting it to a "titlecased
+ canonicalized UTF-8" string according to the following steps, using
+ UnicodeData.txt ([UNICODE-DATA]):
+
+ (1) A Unicode codepoint is obtained from the input string.
+
+ (a) If the input string is in a known charset that can be
+ converted to Unicode, a sequence in the string's charset
+ is read and checked for validity according to the rules of
+ that charset. If the sequence is valid, it is converted
+ to a Unicode codepoint. Note that for input strings in
+ UTF-8, the UTF-8 sequence must be valid according to the
+ rules of [UTF-8]; e.g., overlong UTF-8 sequences are
+ invalid.
+
+ (b) If the input string is in an unknown charset, or an
+ invalid sequence occurs in step (1)(a), conversion ceases.
+ No further preparation is performed, and any partial
+ preparation results are discarded. The original string is
+ used unchanged with the i;octet comparator.
+
+ (2) The following steps, using UnicodeData.txt ([UNICODE-DATA]),
+ are performed on the resulting codepoint from step (1)(a).
+
+ (a) If the codepoint has a titlecase property in
+ UnicodeData.txt (this is normally the same as the
+ uppercase property), the codepoint is converted to the
+ codepoints in the titlecase property.
+
+ (b) If the resulting codepoint from (2)(a) has a decomposition
+ property of any type in UnicodeData.txt, the codepoint is
+ converted to the codepoints in the decomposition property.
+ This step is recursively applied to each of the resulting
+ codepoints until no more decomposition is possible
+ (effectively Normalization Form KD).
+
+ Example: codepoint U+01C4 (LATIN CAPITAL LETTER DZ WITH CARON)
+ has a titlecase property of U+01C5 (LATIN CAPITAL LETTER D
+ WITH SMALL LETTER Z WITH CARON). Codepoint U+01C5 has a
+ decomposition property of U+0044 (LATIN CAPITAL LETTER D)
+ U+017E (LATIN SMALL LETTER Z WITH CARON). U+017E has a
+ decomposition property of U+007A (LATIN SMALL LETTER Z) U+030c
+
+
+
+Crispin Standards Track [Page 2]
+
+RFC 5051 i;unicode-casemap October 2007
+
+
+ (COMBINING CARON). Neither U+0044, U+007A, nor U+030C have
+ any decomposition properties. Therefore, U+01C4 is converted
+ to U+0044 U+007A U+030C by this step.
+
+ (3) The resulting codepoint(s) from step (2) is/are appended, in
+ UTF-8 format, to the "titlecased canonicalized UTF-8" string.
+
+ (4) Repeat from step (1) until there is no more data in the input
+ string.
+
+ Following the above preparation process on each string, the equality,
+ ordering, and substring operations are as for i;octet.
+
+ It is permitted to use an alternative implementation of the above
+ preparation process if it produces the same results. For example, it
+ may be more convenient for an implementation to convert all input
+ strings to a sequence of UTF-16 or UTF-32 values prior to performing
+ any of the step (2) actions. Similarly, if all input strings are (or
+ are convertible to) Unicode, it may be possible to use UTF-32 as an
+ alternative to UTF-8 in step (3).
+
+ Note: UTF-16 is unsuitable as an alternative to UTF-8 in step (3),
+ because UTF-16 surrogates will cause i;octet to collate codepoints
+ U+E0000 through U+FFFF after non-BMP codepoints.
+
+ This collation is not locale sensitive. Consequently, care should be
+ taken when using OS-supplied functions to implement this collation.
+ Functions such as strcasecmp and toupper are sometimes locale
+ sensitive and may inconsistently casemap letters.
+
+ The i;unicode-casemap collation is well suited to use with many
+ Internet protocols and computer languages. Use with natural language
+ is often inappropriate; even though the collation apparently supports
+ languages such as Swahili and English, in real-world use it tends to
+ mis-sort a number of types of string:
+
+ o people and place names containing scripts that are not collated
+ according to "alphabetical order".
+ o words with characters that have diacriticals. However,
+ i;unicode-casemap generally does a better job than i;ascii-casemap
+ for most (but not all) languages. For example, German umlaut
+ letters will sort correctly, but some Scandinavian letters will
+ not.
+ o names such as "Lloyd" (which in Welsh sorts after "Lyon", unlike
+ in English),
+ o strings containing other non-letter symbols; e.g., euro and pound
+ sterling symbols, quotation marks other than '"', dashes/hyphens,
+ etc.
+
+
+
+Crispin Standards Track [Page 3]
+
+RFC 5051 i;unicode-casemap October 2007
+
+
+3. Unicode Casemap Collation Registration
+
+ <?xml version='1.0'?>
+ <!DOCTYPE collation SYSTEM 'collationreg.dtd'>
+ <collation rfc="5051" scope="global" intendedUse="common">
+ <identifier>i;unicode-casemap</identifier>
+ <title>Unicode Casemap</title>
+ <operations>equality order substring</operations>
+ <specification>RFC 5051</specification>
+ <owner>IETF</owner>
+ <submitter>mrc@cac.washington.edu</submitter>
+ </collation>
+
+4. Security Considerations
+
+ The security considerations for [UTF-8], [STRINGPREP], and [UNICODE-
+ SECURITY] apply and are normative to this specification.
+
+ The results from this comparator will vary depending upon the
+ implementation for several reasons. Implementations MUST consider
+ whether these possibilities are a problem for their use case:
+
+ 1) New characters added in Unicode may have decomposition or
+ titlecase properties that will not be known to an implementation
+ based upon an older revision of Unicode. This impacts step (2).
+
+ 2) Step (2)(b) defines a subset of Normalization Form KD (NFKD) that
+ does not require normalization of out-of-order diacriticals.
+ However, an implementation MAY use an NFKD library routine that
+ does such normalization. This impacts step (2)(b) and possibly
+ also step (1)(a), and is an issue only with ill-formed UTF-8
+ input.
+
+ 3) The set of charsets handled in step (1)(a) is open-ended. UTF-8
+ (and, by extension, US-ASCII) are the only mandatory-to-implement
+ charsets. This impacts step (1)(a).
+
+ Implementations SHOULD, as far as feasible, support all the
+ charsets they are likely to encounter in the input data, in order
+ to avoid poor collation caused by the fall through to the (1)(b)
+ rule.
+
+ 4) Other charsets may have revisions which add new characters that
+ are not known to an implementation based upon an older revision.
+ This impacts step (1)(a) and possibly also step (1)(b).
+
+
+
+
+
+
+Crispin Standards Track [Page 4]
+
+RFC 5051 i;unicode-casemap October 2007
+
+
+ An attacker may create input that is ill-formed or in an unknown
+ charset, with the intention of impacting the results of this
+ comparator or exploiting other parts of the system which process this
+ input in different ways. Note, however, that even well-formed data
+ in a known charset can impact the result of this comparator in
+ unexpected ways. For example, an attacker can substitute U+0041
+ (LATIN CAPITAL LETTER A) with U+0391 (GREEK CAPITAL LETTER ALPHA) or
+ U+0410 (CYRILLIC CAPITAL LETTER A) in the intention of causing a
+ non-match of strings which visually appear the same and/or causing
+ the string to appear elsewhere in a sort.
+
+5. IANA Considerations
+
+ The i;unicode-casemap collation defined in section 2 has been added
+ to the registry of collations defined in [COMPARATOR].
+
+6. Normative References
+
+ [COMPARATOR] Newman, C., Duerst, M., and A. Gulbrandsen,
+ "Internet Application Protocol Collation
+ Registry", RFC 4790, February 2007.
+
+ [STRINGPREP] Hoffman, P. and M. Blanchet, "Preparation of
+ Internationalized Strings ("stringprep")", RFC
+ 3454, December 2002.
+
+ [UTF-8] Yergeau, F., "UTF-8, a transformation format of
+ ISO 10646", STD 63, RFC 3629, November 2003.
+
+ [UNICODE-DATA] <http://www.unicode.org/Public/UNIDATA/
+ UnicodeData.txt>
+
+ Although the UnicodeData.txt file referenced
+ here is part of the Unicode standard, it is
+ subject to change as new characters are added
+ to Unicode and errors are corrected in Unicode
+ revisions. As a result, it may be less stable
+ than might otherwise be implied by the
+ standards status of this specification.
+
+ [UNICODE-SECURITY] Davis, M. and M. Suignard, "Unicode Security
+ Considerations", February 2006,
+ <http://www.unicode.org/reports/tr36/>.
+
+
+
+
+
+
+
+
+Crispin Standards Track [Page 5]
+
+RFC 5051 i;unicode-casemap October 2007
+
+
+7. Informative References
+
+ [BASIC] Newman, C., Duerst, M., and A. Gulbrandsen,
+ "i;basic - the Unicode Collation Algorithm",
+ Work in Progress, March 2007.
+
+ [IMAP-SORT] Crispin, M. and K. Murchison, "Internet Message
+ Access Protocol - SORT and THREAD Extensions",
+ Work in Progress, September 2007.
+
+Author's Address
+
+ Mark R. Crispin
+ Networks and Distributed Computing
+ University of Washington
+ 4545 15th Avenue NE
+ Seattle, WA 98105-4527
+
+ Phone: +1 (206) 543-5762
+ EMail: MRC@CAC.Washington.EDU
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Crispin Standards Track [Page 6]
+
+RFC 5051 i;unicode-casemap October 2007
+
+
+Full Copyright Statement
+
+ Copyright (C) The IETF Trust (2007).
+
+ This document is subject to the rights, licenses and restrictions
+ contained in BCP 78, and except as set forth therein, the authors
+ retain all their rights.
+
+ This document and the information contained herein are provided on an
+ "AS IS" basis and THE CONTRIBUTOR, THE ORGANIZATION HE/SHE REPRESENTS
+ OR IS SPONSORED BY (IF ANY), THE INTERNET SOCIETY, THE IETF TRUST AND
+ THE INTERNET ENGINEERING TASK FORCE DISCLAIM ALL WARRANTIES, EXPRESS
+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF
+ THE INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED
+ WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+
+Intellectual Property
+
+ The IETF takes no position regarding the validity or scope of any
+ Intellectual Property Rights or other rights that might be claimed to
+ pertain to the implementation or use of the technology described in
+ this document or the extent to which any license under such rights
+ might or might not be available; nor does it represent that it has
+ made any independent effort to identify any such rights. Information
+ on the procedures with respect to rights in RFC documents can be
+ found in BCP 78 and BCP 79.
+
+ Copies of IPR disclosures made to the IETF Secretariat and any
+ assurances of licenses to be made available, or the result of an
+ attempt made to obtain a general license or permission for the use of
+ such proprietary rights by implementers or users of this
+ specification can be obtained from the IETF on-line IPR repository at
+ http://www.ietf.org/ipr.
+
+ The IETF invites any interested party to bring to its attention any
+ copyrights, patents or patent applications, or other proprietary
+ rights that may cover technology that may be required to implement
+ this standard. Please address the information to the IETF at
+ ietf-ipr@ietf.org.
+
+
+
+
+
+
+
+
+
+
+
+
+Crispin Standards Track [Page 7]
+
diff --git a/vendor/sabre/dav/docs/rfc5397.txt b/vendor/sabre/dav/docs/rfc5397.txt
new file mode 100644
index 000000000..616055e70
--- /dev/null
+++ b/vendor/sabre/dav/docs/rfc5397.txt
@@ -0,0 +1,281 @@
+
+
+
+Network Working Group W. Sanchez
+Request for Comments: 5397 C. Daboo
+Category: Standards Track Apple Inc.
+ December 2008
+
+
+ WebDAV Current Principal Extension
+
+Status of This Memo
+
+ This document specifies an Internet standards track protocol for the
+ Internet community, and requests discussion and suggestions for
+ improvements. Please refer to the current edition of the "Internet
+ Official Protocol Standards" (STD 1) for the standardization state
+ and status of this protocol. Distribution of this memo is unlimited.
+
+Copyright Notice
+
+ Copyright (c) 2008 IETF Trust and the persons identified as the
+ document authors. All rights reserved.
+
+ This document is subject to BCP 78 and the IETF Trust's Legal
+ Provisions Relating to IETF Documents
+ (http://trustee.ietf.org/license-info) in effect on the date of
+ publication of this document. Please review these documents
+ carefully, as they describe your rights and restrictions with respect
+ to this document.
+
+Abstract
+
+ This specification defines a new WebDAV property that allows clients
+ to quickly determine the principal corresponding to the current
+ authenticated user.
+
+Table of Contents
+
+ 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 2
+ 2. Conventions Used in This Document . . . . . . . . . . . . . . . 2
+ 3. DAV:current-user-principal . . . . . . . . . . . . . . . . . . 3
+ 4. Security Considerations . . . . . . . . . . . . . . . . . . . . 4
+ 5. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . 4
+ 6. Normative References . . . . . . . . . . . . . . . . . . . . . 4
+
+
+
+
+
+
+
+
+
+Sanchez & Daboo Standards Track [Page 1]
+
+RFC 5397 WebDAV Current Principal December 2008
+
+
+1. Introduction
+
+ WebDAV [RFC4918] is an extension to HTTP [RFC2616] to support
+ improved document authoring capabilities. The WebDAV Access Control
+ Protocol ("WebDAV ACL") [RFC3744] extension adds access control
+ capabilities to WebDAV. It introduces the concept of a "principal"
+ resource, which is used to represent information about authenticated
+ entities on the system.
+
+ Some clients have a need to determine which [RFC3744] principal a
+ server is associating with the currently authenticated HTTP user.
+ While [RFC3744] defines a DAV:current-user-privilege-set property for
+ retrieving the privileges granted to that principal, there is no
+ recommended way to identify the principal in question, which is
+ necessary to perform other useful operations. For example, a client
+ may wish to determine which groups the current user is a member of,
+ or modify a property of the principal resource associated with the
+ current user.
+
+ The DAV:principal-match REPORT provides some useful functionality,
+ but there are common situations where the results from that query can
+ be ambiguous. For example, not only is an individual user principal
+ returned, but also every group principal that the user is a member
+ of, and there is no clear way to distinguish which is which.
+
+ This specification proposes an extension to WebDAV ACL that adds a
+ DAV:current-user-principal property to resources under access control
+ on the server. This property provides a URL to a principal resource
+ corresponding to the currently authenticated user. This allows a
+ client to "bootstrap" itself by performing additional queries on the
+ principal resource to obtain additional information from that
+ resource, which is the purpose of this extension. Note that while it
+ is possible for multiple URLs to refer to the same principal
+ resource, or for multiple principal resources to correspond to a
+ single principal, this specification only allows for a single http(s)
+ URL in the DAV:current-user-principal property. If a client wishes
+ to obtain alternate URLs for the principal, it can query the
+ principal resource for this information; it is not the purpose of
+ this extension to provide a complete list of such URLs, but simply to
+ provide a means to locate a resource which contains that (and other)
+ information.
+
+2. Conventions Used in This Document
+
+ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
+ "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
+ document are to be interpreted as described in [RFC2119].
+
+
+
+
+Sanchez & Daboo Standards Track [Page 2]
+
+RFC 5397 WebDAV Current Principal December 2008
+
+
+ When XML element types in the namespace "DAV:" are referenced in this
+ document outside of the context of an XML fragment, the string "DAV:"
+ will be prefixed to the element type names.
+
+ Processing of XML by clients and servers MUST follow the rules
+ defined in Section 17 of WebDAV [RFC4918].
+
+ Some of the declarations refer to XML elements defined by WebDAV
+ [RFC4918].
+
+3. DAV:current-user-principal
+
+ Name: current-user-principal
+
+ Namespace: DAV:
+
+ Purpose: Indicates a URL for the currently authenticated user's
+ principal resource on the server.
+
+ Value: A single DAV:href or DAV:unauthenticated element.
+
+ Protected: This property is computed on a per-request basis, and
+ therefore is protected.
+
+ Description: The DAV:current-user-principal property contains either
+ a DAV:href or DAV:unauthenticated XML element. The DAV:href
+ element contains a URL to a principal resource corresponding to
+ the currently authenticated user. That URL MUST be one of the
+ URLs in the DAV:principal-URL or DAV:alternate-URI-set properties
+ defined on the principal resource and MUST be an http(s) scheme
+ URL. When authentication has not been done or has failed, this
+ property MUST contain the DAV:unauthenticated pseudo-principal.
+
+ In some cases, there may be multiple principal resources
+ corresponding to the same authenticated principal. In that case,
+ the server is free to choose any one of the principal resource
+ URIs for the value of the DAV:current-user-principal property.
+ However, servers SHOULD be consistent and use the same principal
+ resource URI for each authenticated principal.
+
+ COPY/MOVE behavior: This property is computed on a per-request
+ basis, and is thus never copied or moved.
+
+ Definition:
+
+ <!ELEMENT current-user-principal (unauthenticated | href)>
+ <!-- href value: a URL to a principal resource -->
+
+
+
+
+Sanchez & Daboo Standards Track [Page 3]
+
+RFC 5397 WebDAV Current Principal December 2008
+
+
+ Example:
+
+ <D:current-user-principal xmlns:D="DAV:">
+ <D:href>/principals/users/cdaboo</D:href>
+ </D:current-user-principal>
+
+4. Security Considerations
+
+ This specification does not introduce any additional security issues
+ beyond those defined for HTTP [RFC2616], WebDAV [RFC4918], and WebDAV
+ ACL [RFC3744].
+
+5. Acknowledgments
+
+ This specification is based on discussions that took place within the
+ Calendaring and Scheduling Consortium's CalDAV Technical Committee.
+ The authors thank the participants of that group for their input.
+
+ The authors thank Julian Reschke for his valuable input via the
+ WebDAV working group mailing list.
+
+6. Normative References
+
+ [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
+ Requirement Levels", BCP 14, RFC 2119, March 1997.
+
+ [RFC2616] Fielding, R., Gettys, J., Mogul, J., Frystyk, H.,
+ Masinter, L., Leach, P., and T. Berners-Lee, "Hypertext
+ Transfer Protocol -- HTTP/1.1", RFC 2616, June 1999.
+
+ [RFC3744] Clemm, G., Reschke, J., Sedlar, E., and J. Whitehead, "Web
+ Distributed Authoring and Versioning (WebDAV)
+ Access Control Protocol", RFC 3744, May 2004.
+
+ [RFC4918] Dusseault, L., "HTTP Extensions for Web Distributed
+ Authoring and Versioning (WebDAV)", RFC 4918, June 2007.
+
+Authors' Addresses
+
+ Wilfredo Sanchez
+ Apple Inc.
+ 1 Infinite Loop
+ Cupertino, CA 95014
+ USA
+
+ EMail: wsanchez@wsanchez.net
+ URI: http://www.apple.com/
+
+
+
+
+Sanchez & Daboo Standards Track [Page 4]
+
+RFC 5397 WebDAV Current Principal December 2008
+
+
+ Cyrus Daboo
+ Apple Inc.
+ 1 Infinite Loop
+ Cupertino, CA 95014
+ USA
+
+ EMail: cyrus@daboo.name
+ URI: http://www.apple.com/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Sanchez & Daboo Standards Track [Page 5]
+
+
diff --git a/vendor/sabre/dav/docs/rfc5545.txt b/vendor/sabre/dav/docs/rfc5545.txt
new file mode 100644
index 000000000..47ea31d60
--- /dev/null
+++ b/vendor/sabre/dav/docs/rfc5545.txt
@@ -0,0 +1,9411 @@
+
+
+
+
+
+
+Network Working Group B. Desruisseaux, Ed.
+Request for Comments: 5545 Oracle
+Obsoletes: 2445 September 2009
+Category: Standards Track
+
+
+ Internet Calendaring and Scheduling Core Object Specification
+ (iCalendar)
+
+Abstract
+
+This document defines the iCalendar data format for representing and
+exchanging calendaring and scheduling information such as events,
+to-dos, journal entries, and free/busy information, independent of any
+particular calendar service or protocol.
+
+Status of This Memo
+
+ This document specifies an Internet standards track protocol for the
+ Internet community, and requests discussion and suggestions for
+ improvements. Please refer to the current edition of the "Internet
+ Official Protocol Standards" (STD 1) for the standardization state
+ and status of this protocol. Distribution of this memo is unlimited.
+
+Copyright and License Notice
+
+ Copyright (c) 2009 IETF Trust and the persons identified as the
+ document authors. All rights reserved.
+
+ This document is subject to BCP 78 and the IETF Trust's Legal
+ Provisions Relating to IETF Documents
+ (http://trustee.ietf.org/license-info) in effect on the date of
+ publication of this document. Please review these documents
+ carefully, as they describe your rights and restrictions with respect
+ to this document. Code Components extracted from this document must
+ include Simplified BSD License text as described in Section 4.e of
+ the Trust Legal Provisions and are provided without warranty as
+ described in the BSD License.
+
+ This document may contain material from IETF Documents or IETF
+ Contributions published or made publicly available before November
+ 10, 2008. The person(s) controlling the copyright in some of this
+ material may not have granted the IETF Trust the right to allow
+ modifications of such material outside the IETF Standards Process.
+ Without obtaining an adequate license from the person(s) controlling
+ the copyright in such materials, this document may not be modified
+ outside the IETF Standards Process, and derivative works of it may
+ not be created outside the IETF Standards Process, except to format
+
+
+
+Desruisseaux Standards Track [Page 1]
+
+RFC 5545 iCalendar September 2009
+
+
+ it for publication as an RFC or to translate it into languages other
+ than English.
+
+Table of Contents
+
+ 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 5
+ 2. Basic Grammar and Conventions . . . . . . . . . . . . . . . . 6
+ 2.1. Formatting Conventions . . . . . . . . . . . . . . . . . 6
+ 2.2. Related Memos . . . . . . . . . . . . . . . . . . . . . . 7
+ 3. iCalendar Object Specification . . . . . . . . . . . . . . . 8
+ 3.1. Content Lines . . . . . . . . . . . . . . . . . . . . . . 8
+ 3.1.1. List and Field Separators . . . . . . . . . . . . . . 11
+ 3.1.2. Multiple Values . . . . . . . . . . . . . . . . . . . 11
+ 3.1.3. Binary Content . . . . . . . . . . . . . . . . . . . 11
+ 3.1.4. Character Set . . . . . . . . . . . . . . . . . . . . 12
+ 3.2. Property Parameters . . . . . . . . . . . . . . . . . . . 12
+ 3.2.1. Alternate Text Representation . . . . . . . . . . . . 13
+ 3.2.2. Common Name . . . . . . . . . . . . . . . . . . . . . 15
+ 3.2.3. Calendar User Type . . . . . . . . . . . . . . . . . 15
+ 3.2.4. Delegators . . . . . . . . . . . . . . . . . . . . . 16
+ 3.2.5. Delegatees . . . . . . . . . . . . . . . . . . . . . 16
+ 3.2.6. Directory Entry Reference . . . . . . . . . . . . . . 17
+ 3.2.7. Inline Encoding . . . . . . . . . . . . . . . . . . . 17
+ 3.2.8. Format Type . . . . . . . . . . . . . . . . . . . . . 18
+ 3.2.9. Free/Busy Time Type . . . . . . . . . . . . . . . . . 19
+ 3.2.10. Language . . . . . . . . . . . . . . . . . . . . . . 20
+ 3.2.11. Group or List Membership . . . . . . . . . . . . . . 20
+ 3.2.12. Participation Status . . . . . . . . . . . . . . . . 21
+ 3.2.13. Recurrence Identifier Range . . . . . . . . . . . . . 22
+ 3.2.14. Alarm Trigger Relationship . . . . . . . . . . . . . 23
+ 3.2.15. Relationship Type . . . . . . . . . . . . . . . . . . 24
+ 3.2.16. Participation Role . . . . . . . . . . . . . . . . . 25
+ 3.2.17. RSVP Expectation . . . . . . . . . . . . . . . . . . 25
+ 3.2.18. Sent By . . . . . . . . . . . . . . . . . . . . . . . 26
+ 3.2.19. Time Zone Identifier . . . . . . . . . . . . . . . . 26
+ 3.2.20. Value Data Types . . . . . . . . . . . . . . . . . . 28
+ 3.3. Property Value Data Types . . . . . . . . . . . . . . . . 29
+ 3.3.1. Binary . . . . . . . . . . . . . . . . . . . . . . . 29
+ 3.3.2. Boolean . . . . . . . . . . . . . . . . . . . . . . . 30
+ 3.3.3. Calendar User Address . . . . . . . . . . . . . . . . 30
+ 3.3.4. Date . . . . . . . . . . . . . . . . . . . . . . . . 31
+ 3.3.5. Date-Time . . . . . . . . . . . . . . . . . . . . . . 31
+ 3.3.6. Duration . . . . . . . . . . . . . . . . . . . . . . 34
+ 3.3.7. Float . . . . . . . . . . . . . . . . . . . . . . . . 35
+ 3.3.8. Integer . . . . . . . . . . . . . . . . . . . . . . . 35
+ 3.3.9. Period of Time . . . . . . . . . . . . . . . . . . . 36
+ 3.3.10. Recurrence Rule . . . . . . . . . . . . . . . . . . . 37
+ 3.3.11. Text . . . . . . . . . . . . . . . . . . . . . . . . 45
+
+
+
+Desruisseaux Standards Track [Page 2]
+
+RFC 5545 iCalendar September 2009
+
+
+ 3.3.12. Time . . . . . . . . . . . . . . . . . . . . . . . . 46
+ 3.3.13. URI . . . . . . . . . . . . . . . . . . . . . . . . . 48
+ 3.3.14. UTC Offset . . . . . . . . . . . . . . . . . . . . . 49
+ 3.4. iCalendar Object . . . . . . . . . . . . . . . . . . . . 49
+ 3.5. Property . . . . . . . . . . . . . . . . . . . . . . . . 50
+ 3.6. Calendar Components . . . . . . . . . . . . . . . . . . . 50
+ 3.6.1. Event Component . . . . . . . . . . . . . . . . . . . 52
+ 3.6.2. To-Do Component . . . . . . . . . . . . . . . . . . . 56
+ 3.6.3. Journal Component . . . . . . . . . . . . . . . . . . 58
+ 3.6.4. Free/Busy Component . . . . . . . . . . . . . . . . . 60
+ 3.6.5. Time Zone Component . . . . . . . . . . . . . . . . . 63
+ 3.6.6. Alarm Component . . . . . . . . . . . . . . . . . . . 72
+ 3.7. Calendar Properties . . . . . . . . . . . . . . . . . . . 77
+ 3.7.1. Calendar Scale . . . . . . . . . . . . . . . . . . . 77
+ 3.7.2. Method . . . . . . . . . . . . . . . . . . . . . . . 78
+ 3.7.3. Product Identifier . . . . . . . . . . . . . . . . . 79
+ 3.7.4. Version . . . . . . . . . . . . . . . . . . . . . . . 80
+ 3.8. Component Properties . . . . . . . . . . . . . . . . . . 81
+ 3.8.1. Descriptive Component Properties . . . . . . . . . . 81
+ 3.8.1.1. Attachment . . . . . . . . . . . . . . . . . . . 81
+ 3.8.1.2. Categories . . . . . . . . . . . . . . . . . . . 82
+ 3.8.1.3. Classification . . . . . . . . . . . . . . . . . 83
+ 3.8.1.4. Comment . . . . . . . . . . . . . . . . . . . . . 84
+ 3.8.1.5. Description . . . . . . . . . . . . . . . . . . . 85
+ 3.8.1.6. Geographic Position . . . . . . . . . . . . . . . 87
+ 3.8.1.7. Location . . . . . . . . . . . . . . . . . . . . 88
+ 3.8.1.8. Percent Complete . . . . . . . . . . . . . . . . 89
+ 3.8.1.9. Priority . . . . . . . . . . . . . . . . . . . . 90
+ 3.8.1.10. Resources . . . . . . . . . . . . . . . . . . . . 92
+ 3.8.1.11. Status . . . . . . . . . . . . . . . . . . . . . 93
+ 3.8.1.12. Summary . . . . . . . . . . . . . . . . . . . . . 94
+ 3.8.2. Date and Time Component Properties . . . . . . . . . 95
+ 3.8.2.1. Date-Time Completed . . . . . . . . . . . . . . . 95
+ 3.8.2.2. Date-Time End . . . . . . . . . . . . . . . . . . 96
+ 3.8.2.3. Date-Time Due . . . . . . . . . . . . . . . . . . 97
+ 3.8.2.4. Date-Time Start . . . . . . . . . . . . . . . . . 99
+ 3.8.2.5. Duration . . . . . . . . . . . . . . . . . . . . 100
+ 3.8.2.6. Free/Busy Time . . . . . . . . . . . . . . . . . 101
+ 3.8.2.7. Time Transparency . . . . . . . . . . . . . . . . 102
+ 3.8.3. Time Zone Component Properties . . . . . . . . . . . 103
+ 3.8.3.1. Time Zone Identifier . . . . . . . . . . . . . . 103
+ 3.8.3.2. Time Zone Name . . . . . . . . . . . . . . . . . 105
+ 3.8.3.3. Time Zone Offset From . . . . . . . . . . . . . . 106
+ 3.8.3.4. Time Zone Offset To . . . . . . . . . . . . . . . 106
+ 3.8.3.5. Time Zone URL . . . . . . . . . . . . . . . . . . 107
+ 3.8.4. Relationship Component Properties . . . . . . . . . . 108
+ 3.8.4.1. Attendee . . . . . . . . . . . . . . . . . . . . 108
+ 3.8.4.2. Contact . . . . . . . . . . . . . . . . . . . . . 111
+
+
+
+Desruisseaux Standards Track [Page 3]
+
+RFC 5545 iCalendar September 2009
+
+
+ 3.8.4.3. Organizer . . . . . . . . . . . . . . . . . . . . 113
+ 3.8.4.4. Recurrence ID . . . . . . . . . . . . . . . . . . 114
+ 3.8.4.5. Related To . . . . . . . . . . . . . . . . . . . 117
+ 3.8.4.6. Uniform Resource Locator . . . . . . . . . . . . 118
+ 3.8.4.7. Unique Identifier . . . . . . . . . . . . . . . . 119
+ 3.8.5. Recurrence Component Properties . . . . . . . . . . . 120
+ 3.8.5.1. Exception Date-Times . . . . . . . . . . . . . . 120
+ 3.8.5.2. Recurrence Date-Times . . . . . . . . . . . . . . 122
+ 3.8.5.3. Recurrence Rule . . . . . . . . . . . . . . . . . 124
+ 3.8.6. Alarm Component Properties . . . . . . . . . . . . . 134
+ 3.8.6.1. Action . . . . . . . . . . . . . . . . . . . . . 134
+ 3.8.6.2. Repeat Count . . . . . . . . . . . . . . . . . . 135
+ 3.8.6.3. Trigger . . . . . . . . . . . . . . . . . . . . . 135
+ 3.8.7. Change Management Component Properties . . . . . . . 138
+ 3.8.7.1. Date-Time Created . . . . . . . . . . . . . . . . 138
+ 3.8.7.2. Date-Time Stamp . . . . . . . . . . . . . . . . . 139
+ 3.8.7.3. Last Modified . . . . . . . . . . . . . . . . . . 140
+ 3.8.7.4. Sequence Number . . . . . . . . . . . . . . . . . 141
+ 3.8.8. Miscellaneous Component Properties . . . . . . . . . 142
+ 3.8.8.1. IANA Properties . . . . . . . . . . . . . . . . . 142
+ 3.8.8.2. Non-Standard Properties . . . . . . . . . . . . . 142
+ 3.8.8.3. Request Status . . . . . . . . . . . . . . . . . 144
+ 4. iCalendar Object Examples . . . . . . . . . . . . . . . . . . 146
+ 5. Recommended Practices . . . . . . . . . . . . . . . . . . . . 150
+ 6. Internationalization Considerations . . . . . . . . . . . . . 151
+ 7. Security Considerations . . . . . . . . . . . . . . . . . . . 151
+ 8. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 151
+ 8.1. iCalendar Media Type Registration . . . . . . . . . . . . 151
+ 8.2. New iCalendar Elements Registration . . . . . . . . . . . 155
+ 8.2.1. iCalendar Elements Registration Procedure . . . . . . 155
+ 8.2.2. Registration Template for Components . . . . . . . . 155
+ 8.2.3. Registration Template for Properties . . . . . . . . 156
+ 8.2.4. Registration Template for Parameters . . . . . . . . 156
+ 8.2.5. Registration Template for Value Data Types . . . . . 157
+ 8.2.6. Registration Template for Values . . . . . . . . . . 157
+ 8.3. Initial iCalendar Elements Registries . . . . . . . . . . 158
+ 8.3.1. Components Registry . . . . . . . . . . . . . . . . . 158
+ 8.3.2. Properties Registry . . . . . . . . . . . . . . . . . 158
+ 8.3.3. Parameters Registry . . . . . . . . . . . . . . . . . 161
+ 8.3.4. Value Data Types Registry . . . . . . . . . . . . . . 162
+ 8.3.5. Calendar User Types Registry . . . . . . . . . . . . 162
+ 8.3.6. Free/Busy Time Types Registry . . . . . . . . . . . . 163
+ 8.3.7. Participation Statuses Registry . . . . . . . . . . . 163
+ 8.3.8. Relationship Types Registry . . . . . . . . . . . . . 164
+ 8.3.9. Participation Roles Registry . . . . . . . . . . . . 164
+ 8.3.10. Actions Registry . . . . . . . . . . . . . . . . . . 165
+ 8.3.11. Classifications Registry . . . . . . . . . . . . . . 165
+ 8.3.12. Methods Registry . . . . . . . . . . . . . . . . . . 165
+
+
+
+Desruisseaux Standards Track [Page 4]
+
+RFC 5545 iCalendar September 2009
+
+
+ 9. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 165
+ 10. References . . . . . . . . . . . . . . . . . . . . . . . . . 166
+ 10.1. Normative References . . . . . . . . . . . . . . . . . . 166
+ 10.2. Informative References . . . . . . . . . . . . . . . . . 167
+ Appendix A. Differences from RFC 2445 . . . . . . . . . . . . . 169
+ A.1. New Restrictions . . . . . . . . . . . . . . . . . . . . 169
+ A.2. Restrictions Removed . . . . . . . . . . . . . . . . . . 169
+ A.3. Deprecated Features . . . . . . . . . . . . . . . . . . . 169
+
+1. Introduction
+
+ The use of calendaring and scheduling has grown considerably in the
+ last decade. Enterprise and inter-enterprise business has become
+ dependent on rapid scheduling of events and actions using this
+ information technology. This memo is intended to progress the level
+ of interoperability possible between dissimilar calendaring and
+ scheduling applications. This memo defines a MIME content type for
+ exchanging electronic calendaring and scheduling information. The
+ Internet Calendaring and Scheduling Core Object Specification, or
+ iCalendar, allows for the capture and exchange of information
+ normally stored within a calendaring and scheduling application; such
+ as a Personal Information Manager (PIM) or a Group-Scheduling
+ product.
+
+ The iCalendar format is suitable as an exchange format between
+ applications or systems. The format is defined in terms of a MIME
+ content type. This will enable the object to be exchanged using
+ several transports, including but not limited to SMTP, HTTP, a file
+ system, desktop interactive protocols such as the use of a memory-
+ based clipboard or drag/drop interactions, point-to-point
+ asynchronous communication, wired-network transport, or some form of
+ unwired transport such as infrared.
+
+ The memo also provides for the definition of iCalendar object methods
+ that will map this content type to a set of messages for supporting
+ calendaring and scheduling operations such as requesting, replying
+ to, modifying, and canceling meetings or appointments, to-dos, and
+ journal entries. The iCalendar object methods can be used to define
+ other calendaring and scheduling operations such as requesting for
+ and replying with free/busy time data. Such a scheduling protocol is
+ defined in the iCalendar Transport-independent Interoperability
+ Protocol (iTIP) defined in [2446bis].
+
+ The memo also includes a formal grammar for the content type based on
+ the Internet ABNF defined in [RFC5234]. This ABNF is required for
+ the implementation of parsers and to serve as the definitive
+ reference when ambiguities or questions arise in interpreting the
+ descriptive prose definition of the memo. Additional restrictions
+
+
+
+Desruisseaux Standards Track [Page 5]
+
+RFC 5545 iCalendar September 2009
+
+
+ that could not easily be expressed with the ABNF syntax are specified
+ as comments in the ABNF. Comments with normative statements should
+ be treated as such.
+
+2. Basic Grammar and Conventions
+
+ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
+ "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
+ document are to be interpreted as described in [RFC2119].
+
+ This memo makes use of both a descriptive prose and a more formal
+ notation for defining the calendaring and scheduling format.
+
+ The notation used in this memo is the ABNF notation of [RFC5234].
+ Readers intending on implementing the format defined in this memo
+ should be familiar with this notation in order to properly interpret
+ the specifications of this memo.
+
+ All numeric values used in this memo are given in decimal notation.
+
+ All names of properties, property parameters, enumerated property
+ values, and property parameter values are case-insensitive. However,
+ all other property values are case-sensitive, unless otherwise
+ stated.
+
+ Note: All indented editorial notes, such as this one, are intended
+ to provide the reader with additional information. The
+ information is not essential to the building of an implementation
+ conformant with this memo. The information is provided to
+ highlight a particular feature or characteristic of the memo.
+
+ The format for the iCalendar object is based on the syntax of the
+ text/directory media type [RFC2425]. While the iCalendar object is
+ not a profile of the text/directory media type [RFC2425], it does
+ reuse a number of the elements from the [RFC2425] specification.
+
+2.1. Formatting Conventions
+
+ The elements defined in this memo are defined in prose. Many of the
+ terms used to describe these have common usage that is different than
+ the standards usage of this memo. In order to reference, within this
+ memo, elements of the calendaring and scheduling model, core object
+ (this memo), or interoperability protocol [2446bis] some formatting
+ conventions have been used. Calendaring and scheduling roles are
+ referred to in quoted-strings of text with the first character of
+ each word in uppercase. For example, "Organizer" refers to a role of
+ a "Calendar User" within the scheduling protocol defined by
+ [2446bis]. Calendar components defined by this memo are referred to
+
+
+
+Desruisseaux Standards Track [Page 6]
+
+RFC 5545 iCalendar September 2009
+
+
+ with capitalized, quoted-strings of text. All calendar components
+ start with the letter "V". For example, "VEVENT" refers to the event
+ calendar component, "VTODO" refers to the to-do calendar component,
+ and "VJOURNAL" refers to the daily journal calendar component.
+ Scheduling methods defined by iTIP [2446bis] are referred to with
+ capitalized, quoted-strings of text. For example, "REQUEST" refers
+ to the method for requesting a scheduling calendar component be
+ created or modified, and "REPLY" refers to the method a recipient of
+ a request uses to update their status with the "Organizer" of the
+ calendar component.
+
+ The properties defined by this memo are referred to with capitalized,
+ quoted-strings of text, followed by the word "property". For
+ example, "ATTENDEE" property refers to the iCalendar property used to
+ convey the calendar address of a calendar user. Property parameters
+ defined by this memo are referred to with lowercase, quoted-strings
+ of text, followed by the word "parameter". For example, "value"
+ parameter refers to the iCalendar property parameter used to override
+ the default value type for a property value. Enumerated values
+ defined by this memo are referred to with capitalized text, either
+ alone or followed by the word "value". For example, the "MINUTELY"
+ value can be used with the "FREQ" component of the "RECUR" value type
+ to specify repeating components based on an interval of one minute or
+ more.
+
+ The following table lists the different characters from the
+ [US-ASCII] character set that is referenced in this document. For
+ each character, the table specifies the character name used
+ throughout this document, along with its US-ASCII decimal codepoint.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 7]
+
+RFC 5545 iCalendar September 2009
+
+
+ +------------------------+-------------------+
+ | Character name | Decimal codepoint |
+ +------------------------+-------------------+
+ | HTAB | 9 |
+ | LF | 10 |
+ | CR | 13 |
+ | DQUOTE | 22 |
+ | SPACE | 32 |
+ | PLUS SIGN | 43 |
+ | COMMA | 44 |
+ | HYPHEN-MINUS | 45 |
+ | PERIOD | 46 |
+ | SOLIDUS | 47 |
+ | COLON | 58 |
+ | SEMICOLON | 59 |
+ | LATIN CAPITAL LETTER N | 78 |
+ | LATIN CAPITAL LETTER T | 84 |
+ | LATIN CAPITAL LETTER X | 88 |
+ | LATIN CAPITAL LETTER Z | 90 |
+ | BACKSLASH | 92 |
+ | LATIN SMALL LETTER N | 110 |
+ +------------------------+-------------------+
+
+2.2. Related Memos
+
+ Implementers will need to be familiar with several other memos that,
+ along with this memo, form a framework for Internet calendaring and
+ scheduling standards. This memo specifies a core specification of
+ objects, value types, properties, and property parameters.
+
+ o iTIP [2446bis] specifies an interoperability protocol for
+ scheduling between different implementations;
+
+ o iCalendar Message-Based Interoperability Protocol (iMIP) [2447bis]
+ specifies an Internet email binding for [2446bis].
+
+ This memo does not attempt to repeat the specification of concepts or
+ definitions from these other memos. Where possible, references are
+ made to the memo that provides for the specification of these
+ concepts or definitions.
+
+3. iCalendar Object Specification
+
+ The following sections define the details of a Calendaring and
+ Scheduling Core Object Specification. The Calendaring and Scheduling
+ Core Object is a collection of calendaring and scheduling
+ information. Typically, this information will consist of an
+ iCalendar stream with one or more iCalendar objects. The body of the
+
+
+
+Desruisseaux Standards Track [Page 8]
+
+RFC 5545 iCalendar September 2009
+
+
+ iCalendar object consists of a sequence of calendar properties and
+ one or more calendar components.
+
+ Section 3.1 defines the content line format; Section 3.2 defines the
+ property parameter format; Section 3.3 defines the data types for
+ property values; Section 3.4 defines the iCalendar object format;
+ Section 3.5 defines the iCalendar property format; Section 3.6
+ defines the calendar component format; Section 3.7 defines calendar
+ properties; and Section 3.8 defines calendar component properties.
+
+ This information is intended to be an integral part of the MIME
+ content type registration. In addition, this information can be used
+ independent of such content registration. In particular, this memo
+ has direct applicability for use as a calendaring and scheduling
+ exchange format in file-, memory-, or network-based transport
+ mechanisms.
+
+3.1. Content Lines
+
+ The iCalendar object is organized into individual lines of text,
+ called content lines. Content lines are delimited by a line break,
+ which is a CRLF sequence (CR character followed by LF character).
+
+ Lines of text SHOULD NOT be longer than 75 octets, excluding the line
+ break. Long content lines SHOULD be split into a multiple line
+ representations using a line "folding" technique. That is, a long
+ line can be split between any two characters by inserting a CRLF
+ immediately followed by a single linear white-space character (i.e.,
+ SPACE or HTAB). Any sequence of CRLF followed immediately by a
+ single linear white-space character is ignored (i.e., removed) when
+ processing the content type.
+
+ For example, the line:
+
+ DESCRIPTION:This is a long description that exists on a long line.
+
+ Can be represented as:
+
+ DESCRIPTION:This is a lo
+ ng description
+ that exists on a long line.
+
+ The process of moving from this folded multiple-line representation
+ to its single-line representation is called "unfolding". Unfolding
+ is accomplished by removing the CRLF and the linear white-space
+ character that immediately follows.
+
+
+
+
+
+Desruisseaux Standards Track [Page 9]
+
+RFC 5545 iCalendar September 2009
+
+
+ When parsing a content line, folded lines MUST first be unfolded
+ according to the unfolding procedure described above.
+
+ Note: It is possible for very simple implementations to generate
+ improperly folded lines in the middle of a UTF-8 multi-octet
+ sequence. For this reason, implementations need to unfold lines
+ in such a way to properly restore the original sequence.
+
+ The content information associated with an iCalendar object is
+ formatted using a syntax similar to that defined by [RFC2425]. That
+ is, the content information consists of CRLF-separated content lines.
+
+ The following notation defines the lines of content in an iCalendar
+ object:
+
+ contentline = name *(";" param ) ":" value CRLF
+ ; This ABNF is just a general definition for an initial parsing
+ ; of the content line into its property name, parameter list,
+ ; and value string
+
+ ; When parsing a content line, folded lines MUST first
+ ; be unfolded according to the unfolding procedure
+ ; described above. When generating a content line, lines
+ ; longer than 75 octets SHOULD be folded according to
+ ; the folding procedure described above.
+
+ name = iana-token / x-name
+
+ iana-token = 1*(ALPHA / DIGIT / "-")
+ ; iCalendar identifier registered with IANA
+
+ x-name = "X-" [vendorid "-"] 1*(ALPHA / DIGIT / "-")
+ ; Reserved for experimental use.
+
+ vendorid = 3*(ALPHA / DIGIT)
+ ; Vendor identification
+
+ param = param-name "=" param-value *("," param-value)
+ ; Each property defines the specific ABNF for the parameters
+ ; allowed on the property. Refer to specific properties for
+ ; precise parameter ABNF.
+
+ param-name = iana-token / x-name
+
+ param-value = paramtext / quoted-string
+
+ paramtext = *SAFE-CHAR
+
+
+
+
+Desruisseaux Standards Track [Page 10]
+
+RFC 5545 iCalendar September 2009
+
+
+ value = *VALUE-CHAR
+
+ quoted-string = DQUOTE *QSAFE-CHAR DQUOTE
+
+ QSAFE-CHAR = WSP / %x21 / %x23-7E / NON-US-ASCII
+ ; Any character except CONTROL and DQUOTE
+
+ SAFE-CHAR = WSP / %x21 / %x23-2B / %x2D-39 / %x3C-7E
+ / NON-US-ASCII
+ ; Any character except CONTROL, DQUOTE, ";", ":", ","
+
+ VALUE-CHAR = WSP / %x21-7E / NON-US-ASCII
+ ; Any textual character
+
+ NON-US-ASCII = UTF8-2 / UTF8-3 / UTF8-4
+ ; UTF8-2, UTF8-3, and UTF8-4 are defined in [RFC3629]
+
+ CONTROL = %x00-08 / %x0A-1F / %x7F
+ ; All the controls except HTAB
+
+ The property value component of a content line has a format that is
+ property specific. Refer to the section describing each property for
+ a definition of this format.
+
+ All names of properties, property parameters, enumerated property
+ values and property parameter values are case-insensitive. However,
+ all other property values are case-sensitive, unless otherwise
+ stated.
+
+3.1.1. List and Field Separators
+
+ Some properties and parameters allow a list of values. Values in a
+ list of values MUST be separated by a COMMA character. There is no
+ significance to the order of values in a list. For those parameter
+ values (such as those that specify URI values) that are specified in
+ quoted-strings, the individual quoted-strings are separated by a
+ COMMA character.
+
+ Some property values are defined in terms of multiple parts. These
+ structured property values MUST have their value parts separated by a
+ SEMICOLON character.
+
+ Some properties allow a list of parameters. Each property parameter
+ in a list of property parameters MUST be separated by a SEMICOLON
+ character.
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 11]
+
+RFC 5545 iCalendar September 2009
+
+
+ Property parameters with values containing a COLON character, a
+ SEMICOLON character or a COMMA character MUST be placed in quoted
+ text.
+
+ For example, in the following properties, a SEMICOLON is used to
+ separate property parameters from each other and a COMMA character is
+ used to separate property values in a value list.
+
+ ATTENDEE;RSVP=TRUE;ROLE=REQ-PARTICIPANT:mailto:
+ jsmith@example.com
+
+ RDATE;VALUE=DATE:19970304,19970504,19970704,19970904
+
+3.1.2. Multiple Values
+
+ Some properties defined in the iCalendar object can have multiple
+ values. The general rule for encoding multi-valued items is to
+ simply create a new content line for each value, including the
+ property name. However, it should be noted that some properties
+ support encoding multiple values in a single property by separating
+ the values with a COMMA character. Individual property definitions
+ should be consulted for determining whether a specific property
+ allows multiple values and in which of these two forms. Multi-valued
+ properties MUST NOT be used to specify multiple language variants of
+ the same value. Calendar applications SHOULD display all values.
+
+3.1.3. Binary Content
+
+ Binary content information in an iCalendar object SHOULD be
+ referenced using a URI within a property value. That is, the binary
+ content information SHOULD be placed in an external MIME entity that
+ can be referenced by a URI from within the iCalendar object. In
+ applications where this is not feasible, binary content information
+ can be included within an iCalendar object, but only after first
+ encoding it into text using the "BASE64" encoding method defined in
+ [RFC4648]. Inline binary content SHOULD only be used in applications
+ whose special circumstances demand that an iCalendar object be
+ expressed as a single entity. A property containing inline binary
+ content information MUST specify the "ENCODING" property parameter.
+ Binary content information placed external to the iCalendar object
+ MUST be referenced by a uniform resource identifier (URI).
+
+ The following example specifies an "ATTACH" property that references
+ an attachment external to the iCalendar object with a URI reference:
+
+ ATTACH:http://example.com/public/quarterly-report.doc
+
+
+
+
+
+Desruisseaux Standards Track [Page 12]
+
+RFC 5545 iCalendar September 2009
+
+
+ The following example specifies an "ATTACH" property with inline
+ binary encoded content information:
+
+ ATTACH;FMTTYPE=text/plain;ENCODING=BASE64;VALUE=BINARY:VGhlIH
+ F1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZy4
+
+3.1.4. Character Set
+
+ There is not a property parameter to declare the charset used in a
+ property value. The default charset for an iCalendar stream is UTF-8
+ as defined in [RFC3629].
+
+ The "charset" Content-Type parameter MUST be used in MIME transports
+ to specify the charset being used.
+
+3.2. Property Parameters
+
+ A property can have attributes with which it is associated. These
+ "property parameters" contain meta-information about the property or
+ the property value. Property parameters are provided to specify such
+ information as the location of an alternate text representation for a
+ property value, the language of a text property value, the value type
+ of the property value, and other attributes.
+
+ Property parameter values that contain the COLON, SEMICOLON, or COMMA
+ character separators MUST be specified as quoted-string text values.
+ Property parameter values MUST NOT contain the DQUOTE character. The
+ DQUOTE character is used as a delimiter for parameter values that
+ contain restricted characters or URI text. For example:
+
+ DESCRIPTION;ALTREP="cid:part1.0001@example.org":The Fall'98 Wild
+ Wizards Conference - - Las Vegas\, NV\, USA
+
+ Property parameter values that are not in quoted-strings are case-
+ insensitive.
+
+ The general property parameters defined by this memo are defined by
+ the following notation:
+
+
+
+
+
+
+
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 13]
+
+RFC 5545 iCalendar September 2009
+
+
+ icalparameter = altrepparam ; Alternate text representation
+ / cnparam ; Common name
+ / cutypeparam ; Calendar user type
+ / delfromparam ; Delegator
+ / deltoparam ; Delegatee
+ / dirparam ; Directory entry
+ / encodingparam ; Inline encoding
+ / fmttypeparam ; Format type
+ / fbtypeparam ; Free/busy time type
+ / languageparam ; Language for text
+ / memberparam ; Group or list membership
+ / partstatparam ; Participation status
+ / rangeparam ; Recurrence identifier range
+ / trigrelparam ; Alarm trigger relationship
+ / reltypeparam ; Relationship type
+ / roleparam ; Participation role
+ / rsvpparam ; RSVP expectation
+ / sentbyparam ; Sent by
+ / tzidparam ; Reference to time zone object
+ / valuetypeparam ; Property value data type
+ / other-param
+
+ other-param = (iana-param / x-param)
+
+ iana-param = iana-token "=" param-value *("," param-value)
+ ; Some other IANA-registered iCalendar parameter.
+
+ x-param = x-name "=" param-value *("," param-value)
+ ; A non-standard, experimental parameter.
+
+ Applications MUST ignore x-param and iana-param values they don't
+ recognize.
+
+3.2.1. Alternate Text Representation
+
+ Parameter Name: ALTREP
+
+ Purpose: To specify an alternate text representation for the
+ property value.
+
+ Format Definition: This property parameter is defined by the
+ following notation:
+
+ altrepparam = "ALTREP" "=" DQUOTE uri DQUOTE
+
+ Description: This parameter specifies a URI that points to an
+ alternate representation for a textual property value. A property
+ specifying this parameter MUST also include a value that reflects
+
+
+
+Desruisseaux Standards Track [Page 14]
+
+RFC 5545 iCalendar September 2009
+
+
+ the default representation of the text value. The URI parameter
+ value MUST be specified in a quoted-string.
+
+ Note: While there is no restriction imposed on the URI schemes
+ allowed for this parameter, Content Identifier (CID) [RFC2392],
+ HTTP [RFC2616], and HTTPS [RFC2818] are the URI schemes most
+ commonly used by current implementations.
+
+ Example:
+
+ DESCRIPTION;ALTREP="CID:part3.msg.970415T083000@example.com":
+ Project XYZ Review Meeting will include the following agenda
+ items: (a) Market Overview\, (b) Finances\, (c) Project Man
+ agement
+
+ The "ALTREP" property parameter value might point to a "text/html"
+ content portion.
+
+ Content-Type:text/html
+ Content-Id:<part3.msg.970415T083000@example.com>
+
+ <html>
+ <head>
+ <title></title>
+ </head>
+ <body>
+ <p>
+ <b>Project XYZ Review Meeting</b> will include
+ the following agenda items:
+ <ol>
+ <li>Market Overview</li>
+ <li>Finances</li>
+ <li>Project Management</li>
+ </ol>
+ </p>
+ </body>
+ </html>
+
+3.2.2. Common Name
+
+ Parameter Name: CN
+
+ Purpose: To specify the common name to be associated with the
+ calendar user specified by the property.
+
+ Format Definition: This property parameter is defined by the
+ following notation:
+
+
+
+
+Desruisseaux Standards Track [Page 15]
+
+RFC 5545 iCalendar September 2009
+
+
+ cnparam = "CN" "=" param-value
+
+ Description: This parameter can be specified on properties with a
+ CAL-ADDRESS value type. The parameter specifies the common name
+ to be associated with the calendar user specified by the property.
+ The parameter value is text. The parameter value can be used for
+ display text to be associated with the calendar address specified
+ by the property.
+
+ Example:
+
+ ORGANIZER;CN="John Smith":mailto:jsmith@example.com
+
+3.2.3. Calendar User Type
+
+ Parameter Name: CUTYPE
+
+ Purpose: To identify the type of calendar user specified by the
+ property.
+
+ Format Definition: This property parameter is defined by the
+ following notation:
+
+ cutypeparam = "CUTYPE" "="
+ ("INDIVIDUAL" ; An individual
+ / "GROUP" ; A group of individuals
+ / "RESOURCE" ; A physical resource
+ / "ROOM" ; A room resource
+ / "UNKNOWN" ; Otherwise not known
+ / x-name ; Experimental type
+ / iana-token) ; Other IANA-registered
+ ; type
+ ; Default is INDIVIDUAL
+
+ Description: This parameter can be specified on properties with a
+ CAL-ADDRESS value type. The parameter identifies the type of
+ calendar user specified by the property. If not specified on a
+ property that allows this parameter, the default is INDIVIDUAL.
+ Applications MUST treat x-name and iana-token values they don't
+ recognize the same way as they would the UNKNOWN value.
+
+ Example:
+
+ ATTENDEE;CUTYPE=GROUP:mailto:ietf-calsch@example.org
+
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 16]
+
+RFC 5545 iCalendar September 2009
+
+
+3.2.4. Delegators
+
+ Parameter Name: DELEGATED-FROM
+
+ Purpose: To specify the calendar users that have delegated their
+ participation to the calendar user specified by the property.
+
+ Format Definition: This property parameter is defined by the
+ following notation:
+
+ delfromparam = "DELEGATED-FROM" "=" DQUOTE cal-address
+ DQUOTE *("," DQUOTE cal-address DQUOTE)
+
+ Description: This parameter can be specified on properties with a
+ CAL-ADDRESS value type. This parameter specifies those calendar
+ users that have delegated their participation in a group-scheduled
+ event or to-do to the calendar user specified by the property.
+ The individual calendar address parameter values MUST each be
+ specified in a quoted-string.
+
+ Example:
+
+ ATTENDEE;DELEGATED-FROM="mailto:jsmith@example.com":mailto:
+ jdoe@example.com
+
+3.2.5. Delegatees
+
+ Parameter Name: DELEGATED-TO
+
+ Purpose: To specify the calendar users to whom the calendar user
+ specified by the property has delegated participation.
+
+ Format Definition: This property parameter is defined by the
+ following notation:
+
+ deltoparam = "DELEGATED-TO" "=" DQUOTE cal-address DQUOTE
+ *("," DQUOTE cal-address DQUOTE)
+
+ Description: This parameter can be specified on properties with a
+ CAL-ADDRESS value type. This parameter specifies those calendar
+ users whom have been delegated participation in a group-scheduled
+ event or to-do by the calendar user specified by the property.
+ The individual calendar address parameter values MUST each be
+ specified in a quoted-string.
+
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 17]
+
+RFC 5545 iCalendar September 2009
+
+
+ Example:
+
+ ATTENDEE;DELEGATED-TO="mailto:jdoe@example.com","mailto:jqpublic
+ @example.com":mailto:jsmith@example.com
+
+3.2.6. Directory Entry Reference
+
+ Parameter Name: DIR
+
+ Purpose: To specify reference to a directory entry associated with
+ the calendar user specified by the property.
+
+ Format Definition: This property parameter is defined by the
+ following notation:
+
+ dirparam = "DIR" "=" DQUOTE uri DQUOTE
+
+ Description: This parameter can be specified on properties with a
+ CAL-ADDRESS value type. The parameter specifies a reference to
+ the directory entry associated with the calendar user specified by
+ the property. The parameter value is a URI. The URI parameter
+ value MUST be specified in a quoted-string.
+
+ Note: While there is no restriction imposed on the URI schemes
+ allowed for this parameter, CID [RFC2392], DATA [RFC2397], FILE
+ [RFC1738], FTP [RFC1738], HTTP [RFC2616], HTTPS [RFC2818], LDAP
+ [RFC4516], and MID [RFC2392] are the URI schemes most commonly
+ used by current implementations.
+
+ Example:
+
+ ORGANIZER;DIR="ldap://example.com:6666/o=ABC%20Industries,
+ c=US???(cn=Jim%20Dolittle)":mailto:jimdo@example.com
+
+3.2.7. Inline Encoding
+
+ Parameter Name: ENCODING
+
+ Purpose: To specify an alternate inline encoding for the property
+ value.
+
+ Format Definition: This property parameter is defined by the
+ following notation:
+
+
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 18]
+
+RFC 5545 iCalendar September 2009
+
+
+ encodingparam = "ENCODING" "="
+ ( "8BIT"
+ ; "8bit" text encoding is defined in [RFC2045]
+ / "BASE64"
+ ; "BASE64" binary encoding format is defined in [RFC4648]
+ )
+
+ Description: This property parameter identifies the inline encoding
+ used in a property value. The default encoding is "8BIT",
+ corresponding to a property value consisting of text. The
+ "BASE64" encoding type corresponds to a property value encoded
+ using the "BASE64" encoding defined in [RFC2045].
+
+ If the value type parameter is ";VALUE=BINARY", then the inline
+ encoding parameter MUST be specified with the value
+ ";ENCODING=BASE64".
+
+ Example:
+
+ ATTACH;FMTTYPE=text/plain;ENCODING=BASE64;VALUE=BINARY:TG9yZW
+ 0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2ljaW
+ 5nIGVsaXQsIHNlZCBkbyBlaXVzbW9kIHRlbXBvciBpbmNpZGlkdW50IHV0IG
+ xhYm9yZSBldCBkb2xvcmUgbWFnbmEgYWxpcXVhLiBVdCBlbmltIGFkIG1pbm
+ ltIHZlbmlhbSwgcXVpcyBub3N0cnVkIGV4ZXJjaXRhdGlvbiB1bGxhbWNvIG
+ xhYm9yaXMgbmlzaSB1dCBhbGlxdWlwIGV4IGVhIGNvbW1vZG8gY29uc2VxdW
+ F0LiBEdWlzIGF1dGUgaXJ1cmUgZG9sb3IgaW4gcmVwcmVoZW5kZXJpdCBpbi
+ B2b2x1cHRhdGUgdmVsaXQgZXNzZSBjaWxsdW0gZG9sb3JlIGV1IGZ1Z2lhdC
+ BudWxsYSBwYXJpYXR1ci4gRXhjZXB0ZXVyIHNpbnQgb2NjYWVjYXQgY3VwaW
+ RhdGF0IG5vbiBwcm9pZGVudCwgc3VudCBpbiBjdWxwYSBxdWkgb2ZmaWNpYS
+ BkZXNlcnVudCBtb2xsaXQgYW5pbSBpZCBlc3QgbGFib3J1bS4=
+
+3.2.8. Format Type
+
+ Parameter Name: FMTTYPE
+
+ Purpose: To specify the content type of a referenced object.
+
+ Format Definition: This property parameter is defined by the
+ following notation:
+
+ fmttypeparam = "FMTTYPE" "=" type-name "/" subtype-name
+ ; Where "type-name" and "subtype-name" are
+ ; defined in Section 4.2 of [RFC4288].
+
+ Description: This parameter can be specified on properties that are
+ used to reference an object. The parameter specifies the media
+ type [RFC4288] of the referenced object. For example, on the
+ "ATTACH" property, an FTP type URI value does not, by itself,
+
+
+
+Desruisseaux Standards Track [Page 19]
+
+RFC 5545 iCalendar September 2009
+
+
+ necessarily convey the type of content associated with the
+ resource. The parameter value MUST be the text for either an
+ IANA-registered media type or a non-standard media type.
+
+ Example:
+
+ ATTACH;FMTTYPE=application/msword:ftp://example.com/pub/docs/
+ agenda.doc
+
+3.2.9. Free/Busy Time Type
+
+ Parameter Name: FBTYPE
+
+ Purpose: To specify the free or busy time type.
+
+ Format Definition: This property parameter is defined by the
+ following notation:
+
+ fbtypeparam = "FBTYPE" "=" ("FREE" / "BUSY"
+ / "BUSY-UNAVAILABLE" / "BUSY-TENTATIVE"
+ / x-name
+ ; Some experimental iCalendar free/busy type.
+ / iana-token)
+ ; Some other IANA-registered iCalendar free/busy type.
+
+ Description: This parameter specifies the free or busy time type.
+ The value FREE indicates that the time interval is free for
+ scheduling. The value BUSY indicates that the time interval is
+ busy because one or more events have been scheduled for that
+ interval. The value BUSY-UNAVAILABLE indicates that the time
+ interval is busy and that the interval can not be scheduled. The
+ value BUSY-TENTATIVE indicates that the time interval is busy
+ because one or more events have been tentatively scheduled for
+ that interval. If not specified on a property that allows this
+ parameter, the default is BUSY. Applications MUST treat x-name
+ and iana-token values they don't recognize the same way as they
+ would the BUSY value.
+
+ Example: The following is an example of this parameter on a
+ "FREEBUSY" property.
+
+ FREEBUSY;FBTYPE=BUSY:19980415T133000Z/19980415T170000Z
+
+
+
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 20]
+
+RFC 5545 iCalendar September 2009
+
+
+3.2.10. Language
+
+ Parameter Name: LANGUAGE
+
+ Purpose: To specify the language for text values in a property or
+ property parameter.
+
+ Format Definition: This property parameter is defined by the
+ following notation:
+
+ languageparam = "LANGUAGE" "=" language
+
+ language = Language-Tag
+ ; As defined in [RFC5646].
+
+ Description: This parameter identifies the language of the text in
+ the property value and of all property parameter values of the
+ property. The value of the "LANGUAGE" property parameter is that
+ defined in [RFC5646].
+
+ For transport in a MIME entity, the Content-Language header field
+ can be used to set the default language for the entire body part.
+ Otherwise, no default language is assumed.
+
+ Example: The following are examples of this parameter on the
+ "SUMMARY" and "LOCATION" properties:
+
+ SUMMARY;LANGUAGE=en-US:Company Holiday Party
+
+ LOCATION;LANGUAGE=en:Germany
+
+ LOCATION;LANGUAGE=no:Tyskland
+
+3.2.11. Group or List Membership
+
+ Parameter Name: MEMBER
+
+ Purpose: To specify the group or list membership of the calendar
+ user specified by the property.
+
+ Format Definition: This property parameter is defined by the
+ following notation:
+
+ memberparam = "MEMBER" "=" DQUOTE cal-address DQUOTE
+ *("," DQUOTE cal-address DQUOTE)
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 21]
+
+RFC 5545 iCalendar September 2009
+
+
+ Description: This parameter can be specified on properties with a
+ CAL-ADDRESS value type. The parameter identifies the groups or
+ list membership for the calendar user specified by the property.
+ The parameter value is either a single calendar address in a
+ quoted-string or a COMMA-separated list of calendar addresses,
+ each in a quoted-string. The individual calendar address
+ parameter values MUST each be specified in a quoted-string.
+
+ Example:
+
+ ATTENDEE;MEMBER="mailto:ietf-calsch@example.org":mailto:
+ jsmith@example.com
+
+ ATTENDEE;MEMBER="mailto:projectA@example.com","mailto:pr
+ ojectB@example.com":mailto:janedoe@example.com
+
+3.2.12. Participation Status
+
+ Parameter Name: PARTSTAT
+
+ Purpose: To specify the participation status for the calendar user
+ specified by the property.
+
+ Format Definition: This property parameter is defined by the
+ following notation:
+
+ partstatparam = "PARTSTAT" "="
+ (partstat-event
+ / partstat-todo
+ / partstat-jour)
+
+ partstat-event = ("NEEDS-ACTION" ; Event needs action
+ / "ACCEPTED" ; Event accepted
+ / "DECLINED" ; Event declined
+ / "TENTATIVE" ; Event tentatively
+ ; accepted
+ / "DELEGATED" ; Event delegated
+ / x-name ; Experimental status
+ / iana-token) ; Other IANA-registered
+ ; status
+ ; These are the participation statuses for a "VEVENT".
+ ; Default is NEEDS-ACTION.
+
+ partstat-todo = ("NEEDS-ACTION" ; To-do needs action
+ / "ACCEPTED" ; To-do accepted
+ / "DECLINED" ; To-do declined
+ / "TENTATIVE" ; To-do tentatively
+ ; accepted
+
+
+
+Desruisseaux Standards Track [Page 22]
+
+RFC 5545 iCalendar September 2009
+
+
+ / "DELEGATED" ; To-do delegated
+ / "COMPLETED" ; To-do completed
+ ; COMPLETED property has
+ ; DATE-TIME completed
+ / "IN-PROCESS" ; To-do in process of
+ ; being completed
+ / x-name ; Experimental status
+ / iana-token) ; Other IANA-registered
+ ; status
+ ; These are the participation statuses for a "VTODO".
+ ; Default is NEEDS-ACTION.
+
+
+
+ partstat-jour = ("NEEDS-ACTION" ; Journal needs action
+ / "ACCEPTED" ; Journal accepted
+ / "DECLINED" ; Journal declined
+ / x-name ; Experimental status
+ / iana-token) ; Other IANA-registered
+ ; status
+ ; These are the participation statuses for a "VJOURNAL".
+ ; Default is NEEDS-ACTION.
+
+ Description: This parameter can be specified on properties with a
+ CAL-ADDRESS value type. The parameter identifies the
+ participation status for the calendar user specified by the
+ property value. The parameter values differ depending on whether
+ they are associated with a group-scheduled "VEVENT", "VTODO", or
+ "VJOURNAL". The values MUST match one of the values allowed for
+ the given calendar component. If not specified on a property that
+ allows this parameter, the default value is NEEDS-ACTION.
+ Applications MUST treat x-name and iana-token values they don't
+ recognize the same way as they would the NEEDS-ACTION value.
+
+ Example:
+
+ ATTENDEE;PARTSTAT=DECLINED:mailto:jsmith@example.com
+
+3.2.13. Recurrence Identifier Range
+
+ Parameter Name: RANGE
+
+ Purpose: To specify the effective range of recurrence instances from
+ the instance specified by the recurrence identifier specified by
+ the property.
+
+ Format Definition: This property parameter is defined by the
+ following notation:
+
+
+
+Desruisseaux Standards Track [Page 23]
+
+RFC 5545 iCalendar September 2009
+
+
+ rangeparam = "RANGE" "=" "THISANDFUTURE"
+ ; To specify the instance specified by the recurrence identifier
+ ; and all subsequent recurrence instances.
+
+ Description: This parameter can be specified on a property that
+ specifies a recurrence identifier. The parameter specifies the
+ effective range of recurrence instances that is specified by the
+ property. The effective range is from the recurrence identifier
+ specified by the property. If this parameter is not specified on
+ an allowed property, then the default range is the single instance
+ specified by the recurrence identifier value of the property. The
+ parameter value can only be "THISANDFUTURE" to indicate a range
+ defined by the recurrence identifier and all subsequent instances.
+ The value "THISANDPRIOR" is deprecated by this revision of
+ iCalendar and MUST NOT be generated by applications.
+
+ Example:
+
+ RECURRENCE-ID;RANGE=THISANDFUTURE:19980401T133000Z
+
+3.2.14. Alarm Trigger Relationship
+
+ Parameter Name: RELATED
+
+ Purpose: To specify the relationship of the alarm trigger with
+ respect to the start or end of the calendar component.
+
+ Format Definition: This property parameter is defined by the
+ following notation:
+
+ trigrelparam = "RELATED" "="
+ ("START" ; Trigger off of start
+ / "END") ; Trigger off of end
+
+ Description: This parameter can be specified on properties that
+ specify an alarm trigger with a "DURATION" value type. The
+ parameter specifies whether the alarm will trigger relative to the
+ start or end of the calendar component. The parameter value START
+ will set the alarm to trigger off the start of the calendar
+ component; the parameter value END will set the alarm to trigger
+ off the end of the calendar component. If the parameter is not
+ specified on an allowable property, then the default is START.
+
+ Example:
+
+ TRIGGER;RELATED=END:PT5M
+
+
+
+
+
+Desruisseaux Standards Track [Page 24]
+
+RFC 5545 iCalendar September 2009
+
+
+3.2.15. Relationship Type
+
+ Parameter Name: RELTYPE
+
+ Purpose: To specify the type of hierarchical relationship associated
+ with the calendar component specified by the property.
+
+ Format Definition: This property parameter is defined by the
+ following notation:
+
+ reltypeparam = "RELTYPE" "="
+ ("PARENT" ; Parent relationship - Default
+ / "CHILD" ; Child relationship
+ / "SIBLING" ; Sibling relationship
+ / iana-token ; Some other IANA-registered
+ ; iCalendar relationship type
+ / x-name) ; A non-standard, experimental
+ ; relationship type
+
+ Description: This parameter can be specified on a property that
+ references another related calendar. The parameter specifies the
+ hierarchical relationship type of the calendar component
+ referenced by the property. The parameter value can be PARENT, to
+ indicate that the referenced calendar component is a superior of
+ calendar component; CHILD to indicate that the referenced calendar
+ component is a subordinate of the calendar component; or SIBLING
+ to indicate that the referenced calendar component is a peer of
+ the calendar component. If this parameter is not specified on an
+ allowable property, the default relationship type is PARENT.
+ Applications MUST treat x-name and iana-token values they don't
+ recognize the same way as they would the PARENT value.
+
+ Example:
+
+ RELATED-TO;RELTYPE=SIBLING:19960401-080045-4000F192713@
+ example.com
+
+3.2.16. Participation Role
+
+ Parameter Name: ROLE
+
+ Purpose: To specify the participation role for the calendar user
+ specified by the property.
+
+ Format Definition: This property parameter is defined by the
+ following notation:
+
+
+
+
+
+Desruisseaux Standards Track [Page 25]
+
+RFC 5545 iCalendar September 2009
+
+
+ roleparam = "ROLE" "="
+ ("CHAIR" ; Indicates chair of the
+ ; calendar entity
+ / "REQ-PARTICIPANT" ; Indicates a participant whose
+ ; participation is required
+ / "OPT-PARTICIPANT" ; Indicates a participant whose
+ ; participation is optional
+ / "NON-PARTICIPANT" ; Indicates a participant who
+ ; is copied for information
+ ; purposes only
+ / x-name ; Experimental role
+ / iana-token) ; Other IANA role
+ ; Default is REQ-PARTICIPANT
+
+ Description: This parameter can be specified on properties with a
+ CAL-ADDRESS value type. The parameter specifies the participation
+ role for the calendar user specified by the property in the group
+ schedule calendar component. If not specified on a property that
+ allows this parameter, the default value is REQ-PARTICIPANT.
+ Applications MUST treat x-name and iana-token values they don't
+ recognize the same way as they would the REQ-PARTICIPANT value.
+
+ Example:
+
+ ATTENDEE;ROLE=CHAIR:mailto:mrbig@example.com
+
+3.2.17. RSVP Expectation
+
+ Parameter Name: RSVP
+
+ Purpose: To specify whether there is an expectation of a favor of a
+ reply from the calendar user specified by the property value.
+
+ Format Definition: This property parameter is defined by the
+ following notation:
+
+ rsvpparam = "RSVP" "=" ("TRUE" / "FALSE")
+ ; Default is FALSE
+
+ Description: This parameter can be specified on properties with a
+ CAL-ADDRESS value type. The parameter identifies the expectation
+ of a reply from the calendar user specified by the property value.
+ This parameter is used by the "Organizer" to request a
+ participation status reply from an "Attendee" of a group-scheduled
+ event or to-do. If not specified on a property that allows this
+ parameter, the default value is FALSE.
+
+
+
+
+
+Desruisseaux Standards Track [Page 26]
+
+RFC 5545 iCalendar September 2009
+
+
+ Example:
+
+ ATTENDEE;RSVP=TRUE:mailto:jsmith@example.com
+
+3.2.18. Sent By
+
+ Parameter Name: SENT-BY
+
+ Purpose: To specify the calendar user that is acting on behalf of
+ the calendar user specified by the property.
+
+ Format Definition: This property parameter is defined by the
+ following notation:
+
+ sentbyparam = "SENT-BY" "=" DQUOTE cal-address DQUOTE
+
+ Description: This parameter can be specified on properties with a
+ CAL-ADDRESS value type. The parameter specifies the calendar user
+ that is acting on behalf of the calendar user specified by the
+ property. The parameter value MUST be a mailto URI as defined in
+ [RFC2368]. The individual calendar address parameter values MUST
+ each be specified in a quoted-string.
+
+ Example:
+
+ ORGANIZER;SENT-BY="mailto:sray@example.com":mailto:
+ jsmith@example.com
+
+3.2.19. Time Zone Identifier
+
+ Parameter Name: TZID
+
+ Purpose: To specify the identifier for the time zone definition for
+ a time component in the property value.
+
+ Format Definition: This property parameter is defined by the
+ following notation:
+
+ tzidparam = "TZID" "=" [tzidprefix] paramtext
+
+ tzidprefix = "/"
+
+ Description: This parameter MUST be specified on the "DTSTART",
+ "DTEND", "DUE", "EXDATE", and "RDATE" properties when either a
+ DATE-TIME or TIME value type is specified and when the value is
+ neither a UTC or a "floating" time. Refer to the DATE-TIME or
+ TIME value type definition for a description of UTC and "floating
+ time" formats. This property parameter specifies a text value
+
+
+
+Desruisseaux Standards Track [Page 27]
+
+RFC 5545 iCalendar September 2009
+
+
+ that uniquely identifies the "VTIMEZONE" calendar component to be
+ used when evaluating the time portion of the property. The value
+ of the "TZID" property parameter will be equal to the value of the
+ "TZID" property for the matching time zone definition. An
+ individual "VTIMEZONE" calendar component MUST be specified for
+ each unique "TZID" parameter value specified in the iCalendar
+ object.
+
+ The parameter MUST be specified on properties with a DATE-TIME
+ value if the DATE-TIME is not either a UTC or a "floating" time.
+ Failure to include and follow VTIMEZONE definitions in iCalendar
+ objects may lead to inconsistent understanding of the local time
+ at any given location.
+
+ The presence of the SOLIDUS character as a prefix, indicates that
+ this "TZID" represents a unique ID in a globally defined time zone
+ registry (when such registry is defined).
+
+ Note: This document does not define a naming convention for
+ time zone identifiers. Implementers may want to use the naming
+ conventions defined in existing time zone specifications such
+ as the public-domain TZ database [TZDB]. The specification of
+ globally unique time zone identifiers is not addressed by this
+ document and is left for future study.
+
+ The following are examples of this property parameter:
+
+ DTSTART;TZID=America/New_York:19980119T020000
+
+ DTEND;TZID=America/New_York:19980119T030000
+
+ The "TZID" property parameter MUST NOT be applied to DATE
+ properties and DATE-TIME or TIME properties whose time values are
+ specified in UTC.
+
+ The use of local time in a DATE-TIME or TIME value without the
+ "TZID" property parameter is to be interpreted as floating time,
+ regardless of the existence of "VTIMEZONE" calendar components in
+ the iCalendar object.
+
+ For more information, see the sections on the value types DATE-
+ TIME and TIME.
+
+
+
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 28]
+
+RFC 5545 iCalendar September 2009
+
+
+3.2.20. Value Data Types
+
+ Parameter Name: VALUE
+
+ Purpose: To explicitly specify the value type format for a property
+ value.
+
+ Format Definition: This property parameter is defined by the
+ following notation:
+
+ valuetypeparam = "VALUE" "=" valuetype
+
+ valuetype = ("BINARY"
+ / "BOOLEAN"
+ / "CAL-ADDRESS"
+ / "DATE"
+ / "DATE-TIME"
+ / "DURATION"
+ / "FLOAT"
+ / "INTEGER"
+ / "PERIOD"
+ / "RECUR"
+ / "TEXT"
+ / "TIME"
+ / "URI"
+ / "UTC-OFFSET"
+ / x-name
+ ; Some experimental iCalendar value type.
+ / iana-token)
+ ; Some other IANA-registered iCalendar value type.
+
+ Description: This parameter specifies the value type and format of
+ the property value. The property values MUST be of a single value
+ type. For example, a "RDATE" property cannot have a combination
+ of DATE-TIME and TIME value types.
+
+ If the property's value is the default value type, then this
+ parameter need not be specified. However, if the property's
+ default value type is overridden by some other allowable value
+ type, then this parameter MUST be specified.
+
+ Applications MUST preserve the value data for x-name and iana-
+ token values that they don't recognize without attempting to
+ interpret or parse the value data.
+
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 29]
+
+RFC 5545 iCalendar September 2009
+
+
+3.3. Property Value Data Types
+
+ The properties in an iCalendar object are strongly typed. The
+ definition of each property restricts the value to be one of the
+ value data types, or simply value types, defined in this section.
+ The value type for a property will either be specified implicitly as
+ the default value type or will be explicitly specified with the
+ "VALUE" parameter. If the value type of a property is one of the
+ alternate valid types, then it MUST be explicitly specified with the
+ "VALUE" parameter.
+
+3.3.1. Binary
+
+ Value Name: BINARY
+
+ Purpose: This value type is used to identify properties that contain
+ a character encoding of inline binary data. For example, an
+ inline attachment of a document might be included in an iCalendar
+ object.
+
+ Format Definition: This value type is defined by the following
+ notation:
+
+ binary = *(4b-char) [b-end]
+ ; A "BASE64" encoded character string, as defined by [RFC4648].
+
+ b-end = (2b-char "==") / (3b-char "=")
+
+ b-char = ALPHA / DIGIT / "+" / "/"
+
+ Description: Property values with this value type MUST also include
+ the inline encoding parameter sequence of ";ENCODING=BASE64".
+ That is, all inline binary data MUST first be character encoded
+ using the "BASE64" encoding method defined in [RFC2045]. No
+ additional content value encoding (i.e., BACKSLASH character
+ encoding, see Section 3.3.11) is defined for this value type.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 30]
+
+RFC 5545 iCalendar September 2009
+
+
+ Example: The following is an example of a "BASE64" encoded binary
+ value data:
+
+ ATTACH;FMTTYPE=image/vnd.microsoft.icon;ENCODING=BASE64;VALUE
+ =BINARY:AAABAAEAEBAQAAEABAAoAQAAFgAAACgAAAAQAAAAIAAAAAEABAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAgIAAAICAgADAwMAA////AAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAMwAAAAAAABNEMQAAAAAAAkQgAAAAAAJEREQgAA
+ ACECQ0QgEgAAQxQzM0E0AABERCRCREQAADRDJEJEQwAAAhA0QwEQAAAAAERE
+ AAAAAAAAREQAAAAAAAAkQgAAAAAAAAMgAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAA
+
+3.3.2. Boolean
+
+ Value Name: BOOLEAN
+
+ Purpose: This value type is used to identify properties that contain
+ either a "TRUE" or "FALSE" Boolean value.
+
+ Format Definition: This value type is defined by the following
+ notation:
+
+ boolean = "TRUE" / "FALSE"
+
+ Description: These values are case-insensitive text. No additional
+ content value encoding (i.e., BACKSLASH character encoding, see
+ Section 3.3.11) is defined for this value type.
+
+ Example: The following is an example of a hypothetical property that
+ has a BOOLEAN value type:
+
+ TRUE
+
+3.3.3. Calendar User Address
+
+ Value Name: CAL-ADDRESS
+
+ Purpose: This value type is used to identify properties that contain
+ a calendar user address.
+
+ Format Definition: This value type is defined by the following
+ notation:
+
+ cal-address = uri
+
+ Description: The value is a URI as defined by [RFC3986] or any other
+ IANA-registered form for a URI. When used to address an Internet
+
+
+
+Desruisseaux Standards Track [Page 31]
+
+RFC 5545 iCalendar September 2009
+
+
+ email transport address for a calendar user, the value MUST be a
+ mailto URI, as defined by [RFC2368]. No additional content value
+ encoding (i.e., BACKSLASH character encoding, see Section 3.3.11)
+ is defined for this value type.
+
+ Example:
+
+ mailto:jane_doe@example.com
+
+3.3.4. Date
+
+ Value Name: DATE
+
+ Purpose: This value type is used to identify values that contain a
+ calendar date.
+
+ Format Definition: This value type is defined by the following
+ notation:
+
+ date = date-value
+
+ date-value = date-fullyear date-month date-mday
+ date-fullyear = 4DIGIT
+ date-month = 2DIGIT ;01-12
+ date-mday = 2DIGIT ;01-28, 01-29, 01-30, 01-31
+ ;based on month/year
+
+ Description: If the property permits, multiple "date" values are
+ specified as a COMMA-separated list of values. The format for the
+ value type is based on the [ISO.8601.2004] complete
+ representation, basic format for a calendar date. The textual
+ format specifies a four-digit year, two-digit month, and two-digit
+ day of the month. There are no separator characters between the
+ year, month, and day component text.
+
+ No additional content value encoding (i.e., BACKSLASH character
+ encoding, see Section 3.3.11) is defined for this value type.
+
+ Example: The following represents July 14, 1997:
+
+ 19970714
+
+3.3.5. Date-Time
+
+ Value Name: DATE-TIME
+
+ Purpose: This value type is used to identify values that specify a
+ precise calendar date and time of day.
+
+
+
+Desruisseaux Standards Track [Page 32]
+
+RFC 5545 iCalendar September 2009
+
+
+ Format Definition: This value type is defined by the following
+ notation:
+
+ date-time = date "T" time ;As specified in the DATE and TIME
+ ;value definitions
+
+ Description: If the property permits, multiple "DATE-TIME" values
+ are specified as a COMMA-separated list of values. No additional
+ content value encoding (i.e., BACKSLASH character encoding, see
+ Section 3.3.11) is defined for this value type.
+
+ The "DATE-TIME" value type is used to identify values that contain
+ a precise calendar date and time of day. The format is based on
+ the [ISO.8601.2004] complete representation, basic format for a
+ calendar date and time of day. The text format is a concatenation
+ of the "date", followed by the LATIN CAPITAL LETTER T character,
+ the time designator, followed by the "time" format.
+
+ The "DATE-TIME" value type expresses time values in three forms:
+
+ The form of date and time with UTC offset MUST NOT be used. For
+ example, the following is not valid for a DATE-TIME value:
+
+ 19980119T230000-0800 ;Invalid time format
+
+ FORM #1: DATE WITH LOCAL TIME
+
+ The date with local time form is simply a DATE-TIME value that
+ does not contain the UTC designator nor does it reference a time
+ zone. For example, the following represents January 18, 1998, at
+ 11 PM:
+
+ 19980118T230000
+
+ DATE-TIME values of this type are said to be "floating" and are
+ not bound to any time zone in particular. They are used to
+ represent the same hour, minute, and second value regardless of
+ which time zone is currently being observed. For example, an
+ event can be defined that indicates that an individual will be
+ busy from 11:00 AM to 1:00 PM every day, no matter which time zone
+ the person is in. In these cases, a local time can be specified.
+ The recipient of an iCalendar object with a property value
+ consisting of a local time, without any relative time zone
+ information, SHOULD interpret the value as being fixed to whatever
+ time zone the "ATTENDEE" is in at any given moment. This means
+ that two "Attendees", in different time zones, receiving the same
+ event definition as a floating time, may be participating in the
+
+
+
+
+Desruisseaux Standards Track [Page 33]
+
+RFC 5545 iCalendar September 2009
+
+
+ event at different actual times. Floating time SHOULD only be
+ used where that is the reasonable behavior.
+
+ In most cases, a fixed time is desired. To properly communicate a
+ fixed time in a property value, either UTC time or local time with
+ time zone reference MUST be specified.
+
+ The use of local time in a DATE-TIME value without the "TZID"
+ property parameter is to be interpreted as floating time,
+ regardless of the existence of "VTIMEZONE" calendar components in
+ the iCalendar object.
+
+ FORM #2: DATE WITH UTC TIME
+
+ The date with UTC time, or absolute time, is identified by a LATIN
+ CAPITAL LETTER Z suffix character, the UTC designator, appended to
+ the time value. For example, the following represents January 19,
+ 1998, at 0700 UTC:
+
+ 19980119T070000Z
+
+ The "TZID" property parameter MUST NOT be applied to DATE-TIME
+ properties whose time values are specified in UTC.
+
+ FORM #3: DATE WITH LOCAL TIME AND TIME ZONE REFERENCE
+
+ The date and local time with reference to time zone information is
+ identified by the use the "TZID" property parameter to reference
+ the appropriate time zone definition. "TZID" is discussed in
+ detail in Section 3.2.19. For example, the following represents
+ 2:00 A.M. in New York on January 19, 1998:
+
+ TZID=America/New_York:19980119T020000
+
+ If, based on the definition of the referenced time zone, the local
+ time described occurs more than once (when changing from daylight
+ to standard time), the DATE-TIME value refers to the first
+ occurrence of the referenced time. Thus, TZID=America/
+ New_York:20071104T013000 indicates November 4, 2007 at 1:30 A.M.
+ EDT (UTC-04:00). If the local time described does not occur (when
+ changing from standard to daylight time), the DATE-TIME value is
+ interpreted using the UTC offset before the gap in local times.
+ Thus, TZID=America/New_York:20070311T023000 indicates March 11,
+ 2007 at 3:30 A.M. EDT (UTC-04:00), one hour after 1:30 A.M. EST
+ (UTC-05:00).
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 34]
+
+RFC 5545 iCalendar September 2009
+
+
+ A time value MUST only specify the second 60 when specifying a
+ positive leap second. For example:
+
+ 19970630T235960Z
+
+ Implementations that do not support leap seconds SHOULD interpret
+ the second 60 as equivalent to the second 59.
+
+ Example: The following represents July 14, 1997, at 1:30 PM in New
+ York City in each of the three time formats, using the "DTSTART"
+ property.
+
+ DTSTART:19970714T133000 ; Local time
+ DTSTART:19970714T173000Z ; UTC time
+ DTSTART;TZID=America/New_York:19970714T133000
+ ; Local time and time
+ ; zone reference
+
+3.3.6. Duration
+
+ Value Name: DURATION
+
+ Purpose: This value type is used to identify properties that contain
+ a duration of time.
+
+ Format Definition: This value type is defined by the following
+ notation:
+
+ dur-value = (["+"] / "-") "P" (dur-date / dur-time / dur-week)
+
+ dur-date = dur-day [dur-time]
+ dur-time = "T" (dur-hour / dur-minute / dur-second)
+ dur-week = 1*DIGIT "W"
+ dur-hour = 1*DIGIT "H" [dur-minute]
+ dur-minute = 1*DIGIT "M" [dur-second]
+ dur-second = 1*DIGIT "S"
+ dur-day = 1*DIGIT "D"
+
+ Description: If the property permits, multiple "duration" values are
+ specified by a COMMA-separated list of values. The format is
+ based on the [ISO.8601.2004] complete representation basic format
+ with designators for the duration of time. The format can
+ represent nominal durations (weeks and days) and accurate
+ durations (hours, minutes, and seconds). Note that unlike
+ [ISO.8601.2004], this value type doesn't support the "Y" and "M"
+ designators to specify durations in terms of years and months.
+
+
+
+
+
+Desruisseaux Standards Track [Page 35]
+
+RFC 5545 iCalendar September 2009
+
+
+ The duration of a week or a day depends on its position in the
+ calendar. In the case of discontinuities in the time scale, such
+ as the change from standard time to daylight time and back, the
+ computation of the exact duration requires the subtraction or
+ addition of the change of duration of the discontinuity. Leap
+ seconds MUST NOT be considered when computing an exact duration.
+ When computing an exact duration, the greatest order time
+ components MUST be added first, that is, the number of days MUST
+ be added first, followed by the number of hours, number of
+ minutes, and number of seconds.
+
+ Negative durations are typically used to schedule an alarm to
+ trigger before an associated time (see Section 3.8.6.3).
+
+ No additional content value encoding (i.e., BACKSLASH character
+ encoding, see Section 3.3.11) are defined for this value type.
+
+ Example: A duration of 15 days, 5 hours, and 20 seconds would be:
+
+ P15DT5H0M20S
+
+ A duration of 7 weeks would be:
+
+ P7W
+
+3.3.7. Float
+
+ Value Name: FLOAT
+
+ Purpose: This value type is used to identify properties that contain
+ a real-number value.
+
+ Format Definition: This value type is defined by the following
+ notation:
+
+ float = (["+"] / "-") 1*DIGIT ["." 1*DIGIT]
+
+ Description: If the property permits, multiple "float" values are
+ specified by a COMMA-separated list of values.
+
+ No additional content value encoding (i.e., BACKSLASH character
+ encoding, see Section 3.3.11) is defined for this value type.
+
+ Example:
+
+ 1000000.0000001
+ 1.333
+ -3.14
+
+
+
+Desruisseaux Standards Track [Page 36]
+
+RFC 5545 iCalendar September 2009
+
+
+3.3.8. Integer
+
+ Value Name: INTEGER
+
+ Purpose: This value type is used to identify properties that contain
+ a signed integer value.
+
+ Format Definition: This value type is defined by the following
+ notation:
+
+ integer = (["+"] / "-") 1*DIGIT
+
+ Description: If the property permits, multiple "integer" values are
+ specified by a COMMA-separated list of values. The valid range
+ for "integer" is -2147483648 to 2147483647. If the sign is not
+ specified, then the value is assumed to be positive.
+
+ No additional content value encoding (i.e., BACKSLASH character
+ encoding, see Section 3.3.11) is defined for this value type.
+
+ Example:
+
+ 1234567890
+ -1234567890
+ +1234567890
+ 432109876
+
+3.3.9. Period of Time
+
+ Value Name: PERIOD
+
+ Purpose: This value type is used to identify values that contain a
+ precise period of time.
+
+ Format Definition: This value type is defined by the following
+ notation:
+
+ period = period-explicit / period-start
+
+ period-explicit = date-time "/" date-time
+ ; [ISO.8601.2004] complete representation basic format for a
+ ; period of time consisting of a start and end. The start MUST
+ ; be before the end.
+
+ period-start = date-time "/" dur-value
+ ; [ISO.8601.2004] complete representation basic format for a
+ ; period of time consisting of a start and positive duration
+ ; of time.
+
+
+
+Desruisseaux Standards Track [Page 37]
+
+RFC 5545 iCalendar September 2009
+
+
+ Description: If the property permits, multiple "period" values are
+ specified by a COMMA-separated list of values. There are two
+ forms of a period of time. First, a period of time is identified
+ by its start and its end. This format is based on the
+ [ISO.8601.2004] complete representation, basic format for "DATE-
+ TIME" start of the period, followed by a SOLIDUS character
+ followed by the "DATE-TIME" of the end of the period. The start
+ of the period MUST be before the end of the period. Second, a
+ period of time can also be defined by a start and a positive
+ duration of time. The format is based on the [ISO.8601.2004]
+ complete representation, basic format for the "DATE-TIME" start of
+ the period, followed by a SOLIDUS character, followed by the
+ [ISO.8601.2004] basic format for "DURATION" of the period.
+
+ Example: The period starting at 18:00:00 UTC, on January 1, 1997 and
+ ending at 07:00:00 UTC on January 2, 1997 would be:
+
+ 19970101T180000Z/19970102T070000Z
+
+ The period start at 18:00:00 on January 1, 1997 and lasting 5
+ hours and 30 minutes would be:
+
+ 19970101T180000Z/PT5H30M
+
+ No additional content value encoding (i.e., BACKSLASH character
+ encoding, see Section 3.3.11) is defined for this value type.
+
+3.3.10. Recurrence Rule
+
+ Value Name: RECUR
+
+ Purpose: This value type is used to identify properties that contain
+ a recurrence rule specification.
+
+ Format Definition: This value type is defined by the following
+ notation:
+
+ recur = recur-rule-part *( ";" recur-rule-part )
+ ;
+ ; The rule parts are not ordered in any
+ ; particular sequence.
+ ;
+ ; The FREQ rule part is REQUIRED,
+ ; but MUST NOT occur more than once.
+ ;
+ ; The UNTIL or COUNT rule parts are OPTIONAL,
+ ; but they MUST NOT occur in the same 'recur'.
+ ;
+
+
+
+Desruisseaux Standards Track [Page 38]
+
+RFC 5545 iCalendar September 2009
+
+
+ ; The other rule parts are OPTIONAL,
+ ; but MUST NOT occur more than once.
+
+ recur-rule-part = ( "FREQ" "=" freq )
+ / ( "UNTIL" "=" enddate )
+ / ( "COUNT" "=" 1*DIGIT )
+ / ( "INTERVAL" "=" 1*DIGIT )
+ / ( "BYSECOND" "=" byseclist )
+ / ( "BYMINUTE" "=" byminlist )
+ / ( "BYHOUR" "=" byhrlist )
+ / ( "BYDAY" "=" bywdaylist )
+ / ( "BYMONTHDAY" "=" bymodaylist )
+ / ( "BYYEARDAY" "=" byyrdaylist )
+ / ( "BYWEEKNO" "=" bywknolist )
+ / ( "BYMONTH" "=" bymolist )
+ / ( "BYSETPOS" "=" bysplist )
+ / ( "WKST" "=" weekday )
+
+ freq = "SECONDLY" / "MINUTELY" / "HOURLY" / "DAILY"
+ / "WEEKLY" / "MONTHLY" / "YEARLY"
+
+ enddate = date / date-time
+
+ byseclist = ( seconds *("," seconds) )
+
+ seconds = 1*2DIGIT ;0 to 60
+
+ byminlist = ( minutes *("," minutes) )
+
+ minutes = 1*2DIGIT ;0 to 59
+
+ byhrlist = ( hour *("," hour) )
+
+ hour = 1*2DIGIT ;0 to 23
+
+ bywdaylist = ( weekdaynum *("," weekdaynum) )
+
+ weekdaynum = [[plus / minus] ordwk] weekday
+
+ plus = "+"
+
+ minus = "-"
+
+ ordwk = 1*2DIGIT ;1 to 53
+
+ weekday = "SU" / "MO" / "TU" / "WE" / "TH" / "FR" / "SA"
+ ;Corresponding to SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY,
+ ;FRIDAY, and SATURDAY days of the week.
+
+
+
+Desruisseaux Standards Track [Page 39]
+
+RFC 5545 iCalendar September 2009
+
+
+ bymodaylist = ( monthdaynum *("," monthdaynum) )
+
+ monthdaynum = [plus / minus] ordmoday
+
+ ordmoday = 1*2DIGIT ;1 to 31
+
+ byyrdaylist = ( yeardaynum *("," yeardaynum) )
+
+ yeardaynum = [plus / minus] ordyrday
+
+ ordyrday = 1*3DIGIT ;1 to 366
+
+ bywknolist = ( weeknum *("," weeknum) )
+
+ weeknum = [plus / minus] ordwk
+
+ bymolist = ( monthnum *("," monthnum) )
+
+ monthnum = 1*2DIGIT ;1 to 12
+
+ bysplist = ( setposday *("," setposday) )
+
+ setposday = yeardaynum
+
+ Description: This value type is a structured value consisting of a
+ list of one or more recurrence grammar parts. Each rule part is
+ defined by a NAME=VALUE pair. The rule parts are separated from
+ each other by the SEMICOLON character. The rule parts are not
+ ordered in any particular sequence. Individual rule parts MUST
+ only be specified once. Compliant applications MUST accept rule
+ parts ordered in any sequence, but to ensure backward
+ compatibility with applications that pre-date this revision of
+ iCalendar the FREQ rule part MUST be the first rule part specified
+ in a RECUR value.
+
+ The FREQ rule part identifies the type of recurrence rule. This
+ rule part MUST be specified in the recurrence rule. Valid values
+ include SECONDLY, to specify repeating events based on an interval
+ of a second or more; MINUTELY, to specify repeating events based
+ on an interval of a minute or more; HOURLY, to specify repeating
+ events based on an interval of an hour or more; DAILY, to specify
+ repeating events based on an interval of a day or more; WEEKLY, to
+ specify repeating events based on an interval of a week or more;
+ MONTHLY, to specify repeating events based on an interval of a
+ month or more; and YEARLY, to specify repeating events based on an
+ interval of a year or more.
+
+
+
+
+
+Desruisseaux Standards Track [Page 40]
+
+RFC 5545 iCalendar September 2009
+
+
+ The INTERVAL rule part contains a positive integer representing at
+ which intervals the recurrence rule repeats. The default value is
+ "1", meaning every second for a SECONDLY rule, every minute for a
+ MINUTELY rule, every hour for an HOURLY rule, every day for a
+ DAILY rule, every week for a WEEKLY rule, every month for a
+ MONTHLY rule, and every year for a YEARLY rule. For example,
+ within a DAILY rule, a value of "8" means every eight days.
+
+ The UNTIL rule part defines a DATE or DATE-TIME value that bounds
+ the recurrence rule in an inclusive manner. If the value
+ specified by UNTIL is synchronized with the specified recurrence,
+ this DATE or DATE-TIME becomes the last instance of the
+ recurrence. The value of the UNTIL rule part MUST have the same
+ value type as the "DTSTART" property. Furthermore, if the
+ "DTSTART" property is specified as a date with local time, then
+ the UNTIL rule part MUST also be specified as a date with local
+ time. If the "DTSTART" property is specified as a date with UTC
+ time or a date with local time and time zone reference, then the
+ UNTIL rule part MUST be specified as a date with UTC time. In the
+ case of the "STANDARD" and "DAYLIGHT" sub-components the UNTIL
+ rule part MUST always be specified as a date with UTC time. If
+ specified as a DATE-TIME value, then it MUST be specified in a UTC
+ time format. If not present, and the COUNT rule part is also not
+ present, the "RRULE" is considered to repeat forever.
+
+ The COUNT rule part defines the number of occurrences at which to
+ range-bound the recurrence. The "DTSTART" property value always
+ counts as the first occurrence.
+
+ The BYSECOND rule part specifies a COMMA-separated list of seconds
+ within a minute. Valid values are 0 to 60. The BYMINUTE rule
+ part specifies a COMMA-separated list of minutes within an hour.
+ Valid values are 0 to 59. The BYHOUR rule part specifies a COMMA-
+ separated list of hours of the day. Valid values are 0 to 23.
+ The BYSECOND, BYMINUTE and BYHOUR rule parts MUST NOT be specified
+ when the associated "DTSTART" property has a DATE value type.
+ These rule parts MUST be ignored in RECUR value that violate the
+ above requirement (e.g., generated by applications that pre-date
+ this revision of iCalendar).
+
+ The BYDAY rule part specifies a COMMA-separated list of days of
+ the week; SU indicates Sunday; MO indicates Monday; TU indicates
+ Tuesday; WE indicates Wednesday; TH indicates Thursday; FR
+ indicates Friday; and SA indicates Saturday.
+
+ Each BYDAY value can also be preceded by a positive (+n) or
+ negative (-n) integer. If present, this indicates the nth
+ occurrence of a specific day within the MONTHLY or YEARLY "RRULE".
+
+
+
+Desruisseaux Standards Track [Page 41]
+
+RFC 5545 iCalendar September 2009
+
+
+ For example, within a MONTHLY rule, +1MO (or simply 1MO)
+ represents the first Monday within the month, whereas -1MO
+ represents the last Monday of the month. The numeric value in a
+ BYDAY rule part with the FREQ rule part set to YEARLY corresponds
+ to an offset within the month when the BYMONTH rule part is
+ present, and corresponds to an offset within the year when the
+ BYWEEKNO or BYMONTH rule parts are present. If an integer
+ modifier is not present, it means all days of this type within the
+ specified frequency. For example, within a MONTHLY rule, MO
+ represents all Mondays within the month. The BYDAY rule part MUST
+ NOT be specified with a numeric value when the FREQ rule part is
+ not set to MONTHLY or YEARLY. Furthermore, the BYDAY rule part
+ MUST NOT be specified with a numeric value with the FREQ rule part
+ set to YEARLY when the BYWEEKNO rule part is specified.
+
+ The BYMONTHDAY rule part specifies a COMMA-separated list of days
+ of the month. Valid values are 1 to 31 or -31 to -1. For
+ example, -10 represents the tenth to the last day of the month.
+ The BYMONTHDAY rule part MUST NOT be specified when the FREQ rule
+ part is set to WEEKLY.
+
+ The BYYEARDAY rule part specifies a COMMA-separated list of days
+ of the year. Valid values are 1 to 366 or -366 to -1. For
+ example, -1 represents the last day of the year (December 31st)
+ and -306 represents the 306th to the last day of the year (March
+ 1st). The BYYEARDAY rule part MUST NOT be specified when the FREQ
+ rule part is set to DAILY, WEEKLY, or MONTHLY.
+
+ The BYWEEKNO rule part specifies a COMMA-separated list of
+ ordinals specifying weeks of the year. Valid values are 1 to 53
+ or -53 to -1. This corresponds to weeks according to week
+ numbering as defined in [ISO.8601.2004]. A week is defined as a
+ seven day period, starting on the day of the week defined to be
+ the week start (see WKST). Week number one of the calendar year
+ is the first week that contains at least four (4) days in that
+ calendar year. This rule part MUST NOT be used when the FREQ rule
+ part is set to anything other than YEARLY. For example, 3
+ represents the third week of the year.
+
+ Note: Assuming a Monday week start, week 53 can only occur when
+ Thursday is January 1 or if it is a leap year and Wednesday is
+ January 1.
+
+ The BYMONTH rule part specifies a COMMA-separated list of months
+ of the year. Valid values are 1 to 12.
+
+ The WKST rule part specifies the day on which the workweek starts.
+ Valid values are MO, TU, WE, TH, FR, SA, and SU. This is
+
+
+
+Desruisseaux Standards Track [Page 42]
+
+RFC 5545 iCalendar September 2009
+
+
+ significant when a WEEKLY "RRULE" has an interval greater than 1,
+ and a BYDAY rule part is specified. This is also significant when
+ in a YEARLY "RRULE" when a BYWEEKNO rule part is specified. The
+ default value is MO.
+
+ The BYSETPOS rule part specifies a COMMA-separated list of values
+ that corresponds to the nth occurrence within the set of
+ recurrence instances specified by the rule. BYSETPOS operates on
+ a set of recurrence instances in one interval of the recurrence
+ rule. For example, in a WEEKLY rule, the interval would be one
+ week A set of recurrence instances starts at the beginning of the
+ interval defined by the FREQ rule part. Valid values are 1 to 366
+ or -366 to -1. It MUST only be used in conjunction with another
+ BYxxx rule part. For example "the last work day of the month"
+ could be represented as:
+
+ FREQ=MONTHLY;BYDAY=MO,TU,WE,TH,FR;BYSETPOS=-1
+
+ Each BYSETPOS value can include a positive (+n) or negative (-n)
+ integer. If present, this indicates the nth occurrence of the
+ specific occurrence within the set of occurrences specified by the
+ rule.
+
+ Recurrence rules may generate recurrence instances with an invalid
+ date (e.g., February 30) or nonexistent local time (e.g., 1:30 AM
+ on a day where the local time is moved forward by an hour at 1:00
+ AM). Such recurrence instances MUST be ignored and MUST NOT be
+ counted as part of the recurrence set.
+
+ Information, not contained in the rule, necessary to determine the
+ various recurrence instance start time and dates are derived from
+ the Start Time ("DTSTART") component attribute. For example,
+ "FREQ=YEARLY;BYMONTH=1" doesn't specify a specific day within the
+ month or a time. This information would be the same as what is
+ specified for "DTSTART".
+
+ BYxxx rule parts modify the recurrence in some manner. BYxxx rule
+ parts for a period of time that is the same or greater than the
+ frequency generally reduce or limit the number of occurrences of
+ the recurrence generated. For example, "FREQ=DAILY;BYMONTH=1"
+ reduces the number of recurrence instances from all days (if
+ BYMONTH rule part is not present) to all days in January. BYxxx
+ rule parts for a period of time less than the frequency generally
+ increase or expand the number of occurrences of the recurrence.
+ For example, "FREQ=YEARLY;BYMONTH=1,2" increases the number of
+ days within the yearly recurrence set from 1 (if BYMONTH rule part
+ is not present) to 2.
+
+
+
+
+Desruisseaux Standards Track [Page 43]
+
+RFC 5545 iCalendar September 2009
+
+
+ If multiple BYxxx rule parts are specified, then after evaluating
+ the specified FREQ and INTERVAL rule parts, the BYxxx rule parts
+ are applied to the current set of evaluated occurrences in the
+ following order: BYMONTH, BYWEEKNO, BYYEARDAY, BYMONTHDAY, BYDAY,
+ BYHOUR, BYMINUTE, BYSECOND and BYSETPOS; then COUNT and UNTIL are
+ evaluated.
+
+ The table below summarizes the dependency of BYxxx rule part
+ expand or limit behavior on the FREQ rule part value.
+
+ The term "N/A" means that the corresponding BYxxx rule part MUST
+ NOT be used with the corresponding FREQ value.
+
+ BYDAY has some special behavior depending on the FREQ value and
+ this is described in separate notes below the table.
+
+ +----------+--------+--------+-------+-------+------+-------+------+
+ | |SECONDLY|MINUTELY|HOURLY |DAILY |WEEKLY|MONTHLY|YEARLY|
+ +----------+--------+--------+-------+-------+------+-------+------+
+ |BYMONTH |Limit |Limit |Limit |Limit |Limit |Limit |Expand|
+ +----------+--------+--------+-------+-------+------+-------+------+
+ |BYWEEKNO |N/A |N/A |N/A |N/A |N/A |N/A |Expand|
+ +----------+--------+--------+-------+-------+------+-------+------+
+ |BYYEARDAY |Limit |Limit |Limit |N/A |N/A |N/A |Expand|
+ +----------+--------+--------+-------+-------+------+-------+------+
+ |BYMONTHDAY|Limit |Limit |Limit |Limit |N/A |Expand |Expand|
+ +----------+--------+--------+-------+-------+------+-------+------+
+ |BYDAY |Limit |Limit |Limit |Limit |Expand|Note 1 |Note 2|
+ +----------+--------+--------+-------+-------+------+-------+------+
+ |BYHOUR |Limit |Limit |Limit |Expand |Expand|Expand |Expand|
+ +----------+--------+--------+-------+-------+------+-------+------+
+ |BYMINUTE |Limit |Limit |Expand |Expand |Expand|Expand |Expand|
+ +----------+--------+--------+-------+-------+------+-------+------+
+ |BYSECOND |Limit |Expand |Expand |Expand |Expand|Expand |Expand|
+ +----------+--------+--------+-------+-------+------+-------+------+
+ |BYSETPOS |Limit |Limit |Limit |Limit |Limit |Limit |Limit |
+ +----------+--------+--------+-------+-------+------+-------+------+
+
+ Note 1: Limit if BYMONTHDAY is present; otherwise, special expand
+ for MONTHLY.
+
+ Note 2: Limit if BYYEARDAY or BYMONTHDAY is present; otherwise,
+ special expand for WEEKLY if BYWEEKNO present; otherwise,
+ special expand for MONTHLY if BYMONTH present; otherwise,
+ special expand for YEARLY.
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 44]
+
+RFC 5545 iCalendar September 2009
+
+
+ Here is an example of evaluating multiple BYxxx rule parts.
+
+ DTSTART;TZID=America/New_York:19970105T083000
+ RRULE:FREQ=YEARLY;INTERVAL=2;BYMONTH=1;BYDAY=SU;BYHOUR=8,9;
+ BYMINUTE=30
+
+ First, the "INTERVAL=2" would be applied to "FREQ=YEARLY" to
+ arrive at "every other year". Then, "BYMONTH=1" would be applied
+ to arrive at "every January, every other year". Then, "BYDAY=SU"
+ would be applied to arrive at "every Sunday in January, every
+ other year". Then, "BYHOUR=8,9" would be applied to arrive at
+ "every Sunday in January at 8 AM and 9 AM, every other year".
+ Then, "BYMINUTE=30" would be applied to arrive at "every Sunday in
+ January at 8:30 AM and 9:30 AM, every other year". Then, lacking
+ information from "RRULE", the second is derived from "DTSTART", to
+ end up in "every Sunday in January at 8:30:00 AM and 9:30:00 AM,
+ every other year". Similarly, if the BYMINUTE, BYHOUR, BYDAY,
+ BYMONTHDAY, or BYMONTH rule part were missing, the appropriate
+ minute, hour, day, or month would have been retrieved from the
+ "DTSTART" property.
+
+ If the computed local start time of a recurrence instance does not
+ exist, or occurs more than once, for the specified time zone, the
+ time of the recurrence instance is interpreted in the same manner
+ as an explicit DATE-TIME value describing that date and time, as
+ specified in Section 3.3.5.
+
+ No additional content value encoding (i.e., BACKSLASH character
+ encoding, see Section 3.3.11) is defined for this value type.
+
+ Example: The following is a rule that specifies 10 occurrences that
+ occur every other day:
+
+ FREQ=DAILY;COUNT=10;INTERVAL=2
+
+ There are other examples specified in Section 3.8.5.3.
+
+3.3.11. Text
+
+ Value Name: TEXT
+
+ Purpose: This value type is used to identify values that contain
+ human-readable text.
+
+ Format Definition: This value type is defined by the following
+ notation:
+
+
+
+
+
+Desruisseaux Standards Track [Page 45]
+
+RFC 5545 iCalendar September 2009
+
+
+ text = *(TSAFE-CHAR / ":" / DQUOTE / ESCAPED-CHAR)
+ ; Folded according to description above
+
+ ESCAPED-CHAR = ("\\" / "\;" / "\," / "\N" / "\n")
+ ; \\ encodes \, \N or \n encodes newline
+ ; \; encodes ;, \, encodes ,
+
+ TSAFE-CHAR = WSP / %x21 / %x23-2B / %x2D-39 / %x3C-5B /
+ %x5D-7E / NON-US-ASCII
+ ; Any character except CONTROLs not needed by the current
+ ; character set, DQUOTE, ";", ":", "\", ","
+
+ Description: If the property permits, multiple TEXT values are
+ specified by a COMMA-separated list of values.
+
+ The language in which the text is represented can be controlled by
+ the "LANGUAGE" property parameter.
+
+ An intentional formatted text line break MUST only be included in
+ a "TEXT" property value by representing the line break with the
+ character sequence of BACKSLASH, followed by a LATIN SMALL LETTER
+ N or a LATIN CAPITAL LETTER N, that is "\n" or "\N".
+
+ The "TEXT" property values may also contain special characters
+ that are used to signify delimiters, such as a COMMA character for
+ lists of values or a SEMICOLON character for structured values.
+ In order to support the inclusion of these special characters in
+ "TEXT" property values, they MUST be escaped with a BACKSLASH
+ character. A BACKSLASH character in a "TEXT" property value MUST
+ be escaped with another BACKSLASH character. A COMMA character in
+ a "TEXT" property value MUST be escaped with a BACKSLASH
+ character. A SEMICOLON character in a "TEXT" property value MUST
+ be escaped with a BACKSLASH character. However, a COLON character
+ in a "TEXT" property value SHALL NOT be escaped with a BACKSLASH
+ character.
+
+ Example: A multiple line value of:
+
+ Project XYZ Final Review
+ Conference Room - 3B
+ Come Prepared.
+
+ would be represented as:
+
+ Project XYZ Final Review\nConference Room - 3B\nCome Prepared.
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 46]
+
+RFC 5545 iCalendar September 2009
+
+
+3.3.12. Time
+
+ Value Name: TIME
+
+ Purpose: This value type is used to identify values that contain a
+ time of day.
+
+ Format Definition: This value type is defined by the following
+ notation:
+
+ time = time-hour time-minute time-second [time-utc]
+
+ time-hour = 2DIGIT ;00-23
+ time-minute = 2DIGIT ;00-59
+ time-second = 2DIGIT ;00-60
+ ;The "60" value is used to account for positive "leap" seconds.
+
+ time-utc = "Z"
+
+ Description: If the property permits, multiple "time" values are
+ specified by a COMMA-separated list of values. No additional
+ content value encoding (i.e., BACKSLASH character encoding, see
+ Section 3.3.11) is defined for this value type.
+
+ The "TIME" value type is used to identify values that contain a
+ time of day. The format is based on the [ISO.8601.2004] complete
+ representation, basic format for a time of day. The text format
+ consists of a two-digit, 24-hour of the day (i.e., values 00-23),
+ two-digit minute in the hour (i.e., values 00-59), and two-digit
+ seconds in the minute (i.e., values 00-60). The seconds value of
+ 60 MUST only be used to account for positive "leap" seconds.
+ Fractions of a second are not supported by this format.
+
+ In parallel to the "DATE-TIME" definition above, the "TIME" value
+ type expresses time values in three forms:
+
+ The form of time with UTC offset MUST NOT be used. For example,
+ the following is not valid for a time value:
+
+ 230000-0800 ;Invalid time format
+
+ FORM #1 LOCAL TIME
+
+ The local time form is simply a time value that does not contain
+ the UTC designator nor does it reference a time zone. For
+ example, 11:00 PM:
+
+ 230000
+
+
+
+Desruisseaux Standards Track [Page 47]
+
+RFC 5545 iCalendar September 2009
+
+
+ Time values of this type are said to be "floating" and are not
+ bound to any time zone in particular. They are used to represent
+ the same hour, minute, and second value regardless of which time
+ zone is currently being observed. For example, an event can be
+ defined that indicates that an individual will be busy from 11:00
+ AM to 1:00 PM every day, no matter which time zone the person is
+ in. In these cases, a local time can be specified. The recipient
+ of an iCalendar object with a property value consisting of a local
+ time, without any relative time zone information, SHOULD interpret
+ the value as being fixed to whatever time zone the "ATTENDEE" is
+ in at any given moment. This means that two "Attendees", may
+ participate in the same event at different UTC times; floating
+ time SHOULD only be used where that is reasonable behavior.
+
+ In most cases, a fixed time is desired. To properly communicate a
+ fixed time in a property value, either UTC time or local time with
+ time zone reference MUST be specified.
+
+ The use of local time in a TIME value without the "TZID" property
+ parameter is to be interpreted as floating time, regardless of the
+ existence of "VTIMEZONE" calendar components in the iCalendar
+ object.
+
+ FORM #2: UTC TIME
+
+ UTC time, or absolute time, is identified by a LATIN CAPITAL
+ LETTER Z suffix character, the UTC designator, appended to the
+ time value. For example, the following represents 07:00 AM UTC:
+
+ 070000Z
+
+ The "TZID" property parameter MUST NOT be applied to TIME
+ properties whose time values are specified in UTC.
+
+ FORM #3: LOCAL TIME AND TIME ZONE REFERENCE
+
+ The local time with reference to time zone information form is
+ identified by the use the "TZID" property parameter to reference
+ the appropriate time zone definition. "TZID" is discussed in
+ detail in Section 3.2.19.
+
+ Example: The following represents 8:30 AM in New York in winter,
+ five hours behind UTC, in each of the three formats:
+
+ 083000
+ 133000Z
+ TZID=America/New_York:083000
+
+
+
+
+Desruisseaux Standards Track [Page 48]
+
+RFC 5545 iCalendar September 2009
+
+
+3.3.13. URI
+
+ Value Name: URI
+
+ Purpose: This value type is used to identify values that contain a
+ uniform resource identifier (URI) type of reference to the
+ property value.
+
+ Format Definition: This value type is defined by the following
+ notation:
+
+ uri = <As defined in Section 3 of [RFC3986]>
+
+ Description: This value type might be used to reference binary
+ information, for values that are large, or otherwise undesirable
+ to include directly in the iCalendar object.
+
+ Property values with this value type MUST follow the generic URI
+ syntax defined in [RFC3986].
+
+ When a property parameter value is a URI value type, the URI MUST
+ be specified as a quoted-string value.
+
+ No additional content value encoding (i.e., BACKSLASH character
+ encoding, see Section 3.3.11) is defined for this value type.
+
+ Example: The following is a URI for a network file:
+
+ http://example.com/my-report.txt
+
+3.3.14. UTC Offset
+
+ Value Name: UTC-OFFSET
+
+ Purpose: This value type is used to identify properties that contain
+ an offset from UTC to local time.
+
+ Format Definition: This value type is defined by the following
+ notation:
+
+ utc-offset = time-numzone
+
+ time-numzone = ("+" / "-") time-hour time-minute [time-second]
+
+ Description: The PLUS SIGN character MUST be specified for positive
+ UTC offsets (i.e., ahead of UTC). The HYPHEN-MINUS character MUST
+ be specified for negative UTC offsets (i.e., behind of UTC). The
+
+
+
+
+Desruisseaux Standards Track [Page 49]
+
+RFC 5545 iCalendar September 2009
+
+
+ value of "-0000" and "-000000" are not allowed. The time-second,
+ if present, MUST NOT be 60; if absent, it defaults to zero.
+
+ No additional content value encoding (i.e., BACKSLASH character
+ encoding, see Section 3.3.11) is defined for this value type.
+
+ Example: The following UTC offsets are given for standard time for
+ New York (five hours behind UTC) and Geneva (one hour ahead of
+ UTC):
+
+ -0500
+
+ +0100
+
+3.4. iCalendar Object
+
+ The Calendaring and Scheduling Core Object is a collection of
+ calendaring and scheduling information. Typically, this information
+ will consist of an iCalendar stream with a single iCalendar object.
+ However, multiple iCalendar objects can be sequentially grouped
+ together in an iCalendar stream. The first line and last line of the
+ iCalendar object MUST contain a pair of iCalendar object delimiter
+ strings. The syntax for an iCalendar stream is as follows:
+
+ icalstream = 1*icalobject
+
+ icalobject = "BEGIN" ":" "VCALENDAR" CRLF
+ icalbody
+ "END" ":" "VCALENDAR" CRLF
+
+ The following is a simple example of an iCalendar object:
+
+ BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//hacksw/handcal//NONSGML v1.0//EN
+ BEGIN:VEVENT
+ UID:19970610T172345Z-AF23B2@example.com
+ DTSTAMP:19970610T172345Z
+ DTSTART:19970714T170000Z
+ DTEND:19970715T040000Z
+ SUMMARY:Bastille Day Party
+ END:VEVENT
+ END:VCALENDAR
+
+
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 50]
+
+RFC 5545 iCalendar September 2009
+
+
+3.5. Property
+
+ A property is the definition of an individual attribute describing a
+ calendar object or a calendar component. A property takes the form
+ defined by the "contentline" notation defined in Section 3.1.
+
+ The following is an example of a property:
+
+ DTSTART:19960415T133000Z
+
+ This memo imposes no ordering of properties within an iCalendar
+ object.
+
+ Property names, parameter names, and enumerated parameter values are
+ case-insensitive. For example, the property name "DUE" is the same
+ as "due" and "Due", DTSTART;TZID=America/New_York:19980714T120000 is
+ the same as DtStart;TzID=America/New_York:19980714T120000.
+
+3.6. Calendar Components
+
+ The body of the iCalendar object consists of a sequence of calendar
+ properties and one or more calendar components. The calendar
+ properties are attributes that apply to the calendar object as a
+ whole. The calendar components are collections of properties that
+ express a particular calendar semantic. For example, the calendar
+ component can specify an event, a to-do, a journal entry, time zone
+ information, free/busy time information, or an alarm.
+
+ The body of the iCalendar object is defined by the following
+ notation:
+
+ icalbody = calprops component
+
+ calprops = *(
+ ;
+ ; The following are REQUIRED,
+ ; but MUST NOT occur more than once.
+ ;
+ prodid / version /
+ ;
+ ; The following are OPTIONAL,
+ ; but MUST NOT occur more than once.
+ ;
+ calscale / method /
+ ;
+ ; The following are OPTIONAL,
+ ; and MAY occur more than once.
+ ;
+
+
+
+Desruisseaux Standards Track [Page 51]
+
+RFC 5545 iCalendar September 2009
+
+
+ x-prop / iana-prop
+ ;
+ )
+
+ component = 1*(eventc / todoc / journalc / freebusyc /
+ timezonec / iana-comp / x-comp)
+
+ iana-comp = "BEGIN" ":" iana-token CRLF
+ 1*contentline
+ "END" ":" iana-token CRLF
+
+ x-comp = "BEGIN" ":" x-name CRLF
+ 1*contentline
+ "END" ":" x-name CRLF
+
+ An iCalendar object MUST include the "PRODID" and "VERSION" calendar
+ properties. In addition, it MUST include at least one calendar
+ component. Special forms of iCalendar objects are possible to
+ publish just busy time (i.e., only a "VFREEBUSY" calendar component)
+ or time zone (i.e., only a "VTIMEZONE" calendar component)
+ information. In addition, a complex iCalendar object that is used to
+ capture a complete snapshot of the contents of a calendar is possible
+ (e.g., composite of many different calendar components). More
+ commonly, an iCalendar object will consist of just a single "VEVENT",
+ "VTODO", or "VJOURNAL" calendar component. Applications MUST ignore
+ x-comp and iana-comp values they don't recognize. Applications that
+ support importing iCalendar objects SHOULD support all of the
+ component types defined in this document, and SHOULD NOT silently
+ drop any components as that can lead to user data loss.
+
+3.6.1. Event Component
+
+ Component Name: VEVENT
+
+ Purpose: Provide a grouping of component properties that describe an
+ event.
+
+ Format Definition: A "VEVENT" calendar component is defined by the
+ following notation:
+
+ eventc = "BEGIN" ":" "VEVENT" CRLF
+ eventprop *alarmc
+ "END" ":" "VEVENT" CRLF
+
+ eventprop = *(
+ ;
+ ; The following are REQUIRED,
+ ; but MUST NOT occur more than once.
+
+
+
+Desruisseaux Standards Track [Page 52]
+
+RFC 5545 iCalendar September 2009
+
+
+ ;
+ dtstamp / uid /
+ ;
+ ; The following is REQUIRED if the component
+ ; appears in an iCalendar object that doesn't
+ ; specify the "METHOD" property; otherwise, it
+ ; is OPTIONAL; in any case, it MUST NOT occur
+ ; more than once.
+ ;
+ dtstart /
+ ;
+ ; The following are OPTIONAL,
+ ; but MUST NOT occur more than once.
+ ;
+ class / created / description / geo /
+ last-mod / location / organizer / priority /
+ seq / status / summary / transp /
+ url / recurid /
+ ;
+ ; The following is OPTIONAL,
+ ; but SHOULD NOT occur more than once.
+ ;
+ rrule /
+ ;
+ ; Either 'dtend' or 'duration' MAY appear in
+ ; a 'eventprop', but 'dtend' and 'duration'
+ ; MUST NOT occur in the same 'eventprop'.
+ ;
+ dtend / duration /
+ ;
+ ; The following are OPTIONAL,
+ ; and MAY occur more than once.
+ ;
+ attach / attendee / categories / comment /
+ contact / exdate / rstatus / related /
+ resources / rdate / x-prop / iana-prop
+ ;
+ )
+
+ Description: A "VEVENT" calendar component is a grouping of
+ component properties, possibly including "VALARM" calendar
+ components, that represents a scheduled amount of time on a
+ calendar. For example, it can be an activity; such as a one-hour
+ long, department meeting from 8:00 AM to 9:00 AM, tomorrow.
+ Generally, an event will take up time on an individual calendar.
+ Hence, the event will appear as an opaque interval in a search for
+ busy time. Alternately, the event can have its Time Transparency
+
+
+
+
+Desruisseaux Standards Track [Page 53]
+
+RFC 5545 iCalendar September 2009
+
+
+ set to "TRANSPARENT" in order to prevent blocking of the event in
+ searches for busy time.
+
+ The "VEVENT" is also the calendar component used to specify an
+ anniversary or daily reminder within a calendar. These events
+ have a DATE value type for the "DTSTART" property instead of the
+ default value type of DATE-TIME. If such a "VEVENT" has a "DTEND"
+ property, it MUST be specified as a DATE value also. The
+ anniversary type of "VEVENT" can span more than one date (i.e.,
+ "DTEND" property value is set to a calendar date after the
+ "DTSTART" property value). If such a "VEVENT" has a "DURATION"
+ property, it MUST be specified as a "dur-day" or "dur-week" value.
+
+ The "DTSTART" property for a "VEVENT" specifies the inclusive
+ start of the event. For recurring events, it also specifies the
+ very first instance in the recurrence set. The "DTEND" property
+ for a "VEVENT" calendar component specifies the non-inclusive end
+ of the event. For cases where a "VEVENT" calendar component
+ specifies a "DTSTART" property with a DATE value type but no
+ "DTEND" nor "DURATION" property, the event's duration is taken to
+ be one day. For cases where a "VEVENT" calendar component
+ specifies a "DTSTART" property with a DATE-TIME value type but no
+ "DTEND" property, the event ends on the same calendar date and
+ time of day specified by the "DTSTART" property.
+
+ The "VEVENT" calendar component cannot be nested within another
+ calendar component. However, "VEVENT" calendar components can be
+ related to each other or to a "VTODO" or to a "VJOURNAL" calendar
+ component with the "RELATED-TO" property.
+
+ Example: The following is an example of the "VEVENT" calendar
+ component used to represent a meeting that will also be opaque to
+ searches for busy time:
+
+ BEGIN:VEVENT
+ UID:19970901T130000Z-123401@example.com
+ DTSTAMP:19970901T130000Z
+ DTSTART:19970903T163000Z
+ DTEND:19970903T190000Z
+ SUMMARY:Annual Employee Review
+ CLASS:PRIVATE
+ CATEGORIES:BUSINESS,HUMAN RESOURCES
+ END:VEVENT
+
+ The following is an example of the "VEVENT" calendar component
+ used to represent a reminder that will not be opaque, but rather
+ transparent, to searches for busy time:
+
+
+
+
+Desruisseaux Standards Track [Page 54]
+
+RFC 5545 iCalendar September 2009
+
+
+ BEGIN:VEVENT
+ UID:19970901T130000Z-123402@example.com
+ DTSTAMP:19970901T130000Z
+ DTSTART:19970401T163000Z
+ DTEND:19970402T010000Z
+ SUMMARY:Laurel is in sensitivity awareness class.
+ CLASS:PUBLIC
+ CATEGORIES:BUSINESS,HUMAN RESOURCES
+ TRANSP:TRANSPARENT
+ END:VEVENT
+
+ The following is an example of the "VEVENT" calendar component
+ used to represent an anniversary that will occur annually:
+
+ BEGIN:VEVENT
+ UID:19970901T130000Z-123403@example.com
+ DTSTAMP:19970901T130000Z
+ DTSTART;VALUE=DATE:19971102
+ SUMMARY:Our Blissful Anniversary
+ TRANSP:TRANSPARENT
+ CLASS:CONFIDENTIAL
+ CATEGORIES:ANNIVERSARY,PERSONAL,SPECIAL OCCASION
+ RRULE:FREQ=YEARLY
+ END:VEVENT
+
+ The following is an example of the "VEVENT" calendar component
+ used to represent a multi-day event scheduled from June 28th, 2007
+ to July 8th, 2007 inclusively. Note that the "DTEND" property is
+ set to July 9th, 2007, since the "DTEND" property specifies the
+ non-inclusive end of the event.
+
+ BEGIN:VEVENT
+ UID:20070423T123432Z-541111@example.com
+ DTSTAMP:20070423T123432Z
+ DTSTART;VALUE=DATE:20070628
+ DTEND;VALUE=DATE:20070709
+ SUMMARY:Festival International de Jazz de Montreal
+ TRANSP:TRANSPARENT
+ END:VEVENT
+
+3.6.2. To-Do Component
+
+ Component Name: VTODO
+
+ Purpose: Provide a grouping of calendar properties that describe a
+ to-do.
+
+
+
+
+
+Desruisseaux Standards Track [Page 55]
+
+RFC 5545 iCalendar September 2009
+
+
+ Format Definition: A "VTODO" calendar component is defined by the
+ following notation:
+
+ todoc = "BEGIN" ":" "VTODO" CRLF
+ todoprop *alarmc
+ "END" ":" "VTODO" CRLF
+
+ todoprop = *(
+ ;
+ ; The following are REQUIRED,
+ ; but MUST NOT occur more than once.
+ ;
+ dtstamp / uid /
+ ;
+ ; The following are OPTIONAL,
+ ; but MUST NOT occur more than once.
+ ;
+ class / completed / created / description /
+ dtstart / geo / last-mod / location / organizer /
+ percent / priority / recurid / seq / status /
+ summary / url /
+ ;
+ ; The following is OPTIONAL,
+ ; but SHOULD NOT occur more than once.
+ ;
+ rrule /
+ ;
+ ; Either 'due' or 'duration' MAY appear in
+ ; a 'todoprop', but 'due' and 'duration'
+ ; MUST NOT occur in the same 'todoprop'.
+ ; If 'duration' appear in a 'todoprop',
+ ; then 'dtstart' MUST also appear in
+ ; the same 'todoprop'.
+ ;
+ due / duration /
+ ;
+ ; The following are OPTIONAL,
+ ; and MAY occur more than once.
+ ;
+ attach / attendee / categories / comment / contact /
+ exdate / rstatus / related / resources /
+ rdate / x-prop / iana-prop
+ ;
+ )
+
+ Description: A "VTODO" calendar component is a grouping of component
+ properties and possibly "VALARM" calendar components that
+ represent an action-item or assignment. For example, it can be
+
+
+
+Desruisseaux Standards Track [Page 56]
+
+RFC 5545 iCalendar September 2009
+
+
+ used to represent an item of work assigned to an individual; such
+ as "turn in travel expense today".
+
+ The "VTODO" calendar component cannot be nested within another
+ calendar component. However, "VTODO" calendar components can be
+ related to each other or to a "VEVENT" or to a "VJOURNAL" calendar
+ component with the "RELATED-TO" property.
+
+ A "VTODO" calendar component without the "DTSTART" and "DUE" (or
+ "DURATION") properties specifies a to-do that will be associated
+ with each successive calendar date, until it is completed.
+
+ Examples: The following is an example of a "VTODO" calendar
+ component that needs to be completed before May 1st, 2007. On
+ midnight May 1st, 2007 this to-do would be considered overdue.
+
+ BEGIN:VTODO
+ UID:20070313T123432Z-456553@example.com
+ DTSTAMP:20070313T123432Z
+ DUE;VALUE=DATE:20070501
+ SUMMARY:Submit Quebec Income Tax Return for 2006
+ CLASS:CONFIDENTIAL
+ CATEGORIES:FAMILY,FINANCE
+ STATUS:NEEDS-ACTION
+ END:VTODO
+
+ The following is an example of a "VTODO" calendar component that
+ was due before 1:00 P.M. UTC on July 9th, 2007 and was completed
+ on July 7th, 2007 at 10:00 A.M. UTC.
+
+ BEGIN:VTODO
+ UID:20070514T103211Z-123404@example.com
+ DTSTAMP:20070514T103211Z
+ DTSTART:20070514T110000Z
+ DUE:20070709T130000Z
+ COMPLETED:20070707T100000Z
+ SUMMARY:Submit Revised Internet-Draft
+ PRIORITY:1
+ STATUS:NEEDS-ACTION
+ END:VTODO
+
+3.6.3. Journal Component
+
+ Component Name: VJOURNAL
+
+ Purpose: Provide a grouping of component properties that describe a
+ journal entry.
+
+
+
+
+Desruisseaux Standards Track [Page 57]
+
+RFC 5545 iCalendar September 2009
+
+
+ Format Definition: A "VJOURNAL" calendar component is defined by the
+ following notation:
+
+ journalc = "BEGIN" ":" "VJOURNAL" CRLF
+ jourprop
+ "END" ":" "VJOURNAL" CRLF
+
+ jourprop = *(
+ ;
+ ; The following are REQUIRED,
+ ; but MUST NOT occur more than once.
+ ;
+ dtstamp / uid /
+ ;
+ ; The following are OPTIONAL,
+ ; but MUST NOT occur more than once.
+ ;
+ class / created / dtstart /
+ last-mod / organizer / recurid / seq /
+ status / summary / url /
+ ;
+ ; The following is OPTIONAL,
+ ; but SHOULD NOT occur more than once.
+ ;
+ rrule /
+ ;
+ ; The following are OPTIONAL,
+ ; and MAY occur more than once.
+ ;
+ attach / attendee / categories / comment /
+ contact / description / exdate / related / rdate /
+ rstatus / x-prop / iana-prop
+ ;
+ )
+
+ Description: A "VJOURNAL" calendar component is a grouping of
+ component properties that represent one or more descriptive text
+ notes associated with a particular calendar date. The "DTSTART"
+ property is used to specify the calendar date with which the
+ journal entry is associated. Generally, it will have a DATE value
+ data type, but it can also be used to specify a DATE-TIME value
+ data type. Examples of a journal entry include a daily record of
+ a legislative body or a journal entry of individual telephone
+ contacts for the day or an ordered list of accomplishments for the
+ day. The "VJOURNAL" calendar component can also be used to
+ associate a document with a calendar date.
+
+
+
+
+
+Desruisseaux Standards Track [Page 58]
+
+RFC 5545 iCalendar September 2009
+
+
+ The "VJOURNAL" calendar component does not take up time on a
+ calendar. Hence, it does not play a role in free or busy time
+ searches -- it is as though it has a time transparency value of
+ TRANSPARENT. It is transparent to any such searches.
+
+ The "VJOURNAL" calendar component cannot be nested within another
+ calendar component. However, "VJOURNAL" calendar components can
+ be related to each other or to a "VEVENT" or to a "VTODO" calendar
+ component, with the "RELATED-TO" property.
+
+ Example: The following is an example of the "VJOURNAL" calendar
+ component:
+
+ BEGIN:VJOURNAL
+ UID:19970901T130000Z-123405@example.com
+ DTSTAMP:19970901T130000Z
+ DTSTART;VALUE=DATE:19970317
+ SUMMARY:Staff meeting minutes
+ DESCRIPTION:1. Staff meeting: Participants include Joe\,
+ Lisa\, and Bob. Aurora project plans were reviewed.
+ There is currently no budget reserves for this project.
+ Lisa will escalate to management. Next meeting on Tuesday.\n
+ 2. Telephone Conference: ABC Corp. sales representative
+ called to discuss new printer. Promised to get us a demo by
+ Friday.\n3. Henry Miller (Handsoff Insurance): Car was
+ totaled by tree. Is looking into a loaner car. 555-2323
+ (tel).
+ END:VJOURNAL
+
+3.6.4. Free/Busy Component
+
+ Component Name: VFREEBUSY
+
+ Purpose: Provide a grouping of component properties that describe
+ either a request for free/busy time, describe a response to a
+ request for free/busy time, or describe a published set of busy
+ time.
+
+ Format Definition: A "VFREEBUSY" calendar component is defined by
+ the following notation:
+
+ freebusyc = "BEGIN" ":" "VFREEBUSY" CRLF
+ fbprop
+ "END" ":" "VFREEBUSY" CRLF
+
+ fbprop = *(
+ ;
+ ; The following are REQUIRED,
+
+
+
+Desruisseaux Standards Track [Page 59]
+
+RFC 5545 iCalendar September 2009
+
+
+ ; but MUST NOT occur more than once.
+ ;
+ dtstamp / uid /
+ ;
+ ; The following are OPTIONAL,
+ ; but MUST NOT occur more than once.
+ ;
+ contact / dtstart / dtend /
+ organizer / url /
+ ;
+ ; The following are OPTIONAL,
+ ; and MAY occur more than once.
+ ;
+ attendee / comment / freebusy / rstatus / x-prop /
+ iana-prop
+ ;
+ )
+
+ Description: A "VFREEBUSY" calendar component is a grouping of
+ component properties that represents either a request for free or
+ busy time information, a reply to a request for free or busy time
+ information, or a published set of busy time information.
+
+ When used to request free/busy time information, the "ATTENDEE"
+ property specifies the calendar users whose free/busy time is
+ being requested; the "ORGANIZER" property specifies the calendar
+ user who is requesting the free/busy time; the "DTSTART" and
+ "DTEND" properties specify the window of time for which the free/
+ busy time is being requested; the "UID" and "DTSTAMP" properties
+ are specified to assist in proper sequencing of multiple free/busy
+ time requests.
+
+ When used to reply to a request for free/busy time, the "ATTENDEE"
+ property specifies the calendar user responding to the free/busy
+ time request; the "ORGANIZER" property specifies the calendar user
+ that originally requested the free/busy time; the "FREEBUSY"
+ property specifies the free/busy time information (if it exists);
+ and the "UID" and "DTSTAMP" properties are specified to assist in
+ proper sequencing of multiple free/busy time replies.
+
+ When used to publish busy time, the "ORGANIZER" property specifies
+ the calendar user associated with the published busy time; the
+ "DTSTART" and "DTEND" properties specify an inclusive time window
+ that surrounds the busy time information; the "FREEBUSY" property
+ specifies the published busy time information; and the "DTSTAMP"
+ property specifies the DATE-TIME that iCalendar object was
+ created.
+
+
+
+
+Desruisseaux Standards Track [Page 60]
+
+RFC 5545 iCalendar September 2009
+
+
+ The "VFREEBUSY" calendar component cannot be nested within another
+ calendar component. Multiple "VFREEBUSY" calendar components can
+ be specified within an iCalendar object. This permits the
+ grouping of free/busy information into logical collections, such
+ as monthly groups of busy time information.
+
+ The "VFREEBUSY" calendar component is intended for use in
+ iCalendar object methods involving requests for free time,
+ requests for busy time, requests for both free and busy, and the
+ associated replies.
+
+ Free/Busy information is represented with the "FREEBUSY" property.
+ This property provides a terse representation of time periods.
+ One or more "FREEBUSY" properties can be specified in the
+ "VFREEBUSY" calendar component.
+
+ When present in a "VFREEBUSY" calendar component, the "DTSTART"
+ and "DTEND" properties SHOULD be specified prior to any "FREEBUSY"
+ properties.
+
+ The recurrence properties ("RRULE", "RDATE", "EXDATE") are not
+ permitted within a "VFREEBUSY" calendar component. Any recurring
+ events are resolved into their individual busy time periods using
+ the "FREEBUSY" property.
+
+ Example: The following is an example of a "VFREEBUSY" calendar
+ component used to request free or busy time information:
+
+ BEGIN:VFREEBUSY
+ UID:19970901T082949Z-FA43EF@example.com
+ ORGANIZER:mailto:jane_doe@example.com
+ ATTENDEE:mailto:john_public@example.com
+ DTSTART:19971015T050000Z
+ DTEND:19971016T050000Z
+ DTSTAMP:19970901T083000Z
+ END:VFREEBUSY
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 61]
+
+RFC 5545 iCalendar September 2009
+
+
+ The following is an example of a "VFREEBUSY" calendar component
+ used to reply to the request with busy time information:
+
+ BEGIN:VFREEBUSY
+ UID:19970901T095957Z-76A912@example.com
+ ORGANIZER:mailto:jane_doe@example.com
+ ATTENDEE:mailto:john_public@example.com
+ DTSTAMP:19970901T100000Z
+ FREEBUSY:19971015T050000Z/PT8H30M,
+ 19971015T160000Z/PT5H30M,19971015T223000Z/PT6H30M
+ URL:http://example.com/pub/busy/jpublic-01.ifb
+ COMMENT:This iCalendar file contains busy time information for
+ the next three months.
+ END:VFREEBUSY
+
+ The following is an example of a "VFREEBUSY" calendar component
+ used to publish busy time information:
+
+ BEGIN:VFREEBUSY
+ UID:19970901T115957Z-76A912@example.com
+ DTSTAMP:19970901T120000Z
+ ORGANIZER:jsmith@example.com
+ DTSTART:19980313T141711Z
+ DTEND:19980410T141711Z
+ FREEBUSY:19980314T233000Z/19980315T003000Z
+ FREEBUSY:19980316T153000Z/19980316T163000Z
+ FREEBUSY:19980318T030000Z/19980318T040000Z
+ URL:http://www.example.com/calendar/busytime/jsmith.ifb
+ END:VFREEBUSY
+
+3.6.5. Time Zone Component
+
+ Component Name: VTIMEZONE
+
+ Purpose: Provide a grouping of component properties that defines a
+ time zone.
+
+ Format Definition: A "VTIMEZONE" calendar component is defined by
+ the following notation:
+
+ timezonec = "BEGIN" ":" "VTIMEZONE" CRLF
+ *(
+ ;
+ ; 'tzid' is REQUIRED, but MUST NOT occur more
+ ; than once.
+ ;
+ tzid /
+ ;
+
+
+
+Desruisseaux Standards Track [Page 62]
+
+RFC 5545 iCalendar September 2009
+
+
+ ; 'last-mod' and 'tzurl' are OPTIONAL,
+ ; but MUST NOT occur more than once.
+ ;
+ last-mod / tzurl /
+ ;
+ ; One of 'standardc' or 'daylightc' MUST occur
+ ; and each MAY occur more than once.
+ ;
+ standardc / daylightc /
+ ;
+ ; The following are OPTIONAL,
+ ; and MAY occur more than once.
+ ;
+ x-prop / iana-prop
+ ;
+ )
+ "END" ":" "VTIMEZONE" CRLF
+
+ standardc = "BEGIN" ":" "STANDARD" CRLF
+ tzprop
+ "END" ":" "STANDARD" CRLF
+
+ daylightc = "BEGIN" ":" "DAYLIGHT" CRLF
+ tzprop
+ "END" ":" "DAYLIGHT" CRLF
+
+ tzprop = *(
+ ;
+ ; The following are REQUIRED,
+ ; but MUST NOT occur more than once.
+ ;
+ dtstart / tzoffsetto / tzoffsetfrom /
+ ;
+ ; The following is OPTIONAL,
+ ; but SHOULD NOT occur more than once.
+ ;
+ rrule /
+ ;
+ ; The following are OPTIONAL,
+ ; and MAY occur more than once.
+ ;
+ comment / rdate / tzname / x-prop / iana-prop
+ ;
+ )
+
+ Description: A time zone is unambiguously defined by the set of time
+ measurement rules determined by the governing body for a given
+ geographic area. These rules describe, at a minimum, the base
+
+
+
+Desruisseaux Standards Track [Page 63]
+
+RFC 5545 iCalendar September 2009
+
+
+ offset from UTC for the time zone, often referred to as the
+ Standard Time offset. Many locations adjust their Standard Time
+ forward or backward by one hour, in order to accommodate seasonal
+ changes in number of daylight hours, often referred to as Daylight
+ Saving Time. Some locations adjust their time by a fraction of an
+ hour. Standard Time is also known as Winter Time. Daylight
+ Saving Time is also known as Advanced Time, Summer Time, or Legal
+ Time in certain countries. The following table shows the changes
+ in time zone rules in effect for New York City starting from 1967.
+ Each line represents a description or rule for a particular
+ observance.
+
+ Effective Observance Rule
+
+ +-----------+--------------------------+--------+--------------+
+ | Date | (Date-Time) | Offset | Abbreviation |
+ +-----------+--------------------------+--------+--------------+
+ | 1967-1973 | last Sun in Apr, 02:00 | -0400 | EDT |
+ | | | | |
+ | 1967-2006 | last Sun in Oct, 02:00 | -0500 | EST |
+ | | | | |
+ | 1974-1974 | Jan 6, 02:00 | -0400 | EDT |
+ | | | | |
+ | 1975-1975 | Feb 23, 02:00 | -0400 | EDT |
+ | | | | |
+ | 1976-1986 | last Sun in Apr, 02:00 | -0400 | EDT |
+ | | | | |
+ | 1987-2006 | first Sun in Apr, 02:00 | -0400 | EDT |
+ | | | | |
+ | 2007-* | second Sun in Mar, 02:00 | -0400 | EDT |
+ | | | | |
+ | 2007-* | first Sun in Nov, 02:00 | -0500 | EST |
+ +-----------+--------------------------+--------+--------------+
+
+ Note: The specification of a global time zone registry is not
+ addressed by this document and is left for future study.
+ However, implementers may find the TZ database [TZDB] a useful
+ reference. It is an informal, public-domain collection of time
+ zone information, which is currently being maintained by
+ volunteer Internet participants, and is used in several
+ operating systems. This database contains current and
+ historical time zone information for a wide variety of
+ locations around the globe; it provides a time zone identifier
+ for every unique time zone rule set in actual use since 1970,
+ with historical data going back to the introduction of standard
+ time.
+
+
+
+
+
+Desruisseaux Standards Track [Page 64]
+
+RFC 5545 iCalendar September 2009
+
+
+ Interoperability between two calendaring and scheduling
+ applications, especially for recurring events, to-dos or journal
+ entries, is dependent on the ability to capture and convey date
+ and time information in an unambiguous format. The specification
+ of current time zone information is integral to this behavior.
+
+ If present, the "VTIMEZONE" calendar component defines the set of
+ Standard Time and Daylight Saving Time observances (or rules) for
+ a particular time zone for a given interval of time. The
+ "VTIMEZONE" calendar component cannot be nested within other
+ calendar components. Multiple "VTIMEZONE" calendar components can
+ exist in an iCalendar object. In this situation, each "VTIMEZONE"
+ MUST represent a unique time zone definition. This is necessary
+ for some classes of events, such as airline flights, that start in
+ one time zone and end in another.
+
+ The "VTIMEZONE" calendar component MUST include the "TZID"
+ property and at least one definition of a "STANDARD" or "DAYLIGHT"
+ sub-component. The "STANDARD" or "DAYLIGHT" sub-component MUST
+ include the "DTSTART", "TZOFFSETFROM", and "TZOFFSETTO"
+ properties.
+
+ An individual "VTIMEZONE" calendar component MUST be specified for
+ each unique "TZID" parameter value specified in the iCalendar
+ object. In addition, a "VTIMEZONE" calendar component, referred
+ to by a recurring calendar component, MUST provide valid time zone
+ information for all recurrence instances.
+
+ Each "VTIMEZONE" calendar component consists of a collection of
+ one or more sub-components that describe the rule for a particular
+ observance (either a Standard Time or a Daylight Saving Time
+ observance). The "STANDARD" sub-component consists of a
+ collection of properties that describe Standard Time. The
+ "DAYLIGHT" sub-component consists of a collection of properties
+ that describe Daylight Saving Time. In general, this collection
+ of properties consists of:
+
+ * the first onset DATE-TIME for the observance;
+
+ * the last onset DATE-TIME for the observance, if a last onset is
+ known;
+
+ * the offset to be applied for the observance;
+
+ * a rule that describes the day and time when the observance
+ takes effect;
+
+ * an optional name for the observance.
+
+
+
+Desruisseaux Standards Track [Page 65]
+
+RFC 5545 iCalendar September 2009
+
+
+ For a given time zone, there may be multiple unique definitions of
+ the observances over a period of time. Each observance is
+ described using either a "STANDARD" or "DAYLIGHT" sub-component.
+ The collection of these sub-components is used to describe the
+ time zone for a given period of time. The offset to apply at any
+ given time is found by locating the observance that has the last
+ onset date and time before the time in question, and using the
+ offset value from that observance.
+
+ The top-level properties in a "VTIMEZONE" calendar component are:
+
+ The mandatory "TZID" property is a text value that uniquely
+ identifies the "VTIMEZONE" calendar component within the scope of
+ an iCalendar object.
+
+ The optional "LAST-MODIFIED" property is a UTC value that
+ specifies the date and time that this time zone definition was
+ last updated.
+
+ The optional "TZURL" property is a url value that points to a
+ published "VTIMEZONE" definition. "TZURL" SHOULD refer to a
+ resource that is accessible by anyone who might need to interpret
+ the object. This SHOULD NOT normally be a "file" URL or other URL
+ that is not widely accessible.
+
+ The collection of properties that are used to define the
+ "STANDARD" and "DAYLIGHT" sub-components include:
+
+ The mandatory "DTSTART" property gives the effective onset date
+ and local time for the time zone sub-component definition.
+ "DTSTART" in this usage MUST be specified as a date with a local
+ time value.
+
+ The mandatory "TZOFFSETFROM" property gives the UTC offset that is
+ in use when the onset of this time zone observance begins.
+ "TZOFFSETFROM" is combined with "DTSTART" to define the effective
+ onset for the time zone sub-component definition. For example,
+ the following represents the time at which the observance of
+ Standard Time took effect in Fall 1967 for New York City:
+
+ DTSTART:19671029T020000
+
+ TZOFFSETFROM:-0400
+
+ The mandatory "TZOFFSETTO" property gives the UTC offset for the
+ time zone sub-component (Standard Time or Daylight Saving Time)
+ when this observance is in use.
+
+
+
+
+Desruisseaux Standards Track [Page 66]
+
+RFC 5545 iCalendar September 2009
+
+
+ The optional "TZNAME" property is the customary name for the time
+ zone. This could be used for displaying dates.
+
+ The onset DATE-TIME values for the observance defined by the time
+ zone sub-component is defined by the "DTSTART", "RRULE", and
+ "RDATE" properties.
+
+ The "RRULE" property defines the recurrence rule for the onset of
+ the observance defined by this time zone sub-component. Some
+ specific requirements for the usage of "RRULE" for this purpose
+ include:
+
+ * If observance is known to have an effective end date, the
+ "UNTIL" recurrence rule parameter MUST be used to specify the
+ last valid onset of this observance (i.e., the UNTIL DATE-TIME
+ will be equal to the last instance generated by the recurrence
+ pattern). It MUST be specified in UTC time.
+
+ * The "DTSTART" and the "TZOFFSETFROM" properties MUST be used
+ when generating the onset DATE-TIME values (instances) from the
+ "RRULE".
+
+ The "RDATE" property can also be used to define the onset of the
+ observance by giving the individual onset date and times. "RDATE"
+ in this usage MUST be specified as a date with local time value,
+ relative to the UTC offset specified in the "TZOFFSETFROM"
+ property.
+
+ The optional "COMMENT" property is also allowed for descriptive
+ explanatory text.
+
+ Example: The following are examples of the "VTIMEZONE" calendar
+ component:
+
+ This is an example showing all the time zone rules for New York
+ City since April 30, 1967 at 03:00:00 EDT.
+
+ BEGIN:VTIMEZONE
+ TZID:America/New_York
+ LAST-MODIFIED:20050809T050000Z
+ BEGIN:DAYLIGHT
+ DTSTART:19670430T020000
+ RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=-1SU;UNTIL=19730429T070000Z
+ TZOFFSETFROM:-0500
+ TZOFFSETTO:-0400
+ TZNAME:EDT
+ END:DAYLIGHT
+ BEGIN:STANDARD
+
+
+
+Desruisseaux Standards Track [Page 67]
+
+RFC 5545 iCalendar September 2009
+
+
+ DTSTART:19671029T020000
+ RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU;UNTIL=20061029T060000Z
+ TZOFFSETFROM:-0400
+ TZOFFSETTO:-0500
+ TZNAME:EST
+ END:STANDARD
+ BEGIN:DAYLIGHT
+ DTSTART:19740106T020000
+ RDATE:19750223T020000
+ TZOFFSETFROM:-0500
+ TZOFFSETTO:-0400
+ TZNAME:EDT
+ END:DAYLIGHT
+ BEGIN:DAYLIGHT
+ DTSTART:19760425T020000
+ RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=-1SU;UNTIL=19860427T070000Z
+ TZOFFSETFROM:-0500
+ TZOFFSETTO:-0400
+ TZNAME:EDT
+ END:DAYLIGHT
+ BEGIN:DAYLIGHT
+ DTSTART:19870405T020000
+ RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU;UNTIL=20060402T070000Z
+ TZOFFSETFROM:-0500
+ TZOFFSETTO:-0400
+ TZNAME:EDT
+ END:DAYLIGHT
+ BEGIN:DAYLIGHT
+ DTSTART:20070311T020000
+ RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+ TZOFFSETFROM:-0500
+ TZOFFSETTO:-0400
+ TZNAME:EDT
+ END:DAYLIGHT
+ BEGIN:STANDARD
+ DTSTART:20071104T020000
+ RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+ TZOFFSETFROM:-0400
+ TZOFFSETTO:-0500
+ TZNAME:EST
+ END:STANDARD
+ END:VTIMEZONE
+
+ This is an example showing time zone information for New York City
+ using only the "DTSTART" property. Note that this is only
+ suitable for a recurring event that starts on or later than March
+ 11, 2007 at 03:00:00 EDT (i.e., the earliest effective transition
+ date and time) and ends no later than March 9, 2008 at 01:59:59
+
+
+
+Desruisseaux Standards Track [Page 68]
+
+RFC 5545 iCalendar September 2009
+
+
+ EST (i.e., latest valid date and time for EST in this scenario).
+ For example, this can be used for a recurring event that occurs
+ every Friday, 8:00 A.M.-9:00 A.M., starting June 1, 2007, ending
+ December 31, 2007,
+
+ BEGIN:VTIMEZONE
+ TZID:America/New_York
+ LAST-MODIFIED:20050809T050000Z
+ BEGIN:STANDARD
+ DTSTART:20071104T020000
+ TZOFFSETFROM:-0400
+ TZOFFSETTO:-0500
+ TZNAME:EST
+ END:STANDARD
+ BEGIN:DAYLIGHT
+ DTSTART:20070311T020000
+ TZOFFSETFROM:-0500
+ TZOFFSETTO:-0400
+ TZNAME:EDT
+ END:DAYLIGHT
+ END:VTIMEZONE
+
+ This is a simple example showing the current time zone rules for
+ New York City using a "RRULE" recurrence pattern. Note that there
+ is no effective end date to either of the Standard Time or
+ Daylight Time rules. This information would be valid for a
+ recurring event starting today and continuing indefinitely.
+
+ BEGIN:VTIMEZONE
+ TZID:America/New_York
+ LAST-MODIFIED:20050809T050000Z
+ TZURL:http://zones.example.com/tz/America-New_York.ics
+ BEGIN:STANDARD
+ DTSTART:20071104T020000
+ RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+ TZOFFSETFROM:-0400
+ TZOFFSETTO:-0500
+ TZNAME:EST
+ END:STANDARD
+ BEGIN:DAYLIGHT
+ DTSTART:20070311T020000
+ RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+ TZOFFSETFROM:-0500
+ TZOFFSETTO:-0400
+ TZNAME:EDT
+ END:DAYLIGHT
+ END:VTIMEZONE
+
+
+
+
+Desruisseaux Standards Track [Page 69]
+
+RFC 5545 iCalendar September 2009
+
+
+ This is an example showing a set of rules for a fictitious time
+ zone where the Daylight Time rule has an effective end date (i.e.,
+ after that date, Daylight Time is no longer observed).
+
+ BEGIN:VTIMEZONE
+ TZID:Fictitious
+ LAST-MODIFIED:19870101T000000Z
+ BEGIN:STANDARD
+ DTSTART:19671029T020000
+ RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+ TZOFFSETFROM:-0400
+ TZOFFSETTO:-0500
+ TZNAME:EST
+ END:STANDARD
+ BEGIN:DAYLIGHT
+ DTSTART:19870405T020000
+ RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4;UNTIL=19980404T070000Z
+ TZOFFSETFROM:-0500
+ TZOFFSETTO:-0400
+ TZNAME:EDT
+ END:DAYLIGHT
+ END:VTIMEZONE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 70]
+
+RFC 5545 iCalendar September 2009
+
+
+ This is an example showing a set of rules for a fictitious time
+ zone where the first Daylight Time rule has an effective end date.
+ There is a second Daylight Time rule that picks up where the other
+ left off.
+
+ BEGIN:VTIMEZONE
+ TZID:Fictitious
+ LAST-MODIFIED:19870101T000000Z
+ BEGIN:STANDARD
+ DTSTART:19671029T020000
+ RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+ TZOFFSETFROM:-0400
+ TZOFFSETTO:-0500
+ TZNAME:EST
+ END:STANDARD
+ BEGIN:DAYLIGHT
+ DTSTART:19870405T020000
+ RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4;UNTIL=19980404T070000Z
+ TZOFFSETFROM:-0500
+ TZOFFSETTO:-0400
+ TZNAME:EDT
+ END:DAYLIGHT
+ BEGIN:DAYLIGHT
+ DTSTART:19990424T020000
+ RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=4
+ TZOFFSETFROM:-0500
+ TZOFFSETTO:-0400
+ TZNAME:EDT
+ END:DAYLIGHT
+ END:VTIMEZONE
+
+3.6.6. Alarm Component
+
+ Component Name: VALARM
+
+ Purpose: Provide a grouping of component properties that define an
+ alarm.
+
+ Format Definition: A "VALARM" calendar component is defined by the
+ following notation:
+
+ alarmc = "BEGIN" ":" "VALARM" CRLF
+ (audioprop / dispprop / emailprop)
+ "END" ":" "VALARM" CRLF
+
+ audioprop = *(
+ ;
+ ; 'action' and 'trigger' are both REQUIRED,
+
+
+
+Desruisseaux Standards Track [Page 71]
+
+RFC 5545 iCalendar September 2009
+
+
+ ; but MUST NOT occur more than once.
+ ;
+ action / trigger /
+ ;
+ ; 'duration' and 'repeat' are both OPTIONAL,
+ ; and MUST NOT occur more than once each;
+ ; but if one occurs, so MUST the other.
+ ;
+ duration / repeat /
+ ;
+ ; The following is OPTIONAL,
+ ; but MUST NOT occur more than once.
+ ;
+ attach /
+ ;
+ ; The following is OPTIONAL,
+ ; and MAY occur more than once.
+ ;
+ x-prop / iana-prop
+ ;
+ )
+
+ dispprop = *(
+ ;
+ ; The following are REQUIRED,
+ ; but MUST NOT occur more than once.
+ ;
+ action / description / trigger /
+ ;
+ ; 'duration' and 'repeat' are both OPTIONAL,
+ ; and MUST NOT occur more than once each;
+ ; but if one occurs, so MUST the other.
+ ;
+ duration / repeat /
+ ;
+ ; The following is OPTIONAL,
+ ; and MAY occur more than once.
+ ;
+ x-prop / iana-prop
+ ;
+ )
+
+ emailprop = *(
+ ;
+ ; The following are all REQUIRED,
+ ; but MUST NOT occur more than once.
+ ;
+ action / description / trigger / summary /
+
+
+
+Desruisseaux Standards Track [Page 72]
+
+RFC 5545 iCalendar September 2009
+
+
+ ;
+ ; The following is REQUIRED,
+ ; and MAY occur more than once.
+ ;
+ attendee /
+ ;
+ ; 'duration' and 'repeat' are both OPTIONAL,
+ ; and MUST NOT occur more than once each;
+ ; but if one occurs, so MUST the other.
+ ;
+ duration / repeat /
+ ;
+ ; The following are OPTIONAL,
+ ; and MAY occur more than once.
+ ;
+ attach / x-prop / iana-prop
+ ;
+ )
+
+ Description: A "VALARM" calendar component is a grouping of
+ component properties that is a reminder or alarm for an event or a
+ to-do. For example, it may be used to define a reminder for a
+ pending event or an overdue to-do.
+
+ The "VALARM" calendar component MUST include the "ACTION" and
+ "TRIGGER" properties. The "ACTION" property further constrains
+ the "VALARM" calendar component in the following ways:
+
+ When the action is "AUDIO", the alarm can also include one and
+ only one "ATTACH" property, which MUST point to a sound resource,
+ which is rendered when the alarm is triggered.
+
+ When the action is "DISPLAY", the alarm MUST also include a
+ "DESCRIPTION" property, which contains the text to be displayed
+ when the alarm is triggered.
+
+ When the action is "EMAIL", the alarm MUST include a "DESCRIPTION"
+ property, which contains the text to be used as the message body,
+ a "SUMMARY" property, which contains the text to be used as the
+ message subject, and one or more "ATTENDEE" properties, which
+ contain the email address of attendees to receive the message. It
+ can also include one or more "ATTACH" properties, which are
+ intended to be sent as message attachments. When the alarm is
+ triggered, the email message is sent.
+
+ The "VALARM" calendar component MUST only appear within either a
+ "VEVENT" or "VTODO" calendar component. "VALARM" calendar
+ components cannot be nested. Multiple mutually independent
+
+
+
+Desruisseaux Standards Track [Page 73]
+
+RFC 5545 iCalendar September 2009
+
+
+ "VALARM" calendar components can be specified for a single
+ "VEVENT" or "VTODO" calendar component.
+
+ The "TRIGGER" property specifies when the alarm will be triggered.
+ The "TRIGGER" property specifies a duration prior to the start of
+ an event or a to-do. The "TRIGGER" edge may be explicitly set to
+ be relative to the "START" or "END" of the event or to-do with the
+ "RELATED" parameter of the "TRIGGER" property. The "TRIGGER"
+ property value type can alternatively be set to an absolute
+ calendar date with UTC time.
+
+ In an alarm set to trigger on the "START" of an event or to-do,
+ the "DTSTART" property MUST be present in the associated event or
+ to-do. In an alarm in a "VEVENT" calendar component set to
+ trigger on the "END" of the event, either the "DTEND" property
+ MUST be present, or the "DTSTART" and "DURATION" properties MUST
+ both be present. In an alarm in a "VTODO" calendar component set
+ to trigger on the "END" of the to-do, either the "DUE" property
+ MUST be present, or the "DTSTART" and "DURATION" properties MUST
+ both be present.
+
+ The alarm can be defined such that it triggers repeatedly. A
+ definition of an alarm with a repeating trigger MUST include both
+ the "DURATION" and "REPEAT" properties. The "DURATION" property
+ specifies the delay period, after which the alarm will repeat.
+ The "REPEAT" property specifies the number of additional
+ repetitions that the alarm will be triggered. This repetition
+ count is in addition to the initial triggering of the alarm. Both
+ of these properties MUST be present in order to specify a
+ repeating alarm. If one of these two properties is absent, then
+ the alarm will not repeat beyond the initial trigger.
+
+ The "ACTION" property is used within the "VALARM" calendar
+ component to specify the type of action invoked when the alarm is
+ triggered. The "VALARM" properties provide enough information for
+ a specific action to be invoked. It is typically the
+ responsibility of a "Calendar User Agent" (CUA) to deliver the
+ alarm in the specified fashion. An "ACTION" property value of
+ AUDIO specifies an alarm that causes a sound to be played to alert
+ the user; DISPLAY specifies an alarm that causes a text message to
+ be displayed to the user; and EMAIL specifies an alarm that causes
+ an electronic email message to be delivered to one or more email
+ addresses.
+
+ In an AUDIO alarm, if the optional "ATTACH" property is included,
+ it MUST specify an audio sound resource. The intention is that
+ the sound will be played as the alarm effect. If an "ATTACH"
+ property is specified that does not refer to a sound resource, or
+
+
+
+Desruisseaux Standards Track [Page 74]
+
+RFC 5545 iCalendar September 2009
+
+
+ if the specified sound resource cannot be rendered (because its
+ format is unsupported, or because it cannot be retrieved), then
+ the CUA or other entity responsible for playing the sound may
+ choose a fallback action, such as playing a built-in default
+ sound, or playing no sound at all.
+
+ In a DISPLAY alarm, the intended alarm effect is for the text
+ value of the "DESCRIPTION" property to be displayed to the user.
+
+ In an EMAIL alarm, the intended alarm effect is for an email
+ message to be composed and delivered to all the addresses
+ specified by the "ATTENDEE" properties in the "VALARM" calendar
+ component. The "DESCRIPTION" property of the "VALARM" calendar
+ component MUST be used as the body text of the message, and the
+ "SUMMARY" property MUST be used as the subject text. Any "ATTACH"
+ properties in the "VALARM" calendar component SHOULD be sent as
+ attachments to the message.
+
+ Note: Implementations should carefully consider whether they
+ accept alarm components from untrusted sources, e.g., when
+ importing calendar objects from external sources. One
+ reasonable policy is to always ignore alarm components that the
+ calendar user has not set herself, or at least ask for
+ confirmation in such a case.
+
+ Example: The following example is for a "VALARM" calendar component
+ that specifies an audio alarm that will sound at a precise time
+ and repeat 4 more times at 15-minute intervals:
+
+ BEGIN:VALARM
+ TRIGGER;VALUE=DATE-TIME:19970317T133000Z
+ REPEAT:4
+ DURATION:PT15M
+ ACTION:AUDIO
+ ATTACH;FMTTYPE=audio/basic:ftp://example.com/pub/
+ sounds/bell-01.aud
+ END:VALARM
+
+ The following example is for a "VALARM" calendar component that
+ specifies a display alarm that will trigger 30 minutes before the
+ scheduled start of the event or of the to-do it is associated with
+ and will repeat 2 more times at 15-minute intervals:
+
+
+
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 75]
+
+RFC 5545 iCalendar September 2009
+
+
+ BEGIN:VALARM
+ TRIGGER:-PT30M
+ REPEAT:2
+ DURATION:PT15M
+ ACTION:DISPLAY
+ DESCRIPTION:Breakfast meeting with executive\n
+ team at 8:30 AM EST.
+ END:VALARM
+
+ The following example is for a "VALARM" calendar component that
+ specifies an email alarm that will trigger 2 days before the
+ scheduled due DATE-TIME of a to-do with which it is associated.
+ It does not repeat. The email has a subject, body, and attachment
+ link.
+
+ BEGIN:VALARM
+ TRIGGER;RELATED=END:-P2D
+ ACTION:EMAIL
+ ATTENDEE:mailto:john_doe@example.com
+ SUMMARY:*** REMINDER: SEND AGENDA FOR WEEKLY STAFF MEETING ***
+ DESCRIPTION:A draft agenda needs to be sent out to the attendees
+ to the weekly managers meeting (MGR-LIST). Attached is a
+ pointer the document template for the agenda file.
+ ATTACH;FMTTYPE=application/msword:http://example.com/
+ templates/agenda.doc
+ END:VALARM
+
+3.7. Calendar Properties
+
+ The Calendar Properties are attributes that apply to the iCalendar
+ object, as a whole. These properties do not appear within a calendar
+ component. They SHOULD be specified after the "BEGIN:VCALENDAR"
+ delimiter string and prior to any calendar component.
+
+3.7.1. Calendar Scale
+
+ Property Name: CALSCALE
+
+ Purpose: This property defines the calendar scale used for the
+ calendar information specified in the iCalendar object.
+
+ Value Type: TEXT
+
+ Property Parameters: IANA and non-standard property parameters can
+ be specified on this property.
+
+ Conformance: This property can be specified once in an iCalendar
+ object. The default value is "GREGORIAN".
+
+
+
+Desruisseaux Standards Track [Page 76]
+
+RFC 5545 iCalendar September 2009
+
+
+ Description: This memo is based on the Gregorian calendar scale.
+ The Gregorian calendar scale is assumed if this property is not
+ specified in the iCalendar object. It is expected that other
+ calendar scales will be defined in other specifications or by
+ future versions of this memo.
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ calscale = "CALSCALE" calparam ":" calvalue CRLF
+
+ calparam = *(";" other-param)
+
+ calvalue = "GREGORIAN"
+
+ Example: The following is an example of this property:
+
+ CALSCALE:GREGORIAN
+
+3.7.2. Method
+
+ Property Name: METHOD
+
+ Purpose: This property defines the iCalendar object method
+ associated with the calendar object.
+
+ Value Type: TEXT
+
+ Property Parameters: IANA and non-standard property parameters can
+ be specified on this property.
+
+ Conformance: This property can be specified once in an iCalendar
+ object.
+
+ Description: When used in a MIME message entity, the value of this
+ property MUST be the same as the Content-Type "method" parameter
+ value. If either the "METHOD" property or the Content-Type
+ "method" parameter is specified, then the other MUST also be
+ specified.
+
+ No methods are defined by this specification. This is the subject
+ of other specifications, such as the iCalendar Transport-
+ independent Interoperability Protocol (iTIP) defined by [2446bis].
+
+ If this property is not present in the iCalendar object, then a
+ scheduling transaction MUST NOT be assumed. In such cases, the
+ iCalendar object is merely being used to transport a snapshot of
+
+
+
+
+Desruisseaux Standards Track [Page 77]
+
+RFC 5545 iCalendar September 2009
+
+
+ some calendar information; without the intention of conveying a
+ scheduling semantic.
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ method = "METHOD" metparam ":" metvalue CRLF
+
+ metparam = *(";" other-param)
+
+ metvalue = iana-token
+
+ Example: The following is a hypothetical example of this property to
+ convey that the iCalendar object is a scheduling request:
+
+ METHOD:REQUEST
+
+3.7.3. Product Identifier
+
+ Property Name: PRODID
+
+ Purpose: This property specifies the identifier for the product that
+ created the iCalendar object.
+
+ Value Type: TEXT
+
+ Property Parameters: IANA and non-standard property parameters can
+ be specified on this property.
+
+ Conformance: The property MUST be specified once in an iCalendar
+ object.
+
+ Description: The vendor of the implementation SHOULD assure that
+ this is a globally unique identifier; using some technique such as
+ an FPI value, as defined in [ISO.9070.1991].
+
+ This property SHOULD NOT be used to alter the interpretation of an
+ iCalendar object beyond the semantics specified in this memo. For
+ example, it is not to be used to further the understanding of non-
+ standard properties.
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ prodid = "PRODID" pidparam ":" pidvalue CRLF
+
+ pidparam = *(";" other-param)
+
+
+
+
+Desruisseaux Standards Track [Page 78]
+
+RFC 5545 iCalendar September 2009
+
+
+ pidvalue = text
+ ;Any text that describes the product and version
+ ;and that is generally assured of being unique.
+
+ Example: The following is an example of this property. It does not
+ imply that English is the default language.
+
+ PRODID:-//ABC Corporation//NONSGML My Product//EN
+
+3.7.4. Version
+
+ Property Name: VERSION
+
+ Purpose: This property specifies the identifier corresponding to the
+ highest version number or the minimum and maximum range of the
+ iCalendar specification that is required in order to interpret the
+ iCalendar object.
+
+ Value Type: TEXT
+
+ Property Parameters: IANA and non-standard property parameters can
+ be specified on this property.
+
+ Conformance: This property MUST be specified once in an iCalendar
+ object.
+
+ Description: A value of "2.0" corresponds to this memo.
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ version = "VERSION" verparam ":" vervalue CRLF
+
+ verparam = *(";" other-param)
+
+ vervalue = "2.0" ;This memo
+ / maxver
+ / (minver ";" maxver)
+
+ minver = <A IANA-registered iCalendar version identifier>
+ ;Minimum iCalendar version needed to parse the iCalendar object.
+
+ maxver = <A IANA-registered iCalendar version identifier>
+ ;Maximum iCalendar version needed to parse the iCalendar object.
+
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 79]
+
+RFC 5545 iCalendar September 2009
+
+
+ Example: The following is an example of this property:
+
+ VERSION:2.0
+
+3.8. Component Properties
+
+ The following properties can appear within calendar components, as
+ specified by each component property definition.
+
+3.8.1. Descriptive Component Properties
+
+ The following properties specify descriptive information about
+ calendar components.
+
+3.8.1.1. Attachment
+
+ Property Name: ATTACH
+
+ Purpose: This property provides the capability to associate a
+ document object with a calendar component.
+
+ Value Type: The default value type for this property is URI. The
+ value type can also be set to BINARY to indicate inline binary
+ encoded content information.
+
+ Property Parameters: IANA, non-standard, inline encoding, and value
+ data type property parameters can be specified on this property.
+ The format type parameter can be specified on this property and is
+ RECOMMENDED for inline binary encoded content information.
+
+ Conformance: This property can be specified multiple times in a
+ "VEVENT", "VTODO", "VJOURNAL", or "VALARM" calendar component with
+ the exception of AUDIO alarm that only allows this property to
+ occur once.
+
+ Description: This property is used in "VEVENT", "VTODO", and
+ "VJOURNAL" calendar components to associate a resource (e.g.,
+ document) with the calendar component. This property is used in
+ "VALARM" calendar components to specify an audio sound resource or
+ an email message attachment. This property can be specified as a
+ URI pointing to a resource or as inline binary encoded content.
+
+ When this property is specified as inline binary encoded content,
+ calendar applications MAY attempt to guess the media type of the
+ resource via inspection of its content if and only if the media
+ type of the resource is not given by the "FMTTYPE" parameter. If
+ the media type remains unknown, calendar applications SHOULD treat
+ it as type "application/octet-stream".
+
+
+
+Desruisseaux Standards Track [Page 80]
+
+RFC 5545 iCalendar September 2009
+
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ attach = "ATTACH" attachparam ( ":" uri ) /
+ (
+ ";" "ENCODING" "=" "BASE64"
+ ";" "VALUE" "=" "BINARY"
+ ":" binary
+ )
+ CRLF
+
+ attachparam = *(
+ ;
+ ; The following is OPTIONAL for a URI value,
+ ; RECOMMENDED for a BINARY value,
+ ; and MUST NOT occur more than once.
+ ;
+ (";" fmttypeparam) /
+ ;
+ ; The following is OPTIONAL,
+ ; and MAY occur more than once.
+ ;
+ (";" other-param)
+ ;
+ )
+
+ Example: The following are examples of this property:
+
+ ATTACH:CID:jsmith.part3.960817T083000.xyzMail@example.com
+
+ ATTACH;FMTTYPE=application/postscript:ftp://example.com/pub/
+ reports/r-960812.ps
+
+3.8.1.2. Categories
+
+ Property Name: CATEGORIES
+
+ Purpose: This property defines the categories for a calendar
+ component.
+
+ Value Type: TEXT
+
+ Property Parameters: IANA, non-standard, and language property
+ parameters can be specified on this property.
+
+ Conformance: The property can be specified within "VEVENT", "VTODO",
+ or "VJOURNAL" calendar components.
+
+
+
+
+Desruisseaux Standards Track [Page 81]
+
+RFC 5545 iCalendar September 2009
+
+
+ Description: This property is used to specify categories or subtypes
+ of the calendar component. The categories are useful in searching
+ for a calendar component of a particular type and category.
+ Within the "VEVENT", "VTODO", or "VJOURNAL" calendar components,
+ more than one category can be specified as a COMMA-separated list
+ of categories.
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ categories = "CATEGORIES" catparam ":" text *("," text)
+ CRLF
+
+ catparam = *(
+ ;
+ ; The following is OPTIONAL,
+ ; but MUST NOT occur more than once.
+ ;
+ (";" languageparam ) /
+ ;
+ ; The following is OPTIONAL,
+ ; and MAY occur more than once.
+ ;
+ (";" other-param)
+ ;
+ )
+
+ Example: The following are examples of this property:
+
+ CATEGORIES:APPOINTMENT,EDUCATION
+
+ CATEGORIES:MEETING
+
+3.8.1.3. Classification
+
+ Property Name: CLASS
+
+ Purpose: This property defines the access classification for a
+ calendar component.
+
+ Value Type: TEXT
+
+ Property Parameters: IANA and non-standard property parameters can
+ be specified on this property.
+
+ Conformance: The property can be specified once in a "VEVENT",
+ "VTODO", or "VJOURNAL" calendar components.
+
+
+
+
+Desruisseaux Standards Track [Page 82]
+
+RFC 5545 iCalendar September 2009
+
+
+ Description: An access classification is only one component of the
+ general security system within a calendar application. It
+ provides a method of capturing the scope of the access the
+ calendar owner intends for information within an individual
+ calendar entry. The access classification of an individual
+ iCalendar component is useful when measured along with the other
+ security components of a calendar system (e.g., calendar user
+ authentication, authorization, access rights, access role, etc.).
+ Hence, the semantics of the individual access classifications
+ cannot be completely defined by this memo alone. Additionally,
+ due to the "blind" nature of most exchange processes using this
+ memo, these access classifications cannot serve as an enforcement
+ statement for a system receiving an iCalendar object. Rather,
+ they provide a method for capturing the intention of the calendar
+ owner for the access to the calendar component. If not specified
+ in a component that allows this property, the default value is
+ PUBLIC. Applications MUST treat x-name and iana-token values they
+ don't recognize the same way as they would the PRIVATE value.
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ class = "CLASS" classparam ":" classvalue CRLF
+
+ classparam = *(";" other-param)
+
+ classvalue = "PUBLIC" / "PRIVATE" / "CONFIDENTIAL" / iana-token
+ / x-name
+ ;Default is PUBLIC
+
+ Example: The following is an example of this property:
+
+ CLASS:PUBLIC
+
+3.8.1.4. Comment
+
+ Property Name: COMMENT
+
+ Purpose: This property specifies non-processing information intended
+ to provide a comment to the calendar user.
+
+ Value Type: TEXT
+
+ Property Parameters: IANA, non-standard, alternate text
+ representation, and language property parameters can be specified
+ on this property.
+
+
+
+
+
+Desruisseaux Standards Track [Page 83]
+
+RFC 5545 iCalendar September 2009
+
+
+ Conformance: This property can be specified multiple times in
+ "VEVENT", "VTODO", "VJOURNAL", and "VFREEBUSY" calendar components
+ as well as in the "STANDARD" and "DAYLIGHT" sub-components.
+
+ Description: This property is used to specify a comment to the
+ calendar user.
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ comment = "COMMENT" commparam ":" text CRLF
+
+ commparam = *(
+ ;
+ ; The following are OPTIONAL,
+ ; but MUST NOT occur more than once.
+ ;
+ (";" altrepparam) / (";" languageparam) /
+ ;
+ ; The following is OPTIONAL,
+ ; and MAY occur more than once.
+ ;
+ (";" other-param)
+ ;
+ )
+
+ Example: The following is an example of this property:
+
+ COMMENT:The meeting really needs to include both ourselves
+ and the customer. We can't hold this meeting without them.
+ As a matter of fact\, the venue for the meeting ought to be at
+ their site. - - John
+
+3.8.1.5. Description
+
+ Property Name: DESCRIPTION
+
+ Purpose: This property provides a more complete description of the
+ calendar component than that provided by the "SUMMARY" property.
+
+ Value Type: TEXT
+
+ Property Parameters: IANA, non-standard, alternate text
+ representation, and language property parameters can be specified
+ on this property.
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 84]
+
+RFC 5545 iCalendar September 2009
+
+
+ Conformance: The property can be specified in the "VEVENT", "VTODO",
+ "VJOURNAL", or "VALARM" calendar components. The property can be
+ specified multiple times only within a "VJOURNAL" calendar
+ component.
+
+ Description: This property is used in the "VEVENT" and "VTODO" to
+ capture lengthy textual descriptions associated with the activity.
+
+ This property is used in the "VJOURNAL" calendar component to
+ capture one or more textual journal entries.
+
+ This property is used in the "VALARM" calendar component to
+ capture the display text for a DISPLAY category of alarm, and to
+ capture the body text for an EMAIL category of alarm.
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ description = "DESCRIPTION" descparam ":" text CRLF
+
+ descparam = *(
+ ;
+ ; The following are OPTIONAL,
+ ; but MUST NOT occur more than once.
+ ;
+ (";" altrepparam) / (";" languageparam) /
+ ;
+ ; The following is OPTIONAL,
+ ; and MAY occur more than once.
+ ;
+ (";" other-param)
+ ;
+ )
+
+ Example: The following is an example of this property with formatted
+ line breaks in the property value:
+
+ DESCRIPTION:Meeting to provide technical review for "Phoenix"
+ design.\nHappy Face Conference Room. Phoenix design team
+ MUST attend this meeting.\nRSVP to team leader.
+
+3.8.1.6. Geographic Position
+
+ Property Name: GEO
+
+ Purpose: This property specifies information related to the global
+ position for the activity specified by a calendar component.
+
+
+
+
+Desruisseaux Standards Track [Page 85]
+
+RFC 5545 iCalendar September 2009
+
+
+ Value Type: FLOAT. The value MUST be two SEMICOLON-separated FLOAT
+ values.
+
+ Property Parameters: IANA and non-standard property parameters can
+ be specified on this property.
+
+ Conformance: This property can be specified in "VEVENT" or "VTODO"
+ calendar components.
+
+ Description: This property value specifies latitude and longitude,
+ in that order (i.e., "LAT LON" ordering). The longitude
+ represents the location east or west of the prime meridian as a
+ positive or negative real number, respectively. The longitude and
+ latitude values MAY be specified up to six decimal places, which
+ will allow for accuracy to within one meter of geographical
+ position. Receiving applications MUST accept values of this
+ precision and MAY truncate values of greater precision.
+
+ Values for latitude and longitude shall be expressed as decimal
+ fractions of degrees. Whole degrees of latitude shall be
+ represented by a two-digit decimal number ranging from 0 through
+ 90. Whole degrees of longitude shall be represented by a decimal
+ number ranging from 0 through 180. When a decimal fraction of a
+ degree is specified, it shall be separated from the whole number
+ of degrees by a decimal point.
+
+ Latitudes north of the equator shall be specified by a plus sign
+ (+), or by the absence of a minus sign (-), preceding the digits
+ designating degrees. Latitudes south of the Equator shall be
+ designated by a minus sign (-) preceding the digits designating
+ degrees. A point on the Equator shall be assigned to the Northern
+ Hemisphere.
+
+ Longitudes east of the prime meridian shall be specified by a plus
+ sign (+), or by the absence of a minus sign (-), preceding the
+ digits designating degrees. Longitudes west of the meridian shall
+ be designated by minus sign (-) preceding the digits designating
+ degrees. A point on the prime meridian shall be assigned to the
+ Eastern Hemisphere. A point on the 180th meridian shall be
+ assigned to the Western Hemisphere. One exception to this last
+ convention is permitted. For the special condition of describing
+ a band of latitude around the earth, the East Bounding Coordinate
+ data element shall be assigned the value +180 (180) degrees.
+
+ Any spatial address with a latitude of +90 (90) or -90 degrees
+ will specify the position at the North or South Pole,
+ respectively. The component for longitude may have any legal
+ value.
+
+
+
+Desruisseaux Standards Track [Page 86]
+
+RFC 5545 iCalendar September 2009
+
+
+ With the exception of the special condition described above, this
+ form is specified in [ANSI INCITS 61-1986].
+
+ The simple formula for converting degrees-minutes-seconds into
+ decimal degrees is:
+
+ decimal = degrees + minutes/60 + seconds/3600.
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ geo = "GEO" geoparam ":" geovalue CRLF
+
+ geoparam = *(";" other-param)
+
+ geovalue = float ";" float
+ ;Latitude and Longitude components
+
+ Example: The following is an example of this property:
+
+ GEO:37.386013;-122.082932
+
+3.8.1.7. Location
+
+ Property Name: LOCATION
+
+ Purpose: This property defines the intended venue for the activity
+ defined by a calendar component.
+
+ Value Type: TEXT
+
+ Property Parameters: IANA, non-standard, alternate text
+ representation, and language property parameters can be specified
+ on this property.
+
+ Conformance: This property can be specified in "VEVENT" or "VTODO"
+ calendar component.
+
+ Description: Specific venues such as conference or meeting rooms may
+ be explicitly specified using this property. An alternate
+ representation may be specified that is a URI that points to
+ directory information with more structured specification of the
+ location. For example, the alternate representation may specify
+ either an LDAP URL [RFC4516] pointing to an LDAP server entry or a
+ CID URL [RFC2392] pointing to a MIME body part containing a
+ Virtual-Information Card (vCard) [RFC2426] for the location.
+
+
+
+
+
+Desruisseaux Standards Track [Page 87]
+
+RFC 5545 iCalendar September 2009
+
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ location = "LOCATION" locparam ":" text CRLF
+
+ locparam = *(
+ ;
+ ; The following are OPTIONAL,
+ ; but MUST NOT occur more than once.
+ ;
+ (";" altrepparam) / (";" languageparam) /
+ ;
+ ; The following is OPTIONAL,
+ ; and MAY occur more than once.
+ ;
+ (";" other-param)
+ ;
+ )
+
+ Example: The following are some examples of this property:
+
+ LOCATION:Conference Room - F123\, Bldg. 002
+
+ LOCATION;ALTREP="http://xyzcorp.com/conf-rooms/f123.vcf":
+ Conference Room - F123\, Bldg. 002
+
+3.8.1.8. Percent Complete
+
+ Property Name: PERCENT-COMPLETE
+
+ Purpose: This property is used by an assignee or delegatee of a
+ to-do to convey the percent completion of a to-do to the
+ "Organizer".
+
+ Value Type: INTEGER
+
+ Property Parameters: IANA and non-standard property parameters can
+ be specified on this property.
+
+ Conformance: This property can be specified once in a "VTODO"
+ calendar component.
+
+ Description: The property value is a positive integer between 0 and
+ 100. A value of "0" indicates the to-do has not yet been started.
+ A value of "100" indicates that the to-do has been completed.
+ Integer values in between indicate the percent partially complete.
+
+
+
+
+
+Desruisseaux Standards Track [Page 88]
+
+RFC 5545 iCalendar September 2009
+
+
+ When a to-do is assigned to multiple individuals, the property
+ value indicates the percent complete for that portion of the to-do
+ assigned to the assignee or delegatee. For example, if a to-do is
+ assigned to both individuals "A" and "B". A reply from "A" with a
+ percent complete of "70" indicates that "A" has completed 70% of
+ the to-do assigned to them. A reply from "B" with a percent
+ complete of "50" indicates "B" has completed 50% of the to-do
+ assigned to them.
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ percent = "PERCENT-COMPLETE" pctparam ":" integer CRLF
+
+ pctparam = *(";" other-param)
+
+ Example: The following is an example of this property to show 39%
+ completion:
+
+ PERCENT-COMPLETE:39
+
+3.8.1.9. Priority
+
+ Property Name: PRIORITY
+
+ Purpose: This property defines the relative priority for a calendar
+ component.
+
+ Value Type: INTEGER
+
+ Property Parameters: IANA and non-standard property parameters can
+ be specified on this property.
+
+ Conformance: This property can be specified in "VEVENT" and "VTODO"
+ calendar components.
+
+ Description: This priority is specified as an integer in the range 0
+ to 9. A value of 0 specifies an undefined priority. A value of 1
+ is the highest priority. A value of 2 is the second highest
+ priority. Subsequent numbers specify a decreasing ordinal
+ priority. A value of 9 is the lowest priority.
+
+ A CUA with a three-level priority scheme of "HIGH", "MEDIUM", and
+ "LOW" is mapped into this property such that a property value in
+ the range of 1 to 4 specifies "HIGH" priority. A value of 5 is
+ the normal or "MEDIUM" priority. A value in the range of 6 to 9
+ is "LOW" priority.
+
+
+
+
+Desruisseaux Standards Track [Page 89]
+
+RFC 5545 iCalendar September 2009
+
+
+ A CUA with a priority schema of "A1", "A2", "A3", "B1", "B2", ...,
+ "C3" is mapped into this property such that a property value of 1
+ specifies "A1", a property value of 2 specifies "A2", a property
+ value of 3 specifies "A3", and so forth up to a property value of
+ 9 specifies "C3".
+
+ Other integer values are reserved for future use.
+
+ Within a "VEVENT" calendar component, this property specifies a
+ priority for the event. This property may be useful when more
+ than one event is scheduled for a given time period.
+
+ Within a "VTODO" calendar component, this property specified a
+ priority for the to-do. This property is useful in prioritizing
+ multiple action items for a given time period.
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ priority = "PRIORITY" prioparam ":" priovalue CRLF
+ ;Default is zero (i.e., undefined).
+
+ prioparam = *(";" other-param)
+
+ priovalue = integer ;Must be in the range [0..9]
+ ; All other values are reserved for future use.
+
+ Example: The following is an example of a property with the highest
+ priority:
+
+ PRIORITY:1
+
+ The following is an example of a property with a next highest
+ priority:
+
+ PRIORITY:2
+
+ The following is an example of a property with no priority. This
+ is equivalent to not specifying the "PRIORITY" property:
+
+ PRIORITY:0
+
+
+
+
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 90]
+
+RFC 5545 iCalendar September 2009
+
+
+3.8.1.10. Resources
+
+ Property Name: RESOURCES
+
+ Purpose: This property defines the equipment or resources
+ anticipated for an activity specified by a calendar component.
+
+ Value Type: TEXT
+
+ Property Parameters: IANA, non-standard, alternate text
+ representation, and language property parameters can be specified
+ on this property.
+
+ Conformance: This property can be specified once in "VEVENT" or
+ "VTODO" calendar component.
+
+ Description: The property value is an arbitrary text. More than one
+ resource can be specified as a COMMA-separated list of resources.
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ resources = "RESOURCES" resrcparam ":" text *("," text) CRLF
+
+ resrcparam = *(
+ ;
+ ; The following are OPTIONAL,
+ ; but MUST NOT occur more than once.
+ ;
+ (";" altrepparam) / (";" languageparam) /
+ ;
+ ; The following is OPTIONAL,
+ ; and MAY occur more than once.
+ ;
+ (";" other-param)
+ ;
+ )
+
+ Example: The following is an example of this property:
+
+ RESOURCES:EASEL,PROJECTOR,VCR
+
+ RESOURCES;LANGUAGE=fr:Nettoyeur haute pression
+
+
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 91]
+
+RFC 5545 iCalendar September 2009
+
+
+3.8.1.11. Status
+
+ Property Name: STATUS
+
+ Purpose: This property defines the overall status or confirmation
+ for the calendar component.
+
+ Value Type: TEXT
+
+ Property Parameters: IANA and non-standard property parameters can
+ be specified on this property.
+
+ Conformance: This property can be specified once in "VEVENT",
+ "VTODO", or "VJOURNAL" calendar components.
+
+ Description: In a group-scheduled calendar component, the property
+ is used by the "Organizer" to provide a confirmation of the event
+ to the "Attendees". For example in a "VEVENT" calendar component,
+ the "Organizer" can indicate that a meeting is tentative,
+ confirmed, or cancelled. In a "VTODO" calendar component, the
+ "Organizer" can indicate that an action item needs action, is
+ completed, is in process or being worked on, or has been
+ cancelled. In a "VJOURNAL" calendar component, the "Organizer"
+ can indicate that a journal entry is draft, final, or has been
+ cancelled or removed.
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ status = "STATUS" statparam ":" statvalue CRLF
+
+ statparam = *(";" other-param)
+
+ statvalue = (statvalue-event
+ / statvalue-todo
+ / statvalue-jour)
+
+ statvalue-event = "TENTATIVE" ;Indicates event is tentative.
+ / "CONFIRMED" ;Indicates event is definite.
+ / "CANCELLED" ;Indicates event was cancelled.
+ ;Status values for a "VEVENT"
+
+ statvalue-todo = "NEEDS-ACTION" ;Indicates to-do needs action.
+ / "COMPLETED" ;Indicates to-do completed.
+ / "IN-PROCESS" ;Indicates to-do in process of.
+ / "CANCELLED" ;Indicates to-do was cancelled.
+ ;Status values for "VTODO".
+
+
+
+
+Desruisseaux Standards Track [Page 92]
+
+RFC 5545 iCalendar September 2009
+
+
+ statvalue-jour = "DRAFT" ;Indicates journal is draft.
+ / "FINAL" ;Indicates journal is final.
+ / "CANCELLED" ;Indicates journal is removed.
+ ;Status values for "VJOURNAL".
+
+ Example: The following is an example of this property for a "VEVENT"
+ calendar component:
+
+ STATUS:TENTATIVE
+
+ The following is an example of this property for a "VTODO"
+ calendar component:
+
+ STATUS:NEEDS-ACTION
+
+ The following is an example of this property for a "VJOURNAL"
+ calendar component:
+
+ STATUS:DRAFT
+
+3.8.1.12. Summary
+
+ Property Name: SUMMARY
+
+ Purpose: This property defines a short summary or subject for the
+ calendar component.
+
+ Value Type: TEXT
+
+ Property Parameters: IANA, non-standard, alternate text
+ representation, and language property parameters can be specified
+ on this property.
+
+ Conformance: The property can be specified in "VEVENT", "VTODO",
+ "VJOURNAL", or "VALARM" calendar components.
+
+ Description: This property is used in the "VEVENT", "VTODO", and
+ "VJOURNAL" calendar components to capture a short, one-line
+ summary about the activity or journal entry.
+
+ This property is used in the "VALARM" calendar component to
+ capture the subject of an EMAIL category of alarm.
+
+ Format Definition: This property is defined by the following
+ notation:
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 93]
+
+RFC 5545 iCalendar September 2009
+
+
+ summary = "SUMMARY" summparam ":" text CRLF
+
+ summparam = *(
+ ;
+ ; The following are OPTIONAL,
+ ; but MUST NOT occur more than once.
+ ;
+ (";" altrepparam) / (";" languageparam) /
+ ;
+ ; The following is OPTIONAL,
+ ; and MAY occur more than once.
+ ;
+ (";" other-param)
+ ;
+ )
+
+ Example: The following is an example of this property:
+
+ SUMMARY:Department Party
+
+3.8.2. Date and Time Component Properties
+
+ The following properties specify date and time related information in
+ calendar components.
+
+3.8.2.1. Date-Time Completed
+
+ Property Name: COMPLETED
+
+ Purpose: This property defines the date and time that a to-do was
+ actually completed.
+
+ Value Type: DATE-TIME
+
+ Property Parameters: IANA and non-standard property parameters can
+ be specified on this property.
+
+ Conformance: The property can be specified in a "VTODO" calendar
+ component. The value MUST be specified as a date with UTC time.
+
+ Description: This property defines the date and time that a to-do
+ was actually completed.
+
+ Format Definition: This property is defined by the following
+ notation:
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 94]
+
+RFC 5545 iCalendar September 2009
+
+
+ completed = "COMPLETED" compparam ":" date-time CRLF
+
+ compparam = *(";" other-param)
+
+ Example: The following is an example of this property:
+
+ COMPLETED:19960401T150000Z
+
+3.8.2.2. Date-Time End
+
+ Property Name: DTEND
+
+ Purpose: This property specifies the date and time that a calendar
+ component ends.
+
+ Value Type: The default value type is DATE-TIME. The value type can
+ be set to a DATE value type.
+
+ Property Parameters: IANA, non-standard, value data type, and time
+ zone identifier property parameters can be specified on this
+ property.
+
+ Conformance: This property can be specified in "VEVENT" or
+ "VFREEBUSY" calendar components.
+
+ Description: Within the "VEVENT" calendar component, this property
+ defines the date and time by which the event ends. The value type
+ of this property MUST be the same as the "DTSTART" property, and
+ its value MUST be later in time than the value of the "DTSTART"
+ property. Furthermore, this property MUST be specified as a date
+ with local time if and only if the "DTSTART" property is also
+ specified as a date with local time.
+
+ Within the "VFREEBUSY" calendar component, this property defines
+ the end date and time for the free or busy time information. The
+ time MUST be specified in the UTC time format. The value MUST be
+ later in time than the value of the "DTSTART" property.
+
+ Format Definition: This property is defined by the following
+ notation:
+
+
+
+
+
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 95]
+
+RFC 5545 iCalendar September 2009
+
+
+ dtend = "DTEND" dtendparam ":" dtendval CRLF
+
+ dtendparam = *(
+ ;
+ ; The following are OPTIONAL,
+ ; but MUST NOT occur more than once.
+ ;
+ (";" "VALUE" "=" ("DATE-TIME" / "DATE")) /
+ (";" tzidparam) /
+ ;
+ ; The following is OPTIONAL,
+ ; and MAY occur more than once.
+ ;
+ (";" other-param)
+ ;
+ )
+
+ dtendval = date-time / date
+ ;Value MUST match value type
+
+ Example: The following is an example of this property:
+
+ DTEND:19960401T150000Z
+
+ DTEND;VALUE=DATE:19980704
+
+3.8.2.3. Date-Time Due
+
+ Property Name: DUE
+
+ Purpose: This property defines the date and time that a to-do is
+ expected to be completed.
+
+ Value Type: The default value type is DATE-TIME. The value type can
+ be set to a DATE value type.
+
+ Property Parameters: IANA, non-standard, value data type, and time
+ zone identifier property parameters can be specified on this
+ property.
+
+ Conformance: The property can be specified once in a "VTODO"
+ calendar component.
+
+ Description: This property defines the date and time before which a
+ to-do is expected to be completed. For cases where this property
+ is specified in a "VTODO" calendar component that also specifies a
+ "DTSTART" property, the value type of this property MUST be the
+ same as the "DTSTART" property, and the value of this property
+
+
+
+Desruisseaux Standards Track [Page 96]
+
+RFC 5545 iCalendar September 2009
+
+
+ MUST be later in time than the value of the "DTSTART" property.
+ Furthermore, this property MUST be specified as a date with local
+ time if and only if the "DTSTART" property is also specified as a
+ date with local time.
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ due = "DUE" dueparam ":" dueval CRLF
+
+ dueparam = *(
+ ;
+ ; The following are OPTIONAL,
+ ; but MUST NOT occur more than once.
+ ;
+ (";" "VALUE" "=" ("DATE-TIME" / "DATE")) /
+ (";" tzidparam) /
+ ;
+ ; The following is OPTIONAL,
+ ; and MAY occur more than once.
+ ;
+ (";" other-param)
+ ;
+ )
+
+ dueval = date-time / date
+ ;Value MUST match value type
+
+ Example: The following is an example of this property:
+
+ DUE:19980430T000000Z
+
+3.8.2.4. Date-Time Start
+
+ Property Name: DTSTART
+
+ Purpose: This property specifies when the calendar component begins.
+
+ Value Type: The default value type is DATE-TIME. The time value
+ MUST be one of the forms defined for the DATE-TIME value type.
+ The value type can be set to a DATE value type.
+
+ Property Parameters: IANA, non-standard, value data type, and time
+ zone identifier property parameters can be specified on this
+ property.
+
+ Conformance: This property can be specified once in the "VEVENT",
+ "VTODO", or "VFREEBUSY" calendar components as well as in the
+
+
+
+Desruisseaux Standards Track [Page 97]
+
+RFC 5545 iCalendar September 2009
+
+
+ "STANDARD" and "DAYLIGHT" sub-components. This property is
+ REQUIRED in all types of recurring calendar components that
+ specify the "RRULE" property. This property is also REQUIRED in
+ "VEVENT" calendar components contained in iCalendar objects that
+ don't specify the "METHOD" property.
+
+ Description: Within the "VEVENT" calendar component, this property
+ defines the start date and time for the event.
+
+ Within the "VFREEBUSY" calendar component, this property defines
+ the start date and time for the free or busy time information.
+ The time MUST be specified in UTC time.
+
+ Within the "STANDARD" and "DAYLIGHT" sub-components, this property
+ defines the effective start date and time for a time zone
+ specification. This property is REQUIRED within each "STANDARD"
+ and "DAYLIGHT" sub-components included in "VTIMEZONE" calendar
+ components and MUST be specified as a date with local time without
+ the "TZID" property parameter.
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ dtstart = "DTSTART" dtstparam ":" dtstval CRLF
+
+ dtstparam = *(
+ ;
+ ; The following are OPTIONAL,
+ ; but MUST NOT occur more than once.
+ ;
+ (";" "VALUE" "=" ("DATE-TIME" / "DATE")) /
+ (";" tzidparam) /
+ ;
+ ; The following is OPTIONAL,
+ ; and MAY occur more than once.
+ ;
+ (";" other-param)
+ ;
+ )
+
+ dtstval = date-time / date
+ ;Value MUST match value type
+
+ Example: The following is an example of this property:
+
+ DTSTART:19980118T073000Z
+
+
+
+
+
+Desruisseaux Standards Track [Page 98]
+
+RFC 5545 iCalendar September 2009
+
+
+3.8.2.5. Duration
+
+ Property Name: DURATION
+
+ Purpose: This property specifies a positive duration of time.
+
+ Value Type: DURATION
+
+ Property Parameters: IANA and non-standard property parameters can
+ be specified on this property.
+
+ Conformance: This property can be specified in "VEVENT", "VTODO", or
+ "VALARM" calendar components.
+
+ Description: In a "VEVENT" calendar component the property may be
+ used to specify a duration of the event, instead of an explicit
+ end DATE-TIME. In a "VTODO" calendar component the property may
+ be used to specify a duration for the to-do, instead of an
+ explicit due DATE-TIME. In a "VALARM" calendar component the
+ property may be used to specify the delay period prior to
+ repeating an alarm. When the "DURATION" property relates to a
+ "DTSTART" property that is specified as a DATE value, then the
+ "DURATION" property MUST be specified as a "dur-day" or "dur-week"
+ value.
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ duration = "DURATION" durparam ":" dur-value CRLF
+ ;consisting of a positive duration of time.
+
+ durparam = *(";" other-param)
+
+ Example: The following is an example of this property that specifies
+ an interval of time of one hour and zero minutes and zero seconds:
+
+ DURATION:PT1H0M0S
+
+ The following is an example of this property that specifies an
+ interval of time of 15 minutes.
+
+ DURATION:PT15M
+
+
+
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 99]
+
+RFC 5545 iCalendar September 2009
+
+
+3.8.2.6. Free/Busy Time
+
+ Property Name: FREEBUSY
+
+ Purpose: This property defines one or more free or busy time
+ intervals.
+
+ Value Type: PERIOD
+
+ Property Parameters: IANA, non-standard, and free/busy time type
+ property parameters can be specified on this property.
+
+ Conformance: The property can be specified in a "VFREEBUSY" calendar
+ component.
+
+ Description: These time periods can be specified as either a start
+ and end DATE-TIME or a start DATE-TIME and DURATION. The date and
+ time MUST be a UTC time format.
+
+ "FREEBUSY" properties within the "VFREEBUSY" calendar component
+ SHOULD be sorted in ascending order, based on start time and then
+ end time, with the earliest periods first.
+
+ The "FREEBUSY" property can specify more than one value, separated
+ by the COMMA character. In such cases, the "FREEBUSY" property
+ values MUST all be of the same "FBTYPE" property parameter type
+ (e.g., all values of a particular "FBTYPE" listed together in a
+ single property).
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ freebusy = "FREEBUSY" fbparam ":" fbvalue CRLF
+
+ fbparam = *(
+ ;
+ ; The following is OPTIONAL,
+ ; but MUST NOT occur more than once.
+ ;
+ (";" fbtypeparam) /
+ ;
+ ; The following is OPTIONAL,
+ ; and MAY occur more than once.
+ ;
+ (";" other-param)
+ ;
+ )
+
+
+
+
+Desruisseaux Standards Track [Page 100]
+
+RFC 5545 iCalendar September 2009
+
+
+ fbvalue = period *("," period)
+ ;Time value MUST be in the UTC time format.
+
+ Example: The following are some examples of this property:
+
+ FREEBUSY;FBTYPE=BUSY-UNAVAILABLE:19970308T160000Z/PT8H30M
+
+ FREEBUSY;FBTYPE=FREE:19970308T160000Z/PT3H,19970308T200000Z/PT1H
+
+ FREEBUSY;FBTYPE=FREE:19970308T160000Z/PT3H,19970308T200000Z/PT1H
+ ,19970308T230000Z/19970309T000000Z
+
+3.8.2.7. Time Transparency
+
+ Property Name: TRANSP
+
+ Purpose: This property defines whether or not an event is
+ transparent to busy time searches.
+
+ Value Type: TEXT
+
+ Property Parameters: IANA and non-standard property parameters can
+ be specified on this property.
+
+ Conformance: This property can be specified once in a "VEVENT"
+ calendar component.
+
+ Description: Time Transparency is the characteristic of an event
+ that determines whether it appears to consume time on a calendar.
+ Events that consume actual time for the individual or resource
+ associated with the calendar SHOULD be recorded as OPAQUE,
+ allowing them to be detected by free/busy time searches. Other
+ events, which do not take up the individual's (or resource's) time
+ SHOULD be recorded as TRANSPARENT, making them invisible to free/
+ busy time searches.
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ transp = "TRANSP" transparam ":" transvalue CRLF
+
+ transparam = *(";" other-param)
+
+ transvalue = "OPAQUE"
+ ;Blocks or opaque on busy time searches.
+ / "TRANSPARENT"
+ ;Transparent on busy time searches.
+ ;Default value is OPAQUE
+
+
+
+Desruisseaux Standards Track [Page 101]
+
+RFC 5545 iCalendar September 2009
+
+
+ Example: The following is an example of this property for an event
+ that is transparent or does not block on free/busy time searches:
+
+ TRANSP:TRANSPARENT
+
+ The following is an example of this property for an event that is
+ opaque or blocks on free/busy time searches:
+
+ TRANSP:OPAQUE
+
+3.8.3. Time Zone Component Properties
+
+ The following properties specify time zone information in calendar
+ components.
+
+3.8.3.1. Time Zone Identifier
+
+ Property Name: TZID
+
+ Purpose: This property specifies the text value that uniquely
+ identifies the "VTIMEZONE" calendar component in the scope of an
+ iCalendar object.
+
+ Value Type: TEXT
+
+ Property Parameters: IANA and non-standard property parameters can
+ be specified on this property.
+
+ Conformance: This property MUST be specified in a "VTIMEZONE"
+ calendar component.
+
+ Description: This is the label by which a time zone calendar
+ component is referenced by any iCalendar properties whose value
+ type is either DATE-TIME or TIME and not intended to specify a UTC
+ or a "floating" time. The presence of the SOLIDUS character as a
+ prefix, indicates that this "TZID" represents an unique ID in a
+ globally defined time zone registry (when such registry is
+ defined).
+
+ Note: This document does not define a naming convention for
+ time zone identifiers. Implementers may want to use the naming
+ conventions defined in existing time zone specifications such
+ as the public-domain TZ database [TZDB]. The specification of
+ globally unique time zone identifiers is not addressed by this
+ document and is left for future study.
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 102]
+
+RFC 5545 iCalendar September 2009
+
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ tzid = "TZID" tzidpropparam ":" [tzidprefix] text CRLF
+
+ tzidpropparam = *(";" other-param)
+
+ ;tzidprefix = "/"
+ ; Defined previously. Just listed here for reader convenience.
+
+ Example: The following are examples of non-globally unique time zone
+ identifiers:
+
+ TZID:America/New_York
+
+ TZID:America/Los_Angeles
+
+ The following is an example of a fictitious globally unique time
+ zone identifier:
+
+ TZID:/example.org/America/New_York
+
+3.8.3.2. Time Zone Name
+
+ Property Name: TZNAME
+
+ Purpose: This property specifies the customary designation for a
+ time zone description.
+
+ Value Type: TEXT
+
+ Property Parameters: IANA, non-standard, and language property
+ parameters can be specified on this property.
+
+ Conformance: This property can be specified in "STANDARD" and
+ "DAYLIGHT" sub-components.
+
+ Description: This property specifies a customary name that can be
+ used when displaying dates that occur during the observance
+ defined by the time zone sub-component.
+
+ Format Definition: This property is defined by the following
+ notation:
+
+
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 103]
+
+RFC 5545 iCalendar September 2009
+
+
+ tzname = "TZNAME" tznparam ":" text CRLF
+
+ tznparam = *(
+ ;
+ ; The following is OPTIONAL,
+ ; but MUST NOT occur more than once.
+ ;
+ (";" languageparam) /
+ ;
+ ; The following is OPTIONAL,
+ ; and MAY occur more than once.
+ ;
+ (";" other-param)
+ ;
+ )
+
+ Example: The following are examples of this property:
+
+ TZNAME:EST
+
+ TZNAME;LANGUAGE=fr-CA:HNE
+
+3.8.3.3. Time Zone Offset From
+
+ Property Name: TZOFFSETFROM
+
+ Purpose: This property specifies the offset that is in use prior to
+ this time zone observance.
+
+ Value Type: UTC-OFFSET
+
+ Property Parameters: IANA and non-standard property parameters can
+ be specified on this property.
+
+ Conformance: This property MUST be specified in "STANDARD" and
+ "DAYLIGHT" sub-components.
+
+ Description: This property specifies the offset that is in use prior
+ to this time observance. It is used to calculate the absolute
+ time at which the transition to a given observance takes place.
+ This property MUST only be specified in a "VTIMEZONE" calendar
+ component. A "VTIMEZONE" calendar component MUST include this
+ property. The property value is a signed numeric indicating the
+ number of hours and possibly minutes from UTC. Positive numbers
+ represent time zones east of the prime meridian, or ahead of UTC.
+ Negative numbers represent time zones west of the prime meridian,
+ or behind UTC.
+
+
+
+
+Desruisseaux Standards Track [Page 104]
+
+RFC 5545 iCalendar September 2009
+
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ tzoffsetfrom = "TZOFFSETFROM" frmparam ":" utc-offset
+ CRLF
+
+ frmparam = *(";" other-param)
+
+ Example: The following are examples of this property:
+
+ TZOFFSETFROM:-0500
+
+ TZOFFSETFROM:+1345
+
+3.8.3.4. Time Zone Offset To
+
+ Property Name: TZOFFSETTO
+
+ Purpose: This property specifies the offset that is in use in this
+ time zone observance.
+
+ Value Type: UTC-OFFSET
+
+ Property Parameters: IANA and non-standard property parameters can
+ be specified on this property.
+
+ Conformance: This property MUST be specified in "STANDARD" and
+ "DAYLIGHT" sub-components.
+
+ Description: This property specifies the offset that is in use in
+ this time zone observance. It is used to calculate the absolute
+ time for the new observance. The property value is a signed
+ numeric indicating the number of hours and possibly minutes from
+ UTC. Positive numbers represent time zones east of the prime
+ meridian, or ahead of UTC. Negative numbers represent time zones
+ west of the prime meridian, or behind UTC.
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ tzoffsetto = "TZOFFSETTO" toparam ":" utc-offset CRLF
+
+ toparam = *(";" other-param)
+
+
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 105]
+
+RFC 5545 iCalendar September 2009
+
+
+ Example: The following are examples of this property:
+
+ TZOFFSETTO:-0400
+
+ TZOFFSETTO:+1245
+
+3.8.3.5. Time Zone URL
+
+ Property Name: TZURL
+
+ Purpose: This property provides a means for a "VTIMEZONE" component
+ to point to a network location that can be used to retrieve an up-
+ to-date version of itself.
+
+ Value Type: URI
+
+ Property Parameters: IANA and non-standard property parameters can
+ be specified on this property.
+
+ Conformance: This property can be specified in a "VTIMEZONE"
+ calendar component.
+
+ Description: This property provides a means for a "VTIMEZONE"
+ component to point to a network location that can be used to
+ retrieve an up-to-date version of itself. This provides a hook to
+ handle changes government bodies impose upon time zone
+ definitions. Retrieval of this resource results in an iCalendar
+ object containing a single "VTIMEZONE" component and a "METHOD"
+ property set to PUBLISH.
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ tzurl = "TZURL" tzurlparam ":" uri CRLF
+
+ tzurlparam = *(";" other-param)
+
+ Example: The following is an example of this property:
+
+ TZURL:http://timezones.example.org/tz/America-Los_Angeles.ics
+
+3.8.4. Relationship Component Properties
+
+ The following properties specify relationship information in calendar
+ components.
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 106]
+
+RFC 5545 iCalendar September 2009
+
+
+3.8.4.1. Attendee
+
+ Property Name: ATTENDEE
+
+ Purpose: This property defines an "Attendee" within a calendar
+ component.
+
+ Value Type: CAL-ADDRESS
+
+ Property Parameters: IANA, non-standard, language, calendar user
+ type, group or list membership, participation role, participation
+ status, RSVP expectation, delegatee, delegator, sent by, common
+ name, or directory entry reference property parameters can be
+ specified on this property.
+
+ Conformance: This property MUST be specified in an iCalendar object
+ that specifies a group-scheduled calendar entity. This property
+ MUST NOT be specified in an iCalendar object when publishing the
+ calendar information (e.g., NOT in an iCalendar object that
+ specifies the publication of a calendar user's busy time, event,
+ to-do, or journal). This property is not specified in an
+ iCalendar object that specifies only a time zone definition or
+ that defines calendar components that are not group-scheduled
+ components, but are components only on a single user's calendar.
+
+ Description: This property MUST only be specified within calendar
+ components to specify participants, non-participants, and the
+ chair of a group-scheduled calendar entity. The property is
+ specified within an "EMAIL" category of the "VALARM" calendar
+ component to specify an email address that is to receive the email
+ type of iCalendar alarm.
+
+ The property parameter "CN" is for the common or displayable name
+ associated with the calendar address; "ROLE", for the intended
+ role that the attendee will have in the calendar component;
+ "PARTSTAT", for the status of the attendee's participation;
+ "RSVP", for indicating whether the favor of a reply is requested;
+ "CUTYPE", to indicate the type of calendar user; "MEMBER", to
+ indicate the groups that the attendee belongs to; "DELEGATED-TO",
+ to indicate the calendar users that the original request was
+ delegated to; and "DELEGATED-FROM", to indicate whom the request
+ was delegated from; "SENT-BY", to indicate whom is acting on
+ behalf of the "ATTENDEE"; and "DIR", to indicate the URI that
+ points to the directory information corresponding to the attendee.
+ These property parameters can be specified on an "ATTENDEE"
+ property in either a "VEVENT", "VTODO", or "VJOURNAL" calendar
+ component. They MUST NOT be specified in an "ATTENDEE" property
+ in a "VFREEBUSY" or "VALARM" calendar component. If the
+
+
+
+Desruisseaux Standards Track [Page 107]
+
+RFC 5545 iCalendar September 2009
+
+
+ "LANGUAGE" property parameter is specified, the identified
+ language applies to the "CN" parameter.
+
+ A recipient delegated a request MUST inherit the "RSVP" and "ROLE"
+ values from the attendee that delegated the request to them.
+
+ Multiple attendees can be specified by including multiple
+ "ATTENDEE" properties within the calendar component.
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ attendee = "ATTENDEE" attparam ":" cal-address CRLF
+
+ attparam = *(
+ ;
+ ; The following are OPTIONAL,
+ ; but MUST NOT occur more than once.
+ ;
+ (";" cutypeparam) / (";" memberparam) /
+ (";" roleparam) / (";" partstatparam) /
+ (";" rsvpparam) / (";" deltoparam) /
+ (";" delfromparam) / (";" sentbyparam) /
+ (";" cnparam) / (";" dirparam) /
+ (";" languageparam) /
+ ;
+ ; The following is OPTIONAL,
+ ; and MAY occur more than once.
+ ;
+ (";" other-param)
+ ;
+ )
+
+ Example: The following are examples of this property's use for a
+ to-do:
+
+ ATTENDEE;MEMBER="mailto:DEV-GROUP@example.com":
+ mailto:joecool@example.com
+ ATTENDEE;DELEGATED-FROM="mailto:immud@example.com":
+ mailto:ildoit@example.com
+
+
+
+
+
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 108]
+
+RFC 5545 iCalendar September 2009
+
+
+ The following is an example of this property used for specifying
+ multiple attendees to an event:
+
+ ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=TENTATIVE;CN=Henry
+ Cabot:mailto:hcabot@example.com
+ ATTENDEE;ROLE=REQ-PARTICIPANT;DELEGATED-FROM="mailto:bob@
+ example.com";PARTSTAT=ACCEPTED;CN=Jane Doe:mailto:jdoe@
+ example.com
+
+ The following is an example of this property with a URI to the
+ directory information associated with the attendee:
+
+ ATTENDEE;CN=John Smith;DIR="ldap://example.com:6666/o=ABC%
+ 20Industries,c=US???(cn=Jim%20Dolittle)":mailto:jimdo@
+ example.com
+
+ The following is an example of this property with "delegatee" and
+ "delegator" information for an event:
+
+ ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=TENTATIVE;DELEGATED-FROM=
+ "mailto:iamboss@example.com";CN=Henry Cabot:mailto:hcabot@
+ example.com
+ ATTENDEE;ROLE=NON-PARTICIPANT;PARTSTAT=DELEGATED;DELEGATED-TO=
+ "mailto:hcabot@example.com";CN=The Big Cheese:mailto:iamboss
+ @example.com
+ ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=ACCEPTED;CN=Jane Doe
+ :mailto:jdoe@example.com
+
+ Example: The following is an example of this property's use when
+ another calendar user is acting on behalf of the "Attendee":
+
+ ATTENDEE;SENT-BY=mailto:jan_doe@example.com;CN=John Smith:
+ mailto:jsmith@example.com
+
+3.8.4.2. Contact
+
+ Property Name: CONTACT
+
+ Purpose: This property is used to represent contact information or
+ alternately a reference to contact information associated with the
+ calendar component.
+
+ Value Type: TEXT
+
+ Property Parameters: IANA, non-standard, alternate text
+ representation, and language property parameters can be specified
+ on this property.
+
+
+
+
+Desruisseaux Standards Track [Page 109]
+
+RFC 5545 iCalendar September 2009
+
+
+ Conformance: This property can be specified in a "VEVENT", "VTODO",
+ "VJOURNAL", or "VFREEBUSY" calendar component.
+
+ Description: The property value consists of textual contact
+ information. An alternative representation for the property value
+ can also be specified that refers to a URI pointing to an
+ alternate form, such as a vCard [RFC2426], for the contact
+ information.
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ contact = "CONTACT" contparam ":" text CRLF
+
+ contparam = *(
+ ;
+ ; The following are OPTIONAL,
+ ; but MUST NOT occur more than once.
+ ;
+ (";" altrepparam) / (";" languageparam) /
+ ;
+ ; The following is OPTIONAL,
+ ; and MAY occur more than once.
+ ;
+ (";" other-param)
+ ;
+ )
+
+ Example: The following is an example of this property referencing
+ textual contact information:
+
+ CONTACT:Jim Dolittle\, ABC Industries\, +1-919-555-1234
+
+ The following is an example of this property with an alternate
+ representation of an LDAP URI to a directory entry containing the
+ contact information:
+
+ CONTACT;ALTREP="ldap://example.com:6666/o=ABC%20Industries\,
+ c=US???(cn=Jim%20Dolittle)":Jim Dolittle\, ABC Industries\,
+ +1-919-555-1234
+
+ The following is an example of this property with an alternate
+ representation of a MIME body part containing the contact
+ information, such as a vCard [RFC2426] embedded in a text/
+ directory media type [RFC2425]:
+
+ CONTACT;ALTREP="CID:part3.msg970930T083000SILVER@example.com":
+ Jim Dolittle\, ABC Industries\, +1-919-555-1234
+
+
+
+Desruisseaux Standards Track [Page 110]
+
+RFC 5545 iCalendar September 2009
+
+
+ The following is an example of this property referencing a network
+ resource, such as a vCard [RFC2426] object containing the contact
+ information:
+
+ CONTACT;ALTREP="http://example.com/pdi/jdoe.vcf":Jim
+ Dolittle\, ABC Industries\, +1-919-555-1234
+
+3.8.4.3. Organizer
+
+ Property Name: ORGANIZER
+
+ Purpose: This property defines the organizer for a calendar
+ component.
+
+ Value Type: CAL-ADDRESS
+
+ Property Parameters: IANA, non-standard, language, common name,
+ directory entry reference, and sent-by property parameters can be
+ specified on this property.
+
+ Conformance: This property MUST be specified in an iCalendar object
+ that specifies a group-scheduled calendar entity. This property
+ MUST be specified in an iCalendar object that specifies the
+ publication of a calendar user's busy time. This property MUST
+ NOT be specified in an iCalendar object that specifies only a time
+ zone definition or that defines calendar components that are not
+ group-scheduled components, but are components only on a single
+ user's calendar.
+
+ Description: This property is specified within the "VEVENT",
+ "VTODO", and "VJOURNAL" calendar components to specify the
+ organizer of a group-scheduled calendar entity. The property is
+ specified within the "VFREEBUSY" calendar component to specify the
+ calendar user requesting the free or busy time. When publishing a
+ "VFREEBUSY" calendar component, the property is used to specify
+ the calendar that the published busy time came from.
+
+ The property has the property parameters "CN", for specifying the
+ common or display name associated with the "Organizer", "DIR", for
+ specifying a pointer to the directory information associated with
+ the "Organizer", "SENT-BY", for specifying another calendar user
+ that is acting on behalf of the "Organizer". The non-standard
+ parameters may also be specified on this property. If the
+ "LANGUAGE" property parameter is specified, the identified
+ language applies to the "CN" parameter value.
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 111]
+
+RFC 5545 iCalendar September 2009
+
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ organizer = "ORGANIZER" orgparam ":"
+ cal-address CRLF
+
+ orgparam = *(
+ ;
+ ; The following are OPTIONAL,
+ ; but MUST NOT occur more than once.
+ ;
+ (";" cnparam) / (";" dirparam) / (";" sentbyparam) /
+ (";" languageparam) /
+ ;
+ ; The following is OPTIONAL,
+ ; and MAY occur more than once.
+ ;
+ (";" other-param)
+ ;
+ )
+
+ Example: The following is an example of this property:
+
+ ORGANIZER;CN=John Smith:mailto:jsmith@example.com
+
+ The following is an example of this property with a pointer to the
+ directory information associated with the organizer:
+
+ ORGANIZER;CN=JohnSmith;DIR="ldap://example.com:6666/o=DC%20Ass
+ ociates,c=US???(cn=John%20Smith)":mailto:jsmith@example.com
+
+ The following is an example of this property used by another
+ calendar user who is acting on behalf of the organizer, with
+ responses intended to be sent back to the organizer, not the other
+ calendar user:
+
+ ORGANIZER;SENT-BY="mailto:jane_doe@example.com":
+ mailto:jsmith@example.com
+
+3.8.4.4. Recurrence ID
+
+ Property Name: RECURRENCE-ID
+
+ Purpose: This property is used in conjunction with the "UID" and
+ "SEQUENCE" properties to identify a specific instance of a
+ recurring "VEVENT", "VTODO", or "VJOURNAL" calendar component.
+ The property value is the original value of the "DTSTART" property
+ of the recurrence instance.
+
+
+
+Desruisseaux Standards Track [Page 112]
+
+RFC 5545 iCalendar September 2009
+
+
+ Value Type: The default value type is DATE-TIME. The value type can
+ be set to a DATE value type. This property MUST have the same
+ value type as the "DTSTART" property contained within the
+ recurring component. Furthermore, this property MUST be specified
+ as a date with local time if and only if the "DTSTART" property
+ contained within the recurring component is specified as a date
+ with local time.
+
+ Property Parameters: IANA, non-standard, value data type, time zone
+ identifier, and recurrence identifier range parameters can be
+ specified on this property.
+
+ Conformance: This property can be specified in an iCalendar object
+ containing a recurring calendar component.
+
+ Description: The full range of calendar components specified by a
+ recurrence set is referenced by referring to just the "UID"
+ property value corresponding to the calendar component. The
+ "RECURRENCE-ID" property allows the reference to an individual
+ instance within the recurrence set.
+
+ If the value of the "DTSTART" property is a DATE type value, then
+ the value MUST be the calendar date for the recurrence instance.
+
+ The DATE-TIME value is set to the time when the original
+ recurrence instance would occur; meaning that if the intent is to
+ change a Friday meeting to Thursday, the DATE-TIME is still set to
+ the original Friday meeting.
+
+ The "RECURRENCE-ID" property is used in conjunction with the "UID"
+ and "SEQUENCE" properties to identify a particular instance of a
+ recurring event, to-do, or journal. For a given pair of "UID" and
+ "SEQUENCE" property values, the "RECURRENCE-ID" value for a
+ recurrence instance is fixed.
+
+ The "RANGE" parameter is used to specify the effective range of
+ recurrence instances from the instance specified by the
+ "RECURRENCE-ID" property value. The value for the range parameter
+ can only be "THISANDFUTURE" to indicate a range defined by the
+ given recurrence instance and all subsequent instances.
+ Subsequent instances are determined by their "RECURRENCE-ID" value
+ and not their current scheduled start time. Subsequent instances
+ defined in separate components are not impacted by the given
+ recurrence instance. When the given recurrence instance is
+ rescheduled, all subsequent instances are also rescheduled by the
+ same time difference. For instance, if the given recurrence
+ instance is rescheduled to start 2 hours later, then all
+ subsequent instances are also rescheduled 2 hours later.
+
+
+
+Desruisseaux Standards Track [Page 113]
+
+RFC 5545 iCalendar September 2009
+
+
+ Similarly, if the duration of the given recurrence instance is
+ modified, then all subsequence instances are also modified to have
+ this same duration.
+
+ Note: The "RANGE" parameter may not be appropriate to
+ reschedule specific subsequent instances of complex recurring
+ calendar component. Assuming an unbounded recurring calendar
+ component scheduled to occur on Mondays and Wednesdays, the
+ "RANGE" parameter could not be used to reschedule only the
+ future Monday instances to occur on Tuesday instead. In such
+ cases, the calendar application could simply truncate the
+ unbounded recurring calendar component (i.e., with the "COUNT"
+ or "UNTIL" rule parts), and create two new unbounded recurring
+ calendar components for the future instances.
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ recurid = "RECURRENCE-ID" ridparam ":" ridval CRLF
+
+ ridparam = *(
+ ;
+ ; The following are OPTIONAL,
+ ; but MUST NOT occur more than once.
+ ;
+ (";" "VALUE" "=" ("DATE-TIME" / "DATE")) /
+ (";" tzidparam) / (";" rangeparam) /
+ ;
+ ; The following is OPTIONAL,
+ ; and MAY occur more than once.
+ ;
+ (";" other-param)
+ ;
+ )
+
+ ridval = date-time / date
+ ;Value MUST match value type
+
+ Example: The following are examples of this property:
+
+ RECURRENCE-ID;VALUE=DATE:19960401
+
+ RECURRENCE-ID;RANGE=THISANDFUTURE:19960120T120000Z
+
+
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 114]
+
+RFC 5545 iCalendar September 2009
+
+
+3.8.4.5. Related To
+
+ Property Name: RELATED-TO
+
+ Purpose: This property is used to represent a relationship or
+ reference between one calendar component and another.
+
+ Value Type: TEXT
+
+ Property Parameters: IANA, non-standard, and relationship type
+ property parameters can be specified on this property.
+
+ Conformance: This property can be specified in the "VEVENT",
+ "VTODO", and "VJOURNAL" calendar components.
+
+ Description: The property value consists of the persistent, globally
+ unique identifier of another calendar component. This value would
+ be represented in a calendar component by the "UID" property.
+
+ By default, the property value points to another calendar
+ component that has a PARENT relationship to the referencing
+ object. The "RELTYPE" property parameter is used to either
+ explicitly state the default PARENT relationship type to the
+ referenced calendar component or to override the default PARENT
+ relationship type and specify either a CHILD or SIBLING
+ relationship. The PARENT relationship indicates that the calendar
+ component is a subordinate of the referenced calendar component.
+ The CHILD relationship indicates that the calendar component is a
+ superior of the referenced calendar component. The SIBLING
+ relationship indicates that the calendar component is a peer of
+ the referenced calendar component.
+
+ Changes to a calendar component referenced by this property can
+ have an implicit impact on the related calendar component. For
+ example, if a group event changes its start or end date or time,
+ then the related, dependent events will need to have their start
+ and end dates changed in a corresponding way. Similarly, if a
+ PARENT calendar component is cancelled or deleted, then there is
+ an implied impact to the related CHILD calendar components. This
+ property is intended only to provide information on the
+ relationship of calendar components. It is up to the target
+ calendar system to maintain any property implications of this
+ relationship.
+
+
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 115]
+
+RFC 5545 iCalendar September 2009
+
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ related = "RELATED-TO" relparam ":" text CRLF
+
+ relparam = *(
+ ;
+ ; The following is OPTIONAL,
+ ; but MUST NOT occur more than once.
+ ;
+ (";" reltypeparam) /
+ ;
+ ; The following is OPTIONAL,
+ ; and MAY occur more than once.
+ ;
+ (";" other-param)
+ ;
+ )
+
+ The following is an example of this property:
+
+ RELATED-TO:jsmith.part7.19960817T083000.xyzMail@example.com
+
+ RELATED-TO:19960401-080045-4000F192713-0052@example.com
+
+3.8.4.6. Uniform Resource Locator
+
+ Property Name: URL
+
+ Purpose: This property defines a Uniform Resource Locator (URL)
+ associated with the iCalendar object.
+
+ Value Type: URI
+
+ Property Parameters: IANA and non-standard property parameters can
+ be specified on this property.
+
+ Conformance: This property can be specified once in the "VEVENT",
+ "VTODO", "VJOURNAL", or "VFREEBUSY" calendar components.
+
+ Description: This property may be used in a calendar component to
+ convey a location where a more dynamic rendition of the calendar
+ information associated with the calendar component can be found.
+ This memo does not attempt to standardize the form of the URI, nor
+ the format of the resource pointed to by the property value. If
+ the URL property and Content-Location MIME header are both
+ specified, they MUST point to the same resource.
+
+
+
+
+Desruisseaux Standards Track [Page 116]
+
+RFC 5545 iCalendar September 2009
+
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ url = "URL" urlparam ":" uri CRLF
+
+ urlparam = *(";" other-param)
+
+ Example: The following is an example of this property:
+
+ URL:http://example.com/pub/calendars/jsmith/mytime.ics
+
+3.8.4.7. Unique Identifier
+
+ Property Name: UID
+
+ Purpose: This property defines the persistent, globally unique
+ identifier for the calendar component.
+
+ Value Type: TEXT
+
+ Property Parameters: IANA and non-standard property parameters can
+ be specified on this property.
+
+ Conformance: The property MUST be specified in the "VEVENT",
+ "VTODO", "VJOURNAL", or "VFREEBUSY" calendar components.
+
+ Description: The "UID" itself MUST be a globally unique identifier.
+ The generator of the identifier MUST guarantee that the identifier
+ is unique. There are several algorithms that can be used to
+ accomplish this. A good method to assure uniqueness is to put the
+ domain name or a domain literal IP address of the host on which
+ the identifier was created on the right-hand side of an "@", and
+ on the left-hand side, put a combination of the current calendar
+ date and time of day (i.e., formatted in as a DATE-TIME value)
+ along with some other currently unique (perhaps sequential)
+ identifier available on the system (for example, a process id
+ number). Using a DATE-TIME value on the left-hand side and a
+ domain name or domain literal on the right-hand side makes it
+ possible to guarantee uniqueness since no two hosts should be
+ using the same domain name or IP address at the same time. Though
+ other algorithms will work, it is RECOMMENDED that the right-hand
+ side contain some domain identifier (either of the host itself or
+ otherwise) such that the generator of the message identifier can
+ guarantee the uniqueness of the left-hand side within the scope of
+ that domain.
+
+ This is the method for correlating scheduling messages with the
+ referenced "VEVENT", "VTODO", or "VJOURNAL" calendar component.
+
+
+
+Desruisseaux Standards Track [Page 117]
+
+RFC 5545 iCalendar September 2009
+
+
+ The full range of calendar components specified by a recurrence
+ set is referenced by referring to just the "UID" property value
+ corresponding to the calendar component. The "RECURRENCE-ID"
+ property allows the reference to an individual instance within the
+ recurrence set.
+
+ This property is an important method for group-scheduling
+ applications to match requests with later replies, modifications,
+ or deletion requests. Calendaring and scheduling applications
+ MUST generate this property in "VEVENT", "VTODO", and "VJOURNAL"
+ calendar components to assure interoperability with other group-
+ scheduling applications. This identifier is created by the
+ calendar system that generates an iCalendar object.
+
+ Implementations MUST be able to receive and persist values of at
+ least 255 octets for this property, but they MUST NOT truncate
+ values in the middle of a UTF-8 multi-octet sequence.
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ uid = "UID" uidparam ":" text CRLF
+
+ uidparam = *(";" other-param)
+
+ Example: The following is an example of this property:
+
+ UID:19960401T080045Z-4000F192713-0052@example.com
+
+3.8.5. Recurrence Component Properties
+
+ The following properties specify recurrence information in calendar
+ components.
+
+3.8.5.1. Exception Date-Times
+
+ Property Name: EXDATE
+
+ Purpose: This property defines the list of DATE-TIME exceptions for
+ recurring events, to-dos, journal entries, or time zone
+ definitions.
+
+ Value Type: The default value type for this property is DATE-TIME.
+ The value type can be set to DATE.
+
+ Property Parameters: IANA, non-standard, value data type, and time
+ zone identifier property parameters can be specified on this
+ property.
+
+
+
+Desruisseaux Standards Track [Page 118]
+
+RFC 5545 iCalendar September 2009
+
+
+ Conformance: This property can be specified in recurring "VEVENT",
+ "VTODO", and "VJOURNAL" calendar components as well as in the
+ "STANDARD" and "DAYLIGHT" sub-components of the "VTIMEZONE"
+ calendar component.
+
+ Description: The exception dates, if specified, are used in
+ computing the recurrence set. The recurrence set is the complete
+ set of recurrence instances for a calendar component. The
+ recurrence set is generated by considering the initial "DTSTART"
+ property along with the "RRULE", "RDATE", and "EXDATE" properties
+ contained within the recurring component. The "DTSTART" property
+ defines the first instance in the recurrence set. The "DTSTART"
+ property value SHOULD match the pattern of the recurrence rule, if
+ specified. The recurrence set generated with a "DTSTART" property
+ value that doesn't match the pattern of the rule is undefined.
+ The final recurrence set is generated by gathering all of the
+ start DATE-TIME values generated by any of the specified "RRULE"
+ and "RDATE" properties, and then excluding any start DATE-TIME
+ values specified by "EXDATE" properties. This implies that start
+ DATE-TIME values specified by "EXDATE" properties take precedence
+ over those specified by inclusion properties (i.e., "RDATE" and
+ "RRULE"). When duplicate instances are generated by the "RRULE"
+ and "RDATE" properties, only one recurrence is considered.
+ Duplicate instances are ignored.
+
+ The "EXDATE" property can be used to exclude the value specified
+ in "DTSTART". However, in such cases, the original "DTSTART" date
+ MUST still be maintained by the calendaring and scheduling system
+ because the original "DTSTART" value has inherent usage
+ dependencies by other properties such as the "RECURRENCE-ID".
+
+ Format Definition: This property is defined by the following
+ notation:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 119]
+
+RFC 5545 iCalendar September 2009
+
+
+ exdate = "EXDATE" exdtparam ":" exdtval *("," exdtval) CRLF
+
+ exdtparam = *(
+ ;
+ ; The following are OPTIONAL,
+ ; but MUST NOT occur more than once.
+ ;
+ (";" "VALUE" "=" ("DATE-TIME" / "DATE")) /
+ ;
+ (";" tzidparam) /
+ ;
+ ; The following is OPTIONAL,
+ ; and MAY occur more than once.
+ ;
+ (";" other-param)
+ ;
+ )
+
+ exdtval = date-time / date
+ ;Value MUST match value type
+
+ Example: The following is an example of this property:
+
+ EXDATE:19960402T010000Z,19960403T010000Z,19960404T010000Z
+
+3.8.5.2. Recurrence Date-Times
+
+ Property Name: RDATE
+
+ Purpose: This property defines the list of DATE-TIME values for
+ recurring events, to-dos, journal entries, or time zone
+ definitions.
+
+ Value Type: The default value type for this property is DATE-TIME.
+ The value type can be set to DATE or PERIOD.
+
+ Property Parameters: IANA, non-standard, value data type, and time
+ zone identifier property parameters can be specified on this
+ property.
+
+ Conformance: This property can be specified in recurring "VEVENT",
+ "VTODO", and "VJOURNAL" calendar components as well as in the
+ "STANDARD" and "DAYLIGHT" sub-components of the "VTIMEZONE"
+ calendar component.
+
+ Description: This property can appear along with the "RRULE"
+ property to define an aggregate set of repeating occurrences.
+ When they both appear in a recurring component, the recurrence
+
+
+
+Desruisseaux Standards Track [Page 120]
+
+RFC 5545 iCalendar September 2009
+
+
+ instances are defined by the union of occurrences defined by both
+ the "RDATE" and "RRULE".
+
+ The recurrence dates, if specified, are used in computing the
+ recurrence set. The recurrence set is the complete set of
+ recurrence instances for a calendar component. The recurrence set
+ is generated by considering the initial "DTSTART" property along
+ with the "RRULE", "RDATE", and "EXDATE" properties contained
+ within the recurring component. The "DTSTART" property defines
+ the first instance in the recurrence set. The "DTSTART" property
+ value SHOULD match the pattern of the recurrence rule, if
+ specified. The recurrence set generated with a "DTSTART" property
+ value that doesn't match the pattern of the rule is undefined.
+ The final recurrence set is generated by gathering all of the
+ start DATE-TIME values generated by any of the specified "RRULE"
+ and "RDATE" properties, and then excluding any start DATE-TIME
+ values specified by "EXDATE" properties. This implies that start
+ DATE-TIME values specified by "EXDATE" properties take precedence
+ over those specified by inclusion properties (i.e., "RDATE" and
+ "RRULE"). Where duplicate instances are generated by the "RRULE"
+ and "RDATE" properties, only one recurrence is considered.
+ Duplicate instances are ignored.
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ rdate = "RDATE" rdtparam ":" rdtval *("," rdtval) CRLF
+
+ rdtparam = *(
+ ;
+ ; The following are OPTIONAL,
+ ; but MUST NOT occur more than once.
+ ;
+ (";" "VALUE" "=" ("DATE-TIME" / "DATE" / "PERIOD")) /
+ (";" tzidparam) /
+ ;
+ ; The following is OPTIONAL,
+ ; and MAY occur more than once.
+ ;
+ (";" other-param)
+ ;
+ )
+
+ rdtval = date-time / date / period
+ ;Value MUST match value type
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 121]
+
+RFC 5545 iCalendar September 2009
+
+
+ Example: The following are examples of this property:
+
+ RDATE:19970714T123000Z
+ RDATE;TZID=America/New_York:19970714T083000
+
+ RDATE;VALUE=PERIOD:19960403T020000Z/19960403T040000Z,
+ 19960404T010000Z/PT3H
+
+ RDATE;VALUE=DATE:19970101,19970120,19970217,19970421
+ 19970526,19970704,19970901,19971014,19971128,19971129,19971225
+
+3.8.5.3. Recurrence Rule
+
+ Property Name: RRULE
+
+ Purpose: This property defines a rule or repeating pattern for
+ recurring events, to-dos, journal entries, or time zone
+ definitions.
+
+ Value Type: RECUR
+
+ Property Parameters: IANA and non-standard property parameters can
+ be specified on this property.
+
+ Conformance: This property can be specified in recurring "VEVENT",
+ "VTODO", and "VJOURNAL" calendar components as well as in the
+ "STANDARD" and "DAYLIGHT" sub-components of the "VTIMEZONE"
+ calendar component, but it SHOULD NOT be specified more than once.
+ The recurrence set generated with multiple "RRULE" properties is
+ undefined.
+
+ Description: The recurrence rule, if specified, is used in computing
+ the recurrence set. The recurrence set is the complete set of
+ recurrence instances for a calendar component. The recurrence set
+ is generated by considering the initial "DTSTART" property along
+ with the "RRULE", "RDATE", and "EXDATE" properties contained
+ within the recurring component. The "DTSTART" property defines
+ the first instance in the recurrence set. The "DTSTART" property
+ value SHOULD be synchronized with the recurrence rule, if
+ specified. The recurrence set generated with a "DTSTART" property
+ value not synchronized with the recurrence rule is undefined. The
+ final recurrence set is generated by gathering all of the start
+ DATE-TIME values generated by any of the specified "RRULE" and
+ "RDATE" properties, and then excluding any start DATE-TIME values
+ specified by "EXDATE" properties. This implies that start DATE-
+ TIME values specified by "EXDATE" properties take precedence over
+ those specified by inclusion properties (i.e., "RDATE" and
+ "RRULE"). Where duplicate instances are generated by the "RRULE"
+
+
+
+Desruisseaux Standards Track [Page 122]
+
+RFC 5545 iCalendar September 2009
+
+
+ and "RDATE" properties, only one recurrence is considered.
+ Duplicate instances are ignored.
+
+ The "DTSTART" property specified within the iCalendar object
+ defines the first instance of the recurrence. In most cases, a
+ "DTSTART" property of DATE-TIME value type used with a recurrence
+ rule, should be specified as a date with local time and time zone
+ reference to make sure all the recurrence instances start at the
+ same local time regardless of time zone changes.
+
+ If the duration of the recurring component is specified with the
+ "DTEND" or "DUE" property, then the same exact duration will apply
+ to all the members of the generated recurrence set. Else, if the
+ duration of the recurring component is specified with the
+ "DURATION" property, then the same nominal duration will apply to
+ all the members of the generated recurrence set and the exact
+ duration of each recurrence instance will depend on its specific
+ start time. For example, recurrence instances of a nominal
+ duration of one day will have an exact duration of more or less
+ than 24 hours on a day where a time zone shift occurs. The
+ duration of a specific recurrence may be modified in an exception
+ component or simply by using an "RDATE" property of PERIOD value
+ type.
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ rrule = "RRULE" rrulparam ":" recur CRLF
+
+ rrulparam = *(";" other-param)
+
+ Example: All examples assume the Eastern United States time zone.
+
+ Daily for 10 occurrences:
+
+ DTSTART;TZID=America/New_York:19970902T090000
+ RRULE:FREQ=DAILY;COUNT=10
+
+ ==> (1997 9:00 AM EDT) September 2-11
+
+ Daily until December 24, 1997:
+
+ DTSTART;TZID=America/New_York:19970902T090000
+ RRULE:FREQ=DAILY;UNTIL=19971224T000000Z
+
+ ==> (1997 9:00 AM EDT) September 2-30;October 1-25
+ (1997 9:00 AM EST) October 26-31;November 1-30;December 1-23
+
+
+
+
+Desruisseaux Standards Track [Page 123]
+
+RFC 5545 iCalendar September 2009
+
+
+ Every other day - forever:
+
+ DTSTART;TZID=America/New_York:19970902T090000
+ RRULE:FREQ=DAILY;INTERVAL=2
+
+ ==> (1997 9:00 AM EDT) September 2,4,6,8...24,26,28,30;
+ October 2,4,6...20,22,24
+ (1997 9:00 AM EST) October 26,28,30;
+ November 1,3,5,7...25,27,29;
+ December 1,3,...
+
+ Every 10 days, 5 occurrences:
+
+ DTSTART;TZID=America/New_York:19970902T090000
+ RRULE:FREQ=DAILY;INTERVAL=10;COUNT=5
+
+ ==> (1997 9:00 AM EDT) September 2,12,22;
+ October 2,12
+
+ Every day in January, for 3 years:
+
+ DTSTART;TZID=America/New_York:19980101T090000
+
+ RRULE:FREQ=YEARLY;UNTIL=20000131T140000Z;
+ BYMONTH=1;BYDAY=SU,MO,TU,WE,TH,FR,SA
+ or
+ RRULE:FREQ=DAILY;UNTIL=20000131T140000Z;BYMONTH=1
+
+ ==> (1998 9:00 AM EST)January 1-31
+ (1999 9:00 AM EST)January 1-31
+ (2000 9:00 AM EST)January 1-31
+
+ Weekly for 10 occurrences:
+
+ DTSTART;TZID=America/New_York:19970902T090000
+ RRULE:FREQ=WEEKLY;COUNT=10
+
+ ==> (1997 9:00 AM EDT) September 2,9,16,23,30;October 7,14,21
+ (1997 9:00 AM EST) October 28;November 4
+
+
+
+
+
+
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 124]
+
+RFC 5545 iCalendar September 2009
+
+
+ Weekly until December 24, 1997:
+
+ DTSTART;TZID=America/New_York:19970902T090000
+ RRULE:FREQ=WEEKLY;UNTIL=19971224T000000Z
+
+ ==> (1997 9:00 AM EDT) September 2,9,16,23,30;
+ October 7,14,21
+ (1997 9:00 AM EST) October 28;
+ November 4,11,18,25;
+ December 2,9,16,23
+
+ Every other week - forever:
+
+ DTSTART;TZID=America/New_York:19970902T090000
+ RRULE:FREQ=WEEKLY;INTERVAL=2;WKST=SU
+
+ ==> (1997 9:00 AM EDT) September 2,16,30;
+ October 14
+ (1997 9:00 AM EST) October 28;
+ November 11,25;
+ December 9,23
+ (1998 9:00 AM EST) January 6,20;
+ February 3, 17
+ ...
+
+ Weekly on Tuesday and Thursday for five weeks:
+
+ DTSTART;TZID=America/New_York:19970902T090000
+ RRULE:FREQ=WEEKLY;UNTIL=19971007T000000Z;WKST=SU;BYDAY=TU,TH
+
+ or
+
+ RRULE:FREQ=WEEKLY;COUNT=10;WKST=SU;BYDAY=TU,TH
+
+ ==> (1997 9:00 AM EDT) September 2,4,9,11,16,18,23,25,30;
+ October 2
+
+ Every other week on Monday, Wednesday, and Friday until December
+ 24, 1997, starting on Monday, September 1, 1997:
+
+ DTSTART;TZID=America/New_York:19970901T090000
+ RRULE:FREQ=WEEKLY;INTERVAL=2;UNTIL=19971224T000000Z;WKST=SU;
+ BYDAY=MO,WE,FR
+
+ ==> (1997 9:00 AM EDT) September 1,3,5,15,17,19,29;
+ October 1,3,13,15,17
+ (1997 9:00 AM EST) October 27,29,31;
+ November 10,12,14,24,26,28;
+
+
+
+Desruisseaux Standards Track [Page 125]
+
+RFC 5545 iCalendar September 2009
+
+
+ December 8,10,12,22
+
+ Every other week on Tuesday and Thursday, for 8 occurrences:
+
+ DTSTART;TZID=America/New_York:19970902T090000
+ RRULE:FREQ=WEEKLY;INTERVAL=2;COUNT=8;WKST=SU;BYDAY=TU,TH
+
+ ==> (1997 9:00 AM EDT) September 2,4,16,18,30;
+ October 2,14,16
+
+ Monthly on the first Friday for 10 occurrences:
+
+ DTSTART;TZID=America/New_York:19970905T090000
+ RRULE:FREQ=MONTHLY;COUNT=10;BYDAY=1FR
+
+ ==> (1997 9:00 AM EDT) September 5;October 3
+ (1997 9:00 AM EST) November 7;December 5
+ (1998 9:00 AM EST) January 2;February 6;March 6;April 3
+ (1998 9:00 AM EDT) May 1;June 5
+
+ Monthly on the first Friday until December 24, 1997:
+
+ DTSTART;TZID=America/New_York:19970905T090000
+ RRULE:FREQ=MONTHLY;UNTIL=19971224T000000Z;BYDAY=1FR
+
+ ==> (1997 9:00 AM EDT) September 5; October 3
+ (1997 9:00 AM EST) November 7; December 5
+
+ Every other month on the first and last Sunday of the month for 10
+ occurrences:
+
+ DTSTART;TZID=America/New_York:19970907T090000
+ RRULE:FREQ=MONTHLY;INTERVAL=2;COUNT=10;BYDAY=1SU,-1SU
+
+ ==> (1997 9:00 AM EDT) September 7,28
+ (1997 9:00 AM EST) November 2,30
+ (1998 9:00 AM EST) January 4,25;March 1,29
+ (1998 9:00 AM EDT) May 3,31
+
+ Monthly on the second-to-last Monday of the month for 6 months:
+
+ DTSTART;TZID=America/New_York:19970922T090000
+ RRULE:FREQ=MONTHLY;COUNT=6;BYDAY=-2MO
+
+ ==> (1997 9:00 AM EDT) September 22;October 20
+ (1997 9:00 AM EST) November 17;December 22
+ (1998 9:00 AM EST) January 19;February 16
+
+
+
+
+Desruisseaux Standards Track [Page 126]
+
+RFC 5545 iCalendar September 2009
+
+
+ Monthly on the third-to-the-last day of the month, forever:
+
+ DTSTART;TZID=America/New_York:19970928T090000
+ RRULE:FREQ=MONTHLY;BYMONTHDAY=-3
+
+ ==> (1997 9:00 AM EDT) September 28
+ (1997 9:00 AM EST) October 29;November 28;December 29
+ (1998 9:00 AM EST) January 29;February 26
+ ...
+
+ Monthly on the 2nd and 15th of the month for 10 occurrences:
+
+ DTSTART;TZID=America/New_York:19970902T090000
+ RRULE:FREQ=MONTHLY;COUNT=10;BYMONTHDAY=2,15
+
+ ==> (1997 9:00 AM EDT) September 2,15;October 2,15
+ (1997 9:00 AM EST) November 2,15;December 2,15
+ (1998 9:00 AM EST) January 2,15
+
+ Monthly on the first and last day of the month for 10 occurrences:
+
+ DTSTART;TZID=America/New_York:19970930T090000
+ RRULE:FREQ=MONTHLY;COUNT=10;BYMONTHDAY=1,-1
+
+ ==> (1997 9:00 AM EDT) September 30;October 1
+ (1997 9:00 AM EST) October 31;November 1,30;December 1,31
+ (1998 9:00 AM EST) January 1,31;February 1
+
+ Every 18 months on the 10th thru 15th of the month for 10
+ occurrences:
+
+ DTSTART;TZID=America/New_York:19970910T090000
+ RRULE:FREQ=MONTHLY;INTERVAL=18;COUNT=10;BYMONTHDAY=10,11,12,
+ 13,14,15
+
+ ==> (1997 9:00 AM EDT) September 10,11,12,13,14,15
+ (1999 9:00 AM EST) March 10,11,12,13
+
+ Every Tuesday, every other month:
+
+ DTSTART;TZID=America/New_York:19970902T090000
+ RRULE:FREQ=MONTHLY;INTERVAL=2;BYDAY=TU
+
+ ==> (1997 9:00 AM EDT) September 2,9,16,23,30
+ (1997 9:00 AM EST) November 4,11,18,25
+ (1998 9:00 AM EST) January 6,13,20,27;March 3,10,17,24,31
+ ...
+
+
+
+
+Desruisseaux Standards Track [Page 127]
+
+RFC 5545 iCalendar September 2009
+
+
+ Yearly in June and July for 10 occurrences:
+
+ DTSTART;TZID=America/New_York:19970610T090000
+ RRULE:FREQ=YEARLY;COUNT=10;BYMONTH=6,7
+
+ ==> (1997 9:00 AM EDT) June 10;July 10
+ (1998 9:00 AM EDT) June 10;July 10
+ (1999 9:00 AM EDT) June 10;July 10
+ (2000 9:00 AM EDT) June 10;July 10
+ (2001 9:00 AM EDT) June 10;July 10
+
+ Note: Since none of the BYDAY, BYMONTHDAY, or BYYEARDAY
+ components are specified, the day is gotten from "DTSTART".
+
+ Every other year on January, February, and March for 10
+ occurrences:
+
+ DTSTART;TZID=America/New_York:19970310T090000
+ RRULE:FREQ=YEARLY;INTERVAL=2;COUNT=10;BYMONTH=1,2,3
+
+ ==> (1997 9:00 AM EST) March 10
+ (1999 9:00 AM EST) January 10;February 10;March 10
+ (2001 9:00 AM EST) January 10;February 10;March 10
+ (2003 9:00 AM EST) January 10;February 10;March 10
+
+ Every third year on the 1st, 100th, and 200th day for 10
+ occurrences:
+
+ DTSTART;TZID=America/New_York:19970101T090000
+ RRULE:FREQ=YEARLY;INTERVAL=3;COUNT=10;BYYEARDAY=1,100,200
+
+ ==> (1997 9:00 AM EST) January 1
+ (1997 9:00 AM EDT) April 10;July 19
+ (2000 9:00 AM EST) January 1
+ (2000 9:00 AM EDT) April 9;July 18
+ (2003 9:00 AM EST) January 1
+ (2003 9:00 AM EDT) April 10;July 19
+ (2006 9:00 AM EST) January 1
+
+ Every 20th Monday of the year, forever:
+
+ DTSTART;TZID=America/New_York:19970519T090000
+ RRULE:FREQ=YEARLY;BYDAY=20MO
+
+ ==> (1997 9:00 AM EDT) May 19
+ (1998 9:00 AM EDT) May 18
+ (1999 9:00 AM EDT) May 17
+ ...
+
+
+
+Desruisseaux Standards Track [Page 128]
+
+RFC 5545 iCalendar September 2009
+
+
+ Monday of week number 20 (where the default start of the week is
+ Monday), forever:
+
+ DTSTART;TZID=America/New_York:19970512T090000
+ RRULE:FREQ=YEARLY;BYWEEKNO=20;BYDAY=MO
+
+ ==> (1997 9:00 AM EDT) May 12
+ (1998 9:00 AM EDT) May 11
+ (1999 9:00 AM EDT) May 17
+ ...
+
+ Every Thursday in March, forever:
+
+ DTSTART;TZID=America/New_York:19970313T090000
+ RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=TH
+
+ ==> (1997 9:00 AM EST) March 13,20,27
+ (1998 9:00 AM EST) March 5,12,19,26
+ (1999 9:00 AM EST) March 4,11,18,25
+ ...
+
+ Every Thursday, but only during June, July, and August, forever:
+
+ DTSTART;TZID=America/New_York:19970605T090000
+ RRULE:FREQ=YEARLY;BYDAY=TH;BYMONTH=6,7,8
+
+ ==> (1997 9:00 AM EDT) June 5,12,19,26;July 3,10,17,24,31;
+ August 7,14,21,28
+ (1998 9:00 AM EDT) June 4,11,18,25;July 2,9,16,23,30;
+ August 6,13,20,27
+ (1999 9:00 AM EDT) June 3,10,17,24;July 1,8,15,22,29;
+ August 5,12,19,26
+ ...
+
+ Every Friday the 13th, forever:
+
+ DTSTART;TZID=America/New_York:19970902T090000
+ EXDATE;TZID=America/New_York:19970902T090000
+ RRULE:FREQ=MONTHLY;BYDAY=FR;BYMONTHDAY=13
+
+ ==> (1998 9:00 AM EST) February 13;March 13;November 13
+ (1999 9:00 AM EDT) August 13
+ (2000 9:00 AM EDT) October 13
+ ...
+
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 129]
+
+RFC 5545 iCalendar September 2009
+
+
+ The first Saturday that follows the first Sunday of the month,
+ forever:
+
+ DTSTART;TZID=America/New_York:19970913T090000
+ RRULE:FREQ=MONTHLY;BYDAY=SA;BYMONTHDAY=7,8,9,10,11,12,13
+
+ ==> (1997 9:00 AM EDT) September 13;October 11
+ (1997 9:00 AM EST) November 8;December 13
+ (1998 9:00 AM EST) January 10;February 7;March 7
+ (1998 9:00 AM EDT) April 11;May 9;June 13...
+ ...
+
+ Every 4 years, the first Tuesday after a Monday in November,
+ forever (U.S. Presidential Election day):
+
+ DTSTART;TZID=America/New_York:19961105T090000
+ RRULE:FREQ=YEARLY;INTERVAL=4;BYMONTH=11;BYDAY=TU;
+ BYMONTHDAY=2,3,4,5,6,7,8
+
+ ==> (1996 9:00 AM EST) November 5
+ (2000 9:00 AM EST) November 7
+ (2004 9:00 AM EST) November 2
+ ...
+
+ The third instance into the month of one of Tuesday, Wednesday, or
+ Thursday, for the next 3 months:
+
+ DTSTART;TZID=America/New_York:19970904T090000
+ RRULE:FREQ=MONTHLY;COUNT=3;BYDAY=TU,WE,TH;BYSETPOS=3
+
+ ==> (1997 9:00 AM EDT) September 4;October 7
+ (1997 9:00 AM EST) November 6
+
+ The second-to-last weekday of the month:
+
+ DTSTART;TZID=America/New_York:19970929T090000
+ RRULE:FREQ=MONTHLY;BYDAY=MO,TU,WE,TH,FR;BYSETPOS=-2
+
+ ==> (1997 9:00 AM EDT) September 29
+ (1997 9:00 AM EST) October 30;November 27;December 30
+ (1998 9:00 AM EST) January 29;February 26;March 30
+ ...
+
+
+
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 130]
+
+RFC 5545 iCalendar September 2009
+
+
+ Every 3 hours from 9:00 AM to 5:00 PM on a specific day:
+
+ DTSTART;TZID=America/New_York:19970902T090000
+ RRULE:FREQ=HOURLY;INTERVAL=3;UNTIL=19970902T170000Z
+
+ ==> (September 2, 1997 EDT) 09:00,12:00,15:00
+
+ Every 15 minutes for 6 occurrences:
+
+ DTSTART;TZID=America/New_York:19970902T090000
+ RRULE:FREQ=MINUTELY;INTERVAL=15;COUNT=6
+
+ ==> (September 2, 1997 EDT) 09:00,09:15,09:30,09:45,10:00,10:15
+
+ Every hour and a half for 4 occurrences:
+
+ DTSTART;TZID=America/New_York:19970902T090000
+ RRULE:FREQ=MINUTELY;INTERVAL=90;COUNT=4
+
+ ==> (September 2, 1997 EDT) 09:00,10:30;12:00;13:30
+
+ Every 20 minutes from 9:00 AM to 4:40 PM every day:
+
+ DTSTART;TZID=America/New_York:19970902T090000
+ RRULE:FREQ=DAILY;BYHOUR=9,10,11,12,13,14,15,16;BYMINUTE=0,20,40
+ or
+ RRULE:FREQ=MINUTELY;INTERVAL=20;BYHOUR=9,10,11,12,13,14,15,16
+
+ ==> (September 2, 1997 EDT) 9:00,9:20,9:40,10:00,10:20,
+ ... 16:00,16:20,16:40
+ (September 3, 1997 EDT) 9:00,9:20,9:40,10:00,10:20,
+ ...16:00,16:20,16:40
+ ...
+
+ An example where the days generated makes a difference because of
+ WKST:
+
+ DTSTART;TZID=America/New_York:19970805T090000
+ RRULE:FREQ=WEEKLY;INTERVAL=2;COUNT=4;BYDAY=TU,SU;WKST=MO
+
+ ==> (1997 EDT) August 5,10,19,24
+
+ changing only WKST from MO to SU, yields different results...
+
+ DTSTART;TZID=America/New_York:19970805T090000
+ RRULE:FREQ=WEEKLY;INTERVAL=2;COUNT=4;BYDAY=TU,SU;WKST=SU
+
+ ==> (1997 EDT) August 5,17,19,31
+
+
+
+Desruisseaux Standards Track [Page 131]
+
+RFC 5545 iCalendar September 2009
+
+
+ An example where an invalid date (i.e., February 30) is ignored.
+
+ DTSTART;TZID=America/New_York:20070115T090000
+ RRULE:FREQ=MONTHLY;BYMONTHDAY=15,30;COUNT=5
+
+ ==> (2007 EST) January 15,30
+ (2007 EST) February 15
+ (2007 EDT) March 15,30
+
+3.8.6. Alarm Component Properties
+
+ The following properties specify alarm information in calendar
+ components.
+
+3.8.6.1. Action
+
+ Property Name: ACTION
+
+ Purpose: This property defines the action to be invoked when an
+ alarm is triggered.
+
+ Value Type: TEXT
+
+ Property Parameters: IANA and non-standard property parameters can
+ be specified on this property.
+
+ Conformance: This property MUST be specified once in a "VALARM"
+ calendar component.
+
+ Description: Each "VALARM" calendar component has a particular type
+ of action with which it is associated. This property specifies
+ the type of action. Applications MUST ignore alarms with x-name
+ and iana-token values they don't recognize.
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ action = "ACTION" actionparam ":" actionvalue CRLF
+
+ actionparam = *(";" other-param)
+
+
+ actionvalue = "AUDIO" / "DISPLAY" / "EMAIL"
+ / iana-token / x-name
+
+ Example: The following are examples of this property in a "VALARM"
+ calendar component:
+
+
+
+
+Desruisseaux Standards Track [Page 132]
+
+RFC 5545 iCalendar September 2009
+
+
+ ACTION:AUDIO
+
+ ACTION:DISPLAY
+
+3.8.6.2. Repeat Count
+
+ Property Name: REPEAT
+
+ Purpose: This property defines the number of times the alarm should
+ be repeated, after the initial trigger.
+
+ Value Type: INTEGER
+
+ Property Parameters: IANA and non-standard property parameters can
+ be specified on this property.
+
+ Conformance: This property can be specified in a "VALARM" calendar
+ component.
+
+ Description: This property defines the number of times an alarm
+ should be repeated after its initial trigger. If the alarm
+ triggers more than once, then this property MUST be specified
+ along with the "DURATION" property.
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ repeat = "REPEAT" repparam ":" integer CRLF
+ ;Default is "0", zero.
+
+ repparam = *(";" other-param)
+
+ Example: The following is an example of this property for an alarm
+ that repeats 4 additional times with a 5-minute delay after the
+ initial triggering of the alarm:
+
+ REPEAT:4
+ DURATION:PT5M
+
+3.8.6.3. Trigger
+
+ Property Name: TRIGGER
+
+ Purpose: This property specifies when an alarm will trigger.
+
+ Value Type: The default value type is DURATION. The value type can
+ be set to a DATE-TIME value type, in which case the value MUST
+ specify a UTC-formatted DATE-TIME value.
+
+
+
+Desruisseaux Standards Track [Page 133]
+
+RFC 5545 iCalendar September 2009
+
+
+ Property Parameters: IANA, non-standard, value data type, time zone
+ identifier, or trigger relationship property parameters can be
+ specified on this property. The trigger relationship property
+ parameter MUST only be specified when the value type is
+ "DURATION".
+
+ Conformance: This property MUST be specified in the "VALARM"
+ calendar component.
+
+ Description: This property defines when an alarm will trigger. The
+ default value type is DURATION, specifying a relative time for the
+ trigger of the alarm. The default duration is relative to the
+ start of an event or to-do with which the alarm is associated.
+ The duration can be explicitly set to trigger from either the end
+ or the start of the associated event or to-do with the "RELATED"
+ parameter. A value of START will set the alarm to trigger off the
+ start of the associated event or to-do. A value of END will set
+ the alarm to trigger off the end of the associated event or to-do.
+
+ Either a positive or negative duration may be specified for the
+ "TRIGGER" property. An alarm with a positive duration is
+ triggered after the associated start or end of the event or to-do.
+ An alarm with a negative duration is triggered before the
+ associated start or end of the event or to-do.
+
+ The "RELATED" property parameter is not valid if the value type of
+ the property is set to DATE-TIME (i.e., for an absolute date and
+ time alarm trigger). If a value type of DATE-TIME is specified,
+ then the property value MUST be specified in the UTC time format.
+ If an absolute trigger is specified on an alarm for a recurring
+ event or to-do, then the alarm will only trigger for the specified
+ absolute DATE-TIME, along with any specified repeating instances.
+
+ If the trigger is set relative to START, then the "DTSTART"
+ property MUST be present in the associated "VEVENT" or "VTODO"
+ calendar component. If an alarm is specified for an event with
+ the trigger set relative to the END, then the "DTEND" property or
+ the "DTSTART" and "DURATION " properties MUST be present in the
+ associated "VEVENT" calendar component. If the alarm is specified
+ for a to-do with a trigger set relative to the END, then either
+ the "DUE" property or the "DTSTART" and "DURATION " properties
+ MUST be present in the associated "VTODO" calendar component.
+
+ Alarms specified in an event or to-do that is defined in terms of
+ a DATE value type will be triggered relative to 00:00:00 of the
+ user's configured time zone on the specified date, or relative to
+ 00:00:00 UTC on the specified date if no configured time zone can
+ be found for the user. For example, if "DTSTART" is a DATE value
+
+
+
+Desruisseaux Standards Track [Page 134]
+
+RFC 5545 iCalendar September 2009
+
+
+ set to 19980205 then the duration trigger will be relative to
+ 19980205T000000 America/New_York for a user configured with the
+ America/New_York time zone.
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ trigger = "TRIGGER" (trigrel / trigabs) CRLF
+
+ trigrel = *(
+ ;
+ ; The following are OPTIONAL,
+ ; but MUST NOT occur more than once.
+ ;
+ (";" "VALUE" "=" "DURATION") /
+ (";" trigrelparam) /
+ ;
+ ; The following is OPTIONAL,
+ ; and MAY occur more than once.
+ ;
+ (";" other-param)
+ ;
+ ) ":" dur-value
+
+ trigabs = *(
+ ;
+ ; The following is REQUIRED,
+ ; but MUST NOT occur more than once.
+ ;
+ (";" "VALUE" "=" "DATE-TIME") /
+ ;
+ ; The following is OPTIONAL,
+ ; and MAY occur more than once.
+ ;
+ (";" other-param)
+ ;
+ ) ":" date-time
+
+ Example: A trigger set 15 minutes prior to the start of the event or
+ to-do.
+
+ TRIGGER:-PT15M
+
+ A trigger set five minutes after the end of an event or the due
+ date of a to-do.
+
+ TRIGGER;RELATED=END:PT5M
+
+
+
+
+Desruisseaux Standards Track [Page 135]
+
+RFC 5545 iCalendar September 2009
+
+
+ A trigger set to an absolute DATE-TIME.
+
+ TRIGGER;VALUE=DATE-TIME:19980101T050000Z
+
+3.8.7. Change Management Component Properties
+
+ The following properties specify change management information in
+ calendar components.
+
+3.8.7.1. Date-Time Created
+
+ Property Name: CREATED
+
+ Purpose: This property specifies the date and time that the calendar
+ information was created by the calendar user agent in the calendar
+ store.
+
+ Note: This is analogous to the creation date and time for a
+ file in the file system.
+
+ Value Type: DATE-TIME
+
+ Property Parameters: IANA and non-standard property parameters can
+ be specified on this property.
+
+ Conformance: The property can be specified once in "VEVENT",
+ "VTODO", or "VJOURNAL" calendar components. The value MUST be
+ specified as a date with UTC time.
+
+ Description: This property specifies the date and time that the
+ calendar information was created by the calendar user agent in the
+ calendar store.
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ created = "CREATED" creaparam ":" date-time CRLF
+
+ creaparam = *(";" other-param)
+
+ Example: The following is an example of this property:
+
+ CREATED:19960329T133000Z
+
+
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 136]
+
+RFC 5545 iCalendar September 2009
+
+
+3.8.7.2. Date-Time Stamp
+
+ Property Name: DTSTAMP
+
+ Purpose: In the case of an iCalendar object that specifies a
+ "METHOD" property, this property specifies the date and time that
+ the instance of the iCalendar object was created. In the case of
+ an iCalendar object that doesn't specify a "METHOD" property, this
+ property specifies the date and time that the information
+ associated with the calendar component was last revised in the
+ calendar store.
+
+ Value Type: DATE-TIME
+
+ Property Parameters: IANA and non-standard property parameters can
+ be specified on this property.
+
+ Conformance: This property MUST be included in the "VEVENT",
+ "VTODO", "VJOURNAL", or "VFREEBUSY" calendar components.
+
+ Description: The value MUST be specified in the UTC time format.
+
+ This property is also useful to protocols such as [2447bis] that
+ have inherent latency issues with the delivery of content. This
+ property will assist in the proper sequencing of messages
+ containing iCalendar objects.
+
+ In the case of an iCalendar object that specifies a "METHOD"
+ property, this property differs from the "CREATED" and "LAST-
+ MODIFIED" properties. These two properties are used to specify
+ when the particular calendar data in the calendar store was
+ created and last modified. This is different than when the
+ iCalendar object representation of the calendar service
+ information was created or last modified.
+
+ In the case of an iCalendar object that doesn't specify a "METHOD"
+ property, this property is equivalent to the "LAST-MODIFIED"
+ property.
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ dtstamp = "DTSTAMP" stmparam ":" date-time CRLF
+
+ stmparam = *(";" other-param)
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 137]
+
+RFC 5545 iCalendar September 2009
+
+
+ Example:
+
+ DTSTAMP:19971210T080000Z
+
+3.8.7.3. Last Modified
+
+ Property Name: LAST-MODIFIED
+
+ Purpose: This property specifies the date and time that the
+ information associated with the calendar component was last
+ revised in the calendar store.
+
+ Note: This is analogous to the modification date and time for a
+ file in the file system.
+
+ Value Type: DATE-TIME
+
+ Property Parameters: IANA and non-standard property parameters can
+ be specified on this property.
+
+ Conformance: This property can be specified in the "VEVENT",
+ "VTODO", "VJOURNAL", or "VTIMEZONE" calendar components.
+
+ Description: The property value MUST be specified in the UTC time
+ format.
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ last-mod = "LAST-MODIFIED" lstparam ":" date-time CRLF
+
+ lstparam = *(";" other-param)
+
+ Example: The following is an example of this property:
+
+ LAST-MODIFIED:19960817T133000Z
+
+3.8.7.4. Sequence Number
+
+ Property Name: SEQUENCE
+
+ Purpose: This property defines the revision sequence number of the
+ calendar component within a sequence of revisions.
+
+ Value Type: INTEGER
+
+ Property Parameters: IANA and non-standard property parameters can
+ be specified on this property.
+
+
+
+Desruisseaux Standards Track [Page 138]
+
+RFC 5545 iCalendar September 2009
+
+
+ Conformance: The property can be specified in "VEVENT", "VTODO", or
+ "VJOURNAL" calendar component.
+
+ Description: When a calendar component is created, its sequence
+ number is 0. It is monotonically incremented by the "Organizer's"
+ CUA each time the "Organizer" makes a significant revision to the
+ calendar component.
+
+ The "Organizer" includes this property in an iCalendar object that
+ it sends to an "Attendee" to specify the current version of the
+ calendar component.
+
+ The "Attendee" includes this property in an iCalendar object that
+ it sends to the "Organizer" to specify the version of the calendar
+ component to which the "Attendee" is referring.
+
+ A change to the sequence number is not the mechanism that an
+ "Organizer" uses to request a response from the "Attendees". The
+ "RSVP" parameter on the "ATTENDEE" property is used by the
+ "Organizer" to indicate that a response from the "Attendees" is
+ requested.
+
+ Recurrence instances of a recurring component MAY have different
+ sequence numbers.
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ seq = "SEQUENCE" seqparam ":" integer CRLF
+ ; Default is "0"
+
+ seqparam = *(";" other-param)
+
+ Example: The following is an example of this property for a calendar
+ component that was just created by the "Organizer":
+
+ SEQUENCE:0
+
+ The following is an example of this property for a calendar
+ component that has been revised two different times by the
+ "Organizer":
+
+ SEQUENCE:2
+
+3.8.8. Miscellaneous Component Properties
+
+ The following properties specify information about a number of
+ miscellaneous features of calendar components.
+
+
+
+Desruisseaux Standards Track [Page 139]
+
+RFC 5545 iCalendar September 2009
+
+
+3.8.8.1. IANA Properties
+
+ Property Name: An IANA-registered property name
+
+ Value Type: The default value type is TEXT. The value type can be
+ set to any value type.
+
+ Property Parameters: Any parameter can be specified on this
+ property.
+
+ Description: This specification allows other properties registered
+ with IANA to be specified in any calendar components. Compliant
+ applications are expected to be able to parse these other IANA-
+ registered properties but can ignore them.
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ iana-prop = iana-token *(";" icalparameter) ":" value CRLF
+
+ Example: The following are examples of properties that might be
+ registered to IANA:
+
+ DRESSCODE:CASUAL
+
+ NON-SMOKING;VALUE=BOOLEAN:TRUE
+
+3.8.8.2. Non-Standard Properties
+
+ Property Name: Any property name with a "X-" prefix
+
+ Purpose: This class of property provides a framework for defining
+ non-standard properties.
+
+ Value Type: The default value type is TEXT. The value type can be
+ set to any value type.
+
+ Property Parameters: IANA, non-standard, and language property
+ parameters can be specified on this property.
+
+ Conformance: This property can be specified in any calendar
+ component.
+
+ Description: The MIME Calendaring and Scheduling Content Type
+ provides a "standard mechanism for doing non-standard things".
+ This extension support is provided for implementers to "push the
+ envelope" on the existing version of the memo. Extension
+ properties are specified by property and/or property parameter
+
+
+
+Desruisseaux Standards Track [Page 140]
+
+RFC 5545 iCalendar September 2009
+
+
+ names that have the prefix text of "X-" (the two-character
+ sequence: LATIN CAPITAL LETTER X character followed by the HYPHEN-
+ MINUS character). It is recommended that vendors concatenate onto
+ this sentinel another short prefix text to identify the vendor.
+ This will facilitate readability of the extensions and minimize
+ possible collision of names between different vendors. User
+ agents that support this content type are expected to be able to
+ parse the extension properties and property parameters but can
+ ignore them.
+
+ At present, there is no registration authority for names of
+ extension properties and property parameters. The value type for
+ this property is TEXT. Optionally, the value type can be any of
+ the other valid value types.
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ x-prop = x-name *(";" icalparameter) ":" value CRLF
+
+ Example: The following might be the ABC vendor's extension for an
+ audio-clip form of subject property:
+
+ X-ABC-MMSUBJ;VALUE=URI;FMTTYPE=audio/basic:http://www.example.
+ org/mysubj.au
+
+3.8.8.3. Request Status
+
+ Property Name: REQUEST-STATUS
+
+ Purpose: This property defines the status code returned for a
+ scheduling request.
+
+ Value Type: TEXT
+
+ Property Parameters: IANA, non-standard, and language property
+ parameters can be specified on this property.
+
+ Conformance: The property can be specified in the "VEVENT", "VTODO",
+ "VJOURNAL", or "VFREEBUSY" calendar component.
+
+ Description: This property is used to return status code information
+ related to the processing of an associated iCalendar object. The
+ value type for this property is TEXT.
+
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 141]
+
+RFC 5545 iCalendar September 2009
+
+
+ The value consists of a short return status component, a longer
+ return status description component, and optionally a status-
+ specific data component. The components of the value are
+ separated by the SEMICOLON character.
+
+ The short return status is a PERIOD character separated pair or
+ 3-tuple of integers. For example, "3.1" or "3.1.1". The
+ successive levels of integers provide for a successive level of
+ status code granularity.
+
+ The following are initial classes for the return status code.
+ Individual iCalendar object methods will define specific return
+ status codes for these classes. In addition, other classes for
+ the return status code may be defined using the registration
+ process defined later in this memo.
+
+ +--------+----------------------------------------------------------+
+ | Short | Longer Return Status Description |
+ | Return | |
+ | Status | |
+ | Code | |
+ +--------+----------------------------------------------------------+
+ | 1.xx | Preliminary success. This class of status code |
+ | | indicates that the request has been initially processed |
+ | | but that completion is pending. |
+ | | |
+ | 2.xx | Successful. This class of status code indicates that |
+ | | the request was completed successfully. However, the |
+ | | exact status code can indicate that a fallback has been |
+ | | taken. |
+ | | |
+ | 3.xx | Client Error. This class of status code indicates that |
+ | | the request was not successful. The error is the result |
+ | | of either a syntax or a semantic error in the client- |
+ | | formatted request. Request should not be retried until |
+ | | the condition in the request is corrected. |
+ | | |
+ | 4.xx | Scheduling Error. This class of status code indicates |
+ | | that the request was not successful. Some sort of error |
+ | | occurred within the calendaring and scheduling service, |
+ | | not directly related to the request itself. |
+ +--------+----------------------------------------------------------+
+
+
+
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 142]
+
+RFC 5545 iCalendar September 2009
+
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ rstatus = "REQUEST-STATUS" rstatparam ":"
+ statcode ";" statdesc [";" extdata]
+
+ rstatparam = *(
+ ;
+ ; The following is OPTIONAL,
+ ; but MUST NOT occur more than once.
+ ;
+ (";" languageparam) /
+ ;
+ ; The following is OPTIONAL,
+ ; and MAY occur more than once.
+ ;
+ (";" other-param)
+ ;
+ )
+
+ statcode = 1*DIGIT 1*2("." 1*DIGIT)
+ ;Hierarchical, numeric return status code
+
+ statdesc = text
+ ;Textual status description
+
+ extdata = text
+ ;Textual exception data. For example, the offending property
+ ;name and value or complete property line.
+
+ Example: The following are some possible examples of this property.
+
+ The COMMA and SEMICOLON separator characters in the property value
+ are BACKSLASH character escaped because they appear in a text
+ value.
+
+ REQUEST-STATUS:2.0;Success
+
+ REQUEST-STATUS:3.1;Invalid property value;DTSTART:96-Apr-01
+
+ REQUEST-STATUS:2.8; Success\, repeating event ignored. Scheduled
+ as a single event.;RRULE:FREQ=WEEKLY\;INTERVAL=2
+
+ REQUEST-STATUS:4.1;Event conflict. Date-time is busy.
+
+ REQUEST-STATUS:3.7;Invalid calendar user;ATTENDEE:
+ mailto:jsmith@example.com
+
+
+
+
+Desruisseaux Standards Track [Page 143]
+
+RFC 5545 iCalendar September 2009
+
+
+4. iCalendar Object Examples
+
+ The following examples are provided as an informational source of
+ illustrative iCalendar objects consistent with this content type.
+
+ The following example specifies a three-day conference that begins at
+ 2:30 P.M. UTC, September 18, 1996 and ends at 10:00 P.M. UTC,
+ September 20, 1996.
+
+ BEGIN:VCALENDAR
+ PRODID:-//xyz Corp//NONSGML PDA Calendar Version 1.0//EN
+ VERSION:2.0
+ BEGIN:VEVENT
+ DTSTAMP:19960704T120000Z
+ UID:uid1@example.com
+ ORGANIZER:mailto:jsmith@example.com
+ DTSTART:19960918T143000Z
+ DTEND:19960920T220000Z
+ STATUS:CONFIRMED
+ CATEGORIES:CONFERENCE
+ SUMMARY:Networld+Interop Conference
+ DESCRIPTION:Networld+Interop Conference
+ and Exhibit\nAtlanta World Congress Center\n
+ Atlanta\, Georgia
+ END:VEVENT
+ END:VCALENDAR
+
+ The following example specifies a group-scheduled meeting that begins
+ at 8:30 AM EST on March 12, 1998 and ends at 9:30 AM EST on March 12,
+ 1998. The "Organizer" has scheduled the meeting with one or more
+ calendar users in a group. A time zone specification for Eastern
+ United States has been specified.
+
+ BEGIN:VCALENDAR
+ PRODID:-//RDU Software//NONSGML HandCal//EN
+ VERSION:2.0
+ BEGIN:VTIMEZONE
+ TZID:America/New_York
+ BEGIN:STANDARD
+ DTSTART:19981025T020000
+ TZOFFSETFROM:-0400
+ TZOFFSETTO:-0500
+ TZNAME:EST
+ END:STANDARD
+ BEGIN:DAYLIGHT
+ DTSTART:19990404T020000
+ TZOFFSETFROM:-0500
+ TZOFFSETTO:-0400
+
+
+
+Desruisseaux Standards Track [Page 144]
+
+RFC 5545 iCalendar September 2009
+
+
+ TZNAME:EDT
+ END:DAYLIGHT
+ END:VTIMEZONE
+ BEGIN:VEVENT
+ DTSTAMP:19980309T231000Z
+ UID:guid-1.example.com
+ ORGANIZER:mailto:mrbig@example.com
+ ATTENDEE;RSVP=TRUE;ROLE=REQ-PARTICIPANT;CUTYPE=GROUP:
+ mailto:employee-A@example.com
+ DESCRIPTION:Project XYZ Review Meeting
+ CATEGORIES:MEETING
+ CLASS:PUBLIC
+ CREATED:19980309T130000Z
+ SUMMARY:XYZ Project Review
+ DTSTART;TZID=America/New_York:19980312T083000
+ DTEND;TZID=America/New_York:19980312T093000
+ LOCATION:1CP Conference Room 4350
+ END:VEVENT
+ END:VCALENDAR
+
+ The following is an example of an iCalendar object passed in a MIME
+ message with a single body part consisting of a "text/calendar"
+ Content Type.
+
+ TO:jsmith@example.com
+ FROM:jdoe@example.com
+ MIME-VERSION:1.0
+ MESSAGE-ID:<id3@example.com>
+ CONTENT-TYPE:text/calendar; method="xyz"; component="VEVENT"
+
+ BEGIN:VCALENDAR
+ METHOD:xyz
+ VERSION:2.0
+ PRODID:-//ABC Corporation//NONSGML My Product//EN
+ BEGIN:VEVENT
+ DTSTAMP:19970324T120000Z
+ SEQUENCE:0
+ UID:uid3@example.com
+ ORGANIZER:mailto:jdoe@example.com
+ ATTENDEE;RSVP=TRUE:mailto:jsmith@example.com
+ DTSTART:19970324T123000Z
+ DTEND:19970324T210000Z
+ CATEGORIES:MEETING,PROJECT
+ CLASS:PUBLIC
+ SUMMARY:Calendaring Interoperability Planning Meeting
+ DESCRIPTION:Discuss how we can test c&s interoperability\n
+ using iCalendar and other IETF standards.
+ LOCATION:LDB Lobby
+
+
+
+Desruisseaux Standards Track [Page 145]
+
+RFC 5545 iCalendar September 2009
+
+
+ ATTACH;FMTTYPE=application/postscript:ftp://example.com/pub/
+ conf/bkgrnd.ps
+ END:VEVENT
+ END:VCALENDAR
+
+ The following is an example of a to-do due on April 15, 1998. An
+ audio alarm has been specified to remind the calendar user at noon,
+ the day before the to-do is expected to be completed and repeat
+ hourly, four additional times. The to-do definition has been
+ modified twice since it was initially created.
+
+ BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//ABC Corporation//NONSGML My Product//EN
+ BEGIN:VTODO
+ DTSTAMP:19980130T134500Z
+ SEQUENCE:2
+ UID:uid4@example.com
+ ORGANIZER:mailto:unclesam@example.com
+ ATTENDEE;PARTSTAT=ACCEPTED:mailto:jqpublic@example.com
+ DUE:19980415T000000
+ STATUS:NEEDS-ACTION
+ SUMMARY:Submit Income Taxes
+ BEGIN:VALARM
+ ACTION:AUDIO
+ TRIGGER:19980403T120000Z
+ ATTACH;FMTTYPE=audio/basic:http://example.com/pub/audio-
+ files/ssbanner.aud
+ REPEAT:4
+ DURATION:PT1H
+ END:VALARM
+ END:VTODO
+ END:VCALENDAR
+
+ The following is an example of a journal entry:
+
+ BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//ABC Corporation//NONSGML My Product//EN
+ BEGIN:VJOURNAL
+ DTSTAMP:19970324T120000Z
+ UID:uid5@example.com
+ ORGANIZER:mailto:jsmith@example.com
+ STATUS:DRAFT
+ CLASS:PUBLIC
+ CATEGORIES:Project Report,XYZ,Weekly Meeting
+ DESCRIPTION:Project xyz Review Meeting Minutes\n
+ Agenda\n1. Review of project version 1.0 requirements.\n2.
+
+
+
+Desruisseaux Standards Track [Page 146]
+
+RFC 5545 iCalendar September 2009
+
+
+ Definition
+ of project processes.\n3. Review of project schedule.\n
+ Participants: John Smith\, Jane Doe\, Jim Dandy\n-It was
+ decided that the requirements need to be signed off by
+ product marketing.\n-Project processes were accepted.\n
+ -Project schedule needs to account for scheduled holidays
+ and employee vacation time. Check with HR for specific
+ dates.\n-New schedule will be distributed by Friday.\n-
+ Next weeks meeting is cancelled. No meeting until 3/23.
+ END:VJOURNAL
+ END:VCALENDAR
+
+ The following is an example of published busy time information. The
+ iCalendar object might be placed in the network resource
+ http://www.example.com/calendar/busytime/jsmith.ifb.
+
+ BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//RDU Software//NONSGML HandCal//EN
+ BEGIN:VFREEBUSY
+ ORGANIZER:mailto:jsmith@example.com
+ DTSTART:19980313T141711Z
+ DTEND:19980410T141711Z
+ FREEBUSY:19980314T233000Z/19980315T003000Z
+ FREEBUSY:19980316T153000Z/19980316T163000Z
+ FREEBUSY:19980318T030000Z/19980318T040000Z
+ URL:http://www.example.com/calendar/busytime/jsmith.ifb
+ END:VFREEBUSY
+ END:VCALENDAR
+
+5. Recommended Practices
+
+ These recommended practices should be followed in order to assure
+ consistent handling of the following cases for an iCalendar object.
+
+ 1. Content lines longer than 75 octets SHOULD be folded.
+
+ 2. When the combination of the "RRULE" and "RDATE" properties in a
+ recurring component produces multiple instances having the same
+ start DATE-TIME value, they should be collapsed to, and
+ considered as, a single instance. If the "RDATE" property is
+ specified as a PERIOD value the duration of the recurrence
+ instance will be the one specified by the "RDATE" property, and
+ not the duration of the recurrence instance defined by the
+ "DTSTART" property.
+
+ 3. When a calendar user receives multiple requests for the same
+ calendar component (e.g., REQUEST for a "VEVENT" calendar
+
+
+
+Desruisseaux Standards Track [Page 147]
+
+RFC 5545 iCalendar September 2009
+
+
+ component) as a result of being on multiple mailing lists
+ specified by "ATTENDEE" properties in the request, they SHOULD
+ respond to only one of the requests. The calendar user SHOULD
+ also specify (using the "MEMBER" parameter of the "ATTENDEE"
+ property) of which mailing list they are a member.
+
+ 4. An implementation can truncate a "SUMMARY" property value to 255
+ octets, but it MUST NOT truncate the value in the middle of a
+ UTF-8 multi-octet sequence.
+
+ 5. If seconds of the minute are not supported by an implementation,
+ then a value of "00" SHOULD be specified for the seconds
+ component in a time value.
+
+ 6. "TZURL" values SHOULD NOT be specified as a file URI type. This
+ URI form can be useful within an organization, but is problematic
+ in the Internet.
+
+ 7. Some possible English values for "CATEGORIES" property include:
+ "ANNIVERSARY", "APPOINTMENT", "BUSINESS", "EDUCATION", "HOLIDAY",
+ "MEETING", "MISCELLANEOUS", "NON-WORKING HOURS", "NOT IN OFFICE",
+ "PERSONAL", "PHONE CALL", "SICK DAY", "SPECIAL OCCASION",
+ "TRAVEL", "VACATION". Categories can be specified in any
+ registered language.
+
+ 8. Some possible English values for the "RESOURCES" property
+ include: "CATERING", "CHAIRS", "COMPUTER PROJECTOR", "EASEL",
+ "OVERHEAD PROJECTOR", "SPEAKER PHONE", "TABLE", "TV", "VCR",
+ "VIDEO PHONE", "VEHICLE". Resources can be specified in any
+ registered language.
+
+6. Internationalization Considerations
+
+ Applications MUST generate iCalendar streams in the UTF-8 charset and
+ MUST accept an iCalendar stream in the UTF-8 or US-ASCII charset.
+
+7. Security Considerations
+
+ Because calendaring and scheduling information is very privacy-
+ sensitive, the protocol used for the transmission of calendaring and
+ scheduling information should have capabilities to protect the
+ information from possible threats, such as eavesdropping, replay,
+ message insertion, deletion, modification, and man-in-the-middle
+ attacks.
+
+ As this document only defines the data format and media type of text/
+ calendar that is independent of any calendar service or protocol, it
+ is up to the actual protocol specifications such as iTIP [2446bis],
+
+
+
+Desruisseaux Standards Track [Page 148]
+
+RFC 5545 iCalendar September 2009
+
+
+ iMIP [2447bis], and "Calendaring Extensions to WebDAV (CalDAV)"
+ [RFC4791] to describe the threats that the above attacks present, as
+ well as ways in which to mitigate them.
+
+8. IANA Considerations
+
+8.1. iCalendar Media Type Registration
+
+ The Calendaring and Scheduling Core Object Specification is intended
+ for use as a MIME content type.
+
+ To: ietf-types@iana.org
+
+ Subject: Registration of media type text/calendar
+
+ Type name: text
+
+ Subtype name: calendar
+
+ Required parameters: none
+
+ Optional parameters: charset, method, component, and optinfo
+
+ The "charset" parameter is defined in [RFC2046] for subtypes of
+ the "text" media type. It is used to indicate the charset used in
+ the body part. The charset supported by this revision of
+ iCalendar is UTF-8. The use of any other charset is deprecated by
+ this revision of iCalendar; however, note that this revision
+ requires that compliant applications MUST accept iCalendar streams
+ using either the UTF-8 or US-ASCII charset.
+
+ The "method" parameter is used to convey the iCalendar object
+ method or transaction semantics for the calendaring and scheduling
+ information. It also is an identifier for the restricted set of
+ properties and values of which the iCalendar object consists. The
+ parameter is to be used as a guide for applications interpreting
+ the information contained within the body part. It SHOULD NOT be
+ used to exclude or require particular pieces of information unless
+ the identified method definition specifically calls for this
+ behavior. Unless specifically forbidden by a particular method
+ definition, a text/calendar content type can contain any set of
+ properties permitted by the Calendaring and Scheduling Core Object
+ Specification. The "method" parameter MUST be specified and MUST
+ be set to the same value as the "METHOD" component property of the
+ iCalendar objects of the iCalendar stream if and only if the
+ iCalendar objects in the iCalendar stream all have a "METHOD"
+ component property set to the same value.
+
+
+
+
+Desruisseaux Standards Track [Page 149]
+
+RFC 5545 iCalendar September 2009
+
+
+ The value for the "method" parameter is defined as follows:
+
+ method = 1*(ALPHA / DIGIT / "-")
+ ; IANA-registered iCalendar object method
+
+ The "component" parameter conveys the type of iCalendar calendar
+ component within the body part. If the iCalendar object contains
+ more than one calendar component type, then multiple component
+ parameters MUST be specified.
+
+ The value for the "component" parameter is defined as follows:
+
+ component = "VEVENT"
+ / "VTODO"
+ / "VJOURNAL"
+ / "VFREEBUSY"
+ / "VTIMEZONE"
+ / iana-token
+ / x-name
+
+ The "optinfo" parameter conveys optional information about the
+ iCalendar object within the body part. This parameter can only
+ specify semantics already specified by the iCalendar object and
+ that can be otherwise determined by parsing the body part. In
+ addition, the optional information specified by this parameter
+ MUST be consistent with that information specified by the
+ iCalendar object. For example, it can be used to convey the
+ "Attendee" response status to a meeting request. The parameter
+ value consists of a string value.
+
+ The parameter can be specified multiple times.
+
+ The value for the "optinfo" parameter is defined as follows:
+
+ optinfo = infovalue / qinfovalue
+
+ infovalue = iana-token / x-name
+
+ qinfovalue = DQUOTE (infovalue) DQUOTE
+
+ Encoding considerations: This media type can contain 8bit
+ characters, so the use of quoted-printable or base64 MIME Content-
+ Transfer-Encodings might be necessary when iCalendar objects are
+ transferred across protocols restricted to the 7bit repertoire.
+ Note that a text valued property in the content entity can also
+ have content encoding of special characters using a BACKSLASH
+ character escapement technique. This means that content values
+ can end up being encoded twice.
+
+
+
+Desruisseaux Standards Track [Page 150]
+
+RFC 5545 iCalendar September 2009
+
+
+ Security considerations: See Section 7.
+
+ Interoperability considerations: This media type is intended to
+ define a common format for conveying calendaring and scheduling
+ information between different systems. It is heavily based on the
+ earlier [VCAL] industry specification.
+
+ Published specification: This specification.
+
+ Applications that use this media type: This media type is designed
+ for widespread use by Internet calendaring and scheduling
+ applications. In addition, applications in the workflow and
+ document management area might find this content-type applicable.
+ The iTIP [2446bis], iMIP [2447bis], and CalDAV [RFC4791] Internet
+ protocols directly use this media type also.
+
+ Additional information:
+
+ Magic number(s): None.
+
+ File extension(s): The file extension of "ics" is to be used to
+ designate a file containing (an arbitrary set of) calendaring
+ and scheduling information consistent with this MIME content
+ type.
+
+ The file extension of "ifb" is to be used to designate a file
+ containing free or busy time information consistent with this
+ MIME content type.
+
+ Macintosh file type code(s): The file type code of "iCal" is to
+ be used in Apple MacIntosh operating system environments to
+ designate a file containing calendaring and scheduling
+ information consistent with this MIME media type.
+
+ The file type code of "iFBf" is to be used in Apple MacIntosh
+ operating system environments to designate a file containing
+ free or busy time information consistent with this MIME media
+ type.
+
+ Person & email address to contact for further information: See the
+ "Author's Address" section of this document.
+
+ Intended usage: COMMON
+
+ Restrictions on usage: There are no restrictions on where this media
+ type can be used.
+
+ Author: See the "Author's Address" section of this document.
+
+
+
+Desruisseaux Standards Track [Page 151]
+
+RFC 5545 iCalendar September 2009
+
+
+ Change controller: IETF
+
+8.2. New iCalendar Elements Registration
+
+ This section defines the process to register new or modified
+ iCalendar elements, that is, components, properties, parameters,
+ value data types, and values, with IANA.
+
+8.2.1. iCalendar Elements Registration Procedure
+
+ The IETF will create a mailing list, icalendar@ietf.org, which can be
+ used for public discussion of iCalendar elements proposals prior to
+ registration. Use of the mailing list is strongly encouraged. The
+ IESG will appoint a designated expert who will monitor the
+ icalendar@ietf.org mailing list and review registrations.
+
+ Registration of new iCalendar elements MUST be reviewed by the
+ designated expert and published in an RFC. A Standards Track RFC is
+ REQUIRED for the registration of new value data types that modify
+ existing properties, as well as for the registration of participation
+ status values to be used in "VEVENT" calendar components. A
+ Standards Track RFC is also REQUIRED for registration of iCalendar
+ elements that modify iCalendar elements previously documented in a
+ Standards Track RFC.
+
+ The registration procedure begins when a completed registration
+ template, defined in the sections below, is sent to
+ icalendar@ietf.org and iana@iana.org. The designated expert is
+ expected to tell IANA and the submitter of the registration within
+ two weeks whether the registration is approved, approved with minor
+ changes, or rejected with cause. When a registration is rejected
+ with cause, it can be re-submitted if the concerns listed in the
+ cause are addressed. Decisions made by the designated expert can be
+ appealed to the IESG Applications Area Director, then to the IESG.
+ They follow the normal appeals procedure for IESG decisions.
+
+8.2.2. Registration Template for Components
+
+ A component is defined by completing the following template.
+
+ Component name: The name of the component.
+
+ Purpose: The purpose of the component. Give a short but clear
+ description.
+
+ Format definition: The ABNF for the component definition needs to be
+ specified.
+
+
+
+
+Desruisseaux Standards Track [Page 152]
+
+RFC 5545 iCalendar September 2009
+
+
+ Description: Any special notes about the component, how it is to be
+ used, etc.
+
+ Example(s): One or more examples of instances of the component need
+ to be specified.
+
+8.2.3. Registration Template for Properties
+
+ A property is defined by completing the following template.
+
+ Property name: The name of the property.
+
+ Purpose: The purpose of the property. Give a short but clear
+ description.
+
+ Value type: Any of the valid value types for the property value need
+ to be specified. The default value type also needs to be
+ specified.
+
+ Property parameters: Any of the valid property parameters for the
+ property MUST be specified.
+
+ Conformance: The calendar components in which the property can
+ appear MUST be specified.
+
+ Description: Any special notes about the property, how it is to be
+ used, etc.
+
+ Format definition: The ABNF for the property definition needs to be
+ specified.
+
+ Example(s): One or more examples of instances of the property need
+ to be specified.
+
+8.2.4. Registration Template for Parameters
+
+ A parameter is defined by completing the following template.
+
+ Parameter name: The name of the parameter.
+
+ Purpose: The purpose of the parameter. Give a short but clear
+ description.
+
+ Format definition: The ABNF for the parameter definition needs to be
+ specified.
+
+ Description: Any special notes about the parameter, how it is to be
+ used, etc.
+
+
+
+Desruisseaux Standards Track [Page 153]
+
+RFC 5545 iCalendar September 2009
+
+
+ Example(s): One or more examples of instances of the parameter need
+ to be specified.
+
+8.2.5. Registration Template for Value Data Types
+
+ A value data type is defined by completing the following template.
+
+ Value name: The name of the value type.
+
+ Purpose: The purpose of the value type. Give a short but clear
+ description.
+
+ Format definition: The ABNF for the value type definition needs to
+ be specified.
+
+ Description: Any special notes about the value type, how it is to be
+ used, etc.
+
+ Example(s): One or more examples of instances of the value type need
+ to be specified.
+
+8.2.6. Registration Template for Values
+
+ A value is defined by completing the following template.
+
+ Value: The value literal.
+
+ Purpose: The purpose of the value. Give a short but clear
+ description.
+
+ Conformance: The calendar properties and/or parameters that can take
+ this value need to be specified.
+
+ Example(s): One or more examples of instances of the value need to
+ be specified.
+
+ The following is a fictitious example of a registration of an
+ iCalendar value:
+
+ Value: TOP-SECRET
+
+ Purpose: This value is used to specify the access classification of
+ top-secret calendar components.
+
+ Conformance: This value can be used with the "CLASS" property.
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 154]
+
+RFC 5545 iCalendar September 2009
+
+
+ Example(s): The following is an example of this value used with the
+ "CLASS" property:
+
+ CLASS:TOP-SECRET
+
+8.3. Initial iCalendar Elements Registries
+
+ The IANA created and maintains the following registries for iCalendar
+ elements with pointers to appropriate reference documents.
+
+8.3.1. Components Registry
+
+ The following table has been used to initialize the components
+ registry.
+
+ +-----------+---------+-------------------------+
+ | Component | Status | Reference |
+ +-----------+---------+-------------------------+
+ | VCALENDAR | Current | RFC 5545, Section 3.4 |
+ | | | |
+ | VEVENT | Current | RFC 5545, Section 3.6.1 |
+ | | | |
+ | VTODO | Current | RFC 5545, Section 3.6.2 |
+ | | | |
+ | VJOURNAL | Current | RFC 5545, Section 3.6.3 |
+ | | | |
+ | VFREEBUSY | Current | RFC 5545, Section 3.6.4 |
+ | | | |
+ | VTIMEZONE | Current | RFC 5545, Section 3.6.5 |
+ | | | |
+ | VALARM | Current | RFC 5545, Section 3.6.6 |
+ | | | |
+ | STANDARD | Current | RFC 5545, Section 3.6.5 |
+ | | | |
+ | DAYLIGHT | Current | RFC 5545, Section 3.6.5 |
+ +-----------+---------+-------------------------+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 155]
+
+RFC 5545 iCalendar September 2009
+
+
+8.3.2. Properties Registry
+
+ The following table is has been used to initialize the properties
+ registry.
+
+ +------------------+------------+----------------------------+
+ | Property | Status | Reference |
+ +------------------+------------+----------------------------+
+ | CALSCALE | Current | RFC 5545, Section 3.7.1 |
+ | METHOD | Current | RFC 5545, Section 3.7.2 |
+ | | | |
+ | PRODID | Current | RFC 5545, Section 3.7.3 |
+ | | | |
+ | VERSION | Current | RFC 5545, Section 3.7.4 |
+ | | | |
+ | ATTACH | Current | RFC 5545, Section 3.8.1.1 |
+ | | | |
+ | CATEGORIES | Current | RFC 5545, Section 3.8.1.2 |
+ | | | |
+ | CLASS | Current | RFC 5545, Section 3.8.1.3 |
+ | | | |
+ | COMMENT | Current | RFC 5545, Section 3.8.1.4 |
+ | | | |
+ | DESCRIPTION | Current | RFC 5545, Section 3.8.1.5 |
+ | | | |
+ | GEO | Current | RFC 5545, Section 3.8.1.6 |
+ | | | |
+ | LOCATION | Current | RFC 5545, Section 3.8.1.7 |
+ | | | |
+ | PERCENT-COMPLETE | Current | RFC 5545, Section 3.8.1.8 |
+ | | | |
+ | PRIORITY | Current | RFC 5545, Section 3.8.1.9 |
+ | | | |
+ | RESOURCES | Current | RFC 5545, Section 3.8.1.10 |
+ | | | |
+ | STATUS | Current | RFC 5545, Section 3.8.1.11 |
+ | | | |
+ | SUMMARY | Current | RFC 5545, Section 3.8.1.12 |
+ | | | |
+ | COMPLETED | Current | RFC 5545, Section 3.8.2.1 |
+ | | | |
+ | DTEND | Current | RFC 5545, Section 3.8.2.2 |
+ | | | |
+ | DUE | Current | RFC 5545, Section 3.8.2.3 |
+ | | | |
+ | DTSTART | Current | RFC 5545, Section 3.8.2.4 |
+ | | | |
+ | DURATION | Current | RFC 5545, Section 3.8.2.5 |
+
+
+
+Desruisseaux Standards Track [Page 156]
+
+RFC 5545 iCalendar September 2009
+
+
+ | | | |
+ | FREEBUSY | Current | RFC 5545, Section 3.8.2.6 |
+ | | | |
+ | TRANSP | Current | RFC 5545, Section 3.8.2.7 |
+ | | | |
+ | TZID | Current | RFC 5545, Section 3.8.3.1 |
+ | | | |
+ | TZNAME | Current | RFC 5545, Section 3.8.3.2 |
+ | | | |
+ | TZOFFSETFROM | Current | RFC 5545, Section 3.8.3.3 |
+ | | | |
+ | TZOFFSETTO | Current | RFC 5545, Section 3.8.3.4 |
+ | | | |
+ | TZURL | Current | RFC 5545, Section 3.8.3.5 |
+ | | | |
+ | ATTENDEE | Current | RFC 5545, Section 3.8.4.1 |
+ | | | |
+ | CONTACT | Current | RFC 5545, Section 3.8.4.2 |
+ | | | |
+ | ORGANIZER | Current | RFC 5545, Section 3.8.4.3 |
+ | | | |
+ | RECURRENCE-ID | Current | RFC 5545, Section 3.8.4.4 |
+ | | | |
+ | RELATED-TO | Current | RFC 5545, Section 3.8.4.5 |
+ | | | |
+ | URL | Current | RFC 5545, Section 3.8.4.6 |
+ | | | |
+ | UID | Current | RFC 5545, Section 3.8.4.7 |
+ | | | |
+ | EXDATE | Current | RFC 5545, Section 3.8.5.1 |
+ | | | |
+ | EXRULE | Deprecated | [RFC2445], Section 4.8.5.2 |
+ | | | |
+ | RDATE | Current | RFC 5545, Section 3.8.5.2 |
+ | | | |
+ | RRULE | Current | RFC 5545, Section 3.8.5.3 |
+ | | | |
+ | ACTION | Current | RFC 5545, Section 3.8.6.1 |
+ | | | |
+ | REPEAT | Current | RFC 5545, Section 3.8.6.2 |
+ | | | |
+ | TRIGGER | Current | RFC 5545, Section 3.8.6.3 |
+ | | | |
+ | CREATED | Current | RFC 5545, Section 3.8.7.1 |
+ | | | |
+ | DTSTAMP | Current | RFC 5545, Section 3.8.7.2 |
+ | | | |
+ | LAST-MODIFIED | Current | RFC 5545, Section 3.8.7.3 |
+
+
+
+Desruisseaux Standards Track [Page 157]
+
+RFC 5545 iCalendar September 2009
+
+
+ | | | |
+ | SEQUENCE | Current | RFC 5545, Section 3.8.7.4 |
+ | | | |
+ | REQUEST-STATUS | Current | RFC 5545, Section 3.8.8.3 |
+ +------------------+------------+----------------------------+
+
+8.3.3. Parameters Registry
+
+ The following table has been used to initialize the parameters
+ registry.
+
+ +----------------+---------+--------------------------+
+ | Parameter | Status | Reference |
+ +----------------+---------+--------------------------+
+ | ALTREP | Current | RFC 5545, Section 3.2.1 |
+ | | | |
+ | CN | Current | RFC 5545, Section 3.2.2 |
+ | | | |
+ | CUTYPE | Current | RFC 5545, Section 3.2.3 |
+ | | | |
+ | DELEGATED-FROM | Current | RFC 5545, Section 3.2.4 |
+ | | | |
+ | DELEGATED-TO | Current | RFC 5545, Section 3.2.5 |
+ | | | |
+ | DIR | Current | RFC 5545, Section 3.2.6 |
+ | | | |
+ | ENCODING | Current | RFC 5545, Section 3.2.7 |
+ | | | |
+ | FMTTYPE | Current | RFC 5545, Section 3.2.8 |
+ | | | |
+ | FBTYPE | Current | RFC 5545, Section 3.2.9 |
+ | | | |
+ | LANGUAGE | Current | RFC 5545, Section 3.2.10 |
+ | | | |
+ | MEMBER | Current | RFC 5545, Section 3.2.11 |
+ | | | |
+ | PARTSTAT | Current | RFC 5545, Section 3.2.12 |
+ | | | |
+ | RANGE | Current | RFC 5545, Section 3.2.13 |
+ | | | |
+ | RELATED | Current | RFC 5545, Section 3.2.14 |
+ | | | |
+ | RELTYPE | Current | RFC 5545, Section 3.2.15 |
+ | | | |
+ | ROLE | Current | RFC 5545, Section 3.2.16 |
+ | | | |
+ | RSVP | Current | RFC 5545, Section 3.2.17 |
+ | | | |
+
+
+
+Desruisseaux Standards Track [Page 158]
+
+RFC 5545 iCalendar September 2009
+
+
+ | SENT-BY | Current | RFC 5545, Section 3.2.18 |
+ | | | |
+ | TZID | Current | RFC 5545, Section 3.2.19 |
+ | | | |
+ | VALUE | Current | RFC 5545, Section 3.2.20 |
+ +----------------+---------+--------------------------+
+
+8.3.4. Value Data Types Registry
+
+ The following table has been used to initialize the value data types
+ registry.
+
+ +-----------------+---------+--------------------------+
+ | Value Data Type | Status | Reference |
+ +-----------------+---------+--------------------------+
+ | BINARY | Current | RFC 5545, Section 3.3.1 |
+ | | | |
+ | BOOLEAN | Current | RFC 5545, Section 3.3.2 |
+ | | | |
+ | CAL-ADDRESS | Current | RFC 5545, Section 3.3.3 |
+ | | | |
+ | DATE | Current | RFC 5545, Section 3.3.4 |
+ | | | |
+ | DATE-TIME | Current | RFC 5545, Section 3.3.5 |
+ | | | |
+ | DURATION | Current | RFC 5545, Section 3.3.6 |
+ | | | |
+ | FLOAT | Current | RFC 5545, Section 3.3.7 |
+ | | | |
+ | INTEGER | Current | RFC 5545, Section 3.3.8 |
+ | | | |
+ | PERIOD | Current | RFC 5545, Section 3.3.9 |
+ | | | |
+ | RECUR | Current | RFC 5545, Section 3.3.10 |
+ | | | |
+ | TEXT | Current | RFC 5545, Section 3.3.11 |
+ | | | |
+ | TIME | Current | RFC 5545, Section 3.3.12 |
+ | | | |
+ | URI | Current | RFC 5545, Section 3.3.13 |
+ | | | |
+ | UTC-OFFSET | Current | RFC 5545, Section 3.3.14 |
+ +-----------------+---------+--------------------------+
+
+
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 159]
+
+RFC 5545 iCalendar September 2009
+
+
+8.3.5. Calendar User Types Registry
+
+ The following table has been used to initialize the calendar user
+ types registry.
+
+ +--------------------+---------+-------------------------+
+ | Calendar User Type | Status | Reference |
+ +--------------------+---------+-------------------------+
+ | INDIVIDUAL | Current | RFC 5545, Section 3.2.3 |
+ | | | |
+ | GROUP | Current | RFC 5545, Section 3.2.3 |
+ | | | |
+ | RESOURCE | Current | RFC 5545, Section 3.2.3 |
+ | | | |
+ | ROOM | Current | RFC 5545, Section 3.2.3 |
+ | | | |
+ | UNKNOWN | Current | RFC 5545, Section 3.2.3 |
+ +--------------------+---------+-------------------------+
+
+8.3.6. Free/Busy Time Types Registry
+
+ The following table has been used to initialize the free/busy time
+ types registry.
+
+ +---------------------+---------+-------------------------+
+ | Free/Busy Time Type | Status | Reference |
+ +---------------------+---------+-------------------------+
+ | FREE | Current | RFC 5545, Section 3.2.9 |
+ | | | |
+ | BUSY | Current | RFC 5545, Section 3.2.9 |
+ | | | |
+ | BUSY-UNAVAILABLE | Current | RFC 5545, Section 3.2.9 |
+ | | | |
+ | BUSY-TENTATIVE | Current | RFC 5545, Section 3.2.9 |
+ +---------------------+---------+-------------------------+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 160]
+
+RFC 5545 iCalendar September 2009
+
+
+8.3.7. Participation Statuses Registry
+
+ The following table has been used to initialize the participation
+ statuses registry.
+
+ +--------------------+---------+--------------------------+
+ | Participant Status | Status | Reference |
+ +--------------------+---------+--------------------------+
+ | NEEDS-ACTION | Current | RFC 5545, Section 3.2.12 |
+ | | | |
+ | ACCEPTED | Current | RFC 5545, Section 3.2.12 |
+ | | | |
+ | DECLINED | Current | RFC 5545, Section 3.2.12 |
+ | | | |
+ | TENTATIVE | Current | RFC 5545, Section 3.2.12 |
+ | | | |
+ | DELEGATED | Current | RFC 5545, Section 3.2.12 |
+ | | | |
+ | COMPLETED | Current | RFC 5545, Section 3.2.12 |
+ | | | |
+ | IN-PROCESS | Current | RFC 5545, Section 3.2.12 |
+ +--------------------+---------+--------------------------+
+
+8.3.8. Relationship Types Registry
+
+ The following table has been used to initialize the relationship
+ types registry.
+
+ +-------------------+---------+--------------------------+
+ | Relationship Type | Status | Reference |
+ +-------------------+---------+--------------------------+
+ | CHILD | Current | RFC 5545, Section 3.2.15 |
+ | | | |
+ | PARENT | Current | RFC 5545, Section 3.2.15 |
+ | | | |
+ | SIBLING | Current | RFC 5545, Section 3.2.15 |
+ +-------------------+---------+--------------------------+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 161]
+
+RFC 5545 iCalendar September 2009
+
+
+8.3.9. Participation Roles Registry
+
+ The following table has been used to initialize the participation
+ roles registry.
+
+ +-----------------+---------+--------------------------+
+ | Role Type | Status | Reference |
+ +-----------------+---------+--------------------------+
+ | CHAIR | Current | RFC 5545, Section 3.2.16 |
+ | | | |
+ | REQ-PARTICIPANT | Current | RFC 5545, Section 3.2.16 |
+ | | | |
+ | OPT-PARTICIPANT | Current | RFC 5545, Section 3.2.16 |
+ | | | |
+ | NON-PARTICIPANT | Current | RFC 5545, Section 3.2.16 |
+ +-----------------+---------+--------------------------+
+
+8.3.10. Actions Registry
+
+ The following table has been used to initialize the actions registry.
+
+ +-----------+------------+----------------------------+
+ | Action | Status | Reference |
+ +-----------+------------+----------------------------+
+ | AUDIO | Current | RFC 5545, Section 3.8.6.1 |
+ | | | |
+ | DISPLAY | Current | RFC 5545, Section 3.8.6.1 |
+ | | | |
+ | EMAIL | Current | RFC 5545, Section 3.8.6.1 |
+ | | | |
+ | PROCEDURE | Deprecated | [RFC2445], Section 4.8.6.1 |
+ +-----------+------------+----------------------------+
+
+8.3.11. Classifications Registry
+
+ The following table has been used to initialize the classifications
+ registry.
+
+ +----------------+---------+---------------------------+
+ | Classification | Status | Reference |
+ +----------------+---------+---------------------------+
+ | PUBLIC | Current | RFC 5545, Section 3.8.1.3 |
+ | | | |
+ | PRIVATE | Current | RFC 5545, Section 3.8.1.3 |
+ | | | |
+ | CONFIDENTIAL | Current | RFC 5545, Section 3.8.1.3 |
+ +----------------+---------+---------------------------+
+
+
+
+
+Desruisseaux Standards Track [Page 162]
+
+RFC 5545 iCalendar September 2009
+
+
+8.3.12. Methods Registry
+
+ No values are defined in this document for the "METHOD" property.
+
+9. Acknowledgments
+
+ The editor of this document wishes to thank Frank Dawson and Derik
+ Stenerson, the original authors of RFC 2445, as well as the following
+ individuals who have participated in the drafting, review, and
+ discussion of this memo:
+
+ Joe Abley, Hervey Allen, Steve Allen, Jay Batson, Oliver Block,
+ Stephane Bortzmeyer, Chris Bryant, Tantek Celik, Mark Crispin, Cyrus
+ Daboo, Mike Douglass, Andrew N. Dowden, Lisa Dusseault, Lars Eggert,
+ Gren Eliot, Pasi Eronen, Ben Fortuna, Ned Freed, Neal Gafter, Ted
+ Hardie, Tim Hare, Jeffrey Harris, Helge Hess, Paul B. Hill, Thomas
+ Hnetila, Russ Housley, Leif Johansson, Ciny Joy, Bruce Kahn, Reinhold
+ Kainhofer, Martin Kiff, Patrice Lapierre, Michiel van Leeuwen,
+ Jonathan Lennox, Jeff McCullough, Bill McQuillan, Alexey Melnikov,
+ John W. Noerenberg II, Chuck Norris, Mark Paterson, Simon Pilette,
+ Arnaud Quillaud, Robert Ransdell, Julian F. Reschke, Caleb
+ Richardson, Sam Roberts, Dan Romascanu, Mike Samuel, George Sexton,
+ Nigel Swinson, Clint Talbert, Simon Vaillancourt, Magnus Westerlund,
+ and Sandy Wills.
+
+ A special thanks to the working group chairs Aki Niemi and Eliot Lear
+ for their support and guidance.
+
+ The editor would also like to thank the Calendaring and Scheduling
+ Consortium for advice with this specification, and for organizing
+ interoperability testing events to help refine it.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 163]
+
+RFC 5545 iCalendar September 2009
+
+
+10. References
+
+10.1. Normative References
+
+ [ISO.8601.2004] International Organization for
+ Standardization, "Data elements and
+ interchange formats -- Information interchange
+ -- Representation of dates and times", 2004.
+
+ [ISO.9070.1991] International Organization for
+ Standardization, "Information Technology_SGML
+ Support Facilities -- Registration Procedures
+ for Public Text Owner Identifiers, Second
+ Edition", April 1991.
+
+ [RFC2045] Freed, N. and N. Borenstein, "Multipurpose
+ Internet Mail Extensions (MIME) Part One:
+ Format of Internet Message Bodies", RFC 2045,
+ November 1996.
+
+ [RFC2046] Freed, N. and N. Borenstein, "Multipurpose
+ Internet Mail Extensions (MIME) Part Two:
+ Media Types", RFC 2046, November 1996.
+
+ [RFC2119] Bradner, S., "Key words for use in RFCs to
+ Indicate Requirement Levels", BCP 14,
+ RFC 2119, March 1997.
+
+ [RFC2368] Hoffman, P., Masinter, L., and J. Zawinski,
+ "The mailto URL scheme", RFC 2368, July 1998.
+
+ [RFC3629] Yergeau, F., "UTF-8, a transformation format
+ of ISO 10646", STD 63, RFC 3629,
+ November 2003.
+
+ [RFC3986] Berners-Lee, T., Fielding, R., and L.
+ Masinter, "Uniform Resource Identifier (URI):
+ Generic Syntax", STD 66, RFC 3986,
+ January 2005.
+
+ [RFC4288] Freed, N. and J. Klensin, "Media Type
+ Specifications and Registration Procedures",
+ BCP 13, RFC 4288, December 2005.
+
+ [RFC4648] Josefsson, S., "The Base16, Base32, and Base64
+ Data Encodings", RFC 4648, October 2006.
+
+
+
+
+
+Desruisseaux Standards Track [Page 164]
+
+RFC 5545 iCalendar September 2009
+
+
+ [RFC5234] Crocker, D. and P. Overell, "Augmented BNF for
+ Syntax Specifications: ABNF", STD 68,
+ RFC 5234, January 2008.
+
+ [RFC5646] Phillips, A., Ed., and M. Davis, Ed., "Tags
+ for Identifying Languages", BCP 47, RFC 5646,
+ September 2009.
+
+ [US-ASCII] American National Standards Institute, "Coded
+ Character Set - 7-bit American Standard Code
+ for Information Interchange", ANSI X3.4, 1986.
+
+10.2. Informative References
+
+ [2446bis] Daboo, C., "iCalendar Transport-Independent
+ Interoperability Protocol (iTIP)", Work
+ in Progress, April 2009.
+
+ [2447bis] Melnikov, A., "iCalendar Message-Based
+ Interoperability Protocol (iMIP)", Work
+ in Progress, June 2008.
+
+ [ANSI INCITS 61-1986] International Committee for Information
+ Technology, "Representation of Geographic
+ Point Locations for Information Interchange
+ (formerly ANSI X3.61-1986 (R1997))", ANSI
+ INCITS 61-1986 (R2007), 2007.
+
+ [RFC1738] Berners-Lee, T., Masinter, L., and M.
+ McCahill, "Uniform Resource Locators (URL)",
+ RFC 1738, December 1994.
+
+ [RFC2392] Levinson, E., "Content-ID and Message-ID
+ Uniform Resource Locators", RFC 2392,
+ August 1998.
+
+ [RFC2397] Masinter, L., "The "data" URL scheme",
+ RFC 2397, August 1998.
+
+ [RFC2425] Howes, T., Smith, M., and F. Dawson, "A MIME
+ Content-Type for Directory Information",
+ RFC 2425, September 1998.
+
+ [RFC2426] Dawson, F. and T. Howes, "vCard MIME Directory
+ Profile", RFC 2426, September 1998.
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 165]
+
+RFC 5545 iCalendar September 2009
+
+
+ [RFC2445] Dawson, F. and Stenerson, D., "Internet
+ Calendaring and Scheduling Core Object
+ Specification (iCalendar)", RFC 2445,
+ November 1998.
+
+ [RFC2616] Fielding, R., Gettys, J., Mogul, J., Frystyk,
+ H., Masinter, L., Leach, P., and T. Berners-
+ Lee, "Hypertext Transfer Protocol --
+ HTTP/1.1", RFC 2616, June 1999.
+
+ [RFC2818] Rescorla, E., "HTTP Over TLS", RFC 2818,
+ May 2000.
+
+ [RFC4516] Smith, M. and T. Howes, "Lightweight Directory
+ Access Protocol (LDAP): Uniform Resource
+ Locator", RFC 4516, June 2006.
+
+ [RFC4791] Daboo, C., Desruisseaux, B., and L. Dusseault,
+ "Calendaring Extensions to WebDAV (CalDAV)",
+ RFC 4791, March 2007.
+
+ [TZDB] Eggert, P. and A.D. Olson, "Sources for Time
+ Zone and Daylight Saving Time Data",
+ July 2009,
+ <http://www.twinsun.com/tz/tz-link.htm>.
+
+ [VCAL] Internet Mail Consortium, "vCalendar: The
+ Electronic Calendaring and Scheduling Exchange
+ Format", September 1996,
+ <http://www.imc.org/pdi/vcal-10.txt>.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 166]
+
+RFC 5545 iCalendar September 2009
+
+
+Appendix A. Differences from RFC 2445
+
+ This appendix contains a list of changes that have been made in the
+ Internet Calendaring and Scheduling Core Object Specification from
+ RFC 2445.
+
+A.1. New Restrictions
+
+ 1. The "DTSTART" property SHOULD be synchronized with the recurrence
+ rule, if specified.
+
+ 2. The "RRULE" property SHOULD NOT occur more than once in a
+ component.
+
+ 3. The BYHOUR, BYMINUTE, and BYSECOND rule parts MUST NOT be
+ specified in the "RRULE" property when the "DTSTART" property is
+ specified as a DATE value.
+
+ 4. The value type of the "DTEND" or "DUE" properties MUST match the
+ value type of "DTSTART" property.
+
+ 5. The "DURATION" property can no longer appear in "VFREEBUSY"
+ components.
+
+A.2. Restrictions Removed
+
+ 1. The "DTSTART" and "DTEND" properties are no longer required to be
+ specified as date with local time and time zone reference when
+ used with a recurrence rule.
+
+A.3. Deprecated Features
+
+ 1. The "EXRULE" property can no longer be specified in a component.
+
+ 2. The "THISANDPRIOR" value can no longer be used with the "RANGE"
+ parameter.
+
+ 3. The "PROCEDURE" value can no longer be used with the "ACTION"
+ property.
+
+ 4. The value type RECUR no longer allows multiple values to be
+ specified by a COMMA-separated list of values.
+
+ 5. x-name rule parts can no longer be specified in properties of
+ RECUR value type (e.g., "RRULE"). x-param can be used on RECUR
+ value type properties instead.
+
+
+
+
+
+Desruisseaux Standards Track [Page 167]
+
+RFC 5545 iCalendar September 2009
+
+
+Author's Address
+
+ Bernard Desruisseaux (editor)
+ Oracle Corporation
+ 600 blvd. de Maisonneuve West
+ Suite 1900
+ Montreal, QC H3A 3J2
+ CANADA
+
+ EMail: bernard.desruisseaux@oracle.com
+ URI: http://www.oracle.com/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 168]
+
diff --git a/vendor/sabre/dav/docs/rfc5546.txt b/vendor/sabre/dav/docs/rfc5546.txt
new file mode 100644
index 000000000..80361d81a
--- /dev/null
+++ b/vendor/sabre/dav/docs/rfc5546.txt
@@ -0,0 +1,7451 @@
+
+
+
+
+
+
+Network Working Group C. Daboo, Ed.
+Request for Comments: 5546 Apple Inc.
+Obsoletes: 2446 December 2009
+Updates: 5545
+Category: Standards Track
+
+
+ iCalendar Transport-Independent Interoperability Protocol (iTIP)
+
+Abstract
+
+ This document specifies a protocol that uses the iCalendar object
+ specification to provide scheduling interoperability between
+ different calendaring systems. This is done without reference to a
+ specific transport protocol so as to allow multiple methods of
+ communication between systems. Subsequent documents will define
+ profiles of this protocol that use specific, interoperable methods of
+ communication between systems.
+
+ The iCalendar Transport-Independent Interoperability Protocol (iTIP)
+ complements the iCalendar object specification by adding semantics
+ for group scheduling methods commonly available in current
+ calendaring systems. These scheduling methods permit two or more
+ calendaring systems to perform transactions such as publishing,
+ scheduling, rescheduling, responding to scheduling requests,
+ negotiating changes, or canceling.
+
+Status of This Memo
+
+ This document specifies an Internet standards track protocol for the
+ Internet community, and requests discussion and suggestions for
+ improvements. Please refer to the current edition of the "Internet
+ Official Protocol Standards" (STD 1) for the standardization state
+ and status of this protocol. Distribution of this memo is unlimited.
+
+Copyright Notice
+
+ Copyright (c) 2009 IETF Trust and the persons identified as the
+ document authors. All rights reserved.
+
+ This document is subject to BCP 78 and the IETF Trust's Legal
+ Provisions Relating to IETF Documents
+ (http://trustee.ietf.org/license-info) in effect on the date of
+ publication of this document. Please review these documents
+ carefully, as they describe your rights and restrictions with respect
+ to this document. Code Components extracted from this document must
+
+
+
+
+
+Daboo Standards Track [Page 1]
+
+RFC 5546 iTIP December 2009
+
+
+ include Simplified BSD License text as described in Section 4.e of
+ the Trust Legal Provisions and are provided without warranty as
+ described in the BSD License.
+
+ This document may contain material from IETF Documents or IETF
+ Contributions published or made publicly available before November
+ 10, 2008. The person(s) controlling the copyright in some of this
+ material may not have granted the IETF Trust the right to allow
+ modifications of such material outside the IETF Standards Process.
+ Without obtaining an adequate license from the person(s) controlling
+ the copyright in such materials, this document may not be modified
+ outside the IETF Standards Process, and derivative works of it may
+ not be created outside the IETF Standards Process, except to format
+ it for publication as an RFC or to translate it into languages other
+ than English.
+
+Table of Contents
+
+ 1. Introduction and Overview .......................................5
+ 1.1. Formatting Conventions .....................................5
+ 1.2. Related Documents ..........................................6
+ 1.3. Roles ......................................................6
+ 1.4. Methods ....................................................7
+ 2. Interoperability Models .........................................9
+ 2.1. Application Protocol ......................................10
+ 2.1.1. Scheduling State ...................................10
+ 2.1.2. Delegation .........................................10
+ 2.1.3. Acting on Behalf of Other Calendar Users ...........11
+ 2.1.4. Component Revisions ................................11
+ 2.1.5. Message Sequencing .................................12
+ 3. Application Protocol Elements ..................................13
+ 3.1. Common Component Restriction Tables .......................15
+ 3.1.1. VCALENDAR ..........................................15
+ 3.1.2. VTIMEZONE ..........................................15
+ 3.1.3. VALARM .............................................17
+ 3.2. Methods for VEVENT Calendar Components ....................17
+ 3.2.1. PUBLISH ............................................18
+ 3.2.2. REQUEST ............................................20
+ 3.2.3. REPLY ..............................................25
+ 3.2.4. ADD ................................................27
+ 3.2.5. CANCEL .............................................29
+ 3.2.6. REFRESH ............................................31
+ 3.2.7. COUNTER ............................................33
+ 3.2.8. DECLINECOUNTER .....................................35
+ 3.3. Methods for VFREEBUSY Components ..........................37
+ 3.3.1. PUBLISH ............................................37
+ 3.3.2. REQUEST ............................................40
+ 3.3.3. REPLY ..............................................42
+
+
+
+Daboo Standards Track [Page 2]
+
+RFC 5546 iTIP December 2009
+
+
+ 3.4. Methods for VTODO Components ..............................44
+ 3.4.1. PUBLISH ............................................44
+ 3.4.2. REQUEST ............................................46
+ 3.4.3. REPLY ..............................................51
+ 3.4.4. ADD ................................................53
+ 3.4.5. CANCEL .............................................55
+ 3.4.6. REFRESH ............................................57
+ 3.4.7. COUNTER ............................................59
+ 3.4.8. DECLINECOUNTER .....................................61
+ 3.5. Methods for VJOURNAL Components ...........................62
+ 3.5.1. PUBLISH ............................................63
+ 3.5.2. ADD ................................................64
+ 3.5.3. CANCEL .............................................66
+ 3.6. Status Replies ............................................68
+ 3.7. Implementation Considerations .............................77
+ 3.7.1. Working With Recurrence Instances ..................77
+ 3.7.2. Attendee Property Considerations ...................78
+ 3.7.3. Extension Tokens ...................................79
+ 4. Examples .......................................................79
+ 4.1. Published Event Examples ..................................79
+ 4.1.1. A Minimal Published Event ..........................80
+ 4.1.2. Changing a Published Event .........................80
+ 4.1.3. Canceling a Published Event ........................81
+ 4.1.4. A Rich Published Event .............................81
+ 4.1.5. Anniversaries or Events Attached to Entire Days ....83
+ 4.2. Group Event Examples ......................................83
+ 4.2.1. A Group Event Request ..............................84
+ 4.2.2. Reply to a Group Event Request .....................85
+ 4.2.3. Update an Event ....................................85
+ 4.2.4. Countering an Event Proposal .......................86
+ 4.2.5. Delegating an Event ................................88
+ 4.2.6. Delegate Accepts the Meeting .......................90
+ 4.2.7. Delegate Declines the Meeting ......................91
+ 4.2.8. Forwarding an Event Request ........................92
+ 4.2.9. Cancel a Group Event ...............................92
+ 4.2.10. Removing Attendees ................................93
+ 4.2.11. Replacing the Organizer ...........................95
+ 4.3. Busy Time Examples ........................................96
+ 4.3.1. Publish Busy Time ..................................96
+ 4.3.2. Request Busy Time ..................................96
+ 4.3.3. Reply to a Busy Time Request .......................97
+ 4.4. Recurring Event and Time Zone Examples ....................98
+ 4.4.1. A Recurring Event Spanning Time Zones ..............98
+ 4.4.2. Modify a Recurring Instance ........................99
+ 4.4.3. Cancel an Instance ................................101
+ 4.4.4. Cancel a Recurring Event ..........................101
+ 4.4.5. Change All Future Instances .......................102
+ 4.4.6. Add a New Instance to a Recurring Event ...........102
+
+
+
+Daboo Standards Track [Page 3]
+
+RFC 5546 iTIP December 2009
+
+
+ 4.4.7. Add a New Series of Instances to a
+ Recurring Event ...................................103
+ 4.4.8. Refreshing a Recurring Event ......................104
+ 4.4.9. Counter an Instance of a Recurring Event ..........106
+ 4.4.10. Error Reply to a Request .........................107
+ 4.5. Group To-Do Examples .....................................108
+ 4.5.1. A VTODO Request ...................................109
+ 4.5.2. A VTODO Reply .....................................110
+ 4.5.3. A VTODO Request for Updated Status ................110
+ 4.5.4. A Reply: Percent-Complete .........................111
+ 4.5.5. A Reply: Completed ................................111
+ 4.5.6. An Updated VTODO Request ..........................112
+ 4.5.7. Recurring VTODOs ..................................112
+ 4.6. Journal Examples .........................................113
+ 4.7. Other Examples ...........................................114
+ 4.7.1. Event Refresh .....................................114
+ 4.7.2. Bad RECURRENCE-ID .................................114
+ 5. Application Protocol Fallbacks ................................116
+ 5.1. Partial Implementation ...................................116
+ 5.1.1. Event-Related Fallbacks ...........................117
+ 5.1.2. Free/Busy-Related Fallbacks .......................119
+ 5.1.3. To-Do-Related Fallbacks ...........................120
+ 5.1.4. Journal-Related Fallbacks .........................122
+ 5.2. Latency Issues ...........................................123
+ 5.2.1. Cancellation of an Unknown Calendar Component .....123
+ 5.2.2. Unexpected Reply from an Unknown Delegate .........124
+ 5.3. Sequence Number ..........................................124
+ 6. Security Considerations .......................................124
+ 6.1. Security Threats .........................................124
+ 6.1.1. Spoofing the Organizer ............................124
+ 6.1.2. Spoofing the Attendee .............................124
+ 6.1.3. Unauthorized Replacement of the Organizer .........125
+ 6.1.4. Eavesdropping and Data Integrity ..................125
+ 6.1.5. Flooding a Calendar ...............................125
+ 6.1.6. Unauthorized REFRESH Requests .....................125
+ 6.2. Recommendations ..........................................125
+ 6.2.1. Securing iTIP transactions ........................125
+ 6.2.2. Implementation Controls ...........................126
+ 6.2.3. Access Controls and Filtering .....................126
+ 6.3. Privacy Issues ...........................................126
+ 7. IANA Considerations ...........................................127
+ 7.1. Registration Template for REQUEST-STATUS Values ..........127
+ 7.2. Additions to iCalendar METHOD Registry ...................127
+ 7.3. REQUEST-STATUS Value Registry ............................129
+ 8. Acknowledgments ...............................................130
+ 9. References ....................................................131
+ 9.1. Normative References .....................................131
+ 9.2. Informative References ...................................131
+
+
+
+Daboo Standards Track [Page 4]
+
+RFC 5546 iTIP December 2009
+
+
+ Appendix A. Differences from RFC 2446 ...........................132
+ A.1. Changed Restrictions .....................................132
+ A.2. Deprecated Features ......................................133
+
+1. Introduction and Overview
+
+ This document specifies how calendaring systems use iCalendar
+ [RFC5545] objects to interoperate with other calendaring systems. In
+ particular, it specifies how to schedule events, to-dos, or daily
+ journal entries. It further specifies how to search for available
+ busy time information. It does so in a general way, without
+ specifying how communication between different systems actually takes
+ place. Subsequent documents will specify transport bindings between
+ systems that use this protocol.
+
+ This protocol is based on messages sent from an originator to one or
+ more recipients. For certain types of messages, a recipient may
+ reply in order to update their status and may also return
+ transaction/request status information. The protocol supports the
+ ability for the message originator to modify or cancel the original
+ message. The protocol also supports the ability for recipients to
+ suggest changes to the originator of a message. The elements of the
+ protocol also define the user roles for its transactions.
+
+ This specification obsoletes RFC 2446 - a list of important changes
+ is provided in Appendix A.
+
+1.1. Formatting Conventions
+
+ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
+ "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
+ document are to be interpreted as described in [RFC2119].
+
+ Calendaring and scheduling roles are referred to in quoted-strings of
+ text with the first character of each word in upper case. For
+ example, "Organizer" refers to a role of a "Calendar User" (CU)
+ within the scheduling protocol.
+
+ Calendar components defined by [RFC5545] are referred to with
+ capitalized, quoted-strings of text. All calendar components start
+ with the letter "V". For example, "VEVENT" refers to the event
+ calendar component, "VTODO" refers to the to-do calendar component,
+ and "VJOURNAL" refers to the daily journal calendar component.
+
+
+
+
+
+
+
+
+Daboo Standards Track [Page 5]
+
+RFC 5546 iTIP December 2009
+
+
+ Scheduling methods are referred to with capitalized, quoted-strings
+ of text. For example, "REQUEST" refers to the method for requesting
+ a scheduling calendar component be created or modified; "REPLY"
+ refers to the method a recipient of a request uses to update their
+ status with the "Organizer" of the calendar component.
+
+ Properties defined by [RFC5545] are referred to with capitalized,
+ quoted-strings of text, followed by the word "property". For
+ example, "ATTENDEE" property refers to the iCalendar property used to
+ convey the calendar address of a "Calendar User".
+
+ Property parameters defined by this specification are referred to
+ with capitalized, quoted-strings of text, followed by the word
+ "parameter". For example, "VALUE" parameter refers to the iCalendar
+ property parameter used to override the default data type for a
+ property value.
+
+ Enumerated values defined by this specification are referred to with
+ capitalized text, either alone or followed by the word "value".
+
+ In tables, the quoted-string text is specified without quotes in
+ order to minimize the table length.
+
+1.2. Related Documents
+
+ Implementers will need to be familiar with several other
+ specifications that, along with this one, describe the Internet
+ calendaring and scheduling standards. The related documents are:
+
+ [RFC5545] - specifies the objects, data types, properties, and
+ property parameters used in the protocols, along with the methods
+ for representing and encoding them.
+
+ [iMIP] - specifies an Internet email binding for iTIP.
+
+ This specification does not attempt to repeat the concepts or
+ definitions from these other specifications. Where possible,
+ explicit references are made to the other specifications.
+
+1.3. Roles
+
+ Exchanges of iCalendar objects for the purposes of group calendaring
+ and scheduling occur between "Calendar Users" (CUs). CUs take on
+ several roles in iTIP:
+
+
+
+
+
+
+
+Daboo Standards Track [Page 6]
+
+RFC 5546 iTIP December 2009
+
+
+ +-----------+-------------------------------------------------------+
+ | Role | Description |
+ +-----------+-------------------------------------------------------+
+ | Organizer | The CU who initiates an exchange takes on the role of |
+ | | Organizer. For example, the CU who proposes a group |
+ | | meeting is the Organizer. |
+ | | |
+ | Attendee | CUs who are included in the scheduling message as |
+ | | possible recipients of that scheduling message. For |
+ | | example, the CUs asked to participate in a group |
+ | | meeting by the Organizer take on the role of |
+ | | Attendee. |
+ | | |
+ | Other CU | A CU that is not explicitly included in a scheduling |
+ | | message, i.e., not the Organizer or an Attendee. |
+ +-----------+-------------------------------------------------------+
+
+ Note that "ROLE" is also a descriptive parameter to the iCalendar
+ "ATTENDEE" property. Its use is to convey descriptive context about
+ an "Attendee" -- such as "chair", "required participant", or "non-
+ required participant" -- and has nothing to do with the calendaring
+ workflow.
+
+1.4. Methods
+
+ The iTIP methods are listed below and their usage and semantics are
+ defined in Section 3 of this document.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo Standards Track [Page 7]
+
+RFC 5546 iTIP December 2009
+
+
+ +----------------+--------------------------------------------------+
+ | Method | Description |
+ +----------------+--------------------------------------------------+
+ | PUBLISH | Used to publish an iCalendar object to one or |
+ | | more "Calendar Users". There is no |
+ | | interactivity between the publisher and any |
+ | | other "Calendar User". An example might include |
+ | | a baseball team publishing its schedule to the |
+ | | public. |
+ | | |
+ | REQUEST | Used to schedule an iCalendar object with other |
+ | | "Calendar Users". Requests are interactive in |
+ | | that they require the receiver to respond using |
+ | | the reply methods. Meeting requests, busy-time |
+ | | requests, and the assignment of tasks to other |
+ | | "Calendar Users" are all examples. Requests are |
+ | | also used by the Organizer to update the status |
+ | | of an iCalendar object. |
+ | | |
+ | REPLY | A reply is used in response to a request to |
+ | | convey Attendee status to the Organizer. |
+ | | Replies are commonly used to respond to meeting |
+ | | and task requests. |
+ | | |
+ | ADD | Add one or more new instances to an existing |
+ | | recurring iCalendar object. |
+ | | |
+ | CANCEL | Cancel one or more instances of an existing |
+ | | iCalendar object. |
+ | | |
+ | REFRESH | Used by an Attendee to request the latest |
+ | | version of an iCalendar object. |
+ | | |
+ | COUNTER | Used by an Attendee to negotiate a change in an |
+ | | iCalendar object. Examples include the request |
+ | | to change a proposed event time or change the |
+ | | due date for a task. |
+ | | |
+ | DECLINECOUNTER | Used by the Organizer to decline the proposed |
+ | | counter proposal. |
+ +----------------+--------------------------------------------------+
+
+
+
+
+
+
+
+
+
+
+Daboo Standards Track [Page 8]
+
+RFC 5546 iTIP December 2009
+
+
+ Group scheduling in iTIP is accomplished using the set of "request"
+ and "response" methods described above. The following table shows
+ the methods broken down by who can send them.
+
+ +------------+------------------------------------------------------+
+ | Originator | Methods |
+ +------------+------------------------------------------------------+
+ | Organizer | PUBLISH, REQUEST, ADD, CANCEL, DECLINECOUNTER |
+ | | |
+ | Attendee | REPLY, REFRESH, COUNTER, REQUEST (only when |
+ | | delegating) |
+ +------------+------------------------------------------------------+
+
+ Note that for some calendar component types, the allowable methods
+ are a subset of the above set. In addition, apart from "VTIMEZONE"
+ iCalendar components, only one component type is allowed in a single
+ iTIP message.
+
+2. Interoperability Models
+
+ There are two distinct protocols relevant to interoperability: an
+ "application protocol" and a "transport protocol". The application
+ protocol defines the content of the iCalendar objects sent between
+ sender and receiver to accomplish the scheduling transactions listed
+ above. The transport protocol defines how the iCalendar objects are
+ sent between the sender and receiver. This document focuses on the
+ application protocol. Binding documents such as [iMIP] focus on the
+ transport protocol.
+
+ The connection between sender and receiver in the diagram below
+ refers to the application protocol. The iCalendar objects passed
+ from the sender to the receiver are presented in Section 3,
+ "Application Protocol Elements".
+
+ +----------+ +----------+
+ | | iTIP | |
+ | Sender |<-------------->| Receiver |
+ | | | |
+ +----------+ +----------+
+
+ There are several variations of this diagram in which the sender and
+ receiver take on various roles of a "Calendar User Agent" (CUA) or a
+ "Calendar Service" (CS).
+
+ The architecture of iTIP is depicted in the diagram below. An
+ application written to this specification may work with bindings for
+ the store-and-forward transport, the real-time transport, or both.
+ Also note that iTIP could be bound to other transports.
+
+
+
+Daboo Standards Track [Page 9]
+
+RFC 5546 iTIP December 2009
+
+
+ +--------------------------------------------------------+
+ | iTIP Protocol |
+ +--------------------------------------------------------+
+ | Transport |
+ + - - - - - + - - - - - - + - - - - - +
+ | Real-Time | Store-and-Forward | Others |
+ +-----------------+--------------------+-----------------+
+
+2.1. Application Protocol
+
+ In the iTIP model, an iCalendar object is created and managed by an
+ "Organizer". The "Organizer" interacts with other CUs by sending one
+ or more of the iTIP messages listed above. "Attendees" use the
+ "REPLY" method to communicate their status. "Attendees" do not make
+ direct changes to the master iCalendar object. They can, however,
+ use the "COUNTER" method to suggest changes to the "Organizer". In
+ any case, the "Organizer" has complete control over the master
+ iCalendar object.
+
+2.1.1. Scheduling State
+
+ There are two distinct states relevant to iCalendar objects used in
+ scheduling: the overall state of the iCalendar object and the state
+ associated with an "Attendee" in that iCalendar object.
+
+ The state of an iCalendar object is defined by the "STATUS" property
+ and is controlled by the "Organizer." There is no default value for
+ the "STATUS" property. The "Organizer" sets the "STATUS" property to
+ the appropriate value for each iCalendar object.
+
+ The state of a particular "Attendee" relative to an iCalendar object
+ used for scheduling is defined by the "PARTSTAT" parameter in the
+ "ATTENDEE" property for each "Attendee". When an "Organizer" issues
+ the initial iCalendar object, "Attendee" status is typically unknown.
+ The "Organizer" specifies this by setting the "PARTSTAT" parameter to
+ "NEEDS-ACTION". Each "Attendee" modifies their "ATTENDEE" property
+ "PARTSTAT" parameter to an appropriate value as part of a "REPLY"
+ message sent back to the "Organizer".
+
+2.1.2. Delegation
+
+ Delegation is defined as the process by which an "Attendee" grants
+ another CU (or several CUs) the right to attend on their behalf. The
+ "Organizer" is made aware of this change because the delegating
+ "Attendee" informs the "Organizer". These steps are detailed in the
+ "REQUEST" method sections for the appropriate components.
+
+
+
+
+
+Daboo Standards Track [Page 10]
+
+RFC 5546 iTIP December 2009
+
+
+2.1.3. Acting on Behalf of Other Calendar Users
+
+ In many organizations, one user will act on behalf of another to
+ organize and/or respond to meeting requests. iTIP provides two
+ mechanisms that support these activities.
+
+ First, the "Organizer" is treated as a special entity, separate from
+ "Attendees". All responses from "Attendees" flow to the "Organizer",
+ making it easy to separate a "Calendar User" organizing a meeting
+ from "Calendar Users" attending the meeting. Additionally, iCalendar
+ provides descriptive roles for each "Attendee". For instance, a role
+ of "chair" may be ascribed to one or more "Attendees". The "chair"
+ and the "Organizer" may or may not be the same "Calendar User". This
+ maps well to scenarios where an assistant may manage meeting
+ logistics for another individual who chairs a meeting.
+
+ Second, a "SENT-BY" parameter may be specified in either the
+ "Organizer" or "Attendee" properties. When specified, the "SENT-BY"
+ parameter indicates that the responding CU acted on behalf of the
+ specified "Attendee" or "Organizer".
+
+2.1.4. Component Revisions
+
+ The "SEQUENCE" property is used by the "Organizer" to indicate
+ revisions to the calendar component. When the "Organizer" makes
+ changes to one of the following properties, the sequence number MUST
+ be incremented:
+
+ o "DTSTART"
+
+ o "DTEND"
+
+ o "DURATION"
+
+ o "DUE"
+
+ o "RRULE"
+
+ o "RDATE"
+
+ o "EXDATE"
+
+ o "STATUS"
+
+ In addition, changes made by the "Organizer" to other properties MAY
+ also require the sequence number to be incremented. The "Organizer"
+ CUA MUST increment the sequence number whenever it makes changes to
+ properties in the calendar component that the "Organizer" deems will
+
+
+
+Daboo Standards Track [Page 11]
+
+RFC 5546 iTIP December 2009
+
+
+ jeopardize the validity of the participation status of the
+ "Attendees". For example, changing the location of a meeting from
+ one location to another distant location could effectively impact the
+ participation status of the "Attendees".
+
+ Depending on the "METHOD", the "SEQUENCE" property MUST follow these
+ rules in the context of iTIP:
+
+ o For the "PUBLISH" and "REQUEST" methods, the "SEQUENCE" property
+ value is incremented according to the rules stated above.
+
+ o The "SEQUENCE" property value MUST be incremented each time the
+ "Organizer" uses the "ADD" or "CANCEL" methods.
+
+ o The "SEQUENCE" property value MUST NOT be incremented when using
+ "REPLY", "REFRESH", "COUNTER", "DECLINECOUNTER", or when sending a
+ delegation "REQUEST".
+
+ In some circumstances, the "Organizer" may not have received
+ responses to the final revision sent out. In this situation, the
+ "Organizer" may wish to send an update "REQUEST" and set "RSVP=TRUE"
+ for all "Attendees" so that current responses can be collected.
+
+ The value of the "SEQUENCE" property contained in a response from an
+ "Attendee" may not always match the "Organizer's" revision.
+ Implementations may choose to have the CUA indicate to the CU that
+ the response is to an iCalendar object that has been revised, and
+ allow the CU to decide whether or not to accept the response.
+
+ Whilst a change in sequence number is indicative of a significant
+ change to a previously scheduled item, "Attendee" CUAs SHOULD NOT
+ rely solely on a change in sequence number as a means of detecting a
+ significant change. Instead, CUAs SHOULD compare the old and new
+ versions of the calendar components, determine the exact nature of
+ the changes, and make decisions -- possibly based on "Calendar User"
+ preferences -- as to whether the user needs to be explicitly informed
+ of the change.
+
+2.1.5. Message Sequencing
+
+ CUAs that handle the iTIP application protocol must often correlate a
+ component in a calendar store with a component received in the iTIP
+ message. For example, an event may be updated with a later revision
+ of the same event. To accomplish this, a CUA must correlate the
+ version of the event already in its calendar store with the version
+ sent in the iTIP message. In addition to this correlation, there are
+ several factors that can cause iTIP messages to arrive in an
+ unexpected order. That is, an "Organizer" could receive a reply to
+
+
+
+Daboo Standards Track [Page 12]
+
+RFC 5546 iTIP December 2009
+
+
+ an earlier revision of a component after receiving a reply to a later
+ revision.
+
+ To maximize interoperability and to handle messages that arrive in an
+ unexpected order, use the following rules:
+
+ 1. The primary key for referencing a particular iCalendar component
+ is the "UID" property value. To reference an instance of a
+ recurring component, the primary key is composed of the "UID" and
+ the "RECURRENCE-ID" properties.
+
+ 2. The secondary key for referencing a component is the "SEQUENCE"
+ property value. For components where the "UID" and
+ "RECURRENCE-ID" property values are the same, the component with
+ the highest numeric value for the "SEQUENCE" property obsoletes
+ all other revisions of the component with lower values.
+
+ 3. "Attendees" send "REPLY" messages to the "Organizer". For
+ replies where the "UID" and "RECURRENCE-ID" property values are
+ the same, the value of the "SEQUENCE" property indicates the
+ revision of the component to which the "Attendee" is replying.
+ The reply with the highest numeric value for the "SEQUENCE"
+ property obsoletes all other replies with lower values.
+
+ 4. In situations where the "UID", "RECURRENCE-ID", and "SEQUENCE"
+ property values match, the "DTSTAMP" property is used as the tie-
+ breaker. The component with the latest "DTSTAMP" overrides all
+ others. Similarly, for "Attendee" responses where the "UID",
+ "RECURRENCE-ID", and "SEQUENCE" property values match, the
+ response with the latest "DTSTAMP" overrides all others.
+
+ Hence, CUAs will need to persist the following component properties
+ in order to correctly process iTIP messages: "UID", "RECURRENCE-ID",
+ "SEQUENCE", and "DTSTAMP". Furthermore, for each "ATTENDEE" property
+ of a component, "Organizer" CUAs will need to persist the "SEQUENCE"
+ and "DTSTAMP" property values associated with the "Attendee's" last
+ response, so that any earlier responses from an "Attendee" that are
+ received out of order (e.g., due to a delay in the transport) can be
+ correctly discarded.
+
+3. Application Protocol Elements
+
+ iTIP messages are "text/calendar" MIME entities that contain
+ calendaring and scheduling information. The particular type of
+ iCalendar message is referred to as the "method type". Each method
+ type is identified by a "METHOD" property specified as part of the
+ "text/calendar" content type. The table below shows various
+
+
+
+
+Daboo Standards Track [Page 13]
+
+RFC 5546 iTIP December 2009
+
+
+ combinations of calendar components and the method types that this
+ specification supports.
+
+ +----------------+--------+-------+----------+-----------+
+ | | VEVENT | VTODO | VJOURNAL | VFREEBUSY |
+ +----------------+--------+-------+----------+-----------+
+ | PUBLISH | Yes | Yes | Yes | Yes |
+ | REQUEST | Yes | Yes | No | Yes |
+ | REFRESH | Yes | Yes | No | No |
+ | CANCEL | Yes | Yes | Yes | No |
+ | ADD | Yes | Yes | Yes | No |
+ | REPLY | Yes | Yes | No | Yes |
+ | COUNTER | Yes | Yes | No | No |
+ | DECLINECOUNTER | Yes | Yes | No | No |
+ +----------------+--------+-------+----------+-----------+
+
+ Each method type is defined in terms of its associated components and
+ properties. Some components and properties are required, some are
+ optional, and others are excluded. The restrictions are expressed in
+ this document using a simple "restriction table". The first column
+ indicates the name of a component or property. Properties of the
+ iCalendar object are not indented. Properties of a component are
+ indented. The second column (the "Presence" column) indicates
+ whether or not a component or property should be present and, if
+ present, how many times it can occur. The third column contains
+ comments for further clarification.
+
+ The presence column uses the following values to assert whether a
+ property is required or optional, and the number of times it may
+ appear in the iCalendar object.
+
+ +----------------+--------------------------------------------------+
+ | Presence Value | Description |
+ +----------------+--------------------------------------------------+
+ | 1 | One instance MUST be present. |
+ | 1+ | At least one instance MUST be present. |
+ | 0 | Instances of this property MUST NOT be present. |
+ | 0+ | Multiple instances MAY be present. |
+ | 0 or 1 | Up to 1 instance of this property MAY be |
+ | | present. |
+ +----------------+--------------------------------------------------+
+
+ The tables also call out "IANA-PROPERTY", "X-PROPERTY", "IANA-
+ COMPONENT", and "X-COMPONENT" to show where registered and
+ experimental property and component extensions can appear. The
+ tables do not lay out the restrictions of property parameters. Those
+ restrictions are defined in [RFC5545].
+
+
+
+
+Daboo Standards Track [Page 14]
+
+RFC 5546 iTIP December 2009
+
+
+3.1. Common Component Restriction Tables
+
+3.1.1. VCALENDAR
+
+ The restriction table below applies to properties of the iCalendar
+ object. That is, the properties at the outermost scope.
+
+ +-----------------------------------------------------+
+ | Constraints for Properties in a VCALENDAR Component |
+ +-----------------------------------------------------+
+
+ +--------------------+----------+--------------------+
+ | Component/Property | Presence | Comment |
+ +--------------------+----------+--------------------+
+ | CALSCALE | 0 or 1 | |
+ | PRODID | 1 | |
+ | VERSION | 1 | Value MUST be 2.0. |
+ | IANA-PROPERTY | 0+ | |
+ | X-PROPERTY | 0+ | |
+ +--------------------+----------+--------------------+
+
+3.1.2. VTIMEZONE
+
+ "VTIMEZONE" components may be referred to by other components via a
+ "TZID" parameter on a "DATETIME" value type. The property
+ restrictions in the table below apply to any "VTIMEZONE" component in
+ an iTIP message.
+
+ +--------------------------------------+
+ | Constraints for VTIMEZONE Components |
+ +--------------------------------------+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo Standards Track [Page 15]
+
+RFC 5546 iTIP December 2009
+
+
+ +--------------------+----------+-----------------------------------+
+ | Component/Property | Presence | Comment |
+ +--------------------+----------+-----------------------------------+
+ | VTIMEZONE | 0+ | MUST be present if any date/time |
+ | | | refers to timezone. |
+ | DAYLIGHT | 0+ | MUST be one or more of either |
+ | | | STANDARD or DAYLIGHT. |
+ | COMMENT | 0+ | |
+ | DTSTART | 1 | MUST be local time format. |
+ | RDATE | 0+ | |
+ | RRULE | 0 or 1 | |
+ | TZNAME | 0+ | |
+ | TZOFFSETFROM | 1 | |
+ | TZOFFSETTO | 1 | |
+ | IANA-PROPERTY | 0+ | |
+ | X-PROPERTY | 0+ | |
+ | LAST-MODIFIED | 0 or 1 | |
+ | STANDARD | 0+ | MUST be one or more of either |
+ | | | STANDARD or DAYLIGHT. |
+ | COMMENT | 0+ | |
+ | DTSTART | 1 | MUST be local time format. |
+ | RDATE | 0+ | If present, RRULE MUST NOT be |
+ | | | present. |
+ | RRULE | 0 or 1 | If present, RDATE MUST NOT be |
+ | | | present. |
+ | TZNAME | 0+ | |
+ | TZOFFSETFROM | 1 | |
+ | TZOFFSETTO | 1 | |
+ | IANA-PROPERTY | 0+ | |
+ | X-PROPERTY | 0+ | |
+ | TZID | 1 | |
+ | TZURL | 0 or 1 | |
+ | IANA-PROPERTY | 0+ | |
+ | X-PROPERTY | 0+ | |
+ +--------------------+----------+-----------------------------------+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo Standards Track [Page 16]
+
+RFC 5546 iTIP December 2009
+
+
+3.1.3. VALARM
+
+ The property restrictions in the table below apply to any "VALARM"
+ component in an iTIP message.
+
+ +-----------------------------------+
+ | Constraints for VALARM Components |
+ +-----------------------------------+
+
+ +--------------------+----------+-----------------------------------+
+ | Component/Property | Presence | Comment |
+ +--------------------+----------+-----------------------------------+
+ | VALARM | 0+ | |
+ | ACTION | 1 | |
+ | ATTACH | 0+ | |
+ | ATTENDEE | 0+ | |
+ | DESCRIPTION | 0 or 1 | |
+ | DURATION | 0 or 1 | If present, REPEAT MUST be |
+ | | | present. |
+ | REPEAT | 0 or 1 | If present, DURATION MUST be |
+ | | | present. |
+ | SUMMARY | 0 or 1 | |
+ | TRIGGER | 1 | |
+ | IANA-PROPERTY | 0+ | |
+ | X-PROPERTY | 0+ | |
+ +--------------------+----------+-----------------------------------+
+
+3.2. Methods for VEVENT Calendar Components
+
+ This section defines the property set restrictions for the method
+ types that are applicable to the "VEVENT" calendar component. Each
+ method is defined using a table that clarifies the property
+ constraints that define the particular method.
+
+ The following summarizes the methods that are defined for the
+ "VEVENT" calendar component.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo Standards Track [Page 17]
+
+RFC 5546 iTIP December 2009
+
+
+ +----------------+--------------------------------------------------+
+ | Method | Description |
+ +----------------+--------------------------------------------------+
+ | PUBLISH | Post notification of an event. Used primarily |
+ | | as a method of advertising the existence of an |
+ | | event. |
+ | | |
+ | REQUEST | Make a request for an event. This is an |
+ | | explicit invitation to one or more Attendees. |
+ | | Event requests are also used to update or change |
+ | | an existing event. Clients that cannot handle |
+ | | REQUEST MAY degrade the event to view it as a |
+ | | PUBLISH. |
+ | | |
+ | REPLY | Reply to an event request. Clients may set |
+ | | their status (PARTSTAT) to ACCEPTED, DECLINED, |
+ | | TENTATIVE, or DELEGATED. |
+ | | |
+ | ADD | Add one or more instances to an existing event. |
+ | | |
+ | CANCEL | Cancel one or more instances of an existing |
+ | | event. |
+ | | |
+ | REFRESH | A request is sent to an Organizer by an Attendee |
+ | | asking for the latest version of an event to be |
+ | | resent to the requester. |
+ | | |
+ | COUNTER | Counter a REQUEST with an alternative proposal. |
+ | | Sent by an Attendee to the Organizer. |
+ | | |
+ | DECLINECOUNTER | Decline a counter proposal. Sent to an Attendee |
+ | | by the Organizer. |
+ +----------------+--------------------------------------------------+
+
+3.2.1. PUBLISH
+
+ The "PUBLISH" method in a "VEVENT" calendar component is an
+ unsolicited posting of an iCalendar object. Any CU may add published
+ components to their calendar. The "Organizer" MUST be present in a
+ published iCalendar component. "Attendees" MUST NOT be present. Its
+ expected usage is for encapsulating an arbitrary event as an
+ iCalendar object. The "Organizer" may subsequently update (with
+ another "PUBLISH" method), add instances to (with an "ADD" method),
+ or cancel (with a "CANCEL" method) a previously published "VEVENT"
+ calendar component.
+
+ This method type is an iCalendar object that conforms to the
+ following property constraints:
+
+
+
+Daboo Standards Track [Page 18]
+
+RFC 5546 iTIP December 2009
+
+
+ +----------------------------------------------+
+ | Constraints for a METHOD:PUBLISH of a VEVENT |
+ +----------------------------------------------+
+
+ +--------------------+----------+-----------------------------------+
+ | Component/Property | Presence | Comment |
+ +--------------------+----------+-----------------------------------+
+ | METHOD | 1 | MUST equal PUBLISH. |
+ | | | |
+ | VEVENT | 1+ | |
+ | DTSTAMP | 1 | |
+ | DTSTART | 1 | |
+ | ORGANIZER | 1 | |
+ | SUMMARY | 1 | Can be null. |
+ | UID | 1 | |
+ | RECURRENCE-ID | 0 or 1 | Only if referring to an instance |
+ | | | of a recurring calendar |
+ | | | component. Otherwise, it MUST |
+ | | | NOT be present. |
+ | SEQUENCE | 0 or 1 | MUST be present if value is |
+ | | | greater than 0; MAY be present if |
+ | | | 0. |
+ | ATTACH | 0+ | |
+ | CATEGORIES | 0+ | |
+ | CLASS | 0 or 1 | |
+ | COMMENT | 0+ | |
+ | CONTACT | 0 or 1 | |
+ | CREATED | 0 or 1 | |
+ | DESCRIPTION | 0 or 1 | Can be null. |
+ | DTEND | 0 or 1 | If present, DURATION MUST NOT be |
+ | | | present. |
+ | DURATION | 0 or 1 | If present, DTEND MUST NOT be |
+ | | | present. |
+ | EXDATE | 0+ | |
+ | GEO | 0 or 1 | |
+ | LAST-MODIFIED | 0 or 1 | |
+ | LOCATION | 0 or 1 | |
+ | PRIORITY | 0 or 1 | |
+ | RDATE | 0+ | |
+ | RELATED-TO | 0+ | |
+ | RESOURCES | 0+ | |
+ | RRULE | 0 or 1 | |
+ | STATUS | 0 or 1 | MAY be one of |
+ | | | TENTATIVE/CONFIRMED/CANCELLED. |
+ | TRANSP | 0 or 1 | |
+ | URL | 0 or 1 | |
+ | IANA-PROPERTY | 0+ | |
+ | X-PROPERTY | 0+ | |
+
+
+
+Daboo Standards Track [Page 19]
+
+RFC 5546 iTIP December 2009
+
+
+ | ATTENDEE | 0 | |
+ | REQUEST-STATUS | 0 | |
+ | | | |
+ | VALARM | 0+ | |
+ | | | |
+ | VFREEBUSY | 0 | |
+ | | | |
+ | VJOURNAL | 0 | |
+ | | | |
+ | VTODO | 0 | |
+ | | | |
+ | VTIMEZONE | 0+ | MUST be present if any date/time |
+ | | | refers to a timezone. |
+ | | | |
+ | IANA-COMPONENT | 0+ | |
+ | X-COMPONENT | 0+ | |
+ +--------------------+----------+-----------------------------------+
+
+3.2.2. REQUEST
+
+ The "REQUEST" method in a "VEVENT" component provides the following
+ scheduling functions:
+
+ o Invite "Attendees" to an event.
+
+ o Reschedule an existing event.
+
+ o Response to a "REFRESH" request.
+
+ o Update the details of an existing event, without rescheduling it.
+
+ o Update the status of "Attendees" of an existing event, without
+ rescheduling it.
+
+ o Reconfirm an existing event, without rescheduling it.
+
+ o Forward a "VEVENT" to another uninvited CU.
+
+ o For an existing "VEVENT" calendar component, delegate the role of
+ "Attendee" to another CU.
+
+ o For an existing "VEVENT" calendar component, change the role of
+ "Organizer" to another CU.
+
+ The "Organizer" originates the "REQUEST". The recipients of the
+ "REQUEST" method are the CUs invited to the event, the "Attendees".
+ "Attendees" use the "REPLY" method to convey attendance status to the
+ "Organizer".
+
+
+
+Daboo Standards Track [Page 20]
+
+RFC 5546 iTIP December 2009
+
+
+ The "UID" and "SEQUENCE" properties are used to distinguish the
+ various uses of the "REQUEST" method. If the "UID" property value in
+ the "REQUEST" is not found on the recipient's calendar, then the
+ "REQUEST" is for a new "VEVENT" calendar component. If the "UID"
+ property value is found on the recipient's calendar, then the
+ "REQUEST" is for a rescheduling, an update, or a reconfirmation of
+ the "VEVENT" calendar component.
+
+ For the "REQUEST" method, multiple "VEVENT" components in a single
+ iCalendar object are only permitted for components with the same
+ "UID" property. That is, a series of recurring events may have
+ instance-specific information. In this case, multiple "VEVENT"
+ components are needed to express the entire series.
+
+ This method type is an iCalendar object that conforms to the
+ following property constraints:
+
+ +----------------------------------------------+
+ | Constraints for a METHOD:REQUEST of a VEVENT |
+ +----------------------------------------------+
+
+ +--------------------+----------+-----------------------------------+
+ | Component/Property | Presence | Comment |
+ +--------------------+----------+-----------------------------------+
+ | METHOD | 1 | MUST be REQUEST. |
+ | | | |
+ | VEVENT | 1+ | All components MUST have the same |
+ | | | UID. |
+ | ATTENDEE | 1+ | |
+ | DTSTAMP | 1 | |
+ | DTSTART | 1 | |
+ | ORGANIZER | 1 | |
+ | SEQUENCE | 0 or 1 | MUST be present if value is |
+ | | | greater than 0; MAY be present if |
+ | | | 0. |
+ | SUMMARY | 1 | Can be null. |
+ | UID | 1 | |
+ | ATTACH | 0+ | |
+ | CATEGORIES | 0+ | |
+ | CLASS | 0 or 1 | |
+ | COMMENT | 0+ | |
+ | CONTACT | 0+ | |
+ | CREATED | 0 or 1 | |
+ | DESCRIPTION | 0 or 1 | Can be null. |
+ | DTEND | 0 or 1 | If present, DURATION MUST NOT be |
+ | | | present. |
+
+
+
+
+
+Daboo Standards Track [Page 21]
+
+RFC 5546 iTIP December 2009
+
+
+ | DURATION | 0 or 1 | If present, DTEND MUST NOT be |
+ | | | present. |
+ | EXDATE | 0+ | |
+ | GEO | 0 or 1 | |
+ | LAST-MODIFIED | 0 or 1 | |
+ | LOCATION | 0 or 1 | |
+ | PRIORITY | 0 or 1 | |
+ | RDATE | 0+ | |
+ | RECURRENCE-ID | 0 or 1 | Only if referring to an instance |
+ | | | of a recurring calendar |
+ | | | component. Otherwise, it MUST |
+ | | | NOT be present. |
+ | RELATED-TO | 0+ | |
+ | REQUEST-STATUS | 0 | |
+ | RESOURCES | 0+ | |
+ | RRULE | 0 or 1 | |
+ | STATUS | 0 or 1 | MAY be one of |
+ | | | TENTATIVE/CONFIRMED. |
+ | TRANSP | 0 or 1 | |
+ | URL | 0 or 1 | |
+ | IANA-PROPERTY | 0+ | |
+ | X-PROPERTY | 0+ | |
+ | | | |
+ | VALARM | 0+ | |
+ | | | |
+ | VTIMEZONE | 0+ | MUST be present if any date/time |
+ | | | refers to a timezone. |
+ | | | |
+ | IANA-COMPONENT | 0+ | |
+ | X-COMPONENT | 0+ | |
+ | | | |
+ | VFREEBUSY | 0 | |
+ | | | |
+ | VJOURNAL | 0 | |
+ | | | |
+ | VTODO | 0 | |
+ +--------------------+----------+-----------------------------------+
+
+3.2.2.1. Rescheduling an Event
+
+ The "REQUEST" method may be used to reschedule an event. A
+ rescheduled event involves a change to the existing event in terms of
+ its time or recurrence intervals and possibly the location or
+ description. If the recipient CUA of a "REQUEST" method finds that
+ the "UID" property value already exists on the calendar but that the
+ "SEQUENCE" (or "DTSTAMP") property value in the "REQUEST" method is
+ greater than the value for the existing event, then the "REQUEST"
+ method describes a rescheduling of the event.
+
+
+
+Daboo Standards Track [Page 22]
+
+RFC 5546 iTIP December 2009
+
+
+3.2.2.2. Updating or Reconfirmation of an Event
+
+ The "REQUEST" method may be used to update or reconfirm an event. An
+ update to an existing event does not involve changes to the time or
+ recurrence intervals, and might not involve a change to the location
+ or description for the event. If the recipient CUA of a "REQUEST"
+ method finds that the "UID" property value already exists on the
+ calendar and that the "SEQUENCE" property value in the "REQUEST" is
+ the same as the value for the existing event, then the "REQUEST"
+ method describes an update of the event details, but not a
+ rescheduling of the event.
+
+ The update "REQUEST" method is the appropriate response to a
+ "REFRESH" method sent from an "Attendee" to the "Organizer" of an
+ event.
+
+ The "Organizer" of an event may also send unsolicited "REQUEST"
+ methods. The unsolicited "REQUEST" methods may be used to update the
+ details of the event without rescheduling it, to update the
+ "PARTSTAT" parameter of "Attendees", or to reconfirm the event.
+
+3.2.2.3. Delegating an Event to Another CU
+
+ Some calendar and scheduling systems allow "Attendees" to delegate
+ their presence at an event to another "Calendar User". iTIP supports
+ this concept using the following workflow. Any "Attendee" may
+ delegate their right to participate in a calendar "VEVENT" to another
+ CU. The implication is that the delegate participates in lieu of the
+ original "Attendee", NOT in addition to the "Attendee". The
+ delegator MUST notify the "Organizer" of this action using the steps
+ outlined below. Implementations may support or restrict delegation
+ as they see fit. For instance, some implementations may restrict a
+ delegate from delegating a "REQUEST" to another CU.
+
+ The "Delegator" of an event forwards the existing "REQUEST" to the
+ "Delegate". The "REQUEST" method MUST include an "ATTENDEE" property
+ with the calendar address of the "Delegate". The "Delegator" MUST
+ also send a "REPLY" method to the "Organizer" with the "Delegator's"
+ "ATTENDEE" property "PARTSTAT" parameter value set to "DELEGATED".
+ In addition, the "DELEGATED-TO" parameter MUST be included with the
+ calendar address of the "Delegate". Also, a new "ATTENDEE" property
+ for the "Delegate" MUST be included and must specify the calendar
+ user address set in the "DELEGATED-TO" parameter, as above.
+
+ In response to the request, the "Delegate" MUST send a "REPLY" method
+ to the "Organizer", and optionally to the "Delegator". The "REPLY"
+ method SHOULD include the "ATTENDEE" property with the "DELEGATED-
+ FROM" parameter value of the "Delegator's" calendar address.
+
+
+
+Daboo Standards Track [Page 23]
+
+RFC 5546 iTIP December 2009
+
+
+ The "Delegator" may continue to receive updates to the event even
+ though they will not be attending. This is accomplished by the
+ "Delegator" setting their "role" attribute to "NON-PARTICIPANT" in
+ the "REPLY" to the "Organizer".
+
+3.2.2.4. Changing the Organizer
+
+ The situation may arise where the "Organizer" of a "VEVENT" is no
+ longer able to perform the "Organizer" role and abdicates without
+ passing on the "Organizer" role to someone else. When this occurs,
+ the "Attendees" of the "VEVENT" may use out-of-band mechanisms to
+ communicate the situation and agree upon a new "Organizer". The new
+ "Organizer" should then send out a new "REQUEST" with a modified
+ version of the "VEVENT" in which the "SEQUENCE" number has been
+ incremented and the "ORGANIZER" property has been changed to the new
+ "Organizer".
+
+3.2.2.5. Sending on Behalf of the Organizer
+
+ There are a number of scenarios that support the need for a "Calendar
+ User" to act on behalf of the "Organizer" without explicit role
+ changing. This might be the case if the CU designated as "Organizer"
+ is sick or unable to perform duties associated with that function.
+ In these cases, iTIP supports the notion of one CU acting on behalf
+ of another. Using the "SENT-BY" parameter, a "Calendar User" could
+ send an updated "VEVENT" "REQUEST". In the case where one CU sends
+ on behalf of another CU, the "Attendee" responses are still directed
+ back towards the CU designated as "Organizer".
+
+3.2.2.6. Forwarding to an Uninvited CU
+
+ An "Attendee" invited to a "VEVENT" calendar component may send the
+ "VEVENT" calendar component to another new CU not previously
+ associated with the "VEVENT" calendar component. The current
+ "Attendee" invited to the "VEVENT" calendar component does this by
+ forwarding the original "REQUEST" method to the new CU. The new CU
+ can send a "REPLY" to the "Organizer" of the "VEVENT" calendar
+ component. The reply contains an "ATTENDEE" property for the new CU.
+
+ The "Organizer" ultimately decides whether or not the new CU becomes
+ part of the event and is not obligated to do anything with a "REPLY"
+ from a new (uninvited) CU. If the "Organizer" does not want the new
+ CU to be part of the event, the new "ATTENDEE" property is not added
+ to the "VEVENT" calendar component. The "Organizer" MAY send the CU
+ a "CANCEL" message to indicate that they will not be added to the
+ event. If the "Organizer" decides to add the new CU, the new
+ "ATTENDEE" property is added to the "VEVENT" calendar component.
+ Furthermore, the "Organizer" is free to change any "ATTENDEE"
+
+
+
+Daboo Standards Track [Page 24]
+
+RFC 5546 iTIP December 2009
+
+
+ property parameter from the values supplied by the new CU to
+ something the "Organizer" considers appropriate. The "Organizer"
+ SHOULD send the new CU a "REQUEST" message to inform them that they
+ have been added.
+
+ When forwarding a "REQUEST" to another CU, the forwarding "Attendee"
+ MUST NOT make changes to the original message.
+
+3.2.2.7. Updating Attendee Status
+
+ The "Organizer" of an event may also request updated status from one
+ or more "Attendees". The "Organizer" sends a "REQUEST" method to the
+ "Attendee" and sets the "ATTENDEE;RSVP=TRUE" property parameter. The
+ "SEQUENCE" property for the event is not changed from its previous
+ value. A recipient will determine that the only change in the
+ "REQUEST" is that their "RSVP" property parameter indicates a request
+ for updated status. The recipient SHOULD respond with a "REPLY"
+ method indicating their current status with respect to the "REQUEST".
+
+3.2.3. REPLY
+
+ The "REPLY" method in a "VEVENT" calendar component is used to
+ respond (e.g., accept or decline) to a "REQUEST" or to reply to a
+ delegation "REQUEST". When used to provide a delegation response,
+ the "Delegator" SHOULD include the calendar address of the "Delegate"
+ on the "DELEGATED-TO" property parameter of the "Delegator's"
+ "ATTENDEE" property. The "Delegate" SHOULD include the calendar
+ address of the "Delegator" on the "DELEGATED-FROM" property parameter
+ of the "Delegate's" "ATTENDEE" property.
+
+ The "REPLY" method is also used when processing of a "REQUEST" fails.
+ Depending on the value of the "REQUEST-STATUS" property, no
+ scheduling action may have been performed.
+
+ The "Organizer" of an event may receive the "REPLY" method from a CU
+ not in the original "REQUEST". For example, a "REPLY" may be
+ received from a "Delegate" to an event. In addition, the "REPLY"
+ method may be received from an unknown CU (a "Party Crasher"). This
+ uninvited "Attendee" may be accepted, or the "Organizer" may cancel
+ the event for the uninvited "Attendee" by sending a "CANCEL" method
+ to the uninvited "Attendee".
+
+ An "Attendee" MAY include a message to the "Organizer" using the
+ "COMMENT" property. For example, if the user indicates tentative
+ acceptance and wants to let the "Organizer" know why, the reason can
+ be expressed in the "COMMENT" property value.
+
+
+
+
+
+Daboo Standards Track [Page 25]
+
+RFC 5546 iTIP December 2009
+
+
+ The "Organizer" may also receive a "REPLY" from one CU on behalf of
+ another. Like the scenario enumerated above for the "Organizer",
+ "Attendees" may have another CU respond on their behalf. This is
+ done using the "SENT-BY" parameter.
+
+ The optional properties listed in the table below (those listed as
+ "0+" or "0 or 1") MUST NOT be changed from those of the original
+ request. If property changes are desired, the "COUNTER" message must
+ be used.
+
+ This method type is an iCalendar object that conforms to the
+ following property constraints:
+
+ +--------------------------------------------+
+ | Constraints for a METHOD:REPLY of a VEVENT |
+ +--------------------------------------------+
+
+ +--------------------+----------+-----------------------------------+
+ | Component/Property | Presence | Comment |
+ +--------------------+----------+-----------------------------------+
+ | METHOD | 1 | MUST be REPLY. |
+ | | | |
+ | VEVENT | 1+ | All components MUST have the same |
+ | | | UID. |
+ | ATTENDEE | 1 | MUST be the address of the |
+ | | | Attendee replying. |
+ | DTSTAMP | 1 | |
+ | ORGANIZER | 1 | |
+ | RECURRENCE-ID | 0 or 1 | Only if referring to an instance |
+ | | | of a recurring calendar |
+ | | | component. Otherwise, it MUST |
+ | | | NOT be present. |
+ | UID | 1 | MUST be the UID of the original |
+ | | | REQUEST. |
+ | SEQUENCE | 0 or 1 | If non-zero, MUST be the sequence |
+ | | | number of the original REQUEST. |
+ | | | MAY be present if 0. |
+ | ATTACH | 0+ | |
+ | CATEGORIES | 0+ | |
+ | CLASS | 0 or 1 | |
+ | COMMENT | 0+ | |
+ | CONTACT | 0+ | |
+ | CREATED | 0 or 1 | |
+ | DESCRIPTION | 0 or 1 | |
+ | DTEND | 0 or 1 | If present, DURATION MUST NOT be |
+ | | | present. |
+ | DTSTART | 0 or 1 | |
+
+
+
+
+Daboo Standards Track [Page 26]
+
+RFC 5546 iTIP December 2009
+
+
+ | DURATION | 0 or 1 | If present, DTEND MUST NOT be |
+ | | | present. |
+ | EXDATE | 0+ | |
+ | GEO | 0 or 1 | |
+ | LAST-MODIFIED | 0 or 1 | |
+ | LOCATION | 0 or 1 | |
+ | PRIORITY | 0 or 1 | |
+ | RDATE | 0+ | |
+ | RELATED-TO | 0+ | |
+ | RESOURCES | 0+ | |
+ | REQUEST-STATUS | 0+ | |
+ | RRULE | 0 or 1 | |
+ | STATUS | 0 or 1 | |
+ | SUMMARY | 0 or 1 | |
+ | TRANSP | 0 or 1 | |
+ | URL | 0 or 1 | |
+ | IANA-PROPERTY | 0+ | |
+ | X-PROPERTY | 0+ | |
+ | | | |
+ | VALARM | 0 | |
+ | | | |
+ | VTIMEZONE | 0 or 1 | MUST be present if any date/time |
+ | | | refers to a timezone. |
+ | | | |
+ | IANA-COMPONENT | 0+ | |
+ | X-COMPONENT | 0+ | |
+ | | | |
+ | VFREEBUSY | 0 | |
+ | | | |
+ | VJOURNAL | 0 | |
+ | | | |
+ | VTODO | 0 | |
+ +--------------------+----------+-----------------------------------+
+
+3.2.4. ADD
+
+ The "ADD" method allows the "Organizer" to add one or more new
+ instances to an existing "VEVENT" using a single iTIP message without
+ having to send the entire "VEVENT" with all the existing instance
+ data, as it would have to do if the "REQUEST" method were used.
+
+ The "UID" must be that of the existing event. If the "UID" property
+ value in the "ADD" is not found on the recipient's calendar, then the
+ recipient SHOULD send a "REFRESH" to the "Organizer" in order to be
+ updated with the latest version of the "VEVENT". If an "Attendee"
+ implementation does not support the "ADD" method, it should respond
+ with a "REQUEST-STATUS" value of 3.14 and ask for a "REFRESH".
+
+
+
+
+Daboo Standards Track [Page 27]
+
+RFC 5546 iTIP December 2009
+
+
+ When handling an "ADD" message, the "Attendee" treats each component
+ in the "ADD" message as if it were referenced via an "RDATE" in the
+ main component.
+
+ This method type is an iCalendar object that conforms to the
+ following property constraints:
+
+ +------------------------------------------+
+ | Constraints for a METHOD:ADD of a VEVENT |
+ +------------------------------------------+
+
+ +--------------------+----------+-----------------------------------+
+ | Component/Property | Presence | Comment |
+ +--------------------+----------+-----------------------------------+
+ | METHOD | 1 | MUST be ADD. |
+ | | | |
+ | VEVENT | 1 | |
+ | DTSTAMP | 1 | |
+ | DTSTART | 1 | |
+ | ORGANIZER | 1 | |
+ | SEQUENCE | 1 | MUST be greater than 0. |
+ | SUMMARY | 1 | Can be null. |
+ | UID | 1 | MUST match that of the original |
+ | | | event. |
+ | ATTACH | 0+ | |
+ | ATTENDEE | 0+ | |
+ | CATEGORIES | 0+ | |
+ | CLASS | 0 or 1 | |
+ | COMMENT | 0+ | |
+ | CONTACT | 0+ | |
+ | CREATED | 0 or 1 | |
+ | DESCRIPTION | 0 or 1 | Can be null. |
+ | DTEND | 0 or 1 | If present, DURATION MUST NOT be |
+ | | | present. |
+ | DURATION | 0 or 1 | If present, DTEND MUST NOT be |
+ | | | present. |
+ | GEO | 0 or 1 | |
+ | LAST-MODIFIED | 0 or 1 | |
+ | LOCATION | 0 or 1 | |
+ | PRIORITY | 0 or 1 | |
+ | RELATED-TO | 0+ | |
+ | RESOURCES | 0+ | |
+ | STATUS | 0 or 1 | MAY be one of |
+ | | | TENTATIVE/CONFIRMED. |
+ | TRANSP | 0 or 1 | |
+ | URL | 0 or 1 | |
+ | IANA-PROPERTY | 0+ | |
+ | X-PROPERTY | 0+ | |
+
+
+
+Daboo Standards Track [Page 28]
+
+RFC 5546 iTIP December 2009
+
+
+ | EXDATE | 0 | |
+ | RECURRENCE-ID | 0 | |
+ | REQUEST-STATUS | 0 | |
+ | RDATE | 0 | |
+ | RRULE | 0 | |
+ | | | |
+ | VALARM | 0+ | |
+ | | | |
+ | VTIMEZONE | 0+ | MUST be present if any date/time |
+ | | | refers to a timezone. |
+ | | | |
+ | IANA-COMPONENT | 0+ | |
+ | X-COMPONENT | 0+ | |
+ | | | |
+ | VFREEBUSY | 0 | |
+ | | | |
+ | VTODO | 0 | |
+ | | | |
+ | VJOURNAL | 0 | |
+ +--------------------+----------+-----------------------------------+
+
+3.2.5. CANCEL
+
+ The "CANCEL" method in a "VEVENT" calendar component is used to send
+ a cancellation notice of an existing event request to the affected
+ "Attendees". The message is sent by the "Organizer" of the event.
+ For a recurring event, either the whole event or instances of an
+ event may be cancelled. To cancel the complete range of a recurring
+ event, the "UID" property value for the event MUST be specified and a
+ "RECURRENCE-ID" MUST NOT be specified in the "CANCEL" method. In
+ order to cancel an individual instance of the event, the
+ "RECURRENCE-ID" property value for the event MUST be specified in the
+ "CANCEL" method.
+
+ There are two options for canceling a sequence of instances of a
+ recurring "VEVENT" calendar component:
+
+ a. The "RECURRENCE-ID" property for an instance in the sequence MUST
+ be specified with the "RANGE" property parameter value of
+ "THISANDFUTURE" to indicate cancellation of the specified
+ "VEVENT" calendar component and all instances after.
+
+ b. Individual recurrence instances may be cancelled by specifying
+ multiple "VEVENT" components each with a "RECURRENCE-ID" property
+ corresponding to one of the instances to be cancelled.
+
+
+
+
+
+
+Daboo Standards Track [Page 29]
+
+RFC 5546 iTIP December 2009
+
+
+ The "Organizer" MUST send a "CANCEL" message to each "Attendee"
+ affected by the cancellation. This can be done using a single
+ "CANCEL" message for all "Attendees" or by using multiple messages
+ with different subsets of the affected "Attendees" in each.
+
+ When a "VEVENT" is cancelled, the "SEQUENCE" property value MUST be
+ incremented as described in Section 2.1.4.
+
+ This method type is an iCalendar object that conforms to the
+ following property constraints:
+
+ +---------------------------------------------+
+ | Constraints for a METHOD:CANCEL of a VEVENT |
+ +---------------------------------------------+
+
+ +--------------------+----------+-----------------------------------+
+ | Component/Property | Presence | Comment |
+ +--------------------+----------+-----------------------------------+
+ | METHOD | 1 | MUST be CANCEL. |
+ | | | |
+ | VEVENT | 1+ | All must have the same UID. |
+ | ATTENDEE | 0+ | MUST include some or all |
+ | | | Attendees being removed from the |
+ | | | event. MUST include some or all |
+ | | | Attendees if the entire event is |
+ | | | cancelled. |
+ | DTSTAMP | 1 | |
+ | ORGANIZER | 1 | |
+ | SEQUENCE | 1 | |
+ | UID | 1 | MUST be the UID of the original |
+ | | | REQUEST. |
+ | COMMENT | 0+ | |
+ | ATTACH | 0+ | |
+ | CATEGORIES | 0+ | |
+ | CLASS | 0 or 1 | |
+ | CONTACT | 0+ | |
+ | CREATED | 0 or 1 | |
+ | DESCRIPTION | 0 or 1 | |
+ | DTEND | 0 or 1 | If present, DURATION MUST NOT be |
+ | | | present. |
+ | DTSTART | 0 or 1 | |
+ | DURATION | 0 or 1 | If present, DTEND MUST NOT be |
+ | | | present. |
+ | EXDATE | 0+ | |
+ | GEO | 0 or 1 | |
+ | LAST-MODIFIED | 0 or 1 | |
+ | LOCATION | 0 or 1 | |
+ | PRIORITY | 0 or 1 | |
+
+
+
+Daboo Standards Track [Page 30]
+
+RFC 5546 iTIP December 2009
+
+
+ | RDATE | 0+ | |
+ | RECURRENCE-ID | 0 or 1 | Only if referring to an instance |
+ | | | of a recurring calendar |
+ | | | component. Otherwise, it MUST |
+ | | | NOT be present. |
+ | RELATED-TO | 0+ | |
+ | RESOURCES | 0+ | |
+ | RRULE | 0 or 1 | |
+ | STATUS | 0 or 1 | MUST be set to CANCELLED to |
+ | | | cancel the entire event. If |
+ | | | uninviting specific Attendees, |
+ | | | then MUST NOT be included. |
+ | SUMMARY | 0 or 1 | |
+ | TRANSP | 0 or 1 | |
+ | URL | 0 or 1 | |
+ | IANA-PROPERTY | 0+ | |
+ | X-PROPERTY | 0+ | |
+ | REQUEST-STATUS | 0 | |
+ | | | |
+ | VALARM | 0 | |
+ | | | |
+ | VTIMEZONE | 0+ | MUST be present if any date/time |
+ | | | refers to a timezone. |
+ | | | |
+ | IANA-COMPONENT | 0+ | |
+ | X-COMPONENT | 0+ | |
+ | | | |
+ | VTODO | 0 | |
+ | | | |
+ | VJOURNAL | 0 | |
+ | | | |
+ | VFREEBUSY | 0 | |
+ +--------------------+----------+-----------------------------------+
+
+3.2.6. REFRESH
+
+ The "REFRESH" method in a "VEVENT" calendar component is used by
+ "Attendees" of an existing event to request an updated description
+ from the event "Organizer". The "REFRESH" method must specify the
+ "UID" property of the event to update. A recurrence instance of an
+ event may be requested by specifying the "RECURRENCE-ID" property
+ corresponding to the associated event. The "Organizer" responds with
+ the latest description and version of the event.
+
+ This method type is an iCalendar object that conforms to the
+ following property constraints:
+
+
+
+
+
+Daboo Standards Track [Page 31]
+
+RFC 5546 iTIP December 2009
+
+
+ +----------------------------------------------+
+ | Constraints for a METHOD:REFRESH of a VEVENT |
+ +----------------------------------------------+
+
+ +--------------------+----------+-----------------------------------+
+ | Component/Property | Presence | Comment |
+ +--------------------+----------+-----------------------------------+
+ | METHOD | 1 | MUST be REFRESH. |
+ | | | |
+ | VEVENT | 1 | |
+ | ATTENDEE | 1 | MUST be the address of requester. |
+ | DTSTAMP | 1 | |
+ | ORGANIZER | 1 | |
+ | UID | 1 | MUST be the UID associated with |
+ | | | original REQUEST. |
+ | COMMENT | 0+ | |
+ | RECURRENCE-ID | 0 or 1 | Only if referring to an instance |
+ | | | of a recurring calendar |
+ | | | component. Otherwise, it MUST |
+ | | | NOT be present. |
+ | IANA-PROPERTY | 0+ | |
+ | X-PROPERTY | 0+ | |
+ | ATTACH | 0 | |
+ | CATEGORIES | 0 | |
+ | CLASS | 0 | |
+ | CONTACT | 0 | |
+ | CREATED | 0 | |
+ | DESCRIPTION | 0 | |
+ | DTEND | 0 | |
+ | DTSTART | 0 | |
+ | DURATION | 0 | |
+ | EXDATE | 0 | |
+ | GEO | 0 | |
+ | LAST-MODIFIED | 0 | |
+ | LOCATION | 0 | |
+ | PRIORITY | 0 | |
+ | RDATE | 0 | |
+ | RELATED-TO | 0 | |
+ | REQUEST-STATUS | 0 | |
+ | RESOURCES | 0 | |
+ | RRULE | 0 | |
+ | SEQUENCE | 0 | |
+ | STATUS | 0 | |
+ | SUMMARY | 0 | |
+ | TRANSP | 0 | |
+ | URL | 0 | |
+ | | | |
+
+
+
+
+Daboo Standards Track [Page 32]
+
+RFC 5546 iTIP December 2009
+
+
+ | VALARM | 0 | |
+ | | | |
+ | VTIMEZONE | 0+ | |
+ | | | |
+ | IANA-COMPONENT | 0+ | |
+ | X-COMPONENT | 0+ | |
+ | | | |
+ | VTODO | 0 | |
+ | | | |
+ | VJOURNAL | 0 | |
+ | | | |
+ | VFREEBUSY | 0 | |
+ +--------------------+----------+-----------------------------------+
+
+3.2.7. COUNTER
+
+ The "COUNTER" method for a "VEVENT" calendar component is used by an
+ "Attendee" of an existing event to submit to the "Organizer" a
+ counter proposal to the event. The "Attendee" sends this message to
+ the "Organizer" of the event.
+
+ The counter proposal is an iCalendar object consisting of a "VEVENT"
+ calendar component that provides the complete description of the
+ alternate event.
+
+ The "Organizer" rejects the counter proposal by sending the
+ "Attendee" a "DECLINECOUNTER" method. The "Organizer" accepts the
+ counter proposal by rescheduling the event as described in
+ Section 3.2.2.1, "Rescheduling an Event". The "Organizer's" CUA
+ SHOULD send a "REQUEST" message to all "Attendees" affected by any
+ change triggered by an accepted "COUNTER".
+
+ This method type is an iCalendar object that conforms to the
+ following property constraints:
+
+ +----------------------------------------------+
+ | Constraints for a METHOD:COUNTER of a VEVENT |
+ +----------------------------------------------+
+
+ +--------------------+----------+-----------------------------------+
+ | Component/Property | Presence | Comment |
+ +--------------------+----------+-----------------------------------+
+ | METHOD | 1 | MUST be COUNTER. |
+ | | | |
+ | VEVENT | 1 | |
+ | DTSTAMP | 1 | |
+ | DTSTART | 1 | |
+
+
+
+
+Daboo Standards Track [Page 33]
+
+RFC 5546 iTIP December 2009
+
+
+ | ORGANIZER | 1 | MUST be the Organizer of the |
+ | | | original event. |
+ | SEQUENCE | 1 | MUST echo the original SEQUENCE |
+ | | | number. MUST be present if |
+ | | | non-zero. MAY be present if |
+ | | | zero. |
+ | SUMMARY | 1 | Can be null. |
+ | UID | 1 | MUST be the UID associated with |
+ | | | the REQUEST being countered. |
+ | ATTACH | 0+ | |
+ | ATTENDEE | 0+ | Can also be used to propose other |
+ | | | Attendees. |
+ | CATEGORIES | 0+ | |
+ | CLASS | 0 or 1 | |
+ | COMMENT | 0+ | |
+ | CONTACT | 0+ | |
+ | CREATED | 0 or 1 | |
+ | DESCRIPTION | 0 or 1 | |
+ | DTEND | 0 or 1 | If present, DURATION MUST NOT be |
+ | | | present. |
+ | DURATION | 0 or 1 | If present, DTEND MUST NOT be |
+ | | | present. |
+ | EXDATE | 0+ | |
+ | GEO | 0 or 1 | |
+ | LAST-MODIFIED | 0 or 1 | |
+ | LOCATION | 0 or 1 | |
+ | PRIORITY | 0 or 1 | |
+ | RDATE | 0+ | |
+ | RECURRENCE-ID | 0 or 1 | Only if referring to an instance |
+ | | | of a recurring calendar |
+ | | | component. Otherwise, it MUST |
+ | | | NOT be present. |
+ | RELATED-TO | 0+ | |
+ | REQUEST-STATUS | 0+ | |
+ | RESOURCES | 0+ | |
+ | RRULE | 0 or 1 | |
+ | STATUS | 0 or 1 | Value must be one of |
+ | | | CONFIRMED/TENATIVE/CANCELLED. |
+ | TRANSP | 0 or 1 | |
+ | URL | 0 or 1 | |
+ | IANA-PROPERTY | 0+ | |
+ | X-PROPERTY | 0+ | |
+ | | | |
+ | VALARM | 0+ | |
+ | | | |
+ | VTIMEZONE | 0+ | MUST be present if any date/time |
+ | | | refers to a timezone. |
+ | | | |
+
+
+
+Daboo Standards Track [Page 34]
+
+RFC 5546 iTIP December 2009
+
+
+ | IANA-COMPONENT | 0+ | |
+ | X-COMPONENT | 0+ | |
+ | | | |
+ | VTODO | 0 | |
+ | | | |
+ | VJOURNAL | 0 | |
+ | | | |
+ | VFREEBUSY | 0 | |
+ +--------------------+----------+-----------------------------------+
+
+3.2.8. DECLINECOUNTER
+
+ The "DECLINECOUNTER" method in a "VEVENT" calendar component is used
+ by the "Organizer" of an event to reject a counter proposal submitted
+ by an "Attendee". The "Organizer" must send the "DECLINECOUNTER"
+ message to the "Attendee" that sent the "COUNTER" method to the
+ "Organizer".
+
+ This method type is an iCalendar object that conforms to the
+ following property constraints:
+
+ +-----------------------------------------------------+
+ | Constraints for a METHOD:DECLINECOUNTER of a VEVENT |
+ +-----------------------------------------------------+
+
+ +--------------------+----------+-----------------------------------+
+ | Component/Property | Presence | Comment |
+ +--------------------+----------+-----------------------------------+
+ | METHOD | 1 | MUST be DECLINECOUNTER. |
+ | | | |
+ | VEVENT | 1+ | All components MUST have the same |
+ | | | UID. |
+ | ATTENDEE | 1+ | MUST for all Attendees. |
+ | DTSTAMP | 1 | |
+ | ORGANIZER | 1 | |
+ | SEQUENCE | 1 | MUST echo the original SEQUENCE |
+ | | | number. |
+ | UID | 1 | MUST echo original UID. |
+ | ATTACH | 0+ | |
+ | CATEGORIES | 0+ | |
+ | CLASS | 0 or 1 | |
+ | COMMENT | 0+ | |
+ | CONTACT | 0+ | |
+ | CREATED | 0 or 1 | |
+ | DESCRIPTION | 0 or 1 | Can be null. |
+ | DTSTART | 0 or 1 | |
+ | DTEND | 0 or 1 | If present, DURATION MUST NOT be |
+ | | | present. |
+
+
+
+Daboo Standards Track [Page 35]
+
+RFC 5546 iTIP December 2009
+
+
+ | DURATION | 0 or 1 | If present, DTEND MUST NOT be |
+ | | | present. |
+ | EXDATE | 0+ | |
+ | GEO | 0 or 1 | |
+ | LAST-MODIFIED | 0 or 1 | |
+ | LOCATION | 0 or 1 | |
+ | PRIORITY | 0 or 1 | |
+ | RDATE | 0+ | |
+ | RECURRENCE-ID | 0 or 1 | Only if referring to an instance |
+ | | | of a recurring calendar |
+ | | | component. Otherwise, it MUST |
+ | | | NOT be present. |
+ | RELATED-TO | 0+ | |
+ | REQUEST-STATUS | 0+ | |
+ | RESOURCES | 0+ | |
+ | RRULE | 0 or 1 | |
+ | STATUS | 0 or 1 | MAY be one of |
+ | | | TENTATIVE/CONFIRMED. |
+ | SUMMARY | 0 or 1 | Can be null. |
+ | TRANSP | 0 or 1 | |
+ | URL | 0 or 1 | |
+ | IANA-PROPERTY | 0+ | |
+ | X-PROPERTY | 0+ | |
+ | | | |
+ | | | |
+ | VTIMEZONE | 0+ | MUST be present if any date/time |
+ | | | refers to a timezone. |
+ | | | |
+ | IANA-COMPONENT | 0+ | |
+ | X-COMPONENT | 0+ | |
+ | | | |
+ | VALARM | 0 | |
+ | VFREEBUSY | 0 | |
+ | | | |
+ | VJOURNAL | 0 | |
+ | | | |
+ | VTODO | 0 | |
+ +--------------------+----------+-----------------------------------+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo Standards Track [Page 36]
+
+RFC 5546 iTIP December 2009
+
+
+3.3. Methods for VFREEBUSY Components
+
+ This section defines the property set for the methods that are
+ applicable to the "VFREEBUSY" calendar component. Each of the
+ methods is defined using a restriction table.
+
+ This document only addresses the transfer of busy time information.
+ Applications desiring free time information MUST infer this from
+ available busy time information.
+
+ The "FREEBUSY" property value MAY include a list of values, separated
+ by the COMMA character (US-ASCII decimal 44). Alternately, multiple
+ busy time periods MAY be specified with multiple instances of the
+ "FREEBUSY" property. Both forms MUST be supported by implementations
+ conforming to this document. Duplicate busy time periods SHOULD NOT
+ be specified in an iCalendar object. However, two different busy
+ time periods MAY overlap.
+
+ "FREEBUSY" properties SHOULD be sorted such that their values are in
+ ascending order, based on the start time and then the end time, with
+ the earliest periods first. For example, today's busy time
+ information should appear after yesterday's busy time information.
+ And the busy time for this half-hour should appear after the busy
+ time for earlier today. Busy time periods can also span a day
+ boundary.
+
+ The following summarizes the methods that are defined for the
+ "VFREEBUSY" calendar component.
+
+ +---------+-------------------------------------+
+ | Method | Description |
+ +---------+-------------------------------------+
+ | PUBLISH | Publish unsolicited busy time data. |
+ | | |
+ | REQUEST | Request busy time data. |
+ | | |
+ | REPLY | Reply to a busy time request. |
+ +---------+-------------------------------------+
+
+3.3.1. PUBLISH
+
+ The "PUBLISH" method in a "VFREEBUSY" calendar component is used to
+ publish busy time data. The method may be sent from one CU to any
+ other. The purpose of the method is to provide a way to send
+ unsolicited busy time data. That is, the busy time data is not being
+ sent as a "REPLY" to the receipt of a "REQUEST" method.
+
+
+
+
+
+Daboo Standards Track [Page 37]
+
+RFC 5546 iTIP December 2009
+
+
+ The "ORGANIZER" property MUST be specified in the busy time
+ information. The value is the CU address of the originator of the
+ busy time information.
+
+ The busy time information within the iCalendar object MAY be grouped
+ into more than one "VFREEBUSY" calendar component. This capability
+ allows busy time periods to be grouped according to some common
+ periodicity, such as a calendar week, month, or year. In this case,
+ each "VFREEBUSY" calendar component MUST include the "ORGANIZER",
+ "DTSTART", and "DTEND" properties in order to specify the source of
+ the busy time information and the date and time interval over which
+ the busy time information covers.
+
+ This method type is an iCalendar object that conforms to the
+ following property constraints:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo Standards Track [Page 38]
+
+RFC 5546 iTIP December 2009
+
+
+ +-------------------------------------------------+
+ | Constraints for a METHOD:PUBLISH of a VFREEBUSY |
+ +-------------------------------------------------+
+
+ +--------------------+----------+-----------------------------------+
+ | Component/Property | Presence | Comment |
+ +--------------------+----------+-----------------------------------+
+ | METHOD | 1 | MUST be PUBLISH. |
+ | | | |
+ | VFREEBUSY | 1+ | |
+ | DTSTAMP | 1 | |
+ | DTSTART | 1 | DateTime values must be in UTC. |
+ | DTEND | 1 | DateTime values must be in UTC. |
+ | FREEBUSY | 0+ | MUST be BUSYTIME. Multiple |
+ | | | instances are allowed. Multiple |
+ | | | instances SHOULD be sorted in |
+ | | | ascending order. |
+ | ORGANIZER | 1 | MUST contain the address of |
+ | | | originator of busy time data. |
+ | UID | 1 | |
+ | COMMENT | 0+ | |
+ | CONTACT | 0 or 1 | |
+ | IANA-PROPERTY | 0+ | |
+ | X-PROPERTY | 0+ | |
+ | URL | 0 or 1 | Specifies busy time URL. |
+ | ATTENDEE | 0 | |
+ | DURATION | 0 | |
+ | REQUEST-STATUS | 0 | |
+ | | | |
+ | VALARM | 0 | |
+ | | | |
+ | IANA-COMPONENT | 0+ | |
+ | X-COMPONENT | 0+ | |
+ | | | |
+ | VEVENT | 0 | |
+ | | | |
+ | VTODO | 0 | |
+ | | | |
+ | VJOURNAL | 0 | |
+ | | | |
+ | VTIMEZONE | 0 | |
+ +--------------------+----------+-----------------------------------+
+
+
+
+
+
+
+
+
+
+Daboo Standards Track [Page 39]
+
+RFC 5546 iTIP December 2009
+
+
+3.3.2. REQUEST
+
+ The "REQUEST" method in a "VFREEBUSY" calendar component is used to
+ ask a "Calendar User" for their busy time information. The request
+ may be for a busy time information bounded by a specific date and
+ time interval.
+
+ This message only permits requests for busy time information. The
+ message is sent from a "Calendar User" requesting the busy time
+ information of one or more intended recipients.
+
+ If the originator of the "REQUEST" method is not authorized to make a
+ busy time request on the recipient's calendar system, then an
+ exception message SHOULD be returned in a "REPLY" method, but no busy
+ time data need be returned.
+
+ This method type is an iCalendar object that conforms to the
+ following property constraints:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo Standards Track [Page 40]
+
+RFC 5546 iTIP December 2009
+
+
+ +-------------------------------------------------+
+ | Constraints for a METHOD:REQUEST of a VFREEBUSY |
+ +-------------------------------------------------+
+
+ +--------------------+----------+-----------------------------------+
+ | Component/Property | Presence | Comment |
+ +--------------------+----------+-----------------------------------+
+ | METHOD | 1 | MUST be REQUEST. |
+ | | | |
+ | VFREEBUSY | 1 | |
+ | ATTENDEE | 1+ | Contains the calendar user |
+ | | | addresses of the "Calendar Users" |
+ | | | whose freebusy is being |
+ | | | requested. |
+ | DTEND | 1 | DateTime values must be in UTC. |
+ | DTSTAMP | 1 | |
+ | DTSTART | 1 | DateTime values must be in UTC. |
+ | ORGANIZER | 1 | MUST be the request originator's |
+ | | | address. |
+ | UID | 1 | |
+ | COMMENT | 0+ | |
+ | CONTACT | 0 or 1 | |
+ | IANA-PROPERTY | 0+ | |
+ | X-PROPERTY | 0+ | |
+ | FREEBUSY | 0 | |
+ | DURATION | 0 | |
+ | REQUEST-STATUS | 0 | |
+ | URL | 0 | |
+ | | | |
+ | VALARM | 0 | |
+ | | | |
+ | IANA-COMPONENT | 0+ | |
+ | X-COMPONENT | 0+ | |
+ | | | |
+ | VEVENT | 0 | |
+ | | | |
+ | VTODO | 0 | |
+ | | | |
+ | VJOURNAL | 0 | |
+ | | | |
+ | VTIMEZONE | 0 | |
+ +--------------------+----------+-----------------------------------+
+
+
+
+
+
+
+
+
+
+Daboo Standards Track [Page 41]
+
+RFC 5546 iTIP December 2009
+
+
+3.3.3. REPLY
+
+ The "REPLY" method in a "VFREEBUSY" calendar component is used to
+ respond to a busy time request. The method is sent by the recipient
+ of a busy time request to the originator of the request.
+
+ The "REPLY" method may also be used to respond to an unsuccessful
+ "REQUEST" method. Depending on the "REQUEST-STATUS" value, no busy
+ time information may be returned.
+
+ This method type is an iCalendar object that conforms to the
+ following property constraints:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo Standards Track [Page 42]
+
+RFC 5546 iTIP December 2009
+
+
+ +-----------------------------------------------+
+ | Constraints for a METHOD:REPLY of a VFREEBUSY |
+ +-----------------------------------------------+
+
+ +--------------------+----------+-----------------------------------+
+ | Component/Property | Presence | Comment |
+ +--------------------+----------+-----------------------------------+
+ | METHOD | 1 | MUST be REPLY. |
+ | | | |
+ | VFREEBUSY | 1 | |
+ | ATTENDEE | 1 | MUST be the address of the |
+ | | | Attendee replying. |
+ | DTSTAMP | 1 | |
+ | DTEND | 1 | DateTime values must be in UTC. |
+ | DTSTART | 1 | DateTime values must be in UTC. |
+ | FREEBUSY | 0+ | MUST be BUSYTIME. Multiple |
+ | | | instances are allowed. Multiple |
+ | | | instances SHOULD be sorted in |
+ | | | ascending order. |
+ | ORGANIZER | 1 | MUST be the request originator's |
+ | | | address. |
+ | UID | 1 | MUST be the UID of the original |
+ | | | REQUEST. |
+ | COMMENT | 0+ | |
+ | CONTACT | 0 or 1 | |
+ | REQUEST-STATUS | 0+ | |
+ | URL | 0 or 1 | Specifies busy time URL. |
+ | IANA-PROPERTY | 0+ | |
+ | X-PROPERTY | 0+ | |
+ | DURATION | 0 | |
+ | SEQUENCE | 0 | |
+ | | | |
+ | VALARM | 0 | |
+ | | | |
+ | IANA-COMPONENT | 0+ | |
+ | X-COMPONENT | 0+ | |
+ | | | |
+ | VEVENT | 0 | |
+ | | | |
+ | VTODO | 0 | |
+ | | | |
+ | VJOURNAL | 0 | |
+ | | | |
+ | VTIMEZONE | 0 | |
+ +--------------------+----------+-----------------------------------+
+
+
+
+
+
+
+Daboo Standards Track [Page 43]
+
+RFC 5546 iTIP December 2009
+
+
+3.4. Methods for VTODO Components
+
+ This section defines the property set for the methods that are
+ applicable to the "VTODO" calendar component. Each of the methods is
+ defined using a restriction table that specifies the property
+ constraints that define the particular method.
+
+ The following summarizes the methods that are defined for the "VTODO"
+ calendar component.
+
+ +----------------+--------------------------------------------------+
+ | Method | Description |
+ +----------------+--------------------------------------------------+
+ | PUBLISH | Post notification of a VTODO. Used primarily as |
+ | | a method of advertising the existence of a |
+ | | VTODO. |
+ | | |
+ | REQUEST | Assign a VTODO. This is an explicit assignment |
+ | | to one or more Calendar Users. The REQUEST |
+ | | method is also used to update or change an |
+ | | existing VTODO. Clients that cannot handle |
+ | | REQUEST MAY degrade the method to treat it as a |
+ | | PUBLISH. |
+ | | |
+ | REPLY | Reply to a VTODO request. Attendees MAY set |
+ | | PARTSTAT to ACCEPTED, DECLINED, TENTATIVE, |
+ | | DELEGATED, PARTIAL, and COMPLETED. |
+ | | |
+ | ADD | Add one or more instances to an existing to-do. |
+ | | |
+ | CANCEL | Cancel one or more instances of an existing |
+ | | to-do. |
+ | | |
+ | REFRESH | A request sent to a VTODO Organizer asking for |
+ | | the latest version of a VTODO. |
+ | | |
+ | COUNTER | Counter a REQUEST with an alternative proposal. |
+ | | |
+ | DECLINECOUNTER | Decline a counter proposal by an Attendee. |
+ +----------------+--------------------------------------------------+
+
+3.4.1. PUBLISH
+
+ The "PUBLISH" method in a "VTODO" calendar component has no
+ associated response. It is simply a posting of an iCalendar object
+ that may be added to a calendar. It MUST have an "Organizer". It
+ MUST NOT have "Attendees". Its expected usage is for encapsulating
+ an arbitrary "VTODO" calendar component as an iCalendar object. The
+
+
+
+Daboo Standards Track [Page 44]
+
+RFC 5546 iTIP December 2009
+
+
+ "Organizer" MAY subsequently update (with another "PUBLISH" method),
+ add instances to (with an "ADD" method), or cancel (with a "CANCEL"
+ method) a previously published "VTODO" calendar component.
+
+ This method type is an iCalendar object that conforms to the
+ following property constraints:
+
+ +---------------------------------------------+
+ | Constraints for a METHOD:PUBLISH of a VTODO |
+ +---------------------------------------------+
+
+ +--------------------+----------+-----------------------------------+
+ | Component/Property | Presence | Comment |
+ +--------------------+----------+-----------------------------------+
+ | METHOD | 1 | MUST be PUBLISH. |
+ | | | |
+ | VTODO | 1+ | |
+ | DTSTAMP | 1 | |
+ | DTSTART | 1 | |
+ | ORGANIZER | 1 | |
+ | PRIORITY | 1 | |
+ | SEQUENCE | 0 or 1 | MUST be present if value is |
+ | | | greater than 0; MAY be present if |
+ | | | 0. |
+ | SUMMARY | 1 | Can be null. |
+ | UID | 1 | |
+ | ATTACH | 0+ | |
+ | CATEGORIES | 0+ | |
+ | CLASS | 0 or 1 | |
+ | COMMENT | 0+ | |
+ | COMPLETED | 0 or 1 | |
+ | CONTACT | 0+ | |
+ | CREATED | 0 or 1 | |
+ | DESCRIPTION | 0 or 1 | Can be null. |
+ | DUE | 0 or 1 | If present, DURATION MUST NOT be |
+ | | | present. |
+ | DURATION | 0 or 1 | If present, DUE MUST NOT be |
+ | | | present. |
+ | EXDATE | 0+ | |
+ | GEO | 0 or 1 | |
+ | LAST-MODIFIED | 0 or 1 | |
+ | LOCATION | 0 or 1 | |
+ | PERCENT-COMPLETE | 0 or 1 | |
+ | RDATE | 0+ | |
+ | RECURRENCE-ID | 0 or 1 | Only if referring to an instance |
+ | | | of a recurring calendar |
+ | | | component. Otherwise, it MUST |
+ | | | NOT be present. |
+
+
+
+Daboo Standards Track [Page 45]
+
+RFC 5546 iTIP December 2009
+
+
+ | RELATED-TO | 0+ | |
+ | RESOURCES | 0+ | |
+ | RRULE | 0 or 1 | |
+ | STATUS | 0 or 1 | MAY be one of |
+ | | | COMPLETED/NEEDS-ACTION/ |
+ | | | IN-PROCESS/CANCELLED. |
+ | URL | 0 or 1 | |
+ | IANA-PROPERTY | 0+ | |
+ | X-PROPERTY | 0+ | |
+ | ATTENDEE | 0 | |
+ | REQUEST-STATUS | 0 | |
+ | | | |
+ | VALARM | 0+ | |
+ | | | |
+ | VTIMEZONE | 0+ | MUST be present if any date/time |
+ | | | refers to a timezone. |
+ | | | |
+ | IANA-COMPONENT | 0+ | |
+ | X-COMPONENT | 0+ | |
+ | | | |
+ | VFREEBUSY | 0 | |
+ | | | |
+ | VEVENT | 0 | |
+ | | | |
+ | VJOURNAL | 0 | |
+ +--------------------+----------+-----------------------------------+
+
+3.4.2. REQUEST
+
+ The "REQUEST" method in a "VTODO" calendar component provides the
+ following scheduling functions:
+
+ o Assign a to-do to one or more "Calendar Users".
+
+ o Reschedule an existing to-do.
+
+ o Update the details of an existing to-do, without rescheduling it.
+
+ o Update the completion status of "Attendees" of an existing to-do,
+ without rescheduling it.
+
+ o Reconfirm an existing to-do, without rescheduling it.
+
+ o Delegate/reassign an existing to-do to another "Calendar User".
+
+ The assigned "Calendar Users" are identified in the "VTODO" calendar
+ component by individual "ATTENDEE;ROLE=REQ-PARTICIPANT" property
+ value sequences.
+
+
+
+Daboo Standards Track [Page 46]
+
+RFC 5546 iTIP December 2009
+
+
+ Typically, the originator of a "REQUEST" is the "Organizer" of the
+ to-do, and the recipient of a "REQUEST" is the "Calendar User"
+ assigned the to-do. The "Attendee" uses the "REPLY" method to convey
+ their acceptance and completion status to the "Organizer" of the
+ "REQUEST".
+
+ The "UID", "SEQUENCE", and "DTSTAMP" properties are used to
+ distinguish the various uses of the "REQUEST" method. If the "UID"
+ property value in the "REQUEST" is not found on the recipient's
+ calendar, then the "REQUEST" is for a new to-do. If the "UID"
+ property value is found on the recipient's calendar, then the
+ "REQUEST" is a rescheduling, an update, or a reconfirmation of the
+ "VTODO" calendar object.
+
+ If the "Organizer" of the "REQUEST" method is not authorized to make
+ a to-do request on the "Attendee's" calendar system, then an
+ exception is returned in the "REQUEST-STATUS" property of a
+ subsequent "REPLY" method, but no scheduling action is performed.
+
+ For the "REQUEST" method, multiple "VTODO" components in a single
+ iCalendar object are only permitted for components with the same
+ "UID" property. That is, a series of recurring events may have
+ instance-specific information. In this case, multiple "VTODO"
+ components are needed to express the entire series.
+
+ This method type is an iCalendar object that conforms to the
+ following property constraints:
+
+ +---------------------------------------------+
+ | Constraints for a METHOD:REQUEST of a VTODO |
+ +---------------------------------------------+
+
+ +--------------------+----------+-----------------------------------+
+ | Component/Property | Presence | Comment |
+ +--------------------+----------+-----------------------------------+
+ | METHOD | 1 | MUST be REQUEST. |
+ | | | |
+ | VTODO | 1+ | All components must have the same |
+ | | | UID. |
+ | ATTENDEE | 1+ | |
+ | DTSTAMP | 1 | |
+ | DTSTART | 1 | |
+ | ORGANIZER | 1 | |
+ | PRIORITY | 1 | |
+ | SEQUENCE | 0 or 1 | MUST be present if value is |
+ | | | greater than 0; MAY be present if |
+ | | | 0. |
+ | SUMMARY | 1 | Can be null. |
+
+
+
+Daboo Standards Track [Page 47]
+
+RFC 5546 iTIP December 2009
+
+
+ | UID | 1 | |
+ | ATTACH | 0+ | |
+ | CATEGORIES | 0+ | |
+ | CLASS | 0 or 1 | |
+ | COMMENT | 0+ | |
+ | COMPLETED | 0 or 1 | |
+ | CONTACT | 0+ | |
+ | CREATED | 0 or 1 | |
+ | DESCRIPTION | 0 or 1 | Can be null |
+ | DUE | 0 or 1 | If present, DURATION MUST NOT be |
+ | | | present. |
+ | DURATION | 0 or 1 | If present, DUE MUST NOT be |
+ | | | present. |
+ | EXDATE | 0+ | |
+ | GEO | 0 or 1 | |
+ | LAST-MODIFIED | 0 or 1 | |
+ | LOCATION | 0 or 1 | |
+ | PERCENT-COMPLETE | 0 or 1 | |
+ | RDATE | 0+ | |
+ | RECURRENCE-ID | 0 or 1 | Only if referring to an instance |
+ | | | of a recurring calendar |
+ | | | component. Otherwise, it MUST |
+ | | | NOT be present. |
+ | RELATED-TO | 0+ | |
+ | RESOURCES | 0+ | |
+ | RRULE | 0 or 1 | |
+ | STATUS | 0 or 1 | MAY be one of |
+ | | | COMPLETED/NEEDS-ACTION/ |
+ | | | IN-PROCESS. |
+ | URL | 0 or 1 | |
+ | IANA-PROPERTY | 0+ | |
+ | X-PROPERTY | 0+ | |
+ | REQUEST-STATUS | 0 | |
+ | | | |
+ | VALARM | 0+ | |
+ | | | |
+ | VTIMEZONE | 0+ | MUST be present if any date/time |
+ | | | refers to a timezone. |
+ | | | |
+ | IANA-COMPONENT | 0+ | |
+ | X-COMPONENT | 0+ | |
+ | | | |
+ | VEVENT | 0 | |
+ | | | |
+ | VFREEBUSY | 0 | |
+ | | | |
+ | VJOURNAL | 0 | |
+ +--------------------+----------+-----------------------------------+
+
+
+
+Daboo Standards Track [Page 48]
+
+RFC 5546 iTIP December 2009
+
+
+3.4.2.1. REQUEST for Rescheduling a VTODO
+
+ The "REQUEST" method may be used to reschedule a "VTODO" calendar
+ component.
+
+ Rescheduling a "VTODO" calendar component involves a change to the
+ existing "VTODO" calendar component in terms of its start or due
+ time, recurrence intervals, and possibly the description. If the
+ recipient CUA of a "REQUEST" method finds that the "UID" property
+ value already exists on the calendar but that the "SEQUENCE" property
+ value in the "REQUEST" is greater than the value for the existing
+ "VTODO", then the "REQUEST" method describes a rescheduling of the
+ "VTODO" calendar component.
+
+3.4.2.2. REQUEST for Update or Reconfirmation of a VTODO
+
+ The "REQUEST" method may be used to update or reconfirm a "VTODO"
+ calendar component. Reconfirmation is merely an update of "Attendee"
+ completion status or overall "VTODO" calendar component status.
+
+ An update to an existing "VTODO" calendar component does not involve
+ changes to the start or due time, recurrence intervals, or
+ (generally) the description for the "VTODO" calendar component. If
+ the recipient CUA of a "REQUEST" method finds that the "UID" property
+ value already exists on the calendar and that the "SEQUENCE" property
+ value in the "REQUEST" is the same as the value for the existing
+ event, then the "REQUEST" method describes an update of the "VTODO"
+ calendar component details, but not a rescheduling of the "VTODO"
+ calendar component.
+
+ The update "REQUEST" is the appropriate response to a "REFRESH"
+ method sent from an "Attendee" to the "Organizer" of a "VTODO"
+ calendar component.
+
+ Unsolicited "REQUEST" methods MAY be sent by the "Organizer" of a
+ "VTODO" calendar component. The unsolicited "REQUEST" methods are
+ used to update the details of the "VTODO" (without rescheduling it or
+ updating the completion status of "Attendees") or the "VTODO"
+ calendar component itself (i.e., reconfirm the "VTODO").
+
+3.4.2.3. REQUEST for Delegating a VTODO
+
+ The "REQUEST" method is also used to delegate or reassign ownership
+ of a "VTODO" calendar component to another "Calendar User". For
+ example, it may be used to delegate an "Attendee's" role (i.e.,
+ "chair" or "participant") for a "VTODO" calendar component. The
+ "REQUEST" method is sent by one of the "Attendees" of an existing
+ "VTODO" calendar component to some other individual.
+
+
+
+Daboo Standards Track [Page 49]
+
+RFC 5546 iTIP December 2009
+
+
+ For the purposes of this description, the "Attendee" delegating the
+ "VTODO" calendar component is referred to as the "Delegator". The
+ "Attendee" receiving the delegation request is referred to as the
+ "Delegate".
+
+ The "Delegator" of a "VTODO" calendar component MUST forward the
+ existing "REQUEST" method for a "VTODO" calendar component to the
+ "Delegate". The "VTODO" calendar component description MUST include
+ the "Delegator's" up-to-date "VTODO" calendar component definition.
+ The "REQUEST" method MUST also include an "ATTENDEE" property with
+ the calendar address of the "Delegate". The "Delegator" MUST also
+ send a "REPLY" method back to the "Organizer" with the "Delegator's"
+ "Attendee" property "PARTSTAT" parameter value set to "DELEGATED".
+ In addition, the "DELEGATED-TO" parameter MUST be included with the
+ calendar address of the "Delegate". A response to the delegation
+ "REQUEST" is sent from the "Delegate" to the "Organizer", and
+ optionally to the "Delegator". The "REPLY" method from the
+ "Delegate" SHOULD include the "ATTENDEE" property with their calendar
+ address and the "DELEGATED-FROM" parameter with the value of the
+ "Delegator's" calendar address.
+
+ The delegation "REQUEST" method MUST assign a value for the "RSVP"
+ property parameter associated with the "Delegator's" "Attendee"
+ property to that of the "Delegate's" "ATTENDEE" property. For
+ example, if the "Delegator's" "ATTENDEE" property specifies
+ "RSVP=TRUE", then the "Delegate's" "ATTENDEE" property MUST specify
+ "RSVP=TRUE".
+
+3.4.2.4. REQUEST Forwarded to an Uninvited Calendar User
+
+ An "Attendee" assigned a "VTODO" calendar component may send the
+ "VTODO" calendar component to another new CU not previously
+ associated with the "VTODO" calendar component. The current
+ "Attendee" assigned the "VTODO" calendar component does this by
+ forwarding the original "REQUEST" method to the new CU. The new CU
+ can send a "REPLY" to the "Organizer" of the "VTODO" calendar
+ component. The reply contains an "ATTENDEE" property for the new CU.
+
+ The "Organizer" ultimately decides whether or not the new CU becomes
+ part of the to-do and is not obligated to do anything with a "REPLY"
+ from a new (uninvited) CU. If the "Organizer" does not want the new
+ CU to be part of the to-do, the new "ATTENDEE" property is not added
+ to the "VTODO" calendar component. The "Organizer" MAY send the CU a
+ "CANCEL" message to indicate that they will not be added to the to-
+ do. If the "Organizer" decides to add the new CU, the new "ATTENDEE"
+ property is added to the "VTODO" calendar component. Furthermore,
+ the "Organizer" is free to change any "ATTENDEE" property parameter
+ from the values supplied by the new CU to something the "Organizer"
+
+
+
+Daboo Standards Track [Page 50]
+
+RFC 5546 iTIP December 2009
+
+
+ considers appropriate. The "Organizer" SHOULD send the new
+ "Attendee" a "REQUEST" message to inform them that they have been
+ added.
+
+ When forwarding a "REQUEST" to another CU, the forwarding "Attendee"
+ MUST NOT make changes to the original message.
+
+3.4.2.5. REQUEST Updated Attendee Status
+
+ An "Organizer" of a "VTODO" may request an updated status from one or
+ more "Attendees". The "Organizer" sends a "REQUEST" method to the
+ "Attendee" with the "ATTENDEE;RSVP=TRUE" property sequence. The
+ "SEQUENCE" property for the "VTODO" is not changed from its previous
+ value. A recipient determines that the only change in the "REQUEST"
+ is that their "RSVP" property parameter indicates a request for an
+ updated status. The recipient SHOULD respond with a "REPLY" method
+ indicating their current status with respect to the "REQUEST".
+
+3.4.3. REPLY
+
+ The "REPLY" method in a "VTODO" calendar component is used to respond
+ (e.g., accept or decline) to a request or to reply to a delegation
+ request. It is also used by an "Attendee" to update their completion
+ status. When used to provide a delegation response, the "Delegator"
+ MUST include the calendar address of the "Delegate" in the
+ "DELEGATED-TO" parameter of the "Delegator's" "ATTENDEE" property.
+ The "Delegate" MUST include the calendar address of the "Delegator"
+ on the "DELEGATED-FROM" parameter of the "Delegate's" "ATTENDEE"
+ property.
+
+ The "REPLY" method MAY also be used to respond to an unsuccessful
+ "VTODO" calendar component "REQUEST" method. Depending on the
+ "REQUEST-STATUS" value, no scheduling action may have been performed.
+
+ The "Organizer" of a "VTODO" calendar component MAY receive a "REPLY"
+ method from a "Calendar User" not in the original "REQUEST". For
+ example, a "REPLY" method MAY be received from a "Delegate" of a
+ "VTODO" calendar component. In addition, the "REPLY" method MAY be
+ received from an unknown "Calendar User" who has been forwarded the
+ "REQUEST" by an original "Attendee" of the "VTODO" calendar
+ component. This uninvited "Attendee" MAY be accepted or the
+ "Organizer" MAY cancel the "VTODO" calendar component for the
+ uninvited "Attendee" by sending them a "CANCEL" method.
+
+ This method type is an iCalendar object that conforms to the
+ following property constraints:
+
+
+
+
+
+Daboo Standards Track [Page 51]
+
+RFC 5546 iTIP December 2009
+
+
+ +-------------------------------------------+
+ | Constraints for a METHOD:REPLY of a VTODO |
+ +-------------------------------------------+
+
+ +--------------------+----------+-----------------------------------+
+ | Component/Property | Presence | Comment |
+ +--------------------+----------+-----------------------------------+
+ | METHOD | 1 | MUST be REPLY. |
+ | | | |
+ | VTODO | 1+ | All components MUST have the same |
+ | | | UID. |
+ | ATTENDEE | 1 | MUST be the address of the |
+ | | | Attendee replying. |
+ | DTSTAMP | 1 | |
+ | ORGANIZER | 1 | |
+ | REQUEST-STATUS | 0+ | |
+ | UID | 1 | MUST be the UID of the original |
+ | | | REQUEST. |
+ | ATTACH | 0+ | |
+ | CATEGORIES | 0+ | |
+ | CLASS | 0 or 1 | |
+ | COMMENT | 0+ | |
+ | COMPLETED | 0 or 1 | |
+ | CONTACT | 0+ | |
+ | CREATED | 0 or 1 | |
+ | DESCRIPTION | 0 or 1 | |
+ | DTSTART | 0 or 1 | |
+ | DUE | 0 or 1 | If present, DURATION MUST NOT be |
+ | | | present. |
+ | DURATION | 0 or 1 | If present, DUE MUST NOT be |
+ | | | present. |
+ | EXDATE | 0+ | |
+ | GEO | 0 or 1 | |
+ | LAST-MODIFIED | 0 or 1 | |
+ | LOCATION | 0 or 1 | |
+ | PERCENT-COMPLETE | 0 or 1 | |
+ | PRIORITY | 0 or 1 | |
+ | RDATE | 0+ | |
+ | RELATED-TO | 0+ | |
+ | RESOURCES | 0+ | |
+ | RRULE | 0 or 1 | |
+ | RECURRENCE-ID | 0 or 1 | Only if referring to an instance |
+ | | | of a recurring calendar |
+ | | | component. Otherwise, it MUST |
+ | | | NOT be present. |
+ | SEQUENCE | 0 or 1 | MUST be the sequence number of |
+ | | | the original REQUEST if greater |
+ | | | than 0. MAY be present if 0. |
+
+
+
+Daboo Standards Track [Page 52]
+
+RFC 5546 iTIP December 2009
+
+
+ | STATUS | 0 or 1 | |
+ | SUMMARY | 0 or 1 | Can be null. |
+ | URL | 0 or 1 | |
+ | IANA-PROPERTY | 0+ | |
+ | X-PROPERTY | 0+ | |
+ | | | |
+ | VALARM | 0 | |
+ | | | |
+ | VTIMEZONE | 0 or 1 | MUST be present if any date/time |
+ | | | refers to a timezone. |
+ | | | |
+ | IANA-COMPONENT | 0+ | |
+ | X-COMPONENT | 0+ | |
+ | | | |
+ | VEVENT | 0 | |
+ | | | |
+ | VFREEBUSY | 0 | |
+ +--------------------+----------+-----------------------------------+
+
+3.4.4. ADD
+
+ The "ADD" method allows the "Organizer" to add one or more new
+ instances to an existing "VTODO" using a single iTIP message without
+ having to send the entire "VTODO" with all the existing instance
+ data, as it would have to do if the "REQUEST" method were used.
+
+ The "UID" must be that of the existing to-do. If the "UID" property
+ value in the "ADD" is not found on the recipient's calendar, then the
+ recipient SHOULD send a "REFRESH" to the "Organizer" in order to be
+ updated with the latest version of the "VTODO". If an "Attendee"
+ implementation does not support the "ADD" method, it should respond
+ with a "REQUEST-STATUS" value of 3.14 and ask for a "REFRESH".
+
+ When handling an "ADD" message, the "Attendee" treats each component
+ in the "ADD" message as if it were referenced via an "RDATE" in the
+ main component.
+
+ The "SEQUENCE" property value is incremented since the sequence of
+ to-dos has changed.
+
+ This method type is an iCalendar object that conforms to the
+ following property constraints:
+
+
+
+
+
+
+
+
+
+Daboo Standards Track [Page 53]
+
+RFC 5546 iTIP December 2009
+
+
+ +-----------------------------------------+
+ | Constraints for a METHOD:ADD of a VTODO |
+ +-----------------------------------------+
+
+ +--------------------+----------+-----------------------------------+
+ | Component/Property | Presence | Comment |
+ +--------------------+----------+-----------------------------------+
+ | METHOD | 1 | MUST be ADD. |
+ | | | |
+ | VTODO | 1 | |
+ | DTSTAMP | 1 | |
+ | ORGANIZER | 1 | |
+ | PRIORITY | 1 | |
+ | SEQUENCE | 1 | MUST be greater than 0. |
+ | SUMMARY | 1 | Can be null. |
+ | UID | 1 | MUST match that of the original |
+ | | | to-do. |
+ | ATTACH | 0+ | |
+ | ATTENDEE | 0+ | |
+ | CATEGORIES | 0+ | |
+ | CLASS | 0 or 1 | |
+ | COMMENT | 0+ | |
+ | COMPLETED | 0 or 1 | |
+ | CONTACT | 0+ | |
+ | CREATED | 0 or 1 | |
+ | DESCRIPTION | 0 or 1 | Can be null. |
+ | DTSTART | 0 or 1 | |
+ | DUE | 0 or 1 | If present, DURATION MUST NOT be |
+ | | | present. |
+ | DURATION | 0 or 1 | If present, DUE MUST NOT be |
+ | | | present. |
+ | GEO | 0 or 1 | |
+ | LAST-MODIFIED | 0 or 1 | |
+ | LOCATION | 0 or 1 | |
+ | PERCENT-COMPLETE | 0 or 1 | |
+ | RELATED-TO | 0+ | |
+ | RESOURCES | 0+ | |
+ | STATUS | 0 or 1 | MAY be one of |
+ | | | COMPLETED/NEEDS-ACTION/ |
+ | | | IN-PROCESS. |
+ | URL | 0 or 1 | |
+ | IANA-PROPERTY | 0+ | |
+ | X-PROPERTY | 0+ | |
+ | EXDATE | 0 | |
+ | RECURRENCE-ID | 0 | |
+ | REQUEST-STATUS | 0 | |
+ | RDATE | 0 | |
+ | RRULE | 0 | |
+
+
+
+Daboo Standards Track [Page 54]
+
+RFC 5546 iTIP December 2009
+
+
+ | | | |
+ | VALARM | 0+ | |
+ | | | |
+ | VTIMEZONE | 0+ | MUST be present if any date/time |
+ | | | refers to a timezone. |
+ | | | |
+ | IANA-COMPONENT | 0+ | |
+ | X-COMPONENT | 0+ | |
+ | | | |
+ | VEVENT | 0 | |
+ | | | |
+ | VJOURNAL | 0 | |
+ | | | |
+ | VFREEBUSY | 0 | |
+ +--------------------+----------+-----------------------------------+
+
+3.4.5. CANCEL
+
+ The "CANCEL" method in a "VTODO" calendar component is used to send a
+ cancellation notice of an existing "VTODO" calendar request to the
+ affected "Attendees". The message is sent by the "Organizer" of a
+ "VTODO" calendar component to the "Attendees" of the "VTODO" calendar
+ component. For a recurring "VTODO" calendar component, either the
+ whole "VTODO" calendar component or instances of a "VTODO" calendar
+ component may be cancelled. To cancel the complete range of a
+ recurring "VTODO" calendar component, the "UID" property value for
+ the "VTODO" calendar component MUST be specified and a "RECURRENCE-
+ ID" MUST NOT be specified in the "CANCEL" method. In order to cancel
+ an individual instance of a recurring "VTODO" calendar component, the
+ "RECURRENCE-ID" property value for the "VTODO" calendar component
+ MUST be specified in the "CANCEL" method.
+
+ There are two options for canceling a sequence of instances of a
+ recurring "VTODO" calendar component:
+
+ a. The "RECURRENCE-ID" property for an instance in the sequence MUST
+ be specified with the "RANGE" property parameter value of
+ "THISANDFUTURE" to indicate cancellation of the specified "VTODO"
+ calendar component and all instances after.
+
+ b. Individual recurrence instances may be cancelled by specifying
+ multiple "VTODO" components each with a "RECURRENCE-ID" property
+ corresponding to one of the instances to be cancelled.
+
+ The "Organizer" MUST send a "CANCEL" message to each "Attendee"
+ affected by the cancellation. This can be done by using either a
+ single "CANCEL" message for all "Attendees" or multiple messages with
+ different subsets of the affected "Attendees" in each.
+
+
+
+Daboo Standards Track [Page 55]
+
+RFC 5546 iTIP December 2009
+
+
+ When a "VTODO" is cancelled, the "SEQUENCE" property value MUST be
+ incremented as described in Section 2.1.4.
+
+ This method type is an iCalendar object that conforms to the
+ following property constraints:
+
+ +--------------------------------------------+
+ | Constraints for a METHOD:CANCEL of a VTODO |
+ +--------------------------------------------+
+
+ +--------------------+----------+-----------------------------------+
+ | Component/Property | Presence | Comment |
+ +--------------------+----------+-----------------------------------+
+ | METHOD | 1 | MUST be CANCEL. |
+ | | | |
+ | VTODO | 1+ | |
+ | ATTENDEE | 0+ | MUST include some or all |
+ | | | Attendees being removed from the |
+ | | | to-do. MUST include some or all |
+ | | | Attendees if the entire to-do is |
+ | | | cancelled. |
+ | UID | 1 | MUST echo original UID. |
+ | DTSTAMP | 1 | |
+ | ORGANIZER | 1 | |
+ | SEQUENCE | 1 | |
+ | ATTACH | 0+ | |
+ | CATEGORIES | 0+ | |
+ | CLASS | 0 or 1 | |
+ | COMMENT | 0+ | |
+ | COMPLETED | 0 or 1 | |
+ | CONTACT | 0+ | |
+ | CREATED | 0 or 1 | |
+ | DESCRIPTION | 0 or 1 | |
+ | DTSTART | 0 or 1 | |
+ | DUE | 0 or 1 | If present, DURATION MUST NOT be |
+ | | | present. |
+ | DURATION | 0 or 1 | If present, DUE MUST NOT be |
+ | | | present. |
+ | EXDATE | 0+ | |
+ | GEO | 0 or 1 | |
+ | LAST-MODIFIED | 0 or 1 | |
+ | LOCATION | 0 or 1 | |
+ | PERCENT-COMPLETE | 0 or 1 | |
+ | RDATE | 0+ | |
+
+
+
+
+
+
+
+Daboo Standards Track [Page 56]
+
+RFC 5546 iTIP December 2009
+
+
+ | RECURRENCE-ID | 0 or 1 | Only if referring to an instance |
+ | | | of a recurring calendar |
+ | | | component. Otherwise, it MUST |
+ | | | NOT be present. |
+ | RELATED-TO | 0+ | |
+ | RESOURCES | 0+ | |
+ | RRULE | 0 or 1 | |
+ | PRIORITY | 0 or 1 | |
+ | STATUS | 0 or 1 | MUST be set to CANCELLED to |
+ | | | cancel the entire VTODO. If |
+ | | | removing specific Attendees, then |
+ | | | MUST NOT be included. |
+ | URL | 0 or 1 | |
+ | IANA-PROPERTY | 0+ | |
+ | X-PROPERTY | 0+ | |
+ | REQUEST-STATUS | 0 | |
+ | | | |
+ | VALARM | 0 | |
+ | | | |
+ | VTIMEZONE | 0 or 1 | MUST be present if any date/time |
+ | | | refers to a timezone. |
+ | | | |
+ | IANA-COMPONENT | 0+ | |
+ | X-COMPONENT | 0+ | |
+ | | | |
+ | VEVENT | 0 | |
+ | | | |
+ | VFREEBUSY | 0 | |
+ +--------------------+----------+-----------------------------------+
+
+3.4.6. REFRESH
+
+ The "REFRESH" method in a "VTODO" calendar component is used by
+ "Attendees" of an existing "VTODO" calendar component to request an
+ updated description from the "Organizer" of the "VTODO" calendar
+ component. The "Organizer" of the "VTODO" calendar component MAY use
+ this method to request an updated status from the "Attendees". The
+ "REFRESH" method MUST specify the "UID" property corresponding to the
+ "VTODO" calendar component needing update.
+
+ A refresh of a recurrence instance of a "VTODO" calendar component
+ may be requested by specifying the "RECURRENCE-ID" property
+ corresponding to the associated "VTODO" calendar component. The
+ "Organizer" responds with the latest description and rendition of the
+ "VTODO" calendar component. In most cases, this will be a "REQUEST"
+ unless the "VTODO" has been cancelled, in which case the "Organizer"
+ MUST send a "CANCEL". This method is intended to facilitate machine
+ processing of requests for updates to a "VTODO" calendar component.
+
+
+
+Daboo Standards Track [Page 57]
+
+RFC 5546 iTIP December 2009
+
+
+ This method type is an iCalendar object that conforms to the
+ following property constraints:
+
+ +---------------------------------------------+
+ | Constraints for a METHOD:REFRESH of a VTODO |
+ +---------------------------------------------+
+
+ +--------------------+----------+-----------------------------------+
+ | Component/Property | Presence | Comment |
+ +--------------------+----------+-----------------------------------+
+ | METHOD | 1 | MUST be REFRESH. |
+ | | | |
+ | VTODO | 1 | |
+ | ATTENDEE | 1 | |
+ | DTSTAMP | 1 | |
+ | UID | 1 | MUST echo original UID. |
+ | RECURRENCE-ID | 0 or 1 | Only if referring to an instance |
+ | | | of a recurring calendar |
+ | | | component. Otherwise, it MUST |
+ | | | NOT be present. |
+ | IANA-PROPERTY | 0+ | |
+ | X-PROPERTY | 0+ | |
+ | ATTACH | 0 | |
+ | CATEGORIES | 0 | |
+ | CLASS | 0 | |
+ | COMMENT | 0 | |
+ | COMPLETED | 0 | |
+ | CONTACT | 0 | |
+ | CREATED | 0 | |
+ | DESCRIPTION | 0 | |
+ | DTSTART | 0 | |
+ | DUE | 0 | |
+ | DURATION | 0 | |
+ | EXDATE | 0 | |
+ | GEO | 0 | |
+ | LAST-MODIFIED | 0 | |
+ | LOCATION | 0 | |
+ | ORGANIZER | 0 | |
+ | PERCENT-COMPLETE | 0 | |
+ | PRIORITY | 0 | |
+ | RDATE | 0 | |
+ | RELATED-TO | 0 | |
+ | REQUEST-STATUS | 0 | |
+ | RESOURCES | 0 | |
+ | RRULE | 0 | |
+ | SEQUENCE | 0 | |
+ | STATUS | 0 | |
+ | URL | 0 | |
+
+
+
+Daboo Standards Track [Page 58]
+
+RFC 5546 iTIP December 2009
+
+
+ | | | |
+ | VALARM | 0 | |
+ | | | |
+ | VTIMEZONE | 0+ | |
+ | | | |
+ | IANA-COMPONENT | 0+ | |
+ | X-COMPONENT | 0+ | |
+ | | | |
+ | VEVENT | 0 | |
+ | | | |
+ | VFREEBUSY | 0 | |
+ +--------------------+----------+-----------------------------------+
+
+3.4.7. COUNTER
+
+ The "COUNTER" method in a "VTODO" calendar component is used by an
+ "Attendee" of an existing "VTODO" calendar component to submit to the
+ "Organizer" a counter proposal for the "VTODO" calendar component.
+
+ The counter proposal is an iCalendar object consisting of a "VTODO"
+ calendar component that provides the complete description of the
+ alternate "VTODO" calendar component.
+
+ The "Organizer" rejects the counter proposal by sending the
+ "Attendee" a "DECLINECOUNTER" method. The "Organizer" accepts the
+ counter proposal by rescheduling the to-do as described in
+ Section 3.4.2.1, "REQUEST for Rescheduling a To-Do". The
+ "Organizer's" CUA SHOULD send a "REQUEST" message to all "Attendees"
+ affected by any change triggered by an accepted "COUNTER".
+
+ This method type is an iCalendar object that conforms to the
+ following property constraints:
+
+ +---------------------------------------------+
+ | Constraints for a METHOD:COUNTER of a VTODO |
+ +---------------------------------------------+
+
+ +--------------------+----------+-----------------------------------+
+ | Component/Property | Presence | Comment |
+ +--------------------+----------+-----------------------------------+
+ | METHOD | 1 | MUST be COUNTER. |
+ | | | |
+ | VTODO | 1 | |
+ | ATTENDEE | 1+ | |
+ | DTSTAMP | 1 | |
+ | ORGANIZER | 1 | |
+ | PRIORITY | 1 | |
+ | SUMMARY | 1 | Can be null. |
+
+
+
+Daboo Standards Track [Page 59]
+
+RFC 5546 iTIP December 2009
+
+
+ | UID | 1 | |
+ | ATTACH | 0+ | |
+ | CATEGORIES | 0+ | |
+ | CLASS | 0 or 1 | |
+ | COMMENT | 0+ | |
+ | COMPLETED | 0 or 1 | |
+ | CONTACT | 0+ | |
+ | CREATED | 0 or 1 | |
+ | DESCRIPTION | 0 or 1 | Can be null. |
+ | DTSTART | 0 or 1 | |
+ | DUE | 0 or 1 | If present, DURATION MUST NOT be |
+ | | | present. |
+ | DURATION | 0 or 1 | If present, DUE MUST NOT be |
+ | | | present. |
+ | EXDATE | 0+ | |
+ | GEO | 0 or 1 | |
+ | LAST-MODIFIED | 0 or 1 | |
+ | LOCATION | 0 or 1 | |
+ | PERCENT-COMPLETE | 0 or 1 | |
+ | RDATE | 0+ | |
+ | RECURRENCE-ID | 0 or 1 | Only if referring to an instance |
+ | | | of a recurring calendar |
+ | | | component. Otherwise, it MUST |
+ | | | NOT be present. |
+ | RELATED-TO | 0+ | |
+ | REQUEST-STATUS | 0+ | |
+ | RESOURCES | 0+ | |
+ | RRULE | 0 or 1 | |
+ | SEQUENCE | 0 or 1 | MUST echo the original SEQUENCE |
+ | | | number. MUST be present if |
+ | | | non-zero. MAY be present if |
+ | | | zero. |
+ | STATUS | 0 or 1 | MAY be one of |
+ | | | COMPLETED/NEEDS-ACTION/ |
+ | | | IN-PROCESS/CANCELLED. |
+ | URL | 0 or 1 | |
+ | IANA-PROPERTY | 0+ | |
+ | X-PROPERTY | 0+ | |
+ | | | |
+ | VALARM | 0+ | |
+ | | | |
+ | VTIMEZONE | 0 or 1 | MUST be present if any date/time |
+ | | | refers to a timezone. |
+ | | | |
+ | IANA-COMPONENT | 0+ | |
+ | X-COMPONENT | 0+ | |
+ | | | |
+
+
+
+
+Daboo Standards Track [Page 60]
+
+RFC 5546 iTIP December 2009
+
+
+ | VEVENT | 0 | |
+ | | | |
+ | VFREEBUSY | 0 | |
+ +--------------------+----------+-----------------------------------+
+
+3.4.8. DECLINECOUNTER
+
+ The "DECLINECOUNTER" method in a "VTODO" calendar component is used
+ by an "Organizer" of the "VTODO" calendar component to reject a
+ counter proposal offered by one of the "Attendees". The "Organizer"
+ sends the message to the "Attendee" that sent the "COUNTER" method to
+ the "Organizer".
+
+ This method type is an iCalendar object that conforms to the
+ following property constraints:
+
+ +----------------------------------------------------+
+ | Constraints for a METHOD:DECLINECOUNTER of a VTODO |
+ +----------------------------------------------------+
+
+ +--------------------+----------+-----------------------------------+
+ | Component/Property | Presence | Comment |
+ +--------------------+----------+-----------------------------------+
+ | METHOD | 1 | MUST be DECLINECOUNTER. |
+ | | | |
+ | VTODO | 1 | |
+ | ATTENDEE | 1+ | MUST for all ATTENDEEs. |
+ | DTSTAMP | 1 | |
+ | ORGANIZER | 1 | |
+ | SEQUENCE | 1 | MUST echo the original SEQUENCE |
+ | | | number. |
+ | UID | 1 | MUST echo original UID. |
+ | ATTACH | 0+ | |
+ | CATEGORIES | 0+ | |
+ | CLASS | 0 or 1 | |
+ | COMMENT | 0+ | |
+ | COMPLETED | 0 or 1 | |
+ | CONTACT | 0+ | |
+ | CREATED | 0 or 1 | |
+ | DESCRIPTION | 0 or 1 | |
+ | DTSTART | 0 or 1 | |
+ | DUE | 0 or 1 | If present, DURATION MUST NOT be |
+ | | | present. |
+ | DURATION | 0 or 1 | If present, DUE MUST NOT be |
+ | | | present. |
+ | EXDATE | 0+ | |
+ | GEO | 0 or 1 | |
+ | LAST-MODIFIED | 0 or 1 | |
+
+
+
+Daboo Standards Track [Page 61]
+
+RFC 5546 iTIP December 2009
+
+
+ | LOCATION | 0 or 1 | |
+ | PERCENT-COMPLETE | 0 or 1 | |
+ | PRIORITY | 0 or 1 | |
+ | RDATE | 0+ | |
+ | RECURRENCE-ID | 0 or 1 | Only if referring to an instance |
+ | | | of a recurring calendar |
+ | | | component. Otherwise, it MUST |
+ | | | NOT be present. |
+ | RELATED-TO | 0+ | |
+ | REQUEST-STATUS | 0+ | |
+ | RESOURCES | 0+ | |
+ | RRULE | 0 or 1 | |
+ | STATUS | 0 or 1 | MAY be one of |
+ | | | COMPLETED/NEEDS-ACTION/ |
+ | | | IN-PROCESS. |
+ | URL | 0 or 1 | |
+ | IANA-PROPERTY | 0+ | |
+ | X-PROPERTY | 0+ | |
+ | | | |
+ | VALARM | 0 | |
+ | | | |
+ | VTIMEZONE | 0+ | MUST be present if any date/time |
+ | | | refers to a timezone. |
+ | | | |
+ | IANA-COMPONENT | 0+ | |
+ | X-COMPONENT | 0+ | |
+ | | | |
+ | VEVENT | 0 | |
+ | | | |
+ | VFREEBUSY | 0 | |
+ +--------------------+----------+-----------------------------------+
+
+3.5. Methods for VJOURNAL Components
+
+ This section defines the property set for the methods that are
+ applicable to the "VJOURNAL" calendar component.
+
+ The following summarizes the methods that are defined for the
+ "VJOURNAL" calendar component.
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo Standards Track [Page 62]
+
+RFC 5546 iTIP December 2009
+
+
+ +---------+---------------------------------------------------------+
+ | Method | Description |
+ +---------+---------------------------------------------------------+
+ | PUBLISH | Post a journal entry. Used primarily as a method of |
+ | | advertising the existence of a journal entry. |
+ | | |
+ | ADD | Add one or more instances to an existing journal entry. |
+ | | |
+ | CANCEL | Cancel one or more instances of an existing journal |
+ | | entry. |
+ +---------+---------------------------------------------------------+
+
+3.5.1. PUBLISH
+
+ The "PUBLISH" method in a "VJOURNAL" calendar component has no
+ associated response. It is simply a posting of an iCalendar object
+ that may be added to a calendar. It MUST have an "Organizer". It
+ MUST NOT have "Attendees". The expected usage is for encapsulating
+ an arbitrary journal entry as an iCalendar object. The "Organizer"
+ MAY subsequently update (with another "PUBLISH" method) or cancel
+ (with a "CANCEL" method) a previously published journal entry.
+
+ This method type is an iCalendar object that conforms to the
+ following property constraints:
+
+ +------------------------------------------------+
+ | Constraints for a METHOD:PUBLISH of a VJOURNAL |
+ +------------------------------------------------+
+
+ +--------------------+----------+-----------------------------------+
+ | Component/Property | Presence | Comment |
+ +--------------------+----------+-----------------------------------+
+ | METHOD | 1 | MUST be PUBLISH. |
+ | | | |
+ | VJOURNAL | 1+ | |
+ | DESCRIPTION | 1 | Can be null. |
+ | DTSTAMP | 1 | |
+ | DTSTART | 1 | |
+ | ORGANIZER | 1 | |
+ | UID | 1 | |
+ | ATTACH | 0+ | |
+ | CATEGORIES | 0+ | |
+ | CLASS | 0 or 1 | |
+ | COMMENT | 0+ | |
+ | CONTACT | 0+ | |
+ | CREATED | 0 or 1 | |
+ | EXDATE | 0+ | |
+ | LAST-MODIFIED | 0 or 1 | |
+
+
+
+Daboo Standards Track [Page 63]
+
+RFC 5546 iTIP December 2009
+
+
+ | RDATE | 0+ | |
+ | RECURRENCE-ID | 0 or 1 | Only if referring to an instance |
+ | | | of a recurring calendar |
+ | | | component. Otherwise, it MUST |
+ | | | NOT be present. |
+ | RELATED-TO | 0+ | |
+ | RRULE | 0 or 1 | |
+ | SEQUENCE | 0 or 1 | MUST be present if non-zero. MAY |
+ | | | be present if zero. |
+ | STATUS | 0 or 1 | MAY be one of |
+ | | | DRAFT/FINAL/CANCELLED. |
+ | SUMMARY | 0 or 1 | Can be null. |
+ | URL | 0 or 1 | |
+ | IANA-PROPERTY | 0+ | |
+ | X-PROPERTY | 0+ | |
+ | ATTENDEE | 0 | |
+ | REQUEST-STATUS | 0 | |
+ | | | |
+ | VALARM | 0+ | |
+ | | | |
+ | VTIMEZONE | 0+ | MUST be present if any date/time |
+ | | | refers to a timezone. |
+ | | | |
+ | IANA-COMPONENT | 0+ | |
+ | X-COMPONENT | 0+ | |
+ | | | |
+ | VEVENT | 0 | |
+ | | | |
+ | VFREEBUSY | 0 | |
+ | | | |
+ | VTODO | 0 | |
+ +--------------------+----------+-----------------------------------+
+
+3.5.2. ADD
+
+ The "ADD" method allows the "Organizer" to add one or more new
+ instances to an existing "VJOURNAL" using a single iTIP message
+ without having to send the entire "VJOURNAL" with all the existing
+ instance data, as it would have to do if the "REQUEST" method were
+ used.
+
+ The "UID" must be that of the existing journal entry. If the "UID"
+ property value in the "ADD" is not found on the recipient's calendar,
+ then the recipient MAY treat the "ADD" as a "PUBLISH".
+
+ When handling an "ADD" message, the "Attendee" treats each component
+ in the "ADD" message as if it were referenced via an "RDATE" in the
+ main component. There is no response to the "Organizer".
+
+
+
+Daboo Standards Track [Page 64]
+
+RFC 5546 iTIP December 2009
+
+
+ This method type is an iCalendar object that conforms to the
+ following property constraints:
+
+ +--------------------------------------------+
+ | Constraints for a METHOD:ADD of a VJOURNAL |
+ +--------------------------------------------+
+
+ +--------------------+----------+-----------------------------------+
+ | Component/Property | Presence | Comment |
+ +--------------------+----------+-----------------------------------+
+ | METHOD | 1 | MUST be ADD. |
+ | | | |
+ | VJOURNAL | 1 | |
+ | DESCRIPTION | 1 | Can be null. |
+ | DTSTAMP | 1 | |
+ | DTSTART | 1 | |
+ | ORGANIZER | 1 | |
+ | SEQUENCE | 1 | MUST be greater than 0. |
+ | UID | 1 | MUST match that of the original |
+ | | | journal. |
+ | ATTACH | 0+ | |
+ | CATEGORIES | 0+ | |
+ | CLASS | 0 or 1 | |
+ | COMMENT | 0+ | |
+ | CONTACT | 0+ | |
+ | CREATED | 0 or 1 | |
+ | LAST-MODIFIED | 0 or 1 | |
+ | RELATED-TO | 0+ | |
+ | STATUS | 0 or 1 | MAY be one of |
+ | | | DRAFT/FINAL/CANCELLED. |
+ | SUMMARY | 0 or 1 | Can be null. |
+ | URL | 0 or 1 | |
+ | IANA-PROPERTY | 0+ | |
+ | X-PROPERTY | 0+ | |
+ | ATTENDEE | 0 | |
+ | EXDATE | 0 | |
+ | RECURRENCE-ID | 0 | |
+ | REQUEST-STATUS | 0 | |
+ | RDATE | 0 | |
+ | RRULE | 0 | |
+ | | | |
+ | VALARM | 0+ | |
+ | | | |
+ | VTIMEZONE | 0 or 1 | MUST be present if any date/time |
+ | | | refers to a timezone. |
+ | | | |
+ | IANA-COMPONENT | 0+ | |
+ | X-COMPONENT | 0+ | |
+
+
+
+Daboo Standards Track [Page 65]
+
+RFC 5546 iTIP December 2009
+
+
+ | | | |
+ | VEVENT | 0 | |
+ | | | |
+ | VFREEBUSY | 0 | |
+ | | | |
+ | VTODO | 0 | |
+ +--------------------+----------+-----------------------------------+
+
+3.5.3. CANCEL
+
+ The "CANCEL" method in a "VJOURNAL" calendar component is used to
+ send a cancellation notice of an existing journal entry. The message
+ is sent by the "Organizer" of a journal entry. For a recurring
+ journal entry, either the whole journal entry or instances of a
+ journal entry may be cancelled. To cancel the complete range of a
+ recurring journal entry, the "UID" property value for the journal
+ entry MUST be specified and a "RECURRENCE-ID" property MUST NOT be
+ specified in the "CANCEL" method. In order to cancel an individual
+ instance of the journal entry, the "RECURRENCE-ID" property value for
+ the journal entry MUST be specified in the "CANCEL" method.
+
+ There are two options for canceling a sequence of instances of a
+ recurring "VJOURNAL" calendar component:
+
+ a. The "RECURRENCE-ID" property for an instance in the sequence MUST
+ be specified with the "RANGE" property parameter value of
+ "THISANDFUTURE" to indicate cancellation of the specified
+ "VJOURNAL" calendar component and all instances after.
+
+ b. Individual recurrence instances may be cancelled by specifying
+ multiple "VJOURNAL" components each with a "RECURRENCE-ID"
+ property corresponding to one of the instances to be cancelled.
+
+ When a "VJOURNAL" is cancelled, the "SEQUENCE" property value MUST be
+ incremented as described in Section 2.1.4.
+
+ This method type is an iCalendar object that conforms to the
+ following property constraints:
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo Standards Track [Page 66]
+
+RFC 5546 iTIP December 2009
+
+
+ +-----------------------------------------------+
+ | Constraints for a METHOD:CANCEL of a VJOURNAL |
+ +-----------------------------------------------+
+
+ +--------------------+----------+-----------------------------------+
+ | Component/Property | Presence | Comment |
+ +--------------------+----------+-----------------------------------+
+ | METHOD | 1 | MUST be CANCEL. |
+ | | | |
+ | VJOURNAL | 1+ | All MUST have the same UID. |
+ | DTSTAMP | 1 | |
+ | ORGANIZER | 1 | |
+ | SEQUENCE | 1 | |
+ | UID | 1 | MUST be the UID of the original |
+ | | | REQUEST. |
+ | ATTACH | 0+ | |
+ | ATTENDEE | 0 | |
+ | CATEGORIES | 0+ | |
+ | CLASS | 0 or 1 | |
+ | COMMENT | 0+ | |
+ | CONTACT | 0+ | |
+ | CREATED | 0 or 1 | |
+ | DESCRIPTION | 0 or 1 | |
+ | DTSTART | 0 or 1 | |
+ | EXDATE | 0+ | |
+ | LAST-MODIFIED | 0 or 1 | |
+ | RDATE | 0+ | |
+ | RECURRENCE-ID | 0 or 1 | Only if referring to an instance |
+ | | | of a recurring calendar |
+ | | | component. Otherwise, it MUST |
+ | | | NOT be present. |
+ | RELATED-TO | 0+ | |
+ | RRULE | 0 or 1 | |
+ | STATUS | 0 or 1 | MAY be present; MUST be CANCELLED |
+ | | | if present. |
+ | SUMMARY | 0 or 1 | |
+ | URL | 0 or 1 | |
+ | IANA-PROPERTY | 0+ | |
+ | X-PROPERTY | 0+ | |
+ | REQUEST-STATUS | 0 | |
+ | | | |
+ | VALARM | 0 | |
+ | | | |
+ | VTIMEZONE | 0+ | MUST be present if any date/time |
+ | | | refers to a timezone. |
+ | | | |
+ | IANA-COMPONENT | 0+ | |
+ | X-COMPONENT | 0+ | |
+
+
+
+Daboo Standards Track [Page 67]
+
+RFC 5546 iTIP December 2009
+
+
+ | | | |
+ | VEVENT | 0 | |
+ | | | |
+ | VFREEBUSY | 0 | |
+ | | | |
+ | VTODO | 0 | |
+ +--------------------+----------+-----------------------------------+
+
+3.6. Status Replies
+
+ The "REQUEST-STATUS" property is used to convey status information
+ about a "REPLY", "COUNTER", or "DECLINECOUNTER" iTIP message. The
+ codes listed in the table below SHOULD be used. If the "REQUEST-
+ STATUS" property is not present in one of these iTIP messages, then a
+ status code of "2.0" (success) MUST be assumed.
+
+ This specification adds a new IANA registry for "REQUEST-STATUS"
+ property values, as defined in Section 7, which includes a new
+ registration template for defining the specific components of the
+ "REQUEST-STATUS" property value. Additional codes MAY be used,
+ provided the process described in Section 8.2.1 of [RFC5545] is used
+ to register them.
+
+ This specification allows for multiple "REQUEST-STATUS" properties to
+ be returned in iCalendar components in the appropriate iTIP messages.
+ When multiple "REQUEST-STATUS" properties are present, the following
+ restrictions apply:
+
+ 1. Within any one component, the "top-level" numeric value of the
+ "short return status code" MUST be the same for all "REQUEST-
+ STATUS" properties, i.e., there cannot be a mixture of, e.g.,
+ 2.xx and 5.xx codes within a single component.
+
+ 2. Across all components in the iTIP message, the following applies:
+
+ A. If any one component would have a 5.xx code, then either all
+ components MUST have a code in that range or "REQUEST-STATUS"
+ MUST NOT be present in the other components if a 5.xx code is
+ not appropriate for those components.
+
+ B. Otherwise, if any one component would have a 3.xx code, then
+ either all components MUST have a code in that range or
+ "REQUEST-STATUS" MUST NOT be present in the other components
+ if a 3.xx code is not appropriate for those components.
+
+ C. 2.xx and 4.xx codes can be used in different components,
+ provided that each component follows the restriction in (1)
+ above.
+
+
+
+Daboo Standards Track [Page 68]
+
+RFC 5546 iTIP December 2009
+
+
+ The following "REQUEST-STATUS" codes are defined (any "Offending
+ Data" MAY be specified in the "REQUEST-STATUS" value as the extdata
+ field):
+
+3.6.1. Status Code 2.0
+
+ Status Code: 2.0
+
+ Status Description: Success.
+
+ Status Exception Data: None.
+
+ Description: iTIP operation succeeded.
+
+3.6.2. Status Code 2.1
+
+ Status Code: 2.1
+
+ Status Description: Success, but fallback taken on one or more
+ property values.
+
+ Status Exception Data: Property name and value MAY be specified.
+
+ Description: iTIP operation succeeded with fallback on one or more
+ property values.
+
+3.6.3. Status Code 2.2
+
+ Status Code: 2.2
+
+ Status Description: Success; invalid property ignored.
+
+ Status Exception Data: Property name MAY be specified.
+
+ Description: iTIP operation succeeded but a property was ignored.
+
+3.6.4. Status Code 2.3
+
+ Status Code: 2.3
+
+ Status Description: Success; invalid property parameter ignored.
+
+ Status Exception Data: Property parameter name and value MAY be
+ specified.
+
+ Description: iTIP operation succeeded but a property parameter was
+ ignored because it was invalid.
+
+
+
+
+Daboo Standards Track [Page 69]
+
+RFC 5546 iTIP December 2009
+
+
+3.6.5. Status Code 2.4
+
+ Status Code: 2.4
+
+ Status Description: Success; unknown, non-standard property ignored.
+
+ Status Exception Data: Non-standard property name MAY be specified.
+
+ Description: iTIP operation succeeded but a property parameter was
+ ignored because it was unknown.
+
+3.6.6. Status Code 2.5
+
+ Status Code: 2.5
+
+ Status Description: Success; unknown, non-standard property value
+ ignored.
+
+ Status Exception Data: Property and non-standard value MAY be
+ specified.
+
+ Description: iTIP operation succeeded but a property was ignored
+ because its value was unknown.
+
+3.6.7. Status Code 2.6
+
+ Status Code: 2.6
+
+ Status Description: Success; invalid calendar component ignored.
+
+ Status Exception Data: Calendar component sentinel (e.g., BEGIN:
+ ALARM) MAY be specified.
+
+ Description: iTIP operation succeeded but a component was ignored
+ because it was invalid.
+
+3.6.8. Status Code 2.7
+
+ Status Code: 2.7
+
+ Status Description: Success; request forwarded to Calendar User.
+
+ Status Exception Data: Original and forwarded calendar user
+ addresses MAY be specified.
+
+ Description: iTIP operation succeeded, and the request was forwarded
+ to another Calendar User.
+
+
+
+
+Daboo Standards Track [Page 70]
+
+RFC 5546 iTIP December 2009
+
+
+3.6.9. Status Code 2.8
+
+ Status Code: 2.8
+
+ Status Description: Success; repeating event ignored. Scheduled as
+ a single component.
+
+ Status Exception Data: RRULE or RDATE property name and value MAY be
+ specified.
+
+ Description: iTIP operation succeeded but a repeating event was
+ truncated to a single instance.
+
+3.6.10. Status Code 2.9
+
+ Status Code: 2.9
+
+ Status Description: Success; truncated end date time to date
+ boundary.
+
+ Status Exception Data: DTEND property value MAY be specified.
+
+ Description: iTIP operation succeeded but the end time was truncated
+ to a date boundary.
+
+3.6.11. Status Code 2.10
+
+ Status Code: 2.10
+
+ Status Description: Success; repeating VTODO ignored. Scheduled as
+ a single VTODO.
+
+ Status Exception Data: RRULE or RDATE property name and value MAY be
+ specified.
+
+ Description: iTIP operation succeeded but a repeating to-do was
+ truncated to a single instance.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo Standards Track [Page 71]
+
+RFC 5546 iTIP December 2009
+
+
+3.6.12. Status Code 2.11
+
+ Status Code: 2.11
+
+ Status Description: Success; unbounded RRULE clipped at some finite
+ number of instances.
+
+ Status Exception Data: RRULE property name and value MAY be
+ specified. Number of instances MAY also be specified.
+
+ Description: iTIP operation succeeded but an unbounded repeating
+ object was clipped to a finite number of instances.
+
+3.6.13. Status Code 3.0
+
+ Status Code: 3.0
+
+ Status Description: Invalid property name.
+
+ Status Exception Data: Property name MAY be specified.
+
+ Description: iTIP operation failed because of an invalid property
+ name.
+
+3.6.14. Status Code 3.1
+
+ Status Code: 3.1
+
+ Status Description: Invalid property value.
+
+ Status Exception Data: Property name and value MAY be specified.
+
+ Description: iTIP operation failed because of an invalid property
+ value.
+
+3.6.15. Status Code 3.2
+
+ Status Code: 3.2
+
+ Status Description: Invalid property parameter.
+
+ Status Exception Data: Property parameter name and value MAY be
+ specified.
+
+ Description: iTIP operation failed because of an invalid property
+ parameter.
+
+
+
+
+
+Daboo Standards Track [Page 72]
+
+RFC 5546 iTIP December 2009
+
+
+3.6.16. Status Code 3.3
+
+ Status Code: 3.3
+
+ Status Description: Invalid property parameter value.
+
+ Status Exception Data: Property parameter name and value MAY be
+ specified.
+
+ Description: iTIP operation failed because of an invalid property
+ parameter value.
+
+3.6.17. Status Code 3.4
+
+ Status Code: 3.4
+
+ Status Description: Invalid calendar component sequence.
+
+ Status Exception Data: Calendar component sentinel MAY be specified
+ (e.g., BEGIN:VTIMEZONE).
+
+ Description: iTIP operation failed because of an invalid component.
+
+3.6.18. Status Code 3.5
+
+ Status Code: 3.5
+
+ Status Description: Invalid date or time.
+
+ Status Exception Data: Date/time value(s) MAY be specified.
+
+ Description: iTIP operation failed because of an invalid date or
+ time property.
+
+3.6.19. Status Code 3.6
+
+ Status Code: 3.6
+
+ Status Description: Invalid rule.
+
+ Status Exception Data: RRULE property value MAY be specified.
+
+ Description: iTIP operation failed because of an invalid rule
+ property.
+
+
+
+
+
+
+
+Daboo Standards Track [Page 73]
+
+RFC 5546 iTIP December 2009
+
+
+3.6.20. Status Code 3.7
+
+ Status Code: 3.7
+
+ Status Description: Invalid Calendar User.
+
+ Status Exception Data: ATTENDEE property value MAY be specified.
+
+ Description: iTIP operation failed because of an invalid ATTENDEE
+ property.
+
+3.6.21. Status Code 3.8
+
+ Status Code: 3.8
+
+ Status Description: No authority.
+
+ Status Exception Data: METHOD and ATTENDEE property values MAY be
+ specified.
+
+ Description: iTIP operation failed because an Attendee does not have
+ suitable privileges for the operation.
+
+3.6.22. Status Code 3.9
+
+ Status Code: 3.9
+
+ Status Description: Unsupported version.
+
+ Status Exception Data: VERSION property name and value MAY be
+ specified.
+
+ Description: iTIP operation failed because the calendar data version
+ is not supported.
+
+3.6.23. Status Code 3.10
+
+ Status Code: 3.10
+
+ Status Description: Request entity too large.
+
+ Status Exception Data: None.
+
+ Description: iTIP operation failed because the calendar data was too
+ large.
+
+
+
+
+
+
+Daboo Standards Track [Page 74]
+
+RFC 5546 iTIP December 2009
+
+
+3.6.24. Status Code 3.11
+
+ Status Code: 3.11
+
+ Status Description: Required component or property missing.
+
+ Status Exception Data: Component or property name MAY be specified.
+
+ Description: iTIP operation failed because the calendar data did not
+ contain a required property or component.
+
+3.6.25. Status Code 3.12
+
+ Status Code: 3.12
+
+ Status Description: Unknown component or property found.
+
+ Status Exception Data: Component or property name MAY be specified.
+
+ Description: iTIP operation failed because the calendar data
+ contained an unknown property or component.
+
+3.6.26. Status Code 3.13
+
+ Status Code: 3.13
+
+ Status Description: Unsupported component or property found.
+
+ Status Exception Data: Component or property name MAY be specified.
+
+ Description: iTIP operation failed because the calendar data
+ contained an unsupported property or component.
+
+3.6.27. Status Code 3.14
+
+ Status Code: 3.14
+
+ Status Description: Unsupported capability.
+
+ Status Exception Data: METHOD or action MAY be specified.
+
+ Description: iTIP operation failed because the operation is not
+ supported.
+
+
+
+
+
+
+
+
+Daboo Standards Track [Page 75]
+
+RFC 5546 iTIP December 2009
+
+
+3.6.28. Status Code 4.0
+
+ Status Code: 4.0
+
+ Status Description: Event conflict. Date/time is busy.
+
+ Status Exception Data: DTSTART and DTEND property names and values
+ MAY be specified.
+
+ Description: iTIP operation failed because the event overlaps the
+ date and time of another event.
+
+3.6.29. Status Code 5.0
+
+ Status Code: 5.0
+
+ Status Description: Request not supported.
+
+ Status Exception Data: METHOD property value MAY be specified.
+
+ Description: iTIP operation failed because the operation is not
+ supported.
+
+3.6.30. Status Code 5.1
+
+ Status Code: 5.1
+
+ Status Description: Service unavailable.
+
+ Status Exception Data: ATTENDEE property value MAY be specified.
+
+ Description: iTIP operation failed because scheduling is not active.
+
+3.6.31. Status Code 5.2
+
+ Status Code: 5.2
+
+ Status Description: Invalid calendar service.
+
+ Status Exception Data: ATTENDEE property value MAY be specified.
+
+ Description: iTIP operation failed because there is no scheduling
+ capability.
+
+
+
+
+
+
+
+
+Daboo Standards Track [Page 76]
+
+RFC 5546 iTIP December 2009
+
+
+3.6.32. Status Code 5.3
+
+ Status Code: 5.3
+
+ Status Description: No scheduling support for user.
+
+ Status Exception Data: ATTENDEE property value MAY be specified.
+
+ Description: iTIP operation failed because scheduling is not enabled
+ for an Attendee.
+
+3.7. Implementation Considerations
+
+3.7.1. Working With Recurrence Instances
+
+ iCalendar includes a recurrence grammar to represent recurring
+ events. The benefit of such a grammar is the ability to represent a
+ number of events in a single object. However, while this simplifies
+ creation of a recurring event, meeting instances still need to be
+ referenced. For instance, an "Attendee" may decline the third
+ instance of a recurring Friday event. Similarly, the "Organizer" may
+ change the time or location to a single instance of the recurring
+ event.
+
+ Since implementations may elect to store recurring events as either a
+ single event object or a collection of discrete, related event
+ objects, the protocol is designed so that each recurring instance may
+ be both referenced and versioned. Hence, implementations that choose
+ to maintain per-instance properties (such as "ATTENDEE" property
+ "PARTSTAT" parameter) may do so. However, the protocol does not
+ require per-instance recognition unless the instance itself must be
+ renegotiated.
+
+ The scenarios for recurrence instance referencing are listed below.
+ For purposes of simplification, a change to an event refers to a
+ "trigger property." That is, a property that has a substantive
+ effect on the meeting itself, such as start time, location, due date
+ (for "VTODO" calendar components), and possibly description.
+
+ "Organizer"-initiated actions:
+
+ o deletes or changes a single instance of a recurring event
+
+ o makes changes that affect all future instances
+
+ o makes changes that affect all previous instances
+
+ o deletes or modifies a previously changed instance
+
+
+
+Daboo Standards Track [Page 77]
+
+RFC 5546 iTIP December 2009
+
+
+ "Attendee"-initiated actions:
+
+ o changes status for a particular recurrence instance
+
+ o sends a "COUNTER" for a particular recurrence instance
+
+ An instance of a recurring event is assigned a unique identification,
+ "RECURRENCE-ID" property, when that instance is renegotiated.
+ Negotiation may be necessary when a substantive change to the event
+ or to-do has been made (such as changing the start time, end time,
+ due date, or location). The "Organizer" can identify a specific
+ recurrence instance using the "RECURRENCE-ID" property. The property
+ value is equal to the date/time of the instance. If the "Organizer"
+ wishes to change the "DTSTART", the original, unmodified "DTSTART"
+ value of the instance is used as the value "RECURRENCE-ID" property,
+ and the new "DTSTART" and "DTEND" values reflect the change.
+
+3.7.2. Attendee Property Considerations
+
+ The "ORGANIZER" property is required on published events, to-dos, and
+ journal entries for two reasons. First, only the "Organizer" is
+ allowed to update and redistribute an event or to-do component. It
+ follows that the "ORGANIZER" property MUST be present in the event,
+ to-do, or journal entry component so that the CUA has a basis for
+ authorizing an update. Second, it is prudent to provide a point of
+ contact for anyone who receives a published component, in case of
+ problems.
+
+ Email addresses that correspond to groups of "Calendar Users" could
+ be specified as a mailto: URI [RFC2368] calendar user address.
+ Sending email to such an address results in email being sent to
+ multiple recipients. Such an address may be used as the value of an
+ "ATTENDEE" property. Thus, it is possible that the recipient of a
+ "REQUEST" does not appear explicitly in the list.
+
+ It is recommended that the general approach to finding a "Calendar
+ User" in an "Attendee" list be as follows:
+
+ 1. Search for the "Calendar User" in the "Attendee" list where
+ "CUTYPE=INDIVIDUAL"
+
+ 2. Failing (1), look for "Attendees" where "CUTYPE=GROUP" or
+ "CUTYPE=UNKNOWN". The CUA then determines if the "Calendar User"
+ is a member of one of these groups. If so, the "REPLY" method
+ sent to the "Organizer" MUST contain a new "ATTENDEE" property in
+ which:
+
+ * the "TYPE" property parameter is set to INDIVIDUAL
+
+
+
+Daboo Standards Track [Page 78]
+
+RFC 5546 iTIP December 2009
+
+
+ * the "MEMBER" property parameter is set to the name of the
+ group
+
+ 3. Failing (2), the CUA MAY ignore or accept the request as the
+ "Calendar User" wishes.
+
+3.7.3. Extension Tokens
+
+ To make iCalendar objects extensible, new component, property, or
+ property parameters can be used. Two types of extensions are defined
+ by [RFC5545]: IANA-registered tokens ("iana-token") and experimental
+ use tokens ("x-name"). A client SHOULD save "iana-token's" and MAY
+ use them in replies. A client MAY save "x-name's" and MAY use them
+ in replies. When delegating or forwarding messages to other CUs, a
+ client SHOULD include "iana-token's" and "x-names's".
+
+4. Examples
+
+4.1. Published Event Examples
+
+ In the calendaring and scheduling context, publication refers to the
+ one-way transfer of event information. Consumers of published events
+ simply incorporate the event into a calendar. No reply is expected.
+ Individual "A" publishes an event. Individual "B" reads the event
+ and incorporates it into their calendar. Events are published in
+ several ways, including embedding the event as an object in a web
+ page, emailing the event to a distribution list, or posting the event
+ to a newsgroup.
+
+ The table below illustrates the sequence of events between the
+ publisher and the consumers of a published event.
+
+ +----------------+-----------------------+--------------------------+
+ | Action | Organizer | Receiver |
+ +----------------+-----------------------+--------------------------+
+ | Publish an | "A" sends or posts a | "B" reads a published |
+ | event | PUBLISH message. | event. |
+ | | | |
+ | Publish an | "A" sends or posts a | "B" reads the updated |
+ | updated event | PUBLISH message. | event. |
+ | | | |
+ | Cancel a | "A" sends or posts a | "B" reads the canceled |
+ | published | CANCEL message. | event publication. |
+ | event | | |
+ +----------------+-----------------------+--------------------------+
+
+
+
+
+
+
+Daboo Standards Track [Page 79]
+
+RFC 5546 iTIP December 2009
+
+
+4.1.1. A Minimal Published Event
+
+ The iCalendar object below describes a single event that begins on
+ July 1, 1997 at 20:00 UTC. This event contains the minimum set of
+ properties for a "PUBLISH" for a "VEVENT" calendar component.
+
+ BEGIN:VCALENDAR
+ METHOD:PUBLISH
+ PRODID:-//Example/ExampleCalendarClient//EN
+ VERSION:2.0
+ BEGIN:VEVENT
+ ORGANIZER:mailto:a@example.com
+ DTSTART:19970701T200000Z
+ DTSTAMP:19970611T190000Z
+ SUMMARY:ST. PAUL SAINTS -VS- DULUTH-SUPERIOR DUKES
+ UID:0981234-1234234-23@example.com
+ END:VEVENT
+ END:VCALENDAR
+
+4.1.2. Changing a Published Event
+
+ The iCalendar object below describes an update to the event described
+ in Section 4.1.1; the time has been changed, an end time has been
+ added, and the sequence number has been adjusted.
+
+ BEGIN:VCALENDAR
+ METHOD:PUBLISH
+ VERSION:2.0
+ PRODID:-//Example/ExampleCalendarClient//EN
+ BEGIN:VEVENT
+ ORGANIZER:mailto:a@example.com
+ DTSTAMP:19970612T190000Z
+ DTSTART:19970701T210000Z
+ DTEND:19970701T230000Z
+ SEQUENCE:1
+ UID:0981234-1234234-23@example.com
+ SUMMARY:ST. PAUL SAINTS -VS- DULUTH-SUPERIOR DUKES
+ END:VEVENT
+ END:VCALENDAR
+
+ The "UID" property is used by the client to identify the event. The
+ "SEQUENCE" property indicates that this is a change to the event.
+ The event with a matching "UID" and sequence number 0 is superseded
+ by this event.
+
+ The "SEQUENCE" property provides a reliable way to distinguish
+ different versions of the same event. Each time an event is
+ published, its sequence number is incremented. If a client receives
+
+
+
+Daboo Standards Track [Page 80]
+
+RFC 5546 iTIP December 2009
+
+
+ an event with a sequence number 5 and finds it has the same event
+ with sequence number 2, the event SHOULD be updated. However, if the
+ client received an event with sequence number 2 and finds it already
+ has sequence number 5 of the same event, the event MUST NOT be
+ updated.
+
+4.1.3. Canceling a Published Event
+
+ The iCalendar object below cancels the event described in
+ Section 4.1.1. This cancels the event with "SEQUENCE" property of 0,
+ 1, and 2.
+
+ BEGIN:VCALENDAR
+ METHOD:CANCEL
+ VERSION:2.0
+ PRODID:-//Example/ExampleCalendarClient//EN
+ BEGIN:VEVENT
+ ORGANIZER:mailto:a@example.com
+ COMMENT:DUKES forfeit the game
+ SEQUENCE:2
+ UID:0981234-1234234-23@example.com
+ DTSTAMP:19970613T190000Z
+ END:VEVENT
+ END:VCALENDAR
+
+4.1.4. A Rich Published Event
+
+ This example describes the same event as in Section 4.1.1, but in
+ much greater detail.
+
+ BEGIN:VCALENDAR
+ PRODID:-//Example/ExampleCalendarClient//EN
+ METHOD:PUBLISH
+ SCALE:GREGORIAN
+ VERSION:2.0
+ BEGIN:VTIMEZONE
+ TZID:America-Chicago
+ TZURL:http://example.com/tz/America-Chicago
+ BEGIN:STANDARD
+ DTSTART:19671029T020000
+ RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+ TZOFFSETFROM:-0500
+ TZOFFSETTO:-0600
+ TZNAME:CST
+ END:STANDARD
+ BEGIN:DAYLIGHT
+ DTSTART:19870405T020000
+ RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+
+
+
+Daboo Standards Track [Page 81]
+
+RFC 5546 iTIP December 2009
+
+
+ TZOFFSETFROM:-0600
+ TZOFFSETTO:-0500
+ TZNAME:CDT
+ END:DAYLIGHT
+ END:VTIMEZONE
+ BEGIN:VEVENT
+ ORGANIZER:mailto:a@example.com
+ ATTACH:http://www.example.com/
+ CATEGORIES:SPORTS EVENT,ENTERTAINMENT
+ CLASS:PRIVATE
+ DESCRIPTION:MIDWAY STADIUM\n
+ Big time game. MUST see.\n
+ Expected duration:2 hours\n
+ DTEND;TZID=America-Chicago:19970701T180000
+ DTSTART;TZID=America-Chicago:19970702T160000
+ DTSTAMP:19970614T190000Z
+ STATUS:CONFIRMED
+ LOCATION;VALUE=URI:http://stadium.example.com/
+ PRIORITY:2
+ RESOURCES:SCOREBOARD
+ SEQUENCE:3
+ SUMMARY:ST. PAUL SAINTS -VS- DULUTH-SUPERIOR DUKES
+ UID:0981234-1234234-23@example.com
+ RELATED-TO:0981234-1234234-14@example.com
+ BEGIN:VALARM
+ TRIGGER:-PT2H
+ ACTION:DISPLAY
+ DESCRIPTION:You should be leaving for the game now.
+ END:VALARM
+ BEGIN:VALARM
+ TRIGGER:-PT30M
+ ACTION:AUDIO
+ END:VALARM
+ END:VEVENT
+ END:VCALENDAR
+
+ The "RELATED-TO" field contains the "UID" property of a related
+ calendar event. The "SEQUENCE" property 3 indicates that this event
+ supersedes versions 0, 1, and 2.
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo Standards Track [Page 82]
+
+RFC 5546 iTIP December 2009
+
+
+4.1.5. Anniversaries or Events Attached to Entire Days
+
+ This example demonstrates the use of the "VALUE" parameter to tie a
+ "VEVENT" to a day rather than a specific time.
+
+ BEGIN:VCALENDAR
+ PRODID:-//Example/ExampleCalendarClient//EN
+ METHOD:PUBLISH
+ VERSION:2.0
+ BEGIN:VEVENT
+ ORGANIZER:mailto:a@example.com
+ DTSTAMP:19970614T190000Z
+ UID:0981234-1234234-23@example.com
+ DTSTART;VALUE=DATE:19970714
+ RRULE:FREQ=YEARLY;INTERVAL=1
+ SUMMARY: Bastille Day
+ END:VEVENT
+ END:VCALENDAR
+
+4.2. Group Event Examples
+
+ Group events are distinguished from published events in that they
+ have "Attendees" and there is interaction between the "Attendees" and
+ the "Organizer" with respect to the event. Individual "A" requests a
+ meeting between individuals "A", "B", "C", and "D". Individual "B"
+ confirms attendance to the meeting. Individual "C" declines
+ attendance. Individual "D" tentatively confirms attendance. The
+ following table illustrates the message flow between these
+ individuals. "A", the CU scheduling the meeting, is referenced as
+ the "Organizer".
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo Standards Track [Page 83]
+
+RFC 5546 iTIP December 2009
+
+
+ +--------------+-----------------------+----------------------------+
+ | Action | "Organizer" | Attendee |
+ +--------------+-----------------------+----------------------------+
+ | Initiate a | "A" sends a REQUEST | |
+ | meeting | message to "B", "C", | |
+ | request | and "D". | |
+ | | | |
+ | Accept the | | "B" sends a REPLY message |
+ | meeting | | to "A" with its ATTENDEE |
+ | request | | PARTSTAT parameter set to |
+ | | | ACCEPTED. |
+ | | | |
+ | Decline the | | "C" sends a REPLY message |
+ | meeting | | to "A" with its ATTENDEE |
+ | request | | PARTSTAT parameter set to |
+ | | | DECLINED. |
+ | | | |
+ | Tentatively | | "D" sends a REPLY message |
+ | accept the | | to "A" with its ATTENDEE |
+ | meeting | | PARTSTAT parameter set to |
+ | request | | TENTATIVE. |
+ | | | |
+ | Confirm | "A" sends a REQUEST | |
+ | meeting | message to "B" and | |
+ | status with | "D" with updated | |
+ | Attendees | information. | |
+ +--------------+-----------------------+----------------------------+
+
+4.2.1. A Group Event Request
+
+ A sample meeting request is sent from "A" to "B", "C", and "D". "E"
+ is also sent a copy of the request but is not expected to attend and
+ need not reply. "E" illustrates how CUAs might implement an "FYI"-
+ type feature. Note the use of the "ROLE" parameter. The default
+ value for the "ROLE" parameter is "REQ-PARTICIPANT" and it need not
+ be enumerated. In this case, we are using the value "NON-
+ PARTICIPANT" to indicate "E" is a non-attending CU. The parameter is
+ not needed on other "Attendees" since "PARTICIPANT" is the default
+ value.
+
+ BEGIN:VCALENDAR
+ PRODID:-//Example/ExampleCalendarClient//EN
+ METHOD:REQUEST
+ VERSION:2.0
+ BEGIN:VEVENT
+ ORGANIZER:mailto:a@example.com
+ ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED;CN=A:mailto:a@example.com
+ ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;CN=B:mailto:b@example.com
+
+
+
+Daboo Standards Track [Page 84]
+
+RFC 5546 iTIP December 2009
+
+
+ ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;CN=C:mailto:c@example.com
+ ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;CN=Hal:mailto:d@example.com
+ ATTENDEE;RSVP=FALSE;CUTYPE=ROOM:conf_big@example.com
+ ATTENDEE;ROLE=NON-PARTICIPANT;RSVP=FALSE:mailto:e@example.com
+ DTSTAMP:19970611T190000Z
+ DTSTART:19970701T200000Z
+ DTEND:19970701T2100000Z
+ SUMMARY:Conference
+ UID:calsrv.example.com-873970198738777@example.com
+ SEQUENCE:0
+ STATUS:CONFIRMED
+ END:VEVENT
+ END:VCALENDAR
+
+4.2.2. Reply to a Group Event Request
+
+ "Attendee" "B" accepts the meeting.
+
+ BEGIN:VCALENDAR
+ PRODID:-//Example/ExampleCalendarClient//EN
+ METHOD:REPLY
+ VERSION:2.0
+ BEGIN:VEVENT
+ ATTENDEE;PARTSTAT=ACCEPTED:mailto:b@example.com
+ ORGANIZER:mailto:a@example.com
+ UID:calsrv.example.com-873970198738777@example.com
+ SEQUENCE:0
+ REQUEST-STATUS:2.0;Success
+ DTSTAMP:19970612T190000Z
+ END:VEVENT
+ END:VCALENDAR
+
+ "B" could have declined the meeting or indicated tentative acceptance
+ by setting the "ATTENDEE" "PARTSTAT" parameter to "DECLINED" or
+ "TENTATIVE", respectively. Also, "REQUEST-STATUS" is not required in
+ successful transactions.
+
+4.2.3. Update an Event
+
+ The event is moved to a different time. The combination of the "UID"
+ property (unchanged) and the "SEQUENCE" (bumped to 1) properties
+ indicate the update.
+
+ BEGIN:VCALENDAR
+ PRODID:-//Example/ExampleCalendarClient//EN
+ METHOD:REQUEST
+ VERSION:2.0
+ BEGIN:VEVENT
+
+
+
+Daboo Standards Track [Page 85]
+
+RFC 5546 iTIP December 2009
+
+
+ ORGANIZER:mailto:a@example.com
+ ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:mailto:a@example.com
+ ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:mailto:b@example.com
+ ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:mailto:c@example.com
+ ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;CN=Hal:mailto:d@example.com
+ ATTENDEE;ROLE=NON-PARTICIPANT;RSVP=FALSE;
+ CUTYPE=ROOM:mailto:conf@example.com
+ ATTENDEE;ROLE=NON-PARTICIPANT;RSVP=FALSE:mailto:e@example.com
+ DTSTART:19970701T180000Z
+ DTEND:19970701T190000Z
+ SUMMARY:Phone Conference
+ UID:calsrv.example.com-873970198738777@example.com
+ SEQUENCE:1
+ DTSTAMP:19970613T190000Z
+ STATUS:CONFIRMED
+ END:VEVENT
+ END:VCALENDAR
+
+4.2.4. Countering an Event Proposal
+
+ "A" sends a "REQUEST" to "B" and "C". "B" makes a counter proposal
+ to "A" to change the time and location.
+
+ "A" sends the following "REQUEST":
+
+ BEGIN:VCALENDAR
+ PRODID:-//Example/ExampleCalendarClient//EN
+ METHOD:REQUEST
+ VERSION:2.0
+ BEGIN:VEVENT
+ ORGANIZER:mailto:a@example.com
+ ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:mailto:a@example.com
+ ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:mailto:b@example.com
+ ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:mailto:c@example.com
+ DTSTART:19970701T190000Z
+ DTEND:19970701T200000Z
+ SUMMARY:Discuss the Merits of the election results
+ LOCATION:Green Conference Room
+ UID:calsrv.example.com-873970198738777a@example.com
+ SEQUENCE:0
+ DTSTAMP:19970611T190000Z
+ STATUS:CONFIRMED
+ END:VEVENT
+ END:VCALENDAR
+
+
+
+
+
+
+
+Daboo Standards Track [Page 86]
+
+RFC 5546 iTIP December 2009
+
+
+ "B" sends "COUNTER" to "A", requesting changes to time and place.
+ "B" uses the "COMMENT" property to communicate a rationale for the
+ change. Note that the "SEQUENCE" property is not incremented on a
+ "COUNTER".
+
+ BEGIN:VCALENDAR
+ PRODID:-//Example/ExampleCalendarClient//EN
+ METHOD:COUNTER
+ VERSION:2.0
+ BEGIN:VEVENT
+ ORGANIZER:mailto:a@example.com
+ ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:mailto:a@example.com
+ ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:mailto:b@example.com
+ ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:mailto:c@example.com
+ DTSTART:19970701T160000Z
+ DTEND:19970701T170000Z
+ DTSTAMP:19970612T190000Z
+ SUMMARY:Discuss the Merits of the election results
+ LOCATION:Blue Conference Room
+ COMMENT:This time works much better and I think the big conference
+ room is too big
+ UID:calsrv.example.com-873970198738777a@example.com
+ SEQUENCE:0
+ END:VEVENT
+ END:VCALENDAR
+
+ "A" accepts the changes from "B". To accept a counter proposal, the
+ "Organizer" sends a new event "REQUEST" with an incremented sequence
+ number.
+
+ BEGIN:VCALENDAR
+ PRODID:-//Example/ExampleCalendarClient//EN
+ METHOD:REQUEST
+ VERSION:2.0
+ BEGIN:VEVENT
+ ORGANIZER:mailto:a@example.com
+ ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:mailto:a@example.com
+ ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:mailto:b@example.com
+ ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:mailto:c@example.com
+ DTSTAMP:19970613T190000Z
+ DTSTART:19970701T160000Z
+ DTEND:19970701T170000Z
+ SUMMARY:Discuss the Merits of the election results - changed to
+ meet B's schedule
+ LOCATION:Blue Conference Room
+ UID:calsrv.example.com-873970198738777@example.com
+ SEQUENCE:1
+ STATUS:CONFIRMED
+
+
+
+Daboo Standards Track [Page 87]
+
+RFC 5546 iTIP December 2009
+
+
+ END:VEVENT
+ END:VCALENDAR
+
+ Instead, "A" rejects "B's" counter proposal.
+
+ BEGIN:VCALENDAR
+ PRODID:-//Example/ExampleCalendarClient//EN
+ METHOD:DECLINECOUNTER
+ VERSION:2.0
+ BEGIN:VEVENT
+ ORGANIZER:mailto:a@example.com
+ ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:mailto:b@example.com
+ COMMENT:Sorry, I cannot change this meeting time
+ UID:calsrv.example.com-873970198738777@example.com
+ SEQUENCE:0
+ DTSTAMP:19970614T190000Z
+ END:VEVENT
+ END:VCALENDAR
+
+4.2.5. Delegating an Event
+
+ When delegating an event request to another "Calendar User", the
+ "Delegator" must both update the "Organizer" with a "REPLY" and send
+ a request to the "Delegate". There is currently no protocol
+ limitation to delegation depth. It is possible for the original
+ delegate to delegate the meeting to someone else, and so on. When a
+ request is delegated from one CUA to another, there are a number of
+ responsibilities required of the "Delegator". The "Delegator" MUST:
+
+ o Send a "REPLY" to the "Organizer" with the following updates:
+
+ A. The "Delegator's" "ATTENDEE" property "PARTSTAT" parameter is
+ set to "DELEGATED" and the "DELEGATED-TO" parameter is set to
+ the address of the "Delegate".
+
+ B. Add an additional "ATTENDEE" property for the "Delegate" with
+ the "DELEGATED-FROM" property parameter set to the
+ "Delegator".
+
+ C. Indicate whether they want to continue to receive updates when
+ the "Organizer" sends out updated versions of the event.
+ Setting the "RSVP" property parameter to "TRUE" will cause the
+ updates to be sent; setting it to "FALSE" causes no further
+ updates to be sent. Note that in either case, if the
+ "Delegate" declines the invitation, the "Delegator" will be
+ notified.
+
+
+
+
+
+Daboo Standards Track [Page 88]
+
+RFC 5546 iTIP December 2009
+
+
+ o The "Delegator" MUST also send a copy of the original "REQUEST"
+ method to the "Delegate", with changes (A) and (B), as detailed
+ above applied.
+
+ If the "Delegate" declines the meeting, the "Organizer" MUST send an
+ update "REQUEST" to the "Delegator" so that the "Delegator" may elect
+ to delegate the "REQUEST" to another CUA.
+
+ +----------------+-----------------+--------------------------------+
+ | Action | "Organizer" | Attendee |
+ +----------------+-----------------+--------------------------------+
+ | Initiate a | "A" sends a | |
+ | meeting | REQUEST message | |
+ | request | to "B" and "C". | |
+ | | | |
+ | Delegate: "C" | | "C" sends a REPLY to "A" with |
+ | delegates to | | the ATTENDEE PARTSTAT |
+ | "E" | | parameter set to DELEGATED and |
+ | | | with a new ATTENDEE property |
+ | | | for "E". "E's" ATTENDEE |
+ | | | DELEGATED-FROM parameter is |
+ | | | set to "C". "C's" ATTENDEE |
+ | | | DELEGATED-TO parameter is set |
+ | | | to "E". "C" sends REQUEST |
+ | | | message to "E" with the |
+ | | | original meeting request |
+ | | | information. The PARTSTAT |
+ | | | property parameter for "C" is |
+ | | | set to DELEGATED and the |
+ | | | DELEGATED-TO parameter is set |
+ | | | to the address of "E". An |
+ | | | ATTENDEE property is added for |
+ | | | "E" and the DELEGATED-FROM |
+ | | | parameter is set to the |
+ | | | address of "C". |
+ | | | |
+ | Confirm | | "E" sends REPLY message to |
+ | meeting | | "A", and optionally to "C", |
+ | attendance | | with its PARTSTAT property |
+ | | | parameter set to ACCEPTED. |
+ | | | |
+ | Optional: | "A" sends | |
+ | Redistribute | REQUEST message | |
+ | meeting to | to "B", "C", | |
+ | Attendees | and "E". | |
+ +----------------+-----------------+--------------------------------+
+
+
+
+
+
+Daboo Standards Track [Page 89]
+
+RFC 5546 iTIP December 2009
+
+
+ "C" responds to the "Organizer".
+
+ BEGIN:VCALENDAR
+ PRODID:-//Example/ExampleCalendarClient//EN
+ METHOD:REPLY
+ VERSION:2.0
+ BEGIN:VEVENT
+ ORGANIZER:mailto:a@example.com
+ ATTENDEE;PARTSTAT=DELEGATED;DELEGATED-
+ TO="mailto:e@example.com":mailto:c@example.com
+ UID:calsrv.example.com-873970198738777@example.com
+ SEQUENCE:0
+ REQUEST-STATUS:2.0;Success
+ DTSTAMP:19970611T190000Z
+ END:VEVENT
+ END:VCALENDAR
+
+ "Attendee" "C" delegates presence at the meeting to "E".
+
+ BEGIN:VCALENDAR
+ PRODID:-//Example/ExampleCalendarClient//EN
+ METHOD:REQUEST
+ VERSION:2.0
+ BEGIN:VEVENT
+ ORGANIZER:mailto:a@example.com
+ ATTENDEE;PARTSTAT=DELEGATED;DELEGATED-
+ TO="mailto:e@example.com":mailto:c@example.com
+ ATTENDEE;RSVP=TRUE;
+ DELEGATED-FROM="mailto:c@example.com":mailto:e@example.com
+ DTSTART:19970701T180000Z
+ DTEND:19970701T200000Z
+ SUMMARY:Phone Conference
+ UID:calsrv.example.com-873970198738777@example.com
+ SEQUENCE:0
+ STATUS:CONFIRMED
+ DTSTAMP:19970611T190000Z
+ END:VEVENT
+ END:VCALENDAR
+
+4.2.6. Delegate Accepts the Meeting
+
+ To accept a delegated meeting, the delegate, "E", sends the following
+ message to "A" and "C".
+
+ BEGIN:VCALENDAR
+ PRODID:-//Example/ExampleCalendarClient//EN
+ METHOD:REPLY
+ VERSION:2.0
+
+
+
+Daboo Standards Track [Page 90]
+
+RFC 5546 iTIP December 2009
+
+
+ BEGIN:VEVENT
+ ORGANIZER:mailto:a@example.com
+ ATTENDEE;PARTSTAT=ACCEPTED;DELEGATED-
+ FROM="mailto:c@example.com":mailto:e@example.com
+ ATTENDEE;PARTSTAT=DELEGATED;
+ DELEGATED-TO="mailto:e@example.com":mailto:c@example.com
+ UID:calsrv.example.com-873970198738777@example.com
+ SEQUENCE:0
+ REQUEST-STATUS:2.0;Success
+ DTSTAMP:19970614T190000Z
+ END:VEVENT
+ END:VCALENDAR
+
+4.2.7. Delegate Declines the Meeting
+
+ In this example, the "Delegate" declines the meeting request and sets
+ the "ATTENDEE" property "PARTSTAT" parameter to "DECLINED". The
+ "Organizer" SHOULD resend the "REQUEST" to "C" with the "PARTSTAT"
+ parameter of the "Delegate" set to "DECLINED". This lets the
+ "Delegator" know that the "Delegate" has declined and provides an
+ opportunity to the "Delegator" to either accept the request or
+ delegate it to another CU.
+
+ "E" responds to "A" and "C". Note the use of the "COMMENT" property
+ "E" uses to indicate why the delegation was declined.
+
+ BEGIN:VCALENDAR
+ PRODID:-//Example/ExampleCalendarClient//EN
+ METHOD:REPLY
+ VERSION:2.0
+ BEGIN:VEVENT
+ ORGANIZER:mailto:a@example.com
+ ATTENDEE;PARTSTAT=DELEGATED;
+ DELEGATED-TO="mailto:e@example.com":mailto:c@example.com
+ ATTENDEE;PARTSTAT=DECLINED;
+ DELEGATED-FROM="mailto:c@example.com":mailto:e@example.com
+ COMMENT:Sorry, I will be out of town at that time.
+ UID:calsrv.example.com-873970198738777@example.com
+ SEQUENCE:0
+ REQUEST-STATUS:2.0;Success
+ DTSTAMP:19970614T190000Z
+ END:VEVENT
+ END:VCALENDAR
+
+ "A" resends the "REQUEST" method to "C". "A" may also wish to
+ express the fact that the item was delegated in the "COMMENT"
+ property.
+
+
+
+
+Daboo Standards Track [Page 91]
+
+RFC 5546 iTIP December 2009
+
+
+ BEGIN:VCALENDAR
+ PRODID:-//Example/ExampleCalendarClient//EN
+ METHOD:REQUEST
+ VERSION:2.0
+ BEGIN:VEVENT
+ ORGANIZER:mailto:a@example.com
+ ATTENDEE;PARTSTAT=DECLINED;
+ DELEGATED-FROM="mailto:c@example.com":mailto:e@example.com
+ ATTENDEE;RSVP=TRUE:mailto:c@example.com
+ UID:calsrv.example.com-873970198738777@example.com
+ SEQUENCE:0
+ SUMMARY:Phone Conference
+ DTSTART:19970701T180000Z
+ DTEND:19970701T200000Z
+ DTSTAMP:19970614T200000Z
+ COMMENT:DELEGATE (ATTENDEE mailto:e@example.com) DECLINED YOUR
+ INVITATION
+ END:VEVENT
+ END:VCALENDAR
+
+4.2.8. Forwarding an Event Request
+
+ The protocol does not prevent an "Attendee" from "forwarding" a
+ "VEVENT" calendar component to other "Calendar Users". Forwarding
+ differs from delegation in that the forwarded "Calendar User" (often
+ referred to as a "Party Crasher") does not replace the forwarding
+ "Calendar User". Implementations are not required to add the "Party
+ Crasher" to the "Attendee" list, and hence there is no guarantee that
+ a "Party Crasher" will receive additional updates to the event. The
+ forwarding "Calendar User" SHOULD NOT add the "Party Crasher" to the
+ "Attendee" list. The "Organizer" MAY add the forwarded "Calendar
+ User" to the "Attendee" list.
+
+4.2.9. Cancel a Group Event
+
+ Individual "A" requests a meeting between individuals "A", "B", "C",
+ and "D". Individual "B" declines attendance to the meeting.
+ Individual "A" decides to cancel the meeting. The following table
+ illustrates the sequence of messages that would be exchanged between
+ these individuals.
+
+ Messages related to a previously canceled event ("SEQUENCE" property
+ value is less than the "SEQUENCE" property value of the "CANCEL"
+ message) MUST be ignored.
+
+
+
+
+
+
+
+Daboo Standards Track [Page 92]
+
+RFC 5546 iTIP December 2009
+
+
+ +-------------+---------------------+-------------------------------+
+ | Action | Organizer | Attendee |
+ +-------------+---------------------+-------------------------------+
+ | Initiate a | "A" sends a REQUEST | |
+ | meeting | message to "B", | |
+ | request | "C", and "D". | |
+ | | | |
+ | Decline the | | "B" sends a REPLY message to |
+ | meeting | | "A" with its PARTSTAT |
+ | request | | parameter set to DECLINED. |
+ | | | |
+ | Cancel the | "A" sends a CANCEL | |
+ | meeting | message to "B", | |
+ | | "C", and "D". | |
+ +-------------+---------------------+-------------------------------+
+
+ This example shows how "A" cancels the event.
+
+ BEGIN:VCALENDAR
+ PRODID:-//Example/ExampleCalendarClient//EN
+ METHOD:CANCEL
+ VERSION:2.0
+ BEGIN:VEVENT
+ ORGANIZER:mailto:a@example.com
+ ATTENDEE;CUTYPE=INDIVIDUAL;mailto:a@example.com
+ ATTENDEE;CUTYPE=INDIVIDUAL:mailto:b@example.com
+ ATTENDEE;CUTYPE=INDIVIDUAL:mailto:c@example.com
+ ATTENDEE;CUTYPE=INDIVIDUAL:mailto:d@example.com
+ COMMENT:Mr. B cannot attend. It's raining. Lets cancel.
+ UID:calsrv.example.com-873970198738777@example.com
+ SEQUENCE:1
+ STATUS:CANCELLED
+ DTSTAMP:19970613T190000Z
+ END:VEVENT
+ END:VCALENDAR
+
+4.2.10. Removing Attendees
+
+ "A" wants to remove "B" from a meeting. This is done by sending a
+ "CANCEL" to "B" and removing "B" from the "Attendee" list in the
+ master copy of the event.
+
+
+
+
+
+
+
+
+
+
+Daboo Standards Track [Page 93]
+
+RFC 5546 iTIP December 2009
+
+
+ +--------------------+-----------------------------------+----------+
+ | Action | Organizer | Attendee |
+ +--------------------+-----------------------------------+----------+
+ | Remove "B" as an | "A" sends a CANCEL message to | |
+ | Attendee | "B". | |
+ | | | |
+ | Update the master | "A" optionally sends the updated | |
+ | copy of the event | event to the remaining Attendees. | |
+ +--------------------+-----------------------------------+----------+
+
+ The original meeting includes "A", "B", "C", and "D". The example
+ below shows the "CANCEL" that "A" sends to "B". Note that in the
+ example below, the "STATUS" property is omitted. This is used when
+ the meeting itself is cancelled and not when the intent is to remove
+ an "Attendee" from the event.
+
+ BEGIN:VCALENDAR
+ PRODID:-//Example/ExampleCalendarClient//EN
+ METHOD:CANCEL
+ VERSION:2.0
+ BEGIN:VEVENT
+ ORGANIZER:mailto:a@example.com
+ ATTENDEE:mailto:b@example.com
+ COMMENT:You're off the hook for this meeting
+ UID:calsrv.example.com-873970198738777@example.com
+ DTSTAMP:19970613T193000Z
+ SEQUENCE:1
+ END:VEVENT
+ END:VCALENDAR
+
+ The updated master copy of the event is shown below. The "Organizer"
+ MAY resend the updated event to the remaining "Attendees". Note that
+ "B" has been removed.
+
+ BEGIN:VCALENDAR
+ PRODID:-//Example/ExampleCalendarClient//EN
+ METHOD:REQUEST
+ VERSION:2.0
+ BEGIN:VEVENT
+ ORGANIZER:mailto:a@example.com
+ ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:mailto:a@example.com
+ ATTENDEE;CUTYPE=INDIVIDUAL:mailto:c@example.com
+ ATTENDEE;CUTYPE=INDIVIDUAL:mailto:d@example.com
+ ATTENDEE;CUTYPE=ROOM:mailto:cr_big@example.com
+ ATTENDEE;ROLE=NON-PARTICIPANT;
+ RSVP=FALSE:mailto:e@example.com
+ DTSTAMP:19970611T190000Z
+ DTSTART:19970701T200000Z
+
+
+
+Daboo Standards Track [Page 94]
+
+RFC 5546 iTIP December 2009
+
+
+ DTEND:19970701T203000Z
+ SUMMARY:Phone Conference
+ UID:calsrv.example.com-873970198738777@example.com
+ SEQUENCE:2
+ STATUS:CONFIRMED
+ END:VEVENT
+ END:VCALENDAR
+
+4.2.11. Replacing the Organizer
+
+ The scenario for this example begins with "A" as the "Organizer" for
+ a recurring meeting with "B", "C", and "D". "A" receives a new job
+ offer in another country and drops out of touch. "A" left no
+ forwarding address or way to be reached. Using out-of-band
+ communication, the other "Attendees" eventually learn what has
+ happened and reach an agreement that "B" should become the new
+ "Organizer" for the meeting. To do this, "B" sends out a new version
+ of the event and the other "Attendees" agree to accept "B" as the new
+ "Organizer". "B" also removes "A" from the event.
+
+ When the "Organizer" is replaced, the "SEQUENCE" property value MUST
+ be incremented.
+
+ This is the message "B" sends to "C" and "D".
+
+ BEGIN:VCALENDAR
+ PRODID:-//Example/ExampleCalendarClient//EN
+ METHOD:REQUEST
+ VERSION:2.0
+ BEGIN:VEVENT
+ ORGANIZER:mailto:b@example.com
+ ATTENDEE;ROLE=CHAIR;STATUS=ACCEPTED:mailto:b@example.com
+ ATTENDEE;CUTYPE=INDIVIDUAL:mailto:c@example.com
+ ATTENDEE;CUTYPE=INDIVIDUAL:mailto:d@example.com
+ DTSTAMP:19970611T190000Z
+ DTSTART:19970701T200000Z
+ DTEND:19970701T203000Z
+ RRULE:FREQ=WEEKLY
+ SUMMARY:Phone Conference
+ UID:123456@example.com
+ SEQUENCE:1
+ STATUS:CONFIRMED
+ END:VEVENT
+ END:VCALENDAR
+
+
+
+
+
+
+
+Daboo Standards Track [Page 95]
+
+RFC 5546 iTIP December 2009
+
+
+4.3. Busy Time Examples
+
+ Busy time objects can be used in several ways. First, a CU may
+ request busy time from another CU for a specific range of time. That
+ request can be answered with a busy time "REPLY". Additionally, a CU
+ may simply publish their busy time for a given interval and point
+ other CUs to the published location. The following examples outline
+ both scenarios.
+
+4.3.1. Publish Busy Time
+
+ Individual "A" publishes busy time for one week.
+
+ BEGIN:VCALENDAR
+ PRODID:-//Example/ExampleCalendarClient//EN
+ VERSION:2.0
+ METHOD:PUBLISH
+ BEGIN:VFREEBUSY
+ DTSTAMP:19980101T124100Z
+ ORGANIZER:mailto:a@example.com
+ DTSTART:19980101T124200Z
+ DTEND:19980108T124200Z
+ FREEBUSY:19980101T180000Z/19980101T190000Z
+ FREEBUSY:19980103T020000Z/19980103T050000Z
+ FREEBUSY:19980107T020000Z/19980107T050000Z
+ FREEBUSY:19980113T000000Z/19980113T010000Z
+ FREEBUSY:19980115T190000Z/19980115T200000Z
+ FREEBUSY:19980115T220000Z/19980115T230000Z
+ FREEBUSY:19980116T013000Z/19980116T043000Z
+ END:VFREEBUSY
+ END:VCALENDAR
+
+4.3.2. Request Busy Time
+
+ Individual "A" requests busy time from individuals "B" and "C".
+ Individuals "B" and "C" reply with busy time data to individual "A".
+ The following table illustrates the sequence of messages that would
+ be exchanged between these individuals.
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo Standards Track [Page 96]
+
+RFC 5546 iTIP December 2009
+
+
+ +---------------------+--------------------+------------------------+
+ | Action | Organizer | Attendee |
+ +---------------------+--------------------+------------------------+
+ | Initiate a busy | "A" sends REQUEST | |
+ | time request | message to "B" and | |
+ | | "C". | |
+ | | | |
+ | Reply to the BUSY | | "B" sends a REPLY |
+ | request with BUSY | | message to "A" with |
+ | time data | | busy time data. |
+ +---------------------+--------------------+------------------------+
+
+ "A" sends a "REQUEST" to "B" and "C" for busy time.
+
+ BEGIN:VCALENDAR
+ PRODID:-//Example/ExampleCalendarClient//EN
+ METHOD:REQUEST
+ VERSION:2.0
+ BEGIN:VFREEBUSY
+ ORGANIZER:mailto:a@example.com
+ ATTENDEE;ROLE=CHAIR:mailto:a@example.com
+ ATTENDEE:mailto:b@example.com
+ ATTENDEE:mailto:c@example.com
+ DTSTAMP:19970613T190000Z
+ DTSTART:19970701T080000Z
+ DTEND:19970701T200000
+ UID:calsrv.example.com-873970198738777@example.com
+ END:VFREEBUSY
+ END:VCALENDAR
+
+4.3.3. Reply to a Busy Time Request
+
+ "B" sends a "REPLY" method type of a "VFREEBUSY" calendar component
+ to "A".
+
+ BEGIN:VCALENDAR
+ PRODID:-//Example/ExampleCalendarClient//EN
+ METHOD:REPLY
+ VERSION:2.0
+ BEGIN:VFREEBUSY
+ ORGANIZER:mailto:a@example.com
+ ATTENDEE:mailto:b@example.com
+ DTSTART:19970701T080000Z
+ DTEND:19970701T200000Z
+ UID:calsrv.example.com-873970198738777@example.com
+ FREEBUSY:19970701T090000Z/PT1H,19970701T140000Z/PT30M
+ DTSTAMP:19970613T190030Z
+ END:VFREEBUSY
+
+
+
+Daboo Standards Track [Page 97]
+
+RFC 5546 iTIP December 2009
+
+
+ END:VCALENDAR
+
+ "B" is busy from 09:00 to 10:00 and from 14:00 to 14:30.
+
+4.4. Recurring Event and Time Zone Examples
+
+4.4.1. A Recurring Event Spanning Time Zones
+
+ This event describes a weekly phone conference. The "Attendees" are
+ each in a different time zone.
+
+ BEGIN:VCALENDAR
+ PRODID:-//Example/ExampleCalendarClient//EN
+ METHOD:REQUEST
+ VERSION:2.0
+ BEGIN:VTIMEZONE
+ TZID:America-SanJose
+ TZURL:http://example.com/tz/America-SanJose
+ BEGIN:STANDARD
+ DTSTART:19671029T020000
+ RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+ TZOFFSETFROM:-0700
+ TZOFFSETTO:-0800
+ TZNAME:PST
+ END:STANDARD
+ BEGIN:DAYLIGHT
+ DTSTART:19870405T020000
+ RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+ TZOFFSETFROM:-0800
+ TZOFFSETTO:-0700
+ TZNAME:PDT
+ END:DAYLIGHT
+ END:VTIMEZONE
+ BEGIN:VEVENT
+ ORGANIZER:mailto:a@example.com
+ ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED;
+ CUTYPE=INDIVIDUAL:a@example.com
+ ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:b@example.fr
+ ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:c@example.jp
+ DTSTAMP:19970613T190030Z
+ DTSTART;TZID=America-SanJose:19970701T140000
+ DTEND;TZID=America-SanJose:19970701T150000
+ RRULE:FREQ=WEEKLY;COUNT=20;WKST=SU;BYDAY=TU
+ RDATE;TZID=America-SanJose:19970910T140000
+ EXDATE;TZID=America-SanJose:19970909T140000
+ EXDATE;TZID=America-SanJose:19971028T140000
+ SUMMARY:Weekly Phone Conference
+ UID:calsrv.example.com-873970198738777@example.com
+
+
+
+Daboo Standards Track [Page 98]
+
+RFC 5546 iTIP December 2009
+
+
+ SEQUENCE:0
+ STATUS:CONFIRMED
+ END:VEVENT
+ END:VCALENDAR
+
+ The first component of this iCalendar object is the time zone
+ component. The "DTSTART" date coincides with the first instance of
+ the "RRULE" property.
+
+ The recurring meeting is defined in a particular time zone,
+ presumably that of the originator. The client for each "Attendee"
+ has the responsibility of determining the recurrence time in the
+ "Attendee's" time zone.
+
+ The repeating event starts on Tuesday, July 1, 1997 at 2:00pm PDT
+ (UTC-7). "Attendee" B@example.fr is in France, where the local time
+ on this date is 9 hours ahead of PDT, or 23:00 CEST (UTC+2).
+ "Attendee" C@example.jp is in Japan, where local time is 16 hours
+ ahead of PDT, or Wednesday, July 2 at 06:00 JST (UTC+9). The event
+ repeats weekly on Tuesdays (in PST/PDT). The "RRULE" property
+ results in 20 instances. The last instance falls on Tuesday,
+ November 11, 1997 2:00pm PST. The "RDATE" property adds another
+ instance: WED, 10-SEP-1997 2:00 PM PDT.
+
+ There are also two exception dates to the recurrence rule. The first
+ one is:
+
+ o TUE, 09-SEP-1997 14:00 PDT (UTC-7)
+
+ o TUE, 09-SEP-1997 23:00 CEST (UTC+2)
+
+ o WED, 10-SEP-1997 06:00 JST (UTC+9)
+
+
+ and the second is:
+
+ o TUE, 28-OCT-1997 14:00 PST (UTC-8)
+
+ o TUE, 28-OCT-1997 23:00 CET (UTC+1)
+
+ o WED, 29-OCT-1997 07:00 JST (UTC+9)
+
+4.4.2. Modify a Recurring Instance
+
+ In this example, the "Organizer" issues a recurring meeting. Later,
+ the "Organizer" changes an instance of the event by changing the
+ "DTSTART" property. Note the use of "RECURRENCE-ID" property and
+ "SEQUENCE" property in the second request.
+
+
+
+Daboo Standards Track [Page 99]
+
+RFC 5546 iTIP December 2009
+
+
+ Original Request:
+
+ BEGIN:VCALENDAR
+ METHOD:REQUEST
+ PRODID:-//Example/ExampleCalendarClient//EN
+ VERSION:2.0
+ BEGIN:VEVENT
+ UID:guid-1@example.com
+ SEQUENCE:0
+ RRULE:FREQ=MONTHLY;BYMONTHDAY=1;UNTIL=19980901T210000Z
+ ORGANIZER:mailto:a@example.com
+ ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:mailto:a@example.com
+ ATTENDEE:mailto:b@example.com
+ ATTENDEE:mailto:c@example.com
+ ATTENDEE:mailto:d@example.com
+ DESCRIPTION:IETF-C&S Conference Call
+ CLASS:PUBLIC
+ SUMMARY:IETF Calendaring Working Group Meeting
+ DTSTART:19970601T210000Z
+ DTEND:19970601T220000Z
+ LOCATION:Conference Call
+ DTSTAMP:19970526T083000Z
+ STATUS:CONFIRMED
+ END:VEVENT
+ END:VCALENDAR
+
+ The event request below is to change the time of a specific instance.
+ This changes the July 1st instance to July 3rd.
+
+ BEGIN:VCALENDAR
+ METHOD:REQUEST
+ PRODID:-//Example/ExampleCalendarClient//EN
+ VERSION:2.0
+ BEGIN:VEVENT
+ UID:guid-1@example.com
+ RECURRENCE-ID:19970701T210000Z
+ SEQUENCE:1
+ ORGANIZER:mailto:a@example.com
+ ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:mailto:a@example.com
+ ATTENDEE:mailto:b@example.com
+ ATTENDEE:mailto:c@example.com
+ ATTENDEE:mailto:d@example.com
+ DESCRIPTION:IETF-C&S Conference Call
+ CLASS:PUBLIC
+ SUMMARY:IETF Calendaring Working Group Meeting
+ DTSTART:19970703T210000Z
+ DTEND:19970703T220000Z
+ LOCATION:Conference Call
+
+
+
+Daboo Standards Track [Page 100]
+
+RFC 5546 iTIP December 2009
+
+
+ DTSTAMP:19970626T093000Z
+ STATUS:CONFIRMED
+ END:VEVENT
+ END:VCALENDAR
+
+4.4.3. Cancel an Instance
+
+ In this example, the "Organizer" of a recurring event deletes the
+ August 1st instance.
+
+ BEGIN:VCALENDAR
+ METHOD:CANCEL
+ PRODID:-//Example/ExampleCalendarClient//EN
+ VERSION:2.0
+ BEGIN:VEVENT
+ UID:guid-1@example.com
+ ORGANIZER:mailto:a@example.com
+ ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:mailto:a@example.com
+ ATTENDEE:mailto:b@example.com
+ ATTENDEE:mailto:c@example.com
+ ATTENDEE:mailto:d@example.com
+ RECURRENCE-ID:19970801T210000Z
+ SEQUENCE:2
+ STATUS:CANCELLED
+ DTSTAMP:19970721T093000Z
+ END:VEVENT
+ END:VCALENDAR
+
+4.4.4. Cancel a Recurring Event
+
+ In this example, the "Organizer" wishes to cancel the entire
+ recurring event and any exceptions.
+
+ BEGIN:VCALENDAR
+ METHOD:CANCEL
+ PRODID:-//Example/ExampleCalendarClient//EN
+ VERSION:2.0
+ BEGIN:VEVENT
+ UID:guid-1@example.com
+ ORGANIZER:mailto:a@example.com
+ ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:mailto:a@example.com
+ ATTENDEE:mailto:b@example.com
+ ATTENDEE:mailto:c@example.com
+ ATTENDEE:mailto:d@example.com
+ DTSTAMP:19970721T103000Z
+ STATUS:CANCELLED
+ SEQUENCE:3
+ END:VEVENT
+
+
+
+Daboo Standards Track [Page 101]
+
+RFC 5546 iTIP December 2009
+
+
+ END:VCALENDAR
+
+4.4.5. Change All Future Instances
+
+ This example changes the meeting location from a conference call to
+ Seattle, starting September 1 and extending to all future instances.
+
+ BEGIN:VCALENDAR
+ METHOD:REQUEST
+ PRODID:-//Example/ExampleCalendarClient//EN
+ VERSION:2.0
+ BEGIN:VEVENT
+ UID:guid-1@example.com
+ RECURRENCE-ID;THISANDFUTURE:19970901T210000Z
+ SEQUENCE:3
+ ORGANIZER:mailto:a@example.com
+ ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:mailto:a@example.com
+ ATTENDEE;RSVP=TRUE:mailto:b@example.com
+ ATTENDEE;RSVP=TRUE:mailto:c@example.com
+ ATTENDEE;RSVP=TRUE:mailto:d@example.com
+ DESCRIPTION:IETF-C&S Discussion
+ CLASS:PUBLIC
+ SUMMARY:IETF Calendaring Working Group Meeting
+ DTSTART:19970901T210000Z
+ DTEND:19970901T220000Z
+ LOCATION:Building 32, Microsoft, Seattle, WA
+ DTSTAMP:19970526T083000Z
+ STATUS:CONFIRMED
+ END:VEVENT
+ END:VCALENDAR
+
+4.4.6. Add a New Instance to a Recurring Event
+
+ This example adds a one-time additional instance to the recurring
+ event. "Organizer" adds a second July meeting on the 15th.
+
+ BEGIN:VCALENDAR
+ METHOD:ADD
+ PRODID:-//Example/ExampleCalendarClient//EN
+ VERSION:2.0
+ BEGIN:VEVENT
+ UID:123456789@example.com
+ SEQUENCE:4
+ ORGANIZER:mailto:a@example.com
+ ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:mailto:a@example.com
+ ATTENDEE;RSVP=TRUE:mailto:b@example.com
+ ATTENDEE;RSVP=TRUE:mailto:c@example.com
+ ATTENDEE;RSVP=TRUE:mailto:d@example.com
+
+
+
+Daboo Standards Track [Page 102]
+
+RFC 5546 iTIP December 2009
+
+
+ DESCRIPTION:IETF-C&S Conference Call
+ CLASS:PUBLIC
+ SUMMARY:IETF Calendaring Working Group Meeting
+ DTSTART:19970715T210000Z
+ DTEND:19970715T220000Z
+ LOCATION:Conference Call
+ DTSTAMP:19970629T093000Z
+ STATUS:CONFIRMED
+ END:VEVENT
+ END:VCALENDAR
+
+4.4.7. Add a New Series of Instances to a Recurring Event
+
+ The scenario for this example involves an ongoing meeting, originally
+ set up to occur every Tuesday. The "Organizer" later decides that
+ the meetings need to be on Tuesdays and Thursdays.
+
+ The original event:
+
+ BEGIN:VCALENDAR
+ METHOD:REQUEST
+ PRODID:-//Example/ExampleCalendarClient//EN
+ VERSION:2.0
+ BEGIN:VEVENT
+ UID:123456789@example.com
+ SEQUENCE:0
+ RRULE:WKST=SU;BYDAY=TU;FREQ=WEEKLY
+ ORGANIZER:mailto:a@example.com
+ ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:mailto:a@example.com
+ ATTENDEE;RSVP=TRUE:mailto:b@example.com
+ SUMMARY:Review Accounts
+ DTSTART:19980303T210000Z
+ DTEND:19980303T220000Z
+ LOCATION:The White Room
+ DTSTAMP:19980301T093000Z
+ STATUS:CONFIRMED
+ END:VEVENT
+ END:VCALENDAR
+
+ The entire event can be rescheduled using a "REQUEST". This is done
+ by using the "UID" of the event to reschedule and including the
+ modified "RRULE". Note that since this is an entire rescheduling of
+ the event, any instance-specific information will be lost, unless
+ explicitly included with the update "REQUEST".
+
+ BEGIN:VCALENDAR
+ METHOD:REQUEST
+ PRODID:-//Example/ExampleCalendarClient//EN
+
+
+
+Daboo Standards Track [Page 103]
+
+RFC 5546 iTIP December 2009
+
+
+ VERSION:2.0
+ BEGIN:VEVENT
+ UID:123456789@example.com
+ SEQUENCE:7
+ RRULE:WKST=SU;BYDAY=TU,TH;FREQ=WEEKLY
+ ORGANIZER:mailto:a@example.com
+ ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:mailto:a@example.com
+ ATTENDEE;RSVP=TRUE:mailto:b@example.com
+ SUMMARY:Review Accounts
+ DTSTART:19980303T210000Z
+ DTEND:19980303T220000Z
+ DTSTAMP:19980303T193000Z
+ LOCATION:The White Room
+ STATUS:CONFIRMED
+ END:VEVENT
+ END:VCALENDAR
+
+4.4.8. Refreshing a Recurring Event
+
+ The next series of examples illustrate how an "Organizer" would
+ respond to a "REFRESH" submitted by an "Attendee" after a series of
+ instance-specific modifications. To convey all instance-specific
+ changes, the "Organizer" must provide the latest event description
+ and the relevant instances. The first three examples show the
+ history, including the initial "VEVENT" request and subsequent
+ instance changes, and finally the "REFRESH".
+
+ Original Request:
+
+ BEGIN:VCALENDAR
+ METHOD:REQUEST
+ PRODID:-//Example/ExampleCalendarClient//EN
+ VERSION:2.0
+ BEGIN:VEVENT
+ UID:123456789@example.com
+ SEQUENCE:0
+ RDATE:19980304T180000Z
+ RDATE:19980311T180000Z
+ RDATE:19980318T180000Z
+ ORGANIZER:mailto:a@example.com
+ ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:mailto:a@example.com
+ ATTENDEE;RSVP=TRUE:mailto:b@example.com
+ SUMMARY:Review Accounts
+ DTSTART:19980304T180000Z
+ DTEND:19980304T200000Z
+ DTSTAMP:19980303T193000Z
+ LOCATION:Conference Room A
+ STATUS:CONFIRMED
+
+
+
+Daboo Standards Track [Page 104]
+
+RFC 5546 iTIP December 2009
+
+
+ END:VEVENT
+ END:VCALENDAR
+
+ Organizer changes 2nd instance location and time:
+
+ BEGIN:VCALENDAR
+ METHOD:REQUEST
+ PRODID:-//Example/ExampleCalendarClient//EN
+ VERSION:2.0
+ BEGIN:VEVENT
+ UID:123456789@example.com
+ SEQUENCE:1
+ RECURRENCE-ID:19980311T180000Z
+ ORGANIZER:mailto:a@example.com
+ ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:mailto:a@example.com
+ ATTENDEE;RSVP=TRUE:mailto:b@example.com
+ SUMMARY:Review Accounts
+ DTSTART:19980311T160000Z
+ DTEND:19980311T180000Z
+ DTSTAMP:19980306T193000Z
+ LOCATION:The Small conference room
+ STATUS:CONFIRMED
+ END:VEVENT
+ END:VCALENDAR
+
+ Organizer adds a 4th instance of the meeting using the "ADD" method.
+
+ BEGIN:VCALENDAR
+ METHOD:ADD
+ PRODID:-//Example/ExampleCalendarClient//EN
+ VERSION:2.0
+ BEGIN:VEVENT
+ UID:123456789@example.com
+ SEQUENCE:2
+ ORGANIZER:mailto:a@example.com
+ ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:mailto:a@example.com
+ ATTENDEE;RSVP=TRUE:mailto:b@example.com
+ SUMMARY:Review Accounts
+ DTSTART:19980315T180000Z
+ DTEND:19980315T200000Z
+ DTSTAMP:19980307T193000Z
+ LOCATION:Conference Room A
+ STATUS:CONFIRMED
+ END:VEVENT
+ END:VCALENDAR
+
+
+
+
+
+
+Daboo Standards Track [Page 105]
+
+RFC 5546 iTIP December 2009
+
+
+ If "B" requests a "REFRESH", "A" responds with the following to
+ capture all instance-specific data. In this case, both the initial
+ request and an additional "VEVENT" that specifies the instance-
+ specific data are included. Because these are both of the same type
+ (they are both "VEVENTS"), they can be conveyed in the same iCalendar
+ object.
+
+ BEGIN:VCALENDAR
+ METHOD:REQUEST
+ PRODID:-//Example/ExampleCalendarClient//EN
+ VERSION:2.0
+ BEGIN:VEVENT
+ UID:123456789@example.com
+ SEQUENCE:2
+ RDATE:19980304T180000Z
+ RDATE:19980311T160000Z
+ RDATE:19980315T180000Z
+ ORGANIZER:mailto:a@example.com
+ ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:mailto:a@example.com
+ ATTENDEE;RSVP=TRUE:mailto:b@example.com
+ SUMMARY:Review Accounts
+ DTSTART:19980304T180000Z
+ DTEND:19980304T200000Z
+ DTSTAMP:19980303T193000Z
+ LOCATION:Conference Room A
+ STATUS:CONFIRMED
+ END:VEVENT
+ BEGIN:VEVENT
+ SEQUENCE:2
+ UID:123456789@example.com
+ RECURRENCE-ID:19980311T160000Z
+ ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:mailto:a@example.com
+ ATTENDEE;RSVP=TRUE:mailto:b@example.com
+ SUMMARY:Review Accounts
+ DTSTART:19980311T160000Z
+ DTEND:19980304T180000Z
+ DTSTAMP:19980306T193000Z
+ LOCATION:The Small conference room
+ STATUS:CONFIRMED
+ END:VEVENT
+ END:VCALENDAR
+
+4.4.9. Counter an Instance of a Recurring Event
+
+ In this example, one of the "Attendees" counters the "DTSTART"
+ property of the proposed second July meeting.
+
+
+
+
+
+Daboo Standards Track [Page 106]
+
+RFC 5546 iTIP December 2009
+
+
+ BEGIN:VCALENDAR
+ METHOD:COUNTER
+ PRODID:-//Example/ExampleCalendarClient//EN
+ VERSION:2.0
+ BEGIN:VEVENT
+ UID:guid-1@example.com
+ RECURRENCE-ID:19970715T210000Z
+ SEQUENCE:4
+ ORGANIZER:mailto:a@example.com
+ ATTENDEE;ROLE=CHAIR;RSVP=TRUE:mailto:a@example.com
+ ATTENDEE;RSVP=TRUE:mailto:b@example.com
+ ATTENDEE;RSVP=TRUE:mailto:c@example.com
+ ATTENDEE;RSVP=TRUE:mailto:d@example.com
+ DESCRIPTION:IETF-C&S Conference Call
+ CLASS:PUBLIC
+ SUMMARY:IETF Calendaring Working Group Meeting
+ DTSTART:19970715T220000Z
+ DTEND:19970715T230000Z
+ LOCATION:Conference Call
+ COMMENT:May we bump this by an hour? I have a conflict
+ DTSTAMP:19970629T094000Z
+ END:VEVENT
+ END:VCALENDAR
+
+4.4.10. Error Reply to a Request
+
+ The following example illustrates a scenario where a meeting is
+ proposed containing an unsupported property and a bad property.
+
+ Original Request:
+
+ BEGIN:VCALENDAR
+ METHOD:REQUEST
+ PRODID:-//Example/ExampleCalendarClient//EN
+ VERSION:2.0
+ BEGIN:VEVENT
+ UID:guid-1@example.com
+ SEQUENCE:0
+ RRULE:FREQ=MONTHLY;BYMONTHDAY=1
+ ORGANIZER:mailto:a@example.com
+ ATTENDEE;ROLE=CHAIR:mailto:a@example.com
+ ATTENDEE;RSVP=TRUE:mailto:b@example.com
+ ATTENDEE;RSVP=TRUE:mailto:c@example.com
+ ATTENDEE;RSVP=TRUE:mailto:d@example.com
+ DESCRIPTION:IETF-C&S Conference Call
+ CLASS:PUBLIC
+ SUMMARY:IETF Calendaring Working Group Meeting
+ DTSTART:19970601T210000Z
+
+
+
+Daboo Standards Track [Page 107]
+
+RFC 5546 iTIP December 2009
+
+
+ DTEND:19970601T220000Z
+ DTSTAMP:19970602T094000Z
+ LOCATION:Conference Call
+ STATUS:CONFIRMED
+ FOO:BAR
+ END:VEVENT
+ END:VCALENDAR
+
+ "B" responds to indicate that "RRULE" is not supported and that an
+ unrecognized property was encountered.
+
+ BEGIN:VCALENDAR
+ PRODID:-//Example/ExampleCalendarClient//EN
+ METHOD:REPLY
+ VERSION:2.0
+ BEGIN:VEVENT
+ ORGANIZER:mailto:a@example.com
+ ATTENDEE:mailto:b@example.com
+ REQUEST-STATUS:3.0;Invalid Property Name;FOO
+ UID:guid-1@example.com
+ SEQUENCE:0
+ DTSTAMP:19970603T094000Z
+ END:VEVENT
+ END:VCALENDAR
+
+4.5. Group To-Do Examples
+
+ Individual "A" creates a group task in which individuals "A", "B",
+ "C", and "D" will participate. Individual "B" confirms acceptance of
+ the task. Individual "C" declines the task. Individual "D"
+ tentatively accepts the task. The following table illustrates the
+ sequence of messages that would be exchanged between these
+ individuals. Individual "A" then issues a "REQUEST" method to obtain
+ the status of the to-do from each participant. The response
+ indicates the individual "Attendee's" completion status. The table
+ below illustrates the message flow.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo Standards Track [Page 108]
+
+RFC 5546 iTIP December 2009
+
+
+ +--------------+------------------------+---------------------------+
+ | Action | Organizer | Attendee |
+ +--------------+------------------------+---------------------------+
+ | Initiate a | "A" sends a REQUEST | |
+ | to-do | message to "B", "C", | |
+ | request | and "D". | |
+ | | | |
+ | Accept the | | "B" sends a REPLY message |
+ | to-do | | to "A" with its PARTSTAT |
+ | request | | parameter set to |
+ | | | ACCEPTED. |
+ | | | |
+ | Decline the | | "C" sends a REPLY message |
+ | to-do | | to "A" with its PARTSTAT |
+ | request | | parameter set to |
+ | | | DECLINED. |
+ | | | |
+ | Tentatively | | "D" sends a REPLY message |
+ | accept the | | to "A" with its PARTSTAT |
+ | to-do | | parameter set to |
+ | request | | TENTATIVE. |
+ | | | |
+ | Check | "A" sends a REQUEST | |
+ | Attendee | message to "B" and "D" | |
+ | completion | with current | |
+ | status | information. | |
+ | | | |
+ | Attendee | | "B" sends a REPLY message |
+ | indicates | | indicating percent |
+ | percent | | complete. |
+ | complete | | |
+ | | | |
+ | Attendee | | "D" sends a REPLY message |
+ | indicates | | indicating completion. |
+ | completion | | |
+ +--------------+------------------------+---------------------------+
+
+4.5.1. A VTODO Request
+
+ A sample "REQUEST" for a "VTODO" calendar component that "A" sends to
+ "B", "C", and "D".
+
+ BEGIN:VCALENDAR
+ PRODID:-//Example/ExampleCalendarClient//EN
+ METHOD:REQUEST
+ VERSION:2.0
+ BEGIN:VTODO
+ ORGANIZER:mailto:a@example.com
+
+
+
+Daboo Standards Track [Page 109]
+
+RFC 5546 iTIP December 2009
+
+
+ ATTENDEE;ROLE=CHAIR:mailto:a@example.com
+ ATTENDEE;RSVP=TRUE:mailto:b@example.com
+ ATTENDEE;RSVP=TRUE:mailto:c@example.com
+ ATTENDEE;RSVP=TRUE:mailto:d@example.com
+ DTSTART:19970701T170000Z
+ DUE:19970722T170000Z
+ PRIORITY:1
+ SUMMARY:Create the requirements document
+ UID:calsrv.example.com-873970198738777-00@example.com
+ SEQUENCE:0
+ DTSTAMP:19970717T200000Z
+ STATUS:NEEDS-ACTION
+ END:VTODO
+ END:VCALENDAR
+
+4.5.2. A VTODO Reply
+
+ "B" accepts the to-do.
+
+ BEGIN:VCALENDAR
+ PRODID:-//Example/ExampleCalendarClient//EN
+ METHOD:REPLY
+ VERSION:2.0
+ BEGIN:VTODO
+ ORGANIZER:mailto:a@example.com
+ ATTENDEE;PARTSTAT=ACCEPTED:mailto:b@example.com
+ UID:calsrv.example.com-873970198738777-00@example.com
+ COMMENT:I'll send you my input by email
+ SEQUENCE:0
+ DTSTAMP:19970717T203000Z
+ REQUEST-STATUS:2.0;Success
+ END:VTODO
+ END:VCALENDAR
+
+ "B" could have declined the "VTODO" or indicated tentative acceptance
+ by setting the "PARTSTAT" property parameter sequence to "DECLINED"
+ or "TENTATIVE", respectively.
+
+4.5.3. A VTODO Request for Updated Status
+
+ "A" requests status from all "Attendees".
+
+ BEGIN:VCALENDAR
+ PRODID:-//Example/ExampleCalendarClient//EN
+ METHOD:REQUEST
+ VERSION:2.0
+ BEGIN:VTODO
+ ORGANIZER:mailto:a@example.com
+
+
+
+Daboo Standards Track [Page 110]
+
+RFC 5546 iTIP December 2009
+
+
+ ATTENDEE;ROLE=CHAIR:mailto:a@example.com
+ ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:mailto:b@example.com
+ ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:mailto:d@example.com
+ UID:calsrv.example.com-873970198738777-00@example.com
+ SUMMARY:Create the requirements document
+ PRIORITY:1
+ SEQUENCE:0
+ STATUS:IN-PROCESS
+ DTSTART:19970701T170000Z
+ DTSTAMP:19970717T230000Z
+ END:VTODO
+ END:VCALENDAR
+
+4.5.4. A Reply: Percent-Complete
+
+ A reply indicating the task being worked on and that "B" is 75%
+ complete with "B's" part of the assignment.
+
+ BEGIN:VCALENDAR
+ PRODID:-//Example/ExampleCalendarClient//EN
+ METHOD:REPLY
+ VERSION:2.0
+ BEGIN:VTODO
+ ORGANIZER:mailto:a@example.com
+ ATTENDEE;PARTSTAT=IN-PROCESS:mailto:b@example.com
+ PERCENT-COMPLETE:75
+ UID:calsrv.example.com-873970198738777-00@example.com
+ DTSTAMP:19970717T233000Z
+ SEQUENCE:0
+ END:VTODO
+ END:VCALENDAR
+
+4.5.5. A Reply: Completed
+
+ A reply indicating that "D" completed "D's" part of the assignment.
+
+ BEGIN:VCALENDAR
+ PRODID:-//Example/ExampleCalendarClient//EN
+ METHOD:REPLY
+ VERSION:2.0
+ BEGIN:VTODO
+ ORGANIZER:mailto:a@example.com
+ ATTENDEE;PARTSTAT=COMPLETED:mailto:d@example.com
+ UID:calsrv.example.com-873970198738777-00@example.com
+ DTSTAMP:19970717T233000Z
+ SEQUENCE:0
+ END:VTODO
+ END:VCALENDAR
+
+
+
+Daboo Standards Track [Page 111]
+
+RFC 5546 iTIP December 2009
+
+
+4.5.6. An Updated VTODO Request
+
+ "Organizer" "A" resends the "VTODO" calendar component. "A" sets the
+ overall completion for the to-do at 40%.
+
+ BEGIN:VCALENDAR
+ PRODID:-//Example/ExampleCalendarClient//EN
+ METHOD:REQUEST
+ VERSION:2.0
+ BEGIN:VTODO
+ ORGANIZER:mailto:a@example.com
+ ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:mailto:a@example.com
+ ATTENDEE;PARTSTAT=ACCEPTED;CUTYPE=INDIVIDUAL:mailto:b@example.com
+ ATTENDEE;PARTSTAT=COMPLETED;CUTYPE=INDIVIDUAL:mailto:d@example.com
+ DTSTART:19970701T170000Z
+ DUE:19970722T170000Z
+ PRIORITY:1
+ SUMMARY:Create the requirements document
+ UID:calsrv.example.com-873970198738777-00@example.com
+ SEQUENCE:1
+ DTSTAMP:19970718T100000Z
+ STATUS:IN-PROCESS
+ PERCENT-COMPLETE:40
+ END:VTODO
+ END:VCALENDAR
+
+4.5.7. Recurring VTODOs
+
+ The following examples relate to recurring "VTODO" calendar
+ components.
+
+4.5.7.1. Request for a Recurring VTODO
+
+ In this example, "A" sends a recurring "VTODO" calendar component to
+ "B" and "D".
+
+ BEGIN:VCALENDAR
+ PRODID:-//Example/ExampleCalendarClient//EN
+ METHOD:REQUEST
+ VERSION:2.0
+ BEGIN:VTODO
+ ORGANIZER:mailto:a@example.com
+ ATTENDEE;ROLE=CHAIR:mailto:a@example.com
+ ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:mailto:b@example.com
+ ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:mailto:d@example.com
+ RRULE:FREQ=MONTHLY;COUNT=10;BYDAY=1FR
+ DTSTART:19980101T100000Z
+ DUE:19980103T100000Z
+
+
+
+Daboo Standards Track [Page 112]
+
+RFC 5546 iTIP December 2009
+
+
+ SUMMARY:Send Status Reports to Area Managers
+ UID:calsrv.example.com-873970198738777-00@example.com
+ SEQUENCE:0
+ DTSTAMP:19970717T200000Z
+ STATUS:NEEDS-ACTION
+ PRIORITY:1
+ END:VTODO
+ END:VCALENDAR
+
+4.5.7.2. Replying to an Instance of a Recurring VTODO
+
+ In this example, "B" updates "A" on a single instance of the "VTODO"
+ calendar component.
+
+ BEGIN:VCALENDAR
+ PRODID:-//Example/ExampleCalendarClient//EN
+ METHOD:REPLY
+ VERSION:2.0
+ BEGIN:VTODO
+ ATTENDEE;PARTSTAT=IN-PROCESS:mailto:b@example.com
+ PERCENT-COMPLETE:75
+ UID:calsrv.example.com-873970198738777-00@example.com
+ DTSTAMP:19970717T233000Z
+ RECURRENCE-ID:19980101T170000Z
+ SEQUENCE:1
+ END:VTODO
+ END:VCALENDAR
+
+4.6. Journal Examples
+
+ The iCalendar object below describes a single journal entry for
+ October 2, 1997. The "RELATED-TO" property references the phone
+ conference event for which minutes were taken.
+
+ BEGIN:VCALENDAR
+ METHOD:PUBLISH
+ PRODID:-//Example/ExampleCalendarClient//EN
+ VERSION:2.0
+ BEGIN:VJOURNAL
+ DTSTART:19971002T200000Z
+ DTSTAMP:19970717T233100Z
+ ORGANIZER:mailto:a@example.com
+ SUMMARY:Phone conference minutes
+ DESCRIPTION:The editors meeting was held on October 1, 1997.
+ Details are in the attached document.
+ UID:0981234-1234234-2410@example.com
+ RELATED-TO:0981234-1234234-2402-35@example.com
+ ATTACH:ftp://ftp.example.com/pub/ed/minutes100197.txt
+
+
+
+Daboo Standards Track [Page 113]
+
+RFC 5546 iTIP December 2009
+
+
+ END:VJOURNAL
+ END:VCALENDAR
+
+4.7. Other Examples
+
+4.7.1. Event Refresh
+
+ Refresh the event with a "UID" property value of
+ "guid-1-12345@example.com":
+
+ BEGIN:VCALENDAR
+ PRODID:-//Example/ExampleCalendarClient//EN
+ METHOD:REFRESH
+ VERSION:2.0
+ BEGIN:VEVENT
+ ORGANIZER:mailto:a@example.com
+ ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:mailto:a@example.com
+ ATTENDEE:mailto:b@example.com
+ ATTENDEE:mailto:c@example.com
+ ATTENDEE:mailto:d@example.com
+ UID:guid-1-12345@example.com
+ DTSTAMP:19970603T094000
+ END:VEVENT
+ END:VCALENDAR
+
+4.7.2. Bad RECURRENCE-ID
+
+ Component instances are identified by the combination of "UID",
+ "RECURRENCE-ID", and "SEQUENCE". When an "Organizer" sends an iTIP
+ message to an "Attendee", there are three cases in which an instance
+ cannot be found. They are:
+
+ 1. The component with the referenced "UID" and "RECURRENCE-ID" has
+ been found but the "SEQUENCE" number in the calendar store does
+ not match that of the iTIP message.
+
+ 2. The component with the referenced "UID" has been found, the
+ "SEQUENCE" numbers match, but the "RECURRENCE-ID" cannot be
+ found.
+
+ 3. The "UID" and "SEQUENCE" numbers are found but the CUA does not
+ support recurrences.
+
+ In case (1), two things can happen. If the "SEQUENCE" number of the
+ "Attendee's" instance is larger than that in the "Organizer's"
+ message, then the "Attendee" is receiving an out-of-sequence message
+ and MUST ignore it. If the "SEQUENCE" number of the "Attendee's"
+ instance is smaller, then the "Organizer" is sending out a newer
+
+
+
+Daboo Standards Track [Page 114]
+
+RFC 5546 iTIP December 2009
+
+
+ version of the component and the "Attendee's" version needs to be
+ updated. Since one or more updates have been missed, the "Attendee"
+ SHOULD send a "REFRESH" message to the "Organizer" to get an updated
+ version of the event.
+
+ In case (2), something has gone wrong. Both the "Organizer" and the
+ "Attendee" should have the same instances, but the "Attendee" does
+ not have the referenced instance. In this case, the "Attendee"
+ SHOULD send a "REFRESH" to the "Organizer" to get an updated version
+ of the event.
+
+ In case (3), the limitations of the "Attendee's" CUA makes it
+ impossible to match an instance other than the single instance
+ scheduled. In this case, the "Attendee" need not send a "REFRESH" to
+ the "Organizer".
+
+ The example below shows a sequence in which an "Attendee" sends a
+ "REFRESH" to the "Organizer".
+
+ +-------------------------+--------------------+--------------------+
+ | Action | Organizer | Attendee |
+ +-------------------------+--------------------+--------------------+
+ | Update an instance | "A" sends REQUEST | |
+ | request | message to "B". | |
+ | | | |
+ | Attendee requests | | "B" sends a |
+ | refresh because | | REFRESH message to |
+ | RECURRENCE-ID was not | | "A". |
+ | found | | |
+ | | | |
+ | Refresh the entire | "A" sends the | |
+ | event | latest copy of the | |
+ | | event to "B" | |
+ | | | |
+ | Attendee handles the | | "B" updates to the |
+ | request and updates the | | latest copy of the |
+ | instance | | meeting. |
+ +-------------------------+--------------------+--------------------+
+
+ Request from "A":
+
+ BEGIN:VCALENDAR
+ METHOD:REQUEST
+ PRODID:-//Example/ExampleCalendarClient//EN
+ VERSION:2.0
+ BEGIN:VEVENT
+ UID:example-12345@example.com
+ SEQUENCE:3
+
+
+
+Daboo Standards Track [Page 115]
+
+RFC 5546 iTIP December 2009
+
+
+ RRULE:FREQ=WEEKLY
+ RDATE;VALUE=PERIOD:19970819T210000Z/199700819T220000Z
+ ORGANIZER:mailto:a@example.com
+ ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:mailto:a@example.com
+ ATTENDEE:mailto:b@example.com
+ DESCRIPTION:IETF-C&S Conference Call
+ SUMMARY:IETF Calendaring Working Group Meeting
+ DTSTART:19970801T210000Z
+ DTEND:19970801T220000Z
+ RECURRENCE-ID:19970809T210000Z
+ DTSTAMP:19970726T083000
+ STATUS:CONFIRMED
+ END:VEVENT
+ END:VCALENDAR
+
+ "B" has the event with "UID" property "example-12345@example.com",
+ but "B's" "SEQUENCE" property value is "1" and the event does not
+ have an instance at the specified recurrence time. This means that
+ "B" has missed at least one update and needs a new copy of the event.
+ "B" requests the latest copy of the event with the following refresh
+ message:
+
+ BEGIN:VCALENDAR
+ PRODID:-//Example/ExampleCalendarClient//EN
+ METHOD:REFRESH
+ VERSION:2.0
+ BEGIN:VEVENT
+ ORGANIZER:mailto:a@example.com
+ ATTENDEE:mailto:b@example.com
+ UID:example-12345@example.com
+ DTSTAMP:19970603T094000
+ END:VEVENT
+ END:VCALENDAR
+
+5. Application Protocol Fallbacks
+
+5.1. Partial Implementation
+
+ Applications that support this specification are not required to
+ support the entire protocol. The following describes how methods and
+ properties SHOULD "fallback" in applications that do not support the
+ complete protocol. If a method or property is not addressed in this
+ section, it may be ignored.
+
+
+
+
+
+
+
+
+Daboo Standards Track [Page 116]
+
+RFC 5546 iTIP December 2009
+
+
+5.1.1. Event-Related Fallbacks
+
+ +----------------+--------------------------------------------------+
+ | Method | Fallback |
+ +----------------+--------------------------------------------------+
+ | PUBLISH | Required |
+ | REQUEST | PUBLISH |
+ | REPLY | Required |
+ | ADD | Required if recurrences supported; otherwise, |
+ | | reply with a REQUEST-STATUS "2.8; Success, |
+ | | repeating event ignored. Scheduled as a single |
+ | | component", and schedule as a single component. |
+ | CANCEL | Required |
+ | REFRESH | Required |
+ | COUNTER | Reply with "Not Supported". |
+ | DECLINECOUNTER | Required if COUNTER is implemented for VEVENTs; |
+ | | otherwise, reply with "Not Supported". |
+ +----------------+--------------------------------------------------+
+
+ +-----------------+-------------------------------------------------+
+ | iCalendar | Fallback |
+ | Property | |
+ +-----------------+-------------------------------------------------+
+ | CALSCALE | Ignore - assume GREGORIAN. |
+ | PRODID | Ignore |
+ | METHOD | Required as described in the Method list above. |
+ | VERSION | Ignore |
+ +-----------------+-------------------------------------------------+
+
+ +-----------------+-------------------------------------------------+
+ | Event-Related | Fallback |
+ | Components | |
+ +-----------------+-------------------------------------------------+
+ | VALARM | Reply with "Not Supported". |
+ | VTIMEZONE | Required if any DateTime value refers to a time |
+ | | zone. |
+ +-----------------+-------------------------------------------------+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo Standards Track [Page 117]
+
+RFC 5546 iTIP December 2009
+
+
+ +-----------------+-------------------------------------------------+
+ | Component | Fallback |
+ | Property | |
+ +-----------------+-------------------------------------------------+
+ | ATTACH | Ignore |
+ | ATTENDEE | Required if METHOD is REQUEST; otherwise, |
+ | | ignore. |
+ | CATEGORIES | Ignore |
+ | CLASS | Ignore |
+ | COMMENT | Ignore |
+ | COMPLETED | Ignore |
+ | CONTACT | Ignore |
+ | CREATED | Ignore |
+ | DESCRIPTION | Ignore |
+ | DURATION | Required |
+ | DTSTAMP | Required |
+ | DTSTART | Required |
+ | DTEND | Required |
+ | EXDATE | Ignore |
+ | GEO | Ignore |
+ | LAST-MODIFIED | Ignore |
+ | LOCATION | Required |
+ | ORGANIZER | Required if METHOD is REQUEST; otherwise, |
+ | | ignore. |
+ | PRIORITY | Ignore |
+ | RELATED-TO | Ignore |
+ | RDATE | Ignore |
+ | RRULE | Ignore - assume the first instance occurs on |
+ | | the DTSTART property. If implemented, |
+ | | VTIMEZONE MUST also be implemented. |
+ | RECURRENCE-ID | Required if RRULE is implemented; otherwise, |
+ | | ignore. |
+ | REQUEST-STATUS | Required |
+ | RESOURCES | Ignore |
+ | SEQUENCE | Required |
+ | STATUS | Ignore |
+ | SUMMARY | Ignore |
+ | TRANSP | Required if FREEBUSY is implemented; otherwise, |
+ | | ignore. |
+ | URL | Ignore |
+ | UID | Required |
+ | X- | Ignore |
+ +-----------------+-------------------------------------------------+
+
+
+
+
+
+
+
+
+Daboo Standards Track [Page 118]
+
+RFC 5546 iTIP December 2009
+
+
+5.1.2. Free/Busy-Related Fallbacks
+
+ +---------+---------------------------------------------------------+
+ | Method | Fallback |
+ +---------+---------------------------------------------------------+
+ | PUBLISH | Required if freebusy lookups are supported; otherwise, |
+ | | reply with a REQUEST-STATUS "3.14; Unsupported |
+ | | capability". |
+ | REQUEST | Required if freebusy lookups are supported; otherwise, |
+ | | reply with a REQUEST-STATUS "3.14; Unsupported |
+ | | capability". |
+ | REPLY | Required if freebusy lookups are supported; otherwise, |
+ | | reply with a REQUEST-STATUS "3.14; Unsupported |
+ | | capability". |
+ +---------+---------------------------------------------------------+
+
+ +-----------------+-------------------------------------------------+
+ | iCalendar | Fallback |
+ | Property | |
+ +-----------------+-------------------------------------------------+
+ | CALSCALE | Ignore - assume GREGORIAN. |
+ | PRODID | Ignore |
+ | METHOD | Required as described in the Method list above. |
+ | VERSION | Ignore |
+ +-----------------+-------------------------------------------------+
+
+ +-----------------+-------------------------------------------------+
+ | Component | Fallback |
+ | Property | |
+ +-----------------+-------------------------------------------------+
+ | ATTENDEE | Required if METHOD is REQUEST; otherwise, |
+ | | ignore. |
+ | COMMENT | Ignore |
+ | CONTACT | Ignore |
+ | DTEND | Required |
+ | DTSTAMP | Required |
+ | DTSTART | Required |
+ | DURATION | Ignore |
+ | FREEBUSY | Required |
+ | ORGANIZER | Required if METHOD is REQUEST; otherwise, |
+ | | ignore. |
+ | REQUEST-STATUS | Ignore |
+ | UID | Required |
+ | URL | Ignore |
+ | X- | Ignore |
+ +-----------------+-------------------------------------------------+
+
+
+
+
+
+Daboo Standards Track [Page 119]
+
+RFC 5546 iTIP December 2009
+
+
+5.1.3. To-Do-Related Fallbacks
+
+ +----------------+--------------------------------------------------+
+ | Method | Fallback |
+ +----------------+--------------------------------------------------+
+ | PUBLISH | Required |
+ | REQUEST | PUBLISH |
+ | REPLY | Required |
+ | ADD | Required if recurrences supported; otherwise, |
+ | | reply with a REQUEST-STATUS "2.8; Success, |
+ | | repeating event ignored. Scheduled as a single |
+ | | component", and schedule as a single component. |
+ | CANCEL | Required |
+ | REFRESH | Required |
+ | COUNTER | Reply with "Not Supported". |
+ | DECLINECOUNTER | Required if COUNTER for VTODOs is implemented; |
+ | | otherwise, reply with "Not Supported". |
+ +----------------+--------------------------------------------------+
+
+ +-----------------+-------------------------------------------------+
+ | iCalendar | Fallback |
+ | Property | |
+ +-----------------+-------------------------------------------------+
+ | CALSCALE | Ignore - assume GREGORIAN. |
+ | PRODID | Ignore |
+ | METHOD | Required as described in the Method list above. |
+ | VERSION | Ignore |
+ +-----------------+-------------------------------------------------+
+
+ +-----------------+-------------------------------------------------+
+ | To-Do-Related | Fallback |
+ | Components | |
+ +-----------------+-------------------------------------------------+
+ | VALARM | Reply with "Not Supported". |
+ | VTIMEZONE | Required if any DateTime value refers to a time |
+ | | zone. |
+ +-----------------+-------------------------------------------------+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo Standards Track [Page 120]
+
+RFC 5546 iTIP December 2009
+
+
+ +------------------+------------------------------------------------+
+ | Component | Fallback |
+ | Property | |
+ +------------------+------------------------------------------------+
+ | ATTACH | Ignore |
+ | ATTENDEE | Required if METHOD is REQUEST; otherwise, |
+ | | ignore. |
+ | CATEGORIES | Ignore |
+ | CLASS | Ignore |
+ | COMMENT | Ignore |
+ | COMPLETED | Required |
+ | CONTACT | Ignore |
+ | CREATED | Ignore |
+ | DESCRIPTION | Required if METHOD is REQUEST; otherwise, |
+ | | ignore. |
+ | DUE | Required |
+ | DURATION | Required |
+ | DTSTAMP | Required |
+ | DTSTART | Required |
+ | EXDATE | Ignore - reply with "Not Supported". |
+ | LAST-MODIFIED | Ignore |
+ | LOCATION | Ignore |
+ | ORGANIZER | Required if METHOD is REQUEST; otherwise, |
+ | | ignore. |
+ | PERCENT-COMPLETE | Ignore |
+ | PRIORITY | Required |
+ | RECURRENCE-ID | Required if RRULE is implemented; otherwise, |
+ | | ignore. |
+ | RELATED-TO | Ignore |
+ | REQUEST-STATUS | Ignore |
+ | RDATE | Ignore |
+ | RRULE | Ignore - assume the first instance occurs on |
+ | | the DTSTART property. If implemented, |
+ | | VTIMEZONE MUST also be implemented. |
+ | RESOURCES | Ignore |
+ | SEQUENCE | Required |
+ | STATUS | Required |
+ | SUMMARY | Ignore |
+ | URL | Ignore |
+ | UID | Required |
+ | X- | Ignore |
+ +------------------+------------------------------------------------+
+
+
+
+
+
+
+
+
+
+Daboo Standards Track [Page 121]
+
+RFC 5546 iTIP December 2009
+
+
+5.1.4. Journal-Related Fallbacks
+
+ +---------+---------------------------------------------------------+
+ | Method | Fallback |
+ +---------+---------------------------------------------------------+
+ | PUBLISH | Implementations MAY ignore the METHOD type. The |
+ | | REQUEST-STATUS "3.14; Unsupported capability" MUST be |
+ | | returned. |
+ | ADD | Implementations MAY ignore the METHOD type. The |
+ | | REQUEST-STATUS "3.14; Unsupported capability" MUST be |
+ | | returned. |
+ | CANCEL | Implementations MAY ignore the METHOD type. The |
+ | | REQUEST-STATUS "3.14; Unsupported capability" MUST be |
+ | | returned. |
+ +---------+---------------------------------------------------------+
+
+ +-----------------+-------------------------------------------------+
+ | iCalendar | Fallback |
+ | Property | |
+ +-----------------+-------------------------------------------------+
+ | CALSCALE | Ignore - assume GREGORIAN. |
+ | PRODID | Ignore |
+ | METHOD | Required as described in the Method list above. |
+ | VERSION | Ignore |
+ +-----------------+-------------------------------------------------+
+
+ +-----------------+-------------------------------------------------+
+ | Journal-Related | Fallback |
+ | Components | |
+ +-----------------+-------------------------------------------------+
+ | VTIMEZONE | Required if any DateTime value refers to a time |
+ | | zone. |
+ +-----------------+-------------------------------------------------+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo Standards Track [Page 122]
+
+RFC 5546 iTIP December 2009
+
+
+ +-----------------+-------------------------------------------------+
+ | Component | Fallback |
+ | Property | |
+ +-----------------+-------------------------------------------------+
+ | ATTACH | Ignore |
+ | ATTENDEE | Ignore |
+ | CATEGORIES | Ignore |
+ | CLASS | Ignore |
+ | COMMENT | Ignore |
+ | CONTACT | Ignore |
+ | CREATED | Ignore |
+ | DESCRIPTION | Ignore |
+ | DTSTAMP | Required |
+ | DTSTART | Required |
+ | EXDATE | Ignore |
+ | LAST-MODIFIED | Ignore |
+ | ORGANIZER | Ignore |
+ | RECURRENCE-ID | Required if RRULE is implemented; otherwise, |
+ | | ignore. |
+ | RELATED-TO | Ignore |
+ | RDATE | Ignore |
+ | RRULE | Ignore - assume the first instance occurs on |
+ | | the DTSTART property. If implemented, |
+ | | VTIMEZONE MUST also be implemented. |
+ | SEQUENCE | Required |
+ | STATUS | Ignore |
+ | SUMMARY | Required |
+ | URL | Ignore |
+ | UID | Required |
+ | X- | Ignore |
+ +-----------------+-------------------------------------------------+
+
+5.2. Latency Issues
+
+ With a store-and-forward transport, it is possible for events to
+ arrive out of sequence. That is, a "CANCEL" method may be received
+ prior to receiving the associated "REQUEST" for the calendar
+ component. This section discusses a few of these scenarios.
+
+5.2.1. Cancellation of an Unknown Calendar Component
+
+ When a "CANCEL" method is received before the original "REQUEST"
+ method, the calendar will be unable to correlate the "UID" property
+ of the cancellation with an existing calendar component. It is
+ suggested that messages that cannot be correlated and that also
+ contain non-zero sequence numbers be held and not discarded.
+ Implementations MAY age them out if no other messages arrive with the
+ same "UID" property value and a lower sequence number.
+
+
+
+Daboo Standards Track [Page 123]
+
+RFC 5546 iTIP December 2009
+
+
+5.2.2. Unexpected Reply from an Unknown Delegate
+
+ When an "Attendee" delegates an item to another CU, they MUST send a
+ "REPLY" method to the "Organizer" using the "ATTENDEE" properties to
+ indicate that the request was delegated and to whom. Hence, it is
+ possible for an "Organizer" to receive a "REPLY" from a CU not listed
+ as one of the original "Attendees". The resolution is left to the
+ implementation, but it is expected that the calendaring software will
+ either accept the reply or hold it until the related "REPLY" method
+ is received from the "Delegator". If the version of the "REPLY"
+ method is out of date, the "Organizer" SHOULD treat the message as a
+ "REFRESH" message and update the "Delegate" with the correct version,
+ provided that delegation to that delegate is acceptable.
+
+5.3. Sequence Number
+
+ Under some conditions, a CUA may receive requests and replies with
+ the same "SEQUENCE" property value. The "DTSTAMP" property is
+ utilized as a tie-breaker when two items with the same "SEQUENCE"
+ property value are evaluated.
+
+6. Security Considerations
+
+ iTIP is an abstract transport protocol that will be bound to a real-
+ time transport, a store-and-forward transport, and perhaps other
+ transports. The transport protocol will be responsible for providing
+ facilities for authentication and encryption using standard Internet
+ mechanisms that are mutually understood between the sender and
+ receiver.
+
+6.1. Security Threats
+
+6.1.1. Spoofing the Organizer
+
+ In iTIP, the "Organizer" (or someone working on the "Organizer's"
+ behalf) is the only person authorized to make changes to an existing
+ "VEVENT", "VTODO", or "VJOURNAL" calendar component and republish it
+ or redistribute updates to the "Attendees". An iCalendar object that
+ maliciously changes or cancels an existing "VEVENT", "VTODO", or
+ "VJOURNAL" calendar component may be constructed by someone other
+ than the "Organizer" and republished or sent to the "Attendees".
+
+6.1.2. Spoofing the Attendee
+
+ In iTIP, an "Attendee" of a "VEVENT" or "VTODO" calendar component
+ (or someone working on the "Attendee's" behalf) is the only person
+ authorized to update any parameter associated with their "ATTENDEE"
+
+
+
+
+Daboo Standards Track [Page 124]
+
+RFC 5546 iTIP December 2009
+
+
+ property and send it to the "Organizer". An iCalendar object that
+ maliciously changes the "ATTENDEE" parameters may be constructed by
+ someone other than the real "Attendee" and sent to the "Organizer".
+
+6.1.3. Unauthorized Replacement of the Organizer
+
+ There will be circumstances when "Attendees" of an event or to-do
+ decide, using out-of-band mechanisms, that the "Organizer" must be
+ replaced. When the new "Organizer" sends out the updated "VEVENT" or
+ "VTODO", the "Attendee's" CUA will detect that the "Organizer" has
+ been changed, but it has no way of knowing whether or not the change
+ was mutually agreed upon.
+
+6.1.4. Eavesdropping and Data Integrity
+
+ The iCalendar object is constructed with human-readable clear text.
+ Any information contained in an iCalendar object may be read and/or
+ changed by unauthorized persons while the object is in transit.
+
+6.1.5. Flooding a Calendar
+
+ Implementations could provide a means to automatically incorporate
+ "REQUEST" methods into a calendar. This presents the opportunity for
+ a calendar to be flooded with requests, which effectively blocks all
+ the calendar's free time.
+
+6.1.6. Unauthorized REFRESH Requests
+
+ It is possible for an "Organizer" to receive a "REFRESH" request from
+ someone who is not an "Attendee" of an event or to-do. Only
+ "Attendees" of an event or to-do are authorized to receive replies to
+ "REFRESH" requests. Replying to such requests to anyone who is not
+ an "Attendee" may be a security problem.
+
+6.2. Recommendations
+
+ For an application where the information is sensitive or critical and
+ the network is subject to a high probability of attack, iTIP
+ transactions SHOULD be encrypted and authenticated. This helps
+ mitigate the threats of spoofing, eavesdropping, and malicious
+ changes in transit.
+
+6.2.1. Securing iTIP transactions
+
+ iTIP transport bindings MUST provide a mechanism to enable
+ authentication of the sender's identity as well as privacy and
+ integrity of the data being transmitted. This allows the receiver of
+ a signed iCalendar object to verify the identity of the sender. This
+
+
+
+Daboo Standards Track [Page 125]
+
+RFC 5546 iTIP December 2009
+
+
+ sender may then be correlated to an "ATTENDEE" property in the
+ iCalendar object. If the correlation is made and the sender is
+ authorized to make the requested change or update, then the operation
+ may proceed. It also allows the message to be encrypted to prevent
+ unauthorized reading of the message contents in transit. iTIP
+ transport binding documents describe this process in detail.
+
+6.2.2. Implementation Controls
+
+ The threat of unauthorized replacement of the "Organizer" SHOULD be
+ mitigated by a calendar system that uses this protocol by providing
+ controls or alerts that make "Calendar Users" aware of such
+ "Organizer" changes and allowing them to decide whether or not the
+ request should be honored.
+
+ The threat of flooding a calendar SHOULD be mitigated by a calendar
+ system that uses this protocol by providing controls that may be used
+ to limit the acceptable sources for iTIP transactions, and perhaps
+ the size of messages and volume of traffic, by source.
+
+ The threat of unauthorized "REFRESH" requests SHOULD be mitigated by
+ a calendar system that uses this protocol by providing controls or
+ alerts that allow "Calendar Users" to decide whether or not the
+ request should be honored. An implementation MAY decide to maintain,
+ for audit or historical purposes, "Calendar Users" who were part of
+ an "Attendee" list and who were subsequently uninvited. Similar
+ controls or alerts should be provided when a "REFRESH" request is
+ received from these "Calendar Users" as well.
+
+6.2.3. Access Controls and Filtering
+
+ In many environments, there could be restrictions on who is allowed
+ to schedule with whom and who the allowed delegates are for
+ particular "Calendar Users".
+
+ iTIP transport bindings SHOULD provide mechanisms for implementing
+ access controls or filtering to ensure iTIP transactions only take
+ place between authorized "Calendar Users". That would include
+ preventing one "Calendar User" from scheduling with another or one
+ "Calendar User" delegating to another.
+
+6.3. Privacy Issues
+
+ The "Organizer" might want to keep "Attendees" from knowing which
+ other "Attendees" are participating in an event or to-do. The
+ "Organizer" has the choice of sending single iTIP messages with a
+ full list of "Attendees" or sending iTIP messages to each "Attendee"
+ with only that "Attendee" listed.
+
+
+
+Daboo Standards Track [Page 126]
+
+RFC 5546 iTIP December 2009
+
+
+7. IANA Considerations
+
+7.1. Registration Template for REQUEST-STATUS Values
+
+ This specification updates [RFC5545] by adding a "REQUEST-STATUS"
+ value registry to the iCalendar Elements registry.
+
+ A "REQUEST-STATUS" value is defined by completing the following
+ template.
+
+ Status Code: Hierarchical, numeric return status code, following
+ the rules defined in Section 3.8.8.3 of [RFC5545].
+
+ Status Description: Textual status description. A short but
+ clear description of the error.
+
+ Status Exception Data: Textual exception data. A short but clear
+ description of what might appear in this field.
+
+ Description: Describe the underlying cause for this status code
+ value.
+
+7.2. Additions to iCalendar METHOD Registry
+
+ This document defines the following values for the iCalendar "METHOD"
+ property, using the values template from Section 8.2.6 of [RFC5545].
+ These should be added to the Methods Registry defined in Section
+ 8.3.12 of [RFC5545]:
+
+7.2.1. METHOD:PUBLISH
+
+ Value: PUBLISH
+
+ Purpose: Standard iTIP "METHOD" value.
+
+ Conformance: Only used with the "METHOD" property.
+
+ Examples: See this RFC.
+
+7.2.2. METHOD:REQUEST
+
+ Value: REQUEST
+
+ Purpose: Standard iTIP "METHOD" value.
+
+ Conformance: Only used with the "METHOD" property.
+
+ Examples: See this RFC.
+
+
+
+Daboo Standards Track [Page 127]
+
+RFC 5546 iTIP December 2009
+
+
+7.2.3. METHOD:REPLY
+
+ Value: REPLY
+
+ Purpose: Standard iTIP "METHOD" value.
+
+ Conformance: Only used with the "METHOD" property.
+
+ Examples: See this RFC.
+
+7.2.4. METHOD:ADD
+
+ Value: ADD
+
+ Purpose: Standard iTIP "METHOD" value.
+
+ Conformance: Only used with the "METHOD" property.
+
+ Examples: See this RFC.
+
+7.2.5. METHOD:CANCEL
+
+ Value: CANCEL
+
+ Purpose: Standard iTIP "METHOD" value.
+
+ Conformance: Only used with the "METHOD" property.
+
+ Examples: See this RFC.
+
+7.2.6. METHOD:REFRESH
+
+ Value: REFRESH
+
+ Purpose: Standard iTIP "METHOD" value.
+
+ Conformance: Only used with the "METHOD" property.
+
+ Examples: See this RFC.
+
+7.2.7. METHOD:COUNTER
+
+ Value: COUNTER
+
+ Purpose: Standard iTIP "METHOD" value.
+
+ Conformance: Only used with the "METHOD" property.
+
+
+
+
+Daboo Standards Track [Page 128]
+
+RFC 5546 iTIP December 2009
+
+
+ Examples: See this RFC.
+
+7.2.8. METHOD:DECLINECOUNTER
+
+ Value: DECLINECOUNTER
+
+ Purpose: Standard iTIP "METHOD" value.
+
+ Conformance: Only used with the "METHOD" property.
+
+ Examples: See this RFC.
+
+7.3. REQUEST-STATUS Value Registry
+
+ New "REQUEST-STATUS" values can be registered using the process
+ described in Section 8.2.1 of [RFC5545].
+
+ The following table is to be used to initialize the "REQUEST-STATUS"
+ value registry.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo Standards Track [Page 129]
+
+RFC 5546 iTIP December 2009
+
+
+ +-------------+---------+--------------------------+
+ | Status Code | Status | Reference |
+ +-------------+---------+--------------------------+
+ | 2.0 | Current | RFC 5546, Section 3.6.1 |
+ | 2.1 | Current | RFC 5546, Section 3.6.2 |
+ | 2.2 | Current | RFC 5546, Section 3.6.3 |
+ | 2.3 | Current | RFC 5546, Section 3.6.4 |
+ | 2.4 | Current | RFC 5546, Section 3.6.5 |
+ | 2.5 | Current | RFC 5546, Section 3.6.6 |
+ | 2.6 | Current | RFC 5546, Section 3.6.7 |
+ | 2.7 | Current | RFC 5546, Section 3.6.8 |
+ | 2.8 | Current | RFC 5546, Section 3.6.9 |
+ | 2.9 | Current | RFC 5546, Section 3.6.10 |
+ | 2.10 | Current | RFC 5546, Section 3.6.11 |
+ | 2.11 | Current | RFC 5546, Section 3.6.12 |
+ | 3.0 | Current | RFC 5546, Section 3.6.13 |
+ | 3.1 | Current | RFC 5546, Section 3.6.14 |
+ | 3.2 | Current | RFC 5546, Section 3.6.15 |
+ | 3.3 | Current | RFC 5546, Section 3.6.16 |
+ | 3.4 | Current | RFC 5546, Section 3.6.17 |
+ | 3.5 | Current | RFC 5546, Section 3.6.18 |
+ | 3.6 | Current | RFC 5546, Section 3.6.19 |
+ | 3.7 | Current | RFC 5546, Section 3.6.20 |
+ | 3.8 | Current | RFC 5546, Section 3.6.21 |
+ | 3.9 | Current | RFC 5546, Section 3.6.22 |
+ | 3.10 | Current | RFC 5546, Section 3.6.23 |
+ | 3.11 | Current | RFC 5546, Section 3.6.24 |
+ | 3.12 | Current | RFC 5546, Section 3.6.25 |
+ | 3.13 | Current | RFC 5546, Section 3.6.26 |
+ | 3.14 | Current | RFC 5546, Section 3.6.27 |
+ | 4.0 | Current | RFC 5546, Section 3.6.28 |
+ | 5.0 | Current | RFC 5546, Section 3.6.29 |
+ | 5.1 | Current | RFC 5546, Section 3.6.30 |
+ | 5.2 | Current | RFC 5546, Section 3.6.31 |
+ | 5.3 | Current | RFC 5546, Section 3.6.32 |
+ +-------------+---------+--------------------------+
+
+8. Acknowledgments
+
+ This is an update to the original iTIP document authored by S.
+ Silverberg, S. Mansour, F. Dawson, and R. Hopson.
+
+ This revision is the product of the Calsify IETF Working Group, and
+ several participants have made important contributions to this
+ specification, including Oliver Block, Bernard Desruisseaux, Mike
+ Douglass, Tim Hare, Ciny Joy, Bruce Kahn, Reinhold Kainhofer, Eliot
+ Lear, Jonathan Lennox, Andy Mabbett, Aki Niemi, John W. Noerenberg
+ II, Robert Ransdell, and Caleb Richardson.
+
+
+
+Daboo Standards Track [Page 130]
+
+RFC 5546 iTIP December 2009
+
+
+9. References
+
+9.1. Normative References
+
+ [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
+ Requirement Levels", BCP 14, RFC 2119, March 1997.
+
+ [RFC2368] Hoffman, P., Masinter, L., and J. Zawinski, "The mailto
+ URL scheme", RFC 2368, July 1998.
+
+ [RFC5545] Desruisseaux, B., "Internet Calendaring and Scheduling
+ Core Object Specification (iCalendar)", RFC 5545,
+ September 2009.
+
+9.2. Informative References
+
+ [iMIP] Melnikov, A., Ed., "iCalendar Message-Based
+ Interoperability Protocol (iMIP)", Work in Progress,
+ October 2009.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo Standards Track [Page 131]
+
+RFC 5546 iTIP December 2009
+
+
+Appendix A. Differences from RFC 2446
+
+A.1. Changed Restrictions
+
+ This specification now defines an allowed combination of "REQUEST-
+ STATUS" codes when multiple iCalendar components are included in an
+ iTIP message.
+
+ This specification now restricts "RECURRENCE-ID" to only a single
+ occurrence in any one iCalendar component in an iTIP message, as
+ required by [RFC5545].
+
+ Changed the "RECURRENCE-ID" entry in the component restriction table
+ to "0 or 1" from "0+", to fall in line with [RFC5545].
+
+ Changed the "FREEBUSY" entry in the "VFREEBUSY", "PUBLISH", and
+ "REPLY" restriction tables to "0+" from "1+", to fall in line with
+ [RFC5545].
+
+ Changed the "FREEBUSY" description in the "VFREEBUSY" and "REPLY"
+ restriction tables to indicate that different "FBTYPE" ranges MUST
+ NOT overlap.
+
+ Changed the "TZNAME" entry in the "VTIMEZONE" restriction table to
+ "0+" from "0 or 1", to fall in line with [RFC5545].
+
+ Changed the "COMMENT" entry in the component restriction tables to
+ "0+" from "0 or 1", to fall in line with [RFC5545].
+
+ Added the "ATTENDEE" entry in the "VALARM" restriction table to match
+ the email alarm type in [RFC5545].
+
+ Changed the "CATEGORIES" entry in the component restriction tables to
+ "0+" from "0 or 1", to fall in line with [RFC5545].
+
+ Changed the "RESOURCES" entry in the component restriction tables to
+ "0+" from "0 or 1", to fall in line with [RFC5545].
+
+ Changed the "CONTACT" entry in the "VFREEBUSY" restriction table to
+ "0 or 1" from "0+", to fall in line with [RFC5545].
+
+ Changed the "UID" entry in the "VFREEBUSY" and "PUBLISH" restriction
+ tables to "1" from "0", to fall in line with [RFC5545].
+
+ Added the "COMPLETED" entry in the "VTODO" restriction tables to fall
+ in line with [RFC5545].
+
+
+
+
+
+Daboo Standards Track [Page 132]
+
+RFC 5546 iTIP December 2009
+
+
+ Added the "REQUEST-STATUS" entry in the "VJOURNAL" restriction tables
+ to fall in line with [RFC5545].
+
+A.2. Deprecated Features
+
+ The "EXRULE" property was removed in [RFC5545] and references to that
+ have been removed in this document too.
+
+ The "PROCEDURE" value for the "ACTION" property was removed in
+ [RFC5545] and references to that have been removed in this document
+ too.
+
+ The "THISANDPRIOR" option for the "RANGE" parameter was removed in
+ [RFC5545] and references to that have been removed in this document
+ too.
+
+Author's Address
+
+ Cyrus Daboo (editor)
+ Apple Inc.
+ 1 Infinite Loop
+ Cupertino, CA 95014
+ USA
+
+ EMail: cyrus@daboo.name
+ URI: http://www.apple.com/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo Standards Track [Page 133]
+
diff --git a/vendor/sabre/dav/docs/rfc5689.txt b/vendor/sabre/dav/docs/rfc5689.txt
new file mode 100644
index 000000000..bce3cfc89
--- /dev/null
+++ b/vendor/sabre/dav/docs/rfc5689.txt
@@ -0,0 +1,675 @@
+
+
+
+
+
+
+Network Working Group C. Daboo
+Request for Comments: 5689 Apple Inc.
+Updates: 4791, 4918 September 2009
+Category: Standards Track
+
+
+ Extended MKCOL for Web Distributed Authoring and Versioning (WebDAV)
+
+Abstract
+
+ This specification extends the Web Distributed Authoring and
+ Versioning (WebDAV) MKCOL (Make Collection) method to allow
+ collections of arbitrary resourcetype to be created and to allow
+ properties to be set at the same time.
+
+Status of This Memo
+
+ This document specifies an Internet standards track protocol for the
+ Internet community, and requests discussion and suggestions for
+ improvements. Please refer to the current edition of the "Internet
+ Official Protocol Standards" (STD 1) for the standardization state
+ and status of this protocol. Distribution of this memo is unlimited.
+
+Copyright Notice
+
+ Copyright (c) 2009 IETF Trust and the persons identified as the
+ document authors. All rights reserved.
+
+ This document is subject to BCP 78 and the IETF Trust's Legal
+ Provisions Relating to IETF Documents
+ (http://trustee.ietf.org/license-info) in effect on the date of
+ publication of this document. Please review these documents
+ carefully, as they describe your rights and restrictions with respect
+ to this document. Code Components extracted from this document must
+ include Simplified BSD License text as described in Section 4.e of
+ the Trust Legal Provisions and are provided without warranty as
+ described in the BSD License.
+
+ This document may contain material from IETF Documents or IETF
+ Contributions published or made publicly available before November
+ 10, 2008. The person(s) controlling the copyright in some of this
+ material may not have granted the IETF Trust the right to allow
+ modifications of such material outside the IETF Standards Process.
+ Without obtaining an adequate license from the person(s) controlling
+ the copyright in such materials, this document may not be modified
+ outside the IETF Standards Process, and derivative works of it may
+
+
+
+
+
+Daboo Standards Track [Page 1]
+
+RFC 5689 Extended MKCOL for WebDAV September 2009
+
+
+ not be created outside the IETF Standards Process, except to format
+ it for publication as an RFC or to translate it into languages other
+ than English.
+
+Table of Contents
+
+ 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 3
+ 2. Conventions Used in This Document . . . . . . . . . . . . . . 3
+ 3. WebDAV Extended MKCOL . . . . . . . . . . . . . . . . . . . . 4
+ 3.1. Extended MKCOL Support . . . . . . . . . . . . . . . . . . 5
+ 3.1.1. Example: Using OPTIONS for the Discovery of
+ Support for Extended MKCOL . . . . . . . . . . . . . . 5
+ 3.2. Status Codes . . . . . . . . . . . . . . . . . . . . . . . 5
+ 3.3. Additional Precondition for Extended MKCOL . . . . . . . . 5
+ 3.4. Example: Successful Extended MKCOL Request . . . . . . . . 6
+ 3.5. Example: Unsuccessful Extended MKCOL Request . . . . . . . 6
+ 4. Using Extended MKCOL as an Alternative for MKxxx Methods . . . 8
+ 4.1. MKCALENDAR Alternative . . . . . . . . . . . . . . . . . . 8
+ 4.1.1. Example: Using MKCOL Instead of MKCALENDAR . . . . . . 8
+ 5. XML Element Definitions . . . . . . . . . . . . . . . . . . . 10
+ 5.1. mkcol XML Element . . . . . . . . . . . . . . . . . . . . 10
+ 5.2. mkcol-response XML Element . . . . . . . . . . . . . . . . 10
+ 6. Security Considerations . . . . . . . . . . . . . . . . . . . 11
+ 7. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 11
+ 8. Normative References . . . . . . . . . . . . . . . . . . . . . 11
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo Standards Track [Page 2]
+
+RFC 5689 Extended MKCOL for WebDAV September 2009
+
+
+1. Introduction
+
+ WebDAV [RFC4918] defines the HTTP [RFC2616] method MKCOL. This
+ method is used to create WebDAV collections on the server. However,
+ several WebDAV-based specifications (e.g., CalDAV [RFC4791]) define
+ "special" collections -- ones that are identified by additional
+ values in the DAV:resourcetype property assigned to the collection
+ resource or by other means. These "special" collections are created
+ by new methods (e.g., MKCALENDAR). The addition of a new MKxxx
+ method for each new "special" collection adds to server complexity
+ and is detrimental to overall reliability due to the need to make
+ sure intermediaries are aware of these methods.
+
+ This specification defines an extension to the WebDAV MKCOL method
+ that adds a request body allowing a client to specify WebDAV
+ properties to be set on the newly created collection or resource. In
+ particular, the DAV:resourcetype property can be used to create a
+ "special" collection; alternatively, other properties can be used to
+ create a "special" resource. This avoids the need to invent new
+ MKxxx methods.
+
+2. Conventions Used in This Document
+
+ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
+ "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
+ document are to be interpreted as described in [RFC2119].
+
+ This document uses XML DTD fragments (Section 3.2 of
+ [W3C.REC-xml-20081126]) as a purely notational convention. WebDAV
+ request and response bodies cannot be validated by a DTD due to the
+ specific extensibility rules defined in Section 17 of [RFC4918] and
+ due to the fact that all XML elements defined by this specification
+ use the XML namespace name "DAV:". In particular:
+
+ 1. Element names use the "DAV:" namespace.
+
+ 2. Element ordering is irrelevant unless explicitly stated.
+
+ 3. Extension elements (elements not already defined as valid child
+ elements) may be added anywhere, except when explicitly stated
+ otherwise.
+
+ 4. Extension attributes (attributes not already defined as valid for
+ this element) may be added anywhere, except when explicitly
+ stated otherwise.
+
+
+
+
+
+
+Daboo Standards Track [Page 3]
+
+RFC 5689 Extended MKCOL for WebDAV September 2009
+
+
+ When an XML element type in the "DAV:" namespace is referenced in
+ this document outside of the context of an XML fragment, the string
+ "DAV:" will be prefixed to the element type.
+
+ This document inherits, and sometimes extends, DTD productions from
+ Section 14 of [RFC4918].
+
+3. WebDAV Extended MKCOL
+
+ The WebDAV MKCOL request is extended to allow the inclusion of a
+ request body. The request body is an XML document containing a
+ single DAV:mkcol XML element as the root element. The Content-Type
+ request header MUST be set appropriately for an XML body (e.g., set
+ to "text/xml" or "application/xml"). XML-typed bodies for an MKCOL
+ request that do not have DAV:mkcol as the root element are reserved
+ for future usage.
+
+ One or more DAV:set XML elements may be included in the DAV:mkcol XML
+ element to allow setting properties on the collection as it is
+ created. In particular, to create a collection of a particular type,
+ the DAV:resourcetype XML element MUST be included in a DAV:set XML
+ element and MUST specify the expected resource type elements for the
+ new resource, which MUST include the DAV:collection element that
+ needs to be present for any WebDAV collection.
+
+ As per the PROPPATCH method (Section 9.2 of [RFC4918]), servers MUST
+ process any DAV:set instructions in document order (an exception to
+ the normal rule that ordering is irrelevant). If any one instruction
+ fails to execute successfully, all instructions MUST fail (i.e.,
+ either all succeed or all fail). Thus, if any error occurs during
+ processing, all executed instructions MUST be undone and a proper
+ error result returned. Failure to set a property value on the
+ collection MUST result in a failure of the overall MKCOL request --
+ i.e., the collection is not created.
+
+ The response to an extended MKCOL request MUST be an XML document
+ containing a single DAV:mkcol-response XML element, which MUST
+ contain DAV:propstat XML elements with the status of each property
+ when the request fails due to a failure to set one or more of the
+ properties specified in the request body. The server MAY return a
+ response body in the case where the request is successful, indicating
+ success for setting each property specified in the request body.
+ When an empty response body is returned with a success request status
+ code, the client can assume that all properties were set.
+
+ In all other respects, the behavior of the extended MKCOL request
+ follows that of the standard MKCOL request.
+
+
+
+
+Daboo Standards Track [Page 4]
+
+RFC 5689 Extended MKCOL for WebDAV September 2009
+
+
+3.1. Extended MKCOL Support
+
+ A server supporting the features described in this document MUST
+ include "extended-mkcol" as a field in the DAV response header from
+ an OPTIONS request on any URI that supports use of the extended MKCOL
+ method.
+
+3.1.1. Example: Using OPTIONS for the Discovery of Support for Extended
+ MKCOL
+
+ >> Request <<
+
+ OPTIONS /addressbooks/users/ HTTP/1.1
+ Host: addressbook.example.com
+
+ >> Response <<
+
+ HTTP/1.1 200 OK
+ Allow: OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, COPY, MOVE
+ Allow: MKCOL, PROPFIND, PROPPATCH, LOCK, UNLOCK, REPORT, ACL
+ DAV: 1, 2, 3, access-control, extended-mkcol
+ Date: Sat, 11 Nov 2006 09:32:12 GMT
+ Content-Length: 0
+
+3.2. Status Codes
+
+ As per Section 9.3.1 of [RFC4918].
+
+3.3. Additional Precondition for Extended MKCOL
+
+ WebDAV ([RFC4918], Section 16) defines preconditions and
+ postconditions for request behavior. This specification adds the
+ following precondition for the extended MKCOL request.
+
+ Name: valid-resourcetype
+
+ Namespace: DAV:
+
+ Use with: Typically 403 (Forbidden)
+
+ Purpose: (precondition) -- The server MUST support the specified
+ resourcetype value for the specified collection.
+
+
+
+
+
+
+
+
+
+Daboo Standards Track [Page 5]
+
+RFC 5689 Extended MKCOL for WebDAV September 2009
+
+
+3.4. Example: Successful Extended MKCOL Request
+
+ This example shows how the extended MKCOL request is used to create a
+ collection of a fictitious type "special-resource". The response
+ body is empty as the request completed successfully.
+
+ >> Request <<
+
+ MKCOL /home/special/ HTTP/1.1
+ Host: special.example.com
+ Content-Type: application/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:mkcol xmlns:D="DAV:"
+ xmlns:E="http://example.com/ns/">
+ <D:set>
+ <D:prop>
+ <D:resourcetype>
+ <D:collection/>
+ <E:special-resource/>
+ </D:resourcetype>
+ <D:displayname>Special Resource</D:displayname>
+ </D:prop>
+ </D:set>
+ </D:mkcol>
+
+ >> Response <<
+
+ HTTP/1.1 201 Created
+ Cache-Control: no-cache
+ Date: Sat, 11 Nov 2006 09:32:12 GMT
+
+3.5. Example: Unsuccessful Extended MKCOL Request
+
+ This example shows an attempt to use the extended MKCOL request to
+ create a collection of a fictitious type "special-resource", which is
+ not actually supported by the server. The response body shows that
+ an error occurred specifically with the DAV:resourcetype property.
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo Standards Track [Page 6]
+
+RFC 5689 Extended MKCOL for WebDAV September 2009
+
+
+ >> Request <<
+
+ MKCOL /home/special/ HTTP/1.1
+ Host: special.example.com
+ Content-Type: application/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:mkcol xmlns:D="DAV:"
+ xmlns:E="http://example.com/ns/">
+ <D:set>
+ <D:prop>
+ <D:resourcetype>
+ <D:collection/>
+ <E:special-resource/>
+ </D:resourcetype>
+ <D:displayname>Special Resource</D:displayname>
+ </D:prop>
+ </D:set>
+ </D:mkcol>
+
+ >> Response <<
+
+ HTTP/1.1 403 Forbidden
+ Cache-Control: no-cache
+ Date: Sat, 11 Nov 2006 09:32:12 GMT
+ Content-Type: application/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:mkcol-response xmlns:D="DAV:">
+ <D:propstat>
+ <D:prop>
+ <D:resourcetype/>
+ </D:prop>
+ <D:status>HTTP/1.1 403 Forbidden</D:status>
+ <D:error><D:valid-resourcetype /></D:error>
+ <D:responsedescription>Resource type is not
+ supported by this server</D:responsedescription>
+ </D:propstat>
+ <D:propstat>
+ <D:prop>
+ <D:displayname/>
+ </D:prop>
+ <D:status>HTTP/1.1 424 Failed Dependency</D:status>
+ </D:propstat>
+ </D:mkcol-response>
+
+
+
+
+Daboo Standards Track [Page 7]
+
+RFC 5689 Extended MKCOL for WebDAV September 2009
+
+
+4. Using Extended MKCOL as an Alternative for MKxxx Methods
+
+ One of the goals of this extension is to eliminate the need for other
+ extensions to define their own variant of MKCOL to create the special
+ collections they need. This extension can be used as an alternative
+ to existing MKxxx methods in other extensions as detailed below. If
+ a server supports this extension and the other extension listed, then
+ the server MUST support use of the extended MKCOL method to achieve
+ the same result as the MKxxx method of the other extension.
+
+4.1. MKCALENDAR Alternative
+
+ CalDAV defines the MKCALENDAR method to create a calendar collection
+ as well as to set properties during creation (Section 5.3.1 of
+ [RFC4791]).
+
+ The extended MKCOL method can be used instead by specifying both DAV:
+ collection and CALDAV:calendar-collection XML elements in the DAV:
+ resourcetype property, set during the extended MKCOL request.
+
+4.1.1. Example: Using MKCOL Instead of MKCALENDAR
+
+ The first example below shows an MKCALENDAR request containing a
+ CALDAV:mkcalendar XML element in the request body and returning a
+ CALDAV:mkcalendar-response XML element in the response body.
+
+ >> MKCALENDAR Request <<
+
+ MKCALENDAR /home/lisa/calendars/events/ HTTP/1.1
+ Host: calendar.example.com
+ Content-Type: application/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <C:mkcalendar xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:set>
+ <D:prop>
+ <D:displayname>Lisa's Events</D:displayname>
+ </D:prop>
+ </D:set>
+ </C:mkcalendar>
+
+
+
+
+
+
+
+
+
+Daboo Standards Track [Page 8]
+
+RFC 5689 Extended MKCOL for WebDAV September 2009
+
+
+ >> MKCALENDAR Response <<
+
+ HTTP/1.1 201 Created
+ Cache-Control: no-cache
+ Date: Sat, 11 Nov 2006 09:32:12 GMT
+ Content-Type: application/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <C:mkcalendar-response xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:propstat>
+ <D:prop>
+ <D:displayname/>
+ </D:prop>
+ <D:status>HTTP/1.1 200 OK</D:status>
+ </D:propstat>
+ </C:mkcalendar-response>
+
+ The second example shows the equivalent extended MKCOL request with
+ the same request and response XML elements.
+
+ >> MKCOL Request <<
+
+ MKCOL /home/lisa/calendars/events/ HTTP/1.1
+ Host: calendar.example.com
+ Content-Type: application/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:mkcol xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:set>
+ <D:prop>
+ <D:resourcetype>
+ <D:collection/>
+ <C:calendar/>
+ </D:resourcetype>
+ <D:displayname>Lisa's Events</D:displayname>
+ </D:prop>
+ </D:set>
+ </D:mkcol>
+
+
+
+
+
+
+
+
+
+Daboo Standards Track [Page 9]
+
+RFC 5689 Extended MKCOL for WebDAV September 2009
+
+
+ >> MKCOL Response <<
+
+ HTTP/1.1 201 Created
+ Cache-Control: no-cache
+ Date: Sat, 11 Nov 2006 09:32:12 GMT
+ Content-Type: application/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:mkcol-response xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:propstat>
+ <D:prop>
+ <D:resourcetype/>
+ <D:displayname/>
+ </D:prop>
+ <D:status>HTTP/1.1 200 OK</D:status>
+ </D:propstat>
+ </D:mkcol-response>
+
+5. XML Element Definitions
+
+5.1. mkcol XML Element
+
+ Name: mkcol
+
+ Namespace: DAV:
+
+ Purpose: Used in a request to specify properties to be set in an
+ extended MKCOL request, as well as any additional information
+ needed when creating the resource.
+
+ Description: This XML element is a container for the information
+ required to modify the properties on a collection resource as it
+ is created in an extended MKCOL request.
+
+ Definition:
+
+ <!ELEMENT mkcol (set+)>
+
+5.2. mkcol-response XML Element
+
+ Name: mkcol-response
+
+ Namespace: DAV:
+
+
+
+
+
+
+Daboo Standards Track [Page 10]
+
+RFC 5689 Extended MKCOL for WebDAV September 2009
+
+
+ Purpose: Used in a response to indicate the status of properties
+ that were set or failed to be set during an extended MKCOL
+ request.
+
+ Description: This XML element is a container for the information
+ returned about a resource that has been created in an extended
+ MKCOL request.
+
+ Definition:
+
+ <!ELEMENT mkcol-response (propstat+)>
+
+6. Security Considerations
+
+ This extension does not introduce any new security concerns beyond
+ those already described in HTTP [RFC2616] and WebDAV [RFC4918].
+
+7. Acknowledgments
+
+ Thanks to Bernard Desruisseaux, Mike Douglass, Alexey Melnikov,
+ Julian Reschke, and Simon Vaillancourt.
+
+
+8. Normative References
+
+ [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
+ Requirement Levels", BCP 14, RFC 2119, March 1997.
+
+ [RFC2616] Fielding, R., Gettys, J., Mogul, J., Frystyk, H.,
+ Masinter, L., Leach, P., and T. Berners-Lee, "Hypertext
+ Transfer Protocol -- HTTP/1.1", RFC 2616, June 1999.
+
+ [RFC4791] Daboo, C., Desruisseaux, B., and L. Dusseault,
+ "Calendaring Extensions to WebDAV (CalDAV)", RFC 4791,
+ March 2007.
+
+ [RFC4918] Dusseault, L., "HTTP Extensions for Web Distributed
+ Authoring and Versioning (WebDAV)", RFC 4918, June 2007.
+
+ [W3C.REC-xml-20081126]
+ Maler, E., Yergeau, F., Paoli, J., Bray, T., and C.
+ Sperberg-McQueen, "Extensible Markup Language (XML) 1.0
+ (Fifth Edition)", World Wide Web Consortium
+ Recommendation REC-xml-20081126, November 2008,
+ <http://www.w3.org/TR/2008/REC-xml-20081126>.
+
+
+
+
+
+
+Daboo Standards Track [Page 11]
+
+RFC 5689 Extended MKCOL for WebDAV September 2009
+
+
+Author's Address
+
+ Cyrus Daboo
+ Apple Inc.
+ 1 Infinite Loop
+ Cupertino, CA 95014
+ USA
+
+ EMail: cyrus@daboo.name
+ URI: http://www.apple.com/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo Standards Track [Page 12]
+
diff --git a/vendor/sabre/dav/docs/rfc5785.txt b/vendor/sabre/dav/docs/rfc5785.txt
new file mode 100644
index 000000000..c28ccf6bf
--- /dev/null
+++ b/vendor/sabre/dav/docs/rfc5785.txt
@@ -0,0 +1,451 @@
+
+
+
+
+
+
+Internet Engineering Task Force (IETF) M. Nottingham
+Request for Comments: 5785 E. Hammer-Lahav
+Updates: 2616, 2818 April 2010
+Category: Standards Track
+ISSN: 2070-1721
+
+
+ Defining Well-Known Uniform Resource Identifiers (URIs)
+
+Abstract
+
+ This memo defines a path prefix for "well-known locations",
+ "/.well-known/", in selected Uniform Resource Identifier (URI)
+ schemes.
+
+Status of This Memo
+
+ This is an Internet Standards Track document.
+
+ This document is a product of the Internet Engineering Task Force
+ (IETF). It represents the consensus of the IETF community. It has
+ received public review and has been approved for publication by the
+ Internet Engineering Steering Group (IESG). Further information on
+ Internet Standards is available in Section 2 of RFC 5741.
+
+ Information about the current status of this document, any errata,
+ and how to provide feedback on it may be obtained at
+ http://www.rfc-editor.org/info/rfc5785.
+
+Copyright Notice
+
+ Copyright (c) 2010 IETF Trust and the persons identified as the
+ document authors. All rights reserved.
+
+ This document is subject to BCP 78 and the IETF Trust's Legal
+ Provisions Relating to IETF Documents
+ (http://trustee.ietf.org/license-info) in effect on the date of
+ publication of this document. Please review these documents
+ carefully, as they describe your rights and restrictions with respect
+ to this document. Code Components extracted from this document must
+ include Simplified BSD License text as described in Section 4.e of
+ the Trust Legal Provisions and are provided without warranty as
+ described in the Simplified BSD License.
+
+
+
+
+
+
+
+
+Nottingham & Hammer-Lahav Standards Track [Page 1]
+
+RFC 5785 Defining Well-Known URIs April 2010
+
+
+Table of Contents
+
+ 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 2
+ 1.1. Appropriate Use of Well-Known URIs . . . . . . . . . . . . 3
+ 2. Notational Conventions . . . . . . . . . . . . . . . . . . . . 3
+ 3. Well-Known URIs . . . . . . . . . . . . . . . . . . . . . . . . 3
+ 4. Security Considerations . . . . . . . . . . . . . . . . . . . . 4
+ 5. IANA Considerations . . . . . . . . . . . . . . . . . . . . . . 4
+ 5.1. The Well-Known URI Registry . . . . . . . . . . . . . . . . 4
+ 5.1.1. Registration Template . . . . . . . . . . . . . . . . . 5
+ 6. References . . . . . . . . . . . . . . . . . . . . . . . . . . 5
+ 6.1. Normative References . . . . . . . . . . . . . . . . . . . 5
+ 6.2. Informative References . . . . . . . . . . . . . . . . . . 5
+ Appendix A. Acknowledgements . . . . . . . . . . . . . . . . . . . 7
+ Appendix B. Frequently Asked Questions . . . . . . . . . . . . . . 7
+
+1. Introduction
+
+ It is increasingly common for Web-based protocols to require the
+ discovery of policy or other information about a host ("site-wide
+ metadata") before making a request. For example, the Robots
+ Exclusion Protocol <http://www.robotstxt.org/> specifies a way for
+ automated processes to obtain permission to access resources;
+ likewise, the Platform for Privacy Preferences [W3C.REC-P3P-20020416]
+ tells user-agents how to discover privacy policy beforehand.
+
+ While there are several ways to access per-resource metadata (e.g.,
+ HTTP headers, WebDAV's PROPFIND [RFC4918]), the perceived overhead
+ (either in terms of client-perceived latency and/or deployment
+ difficulties) associated with them often precludes their use in these
+ scenarios.
+
+ When this happens, it is common to designate a "well-known location"
+ for such data, so that it can be easily located. However, this
+ approach has the drawback of risking collisions, both with other such
+ designated "well-known locations" and with pre-existing resources.
+
+ To address this, this memo defines a path prefix in HTTP(S) URIs for
+ these "well-known locations", "/.well-known/". Future specifications
+ that need to define a resource for such site-wide metadata can
+ register their use to avoid collisions and minimise impingement upon
+ sites' URI space.
+
+
+
+
+
+
+
+
+
+Nottingham & Hammer-Lahav Standards Track [Page 2]
+
+RFC 5785 Defining Well-Known URIs April 2010
+
+
+1.1. Appropriate Use of Well-Known URIs
+
+ There are a number of possible ways that applications could use Well-
+ known URIs. However, in keeping with the Architecture of the World-
+ Wide Web [W3C.REC-webarch-20041215], well-known URIs are not intended
+ for general information retrieval or establishment of large URI
+ namespaces on the Web. Rather, they are designed to facilitate
+ discovery of information on a site when it isn't practical to use
+ other mechanisms; for example, when discovering policy that needs to
+ be evaluated before a resource is accessed, or when using multiple
+ round-trips is judged detrimental to performance.
+
+ As such, the well-known URI space was created with the expectation
+ that it will be used to make site-wide policy information and other
+ metadata available directly (if sufficiently concise), or provide
+ references to other URIs that provide such metadata.
+
+2. Notational Conventions
+
+ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
+ "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
+ document are to be interpreted as described in RFC 2119 [RFC2119].
+
+3. Well-Known URIs
+
+ A well-known URI is a URI [RFC3986] whose path component begins with
+ the characters "/.well-known/", and whose scheme is "HTTP", "HTTPS",
+ or another scheme that has explicitly been specified to use well-
+ known URIs.
+
+ Applications that wish to mint new well-known URIs MUST register
+ them, following the procedures in Section 5.1.
+
+ For example, if an application registers the name 'example', the
+ corresponding well-known URI on 'http://www.example.com/' would be
+ 'http://www.example.com/.well-known/example'.
+
+ Registered names MUST conform to the segment-nz production in
+ [RFC3986].
+
+ Note that this specification defines neither how to determine the
+ authority to use for a particular context, nor the scope of the
+ metadata discovered by dereferencing the well-known URI; both should
+ be defined by the application itself.
+
+ Typically, a registration will reference a specification that defines
+ the format and associated media type to be obtained by dereferencing
+ the well-known URI.
+
+
+
+Nottingham & Hammer-Lahav Standards Track [Page 3]
+
+RFC 5785 Defining Well-Known URIs April 2010
+
+
+ It MAY also contain additional information, such as the syntax of
+ additional path components, query strings and/or fragment identifiers
+ to be appended to the well-known URI, or protocol-specific details
+ (e.g., HTTP [RFC2616] method handling).
+
+ Note that this specification does not define a format or media-type
+ for the resource located at "/.well-known/" and clients should not
+ expect a resource to exist at that location.
+
+4. Security Considerations
+
+ This memo does not specify the scope of applicability of metadata or
+ policy obtained from a well-known URI, and does not specify how to
+ discover a well-known URI for a particular application. Individual
+ applications using this mechanism must define both aspects.
+
+ Applications minting new well-known URIs, as well as administrators
+ deploying them, will need to consider several security-related
+ issues, including (but not limited to) exposure of sensitive data,
+ denial-of-service attacks (in addition to normal load issues), server
+ and client authentication, vulnerability to DNS rebinding attacks,
+ and attacks where limited access to a server grants the ability to
+ affect how well-known URIs are served.
+
+5. IANA Considerations
+
+5.1. The Well-Known URI Registry
+
+ This document establishes the well-known URI registry.
+
+ Well-known URIs are registered on the advice of one or more
+ Designated Experts (appointed by the IESG or their delegate), with a
+ Specification Required (using terminology from [RFC5226]). However,
+ to allow for the allocation of values prior to publication, the
+ Designated Expert(s) may approve registration once they are satisfied
+ that such a specification will be published.
+
+ Registration requests should be sent to the
+ wellknown-uri-review@ietf.org mailing list for review and comment,
+ with an appropriate subject (e.g., "Request for well-known URI:
+ example").
+
+ Before a period of 14 days has passed, the Designated Expert(s) will
+ either approve or deny the registration request, communicating this
+ decision both to the review list and to IANA. Denials should include
+ an explanation and, if applicable, suggestions as to how to make the
+
+
+
+
+
+Nottingham & Hammer-Lahav Standards Track [Page 4]
+
+RFC 5785 Defining Well-Known URIs April 2010
+
+
+ request successful. Registration requests that are undetermined for
+ a period longer than 21 days can be brought to the IESG's attention
+ (using the iesg@iesg.org mailing list) for resolution.
+
+5.1.1. Registration Template
+
+ URI suffix: The name requested for the well-known URI, relative to
+ "/.well-known/"; e.g., "example".
+
+ Change controller: For Standards-Track RFCs, state "IETF". For
+ others, give the name of the responsible party. Other details
+ (e.g., postal address, e-mail address, home page URI) may also be
+ included.
+
+ Specification document(s): Reference to the document that specifies
+ the field, preferably including a URI that can be used to retrieve
+ a copy of the document. An indication of the relevant sections
+ may also be included, but is not required.
+
+ Related information: Optionally, citations to additional documents
+ containing further relevant information.
+
+6. References
+
+6.1. Normative References
+
+ [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
+ Requirement Levels", BCP 14, RFC 2119, March 1997.
+
+ [RFC3986] Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform
+ Resource Identifier (URI): Generic Syntax", STD 66,
+ RFC 3986, January 2005.
+
+ [RFC5226] Narten, T. and H. Alvestrand, "Guidelines for Writing an
+ IANA Considerations Section in RFCs", BCP 26, RFC 5226,
+ May 2008.
+
+6.2. Informative References
+
+ [RFC2616] Fielding, R., Gettys, J., Mogul, J., Frystyk, H., Masinter,
+ L., Leach, P., and T. Berners-Lee, "Hypertext Transfer
+ Protocol -- HTTP/1.1", RFC 2616, June 1999.
+
+ [RFC4918] Dusseault, L., "HTTP Extensions for Web Distributed
+ Authoring and Versioning (WebDAV)", RFC 4918, June 2007.
+
+
+
+
+
+
+Nottingham & Hammer-Lahav Standards Track [Page 5]
+
+RFC 5785 Defining Well-Known URIs April 2010
+
+
+ [W3C.REC-P3P-20020416]
+ Marchiori, M., "The Platform for Privacy Preferences 1.0
+ (P3P1.0) Specification", World Wide Web Consortium
+ Recommendation REC-P3P-20020416, April 2002,
+ <http://www.w3.org/TR/2002/ REC-P3P-20020416>.
+
+ [W3C.REC-webarch-20041215]
+ Jacobs, I. and N. Walsh, "Architecture of the World Wide
+ Web, Volume One", World Wide Web Consortium
+ Recommendation REC- webarch-20041215, December 2004,
+ <http:// www.w3.org/TR/2004/REC-webarch-20041215>.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Nottingham & Hammer-Lahav Standards Track [Page 6]
+
+RFC 5785 Defining Well-Known URIs April 2010
+
+
+Appendix A. Acknowledgements
+
+ We would like to acknowledge the contributions of everyone who
+ provided feedback and use cases for this document; in particular,
+ Phil Archer, Dirk Balfanz, Adam Barth, Tim Bray, Brian Eaton, Brad
+ Fitzpatrick, Joe Gregorio, Paul Hoffman, Barry Leiba, Ashok Malhotra,
+ Breno de Medeiros, John Panzer, and Drummond Reed. However, they are
+ not responsible for errors and omissions.
+
+Appendix B. Frequently Asked Questions
+
+ 1. Aren't well-known locations bad for the Web?
+
+ They are, but for various reasons -- both technical and social --
+ they are commonly used and their use is increasing. This memo
+ defines a "sandbox" for them, to reduce the risks of collision and
+ to minimise the impact upon pre-existing URIs on sites.
+
+ 2. Why /.well-known?
+
+ It's short, descriptive, and according to search indices, not
+ widely used.
+
+ 3. What impact does this have on existing mechanisms, such as P3P and
+ robots.txt?
+
+ None, until they choose to use this mechanism.
+
+ 4. Why aren't per-directory well-known locations defined?
+
+ Allowing every URI path segment to have a well-known location
+ (e.g., "/images/.well-known/") would increase the risks of
+ colliding with a pre-existing URI on a site, and generally these
+ solutions are found not to scale well, because they're too
+ "chatty".
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Nottingham & Hammer-Lahav Standards Track [Page 7]
+
+RFC 5785 Defining Well-Known URIs April 2010
+
+
+Authors' Addresses
+
+ Mark Nottingham
+
+ EMail: mnot@mnot.net
+ URI: http://www.mnot.net/
+
+
+ Eran Hammer-Lahav
+
+ EMail: eran@hueniverse.com
+ URI: http://hueniverse.com/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Nottingham & Hammer-Lahav Standards Track [Page 8]
+
diff --git a/vendor/sabre/dav/docs/rfc5789.txt b/vendor/sabre/dav/docs/rfc5789.txt
new file mode 100644
index 000000000..7a2c0614c
--- /dev/null
+++ b/vendor/sabre/dav/docs/rfc5789.txt
@@ -0,0 +1,563 @@
+
+
+
+
+
+
+Internet Engineering Task Force (IETF) L. Dusseault
+Request for Comments: 5789 Linden Lab
+Category: Standards Track J. Snell
+ISSN: 2070-1721 March 2010
+
+
+ PATCH Method for HTTP
+
+Abstract
+
+ Several applications extending the Hypertext Transfer Protocol (HTTP)
+ require a feature to do partial resource modification. The existing
+ HTTP PUT method only allows a complete replacement of a document.
+ This proposal adds a new HTTP method, PATCH, to modify an existing
+ HTTP resource.
+
+Status of This Memo
+
+ This is an Internet Standards Track document.
+
+ This document is a product of the Internet Engineering Task Force
+ (IETF). It represents the consensus of the IETF community. It has
+ received public review and has been approved for publication by the
+ Internet Engineering Steering Group (IESG). Further information on
+ Internet Standards is available in Section 2 of RFC 5741.
+
+ Information about the current status of this document, any errata,
+ and how to provide feedback on it may be obtained at
+ http://www.rfc-editor.org/info/rfc5789.
+
+Copyright Notice
+
+ Copyright (c) 2010 IETF Trust and the persons identified as the
+ document authors. All rights reserved.
+
+ This document is subject to BCP 78 and the IETF Trust's Legal
+ Provisions Relating to IETF Documents
+ (http://trustee.ietf.org/license-info) in effect on the date of
+ publication of this document. Please review these documents
+ carefully, as they describe your rights and restrictions with respect
+ to this document. Code Components extracted from this document must
+ include Simplified BSD License text as described in Section 4.e of
+ the Trust Legal Provisions and are provided without warranty as
+ described in the Simplified BSD License.
+
+
+
+
+
+
+
+Dusseault & Snell Standards Track [Page 1]
+
+RFC 5789 HTTP PATCH March 2010
+
+
+Table of Contents
+
+ 1. Introduction ....................................................2
+ 2. The PATCH Method ................................................2
+ 2.1. A Simple PATCH Example .....................................4
+ 2.2. Error Handling .............................................5
+ 3. Advertising Support in OPTIONS ..................................7
+ 3.1. The Accept-Patch Header ....................................7
+ 3.2. Example OPTIONS Request and Response .......................7
+ 4. IANA Considerations .............................................8
+ 4.1. The Accept-Patch Response Header ...........................8
+ 5. Security Considerations .........................................8
+ 6. References ......................................................9
+ 6.1. Normative References .......................................9
+ 6.2. Informative References .....................................9
+ Appendix A. Acknowledgements .....................................10
+
+1. Introduction
+
+ This specification defines the new HTTP/1.1 [RFC2616] method, PATCH,
+ which is used to apply partial modifications to a resource.
+
+ A new method is necessary to improve interoperability and prevent
+ errors. The PUT method is already defined to overwrite a resource
+ with a complete new body, and cannot be reused to do partial changes.
+ Otherwise, proxies and caches, and even clients and servers, may get
+ confused as to the result of the operation. POST is already used but
+ without broad interoperability (for one, there is no standard way to
+ discover patch format support). PATCH was mentioned in earlier HTTP
+ specifications, but not completely defined.
+
+ In this document, the key words "MUST", "MUST NOT", "REQUIRED",
+ "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY",
+ and "OPTIONAL" are to be interpreted as described in [RFC2119].
+
+ Furthermore, this document uses the ABNF syntax defined in Section
+ 2.1 of [RFC2616].
+
+2. The PATCH Method
+
+ The PATCH method requests that a set of changes described in the
+ request entity be applied to the resource identified by the Request-
+ URI. The set of changes is represented in a format called a "patch
+ document" identified by a media type. If the Request-URI does not
+ point to an existing resource, the server MAY create a new resource,
+ depending on the patch document type (whether it can logically modify
+ a null resource) and permissions, etc.
+
+
+
+
+Dusseault & Snell Standards Track [Page 2]
+
+RFC 5789 HTTP PATCH March 2010
+
+
+ The difference between the PUT and PATCH requests is reflected in the
+ way the server processes the enclosed entity to modify the resource
+ identified by the Request-URI. In a PUT request, the enclosed entity
+ is considered to be a modified version of the resource stored on the
+ origin server, and the client is requesting that the stored version
+ be replaced. With PATCH, however, the enclosed entity contains a set
+ of instructions describing how a resource currently residing on the
+ origin server should be modified to produce a new version. The PATCH
+ method affects the resource identified by the Request-URI, and it
+ also MAY have side effects on other resources; i.e., new resources
+ may be created, or existing ones modified, by the application of a
+ PATCH.
+
+ PATCH is neither safe nor idempotent as defined by [RFC2616], Section
+ 9.1.
+
+ A PATCH request can be issued in such a way as to be idempotent,
+ which also helps prevent bad outcomes from collisions between two
+ PATCH requests on the same resource in a similar time frame.
+ Collisions from multiple PATCH requests may be more dangerous than
+ PUT collisions because some patch formats need to operate from a
+ known base-point or else they will corrupt the resource. Clients
+ using this kind of patch application SHOULD use a conditional request
+ such that the request will fail if the resource has been updated
+ since the client last accessed the resource. For example, the client
+ can use a strong ETag [RFC2616] in an If-Match header on the PATCH
+ request.
+
+ There are also cases where patch formats do not need to operate from
+ a known base-point (e.g., appending text lines to log files, or non-
+ colliding rows to database tables), in which case the same care in
+ client requests is not needed.
+
+ The server MUST apply the entire set of changes atomically and never
+ provide (e.g., in response to a GET during this operation) a
+ partially modified representation. If the entire patch document
+ cannot be successfully applied, then the server MUST NOT apply any of
+ the changes. The determination of what constitutes a successful
+ PATCH can vary depending on the patch document and the type of
+ resource(s) being modified. For example, the common 'diff' utility
+ can generate a patch document that applies to multiple files in a
+ directory hierarchy. The atomicity requirement holds for all
+ directly affected files. See "Error Handling", Section 2.2, for
+ details on status codes and possible error conditions.
+
+ If the request passes through a cache and the Request-URI identifies
+ one or more currently cached entities, those entries SHOULD be
+ treated as stale. A response to this method is only cacheable if it
+
+
+
+Dusseault & Snell Standards Track [Page 3]
+
+RFC 5789 HTTP PATCH March 2010
+
+
+ contains explicit freshness information (such as an Expires header or
+ "Cache-Control: max-age" directive) as well as the Content-Location
+ header matching the Request-URI, indicating that the PATCH response
+ body is a resource representation. A cached PATCH response can only
+ be used to respond to subsequent GET and HEAD requests; it MUST NOT
+ be used to respond to other methods (in particular, PATCH).
+
+ Note that entity-headers contained in the request apply only to the
+ contained patch document and MUST NOT be applied to the resource
+ being modified. Thus, a Content-Language header could be present on
+ the request, but it would only mean (for whatever that's worth) that
+ the patch document had a language. Servers SHOULD NOT store such
+ headers except as trace information, and SHOULD NOT use such header
+ values the same way they might be used on PUT requests. Therefore,
+ this document does not specify a way to modify a document's Content-
+ Type or Content-Language value through headers, though a mechanism
+ could well be designed to achieve this goal through a patch document.
+
+ There is no guarantee that a resource can be modified with PATCH.
+ Further, it is expected that different patch document formats will be
+ appropriate for different types of resources and that no single
+ format will be appropriate for all types of resources. Therefore,
+ there is no single default patch document format that implementations
+ are required to support. Servers MUST ensure that a received patch
+ document is appropriate for the type of resource identified by the
+ Request-URI.
+
+ Clients need to choose when to use PATCH rather than PUT. For
+ example, if the patch document size is larger than the size of the
+ new resource data that would be used in a PUT, then it might make
+ sense to use PUT instead of PATCH. A comparison to POST is even more
+ difficult, because POST is used in widely varying ways and can
+ encompass PUT and PATCH-like operations if the server chooses. If
+ the operation does not modify the resource identified by the Request-
+ URI in a predictable way, POST should be considered instead of PATCH
+ or PUT.
+
+2.1. A Simple PATCH Example
+
+ PATCH /file.txt HTTP/1.1
+ Host: www.example.com
+ Content-Type: application/example
+ If-Match: "e0023aa4e"
+ Content-Length: 100
+
+ [description of changes]
+
+
+
+
+
+Dusseault & Snell Standards Track [Page 4]
+
+RFC 5789 HTTP PATCH March 2010
+
+
+ This example illustrates use of a hypothetical patch document on an
+ existing resource.
+
+ Successful PATCH response to existing text file:
+
+ HTTP/1.1 204 No Content
+ Content-Location: /file.txt
+ ETag: "e0023aa4f"
+
+ The 204 response code is used because the response does not carry a
+ message body (which a response with the 200 code would have). Note
+ that other success codes could be used as well.
+
+ Furthermore, the ETag response header field contains the ETag for the
+ entity created by applying the PATCH, available at
+ http://www.example.com/file.txt, as indicated by the Content-Location
+ response header field.
+
+2.2. Error Handling
+
+ There are several known conditions under which a PATCH request can
+ fail.
+
+ Malformed patch document: When the server determines that the patch
+ document provided by the client is not properly formatted, it
+ SHOULD return a 400 (Bad Request) response. The definition of
+ badly formatted depends on the patch document chosen.
+
+ Unsupported patch document: Can be specified using a 415
+ (Unsupported Media Type) response when the client sends a patch
+ document format that the server does not support for the resource
+ identified by the Request-URI. Such a response SHOULD include an
+ Accept-Patch response header as described in Section 3.1 to notify
+ the client what patch document media types are supported.
+
+ Unprocessable request: Can be specified with a 422 (Unprocessable
+ Entity) response ([RFC4918], Section 11.2) when the server
+ understands the patch document and the syntax of the patch
+ document appears to be valid, but the server is incapable of
+ processing the request. This might include attempts to modify a
+ resource in a way that would cause the resource to become invalid;
+ for instance, a modification to a well-formed XML document that
+ would cause it to no longer be well-formed. There may also be
+ more specific errors like "Conflicting State" that could be
+ signaled with this status code, but the more specific error would
+ generally be more helpful.
+
+
+
+
+
+Dusseault & Snell Standards Track [Page 5]
+
+RFC 5789 HTTP PATCH March 2010
+
+
+ Resource not found: Can be specified with a 404 (Not Found) status
+ code when the client attempted to apply a patch document to a non-
+ existent resource, but the patch document chosen cannot be applied
+ to a non-existent resource.
+
+ Conflicting state: Can be specified with a 409 (Conflict) status
+ code when the request cannot be applied given the state of the
+ resource. For example, if the client attempted to apply a
+ structural modification and the structures assumed to exist did
+ not exist (with XML, a patch might specify changing element 'foo'
+ to element 'bar' but element 'foo' might not exist).
+
+ Conflicting modification: When a client uses either the If-Match or
+ If-Unmodified-Since header to define a precondition, and that
+ precondition failed, then the 412 (Precondition Failed) error is
+ most helpful to the client. However, that response makes no sense
+ if there was no precondition on the request. In cases when the
+ server detects a possible conflicting modification and no
+ precondition was defined in the request, the server can return a
+ 409 (Conflict) response.
+
+ Concurrent modification: Some applications of PATCH might require
+ the server to process requests in the order in which they are
+ received. If a server is operating under those restrictions, and
+ it receives concurrent requests to modify the same resource, but
+ is unable to queue those requests, the server can usefully
+ indicate this error by using a 409 (Conflict) response.
+
+ Note that the 409 Conflict response gives reasonably consistent
+ information to clients. Depending on the application and the nature
+ of the patch format, the client might be able to reissue the request
+ as is (e.g., an instruction to append a line to a log file), have to
+ retrieve the resource content to recalculate a patch, or have to fail
+ the operation.
+
+ Other HTTP status codes can also be used under the appropriate
+ circumstances.
+
+ The entity body of error responses SHOULD contain enough information
+ to communicate the nature of the error to the client. The content-
+ type of the response entity can vary across implementations.
+
+
+
+
+
+
+
+
+
+
+Dusseault & Snell Standards Track [Page 6]
+
+RFC 5789 HTTP PATCH March 2010
+
+
+3. Advertising Support in OPTIONS
+
+ A server can advertise its support for the PATCH method by adding it
+ to the listing of allowed methods in the "Allow" OPTIONS response
+ header defined in HTTP/1.1. The PATCH method MAY appear in the
+ "Allow" header even if the Accept-Patch header is absent, in which
+ case the list of allowed patch documents is not advertised.
+
+3.1. The Accept-Patch Header
+
+ This specification introduces a new response header Accept-Patch used
+ to specify the patch document formats accepted by the server.
+ Accept-Patch SHOULD appear in the OPTIONS response for any resource
+ that supports the use of the PATCH method. The presence of the
+ Accept-Patch header in response to any method is an implicit
+ indication that PATCH is allowed on the resource identified by the
+ Request-URI. The presence of a specific patch document format in
+ this header indicates that that specific format is allowed on the
+ resource identified by the Request-URI.
+
+ Accept-Patch = "Accept-Patch" ":" 1#media-type
+
+ The Accept-Patch header specifies a comma-separated listing of media-
+ types (with optional parameters) as defined by [RFC2616], Section
+ 3.7.
+
+ Example:
+
+ Accept-Patch: text/example;charset=utf-8
+
+3.2. Example OPTIONS Request and Response
+
+ [request]
+
+ OPTIONS /example/buddies.xml HTTP/1.1
+ Host: www.example.com
+
+ [response]
+
+ HTTP/1.1 200 OK
+ Allow: GET, PUT, POST, OPTIONS, HEAD, DELETE, PATCH
+ Accept-Patch: application/example, text/example
+
+ The examples show a server that supports PATCH generally using two
+ hypothetical patch document formats.
+
+
+
+
+
+
+Dusseault & Snell Standards Track [Page 7]
+
+RFC 5789 HTTP PATCH March 2010
+
+
+4. IANA Considerations
+
+4.1. The Accept-Patch Response Header
+
+ The Accept-Patch response header has been added to the permanent
+ registry (see [RFC3864]).
+
+ Header field name: Accept-Patch
+
+ Applicable Protocol: HTTP
+
+ Author/Change controller: IETF
+
+ Specification document: this specification
+
+5. Security Considerations
+
+ The security considerations for PATCH are nearly identical to the
+ security considerations for PUT ([RFC2616], Section 9.6). These
+ include authorizing requests (possibly through access control and/or
+ authentication) and ensuring that data is not corrupted through
+ transport errors or through accidental overwrites. Whatever
+ mechanisms are used for PUT can be used for PATCH as well. The
+ following considerations apply especially to PATCH.
+
+ A document that is patched might be more likely to be corrupted than
+ a document that is overridden in entirety, but that concern can be
+ addressed through the use of mechanisms such as conditional requests
+ using ETags and the If-Match request header as described in
+ Section 2. If a PATCH request fails, the client can issue a GET
+ request to the resource to see what state it is in. In some cases,
+ the client might be able to check the contents of the resource to see
+ if the PATCH request can be resent, but in other cases, the attempt
+ will just fail and/or a user will have to verify intent. In the case
+ of a failure of the underlying transport channel, where a PATCH
+ response is not received before the channel fails or some other
+ timeout happens, the client might have to issue a GET request to see
+ whether the request was applied. The client might want to ensure
+ that the GET request bypasses caches using mechanisms described in
+ HTTP specifications (see, for example, Section 13.1.6 of [RFC2616]).
+
+ Sometimes an HTTP intermediary might try to detect viruses being sent
+ via HTTP by checking the body of the PUT/POST request or GET
+ response. The PATCH method complicates such watch-keeping because
+ neither the source document nor the patch document might be a virus,
+ yet the result could be. This security consideration is not
+
+
+
+
+
+Dusseault & Snell Standards Track [Page 8]
+
+RFC 5789 HTTP PATCH March 2010
+
+
+ materially different from those already introduced by byte-range
+ downloads, downloading patch documents, uploading zipped (compressed)
+ files, and so on.
+
+ Individual patch documents will have their own specific security
+ considerations that will likely vary depending on the types of
+ resources being patched. The considerations for patched binary
+ resources, for instance, will be different than those for patched XML
+ documents. Servers MUST take adequate precautions to ensure that
+ malicious clients cannot consume excessive server resources (e.g.,
+ CPU, disk I/O) through the client's use of PATCH.
+
+6. References
+
+6.1. Normative References
+
+ [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
+ Requirement Levels", BCP 14, RFC 2119, March 1997.
+
+ [RFC2616] Fielding, R., Gettys, J., Mogul, J., Frystyk, H.,
+ Masinter, L., Leach, P., and T. Berners-Lee, "Hypertext
+ Transfer Protocol -- HTTP/1.1", RFC 2616, June 1999.
+
+ [RFC3864] Klyne, G., Nottingham, M., and J. Mogul, "Registration
+ Procedures for Message Header Fields", BCP 90, RFC 3864,
+ September 2004.
+
+6.2. Informative References
+
+ [RFC4918] Dusseault, L., "HTTP Extensions for Web Distributed
+ Authoring and Versioning (WebDAV)", RFC 4918, June 2007.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Dusseault & Snell Standards Track [Page 9]
+
+RFC 5789 HTTP PATCH March 2010
+
+
+Appendix A. Acknowledgements
+
+ PATCH is not a new concept, it first appeared in HTTP in drafts of
+ version 1.1 written by Roy Fielding and Henrik Frystyk and also
+ appears in Section 19.6.1.1 of RFC 2068.
+
+ Thanks to Adam Roach, Chris Sharp, Julian Reschke, Geoff Clemm, Scott
+ Lawrence, Jeffrey Mogul, Roy Fielding, Greg Stein, Jim Luther, Alex
+ Rousskov, Jamie Lokier, Joe Hildebrand, Mark Nottingham, Michael
+ Balloni, Cyrus Daboo, Brian Carpenter, John Klensin, Eliot Lear, SM,
+ and Bernie Hoeneisen for review and advice on this document. In
+ particular, Julian Reschke did repeated reviews, made many useful
+ suggestions, and was critical to the publication of this document.
+
+Authors' Addresses
+
+ Lisa Dusseault
+ Linden Lab
+ 945 Battery Street
+ San Francisco, CA 94111
+ USA
+
+ EMail: lisa.dusseault@gmail.com
+
+
+ James M. Snell
+
+ EMail: jasnell@gmail.com
+ URI: http://www.snellspace.com
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Dusseault & Snell Standards Track [Page 10]
+
diff --git a/vendor/sabre/dav/docs/rfc6047.txt b/vendor/sabre/dav/docs/rfc6047.txt
new file mode 100644
index 000000000..c839c8ed3
--- /dev/null
+++ b/vendor/sabre/dav/docs/rfc6047.txt
@@ -0,0 +1,1235 @@
+
+
+
+
+
+
+Internet Engineering Task Force (IETF) A. Melnikov, Ed.
+Request for Comments: 6047 Isode Ltd
+Obsoletes: 2447 December 2010
+Category: Standards Track
+ISSN: 2070-1721
+
+
+ iCalendar Message-Based Interoperability Protocol (iMIP)
+
+Abstract
+
+ This document, "iCalendar Message-Based Interoperability Protocol
+ (iMIP)", specifies a binding from the iCalendar Transport-independent
+ Interoperability Protocol (iTIP) to Internet email-based transports.
+ Calendaring entries defined by the iCalendar Object Model (iCalendar)
+ are wrapped using constructs from RFC 5322 and MIME (RFC 2045, RFC
+ 2046, RFC 2047, and RFC 2049), and then transported over SMTP.
+
+Status of This Memo
+
+ This is an Internet Standards Track document.
+
+ This document is a product of the Internet Engineering Task Force
+ (IETF). It represents the consensus of the IETF community. It has
+ received public review and has been approved for publication by the
+ Internet Engineering Steering Group (IESG). Further information on
+ Internet Standards is available in Section 2 of RFC 5741.
+
+ Information about the current status of this document, any errata,
+ and how to provide feedback on it may be obtained at
+ http://www.rfc-editor.org/info/rfc6047.
+
+Copyright Notice
+
+ Copyright (c) 2010 IETF Trust and the persons identified as the
+ document authors. All rights reserved.
+
+ This document is subject to BCP 78 and the IETF Trust's Legal
+ Provisions Relating to IETF Documents
+ (http://trustee.ietf.org/license-info) in effect on the date of
+ publication of this document. Please review these documents
+ carefully, as they describe your rights and restrictions with respect
+ to this document. Code Components extracted from this document must
+ include Simplified BSD License text as described in Section 4.e of
+ the Trust Legal Provisions and are provided without warranty as
+ described in the Simplified BSD License.
+
+
+
+
+
+Melnikov Standards Track [Page 1]
+
+RFC 6047 iMIP December 2010
+
+
+ This document may contain material from IETF Documents or IETF
+ Contributions published or made publicly available before November
+ 10, 2008. The person(s) controlling the copyright in some of this
+ material may not have granted the IETF Trust the right to allow
+ modifications of such material outside the IETF Standards Process.
+ Without obtaining an adequate license from the person(s) controlling
+ the copyright in such materials, this document may not be modified
+ outside the IETF Standards Process, and derivative works of it may
+ not be created outside the IETF Standards Process, except to format
+ it for publication as an RFC or to translate it into languages other
+ than English.
+
+Table of Contents
+
+ 1. Introduction ....................................................3
+ 1.1. Related Memos ..............................................3
+ 1.2. Formatting Conventions .....................................3
+ 1.3. Terminology ................................................4
+ 2. MIME Message Format Binding .....................................4
+ 2.1. MIME Media Type ............................................4
+ 2.2. Security ...................................................5
+ 2.2.1. Authorization .......................................5
+ 2.2.2. Authentication ......................................5
+ 2.2.3. Confidentiality .....................................5
+ 2.3. Email Addresses ............................................6
+ 2.4. Content-Type Header Field ..................................6
+ 2.5. Content-Transfer-Encoding Header Field .....................7
+ 2.6. Content-Disposition Header Field ...........................8
+ 3. Security Considerations .........................................8
+ 4. Examples .......................................................11
+ 4.1. Single Component with an ATTACH Property ..................11
+ 4.2. Using multipart/alternative for Low-Fidelity Clients ......11
+ 4.3. Single Component with an ATTACH Property and
+ Inline Attachment .........................................12
+ 4.4. Multiple Similar Components ...............................14
+ 4.5. Multiple Mixed Components .................................15
+ 4.6. Detailed Components with an ATTACH Property ...............16
+ 5. Recommended Practices ..........................................18
+ 5.1. Use of Content and Message IDs ............................18
+ 6. IANA Considerations ............................................18
+ 7. References .....................................................19
+ 7.1. Normative References ......................................19
+ 7.2. Informative References ....................................20
+ Appendix A. Changes since RFC 2447 ................................21
+ Appendix B. Acknowledgements ......................................22
+
+
+
+
+
+
+Melnikov Standards Track [Page 2]
+
+RFC 6047 iMIP December 2010
+
+
+1. Introduction
+
+ This document provides the transport-specific information ("binding")
+ necessary to convey iCalendar Transport-independent Interoperability
+ Protocol (iTIP) [iTIP] over Internet email (using MIME) as defined in
+ [RFC5322] and [RFC2045]. Therefore, this document defines the
+ iCalendar Message-Based Interoperability Protocol (iMIP).
+
+1.1. Related Memos
+
+ Implementers will need to be familiar with several other memos that,
+ along with this memo, form a framework for Internet calendaring and
+ scheduling standards.
+
+ This document specifies an Internet email binding for iTIP.
+
+ [iCAL] specifies a core specification of objects, data types,
+ properties, and property parameters.
+
+ [iTIP] specifies an interoperability protocol for scheduling between
+ different implementations.
+
+ This memo does not attempt to repeat the specification of concepts or
+ definitions from these other memos. Where possible, references are
+ made to the memo that provides for the specification of these
+ concepts or definitions.
+
+1.2. Formatting Conventions
+
+ The mechanisms defined in this memo are defined in prose. In order
+ to refer to elements of the calendaring and scheduling model, core
+ object, or interoperability protocol defined in [iCAL] and [iTIP],
+ some formatting conventions have been used.
+
+ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
+ "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
+ document are to be interpreted as described in RFC 2119 [RFC2119].
+
+ Calendaring and scheduling roles are referred to in quoted strings of
+ text with the first character of each word in uppercase. For
+ example, "Organizer" refers to a role of a "Calendar User" within the
+ scheduling protocol defined by [iTIP].
+
+ Calendar components defined by [iCAL] are referred to with
+ capitalized, quoted strings of text. All calendar components start
+ with the letter "V". For example, "VEVENT" refers to the event
+ calendar component, "VTODO" refers to the to-do calendar component,
+ and "VJOURNAL" refers to the daily journal calendar component.
+
+
+
+Melnikov Standards Track [Page 3]
+
+RFC 6047 iMIP December 2010
+
+
+ Scheduling methods defined by [iTIP] are referred to with
+ capitalized, quoted strings of text. For example, "REQUEST" refers
+ to the method for requesting a scheduling calendar component be
+ created or modified; "REPLY" refers to the method a recipient of a
+ request uses to update their status with the "Organizer" of the
+ calendar component.
+
+ Properties defined by [iCAL] are referred to with capitalized, quoted
+ strings of text, followed by the word "property". For example,
+ "ATTENDEE" property refers to the iCalendar property used to convey
+ the calendar address of a "Calendar User".
+
+ Property parameters defined by [iCAL] are referred to with lowercase,
+ quoted strings of text, followed by the word "parameter". For
+ example, "value" parameter refers to the iCalendar property parameter
+ used to override the default data type for a property value.
+
+1.3. Terminology
+
+ The email terms used in this memo are defined in [RFC5322] and
+ [RFC2045]. The calendaring and scheduling terms used in this memo
+ are defined in [iCAL] and [iTIP].
+
+2. MIME Message Format Binding
+
+ This section defines the message binding to the MIME electronic mail
+ transport.
+
+ The sections below refer to the "originator" and the "recipient" of
+ an iMIP message. In the case of a "request" method, the originator
+ is the "Organizer" and the recipient is an "Attendee" of the event.
+ In the case of a "response" method, the originator is an "Attendee"
+ and the recipient is the "Organizer" of the event.
+
+ The [RFC5322] "Reply-To" header field typically contains the email
+ address of the originator of the scheduling message. However, this
+ cannot be guaranteed because the sender of the iMIP message might not
+ be the originator of the scheduling message and the sender's "Mail
+ User Agent" (MUA) might not enforce iMIP semantics by translating the
+ originator's address into the "Reply-To" email header field.
+
+2.1. MIME Media Type
+
+ A MIME entity containing content information formatted according to
+ this document will be referenced as a "text/calendar" content type
+ [iCAL]. It is assumed that this content type will be transported
+ through a MIME electronic mail transport.
+
+
+
+
+Melnikov Standards Track [Page 4]
+
+RFC 6047 iMIP December 2010
+
+
+2.2. Security
+
+ This section addresses several aspects of security including
+ authentication, authorization, and confidentiality. Authentication
+ and confidentiality can be achieved using Secure/MIME (S/MIME)
+ [RFC5750] [RFC5751], which uses the Security Multiparts framework for
+ MIME [RFC1847].
+
+2.2.1. Authorization
+
+ In iTIP messages [iTIP], only the "Organizer" is authorized to modify
+ or cancel calendar entries she organizes. That is,
+ spoof@xyz.example.net is not allowed to modify or cancel a meeting
+ that was organized by a@example.com. Furthermore, only the
+ respondent has the authorization to indicate their status to the
+ "Organizer". That is, the "Organizer" MUST ignore an iTIP message
+ from spoof@xyz.example.net that declines a meeting invitation for
+ b@example.com.
+
+ Implementations of iMIP SHOULD verify the authenticity of the creator
+ of an iCalendar object before taking any action. Methods for doing
+ this are presented later in this document.
+
+ [RFC1847] message flow in iTIP supports someone working on behalf of
+ a "Calendar User" through use of the "sent-by" parameter that is
+ associated with the "ATTENDEE" and "ORGANIZER" properties. However,
+ there is no mechanism to verify whether or not a "Calendar User" has
+ authorized someone to work on their behalf. It is left to
+ implementations to provide mechanisms for the "Calendar Users" to
+ make that decision.
+
+2.2.2. Authentication
+
+ Authentication MUST be performed using S/MIME [RFC5750] [RFC5751].
+ Authentication is possible only on messages that have been signed.
+ Unauthenticated messages (i.e., unsigned messages) may not be
+ trusted.
+
+2.2.3. Confidentiality
+
+ To ensure confidentiality using iMIP, implementations SHOULD utilize
+ encryption specified in S/MIME [RFC5750] [RFC5751]. iMIP does not
+ restrict a "Calendar User Agent" (CUA) from forwarding iCalendar
+ objects to other users or agents.
+
+
+
+
+
+
+
+Melnikov Standards Track [Page 5]
+
+RFC 6047 iMIP December 2010
+
+
+2.3. Email Addresses
+
+ The calendar address specified within the "ORGANIZER" and "ATTENDEE"
+ properties in an iCalendar object sent using iMIP MUST be a proper
+ "mailto:" [MAILTO] URI specification for the corresponding
+ "Organizer" or "Attendee" of the "VEVENT" or "VTODO".
+
+ Because [iTIP] does not preclude "Attendees" from forwarding
+ "VEVENT"s or "VTODO"s to others, the [RFC5322] "Sender" value may not
+ equal that of the "Organizer". Additionally, the "Organizer" or
+ "Attendee" cannot be reliably inferred by the [RFC5322] "Sender" or
+ "Reply-To" header field values of an iMIP message. The relevant
+ address MUST be ascertained by opening the "text/calendar" MIME body
+ part and examining the "ATTENDEE" and "ORGANIZER" properties.
+
+2.4. Content-Type Header Field
+
+ A MIME body part containing content information that conforms to this
+ document MUST have an [RFC2045] "Content-Type" value of
+ "text/calendar". The [RFC2045] "Content-Type" header field MUST also
+ include the MIME parameter "method". The value MUST be the same
+ (ignoring case) as the value of the "METHOD" property within the
+ iCalendar object.
+
+ Note 1: A MIME message containing multiple iCalendar objects with
+ different "method" values MUST be further encapsulated with a
+ "multipart/mixed" MIME entity [RFC2046]. This will allow each of
+ the iCalendar objects to be encapsulated within their own
+ "text/calendar" MIME entity.
+
+ Note 2: A MIME body part with a "Content-Type" value of
+ "text/calendar" that lacks the "method" parameter is not
+ considered to be an iMIP body part and thus is not subject to the
+ requirements specified in this document.
+
+ Note that according to [iCAL] the default character set for iCalendar
+ objects is UTF-8 [UTF-8]. However, the default character set for a
+ "text/*" MIME entity according to [RFC2046] is US-ASCII. Thus, a
+ "charset" MIME parameter MUST be present if the iCalendar object
+ contains characters that can't be represented in the US-ASCII
+ character set and, as specified in [iCAL], it MUST have the value
+ "UTF-8".
+
+ The optional "component" MIME parameter defines the iCalendar
+ component type contained within the iCalendar object.
+
+
+
+
+
+
+Melnikov Standards Track [Page 6]
+
+RFC 6047 iMIP December 2010
+
+
+ The following is an example of this header field with a value that
+ indicates an event message.
+
+ Content-Type: text/calendar; method=REQUEST; charset=UTF-8;
+ component=vevent
+
+ The "text/calendar" content type allows for the scheduling message
+ type to be included in a MIME message with other content information
+ (i.e., "multipart/mixed") or included in a MIME message with a clear-
+ text, human-readable form of the scheduling message (i.e.,
+ "multipart/alternative" [RFC2046]).
+
+ In order to permit the information in the scheduling message to be
+ understood by MIME User Agents (UAs) that do not support the
+ "text/calendar" content type, scheduling messages SHOULD be sent with
+ an alternative, human-readable form of the information.
+
+ Note that "multipart/alternative" MUST NOT be used to represent two
+ slightly different iCalendar objects, for example, two "VEVENT"s with
+ alternative starting times.
+
+ CUAs can use other MIME parameters of the "Content-Type" header
+ field, as well as a language specified in the Content-Language header
+ field [RFC3282], to pick a "text/calendar" part for processing if a
+ "multipart/alternative" MIME message contains more than one
+ "text/calendar" part.
+
+ Any receiving UA compliant with this specification MUST be able to
+ process "text/calendar" body parts enclosed within "multipart/*".
+ Note that a "multipart/mixed" MIME message can include multiple
+ "text/calendar" components. The receiving UA MUST be able to process
+ all of them.
+
+2.5. Content-Transfer-Encoding Header Field
+
+ Unless an iMIP message is transported over 8-bit clean transport
+ (such as SMTP [8BITMIME]), a transfer encoding such as quoted-
+ printable or base64 [RFC2045] MUST be used for iCalendar objects
+ containing any characters that can't be represented in the US-ASCII
+ character set. For example:
+
+
+
+
+
+
+
+
+
+
+
+Melnikov Standards Track [Page 7]
+
+RFC 6047 iMIP December 2010
+
+
+ From: user1@example.com
+ To: user2@example.com
+ Subject: Phone Conference
+ Mime-Version: 1.0
+ Date: Wed, 07 May 2008 21:30:25 +0400
+ Message-ID: <4821E731.5040506@laptop1.example.com>
+ Content-Type: text/calendar; method=REQUEST; charset=UTF-8
+ Content-Transfer-Encoding: quoted-printable
+
+ BEGIN:VCALENDAR
+ PRODID:-//Example/ExampleCalendarClient//EN
+ METHOD:REQUEST
+ VERSION:2.0
+ BEGIN:VEVENT
+ ORGANIZER:mailto:user1@example.com
+ ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:mailto:user1@example.com
+ ATTENDEE;RSVP=YES;CUTYPE=INDIVIDUAL:mailto:user2@example.com
+ DTSTAMP:20080507T170000Z
+ DTSTART:20080701T160000Z
+ DTEND:20080701T163000Z
+ SUMMARY:Phone call to discuss your last visit
+ DESCRIPTION:=D1=82=D1=8B =D0=BA=D0=B0=D0=BA - =D0=B4=D0=BE=D0=
+ =B2=D0=BE=D0=BB=D0=B5=D0=BD =D0=BF=D0=BE=D0=B5=D0=B7=D0=B4=D0=BA=D0
+ =BE=D0=B9?
+ UID:calsvr.example.com-8739701987387998
+ SEQUENCE:0
+ STATUS:TENTATIVE
+ END:VEVENT
+ END:VCALENDAR
+
+2.6. Content-Disposition Header Field
+
+ Implementations MAY include a "Content-Disposition" header field to
+ define a file name for an iCalendar object. However, the handling of
+ a MIME part MUST be based on its [RFC2045] "Content-Type" and not on
+ the extension specified in the "Content-Disposition", as different
+ email malware is known to trick User Agents into misinterpreting
+ content of messages by specifying a file extension in the Content-
+ Disposition header field that doesn't correspond to the value of the
+ "Content-Type" header field.
+
+3. Security Considerations
+
+ The security threats that applications must address when implementing
+ iTIP are detailed in [iTIP]. In particular, two spoofing threats are
+ identified in Section 6.1 of [iTIP]: spoofing the "Organizer", and
+ spoofing an "Attendee". To address these threats, the originator of
+ an iCalendar object must be authenticated by a recipient. Once
+
+
+
+Melnikov Standards Track [Page 8]
+
+RFC 6047 iMIP December 2010
+
+
+ authenticated, a determination can be made as to whether or not the
+ originator is authorized to perform the requested operation.
+ Compliant applications MUST support signing and encrypting
+ "text/calendar" body parts using a mechanism based on S/MIME
+ [RFC5750] [RFC5751] in order to facilitate the authentication of the
+ originator of the iCalendar object (see Sections 2.2.2 and 2.2.3).
+ The steps for processing a signed iMIP message are described below:
+
+ 1. Using S/MIME, determine who signed the "text/calendar" body part
+ containing the iCalendar object. This is the "signer". (Note
+ that the email address of the signer MUST be specified in the
+ rfc822Name field of the "subject alternative name" extension of
+ the signer certificate, as specified in [RFC5280],
+ Section 4.1.2.6.) Note that the signer is not necessarily the
+ person sending an e-mail message, since an e-mail message can be
+ forwarded.
+
+ 2. Correlate the signer to either an "ATTENDEE" property or to the
+ "ORGANIZER" property in the iCalendar object, based on the method
+ and the calendar component specified in the iCalendar object, as
+ defined in Section 1.4 of [iTIP]. If the signer cannot be
+ correlated to an "ATTENDEE"/"ORGANIZER" property, then actively
+ warn the user controlling the "Calendar User Agent" that the
+ iCalendar object is untrusted, and encourage the user to ignore
+ the message, but give advanced users the option to (a) view the
+ certificate of the signer and the entire certificate chain (if
+ any) in order to help decide if the signer should be trusted to
+ send the message, and then (b) allow the CUA to accept and process
+ the iCalendar object.
+
+ 3. Determine whether or not the "ATTENDEE"/"ORGANIZER" is authorized
+ to perform the operation as defined by [iTIP]. If the conditions
+ are not met, ignore the message.
+
+ 4. If all the above conditions are met, the message can be processed.
+
+ S/MIME signing also protects against malicious changes to messages in
+ transit.
+
+ If calendar confidentiality is required by the sender, signed iMIP
+ messages SHOULD be encrypted by a mechanism based on S/MIME [RFC5750]
+ [RFC5751]. If iMIP is used within a single ADministrative Management
+ Domain (ADMD) [RFC5598], SMTP STARTTLS [SMTP-TLS] (together with
+ STARTTLS in IMAP/POP [IMAP-POP-TLS]) MAY alternatively be used to
+ provide calendar confidentiality.
+
+
+
+
+
+
+Melnikov Standards Track [Page 9]
+
+RFC 6047 iMIP December 2010
+
+
+ Once a signed and/or encrypted iMIP message is received and
+ successfully verified (as detailed above) by a CUA, the CUA SHOULD
+ remember whether the sender of the message is using signing and/or
+ encrypting. If an unsigned iMIP message is received from the same
+ sender later on, the receiving CUA SHOULD warn the receiving user
+ about a possible man-in-the-middle attack and SHOULD ignore the
+ message, unless explicitly overridden by the user.
+
+ Implementations MAY provide means for users to disable signing and
+ encrypting.
+
+ It is possible to receive iMIP messages sent by someone working on
+ behalf of another "Calendar User". This is determined by examining
+ the "sent-by" parameter in the relevant "ORGANIZER" or "ATTENDEE"
+ property. [iCAL] and [iTIP] provide no mechanism to verify that a
+ "Calendar User" has authorized someone else to work on their behalf.
+ To address this security issue, implementations MUST provide
+ mechanisms for the "Calendar Users" to make that decision before
+ applying changes from someone working on behalf of a "Calendar User".
+ One way to achieve this is to reject iMIP messages sent by users
+ other than the "ORGANIZER" or the "ATTENDEE"s. Alternatively, the
+ receiver could have a list of trusted <sent-by, organizer> proxies in
+ its local security policy. And yet another way is to prompt the user
+ for confirmation.
+
+ iMIP-based calendaring is frequently deployed within a single ADMD,
+ with boundary filtering employed to restrict email calendaring flows
+ to be inside the ADMD. This can help in minimizing malicious changes
+ to calendaring messages in transit, as well as in making
+ authorization decisions less risky.
+
+ A security consideration associated with the use of the Content-
+ Disposition header field is described in Section 2.6.
+
+ Use of S/MIME makes the security considerations discussed in
+ [RFC5750] [RFC5751] relevant to this document. For additional
+ security considerations regarding certificate and Certificate
+ Revocation List (CRL) verification, please see [RFC5280].
+
+
+
+
+
+
+
+
+
+
+
+
+
+Melnikov Standards Track [Page 10]
+
+RFC 6047 iMIP December 2010
+
+
+4. Examples
+
+4.1. Single Component with an ATTACH Property
+
+ This minimal message shows how an iCalendar object references an
+ attachment. The attachment is accessible via its URL.
+
+ From: sman@netscape.example.com
+ To: stevesil@microsoft.example.com
+ Subject: Phone Conference
+ Mime-Version: 1.0
+ Content-Type: text/calendar; method=REQUEST; charset=US-ASCII
+ Content-Transfer-Encoding: 7bit
+
+ BEGIN:VCALENDAR
+ PRODID:-//Example/ExampleCalendarClient//EN
+ METHOD:REQUEST
+ VERSION:2.0
+ BEGIN:VEVENT
+ ORGANIZER:mailto:man@netscape.example.com
+ ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:mailto:man@netscape.example.com
+ ATTENDEE;RSVP=YES:mailto:stevesil@microsoft.example.com
+ DTSTAMP:19970611T190000Z
+ DTSTART:19970701T210000Z
+ DTEND:19970701T230000Z
+ SUMMARY:Phone Conference
+ DESCRIPTION:Please review the attached document.
+ UID:calsvr.example.com-873970198738777
+ ATTACH:ftp://ftp.bar.example.com/pub/docs/foo.doc
+ STATUS:CONFIRMED
+ END:VEVENT
+ END:VCALENDAR
+
+4.2. Using multipart/alternative for Low-Fidelity Clients
+
+ This example shows how a client can emit a multipart message that
+ includes both a plain text version and the full iCalendar object.
+ Clients that do not support "text/calendar" will still be capable of
+ rendering the plain text representation.
+
+
+
+
+
+
+
+
+
+
+
+
+Melnikov Standards Track [Page 11]
+
+RFC 6047 iMIP December 2010
+
+
+ From: foo1@example.com
+ To: foo2@example.com
+ Subject: Phone Conference
+ Mime-Version: 1.0
+ Content-Type: multipart/alternative; boundary="01BD3665.3AF0D360"
+
+ --01BD3665.3AF0D360
+ Content-Type: text/plain; charset=us-ascii
+ Content-Transfer-Encoding: 7bit
+
+ This is an alternative representation of a "text/calendar"
+ MIME object.
+
+ When: 7/1/1997 10:00AM PDT - 7/1/97 10:30AM PDT
+ Where:
+ Organizer: foo1@example.com
+ Summary: Phone Conference
+
+ --01BD3665.3AF0D360
+ Content-Type: text/calendar; method=REQUEST; charset=US-ASCII
+ Content-Transfer-Encoding: 7bit
+
+ BEGIN:VCALENDAR
+ PRODID:-//Example/ExampleCalendarClient//EN
+ METHOD:REQUEST
+ VERSION:2.0
+ BEGIN:VEVENT
+ ORGANIZER:mailto:foo1@example.com
+ ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:mailto:foo1@example.com
+ ATTENDEE;RSVP=YES;CUTYPE=INDIVIDUAL:mailto:foo2@example.com
+ DTSTAMP:19970611T190000Z
+ DTSTART:19970701T170000Z
+ DTEND:19970701T173000Z
+ SUMMARY:Phone Conference
+ UID:calsvr.example.com-8739701987387771
+ SEQUENCE:0
+ STATUS:CONFIRMED
+ END:VEVENT
+ END:VCALENDAR
+
+ --01BD3665.3AF0D360
+
+4.3. Single Component with an ATTACH Property and Inline Attachment
+
+ This example shows how a message containing an iCalendar object
+ references an attached document. The reference is made using a
+ Content-ID (CID). Thus, the iCalendar object and the document are
+ packaged in a "multipart/related" encapsulation.
+
+
+
+Melnikov Standards Track [Page 12]
+
+RFC 6047 iMIP December 2010
+
+
+ From: foo1@example.com
+ To: foo2@example.com
+ Subject: Phone Conference
+ Mime-Version: 1.0
+ Content-Type: multipart/related; boundary="boundary-example-1"
+
+ --boundary-example-1
+
+ Content-Type: text/calendar; method=REQUEST; charset=US-ASCII
+ Content-Transfer-Encoding: 7bit
+ Content-Disposition: attachment; filename="event.ics"
+
+ BEGIN:VCALENDAR
+ PRODID:-//Example/ExampleCalendarClient//EN
+ METHOD:REQUEST
+ VERSION:2.0
+ BEGIN:VEVENT
+ ORGANIZER:mailto:foo1@example.com
+ ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:mailto:foo1@example.com
+ ATTENDEE;RSVP=YES;CUTYPE=INDIVIDUAL:mailto:foo2@example.com
+ DTSTAMP:19970611T190000Z
+ DTSTART:19970701T180000Z
+ DTEND:19970701T183000Z
+ SUMMARY:Phone Conference
+ UID:calsvr.example.com-8739701987387771
+ ATTACH:cid:123456789@example.com
+ SEQUENCE:0
+ STATUS:CONFIRMED
+ END:VEVENT
+ END:VCALENDAR
+
+ --boundary-example-1
+ Content-Type: application/msword; name="FieldReport.doc"
+ Content-Transfer-Encoding: base64
+ Content-Disposition: inline; filename="FieldReport.doc"
+ Content-ID: <123456789@example.com>
+
+ 0M8R4KGxGuEAAAAAAAAAAAAAAAAAAAAAPgADAP7/CQAGAAAAAAAAAAABAAAARAAAAAAA
+ AAAAEAAAQAAAAAEAAAD+////AAAAAEUAAAD/////////////////////////////////
+ ...
+
+ --boundary-example-1--
+
+
+
+
+
+
+
+
+
+Melnikov Standards Track [Page 13]
+
+RFC 6047 iMIP December 2010
+
+
+4.4. Multiple Similar Components
+
+ Multiple iCalendar components of the same type can be included in the
+ iCalendar object when the "METHOD" is the same for each component.
+
+ From: foo1@example.com
+ To: foo2@example.com
+ Subject: Summer Company Holidays
+ Mime-Version: 1.0
+ Content-Type: text/calendar; method=PUBLISH; charset=US-ASCII
+ Content-Transfer-Encoding: 7bit
+ Content-Disposition: attachment; filename="event.ics"
+
+ BEGIN:VCALENDAR
+ PRODID:-//Example/ExampleCalendarClient//EN
+ METHOD:PUBLISH
+ VERSION:2.0
+ BEGIN:VEVENT
+ ORGANIZER:mailto:foo1@example.com
+ DTSTAMP:19970611T150000Z
+ DTSTART:19970701T150000Z
+ DTEND:19970701T230000Z
+ SUMMARY:Company Picnic
+ DESCRIPTION:Food and drink will be provided
+ UID:calsvr.example.com-873970198738777-1
+ SEQUENCE:0
+ STATUS:CONFIRMED
+ END:VEVENT
+ BEGIN:VEVENT
+ ORGANIZER:mailto:foo1@example.com
+ DTSTAMP:19970611T190000Z
+ DTSTART:19970715T150000Z
+ DTEND:19970715T230000Z
+ SUMMARY:Company Bowling Tournament
+ DESCRIPTION:We have 10 lanes reserved
+ UID:calsvr.example.com-873970198738777-2
+ SEQUENCE:0
+ STATUS:CONFIRMED
+ END:VEVENT
+ END:VCALENDAR
+
+
+
+
+
+
+
+
+
+
+
+Melnikov Standards Track [Page 14]
+
+RFC 6047 iMIP December 2010
+
+
+4.5. Multiple Mixed Components
+
+ Different component types must be encapsulated in separate iCalendar
+ objects.
+
+ From: foo1@example.com
+ To: foo2@example.com
+ Subject: Phone Conference
+ Mime-Version: 1.0
+ Content-Type: multipart/mixed;
+ boundary="--FEE3790DC7E35189CA67CE2C"
+
+ This is a multi-part message in MIME format.
+
+ ----FEE3790DC7E35189CA67CE2C
+ Content-Type: text/calendar; method=REQUEST; charset=US-ASCII
+ Content-Transfer-Encoding: 7bit
+ Content-Disposition: attachment; filename="event1.ics"
+
+ BEGIN:VCALENDAR
+ PRODID:-//Example/ExampleCalendarClient//EN
+ METHOD:REQUEST
+ VERSION:2.0
+ BEGIN:VEVENT
+ ORGANIZER:mailto:foo1@example.com
+ ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:mailto:foo1@example.com
+ ATTENDEE;RSVP=YES;CUTYPE=INDIVIDUAL:mailto:foo2@example.com
+ DTSTAMP:19970611T190000Z
+ DTSTART:19970701T210000Z
+ DTEND:19970701T230000Z
+ SUMMARY:Phone Conference
+ DESCRIPTION:Discuss what happened at the last meeting
+ UID:calsvr.example.com-8739701987387772
+ SEQUENCE:0
+ STATUS:CONFIRMED
+ END:VEVENT
+ END:VCALENDAR
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Melnikov Standards Track [Page 15]
+
+RFC 6047 iMIP December 2010
+
+
+ ----FEE3790DC7E35189CA67CE2C
+ Content-Type: text/calendar; method=REQUEST; charset=US-ASCII
+ Content-Transfer-Encoding: 7bit
+ Content-Disposition: attachment; filename="todo1.ics"
+
+ BEGIN:VCALENDAR
+ PRODID:-//Example/ExampleCalendarClient//EN
+ METHOD:REQUEST
+ VERSION:2.0
+ BEGIN:VTODO
+ DUE:19970701T160000Z
+ ORGANIZER:mailto:foo1@example.com
+ ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:mailto:foo1@example.com
+ ATTENDEE;RSVP=YES:mailto:foo2@example.com
+ SUMMARY:Phone Conference
+ DESCRIPTION:Discuss a new location for the company picnic
+ UID:calsvr.example.com-td-8739701987387773
+ SEQUENCE:0
+ STATUS:NEEDS-ACTION
+ END:VEVENT
+ END:VCALENDAR
+
+ ----FEE3790DC7E35189CA67CE2C
+
+4.6. Detailed Components with an ATTACH Property
+
+ This example shows the format of a message containing a group meeting
+ between three individuals. The "multipart/related" encapsulation is
+ used because the iCalendar object contains an ATTACH property that
+ uses a CID to reference the attachment.
+
+ From: foo1@example.com
+ MIME-Version: 1.0
+ To: foo2@example.com,foo3@example.com
+ Subject: REQUEST - Phone Conference
+ Content-Type: multipart/related;
+ boundary="--FEE3790DC7E35189CA67CE2C"
+
+ ----FEE3790DC7E35189CA67CE2C
+ Content-Type: multipart/alternative;
+ boundary="--00FEE3790DC7E35189CA67CE2C00"
+
+
+
+
+
+
+
+
+
+
+Melnikov Standards Track [Page 16]
+
+RFC 6047 iMIP December 2010
+
+
+ ----00FEE3790DC7E35189CA67CE2C00
+ Content-Type: text/plain; charset=us-ascii
+ Content-Transfer-Encoding: 7bit
+
+ When: 7/1/1997 10:00PM PDT - 7/1/97 10:30 PM PDT
+ Where:
+ Organizer: foo1@example.com
+ Summary: Let's discuss the attached document
+
+ ----00FEE3790DC7E35189CA67CE2C00
+
+ Content-Type: text/calendar; method=REQUEST; charset=US-ASCII;
+ Component=vevent
+ Content-Transfer-Encoding: 7bit
+ Content-Disposition: attachment; filename="event.ics"
+
+ BEGIN:VCALENDAR
+ PRODID:-//Example/ExampleCalendarClient//EN
+ METHOD:REQUEST
+ VERSION:2.0
+ BEGIN:VEVENT
+ ORGANIZER:foo1@example.com
+ ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:foo1@example.com
+ ATTENDEE;RSVP=YES;CUTYPE=INDIVIDUAL:mailto:foo2@example.com
+ ATTENDEE;RSVP=YES;CUTYPE=INDIVIDUAL:mailto:foo3@example.com
+ DTSTAMP:19970611T190000Z
+ DTSTART:19970621T170000Z
+ DTEND:199706211T173000Z
+ SUMMARY:Let's discuss the attached document
+ UID:calsvr.example.com-873970198738777-8aa
+ ATTACH:cid:calsvr.example.com-12345aaa
+ SEQUENCE:0
+ STATUS:CONFIRMED
+ END:VEVENT
+ END:VCALENDAR
+
+ ----00FEE3790DC7E35189CA67CE2C00
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Melnikov Standards Track [Page 17]
+
+RFC 6047 iMIP December 2010
+
+
+ ----FEE3790DC7E35189CA67CE2C
+ Content-Type: application/msword; name="FieldReport.doc"
+ Content-Transfer-Encoding: base64
+ Content-Disposition: inline; filename="FieldReport.doc"
+ Content-ID: <calsvr.example.com-12345aaa>
+
+ R0lGODdhTAQZAJEAAFVVVd3d3e4AAP///ywAAAAATAQZAAAC/5yPOSLhD6OctNqLs94Xq
+ AG4kiW5omm6sq27gvH8kzX9o1y+s73/g8MCofEovGITCoxKMbyCR16cNSq9YrNarfcrvd
+ riIH5LL5jE6rxc3G+v2cguf0uv2Oz+v38L7/DxgoOKjURnjIIbe3yNjo+AgZWYVIWWl5i
+ ZnJY6J
+ ...
+
+ ----FEE3790DC7E35189CA67CE2C
+
+5. Recommended Practices
+
+ This section outlines a series of recommended practices when using a
+ messaging transport to exchange iCalendar objects.
+
+5.1. Use of Content and Message IDs
+
+ The [iCAL] specification makes frequent use of the URI for data types
+ in properties such as "DESCRIPTION", "ATTACH", "CONTACT", and others.
+ Two forms of URIs are the Message ID (MID) and the Content-ID (CID).
+ These are defined in [RFC2392]. Although [RFC2392] allows
+ referencing messages or MIME body parts in other MIME entities or
+ stores, it is strongly RECOMMENDED that iMIP implementations include
+ all referenced messages and body parts in a single MIME entity.
+ Simply put, if an iCalendar object contains CID or MID references to
+ other messages or body parts, implementations should ensure that
+ these messages and/or body parts are transmitted with the iCalendar
+ object. If they are not, there is no guarantee that the receiving
+ CUA will have the access or the authorization to view those objects.
+
+6. IANA Considerations
+
+ The "text/calendar" MIME media type was registered in [iCAL].
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Melnikov Standards Track [Page 18]
+
+RFC 6047 iMIP December 2010
+
+
+7. References
+
+7.1. Normative References
+
+ [iCAL] Desruisseaux, B., Ed., "Internet Calendaring and
+ Scheduling Core Object Specification (iCalendar)",
+ RFC 5545, September 2009.
+
+ [iTIP] Daboo, C., Ed., "iCalendar Transport-Independent
+ Interoperability Protocol (iTIP)", RFC 5546, December
+ 2009.
+
+ [RFC5322] Resnick, P., Ed., "Internet Message Format", RFC 5322,
+ October 2008.
+
+ [MAILTO] Duerst, M., Masinter, L., and J. Zawinski, "The 'mailto'
+ URI Scheme", RFC 6068, October 2010.
+
+ [RFC1847] Galvin, J., Murphy, S., Crocker, S., and N. Freed,
+ "Security Multiparts for MIME: Multipart/Signed and
+ Multipart/Encrypted", RFC 1847, October 1995.
+
+ [RFC2045] Freed, N. and N. Borenstein, "Multipurpose Internet Mail
+ Extensions (MIME) Part One: Format of Internet Message
+ Bodies", RFC 2045, November 1996.
+
+ [RFC2046] Freed, N. and N. Borenstein, "Multipurpose Internet Mail
+ Extensions (MIME) Part Two: Media Types", RFC 2046,
+ November 1996.
+
+ [RFC2392] Levinson, E., "Content-ID and Message-ID Uniform Resource
+ Locators", RFC 2392, August 1998.
+
+ [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
+ Requirement Levels", BCP 14, RFC 2119, March 1997.
+
+ [UTF-8] Yergeau, F., "UTF-8, a transformation format of ISO
+ 10646", STD 63, RFC 3629, November 2003.
+
+ [SMTP-TLS] Hoffman, P., "SMTP Service Extension for Secure SMTP over
+ Transport Layer Security", RFC 3207, February 2002.
+
+ [IMAP-POP-TLS]
+ Newman, C., "Using TLS with IMAP, POP3 and ACAP",
+ RFC 2595, June 1999.
+
+
+
+
+
+
+Melnikov Standards Track [Page 19]
+
+RFC 6047 iMIP December 2010
+
+
+ [RFC5750] Ramsdell, B. and S. Turner, "Secure/Multipurpose Internet
+ Mail Extensions (S/MIME) Version 3.2 Certificate
+ Handling", RFC 5750, January 2010.
+
+ [RFC5751] Ramsdell, B. and S. Turner, "Secure/Multipurpose Internet
+ Mail Extensions (S/MIME) Version 3.2 Message
+ Specification", RFC 5751, January 2010.
+
+ [RFC5280] Cooper, D., Santesson, S., Farrell, S., Boeyen, S.,
+ Housley, R., and W. Polk, "Internet X.509 Public Key
+ Infrastructure Certificate and Certificate Revocation
+ List (CRL) Profile", RFC 5280, May 2008.
+
+7.2. Informative References
+
+ [8BITMIME] Klensin, J., Freed, N., Rose, M., Stefferud, E., and D.
+ Crocker, "SMTP Service Extension for 8bit-MIMEtransport",
+ RFC 1652, July 1994.
+
+ [RFC5598] Crocker, D., "Internet Mail Architecture", RFC 5598, July
+ 2009.
+
+ [RFC3282] Alvestrand, H., "Content Language Headers", RFC 3282, May
+ 2002.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Melnikov Standards Track [Page 20]
+
+RFC 6047 iMIP December 2010
+
+
+Appendix A. Changes since RFC 2447
+
+ Updated references. Split them into Normative and Informative.
+
+ Updated examples to use example.com/example.net domains.
+
+ Corrected usage of RFC 2119 language.
+
+ Clarified that charset=UTF-8 is required, unless the calendar can be
+ entirely represented in US-ASCII.
+
+ Clarified that 7-bit content transfer encodings should be used unless
+ the calendar object is known to be transferred over 8-bit clean
+ transport.
+
+ Clarified that file extension specified in the Content-Disposition
+ header field is not to be used to override the "Content-Type" MIME
+ type.
+
+ Disallowed use of "multipart/alternative" for slightly different
+ representations of the same calendar.
+
+ Clarified handling of the "method" MIME parameter of the "Content-
+ Type" header field.
+
+ Clarified that in an iMIP message an ORGANIZER/ATTENDEE property
+ contains a mailto: URI.
+
+ Fixed examples with ATTENDEE property to use "CUTYPE=" instead of
+ "TYPE=".
+
+ Clarified that message integrity/confidentiality should be achieved
+ using S/MIME.
+
+ Provided additional examples.
+
+ Improved the Security Considerations section.
+
+ Made multiple editorial changes to different sections of the
+ document.
+
+
+
+
+
+
+
+
+
+
+
+Melnikov Standards Track [Page 21]
+
+RFC 6047 iMIP December 2010
+
+
+Appendix B. Acknowledgements
+
+ The editor of this document wishes to thank Frank Dawson, Steve
+ Mansour, and Steve Silverberg, the original authors of RFC 2447, as
+ well as the following individuals who have participated in the
+ drafting, review, and discussion of this memo:
+
+ Reinhold Kainhofer, Cyrus Daboo, Bernard Desruisseaux, Eliot Lear,
+ and Peter Saint-Andre.
+
+Author's Address
+
+ Alexey Melnikov (editor)
+ Isode Ltd
+ 5 Castle Business Village
+ 36 Station Road
+ Hampton, Middlesex TW12 2BX
+ UK
+
+ EMail: Alexey.Melnikov@isode.com
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Melnikov Standards Track [Page 22]
+
diff --git a/vendor/sabre/dav/docs/rfc6321.txt b/vendor/sabre/dav/docs/rfc6321.txt
new file mode 100644
index 000000000..c038c64cf
--- /dev/null
+++ b/vendor/sabre/dav/docs/rfc6321.txt
@@ -0,0 +1,3027 @@
+
+
+
+
+
+
+Internet Engineering Task Force (IETF) C. Daboo
+Request for Comments: 6321 Apple, Inc.
+Category: Standards Track M. Douglass
+ISSN: 2070-1721 RPI
+ S. Lees
+ Microsoft
+ August 2011
+
+
+ xCal: The XML Format for iCalendar
+
+Abstract
+
+ This specification defines "xCal", an XML format for iCalendar data.
+
+Status of This Memo
+
+ This is an Internet Standards Track document.
+
+ This document is a product of the Internet Engineering Task Force
+ (IETF). It represents the consensus of the IETF community. It has
+ received public review and has been approved for publication by the
+ Internet Engineering Steering Group (IESG). Further information on
+ Internet Standards is available in Section 2 of RFC 5741.
+
+ Information about the current status of this document, any errata,
+ and how to provide feedback on it may be obtained at
+ http://www.rfc-editor.org/info/rfc6321.
+
+Copyright Notice
+
+ Copyright (c) 2011 IETF Trust and the persons identified as the
+ document authors. All rights reserved.
+
+ This document is subject to BCP 78 and the IETF Trust's Legal
+ Provisions Relating to IETF Documents
+ (http://trustee.ietf.org/license-info) in effect on the date of
+ publication of this document. Please review these documents
+ carefully, as they describe your rights and restrictions with respect
+ to this document. Code Components extracted from this document must
+ include Simplified BSD License text as described in Section 4.e of
+ the Trust Legal Provisions and are provided without warranty as
+ described in the Simplified BSD License.
+
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 1]
+
+RFC 6321 xCal August 2011
+
+
+Table of Contents
+
+ 1. Introduction ....................................................3
+ 2. Conventions Used in This Document ...............................4
+ 3. Converting from iCalendar to xCal ...............................4
+ 3.1. Pre-Processing .............................................4
+ 3.2. iCalendar Stream (RFC 5545, Section 3.4) ...................5
+ 3.3. Components (RFC 5545, Section 3.6) .........................6
+ 3.4. Properties (RFC 5545, Sections 3.7 and 3.8) ................6
+ 3.4.1. Special Cases for Properties ........................8
+ 3.4.1.1. Multi-Valued Properties ....................8
+ 3.4.1.2. GEO Property ...............................9
+ 3.4.1.3. REQUEST-STATUS Property ....................9
+ 3.5. Parameters (RFC 5545, Section 3.2) ........................10
+ 3.5.1. VALUE Parameter ....................................11
+ 3.6. Values (RFC 5545, Section 3.3) ............................11
+ 3.6.1. Binary (RFC 5545, Section 3.3.1) ...................12
+ 3.6.2. Boolean (RFC 5545, Section 3.3.2) .................12
+ 3.6.3. Calendar User Address (RFC 5545, Section 3.3.3) ....12
+ 3.6.4. Date (RFC 5545, Section 3.3.4) .....................12
+ 3.6.5. Date-Time (RFC 5545, Section 3.3.5) ................13
+ 3.6.6. Duration (RFC 5545, Section 3.3.6) .................13
+ 3.6.7. Float (RFC 5545, Section 3.3.7) ....................13
+ 3.6.8. Integer (RFC 5545, Section 3.3.8) ..................14
+ 3.6.9. Period of Time (RFC 5545, Section 3.3.9) ...........14
+ 3.6.10. Recurrence Rule (RFC 5545, Section 3.3.10) ........14
+ 3.6.11. Text (RFC 5545, Section 3.3.11) ...................15
+ 3.6.12. Time (RFC 5545, Section 3.3.12) ...................15
+ 3.6.13. URI (RFC 5545, Section 3.3.13) ....................15
+ 3.6.14. UTC Offset (RFC 5545, Section 3.3.14) .............16
+ 3.7. Extensions ................................................16
+ 4. Converting from xCal into iCalendar ............................16
+ 4.1. Converting XML Extensions into iCalendar ..................16
+ 4.2. The XML Property for iCalendar ............................17
+ 5. Handling Unrecognized Properties or Parameters .................18
+ 6. Security Considerations ........................................19
+ 7. IANA Considerations ............................................20
+ 7.1. Namespace Registration ....................................20
+ 7.2. Media Type ................................................20
+ 7.3. iCalendar Property Registrations ..........................21
+ 8. Acknowledgments ................................................22
+ 9. References .....................................................22
+ 9.1. Normative References ......................................22
+ 9.2. Informative References ....................................22
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 2]
+
+RFC 6321 xCal August 2011
+
+
+ Appendix A. RELAX NG Schema .......................................23
+ Appendix B. Examples ..............................................49
+ B.1. Example 1 ..................................................49
+ B.1.1. iCalendar Data .........................................49
+ B.1.2. XML Data ...............................................49
+ B.2. Example 2 ..................................................50
+ B.2.1. iCalendar Data .........................................50
+ B.2.2. XML Data ...............................................51
+
+1. Introduction
+
+ The iCalendar data format [RFC5545] is a widely deployed interchange
+ format for calendaring and scheduling data. While many applications
+ and services consume and generate calendar data, iCalendar is a
+ specialized format that requires its own parser/generator. In
+ contrast, XML-based formats are widely used for interoperability
+ between applications, and the many tools that generate, parse, and
+ manipulate XML make it easier to work with than iCalendar.
+
+ The purpose of this specification is to define "xCal", an XML format
+ for iCalendar data. xCal is defined as a straightforward mapping into
+ XML from iCalendar, so that iCalendar data can be converted to XML,
+ and then back to iCalendar, without losing any semantic meaning in
+ the data. Anyone creating xCal calendar data according to this
+ specification will know that their data can be converted to a valid
+ iCalendar representation as well.
+
+ Key design considerations are:
+
+ Round-tripping (converting an iCalendar instance to xCal and back)
+ will give the same semantic result as the starting point. That
+ is, all components, properties, and property parameters are
+ guaranteed to be preserved, with the exception of those that have
+ default values.
+
+ xCal preserves the semantics of the iCalendar data. While a
+ simple consumer can easily browse the calendar data in xCal, a
+ full understanding of iCalendar is still required in order to
+ modify and/or fully comprehend the calendar data.
+
+ xCal has the ability to handle many extensions to the underlying
+ iCalendar specification without requiring an update to this
+ document.
+
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 3]
+
+RFC 6321 xCal August 2011
+
+
+2. Conventions Used in This Document
+
+ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
+ "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
+ document are to be interpreted as described in [RFC2119].
+
+ When XML element types in the namespace
+ "urn:ietf:params:xml:ns:icalendar-2.0" are referenced in this
+ document outside of the context of an XML fragment, the string "IC:"
+ will be prefixed to the element types.
+
+ Some examples in this document contain "partial" XML documents used
+ for illustrative purposes. In these examples, three periods "..."
+ are used to indicate a portion of the document that has been removed
+ for compactness.
+
+3. Converting from iCalendar to xCal
+
+ This section describes how iCalendar data is converted to xCal using
+ a simple mapping between the iCalendar data model and XML elements.
+
+3.1. Pre-Processing
+
+ iCalendar uses a line folding mechanism to limit lines of data to a
+ maximum line length (typically 72 characters) to ensure maximum
+ likelihood of preserving data integrity as it is transported via
+ various means (e.g., email) -- see Section 3.1 of [RFC5545]. Prior
+ to converting iCalendar data into xCal, all folded lines MUST be
+ unfolded.
+
+ iCalendar data uses an "escape" character sequence for text values
+ and property parameter values. When such text elements are converted
+ into xCal, the escaping MUST be removed.
+
+ iCalendar uses a base64 encoding for binary data. However, it does
+ not restrict the encoding from being applied to non-binary value
+ types. So, the following rules MUST be applied when processing a
+ property with the "ENCODING" property parameter set to "BASE64":
+
+ o If the property value type is "BINARY", the base64 encoding MUST
+ be preserved.
+
+ o If the value type is not "BINARY", the "ENCODING" property
+ parameter MUST be removed, and the value MUST be base64 decoded.
+
+ When base64 encoding and decoding are used, they MUST conform to
+ Section 4 of [RFC4648], which is the base64 method used in [RFC5545].
+
+
+
+
+Daboo, et al. Standards Track [Page 4]
+
+RFC 6321 xCal August 2011
+
+
+ One key difference in the formatting of values used in iCalendar and
+ xCal is that, in xCal, the specification uses date/time and UTC
+ offset values aligned with the syntax of
+ [W3C.REC-xmlschema-2-20041028] to aid with XML processing.
+
+3.2. iCalendar Stream (RFC 5545, Section 3.4)
+
+ At the top level of the iCalendar object model is an "iCalendar
+ stream". This object encompasses multiple "iCalendar objects". In
+ xCal, the entire stream is contained in the root IC:icalendar XML
+ element.
+
+ An iCalendar stream can contain one or more iCalendar objects. Each
+ iCalendar object, delimited by "BEGIN:VCALENDAR" and "END:VCALENDAR",
+ is enclosed by the IC:vcalendar XML element.
+
+ Example:
+
+ <?xml version="1.0" encoding="utf-8"?>
+ <icalendar xmlns="urn:ietf:params:xml:ns:icalendar-2.0">
+ <vcalendar>
+ ...
+ </vcalendar>
+ </icalendar>
+
+ iCalendar objects are comprised of a set of "components",
+ "properties", "parameters", and "values". A "component" can contain
+ other "components" or "properties". A "property" has a value and a
+ set of zero or more "parameters".
+
+ In xCal, component elements, for example, IC:vevent and IC:vtodo, are
+ contained within an IC:components XML element. Within the component
+ element, another IC:components element could appear (representing
+ components nested within components) or the IC:properties XML element
+ could appear. IC:properties is used to encapsulate iCalendar
+ properties.
+
+ Each iCalendar property will be mapped to its own XML element as
+ described below. Within each of these elements, there is zero or one
+ IC:parameters XML element used to encapsulate any iCalendar property
+ parameters. Additionally there will be one or more XML elements
+ representing the value of the iCalendar property.
+
+
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 5]
+
+RFC 6321 xCal August 2011
+
+
+ Example:
+
+ <?xml version="1.0" encoding="utf-8"?>
+ <icalendar xmlns="urn:ietf:params:xml:ns:icalendar-2.0">
+ <vcalendar>
+ <properties>
+ ...
+ </properties>
+ <components>
+ ...
+ </components>
+ </vcalendar>
+ </icalendar>
+
+ +------------------+--------------+------------------+
+ | Item | XML element | XML Definition |
+ +------------------+--------------+------------------+
+ | iCalendar Stream | IC:icalendar | Appendix A # 3.4 |
+ | VCALENDAR | IC:vcalendar | Appendix A # 3.6 |
+ +------------------+--------------+------------------+
+
+3.3. Components (RFC 5545, Section 3.6)
+
+ Each calendar component in the "VCALENDAR" object, delimited by
+ "BEGIN" and "END", will be converted to an enclosing XML element with
+ the same name, but in lowercase. As an example, the table below
+ shows iCalendar-to-xCal mappings for current iCalendar components.
+ Any new iCalendar components added in the future will be converted in
+ the same way.
+
+ +-----------+--------------+--------------------+
+ | Component | XML element | XML Definition |
+ +-----------+--------------+--------------------+
+ | VEVENT | IC:vevent | Appendix A # 3.6.1 |
+ | VTODO | IC:vtodo | Appendix A # 3.6.2 |
+ | VJOURNAL | IC:vjournal | Appendix A # 3.6.3 |
+ | VFREEBUSY | IC:vfreebusy | Appendix A # 3.6.4 |
+ | VTIMEZONE | IC:vtimezone | Appendix A # 3.6.5 |
+ | STANDARD | IC:standard | Appendix A # 3.6.5 |
+ | DAYLIGHT | IC:daylight | Appendix A # 3.6.5 |
+ | VALARM | IC:valarm | Appendix A # 3.6.6 |
+ +-----------+--------------+--------------------+
+
+3.4. Properties (RFC 5545, Sections 3.7 and 3.8)
+
+ iCalendar properties, whether they apply to the "VCALENDAR" object or
+ to a component, are handled in a consistent way in the xCal format.
+
+
+
+
+Daboo, et al. Standards Track [Page 6]
+
+RFC 6321 xCal August 2011
+
+
+ iCalendar properties are enclosed in the XML element IC:properties.
+
+ Each individual iCalendar property is represented in xCal by an
+ element of the same name as the iCalendar property, but in lowercase.
+ For example, the "CALSCALE" property is represented in xCal by the
+ IC:calscale element.
+
+ Example:
+
+ <?xml version="1.0" encoding="utf-8"?>
+ <icalendar xmlns="urn:ietf:params:xml:ns:icalendar-2.0">
+ <vcalendar>
+ <properties>
+ <calscale>...</calscale>
+ <version>...</version>
+ <prodid>...</prodid>
+ </properties>
+ <components>
+ ...
+ </components>
+ </vcalendar>
+ </icalendar>
+
+ Each property can contain an IC:parameters XML element encapsulating
+ any iCalendar property parameters associated with the iCalendar
+ property.
+
+ Each property will contain one or more "value" XML elements as
+ described below representing the value of the iCalendar property.
+
+ As an example, the table below shows iCalendar-to-xCal mappings for
+ current iCalendar properties. Any new iCalendar properties added in
+ the future will be converted in the same way.
+
+ +------------------+---------------------+-----------------------+
+ | Property | XML element | XML Definition |
+ +------------------+---------------------+-----------------------+
+ | CALSCALE | IC:calscale | Appendix A # 3.7.1 |
+ | METHOD | IC:method | Appendix A # 3.7.2 |
+ | PRODID | IC:prodid | Appendix A # 3.7.3 |
+ | VERSION | IC:version | Appendix A # 3.7.4 |
+ | ATTACH | IC:attach | Appendix A # 3.8.1.1 |
+ | CATEGORIES | IC:categories | Appendix A # 3.8.1.2 |
+ | CLASS | IC:class | Appendix A # 3.8.1.3 |
+ | COMMENT | IC:comment | Appendix A # 3.8.1.4 |
+ | DESCRIPTION | IC:description | Appendix A # 3.8.1.5 |
+ | GEO | IC:geo | Appendix A # 3.8.1.6 |
+ | LOCATION | IC:location | Appendix A # 3.8.1.7 |
+
+
+
+Daboo, et al. Standards Track [Page 7]
+
+RFC 6321 xCal August 2011
+
+
+ | PERCENT-COMPLETE | IC:percent-complete | Appendix A # 3.8.1.8 |
+ | PRIORITY | IC:priority | Appendix A # 3.8.1.9 |
+ | RESOURCES | IC:resources | Appendix A # 3.8.1.10 |
+ | STATUS | IC:status | Appendix A # 3.8.1.11 |
+ | SUMMARY | IC:summary | Appendix A # 3.8.1.12 |
+ | COMPLETED | IC:completed | Appendix A # 3.8.2.1 |
+ | DTEND | IC:dtend | Appendix A # 3.8.2.2 |
+ | DUE | IC:due | Appendix A # 3.8.2.3 |
+ | DTSTART | IC:dtstart | Appendix A # 3.8.2.4 |
+ | DURATION | IC:duration | Appendix A # 3.8.2.5 |
+ | FREEBUSY | IC:freebusy | Appendix A # 3.8.2.6 |
+ | TRANSP | IC:transp | Appendix A # 3.8.2.7 |
+ | TZID | IC:tzid | Appendix A # 3.8.3.1 |
+ | TZNAME | IC:tzname | Appendix A # 3.8.3.2 |
+ | TZOFFSETFROM | IC:tzoffsetfrom | Appendix A # 3.8.3.3 |
+ | TZOFFSETTO | IC:tzoffsetto | Appendix A # 3.8.3.4 |
+ | TZURL | IC:tzurl | Appendix A # 3.8.3.5 |
+ | ATTENDEE | IC:attendee | Appendix A # 3.8.4.1 |
+ | CONTACT | IC:contact | Appendix A # 3.8.4.2 |
+ | ORGANIZER | IC:organizer | Appendix A # 3.8.4.3 |
+ | RECURRENCE-ID | IC:recurrence-id | Appendix A # 3.8.4.4 |
+ | RELATED-TO | IC:related-to | Appendix A # 3.8.4.5 |
+ | URL | IC:url | Appendix A # 3.8.4.6 |
+ | UID | IC:uid | Appendix A # 3.8.4.7 |
+ | EXDATE | IC:exdate | Appendix A # 3.8.5.1 |
+ | RDATE | IC:rdate | Appendix A # 3.8.5.2 |
+ | RRULE | IC:rrule | Appendix A # 3.8.5.3 |
+ | ACTION | IC:action | Appendix A # 3.8.6.1 |
+ | REPEAT | IC:repeat | Appendix A # 3.8.6.2 |
+ | TRIGGER | IC:trigger | Appendix A # 3.8.6.3 |
+ | CREATED | IC:created | Appendix A # 3.8.7.1 |
+ | DTSTAMP | IC:dtstamp | Appendix A # 3.8.7.2 |
+ | LAST-MODIFIED | IC:last-modified | Appendix A # 3.8.7.3 |
+ | SEQUENCE | IC:sequence | Appendix A # 3.8.7.4 |
+ | REQUEST-STATUS | IC:request-status | Appendix A # 3.8.8.3 |
+ +------------------+---------------------+-----------------------+
+
+3.4.1. Special Cases for Properties
+
+ This section describes some properties that have special handling
+ when converting to xCal.
+
+3.4.1.1. Multi-Valued Properties
+
+ The following iCalendar properties can have values that consist of a
+ list of "standard" iCalendar values separated by a specific
+ delimiter. In xCal, these properties are represented by an XML
+ element that contains multiple "value" elements (Section 3.6).
+
+
+
+Daboo, et al. Standards Track [Page 8]
+
+RFC 6321 xCal August 2011
+
+
+ +------------+---------------+-----------------------+
+ | Property | XML element | XML Definition |
+ +------------+---------------+-----------------------+
+ | CATEGORIES | IC:categories | Appendix A # 3.8.1.2 |
+ | RESOURCES | IC:resources | Appendix A # 3.8.1.10 |
+ | FREEBUSY | IC:freebusy | Appendix A # 3.8.2.6 |
+ | EXDATE | IC:exdate | Appendix A # 3.8.5.1 |
+ | RDATE | IC:rdate | Appendix A # 3.8.5.2 |
+ +------------+---------------+-----------------------+
+
+3.4.1.2. GEO Property
+
+ In iCalendar, the "GEO" property value is defined as a semicolon-
+ separated list of two "FLOAT" values; the first representing latitude
+ and the second longitude.
+
+ In xCal, the value for the IC:geo element is represented by two XML
+ elements. These are an IC:latitude element and an IC:longitude
+ element, each of which contains float values. See Appendix A #
+ 3.8.1.6.
+
+ Example:
+
+ <?xml version="1.0" encoding="utf-8"?>
+ <icalendar xmlns="urn:ietf:params:xml:ns:icalendar-2.0">
+ ...
+ <geo>
+ <latitude>37.386013</latitude>
+ <longitude>-122.082932</longitude>
+ </geo>
+ ...
+ </icalendar>
+
+3.4.1.3. REQUEST-STATUS Property
+
+ In iCalendar, the "REQUEST-STATUS" property value is defined as a
+ semicolon-separated list of two or three "TEXT" values. The first
+ represents a code, the second a description, and the third any
+ additional data.
+
+ In xCal, the value for the IC:request-status element is represented
+ by two or three XML elements. These are an IC:code element, an IC:
+ description element, and an IC:data element, each of which contains
+ the corresponding "TEXT" values. If there is no additional data in
+ the iCalendar value, the IC:data element (which would be empty)
+ SHOULD NOT be present. See Appendix A # 3.8.8.3.
+
+
+
+
+
+Daboo, et al. Standards Track [Page 9]
+
+RFC 6321 xCal August 2011
+
+
+ Example:
+
+ <?xml version="1.0" encoding="utf-8"?>
+ <icalendar xmlns="urn:ietf:params:xml:ns:icalendar-2.0">
+ ...
+ <request-status>
+ <code>2.0</code>
+ <description>Success</description>
+ </request-status>
+ ...
+ </icalendar>
+
+3.5. Parameters (RFC 5545, Section 3.2)
+
+ iCalendar property parameters are enclosed in the XML element IC:
+ parameters, which occurs in each property XML element. If there are
+ no iCalendar property parameters, the IC:parameters element (which
+ would be empty) SHOULD NOT be present.
+
+ Each individual iCalendar property parameter is represented in xCal
+ by an element of the same name as the iCalendar property parameter,
+ but in lowercase. For example, the "PARTSTAT" property parameter is
+ represented in xCal by the IC:partstat element.
+
+ Example:
+
+ <?xml version="1.0" encoding="utf-8"?>
+ <icalendar xmlns="urn:ietf:params:xml:ns:icalendar-2.0">
+ <vcalendar>
+ ...
+ <components>
+ ...
+ <attendee>
+ <parameters>
+ <partstat><text>NEEDS-ACTION</text></partstat>
+ </parameters>
+ ...
+ </attendee>
+ ...
+ </components>
+ </vcalendar>
+ </icalendar>
+
+ Each XML parameter element contains one or more child XML elements
+ representing iCalendar value types.
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 10]
+
+RFC 6321 xCal August 2011
+
+
+ As an example, the table below shows iCalendar-to-xCal mappings for
+ current iCalendar parameters. Any new iCalendar parameters added in
+ the future will be converted in the same way.
+
+ +----------------+-------------------+---------------------+
+ | Parameter | XML element | XML Definition |
+ +----------------+-------------------+---------------------+
+ | ALTREP | IC:altrep | Appendix A # 3.2.1 |
+ | CN | IC:cn | Appendix A # 3.2.2 |
+ | CUTYPE | IC:cutype | Appendix A # 3.2.3 |
+ | DELEGATED-FROM | IC:delegated-from | Appendix A # 3.2.4 |
+ | DELEGATED-TO | IC:delegated-to | Appendix A # 3.2.5 |
+ | DIR | IC:dir | Appendix A # 3.2.6 |
+ | ENCODING | IC:encoding | Appendix A # 3.2.7 |
+ | FMTTYPE | IC:fmttype | Appendix A # 3.2.8 |
+ | FBTYPE | IC:fbtype | Appendix A # 3.2.9 |
+ | LANGUAGE | IC:language | Appendix A # 3.2.10 |
+ | MEMBER | IC:member | Appendix A # 3.2.11 |
+ | PARTSTAT | IC:partstat | Appendix A # 3.2.12 |
+ | RANGE | IC:range | Appendix A # 3.2.13 |
+ | RELATED | IC:related | Appendix A # 3.2.14 |
+ | RELTYPE | IC:reltype | Appendix A # 3.2.15 |
+ | ROLE | IC:role | Appendix A # 3.2.16 |
+ | RSVP | IC:rsvp | Appendix A # 3.2.17 |
+ | SENT-BY | IC:sent-by | Appendix A # 3.2.18 |
+ | TZID | IC:tzid | Appendix A # 3.2.19 |
+ +----------------+-------------------+---------------------+
+
+3.5.1. VALUE Parameter
+
+ iCalendar defines a "VALUE" property parameter (Section 3.2.20 of
+ [RFC5545]). This property parameter is not mapped to an xCal XML
+ element. Instead, the value type is handled by having different XML
+ elements for each value, and these appear inside of property
+ elements. Thus, when converting from iCalendar to xCal, any "VALUE"
+ property parameters are skipped. When converting from xCal into
+ iCalendar, the appropriate "VALUE" property parameter MUST be
+ included in the iCalendar property if the value type is not the
+ default value type for that property.
+
+3.6. Values (RFC 5545, Section 3.3)
+
+ In the typical case, iCalendar value types are mapped into XML
+ elements with a matching name in all lowercase. In the case of the
+ value for a recurrence rule (see below), iCalendar defines
+ "structured" values, and these are mapped into separate child
+ elements for each value element.
+
+
+
+
+Daboo, et al. Standards Track [Page 11]
+
+RFC 6321 xCal August 2011
+
+
+3.6.1. Binary (RFC 5545, Section 3.3.1)
+
+ Description: iCalendar "BINARY" property values are represented by
+ the IC:binary XML element. The content of the element is base64
+ encoded data, conforming to Section 4 of [RFC4648], which is the
+ base64 method used in [RFC5545]. Whitespace MAY be inserted into
+ the data at any point to "wrap" the data to reasonable line
+ lengths. When converting back to iCalendar, the whitespace MUST
+ first be removed.
+
+ XML Definition: Appendix A # 3.3.1
+
+ Example:
+
+ <binary>SGVsbG8gV29ybGQh</binary>
+
+3.6.2. Boolean (RFC 5545, Section 3.3.2)
+
+ Description: iCalendar "BOOLEAN" property values are represented by
+ the IC:boolean XML element. The content of the element is a
+ boolean value.
+
+ XML Definition: Appendix A # 3.3.2
+
+ Example:
+
+ <boolean>true</boolean>
+
+3.6.3. Calendar User Address (RFC 5545, Section 3.3.3)
+
+ Description: iCalendar "CAL-ADDRESS" property values are represented
+ by the IC:cal-address XML element. The content of the element is
+ a URI.
+
+ XML Definition: Appendix A # 3.3.3
+
+ Example:
+
+ <cal-address>mailto:cyrus@example.com</cal-address>
+
+3.6.4. Date (RFC 5545, Section 3.3.4)
+
+ Description: iCalendar "DATE" property values are represented by the
+ IC:date XML element. The content of the element is the same date
+ value specified by [RFC5545], with the exception that the date
+ components are separated by "-" characters, for consistency with
+ [W3C.REC-xmlschema-2-20041028].
+
+
+
+
+Daboo, et al. Standards Track [Page 12]
+
+RFC 6321 xCal August 2011
+
+
+ XML Definition: Appendix A # 3.3.4
+
+ Example:
+
+ <date>2011-05-17</date>
+
+3.6.5. Date-Time (RFC 5545, Section 3.3.5)
+
+ Description: iCalendar "DATE-TIME" property values are represented
+ by the IC:date-time XML element. The content of the element is
+ the same date-time value specified by [RFC5545], with the
+ exception that the date components are separated by "-"
+ characters, and the time components are separated by ":"
+ characters, for consistency with [W3C.REC-xmlschema-2-20041028].
+ Note that while [W3C.REC-xmlschema-2-20041028] allows for a UTC
+ offset to be included in date/time values, xCal does not use that,
+ and instead follows the iCalendar behavior of using time zone
+ definitions via the "TZID" property parameter.
+
+ XML Definition: Appendix A # 3.3.5
+
+ Example:
+
+ <date-time>2011-05-17T12:00:00</date-time>
+
+3.6.6. Duration (RFC 5545, Section 3.3.6)
+
+ Description: iCalendar "DURATION" property values are represented by
+ the IC:duration XML element. The content of the element is the
+ same duration value specified by [RFC5545].
+
+ XML Definition: Appendix A # 3.3.6
+
+ Example:
+
+ <duration>P1D</duration>
+
+3.6.7. Float (RFC 5545, Section 3.3.7)
+
+ Description: iCalendar "FLOAT" property values are represented by
+ the IC:float XML element. The content of the element is a text
+ representation of a floating point number.
+
+ XML Definition: Appendix A # 3.3.7
+
+ Example:
+
+ <float>0.5</float>
+
+
+
+Daboo, et al. Standards Track [Page 13]
+
+RFC 6321 xCal August 2011
+
+
+3.6.8. Integer (RFC 5545, Section 3.3.8)
+
+ Description: iCalendar "INTEGER" property values are represented by
+ the IC:integer XML element. The content of the element is a text
+ representation of an integer number.
+
+ XML Definition: Appendix A # 3.3.8
+
+ Examples:
+
+ <integer>50</integer>
+ <integer>-100</integer>
+
+3.6.9. Period of Time (RFC 5545, Section 3.3.9)
+
+ Description: iCalendar "PERIOD" property values are represented by
+ the IC:period XML element. The content of the element is child
+ elements representing the start, end, or duration components of
+ the period.
+
+ XML Definition: Appendix A # 3.3.9
+
+ Example:
+
+ <period>
+ <start>2011-05-17T12:00:00</start>
+ <duration>P1H</duration>
+ </period>
+
+3.6.10. Recurrence Rule (RFC 5545, Section 3.3.10)
+
+ Description: iCalendar "RECUR" property values are represented by
+ the IC:recur XML element. The content of the element is child
+ elements representing the various components of a recurrence rule.
+
+ XML Definition: Appendix A # 3.3.10
+
+ Example:
+
+ <recur>
+ <freq>YEARLY</freq>
+ <count>5</count>
+ <byday>-1SU</byday>
+ <bymonth>10</bymonth>
+ </recur>
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 14]
+
+RFC 6321 xCal August 2011
+
+
+3.6.11. Text (RFC 5545, Section 3.3.11)
+
+ Description: iCalendar "TEXT" property values are represented by the
+ IC:text XML element. The content of the element is simple text.
+
+ XML Definition: Appendix A # 3.3.11
+
+ Example:
+
+ <text>Hello World!</text>
+
+3.6.12. Time (RFC 5545, Section 3.3.12)
+
+ Description: iCalendar "TIME" property values are represented by the
+ IC:time XML element. The content of the element is the same time
+ value specified by [RFC5545], with the exception that the time
+ components are separated by ":" characters, for consistency with
+ [W3C.REC-xmlschema-2-20041028]. Note that while
+ [W3C.REC-xmlschema-2-20041028] allows for a UTC offset to be
+ included in date/time values, xCal does not use that, and instead
+ follows the iCalendar behavior of using time zone definitions via
+ the "TZID" property parameter.
+
+ XML Definition: Appendix A # 3.3.12
+
+ Example:
+
+ <time>12:00:00</time>
+
+3.6.13. URI (RFC 5545, Section 3.3.13)
+
+ Description: iCalendar "URI" property values are represented by the
+ IC:uri XML element. The content of the element is a URI.
+
+ XML Definition: Appendix A # 3.3.13
+
+ Example:
+
+ <uri>http://calendar.example.com</uri>
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 15]
+
+RFC 6321 xCal August 2011
+
+
+3.6.14. UTC Offset (RFC 5545, Section 3.3.14)
+
+ Description: iCalendar "UTC-OFFSET" property values are represented
+ by the IC:utc-offset XML element. The content of the element is
+ the same UTC offset value specified by [RFC5545], with the
+ exception that the hour, minute, and second components are
+ separated by a ":" character, for consistency with
+ [W3C.REC-xmlschema-2-20041028].
+
+ XML Definition: Appendix A # 3.3.14
+
+ Example:
+
+ <utc-offset>-05:00</utc-offset>
+
+3.7. Extensions
+
+ iCalendar extension properties and property parameters (those with an
+ "X-" prefix in their name) are handled in the same way as other
+ properties and property parameters: the property or property
+ parameter is represented by an XML element with the same name, but in
+ lowercase, e.g., the "X-FOO" property in iCalendar turns into the IC:
+ x-foo element in xCal. However, see Section 5 for how to deal with
+ default values for unrecognized extension properties or property
+ parameters.
+
+4. Converting from xCal into iCalendar
+
+ When converting component, property, and property parameter values,
+ the names SHOULD be converted to uppercase. Although iCalendar names
+ are case insensitive, common practice is to keep them all uppercase
+ following the actual definitions in [RFC5545].
+
+ BACKSLASH character encoding and line folding MUST be applied to the
+ resulting iCalendar data as required by [RFC5545].
+
+ Non-binary value types MUST NOT be base64 encoded.
+
+4.1. Converting XML Extensions into iCalendar
+
+ XML extensions are converted back to iCalendar in one of two ways,
+ depending on whether the extensions are in the iCalendar XML
+ namespace or in an external namespace.
+
+ Extensions that are part of the iCalendar XML namespace MUST have
+ element names that begin with "x-", and will be converted back to the
+ equivalent extension property in iCalendar. For example, the "x-foo"
+ element will convert to the "X-FOO" iCalendar property.
+
+
+
+Daboo, et al. Standards Track [Page 16]
+
+RFC 6321 xCal August 2011
+
+
+ Extensions that are in a namespace other than the iCalendar XML
+ namespace SHOULD be preserved in the iCalendar representation using
+ the "XML" iCalendar property described in Section 4.2. Only those
+ extension elements that are immediate child elements of the IC:
+ properties element are converted, any others are ignored.
+
+4.2. The XML Property for iCalendar
+
+ This section describes an extension property for iCalendar, as
+ covered in Section 8.2.3 of [RFC5545].
+
+ Property name: XML
+
+ Purpose: To embed extended XML-encoded iCalendar data in the
+ iCalendar format.
+
+ Value type: The default value type is "TEXT". The value type can
+ also be set to "BINARY" to indicate base64 encoded content.
+
+ Property parameters: IANA, non-standard, inline encoding, and value
+ data type property parameters can be specified on this property.
+
+ Conformance: The property can be specified multiple times in any
+ calendar component.
+
+ Description: The value of this property is a single XML 1.0
+ [W3C.REC-xml-20081126] element. The "XML" property MUST NOT be used
+ to contain properties that are already defined in iCalendar. Since
+ all elements in the urn:ietf:params:xml:ns:icalendar-2.0 namespace
+ convert to a well-defined iCalendar object, the elements in this
+ property MUST NOT be in the urn:ietf:params:xml:ns:icalendar-2.0
+ namespace. The XML element that is the value of this property MUST
+ have an XML namespace declaration.
+
+ The default value type for this property is "TEXT", and normal
+ BACKSLASH character encoding rules for that value MUST be applied.
+ Note that the source XML can contain characters not allowed in "TEXT"
+ property values. If this is the case, then the XML data MUST be
+ base64 encoded. As required by [RFC5545], the "ENCODING" property
+ parameter MUST be present and set to "BASE64", and the "VALUE"
+ property parameter MUST be present and set to "BINARY".
+
+ The ordering of "XML" properties is not preserved in the conversion
+ between xCal and iCalendar.
+
+ Format definition: This property is defined by the following
+ notation:
+
+
+
+
+Daboo, et al. Standards Track [Page 17]
+
+RFC 6321 xCal August 2011
+
+
+ xml = "XML" xmlparam ( ":" text ) /
+ (
+ ";" "ENCODING" "=" "BASE64"
+ ";" "VALUE" "=" "BINARY"
+ ":" binary
+ )
+ CRLF
+
+ xmlparam = *(";" other-param)
+
+ Example: The following is an example of a location embedded in KML
+ markup inside the "XML" property.
+
+ XML:<kml xmlns="http://www.opengis.net/kml/2.2">\n
+ <Document>\n
+ <name>KML Sample</name>\n
+ <open>1</open>\n
+ <description>An incomplete example of a KML docum
+ ent - used as an example!</description>\n
+ </Document>\n
+ </kml>
+
+5. Handling Unrecognized Properties or Parameters
+
+ In iCalendar, properties have a default value type specified by their
+ definition, e.g., "SUMMARY"'s value type is "TEXT" and "DURATION"'s
+ is "DURATION". When a property uses its default value type, the
+ "VALUE" property parameter does not need to be specified on the
+ property.
+
+ When new properties are defined or "X-" properties are used, an
+ iCalendar<->xCal converter might not recognize them, and know what
+ the appropriate default value types are, yet they need to be able to
+ preserve the values. A similar issue arises for unrecognized
+ property parameters. As a result, the following rules are applied
+ when dealing with unrecognized properties and property parameters:
+
+ o When converting iCalendar into xCal:
+
+ * Any property that does not include a "VALUE" property parameter
+ and whose default value type is not known MUST be converted
+ using the value type XML element IC:unknown. The content of
+ that element is the unprocessed value text.
+
+ * Any unrecognized property parameter MUST be converted using the
+ value type XML element IC:unknown, with its content set to the
+ property parameter value text, treated as if it were a "TEXT"
+ value or list of "TEXT" values.
+
+
+
+Daboo, et al. Standards Track [Page 18]
+
+RFC 6321 xCal August 2011
+
+
+ o When converting xCal into iCalendar:
+
+ * Any IC:unknown property value XML elements are converted
+ directly into iCalendar values. The containing property MUST
+ NOT have a "VALUE" property parameter.
+
+ * Any IC:unknown parameter value XML elements are converted as if
+ they were IC:text value type XML elements.
+
+ Example: The following is an example of an unrecognized iCalendar
+ property (that uses a "DATE-TIME" value as its default) and the
+ equivalent xCal representation of that property.
+
+ iCalendar:
+
+ X-PROPERTY:20110512T120000Z
+
+ xCal:
+
+ <x-property>
+ <unknown>20110512T120000Z</unknown>
+ </x-property>
+
+ Example: The following is an example of an unrecognized iCalendar
+ property parameter (that uses a "DURATION" value as its default)
+ specified on a recognized iCalendar property, and the equivalent xCal
+ representation of that property and property parameter.
+
+ iCalendar:
+
+ DTSTART;X-PARAM=PT30M:20110512T130000Z
+
+ xCal:
+
+ <dtstart>
+ <parameters>
+ <x-param><unknown>PT30M</unknown></x-param>
+ </parameters>
+ <date-time>2011-05-12T13:00:00Z</date-time>
+ </dtstart>
+
+6. Security Considerations
+
+ For security considerations specific to calendar data, see Section 7
+ of [RFC5545]. Since this specification is a mapping from iCalendar,
+ no new security concerns are introduced related to calendar data.
+
+
+
+
+
+Daboo, et al. Standards Track [Page 19]
+
+RFC 6321 xCal August 2011
+
+
+ The use of XML as a format does have security risks. Section 7 of
+ [RFC3470] discusses these risks. See also the security discussion
+ for the application/xml type in [RFC3023].
+
+7. IANA Considerations
+
+ This document defines a new URN to identify a new XML namespace for
+ iCalendar data. The URN conforms to a registry mechanism described
+ in [RFC3688].
+
+ This document defines a new media type. The registration is in
+ Section 7.2.
+
+ This document defines a new property for iCalendar. The registration
+ is in Section 7.3.
+
+7.1. Namespace Registration
+
+ Registration request for the iCalendar namespace:
+
+ URI: urn:ietf:params:xml:ns:icalendar-2.0
+
+ Registrant Contact: See the "Authors' Addresses" section of this
+ document.
+
+ XML: None. Namespace URIs do not represent an XML specification.
+
+7.2. Media Type
+
+ This section defines the MIME media type for use with iCalendar in
+ XML data.
+
+ Type name: application
+
+ Subtype name: calendar+xml
+
+ Required parameters: None
+
+ Optional parameters: method, component, and optinfo as defined for
+ the text/calendar media type in [RFC5545]; charset as defined for
+ application/xml in [RFC3023]; per [RFC3023], use of the charset
+ property parameter with the value "utf-8" is STRONGLY RECOMMENDED.
+
+ Encoding considerations: Same as encoding considerations of
+ application/xml as specified in [RFC3023].
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 20]
+
+RFC 6321 xCal August 2011
+
+
+ Security considerations: See Section 6.
+
+ Interoperability considerations: This media type provides an
+ alternative format for iCalendar data based on XML.
+
+ Published specification: This specification.
+
+ Applications that use this media type: Applications that currently
+ make use of the text/calendar media type can use this as an
+ alternative.
+
+ Additional information:
+
+ Magic number(s): None
+
+ File extension(s): xcs
+
+ Macintosh file type code(s): None specified.
+
+ Person & email address to contact for further information:
+ calsify@ietf.org
+
+ Intended usage: COMMON
+
+ Restrictions on usage: There are no restrictions on where this media
+ type can be used.
+
+ Author: See the "Authors' Addresses" section of this document.
+
+ Change controller: IETF
+
+7.3. iCalendar Property Registrations
+
+ This document defines the following new iCalendar property to be
+ added to the registry defined in Section 8.2.3 of [RFC5545]:
+
+ +----------+---------+-----------------------+
+ | Property | Status | Reference |
+ +----------+---------+-----------------------+
+ | XML | Current | RFC 6321, Section 4.2 |
+ +----------+---------+-----------------------+
+
+
+
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 21]
+
+RFC 6321 xCal August 2011
+
+
+8. Acknowledgments
+
+ The authors would like to thank the following for their valuable
+ contributions: Toby Considine, Bernard Desruisseaux, Keith Moore,
+ Filip Navara, Simon Perreault, Arnaud Quillaud, Peter Saint-Andre,
+ and Dave Thewlis. This specification originated from the work of the
+ XML technical committee of the Calendaring and Scheduling Consortium.
+
+9. References
+
+9.1. Normative References
+
+ [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
+ Requirement Levels", BCP 14, RFC 2119, March 1997.
+
+ [RFC3023] Murata, M., St. Laurent, S., and D. Kohn, "XML Media
+ Types", RFC 3023, January 2001.
+
+ [RFC3470] Hollenbeck, S., Rose, M., and L. Masinter, "Guidelines for
+ the Use of Extensible Markup Language (XML)
+ within IETF Protocols", BCP 70, RFC 3470, January 2003.
+
+ [RFC3688] Mealling, M., "The IETF XML Registry", BCP 81, RFC 3688,
+ January 2004.
+
+ [RFC4648] Josefsson, S., "The Base16, Base32, and Base64 Data
+ Encodings", RFC 4648, October 2006.
+
+ [RFC5545] Desruisseaux, B., "Internet Calendaring and Scheduling
+ Core Object Specification (iCalendar)", RFC 5545,
+ September 2009.
+
+ [W3C.REC-xml-20081126]
+ Sperberg-McQueen, C., Yergeau, F., Bray, T., Paoli, J.,
+ and E. Maler, "Extensible Markup Language (XML) 1.0 (Fifth
+ Edition)", World Wide Web Consortium Recommendation REC-
+ xml-20081126, November 2008,
+ <http://www.w3.org/TR/2008/REC-xml-20081126>.
+
+9.2. Informative References
+
+ [W3C.REC-xmlschema-2-20041028]
+ Malhotra, A. and P. Biron, "XML Schema Part 2: Datatypes
+ Second Edition", World Wide Web Consortium
+ Recommendation REC-xmlschema-2-20041028, October 2004,
+ <http://www.w3.org/TR/2004/REC-xmlschema-2-20041028>.
+
+
+
+
+
+Daboo, et al. Standards Track [Page 22]
+
+RFC 6321 xCal August 2011
+
+
+Appendix A. RELAX NG Schema
+
+ Below is a RELAX NG schema for iCalendar in XML. The schema is non-
+ normative and given for reference only.
+
+ This schema uses the compact notation of RELAX NG. The numeric
+ section numbers given in the comments refer to sections in [RFC5545].
+ The ordering of elements follows the section ordering of [RFC5545].
+
+ The RELAX NG compact notation "?" operator is used to indicate an
+ unordered list of items. However, that operator, as defined, allows
+ "mixing" each element that it operates on at any depth within the
+ other elements, rather than just allowing "mixing" of siblings only.
+ As a result, the schema provided allows certain constructs that are
+ not allowed in iCalendar. Given that there is no sibling-only
+ unordered list operator in RELAX NG, this is the best representation
+ that can be given.
+
+ Patterns for date/time, duration, and UTC offset values are given
+ because those differ from the values used in iCalendar. More
+ restrictive schema with patterns and numerical limits could be
+ derived from the example schema here if more comprehensive schema
+ validation is required.
+
+ # RELAX NG Schema for iCalendar in XML
+
+ default namespace = "urn:ietf:params:xml:ns:icalendar-2.0"
+
+ # 3.2 Property Parameters
+
+ # 3.2.1 Alternate Text Representation
+
+ altrepparam = element altrep {
+ value-uri
+ }
+
+ # 3.2.2 Common Name
+
+ cnparam = element cn {
+ value-text
+ }
+
+
+
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 23]
+
+RFC 6321 xCal August 2011
+
+
+ # 3.2.3 Calendar User Type
+
+ cutypeparam = element cutype {
+ element text {
+ "INDIVIDUAL" |
+ "GROUP" |
+ "RESOURCE" |
+ "ROOM" |
+ "UNKNOWN"
+ }
+ }
+
+ # 3.2.4 Delegators
+
+ delfromparam = element delegated-from {
+ value-cal-address+
+ }
+
+ # 3.2.5 Delegatees
+
+ deltoparam = element delegated-to {
+ value-cal-address+
+ }
+
+ # 3.2.6 Directory Entry Reference
+
+ dirparam = element dir {
+ value-uri
+ }
+
+ # 3.2.7 Inline Encoding
+
+ encodingparam = element encoding {
+ element text {
+ "8BIT" |
+ "BASE64"
+ }
+ }
+
+ # 3.2.8 Format Type
+
+ fmttypeparam = element fmttype {
+ value-text
+ }
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 24]
+
+RFC 6321 xCal August 2011
+
+
+ # 3.2.9 Free/Busy Time Type
+
+ fbtypeparam = element fbtype {
+ element text {
+ "FREE" |
+ "BUSY" |
+ "BUSY-UNAVAILABLE" |
+ "BUSY-TENTATIVE"
+ }
+ }
+
+ # 3.2.10 Language
+
+ languageparam = element language {
+ value-text
+ }
+
+ # 3.2.11 Group or List Membership
+
+ memberparam = element member {
+ value-cal-address+
+ }
+
+ # 3.2.12 Participation Status
+
+ partstatparam = element partstat {
+ type-partstat-event |
+ type-partstat-todo |
+ type-partstat-jour
+ }
+
+ type-partstat-event = (
+ element text {
+ "NEEDS-ACTION" |
+ "ACCEPTED" |
+ "DECLINED" |
+ "TENTATIVE" |
+ "DELEGATED"
+ }
+ )
+
+
+
+
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 25]
+
+RFC 6321 xCal August 2011
+
+
+ type-partstat-todo = (
+ element text {
+ "NEEDS-ACTION" |
+ "ACCEPTED" |
+ "DECLINED" |
+ "TENTATIVE" |
+ "DELEGATED" |
+ "COMPLETED" |
+ "IN-PROCESS"
+ }
+ )
+
+ type-partstat-jour = (
+ element text {
+ "NEEDS-ACTION" |
+ "ACCEPTED" |
+ "DECLINED"
+ }
+ )
+
+ # 3.2.13 Recurrence Identifier Range
+
+ rangeparam = element range {
+ element text {
+ "THISANDFUTURE"
+ }
+ }
+
+ # 3.2.14 Alarm Trigger Relationship
+
+ trigrelparam = element related {
+ element text {
+ "START" |
+ "END"
+ }
+ }
+
+ # 3.2.15 Relationship Type
+
+ reltypeparam = element reltype {
+ element text {
+ "PARENT" |
+ "CHILD" |
+ "SIBLING"
+ }
+ }
+
+
+
+
+
+Daboo, et al. Standards Track [Page 26]
+
+RFC 6321 xCal August 2011
+
+
+ # 3.2.16 Participation Role
+
+ roleparam = element role {
+ element text {
+ "CHAIR" |
+ "REQ-PARTICIPANT" |
+ "OPT-PARTICIPANT" |
+ "NON-PARTICIPANT"
+ }
+ }
+
+ # 3.2.17 RSVP Expectation
+
+ rsvpparam = element rsvp {
+ value-boolean
+ }
+
+ # 3.2.18 Sent By
+
+ sentbyparam = element sent-by {
+ value-cal-address
+ }
+
+ # 3.2.19 Time Zone Identifier
+
+ tzidparam = element tzid {
+ value-text
+ }
+
+ # 3.3 Property Value Data Types
+
+ # 3.3.1 BINARY
+
+ value-binary = element binary {
+ xsd:string
+ }
+
+ # 3.3.2 BOOLEAN
+
+ value-boolean = element boolean {
+ xsd:boolean
+ }
+
+ # 3.3.3 CAL-ADDRESS
+
+ value-cal-address = element cal-address {
+ xsd:anyURI
+ }
+
+
+
+Daboo, et al. Standards Track [Page 27]
+
+RFC 6321 xCal August 2011
+
+
+ # 3.3.4 DATE
+
+ pattern-date = xsd:string {
+ pattern = "\d\d\d\d-\d\d-\d\d"
+ }
+
+ value-date = element date {
+ pattern-date
+ }
+
+ # 3.3.5 DATE-TIME
+
+ pattern-date-time = xsd:string {
+ pattern = "\d\d\d\d-\d\d-\d\dT\d\d:\d\d:\d\dZ?"
+ }
+
+ value-date-time = element date-time {
+ pattern-date-time
+ }
+
+ # 3.3.6 DURATION
+
+ pattern-duration = xsd:string {
+ pattern = "(+|-)?P(\d+W)|(\d+D)?"
+ ~ "(T(\d+H(\d+M)?(\d+S)?)|"
+ ~ "(\d+M(\d+S)?)|"
+ ~ "(\d+S))?"
+ }
+
+ value-duration = element duration {
+ pattern-duration
+ }
+
+ # 3.3.7 FLOAT
+
+ value-float = element float {
+ xsd:float
+ }
+
+ # 3.3.8 INTEGER
+
+ value-integer = element integer {
+ xsd:integer
+ }
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 28]
+
+RFC 6321 xCal August 2011
+
+
+ # 3.3.9 PERIOD
+
+ value-period = element period {
+ element start {
+ pattern-date-time
+ },
+ (
+ element end {
+ pattern-date-time
+ } |
+ element duration {
+ pattern-duration
+ }
+ )
+ }
+
+ # 3.3.10 RECUR
+
+ value-recur = element recur {
+ type-freq,
+ (type-until | type-count)?,
+ element interval {
+ xsd:positiveInteger
+ }?,
+ type-bysecond*,
+ type-byminute*,
+ type-byhour*,
+ type-byday*,
+ type-bymonthday*,
+ type-byyearday*,
+ type-byweekno*,
+ type-bymonth*,
+ type-bysetpos*,
+ element wkst { type-weekday }?
+ }
+
+ type-freq = element freq {
+ "SECONDLY" |
+ "MINUTELY" |
+ "HOURLY" |
+ "DAILY" |
+ "WEEKLY" |
+ "MONTHLY" |
+ "YEARLY"
+ }
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 29]
+
+RFC 6321 xCal August 2011
+
+
+ type-until = element until {
+ type-date |
+ type-date-time
+ }
+
+ type-count = element count {
+ xsd:positiveInteger
+ }
+
+ type-bysecond = element bysecond {
+ xsd:positiveInteger
+ }
+
+ type-byminute = element byminute {
+ xsd:positiveInteger
+ }
+
+ type-byhour = element byhour {
+ xsd:positiveInteger
+ }
+
+ type-weekday = (
+ "SU" |
+ "MO" |
+ "TU" |
+ "WE" |
+ "TH" |
+ "FR" |
+ "SA"
+ )
+
+ type-byday = element byday {
+ xsd:integer?,
+ type-weekday
+ }
+
+ type-bymonthday = element bymonthday {
+ xsd:integer
+ }
+
+ type-byyearday = element byyearday {
+ xsd:integer
+ }
+
+ type-byweekno = element byweekno {
+ xsd:integer
+ }
+
+
+
+
+Daboo, et al. Standards Track [Page 30]
+
+RFC 6321 xCal August 2011
+
+
+ type-bymonth = element bymonth {
+ xsd:positiveInteger
+ }
+
+ type-bysetpos = element bysetpos {
+ xsd:integer
+ }
+
+ # 3.3.11 TEXT
+
+ value-text = element text {
+ xsd:string
+ }
+
+ # 3.3.12 TIME
+
+ pattern-time = xsd:string {
+ pattern = "\d\d:\d\d:\d\dZ?"
+ }
+
+ value-time = element time {
+ pattern-time
+ }
+
+ # 3.3.13 URI
+
+ value-uri = element uri {
+ xsd:anyURI
+ }
+
+ # 3.3.14 UTC-OFFSET
+
+ value-utc-offset = element utc-offset {
+ xsd:string { pattern = "(+|-)\d\d:\d\d(:\d\d)?" }
+ }
+
+ # UNKNOWN
+
+ value-unknown = element unknown {
+ xsd:string
+ }
+
+ # 3.4 iCalendar Stream
+
+ start = element icalendar {
+ vcalendar+
+ }
+
+
+
+
+Daboo, et al. Standards Track [Page 31]
+
+RFC 6321 xCal August 2011
+
+
+ # 3.6 Calendar Components
+
+ vcalendar = element vcalendar {
+ type-calprops,
+ type-component
+ }
+
+ type-calprops = element properties {
+ property-prodid &
+ property-version &
+ property-calscale? &
+ property-method?
+ }
+
+ type-component = element components {
+ (
+ component-vevent |
+ component-vtodo |
+ component-vjournal |
+ component-vfreebusy |
+ component-vtimezone
+ )*
+ }
+
+ # 3.6.1 Event Component
+
+ component-vevent = element vevent {
+ type-eventprop,
+ element components {
+ component-valarm+
+ }?
+ }
+
+ type-eventprop = element properties {
+ property-dtstamp &
+ property-dtstart &
+ property-uid &
+
+ property-class? &
+ property-created? &
+ property-description? &
+ property-geo? &
+ property-last-mod? &
+ property-location? &
+ property-organizer? &
+ property-priority? &
+ property-seq? &
+ property-status-event? &
+
+
+
+Daboo, et al. Standards Track [Page 32]
+
+RFC 6321 xCal August 2011
+
+
+ property-summary? &
+ property-transp? &
+ property-url? &
+ property-recurid? &
+
+ property-rrule? &
+
+ (property-dtend | property-duration)? &
+
+ property-attach* &
+ property-attendee* &
+ property-categories* &
+ property-comment* &
+ property-contact* &
+ property-exdate* &
+ property-rstatus* &
+ property-related* &
+ property-resources* &
+ property-rdate*
+ }
+
+ # 3.6.2 To-do Component
+
+ component-vtodo = element vtodo {
+ type-todoprop,
+ element components {
+ component-valarm+
+ }?
+ }
+
+ type-todoprop = element properties {
+ property-dtstamp &
+ property-uid &
+
+ property-class? &
+ property-completed? &
+ property-created? &
+ property-description? &
+ property-geo? &
+ property-last-mod? &
+ property-location? &
+ property-organizer? &
+ property-percent? &
+ property-priority? &
+ property-recurid? &
+ property-seq? &
+ property-status-todo? &
+ property-summary? &
+
+
+
+Daboo, et al. Standards Track [Page 33]
+
+RFC 6321 xCal August 2011
+
+
+ property-url? &
+
+ property-rrule? &
+
+ (
+ (property-dtstart?, property-dtend? ) |
+ (property-dtstart, property-duration)?
+ ) &
+
+ property-attach* &
+ property-attendee* &
+ property-categories* &
+ property-comment* &
+ property-contact* &
+ property-exdate* &
+ property-rstatus* &
+ property-related* &
+ property-resources* &
+ property-rdate*
+ }
+
+ # 3.6.3 Journal Component
+
+ component-vjournal = element vjournal {
+ type-jourprop
+ }
+
+ type-jourprop = element properties {
+ property-dtstamp &
+ property-uid &
+
+ property-class? &
+ property-created? &
+ property-dtstart? &
+ property-last-mod? &
+ property-organizer? &
+ property-recurid? &
+ property-seq? &
+ property-status-jour? &
+ property-summary? &
+ property-url? &
+
+ property-rrule? &
+
+ property-attach* &
+ property-attendee* &
+ property-categories* &
+ property-comment* &
+
+
+
+Daboo, et al. Standards Track [Page 34]
+
+RFC 6321 xCal August 2011
+
+
+ property-contact* &
+ property-description? &
+ property-exdate* &
+ property-related* &
+ property-rdate* &
+ property-rstatus*
+ }
+
+ # 3.6.4 Free/Busy Component
+
+ component-vfreebusy = element vfreebusy {
+ type-fbprop
+ }
+
+ type-fbprop = element properties {
+ property-dtstamp &
+ property-uid &
+
+ property-contact? &
+ property-dtstart? &
+ property-dtend? &
+ property-duration? &
+ property-organizer? &
+ property-url? &
+
+ property-attendee* &
+ property-comment* &
+ property-freebusy* &
+ property-rstatus*
+ }
+
+ # 3.6.5 Time Zone Component
+
+ component-vtimezone = element vtimezone {
+ element properties {
+ property-tzid &
+
+ property-last-mod? &
+ property-tzuurl?
+ },
+ element components {
+ (component-standard | component-daylight) &
+ component-standard* &
+ component-daylight*
+ }
+ }
+
+
+
+
+
+Daboo, et al. Standards Track [Page 35]
+
+RFC 6321 xCal August 2011
+
+
+ component-standard = element standard {
+ type-tzprop
+ }
+
+ component-daylight = element daylight {
+ type-tzprop
+ }
+
+ type-tzprop = element properties {
+ property-dtstart &
+ property-tzoffsetto &
+ property-tzoffsetfrom &
+
+ property-rrule? &
+
+ property-comment* &
+ property-rdate* &
+ property-tzname*
+ }
+
+ # 3.6.6 Alarm Component
+
+ component-valarm = element valarm {
+ audioprop | dispprop | emailprop
+ }
+
+ type-audioprop = element properties {
+ property-action &
+
+ property-trigger &
+
+ (property-duration, property-repeat)? &
+
+ property-attach?
+ }
+
+ type-dispprop = element properties {
+ property-action &
+ property-description &
+ property-trigger &
+ property-summary &
+
+ property-attendee+ &
+
+ (property-duration, property-repeat)? &
+
+ property-attach*
+ }
+
+
+
+Daboo, et al. Standards Track [Page 36]
+
+RFC 6321 xCal August 2011
+
+
+ type-emailprop = element properties {
+ property-action &
+ property-description &
+ property-trigger &
+
+ (property-duration, property-repeat)?
+ }
+
+ # 3.7 Calendar Properties
+
+ # 3.7.1 Calendar Scale
+
+ property-calscale = element calscale {
+
+ element parameters { empty }?,
+
+ element text { "GREGORIAN" }
+ }
+
+ # 3.7.2 Method
+
+ property-method = element method {
+
+ element parameters { empty }?,
+
+ value-text
+ }
+
+ # 3.7.3 Product Identifier
+
+ property-prodid = element prodid {
+
+ element parameters { empty }?,
+
+ value-text
+ }
+
+ # 3.7.4 Version
+
+ property-version = element version {
+
+ element parameters { empty }?,
+
+ element text { "2.0" }
+ }
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 37]
+
+RFC 6321 xCal August 2011
+
+
+ # 3.8 Component Properties
+
+ # 3.8.1 Descriptive Component Properties
+
+ # 3.8.1.1 Attachment
+
+ property-attach = element attach {
+
+ element parameters {
+ fmttypeparam? &
+ encodingparam?
+ }?,
+
+ value-uri | value-binary
+ }
+
+ # 3.8.1.2 Categories
+
+ property-categories = element categories {
+
+ element parameters {
+ languageparam? &
+ }?,
+
+ value-text+
+ }
+
+ # 3.8.1.3 Classification
+
+ property-class = element class {
+
+ element parameters { empty }?,
+
+ element text {
+ "PUBLIC" |
+ "PRIVATE" |
+ "CONFIDENTIAL"
+ }
+ }
+
+ # 3.8.1.4 Comment
+
+ property-comment = element comment {
+
+ element parameters {
+ altrepparam? &
+ languageparam?
+ }?,
+
+
+
+Daboo, et al. Standards Track [Page 38]
+
+RFC 6321 xCal August 2011
+
+
+ value-text
+ }
+
+ # 3.8.1.5 Description
+
+ property-description = element description {
+
+ element parameters {
+ altrepparam? &
+ languageparam?
+ }?,
+
+ value-text
+ }
+
+ # 3.8.1.6 Geographic Position
+
+ property-geo = element geo {
+
+ element parameters { empty }?,
+
+ element latitude { xsd:float },
+ element longitude { xsd:float }
+ }
+
+ # 3.8.1.7 Location
+
+ property-location = element location {
+
+ element parameters {
+
+ altrepparam? &
+ languageparam?
+ }?,
+
+ value-text
+ }
+
+ # 3.8.1.8 Percent Complete
+
+ property-percent = element percent-complete {
+
+ element parameters { empty }?,
+
+ value-integer
+ }
+
+
+
+
+
+Daboo, et al. Standards Track [Page 39]
+
+RFC 6321 xCal August 2011
+
+
+ # 3.8.1.9 Priority
+
+ property-priority = element priority {
+
+ element parameters { empty }?,
+
+ value-integer
+ }
+
+ # 3.8.1.10 Resources
+
+ property-resources = element resources {
+
+ element parameters {
+ altrepparam? &
+ languageparam?
+ }?,
+
+ value-text+
+ }
+
+ # 3.8.1.11 Status
+
+ property-status-event = element status {
+
+ element parameters { empty }?,
+
+ element text {
+ "TENTATIVE" |
+ "CONFIRMED" |
+ "CANCELLED"
+ }
+ }
+
+ property-status-todo = element status {
+
+ element parameters { empty }?,
+
+ element text {
+ "NEEDS-ACTION" |
+ "COMPLETED" |
+ "IN-PROCESS" |
+ "CANCELLED"
+ }
+ }
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 40]
+
+RFC 6321 xCal August 2011
+
+
+ property-status-jour = element status {
+
+ element parameters { empty }?,
+
+ element text {
+ "DRAFT" |
+ "FINAL" |
+ "CANCELLED"
+ }
+ }
+
+ # 3.8.1.12 Summary
+
+ property-summary = element summary {
+
+ element parameters {
+ altrepparam? &
+ languageparam?
+ }?,
+
+ value-text
+ }
+
+ # 3.8.2 Date and Time Component Properties
+
+ # 3.8.2.1 Date/Time Completed
+
+ property-completed = element completed {
+
+ element parameters { empty }?,
+
+ value-date-time
+ }
+
+ # 3.8.2.2 Date/Time End
+
+ property-dtend = element dtend {
+
+ element parameters {
+ tzidparam?
+ }?,
+
+ value-date-time |
+ value-date
+ }
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 41]
+
+RFC 6321 xCal August 2011
+
+
+ # 3.8.2.3 Date/Time Due
+
+ property-due = element due {
+
+ element parameters {
+ tzidparam?
+ }?,
+
+ value-date-time |
+ value-date
+ }
+
+ # 3.8.2.4 Date/Time Start
+
+ property-dtstart = element dtstart {
+
+ element parameters {
+ tzidparam?
+ }?,
+
+ value-date-time |
+ value-date
+ }
+
+ # 3.8.2.5 Duration
+
+ property-duration = element duration {
+
+ element parameters { empty }?,
+
+ value-duration
+ }
+
+ # 3.8.2.6 Free/Busy Time
+
+ property-freebusy = element freebusy {
+
+ element parameters {
+ fbtypeparam?
+ }?,
+
+
+ value-period+
+ }
+
+ # 3.8.2.7 Time Transparency
+
+ property-transp = element transp {
+
+
+
+Daboo, et al. Standards Track [Page 42]
+
+RFC 6321 xCal August 2011
+
+
+ element parameters { empty }?,
+
+ element text {
+ "OPAQUE" |
+ "TRANSPARENT"
+ }
+ }
+
+ # 3.8.3 Time Zone Component Properties
+
+ # 3.8.3.1 Time Zone Identifier
+
+ property-tzid = element tzid {
+
+ element parameters { empty }?,
+
+ value-text
+ }
+
+ # 3.8.3.2 Time Zone Name
+
+ property-tzname = element tzname {
+
+ element parameters {
+ languageparam?
+ }?,
+
+ value-text
+ }
+
+ # 3.8.3.3 Time Zone Offset From
+
+ property-tzoffsetfrom = element tzoffsetfrom {
+
+ element parameters { empty }?,
+
+ value-utc-offset
+ }
+
+ # 3.8.3.4 Time Zone Offset To
+
+ property-tzoffsetto = element tzoffsetto {
+
+ element parameters { empty }?,
+
+ value-utc-offset
+ }
+
+
+
+
+Daboo, et al. Standards Track [Page 43]
+
+RFC 6321 xCal August 2011
+
+
+ # 3.8.3.5 Time Zone URL
+
+ property-tzurl = element tzurl {
+
+ element parameters { empty }?,
+
+ value-uri
+ }
+
+ # 3.8.4 Relationship Component Properties
+
+ # 3.8.4.1 Attendee
+
+ property-attendee = element attendee {
+
+ element parameters {
+ cutypeparam? &
+ memberparam? &
+ roleparam? &
+ partstatparam? &
+ rsvpparam? &
+ deltoparam? &
+ delfromparam? &
+ sentbyparam? &
+ cnparam? &
+ dirparam? &
+ languageparam?
+ }?,
+
+ value-cal-address
+ }
+
+ # 3.8.4.2 Contact
+
+ property-contact = element contact {
+
+ element parameters {
+ altrepparam? &
+ languageparam?
+ }?,
+
+ value-text
+ }
+
+ # 3.8.4.3 Organizer
+
+ property-organizer = element organizer {
+
+
+
+
+Daboo, et al. Standards Track [Page 44]
+
+RFC 6321 xCal August 2011
+
+
+ element parameters {
+ cnparam? &
+ dirparam? &
+ sentbyparam? &
+ languageparam?
+ }?,
+
+ value-cal-address
+ }
+
+ # 3.8.4.4 Recurrence ID
+
+ property-recurid = element recurrence-id {
+
+ element parameters {
+ tzidparam? &
+ rangeparam?
+ }?,
+
+ value-date-time |
+ value-date
+ }
+
+ # 3.8.4.5 Related-To
+
+ property-related = element related-to {
+
+ element parameters {
+ reltypeparam?
+ }?,
+
+ value-text
+ }
+
+ # 3.8.4.6 Uniform Resource Locator
+
+ property-url = element url {
+
+ element parameters { empty }?,
+
+ value-uri
+ }
+
+ # 3.8.4.7 Unique Identifier
+
+ property-uid = element uid {
+
+ element parameters { empty }?,
+
+
+
+Daboo, et al. Standards Track [Page 45]
+
+RFC 6321 xCal August 2011
+
+
+ value-text
+ }
+
+ # 3.8.5 Recurrence Component Properties
+
+ # 3.8.5.1 Exception Date/Times
+
+ property-exdate = element exdate {
+
+ element parameters {
+ tzidparam?
+ }?,
+
+ value-date-time+ |
+ value-date+
+ }
+
+ # 3.8.5.2 Recurrence Date/Times
+
+ property-rdate = element rdate {
+
+ element parameters {
+ tzidparam?
+ }?,
+
+ value-date-time+ |
+ value-date+ |
+ value-period+
+ }
+
+ # 3.8.5.3 Recurrence Rule
+
+ property-rrule = element rrule {
+
+ element parameters { empty }?,
+
+ value-recur
+ }
+
+ # 3.8.6 Alarm Component Properties
+
+ # 3.8.6.1 Action
+
+ property-action = element action {
+
+ element parameters { empty }?,
+
+
+
+
+
+Daboo, et al. Standards Track [Page 46]
+
+RFC 6321 xCal August 2011
+
+
+ element text {
+ "AUDIO" |
+ "DISPLAY" |
+ "EMAIL"
+ }
+ }
+
+ # 3.8.6.2 Repeat Count
+
+ property-repeat = element repeat {
+
+ element parameters { empty }?,
+
+ value-integer
+ }
+
+ # 3.8.6.3 Trigger
+
+ property-trigger = element trigger {
+
+ (
+ element parameters {
+ trigrelparam?
+ }?,
+
+ value-duration
+ ) |
+ (
+ element parameters { empty }?,
+
+ value-date-time
+ )
+ }
+
+ # 3.8.7 Change Management Component Properties
+
+ # 3.8.7.1 Date/Time Created
+
+ property-created = element created {
+
+ element parameters { empty }?,
+
+ value-date-time
+ }
+
+ # 3.8.7.2 Date/Time Stamp
+
+ property-dtstamp = element dtstamp {
+
+
+
+Daboo, et al. Standards Track [Page 47]
+
+RFC 6321 xCal August 2011
+
+
+ element parameters { empty }?,
+
+ value-date-time
+ }
+
+ # 3.8.7.3 Last Modified
+
+ property-last-mod = element last-modified {
+
+ element parameters { empty }?,
+
+ value-date-time
+ }
+
+ # 3.8.7.4 Sequence Number
+
+ property-seq = element sequence {
+
+ element parameters { empty }?,
+
+ value-integer
+ }
+
+ # 3.8.8 Miscellaneous Component Properties
+
+ # 3.8.8.3 Request Status
+
+ property-rstatus = element request-status {
+
+ element parameters {
+ languageparam?
+ }?,
+
+ element code { xsd:string },
+ element description { xsd:string },
+ element data { xsd:string }?
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 48]
+
+RFC 6321 xCal August 2011
+
+
+Appendix B. Examples
+
+ This section contains two examples of iCalendar objects with their
+ xCal representation.
+
+B.1. Example 1
+
+B.1.1. iCalendar Data
+
+ BEGIN:VCALENDAR
+ CALSCALE:GREGORIAN
+ PRODID:-//Example Inc.//Example Calendar//EN
+ VERSION:2.0
+ BEGIN:VEVENT
+ DTSTAMP:20080205T191224Z
+ DTSTART:20081006
+ SUMMARY:Planning meeting
+ UID:4088E990AD89CB3DBB484909
+ END:VEVENT
+ END:VCALENDAR
+
+B.1.2. XML Data
+
+ <?xml version="1.0" encoding="utf-8"?>
+ <icalendar xmlns="urn:ietf:params:xml:ns:icalendar-2.0">
+ <vcalendar>
+ <properties>
+ <calscale>
+ <text>GREGORIAN</text>
+ </calscale>
+ <prodid>
+ <text>-//Example Inc.//Example Calendar//EN</text>
+ </prodid>
+ <version>
+ <text>2.0</text>
+ </version>
+ </properties>
+ <components>
+ <vevent>
+ <properties>
+ <dtstamp>
+ <date-time>2008-02-05T19:12:24Z</date-time>
+ </dtstamp>
+ <dtstart>
+ <date>2008-10-06</date>
+ </dtstart>
+ <summary>
+ <text>Planning meeting</text>
+
+
+
+Daboo, et al. Standards Track [Page 49]
+
+RFC 6321 xCal August 2011
+
+
+ </summary>
+ <uid>
+ <text>4088E990AD89CB3DBB484909</text>
+ </uid>
+ </properties>
+ </vevent>
+ </components>
+ </vcalendar>
+ </icalendar>
+
+B.2. Example 2
+
+B.2.1. iCalendar Data
+
+ VERSION:2.0
+ PRODID:-//Example Corp.//Example Client//EN
+ BEGIN:VTIMEZONE
+ LAST-MODIFIED:20040110T032845Z
+ TZID:US/Eastern
+ BEGIN:DAYLIGHT
+ DTSTART:20000404T020000
+ RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+ TZNAME:EDT
+ TZOFFSETFROM:-0500
+ TZOFFSETTO:-0400
+ END:DAYLIGHT
+ BEGIN:STANDARD
+ DTSTART:20001026T020000
+ RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+ TZNAME:EST
+ TZOFFSETFROM:-0400
+ TZOFFSETTO:-0500
+ END:STANDARD
+ END:VTIMEZONE
+ BEGIN:VEVENT
+ DTSTAMP:20060206T001121Z
+ DTSTART;TZID=US/Eastern:20060102T120000
+ DURATION:PT1H
+ RRULE:FREQ=DAILY;COUNT=5
+ RDATE;TZID=US/Eastern;VALUE=PERIOD:20060102T150000/PT2H
+ SUMMARY:Event #2
+ DESCRIPTION:We are having a meeting all this week at 12 pm fo
+ r one hour\, with an additional meeting on the first day 2 h
+ ours long.\nPlease bring your own lunch for the 12 pm meetin
+ gs.
+ UID:00959BC664CA650E933C892C@example.com
+ END:VEVENT
+ BEGIN:VEVENT
+
+
+
+Daboo, et al. Standards Track [Page 50]
+
+RFC 6321 xCal August 2011
+
+
+ DTSTAMP:20060206T001121Z
+ DTSTART;TZID=US/Eastern:20060104T140000
+ DURATION:PT1H
+ RECURRENCE-ID;TZID=US/Eastern:20060104T120000
+ SUMMARY:Event #2 bis
+ UID:00959BC664CA650E933C892C@example.com
+ END:VEVENT
+ END:VCALENDAR
+
+B.2.2. XML Data
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <icalendar xmlns="urn:ietf:params:xml:ns:icalendar-2.0">
+ <vcalendar>
+ <properties>
+ <prodid>
+ <text>-//Example Inc.//Example Client//EN</text>
+ </prodid>
+ <version>
+ <text>2.0</text>
+ </version>
+ </properties>
+ <components>
+ <vtimezone>
+ <properties>
+ <last-modified>
+ <date-time>2004-01-10T03:28:45Z</date-time>
+ </last-modified>
+ <tzid>US/Eastern</tzid>
+ </properties>
+ <components>
+ <daylight>
+ <properties>
+ <dtstart>
+ <date-time>2000-04-04T02:00:00</date-time>
+ </dtstart>
+ <rrule>
+ <recur>
+ <freq>YEARLY</freq>
+ <byday>1SU</byday>
+ <bymonth>4</bymonth>
+ </recur>
+ </rrule>
+ <tzname>
+ <text>EDT</text>
+ </tzname>
+ <tzoffsetfrom>
+ <utc-offset>-05:00</utc-offset>
+
+
+
+Daboo, et al. Standards Track [Page 51]
+
+RFC 6321 xCal August 2011
+
+
+ </tzoffsetfrom>
+ <tzoffsetto>
+ <utc-offset>-04:00</utc-offset>
+ </tzoffsetto>
+ </properties>
+ </daylight>
+ <standard>
+ <properties>
+ <dtstart>
+ <date-time>2000-10-26T02:00:00</date-time>
+ </dtstart>
+ <rrule>
+ <recur>
+ <freq>YEARLY</freq>
+ <byday>-1SU</byday>
+ <bymonth>10</bymonth>
+ </recur>
+ </rrule>
+ <tzname>
+ <text>EST</text>
+ </tzname>
+ <tzoffsetfrom>
+ <utc-offset>-04:00</utc-offset>
+ </tzoffsetfrom>
+ <tzoffsetto>
+ <utc-offset>-05:00</utc-offset>
+ </tzoffsetto>
+ </properties>
+ </standard>
+ </components>
+ </vtimezone>
+ <vevent>
+ <properties>
+ <dtstamp>
+ <date-time>2006-02-06T00:11:21Z</date-time>
+ </dtstamp>
+ <dtstart>
+ <parameters>
+ <tzid><text>US/Eastern</text></tzid>
+ </parameters>
+ <date-time>2006-01-02T12:00:00</date-time>
+ </dtstart>
+ <duration>
+ <duration>PT1H</duration>
+ </duration>
+ <rrule>
+ <recur>
+ <freq>DAILY</freq>
+
+
+
+Daboo, et al. Standards Track [Page 52]
+
+RFC 6321 xCal August 2011
+
+
+ <count>5</count>
+ </recur>
+ </rrule>
+ <rdate>
+ <parameters>
+ <tzid><text>US/Eastern</text></tzid>
+ </parameters>
+ <period>
+ <start>2006-01-02T15:00:00</start>
+ <duration>PT2H</duration>
+ </period>
+ </rdate>
+ <summary>
+ <text>Event #2</text>
+ </summary>
+ <description>
+ <text>We are having a meeting all this week at 12
+ pm for one hour, with an additional meeting on the first day
+ 2 hours long.&#x0a;Please bring your own lunch for the 12 pm
+ meetings.</text>
+ </description>
+ <uid>
+ <text>00959BC664CA650E933C892C@example.com</text>
+ </uid>
+ </properties>
+ </vevent>
+ <vevent>
+ <properties>
+ <dtstamp>
+ <date-time>2006-02-06T00:11:21Z</date-time>
+ </dtstamp>
+ <dtstart>
+ <parameters>
+ <tzid><text>US/Eastern</text></tzid>
+ </parameters>
+ <date-time>2006-01-04T14:00:00</date-time>
+ </dtstart>
+ <duration>
+ <duration>PT1H</duration>
+ </duration>
+ <recurrence-id>
+ <parameters>
+ <tzid><text>US/Eastern</text></tzid>
+ </parameters>
+ <date-time>2006-01-04T12:00:00</date-time>
+ </recurrence-id>
+ <summary>
+ <text>Event #2 bis</text>
+
+
+
+Daboo, et al. Standards Track [Page 53]
+
+RFC 6321 xCal August 2011
+
+
+ </summary>
+ <uid>
+ <text>00959BC664CA650E933C892C@example.com</text>
+ </uid>
+ </properties>
+ </vevent>
+ </components>
+ </vcalendar>
+ </icalendar>
+
+Authors' Addresses
+
+ Cyrus Daboo
+ Apple Inc.
+ 1 Infinite Loop
+ Cupertino, CA 95014
+ USA
+
+ EMail: cyrus@daboo.name
+ URI: http://www.apple.com/
+
+
+ Mike Douglass
+ Rensselaer Polytechnic Institute
+ 110 8th Street
+ Troy, NY 12180
+ USA
+
+ EMail: douglm@rpi.edu
+ URI: http://www.rpi.edu/
+
+
+ Steven Lees
+ Microsoft Corporation
+ One Microsoft Way
+ Redmond, WA 98052
+ USA
+
+ EMail: steven.lees@microsoft.com
+ URI: http://www.microsoft.com/
+
+
+
+
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 54]
+
diff --git a/vendor/sabre/dav/docs/rfc6350.txt b/vendor/sabre/dav/docs/rfc6350.txt
new file mode 100644
index 000000000..d853cbc6c
--- /dev/null
+++ b/vendor/sabre/dav/docs/rfc6350.txt
@@ -0,0 +1,4147 @@
+
+
+
+
+
+
+Internet Engineering Task Force (IETF) S. Perreault
+Request for Comments: 6350 Viagenie
+Obsoletes: 2425, 2426, 4770 August 2011
+Updates: 2739
+Category: Standards Track
+ISSN: 2070-1721
+
+
+ vCard Format Specification
+
+Abstract
+
+ This document defines the vCard data format for representing and
+ exchanging a variety of information about individuals and other
+ entities (e.g., formatted and structured name and delivery addresses,
+ email address, multiple telephone numbers, photograph, logo, audio
+ clips, etc.). This document obsoletes RFCs 2425, 2426, and 4770, and
+ updates RFC 2739.
+
+Status of This Memo
+
+ This is an Internet Standards Track document.
+
+ This document is a product of the Internet Engineering Task Force
+ (IETF). It represents the consensus of the IETF community. It has
+ received public review and has been approved for publication by the
+ Internet Engineering Steering Group (IESG). Further information on
+ Internet Standards is available in Section 2 of RFC 5741.
+
+ Information about the current status of this document, any errata,
+ and how to provide feedback on it may be obtained at
+ http://www.rfc-editor.org/info/rfc6350.
+
+Copyright Notice
+
+ Copyright (c) 2011 IETF Trust and the persons identified as the
+ document authors. All rights reserved.
+
+ This document is subject to BCP 78 and the IETF Trust's Legal
+ Provisions Relating to IETF Documents
+ (http://trustee.ietf.org/license-info) in effect on the date of
+ publication of this document. Please review these documents
+ carefully, as they describe your rights and restrictions with respect
+ to this document. Code Components extracted from this document must
+ include Simplified BSD License text as described in Section 4.e of
+ the Trust Legal Provisions and are provided without warranty as
+ described in the Simplified BSD License.
+
+
+
+
+Perreault Standards Track [Page 1]
+
+RFC 6350 vCard August 2011
+
+
+ This document may contain material from IETF Documents or IETF
+ Contributions published or made publicly available before November
+ 10, 2008. The person(s) controlling the copyright in some of this
+ material may not have granted the IETF Trust the right to allow
+ modifications of such material outside the IETF Standards Process.
+ Without obtaining an adequate license from the person(s) controlling
+ the copyright in such materials, this document may not be modified
+ outside the IETF Standards Process, and derivative works of it may
+ not be created outside the IETF Standards Process, except to format
+ it for publication as an RFC or to translate it into languages other
+ than English.
+
+Table of Contents
+
+ 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 5
+ 2. Conventions . . . . . . . . . . . . . . . . . . . . . . . . . 5
+ 3. vCard Format Specification . . . . . . . . . . . . . . . . . . 5
+ 3.1. Charset . . . . . . . . . . . . . . . . . . . . . . . . . 5
+ 3.2. Line Delimiting and Folding . . . . . . . . . . . . . . . 5
+ 3.3. ABNF Format Definition . . . . . . . . . . . . . . . . . . 6
+ 3.4. Property Value Escaping . . . . . . . . . . . . . . . . . 9
+ 4. Property Value Data Types . . . . . . . . . . . . . . . . . . 9
+ 4.1. TEXT . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
+ 4.2. URI . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
+ 4.3. DATE, TIME, DATE-TIME, DATE-AND-OR-TIME, and TIMESTAMP . . 12
+ 4.3.1. DATE . . . . . . . . . . . . . . . . . . . . . . . . . 12
+ 4.3.2. TIME . . . . . . . . . . . . . . . . . . . . . . . . . 13
+ 4.3.3. DATE-TIME . . . . . . . . . . . . . . . . . . . . . . 13
+ 4.3.4. DATE-AND-OR-TIME . . . . . . . . . . . . . . . . . . . 14
+ 4.3.5. TIMESTAMP . . . . . . . . . . . . . . . . . . . . . . 14
+ 4.4. BOOLEAN . . . . . . . . . . . . . . . . . . . . . . . . . 14
+ 4.5. INTEGER . . . . . . . . . . . . . . . . . . . . . . . . . 15
+ 4.6. FLOAT . . . . . . . . . . . . . . . . . . . . . . . . . . 15
+ 4.7. UTC-OFFSET . . . . . . . . . . . . . . . . . . . . . . . . 15
+ 4.8. LANGUAGE-TAG . . . . . . . . . . . . . . . . . . . . . . . 16
+ 5. Property Parameters . . . . . . . . . . . . . . . . . . . . . 16
+ 5.1. LANGUAGE . . . . . . . . . . . . . . . . . . . . . . . . . 16
+ 5.2. VALUE . . . . . . . . . . . . . . . . . . . . . . . . . . 16
+ 5.3. PREF . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
+ 5.4. ALTID . . . . . . . . . . . . . . . . . . . . . . . . . . 18
+ 5.5. PID . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
+ 5.6. TYPE . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
+ 5.7. MEDIATYPE . . . . . . . . . . . . . . . . . . . . . . . . 20
+ 5.8. CALSCALE . . . . . . . . . . . . . . . . . . . . . . . . . 20
+ 5.9. SORT-AS . . . . . . . . . . . . . . . . . . . . . . . . . 21
+ 5.10. GEO . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
+ 5.11. TZ . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
+
+
+
+
+Perreault Standards Track [Page 2]
+
+RFC 6350 vCard August 2011
+
+
+ 6. vCard Properties . . . . . . . . . . . . . . . . . . . . . . . 23
+ 6.1. General Properties . . . . . . . . . . . . . . . . . . . . 23
+ 6.1.1. BEGIN . . . . . . . . . . . . . . . . . . . . . . . . 23
+ 6.1.2. END . . . . . . . . . . . . . . . . . . . . . . . . . 23
+ 6.1.3. SOURCE . . . . . . . . . . . . . . . . . . . . . . . . 24
+ 6.1.4. KIND . . . . . . . . . . . . . . . . . . . . . . . . . 25
+ 6.1.5. XML . . . . . . . . . . . . . . . . . . . . . . . . . 27
+ 6.2. Identification Properties . . . . . . . . . . . . . . . . 28
+ 6.2.1. FN . . . . . . . . . . . . . . . . . . . . . . . . . . 28
+ 6.2.2. N . . . . . . . . . . . . . . . . . . . . . . . . . . 29
+ 6.2.3. NICKNAME . . . . . . . . . . . . . . . . . . . . . . . 29
+ 6.2.4. PHOTO . . . . . . . . . . . . . . . . . . . . . . . . 30
+ 6.2.5. BDAY . . . . . . . . . . . . . . . . . . . . . . . . . 30
+ 6.2.6. ANNIVERSARY . . . . . . . . . . . . . . . . . . . . . 31
+ 6.2.7. GENDER . . . . . . . . . . . . . . . . . . . . . . . . 32
+ 6.3. Delivery Addressing Properties . . . . . . . . . . . . . . 32
+ 6.3.1. ADR . . . . . . . . . . . . . . . . . . . . . . . . . 32
+ 6.4. Communications Properties . . . . . . . . . . . . . . . . 34
+ 6.4.1. TEL . . . . . . . . . . . . . . . . . . . . . . . . . 34
+ 6.4.2. EMAIL . . . . . . . . . . . . . . . . . . . . . . . . 36
+ 6.4.3. IMPP . . . . . . . . . . . . . . . . . . . . . . . . . 36
+ 6.4.4. LANG . . . . . . . . . . . . . . . . . . . . . . . . . 37
+ 6.5. Geographical Properties . . . . . . . . . . . . . . . . . 37
+ 6.5.1. TZ . . . . . . . . . . . . . . . . . . . . . . . . . . 37
+ 6.5.2. GEO . . . . . . . . . . . . . . . . . . . . . . . . . 38
+ 6.6. Organizational Properties . . . . . . . . . . . . . . . . 39
+ 6.6.1. TITLE . . . . . . . . . . . . . . . . . . . . . . . . 39
+ 6.6.2. ROLE . . . . . . . . . . . . . . . . . . . . . . . . . 39
+ 6.6.3. LOGO . . . . . . . . . . . . . . . . . . . . . . . . . 40
+ 6.6.4. ORG . . . . . . . . . . . . . . . . . . . . . . . . . 40
+ 6.6.5. MEMBER . . . . . . . . . . . . . . . . . . . . . . . . 41
+ 6.6.6. RELATED . . . . . . . . . . . . . . . . . . . . . . . 42
+ 6.7. Explanatory Properties . . . . . . . . . . . . . . . . . . 43
+ 6.7.1. CATEGORIES . . . . . . . . . . . . . . . . . . . . . . 43
+ 6.7.2. NOTE . . . . . . . . . . . . . . . . . . . . . . . . . 44
+ 6.7.3. PRODID . . . . . . . . . . . . . . . . . . . . . . . . 44
+ 6.7.4. REV . . . . . . . . . . . . . . . . . . . . . . . . . 45
+ 6.7.5. SOUND . . . . . . . . . . . . . . . . . . . . . . . . 45
+ 6.7.6. UID . . . . . . . . . . . . . . . . . . . . . . . . . 46
+ 6.7.7. CLIENTPIDMAP . . . . . . . . . . . . . . . . . . . . . 47
+ 6.7.8. URL . . . . . . . . . . . . . . . . . . . . . . . . . 47
+ 6.7.9. VERSION . . . . . . . . . . . . . . . . . . . . . . . 48
+ 6.8. Security Properties . . . . . . . . . . . . . . . . . . . 48
+ 6.8.1. KEY . . . . . . . . . . . . . . . . . . . . . . . . . 48
+ 6.9. Calendar Properties . . . . . . . . . . . . . . . . . . . 49
+ 6.9.1. FBURL . . . . . . . . . . . . . . . . . . . . . . . . 49
+ 6.9.2. CALADRURI . . . . . . . . . . . . . . . . . . . . . . 50
+ 6.9.3. CALURI . . . . . . . . . . . . . . . . . . . . . . . . 50
+
+
+
+Perreault Standards Track [Page 3]
+
+RFC 6350 vCard August 2011
+
+
+ 6.10. Extended Properties and Parameters . . . . . . . . . . . . 51
+ 7. Synchronization . . . . . . . . . . . . . . . . . . . . . . . 51
+ 7.1. Mechanisms . . . . . . . . . . . . . . . . . . . . . . . . 51
+ 7.1.1. Matching vCard Instances . . . . . . . . . . . . . . . 51
+ 7.1.2. Matching Property Instances . . . . . . . . . . . . . 52
+ 7.1.3. PID Matching . . . . . . . . . . . . . . . . . . . . . 52
+ 7.2. Example . . . . . . . . . . . . . . . . . . . . . . . . . 53
+ 7.2.1. Creation . . . . . . . . . . . . . . . . . . . . . . . 53
+ 7.2.2. Initial Sharing . . . . . . . . . . . . . . . . . . . 53
+ 7.2.3. Adding and Sharing a Property . . . . . . . . . . . . 54
+ 7.2.4. Simultaneous Editing . . . . . . . . . . . . . . . . . 54
+ 7.2.5. Global Context Simplification . . . . . . . . . . . . 56
+ 8. Example: Author's vCard . . . . . . . . . . . . . . . . . . . 56
+ 9. Security Considerations . . . . . . . . . . . . . . . . . . . 57
+ 10. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 58
+ 10.1. Media Type Registration . . . . . . . . . . . . . . . . . 58
+ 10.2. Registering New vCard Elements . . . . . . . . . . . . . . 59
+ 10.2.1. Registration Procedure . . . . . . . . . . . . . . . . 59
+ 10.2.2. Vendor Namespace . . . . . . . . . . . . . . . . . . . 60
+ 10.2.3. Registration Template for Properties . . . . . . . . . 61
+ 10.2.4. Registration Template for Parameters . . . . . . . . . 61
+ 10.2.5. Registration Template for Value Data Types . . . . . . 62
+ 10.2.6. Registration Template for Values . . . . . . . . . . . 62
+ 10.3. Initial vCard Elements Registries . . . . . . . . . . . . 63
+ 10.3.1. Properties Registry . . . . . . . . . . . . . . . . . 64
+ 10.3.2. Parameters Registry . . . . . . . . . . . . . . . . . 65
+ 10.3.3. Value Data Types Registry . . . . . . . . . . . . . . 65
+ 10.3.4. Values Registries . . . . . . . . . . . . . . . . . . 66
+ 11. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 69
+ 12. References . . . . . . . . . . . . . . . . . . . . . . . . . . 69
+ 12.1. Normative References . . . . . . . . . . . . . . . . . . . 69
+ 12.2. Informative References . . . . . . . . . . . . . . . . . . 71
+ Appendix A. Differences from RFCs 2425 and 2426 . . . . . . . . . 73
+ A.1. New Structure . . . . . . . . . . . . . . . . . . . . . . 73
+ A.2. Removed Features . . . . . . . . . . . . . . . . . . . . . 73
+ A.3. New Properties and Parameters . . . . . . . . . . . . . . 73
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Perreault Standards Track [Page 4]
+
+RFC 6350 vCard August 2011
+
+
+1. Introduction
+
+ Electronic address books have become ubiquitous. Their increased
+ presence on portable, connected devices as well as the diversity of
+ platforms that exchange contact data call for a standard. This memo
+ defines the vCard format, which allows the capture and exchange of
+ information normally stored within an address book or directory
+ application.
+
+ A high-level overview of the differences from RFCs 2425 and 2426 can
+ be found in Appendix A.
+
+2. Conventions
+
+ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
+ "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and
+ "OPTIONAL" in this document are to be interpreted as described in
+ [RFC2119].
+
+3. vCard Format Specification
+
+ The text/vcard MIME content type (hereafter known as "vCard"; see
+ Section 10.1) contains contact information, typically pertaining to a
+ single contact or group of contacts. The content consists of one or
+ more lines in the format given below.
+
+3.1. Charset
+
+ The charset (see [RFC3536] for internationalization terminology) for
+ vCard is UTF-8 as defined in [RFC3629]. There is no way to override
+ this. It is invalid to specify a value other than "UTF-8" in the
+ "charset" MIME parameter (see Section 10.1).
+
+3.2. Line Delimiting and Folding
+
+ Individual lines within vCard are delimited by the [RFC5322] line
+ break, which is a CRLF sequence (U+000D followed by U+000A). Long
+ logical lines of text can be split into a multiple-physical-line
+ representation using the following folding technique. Content lines
+ SHOULD be folded to a maximum width of 75 octets, excluding the line
+ break. Multi-octet characters MUST remain contiguous. The rationale
+ for this folding process can be found in [RFC5322], Section 2.1.1.
+
+ A logical line MAY be continued on the next physical line anywhere
+ between two characters by inserting a CRLF immediately followed by a
+ single white space character (space (U+0020) or horizontal tab
+ (U+0009)). The folded line MUST contain at least one character. Any
+ sequence of CRLF followed immediately by a single white space
+
+
+
+Perreault Standards Track [Page 5]
+
+RFC 6350 vCard August 2011
+
+
+ character is ignored (removed) when processing the content type. For
+ example, the line:
+
+ NOTE:This is a long description that exists on a long line.
+
+ can be represented as:
+
+ NOTE:This is a long description
+ that exists on a long line.
+
+ It could also be represented as:
+
+ NOTE:This is a long descrip
+ tion that exists o
+ n a long line.
+
+ The process of moving from this folded multiple-line representation
+ of a property definition to its single-line representation is called
+ unfolding. Unfolding is accomplished by regarding CRLF immediately
+ followed by a white space character (namely, HTAB (U+0009) or SPACE
+ (U+0020)) as equivalent to no characters at all (i.e., the CRLF and
+ single white space character are removed).
+
+ Note: It is possible for very simple implementations to generate
+ improperly folded lines in the middle of a UTF-8 multi-octet
+ sequence. For this reason, implementations SHOULD unfold lines in
+ such a way as to properly restore the original sequence.
+
+ Note: Unfolding is done differently than in [RFC5322]. Unfolding
+ in [RFC5322] only removes the CRLF, not the space following it.
+
+ Folding is done after any content encoding of a type value.
+ Unfolding is done before any decoding of a type value in a content
+ line.
+
+3.3. ABNF Format Definition
+
+ The following ABNF uses the notation of [RFC5234], which also defines
+ CRLF, WSP, DQUOTE, VCHAR, ALPHA, and DIGIT.
+
+ vcard-entity = 1*vcard
+
+ vcard = "BEGIN:VCARD" CRLF
+ "VERSION:4.0" CRLF
+ 1*contentline
+ "END:VCARD" CRLF
+ ; A vCard object MUST include the VERSION and FN properties.
+ ; VERSION MUST come immediately after BEGIN:VCARD.
+
+
+
+Perreault Standards Track [Page 6]
+
+RFC 6350 vCard August 2011
+
+
+ contentline = [group "."] name *(";" param) ":" value CRLF
+ ; When parsing a content line, folded lines must first
+ ; be unfolded according to the unfolding procedure
+ ; described in Section 3.2.
+ ; When generating a content line, lines longer than 75
+ ; characters SHOULD be folded according to the folding
+ ; procedure described in Section 3.2.
+
+ group = 1*(ALPHA / DIGIT / "-")
+ name = "SOURCE" / "KIND" / "FN" / "N" / "NICKNAME"
+ / "PHOTO" / "BDAY" / "ANNIVERSARY" / "GENDER" / "ADR" / "TEL"
+ / "EMAIL" / "IMPP" / "LANG" / "TZ" / "GEO" / "TITLE" / "ROLE"
+ / "LOGO" / "ORG" / "MEMBER" / "RELATED" / "CATEGORIES"
+ / "NOTE" / "PRODID" / "REV" / "SOUND" / "UID" / "CLIENTPIDMAP"
+ / "URL" / "KEY" / "FBURL" / "CALADRURI" / "CALURI" / "XML"
+ / iana-token / x-name
+ ; Parsing of the param and value is based on the "name" as
+ ; defined in ABNF sections below.
+ ; Group and name are case-insensitive.
+
+ iana-token = 1*(ALPHA / DIGIT / "-")
+ ; identifier registered with IANA
+
+ x-name = "x-" 1*(ALPHA / DIGIT / "-")
+ ; Names that begin with "x-" or "X-" are
+ ; reserved for experimental use, not intended for released
+ ; products, or for use in bilateral agreements.
+
+ param = language-param / value-param / pref-param / pid-param
+ / type-param / geo-parameter / tz-parameter / sort-as-param
+ / calscale-param / any-param
+ ; Allowed parameters depend on property name.
+
+ param-value = *SAFE-CHAR / DQUOTE *QSAFE-CHAR DQUOTE
+
+ any-param = (iana-token / x-name) "=" param-value *("," param-value)
+
+ NON-ASCII = UTF8-2 / UTF8-3 / UTF8-4
+ ; UTF8-{2,3,4} are defined in [RFC3629]
+
+ QSAFE-CHAR = WSP / "!" / %x23-7E / NON-ASCII
+ ; Any character except CTLs, DQUOTE
+
+ SAFE-CHAR = WSP / "!" / %x23-39 / %x3C-7E / NON-ASCII
+ ; Any character except CTLs, DQUOTE, ";", ":"
+
+ VALUE-CHAR = WSP / VCHAR / NON-ASCII
+ ; Any textual character
+
+
+
+Perreault Standards Track [Page 7]
+
+RFC 6350 vCard August 2011
+
+
+ A line that begins with a white space character is a continuation of
+ the previous line, as described in Section 3.2. The white space
+ character and immediately preceeding CRLF should be discarded when
+ reconstructing the original line. Note that this line-folding
+ convention differs from that found in [RFC5322], in that the sequence
+ <CRLF><WSP> found anywhere in the content indicates a continued line
+ and should be removed.
+
+ Property names and parameter names are case-insensitive (e.g., the
+ property name "fn" is the same as "FN" and "Fn"). Parameter values
+ MAY be case-sensitive or case-insensitive, depending on their
+ definition. Parameter values that are not explicitly defined as
+ being case-sensitive are case-insensitive. Based on experience with
+ vCard 3 interoperability, it is RECOMMENDED that property and
+ parameter names be upper-case on output.
+
+ The group construct is used to group related properties together.
+ The group name is a syntactic convention used to indicate that all
+ property names prefaced with the same group name SHOULD be grouped
+ together when displayed by an application. It has no other
+ significance. Implementations that do not understand or support
+ grouping MAY simply strip off any text before a "." to the left of
+ the type name and present the types and values as normal.
+
+ Property cardinalities are indicated using the following notation,
+ which is based on ABNF (see [RFC5234], Section 3.6):
+
+ +-------------+--------------------------------------------------+
+ | Cardinality | Meaning |
+ +-------------+--------------------------------------------------+
+ | 1 | Exactly one instance per vCard MUST be present. |
+ | *1 | Exactly one instance per vCard MAY be present. |
+ | 1* | One or more instances per vCard MUST be present. |
+ | * | One or more instances per vCard MAY be present. |
+ +-------------+--------------------------------------------------+
+
+ Properties defined in a vCard instance may have multiple values
+ depending on the property cardinality. The general rule for encoding
+ multi-valued properties is to simply create a new content line for
+ each value (including the property name). However, it should be
+ noted that some value types support encoding multiple values in a
+ single content line by separating the values with a comma ",". This
+ approach has been taken for several of the content types defined
+ below (date, time, integer, float).
+
+
+
+
+
+
+
+Perreault Standards Track [Page 8]
+
+RFC 6350 vCard August 2011
+
+
+3.4. Property Value Escaping
+
+ Some properties may contain one or more values delimited by a COMMA
+ character (U+002C). Therefore, a COMMA character in a value MUST be
+ escaped with a BACKSLASH character (U+005C), even for properties that
+ don't allow multiple instances (for consistency).
+
+ Some properties (e.g., N and ADR) comprise multiple fields delimited
+ by a SEMICOLON character (U+003B). Therefore, a SEMICOLON in a field
+ of such a "compound" property MUST be escaped with a BACKSLASH
+ character. SEMICOLON characters in non-compound properties MAY be
+ escaped. On input, an escaped SEMICOLON character is never a field
+ separator. An unescaped SEMICOLON character may be a field
+ separator, depending on the property in which it appears.
+
+ Furthermore, some fields of compound properties may contain a list of
+ values delimited by a COMMA character. Therefore, a COMMA character
+ in one of a field's values MUST be escaped with a BACKSLASH
+ character, even for fields that don't allow multiple values (for
+ consistency). Compound properties allowing multiple instances MUST
+ NOT be encoded in a single content line.
+
+ Finally, BACKSLASH characters in values MUST be escaped with a
+ BACKSLASH character. NEWLINE (U+000A) characters in values MUST be
+ encoded by two characters: a BACKSLASH followed by either an 'n'
+ (U+006E) or an 'N' (U+004E).
+
+ In all other cases, escaping MUST NOT be used.
+
+4. Property Value Data Types
+
+ Standard value types are defined below.
+
+ value = text
+ / text-list
+ / date-list
+ / time-list
+ / date-time-list
+ / date-and-or-time-list
+ / timestamp-list
+ / boolean
+ / integer-list
+ / float-list
+ / URI ; from Section 3 of [RFC3986]
+ / utc-offset
+ / Language-Tag
+ / iana-valuespec
+ ; Actual value type depends on property name and VALUE parameter.
+
+
+
+Perreault Standards Track [Page 9]
+
+RFC 6350 vCard August 2011
+
+
+ text = *TEXT-CHAR
+
+ TEXT-CHAR = "\\" / "\," / "\n" / WSP / NON-ASCII
+ / %x21-2B / %x2D-5B / %x5D-7E
+ ; Backslashes, commas, and newlines must be encoded.
+
+ component = "\\" / "\," / "\;" / "\n" / WSP / NON-ASCII
+ / %x21-2B / %x2D-3A / %x3C-5B / %x5D-7E
+ list-component = component *("," component)
+
+ text-list = text *("," text)
+ date-list = date *("," date)
+ time-list = time *("," time)
+ date-time-list = date-time *("," date-time)
+ date-and-or-time-list = date-and-or-time *("," date-and-or-time)
+ timestamp-list = timestamp *("," timestamp)
+ integer-list = integer *("," integer)
+ float-list = float *("," float)
+
+ boolean = "TRUE" / "FALSE"
+ integer = [sign] 1*DIGIT
+ float = [sign] 1*DIGIT ["." 1*DIGIT]
+
+ sign = "+" / "-"
+
+ year = 4DIGIT ; 0000-9999
+ month = 2DIGIT ; 01-12
+ day = 2DIGIT ; 01-28/29/30/31 depending on month and leap year
+ hour = 2DIGIT ; 00-23
+ minute = 2DIGIT ; 00-59
+ second = 2DIGIT ; 00-58/59/60 depending on leap second
+ zone = utc-designator / utc-offset
+ utc-designator = %x5A ; uppercase "Z"
+
+ date = year [month day]
+ / year "-" month
+ / "--" month [day]
+ / "--" "-" day
+ date-noreduc = year month day
+ / "--" month day
+ / "--" "-" day
+ date-complete = year month day
+
+ time = hour [minute [second]] [zone]
+ / "-" minute [second] [zone]
+ / "-" "-" second [zone]
+ time-notrunc = hour [minute [second]] [zone]
+ time-complete = hour minute second [zone]
+
+
+
+Perreault Standards Track [Page 10]
+
+RFC 6350 vCard August 2011
+
+
+ time-designator = %x54 ; uppercase "T"
+ date-time = date-noreduc time-designator time-notrunc
+ timestamp = date-complete time-designator time-complete
+
+ date-and-or-time = date-time / date / time-designator time
+
+ utc-offset = sign hour [minute]
+
+ Language-Tag = <Language-Tag, defined in [RFC5646], Section 2.1>
+
+ iana-valuespec = <value-spec, see Section 12>
+ ; a publicly defined valuetype format, registered
+ ; with IANA, as defined in Section 12 of this
+ ; document.
+
+4.1. TEXT
+
+ "text": The "text" value type should be used to identify values that
+ contain human-readable text. As for the language, it is controlled
+ by the LANGUAGE property parameter defined in Section 5.1.
+
+ Examples for "text":
+
+ this is a text value
+ this is one value,this is another
+ this is a single value\, with a comma encoded
+
+ A formatted text line break in a text value type MUST be represented
+ as the character sequence backslash (U+005C) followed by a Latin
+ small letter n (U+006E) or a Latin capital letter N (U+004E), that
+ is, "\n" or "\N".
+
+ For example, a multiple line NOTE value of:
+
+ Mythical Manager
+ Hyjinx Software Division
+ BabsCo, Inc.
+
+ could be represented as:
+
+ NOTE:Mythical Manager\nHyjinx Software Division\n
+ BabsCo\, Inc.\n
+
+ demonstrating the \n literal formatted line break technique, the
+ CRLF-followed-by-space line folding technique, and the backslash
+ escape technique.
+
+
+
+
+
+Perreault Standards Track [Page 11]
+
+RFC 6350 vCard August 2011
+
+
+4.2. URI
+
+ "uri": The "uri" value type should be used to identify values that
+ are referenced by a Uniform Resource Identifier (URI) instead of
+ encoded in-line. These value references might be used if the value
+ is too large, or otherwise undesirable to include directly. The
+ format for the URI is as defined in Section 3 of [RFC3986]. Note
+ that the value of a property of type "uri" is what the URI points to,
+ not the URI itself.
+
+ Examples for "uri":
+
+ http://www.example.com/my/picture.jpg
+ ldap://ldap.example.com/cn=babs%20jensen
+
+4.3. DATE, TIME, DATE-TIME, DATE-AND-OR-TIME, and TIMESTAMP
+
+ "date", "time", "date-time", "date-and-or-time", and "timestamp":
+ Each of these value types is based on the definitions in
+ [ISO.8601.2004]. Multiple such values can be specified using the
+ comma-separated notation.
+
+ Only the basic format is supported.
+
+4.3.1. DATE
+
+ A calendar date as specified in [ISO.8601.2004], Section 4.1.2.
+
+ Reduced accuracy, as specified in [ISO.8601.2004], Sections 4.1.2.3
+ a) and b), but not c), is permitted.
+
+ Expanded representation, as specified in [ISO.8601.2004], Section
+ 4.1.4, is forbidden.
+
+ Truncated representation, as specified in [ISO.8601.2000], Sections
+ 5.2.1.3 d), e), and f), is permitted.
+
+ Examples for "date":
+
+ 19850412
+ 1985-04
+ 1985
+ --0412
+ ---12
+
+
+
+
+
+
+
+Perreault Standards Track [Page 12]
+
+RFC 6350 vCard August 2011
+
+
+ Note the use of YYYY-MM in the second example above. YYYYMM is
+ disallowed to prevent confusion with YYMMDD. Note also that
+ YYYY-MM-DD is disallowed since we are using the basic format instead
+ of the extended format.
+
+4.3.2. TIME
+
+ A time of day as specified in [ISO.8601.2004], Section 4.2.
+
+ Reduced accuracy, as specified in [ISO.8601.2004], Section 4.2.2.3,
+ is permitted.
+
+ Representation with decimal fraction, as specified in
+ [ISO.8601.2004], Section 4.2.2.4, is forbidden.
+
+ The midnight hour is always represented by 00, never 24 (see
+ [ISO.8601.2004], Section 4.2.3).
+
+ Truncated representation, as specified in [ISO.8601.2000], Sections
+ 5.3.1.4 a), b), and c), is permitted.
+
+ Examples for "time":
+
+ 102200
+ 1022
+ 10
+ -2200
+ --00
+ 102200Z
+ 102200-0800
+
+4.3.3. DATE-TIME
+
+ A date and time of day combination as specified in [ISO.8601.2004],
+ Section 4.3.
+
+ Truncation of the date part, as specified in [ISO.8601.2000], Section
+ 5.4.2 c), is permitted.
+
+ Examples for "date-time":
+
+ 19961022T140000
+ --1022T1400
+ ---22T14
+
+
+
+
+
+
+
+Perreault Standards Track [Page 13]
+
+RFC 6350 vCard August 2011
+
+
+4.3.4. DATE-AND-OR-TIME
+
+ Either a DATE-TIME, a DATE, or a TIME value. To allow unambiguous
+ interpretation, a stand-alone TIME value is always preceded by a "T".
+
+ Examples for "date-and-or-time":
+
+ 19961022T140000
+ --1022T1400
+ ---22T14
+ 19850412
+ 1985-04
+ 1985
+ --0412
+ ---12
+ T102200
+ T1022
+ T10
+ T-2200
+ T--00
+ T102200Z
+ T102200-0800
+
+4.3.5. TIMESTAMP
+
+ A complete date and time of day combination as specified in
+ [ISO.8601.2004], Section 4.3.2.
+
+ Examples for "timestamp":
+
+ 19961022T140000
+ 19961022T140000Z
+ 19961022T140000-05
+ 19961022T140000-0500
+
+4.4. BOOLEAN
+
+ "boolean": The "boolean" value type is used to express boolean
+ values. These values are case-insensitive.
+
+ Examples:
+
+ TRUE
+ false
+ True
+
+
+
+
+
+
+Perreault Standards Track [Page 14]
+
+RFC 6350 vCard August 2011
+
+
+4.5. INTEGER
+
+ "integer": The "integer" value type is used to express signed
+ integers in decimal format. If sign is not specified, the value is
+ assumed positive "+". Multiple "integer" values can be specified
+ using the comma-separated notation. The maximum value is
+ 9223372036854775807, and the minimum value is -9223372036854775808.
+ These limits correspond to a signed 64-bit integer using two's-
+ complement arithmetic.
+
+ Examples:
+
+ 1234567890
+ -1234556790
+ +1234556790,432109876
+
+4.6. FLOAT
+
+ "float": The "float" value type is used to express real numbers. If
+ sign is not specified, the value is assumed positive "+". Multiple
+ "float" values can be specified using the comma-separated notation.
+ Implementations MUST support a precision equal or better than that of
+ the IEEE "binary64" format [IEEE.754.2008].
+
+ Note: Scientific notation is disallowed. Implementers wishing to
+ use their favorite language's %f formatting should be careful.
+
+ Examples:
+
+ 20.30
+ 1000000.0000001
+ 1.333,3.14
+
+4.7. UTC-OFFSET
+
+ "utc-offset": The "utc-offset" value type specifies that the property
+ value is a signed offset from UTC. This value type can be specified
+ in the TZ property.
+
+ The value type is an offset from Coordinated Universal Time (UTC).
+ It is specified as a positive or negative difference in units of
+ hours and minutes (e.g., +hhmm). The time is specified as a 24-hour
+ clock. Hour values are from 00 to 23, and minute values are from 00
+ to 59. Hour and minutes are 2 digits with high-order zeroes required
+ to maintain digit count. The basic format for ISO 8601 UTC offsets
+ MUST be used.
+
+
+
+
+
+Perreault Standards Track [Page 15]
+
+RFC 6350 vCard August 2011
+
+
+4.8. LANGUAGE-TAG
+
+ "language-tag": A single language tag, as defined in [RFC5646].
+
+5. Property Parameters
+
+ A property can have attributes associated with it. These "property
+ parameters" contain meta-information about the property or the
+ property value. In some cases, the property parameter can be multi-
+ valued in which case the property parameter value elements are
+ separated by a COMMA (U+002C).
+
+ Property parameter value elements that contain the COLON (U+003A),
+ SEMICOLON (U+003B), or COMMA (U+002C) character separators MUST be
+ specified as quoted-string text values. Property parameter values
+ MUST NOT contain the DQUOTE (U+0022) character. The DQUOTE character
+ is used as a delimiter for parameter values that contain restricted
+ characters or URI text.
+
+ Applications MUST ignore x-param and iana-param values they don't
+ recognize.
+
+5.1. LANGUAGE
+
+ The LANGUAGE property parameter is used to identify data in multiple
+ languages. There is no concept of "default" language, except as
+ specified by any "Content-Language" MIME header parameter that is
+ present [RFC3282]. The value of the LANGUAGE property parameter is a
+ language tag as defined in Section 2 of [RFC5646].
+
+ Examples:
+
+ ROLE;LANGUAGE=tr:hoca
+
+ ABNF:
+
+ language-param = "LANGUAGE=" Language-Tag
+ ; Language-Tag is defined in section 2.1 of RFC 5646
+
+5.2. VALUE
+
+ The VALUE parameter is OPTIONAL, used to identify the value type
+ (data type) and format of the value. The use of these predefined
+ formats is encouraged even if the value parameter is not explicitly
+ used. By defining a standard set of value types and their formats,
+ existing parsing and processing code can be leveraged. The
+
+
+
+
+
+Perreault Standards Track [Page 16]
+
+RFC 6350 vCard August 2011
+
+
+ predefined data type values MUST NOT be repeated in COMMA-separated
+ value lists except within the N, NICKNAME, ADR, and CATEGORIES
+ properties.
+
+ ABNF:
+
+ value-param = "VALUE=" value-type
+
+ value-type = "text"
+ / "uri"
+ / "date"
+ / "time"
+ / "date-time"
+ / "date-and-or-time"
+ / "timestamp"
+ / "boolean"
+ / "integer"
+ / "float"
+ / "utc-offset"
+ / "language-tag"
+ / iana-token ; registered as described in section 12
+ / x-name
+
+5.3. PREF
+
+ The PREF parameter is OPTIONAL and is used to indicate that the
+ corresponding instance of a property is preferred by the vCard
+ author. Its value MUST be an integer between 1 and 100 that
+ quantifies the level of preference. Lower values correspond to a
+ higher level of preference, with 1 being most preferred.
+
+ When the parameter is absent, the default MUST be to interpret the
+ property instance as being least preferred.
+
+ Note that the value of this parameter is to be interpreted only in
+ relation to values assigned to other instances of the same property
+ in the same vCard. A given value, or the absence of a value, MUST
+ NOT be interpreted on its own.
+
+ This parameter MAY be applied to any property that allows multiple
+ instances.
+
+ ABNF:
+
+ pref-param = "PREF=" (1*2DIGIT / "100")
+ ; An integer between 1 and 100.
+
+
+
+
+
+Perreault Standards Track [Page 17]
+
+RFC 6350 vCard August 2011
+
+
+5.4. ALTID
+
+ The ALTID parameter is used to "tag" property instances as being
+ alternative representations of the same logical property. For
+ example, translations of a property in multiple languages generates
+ multiple property instances having different LANGUAGE (Section 5.1)
+ parameter that are tagged with the same ALTID value.
+
+ This parameter's value is treated as an opaque string. Its sole
+ purpose is to be compared for equality against other ALTID parameter
+ values.
+
+ Two property instances are considered alternative representations of
+ the same logical property if and only if their names as well as the
+ value of their ALTID parameters are identical. Property instances
+ without the ALTID parameter MUST NOT be considered an alternative
+ representation of any other property instance. Values for the ALTID
+ parameter are not globally unique: they MAY be reused for different
+ property names.
+
+ Property instances having the same ALTID parameter value count as 1
+ toward cardinality. Therefore, since N (Section 6.2.2) has
+ cardinality *1 and TITLE (Section 6.6.1) has cardinality *, these
+ three examples would be legal:
+
+ N;ALTID=1;LANGUAGE=jp:<U+5C71><U+7530>;<U+592A><U+90CE>;;;
+ N;ALTID=1;LANGUAGE=en:Yamada;Taro;;;
+ (<U+XXXX> denotes a UTF8-encoded Unicode character.)
+
+ TITLE;ALTID=1;LANGUAGE=fr:Patron
+ TITLE;ALTID=1;LANGUAGE=en:Boss
+
+ TITLE;ALTID=1;LANGUAGE=fr:Patron
+ TITLE;ALTID=1;LANGUAGE=en:Boss
+ TITLE;ALTID=2;LANGUAGE=en:Chief vCard Evangelist
+
+ while this one would not:
+
+ N;ALTID=1;LANGUAGE=jp:<U+5C71><U+7530>;<U+592A><U+90CE>;;;
+ N:Yamada;Taro;;;
+ (Two instances of the N property.)
+
+ and these three would be legal but questionable:
+
+ TITLE;ALTID=1;LANGUAGE=fr:Patron
+ TITLE;ALTID=2;LANGUAGE=en:Boss
+ (Should probably have the same ALTID value.)
+
+
+
+
+Perreault Standards Track [Page 18]
+
+RFC 6350 vCard August 2011
+
+
+ TITLE;ALTID=1;LANGUAGE=fr:Patron
+ TITLE:LANGUAGE=en:Boss
+ (Second line should probably have ALTID=1.)
+
+ N;ALTID=1;LANGUAGE=jp:<U+5C71><U+7530>;<U+592A><U+90CE>;;;
+ N;ALTID=1;LANGUAGE=en:Yamada;Taro;;;
+ N;ALTID=1;LANGUAGE=en:Smith;John;;;
+ (The last line should probably have ALTID=2. But that would be
+ illegal because N has cardinality *1.)
+
+ The ALTID property MAY also be used in may contexts other than with
+ the LANGUAGE parameter. Here's an example with two representations
+ of the same photo in different file formats:
+
+ PHOTO;ALTID=1:data:image/jpeg;base64,...
+ PHOTO;ALTID=1;data:image/jp2;base64,...
+
+ ABNF:
+
+ altid-param = "ALTID=" param-value
+
+5.5. PID
+
+ The PID parameter is used to identify a specific property among
+ multiple instances. It plays a role analogous to the UID property
+ (Section 6.7.6) on a per-property instead of per-vCard basis. It MAY
+ appear more than once in a given property. It MUST NOT appear on
+ properties that may have only one instance per vCard. Its value is
+ either a single small positive integer or a pair of small positive
+ integers separated by a dot. Multiple values may be encoded in a
+ single PID parameter by separating the values with a comma ",". See
+ Section 7 for more details on its usage.
+
+ ABNF:
+
+ pid-param = "PID=" pid-value *("," pid-value)
+ pid-value = 1*DIGIT ["." 1*DIGIT]
+
+5.6. TYPE
+
+ The TYPE parameter has multiple, different uses. In general, it is a
+ way of specifying class characteristics of the associated property.
+ Most of the time, its value is a comma-separated subset of a
+ predefined enumeration. In this document, the following properties
+ make use of this parameter: FN, NICKNAME, PHOTO, ADR, TEL, EMAIL,
+ IMPP, LANG, TZ, GEO, TITLE, ROLE, LOGO, ORG, RELATED, CATEGORIES,
+
+
+
+
+
+Perreault Standards Track [Page 19]
+
+RFC 6350 vCard August 2011
+
+
+ NOTE, SOUND, URL, KEY, FBURL, CALADRURI, and CALURI. The TYPE
+ parameter MUST NOT be applied on other properties defined in this
+ document.
+
+ The "work" and "home" values act like tags. The "work" value implies
+ that the property is related to an individual's work place, while the
+ "home" value implies that the property is related to an individual's
+ personal life. When neither "work" nor "home" is present, it is
+ implied that the property is related to both an individual's work
+ place and personal life in the case that the KIND property's value is
+ "individual", or to none in other cases.
+
+ ABNF:
+
+ type-param = "TYPE=" type-value *("," type-value)
+
+ type-value = "work" / "home" / type-param-tel
+ / type-param-related / iana-token / x-name
+ ; This is further defined in individual property sections.
+
+5.7. MEDIATYPE
+
+ The MEDIATYPE parameter is used with properties whose value is a URI.
+ Its use is OPTIONAL. It provides a hint to the vCard consumer
+ application about the media type [RFC2046] of the resource identified
+ by the URI. Some URI schemes do not need this parameter. For
+ example, the "data" scheme allows the media type to be explicitly
+ indicated as part of the URI [RFC2397]. Another scheme, "http",
+ provides the media type as part of the URI resolution process, with
+ the Content-Type HTTP header [RFC2616]. The MEDIATYPE parameter is
+ intended to be used with URI schemes that do not provide such
+ functionality (e.g., "ftp" [RFC1738]).
+
+ ABNF:
+
+ mediatype-param = "MEDIATYPE=" mediatype
+ mediatype = type-name "/" subtype-name *( ";" attribute "=" value )
+ ; "attribute" and "value" are from [RFC2045]
+ ; "type-name" and "subtype-name" are from [RFC4288]
+
+5.8. CALSCALE
+
+ The CALSCALE parameter is identical to the CALSCALE property in
+ iCalendar (see [RFC5545], Section 3.7.1). It is used to define the
+ calendar system in which a date or date-time value is expressed. The
+ only value specified by iCalendar is "gregorian", which stands for
+ the Gregorian system. It is the default when the parameter is
+ absent. Additional values may be defined in extension documents and
+
+
+
+Perreault Standards Track [Page 20]
+
+RFC 6350 vCard August 2011
+
+
+ registered with IANA (see Section 10.3.4). A vCard implementation
+ MUST ignore properties with a CALSCALE parameter value that it does
+ not understand.
+
+ ABNF:
+
+ calscale-param = "CALSCALE=" calscale-value
+
+ calscale-value = "gregorian" / iana-token / x-name
+
+5.9. SORT-AS
+
+ The "sort-as" parameter is used to specify the string to be used for
+ national-language-specific sorting. Without this information,
+ sorting algorithms could incorrectly sort this vCard within a
+ sequence of sorted vCards. When this property is present in a vCard,
+ then the given strings are used for sorting the vCard.
+
+ This parameter's value is a comma-separated list that MUST have as
+ many or fewer elements as the corresponding property value has
+ components. This parameter's value is case-sensitive.
+
+ ABNF:
+
+ sort-as-param = "SORT-AS=" sort-as-value
+
+ sort-as-value = param-value *("," param-value)
+
+ Examples: For the case of surname and given name sorting, the
+ following examples define common sort string usage with the N
+ property.
+
+ FN:Rene van der Harten
+ N;SORT-AS="Harten,Rene":van der Harten;Rene,J.;Sir;R.D.O.N.
+
+ FN:Robert Pau Shou Chang
+ N;SORT-AS="Pau Shou Chang,Robert":Shou Chang;Robert,Pau;;
+
+ FN:Osamu Koura
+ N;SORT-AS="Koura,Osamu":Koura;Osamu;;
+
+ FN:Oscar del Pozo
+ N;SORT-AS="Pozo,Oscar":del Pozo Triscon;Oscar;;
+
+ FN:Chistine d'Aboville
+ N;SORT-AS="Aboville,Christine":d'Aboville;Christine;;
+
+
+
+
+
+Perreault Standards Track [Page 21]
+
+RFC 6350 vCard August 2011
+
+
+ FN:H. James de Mann
+ N;SORT-AS="Mann,James":de Mann;Henry,James;;
+
+ If sorted by surname, the results would be:
+
+ Christine d'Aboville
+ Rene van der Harten
+ Osamu Koura
+ H. James de Mann
+ Robert Pau Shou Chang
+ Oscar del Pozo
+
+ If sorted by given name, the results would be:
+
+ Christine d'Aboville
+ H. James de Mann
+ Osamu Koura
+ Oscar del Pozo
+ Rene van der Harten
+ Robert Pau Shou Chang
+
+5.10. GEO
+
+ The GEO parameter can be used to indicate global positioning
+ information that is specific to an address. Its value is the same as
+ that of the GEO property (see Section 6.5.2).
+
+ ABNF:
+
+ geo-parameter = "GEO=" DQUOTE URI DQUOTE
+
+5.11. TZ
+
+ The TZ parameter can be used to indicate time zone information that
+ is specific to an address. Its value is the same as that of the TZ
+ property.
+
+ ABNF:
+
+ tz-parameter = "TZ=" (param-value / DQUOTE URI DQUOTE)
+
+
+
+
+
+
+
+
+
+
+
+Perreault Standards Track [Page 22]
+
+RFC 6350 vCard August 2011
+
+
+6. vCard Properties
+
+ What follows is an enumeration of the standard vCard properties.
+
+6.1. General Properties
+
+6.1.1. BEGIN
+
+ Purpose: To denote the beginning of a syntactic entity within a
+ text/vcard content-type.
+
+ Value type: text
+
+ Cardinality: 1
+
+ Special notes: The content entity MUST begin with the BEGIN property
+ with a value of "VCARD". The value is case-insensitive.
+
+ The BEGIN property is used in conjunction with the END property to
+ delimit an entity containing a related set of properties within a
+ text/vcard content-type. This construct can be used instead of
+ including multiple vCards as body parts inside of a multipart/
+ alternative MIME message. It is provided for applications that
+ wish to define content that can contain multiple entities within
+ the same text/vcard content-type or to define content that can be
+ identifiable outside of a MIME environment.
+
+ ABNF:
+
+ BEGIN-param = 0" " ; no parameter allowed
+ BEGIN-value = "VCARD"
+
+ Example:
+
+ BEGIN:VCARD
+
+6.1.2. END
+
+ Purpose: To denote the end of a syntactic entity within a text/vcard
+ content-type.
+
+ Value type: text
+
+ Cardinality: 1
+
+ Special notes: The content entity MUST end with the END type with a
+ value of "VCARD". The value is case-insensitive.
+
+
+
+
+Perreault Standards Track [Page 23]
+
+RFC 6350 vCard August 2011
+
+
+ The END property is used in conjunction with the BEGIN property to
+ delimit an entity containing a related set of properties within a
+ text/vcard content-type. This construct can be used instead of or
+ in addition to wrapping separate sets of information inside
+ additional MIME headers. It is provided for applications that
+ wish to define content that can contain multiple entities within
+ the same text/vcard content-type or to define content that can be
+ identifiable outside of a MIME environment.
+
+ ABNF:
+
+ END-param = 0" " ; no parameter allowed
+ END-value = "VCARD"
+
+ Example:
+
+ END:VCARD
+
+6.1.3. SOURCE
+
+ Purpose: To identify the source of directory information contained
+ in the content type.
+
+ Value type: uri
+
+ Cardinality: *
+
+ Special notes: The SOURCE property is used to provide the means by
+ which applications knowledgable in the given directory service
+ protocol can obtain additional or more up-to-date information from
+ the directory service. It contains a URI as defined in [RFC3986]
+ and/or other information referencing the vCard to which the
+ information pertains. When directory information is available
+ from more than one source, the sending entity can pick what it
+ considers to be the best source, or multiple SOURCE properties can
+ be included.
+
+ ABNF:
+
+ SOURCE-param = "VALUE=uri" / pid-param / pref-param / altid-param
+ / mediatype-param / any-param
+ SOURCE-value = URI
+
+ Examples:
+
+ SOURCE:ldap://ldap.example.com/cn=Babs%20Jensen,%20o=Babsco,%20c=US
+
+
+
+
+
+Perreault Standards Track [Page 24]
+
+RFC 6350 vCard August 2011
+
+
+ SOURCE:http://directory.example.com/addressbooks/jdoe/
+ Jean%20Dupont.vcf
+
+6.1.4. KIND
+
+ Purpose: To specify the kind of object the vCard represents.
+
+ Value type: A single text value.
+
+ Cardinality: *1
+
+ Special notes: The value may be one of the following:
+
+ "individual" for a vCard representing a single person or entity.
+ This is the default kind of vCard.
+
+ "group" for a vCard representing a group of persons or entities.
+ The group's member entities can be other vCards or other types
+ of entities, such as email addresses or web sites. A group
+ vCard will usually contain MEMBER properties to specify the
+ members of the group, but it is not required to. A group vCard
+ without MEMBER properties can be considered an abstract
+ grouping, or one whose members are known empirically (perhaps
+ "IETF Participants" or "Republican U.S. Senators").
+
+ All properties in a group vCard apply to the group as a whole,
+ and not to any particular MEMBER. For example, an EMAIL
+ property might specify the address of a mailing list associated
+ with the group, and an IMPP property might refer to a group
+ chat room.
+
+ "org" for a vCard representing an organization. An organization
+ vCard will not (in fact, MUST NOT) contain MEMBER properties,
+ and so these are something of a cross between "individual" and
+ "group". An organization is a single entity, but not a person.
+ It might represent a business or government, a department or
+ division within a business or government, a club, an
+ association, or the like.
+
+ All properties in an organization vCard apply to the
+ organization as a whole, as is the case with a group vCard.
+ For example, an EMAIL property might specify the address of a
+ contact point for the organization.
+
+
+
+
+
+
+
+
+Perreault Standards Track [Page 25]
+
+RFC 6350 vCard August 2011
+
+
+ "location" for a named geographical place. A location vCard will
+ usually contain a GEO property, but it is not required to. A
+ location vCard without a GEO property can be considered an
+ abstract location, or one whose definition is known empirically
+ (perhaps "New England" or "The Seashore").
+
+ All properties in a location vCard apply to the location
+ itself, and not with any entity that might exist at that
+ location. For example, in a vCard for an office building, an
+ ADR property might give the mailing address for the building,
+ and a TEL property might specify the telephone number of the
+ receptionist.
+
+ An x-name. vCards MAY include private or experimental values for
+ KIND. Remember that x-name values are not intended for general
+ use and are unlikely to interoperate.
+
+ An iana-token. Additional values may be registered with IANA (see
+ Section 10.3.4). A new value's specification document MUST
+ specify which properties make sense for that new kind of vCard
+ and which do not.
+
+ Implementations MUST support the specific string values defined
+ above. If this property is absent, "individual" MUST be assumed
+ as the default. If this property is present but the
+ implementation does not understand its value (the value is an
+ x-name or iana-token that the implementation does not support),
+ the implementation SHOULD act in a neutral way, which usually
+ means treating the vCard as though its kind were "individual".
+ The presence of MEMBER properties MAY, however, be taken as an
+ indication that the unknown kind is an extension of "group".
+
+ Clients often need to visually distinguish contacts based on what
+ they represent, and the KIND property provides a direct way for
+ them to do so. For example, when displaying contacts in a list,
+ an icon could be displayed next to each one, using distinctive
+ icons for the different kinds; a client might use an outline of a
+ single person to represent an "individual", an outline of multiple
+ people to represent a "group", and so on. Alternatively, or in
+ addition, a client might choose to segregate different kinds of
+ vCards to different panes, tabs, or selections in the user
+ interface.
+
+ Some clients might also make functional distinctions among the
+ kinds, ignoring "location" vCards for some purposes and
+ considering only "location" vCards for others.
+
+
+
+
+
+Perreault Standards Track [Page 26]
+
+RFC 6350 vCard August 2011
+
+
+ When designing those sorts of visual and functional distinctions,
+ client implementations have to decide how to fit unsupported kinds
+ into the scheme. What icon is used for them? The one for
+ "individual"? A unique one, such as an icon of a question mark?
+ Which tab do they go into? It is beyond the scope of this
+ specification to answer these questions, but these are things
+ implementers need to consider.
+
+ ABNF:
+
+ KIND-param = "VALUE=text" / any-param
+ KIND-value = "individual" / "group" / "org" / "location"
+ / iana-token / x-name
+
+ Example:
+
+ This represents someone named Jane Doe working in the marketing
+ department of the North American division of ABC Inc.
+
+ BEGIN:VCARD
+ VERSION:4.0
+ KIND:individual
+ FN:Jane Doe
+ ORG:ABC\, Inc.;North American Division;Marketing
+ END:VCARD
+
+ This represents the department itself, commonly known as ABC
+ Marketing.
+
+ BEGIN:VCARD
+ VERSION:4.0
+ KIND:org
+ FN:ABC Marketing
+ ORG:ABC\, Inc.;North American Division;Marketing
+ END:VCARD
+
+6.1.5. XML
+
+ Purpose: To include extended XML-encoded vCard data in a plain
+ vCard.
+
+ Value type: A single text value.
+
+ Cardinality: *
+
+ Special notes: The content of this property is a single XML 1.0
+ [W3C.REC-xml-20081126] element whose namespace MUST be explicitly
+ specified using the xmlns attribute and MUST NOT be the vCard 4
+
+
+
+Perreault Standards Track [Page 27]
+
+RFC 6350 vCard August 2011
+
+
+ namespace ("urn:ietf:params:xml:ns:vcard-4.0"). (This implies
+ that it cannot duplicate a standard vCard property.) The element
+ is to be interpreted as if it was contained in a <vcard> element,
+ as defined in [RFC6351].
+
+ The fragment is subject to normal line folding and escaping, i.e.,
+ replace all backslashes with "\\", then replace all newlines with
+ "\n", then fold long lines.
+
+ Support for this property is OPTIONAL, but implementations of this
+ specification MUST preserve instances of this property when
+ propagating vCards.
+
+ See [RFC6351] for more information on the intended use of this
+ property.
+
+ ABNF:
+
+ XML-param = "VALUE=text" / altid-param
+ XML-value = text
+
+6.2. Identification Properties
+
+ These types are used to capture information associated with the
+ identification and naming of the entity associated with the vCard.
+
+6.2.1. FN
+
+ Purpose: To specify the formatted text corresponding to the name of
+ the object the vCard represents.
+
+ Value type: A single text value.
+
+ Cardinality: 1*
+
+ Special notes: This property is based on the semantics of the X.520
+ Common Name attribute [CCITT.X520.1988]. The property MUST be
+ present in the vCard object.
+
+ ABNF:
+
+ FN-param = "VALUE=text" / type-param / language-param / altid-param
+ / pid-param / pref-param / any-param
+ FN-value = text
+
+ Example:
+
+ FN:Mr. John Q. Public\, Esq.
+
+
+
+Perreault Standards Track [Page 28]
+
+RFC 6350 vCard August 2011
+
+
+6.2.2. N
+
+ Purpose: To specify the components of the name of the object the
+ vCard represents.
+
+ Value type: A single structured text value. Each component can have
+ multiple values.
+
+ Cardinality: *1
+
+ Special note: The structured property value corresponds, in
+ sequence, to the Family Names (also known as surnames), Given
+ Names, Additional Names, Honorific Prefixes, and Honorific
+ Suffixes. The text components are separated by the SEMICOLON
+ character (U+003B). Individual text components can include
+ multiple text values separated by the COMMA character (U+002C).
+ This property is based on the semantics of the X.520 individual
+ name attributes [CCITT.X520.1988]. The property SHOULD be present
+ in the vCard object when the name of the object the vCard
+ represents follows the X.520 model.
+
+ The SORT-AS parameter MAY be applied to this property.
+
+ ABNF:
+
+ N-param = "VALUE=text" / sort-as-param / language-param
+ / altid-param / any-param
+ N-value = list-component 4(";" list-component)
+
+ Examples:
+
+ N:Public;John;Quinlan;Mr.;Esq.
+
+ N:Stevenson;John;Philip,Paul;Dr.;Jr.,M.D.,A.C.P.
+
+6.2.3. NICKNAME
+
+ Purpose: To specify the text corresponding to the nickname of the
+ object the vCard represents.
+
+ Value type: One or more text values separated by a COMMA character
+ (U+002C).
+
+ Cardinality: *
+
+
+
+
+
+
+
+Perreault Standards Track [Page 29]
+
+RFC 6350 vCard August 2011
+
+
+ Special note: The nickname is the descriptive name given instead of
+ or in addition to the one belonging to the object the vCard
+ represents. It can also be used to specify a familiar form of a
+ proper name specified by the FN or N properties.
+
+ ABNF:
+
+ NICKNAME-param = "VALUE=text" / type-param / language-param
+ / altid-param / pid-param / pref-param / any-param
+ NICKNAME-value = text-list
+
+ Examples:
+
+ NICKNAME:Robbie
+
+ NICKNAME:Jim,Jimmie
+
+ NICKNAME;TYPE=work:Boss
+
+6.2.4. PHOTO
+
+ Purpose: To specify an image or photograph information that
+ annotates some aspect of the object the vCard represents.
+
+ Value type: A single URI.
+
+ Cardinality: *
+
+ ABNF:
+
+ PHOTO-param = "VALUE=uri" / altid-param / type-param
+ / mediatype-param / pref-param / pid-param / any-param
+ PHOTO-value = URI
+
+ Examples:
+
+ PHOTO:http://www.example.com/pub/photos/jqpublic.gif
+
+ PHOTO:data:image/jpeg;base64,MIICajCCAdOgAwIBAgICBEUwDQYJKoZIhv
+ AQEEBQAwdzELMAkGA1UEBhMCVVMxLDAqBgNVBAoTI05ldHNjYXBlIENvbW11bm
+ ljYXRpb25zIENvcnBvcmF0aW9uMRwwGgYDVQQLExNJbmZvcm1hdGlvbiBTeXN0
+ <...remainder of base64-encoded data...>
+
+6.2.5. BDAY
+
+ Purpose: To specify the birth date of the object the vCard
+ represents.
+
+
+
+
+Perreault Standards Track [Page 30]
+
+RFC 6350 vCard August 2011
+
+
+ Value type: The default is a single date-and-or-time value. It can
+ also be reset to a single text value.
+
+ Cardinality: *1
+
+ ABNF:
+
+ BDAY-param = BDAY-param-date / BDAY-param-text
+ BDAY-value = date-and-or-time / text
+ ; Value and parameter MUST match.
+
+ BDAY-param-date = "VALUE=date-and-or-time"
+ BDAY-param-text = "VALUE=text" / language-param
+
+ BDAY-param =/ altid-param / calscale-param / any-param
+ ; calscale-param can only be present when BDAY-value is
+ ; date-and-or-time and actually contains a date or date-time.
+
+ Examples:
+
+ BDAY:19960415
+ BDAY:--0415
+ BDAY;19531015T231000Z
+ BDAY;VALUE=text:circa 1800
+
+6.2.6. ANNIVERSARY
+
+ Purpose: The date of marriage, or equivalent, of the object the
+ vCard represents.
+
+ Value type: The default is a single date-and-or-time value. It can
+ also be reset to a single text value.
+
+ Cardinality: *1
+
+ ABNF:
+
+ ANNIVERSARY-param = "VALUE=" ("date-and-or-time" / "text")
+ ANNIVERSARY-value = date-and-or-time / text
+ ; Value and parameter MUST match.
+
+ ANNIVERSARY-param =/ altid-param / calscale-param / any-param
+ ; calscale-param can only be present when ANNIVERSARY-value is
+ ; date-and-or-time and actually contains a date or date-time.
+
+ Examples:
+
+ ANNIVERSARY:19960415
+
+
+
+Perreault Standards Track [Page 31]
+
+RFC 6350 vCard August 2011
+
+
+6.2.7. GENDER
+
+ Purpose: To specify the components of the sex and gender identity of
+ the object the vCard represents.
+
+ Value type: A single structured value with two components. Each
+ component has a single text value.
+
+ Cardinality: *1
+
+ Special notes: The components correspond, in sequence, to the sex
+ (biological), and gender identity. Each component is optional.
+
+ Sex component: A single letter. M stands for "male", F stands
+ for "female", O stands for "other", N stands for "none or not
+ applicable", U stands for "unknown".
+
+ Gender identity component: Free-form text.
+
+ ABNF:
+
+ GENDER-param = "VALUE=text" / any-param
+ GENDER-value = sex [";" text]
+
+ sex = "" / "M" / "F" / "O" / "N" / "U"
+
+ Examples:
+
+ GENDER:M
+ GENDER:F
+ GENDER:M;Fellow
+ GENDER:F;grrrl
+ GENDER:O;intersex
+ GENDER:;it's complicated
+
+6.3. Delivery Addressing Properties
+
+ These types are concerned with information related to the delivery
+ addressing or label for the vCard object.
+
+6.3.1. ADR
+
+ Purpose: To specify the components of the delivery address for the
+ vCard object.
+
+ Value type: A single structured text value, separated by the
+ SEMICOLON character (U+003B).
+
+
+
+
+Perreault Standards Track [Page 32]
+
+RFC 6350 vCard August 2011
+
+
+ Cardinality: *
+
+ Special notes: The structured type value consists of a sequence of
+ address components. The component values MUST be specified in
+ their corresponding position. The structured type value
+ corresponds, in sequence, to
+ the post office box;
+ the extended address (e.g., apartment or suite number);
+ the street address;
+ the locality (e.g., city);
+ the region (e.g., state or province);
+ the postal code;
+ the country name (full name in the language specified in
+ Section 5.1).
+
+ When a component value is missing, the associated component
+ separator MUST still be specified.
+
+ Experience with vCard 3 has shown that the first two components
+ (post office box and extended address) are plagued with many
+ interoperability issues. To ensure maximal interoperability,
+ their values SHOULD be empty.
+
+ The text components are separated by the SEMICOLON character
+ (U+003B). Where it makes semantic sense, individual text
+ components can include multiple text values (e.g., a "street"
+ component with multiple lines) separated by the COMMA character
+ (U+002C).
+
+ The property can include the "PREF" parameter to indicate the
+ preferred delivery address when more than one address is
+ specified.
+
+ The GEO and TZ parameters MAY be used with this property.
+
+ The property can also include a "LABEL" parameter to present a
+ delivery address label for the address. Its value is a plain-text
+ string representing the formatted address. Newlines are encoded
+ as \n, as they are for property values.
+
+ ABNF:
+
+ label-param = "LABEL=" param-value
+
+ ADR-param = "VALUE=text" / label-param / language-param
+ / geo-parameter / tz-parameter / altid-param / pid-param
+ / pref-param / type-param / any-param
+
+
+
+
+Perreault Standards Track [Page 33]
+
+RFC 6350 vCard August 2011
+
+
+ ADR-value = ADR-component-pobox ";" ADR-component-ext ";"
+ ADR-component-street ";" ADR-component-locality ";"
+ ADR-component-region ";" ADR-component-code ";"
+ ADR-component-country
+ ADR-component-pobox = list-component
+ ADR-component-ext = list-component
+ ADR-component-street = list-component
+ ADR-component-locality = list-component
+ ADR-component-region = list-component
+ ADR-component-code = list-component
+ ADR-component-country = list-component
+
+ Example: In this example, the post office box and the extended
+ address are absent.
+
+ ADR;GEO="geo:12.3457,78.910";LABEL="Mr. John Q. Public, Esq.\n
+ Mail Drop: TNE QB\n123 Main Street\nAny Town, CA 91921-1234\n
+ U.S.A.":;;123 Main Street;Any Town;CA;91921-1234;U.S.A.
+
+6.4. Communications Properties
+
+ These properties describe information about how to communicate with
+ the object the vCard represents.
+
+6.4.1. TEL
+
+ Purpose: To specify the telephone number for telephony communication
+ with the object the vCard represents.
+
+ Value type: By default, it is a single free-form text value (for
+ backward compatibility with vCard 3), but it SHOULD be reset to a
+ URI value. It is expected that the URI scheme will be "tel", as
+ specified in [RFC3966], but other schemes MAY be used.
+
+ Cardinality: *
+
+ Special notes: This property is based on the X.520 Telephone Number
+ attribute [CCITT.X520.1988].
+
+ The property can include the "PREF" parameter to indicate a
+ preferred-use telephone number.
+
+ The property can include the parameter "TYPE" to specify intended
+ use for the telephone number. The predefined values for the TYPE
+ parameter are:
+
+
+
+
+
+
+Perreault Standards Track [Page 34]
+
+RFC 6350 vCard August 2011
+
+
+ +-----------+-------------------------------------------------------+
+ | Value | Description |
+ +-----------+-------------------------------------------------------+
+ | text | Indicates that the telephone number supports text |
+ | | messages (SMS). |
+ | voice | Indicates a voice telephone number. |
+ | fax | Indicates a facsimile telephone number. |
+ | cell | Indicates a cellular or mobile telephone number. |
+ | video | Indicates a video conferencing telephone number. |
+ | pager | Indicates a paging device telephone number. |
+ | textphone | Indicates a telecommunication device for people with |
+ | | hearing or speech difficulties. |
+ +-----------+-------------------------------------------------------+
+
+ The default type is "voice". These type parameter values can be
+ specified as a parameter list (e.g., TYPE=text;TYPE=voice) or as a
+ value list (e.g., TYPE="text,voice"). The default can be
+ overridden to another set of values by specifying one or more
+ alternate values. For example, the default TYPE of "voice" can be
+ reset to a VOICE and FAX telephone number by the value list
+ TYPE="voice,fax".
+
+ If this property's value is a URI that can also be used for
+ instant messaging, the IMPP (Section 6.4.3) property SHOULD be
+ used in addition to this property.
+
+ ABNF:
+
+ TEL-param = TEL-text-param / TEL-uri-param
+ TEL-value = TEL-text-value / TEL-uri-value
+ ; Value and parameter MUST match.
+
+ TEL-text-param = "VALUE=text"
+ TEL-text-value = text
+
+ TEL-uri-param = "VALUE=uri" / mediatype-param
+ TEL-uri-value = URI
+
+ TEL-param =/ type-param / pid-param / pref-param / altid-param
+ / any-param
+
+ type-param-tel = "text" / "voice" / "fax" / "cell" / "video"
+ / "pager" / "textphone" / iana-token / x-name
+ ; type-param-tel MUST NOT be used with a property other than TEL.
+
+
+
+
+
+
+
+Perreault Standards Track [Page 35]
+
+RFC 6350 vCard August 2011
+
+
+ Example:
+
+ TEL;VALUE=uri;PREF=1;TYPE="voice,home":tel:+1-555-555-5555;ext=5555
+ TEL;VALUE=uri;TYPE=home:tel:+33-01-23-45-67
+
+6.4.2. EMAIL
+
+ Purpose: To specify the electronic mail address for communication
+ with the object the vCard represents.
+
+ Value type: A single text value.
+
+ Cardinality: *
+
+ Special notes: The property can include tye "PREF" parameter to
+ indicate a preferred-use email address when more than one is
+ specified.
+
+ Even though the value is free-form UTF-8 text, it is likely to be
+ interpreted by a Mail User Agent (MUA) as an "addr-spec", as
+ defined in [RFC5322], Section 3.4.1. Readers should also be aware
+ of the current work toward internationalized email addresses
+ [RFC5335bis].
+
+ ABNF:
+
+ EMAIL-param = "VALUE=text" / pid-param / pref-param / type-param
+ / altid-param / any-param
+ EMAIL-value = text
+
+ Example:
+
+ EMAIL;TYPE=work:jqpublic@xyz.example.com
+
+ EMAIL;PREF=1:jane_doe@example.com
+
+6.4.3. IMPP
+
+ Purpose: To specify the URI for instant messaging and presence
+ protocol communications with the object the vCard represents.
+
+ Value type: A single URI.
+
+ Cardinality: *
+
+ Special notes: The property may include the "PREF" parameter to
+ indicate that this is a preferred address and has the same
+ semantics as the "PREF" parameter in a TEL property.
+
+
+
+Perreault Standards Track [Page 36]
+
+RFC 6350 vCard August 2011
+
+
+ If this property's value is a URI that can be used for voice
+ and/or video, the TEL property (Section 6.4.1) SHOULD be used in
+ addition to this property.
+
+ This property is adapted from [RFC4770], which is made obsolete by
+ this document.
+
+ ABNF:
+
+ IMPP-param = "VALUE=uri" / pid-param / pref-param / type-param
+ / mediatype-param / altid-param / any-param
+ IMPP-value = URI
+
+ Example:
+
+ IMPP;PREF=1:xmpp:alice@example.com
+
+6.4.4. LANG
+
+ Purpose: To specify the language(s) that may be used for contacting
+ the entity associated with the vCard.
+
+ Value type: A single language-tag value.
+
+ Cardinality: *
+
+ ABNF:
+
+ LANG-param = "VALUE=language-tag" / pid-param / pref-param
+ / altid-param / type-param / any-param
+ LANG-value = Language-Tag
+
+ Example:
+
+ LANG;TYPE=work;PREF=1:en
+ LANG;TYPE=work;PREF=2:fr
+ LANG;TYPE=home:fr
+
+6.5. Geographical Properties
+
+ These properties are concerned with information associated with
+ geographical positions or regions associated with the object the
+ vCard represents.
+
+6.5.1. TZ
+
+ Purpose: To specify information related to the time zone of the
+ object the vCard represents.
+
+
+
+Perreault Standards Track [Page 37]
+
+RFC 6350 vCard August 2011
+
+
+ Value type: The default is a single text value. It can also be
+ reset to a single URI or utc-offset value.
+
+ Cardinality: *
+
+ Special notes: It is expected that names from the public-domain
+ Olson database [TZ-DB] will be used, but this is not a
+ restriction. See also [IANA-TZ].
+
+ Efforts are currently being directed at creating a standard URI
+ scheme for expressing time zone information. Usage of such a
+ scheme would ensure a high level of interoperability between
+ implementations that support it.
+
+ Note that utc-offset values SHOULD NOT be used because the UTC
+ offset varies with time -- not just because of the usual daylight
+ saving time shifts that occur in may regions, but often entire
+ regions will "re-base" their overall offset. The actual offset
+ may be +/- 1 hour (or perhaps a little more) than the one given.
+
+ ABNF:
+
+ TZ-param = "VALUE=" ("text" / "uri" / "utc-offset")
+ TZ-value = text / URI / utc-offset
+ ; Value and parameter MUST match.
+
+ TZ-param =/ altid-param / pid-param / pref-param / type-param
+ / mediatype-param / any-param
+
+ Examples:
+
+ TZ:Raleigh/North America
+
+ TZ;VALUE=utc-offset:-0500
+ ; Note: utc-offset format is NOT RECOMMENDED.
+
+6.5.2. GEO
+
+ Purpose: To specify information related to the global positioning of
+ the object the vCard represents.
+
+ Value type: A single URI.
+
+ Cardinality: *
+
+ Special notes: The "geo" URI scheme [RFC5870] is particularly well
+ suited for this property, but other schemes MAY be used.
+
+
+
+
+Perreault Standards Track [Page 38]
+
+RFC 6350 vCard August 2011
+
+
+ ABNF:
+
+ GEO-param = "VALUE=uri" / pid-param / pref-param / type-param
+ / mediatype-param / altid-param / any-param
+ GEO-value = URI
+
+ Example:
+
+ GEO:geo:37.386013,-122.082932
+
+6.6. Organizational Properties
+
+ These properties are concerned with information associated with
+ characteristics of the organization or organizational units of the
+ object that the vCard represents.
+
+6.6.1. TITLE
+
+ Purpose: To specify the position or job of the object the vCard
+ represents.
+
+ Value type: A single text value.
+
+ Cardinality: *
+
+ Special notes: This property is based on the X.520 Title attribute
+ [CCITT.X520.1988].
+
+ ABNF:
+
+ TITLE-param = "VALUE=text" / language-param / pid-param
+ / pref-param / altid-param / type-param / any-param
+ TITLE-value = text
+
+ Example:
+
+ TITLE:Research Scientist
+
+6.6.2. ROLE
+
+ Purpose: To specify the function or part played in a particular
+ situation by the object the vCard represents.
+
+ Value type: A single text value.
+
+ Cardinality: *
+
+
+
+
+
+Perreault Standards Track [Page 39]
+
+RFC 6350 vCard August 2011
+
+
+ Special notes: This property is based on the X.520 Business Category
+ explanatory attribute [CCITT.X520.1988]. This property is
+ included as an organizational type to avoid confusion with the
+ semantics of the TITLE property and incorrect usage of that
+ property when the semantics of this property is intended.
+
+ ABNF:
+
+ ROLE-param = "VALUE=text" / language-param / pid-param / pref-param
+ / type-param / altid-param / any-param
+ ROLE-value = text
+
+ Example:
+
+ ROLE:Project Leader
+
+6.6.3. LOGO
+
+ Purpose: To specify a graphic image of a logo associated with the
+ object the vCard represents.
+
+ Value type: A single URI.
+
+ Cardinality: *
+
+ ABNF:
+
+ LOGO-param = "VALUE=uri" / language-param / pid-param / pref-param
+ / type-param / mediatype-param / altid-param / any-param
+ LOGO-value = URI
+
+ Examples:
+
+ LOGO:http://www.example.com/pub/logos/abccorp.jpg
+
+ LOGO:data:image/jpeg;base64,MIICajCCAdOgAwIBAgICBEUwDQYJKoZIhvc
+ AQEEBQAwdzELMAkGA1UEBhMCVVMxLDAqBgNVBAoTI05ldHNjYXBlIENvbW11bm
+ ljYXRpb25zIENvcnBvcmF0aW9uMRwwGgYDVQQLExNJbmZvcm1hdGlvbiBTeXN0
+ <...the remainder of base64-encoded data...>
+
+6.6.4. ORG
+
+ Purpose: To specify the organizational name and units associated
+ with the vCard.
+
+ Value type: A single structured text value consisting of components
+ separated by the SEMICOLON character (U+003B).
+
+
+
+
+Perreault Standards Track [Page 40]
+
+RFC 6350 vCard August 2011
+
+
+ Cardinality: *
+
+ Special notes: The property is based on the X.520 Organization Name
+ and Organization Unit attributes [CCITT.X520.1988]. The property
+ value is a structured type consisting of the organization name,
+ followed by zero or more levels of organizational unit names.
+
+ The SORT-AS parameter MAY be applied to this property.
+
+ ABNF:
+
+ ORG-param = "VALUE=text" / sort-as-param / language-param
+ / pid-param / pref-param / altid-param / type-param
+ / any-param
+ ORG-value = component *(";" component)
+
+ Example: A property value consisting of an organizational name,
+ organizational unit #1 name, and organizational unit #2 name.
+
+ ORG:ABC\, Inc.;North American Division;Marketing
+
+6.6.5. MEMBER
+
+ Purpose: To include a member in the group this vCard represents.
+
+ Value type: A single URI. It MAY refer to something other than a
+ vCard object. For example, an email distribution list could
+ employ the "mailto" URI scheme [RFC6068] for efficiency.
+
+ Cardinality: *
+
+ Special notes: This property MUST NOT be present unless the value of
+ the KIND property is "group".
+
+ ABNF:
+
+ MEMBER-param = "VALUE=uri" / pid-param / pref-param / altid-param
+ / mediatype-param / any-param
+ MEMBER-value = URI
+
+
+
+
+
+
+
+
+
+
+
+
+Perreault Standards Track [Page 41]
+
+RFC 6350 vCard August 2011
+
+
+ Examples:
+
+ BEGIN:VCARD
+ VERSION:4.0
+ KIND:group
+ FN:The Doe family
+ MEMBER:urn:uuid:03a0e51f-d1aa-4385-8a53-e29025acd8af
+ MEMBER:urn:uuid:b8767877-b4a1-4c70-9acc-505d3819e519
+ END:VCARD
+ BEGIN:VCARD
+ VERSION:4.0
+ FN:John Doe
+ UID:urn:uuid:03a0e51f-d1aa-4385-8a53-e29025acd8af
+ END:VCARD
+ BEGIN:VCARD
+ VERSION:4.0
+ FN:Jane Doe
+ UID:urn:uuid:b8767877-b4a1-4c70-9acc-505d3819e519
+ END:VCARD
+
+ BEGIN:VCARD
+ VERSION:4.0
+ KIND:group
+ FN:Funky distribution list
+ MEMBER:mailto:subscriber1@example.com
+ MEMBER:xmpp:subscriber2@example.com
+ MEMBER:sip:subscriber3@example.com
+ MEMBER:tel:+1-418-555-5555
+ END:VCARD
+
+6.6.6. RELATED
+
+ Purpose: To specify a relationship between another entity and the
+ entity represented by this vCard.
+
+ Value type: A single URI. It can also be reset to a single text
+ value. The text value can be used to specify textual information.
+
+ Cardinality: *
+
+ Special notes: The TYPE parameter MAY be used to characterize the
+ related entity. It contains a comma-separated list of values that
+ are registered with IANA as described in Section 10.2. The
+ registry is pre-populated with the values defined in [xfn]. This
+ document also specifies two additional values:
+
+ agent: an entity who may sometimes act on behalf of the entity
+ associated with the vCard.
+
+
+
+Perreault Standards Track [Page 42]
+
+RFC 6350 vCard August 2011
+
+
+ emergency: indicates an emergency contact
+
+ ABNF:
+
+ RELATED-param = RELATED-param-uri / RELATED-param-text
+ RELATED-value = URI / text
+ ; Parameter and value MUST match.
+
+ RELATED-param-uri = "VALUE=uri" / mediatype-param
+ RELATED-param-text = "VALUE=text" / language-param
+
+ RELATED-param =/ pid-param / pref-param / altid-param / type-param
+ / any-param
+
+ type-param-related = related-type-value *("," related-type-value)
+ ; type-param-related MUST NOT be used with a property other than
+ ; RELATED.
+
+ related-type-value = "contact" / "acquaintance" / "friend" / "met"
+ / "co-worker" / "colleague" / "co-resident"
+ / "neighbor" / "child" / "parent"
+ / "sibling" / "spouse" / "kin" / "muse"
+ / "crush" / "date" / "sweetheart" / "me"
+ / "agent" / "emergency"
+
+ Examples:
+
+ RELATED;TYPE=friend:urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6
+ RELATED;TYPE=contact:http://example.com/directory/jdoe.vcf
+ RELATED;TYPE=co-worker;VALUE=text:Please contact my assistant Jane
+ Doe for any inquiries.
+
+6.7. Explanatory Properties
+
+ These properties are concerned with additional explanations, such as
+ that related to informational notes or revisions specific to the
+ vCard.
+
+6.7.1. CATEGORIES
+
+ Purpose: To specify application category information about the
+ vCard, also known as "tags".
+
+ Value type: One or more text values separated by a COMMA character
+ (U+002C).
+
+ Cardinality: *
+
+
+
+
+Perreault Standards Track [Page 43]
+
+RFC 6350 vCard August 2011
+
+
+ ABNF:
+
+ CATEGORIES-param = "VALUE=text" / pid-param / pref-param
+ / type-param / altid-param / any-param
+ CATEGORIES-value = text-list
+
+ Example:
+
+ CATEGORIES:TRAVEL AGENT
+
+ CATEGORIES:INTERNET,IETF,INDUSTRY,INFORMATION TECHNOLOGY
+
+6.7.2. NOTE
+
+ Purpose: To specify supplemental information or a comment that is
+ associated with the vCard.
+
+ Value type: A single text value.
+
+ Cardinality: *
+
+ Special notes: The property is based on the X.520 Description
+ attribute [CCITT.X520.1988].
+
+ ABNF:
+
+ NOTE-param = "VALUE=text" / language-param / pid-param / pref-param
+ / type-param / altid-param / any-param
+ NOTE-value = text
+
+ Example:
+
+ NOTE:This fax number is operational 0800 to 1715
+ EST\, Mon-Fri.
+
+6.7.3. PRODID
+
+ Purpose: To specify the identifier for the product that created the
+ vCard object.
+
+ Type value: A single text value.
+
+ Cardinality: *1
+
+ Special notes: Implementations SHOULD use a method such as that
+ specified for Formal Public Identifiers in [ISO9070] or for
+ Universal Resource Names in [RFC3406] to ensure that the text
+ value is unique.
+
+
+
+Perreault Standards Track [Page 44]
+
+RFC 6350 vCard August 2011
+
+
+ ABNF:
+
+ PRODID-param = "VALUE=text" / any-param
+ PRODID-value = text
+
+ Example:
+
+ PRODID:-//ONLINE DIRECTORY//NONSGML Version 1//EN
+
+6.7.4. REV
+
+ Purpose: To specify revision information about the current vCard.
+
+ Value type: A single timestamp value.
+
+ Cardinality: *1
+
+ Special notes: The value distinguishes the current revision of the
+ information in this vCard for other renditions of the information.
+
+ ABNF:
+
+ REV-param = "VALUE=timestamp" / any-param
+ REV-value = timestamp
+
+ Example:
+
+ REV:19951031T222710Z
+
+6.7.5. SOUND
+
+ Purpose: To specify a digital sound content information that
+ annotates some aspect of the vCard. This property is often used
+ to specify the proper pronunciation of the name property value of
+ the vCard.
+
+ Value type: A single URI.
+
+ Cardinality: *
+
+ ABNF:
+
+ SOUND-param = "VALUE=uri" / language-param / pid-param / pref-param
+ / type-param / mediatype-param / altid-param
+ / any-param
+ SOUND-value = URI
+
+
+
+
+
+Perreault Standards Track [Page 45]
+
+RFC 6350 vCard August 2011
+
+
+ Example:
+
+ SOUND:CID:JOHNQPUBLIC.part8.19960229T080000.xyzMail@example.com
+
+ SOUND:data:audio/basic;base64,MIICajCCAdOgAwIBAgICBEUwDQYJKoZIh
+ AQEEBQAwdzELMAkGA1UEBhMCVVMxLDAqBgNVBAoTI05ldHNjYXBlIENvbW11bm
+ ljYXRpb25zIENvcnBvcmF0aW9uMRwwGgYDVQQLExNJbmZvcm1hdGlvbiBTeXN0
+ <...the remainder of base64-encoded data...>
+
+6.7.6. UID
+
+ Purpose: To specify a value that represents a globally unique
+ identifier corresponding to the entity associated with the vCard.
+
+ Value type: A single URI value. It MAY also be reset to free-form
+ text.
+
+ Cardinality: *1
+
+ Special notes: This property is used to uniquely identify the object
+ that the vCard represents. The "uuid" URN namespace defined in
+ [RFC4122] is particularly well suited to this task, but other URI
+ schemes MAY be used. Free-form text MAY also be used.
+
+ ABNF:
+
+ UID-param = UID-uri-param / UID-text-param
+ UID-value = UID-uri-value / UID-text-value
+ ; Value and parameter MUST match.
+
+ UID-uri-param = "VALUE=uri"
+ UID-uri-value = URI
+
+ UID-text-param = "VALUE=text"
+ UID-text-value = text
+
+ UID-param =/ any-param
+
+ Example:
+
+ UID:urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6
+
+
+
+
+
+
+
+
+
+
+Perreault Standards Track [Page 46]
+
+RFC 6350 vCard August 2011
+
+
+6.7.7. CLIENTPIDMAP
+
+ Purpose: To give a global meaning to a local PID source identifier.
+
+ Value type: A semicolon-separated pair of values. The first field
+ is a small integer corresponding to the second field of a PID
+ parameter instance. The second field is a URI. The "uuid" URN
+ namespace defined in [RFC4122] is particularly well suited to this
+ task, but other URI schemes MAY be used.
+
+ Cardinality: *
+
+ Special notes: PID source identifiers (the source identifier is the
+ second field in a PID parameter instance) are small integers that
+ only have significance within the scope of a single vCard
+ instance. Each distinct source identifier present in a vCard MUST
+ have an associated CLIENTPIDMAP. See Section 7 for more details
+ on the usage of CLIENTPIDMAP.
+
+ PID source identifiers MUST be strictly positive. Zero is not
+ allowed.
+
+ As a special exception, the PID parameter MUST NOT be applied to
+ this property.
+
+ ABNF:
+
+ CLIENTPIDMAP-param = any-param
+ CLIENTPIDMAP-value = 1*DIGIT ";" URI
+
+ Example:
+
+ TEL;PID=3.1,4.2;VALUE=uri:tel:+1-555-555-5555
+ EMAIL;PID=4.1,5.2:jdoe@example.com
+ CLIENTPIDMAP:1;urn:uuid:3df403f4-5924-4bb7-b077-3c711d9eb34b
+ CLIENTPIDMAP:2;urn:uuid:d89c9c7a-2e1b-4832-82de-7e992d95faa5
+
+6.7.8. URL
+
+ Purpose: To specify a uniform resource locator associated with the
+ object to which the vCard refers. Examples for individuals
+ include personal web sites, blogs, and social networking site
+ identifiers.
+
+ Cardinality: *
+
+ Value type: A single uri value.
+
+
+
+
+Perreault Standards Track [Page 47]
+
+RFC 6350 vCard August 2011
+
+
+ ABNF:
+
+ URL-param = "VALUE=uri" / pid-param / pref-param / type-param
+ / mediatype-param / altid-param / any-param
+ URL-value = URI
+
+ Example:
+
+ URL:http://example.org/restaurant.french/~chezchic.html
+
+6.7.9. VERSION
+
+ Purpose: To specify the version of the vCard specification used to
+ format this vCard.
+
+ Value type: A single text value.
+
+ Cardinality: 1
+
+ Special notes: This property MUST be present in the vCard object,
+ and it must appear immediately after BEGIN:VCARD. The value MUST
+ be "4.0" if the vCard corresponds to this specification. Note
+ that earlier versions of vCard allowed this property to be placed
+ anywhere in the vCard object, or even to be absent.
+
+ ABNF:
+
+ VERSION-param = "VALUE=text" / any-param
+ VERSION-value = "4.0"
+
+ Example:
+
+ VERSION:4.0
+
+6.8. Security Properties
+
+ These properties are concerned with the security of communication
+ pathways or access to the vCard.
+
+6.8.1. KEY
+
+ Purpose: To specify a public key or authentication certificate
+ associated with the object that the vCard represents.
+
+ Value type: A single URI. It can also be reset to a text value.
+
+ Cardinality: *
+
+
+
+
+Perreault Standards Track [Page 48]
+
+RFC 6350 vCard August 2011
+
+
+ ABNF:
+
+ KEY-param = KEY-uri-param / KEY-text-param
+ KEY-value = KEY-uri-value / KEY-text-value
+ ; Value and parameter MUST match.
+
+ KEY-uri-param = "VALUE=uri" / mediatype-param
+ KEY-uri-value = URI
+
+ KEY-text-param = "VALUE=text"
+ KEY-text-value = text
+
+ KEY-param =/ altid-param / pid-param / pref-param / type-param
+ / any-param
+
+ Examples:
+
+ KEY:http://www.example.com/keys/jdoe.cer
+
+ KEY;MEDIATYPE=application/pgp-keys:ftp://example.com/keys/jdoe
+
+ KEY:data:application/pgp-keys;base64,MIICajCCAdOgAwIBAgICBE
+ UwDQYJKoZIhvcNAQEEBQAwdzELMAkGA1UEBhMCVVMxLDAqBgNVBAoTI05l
+ <... remainder of base64-encoded data ...>
+
+6.9. Calendar Properties
+
+ These properties are further specified in [RFC2739].
+
+6.9.1. FBURL
+
+ Purpose: To specify the URI for the busy time associated with the
+ object that the vCard represents.
+
+ Value type: A single URI value.
+
+ Cardinality: *
+
+ Special notes: Where multiple FBURL properties are specified, the
+ default FBURL property is indicated with the PREF parameter. The
+ FTP [RFC1738] or HTTP [RFC2616] type of URI points to an iCalendar
+ [RFC5545] object associated with a snapshot of the next few weeks
+ or months of busy time data. If the iCalendar object is
+ represented as a file or document, its file extension should be
+ ".ifb".
+
+
+
+
+
+
+Perreault Standards Track [Page 49]
+
+RFC 6350 vCard August 2011
+
+
+ ABNF:
+
+ FBURL-param = "VALUE=uri" / pid-param / pref-param / type-param
+ / mediatype-param / altid-param / any-param
+ FBURL-value = URI
+
+ Examples:
+
+ FBURL;PREF=1:http://www.example.com/busy/janedoe
+ FBURL;MEDIATYPE=text/calendar:ftp://example.com/busy/project-a.ifb
+
+6.9.2. CALADRURI
+
+ Purpose: To specify the calendar user address [RFC5545] to which a
+ scheduling request [RFC5546] should be sent for the object
+ represented by the vCard.
+
+ Value type: A single URI value.
+
+ Cardinality: *
+
+ Special notes: Where multiple CALADRURI properties are specified,
+ the default CALADRURI property is indicated with the PREF
+ parameter.
+
+ ABNF:
+
+ CALADRURI-param = "VALUE=uri" / pid-param / pref-param / type-param
+ / mediatype-param / altid-param / any-param
+ CALADRURI-value = URI
+
+ Example:
+
+ CALADRURI;PREF=1:mailto:janedoe@example.com
+ CALADRURI:http://example.com/calendar/jdoe
+
+6.9.3. CALURI
+
+ Purpose: To specify the URI for a calendar associated with the
+ object represented by the vCard.
+
+ Value type: A single URI value.
+
+ Cardinality: *
+
+ Special notes: Where multiple CALURI properties are specified, the
+ default CALURI property is indicated with the PREF parameter. The
+ property should contain a URI pointing to an iCalendar [RFC5545]
+
+
+
+Perreault Standards Track [Page 50]
+
+RFC 6350 vCard August 2011
+
+
+ object associated with a snapshot of the user's calendar store.
+ If the iCalendar object is represented as a file or document, its
+ file extension should be ".ics".
+
+ ABNF:
+
+ CALURI-param = "VALUE=uri" / pid-param / pref-param / type-param
+ / mediatype-param / altid-param / any-param
+ CALURI-value = URI
+
+ Examples:
+
+ CALURI;PREF=1:http://cal.example.com/calA
+ CALURI;MEDIATYPE=text/calendar:ftp://ftp.example.com/calA.ics
+
+6.10. Extended Properties and Parameters
+
+ The properties and parameters defined by this document can be
+ extended. Non-standard, private properties and parameters with a
+ name starting with "X-" may be defined bilaterally between two
+ cooperating agents without outside registration or standardization.
+
+7. Synchronization
+
+ vCard data often needs to be synchronized between devices. In this
+ context, synchronization is defined as the intelligent merging of two
+ representations of the same object. vCard 4.0 includes mechanisms to
+ aid this process.
+
+7.1. Mechanisms
+
+ Two mechanisms are available: the UID property is used to match
+ multiple instances of the same vCard, while the PID parameter is used
+ to match multiple instances of the same property.
+
+ The term "matching" is used here to mean recognizing that two
+ instances are in fact representations of the same object. For
+ example, a single vCard that is shared with someone results in two
+ vCard instances. After they have evolved separately, they still
+ represent the same object, and therefore may be matched by a
+ synchronization engine.
+
+7.1.1. Matching vCard Instances
+
+ vCard instances for which the UID properties (Section 6.7.6) are
+ equivalent MUST be matched. Equivalence is determined as specified
+ in [RFC3986], Section 6.
+
+
+
+
+Perreault Standards Track [Page 51]
+
+RFC 6350 vCard August 2011
+
+
+ In all other cases, vCard instances MAY be matched at the discretion
+ of the synchronization engine.
+
+7.1.2. Matching Property Instances
+
+ Property instances belonging to unmatched vCards MUST NOT be matched.
+
+ Property instances whose name (e.g., EMAIL, TEL, etc.) is not the
+ same MUST NOT be matched.
+
+ Property instances whose name is CLIENTPIDMAP are handled separately
+ and MUST NOT be matched. The synchronization MUST ensure that there
+ is consistency of CLIENTPIDMAPs among matched vCard instances.
+
+ Property instances belonging to matched vCards, whose name is the
+ same, and whose maximum cardinality is 1, MUST be matched.
+
+ Property instances belonging to matched vCards, whose name is the
+ same, and whose PID parameters match, MUST be matched. See
+ Section 7.1.3 for details on PID matching.
+
+ In all other cases, property instances MAY be matched at the
+ discretion of the synchronization engine.
+
+7.1.3. PID Matching
+
+ Two PID values for which the first fields are equivalent represent
+ the same local value.
+
+ Two PID values representing the same local value and for which the
+ second fields point to CLIENTPIDMAP properties whose second field
+ URIs are equivalent (as specified in [RFC3986], Section 6) also
+ represent the same global value.
+
+ PID parameters for which at least one pair of their values represent
+ the same global value MUST be matched.
+
+ In all other cases, PID parameters MAY be matched at the discretion
+ of the synchronization engine.
+
+ For example, PID value "5.1", in the first vCard below, and PID value
+ "5.2", in the second vCard below, represent the same global value.
+
+
+
+
+
+
+
+
+
+Perreault Standards Track [Page 52]
+
+RFC 6350 vCard August 2011
+
+
+ BEGIN:VCARD
+ VERSION:4.0
+ EMAIL;PID=4.2,5.1:jdoe@example.com
+ CLIENTPIDMAP:1;urn:uuid:3eef374e-7179-4196-a914-27358c3e6527
+ CLIENTPIDMAP:2;urn:uuid:42bcd5a7-1699-4514-87b4-056edf68e9cc
+ END:VCARD
+
+ BEGIN:VCARD
+ VERSION:4.0
+ EMAIL;PID=5.1,5.2:john@example.com
+ CLIENTPIDMAP:1;urn:uuid:0c75c629-6a8d-4d5e-a07f-1bb35846854d
+ CLIENTPIDMAP:2;urn:uuid:3eef374e-7179-4196-a914-27358c3e6527
+ END:VCARD
+
+7.2. Example
+
+7.2.1. Creation
+
+ The following simple vCard is first created on a given device.
+
+ BEGIN:VCARD
+ VERSION:4.0
+ UID:urn:uuid:4fbe8971-0bc3-424c-9c26-36c3e1eff6b1
+ FN;PID=1.1:J. Doe
+ N:Doe;J.;;;
+ EMAIL;PID=1.1:jdoe@example.com
+ CLIENTPIDMAP:1;urn:uuid:53e374d9-337e-4727-8803-a1e9c14e0556
+ END:VCARD
+
+ This new vCard is assigned the UID
+ "urn:uuid:4fbe8971-0bc3-424c-9c26-36c3e1eff6b1" by the creating
+ device. The FN and EMAIL properties are assigned the same local
+ value of 1, and this value is given global context by associating it
+ with "urn:uuid:53e374d9-337e-4727-8803-a1e9c14e0556", which
+ represents the creating device. We are at liberty to reuse the same
+ local value since instances of different properties will never be
+ matched. The N property has no PID because it is forbidden by its
+ maximum cardinality of 1.
+
+7.2.2. Initial Sharing
+
+ This vCard is shared with a second device. Upon inspecting the UID
+ property, the second device understands that this is a new vCard
+ (i.e., unmatched) and thus the synchronization results in a simple
+ copy.
+
+
+
+
+
+
+Perreault Standards Track [Page 53]
+
+RFC 6350 vCard August 2011
+
+
+7.2.3. Adding and Sharing a Property
+
+ A new phone number is created on the first device, then the vCard is
+ shared with the second device. This is what the second device
+ receives:
+
+ BEGIN:VCARD
+ VERSION:4.0
+ UID:urn:uuid:4fbe8971-0bc3-424c-9c26-36c3e1eff6b1
+ FN;PID=1.1:J. Doe
+ N:Doe;J.;;;
+ EMAIL;PID=1.1:jdoe@example.com
+ TEL;PID=1.1;VALUE=uri:tel:+1-555-555-5555
+ CLIENTPIDMAP:1;urn:uuid:53e374d9-337e-4727-8803-a1e9c14e0556
+ END:VCARD
+
+ Upon inspecting the UID property, the second device matches the vCard
+ it received to the vCard that it already has stored. It then starts
+ comparing the properties of the two vCards in same-named pairs.
+
+ The FN properties are matched because the PID parameters have the
+ same global value. Since the property value is the same, no update
+ takes place.
+
+ The N properties are matched automatically because their maximum
+ cardinality is 1. Since the property value is the same, no update
+ takes place.
+
+ The EMAIL properties are matched because the PID parameters have the
+ same global value. Since the property value is the same, no update
+ takes place.
+
+ The TEL property in the new vCard is not matched to any in the stored
+ vCard because no property in the stored vCard has the same name.
+ Therefore, this property is copied from the new vCard to the stored
+ vCard.
+
+ The CLIENTPIDMAP property is handled separately by the
+ synchronization engine. It ensures that it is consistent with the
+ stored one. If it was not, the results would be up to the
+ synchronization engine, and thus undefined by this document.
+
+7.2.4. Simultaneous Editing
+
+ A new email address and a new phone number are added to the vCard on
+ each of the two devices, and then a new synchronization event
+ happens. Here are the vCards that are communicated to each other:
+
+
+
+
+Perreault Standards Track [Page 54]
+
+RFC 6350 vCard August 2011
+
+
+ BEGIN:VCARD
+ VERSION:4.0
+ UID:urn:uuid:4fbe8971-0bc3-424c-9c26-36c3e1eff6b1
+ FN;PID=1.1:J. Doe
+ N:Doe;J.;;;
+ EMAIL;PID=1.1:jdoe@example.com
+ EMAIL;PID=2.1:boss@example.com
+ TEL;PID=1.1;VALUE=uri:tel:+1-555-555-5555
+ TEL;PID=2.1;VALUE=uri:tel:+1-666-666-6666
+ CLIENTPIDMAP:1;urn:uuid:53e374d9-337e-4727-8803-a1e9c14e0556
+ END:VCARD
+
+ BEGIN:VCARD
+ VERSION:4.0
+ UID:urn:uuid:4fbe8971-0bc3-424c-9c26-36c3e1eff6b1
+ FN;PID=1.1:J. Doe
+ N:Doe;J.;;;
+ EMAIL;PID=1.1:jdoe@example.com
+ EMAIL;PID=2.2:ceo@example.com
+ TEL;PID=1.1;VALUE=uri:tel:+1-555-555-5555
+ TEL;PID=2.2;VALUE=uri:tel:+1-666-666-6666
+ CLIENTPIDMAP:1;urn:uuid:53e374d9-337e-4727-8803-a1e9c14e0556
+ CLIENTPIDMAP:2;urn:uuid:1f762d2b-03c4-4a83-9a03-75ff658a6eee
+ END:VCARD
+
+ On the first device, the same PID source identifier (1) is reused for
+ the new EMAIL and TEL properties. On the second device, a new source
+ identifier (2) is generated, and a corresponding CLIENTPIDMAP
+ property is created. It contains the second device's identifier,
+ "urn:uuid:1f762d2b-03c4-4a83-9a03-75ff658a6eee".
+
+ The new EMAIL properties are unmatched on both sides since the PID
+ global value is new in both cases. The sync thus results in a copy
+ on both sides.
+
+ Although the situation appears to be the same for the TEL properties,
+ in this case, the synchronization engine is particularly smart and
+ matches the two new TEL properties even though their PID global
+ values are different. Note that in this case, the rules of
+ Section 7.1.2 state that two properties MAY be matched at the
+ discretion of the synchronization engine. Therefore, the two
+ properties are merged.
+
+ All this results in the following vCard, which is stored on both
+ devices:
+
+
+
+
+
+
+Perreault Standards Track [Page 55]
+
+RFC 6350 vCard August 2011
+
+
+ BEGIN:VCARD
+ VERSION:4.0
+ UID:urn:uuid:4fbe8971-0bc3-424c-9c26-36c3e1eff6b1
+ FN:J. Doe
+ N:Doe;J.;;;
+ EMAIL;PID=1.1:jdoe@example.com
+ EMAIL;PID=2.1:boss@example.com
+ EMAIL;PID=2.2:ceo@example.com
+ TEL;PID=1.1;VALUE=uri:tel:+1-555-555-5555
+ TEL;PID=2.1,2.2;VALUE=uri:tel:+1-666-666-6666
+ CLIENTPIDMAP:1;urn:uuid:53e374d9-337e-4727-8803-a1e9c14e0556
+ CLIENTPIDMAP:2;urn:uuid:1f762d2b-03c4-4a83-9a03-75ff658a6eee
+ END:VCARD
+
+7.2.5. Global Context Simplification
+
+ The two devices finish their synchronization procedure by simplifying
+ their global contexts. Since they haven't talked to any other
+ device, the following vCard is for all purposes equivalent to the
+ above. It is also shorter.
+
+ BEGIN:VCARD
+ VERSION:4.0
+ UID:urn:uuid:4fbe8971-0bc3-424c-9c26-36c3e1eff6b1
+ FN:J. Doe
+ N:Doe;J.;;;
+ EMAIL;PID=1.1:jdoe@example.com
+ EMAIL;PID=2.1:boss@example.com
+ EMAIL;PID=3.1:ceo@example.com
+ TEL;PID=1.1;VALUE=uri:tel:+1-555-555-5555
+ TEL;PID=2.1;VALUE=uri:tel:+1-666-666-6666
+ CLIENTPIDMAP:1;urn:uuid:53e374d9-337e-4727-8803-a1e9c14e0556
+ END:VCARD
+
+ The details of global context simplification are unspecified by this
+ document. They are left up to the synchronization engine. This
+ example is merely intended to illustrate the possibility, which
+ investigating would be, in the author's opinion, worthwhile.
+
+8. Example: Author's vCard
+
+ BEGIN:VCARD
+ VERSION:4.0
+ FN:Simon Perreault
+ N:Perreault;Simon;;;ing. jr,M.Sc.
+ BDAY:--0203
+ ANNIVERSARY:20090808T1430-0500
+ GENDER:M
+
+
+
+Perreault Standards Track [Page 56]
+
+RFC 6350 vCard August 2011
+
+
+ LANG;PREF=1:fr
+ LANG;PREF=2:en
+ ORG;TYPE=work:Viagenie
+ ADR;TYPE=work:;Suite D2-630;2875 Laurier;
+ Quebec;QC;G1V 2M2;Canada
+ TEL;VALUE=uri;TYPE="work,voice";PREF=1:tel:+1-418-656-9254;ext=102
+ TEL;VALUE=uri;TYPE="work,cell,voice,video,text":tel:+1-418-262-6501
+ EMAIL;TYPE=work:simon.perreault@viagenie.ca
+ GEO;TYPE=work:geo:46.772673,-71.282945
+ KEY;TYPE=work;VALUE=uri:
+ http://www.viagenie.ca/simon.perreault/simon.asc
+ TZ:-0500
+ URL;TYPE=home:http://nomis80.org
+ END:VCARD
+
+9. Security Considerations
+
+ o Internet mail is often used to transport vCards and is subject to
+ many well-known security attacks, including monitoring, replay,
+ and forgery. Care should be taken by any directory service in
+ allowing information to leave the scope of the service itself,
+ where any access controls or confidentiality can no longer be
+ guaranteed. Applications should also take care to display
+ directory data in a "safe" environment.
+
+ o vCards can carry cryptographic keys or certificates, as described
+ in Section 6.8.1.
+
+ o vCards often carry information that can be sensitive (e.g.,
+ birthday, address, and phone information). Although vCards have
+ no inherent authentication or confidentiality provisions, they can
+ easily be carried by any security mechanism that transfers MIME
+ objects to address authentication or confidentiality (e.g., S/MIME
+ [RFC5751], OpenPGP [RFC4880]). In cases where the confidentiality
+ or authenticity of information contained in vCard is a concern,
+ the vCard SHOULD be transported using one of these secure
+ mechanisms. The KEY property (Section 6.8.1) can be used to
+ transport the public key used by these mechanisms.
+
+ o The information in a vCard may become out of date. In cases where
+ the vitality of data is important to an originator of a vCard, the
+ SOURCE property (Section 6.1.3) SHOULD be specified. In addition,
+ the "REV" type described in Section 6.7.4 can be specified to
+ indicate the last time that the vCard data was updated.
+
+ o Many vCard properties may be used to transport URIs. Please refer
+ to [RFC3986], Section 7, for considerations related to URIs.
+
+
+
+
+Perreault Standards Track [Page 57]
+
+RFC 6350 vCard August 2011
+
+
+10. IANA Considerations
+
+10.1. Media Type Registration
+
+ IANA has registered the following Media Type (in
+ <http://www.iana.org/>) and marked the text/directory Media Type as
+ DEPRECATED.
+
+ To: ietf-types@iana.org
+
+ Subject: Registration of media type text/vcard
+
+ Type name: text
+
+ Subtype name: vcard
+
+ Required parameters: none
+
+ Optional parameters: version
+
+ The "version" parameter is to be interpreted identically as the
+ VERSION vCard property. If this parameter is present, all vCards
+ in a text/vcard body part MUST have a VERSION property with value
+ identical to that of this MIME parameter.
+
+ "charset": as defined for text/plain [RFC2046]; encodings other
+ than UTF-8 [RFC3629] MUST NOT be used.
+
+ Encoding considerations: 8bit
+
+ Security considerations: See Section 9.
+
+ Interoperability considerations: The text/vcard media type is
+ intended to identify vCard data of any version. There are older
+ specifications of vCard [RFC2426][vCard21] still in common use.
+ While these formats are similar, they are not strictly compatible.
+ In general, it is necessary to inspect the value of the VERSION
+ property (see Section 6.7.9) for identifying the standard to which
+ a given vCard object conforms.
+
+ In addition, the following media types are known to have been used
+ to refer to vCard data. They should be considered deprecated in
+ favor of text/vcard.
+
+ * text/directory
+ * text/directory; profile=vcard
+ * text/x-vcard
+
+
+
+
+Perreault Standards Track [Page 58]
+
+RFC 6350 vCard August 2011
+
+
+ Published specification: RFC 6350
+
+ Applications that use this media type: They are numerous, diverse,
+ and include mail user agents, instant messaging clients, address
+ book applications, directory servers, and customer relationship
+ management software.
+
+ Additional information:
+
+ Magic number(s):
+
+ File extension(s): .vcf .vcard
+
+ Macintosh file type code(s):
+
+ Person & email address to contact for further information: vCard
+ discussion mailing list <vcarddav@ietf.org>
+
+ Intended usage: COMMON
+
+ Restrictions on usage: none
+
+ Author: Simon Perreault
+
+ Change controller: IETF
+
+10.2. Registering New vCard Elements
+
+ This section defines the process for registering new or modified
+ vCard elements (i.e., properties, parameters, value data types, and
+ values) with IANA.
+
+10.2.1. Registration Procedure
+
+ The IETF has created a mailing list, vcarddav@ietf.org, which can be
+ used for public discussion of vCard element proposals prior to
+ registration. Use of the mailing list is strongly encouraged. The
+ IESG has appointed a designated expert who will monitor the
+ vcarddav@ietf.org mailing list and review registrations.
+
+ Registration of new vCard elements MUST be reviewed by the designated
+ expert and published in an RFC. A Standards Track RFC is REQUIRED
+ for the registration of new value data types that modify existing
+ properties. A Standards Track RFC is also REQUIRED for registration
+ of vCard elements that modify vCard elements previously documented in
+ a Standards Track RFC.
+
+
+
+
+
+Perreault Standards Track [Page 59]
+
+RFC 6350 vCard August 2011
+
+
+ The registration procedure begins when a completed registration
+ template, defined in the sections below, is sent to vcarddav@ietf.org
+ and iana@iana.org. Within two weeks, the designated expert is
+ expected to tell IANA and the submitter of the registration whether
+ the registration is approved, approved with minor changes, or
+ rejected with cause. When a registration is rejected with cause, it
+ can be re-submitted if the concerns listed in the cause are
+ addressed. Decisions made by the designated expert can be appealed
+ to the IESG Applications Area Director, then to the IESG. They
+ follow the normal appeals procedure for IESG decisions.
+
+ Once the registration procedure concludes successfully, IANA creates
+ or modifies the corresponding record in the vCard registry. The
+ completed registration template is discarded.
+
+ An RFC specifying new vCard elements MUST include the completed
+ registration templates, which MAY be expanded with additional
+ information. These completed templates are intended to go in the
+ body of the document, not in the IANA Considerations section.
+
+ Finally, note that there is an XML representation for vCard defined
+ in [RFC6351]. An XML representation SHOULD be defined for new vCard
+ elements.
+
+10.2.2. Vendor Namespace
+
+ The vendor namespace is used for vCard elements associated with
+ commercially available products. "Vendor" or "producer" are
+ construed as equivalent and very broadly in this context.
+
+ A registration may be placed in the vendor namespace by anyone who
+ needs to interchange files associated with the particular product.
+ However, the registration formally belongs to the vendor or
+ organization handling the vCard elements in the namespace being
+ registered. Changes to the specification will be made at their
+ request, as discussed in subsequent sections.
+
+ vCard elements belonging to the vendor namespace will be
+ distinguished by the "VND-" prefix. This is followed by an IANA-
+ registered Private Enterprise Number (PEN), a dash, and a vCard
+ element designation of the vendor's choosing (e.g., "VND-123456-
+ MUDPIE").
+
+ While public exposure and review of vCard elements to be registered
+ in the vendor namespace are not required, using the vcarddav@ietf.org
+ mailing list for review is strongly encouraged to improve the quality
+ of those specifications. Registrations in the vendor namespace may
+ be submitted directly to the IANA.
+
+
+
+Perreault Standards Track [Page 60]
+
+RFC 6350 vCard August 2011
+
+
+10.2.3. Registration Template for Properties
+
+ A property is defined by completing the following template.
+
+ Namespace: Empty for the global namespace, "VND-NNNN-" for a vendor-
+ specific property (where NNNN is replaced by the vendor's PEN).
+
+ Property name: The name of the property.
+
+ Purpose: The purpose of the property. Give a short but clear
+ description.
+
+ Value type: Any of the valid value types for the property value
+ needs to be specified. The default value type also needs to be
+ specified.
+
+ Cardinality: See Section 6.
+
+ Property parameters: Any of the valid property parameters for the
+ property MUST be specified.
+
+ Description: Any special notes about the property, how it is to be
+ used, etc.
+
+ Format definition: The ABNF for the property definition needs to be
+ specified.
+
+ Example(s): One or more examples of instances of the property need
+ to be specified.
+
+10.2.4. Registration Template for Parameters
+
+ A parameter is defined by completing the following template.
+
+ Namespace: Empty for the global namespace, "VND-NNNN-" for a vendor-
+ specific property (where NNNN is replaced by the vendor's PEN).
+
+ Parameter name: The name of the parameter.
+
+ Purpose: The purpose of the parameter. Give a short but clear
+ description.
+
+ Description: Any special notes about the parameter, how it is to be
+ used, etc.
+
+ Format definition: The ABNF for the parameter definition needs to be
+ specified.
+
+
+
+
+Perreault Standards Track [Page 61]
+
+RFC 6350 vCard August 2011
+
+
+ Example(s): One or more examples of instances of the parameter need
+ to be specified.
+
+10.2.5. Registration Template for Value Data Types
+
+ A value data type is defined by completing the following template.
+
+ Value name: The name of the value type.
+
+ Purpose: The purpose of the value type. Give a short but clear
+ description.
+
+ Description: Any special notes about the value type, how it is to be
+ used, etc.
+
+ Format definition: The ABNF for the value type definition needs to
+ be specified.
+
+ Example(s): One or more examples of instances of the value type need
+ to be specified.
+
+10.2.6. Registration Template for Values
+
+ A value is defined by completing the following template.
+
+ Value: The value literal.
+
+ Purpose: The purpose of the value. Give a short but clear
+ description.
+
+ Conformance: The vCard properties and/or parameters that can take
+ this value needs to be specified.
+
+ Example(s): One or more examples of instances of the value need to
+ be specified.
+
+ The following is a fictitious example of a registration of a vCard
+ value:
+
+ Value: supervisor
+
+ Purpose: It means that the related entity is the direct hierarchical
+ superior (i.e., supervisor or manager) of the entity this vCard
+ represents.
+
+ Conformance: This value can be used with the "TYPE" parameter
+ applied on the "RELATED" property.
+
+
+
+
+Perreault Standards Track [Page 62]
+
+RFC 6350 vCard August 2011
+
+
+ Example(s):
+
+ RELATED;TYPE=supervisor:urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6
+
+10.3. Initial vCard Elements Registries
+
+ The IANA has created and will maintain the following registries for
+ vCard elements with pointers to appropriate reference documents. The
+ registries are grouped together under the heading "vCard Elements".
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Perreault Standards Track [Page 63]
+
+RFC 6350 vCard August 2011
+
+
+10.3.1. Properties Registry
+
+ The following table has been used to initialize the properties
+ registry.
+
+ +-----------+--------------+-------------------------+
+ | Namespace | Property | Reference |
+ +-----------+--------------+-------------------------+
+ | | SOURCE | RFC 6350, Section 6.1.3 |
+ | | KIND | RFC 6350, Section 6.1.4 |
+ | | XML | RFC 6350, Section 6.1.5 |
+ | | FN | RFC 6350, Section 6.2.1 |
+ | | N | RFC 6350, Section 6.2.2 |
+ | | NICKNAME | RFC 6350, Section 6.2.3 |
+ | | PHOTO | RFC 6350, Section 6.2.4 |
+ | | BDAY | RFC 6350, Section 6.2.5 |
+ | | ANNIVERSARY | RFC 6350, Section 6.2.6 |
+ | | GENDER | RFC 6350, Section 6.2.7 |
+ | | ADR | RFC 6350, Section 6.3.1 |
+ | | TEL | RFC 6350, Section 6.4.1 |
+ | | EMAIL | RFC 6350, Section 6.4.2 |
+ | | IMPP | RFC 6350, Section 6.4.3 |
+ | | LANG | RFC 6350, Section 6.4.4 |
+ | | TZ | RFC 6350, Section 6.5.1 |
+ | | GEO | RFC 6350, Section 6.5.2 |
+ | | TITLE | RFC 6350, Section 6.6.1 |
+ | | ROLE | RFC 6350, Section 6.6.2 |
+ | | LOGO | RFC 6350, Section 6.6.3 |
+ | | ORG | RFC 6350, Section 6.6.4 |
+ | | MEMBER | RFC 6350, Section 6.6.5 |
+ | | RELATED | RFC 6350, Section 6.6.6 |
+ | | CATEGORIES | RFC 6350, Section 6.7.1 |
+ | | NOTE | RFC 6350, Section 6.7.2 |
+ | | PRODID | RFC 6350, Section 6.7.3 |
+ | | REV | RFC 6350, Section 6.7.4 |
+ | | SOUND | RFC 6350, Section 6.7.5 |
+ | | UID | RFC 6350, Section 6.7.6 |
+ | | CLIENTPIDMAP | RFC 6350, Section 6.7.7 |
+ | | URL | RFC 6350, Section 6.7.8 |
+ | | VERSION | RFC 6350, Section 6.7.9 |
+ | | KEY | RFC 6350, Section 6.8.1 |
+ | | FBURL | RFC 6350, Section 6.9.1 |
+ | | CALADRURI | RFC 6350, Section 6.9.2 |
+ | | CALURI | RFC 6350, Section 6.9.3 |
+ +-----------+--------------+-------------------------+
+
+
+
+
+
+
+Perreault Standards Track [Page 64]
+
+RFC 6350 vCard August 2011
+
+
+10.3.2. Parameters Registry
+
+ The following table has been used to initialize the parameters
+ registry.
+
+ +-----------+-----------+------------------------+
+ | Namespace | Parameter | Reference |
+ +-----------+-----------+------------------------+
+ | | LANGUAGE | RFC 6350, Section 5.1 |
+ | | VALUE | RFC 6350, Section 5.2 |
+ | | PREF | RFC 6350, Section 5.3 |
+ | | ALTID | RFC 6350, Section 5.4 |
+ | | PID | RFC 6350, Section 5.5 |
+ | | TYPE | RFC 6350, Section 5.6 |
+ | | MEDIATYPE | RFC 6350, Section 5.7 |
+ | | CALSCALE | RFC 6350, Section 5.8 |
+ | | SORT-AS | RFC 6350, Section 5.9 |
+ | | GEO | RFC 6350, Section 5.10 |
+ | | TZ | RFC 6350, Section 5.11 |
+ +-----------+-----------+------------------------+
+
+10.3.3. Value Data Types Registry
+
+ The following table has been used to initialize the parameters
+ registry.
+
+ +------------------+-------------------------+
+ | Value Data Type | Reference |
+ +------------------+-------------------------+
+ | BOOLEAN | RFC 6350, Section 4.4 |
+ | DATE | RFC 6350, Section 4.3.1 |
+ | DATE-AND-OR-TIME | RFC 6350, Section 4.3.4 |
+ | DATE-TIME | RFC 6350, Section 4.3.3 |
+ | FLOAT | RFC 6350, Section 4.6 |
+ | INTEGER | RFC 6350, Section 4.5 |
+ | LANGUAGE-TAG | RFC 6350, Section 4.8 |
+ | TEXT | RFC 6350, Section 4.1 |
+ | TIME | RFC 6350, Section 4.3.2 |
+ | TIMESTAMP | RFC 6350, Section 4.3.5 |
+ | URI | RFC 6350, Section 4.2 |
+ | UTC-OFFSET | RFC 6350, Section 4.7 |
+ +------------------+-------------------------+
+
+
+
+
+
+
+
+
+
+Perreault Standards Track [Page 65]
+
+RFC 6350 vCard August 2011
+
+
+10.3.4. Values Registries
+
+ Separate tables are used for property and parameter values.
+
+ The following table is to be used to initialize the property values
+ registry.
+
+ +----------+------------+-------------------------+
+ | Property | Value | Reference |
+ +----------+------------+-------------------------+
+ | BEGIN | VCARD | RFC 6350, Section 6.1.1 |
+ | END | VCARD | RFC 6350, Section 6.1.2 |
+ | KIND | individual | RFC 6350, Section 6.1.4 |
+ | KIND | group | RFC 6350, Section 6.1.4 |
+ | KIND | org | RFC 6350, Section 6.1.4 |
+ | KIND | location | RFC 6350, Section 6.1.4 |
+ +----------+------------+-------------------------+
+
+ The following table has been used to initialize the parameter values
+ registry.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Perreault Standards Track [Page 66]
+
+RFC 6350 vCard August 2011
+
+
+ +------------------------+-----------+--------------+---------------+
+ | Property | Parameter | Value | Reference |
+ +------------------------+-----------+--------------+---------------+
+ | FN, NICKNAME, PHOTO, | TYPE | work | RFC 6350, |
+ | ADR, TEL, EMAIL, IMPP, | | | Section 5.6 |
+ | LANG, TZ, GEO, TITLE, | | | |
+ | ROLE, LOGO, ORG, | | | |
+ | RELATED, CATEGORIES, | | | |
+ | NOTE, SOUND, URL, KEY, | | | |
+ | FBURL, CALADRURI, and | | | |
+ | CALURI | | | |
+ | FN, NICKNAME, PHOTO, | TYPE | home | RFC 6350, |
+ | ADR, TEL, EMAIL, IMPP, | | | Section 5.6 |
+ | LANG, TZ, GEO, TITLE, | | | |
+ | ROLE, LOGO, ORG, | | | |
+ | RELATED, CATEGORIES, | | | |
+ | NOTE, SOUND, URL, KEY, | | | |
+ | FBURL, CALADRURI, and | | | |
+ | CALURI | | | |
+ | TEL | TYPE | text | RFC 6350, |
+ | | | | Section 6.4.1 |
+ | TEL | TYPE | voice | RFC 6350, |
+ | | | | Section 6.4.1 |
+ | TEL | TYPE | fax | RFC 6350, |
+ | | | | Section 6.4.1 |
+ | TEL | TYPE | cell | RFC 6350, |
+ | | | | Section 6.4.1 |
+ | TEL | TYPE | video | RFC 6350, |
+ | | | | Section 6.4.1 |
+ | TEL | TYPE | pager | RFC 6350, |
+ | | | | Section 6.4.1 |
+ | TEL | TYPE | textphone | RFC 6350, |
+ | | | | Section 6.4.1 |
+ | BDAY, ANNIVERSARY | CALSCALE | gregorian | RFC 6350, |
+ | | | | Section 5.8 |
+ | RELATED | TYPE | contact | RFC 6350, |
+ | | | | Section 6.6.6 |
+ | | | | and [xfn] |
+ | RELATED | TYPE | acquaintance | RFC 6350, |
+ | | | | Section 6.6.6 |
+ | | | | and [xfn] |
+ | RELATED | TYPE | friend | RFC 6350, |
+ | | | | Section 6.6.6 |
+ | | | | and [xfn] |
+ | RELATED | TYPE | met | RFC 6350, |
+ | | | | Section 6.6.6 |
+ | | | | and [xfn] |
+
+
+
+
+Perreault Standards Track [Page 67]
+
+RFC 6350 vCard August 2011
+
+
+ | RELATED | TYPE | co-worker | RFC 6350, |
+ | | | | Section 6.6.6 |
+ | | | | and [xfn] |
+ | RELATED | TYPE | colleague | RFC 6350, |
+ | | | | Section 6.6.6 |
+ | | | | and [xfn] |
+ | RELATED | TYPE | co-resident | RFC 6350, |
+ | | | | Section 6.6.6 |
+ | | | | and [xfn] |
+ | RELATED | TYPE | neighbor | RFC 6350, |
+ | | | | Section 6.6.6 |
+ | | | | and [xfn] |
+ | RELATED | TYPE | child | RFC 6350, |
+ | | | | Section 6.6.6 |
+ | | | | and [xfn] |
+ | RELATED | TYPE | parent | RFC 6350, |
+ | | | | Section 6.6.6 |
+ | | | | and [xfn] |
+ | RELATED | TYPE | sibling | RFC 6350, |
+ | | | | Section 6.6.6 |
+ | | | | and [xfn] |
+ | RELATED | TYPE | spouse | RFC 6350, |
+ | | | | Section 6.6.6 |
+ | | | | and [xfn] |
+ | RELATED | TYPE | kin | RFC 6350, |
+ | | | | Section 6.6.6 |
+ | | | | and [xfn] |
+ | RELATED | TYPE | muse | RFC 6350, |
+ | | | | Section 6.6.6 |
+ | | | | and [xfn] |
+ | RELATED | TYPE | crush | RFC 6350, |
+ | | | | Section 6.6.6 |
+ | | | | and [xfn] |
+ | RELATED | TYPE | date | RFC 6350, |
+ | | | | Section 6.6.6 |
+ | | | | and [xfn] |
+ | RELATED | TYPE | sweetheart | RFC 6350, |
+ | | | | Section 6.6.6 |
+ | | | | and [xfn] |
+ | RELATED | TYPE | me | RFC 6350, |
+ | | | | Section 6.6.6 |
+ | | | | and [xfn] |
+ | RELATED | TYPE | agent | RFC 6350, |
+ | | | | Section 6.6.6 |
+ | RELATED | TYPE | emergency | RFC 6350, |
+ | | | | Section 6.6.6 |
+ +------------------------+-----------+--------------+---------------+
+
+
+
+
+Perreault Standards Track [Page 68]
+
+RFC 6350 vCard August 2011
+
+
+11. Acknowledgments
+
+ The authors would like to thank Tim Howes, Mark Smith, and Frank
+ Dawson, the original authors of [RFC2425] and [RFC2426], Pete
+ Resnick, who got this effort started and provided help along the way,
+ as well as the following individuals who have participated in the
+ drafting, review, and discussion of this memo:
+
+ Aki Niemi, Andy Mabbett, Alexander Mayrhofer, Alexey Melnikov, Anil
+ Srivastava, Barry Leiba, Ben Fortuna, Bernard Desruisseaux, Bernie
+ Hoeneisen, Bjoern Hoehrmann, Caleb Richardson, Chris Bryant, Chris
+ Newman, Cyrus Daboo, Daisuke Miyakawa, Dan Brickley, Dan Mosedale,
+ Dany Cauchie, Darryl Champagne, Dave Thewlis, Filip Navara, Florian
+ Zeitz, Helge Hess, Jari Urpalainen, Javier Godoy, Jean-Luc Schellens,
+ Joe Hildebrand, Jose Luis Gayosso, Joseph Smarr, Julian Reschke,
+ Kepeng Li, Kevin Marks, Kevin Wu Won, Kurt Zeilenga, Lisa Dusseault,
+ Marc Blanchet, Mark Paterson, Markus Lorenz, Michael Haardt, Mike
+ Douglass, Nick Levinson, Peter K. Sheerin, Peter Mogensen, Peter
+ Saint-Andre, Renato Iannella, Rohit Khare, Sly Gryphon, Stephane
+ Bortzmeyer, Tantek Celik, and Zoltan Ordogh.
+
+12. References
+
+12.1. Normative References
+
+ [CCITT.X520.1988]
+ International Telephone and Telegraph Consultative
+ Committee, "Information Technology - Open Systems
+ Interconnection - The Directory: Selected Attribute
+ Types", CCITT Recommendation X.520, November 1988.
+
+ [IEEE.754.2008]
+ Institute of Electrical and Electronics Engineers,
+ "Standard for Binary Floating-Point Arithmetic",
+ IEEE Standard 754, August 2008.
+
+ [ISO.8601.2000]
+ International Organization for Standardization, "Data
+ elements and interchange formats - Information interchange
+ - Representation of dates and times", ISO Standard 8601,
+ December 2000.
+
+ [ISO.8601.2004]
+ International Organization for Standardization, "Data
+ elements and interchange formats - Information interchange
+ - Representation of dates and times", ISO Standard 8601,
+ December 2004.
+
+
+
+
+Perreault Standards Track [Page 69]
+
+RFC 6350 vCard August 2011
+
+
+ [RFC2045] Freed, N. and N. Borenstein, "Multipurpose Internet Mail
+ Extensions (MIME) Part One: Format of Internet Message
+ Bodies", RFC 2045, November 1996.
+
+ [RFC2046] Freed, N. and N. Borenstein, "Multipurpose Internet Mail
+ Extensions (MIME) Part Two: Media Types", RFC 2046,
+ November 1996.
+
+ [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
+ Requirement Levels", BCP 14, RFC 2119, March 1997.
+
+ [RFC2739] Small, T., Hennessy, D., and F. Dawson, "Calendar
+ Attributes for vCard and LDAP", RFC 2739, January 2000.
+
+ [RFC3629] Yergeau, F., "UTF-8, a transformation format of ISO
+ 10646", STD 63, RFC 3629, November 2003.
+
+ [RFC3966] Schulzrinne, H., "The tel URI for Telephone Numbers",
+ RFC 3966, December 2004.
+
+ [RFC3986] Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform
+ Resource Identifier (URI): Generic Syntax", STD 66,
+ RFC 3986, January 2005.
+
+ [RFC4122] Leach, P., Mealling, M., and R. Salz, "A Universally
+ Unique IDentifier (UUID) URN Namespace", RFC 4122,
+ July 2005.
+
+ [RFC4288] Freed, N. and J. Klensin, "Media Type Specifications and
+ Registration Procedures", BCP 13, RFC 4288, December 2005.
+
+ [RFC5234] Crocker, D. and P. Overell, "Augmented BNF for Syntax
+ Specifications: ABNF", STD 68, RFC 5234, January 2008.
+
+ [RFC5322] Resnick, P., Ed., "Internet Message Format", RFC 5322,
+ October 2008.
+
+ [RFC5545] Desruisseaux, B., "Internet Calendaring and Scheduling
+ Core Object Specification (iCalendar)", RFC 5545,
+ September 2009.
+
+ [RFC5546] Daboo, C., "iCalendar Transport-Independent
+ Interoperability Protocol (iTIP)", RFC 5546,
+ December 2009.
+
+ [RFC5646] Phillips, A. and M. Davis, "Tags for Identifying
+ Languages", BCP 47, RFC 5646, September 2009.
+
+
+
+
+Perreault Standards Track [Page 70]
+
+RFC 6350 vCard August 2011
+
+
+ [RFC5870] Mayrhofer, A. and C. Spanring, "A Uniform Resource
+ Identifier for Geographic Locations ('geo' URI)",
+ RFC 5870, June 2010.
+
+ [RFC6351] Perreault, S., "xCard: vCard XML Representation",
+ RFC 6351, August 2011.
+
+ [W3C.REC-xml-20081126]
+ Maler, E., Yergeau, F., Sperberg-McQueen, C., Paoli, J.,
+ and T. Bray, "Extensible Markup Language (XML) 1.0 (Fifth
+ Edition)", World Wide Web Consortium Recommendation REC-
+ xml-20081126, November 2008,
+ <http://www.w3.org/TR/2008/REC-xml-20081126>.
+
+ [xfn] Celik, T., Mullenweg, M., and E. Meyer, "XFN 1.1 profile",
+ <http://gmpg.org/xfn/11>.
+
+12.2. Informative References
+
+ [IANA-TZ] Lear, E. and P. Eggert, "IANA Procedures for Maintaining
+ the Timezone Database", Work in Progress, May 2011.
+
+ [ISO9070] International Organization for Standardization,
+ "Information Processing - SGML support facilities -
+ Registration Procedures for Public Text Owner
+ Identifiers", ISO 9070, April 1991.
+
+ [RFC1738] Berners-Lee, T., Masinter, L., and M. McCahill, "Uniform
+ Resource Locators (URL)", RFC 1738, December 1994.
+
+ [RFC2397] Masinter, L., "The "data" URL scheme", RFC 2397,
+ August 1998.
+
+ [RFC2425] Howes, T., Smith, M., and F. Dawson, "A MIME Content-Type
+ for Directory Information", RFC 2425, September 1998.
+
+ [RFC2426] Dawson, F. and T. Howes, "vCard MIME Directory Profile",
+ RFC 2426, September 1998.
+
+ [RFC2616] Fielding, R., Gettys, J., Mogul, J., Frystyk, H.,
+ Masinter, L., Leach, P., and T. Berners-Lee, "Hypertext
+ Transfer Protocol -- HTTP/1.1", RFC 2616, June 1999.
+
+ [RFC3282] Alvestrand, H., "Content Language Headers", RFC 3282,
+ May 2002.
+
+
+
+
+
+
+Perreault Standards Track [Page 71]
+
+RFC 6350 vCard August 2011
+
+
+ [RFC3406] Daigle, L., van Gulik, D., Iannella, R., and P. Faltstrom,
+ "Uniform Resource Names (URN) Namespace Definition
+ Mechanisms", BCP 66, RFC 3406, October 2002.
+
+ [RFC3536] Hoffman, P., "Terminology Used in Internationalization in
+ the IETF", RFC 3536, May 2003.
+
+ [RFC4770] Jennings, C. and J. Reschke, Ed., "vCard Extensions for
+ Instant Messaging (IM)", RFC 4770, January 2007.
+
+ [RFC4880] Callas, J., Donnerhacke, L., Finney, H., Shaw, D., and R.
+ Thayer, "OpenPGP Message Format", RFC 4880, November 2007.
+
+ [RFC5335bis]
+ Yang, A. and S. Steele, "Internationalized Email Headers",
+ Work in Progress, July 2011.
+
+ [RFC5751] Ramsdell, B. and S. Turner, "Secure/Multipurpose Internet
+ Mail Extensions (S/MIME) Version 3.2 Message
+ Specification", RFC 5751, January 2010.
+
+ [RFC6068] Duerst, M., Masinter, L., and J. Zawinski, "The 'mailto'
+ URI Scheme", RFC 6068, October 2010.
+
+ [TZ-DB] Olson, A., "Time zone code and data",
+ <ftp://elsie.nci.nih.gov/pub/>.
+
+ [vCard21] Internet Mail Consortium, "vCard - The Electronic Business
+ Card Version 2.1", September 1996.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Perreault Standards Track [Page 72]
+
+RFC 6350 vCard August 2011
+
+
+Appendix A. Differences from RFCs 2425 and 2426
+
+ This appendix contains a high-level overview of the major changes
+ that have been made in the vCard specification from RFCs 2425 and
+ 2426. It is incomplete, as it only lists the most important changes.
+
+A.1. New Structure
+
+ o [RFC2425] and [RFC2426] have been merged.
+
+ o vCard is now not only a MIME type but a stand-alone format.
+
+ o A proper MIME type registration form has been included.
+
+ o UTF-8 is now the only possible character set.
+
+ o New vCard elements can be registered from IANA.
+
+A.2. Removed Features
+
+ o The CONTEXT and CHARSET parameters are no more.
+
+ o The NAME, MAILER, LABEL, and CLASS properties are no more.
+
+ o The "intl", "dom", "postal", and "parcel" TYPE parameter values
+ for the ADR property have been removed.
+
+ o In-line vCards (such as the value of the AGENT property) are no
+ longer supported.
+
+A.3. New Properties and Parameters
+
+ o The KIND, GENDER, LANG, ANNIVERSARY, XML, and CLIENTPIDMAP
+ properties have been added.
+
+ o [RFC2739], which defines the FBURL, CALADRURI, CAPURI, and CALURI
+ properties, has been merged in.
+
+ o [RFC4770], which defines the IMPP property, has been merged in.
+
+ o The "work" and "home" TYPE parameter values are now applicable to
+ many more properties.
+
+ o The "pref" value of the TYPE parameter is now a parameter of its
+ own, with a positive integer value indicating the level of
+ preference.
+
+ o The ALTID and PID parameters have been added.
+
+
+
+Perreault Standards Track [Page 73]
+
+RFC 6350 vCard August 2011
+
+
+ o The MEDIATYPE parameter has been added and replaces the TYPE
+ parameter when it was used for indicating the media type of the
+ property's content.
+
+Author's Address
+
+ Simon Perreault
+ Viagenie
+ 2875 Laurier, suite D2-630
+ Quebec, QC G1V 2M2
+ Canada
+
+ Phone: +1 418 656 9254
+ EMail: simon.perreault@viagenie.ca
+ URI: http://www.viagenie.ca
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Perreault Standards Track [Page 74]
+
diff --git a/vendor/sabre/dav/docs/rfc6351.txt b/vendor/sabre/dav/docs/rfc6351.txt
new file mode 100644
index 000000000..5ae0fa3f2
--- /dev/null
+++ b/vendor/sabre/dav/docs/rfc6351.txt
@@ -0,0 +1,1235 @@
+
+
+
+
+
+
+Internet Engineering Task Force (IETF) S. Perreault
+Request for Comments: 6351 Viagenie
+Category: Standards Track August 2011
+ISSN: 2070-1721
+
+
+ xCard: vCard XML Representation
+
+Abstract
+
+ This document defines the XML schema of the vCard data format.
+
+Status of This Memo
+
+ This is an Internet Standards Track document.
+
+ This document is a product of the Internet Engineering Task Force
+ (IETF). It represents the consensus of the IETF community. It has
+ received public review and has been approved for publication by the
+ Internet Engineering Steering Group (IESG). Further information on
+ Internet Standards is available in Section 2 of RFC 5741.
+
+ Information about the current status of this document, any errata,
+ and how to provide feedback on it may be obtained at
+ http://www.rfc-editor.org/info/rfc6351.
+
+Copyright Notice
+
+ Copyright (c) 2011 IETF Trust and the persons identified as the
+ document authors. All rights reserved.
+
+ This document is subject to BCP 78 and the IETF Trust's Legal
+ Provisions Relating to IETF Documents
+ (http://trustee.ietf.org/license-info) in effect on the date of
+ publication of this document. Please review these documents
+ carefully, as they describe your rights and restrictions with respect
+ to this document. Code Components extracted from this document must
+ include Simplified BSD License text as described in Section 4.e of
+ the Trust Legal Provisions and are provided without warranty as
+ described in the Simplified BSD License.
+
+
+
+
+
+
+
+
+
+
+
+Perreault Standards Track [Page 1]
+
+RFC 6351 xCard August 2011
+
+
+Table of Contents
+
+ 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 2
+ 2. Conventions . . . . . . . . . . . . . . . . . . . . . . . . . 2
+ 3. The Schema . . . . . . . . . . . . . . . . . . . . . . . . . . 2
+ 4. Example: Author's XML vCard . . . . . . . . . . . . . . . . . 3
+ 5. Design Considerations . . . . . . . . . . . . . . . . . . . . 4
+ 5.1. Extensibility . . . . . . . . . . . . . . . . . . . . . . 6
+ 5.2. Limitations . . . . . . . . . . . . . . . . . . . . . . . 7
+ 6. Format Conversions . . . . . . . . . . . . . . . . . . . . . . 8
+ 7. Security Considerations . . . . . . . . . . . . . . . . . . . 10
+ 8. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 11
+ 8.1. Registration of the XML Namespace . . . . . . . . . . . . 11
+ 8.2. Media Type . . . . . . . . . . . . . . . . . . . . . . . . 11
+ 9. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 12
+ 10. References . . . . . . . . . . . . . . . . . . . . . . . . . . 12
+ 10.1. Normative References . . . . . . . . . . . . . . . . . . . 12
+ 10.2. Informative References . . . . . . . . . . . . . . . . . . 13
+ Appendix A. Relax NG Schema . . . . . . . . . . . . . . . . . . . 14
+
+1. Introduction
+
+ vCard [RFC6350] is a data format for representing and exchanging
+ information about individuals and other entities. It is a text-based
+ format (as opposed to a binary format). This document defines xCard,
+ an XML [W3C.REC-xml-20081126] representation for vCard. The
+ underlying data structure is exactly the same, enabling a 1-to-1
+ mapping between the original vCard format and the XML representation.
+ The XML formatting may be preferred in some contexts where an XML
+ engine is readily available and may be reused instead of writing a
+ standalone vCard parser.
+
+ Earlier work on an XML format for vCard was started in 1998 by Frank
+ Dawson [VCARD-DTD]. Sadly, it did not take over the world.
+
+2. Conventions
+
+ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
+ "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
+ document are to be interpreted as described in [RFC2119].
+
+3. The Schema
+
+ The schema is expressed in the RELAX NG language [ISO.19757-2.2008]
+ and is found in Appendix A.
+
+
+
+
+
+
+Perreault Standards Track [Page 2]
+
+RFC 6351 xCard August 2011
+
+
+4. Example: Author's XML vCard
+
+ <?xml version="1.0" encoding="UTF-8"?>
+ <vcards xmlns="urn:ietf:params:xml:ns:vcard-4.0">
+ <vcard>
+ <fn><text>Simon Perreault</text></fn>
+ <n>
+ <surname>Perreault</surname>
+ <given>Simon</given>
+ <additional/>
+ <prefix/>
+ <suffix>ing. jr</suffix>
+ <suffix>M.Sc.</suffix>
+ </n>
+ <bday><date>--0203</date></bday>
+ <anniversary>
+ <date-time>20090808T1430-0500</date-time>
+ </anniversary>
+ <gender><sex>M</sex></gender>
+ <lang>
+ <parameters><pref><integer>1</integer></pref></parameters>
+ <language-tag>fr</language-tag>
+ </lang>
+ <lang>
+ <parameters><pref><integer>2</integer></pref></parameters>
+ <language-tag>en</language-tag>
+ </lang>
+ <org>
+ <parameters><type><text>work</text></type></parameters>
+ <text>Viagenie</text>
+ </org>
+ <adr>
+ <parameters>
+ <type><text>work</text></type>
+ <label><text>Simon Perreault
+ 2875 boul. Laurier, suite D2-630
+ Quebec, QC, Canada
+ G1V 2M2</text></label>
+ </parameters>
+ <pobox/>
+ <ext/>
+ <street>2875 boul. Laurier, suite D2-630</street>
+ <locality>Quebec</locality>
+ <region>QC</region>
+ <code>G1V 2M2</code>
+ <country>Canada</country>
+ </adr>
+ <tel>
+
+
+
+Perreault Standards Track [Page 3]
+
+RFC 6351 xCard August 2011
+
+
+ <parameters>
+ <type>
+ <text>work</text>
+ <text>voice</text>
+ </type>
+ </parameters>
+ <uri>tel:+1-418-656-9254;ext=102</uri>
+ </tel>
+ <tel>
+ <parameters>
+ <type>
+ <text>work</text>
+ <text>text</text>
+ <text>voice</text>
+ <text>cell</text>
+ <text>video</text>
+ </type>
+ </parameters>
+ <uri>tel:+1-418-262-6501</uri>
+ </tel>
+ <email>
+ <parameters><type><text>work</text></type></parameters>
+ <text>simon.perreault@viagenie.ca</text>
+ </email>
+ <geo>
+ <parameters><type><text>work</text></type></parameters>
+ <uri>geo:46.766336,-71.28955</uri>
+ </geo>
+ <key>
+ <parameters><type><text>work</text></type></parameters>
+ <uri>http://www.viagenie.ca/simon.perreault/simon.asc</uri>
+ </key>
+ <tz><text>America/Montreal</text></tz>
+ <url>
+ <parameters><type><text>home</text></type></parameters>
+ <uri>http://nomis80.org</uri>
+ </url>
+ </vcard>
+ </vcards>
+
+5. Design Considerations
+
+ The general idea is to map vCard parameters, properties, and value
+ types to XML elements. For example, the "FN" property is mapped to
+ the "fn" element. In turn, that element contains a text element
+ whose content corresponds to the vCard property's value.
+
+
+
+
+
+Perreault Standards Track [Page 4]
+
+RFC 6351 xCard August 2011
+
+
+ vCard parameters are also mapped to XML elements. They are contained
+ in the <parameters> element, which is contained in property elements.
+ For example, the "TYPE" parameter applied to the "TEL" property would
+ look like the following in XML:
+
+ <tel>
+ <parameters>
+ <type>
+ <text>voice</text>
+ <text>video</text>
+ </type>
+ </parameters>
+ <uri>tel:+1-555-555-555</uri>
+ </tel>
+
+ Parameters taking a list of values are simply repeated multiple
+ times, once for each value in the list.
+
+ Properties having structured values (e.g., the "N" property) are
+ expressed by XML element trees. Element names in that tree (e.g.,
+ "surname", "given", etc.) do not have a vCard equivalent since they
+ are identified by position in plain vCard.
+
+ Line folding is a non-issue in XML. Therefore, the mapping from
+ vCard to XML is done after the unfolding procedure is carried out.
+ Conversely, the mapping from XML to vCard is done before the folding
+ procedure is carried out.
+
+ A top-level <vcards> element is used as root. It contains one or
+ more <vcard> elements, each representing a complete vCard. The
+ <vcards> element MUST be present even when only a single vCard is
+ present in an XML document.
+
+ The group construct (Section 3.2 in [RFC6350]) is represented with
+ the <group> element. The "name" attribute contains the group's name.
+ For example:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Perreault Standards Track [Page 5]
+
+RFC 6351 xCard August 2011
+
+
+ <vcards>
+ <vcard>
+ <group name="contact">
+ <fn>...</fn>
+ <email>...</email>
+ </group>
+ <group name="media">
+ <photo>...</photo>
+ </group>
+ <categories>...</categories>
+ </vcard>
+ </vcards>
+
+ is equivalent to:
+
+ BEGIN:VCARD
+ VERSION:4.0
+ contact.FN=...
+ contact.EMAIL=...
+ media.PHOTO=...
+ CATEGORIES=...
+ END:VCARD
+
+5.1. Extensibility
+
+ The original vCard format is extensible. New properties, parameters,
+ data types and values (collectively known as vCard elements, not to
+ be confused with XML elements) can be registered with IANA (see
+ [RFC6350], Section 10.2). It is expected that these vCard extensions
+ will also specify extensions to the XML format described in this
+ document.
+
+ New XML vCard property and parameter element names MUST be lower-
+ case. This is necessary to ensure that round-tripping between XML
+ and plain-text vCard works correctly.
+
+ Unregistered extensions (i.e., those starting with "X-" and
+ "VND-...-") are expressed in XML by using elements starting with "x-"
+ and "vnd-...-". Usage of XML namespaces [W3C.REC-xml-names-20091208]
+ for extensibility is RECOMMENDED for extensions that have no
+ equivalent in plain-text vCard. Refer to Section 6 for the
+ implications when converting between plain-text vCard and XML.
+
+
+
+
+
+
+
+
+
+Perreault Standards Track [Page 6]
+
+RFC 6351 xCard August 2011
+
+
+ Examples:
+
+ <x-my-prop>
+ <parameters>
+ <pref><integer>1</integer></pref>
+ </parameters>
+ <text>value goes here</text>
+ </x-my-prop>
+
+ <ext:my-prop
+ ext:xmlns="http://example.com/extensions/my-vcard">
+ <parameters>
+ <pref><integer>1</integer></pref>
+ </parameters> <!-- Core vCard elements -->
+ <text>value goes here</text> <!-- are still accessible -->
+ </ext:my-prop>
+
+ Note that extension elements do not need the "X-" or "VND-" prefix in
+ XML. The XML namespace mechanism is sufficient.
+
+ A vCard XML parser MUST ignore XML elements and attributes for which
+ it doesn't recognize the expanded name. The normal behavior of
+ ignoring XML processing instructions whose target is not recognized
+ MUST also be followed.
+
+ In the original vCard format, the "VERSION" property was mandatory
+ and played a role in extensibility. In XML, this property is absent.
+ Its role is played by the vCard core namespace identifier, which
+ includes the version number. vCard revisions will use a different
+ namespace.
+
+ Parameters containing a list of values are expressed using a list of
+ elements in XML (e.g., the <type> element).
+
+5.2. Limitations
+
+ The schema does not validate the cardinality of properties. This is
+ a limitation of the schema definition language. Cardinalities of the
+ original vCard format [RFC6350] MUST still be respected.
+
+ Some constructs (e.g., value enumerations in type parameters) have
+ additional ordering constraints in XML. This is a result of
+ limitations of the schema definition language, and the order is
+ arbitrary. The order MUST be respected in XML for the vCard to be
+ valid. However, reordering as part of conversion to or from plain
+ vCard MAY happen.
+
+
+
+
+
+Perreault Standards Track [Page 7]
+
+RFC 6351 xCard August 2011
+
+
+6. Format Conversions
+
+ When new properties or "X-" properties are used, a vCard<->xCard
+ converter might not recognize them or know what the appropriate
+ default value types are, yet they need to be able to preserve the
+ values. A similar issue arises for unrecognized property parameters.
+ As a result, the following rules are applied when dealing with
+ unrecognized properties and property parameters:
+
+ o When converting from vCard to xCard:
+
+ * Any property that does not include a "VALUE" parameter and
+ whose default value type is not known MUST be converted using
+ the value type XML element <unknown>. The content of that
+ element is the unprocessed value text.
+
+ * Any unrecognized property parameter MUST be converted using the
+ value type XML element <unknown>, with its content set to the
+ parameter value text, treated as if it were a text value, or
+ list of text values.
+
+ * The content of "XML" properties is copied as is to XML.
+
+ * Property and parameter XML element names are converted to
+ lower-case.
+
+ * Property value escaping is undone. For example, "\n" becomes a
+ NEWLINE character (ASCII decimal 10).
+
+ * Double-quoting of parameter values, as well as backslash
+ escaping in parameter values, is undone. For example,
+ PARAM="\"foo\",\"bar\"" becomes <param>"foo","bar"</param>.
+
+ o When converting xCard to vCard:
+
+ * Properties in the vCard 4 namespace:
+
+ + If the converter knows of a specific plain-text
+ representation for this property, it uses it. For example,
+ the <adr> element corresponds to the "ADR" property, which
+ is encoded using comma-separated lists separated by
+ semicolons.
+
+ + Otherwise, the property name is taken from the element name,
+ property parameters are taken from the <parameters> element,
+ and the content of the property is taken from the content of
+ the value element. If the property element has attributes
+ or contains other XML elements, they are dropped.
+
+
+
+Perreault Standards Track [Page 8]
+
+RFC 6351 xCard August 2011
+
+
+ + If a standard property's XML element contains XML elements
+ and attributes for which the converter doesn't recognize the
+ expanded name, they are dropped. Therefore, it is
+ RECOMMENDED to limit extensions to the property level to
+ ensure that all data is preserved intact in round-trip
+ conversions.
+
+ * Properties in other namespaces are wrapped as is inside an
+ "XML" property.
+
+ * Any <unknown> property value XML elements are converted
+ directly into vCard values. The containing property MUST NOT
+ have a "VALUE" parameter.
+
+ * Any <unknown> parameter value XML elements are converted as if
+ they were <text> value type XML elements.
+
+ * Property and parameter names are converted to upper-case.
+
+ * Property value escaping (Section 3.3 of [RFC6350]) is carried
+ out. For example, a NEWLINE character (ASCII decimal 10)
+ becomes "\n".
+
+ * Double-quoting of parameter values, as well as backslash
+ escaping in parameter values, is carried out. For example,
+ <param>"foo","bar"</param> becomes PARAM="\"foo\",\"bar\"".
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Perreault Standards Track [Page 9]
+
+RFC 6351 xCard August 2011
+
+
+ For example, these two vCards are equivalent:
+
+ <?xml version="1.0"?>
+ <vcards xmlns="urn:ietf:params:xml:ns:vcard-4.0">
+ <vcard>
+ <fn><text>J. Doe</text></fn>
+ <n>
+ <surname>Doe</surname>
+ <given>J.</given>
+ <additional/>
+ <prefix/>
+ <suffix/>
+ </n>
+ <x-file>
+ <parameters>
+ <mediatype><text>image/jpeg</text></mediatype>
+ </parameters>
+ <unknown>alien.jpg</unknown>
+ </x-file>
+ <a xmlns="http://www.w3.org/1999/xhtml"
+ href="http://www.example.com">My web page!</a>
+ </vcard>
+ </vcards>
+
+
+ BEGIN:VCARD
+ VERSION:4.0
+ FN:J. Doe
+ N:Doe;J.;;
+ X-FILE;MEDIATYPE=image/jpeg:alien.jpg
+ XML:<a xmlns="http://www.w3.org/1999/xhtml"\n
+ href="http://www.example.com">My web page!</a>
+ END:VCARD
+
+7. Security Considerations
+
+ All the security considerations applicable to plain vCard [RFC6350]
+ are applicable to this document as well.
+
+ XML Signature [W3C.CR-xmldsig-core1-20110303] and XML Encryption
+ [W3C.CR-xmlenc-core1-20110303] can be used with xCard to provide
+ authentication and confidentiality.
+
+
+
+
+
+
+
+
+
+Perreault Standards Track [Page 10]
+
+RFC 6351 xCard August 2011
+
+
+8. IANA Considerations
+
+8.1. Registration of the XML Namespace
+
+ URI: urn:ietf:params:xml:ns:vcard-4.0
+
+ Registrant Contact: The IESG <iesg@ietf.org>
+
+ XML: None. Namespace URIs do not represent an XML specification.
+
+8.2. Media Type
+
+ This section defines the MIME media type [RFC4288] for use with
+ vCard-in-XML data.
+
+ To: ietf-types@iana.org
+
+ Subject: Registration of media type application/vcard+xml
+
+ Type name: application
+
+ Subtype name: vcard+xml
+
+ Required parameters: none
+
+ Optional parameters: charset as defined for application/xml in
+ [RFC3023]; per [RFC3023], use of the charset parameter with the
+ value "utf-8" is "STRONGLY RECOMMENDED".
+
+ Encoding considerations: Same as encoding considerations of
+ application/xml as specified in [RFC3023].
+
+ Security considerations: This media type has all of the security
+ considerations described in [RFC3023], plus those listed in
+ Section 7.
+
+ Interoperability considerations: This media type provides an
+ alternative syntax to vCard data [RFC6350] based on XML.
+
+ Published specification: This specification.
+
+ Applications that use this media type: Applications that currently
+ make use of the text/vcard media type can use this as an
+ alternative. In general, applications that maintain or process
+ contact information can use this media type.
+
+
+
+
+
+
+Perreault Standards Track [Page 11]
+
+RFC 6351 xCard August 2011
+
+
+ Additional information:
+
+ Magic number(s): none
+
+ File extension(s): XML data should use ".xml" as the file
+ extension.
+
+ Macintosh file type code(s): none
+
+ Person & email address to contact for further information: Simon
+ Perreault <simon.perreault@viagenie.ca>
+
+ Intended usage: COMMON
+
+ Restrictions on usage: none
+
+ Author: Simon Perreault
+
+ Change controller: IETF
+
+9. Acknowledgments
+
+ Thanks to the following people for their input:
+
+ Alexey Melnikov, Barry Leiba, Bjorn Hoehrmann, Cyrus Daboo, Joe
+ Hildebrand, Joseph Smarr, Marc Blanchet, Mike Douglass, Peter Saint-
+ Andre, Robins George, Zahhar Kirillov, Zoltan Ordogh.
+
+
+10. References
+
+10.1. Normative References
+
+ [ISO.19757-2.2008]
+ International Organization for Standardization,
+ "Information technology -- Document Schema Definition
+ Language (DSDL) -- Part 2: Regular-grammar-based
+ validation -- RELAX NG", ISO International
+ Standard 19757-2, October 2008.
+
+ [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
+ Requirement Levels", BCP 14, RFC 2119, March 1997.
+
+ [RFC3023] Murata, M., St. Laurent, S., and D. Kohn, "XML Media
+ Types", RFC 3023, January 2001.
+
+ [RFC6350] Perreault, S., "vCard Format Specification", RFC 6350,
+ August 2011.
+
+
+
+Perreault Standards Track [Page 12]
+
+RFC 6351 xCard August 2011
+
+
+ [W3C.REC-xml-20081126]
+ Paoli, J., Yergeau, F., Maler, E., Bray, T., and C.
+ Sperberg-McQueen, "Extensible Markup Language (XML) 1.0
+ (Fifth Edition)", World Wide Web Consortium
+ Recommendation REC-xml-20081126, November 2008,
+ <http://www.w3.org/TR/2008/REC-xml-20081126>.
+
+ [W3C.REC-xml-names-20091208]
+ Bray, T., Hollander, D., Layman, A., Tobin, R., and H.
+ Thompson, "Namespaces in XML 1.0 (Third Edition)", World
+ Wide Web Consortium Recommendation REC-xml-names-20091208,
+ December 2009,
+ <http://www.w3.org/TR/2009/REC-xml-names-20091208>.
+
+10.2. Informative References
+
+ [RFC4288] Freed, N. and J. Klensin, "Media Type Specifications and
+ Registration Procedures", BCP 13, RFC 4288, December 2005.
+
+ [VCARD-DTD]
+ Dawson, F., "The vCard v3.0 XML DTD", Work in Progress,
+ June 1998.
+
+ [W3C.CR-xmldsig-core1-20110303]
+ Roessler, T., Solo, D., Yiu, K., Reagle, J., Hirsch, F.,
+ Eastlake, D., and M. Nystroem, "XML Signature Syntax and
+ Processing Version 1.1", World Wide Web Consortium CR CR-
+ xmldsig-core1-20110303, March 2011,
+ <http://www.w3.org/TR/2011/CR-xmldsig-core1-20110303>.
+
+ [W3C.CR-xmlenc-core1-20110303]
+ Eastlake, D., Reagle, J., Roessler, T., and F. Hirsch,
+ "XML Encryption Syntax and Processing Version 1.1", World
+ Wide Web Consortium CR CR-xmlenc-core1-20110303,
+ March 2011,
+ <http://www.w3.org/TR/2011/CR-xmlenc-core1-20110303>.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Perreault Standards Track [Page 13]
+
+RFC 6351 xCard August 2011
+
+
+Appendix A. Relax NG Schema
+
+default namespace = "urn:ietf:params:xml:ns:vcard-4.0"
+
+### Section 3.3: vCard Format Specification
+#
+# 3.3
+iana-token = xsd:string { pattern = "[a-zA-Z0-9-]+" }
+x-name = xsd:string { pattern = "x-[a-zA-Z0-9-]+" }
+
+### Section 4: Value types
+#
+# 4.1
+value-text = element text { text }
+value-text-list = value-text+
+
+# 4.2
+value-uri = element uri { xsd:anyURI }
+
+# 4.3.1
+value-date = element date {
+ xsd:string { pattern = "\d{8}|\d{4}-\d\d|--\d\d(\d\d)?|---\d\d" }
+ }
+
+# 4.3.2
+value-time = element time {
+ xsd:string { pattern = "(\d\d(\d\d(\d\d)?)?|-\d\d(\d\d?)|--\d\d)"
+ ~ "(Z|[+\-]\d\d(\d\d)?)?" }
+ }
+
+# 4.3.3
+value-date-time = element date-time {
+ xsd:string { pattern = "(\d{8}|--\d{4}|---\d\d)T\d\d(\d\d(\d\d)?)?"
+ ~ "(Z|[+\-]\d\d(\d\d)?)?" }
+ }
+
+# 4.3.4
+value-date-and-or-time = value-date | value-date-time | value-time
+
+# 4.3.5
+value-timestamp = element timestamp {
+ xsd:string { pattern = "\d{8}T\d{6}(Z|[+\-]\d\d(\d\d)?)?" }
+ }
+
+# 4.4
+value-boolean = element boolean { xsd:boolean }
+
+
+
+
+
+Perreault Standards Track [Page 14]
+
+RFC 6351 xCard August 2011
+
+
+# 4.5
+value-integer = element integer { xsd:integer }
+
+# 4.6
+value-float = element float { xsd:float }
+
+# 4.7
+value-utc-offset = element utc-offset {
+ xsd:string { pattern = "[+\-]\d\d(\d\d)?" }
+ }
+
+# 4.8
+value-language-tag = element language-tag {
+ xsd:string { pattern = "([a-z]{2,3}((-[a-z]{3}){0,3})?|[a-z]{4,8})"
+ ~ "(-[a-z]{4})?(-([a-z]{2}|\d{3}))?"
+ ~ "(-([0-9a-z]{5,8}|\d[0-9a-z]{3}))*"
+ ~ "(-[0-9a-wyz](-[0-9a-z]{2,8})+)*"
+ ~ "(-x(-[0-9a-z]{1,8})+)?|x(-[0-9a-z]{1,8})+|"
+ ~ "[a-z]{1,3}(-[0-9a-z]{2,8}){1,2}" }
+ }
+
+### Section 5: Parameters
+#
+# 5.1
+param-language = element language { value-language-tag }?
+
+# 5.2
+param-pref = element pref {
+ element integer {
+ xsd:integer { minInclusive = "1" maxInclusive = "100" }
+ }
+ }?
+
+# 5.4
+param-altid = element altid { value-text }?
+
+# 5.5
+param-pid = element pid {
+ element text { xsd:string { pattern = "\d+(\.\d+)?" } }+
+ }?
+
+# 5.6
+param-type = element type { element text { "work" | "home" }+ }?
+
+# 5.7
+param-mediatype = element mediatype { value-text }?
+
+
+
+
+
+Perreault Standards Track [Page 15]
+
+RFC 6351 xCard August 2011
+
+
+# 5.8
+param-calscale = element calscale { element text { "gregorian" } }?
+
+# 5.9
+param-sort-as = element sort-as { value-text+ }?
+
+# 5.10
+param-geo = element geo { value-uri }?
+
+# 5.11
+param-tz = element tz { value-text | value-uri }?
+
+### Section 6: Properties
+#
+# 6.1.3
+property-source = element source {
+ element parameters { param-altid, param-pid, param-pref,
+ param-mediatype },
+ value-uri
+ }
+
+# 6.1.4
+property-kind = element kind {
+ element text { "individual" | "group" | "org" | "location" |
+ x-name | iana-token }*
+ }
+
+# 6.2.1
+property-fn = element fn {
+ element parameters { param-language, param-altid, param-pid,
+ param-pref, param-type }?,
+ value-text
+ }
+
+# 6.2.2
+property-n = element n {
+ element parameters { param-language, param-sort-as, param-altid }?,
+ element surname { text }+,
+ element given { text }+,
+ element additional { text }+,
+ element prefix { text }+,
+ element suffix { text }+
+ }
+
+
+
+
+
+
+
+
+Perreault Standards Track [Page 16]
+
+RFC 6351 xCard August 2011
+
+
+# 6.2.3
+property-nickname = element nickname {
+ element parameters { param-language, param-altid, param-pid,
+ param-pref, param-type }?,
+ value-text-list
+ }
+
+# 6.2.4
+property-photo = element photo {
+ element parameters { param-altid, param-pid, param-pref, param-type,
+ param-mediatype }?,
+ value-uri
+ }
+
+# 6.2.5
+property-bday = element bday {
+ element parameters { param-altid, param-calscale }?,
+ (value-date-and-or-time | value-text)
+ }
+
+# 6.2.6
+property-anniversary = element anniversary {
+ element parameters { param-altid, param-calscale }?,
+ (value-date-and-or-time | value-text)
+ }
+
+# 6.2.7
+property-gender = element gender {
+ element sex { "" | "M" | "F" | "O" | "N" | "U" },
+ element identity { text }?
+ }
+
+# 6.3.1
+param-label = element label { value-text }?
+property-adr = element adr {
+ element parameters { param-language, param-altid, param-pid,
+ param-pref, param-type, param-geo, param-tz,
+ param-label }?,
+ element pobox { text }+,
+ element ext { text }+,
+ element street { text }+,
+ element locality { text }+,
+ element region { text }+,
+ element code { text }+,
+ element country { text }+
+ }
+
+
+
+
+
+Perreault Standards Track [Page 17]
+
+RFC 6351 xCard August 2011
+
+
+# 6.4.1
+property-tel = element tel {
+ element parameters {
+ param-altid,
+ param-pid,
+ param-pref,
+ element type {
+ element text { "work" | "home" | "text" | "voice"
+ | "fax" | "cell" | "video" | "pager"
+ | "textphone" }+
+ }?,
+ param-mediatype
+ }?,
+ (value-text | value-uri)
+ }
+
+# 6.4.2
+property-email = element email {
+ element parameters { param-altid, param-pid, param-pref,
+ param-type }?,
+ value-text
+ }
+
+# 6.4.3
+property-impp = element impp {
+ element parameters { param-altid, param-pid, param-pref,
+ param-type, param-mediatype }?,
+ value-uri
+ }
+
+# 6.4.4
+property-lang = element lang {
+ element parameters { param-altid, param-pid, param-pref,
+ param-type }?,
+ value-language-tag
+ }
+
+# 6.5.1
+property-tz = element tz {
+ element parameters { param-altid, param-pid, param-pref,
+ param-type, param-mediatype }?,
+ (value-text | value-uri | value-utc-offset)
+ }
+
+
+
+
+
+
+
+
+Perreault Standards Track [Page 18]
+
+RFC 6351 xCard August 2011
+
+
+# 6.5.2
+property-geo = element geo {
+ element parameters { param-altid, param-pid, param-pref,
+ param-type, param-mediatype }?,
+ value-uri
+ }
+
+# 6.6.1
+property-title = element title {
+ element parameters { param-language, param-altid, param-pid,
+ param-pref, param-type }?,
+ value-text
+ }
+
+# 6.6.2
+property-role = element role {
+ element parameters { param-language, param-altid, param-pid,
+ param-pref, param-type }?,
+ value-text
+ }
+
+# 6.6.3
+property-logo = element logo {
+ element parameters { param-language, param-altid, param-pid,
+ param-pref, param-type, param-mediatype }?,
+ value-uri
+ }
+
+# 6.6.4
+property-org = element org {
+ element parameters { param-language, param-altid, param-pid,
+ param-pref, param-type, param-sort-as }?,
+ value-text-list
+ }
+
+# 6.6.5
+property-member = element member {
+ element parameters { param-altid, param-pid, param-pref,
+ param-mediatype }?,
+ value-uri
+ }
+
+
+
+
+
+
+
+
+
+
+Perreault Standards Track [Page 19]
+
+RFC 6351 xCard August 2011
+
+
+# 6.6.6
+property-related = element related {
+ element parameters {
+ param-altid,
+ param-pid,
+ param-pref,
+ element type {
+ element text {
+ "work" | "home" | "contact" | "acquaintance" |
+ "friend" | "met" | "co-worker" | "colleague" | "co-resident" |
+ "neighbor" | "child" | "parent" | "sibling" | "spouse" |
+ "kin" | "muse" | "crush" | "date" | "sweetheart" | "me" |
+ "agent" | "emergency"
+ }+
+ }?,
+ param-mediatype
+ }?,
+ (value-uri | value-text)
+ }
+
+# 6.7.1
+property-categories = element categories {
+ element parameters { param-altid, param-pid, param-pref,
+ param-type }?,
+ value-text-list
+ }
+
+# 6.7.2
+property-note = element note {
+ element parameters { param-language, param-altid, param-pid,
+ param-pref, param-type }?,
+ value-text
+ }
+
+# 6.7.3
+property-prodid = element prodid { value-text }
+
+# 6.7.4
+property-rev = element rev { value-timestamp }
+
+# 6.7.5
+property-sound = element sound {
+ element parameters { param-language, param-altid, param-pid,
+ param-pref, param-type, param-mediatype }?,
+ value-uri
+ }
+
+
+
+
+
+Perreault Standards Track [Page 20]
+
+RFC 6351 xCard August 2011
+
+
+# 6.7.6
+property-uid = element uid { value-uri }
+
+# 6.7.7
+property-clientpidmap = element clientpidmap {
+ element sourceid { xsd:positiveInteger },
+ value-uri
+ }
+
+# 6.7.8
+property-url = element url {
+ element parameters { param-altid, param-pid, param-pref,
+ param-type, param-mediatype }?,
+ value-uri
+ }
+
+# 6.8.1
+property-key = element key {
+ element parameters { param-altid, param-pid, param-pref,
+ param-type, param-mediatype }?,
+ (value-uri | value-text)
+ }
+
+# 6.9.1
+property-fburl = element fburl {
+ element parameters { param-altid, param-pid, param-pref,
+ param-type, param-mediatype }?,
+ value-uri
+ }
+
+# 6.9.2
+property-caladruri = element caladruri {
+ element parameters { param-altid, param-pid, param-pref,
+ param-type, param-mediatype }?,
+ value-uri
+ }
+
+# 6.9.3
+property-caluri = element caluri {
+ element parameters { param-altid, param-pid, param-pref,
+ param-type, param-mediatype }?,
+ value-uri
+ }
+
+
+
+
+
+
+
+
+Perreault Standards Track [Page 21]
+
+RFC 6351 xCard August 2011
+
+
+# Top-level grammar
+property = property-adr | property-anniversary | property-bday
+ | property-caladruri | property-caluri | property-categories
+ | property-clientpidmap | property-email | property-fburl
+ | property-fn | property-geo | property-impp | property-key
+ | property-kind | property-lang | property-logo
+ | property-member | property-n | property-nickname
+ | property-note | property-org | property-photo
+ | property-prodid | property-related | property-rev
+ | property-role | property-gender | property-sound
+ | property-source | property-tel | property-title
+ | property-tz | property-uid | property-url
+start = element vcards {
+ element vcard {
+ (property
+ | element group {
+ attribute name { text },
+ property*
+ })+
+ }+
+ }
+
+Author's Address
+
+ Simon Perreault
+ Viagenie
+ 2600 boul. Laurier, Suite 625
+ Quebec, QC G1V 4W1
+ Canada
+
+ Phone: +1 418 656 9254
+ EMail: simon.perreault@viagenie.ca
+ URI: http://www.viagenie.ca
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Perreault Standards Track [Page 22]
+
diff --git a/vendor/sabre/dav/docs/rfc6352.txt b/vendor/sabre/dav/docs/rfc6352.txt
new file mode 100644
index 000000000..cb03747b4
--- /dev/null
+++ b/vendor/sabre/dav/docs/rfc6352.txt
@@ -0,0 +1,2691 @@
+
+
+
+
+
+
+Internet Engineering Task Force (IETF) C. Daboo
+Request for Comments: 6352 Apple
+Category: Standards Track August 2011
+ISSN: 2070-1721
+
+
+ CardDAV: vCard Extensions to
+ Web Distributed Authoring and Versioning (WebDAV)
+
+Abstract
+
+ This document defines extensions to the Web Distributed Authoring and
+ Versioning (WebDAV) protocol to specify a standard way of accessing,
+ managing, and sharing contact information based on the vCard format.
+
+Status of This Memo
+
+ This is an Internet Standards Track document.
+
+ This document is a product of the Internet Engineering Task Force
+ (IETF). It represents the consensus of the IETF community. It has
+ received public review and has been approved for publication by the
+ Internet Engineering Steering Group (IESG). Further information on
+ Internet Standards is available in Section 2 of RFC 5741.
+
+ Information about the current status of this document, any errata,
+ and how to provide feedback on it may be obtained at
+ http://www.rfc-editor.org/info/rfc6352.
+
+Copyright Notice
+
+ Copyright (c) 2011 IETF Trust and the persons identified as the
+ document authors. All rights reserved.
+
+ This document is subject to BCP 78 and the IETF Trust's Legal
+ Provisions Relating to IETF Documents
+ (http://trustee.ietf.org/license-info) in effect on the date of
+ publication of this document. Please review these documents
+ carefully, as they describe your rights and restrictions with respect
+ to this document. Code Components extracted from this document must
+ include Simplified BSD License text as described in Section 4.e of
+ the Trust Legal Provisions and are provided without warranty as
+ described in the Simplified BSD License.
+
+ This document may contain material from IETF Documents or IETF
+ Contributions published or made publicly available before November
+ 10, 2008. The person(s) controlling the copyright in some of this
+ material may not have granted the IETF Trust the right to allow
+
+
+
+Daboo Standards Track [Page 1]
+
+RFC 6352 CardDAV August 2011
+
+
+ modifications of such material outside the IETF Standards Process.
+ Without obtaining an adequate license from the person(s) controlling
+ the copyright in such materials, this document may not be modified
+ outside the IETF Standards Process, and derivative works of it may
+ not be created outside the IETF Standards Process, except to format
+ it for publication as an RFC or to translate it into languages other
+ than English.
+
+Table of Contents
+
+ 1. Introduction and Overview . . . . . . . . . . . . . . . . . . 4
+ 2. Conventions . . . . . . . . . . . . . . . . . . . . . . . . . 5
+ 3. Requirements Overview . . . . . . . . . . . . . . . . . . . . 6
+ 4. Address Book Data Model . . . . . . . . . . . . . . . . . . . 7
+ 4.1. Address Book Server . . . . . . . . . . . . . . . . . . . 7
+ 5. Address Book Resources . . . . . . . . . . . . . . . . . . . . 7
+ 5.1. Address Object Resources . . . . . . . . . . . . . . . . . 7
+ 5.1.1. Data Type Conversion . . . . . . . . . . . . . . . . . 8
+ 5.1.1.1. Additional Precondition for GET . . . . . . . . . 8
+ 5.2. Address Book Collections . . . . . . . . . . . . . . . . . 9
+ 6. Address Book Feature . . . . . . . . . . . . . . . . . . . . . 10
+ 6.1. Address Book Support . . . . . . . . . . . . . . . . . . . 10
+ 6.1.1. Example: Using OPTIONS for the Discovery of
+ Support for CardDAV . . . . . . . . . . . . . . . . . 10
+ 6.2. Address Book Properties . . . . . . . . . . . . . . . . . 10
+ 6.2.1. CARDDAV:addressbook-description Property . . . . . . . 10
+ 6.2.2. CARDDAV:supported-address-data Property . . . . . . . 11
+ 6.2.3. CARDDAV:max-resource-size Property . . . . . . . . . . 12
+ 6.3. Creating Resources . . . . . . . . . . . . . . . . . . . . 13
+ 6.3.1. Extended MKCOL Method . . . . . . . . . . . . . . . . 13
+ 6.3.1.1. Example - Successful MKCOL Request . . . . . . . . 14
+ 6.3.2. Creating Address Object Resources . . . . . . . . . . 15
+ 6.3.2.1. Additional Preconditions for PUT, COPY, and
+ MOVE . . . . . . . . . . . . . . . . . . . . . . . 16
+ 6.3.2.2. Non-Standard vCard Properties and Parameters . . . 17
+ 6.3.2.3. Address Object Resource Entity Tag . . . . . . . . 18
+ 7. Address Book Access Control . . . . . . . . . . . . . . . . . 18
+ 7.1. Additional Principal Properties . . . . . . . . . . . . . 18
+ 7.1.1. CARDDAV:addressbook-home-set Property . . . . . . . . 19
+ 7.1.2. CARDDAV:principal-address Property . . . . . . . . . . 19
+ 8. Address Book Reports . . . . . . . . . . . . . . . . . . . . . 20
+ 8.1. REPORT Method . . . . . . . . . . . . . . . . . . . . . . 20
+ 8.2. Ordinary Collections . . . . . . . . . . . . . . . . . . . 21
+ 8.3. Searching Text: Collations . . . . . . . . . . . . . . . . 21
+ 8.3.1. CARDDAV:supported-collation-set Property . . . . . . . 22
+ 8.4. Partial Retrieval . . . . . . . . . . . . . . . . . . . . 23
+ 8.5. Non-Standard Properties and Parameters . . . . . . . . . . 23
+
+
+
+
+Daboo Standards Track [Page 2]
+
+RFC 6352 CardDAV August 2011
+
+
+ 8.6. CARDDAV:addressbook-query Report . . . . . . . . . . . . . 23
+ 8.6.1. Limiting Results . . . . . . . . . . . . . . . . . . . 25
+ 8.6.2. Truncation of Results . . . . . . . . . . . . . . . . 25
+ 8.6.3. Example: Partial Retrieval of vCards Matching
+ NICKNAME . . . . . . . . . . . . . . . . . . . . . . . 26
+ 8.6.4. Example: Partial Retrieval of vCards Matching a
+ Full Name or Email Address . . . . . . . . . . . . . . 27
+ 8.6.5. Example: Truncated Results . . . . . . . . . . . . . . 29
+ 8.7. CARDDAV:addressbook-multiget Report . . . . . . . . . . . 31
+ 8.7.1. Example: CARDDAV:addressbook-multiget Report . . . . . 32
+ 8.7.2. Example: CARDDAV:addressbook-multiget Report . . . . . 33
+ 9. Client Guidelines . . . . . . . . . . . . . . . . . . . . . . 34
+ 9.1. Restrict the Properties Returned . . . . . . . . . . . . . 34
+ 9.2. Avoiding Lost Updates . . . . . . . . . . . . . . . . . . 35
+ 9.3. Client Configuration . . . . . . . . . . . . . . . . . . . 35
+ 9.4. Finding Other Users' Address Books . . . . . . . . . . . . 35
+ 10. XML Element Definitions . . . . . . . . . . . . . . . . . . . 36
+ 10.1. CARDDAV:addressbook XML Element . . . . . . . . . . . . . 36
+ 10.2. CARDDAV:supported-collation XML Element . . . . . . . . . 36
+ 10.3. CARDDAV:addressbook-query XML Element . . . . . . . . . . 37
+ 10.4. CARDDAV:address-data XML Element . . . . . . . . . . . . . 37
+ 10.4.1. CARDDAV:allprop XML Element . . . . . . . . . . . . . 39
+ 10.4.2. CARDDAV:prop XML Element . . . . . . . . . . . . . . . 39
+ 10.5. CARDDAV:filter XML Element . . . . . . . . . . . . . . . . 40
+ 10.5.1. CARDDAV:prop-filter XML Element . . . . . . . . . . . 40
+ 10.5.2. CARDDAV:param-filter XML Element . . . . . . . . . . . 41
+ 10.5.3. CARDDAV:is-not-defined XML Element . . . . . . . . . . 42
+ 10.5.4. CARDDAV:text-match XML Element . . . . . . . . . . . . 42
+ 10.6. CARDDAV:limit XML Element . . . . . . . . . . . . . . . . 43
+ 10.6.1. CARDDAV:nresults XML Element . . . . . . . . . . . . . 44
+ 10.7. CARDDAV:addressbook-multiget XML Element . . . . . . . . . 44
+ 11. Service Discovery via SRV Records . . . . . . . . . . . . . . 45
+ 12. Internationalization Considerations . . . . . . . . . . . . . 45
+ 13. Security Considerations . . . . . . . . . . . . . . . . . . . 45
+ 14. IANA Consideration . . . . . . . . . . . . . . . . . . . . . . 46
+ 14.1. Namespace Registration . . . . . . . . . . . . . . . . . . 46
+ 15. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 46
+ 16. References . . . . . . . . . . . . . . . . . . . . . . . . . . 47
+ 16.1. Normative References . . . . . . . . . . . . . . . . . . . 47
+ 16.2. Informative References . . . . . . . . . . . . . . . . . . 48
+
+
+
+
+
+
+
+
+
+
+
+Daboo Standards Track [Page 3]
+
+RFC 6352 CardDAV August 2011
+
+
+1. Introduction and Overview
+
+ Address books containing contact information are a key component of
+ personal information management tools, such as email, calendaring and
+ scheduling, and instant messaging clients. To date several protocols
+ have been used for remote access to contact data, including the
+ Lightweight Directory Access Protocol (LDAP) [RFC4510], Internet
+ Message Support Protocol [IMSP], and Application Configuration Access
+ Protocol (ACAP) [RFC2244], together with SyncML used for
+ synchronization of such data.
+
+ WebDAV [RFC4918] offers a number of advantages as a framework or
+ basis for address book access and management. Most of these
+ advantages boil down to a significant reduction in the costs of
+ design, implementation, interoperability testing, and deployment.
+
+ The key features of address book support with WebDAV are:
+
+ 1. Ability to use multiple address books with hierarchical layout.
+
+ 2. Ability to control access to individual address books and address
+ entries as per WebDAV Access Control List (ACL) [RFC3744].
+
+ 3. Principal collections can be used to enumerate and query other
+ users on the system as per WebDAV ACL [RFC3744].
+
+ 4. Server-side searching of address data, avoiding the need for
+ clients to download an entire address book in order to do a quick
+ address 'expansion' operation.
+
+ 5. Well-defined internationalization support through WebDAV's use of
+ XML.
+
+ 6. Use of vCards [RFC2426] for well-defined address schema to
+ enhance client interoperability.
+
+ 7. Many limited clients (e.g., mobile devices) contain an HTTP stack
+ that makes implementing WebDAV much easier than other protocols.
+
+ The key disadvantage of address book support in WebDAV is:
+
+ 1. Lack of change notification. Many of the alternative protocols
+ also lack this ability. However, an extension for push
+ notifications could easily be developed.
+
+ vCard is a MIME directory profile aimed at encapsulating personal
+ addressing and contact information about people. The specification
+ of vCard was originally done by the Versit consortium, with a
+
+
+
+Daboo Standards Track [Page 4]
+
+RFC 6352 CardDAV August 2011
+
+
+ subsequent 3.0 version standardized by the IETF [RFC2426]. vCard is
+ in widespread use in email clients and mobile devices as a means of
+ encapsulating address information for transport via email or for
+ import/export and synchronization operations.
+
+ An update to vCard -- vCard v4 -- is currently being developed
+ [RFC6350] and is compatible with this specification.
+
+2. Conventions
+
+ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
+ "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
+ document are to be interpreted as described in [RFC2119].
+
+ The term "protected" is used in the Conformance field of property
+ definitions as defined in Section 15 of [RFC4918].
+
+ This document uses XML DTD fragments ([W3C.REC-xml-20081126], Section
+ 3.2) as a purely notational convention. WebDAV request and response
+ bodies cannot be validated by a DTD due to the specific extensibility
+ rules defined in Section 17 of [RFC4918] and due to the fact that all
+ XML elements defined by that specification use the XML namespace name
+ "DAV:". In particular:
+
+ 1. Element names use the "DAV:" namespace.
+
+ 2. Element ordering is irrelevant unless explicitly stated.
+
+ 3. Extension elements (elements not already defined as valid child
+ elements) may be added anywhere, except when explicitly stated
+ otherwise.
+
+ 4. Extension attributes (attributes not already defined as valid for
+ this element) may be added anywhere, except when explicitly
+ stated otherwise.
+
+ The namespace "urn:ietf:params:xml:ns:carddav" is reserved for the
+ XML elements defined in this specification, its revisions, and
+ related CardDAV specifications. XML elements defined by individual
+ implementations MUST NOT use the "urn:ietf:params:xml:ns:carddav"
+ namespace, and instead should use a namespace that they control.
+
+ When XML element types in the namespaces "DAV:" and
+ "urn:ietf:params:xml:ns:carddav" are referenced in this document
+ outside of the context of an XML fragment, the strings "DAV:" and
+ "CARDDAV:" will be prefixed to the element types, respectively.
+
+
+
+
+
+Daboo Standards Track [Page 5]
+
+RFC 6352 CardDAV August 2011
+
+
+ This document inherits, and sometimes extends, DTD productions from
+ Section 14 of [RFC4918].
+
+ Also, note that some CardDAV XML element names are identical to
+ WebDAV XML element names, though their namespace differs. Care must
+ be taken not to confuse the two sets of names.
+
+3. Requirements Overview
+
+ This section lists what functionality is required of a CardDAV
+ server. To advertise support for CardDAV, a server:
+
+ o MUST support vCard v3 [RFC2426] as a media type for the address
+ object resource format;
+
+ o MUST support WebDAV Class 3 [RFC4918];
+
+ o MUST support WebDAV ACL [RFC3744];
+
+ o MUST support secure transport as defined in [RFC2818] using
+ Transport Layer Security (TLS) [RFC5246] and using the certificate
+ validation procedures described in [RFC5280];
+
+ o MUST support ETags [RFC2616] with additional requirements
+ specified in Section 6.3.2.3 of this document;
+
+ o MUST support all address book reports defined in Section 8 of this
+ document; and
+
+ o MUST advertise support on all address book collections and address
+ object resources for the address book reports in the
+ DAV:supported-report-set property, as defined in Versioning
+ Extensions to WebDAV [RFC3253].
+
+ In addition, a server:
+
+ o SHOULD support vCard v4 [RFC6350] as a media type for the address
+ object resource format;
+
+ o SHOULD support the extended MKCOL method [RFC5689] to create
+ address book collections as defined in Section 6.3.1 of this
+ document.
+
+ o SHOULD support the DAV:current-user-principal-URL property as
+ defined in [RFC5397] to give clients a fast way to locate user
+ principals.
+
+
+
+
+
+Daboo Standards Track [Page 6]
+
+RFC 6352 CardDAV August 2011
+
+
+4. Address Book Data Model
+
+ As a brief overview, a CardDAV address book is modeled as a WebDAV
+ collection with a well-defined structure; each of these address book
+ collections contains a number of resources representing address
+ objects as their direct child resources. Each resource representing
+ an address object is called an "address object resource". Each
+ address object resource and each address book collection can be
+ individually locked and have individual WebDAV properties.
+ Requirements derived from this model are provided in Sections 5.1 and
+ 5.2.
+
+4.1. Address Book Server
+
+ A CardDAV server is an address-aware engine combined with a WebDAV
+ server. The server may include address data in some parts of its URL
+ namespace and non-address data in other parts.
+
+ A WebDAV server can advertise itself as a CardDAV server if it
+ supports the functionality defined in this specification at any point
+ within the root of its repository. That might mean that address data
+ is spread throughout the repository and mixed with non-address data
+ in nearby collections (e.g., address data may be found in /lisa/
+ addressbook/ as well as in /bernard/addressbook/, and non-address
+ data in /lisa/calendars/). Or, it might mean that address data can
+ be found only in certain sections of the repository (e.g.,
+ /addressbooks/user/). Address book features are only required in the
+ repository sections that are or contain address objects. So, a
+ repository confining address data to the /carddav/ collection would
+ only need to support the CardDAV required features within that
+ collection.
+
+ The CardDAV server is the canonical location for address data and
+ state information. Clients may submit requests to change data or
+ download data. Clients may store address objects offline and attempt
+ to synchronize at a later time. Address data on the server can
+ change between the time of last synchronization and when attempting
+ an update, as address book collections may be shared and accessible
+ via multiple clients. Entity tags and locking help this work.
+
+5. Address Book Resources
+
+5.1. Address Object Resources
+
+ This specification uses vCard as the default format for address or
+ contact information being stored on the server. However, this
+ specification does allow other formats for address data provided that
+ the server advertises support for those additional formats as
+
+
+
+Daboo Standards Track [Page 7]
+
+RFC 6352 CardDAV August 2011
+
+
+ described below. The requirements in this section pertain to vCard
+ address data or formats that follow the semantics of vCard data.
+
+ Address object resources contained in address book collections MUST
+ contain a single vCard component only.
+
+ vCard components in an address book collection MUST have a UID
+ property value that MUST be unique in the scope of the address book
+ collection in which it is contained.
+
+5.1.1. Data Type Conversion
+
+ Servers might support more than one primary media type for address
+ object resources, for example, vCard v3.0 and vCard v4.0. In such
+ cases, servers have to accept all media types that they advertise via
+ the CARDDAV:supported-address-data WebDAV property (see
+ Section 6.2.2).
+
+ However, clients can use standard HTTP content negotiation behavior
+ (the Accept request header defined in Section 14.1 of [RFC2616]) to
+ request that an address object resource's data be returned in a
+ specific media type format. For example, a client merely capable of
+ handling vCard v3.0 would only want to have address object resources
+ returned in v3.0 format.
+
+ Additionally, REPORT requests, defined later in this specification,
+ allow for the return of address object resource data within an XML
+ response body. Again, the client can use content negotiation to
+ request that data be returned in a specific media type by specifying
+ appropriate attributes on the CARDDAV:address-data XML element used
+ in the request body (see Section 10.4).
+
+ In some cases, it might not be possible for a server to convert from
+ one media type to another. When that happens, the server MUST return
+ the CARDDAV:supported-address-data-conversion precondition (see
+ below) in the response body (when the failure to convert applies to
+ the entire response) or use that same precondition code in the
+ DAV:response XML element in the response for the targeted address
+ object resource when one of the REPORTs defined below is used. See
+ Section 8.7.2 for an example of this.
+
+5.1.1.1. Additional Precondition for GET
+
+ This specification creates additional preconditions for the GET
+ method.
+
+
+
+
+
+
+Daboo Standards Track [Page 8]
+
+RFC 6352 CardDAV August 2011
+
+
+ The new precondition is:
+
+ (CARDDAV:supported-address-data-conversion): The resource targeted
+ by the GET request can be converted to the media type specified in
+ the Accept request header included with the request.
+
+5.2. Address Book Collections
+
+ Address book collections appear to clients as a WebDAV collection
+ resource, identified by a URL. An address book collection MUST
+ report the DAV:collection and CARDDAV:addressbook XML elements in the
+ value of the DAV:resourcetype property. The element type declaration
+ for CARDDAV:addressbook is:
+
+ <!ELEMENT addressbook EMPTY>
+
+ An address book collection can be created through provisioning (e.g.,
+ automatically created when a user's account is provisioned), or it
+ can be created with the extended MKCOL method (see Section 6.3.1).
+ This can be used by a user to create additional address books (e.g.,
+ "soccer team members") or for users to share an address book (e.g.,
+ "sales team contacts"). However, note that this document doesn't
+ define what extra address book collections are for. Users must rely
+ on non-standard cues to find out what an address book collection is
+ for, or use the CARDDAV:addressbook-description property defined in
+ Section 6.2.1 to provide such a cue.
+
+ The following restrictions are applied to the resources within an
+ address book collection:
+
+ a. Address book collections MUST only contain address object
+ resources and collections that are not address book collections.
+ That is, the only "top-level" non-collection resources allowed in
+ an address book collection are address object resources. This
+ ensures that address book clients do not have to deal with non-
+ address data in an address book collection, though they do have
+ to distinguish between address object resources and collections
+ when using standard WebDAV techniques to examine the contents of
+ a collection.
+
+ b. Collections contained in address book collections MUST NOT
+ contain address book collections at any depth. That is,
+ "nesting" of address book collections within other address book
+ collections at any depth is not allowed. This specification does
+ not define how collections contained in an address book
+ collection are used or how they relate to any address object
+ resources contained in the address book collection.
+
+
+
+
+Daboo Standards Track [Page 9]
+
+RFC 6352 CardDAV August 2011
+
+
+ Multiple address book collections MAY be children of the same
+ collection.
+
+6. Address Book Feature
+
+6.1. Address Book Support
+
+ A server supporting the features described in this document MUST
+ include "addressbook" as a field in the DAV response header from an
+ OPTIONS request on any resource that supports any address book
+ properties, reports, or methods. A value of "addressbook" in the DAV
+ response header MUST indicate that the server supports all MUST level
+ requirements and REQUIRED features specified in this document.
+
+6.1.1. Example: Using OPTIONS for the Discovery of Support for CardDAV
+
+ >> Request <<
+
+ OPTIONS /addressbooks/users/ HTTP/1.1
+ Host: addressbook.example.com
+
+ >> Response <<
+
+ HTTP/1.1 200 OK
+ Allow: OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, COPY, MOVE
+ Allow: MKCOL, PROPFIND, PROPPATCH, LOCK, UNLOCK, REPORT, ACL
+ DAV: 1, 2, 3, access-control, addressbook
+ DAV: extended-mkcol
+ Date: Sat, 11 Nov 2006 09:32:12 GMT
+ Content-Length: 0
+
+ In this example, the OPTIONS response indicates that the server
+ supports CardDAV in this namespace; therefore, the '/addressbooks/
+ users/' collection may be used as a parent for address book
+ collections as the extended MKCOL method is available and as a
+ possible target for REPORT requests for address book reports.
+
+6.2. Address Book Properties
+
+6.2.1. CARDDAV:addressbook-description Property
+
+ Name: addressbook-description
+
+ Namespace: urn:ietf:params:xml:ns:carddav
+
+ Purpose: Provides a human-readable description of the address book
+ collection.
+
+
+
+
+Daboo Standards Track [Page 10]
+
+RFC 6352 CardDAV August 2011
+
+
+ Value: Any text.
+
+ Protected: SHOULD NOT be protected so that users can specify a
+ description.
+
+ COPY/MOVE behavior: This property value SHOULD be preserved in COPY
+ and MOVE operations.
+
+ allprop behavior: SHOULD NOT be returned by a PROPFIND DAV:allprop
+ request.
+
+ Description: This property contains a description of the address
+ book collection that is suitable for presentation to a user. The
+ xml:lang attribute can be used to add a language tag for the value
+ of this property.
+
+ Definition:
+
+ <!ELEMENT addressbook-description (#PCDATA)>
+ <!-- PCDATA value: string -->
+
+ Example:
+
+ <C:addressbook-description xml:lang="fr-CA"
+ xmlns:C="urn:ietf:params:xml:ns:carddav"
+ >Adresses de Oliver Daboo</C:addressbook-description>
+
+6.2.2. CARDDAV:supported-address-data Property
+
+ Name: supported-address-data
+
+ Namespace: urn:ietf:params:xml:ns:carddav
+
+ Purpose: Specifies what media types are allowed for address object
+ resources in an address book collection.
+
+ Protected: MUST be protected as it indicates the level of support
+ provided by the server.
+
+ COPY/MOVE behavior: This property value MUST be preserved in COPY
+ and MOVE operations.
+
+ allprop behavior: SHOULD NOT be returned by a PROPFIND DAV:allprop
+ request.
+
+ Description: The CARDDAV:supported-address-data property is used to
+ specify the media type supported for the address object resources
+ contained in a given address book collection (e.g., vCard version
+
+
+
+Daboo Standards Track [Page 11]
+
+RFC 6352 CardDAV August 2011
+
+
+ 3.0). Any attempt by the client to store address object resources
+ with a media type not listed in this property MUST result in an
+ error, with the CARDDAV:supported-address-data precondition
+ (Section 6.3.2.1) being violated. In the absence of this
+ property, the server MUST only accept data with the media type
+ "text/vcard" and vCard version 3.0, and clients can assume that is
+ all the server will accept.
+
+ Definition:
+
+ <!ELEMENT supported-address-data (address-data-type+)>
+
+ <!ELEMENT address-data-type EMPTY>
+ <!ATTLIST address-data-type content-type CDATA "text/vcard"
+ version CDATA "3.0">
+ <!-- content-type value: a MIME media type -->
+ <!-- version value: a version string -->
+
+ Example:
+
+ <C:supported-address-data
+ xmlns:C="urn:ietf:params:xml:ns:carddav">
+ <C:address-data-type content-type="text/vcard" version="3.0"/>
+ </C:supported-address-data>
+
+6.2.3. CARDDAV:max-resource-size Property
+
+ Name: max-resource-size
+
+ Namespace: urn:ietf:params:xml:ns:carddav
+
+ Purpose: Provides a numeric value indicating the maximum size in
+ octets of a resource that the server is willing to accept when an
+ address object resource is stored in an address book collection.
+
+ Value: Any text representing a numeric value.
+
+ Protected: MUST be protected as it indicates limits provided by the
+ server.
+
+ COPY/MOVE behavior: This property value MUST be preserved in COPY
+ and MOVE operations.
+
+ allprop behavior: SHOULD NOT be returned by a PROPFIND DAV:allprop
+ request.
+
+
+
+
+
+
+Daboo Standards Track [Page 12]
+
+RFC 6352 CardDAV August 2011
+
+
+ Description: The CARDDAV:max-resource-size is used to specify a
+ numeric value that represents the maximum size in octets that the
+ server is willing to accept when an address object resource is
+ stored in an address book collection. Any attempt to store an
+ address book object resource exceeding this size MUST result in an
+ error, with the CARDDAV:max-resource-size precondition
+ (Section 6.3.2.1) being violated. In the absence of this
+ property, the client can assume that the server will allow storing
+ a resource of any reasonable size.
+
+ Definition:
+
+ <!ELEMENT max-resource-size (#PCDATA)>
+ <!-- PCDATA value: a numeric value (positive decimal integer) -->
+
+ Example:
+
+ <C:max-resource-size xmlns:C="urn:ietf:params:xml:ns:carddav"
+ >102400</C:max-resource-size>
+
+6.3. Creating Resources
+
+ Address book collections and address object resources may be created
+ by either a CardDAV client or the CardDAV server. This specification
+ defines restrictions and a data model that both clients and servers
+ MUST adhere to when manipulating such address data.
+
+6.3.1. Extended MKCOL Method
+
+ An HTTP request using the extended MKCOL method [RFC5689] can be used
+ to create a new address book collection resource. A server MAY
+ restrict address book collection creation to particular collections.
+
+ To create an address book, the client sends an extended MKCOL request
+ to the server and in the body of the request sets the
+ DAV:resourcetype property to the resource type for an address book
+ collection as defined in Section 5.2.
+
+ Support for creating address books on the server is only RECOMMENDED
+ and not REQUIRED because some address book stores only support one
+ address book per user (or principal), and those are typically pre-
+ created for each account. However, servers and clients are strongly
+ encouraged to support address book creation whenever possible to
+ allow users to create multiple address book collections to help
+ organize their data better.
+
+
+
+
+
+
+Daboo Standards Track [Page 13]
+
+RFC 6352 CardDAV August 2011
+
+
+ The DAV:displayname property can be used for a human-readable name of
+ the address book. Clients can either specify the value of the
+ DAV:displayname property in the request body of the extended MKCOL
+ request or, alternatively, issue a PROPPATCH request to change the
+ DAV:displayname property to the appropriate value immediately after
+ using the extended MKCOL request. When displaying address book
+ collections to users, clients SHOULD check the DAV:displayname
+ property and use that value as the name of the address book. In the
+ event that the DAV:displayname property is not set, the client MAY
+ use the last part of the address book collection URI as the name;
+ however, that path segment may be "opaque" and not represent any
+ meaningful human-readable text.
+
+6.3.1.1. Example - Successful MKCOL Request
+
+ This example creates an address book collection called /home/lisa/
+ addressbook/ on the server addressbook.example.com with specific
+ values for the properties DAV:resourcetype, DAV:displayname, and
+ CARDDAV:addressbook-description.
+
+ >> Request <<
+
+ MKCOL /home/lisa/addressbook/ HTTP/1.1
+ Host: addressbook.example.com
+ Content-Type: text/xml; charset="utf-8"
+ Content-Length: xxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:mkcol xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:carddav">
+ <D:set>
+ <D:prop>
+ <D:resourcetype>
+ <D:collection/>
+ <C:addressbook/>
+ </D:resourcetype>
+ <D:displayname>Lisa's Contacts</D:displayname>
+ <C:addressbook-description xml:lang="en"
+ >My primary address book.</C:addressbook-description>
+ </D:prop>
+ </D:set>
+ </D:mkcol>
+
+
+
+
+
+
+
+
+
+Daboo Standards Track [Page 14]
+
+RFC 6352 CardDAV August 2011
+
+
+ >> Response <<
+
+ HTTP/1.1 201 Created
+ Cache-Control: no-cache
+ Date: Sat, 11 Nov 2006 09:32:12 GMT
+ Content-Type: application/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:mkcol-response xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:carddav">
+ <D:propstat>
+ <D:prop>
+ <D:resourcetype/>
+ <D:displayname/>
+ <C:addressbook-description/>
+ </D:prop>
+ <D:status>HTTP/1.1 200 OK</D:status>
+ </D:propstat>
+ </D:mkcol-response>
+
+6.3.2. Creating Address Object Resources
+
+ Clients populate address book collections with address object
+ resources. The URL for each address object resource is entirely
+ arbitrary and does not need to bear a specific relationship (but
+ might) to the address object resource's vCard properties or other
+ metadata. New address object resources MUST be created with a PUT
+ request targeted at an unmapped URI. A PUT request targeted at a
+ mapped URI updates an existing address object resource.
+
+ When servers create new resources, it's not hard for the server to
+ choose a unique URL. It's slightly tougher for clients, because a
+ client might not want to examine all resources in the collection and
+ might not want to lock the entire collection to ensure that a new one
+ isn't created with a name collision. However, there is an HTTP
+ feature to mitigate this. If the client intends to create a new
+ address resource, the client SHOULD use the HTTP header "If-None-
+ Match: *" on the PUT request. The Request-URI on the PUT request
+ MUST include the target collection, where the resource is to be
+ created, plus the name of the resource in the last path segment. The
+ "If-None-Match" header ensures that the client will not inadvertently
+ overwrite an existing resource even if the last path segment turned
+ out to already be used.
+
+
+
+
+
+
+
+Daboo Standards Track [Page 15]
+
+RFC 6352 CardDAV August 2011
+
+
+ >> Request <<
+
+ PUT /lisa/addressbook/newvcard.vcf HTTP/1.1
+ If-None-Match: *
+ Host: addressbook.example.com
+ Content-Type: text/vcard
+ Content-Length: xxx
+
+ BEGIN:VCARD
+ VERSION:3.0
+ FN:Cyrus Daboo
+ N:Daboo;Cyrus
+ ADR;TYPE=POSTAL:;2822 Email HQ;Suite 2821;RFCVille;PA;15213;USA
+ EMAIL;TYPE=INTERNET,PREF:cyrus@example.com
+ NICKNAME:me
+ NOTE:Example VCard.
+ ORG:Self Employed
+ TEL;TYPE=WORK,VOICE:412 605 0499
+ TEL;TYPE=FAX:412 605 0705
+ URL:http://www.example.com
+ UID:1234-5678-9000-1
+ END:VCARD
+
+ >> Response <<
+
+ HTTP/1.1 201 Created
+ Date: Thu, 02 Sep 2004 16:53:32 GMT
+ Content-Length: 0
+ ETag: "123456789-000-111"
+
+ The request to change an existing address object resource without
+ overwriting a change made on the server uses a specific ETag in an
+ "If-Match" header, rather than the "If-None-Match" header.
+
+ File names for vCards are commonly suffixed by ".vcf", and clients
+ may choose to use the same convention for URLs.
+
+6.3.2.1. Additional Preconditions for PUT, COPY, and MOVE
+
+ This specification creates additional preconditions for the PUT,
+ COPY, and MOVE methods. These preconditions apply:
+
+ o When a PUT operation of an address object resource into an address
+ book collection occurs.
+
+ o When a COPY or MOVE operation of an address object resource into
+ an address book collection occurs.
+
+
+
+
+Daboo Standards Track [Page 16]
+
+RFC 6352 CardDAV August 2011
+
+
+ The new preconditions are:
+
+ (CARDDAV:supported-address-data): The resource submitted in the
+ PUT request, or targeted by a COPY or MOVE request, MUST be a
+ supported media type (i.e., vCard) for address object resources.
+
+ (CARDDAV:valid-address-data): The resource submitted in the PUT
+ request, or targeted by a COPY or MOVE request, MUST be valid data
+ for the media type being specified (i.e., MUST contain valid vCard
+ data).
+
+ (CARDDAV:no-uid-conflict): The resource submitted in the PUT
+ request, or targeted by a COPY or MOVE request, MUST NOT specify a
+ vCard UID property value already in use in the targeted address
+ book collection or overwrite an existing address object resource
+ with one that has a different UID property value. Servers SHOULD
+ report the URL of the resource that is already making use of the
+ same UID property value in the DAV:href element.
+
+ <!ELEMENT no-uid-conflict (DAV:href)>
+
+ (CARDDAV:addressbook-collection-location-ok): In a COPY or MOVE
+ request, when the Request-URI is an address book collection, the
+ URI targeted by the Destination HTTP Request header MUST identify
+ a location where an address book collection can be created.
+
+ (CARDDAV:max-resource-size): The resource submitted in the PUT
+ request, or targeted by a COPY or MOVE request, MUST have a size
+ in octets less than or equal to the value of the
+ CARDDAV:max-resource-size property value (Section 6.2.3) on the
+ address book collection where the resource will be stored.
+
+6.3.2.2. Non-Standard vCard Properties and Parameters
+
+ vCard provides a "standard mechanism for doing non-standard things".
+ This extension support allows implementers to make use of non-
+ standard vCard properties and parameters whose names are prefixed
+ with the text "X-".
+
+ Servers MUST support the use of non-standard properties and
+ parameters in address object resources stored via the PUT method.
+
+ Servers may need to enforce rules for their own "private" properties
+ or parameters, so servers MAY reject any attempt by the client to
+ change those or use values for those outside of any restrictions the
+ server may have. A server SHOULD ensure that any "private"
+
+
+
+
+
+Daboo Standards Track [Page 17]
+
+RFC 6352 CardDAV August 2011
+
+
+ properties or parameters it uses follow the convention of including a
+ vendor ID in the "X-" name, as described in Section 3.8 of [RFC2426],
+ e.g., "X-ABC-PRIVATE".
+
+6.3.2.3. Address Object Resource Entity Tag
+
+ The DAV:getetag property MUST be defined and set to a strong entity
+ tag on all address object resources.
+
+ A response to a GET request targeted at an address object resource
+ MUST contain an ETag response header field indicating the current
+ value of the strong entity tag of the address object resource.
+
+ Servers SHOULD return a strong entity tag (ETag header) in a PUT
+ response when the stored address object resource is equivalent by
+ octet equality to the address object resource submitted in the body
+ of the PUT request. This allows clients to reliably use the returned
+ strong entity tag for data synchronization purposes. For instance,
+ the client can do a PROPFIND request on the stored address object
+ resource, have the DAV:getetag property returned, compare that value
+ with the strong entity tag it received on the PUT response, and know
+ that if they are equal, then the address object resource on the
+ server has not been changed.
+
+ In the case where the data stored by a server as a result of a PUT
+ request is not equivalent by octet equality to the submitted address
+ object resource, the behavior of the ETag response header is not
+ specified here, with the exception that a strong entity tag MUST NOT
+ be returned in the response. As a result, a client may need to
+ retrieve the modified address object resource (and ETag) as a basis
+ for further changes, rather than use the address object resource it
+ had sent with the PUT request.
+
+7. Address Book Access Control
+
+ CardDAV servers MUST support and adhere to the requirements of WebDAV
+ ACL [RFC3744]. WebDAV ACL provides a framework for an extensible set
+ of privileges that can be applied to WebDAV collections and ordinary
+ resources.
+
+7.1. Additional Principal Properties
+
+ This section defines additional properties for WebDAV principal
+ resources as defined in [RFC3744].
+
+
+
+
+
+
+
+Daboo Standards Track [Page 18]
+
+RFC 6352 CardDAV August 2011
+
+
+7.1.1. CARDDAV:addressbook-home-set Property
+
+ Name: addressbook-home-set
+
+ Namespace: urn:ietf:params:xml:ns:carddav
+
+ Purpose: Identifies the URL of any WebDAV collections that contain
+ address book collections owned by the associated principal
+ resource.
+
+ Protected: MAY be protected if the server has fixed locations in
+ which address books are created.
+
+ COPY/MOVE behavior: This property value MUST be preserved in COPY
+ and MOVE operations.
+
+ allprop behavior: SHOULD NOT be returned by a PROPFIND DAV:allprop
+ request.
+
+ Description: The CARDDAV:addressbook-home-set property is meant to
+ allow users to easily find the address book collections owned by
+ the principal. Typically, users will group all the address book
+ collections that they own under a common collection. This
+ property specifies the URL of collections that are either address
+ book collections or ordinary collections that have child or
+ descendant address book collections owned by the principal.
+
+ Definition:
+
+ <!ELEMENT addressbook-home-set (DAV:href*)>
+
+ Example:
+
+ <C:addressbook-home-set xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:carddav">
+ <D:href>/bernard/addresses/</D:href>
+ </C:addressbook-home-set>
+
+7.1.2. CARDDAV:principal-address Property
+
+ Name: principal-address
+
+ Namespace: urn:ietf:params:xml:ns:carddav
+
+ Purpose: Identifies the URL of an address object resource that
+ corresponds to the user represented by the principal.
+
+
+
+
+
+Daboo Standards Track [Page 19]
+
+RFC 6352 CardDAV August 2011
+
+
+ Protected: MAY be protected if the server provides a fixed location
+ for principal addresses.
+
+ COPY/MOVE behavior: This property value MUST be preserved in COPY
+ and MOVE operations.
+
+ allprop behavior: SHOULD NOT be returned by a PROPFIND DAV:allprop
+ request.
+
+ Description: The CARDDAV:principal-address property is meant to
+ allow users to easily find contact information for users
+ represented by principals on the system. This property specifies
+ the URL of the resource containing the corresponding contact
+ information. The resource could be an address object resource in
+ an address book collection, or it could be a resource in a
+ "regular" collection.
+
+ Definition:
+
+ <!ELEMENT principal-address (DAV:href)>
+
+ Example:
+
+ <C:principal-address xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:carddav">
+ <D:href>/system/cyrus.vcf</D:href>
+ </C:principal-address>
+
+8. Address Book Reports
+
+ This section defines the reports that CardDAV servers MUST support on
+ address book collections and address object resources.
+
+ CardDAV servers MUST advertise support for these reports on all
+ address book collections and address object resources with the
+ DAV:supported-report-set property defined in Section 3.1.5 of
+ [RFC3253]. CardDAV servers MAY also advertise support for these
+ reports on ordinary collections.
+
+ Some of these reports allow address data (from possibly multiple
+ resources) to be returned.
+
+8.1. REPORT Method
+
+ The REPORT method (defined in Section 3.6 of [RFC3253]) provides an
+ extensible mechanism for obtaining information about a resource.
+ Unlike the PROPFIND method, which returns the value of one or more
+ named properties, the REPORT method can involve more complex
+
+
+
+Daboo Standards Track [Page 20]
+
+RFC 6352 CardDAV August 2011
+
+
+ processing. REPORT is valuable in cases where the server has access
+ to all of the information needed to perform the complex request (such
+ as a query), and where it would require multiple requests for the
+ client to retrieve the information needed to perform the same
+ request.
+
+ A server that supports this specification MUST support the
+ DAV:expand-property report (defined in Section 3.8 of [RFC3253]).
+
+8.2. Ordinary Collections
+
+ Servers MAY support the reports defined in this document on ordinary
+ collections (collections that are not address book collections) in
+ addition to address book collections or address object resources. In
+ computing responses to the reports on ordinary collections, servers
+ MUST only consider address object resources contained in address book
+ collections that are targeted by the REPORT based on the value of the
+ Depth request header.
+
+8.3. Searching Text: Collations
+
+ Some of the reports defined in this section do text matches of
+ character strings provided by the client and compared to stored
+ address data. Since vCard data is by default encoded in the UTF-8
+ charset and may include characters outside of the US-ASCII charset
+ range in some property and parameter values, there is a need to
+ ensure that text matching follows well-defined rules.
+
+ To deal with this, this specification makes use of the IANA Collation
+ Registry defined in [RFC4790] to specify collations that may be used
+ to carry out the text comparison operations with a well-defined rule.
+
+ Collations supported by the server MUST support "equality" and
+ "substring" match operations as per [RFC4790], Section 4.2, including
+ the "prefix" and "suffix" options for "substring" matching. CardDAV
+ uses these match options for "equals", "contains", "starts-with", and
+ "ends-with" match operations.
+
+ CardDAV servers are REQUIRED to support the "i;ascii-casemap"
+ [RFC4790] and "i;unicode-casemap" [RFC5051] collations and MAY
+ support other collations.
+
+ Servers MUST advertise the set of collations that they support via
+ the CARDDAV:supported-collation-set property defined on any resource
+ that supports reports that use collations.
+
+
+
+
+
+
+Daboo Standards Track [Page 21]
+
+RFC 6352 CardDAV August 2011
+
+
+ In the absence of a collation explicitly specified by the client, or
+ if the client specifies the "default" collation identifier (as
+ defined in [RFC4790], Section 3.1), the server MUST default to using
+ "i;unicode-casemap" as the collation.
+
+ Wildcards (as defined in [RFC4790], Section 3.2) MUST NOT be used in
+ the collation identifier.
+
+ If the client chooses a collation not supported by the server, the
+ server MUST respond with a CARDDAV:supported-collation precondition
+ error response.
+
+8.3.1. CARDDAV:supported-collation-set Property
+
+ Name: supported-collation-set
+
+ Namespace: urn:ietf:params:xml:ns:carddav
+
+ Purpose: Identifies the set of collations supported by the server
+ for text matching operations.
+
+ Protected: MUST be protected as it indicates support provided by the
+ server.
+
+ COPY/MOVE behavior: This property value MUST be preserved in COPY
+ and MOVE operations.
+
+ allprop behavior: SHOULD NOT be returned by a PROPFIND DAV:allprop
+ request.
+
+ Description: The CARDDAV:supported-collation-set property contains
+ two or more CARDDAV:supported-collation elements that specify the
+ identifiers of the collations supported by the server.
+
+ Definition:
+
+ <!ELEMENT supported-collation-set (
+ supported-collation
+ supported-collation
+ supported-collation*)>
+ <!-- Both "i;ascii-casemap" and "i;unicode-casemap"
+ will be present -->
+
+ <!ELEMENT supported-collation (#PCDATA)>
+
+
+
+
+
+
+
+Daboo Standards Track [Page 22]
+
+RFC 6352 CardDAV August 2011
+
+
+ Example:
+
+ <C:supported-collation-set
+ xmlns:C="urn:ietf:params:xml:ns:carddav">
+ <C:supported-collation>i;ascii-casemap</C:supported-collation>
+ <C:supported-collation>i;octet</C:supported-collation>
+ <C:supported-collation>i;unicode-casemap</C:supported-collation>
+ </C:supported-collation-set>
+
+8.4. Partial Retrieval
+
+ Some address book reports defined in this document allow partial
+ retrieval of address object resources. A CardDAV client can specify
+ what information to return in the body of an address book REPORT
+ request.
+
+ A CardDAV client can request particular WebDAV property values, all
+ WebDAV property values, or a list of the names of the resource's
+ WebDAV properties. A CardDAV client can also request address data to
+ be returned and whether all vCard properties should be returned or
+ only particular ones. See CARDDAV:address-data in Section 10.4.
+
+8.5. Non-Standard Properties and Parameters
+
+ Servers MUST support the use of non-standard vCard property or
+ parameter names in the CARDDAV:address-data XML element in address
+ book REPORT requests to allow clients to request that non-standard
+ properties and parameters be returned in the address data provided in
+ the response.
+
+ Servers MAY support the use of non-standard vCard property or
+ parameter names in the CARDDAV:prop-filter and CARDDAV:param-filter
+ XML elements specified in the CARDDAV:filter XML element of address
+ book REPORT requests.
+
+ Servers MUST fail with the CARDDAV:supported-filter precondition if
+ an address book REPORT request uses a CARDDAV:prop-filter or
+ CARDDAV:param-filter XML element that makes reference to a non-
+ standard vCard property or parameter name on which the server does
+ not support queries.
+
+8.6. CARDDAV:addressbook-query Report
+
+ The CARDDAV:addressbook-query REPORT performs a search for all
+ address object resources that match a specified filter. The response
+ of this report will contain all the WebDAV properties and address
+ object resource data specified in the request. In the case of the
+
+
+
+
+Daboo Standards Track [Page 23]
+
+RFC 6352 CardDAV August 2011
+
+
+ CARDDAV:address-data XML element, one can explicitly specify the
+ vCard properties that should be returned in the address object
+ resource data that matches the filter.
+
+ The format of this report is modeled on the PROPFIND method. The
+ request and response bodies of the CARDDAV:addressbook-query report
+ use XML elements that are also used by PROPFIND. In particular, the
+ request can include XML elements to request WebDAV properties to be
+ returned. When that occurs, the response should follow the same
+ behavior as PROPFIND with respect to the DAV:multistatus response
+ elements used to return specific WebDAV property results. For
+ instance, a request to retrieve the value of a WebDAV property that
+ does not exist is an error and MUST be noted with a response XML
+ element that contains a 404 (Not Found) status value.
+
+ Support for the CARDDAV:addressbook-query REPORT is REQUIRED.
+
+ Marshalling:
+
+ The request body MUST be a CARDDAV:addressbook-query XML element
+ as defined in Section 10.3.
+
+ The request MUST include a Depth header. The scope of the query
+ is determined by the value of the Depth header. For example, to
+ query all address object resources in an address book collection,
+ the REPORT would use the address book collection as the Request-
+ URI and specify a Depth of 1 or infinity.
+
+ The response body for a successful request MUST be a
+ DAV:multistatus XML element (i.e., the response uses the same
+ format as the response for PROPFIND). In the case where there are
+ no response elements, the returned DAV:multistatus XML element is
+ empty.
+
+ The response body for a successful CARDDAV:addressbook-query
+ REPORT request MUST contain a DAV:response element for each
+ address object that matched the search filter. Address data is
+ returned in the CARDDAV:address-data XML element inside the
+ DAV:propstat XML element.
+
+ Preconditions:
+
+ (CARDDAV:supported-address-data): The attributes "content-type"
+ and "version" of the CARDDAV:address-data XML element (see
+ Section 10.4) specify a media type supported by the server for
+ address object resources.
+
+
+
+
+
+Daboo Standards Track [Page 24]
+
+RFC 6352 CardDAV August 2011
+
+
+ (CARDDAV:supported-filter): The CARDDAV:prop-filter (see
+ Section 10.5.1) and CARDDAV:param-filter (see Section 10.5.2) XML
+ elements used in the CARDDAV:filter XML element (see Section 10.5)
+ in the REPORT request only make reference to vCard properties and
+ parameters for which queries are supported by the server. That
+ is, if the CARDDAV:filter element attempts to reference an
+ unsupported vCard property or parameter, this precondition is
+ violated. A server SHOULD report the CARDDAV:prop-filter or
+ CARDDAV:param-filter for which it does not provide support.
+
+ <!ELEMENT supported-filter (prop-filter*,
+ param-filter*)>
+
+ (CARDDAV:supported-collation): Any XML attribute specifying a
+ collation MUST specify a collation supported by the server as
+ described in Section 8.3.
+
+ Postconditions:
+
+ (DAV:number-of-matches-within-limits): The number of matching
+ address object resources must fall within server-specific,
+ predefined limits. For example, this condition might be triggered
+ if a search specification would cause the return of an extremely
+ large number of responses.
+
+8.6.1. Limiting Results
+
+ A client can limit the number of results returned by the server
+ through use of the CARDDAV:limit element in the request body. This
+ is useful when clients are only interested in a few matches or only
+ have limited space to display results to users and thus don't need
+ the overhead of receiving more than that. When the results are
+ truncated by the server, the server MUST follow the rules below for
+ indicating a result set truncation to the client.
+
+8.6.2. Truncation of Results
+
+ A server MAY limit the number of resources in a response, for
+ example, to limit the amount of work expended in processing a query,
+ or as the result of an explicit limit set by the client. If the
+ result set is truncated because of such a limit, the response MUST
+ use status code 207 (Multi-Status), return a DAV:multistatus response
+ body, and indicate a status of 507 (Insufficient Storage) for the
+ Request-URI. That DAV:response element SHOULD include a DAV:error
+ element with the DAV:number-of-matches-within-limits precondition, as
+ defined in [RFC3744], Section 9.2.
+
+
+
+
+
+Daboo Standards Track [Page 25]
+
+RFC 6352 CardDAV August 2011
+
+
+ The server SHOULD also include the partial results in additional
+ DAV:response elements. If a client-requested limit is being applied,
+ the 507 response for the Request-URI MUST NOT be included in
+ calculating the limit (e.g., if the client requests that only a
+ single result be returned, and multiple matches are present, then the
+ DAV:multistatus response will include one DAV:response for the
+ matching resource and one DAV:response for the 507 status on the
+ Request-URI).
+
+8.6.3. Example: Partial Retrieval of vCards Matching NICKNAME
+
+ In this example, the client requests that the server search for
+ address object resources that contain a NICKNAME property whose value
+ equals some specific text and return specific vCard properties for
+ those vCards found. In addition, the DAV:getetag property is also
+ requested and returned as part of the response.
+
+ >> Request <<
+
+ REPORT /home/bernard/addressbook/ HTTP/1.1
+ Host: addressbook.example.com
+ Depth: 1
+ Content-Type: text/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <C:addressbook-query xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:carddav">
+ <D:prop>
+ <D:getetag/>
+ <C:address-data>
+ <C:prop name="VERSION"/>
+ <C:prop name="UID"/>
+ <C:prop name="NICKNAME"/>
+ <C:prop name="EMAIL"/>
+ <C:prop name="FN"/>
+ </C:address-data>
+ </D:prop>
+ <C:filter>
+ <C:prop-filter name="NICKNAME">
+ <C:text-match collation="i;unicode-casemap"
+ match-type="equals"
+ >me</C:text-match>
+ </C:prop-filter>
+ </C:filter>
+ </C:addressbook-query>
+
+
+
+
+
+Daboo Standards Track [Page 26]
+
+RFC 6352 CardDAV August 2011
+
+
+ >> Response <<
+
+ HTTP/1.1 207 Multi-Status
+ Date: Sat, 11 Nov 2006 09:32:12 GMT
+ Content-Type: text/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:multistatus xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:carddav">
+ <D:response>
+ <D:href>/home/bernard/addressbook/v102.vcf</D:href>
+ <D:propstat>
+ <D:prop>
+ <D:getetag>"23ba4d-ff11fb"</D:getetag>
+ <C:address-data>BEGIN:VCARD
+ VERSION:3.0
+ NICKNAME:me
+ UID:34222-232@example.com
+ FN:Cyrus Daboo
+ EMAIL:daboo@example.com
+ END:VCARD
+ </C:address-data>
+ </D:prop>
+ <D:status>HTTP/1.1 200 OK</D:status>
+ </D:propstat>
+ </D:response>
+ </D:multistatus>
+
+8.6.4. Example: Partial Retrieval of vCards Matching a Full Name or
+ Email Address
+
+ In this example, the client requests that the server search for
+ address object resources that contain a FN property whose value
+ contains some specific text or that contain an EMAIL property whose
+ value contains other text and return specific vCard properties for
+ those vCards found. In addition, the DAV:getetag property is also
+ requested and returned as part of the response.
+
+ >> Request <<
+
+ REPORT /home/bernard/addressbook/ HTTP/1.1
+ Host: addressbook.example.com
+ Depth: 1
+ Content-Type: text/xml; charset="utf-8"
+ Content-Length: xxxx
+
+
+
+
+
+Daboo Standards Track [Page 27]
+
+RFC 6352 CardDAV August 2011
+
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <C:addressbook-query xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:carddav">
+ <D:prop>
+ <D:getetag/>
+ <C:address-data>
+ <C:prop name="VERSION"/>
+ <C:prop name="UID"/>
+ <C:prop name="NICKNAME"/>
+ <C:prop name="EMAIL"/>
+ <C:prop name="FN"/>
+ </C:address-data>
+ </D:prop>
+ <C:filter test="anyof">
+ <C:prop-filter name="FN">
+ <C:text-match collation="i;unicode-casemap"
+ match-type="contains"
+ >daboo</C:text-match>
+ </C:prop-filter>
+ <C:prop-filter name="EMAIL">
+ <C:text-match collation="i;unicode-casemap"
+ match-type="contains"
+ >daboo</C:text-match>
+ </C:prop-filter>
+ </C:filter>
+ </C:addressbook-query>
+
+ >> Response <<
+
+ HTTP/1.1 207 Multi-Status
+ Date: Sat, 11 Nov 2006 09:32:12 GMT
+ Content-Type: text/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:multistatus xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:carddav">
+ <D:response>
+ <D:href>/home/bernard/addressbook/v102.vcf</D:href>
+ <D:propstat>
+ <D:prop>
+ <D:getetag>"23ba4d-ff11fb"</D:getetag>
+ <C:address-data>BEGIN:VCARD
+ VERSION:3.0
+ NICKNAME:me
+ UID:34222-232@example.com
+ FN:David Boo
+ EMAIL:daboo@example.com
+
+
+
+Daboo Standards Track [Page 28]
+
+RFC 6352 CardDAV August 2011
+
+
+ END:VCARD
+ </C:address-data>
+ </D:prop>
+ <D:status>HTTP/1.1 200 OK</D:status>
+ </D:propstat>
+ </D:response>
+ <D:response>
+ <D:href>/home/bernard/addressbook/v104.vcf</D:href>
+ <D:propstat>
+ <D:prop>
+ <D:getetag>"23ba4d-ff11fc"</D:getetag>
+ <C:address-data>BEGIN:VCARD
+ VERSION:3.0
+ NICKNAME:oliver
+ UID:34222-23222@example.com
+ FN:Oliver Daboo
+ EMAIL:oliver@example.com
+ END:VCARD
+ </C:address-data>
+ </D:prop>
+ <D:status>HTTP/1.1 200 OK</D:status>
+ </D:propstat>
+ </D:response>
+ </D:multistatus>
+
+8.6.5. Example: Truncated Results
+
+ In this example, the client requests that the server search for
+ address object resources that contain a FN property whose value
+ contains some specific text and return the DAV:getetag property for
+ two results only. The server response includes a 507 status for the
+ Request-URI indicating that there were more than two resources that
+ matched the query, but that the server truncated the result set as
+ requested by the client.
+
+ >> Request <<
+
+ REPORT /home/bernard/addressbook/ HTTP/1.1
+ Host: addressbook.example.com
+ Depth: 1
+ Content-Type: text/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <C:addressbook-query xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:carddav">
+
+
+
+
+
+Daboo Standards Track [Page 29]
+
+RFC 6352 CardDAV August 2011
+
+
+ <D:prop>
+ <D:getetag/>
+ </D:prop>
+ <C:filter test="anyof">
+ <C:prop-filter name="FN">
+ <C:text-match collation="i;unicode-casemap"
+ match-type="contains"
+ >daboo</C:text-match>
+ </C:prop-filter>
+ </C:filter>
+ <C:limit>
+ <C:nresults>2</C:nresults>
+ </C:limit>
+ </C:addressbook-query>
+
+ >> Response <<
+
+ HTTP/1.1 207 Multi-Status
+ Date: Sat, 11 Nov 2006 09:32:12 GMT
+ Content-Type: text/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:multistatus xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:carddav">
+ <D:response>
+ <D:href>/home/bernard/addressbook/</D:href>
+ <D:status>HTTP/1.1 507 Insufficient Storage</D:status>
+ <D:error><D:number-of-matches-within-limits/></D:error>
+ <D:responsedescription xml:lang="en">
+ Only two matching records were returned
+ </D:responsedescription>
+ </D:response>
+ <D:response>
+ <D:href>/home/bernard/addressbook/v102.vcf</D:href>
+ <D:propstat>
+ <D:prop>
+ <D:getetag>"23ba4d-ff11fb"</D:getetag>
+ </D:prop>
+ <D:status>HTTP/1.1 200 OK</D:status>
+ </D:propstat>
+ </D:response>
+ <D:response>
+ <D:href>/home/bernard/addressbook/v104.vcf</D:href>
+ <D:propstat>
+ <D:prop>
+ <D:getetag>"23ba4d-ff11fc"</D:getetag>
+ </D:prop>
+
+
+
+Daboo Standards Track [Page 30]
+
+RFC 6352 CardDAV August 2011
+
+
+ <D:status>HTTP/1.1 200 OK</D:status>
+ </D:propstat>
+ </D:response>
+ </D:multistatus>
+
+8.7. CARDDAV:addressbook-multiget Report
+
+ The CARDDAV:addressbook-multiget REPORT is used to retrieve specific
+ address object resources from within a collection, if the Request-URI
+ is a collection, or to retrieve a specific address object resource,
+ if the Request-URI is an address object resource. This report is
+ similar to the CARDDAV:addressbook-query REPORT (see Section 8.6),
+ except that it takes a list of DAV:href elements instead of a
+ CARDDAV:filter element to determine which address object resources to
+ return.
+
+ Support for the addressbook-multiget REPORT is REQUIRED.
+
+ Marshalling:
+
+ The request body MUST be a CARDDAV:addressbook-multiget XML
+ element (see Section 10.7), which MUST contain at least one
+ DAV:href XML element and one optional CARDDAV:address-data element
+ as defined in Section 10.4. If DAV:href elements are present, the
+ scope of the request is the set of resources identified by these
+ elements, which all need to be members (not necessarily internal
+ members) of the resource identified by the Request-URI.
+ Otherwise, the scope is the resource identified by the Request-URI
+ itself.
+
+ The request MUST include a Depth: 0 header; however, the actual
+ scope of the REPORT is determined as described above.
+
+ The response body for a successful request MUST be a
+ DAV:multistatus XML element.
+
+ The response body for a successful CARDDAV:addressbook-multiget
+ REPORT request MUST contain a DAV:response element for each
+ address object resource referenced by the provided set of DAV:href
+ elements. Address data is returned in the CARDDAV:address-data
+ element inside the DAV:prop element.
+
+ In the case of an error accessing any of the provided DAV:href
+ resources, the server MUST return the appropriate error status
+ code in the DAV:status element of the corresponding DAV:response
+ element.
+
+
+
+
+
+Daboo Standards Track [Page 31]
+
+RFC 6352 CardDAV August 2011
+
+
+ Preconditions:
+
+ (CARDDAV:supported-address-data): The attributes "content-type"
+ and "version" of the CARDDAV:address-data XML elements (see
+ Section 10.4) specify a media type supported by the server for
+ address object resources.
+
+ Postconditions:
+
+ None.
+
+8.7.1. Example: CARDDAV:addressbook-multiget Report
+
+ In this example, the client requests the server to return specific
+ vCard properties of the address components referenced by specific
+ URIs. In addition, the DAV:getetag property is also requested and
+ returned as part of the response. Note that, in this example, the
+ resource at
+ http://addressbook.example.com/home/bernard/addressbook/vcf1.vcf does
+ not exist, resulting in an error status response.
+
+ >> Request <<
+
+ REPORT /home/bernard/addressbook/ HTTP/1.1
+ Host: addressbook.example.com
+ Depth: 1
+ Content-Type: text/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <C:addressbook-multiget xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:carddav">
+ <D:prop>
+ <D:getetag/>
+ <C:address-data>
+ <C:prop name="VERSION"/>
+ <C:prop name="UID"/>
+ <C:prop name="NICKNAME"/>
+ <C:prop name="EMAIL"/>
+ <C:prop name="FN"/>
+ </C:address-data>
+ </D:prop>
+ <D:href>/home/bernard/addressbook/vcf102.vcf</D:href>
+ <D:href>/home/bernard/addressbook/vcf1.vcf</D:href>
+ </C:addressbook-multiget>
+
+
+
+
+
+
+Daboo Standards Track [Page 32]
+
+RFC 6352 CardDAV August 2011
+
+
+ >> Response <<
+
+ HTTP/1.1 207 Multi-Status
+ Date: Sat, 11 Nov 2006 09:32:12 GMT
+ Content-Type: text/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:multistatus xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:carddav">
+ <D:response>
+ <D:href>/home/bernard/addressbook/vcf102.vcf</D:href>
+ <D:propstat>
+ <D:prop>
+ <D:getetag>"23ba4d-ff11fb"</D:getetag>
+ <C:address-data>BEGIN:VCARD
+ VERSION:3.0
+ NICKNAME:me
+ UID:34222-232@example.com
+ FN:Cyrus Daboo
+ EMAIL:daboo@example.com
+ END:VCARD
+ </C:address-data>
+ </D:prop>
+ <D:status>HTTP/1.1 200 OK</D:status>
+ </D:propstat>
+ </D:response>
+ <D:response>
+ <D:href>/home/bernard/addressbook/vcf1.vcf</D:href>
+ <D:status>HTTP/1.1 404 Resource not found</D:status>
+ </D:response>
+ </D:multistatus>
+
+8.7.2. Example: CARDDAV:addressbook-multiget Report
+
+ In this example, the client requests the server to return vCard v4.0
+ data of the address components referenced by specific URIs. In
+ addition, the DAV:getetag property is also requested and returned as
+ part of the response. Note that, in this example, the resource at
+ http://addressbook.example.com/home/bernard/addressbook/vcf3.vcf
+ exists but in a media type format that the server is unable to
+ convert, resulting in an error status response.
+
+
+
+
+
+
+
+
+
+Daboo Standards Track [Page 33]
+
+RFC 6352 CardDAV August 2011
+
+
+ >> Request <<
+
+ REPORT /home/bernard/addressbook/ HTTP/1.1
+ Host: addressbook.example.com
+ Depth: 1
+ Content-Type: text/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <C:addressbook-multiget xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:carddav">
+ <D:prop>
+ <D:getetag/>
+ <C:address-data content-type='text/vcard' version='4.0'/>
+ </D:prop>
+ <D:href>/home/bernard/addressbook/vcf3.vcf</D:href>
+ </C:addressbook-multiget>
+
+ >> Response <<
+
+ HTTP/1.1 207 Multi-Status
+ Date: Sat, 11 Nov 2006 09:32:12 GMT
+ Content-Type: text/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:multistatus xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:carddav">
+ <D:response>
+ <D:href>/home/bernard/addressbook/vcf3.vcf</D:href>
+ <D:status>HTTP/1.1 415 Unsupported Media Type</D:status>
+ <D:error><C:supported-address-data-conversion/></D:error>
+ <D:responsedescription>Unable to convert from vCard v3.0
+ to vCard v4.0</D:responsedescription>
+ </D:response>
+ </D:multistatus>
+
+9. Client Guidelines
+
+9.1. Restrict the Properties Returned
+
+ Clients may not need all the properties in a vCard object when
+ presenting information to the user, or looking up specific items for
+ their email address, for example. Since some property data can be
+ large (e.g., PHOTO or SOUND with in-line content) clients can choose
+ to ignore those by only requesting the specific items it knows it
+ will use, through use of the CARDDAV:address-data XML element in the
+ relevant reports.
+
+
+
+Daboo Standards Track [Page 34]
+
+RFC 6352 CardDAV August 2011
+
+
+ However, if a client needs to make a change to a vCard, it can only
+ change the entire vCard data via a PUT request. There is no way to
+ incrementally make a change to a set of properties within a vCard
+ object resource. As a result, the client will have to cache the
+ entire set of properties on a resource that is being changed.
+
+9.2. Avoiding Lost Updates
+
+ When resources are accessed by multiple clients, the possibility of
+ clients overwriting each other's changes exists. To alleviate this,
+ clients SHOULD use the If-Match request header on PUT requests with
+ the ETag of the previously retrieved resource data to check whether
+ the resource was modified since it was previously retrieved. If a
+ precondition failure occurs, clients need to reload the resource and
+ go through their own merge or conflict resolution process before
+ writing back the data (again using the If-Match check).
+
+9.3. Client Configuration
+
+ When CardDAV clients need to be configured, the key piece of
+ information that they require is the principal-URL of the user whose
+ address book information is desired. Servers SHOULD support the
+ DAV:current-user-principal-URL property as defined in [RFC5397] to
+ give clients a fast way to locate user principals.
+
+ Given support for SRV records (Section 11) and DAV:current-user-
+ principal-URL [RFC5397], users only need enter a user identifier,
+ host name, and password to configure their client. The client would
+ take the host name and do an SRV lookup to locate the CardDAV server,
+ then execute an authenticated PROPFIND on the root/resource looking
+ for the DAV:current-user-principal-URL property. The value returned
+ gives the client direct access to the user's principal-URL and from
+ there all the related CardDAV properties needed to locate address
+ books.
+
+9.4. Finding Other Users' Address Books
+
+ For use cases of address book sharing, one might wish to find the
+ address book belonging to another user. To find other users' address
+ books on the same server, the DAV:principal-property-search REPORT
+ [RFC3744] can be used to search principals for matching properties
+ and return specified properties for the matching principal resources.
+ To search for an address book owned by a user named "Laurie", the
+ REPORT request body would look like this:
+
+
+
+
+
+
+
+Daboo Standards Track [Page 35]
+
+RFC 6352 CardDAV August 2011
+
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:principal-property-search xmlns:D="DAV:">
+ <D:property-search>
+ <D:prop>
+ <D:displayname/>
+ </D:prop>
+ <D:match>Laurie</D:match>
+ </D:property-search>
+ <D:prop>
+ <C:addressbook-home-set
+ xmlns:C="urn:ietf:params:xml:ns:carddav"/>
+ <D:displayname/>
+ </D:prop>
+ </D:principal-property-search>
+
+ The server performs a case-sensitive or caseless search for a
+ matching string subset of "Laurie" within the DAV:displayname
+ property. Thus, the server might return "Laurie Dusseault", "Laurier
+ Desruisseaux", or "Wilfrid Laurier" all as matching DAV:displayname
+ values, and the address books for each of these.
+
+10. XML Element Definitions
+
+10.1. CARDDAV:addressbook XML Element
+
+ Name: addressbook
+
+ Namespace: urn:ietf:params:xml:ns:carddav
+
+ Purpose: Specifies the resource type of an address book collection.
+
+ Description: See Section 5.2.
+
+ Definition:
+
+ <!ELEMENT addressbook EMPTY>
+
+10.2. CARDDAV:supported-collation XML Element
+
+ Name: supported-collation
+
+ Namespace: urn:ietf:params:xml:ns:carddav
+
+ Purpose: Identifies a single collation via its collation identifier
+ as defined by [RFC4790].
+
+ Description: The CARDDAV:supported-collation contains the text of a
+ collation identifier as described in Section 8.3.1.
+
+
+
+Daboo Standards Track [Page 36]
+
+RFC 6352 CardDAV August 2011
+
+
+ Definition:
+
+ <!ELEMENT supported-collation (#PCDATA)>
+ <!-- PCDATA value: collation identifier -->
+
+10.3. CARDDAV:addressbook-query XML Element
+
+ Name: addressbook-query
+
+ Namespace: urn:ietf:params:xml:ns:carddav
+
+ Purpose: Defines a report for querying address book data
+
+ Description: See Section 8.6.
+
+ Definition:
+
+ <!ELEMENT addressbook-query ((DAV:allprop |
+ DAV:propname |
+ DAV:prop)?, filter, limit?)>
+
+10.4. CARDDAV:address-data XML Element
+
+ Name: address-data
+
+ Namespace: urn:ietf:params:xml:ns:carddav
+
+ Purpose: Specifies one of the following:
+
+ 1. The parts of an address object resource that should be
+ returned by a given address book REPORT request, and the media
+ type and version for the returned data; or
+
+ 2. The content of an address object resource in a response to an
+ address book REPORT request.
+
+ Description: When used in an address book REPORT request, the
+ CARDDAV:address-data XML element specifies which parts of address
+ object resources need to be returned in the response. If the
+ CARDDAV:address-data XML element doesn't contain any CARDDAV:prop
+ elements, address object resources will be returned in their
+ entirety. Additionally, a media type and version can be specified
+ to request that the server return the data in that format if
+ possible.
+
+ Finally, when used in an address book REPORT response, the
+ CARDDAV:address-data XML element specifies the content of an
+ address object resource. Given that XML parsers normalize the
+
+
+
+Daboo Standards Track [Page 37]
+
+RFC 6352 CardDAV August 2011
+
+
+ two-character sequence CRLF (US-ASCII decimal 13 and US-ASCII
+ decimal 10) to a single LF character (US-ASCII decimal 10), the CR
+ character (US-ASCII decimal 13) MAY be omitted in address object
+ resources specified in the CARDDAV:address-data XML element.
+ Furthermore, address object resources specified in the
+ CARDDAV:address-data XML element MAY be invalid per their media
+ type specification if the CARDDAV:address-data XML element part of
+ the address book REPORT request did not specify required vCard
+ properties (e.g., UID, etc.) or specified a CARDDAV:prop XML
+ element with the "novalue" attribute set to "yes".
+
+ Note: The CARDDAV:address-data XML element is specified in requests
+ and responses inside the DAV:prop XML element as if it were a
+ WebDAV property. However, the CARDDAV:address-data XML element is
+ not a WebDAV property and as such it is not returned in PROPFIND
+ responses nor used in PROPPATCH requests.
+
+ Note: The address data embedded within the CARDDAV:address-data XML
+ element MUST follow the standard XML character data encoding
+ rules, including use of &lt;, &gt;, &amp; etc., entity encoding or
+ the use of a <![CDATA[ ... ]]> construct. In the latter case, the
+ vCard data cannot contain the character sequence "]]>", which is
+ the end delimiter for the CDATA section.
+
+ Definition:
+
+ <!ELEMENT address-data (allprop | prop*)>
+
+ when nested in the DAV:prop XML element in an address book
+ REPORT request to specify which parts of address object
+ resources should be returned in the response;
+
+ <!ELEMENT address-data (#PCDATA)>
+ <!-- PCDATA value: address data -->
+
+ when nested in the DAV:prop XML element in an address book
+ REPORT response to specify the content of a returned
+ address object resource.
+
+ <!ATTLIST address-data content-type CDATA "text/vcard"
+ version CDATA "3.0">
+ <!-- content-type value: a MIME media type -->
+ <!-- version value: a version string -->
+
+ attributes can be used on each variant of the
+ CALDAV:address-data XML element.
+
+
+
+
+
+Daboo Standards Track [Page 38]
+
+RFC 6352 CardDAV August 2011
+
+
+10.4.1. CARDDAV:allprop XML Element
+
+ Name: allprop
+
+ Namespace: urn:ietf:params:xml:ns:carddav
+
+ Purpose: Specifies that all vCard properties shall be returned.
+
+ Description: This element can be used when the client wants all
+ vCard properties of components returned by a report.
+
+ Definition:
+
+ <!ELEMENT allprop EMPTY>
+
+ Note: The CARDDAV:allprop element defined here has the same name as
+ the DAV:allprop element defined in WebDAV. However, the
+ CARDDAV:allprop element defined here uses the
+ "urn:ietf:params:xml:ns:carddav" namespace, as opposed to the "DAV:"
+ namespace used for the DAV:allprop element defined in WebDAV.
+
+10.4.2. CARDDAV:prop XML Element
+
+ Name: prop
+
+ Namespace: urn:ietf:params:xml:ns:carddav
+
+ Purpose: Defines which vCard properties to return in the response.
+
+ Description: The "name" attribute specifies the name of the vCard
+ property to return (e.g., "NICKNAME"). The "novalue" attribute
+ can be used by clients to request that the actual value of the
+ property not be returned (if the "novalue" attribute is set to
+ "yes"). In that case, the server will return just the vCard
+ property name and any vCard parameters and a trailing ":" without
+ the subsequent value data.
+
+ vCard allows a "group" prefix to appear before a property name in
+ the vCard data. When the "name" attribute does not specify a
+ group prefix, it MUST match properties in the vCard data without a
+ group prefix or with any group prefix. When the "name" attribute
+ includes a group prefix, it MUST match properties that have
+ exactly the same group prefix and name. For example, a "name" set
+ to "TEL" will match "TEL", "X-ABC.TEL", and "X-ABC-1.TEL" vCard
+ properties. A "name" set to "X-ABC.TEL" will match an "X-ABC.TEL"
+ vCard property only; it will not match "TEL" or "X-ABC-1.TEL".
+
+
+
+
+
+Daboo Standards Track [Page 39]
+
+RFC 6352 CardDAV August 2011
+
+
+ Definition:
+
+ <!ELEMENT prop EMPTY>
+
+ <!ATTLIST prop name CDATA #REQUIRED
+ novalue (yes | no) "no">
+ <!-- name value: a vCard property name -->
+ <!-- novalue value: "yes" or "no" -->
+
+ Note: The CARDDAV:prop element defined here has the same name as the
+ DAV:prop element defined in WebDAV. However, the CARDDAV:prop
+ element defined here uses the "urn:ietf:params:xml:ns:carddav"
+ namespace, as opposed to the "DAV:" namespace used for the DAV:prop
+ element defined in WebDAV.
+
+10.5. CARDDAV:filter XML Element
+
+ Name: filter
+
+ Namespace: urn:ietf:params:xml:ns:carddav
+
+ Purpose: Determines which matching objects are returned.
+
+ Description: The "filter" element specifies the search filter used
+ to match address objects that should be returned by a report. The
+ "test" attribute specifies whether any (logical OR) or all
+ (logical AND) of the prop-filter tests need to match in order for
+ the overall filter to match.
+
+ Definition:
+
+ <!ELEMENT filter (prop-filter*)>
+
+ <!ATTLIST filter test (anyof | allof) "anyof">
+ <!-- test value:
+ anyof logical OR for prop-filter matches
+ allof logical AND for prop-filter matches -->
+
+10.5.1. CARDDAV:prop-filter XML Element
+
+ Name: prop-filter
+
+ Namespace: urn:ietf:params:xml:ns:carddav
+
+ Purpose: Limits the search to specific vCard properties.
+
+
+
+
+
+
+Daboo Standards Track [Page 40]
+
+RFC 6352 CardDAV August 2011
+
+
+ Description: The CARDDAV:prop-filter XML element specifies search
+ criteria on a specific vCard property (e.g., "NICKNAME"). An
+ address object is said to match a CARDDAV:prop-filter if:
+
+ * A vCard property of the type specified by the "name" attribute
+ exists, and the CARDDAV:prop-filter is empty, or it matches any
+ specified CARDDAV:text-match or CARDDAV:param-filter
+ conditions. The "test" attribute specifies whether any
+ (logical OR) or all (logical AND) of the text-filter and param-
+ filter tests need to match in order for the overall filter to
+ match.
+
+ or:
+
+ * A vCard property of the type specified by the "name" attribute
+ does not exist, and the CARDDAV:is-not-defined element is
+ specified.
+
+ vCard allows a "group" prefix to appear before a property name in
+ the vCard data. When the "name" attribute does not specify a
+ group prefix, it MUST match properties in the vCard data without a
+ group prefix or with any group prefix. When the "name" attribute
+ includes a group prefix, it MUST match properties that have
+ exactly the same group prefix and name. For example, a "name" set
+ to "TEL" will match "TEL", "X-ABC.TEL", "X-ABC-1.TEL" vCard
+ properties. A "name" set to "X-ABC.TEL" will match an "X-ABC.TEL"
+ vCard property only, it will not match "TEL" or "X-ABC-1.TEL".
+
+ Definition:
+
+ <!ELEMENT prop-filter (is-not-defined |
+ (text-match*, param-filter*))>
+
+ <!ATTLIST prop-filter name CDATA #REQUIRED
+ test (anyof | allof) "anyof">
+ <!-- name value: a vCard property name (e.g., "NICKNAME")
+ test value:
+ anyof logical OR for text-match/param-filter matches
+ allof logical AND for text-match/param-filter matches -->
+
+10.5.2. CARDDAV:param-filter XML Element
+
+ Name: param-filter
+
+ Namespace: urn:ietf:params:xml:ns:carddav
+
+ Purpose: Limits the search to specific parameter values.
+
+
+
+
+Daboo Standards Track [Page 41]
+
+RFC 6352 CardDAV August 2011
+
+
+ Description: The CARDDAV:param-filter XML element specifies search
+ criteria on a specific vCard property parameter (e.g., TYPE) in
+ the scope of a given CARDDAV:prop-filter. A vCard property is
+ said to match a CARDDAV:param-filter if:
+
+ * A parameter of the type specified by the "name" attribute
+ exists, and the CARDDAV:param-filter is empty, or it matches
+ the CARDDAV:text-match conditions if specified.
+
+ or:
+
+ * A parameter of the type specified by the "name" attribute does
+ not exist, and the CARDDAV:is-not-defined element is specified.
+
+ Definition:
+
+ <!ELEMENT param-filter (is-not-defined | text-match)?>
+
+ <!ATTLIST param-filter name CDATA #REQUIRED>
+ <!-- name value: a property parameter name (e.g., "TYPE") -->
+
+10.5.3. CARDDAV:is-not-defined XML Element
+
+ Name: is-not-defined
+
+ Namespace: urn:ietf:params:xml:ns:carddav
+
+ Purpose: Specifies that a match should occur if the enclosing vCard
+ property or parameter does not exist.
+
+ Description: The CARDDAV:is-not-defined XML element specifies that a
+ match occurs if the enclosing vCard property or parameter value
+ specified in an address book REPORT request does not exist in the
+ address data being tested.
+
+ Definition:
+
+ <!ELEMENT is-not-defined EMPTY>
+
+10.5.4. CARDDAV:text-match XML Element
+
+ Name: text-match
+
+ Namespace: urn:ietf:params:xml:ns:carddav
+
+ Purpose: Specifies a substring match on a vCard property or
+ parameter value.
+
+
+
+
+Daboo Standards Track [Page 42]
+
+RFC 6352 CardDAV August 2011
+
+
+ Description: The CARDDAV:text-match XML element specifies text used
+ for a substring match against the vCard property or parameter
+ value specified in an address book REPORT request.
+
+ The "collation" attribute is used to select the collation that the
+ server MUST use for character string matching. In the absence of
+ this attribute, the server MUST use the "i;unicode-casemap"
+ collation.
+
+ The "negate-condition" attribute is used to indicate that this
+ test returns a match if the text matches, when the attribute value
+ is set to "no", or return a match if the text does not match, if
+ the attribute value is set to "yes". For example, this can be
+ used to match components with a CATEGORIES property not set to
+ PERSON.
+
+ The "match-type" attribute is used to indicate the type of match
+ operation to use. Possible choices are:
+
+ "equals" - an exact match to the target string
+
+ "contains" - a substring match, matching anywhere within the
+ target string
+
+ "starts-with" - a substring match, matching only at the start
+ of the target string
+
+ "ends-with" - a substring match, matching only at the end of
+ the target string
+
+ Definition:
+
+ <!ELEMENT text-match (#PCDATA)>
+ <!-- PCDATA value: string -->
+
+ <!ATTLIST text-match
+ collation CDATA "i;unicode-casemap"
+ negate-condition (yes | no) "no"
+ match-type (equals|contains|starts-with|ends-with) "contains">
+
+10.6. CARDDAV:limit XML Element
+
+ Name: limit
+
+ Namespace: urn:ietf:params:xml:ns:carddav
+
+ Purpose: Specifies different types of limits that can be applied to
+ the results returned by the server.
+
+
+
+Daboo Standards Track [Page 43]
+
+RFC 6352 CardDAV August 2011
+
+
+ Description: The CARDDAV:limit XML element can be used to specify
+ different types of limits that the client can request the server
+ to apply to the results returned by the server. Currently, only
+ the CARDDAV:nresults limit can be used; other types of limit could
+ be defined in the future.
+
+ Definition:
+
+ <!ELEMENT limit (nresults)>
+
+10.6.1. CARDDAV:nresults XML Element
+
+ Name: nresults
+
+ Namespace: urn:ietf:params:xml:ns:carddav
+
+ Purpose: Specifies a limit on the number of results returned by the
+ server.
+
+ Description: The CARDDAV:nresults XML element contains a requested
+ maximum number of DAV:response elements to be returned in the
+ response body of a query. The server MAY disregard this limit.
+ The value of this element is an unsigned integer.
+
+ Definition:
+
+ <!ELEMENT nresults (#PCDATA)>
+ <!-- nresults value: unsigned integer, must be digits -->
+
+10.7. CARDDAV:addressbook-multiget XML Element
+
+ Name: addressbook-multiget
+
+ Namespace: urn:ietf:params:xml:ns:carddav
+
+ Purpose: CardDAV report used to retrieve specific address objects
+ via their URIs.
+
+ Description: See Section 8.7.
+
+ Definition:
+
+ <!ELEMENT addressbook-multiget ((DAV:allprop |
+ DAV:propname |
+ DAV:prop)?,
+ DAV:href+)>
+
+
+
+
+
+Daboo Standards Track [Page 44]
+
+RFC 6352 CardDAV August 2011
+
+
+11. Service Discovery via SRV Records
+
+ [RFC2782] defines a DNS-based service discovery protocol that has
+ been widely adopted as a means of locating particular services within
+ a local area network and beyond, using SRV RRs.
+
+ This specification adds two service types for use with SRV records:
+
+ carddav: Identifies a CardDAV server that uses HTTP without TLS
+ [RFC2818].
+
+ carddavs: Identifies a CardDAV server that uses HTTP with TLS
+ [RFC2818].
+
+ Example: non-TLS service record
+
+ _carddav._tcp SRV 0 1 80 addressbook.example.com.
+
+ Example: TLS service
+
+ _carddavs._tcp SRV 0 1 443 addressbook.example.com.
+
+12. Internationalization Considerations
+
+ CardDAV allows internationalized strings to be stored and retrieved
+ for the description of address book collections (see Section 6.2.1).
+
+ The CARDDAV:addressbook-query REPORT (Section 8.6) includes a text
+ searching option controlled by the CARDDAV:text-match element and
+ details of character handling are covered in the description of that
+ element (see Section 10.5.4).
+
+13. Security Considerations
+
+ HTTP protocol transactions are sent in the clear over the network
+ unless protection from snooping is negotiated. This can be
+ accomplished by use of TLS as defined in [RFC2818]. In particular,
+ if HTTP Basic authentication [RFC2617] is available, the server MUST
+ allow TLS to be used at the same time, and it SHOULD prevent use of
+ Basic authentication when TLS is not in use. Clients SHOULD use TLS
+ whenever possible.
+
+ With the ACL extension [RFC3744] present, WebDAV allows control over
+ who can access (read or write) any resource on the WebDAV server. In
+ addition, WebDAV ACL provides for an "inheritance" mechanism, whereby
+ resources may inherit access privileges from other resources. Often,
+ the "other" resource is a parent collection of the resource itself.
+ Servers are able to support address books that are "private"
+
+
+
+Daboo Standards Track [Page 45]
+
+RFC 6352 CardDAV August 2011
+
+
+ (accessible only to the "owner"), "shared" (accessible to the owner
+ and other specified authenticated users), and "public" (accessible to
+ any authenticated or unauthenticated users). When provisioning
+ address books of a particular type, servers MUST ensure that the
+ correct privileges are applied on creation. In particular, private
+ and shared address books MUST NOT be accessible by unauthenticated
+ users (to prevent data from being automatically searched or indexed
+ by web "crawlers").
+
+ Clients SHOULD warn users in an appropriate fashion when they copy or
+ move address data from a private address book to a shared address
+ book or public address book. Clients SHOULD provide a clear
+ indication as to which address books are private, shared, or public.
+ Clients SHOULD provide an appropriate warning when changing access
+ privileges for a private or shared address book with data so as to
+ allow unauthenticated users access.
+
+ This specification currently relies on standard HTTP authentication
+ mechanisms for identifying users. These comprise Basic and Digest
+ authentication [RFC2617] as well as TLS [RFC2818] using client-side
+ certificates.
+
+14. IANA Consideration
+
+ This document uses a URN to describe a new XML namespace conforming
+ to the registry mechanism described in [RFC3688].
+
+14.1. Namespace Registration
+
+ Registration request for the carddav namespace:
+
+ URI: urn:ietf:params:xml:ns:carddav
+
+ Registrant Contact: The IESG <iesg@ietf.org>
+
+ XML: None - not applicable for namespace registrations.
+
+15. Acknowledgments
+
+ Thanks go to Lisa Dusseault and Bernard Desruisseaux for their work
+ on CalDAV, on which CardDAV is heavily based. The following
+ individuals contributed their ideas and support for writing this
+ specification: Mike Douglass, Stefan Eissing, Helge Hess, Arnaud
+ Quillaud, Julian Reschke, Elias Sinderson, Greg Stein, Wilfredo
+ Sanchez, and Simon Vaillancourt.
+
+
+
+
+
+
+Daboo Standards Track [Page 46]
+
+RFC 6352 CardDAV August 2011
+
+
+16. References
+
+16.1. Normative References
+
+ [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
+ Requirement Levels", BCP 14, RFC 2119, March 1997.
+
+ [RFC2426] Dawson, F. and T. Howes, "vCard MIME Directory Profile",
+ RFC 2426, September 1998.
+
+ [RFC2616] Fielding, R., Gettys, J., Mogul, J., Frystyk, H.,
+ Masinter, L., Leach, P., and T. Berners-Lee, "Hypertext
+ Transfer Protocol -- HTTP/1.1", RFC 2616, June 1999.
+
+ [RFC2617] Franks, J., Hallam-Baker, P., Hostetler, J., Lawrence, S.,
+ Leach, P., Luotonen, A., and L. Stewart, "HTTP
+ Authentication: Basic and Digest Access Authentication",
+ RFC 2617, June 1999.
+
+ [RFC2782] Gulbrandsen, A., Vixie, P., and L. Esibov, "A DNS RR for
+ specifying the location of services (DNS SRV)", RFC 2782,
+ February 2000.
+
+ [RFC2818] Rescorla, E., "HTTP Over TLS", RFC 2818, May 2000.
+
+ [RFC3253] Clemm, G., Amsden, J., Ellison, T., Kaler, C., and J.
+ Whitehead, "Versioning Extensions to WebDAV
+ (Web Distributed Authoring and Versioning)", RFC 3253,
+ March 2002.
+
+ [RFC3688] Mealling, M., "The IETF XML Registry", BCP 81, RFC 3688,
+ January 2004.
+
+ [RFC3744] Clemm, G., Reschke, J., Sedlar, E., and J. Whitehead, "Web
+ Distributed Authoring and Versioning (WebDAV)
+ Access Control Protocol", RFC 3744, May 2004.
+
+ [RFC4790] Newman, C., Duerst, M., and A. Gulbrandsen, "Internet
+ Application Protocol Collation Registry", RFC 4790,
+ March 2007.
+
+ [RFC4918] Dusseault, L., "HTTP Extensions for Web Distributed
+ Authoring and Versioning (WebDAV)", RFC 4918, June 2007.
+
+ [RFC5051] Crispin, M., "i;unicode-casemap - Simple Unicode Collation
+ Algorithm", RFC 5051, October 2007.
+
+
+
+
+
+Daboo Standards Track [Page 47]
+
+RFC 6352 CardDAV August 2011
+
+
+ [RFC5246] Dierks, T. and E. Rescorla, "The Transport Layer Security
+ (TLS) Protocol Version 1.2", RFC 5246, August 2008.
+
+ [RFC5280] Cooper, D., Santesson, S., Farrell, S., Boeyen, S.,
+ Housley, R., and W. Polk, "Internet X.509 Public Key
+ Infrastructure Certificate and Certificate Revocation List
+ (CRL) Profile", RFC 5280, May 2008.
+
+ [RFC5397] Sanchez, W. and C. Daboo, "WebDAV Current Principal
+ Extension", RFC 5397, December 2008.
+
+ [RFC5689] Daboo, C., "Extended MKCOL for Web Distributed Authoring
+ and Versioning (WebDAV)", RFC 5689, September 2009.
+
+ [RFC6350] Perreault, S., "vCard Format Specification", RFC 6350,
+ August 2011.
+
+ [W3C.REC-xml-20081126]
+ Bray, T., Paoli, J., Sperberg-McQueen, C., Maler, E., and
+ F. Yergeau, "Extensible Markup Language (XML) 1.0 (Fifth
+ Edition)", World Wide Web Consortium Recommendation REC-
+ xml-20081126, November 2008,
+ <http://www.w3.org/TR/2008/REC-xml-20081126>.
+
+16.2. Informative References
+
+ [IMSP] Myers, J., "IMSP - Internet Message Support Protocol",
+ Work in Progress, June 1995.
+
+ [RFC2244] Newman, C. and J. Myers, "ACAP -- Application
+ Configuration Access Protocol", RFC 2244, November 1997.
+
+ [RFC4510] Zeilenga, K., "Lightweight Directory Access Protocol
+ (LDAP): Technical Specification Road Map", RFC 4510,
+ June 2006.
+
+Author's Address
+
+ Cyrus Daboo
+ Apple, Inc.
+ 1 Infinite Loop
+ Cupertino, CA 95014
+ USA
+
+ EMail: cyrus@daboo.name
+ URI: http://www.apple.com/
+
+
+
+
+
+Daboo Standards Track [Page 48]
+
diff --git a/vendor/sabre/dav/examples/addressbookserver.php b/vendor/sabre/dav/examples/addressbookserver.php
new file mode 100644
index 000000000..b8986bc41
--- /dev/null
+++ b/vendor/sabre/dav/examples/addressbookserver.php
@@ -0,0 +1,56 @@
+<?php
+
+/*
+
+Addressbook/CardDAV server example
+
+This server features CardDAV support
+
+*/
+
+// settings
+date_default_timezone_set('Canada/Eastern');
+
+// Make sure this setting is turned on and reflect the root url for your WebDAV server.
+// This can be for example the root / or a complete path to your server script
+$baseUri = '/';
+
+/* Database */
+$pdo = new PDO('sqlite:data/db.sqlite');
+$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
+
+//Mapping PHP errors to exceptions
+function exception_error_handler($errno, $errstr, $errfile, $errline ) {
+ throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
+}
+set_error_handler("exception_error_handler");
+
+// Autoloader
+require_once 'vendor/autoload.php';
+
+// Backends
+$authBackend = new Sabre\DAV\Auth\Backend\PDO($pdo);
+$principalBackend = new Sabre\DAVACL\PrincipalBackend\PDO($pdo);
+$carddavBackend = new Sabre\CardDAV\Backend\PDO($pdo);
+//$caldavBackend = new Sabre\CalDAV\Backend\PDO($pdo);
+
+// Setting up the directory tree //
+$nodes = array(
+ new Sabre\DAVACL\PrincipalCollection($principalBackend),
+// new Sabre\CalDAV\CalendarRootNode($authBackend, $caldavBackend),
+ new Sabre\CardDAV\AddressBookRoot($principalBackend, $carddavBackend),
+);
+
+// The object tree needs in turn to be passed to the server class
+$server = new Sabre\DAV\Server($nodes);
+$server->setBaseUri($baseUri);
+
+// Plugins
+$server->addPlugin(new Sabre\DAV\Auth\Plugin($authBackend,'SabreDAV'));
+$server->addPlugin(new Sabre\DAV\Browser\Plugin());
+//$server->addPlugin(new Sabre\CalDAV\Plugin());
+$server->addPlugin(new Sabre\CardDAV\Plugin());
+$server->addPlugin(new Sabre\DAVACL\Plugin());
+
+// And off we go!
+$server->exec();
diff --git a/vendor/sabre/dav/examples/basicauth.php b/vendor/sabre/dav/examples/basicauth.php
new file mode 100644
index 000000000..743c07ce2
--- /dev/null
+++ b/vendor/sabre/dav/examples/basicauth.php
@@ -0,0 +1,26 @@
+<?php
+
+// !!!! Make sure the Sabre directory is in the include_path !!!
+// example:
+// set_include_path('lib/' . PATH_SEPARATOR . get_include_path());
+
+// settings
+date_default_timezone_set('Canada/Eastern');
+
+// Files we need
+require_once 'vendor/autoload.php';
+
+$u = 'admin';
+$p = '1234';
+
+$auth = new \Sabre\HTTP\BasicAuth();
+
+$result = $auth->getUserPass();
+
+if (!$result || $result[0]!=$u || $result[1]!=$p) {
+
+ $auth->requireLogin();
+ echo "Authentication required\n";
+ die();
+
+}
diff --git a/vendor/sabre/dav/examples/digestauth.php b/vendor/sabre/dav/examples/digestauth.php
new file mode 100644
index 000000000..1f4a74b44
--- /dev/null
+++ b/vendor/sabre/dav/examples/digestauth.php
@@ -0,0 +1,25 @@
+<?php
+
+// !!!! Make sure the Sabre directory is in the include_path !!!
+// example:
+// set_include_path('lib/' . PATH_SEPARATOR . get_include_path());
+
+// settings
+date_default_timezone_set('Canada/Eastern');
+
+// Files we need
+require_once 'vendor/autoload.php';
+
+$u = 'admin';
+$p = '1234';
+
+$auth = new \Sabre\HTTP\DigestAuth();
+$auth->init();
+
+if ($auth->getUsername() != $u || !$auth->validatePassword($p)) {
+
+ $auth->requireLogin();
+ echo "Authentication required\n";
+ die();
+
+}
diff --git a/vendor/sabre/dav/examples/simplefsserver.php b/vendor/sabre/dav/examples/simplefsserver.php
new file mode 100644
index 000000000..f1b4a1100
--- /dev/null
+++ b/vendor/sabre/dav/examples/simplefsserver.php
@@ -0,0 +1,123 @@
+<?php
+
+// !!!! Make sure the Sabre directory is in the include_path !!!
+// example:
+// set_include_path('lib/' . PATH_SEPARATOR . get_include_path());
+
+/*
+
+This example demonstrates a simple way to create your own virtual filesystems.
+By extending the _File and Directory classes, you can easily create a tree
+based on various datasources.
+
+The most obvious example is the filesystem itself. A more complete and documented
+example can be found in:
+
+lib/Sabre/DAV/FS/Node.php
+lib/Sabre/DAV/FS/Directory.php
+lib/Sabre/DAV/FS/File.php
+
+*/
+
+// settings
+date_default_timezone_set('Canada/Eastern');
+$publicDir = 'public';
+
+// Files we need
+require_once 'vendor/autoload.php';
+
+class MyCollection extends Sabre\DAV\Collection {
+
+ private $myPath;
+
+ function __construct($myPath) {
+
+ $this->myPath = $myPath;
+
+ }
+
+ function getChildren() {
+
+ $children = array();
+ // Loop through the directory, and create objects for each node
+ foreach(scandir($this->myPath) as $node) {
+
+ // Ignoring files staring with .
+ if ($node[0]==='.') continue;
+
+ $children[] = $this->getChild($node);
+
+ }
+
+ return $children;
+
+ }
+
+ function getChild($name) {
+
+ $path = $this->myPath . '/' . $name;
+
+ // We have to throw a NotFound exception if the file didn't exist
+ if (!file\exists($this->myPath)) throw new \Sabre\DAV\Exception\NotFound('The file with name: ' . $name . ' could not be found');
+ // Some added security
+
+ if ($name[0]=='.') throw new \Sabre\DAV\Exception\Forbidden('Access denied');
+
+ if (is_dir($path)) {
+
+ return new \MyCollection($name);
+
+ } else {
+
+ return new \MyFile($path);
+
+ }
+
+ }
+
+ function getName() {
+
+ return basename($this->myPath);
+
+ }
+
+}
+
+class MyFile extends \Sabre\DAV\File {
+
+ private $myPath;
+
+ function __construct($myPath) {
+
+ $this->myPath = $myPath;
+
+ }
+
+ function getName() {
+
+ return basename($this->myPath);
+
+ }
+
+ function get() {
+
+ return fopen($this->myPath,'r');
+
+ }
+
+ function getSize() {
+
+ return filesize($this->myPath);
+
+ }
+
+}
+
+// Make sure there is a directory in your current directory named 'public'. We will be exposing that directory to WebDAV
+$rootNode = new \MyCollection($publicDir);
+
+// The rootNode needs to be passed to the server object.
+$server = new \Sabre\DAV\Server($rootNode);
+
+// And off we go!
+$server->exec();
diff --git a/vendor/sabre/dav/examples/sql/mysql.addressbook.sql b/vendor/sabre/dav/examples/sql/mysql.addressbook.sql
new file mode 100644
index 000000000..f603ad4c5
--- /dev/null
+++ b/vendor/sabre/dav/examples/sql/mysql.addressbook.sql
@@ -0,0 +1,18 @@
+CREATE TABLE addressbooks (
+ id INT(11) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ principaluri VARCHAR(255),
+ displayname VARCHAR(255),
+ uri VARCHAR(200),
+ description TEXT,
+ ctag INT(11) UNSIGNED NOT NULL DEFAULT '1',
+ UNIQUE(principaluri, uri)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
+
+CREATE TABLE cards (
+ id INT(11) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ addressbookid INT(11) UNSIGNED NOT NULL,
+ carddata MEDIUMBLOB,
+ uri VARCHAR(200),
+ lastmodified INT(11) UNSIGNED
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
+
diff --git a/vendor/sabre/dav/examples/sql/mysql.calendars.sql b/vendor/sabre/dav/examples/sql/mysql.calendars.sql
new file mode 100644
index 000000000..a8eb102d1
--- /dev/null
+++ b/vendor/sabre/dav/examples/sql/mysql.calendars.sql
@@ -0,0 +1,28 @@
+CREATE TABLE calendarobjects (
+ id INTEGER UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ calendardata MEDIUMBLOB,
+ uri VARCHAR(200),
+ calendarid INTEGER UNSIGNED NOT NULL,
+ lastmodified INT(11) UNSIGNED,
+ etag VARCHAR(32),
+ size INT(11) UNSIGNED NOT NULL,
+ componenttype VARCHAR(8),
+ firstoccurence INT(11) UNSIGNED,
+ lastoccurence INT(11) UNSIGNED,
+ UNIQUE(calendarid, uri)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
+
+CREATE TABLE calendars (
+ id INTEGER UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ principaluri VARCHAR(100),
+ displayname VARCHAR(100),
+ uri VARCHAR(200),
+ ctag INTEGER UNSIGNED NOT NULL DEFAULT '0',
+ description TEXT,
+ calendarorder INTEGER UNSIGNED NOT NULL DEFAULT '0',
+ calendarcolor VARCHAR(10),
+ timezone TEXT,
+ components VARCHAR(20),
+ transparent TINYINT(1) NOT NULL DEFAULT '0',
+ UNIQUE(principaluri, uri)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
diff --git a/vendor/sabre/dav/examples/sql/mysql.locks.sql b/vendor/sabre/dav/examples/sql/mysql.locks.sql
new file mode 100644
index 000000000..cf3caf4f7
--- /dev/null
+++ b/vendor/sabre/dav/examples/sql/mysql.locks.sql
@@ -0,0 +1,13 @@
+CREATE TABLE locks (
+ id INTEGER UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ owner VARCHAR(100),
+ timeout INTEGER UNSIGNED,
+ created INTEGER,
+ token VARCHAR(100),
+ scope TINYINT,
+ depth TINYINT,
+ uri VARCHAR(1000),
+ INDEX(token),
+ INDEX(uri)
+);
+
diff --git a/vendor/sabre/dav/examples/sql/mysql.principals.sql b/vendor/sabre/dav/examples/sql/mysql.principals.sql
new file mode 100644
index 000000000..da9282818
--- /dev/null
+++ b/vendor/sabre/dav/examples/sql/mysql.principals.sql
@@ -0,0 +1,22 @@
+CREATE TABLE principals (
+ id INTEGER UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ uri VARCHAR(200) NOT NULL,
+ email VARCHAR(80),
+ displayname VARCHAR(80),
+ vcardurl VARCHAR(255),
+ UNIQUE(uri)
+);
+
+CREATE TABLE groupmembers (
+ id INTEGER UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ principal_id INTEGER UNSIGNED NOT NULL,
+ member_id INTEGER UNSIGNED NOT NULL,
+ UNIQUE(principal_id, member_id)
+);
+
+
+INSERT INTO principals (uri,email,displayname) VALUES
+('principals/admin', 'admin@example.org','Administrator'),
+('principals/admin/calendar-proxy-read', null, null),
+('principals/admin/calendar-proxy-write', null, null);
+
diff --git a/vendor/sabre/dav/examples/sql/mysql.users.sql b/vendor/sabre/dav/examples/sql/mysql.users.sql
new file mode 100644
index 000000000..1244f596f
--- /dev/null
+++ b/vendor/sabre/dav/examples/sql/mysql.users.sql
@@ -0,0 +1,9 @@
+CREATE TABLE users (
+ id INTEGER UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ username VARCHAR(50),
+ digesta1 VARCHAR(32),
+ UNIQUE(username)
+);
+
+INSERT INTO users (username,digesta1) VALUES
+('admin', '87fd274b7b6c01e48d7c2f965da8ddf7');
diff --git a/vendor/sabre/dav/examples/sql/pgsql.addressbook.sql b/vendor/sabre/dav/examples/sql/pgsql.addressbook.sql
new file mode 100644
index 000000000..c3ca8b291
--- /dev/null
+++ b/vendor/sabre/dav/examples/sql/pgsql.addressbook.sql
@@ -0,0 +1,33 @@
+CREATE TABLE addressbooks (
+ id SERIAL NOT NULL,
+ principaluri VARCHAR(255),
+ displayname VARCHAR(255),
+ uri VARCHAR(200),
+ description TEXT,
+ ctag INTEGER NOT NULL DEFAULT 1
+);
+
+ALTER TABLE ONLY addressbooks
+ ADD CONSTRAINT addressbooks_pkey PRIMARY KEY (id);
+
+CREATE UNIQUE INDEX addressbooks_ukey
+ ON addressbooks USING btree (principaluri, uri);
+
+CREATE TABLE cards (
+ id SERIAL NOT NULL,
+ addressbookid INTEGER NOT NULL,
+ carddata TEXT,
+ uri VARCHAR(200),
+ lastmodified INTEGER
+);
+
+ALTER TABLE ONLY cards
+ ADD CONSTRAINT cards_pkey PRIMARY KEY (id);
+
+CREATE UNIQUE INDEX cards_ukey
+ ON cards USING btree (addressbookid, uri);
+
+ALTER TABLE ONLY cards
+ ADD CONSTRAINT cards_addressbookid_fkey FOREIGN KEY (addressbookid) REFERENCES addressbooks(id)
+ ON DELETE CASCADE;
+
diff --git a/vendor/sabre/dav/examples/sql/pgsql.calendars.sql b/vendor/sabre/dav/examples/sql/pgsql.calendars.sql
new file mode 100644
index 000000000..23465ae93
--- /dev/null
+++ b/vendor/sabre/dav/examples/sql/pgsql.calendars.sql
@@ -0,0 +1,42 @@
+CREATE TABLE calendars (
+ id SERIAL NOT NULL,
+ principaluri VARCHAR(100),
+ displayname VARCHAR(100),
+ uri VARCHAR(200),
+ ctag INTEGER NOT NULL DEFAULT 0,
+ description TEXT,
+ calendarorder INTEGER NOT NULL DEFAULT 0,
+ calendarcolor VARCHAR(10),
+ timezone TEXT,
+ components VARCHAR(20),
+ transparent SMALLINT NOT NULL DEFAULT '0'
+);
+
+ALTER TABLE ONLY calendars
+ ADD CONSTRAINT calendars_pkey PRIMARY KEY (id);
+
+CREATE UNIQUE INDEX calendars_ukey
+ ON calendars USING btree (principaluri, uri);
+
+CREATE TABLE calendarobjects (
+ id SERIAL NOT NULL,
+ calendarid INTEGER NOT NULL,
+ calendardata TEXT,
+ uri VARCHAR(200),
+ etag VARCHAR(32),
+ size INTEGER NOT NULL,
+ componenttype VARCHAR(8),
+ lastmodified INTEGER,
+ firstoccurence INTEGER,
+ lastoccurence INTEGER
+);
+
+ALTER TABLE ONLY calendarobjects
+ ADD CONSTRAINT calendarobjects_pkey PRIMARY KEY (id);
+
+CREATE UNIQUE INDEX calendarobjects_ukey
+ ON calendarobjects USING btree (calendarid, uri);
+
+ALTER TABLE ONLY calendarobjects
+ ADD CONSTRAINT calendarobjects_calendarid_fkey FOREIGN KEY (calendarid) REFERENCES calendars(id)
+ ON DELETE CASCADE;
diff --git a/vendor/sabre/dav/examples/sql/pgsql.locks.sql b/vendor/sabre/dav/examples/sql/pgsql.locks.sql
new file mode 100644
index 000000000..ca6c82e96
--- /dev/null
+++ b/vendor/sabre/dav/examples/sql/pgsql.locks.sql
@@ -0,0 +1,13 @@
+CREATE TABLE locks (
+ id SERIAL NOT NULL,
+ owner VARCHAR(100),
+ timeout INTEGER,
+ created INTEGER,
+ token VARCHAR(100),
+ scope smallint,
+ depth smallint,
+ uri text
+);
+
+ALTER TABLE ONLY locks
+ ADD CONSTRAINT locks_pkey PRIMARY KEY (id);
diff --git a/vendor/sabre/dav/examples/sql/pgsql.principals.sql b/vendor/sabre/dav/examples/sql/pgsql.principals.sql
new file mode 100644
index 000000000..4afe51063
--- /dev/null
+++ b/vendor/sabre/dav/examples/sql/pgsql.principals.sql
@@ -0,0 +1,40 @@
+CREATE TABLE principals (
+ id SERIAL NOT NULL,
+ uri VARCHAR(100) NOT NULL,
+ email VARCHAR(80),
+ displayname VARCHAR(80),
+ vcardurl VARCHAR(255)
+);
+
+ALTER TABLE ONLY principals
+ ADD CONSTRAINT principals_pkey PRIMARY KEY (id);
+
+CREATE UNIQUE INDEX principals_ukey
+ ON principals USING btree (uri);
+
+CREATE TABLE groupmembers (
+ id SERIAL NOT NULL,
+ principal_id INTEGER NOT NULL,
+ member_id INTEGER NOT NULL
+);
+
+ALTER TABLE ONLY groupmembers
+ ADD CONSTRAINT groupmembers_pkey PRIMARY KEY (id);
+
+CREATE UNIQUE INDEX groupmembers_ukey
+ ON groupmembers USING btree (principal_id, member_id);
+
+ALTER TABLE ONLY groupmembers
+ ADD CONSTRAINT groupmembers_principal_id_fkey FOREIGN KEY (principal_id) REFERENCES principals(id)
+ ON DELETE CASCADE;
+
+-- Is this correct correct link ... or not?
+-- ALTER TABLE ONLY groupmembers
+-- ADD CONSTRAINT groupmembers_member_id_id_fkey FOREIGN KEY (member_id) REFERENCES users(id)
+-- ON DELETE CASCADE;
+
+INSERT INTO principals (uri,email,displayname) VALUES
+('principals/admin', 'admin@example.org','Administrator'),
+('principals/admin/calendar-proxy-read', null, null),
+('principals/admin/calendar-proxy-write', null, null);
+
diff --git a/vendor/sabre/dav/examples/sql/pgsql.users.sql b/vendor/sabre/dav/examples/sql/pgsql.users.sql
new file mode 100644
index 000000000..939c931d8
--- /dev/null
+++ b/vendor/sabre/dav/examples/sql/pgsql.users.sql
@@ -0,0 +1,15 @@
+CREATE TABLE users (
+ id SERIAL NOT NULL,
+ username VARCHAR(50),
+ digesta1 VARCHAR(32),
+ UNIQUE(username)
+);
+
+ALTER TABLE ONLY users
+ ADD CONSTRAINT users_pkey PRIMARY KEY (id);
+
+CREATE UNIQUE INDEX users_ukey
+ ON users USING btree (username);
+
+INSERT INTO users (username,digesta1) VALUES
+('admin', '87fd274b7b6c01e48d7c2f965da8ddf7');
diff --git a/vendor/sabre/dav/examples/sql/sqlite.addressbooks.sql b/vendor/sabre/dav/examples/sql/sqlite.addressbooks.sql
new file mode 100644
index 000000000..aa7639c5f
--- /dev/null
+++ b/vendor/sabre/dav/examples/sql/sqlite.addressbooks.sql
@@ -0,0 +1,17 @@
+CREATE TABLE addressbooks (
+ id integer primary key asc,
+ principaluri text,
+ displayname text,
+ uri text,
+ description text,
+ ctag integer
+);
+
+CREATE TABLE cards (
+ id integer primary key asc,
+ addressbookid integer,
+ carddata blob,
+ uri text,
+ lastmodified integer
+);
+
diff --git a/vendor/sabre/dav/examples/sql/sqlite.calendars.sql b/vendor/sabre/dav/examples/sql/sqlite.calendars.sql
new file mode 100644
index 000000000..537789906
--- /dev/null
+++ b/vendor/sabre/dav/examples/sql/sqlite.calendars.sql
@@ -0,0 +1,26 @@
+CREATE TABLE calendarobjects (
+ id integer primary key asc,
+ calendardata blob,
+ uri text,
+ calendarid integer,
+ lastmodified integer,
+ etag text,
+ size integer,
+ componenttype text,
+ firstoccurence integer,
+ lastoccurence integer
+);
+
+CREATE TABLE calendars (
+ id integer primary key asc,
+ principaluri text,
+ displayname text,
+ uri text,
+ ctag integer,
+ description text,
+ calendarorder integer,
+ calendarcolor text,
+ timezone text,
+ components text,
+ transparent bool
+);
diff --git a/vendor/sabre/dav/examples/sql/sqlite.locks.sql b/vendor/sabre/dav/examples/sql/sqlite.locks.sql
new file mode 100644
index 000000000..fd89b41eb
--- /dev/null
+++ b/vendor/sabre/dav/examples/sql/sqlite.locks.sql
@@ -0,0 +1,12 @@
+BEGIN TRANSACTION;
+CREATE TABLE locks (
+ id integer primary key asc,
+ owner text,
+ timeout integer,
+ created integer,
+ token text,
+ scope integer,
+ depth integer,
+ uri text
+);
+COMMIT;
diff --git a/vendor/sabre/dav/examples/sql/sqlite.principals.sql b/vendor/sabre/dav/examples/sql/sqlite.principals.sql
new file mode 100644
index 000000000..09dbc4d24
--- /dev/null
+++ b/vendor/sabre/dav/examples/sql/sqlite.principals.sql
@@ -0,0 +1,21 @@
+CREATE TABLE principals (
+ id INTEGER PRIMARY KEY ASC,
+ uri TEXT,
+ email TEXT,
+ displayname TEXT,
+ vcardurl TEXT,
+ UNIQUE(uri)
+);
+
+CREATE TABLE groupmembers (
+ id INTEGER PRIMARY KEY ASC,
+ principal_id INTEGER,
+ member_id INTEGER,
+ UNIQUE(principal_id, member_id)
+);
+
+
+INSERT INTO principals (uri,email,displayname) VALUES ('principals/admin', 'admin@example.org','Administrator');
+INSERT INTO principals (uri,email,displayname) VALUES ('principals/admin/calendar-proxy-read', null, null);
+INSERT INTO principals (uri,email,displayname) VALUES ('principals/admin/calendar-proxy-write', null, null);
+
diff --git a/vendor/sabre/dav/examples/sql/sqlite.users.sql b/vendor/sabre/dav/examples/sql/sqlite.users.sql
new file mode 100644
index 000000000..f4b2c1674
--- /dev/null
+++ b/vendor/sabre/dav/examples/sql/sqlite.users.sql
@@ -0,0 +1,9 @@
+CREATE TABLE users (
+ id integer primary key asc,
+ username TEXT,
+ digesta1 TEXT,
+ UNIQUE(username)
+);
+
+INSERT INTO users (username,digesta1) VALUES
+('admin', '87fd274b7b6c01e48d7c2f965da8ddf7');
diff --git a/vendor/sabre/dav/examples/webserver/apache2_htaccess.conf b/vendor/sabre/dav/examples/webserver/apache2_htaccess.conf
new file mode 100644
index 000000000..c5f29ba80
--- /dev/null
+++ b/vendor/sabre/dav/examples/webserver/apache2_htaccess.conf
@@ -0,0 +1,16 @@
+RewriteEngine On
+# This makes every request go to server.php
+RewriteRule (.*) server.php [L]
+
+# Output buffering needs to be off, to prevent high memory usage
+php_flag output_buffering off
+
+# This is also to prevent high memory usage
+php_flag always_populate_raw_post_data off
+
+# This is almost a given, but magic quotes is *still* on on some
+# linux distributions
+php_flag magic_quotes_gpc off
+
+# SabreDAV is not compatible with mbstring function overloading
+php_flag mbstring.func_overload off
diff --git a/vendor/sabre/dav/examples/webserver/apache2_vhost.conf b/vendor/sabre/dav/examples/webserver/apache2_vhost.conf
new file mode 100644
index 000000000..bb374eb0f
--- /dev/null
+++ b/vendor/sabre/dav/examples/webserver/apache2_vhost.conf
@@ -0,0 +1,33 @@
+# This is a sample configuration to setup a dedicated Apache vhost for WebDAV.
+#
+# The main thing that should be configured is the servername, and the path to
+# your SabreDAV installation (DocumentRoot).
+#
+# This configuration assumed mod_php5 is used, as it sets a few default php
+# settings as well.
+<VirtualHost *:*>
+
+ # Don't forget to change the server name
+ # ServerName dav.example.org
+
+ # The DocumentRoot is also required
+ # DocumentRoot /home/sabredav/
+
+ RewriteEngine On
+ # This makes every request go to server.php
+ RewriteRule ^/(.*)$ /server.php [L]
+
+ # Output buffering needs to be off, to prevent high memory usage
+ php_flag output_buffering off
+
+ # This is also to prevent high memory usage
+ php_flag always_populate_raw_post_data off
+
+ # This is almost a given, but magic quotes is *still* on on some
+ # linux distributions
+ php_flag magic_quotes_gpc off
+
+ # SabreDAV is not compatible with mbstring function overloading
+ php_flag mbstring.func_overload off
+
+</VirtualHost *:*>
diff --git a/vendor/sabre/dav/examples/webserver/apache2_vhost_cgi.conf b/vendor/sabre/dav/examples/webserver/apache2_vhost_cgi.conf
new file mode 100644
index 000000000..607254c6e
--- /dev/null
+++ b/vendor/sabre/dav/examples/webserver/apache2_vhost_cgi.conf
@@ -0,0 +1,21 @@
+# This is a sample configuration to setup a dedicated Apache vhost for WebDAV.
+#
+# The main thing that should be configured is the servername, and the path to
+# your SabreDAV installation (DocumentRoot).
+#
+# This configuration assumes CGI or FastCGI is used.
+<VirtualHost *:*>
+
+ # Don't forget to change the server name
+ # ServerName dav.example.org
+
+ # The DocumentRoot is also required
+ # DocumentRoot /home/sabredav/
+
+ # This makes every request go to server.php. This also makes sure
+ # the Authentication information is available. If your server script is
+ # not called server.php, be sure to change it.
+ RewriteEngine On
+ RewriteRule ^/(.*)$ /server.php [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
+
+</VirtualHost *:*>
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/Backend/AbstractBackend.php b/vendor/sabre/dav/lib/Sabre/CalDAV/Backend/AbstractBackend.php
new file mode 100644
index 000000000..21f88162b
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/Backend/AbstractBackend.php
@@ -0,0 +1,155 @@
+<?php
+
+namespace Sabre\CalDAV\Backend;
+
+use Sabre\VObject;
+use Sabre\CalDAV;
+
+/**
+ * Abstract Calendaring backend. Extend this class to create your own backends.
+ *
+ * Checkout the BackendInterface for all the methods that must be implemented.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+abstract class AbstractBackend implements BackendInterface {
+
+ /**
+ * Updates properties for a calendar.
+ *
+ * The mutations array uses the propertyName in clark-notation as key,
+ * and the array value for the property value. In the case a property
+ * should be deleted, the property value will be null.
+ *
+ * This method must be atomic. If one property cannot be changed, the
+ * entire operation must fail.
+ *
+ * If the operation was successful, true can be returned.
+ * If the operation failed, false can be returned.
+ *
+ * Deletion of a non-existent property is always successful.
+ *
+ * Lastly, it is optional to return detailed information about any
+ * failures. In this case an array should be returned with the following
+ * structure:
+ *
+ * array(
+ * 403 => array(
+ * '{DAV:}displayname' => null,
+ * ),
+ * 424 => array(
+ * '{DAV:}owner' => null,
+ * )
+ * )
+ *
+ * In this example it was forbidden to update {DAV:}displayname.
+ * (403 Forbidden), which in turn also caused {DAV:}owner to fail
+ * (424 Failed Dependency) because the request needs to be atomic.
+ *
+ * @param mixed $calendarId
+ * @param array $mutations
+ * @return bool|array
+ */
+ public function updateCalendar($calendarId, array $mutations) {
+
+ return false;
+
+ }
+
+ /**
+ * Performs a calendar-query on the contents of this calendar.
+ *
+ * The calendar-query is defined in RFC4791 : CalDAV. Using the
+ * calendar-query it is possible for a client to request a specific set of
+ * object, based on contents of iCalendar properties, date-ranges and
+ * iCalendar component types (VTODO, VEVENT).
+ *
+ * This method should just return a list of (relative) urls that match this
+ * query.
+ *
+ * The list of filters are specified as an array. The exact array is
+ * documented by \Sabre\CalDAV\CalendarQueryParser.
+ *
+ * Note that it is extremely likely that getCalendarObject for every path
+ * returned from this method will be called almost immediately after. You
+ * may want to anticipate this to speed up these requests.
+ *
+ * This method provides a default implementation, which parses *all* the
+ * iCalendar objects in the specified calendar.
+ *
+ * This default may well be good enough for personal use, and calendars
+ * that aren't very large. But if you anticipate high usage, big calendars
+ * or high loads, you are strongly adviced to optimize certain paths.
+ *
+ * The best way to do so is override this method and to optimize
+ * specifically for 'common filters'.
+ *
+ * Requests that are extremely common are:
+ * * requests for just VEVENTS
+ * * requests for just VTODO
+ * * requests with a time-range-filter on either VEVENT or VTODO.
+ *
+ * ..and combinations of these requests. It may not be worth it to try to
+ * handle every possible situation and just rely on the (relatively
+ * easy to use) CalendarQueryValidator to handle the rest.
+ *
+ * Note that especially time-range-filters may be difficult to parse. A
+ * time-range filter specified on a VEVENT must for instance also handle
+ * recurrence rules correctly.
+ * A good example of how to interprete all these filters can also simply
+ * be found in \Sabre\CalDAV\CalendarQueryFilter. This class is as correct
+ * as possible, so it gives you a good idea on what type of stuff you need
+ * to think of.
+ *
+ * @param mixed $calendarId
+ * @param array $filters
+ * @return array
+ */
+ public function calendarQuery($calendarId, array $filters) {
+
+ $result = array();
+ $objects = $this->getCalendarObjects($calendarId);
+
+ $validator = new \Sabre\CalDAV\CalendarQueryValidator();
+
+ foreach($objects as $object) {
+
+ if ($this->validateFilterForObject($object, $filters)) {
+ $result[] = $object['uri'];
+ }
+
+ }
+
+ return $result;
+
+ }
+
+ /**
+ * This method validates if a filters (as passed to calendarQuery) matches
+ * the given object.
+ *
+ * @param array $object
+ * @param array $filters
+ * @return bool
+ */
+ protected function validateFilterForObject(array $object, array $filters) {
+
+ // Unfortunately, setting the 'calendardata' here is optional. If
+ // it was excluded, we actually need another call to get this as
+ // well.
+ if (!isset($object['calendardata'])) {
+ $object = $this->getCalendarObject($object['calendarid'], $object['uri']);
+ }
+
+ $data = is_resource($object['calendardata'])?stream_get_contents($object['calendardata']):$object['calendardata'];
+ $vObject = VObject\Reader::read($data);
+
+ $validator = new CalDAV\CalendarQueryValidator();
+ return $validator->validate($vObject, $filters);
+
+ }
+
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/Backend/BackendInterface.php b/vendor/sabre/dav/lib/Sabre/CalDAV/Backend/BackendInterface.php
new file mode 100644
index 000000000..b8334e5d0
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/Backend/BackendInterface.php
@@ -0,0 +1,233 @@
+<?php
+
+namespace Sabre\CalDAV\Backend;
+
+/**
+ * Every CalDAV backend must at least implement this interface.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+interface BackendInterface {
+
+ /**
+ * Returns a list of calendars for a principal.
+ *
+ * Every project is an array with the following keys:
+ * * id, a unique id that will be used by other functions to modify the
+ * calendar. This can be the same as the uri or a database key.
+ * * uri, which the basename of the uri with which the calendar is
+ * accessed.
+ * * principaluri. The owner of the calendar. Almost always the same as
+ * principalUri passed to this method.
+ *
+ * Furthermore it can contain webdav properties in clark notation. A very
+ * common one is '{DAV:}displayname'.
+ *
+ * @param string $principalUri
+ * @return array
+ */
+ public function getCalendarsForUser($principalUri);
+
+ /**
+ * Creates a new calendar for a principal.
+ *
+ * If the creation was a success, an id must be returned that can be used to reference
+ * this calendar in other methods, such as updateCalendar.
+ *
+ * @param string $principalUri
+ * @param string $calendarUri
+ * @param array $properties
+ * @return void
+ */
+ public function createCalendar($principalUri,$calendarUri,array $properties);
+
+ /**
+ * Updates properties for a calendar.
+ *
+ * The mutations array uses the propertyName in clark-notation as key,
+ * and the array value for the property value. In the case a property
+ * should be deleted, the property value will be null.
+ *
+ * This method must be atomic. If one property cannot be changed, the
+ * entire operation must fail.
+ *
+ * If the operation was successful, true can be returned.
+ * If the operation failed, false can be returned.
+ *
+ * Deletion of a non-existent property is always successful.
+ *
+ * Lastly, it is optional to return detailed information about any
+ * failures. In this case an array should be returned with the following
+ * structure:
+ *
+ * array(
+ * 403 => array(
+ * '{DAV:}displayname' => null,
+ * ),
+ * 424 => array(
+ * '{DAV:}owner' => null,
+ * )
+ * )
+ *
+ * In this example it was forbidden to update {DAV:}displayname.
+ * (403 Forbidden), which in turn also caused {DAV:}owner to fail
+ * (424 Failed Dependency) because the request needs to be atomic.
+ *
+ * @param mixed $calendarId
+ * @param array $mutations
+ * @return bool|array
+ */
+ public function updateCalendar($calendarId, array $mutations);
+
+ /**
+ * Delete a calendar and all it's objects
+ *
+ * @param mixed $calendarId
+ * @return void
+ */
+ public function deleteCalendar($calendarId);
+
+ /**
+ * Returns all calendar objects within a calendar.
+ *
+ * Every item contains an array with the following keys:
+ * * id - unique identifier which will be used for subsequent updates
+ * * calendardata - The iCalendar-compatible calendar data
+ * * uri - a unique key which will be used to construct the uri. This can be any arbitrary string.
+ * * lastmodified - a timestamp of the last modification time
+ * * etag - An arbitrary string, surrounded by double-quotes. (e.g.:
+ * ' "abcdef"')
+ * * calendarid - The calendarid as it was passed to this function.
+ * * size - The size of the calendar objects, in bytes.
+ *
+ * Note that the etag is optional, but it's highly encouraged to return for
+ * speed reasons.
+ *
+ * The calendardata is also optional. If it's not returned
+ * 'getCalendarObject' will be called later, which *is* expected to return
+ * calendardata.
+ *
+ * If neither etag or size are specified, the calendardata will be
+ * used/fetched to determine these numbers. If both are specified the
+ * amount of times this is needed is reduced by a great degree.
+ *
+ * @param mixed $calendarId
+ * @return array
+ */
+ public function getCalendarObjects($calendarId);
+
+ /**
+ * Returns information from a single calendar object, based on it's object
+ * uri.
+ *
+ * The returned array must have the same keys as getCalendarObjects. The
+ * 'calendardata' object is required here though, while it's not required
+ * for getCalendarObjects.
+ *
+ * This method must return null if the object did not exist.
+ *
+ * @param mixed $calendarId
+ * @param string $objectUri
+ * @return array|null
+ */
+ public function getCalendarObject($calendarId,$objectUri);
+
+ /**
+ * Creates a new calendar object.
+ *
+ * It is possible return an etag from this function, which will be used in
+ * the response to this PUT request. Note that the ETag must be surrounded
+ * by double-quotes.
+ *
+ * However, you should only really return this ETag if you don't mangle the
+ * calendar-data. If the result of a subsequent GET to this object is not
+ * the exact same as this request body, you should omit the ETag.
+ *
+ * @param mixed $calendarId
+ * @param string $objectUri
+ * @param string $calendarData
+ * @return string|null
+ */
+ public function createCalendarObject($calendarId,$objectUri,$calendarData);
+
+ /**
+ * Updates an existing calendarobject, based on it's uri.
+ *
+ * It is possible return an etag from this function, which will be used in
+ * the response to this PUT request. Note that the ETag must be surrounded
+ * by double-quotes.
+ *
+ * However, you should only really return this ETag if you don't mangle the
+ * calendar-data. If the result of a subsequent GET to this object is not
+ * the exact same as this request body, you should omit the ETag.
+ *
+ * @param mixed $calendarId
+ * @param string $objectUri
+ * @param string $calendarData
+ * @return string|null
+ */
+ public function updateCalendarObject($calendarId,$objectUri,$calendarData);
+
+ /**
+ * Deletes an existing calendar object.
+ *
+ * @param mixed $calendarId
+ * @param string $objectUri
+ * @return void
+ */
+ public function deleteCalendarObject($calendarId,$objectUri);
+
+ /**
+ * Performs a calendar-query on the contents of this calendar.
+ *
+ * The calendar-query is defined in RFC4791 : CalDAV. Using the
+ * calendar-query it is possible for a client to request a specific set of
+ * object, based on contents of iCalendar properties, date-ranges and
+ * iCalendar component types (VTODO, VEVENT).
+ *
+ * This method should just return a list of (relative) urls that match this
+ * query.
+ *
+ * The list of filters are specified as an array. The exact array is
+ * documented by Sabre\CalDAV\CalendarQueryParser.
+ *
+ * Note that it is extremely likely that getCalendarObject for every path
+ * returned from this method will be called almost immediately after. You
+ * may want to anticipate this to speed up these requests.
+ *
+ * This method provides a default implementation, which parses *all* the
+ * iCalendar objects in the specified calendar.
+ *
+ * This default may well be good enough for personal use, and calendars
+ * that aren't very large. But if you anticipate high usage, big calendars
+ * or high loads, you are strongly adviced to optimize certain paths.
+ *
+ * The best way to do so is override this method and to optimize
+ * specifically for 'common filters'.
+ *
+ * Requests that are extremely common are:
+ * * requests for just VEVENTS
+ * * requests for just VTODO
+ * * requests with a time-range-filter on either VEVENT or VTODO.
+ *
+ * ..and combinations of these requests. It may not be worth it to try to
+ * handle every possible situation and just rely on the (relatively
+ * easy to use) CalendarQueryValidator to handle the rest.
+ *
+ * Note that especially time-range-filters may be difficult to parse. A
+ * time-range filter specified on a VEVENT must for instance also handle
+ * recurrence rules correctly.
+ * A good example of how to interprete all these filters can also simply
+ * be found in Sabre\CalDAV\CalendarQueryFilter. This class is as correct
+ * as possible, so it gives you a good idea on what type of stuff you need
+ * to think of.
+ *
+ * @param mixed $calendarId
+ * @param array $filters
+ * @return array
+ */
+ public function calendarQuery($calendarId, array $filters);
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/Backend/NotificationSupport.php b/vendor/sabre/dav/lib/Sabre/CalDAV/Backend/NotificationSupport.php
new file mode 100644
index 000000000..50021a3e7
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/Backend/NotificationSupport.php
@@ -0,0 +1,47 @@
+<?php
+
+namespace Sabre\CalDAV\Backend;
+
+/**
+ * Adds caldav notification support to a backend.
+ *
+ * Note: This feature is experimental, and may change in between different
+ * SabreDAV versions.
+ *
+ * Notifications are defined at:
+ * http://svn.calendarserver.org/repository/calendarserver/CalendarServer/trunk/doc/Extensions/caldav-notifications.txt
+ *
+ * These notifications are basically a list of server-generated notifications
+ * displayed to the user. Users can dismiss notifications by deleting them.
+ *
+ * The primary usecase is to allow for calendar-sharing.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+interface NotificationSupport extends BackendInterface {
+
+ /**
+ * Returns a list of notifications for a given principal url.
+ *
+ * The returned array should only consist of implementations of
+ * \Sabre\CalDAV\Notifications\INotificationType.
+ *
+ * @param string $principalUri
+ * @return array
+ */
+ public function getNotificationsForPrincipal($principalUri);
+
+ /**
+ * This deletes a specific notifcation.
+ *
+ * This may be called by a client once it deems a notification handled.
+ *
+ * @param string $principalUri
+ * @param \Sabre\CalDAV\Notifications\INotificationType $notification
+ * @return void
+ */
+ public function deleteNotification($principalUri, \Sabre\CalDAV\Notifications\INotificationType $notification);
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/Backend/PDO.php b/vendor/sabre/dav/lib/Sabre/CalDAV/Backend/PDO.php
new file mode 100644
index 000000000..99130ceb1
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/Backend/PDO.php
@@ -0,0 +1,691 @@
+<?php
+
+namespace Sabre\CalDAV\Backend;
+
+use Sabre\VObject;
+use Sabre\CalDAV;
+use Sabre\DAV;
+
+/**
+ * PDO CalDAV backend
+ *
+ * This backend is used to store calendar-data in a PDO database, such as
+ * sqlite or MySQL
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class PDO extends AbstractBackend {
+
+ /**
+ * We need to specify a max date, because we need to stop *somewhere*
+ *
+ * On 32 bit system the maximum for a signed integer is 2147483647, so
+ * MAX_DATE cannot be higher than date('Y-m-d', 2147483647) which results
+ * in 2038-01-19 to avoid problems when the date is converted
+ * to a unix timestamp.
+ */
+ const MAX_DATE = '2038-01-01';
+
+ /**
+ * pdo
+ *
+ * @var \PDO
+ */
+ protected $pdo;
+
+ /**
+ * The table name that will be used for calendars
+ *
+ * @var string
+ */
+ protected $calendarTableName;
+
+ /**
+ * The table name that will be used for calendar objects
+ *
+ * @var string
+ */
+ protected $calendarObjectTableName;
+
+ /**
+ * List of CalDAV properties, and how they map to database fieldnames
+ * Add your own properties by simply adding on to this array.
+ *
+ * Note that only string-based properties are supported here.
+ *
+ * @var array
+ */
+ public $propertyMap = array(
+ '{DAV:}displayname' => 'displayname',
+ '{urn:ietf:params:xml:ns:caldav}calendar-description' => 'description',
+ '{urn:ietf:params:xml:ns:caldav}calendar-timezone' => 'timezone',
+ '{http://apple.com/ns/ical/}calendar-order' => 'calendarorder',
+ '{http://apple.com/ns/ical/}calendar-color' => 'calendarcolor',
+ );
+
+ /**
+ * Creates the backend
+ *
+ * @param \PDO $pdo
+ * @param string $calendarTableName
+ * @param string $calendarObjectTableName
+ */
+ public function __construct(\PDO $pdo, $calendarTableName = 'calendars', $calendarObjectTableName = 'calendarobjects') {
+
+ $this->pdo = $pdo;
+ $this->calendarTableName = $calendarTableName;
+ $this->calendarObjectTableName = $calendarObjectTableName;
+
+ }
+
+ /**
+ * Returns a list of calendars for a principal.
+ *
+ * Every project is an array with the following keys:
+ * * id, a unique id that will be used by other functions to modify the
+ * calendar. This can be the same as the uri or a database key.
+ * * uri, which the basename of the uri with which the calendar is
+ * accessed.
+ * * principaluri. The owner of the calendar. Almost always the same as
+ * principalUri passed to this method.
+ *
+ * Furthermore it can contain webdav properties in clark notation. A very
+ * common one is '{DAV:}displayname'.
+ *
+ * @param string $principalUri
+ * @return array
+ */
+ public function getCalendarsForUser($principalUri) {
+
+ $fields = array_values($this->propertyMap);
+ $fields[] = 'id';
+ $fields[] = 'uri';
+ $fields[] = 'ctag';
+ $fields[] = 'components';
+ $fields[] = 'principaluri';
+ $fields[] = 'transparent';
+
+ // Making fields a comma-delimited list
+ $fields = implode(', ', $fields);
+ $stmt = $this->pdo->prepare("SELECT " . $fields . " FROM ".$this->calendarTableName." WHERE principaluri = ? ORDER BY calendarorder ASC");
+ $stmt->execute(array($principalUri));
+
+ $calendars = array();
+ while($row = $stmt->fetch(\PDO::FETCH_ASSOC)) {
+
+ $components = array();
+ if ($row['components']) {
+ $components = explode(',',$row['components']);
+ }
+
+ $calendar = array(
+ 'id' => $row['id'],
+ 'uri' => $row['uri'],
+ 'principaluri' => $row['principaluri'],
+ '{' . CalDAV\Plugin::NS_CALENDARSERVER . '}getctag' => $row['ctag']?$row['ctag']:'0',
+ '{' . CalDAV\Plugin::NS_CALDAV . '}supported-calendar-component-set' => new CalDAV\Property\SupportedCalendarComponentSet($components),
+ '{' . CalDAV\Plugin::NS_CALDAV . '}schedule-calendar-transp' => new CalDAV\Property\ScheduleCalendarTransp($row['transparent']?'transparent':'opaque'),
+ );
+
+
+ foreach($this->propertyMap as $xmlName=>$dbName) {
+ $calendar[$xmlName] = $row[$dbName];
+ }
+
+ $calendars[] = $calendar;
+
+ }
+
+ return $calendars;
+
+ }
+
+ /**
+ * Creates a new calendar for a principal.
+ *
+ * If the creation was a success, an id must be returned that can be used to reference
+ * this calendar in other methods, such as updateCalendar
+ *
+ * @param string $principalUri
+ * @param string $calendarUri
+ * @param array $properties
+ * @return string
+ */
+ public function createCalendar($principalUri, $calendarUri, array $properties) {
+
+ $fieldNames = array(
+ 'principaluri',
+ 'uri',
+ 'ctag',
+ 'transparent',
+ );
+ $values = array(
+ ':principaluri' => $principalUri,
+ ':uri' => $calendarUri,
+ ':ctag' => 1,
+ ':transparent' => 0,
+ );
+
+ // Default value
+ $sccs = '{urn:ietf:params:xml:ns:caldav}supported-calendar-component-set';
+ $fieldNames[] = 'components';
+ if (!isset($properties[$sccs])) {
+ $values[':components'] = 'VEVENT,VTODO';
+ } else {
+ if (!($properties[$sccs] instanceof CalDAV\Property\SupportedCalendarComponentSet)) {
+ throw new DAV\Exception('The ' . $sccs . ' property must be of type: \Sabre\CalDAV\Property\SupportedCalendarComponentSet');
+ }
+ $values[':components'] = implode(',',$properties[$sccs]->getValue());
+ }
+ $transp = '{' . CalDAV\Plugin::NS_CALDAV . '}schedule-calendar-transp';
+ if (isset($properties[$transp])) {
+ $values[':transparent'] = $properties[$transp]->getValue()==='transparent';
+ }
+
+ foreach($this->propertyMap as $xmlName=>$dbName) {
+ if (isset($properties[$xmlName])) {
+
+ $values[':' . $dbName] = $properties[$xmlName];
+ $fieldNames[] = $dbName;
+ }
+ }
+
+ $stmt = $this->pdo->prepare("INSERT INTO ".$this->calendarTableName." (".implode(', ', $fieldNames).") VALUES (".implode(', ',array_keys($values)).")");
+ $stmt->execute($values);
+
+ return $this->pdo->lastInsertId();
+
+ }
+
+ /**
+ * Updates properties for a calendar.
+ *
+ * The mutations array uses the propertyName in clark-notation as key,
+ * and the array value for the property value. In the case a property
+ * should be deleted, the property value will be null.
+ *
+ * This method must be atomic. If one property cannot be changed, the
+ * entire operation must fail.
+ *
+ * If the operation was successful, true can be returned.
+ * If the operation failed, false can be returned.
+ *
+ * Deletion of a non-existent property is always successful.
+ *
+ * Lastly, it is optional to return detailed information about any
+ * failures. In this case an array should be returned with the following
+ * structure:
+ *
+ * array(
+ * 403 => array(
+ * '{DAV:}displayname' => null,
+ * ),
+ * 424 => array(
+ * '{DAV:}owner' => null,
+ * )
+ * )
+ *
+ * In this example it was forbidden to update {DAV:}displayname.
+ * (403 Forbidden), which in turn also caused {DAV:}owner to fail
+ * (424 Failed Dependency) because the request needs to be atomic.
+ *
+ * @param string $calendarId
+ * @param array $mutations
+ * @return bool|array
+ */
+ public function updateCalendar($calendarId, array $mutations) {
+
+ $newValues = array();
+ $result = array(
+ 200 => array(), // Ok
+ 403 => array(), // Forbidden
+ 424 => array(), // Failed Dependency
+ );
+
+ $hasError = false;
+
+ foreach($mutations as $propertyName=>$propertyValue) {
+
+ switch($propertyName) {
+ case '{' . CalDAV\Plugin::NS_CALDAV . '}schedule-calendar-transp' :
+ $fieldName = 'transparent';
+ $newValues[$fieldName] = $propertyValue->getValue()==='transparent';
+ break;
+ default :
+ // Checking the property map
+ if (!isset($this->propertyMap[$propertyName])) {
+ // We don't know about this property.
+ $hasError = true;
+ $result[403][$propertyName] = null;
+ unset($mutations[$propertyName]);
+ continue;
+ }
+
+ $fieldName = $this->propertyMap[$propertyName];
+ $newValues[$fieldName] = $propertyValue;
+ }
+
+ }
+
+ // If there were any errors we need to fail the request
+ if ($hasError) {
+ // Properties has the remaining properties
+ foreach($mutations as $propertyName=>$propertyValue) {
+ $result[424][$propertyName] = null;
+ }
+
+ // Removing unused statuscodes for cleanliness
+ foreach($result as $status=>$properties) {
+ if (is_array($properties) && count($properties)===0) unset($result[$status]);
+ }
+
+ return $result;
+
+ }
+
+ // Success
+
+ // Now we're generating the sql query.
+ $valuesSql = array();
+ foreach($newValues as $fieldName=>$value) {
+ $valuesSql[] = $fieldName . ' = ?';
+ }
+ $valuesSql[] = 'ctag = ctag + 1';
+
+ $stmt = $this->pdo->prepare("UPDATE " . $this->calendarTableName . " SET " . implode(', ',$valuesSql) . " WHERE id = ?");
+ $newValues['id'] = $calendarId;
+ $stmt->execute(array_values($newValues));
+
+ return true;
+
+ }
+
+ /**
+ * Delete a calendar and all it's objects
+ *
+ * @param string $calendarId
+ * @return void
+ */
+ public function deleteCalendar($calendarId) {
+
+ $stmt = $this->pdo->prepare('DELETE FROM '.$this->calendarObjectTableName.' WHERE calendarid = ?');
+ $stmt->execute(array($calendarId));
+
+ $stmt = $this->pdo->prepare('DELETE FROM '.$this->calendarTableName.' WHERE id = ?');
+ $stmt->execute(array($calendarId));
+
+ }
+
+ /**
+ * Returns all calendar objects within a calendar.
+ *
+ * Every item contains an array with the following keys:
+ * * id - unique identifier which will be used for subsequent updates
+ * * calendardata - The iCalendar-compatible calendar data
+ * * uri - a unique key which will be used to construct the uri. This can be any arbitrary string.
+ * * lastmodified - a timestamp of the last modification time
+ * * etag - An arbitrary string, surrounded by double-quotes. (e.g.:
+ * ' "abcdef"')
+ * * calendarid - The calendarid as it was passed to this function.
+ * * size - The size of the calendar objects, in bytes.
+ *
+ * Note that the etag is optional, but it's highly encouraged to return for
+ * speed reasons.
+ *
+ * The calendardata is also optional. If it's not returned
+ * 'getCalendarObject' will be called later, which *is* expected to return
+ * calendardata.
+ *
+ * If neither etag or size are specified, the calendardata will be
+ * used/fetched to determine these numbers. If both are specified the
+ * amount of times this is needed is reduced by a great degree.
+ *
+ * @param string $calendarId
+ * @return array
+ */
+ public function getCalendarObjects($calendarId) {
+
+ $stmt = $this->pdo->prepare('SELECT id, uri, lastmodified, etag, calendarid, size FROM '.$this->calendarObjectTableName.' WHERE calendarid = ?');
+ $stmt->execute(array($calendarId));
+
+ $result = array();
+ foreach($stmt->fetchAll(\PDO::FETCH_ASSOC) as $row) {
+ $result[] = array(
+ 'id' => $row['id'],
+ 'uri' => $row['uri'],
+ 'lastmodified' => $row['lastmodified'],
+ 'etag' => '"' . $row['etag'] . '"',
+ 'calendarid' => $row['calendarid'],
+ 'size' => (int)$row['size'],
+ );
+ }
+
+ return $result;
+
+ }
+
+ /**
+ * Returns information from a single calendar object, based on it's object
+ * uri.
+ *
+ * The returned array must have the same keys as getCalendarObjects. The
+ * 'calendardata' object is required here though, while it's not required
+ * for getCalendarObjects.
+ *
+ * This method must return null if the object did not exist.
+ *
+ * @param string $calendarId
+ * @param string $objectUri
+ * @return array|null
+ */
+ public function getCalendarObject($calendarId,$objectUri) {
+
+ $stmt = $this->pdo->prepare('SELECT id, uri, lastmodified, etag, calendarid, size, calendardata FROM '.$this->calendarObjectTableName.' WHERE calendarid = ? AND uri = ?');
+ $stmt->execute(array($calendarId, $objectUri));
+ $row = $stmt->fetch(\PDO::FETCH_ASSOC);
+
+ if(!$row) return null;
+
+ return array(
+ 'id' => $row['id'],
+ 'uri' => $row['uri'],
+ 'lastmodified' => $row['lastmodified'],
+ 'etag' => '"' . $row['etag'] . '"',
+ 'calendarid' => $row['calendarid'],
+ 'size' => (int)$row['size'],
+ 'calendardata' => $row['calendardata'],
+ );
+
+ }
+
+
+ /**
+ * Creates a new calendar object.
+ *
+ * It is possible return an etag from this function, which will be used in
+ * the response to this PUT request. Note that the ETag must be surrounded
+ * by double-quotes.
+ *
+ * However, you should only really return this ETag if you don't mangle the
+ * calendar-data. If the result of a subsequent GET to this object is not
+ * the exact same as this request body, you should omit the ETag.
+ *
+ * @param mixed $calendarId
+ * @param string $objectUri
+ * @param string $calendarData
+ * @return string|null
+ */
+ public function createCalendarObject($calendarId,$objectUri,$calendarData) {
+
+ $extraData = $this->getDenormalizedData($calendarData);
+
+ $stmt = $this->pdo->prepare('INSERT INTO '.$this->calendarObjectTableName.' (calendarid, uri, calendardata, lastmodified, etag, size, componenttype, firstoccurence, lastoccurence) VALUES (?,?,?,?,?,?,?,?,?)');
+ $stmt->execute(array(
+ $calendarId,
+ $objectUri,
+ $calendarData,
+ time(),
+ $extraData['etag'],
+ $extraData['size'],
+ $extraData['componentType'],
+ $extraData['firstOccurence'],
+ $extraData['lastOccurence'],
+ ));
+ $stmt = $this->pdo->prepare('UPDATE '.$this->calendarTableName.' SET ctag = ctag + 1 WHERE id = ?');
+ $stmt->execute(array($calendarId));
+
+ return '"' . $extraData['etag'] . '"';
+
+ }
+
+ /**
+ * Updates an existing calendarobject, based on it's uri.
+ *
+ * It is possible return an etag from this function, which will be used in
+ * the response to this PUT request. Note that the ETag must be surrounded
+ * by double-quotes.
+ *
+ * However, you should only really return this ETag if you don't mangle the
+ * calendar-data. If the result of a subsequent GET to this object is not
+ * the exact same as this request body, you should omit the ETag.
+ *
+ * @param mixed $calendarId
+ * @param string $objectUri
+ * @param string $calendarData
+ * @return string|null
+ */
+ public function updateCalendarObject($calendarId,$objectUri,$calendarData) {
+
+ $extraData = $this->getDenormalizedData($calendarData);
+
+ $stmt = $this->pdo->prepare('UPDATE '.$this->calendarObjectTableName.' SET calendardata = ?, lastmodified = ?, etag = ?, size = ?, componenttype = ?, firstoccurence = ?, lastoccurence = ? WHERE calendarid = ? AND uri = ?');
+ $stmt->execute(array($calendarData,time(), $extraData['etag'], $extraData['size'], $extraData['componentType'], $extraData['firstOccurence'], $extraData['lastOccurence'] ,$calendarId,$objectUri));
+ $stmt = $this->pdo->prepare('UPDATE '.$this->calendarTableName.' SET ctag = ctag + 1 WHERE id = ?');
+ $stmt->execute(array($calendarId));
+
+ return '"' . $extraData['etag'] . '"';
+
+ }
+
+ /**
+ * Parses some information from calendar objects, used for optimized
+ * calendar-queries.
+ *
+ * Returns an array with the following keys:
+ * * etag
+ * * size
+ * * componentType
+ * * firstOccurence
+ * * lastOccurence
+ *
+ * @param string $calendarData
+ * @return array
+ */
+ protected function getDenormalizedData($calendarData) {
+
+ $vObject = VObject\Reader::read($calendarData);
+ $componentType = null;
+ $component = null;
+ $firstOccurence = null;
+ $lastOccurence = null;
+ foreach($vObject->getComponents() as $component) {
+ if ($component->name!=='VTIMEZONE') {
+ $componentType = $component->name;
+ break;
+ }
+ }
+ if (!$componentType) {
+ throw new \Sabre\DAV\Exception\BadRequest('Calendar objects must have a VJOURNAL, VEVENT or VTODO component');
+ }
+ if ($componentType === 'VEVENT') {
+ $firstOccurence = $component->DTSTART->getDateTime()->getTimeStamp();
+ // Finding the last occurence is a bit harder
+ if (!isset($component->RRULE)) {
+ if (isset($component->DTEND)) {
+ $lastOccurence = $component->DTEND->getDateTime()->getTimeStamp();
+ } elseif (isset($component->DURATION)) {
+ $endDate = clone $component->DTSTART->getDateTime();
+ $endDate->add(VObject\DateTimeParser::parse($component->DURATION->getValue()));
+ $lastOccurence = $endDate->getTimeStamp();
+ } elseif (!$component->DTSTART->hasTime()) {
+ $endDate = clone $component->DTSTART->getDateTime();
+ $endDate->modify('+1 day');
+ $lastOccurence = $endDate->getTimeStamp();
+ } else {
+ $lastOccurence = $firstOccurence;
+ }
+ } else {
+ $it = new VObject\RecurrenceIterator($vObject, (string)$component->UID);
+ $maxDate = new \DateTime(self::MAX_DATE);
+ if ($it->isInfinite()) {
+ $lastOccurence = $maxDate->getTimeStamp();
+ } else {
+ $end = $it->getDtEnd();
+ while($it->valid() && $end < $maxDate) {
+ $end = $it->getDtEnd();
+ $it->next();
+
+ }
+ $lastOccurence = $end->getTimeStamp();
+ }
+
+ }
+ }
+
+ return array(
+ 'etag' => md5($calendarData),
+ 'size' => strlen($calendarData),
+ 'componentType' => $componentType,
+ 'firstOccurence' => $firstOccurence,
+ 'lastOccurence' => $lastOccurence,
+ );
+
+ }
+
+ /**
+ * Deletes an existing calendar object.
+ *
+ * @param string $calendarId
+ * @param string $objectUri
+ * @return void
+ */
+ public function deleteCalendarObject($calendarId,$objectUri) {
+
+ $stmt = $this->pdo->prepare('DELETE FROM '.$this->calendarObjectTableName.' WHERE calendarid = ? AND uri = ?');
+ $stmt->execute(array($calendarId,$objectUri));
+ $stmt = $this->pdo->prepare('UPDATE '. $this->calendarTableName .' SET ctag = ctag + 1 WHERE id = ?');
+ $stmt->execute(array($calendarId));
+
+ }
+
+ /**
+ * Performs a calendar-query on the contents of this calendar.
+ *
+ * The calendar-query is defined in RFC4791 : CalDAV. Using the
+ * calendar-query it is possible for a client to request a specific set of
+ * object, based on contents of iCalendar properties, date-ranges and
+ * iCalendar component types (VTODO, VEVENT).
+ *
+ * This method should just return a list of (relative) urls that match this
+ * query.
+ *
+ * The list of filters are specified as an array. The exact array is
+ * documented by \Sabre\CalDAV\CalendarQueryParser.
+ *
+ * Note that it is extremely likely that getCalendarObject for every path
+ * returned from this method will be called almost immediately after. You
+ * may want to anticipate this to speed up these requests.
+ *
+ * This method provides a default implementation, which parses *all* the
+ * iCalendar objects in the specified calendar.
+ *
+ * This default may well be good enough for personal use, and calendars
+ * that aren't very large. But if you anticipate high usage, big calendars
+ * or high loads, you are strongly adviced to optimize certain paths.
+ *
+ * The best way to do so is override this method and to optimize
+ * specifically for 'common filters'.
+ *
+ * Requests that are extremely common are:
+ * * requests for just VEVENTS
+ * * requests for just VTODO
+ * * requests with a time-range-filter on a VEVENT.
+ *
+ * ..and combinations of these requests. It may not be worth it to try to
+ * handle every possible situation and just rely on the (relatively
+ * easy to use) CalendarQueryValidator to handle the rest.
+ *
+ * Note that especially time-range-filters may be difficult to parse. A
+ * time-range filter specified on a VEVENT must for instance also handle
+ * recurrence rules correctly.
+ * A good example of how to interprete all these filters can also simply
+ * be found in \Sabre\CalDAV\CalendarQueryFilter. This class is as correct
+ * as possible, so it gives you a good idea on what type of stuff you need
+ * to think of.
+ *
+ * This specific implementation (for the PDO) backend optimizes filters on
+ * specific components, and VEVENT time-ranges.
+ *
+ * @param string $calendarId
+ * @param array $filters
+ * @return array
+ */
+ public function calendarQuery($calendarId, array $filters) {
+
+ $result = array();
+ $validator = new \Sabre\CalDAV\CalendarQueryValidator();
+
+ $componentType = null;
+ $requirePostFilter = true;
+ $timeRange = null;
+
+ // if no filters were specified, we don't need to filter after a query
+ if (!$filters['prop-filters'] && !$filters['comp-filters']) {
+ $requirePostFilter = false;
+ }
+
+ // Figuring out if there's a component filter
+ if (count($filters['comp-filters']) > 0 && !$filters['comp-filters'][0]['is-not-defined']) {
+ $componentType = $filters['comp-filters'][0]['name'];
+
+ // Checking if we need post-filters
+ if (!$filters['prop-filters'] && !$filters['comp-filters'][0]['comp-filters'] && !$filters['comp-filters'][0]['time-range'] && !$filters['comp-filters'][0]['prop-filters']) {
+ $requirePostFilter = false;
+ }
+ // There was a time-range filter
+ if ($componentType == 'VEVENT' && isset($filters['comp-filters'][0]['time-range'])) {
+ $timeRange = $filters['comp-filters'][0]['time-range'];
+
+ // If start time OR the end time is not specified, we can do a
+ // 100% accurate mysql query.
+ if (!$filters['prop-filters'] && !$filters['comp-filters'][0]['comp-filters'] && !$filters['comp-filters'][0]['prop-filters'] && (!$timeRange['start'] || !$timeRange['end'])) {
+ $requirePostFilter = false;
+ }
+ }
+
+ }
+
+ if ($requirePostFilter) {
+ $query = "SELECT uri, calendardata FROM ".$this->calendarObjectTableName." WHERE calendarid = :calendarid";
+ } else {
+ $query = "SELECT uri FROM ".$this->calendarObjectTableName." WHERE calendarid = :calendarid";
+ }
+
+ $values = array(
+ 'calendarid' => $calendarId,
+ );
+
+ if ($componentType) {
+ $query.=" AND componenttype = :componenttype";
+ $values['componenttype'] = $componentType;
+ }
+
+ if ($timeRange && $timeRange['start']) {
+ $query.=" AND lastoccurence > :startdate";
+ $values['startdate'] = $timeRange['start']->getTimeStamp();
+ }
+ if ($timeRange && $timeRange['end']) {
+ $query.=" AND firstoccurence < :enddate";
+ $values['enddate'] = $timeRange['end']->getTimeStamp();
+ }
+
+ $stmt = $this->pdo->prepare($query);
+ $stmt->execute($values);
+
+ $result = array();
+ while($row = $stmt->fetch(\PDO::FETCH_ASSOC)) {
+ if ($requirePostFilter) {
+ if (!$this->validateFilterForObject($row, $filters)) {
+ continue;
+ }
+ }
+ $result[] = $row['uri'];
+
+ }
+
+ return $result;
+
+ }
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/Backend/SharingSupport.php b/vendor/sabre/dav/lib/Sabre/CalDAV/Backend/SharingSupport.php
new file mode 100644
index 000000000..8fb2b320c
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/Backend/SharingSupport.php
@@ -0,0 +1,243 @@
+<?php
+
+namespace Sabre\CalDAV\Backend;
+
+/**
+ * Adds support for sharing features to a CalDAV server.
+ *
+ * Note: This feature is experimental, and may change in between different
+ * SabreDAV versions.
+ *
+ * Early warning: Currently SabreDAV provides no implementation for this. This
+ * is, because in it's current state there is no elegant way to do this.
+ * The problem lies in the fact that a real CalDAV server with sharing support
+ * would first need email support (with invite notifications), and really also
+ * a browser-frontend that allows people to accept or reject these shares.
+ *
+ * In addition, the CalDAV backends are currently kept as independent as
+ * possible, and should not be aware of principals, email addresses or
+ * accounts.
+ *
+ * Adding an implementation for Sharing to standard-sabredav would contradict
+ * these goals, so for this reason this is currently not implemented, although
+ * it may very well in the future; but probably not before SabreDAV 2.0.
+ *
+ * The interface works however, so if you implement all this, and do it
+ * correctly sharing _will_ work. It's not particularly easy, and I _urge you_
+ * to make yourself acquainted with the following document first:
+ *
+ * https://trac.calendarserver.org/browser/CalendarServer/trunk/doc/Extensions/caldav-sharing.txt
+ *
+ * An overview
+ * ===========
+ *
+ * Implementing this interface will allow a user to share his or her calendars
+ * to other users. Effectively, when a calendar is shared the calendar will
+ * show up in both the Sharer's and Sharee's calendar-home root.
+ * This interface adds a few methods that ensure that this happens, and there
+ * are also a number of new requirements in the base-class you must now follow.
+ *
+ *
+ * How it works
+ * ============
+ *
+ * When a user shares a calendar, the updateShares() method will be called with
+ * a list of sharees that are now added, and a list of sharees that have been
+ * removed.
+ * Removal is instant, but when a sharee is added the sharee first gets a
+ * chance to accept or reject the invitation for a share.
+ *
+ * After a share is accepted, the calendar will be returned from
+ * getUserCalendars for both the sharer, and the sharee.
+ *
+ * If the sharee deletes the calendar, only their share gets deleted. When the
+ * owner deletes a calendar, it will be removed for everybody.
+ *
+ *
+ * Notifications
+ * =============
+ *
+ * During all these sharing operations, a lot of notifications are sent back
+ * and forward.
+ *
+ * Whenever the list of sharees for a calendar has been changed (they have been
+ * added, removed or modified) all sharees should get a notification for this
+ * change.
+ * This notification is always represented by:
+ *
+ * Sabre\CalDAV\Notifications\Notification\Invite
+ *
+ * In the case of an invite, the sharee may reply with an 'accept' or
+ * 'decline'. These are always represented by:
+ *
+ * Sabre\CalDAV\Notifications\Notification\Invite
+ *
+ *
+ * Calendar access by sharees
+ * ==========================
+ *
+ * As mentioned earlier, shared calendars must now also be returned for
+ * getCalendarsForUser for sharees. A few things change though.
+ *
+ * The following properties must be specified:
+ *
+ * 1. {http://calendarserver.org/ns/}shared-url
+ *
+ * This property MUST contain the url to the original calendar, that is.. the
+ * path to the calendar from the owner.
+ *
+ * 2. {http://sabredav.org/ns}owner-principal
+ *
+ * This is a url to to the principal who is sharing the calendar.
+ *
+ * 3. {http://sabredav.org/ns}read-only
+ *
+ * This should be either 0 or 1, depending on if the user has read-only or
+ * read-write access to the calendar.
+ *
+ * Only when this is done, the calendar will correctly be marked as a calendar
+ * that's shared to him, thus allowing clients to display the correct interface
+ * and ACL enforcement.
+ *
+ * If a sharee deletes their calendar, only their instance of the calendar
+ * should be deleted, the original should still exists.
+ * Pretty much any 'dead' WebDAV properties on these shared calendars should be
+ * specific to a user. This means that if the displayname is changed by a
+ * sharee, the original is not affected. This is also true for:
+ * * The description
+ * * The color
+ * * The order
+ * * And any other dead properties.
+ *
+ * Properties like a ctag should not be different for multiple instances of the
+ * calendar.
+ *
+ * Lastly, objects *within* calendars should also have user-specific data. The
+ * two things that are user-specific are:
+ * * VALARM objects
+ * * The TRANSP property
+ *
+ * This _also_ implies that if a VALARM is deleted by a sharee for some event,
+ * this has no effect on the original VALARM.
+ *
+ * Understandably, the this last requirement is one of the hardest.
+ * Realisticly, I can see people ignoring this part of the spec, but that could
+ * cause a different set of issues.
+ *
+ *
+ * Publishing
+ * ==========
+ *
+ * When a user publishes a url, the server should generate a 'publish url'.
+ * This is a read-only url, anybody can use to consume the calendar feed.
+ *
+ * Calendars are in one of two states:
+ * * published
+ * * unpublished
+ *
+ * If a calendar is published, the following property should be returned
+ * for each calendar in getCalendarsForPrincipal.
+ *
+ * {http://calendarserver.org/ns/}publish-url
+ *
+ * This element should contain a {DAV:}href element, which points to the
+ * public url that does not require authentication. Unlike every other href,
+ * this url must be absolute.
+ *
+ * Ideally, the following property is always returned
+ *
+ * {http://calendarserver.org/ns/}pre-publish-url
+ *
+ * This property should contain the url that the calendar _would_ have, if it
+ * were to be published. iCal uses this to display the url, before the user
+ * will actually publish it.
+ *
+ *
+ * Selectively disabling publish or share feature
+ * ==============================================
+ *
+ * If Sabre\CalDAV\Property\AllowedSharingModes is returned from
+ * getCalendarsByUser, this allows the server to specify whether either sharing,
+ * or publishing is supported.
+ *
+ * This allows a client to determine in advance which features are available,
+ * and update the interface appropriately. If this property is not returned by
+ * the backend, the SharingPlugin automatically injects it and assumes both
+ * features are available.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+interface SharingSupport extends NotificationSupport {
+
+ /**
+ * Updates the list of shares.
+ *
+ * The first array is a list of people that are to be added to the
+ * calendar.
+ *
+ * Every element in the add array has the following properties:
+ * * href - A url. Usually a mailto: address
+ * * commonName - Usually a first and last name, or false
+ * * summary - A description of the share, can also be false
+ * * readOnly - A boolean value
+ *
+ * Every element in the remove array is just the address string.
+ *
+ * Note that if the calendar is currently marked as 'not shared' by and
+ * this method is called, the calendar should be 'upgraded' to a shared
+ * calendar.
+ *
+ * @param mixed $calendarId
+ * @param array $add
+ * @param array $remove
+ * @return void
+ */
+ function updateShares($calendarId, array $add, array $remove);
+
+ /**
+ * Returns the list of people whom this calendar is shared with.
+ *
+ * Every element in this array should have the following properties:
+ * * href - Often a mailto: address
+ * * commonName - Optional, for example a first + last name
+ * * status - See the Sabre\CalDAV\SharingPlugin::STATUS_ constants.
+ * * readOnly - boolean
+ * * summary - Optional, a description for the share
+ *
+ * This method may be called by either the original instance of the
+ * calendar, as well as the shared instances. In the case of the shared
+ * instances, it is perfectly acceptable to return an empty array in case
+ * there are privacy concerns.
+ *
+ * @param mixed $calendarId
+ * @return array
+ */
+ function getShares($calendarId);
+
+ /**
+ * This method is called when a user replied to a request to share.
+ *
+ * If the user chose to accept the share, this method should return the
+ * newly created calendar url.
+ *
+ * @param string href The sharee who is replying (often a mailto: address)
+ * @param int status One of the SharingPlugin::STATUS_* constants
+ * @param string $calendarUri The url to the calendar thats being shared
+ * @param string $inReplyTo The unique id this message is a response to
+ * @param string $summary A description of the reply
+ * @return null|string
+ */
+ function shareReply($href, $status, $calendarUri, $inReplyTo, $summary = null);
+
+ /**
+ * Publishes a calendar
+ *
+ * @param mixed $calendarId
+ * @param bool $value
+ * @return void
+ */
+ function setPublishStatus($calendarId, $value);
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/Calendar.php b/vendor/sabre/dav/lib/Sabre/CalDAV/Calendar.php
new file mode 100644
index 000000000..63bd2b07a
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/Calendar.php
@@ -0,0 +1,376 @@
+<?php
+
+namespace Sabre\CalDAV;
+
+use Sabre\DAV;
+use Sabre\DAVACL;
+
+/**
+ * This object represents a CalDAV calendar.
+ *
+ * A calendar can contain multiple TODO and or Events. These are represented
+ * as \Sabre\CalDAV\CalendarObject objects.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Calendar implements ICalendar, DAV\IProperties, DAVACL\IACL {
+
+ /**
+ * This is an array with calendar information
+ *
+ * @var array
+ */
+ protected $calendarInfo;
+
+ /**
+ * CalDAV backend
+ *
+ * @var Backend\BackendInterface
+ */
+ protected $caldavBackend;
+
+ /**
+ * Constructor
+ *
+ * @param Backend\BackendInterface $caldavBackend
+ * @param array $calendarInfo
+ */
+ public function __construct(Backend\BackendInterface $caldavBackend, $calendarInfo) {
+
+ $this->caldavBackend = $caldavBackend;
+ $this->calendarInfo = $calendarInfo;
+
+ }
+
+ /**
+ * Returns the name of the calendar
+ *
+ * @return string
+ */
+ public function getName() {
+
+ return $this->calendarInfo['uri'];
+
+ }
+
+ /**
+ * Updates properties such as the display name and description
+ *
+ * @param array $mutations
+ * @return array
+ */
+ public function updateProperties($mutations) {
+
+ return $this->caldavBackend->updateCalendar($this->calendarInfo['id'],$mutations);
+
+ }
+
+ /**
+ * Returns the list of properties
+ *
+ * @param array $requestedProperties
+ * @return array
+ */
+ public function getProperties($requestedProperties) {
+
+ $response = array();
+
+ foreach($requestedProperties as $prop) switch($prop) {
+
+ case '{urn:ietf:params:xml:ns:caldav}supported-calendar-data' :
+ $response[$prop] = new Property\SupportedCalendarData();
+ break;
+ case '{urn:ietf:params:xml:ns:caldav}supported-collation-set' :
+ $response[$prop] = new Property\SupportedCollationSet();
+ break;
+ case '{DAV:}owner' :
+ $response[$prop] = new DAVACL\Property\Principal(DAVACL\Property\Principal::HREF,$this->calendarInfo['principaluri']);
+ break;
+ default :
+ if (isset($this->calendarInfo[$prop])) $response[$prop] = $this->calendarInfo[$prop];
+ break;
+
+ }
+ return $response;
+
+ }
+
+ /**
+ * Returns a calendar object
+ *
+ * The contained calendar objects are for example Events or Todo's.
+ *
+ * @param string $name
+ * @return \Sabre\CalDAV\ICalendarObject
+ */
+ public function getChild($name) {
+
+ $obj = $this->caldavBackend->getCalendarObject($this->calendarInfo['id'],$name);
+
+ if (!$obj) throw new DAV\Exception\NotFound('Calendar object not found');
+
+ $obj['acl'] = $this->getACL();
+ // Removing the irrelivant
+ foreach($obj['acl'] as $key=>$acl) {
+ if ($acl['privilege'] === '{' . Plugin::NS_CALDAV . '}read-free-busy') {
+ unset($obj['acl'][$key]);
+ }
+ }
+
+ return new CalendarObject($this->caldavBackend,$this->calendarInfo,$obj);
+
+ }
+
+ /**
+ * Returns the full list of calendar objects
+ *
+ * @return array
+ */
+ public function getChildren() {
+
+ $objs = $this->caldavBackend->getCalendarObjects($this->calendarInfo['id']);
+ $children = array();
+ foreach($objs as $obj) {
+ $obj['acl'] = $this->getACL();
+ // Removing the irrelivant
+ foreach($obj['acl'] as $key=>$acl) {
+ if ($acl['privilege'] === '{' . Plugin::NS_CALDAV . '}read-free-busy') {
+ unset($obj['acl'][$key]);
+ }
+ }
+ $children[] = new CalendarObject($this->caldavBackend,$this->calendarInfo,$obj);
+ }
+ return $children;
+
+ }
+
+ /**
+ * Checks if a child-node exists.
+ *
+ * @param string $name
+ * @return bool
+ */
+ public function childExists($name) {
+
+ $obj = $this->caldavBackend->getCalendarObject($this->calendarInfo['id'],$name);
+ if (!$obj)
+ return false;
+ else
+ return true;
+
+ }
+
+ /**
+ * Creates a new directory
+ *
+ * We actually block this, as subdirectories are not allowed in calendars.
+ *
+ * @param string $name
+ * @return void
+ */
+ public function createDirectory($name) {
+
+ throw new DAV\Exception\MethodNotAllowed('Creating collections in calendar objects is not allowed');
+
+ }
+
+ /**
+ * Creates a new file
+ *
+ * The contents of the new file must be a valid ICalendar string.
+ *
+ * @param string $name
+ * @param resource $calendarData
+ * @return string|null
+ */
+ public function createFile($name,$calendarData = null) {
+
+ if (is_resource($calendarData)) {
+ $calendarData = stream_get_contents($calendarData);
+ }
+ return $this->caldavBackend->createCalendarObject($this->calendarInfo['id'],$name,$calendarData);
+
+ }
+
+ /**
+ * Deletes the calendar.
+ *
+ * @return void
+ */
+ public function delete() {
+
+ $this->caldavBackend->deleteCalendar($this->calendarInfo['id']);
+
+ }
+
+ /**
+ * Renames the calendar. Note that most calendars use the
+ * {DAV:}displayname to display a name to display a name.
+ *
+ * @param string $newName
+ * @return void
+ */
+ public function setName($newName) {
+
+ throw new DAV\Exception\MethodNotAllowed('Renaming calendars is not yet supported');
+
+ }
+
+ /**
+ * Returns the last modification date as a unix timestamp.
+ *
+ * @return void
+ */
+ public function getLastModified() {
+
+ return null;
+
+ }
+
+ /**
+ * Returns the owner principal
+ *
+ * This must be a url to a principal, or null if there's no owner
+ *
+ * @return string|null
+ */
+ public function getOwner() {
+
+ return $this->calendarInfo['principaluri'];
+
+ }
+
+ /**
+ * Returns a group principal
+ *
+ * This must be a url to a principal, or null if there's no owner
+ *
+ * @return string|null
+ */
+ public function getGroup() {
+
+ return null;
+
+ }
+
+ /**
+ * Returns a list of ACE's for this node.
+ *
+ * Each ACE has the following properties:
+ * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are
+ * currently the only supported privileges
+ * * 'principal', a url to the principal who owns the node
+ * * 'protected' (optional), indicating that this ACE is not allowed to
+ * be updated.
+ *
+ * @return array
+ */
+ public function getACL() {
+
+ return array(
+ array(
+ 'privilege' => '{DAV:}read',
+ 'principal' => $this->getOwner(),
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}write',
+ 'principal' => $this->getOwner(),
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}read',
+ 'principal' => $this->getOwner() . '/calendar-proxy-write',
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}write',
+ 'principal' => $this->getOwner() . '/calendar-proxy-write',
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}read',
+ 'principal' => $this->getOwner() . '/calendar-proxy-read',
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{' . Plugin::NS_CALDAV . '}read-free-busy',
+ 'principal' => '{DAV:}authenticated',
+ 'protected' => true,
+ ),
+
+ );
+
+ }
+
+ /**
+ * Updates the ACL
+ *
+ * This method will receive a list of new ACE's.
+ *
+ * @param array $acl
+ * @return void
+ */
+ public function setACL(array $acl) {
+
+ throw new DAV\Exception\MethodNotAllowed('Changing ACL is not yet supported');
+
+ }
+
+ /**
+ * Returns the list of supported privileges for this node.
+ *
+ * The returned data structure is a list of nested privileges.
+ * See \Sabre\DAVACL\Plugin::getDefaultSupportedPrivilegeSet for a simple
+ * standard structure.
+ *
+ * If null is returned from this method, the default privilege set is used,
+ * which is fine for most common usecases.
+ *
+ * @return array|null
+ */
+ public function getSupportedPrivilegeSet() {
+
+ $default = DAVACL\Plugin::getDefaultSupportedPrivilegeSet();
+
+ // We need to inject 'read-free-busy' in the tree, aggregated under
+ // {DAV:}read.
+ foreach($default['aggregates'] as &$agg) {
+
+ if ($agg['privilege'] !== '{DAV:}read') continue;
+
+ $agg['aggregates'][] = array(
+ 'privilege' => '{' . Plugin::NS_CALDAV . '}read-free-busy',
+ );
+
+ }
+ return $default;
+
+ }
+
+ /**
+ * Performs a calendar-query on the contents of this calendar.
+ *
+ * The calendar-query is defined in RFC4791 : CalDAV. Using the
+ * calendar-query it is possible for a client to request a specific set of
+ * object, based on contents of iCalendar properties, date-ranges and
+ * iCalendar component types (VTODO, VEVENT).
+ *
+ * This method should just return a list of (relative) urls that match this
+ * query.
+ *
+ * The list of filters are specified as an array. The exact array is
+ * documented by Sabre\CalDAV\CalendarQueryParser.
+ *
+ * @param array $filters
+ * @return array
+ */
+ public function calendarQuery(array $filters) {
+
+ return $this->caldavBackend->calendarQuery($this->calendarInfo['id'], $filters);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/CalendarObject.php b/vendor/sabre/dav/lib/Sabre/CalDAV/CalendarObject.php
new file mode 100644
index 000000000..1fbb51b79
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/CalendarObject.php
@@ -0,0 +1,279 @@
+<?php
+
+namespace Sabre\CalDAV;
+
+/**
+ * The CalendarObject represents a single VEVENT or VTODO within a Calendar.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class CalendarObject extends \Sabre\DAV\File implements ICalendarObject, \Sabre\DAVACL\IACL {
+
+ /**
+ * Sabre\CalDAV\Backend\BackendInterface
+ *
+ * @var Sabre\CalDAV\Backend\AbstractBackend
+ */
+ protected $caldavBackend;
+
+ /**
+ * Array with information about this CalendarObject
+ *
+ * @var array
+ */
+ protected $objectData;
+
+ /**
+ * Array with information about the containing calendar
+ *
+ * @var array
+ */
+ protected $calendarInfo;
+
+ /**
+ * Constructor
+ *
+ * @param Backend\BackendInterface $caldavBackend
+ * @param array $calendarInfo
+ * @param array $objectData
+ */
+ public function __construct(Backend\BackendInterface $caldavBackend,array $calendarInfo,array $objectData) {
+
+ $this->caldavBackend = $caldavBackend;
+
+ if (!isset($objectData['calendarid'])) {
+ throw new \InvalidArgumentException('The objectData argument must contain a \'calendarid\' property');
+ }
+ if (!isset($objectData['uri'])) {
+ throw new \InvalidArgumentException('The objectData argument must contain an \'uri\' property');
+ }
+
+ $this->calendarInfo = $calendarInfo;
+ $this->objectData = $objectData;
+
+ }
+
+ /**
+ * Returns the uri for this object
+ *
+ * @return string
+ */
+ public function getName() {
+
+ return $this->objectData['uri'];
+
+ }
+
+ /**
+ * Returns the ICalendar-formatted object
+ *
+ * @return string
+ */
+ public function get() {
+
+ // Pre-populating the 'calendardata' is optional, if we don't have it
+ // already we fetch it from the backend.
+ if (!isset($this->objectData['calendardata'])) {
+ $this->objectData = $this->caldavBackend->getCalendarObject($this->objectData['calendarid'], $this->objectData['uri']);
+ }
+ return $this->objectData['calendardata'];
+
+ }
+
+ /**
+ * Updates the ICalendar-formatted object
+ *
+ * @param string|resource $calendarData
+ * @return string
+ */
+ public function put($calendarData) {
+
+ if (is_resource($calendarData)) {
+ $calendarData = stream_get_contents($calendarData);
+ }
+ $etag = $this->caldavBackend->updateCalendarObject($this->calendarInfo['id'],$this->objectData['uri'],$calendarData);
+ $this->objectData['calendardata'] = $calendarData;
+ $this->objectData['etag'] = $etag;
+
+ return $etag;
+
+ }
+
+ /**
+ * Deletes the calendar object
+ *
+ * @return void
+ */
+ public function delete() {
+
+ $this->caldavBackend->deleteCalendarObject($this->calendarInfo['id'],$this->objectData['uri']);
+
+ }
+
+ /**
+ * Returns the mime content-type
+ *
+ * @return string
+ */
+ public function getContentType() {
+
+ return 'text/calendar; charset=utf-8';
+
+ }
+
+ /**
+ * Returns an ETag for this object.
+ *
+ * The ETag is an arbitrary string, but MUST be surrounded by double-quotes.
+ *
+ * @return string
+ */
+ public function getETag() {
+
+ if (isset($this->objectData['etag'])) {
+ return $this->objectData['etag'];
+ } else {
+ return '"' . md5($this->get()). '"';
+ }
+
+ }
+
+ /**
+ * Returns the last modification date as a unix timestamp
+ *
+ * @return int
+ */
+ public function getLastModified() {
+
+ return $this->objectData['lastmodified'];
+
+ }
+
+ /**
+ * Returns the size of this object in bytes
+ *
+ * @return int
+ */
+ public function getSize() {
+
+ if (array_key_exists('size',$this->objectData)) {
+ return $this->objectData['size'];
+ } else {
+ return strlen($this->get());
+ }
+
+ }
+
+ /**
+ * Returns the owner principal
+ *
+ * This must be a url to a principal, or null if there's no owner
+ *
+ * @return string|null
+ */
+ public function getOwner() {
+
+ return $this->calendarInfo['principaluri'];
+
+ }
+
+ /**
+ * Returns a group principal
+ *
+ * This must be a url to a principal, or null if there's no owner
+ *
+ * @return string|null
+ */
+ public function getGroup() {
+
+ return null;
+
+ }
+
+ /**
+ * Returns a list of ACE's for this node.
+ *
+ * Each ACE has the following properties:
+ * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are
+ * currently the only supported privileges
+ * * 'principal', a url to the principal who owns the node
+ * * 'protected' (optional), indicating that this ACE is not allowed to
+ * be updated.
+ *
+ * @return array
+ */
+ public function getACL() {
+
+ // An alternative acl may be specified in the object data.
+ if (isset($this->objectData['acl'])) {
+ return $this->objectData['acl'];
+ }
+
+ // The default ACL
+ return array(
+ array(
+ 'privilege' => '{DAV:}read',
+ 'principal' => $this->calendarInfo['principaluri'],
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}write',
+ 'principal' => $this->calendarInfo['principaluri'],
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}read',
+ 'principal' => $this->calendarInfo['principaluri'] . '/calendar-proxy-write',
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}write',
+ 'principal' => $this->calendarInfo['principaluri'] . '/calendar-proxy-write',
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}read',
+ 'principal' => $this->calendarInfo['principaluri'] . '/calendar-proxy-read',
+ 'protected' => true,
+ ),
+
+ );
+
+ }
+
+ /**
+ * Updates the ACL
+ *
+ * This method will receive a list of new ACE's.
+ *
+ * @param array $acl
+ * @return void
+ */
+ public function setACL(array $acl) {
+
+ throw new \Sabre\DAV\Exception\MethodNotAllowed('Changing ACL is not yet supported');
+
+ }
+
+ /**
+ * Returns the list of supported privileges for this node.
+ *
+ * The returned data structure is a list of nested privileges.
+ * See \Sabre\DAVACL\Plugin::getDefaultSupportedPrivilegeSet for a simple
+ * standard structure.
+ *
+ * If null is returned from this method, the default privilege set is used,
+ * which is fine for most common usecases.
+ *
+ * @return array|null
+ */
+ public function getSupportedPrivilegeSet() {
+
+ return null;
+
+ }
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/CalendarQueryParser.php b/vendor/sabre/dav/lib/Sabre/CalDAV/CalendarQueryParser.php
new file mode 100644
index 000000000..c894a066e
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/CalendarQueryParser.php
@@ -0,0 +1,298 @@
+<?php
+
+namespace Sabre\CalDAV;
+
+use Sabre\VObject;
+
+/**
+ * Parses the calendar-query report request body.
+ *
+ * Whoever designed this format, and the CalDAV equivalent even more so,
+ * has no feel for design.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class CalendarQueryParser {
+
+ /**
+ * List of requested properties the client wanted
+ *
+ * @var array
+ */
+ public $requestedProperties;
+
+ /**
+ * List of property/component filters.
+ *
+ * @var array
+ */
+ public $filters;
+
+ /**
+ * This property will contain null if CALDAV:expand was not specified,
+ * otherwise it will contain an array with 2 elements (start, end). Each
+ * contain a DateTime object.
+ *
+ * If expand is specified, recurring calendar objects are to be expanded
+ * into their individual components, and only the components that fall
+ * within the specified time-range are to be returned.
+ *
+ * For more details, see rfc4791, section 9.6.5.
+ *
+ * @var null|array
+ */
+ public $expand;
+
+ /**
+ * DOM Document
+ *
+ * @var DOMDocument
+ */
+ protected $dom;
+
+ /**
+ * DOM XPath object
+ *
+ * @var DOMXPath
+ */
+ protected $xpath;
+
+ /**
+ * Creates the parser
+ *
+ * @param \DOMDocument $dom
+ */
+ public function __construct(\DOMDocument $dom) {
+
+ $this->dom = $dom;
+ $this->xpath = new \DOMXPath($dom);
+ $this->xpath->registerNameSpace('cal',Plugin::NS_CALDAV);
+ $this->xpath->registerNameSpace('dav','urn:DAV');
+
+ }
+
+ /**
+ * Parses the request.
+ *
+ * @return void
+ */
+ public function parse() {
+
+ $filterNode = null;
+
+ $filter = $this->xpath->query('/cal:calendar-query/cal:filter');
+ if ($filter->length !== 1) {
+ throw new \Sabre\DAV\Exception\BadRequest('Only one filter element is allowed');
+ }
+
+ $compFilters = $this->parseCompFilters($filter->item(0));
+ if (count($compFilters)!==1) {
+ throw new \Sabre\DAV\Exception\BadRequest('There must be exactly 1 top-level comp-filter.');
+ }
+
+ $this->filters = $compFilters[0];
+ $this->requestedProperties = array_keys(\Sabre\DAV\XMLUtil::parseProperties($this->dom->firstChild));
+
+ $expand = $this->xpath->query('/cal:calendar-query/dav:prop/cal:calendar-data/cal:expand');
+ if ($expand->length>0) {
+ $this->expand = $this->parseExpand($expand->item(0));
+ }
+
+
+ }
+
+ /**
+ * Parses all the 'comp-filter' elements from a node
+ *
+ * @param \DOMElement $parentNode
+ * @return array
+ */
+ protected function parseCompFilters(\DOMElement $parentNode) {
+
+ $compFilterNodes = $this->xpath->query('cal:comp-filter', $parentNode);
+ $result = array();
+
+ for($ii=0; $ii < $compFilterNodes->length; $ii++) {
+
+ $compFilterNode = $compFilterNodes->item($ii);
+
+ $compFilter = array();
+ $compFilter['name'] = $compFilterNode->getAttribute('name');
+ $compFilter['is-not-defined'] = $this->xpath->query('cal:is-not-defined', $compFilterNode)->length>0;
+ $compFilter['comp-filters'] = $this->parseCompFilters($compFilterNode);
+ $compFilter['prop-filters'] = $this->parsePropFilters($compFilterNode);
+ $compFilter['time-range'] = $this->parseTimeRange($compFilterNode);
+
+ if ($compFilter['time-range'] && !in_array($compFilter['name'],array(
+ 'VEVENT',
+ 'VTODO',
+ 'VJOURNAL',
+ 'VFREEBUSY',
+ 'VALARM',
+ ))) {
+ throw new \Sabre\DAV\Exception\BadRequest('The time-range filter is not defined for the ' . $compFilter['name'] . ' component');
+ };
+
+ $result[] = $compFilter;
+
+ }
+
+ return $result;
+
+ }
+
+ /**
+ * Parses all the prop-filter elements from a node
+ *
+ * @param \DOMElement $parentNode
+ * @return array
+ */
+ protected function parsePropFilters(\DOMElement $parentNode) {
+
+ $propFilterNodes = $this->xpath->query('cal:prop-filter', $parentNode);
+ $result = array();
+
+ for ($ii=0; $ii < $propFilterNodes->length; $ii++) {
+
+ $propFilterNode = $propFilterNodes->item($ii);
+ $propFilter = array();
+ $propFilter['name'] = $propFilterNode->getAttribute('name');
+ $propFilter['is-not-defined'] = $this->xpath->query('cal:is-not-defined', $propFilterNode)->length>0;
+ $propFilter['param-filters'] = $this->parseParamFilters($propFilterNode);
+ $propFilter['text-match'] = $this->parseTextMatch($propFilterNode);
+ $propFilter['time-range'] = $this->parseTimeRange($propFilterNode);
+
+ $result[] = $propFilter;
+
+ }
+
+ return $result;
+
+ }
+
+ /**
+ * Parses the param-filter element
+ *
+ * @param \DOMElement $parentNode
+ * @return array
+ */
+ protected function parseParamFilters(\DOMElement $parentNode) {
+
+ $paramFilterNodes = $this->xpath->query('cal:param-filter', $parentNode);
+ $result = array();
+
+ for($ii=0;$ii<$paramFilterNodes->length;$ii++) {
+
+ $paramFilterNode = $paramFilterNodes->item($ii);
+ $paramFilter = array();
+ $paramFilter['name'] = $paramFilterNode->getAttribute('name');
+ $paramFilter['is-not-defined'] = $this->xpath->query('cal:is-not-defined', $paramFilterNode)->length>0;
+ $paramFilter['text-match'] = $this->parseTextMatch($paramFilterNode);
+
+ $result[] = $paramFilter;
+
+ }
+
+ return $result;
+
+ }
+
+ /**
+ * Parses the text-match element
+ *
+ * @param \DOMElement $parentNode
+ * @return array|null
+ */
+ protected function parseTextMatch(\DOMElement $parentNode) {
+
+ $textMatchNodes = $this->xpath->query('cal:text-match', $parentNode);
+
+ if ($textMatchNodes->length === 0)
+ return null;
+
+ $textMatchNode = $textMatchNodes->item(0);
+ $negateCondition = $textMatchNode->getAttribute('negate-condition');
+ $negateCondition = $negateCondition==='yes';
+ $collation = $textMatchNode->getAttribute('collation');
+ if (!$collation) $collation = 'i;ascii-casemap';
+
+ return array(
+ 'negate-condition' => $negateCondition,
+ 'collation' => $collation,
+ 'value' => $textMatchNode->nodeValue
+ );
+
+ }
+
+ /**
+ * Parses the time-range element
+ *
+ * @param \DOMElement $parentNode
+ * @return array|null
+ */
+ protected function parseTimeRange(\DOMElement $parentNode) {
+
+ $timeRangeNodes = $this->xpath->query('cal:time-range', $parentNode);
+ if ($timeRangeNodes->length === 0) {
+ return null;
+ }
+
+ $timeRangeNode = $timeRangeNodes->item(0);
+
+ if ($start = $timeRangeNode->getAttribute('start')) {
+ $start = VObject\DateTimeParser::parseDateTime($start);
+ } else {
+ $start = null;
+ }
+ if ($end = $timeRangeNode->getAttribute('end')) {
+ $end = VObject\DateTimeParser::parseDateTime($end);
+ } else {
+ $end = null;
+ }
+
+ if (!is_null($start) && !is_null($end) && $end <= $start) {
+ throw new \Sabre\DAV\Exception\BadRequest('The end-date must be larger than the start-date in the time-range filter');
+ }
+
+ return array(
+ 'start' => $start,
+ 'end' => $end,
+ );
+
+ }
+
+ /**
+ * Parses the CALDAV:expand element
+ *
+ * @param \DOMElement $parentNode
+ * @return void
+ */
+ protected function parseExpand(\DOMElement $parentNode) {
+
+ $start = $parentNode->getAttribute('start');
+ if(!$start) {
+ throw new \Sabre\DAV\Exception\BadRequest('The "start" attribute is required for the CALDAV:expand element');
+ }
+ $start = VObject\DateTimeParser::parseDateTime($start);
+
+ $end = $parentNode->getAttribute('end');
+ if(!$end) {
+ throw new \Sabre\DAV\Exception\BadRequest('The "end" attribute is required for the CALDAV:expand element');
+ }
+
+ $end = VObject\DateTimeParser::parseDateTime($end);
+
+ if ($end <= $start) {
+ throw new \Sabre\DAV\Exception\BadRequest('The end-date must be larger than the start-date in the expand element.');
+ }
+
+ return array(
+ 'start' => $start,
+ 'end' => $end,
+ );
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/CalendarQueryValidator.php b/vendor/sabre/dav/lib/Sabre/CalDAV/CalendarQueryValidator.php
new file mode 100644
index 000000000..fd47127f2
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/CalendarQueryValidator.php
@@ -0,0 +1,392 @@
+<?php
+
+namespace Sabre\CalDAV;
+
+use Sabre\VObject;
+use DateTime;
+
+/**
+ * CalendarQuery Validator
+ *
+ * This class is responsible for checking if an iCalendar object matches a set
+ * of filters. The main function to do this is 'validate'.
+ *
+ * This is used to determine which icalendar objects should be returned for a
+ * calendar-query REPORT request.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class CalendarQueryValidator {
+
+ /**
+ * Verify if a list of filters applies to the calendar data object
+ *
+ * The list of filters must be formatted as parsed by \Sabre\CalDAV\CalendarQueryParser
+ *
+ * @param VObject\Component $vObject
+ * @param array $filters
+ * @return bool
+ */
+ public function validate(VObject\Component $vObject,array $filters) {
+
+ // The top level object is always a component filter.
+ // We'll parse it manually, as it's pretty simple.
+ if ($vObject->name !== $filters['name']) {
+ return false;
+ }
+
+ return
+ $this->validateCompFilters($vObject, $filters['comp-filters']) &&
+ $this->validatePropFilters($vObject, $filters['prop-filters']);
+
+
+ }
+
+ /**
+ * This method checks the validity of comp-filters.
+ *
+ * A list of comp-filters needs to be specified. Also the parent of the
+ * component we're checking should be specified, not the component to check
+ * itself.
+ *
+ * @param VObject\Component $parent
+ * @param array $filters
+ * @return bool
+ */
+ protected function validateCompFilters(VObject\Component $parent, array $filters) {
+
+ foreach($filters as $filter) {
+
+ $isDefined = isset($parent->$filter['name']);
+
+ if ($filter['is-not-defined']) {
+
+ if ($isDefined) {
+ return false;
+ } else {
+ continue;
+ }
+
+ }
+ if (!$isDefined) {
+ return false;
+ }
+
+ if ($filter['time-range']) {
+ foreach($parent->$filter['name'] as $subComponent) {
+ if ($this->validateTimeRange($subComponent, $filter['time-range']['start'], $filter['time-range']['end'])) {
+ continue 2;
+ }
+ }
+ return false;
+ }
+
+ if (!$filter['comp-filters'] && !$filter['prop-filters']) {
+ continue;
+ }
+
+ // If there are sub-filters, we need to find at least one component
+ // for which the subfilters hold true.
+ foreach($parent->$filter['name'] as $subComponent) {
+
+ if (
+ $this->validateCompFilters($subComponent, $filter['comp-filters']) &&
+ $this->validatePropFilters($subComponent, $filter['prop-filters'])) {
+ // We had a match, so this comp-filter succeeds
+ continue 2;
+ }
+
+ }
+
+ // If we got here it means there were sub-comp-filters or
+ // sub-prop-filters and there was no match. This means this filter
+ // needs to return false.
+ return false;
+
+ }
+
+ // If we got here it means we got through all comp-filters alive so the
+ // filters were all true.
+ return true;
+
+ }
+
+ /**
+ * This method checks the validity of prop-filters.
+ *
+ * A list of prop-filters needs to be specified. Also the parent of the
+ * property we're checking should be specified, not the property to check
+ * itself.
+ *
+ * @param VObject\Component $parent
+ * @param array $filters
+ * @return bool
+ */
+ protected function validatePropFilters(VObject\Component $parent, array $filters) {
+
+ foreach($filters as $filter) {
+
+ $isDefined = isset($parent->$filter['name']);
+
+ if ($filter['is-not-defined']) {
+
+ if ($isDefined) {
+ return false;
+ } else {
+ continue;
+ }
+
+ }
+ if (!$isDefined) {
+ return false;
+ }
+
+ if ($filter['time-range']) {
+ foreach($parent->$filter['name'] as $subComponent) {
+ if ($this->validateTimeRange($subComponent, $filter['time-range']['start'], $filter['time-range']['end'])) {
+ continue 2;
+ }
+ }
+ return false;
+ }
+
+ if (!$filter['param-filters'] && !$filter['text-match']) {
+ continue;
+ }
+
+ // If there are sub-filters, we need to find at least one property
+ // for which the subfilters hold true.
+ foreach($parent->$filter['name'] as $subComponent) {
+
+ if(
+ $this->validateParamFilters($subComponent, $filter['param-filters']) &&
+ (!$filter['text-match'] || $this->validateTextMatch($subComponent, $filter['text-match']))
+ ) {
+ // We had a match, so this prop-filter succeeds
+ continue 2;
+ }
+
+ }
+
+ // If we got here it means there were sub-param-filters or
+ // text-match filters and there was no match. This means the
+ // filter needs to return false.
+ return false;
+
+ }
+
+ // If we got here it means we got through all prop-filters alive so the
+ // filters were all true.
+ return true;
+
+ }
+
+ /**
+ * This method checks the validity of param-filters.
+ *
+ * A list of param-filters needs to be specified. Also the parent of the
+ * parameter we're checking should be specified, not the parameter to check
+ * itself.
+ *
+ * @param VObject\Property $parent
+ * @param array $filters
+ * @return bool
+ */
+ protected function validateParamFilters(VObject\Property $parent, array $filters) {
+
+ foreach($filters as $filter) {
+
+ $isDefined = isset($parent[$filter['name']]);
+
+ if ($filter['is-not-defined']) {
+
+ if ($isDefined) {
+ return false;
+ } else {
+ continue;
+ }
+
+ }
+ if (!$isDefined) {
+ return false;
+ }
+
+ if (!$filter['text-match']) {
+ continue;
+ }
+
+ if (version_compare(VObject\Version::VERSION, '3.0.0beta1', '>=')) {
+
+ // If there are sub-filters, we need to find at least one parameter
+ // for which the subfilters hold true.
+ foreach($parent[$filter['name']]->getParts() as $subParam) {
+
+ if($this->validateTextMatch($subParam,$filter['text-match'])) {
+ // We had a match, so this param-filter succeeds
+ continue 2;
+ }
+
+ }
+
+ } else {
+
+ // If there are sub-filters, we need to find at least one parameter
+ // for which the subfilters hold true.
+ foreach($parent[$filter['name']] as $subParam) {
+
+ if($this->validateTextMatch($subParam,$filter['text-match'])) {
+ // We had a match, so this param-filter succeeds
+ continue 2;
+ }
+
+ }
+
+ }
+
+ // If we got here it means there was a text-match filter and there
+ // were no matches. This means the filter needs to return false.
+ return false;
+
+ }
+
+ // If we got here it means we got through all param-filters alive so the
+ // filters were all true.
+ return true;
+
+ }
+
+ /**
+ * This method checks the validity of a text-match.
+ *
+ * A single text-match should be specified as well as the specific property
+ * or parameter we need to validate.
+ *
+ * @param VObject\Node|string $check Value to check against.
+ * @param array $textMatch
+ * @return bool
+ */
+ protected function validateTextMatch($check, array $textMatch) {
+
+ if ($check instanceof VObject\Node) {
+ $check = (string)$check;
+ }
+
+ $isMatching = \Sabre\DAV\StringUtil::textMatch($check, $textMatch['value'], $textMatch['collation']);
+
+ return ($textMatch['negate-condition'] xor $isMatching);
+
+ }
+
+ /**
+ * Validates if a component matches the given time range.
+ *
+ * This is all based on the rules specified in rfc4791, which are quite
+ * complex.
+ *
+ * @param VObject\Node $component
+ * @param DateTime $start
+ * @param DateTime $end
+ * @return bool
+ */
+ protected function validateTimeRange(VObject\Node $component, $start, $end) {
+
+ if (is_null($start)) {
+ $start = new DateTime('1900-01-01');
+ }
+ if (is_null($end)) {
+ $end = new DateTime('3000-01-01');
+ }
+
+ switch($component->name) {
+
+ case 'VEVENT' :
+ case 'VTODO' :
+ case 'VJOURNAL' :
+
+ return $component->isInTimeRange($start, $end);
+
+ case 'VALARM' :
+
+ // If the valarm is wrapped in a recurring event, we need to
+ // expand the recursions, and validate each.
+ //
+ // Our datamodel doesn't easily allow us to do this straight
+ // in the VALARM component code, so this is a hack, and an
+ // expensive one too.
+ if ($component->parent->name === 'VEVENT' && $component->parent->RRULE) {
+
+ // Fire up the iterator!
+ $it = new VObject\RecurrenceIterator($component->parent->parent, (string)$component->parent->UID);
+ while($it->valid()) {
+ $expandedEvent = $it->getEventObject();
+
+ // We need to check from these expanded alarms, which
+ // one is the first to trigger. Based on this, we can
+ // determine if we can 'give up' expanding events.
+ $firstAlarm = null;
+ if ($expandedEvent->VALARM !== null) {
+ foreach($expandedEvent->VALARM as $expandedAlarm) {
+
+ $effectiveTrigger = $expandedAlarm->getEffectiveTriggerTime();
+ if ($expandedAlarm->isInTimeRange($start, $end)) {
+ return true;
+ }
+
+ if ((string)$expandedAlarm->TRIGGER['VALUE'] === 'DATE-TIME') {
+ // This is an alarm with a non-relative trigger
+ // time, likely created by a buggy client. The
+ // implication is that every alarm in this
+ // recurring event trigger at the exact same
+ // time. It doesn't make sense to traverse
+ // further.
+ } else {
+ // We store the first alarm as a means to
+ // figure out when we can stop traversing.
+ if (!$firstAlarm || $effectiveTrigger < $firstAlarm) {
+ $firstAlarm = $effectiveTrigger;
+ }
+ }
+ }
+ }
+ if (is_null($firstAlarm)) {
+ // No alarm was found.
+ //
+ // Or technically: No alarm that will change for
+ // every instance of the recurrence was found,
+ // which means we can assume there was no match.
+ return false;
+ }
+ if ($firstAlarm > $end) {
+ return false;
+ }
+ $it->next();
+ }
+ return false;
+ } else {
+ return $component->isInTimeRange($start, $end);
+ }
+
+ case 'VFREEBUSY' :
+ throw new \Sabre\DAV\Exception\NotImplemented('time-range filters are currently not supported on ' . $component->name . ' components');
+
+ case 'COMPLETED' :
+ case 'CREATED' :
+ case 'DTEND' :
+ case 'DTSTAMP' :
+ case 'DTSTART' :
+ case 'DUE' :
+ case 'LAST-MODIFIED' :
+ return ($start <= $component->getDateTime() && $end >= $component->getDateTime());
+
+
+
+ default :
+ throw new \Sabre\DAV\Exception\BadRequest('You cannot create a time-range filter on a ' . $component->name . ' component');
+
+ }
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/CalendarRootNode.php b/vendor/sabre/dav/lib/Sabre/CalDAV/CalendarRootNode.php
new file mode 100644
index 000000000..5d1ee7780
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/CalendarRootNode.php
@@ -0,0 +1,77 @@
+<?php
+
+namespace Sabre\CalDAV;
+
+use Sabre\DAVACL\PrincipalBackend;
+
+/**
+ * Calendars collection
+ *
+ * This object is responsible for generating a list of calendar-homes for each
+ * user.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class CalendarRootNode extends \Sabre\DAVACL\AbstractPrincipalCollection {
+
+ /**
+ * CalDAV backend
+ *
+ * @var Sabre\CalDAV\Backend\BackendInterface
+ */
+ protected $caldavBackend;
+
+ /**
+ * Constructor
+ *
+ * This constructor needs both an authentication and a caldav backend.
+ *
+ * By default this class will show a list of calendar collections for
+ * principals in the 'principals' collection. If your main principals are
+ * actually located in a different path, use the $principalPrefix argument
+ * to override this.
+ *
+ * @param PrincipalBackend\BackendInterface $principalBackend
+ * @param Backend\BackendInterface $caldavBackend
+ * @param string $principalPrefix
+ */
+ public function __construct(PrincipalBackend\BackendInterface $principalBackend,Backend\BackendInterface $caldavBackend, $principalPrefix = 'principals') {
+
+ parent::__construct($principalBackend, $principalPrefix);
+ $this->caldavBackend = $caldavBackend;
+
+ }
+
+ /**
+ * Returns the nodename
+ *
+ * We're overriding this, because the default will be the 'principalPrefix',
+ * and we want it to be Sabre\CalDAV\Plugin::CALENDAR_ROOT
+ *
+ * @return string
+ */
+ public function getName() {
+
+ return Plugin::CALENDAR_ROOT;
+
+ }
+
+ /**
+ * This method returns a node for a principal.
+ *
+ * The passed array contains principal information, and is guaranteed to
+ * at least contain a uri item. Other properties may or may not be
+ * supplied by the authentication backend.
+ *
+ * @param array $principal
+ * @return \Sabre\DAV\INode
+ */
+ public function getChildForPrincipal(array $principal) {
+
+ return new UserCalendars($this->caldavBackend, $principal);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/Exception/InvalidComponentType.php b/vendor/sabre/dav/lib/Sabre/CalDAV/Exception/InvalidComponentType.php
new file mode 100644
index 000000000..b8d36794c
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/Exception/InvalidComponentType.php
@@ -0,0 +1,35 @@
+<?php
+
+namespace Sabre\CalDAV\Exception;
+
+use Sabre\DAV;
+use Sabre\CalDAV;
+
+/**
+ * InvalidComponentType
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class InvalidComponentType extends DAV\Exception\Forbidden {
+
+ /**
+ * Adds in extra information in the xml response.
+ *
+ * This method adds the {CALDAV:}supported-calendar-component as defined in rfc4791
+ *
+ * @param DAV\Server $server
+ * @param \DOMElement $errorNode
+ * @return void
+ */
+ public function serialize(DAV\Server $server, \DOMElement $errorNode) {
+
+ $doc = $errorNode->ownerDocument;
+
+ $np = $doc->createElementNS(CalDAV\Plugin::NS_CALDAV,'cal:supported-calendar-component');
+ $errorNode->appendChild($np);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/ICSExportPlugin.php b/vendor/sabre/dav/lib/Sabre/CalDAV/ICSExportPlugin.php
new file mode 100644
index 000000000..aa0637295
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/ICSExportPlugin.php
@@ -0,0 +1,142 @@
+<?php
+
+namespace Sabre\CalDAV;
+
+use Sabre\DAV;
+use Sabre\VObject;
+
+/**
+ * ICS Exporter
+ *
+ * This plugin 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.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class ICSExportPlugin extends DAV\ServerPlugin {
+
+ /**
+ * Reference to Server class
+ *
+ * @var \Sabre\DAV\Server
+ */
+ protected $server;
+
+ /**
+ * Initializes the plugin and registers event handlers
+ *
+ * @param \Sabre\DAV\Server $server
+ * @return void
+ */
+ public function initialize(DAV\Server $server) {
+
+ $this->server = $server;
+ $this->server->subscribeEvent('beforeMethod',array($this,'beforeMethod'), 90);
+
+ }
+
+ /**
+ * 'beforeMethod' event handles. This event handles intercepts GET requests ending
+ * with ?export
+ *
+ * @param string $method
+ * @param string $uri
+ * @return bool
+ */
+ public function beforeMethod($method, $uri) {
+
+ if ($method!='GET') return;
+ if ($this->server->httpRequest->getQueryString()!='export') return;
+
+ // splitting uri
+ list($uri) = explode('?',$uri,2);
+
+ $node = $this->server->tree->getNodeForPath($uri);
+
+ if (!($node instanceof Calendar)) return;
+
+ // Checking ACL, if available.
+ if ($aclPlugin = $this->server->getPlugin('acl')) {
+ $aclPlugin->checkPrivileges($uri, '{DAV:}read');
+ }
+
+ $this->server->httpResponse->setHeader('Content-Type','text/calendar');
+ $this->server->httpResponse->sendStatus(200);
+
+ $nodes = $this->server->getPropertiesForPath($uri, array(
+ '{' . Plugin::NS_CALDAV . '}calendar-data',
+ ),1);
+
+ $this->server->httpResponse->sendBody($this->generateICS($nodes));
+
+ // Returning false to break the event chain
+ return false;
+
+ }
+
+ /**
+ * Merges all calendar objects, and builds one big ics export
+ *
+ * @param array $nodes
+ * @return string
+ */
+ public function generateICS(array $nodes) {
+
+ $calendar = new VObject\Component\VCalendar();
+ $calendar->version = '2.0';
+ if (DAV\Server::$exposeVersion) {
+ $calendar->prodid = '-//SabreDAV//SabreDAV ' . DAV\Version::VERSION . '//EN';
+ } else {
+ $calendar->prodid = '-//SabreDAV//SabreDAV//EN';
+ }
+ $calendar->calscale = 'GREGORIAN';
+
+ $collectedTimezones = array();
+
+ $timezones = array();
+ $objects = array();
+
+ foreach($nodes as $node) {
+
+ if (!isset($node[200]['{' . Plugin::NS_CALDAV . '}calendar-data'])) {
+ continue;
+ }
+ $nodeData = $node[200]['{' . Plugin::NS_CALDAV . '}calendar-data'];
+
+ $nodeComp = VObject\Reader::read($nodeData);
+
+ foreach($nodeComp->children() as $child) {
+
+ switch($child->name) {
+ case 'VEVENT' :
+ case 'VTODO' :
+ case 'VJOURNAL' :
+ $objects[] = $child;
+ break;
+
+ // VTIMEZONE is special, because we need to filter out the duplicates
+ case 'VTIMEZONE' :
+ // Naively just checking tzid.
+ if (in_array((string)$child->TZID, $collectedTimezones)) continue;
+
+ $timezones[] = $child;
+ $collectedTimezones[] = $child->TZID;
+ break;
+
+ }
+
+ }
+
+ }
+
+ foreach($timezones as $tz) $calendar->add($tz);
+ foreach($objects as $obj) $calendar->add($obj);
+
+ return $calendar->serialize();
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/ICalendar.php b/vendor/sabre/dav/lib/Sabre/CalDAV/ICalendar.php
new file mode 100644
index 000000000..8be36d35a
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/ICalendar.php
@@ -0,0 +1,36 @@
+<?php
+
+namespace Sabre\CalDAV;
+use Sabre\DAV;
+
+/**
+ * Calendar interface
+ *
+ * Implement this interface to allow a node to be recognized as an calendar.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+interface ICalendar extends DAV\ICollection {
+
+ /**
+ * Performs a calendar-query on the contents of this calendar.
+ *
+ * The calendar-query is defined in RFC4791 : CalDAV. Using the
+ * calendar-query it is possible for a client to request a specific set of
+ * object, based on contents of iCalendar properties, date-ranges and
+ * iCalendar component types (VTODO, VEVENT).
+ *
+ * This method should just return a list of (relative) urls that match this
+ * query.
+ *
+ * The list of filters are specified as an array. The exact array is
+ * documented by \Sabre\CalDAV\CalendarQueryParser.
+ *
+ * @param array $filters
+ * @return array
+ */
+ public function calendarQuery(array $filters);
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/ICalendarObject.php b/vendor/sabre/dav/lib/Sabre/CalDAV/ICalendarObject.php
new file mode 100644
index 000000000..365d4009c
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/ICalendarObject.php
@@ -0,0 +1,21 @@
+<?php
+
+namespace Sabre\CalDAV;
+use Sabre\DAV;
+
+/**
+ * CalendarObject interface
+ *
+ * Extend the ICalendarObject interface to allow your custom nodes to be picked up as
+ * CalendarObjects.
+ *
+ * Calendar objects are resources such as Events, Todo's or Journals.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+interface ICalendarObject extends DAV\IFile {
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/IShareableCalendar.php b/vendor/sabre/dav/lib/Sabre/CalDAV/IShareableCalendar.php
new file mode 100644
index 000000000..b418eab52
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/IShareableCalendar.php
@@ -0,0 +1,48 @@
+<?php
+
+namespace Sabre\CalDAV;
+
+/**
+ * This interface represents a Calendar that can be shared with other users.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+interface IShareableCalendar extends ICalendar {
+
+ /**
+ * Updates the list of shares.
+ *
+ * The first array is a list of people that are to be added to the
+ * calendar.
+ *
+ * Every element in the add array has the following properties:
+ * * href - A url. Usually a mailto: address
+ * * commonName - Usually a first and last name, or false
+ * * summary - A description of the share, can also be false
+ * * readOnly - A boolean value
+ *
+ * Every element in the remove array is just the address string.
+ *
+ * @param array $add
+ * @param array $remove
+ * @return void
+ */
+ function updateShares(array $add, array $remove);
+
+ /**
+ * Returns the list of people whom this calendar is shared with.
+ *
+ * Every element in this array should have the following properties:
+ * * href - Often a mailto: address
+ * * commonName - Optional, for example a first + last name
+ * * status - See the Sabre\CalDAV\SharingPlugin::STATUS_ constants.
+ * * readOnly - boolean
+ * * summary - Optional, a description for the share
+ *
+ * @return array
+ */
+ function getShares();
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/ISharedCalendar.php b/vendor/sabre/dav/lib/Sabre/CalDAV/ISharedCalendar.php
new file mode 100644
index 000000000..f9084a4f4
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/ISharedCalendar.php
@@ -0,0 +1,36 @@
+<?php
+
+namespace Sabre\CalDAV;
+
+/**
+ * This interface represents a Calendar that is shared by a different user.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+interface ISharedCalendar extends ICalendar {
+
+ /**
+ * This method should return the url of the owners' copy of the shared
+ * calendar.
+ *
+ * @return string
+ */
+ function getSharedUrl();
+
+ /**
+ * Returns the list of people whom this calendar is shared with.
+ *
+ * Every element in this array should have the following properties:
+ * * href - Often a mailto: address
+ * * commonName - Optional, for example a first + last name
+ * * status - See the Sabre\CalDAV\SharingPlugin::STATUS_ constants.
+ * * readOnly - boolean
+ * * summary - Optional, a description for the share
+ *
+ * @return array
+ */
+ function getShares();
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/Notifications/Collection.php b/vendor/sabre/dav/lib/Sabre/CalDAV/Notifications/Collection.php
new file mode 100644
index 000000000..e86f81b59
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/Notifications/Collection.php
@@ -0,0 +1,173 @@
+<?php
+
+namespace Sabre\CalDAV\Notifications;
+
+use Sabre\DAV;
+use Sabre\CalDAV;
+use Sabre\DAVACL;
+
+/**
+ * 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
+ * as a notifications collection.
+ *
+ * This collection should only return Sabre\CalDAV\Notifications\INode nodes as
+ * its children.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Collection extends DAV\Collection implements ICollection, DAVACL\IACL {
+
+ /**
+ * The notification backend
+ *
+ * @var Sabre\CalDAV\Backend\NotificationSupport
+ */
+ protected $caldavBackend;
+
+ /**
+ * Principal uri
+ *
+ * @var string
+ */
+ protected $principalUri;
+
+ /**
+ * Constructor
+ *
+ * @param CalDAV\Backend\NotificationSupport $caldavBackend
+ * @param string $principalUri
+ */
+ public function __construct(CalDAV\Backend\NotificationSupport $caldavBackend, $principalUri) {
+
+ $this->caldavBackend = $caldavBackend;
+ $this->principalUri = $principalUri;
+
+ }
+
+ /**
+ * Returns all notifications for a principal
+ *
+ * @return array
+ */
+ public function getChildren() {
+
+ $children = array();
+ $notifications = $this->caldavBackend->getNotificationsForPrincipal($this->principalUri);
+
+ foreach($notifications as $notification) {
+
+ $children[] = new Node(
+ $this->caldavBackend,
+ $this->principalUri,
+ $notification
+ );
+ }
+
+ return $children;
+
+ }
+
+ /**
+ * Returns the name of this object
+ *
+ * @return string
+ */
+ public function getName() {
+
+ return 'notifications';
+
+ }
+
+ /**
+ * Returns the owner principal
+ *
+ * This must be a url to a principal, or null if there's no owner
+ *
+ * @return string|null
+ */
+ public function getOwner() {
+
+ return $this->principalUri;
+
+ }
+
+ /**
+ * Returns a group principal
+ *
+ * This must be a url to a principal, or null if there's no owner
+ *
+ * @return string|null
+ */
+ public function getGroup() {
+
+ return null;
+
+ }
+
+ /**
+ * Returns a list of ACE's for this node.
+ *
+ * Each ACE has the following properties:
+ * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are
+ * currently the only supported privileges
+ * * 'principal', a url to the principal who owns the node
+ * * 'protected' (optional), indicating that this ACE is not allowed to
+ * be updated.
+ *
+ * @return array
+ */
+ public function getACL() {
+
+ return array(
+ array(
+ 'principal' => $this->getOwner(),
+ 'privilege' => '{DAV:}read',
+ 'protected' => true,
+ ),
+ array(
+ 'principal' => $this->getOwner(),
+ 'privilege' => '{DAV:}write',
+ 'protected' => true,
+ )
+ );
+
+ }
+
+ /**
+ * Updates the ACL
+ *
+ * This method will receive a list of new ACE's as an array argument.
+ *
+ * @param array $acl
+ * @return void
+ */
+ public function setACL(array $acl) {
+
+ throw new DAV\Exception\NotImplemented('Updating ACLs is not implemented here');
+
+ }
+
+ /**
+ * Returns the list of supported privileges for this node.
+ *
+ * The returned data structure is a list of nested privileges.
+ * See Sabre\DAVACL\Plugin::getDefaultSupportedPrivilegeSet for a simple
+ * standard structure.
+ *
+ * If null is returned from this method, the default privilege set is used,
+ * which is fine for most common usecases.
+ *
+ * @return array|null
+ */
+ public function getSupportedPrivilegeSet() {
+
+ return null;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/Notifications/ICollection.php b/vendor/sabre/dav/lib/Sabre/CalDAV/Notifications/ICollection.php
new file mode 100644
index 000000000..57a2f7dfb
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/Notifications/ICollection.php
@@ -0,0 +1,24 @@
+<?php
+
+namespace Sabre\CalDAV\Notifications;
+
+use Sabre\DAV;
+
+/**
+ * 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
+ * as a notifications collection.
+ *
+ * This collection should only return Sabre\CalDAV\Notifications\INode nodes as
+ * its children.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+interface ICollection extends DAV\ICollection {
+
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/Notifications/INode.php b/vendor/sabre/dav/lib/Sabre/CalDAV/Notifications/INode.php
new file mode 100644
index 000000000..854e891dd
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/Notifications/INode.php
@@ -0,0 +1,38 @@
+<?php
+
+namespace Sabre\CalDAV\Notifications;
+
+/**
+ * This node represents a single notification.
+ *
+ * The signature is mostly identical to that of Sabre\DAV\IFile, but the get() method
+ * MUST return an xml document that matches the requirements of the
+ * 'caldav-notifications.txt' spec.
+ *
+ * For a complete example, check out the Notification class, which contains
+ * some helper functions.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+interface INode {
+
+ /**
+ * This method must return an xml element, using the
+ * Sabre\CalDAV\Notifications\INotificationType classes.
+ *
+ * @return INotificationType
+ */
+ function getNotificationType();
+
+ /**
+ * Returns the etag for the notification.
+ *
+ * The etag must be surrounded by litteral double-quotes.
+ *
+ * @return string
+ */
+ function getETag();
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/Notifications/INotificationType.php b/vendor/sabre/dav/lib/Sabre/CalDAV/Notifications/INotificationType.php
new file mode 100644
index 000000000..cf64eb682
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/Notifications/INotificationType.php
@@ -0,0 +1,44 @@
+<?php
+
+namespace Sabre\CalDAV\Notifications;
+use Sabre\DAV;
+
+/**
+ * This interface reflects a single notification type.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+interface INotificationType extends DAV\PropertyInterface {
+
+ /**
+ * This method serializes the entire notification, as it is used in the
+ * response body.
+ *
+ * @param DAV\Server $server
+ * @param \DOMElement $node
+ * @return void
+ */
+ function serializeBody(DAV\Server $server, \DOMElement $node);
+
+ /**
+ * Returns a unique id for this notification
+ *
+ * This is just the base url. This should generally be some kind of unique
+ * id.
+ *
+ * @return string
+ */
+ function getId();
+
+ /**
+ * Returns the ETag for this notification.
+ *
+ * The ETag must be surrounded by literal double-quotes.
+ *
+ * @return string
+ */
+ function getETag();
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/Notifications/Node.php b/vendor/sabre/dav/lib/Sabre/CalDAV/Notifications/Node.php
new file mode 100644
index 000000000..ef0aa0c26
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/Notifications/Node.php
@@ -0,0 +1,192 @@
+<?php
+
+namespace Sabre\CalDAV\Notifications;
+
+use Sabre\DAV;
+use Sabre\CalDAV;
+use Sabre\DAVACL;
+
+/**
+ * This node represents a single notification.
+ *
+ * The signature is mostly identical to that of Sabre\DAV\IFile, but the get() method
+ * MUST return an xml document that matches the requirements of the
+ * 'caldav-notifications.txt' spec.
+
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Node extends DAV\File implements INode, DAVACL\IACL {
+
+ /**
+ * The notification backend
+ *
+ * @var Sabre\CalDAV\Backend\NotificationSupport
+ */
+ protected $caldavBackend;
+
+ /**
+ * The actual notification
+ *
+ * @var Sabre\CalDAV\Notifications\INotificationType
+ */
+ protected $notification;
+
+ /**
+ * Owner principal of the notification
+ *
+ * @var string
+ */
+ protected $principalUri;
+
+ /**
+ * Constructor
+ *
+ * @param CalDAV\Backend\NotificationSupport $caldavBackend
+ * @param string $principalUri
+ * @param CalDAV\Notifications\INotificationType $notification
+ */
+ public function __construct(CalDAV\Backend\NotificationSupport $caldavBackend, $principalUri, INotificationType $notification) {
+
+ $this->caldavBackend = $caldavBackend;
+ $this->principalUri = $principalUri;
+ $this->notification = $notification;
+
+ }
+
+ /**
+ * Returns the path name for this notification
+ *
+ * @return id
+ */
+ public function getName() {
+
+ return $this->notification->getId() . '.xml';
+
+ }
+
+ /**
+ * Returns the etag for the notification.
+ *
+ * The etag must be surrounded by litteral double-quotes.
+ *
+ * @return string
+ */
+ public function getETag() {
+
+ return $this->notification->getETag();
+
+ }
+
+ /**
+ * This method must return an xml element, using the
+ * Sabre\CalDAV\Notifications\INotificationType classes.
+ *
+ * @return INotificationType
+ */
+ public function getNotificationType() {
+
+ return $this->notification;
+
+ }
+
+ /**
+ * Deletes this notification
+ *
+ * @return void
+ */
+ public function delete() {
+
+ $this->caldavBackend->deleteNotification($this->getOwner(), $this->notification);
+
+ }
+
+ /**
+ * Returns the owner principal
+ *
+ * This must be a url to a principal, or null if there's no owner
+ *
+ * @return string|null
+ */
+ public function getOwner() {
+
+ return $this->principalUri;
+
+ }
+
+ /**
+ * Returns a group principal
+ *
+ * This must be a url to a principal, or null if there's no owner
+ *
+ * @return string|null
+ */
+ public function getGroup() {
+
+ return null;
+
+ }
+
+ /**
+ * Returns a list of ACE's for this node.
+ *
+ * Each ACE has the following properties:
+ * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are
+ * currently the only supported privileges
+ * * 'principal', a url to the principal who owns the node
+ * * 'protected' (optional), indicating that this ACE is not allowed to
+ * be updated.
+ *
+ * @return array
+ */
+ public function getACL() {
+
+ return array(
+ array(
+ 'principal' => $this->getOwner(),
+ 'privilege' => '{DAV:}read',
+ 'protected' => true,
+ ),
+ array(
+ 'principal' => $this->getOwner(),
+ 'privilege' => '{DAV:}write',
+ 'protected' => true,
+ )
+ );
+
+ }
+
+ /**
+ * Updates the ACL
+ *
+ * This method will receive a list of new ACE's as an array argument.
+ *
+ * @param array $acl
+ * @return void
+ */
+ public function setACL(array $acl) {
+
+ throw new DAV\Exception\NotImplemented('Updating ACLs is not implemented here');
+
+ }
+
+ /**
+ * Returns the list of supported privileges for this node.
+ *
+ * The returned data structure is a list of nested privileges.
+ * See Sabre\DAVACL\Plugin::getDefaultSupportedPrivilegeSet for a simple
+ * standard structure.
+ *
+ * If null is returned from this method, the default privilege set is used,
+ * which is fine for most common usecases.
+ *
+ * @return array|null
+ */
+ public function getSupportedPrivilegeSet() {
+
+ return null;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/Notifications/Notification/Invite.php b/vendor/sabre/dav/lib/Sabre/CalDAV/Notifications/Notification/Invite.php
new file mode 100644
index 000000000..42daf3fb0
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/Notifications/Notification/Invite.php
@@ -0,0 +1,324 @@
+<?php
+
+namespace Sabre\CalDAV\Notifications\Notification;
+
+use Sabre\CalDAV\SharingPlugin as SharingPlugin;
+use Sabre\DAV;
+use Sabre\CalDAV;
+
+/**
+ * This class represents the cs:invite-notification notification element.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Invite extends DAV\Property implements CalDAV\Notifications\INotificationType {
+
+ /**
+ * A unique id for the message
+ *
+ * @var string
+ */
+ protected $id;
+
+ /**
+ * Timestamp of the notification
+ *
+ * @var DateTime
+ */
+ protected $dtStamp;
+
+ /**
+ * A url to the recipient of the notification. This can be an email
+ * address (mailto:), or a principal url.
+ *
+ * @var string
+ */
+ protected $href;
+
+ /**
+ * The type of message, see the SharingPlugin::STATUS_* constants.
+ *
+ * @var int
+ */
+ protected $type;
+
+ /**
+ * True if access to a calendar is read-only.
+ *
+ * @var bool
+ */
+ protected $readOnly;
+
+ /**
+ * A url to the shared calendar.
+ *
+ * @var string
+ */
+ protected $hostUrl;
+
+ /**
+ * Url to the sharer of the calendar
+ *
+ * @var string
+ */
+ protected $organizer;
+
+ /**
+ * The name of the sharer.
+ *
+ * @var string
+ */
+ protected $commonName;
+
+ /**
+ * The name of the sharer.
+ *
+ * @var string
+ */
+ protected $firstName;
+
+ /**
+ * The name of the sharer.
+ *
+ * @var string
+ */
+ protected $lastName;
+
+ /**
+ * A description of the share request
+ *
+ * @var string
+ */
+ protected $summary;
+
+ /**
+ * The Etag for the notification
+ *
+ * @var string
+ */
+ protected $etag;
+
+ /**
+ * The list of supported components
+ *
+ * @var Sabre\CalDAV\Property\SupportedCalendarComponentSet
+ */
+ protected $supportedComponents;
+
+ /**
+ * Creates the Invite notification.
+ *
+ * This constructor receives an array with the following elements:
+ *
+ * * id - A unique id
+ * * etag - The etag
+ * * dtStamp - A DateTime object with a timestamp for the notification.
+ * * type - The type of notification, see SharingPlugin::STATUS_*
+ * constants for details.
+ * * readOnly - This must be set to true, if this is an invite for
+ * read-only access to a calendar.
+ * * hostUrl - A url to the shared calendar.
+ * * organizer - Url to the sharer principal.
+ * * commonName - The real name of the sharer (optional).
+ * * firstName - The first name of the sharer (optional).
+ * * lastName - The last name of the sharer (optional).
+ * * summary - Description of the share, can be the same as the
+ * calendar, but may also be modified (optional).
+ * * supportedComponents - An instance of
+ * Sabre\CalDAV\Property\SupportedCalendarComponentSet.
+ * This allows the client to determine which components
+ * will be supported in the shared calendar. This is
+ * also optional.
+ *
+ * @param array $values All the options
+ */
+ public function __construct(array $values) {
+
+ $required = array(
+ 'id',
+ 'etag',
+ 'href',
+ 'dtStamp',
+ 'type',
+ 'readOnly',
+ 'hostUrl',
+ 'organizer',
+ );
+ foreach($required as $item) {
+ if (!isset($values[$item])) {
+ throw new \InvalidArgumentException($item . ' is a required constructor option');
+ }
+ }
+
+ foreach($values as $key=>$value) {
+ if (!property_exists($this, $key)) {
+ throw new \InvalidArgumentException('Unknown option: ' . $key);
+ }
+ $this->$key = $value;
+ }
+
+ }
+
+ /**
+ * Serializes the notification as a single property.
+ *
+ * You should usually just encode the single top-level element of the
+ * notification.
+ *
+ * @param DAV\Server $server
+ * @param \DOMElement $node
+ * @return void
+ */
+ public function serialize(DAV\Server $server, \DOMElement $node) {
+
+ $prop = $node->ownerDocument->createElement('cs:invite-notification');
+ $node->appendChild($prop);
+
+ }
+
+ /**
+ * This method serializes the entire notification, as it is used in the
+ * response body.
+ *
+ * @param DAV\Server $server
+ * @param \DOMElement $node
+ * @return void
+ */
+ public function serializeBody(DAV\Server $server, \DOMElement $node) {
+
+ $doc = $node->ownerDocument;
+
+ $dt = $doc->createElement('cs:dtstamp');
+ $this->dtStamp->setTimezone(new \DateTimezone('GMT'));
+ $dt->appendChild($doc->createTextNode($this->dtStamp->format('Ymd\\THis\\Z')));
+ $node->appendChild($dt);
+
+ $prop = $doc->createElement('cs:invite-notification');
+ $node->appendChild($prop);
+
+ $uid = $doc->createElement('cs:uid');
+ $uid->appendChild( $doc->createTextNode($this->id) );
+ $prop->appendChild($uid);
+
+ $href = $doc->createElement('d:href');
+ $href->appendChild( $doc->createTextNode( $this->href ) );
+ $prop->appendChild($href);
+
+ $nodeName = null;
+ switch($this->type) {
+
+ case SharingPlugin::STATUS_ACCEPTED :
+ $nodeName = 'cs:invite-accepted';
+ break;
+ case SharingPlugin::STATUS_DECLINED :
+ $nodeName = 'cs:invite-declined';
+ break;
+ case SharingPlugin::STATUS_DELETED :
+ $nodeName = 'cs:invite-deleted';
+ break;
+ case SharingPlugin::STATUS_NORESPONSE :
+ $nodeName = 'cs:invite-noresponse';
+ break;
+
+ }
+ $prop->appendChild(
+ $doc->createElement($nodeName)
+ );
+ $hostHref = $doc->createElement('d:href', $server->getBaseUri() . $this->hostUrl);
+ $hostUrl = $doc->createElement('cs:hosturl');
+ $hostUrl->appendChild($hostHref);
+ $prop->appendChild($hostUrl);
+
+ $access = $doc->createElement('cs:access');
+ if ($this->readOnly) {
+ $access->appendChild($doc->createElement('cs:read'));
+ } else {
+ $access->appendChild($doc->createElement('cs:read-write'));
+ }
+ $prop->appendChild($access);
+
+ $organizerUrl = $doc->createElement('cs:organizer');
+ // If the organizer contains a 'mailto:' part, it means it should be
+ // treated as absolute.
+ if (strtolower(substr($this->organizer,0,7))==='mailto:') {
+ $organizerHref = new DAV\Property\Href($this->organizer, false);
+ } else {
+ $organizerHref = new DAV\Property\Href($this->organizer, true);
+ }
+ $organizerHref->serialize($server, $organizerUrl);
+
+ if ($this->commonName) {
+ $commonName = $doc->createElement('cs:common-name');
+ $commonName->appendChild($doc->createTextNode($this->commonName));
+ $organizerUrl->appendChild($commonName);
+
+ $commonNameOld = $doc->createElement('cs:organizer-cn');
+ $commonNameOld->appendChild($doc->createTextNode($this->commonName));
+ $prop->appendChild($commonNameOld);
+
+ }
+ if ($this->firstName) {
+ $firstName = $doc->createElement('cs:first-name');
+ $firstName->appendChild($doc->createTextNode($this->firstName));
+ $organizerUrl->appendChild($firstName);
+
+ $firstNameOld = $doc->createElement('cs:organizer-first');
+ $firstNameOld->appendChild($doc->createTextNode($this->firstName));
+ $prop->appendChild($firstNameOld);
+ }
+ if ($this->lastName) {
+ $lastName = $doc->createElement('cs:last-name');
+ $lastName->appendChild($doc->createTextNode($this->lastName));
+ $organizerUrl->appendChild($lastName);
+
+ $lastNameOld = $doc->createElement('cs:organizer-last');
+ $lastNameOld->appendChild($doc->createTextNode($this->lastName));
+ $prop->appendChild($lastNameOld);
+ }
+ $prop->appendChild($organizerUrl);
+
+ if ($this->summary) {
+ $summary = $doc->createElement('cs:summary');
+ $summary->appendChild($doc->createTextNode($this->summary));
+ $prop->appendChild($summary);
+ }
+ if ($this->supportedComponents) {
+
+ $xcomp = $doc->createElement('cal:supported-calendar-component-set');
+ $this->supportedComponents->serialize($server, $xcomp);
+ $prop->appendChild($xcomp);
+
+ }
+
+ }
+
+ /**
+ * Returns a unique id for this notification
+ *
+ * This is just the base url. This should generally be some kind of unique
+ * id.
+ *
+ * @return string
+ */
+ public function getId() {
+
+ return $this->id;
+
+ }
+
+ /**
+ * Returns the ETag for this notification.
+ *
+ * The ETag must be surrounded by literal double-quotes.
+ *
+ * @return string
+ */
+ public function getETag() {
+
+ return $this->etag;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/Notifications/Notification/InviteReply.php b/vendor/sabre/dav/lib/Sabre/CalDAV/Notifications/Notification/InviteReply.php
new file mode 100644
index 000000000..3654a3e16
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/Notifications/Notification/InviteReply.php
@@ -0,0 +1,218 @@
+<?php
+
+namespace Sabre\CalDAV\Notifications\Notification;
+
+use Sabre\CalDAV\SharingPlugin as SharingPlugin;
+use Sabre\DAV;
+use Sabre\CalDAV;
+
+/**
+ * This class represents the cs:invite-reply notification element.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class InviteReply extends DAV\Property implements CalDAV\Notifications\INotificationType {
+
+ /**
+ * A unique id for the message
+ *
+ * @var string
+ */
+ protected $id;
+
+ /**
+ * Timestamp of the notification
+ *
+ * @var DateTime
+ */
+ protected $dtStamp;
+
+ /**
+ * The unique id of the notification this was a reply to.
+ *
+ * @var string
+ */
+ protected $inReplyTo;
+
+ /**
+ * A url to the recipient of the original (!) notification.
+ *
+ * @var string
+ */
+ protected $href;
+
+ /**
+ * The type of message, see the SharingPlugin::STATUS_ constants.
+ *
+ * @var int
+ */
+ protected $type;
+
+ /**
+ * A url to the shared calendar.
+ *
+ * @var string
+ */
+ protected $hostUrl;
+
+ /**
+ * A description of the share request
+ *
+ * @var string
+ */
+ protected $summary;
+
+ /**
+ * Notification Etag
+ *
+ * @var string
+ */
+ protected $etag;
+
+ /**
+ * Creates the Invite Reply Notification.
+ *
+ * This constructor receives an array with the following elements:
+ *
+ * * id - A unique id
+ * * etag - The etag
+ * * dtStamp - A DateTime object with a timestamp for the notification.
+ * * inReplyTo - This should refer to the 'id' of the notification
+ * this is a reply to.
+ * * type - The type of notification, see SharingPlugin::STATUS_*
+ * constants for details.
+ * * hostUrl - A url to the shared calendar.
+ * * summary - Description of the share, can be the same as the
+ * calendar, but may also be modified (optional).
+ */
+ public function __construct(array $values) {
+
+ $required = array(
+ 'id',
+ 'etag',
+ 'href',
+ 'dtStamp',
+ 'inReplyTo',
+ 'type',
+ 'hostUrl',
+ );
+ foreach($required as $item) {
+ if (!isset($values[$item])) {
+ throw new \InvalidArgumentException($item . ' is a required constructor option');
+ }
+ }
+
+ foreach($values as $key=>$value) {
+ if (!property_exists($this, $key)) {
+ throw new \InvalidArgumentException('Unknown option: ' . $key);
+ }
+ $this->$key = $value;
+ }
+
+ }
+
+ /**
+ * Serializes the notification as a single property.
+ *
+ * You should usually just encode the single top-level element of the
+ * notification.
+ *
+ * @param DAV\Server $server
+ * @param \DOMElement $node
+ * @return void
+ */
+ public function serialize(DAV\Server $server, \DOMElement $node) {
+
+ $prop = $node->ownerDocument->createElement('cs:invite-reply');
+ $node->appendChild($prop);
+
+ }
+
+ /**
+ * This method serializes the entire notification, as it is used in the
+ * response body.
+ *
+ * @param DAV\Server $server
+ * @param \DOMElement $node
+ * @return void
+ */
+ public function serializeBody(DAV\Server $server, \DOMElement $node) {
+
+ $doc = $node->ownerDocument;
+
+ $dt = $doc->createElement('cs:dtstamp');
+ $this->dtStamp->setTimezone(new \DateTimezone('GMT'));
+ $dt->appendChild($doc->createTextNode($this->dtStamp->format('Ymd\\THis\\Z')));
+ $node->appendChild($dt);
+
+ $prop = $doc->createElement('cs:invite-reply');
+ $node->appendChild($prop);
+
+ $uid = $doc->createElement('cs:uid');
+ $uid->appendChild($doc->createTextNode($this->id));
+ $prop->appendChild($uid);
+
+ $inReplyTo = $doc->createElement('cs:in-reply-to');
+ $inReplyTo->appendChild( $doc->createTextNode($this->inReplyTo) );
+ $prop->appendChild($inReplyTo);
+
+ $href = $doc->createElement('d:href');
+ $href->appendChild( $doc->createTextNode($this->href) );
+ $prop->appendChild($href);
+
+ $nodeName = null;
+ switch($this->type) {
+
+ case SharingPlugin::STATUS_ACCEPTED :
+ $nodeName = 'cs:invite-accepted';
+ break;
+ case SharingPlugin::STATUS_DECLINED :
+ $nodeName = 'cs:invite-declined';
+ break;
+
+ }
+ $prop->appendChild(
+ $doc->createElement($nodeName)
+ );
+ $hostHref = $doc->createElement('d:href', $server->getBaseUri() . $this->hostUrl);
+ $hostUrl = $doc->createElement('cs:hosturl');
+ $hostUrl->appendChild($hostHref);
+ $prop->appendChild($hostUrl);
+
+ if ($this->summary) {
+ $summary = $doc->createElement('cs:summary');
+ $summary->appendChild($doc->createTextNode($this->summary));
+ $prop->appendChild($summary);
+ }
+
+ }
+
+ /**
+ * Returns a unique id for this notification
+ *
+ * This is just the base url. This should generally be some kind of unique
+ * id.
+ *
+ * @return string
+ */
+ public function getId() {
+
+ return $this->id;
+
+ }
+
+ /**
+ * Returns the ETag for this notification.
+ *
+ * The ETag must be surrounded by literal double-quotes.
+ *
+ * @return string
+ */
+ public function getETag() {
+
+ return $this->etag;
+
+ }
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/Notifications/Notification/SystemStatus.php b/vendor/sabre/dav/lib/Sabre/CalDAV/Notifications/Notification/SystemStatus.php
new file mode 100644
index 000000000..a6a1c4928
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/Notifications/Notification/SystemStatus.php
@@ -0,0 +1,182 @@
+<?php
+
+namespace Sabre\CalDAV\Notifications\Notification;
+
+use Sabre\DAV;
+use Sabre\CalDAV;
+
+/**
+ * SystemStatus notification
+ *
+ * This notification can be used to indicate to the user that the system is
+ * down.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class SystemStatus extends DAV\Property implements CalDAV\Notifications\INotificationType {
+
+ const TYPE_LOW = 1;
+ const TYPE_MEDIUM = 2;
+ const TYPE_HIGH = 3;
+
+ /**
+ * A unique id
+ *
+ * @var string
+ */
+ protected $id;
+
+ /**
+ * The type of alert. This should be one of the TYPE_ constants.
+ *
+ * @var int
+ */
+ protected $type;
+
+ /**
+ * A human-readable description of the problem.
+ *
+ * @var string
+ */
+ protected $description;
+
+ /**
+ * A url to a website with more information for the user.
+ *
+ * @var string
+ */
+ protected $href;
+
+ /**
+ * Notification Etag
+ *
+ * @var string
+ */
+ protected $etag;
+
+ /**
+ * Creates the notification.
+ *
+ * Some kind of unique id should be provided. This is used to generate a
+ * url.
+ *
+ * @param string $id
+ * @param string $etag
+ * @param int $type
+ * @param string $description
+ * @param string $href
+ */
+ public function __construct($id, $etag, $type = self::TYPE_HIGH, $description = null, $href = null) {
+
+ $this->id = $id;
+ $this->type = $type;
+ $this->description = $description;
+ $this->href = $href;
+ $this->etag = $etag;
+
+ }
+
+ /**
+ * Serializes the notification as a single property.
+ *
+ * You should usually just encode the single top-level element of the
+ * notification.
+ *
+ * @param DAV\Server $server
+ * @param \DOMElement $node
+ * @return void
+ */
+ public function serialize(DAV\Server $server, \DOMElement $node) {
+
+ switch($this->type) {
+ case self::TYPE_LOW :
+ $type = 'low';
+ break;
+ case self::TYPE_MEDIUM :
+ $type = 'medium';
+ break;
+ default :
+ case self::TYPE_HIGH :
+ $type = 'high';
+ break;
+ }
+
+ $prop = $node->ownerDocument->createElement('cs:systemstatus');
+ $prop->setAttribute('type', $type);
+
+ $node->appendChild($prop);
+
+ }
+
+ /**
+ * This method serializes the entire notification, as it is used in the
+ * response body.
+ *
+ * @param DAV\Server $server
+ * @param \DOMElement $node
+ * @return void
+ */
+ public function serializeBody(DAV\Server $server, \DOMElement $node) {
+
+ switch($this->type) {
+ case self::TYPE_LOW :
+ $type = 'low';
+ break;
+ case self::TYPE_MEDIUM :
+ $type = 'medium';
+ break;
+ default :
+ case self::TYPE_HIGH :
+ $type = 'high';
+ break;
+ }
+
+ $prop = $node->ownerDocument->createElement('cs:systemstatus');
+ $prop->setAttribute('type', $type);
+
+ if ($this->description) {
+ $text = $node->ownerDocument->createTextNode($this->description);
+ $desc = $node->ownerDocument->createElement('cs:description');
+ $desc->appendChild($text);
+ $prop->appendChild($desc);
+ }
+ if ($this->href) {
+ $text = $node->ownerDocument->createTextNode($this->href);
+ $href = $node->ownerDocument->createElement('d:href');
+ $href->appendChild($text);
+ $prop->appendChild($href);
+ }
+
+ $node->appendChild($prop);
+
+ }
+
+ /**
+ * Returns a unique id for this notification
+ *
+ * This is just the base url. This should generally be some kind of unique
+ * id.
+ *
+ * @return string
+ */
+ public function getId() {
+
+ return $this->id;
+
+ }
+
+ /*
+ * Returns the ETag for this notification.
+ *
+ * The ETag must be surrounded by literal double-quotes.
+ *
+ * @return string
+ */
+ public function getETag() {
+
+ return $this->etag;
+
+ }
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/Plugin.php b/vendor/sabre/dav/lib/Sabre/CalDAV/Plugin.php
new file mode 100644
index 000000000..084036cf9
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/Plugin.php
@@ -0,0 +1,1338 @@
+<?php
+
+namespace Sabre\CalDAV;
+
+use Sabre\DAV;
+use Sabre\DAVACL;
+use Sabre\VObject;
+
+/**
+ * CalDAV plugin
+ *
+ * This plugin provides functionality added by CalDAV (RFC 4791)
+ * It implements new reports, and the MKCALENDAR method.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Plugin extends DAV\ServerPlugin {
+
+ /**
+ * This is the official CalDAV namespace
+ */
+ const NS_CALDAV = 'urn:ietf:params:xml:ns:caldav';
+
+ /**
+ * This is the namespace for the proprietary calendarserver extensions
+ */
+ const NS_CALENDARSERVER = 'http://calendarserver.org/ns/';
+
+ /**
+ * The hardcoded root for calendar objects. It is unfortunate
+ * that we're stuck with it, but it will have to do for now
+ */
+ const CALENDAR_ROOT = 'calendars';
+
+ /**
+ * Reference to server object
+ *
+ * @var DAV\Server
+ */
+ protected $server;
+
+ /**
+ * The email handler for invites and other scheduling messages.
+ *
+ * @var Schedule\IMip
+ */
+ protected $imipHandler;
+
+ /**
+ * Sets the iMIP handler.
+ *
+ * iMIP = The email transport of iCalendar scheduling messages. Setting
+ * this is optional, but if you want the server to allow invites to be sent
+ * out, you must set a handler.
+ *
+ * Specifically iCal will plain assume that the server supports this. If
+ * the server doesn't, iCal will display errors when inviting people to
+ * events.
+ *
+ * @param Schedule\IMip $imipHandler
+ * @return void
+ */
+ public function setIMipHandler(Schedule\IMip $imipHandler) {
+
+ $this->imipHandler = $imipHandler;
+
+ }
+
+ /**
+ * Use this method to tell the server this plugin defines additional
+ * HTTP methods.
+ *
+ * This method is passed a uri. It should only return HTTP methods that are
+ * available for the specified uri.
+ *
+ * @param string $uri
+ * @return array
+ */
+ public function getHTTPMethods($uri) {
+
+ // The MKCALENDAR is only available on unmapped uri's, whose
+ // parents extend IExtendedCollection
+ list($parent, $name) = DAV\URLUtil::splitPath($uri);
+
+ $node = $this->server->tree->getNodeForPath($parent);
+
+ if ($node instanceof DAV\IExtendedCollection) {
+ try {
+ $node->getChild($name);
+ } catch (DAV\Exception\NotFound $e) {
+ return array('MKCALENDAR');
+ }
+ }
+ return array();
+
+ }
+
+ /**
+ * Returns a list of features for the DAV: HTTP header.
+ *
+ * @return array
+ */
+ public function getFeatures() {
+
+ return array('calendar-access', 'calendar-proxy');
+
+ }
+
+ /**
+ * Returns a plugin name.
+ *
+ * Using this name other plugins will be able to access other plugins
+ * using DAV\Server::getPlugin
+ *
+ * @return string
+ */
+ public function getPluginName() {
+
+ return 'caldav';
+
+ }
+
+ /**
+ * Returns a list of reports this plugin 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
+ * implement them
+ *
+ * @param string $uri
+ * @return array
+ */
+ public function getSupportedReportSet($uri) {
+
+ $node = $this->server->tree->getNodeForPath($uri);
+
+ $reports = array();
+ if ($node instanceof ICalendar || $node instanceof ICalendarObject) {
+ $reports[] = '{' . self::NS_CALDAV . '}calendar-multiget';
+ $reports[] = '{' . self::NS_CALDAV . '}calendar-query';
+ }
+ if ($node instanceof ICalendar) {
+ $reports[] = '{' . self::NS_CALDAV . '}free-busy-query';
+ }
+ return $reports;
+
+ }
+
+ /**
+ * Initializes the plugin
+ *
+ * @param DAV\Server $server
+ * @return void
+ */
+ public function initialize(DAV\Server $server) {
+
+ $this->server = $server;
+
+ $server->subscribeEvent('unknownMethod',array($this,'unknownMethod'));
+ //$server->subscribeEvent('unknownMethod',array($this,'unknownMethod2'),1000);
+ $server->subscribeEvent('report',array($this,'report'));
+ $server->subscribeEvent('beforeGetProperties',array($this,'beforeGetProperties'));
+ $server->subscribeEvent('onHTMLActionsPanel', array($this,'htmlActionsPanel'));
+ $server->subscribeEvent('onBrowserPostAction', array($this,'browserPostAction'));
+ $server->subscribeEvent('beforeWriteContent', array($this, 'beforeWriteContent'));
+ $server->subscribeEvent('beforeCreateFile', array($this, 'beforeCreateFile'));
+ $server->subscribeEvent('beforeMethod', array($this,'beforeMethod'));
+
+ $server->xmlNamespaces[self::NS_CALDAV] = 'cal';
+ $server->xmlNamespaces[self::NS_CALENDARSERVER] = 'cs';
+
+ $server->propertyMap['{' . self::NS_CALDAV . '}supported-calendar-component-set'] = 'Sabre\\CalDAV\\Property\\SupportedCalendarComponentSet';
+ $server->propertyMap['{' . self::NS_CALDAV . '}schedule-calendar-transp'] = 'Sabre\\CalDAV\\Property\\ScheduleCalendarTransp';
+
+ $server->resourceTypeMapping['\\Sabre\\CalDAV\\ICalendar'] = '{urn:ietf:params:xml:ns:caldav}calendar';
+ $server->resourceTypeMapping['\\Sabre\\CalDAV\\Schedule\\IOutbox'] = '{urn:ietf:params:xml:ns:caldav}schedule-outbox';
+ $server->resourceTypeMapping['\\Sabre\\CalDAV\\Principal\\IProxyRead'] = '{http://calendarserver.org/ns/}calendar-proxy-read';
+ $server->resourceTypeMapping['\\Sabre\\CalDAV\\Principal\\IProxyWrite'] = '{http://calendarserver.org/ns/}calendar-proxy-write';
+ $server->resourceTypeMapping['\\Sabre\\CalDAV\\Notifications\\ICollection'] = '{' . self::NS_CALENDARSERVER . '}notification';
+
+ array_push($server->protectedProperties,
+
+ '{' . self::NS_CALDAV . '}supported-calendar-component-set',
+ '{' . self::NS_CALDAV . '}supported-calendar-data',
+ '{' . self::NS_CALDAV . '}max-resource-size',
+ '{' . self::NS_CALDAV . '}min-date-time',
+ '{' . self::NS_CALDAV . '}max-date-time',
+ '{' . self::NS_CALDAV . '}max-instances',
+ '{' . self::NS_CALDAV . '}max-attendees-per-instance',
+ '{' . self::NS_CALDAV . '}calendar-home-set',
+ '{' . self::NS_CALDAV . '}supported-collation-set',
+ '{' . self::NS_CALDAV . '}calendar-data',
+
+ // scheduling extension
+ '{' . self::NS_CALDAV . '}schedule-inbox-URL',
+ '{' . self::NS_CALDAV . '}schedule-outbox-URL',
+ '{' . self::NS_CALDAV . '}calendar-user-address-set',
+ '{' . self::NS_CALDAV . '}calendar-user-type',
+
+ // CalendarServer extensions
+ '{' . self::NS_CALENDARSERVER . '}getctag',
+ '{' . self::NS_CALENDARSERVER . '}calendar-proxy-read-for',
+ '{' . self::NS_CALENDARSERVER . '}calendar-proxy-write-for',
+ '{' . self::NS_CALENDARSERVER . '}notification-URL',
+ '{' . self::NS_CALENDARSERVER . '}notificationtype'
+
+ );
+ }
+
+ /**
+ * This function handles support for the MKCALENDAR method
+ *
+ * @param string $method
+ * @param string $uri
+ * @return bool
+ */
+ public function unknownMethod($method, $uri) {
+
+ switch ($method) {
+ case 'MKCALENDAR' :
+ $this->httpMkCalendar($uri);
+ // false is returned to stop the propagation of the
+ // unknownMethod event.
+ return false;
+ case 'POST' :
+
+ // Checking if this is a text/calendar content type
+ $contentType = $this->server->httpRequest->getHeader('Content-Type');
+ if (strpos($contentType, 'text/calendar')!==0) {
+ return;
+ }
+
+ // Checking if we're talking to an outbox
+ try {
+ $node = $this->server->tree->getNodeForPath($uri);
+ } catch (DAV\Exception\NotFound $e) {
+ return;
+ }
+ if (!$node instanceof Schedule\IOutbox)
+ return;
+
+ $this->outboxRequest($node, $uri);
+ return false;
+
+ }
+
+ }
+
+ /**
+ * This functions handles REPORT requests specific to CalDAV
+ *
+ * @param string $reportName
+ * @param \DOMNode $dom
+ * @return bool
+ */
+ public function report($reportName,$dom) {
+
+ switch($reportName) {
+ case '{'.self::NS_CALDAV.'}calendar-multiget' :
+ $this->calendarMultiGetReport($dom);
+ return false;
+ case '{'.self::NS_CALDAV.'}calendar-query' :
+ $this->calendarQueryReport($dom);
+ return false;
+ case '{'.self::NS_CALDAV.'}free-busy-query' :
+ $this->freeBusyQueryReport($dom);
+ return false;
+
+ }
+
+
+ }
+
+ /**
+ * This function handles the MKCALENDAR HTTP method, which creates
+ * a new calendar.
+ *
+ * @param string $uri
+ * @return void
+ */
+ public function httpMkCalendar($uri) {
+
+ // Due to unforgivable bugs in iCal, we're completely disabling MKCALENDAR support
+ // for clients matching iCal in the user agent
+ //$ua = $this->server->httpRequest->getHeader('User-Agent');
+ //if (strpos($ua,'iCal/')!==false) {
+ // throw new \Sabre\DAV\Exception\Forbidden('iCal has major bugs in it\'s RFC3744 support. Therefore we are left with no other choice but disabling this feature.');
+ //}
+
+ $body = $this->server->httpRequest->getBody(true);
+ $properties = array();
+
+ if ($body) {
+
+ $dom = DAV\XMLUtil::loadDOMDocument($body);
+
+ foreach($dom->firstChild->childNodes as $child) {
+
+ if (DAV\XMLUtil::toClarkNotation($child)!=='{DAV:}set') continue;
+ foreach(DAV\XMLUtil::parseProperties($child,$this->server->propertyMap) as $k=>$prop) {
+ $properties[$k] = $prop;
+ }
+
+ }
+ }
+
+ $resourceType = array('{DAV:}collection','{urn:ietf:params:xml:ns:caldav}calendar');
+
+ $this->server->createCollection($uri,$resourceType,$properties);
+
+ $this->server->httpResponse->sendStatus(201);
+ $this->server->httpResponse->setHeader('Content-Length',0);
+ }
+
+ /**
+ * beforeGetProperties
+ *
+ * This method handler is invoked before any after properties for a
+ * resource are fetched. This allows us to add in any CalDAV specific
+ * properties.
+ *
+ * @param string $path
+ * @param DAV\INode $node
+ * @param array $requestedProperties
+ * @param array $returnedProperties
+ * @return void
+ */
+ public function beforeGetProperties($path, DAV\INode $node, &$requestedProperties, &$returnedProperties) {
+
+ if ($node instanceof DAVACL\IPrincipal) {
+
+ // calendar-home-set property
+ $calHome = '{' . self::NS_CALDAV . '}calendar-home-set';
+ if (in_array($calHome,$requestedProperties)) {
+ $principalId = $node->getName();
+ $calendarHomePath = self::CALENDAR_ROOT . '/' . $principalId . '/';
+
+ unset($requestedProperties[array_search($calHome, $requestedProperties)]);
+ $returnedProperties[200][$calHome] = new DAV\Property\Href($calendarHomePath);
+
+ }
+
+ // schedule-outbox-URL property
+ $scheduleProp = '{' . self::NS_CALDAV . '}schedule-outbox-URL';
+ if (in_array($scheduleProp,$requestedProperties)) {
+ $principalId = $node->getName();
+ $outboxPath = self::CALENDAR_ROOT . '/' . $principalId . '/outbox';
+
+ unset($requestedProperties[array_search($scheduleProp, $requestedProperties)]);
+ $returnedProperties[200][$scheduleProp] = new DAV\Property\Href($outboxPath);
+
+ }
+
+ // calendar-user-address-set property
+ $calProp = '{' . self::NS_CALDAV . '}calendar-user-address-set';
+ if (in_array($calProp,$requestedProperties)) {
+
+ $addresses = $node->getAlternateUriSet();
+ $addresses[] = $this->server->getBaseUri() . DAV\URLUtil::encodePath($node->getPrincipalUrl() . '/');
+ unset($requestedProperties[array_search($calProp, $requestedProperties)]);
+ $returnedProperties[200][$calProp] = new DAV\Property\HrefList($addresses, false);
+
+ }
+
+ // These two properties are shortcuts for ical to easily find
+ // other principals this principal has access to.
+ $propRead = '{' . self::NS_CALENDARSERVER . '}calendar-proxy-read-for';
+ $propWrite = '{' . self::NS_CALENDARSERVER . '}calendar-proxy-write-for';
+ if (in_array($propRead,$requestedProperties) || in_array($propWrite,$requestedProperties)) {
+
+ $aclPlugin = $this->server->getPlugin('acl');
+ $membership = $aclPlugin->getPrincipalMembership($path);
+ $readList = array();
+ $writeList = array();
+
+ foreach($membership as $group) {
+
+ $groupNode = $this->server->tree->getNodeForPath($group);
+
+ // If the node is either ap proxy-read or proxy-write
+ // group, we grab the parent principal and add it to the
+ // list.
+ if ($groupNode instanceof Principal\IProxyRead) {
+ list($readList[]) = DAV\URLUtil::splitPath($group);
+ }
+ if ($groupNode instanceof Principal\IProxyWrite) {
+ list($writeList[]) = DAV\URLUtil::splitPath($group);
+ }
+
+ }
+ if (in_array($propRead,$requestedProperties)) {
+ unset($requestedProperties[$propRead]);
+ $returnedProperties[200][$propRead] = new DAV\Property\HrefList($readList);
+ }
+ if (in_array($propWrite,$requestedProperties)) {
+ unset($requestedProperties[$propWrite]);
+ $returnedProperties[200][$propWrite] = new DAV\Property\HrefList($writeList);
+ }
+
+ }
+
+ // notification-URL property
+ $notificationUrl = '{' . self::NS_CALENDARSERVER . '}notification-URL';
+ if (($index = array_search($notificationUrl, $requestedProperties)) !== false) {
+ $principalId = $node->getName();
+ $calendarHomePath = 'calendars/' . $principalId . '/notifications/';
+ unset($requestedProperties[$index]);
+ $returnedProperties[200][$notificationUrl] = new DAV\Property\Href($calendarHomePath);
+ }
+
+ } // instanceof IPrincipal
+
+ if ($node instanceof Notifications\INode) {
+
+ $propertyName = '{' . self::NS_CALENDARSERVER . '}notificationtype';
+ if (($index = array_search($propertyName, $requestedProperties)) !== false) {
+
+ $returnedProperties[200][$propertyName] =
+ $node->getNotificationType();
+
+ unset($requestedProperties[$index]);
+
+ }
+
+ } // instanceof Notifications_INode
+
+
+ if ($node instanceof ICalendarObject) {
+ // The calendar-data property is not supposed to be a 'real'
+ // property, but in large chunks of the spec it does act as such.
+ // Therefore we simply expose it as a property.
+ $calDataProp = '{' . Plugin::NS_CALDAV . '}calendar-data';
+ if (in_array($calDataProp, $requestedProperties)) {
+ unset($requestedProperties[$calDataProp]);
+ $val = $node->get();
+ if (is_resource($val))
+ $val = stream_get_contents($val);
+
+ // Taking out \r to not screw up the xml output
+ $returnedProperties[200][$calDataProp] = str_replace("\r","", $val);
+
+ }
+ }
+
+ }
+
+ /**
+ * This function handles the calendar-multiget REPORT.
+ *
+ * This report is used by the client to fetch the content of a series
+ * of urls. Effectively avoiding a lot of redundant requests.
+ *
+ * @param \DOMNode $dom
+ * @return void
+ */
+ public function calendarMultiGetReport($dom) {
+
+ $properties = array_keys(DAV\XMLUtil::parseProperties($dom->firstChild));
+ $hrefElems = $dom->getElementsByTagNameNS('urn:DAV','href');
+
+ $xpath = new \DOMXPath($dom);
+ $xpath->registerNameSpace('cal',Plugin::NS_CALDAV);
+ $xpath->registerNameSpace('dav','urn:DAV');
+
+ $expand = $xpath->query('/cal:calendar-multiget/dav:prop/cal:calendar-data/cal:expand');
+ if ($expand->length>0) {
+ $expandElem = $expand->item(0);
+ $start = $expandElem->getAttribute('start');
+ $end = $expandElem->getAttribute('end');
+ if(!$start || !$end) {
+ throw new DAV\Exception\BadRequest('The "start" and "end" attributes are required for the CALDAV:expand element');
+ }
+ $start = VObject\DateTimeParser::parseDateTime($start);
+ $end = VObject\DateTimeParser::parseDateTime($end);
+
+ if ($end <= $start) {
+ throw new DAV\Exception\BadRequest('The end-date must be larger than the start-date in the expand element.');
+ }
+
+ $expand = true;
+
+ } else {
+
+ $expand = false;
+
+ }
+
+ foreach($hrefElems as $elem) {
+ $uri = $this->server->calculateUri($elem->nodeValue);
+ list($objProps) = $this->server->getPropertiesForPath($uri,$properties);
+
+ if ($expand && isset($objProps[200]['{' . self::NS_CALDAV . '}calendar-data'])) {
+ $vObject = VObject\Reader::read($objProps[200]['{' . self::NS_CALDAV . '}calendar-data']);
+ $vObject->expand($start, $end);
+ $objProps[200]['{' . self::NS_CALDAV . '}calendar-data'] = $vObject->serialize();
+ }
+
+ $propertyList[]=$objProps;
+
+ }
+
+ $prefer = $this->server->getHTTPPRefer();
+
+ $this->server->httpResponse->sendStatus(207);
+ $this->server->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8');
+ $this->server->httpResponse->setHeader('Vary','Brief,Prefer');
+ $this->server->httpResponse->sendBody($this->server->generateMultiStatus($propertyList, $prefer['return-minimal']));
+
+ }
+
+ /**
+ * This function handles the calendar-query REPORT
+ *
+ * This report is used by clients to request calendar objects based on
+ * complex conditions.
+ *
+ * @param \DOMNode $dom
+ * @return void
+ */
+ public function calendarQueryReport($dom) {
+
+ $parser = new CalendarQueryParser($dom);
+ $parser->parse();
+
+ $node = $this->server->tree->getNodeForPath($this->server->getRequestUri());
+ $depth = $this->server->getHTTPDepth(0);
+
+ // The default result is an empty array
+ $result = array();
+
+ // The calendarobject was requested directly. In this case we handle
+ // this locally.
+ if ($depth == 0 && $node instanceof ICalendarObject) {
+
+ $requestedCalendarData = true;
+ $requestedProperties = $parser->requestedProperties;
+
+ if (!in_array('{urn:ietf:params:xml:ns:caldav}calendar-data', $requestedProperties)) {
+
+ // We always retrieve calendar-data, as we need it for filtering.
+ $requestedProperties[] = '{urn:ietf:params:xml:ns:caldav}calendar-data';
+
+ // If calendar-data wasn't explicitly requested, we need to remove
+ // it after processing.
+ $requestedCalendarData = false;
+ }
+
+ $properties = $this->server->getPropertiesForPath(
+ $this->server->getRequestUri(),
+ $requestedProperties,
+ 0
+ );
+
+ // This array should have only 1 element, the first calendar
+ // object.
+ $properties = current($properties);
+
+ // If there wasn't any calendar-data returned somehow, we ignore
+ // this.
+ if (isset($properties[200]['{urn:ietf:params:xml:ns:caldav}calendar-data'])) {
+
+ $validator = new CalendarQueryValidator();
+
+ $vObject = VObject\Reader::read($properties[200]['{urn:ietf:params:xml:ns:caldav}calendar-data']);
+ if ($validator->validate($vObject,$parser->filters)) {
+
+ // If the client didn't require the calendar-data property,
+ // we won't give it back.
+ if (!$requestedCalendarData) {
+ unset($properties[200]['{urn:ietf:params:xml:ns:caldav}calendar-data']);
+ } else {
+ if ($parser->expand) {
+ $vObject->expand($parser->expand['start'], $parser->expand['end']);
+ $properties[200]['{' . self::NS_CALDAV . '}calendar-data'] = $vObject->serialize();
+ }
+ }
+
+ $result = array($properties);
+
+ }
+
+ }
+
+ }
+ // If we're dealing with a calendar, the calendar itself is responsible
+ // for the calendar-query.
+ if ($node instanceof ICalendar && $depth = 1) {
+
+ $nodePaths = $node->calendarQuery($parser->filters);
+
+ foreach($nodePaths as $path) {
+
+ list($properties) =
+ $this->server->getPropertiesForPath($this->server->getRequestUri() . '/' . $path, $parser->requestedProperties);
+
+ if ($parser->expand) {
+ // We need to do some post-processing
+ $vObject = VObject\Reader::read($properties[200]['{urn:ietf:params:xml:ns:caldav}calendar-data']);
+ $vObject->expand($parser->expand['start'], $parser->expand['end']);
+ $properties[200]['{' . self::NS_CALDAV . '}calendar-data'] = $vObject->serialize();
+ }
+
+ $result[] = $properties;
+
+ }
+
+ }
+
+ $prefer = $this->server->getHTTPPRefer();
+
+ $this->server->httpResponse->sendStatus(207);
+ $this->server->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8');
+ $this->server->httpResponse->setHeader('Vary','Brief,Prefer');
+ $this->server->httpResponse->sendBody($this->server->generateMultiStatus($result, $prefer['return-minimal']));
+
+ }
+
+ /**
+ * This method is responsible for parsing the request and generating the
+ * response for the CALDAV:free-busy-query REPORT.
+ *
+ * @param \DOMNode $dom
+ * @return void
+ */
+ protected function freeBusyQueryReport(\DOMNode $dom) {
+
+ $start = null;
+ $end = null;
+
+ foreach($dom->firstChild->childNodes as $childNode) {
+
+ $clark = DAV\XMLUtil::toClarkNotation($childNode);
+ if ($clark == '{' . self::NS_CALDAV . '}time-range') {
+ $start = $childNode->getAttribute('start');
+ $end = $childNode->getAttribute('end');
+ break;
+ }
+
+ }
+ if ($start) {
+ $start = VObject\DateTimeParser::parseDateTime($start);
+ }
+ if ($end) {
+ $end = VObject\DateTimeParser::parseDateTime($end);
+ }
+
+ if (!$start && !$end) {
+ throw new DAV\Exception\BadRequest('The freebusy report must have a time-range filter');
+ }
+ $acl = $this->server->getPlugin('acl');
+
+ if (!$acl) {
+ throw new DAV\Exception('The ACL plugin must be loaded for free-busy queries to work');
+ }
+ $uri = $this->server->getRequestUri();
+ $acl->checkPrivileges($uri,'{' . self::NS_CALDAV . '}read-free-busy');
+
+ $calendar = $this->server->tree->getNodeForPath($uri);
+ if (!$calendar instanceof ICalendar) {
+ throw new DAV\Exception\NotImplemented('The free-busy-query REPORT is only implemented on calendars');
+ }
+
+ // Doing a calendar-query first, to make sure we get the most
+ // performance.
+ $urls = $calendar->calendarQuery(array(
+ 'name' => 'VCALENDAR',
+ 'comp-filters' => array(
+ array(
+ 'name' => 'VEVENT',
+ 'comp-filters' => array(),
+ 'prop-filters' => array(),
+ 'is-not-defined' => false,
+ 'time-range' => array(
+ 'start' => $start,
+ 'end' => $end,
+ ),
+ ),
+ ),
+ 'prop-filters' => array(),
+ 'is-not-defined' => false,
+ 'time-range' => null,
+ ));
+
+ $objects = array_map(function($url) use ($calendar) {
+ $obj = $calendar->getChild($url)->get();
+ return $obj;
+ }, $urls);
+
+ $generator = new VObject\FreeBusyGenerator();
+ $generator->setObjects($objects);
+ $generator->setTimeRange($start, $end);
+ $result = $generator->getResult();
+ $result = $result->serialize();
+
+ $this->server->httpResponse->sendStatus(200);
+ $this->server->httpResponse->setHeader('Content-Type', 'text/calendar');
+ $this->server->httpResponse->setHeader('Content-Length', strlen($result));
+ $this->server->httpResponse->sendBody($result);
+
+ }
+
+ /**
+ * This method is triggered before a file gets updated with new content.
+ *
+ * This plugin uses this method to ensure that CalDAV objects receive
+ * valid calendar data.
+ *
+ * @param string $path
+ * @param DAV\IFile $node
+ * @param resource $data
+ * @return void
+ */
+ public function beforeWriteContent($path, DAV\IFile $node, &$data) {
+
+ if (!$node instanceof ICalendarObject)
+ return;
+
+ $this->validateICalendar($data, $path);
+
+ }
+
+ /**
+ * This method is triggered before a new file is created.
+ *
+ * This plugin uses this method to ensure that newly created calendar
+ * objects contain valid calendar data.
+ *
+ * @param string $path
+ * @param resource $data
+ * @param DAV\ICollection $parentNode
+ * @return void
+ */
+ public function beforeCreateFile($path, &$data, DAV\ICollection $parentNode) {
+
+ if (!$parentNode instanceof Calendar)
+ return;
+
+ $this->validateICalendar($data, $path);
+
+ }
+
+ /**
+ * This event is triggered before any HTTP request is handled.
+ *
+ * We use this to intercept GET calls to notification nodes, and return the
+ * proper response.
+ *
+ * @param string $method
+ * @param string $path
+ * @return void
+ */
+ public function beforeMethod($method, $path) {
+
+ if ($method!=='GET') return;
+
+ try {
+ $node = $this->server->tree->getNodeForPath($path);
+ } catch (DAV\Exception\NotFound $e) {
+ return;
+ }
+
+ if (!$node instanceof Notifications\INode)
+ return;
+
+ if (!$this->server->checkPreconditions(true)) return false;
+ $dom = new \DOMDocument('1.0', 'UTF-8');
+
+ $dom->formatOutput = true;
+
+ $root = $dom->createElement('cs:notification');
+ foreach($this->server->xmlNamespaces as $namespace => $prefix) {
+ $root->setAttribute('xmlns:' . $prefix, $namespace);
+ }
+
+ $dom->appendChild($root);
+ $node->getNotificationType()->serializeBody($this->server, $root);
+
+ $this->server->httpResponse->setHeader('Content-Type','application/xml');
+ $this->server->httpResponse->setHeader('ETag',$node->getETag());
+ $this->server->httpResponse->sendStatus(200);
+ $this->server->httpResponse->sendBody($dom->saveXML());
+
+ return false;
+
+ }
+
+ /**
+ * Checks if the submitted iCalendar data is in fact, valid.
+ *
+ * An exception is thrown if it's not.
+ *
+ * @param resource|string $data
+ * @param string $path
+ * @return void
+ */
+ protected function validateICalendar(&$data, $path) {
+
+ // If it's a stream, we convert it to a string first.
+ if (is_resource($data)) {
+ $data = stream_get_contents($data);
+ }
+
+ // Converting the data to unicode, if needed.
+ $data = DAV\StringUtil::ensureUTF8($data);
+
+ try {
+
+ $vobj = VObject\Reader::read($data);
+
+ } catch (VObject\ParseException $e) {
+
+ throw new DAV\Exception\UnsupportedMediaType('This resource only supports valid iCalendar 2.0 data. Parse error: ' . $e->getMessage());
+
+ }
+
+ if ($vobj->name !== 'VCALENDAR') {
+ throw new DAV\Exception\UnsupportedMediaType('This collection can only support iCalendar objects.');
+ }
+
+ // Get the Supported Components for the target calendar
+ list($parentPath,$object) = DAV\URLUtil::splitPath($path);
+ $calendarProperties = $this->server->getProperties($parentPath,array('{urn:ietf:params:xml:ns:caldav}supported-calendar-component-set'));
+ $supportedComponents = $calendarProperties['{urn:ietf:params:xml:ns:caldav}supported-calendar-component-set']->getValue();
+
+ $foundType = null;
+ $foundUID = null;
+ foreach($vobj->getComponents() as $component) {
+ switch($component->name) {
+ case 'VTIMEZONE' :
+ continue 2;
+ case 'VEVENT' :
+ case 'VTODO' :
+ case 'VJOURNAL' :
+ if (is_null($foundType)) {
+ $foundType = $component->name;
+ if (!in_array($foundType, $supportedComponents)) {
+ throw new Exception\InvalidComponentType('This calendar only supports ' . implode(', ', $supportedComponents) . '. We found a ' . $foundType);
+ }
+ if (!isset($component->UID)) {
+ throw new DAV\Exception\BadRequest('Every ' . $component->name . ' component must have an UID');
+ }
+ $foundUID = (string)$component->UID;
+ } else {
+ if ($foundType !== $component->name) {
+ throw new DAV\Exception\BadRequest('A calendar object must only contain 1 component. We found a ' . $component->name . ' as well as a ' . $foundType);
+ }
+ if ($foundUID !== (string)$component->UID) {
+ throw new DAV\Exception\BadRequest('Every ' . $component->name . ' in this object must have identical UIDs');
+ }
+ }
+ break;
+ default :
+ throw new DAV\Exception\BadRequest('You are not allowed to create components of type: ' . $component->name . ' here');
+
+ }
+ }
+ if (!$foundType)
+ throw new DAV\Exception\BadRequest('iCalendar object must contain at least 1 of VEVENT, VTODO or VJOURNAL');
+
+ }
+
+ /**
+ * This method handles POST requests to the schedule-outbox.
+ *
+ * Currently, two types of requests are support:
+ * * FREEBUSY requests from RFC 6638
+ * * Simple iTIP messages from draft-desruisseaux-caldav-sched-04
+ *
+ * The latter is from an expired early draft of the CalDAV scheduling
+ * extensions, but iCal depends on a feature from that spec, so we
+ * implement it.
+ *
+ * @param Schedule\IOutbox $outboxNode
+ * @param string $outboxUri
+ * @return void
+ */
+ public function outboxRequest(Schedule\IOutbox $outboxNode, $outboxUri) {
+
+ // Parsing the request body
+ try {
+ $vObject = VObject\Reader::read($this->server->httpRequest->getBody(true));
+ } catch (VObject\ParseException $e) {
+ throw new DAV\Exception\BadRequest('The request body must be a valid iCalendar object. Parse error: ' . $e->getMessage());
+ }
+
+ // The incoming iCalendar object must have a METHOD property, and a
+ // component. The combination of both determines what type of request
+ // this is.
+ $componentType = null;
+ foreach($vObject->getComponents() as $component) {
+ if ($component->name !== 'VTIMEZONE') {
+ $componentType = $component->name;
+ break;
+ }
+ }
+ if (is_null($componentType)) {
+ throw new DAV\Exception\BadRequest('We expected at least one VTODO, VJOURNAL, VFREEBUSY or VEVENT component');
+ }
+
+ // Validating the METHOD
+ $method = strtoupper((string)$vObject->METHOD);
+ if (!$method) {
+ throw new DAV\Exception\BadRequest('A METHOD property must be specified in iTIP messages');
+ }
+
+ // So we support two types of requests:
+ //
+ // REQUEST with a VFREEBUSY component
+ // REQUEST, REPLY, ADD, CANCEL on VEVENT components
+
+ $acl = $this->server->getPlugin('acl');
+
+ if ($componentType === 'VFREEBUSY' && $method === 'REQUEST') {
+
+ $acl && $acl->checkPrivileges($outboxUri,'{' . Plugin::NS_CALDAV . '}schedule-query-freebusy');
+ $this->handleFreeBusyRequest($outboxNode, $vObject);
+
+ } elseif ($componentType === 'VEVENT' && in_array($method, array('REQUEST','REPLY','ADD','CANCEL'))) {
+
+ $acl && $acl->checkPrivileges($outboxUri,'{' . Plugin::NS_CALDAV . '}schedule-post-vevent');
+ $this->handleEventNotification($outboxNode, $vObject);
+
+ } else {
+
+ throw new DAV\Exception\NotImplemented('SabreDAV supports only VFREEBUSY (REQUEST) and VEVENT (REQUEST, REPLY, ADD, CANCEL)');
+
+ }
+
+ }
+
+ /**
+ * This method handles the REQUEST, REPLY, ADD and CANCEL methods for
+ * VEVENT iTip messages.
+ *
+ * @return void
+ */
+ protected function handleEventNotification(Schedule\IOutbox $outboxNode, VObject\Component $vObject) {
+
+ $originator = $this->server->httpRequest->getHeader('Originator');
+ $recipients = $this->server->httpRequest->getHeader('Recipient');
+
+ if (!$originator) {
+ throw new DAV\Exception\BadRequest('The Originator: header must be specified when making POST requests');
+ }
+ if (!$recipients) {
+ throw new DAV\Exception\BadRequest('The Recipient: header must be specified when making POST requests');
+ }
+
+ $recipients = explode(',',$recipients);
+ foreach($recipients as $k=>$recipient) {
+
+ $recipient = trim($recipient);
+ if (!preg_match('/^mailto:(.*)@(.*)$/i', $recipient)) {
+ throw new DAV\Exception\BadRequest('Recipients must start with mailto: and must be valid email address');
+ }
+ $recipient = substr($recipient, 7);
+ $recipients[$k] = $recipient;
+ }
+
+ // We need to make sure that 'originator' matches one of the email
+ // addresses of the selected principal.
+ $principal = $outboxNode->getOwner();
+ $props = $this->server->getProperties($principal,array(
+ '{' . self::NS_CALDAV . '}calendar-user-address-set',
+ ));
+
+ $addresses = array();
+ if (isset($props['{' . self::NS_CALDAV . '}calendar-user-address-set'])) {
+ $addresses = $props['{' . self::NS_CALDAV . '}calendar-user-address-set']->getHrefs();
+ }
+
+ $found = false;
+ foreach($addresses as $address) {
+
+ // Trimming the / on both sides, just in case..
+ if (rtrim(strtolower($originator),'/') === rtrim(strtolower($address),'/')) {
+ $found = true;
+ break;
+ }
+
+ }
+
+ if (!$found) {
+ throw new DAV\Exception\Forbidden('The addresses specified in the Originator header did not match any addresses in the owners calendar-user-address-set header');
+ }
+
+ // If the Originator header was a url, and not a mailto: address..
+ // we're going to try to pull the mailto: from the vobject body.
+ if (strtolower(substr($originator,0,7)) !== 'mailto:') {
+ $originator = (string)$vObject->VEVENT->ORGANIZER;
+
+ }
+ if (strtolower(substr($originator,0,7)) !== 'mailto:') {
+ throw new DAV\Exception\Forbidden('Could not find mailto: address in both the Orignator header, and the ORGANIZER property in the VEVENT');
+ }
+ $originator = substr($originator,7);
+
+ $result = $this->iMIPMessage($originator, $recipients, $vObject, $principal);
+ $this->server->httpResponse->sendStatus(200);
+ $this->server->httpResponse->setHeader('Content-Type','application/xml');
+ $this->server->httpResponse->sendBody($this->generateScheduleResponse($result));
+
+ }
+
+ /**
+ * Sends an iMIP message by email.
+ *
+ * This method must return an array with status codes per recipient.
+ * This should look something like:
+ *
+ * array(
+ * 'user1@example.org' => '2.0;Success'
+ * )
+ *
+ * Formatting for this status code can be found at:
+ * https://tools.ietf.org/html/rfc5545#section-3.8.8.3
+ *
+ * A list of valid status codes can be found at:
+ * https://tools.ietf.org/html/rfc5546#section-3.6
+ *
+ * @param string $originator
+ * @param array $recipients
+ * @param VObject\Component $vObject
+ * @param string $principal Principal url
+ * @return array
+ */
+ protected function iMIPMessage($originator, array $recipients, VObject\Component $vObject, $principal) {
+
+ if (!$this->imipHandler) {
+ $resultStatus = '5.2;This server does not support this operation';
+ } else {
+ $this->imipHandler->sendMessage($originator, $recipients, $vObject, $principal);
+ $resultStatus = '2.0;Success';
+ }
+
+ $result = array();
+ foreach($recipients as $recipient) {
+ $result[$recipient] = $resultStatus;
+ }
+
+ return $result;
+
+ }
+
+ /**
+ * Generates a schedule-response XML body
+ *
+ * The recipients array is a key->value list, containing email addresses
+ * and iTip status codes. See the iMIPMessage method for a description of
+ * the value.
+ *
+ * @param array $recipients
+ * @return string
+ */
+ public function generateScheduleResponse(array $recipients) {
+
+ $dom = new \DOMDocument('1.0','utf-8');
+ $dom->formatOutput = true;
+ $xscheduleResponse = $dom->createElement('cal:schedule-response');
+ $dom->appendChild($xscheduleResponse);
+
+ foreach($this->server->xmlNamespaces as $namespace=>$prefix) {
+
+ $xscheduleResponse->setAttribute('xmlns:' . $prefix, $namespace);
+
+ }
+
+ foreach($recipients as $recipient=>$status) {
+ $xresponse = $dom->createElement('cal:response');
+
+ $xrecipient = $dom->createElement('cal:recipient');
+ $xrecipient->appendChild($dom->createTextNode($recipient));
+ $xresponse->appendChild($xrecipient);
+
+ $xrequestStatus = $dom->createElement('cal:request-status');
+ $xrequestStatus->appendChild($dom->createTextNode($status));
+ $xresponse->appendChild($xrequestStatus);
+
+ $xscheduleResponse->appendChild($xresponse);
+
+ }
+
+ return $dom->saveXML();
+
+ }
+
+ /**
+ * This method is responsible for parsing a free-busy query request and
+ * returning it's result.
+ *
+ * @param Schedule\IOutbox $outbox
+ * @param string $request
+ * @return string
+ */
+ protected function handleFreeBusyRequest(Schedule\IOutbox $outbox, VObject\Component $vObject) {
+
+ $vFreeBusy = $vObject->VFREEBUSY;
+ $organizer = $vFreeBusy->organizer;
+
+ $organizer = (string)$organizer;
+
+ // Validating if the organizer matches the owner of the inbox.
+ $owner = $outbox->getOwner();
+
+ $caldavNS = '{' . Plugin::NS_CALDAV . '}';
+
+ $uas = $caldavNS . 'calendar-user-address-set';
+ $props = $this->server->getProperties($owner,array($uas));
+
+ if (empty($props[$uas]) || !in_array($organizer, $props[$uas]->getHrefs())) {
+ throw new DAV\Exception\Forbidden('The organizer in the request did not match any of the addresses for the owner of this inbox');
+ }
+
+ if (!isset($vFreeBusy->ATTENDEE)) {
+ throw new DAV\Exception\BadRequest('You must at least specify 1 attendee');
+ }
+
+ $attendees = array();
+ foreach($vFreeBusy->ATTENDEE as $attendee) {
+ $attendees[]= (string)$attendee;
+ }
+
+
+ if (!isset($vFreeBusy->DTSTART) || !isset($vFreeBusy->DTEND)) {
+ throw new DAV\Exception\BadRequest('DTSTART and DTEND must both be specified');
+ }
+
+ $startRange = $vFreeBusy->DTSTART->getDateTime();
+ $endRange = $vFreeBusy->DTEND->getDateTime();
+
+ $results = array();
+ foreach($attendees as $attendee) {
+ $results[] = $this->getFreeBusyForEmail($attendee, $startRange, $endRange, $vObject);
+ }
+
+ $dom = new \DOMDocument('1.0','utf-8');
+ $dom->formatOutput = true;
+ $scheduleResponse = $dom->createElement('cal:schedule-response');
+ foreach($this->server->xmlNamespaces as $namespace=>$prefix) {
+
+ $scheduleResponse->setAttribute('xmlns:' . $prefix,$namespace);
+
+ }
+ $dom->appendChild($scheduleResponse);
+
+ foreach($results as $result) {
+ $response = $dom->createElement('cal:response');
+
+ $recipient = $dom->createElement('cal:recipient');
+ $recipientHref = $dom->createElement('d:href');
+
+ $recipientHref->appendChild($dom->createTextNode($result['href']));
+ $recipient->appendChild($recipientHref);
+ $response->appendChild($recipient);
+
+ $reqStatus = $dom->createElement('cal:request-status');
+ $reqStatus->appendChild($dom->createTextNode($result['request-status']));
+ $response->appendChild($reqStatus);
+
+ if (isset($result['calendar-data'])) {
+
+ $calendardata = $dom->createElement('cal:calendar-data');
+ $calendardata->appendChild($dom->createTextNode(str_replace("\r\n","\n",$result['calendar-data']->serialize())));
+ $response->appendChild($calendardata);
+
+ }
+ $scheduleResponse->appendChild($response);
+ }
+
+ $this->server->httpResponse->sendStatus(200);
+ $this->server->httpResponse->setHeader('Content-Type','application/xml');
+ $this->server->httpResponse->sendBody($dom->saveXML());
+
+ }
+
+ /**
+ * Returns free-busy information for a specific address. The returned
+ * data is an array containing the following properties:
+ *
+ * calendar-data : A VFREEBUSY VObject
+ * request-status : an iTip status code.
+ * href: The principal's email address, as requested
+ *
+ * The following request status codes may be returned:
+ * * 2.0;description
+ * * 3.7;description
+ *
+ * @param string $email address
+ * @param \DateTime $start
+ * @param \DateTime $end
+ * @param VObject\Component $request
+ * @return array
+ */
+ protected function getFreeBusyForEmail($email, \DateTime $start, \DateTime $end, VObject\Component $request) {
+
+ $caldavNS = '{' . Plugin::NS_CALDAV . '}';
+
+ $aclPlugin = $this->server->getPlugin('acl');
+ if (substr($email,0,7)==='mailto:') $email = substr($email,7);
+
+ $result = $aclPlugin->principalSearch(
+ array('{http://sabredav.org/ns}email-address' => $email),
+ array(
+ '{DAV:}principal-URL', $caldavNS . 'calendar-home-set',
+ '{http://sabredav.org/ns}email-address',
+ )
+ );
+
+ if (!count($result)) {
+ return array(
+ 'request-status' => '3.7;Could not find principal',
+ 'href' => 'mailto:' . $email,
+ );
+ }
+
+ if (!isset($result[0][200][$caldavNS . 'calendar-home-set'])) {
+ return array(
+ 'request-status' => '3.7;No calendar-home-set property found',
+ 'href' => 'mailto:' . $email,
+ );
+ }
+ $homeSet = $result[0][200][$caldavNS . 'calendar-home-set']->getHref();
+
+ // Grabbing the calendar list
+ $objects = array();
+ foreach($this->server->tree->getNodeForPath($homeSet)->getChildren() as $node) {
+ if (!$node instanceof ICalendar) {
+ continue;
+ }
+ $aclPlugin->checkPrivileges($homeSet . $node->getName() ,$caldavNS . 'read-free-busy');
+
+ // Getting the list of object uris within the time-range
+ $urls = $node->calendarQuery(array(
+ 'name' => 'VCALENDAR',
+ 'comp-filters' => array(
+ array(
+ 'name' => 'VEVENT',
+ 'comp-filters' => array(),
+ 'prop-filters' => array(),
+ 'is-not-defined' => false,
+ 'time-range' => array(
+ 'start' => $start,
+ 'end' => $end,
+ ),
+ ),
+ ),
+ 'prop-filters' => array(),
+ 'is-not-defined' => false,
+ 'time-range' => null,
+ ));
+
+ $calObjects = array_map(function($url) use ($node) {
+ $obj = $node->getChild($url)->get();
+ return $obj;
+ }, $urls);
+
+ $objects = array_merge($objects,$calObjects);
+
+ }
+
+ $vcalendar = new VObject\Component\VCalendar();
+ $vcalendar->VERSION = '2.0';
+ $vcalendar->METHOD = 'REPLY';
+ $vcalendar->CALSCALE = 'GREGORIAN';
+ $vcalendar->PRODID = '-//SabreDAV//SabreDAV ' . DAV\Version::VERSION . '//EN';
+
+ $generator = new VObject\FreeBusyGenerator();
+ $generator->setObjects($objects);
+ $generator->setTimeRange($start, $end);
+ $generator->setBaseObject($vcalendar);
+
+ $result = $generator->getResult();
+
+ $vcalendar->VFREEBUSY->ATTENDEE = 'mailto:' . $email;
+ $vcalendar->VFREEBUSY->UID = (string)$request->VFREEBUSY->UID;
+ $vcalendar->VFREEBUSY->ORGANIZER = clone $request->VFREEBUSY->ORGANIZER;
+
+ return array(
+ 'calendar-data' => $result,
+ 'request-status' => '2.0;Success',
+ 'href' => 'mailto:' . $email,
+ );
+ }
+
+ /**
+ * This method is used to generate HTML output for the
+ * DAV\Browser\Plugin. This allows us to generate an interface users
+ * can use to create new calendars.
+ *
+ * @param DAV\INode $node
+ * @param string $output
+ * @return bool
+ */
+ public function htmlActionsPanel(DAV\INode $node, &$output) {
+
+ if (!$node instanceof UserCalendars)
+ return;
+
+ $output.= '<tr><td colspan="2"><form method="post" action="">
+ <h3>Create new calendar</h3>
+ <input type="hidden" name="sabreAction" value="mkcalendar" />
+ <label>Name (uri):</label> <input type="text" name="name" /><br />
+ <label>Display name:</label> <input type="text" name="{DAV:}displayname" /><br />
+ <input type="submit" value="create" />
+ </form>
+ </td></tr>';
+
+ return false;
+
+ }
+
+ /**
+ * This method allows us to intercept the 'mkcalendar' sabreAction. This
+ * action enables the user to create new calendars from the browser plugin.
+ *
+ * @param string $uri
+ * @param string $action
+ * @param array $postVars
+ * @return bool
+ */
+ public function browserPostAction($uri, $action, array $postVars) {
+
+ if ($action!=='mkcalendar')
+ return;
+
+ $resourceType = array('{DAV:}collection','{urn:ietf:params:xml:ns:caldav}calendar');
+ $properties = array();
+ if (isset($postVars['{DAV:}displayname'])) {
+ $properties['{DAV:}displayname'] = $postVars['{DAV:}displayname'];
+ }
+ $this->server->createCollection($uri . '/' . $postVars['name'],$resourceType,$properties);
+ return false;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/Principal/Collection.php b/vendor/sabre/dav/lib/Sabre/CalDAV/Principal/Collection.php
new file mode 100644
index 000000000..4fc70e265
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/Principal/Collection.php
@@ -0,0 +1,32 @@
+<?php
+
+namespace Sabre\CalDAV\Principal;
+use Sabre\DAVACL;
+
+/**
+ * Principal collection
+ *
+ * This is an alternative collection to the standard ACL principal collection.
+ * This collection adds support for the calendar-proxy-read and
+ * calendar-proxy-write sub-principals, as defined by the caldav-proxy
+ * specification.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Collection extends DAVACL\AbstractPrincipalCollection {
+
+ /**
+ * Returns a child object based on principal information
+ *
+ * @param array $principalInfo
+ * @return User
+ */
+ public function getChildForPrincipal(array $principalInfo) {
+
+ return new User($this->principalBackend, $principalInfo);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/Principal/IProxyRead.php b/vendor/sabre/dav/lib/Sabre/CalDAV/Principal/IProxyRead.php
new file mode 100644
index 000000000..a774b2aad
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/Principal/IProxyRead.php
@@ -0,0 +1,19 @@
+<?php
+
+namespace Sabre\CalDAV\Principal;
+
+use Sabre\DAVACL;
+
+/**
+ * ProxyRead principal interface
+ *
+ * Any principal node implementing this interface will be picked up as a 'proxy
+ * principal group'.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+interface IProxyRead extends DAVACL\IPrincipal {
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/Principal/IProxyWrite.php b/vendor/sabre/dav/lib/Sabre/CalDAV/Principal/IProxyWrite.php
new file mode 100644
index 000000000..48c84d25d
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/Principal/IProxyWrite.php
@@ -0,0 +1,19 @@
+<?php
+
+namespace Sabre\CalDAV\Principal;
+
+use Sabre\DAVACL;
+
+/**
+ * ProxyWrite principal interface
+ *
+ * Any principal node implementing this interface will be picked up as a 'proxy
+ * principal group'.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+interface IProxyWrite extends DAVACL\IPrincipal {
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/Principal/ProxyRead.php b/vendor/sabre/dav/lib/Sabre/CalDAV/Principal/ProxyRead.php
new file mode 100644
index 000000000..0a8bf57b0
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/Principal/ProxyRead.php
@@ -0,0 +1,180 @@
+<?php
+
+namespace Sabre\CalDAV\Principal;
+use Sabre\DAVACL;
+use Sabre\DAV;
+
+/**
+ * ProxyRead principal
+ *
+ * This class represents a principal group, hosted under the main principal.
+ * This is needed to implement 'Calendar delegation' support. This class is
+ * instantiated by User.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class ProxyRead implements IProxyRead {
+
+ /**
+ * Principal information from the parent principal.
+ *
+ * @var array
+ */
+ protected $principalInfo;
+
+ /**
+ * Principal backend
+ *
+ * @var DAVACL\PrincipalBackend\BackendInterface
+ */
+ protected $principalBackend;
+
+ /**
+ * Creates the object.
+ *
+ * Note that you MUST supply the parent principal information.
+ *
+ * @param DAVACL\PrincipalBackend\BackendInterface $principalBackend
+ * @param array $principalInfo
+ */
+ public function __construct(DAVACL\PrincipalBackend\BackendInterface $principalBackend, array $principalInfo) {
+
+ $this->principalInfo = $principalInfo;
+ $this->principalBackend = $principalBackend;
+
+ }
+
+ /**
+ * Returns this principals name.
+ *
+ * @return string
+ */
+ public function getName() {
+
+ return 'calendar-proxy-read';
+
+ }
+
+ /**
+ * Returns the last modification time
+ *
+ * @return null
+ */
+ public function getLastModified() {
+
+ return null;
+
+ }
+
+ /**
+ * Deletes the current node
+ *
+ * @throws DAV\Exception\Forbidden
+ * @return void
+ */
+ public function delete() {
+
+ throw new DAV\Exception\Forbidden('Permission denied to delete node');
+
+ }
+
+ /**
+ * Renames the node
+ *
+ * @throws DAV\Exception\Forbidden
+ * @param string $name The new name
+ * @return void
+ */
+ public function setName($name) {
+
+ throw new DAV\Exception\Forbidden('Permission denied to rename file');
+
+ }
+
+
+ /**
+ * Returns a list of alternative urls for a principal
+ *
+ * This can for example be an email address, or ldap url.
+ *
+ * @return array
+ */
+ public function getAlternateUriSet() {
+
+ return array();
+
+ }
+
+ /**
+ * Returns the full principal url
+ *
+ * @return string
+ */
+ public function getPrincipalUrl() {
+
+ return $this->principalInfo['uri'] . '/' . $this->getName();
+
+ }
+
+ /**
+ * Returns the list of group members
+ *
+ * If this principal is a group, this function should return
+ * all member principal uri's for the group.
+ *
+ * @return array
+ */
+ public function getGroupMemberSet() {
+
+ return $this->principalBackend->getGroupMemberSet($this->getPrincipalUrl());
+
+ }
+
+ /**
+ * Returns the list of groups this principal is member of
+ *
+ * If this principal is a member of a (list of) groups, this function
+ * should return a list of principal uri's for it's members.
+ *
+ * @return array
+ */
+ public function getGroupMembership() {
+
+ return $this->principalBackend->getGroupMembership($this->getPrincipalUrl());
+
+ }
+
+ /**
+ * Sets a list of group members
+ *
+ * If this principal is a group, this method sets all the group members.
+ * The list of members is always overwritten, never appended to.
+ *
+ * This method should throw an exception if the members could not be set.
+ *
+ * @param array $principals
+ * @return void
+ */
+ public function setGroupMemberSet(array $principals) {
+
+ $this->principalBackend->setGroupMemberSet($this->getPrincipalUrl(), $principals);
+
+ }
+
+ /**
+ * Returns the displayname
+ *
+ * This should be a human readable name for the principal.
+ * If none is available, return the nodename.
+ *
+ * @return string
+ */
+ public function getDisplayName() {
+
+ return $this->getName();
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/Principal/ProxyWrite.php b/vendor/sabre/dav/lib/Sabre/CalDAV/Principal/ProxyWrite.php
new file mode 100644
index 000000000..c9b136fe0
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/Principal/ProxyWrite.php
@@ -0,0 +1,180 @@
+<?php
+
+namespace Sabre\CalDAV\Principal;
+use Sabre\DAVACL;
+use Sabre\DAV;
+
+/**
+ * ProxyWrite principal
+ *
+ * This class represents a principal group, hosted under the main principal.
+ * This is needed to implement 'Calendar delegation' support. This class is
+ * instantiated by User.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class ProxyWrite implements IProxyWrite {
+
+ /**
+ * Parent principal information
+ *
+ * @var array
+ */
+ protected $principalInfo;
+
+ /**
+ * Principal Backend
+ *
+ * @var DAVACL\PrincipalBackend\BackendInterface
+ */
+ protected $principalBackend;
+
+ /**
+ * Creates the object
+ *
+ * Note that you MUST supply the parent principal information.
+ *
+ * @param DAVACL\PrincipalBackend\BackendInterface $principalBackend
+ * @param array $principalInfo
+ */
+ public function __construct(DAVACL\PrincipalBackend\BackendInterface $principalBackend, array $principalInfo) {
+
+ $this->principalInfo = $principalInfo;
+ $this->principalBackend = $principalBackend;
+
+ }
+
+ /**
+ * Returns this principals name.
+ *
+ * @return string
+ */
+ public function getName() {
+
+ return 'calendar-proxy-write';
+
+ }
+
+ /**
+ * Returns the last modification time
+ *
+ * @return null
+ */
+ public function getLastModified() {
+
+ return null;
+
+ }
+
+ /**
+ * Deletes the current node
+ *
+ * @throws DAV\Exception\Forbidden
+ * @return void
+ */
+ public function delete() {
+
+ throw new DAV\Exception\Forbidden('Permission denied to delete node');
+
+ }
+
+ /**
+ * Renames the node
+ *
+ * @throws DAV\Exception\Forbidden
+ * @param string $name The new name
+ * @return void
+ */
+ public function setName($name) {
+
+ throw new DAV\Exception\Forbidden('Permission denied to rename file');
+
+ }
+
+
+ /**
+ * Returns a list of alternative urls for a principal
+ *
+ * This can for example be an email address, or ldap url.
+ *
+ * @return array
+ */
+ public function getAlternateUriSet() {
+
+ return array();
+
+ }
+
+ /**
+ * Returns the full principal url
+ *
+ * @return string
+ */
+ public function getPrincipalUrl() {
+
+ return $this->principalInfo['uri'] . '/' . $this->getName();
+
+ }
+
+ /**
+ * Returns the list of group members
+ *
+ * If this principal is a group, this function should return
+ * all member principal uri's for the group.
+ *
+ * @return array
+ */
+ public function getGroupMemberSet() {
+
+ return $this->principalBackend->getGroupMemberSet($this->getPrincipalUrl());
+
+ }
+
+ /**
+ * Returns the list of groups this principal is member of
+ *
+ * If this principal is a member of a (list of) groups, this function
+ * should return a list of principal uri's for it's members.
+ *
+ * @return array
+ */
+ public function getGroupMembership() {
+
+ return $this->principalBackend->getGroupMembership($this->getPrincipalUrl());
+
+ }
+
+ /**
+ * Sets a list of group members
+ *
+ * If this principal is a group, this method sets all the group members.
+ * The list of members is always overwritten, never appended to.
+ *
+ * This method should throw an exception if the members could not be set.
+ *
+ * @param array $principals
+ * @return void
+ */
+ public function setGroupMemberSet(array $principals) {
+
+ $this->principalBackend->setGroupMemberSet($this->getPrincipalUrl(), $principals);
+
+ }
+
+ /**
+ * Returns the displayname
+ *
+ * This should be a human readable name for the principal.
+ * If none is available, return the nodename.
+ *
+ * @return string
+ */
+ public function getDisplayName() {
+
+ return $this->getName();
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/Principal/User.php b/vendor/sabre/dav/lib/Sabre/CalDAV/Principal/User.php
new file mode 100644
index 000000000..d37ca115d
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/Principal/User.php
@@ -0,0 +1,134 @@
+<?php
+
+namespace Sabre\CalDAV\Principal;
+use Sabre\DAV;
+use Sabre\DAVACL;
+
+/**
+ * CalDAV principal
+ *
+ * This is a standard user-principal for CalDAV. This principal is also a
+ * collection and returns the caldav-proxy-read and caldav-proxy-write child
+ * principals.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class User extends DAVACL\Principal implements DAV\ICollection {
+
+ /**
+ * Creates a new file in the directory
+ *
+ * @param string $name Name of the file
+ * @param resource $data Initial payload, passed as a readable stream resource.
+ * @throws DAV\Exception\Forbidden
+ * @return void
+ */
+ public function createFile($name, $data = null) {
+
+ throw new DAV\Exception\Forbidden('Permission denied to create file (filename ' . $name . ')');
+
+ }
+
+ /**
+ * Creates a new subdirectory
+ *
+ * @param string $name
+ * @throws DAV\Exception\Forbidden
+ * @return void
+ */
+ public function createDirectory($name) {
+
+ throw new DAV\Exception\Forbidden('Permission denied to create directory');
+
+ }
+
+ /**
+ * Returns a specific child node, referenced by its name
+ *
+ * @param string $name
+ * @return DAV\INode
+ */
+ public function getChild($name) {
+
+ $principal = $this->principalBackend->getPrincipalByPath($this->getPrincipalURL() . '/' . $name);
+ if (!$principal) {
+ throw new DAV\Exception\NotFound('Node with name ' . $name . ' was not found');
+ }
+ if ($name === 'calendar-proxy-read')
+ return new ProxyRead($this->principalBackend, $this->principalProperties);
+
+ if ($name === 'calendar-proxy-write')
+ return new ProxyWrite($this->principalBackend, $this->principalProperties);
+
+ throw new DAV\Exception\NotFound('Node with name ' . $name . ' was not found');
+
+ }
+
+ /**
+ * Returns an array with all the child nodes
+ *
+ * @return DAV\INode[]
+ */
+ public function getChildren() {
+
+ $r = array();
+ if ($this->principalBackend->getPrincipalByPath($this->getPrincipalURL() . '/calendar-proxy-read')) {
+ $r[] = new ProxyRead($this->principalBackend, $this->principalProperties);
+ }
+ if ($this->principalBackend->getPrincipalByPath($this->getPrincipalURL() . '/calendar-proxy-write')) {
+ $r[] = new ProxyWrite($this->principalBackend, $this->principalProperties);
+ }
+
+ return $r;
+
+ }
+
+ /**
+ * Returns whether or not the child node exists
+ *
+ * @param string $name
+ * @return bool
+ */
+ public function childExists($name) {
+
+ try {
+ $this->getChild($name);
+ return true;
+ } catch (DAV\Exception\NotFound $e) {
+ return false;
+ }
+
+ }
+
+ /**
+ * Returns a list of ACE's for this node.
+ *
+ * Each ACE has the following properties:
+ * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are
+ * currently the only supported privileges
+ * * 'principal', a url to the principal who owns the node
+ * * 'protected' (optional), indicating that this ACE is not allowed to
+ * be updated.
+ *
+ * @return array
+ */
+ public function getACL() {
+
+ $acl = parent::getACL();
+ $acl[] = array(
+ 'privilege' => '{DAV:}read',
+ 'principal' => $this->principalProperties['uri'] . '/calendar-proxy-read',
+ 'protected' => true,
+ );
+ $acl[] = array(
+ 'privilege' => '{DAV:}read',
+ 'principal' => $this->principalProperties['uri'] . '/calendar-proxy-write',
+ 'protected' => true,
+ );
+ return $acl;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/Property/AllowedSharingModes.php b/vendor/sabre/dav/lib/Sabre/CalDAV/Property/AllowedSharingModes.php
new file mode 100644
index 000000000..5284baf3a
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/Property/AllowedSharingModes.php
@@ -0,0 +1,74 @@
+<?php
+
+namespace Sabre\CalDAV\Property;
+
+use Sabre\DAV;
+
+/**
+ * AllowedSharingModes
+ *
+ * This property encodes the 'allowed-sharing-modes' property, as defined by
+ * the 'caldav-sharing-02' spec, in the http://calendarserver.org/ns/
+ * namespace.
+ *
+ * This property is a representation of the supported-calendar_component-set
+ * property in the CalDAV namespace. It simply requires an array of components,
+ * such as VEVENT, VTODO
+ *
+ * @see https://trac.calendarserver.org/browser/CalendarServer/trunk/doc/Extensions/caldav-sharing-02.txt
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class AllowedSharingModes extends DAV\Property {
+
+ /**
+ * Whether or not a calendar can be shared with another user
+ *
+ * @var bool
+ */
+ protected $canBeShared;
+
+ /**
+ * Whether or not the calendar can be placed on a public url.
+ *
+ * @var bool
+ */
+ protected $canBePublished;
+
+ /**
+ * Constructor
+ *
+ * @param bool $canBeShared
+ * @param bool $canBePublished
+ * @return void
+ */
+ public function __construct($canBeShared, $canBePublished) {
+
+ $this->canBeShared = $canBeShared;
+ $this->canBePublished = $canBePublished;
+
+ }
+
+ /**
+ * Serializes the property in a DOMDocument
+ *
+ * @param DAV\Server $server
+ * @param \DOMElement $node
+ * @return void
+ */
+ public function serialize(DAV\Server $server, \DOMElement $node) {
+
+ $doc = $node->ownerDocument;
+ if ($this->canBeShared) {
+ $xcomp = $doc->createElement('cs:can-be-shared');
+ $node->appendChild($xcomp);
+ }
+ if ($this->canBePublished) {
+ $xcomp = $doc->createElement('cs:can-be-published');
+ $node->appendChild($xcomp);
+ }
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/Property/Invite.php b/vendor/sabre/dav/lib/Sabre/CalDAV/Property/Invite.php
new file mode 100644
index 000000000..e955e5f1c
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/Property/Invite.php
@@ -0,0 +1,227 @@
+<?php
+
+namespace Sabre\CalDAV\Property;
+
+use Sabre\CalDAV\SharingPlugin as SharingPlugin;
+use Sabre\DAV;
+use Sabre\CalDAV;
+
+/**
+ * Invite property
+ *
+ * This property encodes the 'invite' property, as defined by
+ * the 'caldav-sharing-02' spec, in the http://calendarserver.org/ns/
+ * namespace.
+ *
+ * @see https://trac.calendarserver.org/browser/CalendarServer/trunk/doc/Extensions/caldav-sharing-02.txt
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Invite extends DAV\Property {
+
+ /**
+ * The list of users a calendar has been shared to.
+ *
+ * @var array
+ */
+ protected $users;
+
+ /**
+ * The organizer contains information about the person who shared the
+ * object.
+ *
+ * @var array
+ */
+ protected $organizer;
+
+ /**
+ * Creates the property.
+ *
+ * Users is an array. Each element of the array has the following
+ * properties:
+ *
+ * * href - Often a mailto: address
+ * * commonName - Optional, for example a first and lastname for a user.
+ * * status - One of the SharingPlugin::STATUS_* constants.
+ * * readOnly - true or false
+ * * summary - Optional, description of the share
+ *
+ * The organizer key is optional to specify. It's only useful when a
+ * 'sharee' requests the sharing information.
+ *
+ * The organizer may have the following properties:
+ * * href - Often a mailto: address.
+ * * commonName - Optional human-readable name.
+ * * firstName - Optional first name.
+ * * lastName - Optional last name.
+ *
+ * If you wonder why these two structures are so different, I guess a
+ * valid answer is that the current spec is still a draft.
+ *
+ * @param array $users
+ */
+ public function __construct(array $users, array $organizer = null) {
+
+ $this->users = $users;
+ $this->organizer = $organizer;
+
+ }
+
+ /**
+ * Returns the list of users, as it was passed to the constructor.
+ *
+ * @return array
+ */
+ public function getValue() {
+
+ return $this->users;
+
+ }
+
+ /**
+ * Serializes the property in a DOMDocument
+ *
+ * @param DAV\Server $server
+ * @param \DOMElement $node
+ * @return void
+ */
+ public function serialize(DAV\Server $server,\DOMElement $node) {
+
+ $doc = $node->ownerDocument;
+
+ if (!is_null($this->organizer)) {
+
+ $xorganizer = $doc->createElement('cs:organizer');
+
+ $href = $doc->createElement('d:href');
+ $href->appendChild($doc->createTextNode($this->organizer['href']));
+ $xorganizer->appendChild($href);
+
+ if (isset($this->organizer['commonName']) && $this->organizer['commonName']) {
+ $commonName = $doc->createElement('cs:common-name');
+ $commonName->appendChild($doc->createTextNode($this->organizer['commonName']));
+ $xorganizer->appendChild($commonName);
+ }
+ if (isset($this->organizer['firstName']) && $this->organizer['firstName']) {
+ $firstName = $doc->createElement('cs:first-name');
+ $firstName->appendChild($doc->createTextNode($this->organizer['firstName']));
+ $xorganizer->appendChild($firstName);
+ }
+ if (isset($this->organizer['lastName']) && $this->organizer['lastName']) {
+ $lastName = $doc->createElement('cs:last-name');
+ $lastName->appendChild($doc->createTextNode($this->organizer['lastName']));
+ $xorganizer->appendChild($lastName);
+ }
+
+ $node->appendChild($xorganizer);
+
+
+ }
+
+ foreach($this->users as $user) {
+
+ $xuser = $doc->createElement('cs:user');
+
+ $href = $doc->createElement('d:href');
+ $href->appendChild($doc->createTextNode($user['href']));
+ $xuser->appendChild($href);
+
+ if (isset($user['commonName']) && $user['commonName']) {
+ $commonName = $doc->createElement('cs:common-name');
+ $commonName->appendChild($doc->createTextNode($user['commonName']));
+ $xuser->appendChild($commonName);
+ }
+
+ switch($user['status']) {
+
+ case SharingPlugin::STATUS_ACCEPTED :
+ $status = $doc->createElement('cs:invite-accepted');
+ $xuser->appendChild($status);
+ break;
+ case SharingPlugin::STATUS_DECLINED :
+ $status = $doc->createElement('cs:invite-declined');
+ $xuser->appendChild($status);
+ break;
+ case SharingPlugin::STATUS_NORESPONSE :
+ $status = $doc->createElement('cs:invite-noresponse');
+ $xuser->appendChild($status);
+ break;
+ case SharingPlugin::STATUS_INVALID :
+ $status = $doc->createElement('cs:invite-invalid');
+ $xuser->appendChild($status);
+ break;
+
+ }
+
+ $xaccess = $doc->createElement('cs:access');
+
+ if ($user['readOnly']) {
+ $xaccess->appendChild(
+ $doc->createElement('cs:read')
+ );
+ } else {
+ $xaccess->appendChild(
+ $doc->createElement('cs:read-write')
+ );
+ }
+ $xuser->appendChild($xaccess);
+
+ if (isset($user['summary']) && $user['summary']) {
+ $summary = $doc->createElement('cs:summary');
+ $summary->appendChild($doc->createTextNode($user['summary']));
+ $xuser->appendChild($summary);
+ }
+
+ $node->appendChild($xuser);
+
+ }
+
+
+ }
+
+ /**
+ * Unserializes the property.
+ *
+ * This static method should return a an instance of this object.
+ *
+ * @param \DOMElement $prop
+ * @return DAV\IProperty
+ */
+ static function unserialize(\DOMElement $prop) {
+
+ $xpath = new \DOMXPath($prop->ownerDocument);
+ $xpath->registerNamespace('cs', CalDAV\Plugin::NS_CALENDARSERVER);
+ $xpath->registerNamespace('d', 'urn:DAV');
+
+ $users = array();
+
+ foreach($xpath->query('cs:user', $prop) as $user) {
+
+ $status = null;
+ if ($xpath->evaluate('boolean(cs:invite-accepted)', $user)) {
+ $status = SharingPlugin::STATUS_ACCEPTED;
+ } elseif ($xpath->evaluate('boolean(cs:invite-declined)', $user)) {
+ $status = SharingPlugin::STATUS_DECLINED;
+ } elseif ($xpath->evaluate('boolean(cs:invite-noresponse)', $user)) {
+ $status = SharingPlugin::STATUS_NORESPONSE;
+ } elseif ($xpath->evaluate('boolean(cs:invite-invalid)', $user)) {
+ $status = SharingPlugin::STATUS_INVALID;
+ } else {
+ throw new DAV\Exception('Every cs:user property must have one of cs:invite-accepted, cs:invite-declined, cs:invite-noresponse or cs:invite-invalid');
+ }
+ $users[] = array(
+ 'href' => $xpath->evaluate('string(d:href)', $user),
+ 'commonName' => $xpath->evaluate('string(cs:common-name)', $user),
+ 'readOnly' => $xpath->evaluate('boolean(cs:access/cs:read)', $user),
+ 'summary' => $xpath->evaluate('string(cs:summary)', $user),
+ 'status' => $status,
+ );
+
+ }
+
+ return new self($users);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/Property/ScheduleCalendarTransp.php b/vendor/sabre/dav/lib/Sabre/CalDAV/Property/ScheduleCalendarTransp.php
new file mode 100644
index 000000000..967c5e22a
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/Property/ScheduleCalendarTransp.php
@@ -0,0 +1,102 @@
+<?php
+
+namespace Sabre\CalDAV\Property;
+
+use Sabre\DAV;
+use Sabre\CalDAV;
+
+/**
+ * schedule-calendar-transp property.
+ *
+ * This property is a representation of the schedule-calendar-transp property.
+ * This property is defined in RFC6638 (caldav scheduling).
+ *
+ * Its values are either 'transparent' or 'opaque'. If it's transparent, it
+ * means that this calendar will not be taken into consideration when a
+ * different user queries for free-busy information. If it's 'opaque', it will.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class ScheduleCalendarTransp extends DAV\Property {
+
+ const TRANSPARENT = 'transparent';
+ const OPAQUE = 'opaque';
+
+ protected $value;
+
+ /**
+ * Creates the property
+ *
+ * @param string $value
+ */
+ public function __construct($value) {
+
+ if ($value !== self::TRANSPARENT && $value !== self::OPAQUE) {
+ throw new \InvalidArgumentException('The value must either be specified as "transparent" or "opaque"');
+ }
+ $this->value = $value;
+
+ }
+
+ /**
+ * Returns the current value
+ *
+ * @return string
+ */
+ public function getValue() {
+
+ return $this->value;
+
+ }
+
+ /**
+ * Serializes the property in a DOMDocument
+ *
+ * @param DAV\Server $server
+ * @param \DOMElement $node
+ * @return void
+ */
+ public function serialize(DAV\Server $server,\DOMElement $node) {
+
+ $doc = $node->ownerDocument;
+ switch($this->value) {
+ case self::TRANSPARENT :
+ $xval = $doc->createElement('cal:transparent');
+ break;
+ case self::OPAQUE :
+ $xval = $doc->createElement('cal:opaque');
+ break;
+ }
+
+ $node->appendChild($xval);
+
+ }
+
+ /**
+ * Unserializes the DOMElement back into a Property class.
+ *
+ * @param \DOMElement $node
+ * @return ScheduleCalendarTransp
+ */
+ static function unserialize(\DOMElement $node) {
+
+ $value = null;
+ foreach($node->childNodes as $childNode) {
+ switch(DAV\XMLUtil::toClarkNotation($childNode)) {
+ case '{' . CalDAV\Plugin::NS_CALDAV . '}opaque' :
+ $value = self::OPAQUE;
+ break;
+ case '{' . CalDAV\Plugin::NS_CALDAV . '}transparent' :
+ $value = self::TRANSPARENT;
+ break;
+ }
+ }
+ if (is_null($value))
+ return null;
+
+ return new self($value);
+
+ }
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/Property/SupportedCalendarComponentSet.php b/vendor/sabre/dav/lib/Sabre/CalDAV/Property/SupportedCalendarComponentSet.php
new file mode 100644
index 000000000..84c66c913
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/Property/SupportedCalendarComponentSet.php
@@ -0,0 +1,88 @@
+<?php
+
+namespace Sabre\CalDAV\Property;
+
+use Sabre\DAV;
+use Sabre\CalDAV;
+
+/**
+ * Supported component set property
+ *
+ * This property is a representation of the supported-calendar_component-set
+ * property in the CalDAV namespace. It simply requires an array of components,
+ * such as VEVENT, VTODO
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class SupportedCalendarComponentSet extends DAV\Property {
+
+ /**
+ * List of supported components, such as "VEVENT, VTODO"
+ *
+ * @var array
+ */
+ private $components;
+
+ /**
+ * Creates the property
+ *
+ * @param array $components
+ */
+ public function __construct(array $components) {
+
+ $this->components = $components;
+
+ }
+
+ /**
+ * Returns the list of supported components
+ *
+ * @return array
+ */
+ public function getValue() {
+
+ return $this->components;
+
+ }
+
+ /**
+ * Serializes the property in a DOMDocument
+ *
+ * @param DAV\Server $server
+ * @param \DOMElement $node
+ * @return void
+ */
+ public function serialize(DAV\Server $server,\DOMElement $node) {
+
+ $doc = $node->ownerDocument;
+ foreach($this->components as $component) {
+
+ $xcomp = $doc->createElement('cal:comp');
+ $xcomp->setAttribute('name',$component);
+ $node->appendChild($xcomp);
+
+ }
+
+ }
+
+ /**
+ * Unserializes the DOMElement back into a Property class.
+ *
+ * @param \DOMElement $node
+ * @return Property_SupportedCalendarComponentSet
+ */
+ static function unserialize(\DOMElement $node) {
+
+ $components = array();
+ foreach($node->childNodes as $childNode) {
+ if (DAV\XMLUtil::toClarkNotation($childNode)==='{' . CalDAV\Plugin::NS_CALDAV . '}comp') {
+ $components[] = $childNode->getAttribute('name');
+ }
+ }
+ return new self($components);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/Property/SupportedCalendarData.php b/vendor/sabre/dav/lib/Sabre/CalDAV/Property/SupportedCalendarData.php
new file mode 100644
index 000000000..ab989e831
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/Property/SupportedCalendarData.php
@@ -0,0 +1,40 @@
+<?php
+
+namespace Sabre\CalDAV\Property;
+use Sabre\DAV;
+use Sabre\CalDAV\Plugin;
+
+/**
+ * Supported-calendar-data property
+ *
+ * This property is a representation of the supported-calendar-data property
+ * in the CalDAV namespace. SabreDAV only has support for text/calendar;2.0
+ * so the value is currently hardcoded.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class SupportedCalendarData extends DAV\Property {
+
+ /**
+ * Serializes the property in a DOMDocument
+ *
+ * @param DAV\Server $server
+ * @param \DOMElement $node
+ * @return void
+ */
+ public function serialize(DAV\Server $server,\DOMElement $node) {
+
+ $doc = $node->ownerDocument;
+
+ $prefix = isset($server->xmlNamespaces[Plugin::NS_CALDAV])?$server->xmlNamespaces[Plugin::NS_CALDAV]:'cal';
+
+ $caldata = $doc->createElement($prefix . ':calendar-data');
+ $caldata->setAttribute('content-type','text/calendar');
+ $caldata->setAttribute('version','2.0');
+
+ $node->appendChild($caldata);
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/Property/SupportedCollationSet.php b/vendor/sabre/dav/lib/Sabre/CalDAV/Property/SupportedCollationSet.php
new file mode 100644
index 000000000..cefc3d3bd
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/Property/SupportedCollationSet.php
@@ -0,0 +1,45 @@
+<?php
+
+namespace Sabre\CalDAV\Property;
+use Sabre\DAV;
+
+/**
+ * supported-collation-set property
+ *
+ * This property is a representation of the supported-collation-set property
+ * in the CalDAV namespace.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class SupportedCollationSet extends DAV\Property {
+
+ /**
+ * Serializes the property in a DOM document
+ *
+ * @param DAV\Server $server
+ * @param \DOMElement $node
+ * @return void
+ */
+ public function serialize(DAV\Server $server,\DOMElement $node) {
+
+ $doc = $node->ownerDocument;
+
+ $prefix = $node->lookupPrefix('urn:ietf:params:xml:ns:caldav');
+ if (!$prefix) $prefix = 'cal';
+
+ $node->appendChild(
+ $doc->createElement($prefix . ':supported-collation','i;ascii-casemap')
+ );
+ $node->appendChild(
+ $doc->createElement($prefix . ':supported-collation','i;octet')
+ );
+ $node->appendChild(
+ $doc->createElement($prefix . ':supported-collation','i;unicode-casemap')
+ );
+
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/Schedule/IMip.php b/vendor/sabre/dav/lib/Sabre/CalDAV/Schedule/IMip.php
new file mode 100644
index 000000000..2a6c5f360
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/Schedule/IMip.php
@@ -0,0 +1,111 @@
+<?php
+
+namespace Sabre\CalDAV\Schedule;
+
+use Sabre\VObject;
+use Sabre\DAV;
+
+/**
+ * iMIP handler.
+ *
+ * This class is responsible for sending out iMIP messages. iMIP is the
+ * email-based transport for iTIP. iTIP deals with scheduling operations for
+ * iCalendar objects.
+ *
+ * If you want to customize the email that gets sent out, you can do so by
+ * extending this class and overriding the sendMessage method.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class IMip {
+
+ /**
+ * Email address used in From: header.
+ *
+ * @var string
+ */
+ protected $senderEmail;
+
+ /**
+ * Creates the email handler.
+ *
+ * @param string $senderEmail. The 'senderEmail' is the email that shows up
+ * in the 'From:' address. This should
+ * generally be some kind of no-reply email
+ * address you own.
+ */
+ public function __construct($senderEmail) {
+
+ $this->senderEmail = $senderEmail;
+
+ }
+
+ /**
+ * Sends one or more iTip messages through email.
+ *
+ * @param string $originator Originator Email
+ * @param array $recipients Array of email addresses
+ * @param VObject\Component $vObject
+ * @param string $principal Principal Url of the originator
+ * @return void
+ */
+ public function sendMessage($originator, array $recipients, VObject\Component $vObject, $principal) {
+
+ foreach($recipients as $recipient) {
+
+ $to = $recipient;
+ $replyTo = $originator;
+ $subject = 'SabreDAV iTIP message';
+
+ switch(strtoupper($vObject->METHOD)) {
+ case 'REPLY' :
+ $subject = 'Response for: ' . $vObject->VEVENT->SUMMARY;
+ break;
+ case 'REQUEST' :
+ $subject = 'Invitation for: ' .$vObject->VEVENT->SUMMARY;
+ break;
+ case 'CANCEL' :
+ $subject = 'Cancelled event: ' . $vObject->VEVENT->SUMMARY;
+ break;
+ }
+
+ $headers = array();
+ $headers[] = 'Reply-To: ' . $replyTo;
+ $headers[] = 'From: ' . $this->senderEmail;
+ $headers[] = 'Content-Type: text/calendar; method=' . (string)$vObject->method . '; charset=utf-8';
+ if (DAV\Server::$exposeVersion) {
+ $headers[] = 'X-Sabre-Version: ' . DAV\Version::VERSION . '-' . DAV\Version::STABILITY;
+ }
+
+ $vcalBody = $vObject->serialize();
+
+ $this->mail($to, $subject, $vcalBody, $headers);
+
+ }
+
+ }
+
+ // @codeCoverageIgnoreStart
+ // This is deemed untestable in a reasonable manner
+
+ /**
+ * This function is reponsible for sending the actual email.
+ *
+ * @param string $to Recipient email address
+ * @param string $subject Subject of the email
+ * @param string $body iCalendar body
+ * @param array $headers List of headers
+ * @return void
+ */
+ protected function mail($to, $subject, $body, array $headers) {
+
+
+ mail($to, $subject, $body, implode("\r\n", $headers));
+
+ }
+
+ // @codeCoverageIgnoreEnd
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/Schedule/IOutbox.php b/vendor/sabre/dav/lib/Sabre/CalDAV/Schedule/IOutbox.php
new file mode 100644
index 000000000..55a70bd34
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/Schedule/IOutbox.php
@@ -0,0 +1,16 @@
+<?php
+
+namespace Sabre\CalDAV\Schedule;
+
+/**
+ * Implement this interface to have a node be recognized as a CalDAV scheduling
+ * outbox.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+interface IOutbox extends \Sabre\DAV\ICollection, \Sabre\DAVACL\IACL {
+
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/Schedule/Outbox.php b/vendor/sabre/dav/lib/Sabre/CalDAV/Schedule/Outbox.php
new file mode 100644
index 000000000..d05889f35
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/Schedule/Outbox.php
@@ -0,0 +1,163 @@
+<?php
+
+namespace Sabre\CalDAV\Schedule;
+use Sabre\DAV;
+use Sabre\CalDAV;
+use Sabre\DAVACL;
+
+/**
+ * The CalDAV scheduling outbox
+ *
+ * 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.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Outbox extends DAV\Collection implements IOutbox {
+
+ /**
+ * The principal Uri
+ *
+ * @var string
+ */
+ protected $principalUri;
+
+ /**
+ * Constructor
+ *
+ * @param string $principalUri
+ */
+ public function __construct($principalUri) {
+
+ $this->principalUri = $principalUri;
+
+ }
+
+ /**
+ * Returns the name of the node.
+ *
+ * This is used to generate the url.
+ *
+ * @return string
+ */
+ public function getName() {
+
+ return 'outbox';
+
+ }
+
+ /**
+ * Returns an array with all the child nodes
+ *
+ * @return \Sabre\DAV\INode[]
+ */
+ public function getChildren() {
+
+ return array();
+
+ }
+
+ /**
+ * Returns the owner principal
+ *
+ * This must be a url to a principal, or null if there's no owner
+ *
+ * @return string|null
+ */
+ public function getOwner() {
+
+ return $this->principalUri;
+
+ }
+
+ /**
+ * Returns a group principal
+ *
+ * This must be a url to a principal, or null if there's no owner
+ *
+ * @return string|null
+ */
+ public function getGroup() {
+
+ return null;
+
+ }
+
+ /**
+ * Returns a list of ACE's for this node.
+ *
+ * Each ACE has the following properties:
+ * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are
+ * currently the only supported privileges
+ * * 'principal', a url to the principal who owns the node
+ * * 'protected' (optional), indicating that this ACE is not allowed to
+ * be updated.
+ *
+ * @return array
+ */
+ public function getACL() {
+
+ return array(
+ array(
+ 'privilege' => '{' . CalDAV\Plugin::NS_CALDAV . '}schedule-query-freebusy',
+ 'principal' => $this->getOwner(),
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{' . CalDAV\Plugin::NS_CALDAV . '}schedule-post-vevent',
+ 'principal' => $this->getOwner(),
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}read',
+ 'principal' => $this->getOwner(),
+ 'protected' => true,
+ ),
+ );
+
+ }
+
+ /**
+ * Updates the ACL
+ *
+ * This method will receive a list of new ACE's.
+ *
+ * @param array $acl
+ * @return void
+ */
+ public function setACL(array $acl) {
+
+ throw new DAV\Exception\MethodNotAllowed('You\'re not allowed to update the ACL');
+
+ }
+
+ /**
+ * Returns the list of supported privileges for this node.
+ *
+ * The returned data structure is a list of nested privileges.
+ * See Sabre\DAVACL\Plugin::getDefaultSupportedPrivilegeSet for a simple
+ * standard structure.
+ *
+ * If null is returned from this method, the default privilege set is used,
+ * which is fine for most common usecases.
+ *
+ * @return array|null
+ */
+ public function getSupportedPrivilegeSet() {
+
+ $default = DAVACL\Plugin::getDefaultSupportedPrivilegeSet();
+ $default['aggregates'][] = array(
+ 'privilege' => '{' . CalDAV\Plugin::NS_CALDAV . '}schedule-query-freebusy',
+ );
+ $default['aggregates'][] = array(
+ 'privilege' => '{' . CalDAV\Plugin::NS_CALDAV . '}schedule-post-vevent',
+ );
+
+ return $default;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/ShareableCalendar.php b/vendor/sabre/dav/lib/Sabre/CalDAV/ShareableCalendar.php
new file mode 100644
index 000000000..47e098847
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/ShareableCalendar.php
@@ -0,0 +1,72 @@
+<?php
+
+namespace Sabre\CalDAV;
+
+/**
+ * This object represents a CalDAV calendar that can be shared with other
+ * users.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class ShareableCalendar extends Calendar implements IShareableCalendar {
+
+ /**
+ * Updates the list of shares.
+ *
+ * The first array is a list of people that are to be added to the
+ * calendar.
+ *
+ * Every element in the add array has the following properties:
+ * * href - A url. Usually a mailto: address
+ * * commonName - Usually a first and last name, or false
+ * * summary - A description of the share, can also be false
+ * * readOnly - A boolean value
+ *
+ * Every element in the remove array is just the address string.
+ *
+ * @param array $add
+ * @param array $remove
+ * @return void
+ */
+ public function updateShares(array $add, array $remove) {
+
+ $this->caldavBackend->updateShares($this->calendarInfo['id'], $add, $remove);
+
+ }
+
+ /**
+ * Returns the list of people whom this calendar is shared with.
+ *
+ * Every element in this array should have the following properties:
+ * * href - Often a mailto: address
+ * * commonName - Optional, for example a first + last name
+ * * status - See the Sabre\CalDAV\SharingPlugin::STATUS_ constants.
+ * * readOnly - boolean
+ * * summary - Optional, a description for the share
+ *
+ * @return array
+ */
+ public function getShares() {
+
+ return $this->caldavBackend->getShares($this->calendarInfo['id']);
+
+ }
+
+ /**
+ * Marks this calendar as published.
+ *
+ * Publishing a calendar should automatically create a read-only, public,
+ * subscribable calendar.
+ *
+ * @param bool $value
+ * @return void
+ */
+ public function setPublishStatus($value) {
+
+ $this->caldavBackend->setPublishStatus($this->calendarInfo['id'], $value);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/SharedCalendar.php b/vendor/sabre/dav/lib/Sabre/CalDAV/SharedCalendar.php
new file mode 100644
index 000000000..7641289dd
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/SharedCalendar.php
@@ -0,0 +1,116 @@
+<?php
+
+namespace Sabre\CalDAV;
+
+use Sabre\DAVACL;
+
+/**
+ * This object represents a CalDAV calendar that is shared by a different user.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class SharedCalendar extends Calendar implements ISharedCalendar {
+
+ /**
+ * Constructor
+ *
+ * @param Backend\BackendInterface $caldavBackend
+ * @param array $calendarInfo
+ */
+ public function __construct(Backend\BackendInterface $caldavBackend, $calendarInfo) {
+
+ $required = array(
+ '{http://calendarserver.org/ns/}shared-url',
+ '{http://sabredav.org/ns}owner-principal',
+ '{http://sabredav.org/ns}read-only',
+ );
+ foreach($required as $r) {
+ if (!isset($calendarInfo[$r])) {
+ throw new \InvalidArgumentException('The ' . $r . ' property must be specified for SharedCalendar(s)');
+ }
+ }
+
+ parent::__construct($caldavBackend, $calendarInfo);
+
+ }
+
+ /**
+ * This method should return the url of the owners' copy of the shared
+ * calendar.
+ *
+ * @return string
+ */
+ public function getSharedUrl() {
+
+ return $this->calendarInfo['{http://calendarserver.org/ns/}shared-url'];
+
+ }
+
+ /**
+ * Returns the owner principal
+ *
+ * This must be a url to a principal, or null if there's no owner
+ *
+ * @return string|null
+ */
+ public function getOwner() {
+
+ return $this->calendarInfo['{http://sabredav.org/ns}owner-principal'];
+
+ }
+
+ /**
+ * Returns a list of ACE's for this node.
+ *
+ * Each ACE has the following properties:
+ * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are
+ * currently the only supported privileges
+ * * 'principal', a url to the principal who owns the node
+ * * 'protected' (optional), indicating that this ACE is not allowed to
+ * be updated.
+ *
+ * @return array
+ */
+ public function getACL() {
+
+ // The top-level ACL only contains access information for the true
+ // owner of the calendar, so we need to add the information for the
+ // sharee.
+ $acl = parent::getACL();
+ $acl[] = array(
+ 'privilege' => '{DAV:}read',
+ 'principal' => $this->calendarInfo['principaluri'],
+ 'protected' => true,
+ );
+ if (!$this->calendarInfo['{http://sabredav.org/ns}read-only']) {
+ $acl[] = array(
+ 'privilege' => '{DAV:}write',
+ 'principal' => $this->calendarInfo['principaluri'],
+ 'protected' => true,
+ );
+ }
+ return $acl;
+
+ }
+
+ /**
+ * Returns the list of people whom this calendar is shared with.
+ *
+ * Every element in this array should have the following properties:
+ * * href - Often a mailto: address
+ * * commonName - Optional, for example a first + last name
+ * * status - See the Sabre\CalDAV\SharingPlugin::STATUS_ constants.
+ * * readOnly - boolean
+ * * summary - Optional, a description for the share
+ *
+ * @return array
+ */
+ public function getShares() {
+
+ return $this->caldavBackend->getShares($this->calendarInfo['id']);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/SharingPlugin.php b/vendor/sabre/dav/lib/Sabre/CalDAV/SharingPlugin.php
new file mode 100644
index 000000000..c37571706
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/SharingPlugin.php
@@ -0,0 +1,526 @@
+<?php
+
+namespace Sabre\CalDAV;
+
+use Sabre\DAV;
+
+/**
+ * This plugin implements support for caldav sharing.
+ *
+ * This spec is defined at:
+ * http://svn.calendarserver.org/repository/calendarserver/CalendarServer/trunk/doc/Extensions/caldav-sharing.txt
+ *
+ * See:
+ * Sabre\CalDAV\Backend\SharingSupport for all the documentation.
+ *
+ * Note: This feature is experimental, and may change in between different
+ * SabreDAV versions.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class SharingPlugin extends DAV\ServerPlugin {
+
+ /**
+ * These are the various status constants used by sharing-messages.
+ */
+ const STATUS_ACCEPTED = 1;
+ const STATUS_DECLINED = 2;
+ const STATUS_DELETED = 3;
+ const STATUS_NORESPONSE = 4;
+ const STATUS_INVALID = 5;
+
+ /**
+ * Reference to SabreDAV server object.
+ *
+ * @var Sabre\DAV\Server
+ */
+ protected $server;
+
+ /**
+ * This method should return a list of server-features.
+ *
+ * This is for example 'versioning' and is added to the DAV: header
+ * in an OPTIONS response.
+ *
+ * @return array
+ */
+ public function getFeatures() {
+
+ return array('calendarserver-sharing');
+
+ }
+
+ /**
+ * Returns a plugin name.
+ *
+ * Using this name other plugins will be able to access other plugins
+ * using Sabre\DAV\Server::getPlugin
+ *
+ * @return string
+ */
+ public function getPluginName() {
+
+ return 'caldav-sharing';
+
+ }
+
+ /**
+ * This initializes the plugin.
+ *
+ * This function is called by Sabre\DAV\Server, after
+ * addPlugin is called.
+ *
+ * This method should set up the required event subscriptions.
+ *
+ * @param DAV\Server $server
+ * @return void
+ */
+ public function initialize(DAV\Server $server) {
+
+ $this->server = $server;
+ $server->resourceTypeMapping['Sabre\\CalDAV\\ISharedCalendar'] = '{' . Plugin::NS_CALENDARSERVER . '}shared';
+
+ array_push(
+ $this->server->protectedProperties,
+ '{' . Plugin::NS_CALENDARSERVER . '}invite',
+ '{' . Plugin::NS_CALENDARSERVER . '}allowed-sharing-modes',
+ '{' . Plugin::NS_CALENDARSERVER . '}shared-url'
+ );
+
+ $this->server->subscribeEvent('beforeGetProperties', array($this, 'beforeGetProperties'));
+ $this->server->subscribeEvent('afterGetProperties', array($this, 'afterGetProperties'));
+ $this->server->subscribeEvent('updateProperties', array($this, 'updateProperties'));
+ $this->server->subscribeEvent('unknownMethod', array($this,'unknownMethod'));
+
+ }
+
+ /**
+ * This event is triggered when properties are requested for a certain
+ * node.
+ *
+ * This allows us to inject any properties early.
+ *
+ * @param string $path
+ * @param DAV\INode $node
+ * @param array $requestedProperties
+ * @param array $returnedProperties
+ * @return void
+ */
+ public function beforeGetProperties($path, DAV\INode $node, &$requestedProperties, &$returnedProperties) {
+
+ if ($node instanceof IShareableCalendar) {
+ if (($index = array_search('{' . Plugin::NS_CALENDARSERVER . '}invite', $requestedProperties))!==false) {
+
+ unset($requestedProperties[$index]);
+ $returnedProperties[200]['{' . Plugin::NS_CALENDARSERVER . '}invite'] =
+ new Property\Invite(
+ $node->getShares()
+ );
+
+ }
+
+ }
+
+ if ($node instanceof ISharedCalendar) {
+
+ if (($index = array_search('{' . Plugin::NS_CALENDARSERVER . '}shared-url', $requestedProperties))!==false) {
+
+ unset($requestedProperties[$index]);
+ $returnedProperties[200]['{' . Plugin::NS_CALENDARSERVER . '}shared-url'] =
+ new DAV\Property\Href(
+ $node->getSharedUrl()
+ );
+
+ }
+ // The 'invite' property is slightly different for the 'shared'
+ // instance of the calendar, as it also contains the owner
+ // information.
+ if (($index = array_search('{' . Plugin::NS_CALENDARSERVER . '}invite', $requestedProperties))!==false) {
+
+ unset($requestedProperties[$index]);
+
+ // Fetching owner information
+ $props = $this->server->getPropertiesForPath($node->getOwner(), array(
+ '{http://sabredav.org/ns}email-address',
+ '{DAV:}displayname',
+ ), 1);
+
+ $ownerInfo = array(
+ 'href' => $node->getOwner(),
+ );
+
+ if (isset($props[0][200])) {
+
+ // We're mapping the internal webdav properties to the
+ // elements caldav-sharing expects.
+ if (isset($props[0][200]['{http://sabredav.org/ns}email-address'])) {
+ $ownerInfo['href'] = 'mailto:' . $props[0][200]['{http://sabredav.org/ns}email-address'];
+ }
+ if (isset($props[0][200]['{DAV:}displayname'])) {
+ $ownerInfo['commonName'] = $props[0][200]['{DAV:}displayname'];
+ }
+
+ }
+
+ $returnedProperties[200]['{' . Plugin::NS_CALENDARSERVER . '}invite'] =
+ new Property\Invite(
+ $node->getShares(),
+ $ownerInfo
+ );
+
+ }
+
+
+ }
+
+ }
+
+ /**
+ * This method is triggered *after* all properties have been retrieved.
+ * This allows us to inject the correct resourcetype for calendars that
+ * have been shared.
+ *
+ * @param string $path
+ * @param array $properties
+ * @param DAV\INode $node
+ * @return void
+ */
+ public function afterGetProperties($path, &$properties, DAV\INode $node) {
+
+ if ($node instanceof IShareableCalendar) {
+ if (isset($properties[200]['{DAV:}resourcetype'])) {
+ if (count($node->getShares())>0) {
+ $properties[200]['{DAV:}resourcetype']->add(
+ '{' . Plugin::NS_CALENDARSERVER . '}shared-owner'
+ );
+ }
+ }
+ $propName = '{' . Plugin::NS_CALENDARSERVER . '}allowed-sharing-modes';
+ if (array_key_exists($propName, $properties[404])) {
+ unset($properties[404][$propName]);
+ $properties[200][$propName] = new Property\AllowedSharingModes(true,false);
+ }
+
+ }
+
+ }
+
+ /**
+ * This method is trigged when a user attempts to update a node's
+ * properties.
+ *
+ * A previous draft of the sharing spec stated that it was possible to use
+ * PROPPATCH to remove 'shared-owner' from the resourcetype, thus unsharing
+ * the calendar.
+ *
+ * Even though this is no longer in the current spec, we keep this around
+ * because OS X 10.7 may still make use of this feature.
+ *
+ * @param array $mutations
+ * @param array $result
+ * @param DAV\INode $node
+ * @return void
+ */
+ public function updateProperties(array &$mutations, array &$result, DAV\INode $node) {
+
+ if (!$node instanceof IShareableCalendar)
+ return;
+
+ if (!isset($mutations['{DAV:}resourcetype'])) {
+ return;
+ }
+
+ // Only doing something if shared-owner is indeed not in the list.
+ if($mutations['{DAV:}resourcetype']->is('{' . Plugin::NS_CALENDARSERVER . '}shared-owner')) return;
+
+ $shares = $node->getShares();
+ $remove = array();
+ foreach($shares as $share) {
+ $remove[] = $share['href'];
+ }
+ $node->updateShares(array(), $remove);
+
+ // We're marking this update as 200 OK
+ $result[200]['{DAV:}resourcetype'] = null;
+
+ // Removing it from the mutations list
+ unset($mutations['{DAV:}resourcetype']);
+
+ }
+
+ /**
+ * This event is triggered when the server didn't know how to handle a
+ * certain request.
+ *
+ * We intercept this to handle POST requests on calendars.
+ *
+ * @param string $method
+ * @param string $uri
+ * @return null|bool
+ */
+ public function unknownMethod($method, $uri) {
+
+ if ($method!=='POST') {
+ return;
+ }
+
+ // Only handling xml
+ $contentType = $this->server->httpRequest->getHeader('Content-Type');
+ if (strpos($contentType,'application/xml')===false && strpos($contentType,'text/xml')===false)
+ return;
+
+ // Making sure the node exists
+ try {
+ $node = $this->server->tree->getNodeForPath($uri);
+ } catch (DAV\Exception\NotFound $e) {
+ return;
+ }
+
+ $requestBody = $this->server->httpRequest->getBody(true);
+
+ // If this request handler could not deal with this POST request, it
+ // will return 'null' and other plugins get a chance to handle the
+ // request.
+ //
+ // However, we already requested the full body. This is a problem,
+ // because a body can only be read once. This is why we preemptively
+ // re-populated the request body with the existing data.
+ $this->server->httpRequest->setBody($requestBody);
+
+ $dom = DAV\XMLUtil::loadDOMDocument($requestBody);
+
+ $documentType = DAV\XMLUtil::toClarkNotation($dom->firstChild);
+
+ switch($documentType) {
+
+ // Dealing with the 'share' document, which modified invitees on a
+ // calendar.
+ case '{' . Plugin::NS_CALENDARSERVER . '}share' :
+
+ // We can only deal with IShareableCalendar objects
+ if (!$node instanceof IShareableCalendar) {
+ return;
+ }
+
+ // Getting ACL info
+ $acl = $this->server->getPlugin('acl');
+
+ // If there's no ACL support, we allow everything
+ if ($acl) {
+ $acl->checkPrivileges($uri, '{DAV:}write');
+ }
+
+ $mutations = $this->parseShareRequest($dom);
+
+ $node->updateShares($mutations[0], $mutations[1]);
+
+ $this->server->httpResponse->sendStatus(200);
+ // Adding this because sending a response body may cause issues,
+ // and I wanted some type of indicator the response was handled.
+ $this->server->httpResponse->setHeader('X-Sabre-Status', 'everything-went-well');
+
+ // Breaking the event chain
+ return false;
+
+ // The invite-reply document is sent when the user replies to an
+ // invitation of a calendar share.
+ case '{'. Plugin::NS_CALENDARSERVER.'}invite-reply' :
+
+ // This only works on the calendar-home-root node.
+ if (!$node instanceof UserCalendars) {
+ return;
+ }
+
+ // Getting ACL info
+ $acl = $this->server->getPlugin('acl');
+
+ // If there's no ACL support, we allow everything
+ if ($acl) {
+ $acl->checkPrivileges($uri, '{DAV:}write');
+ }
+
+ $message = $this->parseInviteReplyRequest($dom);
+
+ $url = $node->shareReply(
+ $message['href'],
+ $message['status'],
+ $message['calendarUri'],
+ $message['inReplyTo'],
+ $message['summary']
+ );
+
+ $this->server->httpResponse->sendStatus(200);
+ // Adding this because sending a response body may cause issues,
+ // and I wanted some type of indicator the response was handled.
+ $this->server->httpResponse->setHeader('X-Sabre-Status', 'everything-went-well');
+
+ if ($url) {
+ $dom = new \DOMDocument('1.0', 'UTF-8');
+ $dom->formatOutput = true;
+
+ $root = $dom->createElement('cs:shared-as');
+ foreach($this->server->xmlNamespaces as $namespace => $prefix) {
+ $root->setAttribute('xmlns:' . $prefix, $namespace);
+ }
+
+ $dom->appendChild($root);
+ $href = new DAV\Property\Href($url);
+
+ $href->serialize($this->server, $root);
+ $this->server->httpResponse->setHeader('Content-Type','application/xml');
+ $this->server->httpResponse->sendBody($dom->saveXML());
+
+ }
+
+ // Breaking the event chain
+ return false;
+
+ case '{' . Plugin::NS_CALENDARSERVER . '}publish-calendar' :
+
+ // We can only deal with IShareableCalendar objects
+ if (!$node instanceof IShareableCalendar) {
+ return;
+ }
+
+ // Getting ACL info
+ $acl = $this->server->getPlugin('acl');
+
+ // If there's no ACL support, we allow everything
+ if ($acl) {
+ $acl->checkPrivileges($uri, '{DAV:}write');
+ }
+
+ $node->setPublishStatus(true);
+
+ // iCloud sends back the 202, so we will too.
+ $this->server->httpResponse->sendStatus(202);
+
+ // Adding this because sending a response body may cause issues,
+ // and I wanted some type of indicator the response was handled.
+ $this->server->httpResponse->setHeader('X-Sabre-Status', 'everything-went-well');
+
+ // Breaking the event chain
+ return false;
+
+ case '{' . Plugin::NS_CALENDARSERVER . '}unpublish-calendar' :
+
+ // We can only deal with IShareableCalendar objects
+ if (!$node instanceof IShareableCalendar) {
+ return;
+ }
+
+ // Getting ACL info
+ $acl = $this->server->getPlugin('acl');
+
+ // If there's no ACL support, we allow everything
+ if ($acl) {
+ $acl->checkPrivileges($uri, '{DAV:}write');
+ }
+
+ $node->setPublishStatus(false);
+
+ $this->server->httpResponse->sendStatus(200);
+
+ // Adding this because sending a response body may cause issues,
+ // and I wanted some type of indicator the response was handled.
+ $this->server->httpResponse->setHeader('X-Sabre-Status', 'everything-went-well');
+
+ // Breaking the event chain
+ return false;
+
+ }
+
+
+
+ }
+
+ /**
+ * Parses the 'share' POST request.
+ *
+ * This method returns an array, containing two arrays.
+ * The first array is a list of new sharees. Every element is a struct
+ * containing a:
+ * * href element. (usually a mailto: address)
+ * * commonName element (often a first and lastname, but can also be
+ * false)
+ * * readOnly (true or false)
+ * * summary (A description of the share, can also be false)
+ *
+ * The second array is a list of sharees that are to be removed. This is
+ * just a simple array with 'hrefs'.
+ *
+ * @param \DOMDocument $dom
+ * @return array
+ */
+ protected function parseShareRequest(\DOMDocument $dom) {
+
+ $xpath = new \DOMXPath($dom);
+ $xpath->registerNamespace('cs', Plugin::NS_CALENDARSERVER);
+ $xpath->registerNamespace('d', 'urn:DAV');
+
+ $set = array();
+ $elems = $xpath->query('cs:set');
+
+ for($i=0; $i < $elems->length; $i++) {
+
+ $xset = $elems->item($i);
+ $set[] = array(
+ 'href' => $xpath->evaluate('string(d:href)', $xset),
+ 'commonName' => $xpath->evaluate('string(cs:common-name)', $xset),
+ 'summary' => $xpath->evaluate('string(cs:summary)', $xset),
+ 'readOnly' => $xpath->evaluate('boolean(cs:read)', $xset)!==false
+ );
+
+ }
+
+ $remove = array();
+ $elems = $xpath->query('cs:remove');
+
+ for($i=0; $i < $elems->length; $i++) {
+
+ $xremove = $elems->item($i);
+ $remove[] = $xpath->evaluate('string(d:href)', $xremove);
+
+ }
+
+ return array($set, $remove);
+
+ }
+
+ /**
+ * Parses the 'invite-reply' POST request.
+ *
+ * This method returns an array, containing the following properties:
+ * * href - The sharee who is replying
+ * * status - One of the self::STATUS_* constants
+ * * calendarUri - The url of the shared calendar
+ * * inReplyTo - The unique id of the share invitation.
+ * * summary - Optional description of the reply.
+ *
+ * @param \DOMDocument $dom
+ * @return array
+ */
+ protected function parseInviteReplyRequest(\DOMDocument $dom) {
+
+ $xpath = new \DOMXPath($dom);
+ $xpath->registerNamespace('cs', Plugin::NS_CALENDARSERVER);
+ $xpath->registerNamespace('d', 'urn:DAV');
+
+ $hostHref = $xpath->evaluate('string(cs:hosturl/d:href)');
+ if (!$hostHref) {
+ throw new DAV\Exception\BadRequest('The {' . Plugin::NS_CALENDARSERVER . '}hosturl/{DAV:}href element is required');
+ }
+
+ return array(
+ 'href' => $xpath->evaluate('string(d:href)'),
+ 'calendarUri' => $this->server->calculateUri($hostHref),
+ 'inReplyTo' => $xpath->evaluate('string(cs:in-reply-to)'),
+ 'summary' => $xpath->evaluate('string(cs:summary)'),
+ 'status' => $xpath->evaluate('boolean(cs:invite-accepted)')?self::STATUS_ACCEPTED:self::STATUS_DECLINED
+ );
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/UserCalendars.php b/vendor/sabre/dav/lib/Sabre/CalDAV/UserCalendars.php
new file mode 100644
index 000000000..a3be4fdd3
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/UserCalendars.php
@@ -0,0 +1,342 @@
+<?php
+
+namespace Sabre\CalDAV;
+
+use Sabre\DAV;
+use Sabre\DAVACL;
+
+/**
+ * The UserCalenders class contains all calendars associated to one user
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class UserCalendars implements DAV\IExtendedCollection, DAVACL\IACL {
+
+ /**
+ * CalDAV backend
+ *
+ * @var Sabre\CalDAV\Backend\BackendInterface
+ */
+ protected $caldavBackend;
+
+ /**
+ * Principal information
+ *
+ * @var array
+ */
+ protected $principalInfo;
+
+ /**
+ * Constructor
+ *
+ * @param Backend\BackendInterface $caldavBackend
+ * @param mixed $userUri
+ */
+ public function __construct(Backend\BackendInterface $caldavBackend, $principalInfo) {
+
+ $this->caldavBackend = $caldavBackend;
+ $this->principalInfo = $principalInfo;
+
+ }
+
+ /**
+ * Returns the name of this object
+ *
+ * @return string
+ */
+ public function getName() {
+
+ list(,$name) = DAV\URLUtil::splitPath($this->principalInfo['uri']);
+ return $name;
+
+ }
+
+ /**
+ * Updates the name of this object
+ *
+ * @param string $name
+ * @return void
+ */
+ public function setName($name) {
+
+ throw new DAV\Exception\Forbidden();
+
+ }
+
+ /**
+ * Deletes this object
+ *
+ * @return void
+ */
+ public function delete() {
+
+ throw new DAV\Exception\Forbidden();
+
+ }
+
+ /**
+ * Returns the last modification date
+ *
+ * @return int
+ */
+ public function getLastModified() {
+
+ return null;
+
+ }
+
+ /**
+ * Creates a new file under this object.
+ *
+ * This is currently not allowed
+ *
+ * @param string $filename
+ * @param resource $data
+ * @return void
+ */
+ public function createFile($filename, $data=null) {
+
+ throw new DAV\Exception\MethodNotAllowed('Creating new files in this collection is not supported');
+
+ }
+
+ /**
+ * Creates a new directory under this object.
+ *
+ * This is currently not allowed.
+ *
+ * @param string $filename
+ * @return void
+ */
+ public function createDirectory($filename) {
+
+ throw new DAV\Exception\MethodNotAllowed('Creating new collections in this collection is not supported');
+
+ }
+
+ /**
+ * Returns a single calendar, by name
+ *
+ * @param string $name
+ * @todo needs optimizing
+ * @return Calendar
+ */
+ public function getChild($name) {
+
+ foreach($this->getChildren() as $child) {
+ if ($name==$child->getName())
+ return $child;
+
+ }
+ throw new DAV\Exception\NotFound('Calendar with name \'' . $name . '\' could not be found');
+
+ }
+
+ /**
+ * Checks if a calendar exists.
+ *
+ * @param string $name
+ * @todo needs optimizing
+ * @return bool
+ */
+ public function childExists($name) {
+
+ foreach($this->getChildren() as $child) {
+ if ($name==$child->getName())
+ return true;
+
+ }
+ return false;
+
+ }
+
+ /**
+ * Returns a list of calendars
+ *
+ * @return array
+ */
+ public function getChildren() {
+
+ $calendars = $this->caldavBackend->getCalendarsForUser($this->principalInfo['uri']);
+ $objs = array();
+ foreach($calendars as $calendar) {
+ if ($this->caldavBackend instanceof Backend\SharingSupport) {
+ if (isset($calendar['{http://calendarserver.org/ns/}shared-url'])) {
+ $objs[] = new SharedCalendar($this->caldavBackend, $calendar);
+ } else {
+ $objs[] = new ShareableCalendar($this->caldavBackend, $calendar);
+ }
+ } else {
+ $objs[] = new Calendar($this->caldavBackend, $calendar);
+ }
+ }
+ $objs[] = new Schedule\Outbox($this->principalInfo['uri']);
+
+ // We're adding a notifications node, if it's supported by the backend.
+ if ($this->caldavBackend instanceof Backend\NotificationSupport) {
+ $objs[] = new Notifications\Collection($this->caldavBackend, $this->principalInfo['uri']);
+ }
+ return $objs;
+
+ }
+
+ /**
+ * Creates a new calendar
+ *
+ * @param string $name
+ * @param array $resourceType
+ * @param array $properties
+ * @return void
+ */
+ public function createExtendedCollection($name, array $resourceType, array $properties) {
+
+ $isCalendar = false;
+ foreach($resourceType as $rt) {
+ switch ($rt) {
+ case '{DAV:}collection' :
+ case '{http://calendarserver.org/ns/}shared-owner' :
+ // ignore
+ break;
+ case '{urn:ietf:params:xml:ns:caldav}calendar' :
+ $isCalendar = true;
+ break;
+ default :
+ throw new DAV\Exception\InvalidResourceType('Unknown resourceType: ' . $rt);
+ }
+ }
+ if (!$isCalendar) {
+ throw new DAV\Exception\InvalidResourceType('You can only create calendars in this collection');
+ }
+ $this->caldavBackend->createCalendar($this->principalInfo['uri'], $name, $properties);
+
+ }
+
+ /**
+ * Returns the owner principal
+ *
+ * This must be a url to a principal, or null if there's no owner
+ *
+ * @return string|null
+ */
+ public function getOwner() {
+
+ return $this->principalInfo['uri'];
+
+ }
+
+ /**
+ * Returns a group principal
+ *
+ * This must be a url to a principal, or null if there's no owner
+ *
+ * @return string|null
+ */
+ public function getGroup() {
+
+ return null;
+
+ }
+
+ /**
+ * Returns a list of ACE's for this node.
+ *
+ * Each ACE has the following properties:
+ * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are
+ * currently the only supported privileges
+ * * 'principal', a url to the principal who owns the node
+ * * 'protected' (optional), indicating that this ACE is not allowed to
+ * be updated.
+ *
+ * @return array
+ */
+ public function getACL() {
+
+ return array(
+ array(
+ 'privilege' => '{DAV:}read',
+ 'principal' => $this->principalInfo['uri'],
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}write',
+ 'principal' => $this->principalInfo['uri'],
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}read',
+ 'principal' => $this->principalInfo['uri'] . '/calendar-proxy-write',
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}write',
+ 'principal' => $this->principalInfo['uri'] . '/calendar-proxy-write',
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}read',
+ 'principal' => $this->principalInfo['uri'] . '/calendar-proxy-read',
+ 'protected' => true,
+ ),
+
+ );
+
+ }
+
+ /**
+ * Updates the ACL
+ *
+ * This method will receive a list of new ACE's.
+ *
+ * @param array $acl
+ * @return void
+ */
+ public function setACL(array $acl) {
+
+ throw new DAV\Exception\MethodNotAllowed('Changing ACL is not yet supported');
+
+ }
+
+ /**
+ * Returns the list of supported privileges for this node.
+ *
+ * The returned data structure is a list of nested privileges.
+ * See Sabre\DAVACL\Plugin::getDefaultSupportedPrivilegeSet for a simple
+ * standard structure.
+ *
+ * If null is returned from this method, the default privilege set is used,
+ * which is fine for most common usecases.
+ *
+ * @return array|null
+ */
+ public function getSupportedPrivilegeSet() {
+
+ return null;
+
+ }
+
+ /**
+ * This method is called when a user replied to a request to share.
+ *
+ * This method should return the url of the newly created calendar if the
+ * share was accepted.
+ *
+ * @param string href The sharee who is replying (often a mailto: address)
+ * @param int status One of the SharingPlugin::STATUS_* constants
+ * @param string $calendarUri The url to the calendar thats being shared
+ * @param string $inReplyTo The unique id this message is a response to
+ * @param string $summary A description of the reply
+ * @return null|string
+ */
+ public function shareReply($href, $status, $calendarUri, $inReplyTo, $summary = null) {
+
+ if (!$this->caldavBackend instanceof Backend\SharingSupport) {
+ throw new DAV\Exception\NotImplemented('Sharing support is not implemented by this backend.');
+ }
+
+ return $this->caldavBackend->shareReply($href, $status, $calendarUri, $inReplyTo, $summary);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/Version.php b/vendor/sabre/dav/lib/Sabre/CalDAV/Version.php
new file mode 100644
index 000000000..5f305820a
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/Version.php
@@ -0,0 +1,24 @@
+<?php
+
+namespace Sabre\CalDAV;
+
+/**
+ * This class contains the Sabre\CalDAV version constants.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Version {
+
+ /**
+ * Full version number
+ */
+ const VERSION = '1.8.7';
+
+ /**
+ * Stability : alpha, beta, stable
+ */
+ const STABILITY = 'stable';
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CardDAV/AddressBook.php b/vendor/sabre/dav/lib/Sabre/CardDAV/AddressBook.php
new file mode 100644
index 000000000..85b301cb8
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CardDAV/AddressBook.php
@@ -0,0 +1,315 @@
+<?php
+
+namespace Sabre\CardDAV;
+
+use Sabre\DAV;
+use Sabre\DAVACL;
+
+/**
+ * The AddressBook class represents a CardDAV addressbook, owned by a specific user
+ *
+ * The AddressBook can contain multiple vcards
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class AddressBook extends DAV\Collection implements IAddressBook, DAV\IProperties, DAVACL\IACL {
+
+ /**
+ * This is an array with addressbook information
+ *
+ * @var array
+ */
+ protected $addressBookInfo;
+
+ /**
+ * CardDAV backend
+ *
+ * @var Backend\BackendInterface
+ */
+ protected $carddavBackend;
+
+ /**
+ * Constructor
+ *
+ * @param Backend\BackendInterface $carddavBackend
+ * @param array $addressBookInfo
+ */
+ public function __construct(Backend\BackendInterface $carddavBackend, array $addressBookInfo) {
+
+ $this->carddavBackend = $carddavBackend;
+ $this->addressBookInfo = $addressBookInfo;
+
+ }
+
+ /**
+ * Returns the name of the addressbook
+ *
+ * @return string
+ */
+ public function getName() {
+
+ return $this->addressBookInfo['uri'];
+
+ }
+
+ /**
+ * Returns a card
+ *
+ * @param string $name
+ * @return \ICard
+ */
+ public function getChild($name) {
+
+ $obj = $this->carddavBackend->getCard($this->addressBookInfo['id'],$name);
+ if (!$obj) throw new DAV\Exception\NotFound('Card not found');
+ return new Card($this->carddavBackend,$this->addressBookInfo,$obj);
+
+ }
+
+ /**
+ * Returns the full list of cards
+ *
+ * @return array
+ */
+ public function getChildren() {
+
+ $objs = $this->carddavBackend->getCards($this->addressBookInfo['id']);
+ $children = array();
+ foreach($objs as $obj) {
+ $children[] = new Card($this->carddavBackend,$this->addressBookInfo,$obj);
+ }
+ return $children;
+
+ }
+
+ /**
+ * Creates a new directory
+ *
+ * We actually block this, as subdirectories are not allowed in addressbooks.
+ *
+ * @param string $name
+ * @return void
+ */
+ public function createDirectory($name) {
+
+ throw new DAV\Exception\MethodNotAllowed('Creating collections in addressbooks is not allowed');
+
+ }
+
+ /**
+ * Creates a new file
+ *
+ * The contents of the new file must be a valid VCARD.
+ *
+ * This method may return an ETag.
+ *
+ * @param string $name
+ * @param resource $vcardData
+ * @return string|null
+ */
+ public function createFile($name,$vcardData = null) {
+
+ if (is_resource($vcardData)) {
+ $vcardData = stream_get_contents($vcardData);
+ }
+ // Converting to UTF-8, if needed
+ $vcardData = DAV\StringUtil::ensureUTF8($vcardData);
+
+ return $this->carddavBackend->createCard($this->addressBookInfo['id'],$name,$vcardData);
+
+ }
+
+ /**
+ * Deletes the entire addressbook.
+ *
+ * @return void
+ */
+ public function delete() {
+
+ $this->carddavBackend->deleteAddressBook($this->addressBookInfo['id']);
+
+ }
+
+ /**
+ * Renames the addressbook
+ *
+ * @param string $newName
+ * @return void
+ */
+ public function setName($newName) {
+
+ throw new DAV\Exception\MethodNotAllowed('Renaming addressbooks is not yet supported');
+
+ }
+
+ /**
+ * Returns the last modification date as a unix timestamp.
+ *
+ * @return void
+ */
+ public function getLastModified() {
+
+ return null;
+
+ }
+
+ /**
+ * Updates properties on this node,
+ *
+ * The properties array uses the propertyName in clark-notation as key,
+ * and the array value for the property value. In the case a property
+ * should be deleted, the property value will be null.
+ *
+ * This method must be atomic. If one property cannot be changed, the
+ * entire operation must fail.
+ *
+ * If the operation was successful, true can be returned.
+ * If the operation failed, false can be returned.
+ *
+ * Deletion of a non-existent property is always successful.
+ *
+ * Lastly, it is optional to return detailed information about any
+ * failures. In this case an array should be returned with the following
+ * structure:
+ *
+ * array(
+ * 403 => array(
+ * '{DAV:}displayname' => null,
+ * ),
+ * 424 => array(
+ * '{DAV:}owner' => null,
+ * )
+ * )
+ *
+ * In this example it was forbidden to update {DAV:}displayname.
+ * (403 Forbidden), which in turn also caused {DAV:}owner to fail
+ * (424 Failed Dependency) because the request needs to be atomic.
+ *
+ * @param array $mutations
+ * @return bool|array
+ */
+ public function updateProperties($mutations) {
+
+ return $this->carddavBackend->updateAddressBook($this->addressBookInfo['id'], $mutations);
+
+ }
+
+ /**
+ * Returns a list of properties for this nodes.
+ *
+ * The properties list is a list of propertynames the client requested,
+ * encoded in clark-notation {xmlnamespace}tagname
+ *
+ * If the array is empty, it means 'all properties' were requested.
+ *
+ * @param array $properties
+ * @return array
+ */
+ public function getProperties($properties) {
+
+ $response = array();
+ foreach($properties as $propertyName) {
+
+ if (isset($this->addressBookInfo[$propertyName])) {
+
+ $response[$propertyName] = $this->addressBookInfo[$propertyName];
+
+ }
+
+ }
+
+ return $response;
+
+ }
+
+ /**
+ * Returns the owner principal
+ *
+ * This must be a url to a principal, or null if there's no owner
+ *
+ * @return string|null
+ */
+ public function getOwner() {
+
+ return $this->addressBookInfo['principaluri'];
+
+ }
+
+ /**
+ * Returns a group principal
+ *
+ * This must be a url to a principal, or null if there's no owner
+ *
+ * @return string|null
+ */
+ public function getGroup() {
+
+ return null;
+
+ }
+
+ /**
+ * Returns a list of ACE's for this node.
+ *
+ * Each ACE has the following properties:
+ * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are
+ * currently the only supported privileges
+ * * 'principal', a url to the principal who owns the node
+ * * 'protected' (optional), indicating that this ACE is not allowed to
+ * be updated.
+ *
+ * @return array
+ */
+ public function getACL() {
+
+ return array(
+ array(
+ 'privilege' => '{DAV:}read',
+ 'principal' => $this->addressBookInfo['principaluri'],
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}write',
+ 'principal' => $this->addressBookInfo['principaluri'],
+ 'protected' => true,
+ ),
+
+ );
+
+ }
+
+ /**
+ * Updates the ACL
+ *
+ * This method will receive a list of new ACE's.
+ *
+ * @param array $acl
+ * @return void
+ */
+ public function setACL(array $acl) {
+
+ throw new DAV\Exception\MethodNotAllowed('Changing ACL is not yet supported');
+
+ }
+
+ /**
+ * Returns the list of supported privileges for this node.
+ *
+ * The returned data structure is a list of nested privileges.
+ * See Sabre\DAVACL\Plugin::getDefaultSupportedPrivilegeSet for a simple
+ * standard structure.
+ *
+ * If null is returned from this method, the default privilege set is used,
+ * which is fine for most common usecases.
+ *
+ * @return array|null
+ */
+ public function getSupportedPrivilegeSet() {
+
+ return null;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CardDAV/AddressBookQueryParser.php b/vendor/sabre/dav/lib/Sabre/CardDAV/AddressBookQueryParser.php
new file mode 100644
index 000000000..2b5cd209d
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CardDAV/AddressBookQueryParser.php
@@ -0,0 +1,221 @@
+<?php
+
+namespace Sabre\CardDAV;
+
+use Sabre\DAV;
+
+/**
+ * Parses the addressbook-query report request body.
+ *
+ * Whoever designed this format, and the CalDAV equivalent even more so,
+ * has no feel for design.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class AddressBookQueryParser {
+
+ const TEST_ANYOF = 'anyof';
+ const TEST_ALLOF = 'allof';
+
+ /**
+ * List of requested properties the client wanted
+ *
+ * @var array
+ */
+ public $requestedProperties;
+
+ /**
+ * The number of results the client wants
+ *
+ * null means it wasn't specified, which in most cases means 'all results'.
+ *
+ * @var int|null
+ */
+ public $limit;
+
+ /**
+ * List of property filters.
+ *
+ * @var array
+ */
+ public $filters;
+
+ /**
+ * Either TEST_ANYOF or TEST_ALLOF
+ *
+ * @var string
+ */
+ public $test;
+
+ /**
+ * DOM Document
+ *
+ * @var DOMDocument
+ */
+ protected $dom;
+
+ /**
+ * DOM XPath object
+ *
+ * @var DOMXPath
+ */
+ protected $xpath;
+
+ /**
+ * Creates the parser
+ *
+ * @param \DOMDocument $dom
+ */
+ public function __construct(\DOMDocument $dom) {
+
+ $this->dom = $dom;
+
+ $this->xpath = new \DOMXPath($dom);
+ $this->xpath->registerNameSpace('card',Plugin::NS_CARDDAV);
+
+ }
+
+ /**
+ * Parses the request.
+ *
+ * @return void
+ */
+ public function parse() {
+
+ $filterNode = null;
+
+ $limit = $this->xpath->evaluate('number(/card:addressbook-query/card:limit/card:nresults)');
+ if (is_nan($limit)) $limit = null;
+
+ $filter = $this->xpath->query('/card:addressbook-query/card:filter');
+
+ // According to the CardDAV spec there needs to be exactly 1 filter
+ // element. However, KDE 4.8.2 contains a bug that will encode 0 filter
+ // elements, so this is a workaround for that.
+ //
+ // See: https://bugs.kde.org/show_bug.cgi?id=300047
+ if ($filter->length === 0) {
+ $test = null;
+ $filter = null;
+ } elseif ($filter->length === 1) {
+ $filter = $filter->item(0);
+ $test = $this->xpath->evaluate('string(@test)', $filter);
+ } else {
+ throw new DAV\Exception\BadRequest('Only one filter element is allowed');
+ }
+
+ if (!$test) $test = self::TEST_ANYOF;
+ if ($test !== self::TEST_ANYOF && $test !== self::TEST_ALLOF) {
+ throw new DAV\Exception\BadRequest('The test attribute must either hold "anyof" or "allof"');
+ }
+
+ $propFilters = array();
+
+ $propFilterNodes = $this->xpath->query('card:prop-filter', $filter);
+ for($ii=0; $ii < $propFilterNodes->length; $ii++) {
+
+ $propFilters[] = $this->parsePropFilterNode($propFilterNodes->item($ii));
+
+
+ }
+
+ $this->filters = $propFilters;
+ $this->limit = $limit;
+ $this->requestedProperties = array_keys(DAV\XMLUtil::parseProperties($this->dom->firstChild));
+ $this->test = $test;
+
+ }
+
+ /**
+ * Parses the prop-filter xml element
+ *
+ * @param \DOMElement $propFilterNode
+ * @return array
+ */
+ protected function parsePropFilterNode(\DOMElement $propFilterNode) {
+
+ $propFilter = array();
+ $propFilter['name'] = $propFilterNode->getAttribute('name');
+ $propFilter['test'] = $propFilterNode->getAttribute('test');
+ if (!$propFilter['test']) $propFilter['test'] = 'anyof';
+
+ $propFilter['is-not-defined'] = $this->xpath->query('card:is-not-defined', $propFilterNode)->length>0;
+
+ $paramFilterNodes = $this->xpath->query('card:param-filter', $propFilterNode);
+
+ $propFilter['param-filters'] = array();
+
+
+ for($ii=0;$ii<$paramFilterNodes->length;$ii++) {
+
+ $propFilter['param-filters'][] = $this->parseParamFilterNode($paramFilterNodes->item($ii));
+
+ }
+ $propFilter['text-matches'] = array();
+ $textMatchNodes = $this->xpath->query('card:text-match', $propFilterNode);
+
+ for($ii=0;$ii<$textMatchNodes->length;$ii++) {
+
+ $propFilter['text-matches'][] = $this->parseTextMatchNode($textMatchNodes->item($ii));
+
+ }
+
+ return $propFilter;
+
+ }
+
+ /**
+ * Parses the param-filter element
+ *
+ * @param \DOMElement $paramFilterNode
+ * @return array
+ */
+ public function parseParamFilterNode(\DOMElement $paramFilterNode) {
+
+ $paramFilter = array();
+ $paramFilter['name'] = $paramFilterNode->getAttribute('name');
+ $paramFilter['is-not-defined'] = $this->xpath->query('card:is-not-defined', $paramFilterNode)->length>0;
+ $paramFilter['text-match'] = null;
+
+ $textMatch = $this->xpath->query('card:text-match', $paramFilterNode);
+ if ($textMatch->length>0) {
+ $paramFilter['text-match'] = $this->parseTextMatchNode($textMatch->item(0));
+ }
+
+ return $paramFilter;
+
+ }
+
+ /**
+ * Text match
+ *
+ * @param \DOMElement $textMatchNode
+ * @return array
+ */
+ public function parseTextMatchNode(\DOMElement $textMatchNode) {
+
+ $matchType = $textMatchNode->getAttribute('match-type');
+ if (!$matchType) $matchType = 'contains';
+
+ if (!in_array($matchType, array('contains', 'equals', 'starts-with', 'ends-with'))) {
+ throw new DAV\Exception\BadRequest('Unknown match-type: ' . $matchType);
+ }
+
+ $negateCondition = $textMatchNode->getAttribute('negate-condition');
+ $negateCondition = $negateCondition==='yes';
+ $collation = $textMatchNode->getAttribute('collation');
+ if (!$collation) $collation = 'i;unicode-casemap';
+
+ return array(
+ 'negate-condition' => $negateCondition,
+ 'collation' => $collation,
+ 'match-type' => $matchType,
+ 'value' => $textMatchNode->nodeValue
+ );
+
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CardDAV/AddressBookRoot.php b/vendor/sabre/dav/lib/Sabre/CardDAV/AddressBookRoot.php
new file mode 100644
index 000000000..acee40efc
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CardDAV/AddressBookRoot.php
@@ -0,0 +1,80 @@
+<?php
+
+namespace Sabre\CardDAV;
+
+use Sabre\DAVACL;
+
+/**
+ * AddressBook rootnode
+ *
+ * This object lists a collection of users, which can contain addressbooks.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class AddressBookRoot extends DAVACL\AbstractPrincipalCollection {
+
+ /**
+ * Principal Backend
+ *
+ * @var Sabre\DAVACL\PrincipalBackend\BackendInteface
+ */
+ protected $principalBackend;
+
+ /**
+ * CardDAV backend
+ *
+ * @var Backend\BackendInterface
+ */
+ protected $carddavBackend;
+
+ /**
+ * Constructor
+ *
+ * This constructor needs both a principal and a carddav backend.
+ *
+ * By default this class will show a list of addressbook collections for
+ * principals in the 'principals' collection. If your main principals are
+ * actually located in a different path, use the $principalPrefix argument
+ * to override this.
+ *
+ * @param DAVACL\PrincipalBackend\BackendInterface $principalBackend
+ * @param Backend\BackendInterface $carddavBackend
+ * @param string $principalPrefix
+ */
+ public function __construct(DAVACL\PrincipalBackend\BackendInterface $principalBackend,Backend\BackendInterface $carddavBackend, $principalPrefix = 'principals') {
+
+ $this->carddavBackend = $carddavBackend;
+ parent::__construct($principalBackend, $principalPrefix);
+
+ }
+
+ /**
+ * Returns the name of the node
+ *
+ * @return string
+ */
+ public function getName() {
+
+ return Plugin::ADDRESSBOOK_ROOT;
+
+ }
+
+ /**
+ * This method returns a node for a principal.
+ *
+ * The passed array contains principal information, and is guaranteed to
+ * at least contain a uri item. Other properties may or may not be
+ * supplied by the authentication backend.
+ *
+ * @param array $principal
+ * @return \Sabre\DAV\INode
+ */
+ public function getChildForPrincipal(array $principal) {
+
+ return new UserAddressBooks($this->carddavBackend, $principal['uri']);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CardDAV/Backend/AbstractBackend.php b/vendor/sabre/dav/lib/Sabre/CardDAV/Backend/AbstractBackend.php
new file mode 100644
index 000000000..363b73afa
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CardDAV/Backend/AbstractBackend.php
@@ -0,0 +1,18 @@
+<?php
+
+namespace Sabre\CardDAV\Backend;
+
+/**
+ * CardDAV abstract Backend
+ *
+ * This class serves as a base-class for addressbook backends
+ *
+ * This class doesn't do much, but it was added for consistency.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+abstract class AbstractBackend implements BackendInterface {
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CardDAV/Backend/BackendInterface.php b/vendor/sabre/dav/lib/Sabre/CardDAV/Backend/BackendInterface.php
new file mode 100644
index 000000000..c4607c217
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CardDAV/Backend/BackendInterface.php
@@ -0,0 +1,166 @@
+<?php
+
+namespace Sabre\CardDAV\Backend;
+
+/**
+ * CardDAV Backend Interface
+ *
+ * Any CardDAV backend must implement this interface.
+ *
+ * Note that there are references to 'addressBookId' scattered throughout the
+ * class. The value of the addressBookId is completely up to you, it can be any
+ * arbitrary value you can use as an unique identifier.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+interface BackendInterface {
+
+ /**
+ * Returns the list of addressbooks for a specific user.
+ *
+ * Every addressbook should have the following properties:
+ * id - an arbitrary unique id
+ * uri - the 'basename' part of the url
+ * principaluri - Same as the passed parameter
+ *
+ * Any additional clark-notation property may be passed besides this. Some
+ * common ones are :
+ * {DAV:}displayname
+ * {urn:ietf:params:xml:ns:carddav}addressbook-description
+ * {http://calendarserver.org/ns/}getctag
+ *
+ * @param string $principalUri
+ * @return array
+ */
+ public function getAddressBooksForUser($principalUri);
+
+ /**
+ * Updates an addressbook's properties
+ *
+ * See Sabre\DAV\IProperties for a description of the mutations array, as
+ * well as the return value.
+ *
+ * @param mixed $addressBookId
+ * @param array $mutations
+ * @see Sabre\DAV\IProperties::updateProperties
+ * @return bool|array
+ */
+ public function updateAddressBook($addressBookId, array $mutations);
+
+ /**
+ * Creates a new address book
+ *
+ * @param string $principalUri
+ * @param string $url Just the 'basename' of the url.
+ * @param array $properties
+ * @return void
+ */
+ public function createAddressBook($principalUri, $url, array $properties);
+
+ /**
+ * Deletes an entire addressbook and all its contents
+ *
+ * @param mixed $addressBookId
+ * @return void
+ */
+ public function deleteAddressBook($addressBookId);
+
+ /**
+ * Returns all cards for a specific addressbook id.
+ *
+ * This method should return the following properties for each card:
+ * * carddata - raw vcard data
+ * * uri - Some unique url
+ * * lastmodified - A unix timestamp
+ *
+ * It's recommended to also return the following properties:
+ * * etag - A unique etag. This must change every time the card changes.
+ * * size - The size of the card in bytes.
+ *
+ * If these last two properties are provided, less time will be spent
+ * calculating them. If they are specified, you can also ommit carddata.
+ * This may speed up certain requests, especially with large cards.
+ *
+ * @param mixed $addressbookId
+ * @return array
+ */
+ public function getCards($addressbookId);
+
+ /**
+ * Returns a specfic card.
+ *
+ * The same set of properties must be returned as with getCards. The only
+ * exception is that 'carddata' is absolutely required.
+ *
+ * @param mixed $addressBookId
+ * @param string $cardUri
+ * @return array
+ */
+ public function getCard($addressBookId, $cardUri);
+
+ /**
+ * Creates a new card.
+ *
+ * The addressbook id will be passed as the first argument. This is the
+ * same id as it is returned from the getAddressbooksForUser method.
+ *
+ * The cardUri is a base uri, and doesn't include the full path. The
+ * cardData argument is the vcard body, and is passed as a string.
+ *
+ * It is possible to return an ETag from this method. This ETag is for the
+ * newly created resource, and must be enclosed with double quotes (that
+ * is, the string itself must contain the double quotes).
+ *
+ * You should only return the ETag if you store the carddata as-is. If a
+ * subsequent GET request on the same card does not have the same body,
+ * byte-by-byte and you did return an ETag here, clients tend to get
+ * confused.
+ *
+ * If you don't return an ETag, you can just return null.
+ *
+ * @param mixed $addressBookId
+ * @param string $cardUri
+ * @param string $cardData
+ * @return string|null
+ */
+ public function createCard($addressBookId, $cardUri, $cardData);
+
+ /**
+ * Updates a card.
+ *
+ * The addressbook id will be passed as the first argument. This is the
+ * same id as it is returned from the getAddressbooksForUser method.
+ *
+ * The cardUri is a base uri, and doesn't include the full path. The
+ * cardData argument is the vcard body, and is passed as a string.
+ *
+ * It is possible to return an ETag from this method. This ETag should
+ * match that of the updated resource, and must be enclosed with double
+ * quotes (that is: the string itself must contain the actual quotes).
+ *
+ * You should only return the ETag if you store the carddata as-is. If a
+ * subsequent GET request on the same card does not have the same body,
+ * byte-by-byte and you did return an ETag here, clients tend to get
+ * confused.
+ *
+ * If you don't return an ETag, you can just return null.
+ *
+ * @param mixed $addressBookId
+ * @param string $cardUri
+ * @param string $cardData
+ * @return string|null
+ */
+ public function updateCard($addressBookId, $cardUri, $cardData);
+
+ /**
+ * Deletes a card
+ *
+ * @param mixed $addressBookId
+ * @param string $cardUri
+ * @return bool
+ */
+ public function deleteCard($addressBookId, $cardUri);
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CardDAV/Backend/PDO.php b/vendor/sabre/dav/lib/Sabre/CardDAV/Backend/PDO.php
new file mode 100644
index 000000000..014aeb491
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CardDAV/Backend/PDO.php
@@ -0,0 +1,333 @@
+<?php
+
+namespace Sabre\CardDAV\Backend;
+
+use Sabre\CardDAV;
+use Sabre\DAV;
+
+/**
+ * PDO CardDAV backend
+ *
+ * This CardDAV backend uses PDO to store addressbooks
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class PDO extends AbstractBackend {
+
+ /**
+ * PDO connection
+ *
+ * @var PDO
+ */
+ protected $pdo;
+
+ /**
+ * The PDO table name used to store addressbooks
+ */
+ protected $addressBooksTableName;
+
+ /**
+ * The PDO table name used to store cards
+ */
+ protected $cardsTableName;
+
+ /**
+ * Sets up the object
+ *
+ * @param \PDO $pdo
+ * @param string $addressBooksTableName
+ * @param string $cardsTableName
+ */
+ public function __construct(\PDO $pdo, $addressBooksTableName = 'addressbooks', $cardsTableName = 'cards') {
+
+ $this->pdo = $pdo;
+ $this->addressBooksTableName = $addressBooksTableName;
+ $this->cardsTableName = $cardsTableName;
+
+ }
+
+ /**
+ * Returns the list of addressbooks for a specific user.
+ *
+ * @param string $principalUri
+ * @return array
+ */
+ public function getAddressBooksForUser($principalUri) {
+
+ $stmt = $this->pdo->prepare('SELECT id, uri, displayname, principaluri, description, ctag FROM '.$this->addressBooksTableName.' WHERE principaluri = ?');
+ $stmt->execute(array($principalUri));
+
+ $addressBooks = array();
+
+ foreach($stmt->fetchAll() as $row) {
+
+ $addressBooks[] = array(
+ 'id' => $row['id'],
+ 'uri' => $row['uri'],
+ 'principaluri' => $row['principaluri'],
+ '{DAV:}displayname' => $row['displayname'],
+ '{' . CardDAV\Plugin::NS_CARDDAV . '}addressbook-description' => $row['description'],
+ '{http://calendarserver.org/ns/}getctag' => $row['ctag'],
+ '{' . CardDAV\Plugin::NS_CARDDAV . '}supported-address-data' =>
+ new CardDAV\Property\SupportedAddressData(),
+ );
+
+ }
+
+ return $addressBooks;
+
+ }
+
+
+ /**
+ * Updates an addressbook's properties
+ *
+ * See Sabre\DAV\IProperties for a description of the mutations array, as
+ * well as the return value.
+ *
+ * @param mixed $addressBookId
+ * @param array $mutations
+ * @see Sabre\DAV\IProperties::updateProperties
+ * @return bool|array
+ */
+ public function updateAddressBook($addressBookId, array $mutations) {
+
+ $updates = array();
+
+ foreach($mutations as $property=>$newValue) {
+
+ switch($property) {
+ case '{DAV:}displayname' :
+ $updates['displayname'] = $newValue;
+ break;
+ case '{' . CardDAV\Plugin::NS_CARDDAV . '}addressbook-description' :
+ $updates['description'] = $newValue;
+ break;
+ default :
+ // If any unsupported values were being updated, we must
+ // let the entire request fail.
+ return false;
+ }
+
+ }
+
+ // No values are being updated?
+ if (!$updates) {
+ return false;
+ }
+
+ $query = 'UPDATE ' . $this->addressBooksTableName . ' SET ctag = ctag + 1 ';
+ foreach($updates as $key=>$value) {
+ $query.=', `' . $key . '` = :' . $key . ' ';
+ }
+ $query.=' WHERE id = :addressbookid';
+
+ $stmt = $this->pdo->prepare($query);
+ $updates['addressbookid'] = $addressBookId;
+
+ $stmt->execute($updates);
+
+ return true;
+
+ }
+
+ /**
+ * Creates a new address book
+ *
+ * @param string $principalUri
+ * @param string $url Just the 'basename' of the url.
+ * @param array $properties
+ * @return void
+ */
+ public function createAddressBook($principalUri, $url, array $properties) {
+
+ $values = array(
+ 'displayname' => null,
+ 'description' => null,
+ 'principaluri' => $principalUri,
+ 'uri' => $url,
+ );
+
+ foreach($properties as $property=>$newValue) {
+
+ switch($property) {
+ case '{DAV:}displayname' :
+ $values['displayname'] = $newValue;
+ break;
+ case '{' . CardDAV\Plugin::NS_CARDDAV . '}addressbook-description' :
+ $values['description'] = $newValue;
+ break;
+ default :
+ throw new DAV\Exception\BadRequest('Unknown property: ' . $property);
+ }
+
+ }
+
+ $query = 'INSERT INTO ' . $this->addressBooksTableName . ' (uri, displayname, description, principaluri, ctag) VALUES (:uri, :displayname, :description, :principaluri, 1)';
+ $stmt = $this->pdo->prepare($query);
+ $stmt->execute($values);
+
+ }
+
+ /**
+ * Deletes an entire addressbook and all its contents
+ *
+ * @param int $addressBookId
+ * @return void
+ */
+ public function deleteAddressBook($addressBookId) {
+
+ $stmt = $this->pdo->prepare('DELETE FROM ' . $this->cardsTableName . ' WHERE addressbookid = ?');
+ $stmt->execute(array($addressBookId));
+
+ $stmt = $this->pdo->prepare('DELETE FROM ' . $this->addressBooksTableName . ' WHERE id = ?');
+ $stmt->execute(array($addressBookId));
+
+ }
+
+ /**
+ * Returns all cards for a specific addressbook id.
+ *
+ * This method should return the following properties for each card:
+ * * carddata - raw vcard data
+ * * uri - Some unique url
+ * * lastmodified - A unix timestamp
+ *
+ * It's recommended to also return the following properties:
+ * * etag - A unique etag. This must change every time the card changes.
+ * * size - The size of the card in bytes.
+ *
+ * If these last two properties are provided, less time will be spent
+ * calculating them. If they are specified, you can also ommit carddata.
+ * This may speed up certain requests, especially with large cards.
+ *
+ * @param mixed $addressbookId
+ * @return array
+ */
+ public function getCards($addressbookId) {
+
+ $stmt = $this->pdo->prepare('SELECT id, carddata, uri, lastmodified FROM ' . $this->cardsTableName . ' WHERE addressbookid = ?');
+ $stmt->execute(array($addressbookId));
+
+ return $stmt->fetchAll(\PDO::FETCH_ASSOC);
+
+
+ }
+
+ /**
+ * Returns a specfic card.
+ *
+ * The same set of properties must be returned as with getCards. The only
+ * exception is that 'carddata' is absolutely required.
+ *
+ * @param mixed $addressBookId
+ * @param string $cardUri
+ * @return array
+ */
+ public function getCard($addressBookId, $cardUri) {
+
+ $stmt = $this->pdo->prepare('SELECT id, carddata, uri, lastmodified FROM ' . $this->cardsTableName . ' WHERE addressbookid = ? AND uri = ? LIMIT 1');
+ $stmt->execute(array($addressBookId, $cardUri));
+
+ $result = $stmt->fetchAll(\PDO::FETCH_ASSOC);
+
+ return (count($result)>0?$result[0]:false);
+
+ }
+
+ /**
+ * Creates a new card.
+ *
+ * The addressbook id will be passed as the first argument. This is the
+ * same id as it is returned from the getAddressbooksForUser method.
+ *
+ * The cardUri is a base uri, and doesn't include the full path. The
+ * cardData argument is the vcard body, and is passed as a string.
+ *
+ * It is possible to return an ETag from this method. This ETag is for the
+ * newly created resource, and must be enclosed with double quotes (that
+ * is, the string itself must contain the double quotes).
+ *
+ * You should only return the ETag if you store the carddata as-is. If a
+ * subsequent GET request on the same card does not have the same body,
+ * byte-by-byte and you did return an ETag here, clients tend to get
+ * confused.
+ *
+ * If you don't return an ETag, you can just return null.
+ *
+ * @param mixed $addressBookId
+ * @param string $cardUri
+ * @param string $cardData
+ * @return string|null
+ */
+ public function createCard($addressBookId, $cardUri, $cardData) {
+
+ $stmt = $this->pdo->prepare('INSERT INTO ' . $this->cardsTableName . ' (carddata, uri, lastmodified, addressbookid) VALUES (?, ?, ?, ?)');
+
+ $result = $stmt->execute(array($cardData, $cardUri, time(), $addressBookId));
+
+ $stmt2 = $this->pdo->prepare('UPDATE ' . $this->addressBooksTableName . ' SET ctag = ctag + 1 WHERE id = ?');
+ $stmt2->execute(array($addressBookId));
+
+ return '"' . md5($cardData) . '"';
+
+ }
+
+ /**
+ * Updates a card.
+ *
+ * The addressbook id will be passed as the first argument. This is the
+ * same id as it is returned from the getAddressbooksForUser method.
+ *
+ * The cardUri is a base uri, and doesn't include the full path. The
+ * cardData argument is the vcard body, and is passed as a string.
+ *
+ * It is possible to return an ETag from this method. This ETag should
+ * match that of the updated resource, and must be enclosed with double
+ * quotes (that is: the string itself must contain the actual quotes).
+ *
+ * You should only return the ETag if you store the carddata as-is. If a
+ * subsequent GET request on the same card does not have the same body,
+ * byte-by-byte and you did return an ETag here, clients tend to get
+ * confused.
+ *
+ * If you don't return an ETag, you can just return null.
+ *
+ * @param mixed $addressBookId
+ * @param string $cardUri
+ * @param string $cardData
+ * @return string|null
+ */
+ public function updateCard($addressBookId, $cardUri, $cardData) {
+
+ $stmt = $this->pdo->prepare('UPDATE ' . $this->cardsTableName . ' SET carddata = ?, lastmodified = ? WHERE uri = ? AND addressbookid =?');
+ $stmt->execute(array($cardData, time(), $cardUri, $addressBookId));
+
+ $stmt2 = $this->pdo->prepare('UPDATE ' . $this->addressBooksTableName . ' SET ctag = ctag + 1 WHERE id = ?');
+ $stmt2->execute(array($addressBookId));
+
+ return '"' . md5($cardData) . '"';
+
+ }
+
+ /**
+ * Deletes a card
+ *
+ * @param mixed $addressBookId
+ * @param string $cardUri
+ * @return bool
+ */
+ public function deleteCard($addressBookId, $cardUri) {
+
+ $stmt = $this->pdo->prepare('DELETE FROM ' . $this->cardsTableName . ' WHERE addressbookid = ? AND uri = ?');
+ $stmt->execute(array($addressBookId, $cardUri));
+
+ $stmt2 = $this->pdo->prepare('UPDATE ' . $this->addressBooksTableName . ' SET ctag = ctag + 1 WHERE id = ?');
+ $stmt2->execute(array($addressBookId));
+
+ return $stmt->rowCount()===1;
+
+ }
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CardDAV/Card.php b/vendor/sabre/dav/lib/Sabre/CardDAV/Card.php
new file mode 100644
index 000000000..93ad7d2ac
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CardDAV/Card.php
@@ -0,0 +1,260 @@
+<?php
+
+namespace Sabre\CardDAV;
+
+use Sabre\DAVACL;
+use Sabre\DAV;
+
+
+/**
+ * The Card object represents a single Card from an addressbook
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Card extends DAV\File implements ICard, DAVACL\IACL {
+
+ /**
+ * CardDAV backend
+ *
+ * @var Backend\BackendInterface
+ */
+ protected $carddavBackend;
+
+ /**
+ * Array with information about this Card
+ *
+ * @var array
+ */
+ protected $cardData;
+
+ /**
+ * Array with information about the containing addressbook
+ *
+ * @var array
+ */
+ protected $addressBookInfo;
+
+ /**
+ * Constructor
+ *
+ * @param Backend\BackendInterface $carddavBackend
+ * @param array $addressBookInfo
+ * @param array $cardData
+ */
+ public function __construct(Backend\BackendInterface $carddavBackend,array $addressBookInfo,array $cardData) {
+
+ $this->carddavBackend = $carddavBackend;
+ $this->addressBookInfo = $addressBookInfo;
+ $this->cardData = $cardData;
+
+ }
+
+ /**
+ * Returns the uri for this object
+ *
+ * @return string
+ */
+ public function getName() {
+
+ return $this->cardData['uri'];
+
+ }
+
+ /**
+ * Returns the VCard-formatted object
+ *
+ * @return string
+ */
+ public function get() {
+
+ // Pre-populating 'carddata' is optional. If we don't yet have it
+ // already, we fetch it from the backend.
+ if (!isset($this->cardData['carddata'])) {
+ $this->cardData = $this->carddavBackend->getCard($this->addressBookInfo['id'], $this->cardData['uri']);
+ }
+ return $this->cardData['carddata'];
+
+ }
+
+ /**
+ * Updates the VCard-formatted object
+ *
+ * @param string $cardData
+ * @return string|null
+ */
+ public function put($cardData) {
+
+ if (is_resource($cardData))
+ $cardData = stream_get_contents($cardData);
+
+ // Converting to UTF-8, if needed
+ $cardData = DAV\StringUtil::ensureUTF8($cardData);
+
+ $etag = $this->carddavBackend->updateCard($this->addressBookInfo['id'],$this->cardData['uri'],$cardData);
+ $this->cardData['carddata'] = $cardData;
+ $this->cardData['etag'] = $etag;
+
+ return $etag;
+
+ }
+
+ /**
+ * Deletes the card
+ *
+ * @return void
+ */
+ public function delete() {
+
+ $this->carddavBackend->deleteCard($this->addressBookInfo['id'],$this->cardData['uri']);
+
+ }
+
+ /**
+ * Returns the mime content-type
+ *
+ * @return string
+ */
+ public function getContentType() {
+
+ return 'text/x-vcard; charset=utf-8';
+
+ }
+
+ /**
+ * Returns an ETag for this object
+ *
+ * @return string
+ */
+ public function getETag() {
+
+ if (isset($this->cardData['etag'])) {
+ return $this->cardData['etag'];
+ } else {
+ $data = $this->get();
+ if (is_string($data)) {
+ return '"' . md5($data) . '"';
+ } else {
+ // We refuse to calculate the md5 if it's a stream.
+ return null;
+ }
+ }
+
+ }
+
+ /**
+ * Returns the last modification date as a unix timestamp
+ *
+ * @return int
+ */
+ public function getLastModified() {
+
+ return isset($this->cardData['lastmodified'])?$this->cardData['lastmodified']:null;
+
+ }
+
+ /**
+ * Returns the size of this object in bytes
+ *
+ * @return int
+ */
+ public function getSize() {
+
+ if (array_key_exists('size', $this->cardData)) {
+ return $this->cardData['size'];
+ } else {
+ return strlen($this->get());
+ }
+
+ }
+
+ /**
+ * Returns the owner principal
+ *
+ * This must be a url to a principal, or null if there's no owner
+ *
+ * @return string|null
+ */
+ public function getOwner() {
+
+ return $this->addressBookInfo['principaluri'];
+
+ }
+
+ /**
+ * Returns a group principal
+ *
+ * This must be a url to a principal, or null if there's no owner
+ *
+ * @return string|null
+ */
+ public function getGroup() {
+
+ return null;
+
+ }
+
+ /**
+ * Returns a list of ACE's for this node.
+ *
+ * Each ACE has the following properties:
+ * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are
+ * currently the only supported privileges
+ * * 'principal', a url to the principal who owns the node
+ * * 'protected' (optional), indicating that this ACE is not allowed to
+ * be updated.
+ *
+ * @return array
+ */
+ public function getACL() {
+
+ return array(
+ array(
+ 'privilege' => '{DAV:}read',
+ 'principal' => $this->addressBookInfo['principaluri'],
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}write',
+ 'principal' => $this->addressBookInfo['principaluri'],
+ 'protected' => true,
+ ),
+ );
+
+ }
+
+ /**
+ * Updates the ACL
+ *
+ * This method will receive a list of new ACE's.
+ *
+ * @param array $acl
+ * @return void
+ */
+ public function setACL(array $acl) {
+
+ throw new DAV\Exception\MethodNotAllowed('Changing ACL is not yet supported');
+
+ }
+
+ /**
+ * Returns the list of supported privileges for this node.
+ *
+ * The returned data structure is a list of nested privileges.
+ * See Sabre\DAVACL\Plugin::getDefaultSupportedPrivilegeSet for a simple
+ * standard structure.
+ *
+ * If null is returned from this method, the default privilege set is used,
+ * which is fine for most common usecases.
+ *
+ * @return array|null
+ */
+ public function getSupportedPrivilegeSet() {
+
+ return null;
+
+ }
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/CardDAV/IAddressBook.php b/vendor/sabre/dav/lib/Sabre/CardDAV/IAddressBook.php
new file mode 100644
index 000000000..ebb8e2b63
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CardDAV/IAddressBook.php
@@ -0,0 +1,20 @@
+<?php
+
+namespace Sabre\CardDAV;
+
+use Sabre\DAV;
+
+/**
+ * AddressBook interface
+ *
+ * Implement this interface to allow a node to be recognized as an addressbook.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+interface IAddressBook extends DAV\ICollection {
+
+
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CardDAV/ICard.php b/vendor/sabre/dav/lib/Sabre/CardDAV/ICard.php
new file mode 100644
index 000000000..f12ad9a1d
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CardDAV/ICard.php
@@ -0,0 +1,20 @@
+<?php
+
+namespace Sabre\CardDAV;
+
+use Sabre\DAV;
+
+/**
+ * Card interface
+ *
+ * Extend the ICard interface to allow your custom nodes to be picked up as
+ * 'Cards'.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+interface ICard extends DAV\IFile {
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/CardDAV/IDirectory.php b/vendor/sabre/dav/lib/Sabre/CardDAV/IDirectory.php
new file mode 100644
index 000000000..f0cfd59a0
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CardDAV/IDirectory.php
@@ -0,0 +1,21 @@
+<?php
+
+namespace Sabre\CardDAV;
+
+/**
+ * IDirectory interface
+ *
+ * Implement this interface to have an addressbook marked as a 'directory'. A
+ * directory is an (often) global addressbook.
+ *
+ * A full description can be found in the IETF draft:
+ * - draft-daboo-carddav-directory-gateway
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+interface IDirectory extends IAddressBook {
+
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CardDAV/Plugin.php b/vendor/sabre/dav/lib/Sabre/CardDAV/Plugin.php
new file mode 100644
index 000000000..7d8d80fd3
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CardDAV/Plugin.php
@@ -0,0 +1,706 @@
+<?php
+
+namespace Sabre\CardDAV;
+
+use Sabre\DAV;
+use Sabre\DAVACL;
+use Sabre\VObject;
+
+/**
+ * CardDAV plugin
+ *
+ * The CardDAV plugin adds CardDAV functionality to the WebDAV server
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Plugin extends DAV\ServerPlugin {
+
+ /**
+ * Url to the addressbooks
+ */
+ const ADDRESSBOOK_ROOT = 'addressbooks';
+
+ /**
+ * xml namespace for CardDAV elements
+ */
+ const NS_CARDDAV = 'urn:ietf:params:xml:ns:carddav';
+
+ /**
+ * Add urls to this property to have them automatically exposed as
+ * 'directories' to the user.
+ *
+ * @var array
+ */
+ public $directories = array();
+
+ /**
+ * Server class
+ *
+ * @var Sabre\DAV\Server
+ */
+ protected $server;
+
+ /**
+ * Initializes the plugin
+ *
+ * @param DAV\Server $server
+ * @return void
+ */
+ public function initialize(DAV\Server $server) {
+
+ /* Events */
+ $server->subscribeEvent('beforeGetProperties', array($this, 'beforeGetProperties'));
+ $server->subscribeEvent('afterGetProperties', array($this, 'afterGetProperties'));
+ $server->subscribeEvent('updateProperties', array($this, 'updateProperties'));
+ $server->subscribeEvent('report', array($this,'report'));
+ $server->subscribeEvent('onHTMLActionsPanel', array($this,'htmlActionsPanel'));
+ $server->subscribeEvent('onBrowserPostAction', array($this,'browserPostAction'));
+ $server->subscribeEvent('beforeWriteContent', array($this, 'beforeWriteContent'));
+ $server->subscribeEvent('beforeCreateFile', array($this, 'beforeCreateFile'));
+
+ /* Namespaces */
+ $server->xmlNamespaces[self::NS_CARDDAV] = 'card';
+
+ /* Mapping Interfaces to {DAV:}resourcetype values */
+ $server->resourceTypeMapping['Sabre\\CardDAV\\IAddressBook'] = '{' . self::NS_CARDDAV . '}addressbook';
+ $server->resourceTypeMapping['Sabre\\CardDAV\\IDirectory'] = '{' . self::NS_CARDDAV . '}directory';
+
+ /* Adding properties that may never be changed */
+ $server->protectedProperties[] = '{' . self::NS_CARDDAV . '}supported-address-data';
+ $server->protectedProperties[] = '{' . self::NS_CARDDAV . '}max-resource-size';
+ $server->protectedProperties[] = '{' . self::NS_CARDDAV . '}addressbook-home-set';
+ $server->protectedProperties[] = '{' . self::NS_CARDDAV . '}supported-collation-set';
+
+ $server->propertyMap['{http://calendarserver.org/ns/}me-card'] = 'Sabre\\DAV\\Property\\Href';
+
+ $this->server = $server;
+
+ }
+
+ /**
+ * Returns a list of supported features.
+ *
+ * This is used in the DAV: header in the OPTIONS and PROPFIND requests.
+ *
+ * @return array
+ */
+ public function getFeatures() {
+
+ return array('addressbook');
+
+ }
+
+ /**
+ * Returns a list of reports this plugin 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
+ * implement them
+ *
+ * @param string $uri
+ * @return array
+ */
+ public function getSupportedReportSet($uri) {
+
+ $node = $this->server->tree->getNodeForPath($uri);
+ if ($node instanceof IAddressBook || $node instanceof ICard) {
+ return array(
+ '{' . self::NS_CARDDAV . '}addressbook-multiget',
+ '{' . self::NS_CARDDAV . '}addressbook-query',
+ );
+ }
+ return array();
+
+ }
+
+
+ /**
+ * Adds all CardDAV-specific properties
+ *
+ * @param string $path
+ * @param DAV\INode $node
+ * @param array $requestedProperties
+ * @param array $returnedProperties
+ * @return void
+ */
+ public function beforeGetProperties($path, DAV\INode $node, array &$requestedProperties, array &$returnedProperties) {
+
+ if ($node instanceof DAVACL\IPrincipal) {
+
+ // calendar-home-set property
+ $addHome = '{' . self::NS_CARDDAV . '}addressbook-home-set';
+ if (in_array($addHome,$requestedProperties)) {
+ $principalId = $node->getName();
+ $addressbookHomePath = self::ADDRESSBOOK_ROOT . '/' . $principalId . '/';
+ unset($requestedProperties[array_search($addHome, $requestedProperties)]);
+ $returnedProperties[200][$addHome] = new DAV\Property\Href($addressbookHomePath);
+ }
+
+ $directories = '{' . self::NS_CARDDAV . '}directory-gateway';
+ if ($this->directories && in_array($directories, $requestedProperties)) {
+ unset($requestedProperties[array_search($directories, $requestedProperties)]);
+ $returnedProperties[200][$directories] = new DAV\Property\HrefList($this->directories);
+ }
+
+ }
+
+ if ($node instanceof ICard) {
+
+ // The address-data property is not supposed to be a 'real'
+ // property, but in large chunks of the spec it does act as such.
+ // Therefore we simply expose it as a property.
+ $addressDataProp = '{' . self::NS_CARDDAV . '}address-data';
+ if (in_array($addressDataProp, $requestedProperties)) {
+ unset($requestedProperties[$addressDataProp]);
+ $val = $node->get();
+ if (is_resource($val))
+ $val = stream_get_contents($val);
+
+ $returnedProperties[200][$addressDataProp] = $val;
+
+ }
+ }
+
+ if ($node instanceof UserAddressBooks) {
+
+ $meCardProp = '{http://calendarserver.org/ns/}me-card';
+ if (in_array($meCardProp, $requestedProperties)) {
+
+ $props = $this->server->getProperties($node->getOwner(), array('{http://sabredav.org/ns}vcard-url'));
+ if (isset($props['{http://sabredav.org/ns}vcard-url'])) {
+
+ $returnedProperties[200][$meCardProp] = new DAV\Property\Href(
+ $props['{http://sabredav.org/ns}vcard-url']
+ );
+ $pos = array_search($meCardProp, $requestedProperties);
+ unset($requestedProperties[$pos]);
+
+ }
+
+ }
+
+ }
+
+ }
+
+ /**
+ * This event is triggered when a PROPPATCH method is executed
+ *
+ * @param array $mutations
+ * @param array $result
+ * @param DAV\INode $node
+ * @return bool
+ */
+ public function updateProperties(&$mutations, &$result, DAV\INode $node) {
+
+ if (!$node instanceof UserAddressBooks) {
+ return true;
+ }
+
+ $meCard = '{http://calendarserver.org/ns/}me-card';
+
+ // The only property we care about
+ if (!isset($mutations[$meCard]))
+ return true;
+
+ $value = $mutations[$meCard];
+ unset($mutations[$meCard]);
+
+ if ($value instanceof DAV\Property\IHref) {
+ $value = $value->getHref();
+ $value = $this->server->calculateUri($value);
+ } elseif (!is_null($value)) {
+ $result[400][$meCard] = null;
+ return false;
+ }
+
+ $innerResult = $this->server->updateProperties(
+ $node->getOwner(),
+ array(
+ '{http://sabredav.org/ns}vcard-url' => $value,
+ )
+ );
+
+ $closureResult = false;
+ foreach($innerResult as $status => $props) {
+ if (is_array($props) && array_key_exists('{http://sabredav.org/ns}vcard-url', $props)) {
+ $result[$status][$meCard] = null;
+ $closureResult = ($status>=200 && $status<300);
+ }
+
+ }
+
+ return $result;
+
+ }
+
+ /**
+ * This functions handles REPORT requests specific to CardDAV
+ *
+ * @param string $reportName
+ * @param \DOMNode $dom
+ * @return bool
+ */
+ public function report($reportName,$dom) {
+
+ switch($reportName) {
+ case '{'.self::NS_CARDDAV.'}addressbook-multiget' :
+ $this->addressbookMultiGetReport($dom);
+ return false;
+ case '{'.self::NS_CARDDAV.'}addressbook-query' :
+ $this->addressBookQueryReport($dom);
+ return false;
+ default :
+ return;
+
+ }
+
+
+ }
+
+ /**
+ * This function handles the addressbook-multiget REPORT.
+ *
+ * This report is used by the client to fetch the content of a series
+ * of urls. Effectively avoiding a lot of redundant requests.
+ *
+ * @param \DOMNode $dom
+ * @return void
+ */
+ public function addressbookMultiGetReport($dom) {
+
+ $properties = array_keys(DAV\XMLUtil::parseProperties($dom->firstChild));
+
+ $hrefElems = $dom->getElementsByTagNameNS('urn:DAV','href');
+ $propertyList = array();
+
+ foreach($hrefElems as $elem) {
+
+ $uri = $this->server->calculateUri($elem->nodeValue);
+ list($propertyList[]) = $this->server->getPropertiesForPath($uri,$properties);
+
+ }
+
+ $prefer = $this->server->getHTTPPRefer();
+
+ $this->server->httpResponse->sendStatus(207);
+ $this->server->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8');
+ $this->server->httpResponse->setHeader('Vary','Brief,Prefer');
+ $this->server->httpResponse->sendBody($this->server->generateMultiStatus($propertyList, $prefer['return-minimal']));
+
+ }
+
+ /**
+ * This method is triggered before a file gets updated with new content.
+ *
+ * This plugin uses this method to ensure that Card nodes receive valid
+ * vcard data.
+ *
+ * @param string $path
+ * @param DAV\IFile $node
+ * @param resource $data
+ * @return void
+ */
+ public function beforeWriteContent($path, DAV\IFile $node, &$data) {
+
+ if (!$node instanceof ICard)
+ return;
+
+ $this->validateVCard($data);
+
+ }
+
+ /**
+ * This method is triggered before a new file is created.
+ *
+ * This plugin uses this method to ensure that Card nodes receive valid
+ * vcard data.
+ *
+ * @param string $path
+ * @param resource $data
+ * @param DAV\ICollection $parentNode
+ * @return void
+ */
+ public function beforeCreateFile($path, &$data, DAV\ICollection $parentNode) {
+
+ if (!$parentNode instanceof IAddressBook)
+ return;
+
+ $this->validateVCard($data);
+
+ }
+
+ /**
+ * Checks if the submitted iCalendar data is in fact, valid.
+ *
+ * An exception is thrown if it's not.
+ *
+ * @param resource|string $data
+ * @return void
+ */
+ protected function validateVCard(&$data) {
+
+ // If it's a stream, we convert it to a string first.
+ if (is_resource($data)) {
+ $data = stream_get_contents($data);
+ }
+
+ // Converting the data to unicode, if needed.
+ $data = DAV\StringUtil::ensureUTF8($data);
+
+ try {
+
+ $vobj = VObject\Reader::read($data);
+
+ } catch (VObject\ParseException $e) {
+
+ throw new DAV\Exception\UnsupportedMediaType('This resource only supports valid vcard data. Parse error: ' . $e->getMessage());
+
+ }
+
+ if ($vobj->name !== 'VCARD') {
+ throw new DAV\Exception\UnsupportedMediaType('This collection can only support vcard objects.');
+ }
+
+ if (!isset($vobj->UID)) {
+ // No UID in vcards is invalid, but we'll just add it in anyway.
+ $vobj->add('UID', DAV\UUIDUtil::getUUID());
+ $data = $vobj->serialize();
+ }
+
+ }
+
+
+ /**
+ * This function handles the addressbook-query REPORT
+ *
+ * This report is used by the client to filter an addressbook based on a
+ * complex query.
+ *
+ * @param \DOMNode $dom
+ * @return void
+ */
+ protected function addressbookQueryReport($dom) {
+
+ $query = new AddressBookQueryParser($dom);
+ $query->parse();
+
+ $depth = $this->server->getHTTPDepth(0);
+
+ if ($depth==0) {
+ $candidateNodes = array(
+ $this->server->tree->getNodeForPath($this->server->getRequestUri())
+ );
+ } else {
+ $candidateNodes = $this->server->tree->getChildren($this->server->getRequestUri());
+ }
+
+ $validNodes = array();
+ foreach($candidateNodes as $node) {
+
+ if (!$node instanceof ICard)
+ continue;
+
+ $blob = $node->get();
+ if (is_resource($blob)) {
+ $blob = stream_get_contents($blob);
+ }
+
+ if (!$this->validateFilters($blob, $query->filters, $query->test)) {
+ continue;
+ }
+
+ $validNodes[] = $node;
+
+ if ($query->limit && $query->limit <= count($validNodes)) {
+ // We hit the maximum number of items, we can stop now.
+ break;
+ }
+
+ }
+
+ $result = array();
+ foreach($validNodes as $validNode) {
+
+ if ($depth==0) {
+ $href = $this->server->getRequestUri();
+ } else {
+ $href = $this->server->getRequestUri() . '/' . $validNode->getName();
+ }
+
+ list($result[]) = $this->server->getPropertiesForPath($href, $query->requestedProperties, 0);
+
+ }
+
+ $prefer = $this->server->getHTTPPRefer();
+
+ $this->server->httpResponse->sendStatus(207);
+ $this->server->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8');
+ $this->server->httpResponse->setHeader('Vary','Brief,Prefer');
+ $this->server->httpResponse->sendBody($this->server->generateMultiStatus($result, $prefer['return-minimal']));
+
+ }
+
+ /**
+ * Validates if a vcard makes it throught a list of filters.
+ *
+ * @param string $vcardData
+ * @param array $filters
+ * @param string $test anyof or allof (which means OR or AND)
+ * @return bool
+ */
+ public function validateFilters($vcardData, array $filters, $test) {
+
+ $vcard = VObject\Reader::read($vcardData);
+
+ if (!$filters) return true;
+
+ foreach($filters as $filter) {
+
+ $isDefined = isset($vcard->{$filter['name']});
+ if ($filter['is-not-defined']) {
+ if ($isDefined) {
+ $success = false;
+ } else {
+ $success = true;
+ }
+ } elseif ((!$filter['param-filters'] && !$filter['text-matches']) || !$isDefined) {
+
+ // We only need to check for existence
+ $success = $isDefined;
+
+ } else {
+
+ $vProperties = $vcard->select($filter['name']);
+
+ $results = array();
+ if ($filter['param-filters']) {
+ $results[] = $this->validateParamFilters($vProperties, $filter['param-filters'], $filter['test']);
+ }
+ if ($filter['text-matches']) {
+ $texts = array();
+ foreach($vProperties as $vProperty)
+ $texts[] = $vProperty->getValue();
+
+ $results[] = $this->validateTextMatches($texts, $filter['text-matches'], $filter['test']);
+ }
+
+ if (count($results)===1) {
+ $success = $results[0];
+ } else {
+ if ($filter['test'] === 'anyof') {
+ $success = $results[0] || $results[1];
+ } else {
+ $success = $results[0] && $results[1];
+ }
+ }
+
+ } // else
+
+ // There are two conditions where we can already determine whether
+ // or not this filter succeeds.
+ if ($test==='anyof' && $success) {
+ return true;
+ }
+ if ($test==='allof' && !$success) {
+ return false;
+ }
+
+ } // foreach
+
+ // If we got all the way here, it means we haven't been able to
+ // determine early if the test failed or not.
+ //
+ // This implies for 'anyof' that the test failed, and for 'allof' that
+ // we succeeded. Sounds weird, but makes sense.
+ return $test==='allof';
+
+ }
+
+ /**
+ * Validates if a param-filter can be applied to a specific property.
+ *
+ * @todo currently we're only validating the first parameter of the passed
+ * property. Any subsequence parameters with the same name are
+ * ignored.
+ * @param array $vProperties
+ * @param array $filters
+ * @param string $test
+ * @return bool
+ */
+ protected function validateParamFilters(array $vProperties, array $filters, $test) {
+
+ foreach($filters as $filter) {
+
+ $isDefined = false;
+ foreach($vProperties as $vProperty) {
+ $isDefined = isset($vProperty[$filter['name']]);
+ if ($isDefined) break;
+ }
+
+ if ($filter['is-not-defined']) {
+ if ($isDefined) {
+ $success = false;
+ } else {
+ $success = true;
+ }
+
+ // If there's no text-match, we can just check for existence
+ } elseif (!$filter['text-match'] || !$isDefined) {
+
+ $success = $isDefined;
+
+ } else {
+
+ $success = false;
+ foreach($vProperties as $vProperty) {
+ // If we got all the way here, we'll need to validate the
+ // text-match filter.
+ $success = DAV\StringUtil::textMatch($vProperty[$filter['name']]->getValue(), $filter['text-match']['value'], $filter['text-match']['collation'], $filter['text-match']['match-type']);
+ if ($success) break;
+ }
+ if ($filter['text-match']['negate-condition']) {
+ $success = !$success;
+ }
+
+ } // else
+
+ // There are two conditions where we can already determine whether
+ // or not this filter succeeds.
+ if ($test==='anyof' && $success) {
+ return true;
+ }
+ if ($test==='allof' && !$success) {
+ return false;
+ }
+
+ }
+
+ // If we got all the way here, it means we haven't been able to
+ // determine early if the test failed or not.
+ //
+ // This implies for 'anyof' that the test failed, and for 'allof' that
+ // we succeeded. Sounds weird, but makes sense.
+ return $test==='allof';
+
+ }
+
+ /**
+ * Validates if a text-filter can be applied to a specific property.
+ *
+ * @param array $texts
+ * @param array $filters
+ * @param string $test
+ * @return bool
+ */
+ protected function validateTextMatches(array $texts, array $filters, $test) {
+
+ foreach($filters as $filter) {
+
+ $success = false;
+ foreach($texts as $haystack) {
+ $success = DAV\StringUtil::textMatch($haystack, $filter['value'], $filter['collation'], $filter['match-type']);
+
+ // Breaking on the first match
+ if ($success) break;
+ }
+ if ($filter['negate-condition']) {
+ $success = !$success;
+ }
+
+ if ($success && $test==='anyof')
+ return true;
+
+ if (!$success && $test=='allof')
+ return false;
+
+
+ }
+
+ // If we got all the way here, it means we haven't been able to
+ // determine early if the test failed or not.
+ //
+ // This implies for 'anyof' that the test failed, and for 'allof' that
+ // we succeeded. Sounds weird, but makes sense.
+ return $test==='allof';
+
+ }
+
+ /**
+ * This event is triggered after webdav-properties have been retrieved.
+ *
+ * @return bool
+ */
+ public function afterGetProperties($uri, &$properties) {
+
+ // If the request was made using the SOGO connector, we must rewrite
+ // the content-type property. By default SabreDAV will send back
+ // text/x-vcard; charset=utf-8, but for SOGO we must strip that last
+ // part.
+ if (!isset($properties[200]['{DAV:}getcontenttype']))
+ return;
+
+ if (strpos($this->server->httpRequest->getHeader('User-Agent'),'Thunderbird')===false) {
+ return;
+ }
+
+ if (strpos($properties[200]['{DAV:}getcontenttype'],'text/x-vcard')===0) {
+ $properties[200]['{DAV:}getcontenttype'] = 'text/x-vcard';
+ }
+
+ }
+
+ /**
+ * This method is used to generate HTML output for the
+ * Sabre\DAV\Browser\Plugin. This allows us to generate an interface users
+ * can use to create new calendars.
+ *
+ * @param DAV\INode $node
+ * @param string $output
+ * @return bool
+ */
+ public function htmlActionsPanel(DAV\INode $node, &$output) {
+
+ if (!$node instanceof UserAddressBooks)
+ return;
+
+ $output.= '<tr><td colspan="2"><form method="post" action="">
+ <h3>Create new address book</h3>
+ <input type="hidden" name="sabreAction" value="mkaddressbook" />
+ <label>Name (uri):</label> <input type="text" name="name" /><br />
+ <label>Display name:</label> <input type="text" name="{DAV:}displayname" /><br />
+ <input type="submit" value="create" />
+ </form>
+ </td></tr>';
+
+ return false;
+
+ }
+
+ /**
+ * This method allows us to intercept the 'mkcalendar' sabreAction. This
+ * action enables the user to create new calendars from the browser plugin.
+ *
+ * @param string $uri
+ * @param string $action
+ * @param array $postVars
+ * @return bool
+ */
+ public function browserPostAction($uri, $action, array $postVars) {
+
+ if ($action!=='mkaddressbook')
+ return;
+
+ $resourceType = array('{DAV:}collection','{urn:ietf:params:xml:ns:carddav}addressbook');
+ $properties = array();
+ if (isset($postVars['{DAV:}displayname'])) {
+ $properties['{DAV:}displayname'] = $postVars['{DAV:}displayname'];
+ }
+ $this->server->createCollection($uri . '/' . $postVars['name'],$resourceType,$properties);
+ return false;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CardDAV/Property/SupportedAddressData.php b/vendor/sabre/dav/lib/Sabre/CardDAV/Property/SupportedAddressData.php
new file mode 100644
index 000000000..b2bb6b551
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CardDAV/Property/SupportedAddressData.php
@@ -0,0 +1,72 @@
+<?php
+
+namespace Sabre\CardDAV\Property;
+
+use Sabre\DAV;
+use Sabre\CardDAV;
+
+/**
+ * Supported-address-data property
+ *
+ * This property is a representation of the supported-address-data property
+ * in the CardDAV namespace.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class SupportedAddressData extends DAV\Property {
+
+ /**
+ * supported versions
+ *
+ * @var array
+ */
+ protected $supportedData = array();
+
+ /**
+ * Creates the property
+ *
+ * @param array|null $supportedData
+ */
+ public function __construct(array $supportedData = null) {
+
+ if (is_null($supportedData)) {
+ $supportedData = array(
+ array('contentType' => 'text/vcard', 'version' => '3.0'),
+ // array('contentType' => 'text/vcard', 'version' => '4.0'),
+ );
+ }
+
+ $this->supportedData = $supportedData;
+
+ }
+
+ /**
+ * Serializes the property in a DOMDocument
+ *
+ * @param DAV\Server $server
+ * @param \DOMElement $node
+ * @return void
+ */
+ public function serialize(DAV\Server $server,\DOMElement $node) {
+
+ $doc = $node->ownerDocument;
+
+ $prefix =
+ isset($server->xmlNamespaces[CardDAV\Plugin::NS_CARDDAV]) ?
+ $server->xmlNamespaces[CardDAV\Plugin::NS_CARDDAV] :
+ 'card';
+
+ foreach($this->supportedData as $supported) {
+
+ $caldata = $doc->createElementNS(CardDAV\Plugin::NS_CARDDAV, $prefix . ':address-data-type');
+ $caldata->setAttribute('content-type',$supported['contentType']);
+ $caldata->setAttribute('version',$supported['version']);
+ $node->appendChild($caldata);
+
+ }
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CardDAV/UserAddressBooks.php b/vendor/sabre/dav/lib/Sabre/CardDAV/UserAddressBooks.php
new file mode 100644
index 000000000..dca465b9e
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CardDAV/UserAddressBooks.php
@@ -0,0 +1,260 @@
+<?php
+
+namespace Sabre\CardDAV;
+
+use Sabre\DAV;
+use Sabre\DAVACL;
+
+/**
+ * UserAddressBooks class
+ *
+ * The UserAddressBooks collection contains a list of addressbooks associated with a user
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class UserAddressBooks extends DAV\Collection implements DAV\IExtendedCollection, DAVACL\IACL {
+
+ /**
+ * Principal uri
+ *
+ * @var array
+ */
+ protected $principalUri;
+
+ /**
+ * carddavBackend
+ *
+ * @var Backend\BackendInterface
+ */
+ protected $carddavBackend;
+
+ /**
+ * Constructor
+ *
+ * @param Backend\BackendInterface $carddavBackend
+ * @param string $principalUri
+ */
+ public function __construct(Backend\BackendInterface $carddavBackend, $principalUri) {
+
+ $this->carddavBackend = $carddavBackend;
+ $this->principalUri = $principalUri;
+
+ }
+
+ /**
+ * Returns the name of this object
+ *
+ * @return string
+ */
+ public function getName() {
+
+ list(,$name) = DAV\URLUtil::splitPath($this->principalUri);
+ return $name;
+
+ }
+
+ /**
+ * Updates the name of this object
+ *
+ * @param string $name
+ * @return void
+ */
+ public function setName($name) {
+
+ throw new DAV\Exception\MethodNotAllowed();
+
+ }
+
+ /**
+ * Deletes this object
+ *
+ * @return void
+ */
+ public function delete() {
+
+ throw new DAV\Exception\MethodNotAllowed();
+
+ }
+
+ /**
+ * Returns the last modification date
+ *
+ * @return int
+ */
+ public function getLastModified() {
+
+ return null;
+
+ }
+
+ /**
+ * Creates a new file under this object.
+ *
+ * This is currently not allowed
+ *
+ * @param string $filename
+ * @param resource $data
+ * @return void
+ */
+ public function createFile($filename, $data=null) {
+
+ throw new DAV\Exception\MethodNotAllowed('Creating new files in this collection is not supported');
+
+ }
+
+ /**
+ * Creates a new directory under this object.
+ *
+ * This is currently not allowed.
+ *
+ * @param string $filename
+ * @return void
+ */
+ public function createDirectory($filename) {
+
+ throw new DAV\Exception\MethodNotAllowed('Creating new collections in this collection is not supported');
+
+ }
+
+ /**
+ * Returns a single calendar, by name
+ *
+ * @param string $name
+ * @todo needs optimizing
+ * @return \AddressBook
+ */
+ public function getChild($name) {
+
+ foreach($this->getChildren() as $child) {
+ if ($name==$child->getName())
+ return $child;
+
+ }
+ throw new DAV\Exception\NotFound('Addressbook with name \'' . $name . '\' could not be found');
+
+ }
+
+ /**
+ * Returns a list of addressbooks
+ *
+ * @return array
+ */
+ public function getChildren() {
+
+ $addressbooks = $this->carddavBackend->getAddressbooksForUser($this->principalUri);
+ $objs = array();
+ foreach($addressbooks as $addressbook) {
+ $objs[] = new AddressBook($this->carddavBackend, $addressbook);
+ }
+ return $objs;
+
+ }
+
+ /**
+ * Creates a new addressbook
+ *
+ * @param string $name
+ * @param array $resourceType
+ * @param array $properties
+ * @return void
+ */
+ public function createExtendedCollection($name, array $resourceType, array $properties) {
+
+ if (!in_array('{'.Plugin::NS_CARDDAV.'}addressbook',$resourceType) || count($resourceType)!==2) {
+ throw new DAV\Exception\InvalidResourceType('Unknown resourceType for this collection');
+ }
+ $this->carddavBackend->createAddressBook($this->principalUri, $name, $properties);
+
+ }
+
+ /**
+ * Returns the owner principal
+ *
+ * This must be a url to a principal, or null if there's no owner
+ *
+ * @return string|null
+ */
+ public function getOwner() {
+
+ return $this->principalUri;
+
+ }
+
+ /**
+ * Returns a group principal
+ *
+ * This must be a url to a principal, or null if there's no owner
+ *
+ * @return string|null
+ */
+ public function getGroup() {
+
+ return null;
+
+ }
+
+ /**
+ * Returns a list of ACE's for this node.
+ *
+ * Each ACE has the following properties:
+ * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are
+ * currently the only supported privileges
+ * * 'principal', a url to the principal who owns the node
+ * * 'protected' (optional), indicating that this ACE is not allowed to
+ * be updated.
+ *
+ * @return array
+ */
+ public function getACL() {
+
+ return array(
+ array(
+ 'privilege' => '{DAV:}read',
+ 'principal' => $this->principalUri,
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}write',
+ 'principal' => $this->principalUri,
+ 'protected' => true,
+ ),
+
+ );
+
+ }
+
+ /**
+ * Updates the ACL
+ *
+ * This method will receive a list of new ACE's.
+ *
+ * @param array $acl
+ * @return void
+ */
+ public function setACL(array $acl) {
+
+ throw new DAV\Exception\MethodNotAllowed('Changing ACL is not yet supported');
+
+ }
+
+ /**
+ * Returns the list of supported privileges for this node.
+ *
+ * The returned data structure is a list of nested privileges.
+ * See Sabre\DAVACL\Plugin::getDefaultSupportedPrivilegeSet for a simple
+ * standard structure.
+ *
+ * If null is returned from this method, the default privilege set is used,
+ * which is fine for most common usecases.
+ *
+ * @return array|null
+ */
+ public function getSupportedPrivilegeSet() {
+
+ return null;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CardDAV/VCFExportPlugin.php b/vendor/sabre/dav/lib/Sabre/CardDAV/VCFExportPlugin.php
new file mode 100644
index 000000000..b1e6f5e48
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CardDAV/VCFExportPlugin.php
@@ -0,0 +1,108 @@
+<?php
+
+namespace Sabre\CardDAV;
+
+use Sabre\DAV;
+use Sabre\VObject;
+
+/**
+ * VCF Exporter
+ *
+ * This plugin adds the ability to export entire address books as .vcf files.
+ * This is useful for clients that don't support CardDAV yet. They often do
+ * support vcf files.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @author Thomas Tanghus (http://tanghus.net/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class VCFExportPlugin extends DAV\ServerPlugin {
+
+ /**
+ * Reference to Server class
+ *
+ * @var Sabre\DAV\Server
+ */
+ protected $server;
+
+ /**
+ * Initializes the plugin and registers event handlers
+ *
+ * @param DAV\Server $server
+ * @return void
+ */
+ public function initialize(DAV\Server $server) {
+
+ $this->server = $server;
+ $this->server->subscribeEvent('beforeMethod',array($this,'beforeMethod'), 90);
+
+ }
+
+ /**
+ * 'beforeMethod' event handles. This event handles intercepts GET requests ending
+ * with ?export
+ *
+ * @param string $method
+ * @param string $uri
+ * @return bool
+ */
+ public function beforeMethod($method, $uri) {
+
+ if ($method!='GET') return;
+ if ($this->server->httpRequest->getQueryString()!='export') return;
+
+ // splitting uri
+ list($uri) = explode('?',$uri,2);
+
+ $node = $this->server->tree->getNodeForPath($uri);
+
+ if (!($node instanceof IAddressBook)) return;
+
+ // Checking ACL, if available.
+ if ($aclPlugin = $this->server->getPlugin('acl')) {
+ $aclPlugin->checkPrivileges($uri, '{DAV:}read');
+ }
+
+ $this->server->httpResponse->setHeader('Content-Type','text/directory');
+ $this->server->httpResponse->sendStatus(200);
+
+ $nodes = $this->server->getPropertiesForPath($uri, array(
+ '{' . Plugin::NS_CARDDAV . '}address-data',
+ ),1);
+
+ $this->server->httpResponse->sendBody($this->generateVCF($nodes));
+
+ // Returning false to break the event chain
+ return false;
+
+ }
+
+ /**
+ * Merges all vcard objects, and builds one big vcf export
+ *
+ * @param array $nodes
+ * @return string
+ */
+ public function generateVCF(array $nodes) {
+
+ $output = "";
+
+ foreach($nodes as $node) {
+
+ if (!isset($node[200]['{' . Plugin::NS_CARDDAV . '}address-data'])) {
+ continue;
+ }
+ $nodeData = $node[200]['{' . Plugin::NS_CARDDAV . '}address-data'];
+
+ // Parsing this node so VObject can clean up the output.
+ $output .=
+ VObject\Reader::read($nodeData)->serialize();
+
+ }
+
+ return $output;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CardDAV/Version.php b/vendor/sabre/dav/lib/Sabre/CardDAV/Version.php
new file mode 100644
index 000000000..9b691423c
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CardDAV/Version.php
@@ -0,0 +1,26 @@
+<?php
+
+namespace Sabre\CardDAV;
+
+/**
+ * Version Class
+ *
+ * This class contains the Sabre\CardDAV version information
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Version {
+
+ /**
+ * Full version number
+ */
+ const VERSION = '1.8.7';
+
+ /**
+ * Stability : alpha, beta, stable
+ */
+ const STABILITY = 'stable';
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Auth/Backend/AbstractBasic.php b/vendor/sabre/dav/lib/Sabre/DAV/Auth/Backend/AbstractBasic.php
new file mode 100644
index 000000000..daa8bd8ad
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Auth/Backend/AbstractBasic.php
@@ -0,0 +1,87 @@
+<?php
+
+namespace Sabre\DAV\Auth\Backend;
+
+use Sabre\DAV;
+use Sabre\HTTP;
+
+/**
+ * HTTP Basic authentication backend class
+ *
+ * This class can be used by authentication objects wishing to use HTTP Basic
+ * Most of the digest logic is handled, implementors just need to worry about
+ * the validateUserPass method.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author James David Low (http://jameslow.com/)
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+abstract class AbstractBasic implements BackendInterface {
+
+ /**
+ * This variable holds the currently logged in username.
+ *
+ * @var string|null
+ */
+ protected $currentUser;
+
+ /**
+ * Validates a username and password
+ *
+ * This method should return true or false depending on if login
+ * succeeded.
+ *
+ * @param string $username
+ * @param string $password
+ * @return bool
+ */
+ abstract protected function validateUserPass($username, $password);
+
+ /**
+ * Returns information about the currently logged in username.
+ *
+ * If nobody is currently logged in, this method should return null.
+ *
+ * @return string|null
+ */
+ public function getCurrentUser() {
+ return $this->currentUser;
+ }
+
+
+ /**
+ * Authenticates the user based on the current request.
+ *
+ * If authentication is successful, true must be returned.
+ * If authentication fails, an exception must be thrown.
+ *
+ * @param DAV\Server $server
+ * @param string $realm
+ * @throws DAV\Exception\NotAuthenticated
+ * @return bool
+ */
+ public function authenticate(DAV\Server $server, $realm) {
+
+ $auth = new HTTP\BasicAuth();
+ $auth->setHTTPRequest($server->httpRequest);
+ $auth->setHTTPResponse($server->httpResponse);
+ $auth->setRealm($realm);
+ $userpass = $auth->getUserPass();
+ if (!$userpass) {
+ $auth->requireLogin();
+ throw new DAV\Exception\NotAuthenticated('No basic authentication headers were found');
+ }
+
+ // Authenticates the user
+ if (!$this->validateUserPass($userpass[0],$userpass[1])) {
+ $auth->requireLogin();
+ throw new DAV\Exception\NotAuthenticated('Username or password does not match');
+ }
+ $this->currentUser = $userpass[0];
+ return true;
+ }
+
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Auth/Backend/AbstractDigest.php b/vendor/sabre/dav/lib/Sabre/DAV/Auth/Backend/AbstractDigest.php
new file mode 100644
index 000000000..14993a014
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Auth/Backend/AbstractDigest.php
@@ -0,0 +1,101 @@
+<?php
+
+namespace Sabre\DAV\Auth\Backend;
+
+use Sabre\HTTP;
+use Sabre\DAV;
+
+/**
+ * HTTP Digest authentication backend class
+ *
+ * This class can be used by authentication objects wishing to use HTTP Digest
+ * Most of the digest logic is handled, implementors just need to worry about
+ * the getDigestHash method
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+abstract class AbstractDigest implements BackendInterface {
+
+ /**
+ * This variable holds the currently logged in username.
+ *
+ * @var array|null
+ */
+ protected $currentUser;
+
+ /**
+ * Returns a users digest hash based on the username and realm.
+ *
+ * If the user was not known, null must be returned.
+ *
+ * @param string $realm
+ * @param string $username
+ * @return string|null
+ */
+ abstract public function getDigestHash($realm, $username);
+
+ /**
+ * Authenticates the user based on the current request.
+ *
+ * If authentication is successful, true must be returned.
+ * If authentication fails, an exception must be thrown.
+ *
+ * @param DAV\Server $server
+ * @param string $realm
+ * @throws DAV\Exception\NotAuthenticated
+ * @return bool
+ */
+ public function authenticate(DAV\Server $server, $realm) {
+
+ $digest = new HTTP\DigestAuth();
+
+ // Hooking up request and response objects
+ $digest->setHTTPRequest($server->httpRequest);
+ $digest->setHTTPResponse($server->httpResponse);
+
+ $digest->setRealm($realm);
+ $digest->init();
+
+ $username = $digest->getUsername();
+
+ // No username was given
+ if (!$username) {
+ $digest->requireLogin();
+ throw new DAV\Exception\NotAuthenticated('No digest authentication headers were found');
+ }
+
+ $hash = $this->getDigestHash($realm, $username);
+ // If this was false, the user account didn't exist
+ if ($hash===false || is_null($hash)) {
+ $digest->requireLogin();
+ throw new DAV\Exception\NotAuthenticated('The supplied username was not on file');
+ }
+ if (!is_string($hash)) {
+ throw new DAV\Exception('The returned value from getDigestHash must be a string or null');
+ }
+
+ // If this was false, the password or part of the hash was incorrect.
+ if (!$digest->validateA1($hash)) {
+ $digest->requireLogin();
+ throw new DAV\Exception\NotAuthenticated('Incorrect username');
+ }
+
+ $this->currentUser = $username;
+ return true;
+
+ }
+
+ /**
+ * Returns the currently logged in username.
+ *
+ * @return string|null
+ */
+ public function getCurrentUser() {
+
+ return $this->currentUser;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Auth/Backend/Apache.php b/vendor/sabre/dav/lib/Sabre/DAV/Auth/Backend/Apache.php
new file mode 100644
index 000000000..bdde16716
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Auth/Backend/Apache.php
@@ -0,0 +1,63 @@
+<?php
+
+namespace Sabre\DAV\Auth\Backend;
+use Sabre\DAV;
+
+/**
+ * Apache authenticator
+ *
+ * This authentication backend assumes that authentication has been
+ * configured in apache, rather than within SabreDAV.
+ *
+ * Make sure apache is properly configured for this to work.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Apache implements BackendInterface {
+
+ /**
+ * Current apache user
+ *
+ * @var string
+ */
+ protected $remoteUser;
+
+ /**
+ * Authenticates the user based on the current request.
+ *
+ * If authentication is successful, true must be returned.
+ * If authentication fails, an exception must be thrown.
+ *
+ * @param DAV\Server $server
+ * @param string $realm
+ * @return bool
+ */
+ public function authenticate(DAV\Server $server, $realm) {
+
+ $remoteUser = $server->httpRequest->getRawServerValue('REMOTE_USER');
+ if (is_null($remoteUser)) {
+ throw new DAV\Exception('We did not receive the $_SERVER[REMOTE_USER] property. This means that apache might have been misconfigured');
+ }
+
+ $this->remoteUser = $remoteUser;
+ return true;
+
+ }
+
+ /**
+ * Returns information about the currently logged in user.
+ *
+ * If nobody is currently logged in, this method should return null.
+ *
+ * @return array|null
+ */
+ public function getCurrentUser() {
+
+ return $this->remoteUser;
+
+ }
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Auth/Backend/BackendInterface.php b/vendor/sabre/dav/lib/Sabre/DAV/Auth/Backend/BackendInterface.php
new file mode 100644
index 000000000..140adaa2e
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Auth/Backend/BackendInterface.php
@@ -0,0 +1,36 @@
+<?php
+
+namespace Sabre\DAV\Auth\Backend;
+
+/**
+ * This is the base class for any authentication object.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+interface BackendInterface {
+
+ /**
+ * Authenticates the user based on the current request.
+ *
+ * If authentication is successful, true must be returned.
+ * If authentication fails, an exception must be thrown.
+ *
+ * @param \Sabre\DAV\Server $server
+ * @param string $realm
+ * @return bool
+ */
+ function authenticate(\Sabre\DAV\Server $server,$realm);
+
+ /**
+ * Returns information about the currently logged in username.
+ *
+ * If nobody is currently logged in, this method should return null.
+ *
+ * @return string|null
+ */
+ function getCurrentUser();
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Auth/Backend/File.php b/vendor/sabre/dav/lib/Sabre/DAV/Auth/Backend/File.php
new file mode 100644
index 000000000..c325b1e5b
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Auth/Backend/File.php
@@ -0,0 +1,77 @@
+<?php
+
+namespace Sabre\DAV\Auth\Backend;
+
+use Sabre\DAV;
+
+/**
+ * This is an authentication backend that uses a file to manage passwords.
+ *
+ * The backend file must conform to Apache's htdigest format
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class File extends AbstractDigest {
+
+ /**
+ * List of users
+ *
+ * @var array
+ */
+ protected $users = array();
+
+ /**
+ * Creates the backend object.
+ *
+ * If the filename argument is passed in, it will parse out the specified file fist.
+ *
+ * @param string|null $filename
+ */
+ public function __construct($filename=null) {
+
+ if (!is_null($filename))
+ $this->loadFile($filename);
+
+ }
+
+ /**
+ * Loads an htdigest-formatted file. This method can be called multiple times if
+ * more than 1 file is used.
+ *
+ * @param string $filename
+ * @return void
+ */
+ public function loadFile($filename) {
+
+ foreach(file($filename,FILE_IGNORE_NEW_LINES) as $line) {
+
+ if (substr_count($line, ":") !== 2)
+ throw new DAV\Exception('Malformed htdigest file. Every line should contain 2 colons');
+
+ list($username,$realm,$A1) = explode(':',$line);
+
+ if (!preg_match('/^[a-zA-Z0-9]{32}$/', $A1))
+ throw new DAV\Exception('Malformed htdigest file. Invalid md5 hash');
+
+ $this->users[$realm . ':' . $username] = $A1;
+
+ }
+
+ }
+
+ /**
+ * Returns a users' information
+ *
+ * @param string $realm
+ * @param string $username
+ * @return string
+ */
+ public function getDigestHash($realm, $username) {
+
+ return isset($this->users[$realm . ':' . $username])?$this->users[$realm . ':' . $username]:false;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Auth/Backend/PDO.php b/vendor/sabre/dav/lib/Sabre/DAV/Auth/Backend/PDO.php
new file mode 100644
index 000000000..1bc6699b7
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Auth/Backend/PDO.php
@@ -0,0 +1,65 @@
+<?php
+
+namespace Sabre\DAV\Auth\Backend;
+
+/**
+ * This is an authentication backend that uses a file to manage passwords.
+ *
+ * The backend file must conform to Apache's htdigest format
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class PDO extends AbstractDigest {
+
+ /**
+ * Reference to PDO connection
+ *
+ * @var PDO
+ */
+ protected $pdo;
+
+ /**
+ * PDO table name we'll be using
+ *
+ * @var string
+ */
+ protected $tableName;
+
+
+ /**
+ * Creates the backend object.
+ *
+ * If the filename argument is passed in, it will parse out the specified file fist.
+ *
+ * @param PDO $pdo
+ * @param string $tableName The PDO table name to use
+ */
+ public function __construct(\PDO $pdo, $tableName = 'users') {
+
+ $this->pdo = $pdo;
+ $this->tableName = $tableName;
+
+ }
+
+ /**
+ * Returns the digest hash for a user.
+ *
+ * @param string $realm
+ * @param string $username
+ * @return string|null
+ */
+ public function getDigestHash($realm,$username) {
+
+ $stmt = $this->pdo->prepare('SELECT username, digesta1 FROM '.$this->tableName.' WHERE username = ?');
+ $stmt->execute(array($username));
+ $result = $stmt->fetchAll();
+
+ if (!count($result)) return;
+
+ return $result[0]['digesta1'];
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Auth/Plugin.php b/vendor/sabre/dav/lib/Sabre/DAV/Auth/Plugin.php
new file mode 100644
index 000000000..fccbcc22f
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Auth/Plugin.php
@@ -0,0 +1,112 @@
+<?php
+
+namespace Sabre\DAV\Auth;
+use Sabre\DAV;
+
+/**
+ * This plugin provides Authentication for a WebDAV server.
+ *
+ * It relies on a Backend object, which provides user information.
+ *
+ * Additionally, it provides support for:
+ * * {DAV:}current-user-principal property from RFC5397
+ * * {DAV:}principal-collection-set property from RFC3744
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Plugin extends DAV\ServerPlugin {
+
+ /**
+ * Reference to main server object
+ *
+ * @var Sabre\DAV\Server
+ */
+ protected $server;
+
+ /**
+ * Authentication backend
+ *
+ * @var Backend\BackendInterface
+ */
+ protected $authBackend;
+
+ /**
+ * The authentication realm.
+ *
+ * @var string
+ */
+ private $realm;
+
+ /**
+ * __construct
+ *
+ * @param Backend\BackendInterface $authBackend
+ * @param string $realm
+ */
+ public function __construct(Backend\BackendInterface $authBackend, $realm) {
+
+ $this->authBackend = $authBackend;
+ $this->realm = $realm;
+
+ }
+
+ /**
+ * Initializes the plugin. This function is automatically called by the server
+ *
+ * @param DAV\Server $server
+ * @return void
+ */
+ public function initialize(DAV\Server $server) {
+
+ $this->server = $server;
+ $this->server->subscribeEvent('beforeMethod',array($this,'beforeMethod'),10);
+
+ }
+
+ /**
+ * Returns a plugin name.
+ *
+ * Using this name other plugins will be able to access other plugins
+ * using DAV\Server::getPlugin
+ *
+ * @return string
+ */
+ public function getPluginName() {
+
+ return 'auth';
+
+ }
+
+ /**
+ * Returns the current users' principal uri.
+ *
+ * If nobody is logged in, this will return null.
+ *
+ * @return string|null
+ */
+ public function getCurrentUser() {
+
+ $userInfo = $this->authBackend->getCurrentUser();
+ if (!$userInfo) return null;
+
+ return $userInfo;
+
+ }
+
+ /**
+ * This method is called before any HTTP method and forces users to be authenticated
+ *
+ * @param string $method
+ * @param string $uri
+ * @throws Sabre\DAV\Exception\NotAuthenticated
+ * @return bool
+ */
+ public function beforeMethod($method, $uri) {
+
+ $this->authBackend->authenticate($this->server,$this->realm);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Browser/GuessContentType.php b/vendor/sabre/dav/lib/Sabre/DAV/Browser/GuessContentType.php
new file mode 100644
index 000000000..36c63f515
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Browser/GuessContentType.php
@@ -0,0 +1,99 @@
+<?php
+
+namespace Sabre\DAV\Browser;
+
+use Sabre\DAV;
+
+/**
+ * GuessContentType plugin
+ *
+ * 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
+ * they expect a correct contenttype.
+ *
+ * There's really no accurate, fast and portable way to determine the contenttype
+ * so this extension does what the rest of the world does, and guesses it based
+ * on the file extension.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class GuessContentType extends DAV\ServerPlugin {
+
+ /**
+ * List of recognized file extensions
+ *
+ * Feel free to add more
+ *
+ * @var array
+ */
+ public $extensionMap = array(
+
+ // images
+ 'jpg' => 'image/jpeg',
+ 'gif' => 'image/gif',
+ 'png' => 'image/png',
+
+ // groupware
+ 'ics' => 'text/calendar',
+ 'vcf' => 'text/x-vcard',
+
+ // text
+ 'txt' => 'text/plain',
+
+ );
+
+ /**
+ * Initializes the plugin
+ *
+ * @param DAV\Server $server
+ * @return void
+ */
+ public function initialize(DAV\Server $server) {
+
+ // Using a relatively low priority (200) to allow other extensions
+ // to set the content-type first.
+ $server->subscribeEvent('afterGetProperties',array($this,'afterGetProperties'),200);
+
+ }
+
+ /**
+ * Handler for teh afterGetProperties event
+ *
+ * @param string $path
+ * @param array $properties
+ * @return void
+ */
+ public function afterGetProperties($path, &$properties) {
+
+ if (array_key_exists('{DAV:}getcontenttype', $properties[404])) {
+
+ list(, $fileName) = DAV\URLUtil::splitPath($path);
+ $contentType = $this->getContentType($fileName);
+
+ if ($contentType) {
+ $properties[200]['{DAV:}getcontenttype'] = $contentType;
+ unset($properties[404]['{DAV:}getcontenttype']);
+ }
+
+ }
+
+ }
+
+ /**
+ * Simple method to return the contenttype
+ *
+ * @param string $fileName
+ * @return string
+ */
+ protected function getContentType($fileName) {
+
+ // Just grabbing the extension
+ $extension = strtolower(substr($fileName,strrpos($fileName,'.')+1));
+ if (isset($this->extensionMap[$extension]))
+ return $this->extensionMap[$extension];
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Browser/MapGetToPropFind.php b/vendor/sabre/dav/lib/Sabre/DAV/Browser/MapGetToPropFind.php
new file mode 100644
index 000000000..a429e8f88
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Browser/MapGetToPropFind.php
@@ -0,0 +1,57 @@
+<?php
+
+namespace Sabre\DAV\Browser;
+
+use Sabre\DAV;
+
+/**
+ * This is a simple plugin that will map any GET request for non-files to
+ * PROPFIND allprops-requests.
+ *
+ * This should allow easy debugging of PROPFIND
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class MapGetToPropFind extends DAV\ServerPlugin {
+
+ /**
+ * reference to server class
+ *
+ * @var Sabre\DAV\Server
+ */
+ protected $server;
+
+ /**
+ * Initializes the plugin and subscribes to events
+ *
+ * @param DAV\Server $server
+ * @return void
+ */
+ public function initialize(DAV\Server $server) {
+
+ $this->server = $server;
+ $this->server->subscribeEvent('beforeMethod',array($this,'httpGetInterceptor'));
+ }
+
+ /**
+ * This method intercepts GET requests to non-files, and changes it into an HTTP PROPFIND request
+ *
+ * @param string $method
+ * @param string $uri
+ * @return bool
+ */
+ public function httpGetInterceptor($method, $uri) {
+
+ if ($method!='GET') return true;
+
+ $node = $this->server->tree->getNodeForPath($uri);
+ if ($node instanceof DAV\IFile) return;
+
+ $this->server->invokeMethod('PROPFIND',$uri);
+ return false;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Browser/Plugin.php b/vendor/sabre/dav/lib/Sabre/DAV/Browser/Plugin.php
new file mode 100644
index 000000000..5fefc7ee2
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Browser/Plugin.php
@@ -0,0 +1,491 @@
+<?php
+
+namespace Sabre\DAV\Browser;
+
+use Sabre\DAV;
+
+/**
+ * Browser Plugin
+ *
+ * This plugin 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
+ * html index.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Plugin extends DAV\ServerPlugin {
+
+ /**
+ * List of default icons for nodes.
+ *
+ * This is an array with class / interface names as keys, and asset names
+ * as values.
+ *
+ * The evaluation order is reversed. The last item in the list gets
+ * precendence.
+ *
+ * @var array
+ */
+ public $iconMap = array(
+ 'Sabre\\DAV\\IFile' => 'icons/file',
+ 'Sabre\\DAV\\ICollection' => 'icons/collection',
+ 'Sabre\\DAVACL\\IPrincipal' => 'icons/principal',
+ 'Sabre\\CalDAV\\ICalendar' => 'icons/calendar',
+ 'Sabre\\CardDAV\\IAddressBook' => 'icons/addressbook',
+ 'Sabre\\CardDAV\\ICard' => 'icons/card',
+ );
+
+ /**
+ * The file extension used for all icons
+ *
+ * @var string
+ */
+ public $iconExtension = '.png';
+
+ /**
+ * reference to server class
+ *
+ * @var Sabre\DAV\Server
+ */
+ protected $server;
+
+ /**
+ * enablePost turns on the 'actions' panel, which allows people to create
+ * folders and upload files straight from a browser.
+ *
+ * @var bool
+ */
+ protected $enablePost = true;
+
+ /**
+ * By default the browser plugin will generate a favicon and other images.
+ * To turn this off, set this property to false.
+ *
+ * @var bool
+ */
+ protected $enableAssets = true;
+
+ /**
+ * Creates the object.
+ *
+ * By default it will allow file creation and uploads.
+ * Specify the first argument as false to disable this
+ *
+ * @param bool $enablePost
+ * @param bool $enableAssets
+ */
+ public function __construct($enablePost=true, $enableAssets = true) {
+
+ $this->enablePost = $enablePost;
+ $this->enableAssets = $enableAssets;
+
+ }
+
+ /**
+ * Initializes the plugin and subscribes to events
+ *
+ * @param DAV\Server $server
+ * @return void
+ */
+ public function initialize(DAV\Server $server) {
+
+ $this->server = $server;
+ $this->server->subscribeEvent('beforeMethod',array($this,'httpGetInterceptor'));
+ $this->server->subscribeEvent('onHTMLActionsPanel', array($this, 'htmlActionsPanel'),200);
+ if ($this->enablePost) $this->server->subscribeEvent('unknownMethod',array($this,'httpPOSTHandler'));
+ }
+
+ /**
+ * This method intercepts GET requests to collections and returns the html
+ *
+ * @param string $method
+ * @param string $uri
+ * @return bool
+ */
+ public function httpGetInterceptor($method, $uri) {
+
+ if ($method !== 'GET') return true;
+
+ // We're not using straight-up $_GET, because we want everything to be
+ // unit testable.
+ $getVars = array();
+ parse_str($this->server->httpRequest->getQueryString(), $getVars);
+
+ if (isset($getVars['sabreAction']) && $getVars['sabreAction'] === 'asset' && isset($getVars['assetName'])) {
+ $this->serveAsset($getVars['assetName']);
+ return false;
+ }
+
+ try {
+ $node = $this->server->tree->getNodeForPath($uri);
+ } catch (DAV\Exception\NotFound $e) {
+ // We're simply stopping when the file isn't found to not interfere
+ // with other plugins.
+ return;
+ }
+ if ($node instanceof DAV\IFile)
+ return;
+
+ $this->server->httpResponse->sendStatus(200);
+ $this->server->httpResponse->setHeader('Content-Type','text/html; charset=utf-8');
+
+ $this->server->httpResponse->sendBody(
+ $this->generateDirectoryIndex($uri)
+ );
+
+ return false;
+
+ }
+
+ /**
+ * Handles POST requests for tree operations.
+ *
+ * @param string $method
+ * @param string $uri
+ * @return bool
+ */
+ public function httpPOSTHandler($method, $uri) {
+
+ if ($method!='POST') return;
+ $contentType = $this->server->httpRequest->getHeader('Content-Type');
+ list($contentType) = explode(';', $contentType);
+ if ($contentType !== 'application/x-www-form-urlencoded' &&
+ $contentType !== 'multipart/form-data') {
+ return;
+ }
+ $postVars = $this->server->httpRequest->getPostVars();
+
+ if (!isset($postVars['sabreAction']))
+ return;
+
+ if ($this->server->broadcastEvent('onBrowserPostAction', array($uri, $postVars['sabreAction'], $postVars))) {
+
+ switch($postVars['sabreAction']) {
+
+ case 'mkcol' :
+ if (isset($postVars['name']) && trim($postVars['name'])) {
+ // Using basename() because we won't allow slashes
+ list(, $folderName) = DAV\URLUtil::splitPath(trim($postVars['name']));
+ $this->server->createDirectory($uri . '/' . $folderName);
+ }
+ break;
+ case 'put' :
+ if ($_FILES) $file = current($_FILES);
+ else break;
+
+ list(, $newName) = DAV\URLUtil::splitPath(trim($file['name']));
+ if (isset($postVars['name']) && trim($postVars['name']))
+ $newName = trim($postVars['name']);
+
+ // Making sure we only have a 'basename' component
+ list(, $newName) = DAV\URLUtil::splitPath($newName);
+
+ if (is_uploaded_file($file['tmp_name'])) {
+ $this->server->createFile($uri . '/' . $newName, fopen($file['tmp_name'],'r'));
+ }
+ break;
+
+ }
+
+ }
+ $this->server->httpResponse->setHeader('Location',$this->server->httpRequest->getUri());
+ $this->server->httpResponse->sendStatus(302);
+ return false;
+
+ }
+
+ /**
+ * Escapes a string for html.
+ *
+ * @param string $value
+ * @return string
+ */
+ public function escapeHTML($value) {
+
+ return htmlspecialchars($value,ENT_QUOTES,'UTF-8');
+
+ }
+
+ /**
+ * Generates the html directory index for a given url
+ *
+ * @param string $path
+ * @return string
+ */
+ public function generateDirectoryIndex($path) {
+
+ $version = '';
+ if (DAV\Server::$exposeVersion) {
+ $version = DAV\Version::VERSION ."-". DAV\Version::STABILITY;
+ }
+
+ $html = "<html>
+<head>
+ <title>Index for " . $this->escapeHTML($path) . "/ - SabreDAV " . $version . "</title>
+ <style type=\"text/css\">
+ body { Font-family: arial}
+ h1 { font-size: 150% }
+ </style>
+ ";
+
+ if ($this->enableAssets) {
+ $html.='<link rel="shortcut icon" href="'.$this->getAssetUrl('favicon.ico').'" type="image/vnd.microsoft.icon" />';
+ }
+
+ $html .= "</head>
+<body>
+ <h1>Index for " . $this->escapeHTML($path) . "/</h1>
+ <table>
+ <tr><th width=\"24\"></th><th>Name</th><th>Type</th><th>Size</th><th>Last modified</th></tr>
+ <tr><td colspan=\"5\"><hr /></td></tr>";
+
+ $files = $this->server->getPropertiesForPath($path,array(
+ '{DAV:}displayname',
+ '{DAV:}resourcetype',
+ '{DAV:}getcontenttype',
+ '{DAV:}getcontentlength',
+ '{DAV:}getlastmodified',
+ ),1);
+
+ $parent = $this->server->tree->getNodeForPath($path);
+
+
+ if ($path) {
+
+ list($parentUri) = DAV\URLUtil::splitPath($path);
+ $fullPath = DAV\URLUtil::encodePath($this->server->getBaseUri() . $parentUri);
+
+ $icon = $this->enableAssets?'<a href="' . $fullPath . '"><img src="' . $this->getAssetUrl('icons/parent' . $this->iconExtension) . '" width="24" alt="Parent" /></a>':'';
+ $html.= "<tr>
+ <td>$icon</td>
+ <td><a href=\"{$fullPath}\">..</a></td>
+ <td>[parent]</td>
+ <td></td>
+ <td></td>
+ </tr>";
+
+ }
+
+ foreach($files as $file) {
+
+ // This is the current directory, we can skip it
+ if (rtrim($file['href'],'/')==$path) continue;
+
+ list(, $name) = DAV\URLUtil::splitPath($file['href']);
+
+ $type = null;
+
+
+ if (isset($file[200]['{DAV:}resourcetype'])) {
+ $type = $file[200]['{DAV:}resourcetype']->getValue();
+
+ // resourcetype can have multiple values
+ if (!is_array($type)) $type = array($type);
+
+ foreach($type as $k=>$v) {
+
+ // Some name mapping is preferred
+ switch($v) {
+ case '{DAV:}collection' :
+ $type[$k] = 'Collection';
+ break;
+ case '{DAV:}principal' :
+ $type[$k] = 'Principal';
+ break;
+ case '{urn:ietf:params:xml:ns:carddav}addressbook' :
+ $type[$k] = 'Addressbook';
+ break;
+ case '{urn:ietf:params:xml:ns:caldav}calendar' :
+ $type[$k] = 'Calendar';
+ break;
+ case '{urn:ietf:params:xml:ns:caldav}schedule-inbox' :
+ $type[$k] = 'Schedule Inbox';
+ break;
+ case '{urn:ietf:params:xml:ns:caldav}schedule-outbox' :
+ $type[$k] = 'Schedule Outbox';
+ break;
+ case '{http://calendarserver.org/ns/}calendar-proxy-read' :
+ $type[$k] = 'Proxy-Read';
+ break;
+ case '{http://calendarserver.org/ns/}calendar-proxy-write' :
+ $type[$k] = 'Proxy-Write';
+ break;
+ }
+
+ }
+ $type = implode(', ', $type);
+ }
+
+ // If no resourcetype was found, we attempt to use
+ // the contenttype property
+ if (!$type && isset($file[200]['{DAV:}getcontenttype'])) {
+ $type = $file[200]['{DAV:}getcontenttype'];
+ }
+ if (!$type) $type = 'Unknown';
+
+ $size = isset($file[200]['{DAV:}getcontentlength'])?(int)$file[200]['{DAV:}getcontentlength']:'';
+ $lastmodified = isset($file[200]['{DAV:}getlastmodified'])?$file[200]['{DAV:}getlastmodified']->getTime()->format(\DateTime::ATOM):'';
+
+ $fullPath = DAV\URLUtil::encodePath('/' . trim($this->server->getBaseUri() . ($path?$path . '/':'') . $name,'/'));
+
+ $displayName = isset($file[200]['{DAV:}displayname'])?$file[200]['{DAV:}displayname']:$name;
+
+ $displayName = $this->escapeHTML($displayName);
+ $type = $this->escapeHTML($type);
+
+ $icon = '';
+
+ if ($this->enableAssets) {
+ $node = $this->server->tree->getNodeForPath(($path?$path.'/':'') . $name);
+ foreach(array_reverse($this->iconMap) as $class=>$iconName) {
+
+ if ($node instanceof $class) {
+ $icon = '<a href="' . $fullPath . '"><img src="' . $this->getAssetUrl($iconName . $this->iconExtension) . '" alt="" width="24" /></a>';
+ break;
+ }
+
+
+ }
+
+ }
+
+ $html.= "<tr>
+ <td>$icon</td>
+ <td><a href=\"{$fullPath}\">{$displayName}</a></td>
+ <td>{$type}</td>
+ <td>{$size}</td>
+ <td>{$lastmodified}</td>
+ </tr>";
+
+ }
+
+ $html.= "<tr><td colspan=\"5\"><hr /></td></tr>";
+
+ $output = '';
+
+ if ($this->enablePost) {
+ $this->server->broadcastEvent('onHTMLActionsPanel',array($parent, &$output));
+ }
+
+ $html.=$output;
+
+ $html.= "</table>
+ <address>Generated by SabreDAV " . $version . " (c)2007-2013 <a href=\"http://code.google.com/p/sabredav/\">http://code.google.com/p/sabredav/</a></address>
+ </body>
+ </html>";
+
+ return $html;
+
+ }
+
+ /**
+ * This method is used to generate the 'actions panel' output for
+ * collections.
+ *
+ * This specifically generates the interfaces for creating new files, and
+ * creating new directories.
+ *
+ * @param DAV\INode $node
+ * @param mixed $output
+ * @return void
+ */
+ public function htmlActionsPanel(DAV\INode $node, &$output) {
+
+ if (!$node instanceof DAV\ICollection)
+ return;
+
+ // We also know fairly certain that if an object is a non-extended
+ // SimpleCollection, we won't need to show the panel either.
+ if (get_class($node)==='Sabre\\DAV\\SimpleCollection')
+ return;
+
+ $output.= '<tr><td colspan="2"><form method="post" action="">
+ <h3>Create new folder</h3>
+ <input type="hidden" name="sabreAction" value="mkcol" />
+ Name: <input type="text" name="name" /><br />
+ <input type="submit" value="create" />
+ </form>
+ <form method="post" action="" enctype="multipart/form-data">
+ <h3>Upload file</h3>
+ <input type="hidden" name="sabreAction" value="put" />
+ Name (optional): <input type="text" name="name" /><br />
+ File: <input type="file" name="file" /><br />
+ <input type="submit" value="upload" />
+ </form>
+ </td></tr>';
+
+ }
+
+ /**
+ * This method takes a path/name of an asset and turns it into url
+ * suiteable for http access.
+ *
+ * @param string $assetName
+ * @return string
+ */
+ protected function getAssetUrl($assetName) {
+
+ return $this->server->getBaseUri() . '?sabreAction=asset&assetName=' . urlencode($assetName);
+
+ }
+
+ /**
+ * This method returns a local pathname to an asset.
+ *
+ * @param string $assetName
+ * @return string
+ */
+ protected function getLocalAssetPath($assetName) {
+
+ $assetDir = __DIR__ . '/assets/';
+ $path = $assetDir . $assetName;
+
+ // Making sure people aren't trying to escape from the base path.
+ if (strpos(realpath($path), realpath($assetDir)) === 0) {
+ return $path;
+ }
+ throw new DAV\Exception\Forbidden('Path does not exist, or escaping from the base path was detected');
+ }
+
+ /**
+ * This method reads an asset from disk and generates a full http response.
+ *
+ * @param string $assetName
+ * @return void
+ */
+ protected function serveAsset($assetName) {
+
+ $assetPath = $this->getLocalAssetPath($assetName);
+ if (!file_exists($assetPath)) {
+ throw new DAV\Exception\NotFound('Could not find an asset with this name');
+ }
+ // Rudimentary mime type detection
+ switch(strtolower(substr($assetPath,strpos($assetPath,'.')+1))) {
+
+ case 'ico' :
+ $mime = 'image/vnd.microsoft.icon';
+ break;
+
+ case 'png' :
+ $mime = 'image/png';
+ break;
+
+ default:
+ $mime = 'application/octet-stream';
+ break;
+
+ }
+
+ $this->server->httpResponse->setHeader('Content-Type', $mime);
+ $this->server->httpResponse->setHeader('Content-Length', filesize($assetPath));
+ $this->server->httpResponse->setHeader('Cache-Control', 'public, max-age=1209600');
+ $this->server->httpResponse->sendStatus(200);
+ $this->server->httpResponse->sendBody(fopen($assetPath,'r'));
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Browser/assets/icons/addressbook.png b/vendor/sabre/dav/lib/Sabre/DAV/Browser/assets/icons/addressbook.png
new file mode 100644
index 000000000..c9acc8417
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Browser/assets/icons/addressbook.png
Binary files differ
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Browser/assets/icons/calendar.png b/vendor/sabre/dav/lib/Sabre/DAV/Browser/assets/icons/calendar.png
new file mode 100644
index 000000000..3ecd6a800
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Browser/assets/icons/calendar.png
Binary files differ
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Browser/assets/icons/card.png b/vendor/sabre/dav/lib/Sabre/DAV/Browser/assets/icons/card.png
new file mode 100644
index 000000000..2ce954866
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Browser/assets/icons/card.png
Binary files differ
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Browser/assets/icons/collection.png b/vendor/sabre/dav/lib/Sabre/DAV/Browser/assets/icons/collection.png
new file mode 100644
index 000000000..156fa64fd
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Browser/assets/icons/collection.png
Binary files differ
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Browser/assets/icons/file.png b/vendor/sabre/dav/lib/Sabre/DAV/Browser/assets/icons/file.png
new file mode 100644
index 000000000..3b98551ce
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Browser/assets/icons/file.png
Binary files differ
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Browser/assets/icons/parent.png b/vendor/sabre/dav/lib/Sabre/DAV/Browser/assets/icons/parent.png
new file mode 100644
index 000000000..156fa64fd
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Browser/assets/icons/parent.png
Binary files differ
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Browser/assets/icons/principal.png b/vendor/sabre/dav/lib/Sabre/DAV/Browser/assets/icons/principal.png
new file mode 100644
index 000000000..f8988f828
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Browser/assets/icons/principal.png
Binary files differ
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Client.php b/vendor/sabre/dav/lib/Sabre/DAV/Client.php
new file mode 100644
index 000000000..b9cf043a2
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Client.php
@@ -0,0 +1,566 @@
+<?php
+
+namespace Sabre\DAV;
+
+/**
+ * SabreDAV DAV client
+ *
+ * This client wraps around Curl to provide a convenient API to a WebDAV
+ * server.
+ *
+ * NOTE: This class is experimental, it's api will likely change in the future.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Client {
+
+ /**
+ * The propertyMap is a key-value array.
+ *
+ * If you use the propertyMap, any {DAV:}multistatus responses with the
+ * proeprties listed in this array, will automatically be mapped to a
+ * respective class.
+ *
+ * The {DAV:}resourcetype property is automatically added. This maps to
+ * Sabre\DAV\Property\ResourceType
+ *
+ * @var array
+ */
+ public $propertyMap = array();
+
+ protected $baseUri;
+ protected $userName;
+ protected $password;
+ protected $proxy;
+ protected $trustedCertificates;
+
+ /**
+ * Basic authentication
+ */
+ const AUTH_BASIC = 1;
+
+ /**
+ * Digest authentication
+ */
+ const AUTH_DIGEST = 2;
+
+ /**
+ * The authentication type we're using.
+ *
+ * This is a bitmask of AUTH_BASIC and AUTH_DIGEST.
+ *
+ * If DIGEST is used, the client makes 1 extra request per request, to get
+ * the authentication tokens.
+ *
+ * @var int
+ */
+ protected $authType;
+
+ /**
+ * Indicates if SSL verification is enabled or not.
+ *
+ * @var boolean
+ */
+ protected $verifyPeer;
+
+ /**
+ * Constructor
+ *
+ * Settings are provided through the 'settings' argument. The following
+ * settings are supported:
+ *
+ * * baseUri
+ * * userName (optional)
+ * * password (optional)
+ * * proxy (optional)
+ *
+ * @param array $settings
+ */
+ public function __construct(array $settings) {
+
+ if (!isset($settings['baseUri'])) {
+ throw new \InvalidArgumentException('A baseUri must be provided');
+ }
+
+ $validSettings = array(
+ 'baseUri',
+ 'userName',
+ 'password',
+ 'proxy',
+ );
+
+ foreach($validSettings as $validSetting) {
+ if (isset($settings[$validSetting])) {
+ $this->$validSetting = $settings[$validSetting];
+ }
+ }
+
+ if (isset($settings['authType'])) {
+ $this->authType = $settings['authType'];
+ } else {
+ $this->authType = self::AUTH_BASIC | self::AUTH_DIGEST;
+ }
+
+ $this->propertyMap['{DAV:}resourcetype'] = 'Sabre\\DAV\\Property\\ResourceType';
+
+ }
+
+ /**
+ * Add trusted root certificates to the webdav client.
+ *
+ * The parameter certificates should be a absolute path to a file
+ * which contains all trusted certificates
+ *
+ * @param string $certificates
+ */
+ public function addTrustedCertificates($certificates) {
+ $this->trustedCertificates = $certificates;
+ }
+
+ /**
+ * Enables/disables SSL peer verification
+ *
+ * @param boolean $value
+ */
+ public function setVerifyPeer($value) {
+ $this->verifyPeer = $value;
+ }
+
+ /**
+ * Does a PROPFIND request
+ *
+ * The list of requested properties must be specified as an array, in clark
+ * notation.
+ *
+ * The returned array will contain a list of filenames as keys, and
+ * properties as values.
+ *
+ * The properties array will contain the list of properties. Only properties
+ * that are actually returned from the server (without error) will be
+ * returned, anything else is discarded.
+ *
+ * Depth should be either 0 or 1. A depth of 1 will cause a request to be
+ * made to the server to also return all child resources.
+ *
+ * @param string $url
+ * @param array $properties
+ * @param int $depth
+ * @return array
+ */
+ public function propFind($url, array $properties, $depth = 0) {
+
+ $body = '<?xml version="1.0"?>' . "\n";
+ $body.= '<d:propfind xmlns:d="DAV:">' . "\n";
+ $body.= ' <d:prop>' . "\n";
+
+ foreach($properties as $property) {
+
+ list(
+ $namespace,
+ $elementName
+ ) = XMLUtil::parseClarkNotation($property);
+
+ if ($namespace === 'DAV:') {
+ $body.=' <d:' . $elementName . ' />' . "\n";
+ } else {
+ $body.=" <x:" . $elementName . " xmlns:x=\"" . $namespace . "\"/>\n";
+ }
+
+ }
+
+ $body.= ' </d:prop>' . "\n";
+ $body.= '</d:propfind>';
+
+ $response = $this->request('PROPFIND', $url, $body, array(
+ 'Depth' => $depth,
+ 'Content-Type' => 'application/xml'
+ ));
+
+ $result = $this->parseMultiStatus($response['body']);
+
+ // If depth was 0, we only return the top item
+ if ($depth===0) {
+ reset($result);
+ $result = current($result);
+ return isset($result[200])?$result[200]:array();
+ }
+
+ $newResult = array();
+ foreach($result as $href => $statusList) {
+
+ $newResult[$href] = isset($statusList[200])?$statusList[200]:array();
+
+ }
+
+ return $newResult;
+
+ }
+
+ /**
+ * Updates a list of properties on the server
+ *
+ * The list of properties must have clark-notation properties for the keys,
+ * and the actual (string) value for the value. If the value is null, an
+ * attempt is made to delete the property.
+ *
+ * @todo Must be building the request using the DOM, and does not yet
+ * support complex properties.
+ * @param string $url
+ * @param array $properties
+ * @return void
+ */
+ public function propPatch($url, array $properties) {
+
+ $body = '<?xml version="1.0"?>' . "\n";
+ $body.= '<d:propertyupdate xmlns:d="DAV:">' . "\n";
+
+ foreach($properties as $propName => $propValue) {
+
+ list(
+ $namespace,
+ $elementName
+ ) = XMLUtil::parseClarkNotation($propName);
+
+ if ($propValue === null) {
+
+ $body.="<d:remove><d:prop>\n";
+
+ if ($namespace === 'DAV:') {
+ $body.=' <d:' . $elementName . ' />' . "\n";
+ } else {
+ $body.=" <x:" . $elementName . " xmlns:x=\"" . $namespace . "\"/>\n";
+ }
+
+ $body.="</d:prop></d:remove>\n";
+
+ } else {
+
+ $body.="<d:set><d:prop>\n";
+ if ($namespace === 'DAV:') {
+ $body.=' <d:' . $elementName . '>';
+ } else {
+ $body.=" <x:" . $elementName . " xmlns:x=\"" . $namespace . "\">";
+ }
+ // Shitty.. i know
+ $body.=htmlspecialchars($propValue, ENT_NOQUOTES, 'UTF-8');
+ if ($namespace === 'DAV:') {
+ $body.='</d:' . $elementName . '>' . "\n";
+ } else {
+ $body.="</x:" . $elementName . ">\n";
+ }
+ $body.="</d:prop></d:set>\n";
+
+ }
+
+ }
+
+ $body.= '</d:propertyupdate>';
+
+ $this->request('PROPPATCH', $url, $body, array(
+ 'Content-Type' => 'application/xml'
+ ));
+
+ }
+
+ /**
+ * Performs an HTTP options request
+ *
+ * This method returns all the features from the 'DAV:' header as an array.
+ * If there was no DAV header, or no contents this method will return an
+ * empty array.
+ *
+ * @return array
+ */
+ public function options() {
+
+ $result = $this->request('OPTIONS');
+ if (!isset($result['headers']['dav'])) {
+ return array();
+ }
+
+ $features = explode(',', $result['headers']['dav']);
+ foreach($features as &$v) {
+ $v = trim($v);
+ }
+ return $features;
+
+ }
+
+ /**
+ * Performs an actual HTTP request, and returns the result.
+ *
+ * If the specified url is relative, it will be expanded based on the base
+ * url.
+ *
+ * The returned array contains 3 keys:
+ * * body - the response body
+ * * httpCode - a HTTP code (200, 404, etc)
+ * * headers - a list of response http headers. The header names have
+ * been lowercased.
+ *
+ * @param string $method
+ * @param string $url
+ * @param string $body
+ * @param array $headers
+ * @return array
+ */
+ public function request($method, $url = '', $body = null, $headers = array()) {
+
+ $url = $this->getAbsoluteUrl($url);
+
+ $curlSettings = array(
+ CURLOPT_RETURNTRANSFER => true,
+ // Return headers as part of the response
+ CURLOPT_HEADER => true,
+ CURLOPT_POSTFIELDS => $body,
+ // Automatically follow redirects
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_MAXREDIRS => 5,
+ );
+
+ if($this->verifyPeer !== null) {
+ $curlSettings[CURLOPT_SSL_VERIFYPEER] = $this->verifyPeer;
+ }
+
+ if($this->trustedCertificates) {
+ $curlSettings[CURLOPT_CAINFO] = $this->trustedCertificates;
+ }
+
+ switch ($method) {
+ case 'HEAD' :
+
+ // do not read body with HEAD requests (this is necessary because cURL does not ignore the body with HEAD
+ // requests when the Content-Length header is given - which in turn is perfectly valid according to HTTP
+ // specs...) cURL does unfortunately return an error in this case ("transfer closed transfer closed with
+ // ... bytes remaining to read") this can be circumvented by explicitly telling cURL to ignore the
+ // response body
+ $curlSettings[CURLOPT_NOBODY] = true;
+ $curlSettings[CURLOPT_CUSTOMREQUEST] = 'HEAD';
+ break;
+
+ default:
+ $curlSettings[CURLOPT_CUSTOMREQUEST] = $method;
+ break;
+
+ }
+
+ // Adding HTTP headers
+ $nHeaders = array();
+ foreach($headers as $key=>$value) {
+
+ $nHeaders[] = $key . ': ' . $value;
+
+ }
+ $curlSettings[CURLOPT_HTTPHEADER] = $nHeaders;
+
+ if ($this->proxy) {
+ $curlSettings[CURLOPT_PROXY] = $this->proxy;
+ }
+
+ if ($this->userName && $this->authType) {
+ $curlType = 0;
+ if ($this->authType & self::AUTH_BASIC) {
+ $curlType |= CURLAUTH_BASIC;
+ }
+ if ($this->authType & self::AUTH_DIGEST) {
+ $curlType |= CURLAUTH_DIGEST;
+ }
+ $curlSettings[CURLOPT_HTTPAUTH] = $curlType;
+ $curlSettings[CURLOPT_USERPWD] = $this->userName . ':' . $this->password;
+ }
+
+ list(
+ $response,
+ $curlInfo,
+ $curlErrNo,
+ $curlError
+ ) = $this->curlRequest($url, $curlSettings);
+
+ $headerBlob = substr($response, 0, $curlInfo['header_size']);
+ $response = substr($response, $curlInfo['header_size']);
+
+ // In the case of 100 Continue, or redirects we'll have multiple lists
+ // of headers for each separate HTTP response. We can easily split this
+ // because they are separated by \r\n\r\n
+ $headerBlob = explode("\r\n\r\n", trim($headerBlob, "\r\n"));
+
+ // We only care about the last set of headers
+ $headerBlob = $headerBlob[count($headerBlob)-1];
+
+ // Splitting headers
+ $headerBlob = explode("\r\n", $headerBlob);
+
+ $headers = array();
+ foreach($headerBlob as $header) {
+ $parts = explode(':', $header, 2);
+ if (count($parts)==2) {
+ $headers[strtolower(trim($parts[0]))] = trim($parts[1]);
+ }
+ }
+
+ $response = array(
+ 'body' => $response,
+ 'statusCode' => $curlInfo['http_code'],
+ 'headers' => $headers
+ );
+
+ if ($curlErrNo) {
+ throw new Exception('[CURL] Error while making request: ' . $curlError . ' (error code: ' . $curlErrNo . ')');
+ }
+
+ if ($response['statusCode']>=400) {
+ switch ($response['statusCode']) {
+ case 400 :
+ throw new Exception\BadRequest('Bad request');
+ case 401 :
+ throw new Exception\NotAuthenticated('Not authenticated');
+ case 402 :
+ throw new Exception\PaymentRequired('Payment required');
+ case 403 :
+ throw new Exception\Forbidden('Forbidden');
+ case 404:
+ throw new Exception\NotFound('Resource not found.');
+ case 405 :
+ throw new Exception\MethodNotAllowed('Method not allowed');
+ case 409 :
+ throw new Exception\Conflict('Conflict');
+ case 412 :
+ throw new Exception\PreconditionFailed('Precondition failed');
+ case 416 :
+ throw new Exception\RequestedRangeNotSatisfiable('Requested Range Not Satisfiable');
+ case 500 :
+ throw new Exception('Internal server error');
+ case 501 :
+ throw new Exception\NotImplemented('Not Implemented');
+ case 507 :
+ throw new Exception\InsufficientStorage('Insufficient storage');
+ default:
+ throw new Exception('HTTP error response. (errorcode ' . $response['statusCode'] . ')');
+ }
+ }
+
+ return $response;
+
+ }
+
+ /**
+ * Wrapper for all curl functions.
+ *
+ * The only reason this was split out in a separate method, is so it
+ * becomes easier to unittest.
+ *
+ * @param string $url
+ * @param array $settings
+ * @return array
+ */
+ // @codeCoverageIgnoreStart
+ protected function curlRequest($url, $settings) {
+
+ $curl = curl_init($url);
+ curl_setopt_array($curl, $settings);
+
+ return array(
+ curl_exec($curl),
+ curl_getinfo($curl),
+ curl_errno($curl),
+ curl_error($curl)
+ );
+
+ }
+ // @codeCoverageIgnoreEnd
+
+ /**
+ * Returns the full url based on the given url (which may be relative). All
+ * urls are expanded based on the base url as given by the server.
+ *
+ * @param string $url
+ * @return string
+ */
+ protected function getAbsoluteUrl($url) {
+
+ // If the url starts with http:// or https://, the url is already absolute.
+ if (preg_match('/^http(s?):\/\//', $url)) {
+ return $url;
+ }
+
+ // If the url starts with a slash, we must calculate the url based off
+ // the root of the base url.
+ if (strpos($url,'/') === 0) {
+ $parts = parse_url($this->baseUri);
+ return $parts['scheme'] . '://' . $parts['host'] . (isset($parts['port'])?':' . $parts['port']:'') . $url;
+ }
+
+ // Otherwise...
+ return $this->baseUri . $url;
+
+ }
+
+ /**
+ * Parses a WebDAV multistatus response body
+ *
+ * This method returns an array with the following structure
+ *
+ * array(
+ * 'url/to/resource' => array(
+ * '200' => array(
+ * '{DAV:}property1' => 'value1',
+ * '{DAV:}property2' => 'value2',
+ * ),
+ * '404' => array(
+ * '{DAV:}property1' => null,
+ * '{DAV:}property2' => null,
+ * ),
+ * )
+ * 'url/to/resource2' => array(
+ * .. etc ..
+ * )
+ * )
+ *
+ *
+ * @param string $body xml body
+ * @return array
+ */
+ public function parseMultiStatus($body) {
+
+ $body = XMLUtil::convertDAVNamespace($body);
+
+ $responseXML = simplexml_load_string($body, null, LIBXML_NOBLANKS | LIBXML_NOCDATA);
+ if ($responseXML===false) {
+ throw new \InvalidArgumentException('The passed data is not valid XML');
+ }
+
+ $responseXML->registerXPathNamespace('d', 'urn:DAV');
+
+ $propResult = array();
+
+ foreach($responseXML->xpath('d:response') as $response) {
+ $response->registerXPathNamespace('d', 'urn:DAV');
+ $href = $response->xpath('d:href');
+ $href = (string)$href[0];
+
+ $properties = array();
+
+ foreach($response->xpath('d:propstat') as $propStat) {
+
+ $propStat->registerXPathNamespace('d', 'urn:DAV');
+ $status = $propStat->xpath('d:status');
+ list($httpVersion, $statusCode, $message) = explode(' ', (string)$status[0],3);
+
+ // Only using the propertymap for results with status 200.
+ $propertyMap = $statusCode==='200' ? $this->propertyMap : array();
+
+ $properties[$statusCode] = XMLUtil::parseProperties(dom_import_simplexml($propStat), $propertyMap);
+
+ }
+
+ $propResult[$href] = $properties;
+
+ }
+
+ return $propResult;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Collection.php b/vendor/sabre/dav/lib/Sabre/DAV/Collection.php
new file mode 100644
index 000000000..d8d5265b9
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Collection.php
@@ -0,0 +1,110 @@
+<?php
+
+namespace Sabre\DAV;
+
+/**
+ * Collection class
+ *
+ * This is a helper class, that should aid in getting collections classes setup.
+ * Most of its methods are implemented, and throw permission denied exceptions
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+abstract class Collection extends Node implements ICollection {
+
+ /**
+ * Returns a child object, by its name.
+ *
+ * This method makes use of the getChildren method to grab all the child
+ * nodes, and compares the name.
+ * Generally its wise to override this, as this can usually be optimized
+ *
+ * This method must throw Sabre\DAV\Exception\NotFound if the node does not
+ * exist.
+ *
+ * @param string $name
+ * @throws Exception\NotFound
+ * @return INode
+ */
+ public function getChild($name) {
+
+ foreach($this->getChildren() as $child) {
+
+ if ($child->getName()==$name) return $child;
+
+ }
+ throw new Exception\NotFound('File not found: ' . $name);
+
+ }
+
+ /**
+ * Checks is a child-node exists.
+ *
+ * It is generally a good idea to try and override this. Usually it can be optimized.
+ *
+ * @param string $name
+ * @return bool
+ */
+ public function childExists($name) {
+
+ try {
+
+ $this->getChild($name);
+ return true;
+
+ } catch(Exception\NotFound $e) {
+
+ return false;
+
+ }
+
+ }
+
+ /**
+ * Creates a new file in the directory
+ *
+ * Data will either be supplied as a stream resource, or in certain cases
+ * as a string. Keep in mind that you may have to support either.
+ *
+ * After succesful creation of the file, you may choose to return the ETag
+ * of the new file here.
+ *
+ * The returned ETag must be surrounded by double-quotes (The quotes should
+ * be part of the actual string).
+ *
+ * If you cannot accurately determine the ETag, you should not return it.
+ * If you don't store the file exactly as-is (you're transforming it
+ * somehow) you should also not return an ETag.
+ *
+ * This means that if a subsequent GET to this new file does not exactly
+ * return the same contents of what was submitted here, you are strongly
+ * recommended to omit the ETag.
+ *
+ * @param string $name Name of the file
+ * @param resource|string $data Initial payload
+ * @return null|string
+ */
+ public function createFile($name, $data = null) {
+
+ throw new Exception\Forbidden('Permission denied to create file (filename ' . $name . ')');
+
+ }
+
+ /**
+ * Creates a new subdirectory
+ *
+ * @param string $name
+ * @throws Exception\Forbidden
+ * @return void
+ */
+ public function createDirectory($name) {
+
+ throw new Exception\Forbidden('Permission denied to create directory');
+
+ }
+
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Exception.php b/vendor/sabre/dav/lib/Sabre/DAV/Exception.php
new file mode 100644
index 000000000..9c7a985b4
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Exception.php
@@ -0,0 +1,64 @@
+<?php
+
+/**
+ * SabreDAV base exception
+ *
+ * This is SabreDAV's base exception file, use this to implement your own exception.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+
+namespace Sabre\DAV;
+
+/**
+ * Main Exception class.
+ *
+ * This class defines a getHTTPCode method, which should return the appropriate HTTP code for the Exception occurred.
+ * The default for this is 500.
+ *
+ * This class also allows you to generate custom xml data for your exceptions. This will be displayed
+ * in the 'error' element in the failing response.
+ */
+class Exception extends \Exception {
+
+ /**
+ * Returns the HTTP statuscode for this exception
+ *
+ * @return int
+ */
+ public function getHTTPCode() {
+
+ return 500;
+
+ }
+
+ /**
+ * This method allows the exception to include additional information into the WebDAV error response
+ *
+ * @param Server $server
+ * @param \DOMElement $errorNode
+ * @return void
+ */
+ public function serialize(Server $server,\DOMElement $errorNode) {
+
+
+ }
+
+ /**
+ * This method allows the exception to return any extra HTTP response headers.
+ *
+ * The headers must be returned as an array.
+ *
+ * @param Server $server
+ * @return array
+ */
+ public function getHTTPHeaders(Server $server) {
+
+ return array();
+
+ }
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Exception/BadRequest.php b/vendor/sabre/dav/lib/Sabre/DAV/Exception/BadRequest.php
new file mode 100644
index 000000000..bcf4c8eb4
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Exception/BadRequest.php
@@ -0,0 +1,28 @@
+<?php
+
+namespace Sabre\DAV\Exception;
+
+/**
+ * BadRequest
+ *
+ * The BadRequest is thrown when the user submitted an invalid HTTP request
+ * BadRequest
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class BadRequest extends \Sabre\DAV\Exception {
+
+ /**
+ * Returns the HTTP statuscode for this exception
+ *
+ * @return int
+ */
+ public function getHTTPCode() {
+
+ return 400;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Exception/Conflict.php b/vendor/sabre/dav/lib/Sabre/DAV/Exception/Conflict.php
new file mode 100644
index 000000000..2c8fa8167
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Exception/Conflict.php
@@ -0,0 +1,28 @@
+<?php
+
+namespace Sabre\DAV\Exception;
+
+/**
+ * Conflict
+ *
+ * A 409 Conflict is thrown when a user tried to make a directory over an existing
+ * file or in a parent directory that doesn't exist.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Conflict extends \Sabre\DAV\Exception {
+
+ /**
+ * Returns the HTTP statuscode for this exception
+ *
+ * @return int
+ */
+ public function getHTTPCode() {
+
+ return 409;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Exception/ConflictingLock.php b/vendor/sabre/dav/lib/Sabre/DAV/Exception/ConflictingLock.php
new file mode 100644
index 000000000..ba66f243d
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Exception/ConflictingLock.php
@@ -0,0 +1,37 @@
+<?php
+
+namespace Sabre\DAV\Exception;
+
+use Sabre\DAV;
+
+/**
+ * ConflictingLock
+ *
+ * Similar to the Locked exception, this exception thrown when a LOCK request
+ * was made, on a resource which was already locked
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class ConflictingLock extends Locked {
+
+ /**
+ * This method allows the exception to include additional information into the WebDAV error response
+ *
+ * @param DAV\Server $server
+ * @param \DOMElement $errorNode
+ * @return void
+ */
+ public function serialize(DAV\Server $server, \DOMElement $errorNode) {
+
+ if ($this->lock) {
+ $error = $errorNode->ownerDocument->createElementNS('DAV:','d:no-conflicting-lock');
+ $errorNode->appendChild($error);
+ if (!is_object($this->lock)) var_dump($this->lock);
+ $error->appendChild($errorNode->ownerDocument->createElementNS('DAV:','d:href',$this->lock->uri));
+ }
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Exception/FileNotFound.php b/vendor/sabre/dav/lib/Sabre/DAV/Exception/FileNotFound.php
new file mode 100644
index 000000000..da700ebb0
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Exception/FileNotFound.php
@@ -0,0 +1,19 @@
+<?php
+
+namespace Sabre\DAV\Exception;
+
+/**
+ * FileNotFound
+ *
+ * Deprecated: Warning, this class is deprecated and will be removed in a
+ * future version of SabreDAV. Please use Sabre\DAV\Exception\NotFound instead.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @deprecated Use Sabre\DAV\Exception\NotFound instead
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class FileNotFound extends NotFound {
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Exception/Forbidden.php b/vendor/sabre/dav/lib/Sabre/DAV/Exception/Forbidden.php
new file mode 100644
index 000000000..3c9a46677
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Exception/Forbidden.php
@@ -0,0 +1,27 @@
+<?php
+
+namespace Sabre\DAV\Exception;
+
+/**
+ * Forbidden
+ *
+ * This exception is thrown whenever a user tries to do an operation he's not allowed to
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Forbidden extends \Sabre\DAV\Exception {
+
+ /**
+ * Returns the HTTP statuscode for this exception
+ *
+ * @return int
+ */
+ public function getHTTPCode() {
+
+ return 403;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Exception/InsufficientStorage.php b/vendor/sabre/dav/lib/Sabre/DAV/Exception/InsufficientStorage.php
new file mode 100644
index 000000000..8505ce17f
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Exception/InsufficientStorage.php
@@ -0,0 +1,27 @@
+<?php
+
+namespace Sabre\DAV\Exception;
+
+/**
+ * InsufficientStorage
+ *
+ * This Exception can be thrown, when for example a harddisk is full or a quota is exceeded
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class InsufficientStorage extends \Sabre\DAV\Exception {
+
+ /**
+ * Returns the HTTP statuscode for this exception
+ *
+ * @return int
+ */
+ public function getHTTPCode() {
+
+ return 507;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Exception/InvalidResourceType.php b/vendor/sabre/dav/lib/Sabre/DAV/Exception/InvalidResourceType.php
new file mode 100644
index 000000000..ce64f2ee0
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Exception/InvalidResourceType.php
@@ -0,0 +1,33 @@
+<?php
+
+namespace Sabre\DAV\Exception;
+
+/**
+ * InvalidResourceType
+ *
+ * This exception is thrown when the user tried to create a new collection, with
+ * a special resourcetype value that was not recognized by the server.
+ *
+ * See RFC5689 section 3.3
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class InvalidResourceType extends Forbidden {
+
+ /**
+ * This method allows the exception to include additional information into the WebDAV error response
+ *
+ * @param DAV\Server $server
+ * @param \DOMElement $errorNode
+ * @return void
+ */
+ public function serialize(\Sabre\DAV\Server $server,\DOMElement $errorNode) {
+
+ $error = $errorNode->ownerDocument->createElementNS('DAV:','d:valid-resourcetype');
+ $errorNode->appendChild($error);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Exception/LockTokenMatchesRequestUri.php b/vendor/sabre/dav/lib/Sabre/DAV/Exception/LockTokenMatchesRequestUri.php
new file mode 100644
index 000000000..a8f8407f0
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Exception/LockTokenMatchesRequestUri.php
@@ -0,0 +1,41 @@
+<?php
+
+namespace Sabre\DAV\Exception;
+
+use Sabre\DAV;
+
+/**
+ * LockTokenMatchesRequestUri
+ *
+ * This exception is thrown by UNLOCK if a supplied lock-token is invalid
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class LockTokenMatchesRequestUri extends Conflict {
+
+ /**
+ * Creates the exception
+ */
+ public function __construct() {
+
+ $this->message = 'The locktoken supplied does not match any locks on this entity';
+
+ }
+
+ /**
+ * This method allows the exception to include additional information into the WebDAV error response
+ *
+ * @param DAV\Server $server
+ * @param \DOMElement $errorNode
+ * @return void
+ */
+ public function serialize(DAV\Server $server,\DOMElement $errorNode) {
+
+ $error = $errorNode->ownerDocument->createElementNS('DAV:','d:lock-token-matches-request-uri');
+ $errorNode->appendChild($error);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Exception/Locked.php b/vendor/sabre/dav/lib/Sabre/DAV/Exception/Locked.php
new file mode 100644
index 000000000..2f8460be2
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Exception/Locked.php
@@ -0,0 +1,73 @@
+<?php
+
+namespace Sabre\DAV\Exception;
+
+use Sabre\DAV;
+
+/**
+ * Locked
+ *
+ * The 423 is thrown when a client tried to access a resource that was locked, without supplying a valid lock token
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Locked extends DAV\Exception {
+
+ /**
+ * Lock information
+ *
+ * @var Sabre\DAV\Locks\LockInfo
+ */
+ protected $lock;
+
+ /**
+ * Creates the exception
+ *
+ * A LockInfo object should be passed if the user should be informed
+ * which lock actually has the file locked.
+ *
+ * @param DAV\Locks\LockInfo $lock
+ */
+ public function __construct(DAV\Locks\LockInfo $lock = null) {
+
+ $this->lock = $lock;
+
+ }
+
+ /**
+ * Returns the HTTP statuscode for this exception
+ *
+ * @return int
+ */
+ public function getHTTPCode() {
+
+ return 423;
+
+ }
+
+ /**
+ * This method allows the exception to include additional information into the WebDAV error response
+ *
+ * @param DAV\Server $server
+ * @param \DOMElement $errorNode
+ * @return void
+ */
+ public function serialize(DAV\Server $server,\DOMElement $errorNode) {
+
+ if ($this->lock) {
+ $error = $errorNode->ownerDocument->createElementNS('DAV:','d:lock-token-submitted');
+ $errorNode->appendChild($error);
+
+ $href = $errorNode->ownerDocument->createElementNS('DAV:','d:href');
+ $href->appendChild($errorNode->ownerDocument->createTextNode($this->lock->uri));
+ $error->appendChild(
+ $href
+ );
+ }
+
+ }
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Exception/MethodNotAllowed.php b/vendor/sabre/dav/lib/Sabre/DAV/Exception/MethodNotAllowed.php
new file mode 100644
index 000000000..09aeca4c8
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Exception/MethodNotAllowed.php
@@ -0,0 +1,45 @@
+<?php
+
+namespace Sabre\DAV\Exception;
+
+/**
+ * MethodNotAllowed
+ *
+ * The 405 is thrown when a client tried to create a directory on an already existing directory
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class MethodNotAllowed extends \Sabre\DAV\Exception {
+
+ /**
+ * Returns the HTTP statuscode for this exception
+ *
+ * @return int
+ */
+ public function getHTTPCode() {
+
+ return 405;
+
+ }
+
+ /**
+ * This method allows the exception to return any extra HTTP response headers.
+ *
+ * The headers must be returned as an array.
+ *
+ * @param \Sabre\DAV\Server $server
+ * @return array
+ */
+ public function getHTTPHeaders(\Sabre\DAV\Server $server) {
+
+ $methods = $server->getAllowedMethods($server->getRequestUri());
+
+ return array(
+ 'Allow' => strtoupper(implode(', ',$methods)),
+ );
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Exception/NotAuthenticated.php b/vendor/sabre/dav/lib/Sabre/DAV/Exception/NotAuthenticated.php
new file mode 100644
index 000000000..695edda15
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Exception/NotAuthenticated.php
@@ -0,0 +1,30 @@
+<?php
+
+namespace Sabre\DAV\Exception;
+
+use Sabre\DAV;
+
+/**
+ * NotAuthenticated
+ *
+ * This exception is thrown when the client did not provide valid
+ * authentication credentials.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class NotAuthenticated extends DAV\Exception {
+
+ /**
+ * Returns the HTTP statuscode for this exception
+ *
+ * @return int
+ */
+ public function getHTTPCode() {
+
+ return 401;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Exception/NotFound.php b/vendor/sabre/dav/lib/Sabre/DAV/Exception/NotFound.php
new file mode 100644
index 000000000..605c650a4
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Exception/NotFound.php
@@ -0,0 +1,28 @@
+<?php
+
+namespace Sabre\DAV\Exception;
+
+/**
+ * NotFound
+ *
+ * This Exception is thrown when a Node couldn't be found. It returns HTTP error code 404
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class NotFound extends \Sabre\DAV\Exception {
+
+ /**
+ * Returns the HTTP statuscode for this exception
+ *
+ * @return int
+ */
+ public function getHTTPCode() {
+
+ return 404;
+
+ }
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Exception/NotImplemented.php b/vendor/sabre/dav/lib/Sabre/DAV/Exception/NotImplemented.php
new file mode 100644
index 000000000..6934a53e5
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Exception/NotImplemented.php
@@ -0,0 +1,27 @@
+<?php
+
+namespace Sabre\DAV\Exception;
+
+/**
+ * NotImplemented
+ *
+ * This exception is thrown when the client tried to call an unsupported HTTP method or other feature
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class NotImplemented extends \Sabre\DAV\Exception {
+
+ /**
+ * Returns the HTTP statuscode for this exception
+ *
+ * @return int
+ */
+ public function getHTTPCode() {
+
+ return 501;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Exception/PaymentRequired.php b/vendor/sabre/dav/lib/Sabre/DAV/Exception/PaymentRequired.php
new file mode 100644
index 000000000..ad053fd79
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Exception/PaymentRequired.php
@@ -0,0 +1,30 @@
+<?php
+
+namespace Sabre\DAV\Exception;
+
+use Sabre\DAV;
+
+/**
+ * Payment Required
+ *
+ * The PaymentRequired exception may be thrown in a case where a user must pay
+ * to access a certain resource or operation.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class PaymentRequired extends DAV\Exception {
+
+ /**
+ * Returns the HTTP statuscode for this exception
+ *
+ * @return int
+ */
+ public function getHTTPCode() {
+
+ return 402;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Exception/PreconditionFailed.php b/vendor/sabre/dav/lib/Sabre/DAV/Exception/PreconditionFailed.php
new file mode 100644
index 000000000..225b99a36
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Exception/PreconditionFailed.php
@@ -0,0 +1,71 @@
+<?php
+
+namespace Sabre\DAV\Exception;
+
+use Sabre\DAV;
+
+/**
+ * PreconditionFailed
+ *
+ * This exception is normally thrown when a client submitted a conditional request,
+ * like for example an If, If-None-Match or If-Match header, which caused the HTTP
+ * request to not execute (the condition of the header failed)
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class PreconditionFailed extends DAV\Exception {
+
+ /**
+ * When this exception is thrown, the header-name might be set.
+ *
+ * This allows the exception-catching code to determine which HTTP header
+ * caused the exception.
+ *
+ * @var string
+ */
+ public $header = null;
+
+ /**
+ * Create the exception
+ *
+ * @param string $message
+ * @param string $header
+ */
+ public function __construct($message, $header=null) {
+
+ parent::__construct($message);
+ $this->header = $header;
+
+ }
+
+ /**
+ * Returns the HTTP statuscode for this exception
+ *
+ * @return int
+ */
+ public function getHTTPCode() {
+
+ return 412;
+
+ }
+
+ /**
+ * This method allows the exception to include additional information into the WebDAV error response
+ *
+ * @param DAV\Server $server
+ * @param \DOMElement $errorNode
+ * @return void
+ */
+ public function serialize(DAV\Server $server,\DOMElement $errorNode) {
+
+ if ($this->header) {
+ $prop = $errorNode->ownerDocument->createElement('s:header');
+ $prop->nodeValue = $this->header;
+ $errorNode->appendChild($prop);
+ }
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Exception/ReportNotSupported.php b/vendor/sabre/dav/lib/Sabre/DAV/Exception/ReportNotSupported.php
new file mode 100644
index 000000000..d55c99bd0
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Exception/ReportNotSupported.php
@@ -0,0 +1,32 @@
+<?php
+
+namespace Sabre\DAV\Exception;
+
+use Sabre\DAV;
+
+/**
+ * ReportNotSupported
+ *
+ * This exception is thrown when the client requested an unknown report through the REPORT method
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class ReportNotSupported extends Forbidden {
+
+ /**
+ * This method allows the exception to include additional information into the WebDAV error response
+ *
+ * @param DAV\Server $server
+ * @param \DOMElement $errorNode
+ * @return void
+ */
+ public function serialize(DAV\Server $server,\DOMElement $errorNode) {
+
+ $error = $errorNode->ownerDocument->createElementNS('DAV:','d:supported-report');
+ $errorNode->appendChild($error);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Exception/RequestedRangeNotSatisfiable.php b/vendor/sabre/dav/lib/Sabre/DAV/Exception/RequestedRangeNotSatisfiable.php
new file mode 100644
index 000000000..0a8a85808
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Exception/RequestedRangeNotSatisfiable.php
@@ -0,0 +1,31 @@
+<?php
+
+namespace Sabre\DAV\Exception;
+
+use Sabre\DAV;
+
+/**
+ * RequestedRangeNotSatisfiable
+ *
+ * This exception is normally thrown when the user
+ * request a range that is out of the entity bounds.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class RequestedRangeNotSatisfiable extends DAV\Exception {
+
+ /**
+ * returns the http statuscode for this exception
+ *
+ * @return int
+ */
+ public function getHTTPCode() {
+
+ return 416;
+
+ }
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Exception/ServiceUnavailable.php b/vendor/sabre/dav/lib/Sabre/DAV/Exception/ServiceUnavailable.php
new file mode 100644
index 000000000..dca764899
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Exception/ServiceUnavailable.php
@@ -0,0 +1,30 @@
+<?php
+
+namespace Sabre\DAV\Exception;
+
+use Sabre\DAV;
+
+/**
+ * ServiceUnavailable
+ *
+ * This exception is thrown in case the service
+ * is currently not available (e.g. down for maintenance).
+ *
+ * @author Thomas Müller <thomas.mueller@tmit.eu>
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class ServiceUnavailable extends DAV\Exception {
+
+ /**
+ * Returns the HTTP statuscode for this exception
+ *
+ * @return int
+ */
+ public function getHTTPCode() {
+
+ return 503;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Exception/UnsupportedMediaType.php b/vendor/sabre/dav/lib/Sabre/DAV/Exception/UnsupportedMediaType.php
new file mode 100644
index 000000000..38f5a9fac
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Exception/UnsupportedMediaType.php
@@ -0,0 +1,28 @@
+<?php
+
+namespace Sabre\DAV\Exception;
+
+/**
+ * UnSupportedMediaType
+ *
+ * The 415 Unsupported Media Type status code is generally sent back when the client
+ * tried to call an HTTP method, with a body the server didn't understand
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class UnsupportedMediaType extends \Sabre\DAV\Exception {
+
+ /**
+ * returns the http statuscode for this exception
+ *
+ * @return int
+ */
+ public function getHTTPCode() {
+
+ return 415;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/FS/Directory.php b/vendor/sabre/dav/lib/Sabre/DAV/FS/Directory.php
new file mode 100644
index 000000000..333492d17
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/FS/Directory.php
@@ -0,0 +1,140 @@
+<?php
+
+namespace Sabre\DAV\FS;
+use Sabre\DAV;
+
+/**
+ * Directory class
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Directory extends Node implements DAV\ICollection, DAV\IQuota {
+
+ /**
+ * Creates a new file in the directory
+ *
+ * Data will either be supplied as a stream resource, or in certain cases
+ * as a string. Keep in mind that you may have to support either.
+ *
+ * After successful creation of the file, you may choose to return the ETag
+ * of the new file here.
+ *
+ * The returned ETag must be surrounded by double-quotes (The quotes should
+ * be part of the actual string).
+ *
+ * If you cannot accurately determine the ETag, you should not return it.
+ * If you don't store the file exactly as-is (you're transforming it
+ * somehow) you should also not return an ETag.
+ *
+ * This means that if a subsequent GET to this new file does not exactly
+ * return the same contents of what was submitted here, you are strongly
+ * recommended to omit the ETag.
+ *
+ * @param string $name Name of the file
+ * @param resource|string $data Initial payload
+ * @return null|string
+ */
+ public function createFile($name, $data = null) {
+
+ $newPath = $this->path . '/' . $name;
+ file_put_contents($newPath,$data);
+
+ }
+
+ /**
+ * Creates a new subdirectory
+ *
+ * @param string $name
+ * @return void
+ */
+ public function createDirectory($name) {
+
+ $newPath = $this->path . '/' . $name;
+ mkdir($newPath);
+
+ }
+
+ /**
+ * Returns a specific child node, referenced by its name
+ *
+ * This method must throw DAV\Exception\NotFound if the node does not
+ * exist.
+ *
+ * @param string $name
+ * @throws DAV\Exception\NotFound
+ * @return DAV\INode
+ */
+ public function getChild($name) {
+
+ $path = $this->path . '/' . $name;
+
+ if (!file_exists($path)) throw new DAV\Exception\NotFound('File with name ' . $path . ' could not be located');
+
+ if (is_dir($path)) {
+
+ return new Directory($path);
+
+ } else {
+
+ return new File($path);
+
+ }
+
+ }
+
+ /**
+ * Returns an array with all the child nodes
+ *
+ * @return DAV\INode[]
+ */
+ public function getChildren() {
+
+ $nodes = array();
+ foreach(scandir($this->path) as $node) if($node!='.' && $node!='..') $nodes[] = $this->getChild($node);
+ return $nodes;
+
+ }
+
+ /**
+ * Checks if a child exists.
+ *
+ * @param string $name
+ * @return bool
+ */
+ public function childExists($name) {
+
+ $path = $this->path . '/' . $name;
+ return file_exists($path);
+
+ }
+
+ /**
+ * Deletes all files in this directory, and then itself
+ *
+ * @return void
+ */
+ public function delete() {
+
+ foreach($this->getChildren() as $child) $child->delete();
+ rmdir($this->path);
+
+ }
+
+ /**
+ * Returns available diskspace information
+ *
+ * @return array
+ */
+ public function getQuotaInfo() {
+
+ return array(
+ disk_total_space($this->path)-disk_free_space($this->path),
+ disk_free_space($this->path)
+ );
+
+ }
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/FS/File.php b/vendor/sabre/dav/lib/Sabre/DAV/FS/File.php
new file mode 100644
index 000000000..437a4dd78
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/FS/File.php
@@ -0,0 +1,91 @@
+<?php
+
+namespace Sabre\DAV\FS;
+
+use Sabre\DAV;
+
+/**
+ * File class
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class File extends Node implements DAV\IFile {
+
+ /**
+ * Updates the data
+ *
+ * @param resource $data
+ * @return void
+ */
+ public function put($data) {
+
+ file_put_contents($this->path,$data);
+
+ }
+
+ /**
+ * Returns the data
+ *
+ * @return string
+ */
+ public function get() {
+
+ return fopen($this->path,'r');
+
+ }
+
+ /**
+ * Delete the current file
+ *
+ * @return void
+ */
+ public function delete() {
+
+ unlink($this->path);
+
+ }
+
+ /**
+ * Returns the size of the node, in bytes
+ *
+ * @return int
+ */
+ public function getSize() {
+
+ return filesize($this->path);
+
+ }
+
+ /**
+ * Returns the ETag for a file
+ *
+ * An ETag is a unique identifier representing the current version of the file. If the file changes, the ETag MUST change.
+ * The ETag is an arbitrary string, but MUST be surrounded by double-quotes.
+ *
+ * Return null if the ETag can not effectively be determined
+ *
+ * @return mixed
+ */
+ public function getETag() {
+
+ return null;
+
+ }
+
+ /**
+ * Returns the mime-type for a file
+ *
+ * If null is returned, we'll assume application/octet-stream
+ *
+ * @return mixed
+ */
+ public function getContentType() {
+
+ return null;
+
+ }
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/FS/Node.php b/vendor/sabre/dav/lib/Sabre/DAV/FS/Node.php
new file mode 100644
index 000000000..4f52e1683
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/FS/Node.php
@@ -0,0 +1,82 @@
+<?php
+
+namespace Sabre\DAV\FS;
+
+use Sabre\DAV;
+
+/**
+ * Base node-class
+ *
+ * The node class implements the method used by both the File and the Directory classes
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+abstract class Node implements DAV\INode {
+
+ /**
+ * The path to the current node
+ *
+ * @var string
+ */
+ protected $path;
+
+ /**
+ * Sets up the node, expects a full path name
+ *
+ * @param string $path
+ */
+ public function __construct($path) {
+
+ $this->path = $path;
+
+ }
+
+
+
+ /**
+ * Returns the name of the node
+ *
+ * @return string
+ */
+ public function getName() {
+
+ list(, $name) = DAV\URLUtil::splitPath($this->path);
+ return $name;
+
+ }
+
+ /**
+ * Renames the node
+ *
+ * @param string $name The new name
+ * @return void
+ */
+ public function setName($name) {
+
+ list($parentPath, ) = DAV\URLUtil::splitPath($this->path);
+ list(, $newName) = DAV\URLUtil::splitPath($name);
+
+ $newPath = $parentPath . '/' . $newName;
+ rename($this->path,$newPath);
+
+ $this->path = $newPath;
+
+ }
+
+
+
+ /**
+ * Returns the last modification time, as a unix timestamp
+ *
+ * @return int
+ */
+ public function getLastModified() {
+
+ return filemtime($this->path);
+
+ }
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/FSExt/Directory.php b/vendor/sabre/dav/lib/Sabre/DAV/FSExt/Directory.php
new file mode 100644
index 000000000..c27ad5ba5
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/FSExt/Directory.php
@@ -0,0 +1,159 @@
+<?php
+
+namespace Sabre\DAV\FSExt;
+
+use Sabre\DAV;
+
+/**
+ * Directory class
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Directory extends Node implements DAV\ICollection, DAV\IQuota {
+
+ /**
+ * Creates a new file in the directory
+ *
+ * Data will either be supplied as a stream resource, or in certain cases
+ * as a string. Keep in mind that you may have to support either.
+ *
+ * After successful creation of the file, you may choose to return the ETag
+ * of the new file here.
+ *
+ * The returned ETag must be surrounded by double-quotes (The quotes should
+ * be part of the actual string).
+ *
+ * If you cannot accurately determine the ETag, you should not return it.
+ * If you don't store the file exactly as-is (you're transforming it
+ * somehow) you should also not return an ETag.
+ *
+ * This means that if a subsequent GET to this new file does not exactly
+ * return the same contents of what was submitted here, you are strongly
+ * recommended to omit the ETag.
+ *
+ * @param string $name Name of the file
+ * @param resource|string $data Initial payload
+ * @return null|string
+ */
+ public function createFile($name, $data = null) {
+
+ // We're not allowing dots
+ if ($name=='.' || $name=='..') throw new DAV\Exception\Forbidden('Permission denied to . and ..');
+ $newPath = $this->path . '/' . $name;
+ file_put_contents($newPath,$data);
+
+ return '"' . md5_file($newPath) . '"';
+
+ }
+
+ /**
+ * Creates a new subdirectory
+ *
+ * @param string $name
+ * @return void
+ */
+ public function createDirectory($name) {
+
+ // We're not allowing dots
+ if ($name=='.' || $name=='..') throw new DAV\Exception\Forbidden('Permission denied to . and ..');
+ $newPath = $this->path . '/' . $name;
+ mkdir($newPath);
+
+ }
+
+ /**
+ * Returns a specific child node, referenced by its name
+ *
+ * This method must throw Sabre\DAV\Exception\NotFound if the node does not
+ * exist.
+ *
+ * @param string $name
+ * @throws DAV\Exception\NotFound
+ * @return DAV\INode
+ */
+ public function getChild($name) {
+
+ $path = $this->path . '/' . $name;
+
+ if (!file_exists($path)) throw new DAV\Exception\NotFound('File could not be located');
+ if ($name=='.' || $name=='..') throw new DAV\Exception\Forbidden('Permission denied to . and ..');
+
+ if (is_dir($path)) {
+
+ return new Directory($path);
+
+ } else {
+
+ return new File($path);
+
+ }
+
+ }
+
+ /**
+ * Checks if a child exists.
+ *
+ * @param string $name
+ * @return bool
+ */
+ public function childExists($name) {
+
+ if ($name=='.' || $name=='..')
+ throw new DAV\Exception\Forbidden('Permission denied to . and ..');
+
+ $path = $this->path . '/' . $name;
+ return file_exists($path);
+
+ }
+
+ /**
+ * Returns an array with all the child nodes
+ *
+ * @return DAV\INode[]
+ */
+ public function getChildren() {
+
+ $nodes = array();
+ foreach(scandir($this->path) as $node) if($node!='.' && $node!='..' && $node!='.sabredav') $nodes[] = $this->getChild($node);
+ return $nodes;
+
+ }
+
+ /**
+ * Deletes all files in this directory, and then itself
+ *
+ * @return bool
+ */
+ public function delete() {
+
+ // Deleting all children
+ foreach($this->getChildren() as $child) $child->delete();
+
+ // Removing resource info, if its still around
+ if (file_exists($this->path . '/.sabredav')) unlink($this->path . '/.sabredav');
+
+ // Removing the directory itself
+ rmdir($this->path);
+
+ return parent::delete();
+
+ }
+
+ /**
+ * Returns available diskspace information
+ *
+ * @return array
+ */
+ public function getQuotaInfo() {
+
+ return array(
+ disk_total_space($this->path)-disk_free_space($this->path),
+ disk_free_space($this->path)
+ );
+
+ }
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/FSExt/File.php b/vendor/sabre/dav/lib/Sabre/DAV/FSExt/File.php
new file mode 100644
index 000000000..402195757
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/FSExt/File.php
@@ -0,0 +1,118 @@
+<?php
+
+namespace Sabre\DAV\FSExt;
+use Sabre\DAV;
+
+/**
+ * File class
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class File extends Node implements DAV\PartialUpdate\IFile {
+
+ /**
+ * Updates the data
+ *
+ * data is a readable stream resource.
+ *
+ * @param resource|string $data
+ * @return string
+ */
+ public function put($data) {
+
+ file_put_contents($this->path,$data);
+ return '"' . md5_file($this->path) . '"';
+
+ }
+
+ /**
+ * Updates the data at a given offset
+ *
+ * The data argument is a readable stream resource.
+ * The offset argument is a 0-based offset where the data should be
+ * written.
+ *
+ * param resource|string $data
+ * @return void
+ */
+ public function putRange($data, $offset) {
+
+ $f = fopen($this->path, 'c');
+ fseek($f,$offset-1);
+ if (is_string($data)) {
+ fwrite($f, $data);
+ } else {
+ stream_copy_to_stream($data,$f);
+ }
+ fclose($f);
+ return '"' . md5_file($this->path) . '"';
+
+ }
+
+ /**
+ * Returns the data
+ *
+ * @return resource
+ */
+ public function get() {
+
+ return fopen($this->path,'r');
+
+ }
+
+ /**
+ * Delete the current file
+ *
+ * @return bool
+ */
+ public function delete() {
+
+ unlink($this->path);
+ return parent::delete();
+
+ }
+
+ /**
+ * Returns the ETag for a file
+ *
+ * An ETag is a unique identifier representing the current version of the file. If the file changes, the ETag MUST change.
+ * The ETag is an arbitrary string, but MUST be surrounded by double-quotes.
+ *
+ * Return null if the ETag can not effectively be determined
+ *
+ * @return string|null
+ */
+ public function getETag() {
+
+ return '"' . md5_file($this->path). '"';
+
+ }
+
+ /**
+ * Returns the mime-type for a file
+ *
+ * If null is returned, we'll assume application/octet-stream
+ *
+ * @return string|null
+ */
+ public function getContentType() {
+
+ return null;
+
+ }
+
+ /**
+ * Returns the size of the file, in bytes
+ *
+ * @return int
+ */
+ public function getSize() {
+
+ return filesize($this->path);
+
+ }
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/FSExt/Node.php b/vendor/sabre/dav/lib/Sabre/DAV/FSExt/Node.php
new file mode 100644
index 000000000..4fb6c9a9a
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/FSExt/Node.php
@@ -0,0 +1,214 @@
+<?php
+
+namespace Sabre\DAV\FSExt;
+
+use Sabre\DAV;
+
+/**
+ * Base node-class
+ *
+ * The node class implements the method used by both the File and the Directory classes
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+abstract class Node extends DAV\FS\Node implements DAV\IProperties {
+
+ /**
+ * Updates properties on this node,
+ *
+ * @param array $properties
+ * @see Sabre\DAV\IProperties::updateProperties
+ * @return bool|array
+ */
+ public function updateProperties($properties) {
+
+ $resourceData = $this->getResourceData();
+
+ foreach($properties as $propertyName=>$propertyValue) {
+
+ // If it was null, we need to delete the property
+ if (is_null($propertyValue)) {
+ if (isset($resourceData['properties'][$propertyName])) {
+ unset($resourceData['properties'][$propertyName]);
+ }
+ } else {
+ $resourceData['properties'][$propertyName] = $propertyValue;
+ }
+
+ }
+
+ $this->putResourceData($resourceData);
+ return true;
+ }
+
+ /**
+ * Returns a list of properties for this nodes.;
+ *
+ * The properties list is a list of propertynames the client requested, encoded as xmlnamespace#tagName, for example: http://www.example.org/namespace#author
+ * If the array is empty, all properties should be returned
+ *
+ * @param array $properties
+ * @return array
+ */
+ function getProperties($properties) {
+
+ $resourceData = $this->getResourceData();
+
+ // if the array was empty, we need to return everything
+ if (!$properties) return $resourceData['properties'];
+
+ $props = array();
+ foreach($properties as $property) {
+ if (isset($resourceData['properties'][$property])) $props[$property] = $resourceData['properties'][$property];
+ }
+
+ return $props;
+
+ }
+
+ /**
+ * Returns the path to the resource file
+ *
+ * @return string
+ */
+ protected function getResourceInfoPath() {
+
+ list($parentDir) = DAV\URLUtil::splitPath($this->path);
+ return $parentDir . '/.sabredav';
+
+ }
+
+ /**
+ * Returns all the stored resource information
+ *
+ * @return array
+ */
+ protected function getResourceData() {
+
+ $path = $this->getResourceInfoPath();
+ if (!file_exists($path)) return array('properties' => array());
+
+ // opening up the file, and creating a shared lock
+ $handle = fopen($path,'r');
+ flock($handle,LOCK_SH);
+ $data = '';
+
+ // Reading data until the eof
+ while(!feof($handle)) {
+ $data.=fread($handle,8192);
+ }
+
+ // We're all good
+ fclose($handle);
+
+ // Unserializing and checking if the resource file contains data for this file
+ $data = unserialize($data);
+ if (!isset($data[$this->getName()])) {
+ return array('properties' => array());
+ }
+
+ $data = $data[$this->getName()];
+ if (!isset($data['properties'])) $data['properties'] = array();
+ return $data;
+
+ }
+
+ /**
+ * Updates the resource information
+ *
+ * @param array $newData
+ * @return void
+ */
+ protected function putResourceData(array $newData) {
+
+ $path = $this->getResourceInfoPath();
+
+ // opening up the file, and creating a shared lock
+ $handle = fopen($path,'a+');
+ flock($handle,LOCK_EX);
+ $data = '';
+
+ rewind($handle);
+
+ // Reading data until the eof
+ while(!feof($handle)) {
+ $data.=fread($handle,8192);
+ }
+
+ // Unserializing and checking if the resource file contains data for this file
+ $data = unserialize($data);
+ $data[$this->getName()] = $newData;
+ ftruncate($handle,0);
+ rewind($handle);
+
+ fwrite($handle,serialize($data));
+ fclose($handle);
+
+ }
+
+ /**
+ * Renames the node
+ *
+ * @param string $name The new name
+ * @return void
+ */
+ public function setName($name) {
+
+ list($parentPath, ) = DAV\URLUtil::splitPath($this->path);
+ list(, $newName) = DAV\URLUtil::splitPath($name);
+ $newPath = $parentPath . '/' . $newName;
+
+ // We're deleting the existing resourcedata, and recreating it
+ // for the new path.
+ $resourceData = $this->getResourceData();
+ $this->deleteResourceData();
+
+ rename($this->path,$newPath);
+ $this->path = $newPath;
+ $this->putResourceData($resourceData);
+
+
+ }
+
+ /**
+ * @return bool
+ */
+ public function deleteResourceData() {
+
+ // When we're deleting this node, we also need to delete any resource information
+ $path = $this->getResourceInfoPath();
+ if (!file_exists($path)) return true;
+
+ // opening up the file, and creating a shared lock
+ $handle = fopen($path,'a+');
+ flock($handle,LOCK_EX);
+ $data = '';
+
+ rewind($handle);
+
+ // Reading data until the eof
+ while(!feof($handle)) {
+ $data.=fread($handle,8192);
+ }
+
+ // Unserializing and checking if the resource file contains data for this file
+ $data = unserialize($data);
+ if (isset($data[$this->getName()])) unset($data[$this->getName()]);
+ ftruncate($handle,0);
+ rewind($handle);
+ fwrite($handle,serialize($data));
+ fclose($handle);
+
+ return true;
+ }
+
+ public function delete() {
+
+ return $this->deleteResourceData();
+
+ }
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/File.php b/vendor/sabre/dav/lib/Sabre/DAV/File.php
new file mode 100644
index 000000000..10f56c540
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/File.php
@@ -0,0 +1,85 @@
+<?php
+
+namespace Sabre\DAV;
+
+/**
+ * File class
+ *
+ * This is a helper class, that should aid in getting file classes setup.
+ * Most of its methods are implemented, and throw permission denied exceptions
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+abstract class File extends Node implements IFile {
+
+ /**
+ * Updates the data
+ *
+ * data is a readable stream resource.
+ *
+ * @param resource $data
+ * @return void
+ */
+ public function put($data) {
+
+ throw new Exception\Forbidden('Permission denied to change data');
+
+ }
+
+ /**
+ * Returns the data
+ *
+ * This method may either return a string or a readable stream resource
+ *
+ * @return mixed
+ */
+ public function get() {
+
+ throw new Exception\Forbidden('Permission denied to read this file');
+
+ }
+
+ /**
+ * Returns the size of the file, in bytes.
+ *
+ * @return int
+ */
+ public function getSize() {
+
+ return 0;
+
+ }
+
+ /**
+ * Returns the ETag for a file
+ *
+ * An ETag is a unique identifier representing the current version of the file. If the file changes, the ETag MUST change.
+ * The ETag is an arbitrary string, but MUST be surrounded by double-quotes.
+ *
+ * Return null if the ETag can not effectively be determined
+ *
+ * @return string|null
+ */
+ public function getETag() {
+
+ return null;
+
+ }
+
+ /**
+ * Returns the mime-type for a file
+ *
+ * If null is returned, we'll assume application/octet-stream
+ *
+ * @return string|null
+ */
+ public function getContentType() {
+
+ return null;
+
+ }
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/ICollection.php b/vendor/sabre/dav/lib/Sabre/DAV/ICollection.php
new file mode 100644
index 000000000..3f26c1245
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/ICollection.php
@@ -0,0 +1,77 @@
+<?php
+
+namespace Sabre\DAV;
+
+/**
+ * The ICollection Interface
+ *
+ * This interface should be implemented by each class that represents a collection
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+interface ICollection extends INode {
+
+ /**
+ * Creates a new file in the directory
+ *
+ * Data will either be supplied as a stream resource, or in certain cases
+ * as a string. Keep in mind that you may have to support either.
+ *
+ * After successful creation of the file, you may choose to return the ETag
+ * of the new file here.
+ *
+ * The returned ETag must be surrounded by double-quotes (The quotes should
+ * be part of the actual string).
+ *
+ * If you cannot accurately determine the ETag, you should not return it.
+ * If you don't store the file exactly as-is (you're transforming it
+ * somehow) you should also not return an ETag.
+ *
+ * This means that if a subsequent GET to this new file does not exactly
+ * return the same contents of what was submitted here, you are strongly
+ * recommended to omit the ETag.
+ *
+ * @param string $name Name of the file
+ * @param resource|string $data Initial payload
+ * @return null|string
+ */
+ function createFile($name, $data = null);
+
+ /**
+ * Creates a new subdirectory
+ *
+ * @param string $name
+ * @return void
+ */
+ function createDirectory($name);
+
+ /**
+ * Returns a specific child node, referenced by its name
+ *
+ * This method must throw Sabre\DAV\Exception\NotFound if the node does not
+ * exist.
+ *
+ * @param string $name
+ * @return DAV\INode
+ */
+ function getChild($name);
+
+ /**
+ * Returns an array with all the child nodes
+ *
+ * @return DAV\INode[]
+ */
+ function getChildren();
+
+ /**
+ * Checks if a child-node with the specified name exists
+ *
+ * @param string $name
+ * @return bool
+ */
+ function childExists($name);
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/IExtendedCollection.php b/vendor/sabre/dav/lib/Sabre/DAV/IExtendedCollection.php
new file mode 100644
index 000000000..50ae3f4d2
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/IExtendedCollection.php
@@ -0,0 +1,28 @@
+<?php
+
+namespace Sabre\DAV;
+
+/**
+ * The IExtendedCollection interface.
+ *
+ * This interface can be used to create special-type of collection-resources
+ * as defined by RFC 5689.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+interface IExtendedCollection extends ICollection {
+
+ /**
+ * Creates a new collection
+ *
+ * @param string $name
+ * @param array $resourceType
+ * @param array $properties
+ * @return void
+ */
+ function createExtendedCollection($name, array $resourceType, array $properties);
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/IFile.php b/vendor/sabre/dav/lib/Sabre/DAV/IFile.php
new file mode 100644
index 000000000..025b0213d
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/IFile.php
@@ -0,0 +1,77 @@
+<?php
+
+namespace Sabre\DAV;
+
+/**
+ * This interface represents a file in the directory tree
+ *
+ * A file is a bit of a broad definition. In general it implies that on
+ * this specific node a PUT or GET method may be performed, to either update,
+ * or retrieve the contents of the file.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+interface IFile extends INode {
+
+ /**
+ * Updates the data
+ *
+ * The data argument is a readable stream resource.
+ *
+ * After a succesful put operation, you may choose to return an ETag. The
+ * etag must always be surrounded by double-quotes. These quotes must
+ * appear in the actual string you're returning.
+ *
+ * Clients may use the ETag from a PUT request to later on make sure that
+ * when they update the file, the contents haven't changed in the mean
+ * time.
+ *
+ * If you don't plan to store the file byte-by-byte, and you return a
+ * different object on a subsequent GET you are strongly recommended to not
+ * return an ETag, and just return null.
+ *
+ * @param resource $data
+ * @return string|null
+ */
+ function put($data);
+
+ /**
+ * Returns the data
+ *
+ * This method may either return a string or a readable stream resource
+ *
+ * @return mixed
+ */
+ function get();
+
+ /**
+ * Returns the mime-type for a file
+ *
+ * If null is returned, we'll assume application/octet-stream
+ *
+ * @return string|null
+ */
+ function getContentType();
+
+ /**
+ * Returns the ETag for a file
+ *
+ * An ETag is a unique identifier representing the current version of the file. If the file changes, the ETag MUST change.
+ *
+ * Return null if the ETag can not effectively be determined
+ *
+ * @return void
+ */
+ function getETag();
+
+ /**
+ * Returns the size of the node, in bytes
+ *
+ * @return int
+ */
+ function getSize();
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/INode.php b/vendor/sabre/dav/lib/Sabre/DAV/INode.php
new file mode 100644
index 000000000..c3f3c4abd
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/INode.php
@@ -0,0 +1,46 @@
+<?php
+
+namespace Sabre\DAV;
+
+/**
+ * The INode interface is the base interface, and the parent class of both ICollection and IFile
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+interface INode {
+
+ /**
+ * Deleted the current node
+ *
+ * @return void
+ */
+ function delete();
+
+ /**
+ * Returns the name of the node.
+ *
+ * This is used to generate the url.
+ *
+ * @return string
+ */
+ function getName();
+
+ /**
+ * Renames the node
+ *
+ * @param string $name The new name
+ * @return void
+ */
+ function setName($name);
+
+ /**
+ * Returns the last modification time, as a unix timestamp
+ *
+ * @return int
+ */
+ function getLastModified();
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/IProperties.php b/vendor/sabre/dav/lib/Sabre/DAV/IProperties.php
new file mode 100644
index 000000000..5e0124549
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/IProperties.php
@@ -0,0 +1,71 @@
+<?php
+
+namespace Sabre\DAV;
+
+/**
+ * IProperties interface
+ *
+ * Implement this interface to support custom WebDAV properties requested and sent from clients.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+interface IProperties extends INode {
+
+ /**
+ * Updates properties on this node,
+ *
+ * The properties array uses the propertyName in clark-notation as key,
+ * and the array value for the property value. In the case a property
+ * should be deleted, the property value will be null.
+ *
+ * This method must be atomic. If one property cannot be changed, the
+ * entire operation must fail.
+ *
+ * If the operation was successful, true can be returned.
+ * If the operation failed, false can be returned.
+ *
+ * Deletion of a non-existent property is always successful.
+ *
+ * Lastly, it is optional to return detailed information about any
+ * failures. In this case an array should be returned with the following
+ * structure:
+ *
+ * array(
+ * 403 => array(
+ * '{DAV:}displayname' => null,
+ * ),
+ * 424 => array(
+ * '{DAV:}owner' => null,
+ * )
+ * )
+ *
+ * In this example it was forbidden to update {DAV:}displayname.
+ * (403 Forbidden), which in turn also caused {DAV:}owner to fail
+ * (424 Failed Dependency) because the request needs to be atomic.
+ *
+ * @param array $mutations
+ * @return bool|array
+ */
+ function updateProperties($mutations);
+
+ /**
+ * Returns a list of properties for this nodes.
+ *
+ * The properties list is a list of propertynames the client requested,
+ * encoded in clark-notation {xmlnamespace}tagname
+ *
+ * If the array is empty, it means 'all properties' were requested.
+ *
+ * Note that it's fine to liberally give properties back, instead of
+ * conforming to the list of requested properties.
+ * The Server class will filter out the extra.
+ *
+ * @param array $properties
+ * @return void
+ */
+ function getProperties($properties);
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/IQuota.php b/vendor/sabre/dav/lib/Sabre/DAV/IQuota.php
new file mode 100644
index 000000000..463c0f0db
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/IQuota.php
@@ -0,0 +1,27 @@
+<?php
+
+namespace Sabre\DAV;
+
+/**
+ * IQuota interface
+ *
+ * Implement this interface to add the ability to return quota information. The ObjectTree
+ * will check for quota information on any given node. If the information is not available it will
+ * attempt to fetch the information from the root node.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+interface IQuota extends ICollection {
+
+ /**
+ * Returns the quota information
+ *
+ * This method MUST return an array with 2 values, the first being the total used space,
+ * the second the available space (in bytes)
+ */
+ function getQuotaInfo();
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Locks/Backend/AbstractBackend.php b/vendor/sabre/dav/lib/Sabre/DAV/Locks/Backend/AbstractBackend.php
new file mode 100644
index 000000000..78fa8aa9a
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Locks/Backend/AbstractBackend.php
@@ -0,0 +1,21 @@
+<?php
+
+namespace Sabre\DAV\Locks\Backend;
+
+use Sabre\DAV\Locks;
+
+/**
+ * This is an Abstract clas for lock backends.
+ *
+ * Currently this backend has no function, but it exists for consistency, and
+ * to ensure that if default code is required in the backend, there will be a
+ * non-bc-breaking way to do so.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+abstract class AbstractBackend implements BackendInterface {
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Locks/Backend/BackendInterface.php b/vendor/sabre/dav/lib/Sabre/DAV/Locks/Backend/BackendInterface.php
new file mode 100644
index 000000000..7665a10b5
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Locks/Backend/BackendInterface.php
@@ -0,0 +1,51 @@
+<?php
+
+namespace Sabre\DAV\Locks\Backend;
+
+use Sabre\DAV\Locks;
+
+/**
+ * If you are defining your own Locks backend, you must implement this
+ * interface.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+interface BackendInterface {
+
+ /**
+ * Returns a list of Sabre\DAV\Locks\LockInfo objects
+ *
+ * This method should return all the locks for a particular uri, including
+ * locks that might be set on a parent uri.
+ *
+ * If returnChildLocks is set to true, this method should also look for
+ * any locks in the subtree of the uri for locks.
+ *
+ * @param string $uri
+ * @param bool $returnChildLocks
+ * @return array
+ */
+ public function getLocks($uri, $returnChildLocks);
+
+ /**
+ * Locks a uri
+ *
+ * @param string $uri
+ * @param Locks\LockInfo $lockInfo
+ * @return bool
+ */
+ public function lock($uri,Locks\LockInfo $lockInfo);
+
+ /**
+ * Removes a lock from a uri
+ *
+ * @param string $uri
+ * @param Locks\LockInfo $lockInfo
+ * @return bool
+ */
+ public function unlock($uri,Locks\LockInfo $lockInfo);
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Locks/Backend/FS.php b/vendor/sabre/dav/lib/Sabre/DAV/Locks/Backend/FS.php
new file mode 100644
index 000000000..b77d8b5af
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Locks/Backend/FS.php
@@ -0,0 +1,193 @@
+<?php
+
+namespace Sabre\DAV\Locks\Backend;
+
+use Sabre\DAV\Locks\LockInfo;
+
+/**
+ * This Lock Backend stores all its data in the filesystem in separate file per
+ * node.
+ *
+ * This Lock Manager is now deprecated. It has a bug that allows parent
+ * collections to be deletes when children deeper in the tree are locked.
+ *
+ * This also means that using this backend means you will not pass the Neon
+ * Litmus test.
+ *
+ * You are recommended to use either the PDO or the File backend instead.
+ *
+ * @deprecated
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class FS extends AbstractBackend {
+
+ /**
+ * The default data directory
+ *
+ * @var string
+ */
+ private $dataDir;
+
+ public function __construct($dataDir) {
+
+ $this->dataDir = $dataDir;
+
+ }
+
+ protected function getFileNameForUri($uri) {
+
+ return $this->dataDir . '/sabredav_' . md5($uri) . '.locks';
+
+ }
+
+
+ /**
+ * Returns a list of Sabre\DAV\Locks\LockInfo objects
+ *
+ * This method should return all the locks for a particular uri, including
+ * locks that might be set on a parent uri.
+ *
+ * If returnChildLocks is set to true, this method should also look for
+ * any locks in the subtree of the uri for locks.
+ *
+ * @param string $uri
+ * @param bool $returnChildLocks
+ * @return array
+ */
+ public function getLocks($uri, $returnChildLocks) {
+
+ $lockList = array();
+ $currentPath = '';
+
+ foreach(explode('/',$uri) as $uriPart) {
+
+ // weird algorithm that can probably be improved, but we're traversing the path top down
+ if ($currentPath) $currentPath.='/';
+ $currentPath.=$uriPart;
+
+ $uriLocks = $this->getData($currentPath);
+
+ foreach($uriLocks as $uriLock) {
+
+ // Unless we're on the leaf of the uri-tree we should ignore locks with depth 0
+ if($uri==$currentPath || $uriLock->depth!=0) {
+ $uriLock->uri = $currentPath;
+ $lockList[] = $uriLock;
+ }
+
+ }
+
+ }
+
+ // Checking if we can remove any of these locks
+ foreach($lockList as $k=>$lock) {
+ if (time() > $lock->timeout + $lock->created) unset($lockList[$k]);
+ }
+ return $lockList;
+
+ }
+
+ /**
+ * Locks a uri
+ *
+ * @param string $uri
+ * @param LockInfo $lockInfo
+ * @return bool
+ */
+ public function lock($uri, LockInfo $lockInfo) {
+
+ // We're making the lock timeout 30 minutes
+ $lockInfo->timeout = 1800;
+ $lockInfo->created = time();
+
+ $locks = $this->getLocks($uri,false);
+ foreach($locks as $k=>$lock) {
+ if ($lock->token == $lockInfo->token) unset($locks[$k]);
+ }
+ $locks[] = $lockInfo;
+ $this->putData($uri,$locks);
+ return true;
+
+ }
+
+ /**
+ * Removes a lock from a uri
+ *
+ * @param string $uri
+ * @param LockInfo $lockInfo
+ * @return bool
+ */
+ public function unlock($uri, LockInfo $lockInfo) {
+
+ $locks = $this->getLocks($uri,false);
+ foreach($locks as $k=>$lock) {
+
+ if ($lock->token == $lockInfo->token) {
+
+ unset($locks[$k]);
+ $this->putData($uri,$locks);
+ return true;
+
+ }
+ }
+ return false;
+
+ }
+
+ /**
+ * Returns the stored data for a uri
+ *
+ * @param string $uri
+ * @return array
+ */
+ protected function getData($uri) {
+
+ $path = $this->getFilenameForUri($uri);
+ if (!file_exists($path)) return array();
+
+ // opening up the file, and creating a shared lock
+ $handle = fopen($path,'r');
+ flock($handle,LOCK_SH);
+ $data = '';
+
+ // Reading data until the eof
+ while(!feof($handle)) {
+ $data.=fread($handle,8192);
+ }
+
+ // We're all good
+ fclose($handle);
+
+ // Unserializing and checking if the resource file contains data for this file
+ $data = unserialize($data);
+ if (!$data) return array();
+ return $data;
+
+ }
+
+ /**
+ * Updates the lock information
+ *
+ * @param string $uri
+ * @param array $newData
+ * @return void
+ */
+ protected function putData($uri,array $newData) {
+
+ $path = $this->getFileNameForUri($uri);
+
+ // opening up the file, and creating a shared lock
+ $handle = fopen($path,'a+');
+ flock($handle,LOCK_EX);
+ ftruncate($handle,0);
+ rewind($handle);
+
+ fwrite($handle,serialize($newData));
+ fclose($handle);
+
+ }
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Locks/Backend/File.php b/vendor/sabre/dav/lib/Sabre/DAV/Locks/Backend/File.php
new file mode 100644
index 000000000..22d31e347
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Locks/Backend/File.php
@@ -0,0 +1,183 @@
+<?php
+
+namespace Sabre\DAV\Locks\Backend;
+
+use Sabre\DAV\Locks\LockInfo;
+
+/**
+ * The Lock manager allows you to handle all file-locks centrally.
+ *
+ * This Lock Manager stores all its data in a single file.
+ *
+ * Note that this is not nearly as robust as a database, you are encouraged
+ * to use the PDO backend instead.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class File extends AbstractBackend {
+
+ /**
+ * The storage file
+ *
+ * @var string
+ */
+ private $locksFile;
+
+ /**
+ * Constructor
+ *
+ * @param string $locksFile path to file
+ */
+ public function __construct($locksFile) {
+
+ $this->locksFile = $locksFile;
+
+ }
+
+ /**
+ * Returns a list of Sabre\DAV\Locks\LockInfo objects
+ *
+ * This method should return all the locks for a particular uri, including
+ * locks that might be set on a parent uri.
+ *
+ * If returnChildLocks is set to true, this method should also look for
+ * any locks in the subtree of the uri for locks.
+ *
+ * @param string $uri
+ * @param bool $returnChildLocks
+ * @return array
+ */
+ public function getLocks($uri, $returnChildLocks) {
+
+ $newLocks = array();
+
+ $locks = $this->getData();
+
+ foreach($locks as $lock) {
+
+ if ($lock->uri === $uri ||
+ //deep locks on parents
+ ($lock->depth!=0 && strpos($uri, $lock->uri . '/')===0) ||
+
+ // locks on children
+ ($returnChildLocks && (strpos($lock->uri, $uri . '/')===0)) ) {
+
+ $newLocks[] = $lock;
+
+ }
+
+ }
+
+ // Checking if we can remove any of these locks
+ foreach($newLocks as $k=>$lock) {
+ if (time() > $lock->timeout + $lock->created) unset($newLocks[$k]);
+ }
+ return $newLocks;
+
+ }
+
+ /**
+ * Locks a uri
+ *
+ * @param string $uri
+ * @param LockInfo $lockInfo
+ * @return bool
+ */
+ public function lock($uri, LockInfo $lockInfo) {
+
+ // We're making the lock timeout 30 minutes
+ $lockInfo->timeout = 1800;
+ $lockInfo->created = time();
+ $lockInfo->uri = $uri;
+
+ $locks = $this->getData();
+
+ foreach($locks as $k=>$lock) {
+ if (
+ ($lock->token == $lockInfo->token) ||
+ (time() > $lock->timeout + $lock->created)
+ ) {
+ unset($locks[$k]);
+ }
+ }
+ $locks[] = $lockInfo;
+ $this->putData($locks);
+ return true;
+
+ }
+
+ /**
+ * Removes a lock from a uri
+ *
+ * @param string $uri
+ * @param LockInfo $lockInfo
+ * @return bool
+ */
+ public function unlock($uri, LockInfo $lockInfo) {
+
+ $locks = $this->getData();
+ foreach($locks as $k=>$lock) {
+
+ if ($lock->token == $lockInfo->token) {
+
+ unset($locks[$k]);
+ $this->putData($locks);
+ return true;
+
+ }
+ }
+ return false;
+
+ }
+
+ /**
+ * Loads the lockdata from the filesystem.
+ *
+ * @return array
+ */
+ protected function getData() {
+
+ if (!file_exists($this->locksFile)) return array();
+
+ // opening up the file, and creating a shared lock
+ $handle = fopen($this->locksFile,'r');
+ flock($handle,LOCK_SH);
+
+ // Reading data until the eof
+ $data = stream_get_contents($handle);
+
+ // We're all good
+ fclose($handle);
+
+ // Unserializing and checking if the resource file contains data for this file
+ $data = unserialize($data);
+ if (!$data) return array();
+ return $data;
+
+ }
+
+ /**
+ * Saves the lockdata
+ *
+ * @param array $newData
+ * @return void
+ */
+ protected function putData(array $newData) {
+
+ // opening up the file, and creating an exclusive lock
+ $handle = fopen($this->locksFile,'a+');
+ flock($handle,LOCK_EX);
+
+ // We can only truncate and rewind once the lock is acquired.
+ ftruncate($handle,0);
+ rewind($handle);
+
+ fwrite($handle,serialize($newData));
+ fclose($handle);
+
+ }
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Locks/Backend/PDO.php b/vendor/sabre/dav/lib/Sabre/DAV/Locks/Backend/PDO.php
new file mode 100644
index 000000000..cb9f633cc
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Locks/Backend/PDO.php
@@ -0,0 +1,167 @@
+<?php
+
+namespace Sabre\DAV\Locks\Backend;
+
+use Sabre\DAV\Locks\LockInfo;
+
+/**
+ * The Lock manager allows you to handle all file-locks centrally.
+ *
+ * This Lock Manager stores all its data in a database. You must pass a PDO
+ * connection object in the constructor.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class PDO extends AbstractBackend {
+
+ /**
+ * The PDO connection object
+ *
+ * @var pdo
+ */
+ private $pdo;
+
+ /**
+ * The PDO tablename this backend uses.
+ *
+ * @var string
+ */
+ protected $tableName;
+
+ /**
+ * Constructor
+ *
+ * @param PDO $pdo
+ * @param string $tableName
+ */
+ public function __construct(\PDO $pdo, $tableName = 'locks') {
+
+ $this->pdo = $pdo;
+ $this->tableName = $tableName;
+
+ }
+
+ /**
+ * Returns a list of Sabre\DAV\Locks\LockInfo objects
+ *
+ * This method should return all the locks for a particular uri, including
+ * locks that might be set on a parent uri.
+ *
+ * If returnChildLocks is set to true, this method should also look for
+ * any locks in the subtree of the uri for locks.
+ *
+ * @param string $uri
+ * @param bool $returnChildLocks
+ * @return array
+ */
+ public function getLocks($uri, $returnChildLocks) {
+
+ // NOTE: the following 10 lines or so could be easily replaced by
+ // pure sql. MySQL's non-standard string concatenation prevents us
+ // from doing this though.
+ $query = 'SELECT owner, token, timeout, created, scope, depth, uri FROM '.$this->tableName.' WHERE ((created + timeout) > CAST(? AS UNSIGNED INTEGER)) AND ((uri = ?)';
+ $params = array(time(),$uri);
+
+ // We need to check locks for every part in the uri.
+ $uriParts = explode('/',$uri);
+
+ // We already covered the last part of the uri
+ array_pop($uriParts);
+
+ $currentPath='';
+
+ foreach($uriParts as $part) {
+
+ if ($currentPath) $currentPath.='/';
+ $currentPath.=$part;
+
+ $query.=' OR (depth!=0 AND uri = ?)';
+ $params[] = $currentPath;
+
+ }
+
+ if ($returnChildLocks) {
+
+ $query.=' OR (uri LIKE ?)';
+ $params[] = $uri . '/%';
+
+ }
+ $query.=')';
+
+ $stmt = $this->pdo->prepare($query);
+ $stmt->execute($params);
+ $result = $stmt->fetchAll();
+
+ $lockList = array();
+ foreach($result as $row) {
+
+ $lockInfo = new LockInfo();
+ $lockInfo->owner = $row['owner'];
+ $lockInfo->token = $row['token'];
+ $lockInfo->timeout = $row['timeout'];
+ $lockInfo->created = $row['created'];
+ $lockInfo->scope = $row['scope'];
+ $lockInfo->depth = $row['depth'];
+ $lockInfo->uri = $row['uri'];
+ $lockList[] = $lockInfo;
+
+ }
+
+ return $lockList;
+
+ }
+
+ /**
+ * Locks a uri
+ *
+ * @param string $uri
+ * @param LockInfo $lockInfo
+ * @return bool
+ */
+ public function lock($uri, LockInfo $lockInfo) {
+
+ // We're making the lock timeout 30 minutes
+ $lockInfo->timeout = 30*60;
+ $lockInfo->created = time();
+ $lockInfo->uri = $uri;
+
+ $locks = $this->getLocks($uri,false);
+ $exists = false;
+ foreach($locks as $lock) {
+ if ($lock->token == $lockInfo->token) $exists = true;
+ }
+
+ if ($exists) {
+ $stmt = $this->pdo->prepare('UPDATE '.$this->tableName.' SET owner = ?, timeout = ?, scope = ?, depth = ?, uri = ?, created = ? WHERE token = ?');
+ $stmt->execute(array($lockInfo->owner,$lockInfo->timeout,$lockInfo->scope,$lockInfo->depth,$uri,$lockInfo->created,$lockInfo->token));
+ } else {
+ $stmt = $this->pdo->prepare('INSERT INTO '.$this->tableName.' (owner,timeout,scope,depth,uri,created,token) VALUES (?,?,?,?,?,?,?)');
+ $stmt->execute(array($lockInfo->owner,$lockInfo->timeout,$lockInfo->scope,$lockInfo->depth,$uri,$lockInfo->created,$lockInfo->token));
+ }
+
+ return true;
+
+ }
+
+
+
+ /**
+ * Removes a lock from a uri
+ *
+ * @param string $uri
+ * @param LockInfo $lockInfo
+ * @return bool
+ */
+ public function unlock($uri, LockInfo $lockInfo) {
+
+ $stmt = $this->pdo->prepare('DELETE FROM '.$this->tableName.' WHERE uri = ? AND token = ?');
+ $stmt->execute(array($uri,$lockInfo->token));
+
+ return $stmt->rowCount()===1;
+
+ }
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Locks/LockInfo.php b/vendor/sabre/dav/lib/Sabre/DAV/Locks/LockInfo.php
new file mode 100644
index 000000000..f7178a819
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Locks/LockInfo.php
@@ -0,0 +1,81 @@
+<?php
+
+namespace Sabre\DAV\Locks;
+
+/**
+ * LockInfo class
+ *
+ * An object of the LockInfo class holds all the information relevant to a
+ * single lock.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class LockInfo {
+
+ /**
+ * A shared lock
+ */
+ const SHARED = 1;
+
+ /**
+ * An exclusive lock
+ */
+ const EXCLUSIVE = 2;
+
+ /**
+ * A never expiring timeout
+ */
+ const TIMEOUT_INFINITE = -1;
+
+ /**
+ * The owner of the lock
+ *
+ * @var string
+ */
+ public $owner;
+
+ /**
+ * The locktoken
+ *
+ * @var string
+ */
+ public $token;
+
+ /**
+ * How long till the lock is expiring
+ *
+ * @var int
+ */
+ public $timeout;
+
+ /**
+ * UNIX Timestamp of when this lock was created
+ *
+ * @var int
+ */
+ public $created;
+
+ /**
+ * Exclusive or shared lock
+ *
+ * @var int
+ */
+ public $scope = self::EXCLUSIVE;
+
+ /**
+ * Depth of lock, can be 0 or Sabre\DAV\Server::DEPTH_INFINITY
+ */
+ public $depth = 0;
+
+ /**
+ * The uri this lock locks
+ *
+ * TODO: This value is not always set
+ * @var mixed
+ */
+ public $uri;
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Locks/Plugin.php b/vendor/sabre/dav/lib/Sabre/DAV/Locks/Plugin.php
new file mode 100644
index 000000000..ece363e1b
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Locks/Plugin.php
@@ -0,0 +1,642 @@
+<?php
+
+namespace Sabre\DAV\Locks;
+
+use Sabre\DAV;
+
+/**
+ * Locking plugin
+ *
+ * This plugin 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');
+ * $lockPlugin = new Sabre\DAV\Locks\Plugin($lockBackend);
+ * $server->addPlugin($lockPlugin);
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Plugin extends DAV\ServerPlugin {
+
+ /**
+ * locksBackend
+ *
+ * @var Backend\Backend\Interface
+ */
+ protected $locksBackend;
+
+ /**
+ * server
+ *
+ * @var Sabre\DAV\Server
+ */
+ protected $server;
+
+ /**
+ * __construct
+ *
+ * @param Backend\BackendInterface $locksBackend
+ */
+ public function __construct(Backend\BackendInterface $locksBackend = null) {
+
+ $this->locksBackend = $locksBackend;
+
+ }
+
+ /**
+ * Initializes the plugin
+ *
+ * This method is automatically called by the Server class after addPlugin.
+ *
+ * @param DAV\Server $server
+ * @return void
+ */
+ public function initialize(DAV\Server $server) {
+
+ $this->server = $server;
+ $server->subscribeEvent('unknownMethod',array($this,'unknownMethod'));
+ $server->subscribeEvent('beforeMethod',array($this,'beforeMethod'),50);
+ $server->subscribeEvent('afterGetProperties',array($this,'afterGetProperties'));
+
+ }
+
+ /**
+ * Returns a plugin name.
+ *
+ * Using this name other plugins will be able to access other plugins
+ * using Sabre\DAV\Server::getPlugin
+ *
+ * @return string
+ */
+ public function getPluginName() {
+
+ return 'locks';
+
+ }
+
+ /**
+ * 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.
+ *
+ * @param string $method
+ * @param string $uri
+ * @return bool
+ */
+ public function unknownMethod($method, $uri) {
+
+ switch($method) {
+
+ case 'LOCK' : $this->httpLock($uri); return false;
+ case 'UNLOCK' : $this->httpUnlock($uri); return false;
+
+ }
+
+ }
+
+ /**
+ * This method is called after most properties have been found
+ * it allows us to add in any Lock-related properties
+ *
+ * @param string $path
+ * @param array $newProperties
+ * @return bool
+ */
+ public function afterGetProperties($path, &$newProperties) {
+
+ foreach($newProperties[404] as $propName=>$discard) {
+
+ switch($propName) {
+
+ case '{DAV:}supportedlock' :
+ $val = false;
+ if ($this->locksBackend) $val = true;
+ $newProperties[200][$propName] = new DAV\Property\SupportedLock($val);
+ unset($newProperties[404][$propName]);
+ break;
+
+ case '{DAV:}lockdiscovery' :
+ $newProperties[200][$propName] = new DAV\Property\LockDiscovery($this->getLocks($path));
+ unset($newProperties[404][$propName]);
+ break;
+
+ }
+
+
+ }
+ return true;
+
+ }
+
+
+ /**
+ * This method is called before the logic for any HTTP method is
+ * handled.
+ *
+ * This plugin uses that feature to intercept access to locked resources.
+ *
+ * @param string $method
+ * @param string $uri
+ * @return bool
+ */
+ public function beforeMethod($method, $uri) {
+
+ switch($method) {
+
+ case 'DELETE' :
+ $lastLock = null;
+ if (!$this->validateLock($uri,$lastLock, true))
+ throw new DAV\Exception\Locked($lastLock);
+ break;
+ case 'MKCOL' :
+ case 'PROPPATCH' :
+ case 'PUT' :
+ case 'PATCH' :
+ $lastLock = null;
+ if (!$this->validateLock($uri,$lastLock))
+ throw new DAV\Exception\Locked($lastLock);
+ break;
+ case 'MOVE' :
+ $lastLock = null;
+ if (!$this->validateLock(array(
+ $uri,
+ $this->server->calculateUri($this->server->httpRequest->getHeader('Destination')),
+ ),$lastLock, true))
+ throw new DAV\Exception\Locked($lastLock);
+ break;
+ case 'COPY' :
+ $lastLock = null;
+ if (!$this->validateLock(
+ $this->server->calculateUri($this->server->httpRequest->getHeader('Destination')),
+ $lastLock, true))
+ throw new DAV\Exception\Locked($lastLock);
+ break;
+ }
+
+ return true;
+
+ }
+
+ /**
+ * Use this method to tell the server this plugin defines additional
+ * HTTP methods.
+ *
+ * This method is passed a uri. It should only return HTTP methods that are
+ * available for the specified uri.
+ *
+ * @param string $uri
+ * @return array
+ */
+ public function getHTTPMethods($uri) {
+
+ if ($this->locksBackend)
+ return array('LOCK','UNLOCK');
+
+ return array();
+
+ }
+
+ /**
+ * Returns a list of features for the HTTP OPTIONS Dav: header.
+ *
+ * In this case this is only the number 2. The 2 in the Dav: header
+ * indicates the server supports locks.
+ *
+ * @return array
+ */
+ public function getFeatures() {
+
+ return array(2);
+
+ }
+
+ /**
+ * Returns all lock information on a particular uri
+ *
+ * This function should return an array with Sabre\DAV\Locks\LockInfo objects. If there are no locks on a file, return an empty array.
+ *
+ * Additionally there is also the possibility of locks on parent nodes, so we'll need to traverse every part of the tree
+ * If the $returnChildLocks argument is set to true, we'll also traverse all the children of the object
+ * for any possible locks and return those as well.
+ *
+ * @param string $uri
+ * @param bool $returnChildLocks
+ * @return array
+ */
+ public function getLocks($uri, $returnChildLocks = false) {
+
+ $lockList = array();
+
+ if ($this->locksBackend)
+ $lockList = array_merge($lockList,$this->locksBackend->getLocks($uri, $returnChildLocks));
+
+ return $lockList;
+
+ }
+
+ /**
+ * Locks an uri
+ *
+ * The WebDAV lock request can be operated to either create a new lock on a file, or to refresh an existing lock
+ * If a new lock is created, a full XML body should be supplied, containing information about the lock such as the type
+ * of lock (shared or exclusive) and the owner of the lock
+ *
+ * If a lock is to be refreshed, no body should be supplied and there should be a valid If header containing the lock
+ *
+ * Additionally, a lock can be requested for a non-existent file. In these case we're obligated to create an empty file as per RFC4918:S7.3
+ *
+ * @param string $uri
+ * @return void
+ */
+ protected function httpLock($uri) {
+
+ $lastLock = null;
+ if (!$this->validateLock($uri,$lastLock)) {
+
+ // If the existing lock was an exclusive lock, we need to fail
+ if (!$lastLock || $lastLock->scope == LockInfo::EXCLUSIVE) {
+ //var_dump($lastLock);
+ throw new DAV\Exception\ConflictingLock($lastLock);
+ }
+
+ }
+
+ if ($body = $this->server->httpRequest->getBody(true)) {
+ // This is a new lock request
+ $lockInfo = $this->parseLockRequest($body);
+ $lockInfo->depth = $this->server->getHTTPDepth();
+ $lockInfo->uri = $uri;
+ if($lastLock && $lockInfo->scope != LockInfo::SHARED) throw new DAV\Exception\ConflictingLock($lastLock);
+
+ } elseif ($lastLock) {
+
+ // This must have been a lock refresh
+ $lockInfo = $lastLock;
+
+ // The resource could have been locked through another uri.
+ if ($uri!=$lockInfo->uri) $uri = $lockInfo->uri;
+
+ } else {
+
+ // There was neither a lock refresh nor a new lock request
+ throw new DAV\Exception\BadRequest('An xml body is required for lock requests');
+
+ }
+
+ if ($timeout = $this->getTimeoutHeader()) $lockInfo->timeout = $timeout;
+
+ $newFile = false;
+
+ // If we got this far.. we should go check if this node actually exists. If this is not the case, we need to create it first
+ try {
+ $this->server->tree->getNodeForPath($uri);
+
+ // We need to call the beforeWriteContent event for RFC3744
+ // Edit: looks like this is not used, and causing problems now.
+ //
+ // See Issue 222
+ // $this->server->broadcastEvent('beforeWriteContent',array($uri));
+
+ } catch (DAV\Exception\NotFound $e) {
+
+ // It didn't, lets create it
+ $this->server->createFile($uri,fopen('php://memory','r'));
+ $newFile = true;
+
+ }
+
+ $this->lockNode($uri,$lockInfo);
+
+ $this->server->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8');
+ $this->server->httpResponse->setHeader('Lock-Token','<opaquelocktoken:' . $lockInfo->token . '>');
+ $this->server->httpResponse->sendStatus($newFile?201:200);
+ $this->server->httpResponse->sendBody($this->generateLockResponse($lockInfo));
+
+ }
+
+ /**
+ * Unlocks a uri
+ *
+ * This WebDAV method allows you to remove a lock from a node. The client should provide a valid locktoken through the Lock-token http header
+ * The server should return 204 (No content) on success
+ *
+ * @param string $uri
+ * @return void
+ */
+ protected function httpUnlock($uri) {
+
+ $lockToken = $this->server->httpRequest->getHeader('Lock-Token');
+
+ // If the locktoken header is not supplied, we need to throw a bad request exception
+ if (!$lockToken) throw new DAV\Exception\BadRequest('No lock token was supplied');
+
+ $locks = $this->getLocks($uri);
+
+ // Windows sometimes forgets to include < and > in the Lock-Token
+ // header
+ if ($lockToken[0]!=='<') $lockToken = '<' . $lockToken . '>';
+
+ foreach($locks as $lock) {
+
+ if ('<opaquelocktoken:' . $lock->token . '>' == $lockToken) {
+
+ $this->unlockNode($uri,$lock);
+ $this->server->httpResponse->setHeader('Content-Length','0');
+ $this->server->httpResponse->sendStatus(204);
+ return;
+
+ }
+
+ }
+
+ // If we got here, it means the locktoken was invalid
+ throw new DAV\Exception\LockTokenMatchesRequestUri();
+
+ }
+
+ /**
+ * Locks a uri
+ *
+ * All the locking information is supplied in the lockInfo object. The object has a suggested timeout, but this can be safely ignored
+ * It is important that if the existing timeout is ignored, the property is overwritten, as this needs to be sent back to the client
+ *
+ * @param string $uri
+ * @param LockInfo $lockInfo
+ * @return bool
+ */
+ public function lockNode($uri,LockInfo $lockInfo) {
+
+ if (!$this->server->broadcastEvent('beforeLock',array($uri,$lockInfo))) return;
+
+ if ($this->locksBackend) return $this->locksBackend->lock($uri,$lockInfo);
+ throw new DAV\Exception\MethodNotAllowed('Locking support is not enabled for this resource. No Locking backend was found so if you didn\'t expect this error, please check your configuration.');
+
+ }
+
+ /**
+ * Unlocks a uri
+ *
+ * This method removes a lock from a uri. It is assumed all the supplied information is correct and verified
+ *
+ * @param string $uri
+ * @param LockInfo $lockInfo
+ * @return bool
+ */
+ public function unlockNode($uri, LockInfo $lockInfo) {
+
+ if (!$this->server->broadcastEvent('beforeUnlock',array($uri,$lockInfo))) return;
+ if ($this->locksBackend) return $this->locksBackend->unlock($uri,$lockInfo);
+
+ }
+
+
+ /**
+ * Returns the contents of the HTTP Timeout header.
+ *
+ * The method formats the header into an integer.
+ *
+ * @return int
+ */
+ public function getTimeoutHeader() {
+
+ $header = $this->server->httpRequest->getHeader('Timeout');
+
+ if ($header) {
+
+ if (stripos($header,'second-')===0) $header = (int)(substr($header,7));
+ else if (strtolower($header)=='infinite') $header = LockInfo::TIMEOUT_INFINITE;
+ else throw new DAV\Exception\BadRequest('Invalid HTTP timeout header');
+
+ } else {
+
+ $header = 0;
+
+ }
+
+ return $header;
+
+ }
+
+ /**
+ * Generates the response for successful LOCK requests
+ *
+ * @param LockInfo $lockInfo
+ * @return string
+ */
+ protected function generateLockResponse(LockInfo $lockInfo) {
+
+ $dom = new \DOMDocument('1.0','utf-8');
+ $dom->formatOutput = true;
+
+ $prop = $dom->createElementNS('DAV:','d:prop');
+ $dom->appendChild($prop);
+
+ $lockDiscovery = $dom->createElementNS('DAV:','d:lockdiscovery');
+ $prop->appendChild($lockDiscovery);
+
+ $lockObj = new DAV\Property\LockDiscovery(array($lockInfo),true);
+ $lockObj->serialize($this->server,$lockDiscovery);
+
+ return $dom->saveXML();
+
+ }
+
+ /**
+ * validateLock should be called when a write operation is about to happen
+ * It will check if the requested url is locked, and see if the correct lock tokens are passed
+ *
+ * @param mixed $urls List of relevant urls. Can be an array, a string or nothing at all for the current request uri
+ * @param mixed $lastLock This variable will be populated with the last checked lock object (Sabre\DAV\Locks\LockInfo)
+ * @param bool $checkChildLocks If set to true, this function will also look for any locks set on child resources of the supplied urls. This is needed for for example deletion of entire trees.
+ * @return bool
+ */
+ protected function validateLock($urls = null,&$lastLock = null, $checkChildLocks = false) {
+
+ if (is_null($urls)) {
+ $urls = array($this->server->getRequestUri());
+ } elseif (is_string($urls)) {
+ $urls = array($urls);
+ } elseif (!is_array($urls)) {
+ throw new DAV\Exception('The urls parameter should either be null, a string or an array');
+ }
+
+ $conditions = $this->getIfConditions();
+
+ // We're going to loop through the urls and make sure all lock conditions are satisfied
+ foreach($urls as $url) {
+
+ $locks = $this->getLocks($url, $checkChildLocks);
+
+ // If there were no conditions, but there were locks, we fail
+ if (!$conditions && $locks) {
+ reset($locks);
+ $lastLock = current($locks);
+ return false;
+ }
+
+ // If there were no locks or conditions, we go to the next url
+ if (!$locks && !$conditions) continue;
+
+ foreach($conditions as $condition) {
+
+ if (!$condition['uri']) {
+ $conditionUri = $this->server->getRequestUri();
+ } else {
+ $conditionUri = $this->server->calculateUri($condition['uri']);
+ }
+
+ // If the condition has a url, and it isn't part of the affected url at all, check the next condition
+ if ($conditionUri && strpos($url,$conditionUri)!==0) continue;
+
+ // The tokens array contians arrays with 2 elements. 0=true/false for normal/not condition, 1=locktoken
+ // At least 1 condition has to be satisfied
+ foreach($condition['tokens'] as $conditionToken) {
+
+ $etagValid = true;
+ $lockValid = true;
+
+ // key 2 can contain an etag
+ if ($conditionToken[2]) {
+
+ $uri = $conditionUri?$conditionUri:$this->server->getRequestUri();
+ $node = $this->server->tree->getNodeForPath($uri);
+ $etagValid = $node->getETag()==$conditionToken[2];
+
+ }
+
+ // key 1 can contain a lock token
+ if ($conditionToken[1]) {
+
+ $lockValid = false;
+ // Match all the locks
+ foreach($locks as $lockIndex=>$lock) {
+
+ $lockToken = 'opaquelocktoken:' . $lock->token;
+
+ // Checking NOT
+ if (!$conditionToken[0] && $lockToken != $conditionToken[1]) {
+
+ // Condition valid, onto the next
+ $lockValid = true;
+ break;
+ }
+ if ($conditionToken[0] && $lockToken == $conditionToken[1]) {
+
+ $lastLock = $lock;
+ // Condition valid and lock matched
+ unset($locks[$lockIndex]);
+ $lockValid = true;
+ break;
+
+ }
+
+ }
+
+ }
+
+ // If, after checking both etags and locks they are stil valid,
+ // we can continue with the next condition.
+ if ($etagValid && $lockValid) continue 2;
+ }
+ // No conditions matched, so we fail
+ throw new DAV\Exception\PreconditionFailed('The tokens provided in the if header did not match','If');
+ }
+
+ // Conditions were met, we'll also need to check if all the locks are gone
+ if (count($locks)) {
+
+ reset($locks);
+
+ // There's still locks, we fail
+ $lastLock = current($locks);
+ return false;
+
+ }
+
+
+ }
+
+ // We got here, this means every condition was satisfied
+ return true;
+
+ }
+
+ /**
+ * This method is created to extract information from the WebDAV HTTP 'If:' header
+ *
+ * The If header can be quite complex, and has a bunch of features. We're using a regex to extract all relevant information
+ * The function will return an array, containing structs with the following keys
+ *
+ * * uri - the uri the condition applies to. If this is returned as an
+ * empty string, this implies it's referring to the request url.
+ * * tokens - The lock token. another 2 dimensional array containing 2 elements (0 = true/false.. If this is a negative condition its set to false, 1 = the actual token)
+ * * etag - an etag, if supplied
+ *
+ * @return array
+ */
+ public function getIfConditions() {
+
+ $header = $this->server->httpRequest->getHeader('If');
+ if (!$header) return array();
+
+ $matches = array();
+
+ $regex = '/(?:\<(?P<uri>.*?)\>\s)?\((?P<not>Not\s)?(?:\<(?P<token>[^\>]*)\>)?(?:\s?)(?:\[(?P<etag>[^\]]*)\])?\)/im';
+ preg_match_all($regex,$header,$matches,PREG_SET_ORDER);
+
+ $conditions = array();
+
+ foreach($matches as $match) {
+
+ $condition = array(
+ 'uri' => $match['uri'],
+ 'tokens' => array(
+ array($match['not']?0:1,$match['token'],isset($match['etag'])?$match['etag']:'')
+ ),
+ );
+
+ if (!$condition['uri'] && count($conditions)) $conditions[count($conditions)-1]['tokens'][] = array(
+ $match['not']?0:1,
+ $match['token'],
+ isset($match['etag'])?$match['etag']:''
+ );
+ else {
+ $conditions[] = $condition;
+ }
+
+ }
+
+ return $conditions;
+
+ }
+
+ /**
+ * Parses a webdav lock xml body, and returns a new Sabre\DAV\Locks\LockInfo object
+ *
+ * @param string $body
+ * @return DAV\Locks\LockInfo
+ */
+ protected function parseLockRequest($body) {
+
+ $xml = simplexml_load_string(
+ DAV\XMLUtil::convertDAVNamespace($body),
+ null,
+ LIBXML_NOWARNING);
+ $xml->registerXPathNamespace('d','urn:DAV');
+ $lockInfo = new LockInfo();
+
+ $children = $xml->children("urn:DAV");
+ $lockInfo->owner = (string)$children->owner;
+
+ $lockInfo->token = DAV\UUIDUtil::getUUID();
+ $lockInfo->scope = count($xml->xpath('d:lockscope/d:exclusive'))>0 ? LockInfo::EXCLUSIVE : LockInfo::SHARED;
+
+ return $lockInfo;
+
+ }
+
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Mount/Plugin.php b/vendor/sabre/dav/lib/Sabre/DAV/Mount/Plugin.php
new file mode 100644
index 000000000..669acafc0
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Mount/Plugin.php
@@ -0,0 +1,83 @@
+<?php
+
+namespace Sabre\DAV\Mount;
+
+use Sabre\DAV;
+
+/**
+ * This plugin provides support for RFC4709: Mounting WebDAV servers
+ *
+ * Simply append ?mount to any collection to generate the davmount response.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Plugin extends DAV\ServerPlugin {
+
+ /**
+ * Reference to Server class
+ *
+ * @var Sabre\DAV\Server
+ */
+ protected $server;
+
+ /**
+ * Initializes the plugin and registers event handles
+ *
+ * @param DAV\Server $server
+ * @return void
+ */
+ public function initialize(DAV\Server $server) {
+
+ $this->server = $server;
+ $this->server->subscribeEvent('beforeMethod',array($this,'beforeMethod'), 90);
+
+ }
+
+ /**
+ * 'beforeMethod' event handles. This event handles intercepts GET requests ending
+ * with ?mount
+ *
+ * @param string $method
+ * @param string $uri
+ * @return bool
+ */
+ public function beforeMethod($method, $uri) {
+
+ if ($method!='GET') return;
+ if ($this->server->httpRequest->getQueryString()!='mount') return;
+
+ $currentUri = $this->server->httpRequest->getAbsoluteUri();
+
+ // Stripping off everything after the ?
+ list($currentUri) = explode('?',$currentUri);
+
+ $this->davMount($currentUri);
+
+ // Returning false to break the event chain
+ return false;
+
+ }
+
+ /**
+ * Generates the davmount response
+ *
+ * @param string $uri absolute uri
+ * @return void
+ */
+ public function davMount($uri) {
+
+ $this->server->httpResponse->sendStatus(200);
+ $this->server->httpResponse->setHeader('Content-Type','application/davmount+xml');
+ ob_start();
+ echo '<?xml version="1.0"?>', "\n";
+ echo "<dm:mount xmlns:dm=\"http://purl.org/NET/webdav/mount\">\n";
+ echo " <dm:url>", htmlspecialchars($uri, ENT_NOQUOTES, 'UTF-8'), "</dm:url>\n";
+ echo "</dm:mount>";
+ $this->server->httpResponse->sendBody(ob_get_clean());
+
+ }
+
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Node.php b/vendor/sabre/dav/lib/Sabre/DAV/Node.php
new file mode 100644
index 000000000..53c4b831a
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Node.php
@@ -0,0 +1,55 @@
+<?php
+
+namespace Sabre\DAV;
+
+/**
+ * Node class
+ *
+ * This is a helper class, that should aid in getting nodes setup.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+abstract class Node implements INode {
+
+ /**
+ * Returns the last modification time
+ *
+ * In this case, it will simply return the current time
+ *
+ * @return int
+ */
+ public function getLastModified() {
+
+ return time();
+
+ }
+
+ /**
+ * Deletes the current node
+ *
+ * @throws Sabre\DAV\Exception\Forbidden
+ * @return void
+ */
+ public function delete() {
+
+ throw new Exception\Forbidden('Permission denied to delete node');
+
+ }
+
+ /**
+ * Renames the node
+ *
+ * @throws Sabre\DAV\Exception\Forbidden
+ * @param string $name The new name
+ * @return void
+ */
+ public function setName($name) {
+
+ throw new Exception\Forbidden('Permission denied to rename file');
+
+ }
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/ObjectTree.php b/vendor/sabre/dav/lib/Sabre/DAV/ObjectTree.php
new file mode 100644
index 000000000..fda55e19a
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/ObjectTree.php
@@ -0,0 +1,159 @@
+<?php
+
+namespace Sabre\DAV;
+
+/**
+ * ObjectTree class
+ *
+ * This implementation of the Tree class makes use of the INode, IFile and ICollection API's
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class ObjectTree extends Tree {
+
+ /**
+ * The root node
+ *
+ * @var ICollection
+ */
+ protected $rootNode;
+
+ /**
+ * This is the node cache. Accessed nodes are stored here
+ *
+ * @var array
+ */
+ protected $cache = array();
+
+ /**
+ * Creates the object
+ *
+ * This method expects the rootObject to be passed as a parameter
+ *
+ * @param ICollection $rootNode
+ */
+ public function __construct(ICollection $rootNode) {
+
+ $this->rootNode = $rootNode;
+
+ }
+
+ /**
+ * Returns the INode object for the requested path
+ *
+ * @param string $path
+ * @return INode
+ */
+ public function getNodeForPath($path) {
+
+ $path = trim($path,'/');
+ if (isset($this->cache[$path])) return $this->cache[$path];
+
+ // Is it the root node?
+ if (!strlen($path)) {
+ return $this->rootNode;
+ }
+
+ // Attempting to fetch its parent
+ list($parentName, $baseName) = URLUtil::splitPath($path);
+
+ // If there was no parent, we must simply ask it from the root node.
+ if ($parentName==="") {
+ $node = $this->rootNode->getChild($baseName);
+ } else {
+ // Otherwise, we recursively grab the parent and ask him/her.
+ $parent = $this->getNodeForPath($parentName);
+
+ if (!($parent instanceof ICollection))
+ throw new Exception\NotFound('Could not find node at path: ' . $path);
+
+ $node = $parent->getChild($baseName);
+
+ }
+
+ $this->cache[$path] = $node;
+ return $node;
+
+ }
+
+ /**
+ * This function allows you to check if a node exists.
+ *
+ * @param string $path
+ * @return bool
+ */
+ public function nodeExists($path) {
+
+ try {
+
+ // The root always exists
+ if ($path==='') return true;
+
+ list($parent, $base) = URLUtil::splitPath($path);
+
+ $parentNode = $this->getNodeForPath($parent);
+ if (!$parentNode instanceof ICollection) return false;
+ return $parentNode->childExists($base);
+
+ } catch (Exception\NotFound $e) {
+
+ return false;
+
+ }
+
+ }
+
+ /**
+ * Returns a list of childnodes for a given path.
+ *
+ * @param string $path
+ * @return array
+ */
+ public function getChildren($path) {
+
+ $node = $this->getNodeForPath($path);
+ $children = $node->getChildren();
+ foreach($children as $child) {
+
+ $this->cache[trim($path,'/') . '/' . $child->getName()] = $child;
+
+ }
+ return $children;
+
+ }
+
+ /**
+ * This method is called with every tree update
+ *
+ * Examples of tree updates are:
+ * * node deletions
+ * * node creations
+ * * copy
+ * * move
+ * * renaming nodes
+ *
+ * If Tree classes implement a form of caching, this will allow
+ * them to make sure caches will be expired.
+ *
+ * If a path is passed, it is assumed that the entire subtree is dirty
+ *
+ * @param string $path
+ * @return void
+ */
+ public function markDirty($path) {
+
+ // We don't care enough about sub-paths
+ // flushing the entire cache
+ $path = trim($path,'/');
+ foreach($this->cache as $nodePath=>$node) {
+ if ($nodePath == $path || strpos($nodePath,$path.'/')===0)
+ unset($this->cache[$nodePath]);
+
+ }
+
+ }
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/PartialUpdate/IFile.php b/vendor/sabre/dav/lib/Sabre/DAV/PartialUpdate/IFile.php
new file mode 100644
index 000000000..15598a010
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/PartialUpdate/IFile.php
@@ -0,0 +1,40 @@
+<?php
+
+namespace Sabre\DAV\PartialUpdate;
+
+use Sabre\DAV;
+
+/**
+ * This interface provides a way to modify only part of a target resource
+ * It may be used to update a file chunk, upload big a file into smaller
+ * chunks or resume an upload
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Jean-Tiare LE BIGOT (http://www.jtlebi.fr/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+interface IFile extends DAV\IFile {
+
+ /**
+ * Updates the data at a given offset
+ *
+ * The data argument is a readable stream resource.
+ * The offset argument is an integer describing the offset. Contrary to
+ * what's sent in the request, the offset here is a 0-based index.
+ *
+ * After a successful put operation, you may choose to return an ETag. The
+ * etag must always be surrounded by double-quotes. These quotes must
+ * appear in the actual string you're returning.
+ *
+ * Clients may use the ETag from a PUT request to later on make sure that
+ * when they update the file, the contents haven't changed in the mean
+ * time.
+ *
+ * @param resource $data
+ * @param integer $offset
+ * @return string|null
+ */
+ function putRange($data, $offset);
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/PartialUpdate/Plugin.php b/vendor/sabre/dav/lib/Sabre/DAV/PartialUpdate/Plugin.php
new file mode 100644
index 000000000..cc06c8369
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/PartialUpdate/Plugin.php
@@ -0,0 +1,212 @@
+<?php
+
+namespace Sabre\DAV\PartialUpdate;
+
+use Sabre\DAV;
+
+/**
+ * Partial update plugin (Patch method)
+ *
+ * This plugin 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.
+ *
+ * $patchPlugin = new \Sabre\DAV\PartialUpdate\Plugin();
+ * $server->addPlugin($patchPlugin);
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Jean-Tiare LE BIGOT (http://www.jtlebi.fr/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Plugin extends DAV\ServerPlugin {
+
+ /**
+ * Reference to server
+ *
+ * @var Sabre\DAV\Server
+ */
+ protected $server;
+
+ /**
+ * Initializes the plugin
+ *
+ * This method is automatically called by the Server class after addPlugin.
+ *
+ * @param DAV\Server $server
+ * @return void
+ */
+ public function initialize(DAV\Server $server) {
+
+ $this->server = $server;
+ $server->subscribeEvent('unknownMethod',array($this,'unknownMethod'));
+
+ }
+
+ /**
+ * Returns a plugin name.
+ *
+ * Using this name other plugins will be able to access other plugins
+ * using DAV\Server::getPlugin
+ *
+ * @return string
+ */
+ public function getPluginName() {
+
+ return 'partialupdate';
+
+ }
+
+ /**
+ * 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.
+ *
+ * @param string $method
+ * @param string $uri
+ * @return bool|null
+ */
+ public function unknownMethod($method, $uri) {
+
+ switch($method) {
+
+ case 'PATCH':
+ return $this->httpPatch($uri);
+
+ }
+
+ }
+
+ /**
+ * Use this method to tell the server this plugin defines additional
+ * HTTP methods.
+ *
+ * This method is passed a uri. It should only return HTTP methods that are
+ * available for the specified uri.
+ *
+ * We claim to support PATCH method (partial update) if and only if
+ * - the node exist
+ * - the node implements our partial update interface
+ *
+ * @param string $uri
+ * @return array
+ */
+ public function getHTTPMethods($uri) {
+
+ $tree = $this->server->tree;
+
+ if ($tree->nodeExists($uri) &&
+ $tree->getNodeForPath($uri) instanceof IFile) {
+ return array('PATCH');
+ }
+
+ return array();
+
+ }
+
+ /**
+ * Returns a list of features for the HTTP OPTIONS Dav: header.
+ *
+ * @return array
+ */
+ public function getFeatures() {
+
+ return array('sabredav-partialupdate');
+
+ }
+
+ /**
+ * Patch an uri
+ *
+ * The WebDAV patch request can be used to modify only a part of an
+ * existing resource. If the resource does not exist yet and the first
+ * offset is not 0, the request fails
+ *
+ * @param string $uri
+ * @return void
+ */
+ protected function httpPatch($uri) {
+
+ // Get the node. Will throw a 404 if not found
+ $node = $this->server->tree->getNodeForPath($uri);
+ if (!($node instanceof IFile)) {
+ throw new DAV\Exception\MethodNotAllowed('The target resource does not support the PATCH method.');
+ }
+
+ $range = $this->getHTTPUpdateRange();
+
+ if (!$range) {
+ throw new DAV\Exception\BadRequest('No valid "X-Update-Range" found in the headers');
+ }
+
+ $contentType = strtolower(
+ $this->server->httpRequest->getHeader('Content-Type')
+ );
+
+ if ($contentType != 'application/x-sabredav-partialupdate') {
+ throw new DAV\Exception\UnsupportedMediaType('Unknown Content-Type header "' . $contentType . '"');
+ }
+
+ $len = $this->server->httpRequest->getHeader('Content-Length');
+
+ // Load the begin and end data
+ $start = ($range[0])?$range[0]:0;
+ $end = ($range[1])?$range[1]:$len-1;
+
+ // Check consistency
+ if($end < $start)
+ throw new DAV\Exception\RequestedRangeNotSatisfiable('The end offset (' . $range[1] . ') is lower than the start offset (' . $range[0] . ')');
+ if($end - $start + 1 != $len)
+ throw new DAV\Exception\RequestedRangeNotSatisfiable('Actual data length (' . $len . ') is not consistent with begin (' . $range[0] . ') and end (' . $range[1] . ') offsets');
+
+ // Checking If-None-Match and related headers.
+ if (!$this->server->checkPreconditions()) return;
+
+ if (!$this->server->broadcastEvent('beforeWriteContent',array($uri, $node, null)))
+ return;
+
+ $body = $this->server->httpRequest->getBody();
+ $etag = $node->putRange($body, $start-1);
+
+ $this->server->broadcastEvent('afterWriteContent',array($uri, $node));
+
+ $this->server->httpResponse->setHeader('Content-Length','0');
+ if ($etag) $this->server->httpResponse->setHeader('ETag',$etag);
+ $this->server->httpResponse->sendStatus(204);
+
+ return false;
+
+ }
+
+ /**
+ * Returns the HTTP custom range update header
+ *
+ * This method returns null if there is no well-formed HTTP range request
+ * header or array($start, $end).
+ *
+ * The first number is the offset of the first byte in the range.
+ * The second number is the offset of the last byte in the range.
+ *
+ * If the second offset is null, it should be treated as the offset of the last byte of the entity
+ * If the first offset is null, the second offset should be used to retrieve the last x bytes of the entity
+ *
+ * @return array|null
+ */
+ public function getHTTPUpdateRange() {
+
+ $range = $this->server->httpRequest->getHeader('X-Update-Range');
+ if (is_null($range)) return null;
+
+ // Matching "Range: bytes=1234-5678: both numbers are optional
+
+ if (!preg_match('/^bytes=([0-9]*)-([0-9]*)$/i',$range,$matches)) return null;
+
+ if ($matches[1]==='' && $matches[2]==='') return null;
+
+ return array(
+ $matches[1]!==''?$matches[1]:null,
+ $matches[2]!==''?$matches[2]:null,
+ );
+
+ }
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Property.php b/vendor/sabre/dav/lib/Sabre/DAV/Property.php
new file mode 100644
index 000000000..00f0df3fe
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Property.php
@@ -0,0 +1,31 @@
+<?php
+
+namespace Sabre\DAV;
+
+/**
+ * Abstract property class
+ *
+ * Extend this class to create custom complex properties
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+abstract class Property implements PropertyInterface {
+
+ /**
+ * Unserializes the property.
+ *
+ * This static method should return a an instance of this object.
+ *
+ * @param \DOMElement $prop
+ * @return DAV\IProperty
+ */
+ static function unserialize(\DOMElement $prop) {
+
+ throw new Exception('Unserialize has not been implemented for this class');
+
+ }
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Property/GetLastModified.php b/vendor/sabre/dav/lib/Sabre/DAV/Property/GetLastModified.php
new file mode 100644
index 000000000..9240f55cc
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Property/GetLastModified.php
@@ -0,0 +1,78 @@
+<?php
+
+namespace Sabre\DAV\Property;
+
+use Sabre\DAV;
+use Sabre\HTTP;
+
+/**
+ * This property represents the {DAV:}getlastmodified property.
+ *
+ * Although this is normally a simple property, windows requires us to add
+ * some new attributes.
+ *
+ * This class uses unix timestamps internally, and converts them to RFC 1123 times for
+ * serialization
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class GetLastModified extends DAV\Property {
+
+ /**
+ * time
+ *
+ * @var int
+ */
+ public $time;
+
+ /**
+ * __construct
+ *
+ * @param int|DateTime $time
+ */
+ public function __construct($time) {
+
+ if ($time instanceof \DateTime) {
+ $this->time = $time;
+ } elseif (is_int($time) || ctype_digit($time)) {
+ $this->time = new \DateTime('@' . $time);
+ } else {
+ $this->time = new \DateTime($time);
+ }
+
+ // Setting timezone to UTC
+ $this->time->setTimezone(new \DateTimeZone('UTC'));
+
+ }
+
+ /**
+ * serialize
+ *
+ * @param DAV\Server $server
+ * @param \DOMElement $prop
+ * @return void
+ */
+ public function serialize(DAV\Server $server, \DOMElement $prop) {
+
+ $doc = $prop->ownerDocument;
+ //$prop->setAttribute('xmlns:b','urn:uuid:c2f41010-65b3-11d1-a29f-00aa00c14882/');
+ //$prop->setAttribute('b:dt','dateTime.rfc1123');
+ $prop->nodeValue = HTTP\Util::toHTTPDate($this->time);
+
+ }
+
+ /**
+ * getTime
+ *
+ * @return \DateTime
+ */
+ public function getTime() {
+
+ return $this->time;
+
+ }
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Property/Href.php b/vendor/sabre/dav/lib/Sabre/DAV/Property/Href.php
new file mode 100644
index 000000000..ac198c723
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Property/Href.php
@@ -0,0 +1,99 @@
+<?php
+
+namespace Sabre\DAV\Property;
+
+use Sabre\DAV;
+
+/**
+ * Href property
+ *
+ * The href property represents a url within a {DAV:}href element.
+ * This is used by many WebDAV extensions, but not really within the WebDAV core spec
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Href extends DAV\Property implements IHref {
+
+ /**
+ * href
+ *
+ * @var string
+ */
+ private $href;
+
+ /**
+ * Automatically prefix the url with the server base directory
+ *
+ * @var bool
+ */
+ private $autoPrefix = true;
+
+ /**
+ * __construct
+ *
+ * @param string $href
+ * @param bool $autoPrefix
+ */
+ public function __construct($href, $autoPrefix = true) {
+
+ $this->href = $href;
+ $this->autoPrefix = $autoPrefix;
+
+ }
+
+ /**
+ * Returns the uri
+ *
+ * @return string
+ */
+ public function getHref() {
+
+ return $this->href;
+
+ }
+
+ /**
+ * Serializes this property.
+ *
+ * It will additionally prepend the href property with the server's base uri.
+ *
+ * @param DAV\Server $server
+ * @param \DOMElement $dom
+ * @return void
+ */
+ public function serialize(DAV\Server $server, \DOMElement $dom) {
+
+ $prefix = $server->xmlNamespaces['DAV:'];
+ $elem = $dom->ownerDocument->createElement($prefix . ':href');
+
+ if ($this->autoPrefix) {
+ $value = $server->getBaseUri() . DAV\URLUtil::encodePath($this->href);
+ } else {
+ $value = $this->href;
+ }
+ $elem->appendChild($dom->ownerDocument->createTextNode($value));
+
+ $dom->appendChild($elem);
+
+ }
+
+ /**
+ * Unserializes this property from a DOM Element
+ *
+ * This method returns an instance of this class.
+ * It will only decode {DAV:}href values. For non-compatible elements null will be returned.
+ *
+ * @param \DOMElement $dom
+ * @return DAV\Property\Href
+ */
+ static function unserialize(\DOMElement $dom) {
+
+ if ($dom->firstChild && DAV\XMLUtil::toClarkNotation($dom->firstChild)==='{DAV:}href') {
+ return new self($dom->firstChild->textContent,false);
+ }
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Property/HrefList.php b/vendor/sabre/dav/lib/Sabre/DAV/Property/HrefList.php
new file mode 100644
index 000000000..3eab755ca
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Property/HrefList.php
@@ -0,0 +1,105 @@
+<?php
+
+namespace Sabre\DAV\Property;
+
+use Sabre\DAV;
+
+/**
+ * HrefList property
+ *
+ * This property contains multiple {DAV:}href elements, each containing a url.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class HrefList extends DAV\Property {
+
+ /**
+ * hrefs
+ *
+ * @var array
+ */
+ private $hrefs;
+
+ /**
+ * Automatically prefix the url with the server base directory
+ *
+ * @var bool
+ */
+ private $autoPrefix = true;
+
+ /**
+ * __construct
+ *
+ * @param array $hrefs
+ * @param bool $autoPrefix
+ */
+ public function __construct(array $hrefs, $autoPrefix = true) {
+
+ $this->hrefs = $hrefs;
+ $this->autoPrefix = $autoPrefix;
+
+ }
+
+ /**
+ * Returns the uris
+ *
+ * @return array
+ */
+ public function getHrefs() {
+
+ return $this->hrefs;
+
+ }
+
+ /**
+ * Serializes this property.
+ *
+ * It will additionally prepend the href property with the server's base uri.
+ *
+ * @param DAV\Server $server
+ * @param \DOMElement $dom
+ * @return void
+ */
+ public function serialize(DAV\Server $server,\DOMElement $dom) {
+
+ $prefix = $server->xmlNamespaces['DAV:'];
+
+ foreach($this->hrefs as $href) {
+
+ $elem = $dom->ownerDocument->createElement($prefix . ':href');
+ if ($this->autoPrefix) {
+ $value = $server->getBaseUri() . DAV\URLUtil::encodePath($href);
+ } else {
+ $value = $href;
+ }
+ $elem->appendChild($dom->ownerDocument->createTextNode($value));
+
+ $dom->appendChild($elem);
+ }
+
+ }
+
+ /**
+ * Unserializes this property from a DOM Element
+ *
+ * This method returns an instance of this class.
+ * It will only decode {DAV:}href values.
+ *
+ * @param \DOMElement $dom
+ * @return DAV\Property\HrefList
+ */
+ static function unserialize(\DOMElement $dom) {
+
+ $hrefs = array();
+ foreach($dom->childNodes as $child) {
+ if (DAV\XMLUtil::toClarkNotation($child)==='{DAV:}href') {
+ $hrefs[] = $child->textContent;
+ }
+ }
+ return new self($hrefs, false);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Property/IHref.php b/vendor/sabre/dav/lib/Sabre/DAV/Property/IHref.php
new file mode 100644
index 000000000..a4ae09b3f
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Property/IHref.php
@@ -0,0 +1,25 @@
+<?php
+
+namespace Sabre\DAV\Property;
+
+/**
+ * IHref interface
+ *
+ * Any property implementing this interface can expose a related url.
+ * This is used by certain subsystems to aquire more information about for example
+ * the owner of a file
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+interface IHref {
+
+ /**
+ * getHref
+ *
+ * @return string
+ */
+ function getHref();
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Property/LockDiscovery.php b/vendor/sabre/dav/lib/Sabre/DAV/Property/LockDiscovery.php
new file mode 100644
index 000000000..3b36ca6a7
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Property/LockDiscovery.php
@@ -0,0 +1,104 @@
+<?php
+
+namespace Sabre\DAV\Property;
+
+use Sabre\DAV;
+
+/**
+ * Represents {DAV:}lockdiscovery property
+ *
+ * This property contains all the open locks on a given resource
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class LockDiscovery extends DAV\Property {
+
+ /**
+ * locks
+ *
+ * @var array
+ */
+ public $locks;
+
+ /**
+ * Should we show the locktoken as well?
+ *
+ * @var bool
+ */
+ public $revealLockToken;
+
+ /**
+ * Hides the {DAV:}lockroot element from the response.
+ *
+ * It was reported that showing the lockroot in the response can break
+ * Office 2000 compatibility.
+ */
+ static public $hideLockRoot = false;
+
+ /**
+ * __construct
+ *
+ * @param array $locks
+ * @param bool $revealLockToken
+ */
+ public function __construct($locks, $revealLockToken = false) {
+
+ $this->locks = $locks;
+ $this->revealLockToken = $revealLockToken;
+
+ }
+
+ /**
+ * serialize
+ *
+ * @param DAV\Server $server
+ * @param \DOMElement $prop
+ * @return void
+ */
+ public function serialize(DAV\Server $server, \DOMElement $prop) {
+
+ $doc = $prop->ownerDocument;
+
+ foreach($this->locks as $lock) {
+
+ $activeLock = $doc->createElementNS('DAV:','d:activelock');
+ $prop->appendChild($activeLock);
+
+ $lockScope = $doc->createElementNS('DAV:','d:lockscope');
+ $activeLock->appendChild($lockScope);
+
+ $lockScope->appendChild($doc->createElementNS('DAV:','d:' . ($lock->scope==DAV\Locks\LockInfo::EXCLUSIVE?'exclusive':'shared')));
+
+ $lockType = $doc->createElementNS('DAV:','d:locktype');
+ $activeLock->appendChild($lockType);
+
+ $lockType->appendChild($doc->createElementNS('DAV:','d:write'));
+
+ /* {DAV:}lockroot */
+ if (!self::$hideLockRoot) {
+ $lockRoot = $doc->createElementNS('DAV:','d:lockroot');
+ $activeLock->appendChild($lockRoot);
+ $href = $doc->createElementNS('DAV:','d:href');
+ $href->appendChild($doc->createTextNode($server->getBaseUri() . $lock->uri));
+ $lockRoot->appendChild($href);
+ }
+
+ $activeLock->appendChild($doc->createElementNS('DAV:','d:depth',($lock->depth == DAV\Server::DEPTH_INFINITY?'infinity':$lock->depth)));
+ $activeLock->appendChild($doc->createElementNS('DAV:','d:timeout','Second-' . $lock->timeout));
+
+ if ($this->revealLockToken) {
+ $lockToken = $doc->createElementNS('DAV:','d:locktoken');
+ $activeLock->appendChild($lockToken);
+ $lockToken->appendChild($doc->createElementNS('DAV:','d:href','opaquelocktoken:' . $lock->token));
+ }
+
+ $activeLock->appendChild($doc->createElementNS('DAV:','d:owner',$lock->owner));
+
+ }
+
+ }
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Property/ResourceType.php b/vendor/sabre/dav/lib/Sabre/DAV/Property/ResourceType.php
new file mode 100644
index 000000000..9582d5598
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Property/ResourceType.php
@@ -0,0 +1,127 @@
+<?php
+
+namespace Sabre\DAV\Property;
+
+use Sabre\DAV;
+
+/**
+ * This class represents the {DAV:}resourcetype property
+ *
+ * Normally for files this is empty, and for collection {DAV:}collection.
+ * However, other specs define different values for this.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class ResourceType extends DAV\Property {
+
+ /**
+ * resourceType
+ *
+ * @var array
+ */
+ public $resourceType = array();
+
+ /**
+ * __construct
+ *
+ * @param mixed $resourceType
+ */
+ public function __construct($resourceType = array()) {
+
+ if ($resourceType === DAV\Server::NODE_FILE)
+ $this->resourceType = array();
+ elseif ($resourceType === DAV\Server::NODE_DIRECTORY)
+ $this->resourceType = array('{DAV:}collection');
+ elseif (is_array($resourceType))
+ $this->resourceType = $resourceType;
+ else
+ $this->resourceType = array($resourceType);
+
+ }
+
+ /**
+ * serialize
+ *
+ * @param DAV\Server $server
+ * @param \DOMElement $prop
+ * @return void
+ */
+ public function serialize(DAV\Server $server, \DOMElement $prop) {
+
+ $propName = null;
+ $rt = $this->resourceType;
+
+ foreach($rt as $resourceType) {
+ if (preg_match('/^{([^}]*)}(.*)$/',$resourceType,$propName)) {
+
+ if (isset($server->xmlNamespaces[$propName[1]])) {
+ $prop->appendChild($prop->ownerDocument->createElement($server->xmlNamespaces[$propName[1]] . ':' . $propName[2]));
+ } else {
+ $prop->appendChild($prop->ownerDocument->createElementNS($propName[1],'custom:' . $propName[2]));
+ }
+
+ }
+ }
+
+ }
+
+ /**
+ * Returns the values in clark-notation
+ *
+ * For example array('{DAV:}collection')
+ *
+ * @return array
+ */
+ public function getValue() {
+
+ return $this->resourceType;
+
+ }
+
+ /**
+ * Checks if the principal contains a certain value
+ *
+ * @param string $type
+ * @return bool
+ */
+ public function is($type) {
+
+ return in_array($type, $this->resourceType);
+
+ }
+
+ /**
+ * Adds a resourcetype value to this property
+ *
+ * @param string $type
+ * @return void
+ */
+ public function add($type) {
+
+ $this->resourceType[] = $type;
+ $this->resourceType = array_unique($this->resourceType);
+
+ }
+
+ /**
+ * Unserializes a DOM element into a ResourceType property.
+ *
+ * @param \DOMElement $dom
+ * @return DAV\Property\ResourceType
+ */
+ static public function unserialize(\DOMElement $dom) {
+
+ $value = array();
+ foreach($dom->childNodes as $child) {
+
+ $value[] = DAV\XMLUtil::toClarkNotation($child);
+
+ }
+
+ return new self($value);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Property/Response.php b/vendor/sabre/dav/lib/Sabre/DAV/Property/Response.php
new file mode 100644
index 000000000..58e90d89d
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Property/Response.php
@@ -0,0 +1,157 @@
+<?php
+
+namespace Sabre\DAV\Property;
+
+use Sabre\DAV;
+
+/**
+ * Response property
+ *
+ * This class represents the {DAV:}response XML element.
+ * This is used by the Server class to encode individual items within a multistatus
+ * response.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Response extends DAV\Property implements IHref {
+
+ /**
+ * Url for the response
+ *
+ * @var string
+ */
+ private $href;
+
+ /**
+ * Propertylist, ordered by HTTP status code
+ *
+ * @var array
+ */
+ private $responseProperties;
+
+ /**
+ * The responseProperties argument is a list of properties
+ * within an array with keys representing HTTP status codes
+ *
+ * @param string $href
+ * @param array $responseProperties
+ */
+ public function __construct($href, array $responseProperties) {
+
+ $this->href = $href;
+ $this->responseProperties = $responseProperties;
+
+ }
+
+ /**
+ * Returns the url
+ *
+ * @return string
+ */
+ public function getHref() {
+
+ return $this->href;
+
+ }
+
+ /**
+ * Returns the property list
+ *
+ * @return array
+ */
+ public function getResponseProperties() {
+
+ return $this->responseProperties;
+
+ }
+
+ /**
+ * serialize
+ *
+ * @param DAV\Server $server
+ * @param \DOMElement $dom
+ * @return void
+ */
+ public function serialize(DAV\Server $server, \DOMElement $dom) {
+
+ $document = $dom->ownerDocument;
+ $properties = $this->responseProperties;
+
+ $xresponse = $document->createElement('d:response');
+ $dom->appendChild($xresponse);
+
+ $uri = DAV\URLUtil::encodePath($this->href);
+
+ // Adding the baseurl to the beginning of the url
+ $uri = $server->getBaseUri() . $uri;
+
+ $xresponse->appendChild($document->createElement('d:href',$uri));
+
+ // The properties variable is an array containing properties, grouped by
+ // HTTP status
+ foreach($properties as $httpStatus=>$propertyGroup) {
+
+ // The 'href' is also in this array, and it's special cased.
+ // We will ignore it
+ if ($httpStatus=='href') continue;
+
+ // If there are no properties in this group, we can also just carry on
+ if (!count($propertyGroup)) continue;
+
+ $xpropstat = $document->createElement('d:propstat');
+ $xresponse->appendChild($xpropstat);
+
+ $xprop = $document->createElement('d:prop');
+ $xpropstat->appendChild($xprop);
+
+ $nsList = $server->xmlNamespaces;
+
+ foreach($propertyGroup as $propertyName=>$propertyValue) {
+
+ $propName = null;
+ preg_match('/^{([^}]*)}(.*)$/',$propertyName,$propName);
+
+ // special case for empty namespaces
+ if ($propName[1]=='') {
+
+ $currentProperty = $document->createElement($propName[2]);
+ $xprop->appendChild($currentProperty);
+ $currentProperty->setAttribute('xmlns','');
+
+ } else {
+
+ if (!isset($nsList[$propName[1]])) {
+ $nsList[$propName[1]] = 'x' . count($nsList);
+ }
+
+ // If the namespace was defined in the top-level xml namespaces, it means
+ // there was already a namespace declaration, and we don't have to worry about it.
+ if (isset($server->xmlNamespaces[$propName[1]])) {
+ $currentProperty = $document->createElement($nsList[$propName[1]] . ':' . $propName[2]);
+ } else {
+ $currentProperty = $document->createElementNS($propName[1],$nsList[$propName[1]].':' . $propName[2]);
+ }
+ $xprop->appendChild($currentProperty);
+
+ }
+
+ if (is_scalar($propertyValue)) {
+ $text = $document->createTextNode($propertyValue);
+ $currentProperty->appendChild($text);
+ } elseif ($propertyValue instanceof DAV\PropertyInterface) {
+ $propertyValue->serialize($server,$currentProperty);
+ } elseif (!is_null($propertyValue)) {
+ throw new DAV\Exception('Unknown property value type: ' . gettype($propertyValue) . ' for property: ' . $propertyName);
+ }
+
+ }
+
+ $xpropstat->appendChild($document->createElement('d:status',$server->httpResponse->getStatusMessage($httpStatus)));
+
+ }
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Property/ResponseList.php b/vendor/sabre/dav/lib/Sabre/DAV/Property/ResponseList.php
new file mode 100644
index 000000000..b605a4e9a
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Property/ResponseList.php
@@ -0,0 +1,59 @@
+<?php
+
+namespace Sabre\DAV\Property;
+
+use Sabre\DAV;
+
+/**
+ * ResponseList property
+ *
+ * This class represents multiple {DAV:}response XML elements.
+ * This is used by the Server class to encode items within a multistatus
+ * response.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class ResponseList extends DAV\Property {
+
+ /**
+ * Response objects.
+ *
+ * @var array
+ */
+ private $responses;
+
+ /**
+ * The only valid argument is a list of Sabre\DAV\Property\Response
+ * objects.
+ *
+ * @param array $responses;
+ */
+ public function __construct($responses) {
+
+ foreach($responses as $response) {
+ if (!($response instanceof Response)) {
+ throw new \InvalidArgumentException('You must pass an array of Sabre\DAV\Property\Response objects');
+ }
+ }
+ $this->responses = $responses;
+
+ }
+
+ /**
+ * serialize
+ *
+ * @param DAV\Server $server
+ * @param \DOMElement $dom
+ * @return void
+ */
+ public function serialize(DAV\Server $server,\DOMElement $dom) {
+
+ foreach($this->responses as $response) {
+ $response->serialize($server, $dom);
+ }
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Property/SupportedLock.php b/vendor/sabre/dav/lib/Sabre/DAV/Property/SupportedLock.php
new file mode 100644
index 000000000..e6f477c38
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Property/SupportedLock.php
@@ -0,0 +1,78 @@
+<?php
+
+namespace Sabre\DAV\Property;
+
+use Sabre\DAV;
+
+/**
+ * This class represents the {DAV:}supportedlock property
+ *
+ * This property contains information about what kind of locks
+ * this server supports.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class SupportedLock extends DAV\Property {
+
+ /**
+ * supportsLocks
+ *
+ * @var mixed
+ */
+ public $supportsLocks = false;
+
+ /**
+ * __construct
+ *
+ * @param mixed $supportsLocks
+ */
+ public function __construct($supportsLocks) {
+
+ $this->supportsLocks = $supportsLocks;
+
+ }
+
+ /**
+ * serialize
+ *
+ * @param DAV\Server $server
+ * @param \DOMElement $prop
+ * @return void
+ */
+ public function serialize(DAV\Server $server,\DOMElement $prop) {
+
+ $doc = $prop->ownerDocument;
+
+ if (!$this->supportsLocks) return null;
+
+ $lockEntry1 = $doc->createElement('d:lockentry');
+ $lockEntry2 = $doc->createElement('d:lockentry');
+
+ $prop->appendChild($lockEntry1);
+ $prop->appendChild($lockEntry2);
+
+ $lockScope1 = $doc->createElement('d:lockscope');
+ $lockScope2 = $doc->createElement('d:lockscope');
+ $lockType1 = $doc->createElement('d:locktype');
+ $lockType2 = $doc->createElement('d:locktype');
+
+ $lockEntry1->appendChild($lockScope1);
+ $lockEntry1->appendChild($lockType1);
+ $lockEntry2->appendChild($lockScope2);
+ $lockEntry2->appendChild($lockType2);
+
+ $lockScope1->appendChild($doc->createElement('d:exclusive'));
+ $lockScope2->appendChild($doc->createElement('d:shared'));
+
+ $lockType1->appendChild($doc->createElement('d:write'));
+ $lockType2->appendChild($doc->createElement('d:write'));
+
+ //$frag->appendXML('<d:lockentry><d:lockscope><d:exclusive /></d:lockscope><d:locktype><d:write /></d:locktype></d:lockentry>');
+ //$frag->appendXML('<d:lockentry><d:lockscope><d:shared /></d:lockscope><d:locktype><d:write /></d:locktype></d:lockentry>');
+
+ }
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Property/SupportedReportSet.php b/vendor/sabre/dav/lib/Sabre/DAV/Property/SupportedReportSet.php
new file mode 100644
index 000000000..993105b8a
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Property/SupportedReportSet.php
@@ -0,0 +1,111 @@
+<?php
+
+namespace Sabre\DAV\Property;
+
+use Sabre\DAV;
+
+/**
+ * supported-report-set property.
+ *
+ * This property is defined in RFC3253, but since it's
+ * so common in other webdav-related specs, it is part of the core server.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class SupportedReportSet extends DAV\Property {
+
+ /**
+ * List of reports
+ *
+ * @var array
+ */
+ protected $reports = array();
+
+ /**
+ * Creates the property
+ *
+ * Any reports passed in the constructor
+ * should be valid report-types in clark-notation.
+ *
+ * Either a string or an array of strings must be passed.
+ *
+ * @param mixed $reports
+ */
+ public function __construct($reports = null) {
+
+ if (!is_null($reports))
+ $this->addReport($reports);
+
+ }
+
+ /**
+ * Adds a report to this property
+ *
+ * The report must be a string in clark-notation.
+ * Multiple reports can be specified as an array.
+ *
+ * @param mixed $report
+ * @return void
+ */
+ public function addReport($report) {
+
+ if (!is_array($report)) $report = array($report);
+
+ foreach($report as $r) {
+
+ if (!preg_match('/^{([^}]*)}(.*)$/',$r))
+ throw new DAV\Exception('Reportname must be in clark-notation');
+
+ $this->reports[] = $r;
+
+ }
+
+ }
+
+ /**
+ * Returns the list of supported reports
+ *
+ * @return array
+ */
+ public function getValue() {
+
+ return $this->reports;
+
+ }
+
+ /**
+ * Serializes the node
+ *
+ * @param DAV\Server $server
+ * @param \DOMElement $prop
+ * @return void
+ */
+ public function serialize(DAV\Server $server, \DOMElement $prop) {
+
+ foreach($this->reports as $reportName) {
+
+ $supportedReport = $prop->ownerDocument->createElement('d:supported-report');
+ $prop->appendChild($supportedReport);
+
+ $report = $prop->ownerDocument->createElement('d:report');
+ $supportedReport->appendChild($report);
+
+ preg_match('/^{([^}]*)}(.*)$/',$reportName,$matches);
+
+ list(, $namespace, $element) = $matches;
+
+ $prefix = isset($server->xmlNamespaces[$namespace])?$server->xmlNamespaces[$namespace]:null;
+
+ if ($prefix) {
+ $report->appendChild($prop->ownerDocument->createElement($prefix . ':' . $element));
+ } else {
+ $report->appendChild($prop->ownerDocument->createElementNS($namespace, 'x:' . $element));
+ }
+
+ }
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/PropertyInterface.php b/vendor/sabre/dav/lib/Sabre/DAV/PropertyInterface.php
new file mode 100644
index 000000000..856e643f3
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/PropertyInterface.php
@@ -0,0 +1,21 @@
+<?php
+
+namespace Sabre\DAV;
+
+/**
+ * PropertyInterface
+ *
+ * Implement this interface to create new complex properties
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+interface PropertyInterface {
+
+ public function serialize(Server $server, \DOMElement $prop);
+
+ static function unserialize(\DOMElement $prop);
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Server.php b/vendor/sabre/dav/lib/Sabre/DAV/Server.php
new file mode 100644
index 000000000..11ac642d6
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Server.php
@@ -0,0 +1,2175 @@
+<?php
+
+namespace Sabre\DAV;
+use Sabre\HTTP;
+
+/**
+ * Main DAV server class
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Server {
+
+ /**
+ * Infinity is used for some request supporting the HTTP Depth header and indicates that the operation should traverse the entire tree
+ */
+ const DEPTH_INFINITY = -1;
+
+ /**
+ * Nodes that are files, should have this as the type property
+ */
+ const NODE_FILE = 1;
+
+ /**
+ * Nodes that are directories, should use this value as the type property
+ */
+ const NODE_DIRECTORY = 2;
+
+ /**
+ * XML namespace for all SabreDAV related elements
+ */
+ const NS_SABREDAV = 'http://sabredav.org/ns';
+
+ /**
+ * The tree object
+ *
+ * @var Sabre\DAV\Tree
+ */
+ public $tree;
+
+ /**
+ * The base uri
+ *
+ * @var string
+ */
+ protected $baseUri = null;
+
+ /**
+ * httpResponse
+ *
+ * @var Sabre\HTTP\Response
+ */
+ public $httpResponse;
+
+ /**
+ * httpRequest
+ *
+ * @var Sabre\HTTP\Request
+ */
+ public $httpRequest;
+
+ /**
+ * The list of plugins
+ *
+ * @var array
+ */
+ protected $plugins = array();
+
+ /**
+ * This array contains a list of callbacks we should call when certain events are triggered
+ *
+ * @var array
+ */
+ protected $eventSubscriptions = array();
+
+ /**
+ * This is a default list of namespaces.
+ *
+ * If you are defining your own custom namespace, add it here to reduce
+ * bandwidth and improve legibility of xml bodies.
+ *
+ * @var array
+ */
+ public $xmlNamespaces = array(
+ 'DAV:' => 'd',
+ 'http://sabredav.org/ns' => 's',
+ );
+
+ /**
+ * The propertymap can be used to map properties from
+ * requests to property classes.
+ *
+ * @var array
+ */
+ public $propertyMap = array(
+ '{DAV:}resourcetype' => 'Sabre\\DAV\\Property\\ResourceType',
+ );
+
+ public $protectedProperties = array(
+ // RFC4918
+ '{DAV:}getcontentlength',
+ '{DAV:}getetag',
+ '{DAV:}getlastmodified',
+ '{DAV:}lockdiscovery',
+ '{DAV:}supportedlock',
+
+ // RFC4331
+ '{DAV:}quota-available-bytes',
+ '{DAV:}quota-used-bytes',
+
+ // RFC3744
+ '{DAV:}supported-privilege-set',
+ '{DAV:}current-user-privilege-set',
+ '{DAV:}acl',
+ '{DAV:}acl-restrictions',
+ '{DAV:}inherited-acl-set',
+
+ );
+
+ /**
+ * This is a flag that allow or not showing file, line and code
+ * of the exception in the returned XML
+ *
+ * @var bool
+ */
+ public $debugExceptions = false;
+
+ /**
+ * This property allows you to automatically add the 'resourcetype' value
+ * based on a node's classname or interface.
+ *
+ * The preset ensures that {DAV:}collection is automaticlly added for nodes
+ * implementing Sabre\DAV\ICollection.
+ *
+ * @var array
+ */
+ public $resourceTypeMapping = array(
+ 'Sabre\\DAV\\ICollection' => '{DAV:}collection',
+ );
+
+ /**
+ * If this setting is turned off, SabreDAV's version number will be hidden
+ * from various places.
+ *
+ * Some people feel this is a good security measure.
+ *
+ * @var bool
+ */
+ static public $exposeVersion = true;
+
+ /**
+ * Sets up the server
+ *
+ * If a Sabre\DAV\Tree object is passed as an argument, it will
+ * use it as the directory tree. If a Sabre\DAV\INode is passed, it
+ * will create a Sabre\DAV\ObjectTree and use the node as the root.
+ *
+ * If nothing is passed, a Sabre\DAV\SimpleCollection is created in
+ * a Sabre\DAV\ObjectTree.
+ *
+ * If an array is passed, we automatically create a root node, and use
+ * the nodes in the array as top-level children.
+ *
+ * @param Tree|INode|array|null $treeOrNode The tree object
+ */
+ public function __construct($treeOrNode = null) {
+
+ if ($treeOrNode instanceof Tree) {
+ $this->tree = $treeOrNode;
+ } elseif ($treeOrNode instanceof INode) {
+ $this->tree = new ObjectTree($treeOrNode);
+ } elseif (is_array($treeOrNode)) {
+
+ // If it's an array, a list of nodes was passed, and we need to
+ // create the root node.
+ foreach($treeOrNode as $node) {
+ if (!($node instanceof INode)) {
+ throw new Exception('Invalid argument passed to constructor. If you\'re passing an array, all the values must implement Sabre\\DAV\\INode');
+ }
+ }
+
+ $root = new SimpleCollection('root', $treeOrNode);
+ $this->tree = new ObjectTree($root);
+
+ } elseif (is_null($treeOrNode)) {
+ $root = new SimpleCollection('root');
+ $this->tree = new ObjectTree($root);
+ } else {
+ throw new Exception('Invalid argument passed to constructor. Argument must either be an instance of Sabre\\DAV\\Tree, Sabre\\DAV\\INode, an array or null');
+ }
+ $this->httpResponse = new HTTP\Response();
+ $this->httpRequest = new HTTP\Request();
+
+ }
+
+ /**
+ * Starts the DAV Server
+ *
+ * @return void
+ */
+ public function exec() {
+
+ try {
+
+ // If nginx (pre-1.2) is used as a proxy server, and SabreDAV as an
+ // origin, we must make sure we send back HTTP/1.0 if this was
+ // requested.
+ // This is mainly because nginx doesn't support Chunked Transfer
+ // Encoding, and this forces the webserver SabreDAV is running on,
+ // to buffer entire responses to calculate Content-Length.
+ $this->httpResponse->defaultHttpVersion = $this->httpRequest->getHTTPVersion();
+
+ $this->invokeMethod($this->httpRequest->getMethod(), $this->getRequestUri());
+
+ } catch (Exception $e) {
+
+ try {
+ $this->broadcastEvent('exception', array($e));
+ } catch (Exception $ignore) {
+ }
+ $DOM = new \DOMDocument('1.0','utf-8');
+ $DOM->formatOutput = true;
+
+ $error = $DOM->createElementNS('DAV:','d:error');
+ $error->setAttribute('xmlns:s',self::NS_SABREDAV);
+ $DOM->appendChild($error);
+
+ $h = function($v) {
+
+ return htmlspecialchars($v, ENT_NOQUOTES, 'UTF-8');
+
+ };
+
+ $error->appendChild($DOM->createElement('s:exception',$h(get_class($e))));
+ $error->appendChild($DOM->createElement('s:message',$h($e->getMessage())));
+ if ($this->debugExceptions) {
+ $error->appendChild($DOM->createElement('s:file',$h($e->getFile())));
+ $error->appendChild($DOM->createElement('s:line',$h($e->getLine())));
+ $error->appendChild($DOM->createElement('s:code',$h($e->getCode())));
+ $error->appendChild($DOM->createElement('s:stacktrace',$h($e->getTraceAsString())));
+
+ }
+ if (self::$exposeVersion) {
+ $error->appendChild($DOM->createElement('s:sabredav-version',$h(Version::VERSION)));
+ }
+
+ if($e instanceof Exception) {
+
+ $httpCode = $e->getHTTPCode();
+ $e->serialize($this,$error);
+ $headers = $e->getHTTPHeaders($this);
+
+ } else {
+
+ $httpCode = 500;
+ $headers = array();
+
+ }
+ $headers['Content-Type'] = 'application/xml; charset=utf-8';
+
+ $this->httpResponse->sendStatus($httpCode);
+ $this->httpResponse->setHeaders($headers);
+ $this->httpResponse->sendBody($DOM->saveXML());
+
+ }
+
+ }
+
+ /**
+ * Sets the base server uri
+ *
+ * @param string $uri
+ * @return void
+ */
+ public function setBaseUri($uri) {
+
+ // If the baseUri does not end with a slash, we must add it
+ if ($uri[strlen($uri)-1]!=='/')
+ $uri.='/';
+
+ $this->baseUri = $uri;
+
+ }
+
+ /**
+ * Returns the base responding uri
+ *
+ * @return string
+ */
+ public function getBaseUri() {
+
+ if (is_null($this->baseUri)) $this->baseUri = $this->guessBaseUri();
+ return $this->baseUri;
+
+ }
+
+ /**
+ * This method attempts to detect the base uri.
+ * Only the PATH_INFO variable is considered.
+ *
+ * If this variable is not set, the root (/) is assumed.
+ *
+ * @return string
+ */
+ public function guessBaseUri() {
+
+ $pathInfo = $this->httpRequest->getRawServerValue('PATH_INFO');
+ $uri = $this->httpRequest->getRawServerValue('REQUEST_URI');
+
+ // If PATH_INFO is found, we can assume it's accurate.
+ if (!empty($pathInfo)) {
+
+ // We need to make sure we ignore the QUERY_STRING part
+ if ($pos = strpos($uri,'?'))
+ $uri = substr($uri,0,$pos);
+
+ // PATH_INFO is only set for urls, such as: /example.php/path
+ // in that case PATH_INFO contains '/path'.
+ // Note that REQUEST_URI is percent encoded, while PATH_INFO is
+ // not, Therefore they are only comparable if we first decode
+ // REQUEST_INFO as well.
+ $decodedUri = URLUtil::decodePath($uri);
+
+ // A simple sanity check:
+ if(substr($decodedUri,strlen($decodedUri)-strlen($pathInfo))===$pathInfo) {
+ $baseUri = substr($decodedUri,0,strlen($decodedUri)-strlen($pathInfo));
+ return rtrim($baseUri,'/') . '/';
+ }
+
+ throw new Exception('The REQUEST_URI ('. $uri . ') did not end with the contents of PATH_INFO (' . $pathInfo . '). This server might be misconfigured.');
+
+ }
+
+ // The last fallback is that we're just going to assume the server root.
+ return '/';
+
+ }
+
+ /**
+ * Adds a plugin to the server
+ *
+ * For more information, console the documentation of Sabre\DAV\ServerPlugin
+ *
+ * @param ServerPlugin $plugin
+ * @return void
+ */
+ public function addPlugin(ServerPlugin $plugin) {
+
+ $this->plugins[$plugin->getPluginName()] = $plugin;
+ $plugin->initialize($this);
+
+ }
+
+ /**
+ * Returns an initialized plugin by it's name.
+ *
+ * This function returns null if the plugin was not found.
+ *
+ * @param string $name
+ * @return ServerPlugin
+ */
+ public function getPlugin($name) {
+
+ if (isset($this->plugins[$name]))
+ return $this->plugins[$name];
+
+ // This is a fallback and deprecated.
+ foreach($this->plugins as $plugin) {
+ if (get_class($plugin)===$name) return $plugin;
+ }
+
+ return null;
+
+ }
+
+ /**
+ * Returns all plugins
+ *
+ * @return array
+ */
+ public function getPlugins() {
+
+ return $this->plugins;
+
+ }
+
+
+ /**
+ * Subscribe to an event.
+ *
+ * When the event is triggered, we'll call all the specified callbacks.
+ * 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
+ * is triggered before anything else. If it's not needed to change this
+ * number, it is recommended to ommit.
+ *
+ * @param string $event
+ * @param callback $callback
+ * @param int $priority
+ * @return void
+ */
+ public function subscribeEvent($event, $callback, $priority = 100) {
+
+ if (!isset($this->eventSubscriptions[$event])) {
+ $this->eventSubscriptions[$event] = array();
+ }
+ while(isset($this->eventSubscriptions[$event][$priority])) $priority++;
+ $this->eventSubscriptions[$event][$priority] = $callback;
+ ksort($this->eventSubscriptions[$event]);
+
+ }
+
+ /**
+ * Broadcasts an event
+ *
+ * This method will call all subscribers. If one of the subscribers returns false, the process stops.
+ *
+ * The arguments parameter will be sent to all subscribers
+ *
+ * @param string $eventName
+ * @param array $arguments
+ * @return bool
+ */
+ public function broadcastEvent($eventName,$arguments = array()) {
+
+ if (isset($this->eventSubscriptions[$eventName])) {
+
+ foreach($this->eventSubscriptions[$eventName] as $subscriber) {
+
+ $result = call_user_func_array($subscriber,$arguments);
+ if ($result===false) return false;
+
+ }
+
+ }
+
+ return true;
+
+ }
+
+ /**
+ * Handles a http request, and execute a method based on its name
+ *
+ * @param string $method
+ * @param string $uri
+ * @return void
+ */
+ public function invokeMethod($method, $uri) {
+
+ $method = strtoupper($method);
+
+ if (!$this->broadcastEvent('beforeMethod',array($method, $uri))) return;
+
+ // Make sure this is a HTTP method we support
+ $internalMethods = array(
+ 'OPTIONS',
+ 'GET',
+ 'HEAD',
+ 'DELETE',
+ 'PROPFIND',
+ 'MKCOL',
+ 'PUT',
+ 'PROPPATCH',
+ 'COPY',
+ 'MOVE',
+ 'REPORT'
+ );
+
+ if (in_array($method,$internalMethods)) {
+
+ call_user_func(array($this,'http' . $method), $uri);
+
+ } else {
+
+ if ($this->broadcastEvent('unknownMethod',array($method, $uri))) {
+ // Unsupported method
+ throw new Exception\NotImplemented('There was no handler found for this "' . $method . '" method');
+ }
+
+ }
+
+ }
+
+ // {{{ HTTP Method implementations
+
+ /**
+ * HTTP OPTIONS
+ *
+ * @param string $uri
+ * @return void
+ */
+ protected function httpOptions($uri) {
+
+ $methods = $this->getAllowedMethods($uri);
+
+ $this->httpResponse->setHeader('Allow',strtoupper(implode(', ',$methods)));
+ $features = array('1','3', 'extended-mkcol');
+
+ foreach($this->plugins as $plugin) $features = array_merge($features,$plugin->getFeatures());
+
+ $this->httpResponse->setHeader('DAV',implode(', ',$features));
+ $this->httpResponse->setHeader('MS-Author-Via','DAV');
+ $this->httpResponse->setHeader('Accept-Ranges','bytes');
+ if (self::$exposeVersion) {
+ $this->httpResponse->setHeader('X-Sabre-Version',Version::VERSION);
+ }
+ $this->httpResponse->setHeader('Content-Length',0);
+ $this->httpResponse->sendStatus(200);
+
+ }
+
+ /**
+ * HTTP GET
+ *
+ * This method simply fetches the contents of a uri, like normal
+ *
+ * @param string $uri
+ * @return bool
+ */
+ protected function httpGet($uri) {
+
+ $node = $this->tree->getNodeForPath($uri,0);
+
+ if (!$this->checkPreconditions(true)) return false;
+ if (!$node instanceof IFile) throw new Exception\NotImplemented('GET is only implemented on File objects');
+
+ $body = $node->get();
+
+ // Converting string into stream, if needed.
+ if (is_string($body)) {
+ $stream = fopen('php://temp','r+');
+ fwrite($stream,$body);
+ rewind($stream);
+ $body = $stream;
+ }
+
+ /*
+ * TODO: getetag, getlastmodified, getsize should also be used using
+ * this method
+ */
+ $httpHeaders = $this->getHTTPHeaders($uri);
+
+ /* ContentType needs to get a default, because many webservers will otherwise
+ * default to text/html, and we don't want this for security reasons.
+ */
+ if (!isset($httpHeaders['Content-Type'])) {
+ $httpHeaders['Content-Type'] = 'application/octet-stream';
+ }
+
+
+ if (isset($httpHeaders['Content-Length'])) {
+
+ $nodeSize = $httpHeaders['Content-Length'];
+
+ // Need to unset Content-Length, because we'll handle that during figuring out the range
+ unset($httpHeaders['Content-Length']);
+
+ } else {
+ $nodeSize = null;
+ }
+
+ $this->httpResponse->setHeaders($httpHeaders);
+
+ $range = $this->getHTTPRange();
+ $ifRange = $this->httpRequest->getHeader('If-Range');
+ $ignoreRangeHeader = false;
+
+ // If ifRange is set, and range is specified, we first need to check
+ // the precondition.
+ if ($nodeSize && $range && $ifRange) {
+
+ // if IfRange is parsable as a date we'll treat it as a DateTime
+ // otherwise, we must treat it as an etag.
+ try {
+ $ifRangeDate = new \DateTime($ifRange);
+
+ // It's a date. We must check if the entity is modified since
+ // the specified date.
+ if (!isset($httpHeaders['Last-Modified'])) $ignoreRangeHeader = true;
+ else {
+ $modified = new \DateTime($httpHeaders['Last-Modified']);
+ if($modified > $ifRangeDate) $ignoreRangeHeader = true;
+ }
+
+ } catch (\Exception $e) {
+
+ // It's an entity. We can do a simple comparison.
+ if (!isset($httpHeaders['ETag'])) $ignoreRangeHeader = true;
+ elseif ($httpHeaders['ETag']!==$ifRange) $ignoreRangeHeader = true;
+ }
+ }
+
+ // We're only going to support HTTP ranges if the backend provided a filesize
+ if (!$ignoreRangeHeader && $nodeSize && $range) {
+
+ // Determining the exact byte offsets
+ if (!is_null($range[0])) {
+
+ $start = $range[0];
+ $end = $range[1]?$range[1]:$nodeSize-1;
+ if($start >= $nodeSize)
+ throw new Exception\RequestedRangeNotSatisfiable('The start offset (' . $range[0] . ') exceeded the size of the entity (' . $nodeSize . ')');
+
+ if($end < $start) throw new Exception\RequestedRangeNotSatisfiable('The end offset (' . $range[1] . ') is lower than the start offset (' . $range[0] . ')');
+ if($end >= $nodeSize) $end = $nodeSize-1;
+
+ } else {
+
+ $start = $nodeSize-$range[1];
+ $end = $nodeSize-1;
+
+ if ($start<0) $start = 0;
+
+ }
+
+ // New read/write stream
+ $newStream = fopen('php://temp','r+');
+
+ // stream_copy_to_stream() has a bug/feature: the `whence` argument
+ // is interpreted as SEEK_SET (count from absolute offset 0), while
+ // for a stream it should be SEEK_CUR (count from current offset).
+ // If a stream is nonseekable, the function fails. So we *emulate*
+ // the correct behaviour with fseek():
+ if ($start > 0) {
+ if (($curOffs = ftell($body)) === false) $curOffs = 0;
+ fseek($body, $start - $curOffs, SEEK_CUR);
+ }
+ stream_copy_to_stream($body, $newStream, $end-$start+1);
+ rewind($newStream);
+
+ $this->httpResponse->setHeader('Content-Length', $end-$start+1);
+ $this->httpResponse->setHeader('Content-Range','bytes ' . $start . '-' . $end . '/' . $nodeSize);
+ $this->httpResponse->sendStatus(206);
+ $this->httpResponse->sendBody($newStream);
+
+
+ } else {
+
+ if ($nodeSize) $this->httpResponse->setHeader('Content-Length',$nodeSize);
+ $this->httpResponse->sendStatus(200);
+ $this->httpResponse->sendBody($body);
+
+ }
+
+ }
+
+ /**
+ * HTTP HEAD
+ *
+ * This method is normally used to take a peak at a url, and only get the HTTP response headers, without the body
+ * This is used by clients to determine if a remote file was changed, so they can use a local cached version, instead of downloading it again
+ *
+ * @param string $uri
+ * @return void
+ */
+ protected function httpHead($uri) {
+
+ $node = $this->tree->getNodeForPath($uri);
+ /* This information is only collection for File objects.
+ * Ideally we want to throw 405 Method Not Allowed for every
+ * non-file, but MS Office does not like this
+ */
+ if ($node instanceof IFile) {
+ $headers = $this->getHTTPHeaders($this->getRequestUri());
+ if (!isset($headers['Content-Type'])) {
+ $headers['Content-Type'] = 'application/octet-stream';
+ }
+ $this->httpResponse->setHeaders($headers);
+ }
+ $this->httpResponse->sendStatus(200);
+
+ }
+
+ /**
+ * HTTP Delete
+ *
+ * The HTTP delete method, deletes a given uri
+ *
+ * @param string $uri
+ * @return void
+ */
+ protected function httpDelete($uri) {
+
+ if (!$this->broadcastEvent('beforeUnbind',array($uri))) return;
+ $this->tree->delete($uri);
+ $this->broadcastEvent('afterUnbind',array($uri));
+
+ $this->httpResponse->sendStatus(204);
+ $this->httpResponse->setHeader('Content-Length','0');
+
+ }
+
+
+ /**
+ * WebDAV PROPFIND
+ *
+ * This WebDAV method requests information about an uri resource, or a list of resources
+ * If a client wants to receive the properties for a single resource it will add an HTTP Depth: header with a 0 value
+ * If the value is 1, it means that it also expects a list of sub-resources (e.g.: files in a directory)
+ *
+ * The request body contains an XML data structure that has a list of properties the client understands
+ * The response body is also an xml document, containing information about every uri resource and the requested properties
+ *
+ * It has to return a HTTP 207 Multi-status status code
+ *
+ * @param string $uri
+ * @return void
+ */
+ protected function httpPropfind($uri) {
+
+ $requestedProperties = $this->parsePropFindRequest($this->httpRequest->getBody(true));
+
+ $depth = $this->getHTTPDepth(1);
+ // The only two options for the depth of a propfind is 0 or 1
+ if ($depth!=0) $depth = 1;
+
+ $newProperties = $this->getPropertiesForPath($uri,$requestedProperties,$depth);
+
+ // This is a multi-status response
+ $this->httpResponse->sendStatus(207);
+ $this->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8');
+ $this->httpResponse->setHeader('Vary','Brief,Prefer');
+
+ // Normally this header is only needed for OPTIONS responses, however..
+ // iCal seems to also depend on these being set for PROPFIND. Since
+ // this is not harmful, we'll add it.
+ $features = array('1','3', 'extended-mkcol');
+ foreach($this->plugins as $plugin) $features = array_merge($features,$plugin->getFeatures());
+ $this->httpResponse->setHeader('DAV',implode(', ',$features));
+
+ $prefer = $this->getHTTPPrefer();
+ $minimal = $prefer['return-minimal'];
+
+ $data = $this->generateMultiStatus($newProperties, $minimal);
+ $this->httpResponse->sendBody($data);
+
+ }
+
+ /**
+ * WebDAV PROPPATCH
+ *
+ * This method is called to update properties on a Node. The request is an XML body with all the mutations.
+ * In this XML body it is specified which properties should be set/updated and/or deleted
+ *
+ * @param string $uri
+ * @return void
+ */
+ protected function httpPropPatch($uri) {
+
+ $newProperties = $this->parsePropPatchRequest($this->httpRequest->getBody(true));
+
+ $result = $this->updateProperties($uri, $newProperties);
+
+ $prefer = $this->getHTTPPrefer();
+ $this->httpResponse->setHeader('Vary','Brief,Prefer');
+
+ if ($prefer['return-minimal']) {
+
+ // If return-minimal is specified, we only have to check if the
+ // request was succesful, and don't need to return the
+ // multi-status.
+ $ok = true;
+ foreach($result as $code=>$prop) {
+ if ((int)$code > 299) {
+ $ok = false;
+ }
+ }
+
+ if ($ok) {
+
+ $this->httpResponse->sendStatus(204);
+ return;
+
+ }
+
+ }
+
+ $this->httpResponse->sendStatus(207);
+ $this->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8');
+
+ $this->httpResponse->sendBody(
+ $this->generateMultiStatus(array($result))
+ );
+
+ }
+
+ /**
+ * HTTP PUT method
+ *
+ * This HTTP method updates a file, or creates a new one.
+ *
+ * If a new resource was created, a 201 Created status code should be returned. If an existing resource is updated, it's a 204 No Content
+ *
+ * @param string $uri
+ * @return bool
+ */
+ protected function httpPut($uri) {
+
+ $body = $this->httpRequest->getBody();
+
+ // Intercepting Content-Range
+ if ($this->httpRequest->getHeader('Content-Range')) {
+ /**
+ Content-Range is dangerous for PUT requests: PUT per definition
+ stores a full resource. draft-ietf-httpbis-p2-semantics-15 says
+ in section 7.6:
+ An origin server SHOULD reject any PUT request that contains a
+ Content-Range header field, since it might be misinterpreted as
+ partial content (or might be partial content that is being mistakenly
+ PUT as a full representation). Partial content updates are possible
+ by targeting a separately identified resource with state that
+ overlaps a portion of the larger resource, or by using a different
+ method that has been specifically defined for partial updates (for
+ example, the PATCH method defined in [RFC5789]).
+ This clarifies RFC2616 section 9.6:
+ The recipient of the entity MUST NOT ignore any Content-*
+ (e.g. Content-Range) headers that it does not understand or implement
+ and MUST return a 501 (Not Implemented) response in such cases.
+ OTOH is a PUT request with a Content-Range currently the only way to
+ continue an aborted upload request and is supported by curl, mod_dav,
+ Tomcat and others. Since some clients do use this feature which results
+ in unexpected behaviour (cf PEAR::HTTP_WebDAV_Client 1.0.1), we reject
+ all PUT requests with a Content-Range for now.
+ */
+
+ throw new Exception\NotImplemented('PUT with Content-Range is not allowed.');
+ }
+
+ // Intercepting the Finder problem
+ if (($expected = $this->httpRequest->getHeader('X-Expected-Entity-Length')) && $expected > 0) {
+
+ /**
+ Many webservers will not cooperate well with Finder PUT requests,
+ because it uses 'Chunked' transfer encoding for the request body.
+
+ The symptom of this problem is that Finder sends files to the
+ server, but they arrive as 0-length files in PHP.
+
+ If we don't do anything, the user might think they are uploading
+ files successfully, but they end up empty on the server. Instead,
+ we throw back an error if we detect this.
+
+ The reason Finder uses Chunked, is because it thinks the files
+ might change as it's being uploaded, and therefore the
+ Content-Length can vary.
+
+ Instead it sends the X-Expected-Entity-Length header with the size
+ of the file at the very start of the request. If this header is set,
+ but we don't get a request body we will fail the request to
+ protect the end-user.
+ */
+
+ // Only reading first byte
+ $firstByte = fread($body,1);
+ if (strlen($firstByte)!==1) {
+ throw new Exception\Forbidden('This server is not compatible with OS/X finder. Consider using a different WebDAV client or webserver.');
+ }
+
+ // The body needs to stay intact, so we copy everything to a
+ // temporary stream.
+
+ $newBody = fopen('php://temp','r+');
+ fwrite($newBody,$firstByte);
+ stream_copy_to_stream($body, $newBody);
+ rewind($newBody);
+
+ $body = $newBody;
+
+ }
+
+ if ($this->tree->nodeExists($uri)) {
+
+ $node = $this->tree->getNodeForPath($uri);
+
+ // Checking If-None-Match and related headers.
+ if (!$this->checkPreconditions()) return;
+
+ // If the node is a collection, we'll deny it
+ if (!($node instanceof IFile)) throw new Exception\Conflict('PUT is not allowed on non-files.');
+ if (!$this->broadcastEvent('beforeWriteContent',array($uri, $node, &$body))) return false;
+
+ $etag = $node->put($body);
+
+ $this->broadcastEvent('afterWriteContent',array($uri, $node));
+
+ $this->httpResponse->setHeader('Content-Length','0');
+ if ($etag) $this->httpResponse->setHeader('ETag',$etag);
+ $this->httpResponse->sendStatus(204);
+
+ } else {
+
+ $etag = null;
+ // If we got here, the resource didn't exist yet.
+ if (!$this->createFile($this->getRequestUri(),$body,$etag)) {
+ // For one reason or another the file was not created.
+ return;
+ }
+
+ $this->httpResponse->setHeader('Content-Length','0');
+ if ($etag) $this->httpResponse->setHeader('ETag', $etag);
+ $this->httpResponse->sendStatus(201);
+
+ }
+
+ }
+
+
+ /**
+ * WebDAV MKCOL
+ *
+ * The MKCOL method is used to create a new collection (directory) on the server
+ *
+ * @param string $uri
+ * @return void
+ */
+ protected function httpMkcol($uri) {
+
+ $requestBody = $this->httpRequest->getBody(true);
+
+ if ($requestBody) {
+
+ $contentType = $this->httpRequest->getHeader('Content-Type');
+ if (strpos($contentType,'application/xml')!==0 && strpos($contentType,'text/xml')!==0) {
+
+ // We must throw 415 for unsupported mkcol bodies
+ throw new Exception\UnsupportedMediaType('The request body for the MKCOL request must have an xml Content-Type');
+
+ }
+
+ $dom = XMLUtil::loadDOMDocument($requestBody);
+ if (XMLUtil::toClarkNotation($dom->firstChild)!=='{DAV:}mkcol') {
+
+ // We must throw 415 for unsupported mkcol bodies
+ throw new Exception\UnsupportedMediaType('The request body for the MKCOL request must be a {DAV:}mkcol request construct.');
+
+ }
+
+ $properties = array();
+ foreach($dom->firstChild->childNodes as $childNode) {
+
+ if (XMLUtil::toClarkNotation($childNode)!=='{DAV:}set') continue;
+ $properties = array_merge($properties, XMLUtil::parseProperties($childNode, $this->propertyMap));
+
+ }
+ if (!isset($properties['{DAV:}resourcetype']))
+ throw new Exception\BadRequest('The mkcol request must include a {DAV:}resourcetype property');
+
+ $resourceType = $properties['{DAV:}resourcetype']->getValue();
+ unset($properties['{DAV:}resourcetype']);
+
+ } else {
+
+ $properties = array();
+ $resourceType = array('{DAV:}collection');
+
+ }
+
+ $result = $this->createCollection($uri, $resourceType, $properties);
+
+ if (is_array($result)) {
+ $this->httpResponse->sendStatus(207);
+ $this->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8');
+
+ $this->httpResponse->sendBody(
+ $this->generateMultiStatus(array($result))
+ );
+
+ } else {
+ $this->httpResponse->setHeader('Content-Length','0');
+ $this->httpResponse->sendStatus(201);
+ }
+
+ }
+
+ /**
+ * WebDAV HTTP MOVE method
+ *
+ * This method moves one uri to a different uri. A lot of the actual request processing is done in getCopyMoveInfo
+ *
+ * @param string $uri
+ * @return bool
+ */
+ protected function httpMove($uri) {
+
+ $moveInfo = $this->getCopyAndMoveInfo();
+
+ // If the destination is part of the source tree, we must fail
+ if ($moveInfo['destination']==$uri)
+ throw new Exception\Forbidden('Source and destination uri are identical.');
+
+ if ($moveInfo['destinationExists']) {
+
+ if (!$this->broadcastEvent('beforeUnbind',array($moveInfo['destination']))) return false;
+ $this->tree->delete($moveInfo['destination']);
+ $this->broadcastEvent('afterUnbind',array($moveInfo['destination']));
+
+ }
+
+ if (!$this->broadcastEvent('beforeUnbind',array($uri))) return false;
+ if (!$this->broadcastEvent('beforeBind',array($moveInfo['destination']))) return false;
+ $this->tree->move($uri,$moveInfo['destination']);
+ $this->broadcastEvent('afterUnbind',array($uri));
+ $this->broadcastEvent('afterBind',array($moveInfo['destination']));
+
+ // If a resource was overwritten we should send a 204, otherwise a 201
+ $this->httpResponse->setHeader('Content-Length','0');
+ $this->httpResponse->sendStatus($moveInfo['destinationExists']?204:201);
+
+ }
+
+ /**
+ * WebDAV HTTP COPY method
+ *
+ * This method copies one uri to a different uri, and works much like the MOVE request
+ * A lot of the actual request processing is done in getCopyMoveInfo
+ *
+ * @param string $uri
+ * @return bool
+ */
+ protected function httpCopy($uri) {
+
+ $copyInfo = $this->getCopyAndMoveInfo();
+ // If the destination is part of the source tree, we must fail
+ if ($copyInfo['destination']==$uri)
+ throw new Exception\Forbidden('Source and destination uri are identical.');
+
+ if ($copyInfo['destinationExists']) {
+ if (!$this->broadcastEvent('beforeUnbind',array($copyInfo['destination']))) return false;
+ $this->tree->delete($copyInfo['destination']);
+
+ }
+ if (!$this->broadcastEvent('beforeBind',array($copyInfo['destination']))) return false;
+ $this->tree->copy($uri,$copyInfo['destination']);
+ $this->broadcastEvent('afterBind',array($copyInfo['destination']));
+
+ // If a resource was overwritten we should send a 204, otherwise a 201
+ $this->httpResponse->setHeader('Content-Length','0');
+ $this->httpResponse->sendStatus($copyInfo['destinationExists']?204:201);
+
+ }
+
+
+
+ /**
+ * HTTP REPORT method implementation
+ *
+ * Although the REPORT method is not part of the standard WebDAV spec (it's from rfc3253)
+ * It's used in a lot of extensions, so it made sense to implement it into the core.
+ *
+ * @param string $uri
+ * @return void
+ */
+ protected function httpReport($uri) {
+
+ $body = $this->httpRequest->getBody(true);
+ $dom = XMLUtil::loadDOMDocument($body);
+
+ $reportName = XMLUtil::toClarkNotation($dom->firstChild);
+
+ if ($this->broadcastEvent('report',array($reportName,$dom, $uri))) {
+
+ // If broadcastEvent returned true, it means the report was not supported
+ throw new Exception\ReportNotSupported();
+
+ }
+
+ }
+
+ // }}}
+ // {{{ HTTP/WebDAV protocol helpers
+
+ /**
+ * Returns an array with all the supported HTTP methods for a specific uri.
+ *
+ * @param string $uri
+ * @return array
+ */
+ public function getAllowedMethods($uri) {
+
+ $methods = array(
+ 'OPTIONS',
+ 'GET',
+ 'HEAD',
+ 'DELETE',
+ 'PROPFIND',
+ 'PUT',
+ 'PROPPATCH',
+ 'COPY',
+ 'MOVE',
+ 'REPORT'
+ );
+
+ // The MKCOL is only allowed on an unmapped uri
+ try {
+ $this->tree->getNodeForPath($uri);
+ } catch (Exception\NotFound $e) {
+ $methods[] = 'MKCOL';
+ }
+
+ // We're also checking if any of the plugins register any new methods
+ foreach($this->plugins as $plugin) $methods = array_merge($methods, $plugin->getHTTPMethods($uri));
+ array_unique($methods);
+
+ return $methods;
+
+ }
+
+ /**
+ * Gets the uri for the request, keeping the base uri into consideration
+ *
+ * @return string
+ */
+ public function getRequestUri() {
+
+ return $this->calculateUri($this->httpRequest->getUri());
+
+ }
+
+ /**
+ * Calculates the uri for a request, making sure that the base uri is stripped out
+ *
+ * @param string $uri
+ * @throws Exception\Forbidden A permission denied exception is thrown whenever there was an attempt to supply a uri outside of the base uri
+ * @return string
+ */
+ public function calculateUri($uri) {
+
+ if ($uri[0]!='/' && strpos($uri,'://')) {
+
+ $uri = parse_url($uri,PHP_URL_PATH);
+
+ }
+
+ $uri = str_replace('//','/',$uri);
+
+ if (strpos($uri,$this->getBaseUri())===0) {
+
+ return trim(URLUtil::decodePath(substr($uri,strlen($this->getBaseUri()))),'/');
+
+ // A special case, if the baseUri was accessed without a trailing
+ // slash, we'll accept it as well.
+ } elseif ($uri.'/' === $this->getBaseUri()) {
+
+ return '';
+
+ } else {
+
+ throw new Exception\Forbidden('Requested uri (' . $uri . ') is out of base uri (' . $this->getBaseUri() . ')');
+
+ }
+
+ }
+
+ /**
+ * Returns the HTTP depth header
+ *
+ * This method returns the contents of the HTTP depth request header. If the depth header was 'infinity' it will return the Sabre\DAV\Server::DEPTH_INFINITY object
+ * It is possible to supply a default depth value, which is used when the depth header has invalid content, or is completely non-existent
+ *
+ * @param mixed $default
+ * @return int
+ */
+ public function getHTTPDepth($default = self::DEPTH_INFINITY) {
+
+ // If its not set, we'll grab the default
+ $depth = $this->httpRequest->getHeader('Depth');
+
+ if (is_null($depth)) return $default;
+
+ if ($depth == 'infinity') return self::DEPTH_INFINITY;
+
+
+ // If its an unknown value. we'll grab the default
+ if (!ctype_digit($depth)) return $default;
+
+ return (int)$depth;
+
+ }
+
+ /**
+ * Returns the HTTP range header
+ *
+ * This method returns null if there is no well-formed HTTP range request
+ * header or array($start, $end).
+ *
+ * The first number is the offset of the first byte in the range.
+ * The second number is the offset of the last byte in the range.
+ *
+ * If the second offset is null, it should be treated as the offset of the last byte of the entity
+ * If the first offset is null, the second offset should be used to retrieve the last x bytes of the entity
+ *
+ * @return array|null
+ */
+ public function getHTTPRange() {
+
+ $range = $this->httpRequest->getHeader('range');
+ if (is_null($range)) return null;
+
+ // Matching "Range: bytes=1234-5678: both numbers are optional
+
+ if (!preg_match('/^bytes=([0-9]*)-([0-9]*)$/i',$range,$matches)) return null;
+
+ if ($matches[1]==='' && $matches[2]==='') return null;
+
+ return array(
+ $matches[1]!==''?$matches[1]:null,
+ $matches[2]!==''?$matches[2]:null,
+ );
+
+ }
+
+ /**
+ * Returns the HTTP Prefer header information.
+ *
+ * The prefer header is defined in:
+ * http://tools.ietf.org/html/draft-snell-http-prefer-14
+ *
+ * This method will return an array with options.
+ *
+ * Currently, the following options may be returned:
+ * array(
+ * 'return-asynch' => true,
+ * 'return-minimal' => true,
+ * 'return-representation' => true,
+ * 'wait' => 30,
+ * 'strict' => true,
+ * 'lenient' => true,
+ * )
+ *
+ * This method also supports the Brief header, and will also return
+ * 'return-minimal' if the brief header was set to 't'.
+ *
+ * For the boolean options, false will be returned if the headers are not
+ * specified. For the integer options it will be 'null'.
+ *
+ * @return array
+ */
+ public function getHTTPPrefer() {
+
+ $result = array(
+ 'return-asynch' => false,
+ 'return-minimal' => false,
+ 'return-representation' => false,
+ 'wait' => null,
+ 'strict' => false,
+ 'lenient' => false,
+ );
+
+ if ($prefer = $this->httpRequest->getHeader('Prefer')) {
+
+ $parameters = array_map('trim',
+ explode(',', $prefer)
+ );
+
+ foreach($parameters as $parameter) {
+
+ // Right now our regex only supports the tokens actually
+ // specified in the draft. We may need to expand this if new
+ // tokens get registered.
+ if(!preg_match('/^(?P<token>[a-z0-9-]+)(?:=(?P<value>[0-9]+))?$/', $parameter, $matches)) {
+ continue;
+ }
+
+ switch($matches['token']) {
+
+ case 'return-asynch' :
+ case 'return-minimal' :
+ case 'return-representation' :
+ case 'strict' :
+ case 'lenient' :
+ $result[$matches['token']] = true;
+ break;
+ case 'wait' :
+ $result[$matches['token']] = $matches['value'];
+ break;
+
+ }
+
+ }
+
+ }
+
+ if ($this->httpRequest->getHeader('Brief')=='t') {
+ $result['return-minimal'] = true;
+ }
+
+ return $result;
+
+ }
+
+
+ /**
+ * Returns information about Copy and Move requests
+ *
+ * This function is created to help getting information about the source and the destination for the
+ * WebDAV MOVE and COPY HTTP request. It also validates a lot of information and throws proper exceptions
+ *
+ * The returned value is an array with the following keys:
+ * * destination - Destination path
+ * * destinationExists - Whether or not the destination is an existing url (and should therefore be overwritten)
+ *
+ * @return array
+ */
+ public function getCopyAndMoveInfo() {
+
+ // Collecting the relevant HTTP headers
+ if (!$this->httpRequest->getHeader('Destination')) throw new Exception\BadRequest('The destination header was not supplied');
+ $destination = $this->calculateUri($this->httpRequest->getHeader('Destination'));
+ $overwrite = $this->httpRequest->getHeader('Overwrite');
+ if (!$overwrite) $overwrite = 'T';
+ if (strtoupper($overwrite)=='T') $overwrite = true;
+ elseif (strtoupper($overwrite)=='F') $overwrite = false;
+ // We need to throw a bad request exception, if the header was invalid
+ else throw new Exception\BadRequest('The HTTP Overwrite header should be either T or F');
+
+ list($destinationDir) = URLUtil::splitPath($destination);
+
+ try {
+ $destinationParent = $this->tree->getNodeForPath($destinationDir);
+ if (!($destinationParent instanceof ICollection)) throw new Exception\UnsupportedMediaType('The destination node is not a collection');
+ } catch (Exception\NotFound $e) {
+
+ // If the destination parent node is not found, we throw a 409
+ throw new Exception\Conflict('The destination node is not found');
+ }
+
+ try {
+
+ $destinationNode = $this->tree->getNodeForPath($destination);
+
+ // If this succeeded, it means the destination already exists
+ // we'll need to throw precondition failed in case overwrite is false
+ if (!$overwrite) throw new Exception\PreconditionFailed('The destination node already exists, and the overwrite header is set to false','Overwrite');
+
+ } catch (Exception\NotFound $e) {
+
+ // Destination didn't exist, we're all good
+ $destinationNode = false;
+
+
+
+ }
+
+ // These are the three relevant properties we need to return
+ return array(
+ 'destination' => $destination,
+ 'destinationExists' => $destinationNode==true,
+ 'destinationNode' => $destinationNode,
+ );
+
+ }
+
+ /**
+ * Returns a list of properties for a path
+ *
+ * This is a simplified version getPropertiesForPath.
+ * if you aren't interested in status codes, but you just
+ * want to have a flat list of properties. Use this method.
+ *
+ * @param string $path
+ * @param array $propertyNames
+ */
+ public function getProperties($path, $propertyNames) {
+
+ $result = $this->getPropertiesForPath($path,$propertyNames,0);
+ return $result[0][200];
+
+ }
+
+ /**
+ * A kid-friendly way to fetch properties for a node's children.
+ *
+ * The returned array will be indexed by the path of the of child node.
+ * Only properties that are actually found will be returned.
+ *
+ * The parent node will not be returned.
+ *
+ * @param string $path
+ * @param array $propertyNames
+ * @return array
+ */
+ public function getPropertiesForChildren($path, $propertyNames) {
+
+ $result = array();
+ foreach($this->getPropertiesForPath($path,$propertyNames,1) as $k=>$row) {
+
+ // Skipping the parent path
+ if ($k === 0) continue;
+
+ $result[$row['href']] = $row[200];
+
+ }
+ return $result;
+
+ }
+
+ /**
+ * Returns a list of HTTP headers for a particular resource
+ *
+ * The generated http headers are based on properties provided by the
+ * resource. The method basically provides a simple mapping between
+ * DAV property and HTTP header.
+ *
+ * The headers are intended to be used for HEAD and GET requests.
+ *
+ * @param string $path
+ * @return array
+ */
+ public function getHTTPHeaders($path) {
+
+ $propertyMap = array(
+ '{DAV:}getcontenttype' => 'Content-Type',
+ '{DAV:}getcontentlength' => 'Content-Length',
+ '{DAV:}getlastmodified' => 'Last-Modified',
+ '{DAV:}getetag' => 'ETag',
+ );
+
+ $properties = $this->getProperties($path,array_keys($propertyMap));
+
+ $headers = array();
+ foreach($propertyMap as $property=>$header) {
+ if (!isset($properties[$property])) continue;
+
+ if (is_scalar($properties[$property])) {
+ $headers[$header] = $properties[$property];
+
+ // GetLastModified gets special cased
+ } elseif ($properties[$property] instanceof Property\GetLastModified) {
+ $headers[$header] = HTTP\Util::toHTTPDate($properties[$property]->getTime());
+ }
+
+ }
+
+ return $headers;
+
+ }
+
+ /**
+ * Returns a list of properties for a given path
+ *
+ * The path that should be supplied should have the baseUrl stripped out
+ * The list of properties should be supplied in Clark notation. If the list is empty
+ * 'allprops' is assumed.
+ *
+ * If a depth of 1 is requested child elements will also be returned.
+ *
+ * @param string $path
+ * @param array $propertyNames
+ * @param int $depth
+ * @return array
+ */
+ public function getPropertiesForPath($path, $propertyNames = array(), $depth = 0) {
+
+ if ($depth!=0) $depth = 1;
+
+ $path = rtrim($path,'/');
+
+ // This event allows people to intercept these requests early on in the
+ // process.
+ //
+ // We're not doing anything with the result, but this can be helpful to
+ // pre-fetch certain expensive live properties.
+ $this->broadCastEvent('beforeGetPropertiesForPath', array($path, $propertyNames, $depth));
+
+ $returnPropertyList = array();
+
+ $parentNode = $this->tree->getNodeForPath($path);
+ $nodes = array(
+ $path => $parentNode
+ );
+ if ($depth==1 && $parentNode instanceof ICollection) {
+ foreach($this->tree->getChildren($path) as $childNode)
+ $nodes[$path . '/' . $childNode->getName()] = $childNode;
+ }
+
+ // If the propertyNames array is empty, it means all properties are requested.
+ // We shouldn't actually return everything we know though, and only return a
+ // sensible list.
+ $allProperties = count($propertyNames)==0;
+
+ foreach($nodes as $myPath=>$node) {
+
+ $currentPropertyNames = $propertyNames;
+
+ $newProperties = array(
+ '200' => array(),
+ '404' => array(),
+ );
+
+ if ($allProperties) {
+ // Default list of propertyNames, when all properties were requested.
+ $currentPropertyNames = array(
+ '{DAV:}getlastmodified',
+ '{DAV:}getcontentlength',
+ '{DAV:}resourcetype',
+ '{DAV:}quota-used-bytes',
+ '{DAV:}quota-available-bytes',
+ '{DAV:}getetag',
+ '{DAV:}getcontenttype',
+ );
+ }
+
+ // If the resourceType was not part of the list, we manually add it
+ // and mark it for removal. We need to know the resourcetype in order
+ // to make certain decisions about the entry.
+ // WebDAV dictates we should add a / and the end of href's for collections
+ $removeRT = false;
+ if (!in_array('{DAV:}resourcetype',$currentPropertyNames)) {
+ $currentPropertyNames[] = '{DAV:}resourcetype';
+ $removeRT = true;
+ }
+
+ $result = $this->broadcastEvent('beforeGetProperties',array($myPath, $node, &$currentPropertyNames, &$newProperties));
+ // If this method explicitly returned false, we must ignore this
+ // node as it is inaccessible.
+ if ($result===false) continue;
+
+ if (count($currentPropertyNames) > 0) {
+
+ if ($node instanceof IProperties) {
+ $nodeProperties = $node->getProperties($currentPropertyNames);
+
+ // The getProperties method may give us too much,
+ // properties, in case the implementor was lazy.
+ //
+ // So as we loop through this list, we will only take the
+ // properties that were actually requested and discard the
+ // rest.
+ foreach($currentPropertyNames as $k=>$currentPropertyName) {
+ if (isset($nodeProperties[$currentPropertyName])) {
+ unset($currentPropertyNames[$k]);
+ $newProperties[200][$currentPropertyName] = $nodeProperties[$currentPropertyName];
+ }
+ }
+
+ }
+
+ }
+
+ foreach($currentPropertyNames as $prop) {
+
+ if (isset($newProperties[200][$prop])) continue;
+
+ switch($prop) {
+ case '{DAV:}getlastmodified' : if ($node->getLastModified()) $newProperties[200][$prop] = new Property\GetLastModified($node->getLastModified()); break;
+ case '{DAV:}getcontentlength' :
+ if ($node instanceof IFile) {
+ $size = $node->getSize();
+ if (!is_null($size)) {
+ $newProperties[200][$prop] = (int)$node->getSize();
+ }
+ }
+ break;
+ case '{DAV:}quota-used-bytes' :
+ if ($node instanceof IQuota) {
+ $quotaInfo = $node->getQuotaInfo();
+ $newProperties[200][$prop] = $quotaInfo[0];
+ }
+ break;
+ case '{DAV:}quota-available-bytes' :
+ if ($node instanceof IQuota) {
+ $quotaInfo = $node->getQuotaInfo();
+ $newProperties[200][$prop] = $quotaInfo[1];
+ }
+ break;
+ case '{DAV:}getetag' : if ($node instanceof IFile && $etag = $node->getETag()) $newProperties[200][$prop] = $etag; break;
+ case '{DAV:}getcontenttype' : if ($node instanceof IFile && $ct = $node->getContentType()) $newProperties[200][$prop] = $ct; break;
+ case '{DAV:}supported-report-set' :
+ $reports = array();
+ foreach($this->plugins as $plugin) {
+ $reports = array_merge($reports, $plugin->getSupportedReportSet($myPath));
+ }
+ $newProperties[200][$prop] = new Property\SupportedReportSet($reports);
+ break;
+ case '{DAV:}resourcetype' :
+ $newProperties[200]['{DAV:}resourcetype'] = new Property\ResourceType();
+ foreach($this->resourceTypeMapping as $className => $resourceType) {
+ if ($node instanceof $className) $newProperties[200]['{DAV:}resourcetype']->add($resourceType);
+ }
+ break;
+
+ }
+
+ // If we were unable to find the property, we will list it as 404.
+ if (!$allProperties && !isset($newProperties[200][$prop])) $newProperties[404][$prop] = null;
+
+ }
+
+ $this->broadcastEvent('afterGetProperties',array(trim($myPath,'/'),&$newProperties, $node));
+
+ $newProperties['href'] = trim($myPath,'/');
+
+ // Its is a WebDAV recommendation to add a trailing slash to collectionnames.
+ // Apple's iCal also requires a trailing slash for principals (rfc 3744), though this is non-standard.
+ if ($myPath!='' && isset($newProperties[200]['{DAV:}resourcetype'])) {
+ $rt = $newProperties[200]['{DAV:}resourcetype'];
+ if ($rt->is('{DAV:}collection') || $rt->is('{DAV:}principal')) {
+ $newProperties['href'] .='/';
+ }
+ }
+
+ // If the resourcetype property was manually added to the requested property list,
+ // we will remove it again.
+ if ($removeRT) unset($newProperties[200]['{DAV:}resourcetype']);
+
+ $returnPropertyList[] = $newProperties;
+
+ }
+
+ return $returnPropertyList;
+
+ }
+
+ /**
+ * This method is invoked by sub-systems creating a new file.
+ *
+ * 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.
+ *
+ * This method will return true if the file was actually created
+ *
+ * @param string $uri
+ * @param resource $data
+ * @param string $etag
+ * @return bool
+ */
+ public function createFile($uri,$data, &$etag = null) {
+
+ list($dir,$name) = URLUtil::splitPath($uri);
+
+ if (!$this->broadcastEvent('beforeBind',array($uri))) return false;
+
+ $parent = $this->tree->getNodeForPath($dir);
+ if (!$parent instanceof ICollection) {
+ throw new Exception\Conflict('Files can only be created as children of collections');
+ }
+
+ if (!$this->broadcastEvent('beforeCreateFile',array($uri, &$data, $parent))) return false;
+
+ $etag = $parent->createFile($name,$data);
+ $this->tree->markDirty($dir . '/' . $name);
+
+ $this->broadcastEvent('afterBind',array($uri));
+ $this->broadcastEvent('afterCreateFile',array($uri, $parent));
+
+ return true;
+ }
+
+ /**
+ * This method is invoked by sub-systems creating a new directory.
+ *
+ * @param string $uri
+ * @return void
+ */
+ public function createDirectory($uri) {
+
+ $this->createCollection($uri,array('{DAV:}collection'),array());
+
+ }
+
+ /**
+ * Use this method to create a new collection
+ *
+ * The {DAV:}resourcetype is specified using the resourceType array.
+ * At the very least it must contain {DAV:}collection.
+ *
+ * The properties array can contain a list of additional properties.
+ *
+ * @param string $uri The new uri
+ * @param array $resourceType The resourceType(s)
+ * @param array $properties A list of properties
+ * @return array|null
+ */
+ public function createCollection($uri, array $resourceType, array $properties) {
+
+ list($parentUri,$newName) = URLUtil::splitPath($uri);
+
+ // Making sure {DAV:}collection was specified as resourceType
+ if (!in_array('{DAV:}collection', $resourceType)) {
+ throw new Exception\InvalidResourceType('The resourceType for this collection must at least include {DAV:}collection');
+ }
+
+
+ // Making sure the parent exists
+ try {
+
+ $parent = $this->tree->getNodeForPath($parentUri);
+
+ } catch (Exception\NotFound $e) {
+
+ throw new Exception\Conflict('Parent node does not exist');
+
+ }
+
+ // Making sure the parent is a collection
+ if (!$parent instanceof ICollection) {
+ throw new Exception\Conflict('Parent node is not a collection');
+ }
+
+
+
+ // Making sure the child does not already exist
+ try {
+ $parent->getChild($newName);
+
+ // If we got here.. it means there's already a node on that url, and we need to throw a 405
+ throw new Exception\MethodNotAllowed('The resource you tried to create already exists');
+
+ } catch (Exception\NotFound $e) {
+ // This is correct
+ }
+
+
+ if (!$this->broadcastEvent('beforeBind',array($uri))) return;
+
+ // There are 2 modes of operation. The standard collection
+ // creates the directory, and then updates properties
+ // the extended collection can create it directly.
+ if ($parent instanceof IExtendedCollection) {
+
+ $parent->createExtendedCollection($newName, $resourceType, $properties);
+
+ } else {
+
+ // No special resourcetypes are supported
+ if (count($resourceType)>1) {
+ throw new Exception\InvalidResourceType('The {DAV:}resourcetype you specified is not supported here.');
+ }
+
+ $parent->createDirectory($newName);
+ $rollBack = false;
+ $exception = null;
+ $errorResult = null;
+
+ if (count($properties)>0) {
+
+ try {
+
+ $errorResult = $this->updateProperties($uri, $properties);
+ if (!isset($errorResult[200])) {
+ $rollBack = true;
+ }
+
+ } catch (Exception $e) {
+
+ $rollBack = true;
+ $exception = $e;
+
+ }
+
+ }
+
+ if ($rollBack) {
+ if (!$this->broadcastEvent('beforeUnbind',array($uri))) return;
+ $this->tree->delete($uri);
+
+ // Re-throwing exception
+ if ($exception) throw $exception;
+
+ return $errorResult;
+ }
+
+ }
+ $this->tree->markDirty($parentUri);
+ $this->broadcastEvent('afterBind',array($uri));
+
+ }
+
+ /**
+ * This method updates a resource's properties
+ *
+ * The properties array must be a list of properties. Array-keys are
+ * property names in clarknotation, array-values are it's values.
+ * If a property must be deleted, the value should be null.
+ *
+ * Note that this request should either completely succeed, or
+ * completely fail.
+ *
+ * The response is an array with statuscodes for keys, which in turn
+ * contain arrays with propertynames. This response can be used
+ * to generate a multistatus body.
+ *
+ * @param string $uri
+ * @param array $properties
+ * @return array
+ */
+ public function updateProperties($uri, array $properties) {
+
+ // we'll start by grabbing the node, this will throw the appropriate
+ // exceptions if it doesn't.
+ $node = $this->tree->getNodeForPath($uri);
+
+ $result = array(
+ 200 => array(),
+ 403 => array(),
+ 424 => array(),
+ );
+ $remainingProperties = $properties;
+ $hasError = false;
+
+ // Running through all properties to make sure none of them are protected
+ if (!$hasError) foreach($properties as $propertyName => $value) {
+ if(in_array($propertyName, $this->protectedProperties)) {
+ $result[403][$propertyName] = null;
+ unset($remainingProperties[$propertyName]);
+ $hasError = true;
+ }
+ }
+
+ if (!$hasError) {
+ // Allowing plugins to take care of property updating
+ $hasError = !$this->broadcastEvent('updateProperties',array(
+ &$remainingProperties,
+ &$result,
+ $node
+ ));
+ }
+
+ // If the node is not an instance of Sabre\DAV\IProperties, every
+ // property is 403 Forbidden
+ if (!$hasError && count($remainingProperties) && !($node instanceof IProperties)) {
+ $hasError = true;
+ foreach($properties as $propertyName=> $value) {
+ $result[403][$propertyName] = null;
+ }
+ $remainingProperties = array();
+ }
+
+ // Only if there were no errors we may attempt to update the resource
+ if (!$hasError) {
+
+ if (count($remainingProperties)>0) {
+
+ $updateResult = $node->updateProperties($remainingProperties);
+
+ if ($updateResult===true) {
+ // success
+ foreach($remainingProperties as $propertyName=>$value) {
+ $result[200][$propertyName] = null;
+ }
+
+ } elseif ($updateResult===false) {
+ // The node failed to update the properties for an
+ // unknown reason
+ foreach($remainingProperties as $propertyName=>$value) {
+ $result[403][$propertyName] = null;
+ }
+
+ } elseif (is_array($updateResult)) {
+
+ // The node has detailed update information
+ // We need to merge the results with the earlier results.
+ foreach($updateResult as $status => $props) {
+ if (is_array($props)) {
+ if (!isset($result[$status]))
+ $result[$status] = array();
+
+ $result[$status] = array_merge($result[$status], $updateResult[$status]);
+ }
+ }
+
+ } else {
+ throw new Exception('Invalid result from updateProperties');
+ }
+ $remainingProperties = array();
+ }
+
+ }
+
+ foreach($remainingProperties as $propertyName=>$value) {
+ // if there are remaining properties, it must mean
+ // there's a dependency failure
+ $result[424][$propertyName] = null;
+ }
+
+ // Removing empty array values
+ foreach($result as $status=>$props) {
+
+ if (count($props)===0) unset($result[$status]);
+
+ }
+ $result['href'] = $uri;
+ return $result;
+
+ }
+
+ /**
+ * This method checks the main HTTP preconditions.
+ *
+ * Currently these are:
+ * * If-Match
+ * * If-None-Match
+ * * If-Modified-Since
+ * * If-Unmodified-Since
+ *
+ * The method will return true if all preconditions are met
+ * The method will return false, or throw an exception if preconditions
+ * failed. If false is returned the operation should be aborted, and
+ * the appropriate HTTP response headers are already set.
+ *
+ * Normally this method will throw 412 Precondition Failed for failures
+ * related to If-None-Match, If-Match and If-Unmodified Since. It will
+ * set the status to 304 Not Modified for If-Modified_since.
+ *
+ * If the $handleAsGET argument is set to true, it will also return 304
+ * Not Modified for failure of the If-None-Match precondition. This is the
+ * desired behaviour for HTTP GET and HTTP HEAD requests.
+ *
+ * @param bool $handleAsGET
+ * @return bool
+ */
+ public function checkPreconditions($handleAsGET = false) {
+
+ $uri = $this->getRequestUri();
+ $node = null;
+ $lastMod = null;
+ $etag = null;
+
+ if ($ifMatch = $this->httpRequest->getHeader('If-Match')) {
+
+ // If-Match contains an entity tag. Only if the entity-tag
+ // matches we are allowed to make the request succeed.
+ // If the entity-tag is '*' we are only allowed to make the
+ // request succeed if a resource exists at that url.
+ try {
+ $node = $this->tree->getNodeForPath($uri);
+ } catch (Exception\NotFound $e) {
+ throw new Exception\PreconditionFailed('An If-Match header was specified and the resource did not exist','If-Match');
+ }
+
+ // Only need to check entity tags if they are not *
+ if ($ifMatch!=='*') {
+
+ // There can be multiple etags
+ $ifMatch = explode(',',$ifMatch);
+ $haveMatch = false;
+ foreach($ifMatch as $ifMatchItem) {
+
+ // Stripping any extra spaces
+ $ifMatchItem = trim($ifMatchItem,' ');
+
+ $etag = $node->getETag();
+ if ($etag===$ifMatchItem) {
+ $haveMatch = true;
+ } else {
+ // Evolution has a bug where it sometimes prepends the "
+ // with a \. This is our workaround.
+ if (str_replace('\\"','"', $ifMatchItem) === $etag) {
+ $haveMatch = true;
+ }
+ }
+
+ }
+ if (!$haveMatch) {
+ throw new Exception\PreconditionFailed('An If-Match header was specified, but none of the specified the ETags matched.','If-Match');
+ }
+ }
+ }
+
+ if ($ifNoneMatch = $this->httpRequest->getHeader('If-None-Match')) {
+
+ // The If-None-Match header contains an etag.
+ // Only if the ETag does not match the current ETag, the request will succeed
+ // The header can also contain *, in which case the request
+ // will only succeed if the entity does not exist at all.
+ $nodeExists = true;
+ if (!$node) {
+ try {
+ $node = $this->tree->getNodeForPath($uri);
+ } catch (Exception\NotFound $e) {
+ $nodeExists = false;
+ }
+ }
+ if ($nodeExists) {
+ $haveMatch = false;
+ if ($ifNoneMatch==='*') $haveMatch = true;
+ else {
+
+ // There might be multiple etags
+ $ifNoneMatch = explode(',', $ifNoneMatch);
+ $etag = $node->getETag();
+
+ foreach($ifNoneMatch as $ifNoneMatchItem) {
+
+ // Stripping any extra spaces
+ $ifNoneMatchItem = trim($ifNoneMatchItem,' ');
+
+ if ($etag===$ifNoneMatchItem) $haveMatch = true;
+
+ }
+
+ }
+
+ if ($haveMatch) {
+ if ($handleAsGET) {
+ $this->httpResponse->sendStatus(304);
+ return false;
+ } else {
+ throw new Exception\PreconditionFailed('An If-None-Match header was specified, but the ETag matched (or * was specified).','If-None-Match');
+ }
+ }
+ }
+
+ }
+
+ if (!$ifNoneMatch && ($ifModifiedSince = $this->httpRequest->getHeader('If-Modified-Since'))) {
+
+ // The If-Modified-Since header contains a date. We
+ // will only return the entity if it has been changed since
+ // that date. If it hasn't been changed, we return a 304
+ // header
+ // Note that this header only has to be checked if there was no If-None-Match header
+ // as per the HTTP spec.
+ $date = HTTP\Util::parseHTTPDate($ifModifiedSince);
+
+ if ($date) {
+ if (is_null($node)) {
+ $node = $this->tree->getNodeForPath($uri);
+ }
+ $lastMod = $node->getLastModified();
+ if ($lastMod) {
+ $lastMod = new \DateTime('@' . $lastMod);
+ if ($lastMod <= $date) {
+ $this->httpResponse->sendStatus(304);
+ $this->httpResponse->setHeader('Last-Modified', HTTP\Util::toHTTPDate($lastMod));
+ return false;
+ }
+ }
+ }
+ }
+
+ if ($ifUnmodifiedSince = $this->httpRequest->getHeader('If-Unmodified-Since')) {
+
+ // The If-Unmodified-Since will allow allow the request if the
+ // entity has not changed since the specified date.
+ $date = HTTP\Util::parseHTTPDate($ifUnmodifiedSince);
+
+ // We must only check the date if it's valid
+ if ($date) {
+ if (is_null($node)) {
+ $node = $this->tree->getNodeForPath($uri);
+ }
+ $lastMod = $node->getLastModified();
+ if ($lastMod) {
+ $lastMod = new \DateTime('@' . $lastMod);
+ if ($lastMod > $date) {
+ throw new Exception\PreconditionFailed('An If-Unmodified-Since header was specified, but the entity has been changed since the specified date.','If-Unmodified-Since');
+ }
+ }
+ }
+
+ }
+ return true;
+
+ }
+
+ // }}}
+ // {{{ XML Readers & Writers
+
+
+ /**
+ * Generates a WebDAV propfind response body based on a list of nodes.
+ *
+ * If 'strip404s' is set to true, all 404 responses will be removed.
+ *
+ * @param array $fileProperties The list with nodes
+ * @param bool strip404s
+ * @return string
+ */
+ public function generateMultiStatus(array $fileProperties, $strip404s = false) {
+
+ $dom = new \DOMDocument('1.0','utf-8');
+ //$dom->formatOutput = true;
+ $multiStatus = $dom->createElement('d:multistatus');
+ $dom->appendChild($multiStatus);
+
+ // Adding in default namespaces
+ foreach($this->xmlNamespaces as $namespace=>$prefix) {
+
+ $multiStatus->setAttribute('xmlns:' . $prefix,$namespace);
+
+ }
+
+ foreach($fileProperties as $entry) {
+
+ $href = $entry['href'];
+ unset($entry['href']);
+
+ if ($strip404s && isset($entry[404])) {
+ unset($entry[404]);
+ }
+
+ $response = new Property\Response($href,$entry);
+ $response->serialize($this,$multiStatus);
+
+ }
+
+ return $dom->saveXML();
+
+ }
+
+ /**
+ * This method parses a PropPatch request
+ *
+ * PropPatch changes the properties for a resource. This method
+ * returns a list of properties.
+ *
+ * The keys in the returned array contain the property name (e.g.: {DAV:}displayname,
+ * and the value contains the property value. If a property is to be removed the value
+ * will be null.
+ *
+ * @param string $body xml body
+ * @return array list of properties in need of updating or deletion
+ */
+ public function parsePropPatchRequest($body) {
+
+ //We'll need to change the DAV namespace declaration to something else in order to make it parsable
+ $dom = XMLUtil::loadDOMDocument($body);
+
+ $newProperties = array();
+
+ foreach($dom->firstChild->childNodes as $child) {
+
+ if ($child->nodeType !== XML_ELEMENT_NODE) continue;
+
+ $operation = XMLUtil::toClarkNotation($child);
+
+ if ($operation!=='{DAV:}set' && $operation!=='{DAV:}remove') continue;
+
+ $innerProperties = XMLUtil::parseProperties($child, $this->propertyMap);
+
+ foreach($innerProperties as $propertyName=>$propertyValue) {
+
+ if ($operation==='{DAV:}remove') {
+ $propertyValue = null;
+ }
+
+ $newProperties[$propertyName] = $propertyValue;
+
+ }
+
+ }
+
+ return $newProperties;
+
+ }
+
+ /**
+ * This method parses the PROPFIND request and returns its information
+ *
+ * This will either be a list of properties, or an empty array; in which case
+ * an {DAV:}allprop was requested.
+ *
+ * @param string $body
+ * @return array
+ */
+ public function parsePropFindRequest($body) {
+
+ // If the propfind body was empty, it means IE is requesting 'all' properties
+ if (!$body) return array();
+
+ $dom = XMLUtil::loadDOMDocument($body);
+ $elem = $dom->getElementsByTagNameNS('urn:DAV','propfind')->item(0);
+ return array_keys(XMLUtil::parseProperties($elem));
+
+ }
+
+ // }}}
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/ServerPlugin.php b/vendor/sabre/dav/lib/Sabre/DAV/ServerPlugin.php
new file mode 100644
index 000000000..b8396abaf
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/ServerPlugin.php
@@ -0,0 +1,90 @@
+<?php
+
+namespace Sabre\DAV;
+
+/**
+ * The baseclass for all server plugins.
+ *
+ * Plugins can modify or extend the servers behaviour.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+abstract class ServerPlugin {
+
+ /**
+ * This initializes the plugin.
+ *
+ * This function is called by Sabre\DAV\Server, after
+ * addPlugin is called.
+ *
+ * This method should set up the required event subscriptions.
+ *
+ * @param Server $server
+ * @return void
+ */
+ abstract public function initialize(Server $server);
+
+ /**
+ * This method should return a list of server-features.
+ *
+ * This is for example 'versioning' and is added to the DAV: header
+ * in an OPTIONS response.
+ *
+ * @return array
+ */
+ public function getFeatures() {
+
+ return array();
+
+ }
+
+ /**
+ * Use this method to tell the server this plugin defines additional
+ * HTTP methods.
+ *
+ * This method is passed a uri. It should only return HTTP methods that are
+ * available for the specified uri.
+ *
+ * @param string $uri
+ * @return array
+ */
+ public function getHTTPMethods($uri) {
+
+ return array();
+
+ }
+
+ /**
+ * Returns a plugin name.
+ *
+ * Using this name other plugins will be able to access other plugins
+ * using \Sabre\DAV\Server::getPlugin
+ *
+ * @return string
+ */
+ public function getPluginName() {
+
+ return get_class($this);
+
+ }
+
+ /**
+ * Returns a list of reports this plugin 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
+ * implement them
+ *
+ * @param string $uri
+ * @return array
+ */
+ public function getSupportedReportSet($uri) {
+
+ return array();
+
+ }
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/SimpleCollection.php b/vendor/sabre/dav/lib/Sabre/DAV/SimpleCollection.php
new file mode 100644
index 000000000..c38c39e72
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/SimpleCollection.php
@@ -0,0 +1,108 @@
+<?php
+
+namespace Sabre\DAV;
+
+/**
+ * SimpleCollection
+ *
+ * The SimpleCollection is used to quickly setup static directory structures.
+ * Just create the object with a proper name, and add children to use it.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class SimpleCollection extends Collection {
+
+ /**
+ * List of childnodes
+ *
+ * @var array
+ */
+ protected $children = array();
+
+ /**
+ * Name of this resource
+ *
+ * @var string
+ */
+ protected $name;
+
+ /**
+ * Creates this node
+ *
+ * The name of the node must be passed, child nodes can also be passed.
+ * This nodes must be instances of INode
+ *
+ * @param string $name
+ * @param array $children
+ */
+ public function __construct($name,array $children = array()) {
+
+ $this->name = $name;
+ foreach($children as $child) {
+
+ if (!($child instanceof INode)) throw new Exception('Only instances of Sabre\DAV\INode are allowed to be passed in the children argument');
+ $this->addChild($child);
+
+ }
+
+ }
+
+ /**
+ * Adds a new childnode to this collection
+ *
+ * @param INode $child
+ * @return void
+ */
+ public function addChild(INode $child) {
+
+ $this->children[$child->getName()] = $child;
+
+ }
+
+ /**
+ * Returns the name of the collection
+ *
+ * @return string
+ */
+ public function getName() {
+
+ return $this->name;
+
+ }
+
+ /**
+ * Returns a child object, by its name.
+ *
+ * This method makes use of the getChildren method to grab all the child nodes, and compares the name.
+ * Generally its wise to override this, as this can usually be optimized
+ *
+ * This method must throw Sabre\DAV\Exception\NotFound if the node does not
+ * exist.
+ *
+ * @param string $name
+ * @throws Exception\NotFound
+ * @return INode
+ */
+ public function getChild($name) {
+
+ if (isset($this->children[$name])) return $this->children[$name];
+ throw new Exception\NotFound('File not found: ' . $name . ' in \'' . $this->getName() . '\'');
+
+ }
+
+ /**
+ * Returns a list of children for this collection
+ *
+ * @return array
+ */
+ public function getChildren() {
+
+ return array_values($this->children);
+
+ }
+
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/SimpleFile.php b/vendor/sabre/dav/lib/Sabre/DAV/SimpleFile.php
new file mode 100644
index 000000000..694207eec
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/SimpleFile.php
@@ -0,0 +1,121 @@
+<?php
+
+namespace Sabre\DAV;
+
+/**
+ * SimpleFile
+ *
+ * The 'SimpleFile' class is used to easily add read-only immutable files to
+ * the directory structure. One usecase would be to add a 'readme.txt' to a
+ * root of a webserver with some standard content.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class SimpleFile extends File {
+
+ /**
+ * File contents
+ *
+ * @var string
+ */
+ protected $contents = array();
+
+ /**
+ * Name of this resource
+ *
+ * @var string
+ */
+ protected $name;
+
+ /**
+ * A mimetype, such as 'text/plain' or 'text/html'
+ *
+ * @var string
+ */
+ protected $mimeType;
+
+ /**
+ * Creates this node
+ *
+ * The name of the node must be passed, as well as the contents of the
+ * file.
+ *
+ * @param string $name
+ * @param string $contents
+ * @param string|null $mimeType
+ */
+ public function __construct($name, $contents, $mimeType = null) {
+
+ $this->name = $name;
+ $this->contents = $contents;
+ $this->mimeType = $mimeType;
+
+ }
+
+ /**
+ * Returns the node name for this file.
+ *
+ * This name is used to construct the url.
+ *
+ * @return string
+ */
+ public function getName() {
+
+ return $this->name;
+
+ }
+
+ /**
+ * Returns the data
+ *
+ * This method may either return a string or a readable stream resource
+ *
+ * @return mixed
+ */
+ public function get() {
+
+ return $this->contents;
+
+ }
+
+ /**
+ * Returns the size of the file, in bytes.
+ *
+ * @return int
+ */
+ public function getSize() {
+
+ return strlen($this->contents);
+
+ }
+
+ /**
+ * Returns the ETag for a file
+ *
+ * An ETag is a unique identifier representing the current version of the file. If the file changes, the ETag MUST change.
+ * The ETag is an arbitrary string, but MUST be surrounded by double-quotes.
+ *
+ * Return null if the ETag can not effectively be determined
+ * @return string
+ */
+ public function getETag() {
+
+ return '"' . md5($this->contents) . '"';
+
+ }
+
+ /**
+ * Returns the mime-type for a file
+ *
+ * If null is returned, we'll assume application/octet-stream
+ * @return string
+ */
+ public function getContentType() {
+
+ return $this->mimeType;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/StringUtil.php b/vendor/sabre/dav/lib/Sabre/DAV/StringUtil.php
new file mode 100644
index 000000000..0f299bf11
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/StringUtil.php
@@ -0,0 +1,91 @@
+<?php
+
+namespace Sabre\DAV;
+
+/**
+ * String utility
+ *
+ * This class is mainly used to implement the 'text-match' filter, used by both
+ * the CalDAV calendar-query REPORT, and CardDAV addressbook-query REPORT.
+ * Because they both need it, it was decided to put it in Sabre\DAV instead.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class StringUtil {
+
+ /**
+ * Checks if a needle occurs in a haystack ;)
+ *
+ * @param string $haystack
+ * @param string $needle
+ * @param string $collation
+ * @param string $matchType
+ * @return bool
+ */
+ static public function textMatch($haystack, $needle, $collation, $matchType = 'contains') {
+
+ switch($collation) {
+
+ case 'i;ascii-casemap' :
+ // default strtolower takes locale into consideration
+ // we don't want this.
+ $haystack = str_replace(range('a','z'), range('A','Z'), $haystack);
+ $needle = str_replace(range('a','z'), range('A','Z'), $needle);
+ break;
+
+ case 'i;octet' :
+ // Do nothing
+ break;
+
+ case 'i;unicode-casemap' :
+ $haystack = mb_strtoupper($haystack, 'UTF-8');
+ $needle = mb_strtoupper($needle, 'UTF-8');
+ break;
+
+ default :
+ throw new Exception\BadRequest('Collation type: ' . $collation . ' is not supported');
+
+ }
+
+ switch($matchType) {
+
+ case 'contains' :
+ return strpos($haystack, $needle)!==false;
+ case 'equals' :
+ return $haystack === $needle;
+ case 'starts-with' :
+ return strpos($haystack, $needle)===0;
+ case 'ends-with' :
+ return strrpos($haystack, $needle)===strlen($haystack)-strlen($needle);
+ default :
+ throw new Exception\BadRequest('Match-type: ' . $matchType . ' is not supported');
+
+ }
+
+ }
+
+ /**
+ * This method takes an input string, checks if it's not valid UTF-8 and
+ * attempts to convert it to UTF-8 if it's not.
+ *
+ * Note that currently this can only convert ISO-8559-1 to UTF-8 (latin-1),
+ * anything else will likely fail.
+ *
+ * @param string $input
+ * @return string
+ */
+ static public function ensureUTF8($input) {
+
+ $encoding = mb_detect_encoding($input , array('UTF-8','ISO-8859-1'), true);
+
+ if ($encoding === 'ISO-8859-1') {
+ return utf8_encode($input);
+ } else {
+ return $input;
+ }
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/TemporaryFileFilterPlugin.php b/vendor/sabre/dav/lib/Sabre/DAV/TemporaryFileFilterPlugin.php
new file mode 100644
index 000000000..d1ae18d5b
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/TemporaryFileFilterPlugin.php
@@ -0,0 +1,289 @@
+<?php
+
+namespace Sabre\DAV;
+
+/**
+ * Temporary File Filter Plugin
+ *
+ * The purpose of this filter is to intercept some of the garbage files
+ * operation systems and applications tend to generate when mounting
+ * a WebDAV share as a disk.
+ *
+ * It will intercept these files and place them in a separate directory.
+ * these files are not deleted automatically, so it is adviceable to
+ * delete these after they are not accessed for 24 hours.
+ *
+ * Currently it supports:
+ * * OS/X style resource forks and .DS_Store
+ * * desktop.ini and Thumbs.db (windows)
+ * * .*.swp (vim temporary files)
+ * * .dat.* (smultron temporary files)
+ *
+ * Additional patterns can be added, by adding on to the
+ * temporaryFilePatterns property.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class TemporaryFileFilterPlugin extends ServerPlugin {
+
+ /**
+ * This is the list of patterns we intercept.
+ * If new patterns are added, they must be valid patterns for preg_match.
+ *
+ * @var array
+ */
+ public $temporaryFilePatterns = array(
+ '/^\._(.*)$/', // OS/X resource forks
+ '/^.DS_Store$/', // OS/X custom folder settings
+ '/^desktop.ini$/', // Windows custom folder settings
+ '/^Thumbs.db$/', // Windows thumbnail cache
+ '/^.(.*).swp$/', // ViM temporary files
+ '/^\.dat(.*)$/', // Smultron seems to create these
+ '/^~lock.(.*)#$/', // Windows 7 lockfiles
+ );
+
+ /**
+ * A reference to the main Server class
+ *
+ * @var Sabre\DAV\Server
+ */
+ protected $server;
+
+ /**
+ * This is the directory where this plugin
+ * will store it's files.
+ *
+ * @var string
+ */
+ private $dataDir;
+
+ /**
+ * Creates the plugin.
+ *
+ * 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
+ * not want that.
+ *
+ * @param string|null $dataDir
+ */
+ public function __construct($dataDir = null) {
+
+ if (!$dataDir) $dataDir = ini_get('session.save_path').'/sabredav/';
+ if (!is_dir($dataDir)) mkdir($dataDir);
+ $this->dataDir = $dataDir;
+
+ }
+
+ /**
+ * Initialize the plugin
+ *
+ * This is called automatically be the Server class after this plugin is
+ * added with Sabre\DAV\Server::addPlugin()
+ *
+ * @param Server $server
+ * @return void
+ */
+ public function initialize(Server $server) {
+
+ $this->server = $server;
+ $server->subscribeEvent('beforeMethod',array($this,'beforeMethod'));
+ $server->subscribeEvent('beforeCreateFile',array($this,'beforeCreateFile'));
+
+ }
+
+ /**
+ * This method is called before any HTTP method handler
+ *
+ * This method intercepts any GET, DELETE, PUT and PROPFIND calls to
+ * filenames that are known to match the 'temporary file' regex.
+ *
+ * @param string $method
+ * @param string $uri
+ * @return bool
+ */
+ public function beforeMethod($method, $uri) {
+
+ if (!$tempLocation = $this->isTempFile($uri))
+ return true;
+
+ switch($method) {
+ case 'GET' :
+ return $this->httpGet($tempLocation);
+ case 'PUT' :
+ return $this->httpPut($tempLocation);
+ case 'PROPFIND' :
+ return $this->httpPropfind($tempLocation, $uri);
+ case 'DELETE' :
+ return $this->httpDelete($tempLocation);
+ }
+ return true;
+
+ }
+
+ /**
+ * This method is invoked if some subsystem creates a new file.
+ *
+ * This is used to deal with HTTP LOCK requests which create a new
+ * file.
+ *
+ * @param string $uri
+ * @param resource $data
+ * @return bool
+ */
+ public function beforeCreateFile($uri,$data) {
+
+ if ($tempPath = $this->isTempFile($uri)) {
+
+ $hR = $this->server->httpResponse;
+ $hR->setHeader('X-Sabre-Temp','true');
+ file_put_contents($tempPath,$data);
+ return false;
+ }
+ return true;
+
+ }
+
+ /**
+ * This method will check if the url matches the temporary file pattern
+ * if it does, it will return an path based on $this->dataDir for the
+ * temporary file storage.
+ *
+ * @param string $path
+ * @return boolean|string
+ */
+ protected function isTempFile($path) {
+
+ // We're only interested in the basename.
+ list(, $tempPath) = URLUtil::splitPath($path);
+
+ foreach($this->temporaryFilePatterns as $tempFile) {
+
+ if (preg_match($tempFile,$tempPath)) {
+ return $this->getDataDir() . '/sabredav_' . md5($path) . '.tempfile';
+ }
+
+ }
+
+ return false;
+
+ }
+
+
+ /**
+ * This method handles the GET method for temporary files.
+ * If the file doesn't exist, it will return false which will kick in
+ * the regular system for the GET method.
+ *
+ * @param string $tempLocation
+ * @return bool
+ */
+ public function httpGet($tempLocation) {
+
+ if (!file_exists($tempLocation)) return true;
+
+ $hR = $this->server->httpResponse;
+ $hR->setHeader('Content-Type','application/octet-stream');
+ $hR->setHeader('Content-Length',filesize($tempLocation));
+ $hR->setHeader('X-Sabre-Temp','true');
+ $hR->sendStatus(200);
+ $hR->sendBody(fopen($tempLocation,'r'));
+ return false;
+
+ }
+
+ /**
+ * This method handles the PUT method.
+ *
+ * @param string $tempLocation
+ * @return bool
+ */
+ public function httpPut($tempLocation) {
+
+ $hR = $this->server->httpResponse;
+ $hR->setHeader('X-Sabre-Temp','true');
+
+ $newFile = !file_exists($tempLocation);
+
+ if (!$newFile && ($this->server->httpRequest->getHeader('If-None-Match'))) {
+ throw new Exception\PreconditionFailed('The resource already exists, and an If-None-Match header was supplied');
+ }
+
+ file_put_contents($tempLocation,$this->server->httpRequest->getBody());
+ $hR->sendStatus($newFile?201:200);
+ return false;
+
+ }
+
+ /**
+ * This method handles the DELETE method.
+ *
+ * If the file didn't exist, it will return false, which will make the
+ * standard HTTP DELETE handler kick in.
+ *
+ * @param string $tempLocation
+ * @return bool
+ */
+ public function httpDelete($tempLocation) {
+
+ if (!file_exists($tempLocation)) return true;
+
+ unlink($tempLocation);
+ $hR = $this->server->httpResponse;
+ $hR->setHeader('X-Sabre-Temp','true');
+ $hR->sendStatus(204);
+ return false;
+
+ }
+
+ /**
+ * This method handles the PROPFIND method.
+ *
+ * It's a very lazy method, it won't bother checking the request body
+ * for which properties were requested, and just sends back a default
+ * set of properties.
+ *
+ * @param string $tempLocation
+ * @param string $uri
+ * @return bool
+ */
+ public function httpPropfind($tempLocation, $uri) {
+
+ if (!file_exists($tempLocation)) return true;
+
+ $hR = $this->server->httpResponse;
+ $hR->setHeader('X-Sabre-Temp','true');
+ $hR->sendStatus(207);
+ $hR->setHeader('Content-Type','application/xml; charset=utf-8');
+
+ $this->server->parsePropFindRequest($this->server->httpRequest->getBody(true));
+
+ $properties = array(
+ 'href' => $uri,
+ 200 => array(
+ '{DAV:}getlastmodified' => new Property\GetLastModified(filemtime($tempLocation)),
+ '{DAV:}getcontentlength' => filesize($tempLocation),
+ '{DAV:}resourcetype' => new Property\ResourceType(null),
+ '{'.Server::NS_SABREDAV.'}tempFile' => true,
+
+ ),
+ );
+
+ $data = $this->server->generateMultiStatus(array($properties));
+ $hR->sendBody($data);
+ return false;
+
+ }
+
+
+ /**
+ * This method returns the directory where the temporary files should be stored.
+ *
+ * @return string
+ */
+ protected function getDataDir()
+ {
+ return $this->dataDir;
+ }
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Tree.php b/vendor/sabre/dav/lib/Sabre/DAV/Tree.php
new file mode 100644
index 000000000..af08c39f0
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Tree.php
@@ -0,0 +1,193 @@
+<?php
+
+namespace Sabre\DAV;
+
+/**
+ * Abstract tree object
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+abstract class Tree {
+
+ /**
+ * This function must return an INode object for a path
+ * If a Path doesn't exist, thrown a Exception_NotFound
+ *
+ * @param string $path
+ * @throws Exception\NotFound
+ * @return INode
+ */
+ abstract function getNodeForPath($path);
+
+ /**
+ * This function allows you to check if a node exists.
+ *
+ * Implementors of this class should override this method to make
+ * it cheaper.
+ *
+ * @param string $path
+ * @return bool
+ */
+ public function nodeExists($path) {
+
+ try {
+
+ $this->getNodeForPath($path);
+ return true;
+
+ } catch (Exception\NotFound $e) {
+
+ return false;
+
+ }
+
+ }
+
+ /**
+ * Copies a file from path to another
+ *
+ * @param string $sourcePath The source location
+ * @param string $destinationPath The full destination path
+ * @return void
+ */
+ public function copy($sourcePath, $destinationPath) {
+
+ $sourceNode = $this->getNodeForPath($sourcePath);
+
+ // grab the dirname and basename components
+ list($destinationDir, $destinationName) = URLUtil::splitPath($destinationPath);
+
+ $destinationParent = $this->getNodeForPath($destinationDir);
+ $this->copyNode($sourceNode,$destinationParent,$destinationName);
+
+ $this->markDirty($destinationDir);
+
+ }
+
+ /**
+ * Moves a file from one location to another
+ *
+ * @param string $sourcePath The path to the file which should be moved
+ * @param string $destinationPath The full destination path, so not just the destination parent node
+ * @return int
+ */
+ public function move($sourcePath, $destinationPath) {
+
+ list($sourceDir, $sourceName) = URLUtil::splitPath($sourcePath);
+ list($destinationDir, $destinationName) = URLUtil::splitPath($destinationPath);
+
+ if ($sourceDir===$destinationDir) {
+ $renameable = $this->getNodeForPath($sourcePath);
+ $renameable->setName($destinationName);
+ } else {
+ $this->copy($sourcePath,$destinationPath);
+ $this->getNodeForPath($sourcePath)->delete();
+ }
+ $this->markDirty($sourceDir);
+ $this->markDirty($destinationDir);
+
+ }
+
+ /**
+ * Deletes a node from the tree
+ *
+ * @param string $path
+ * @return void
+ */
+ public function delete($path) {
+
+ $node = $this->getNodeForPath($path);
+ $node->delete();
+
+ list($parent) = URLUtil::splitPath($path);
+ $this->markDirty($parent);
+
+ }
+
+ /**
+ * Returns a list of childnodes for a given path.
+ *
+ * @param string $path
+ * @return array
+ */
+ public function getChildren($path) {
+
+ $node = $this->getNodeForPath($path);
+ return $node->getChildren();
+
+ }
+
+ /**
+ * This method is called with every tree update
+ *
+ * Examples of tree updates are:
+ * * node deletions
+ * * node creations
+ * * copy
+ * * move
+ * * renaming nodes
+ *
+ * If Tree classes implement a form of caching, this will allow
+ * them to make sure caches will be expired.
+ *
+ * If a path is passed, it is assumed that the entire subtree is dirty
+ *
+ * @param string $path
+ * @return void
+ */
+ public function markDirty($path) {
+
+
+ }
+
+ /**
+ * copyNode
+ *
+ * @param INode $source
+ * @param ICollection $destinationParent
+ * @param string $destinationName
+ * @return void
+ */
+ protected function copyNode(INode $source,ICollection $destinationParent,$destinationName = null) {
+
+ if (!$destinationName) $destinationName = $source->getName();
+
+ if ($source instanceof IFile) {
+
+ $data = $source->get();
+
+ // If the body was a string, we need to convert it to a stream
+ if (is_string($data)) {
+ $stream = fopen('php://temp','r+');
+ fwrite($stream,$data);
+ rewind($stream);
+ $data = $stream;
+ }
+ $destinationParent->createFile($destinationName,$data);
+ $destination = $destinationParent->getChild($destinationName);
+
+ } elseif ($source instanceof ICollection) {
+
+ $destinationParent->createDirectory($destinationName);
+
+ $destination = $destinationParent->getChild($destinationName);
+ foreach($source->getChildren() as $child) {
+
+ $this->copyNode($child,$destination);
+
+ }
+
+ }
+ if ($source instanceof IProperties && $destination instanceof IProperties) {
+
+ $props = $source->getProperties(array());
+ $destination->updateProperties($props);
+
+ }
+
+ }
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Tree/Filesystem.php b/vendor/sabre/dav/lib/Sabre/DAV/Tree/Filesystem.php
new file mode 100644
index 000000000..9004f678a
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Tree/Filesystem.php
@@ -0,0 +1,133 @@
+<?php
+
+namespace Sabre\DAV\Tree;
+
+use Sabre\DAV;
+
+/**
+ * FileSystem Tree
+ *
+ * This class is an alternative to the standard ObjectTree. This tree can only
+ * use Sabre\DAV\FS\Directory and File classes, but as a result it allows for a few
+ * optimizations that otherwise wouldn't be possible.
+ *
+ * Specifically copying and moving are much, much faster.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Filesystem extends DAV\Tree {
+
+ /**
+ * Base url on the filesystem.
+ *
+ * @var string
+ */
+ protected $basePath;
+
+ /**
+ * Creates this tree
+ *
+ * Supply the path you'd like to share.
+ *
+ * @param string $basePath
+ */
+ public function __construct($basePath) {
+
+ $this->basePath = $basePath;
+
+ }
+
+ /**
+ * Returns a new node for the given path
+ *
+ * @param string $path
+ * @return DAV\FS\Node
+ */
+ public function getNodeForPath($path) {
+
+ $realPath = $this->getRealPath($path);
+ if (!file_exists($realPath)) {
+ throw new DAV\Exception\NotFound('File at location ' . $realPath . ' not found');
+ }
+ if (is_dir($realPath)) {
+ return new DAV\FS\Directory($realPath);
+ } else {
+ return new DAV\FS\File($realPath);
+ }
+
+ }
+
+ /**
+ * Returns the real filesystem path for a webdav url.
+ *
+ * @param string $publicPath
+ * @return string
+ */
+ protected function getRealPath($publicPath) {
+
+ return rtrim($this->basePath,'/') . '/' . trim($publicPath,'/');
+
+ }
+
+ /**
+ * Copies a file or directory.
+ *
+ * This method must work recursively and delete the destination
+ * if it exists
+ *
+ * @param string $source
+ * @param string $destination
+ * @return void
+ */
+ public function copy($source,$destination) {
+
+ $source = $this->getRealPath($source);
+ $destination = $this->getRealPath($destination);
+ $this->realCopy($source,$destination);
+
+ }
+
+ /**
+ * Used by self::copy
+ *
+ * @param string $source
+ * @param string $destination
+ * @return void
+ */
+ protected function realCopy($source,$destination) {
+
+ if (is_file($source)) {
+ copy($source,$destination);
+ } else {
+ mkdir($destination);
+ foreach(scandir($source) as $subnode) {
+
+ if ($subnode=='.' || $subnode=='..') continue;
+ $this->realCopy($source.'/'.$subnode,$destination.'/'.$subnode);
+
+ }
+ }
+
+ }
+
+ /**
+ * Moves a file or directory recursively.
+ *
+ * If the destination exists, delete it first.
+ *
+ * @param string $source
+ * @param string $destination
+ * @return void
+ */
+ public function move($source,$destination) {
+
+ $source = $this->getRealPath($source);
+ $destination = $this->getRealPath($destination);
+ rename($source,$destination);
+
+ }
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/URLUtil.php b/vendor/sabre/dav/lib/Sabre/DAV/URLUtil.php
new file mode 100644
index 000000000..b71ea003d
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/URLUtil.php
@@ -0,0 +1,121 @@
+<?php
+
+namespace Sabre\DAV;
+
+/**
+ * URL utility class
+ *
+ * This class provides methods to deal with encoding and decoding url (percent encoded) strings.
+ *
+ * It was not possible to use PHP's built-in methods for this, because some clients don't like
+ * encoding of certain characters.
+ *
+ * Specifically, it was found that GVFS (gnome's webdav client) does not like encoding of ( and
+ * ). Since these are reserved, but don't have a reserved meaning in url, these characters are
+ * kept as-is.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class URLUtil {
+
+ /**
+ * Encodes the path of a url.
+ *
+ * slashes (/) are treated as path-separators.
+ *
+ * @param string $path
+ * @return string
+ */
+ static function encodePath($path) {
+
+ return preg_replace_callback('/([^A-Za-z0-9_\-\.~\(\)\/])/',function($match) {
+
+ return '%'.sprintf('%02x',ord($match[0]));
+
+ }, $path);
+
+ }
+
+ /**
+ * Encodes a 1 segment of a path
+ *
+ * Slashes are considered part of the name, and are encoded as %2f
+ *
+ * @param string $pathSegment
+ * @return string
+ */
+ static function encodePathSegment($pathSegment) {
+
+ return preg_replace_callback('/([^A-Za-z0-9_\-\.~\(\)])/',function($match) {
+
+ return '%'.sprintf('%02x',ord($match[0]));
+
+ }, $pathSegment);
+ }
+
+ /**
+ * Decodes a url-encoded path
+ *
+ * @param string $path
+ * @return string
+ */
+ static function decodePath($path) {
+
+ return self::decodePathSegment($path);
+
+ }
+
+ /**
+ * Decodes a url-encoded path segment
+ *
+ * @param string $path
+ * @return string
+ */
+ static function decodePathSegment($path) {
+
+ $path = rawurldecode($path);
+ $encoding = mb_detect_encoding($path, array('UTF-8','ISO-8859-1'));
+
+ switch($encoding) {
+
+ case 'ISO-8859-1' :
+ $path = utf8_encode($path);
+
+ }
+
+ return $path;
+
+ }
+
+ /**
+ * Returns the 'dirname' and 'basename' for a path.
+ *
+ * The reason there is a custom function for this purpose, is because
+ * basename() is locale aware (behaviour changes if C locale or a UTF-8 locale is used)
+ * and we need a method that just operates on UTF-8 characters.
+ *
+ * In addition basename and dirname are platform aware, and will treat backslash (\) as a
+ * directory separator on windows.
+ *
+ * This method returns the 2 components as an array.
+ *
+ * If there is no dirname, it will return an empty string. Any / appearing at the end of the
+ * string is stripped off.
+ *
+ * @param string $path
+ * @return array
+ */
+ static function splitPath($path) {
+
+ $matches = array();
+ if(preg_match('/^(?:(?:(.*)(?:\/+))?([^\/]+))(?:\/?)$/u',$path,$matches)) {
+ return array($matches[1],$matches[2]);
+ } else {
+ return array(null,null);
+ }
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/UUIDUtil.php b/vendor/sabre/dav/lib/Sabre/DAV/UUIDUtil.php
new file mode 100644
index 000000000..e6b78fac6
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/UUIDUtil.php
@@ -0,0 +1,64 @@
+<?php
+
+namespace Sabre\DAV;
+
+/**
+ * UUID Utility
+ *
+ * This class has static methods to generate and validate UUID's.
+ * UUIDs are used a decent amount within various *DAV standards, so it made
+ * sense to include it.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class UUIDUtil {
+
+ /**
+ * Returns a pseudo-random v4 UUID
+ *
+ * This function is based on a comment by Andrew Moore on php.net
+ *
+ * @see http://www.php.net/manual/en/function.uniqid.php#94959
+ * @return string
+ */
+ static function getUUID() {
+
+ return sprintf( '%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
+ // 32 bits for "time_low"
+ mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ),
+
+ // 16 bits for "time_mid"
+ mt_rand( 0, 0xffff ),
+
+ // 16 bits for "time_hi_and_version",
+ // four most significant bits holds version number 4
+ mt_rand( 0, 0x0fff ) | 0x4000,
+
+ // 16 bits, 8 bits for "clk_seq_hi_res",
+ // 8 bits for "clk_seq_low",
+ // two most significant bits holds zero and one for variant DCE1.1
+ mt_rand( 0, 0x3fff ) | 0x8000,
+
+ // 48 bits for "node"
+ mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff )
+ );
+ }
+
+ /**
+ * Checks if a string is a valid UUID.
+ *
+ * @param string $uuid
+ * @return bool
+ */
+ static function validateUUID($uuid) {
+
+ return preg_match(
+ '/^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/i',
+ $uuid
+ ) == true;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Version.php b/vendor/sabre/dav/lib/Sabre/DAV/Version.php
new file mode 100644
index 000000000..c82bc17e3
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Version.php
@@ -0,0 +1,24 @@
+<?php
+
+namespace Sabre\DAV;
+
+/**
+ * This class contains the SabreDAV version constants.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Version {
+
+ /**
+ * Full version number
+ */
+ const VERSION = '1.8.7';
+
+ /**
+ * Stability : alpha, beta, stable
+ */
+ const STABILITY = 'stable';
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/XMLUtil.php b/vendor/sabre/dav/lib/Sabre/DAV/XMLUtil.php
new file mode 100644
index 000000000..298398da0
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/XMLUtil.php
@@ -0,0 +1,187 @@
+<?php
+
+namespace Sabre\DAV;
+
+/**
+ * XML utilities for WebDAV
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class XMLUtil {
+
+ /**
+ * Returns the 'clark notation' for an element.
+ *
+ * For example, and element encoded as:
+ * <b:myelem xmlns:b="http://www.example.org/" />
+ * will be returned as:
+ * {http://www.example.org}myelem
+ *
+ * This format is used throughout the SabreDAV sourcecode.
+ * Elements encoded with the urn:DAV namespace will
+ * be returned as if they were in the DAV: namespace. This is to avoid
+ * compatibility problems.
+ *
+ * This function will return null if a nodetype other than an Element is passed.
+ *
+ * @param \DOMNode $dom
+ * @return string
+ */
+ static function toClarkNotation(\DOMNode $dom) {
+
+ if ($dom->nodeType !== XML_ELEMENT_NODE) return null;
+
+ // Mapping back to the real namespace, in case it was dav
+ if ($dom->namespaceURI=='urn:DAV') $ns = 'DAV:'; else $ns = $dom->namespaceURI;
+
+ // Mapping to clark notation
+ return '{' . $ns . '}' . $dom->localName;
+
+ }
+
+ /**
+ * Parses a clark-notation string, and returns the namespace and element
+ * name components.
+ *
+ * If the string was invalid, it will throw an InvalidArgumentException.
+ *
+ * @param string $str
+ * @throws InvalidArgumentException
+ * @return array
+ */
+ static function parseClarkNotation($str) {
+
+ if (!preg_match('/^{([^}]*)}(.*)$/',$str,$matches)) {
+ throw new \InvalidArgumentException('\'' . $str . '\' is not a valid clark-notation formatted string');
+ }
+
+ return array(
+ $matches[1],
+ $matches[2]
+ );
+
+ }
+
+ /**
+ * This method takes an XML document (as string) and converts all instances of the
+ * DAV: namespace to urn:DAV
+ *
+ * This is unfortunately needed, because the DAV: namespace violates the xml namespaces
+ * spec, and causes the DOM to throw errors
+ *
+ * @param string $xmlDocument
+ * @return array|string|null
+ */
+ static function convertDAVNamespace($xmlDocument) {
+
+ // This is used to map the DAV: namespace to urn:DAV. This is needed, because the DAV:
+ // namespace is actually a violation of the XML namespaces specification, and will cause errors
+ return preg_replace("/xmlns(:[A-Za-z0-9_]*)?=(\"|\')DAV:(\\2)/","xmlns\\1=\\2urn:DAV\\2",$xmlDocument);
+
+ }
+
+ /**
+ * This method provides a generic way to load a DOMDocument for WebDAV use.
+ *
+ * This method throws a Sabre\DAV\Exception\BadRequest exception for any xml errors.
+ * It does not preserve whitespace, and it converts the DAV: namespace to urn:DAV.
+ *
+ * @param string $xml
+ * @throws Sabre\DAV\Exception\BadRequest
+ * @return DOMDocument
+ */
+ static function loadDOMDocument($xml) {
+
+ if (empty($xml))
+ throw new Exception\BadRequest('Empty XML document sent');
+
+ // The BitKinex client sends xml documents as UTF-16. PHP 5.3.1 (and presumably lower)
+ // does not support this, so we must intercept this and convert to UTF-8.
+ if (substr($xml,0,12) === "\x3c\x00\x3f\x00\x78\x00\x6d\x00\x6c\x00\x20\x00") {
+
+ // Note: the preceeding byte sequence is "<?xml" encoded as UTF_16, without the BOM.
+ $xml = iconv('UTF-16LE','UTF-8',$xml);
+
+ // Because the xml header might specify the encoding, we must also change this.
+ // This regex looks for the string encoding="UTF-16" and replaces it with
+ // encoding="UTF-8".
+ $xml = preg_replace('|<\?xml([^>]*)encoding="UTF-16"([^>]*)>|u','<?xml\1encoding="UTF-8"\2>',$xml);
+
+ }
+
+ // Retaining old error setting
+ $oldErrorSetting = libxml_use_internal_errors(true);
+
+ // Clearing any previous errors
+ libxml_clear_errors();
+
+ $dom = new \DOMDocument();
+
+ // We don't generally care about any whitespace
+ $dom->preserveWhiteSpace = false;
+
+ $dom->loadXML(self::convertDAVNamespace($xml),LIBXML_NOWARNING | LIBXML_NOERROR);
+
+ if ($error = libxml_get_last_error()) {
+ libxml_clear_errors();
+ throw new Exception\BadRequest('The request body had an invalid XML body. (message: ' . $error->message . ', errorcode: ' . $error->code . ', line: ' . $error->line . ')');
+ }
+
+ // Restoring old mechanism for error handling
+ if ($oldErrorSetting===false) libxml_use_internal_errors(false);
+
+ return $dom;
+
+ }
+
+ /**
+ * Parses all WebDAV properties out of a DOM Element
+ *
+ * Generally WebDAV properties are enclosed in {DAV:}prop elements. This
+ * method helps by going through all these and pulling out the actual
+ * propertynames, making them array keys and making the property values,
+ * well.. the array values.
+ *
+ * If no value was given (self-closing element) null will be used as the
+ * value. This is used in for example PROPFIND requests.
+ *
+ * Complex values are supported through the propertyMap argument. The
+ * propertyMap should have the clark-notation properties as it's keys, and
+ * classnames as values.
+ *
+ * When any of these properties are found, the unserialize() method will be
+ * (statically) called. The result of this method is used as the value.
+ *
+ * @param \DOMElement $parentNode
+ * @param array $propertyMap
+ * @return array
+ */
+ static function parseProperties(\DOMElement $parentNode, array $propertyMap = array()) {
+
+ $propList = array();
+ foreach($parentNode->childNodes as $propNode) {
+
+ if (self::toClarkNotation($propNode)!=='{DAV:}prop') continue;
+
+ foreach($propNode->childNodes as $propNodeData) {
+
+ /* If there are no elements in here, we actually get 1 text node, this special case is dedicated to netdrive */
+ if ($propNodeData->nodeType != XML_ELEMENT_NODE) continue;
+
+ $propertyName = self::toClarkNotation($propNodeData);
+ if (isset($propertyMap[$propertyName])) {
+ $propList[$propertyName] = call_user_func(array($propertyMap[$propertyName],'unserialize'),$propNodeData);
+ } else {
+ $propList[$propertyName] = $propNodeData->textContent;
+ }
+ }
+
+
+ }
+ return $propList;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAVACL/AbstractPrincipalCollection.php b/vendor/sabre/dav/lib/Sabre/DAVACL/AbstractPrincipalCollection.php
new file mode 100644
index 000000000..3f9a080d4
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAVACL/AbstractPrincipalCollection.php
@@ -0,0 +1,155 @@
+<?php
+
+namespace Sabre\DAVACL;
+use Sabre\DAV;
+
+/**
+ * Principals Collection
+ *
+ * This is a helper class that easily allows you to create a collection that
+ * has a childnode for every principal.
+ *
+ * To use this class, simply implement the getChildForPrincipal method.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+abstract class AbstractPrincipalCollection extends DAV\Collection implements IPrincipalCollection {
+
+ /**
+ * Node or 'directory' name.
+ *
+ * @var string
+ */
+ protected $path;
+
+ /**
+ * Principal backend
+ *
+ * @var PrincipalBackend\BackendInterface
+ */
+ protected $principalBackend;
+
+ /**
+ * If this value is set to true, it effectively disables listing of users
+ * it still allows user to find other users if they have an exact url.
+ *
+ * @var bool
+ */
+ public $disableListing = false;
+
+ /**
+ * Creates the object
+ *
+ * This object must be passed the principal backend. This object will
+ * filter all principals from a specified prefix ($principalPrefix). The
+ * default is 'principals', if your principals are stored in a different
+ * collection, override $principalPrefix
+ *
+ *
+ * @param PrincipalBackend\BackendInterface $principalBackend
+ * @param string $principalPrefix
+ */
+ public function __construct(PrincipalBackend\BackendInterface $principalBackend, $principalPrefix = 'principals') {
+
+ $this->principalPrefix = $principalPrefix;
+ $this->principalBackend = $principalBackend;
+
+ }
+
+ /**
+ * This method returns a node for a principal.
+ *
+ * The passed array contains principal information, and is guaranteed to
+ * at least contain a uri item. Other properties may or may not be
+ * supplied by the authentication backend.
+ *
+ * @param array $principalInfo
+ * @return IPrincipal
+ */
+ abstract function getChildForPrincipal(array $principalInfo);
+
+ /**
+ * Returns the name of this collection.
+ *
+ * @return string
+ */
+ public function getName() {
+
+ list(,$name) = DAV\URLUtil::splitPath($this->principalPrefix);
+ return $name;
+
+ }
+
+ /**
+ * Return the list of users
+ *
+ * @return array
+ */
+ public function getChildren() {
+
+ if ($this->disableListing)
+ throw new DAV\Exception\MethodNotAllowed('Listing members of this collection is disabled');
+
+ $children = array();
+ foreach($this->principalBackend->getPrincipalsByPrefix($this->principalPrefix) as $principalInfo) {
+
+ $children[] = $this->getChildForPrincipal($principalInfo);
+
+
+ }
+ return $children;
+
+ }
+
+ /**
+ * Returns a child object, by its name.
+ *
+ * @param string $name
+ * @throws DAV\Exception\NotFound
+ * @return IPrincipal
+ */
+ public function getChild($name) {
+
+ $principalInfo = $this->principalBackend->getPrincipalByPath($this->principalPrefix . '/' . $name);
+ if (!$principalInfo) throw new DAV\Exception\NotFound('Principal with name ' . $name . ' not found');
+ return $this->getChildForPrincipal($principalInfo);
+
+ }
+
+ /**
+ * This method is used to search for principals matching a set of
+ * properties.
+ *
+ * This search is specifically used by RFC3744's principal-property-search
+ * REPORT. You should at least allow searching on
+ * http://sabredav.org/ns}email-address.
+ *
+ * The actual search should be a unicode-non-case-sensitive search. The
+ * keys in searchProperties are the WebDAV property names, while the values
+ * are the property values to search on.
+ *
+ * If multiple properties are being searched on, the search should be
+ * AND'ed.
+ *
+ * This method should simply return a list of 'child names', which may be
+ * used to call $this->getChild in the future.
+ *
+ * @param array $searchProperties
+ * @return array
+ */
+ public function searchPrincipals(array $searchProperties) {
+
+ $result = $this->principalBackend->searchPrincipals($this->principalPrefix, $searchProperties);
+ $r = array();
+
+ foreach($result as $row) {
+ list(, $r[]) = DAV\URLUtil::splitPath($row);
+ }
+
+ return $r;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAVACL/Exception/AceConflict.php b/vendor/sabre/dav/lib/Sabre/DAVACL/Exception/AceConflict.php
new file mode 100644
index 000000000..25c8b7f4c
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAVACL/Exception/AceConflict.php
@@ -0,0 +1,35 @@
+<?php
+
+namespace Sabre\DAVACL\Exception;
+
+use Sabre\DAV;
+
+/**
+ * This exception is thrown when a client attempts to set conflicting
+ * permissions.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class AceConflict extends DAV\Exception\Conflict {
+
+ /**
+ * Adds in extra information in the xml response.
+ *
+ * This method adds the {DAV:}no-ace-conflict element as defined in rfc3744
+ *
+ * @param DAV\Server $server
+ * @param \DOMElement $errorNode
+ * @return void
+ */
+ public function serialize(DAV\Server $server,\DOMElement $errorNode) {
+
+ $doc = $errorNode->ownerDocument;
+
+ $np = $doc->createElementNS('DAV:','d:no-ace-conflict');
+ $errorNode->appendChild($np);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAVACL/Exception/NeedPrivileges.php b/vendor/sabre/dav/lib/Sabre/DAVACL/Exception/NeedPrivileges.php
new file mode 100644
index 000000000..5ec4a8e88
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAVACL/Exception/NeedPrivileges.php
@@ -0,0 +1,83 @@
+<?php
+
+namespace Sabre\DAVACL\Exception;
+
+use Sabre\DAV;
+
+/**
+ * NeedPrivileges
+ *
+ * The 403-need privileges is thrown when a user didn't have the appropriate
+ * permissions to perform an operation
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class NeedPrivileges extends DAV\Exception\Forbidden {
+
+ /**
+ * The relevant uri
+ *
+ * @var string
+ */
+ protected $uri;
+
+ /**
+ * The privileges the user didn't have.
+ *
+ * @var array
+ */
+ protected $privileges;
+
+ /**
+ * Constructor
+ *
+ * @param string $uri
+ * @param array $privileges
+ */
+ public function __construct($uri,array $privileges) {
+
+ $this->uri = $uri;
+ $this->privileges = $privileges;
+
+ parent::__construct('User did not have the required privileges (' . implode(',', $privileges) . ') for path "' . $uri . '"');
+
+ }
+
+ /**
+ * Adds in extra information in the xml response.
+ *
+ * This method adds the {DAV:}need-privileges element as defined in rfc3744
+ *
+ * @param DAV\Server $server
+ * @param \DOMElement $errorNode
+ * @return void
+ */
+ public function serialize(DAV\Server $server,\DOMElement $errorNode) {
+
+ $doc = $errorNode->ownerDocument;
+
+ $np = $doc->createElementNS('DAV:','d:need-privileges');
+ $errorNode->appendChild($np);
+
+ foreach($this->privileges as $privilege) {
+
+ $resource = $doc->createElementNS('DAV:','d:resource');
+ $np->appendChild($resource);
+
+ $resource->appendChild($doc->createElementNS('DAV:','d:href',$server->getBaseUri() . $this->uri));
+
+ $priv = $doc->createElementNS('DAV:','d:privilege');
+ $resource->appendChild($priv);
+
+ preg_match('/^{([^}]*)}(.*)$/',$privilege,$privilegeParts);
+ $priv->appendChild($doc->createElementNS($privilegeParts[1],'d:' . $privilegeParts[2]));
+
+
+ }
+
+ }
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/DAVACL/Exception/NoAbstract.php b/vendor/sabre/dav/lib/Sabre/DAVACL/Exception/NoAbstract.php
new file mode 100644
index 000000000..836153ef1
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAVACL/Exception/NoAbstract.php
@@ -0,0 +1,35 @@
+<?php
+
+namespace Sabre\DAVACL\Exception;
+
+use Sabre\DAV;
+
+/**
+ * This exception is thrown when a user tries to set a privilege that's marked
+ * as abstract.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class NoAbstract extends DAV\Exception\PreconditionFailed {
+
+ /**
+ * Adds in extra information in the xml response.
+ *
+ * This method adds the {DAV:}no-abstract element as defined in rfc3744
+ *
+ * @param DAV\Server $server
+ * @param \DOMElement $errorNode
+ * @return void
+ */
+ public function serialize(DAV\Server $server,\DOMElement $errorNode) {
+
+ $doc = $errorNode->ownerDocument;
+
+ $np = $doc->createElementNS('DAV:','d:no-abstract');
+ $errorNode->appendChild($np);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAVACL/Exception/NotRecognizedPrincipal.php b/vendor/sabre/dav/lib/Sabre/DAVACL/Exception/NotRecognizedPrincipal.php
new file mode 100644
index 000000000..753945b3d
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAVACL/Exception/NotRecognizedPrincipal.php
@@ -0,0 +1,35 @@
+<?php
+
+namespace Sabre\DAVACL\Exception;
+
+use Sabre\DAV;
+
+/**
+ * If a client tried to set a privilege assigned to a non-existant principal,
+ * this exception will be thrown.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class NotRecognizedPrincipal extends DAV\Exception\PreconditionFailed {
+
+ /**
+ * Adds in extra information in the xml response.
+ *
+ * This method adds the {DAV:}recognized-principal element as defined in rfc3744
+ *
+ * @param DAV\Server $server
+ * @param \DOMElement $errorNode
+ * @return void
+ */
+ public function serialize(DAV\Server $server,\DOMElement $errorNode) {
+
+ $doc = $errorNode->ownerDocument;
+
+ $np = $doc->createElementNS('DAV:','d:recognized-principal');
+ $errorNode->appendChild($np);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAVACL/Exception/NotSupportedPrivilege.php b/vendor/sabre/dav/lib/Sabre/DAVACL/Exception/NotSupportedPrivilege.php
new file mode 100644
index 000000000..aa976334f
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAVACL/Exception/NotSupportedPrivilege.php
@@ -0,0 +1,35 @@
+<?php
+
+namespace Sabre\DAVACL\Exception;
+
+use Sabre\DAV;
+
+/**
+ * If a client tried to set a privilege that doesn't exist, this exception will
+ * be thrown.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class NotSupportedPrivilege extends DAV\Exception\PreconditionFailed {
+
+ /**
+ * Adds in extra information in the xml response.
+ *
+ * This method adds the {DAV:}not-supported-privilege element as defined in rfc3744
+ *
+ * @param DAV\Server $server
+ * @param \DOMElement $errorNode
+ * @return void
+ */
+ public function serialize(DAV\Server $server,\DOMElement $errorNode) {
+
+ $doc = $errorNode->ownerDocument;
+
+ $np = $doc->createElementNS('DAV:','d:not-supported-privilege');
+ $errorNode->appendChild($np);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAVACL/IACL.php b/vendor/sabre/dav/lib/Sabre/DAVACL/IACL.php
new file mode 100644
index 000000000..2fbfb5463
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAVACL/IACL.php
@@ -0,0 +1,74 @@
+<?php
+
+namespace Sabre\DAVACL;
+use Sabre\DAV;
+
+/**
+ * ACL-enabled node
+ *
+ * If you want to add WebDAV ACL to a node, you must implement this class
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+interface IACL extends DAV\INode {
+
+ /**
+ * Returns the owner principal
+ *
+ * This must be a url to a principal, or null if there's no owner
+ *
+ * @return string|null
+ */
+ function getOwner();
+
+ /**
+ * Returns a group principal
+ *
+ * This must be a url to a principal, or null if there's no owner
+ *
+ * @return string|null
+ */
+ function getGroup();
+
+ /**
+ * Returns a list of ACE's for this node.
+ *
+ * Each ACE has the following properties:
+ * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are
+ * currently the only supported privileges
+ * * 'principal', a url to the principal who owns the node
+ * * 'protected' (optional), indicating that this ACE is not allowed to
+ * be updated.
+ *
+ * @return array
+ */
+ function getACL();
+
+ /**
+ * Updates the ACL
+ *
+ * This method will receive a list of new ACE's as an array argument.
+ *
+ * @param array $acl
+ * @return void
+ */
+ function setACL(array $acl);
+
+ /**
+ * Returns the list of supported privileges for this node.
+ *
+ * The returned data structure is a list of nested privileges.
+ * See Sabre\DAVACL\Plugin::getDefaultSupportedPrivilegeSet for a simple
+ * standard structure.
+ *
+ * If null is returned from this method, the default privilege set is used,
+ * which is fine for most common usecases.
+ *
+ * @return array|null
+ */
+ function getSupportedPrivilegeSet();
+
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAVACL/IPrincipal.php b/vendor/sabre/dav/lib/Sabre/DAVACL/IPrincipal.php
new file mode 100644
index 000000000..87e3f4ec5
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAVACL/IPrincipal.php
@@ -0,0 +1,77 @@
+<?php
+
+namespace Sabre\DAVACL;
+
+use Sabre\DAV;
+
+/**
+ * IPrincipal interface
+ *
+ * Implement this interface to define your own principals
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+interface IPrincipal extends DAV\INode {
+
+ /**
+ * Returns a list of alternative urls for a principal
+ *
+ * This can for example be an email address, or ldap url.
+ *
+ * @return array
+ */
+ function getAlternateUriSet();
+
+ /**
+ * Returns the full principal url
+ *
+ * @return string
+ */
+ function getPrincipalUrl();
+
+ /**
+ * Returns the list of group members
+ *
+ * If this principal is a group, this function should return
+ * all member principal uri's for the group.
+ *
+ * @return array
+ */
+ function getGroupMemberSet();
+
+ /**
+ * Returns the list of groups this principal is member of
+ *
+ * If this principal is a member of a (list of) groups, this function
+ * should return a list of principal uri's for it's members.
+ *
+ * @return array
+ */
+ function getGroupMembership();
+
+ /**
+ * Sets a list of group members
+ *
+ * If this principal is a group, this method sets all the group members.
+ * The list of members is always overwritten, never appended to.
+ *
+ * This method should throw an exception if the members could not be set.
+ *
+ * @param array $principals
+ * @return void
+ */
+ function setGroupMemberSet(array $principals);
+
+ /**
+ * Returns the displayname
+ *
+ * This should be a human readable name for the principal.
+ * If none is available, return the nodename.
+ *
+ * @return string
+ */
+ function getDisplayName();
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAVACL/IPrincipalCollection.php b/vendor/sabre/dav/lib/Sabre/DAVACL/IPrincipalCollection.php
new file mode 100644
index 000000000..33ffd3317
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAVACL/IPrincipalCollection.php
@@ -0,0 +1,42 @@
+<?php
+
+namespace Sabre\DAVACL;
+
+use Sabre\DAV;
+
+/**
+ * Principal Collection interface.
+ *
+ * Implement this interface to ensure that your principal collection can be
+ * searched using the principal-property-search REPORT.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+interface IPrincipalCollection extends DAV\INode {
+
+ /**
+ * This method is used to search for principals matching a set of
+ * properties.
+ *
+ * This search is specifically used by RFC3744's principal-property-search
+ * REPORT. You should at least allow searching on
+ * http://sabredav.org/ns}email-address.
+ *
+ * The actual search should be a unicode-non-case-sensitive search. The
+ * keys in searchProperties are the WebDAV property names, while the values
+ * are the property values to search on.
+ *
+ * If multiple properties are being searched on, the search should be
+ * AND'ed.
+ *
+ * This method should simply return a list of 'child names', which may be
+ * used to call $this->getChild in the future.
+ *
+ * @param array $searchProperties
+ * @return array
+ */
+ function searchPrincipals(array $searchProperties);
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAVACL/Plugin.php b/vendor/sabre/dav/lib/Sabre/DAVACL/Plugin.php
new file mode 100644
index 000000000..1609d942f
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAVACL/Plugin.php
@@ -0,0 +1,1402 @@
+<?php
+
+namespace Sabre\DAVACL;
+use Sabre\DAV;
+
+/**
+ * SabreDAV ACL Plugin
+ *
+ * This plugin provides functionality to enforce ACL permissions.
+ * ACL is defined in RFC3744.
+ *
+ * In addition it also provides support for the {DAV:}current-user-principal
+ * property, defined in RFC5397 and the {DAV:}expand-property report, as
+ * defined in RFC3253.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Plugin extends DAV\ServerPlugin {
+
+ /**
+ * Recursion constants
+ *
+ * This only checks the base node
+ */
+ const R_PARENT = 1;
+
+ /**
+ * Recursion constants
+ *
+ * This checks every node in the tree
+ */
+ const R_RECURSIVE = 2;
+
+ /**
+ * Recursion constants
+ *
+ * This checks every parentnode in the tree, but not leaf-nodes.
+ */
+ const R_RECURSIVEPARENTS = 3;
+
+ /**
+ * Reference to server object.
+ *
+ * @var Sabre\DAV\Server
+ */
+ protected $server;
+
+ /**
+ * List of urls containing principal collections.
+ * Modify this if your principals are located elsewhere.
+ *
+ * @var array
+ */
+ public $principalCollectionSet = array(
+ 'principals',
+ );
+
+ /**
+ * By default ACL is only enforced for nodes that have ACL support (the
+ * ones that implement IACL). For any other node, access is
+ * always granted.
+ *
+ * To override this behaviour you can turn this setting off. This is useful
+ * if you plan to fully support ACL in the entire tree.
+ *
+ * @var bool
+ */
+ public $allowAccessToNodesWithoutACL = true;
+
+ /**
+ * By default nodes that are inaccessible by the user, can still be seen
+ * in directory listings (PROPFIND on parent with Depth: 1)
+ *
+ * In certain cases it's desirable to hide inaccessible nodes. Setting this
+ * to true will cause these nodes to be hidden from directory listings.
+ *
+ * @var bool
+ */
+ public $hideNodesFromListings = false;
+
+ /**
+ * This string is prepended to the username of the currently logged in
+ * user. This allows the plugin to determine the principal path based on
+ * the username.
+ *
+ * @var string
+ */
+ public $defaultUsernamePath = 'principals';
+
+ /**
+ * This list of properties are the properties a client can search on using
+ * the {DAV:}principal-property-search report.
+ *
+ * The keys are the property names, values are descriptions.
+ *
+ * @var array
+ */
+ public $principalSearchPropertySet = array(
+ '{DAV:}displayname' => 'Display name',
+ '{http://sabredav.org/ns}email-address' => 'Email address',
+ );
+
+ /**
+ * Any principal uri's added here, will automatically be added to the list
+ * of ACL's. They will effectively receive {DAV:}all privileges, as a
+ * protected privilege.
+ *
+ * @var array
+ */
+ public $adminPrincipals = array();
+
+ /**
+ * Returns a list of features added by this plugin.
+ *
+ * This list is used in the response of a HTTP OPTIONS request.
+ *
+ * @return array
+ */
+ public function getFeatures() {
+
+ return array('access-control', 'calendarserver-principal-property-search');
+
+ }
+
+ /**
+ * Returns a list of available methods for a given url
+ *
+ * @param string $uri
+ * @return array
+ */
+ public function getMethods($uri) {
+
+ return array('ACL');
+
+ }
+
+ /**
+ * Returns a plugin name.
+ *
+ * Using this name other plugins will be able to access other plugins
+ * using Sabre\DAV\Server::getPlugin
+ *
+ * @return string
+ */
+ public function getPluginName() {
+
+ return 'acl';
+
+ }
+
+ /**
+ * Returns a list of reports this plugin 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
+ * implement them
+ *
+ * @param string $uri
+ * @return array
+ */
+ public function getSupportedReportSet($uri) {
+
+ return array(
+ '{DAV:}expand-property',
+ '{DAV:}principal-property-search',
+ '{DAV:}principal-search-property-set',
+ );
+
+ }
+
+
+ /**
+ * Checks if the current user has the specified privilege(s).
+ *
+ * You can specify a single privilege, or a list of privileges.
+ * This method will throw an exception if the privilege is not available
+ * and return true otherwise.
+ *
+ * @param string $uri
+ * @param array|string $privileges
+ * @param int $recursion
+ * @param bool $throwExceptions if set to false, this method won't throw exceptions.
+ * @throws Sabre\DAVACL\Exception\NeedPrivileges
+ * @return bool
+ */
+ public function checkPrivileges($uri, $privileges, $recursion = self::R_PARENT, $throwExceptions = true) {
+
+ if (!is_array($privileges)) $privileges = array($privileges);
+
+ $acl = $this->getCurrentUserPrivilegeSet($uri);
+
+ if (is_null($acl)) {
+ if ($this->allowAccessToNodesWithoutACL) {
+ return true;
+ } else {
+ if ($throwExceptions)
+ throw new Exception\NeedPrivileges($uri,$privileges);
+ else
+ return false;
+
+ }
+ }
+
+ $failed = array();
+ foreach($privileges as $priv) {
+
+ if (!in_array($priv, $acl)) {
+ $failed[] = $priv;
+ }
+
+ }
+
+ if ($failed) {
+ if ($throwExceptions)
+ throw new Exception\NeedPrivileges($uri,$failed);
+ else
+ return false;
+ }
+ return true;
+
+ }
+
+ /**
+ * Returns the standard users' principal.
+ *
+ * This is one authorative principal url for the current user.
+ * This method will return null if the user wasn't logged in.
+ *
+ * @return string|null
+ */
+ public function getCurrentUserPrincipal() {
+
+ $authPlugin = $this->server->getPlugin('auth');
+ if (is_null($authPlugin)) return null;
+ /** @var $authPlugin Sabre\DAV\Auth\Plugin */
+
+ $userName = $authPlugin->getCurrentUser();
+ if (!$userName) return null;
+
+ return $this->defaultUsernamePath . '/' . $userName;
+
+ }
+
+
+ /**
+ * Returns a list of principals that's associated to the current
+ * user, either directly or through group membership.
+ *
+ * @return array
+ */
+ public function getCurrentUserPrincipals() {
+
+ $currentUser = $this->getCurrentUserPrincipal();
+
+ if (is_null($currentUser)) return array();
+
+ return array_merge(
+ array($currentUser),
+ $this->getPrincipalMembership($currentUser)
+ );
+
+ }
+
+ /**
+ * This array holds a cache for all the principals that are associated with
+ * a single principal.
+ *
+ * @var array
+ */
+ protected $principalMembershipCache = array();
+
+
+ /**
+ * Returns all the principal groups the specified principal is a member of.
+ *
+ * @param string $principal
+ * @return array
+ */
+ public function getPrincipalMembership($mainPrincipal) {
+
+ // First check our cache
+ if (isset($this->principalMembershipCache[$mainPrincipal])) {
+ return $this->principalMembershipCache[$mainPrincipal];
+ }
+
+ $check = array($mainPrincipal);
+ $principals = array();
+
+ while(count($check)) {
+
+ $principal = array_shift($check);
+
+ $node = $this->server->tree->getNodeForPath($principal);
+ if ($node instanceof IPrincipal) {
+ foreach($node->getGroupMembership() as $groupMember) {
+
+ if (!in_array($groupMember, $principals)) {
+
+ $check[] = $groupMember;
+ $principals[] = $groupMember;
+
+ }
+
+ }
+
+ }
+
+ }
+
+ // Store the result in the cache
+ $this->principalMembershipCache[$mainPrincipal] = $principals;
+
+ return $principals;
+
+ }
+
+ /**
+ * Returns the supported privilege structure for this ACL plugin.
+ *
+ * See RFC3744 for more details. Currently we default on a simple,
+ * standard structure.
+ *
+ * You can either get the list of privileges by a uri (path) or by
+ * specifying a Node.
+ *
+ * @param string|DAV\INode $node
+ * @return array
+ */
+ public function getSupportedPrivilegeSet($node) {
+
+ if (is_string($node)) {
+ $node = $this->server->tree->getNodeForPath($node);
+ }
+
+ if ($node instanceof IACL) {
+ $result = $node->getSupportedPrivilegeSet();
+
+ if ($result)
+ return $result;
+ }
+
+ return self::getDefaultSupportedPrivilegeSet();
+
+ }
+
+ /**
+ * Returns a fairly standard set of privileges, which may be useful for
+ * other systems to use as a basis.
+ *
+ * @return array
+ */
+ static function getDefaultSupportedPrivilegeSet() {
+
+ return array(
+ 'privilege' => '{DAV:}all',
+ 'abstract' => true,
+ 'aggregates' => array(
+ array(
+ 'privilege' => '{DAV:}read',
+ 'aggregates' => array(
+ array(
+ 'privilege' => '{DAV:}read-acl',
+ 'abstract' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}read-current-user-privilege-set',
+ 'abstract' => true,
+ ),
+ ),
+ ), // {DAV:}read
+ array(
+ 'privilege' => '{DAV:}write',
+ 'aggregates' => array(
+ array(
+ 'privilege' => '{DAV:}write-acl',
+ 'abstract' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}write-properties',
+ 'abstract' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}write-content',
+ 'abstract' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}bind',
+ 'abstract' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}unbind',
+ 'abstract' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}unlock',
+ 'abstract' => true,
+ ),
+ ),
+ ), // {DAV:}write
+ ),
+ ); // {DAV:}all
+
+ }
+
+ /**
+ * Returns the supported privilege set as a flat list
+ *
+ * This is much easier to parse.
+ *
+ * The returned list will be index by privilege name.
+ * The value is a struct containing the following properties:
+ * - aggregates
+ * - abstract
+ * - concrete
+ *
+ * @param string|DAV\INode $node
+ * @return array
+ */
+ final public function getFlatPrivilegeSet($node) {
+
+ $privs = $this->getSupportedPrivilegeSet($node);
+
+ $flat = array();
+ $this->getFPSTraverse($privs, null, $flat);
+
+ return $flat;
+
+ }
+
+ /**
+ * Traverses the privilege set tree for reordering
+ *
+ * This function is solely used by getFlatPrivilegeSet, and would have been
+ * a closure if it wasn't for the fact I need to support PHP 5.2.
+ *
+ * @param array $priv
+ * @param $concrete
+ * @param array $flat
+ * @return void
+ */
+ final private function getFPSTraverse($priv, $concrete, &$flat) {
+
+ $myPriv = array(
+ 'privilege' => $priv['privilege'],
+ 'abstract' => isset($priv['abstract']) && $priv['abstract'],
+ 'aggregates' => array(),
+ 'concrete' => isset($priv['abstract']) && $priv['abstract']?$concrete:$priv['privilege'],
+ );
+
+ if (isset($priv['aggregates']))
+ foreach($priv['aggregates'] as $subPriv) $myPriv['aggregates'][] = $subPriv['privilege'];
+
+ $flat[$priv['privilege']] = $myPriv;
+
+ if (isset($priv['aggregates'])) {
+
+ foreach($priv['aggregates'] as $subPriv) {
+
+ $this->getFPSTraverse($subPriv, $myPriv['concrete'], $flat);
+
+ }
+
+ }
+
+ }
+
+ /**
+ * Returns the full ACL list.
+ *
+ * Either a uri or a DAV\INode may be passed.
+ *
+ * null will be returned if the node doesn't support ACLs.
+ *
+ * @param string|DAV\INode $node
+ * @return array
+ */
+ public function getACL($node) {
+
+ if (is_string($node)) {
+ $node = $this->server->tree->getNodeForPath($node);
+ }
+ if (!$node instanceof IACL) {
+ return null;
+ }
+ $acl = $node->getACL();
+ foreach($this->adminPrincipals as $adminPrincipal) {
+ $acl[] = array(
+ 'principal' => $adminPrincipal,
+ 'privilege' => '{DAV:}all',
+ 'protected' => true,
+ );
+ }
+ return $acl;
+
+ }
+
+ /**
+ * Returns a list of privileges the current user has
+ * on a particular node.
+ *
+ * Either a uri or a DAV\INode may be passed.
+ *
+ * null will be returned if the node doesn't support ACLs.
+ *
+ * @param string|DAV\INode $node
+ * @return array
+ */
+ public function getCurrentUserPrivilegeSet($node) {
+
+ if (is_string($node)) {
+ $node = $this->server->tree->getNodeForPath($node);
+ }
+
+ $acl = $this->getACL($node);
+
+ if (is_null($acl)) return null;
+
+ $principals = $this->getCurrentUserPrincipals();
+
+ $collected = array();
+
+ foreach($acl as $ace) {
+
+ $principal = $ace['principal'];
+
+ switch($principal) {
+
+ case '{DAV:}owner' :
+ $owner = $node->getOwner();
+ if ($owner && in_array($owner, $principals)) {
+ $collected[] = $ace;
+ }
+ break;
+
+
+ // 'all' matches for every user
+ case '{DAV:}all' :
+
+ // 'authenticated' matched for every user that's logged in.
+ // Since it's not possible to use ACL while not being logged
+ // in, this is also always true.
+ case '{DAV:}authenticated' :
+ $collected[] = $ace;
+ break;
+
+ // 'unauthenticated' can never occur either, so we simply
+ // ignore these.
+ case '{DAV:}unauthenticated' :
+ break;
+
+ default :
+ if (in_array($ace['principal'], $principals)) {
+ $collected[] = $ace;
+ }
+ break;
+
+ }
+
+
+ }
+
+ // Now we deduct all aggregated privileges.
+ $flat = $this->getFlatPrivilegeSet($node);
+
+ $collected2 = array();
+ while(count($collected)) {
+
+ $current = array_pop($collected);
+ $collected2[] = $current['privilege'];
+
+ foreach($flat[$current['privilege']]['aggregates'] as $subPriv) {
+ $collected2[] = $subPriv;
+ $collected[] = $flat[$subPriv];
+ }
+
+ }
+
+ return array_values(array_unique($collected2));
+
+ }
+
+ /**
+ * Principal property search
+ *
+ * This method can search for principals matching certain values in
+ * properties.
+ *
+ * This method will return a list of properties for the matched properties.
+ *
+ * @param array $searchProperties The properties to search on. This is a
+ * key-value list. The keys are property
+ * names, and the values the strings to
+ * match them on.
+ * @param array $requestedProperties This is the list of properties to
+ * return for every match.
+ * @param string $collectionUri The principal collection to search on.
+ * If this is ommitted, the standard
+ * principal collection-set will be used.
+ * @return array This method returns an array structure similar to
+ * Sabre\DAV\Server::getPropertiesForPath. Returned
+ * properties are index by a HTTP status code.
+ *
+ */
+ public function principalSearch(array $searchProperties, array $requestedProperties, $collectionUri = null) {
+
+ if (!is_null($collectionUri)) {
+ $uris = array($collectionUri);
+ } else {
+ $uris = $this->principalCollectionSet;
+ }
+
+ $lookupResults = array();
+ foreach($uris as $uri) {
+
+ $principalCollection = $this->server->tree->getNodeForPath($uri);
+ if (!$principalCollection instanceof IPrincipalCollection) {
+ // Not a principal collection, we're simply going to ignore
+ // this.
+ continue;
+ }
+
+ $results = $principalCollection->searchPrincipals($searchProperties);
+ foreach($results as $result) {
+ $lookupResults[] = rtrim($uri,'/') . '/' . $result;
+ }
+
+ }
+
+ $matches = array();
+
+ foreach($lookupResults as $lookupResult) {
+
+ list($matches[]) = $this->server->getPropertiesForPath($lookupResult, $requestedProperties, 0);
+
+ }
+
+ return $matches;
+
+ }
+
+ /**
+ * Sets up the plugin
+ *
+ * This method is automatically called by the server class.
+ *
+ * @param DAV\Server $server
+ * @return void
+ */
+ public function initialize(DAV\Server $server) {
+
+ $this->server = $server;
+ $server->subscribeEvent('beforeGetProperties',array($this,'beforeGetProperties'));
+
+ $server->subscribeEvent('beforeMethod', array($this,'beforeMethod'),20);
+ $server->subscribeEvent('beforeBind', array($this,'beforeBind'),20);
+ $server->subscribeEvent('beforeUnbind', array($this,'beforeUnbind'),20);
+ $server->subscribeEvent('updateProperties',array($this,'updateProperties'));
+ $server->subscribeEvent('beforeUnlock', array($this,'beforeUnlock'),20);
+ $server->subscribeEvent('report',array($this,'report'));
+ $server->subscribeEvent('unknownMethod', array($this, 'unknownMethod'));
+
+ array_push($server->protectedProperties,
+ '{DAV:}alternate-URI-set',
+ '{DAV:}principal-URL',
+ '{DAV:}group-membership',
+ '{DAV:}principal-collection-set',
+ '{DAV:}current-user-principal',
+ '{DAV:}supported-privilege-set',
+ '{DAV:}current-user-privilege-set',
+ '{DAV:}acl',
+ '{DAV:}acl-restrictions',
+ '{DAV:}inherited-acl-set',
+ '{DAV:}owner',
+ '{DAV:}group'
+ );
+
+ // Automatically mapping nodes implementing IPrincipal to the
+ // {DAV:}principal resourcetype.
+ $server->resourceTypeMapping['Sabre\\DAVACL\\IPrincipal'] = '{DAV:}principal';
+
+ // Mapping the group-member-set property to the HrefList property
+ // class.
+ $server->propertyMap['{DAV:}group-member-set'] = 'Sabre\\DAV\\Property\\HrefList';
+
+ }
+
+
+ /* {{{ Event handlers */
+
+ /**
+ * Triggered before any method is handled
+ *
+ * @param string $method
+ * @param string $uri
+ * @return void
+ */
+ public function beforeMethod($method, $uri) {
+
+ $exists = $this->server->tree->nodeExists($uri);
+
+ // If the node doesn't exists, none of these checks apply
+ if (!$exists) return;
+
+ switch($method) {
+
+ case 'GET' :
+ case 'HEAD' :
+ case 'OPTIONS' :
+ // For these 3 we only need to know if the node is readable.
+ $this->checkPrivileges($uri,'{DAV:}read');
+ break;
+
+ case 'PUT' :
+ case 'LOCK' :
+ case 'UNLOCK' :
+ // This method requires the write-content priv if the node
+ // already exists, and bind on the parent if the node is being
+ // created.
+ // The bind privilege is handled in the beforeBind event.
+ $this->checkPrivileges($uri,'{DAV:}write-content');
+ break;
+
+
+ case 'PROPPATCH' :
+ $this->checkPrivileges($uri,'{DAV:}write-properties');
+ break;
+
+ case 'ACL' :
+ $this->checkPrivileges($uri,'{DAV:}write-acl');
+ break;
+
+ case 'COPY' :
+ case 'MOVE' :
+ // Copy requires read privileges on the entire source tree.
+ // If the target exists write-content normally needs to be
+ // checked, however, we're deleting the node beforehand and
+ // creating a new one after, so this is handled by the
+ // beforeUnbind event.
+ //
+ // The creation of the new node is handled by the beforeBind
+ // event.
+ //
+ // If MOVE is used beforeUnbind will also be used to check if
+ // the sourcenode can be deleted.
+ $this->checkPrivileges($uri,'{DAV:}read',self::R_RECURSIVE);
+
+ break;
+
+ }
+
+ }
+
+ /**
+ * Triggered before a new node is created.
+ *
+ * This allows us to check permissions for any operation that creates a
+ * new node, such as PUT, MKCOL, MKCALENDAR, LOCK, COPY and MOVE.
+ *
+ * @param string $uri
+ * @return void
+ */
+ public function beforeBind($uri) {
+
+ list($parentUri,$nodeName) = DAV\URLUtil::splitPath($uri);
+ $this->checkPrivileges($parentUri,'{DAV:}bind');
+
+ }
+
+ /**
+ * Triggered before a node is deleted
+ *
+ * This allows us to check permissions for any operation that will delete
+ * an existing node.
+ *
+ * @param string $uri
+ * @return void
+ */
+ public function beforeUnbind($uri) {
+
+ list($parentUri,$nodeName) = DAV\URLUtil::splitPath($uri);
+ $this->checkPrivileges($parentUri,'{DAV:}unbind',self::R_RECURSIVEPARENTS);
+
+ }
+
+ /**
+ * Triggered before a node is unlocked.
+ *
+ * @param string $uri
+ * @param DAV\Locks\LockInfo $lock
+ * @TODO: not yet implemented
+ * @return void
+ */
+ public function beforeUnlock($uri, DAV\Locks\LockInfo $lock) {
+
+
+ }
+
+ /**
+ * Triggered before properties are looked up in specific nodes.
+ *
+ * @param string $uri
+ * @param DAV\INode $node
+ * @param array $requestedProperties
+ * @param array $returnedProperties
+ * @TODO really should be broken into multiple methods, or even a class.
+ * @return bool
+ */
+ public function beforeGetProperties($uri, DAV\INode $node, &$requestedProperties, &$returnedProperties) {
+
+ // Checking the read permission
+ if (!$this->checkPrivileges($uri,'{DAV:}read',self::R_PARENT,false)) {
+
+ // User is not allowed to read properties
+ if ($this->hideNodesFromListings) {
+ return false;
+ }
+
+ // Marking all requested properties as '403'.
+ foreach($requestedProperties as $key=>$requestedProperty) {
+ unset($requestedProperties[$key]);
+ $returnedProperties[403][$requestedProperty] = null;
+ }
+ return;
+
+ }
+
+ /* Adding principal properties */
+ if ($node instanceof IPrincipal) {
+
+ if (false !== ($index = array_search('{DAV:}alternate-URI-set', $requestedProperties))) {
+
+ unset($requestedProperties[$index]);
+ $returnedProperties[200]['{DAV:}alternate-URI-set'] = new DAV\Property\HrefList($node->getAlternateUriSet());
+
+ }
+ if (false !== ($index = array_search('{DAV:}principal-URL', $requestedProperties))) {
+
+ unset($requestedProperties[$index]);
+ $returnedProperties[200]['{DAV:}principal-URL'] = new DAV\Property\Href($node->getPrincipalUrl() . '/');
+
+ }
+ if (false !== ($index = array_search('{DAV:}group-member-set', $requestedProperties))) {
+
+ unset($requestedProperties[$index]);
+ $returnedProperties[200]['{DAV:}group-member-set'] = new DAV\Property\HrefList($node->getGroupMemberSet());
+
+ }
+ if (false !== ($index = array_search('{DAV:}group-membership', $requestedProperties))) {
+
+ unset($requestedProperties[$index]);
+ $returnedProperties[200]['{DAV:}group-membership'] = new DAV\Property\HrefList($node->getGroupMembership());
+
+ }
+
+ if (false !== ($index = array_search('{DAV:}displayname', $requestedProperties))) {
+
+ $returnedProperties[200]['{DAV:}displayname'] = $node->getDisplayName();
+
+ }
+
+ }
+ if (false !== ($index = array_search('{DAV:}principal-collection-set', $requestedProperties))) {
+
+ unset($requestedProperties[$index]);
+ $val = $this->principalCollectionSet;
+ // Ensuring all collections end with a slash
+ foreach($val as $k=>$v) $val[$k] = $v . '/';
+ $returnedProperties[200]['{DAV:}principal-collection-set'] = new DAV\Property\HrefList($val);
+
+ }
+ if (false !== ($index = array_search('{DAV:}current-user-principal', $requestedProperties))) {
+
+ unset($requestedProperties[$index]);
+ if ($url = $this->getCurrentUserPrincipal()) {
+ $returnedProperties[200]['{DAV:}current-user-principal'] = new Property\Principal(Property\Principal::HREF, $url . '/');
+ } else {
+ $returnedProperties[200]['{DAV:}current-user-principal'] = new Property\Principal(Property\Principal::UNAUTHENTICATED);
+ }
+
+ }
+ if (false !== ($index = array_search('{DAV:}supported-privilege-set', $requestedProperties))) {
+
+ unset($requestedProperties[$index]);
+ $returnedProperties[200]['{DAV:}supported-privilege-set'] = new Property\SupportedPrivilegeSet($this->getSupportedPrivilegeSet($node));
+
+ }
+ if (false !== ($index = array_search('{DAV:}current-user-privilege-set', $requestedProperties))) {
+
+ if (!$this->checkPrivileges($uri, '{DAV:}read-current-user-privilege-set', self::R_PARENT, false)) {
+ $returnedProperties[403]['{DAV:}current-user-privilege-set'] = null;
+ unset($requestedProperties[$index]);
+ } else {
+ $val = $this->getCurrentUserPrivilegeSet($node);
+ if (!is_null($val)) {
+ unset($requestedProperties[$index]);
+ $returnedProperties[200]['{DAV:}current-user-privilege-set'] = new Property\CurrentUserPrivilegeSet($val);
+ }
+ }
+
+ }
+
+ /* The ACL property contains all the permissions */
+ if (false !== ($index = array_search('{DAV:}acl', $requestedProperties))) {
+
+ if (!$this->checkPrivileges($uri, '{DAV:}read-acl', self::R_PARENT, false)) {
+
+ unset($requestedProperties[$index]);
+ $returnedProperties[403]['{DAV:}acl'] = null;
+
+ } else {
+
+ $acl = $this->getACL($node);
+ if (!is_null($acl)) {
+ unset($requestedProperties[$index]);
+ $returnedProperties[200]['{DAV:}acl'] = new Property\Acl($this->getACL($node));
+ }
+
+ }
+
+ }
+
+ /* The acl-restrictions property contains information on how privileges
+ * must behave.
+ */
+ if (false !== ($index = array_search('{DAV:}acl-restrictions', $requestedProperties))) {
+ unset($requestedProperties[$index]);
+ $returnedProperties[200]['{DAV:}acl-restrictions'] = new Property\AclRestrictions();
+ }
+
+ /* Adding ACL properties */
+ if ($node instanceof IACL) {
+
+ if (false !== ($index = array_search('{DAV:}owner', $requestedProperties))) {
+
+ unset($requestedProperties[$index]);
+ $returnedProperties[200]['{DAV:}owner'] = new DAV\Property\Href($node->getOwner() . '/');
+
+ }
+
+ }
+
+ }
+
+ /**
+ * This method intercepts PROPPATCH methods and make sure the
+ * group-member-set is updated correctly.
+ *
+ * @param array $propertyDelta
+ * @param array $result
+ * @param DAV\INode $node
+ * @return bool
+ */
+ public function updateProperties(&$propertyDelta, &$result, DAV\INode $node) {
+
+ if (!array_key_exists('{DAV:}group-member-set', $propertyDelta))
+ return;
+
+ if (is_null($propertyDelta['{DAV:}group-member-set'])) {
+ $memberSet = array();
+ } elseif ($propertyDelta['{DAV:}group-member-set'] instanceof DAV\Property\HrefList) {
+ $memberSet = array_map(
+ array($this->server,'calculateUri'),
+ $propertyDelta['{DAV:}group-member-set']->getHrefs()
+ );
+ } else {
+ throw new DAV\Exception('The group-member-set property MUST be an instance of Sabre\DAV\Property\HrefList or null');
+ }
+
+ if (!($node instanceof IPrincipal)) {
+ $result[403]['{DAV:}group-member-set'] = null;
+ unset($propertyDelta['{DAV:}group-member-set']);
+
+ // Returning false will stop the updateProperties process
+ return false;
+ }
+
+ $node->setGroupMemberSet($memberSet);
+ // We must also clear our cache, just in case
+
+ $this->principalMembershipCache = array();
+
+ $result[200]['{DAV:}group-member-set'] = null;
+ unset($propertyDelta['{DAV:}group-member-set']);
+
+ }
+
+ /**
+ * This method handles HTTP REPORT requests
+ *
+ * @param string $reportName
+ * @param \DOMNode $dom
+ * @return bool
+ */
+ public function report($reportName, $dom) {
+
+ switch($reportName) {
+
+ case '{DAV:}principal-property-search' :
+ $this->principalPropertySearchReport($dom);
+ return false;
+ case '{DAV:}principal-search-property-set' :
+ $this->principalSearchPropertySetReport($dom);
+ return false;
+ case '{DAV:}expand-property' :
+ $this->expandPropertyReport($dom);
+ return false;
+
+ }
+
+ }
+
+ /**
+ * This event is triggered for any HTTP method that is not known by the
+ * webserver.
+ *
+ * @param string $method
+ * @param string $uri
+ * @return bool
+ */
+ public function unknownMethod($method, $uri) {
+
+ if ($method!=='ACL') return;
+
+ $this->httpACL($uri);
+ return false;
+
+ }
+
+ /**
+ * This method is responsible for handling the 'ACL' event.
+ *
+ * @param string $uri
+ * @return void
+ */
+ public function httpACL($uri) {
+
+ $body = $this->server->httpRequest->getBody(true);
+ $dom = DAV\XMLUtil::loadDOMDocument($body);
+
+ $newAcl =
+ Property\Acl::unserialize($dom->firstChild)
+ ->getPrivileges();
+
+ // Normalizing urls
+ foreach($newAcl as $k=>$newAce) {
+ $newAcl[$k]['principal'] = $this->server->calculateUri($newAce['principal']);
+ }
+
+ $node = $this->server->tree->getNodeForPath($uri);
+
+ if (!($node instanceof IACL)) {
+ throw new DAV\Exception\MethodNotAllowed('This node does not support the ACL method');
+ }
+
+ $oldAcl = $this->getACL($node);
+
+ $supportedPrivileges = $this->getFlatPrivilegeSet($node);
+
+ /* Checking if protected principals from the existing principal set are
+ not overwritten. */
+ foreach($oldAcl as $oldAce) {
+
+ if (!isset($oldAce['protected']) || !$oldAce['protected']) continue;
+
+ $found = false;
+ foreach($newAcl as $newAce) {
+ if (
+ $newAce['privilege'] === $oldAce['privilege'] &&
+ $newAce['principal'] === $oldAce['principal'] &&
+ $newAce['protected']
+ )
+ $found = true;
+ }
+
+ if (!$found)
+ throw new Exception\AceConflict('This resource contained a protected {DAV:}ace, but this privilege did not occur in the ACL request');
+
+ }
+
+ foreach($newAcl as $newAce) {
+
+ // Do we recognize the privilege
+ if (!isset($supportedPrivileges[$newAce['privilege']])) {
+ throw new Exception\NotSupportedPrivilege('The privilege you specified (' . $newAce['privilege'] . ') is not recognized by this server');
+ }
+
+ if ($supportedPrivileges[$newAce['privilege']]['abstract']) {
+ throw new Exception\NoAbstract('The privilege you specified (' . $newAce['privilege'] . ') is an abstract privilege');
+ }
+
+ // Looking up the principal
+ try {
+ $principal = $this->server->tree->getNodeForPath($newAce['principal']);
+ } catch (DAV\Exception\NotFound $e) {
+ throw new Exception\NotRecognizedPrincipal('The specified principal (' . $newAce['principal'] . ') does not exist');
+ }
+ if (!($principal instanceof IPrincipal)) {
+ throw new Exception\NotRecognizedPrincipal('The specified uri (' . $newAce['principal'] . ') is not a principal');
+ }
+
+ }
+ $node->setACL($newAcl);
+
+ }
+
+ /* }}} */
+
+ /* Reports {{{ */
+
+ /**
+ * The expand-property report is defined in RFC3253 section 3-8.
+ *
+ * This report is very similar to a standard PROPFIND. The difference is
+ * that it has the additional ability to look at properties containing a
+ * {DAV:}href element, follow that property and grab additional elements
+ * there.
+ *
+ * Other rfc's, such as ACL rely on this report, so it made sense to put
+ * it in this plugin.
+ *
+ * @param \DOMElement $dom
+ * @return void
+ */
+ protected function expandPropertyReport($dom) {
+
+ $requestedProperties = $this->parseExpandPropertyReportRequest($dom->firstChild->firstChild);
+ $depth = $this->server->getHTTPDepth(0);
+ $requestUri = $this->server->getRequestUri();
+
+ $result = $this->expandProperties($requestUri,$requestedProperties,$depth);
+
+ $dom = new \DOMDocument('1.0','utf-8');
+ $dom->formatOutput = true;
+ $multiStatus = $dom->createElement('d:multistatus');
+ $dom->appendChild($multiStatus);
+
+ // Adding in default namespaces
+ foreach($this->server->xmlNamespaces as $namespace=>$prefix) {
+
+ $multiStatus->setAttribute('xmlns:' . $prefix,$namespace);
+
+ }
+
+ foreach($result as $response) {
+ $response->serialize($this->server, $multiStatus);
+ }
+
+ $xml = $dom->saveXML();
+ $this->server->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8');
+ $this->server->httpResponse->sendStatus(207);
+ $this->server->httpResponse->sendBody($xml);
+
+ }
+
+ /**
+ * This method is used by expandPropertyReport to parse
+ * out the entire HTTP request.
+ *
+ * @param \DOMElement $node
+ * @return array
+ */
+ protected function parseExpandPropertyReportRequest($node) {
+
+ $requestedProperties = array();
+ do {
+
+ if (DAV\XMLUtil::toClarkNotation($node)!=='{DAV:}property') continue;
+
+ if ($node->firstChild) {
+
+ $children = $this->parseExpandPropertyReportRequest($node->firstChild);
+
+ } else {
+
+ $children = array();
+
+ }
+
+ $namespace = $node->getAttribute('namespace');
+ if (!$namespace) $namespace = 'DAV:';
+
+ $propName = '{'.$namespace.'}' . $node->getAttribute('name');
+ $requestedProperties[$propName] = $children;
+
+ } while ($node = $node->nextSibling);
+
+ return $requestedProperties;
+
+ }
+
+ /**
+ * This method expands all the properties and returns
+ * a list with property values
+ *
+ * @param array $path
+ * @param array $requestedProperties the list of required properties
+ * @param int $depth
+ * @return array
+ */
+ protected function expandProperties($path, array $requestedProperties, $depth) {
+
+ $foundProperties = $this->server->getPropertiesForPath($path, array_keys($requestedProperties), $depth);
+
+ $result = array();
+
+ foreach($foundProperties as $node) {
+
+ foreach($requestedProperties as $propertyName=>$childRequestedProperties) {
+
+ // We're only traversing if sub-properties were requested
+ if(count($childRequestedProperties)===0) continue;
+
+ // We only have to do the expansion if the property was found
+ // and it contains an href element.
+ if (!array_key_exists($propertyName,$node[200])) continue;
+
+ if ($node[200][$propertyName] instanceof DAV\Property\IHref) {
+ $hrefs = array($node[200][$propertyName]->getHref());
+ } elseif ($node[200][$propertyName] instanceof DAV\Property\HrefList) {
+ $hrefs = $node[200][$propertyName]->getHrefs();
+ }
+
+ $childProps = array();
+ foreach($hrefs as $href) {
+ $childProps = array_merge($childProps, $this->expandProperties($href, $childRequestedProperties, 0));
+ }
+ $node[200][$propertyName] = new DAV\Property\ResponseList($childProps);
+
+ }
+ $result[] = new DAV\Property\Response($node['href'], $node);
+
+ }
+
+ return $result;
+
+ }
+
+ /**
+ * principalSearchPropertySetReport
+ *
+ * This method responsible for handing the
+ * {DAV:}principal-search-property-set report. This report returns a list
+ * of properties the client may search on, using the
+ * {DAV:}principal-property-search report.
+ *
+ * @param \DOMDocument $dom
+ * @return void
+ */
+ protected function principalSearchPropertySetReport(\DOMDocument $dom) {
+
+ $httpDepth = $this->server->getHTTPDepth(0);
+ if ($httpDepth!==0) {
+ throw new DAV\Exception\BadRequest('This report is only defined when Depth: 0');
+ }
+
+ if ($dom->firstChild->hasChildNodes())
+ throw new DAV\Exception\BadRequest('The principal-search-property-set report element is not allowed to have child elements');
+
+ $dom = new \DOMDocument('1.0','utf-8');
+ $dom->formatOutput = true;
+ $root = $dom->createElement('d:principal-search-property-set');
+ $dom->appendChild($root);
+ // Adding in default namespaces
+ foreach($this->server->xmlNamespaces as $namespace=>$prefix) {
+
+ $root->setAttribute('xmlns:' . $prefix,$namespace);
+
+ }
+
+ $nsList = $this->server->xmlNamespaces;
+
+ foreach($this->principalSearchPropertySet as $propertyName=>$description) {
+
+ $psp = $dom->createElement('d:principal-search-property');
+ $root->appendChild($psp);
+
+ $prop = $dom->createElement('d:prop');
+ $psp->appendChild($prop);
+
+ $propName = null;
+ preg_match('/^{([^}]*)}(.*)$/',$propertyName,$propName);
+
+ $currentProperty = $dom->createElement($nsList[$propName[1]] . ':' . $propName[2]);
+ $prop->appendChild($currentProperty);
+
+ $descriptionElem = $dom->createElement('d:description');
+ $descriptionElem->setAttribute('xml:lang','en');
+ $descriptionElem->appendChild($dom->createTextNode($description));
+ $psp->appendChild($descriptionElem);
+
+
+ }
+
+ $this->server->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8');
+ $this->server->httpResponse->sendStatus(200);
+ $this->server->httpResponse->sendBody($dom->saveXML());
+
+ }
+
+ /**
+ * principalPropertySearchReport
+ *
+ * This method is responsible for handing the
+ * {DAV:}principal-property-search report. This report can be used for
+ * clients to search for groups of principals, based on the value of one
+ * or more properties.
+ *
+ * @param \DOMDocument $dom
+ * @return void
+ */
+ protected function principalPropertySearchReport(\DOMDocument $dom) {
+
+ list($searchProperties, $requestedProperties, $applyToPrincipalCollectionSet) = $this->parsePrincipalPropertySearchReportRequest($dom);
+
+ $uri = null;
+ if (!$applyToPrincipalCollectionSet) {
+ $uri = $this->server->getRequestUri();
+ }
+ $result = $this->principalSearch($searchProperties, $requestedProperties, $uri);
+
+ $prefer = $this->server->getHTTPPRefer();
+
+ $this->server->httpResponse->sendStatus(207);
+ $this->server->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8');
+ $this->server->httpResponse->setHeader('Vary','Brief,Prefer');
+ $this->server->httpResponse->sendBody($this->server->generateMultiStatus($result, $prefer['return-minimal']));
+
+ }
+
+ /**
+ * parsePrincipalPropertySearchReportRequest
+ *
+ * This method parses the request body from a
+ * {DAV:}principal-property-search report.
+ *
+ * This method returns an array with two elements:
+ * 1. an array with properties to search on, and their values
+ * 2. a list of propertyvalues that should be returned for the request.
+ *
+ * @param \DOMDocument $dom
+ * @return array
+ */
+ protected function parsePrincipalPropertySearchReportRequest($dom) {
+
+ $httpDepth = $this->server->getHTTPDepth(0);
+ if ($httpDepth!==0) {
+ throw new DAV\Exception\BadRequest('This report is only defined when Depth: 0');
+ }
+
+ $searchProperties = array();
+
+ $applyToPrincipalCollectionSet = false;
+
+ // Parsing the search request
+ foreach($dom->firstChild->childNodes as $searchNode) {
+
+ if (DAV\XMLUtil::toClarkNotation($searchNode) == '{DAV:}apply-to-principal-collection-set') {
+ $applyToPrincipalCollectionSet = true;
+ }
+
+ if (DAV\XMLUtil::toClarkNotation($searchNode)!=='{DAV:}property-search')
+ continue;
+
+ $propertyName = null;
+ $propertyValue = null;
+
+ foreach($searchNode->childNodes as $childNode) {
+
+ switch(DAV\XMLUtil::toClarkNotation($childNode)) {
+
+ case '{DAV:}prop' :
+ $property = DAV\XMLUtil::parseProperties($searchNode);
+ reset($property);
+ $propertyName = key($property);
+ break;
+
+ case '{DAV:}match' :
+ $propertyValue = $childNode->textContent;
+ break;
+
+ }
+
+
+ }
+
+ if (is_null($propertyName) || is_null($propertyValue))
+ throw new DAV\Exception\BadRequest('Invalid search request. propertyname: ' . $propertyName . '. propertvvalue: ' . $propertyValue);
+
+ $searchProperties[$propertyName] = $propertyValue;
+
+ }
+
+ return array($searchProperties, array_keys(DAV\XMLUtil::parseProperties($dom->firstChild)), $applyToPrincipalCollectionSet);
+
+ }
+
+
+ /* }}} */
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAVACL/Principal.php b/vendor/sabre/dav/lib/Sabre/DAVACL/Principal.php
new file mode 100644
index 000000000..267100212
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAVACL/Principal.php
@@ -0,0 +1,281 @@
+<?php
+
+namespace Sabre\DAVACL;
+
+use Sabre\DAV;
+
+/**
+ * Principal class
+ *
+ * This class is a representation of a simple principal
+ *
+ * Many WebDAV specs require a user to show up in the directory
+ * structure.
+ *
+ * This principal also has basic ACL settings, only allowing the principal
+ * access it's own principal.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Principal extends DAV\Node implements IPrincipal, DAV\IProperties, IACL {
+
+ /**
+ * Struct with principal information.
+ *
+ * @var array
+ */
+ protected $principalProperties;
+
+ /**
+ * Principal backend
+ *
+ * @var PrincipalBackend\BackendInterface
+ */
+ protected $principalBackend;
+
+ /**
+ * Creates the principal object
+ *
+ * @param IPrincipalBackend $principalBackend
+ * @param array $principalProperties
+ */
+ public function __construct(PrincipalBackend\BackendInterface $principalBackend, array $principalProperties = array()) {
+
+ if (!isset($principalProperties['uri'])) {
+ throw new DAV\Exception('The principal properties must at least contain the \'uri\' key');
+ }
+ $this->principalBackend = $principalBackend;
+ $this->principalProperties = $principalProperties;
+
+ }
+
+ /**
+ * Returns the full principal url
+ *
+ * @return string
+ */
+ public function getPrincipalUrl() {
+
+ return $this->principalProperties['uri'];
+
+ }
+
+ /**
+ * Returns a list of alternative urls for a principal
+ *
+ * This can for example be an email address, or ldap url.
+ *
+ * @return array
+ */
+ public function getAlternateUriSet() {
+
+ $uris = array();
+ if (isset($this->principalProperties['{DAV:}alternate-URI-set'])) {
+
+ $uris = $this->principalProperties['{DAV:}alternate-URI-set'];
+
+ }
+
+ if (isset($this->principalProperties['{http://sabredav.org/ns}email-address'])) {
+ $uris[] = 'mailto:' . $this->principalProperties['{http://sabredav.org/ns}email-address'];
+ }
+
+ return array_unique($uris);
+
+ }
+
+ /**
+ * Returns the list of group members
+ *
+ * If this principal is a group, this function should return
+ * all member principal uri's for the group.
+ *
+ * @return array
+ */
+ public function getGroupMemberSet() {
+
+ return $this->principalBackend->getGroupMemberSet($this->principalProperties['uri']);
+
+ }
+
+ /**
+ * Returns the list of groups this principal is member of
+ *
+ * If this principal is a member of a (list of) groups, this function
+ * should return a list of principal uri's for it's members.
+ *
+ * @return array
+ */
+ public function getGroupMembership() {
+
+ return $this->principalBackend->getGroupMemberShip($this->principalProperties['uri']);
+
+ }
+
+
+ /**
+ * Sets a list of group members
+ *
+ * If this principal is a group, this method sets all the group members.
+ * The list of members is always overwritten, never appended to.
+ *
+ * This method should throw an exception if the members could not be set.
+ *
+ * @param array $groupMembers
+ * @return void
+ */
+ public function setGroupMemberSet(array $groupMembers) {
+
+ $this->principalBackend->setGroupMemberSet($this->principalProperties['uri'], $groupMembers);
+
+ }
+
+
+ /**
+ * Returns this principals name.
+ *
+ * @return string
+ */
+ public function getName() {
+
+ $uri = $this->principalProperties['uri'];
+ list(, $name) = DAV\URLUtil::splitPath($uri);
+ return $name;
+
+ }
+
+ /**
+ * Returns the name of the user
+ *
+ * @return string
+ */
+ public function getDisplayName() {
+
+ if (isset($this->principalProperties['{DAV:}displayname'])) {
+ return $this->principalProperties['{DAV:}displayname'];
+ } else {
+ return $this->getName();
+ }
+
+ }
+
+ /**
+ * Returns a list of properties
+ *
+ * @param array $requestedProperties
+ * @return array
+ */
+ public function getProperties($requestedProperties) {
+
+ $newProperties = array();
+ foreach($requestedProperties as $propName) {
+
+ if (isset($this->principalProperties[$propName])) {
+ $newProperties[$propName] = $this->principalProperties[$propName];
+ }
+
+ }
+
+ return $newProperties;
+
+ }
+
+ /**
+ * Updates this principals properties.
+ *
+ * @param array $mutations
+ * @see Sabre\DAV\IProperties::updateProperties
+ * @return bool|array
+ */
+ public function updateProperties($mutations) {
+
+ return $this->principalBackend->updatePrincipal($this->principalProperties['uri'], $mutations);
+
+ }
+
+ /**
+ * Returns the owner principal
+ *
+ * This must be a url to a principal, or null if there's no owner
+ *
+ * @return string|null
+ */
+ public function getOwner() {
+
+ return $this->principalProperties['uri'];
+
+
+ }
+
+ /**
+ * Returns a group principal
+ *
+ * This must be a url to a principal, or null if there's no owner
+ *
+ * @return string|null
+ */
+ public function getGroup() {
+
+ return null;
+
+ }
+
+ /**
+ * Returns a list of ACE's for this node.
+ *
+ * Each ACE has the following properties:
+ * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are
+ * currently the only supported privileges
+ * * 'principal', a url to the principal who owns the node
+ * * 'protected' (optional), indicating that this ACE is not allowed to
+ * be updated.
+ *
+ * @return array
+ */
+ public function getACL() {
+
+ return array(
+ array(
+ 'privilege' => '{DAV:}read',
+ 'principal' => $this->getPrincipalUrl(),
+ 'protected' => true,
+ ),
+ );
+
+ }
+
+ /**
+ * Updates the ACL
+ *
+ * This method will receive a list of new ACE's.
+ *
+ * @param array $acl
+ * @return void
+ */
+ public function setACL(array $acl) {
+
+ throw new DAV\Exception\MethodNotAllowed('Updating ACLs is not allowed here');
+
+ }
+
+ /**
+ * Returns the list of supported privileges for this node.
+ *
+ * The returned data structure is a list of nested privileges.
+ * See Sabre\DAVACL\Plugin::getDefaultSupportedPrivilegeSet for a simple
+ * standard structure.
+ *
+ * If null is returned from this method, the default privilege set is used,
+ * which is fine for most common usecases.
+ *
+ * @return array|null
+ */
+ public function getSupportedPrivilegeSet() {
+
+ return null;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAVACL/PrincipalBackend/AbstractBackend.php b/vendor/sabre/dav/lib/Sabre/DAVACL/PrincipalBackend/AbstractBackend.php
new file mode 100644
index 000000000..234d334e8
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAVACL/PrincipalBackend/AbstractBackend.php
@@ -0,0 +1,18 @@
+<?php
+
+namespace Sabre\DAVACL\PrincipalBackend;
+
+/**
+ * Abstract Principal Backend
+ *
+ * Currently this class has no function. It's here for consistency and so we
+ * have a non-bc-breaking way to add a default generic implementation to
+ * functions we may add in the future.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+abstract class AbstractBackend implements BackendInterface {
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAVACL/PrincipalBackend/BackendInterface.php b/vendor/sabre/dav/lib/Sabre/DAVACL/PrincipalBackend/BackendInterface.php
new file mode 100644
index 000000000..6bb21e566
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAVACL/PrincipalBackend/BackendInterface.php
@@ -0,0 +1,153 @@
+<?php
+
+namespace Sabre\DAVACL\PrincipalBackend;
+
+/**
+ * Implement this interface to create your own principal backends.
+ *
+ * Creating backends for principals is entirely optional. You can also
+ * implement Sabre\DAVACL\IPrincipal directly. This interface is used solely by
+ * Sabre\DAVACL\AbstractPrincipalCollection.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+interface BackendInterface {
+
+ /**
+ * Returns a list of principals based on a prefix.
+ *
+ * This prefix will often contain something like 'principals'. You are only
+ * expected to return principals that are in this base path.
+ *
+ * You are expected to return at least a 'uri' for every user, you can
+ * return any additional properties if you wish so. Common properties are:
+ * {DAV:}displayname
+ * {http://sabredav.org/ns}email-address - This is a custom SabreDAV
+ * field that's actually injected in a number of other properties. If
+ * you have an email address, use this property.
+ *
+ * @param string $prefixPath
+ * @return array
+ */
+ function getPrincipalsByPrefix($prefixPath);
+
+ /**
+ * Returns a specific principal, specified by it's path.
+ * The returned structure should be the exact same as from
+ * getPrincipalsByPrefix.
+ *
+ * @param string $path
+ * @return array
+ */
+ function getPrincipalByPath($path);
+
+ /**
+ * Updates one ore more webdav properties on a principal.
+ *
+ * The list of mutations is supplied as an array. Each key in the array is
+ * a propertyname, such as {DAV:}displayname.
+ *
+ * Each value is the actual value to be updated. If a value is null, it
+ * must be deleted.
+ *
+ * This method should be atomic. It must either completely succeed, or
+ * completely fail. Success and failure can simply be returned as 'true' or
+ * 'false'.
+ *
+ * It is also possible to return detailed failure information. In that case
+ * an array such as this should be returned:
+ *
+ * array(
+ * 200 => array(
+ * '{DAV:}prop1' => null,
+ * ),
+ * 201 => array(
+ * '{DAV:}prop2' => null,
+ * ),
+ * 403 => array(
+ * '{DAV:}prop3' => null,
+ * ),
+ * 424 => array(
+ * '{DAV:}prop4' => null,
+ * ),
+ * );
+ *
+ * In this previous example prop1 was successfully updated or deleted, and
+ * prop2 was succesfully created.
+ *
+ * prop3 failed to update due to '403 Forbidden' and because of this prop4
+ * also could not be updated with '424 Failed dependency'.
+ *
+ * This last example was actually incorrect. While 200 and 201 could appear
+ * in 1 response, if there's any error (403) the other properties should
+ * always fail with 423 (failed dependency).
+ *
+ * But anyway, if you don't want to scratch your head over this, just
+ * return true or false.
+ *
+ * @param string $path
+ * @param array $mutations
+ * @return array|bool
+ */
+ function updatePrincipal($path, $mutations);
+
+ /**
+ * This method is used to search for principals matching a set of
+ * properties.
+ *
+ * This search is specifically used by RFC3744's principal-property-search
+ * REPORT. You should at least allow searching on
+ * http://sabredav.org/ns}email-address.
+ *
+ * The actual search should be a unicode-non-case-sensitive search. The
+ * keys in searchProperties are the WebDAV property names, while the values
+ * are the property values to search on.
+ *
+ * If multiple properties are being searched on, the search should be
+ * AND'ed.
+ *
+ * This method should simply return an array with full principal uri's.
+ *
+ * If somebody attempted to search on a property the backend does not
+ * support, you should simply return 0 results.
+ *
+ * You can also just return 0 results if you choose to not support
+ * searching at all, but keep in mind that this may stop certain features
+ * from working.
+ *
+ * @param string $prefixPath
+ * @param array $searchProperties
+ * @return array
+ */
+ function searchPrincipals($prefixPath, array $searchProperties);
+
+ /**
+ * Returns the list of members for a group-principal
+ *
+ * @param string $principal
+ * @return array
+ */
+ function getGroupMemberSet($principal);
+
+ /**
+ * Returns the list of groups a principal is a member of
+ *
+ * @param string $principal
+ * @return array
+ */
+ function getGroupMembership($principal);
+
+ /**
+ * Updates the list of group members for a group principal.
+ *
+ * The principals should be passed as a list of uri's.
+ *
+ * @param string $principal
+ * @param array $members
+ * @return void
+ */
+ function setGroupMemberSet($principal, array $members);
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAVACL/PrincipalBackend/PDO.php b/vendor/sabre/dav/lib/Sabre/DAVACL/PrincipalBackend/PDO.php
new file mode 100644
index 000000000..17c271150
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAVACL/PrincipalBackend/PDO.php
@@ -0,0 +1,428 @@
+<?php
+
+namespace Sabre\DAVACL\PrincipalBackend;
+
+use Sabre\DAV;
+use Sabre\DAVACL;
+
+/**
+ * PDO principal backend
+ *
+ *
+ * This backend assumes all principals are in a single collection. The default collection
+ * is 'principals/', but this can be overriden.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class PDO extends AbstractBackend {
+
+ /**
+ * pdo
+ *
+ * @var PDO
+ */
+ protected $pdo;
+
+ /**
+ * PDO table name for 'principals'
+ *
+ * @var string
+ */
+ protected $tableName;
+
+ /**
+ * PDO table name for 'group members'
+ *
+ * @var string
+ */
+ protected $groupMembersTableName;
+
+ /**
+ * A list of additional fields to support
+ *
+ * @var array
+ */
+ protected $fieldMap = array(
+
+ /**
+ * This property can be used to display the users' real name.
+ */
+ '{DAV:}displayname' => array(
+ 'dbField' => 'displayname',
+ ),
+
+ /**
+ * This property is actually used by the CardDAV plugin, where it gets
+ * mapped to {http://calendarserver.orgi/ns/}me-card.
+ *
+ * The reason we don't straight-up use that property, is because
+ * me-card is defined as a property on the users' addressbook
+ * collection.
+ */
+ '{http://sabredav.org/ns}vcard-url' => array(
+ 'dbField' => 'vcardurl',
+ ),
+ /**
+ * This is the users' primary email-address.
+ */
+ '{http://sabredav.org/ns}email-address' => array(
+ 'dbField' => 'email',
+ ),
+ );
+
+ /**
+ * Sets up the backend.
+ *
+ * @param PDO $pdo
+ * @param string $tableName
+ * @param string $groupMembersTableName
+ */
+ public function __construct(\PDO $pdo, $tableName = 'principals', $groupMembersTableName = 'groupmembers') {
+
+ $this->pdo = $pdo;
+ $this->tableName = $tableName;
+ $this->groupMembersTableName = $groupMembersTableName;
+
+ }
+
+
+ /**
+ * Returns a list of principals based on a prefix.
+ *
+ * This prefix will often contain something like 'principals'. You are only
+ * expected to return principals that are in this base path.
+ *
+ * You are expected to return at least a 'uri' for every user, you can
+ * return any additional properties if you wish so. Common properties are:
+ * {DAV:}displayname
+ * {http://sabredav.org/ns}email-address - This is a custom SabreDAV
+ * field that's actualy injected in a number of other properties. If
+ * you have an email address, use this property.
+ *
+ * @param string $prefixPath
+ * @return array
+ */
+ public function getPrincipalsByPrefix($prefixPath) {
+
+ $fields = array(
+ 'uri',
+ );
+
+ foreach($this->fieldMap as $key=>$value) {
+ $fields[] = $value['dbField'];
+ }
+ $result = $this->pdo->query('SELECT '.implode(',', $fields).' FROM '. $this->tableName);
+
+ $principals = array();
+
+ while($row = $result->fetch(\PDO::FETCH_ASSOC)) {
+
+ // Checking if the principal is in the prefix
+ list($rowPrefix) = DAV\URLUtil::splitPath($row['uri']);
+ if ($rowPrefix !== $prefixPath) continue;
+
+ $principal = array(
+ 'uri' => $row['uri'],
+ );
+ foreach($this->fieldMap as $key=>$value) {
+ if ($row[$value['dbField']]) {
+ $principal[$key] = $row[$value['dbField']];
+ }
+ }
+ $principals[] = $principal;
+
+ }
+
+ return $principals;
+
+ }
+
+ /**
+ * Returns a specific principal, specified by it's path.
+ * The returned structure should be the exact same as from
+ * getPrincipalsByPrefix.
+ *
+ * @param string $path
+ * @return array
+ */
+ public function getPrincipalByPath($path) {
+
+ $fields = array(
+ 'id',
+ 'uri',
+ );
+
+ foreach($this->fieldMap as $key=>$value) {
+ $fields[] = $value['dbField'];
+ }
+ $stmt = $this->pdo->prepare('SELECT '.implode(',', $fields).' FROM '. $this->tableName . ' WHERE uri = ?');
+ $stmt->execute(array($path));
+
+ $row = $stmt->fetch(\PDO::FETCH_ASSOC);
+ if (!$row) return;
+
+ $principal = array(
+ 'id' => $row['id'],
+ 'uri' => $row['uri'],
+ );
+ foreach($this->fieldMap as $key=>$value) {
+ if ($row[$value['dbField']]) {
+ $principal[$key] = $row[$value['dbField']];
+ }
+ }
+ return $principal;
+
+ }
+
+ /**
+ * Updates one ore more webdav properties on a principal.
+ *
+ * The list of mutations is supplied as an array. Each key in the array is
+ * a propertyname, such as {DAV:}displayname.
+ *
+ * Each value is the actual value to be updated. If a value is null, it
+ * must be deleted.
+ *
+ * This method should be atomic. It must either completely succeed, or
+ * completely fail. Success and failure can simply be returned as 'true' or
+ * 'false'.
+ *
+ * It is also possible to return detailed failure information. In that case
+ * an array such as this should be returned:
+ *
+ * array(
+ * 200 => array(
+ * '{DAV:}prop1' => null,
+ * ),
+ * 201 => array(
+ * '{DAV:}prop2' => null,
+ * ),
+ * 403 => array(
+ * '{DAV:}prop3' => null,
+ * ),
+ * 424 => array(
+ * '{DAV:}prop4' => null,
+ * ),
+ * );
+ *
+ * In this previous example prop1 was successfully updated or deleted, and
+ * prop2 was succesfully created.
+ *
+ * prop3 failed to update due to '403 Forbidden' and because of this prop4
+ * also could not be updated with '424 Failed dependency'.
+ *
+ * This last example was actually incorrect. While 200 and 201 could appear
+ * in 1 response, if there's any error (403) the other properties should
+ * always fail with 423 (failed dependency).
+ *
+ * But anyway, if you don't want to scratch your head over this, just
+ * return true or false.
+ *
+ * @param string $path
+ * @param array $mutations
+ * @return array|bool
+ */
+ public function updatePrincipal($path, $mutations) {
+
+ $updateAble = array();
+ foreach($mutations as $key=>$value) {
+
+ // We are not aware of this field, we must fail.
+ if (!isset($this->fieldMap[$key])) {
+
+ $response = array(
+ 403 => array(
+ $key => null,
+ ),
+ 424 => array(),
+ );
+
+ // Adding the rest to the response as a 424
+ foreach($mutations as $subKey=>$subValue) {
+ if ($subKey !== $key) {
+ $response[424][$subKey] = null;
+ }
+ }
+ return $response;
+ }
+
+ $updateAble[$this->fieldMap[$key]['dbField']] = $value;
+
+ }
+
+ // No fields to update
+ $query = "UPDATE " . $this->tableName . " SET ";
+
+ $first = true;
+ foreach($updateAble as $key => $value) {
+ if (!$first) {
+ $query.= ', ';
+ }
+ $first = false;
+ $query.= "$key = :$key ";
+ }
+ $query.='WHERE uri = :uri';
+ $stmt = $this->pdo->prepare($query);
+ $updateAble['uri'] = $path;
+ $stmt->execute($updateAble);
+
+ return true;
+
+ }
+
+ /**
+ * This method is used to search for principals matching a set of
+ * properties.
+ *
+ * This search is specifically used by RFC3744's principal-property-search
+ * REPORT. You should at least allow searching on
+ * http://sabredav.org/ns}email-address.
+ *
+ * The actual search should be a unicode-non-case-sensitive search. The
+ * keys in searchProperties are the WebDAV property names, while the values
+ * are the property values to search on.
+ *
+ * If multiple properties are being searched on, the search should be
+ * AND'ed.
+ *
+ * This method should simply return an array with full principal uri's.
+ *
+ * If somebody attempted to search on a property the backend does not
+ * support, you should simply return 0 results.
+ *
+ * You can also just return 0 results if you choose to not support
+ * searching at all, but keep in mind that this may stop certain features
+ * from working.
+ *
+ * @param string $prefixPath
+ * @param array $searchProperties
+ * @return array
+ */
+ public function searchPrincipals($prefixPath, array $searchProperties) {
+
+ $query = 'SELECT uri FROM ' . $this->tableName . ' WHERE 1=1 ';
+ $values = array();
+ foreach($searchProperties as $property => $value) {
+
+ switch($property) {
+
+ case '{DAV:}displayname' :
+ $query.=' AND displayname LIKE ?';
+ $values[] = '%' . $value . '%';
+ break;
+ case '{http://sabredav.org/ns}email-address' :
+ $query.=' AND email LIKE ?';
+ $values[] = '%' . $value . '%';
+ break;
+ default :
+ // Unsupported property
+ return array();
+
+ }
+
+ }
+ $stmt = $this->pdo->prepare($query);
+ $stmt->execute($values);
+
+ $principals = array();
+ while($row = $stmt->fetch(\PDO::FETCH_ASSOC)) {
+
+ // Checking if the principal is in the prefix
+ list($rowPrefix) = DAV\URLUtil::splitPath($row['uri']);
+ if ($rowPrefix !== $prefixPath) continue;
+
+ $principals[] = $row['uri'];
+
+ }
+
+ return $principals;
+
+ }
+
+ /**
+ * Returns the list of members for a group-principal
+ *
+ * @param string $principal
+ * @return array
+ */
+ public function getGroupMemberSet($principal) {
+
+ $principal = $this->getPrincipalByPath($principal);
+ if (!$principal) throw new DAV\Exception('Principal not found');
+
+ $stmt = $this->pdo->prepare('SELECT principals.uri as uri FROM '.$this->groupMembersTableName.' AS groupmembers LEFT JOIN '.$this->tableName.' AS principals ON groupmembers.member_id = principals.id WHERE groupmembers.principal_id = ?');
+ $stmt->execute(array($principal['id']));
+
+ $result = array();
+ while ($row = $stmt->fetch(\PDO::FETCH_ASSOC)) {
+ $result[] = $row['uri'];
+ }
+ return $result;
+
+ }
+
+ /**
+ * Returns the list of groups a principal is a member of
+ *
+ * @param string $principal
+ * @return array
+ */
+ public function getGroupMembership($principal) {
+
+ $principal = $this->getPrincipalByPath($principal);
+ if (!$principal) throw new DAV\Exception('Principal not found');
+
+ $stmt = $this->pdo->prepare('SELECT principals.uri as uri FROM '.$this->groupMembersTableName.' AS groupmembers LEFT JOIN '.$this->tableName.' AS principals ON groupmembers.principal_id = principals.id WHERE groupmembers.member_id = ?');
+ $stmt->execute(array($principal['id']));
+
+ $result = array();
+ while ($row = $stmt->fetch(\PDO::FETCH_ASSOC)) {
+ $result[] = $row['uri'];
+ }
+ return $result;
+
+ }
+
+ /**
+ * Updates the list of group members for a group principal.
+ *
+ * The principals should be passed as a list of uri's.
+ *
+ * @param string $principal
+ * @param array $members
+ * @return void
+ */
+ public function setGroupMemberSet($principal, array $members) {
+
+ // Grabbing the list of principal id's.
+ $stmt = $this->pdo->prepare('SELECT id, uri FROM '.$this->tableName.' WHERE uri IN (? ' . str_repeat(', ? ', count($members)) . ');');
+ $stmt->execute(array_merge(array($principal), $members));
+
+ $memberIds = array();
+ $principalId = null;
+
+ while($row = $stmt->fetch(\PDO::FETCH_ASSOC)) {
+ if ($row['uri'] == $principal) {
+ $principalId = $row['id'];
+ } else {
+ $memberIds[] = $row['id'];
+ }
+ }
+ if (!$principalId) throw new DAV\Exception('Principal not found');
+
+ // Wiping out old members
+ $stmt = $this->pdo->prepare('DELETE FROM '.$this->groupMembersTableName.' WHERE principal_id = ?;');
+ $stmt->execute(array($principalId));
+
+ foreach($memberIds as $memberId) {
+
+ $stmt = $this->pdo->prepare('INSERT INTO '.$this->groupMembersTableName.' (principal_id, member_id) VALUES (?, ?);');
+ $stmt->execute(array($principalId, $memberId));
+
+ }
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAVACL/PrincipalCollection.php b/vendor/sabre/dav/lib/Sabre/DAVACL/PrincipalCollection.php
new file mode 100644
index 000000000..32216311b
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAVACL/PrincipalCollection.php
@@ -0,0 +1,33 @@
+<?php
+
+namespace Sabre\DAVACL;
+
+/**
+ * Principals Collection
+ *
+ * This collection represents a list of users.
+ * The users are instances of Sabre\DAVACL\Principal
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class PrincipalCollection extends AbstractPrincipalCollection {
+
+ /**
+ * This method returns a node for a principal.
+ *
+ * The passed array contains principal information, and is guaranteed to
+ * at least contain a uri item. Other properties may or may not be
+ * supplied by the authentication backend.
+ *
+ * @param array $principal
+ * @return \Sabre\DAV\INode
+ */
+ public function getChildForPrincipal(array $principal) {
+
+ return new Principal($this->principalBackend, $principal);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAVACL/Property/Acl.php b/vendor/sabre/dav/lib/Sabre/DAVACL/Property/Acl.php
new file mode 100644
index 000000000..158628c30
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAVACL/Property/Acl.php
@@ -0,0 +1,211 @@
+<?php
+
+namespace Sabre\DAVACL\Property;
+
+use Sabre\DAV;
+
+/**
+ * This class represents the {DAV:}acl property
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Acl extends DAV\Property {
+
+ /**
+ * List of privileges
+ *
+ * @var array
+ */
+ private $privileges;
+
+ /**
+ * Whether or not the server base url is required to be prefixed when
+ * serializing the property.
+ *
+ * @var boolean
+ */
+ private $prefixBaseUrl;
+
+ /**
+ * Constructor
+ *
+ * This object requires a structure similar to the return value from
+ * Sabre\DAVACL\Plugin::getACL().
+ *
+ * Each privilege is a an array with at least a 'privilege' property, and a
+ * 'principal' property. A privilege may have a 'protected' property as
+ * well.
+ *
+ * The prefixBaseUrl should be set to false, if the supplied principal urls
+ * are already full urls. If this is kept to true, the servers base url
+ * will automatically be prefixed.
+ *
+ * @param bool $prefixBaseUrl
+ * @param array $privileges
+ */
+ public function __construct(array $privileges, $prefixBaseUrl = true) {
+
+ $this->privileges = $privileges;
+ $this->prefixBaseUrl = $prefixBaseUrl;
+
+ }
+
+ /**
+ * Returns the list of privileges for this property
+ *
+ * @return array
+ */
+ public function getPrivileges() {
+
+ return $this->privileges;
+
+ }
+
+ /**
+ * Serializes the property into a DOMElement
+ *
+ * @param DAV\Server $server
+ * @param \DOMElement $node
+ * @return void
+ */
+ public function serialize(DAV\Server $server,\DOMElement $node) {
+
+ $doc = $node->ownerDocument;
+ foreach($this->privileges as $ace) {
+
+ $this->serializeAce($doc, $node, $ace, $server);
+
+ }
+
+ }
+
+ /**
+ * Unserializes the {DAV:}acl xml element.
+ *
+ * @param \DOMElement $dom
+ * @return Acl
+ */
+ static public function unserialize(\DOMElement $dom) {
+
+ $privileges = array();
+ $xaces = $dom->getElementsByTagNameNS('urn:DAV','ace');
+ for($ii=0; $ii < $xaces->length; $ii++) {
+
+ $xace = $xaces->item($ii);
+ $principal = $xace->getElementsByTagNameNS('urn:DAV','principal');
+ if ($principal->length !== 1) {
+ throw new DAV\Exception\BadRequest('Each {DAV:}ace element must have one {DAV:}principal element');
+ }
+ $principal = Principal::unserialize($principal->item(0));
+
+ switch($principal->getType()) {
+ case Principal::HREF :
+ $principal = $principal->getHref();
+ break;
+ case Principal::AUTHENTICATED :
+ $principal = '{DAV:}authenticated';
+ break;
+ case Principal::UNAUTHENTICATED :
+ $principal = '{DAV:}unauthenticated';
+ break;
+ case Principal::ALL :
+ $principal = '{DAV:}all';
+ break;
+
+ }
+
+ $protected = false;
+
+ if ($xace->getElementsByTagNameNS('urn:DAV','protected')->length > 0) {
+ $protected = true;
+ }
+
+ $grants = $xace->getElementsByTagNameNS('urn:DAV','grant');
+ if ($grants->length < 1) {
+ throw new DAV\Exception\NotImplemented('Every {DAV:}ace element must have a {DAV:}grant element. {DAV:}deny is not yet supported');
+ }
+ $grant = $grants->item(0);
+
+ $xprivs = $grant->getElementsByTagNameNS('urn:DAV','privilege');
+ for($jj=0; $jj<$xprivs->length; $jj++) {
+
+ $xpriv = $xprivs->item($jj);
+
+ $privilegeName = null;
+
+ for ($kk=0;$kk<$xpriv->childNodes->length;$kk++) {
+
+ $childNode = $xpriv->childNodes->item($kk);
+ if ($t = DAV\XMLUtil::toClarkNotation($childNode)) {
+ $privilegeName = $t;
+ break;
+ }
+ }
+ if (is_null($privilegeName)) {
+ throw new DAV\Exception\BadRequest('{DAV:}privilege elements must have a privilege element contained within them.');
+ }
+
+ $privileges[] = array(
+ 'principal' => $principal,
+ 'protected' => $protected,
+ 'privilege' => $privilegeName,
+ );
+
+ }
+
+ }
+
+ return new self($privileges);
+
+ }
+
+ /**
+ * Serializes a single access control entry.
+ *
+ * @param \DOMDocument $doc
+ * @param \DOMElement $node
+ * @param array $ace
+ * @param DAV\Server $server
+ * @return void
+ */
+ private function serializeAce($doc,$node,$ace, DAV\Server $server) {
+
+ $xace = $doc->createElementNS('DAV:','d:ace');
+ $node->appendChild($xace);
+
+ $principal = $doc->createElementNS('DAV:','d:principal');
+ $xace->appendChild($principal);
+ switch($ace['principal']) {
+ case '{DAV:}authenticated' :
+ $principal->appendChild($doc->createElementNS('DAV:','d:authenticated'));
+ break;
+ case '{DAV:}unauthenticated' :
+ $principal->appendChild($doc->createElementNS('DAV:','d:unauthenticated'));
+ break;
+ case '{DAV:}all' :
+ $principal->appendChild($doc->createElementNS('DAV:','d:all'));
+ break;
+ default:
+ $principal->appendChild($doc->createElementNS('DAV:','d:href',($this->prefixBaseUrl?$server->getBaseUri():'') . $ace['principal'] . '/'));
+ }
+
+ $grant = $doc->createElementNS('DAV:','d:grant');
+ $xace->appendChild($grant);
+
+ $privParts = null;
+
+ preg_match('/^{([^}]*)}(.*)$/',$ace['privilege'],$privParts);
+
+ $xprivilege = $doc->createElementNS('DAV:','d:privilege');
+ $grant->appendChild($xprivilege);
+
+ $xprivilege->appendChild($doc->createElementNS($privParts[1],'d:'.$privParts[2]));
+
+ if (isset($ace['protected']) && $ace['protected'])
+ $xace->appendChild($doc->createElement('d:protected'));
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAVACL/Property/AclRestrictions.php b/vendor/sabre/dav/lib/Sabre/DAVACL/Property/AclRestrictions.php
new file mode 100644
index 000000000..fa79b4af0
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAVACL/Property/AclRestrictions.php
@@ -0,0 +1,34 @@
+<?php
+
+namespace Sabre\DAVACL\Property;
+
+use Sabre\DAV;
+
+/**
+ * AclRestrictions property
+ *
+ * This property represents {DAV:}acl-restrictions, as defined in RFC3744.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class AclRestrictions extends DAV\Property {
+
+ /**
+ * Serializes the property into a DOMElement
+ *
+ * @param DAV\Server $server
+ * @param \DOMElement $elem
+ * @return void
+ */
+ public function serialize(DAV\Server $server,\DOMElement $elem) {
+
+ $doc = $elem->ownerDocument;
+
+ $elem->appendChild($doc->createElementNS('DAV:','d:grant-only'));
+ $elem->appendChild($doc->createElementNS('DAV:','d:no-invert'));
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAVACL/Property/CurrentUserPrivilegeSet.php b/vendor/sabre/dav/lib/Sabre/DAVACL/Property/CurrentUserPrivilegeSet.php
new file mode 100644
index 000000000..5b7a81ccb
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAVACL/Property/CurrentUserPrivilegeSet.php
@@ -0,0 +1,124 @@
+<?php
+
+namespace Sabre\DAVACL\Property;
+
+use Sabre\DAV;
+
+/**
+ * CurrentUserPrivilegeSet
+ *
+ * This class represents the current-user-privilege-set property. When
+ * requested, it contain all the privileges a user has on a specific node.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class CurrentUserPrivilegeSet extends DAV\Property {
+
+ /**
+ * List of privileges
+ *
+ * @var array
+ */
+ private $privileges;
+
+ /**
+ * Creates the object
+ *
+ * Pass the privileges in clark-notation
+ *
+ * @param array $privileges
+ */
+ public function __construct(array $privileges) {
+
+ $this->privileges = $privileges;
+
+ }
+
+ /**
+ * Serializes the property in the DOM
+ *
+ * @param DAV\Server $server
+ * @param \DOMElement $node
+ * @return void
+ */
+ public function serialize(DAV\Server $server,\DOMElement $node) {
+
+ $doc = $node->ownerDocument;
+ foreach($this->privileges as $privName) {
+
+ $this->serializePriv($doc,$node,$privName);
+
+ }
+
+ }
+
+ /**
+ * Returns true or false, whether the specified principal appears in the
+ * list.
+ *
+ * @return bool
+ */
+ public function has($privilegeName) {
+
+ return in_array($privilegeName, $this->privileges);
+
+ }
+
+ /**
+ * Serializes one privilege
+ *
+ * @param \DOMDocument $doc
+ * @param \DOMElement $node
+ * @param string $privName
+ * @return void
+ */
+ protected function serializePriv($doc,$node,$privName) {
+
+ $xp = $doc->createElementNS('DAV:','d:privilege');
+ $node->appendChild($xp);
+
+ $privParts = null;
+ preg_match('/^{([^}]*)}(.*)$/',$privName,$privParts);
+
+ $xp->appendChild($doc->createElementNS($privParts[1],'d:'.$privParts[2]));
+
+ }
+
+ /**
+ * Unserializes the {DAV:}current-user-privilege-set element.
+ *
+ * @param DOMElement $node
+ * @return CurrentUserPrivilegeSet
+ */
+ static public function unserialize(\DOMElement $node) {
+
+ $result = array();
+
+ $xprivs = $node->getElementsByTagNameNS('urn:DAV','privilege');
+
+ for($jj=0; $jj<$xprivs->length; $jj++) {
+
+ $xpriv = $xprivs->item($jj);
+
+ $privilegeName = null;
+
+ for ($kk=0;$kk<$xpriv->childNodes->length;$kk++) {
+
+ $childNode = $xpriv->childNodes->item($kk);
+ if ($t = DAV\XMLUtil::toClarkNotation($childNode)) {
+ $privilegeName = $t;
+ break;
+ }
+ }
+
+ $result[] = $privilegeName;
+
+ }
+
+ return new self($result);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAVACL/Property/Principal.php b/vendor/sabre/dav/lib/Sabre/DAVACL/Property/Principal.php
new file mode 100644
index 000000000..951ef7f8e
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAVACL/Property/Principal.php
@@ -0,0 +1,161 @@
+<?php
+
+namespace Sabre\DAVACL\Property;
+use Sabre\DAV;
+
+/**
+ * Principal property
+ *
+ * The principal property represents a principal from RFC3744 (ACL).
+ * The property can be used to specify a principal or pseudo principals.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Principal extends DAV\Property implements DAV\Property\IHref {
+
+ /**
+ * To specify a not-logged-in user, use the UNAUTHENTICATED principal
+ */
+ const UNAUTHENTICATED = 1;
+
+ /**
+ * To specify any principal that is logged in, use AUTHENTICATED
+ */
+ const AUTHENTICATED = 2;
+
+ /**
+ * Specific principals can be specified with the HREF
+ */
+ const HREF = 3;
+
+ /**
+ * Everybody, basically
+ */
+ const ALL = 4;
+
+ /**
+ * Principal-type
+ *
+ * Must be one of the UNAUTHENTICATED, AUTHENTICATED or HREF constants.
+ *
+ * @var int
+ */
+ private $type;
+
+ /**
+ * Url to principal
+ *
+ * This value is only used for the HREF principal type.
+ *
+ * @var string
+ */
+ private $href;
+
+ /**
+ * Creates the property.
+ *
+ * The 'type' argument must be one of the type constants defined in this class.
+ *
+ * 'href' is only required for the HREF type.
+ *
+ * @param int $type
+ * @param string|null $href
+ */
+ public function __construct($type, $href = null) {
+
+ $this->type = $type;
+
+ if ($type===self::HREF && is_null($href)) {
+ throw new DAV\Exception('The href argument must be specified for the HREF principal type.');
+ }
+ $this->href = $href;
+
+ }
+
+ /**
+ * Returns the principal type
+ *
+ * @return int
+ */
+ public function getType() {
+
+ return $this->type;
+
+ }
+
+ /**
+ * Returns the principal uri.
+ *
+ * @return string
+ */
+ public function getHref() {
+
+ return $this->href;
+
+ }
+
+ /**
+ * Serializes the property into a DOMElement.
+ *
+ * @param DAV\Server $server
+ * @param \DOMElement $node
+ * @return void
+ */
+ public function serialize(DAV\Server $server, \DOMElement $node) {
+
+ $prefix = $server->xmlNamespaces['DAV:'];
+ switch($this->type) {
+
+ case self::UNAUTHENTICATED :
+ $node->appendChild(
+ $node->ownerDocument->createElement($prefix . ':unauthenticated')
+ );
+ break;
+ case self::AUTHENTICATED :
+ $node->appendChild(
+ $node->ownerDocument->createElement($prefix . ':authenticated')
+ );
+ break;
+ case self::HREF :
+ $href = $node->ownerDocument->createElement($prefix . ':href');
+ $href->nodeValue = $server->getBaseUri() . DAV\URLUtil::encodePath($this->href);
+ $node->appendChild($href);
+ break;
+
+ }
+
+ }
+
+ /**
+ * Deserializes a DOM element into a property object.
+ *
+ * @param \DOMElement $dom
+ * @return Principal
+ */
+ static public function unserialize(\DOMElement $dom) {
+
+ $parent = $dom->firstChild;
+ while(!DAV\XMLUtil::toClarkNotation($parent)) {
+ $parent = $parent->nextSibling;
+ }
+
+ switch(DAV\XMLUtil::toClarkNotation($parent)) {
+
+ case '{DAV:}unauthenticated' :
+ return new self(self::UNAUTHENTICATED);
+ case '{DAV:}authenticated' :
+ return new self(self::AUTHENTICATED);
+ case '{DAV:}href':
+ return new self(self::HREF, $parent->textContent);
+ case '{DAV:}all':
+ return new self(self::ALL);
+ default :
+ throw new DAV\Exception\BadRequest('Unexpected element (' . DAV\XMLUtil::toClarkNotation($parent) . '). Could not deserialize');
+
+ }
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAVACL/Property/SupportedPrivilegeSet.php b/vendor/sabre/dav/lib/Sabre/DAVACL/Property/SupportedPrivilegeSet.php
new file mode 100644
index 000000000..ee074fff5
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAVACL/Property/SupportedPrivilegeSet.php
@@ -0,0 +1,94 @@
+<?php
+
+namespace Sabre\DAVACL\Property;
+
+use Sabre\DAV;
+
+/**
+ * SupportedPrivilegeSet property
+ *
+ * This property encodes the {DAV:}supported-privilege-set property, as defined
+ * in rfc3744. Please consult the rfc for details about it's structure.
+ *
+ * This class expects a structure like the one given from
+ * Sabre\DAVACL\Plugin::getSupportedPrivilegeSet as the argument in its
+ * constructor.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class SupportedPrivilegeSet extends DAV\Property {
+
+ /**
+ * privileges
+ *
+ * @var array
+ */
+ private $privileges;
+
+ /**
+ * Constructor
+ *
+ * @param array $privileges
+ */
+ public function __construct(array $privileges) {
+
+ $this->privileges = $privileges;
+
+ }
+
+ /**
+ * Serializes the property into a domdocument.
+ *
+ * @param DAV\Server $server
+ * @param \DOMElement $node
+ * @return void
+ */
+ public function serialize(DAV\Server $server,\DOMElement $node) {
+
+ $doc = $node->ownerDocument;
+ $this->serializePriv($doc, $node, $this->privileges);
+
+ }
+
+ /**
+ * Serializes a property
+ *
+ * This is a recursive function.
+ *
+ * @param \DOMDocument $doc
+ * @param \DOMElement $node
+ * @param array $privilege
+ * @return void
+ */
+ private function serializePriv($doc,$node,$privilege) {
+
+ $xsp = $doc->createElementNS('DAV:','d:supported-privilege');
+ $node->appendChild($xsp);
+
+ $xp = $doc->createElementNS('DAV:','d:privilege');
+ $xsp->appendChild($xp);
+
+ $privParts = null;
+ preg_match('/^{([^}]*)}(.*)$/',$privilege['privilege'],$privParts);
+
+ $xp->appendChild($doc->createElementNS($privParts[1],'d:'.$privParts[2]));
+
+ if (isset($privilege['abstract']) && $privilege['abstract']) {
+ $xsp->appendChild($doc->createElementNS('DAV:','d:abstract'));
+ }
+
+ if (isset($privilege['description'])) {
+ $xsp->appendChild($doc->createElementNS('DAV:','d:description',$privilege['description']));
+ }
+
+ if (isset($privilege['aggregates'])) {
+ foreach($privilege['aggregates'] as $subPrivilege) {
+ $this->serializePriv($doc,$xsp,$subPrivilege);
+ }
+ }
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAVACL/Version.php b/vendor/sabre/dav/lib/Sabre/DAVACL/Version.php
new file mode 100644
index 000000000..b01e2e65b
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAVACL/Version.php
@@ -0,0 +1,24 @@
+<?php
+
+namespace Sabre\DAVACL;
+
+/**
+ * This class contains the SabreDAV version constants.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Version {
+
+ /**
+ * Full version number
+ */
+ const VERSION = '1.8.7';
+
+ /**
+ * Stability : alpha, beta, stable
+ */
+ const STABILITY = 'stable';
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/HTTP/AWSAuth.php b/vendor/sabre/dav/lib/Sabre/HTTP/AWSAuth.php
new file mode 100644
index 000000000..f697f23f1
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/HTTP/AWSAuth.php
@@ -0,0 +1,227 @@
+<?php
+
+namespace Sabre\HTTP;
+
+/**
+ * HTTP AWS Authentication handler
+ *
+ * Use this class to leverage amazon's AWS authentication header
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class AWSAuth extends AbstractAuth {
+
+ /**
+ * The signature supplied by the HTTP client
+ *
+ * @var string
+ */
+ private $signature = null;
+
+ /**
+ * The accesskey supplied by the HTTP client
+ *
+ * @var string
+ */
+ private $accessKey = null;
+
+ /**
+ * An error code, if any
+ *
+ * This value will be filled with one of the ERR_* constants
+ *
+ * @var int
+ */
+ public $errorCode = 0;
+
+ const ERR_NOAWSHEADER = 1;
+ const ERR_MD5CHECKSUMWRONG = 2;
+ const ERR_INVALIDDATEFORMAT = 3;
+ const ERR_REQUESTTIMESKEWED = 4;
+ const ERR_INVALIDSIGNATURE = 5;
+
+ /**
+ * Gathers all information from the headers
+ *
+ * This method needs to be called prior to anything else.
+ *
+ * @return bool
+ */
+ public function init() {
+
+ $authHeader = $this->httpRequest->getHeader('Authorization');
+ $authHeader = explode(' ',$authHeader);
+
+ if ($authHeader[0]!='AWS' || !isset($authHeader[1])) {
+ $this->errorCode = self::ERR_NOAWSHEADER;
+ return false;
+ }
+
+ list($this->accessKey,$this->signature) = explode(':',$authHeader[1]);
+
+ return true;
+
+ }
+
+ /**
+ * Returns the username for the request
+ *
+ * @return string
+ */
+ public function getAccessKey() {
+
+ return $this->accessKey;
+
+ }
+
+ /**
+ * Validates the signature based on the secretKey
+ *
+ * @param string $secretKey
+ * @return bool
+ */
+ public function validate($secretKey) {
+
+ $contentMD5 = $this->httpRequest->getHeader('Content-MD5');
+
+ if ($contentMD5) {
+ // We need to validate the integrity of the request
+ $body = $this->httpRequest->getBody(true);
+ $this->httpRequest->setBody($body,true);
+
+ if ($contentMD5!=base64_encode(md5($body,true))) {
+ // content-md5 header did not match md5 signature of body
+ $this->errorCode = self::ERR_MD5CHECKSUMWRONG;
+ return false;
+ }
+
+ }
+
+ if (!$requestDate = $this->httpRequest->getHeader('x-amz-date'))
+ $requestDate = $this->httpRequest->getHeader('Date');
+
+ if (!$this->validateRFC2616Date($requestDate))
+ return false;
+
+ $amzHeaders = $this->getAmzHeaders();
+
+ $signature = base64_encode(
+ $this->hmacsha1($secretKey,
+ $this->httpRequest->getMethod() . "\n" .
+ $contentMD5 . "\n" .
+ $this->httpRequest->getHeader('Content-type') . "\n" .
+ $requestDate . "\n" .
+ $amzHeaders .
+ $this->httpRequest->getURI()
+ )
+ );
+
+ if ($this->signature != $signature) {
+
+ $this->errorCode = self::ERR_INVALIDSIGNATURE;
+ return false;
+
+ }
+
+ return true;
+
+ }
+
+
+ /**
+ * Returns an HTTP 401 header, forcing login
+ *
+ * This should be called when username and password are incorrect, or not supplied at all
+ *
+ * @return void
+ */
+ public function requireLogin() {
+
+ $this->httpResponse->setHeader('WWW-Authenticate','AWS');
+ $this->httpResponse->sendStatus(401);
+
+ }
+
+ /**
+ * Makes sure the supplied value is a valid RFC2616 date.
+ *
+ * If we would just use strtotime to get a valid timestamp, we have no way of checking if a
+ * user just supplied the word 'now' for the date header.
+ *
+ * This function also makes sure the Date header is within 15 minutes of the operating
+ * system date, to prevent replay attacks.
+ *
+ * @param string $dateHeader
+ * @return bool
+ */
+ protected function validateRFC2616Date($dateHeader) {
+
+ $date = Util::parseHTTPDate($dateHeader);
+
+ // Unknown format
+ if (!$date) {
+ $this->errorCode = self::ERR_INVALIDDATEFORMAT;
+ return false;
+ }
+
+ $min = new \DateTime('-15 minutes');
+ $max = new \DateTime('+15 minutes');
+
+ // We allow 15 minutes around the current date/time
+ if ($date > $max || $date < $min) {
+ $this->errorCode = self::ERR_REQUESTTIMESKEWED;
+ return false;
+ }
+
+ return $date;
+
+ }
+
+ /**
+ * Returns a list of AMZ headers
+ *
+ * @return string
+ */
+ protected function getAmzHeaders() {
+
+ $amzHeaders = array();
+ $headers = $this->httpRequest->getHeaders();
+ foreach($headers as $headerName => $headerValue) {
+ if (strpos(strtolower($headerName),'x-amz-')===0) {
+ $amzHeaders[strtolower($headerName)] = str_replace(array("\r\n"),array(' '),$headerValue) . "\n";
+ }
+ }
+ ksort($amzHeaders);
+
+ $headerStr = '';
+ foreach($amzHeaders as $h=>$v) {
+ $headerStr.=$h.':'.$v;
+ }
+
+ return $headerStr;
+
+ }
+
+ /**
+ * Generates an HMAC-SHA1 signature
+ *
+ * @param string $key
+ * @param string $message
+ * @return string
+ */
+ private function hmacsha1($key, $message) {
+
+ $blocksize=64;
+ if (strlen($key)>$blocksize)
+ $key=pack('H*', sha1($key));
+ $key=str_pad($key,$blocksize,chr(0x00));
+ $ipad=str_repeat(chr(0x36),$blocksize);
+ $opad=str_repeat(chr(0x5c),$blocksize);
+ $hmac = pack('H*',sha1(($key^$opad).pack('H*',sha1(($key^$ipad).$message))));
+ return $hmac;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/HTTP/AbstractAuth.php b/vendor/sabre/dav/lib/Sabre/HTTP/AbstractAuth.php
new file mode 100644
index 000000000..886e34737
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/HTTP/AbstractAuth.php
@@ -0,0 +1,111 @@
+<?php
+
+namespace Sabre\HTTP;
+
+/**
+ * HTTP Authentication baseclass
+ *
+ * This class has the common functionality for BasicAuth and DigestAuth
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+abstract class AbstractAuth {
+
+ /**
+ * The realm will be displayed in the dialog boxes
+ *
+ * This identifier can be changed through setRealm()
+ *
+ * @var string
+ */
+ protected $realm = 'SabreDAV';
+
+ /**
+ * HTTP response helper
+ *
+ * @var Sabre\HTTP\Response
+ */
+ protected $httpResponse;
+
+
+ /**
+ * HTTP request helper
+ *
+ * @var Sabre\HTTP\Request
+ */
+ protected $httpRequest;
+
+ /**
+ * __construct
+ *
+ */
+ public function __construct() {
+
+ $this->httpResponse = new Response();
+ $this->httpRequest = new Request();
+
+ }
+
+ /**
+ * Sets an alternative HTTP response object
+ *
+ * @param Response $response
+ * @return void
+ */
+ public function setHTTPResponse(Response $response) {
+
+ $this->httpResponse = $response;
+
+ }
+
+ /**
+ * Sets an alternative HTTP request object
+ *
+ * @param Request $request
+ * @return void
+ */
+ public function setHTTPRequest(Request $request) {
+
+ $this->httpRequest = $request;
+
+ }
+
+
+ /**
+ * Sets the realm
+ *
+ * The realm is often displayed in authentication dialog boxes
+ * Commonly an application name displayed here
+ *
+ * @param string $realm
+ * @return void
+ */
+ public function setRealm($realm) {
+
+ $this->realm = $realm;
+
+ }
+
+ /**
+ * Returns the realm
+ *
+ * @return string
+ */
+ public function getRealm() {
+
+ return $this->realm;
+
+ }
+
+ /**
+ * Returns an HTTP 401 header, forcing login
+ *
+ * This should be called when username and password are incorrect, or not supplied at all
+ *
+ * @return void
+ */
+ abstract public function requireLogin();
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/HTTP/BasicAuth.php b/vendor/sabre/dav/lib/Sabre/HTTP/BasicAuth.php
new file mode 100644
index 000000000..36aa31cbc
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/HTTP/BasicAuth.php
@@ -0,0 +1,67 @@
+<?php
+
+namespace Sabre\HTTP;
+
+/**
+ * HTTP Basic Authentication handler
+ *
+ * Use this class for easy http authentication setup
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class BasicAuth extends AbstractAuth {
+
+ /**
+ * Returns the supplied username and password.
+ *
+ * The returned array has two values:
+ * * 0 - username
+ * * 1 - password
+ *
+ * If nothing was supplied, 'false' will be returned
+ *
+ * @return mixed
+ */
+ public function getUserPass() {
+
+ // Apache and mod_php
+ if (($user = $this->httpRequest->getRawServerValue('PHP_AUTH_USER')) && ($pass = $this->httpRequest->getRawServerValue('PHP_AUTH_PW'))) {
+
+ return array($user,$pass);
+
+ }
+
+ // Most other webservers
+ $auth = $this->httpRequest->getHeader('Authorization');
+
+ // Apache could prefix environment variables with REDIRECT_ when urls
+ // are passed through mod_rewrite
+ if (!$auth) {
+ $auth = $this->httpRequest->getRawServerValue('REDIRECT_HTTP_AUTHORIZATION');
+ }
+
+ if (!$auth) return false;
+
+ if (strpos(strtolower($auth),'basic')!==0) return false;
+
+ return explode(':', base64_decode(substr($auth, 6)),2);
+
+ }
+
+ /**
+ * Returns an HTTP 401 header, forcing login
+ *
+ * This should be called when username and password are incorrect, or not supplied at all
+ *
+ * @return void
+ */
+ public function requireLogin() {
+
+ $this->httpResponse->setHeader('WWW-Authenticate','Basic realm="' . $this->realm . '"');
+ $this->httpResponse->sendStatus(401);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/HTTP/DigestAuth.php b/vendor/sabre/dav/lib/Sabre/HTTP/DigestAuth.php
new file mode 100644
index 000000000..19b58eba3
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/HTTP/DigestAuth.php
@@ -0,0 +1,240 @@
+<?php
+
+namespace Sabre\HTTP;
+
+/**
+ * HTTP Digest Authentication handler
+ *
+ * Use this class for easy http digest authentication.
+ * Instructions:
+ *
+ * 1. Create the object
+ * 2. Call the setRealm() method with the realm you plan to use
+ * 3. Call the init method function.
+ * 4. Call the getUserName() function. This function may return false if no
+ * authentication information was supplied. Based on the username you
+ * should check your internal database for either the associated password,
+ * or the so-called A1 hash of the digest.
+ * 5. Call either validatePassword() or validateA1(). This will return true
+ * or false.
+ * 6. To make sure an authentication prompt is displayed, call the
+ * requireLogin() method.
+ *
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class DigestAuth extends AbstractAuth {
+
+ /**
+ * These constants are used in setQOP();
+ */
+ const QOP_AUTH = 1;
+ const QOP_AUTHINT = 2;
+
+ protected $nonce;
+ protected $opaque;
+ protected $digestParts;
+ protected $A1;
+ protected $qop = self::QOP_AUTH;
+
+ /**
+ * Initializes the object
+ */
+ public function __construct() {
+
+ $this->nonce = uniqid();
+ $this->opaque = md5($this->realm);
+ parent::__construct();
+
+ }
+
+ /**
+ * Gathers all information from the headers
+ *
+ * This method needs to be called prior to anything else.
+ *
+ * @return void
+ */
+ public function init() {
+
+ $digest = $this->getDigest();
+ $this->digestParts = $this->parseDigest($digest);
+
+ }
+
+ /**
+ * Sets the quality of protection value.
+ *
+ * Possible values are:
+ * Sabre\HTTP\DigestAuth::QOP_AUTH
+ * Sabre\HTTP\DigestAuth::QOP_AUTHINT
+ *
+ * Multiple values can be specified using logical OR.
+ *
+ * QOP_AUTHINT ensures integrity of the request body, but this is not
+ * supported by most HTTP clients. QOP_AUTHINT also requires the entire
+ * request body to be md5'ed, which can put strains on CPU and memory.
+ *
+ * @param int $qop
+ * @return void
+ */
+ public function setQOP($qop) {
+
+ $this->qop = $qop;
+
+ }
+
+ /**
+ * Validates the user.
+ *
+ * The A1 parameter should be md5($username . ':' . $realm . ':' . $password);
+ *
+ * @param string $A1
+ * @return bool
+ */
+ public function validateA1($A1) {
+
+ $this->A1 = $A1;
+ return $this->validate();
+
+ }
+
+ /**
+ * Validates authentication through a password. The actual password must be provided here.
+ * It is strongly recommended not store the password in plain-text and use validateA1 instead.
+ *
+ * @param string $password
+ * @return bool
+ */
+ public function validatePassword($password) {
+
+ $this->A1 = md5($this->digestParts['username'] . ':' . $this->realm . ':' . $password);
+ return $this->validate();
+
+ }
+
+ /**
+ * Returns the username for the request
+ *
+ * @return string
+ */
+ public function getUsername() {
+
+ return $this->digestParts['username'];
+
+ }
+
+ /**
+ * Validates the digest challenge
+ *
+ * @return bool
+ */
+ protected function validate() {
+
+ $A2 = $this->httpRequest->getMethod() . ':' . $this->digestParts['uri'];
+
+ if ($this->digestParts['qop']=='auth-int') {
+ // Making sure we support this qop value
+ if (!($this->qop & self::QOP_AUTHINT)) return false;
+ // We need to add an md5 of the entire request body to the A2 part of the hash
+ $body = $this->httpRequest->getBody(true);
+ $this->httpRequest->setBody($body,true);
+ $A2 .= ':' . md5($body);
+ } else {
+
+ // We need to make sure we support this qop value
+ if (!($this->qop & self::QOP_AUTH)) return false;
+ }
+
+ $A2 = md5($A2);
+
+ $validResponse = md5("{$this->A1}:{$this->digestParts['nonce']}:{$this->digestParts['nc']}:{$this->digestParts['cnonce']}:{$this->digestParts['qop']}:{$A2}");
+
+ return $this->digestParts['response']==$validResponse;
+
+
+ }
+
+ /**
+ * Returns an HTTP 401 header, forcing login
+ *
+ * This should be called when username and password are incorrect, or not supplied at all
+ *
+ * @return void
+ */
+ public function requireLogin() {
+
+ $qop = '';
+ switch($this->qop) {
+ case self::QOP_AUTH : $qop = 'auth'; break;
+ case self::QOP_AUTHINT : $qop = 'auth-int'; break;
+ case self::QOP_AUTH | self::QOP_AUTHINT : $qop = 'auth,auth-int'; break;
+ }
+
+ $this->httpResponse->setHeader('WWW-Authenticate','Digest realm="' . $this->realm . '",qop="'.$qop.'",nonce="' . $this->nonce . '",opaque="' . $this->opaque . '"');
+ $this->httpResponse->sendStatus(401);
+
+ }
+
+
+ /**
+ * This method returns the full digest string.
+ *
+ * It should be compatibile with mod_php format and other webservers.
+ *
+ * If the header could not be found, null will be returned
+ *
+ * @return mixed
+ */
+ public function getDigest() {
+
+ // mod_php
+ $digest = $this->httpRequest->getRawServerValue('PHP_AUTH_DIGEST');
+ if ($digest) return $digest;
+
+ // most other servers
+ $digest = $this->httpRequest->getHeader('Authorization');
+
+ // Apache could prefix environment variables with REDIRECT_ when urls
+ // are passed through mod_rewrite
+ if (!$digest) {
+ $digest = $this->httpRequest->getRawServerValue('REDIRECT_HTTP_AUTHORIZATION');
+ }
+
+ if ($digest && strpos(strtolower($digest),'digest')===0) {
+ return substr($digest,7);
+ } else {
+ return null;
+ }
+
+ }
+
+
+ /**
+ * Parses the different pieces of the digest string into an array.
+ *
+ * This method returns false if an incomplete digest was supplied
+ *
+ * @param string $digest
+ * @return mixed
+ */
+ protected function parseDigest($digest) {
+
+ // protect against missing data
+ $needed_parts = array('nonce'=>1, 'nc'=>1, 'cnonce'=>1, 'qop'=>1, 'username'=>1, 'uri'=>1, 'response'=>1);
+ $data = array();
+
+ preg_match_all('@(\w+)=(?:(?:")([^"]+)"|([^\s,$]+))@', $digest, $matches, PREG_SET_ORDER);
+
+ foreach ($matches as $m) {
+ $data[$m[1]] = $m[2] ? $m[2] : $m[3];
+ unset($needed_parts[$m[1]]);
+ }
+
+ return $needed_parts ? false : $data;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/HTTP/Request.php b/vendor/sabre/dav/lib/Sabre/HTTP/Request.php
new file mode 100644
index 000000000..b0f1e62bf
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/HTTP/Request.php
@@ -0,0 +1,284 @@
+<?php
+
+namespace Sabre\HTTP;
+
+/**
+ * HTTP Request information
+ *
+ * This object can be used to easily access information about an HTTP request.
+ * It can additionally be used to create 'mock' requests.
+ *
+ * This class mostly operates independent, but because of the nature of a single
+ * request per run it can operate as a singleton. For more information check out
+ * the behaviour around 'defaultInputStream'.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Request {
+
+ /**
+ * PHP's $_SERVER data
+ *
+ * @var array
+ */
+ protected $_SERVER;
+
+ /**
+ * PHP's $_POST data
+ *
+ * @var array
+ */
+ protected $_POST;
+
+ /**
+ * The request body, if any.
+ *
+ * This is stored in the form of a stream resource.
+ *
+ * @var resource
+ */
+ protected $body = null;
+
+ /**
+ * This will be set as the 'default' inputStream for a specific HTTP request
+ * We sometimes need to retain, or rebuild this if we need multiple runs
+ * of parsing the original HTTP request.
+ *
+ * @var resource
+ */
+ static $defaultInputStream=null;
+
+ /**
+ * Sets up the object
+ *
+ * The serverData and postData array can be used to override usage of PHP's
+ * global _SERVER and _POST variable respectively.
+ *
+ * @param array $serverData
+ * @param array $postData
+ */
+ public function __construct(array $serverData = null, array $postData = null) {
+
+ if ($serverData) $this->_SERVER = $serverData;
+ else $this->_SERVER =& $_SERVER;
+
+ if ($postData) $this->_POST = $postData;
+ else $this->_POST =& $_POST;
+
+ }
+
+ /**
+ * Returns the value for a specific http header.
+ *
+ * This method returns null if the header did not exist.
+ *
+ * @param string $name
+ * @return string
+ */
+ public function getHeader($name) {
+
+ $name = strtoupper(str_replace(array('-'),array('_'),$name));
+ if (isset($this->_SERVER['HTTP_' . $name])) {
+ return $this->_SERVER['HTTP_' . $name];
+ }
+
+ // There's a few headers that seem to end up in the top-level
+ // server array.
+ switch($name) {
+ case 'CONTENT_TYPE' :
+ case 'CONTENT_LENGTH' :
+ if (isset($this->_SERVER[$name])) {
+ return $this->_SERVER[$name];
+ }
+ break;
+
+ }
+ return;
+
+ }
+
+ /**
+ * Returns all (known) HTTP headers.
+ *
+ * All headers are converted to lower-case, and additionally all underscores
+ * are automatically converted to dashes
+ *
+ * @return array
+ */
+ public function getHeaders() {
+
+ $hdrs = array();
+ foreach($this->_SERVER as $key=>$value) {
+
+ switch($key) {
+ case 'CONTENT_LENGTH' :
+ case 'CONTENT_TYPE' :
+ $hdrs[strtolower(str_replace('_','-',$key))] = $value;
+ break;
+ default :
+ if (strpos($key,'HTTP_')===0) {
+ $hdrs[substr(strtolower(str_replace('_','-',$key)),5)] = $value;
+ }
+ break;
+ }
+
+ }
+
+ return $hdrs;
+
+ }
+
+ /**
+ * Returns the HTTP request method
+ *
+ * This is for example POST or GET
+ *
+ * @return string
+ */
+ public function getMethod() {
+
+ return $this->_SERVER['REQUEST_METHOD'];
+
+ }
+
+ /**
+ * Returns the requested uri
+ *
+ * @return string
+ */
+ public function getUri() {
+
+ return $this->_SERVER['REQUEST_URI'];
+
+ }
+
+ /**
+ * Will return protocol + the hostname + the uri
+ *
+ * @return string
+ */
+ public function getAbsoluteUri() {
+
+ // Checking if the request was made through HTTPS. The last in line is for IIS
+ $protocol = isset($this->_SERVER['HTTPS']) && ($this->_SERVER['HTTPS']) && ($this->_SERVER['HTTPS']!='off');
+ return ($protocol?'https':'http') . '://' . $this->getHeader('Host') . $this->getUri();
+
+ }
+
+ /**
+ * Returns everything after the ? from the current url
+ *
+ * @return string
+ */
+ public function getQueryString() {
+
+ return isset($this->_SERVER['QUERY_STRING'])?$this->_SERVER['QUERY_STRING']:'';
+
+ }
+
+ /**
+ * Returns the HTTP request body body
+ *
+ * This method returns a readable stream resource.
+ * If the asString parameter is set to true, a string is sent instead.
+ *
+ * @param bool $asString
+ * @return resource
+ */
+ public function getBody($asString = false) {
+
+ if (is_null($this->body)) {
+ if (!is_null(self::$defaultInputStream)) {
+ $this->body = self::$defaultInputStream;
+ } else {
+ $this->body = fopen('php://input','r');
+ self::$defaultInputStream = $this->body;
+ }
+ }
+ if ($asString) {
+ $body = stream_get_contents($this->body);
+ return $body;
+ } else {
+ return $this->body;
+ }
+
+ }
+
+ /**
+ * Sets the contents of the HTTP request body
+ *
+ * This method can either accept a string, or a readable stream resource.
+ *
+ * If the setAsDefaultInputStream is set to true, it means for this run of the
+ * script the supplied body will be used instead of php://input.
+ *
+ * @param mixed $body
+ * @param bool $setAsDefaultInputStream
+ * @return void
+ */
+ public function setBody($body,$setAsDefaultInputStream = false) {
+
+ if(is_resource($body)) {
+ $this->body = $body;
+ } else {
+
+ $stream = fopen('php://temp','r+');
+ fputs($stream,$body);
+ rewind($stream);
+ // String is assumed
+ $this->body = $stream;
+ }
+ if ($setAsDefaultInputStream) {
+ self::$defaultInputStream = $this->body;
+ }
+
+ }
+
+ /**
+ * Returns PHP's _POST variable.
+ *
+ * The reason this is in a method is so it can be subclassed and
+ * overridden.
+ *
+ * @return array
+ */
+ public function getPostVars() {
+
+ return $this->_POST;
+
+ }
+
+ /**
+ * Returns a specific item from the _SERVER array.
+ *
+ * Do not rely on this feature, it is for internal use only.
+ *
+ * @param string $field
+ * @return string
+ */
+ public function getRawServerValue($field) {
+
+ return isset($this->_SERVER[$field])?$this->_SERVER[$field]:null;
+
+ }
+
+ /**
+ * Returns the HTTP version specified within the request.
+ *
+ * @return string
+ */
+ public function getHTTPVersion() {
+
+ $protocol = $this->getRawServerValue('SERVER_PROTOCOL');
+ if ($protocol==='HTTP/1.0') {
+ return '1.0';
+ } else {
+ return '1.1';
+ }
+
+ }
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/HTTP/Response.php b/vendor/sabre/dav/lib/Sabre/HTTP/Response.php
new file mode 100644
index 000000000..fd7c0bc38
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/HTTP/Response.php
@@ -0,0 +1,175 @@
+<?php
+
+namespace Sabre\HTTP;
+
+/**
+ * This class represents a HTTP response.
+ *
+ * It contains the HTTP status code, response headers and a message body.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Response {
+
+ /**
+ * The HTTP version to return in the header() line.
+ *
+ * By default you will definitely want this to be HTTP/1.1, but in some
+ * edge cases (most notably pre 1.2 nginx servers acting as a proxy), you
+ * want to force this to 1.0.
+ *
+ * @var string
+ */
+ public $defaultHttpVersion = '1.1';
+
+ /**
+ * Returns a full HTTP status message for an HTTP status code
+ *
+ * @param int $code
+ * @return string
+ */
+ public function getStatusMessage($code, $httpVersion = '1.1') {
+
+ $msg = array(
+ 100 => 'Continue',
+ 101 => 'Switching Protocols',
+ 102 => 'Processing',
+ 200 => 'OK',
+ 201 => 'Created',
+ 202 => 'Accepted',
+ 203 => 'Non-Authorative Information',
+ 204 => 'No Content',
+ 205 => 'Reset Content',
+ 206 => 'Partial Content',
+ 207 => 'Multi-Status', // RFC 4918
+ 208 => 'Already Reported', // RFC 5842
+ 226 => 'IM Used', // RFC 3229
+ 300 => 'Multiple Choices',
+ 301 => 'Moved Permanently',
+ 302 => 'Found',
+ 303 => 'See Other',
+ 304 => 'Not Modified',
+ 305 => 'Use Proxy',
+ 306 => 'Reserved',
+ 307 => 'Temporary Redirect',
+ 400 => 'Bad request',
+ 401 => 'Unauthorized',
+ 402 => 'Payment Required',
+ 403 => 'Forbidden',
+ 404 => 'Not Found',
+ 405 => 'Method Not Allowed',
+ 406 => 'Not Acceptable',
+ 407 => 'Proxy Authentication Required',
+ 408 => 'Request Timeout',
+ 409 => 'Conflict',
+ 410 => 'Gone',
+ 411 => 'Length Required',
+ 412 => 'Precondition failed',
+ 413 => 'Request Entity Too Large',
+ 414 => 'Request-URI Too Long',
+ 415 => 'Unsupported Media Type',
+ 416 => 'Requested Range Not Satisfiable',
+ 417 => 'Expectation Failed',
+ 418 => 'I\'m a teapot', // RFC 2324
+ 422 => 'Unprocessable Entity', // RFC 4918
+ 423 => 'Locked', // RFC 4918
+ 424 => 'Failed Dependency', // RFC 4918
+ 426 => 'Upgrade required',
+ 428 => 'Precondition required', // draft-nottingham-http-new-status
+ 429 => 'Too Many Requests', // draft-nottingham-http-new-status
+ 431 => 'Request Header Fields Too Large', // draft-nottingham-http-new-status
+ 500 => 'Internal Server Error',
+ 501 => 'Not Implemented',
+ 502 => 'Bad Gateway',
+ 503 => 'Service Unavailable',
+ 504 => 'Gateway Timeout',
+ 505 => 'HTTP Version not supported',
+ 506 => 'Variant Also Negotiates',
+ 507 => 'Insufficient Storage', // RFC 4918
+ 508 => 'Loop Detected', // RFC 5842
+ 509 => 'Bandwidth Limit Exceeded', // non-standard
+ 510 => 'Not extended',
+ 511 => 'Network Authentication Required', // draft-nottingham-http-new-status
+ );
+
+ return 'HTTP/' . $httpVersion . ' ' . $code . ' ' . $msg[$code];
+
+ }
+
+ // @codeCoverageIgnoreStart
+ // We cannot reasonably test header() related methods.
+
+ /**
+ * Sends an HTTP status header to the client.
+ *
+ * @param int $code HTTP status code
+ * @return bool
+ */
+ public function sendStatus($code) {
+
+ if (!headers_sent())
+ return header($this->getStatusMessage($code, $this->defaultHttpVersion));
+ else return false;
+
+ }
+
+ /**
+ * Sets an HTTP header for the response
+ *
+ * @param string $name
+ * @param string $value
+ * @param bool $replace
+ * @return bool
+ */
+ public function setHeader($name, $value, $replace = true) {
+
+ $value = str_replace(array("\r","\n"),array('\r','\n'),$value);
+ if (!headers_sent())
+ return header($name . ': ' . $value, $replace);
+ else return false;
+
+
+ }
+ // @codeCoverageIgnoreEnd
+
+ /**
+ * Sets a bunch of HTTP Headers
+ *
+ * headersnames are specified as keys, value in the array value
+ *
+ * @param array $headers
+ * @return void
+ */
+ public function setHeaders(array $headers) {
+
+ foreach($headers as $key=>$value)
+ $this->setHeader($key, $value);
+
+ }
+
+ /**
+ * Sends the entire response body
+ *
+ * This method can accept either an open filestream, or a string.
+ *
+ * @param mixed $body
+ * @return void
+ */
+ public function sendBody($body) {
+
+ if (is_resource($body)) {
+
+ fpassthru($body);
+
+ } else {
+
+ // We assume a string
+ echo $body;
+
+ }
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/HTTP/Util.php b/vendor/sabre/dav/lib/Sabre/HTTP/Util.php
new file mode 100644
index 000000000..42fd0a003
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/HTTP/Util.php
@@ -0,0 +1,82 @@
+<?php
+
+namespace Sabre\HTTP;
+
+/**
+ * HTTP utility methods
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @author Paul Voegler
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Util {
+
+ /**
+ * Parses a RFC2616-compatible date string
+ *
+ * This method returns false if the date is invalid
+ *
+ * @param string $dateHeader
+ * @return bool|DateTime
+ */
+ static function parseHTTPDate($dateHeader) {
+
+ //RFC 2616 section 3.3.1 Full Date
+ //Only the format is checked, valid ranges are checked by strtotime below
+ $month = '(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)';
+ $weekday = '(Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday)';
+ $wkday = '(Mon|Tue|Wed|Thu|Fri|Sat|Sun)';
+ $time = '[0-2]\d(\:[0-5]\d){2}';
+ $date3 = $month . ' ([1-3]\d| \d)';
+ $date2 = '[0-3]\d\-' . $month . '\-\d\d';
+ //4-digit year cannot begin with 0 - unix timestamp begins in 1970
+ $date1 = '[0-3]\d ' . $month . ' [1-9]\d{3}';
+
+ //ANSI C's asctime() format
+ //4-digit year cannot begin with 0 - unix timestamp begins in 1970
+ $asctime_date = $wkday . ' ' . $date3 . ' ' . $time . ' [1-9]\d{3}';
+ //RFC 850, obsoleted by RFC 1036
+ $rfc850_date = $weekday . ', ' . $date2 . ' ' . $time . ' GMT';
+ //RFC 822, updated by RFC 1123
+ $rfc1123_date = $wkday . ', ' . $date1 . ' ' . $time . ' GMT';
+ //allowed date formats by RFC 2616
+ $HTTP_date = "($rfc1123_date|$rfc850_date|$asctime_date)";
+
+ //allow for space around the string and strip it
+ $dateHeader = trim($dateHeader, ' ');
+ if (!preg_match('/^' . $HTTP_date . '$/', $dateHeader))
+ return false;
+
+ //append implicit GMT timezone to ANSI C time format
+ if (strpos($dateHeader, ' GMT') === false)
+ $dateHeader .= ' GMT';
+
+
+ $realDate = strtotime($dateHeader);
+ //strtotime can return -1 or false in case of error
+ if ($realDate !== false && $realDate >= 0)
+ return new \DateTime('@' . $realDate, new \DateTimeZone('UTC'));
+
+ }
+
+ /**
+ * Transforms a DateTime object to HTTP's most common date format.
+ *
+ * We're serializing it as the RFC 1123 date, which, for HTTP must be
+ * specified as GMT.
+ *
+ * @param \DateTime $dateTime
+ * @return string
+ */
+ static function toHTTPDate(\DateTime $dateTime) {
+
+ // We need to clone it, as we don't want to affect the existing
+ // DateTime.
+ $dateTime = clone $dateTime;
+ $dateTime->setTimeZone(new \DateTimeZone('GMT'));
+ return $dateTime->format('D, d M Y H:i:s \G\M\T');
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/HTTP/Version.php b/vendor/sabre/dav/lib/Sabre/HTTP/Version.php
new file mode 100644
index 000000000..f4b70437f
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/HTTP/Version.php
@@ -0,0 +1,24 @@
+<?php
+
+namespace Sabre\HTTP;
+
+/**
+ * This class contains the Sabre\HTTP version constants.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Version {
+
+ /**
+ * Full version number
+ */
+ const VERSION = '1.8.1';
+
+ /**
+ * Stability : alpha, beta, stable
+ */
+ const STABILITY = 'stable';
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/autoload.php b/vendor/sabre/dav/lib/Sabre/autoload.php
new file mode 100644
index 000000000..8ae127350
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/autoload.php
@@ -0,0 +1,25 @@
+<?php
+
+/**
+ * SabreDAV's autoloader
+ *
+ * This file is kept for backwards compatibility purposes.
+ * SabreDAV now uses the composer autoloader.
+ *
+ * You should stop including this file, and include 'vendor/autoload.php'
+ * instead.
+ *
+ * @deprecated Will be removed in a future version!
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+
+/**
+ * We are assuming that the composer autoloader is just 2 directories up.
+ *
+ * This is not the case when sabredav is installed as a dependency. But, in
+ * those cases it's not expected that people will look for this file anyway.
+ */
+
+require __DIR__ . '/../../vendor/autoload.php';
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/Backend/AbstractPDOTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/Backend/AbstractPDOTest.php
new file mode 100644
index 000000000..2224f0b63
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/Backend/AbstractPDOTest.php
@@ -0,0 +1,550 @@
+<?php
+
+namespace Sabre\CalDAV\Backend;
+use Sabre\CalDAV;
+use Sabre\DAV;
+
+abstract class AbstractPDOTest extends \PHPUnit_Framework_TestCase {
+
+ protected $pdo;
+
+ function testConstruct() {
+
+ $backend = new PDO($this->pdo);
+ $this->assertTrue($backend instanceof PDO);
+
+ }
+
+ /**
+ * @depends testConstruct
+ */
+ function testGetCalendarsForUserNoCalendars() {
+
+ $backend = new PDO($this->pdo);
+ $calendars = $backend->getCalendarsForUser('principals/user2');
+ $this->assertEquals(array(),$calendars);
+
+ }
+
+ /**
+ * @depends testConstruct
+ */
+ function testCreateCalendarAndFetch() {
+
+ $backend = new PDO($this->pdo);
+ $returnedId = $backend->createCalendar('principals/user2','somerandomid',array(
+ '{urn:ietf:params:xml:ns:caldav}supported-calendar-component-set' => new CalDAV\Property\SupportedCalendarComponentSet(array('VEVENT')),
+ '{DAV:}displayname' => 'Hello!',
+ '{urn:ietf:params:xml:ns:caldav}schedule-calendar-transp' => new CalDAV\Property\ScheduleCalendarTransp('transparent'),
+ ));
+ $calendars = $backend->getCalendarsForUser('principals/user2');
+
+ $elementCheck = array(
+ 'id' => $returnedId,
+ 'uri' => 'somerandomid',
+ '{DAV:}displayname' => 'Hello!',
+ '{urn:ietf:params:xml:ns:caldav}calendar-description' => '',
+ '{urn:ietf:params:xml:ns:caldav}schedule-calendar-transp' => new CalDAV\Property\ScheduleCalendarTransp('transparent'),
+ );
+
+ $this->assertInternalType('array',$calendars);
+ $this->assertEquals(1,count($calendars));
+
+ foreach($elementCheck as $name=>$value) {
+
+ $this->assertArrayHasKey($name, $calendars[0]);
+ $this->assertEquals($value,$calendars[0][$name]);
+
+ }
+
+ }
+
+ /**
+ * @depends testConstruct
+ */
+ function testUpdateCalendarAndFetch() {
+
+ $backend = new PDO($this->pdo);
+
+ //Creating a new calendar
+ $newId = $backend->createCalendar('principals/user2','somerandomid',array());
+
+ // Updating the calendar
+ $result = $backend->updateCalendar($newId,array(
+ '{DAV:}displayname' => 'myCalendar',
+ '{urn:ietf:params:xml:ns:caldav}schedule-calendar-transp' => new CalDAV\Property\ScheduleCalendarTransp('transparent'),
+ ));
+
+ // Verifying the result of the update
+ $this->assertEquals(true, $result);
+
+ // Fetching all calendars from this user
+ $calendars = $backend->getCalendarsForUser('principals/user2');
+
+ // Checking if all the information is still correct
+ $elementCheck = array(
+ 'id' => $newId,
+ 'uri' => 'somerandomid',
+ '{DAV:}displayname' => 'myCalendar',
+ '{urn:ietf:params:xml:ns:caldav}calendar-description' => '',
+ '{urn:ietf:params:xml:ns:caldav}calendar-timezone' => '',
+ '{http://calendarserver.org/ns/}getctag' => '2',
+ '{urn:ietf:params:xml:ns:caldav}schedule-calendar-transp' => new CalDAV\Property\ScheduleCalendarTransp('transparent'),
+ );
+
+ $this->assertInternalType('array',$calendars);
+ $this->assertEquals(1,count($calendars));
+
+ foreach($elementCheck as $name=>$value) {
+
+ $this->assertArrayHasKey($name, $calendars[0]);
+ $this->assertEquals($value,$calendars[0][$name]);
+
+ }
+
+ }
+
+ /**
+ * @depends testUpdateCalendarAndFetch
+ */
+ function testUpdateCalendarUnknownProperty() {
+
+ $backend = new PDO($this->pdo);
+
+ //Creating a new calendar
+ $newId = $backend->createCalendar('principals/user2','somerandomid',array());
+
+ // Updating the calendar
+ $result = $backend->updateCalendar($newId,array(
+ '{DAV:}displayname' => 'myCalendar',
+ '{DAV:}yourmom' => 'wittycomment',
+ ));
+
+ // Verifying the result of the update
+ $this->assertEquals(array(
+ '403' => array('{DAV:}yourmom' => null),
+ '424' => array('{DAV:}displayname' => null),
+ ), $result);
+
+ }
+
+ /**
+ * @depends testCreateCalendarAndFetch
+ */
+ function testDeleteCalendar() {
+
+ $backend = new PDO($this->pdo);
+ $returnedId = $backend->createCalendar('principals/user2','somerandomid',array(
+ '{urn:ietf:params:xml:ns:caldav}supported-calendar-component-set' => new CalDAV\Property\SupportedCalendarComponentSet(array('VEVENT')),
+ '{DAV:}displayname' => 'Hello!',
+ ));
+
+ $backend->deleteCalendar($returnedId);
+
+ $calendars = $backend->getCalendarsForUser('principals/user2');
+ $this->assertEquals(array(),$calendars);
+
+ }
+
+ /**
+ * @depends testCreateCalendarAndFetch
+ * @expectedException \Sabre\DAV\Exception
+ */
+ function testCreateCalendarIncorrectComponentSet() {;
+
+ $backend = new PDO($this->pdo);
+
+ //Creating a new calendar
+ $newId = $backend->createCalendar('principals/user2','somerandomid',array(
+ '{urn:ietf:params:xml:ns:caldav}supported-calendar-component-set' => 'blabla',
+ ));
+
+ }
+
+ function testCreateCalendarObject() {
+
+ $backend = new PDO($this->pdo);
+ $returnedId = $backend->createCalendar('principals/user2','somerandomid',array());
+
+ $object = "BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\nDTSTART;VALUE=DATE:20120101\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n";
+
+ $backend->createCalendarObject($returnedId, 'random-id', $object);
+
+ $result = $this->pdo->query('SELECT etag, size, calendardata, firstoccurence, lastoccurence, componenttype FROM calendarobjects WHERE uri = "random-id"');
+ $this->assertEquals(array(
+ 'etag' => md5($object),
+ 'size' => strlen($object),
+ 'calendardata' => $object,
+ 'firstoccurence' => strtotime('20120101'),
+ 'lastoccurence' => strtotime('20120101')+(3600*24),
+ 'componenttype' => 'VEVENT',
+ ), $result->fetch(\PDO::FETCH_ASSOC));
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\BadRequest
+ * @depends testCreateCalendarObject
+ */
+ function testCreateCalendarObjectNoComponent() {
+
+ $backend = new PDO($this->pdo);
+ $returnedId = $backend->createCalendar('principals/user2','somerandomid',array());
+
+ $object = "BEGIN:VCALENDAR\r\nBEGIN:VTIMEZONE\r\nEND:VTIMEZONE\r\nEND:VCALENDAR\r\n";
+
+ $backend->createCalendarObject($returnedId, 'random-id', $object);
+
+ }
+
+ /**
+ * @depends testCreateCalendarObject
+ */
+ function testCreateCalendarObjectDuration() {
+
+ $backend = new PDO($this->pdo);
+ $returnedId = $backend->createCalendar('principals/user2','somerandomid',array());
+
+ $object = "BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\nDTSTART;VALUE=DATE:20120101\r\nDURATION:P2D\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n";
+
+ $backend->createCalendarObject($returnedId, 'random-id', $object);
+
+ $result = $this->pdo->query('SELECT etag, size, calendardata, firstoccurence, lastoccurence, componenttype FROM calendarobjects WHERE uri = "random-id"');
+ $this->assertEquals(array(
+ 'etag' => md5($object),
+ 'size' => strlen($object),
+ 'calendardata' => $object,
+ 'firstoccurence' => strtotime('20120101'),
+ 'lastoccurence' => strtotime('20120101')+(3600*48),
+ 'componenttype' => 'VEVENT',
+ ), $result->fetch(\PDO::FETCH_ASSOC));
+
+ }
+
+ /**
+ * @depends testCreateCalendarObject
+ */
+ function testCreateCalendarObjectNoDTEND() {
+
+ $backend = new PDO($this->pdo);
+ $returnedId = $backend->createCalendar('principals/user2','somerandomid',array());
+
+ $object = "BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\nDTSTART;VALUE=DATE-TIME:20120101T100000Z\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n";
+
+ $backend->createCalendarObject($returnedId, 'random-id', $object);
+
+ $result = $this->pdo->query('SELECT etag, size, calendardata, firstoccurence, lastoccurence, componenttype FROM calendarobjects WHERE uri = "random-id"');
+ $this->assertEquals(array(
+ 'etag' => md5($object),
+ 'size' => strlen($object),
+ 'calendardata' => $object,
+ 'firstoccurence' => strtotime('2012-01-01 10:00:00'),
+ 'lastoccurence' => strtotime('2012-01-01 10:00:00'),
+ 'componenttype' => 'VEVENT',
+ ), $result->fetch(\PDO::FETCH_ASSOC));
+
+ }
+
+ /**
+ * @depends testCreateCalendarObject
+ */
+ function testCreateCalendarObjectInfiniteReccurence() {
+
+ $backend = new PDO($this->pdo);
+ $returnedId = $backend->createCalendar('principals/user2','somerandomid',array());
+
+ $object = "BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\nDTSTART;VALUE=DATE-TIME:20120101T100000Z\r\nRRULE:FREQ=DAILY\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n";
+
+ $backend->createCalendarObject($returnedId, 'random-id', $object);
+
+ $result = $this->pdo->query('SELECT etag, size, calendardata, firstoccurence, lastoccurence, componenttype FROM calendarobjects WHERE uri = "random-id"');
+ $this->assertEquals(array(
+ 'etag' => md5($object),
+ 'size' => strlen($object),
+ 'calendardata' => $object,
+ 'firstoccurence' => strtotime('2012-01-01 10:00:00'),
+ 'lastoccurence' => strtotime(PDO::MAX_DATE),
+ 'componenttype' => 'VEVENT',
+ ), $result->fetch(\PDO::FETCH_ASSOC));
+
+ }
+
+ /**
+ * @depends testCreateCalendarObject
+ */
+ function testCreateCalendarObjectEndingReccurence() {
+
+ $backend = new PDO($this->pdo);
+ $returnedId = $backend->createCalendar('principals/user2','somerandomid',array());
+
+ $object = "BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\nDTSTART;VALUE=DATE-TIME:20120101T100000Z\r\nDTEND;VALUE=DATE-TIME:20120101T110000Z\r\nRRULE:FREQ=DAILY;COUNT=1000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n";
+
+ $backend->createCalendarObject($returnedId, 'random-id', $object);
+
+ $result = $this->pdo->query('SELECT etag, size, calendardata, firstoccurence, lastoccurence, componenttype FROM calendarobjects WHERE uri = "random-id"');
+ $this->assertEquals(array(
+ 'etag' => md5($object),
+ 'size' => strlen($object),
+ 'calendardata' => $object,
+ 'firstoccurence' => strtotime('2012-01-01 10:00:00'),
+ 'lastoccurence' => strtotime('2012-01-01 11:00:00') + (3600 * 24 * 999),
+ 'componenttype' => 'VEVENT',
+ ), $result->fetch(\PDO::FETCH_ASSOC));
+
+ }
+
+ /**
+ * @depends testCreateCalendarObject
+ */
+ function testCreateCalendarObjectTask() {
+
+ $backend = new PDO($this->pdo);
+ $returnedId = $backend->createCalendar('principals/user2','somerandomid',array());
+
+ $object = "BEGIN:VCALENDAR\r\nBEGIN:VTODO\r\nDUE;VALUE=DATE-TIME:20120101T100000Z\r\nEND:VTODO\r\nEND:VCALENDAR\r\n";
+
+ $backend->createCalendarObject($returnedId, 'random-id', $object);
+
+ $result = $this->pdo->query('SELECT etag, size, calendardata, firstoccurence, lastoccurence, componenttype FROM calendarobjects WHERE uri = "random-id"');
+ $this->assertEquals(array(
+ 'etag' => md5($object),
+ 'size' => strlen($object),
+ 'calendardata' => $object,
+ 'firstoccurence' => null,
+ 'lastoccurence' => null,
+ 'componenttype' => 'VTODO',
+ ), $result->fetch(\PDO::FETCH_ASSOC));
+
+ }
+
+ /**
+ * @depends testCreateCalendarObject
+ */
+ function testGetCalendarObjects() {
+
+ $backend = new PDO($this->pdo);
+ $returnedId = $backend->createCalendar('principals/user2','somerandomid',array());
+
+ $object = "BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\nDTSTART;VALUE=DATE:20120101\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n";
+ $backend->createCalendarObject($returnedId, 'random-id', $object);
+
+ $data = $backend->getCalendarObjects($returnedId,'random-id');
+
+ $this->assertEquals(1, count($data));
+ $data = $data[0];
+
+ $this->assertEquals($returnedId, $data['calendarid']);
+ $this->assertEquals('random-id', $data['uri']);
+ $this->assertEquals(strlen($object),$data['size']);
+
+
+ }
+
+ /**
+ * @depends testCreateCalendarObject
+ */
+ function testUpdateCalendarObject() {
+
+ $backend = new PDO($this->pdo);
+ $returnedId = $backend->createCalendar('principals/user2','somerandomid',array());
+
+ $object = "BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\nDTSTART;VALUE=DATE:20120101\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n";
+ $object2 = "BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\nDTSTART;VALUE=DATE:20130101\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n";
+ $backend->createCalendarObject($returnedId, 'random-id', $object);
+ $backend->updateCalendarObject($returnedId, 'random-id', $object2);
+
+ $data = $backend->getCalendarObject($returnedId,'random-id');
+
+ $this->assertEquals($object2, $data['calendardata']);
+ $this->assertEquals($returnedId, $data['calendarid']);
+ $this->assertEquals('random-id', $data['uri']);
+
+
+ }
+
+ /**
+ * @depends testCreateCalendarObject
+ */
+ function testDeleteCalendarObject() {
+
+ $backend = new PDO($this->pdo);
+ $returnedId = $backend->createCalendar('principals/user2','somerandomid',array());
+
+ $object = "BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\nDTSTART;VALUE=DATE:20120101\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n";
+ $backend->createCalendarObject($returnedId, 'random-id', $object);
+ $backend->deleteCalendarObject($returnedId, 'random-id');
+
+ $data = $backend->getCalendarObject($returnedId,'random-id');
+ $this->assertNull($data);
+
+ }
+
+ function testCalendarQueryNoResult() {
+
+ $abstract = new PDO($this->pdo);
+ $filters = array(
+ 'name' => 'VCALENDAR',
+ 'comp-filters' => array(
+ array(
+ 'name' => 'VJOURNAL',
+ 'comp-filters' => array(),
+ 'prop-filters' => array(),
+ 'is-not-defined' => false,
+ 'time-range' => null,
+ ),
+ ),
+ 'prop-filters' => array(),
+ 'is-not-defined' => false,
+ 'time-range' => null,
+ );
+
+ $this->assertEquals(array(
+ ), $abstract->calendarQuery(1, $filters));
+
+ }
+
+ function testCalendarQueryTodo() {
+
+ $backend = new PDO($this->pdo);
+ $backend->createCalendarObject(1, "todo", "BEGIN:VCALENDAR\r\nBEGIN:VTODO\r\nEND:VTODO\r\nEND:VCALENDAR\r\n");
+ $backend->createCalendarObject(1, "event", "BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\nDTSTART:20120101\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n");
+
+ $filters = array(
+ 'name' => 'VCALENDAR',
+ 'comp-filters' => array(
+ array(
+ 'name' => 'VTODO',
+ 'comp-filters' => array(),
+ 'prop-filters' => array(),
+ 'is-not-defined' => false,
+ 'time-range' => null,
+ ),
+ ),
+ 'prop-filters' => array(),
+ 'is-not-defined' => false,
+ 'time-range' => null,
+ );
+
+ $this->assertEquals(array(
+ "todo",
+ ), $backend->calendarQuery(1, $filters));
+
+ }
+ function testCalendarQueryTodoNotMatch() {
+
+ $backend = new PDO($this->pdo);
+ $backend->createCalendarObject(1, "todo", "BEGIN:VCALENDAR\r\nBEGIN:VTODO\r\nEND:VTODO\r\nEND:VCALENDAR\r\n");
+ $backend->createCalendarObject(1, "event", "BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\nDTSTART:20120101\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n");
+
+ $filters = array(
+ 'name' => 'VCALENDAR',
+ 'comp-filters' => array(
+ array(
+ 'name' => 'VTODO',
+ 'comp-filters' => array(),
+ 'prop-filters' => array(
+ array(
+ 'name' => 'summary',
+ 'text-match' => null,
+ 'time-range' => null,
+ 'param-filters' => array(),
+ 'is-not-defined' => false,
+ ),
+ ),
+ 'is-not-defined' => false,
+ 'time-range' => null,
+ ),
+ ),
+ 'prop-filters' => array(),
+ 'is-not-defined' => false,
+ 'time-range' => null,
+ );
+
+ $this->assertEquals(array(
+ ), $backend->calendarQuery(1, $filters));
+
+ }
+
+ function testCalendarQueryNoFilter() {
+
+ $backend = new PDO($this->pdo);
+ $backend->createCalendarObject(1, "todo", "BEGIN:VCALENDAR\r\nBEGIN:VTODO\r\nEND:VTODO\r\nEND:VCALENDAR\r\n");
+ $backend->createCalendarObject(1, "event", "BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\nDTSTART:20120101\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n");
+
+ $filters = array(
+ 'name' => 'VCALENDAR',
+ 'comp-filters' => array(),
+ 'prop-filters' => array(),
+ 'is-not-defined' => false,
+ 'time-range' => null,
+ );
+
+ $result = $backend->calendarQuery(1, $filters);
+ $this->assertTrue(in_array('todo', $result));
+ $this->assertTrue(in_array('event', $result));
+
+ }
+
+ function testCalendarQueryTimeRange() {
+
+ $backend = new PDO($this->pdo);
+ $backend->createCalendarObject(1, "todo", "BEGIN:VCALENDAR\r\nBEGIN:VTODO\r\nEND:VTODO\r\nEND:VCALENDAR\r\n");
+ $backend->createCalendarObject(1, "event", "BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\nDTSTART;VALUE=DATE:20120101\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n");
+ $backend->createCalendarObject(1, "event2", "BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\nDTSTART;VALUE=DATE:20120103\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n");
+
+ $filters = array(
+ 'name' => 'VCALENDAR',
+ 'comp-filters' => array(
+ array(
+ 'name' => 'VEVENT',
+ 'comp-filters' => array(),
+ 'prop-filters' => array(),
+ 'is-not-defined' => false,
+ 'time-range' => array(
+ 'start' => new \DateTime('20120103'),
+ 'end' => new \DateTime('20120104'),
+ ),
+ ),
+ ),
+ 'prop-filters' => array(),
+ 'is-not-defined' => false,
+ 'time-range' => null,
+ );
+
+ $this->assertEquals(array(
+ "event2",
+ ), $backend->calendarQuery(1, $filters));
+
+ }
+ function testCalendarQueryTimeRangeNoEnd() {
+
+ $backend = new PDO($this->pdo);
+ $backend->createCalendarObject(1, "todo", "BEGIN:VCALENDAR\r\nBEGIN:VTODO\r\nEND:VTODO\r\nEND:VCALENDAR\r\n");
+ $backend->createCalendarObject(1, "event", "BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\nDTSTART:20120101\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n");
+ $backend->createCalendarObject(1, "event2", "BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\nDTSTART:20120103\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n");
+
+ $filters = array(
+ 'name' => 'VCALENDAR',
+ 'comp-filters' => array(
+ array(
+ 'name' => 'VEVENT',
+ 'comp-filters' => array(),
+ 'prop-filters' => array(),
+ 'is-not-defined' => false,
+ 'time-range' => array(
+ 'start' => new \DateTime('20120102'),
+ 'end' => null,
+ ),
+ ),
+ ),
+ 'prop-filters' => array(),
+ 'is-not-defined' => false,
+ 'time-range' => null,
+ );
+
+ $this->assertEquals(array(
+ "event2",
+ ), $backend->calendarQuery(1, $filters));
+
+ }
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/Backend/AbstractTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/Backend/AbstractTest.php
new file mode 100644
index 000000000..04fb16df5
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/Backend/AbstractTest.php
@@ -0,0 +1,88 @@
+<?php
+
+namespace Sabre\CalDAV\Backend;
+
+class AbstractTest extends \PHPUnit_Framework_TestCase {
+
+ function testUpdateCalendar() {
+
+ $abstract = new AbstractMock();
+ $this->assertEquals(false, $abstract->updateCalendar('randomid', array('{DAV:}displayname' => 'anything')));
+
+ }
+
+ function testCalendarQuery() {
+
+ $abstract = new AbstractMock();
+ $filters = array(
+ 'name' => 'VCALENDAR',
+ 'comp-filters' => array(
+ array(
+ 'name' => 'VEVENT',
+ 'comp-filters' => array(),
+ 'prop-filters' => array(),
+ 'is-not-defined' => false,
+ 'time-range' => null,
+ ),
+ ),
+ 'prop-filters' => array(),
+ 'is-not-defined' => false,
+ 'time-range' => null,
+ );
+
+ $this->assertEquals(array(
+ 'event1.ics',
+ ), $abstract->calendarQuery(1, $filters));
+
+ }
+
+}
+
+class AbstractMock extends AbstractBackend {
+
+ function getCalendarsForUser($principalUri) { }
+ function createCalendar($principalUri,$calendarUri,array $properties) { }
+ function deleteCalendar($calendarId) { }
+ function getCalendarObjects($calendarId) {
+
+ return array(
+ array(
+ 'id' => 1,
+ 'calendarid' => 1,
+ 'uri' => 'event1.ics',
+ ),
+ array(
+ 'id' => 2,
+ 'calendarid' => 1,
+ 'uri' => 'task1.ics',
+ ),
+ );
+
+ }
+ function getCalendarObject($calendarId,$objectUri) {
+
+ switch($objectUri) {
+
+ case 'event1.ics' :
+ return array(
+ 'id' => 1,
+ 'calendarid' => 1,
+ 'uri' => 'event1.ics',
+ 'calendardata' => "BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n",
+ );
+ case 'task1.ics' :
+ return array(
+ 'id' => 1,
+ 'calendarid' => 1,
+ 'uri' => 'event1.ics',
+ 'calendardata' => "BEGIN:VCALENDAR\r\nBEGIN:VTODO\r\nEND:VTODO\r\nEND:VCALENDAR\r\n",
+ );
+
+ }
+
+ }
+ function createCalendarObject($calendarId,$objectUri,$calendarData) { }
+ function updateCalendarObject($calendarId,$objectUri,$calendarData) { }
+ function deleteCalendarObject($calendarId,$objectUri) { }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/Backend/Mock.php b/vendor/sabre/dav/tests/Sabre/CalDAV/Backend/Mock.php
new file mode 100644
index 000000000..d196297f7
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/Backend/Mock.php
@@ -0,0 +1,400 @@
+<?php
+
+namespace Sabre\CalDAV\Backend;
+use Sabre\DAV;
+use Sabre\CalDAV;
+
+class Mock extends AbstractBackend implements NotificationSupport, SharingSupport {
+
+ private $calendarData;
+ private $calendars;
+ private $notifications;
+ private $shares = array();
+
+ function __construct(array $calendars, array $calendarData, array $notifications = array()) {
+
+ $this->calendars = $calendars;
+ $this->calendarData = $calendarData;
+ $this->notifications = $notifications;
+
+ }
+
+ /**
+ * Returns a list of calendars for a principal.
+ *
+ * Every project is an array with the following keys:
+ * * id, a unique id that will be used by other functions to modify the
+ * calendar. This can be the same as the uri or a database key.
+ * * uri, which the basename of the uri with which the calendar is
+ * accessed.
+ * * principalUri. The owner of the calendar. Almost always the same as
+ * principalUri passed to this method.
+ *
+ * Furthermore it can contain webdav properties in clark notation. A very
+ * common one is '{DAV:}displayname'.
+ *
+ * @param string $principalUri
+ * @return array
+ */
+ function getCalendarsForUser($principalUri) {
+
+ $r = array();
+ foreach($this->calendars as $row) {
+ if ($row['principaluri'] == $principalUri) {
+ $r[] = $row;
+ }
+ }
+
+ return $r;
+
+ }
+
+ /**
+ * Creates a new calendar for a principal.
+ *
+ * If the creation was a success, an id must be returned that can be used to reference
+ * this calendar in other methods, such as updateCalendar.
+ *
+ * This function must return a server-wide unique id that can be used
+ * later to reference the calendar.
+ *
+ * @param string $principalUri
+ * @param string $calendarUri
+ * @param array $properties
+ * @return string|int
+ */
+ function createCalendar($principalUri,$calendarUri,array $properties) {
+
+ $id = DAV\UUIDUtil::getUUID();
+ $this->calendars[] = array_merge(array(
+ 'id' => $id,
+ 'principaluri' => $principalUri,
+ 'uri' => $calendarUri,
+ '{' . CalDAV\Plugin::NS_CALDAV . '}supported-calendar-component-set' => new CalDAV\Property\SupportedCalendarComponentSet(array('VEVENT','VTODO')),
+ ), $properties);
+
+ return $id;
+
+ }
+
+ /**
+ * Updates properties on this node,
+ *
+ * The properties array uses the propertyName in clark-notation as key,
+ * and the array value for the property value. In the case a property
+ * should be deleted, the property value will be null.
+ *
+ * This method must be atomic. If one property cannot be changed, the
+ * entire operation must fail.
+ *
+ * If the operation was successful, true can be returned.
+ * If the operation failed, false can be returned.
+ *
+ * Deletion of a non-existent property is always successful.
+ *
+ * Lastly, it is optional to return detailed information about any
+ * failures. In this case an array should be returned with the following
+ * structure:
+ *
+ * array(
+ * 403 => array(
+ * '{DAV:}displayname' => null,
+ * ),
+ * 424 => array(
+ * '{DAV:}owner' => null,
+ * )
+ * )
+ *
+ * In this example it was forbidden to update {DAV:}displayname.
+ * (403 Forbidden), which in turn also caused {DAV:}owner to fail
+ * (424 Failed Dependency) because the request needs to be atomic.
+ *
+ * @param string $calendarId
+ * @param array $properties
+ * @return bool|array
+ */
+ public function updateCalendar($calendarId, array $properties) {
+
+ return false;
+
+ }
+
+ /**
+ * Delete a calendar and all it's objects
+ *
+ * @param string $calendarId
+ * @return void
+ */
+ public function deleteCalendar($calendarId) {
+
+ foreach($this->calendars as $k=>$calendar) {
+ if ($calendar['id'] === $calendarId) {
+ unset($this->calendars[$k]);
+ }
+ }
+
+ }
+
+ /**
+ * Returns all calendar objects within a calendar object.
+ *
+ * Every item contains an array with the following keys:
+ * * id - unique identifier which will be used for subsequent updates
+ * * calendardata - The iCalendar-compatible calendar data
+ * * uri - a unique key which will be used to construct the uri. This can be any arbitrary string.
+ * * lastmodified - a timestamp of the last modification time
+ * * etag - An arbitrary string, surrounded by double-quotes. (e.g.:
+ * ' "abcdef"')
+ * * calendarid - The calendarid as it was passed to this function.
+ *
+ * Note that the etag is optional, but it's highly encouraged to return for
+ * speed reasons.
+ *
+ * The calendardata is also optional. If it's not returned
+ * 'getCalendarObject' will be called later, which *is* expected to return
+ * calendardata.
+ *
+ * @param string $calendarId
+ * @return array
+ */
+ public function getCalendarObjects($calendarId) {
+
+ if (!isset($this->calendarData[$calendarId]))
+ return array();
+
+ $objects = $this->calendarData[$calendarId];
+
+ foreach($objects as $uri => &$object) {
+ $object['calendarid'] = $calendarId;
+ $object['uri'] = $uri;
+
+ }
+ return $objects;
+
+ }
+
+ /**
+ * Returns information from a single calendar object, based on it's object
+ * uri.
+ *
+ * The returned array must have the same keys as getCalendarObjects. The
+ * 'calendardata' object is required here though, while it's not required
+ * for getCalendarObjects.
+ *
+ * @param string $calendarId
+ * @param string $objectUri
+ * @return array
+ */
+ function getCalendarObject($calendarId,$objectUri) {
+
+ if (!isset($this->calendarData[$calendarId][$objectUri])) {
+ throw new DAV\Exception\NotFound('Object could not be found');
+ }
+ $object = $this->calendarData[$calendarId][$objectUri];
+ $object['calendarid'] = $calendarId;
+ $object['uri'] = $objectUri;
+ return $object;
+
+ }
+
+ /**
+ * Creates a new calendar object.
+ *
+ * @param string $calendarId
+ * @param string $objectUri
+ * @param string $calendarData
+ * @return void
+ */
+ function createCalendarObject($calendarId,$objectUri,$calendarData) {
+
+ $this->calendarData[$calendarId][$objectUri] = array(
+ 'calendardata' => $calendarData,
+ 'calendarid' => $calendarId,
+ 'uri' => $objectUri,
+ );
+
+ }
+
+ /**
+ * Updates an existing calendarobject, based on it's uri.
+ *
+ * @param string $calendarId
+ * @param string $objectUri
+ * @param string $calendarData
+ * @return void
+ */
+ function updateCalendarObject($calendarId,$objectUri,$calendarData) {
+
+ $this->calendarData[$calendarId][$objectUri] = array(
+ 'calendardata' => $calendarData,
+ 'calendarid' => $calendarId,
+ 'uri' => $objectUri,
+ );
+
+ }
+
+ /**
+ * Deletes an existing calendar object.
+ *
+ * @param string $calendarId
+ * @param string $objectUri
+ * @return void
+ */
+ function deleteCalendarObject($calendarId,$objectUri) {
+
+ throw new Exception('Not implemented');
+
+
+ }
+
+ /**
+ * Returns a list of notifications for a given principal url.
+ *
+ * The returned array should only consist of implementations of
+ * Sabre\CalDAV\Notifications\INotificationType.
+ *
+ * @param string $principalUri
+ * @return array
+ */
+ public function getNotificationsForPrincipal($principalUri) {
+
+ if (isset($this->notifications[$principalUri])) {
+ return $this->notifications[$principalUri];
+ }
+ return array();
+
+ }
+
+ /**
+ * This deletes a specific notifcation.
+ *
+ * This may be called by a client once it deems a notification handled.
+ *
+ * @param string $principalUri
+ * @param Sabre\CalDAV\Notifications\INotificationType $notification
+ * @return void
+ */
+ public function deleteNotification($principalUri, CalDAV\Notifications\INotificationType $notification) {
+
+ foreach($this->notifications[$principalUri] as $key=>$value) {
+ if ($notification === $value) {
+ unset($this->notifications[$principalUri][$key]);
+ }
+ }
+
+ }
+
+ /**
+ * Updates the list of shares.
+ *
+ * The first array is a list of people that are to be added to the
+ * calendar.
+ *
+ * Every element in the add array has the following properties:
+ * * href - A url. Usually a mailto: address
+ * * commonName - Usually a first and last name, or false
+ * * summary - A description of the share, can also be false
+ * * readOnly - A boolean value
+ *
+ * Every element in the remove array is just the address string.
+ *
+ * Note that if the calendar is currently marked as 'not shared' by and
+ * this method is called, the calendar should be 'upgraded' to a shared
+ * calendar.
+ *
+ * @param mixed $calendarId
+ * @param array $add
+ * @param array $remove
+ * @return void
+ */
+ public function updateShares($calendarId, array $add, array $remove) {
+
+ if (!isset($this->shares[$calendarId])) {
+ $this->shares[$calendarId] = array();
+ }
+
+ foreach($add as $val) {
+ $val['status'] = CalDAV\SharingPlugin::STATUS_NORESPONSE;
+ $this->shares[$calendarId][] = $val;
+ }
+
+ foreach($this->shares[$calendarId] as $k=>$share) {
+
+ if (in_array($share['href'], $remove)) {
+ unset($this->shares[$calendarId][$k]);
+ }
+
+ }
+
+ // Re-numbering keys
+ $this->shares[$calendarId] = array_values($this->shares[$calendarId]);
+
+ }
+
+ /**
+ * Returns the list of people whom this calendar is shared with.
+ *
+ * Every element in this array should have the following properties:
+ * * href - Often a mailto: address
+ * * commonName - Optional, for example a first + last name
+ * * status - See the Sabre\CalDAV\SharingPlugin::STATUS_ constants.
+ * * readOnly - boolean
+ * * summary - Optional, a description for the share
+ *
+ * @param mixed $calendarId
+ * @return array
+ */
+ public function getShares($calendarId) {
+
+ if (!isset($this->shares[$calendarId])) {
+ return array();
+ }
+
+ return $this->shares[$calendarId];
+
+ }
+
+ /**
+ * This method is called when a user replied to a request to share.
+ *
+ * @param string href The sharee who is replying (often a mailto: address)
+ * @param int status One of the SharingPlugin::STATUS_* constants
+ * @param string $calendarUri The url to the calendar thats being shared
+ * @param string $inReplyTo The unique id this message is a response to
+ * @param string $summary A description of the reply
+ * @return void
+ */
+ public function shareReply($href, $status, $calendarUri, $inReplyTo, $summary = null) {
+
+ // This operation basically doesn't do anything yet
+ if ($status === CalDAV\SharingPlugin::STATUS_ACCEPTED) {
+ return 'calendars/blabla/calendar';
+ }
+
+ }
+
+ /**
+ * Publishes a calendar
+ *
+ * @param mixed $calendarId
+ * @param bool $value
+ * @return void
+ */
+ public function setPublishStatus($calendarId, $value) {
+
+ foreach($this->calendars as $k=>$cal) {
+ if ($cal['id'] === $calendarId) {
+ if (!$value) {
+ unset($cal['{http://calendarserver.org/ns/}publish-url']);
+ } else {
+ $cal['{http://calendarserver.org/ns/}publish-url'] = 'http://example.org/public/ ' . $calendarId . '.ics';
+ }
+ return;
+ }
+ }
+
+ throw new DAV\Exception('Calendar with id "' . $calendarId . '" not found');
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/Backend/PDOMySQLTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/Backend/PDOMySQLTest.php
new file mode 100644
index 000000000..15c1d91fd
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/Backend/PDOMySQLTest.php
@@ -0,0 +1,39 @@
+<?php
+
+namespace Sabre\CalDAV\Backend;
+
+require_once 'Sabre/TestUtil.php';
+require_once 'Sabre/CalDAV/TestUtil.php';
+require_once 'Sabre/CalDAV/Backend/AbstractPDOTest.php';
+
+class PDOMySQLTest extends AbstractPDOTest {
+
+ function setup() {
+
+ if (!SABRE_HASMYSQL) $this->markTestSkipped('MySQL driver is not available, or not properly configured');
+ $pdo = \Sabre\TestUtil::getMySQLDB();
+ if (!$pdo) $this->markTestSkipped('Could not connect to mysql database');
+
+ $pdo->query('DROP TABLE IF EXISTS calendarobjects, calendars');
+
+ $queries = explode(
+ ';',
+ file_get_contents(__DIR__ . '/../../../../examples/sql/mysql.calendars.sql')
+ );
+
+ foreach($queries as $query) {
+ $query = trim($query," \r\n\t");
+ if ($query)
+ $pdo->exec($query);
+ }
+ $this->pdo = $pdo;
+
+ }
+
+ function teardown() {
+
+ $this->pdo = null;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/Backend/PDOSqliteTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/Backend/PDOSqliteTest.php
new file mode 100644
index 000000000..c50f06986
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/Backend/PDOSqliteTest.php
@@ -0,0 +1,25 @@
+<?php
+
+namespace Sabre\CalDAV\Backend;
+
+use Sabre\CalDAV;
+
+require_once 'Sabre/CalDAV/Backend/AbstractPDOTest.php';
+
+class PDOSQLiteTest extends AbstractPDOTest {
+
+ function setup() {
+
+ if (!SABRE_HASSQLITE) $this->markTestSkipped('SQLite driver is not available');
+ $this->pdo = CalDAV\TestUtil::getSQLiteDB();
+
+ }
+
+ function teardown() {
+
+ $this->pdo = null;
+ unlink(SABRE_TEMPDIR . '/testdb.sqlite');
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/CalendarObjectTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/CalendarObjectTest.php
new file mode 100644
index 000000000..eab10eae7
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/CalendarObjectTest.php
@@ -0,0 +1,359 @@
+<?php
+
+namespace Sabre\CalDAV;
+use Sabre\DAVACL;
+
+require_once 'Sabre/CalDAV/TestUtil.php';
+
+class CalendarObjectTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * @var Sabre\CalDAV\Backend_PDO
+ */
+ protected $backend;
+ /**
+ * @var Sabre\CalDAV\Calendar
+ */
+ protected $calendar;
+ protected $principalBackend;
+
+ function setup() {
+
+ if (!SABRE_HASSQLITE) $this->markTestSkipped('SQLite driver is not available');
+ $this->backend = TestUtil::getBackend();
+
+ $calendars = $this->backend->getCalendarsForUser('principals/user1');
+ $this->assertEquals(2,count($calendars));
+ $this->calendar = new Calendar($this->backend, $calendars[0]);
+
+ }
+
+ function teardown() {
+
+ unset($this->calendar);
+ unset($this->backend);
+
+ }
+
+ function testSetup() {
+
+ $children = $this->calendar->getChildren();
+ $this->assertTrue($children[0] instanceof CalendarObject);
+
+ $this->assertInternalType('string',$children[0]->getName());
+ $this->assertInternalType('string',$children[0]->get());
+ $this->assertInternalType('string',$children[0]->getETag());
+ $this->assertEquals('text/calendar; charset=utf-8', $children[0]->getContentType());
+
+ }
+
+ /**
+ * @expectedException InvalidArgumentException
+ */
+ function testInvalidArg1() {
+
+ $obj = new CalendarObject(
+ new Backend\Mock(array(),array()),
+ array(),
+ array()
+ );
+
+ }
+
+ /**
+ * @expectedException InvalidArgumentException
+ */
+ function testInvalidArg2() {
+
+ $obj = new CalendarObject(
+ new Backend\Mock(array(),array()),
+ array(),
+ array('calendarid' => '1')
+ );
+
+ }
+
+ /**
+ * @depends testSetup
+ */
+ function testPut() {
+
+ $children = $this->calendar->getChildren();
+ $this->assertTrue($children[0] instanceof CalendarObject);
+ $newData = TestUtil::getTestCalendarData();
+
+ $children[0]->put($newData);
+ $this->assertEquals($newData, $children[0]->get());
+
+ }
+
+ /**
+ * @depends testSetup
+ */
+ function testPutStream() {
+
+ $children = $this->calendar->getChildren();
+ $this->assertTrue($children[0] instanceof CalendarObject);
+ $newData = TestUtil::getTestCalendarData();
+
+ $stream = fopen('php://temp','r+');
+ fwrite($stream, $newData);
+ rewind($stream);
+ $children[0]->put($stream);
+ $this->assertEquals($newData, $children[0]->get());
+
+ }
+
+
+ /**
+ * @depends testSetup
+ */
+ function testDelete() {
+
+ $children = $this->calendar->getChildren();
+ $this->assertTrue($children[0] instanceof CalendarObject);
+
+ $obj = $children[0];
+ $obj->delete();
+
+ $children2 = $this->calendar->getChildren();
+ $this->assertEquals(count($children)-1, count($children2));
+
+ }
+
+ /**
+ * @depends testSetup
+ */
+ function testGetLastModified() {
+
+ $children = $this->calendar->getChildren();
+ $this->assertTrue($children[0] instanceof CalendarObject);
+
+ $obj = $children[0];
+
+ $lastMod = $obj->getLastModified();
+ $this->assertTrue(is_int($lastMod) || ctype_digit($lastMod));
+
+ }
+
+ /**
+ * @depends testSetup
+ */
+ function testGetSize() {
+
+ $children = $this->calendar->getChildren();
+ $this->assertTrue($children[0] instanceof CalendarObject);
+
+ $obj = $children[0];
+
+ $size = $obj->getSize();
+ $this->assertInternalType('int', $size);
+
+ }
+
+ function testGetOwner() {
+
+ $children = $this->calendar->getChildren();
+ $this->assertTrue($children[0] instanceof CalendarObject);
+
+ $obj = $children[0];
+ $this->assertEquals('principals/user1', $obj->getOwner());
+
+ }
+
+ function testGetGroup() {
+
+ $children = $this->calendar->getChildren();
+ $this->assertTrue($children[0] instanceof CalendarObject);
+
+ $obj = $children[0];
+ $this->assertNull($obj->getGroup());
+
+ }
+
+ function testGetACL() {
+
+ $expected = array(
+ array(
+ 'privilege' => '{DAV:}read',
+ 'principal' => 'principals/user1',
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}write',
+ 'principal' => 'principals/user1',
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}read',
+ 'principal' => 'principals/user1/calendar-proxy-write',
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}write',
+ 'principal' => 'principals/user1/calendar-proxy-write',
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}read',
+ 'principal' => 'principals/user1/calendar-proxy-read',
+ 'protected' => true,
+ ),
+ );
+
+ $children = $this->calendar->getChildren();
+ $this->assertTrue($children[0] instanceof CalendarObject);
+
+ $obj = $children[0];
+ $this->assertEquals($expected, $obj->getACL());
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\MethodNotAllowed
+ */
+ function testSetACL() {
+
+ $children = $this->calendar->getChildren();
+ $this->assertTrue($children[0] instanceof CalendarObject);
+
+ $obj = $children[0];
+ $obj->setACL(array());
+
+ }
+
+ function testGet() {
+
+ $children = $this->calendar->getChildren();
+ $this->assertTrue($children[0] instanceof CalendarObject);
+
+ $obj = $children[0];
+
+ $expected = "BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Apple Inc.//iCal 4.0.1//EN
+CALSCALE:GREGORIAN
+BEGIN:VTIMEZONE
+TZID:Asia/Seoul
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0900
+RRULE:FREQ=YEARLY;UNTIL=19880507T150000Z;BYMONTH=5;BYDAY=2SU
+DTSTART:19870510T000000
+TZNAME:GMT+09:00
+TZOFFSETTO:+1000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+1000
+DTSTART:19881009T000000
+TZNAME:GMT+09:00
+TZOFFSETTO:+0900
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+CREATED:20100225T154229Z
+UID:39A6B5ED-DD51-4AFE-A683-C35EE3749627
+TRANSP:TRANSPARENT
+SUMMARY:Something here
+DTSTAMP:20100228T130202Z
+DTSTART;TZID=Asia/Seoul:20100223T060000
+DTEND;TZID=Asia/Seoul:20100223T070000
+ATTENDEE;PARTSTAT=NEEDS-ACTION:mailto:lisa@example.com
+SEQUENCE:2
+END:VEVENT
+END:VCALENDAR";
+
+
+
+ $this->assertEquals($expected, $obj->get());
+
+ }
+
+ function testGetRefetch() {
+
+ $backend = new Backend\Mock(array(), array(
+ 1 => array(
+ 'foo' => array(
+ 'calendardata' => 'foo',
+ 'uri' => 'foo'
+ ),
+ )
+ ));
+ $obj = new CalendarObject($backend, array(), array('calendarid' => 1, 'uri' => 'foo'));
+
+ $this->assertEquals('foo', $obj->get());
+
+ }
+
+ function testGetEtag1() {
+
+ $objectInfo = array(
+ 'calendardata' => 'foo',
+ 'uri' => 'foo',
+ 'etag' => 'bar',
+ 'calendarid' => 1
+ );
+
+ $backend = new Backend\Mock(array(), array());
+ $obj = new CalendarObject($backend, array(), $objectInfo);
+
+ $this->assertEquals('bar', $obj->getETag());
+
+ }
+
+ function testGetEtag2() {
+
+ $objectInfo = array(
+ 'calendardata' => 'foo',
+ 'uri' => 'foo',
+ 'calendarid' => 1
+ );
+
+ $backend = new Backend\Mock(array(), array());
+ $obj = new CalendarObject($backend, array(), $objectInfo);
+
+ $this->assertEquals('"' . md5('foo') . '"', $obj->getETag());
+
+ }
+
+ function testGetSupportedPrivilegesSet() {
+
+ $objectInfo = array(
+ 'calendardata' => 'foo',
+ 'uri' => 'foo',
+ 'calendarid' => 1
+ );
+
+ $backend = new Backend\Mock(array(), array());
+ $obj = new CalendarObject($backend, array(), $objectInfo);
+ $this->assertNull($obj->getSupportedPrivilegeSet());
+
+ }
+
+ function testGetSize1() {
+
+ $objectInfo = array(
+ 'calendardata' => 'foo',
+ 'uri' => 'foo',
+ 'calendarid' => 1
+ );
+
+ $backend = new Backend\Mock(array(), array());
+ $obj = new CalendarObject($backend, array(), $objectInfo);
+ $this->assertEquals(3, $obj->getSize());
+
+ }
+
+ function testGetSize2() {
+
+ $objectInfo = array(
+ 'uri' => 'foo',
+ 'calendarid' => 1,
+ 'size' => 4,
+ );
+
+ $backend = new Backend\Mock(array(), array());
+ $obj = new CalendarObject($backend, array(), $objectInfo);
+ $this->assertEquals(4, $obj->getSize());
+
+ }
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/CalendarQueryParserTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/CalendarQueryParserTest.php
new file mode 100644
index 000000000..fdfe4de89
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/CalendarQueryParserTest.php
@@ -0,0 +1,540 @@
+<?php
+
+namespace Sabre\CalDAV;
+use Sabre\DAV;
+
+class CalendarQueryParserTest extends \PHPUnit_Framework_TestCase {
+
+ function parse($xml) {
+
+ $xml =
+'<?xml version="1.0"?>
+<c:calendar-query xmlns:c="urn:ietf:params:xml:ns:caldav" xmlns:d="DAV:">
+' . implode("\n", $xml) . '
+</c:calendar-query>';
+
+ $dom = DAV\XMLUtil::loadDOMDocument($xml);
+
+ $q = new CalendarQueryParser($dom);
+ $q->parse();
+ return $q->filters;
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\BadRequest
+ */
+ function testNoFilter() {
+
+ $xml = array();
+ $this->parse($xml);
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\BadRequest
+ */
+ function testTwoCompFilter() {
+
+ $xml = array(
+ '<c:filter>',
+ ' <c:comp-filter name="VEVENT" />',
+ ' <c:comp-filter name="VEVENT" />',
+ '</c:filter>'
+ );
+ $this->parse($xml);
+
+ }
+
+ function testBasicFilter() {
+
+ $xml = array(
+ '<c:filter>',
+ ' <c:comp-filter name="VCALENDAR" />',
+ '</c:filter>'
+ );
+ $result = $this->parse($xml);
+
+ $expected = array(
+ 'name' => 'VCALENDAR',
+ 'comp-filters' => array(),
+ 'prop-filters' => array(),
+ 'is-not-defined' => false,
+ 'time-range' => false
+ );
+
+ $this->assertEquals(
+ $expected,
+ $result
+ );
+
+ }
+
+ function testCompIsNotDefined() {
+
+ $xml = array(
+ '<c:filter>',
+ ' <c:comp-filter name="VCALENDAR">',
+ ' <c:comp-filter name="VEVENT">',
+ ' <c:is-not-defined/>',
+ ' </c:comp-filter>',
+ ' </c:comp-filter>',
+ '</c:filter>'
+ );
+ $result = $this->parse($xml);
+
+ $expected = array(
+ 'name' => 'VCALENDAR',
+ 'comp-filters' => array(
+ array(
+ 'name' => 'VEVENT',
+ 'comp-filters' => array(),
+ 'prop-filters' => array(),
+ 'is-not-defined' => true,
+ 'time-range' => false
+ ),
+ ),
+ 'prop-filters' => array(),
+ 'is-not-defined' => false,
+ 'time-range' => false
+ );
+
+ $this->assertEquals(
+ $expected,
+ $result
+ );
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\BadRequest
+ */
+ function testCompTimeRangeOnVCALENDAR() {
+
+ $xml = array(
+ '<c:filter>',
+ ' <c:comp-filter name="VCALENDAR">',
+ ' <c:time-range start="20110101T000000Z" end="20111231T235959Z" />',
+ ' </c:comp-filter>',
+ '</c:filter>'
+ );
+ $result = $this->parse($xml);
+
+ }
+
+ function testCompTimeRange() {
+
+ $xml = array(
+ '<c:filter>',
+ ' <c:comp-filter name="VCALENDAR">',
+ ' <c:comp-filter name="VEVENT">',
+ ' <c:time-range start="20110101T000000Z" end="20111231T235959Z" />',
+ ' </c:comp-filter>',
+ ' <c:comp-filter name="VTODO">',
+ ' <c:time-range start="20110101T000000Z" />',
+ ' </c:comp-filter>',
+ ' <c:comp-filter name="VJOURNAL">',
+ ' <c:time-range end="20111231T235959Z" />',
+ ' </c:comp-filter>',
+ ' </c:comp-filter>',
+ '</c:filter>'
+ );
+ $result = $this->parse($xml);
+
+ $expected = array(
+ 'name' => 'VCALENDAR',
+ 'comp-filters' => array(
+ array(
+ 'name' => 'VEVENT',
+ 'comp-filters' => array(),
+ 'prop-filters' => array(),
+ 'is-not-defined' => false,
+ 'time-range' => array(
+ 'start' => new \DateTime('2011-01-01 00:00:00', new \DateTimeZone('GMT')),
+ 'end' => new \DateTime('2011-12-31 23:59:59', new \DateTimeZone('GMT')),
+ ),
+ ),
+ array(
+ 'name' => 'VTODO',
+ 'comp-filters' => array(),
+ 'prop-filters' => array(),
+ 'is-not-defined' => false,
+ 'time-range' => array(
+ 'start' => new \DateTime('2011-01-01 00:00:00', new \DateTimeZone('GMT')),
+ 'end' => null,
+ ),
+ ),
+ array(
+ 'name' => 'VJOURNAL',
+ 'comp-filters' => array(),
+ 'prop-filters' => array(),
+ 'is-not-defined' => false,
+ 'time-range' => array(
+ 'start' => null,
+ 'end' => new \DateTime('2011-12-31 23:59:59', new \DateTimeZone('GMT')),
+ ),
+ ),
+ ),
+ 'prop-filters' => array(),
+ 'is-not-defined' => false,
+ 'time-range' => false
+ );
+
+ $this->assertEquals(
+ $expected,
+ $result
+ );
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\BadRequest
+ */
+ function testCompTimeRangeBadRange() {
+
+ $xml = array(
+ '<c:filter>',
+ ' <c:comp-filter name="VCALENDAR">',
+ ' <c:comp-filter name="VEVENT">',
+ ' <c:time-range start="20110101T000000Z" end="20100101T000000Z" />',
+ ' </c:comp-filter>',
+ ' </c:comp-filter>',
+ '</c:filter>'
+ );
+ $this->parse($xml);
+
+ }
+
+ function testProp() {
+
+ $xml = array(
+ '<c:filter>',
+ ' <c:comp-filter name="VCALENDAR">',
+ ' <c:comp-filter name="VEVENT">',
+ ' <c:prop-filter name="SUMMARY">',
+ ' <c:text-match>vacation</c:text-match>',
+ ' </c:prop-filter>',
+ ' </c:comp-filter>',
+ ' </c:comp-filter>',
+ '</c:filter>'
+ );
+ $result = $this->parse($xml);
+
+ $expected = array(
+ 'name' => 'VCALENDAR',
+ 'comp-filters' => array(
+ array(
+ 'name' => 'VEVENT',
+ 'is-not-defined' => false,
+ 'comp-filters' => array(),
+ 'prop-filters' => array(
+ array(
+ 'name' => 'SUMMARY',
+ 'is-not-defined' => false,
+ 'param-filters' => array(),
+ 'text-match' => array(
+ 'negate-condition' => false,
+ 'collation' => 'i;ascii-casemap',
+ 'value' => 'vacation',
+ ),
+ 'time-range' => null,
+ ),
+ ),
+ 'time-range' => null,
+ ),
+ ),
+ 'prop-filters' => array(),
+ 'is-not-defined' => false,
+ 'time-range' => false
+ );
+
+ $this->assertEquals(
+ $expected,
+ $result
+ );
+
+ }
+
+ function testComplex() {
+
+ $xml = array(
+ '<c:filter>',
+ ' <c:comp-filter name="VCALENDAR">',
+ ' <c:comp-filter name="VEVENT">',
+ ' <c:prop-filter name="SUMMARY">',
+ ' <c:text-match collation="i;unicode-casemap">vacation</c:text-match>',
+ ' </c:prop-filter>',
+ ' <c:prop-filter name="DTSTAMP">',
+ ' <c:time-range start="20110704T000000Z" />',
+ ' </c:prop-filter>',
+ ' <c:prop-filter name="ORGANIZER">',
+ ' <c:is-not-defined />',
+ ' </c:prop-filter>',
+ ' <c:prop-filter name="DTSTART">',
+ ' <c:param-filter name="VALUE">',
+ ' <c:text-match negate-condition="yes">DATE</c:text-match>',
+ ' </c:param-filter>',
+ ' </c:prop-filter>',
+ ' </c:comp-filter>',
+ ' </c:comp-filter>',
+ '</c:filter>'
+ );
+ $result = $this->parse($xml);
+
+ $expected = array(
+ 'name' => 'VCALENDAR',
+ 'comp-filters' => array(
+ array(
+ 'name' => 'VEVENT',
+ 'is-not-defined' => false,
+ 'comp-filters' => array(),
+ 'prop-filters' => array(
+ array(
+ 'name' => 'SUMMARY',
+ 'is-not-defined' => false,
+ 'param-filters' => array(),
+ 'text-match' => array(
+ 'negate-condition' => false,
+ 'collation' => 'i;unicode-casemap',
+ 'value' => 'vacation',
+ ),
+ 'time-range' => null,
+ ),
+ array(
+ 'name' => 'DTSTAMP',
+ 'is-not-defined' => false,
+ 'param-filters' => array(),
+ 'text-match' => null,
+ 'time-range' => array(
+ 'start' => new \DateTime('2011-07-04 00:00:00', new \DateTimeZone('GMT')),
+ 'end' => null,
+ ),
+ ),
+ array(
+ 'name' => 'ORGANIZER',
+ 'is-not-defined' => true,
+ 'param-filters' => array(),
+ 'text-match' => null,
+ 'time-range' => null,
+ ),
+ array(
+ 'name' => 'DTSTART',
+ 'is-not-defined' => false,
+ 'param-filters' => array(
+ array(
+ 'name' => 'VALUE',
+ 'is-not-defined' => false,
+ 'text-match' => array(
+ 'negate-condition' => true,
+ 'value' => 'DATE',
+ 'collation' => 'i;ascii-casemap',
+ ),
+ ),
+ ),
+ 'text-match' => null,
+ 'time-range' => null,
+ ),
+ ),
+ 'time-range' => null,
+ ),
+ ),
+ 'prop-filters' => array(),
+ 'is-not-defined' => false,
+ 'time-range' => false
+ );
+
+ $this->assertEquals(
+ $expected,
+ $result
+ );
+
+ }
+
+ function testOther1() {
+
+ // This body was exactly sent to us from the sabredav mailing list. Checking if this parses correctly.
+
+ $body = <<<BLA
+<?xml version="1.0" encoding="utf-8" ?>
+<C:calendar-query xmlns:D="DAV:"
+xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:prop>
+ <C:calendar-data/>
+ <D:getetag/>
+ </D:prop>
+ <C:filter>
+ <C:comp-filter name="VCALENDAR">
+ <C:comp-filter name="VEVENT">
+ <C:time-range start="20090101T000000Z" end="20121202T000000Z"/>
+ </C:comp-filter>
+ </C:comp-filter>
+ </C:filter>
+</C:calendar-query>
+BLA;
+
+ $dom = DAV\XMLUtil::loadDOMDocument($body);
+
+ $q = new CalendarQueryParser($dom);
+ $q->parse();
+
+ $this->assertEquals(array(
+ '{urn:ietf:params:xml:ns:caldav}calendar-data',
+ '{DAV:}getetag',
+ ), $q->requestedProperties);
+
+ $expectedFilters = array(
+ 'name' => 'VCALENDAR',
+ 'comp-filters' => array(
+ array(
+ 'name' => 'VEVENT',
+ 'comp-filters' => array(),
+ 'prop-filters' => array(),
+ 'time-range' => array(
+ 'start' => new \DateTime('2009-01-01 00:00:00', new \DateTimeZone('UTC')),
+ 'end' => new \DateTime('2012-12-02 00:00:00', new \DateTimeZone('UTC')),
+ ),
+ 'is-not-defined' => false,
+ ),
+ ),
+ 'prop-filters' => array(),
+ 'time-range' => null,
+ 'is-not-defined' => false,
+ );
+
+ $this->assertEquals($expectedFilters, $q->filters);
+
+ }
+
+ function testExpand() {
+
+ $xml = array(
+ '<d:prop>',
+ ' <c:calendar-data>',
+ ' <c:expand start="20110101T000000Z" end="20120101T000000Z"/>',
+ ' </c:calendar-data>',
+ '</d:prop>',
+ '<c:filter>',
+ ' <c:comp-filter name="VCALENDAR" />',
+ '</c:filter>'
+ );
+
+ $xml =
+'<?xml version="1.0"?>
+<c:calendar-query xmlns:c="urn:ietf:params:xml:ns:caldav" xmlns:d="DAV:">
+' . implode("\n", $xml) . '
+</c:calendar-query>';
+
+ $dom = DAV\XMLUtil::loadDOMDocument($xml);
+ $q = new CalendarQueryParser($dom);
+ $q->parse();
+
+
+ $expected = array(
+ 'name' => 'VCALENDAR',
+ 'comp-filters' => array(),
+ 'prop-filters' => array(),
+ 'is-not-defined' => false,
+ 'time-range' => false
+ );
+
+ $this->assertEquals(
+ $expected,
+ $q->filters
+ );
+
+ $this->assertEquals(array(
+ '{urn:ietf:params:xml:ns:caldav}calendar-data',
+ ), $q->requestedProperties);
+
+ $this->assertEquals(
+ array(
+ 'start' => new \DateTime('2011-01-01 00:00:00', new \DateTimeZone('UTC')),
+ 'end' => new \DateTime('2012-01-01 00:00:00', new \DateTimeZone('UTC')),
+ ),
+ $q->expand
+ );
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\BadRequest
+ */
+ function testExpandNoStart() {
+
+ $xml = array(
+ '<d:prop>',
+ ' <c:calendar-data>',
+ ' <c:expand end="20120101T000000Z"/>',
+ ' </c:calendar-data>',
+ '</d:prop>',
+ '<c:filter>',
+ ' <c:comp-filter name="VCALENDAR" />',
+ '</c:filter>'
+ );
+
+ $xml =
+'<?xml version="1.0"?>
+<c:calendar-query xmlns:c="urn:ietf:params:xml:ns:caldav" xmlns:d="DAV:">
+' . implode("\n", $xml) . '
+</c:calendar-query>';
+
+ $dom = DAV\XMLUtil::loadDOMDocument($xml);
+ $q = new CalendarQueryParser($dom);
+ $q->parse();
+
+ }
+ /**
+ * @expectedException Sabre\DAV\Exception\BadRequest
+ */
+ function testExpandNoEnd() {
+
+ $xml = array(
+ '<d:prop>',
+ ' <c:calendar-data>',
+ ' <c:expand start="20120101T000000Z"/>',
+ ' </c:calendar-data>',
+ '</d:prop>',
+ '<c:filter>',
+ ' <c:comp-filter name="VCALENDAR" />',
+ '</c:filter>'
+ );
+
+ $xml =
+'<?xml version="1.0"?>
+<c:calendar-query xmlns:c="urn:ietf:params:xml:ns:caldav" xmlns:d="DAV:">
+' . implode("\n", $xml) . '
+</c:calendar-query>';
+
+ $dom = DAV\XMLUtil::loadDOMDocument($xml);
+ $q = new CalendarQueryParser($dom);
+ $q->parse();
+
+ }
+ /**
+ * @expectedException Sabre\DAV\Exception\BadRequest
+ */
+ function testExpandBadTimes() {
+
+ $xml = array(
+ '<d:prop>',
+ ' <c:calendar-data>',
+ ' <c:expand start="20120101T000000Z" end="19980101T000000Z"/>',
+ ' </c:calendar-data>',
+ '</d:prop>',
+ '<c:filter>',
+ ' <c:comp-filter name="VCALENDAR" />',
+ '</c:filter>'
+ );
+
+ $xml =
+'<?xml version="1.0"?>
+<c:calendar-query xmlns:c="urn:ietf:params:xml:ns:caldav" xmlns:d="DAV:">
+' . implode("\n", $xml) . '
+</c:calendar-query>';
+
+ $dom = DAV\XMLUtil::loadDOMDocument($xml);
+ $q = new CalendarQueryParser($dom);
+ $q->parse();
+
+ }
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/CalendarQueryVAlarmTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/CalendarQueryVAlarmTest.php
new file mode 100644
index 000000000..9de24d3aa
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/CalendarQueryVAlarmTest.php
@@ -0,0 +1,122 @@
+<?php
+
+namespace Sabre\CalDAV;
+
+use Sabre\VObject;
+
+class CalendarQueryVAlarmTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * This test is specifically for a time-range query on a VALARM, contained
+ * in a VEVENT that's recurring
+ */
+ function testValarm() {
+
+ $vcalendar = new VObject\Component\VCalendar();
+
+ $vevent = $vcalendar->createComponent('VEVENT');
+ $vevent->RRULE = 'FREQ=MONTHLY';
+ $vevent->DTSTART = '20120101T120000Z';
+ $vevent->UID = 'bla';
+
+ $valarm = $vcalendar->createComponent('VALARM');
+ $valarm->TRIGGER = '-P15D';
+ $vevent->add($valarm);
+
+
+ $vcalendar->add($vevent);
+
+ $filter = array(
+ 'name' => 'VCALENDAR',
+ 'is-not-defined' => false,
+ 'time-range' => null,
+ 'prop-filters' => array(),
+ 'comp-filters' => array(
+ array(
+ 'name' => 'VEVENT',
+ 'is-not-defined' => false,
+ 'time-range' => null,
+ 'prop-filters' => array(),
+ 'comp-filters' => array(
+ array(
+ 'name' => 'VALARM',
+ 'is-not-defined' => false,
+ 'prop-filters' => array(),
+ 'comp-filters' => array(),
+ 'time-range' => array(
+ 'start' => new \DateTime('2012-05-10'),
+ 'end' => new \DateTime('2012-05-20'),
+ ),
+ ),
+ ),
+ ),
+ ),
+ );
+
+ $validator = new CalendarQueryValidator();
+ $this->assertTrue($validator->validate($vcalendar, $filter));
+
+ $vcalendar = new VObject\Component\VCalendar();
+
+ // A limited recurrence rule, should return false
+ $vevent = $vcalendar->createComponent('VEVENT');
+ $vevent->RRULE = 'FREQ=MONTHLY;COUNT=1';
+ $vevent->DTSTART = '20120101T120000Z';
+ $vevent->UID = 'bla';
+
+ $valarm = $vcalendar->createComponent('VALARM');
+ $valarm->TRIGGER = '-P15D';
+ $vevent->add($valarm);
+
+ $vcalendar->add($vevent);
+
+ $this->assertFalse($validator->validate($vcalendar, $filter));
+ }
+
+ function testAlarmWayBefore() {
+
+ $vcalendar = new VObject\Component\VCalendar();
+
+ $vevent = $vcalendar->createComponent('VEVENT');
+ $vevent->DTSTART = '20120101T120000Z';
+ $vevent->UID = 'bla';
+
+ $valarm = $vcalendar->createComponent('VALARM');
+ $valarm->TRIGGER = '-P2W1D';
+ $vevent->add($valarm);
+
+ $vcalendar->add($vevent);
+
+ $filter = array(
+ 'name' => 'VCALENDAR',
+ 'is-not-defined' => false,
+ 'time-range' => null,
+ 'prop-filters' => array(),
+ 'comp-filters' => array(
+ array(
+ 'name' => 'VEVENT',
+ 'is-not-defined' => false,
+ 'time-range' => null,
+ 'prop-filters' => array(),
+ 'comp-filters' => array(
+ array(
+ 'name' => 'VALARM',
+ 'is-not-defined' => false,
+ 'prop-filters' => array(),
+ 'comp-filters' => array(),
+ 'time-range' => array(
+ 'start' => new \DateTime('2011-12-10'),
+ 'end' => new \DateTime('2011-12-20'),
+ ),
+ ),
+ ),
+ ),
+ ),
+ );
+
+ $validator = new CalendarQueryValidator();
+ $this->assertTrue($validator->validate($vcalendar, $filter));
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/CalendarQueryValidatorTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/CalendarQueryValidatorTest.php
new file mode 100644
index 000000000..deb70d205
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/CalendarQueryValidatorTest.php
@@ -0,0 +1,804 @@
+<?php
+
+namespace Sabre\CalDAV;
+use Sabre\VObject;
+use Sabre\DAV;
+
+class CalendarQueryValidatorTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * @dataProvider provider
+ */
+ function testValid($icalObject, $filters, $outcome) {
+
+ $validator = new CalendarQueryValidator();
+
+ // Wrapping filter in a VCALENDAR component filter, as this is always
+ // there anyway.
+ $filters = array(
+ 'name' => 'VCALENDAR',
+ 'comp-filters' => array($filters),
+ 'prop-filters' => array(),
+ 'is-not-defined' => false,
+ 'time-range' => null,
+ );
+
+ $vObject = VObject\Reader::read($icalObject);
+
+ switch($outcome) {
+ case 0 :
+ $this->assertFalse($validator->validate($vObject, $filters));
+ break;
+ case 1 :
+ $this->assertTrue($validator->validate($vObject, $filters));
+ break;
+ case -1 :
+ try {
+ $validator->validate($vObject, $filters);
+ } catch (DAV\Exception $e) {
+ // Success
+ } catch (\LogicException $e) {
+ // Success
+ }
+ break;
+
+ }
+
+ }
+
+ function provider() {
+
+ $blob1 = <<<yow
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+SUMMARY:hi
+END:VEVENT
+END:VCALENDAR
+yow;
+
+ $blob2 = <<<yow
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+SUMMARY:hi
+BEGIN:VALARM
+ACTION:DISPLAY
+END:VALARM
+END:VEVENT
+END:VCALENDAR
+yow;
+
+ $blob3 = <<<yow
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+SUMMARY:hi
+DTSTART;VALUE=DATE:20110704
+END:VEVENT
+END:VCALENDAR
+yow;
+ $blob4 = <<<yow
+BEGIN:VCARD
+VERSION:3.0
+FN:Evert
+END:VCARD
+yow;
+
+ $blob5 = <<<yow
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+DTSTART:20110101T120000Z
+DTEND:20110102T120000Z
+END:VEVENT
+END:VCALENDAR
+yow;
+
+ $blob6 = <<<yow
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+DTSTART:20110101T120000Z
+DURATION:PT5H
+END:VEVENT
+END:VCALENDAR
+yow;
+
+ $blob7 = <<<yow
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20110101
+END:VEVENT
+END:VCALENDAR
+yow;
+
+ $blob8 = <<<yow
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+DTSTART:20110101T120000Z
+END:VEVENT
+END:VCALENDAR
+yow;
+
+ $blob9 = <<<yow
+BEGIN:VCALENDAR
+BEGIN:VTODO
+DTSTART:20110101T120000Z
+DURATION:PT1H
+END:VTODO
+END:VCALENDAR
+yow;
+ $blob10 = <<<yow
+BEGIN:VCALENDAR
+BEGIN:VTODO
+DTSTART:20110101T120000Z
+DUE:20110101T130000Z
+END:VTODO
+END:VCALENDAR
+yow;
+ $blob11 = <<<yow
+BEGIN:VCALENDAR
+BEGIN:VTODO
+DTSTART:20110101T120000Z
+END:VTODO
+END:VCALENDAR
+yow;
+
+ $blob12 = <<<yow
+BEGIN:VCALENDAR
+BEGIN:VTODO
+DUE:20110101T130000Z
+END:VTODO
+END:VCALENDAR
+yow;
+
+ $blob13 = <<<yow
+BEGIN:VCALENDAR
+BEGIN:VTODO
+COMPLETED:20110101T130000Z
+CREATED:20110101T110000Z
+END:VTODO
+END:VCALENDAR
+yow;
+
+ $blob14 = <<<yow
+BEGIN:VCALENDAR
+BEGIN:VTODO
+COMPLETED:20110101T130000Z
+END:VTODO
+END:VCALENDAR
+yow;
+
+ $blob15 = <<<yow
+BEGIN:VCALENDAR
+BEGIN:VTODO
+CREATED:20110101T110000Z
+END:VTODO
+END:VCALENDAR
+yow;
+
+
+ $blob16 = <<<yow
+BEGIN:VCALENDAR
+BEGIN:VTODO
+END:VTODO
+END:VCALENDAR
+yow;
+
+ $blob17 = <<<yow
+BEGIN:VCALENDAR
+BEGIN:VJOURNAL
+END:VJOURNAL
+END:VCALENDAR
+yow;
+
+ $blob18 = <<<yow
+BEGIN:VCALENDAR
+BEGIN:VJOURNAL
+DTSTART:20110101T120000Z
+END:VJOURNAL
+END:VCALENDAR
+yow;
+
+ $blob19 = <<<yow
+BEGIN:VCALENDAR
+BEGIN:VJOURNAL
+DTSTART;VALUE=DATE:20110101
+END:VJOURNAL
+END:VCALENDAR
+yow;
+
+ $blob20 = <<<yow
+BEGIN:VCALENDAR
+BEGIN:VFREEBUSY
+END:VFREEBUSY
+END:VCALENDAR
+yow;
+
+ $blob21 = <<<yow
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+DTSTART:20110101T120000Z
+BEGIN:VALARM
+TRIGGER:-PT1H
+END:VALARM
+END:VEVENT
+END:VCALENDAR
+yow;
+
+ $blob22 = <<<yow
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+DTSTART:20110101T120000Z
+BEGIN:VALARM
+TRIGGER;VALUE=DURATION:-PT1H
+END:VALARM
+END:VEVENT
+END:VCALENDAR
+yow;
+
+ $blob23 = <<<yow
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+DTSTART:20110101T120000Z
+BEGIN:VALARM
+TRIGGER;VALUE=DURATION;RELATED=END:-PT1H
+END:VALARM
+END:VEVENT
+END:VCALENDAR
+yow;
+
+ $blob24 = <<<yow
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+DTSTART:20110101T120000Z
+DTEND:20110101T130000Z
+BEGIN:VALARM
+TRIGGER;VALUE=DURATION;RELATED=END:-PT2H
+END:VALARM
+END:VEVENT
+END:VCALENDAR
+yow;
+
+ $blob25 = <<<yow
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+DTSTART:20110101T120000Z
+DURATION:PT1H
+BEGIN:VALARM
+TRIGGER;VALUE=DURATION;RELATED=END:-PT2H
+END:VALARM
+END:VEVENT
+END:VCALENDAR
+yow;
+
+ $blob26 = <<<yow
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+DTSTART:20110101T120000Z
+DURATION:PT1H
+BEGIN:VALARM
+TRIGGER;VALUE=DATE-TIME:20110101T110000Z
+END:VALARM
+END:VEVENT
+END:VCALENDAR
+yow;
+
+
+ $blob27 = <<<yow
+BEGIN:VCALENDAR
+BEGIN:VTODO
+DTSTART:20110101T120000Z
+DUE:20110101T130000Z
+BEGIN:VALARM
+TRIGGER;VALUE=DURATION;RELATED=END:-PT2H
+END:VALARM
+END:VTODO
+END:VCALENDAR
+yow;
+
+ $blob28 = <<<yow
+BEGIN:VCALENDAR
+BEGIN:VJOURNAL
+DTSTART:20110101T120000Z
+BEGIN:VALARM
+TRIGGER;VALUE=DURATION;RELATED=END:-PT2H
+END:VALARM
+END:VJOURNAL
+END:VCALENDAR
+yow;
+
+ $blob29 = <<<yow
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+DTSTART:20110101T120000Z
+DURATION:PT1H
+BEGIN:VALARM
+TRIGGER;VALUE=DATE-TIME:20110101T090000Z
+REPEAT:2
+DURATION:PT1H
+END:VALARM
+END:VEVENT
+END:VCALENDAR
+yow;
+
+ $blob30 = <<<yow
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+DTSTART:20110101T120000Z
+DURATION:PT1H
+BEGIN:VALARM
+TRIGGER;VALUE=DATE-TIME:20110101T090000Z
+DURATION:PT1H
+END:VALARM
+END:VEVENT
+END:VCALENDAR
+yow;
+
+ $blob31 = <<<yow
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+DTSTART:20080101T120000Z
+DURATION:PT1H
+RRULE:FREQ=YEARLY
+END:VEVENT
+END:VCALENDAR
+yow;
+
+ $blob32 = <<<yow
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+DTSTART:20080102T120000Z
+DURATION:PT1H
+RRULE:FREQ=YEARLY
+END:VEVENT
+END:VCALENDAR
+yow;
+ $blob33 = <<<yow
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20120628
+RRULE:FREQ=DAILY
+END:VEVENT
+END:VCALENDAR
+yow;
+ $blob34 = <<<yow
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20120628
+RRULE:FREQ=DAILY
+BEGIN:VALARM
+TRIGGER:P52W
+END:VALARM
+END:VEVENT
+END:VCALENDAR
+yow;
+
+ $filter1 = array(
+ 'name' => 'VEVENT',
+ 'comp-filters' => array(),
+ 'prop-filters' => array(),
+ 'is-not-defined' => false,
+ 'time-range' => null,
+ );
+ $filter2 = $filter1;
+ $filter2['name'] = 'VTODO';
+
+ $filter3 = $filter1;
+ $filter3['is-not-defined'] = true;
+
+ $filter4 = $filter1;
+ $filter4['name'] = 'VTODO';
+ $filter4['is-not-defined'] = true;
+
+ $filter5 = $filter1;
+ $filter5['comp-filters'] = array(
+ array(
+ 'name' => 'VALARM',
+ 'is-not-defined' => false,
+ 'comp-filters' => array(),
+ 'prop-filters' => array(),
+ 'time-range' => null,
+ ),
+ );
+ $filter6 = $filter1;
+ $filter6['prop-filters'] = array(
+ array(
+ 'name' => 'SUMMARY',
+ 'is-not-defined' => false,
+ 'param-filters' => array(),
+ 'time-range' => null,
+ 'text-match' => null,
+ ),
+ );
+ $filter7 = $filter6;
+ $filter7['prop-filters'][0]['name'] = 'DESCRIPTION';
+
+ $filter8 = $filter6;
+ $filter8['prop-filters'][0]['is-not-defined'] = true;
+
+ $filter9 = $filter7;
+ $filter9['prop-filters'][0]['is-not-defined'] = true;
+
+ $filter10 = $filter5;
+ $filter10['prop-filters'] = $filter6['prop-filters'];
+
+ // Param filters
+ $filter11 = $filter1;
+ $filter11['prop-filters'] = array(
+ array(
+ 'name' => 'DTSTART',
+ 'is-not-defined' => false,
+ 'param-filters' => array(
+ array(
+ 'name' => 'VALUE',
+ 'is-not-defined' => false,
+ 'text-match' => null,
+ ),
+ ),
+ 'time-range' => null,
+ 'text-match' => null,
+ ),
+ );
+
+ $filter12 = $filter11;
+ $filter12['prop-filters'][0]['param-filters'][0]['name'] = 'TZID';
+
+ $filter13 = $filter11;
+ $filter13['prop-filters'][0]['param-filters'][0]['is-not-defined'] = true;
+
+ $filter14 = $filter12;
+ $filter14['prop-filters'][0]['param-filters'][0]['is-not-defined'] = true;
+
+ // Param text filter
+ $filter15 = $filter11;
+ $filter15['prop-filters'][0]['param-filters'][0]['text-match'] = array(
+ 'collation' => 'i;ascii-casemap',
+ 'value' => 'dAtE',
+ 'negate-condition' => false,
+ );
+ $filter16 = $filter15;
+ $filter16['prop-filters'][0]['param-filters'][0]['text-match']['collation'] = 'i;octet';
+
+ $filter17 = $filter15;
+ $filter17['prop-filters'][0]['param-filters'][0]['text-match']['negate-condition'] = true;
+
+ $filter18 = $filter15;
+ $filter18['prop-filters'][0]['param-filters'][0]['text-match']['negate-condition'] = true;
+ $filter18['prop-filters'][0]['param-filters'][0]['text-match']['collation'] = 'i;octet';
+
+ // prop + text
+ $filter19 = $filter5;
+ $filter19['comp-filters'][0]['prop-filters'] = array(
+ array(
+ 'name' => 'action',
+ 'is-not-defined' => false,
+ 'time-range' => null,
+ 'param-filters' => array(),
+ 'text-match' => array(
+ 'collation' => 'i;ascii-casemap',
+ 'value' => 'display',
+ 'negate-condition' => false,
+ ),
+ ),
+ );
+
+ // Time range
+ $filter20 = array(
+ 'name' => 'VEVENT',
+ 'comp-filters' => array(),
+ 'prop-filters' => array(),
+ 'is-not-defined' => false,
+ 'time-range' => array(
+ 'start' => new \DateTime('2011-01-01 10:00:00', new \DateTimeZone('GMT')),
+ 'end' => new \DateTime('2011-01-01 13:00:00', new \DateTimeZone('GMT')),
+ ),
+ );
+ // Time range, no end date
+ $filter21 = $filter20;
+ $filter21['time-range']['end'] = null;
+
+ // Time range, no start date
+ $filter22 = $filter20;
+ $filter22['time-range']['start'] = null;
+
+ // Time range, other dates
+ $filter23 = $filter20;
+ $filter23['time-range'] = array(
+ 'start' => new \DateTime('2011-02-01 10:00:00', new \DateTimeZone('GMT')),
+ 'end' => new \DateTime('2011-02-01 13:00:00', new \DateTimeZone('GMT')),
+ );
+ // Time range
+ $filter24 = array(
+ 'name' => 'VTODO',
+ 'comp-filters' => array(),
+ 'prop-filters' => array(),
+ 'is-not-defined' => false,
+ 'time-range' => array(
+ 'start' => new \DateTime('2011-01-01 12:45:00', new \DateTimeZone('GMT')),
+ 'end' => new \DateTime('2011-01-01 13:15:00', new \DateTimeZone('GMT')),
+ ),
+ );
+ // Time range, other dates (1 month in the future)
+ $filter25 = $filter24;
+ $filter25['time-range'] = array(
+ 'start' => new \DateTime('2011-02-01 10:00:00', new \DateTimeZone('GMT')),
+ 'end' => new \DateTime('2011-02-01 13:00:00', new \DateTimeZone('GMT')),
+ );
+ $filter26 = $filter24;
+ $filter26['time-range'] = array(
+ 'start' => new \DateTime('2011-01-01 11:45:00', new \DateTimeZone('GMT')),
+ 'end' => new \DateTime('2011-01-01 12:15:00', new \DateTimeZone('GMT')),
+ );
+
+ // Time range for VJOURNAL
+ $filter27 = array(
+ 'name' => 'VJOURNAL',
+ 'comp-filters' => array(),
+ 'prop-filters' => array(),
+ 'is-not-defined' => false,
+ 'time-range' => array(
+ 'start' => new \DateTime('2011-01-01 12:45:00', new \DateTimeZone('GMT')),
+ 'end' => new \DateTime('2011-01-01 13:15:00', new \DateTimeZone('GMT')),
+ ),
+ );
+ $filter28 = $filter27;
+ $filter28['time-range'] = array(
+ 'start' => new \DateTime('2011-01-01 11:45:00', new \DateTimeZone('GMT')),
+ 'end' => new \DateTime('2011-01-01 12:15:00', new \DateTimeZone('GMT')),
+ );
+ // Time range for VFREEBUSY
+ $filter29 = array(
+ 'name' => 'VFREEBUSY',
+ 'comp-filters' => array(),
+ 'prop-filters' => array(),
+ 'is-not-defined' => false,
+ 'time-range' => array(
+ 'start' => new \DateTime('2011-01-01 12:45:00', new \DateTimeZone('GMT')),
+ 'end' => new \DateTime('2011-01-01 13:15:00', new \DateTimeZone('GMT')),
+ ),
+ );
+ // Time range filter on property
+ $filter30 = array(
+ 'name' => 'VEVENT',
+ 'comp-filters' => array(),
+ 'prop-filters' => array(
+ array(
+ 'name' => 'DTSTART',
+ 'is-not-defined' => false,
+ 'param-filters' => array(),
+ 'time-range' => array(
+ 'start' => new \DateTime('2011-01-01 10:00:00', new \DateTimeZone('GMT')),
+ 'end' => new \DateTime('2011-01-01 13:00:00', new \DateTimeZone('GMT')),
+ ),
+ 'text-match' => null,
+ ),
+ ),
+ 'is-not-defined' => false,
+ 'time-range' => null,
+ );
+
+ // Time range for alarm
+ $filter31 = array(
+ 'name' => 'VEVENT',
+ 'prop-filters' => array(),
+ 'comp-filters' => array(
+ array(
+ 'name' => 'VALARM',
+ 'is-not-defined' => false,
+ 'comp-filters' => array(),
+ 'prop-filters' => array(),
+ 'time-range' => array(
+ 'start' => new \DateTime('2011-01-01 10:45:00', new \DateTimeZone('GMT')),
+ 'end' => new \DateTime('2011-01-01 11:15:00', new \DateTimeZone('GMT')),
+ ),
+ 'text-match' => null,
+ ),
+ ),
+ 'is-not-defined' => false,
+ 'time-range' => null,
+ );
+ $filter32 = $filter31;
+ $filter32['comp-filters'][0]['time-range'] = array(
+ 'start' => new \DateTime('2011-01-01 11:45:00', new \DateTimeZone('GMT')),
+ 'end' => new \DateTime('2011-01-01 12:15:00', new \DateTimeZone('GMT')),
+ );
+
+ $filter33 = $filter31;
+ $filter33['name'] = 'VTODO';
+ $filter34 = $filter32;
+ $filter34['name'] = 'VTODO';
+ $filter35 = $filter31;
+ $filter35['name'] = 'VJOURNAL';
+ $filter36 = $filter32;
+ $filter36['name'] = 'VJOURNAL';
+
+ // Time range filter on non-datetime property
+ $filter37 = array(
+ 'name' => 'VEVENT',
+ 'comp-filters' => array(),
+ 'prop-filters' => array(
+ array(
+ 'name' => 'SUMMARY',
+ 'is-not-defined' => false,
+ 'param-filters' => array(),
+ 'time-range' => array(
+ 'start' => new \DateTime('2011-01-01 10:00:00', new \DateTimeZone('GMT')),
+ 'end' => new \DateTime('2011-01-01 13:00:00', new \DateTimeZone('GMT')),
+ ),
+ 'text-match' => null,
+ ),
+ ),
+ 'is-not-defined' => false,
+ 'time-range' => null,
+ );
+
+ $filter38 = array(
+ 'name' => 'VEVENT',
+ 'comp-filters' => array(),
+ 'prop-filters' => array(),
+ 'is-not-defined' => false,
+ 'time-range' => array(
+ 'start' => new \DateTime('2012-07-01 00:00:00', new \DateTimeZone('UTC')),
+ 'end' => new \DateTime('2012-08-01 00:00:00', new \DateTimeZone('UTC')),
+ )
+ );
+ $filter39 = array(
+ 'name' => 'VEVENT',
+ 'comp-filters' => array(
+ array(
+ 'name' => 'VALARM',
+ 'comp-filters' => array(),
+ 'prop-filters' => array(),
+ 'is-not-defined' => false,
+ 'time-range' => array(
+ 'start' => new \DateTime('2012-09-01 00:00:00', new \DateTimeZone('UTC')),
+ 'end' => new \DateTime('2012-10-01 00:00:00', new \DateTimeZone('UTC')),
+ )
+ ),
+ ),
+ 'prop-filters' => array(),
+ 'is-not-defined' => false,
+ 'time-range' => null,
+ );
+
+ return array(
+
+ // Component check
+
+ array($blob1, $filter1, 1),
+ array($blob1, $filter2, 0),
+ array($blob1, $filter3, 0),
+ array($blob1, $filter4, 1),
+
+ // Subcomponent check
+ array($blob1, $filter5, 0),
+ array($blob2, $filter5, 1),
+
+ // Property check
+ array($blob1, $filter6, 1),
+ array($blob1, $filter7, 0),
+ array($blob1, $filter8, 0),
+ array($blob1, $filter9, 1),
+
+ // Subcomponent + property
+ array($blob2, $filter10, 1),
+
+ // Param filter
+ array($blob3, $filter11, 1),
+ array($blob3, $filter12, 0),
+ array($blob3, $filter13, 0),
+ array($blob3, $filter14, 1),
+
+ // Param + text
+ array($blob3, $filter15, 1),
+ array($blob3, $filter16, 0),
+ array($blob3, $filter17, 0),
+ array($blob3, $filter18, 1),
+
+ // Prop + text
+ array($blob2, $filter19, 1),
+
+ // Incorrect object (vcard)
+ array($blob4, $filter1, -1),
+
+ // Time-range for event
+ array($blob5, $filter20, 1),
+ array($blob6, $filter20, 1),
+ array($blob7, $filter20, 1),
+ array($blob8, $filter20, 1),
+
+ array($blob5, $filter21, 1),
+ array($blob5, $filter22, 1),
+
+ array($blob5, $filter23, 0),
+ array($blob6, $filter23, 0),
+ array($blob7, $filter23, 0),
+ array($blob8, $filter23, 0),
+
+ // Time-range for todo
+ array($blob9, $filter24, 1),
+ array($blob9, $filter25, 0),
+ array($blob9, $filter26, 1),
+ array($blob10, $filter24, 1),
+ array($blob10, $filter25, 0),
+ array($blob10, $filter26, 1),
+
+ array($blob11, $filter24, 0),
+ array($blob11, $filter25, 0),
+ array($blob11, $filter26, 1),
+
+ array($blob12, $filter24, 1),
+ array($blob12, $filter25, 0),
+ array($blob12, $filter26, 0),
+
+ array($blob13, $filter24, 1),
+ array($blob13, $filter25, 0),
+ array($blob13, $filter26, 1),
+
+ array($blob14, $filter24, 1),
+ array($blob14, $filter25, 0),
+ array($blob14, $filter26, 0),
+
+ array($blob15, $filter24, 1),
+ array($blob15, $filter25, 1),
+ array($blob15, $filter26, 1),
+
+ array($blob16, $filter24, 1),
+ array($blob16, $filter25, 1),
+ array($blob16, $filter26, 1),
+
+ // Time-range for journals
+ array($blob17, $filter27, 0),
+ array($blob17, $filter28, 0),
+ array($blob18, $filter27, 0),
+ array($blob18, $filter28, 1),
+ array($blob19, $filter27, 1),
+ array($blob19, $filter28, 1),
+
+ // Time-range for free-busy
+ array($blob20, $filter29, -1),
+
+ // Time-range on property
+ array($blob5, $filter30, 1),
+ array($blob3, $filter37, -1),
+ array($blob3, $filter30, 0),
+
+ // Time-range on alarm in vevent
+ array($blob21, $filter31, 1),
+ array($blob21, $filter32, 0),
+ array($blob22, $filter31, 1),
+ array($blob22, $filter32, 0),
+ array($blob23, $filter31, 1),
+ array($blob23, $filter32, 0),
+ array($blob24, $filter31, 1),
+ array($blob24, $filter32, 0),
+ array($blob25, $filter31, 1),
+ array($blob25, $filter32, 0),
+ array($blob26, $filter31, 1),
+ array($blob26, $filter32, 0),
+
+ // Time-range on alarm for vtodo
+ array($blob27, $filter33, 1),
+ array($blob27, $filter34, 0),
+
+ // Time-range on alarm for vjournal
+ array($blob28, $filter35, -1),
+ array($blob28, $filter36, -1),
+
+ // Time-range on alarm with duration
+ array($blob29, $filter31, 1),
+ array($blob29, $filter32, 0),
+ array($blob30, $filter31, 0),
+ array($blob30, $filter32, 0),
+
+ // Time-range with RRULE
+ array($blob31, $filter20, 1),
+ array($blob32, $filter20, 0),
+
+ // Bug reported on mailing list, related to all-day events.
+ array($blob33, $filter38, 1),
+
+ // Event in timerange, but filtered alarm is in the far future.
+ array($blob34, $filter39, 0),
+ );
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/CalendarTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/CalendarTest.php
new file mode 100644
index 000000000..2b2690d42
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/CalendarTest.php
@@ -0,0 +1,255 @@
+<?php
+
+namespace Sabre\CalDAV;
+use Sabre\DAVACL;
+
+require_once 'Sabre/CalDAV/TestUtil.php';
+
+class CalendarTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * @var Sabre\CalDAV\Backend_PDO
+ */
+ protected $backend;
+ protected $principalBackend;
+ /**
+ * @var Sabre\CalDAV\Calendar
+ */
+ protected $calendar;
+ /**
+ * @var array
+ */
+ protected $calendars;
+
+ function setup() {
+
+ if (!SABRE_HASSQLITE) $this->markTestSkipped('SQLite driver is not available');
+
+ $this->backend = TestUtil::getBackend();
+
+ $this->calendars = $this->backend->getCalendarsForUser('principals/user1');
+ $this->assertEquals(2, count($this->calendars));
+ $this->calendar = new Calendar($this->backend, $this->calendars[0]);
+
+
+ }
+
+ function teardown() {
+
+ unset($this->backend);
+
+ }
+
+ function testSimple() {
+
+ $this->assertEquals($this->calendars[0]['uri'], $this->calendar->getName());
+
+ }
+
+ /**
+ * @depends testSimple
+ */
+ function testUpdateProperties() {
+
+ $result = $this->calendar->updateProperties(array(
+ '{DAV:}displayname' => 'NewName',
+ ));
+
+ $this->assertEquals(true, $result);
+
+ $calendars2 = $this->backend->getCalendarsForUser('principals/user1');
+ $this->assertEquals('NewName',$calendars2[0]['{DAV:}displayname']);
+
+ }
+
+ /**
+ * @depends testSimple
+ */
+ function testGetProperties() {
+
+ $question = array(
+ '{urn:ietf:params:xml:ns:caldav}supported-calendar-component-set',
+ '{urn:ietf:params:xml:ns:caldav}supported-calendar-data',
+ '{urn:ietf:params:xml:ns:caldav}supported-collation-set',
+ '{DAV:}owner',
+ );
+
+ $result = $this->calendar->getProperties($question);
+
+ foreach($question as $q) $this->assertArrayHasKey($q,$result);
+
+ $this->assertEquals(array('VEVENT','VTODO'), $result['{urn:ietf:params:xml:ns:caldav}supported-calendar-component-set']->getValue());
+
+ $this->assertTrue($result['{urn:ietf:params:xml:ns:caldav}supported-collation-set'] instanceof Property\SupportedCollationSet);
+
+ $this->assertTrue($result['{DAV:}owner'] instanceof DAVACL\Property\Principal);
+ $this->assertEquals('principals/user1', $result['{DAV:}owner']->getHref());
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\NotFound
+ * @depends testSimple
+ */
+ function testGetChildNotFound() {
+
+ $this->calendar->getChild('randomname');
+
+ }
+
+ /**
+ * @depends testSimple
+ */
+ function testGetChildren() {
+
+ $children = $this->calendar->getChildren();
+ $this->assertEquals(1,count($children));
+
+ $this->assertTrue($children[0] instanceof CalendarObject);
+
+ }
+
+ /**
+ * @depends testGetChildren
+ */
+ function testChildExists() {
+
+ $this->assertFalse($this->calendar->childExists('foo'));
+
+ $children = $this->calendar->getChildren();
+ $this->assertTrue($this->calendar->childExists($children[0]->getName()));
+ }
+
+
+
+ /**
+ * @expectedException Sabre\DAV\Exception\MethodNotAllowed
+ */
+ function testCreateDirectory() {
+
+ $this->calendar->createDirectory('hello');
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\MethodNotAllowed
+ */
+ function testSetName() {
+
+ $this->calendar->setName('hello');
+
+ }
+
+ function testGetLastModified() {
+
+ $this->assertNull($this->calendar->getLastModified());
+
+ }
+
+ function testCreateFile() {
+
+ $file = fopen('php://memory','r+');
+ fwrite($file,TestUtil::getTestCalendarData());
+ rewind($file);
+
+ $this->calendar->createFile('hello',$file);
+
+ $file = $this->calendar->getChild('hello');
+ $this->assertTrue($file instanceof CalendarObject);
+
+ }
+
+ function testCreateFileNoSupportedComponents() {
+
+ $file = fopen('php://memory','r+');
+ fwrite($file,TestUtil::getTestCalendarData());
+ rewind($file);
+
+ $calendar = new Calendar($this->backend, $this->calendars[1]);
+ $calendar->createFile('hello',$file);
+
+ $file = $calendar->getChild('hello');
+ $this->assertTrue($file instanceof CalendarObject);
+
+ }
+
+ function testDelete() {
+
+ $this->calendar->delete();
+
+ $calendars = $this->backend->getCalendarsForUser('principals/user1');
+ $this->assertEquals(1, count($calendars));
+ }
+
+ function testGetOwner() {
+
+ $this->assertEquals('principals/user1',$this->calendar->getOwner());
+
+ }
+
+ function testGetGroup() {
+
+ $this->assertNull($this->calendar->getGroup());
+
+ }
+
+ function testGetACL() {
+
+ $expected = array(
+ array(
+ 'privilege' => '{DAV:}read',
+ 'principal' => 'principals/user1',
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}write',
+ 'principal' => 'principals/user1',
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}read',
+ 'principal' => 'principals/user1/calendar-proxy-write',
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}write',
+ 'principal' => 'principals/user1/calendar-proxy-write',
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}read',
+ 'principal' => 'principals/user1/calendar-proxy-read',
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{' . Plugin::NS_CALDAV . '}read-free-busy',
+ 'principal' => '{DAV:}authenticated',
+ 'protected' => true,
+ ),
+ );
+ $this->assertEquals($expected, $this->calendar->getACL());
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\MethodNotAllowed
+ */
+ function testSetACL() {
+
+ $this->calendar->setACL(array());
+
+ }
+
+ function testGetSupportedPrivilegesSet() {
+
+ $result = $this->calendar->getSupportedPrivilegeSet();
+
+ $this->assertEquals(
+ '{' . Plugin::NS_CALDAV . '}read-free-busy',
+ $result['aggregates'][0]['aggregates'][2]['privilege']
+ );
+
+ }
+
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/ExpandEventsDTSTARTandDTENDTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/ExpandEventsDTSTARTandDTENDTest.php
new file mode 100644
index 000000000..5a78a0522
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/ExpandEventsDTSTARTandDTENDTest.php
@@ -0,0 +1,110 @@
+<?php
+
+namespace Sabre\CalDAV;
+use Sabre\HTTP;
+use Sabre\VObject;
+
+/**
+ * This unittests is created to find out why recurring events have wrong DTSTART value
+ *
+ *
+ * @copyright Copyright (C) 2007-2013 Rooftop Solutions. All rights reserved.
+ * @author Evert Pot (http://www.rooftopsolutions.nl/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class ExpandEventsDTSTARTandDTENDTest extends \Sabre\DAVServerTest {
+
+ protected $setupCalDAV = true;
+
+ protected $caldavCalendars = array(
+ array(
+ 'id' => 1,
+ 'name' => 'Calendar',
+ 'principaluri' => 'principals/user1',
+ 'uri' => 'calendar1',
+ )
+ );
+
+ protected $caldavCalendarObjects = array(
+ 1 => array(
+ 'event.ics' => array(
+ 'calendardata' => 'BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:foobar
+DTEND;TZID=Europe/Berlin:20120207T191500
+RRULE:FREQ=DAILY;INTERVAL=1;COUNT=3
+SUMMARY:RecurringEvents 3 times
+DTSTART;TZID=Europe/Berlin:20120207T181500
+END:VEVENT
+BEGIN:VEVENT
+CREATED:20120207T111900Z
+UID:foobar
+DTEND;TZID=Europe/Berlin:20120208T191500
+SUMMARY:RecurringEvents 3 times OVERWRITTEN
+DTSTART;TZID=Europe/Berlin:20120208T181500
+RECURRENCE-ID;TZID=Europe/Berlin:20120208T181500
+END:VEVENT
+END:VCALENDAR
+',
+ ),
+ ),
+ );
+
+ function testExpand() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'REPORT',
+ 'HTTP_CONTENT_TYPE' => 'application/xml',
+ 'REQUEST_URI' => '/calendars/user1/calendar1',
+ 'HTTP_DEPTH' => '1',
+ ));
+
+ $request->setBody('<?xml version="1.0" encoding="utf-8" ?>
+<C:calendar-query xmlns:D="DAV:" xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:prop>
+ <C:calendar-data>
+ <C:expand start="20120205T230000Z" end="20120212T225959Z"/>
+ </C:calendar-data>
+ <D:getetag/>
+ </D:prop>
+ <C:filter>
+ <C:comp-filter name="VCALENDAR">
+ <C:comp-filter name="VEVENT">
+ <C:time-range start="20120205T230000Z" end="20120212T225959Z"/>
+ </C:comp-filter>
+ </C:comp-filter>
+ </C:filter>
+</C:calendar-query>');
+
+ $response = $this->request($request);
+
+ // Everts super awesome xml parser.
+ $body = substr(
+ $response->body,
+ $start = strpos($response->body, 'BEGIN:VCALENDAR'),
+ strpos($response->body, 'END:VCALENDAR') - $start + 13
+ );
+ $body = str_replace('&#13;','',$body);
+
+ $vObject = VObject\Reader::read($body);
+
+ // check if DTSTARTs and DTENDs are correct
+ foreach ($vObject->VEVENT as $vevent) {
+ /** @var $vevent Sabre\VObject\Component\VEvent */
+ foreach ($vevent->children as $child) {
+ /** @var $child Sabre\VObject\Property */
+
+ if ($child->name == 'DTSTART') {
+ // DTSTART has to be one of three valid values
+ $this->assertContains($child->getValue(), array('20120207T171500Z', '20120208T171500Z', '20120209T171500Z'), 'DTSTART is not a valid value: '.$child->getValue());
+ } elseif ($child->name == 'DTEND') {
+ // DTEND has to be one of three valid values
+ $this->assertContains($child->getValue(), array('20120207T181500Z', '20120208T181500Z', '20120209T181500Z'), 'DTEND is not a valid value: '.$child->getValue());
+ }
+ }
+ }
+ }
+
+}
+
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/ExpandEventsDTSTARTandDTENDbyDayTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/ExpandEventsDTSTARTandDTENDbyDayTest.php
new file mode 100644
index 000000000..a179bf7f8
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/ExpandEventsDTSTARTandDTENDbyDayTest.php
@@ -0,0 +1,104 @@
+<?php
+
+namespace Sabre\CalDAV;
+use Sabre\HTTP;
+use Sabre\VObject;
+
+/**
+ * This unittests is created to find out why recurring events have wrong DTSTART value
+ *
+ *
+ * @copyright Copyright (C) 2007-2013 Rooftop Solutions. All rights reserved.
+ * @author Evert Pot (http://www.rooftopsolutions.nl/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class ExpandEventsDTSTARTandDTENDbyDayTest extends \Sabre\DAVServerTest {
+
+ protected $setupCalDAV = true;
+
+ protected $caldavCalendars = array(
+ array(
+ 'id' => 1,
+ 'name' => 'Calendar',
+ 'principaluri' => 'principals/user1',
+ 'uri' => 'calendar1',
+ )
+ );
+
+ protected $caldavCalendarObjects = array(
+ 1 => array(
+ 'event.ics' => array(
+ 'calendardata' => 'BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:foobar
+DTEND;TZID=Europe/Berlin:20120207T191500
+RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=TU,TH
+SUMMARY:RecurringEvents on tuesday and thursday
+DTSTART;TZID=Europe/Berlin:20120207T181500
+END:VEVENT
+END:VCALENDAR
+',
+ ),
+ ),
+ );
+
+ function testExpandRecurringByDayEvent() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'REPORT',
+ 'HTTP_CONTENT_TYPE' => 'application/xml',
+ 'REQUEST_URI' => '/calendars/user1/calendar1',
+ 'HTTP_DEPTH' => '1',
+ ));
+
+ $request->setBody('<?xml version="1.0" encoding="utf-8" ?>
+<C:calendar-query xmlns:D="DAV:" xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:prop>
+ <C:calendar-data>
+ <C:expand start="20120210T230000Z" end="20120217T225959Z"/>
+ </C:calendar-data>
+ <D:getetag/>
+ </D:prop>
+ <C:filter>
+ <C:comp-filter name="VCALENDAR">
+ <C:comp-filter name="VEVENT">
+ <C:time-range start="20120210T230000Z" end="20120217T225959Z"/>
+ </C:comp-filter>
+ </C:comp-filter>
+ </C:filter>
+</C:calendar-query>');
+
+ $response = $this->request($request);
+
+ // Everts super awesome xml parser.
+ $body = substr(
+ $response->body,
+ $start = strpos($response->body, 'BEGIN:VCALENDAR'),
+ strpos($response->body, 'END:VCALENDAR') - $start + 13
+ );
+ $body = str_replace('&#13;','',$body);
+
+ $vObject = VObject\Reader::read($body);
+
+ $this->assertEquals(2, count($vObject->VEVENT));
+
+ // check if DTSTARTs and DTENDs are correct
+ foreach ($vObject->VEVENT as $vevent) {
+ /** @var $vevent Sabre\VObject\Component\VEvent */
+ foreach ($vevent->children as $child) {
+ /** @var $child Sabre\VObject\Property */
+
+ if ($child->name == 'DTSTART') {
+ // DTSTART has to be one of two valid values
+ $this->assertContains($child->getValue(), array('20120214T171500Z', '20120216T171500Z'), 'DTSTART is not a valid value: '.$child->getValue());
+ } elseif ($child->name == 'DTEND') {
+ // DTEND has to be one of two valid values
+ $this->assertContains($child->getValue(), array('20120214T181500Z', '20120216T181500Z'), 'DTEND is not a valid value: '.$child->getValue());
+ }
+ }
+ }
+ }
+
+}
+
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/ExpandEventsDoubleEventsTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/ExpandEventsDoubleEventsTest.php
new file mode 100644
index 000000000..96e7c6f09
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/ExpandEventsDoubleEventsTest.php
@@ -0,0 +1,104 @@
+<?php
+
+namespace Sabre\CalDAV;
+
+use Sabre\HTTP;
+use Sabre\VObject;
+
+/**
+ * This unittests is created to find out why certain events show up twice.
+ *
+ * Hopefully, by the time I'm done with this, I've both found the problem, and
+ * fixed it :)
+ *
+ * @copyright Copyright (C) 2007-2013 Rooftop Solutions. All rights reserved.
+ * @author Evert Pot (http://www.rooftopsolutions.nl/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class ExpandEventsDoubleEventsTest extends \Sabre\DAVServerTest {
+
+ protected $setupCalDAV = true;
+
+ protected $caldavCalendars = array(
+ array(
+ 'id' => 1,
+ 'name' => 'Calendar',
+ 'principaluri' => 'principals/user1',
+ 'uri' => 'calendar1',
+ )
+ );
+
+ protected $caldavCalendarObjects = array(
+ 1 => array(
+ 'event.ics' => array(
+ 'calendardata' => 'BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:foobar
+DTEND;TZID=Europe/Berlin:20120207T191500
+RRULE:FREQ=DAILY;INTERVAL=1;COUNT=3
+SUMMARY:RecurringEvents 3 times
+DTSTART;TZID=Europe/Berlin:20120207T181500
+END:VEVENT
+BEGIN:VEVENT
+CREATED:20120207T111900Z
+UID:foobar
+DTEND;TZID=Europe/Berlin:20120208T191500
+SUMMARY:RecurringEvents 3 times OVERWRITTEN
+DTSTART;TZID=Europe/Berlin:20120208T181500
+RECURRENCE-ID;TZID=Europe/Berlin:20120208T181500
+END:VEVENT
+END:VCALENDAR
+',
+ ),
+ ),
+ );
+
+ function testExpand() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'REPORT',
+ 'HTTP_CONTENT_TYPE' => 'application/xml',
+ 'REQUEST_URI' => '/calendars/user1/calendar1',
+ 'HTTP_DEPTH' => '1',
+ ));
+
+ $request->setBody('<?xml version="1.0" encoding="utf-8" ?>
+<C:calendar-query xmlns:D="DAV:" xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:prop>
+ <C:calendar-data>
+ <C:expand start="20120205T230000Z" end="20120212T225959Z"/>
+ </C:calendar-data>
+ <D:getetag/>
+ </D:prop>
+ <C:filter>
+ <C:comp-filter name="VCALENDAR">
+ <C:comp-filter name="VEVENT">
+ <C:time-range start="20120205T230000Z" end="20120212T225959Z"/>
+ </C:comp-filter>
+ </C:comp-filter>
+ </C:filter>
+</C:calendar-query>');
+
+ $response = $this->request($request);
+
+ // Everts super awesome xml parser.
+ $body = substr(
+ $response->body,
+ $start = strpos($response->body, 'BEGIN:VCALENDAR'),
+ strpos($response->body, 'END:VCALENDAR') - $start + 13
+ );
+ $body = str_replace('&#13;','',$body);
+
+ $vObject = VObject\Reader::read($body);
+
+ // We only expect 3 events
+ $this->assertEquals(3, count($vObject->VEVENT),'We got 6 events instead of 3. Output: ' . $body);
+
+ // TZID should be gone
+ $this->assertFalse(isset($vObject->VEVENT->DTSTART['TZID']));
+
+ }
+
+}
+
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/FreeBusyReportTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/FreeBusyReportTest.php
new file mode 100644
index 000000000..93eca9ee9
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/FreeBusyReportTest.php
@@ -0,0 +1,159 @@
+<?php
+
+namespace Sabre\CalDAV;
+
+use Sabre\DAV;
+use Sabre\DAVACL;
+use Sabre\HTTP;
+
+require_once 'Sabre/CalDAV/Backend/Mock.php';
+require_once 'Sabre/HTTP/ResponseMock.php';
+
+class FreeBusyReportTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * @var Sabre\CalDAV\Plugin
+ */
+ protected $plugin;
+ /**
+ * @var Sabre\DAV\Server
+ */
+ protected $server;
+
+ function setUp() {
+
+ $obj1 = <<<ics
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+DTSTART:20111005T120000Z
+DURATION:PT1H
+END:VEVENT
+END:VCALENDAR
+ics;
+ $obj2 = fopen('php://memory','r+');
+ fwrite($obj2,<<<ics
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+DTSTART:20121005T120000Z
+DURATION:PT1H
+END:VEVENT
+END:VCALENDAR
+ics
+ );
+ rewind($obj2);
+
+ $calendarData = array(
+ 1 => array(
+ 'obj1' => array(
+ 'calendarid' => 1,
+ 'uri' => 'event1.ics',
+ 'calendardata' => $obj1,
+ ),
+ 'obj2' => array(
+ 'calendarid' => 1,
+ 'uri' => 'event2.ics',
+ 'calendardata' => $obj2
+ )
+ ),
+ );
+
+
+ $caldavBackend = new Backend\Mock(array(), $calendarData);
+
+ $calendar = new Calendar($caldavBackend, array(
+ 'id' => 1,
+ 'uri' => 'calendar',
+ 'principaluri' => 'principals/user1',
+ ));
+
+ $this->server = new DAV\Server(array($calendar));
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_URI' => '/calendar',
+ ));
+ $this->server->httpRequest = $request;
+ $this->server->httpResponse = new HTTP\ResponseMock();
+
+ $this->plugin = new Plugin();
+ $this->server->addPlugin($this->plugin);
+ $this->server->addPlugin(new DAVACL\Plugin());
+
+ }
+
+ function testFreeBusyReport() {
+
+ $reportXML = <<<XML
+<?xml version="1.0"?>
+<c:free-busy-query xmlns:c="urn:ietf:params:xml:ns:caldav">
+ <c:time-range start="20111001T000000Z" end="20111101T000000Z" />
+</c:free-busy-query>
+XML;
+
+ $dom = DAV\XMLUtil::loadDOMDocument($reportXML);
+ $this->plugin->report('{urn:ietf:params:xml:ns:caldav}free-busy-query', $dom);
+
+ $this->assertEquals('HTTP/1.1 200 OK', $this->server->httpResponse->status);
+ $this->assertEquals('text/calendar', $this->server->httpResponse->headers['Content-Type']);
+ $this->assertTrue(strpos($this->server->httpResponse->body,'BEGIN:VFREEBUSY')!==false);
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\BadRequest
+ */
+ function testFreeBusyReportNoTimeRange() {
+
+ $reportXML = <<<XML
+<?xml version="1.0"?>
+<c:free-busy-query xmlns:c="urn:ietf:params:xml:ns:caldav">
+</c:free-busy-query>
+XML;
+
+ $dom = DAV\XMLUtil::loadDOMDocument($reportXML);
+ $this->plugin->report('{urn:ietf:params:xml:ns:caldav}free-busy-query', $dom);
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\NotImplemented
+ */
+ function testFreeBusyReportWrongNode() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_URI' => '/',
+ ));
+ $this->server->httpRequest = $request;
+
+ $reportXML = <<<XML
+<?xml version="1.0"?>
+<c:free-busy-query xmlns:c="urn:ietf:params:xml:ns:caldav">
+ <c:time-range start="20111001T000000Z" end="20111101T000000Z" />
+</c:free-busy-query>
+XML;
+
+ $dom = DAV\XMLUtil::loadDOMDocument($reportXML);
+ $this->plugin->report('{urn:ietf:params:xml:ns:caldav}free-busy-query', $dom);
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception
+ */
+ function testFreeBusyReportNoACLPlugin() {
+
+ $this->server = new DAV\Server();
+ $this->plugin = new Plugin();
+ $this->server->addPlugin($this->plugin);
+
+ $reportXML = <<<XML
+<?xml version="1.0"?>
+<c:free-busy-query xmlns:c="urn:ietf:params:xml:ns:caldav">
+ <c:time-range start="20111001T000000Z" end="20111101T000000Z" />
+</c:free-busy-query>
+XML;
+
+ $dom = DAV\XMLUtil::loadDOMDocument($reportXML);
+ $this->plugin->report('{urn:ietf:params:xml:ns:caldav}free-busy-query', $dom);
+
+ }
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/FreeBusyRequestTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/FreeBusyRequestTest.php
new file mode 100644
index 000000000..62252e6a1
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/FreeBusyRequestTest.php
@@ -0,0 +1,282 @@
+<?php
+
+namespace Sabre\CalDAV;
+
+use Sabre\DAV;
+use Sabre\DAVACL;
+use Sabre\HTTP;
+
+require_once 'Sabre/HTTP/ResponseMock.php';
+
+class FreeBusyRequestTest extends \PHPUnit_Framework_TestCase {
+
+ protected $plugin;
+ protected $server;
+ protected $aclPlugin;
+ protected $request;
+ protected $authPlugin;
+
+ function setUp() {
+
+ $calendars = array(
+ array(
+ 'principaluri' => 'principals/user2',
+ 'id' => 1,
+ 'uri' => 'calendar1',
+ ),
+ );
+ $calendarobjects = array(
+ 1 => array( '1.ics' => array(
+ 'uri' => '1.ics',
+ 'calendardata' => 'BEGIN:VCALENDAR
+BEGIN:VEVENT
+DTSTART:20110101T130000
+DURATION:PT1H
+END:VEVENT
+END:VCALENDAR',
+ 'calendarid' => 1,
+ ))
+
+ );
+
+ $principalBackend = new DAVACL\PrincipalBackend\Mock();
+ $caldavBackend = new Backend\Mock($calendars, $calendarobjects);
+
+ $tree = array(
+ new DAVACL\PrincipalCollection($principalBackend),
+ new CalendarRootNode($principalBackend, $caldavBackend),
+ );
+
+ $this->request = new HTTP\Request(array(
+ 'CONTENT_TYPE' => 'text/calendar',
+ ));
+ $this->response = new HTTP\ResponseMock();
+
+ $this->server = new DAV\Server($tree);
+ $this->server->httpRequest = $this->request;
+ $this->server->httpResponse = $this->response;
+
+ $this->aclPlugin = new DAVACL\Plugin();
+ $this->server->addPlugin($this->aclPlugin);
+
+ $authBackend = new DAV\Auth\Backend\Mock();
+ $authBackend->setCurrentUser('user1');
+ $this->authPlugin = new DAV\Auth\Plugin($authBackend,'SabreDAV');
+ $this->server->addPlugin($this->authPlugin);
+
+ $this->plugin = new Plugin();
+ $this->server->addPlugin($this->plugin);
+
+ }
+
+ function testWrongMethod() {
+
+ $this->assertNull(
+ $this->plugin->unknownMethod('PUT','calendars/user1/outbox')
+ );
+
+ }
+
+ function testWrongContentType() {
+
+ $this->server->httpRequest = new HTTP\Request(array(
+ 'CONTENT_TYPE' => 'text/plain',
+ ));
+
+ $this->assertNull(
+ $this->plugin->unknownMethod('POST','calendars/user1/outbox')
+ );
+
+ }
+
+ function testNotFound() {
+
+ $this->assertNull(
+ $this->plugin->unknownMethod('POST','calendars/user1/blabla')
+ );
+
+ }
+
+ function testNotOutbox() {
+
+ $this->assertNull(
+ $this->plugin->unknownMethod('POST','calendars/user1/inbox')
+ );
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\BadRequest
+ */
+ function testNoItipMethod() {
+
+ $body = <<<ICS
+BEGIN:VCALENDAR
+BEGIN:VFREEBUSY
+END:VFREEBUSY
+END:VCALENDAR
+ICS;
+
+ $this->request->setBody($body);
+ $this->plugin->unknownMethod('POST','calendars/user1/outbox');
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\BadRequest
+ */
+ function testNoVFreeBusy() {
+
+ $body = <<<ICS
+BEGIN:VCALENDAR
+METHOD:REQUEST
+BEGIN:VEVENT
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+ $this->request->setBody($body);
+ $this->plugin->unknownMethod('POST','calendars/user1/outbox');
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\Forbidden
+ */
+ function testIncorrectOrganizer() {
+
+ $body = <<<ICS
+BEGIN:VCALENDAR
+METHOD:REQUEST
+BEGIN:VFREEBUSY
+ORGANIZER:mailto:john@wayne.org
+END:VFREEBUSY
+END:VCALENDAR
+ICS;
+
+ $this->request->setBody($body);
+ $this->plugin->unknownMethod('POST','calendars/user1/outbox');
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\BadRequest
+ */
+ function testNoAttendees() {
+
+ $body = <<<ICS
+BEGIN:VCALENDAR
+METHOD:REQUEST
+BEGIN:VFREEBUSY
+ORGANIZER:mailto:user1.sabredav@sabredav.org
+END:VFREEBUSY
+END:VCALENDAR
+ICS;
+
+ $this->request->setBody($body);
+ $this->plugin->unknownMethod('POST','calendars/user1/outbox');
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\BadRequest
+ */
+ function testNoDTStart() {
+
+ $body = <<<ICS
+BEGIN:VCALENDAR
+METHOD:REQUEST
+BEGIN:VFREEBUSY
+ORGANIZER:mailto:user1.sabredav@sabredav.org
+ATTENDEE:mailto:user2.sabredav@sabredav.org
+END:VFREEBUSY
+END:VCALENDAR
+ICS;
+
+ $this->request->setBody($body);
+ $this->plugin->unknownMethod('POST','calendars/user1/outbox');
+
+ }
+
+ function testSucceed() {
+
+ $body = <<<ICS
+BEGIN:VCALENDAR
+METHOD:REQUEST
+BEGIN:VFREEBUSY
+ORGANIZER:mailto:user1.sabredav@sabredav.org
+ATTENDEE:mailto:user2.sabredav@sabredav.org
+ATTENDEE:mailto:user3.sabredav@sabredav.org
+DTSTART:20110101T080000Z
+DTEND:20110101T180000Z
+END:VFREEBUSY
+END:VCALENDAR
+ICS;
+
+ // Lazily making the current principal an admin.
+ $this->aclPlugin->adminPrincipals[] = 'principals/user1';
+
+ $this->request->setBody($body);
+ $this->assertFalse($this->plugin->unknownMethod('POST','calendars/user1/outbox'));
+
+ $this->assertEquals('HTTP/1.1 200 OK' , $this->response->status);
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml',
+ ), $this->response->headers);
+
+ $strings = array(
+ '<d:href>mailto:user2.sabredav@sabredav.org</d:href>',
+ '<d:href>mailto:user3.sabredav@sabredav.org</d:href>',
+ '<cal:request-status>2.0;Success</cal:request-status>',
+ '<cal:request-status>3.7;Could not find principal</cal:request-status>',
+ 'FREEBUSY;FBTYPE=BUSY:20110101T130000Z/20110101T140000Z',
+ );
+
+ foreach($strings as $string) {
+ $this->assertTrue(
+ strpos($this->response->body, $string)!==false,
+ 'The response body did not contain: ' . $string .'Full response: ' . $this->response->body
+ );
+ }
+
+
+ }
+
+ function testNoPrivilege() {
+
+ $body = <<<ICS
+BEGIN:VCALENDAR
+METHOD:REQUEST
+BEGIN:VFREEBUSY
+ORGANIZER:mailto:user1.sabredav@sabredav.org
+ATTENDEE:mailto:user2.sabredav@sabredav.org
+DTSTART:20110101T080000Z
+DTEND:20110101T180000Z
+END:VFREEBUSY
+END:VCALENDAR
+ICS;
+
+ $this->request->setBody($body);
+ $this->assertFalse($this->plugin->unknownMethod('POST','calendars/user1/outbox'));
+
+ $this->assertEquals('HTTP/1.1 200 OK' , $this->response->status);
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml',
+ ), $this->response->headers);
+
+ $strings = array(
+ '<d:href>mailto:user2.sabredav@sabredav.org</d:href>',
+ '<cal:request-status>3.7;No calendar-home-set property found</cal:request-status>',
+ );
+
+ foreach($strings as $string) {
+ $this->assertTrue(
+ strpos($this->response->body, $string)!==false,
+ 'The response body did not contain: ' . $string .'Full response: ' . $this->response->body
+ );
+ }
+
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/GetEventsByTimerangeTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/GetEventsByTimerangeTest.php
new file mode 100644
index 000000000..4e4c2cbf1
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/GetEventsByTimerangeTest.php
@@ -0,0 +1,97 @@
+<?php
+
+namespace Sabre\CalDAV;
+use Sabre\HTTP;
+use Sabre\VObject;
+
+/**
+ * This unittest is created to check if queries for time-range include the start timestamp or not
+ *
+ *
+ * @copyright Copyright (C) 2007-2013 Rooftop Solutions. All rights reserved.
+ * @author Evert Pot (http://www.rooftopsolutions.nl/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class GetEventsByTimerangeTest extends \Sabre\DAVServerTest {
+
+ protected $setupCalDAV = true;
+
+ protected $caldavCalendars = array(
+ array(
+ 'id' => 1,
+ 'name' => 'Calendar',
+ 'principaluri' => 'principals/user1',
+ 'uri' => 'calendar1',
+ )
+ );
+
+ protected $caldavCalendarObjects = array(
+ 1 => array(
+ 'event.ics' => array(
+ 'calendardata' => 'BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+CREATED:20120313T142342Z
+UID:171EBEFC-C951-499D-B234-7BA7D677B45D
+DTEND;TZID=Europe/Berlin:20120227T000000
+TRANSP:OPAQUE
+SUMMARY:Monday 0h
+DTSTART;TZID=Europe/Berlin:20120227T000000
+DTSTAMP:20120313T142416Z
+SEQUENCE:4
+END:VEVENT
+END:VCALENDAR
+',
+ ),
+ ),
+ );
+
+ function testQueryTimerange() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'REPORT',
+ 'HTTP_CONTENT_TYPE' => 'application/xml',
+ 'REQUEST_URI' => '/calendars/user1/calendar1',
+ 'HTTP_DEPTH' => '1',
+ ));
+
+ $request->setBody('<?xml version="1.0" encoding="utf-8" ?>
+<C:calendar-query xmlns:D="DAV:" xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:prop>
+ <C:calendar-data>
+ <C:expand start="20120226T230000Z" end="20120228T225959Z"/>
+ </C:calendar-data>
+ <D:getetag/>
+ </D:prop>
+ <C:filter>
+ <C:comp-filter name="VCALENDAR">
+ <C:comp-filter name="VEVENT">
+ <C:time-range start="20120226T230000Z" end="20120228T225959Z"/>
+ </C:comp-filter>
+ </C:comp-filter>
+ </C:filter>
+</C:calendar-query>');
+
+ $response = $this->request($request);
+
+ if (strpos($response->body, 'BEGIN:VCALENDAR') === false) {
+ $this->fail('Got no events instead of 1. Output: '.$response->body);
+ }
+
+ // Everts super awesome xml parser.
+ $body = substr(
+ $response->body,
+ $start = strpos($response->body, 'BEGIN:VCALENDAR'),
+ strpos($response->body, 'END:VCALENDAR') - $start + 13
+ );
+ $body = str_replace('&#13;','',$body);
+
+ $vObject = VObject\Reader::read($body);
+
+ // We expect 1 event
+ $this->assertEquals(1, count($vObject->VEVENT), 'We got 0 events instead of 1. Output: ' . $body);
+
+ }
+
+}
+
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/ICSExportPluginTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/ICSExportPluginTest.php
new file mode 100644
index 000000000..be21796dd
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/ICSExportPluginTest.php
@@ -0,0 +1,227 @@
+<?php
+
+namespace Sabre\CalDAV;
+
+use Sabre\DAV;
+use Sabre\HTTP;
+use Sabre\VObject;
+use Sabre\DAVACL;
+
+require_once 'Sabre/CalDAV/TestUtil.php';
+require_once 'Sabre/HTTP/ResponseMock.php';
+
+class ICSExportPluginTest extends \PHPUnit_Framework_TestCase {
+
+ function testInit() {
+
+ $p = new ICSExportPlugin();
+ $s = new DAV\Server();
+ $s->addPlugin($p);
+
+ }
+
+ function testBeforeMethod() {
+
+ if (!SABRE_HASSQLITE) $this->markTestSkipped('SQLite driver is not available');
+ $cbackend = TestUtil::getBackend();
+
+ $props = array(
+ 'uri'=>'UUID-123467',
+ 'principaluri' => 'admin',
+ 'id' => 1,
+ );
+ $tree = array(
+ new Calendar($cbackend,$props),
+ );
+
+ $p = new ICSExportPlugin();
+
+ $s = new DAV\Server($tree);
+ $s->addPlugin($p);
+ $s->addPlugin(new Plugin());
+
+ $h = new HTTP\Request(array(
+ 'QUERY_STRING' => 'export',
+ ));
+
+ $s->httpRequest = $h;
+ $s->httpResponse = new HTTP\ResponseMock();
+
+ $this->assertFalse($p->beforeMethod('GET','UUID-123467?export'));
+
+ $this->assertEquals('HTTP/1.1 200 OK',$s->httpResponse->status);
+ $this->assertEquals(array(
+ 'Content-Type' => 'text/calendar',
+ ), $s->httpResponse->headers);
+
+ $obj = VObject\Reader::read($s->httpResponse->body);
+
+ $this->assertEquals(5,count($obj->children()));
+ $this->assertEquals(1,count($obj->VERSION));
+ $this->assertEquals(1,count($obj->CALSCALE));
+ $this->assertEquals(1,count($obj->PRODID));
+ $this->assertTrue(strpos((string)$obj->PRODID, DAV\Version::VERSION)!==false);
+ $this->assertEquals(1,count($obj->VTIMEZONE));
+ $this->assertEquals(1,count($obj->VEVENT));
+
+ }
+ function testBeforeMethodNoVersion() {
+
+ if (!SABRE_HASSQLITE) $this->markTestSkipped('SQLite driver is not available');
+ $cbackend = TestUtil::getBackend();
+
+ $props = array(
+ 'uri'=>'UUID-123467',
+ 'principaluri' => 'admin',
+ 'id' => 1,
+ );
+ $tree = array(
+ new Calendar($cbackend,$props),
+ );
+
+ $p = new ICSExportPlugin();
+
+ $s = new DAV\Server($tree);
+
+ $s->addPlugin($p);
+ $s->addPlugin(new Plugin());
+
+ $h = new HTTP\Request(array(
+ 'QUERY_STRING' => 'export',
+ ));
+
+ $s->httpRequest = $h;
+ $s->httpResponse = new HTTP\ResponseMock();
+
+ DAV\Server::$exposeVersion = false;
+ $this->assertFalse($p->beforeMethod('GET','UUID-123467?export'));
+ DAV\Server::$exposeVersion = true;
+
+ $this->assertEquals('HTTP/1.1 200 OK',$s->httpResponse->status);
+ $this->assertEquals(array(
+ 'Content-Type' => 'text/calendar',
+ ), $s->httpResponse->headers);
+
+ $obj = VObject\Reader::read($s->httpResponse->body);
+
+ $this->assertEquals(5,count($obj->children()));
+ $this->assertEquals(1,count($obj->VERSION));
+ $this->assertEquals(1,count($obj->CALSCALE));
+ $this->assertEquals(1,count($obj->PRODID));
+ $this->assertFalse(strpos((string)$obj->PRODID, DAV\Version::VERSION)!==false);
+ $this->assertEquals(1,count($obj->VTIMEZONE));
+ $this->assertEquals(1,count($obj->VEVENT));
+
+ }
+
+ function testBeforeMethodNoGET() {
+
+ $p = new ICSExportPlugin();
+
+ $s = new DAV\Server();
+ $s->addPlugin($p);
+
+ $this->assertNull($p->beforeMethod('POST','UUID-123467?export'));
+
+ }
+
+ function testBeforeMethodNoExport() {
+
+ $p = new ICSExportPlugin();
+
+ $s = new DAV\Server();
+ $s->addPlugin($p);
+
+ $this->assertNull($p->beforeMethod('GET','UUID-123467'));
+
+ }
+
+ /**
+ * @expectedException Sabre\DAVACL\Exception\NeedPrivileges
+ */
+ function testACLIntegrationBlocked() {
+
+ if (!SABRE_HASSQLITE) $this->markTestSkipped('SQLite driver is not available');
+ $cbackend = TestUtil::getBackend();
+
+ $props = array(
+ 'uri'=>'UUID-123467',
+ 'principaluri' => 'admin',
+ 'id' => 1,
+ );
+ $tree = array(
+ new Calendar($cbackend,$props),
+ );
+
+ $p = new ICSExportPlugin();
+
+ $s = new DAV\Server($tree);
+ $s->addPlugin($p);
+ $s->addPlugin(new Plugin());
+ $s->addPlugin(new DAVACL\Plugin());
+
+ $h = new HTTP\Request(array(
+ 'QUERY_STRING' => 'export',
+ ));
+
+ $s->httpRequest = $h;
+ $s->httpResponse = new HTTP\ResponseMock();
+
+ $p->beforeMethod('GET','UUID-123467?export');
+
+ }
+
+ function testACLIntegrationNotBlocked() {
+
+ if (!SABRE_HASSQLITE) $this->markTestSkipped('SQLite driver is not available');
+ $cbackend = TestUtil::getBackend();
+ $pbackend = new DAVACL\PrincipalBackend\Mock();
+
+ $props = array(
+ 'uri'=>'UUID-123467',
+ 'principaluri' => 'admin',
+ 'id' => 1,
+ );
+ $tree = array(
+ new Calendar($cbackend,$props),
+ new DAVACL\PrincipalCollection($pbackend),
+ );
+
+ $p = new ICSExportPlugin();
+
+ $s = new DAV\Server($tree);
+ $s->addPlugin($p);
+ $s->addPlugin(new Plugin());
+ $s->addPlugin(new DAVACL\Plugin());
+ $s->addPlugin(new DAV\Auth\Plugin(new DAV\Auth\Backend\Mock(),'SabreDAV'));
+
+ // Forcing login
+ $s->getPlugin('acl')->adminPrincipals = array('principals/admin');
+
+ $h = new HTTP\Request(array(
+ 'QUERY_STRING' => 'export',
+ 'REQUEST_URI' => '/UUID-123467',
+ 'REQUEST_METHOD' => 'GET',
+ ));
+
+ $s->httpRequest = $h;
+ $s->httpResponse = new HTTP\ResponseMock();
+
+ $s->exec();
+
+ $this->assertEquals('HTTP/1.1 200 OK',$s->httpResponse->status,'Invalid status received. Response body: '. $s->httpResponse->body);
+ $this->assertEquals(array(
+ 'Content-Type' => 'text/calendar',
+ ), $s->httpResponse->headers);
+
+ $obj = VObject\Reader::read($s->httpResponse->body);
+
+ $this->assertEquals(5,count($obj->children()));
+ $this->assertEquals(1,count($obj->VERSION));
+ $this->assertEquals(1,count($obj->CALSCALE));
+ $this->assertEquals(1,count($obj->PRODID));
+ $this->assertEquals(1,count($obj->VTIMEZONE));
+ $this->assertEquals(1,count($obj->VEVENT));
+
+ }
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/Issue166Test.php b/vendor/sabre/dav/tests/Sabre/CalDAV/Issue166Test.php
new file mode 100644
index 000000000..f925224f2
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/Issue166Test.php
@@ -0,0 +1,63 @@
+<?php
+
+namespace Sabre\CalDAV;
+use Sabre\VObject;
+use Sabre\DAV;
+
+class Issue166Test extends \PHPUnit_Framework_TestCase {
+
+ function testFlaw() {
+
+ $input = <<<HI
+BEGIN:VCALENDAR
+PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:Asia/Pyongyang
+X-LIC-LOCATION:Asia/Pyongyang
+BEGIN:STANDARD
+TZOFFSETFROM:+0900
+TZOFFSETTO:+0900
+TZNAME:KST
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+CREATED:20111118T010857Z
+LAST-MODIFIED:20111118T010937Z
+DTSTAMP:20111118T010937Z
+UID:a03245b3-9947-9a48-a088-863c74e0fdd8
+SUMMARY:New Event
+RRULE:FREQ=YEARLY
+DTSTART;TZID=Asia/Pyongyang:19960102T111500
+DTEND;TZID=Asia/Pyongyang:19960102T121500
+END:VEVENT
+END:VCALENDAR
+HI;
+
+ $validator = new CalendarQueryValidator();
+
+ $filters = array(
+ 'name' => 'VCALENDAR',
+ 'comp-filters' => array(
+ array(
+ 'name' => 'VEVENT',
+ 'comp-filters' => array(),
+ 'prop-filters' => array(),
+ 'is-not-defined' => false,
+ 'time-range' => array(
+ 'start' => new \DateTime('2011-12-01'),
+ 'end' => new \DateTime('2012-02-01'),
+ ),
+ ),
+ ),
+ 'prop-filters' => array(),
+ 'is-not-defined' => false,
+ 'time-range' => null,
+ );
+ $input = VObject\Reader::read($input);
+ $this->assertTrue($validator->validate($input,$filters));
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/Issue172Test.php b/vendor/sabre/dav/tests/Sabre/CalDAV/Issue172Test.php
new file mode 100644
index 000000000..ce6d364f6
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/Issue172Test.php
@@ -0,0 +1,135 @@
+<?php
+
+namespace Sabre\CalDAV;
+use Sabre\VObject;
+use Sabre\DAV;
+
+class Issue172Test extends \PHPUnit_Framework_TestCase {
+
+ // DateTimeZone() native name: America/Los_Angeles (GMT-8 in January)
+ function testBuiltInTimezoneName() {
+ $input = <<<HI
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+DTSTART;TZID=America/Los_Angeles:20120118T204500
+DTEND;TZID=America/Los_Angeles:20120118T214500
+END:VEVENT
+END:VCALENDAR
+HI;
+ $validator = new CalendarQueryValidator();
+ $filters = array(
+ 'name' => 'VCALENDAR',
+ 'comp-filters' => array(
+ array(
+ 'name' => 'VEVENT',
+ 'comp-filters' => array(),
+ 'prop-filters' => array(),
+ 'is-not-defined' => false,
+ 'time-range' => array(
+ 'start' => new \DateTime('2012-01-18 21:00:00 GMT-08:00'),
+ 'end' => new \DateTime('2012-01-18 21:00:00 GMT-08:00'),
+ ),
+ ),
+ ),
+ 'prop-filters' => array(),
+ );
+ $input = VObject\Reader::read($input);
+ $this->assertTrue($validator->validate($input,$filters));
+ }
+
+ // Pacific Standard Time, translates to America/Los_Angeles (GMT-8 in January)
+ function testOutlookTimezoneName() {
+ $input = <<<HI
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:Pacific Standard Time
+BEGIN:STANDARD
+DTSTART:16010101T030000
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:16010101T020000
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=3
+END:DAYLIGHT
+END:VTIMEZONE
+BEGIN:VEVENT
+DTSTART;TZID=Pacific Standard Time:20120113T100000
+DTEND;TZID=Pacific Standard Time:20120113T110000
+END:VEVENT
+END:VCALENDAR
+HI;
+ $validator = new CalendarQueryValidator();
+ $filters = array(
+ 'name' => 'VCALENDAR',
+ 'comp-filters' => array(
+ array(
+ 'name' => 'VEVENT',
+ 'comp-filters' => array(),
+ 'prop-filters' => array(),
+ 'is-not-defined' => false,
+ 'time-range' => array(
+ 'start' => new \DateTime('2012-01-13 10:30:00 GMT-08:00'),
+ 'end' => new \DateTime('2012-01-13 10:30:00 GMT-08:00'),
+ ),
+ ),
+ ),
+ 'prop-filters' => array(),
+ );
+ $input = VObject\Reader::read($input);
+ $this->assertTrue($validator->validate($input,$filters));
+ }
+
+ // X-LIC-LOCATION, translates to America/Los_Angeles (GMT-8 in January)
+ function testLibICalLocationName() {
+ $input = <<<HI
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:My own timezone name
+X-LIC-LOCATION:America/Los_Angeles
+BEGIN:STANDARD
+DTSTART:16010101T030000
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:16010101T020000
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=3
+END:DAYLIGHT
+END:VTIMEZONE
+BEGIN:VEVENT
+DTSTART;TZID=My own timezone name:20120113T100000
+DTEND;TZID=My own timezone name:20120113T110000
+END:VEVENT
+END:VCALENDAR
+HI;
+ $validator = new CalendarQueryValidator();
+ $filters = array(
+ 'name' => 'VCALENDAR',
+ 'comp-filters' => array(
+ array(
+ 'name' => 'VEVENT',
+ 'comp-filters' => array(),
+ 'prop-filters' => array(),
+ 'is-not-defined' => false,
+ 'time-range' => array(
+ 'start' => new \DateTime('2012-01-13 10:30:00 GMT-08:00'),
+ 'end' => new \DateTime('2012-01-13 10:30:00 GMT-08:00'),
+ ),
+ ),
+ ),
+ 'prop-filters' => array(),
+ );
+ $input = VObject\Reader::read($input);
+ $this->assertTrue($validator->validate($input,$filters));
+ }
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/Issue203Test.php b/vendor/sabre/dav/tests/Sabre/CalDAV/Issue203Test.php
new file mode 100644
index 000000000..8cc8ad31f
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/Issue203Test.php
@@ -0,0 +1,139 @@
+<?php
+
+namespace Sabre\CalDAV;
+use Sabre\HTTP;
+use Sabre\VObject;
+
+/**
+ * This unittest is created to find out why an overwritten DAILY event has wrong DTSTART, DTEND, SUMMARY and RECURRENCEID
+ *
+ *
+ * @copyright Copyright (C) 2007-2013 Rooftop Solutions. All rights reserved.
+ * @author Evert Pot (http://www.rooftopsolutions.nl/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Issue203Test extends \Sabre\DAVServerTest {
+
+ protected $setupCalDAV = true;
+
+ protected $caldavCalendars = array(
+ array(
+ 'id' => 1,
+ 'name' => 'Calendar',
+ 'principaluri' => 'principals/user1',
+ 'uri' => 'calendar1',
+ )
+ );
+
+ protected $caldavCalendarObjects = array(
+ 1 => array(
+ 'event.ics' => array(
+ 'calendardata' => 'BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:20120330T155305CEST-6585fBUVgV
+DTSTAMP:20120330T135305Z
+DTSTART;TZID=Europe/Berlin:20120326T155200
+DTEND;TZID=Europe/Berlin:20120326T165200
+RRULE:FREQ=DAILY;COUNT=2;INTERVAL=1
+SUMMARY:original summary
+TRANSP:OPAQUE
+END:VEVENT
+BEGIN:VEVENT
+UID:20120330T155305CEST-6585fBUVgV
+DTSTAMP:20120330T135352Z
+DESCRIPTION:
+DTSTART;TZID=Europe/Berlin:20120328T155200
+DTEND;TZID=Europe/Berlin:20120328T165200
+RECURRENCE-ID;TZID=Europe/Berlin:20120327T155200
+SEQUENCE:1
+SUMMARY:overwritten summary
+TRANSP:OPAQUE
+END:VEVENT
+END:VCALENDAR
+',
+ ),
+ ),
+ );
+
+ function testIssue203() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'REPORT',
+ 'HTTP_CONTENT_TYPE' => 'application/xml',
+ 'REQUEST_URI' => '/calendars/user1/calendar1',
+ 'HTTP_DEPTH' => '1',
+ ));
+
+ $request->setBody('<?xml version="1.0" encoding="utf-8" ?>
+<C:calendar-query xmlns:D="DAV:" xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:prop>
+ <C:calendar-data>
+ <C:expand start="20120325T220000Z" end="20120401T215959Z"/>
+ </C:calendar-data>
+ <D:getetag/>
+ </D:prop>
+ <C:filter>
+ <C:comp-filter name="VCALENDAR">
+ <C:comp-filter name="VEVENT">
+ <C:time-range start="20120325T220000Z" end="20120401T215959Z"/>
+ </C:comp-filter>
+ </C:comp-filter>
+ </C:filter>
+</C:calendar-query>');
+
+ $response = $this->request($request);
+
+ // Everts super awesome xml parser.
+ $body = substr(
+ $response->body,
+ $start = strpos($response->body, 'BEGIN:VCALENDAR'),
+ strpos($response->body, 'END:VCALENDAR') - $start + 13
+ );
+ $body = str_replace('&#13;','',$body);
+
+ $vObject = VObject\Reader::read($body);
+
+ $this->assertEquals(2, count($vObject->VEVENT));
+
+
+ $expectedEvents = array(
+ array(
+ 'DTSTART' => '20120326T135200Z',
+ 'DTEND' => '20120326T145200Z',
+ 'SUMMARY' => 'original summary',
+ ),
+ array(
+ 'DTSTART' => '20120328T135200Z',
+ 'DTEND' => '20120328T145200Z',
+ 'SUMMARY' => 'overwritten summary',
+ 'RECURRENCE-ID' => '20120327T135200Z',
+ )
+ );
+
+ // try to match agains $expectedEvents array
+ foreach ($expectedEvents as $expectedEvent) {
+
+ $matching = false;
+
+ foreach ($vObject->VEVENT as $vevent) {
+ /** @var $vevent Sabre\VObject\Component\VEvent */
+
+ foreach ($vevent->children as $child) {
+ /** @var $child Sabre\VObject\Property */
+
+ if (isset($expectedEvent[$child->name])) {
+ if ($expectedEvent[$child->name] != $child->getValue()) {
+ continue 2;
+ }
+ }
+ }
+
+ $matching = true;
+ break;
+ }
+
+ $this->assertTrue($matching, 'Did not find the following event in the response: '.var_export($expectedEvent, true));
+ }
+ }
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/Issue205Test.php b/vendor/sabre/dav/tests/Sabre/CalDAV/Issue205Test.php
new file mode 100644
index 000000000..db336c806
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/Issue205Test.php
@@ -0,0 +1,98 @@
+<?php
+
+namespace Sabre\CalDAV;
+use Sabre\HTTP;
+use Sabre\VObject;
+
+/**
+ * This unittest is created to check if a VALARM TRIGGER of PT0S is supported
+ *
+ *
+ * @copyright Copyright (C) 2007-2013 Rooftop Solutions. All rights reserved.
+ * @author Evert Pot (http://www.rooftopsolutions.nl/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Issue205Test extends \Sabre\DAVServerTest {
+
+ protected $setupCalDAV = true;
+
+ protected $caldavCalendars = array(
+ array(
+ 'id' => 1,
+ 'name' => 'Calendar',
+ 'principaluri' => 'principals/user1',
+ 'uri' => 'calendar1',
+ )
+ );
+
+ protected $caldavCalendarObjects = array(
+ 1 => array(
+ 'event.ics' => array(
+ 'calendardata' => 'BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:20120330T155305CEST-6585fBUVgV
+DTSTAMP:20120330T135305Z
+DTSTART;TZID=Europe/Berlin:20120326T155200
+DTEND;TZID=Europe/Berlin:20120326T165200
+SUMMARY:original summary
+TRANSP:OPAQUE
+BEGIN:VALARM
+ACTION:AUDIO
+ATTACH;VALUE=URI:Basso
+TRIGGER:PT0S
+END:VALARM
+END:VEVENT
+END:VCALENDAR
+',
+ ),
+ ),
+ );
+
+ function testIssue205() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'REPORT',
+ 'HTTP_CONTENT_TYPE' => 'application/xml',
+ 'REQUEST_URI' => '/calendars/user1/calendar1',
+ 'HTTP_DEPTH' => '1',
+ ));
+
+ $request->setBody('<?xml version="1.0" encoding="utf-8" ?>
+<C:calendar-query xmlns:D="DAV:" xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:prop>
+ <C:calendar-data>
+ <C:expand start="20120325T220000Z" end="20120401T215959Z"/>
+ </C:calendar-data>
+ <D:getetag/>
+ </D:prop>
+ <C:filter>
+ <C:comp-filter name="VCALENDAR">
+ <C:comp-filter name="VEVENT">
+ <C:comp-filter name="VALARM">
+ <C:time-range start="20120325T220000Z" end="20120401T215959Z"/>
+ </C:comp-filter>
+ </C:comp-filter>
+ </C:comp-filter>
+ </C:filter>
+</C:calendar-query>');
+
+ $response = $this->request($request);
+
+ $this->assertFalse(strpos($response->body, '<s:exception>Exception</s:exception>'), 'Exception occurred: ' . $response->body);
+ $this->assertFalse(strpos($response->body, 'Unknown or bad format'), 'DateTime unknown format Exception: ' . $response->body);
+
+ // Everts super awesome xml parser.
+ $body = substr(
+ $response->body,
+ $start = strpos($response->body, 'BEGIN:VCALENDAR'),
+ strpos($response->body, 'END:VCALENDAR') - $start + 13
+ );
+ $body = str_replace('&#13;','',$body);
+
+ $vObject = VObject\Reader::read($body);
+
+ $this->assertEquals(1, count($vObject->VEVENT));
+
+ }
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/Issue211Test.php b/vendor/sabre/dav/tests/Sabre/CalDAV/Issue211Test.php
new file mode 100644
index 000000000..5e28c804b
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/Issue211Test.php
@@ -0,0 +1,90 @@
+<?php
+
+namespace Sabre\CalDAV;
+use Sabre\HTTP;
+use Sabre\VObject;
+
+/**
+ * This unittest is created to check for an endless loop in Sabre\CalDAV\CalendarQueryValidator
+ *
+ *
+ * @copyright Copyright (C) 2007-2013 Rooftop Solutions. All rights reserved.
+ * @author Evert Pot (http://www.rooftopsolutions.nl/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Issue211Test extends \Sabre\DAVServerTest {
+
+ protected $setupCalDAV = true;
+
+ protected $caldavCalendars = array(
+ array(
+ 'id' => 1,
+ 'name' => 'Calendar',
+ 'principaluri' => 'principals/user1',
+ 'uri' => 'calendar1',
+ )
+ );
+
+ protected $caldavCalendarObjects = array(
+ 1 => array(
+ 'event.ics' => array(
+ 'calendardata' => 'BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:20120418T172519CEST-3510gh1hVw
+DTSTAMP:20120418T152519Z
+DTSTART;VALUE=DATE:20120330
+DTEND;VALUE=DATE:20120531
+EXDATE;TZID=Europe/Berlin:20120330T000000
+RRULE:FREQ=YEARLY;INTERVAL=1
+SEQUENCE:1
+SUMMARY:Birthday
+TRANSP:TRANSPARENT
+BEGIN:VALARM
+ACTION:EMAIL
+ATTENDEE:MAILTO:xxx@domain.de
+DESCRIPTION:Dies ist eine Kalender Erinnerung
+SUMMARY:Kalender Alarm Erinnerung
+TRIGGER;VALUE=DATE-TIME:20120329T060000Z
+END:VALARM
+END:VEVENT
+END:VCALENDAR
+',
+ ),
+ ),
+ );
+
+ function testIssue211() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'REPORT',
+ 'HTTP_CONTENT_TYPE' => 'application/xml',
+ 'REQUEST_URI' => '/calendars/user1/calendar1',
+ 'HTTP_DEPTH' => '1',
+ ));
+
+ $request->setBody('<?xml version="1.0" encoding="utf-8" ?>
+<C:calendar-query xmlns:D="DAV:" xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:prop>
+ <C:calendar-data/>
+ <D:getetag/>
+ </D:prop>
+ <C:filter>
+ <C:comp-filter name="VCALENDAR">
+ <C:comp-filter name="VEVENT">
+ <C:comp-filter name="VALARM">
+ <C:time-range start="20120426T220000Z" end="20120427T215959Z"/>
+ </C:comp-filter>
+ </C:comp-filter>
+ </C:comp-filter>
+ </C:filter>
+</C:calendar-query>');
+
+ $response = $this->request($request);
+
+ // if this assert is reached, the endless loop is gone
+ // There should be no matching events
+ $this->assertFalse(strpos('BEGIN:VEVENT', $response->body));
+
+ }
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/Issue220Test.php b/vendor/sabre/dav/tests/Sabre/CalDAV/Issue220Test.php
new file mode 100644
index 000000000..c701df544
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/Issue220Test.php
@@ -0,0 +1,100 @@
+<?php
+
+namespace Sabre\CalDAV;
+
+use Sabre\HTTP;
+
+/**
+ * This unittest is created to check for an endless loop in CalendarQueryValidator
+ *
+ *
+ * @copyright Copyright (C) 2007-2013 Rooftop Solutions. All rights reserved.
+ * @author Evert Pot (http://www.rooftopsolutions.nl/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Issue220Test extends \Sabre\DAVServerTest {
+
+ protected $setupCalDAV = true;
+
+ protected $caldavCalendars = array(
+ array(
+ 'id' => 1,
+ 'name' => 'Calendar',
+ 'principaluri' => 'principals/user1',
+ 'uri' => 'calendar1',
+ )
+ );
+
+ protected $caldavCalendarObjects = array(
+ 1 => array(
+ 'event.ics' => array(
+ 'calendardata' => 'BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+DTSTART;TZID=Europe/Berlin:20120601T180000
+SUMMARY:Brot backen
+RRULE:FREQ=DAILY;INTERVAL=1;WKST=MO
+TRANSP:OPAQUE
+DURATION:PT20M
+LAST-MODIFIED:20120601T064634Z
+CREATED:20120601T064634Z
+DTSTAMP:20120601T064634Z
+UID:b64f14c5-dccc-4eda-947f-bdb1f763fbcd
+BEGIN:VALARM
+TRIGGER;VALUE=DURATION:-PT5M
+ACTION:DISPLAY
+DESCRIPTION:Default Event Notification
+X-WR-ALARMUID:cd952c1b-b3d6-41fb-b0a6-ec3a1a5bdd58
+END:VALARM
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;TZID=Europe/Berlin:20120606T180000
+SUMMARY:Brot backen
+TRANSP:OPAQUE
+STATUS:CANCELLED
+DTEND;TZID=Europe/Berlin:20120606T182000
+LAST-MODIFIED:20120605T094310Z
+SEQUENCE:1
+RECURRENCE-ID:20120606T160000Z
+UID:b64f14c5-dccc-4eda-947f-bdb1f763fbcd
+END:VEVENT
+END:VCALENDAR
+',
+ ),
+ ),
+ );
+
+ function testIssue220() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'REPORT',
+ 'HTTP_CONTENT_TYPE' => 'application/xml',
+ 'REQUEST_URI' => '/calendars/user1/calendar1',
+ 'HTTP_DEPTH' => '1',
+ ));
+
+ $request->setBody('<?xml version="1.0" encoding="utf-8" ?>
+<C:calendar-query xmlns:D="DAV:" xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:prop>
+ <C:calendar-data/>
+ <D:getetag/>
+ </D:prop>
+ <C:filter>
+ <C:comp-filter name="VCALENDAR">
+ <C:comp-filter name="VEVENT">
+ <C:comp-filter name="VALARM">
+ <C:time-range start="20120607T161646Z" end="20120612T161646Z"/>
+ </C:comp-filter>
+ </C:comp-filter>
+ </C:comp-filter>
+ </C:filter>
+</C:calendar-query>');
+
+ $response = $this->request($request);
+
+ $this->assertFalse(strpos($response->body, '<s:exception>PHPUnit_Framework_Error_Warning</s:exception>'), 'Error Warning occurred: ' . $response->body);
+ $this->assertFalse(strpos($response->body, 'Invalid argument supplied for foreach()'), 'Invalid argument supplied for foreach(): ' . $response->body);
+
+ $this->assertEquals('HTTP/1.1 207 Multi-Status', $response->status);
+ }
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/Issue228Test.php b/vendor/sabre/dav/tests/Sabre/CalDAV/Issue228Test.php
new file mode 100644
index 000000000..e8b6dfaa6
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/Issue228Test.php
@@ -0,0 +1,78 @@
+<?php
+
+namespace Sabre\CalDAV;
+use Sabre\HTTP;
+
+/**
+ * This unittest is created to check if the time-range filter is working correctly with all-day-events
+ *
+ * @copyright Copyright (C) 2007-2013 Rooftop Solutions. All rights reserved.
+ * @author Evert Pot (http://www.rooftopsolutions.nl/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Issue228Test extends \Sabre\DAVServerTest {
+
+ protected $setupCalDAV = true;
+
+ protected $caldavCalendars = array(
+ array(
+ 'id' => 1,
+ 'name' => 'Calendar',
+ 'principaluri' => 'principals/user1',
+ 'uri' => 'calendar1',
+ )
+ );
+
+ protected $caldavCalendarObjects = array(
+ 1 => array(
+ 'event.ics' => array(
+ 'calendardata' => 'BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:20120730T113415CEST-6804EGphkd@xxxxxx.de
+DTSTAMP:20120730T093415Z
+DTSTART;VALUE=DATE:20120729
+DTEND;VALUE=DATE:20120730
+SUMMARY:sunday event
+TRANSP:TRANSPARENT
+END:VEVENT
+END:VCALENDAR
+',
+ ),
+ ),
+ );
+
+ function testIssue228() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'REPORT',
+ 'HTTP_CONTENT_TYPE' => 'application/xml',
+ 'REQUEST_URI' => '/calendars/user1/calendar1',
+ 'HTTP_DEPTH' => '1',
+ ));
+
+ $request->setBody('<?xml version="1.0" encoding="utf-8" ?>
+<C:calendar-query xmlns:D="DAV:" xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:prop>
+ <C:calendar-data>
+ <C:expand start="20120730T095609Z"
+ end="20120813T095609Z"/>
+</C:calendar-data>
+ <D:getetag/>
+ </D:prop>
+ <C:filter>
+ <C:comp-filter name="VCALENDAR">
+ <C:comp-filter name="VEVENT">
+ <C:time-range start="20120730T095609Z" end="20120813T095609Z"/>
+ </C:comp-filter>
+ </C:comp-filter>
+ </C:filter>
+</C:calendar-query>');
+
+ $response = $this->request($request);
+
+ // We must check if absolutely nothing was returned from this query.
+ $this->assertFalse(strpos($response->body, 'BEGIN:VCALENDAR'));
+
+ }
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/Notifications/CollectionTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/Notifications/CollectionTest.php
new file mode 100644
index 000000000..eaed4f503
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/Notifications/CollectionTest.php
@@ -0,0 +1,90 @@
+<?php
+
+namespace Sabre\CalDAV\Notifications;
+
+use Sabre\CalDAV;
+
+class CollectionTest extends \PHPUnit_Framework_TestCase {
+
+ protected $caldavBackend;
+ protected $principalUri;
+ protected $notification;
+
+ function getInstance() {
+
+ $this->principalUri = 'principals/user1';
+
+ $this->notification = new Notification\SystemStatus(1,'"1"');
+
+ $this->caldavBackend = new CalDAV\Backend\Mock(array(),array(), array(
+ 'principals/user1' => array(
+ $this->notification
+ )
+ ));
+
+ return new Collection($this->caldavBackend, $this->principalUri);
+
+ }
+
+ function testGetChildren() {
+
+ $col = $this->getInstance();
+ $this->assertEquals('notifications', $col->getName());
+
+ $this->assertEquals(array(
+ new Node($this->caldavBackend, $this->principalUri, $this->notification)
+ ), $col->getChildren());
+
+ }
+
+ function testGetOwner() {
+
+ $col = $this->getInstance();
+ $this->assertEquals('principals/user1', $col->getOwner());
+
+ }
+
+ function testGetGroup() {
+
+ $col = $this->getInstance();
+ $this->assertNull($col->getGroup());
+
+ }
+
+ function testGetACL() {
+
+ $col = $this->getInstance();
+ $expected = array(
+ array(
+ 'privilege' => '{DAV:}read',
+ 'principal' => $this->principalUri,
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}write',
+ 'principal' => $this->principalUri,
+ 'protected' => true,
+ ),
+ );
+
+ $this->assertEquals($expected, $col->getACL());
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\NotImplemented
+ */
+ function testSetACL() {
+
+ $col = $this->getInstance();
+ $col->setACL(array());
+
+ }
+
+ function testGetSupportedPrivilegeSet() {
+
+ $col = $this->getInstance();
+ $this->assertNull($col->getSupportedPrivilegeSet());
+
+ }
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/Notifications/NodeTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/Notifications/NodeTest.php
new file mode 100644
index 000000000..28e43ce08
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/Notifications/NodeTest.php
@@ -0,0 +1,101 @@
+<?php
+
+namespace Sabre\CalDAV\Notifications;
+
+use Sabre\CalDAV;
+
+class NodeTest extends \PHPUnit_Framework_TestCase {
+
+ protected $systemStatus;
+ protected $caldavBackend;
+
+ function getInstance() {
+
+ $principalUri = 'principals/user1';
+
+ $this->systemStatus = new Notification\SystemStatus(1,'"1"');
+
+ $this->caldavBackend = new CalDAV\Backend\Mock(array(),array(), array(
+ 'principals/user1' => array(
+ $this->systemStatus
+ )
+ ));
+
+ $node = new Node($this->caldavBackend, 'principals/user1', $this->systemStatus);
+ return $node;
+
+ }
+
+ function testGetId() {
+
+ $node = $this->getInstance();
+ $this->assertEquals($this->systemStatus->getId() . '.xml', $node->getName());
+
+ }
+
+ function testGetEtag() {
+
+ $node = $this->getInstance();
+ $this->assertEquals('"1"', $node->getETag());
+
+ }
+
+ function testGetNotificationType() {
+
+ $node = $this->getInstance();
+ $this->assertEquals($this->systemStatus, $node->getNotificationType());
+
+ }
+
+ function testDelete() {
+
+ $node = $this->getInstance();
+ $node->delete();
+ $this->assertEquals(array(), $this->caldavBackend->getNotificationsForPrincipal('principals/user1'));
+
+ }
+
+ function testGetGroup() {
+
+ $node = $this->getInstance();
+ $this->assertNull($node->getGroup());
+
+ }
+
+ function testGetACL() {
+
+ $node = $this->getInstance();
+ $expected = array(
+ array(
+ 'privilege' => '{DAV:}read',
+ 'principal' => 'principals/user1',
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}write',
+ 'principal' => 'principals/user1',
+ 'protected' => true,
+ ),
+ );
+
+ $this->assertEquals($expected, $node->getACL());
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\NotImplemented
+ */
+ function testSetACL() {
+
+ $node = $this->getInstance();
+ $node->setACL(array());
+
+ }
+
+ function testGetSupportedPrivilegeSet() {
+
+ $node = $this->getInstance();
+ $this->assertNull($node->getSupportedPrivilegeSet());
+
+ }
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/Notifications/Notification/InviteReplyTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/Notifications/Notification/InviteReplyTest.php
new file mode 100644
index 000000000..c53f68cee
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/Notifications/Notification/InviteReplyTest.php
@@ -0,0 +1,134 @@
+<?php
+
+namespace Sabre\CalDAV\Notifications\Notification;
+
+use Sabre\CalDAV;
+use Sabre\DAV;
+
+class InviteReplyTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * @dataProvider dataProvider
+ */
+ function testSerializers($notification, $expected) {
+
+ $notification = new InviteReply($notification);
+
+ $this->assertEquals('foo', $notification->getId());
+ $this->assertEquals('"1"', $notification->getETag());
+
+ $simpleExpected = '<?xml version="1.0" encoding="UTF-8"?>' . "\n" . '<cs:root xmlns:cs="http://calendarserver.org/ns/"><cs:invite-reply/></cs:root>' . "\n";
+
+ $dom = new \DOMDocument('1.0','UTF-8');
+ $elem = $dom->createElement('cs:root');
+ $elem->setAttribute('xmlns:cs',CalDAV\Plugin::NS_CALENDARSERVER);
+ $dom->appendChild($elem);
+ $notification->serialize(new DAV\Server(), $elem);
+ $this->assertEquals($simpleExpected, $dom->saveXML());
+
+ $dom = new \DOMDocument('1.0','UTF-8');
+ $dom->formatOutput = true;
+ $elem = $dom->createElement('cs:root');
+ $elem->setAttribute('xmlns:cs',CalDAV\Plugin::NS_CALENDARSERVER);
+ $elem->setAttribute('xmlns:d','DAV:');
+ $dom->appendChild($elem);
+ $notification->serializeBody(new DAV\Server(), $elem);
+ $this->assertEquals($expected, $dom->saveXML());
+
+
+ }
+
+ function dataProvider() {
+
+ $dtStamp = new \DateTime('2012-01-01 00:00:00 GMT');
+ return array(
+ array(
+ array(
+ 'id' => 'foo',
+ 'dtStamp' => $dtStamp,
+ 'etag' => '"1"',
+ 'inReplyTo' => 'bar',
+ 'href' => 'mailto:foo@example.org',
+ 'type' => CalDAV\SharingPlugin::STATUS_ACCEPTED,
+ 'hostUrl' => 'calendar'
+ ),
+<<<FOO
+<?xml version="1.0" encoding="UTF-8"?>
+<cs:root xmlns:cs="http://calendarserver.org/ns/" xmlns:d="DAV:">
+ <cs:dtstamp>20120101T000000Z</cs:dtstamp>
+ <cs:invite-reply>
+ <cs:uid>foo</cs:uid>
+ <cs:in-reply-to>bar</cs:in-reply-to>
+ <d:href>mailto:foo@example.org</d:href>
+ <cs:invite-accepted/>
+ <cs:hosturl>
+ <d:href>/calendar</d:href>
+ </cs:hosturl>
+ </cs:invite-reply>
+</cs:root>
+
+FOO
+ ),
+ array(
+ array(
+ 'id' => 'foo',
+ 'dtStamp' => $dtStamp,
+ 'etag' => '"1"',
+ 'inReplyTo' => 'bar',
+ 'href' => 'mailto:foo@example.org',
+ 'type' => CalDAV\SharingPlugin::STATUS_DECLINED,
+ 'hostUrl' => 'calendar',
+ 'summary' => 'Summary!'
+ ),
+<<<FOO
+<?xml version="1.0" encoding="UTF-8"?>
+<cs:root xmlns:cs="http://calendarserver.org/ns/" xmlns:d="DAV:">
+ <cs:dtstamp>20120101T000000Z</cs:dtstamp>
+ <cs:invite-reply>
+ <cs:uid>foo</cs:uid>
+ <cs:in-reply-to>bar</cs:in-reply-to>
+ <d:href>mailto:foo@example.org</d:href>
+ <cs:invite-declined/>
+ <cs:hosturl>
+ <d:href>/calendar</d:href>
+ </cs:hosturl>
+ <cs:summary>Summary!</cs:summary>
+ </cs:invite-reply>
+</cs:root>
+
+FOO
+ ),
+
+ );
+
+ }
+
+ /**
+ * @expectedException InvalidArgumentException
+ */
+ function testMissingArg() {
+
+ new InviteReply(array());
+
+ }
+
+ /**
+ * @expectedException InvalidArgumentException
+ */
+ function testUnknownArg() {
+
+ new InviteReply(array(
+ 'foo-i-will-break' => true,
+
+ 'id' => 1,
+ 'etag' => '"bla"',
+ 'href' => 'abc',
+ 'dtStamp' => 'def',
+ 'inReplyTo' => 'qrs',
+ 'type' => 'ghi',
+ 'hostUrl' => 'jkl',
+ ));
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/Notifications/Notification/InviteTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/Notifications/Notification/InviteTest.php
new file mode 100644
index 000000000..d2c114f4c
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/Notifications/Notification/InviteTest.php
@@ -0,0 +1,230 @@
+<?php
+
+namespace Sabre\CalDAV\Notifications\Notification;
+
+use Sabre\CalDAV;
+use Sabre\DAV;
+
+class InviteTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * @dataProvider dataProvider
+ */
+ function testSerializers($notification, $expected) {
+
+ $notification = new Invite($notification);
+
+ $this->assertEquals('foo', $notification->getId());
+ $this->assertEquals('"1"', $notification->getETag());
+
+ $simpleExpected = '<?xml version="1.0" encoding="UTF-8"?>' . "\n" . '<cs:root xmlns:cs="http://calendarserver.org/ns/"><cs:invite-notification/></cs:root>' . "\n";
+
+ $dom = new \DOMDocument('1.0','UTF-8');
+ $elem = $dom->createElement('cs:root');
+ $elem->setAttribute('xmlns:cs',CalDAV\Plugin::NS_CALENDARSERVER);
+ $dom->appendChild($elem);
+ $notification->serialize(new DAV\Server(), $elem);
+ $this->assertEquals($simpleExpected, $dom->saveXML());
+
+ $dom = new \DOMDocument('1.0','UTF-8');
+ $dom->formatOutput = true;
+ $elem = $dom->createElement('cs:root');
+ $elem->setAttribute('xmlns:cs',CalDAV\Plugin::NS_CALENDARSERVER);
+ $elem->setAttribute('xmlns:d','DAV:');
+ $elem->setAttribute('xmlns:cal',CalDAV\Plugin::NS_CALDAV);
+ $dom->appendChild($elem);
+ $notification->serializeBody(new DAV\Server(), $elem);
+ $this->assertEquals($expected, $dom->saveXML());
+
+
+ }
+
+ function dataProvider() {
+
+ $dtStamp = new \DateTime('2012-01-01 00:00:00', new \DateTimeZone('GMT'));
+ return array(
+ array(
+ array(
+ 'id' => 'foo',
+ 'dtStamp' => $dtStamp,
+ 'etag' => '"1"',
+ 'href' => 'mailto:foo@example.org',
+ 'type' => CalDAV\SharingPlugin::STATUS_ACCEPTED,
+ 'readOnly' => true,
+ 'hostUrl' => 'calendar',
+ 'organizer' => 'principal/user1',
+ 'commonName' => 'John Doe',
+ 'summary' => 'Awesome stuff!'
+ ),
+<<<FOO
+<?xml version="1.0" encoding="UTF-8"?>
+<cs:root xmlns:cs="http://calendarserver.org/ns/" xmlns:d="DAV:" xmlns:cal="urn:ietf:params:xml:ns:caldav">
+ <cs:dtstamp>20120101T000000Z</cs:dtstamp>
+ <cs:invite-notification>
+ <cs:uid>foo</cs:uid>
+ <d:href>mailto:foo@example.org</d:href>
+ <cs:invite-accepted/>
+ <cs:hosturl>
+ <d:href>/calendar</d:href>
+ </cs:hosturl>
+ <cs:access>
+ <cs:read/>
+ </cs:access>
+ <cs:organizer-cn>John Doe</cs:organizer-cn>
+ <cs:organizer>
+ <d:href>/principal/user1</d:href>
+ <cs:common-name>John Doe</cs:common-name>
+ </cs:organizer>
+ <cs:summary>Awesome stuff!</cs:summary>
+ </cs:invite-notification>
+</cs:root>
+
+FOO
+ ),
+ array(
+ array(
+ 'id' => 'foo',
+ 'dtStamp' => $dtStamp,
+ 'etag' => '"1"',
+ 'href' => 'mailto:foo@example.org',
+ 'type' => CalDAV\SharingPlugin::STATUS_DECLINED,
+ 'readOnly' => true,
+ 'hostUrl' => 'calendar',
+ 'organizer' => 'principal/user1',
+ 'commonName' => 'John Doe',
+ ),
+<<<FOO
+<?xml version="1.0" encoding="UTF-8"?>
+<cs:root xmlns:cs="http://calendarserver.org/ns/" xmlns:d="DAV:" xmlns:cal="urn:ietf:params:xml:ns:caldav">
+ <cs:dtstamp>20120101T000000Z</cs:dtstamp>
+ <cs:invite-notification>
+ <cs:uid>foo</cs:uid>
+ <d:href>mailto:foo@example.org</d:href>
+ <cs:invite-declined/>
+ <cs:hosturl>
+ <d:href>/calendar</d:href>
+ </cs:hosturl>
+ <cs:access>
+ <cs:read/>
+ </cs:access>
+ <cs:organizer-cn>John Doe</cs:organizer-cn>
+ <cs:organizer>
+ <d:href>/principal/user1</d:href>
+ <cs:common-name>John Doe</cs:common-name>
+ </cs:organizer>
+ </cs:invite-notification>
+</cs:root>
+
+FOO
+ ),
+ array(
+ array(
+ 'id' => 'foo',
+ 'dtStamp' => $dtStamp,
+ 'etag' => '"1"',
+ 'href' => 'mailto:foo@example.org',
+ 'type' => CalDAV\SharingPlugin::STATUS_NORESPONSE,
+ 'readOnly' => true,
+ 'hostUrl' => 'calendar',
+ 'organizer' => 'principal/user1',
+ 'firstName' => 'Foo',
+ 'lastName' => 'Bar',
+ ),
+<<<FOO
+<?xml version="1.0" encoding="UTF-8"?>
+<cs:root xmlns:cs="http://calendarserver.org/ns/" xmlns:d="DAV:" xmlns:cal="urn:ietf:params:xml:ns:caldav">
+ <cs:dtstamp>20120101T000000Z</cs:dtstamp>
+ <cs:invite-notification>
+ <cs:uid>foo</cs:uid>
+ <d:href>mailto:foo@example.org</d:href>
+ <cs:invite-noresponse/>
+ <cs:hosturl>
+ <d:href>/calendar</d:href>
+ </cs:hosturl>
+ <cs:access>
+ <cs:read/>
+ </cs:access>
+ <cs:organizer-first>Foo</cs:organizer-first>
+ <cs:organizer-last>Bar</cs:organizer-last>
+ <cs:organizer>
+ <d:href>/principal/user1</d:href>
+ <cs:first-name>Foo</cs:first-name>
+ <cs:last-name>Bar</cs:last-name>
+ </cs:organizer>
+ </cs:invite-notification>
+</cs:root>
+
+FOO
+ ),
+ array(
+ array(
+ 'id' => 'foo',
+ 'dtStamp' => $dtStamp,
+ 'etag' => '"1"',
+ 'href' => 'mailto:foo@example.org',
+ 'type' => CalDAV\SharingPlugin::STATUS_DELETED,
+ 'readOnly' => false,
+ 'hostUrl' => 'calendar',
+ 'organizer' => 'mailto:user1@fruux.com',
+ 'supportedComponents' => new CalDAV\Property\SupportedCalendarComponentSet(array('VEVENT','VTODO')),
+ ),
+<<<FOO
+<?xml version="1.0" encoding="UTF-8"?>
+<cs:root xmlns:cs="http://calendarserver.org/ns/" xmlns:d="DAV:" xmlns:cal="urn:ietf:params:xml:ns:caldav">
+ <cs:dtstamp>20120101T000000Z</cs:dtstamp>
+ <cs:invite-notification>
+ <cs:uid>foo</cs:uid>
+ <d:href>mailto:foo@example.org</d:href>
+ <cs:invite-deleted/>
+ <cs:hosturl>
+ <d:href>/calendar</d:href>
+ </cs:hosturl>
+ <cs:access>
+ <cs:read-write/>
+ </cs:access>
+ <cs:organizer>
+ <d:href>mailto:user1@fruux.com</d:href>
+ </cs:organizer>
+ <cal:supported-calendar-component-set>
+ <cal:comp name="VEVENT"/>
+ <cal:comp name="VTODO"/>
+ </cal:supported-calendar-component-set>
+ </cs:invite-notification>
+</cs:root>
+
+FOO
+ ),
+
+ );
+
+ }
+
+ /**
+ * @expectedException InvalidArgumentException
+ */
+ function testMissingArg() {
+
+ new Invite(array());
+
+ }
+
+ /**
+ * @expectedException InvalidArgumentException
+ */
+ function testUnknownArg() {
+
+ new Invite(array(
+ 'foo-i-will-break' => true,
+
+ 'id' => 1,
+ 'etag' => '"bla"',
+ 'href' => 'abc',
+ 'dtStamp' => 'def',
+ 'type' => 'ghi',
+ 'readOnly' => true,
+ 'hostUrl' => 'jkl',
+ 'organizer' => 'mno',
+ ));
+
+ }
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/Notifications/Notification/SystemStatusTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/Notifications/Notification/SystemStatusTest.php
new file mode 100644
index 000000000..8dc494932
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/Notifications/Notification/SystemStatusTest.php
@@ -0,0 +1,61 @@
+<?php
+
+namespace Sabre\CalDAV\Notifications\Notification;
+
+use Sabre\CalDAV;
+use Sabre\DAV;
+
+class SystemStatusTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * @dataProvider dataProvider
+ */
+ function testSerializers($notification, $expected1, $expected2) {
+
+ $this->assertEquals('foo', $notification->getId());
+ $this->assertEquals('"1"', $notification->getETag());
+
+
+ $dom = new \DOMDocument('1.0','UTF-8');
+ $elem = $dom->createElement('cs:root');
+ $elem->setAttribute('xmlns:cs',CalDAV\Plugin::NS_CALENDARSERVER);
+ $dom->appendChild($elem);
+ $notification->serialize(new DAV\Server(), $elem);
+ $this->assertEquals($expected1, $dom->saveXML());
+
+ $dom = new \DOMDocument('1.0','UTF-8');
+ $elem = $dom->createElement('cs:root');
+ $elem->setAttribute('xmlns:cs',CalDAV\Plugin::NS_CALENDARSERVER);
+ $dom->appendChild($elem);
+ $notification->serializeBody(new DAV\Server(), $elem);
+ $this->assertEquals($expected2, $dom->saveXML());
+
+
+ }
+
+ function dataProvider() {
+
+ return array(
+
+ array(
+ new SystemStatus('foo', '"1"'),
+ '<?xml version="1.0" encoding="UTF-8"?>' . "\n" . '<cs:root xmlns:cs="http://calendarserver.org/ns/"><cs:systemstatus type="high"/></cs:root>' . "\n",
+ '<?xml version="1.0" encoding="UTF-8"?>' . "\n" . '<cs:root xmlns:cs="http://calendarserver.org/ns/"><cs:systemstatus type="high"/></cs:root>' . "\n",
+ ),
+
+ array(
+ new SystemStatus('foo', '"1"', SystemStatus::TYPE_MEDIUM,'bar'),
+ '<?xml version="1.0" encoding="UTF-8"?>' . "\n" . '<cs:root xmlns:cs="http://calendarserver.org/ns/"><cs:systemstatus type="medium"/></cs:root>' . "\n",
+ '<?xml version="1.0" encoding="UTF-8"?>' . "\n" . '<cs:root xmlns:cs="http://calendarserver.org/ns/"><cs:systemstatus type="medium"><cs:description>bar</cs:description></cs:systemstatus></cs:root>' . "\n",
+ ),
+
+ array(
+ new SystemStatus('foo', '"1"', SystemStatus::TYPE_LOW,null,'http://example.org/'),
+ '<?xml version="1.0" encoding="UTF-8"?>' . "\n" . '<cs:root xmlns:cs="http://calendarserver.org/ns/"><cs:systemstatus type="low"/></cs:root>' . "\n",
+ '<?xml version="1.0" encoding="UTF-8"?>' . "\n" . '<cs:root xmlns:cs="http://calendarserver.org/ns/"><cs:systemstatus type="low"><d:href>http://example.org/</d:href></cs:systemstatus></cs:root>' . "\n",
+ )
+ );
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/OutboxPostTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/OutboxPostTest.php
new file mode 100644
index 000000000..5a5a4e75c
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/OutboxPostTest.php
@@ -0,0 +1,545 @@
+<?php
+
+namespace Sabre\CalDAV;
+use Sabre\HTTP;
+use Sabre\VObject;
+use Sabre\DAV;
+
+require_once 'Sabre/DAVServerTest.php';
+require_once 'Sabre/CalDAV/Schedule/IMip/Mock.php';
+
+class OutboxPostTest extends \Sabre\DAVServerTest {
+
+ protected $setupCalDAV = true;
+
+ function testPostPassThruNotFound() {
+
+ $req = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'POST',
+ 'REQUEST_URI' => '/notfound',
+ 'HTTP_CONTENT_TYPE' => 'text/calendar',
+ ));
+
+ $this->assertHTTPStatus(501, $req);
+
+ }
+
+ function testPostPassThruNotTextCalendar() {
+
+ $req = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'POST',
+ 'REQUEST_URI' => '/calendars/admin/outbox',
+ ));
+
+ $this->assertHTTPStatus(501, $req);
+
+ }
+
+ function testPostPassThruNoOutBox() {
+
+ $req = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'POST',
+ 'REQUEST_URI' => '/calendars',
+ 'HTTP_CONTENT_TYPE' => 'text/calendar',
+ ));
+
+ $this->assertHTTPStatus(501, $req);
+
+ }
+
+ function testNoOriginator() {
+
+ $req = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'POST',
+ 'REQUEST_URI' => '/calendars/admin/outbox',
+ 'HTTP_CONTENT_TYPE' => 'text/calendar',
+ ));
+ $body = array(
+ 'BEGIN:VCALENDAR',
+ 'METHOD:REQUEST',
+ 'BEGIN:VEVENT',
+ 'END:VEVENT',
+ 'END:VCALENDAR',
+ );
+ $req->setBody(implode("\r\n",$body));
+
+ $this->assertHTTPStatus(400, $req);
+
+ }
+
+ function testNoRecipient() {
+
+ $req = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'POST',
+ 'REQUEST_URI' => '/calendars/admin/outbox',
+ 'HTTP_ORIGINATOR' => 'mailto:orig@example.org',
+ 'HTTP_CONTENT_TYPE' => 'text/calendar',
+ ));
+ $body = array(
+ 'BEGIN:VCALENDAR',
+ 'METHOD:REQUEST',
+ 'BEGIN:VEVENT',
+ 'END:VEVENT',
+ 'END:VCALENDAR',
+ );
+ $req->setBody(implode("\r\n",$body));
+
+ $this->assertHTTPStatus(400, $req);
+
+ }
+
+ function testBadOriginator() {
+
+ $req = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'POST',
+ 'REQUEST_URI' => '/calendars/admin/outbox',
+ 'HTTP_ORIGINATOR' => 'nomailto:orig@example.org',
+ 'HTTP_RECIPIENT' => 'mailto:user1@example.org',
+ 'HTTP_CONTENT_TYPE' => 'text/calendar',
+ ));
+ $body = array(
+ 'BEGIN:VCALENDAR',
+ 'METHOD:REQUEST',
+ 'BEGIN:VEVENT',
+ 'END:VEVENT',
+ 'END:VCALENDAR',
+ );
+ $req->setBody(implode("\r\n",$body));
+
+ $this->assertHTTPStatus(403, $req);
+
+ }
+
+ function testBadRecipient() {
+
+ $req = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'POST',
+ 'REQUEST_URI' => '/calendars/admin/outbox',
+ 'HTTP_ORIGINATOR' => 'mailto:orig@example.org',
+ 'HTTP_RECIPIENT' => 'http://user1@example.org, mailto:user2@example.org',
+ 'HTTP_CONTENT_TYPE' => 'text/calendar',
+ ));
+ $body = array(
+ 'BEGIN:VCALENDAR',
+ 'METHOD:REQUEST',
+ 'BEGIN:VEVENT',
+ 'END:VEVENT',
+ 'END:VCALENDAR',
+ );
+ $req->setBody(implode("\r\n",$body));
+
+ $this->assertHTTPStatus(400, $req);
+
+ }
+
+ function testIncorrectOriginator() {
+
+ $req = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'POST',
+ 'REQUEST_URI' => '/calendars/admin/outbox',
+ 'HTTP_ORIGINATOR' => 'mailto:orig@example.org',
+ 'HTTP_RECIPIENT' => 'mailto:user1@example.org, mailto:user2@example.org',
+ 'HTTP_CONTENT_TYPE' => 'text/calendar',
+ ));
+ $body = array(
+ 'BEGIN:VCALENDAR',
+ 'METHOD:REQUEST',
+ 'BEGIN:VEVENT',
+ 'END:VEVENT',
+ 'END:VCALENDAR',
+ );
+ $req->setBody(implode("\r\n",$body));
+
+ $this->assertHTTPStatus(403, $req);
+
+ }
+
+ function testInvalidIcalBody() {
+
+ $req = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'POST',
+ 'REQUEST_URI' => '/calendars/user1/outbox',
+ 'HTTP_ORIGINATOR' => 'mailto:user1.sabredav@sabredav.org',
+ 'HTTP_RECIPIENT' => 'mailto:user2@example.org',
+ 'HTTP_CONTENT_TYPE' => 'text/calendar',
+ ));
+ $req->setBody('foo');
+
+ $this->assertHTTPStatus(400, $req);
+
+ }
+
+ function testNoVEVENT() {
+
+ $req = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'POST',
+ 'REQUEST_URI' => '/calendars/user1/outbox',
+ 'HTTP_ORIGINATOR' => 'mailto:user1.sabredav@sabredav.org',
+ 'HTTP_RECIPIENT' => 'mailto:user2@example.org',
+ 'HTTP_CONTENT_TYPE' => 'text/calendar',
+ ));
+
+ $body = array(
+ 'BEGIN:VCALENDAR',
+ 'BEGIN:VTIMEZONE',
+ 'END:VTIMEZONE',
+ 'END:VCALENDAR',
+ );
+
+ $req->setBody(implode("\r\n",$body));
+
+ $this->assertHTTPStatus(400, $req);
+
+ }
+
+ function testNoMETHOD() {
+
+ $req = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'POST',
+ 'REQUEST_URI' => '/calendars/user1/outbox',
+ 'HTTP_ORIGINATOR' => 'mailto:user1.sabredav@sabredav.org',
+ 'HTTP_RECIPIENT' => 'mailto:user2@example.org',
+ 'HTTP_CONTENT_TYPE' => 'text/calendar',
+ ));
+
+ $body = array(
+ 'BEGIN:VCALENDAR',
+ 'BEGIN:VEVENT',
+ 'END:VEVENT',
+ 'END:VCALENDAR',
+ );
+
+ $req->setBody(implode("\r\n",$body));
+
+ $this->assertHTTPStatus(400, $req);
+
+ }
+
+ function testUnsupportedMethod() {
+
+ $req = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'POST',
+ 'REQUEST_URI' => '/calendars/user1/outbox',
+ 'HTTP_ORIGINATOR' => 'mailto:user1.sabredav@sabredav.org',
+ 'HTTP_RECIPIENT' => 'mailto:user2@example.org',
+ 'HTTP_CONTENT_TYPE' => 'text/calendar',
+ ));
+
+ $body = array(
+ 'BEGIN:VCALENDAR',
+ 'METHOD:PUBLISH',
+ 'BEGIN:VEVENT',
+ 'END:VEVENT',
+ 'END:VCALENDAR',
+ );
+
+ $req->setBody(implode("\r\n",$body));
+
+ $this->assertHTTPStatus(501, $req);
+
+ }
+
+ function testNoIMIPHandler() {
+
+ $req = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'POST',
+ 'REQUEST_URI' => '/calendars/user1/outbox',
+ 'HTTP_ORIGINATOR' => 'mailto:user1.sabredav@sabredav.org',
+ 'HTTP_RECIPIENT' => 'mailto:user2@example.org',
+ 'HTTP_CONTENT_TYPE' => 'text/calendar',
+ ));
+
+ $body = array(
+ 'BEGIN:VCALENDAR',
+ 'METHOD:REQUEST',
+ 'BEGIN:VEVENT',
+ 'END:VEVENT',
+ 'END:VCALENDAR',
+ );
+
+ $req->setBody(implode("\r\n",$body));
+
+
+ $response = $this->request($req);
+ $this->assertEquals('HTTP/1.1 200 OK', $response->status);
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml',
+ ), $response->headers);
+
+ // Lazily checking the body for a few expected values.
+ $this->assertTrue(strpos($response->body, '5.2;')!==false);
+ $this->assertTrue(strpos($response->body,'user2@example.org')!==false);
+
+
+ }
+
+ function testSuccessRequest() {
+
+ $req = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'POST',
+ 'REQUEST_URI' => '/calendars/user1/outbox',
+ 'HTTP_ORIGINATOR' => 'mailto:user1.sabredav@sabredav.org',
+ 'HTTP_RECIPIENT' => 'mailto:user2@example.org',
+ 'HTTP_CONTENT_TYPE' => 'text/calendar',
+ ));
+
+ $body = array(
+ 'BEGIN:VCALENDAR',
+ 'METHOD:REQUEST',
+ 'BEGIN:VEVENT',
+ 'SUMMARY:An invitation',
+ 'END:VEVENT',
+ 'END:VCALENDAR',
+ );
+
+ $req->setBody(implode("\r\n",$body));
+
+ $handler = new Schedule\IMip\Mock('server@example.org');
+
+ $this->caldavPlugin->setIMIPhandler($handler);
+
+ $response = $this->request($req);
+ $this->assertEquals('HTTP/1.1 200 OK', $response->status);
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml',
+ ), $response->headers);
+
+ // Lazily checking the body for a few expected values.
+ $this->assertTrue(strpos($response->body, '2.0;')!==false);
+ $this->assertTrue(strpos($response->body,'user2@example.org')!==false);
+
+ $this->assertEquals(array(
+ array(
+ 'to' => 'user2@example.org',
+ 'subject' => 'Invitation for: An invitation',
+ 'body' => implode("\r\n", $body) . "\r\n",
+ 'headers' => array(
+ 'Reply-To: user1.sabredav@sabredav.org',
+ 'From: server@example.org',
+ 'Content-Type: text/calendar; method=REQUEST; charset=utf-8',
+ 'X-Sabre-Version: ' . DAV\Version::VERSION . '-' . DAV\Version::STABILITY,
+ ),
+ )
+ ), $handler->getSentEmails());
+
+ }
+
+ function testSuccessRequestUseRelativePrincipal() {
+
+ $req = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'POST',
+ 'REQUEST_URI' => '/calendars/user1/outbox',
+ 'HTTP_ORIGINATOR' => '/principals/user1/',
+ 'HTTP_RECIPIENT' => 'mailto:user2@example.org',
+ 'HTTP_CONTENT_TYPE' => 'text/calendar',
+ ));
+
+ $body = array(
+ 'BEGIN:VCALENDAR',
+ 'METHOD:REQUEST',
+ 'BEGIN:VEVENT',
+ 'SUMMARY:An invitation',
+ 'ORGANIZER:mailto:user1.sabredav@sabredav.org',
+ 'END:VEVENT',
+ 'END:VCALENDAR',
+ );
+
+ $req->setBody(implode("\r\n",$body));
+
+ $handler = new Schedule\IMip\Mock('server@example.org');
+
+ $this->caldavPlugin->setIMIPhandler($handler);
+
+ $response = $this->request($req);
+ $this->assertEquals('HTTP/1.1 200 OK', $response->status, 'Full body: ' . $response->body);
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml',
+ ), $response->headers);
+
+ // Lazily checking the body for a few expected values.
+ $this->assertTrue(strpos($response->body, '2.0;')!==false);
+ $this->assertTrue(strpos($response->body,'user2@example.org')!==false);
+
+ $this->assertEquals(array(
+ array(
+ 'to' => 'user2@example.org',
+ 'subject' => 'Invitation for: An invitation',
+ 'body' => implode("\r\n", $body) . "\r\n",
+ 'headers' => array(
+ 'Reply-To: user1.sabredav@sabredav.org',
+ 'From: server@example.org',
+ 'Content-Type: text/calendar; method=REQUEST; charset=utf-8',
+ 'X-Sabre-Version: ' . DAV\Version::VERSION . '-' . DAV\Version::STABILITY,
+ ),
+ )
+ ), $handler->getSentEmails());
+
+ }
+
+ function testSuccessRequestUpperCased() {
+
+ $req = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'POST',
+ 'REQUEST_URI' => '/calendars/user1/outbox',
+ 'HTTP_ORIGINATOR' => 'MAILTO:user1.sabredav@sabredav.org',
+ 'HTTP_RECIPIENT' => 'MAILTO:user2@example.org',
+ 'HTTP_CONTENT_TYPE' => 'text/calendar',
+ ));
+
+ $body = array(
+ 'BEGIN:VCALENDAR',
+ 'METHOD:REQUEST',
+ 'BEGIN:VEVENT',
+ 'SUMMARY:An invitation',
+ 'END:VEVENT',
+ 'END:VCALENDAR',
+ );
+
+ $req->setBody(implode("\r\n",$body));
+
+ $handler = new Schedule\IMip\Mock('server@example.org');
+
+ $this->caldavPlugin->setIMIPhandler($handler);
+
+ $response = $this->request($req);
+ $this->assertEquals('HTTP/1.1 200 OK', $response->status);
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml',
+ ), $response->headers);
+
+ // Lazily checking the body for a few expected values.
+ $this->assertTrue(strpos($response->body, '2.0;')!==false);
+ $this->assertTrue(strpos($response->body,'user2@example.org')!==false);
+
+ $this->assertEquals(array(
+ array(
+ 'to' => 'user2@example.org',
+ 'subject' => 'Invitation for: An invitation',
+ 'body' => implode("\r\n", $body) . "\r\n",
+ 'headers' => array(
+ 'Reply-To: user1.sabredav@sabredav.org',
+ 'From: server@example.org',
+ 'Content-Type: text/calendar; method=REQUEST; charset=utf-8',
+ 'X-Sabre-Version: ' . DAV\Version::VERSION . '-' . DAV\Version::STABILITY,
+ ),
+ )
+ ), $handler->getSentEmails());
+
+ }
+
+ function testSuccessReply() {
+
+ $req = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'POST',
+ 'REQUEST_URI' => '/calendars/user1/outbox',
+ 'HTTP_ORIGINATOR' => 'mailto:user1.sabredav@sabredav.org',
+ 'HTTP_RECIPIENT' => 'mailto:user2@example.org',
+ 'HTTP_CONTENT_TYPE' => 'text/calendar',
+ ));
+
+ $body = array(
+ 'BEGIN:VCALENDAR',
+ 'METHOD:REPLY',
+ 'BEGIN:VEVENT',
+ 'SUMMARY:An invitation',
+ 'END:VEVENT',
+ 'END:VCALENDAR',
+ );
+
+ $req->setBody(implode("\r\n",$body));
+
+ $handler = new Schedule\IMip\Mock('server@example.org');
+
+ $this->caldavPlugin->setIMIPhandler($handler);
+ $this->assertHTTPStatus(200, $req);
+
+ $this->assertEquals(array(
+ array(
+ 'to' => 'user2@example.org',
+ 'subject' => 'Response for: An invitation',
+ 'body' => implode("\r\n", $body) . "\r\n",
+ 'headers' => array(
+ 'Reply-To: user1.sabredav@sabredav.org',
+ 'From: server@example.org',
+ 'Content-Type: text/calendar; method=REPLY; charset=utf-8',
+ 'X-Sabre-Version: ' . DAV\Version::VERSION . '-' . DAV\Version::STABILITY,
+ ),
+ )
+ ), $handler->getSentEmails());
+
+ }
+
+ function testSuccessCancel() {
+
+ $req = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'POST',
+ 'REQUEST_URI' => '/calendars/user1/outbox',
+ 'HTTP_ORIGINATOR' => 'mailto:user1.sabredav@sabredav.org',
+ 'HTTP_RECIPIENT' => 'mailto:user2@example.org',
+ 'HTTP_CONTENT_TYPE' => 'text/calendar',
+ ));
+
+ $body = array(
+ 'BEGIN:VCALENDAR',
+ 'METHOD:CANCEL',
+ 'BEGIN:VEVENT',
+ 'SUMMARY:An invitation',
+ 'END:VEVENT',
+ 'END:VCALENDAR',
+ );
+
+ $req->setBody(implode("\r\n",$body));
+
+ $handler = new Schedule\IMip\Mock('server@example.org');
+
+ $this->caldavPlugin->setIMIPhandler($handler);
+ $this->assertHTTPStatus(200, $req);
+
+ $this->assertEquals(array(
+ array(
+ 'to' => 'user2@example.org',
+ 'subject' => 'Cancelled event: An invitation',
+ 'body' => implode("\r\n", $body) . "\r\n",
+ 'headers' => array(
+ 'Reply-To: user1.sabredav@sabredav.org',
+ 'From: server@example.org',
+ 'Content-Type: text/calendar; method=CANCEL; charset=utf-8',
+ 'X-Sabre-Version: ' . DAV\Version::VERSION . '-' . DAV\Version::STABILITY,
+ ),
+ )
+ ), $handler->getSentEmails());
+
+
+ }
+
+ function testUseRelativePrincipalNoFallback() {
+
+ $req = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'POST',
+ 'REQUEST_URI' => '/calendars/user1/outbox',
+ 'HTTP_ORIGINATOR' => '/principals/user1/',
+ 'HTTP_RECIPIENT' => 'mailto:user2@example.org',
+ 'HTTP_CONTENT_TYPE' => 'text/calendar',
+ ));
+
+ $body = array(
+ 'BEGIN:VCALENDAR',
+ 'METHOD:REQUEST',
+ 'BEGIN:VEVENT',
+ 'SUMMARY:An invitation',
+ 'ORGANIZER:rrrrrr',
+ 'END:VEVENT',
+ 'END:VCALENDAR',
+ );
+
+ $req->setBody(implode("\r\n",$body));
+
+ $handler = new Schedule\IMip\Mock('server@example.org');
+
+ $this->caldavPlugin->setIMIPhandler($handler);
+
+ $response = $this->request($req);
+ $this->assertEquals('HTTP/1.1 403 Forbidden', $response->status, 'Full body: ' . $response->body);
+
+ }
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/PluginTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/PluginTest.php
new file mode 100644
index 000000000..fb7dc316a
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/PluginTest.php
@@ -0,0 +1,1126 @@
+<?php
+
+namespace Sabre\CalDAV;
+use Sabre\DAVACL;
+use Sabre\DAV;
+use Sabre\HTTP;
+
+require_once 'Sabre/HTTP/ResponseMock.php';
+require_once 'Sabre/CalDAV/TestUtil.php';
+
+class PluginTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * @var Sabre\DAV\Server
+ */
+ protected $server;
+ /**
+ * @var Sabre\CalDAV\Plugin
+ */
+ protected $plugin;
+ protected $response;
+ /**
+ * @var Sabre\CalDAV\Backend\PDO
+ */
+ protected $caldavBackend;
+
+ function setup() {
+
+ $this->caldavBackend = new Backend\Mock(array(
+ array(
+ 'id' => 1,
+ 'uri' => 'UUID-123467',
+ 'principaluri' => 'principals/user1',
+ '{DAV:}displayname' => 'user1 calendar',
+ '{urn:ietf:params:xml:ns:caldav}calendar-description' => 'Calendar description',
+ '{http://apple.com/ns/ical/}calendar-order' => '1',
+ '{http://apple.com/ns/ical/}calendar-color' => '#FF0000',
+ '{urn:ietf:params:xml:ns:caldav}supported-calendar-component-set' => new Property\SupportedCalendarComponentSet(array('VEVENT','VTODO')),
+ ),
+ array(
+ 'id' => 2,
+ 'uri' => 'UUID-123468',
+ 'principaluri' => 'principals/user1',
+ '{DAV:}displayname' => 'user1 calendar2',
+ '{urn:ietf:params:xml:ns:caldav}calendar-description' => 'Calendar description',
+ '{http://apple.com/ns/ical/}calendar-order' => '1',
+ '{http://apple.com/ns/ical/}calendar-color' => '#FF0000',
+ '{urn:ietf:params:xml:ns:caldav}supported-calendar-component-set' => new Property\SupportedCalendarComponentSet(array('VEVENT','VTODO')),
+ )
+ ), array(
+ 1 => array(
+ 'UUID-2345' => array(
+ 'calendardata' => TestUtil::getTestCalendarData(),
+ )
+ )
+ ));
+ $principalBackend = new DAVACL\PrincipalBackend\Mock();
+ $principalBackend->setGroupMemberSet('principals/admin/calendar-proxy-read',array('principals/user1'));
+ $principalBackend->setGroupMemberSet('principals/admin/calendar-proxy-write',array('principals/user1'));
+ $principalBackend->addPrincipal(array(
+ 'uri' => 'principals/admin/calendar-proxy-read',
+ ));
+ $principalBackend->addPrincipal(array(
+ 'uri' => 'principals/admin/calendar-proxy-write',
+ ));
+
+ $calendars = new CalendarRootNode($principalBackend,$this->caldavBackend);
+ $principals = new Principal\Collection($principalBackend);
+
+ $root = new DAV\SimpleCollection('root');
+ $root->addChild($calendars);
+ $root->addChild($principals);
+
+ $objectTree = new DAV\ObjectTree($root);
+ $this->server = new DAV\Server($objectTree);
+ $this->server->debugExceptions = true;
+ $this->server->setBaseUri('/');
+ $this->plugin = new Plugin();
+ $this->server->addPlugin($this->plugin);
+
+ // Adding ACL plugin
+ $this->server->addPlugin(new DAVACL\Plugin());
+
+ // Adding Auth plugin, and ensuring that we are logged in.
+ $authBackend = new DAV\Auth\Backend\Mock();
+ $authBackend->defaultUser = 'user1';
+ $authPlugin = new DAV\Auth\Plugin($authBackend, 'SabreDAV');
+ $this->server->addPlugin($authPlugin);
+
+ $authPlugin->beforeMethod('GET', '/');
+
+ $this->response = new HTTP\ResponseMock();
+ $this->server->httpResponse = $this->response;
+
+ }
+
+ function testSimple() {
+
+ $this->assertEquals(array('MKCALENDAR'), $this->plugin->getHTTPMethods('calendars/user1/randomnewcalendar'));
+ $this->assertEquals(array('calendar-access','calendar-proxy'), $this->plugin->getFeatures());
+ $this->assertArrayHasKey('urn:ietf:params:xml:ns:caldav', $this->server->xmlNamespaces);
+
+ }
+
+ function testUnknownMethodPassThrough() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'MKBREAKFAST',
+ 'REQUEST_URI' => '/',
+ ));
+
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 501 Not Implemented', $this->response->status,'Incorrect status returned. Full response body:' . $this->response->body);
+
+ }
+
+ function testReportPassThrough() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'REPORT',
+ 'HTTP_CONTENT_TYPE' => 'application/xml',
+ 'REQUEST_URI' => '/',
+ ));
+ $request->setBody('<?xml version="1.0"?><s:somereport xmlns:s="http://www.rooftopsolutions.nl/NS/example" />');
+
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 403 Forbidden', $this->response->status);
+
+ }
+
+ function testMkCalendarBadLocation() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'MKCALENDAR',
+ 'REQUEST_URI' => '/blabla',
+ ));
+
+ $body = '<?xml version="1.0" encoding="utf-8" ?>
+ <C:mkcalendar xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:set>
+ <D:prop>
+ <D:displayname>Lisa\'s Events</D:displayname>
+ <C:calendar-description xml:lang="en"
+ >Calendar restricted to events.</C:calendar-description>
+ <C:supported-calendar-component-set>
+ <C:comp name="VEVENT"/>
+ </C:supported-calendar-component-set>
+ <C:calendar-timezone><![CDATA[BEGIN:VCALENDAR
+ PRODID:-//Example Corp.//CalDAV Client//EN
+ VERSION:2.0
+ BEGIN:VTIMEZONE
+ TZID:US-Eastern
+ LAST-MODIFIED:19870101T000000Z
+ BEGIN:STANDARD
+ DTSTART:19671029T020000
+ RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+ TZOFFSETFROM:-0400
+ TZOFFSETTO:-0500
+ TZNAME:Eastern Standard Time (US & Canada)
+ END:STANDARD
+ BEGIN:DAYLIGHT
+ DTSTART:19870405T020000
+ RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+ TZOFFSETFROM:-0500
+ TZOFFSETTO:-0400
+ TZNAME:Eastern Daylight Time (US & Canada)
+ END:DAYLIGHT
+ END:VTIMEZONE
+ END:VCALENDAR
+ ]]></C:calendar-timezone>
+ </D:prop>
+ </D:set>
+ </C:mkcalendar>';
+
+ $request->setBody($body);
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 403 Forbidden', $this->response->status);
+
+ }
+
+ function testMkCalendarNoParentNode() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'MKCALENDAR',
+ 'REQUEST_URI' => '/doesntexist/calendar',
+ ));
+
+ $body = '<?xml version="1.0" encoding="utf-8" ?>
+ <C:mkcalendar xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:set>
+ <D:prop>
+ <D:displayname>Lisa\'s Events</D:displayname>
+ <C:calendar-description xml:lang="en"
+ >Calendar restricted to events.</C:calendar-description>
+ <C:supported-calendar-component-set>
+ <C:comp name="VEVENT"/>
+ </C:supported-calendar-component-set>
+ <C:calendar-timezone><![CDATA[BEGIN:VCALENDAR
+ PRODID:-//Example Corp.//CalDAV Client//EN
+ VERSION:2.0
+ BEGIN:VTIMEZONE
+ TZID:US-Eastern
+ LAST-MODIFIED:19870101T000000Z
+ BEGIN:STANDARD
+ DTSTART:19671029T020000
+ RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+ TZOFFSETFROM:-0400
+ TZOFFSETTO:-0500
+ TZNAME:Eastern Standard Time (US & Canada)
+ END:STANDARD
+ BEGIN:DAYLIGHT
+ DTSTART:19870405T020000
+ RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+ TZOFFSETFROM:-0500
+ TZOFFSETTO:-0400
+ TZNAME:Eastern Daylight Time (US & Canada)
+ END:DAYLIGHT
+ END:VTIMEZONE
+ END:VCALENDAR
+ ]]></C:calendar-timezone>
+ </D:prop>
+ </D:set>
+ </C:mkcalendar>';
+
+ $request->setBody($body);
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 409 Conflict', $this->response->status);
+
+ }
+
+ function testMkCalendarExistingCalendar() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'MKCALENDAR',
+ 'REQUEST_URI' => '/calendars/user1/UUID-123467',
+ ));
+
+ $body = '<?xml version="1.0" encoding="utf-8" ?>
+ <C:mkcalendar xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:set>
+ <D:prop>
+ <D:displayname>Lisa\'s Events</D:displayname>
+ <C:calendar-description xml:lang="en"
+ >Calendar restricted to events.</C:calendar-description>
+ <C:supported-calendar-component-set>
+ <C:comp name="VEVENT"/>
+ </C:supported-calendar-component-set>
+ <C:calendar-timezone><![CDATA[BEGIN:VCALENDAR
+ PRODID:-//Example Corp.//CalDAV Client//EN
+ VERSION:2.0
+ BEGIN:VTIMEZONE
+ TZID:US-Eastern
+ LAST-MODIFIED:19870101T000000Z
+ BEGIN:STANDARD
+ DTSTART:19671029T020000
+ RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+ TZOFFSETFROM:-0400
+ TZOFFSETTO:-0500
+ TZNAME:Eastern Standard Time (US & Canada)
+ END:STANDARD
+ BEGIN:DAYLIGHT
+ DTSTART:19870405T020000
+ RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+ TZOFFSETFROM:-0500
+ TZOFFSETTO:-0400
+ TZNAME:Eastern Daylight Time (US & Canada)
+ END:DAYLIGHT
+ END:VTIMEZONE
+ END:VCALENDAR
+ ]]></C:calendar-timezone>
+ </D:prop>
+ </D:set>
+ </C:mkcalendar>';
+
+ $request->setBody($body);
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 405 Method Not Allowed', $this->response->status);
+
+ }
+
+ function testMkCalendarSucceed() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'MKCALENDAR',
+ 'REQUEST_URI' => '/calendars/user1/NEWCALENDAR',
+ ));
+
+ $timezone = 'BEGIN:VCALENDAR
+PRODID:-//Example Corp.//CalDAV Client//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:US-Eastern
+LAST-MODIFIED:19870101T000000Z
+BEGIN:STANDARD
+DTSTART:19671029T020000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:Eastern Standard Time (US & Canada)
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:19870405T020000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:Eastern Daylight Time (US & Canada)
+END:DAYLIGHT
+END:VTIMEZONE
+END:VCALENDAR';
+
+ $body = '<?xml version="1.0" encoding="utf-8" ?>
+ <C:mkcalendar xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:set>
+ <D:prop>
+ <D:displayname>Lisa\'s Events</D:displayname>
+ <C:calendar-description xml:lang="en"
+ >Calendar restricted to events.</C:calendar-description>
+ <C:supported-calendar-component-set>
+ <C:comp name="VEVENT"/>
+ </C:supported-calendar-component-set>
+ <C:calendar-timezone><![CDATA[' . $timezone . ']]></C:calendar-timezone>
+ </D:prop>
+ </D:set>
+ </C:mkcalendar>';
+
+ $request->setBody($body);
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 201 Created', $this->response->status,'Invalid response code received. Full response body: ' .$this->response->body);
+
+ $calendars = $this->caldavBackend->getCalendarsForUser('principals/user1');
+ $this->assertEquals(3, count($calendars));
+
+ $newCalendar = null;
+ foreach($calendars as $calendar) {
+ if ($calendar['uri'] === 'NEWCALENDAR') {
+ $newCalendar = $calendar;
+ break;
+ }
+ }
+
+ $this->assertInternalType('array',$newCalendar);
+
+ $keys = array(
+ 'uri' => 'NEWCALENDAR',
+ 'id' => null,
+ '{urn:ietf:params:xml:ns:caldav}calendar-description' => 'Calendar restricted to events.',
+ '{urn:ietf:params:xml:ns:caldav}calendar-timezone' => $timezone,
+ '{DAV:}displayname' => 'Lisa\'s Events',
+ '{urn:ietf:params:xml:ns:caldav}supported-calendar-component-set' => null,
+ );
+
+ foreach($keys as $key=>$value) {
+
+ $this->assertArrayHasKey($key, $newCalendar);
+
+ if (is_null($value)) continue;
+ $this->assertEquals($value, $newCalendar[$key]);
+
+ }
+ $sccs = '{urn:ietf:params:xml:ns:caldav}supported-calendar-component-set';
+ $this->assertTrue($newCalendar[$sccs] instanceof Property\SupportedCalendarComponentSet);
+ $this->assertEquals(array('VEVENT'),$newCalendar[$sccs]->getValue());
+
+ }
+
+ function testMkCalendarEmptyBodySucceed() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'MKCALENDAR',
+ 'REQUEST_URI' => '/calendars/user1/NEWCALENDAR',
+ ));
+
+ $request->setBody('');
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 201 Created', $this->response->status,'Invalid response code received. Full response body: ' .$this->response->body);
+
+ $calendars = $this->caldavBackend->getCalendarsForUser('principals/user1');
+ $this->assertEquals(3, count($calendars));
+
+ $newCalendar = null;
+ foreach($calendars as $calendar) {
+ if ($calendar['uri'] === 'NEWCALENDAR') {
+ $newCalendar = $calendar;
+ break;
+ }
+ }
+
+ $this->assertInternalType('array',$newCalendar);
+
+ $keys = array(
+ 'uri' => 'NEWCALENDAR',
+ 'id' => null,
+ '{urn:ietf:params:xml:ns:caldav}supported-calendar-component-set' => null,
+ );
+
+ foreach($keys as $key=>$value) {
+
+ $this->assertArrayHasKey($key, $newCalendar);
+
+ if (is_null($value)) continue;
+ $this->assertEquals($value, $newCalendar[$key]);
+
+ }
+ $sccs = '{urn:ietf:params:xml:ns:caldav}supported-calendar-component-set';
+ $this->assertTrue($newCalendar[$sccs] instanceof Property\SupportedCalendarComponentSet);
+ $this->assertEquals(array('VEVENT','VTODO'),$newCalendar[$sccs]->getValue());
+
+ }
+
+ function testPrincipalProperties() {
+
+ $httpRequest = new HTTP\Request(array(
+ 'HTTP_HOST' => 'sabredav.org',
+ ));
+ $this->server->httpRequest = $httpRequest;
+
+ $props = $this->server->getPropertiesForPath('/principals/user1',array(
+ '{urn:ietf:params:xml:ns:caldav}calendar-home-set',
+ '{urn:ietf:params:xml:ns:caldav}schedule-outbox-URL',
+ '{urn:ietf:params:xml:ns:caldav}calendar-user-address-set',
+ '{' . Plugin::NS_CALENDARSERVER . '}calendar-proxy-read-for',
+ '{' . Plugin::NS_CALENDARSERVER . '}calendar-proxy-write-for',
+ '{' . Plugin::NS_CALENDARSERVER . '}notification-URL',
+ ));
+
+ $this->assertArrayHasKey(0,$props);
+ $this->assertArrayHasKey(200,$props[0]);
+
+
+ $this->assertArrayHasKey('{urn:ietf:params:xml:ns:caldav}calendar-home-set',$props[0][200]);
+ $prop = $props[0][200]['{urn:ietf:params:xml:ns:caldav}calendar-home-set'];
+ $this->assertTrue($prop instanceof DAV\Property\Href);
+ $this->assertEquals('calendars/user1/',$prop->getHref());
+
+ $this->assertArrayHasKey('{urn:ietf:params:xml:ns:caldav}schedule-outbox-URL',$props[0][200]);
+ $prop = $props[0][200]['{urn:ietf:params:xml:ns:caldav}schedule-outbox-URL'];
+ $this->assertTrue($prop instanceof DAV\Property\Href);
+ $this->assertEquals('calendars/user1/outbox',$prop->getHref());
+
+ $this->assertArrayHasKey('{'.Plugin::NS_CALENDARSERVER .'}notification-URL',$props[0][200]);
+ $prop = $props[0][200]['{'.Plugin::NS_CALENDARSERVER .'}notification-URL'];
+ $this->assertTrue($prop instanceof DAV\Property\Href);
+ $this->assertEquals('calendars/user1/notifications/',$prop->getHref());
+
+
+ $this->assertArrayHasKey('{urn:ietf:params:xml:ns:caldav}calendar-user-address-set',$props[0][200]);
+ $prop = $props[0][200]['{urn:ietf:params:xml:ns:caldav}calendar-user-address-set'];
+ $this->assertTrue($prop instanceof DAV\Property\HrefList);
+ $this->assertEquals(array('mailto:user1.sabredav@sabredav.org','/principals/user1/'),$prop->getHrefs());
+
+ $this->assertArrayHasKey('{http://calendarserver.org/ns/}calendar-proxy-read-for', $props[0][200]);
+ $prop = $props[0][200]['{http://calendarserver.org/ns/}calendar-proxy-read-for'];
+ $this->assertInstanceOf('Sabre\\DAV\\Property\\HrefList', $prop);
+ $this->assertEquals(array('principals/admin'), $prop->getHrefs());
+
+ $this->assertArrayHasKey('{http://calendarserver.org/ns/}calendar-proxy-write-for', $props[0][200]);
+ $prop = $props[0][200]['{http://calendarserver.org/ns/}calendar-proxy-write-for'];
+ $this->assertInstanceOf('Sabre\\DAV\\Property\\HrefList', $prop);
+ $this->assertEquals(array('principals/admin'), $prop->getHrefs());
+
+
+ }
+
+ function testSupportedReportSetPropertyNonCalendar() {
+
+ $props = $this->server->getPropertiesForPath('/calendars/user1',array(
+ '{DAV:}supported-report-set',
+ ));
+
+ $this->assertArrayHasKey(0,$props);
+ $this->assertArrayHasKey(200,$props[0]);
+ $this->assertArrayHasKey('{DAV:}supported-report-set',$props[0][200]);
+
+ $prop = $props[0][200]['{DAV:}supported-report-set'];
+
+ $this->assertInstanceOf('\\Sabre\\DAV\\Property\\SupportedReportSet', $prop);
+ $value = array(
+ '{DAV:}expand-property',
+ '{DAV:}principal-property-search',
+ '{DAV:}principal-search-property-set'
+ );
+ $this->assertEquals($value,$prop->getValue());
+
+ }
+
+ /**
+ * @depends testSupportedReportSetPropertyNonCalendar
+ */
+ function testSupportedReportSetProperty() {
+
+ $props = $this->server->getPropertiesForPath('/calendars/user1/UUID-123467',array(
+ '{DAV:}supported-report-set',
+ ));
+
+ $this->assertArrayHasKey(0,$props);
+ $this->assertArrayHasKey(200,$props[0]);
+ $this->assertArrayHasKey('{DAV:}supported-report-set',$props[0][200]);
+
+ $prop = $props[0][200]['{DAV:}supported-report-set'];
+
+ $this->assertTrue($prop instanceof \Sabre\DAV\Property\SupportedReportSet);
+ $value = array(
+ '{urn:ietf:params:xml:ns:caldav}calendar-multiget',
+ '{urn:ietf:params:xml:ns:caldav}calendar-query',
+ '{urn:ietf:params:xml:ns:caldav}free-busy-query',
+ '{DAV:}expand-property',
+ '{DAV:}principal-property-search',
+ '{DAV:}principal-search-property-set'
+ );
+ $this->assertEquals($value,$prop->getValue());
+
+ }
+
+ /**
+ * @depends testSupportedReportSetProperty
+ */
+ function testCalendarMultiGetReport() {
+
+ $body =
+ '<?xml version="1.0"?>' .
+ '<c:calendar-multiget xmlns:c="urn:ietf:params:xml:ns:caldav" xmlns:d="DAV:">' .
+ '<d:prop>' .
+ ' <c:calendar-data />' .
+ ' <d:getetag />' .
+ '</d:prop>' .
+ '<d:href>/calendars/user1/UUID-123467/UUID-2345</d:href>' .
+ '</c:calendar-multiget>';
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'REPORT',
+ 'REQUEST_URI' => '/calendars/user1',
+ 'HTTP_DEPTH' => '1',
+ ));
+ $request->setBody($body);
+
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 207 Multi-Status',$this->response->status,'Invalid HTTP status received. Full response body: ' . $this->response->body);
+
+ $xml = simplexml_load_string(DAV\XMLUtil::convertDAVNamespace($this->response->body));
+
+ $xml->registerXPathNamespace('d','urn:DAV');
+ $xml->registerXPathNamespace('c','urn:ietf:params:xml:ns:caldav');
+
+ $check = array(
+ '/d:multistatus',
+ '/d:multistatus/d:response',
+ '/d:multistatus/d:response/d:href',
+ '/d:multistatus/d:response/d:propstat',
+ '/d:multistatus/d:response/d:propstat/d:prop',
+ '/d:multistatus/d:response/d:propstat/d:prop/d:getetag',
+ '/d:multistatus/d:response/d:propstat/d:prop/c:calendar-data',
+ '/d:multistatus/d:response/d:propstat/d:status' => 'HTTP/1.1 200 OK',
+ );
+
+ foreach($check as $v1=>$v2) {
+
+ $xpath = is_int($v1)?$v2:$v1;
+
+ $result = $xml->xpath($xpath);
+ $this->assertEquals(1,count($result));
+
+ if (!is_int($v1)) $this->assertEquals($v2,(string)$result[0]);
+
+ }
+
+ // The response object should have a reference to the Asia/Seoul
+ // timezone.
+ $this->assertTrue(strpos($this->response->body,'Asia/Seoul')!==false);
+
+ }
+
+ /**
+ * @depends testCalendarMultiGetReport
+ */
+ function testCalendarMultiGetReportExpand() {
+
+ $body =
+ '<?xml version="1.0"?>' .
+ '<c:calendar-multiget xmlns:c="urn:ietf:params:xml:ns:caldav" xmlns:d="DAV:">' .
+ '<d:prop>' .
+ ' <c:calendar-data>' .
+ ' <c:expand start="20110101T000000Z" end="20111231T235959Z" />' .
+ ' </c:calendar-data>' .
+ ' <d:getetag />' .
+ '</d:prop>' .
+ '<d:href>/calendars/user1/UUID-123467/UUID-2345</d:href>' .
+ '</c:calendar-multiget>';
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'REPORT',
+ 'REQUEST_URI' => '/calendars/user1',
+ 'HTTP_DEPTH' => '1',
+ ));
+ $request->setBody($body);
+
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 207 Multi-Status',$this->response->status,'Invalid HTTP status received. Full response body: ' . $this->response->body);
+
+ $xml = simplexml_load_string(DAV\XMLUtil::convertDAVNamespace($this->response->body));
+
+ $xml->registerXPathNamespace('d','urn:DAV');
+ $xml->registerXPathNamespace('c','urn:ietf:params:xml:ns:caldav');
+
+ $check = array(
+ '/d:multistatus',
+ '/d:multistatus/d:response',
+ '/d:multistatus/d:response/d:href',
+ '/d:multistatus/d:response/d:propstat',
+ '/d:multistatus/d:response/d:propstat/d:prop',
+ '/d:multistatus/d:response/d:propstat/d:prop/d:getetag',
+ '/d:multistatus/d:response/d:propstat/d:prop/c:calendar-data',
+ '/d:multistatus/d:response/d:propstat/d:status' => 'HTTP/1.1 200 OK',
+ );
+
+ foreach($check as $v1=>$v2) {
+
+ $xpath = is_int($v1)?$v2:$v1;
+
+ $result = $xml->xpath($xpath);
+ $this->assertEquals(1,count($result));
+
+ if (!is_int($v1)) $this->assertEquals($v2,(string)$result[0]);
+
+ }
+ // The response object should no longer hold references to timezones.
+ $this->assertTrue(strpos($this->response->body,'Asia/Seoul')===false);
+
+ }
+
+ /**
+ * @depends testSupportedReportSetProperty
+ * @depends testCalendarMultiGetReport
+ */
+ function testCalendarQueryReport() {
+
+ $body =
+ '<?xml version="1.0"?>' .
+ '<c:calendar-query xmlns:c="urn:ietf:params:xml:ns:caldav" xmlns:d="DAV:">' .
+ '<d:prop>' .
+ ' <c:calendar-data>' .
+ ' <c:expand start="20000101T000000Z" end="20101231T235959Z" />' .
+ ' </c:calendar-data>' .
+ ' <d:getetag />' .
+ '</d:prop>' .
+ '<c:filter>' .
+ ' <c:comp-filter name="VCALENDAR">' .
+ ' <c:comp-filter name="VEVENT" />' .
+ ' </c:comp-filter>' .
+ '</c:filter>' .
+ '</c:calendar-query>';
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'REPORT',
+ 'REQUEST_URI' => '/calendars/user1/UUID-123467',
+ 'HTTP_DEPTH' => '1',
+ ));
+ $request->setBody($body);
+
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 207 Multi-Status',$this->response->status,'Received an unexpected status. Full response body: ' . $this->response->body);
+
+ $xml = simplexml_load_string(DAV\XMLUtil::convertDAVNamespace($this->response->body));
+
+ $xml->registerXPathNamespace('d','urn:DAV');
+ $xml->registerXPathNamespace('c','urn:ietf:params:xml:ns:caldav');
+
+ $check = array(
+ '/d:multistatus',
+ '/d:multistatus/d:response',
+ '/d:multistatus/d:response/d:href',
+ '/d:multistatus/d:response/d:propstat',
+ '/d:multistatus/d:response/d:propstat/d:prop',
+ '/d:multistatus/d:response/d:propstat/d:prop/d:getetag',
+ '/d:multistatus/d:response/d:propstat/d:prop/c:calendar-data',
+ '/d:multistatus/d:response/d:propstat/d:status' => 'HTTP/1.1 200 OK',
+ );
+
+ foreach($check as $v1=>$v2) {
+
+ $xpath = is_int($v1)?$v2:$v1;
+
+ $result = $xml->xpath($xpath);
+ $this->assertEquals(1,count($result), 'We expected 1 ' . $xpath . ' elements. We\'ve found ' . count($result) . '. Full result: ' . $this->response->body);
+
+ if (!is_int($v1)) $this->assertEquals($v2,(string)$result[0]);
+
+ }
+
+ }
+
+ /**
+ * @depends testCalendarQueryReport
+ */
+ function testCalendarQueryReportNoCalData() {
+
+ $body =
+ '<?xml version="1.0"?>' .
+ '<c:calendar-query xmlns:c="urn:ietf:params:xml:ns:caldav" xmlns:d="DAV:">' .
+ '<d:prop>' .
+ ' <d:getetag />' .
+ '</d:prop>' .
+ '<c:filter>' .
+ ' <c:comp-filter name="VCALENDAR">' .
+ ' <c:comp-filter name="VEVENT" />' .
+ ' </c:comp-filter>' .
+ '</c:filter>' .
+ '</c:calendar-query>';
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'REPORT',
+ 'REQUEST_URI' => '/calendars/user1//UUID-123467',
+ 'HTTP_DEPTH' => '1',
+ ));
+ $request->setBody($body);
+
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 207 Multi-Status',$this->response->status,'Received an unexpected status. Full response body: ' . $this->response->body);
+
+ $xml = simplexml_load_string(DAV\XMLUtil::convertDAVNamespace($this->response->body));
+
+ $xml->registerXPathNamespace('d','urn:DAV');
+ $xml->registerXPathNamespace('c','urn:ietf:params:xml:ns:caldav');
+
+ $check = array(
+ '/d:multistatus',
+ '/d:multistatus/d:response',
+ '/d:multistatus/d:response/d:href',
+ '/d:multistatus/d:response/d:propstat',
+ '/d:multistatus/d:response/d:propstat/d:prop',
+ '/d:multistatus/d:response/d:propstat/d:prop/d:getetag',
+ '/d:multistatus/d:response/d:propstat/d:status' => 'HTTP/1.1 200 OK',
+ );
+
+ foreach($check as $v1=>$v2) {
+
+ $xpath = is_int($v1)?$v2:$v1;
+
+ $result = $xml->xpath($xpath);
+ $this->assertEquals(1,count($result), 'We expected 1 ' . $xpath . ' elements. We\'ve found ' . count($result) . '. Full result: ' . $this->response->body);
+
+ if (!is_int($v1)) $this->assertEquals($v2,(string)$result[0]);
+
+ }
+
+ }
+
+ /**
+ * @depends testCalendarQueryReport
+ */
+ function testCalendarQueryReportNoFilters() {
+
+ $body =
+ '<?xml version="1.0"?>' .
+ '<c:calendar-query xmlns:c="urn:ietf:params:xml:ns:caldav" xmlns:d="DAV:">' .
+ '<d:prop>' .
+ ' <c:calendar-data />' .
+ ' <d:getetag />' .
+ '</d:prop>' .
+ '</c:calendar-query>';
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'REPORT',
+ 'REQUEST_URI' => '/calendars/user1//UUID-123467',
+ ));
+ $request->setBody($body);
+
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 400 Bad request',$this->response->status,'Received an unexpected status. Full response body: ' . $this->response->body);
+
+ }
+
+ /**
+ * @depends testSupportedReportSetProperty
+ * @depends testCalendarMultiGetReport
+ */
+ function testCalendarQueryReport1Object() {
+
+ $body =
+ '<?xml version="1.0"?>' .
+ '<c:calendar-query xmlns:c="urn:ietf:params:xml:ns:caldav" xmlns:d="DAV:">' .
+ '<d:prop>' .
+ ' <c:calendar-data>' .
+ ' <c:expand start="20000101T000000Z" end="20101231T235959Z" />' .
+ ' </c:calendar-data>' .
+ ' <d:getetag />' .
+ '</d:prop>' .
+ '<c:filter>' .
+ ' <c:comp-filter name="VCALENDAR">' .
+ ' <c:comp-filter name="VEVENT" />' .
+ ' </c:comp-filter>' .
+ '</c:filter>' .
+ '</c:calendar-query>';
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'REPORT',
+ 'REQUEST_URI' => '/calendars/user1/UUID-123467/UUID-2345',
+ 'HTTP_DEPTH' => '0',
+ ));
+ $request->setBody($body);
+
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 207 Multi-Status',$this->response->status,'Received an unexpected status. Full response body: ' . $this->response->body);
+
+ $xml = simplexml_load_string(DAV\XMLUtil::convertDAVNamespace($this->response->body));
+
+ $xml->registerXPathNamespace('d','urn:DAV');
+ $xml->registerXPathNamespace('c','urn:ietf:params:xml:ns:caldav');
+
+ $check = array(
+ '/d:multistatus',
+ '/d:multistatus/d:response',
+ '/d:multistatus/d:response/d:href',
+ '/d:multistatus/d:response/d:propstat',
+ '/d:multistatus/d:response/d:propstat/d:prop',
+ '/d:multistatus/d:response/d:propstat/d:prop/d:getetag',
+ '/d:multistatus/d:response/d:propstat/d:prop/c:calendar-data',
+ '/d:multistatus/d:response/d:propstat/d:status' => 'HTTP/1.1 200 OK',
+ );
+
+ foreach($check as $v1=>$v2) {
+
+ $xpath = is_int($v1)?$v2:$v1;
+
+ $result = $xml->xpath($xpath);
+ $this->assertEquals(1,count($result), 'We expected 1 ' . $xpath . ' elements. We\'ve found ' . count($result) . '. Full result: ' . $this->response->body);
+
+ if (!is_int($v1)) $this->assertEquals($v2,(string)$result[0]);
+
+ }
+
+ }
+
+ /**
+ * @depends testSupportedReportSetProperty
+ * @depends testCalendarMultiGetReport
+ */
+ function testCalendarQueryReport1ObjectNoCalData() {
+
+ $body =
+ '<?xml version="1.0"?>' .
+ '<c:calendar-query xmlns:c="urn:ietf:params:xml:ns:caldav" xmlns:d="DAV:">' .
+ '<d:prop>' .
+ ' <d:getetag />' .
+ '</d:prop>' .
+ '<c:filter>' .
+ ' <c:comp-filter name="VCALENDAR">' .
+ ' <c:comp-filter name="VEVENT" />' .
+ ' </c:comp-filter>' .
+ '</c:filter>' .
+ '</c:calendar-query>';
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'REPORT',
+ 'REQUEST_URI' => '/calendars/user1/UUID-123467/UUID-2345',
+ 'HTTP_DEPTH' => '0',
+ ));
+ $request->setBody($body);
+
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 207 Multi-Status',$this->response->status,'Received an unexpected status. Full response body: ' . $this->response->body);
+
+ $xml = simplexml_load_string(DAV\XMLUtil::convertDAVNamespace($this->response->body));
+
+ $xml->registerXPathNamespace('d','urn:DAV');
+ $xml->registerXPathNamespace('c','urn:ietf:params:xml:ns:caldav');
+
+ $check = array(
+ '/d:multistatus',
+ '/d:multistatus/d:response',
+ '/d:multistatus/d:response/d:href',
+ '/d:multistatus/d:response/d:propstat',
+ '/d:multistatus/d:response/d:propstat/d:prop',
+ '/d:multistatus/d:response/d:propstat/d:prop/d:getetag',
+ '/d:multistatus/d:response/d:propstat/d:status' => 'HTTP/1.1 200 OK',
+ );
+
+ foreach($check as $v1=>$v2) {
+
+ $xpath = is_int($v1)?$v2:$v1;
+
+ $result = $xml->xpath($xpath);
+ $this->assertEquals(1,count($result), 'We expected 1 ' . $xpath . ' elements. We\'ve found ' . count($result) . '. Full result: ' . $this->response->body);
+
+ if (!is_int($v1)) $this->assertEquals($v2,(string)$result[0]);
+
+ }
+
+ }
+
+ function testHTMLActionsPanel() {
+
+ $output = '';
+ $r = $this->server->broadcastEvent('onHTMLActionsPanel', array($this->server->tree->getNodeForPath('calendars/user1'), &$output));
+ $this->assertFalse($r);
+
+ $this->assertTrue(!!strpos($output,'Display name'));
+
+ }
+
+ function testBrowserPostAction() {
+
+ $r = $this->server->broadcastEvent('onBrowserPostAction', array('calendars/user1', 'mkcalendar', array(
+ 'name' => 'NEWCALENDAR',
+ '{DAV:}displayname' => 'foo',
+ )));
+ $this->assertFalse($r);
+
+ $calendars = $this->caldavBackend->getCalendarsForUser('principals/user1');
+ $this->assertEquals(3, count($calendars));
+
+ $newCalendar = null;
+ foreach($calendars as $calendar) {
+ if ($calendar['uri'] === 'NEWCALENDAR') {
+ $newCalendar = $calendar;
+ break;
+ }
+ }
+ if (!$newCalendar)
+ $this->fail('Could not find newly created calendar');
+
+
+ }
+
+ /**
+ * @depends testCalendarMultiGetReport
+ */
+ function testCalendarMultiGetReportNoEnd() {
+
+ $body =
+ '<?xml version="1.0"?>' .
+ '<c:calendar-multiget xmlns:c="urn:ietf:params:xml:ns:caldav" xmlns:d="DAV:">' .
+ '<d:prop>' .
+ ' <c:calendar-data>' .
+ ' <c:expand start="20110101T000000Z" />' .
+ ' </c:calendar-data>' .
+ ' <d:getetag />' .
+ '</d:prop>' .
+ '<d:href>/calendars/user1/UUID-123467/UUID-2345</d:href>' .
+ '</c:calendar-multiget>';
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'REPORT',
+ 'REQUEST_URI' => '/calendars/user1',
+ 'HTTP_DEPTH' => '1',
+ ));
+ $request->setBody($body);
+
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 400 Bad request',$this->response->status,'Invalid HTTP status received. Full response body: ' . $this->response->body);
+
+ }
+
+ /**
+ * @depends testCalendarMultiGetReport
+ */
+ function testCalendarMultiGetReportNoStart() {
+
+ $body =
+ '<?xml version="1.0"?>' .
+ '<c:calendar-multiget xmlns:c="urn:ietf:params:xml:ns:caldav" xmlns:d="DAV:">' .
+ '<d:prop>' .
+ ' <c:calendar-data>' .
+ ' <c:expand end="20110101T000000Z" />' .
+ ' </c:calendar-data>' .
+ ' <d:getetag />' .
+ '</d:prop>' .
+ '<d:href>/calendars/user1/UUID-123467/UUID-2345</d:href>' .
+ '</c:calendar-multiget>';
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'REPORT',
+ 'REQUEST_URI' => '/calendars/user1',
+ 'HTTP_DEPTH' => '1',
+ ));
+ $request->setBody($body);
+
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 400 Bad request',$this->response->status,'Invalid HTTP status received. Full response body: ' . $this->response->body);
+
+ }
+
+ /**
+ * @depends testCalendarMultiGetReport
+ */
+ function testCalendarMultiGetReportEndBeforeStart() {
+
+ $body =
+ '<?xml version="1.0"?>' .
+ '<c:calendar-multiget xmlns:c="urn:ietf:params:xml:ns:caldav" xmlns:d="DAV:">' .
+ '<d:prop>' .
+ ' <c:calendar-data>' .
+ ' <c:expand start="20200101T000000Z" end="20110101T000000Z" />' .
+ ' </c:calendar-data>' .
+ ' <d:getetag />' .
+ '</d:prop>' .
+ '<d:href>/calendars/user1/UUID-123467/UUID-2345</d:href>' .
+ '</c:calendar-multiget>';
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'REPORT',
+ 'REQUEST_URI' => '/calendars/user1',
+ 'HTTP_DEPTH' => '1',
+ ));
+ $request->setBody($body);
+
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 400 Bad request',$this->response->status,'Invalid HTTP status received. Full response body: ' . $this->response->body);
+
+ }
+
+ function testNotificationProperties() {
+
+ $request = array(
+ '{' . Plugin::NS_CALENDARSERVER . '}notificationtype',
+ );
+ $result = array();
+ $notification = new Notifications\Node(
+ $this->caldavBackend,
+ 'principals/user1',
+ new Notifications\Notification\SystemStatus('foo','"1"')
+ );
+ $this->plugin->beforeGetProperties('foo', $notification, $request, $result);
+
+ $this->assertEquals(
+ array(
+ 200 => array(
+ '{' . Plugin::NS_CALENDARSERVER . '}notificationtype' => $notification->getNotificationType()
+ )
+ ), $result);
+
+ }
+
+ function testNotificationGet() {
+
+ $notification = new Notifications\Node(
+ $this->caldavBackend,
+ 'principals/user1',
+ new Notifications\Notification\SystemStatus('foo','"1"')
+ );
+
+ $server = new DAV\Server(array($notification));
+ $caldav = new Plugin();
+
+ $server->httpRequest = new HTTP\Request(array(
+ 'REQUEST_URI' => '/foo.xml',
+ ));
+ $httpResponse = new HTTP\ResponseMock();
+ $server->httpResponse = $httpResponse;
+
+ $server->addPlugin($caldav);
+
+ $caldav->beforeMethod('GET','foo.xml');
+
+ $this->assertEquals('HTTP/1.1 200 OK', $httpResponse->status);
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml',
+ 'ETag' => '"1"',
+ ), $httpResponse->headers);
+
+ $expected =
+'<?xml version="1.0" encoding="UTF-8"?>
+<cs:notification xmlns:d="DAV:" xmlns:s="http://sabredav.org/ns" xmlns:cal="urn:ietf:params:xml:ns:caldav" xmlns:cs="http://calendarserver.org/ns/">
+ <cs:systemstatus type="high"/>
+</cs:notification>
+';
+
+ $this->assertEquals($expected, $httpResponse->body);
+
+ }
+
+ function testGETPassthrough() {
+
+ $server = new DAV\Server();
+ $caldav = new Plugin();
+
+ $httpResponse = new HTTP\ResponseMock();
+ $server->httpResponse = $httpResponse;
+
+ $server->addPlugin($caldav);
+
+ $caldav->beforeMethod('GET','foo');
+
+ $this->assertNull($caldav->beforeMethod('GET','foozz'));
+
+ }
+
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/Principal/CollectionTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/Principal/CollectionTest.php
new file mode 100644
index 000000000..625f64211
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/Principal/CollectionTest.php
@@ -0,0 +1,19 @@
+<?php
+
+namespace Sabre\CalDAV\Principal;
+use Sabre\DAVACL;
+
+class CollectionTest extends \PHPUnit_Framework_TestCase {
+
+ function testGetChildForPrincipal() {
+
+ $back = new DAVACL\PrincipalBackend\Mock();
+ $col = new Collection($back);
+ $r = $col->getChildForPrincipal(array(
+ 'uri' => 'principals/admin',
+ ));
+ $this->assertInstanceOf('Sabre\\CalDAV\\Principal\\User', $r);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/Principal/ProxyReadTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/Principal/ProxyReadTest.php
new file mode 100644
index 000000000..1ee999a92
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/Principal/ProxyReadTest.php
@@ -0,0 +1,101 @@
+<?php
+
+namespace Sabre\CalDAV\Principal;
+use Sabre\DAVACL;
+
+class ProxyReadTest extends \PHPUnit_Framework_TestCase {
+
+ protected $backend;
+
+ function getInstance() {
+
+ $backend = new DAVACL\PrincipalBackend\Mock();
+ $principal = new ProxyRead($backend, array(
+ 'uri' => 'principal/user',
+ ));
+ $this->backend = $backend;
+ return $principal;
+
+ }
+
+ function testGetName() {
+
+ $i = $this->getInstance();
+ $this->assertEquals('calendar-proxy-read', $i->getName());
+
+ }
+ function testGetDisplayName() {
+
+ $i = $this->getInstance();
+ $this->assertEquals('calendar-proxy-read', $i->getDisplayName());
+
+ }
+
+ function testGetLastModified() {
+
+ $i = $this->getInstance();
+ $this->assertNull($i->getLastModified());
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\Forbidden
+ */
+ function testDelete() {
+
+ $i = $this->getInstance();
+ $i->delete();
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\Forbidden
+ */
+ function testSetName() {
+
+ $i = $this->getInstance();
+ $i->setName('foo');
+
+ }
+
+ function testGetAlternateUriSet() {
+
+ $i = $this->getInstance();
+ $this->assertEquals(array(), $i->getAlternateUriSet());
+
+ }
+
+ function testGetPrincipalUri() {
+
+ $i = $this->getInstance();
+ $this->assertEquals('principal/user/calendar-proxy-read', $i->getPrincipalUrl());
+
+ }
+
+ function testGetGroupMemberSet() {
+
+ $i = $this->getInstance();
+ $this->assertEquals(array(), $i->getGroupMemberSet());
+
+ }
+
+ function testGetGroupMembership() {
+
+ $i = $this->getInstance();
+ $this->assertEquals(array(), $i->getGroupMembership());
+
+ }
+
+ function testSetGroupMemberSet() {
+
+ $i = $this->getInstance();
+ $i->setGroupMemberSet(array('principals/foo'));
+
+ $expected = array(
+ $i->getPrincipalUrl() => array('principals/foo')
+ );
+
+ $this->assertEquals($expected, $this->backend->groupMembers);
+
+ }
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/Principal/ProxyWriteTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/Principal/ProxyWriteTest.php
new file mode 100644
index 000000000..c0186ff0d
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/Principal/ProxyWriteTest.php
@@ -0,0 +1,39 @@
+<?php
+
+namespace Sabre\CalDAV\Principal;
+use Sabre\DAVACL;
+
+class ProxyWriteTest extends ProxyReadTest {
+
+ function getInstance() {
+
+ $backend = new DAVACL\PrincipalBackend\Mock();
+ $principal = new ProxyWrite($backend, array(
+ 'uri' => 'principal/user',
+ ));
+ $this->backend = $backend;
+ return $principal;
+
+ }
+
+ function testGetName() {
+
+ $i = $this->getInstance();
+ $this->assertEquals('calendar-proxy-write', $i->getName());
+
+ }
+ function testGetDisplayName() {
+
+ $i = $this->getInstance();
+ $this->assertEquals('calendar-proxy-write', $i->getDisplayName());
+
+ }
+
+ function testGetPrincipalUri() {
+
+ $i = $this->getInstance();
+ $this->assertEquals('principal/user/calendar-proxy-write', $i->getPrincipalUrl());
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/Principal/UserTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/Principal/UserTest.php
new file mode 100644
index 000000000..d41692f2a
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/Principal/UserTest.php
@@ -0,0 +1,126 @@
+<?php
+
+namespace Sabre\CalDAV\Principal;
+use Sabre\DAVACL;
+
+class UserTest extends \PHPUnit_Framework_TestCase {
+
+ function getInstance() {
+
+ $backend = new DAVACL\PrincipalBackend\Mock();
+ $backend->addPrincipal(array(
+ 'uri' => 'principals/user/calendar-proxy-read',
+ ));
+ $backend->addPrincipal(array(
+ 'uri' => 'principals/user/calendar-proxy-write',
+ ));
+ $backend->addPrincipal(array(
+ 'uri' => 'principals/user/random',
+ ));
+ return new User($backend, array(
+ 'uri' => 'principals/user',
+ ));
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\Forbidden
+ */
+ function testCreateFile() {
+
+ $u = $this->getInstance();
+ $u->createFile('test');
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\Forbidden
+ */
+ function testCreateDirectory() {
+
+ $u = $this->getInstance();
+ $u->createDirectory('test');
+
+ }
+
+ function testGetChildProxyRead() {
+
+ $u = $this->getInstance();
+ $child = $u->getChild('calendar-proxy-read');
+ $this->assertInstanceOf('Sabre\\CalDAV\\Principal\\ProxyRead', $child);
+
+ }
+
+ function testGetChildProxyWrite() {
+
+ $u = $this->getInstance();
+ $child = $u->getChild('calendar-proxy-write');
+ $this->assertInstanceOf('Sabre\\CalDAV\\Principal\\ProxyWrite', $child);
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\NotFound
+ */
+ function testGetChildNotFound() {
+
+ $u = $this->getInstance();
+ $child = $u->getChild('foo');
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\NotFound
+ */
+ function testGetChildNotFound2() {
+
+ $u = $this->getInstance();
+ $child = $u->getChild('random');
+
+ }
+
+ function testGetChildren() {
+
+ $u = $this->getInstance();
+ $children = $u->getChildren();
+ $this->assertEquals(2, count($children));
+ $this->assertInstanceOf('Sabre\\CalDAV\\Principal\\ProxyRead', $children[0]);
+ $this->assertInstanceOf('Sabre\\CalDAV\\Principal\\ProxyWrite', $children[1]);
+
+ }
+
+ function testChildExist() {
+
+ $u = $this->getInstance();
+ $this->assertTrue($u->childExists('calendar-proxy-read'));
+ $this->assertTrue($u->childExists('calendar-proxy-write'));
+ $this->assertFalse($u->childExists('foo'));
+
+ }
+
+ function testGetACL() {
+
+ $expected = array(
+ array(
+ 'privilege' => '{DAV:}read',
+ 'principal' => 'principals/user',
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}read',
+ 'principal' => 'principals/user/calendar-proxy-read',
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}read',
+ 'principal' => 'principals/user/calendar-proxy-write',
+ 'protected' => true,
+ ),
+ );
+
+ $u = $this->getInstance();
+ $this->assertEquals($expected, $u->getACL());
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/Property/AllowedSharingModesTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/Property/AllowedSharingModesTest.php
new file mode 100644
index 000000000..733ea1108
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/Property/AllowedSharingModesTest.php
@@ -0,0 +1,46 @@
+<?php
+
+namespace Sabre\CalDAV\Property;
+
+use Sabre\CalDAV;
+use Sabre\DAV;
+
+class AllowedSharingModesTest extends \PHPUnit_Framework_TestCase {
+
+ function testSimple() {
+
+ $sccs = new AllowedSharingModes(true,true);
+
+ }
+
+ /**
+ * @depends testSimple
+ */
+ function testSerialize() {
+
+ $property = new AllowedSharingModes(true,true);
+
+ $doc = new \DOMDocument();
+ $root = $doc->createElement('d:root');
+ $root->setAttribute('xmlns:d','DAV:');
+ $root->setAttribute('xmlns:cal',CalDAV\Plugin::NS_CALDAV);
+ $root->setAttribute('xmlns:cs',CalDAV\Plugin::NS_CALENDARSERVER);
+
+ $doc->appendChild($root);
+ $server = new DAV\Server();
+
+ $property->serialize($server, $root);
+
+ $xml = $doc->saveXML();
+
+ $this->assertEquals(
+'<?xml version="1.0"?>
+<d:root xmlns:d="DAV:" xmlns:cal="' . CalDAV\Plugin::NS_CALDAV . '" xmlns:cs="' . CalDAV\Plugin::NS_CALENDARSERVER . '">' .
+'<cs:can-be-shared/>' .
+'<cs:can-be-published/>' .
+'</d:root>
+', $xml);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/Property/InviteTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/Property/InviteTest.php
new file mode 100644
index 000000000..349a6e080
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/Property/InviteTest.php
@@ -0,0 +1,196 @@
+<?php
+
+namespace Sabre\CalDAV\Property;
+
+use Sabre\CalDAV;
+use Sabre\DAV;
+
+class InviteTest extends \PHPUnit_Framework_TestCase {
+
+ function testSimple() {
+
+ $sccs = new Invite(array());
+
+ }
+
+ /**
+ * @depends testSimple
+ */
+ function testSerialize() {
+
+ $property = new Invite(array(
+ array(
+ 'href' => 'mailto:user1@example.org',
+ 'status' => CalDAV\SharingPlugin::STATUS_ACCEPTED,
+ 'readOnly' => false,
+ ),
+ array(
+ 'href' => 'mailto:user2@example.org',
+ 'commonName' => 'John Doe',
+ 'status' => CalDAV\SharingPlugin::STATUS_DECLINED,
+ 'readOnly' => true,
+ ),
+ array(
+ 'href' => 'mailto:user3@example.org',
+ 'commonName' => 'Joe Shmoe',
+ 'status' => CalDAV\SharingPlugin::STATUS_NORESPONSE,
+ 'readOnly' => true,
+ 'summary' => 'Something, something',
+ ),
+ array(
+ 'href' => 'mailto:user4@example.org',
+ 'commonName' => 'Hoe Boe',
+ 'status' => CalDAV\SharingPlugin::STATUS_INVALID,
+ 'readOnly' => true,
+ ),
+ ), array(
+ 'href' => 'mailto:thedoctor@example.org',
+ 'commonName' => 'The Doctor',
+ 'firstName' => 'The',
+ 'lastName' => 'Doctor',
+ ));
+
+ $doc = new \DOMDocument();
+ $doc->formatOutput = true;
+ $root = $doc->createElement('d:root');
+ $root->setAttribute('xmlns:d','DAV:');
+ $root->setAttribute('xmlns:cal',CalDAV\Plugin::NS_CALDAV);
+ $root->setAttribute('xmlns:cs',CalDAV\Plugin::NS_CALENDARSERVER);
+
+ $doc->appendChild($root);
+ $server = new DAV\Server();
+
+ $property->serialize($server, $root);
+
+ $xml = $doc->saveXML();
+
+ $this->assertEquals(
+'<?xml version="1.0"?>
+<d:root xmlns:d="DAV:" xmlns:cal="' . CalDAV\Plugin::NS_CALDAV . '" xmlns:cs="' . CalDAV\Plugin::NS_CALENDARSERVER . '">
+ <cs:organizer>
+ <d:href>mailto:thedoctor@example.org</d:href>
+ <cs:common-name>The Doctor</cs:common-name>
+ <cs:first-name>The</cs:first-name>
+ <cs:last-name>Doctor</cs:last-name>
+ </cs:organizer>
+ <cs:user>
+ <d:href>mailto:user1@example.org</d:href>
+ <cs:invite-accepted/>
+ <cs:access>
+ <cs:read-write/>
+ </cs:access>
+ </cs:user>
+ <cs:user>
+ <d:href>mailto:user2@example.org</d:href>
+ <cs:common-name>John Doe</cs:common-name>
+ <cs:invite-declined/>
+ <cs:access>
+ <cs:read/>
+ </cs:access>
+ </cs:user>
+ <cs:user>
+ <d:href>mailto:user3@example.org</d:href>
+ <cs:common-name>Joe Shmoe</cs:common-name>
+ <cs:invite-noresponse/>
+ <cs:access>
+ <cs:read/>
+ </cs:access>
+ <cs:summary>Something, something</cs:summary>
+ </cs:user>
+ <cs:user>
+ <d:href>mailto:user4@example.org</d:href>
+ <cs:common-name>Hoe Boe</cs:common-name>
+ <cs:invite-invalid/>
+ <cs:access>
+ <cs:read/>
+ </cs:access>
+ </cs:user>
+</d:root>
+', $xml);
+
+ }
+
+ /**
+ * @depends testSerialize
+ */
+ public function testUnserialize() {
+
+ $input = array(
+ array(
+ 'href' => 'mailto:user1@example.org',
+ 'status' => CalDAV\SharingPlugin::STATUS_ACCEPTED,
+ 'readOnly' => false,
+ 'commonName' => '',
+ 'summary' => '',
+ ),
+ array(
+ 'href' => 'mailto:user2@example.org',
+ 'commonName' => 'John Doe',
+ 'status' => CalDAV\SharingPlugin::STATUS_DECLINED,
+ 'readOnly' => true,
+ 'summary' => '',
+ ),
+ array(
+ 'href' => 'mailto:user3@example.org',
+ 'commonName' => 'Joe Shmoe',
+ 'status' => CalDAV\SharingPlugin::STATUS_NORESPONSE,
+ 'readOnly' => true,
+ 'summary' => 'Something, something',
+ ),
+ array(
+ 'href' => 'mailto:user4@example.org',
+ 'commonName' => 'Hoe Boe',
+ 'status' => CalDAV\SharingPlugin::STATUS_INVALID,
+ 'readOnly' => true,
+ 'summary' => '',
+ ),
+ );
+
+ // Creating the xml
+ $doc = new \DOMDocument();
+ $doc->formatOutput = true;
+ $root = $doc->createElement('d:root');
+ $root->setAttribute('xmlns:d','DAV:');
+ $root->setAttribute('xmlns:cal',CalDAV\Plugin::NS_CALDAV);
+ $root->setAttribute('xmlns:cs',CalDAV\Plugin::NS_CALENDARSERVER);
+
+ $doc->appendChild($root);
+ $server = new DAV\Server();
+
+ $inputProperty = new Invite($input);
+ $inputProperty->serialize($server, $root);
+
+ $xml = $doc->saveXML();
+
+ // Parsing it again
+
+ $doc2 = DAV\XMLUtil::loadDOMDocument($xml);
+
+ $outputProperty = Invite::unserialize($doc2->firstChild);
+
+ $this->assertEquals($input, $outputProperty->getValue());
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception
+ */
+ function testUnserializeNoStatus() {
+
+$xml = '<?xml version="1.0"?>
+<d:root xmlns:d="DAV:" xmlns:cal="' . CalDAV\Plugin::NS_CALDAV . '" xmlns:cs="' . CalDAV\Plugin::NS_CALENDARSERVER . '">
+ <cs:user>
+ <d:href>mailto:user1@example.org</d:href>
+ <!-- <cs:invite-accepted/> -->
+ <cs:access>
+ <cs:read-write/>
+ </cs:access>
+ </cs:user>
+</d:root>';
+
+ $doc2 = DAV\XMLUtil::loadDOMDocument($xml);
+ $outputProperty = Invite::unserialize($doc2->firstChild);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/Property/ScheduleCalendarTranspTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/Property/ScheduleCalendarTranspTest.php
new file mode 100644
index 000000000..1ace0b18f
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/Property/ScheduleCalendarTranspTest.php
@@ -0,0 +1,99 @@
+<?php
+
+namespace Sabre\CalDAV\Property;
+
+use Sabre\CalDAV;
+use Sabre\DAV;
+
+class ScheduleCalendarTranspTest extends \PHPUnit_Framework_TestCase {
+
+ function testSimple() {
+
+ $sccs = new ScheduleCalendarTransp('transparent');
+ $this->assertEquals('transparent', $sccs->getValue());
+
+ }
+
+ /**
+ * @expectedException InvalidArgumentException
+ */
+ function testBadArg() {
+
+ $sccs = new ScheduleCalendarTransp('foo');
+
+ }
+
+ function values() {
+
+ return array(
+ array('transparent'),
+ array('opaque'),
+ );
+
+ }
+
+ /**
+ * @depends testSimple
+ * @dataProvider values
+ */
+ function testSerialize($value) {
+
+ $property = new ScheduleCalendarTransp($value);
+
+ $doc = new \DOMDocument();
+ $root = $doc->createElement('d:root');
+ $root->setAttribute('xmlns:d','DAV:');
+ $root->setAttribute('xmlns:cal',CalDAV\Plugin::NS_CALDAV);
+
+ $doc->appendChild($root);
+ $server = new DAV\Server();
+
+ $property->serialize($server, $root);
+
+ $xml = $doc->saveXML();
+
+ $this->assertEquals(
+'<?xml version="1.0"?>
+<d:root xmlns:d="DAV:" xmlns:cal="' . CalDAV\Plugin::NS_CALDAV . '">' .
+'<cal:' . $value . '/>' .
+'</d:root>
+', $xml);
+
+ }
+
+ /**
+ * @depends testSimple
+ * @dataProvider values
+ */
+ function testUnserializer($value) {
+
+ $xml = '<?xml version="1.0"?>
+<d:root xmlns:d="DAV:" xmlns:cal="' . CalDAV\Plugin::NS_CALDAV . '">' .
+'<cal:'.$value.'/>' .
+'</d:root>';
+
+ $dom = DAV\XMLUtil::loadDOMDocument($xml);
+
+ $property = ScheduleCalendarTransp::unserialize($dom->firstChild);
+
+ $this->assertTrue($property instanceof ScheduleCalendarTransp);
+ $this->assertEquals($value, $property->getValue());
+
+ }
+
+ /**
+ * @depends testSimple
+ */
+ function testUnserializerBadData() {
+
+ $xml = '<?xml version="1.0"?>
+<d:root xmlns:d="DAV:" xmlns:cal="' . CalDAV\Plugin::NS_CALDAV . '">' .
+'<cal:foo/>' .
+'</d:root>';
+
+ $dom = DAV\XMLUtil::loadDOMDocument($xml);
+
+ $this->assertNull(ScheduleCalendarTransp::unserialize($dom->firstChild));
+
+ }
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/Property/SupportedCalendarComponentSetTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/Property/SupportedCalendarComponentSetTest.php
new file mode 100644
index 000000000..3e5d5f5fc
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/Property/SupportedCalendarComponentSetTest.php
@@ -0,0 +1,67 @@
+<?php
+
+namespace Sabre\CalDAV\Property;
+
+class SupportedCalendarComponentSetTest extends \PHPUnit_Framework_TestCase {
+
+ function testSimple() {
+
+ $sccs = new SupportedCalendarComponentSet(array('VEVENT'));
+ $this->assertEquals(array('VEVENT'), $sccs->getValue());
+
+ }
+
+ /**
+ * @depends testSimple
+ */
+ function testSerialize() {
+
+ $property = new SupportedCalendarComponentSet(array('VEVENT','VJOURNAL'));
+
+ $doc = new \DOMDocument();
+ $root = $doc->createElement('d:root');
+ $root->setAttribute('xmlns:d','DAV:');
+ $root->setAttribute('xmlns:cal',\Sabre\CalDAV\Plugin::NS_CALDAV);
+
+ $doc->appendChild($root);
+ $server = new \Sabre\DAV\Server();
+
+ $property->serialize($server, $root);
+
+ $xml = $doc->saveXML();
+
+ $this->assertEquals(
+'<?xml version="1.0"?>
+<d:root xmlns:d="DAV:" xmlns:cal="' . \Sabre\CalDAV\Plugin::NS_CALDAV . '">' .
+'<cal:comp name="VEVENT"/>' .
+'<cal:comp name="VJOURNAL"/>' .
+'</d:root>
+', $xml);
+
+ }
+
+ /**
+ * @depends testSimple
+ */
+ function testUnserializer() {
+
+ $xml = '<?xml version="1.0"?>
+<d:root xmlns:d="DAV:" xmlns:cal="' . \Sabre\CalDAV\Plugin::NS_CALDAV . '">' .
+'<cal:comp name="VEVENT"/>' .
+'<cal:comp name="VJOURNAL"/>' .
+'</d:root>';
+
+ $dom = \Sabre\DAV\XMLUtil::loadDOMDocument($xml);
+
+ $property = SupportedCalendarComponentSet::unserialize($dom->firstChild);
+
+ $this->assertTrue($property instanceof SupportedCalendarComponentSet);
+ $this->assertEquals(array(
+ 'VEVENT',
+ 'VJOURNAL',
+ ),
+ $property->getValue());
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/Property/SupportedCalendarDataTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/Property/SupportedCalendarDataTest.php
new file mode 100644
index 000000000..3e016368c
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/Property/SupportedCalendarDataTest.php
@@ -0,0 +1,44 @@
+<?php
+
+namespace Sabre\CalDAV\Property;
+
+use Sabre\CalDAV;
+use Sabre\DAV;
+
+class SupportedCalendarDataTest extends \PHPUnit_Framework_TestCase {
+
+ function testSimple() {
+
+ $sccs = new SupportedCalendarData();
+
+ }
+
+ /**
+ * @depends testSimple
+ */
+ function testSerialize() {
+
+ $property = new SupportedCalendarData();
+
+ $doc = new \DOMDocument();
+ $root = $doc->createElement('d:root');
+ $root->setAttribute('xmlns:d','DAV:');
+ $root->setAttribute('xmlns:cal',CalDAV\Plugin::NS_CALDAV);
+
+ $doc->appendChild($root);
+ $server = new DAV\Server();
+
+ $property->serialize($server, $root);
+
+ $xml = $doc->saveXML();
+
+ $this->assertEquals(
+'<?xml version="1.0"?>
+<d:root xmlns:d="DAV:" xmlns:cal="' . CalDAV\Plugin::NS_CALDAV . '">' .
+'<cal:calendar-data content-type="text/calendar" version="2.0"/>' .
+'</d:root>
+', $xml);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/Property/SupportedCollationSetTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/Property/SupportedCollationSetTest.php
new file mode 100644
index 000000000..669e31553
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/Property/SupportedCollationSetTest.php
@@ -0,0 +1,46 @@
+<?php
+
+namespace Sabre\CalDAV\Property;
+
+use Sabre\CalDAV;
+use Sabre\DAV;
+
+class SupportedCollationSetTest extends \PHPUnit_Framework_TestCase {
+
+ function testSimple() {
+
+ $scs = new SupportedCollationSet();
+
+ }
+
+ /**
+ * @depends testSimple
+ */
+ function testSerialize() {
+
+ $property = new SupportedCollationSet();
+
+ $doc = new \DOMDocument();
+ $root = $doc->createElement('d:root');
+ $root->setAttribute('xmlns:d','DAV:');
+ $root->setAttribute('xmlns:cal',CalDAV\Plugin::NS_CALDAV);
+
+ $doc->appendChild($root);
+ $server = new DAV\Server();
+
+ $property->serialize($server, $root);
+
+ $xml = $doc->saveXML();
+
+ $this->assertEquals(
+'<?xml version="1.0"?>
+<d:root xmlns:d="DAV:" xmlns:cal="' . CalDAV\Plugin::NS_CALDAV . '">' .
+'<cal:supported-collation>i;ascii-casemap</cal:supported-collation>' .
+'<cal:supported-collation>i;octet</cal:supported-collation>' .
+'<cal:supported-collation>i;unicode-casemap</cal:supported-collation>' .
+'</d:root>
+', $xml);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/Schedule/IMip/Mock.php b/vendor/sabre/dav/tests/Sabre/CalDAV/Schedule/IMip/Mock.php
new file mode 100644
index 000000000..200274ce8
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/Schedule/IMip/Mock.php
@@ -0,0 +1,52 @@
+<?php
+
+namespace Sabre\CalDAV\Schedule\IMip;
+
+/**
+ * iMIP handler.
+ *
+ * This class is responsible for sending out iMIP messages. iMIP is the
+ * email-based transport for iTIP. iTIP deals with scheduling operations for
+ * iCalendar objects.
+ *
+ * If you want to customize the email that gets sent out, you can do so by
+ * extending this class and overriding the sendMessage method.
+ *
+ * @package Sabre
+ * @subpackage CalDAV
+ * @copyright Copyright (C) 2007-2013 Rooftop Solutions. All rights reserved.
+ * @author Evert Pot (http://www.rooftopsolutions.nl/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Mock extends \Sabre\CalDAV\Schedule\IMip {
+
+ protected $emails = array();
+
+ /**
+ * This function is reponsible for sending the actual email.
+ *
+ * @param string $to Recipient email address
+ * @param string $subject Subject of the email
+ * @param string $body iCalendar body
+ * @param array $headers List of headers
+ * @return void
+ */
+ protected function mail($to, $subject, $body, array $headers) {
+
+ $this->emails[] = array(
+ 'to' => $to,
+ 'subject' => $subject,
+ 'body' => $body,
+ 'headers' => $headers,
+ );
+
+ }
+
+ public function getSentEmails() {
+
+ return $this->emails;
+
+ }
+
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/Schedule/OutboxTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/Schedule/OutboxTest.php
new file mode 100644
index 000000000..60ce9a2ad
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/Schedule/OutboxTest.php
@@ -0,0 +1,68 @@
+<?php
+
+namespace Sabre\CalDAV\Schedule;
+use Sabre\CalDAV;
+use Sabre\DAV;
+
+class OutboxTest extends \PHPUnit_Framework_TestCase {
+
+ function testSetup() {
+
+ $outbox = new Outbox('principals/user1');
+ $this->assertEquals('outbox', $outbox->getName());
+ $this->assertEquals(array(), $outbox->getChildren());
+ $this->assertEquals('principals/user1', $outbox->getOwner());
+ $this->assertEquals(null, $outbox->getGroup());
+
+ $this->assertEquals(array(
+ array(
+ 'privilege' => '{' . CalDAV\Plugin::NS_CALDAV . '}schedule-query-freebusy',
+ 'principal' => 'principals/user1',
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{' . CalDAV\Plugin::NS_CALDAV . '}schedule-post-vevent',
+ 'principal' => 'principals/user1',
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}read',
+ 'principal' => 'principals/user1',
+ 'protected' => true,
+ ),
+ ), $outbox->getACL());
+
+ $ok = false;
+ try {
+ $outbox->setACL(array());
+ } catch (DAV\Exception\MethodNotAllowed $e) {
+ $ok = true;
+ }
+ if (!$ok) {
+ $this->fail('Exception was not emitted');
+ }
+
+ }
+
+ function testGetSupportedPrivilegeSet() {
+
+ $outbox = new Outbox('principals/user1');
+ $r = $outbox->getSupportedPrivilegeSet();
+
+ $ok = 0;
+ foreach($r['aggregates'] as $priv) {
+
+ if ($priv['privilege'] == '{' . CalDAV\Plugin::NS_CALDAV . '}schedule-query-freebusy') {
+ $ok++;
+ }
+ if ($priv['privilege'] == '{' . CalDAV\Plugin::NS_CALDAV . '}schedule-post-vevent') {
+ $ok++;
+ }
+ }
+
+ $this->assertEquals(2, $ok, "We're missing one or more privileges");
+
+ }
+
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/ShareableCalendarTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/ShareableCalendarTest.php
new file mode 100644
index 000000000..2f79351f1
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/ShareableCalendarTest.php
@@ -0,0 +1,62 @@
+<?php
+
+namespace Sabre\CalDAV;
+
+use Sabre\DAVACL;
+
+class ShareableCalendarTest extends \PHPUnit_Framework_TestCase {
+
+ protected $backend;
+ protected $instance;
+
+ function setUp() {
+
+ $props = array(
+ 'id' => 1,
+ );
+
+ $this->backend = new Backend\Mock(
+ array($props),
+ array(),
+ array()
+ );
+ $this->backend->updateShares(1, array(
+ array(
+ 'href' => 'mailto:removeme@example.org',
+ 'commonName' => 'To be removed',
+ 'readOnly' => true,
+ ),
+ ), array());
+
+ $this->instance = new ShareableCalendar($this->backend, $props);
+
+ }
+
+ function testUpdateShares() {
+
+ $this->instance->updateShares(array(
+ array(
+ 'href' => 'mailto:test@example.org',
+ 'commonName' => 'Foo Bar',
+ 'summary' => 'Booh',
+ 'readOnly' => false,
+ ),
+ ), array('mailto:removeme@example.org'));
+
+ $this->assertEquals(array(array(
+ 'href' => 'mailto:test@example.org',
+ 'commonName' => 'Foo Bar',
+ 'summary' => 'Booh',
+ 'readOnly' => false,
+ 'status' => SharingPlugin::STATUS_NORESPONSE,
+ )), $this->instance->getShares());
+
+ }
+
+ function testPublish() {
+
+ $this->instance->setPublishStatus(true);
+ $this->instance->setPublishStatus(false);
+
+ }
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/SharedCalendarTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/SharedCalendarTest.php
new file mode 100644
index 000000000..955831917
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/SharedCalendarTest.php
@@ -0,0 +1,122 @@
+<?php
+
+namespace Sabre\CalDAV;
+
+use Sabre\DAVACL;
+
+class SharedCalendarTest extends \PHPUnit_Framework_TestCase {
+
+ protected $backend;
+
+ function getInstance(array $props = null) {
+
+ if (is_null($props)) {
+ $props = array(
+ 'id' => 1,
+ '{http://calendarserver.org/ns/}shared-url' => 'calendars/owner/original',
+ '{http://sabredav.org/ns}owner-principal' => 'principals/owner',
+ '{http://sabredav.org/ns}read-only' => false,
+ 'principaluri' => 'principals/sharee',
+ );
+ }
+
+ $this->backend = new Backend\Mock(
+ array($props),
+ array(),
+ array()
+ );
+ $this->backend->updateShares(1, array(
+ array(
+ 'href' => 'mailto:removeme@example.org',
+ 'commonName' => 'To be removed',
+ 'readOnly' => true,
+ ),
+ ), array());
+
+ return new SharedCalendar($this->backend, $props);
+
+ }
+
+ function testGetSharedUrl() {
+ $this->assertEquals('calendars/owner/original', $this->getInstance()->getSharedUrl());
+ }
+
+ function testGetShares() {
+
+ $this->assertEquals(array(array(
+ 'href' => 'mailto:removeme@example.org',
+ 'commonName' => 'To be removed',
+ 'readOnly' => true,
+ 'status' => SharingPlugin::STATUS_NORESPONSE,
+ )), $this->getInstance()->getShares());
+
+ }
+
+ function testGetOwner() {
+ $this->assertEquals('principals/owner', $this->getInstance()->getOwner());
+ }
+
+ function testGetACL() {
+
+ $expected = array(
+ array(
+ 'privilege' => '{DAV:}read',
+ 'principal' => 'principals/owner',
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}write',
+ 'principal' => 'principals/owner',
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}read',
+ 'principal' => 'principals/owner/calendar-proxy-write',
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}write',
+ 'principal' => 'principals/owner/calendar-proxy-write',
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}read',
+ 'principal' => 'principals/owner/calendar-proxy-read',
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{' . Plugin::NS_CALDAV . '}read-free-busy',
+ 'principal' => '{DAV:}authenticated',
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}read',
+ 'principal' => 'principals/sharee',
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}write',
+ 'principal' => 'principals/sharee',
+ 'protected' => true,
+ ),
+ );
+
+ $this->assertEquals($expected, $this->getInstance()->getACL());
+
+ }
+
+ /**
+ * @expectedException InvalidArgumentException
+ */
+ public function testCreateInstanceMissingArg() {
+
+ $this->getInstance(array(
+ 'id' => 1,
+ '{http://calendarserver.org/ns/}shared-url' => 'calendars/owner/original',
+ '{http://sabredav.org/ns}read-only' => false,
+ 'principaluri' => 'principals/sharee',
+ ));
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/SharingPluginTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/SharingPluginTest.php
new file mode 100644
index 000000000..60a71fd7f
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/SharingPluginTest.php
@@ -0,0 +1,391 @@
+<?php
+
+namespace Sabre\CalDAV;
+
+use Sabre\DAV;
+use Sabre\HTTP;
+
+class SharingPluginTest extends \Sabre\DAVServerTest {
+
+ protected $setupCalDAV = true;
+ protected $setupCalDAVSharing = true;
+ protected $setupACL = true;
+ protected $autoLogin = 'user1';
+
+ function setUp() {
+
+ $this->caldavCalendars = array(
+ array(
+ 'principaluri' => 'principals/user1',
+ 'id' => 1,
+ 'uri' => 'cal1',
+ ),
+ array(
+ 'principaluri' => 'principals/user1',
+ 'id' => 2,
+ 'uri' => 'cal2',
+ '{' . Plugin::NS_CALENDARSERVER . '}shared-url' => 'calendars/user1/cal2',
+ '{http://sabredav.org/ns}owner-principal' => 'principals/user2',
+ '{http://sabredav.org/ns}read-only' => 'true',
+ ),
+ array(
+ 'principaluri' => 'principals/user1',
+ 'id' => 3,
+ 'uri' => 'cal3',
+ ),
+ );
+
+ parent::setUp();
+
+ // Making the logged in user an admin, for full access:
+ $this->aclPlugin->adminPrincipals[] = 'principals/user1';
+ $this->aclPlugin->adminPrincipals[] = 'principals/user2';
+
+ }
+
+ function testSimple() {
+
+ $this->assertInstanceOf('Sabre\\CalDAV\\SharingPlugin', $this->server->getPlugin('caldav-sharing'));
+
+ }
+
+ function testGetFeatures() {
+
+ $this->assertEquals(array('calendarserver-sharing'), $this->caldavSharingPlugin->getFeatures());
+
+ }
+
+ function testBeforeGetShareableCalendar() {
+
+ // Forcing the server to authenticate:
+ $this->authPlugin->beforeMethod('GET','');
+ $props = $this->server->getProperties('calendars/user1/cal1', array(
+ '{' . Plugin::NS_CALENDARSERVER . '}invite',
+ '{' . Plugin::NS_CALENDARSERVER . '}allowed-sharing-modes',
+ ));
+
+ $this->assertInstanceOf('Sabre\\CalDAV\\Property\\Invite', $props['{' . Plugin::NS_CALENDARSERVER . '}invite']);
+ $this->assertInstanceOf('Sabre\\CalDAV\\Property\\AllowedSharingModes', $props['{' . Plugin::NS_CALENDARSERVER . '}allowed-sharing-modes']);
+
+ }
+
+ function testBeforeGetSharedCalendar() {
+
+ $props = $this->server->getProperties('calendars/user1/cal2', array(
+ '{' . Plugin::NS_CALENDARSERVER . '}shared-url',
+ '{' . Plugin::NS_CALENDARSERVER . '}invite',
+ ));
+
+ $this->assertInstanceOf('Sabre\\CalDAV\\Property\\Invite', $props['{' . Plugin::NS_CALENDARSERVER . '}invite']);
+ $this->assertInstanceOf('Sabre\\DAV\\Property\\IHref', $props['{' . Plugin::NS_CALENDARSERVER . '}shared-url']);
+
+ }
+
+ function testUpdateProperties() {
+
+ $this->caldavBackend->updateShares(1,
+ array(
+ array(
+ 'href' => 'mailto:joe@example.org',
+ ),
+ ),
+ array()
+ );
+ $result = $this->server->updateProperties('calendars/user1/cal1', array(
+ '{DAV:}resourcetype' => new DAV\Property\ResourceType(array('{DAV:}collection'))
+ ));
+
+ $this->assertEquals(array(
+ 200 => array(
+ '{DAV:}resourcetype' => null,
+ ),
+ 'href' => 'calendars/user1/cal1',
+ ), $result);
+
+ $this->assertEquals(0, count($this->caldavBackend->getShares(1)));
+
+ }
+
+ function testUpdatePropertiesPassThru() {
+
+ $result = $this->server->updateProperties('calendars/user1/cal3', array(
+ '{DAV:}foo' => 'bar',
+ ));
+
+ $this->assertEquals(array(
+ 403 => array(
+ '{DAV:}foo' => null,
+ ),
+ 'href' => 'calendars/user1/cal3',
+ ), $result);
+
+ }
+
+ function testUnknownMethodNoPOST() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'PATCH',
+ 'REQUEST_URI' => '/',
+ ));
+
+ $response = $this->request($request);
+
+ $this->assertEquals('HTTP/1.1 501 Not Implemented', $response->status, $response->body);
+
+ }
+
+ function testUnknownMethodNoXML() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'POST',
+ 'REQUEST_URI' => '/',
+ 'CONTENT_TYPE' => 'text/plain',
+ ));
+
+ $response = $this->request($request);
+
+ $this->assertEquals('HTTP/1.1 501 Not Implemented', $response->status, $response->body);
+
+ }
+
+ function testUnknownMethodNoNode() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'POST',
+ 'REQUEST_URI' => '/foo',
+ 'CONTENT_TYPE' => 'text/xml',
+ ));
+
+ $response = $this->request($request);
+
+ $this->assertEquals('HTTP/1.1 501 Not Implemented', $response->status, $response->body);
+
+ }
+
+ function testShareRequest() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'POST',
+ 'REQUEST_URI' => '/calendars/user1/cal1',
+ 'CONTENT_TYPE' => 'text/xml',
+ ));
+
+ $xml = <<<RRR
+<?xml version="1.0"?>
+<cs:share xmlns:cs="http://calendarserver.org/ns/" xmlns:d="DAV:">
+ <cs:set>
+ <d:href>mailto:joe@example.org</d:href>
+ <cs:common-name>Joe Shmoe</cs:common-name>
+ <cs:read-write />
+ </cs:set>
+ <cs:remove>
+ <d:href>mailto:nancy@example.org</d:href>
+ </cs:remove>
+</cs:share>
+RRR;
+
+ $request->setBody($xml);
+
+ $response = $this->request($request);
+ $this->assertEquals('HTTP/1.1 200 OK', $response->status, $response->body);
+
+ $this->assertEquals(array(array(
+ 'href' => 'mailto:joe@example.org',
+ 'commonName' => 'Joe Shmoe',
+ 'readOnly' => false,
+ 'status' => SharingPlugin::STATUS_NORESPONSE,
+ 'summary' => '',
+ )), $this->caldavBackend->getShares(1));
+
+ // Verifying that the calendar is now marked shared.
+ $props = $this->server->getProperties('calendars/user1/cal1', array('{DAV:}resourcetype'));
+ $this->assertTrue(
+ $props['{DAV:}resourcetype']->is('{http://calendarserver.org/ns/}shared-owner')
+ );
+
+ }
+
+ function testShareRequestNoShareableCalendar() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'POST',
+ 'REQUEST_URI' => '/calendars/user1/cal2',
+ 'CONTENT_TYPE' => 'text/xml',
+ ));
+
+ $xml = '<?xml version="1.0"?>
+<cs:share xmlns:cs="' . Plugin::NS_CALENDARSERVER . '" xmlns:d="DAV:">
+ <cs:set>
+ <d:href>mailto:joe@example.org</d:href>
+ <cs:common-name>Joe Shmoe</cs:common-name>
+ <cs:read-write />
+ </cs:set>
+ <cs:remove>
+ <d:href>mailto:nancy@example.org</d:href>
+ </cs:remove>
+</cs:share>
+';
+
+ $request->setBody($xml);
+
+ $response = $this->request($request);
+ $this->assertEquals('HTTP/1.1 501 Not Implemented', $response->status, $response->body);
+
+ }
+
+ function testInviteReply() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'POST',
+ 'REQUEST_URI' => '/calendars/user1',
+ 'CONTENT_TYPE' => 'text/xml',
+ ));
+
+ $xml = '<?xml version="1.0"?>
+<cs:invite-reply xmlns:cs="' . Plugin::NS_CALENDARSERVER . '" xmlns:d="DAV:">
+ <cs:hosturl><d:href>/principals/owner</d:href></cs:hosturl>
+ <cs:invite-accepted />
+</cs:invite-reply>
+';
+
+ $request->setBody($xml);
+ $response = $this->request($request);
+ $this->assertEquals('HTTP/1.1 200 OK', $response->status, $response->body);
+
+ }
+
+ function testInviteBadXML() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'POST',
+ 'REQUEST_URI' => '/calendars/user1',
+ 'CONTENT_TYPE' => 'text/xml',
+ ));
+
+ $xml = '<?xml version="1.0"?>
+<cs:invite-reply xmlns:cs="' . Plugin::NS_CALENDARSERVER . '" xmlns:d="DAV:">
+</cs:invite-reply>
+';
+ $request->setBody($xml);
+ $response = $this->request($request);
+ $this->assertEquals('HTTP/1.1 400 Bad request', $response->status, $response->body);
+
+ }
+
+ function testInviteWrongUrl() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'POST',
+ 'REQUEST_URI' => '/calendars/user1/cal1',
+ 'CONTENT_TYPE' => 'text/xml',
+ ));
+
+ $xml = '<?xml version="1.0"?>
+<cs:invite-reply xmlns:cs="' . Plugin::NS_CALENDARSERVER . '" xmlns:d="DAV:">
+ <cs:hosturl><d:href>/principals/owner</d:href></cs:hosturl>
+</cs:invite-reply>
+';
+ $request->setBody($xml);
+ $response = $this->request($request);
+ $this->assertEquals('HTTP/1.1 501 Not Implemented', $response->status, $response->body);
+
+ // If the plugin did not handle this request, it must ensure that the
+ // body is still accessible by other plugins.
+ $this->assertEquals($xml, $request->getBody(true));
+
+ }
+
+ function testPublish() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'POST',
+ 'REQUEST_URI' => '/calendars/user1/cal1',
+ 'CONTENT_TYPE' => 'text/xml',
+ ));
+
+ $xml = '<?xml version="1.0"?>
+<cs:publish-calendar xmlns:cs="' . Plugin::NS_CALENDARSERVER . '" xmlns:d="DAV:" />
+';
+
+ $request->setBody($xml);
+
+ $response = $this->request($request);
+ $this->assertEquals('HTTP/1.1 202 Accepted', $response->status, $response->body);
+
+ }
+
+ function testUnpublish() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'POST',
+ 'REQUEST_URI' => '/calendars/user1/cal1',
+ 'CONTENT_TYPE' => 'text/xml',
+ ));
+
+ $xml = '<?xml version="1.0"?>
+<cs:unpublish-calendar xmlns:cs="' . Plugin::NS_CALENDARSERVER . '" xmlns:d="DAV:" />
+';
+
+ $request->setBody($xml);
+
+ $response = $this->request($request);
+ $this->assertEquals('HTTP/1.1 200 OK', $response->status, $response->body);
+
+ }
+
+ function testPublishWrongUrl() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'POST',
+ 'REQUEST_URI' => '/calendars/user1/cal2',
+ 'CONTENT_TYPE' => 'text/xml',
+ ));
+
+ $xml = '<?xml version="1.0"?>
+<cs:publish-calendar xmlns:cs="' . Plugin::NS_CALENDARSERVER . '" xmlns:d="DAV:" />
+';
+
+ $request->setBody($xml);
+
+ $response = $this->request($request);
+ $this->assertEquals('HTTP/1.1 501 Not Implemented', $response->status, $response->body);
+
+ }
+
+ function testUnpublishWrongUrl() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'POST',
+ 'REQUEST_URI' => '/calendars/user1/cal2',
+ 'CONTENT_TYPE' => 'text/xml',
+ ));
+
+ $xml = '<?xml version="1.0"?>
+<cs:unpublish-calendar xmlns:cs="' . Plugin::NS_CALENDARSERVER . '" xmlns:d="DAV:" />
+';
+
+ $request->setBody($xml);
+
+ $response = $this->request($request);
+ $this->assertEquals('HTTP/1.1 501 Not Implemented', $response->status, $response->body);
+
+ }
+
+ function testUnknownXmlDoc() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'POST',
+ 'REQUEST_URI' => '/calendars/user1/cal2',
+ 'CONTENT_TYPE' => 'text/xml',
+ ));
+
+ $xml = '<?xml version="1.0"?>
+<cs:foo-bar xmlns:cs="' . Plugin::NS_CALENDARSERVER . '" xmlns:d="DAV:" />';
+
+ $request->setBody($xml);
+
+ $response = $this->request($request);
+ $this->assertEquals('HTTP/1.1 501 Not Implemented', $response->status, $response->body);
+
+ }
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/TestUtil.php b/vendor/sabre/dav/tests/Sabre/CalDAV/TestUtil.php
new file mode 100644
index 000000000..19acea200
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/TestUtil.php
@@ -0,0 +1,208 @@
+<?php
+
+namespace Sabre\CalDAV;
+
+class TestUtil {
+
+ static function getBackend() {
+
+ $backend = new Backend\PDO(self::getSQLiteDB());
+ return $backend;
+
+ }
+
+ static function getSQLiteDB() {
+
+ if (file_exists(SABRE_TEMPDIR . '/testdb.sqlite'))
+ unlink(SABRE_TEMPDIR . '/testdb.sqlite');
+
+ $pdo = new \PDO('sqlite:' . SABRE_TEMPDIR . '/testdb.sqlite');
+ $pdo->setAttribute(\PDO::ATTR_ERRMODE,\PDO::ERRMODE_EXCEPTION);
+
+ // Yup this is definitely not 'fool proof', but good enough for now.
+ $queries = explode(';', file_get_contents(__DIR__ . '/../../../examples/sql/sqlite.calendars.sql'));
+ foreach($queries as $query) {
+ $pdo->exec($query);
+ }
+ // Inserting events through a backend class.
+ $backend = new Backend\PDO($pdo);
+ $calendarId = $backend->createCalendar(
+ 'principals/user1',
+ 'UUID-123467',
+ array(
+ '{DAV:}displayname' => 'user1 calendar',
+ '{urn:ietf:params:xml:ns:caldav}calendar-description' => 'Calendar description',
+ '{http://apple.com/ns/ical/}calendar-order' => '1',
+ '{http://apple.com/ns/ical/}calendar-color' => '#FF0000',
+ )
+ );
+ $backend->createCalendar(
+ 'principals/user1',
+ 'UUID-123468',
+ array(
+ '{DAV:}displayname' => 'user1 calendar2',
+ '{urn:ietf:params:xml:ns:caldav}calendar-description' => 'Calendar description',
+ '{http://apple.com/ns/ical/}calendar-order' => '1',
+ '{http://apple.com/ns/ical/}calendar-color' => '#FF0000',
+ )
+ );
+ $backend->createCalendarObject($calendarId, 'UUID-2345', self::getTestCalendarData());
+ return $pdo;
+
+ }
+
+ static function getTestCalendarData($type = 1) {
+
+ $calendarData = 'BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Apple Inc.//iCal 4.0.1//EN
+CALSCALE:GREGORIAN
+BEGIN:VTIMEZONE
+TZID:Asia/Seoul
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0900
+RRULE:FREQ=YEARLY;UNTIL=19880507T150000Z;BYMONTH=5;BYDAY=2SU
+DTSTART:19870510T000000
+TZNAME:GMT+09:00
+TZOFFSETTO:+1000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+1000
+DTSTART:19881009T000000
+TZNAME:GMT+09:00
+TZOFFSETTO:+0900
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+CREATED:20100225T154229Z
+UID:39A6B5ED-DD51-4AFE-A683-C35EE3749627
+TRANSP:TRANSPARENT
+SUMMARY:Something here
+DTSTAMP:20100228T130202Z';
+
+ switch($type) {
+ case 1 :
+ $calendarData.="\nDTSTART;TZID=Asia/Seoul:20100223T060000\nDTEND;TZID=Asia/Seoul:20100223T070000\n";
+ break;
+ case 2 :
+ $calendarData.="\nDTSTART:20100223T060000\nDTEND:20100223T070000\n";
+ break;
+ case 3 :
+ $calendarData.="\nDTSTART;VALUE=DATE:20100223\nDTEND;VALUE=DATE:20100223\n";
+ break;
+ case 4 :
+ $calendarData.="\nDTSTART;TZID=Asia/Seoul:20100223T060000\nDURATION:PT1H\n";
+ break;
+ case 5 :
+ $calendarData.="\nDTSTART;TZID=Asia/Seoul:20100223T060000\nDURATION:-P5D\n";
+ break;
+ case 6 :
+ $calendarData.="\nDTSTART;VALUE=DATE:20100223\n";
+ break;
+ case 7 :
+ $calendarData.="\nDTSTART;VALUE=DATETIME:20100223T060000\n";
+ break;
+
+ // No DTSTART, so intentionally broken
+ case 'X' :
+ $calendarData.="\n";
+ break;
+ }
+
+
+ $calendarData.='ATTENDEE;PARTSTAT=NEEDS-ACTION:mailto:lisa@example.com
+SEQUENCE:2
+END:VEVENT
+END:VCALENDAR';
+
+ return $calendarData;
+
+ }
+
+ static function getTestTODO($type = 'due') {
+
+ switch($type) {
+
+ case 'due' :
+ $extra = "DUE:20100104T000000Z";
+ break;
+ case 'due2' :
+ $extra = "DUE:20060104T000000Z";
+ break;
+ case 'due_date' :
+ $extra = "DUE;VALUE=DATE:20060104";
+ break;
+ case 'due_tz' :
+ $extra = "DUE;TZID=Asia/Seoul:20060104T000000Z";
+ break;
+ case 'due_dtstart' :
+ $extra = "DTSTART:20050223T060000Z\nDUE:20060104T000000Z";
+ break;
+ case 'due_dtstart2' :
+ $extra = "DTSTART:20090223T060000Z\nDUE:20100104T000000Z";
+ break;
+ case 'dtstart' :
+ $extra = 'DTSTART:20100223T060000Z';
+ break;
+ case 'dtstart2' :
+ $extra = 'DTSTART:20060223T060000Z';
+ break;
+ case 'dtstart_date' :
+ $extra = 'DTSTART;VALUE=DATE:20100223';
+ break;
+ case 'dtstart_tz' :
+ $extra = 'DTSTART;TZID=Asia/Seoul:20100223T060000Z';
+ break;
+ case 'dtstart_duration' :
+ $extra = "DTSTART:20061023T060000Z\nDURATION:PT1H";
+ break;
+ case 'dtstart_duration2' :
+ $extra = "DTSTART:20101023T060000Z\nDURATION:PT1H";
+ break;
+ case 'completed' :
+ $extra = 'COMPLETED:20060601T000000Z';
+ break;
+ case 'completed2' :
+ $extra = 'COMPLETED:20090601T000000Z';
+ break;
+ case 'created' :
+ $extra = 'CREATED:20060601T000000Z';
+ break;
+ case 'created2' :
+ $extra = 'CREATED:20090601T000000Z';
+ break;
+ case 'completedcreated' :
+ $extra = "CREATED:20060601T000000Z\nCOMPLETED:20070101T000000Z";
+ break;
+ case 'completedcreated2' :
+ $extra = "CREATED:20090601T000000Z\nCOMPLETED:20100101T000000Z";
+ break;
+ case 'notime' :
+ $extra = 'X-FILLER:oh hello';
+ break;
+ default :
+ throw new Exception('Unknown type: ' . $type);
+
+ }
+
+ $todo = 'BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Example Corp.//CalDAV Client//EN
+BEGIN:VTODO
+DTSTAMP:20060205T235335Z
+' . $extra . '
+STATUS:NEEDS-ACTION
+SUMMARY:Task #1
+UID:DDDEEB7915FA61233B861457@example.com
+BEGIN:VALARM
+ACTION:AUDIO
+TRIGGER;RELATED=START:-PT10M
+END:VALARM
+END:VTODO
+END:VCALENDAR';
+
+ return $todo;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/UserCalendarsSharedCalendarsTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/UserCalendarsSharedCalendarsTest.php
new file mode 100644
index 000000000..4c3bae3a4
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/UserCalendarsSharedCalendarsTest.php
@@ -0,0 +1,93 @@
+<?php
+
+namespace Sabre\CalDAV;
+
+use Sabre\DAVACL;
+
+require_once 'Sabre/CalDAV/TestUtil.php';
+
+/**
+ * @covers Sabre\CalDAV\UserCalendars
+ */
+class UserCalendarsSharedCalendarsTest extends \PHPUnit_Framework_TestCase {
+
+ protected $backend;
+
+ function getInstance() {
+
+ $calendars = array(
+ array(
+ 'id' => 1,
+ 'principaluri' => 'principals/user1',
+ ),
+ array(
+ 'id' => 2,
+ '{http://calendarserver.org/ns/}shared-url' => 'calendars/owner/cal1',
+ '{http://sabredav.org/ns}owner-principal' => 'principal/owner',
+ '{http://sabredav.org/ns}read-only' => false,
+ 'principaluri' => 'principals/user1',
+ ),
+ );
+
+ $this->backend = new Backend\Mock(
+ $calendars,
+ array(),
+ array()
+ );
+
+ return new UserCalendars($this->backend, array(
+ 'uri' => 'principals/user1'
+ ));
+
+ }
+
+ function testSimple() {
+
+ $instance = $this->getInstance();
+ $this->assertEquals('user1', $instance->getName());
+
+ }
+
+ function testGetChildren() {
+
+ $instance = $this->getInstance();
+ $children = $instance->getChildren();
+ $this->assertEquals(4, count($children));
+
+ // Testing if we got all the objects back.
+ $hasShareable = false;
+ $hasShared = false;
+ $hasOutbox = false;
+ $hasNotifications = false;
+
+ foreach($children as $child) {
+
+ if ($child instanceof IShareableCalendar) {
+ $hasShareable = true;
+ }
+ if ($child instanceof ISharedCalendar) {
+ $hasShared = true;
+ }
+ if ($child instanceof Schedule\IOutbox) {
+ $hasOutbox = true;
+ }
+ if ($child instanceof Notifications\ICollection) {
+ $hasNotifications = true;
+ }
+
+ }
+ if (!$hasShareable) $this->fail('Missing node!');
+ if (!$hasShared) $this->fail('Missing node!');
+ if (!$hasOutbox) $this->fail('Missing node!');
+ if (!$hasNotifications) $this->fail('Missing node!');
+
+ }
+
+ function testShareReply() {
+
+ $instance = $this->getInstance();
+ $instance->shareReply('uri', SharingPlugin::STATUS_DECLINED, 'curi', '1');
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/UserCalendarsTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/UserCalendarsTest.php
new file mode 100644
index 000000000..453c872e5
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/UserCalendarsTest.php
@@ -0,0 +1,207 @@
+<?php
+
+namespace Sabre\CalDAV;
+use Sabre\DAVACL;
+use Sabre\DAV;
+
+require_once 'Sabre/CalDAV/TestUtil.php';
+
+/**
+ * @covers Sabre\CalDAV\UserCalendars
+ */
+class UserCalendarsTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * @var Sabre\CalDAV\UserCalendars
+ */
+ protected $usercalendars;
+ /**
+ * @var Sabre\CalDAV\Backend\PDO
+ */
+ protected $backend;
+
+ function setup() {
+
+ if (!SABRE_HASSQLITE) $this->markTestSkipped('SQLite driver is not available');
+ $this->backend = TestUtil::getBackend();
+ $this->usercalendars = new UserCalendars($this->backend, array(
+ 'uri' => 'principals/user1'
+ ));
+
+ }
+
+ function testSimple() {
+
+ $this->assertEquals('user1',$this->usercalendars->getName());
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\NotFound
+ * @depends testSimple
+ */
+ function testGetChildNotFound() {
+
+ $this->usercalendars->getChild('randomname');
+
+ }
+
+ function testChildExists() {
+
+ $this->assertFalse($this->usercalendars->childExists('foo'));
+ $this->assertTrue($this->usercalendars->childExists('UUID-123467'));
+
+ }
+
+ function testGetOwner() {
+
+ $this->assertEquals('principals/user1', $this->usercalendars->getOwner());
+
+ }
+
+ function testGetGroup() {
+
+ $this->assertNull($this->usercalendars->getGroup());
+
+ }
+
+ function testGetACL() {
+
+ $expected = array(
+ array(
+ 'privilege' => '{DAV:}read',
+ 'principal' => 'principals/user1',
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}write',
+ 'principal' => 'principals/user1',
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}read',
+ 'principal' => 'principals/user1/calendar-proxy-write',
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}write',
+ 'principal' => 'principals/user1/calendar-proxy-write',
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}read',
+ 'principal' => 'principals/user1/calendar-proxy-read',
+ 'protected' => true,
+ ),
+ );
+ $this->assertEquals($expected, $this->usercalendars->getACL());
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\MethodNotAllowed
+ */
+ function testSetACL() {
+
+ $this->usercalendars->setACL(array());
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\Forbidden
+ * @depends testSimple
+ */
+ function testSetName() {
+
+ $this->usercalendars->setName('bla');
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\Forbidden
+ * @depends testSimple
+ */
+ function testDelete() {
+
+ $this->usercalendars->delete();
+
+ }
+
+ /**
+ * @depends testSimple
+ */
+ function testGetLastModified() {
+
+ $this->assertNull($this->usercalendars->getLastModified());
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\MethodNotAllowed
+ * @depends testSimple
+ */
+ function testCreateFile() {
+
+ $this->usercalendars->createFile('bla');
+
+ }
+
+
+ /**
+ * @expectedException Sabre\DAV\Exception\MethodNotAllowed
+ * @depends testSimple
+ */
+ function testCreateDirectory() {
+
+ $this->usercalendars->createDirectory('bla');
+
+ }
+
+ /**
+ * @depends testSimple
+ */
+ function testCreateExtendedCollection() {
+
+ $result = $this->usercalendars->createExtendedCollection('newcalendar', array('{DAV:}collection', '{urn:ietf:params:xml:ns:caldav}calendar'), array());
+ $this->assertNull($result);
+ $cals = $this->backend->getCalendarsForUser('principals/user1');
+ $this->assertEquals(3,count($cals));
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\InvalidResourceType
+ * @depends testSimple
+ */
+ function testCreateExtendedCollectionBadResourceType() {
+
+ $this->usercalendars->createExtendedCollection('newcalendar', array('{DAV:}collection','{DAV:}blabla'), array());
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\InvalidResourceType
+ * @depends testSimple
+ */
+ function testCreateExtendedCollectionNotACalendar() {
+
+ $this->usercalendars->createExtendedCollection('newcalendar', array('{DAV:}collection'), array());
+
+ }
+
+ function testGetSupportedPrivilegesSet() {
+
+ $this->assertNull($this->usercalendars->getSupportedPrivilegeSet());
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\NotImplemented
+ */
+ function testShareReplyFail() {
+
+ $this->usercalendars->shareReply('uri', SharingPlugin::STATUS_DECLINED, 'curi', '1');
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/ValidateICalTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/ValidateICalTest.php
new file mode 100644
index 000000000..6634b9c3b
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/ValidateICalTest.php
@@ -0,0 +1,250 @@
+<?php
+
+namespace Sabre\CalDAV;
+
+use Sabre\DAV;
+use Sabre\DAVACL;
+use Sabre\HTTP;
+
+require_once 'Sabre/HTTP/ResponseMock.php';
+
+class ValidateICalTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * @var Sabre\DAV\Server
+ */
+ protected $server;
+ /**
+ * @var Sabre\CalDAV\Backend\Mock
+ */
+ protected $calBackend;
+
+ function setUp() {
+
+ $calendars = array(
+ array(
+ 'id' => 'calendar1',
+ 'principaluri' => 'principals/admin',
+ 'uri' => 'calendar1',
+ '{urn:ietf:params:xml:ns:caldav}supported-calendar-component-set' => new Property\SupportedCalendarComponentSet( array('VEVENT','VTODO','VJOURNAL') ),
+ ),
+ array(
+ 'id' => 'calendar2',
+ 'principaluri' => 'principals/admin',
+ 'uri' => 'calendar2',
+ '{urn:ietf:params:xml:ns:caldav}supported-calendar-component-set' => new Property\SupportedCalendarComponentSet( array('VTODO','VJOURNAL') ),
+ )
+ );
+
+ $this->calBackend = new Backend\Mock($calendars,array());
+ $principalBackend = new DAVACL\PrincipalBackend\Mock();
+
+ $tree = array(
+ new CalendarRootNode($principalBackend, $this->calBackend),
+ );
+
+ $this->server = new DAV\Server($tree);
+ $this->server->debugExceptions = true;
+
+ $plugin = new Plugin();
+ $this->server->addPlugin($plugin);
+
+ $response = new HTTP\ResponseMock();
+ $this->server->httpResponse = $response;
+
+ }
+
+ function request(HTTP\Request $request) {
+
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ return $this->server->httpResponse;
+
+ }
+
+ function testCreateFile() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'PUT',
+ 'REQUEST_URI' => '/calendars/admin/calendar1/blabla.ics',
+ ));
+
+ $response = $this->request($request);
+
+ $this->assertEquals('HTTP/1.1 415 Unsupported Media Type', $response->status);
+
+ }
+
+ function testCreateFileValid() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'PUT',
+ 'REQUEST_URI' => '/calendars/admin/calendar1/blabla.ics',
+ ));
+ $request->setBody("BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\nUID:foo\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n");
+
+ $response = $this->request($request);
+
+ $this->assertEquals('HTTP/1.1 201 Created', $response->status, 'Incorrect status returned! Full response body: ' . $response->body);
+ $expected = array(
+ 'uri' => 'blabla.ics',
+ 'calendardata' => "BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\nUID:foo\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n",
+ 'calendarid' => 'calendar1',
+ );
+
+ $this->assertEquals($expected, $this->calBackend->getCalendarObject('calendar1','blabla.ics'));
+
+ }
+
+ function testCreateFileNoComponents() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'PUT',
+ 'REQUEST_URI' => '/calendars/admin/calendar1/blabla.ics',
+ ));
+ $request->setBody("BEGIN:VCALENDAR\r\nEND:VCALENDAR\r\n");
+
+ $response = $this->request($request);
+
+ $this->assertEquals('HTTP/1.1 400 Bad request', $response->status, 'Incorrect status returned! Full response body: ' . $response->body);
+
+ }
+
+ function testCreateFileNoUID() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'PUT',
+ 'REQUEST_URI' => '/calendars/admin/calendar1/blabla.ics',
+ ));
+ $request->setBody("BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n");
+
+ $response = $this->request($request);
+
+ $this->assertEquals('HTTP/1.1 400 Bad request', $response->status, 'Incorrect status returned! Full response body: ' . $response->body);
+
+ }
+
+ function testCreateFileVCard() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'PUT',
+ 'REQUEST_URI' => '/calendars/admin/calendar1/blabla.ics',
+ ));
+ $request->setBody("BEGIN:VCARD\r\nEND:VCARD\r\n");
+
+ $response = $this->request($request);
+
+ $this->assertEquals('HTTP/1.1 415 Unsupported Media Type', $response->status, 'Incorrect status returned! Full response body: ' . $response->body);
+
+ }
+
+ function testCreateFile2Components() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'PUT',
+ 'REQUEST_URI' => '/calendars/admin/calendar1/blabla.ics',
+ ));
+ $request->setBody("BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\nUID:foo\r\nEND:VEVENT\r\nBEGIN:VJOURNAL\r\nUID:foo\r\nEND:VJOURNAL\r\nEND:VCALENDAR\r\n");
+
+ $response = $this->request($request);
+
+ $this->assertEquals('HTTP/1.1 400 Bad request', $response->status, 'Incorrect status returned! Full response body: ' . $response->body);
+
+ }
+
+ function testCreateFile2UIDS() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'PUT',
+ 'REQUEST_URI' => '/calendars/admin/calendar1/blabla.ics',
+ ));
+ $request->setBody("BEGIN:VCALENDAR\r\nBEGIN:VTIMEZONE\r\nEND:VTIMEZONE\r\nBEGIN:VEVENT\r\nUID:foo\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:bar\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n");
+
+ $response = $this->request($request);
+
+ $this->assertEquals('HTTP/1.1 400 Bad request', $response->status, 'Incorrect status returned! Full response body: ' . $response->body);
+
+ }
+
+ function testCreateFileWrongComponent() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'PUT',
+ 'REQUEST_URI' => '/calendars/admin/calendar1/blabla.ics',
+ ));
+ $request->setBody("BEGIN:VCALENDAR\r\nBEGIN:VTIMEZONE\r\nEND:VTIMEZONE\r\nBEGIN:VFREEBUSY\r\nUID:foo\r\nEND:VFREEBUSY\r\nEND:VCALENDAR\r\n");
+
+ $response = $this->request($request);
+
+ $this->assertEquals('HTTP/1.1 400 Bad request', $response->status, 'Incorrect status returned! Full response body: ' . $response->body);
+
+ }
+
+ function testUpdateFile() {
+
+ $this->calBackend->createCalendarObject('calendar1','blabla.ics','foo');
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'PUT',
+ 'REQUEST_URI' => '/calendars/admin/calendar1/blabla.ics',
+ ));
+
+ $response = $this->request($request);
+
+ $this->assertEquals('HTTP/1.1 415 Unsupported Media Type', $response->status);
+
+ }
+
+ function testUpdateFileParsableBody() {
+
+ $this->calBackend->createCalendarObject('calendar1','blabla.ics','foo');
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'PUT',
+ 'REQUEST_URI' => '/calendars/admin/calendar1/blabla.ics',
+ ));
+ $body = "BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\nUID:foo\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n";
+ $request->setBody($body);
+
+ $response = $this->request($request);
+
+ $this->assertEquals('HTTP/1.1 204 No Content', $response->status);
+
+ $expected = array(
+ 'uri' => 'blabla.ics',
+ 'calendardata' => $body,
+ 'calendarid' => 'calendar1',
+ );
+
+ $this->assertEquals($expected, $this->calBackend->getCalendarObject('calendar1','blabla.ics'));
+
+ }
+
+ function testCreateFileInvalidComponent() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'PUT',
+ 'REQUEST_URI' => '/calendars/admin/calendar2/blabla.ics',
+ ));
+ $request->setBody("BEGIN:VCALENDAR\r\nBEGIN:VTIMEZONE\r\nEND:VTIMEZONE\r\nBEGIN:VEVENT\r\nUID:foo\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n");
+
+ $response = $this->request($request);
+
+ $this->assertEquals('HTTP/1.1 403 Forbidden', $response->status, 'Incorrect status returned! Full response body: ' . $response->body);
+
+ }
+
+ function testUpdateFileInvalidComponent() {
+
+ $this->calBackend->createCalendarObject('calendar2','blabla.ics','foo');
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'PUT',
+ 'REQUEST_URI' => '/calendars/admin/calendar2/blabla.ics',
+ ));
+ $request->setBody("BEGIN:VCALENDAR\r\nBEGIN:VTIMEZONE\r\nEND:VTIMEZONE\r\nBEGIN:VEVENT\r\nUID:foo\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n");
+
+ $response = $this->request($request);
+
+ $this->assertEquals('HTTP/1.1 403 Forbidden', $response->status, 'Incorrect status returned! Full response body: ' . $response->body);
+
+ }
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/VersionTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/VersionTest.php
new file mode 100644
index 000000000..a4e093e35
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/VersionTest.php
@@ -0,0 +1,17 @@
+<?php
+
+namespace Sabre\CalDAV;
+
+class VersionTest extends \PHPUnit_Framework_TestCase {
+
+ function testString() {
+
+ $v = Version::VERSION;
+ $this->assertEquals(-1, version_compare('1.0.0',$v));
+
+ $s = Version::STABILITY;
+ $this->assertTrue($s == 'alpha' || $s == 'beta' || $s =='stable');
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CardDAV/AbstractPluginTest.php b/vendor/sabre/dav/tests/Sabre/CardDAV/AbstractPluginTest.php
new file mode 100644
index 000000000..94081fc8b
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CardDAV/AbstractPluginTest.php
@@ -0,0 +1,41 @@
+<?php
+
+namespace Sabre\CardDAV;
+
+use Sabre\DAV;
+use Sabre\DAVACL;
+
+abstract class AbstractPluginTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * @var Sabre\CardDAV\Plugin
+ */
+ protected $plugin;
+ /**
+ * @var Sabre\DAV\Server
+ */
+ protected $server;
+ /**
+ * @var Sabre\CardDAV\Backend\Mock;
+ */
+ protected $backend;
+
+ function setUp() {
+
+ $this->backend = new Backend\Mock();
+ $principalBackend = new DAVACL\PrincipalBackend\Mock();
+
+ $tree = array(
+ new AddressBookRoot($principalBackend, $this->backend),
+ new DAVACL\PrincipalCollection($principalBackend)
+ );
+
+ $this->plugin = new Plugin();
+ $this->plugin->directories = array('directory');
+ $this->server = new DAV\Server($tree);
+ $this->server->addPlugin($this->plugin);
+ $this->server->debugExceptions = true;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CardDAV/AddressBookQueryParserTest.php b/vendor/sabre/dav/tests/Sabre/CardDAV/AddressBookQueryParserTest.php
new file mode 100644
index 000000000..51bea6c6c
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CardDAV/AddressBookQueryParserTest.php
@@ -0,0 +1,329 @@
+<?php
+
+namespace Sabre\CardDAV;
+
+use Sabre\DAV;
+
+class AddressBookQueryParserTest extends \PHPUnit_Framework_TestCase {
+
+ function parse($xml) {
+
+ $xml = implode("\n", $xml);
+ $dom = DAV\XMLUtil::loadDOMDocument($xml);
+
+ $q = new AddressBookQueryParser($dom);
+ $q->parse();
+ return $q;
+
+ }
+
+ function testFilterBasic() {
+
+ $xml = array(
+ '<?xml version="1.0"?>',
+ '<c:addressbook-query xmlns:c="urn:ietf:params:xml:ns:carddav" xmlns:d="DAV:">',
+ ' <d:prop>',
+ ' <d:foo />',
+ ' </d:prop>',
+ ' <c:filter>',
+ ' <c:prop-filter name="NICKNAME" />',
+ ' </c:filter>',
+ '</c:addressbook-query>'
+ );
+
+ $q = $this->parse($xml);
+
+ $this->assertEquals(
+ array('{DAV:}foo'),
+ $q->requestedProperties
+ );
+
+ $this->assertEquals(
+ array(
+ array(
+ 'name' => 'NICKNAME',
+ 'test' => 'anyof',
+ 'is-not-defined' => false,
+ 'param-filters' => array(),
+ 'text-matches' => array(),
+ ),
+ ),
+ $q->filters
+ );
+
+ $this->assertNull($q->limit);
+ $this->assertEquals('anyof', $q->test);
+
+ }
+
+ function testNoFilter() {
+
+ // This is non-standard, but helps working around a KDE bug
+ $xml = array(
+ '<?xml version="1.0"?>',
+ '<c:addressbook-query xmlns:c="urn:ietf:params:xml:ns:carddav" xmlns:d="DAV:">',
+ ' <d:prop>',
+ ' <d:foo />',
+ ' </d:prop>',
+ '</c:addressbook-query>'
+ );
+
+ $q = $this->parse($xml);
+
+ $this->assertEquals(
+ array('{DAV:}foo'),
+ $q->requestedProperties
+ );
+
+ $this->assertEquals(
+ array(),
+ $q->filters
+ );
+
+ $this->assertNull($q->limit);
+ $this->assertEquals('anyof', $q->test);
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\BadRequest
+ */
+ function testFilterDoubleFilter() {
+
+ $xml = array(
+ '<?xml version="1.0"?>',
+ '<c:addressbook-query xmlns:c="urn:ietf:params:xml:ns:carddav" xmlns:d="DAV:">',
+ ' <d:prop>',
+ ' <d:foo />',
+ ' </d:prop>',
+ ' <c:filter>',
+ ' <c:prop-filter name="NICKNAME" />',
+ ' </c:filter>',
+ ' <c:filter>',
+ ' <c:prop-filter name="NICKNAME" />',
+ ' </c:filter>',
+ '</c:addressbook-query>'
+ );
+
+ $q = $this->parse($xml);
+
+ }
+ /**
+ * @expectedException Sabre\DAV\Exception\BadRequest
+ */
+ function testFilterCorruptTest() {
+
+ $xml = array(
+ '<?xml version="1.0"?>',
+ '<c:addressbook-query xmlns:c="urn:ietf:params:xml:ns:carddav" xmlns:d="DAV:">',
+ ' <d:prop>',
+ ' <d:foo />',
+ ' </d:prop>',
+ ' <c:filter test="foo">',
+ ' <c:prop-filter name="NICKNAME" />',
+ ' </c:filter>',
+ '</c:addressbook-query>'
+ );
+
+ $q = $this->parse($xml);
+
+ }
+
+ function testPropFilter() {
+
+ $xml = array(
+ '<?xml version="1.0"?>',
+ '<c:addressbook-query xmlns:c="urn:ietf:params:xml:ns:carddav" xmlns:d="DAV:">',
+ ' <d:prop>',
+ ' <d:foo />',
+ ' </d:prop>',
+ ' <c:filter test="allof">',
+ ' <c:prop-filter name="NICKNAME" />',
+ ' <c:prop-filter name="EMAIL" test="allof" />',
+ ' <c:prop-filter name="FN">',
+ ' <c:is-not-defined />',
+ ' </c:prop-filter>',
+ ' </c:filter>',
+ ' <c:limit><c:nresults>4</c:nresults></c:limit>',
+ '</c:addressbook-query>'
+ );
+
+ $q = $this->parse($xml);
+
+ $this->assertEquals(
+ array(
+ array(
+ 'name' => 'NICKNAME',
+ 'test' => 'anyof',
+ 'is-not-defined' => false,
+ 'param-filters' => array(),
+ 'text-matches' => array(),
+ ),
+ array(
+ 'name' => 'EMAIL',
+ 'test' => 'allof',
+ 'is-not-defined' => false,
+ 'param-filters' => array(),
+ 'text-matches' => array(),
+ ),
+ array(
+ 'name' => 'FN',
+ 'test' => 'anyof',
+ 'is-not-defined' => true,
+ 'param-filters' => array(),
+ 'text-matches' => array(),
+ ),
+ ),
+ $q->filters
+ );
+
+ $this->assertEquals(4,$q->limit);
+ $this->assertEquals('allof', $q->test);
+
+ }
+
+ function testParamFilter() {
+
+ $xml = array(
+ '<?xml version="1.0"?>',
+ '<c:addressbook-query xmlns:c="urn:ietf:params:xml:ns:carddav" xmlns:d="DAV:">',
+ ' <d:prop>',
+ ' <d:foo />',
+ ' </d:prop>',
+ ' <c:filter>',
+ ' <c:prop-filter name="NICKNAME">',
+ ' <c:param-filter name="BLA" />',
+ ' <c:param-filter name="BLA2">',
+ ' <c:is-not-defined />',
+ ' </c:param-filter>',
+ ' </c:prop-filter>',
+ ' </c:filter>',
+ '</c:addressbook-query>'
+ );
+
+ $q = $this->parse($xml);
+
+ $this->assertEquals(
+ array(
+ array(
+ 'name' => 'NICKNAME',
+ 'test' => 'anyof',
+ 'is-not-defined' => false,
+ 'param-filters' => array(
+ array(
+ 'name' => 'BLA',
+ 'is-not-defined' => false,
+ 'text-match' => null
+ ),
+ array(
+ 'name' => 'BLA2',
+ 'is-not-defined' => true,
+ 'text-match' => null
+ ),
+ ),
+ 'text-matches' => array(),
+ ),
+ ),
+ $q->filters
+ );
+
+ }
+
+ function testTextMatch() {
+
+ $xml = array(
+ '<?xml version="1.0"?>',
+ '<c:addressbook-query xmlns:c="urn:ietf:params:xml:ns:carddav" xmlns:d="DAV:">',
+ ' <d:prop>',
+ ' <d:foo />',
+ ' </d:prop>',
+ ' <c:filter>',
+ ' <c:prop-filter name="NICKNAME">',
+ ' <c:text-match>evert</c:text-match>',
+ ' <c:text-match collation="i;octet">evert</c:text-match>',
+ ' <c:text-match negate-condition="yes">rene</c:text-match>',
+ ' <c:text-match match-type="starts-with">e</c:text-match>',
+ ' <c:param-filter name="BLA">',
+ ' <c:text-match>foo</c:text-match>',
+ ' </c:param-filter>',
+ ' </c:prop-filter>',
+ ' </c:filter>',
+ '</c:addressbook-query>'
+ );
+
+ $q = $this->parse($xml);
+
+ $this->assertEquals(
+ array(
+ array(
+ 'name' => 'NICKNAME',
+ 'test' => 'anyof',
+ 'is-not-defined' => false,
+ 'param-filters' => array(
+ array(
+ 'name' => 'BLA',
+ 'is-not-defined' => false,
+ 'text-match' => array(
+ 'negate-condition' => false,
+ 'collation' => 'i;unicode-casemap',
+ 'match-type' => 'contains',
+ 'value' => 'foo',
+ ),
+ ),
+ ),
+ 'text-matches' => array(
+ array(
+ 'negate-condition' => false,
+ 'collation' => 'i;unicode-casemap',
+ 'match-type' => 'contains',
+ 'value' => 'evert',
+ ),
+ array(
+ 'negate-condition' => false,
+ 'collation' => 'i;octet',
+ 'match-type' => 'contains',
+ 'value' => 'evert',
+ ),
+ array(
+ 'negate-condition' => true,
+ 'collation' => 'i;unicode-casemap',
+ 'match-type' => 'contains',
+ 'value' => 'rene',
+ ),
+ array(
+ 'negate-condition' => false,
+ 'collation' => 'i;unicode-casemap',
+ 'match-type' => 'starts-with',
+ 'value' => 'e',
+ ),
+ ),
+ ),
+ ),
+ $q->filters
+ );
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\BadRequest
+ */
+ function testBadTextMatch() {
+
+ $xml = array(
+ '<?xml version="1.0"?>',
+ '<c:addressbook-query xmlns:c="urn:ietf:params:xml:ns:carddav" xmlns:d="DAV:">',
+ ' <d:prop>',
+ ' <d:foo />',
+ ' </d:prop>',
+ ' <c:filter>',
+ ' <c:prop-filter name="NICKNAME">',
+ ' <c:text-match match-type="foo">evert</c:text-match>',
+ ' </c:prop-filter>',
+ ' </c:filter>',
+ '</c:addressbook-query>'
+ );
+
+ $q = $this->parse($xml);
+
+ }
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CardDAV/AddressBookQueryTest.php b/vendor/sabre/dav/tests/Sabre/CardDAV/AddressBookQueryTest.php
new file mode 100644
index 000000000..c79f7e877
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CardDAV/AddressBookQueryTest.php
@@ -0,0 +1,192 @@
+<?php
+
+namespace Sabre\CardDAV;
+
+use Sabre\HTTP;
+use Sabre\DAV;
+
+require_once 'Sabre/CardDAV/AbstractPluginTest.php';
+require_once 'Sabre/HTTP/ResponseMock.php';
+
+class AddressBookQueryTest extends AbstractPluginTest {
+
+ function testQuery() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'REPORT',
+ 'REQUEST_URI' => '/addressbooks/user1/book1',
+ 'HTTP_DEPTH' => '1',
+ ));
+
+ $request->setBody(
+'<?xml version="1.0"?>
+<c:addressbook-query xmlns:d="DAV:" xmlns:c="urn:ietf:params:xml:ns:carddav">
+ <d:prop>
+ <d:getetag />
+ </d:prop>
+ <c:filter>
+ <c:prop-filter name="uid" />
+ </c:filter>
+</c:addressbook-query>'
+ );
+
+ $response = new HTTP\ResponseMock();
+
+ $this->server->httpRequest = $request;
+ $this->server->httpResponse = $response;
+
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 207 Multi-Status', $response->status, 'Incorrect status code. Full response body:' . $response->body);
+
+ // using the client for parsing
+ $client = new DAV\Client(array('baseUri'=>'/'));
+
+ $result = $client->parseMultiStatus($response->body);
+
+ $this->assertEquals(array(
+ '/addressbooks/user1/book1/card1' => array(
+ 200 => array(
+ '{DAV:}getetag' => '"' . md5("BEGIN:VCARD\nVERSION:3.0\nUID:12345\nEND:VCARD") . '"',
+ ),
+ ),
+ '/addressbooks/user1/book1/card2' => array(
+ 404 => array(
+ '{DAV:}getetag' => null,
+ ),
+ )
+ ), $result);
+
+
+ }
+
+ function testQueryDepth0() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'REPORT',
+ 'REQUEST_URI' => '/addressbooks/user1/book1/card1',
+ 'HTTP_DEPTH' => '0',
+ ));
+
+ $request->setBody(
+'<?xml version="1.0"?>
+<c:addressbook-query xmlns:d="DAV:" xmlns:c="urn:ietf:params:xml:ns:carddav">
+ <d:prop>
+ <d:getetag />
+ </d:prop>
+ <c:filter>
+ <c:prop-filter name="uid" />
+ </c:filter>
+</c:addressbook-query>'
+ );
+
+ $response = new HTTP\ResponseMock();
+
+ $this->server->httpRequest = $request;
+ $this->server->httpResponse = $response;
+
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 207 Multi-Status', $response->status, 'Incorrect status code. Full response body:' . $response->body);
+
+ // using the client for parsing
+ $client = new DAV\Client(array('baseUri'=>'/'));
+
+ $result = $client->parseMultiStatus($response->body);
+
+ $this->assertEquals(array(
+ '/addressbooks/user1/book1/card1' => array(
+ 200 => array(
+ '{DAV:}getetag' => '"' . md5("BEGIN:VCARD\nVERSION:3.0\nUID:12345\nEND:VCARD") . '"',
+ ),
+ ),
+ ), $result);
+
+
+ }
+
+ function testQueryNoMatch() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'REPORT',
+ 'REQUEST_URI' => '/addressbooks/user1/book1',
+ 'HTTP_DEPTH' => '1',
+ ));
+
+ $request->setBody(
+'<?xml version="1.0"?>
+<c:addressbook-query xmlns:d="DAV:" xmlns:c="urn:ietf:params:xml:ns:carddav">
+ <d:prop>
+ <d:getetag />
+ </d:prop>
+ <c:filter>
+ <c:prop-filter name="email" />
+ </c:filter>
+</c:addressbook-query>'
+ );
+
+ $response = new HTTP\ResponseMock();
+
+ $this->server->httpRequest = $request;
+ $this->server->httpResponse = $response;
+
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 207 Multi-Status', $response->status, 'Incorrect status code. Full response body:' . $response->body);
+
+ // using the client for parsing
+ $client = new DAV\Client(array('baseUri'=>'/'));
+
+ $result = $client->parseMultiStatus($response->body);
+
+ $this->assertEquals(array(), $result);
+
+ }
+
+ function testQueryLimit() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'REPORT',
+ 'REQUEST_URI' => '/addressbooks/user1/book1',
+ 'HTTP_DEPTH' => '1',
+ ));
+
+ $request->setBody(
+'<?xml version="1.0"?>
+<c:addressbook-query xmlns:d="DAV:" xmlns:c="urn:ietf:params:xml:ns:carddav">
+ <d:prop>
+ <d:getetag />
+ </d:prop>
+ <c:filter>
+ <c:prop-filter name="uid" />
+ </c:filter>
+ <c:limit><c:nresults>1</c:nresults></c:limit>
+</c:addressbook-query>'
+ );
+
+ $response = new HTTP\ResponseMock();
+
+ $this->server->httpRequest = $request;
+ $this->server->httpResponse = $response;
+
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 207 Multi-Status', $response->status, 'Incorrect status code. Full response body:' . $response->body);
+
+ // using the client for parsing
+ $client = new DAV\Client(array('baseUri'=>'/'));
+
+ $result = $client->parseMultiStatus($response->body);
+
+ $this->assertEquals(array(
+ '/addressbooks/user1/book1/card1' => array(
+ 200 => array(
+ '{DAV:}getetag' => '"' . md5("BEGIN:VCARD\nVERSION:3.0\nUID:12345\nEND:VCARD"). '"',
+ ),
+ ),
+ ), $result);
+
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CardDAV/AddressBookRootTest.php b/vendor/sabre/dav/tests/Sabre/CardDAV/AddressBookRootTest.php
new file mode 100644
index 000000000..6eaff5db0
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CardDAV/AddressBookRootTest.php
@@ -0,0 +1,31 @@
+<?php
+
+namespace Sabre\CardDAV;
+
+use Sabre\DAVACL;
+
+class AddressBookRootTest extends \PHPUnit_Framework_TestCase {
+
+ function testGetName() {
+
+ $pBackend = new DAVACL\PrincipalBackend\Mock();
+ $cBackend = new Backend\Mock();
+ $root = new AddressBookRoot($pBackend, $cBackend);
+ $this->assertEquals('addressbooks', $root->getName());
+
+ }
+
+ function testGetChildForPrincipal() {
+
+ $pBackend = new DAVACL\PrincipalBackend\Mock();
+ $cBackend = new Backend\Mock();
+ $root = new AddressBookRoot($pBackend, $cBackend);
+
+ $children = $root->getChildren();
+ $this->assertEquals(3, count($children));
+
+ $this->assertInstanceOf('Sabre\\CardDAV\\UserAddressBooks', $children[0]);
+ $this->assertEquals('user1', $children[0]->getName());
+
+ }
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CardDAV/AddressBookTest.php b/vendor/sabre/dav/tests/Sabre/CardDAV/AddressBookTest.php
new file mode 100644
index 000000000..aac749b37
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CardDAV/AddressBookTest.php
@@ -0,0 +1,162 @@
+<?php
+
+namespace Sabre\CardDAV;
+
+
+require_once 'Sabre/CardDAV/Backend/Mock.php';
+
+class AddressBookTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * @var Sabre\CardDAV\AddressBook
+ */
+ protected $ab;
+ protected $backend;
+
+ function setUp() {
+
+ $this->backend = new Backend\Mock();
+ $this->ab = new AddressBook(
+ $this->backend,
+ array(
+ 'uri' => 'book1',
+ 'id' => 'foo',
+ '{DAV:}displayname' => 'd-name',
+ 'principaluri' => 'principals/user1',
+ )
+ );
+
+ }
+
+ function testGetName() {
+
+ $this->assertEquals('book1', $this->ab->getName());
+
+ }
+
+ function testGetChild() {
+
+ $card = $this->ab->getChild('card1');
+ $this->assertInstanceOf('Sabre\\CardDAV\\Card', $card);
+ $this->assertEquals('card1', $card->getName());
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\NotFound
+ */
+ function testGetChildNotFound() {
+
+ $card = $this->ab->getChild('card3');
+
+ }
+
+ function testGetChildren() {
+
+ $cards = $this->ab->getChildren();
+ $this->assertEquals(2, count($cards));
+
+ $this->assertEquals('card1', $cards[0]->getName());
+ $this->assertEquals('card2', $cards[1]->getName());
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\MethodNotAllowed
+ */
+ function testCreateDirectory() {
+
+ $this->ab->createDirectory('name');
+
+ }
+
+ function testCreateFile() {
+
+ $file = fopen('php://memory','r+');
+ fwrite($file,'foo');
+ rewind($file);
+ $this->ab->createFile('card2',$file);
+
+ $this->assertEquals('foo', $this->backend->cards['foo']['card2']);
+
+ }
+
+ function testDelete() {
+
+ $this->ab->delete();
+ $this->assertEquals(array(), $this->backend->addressBooks);
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\MethodNotAllowed
+ */
+ function testSetName() {
+
+ $this->ab->setName('foo');
+
+ }
+
+ function testGetLastModified() {
+
+ $this->assertNull($this->ab->getLastModified());
+
+ }
+
+ function testUpdateProperties() {
+
+ $this->assertTrue(
+ $this->ab->updateProperties(array('{DAV:}displayname' => 'barrr'))
+ );
+
+ $this->assertEquals('barrr', $this->backend->addressBooks[0]['{DAV:}displayname']);
+
+ }
+
+ function testGetProperties() {
+
+ $props = $this->ab->getProperties(array('{DAV:}displayname'));
+ $this->assertEquals(array(
+ '{DAV:}displayname' => 'd-name',
+ ), $props);
+
+ }
+
+ function testACLMethods() {
+
+ $this->assertEquals('principals/user1', $this->ab->getOwner());
+ $this->assertNull($this->ab->getGroup());
+ $this->assertEquals(array(
+ array(
+ 'privilege' => '{DAV:}read',
+ 'principal' => 'principals/user1',
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}write',
+ 'principal' => 'principals/user1',
+ 'protected' => true,
+ ),
+ ), $this->ab->getACL());
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\MethodNotAllowed
+ */
+ function testSetACL() {
+
+ $this->ab->setACL(array());
+
+ }
+
+ function testGetSupportedPrivilegeSet() {
+
+ $this->assertNull(
+ $this->ab->getSupportedPrivilegeSet()
+ );
+
+ }
+
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CardDAV/Backend/AbstractPDOTest.php b/vendor/sabre/dav/tests/Sabre/CardDAV/Backend/AbstractPDOTest.php
new file mode 100644
index 000000000..623188d32
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CardDAV/Backend/AbstractPDOTest.php
@@ -0,0 +1,249 @@
+<?php
+
+namespace Sabre\CardDAV\Backend;
+
+use Sabre\CardDAV;
+
+abstract class AbstractPDOTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * @var CardDAV\Backend\PDO
+ */
+ protected $backend;
+
+ /**
+ * @abstract
+ * @return PDO
+ */
+ abstract function getPDO();
+
+ public function setUp() {
+
+ $this->backend = new PDO($this->getPDO());
+
+ }
+
+ public function testGetAddressBooksForUser() {
+
+ $result = $this->backend->getAddressBooksForUser('principals/user1');
+
+ $expected = array(
+ array(
+ 'id' => 1,
+ 'uri' => 'book1',
+ 'principaluri' => 'principals/user1',
+ '{DAV:}displayname' => 'book1',
+ '{' . CardDAV\Plugin::NS_CARDDAV . '}addressbook-description' => 'addressbook 1',
+ '{http://calendarserver.org/ns/}getctag' => 1,
+ '{' . CardDAV\Plugin::NS_CARDDAV . '}supported-address-data' => new CardDAV\Property\SupportedAddressData(),
+ )
+ );
+
+ $this->assertEquals($expected, $result);
+
+ }
+
+ public function testUpdateAddressBookInvalidProp() {
+
+ $result = $this->backend->updateAddressBook(1, array(
+ '{DAV:}displayname' => 'updated',
+ '{' . CardDAV\Plugin::NS_CARDDAV . '}addressbook-description' => 'updated',
+ '{DAV:}foo' => 'bar',
+ ));
+
+ $this->assertFalse($result);
+
+ $result = $this->backend->getAddressBooksForUser('principals/user1');
+
+ $expected = array(
+ array(
+ 'id' => 1,
+ 'uri' => 'book1',
+ 'principaluri' => 'principals/user1',
+ '{DAV:}displayname' => 'book1',
+ '{' . CardDAV\Plugin::NS_CARDDAV . '}addressbook-description' => 'addressbook 1',
+ '{http://calendarserver.org/ns/}getctag' => 1,
+ '{' . CardDAV\Plugin::NS_CARDDAV . '}supported-address-data' => new CardDAV\Property\SupportedAddressData(),
+ )
+ );
+
+ $this->assertEquals($expected, $result);
+
+ }
+
+ public function testUpdateAddressBookNoProps() {
+
+ $result = $this->backend->updateAddressBook(1, array());
+
+ $this->assertFalse($result);
+
+ $result = $this->backend->getAddressBooksForUser('principals/user1');
+
+ $expected = array(
+ array(
+ 'id' => 1,
+ 'uri' => 'book1',
+ 'principaluri' => 'principals/user1',
+ '{DAV:}displayname' => 'book1',
+ '{' . CardDAV\Plugin::NS_CARDDAV . '}addressbook-description' => 'addressbook 1',
+ '{http://calendarserver.org/ns/}getctag' => 1,
+ '{' . CardDAV\Plugin::NS_CARDDAV . '}supported-address-data' => new CardDAV\Property\SupportedAddressData(),
+ )
+ );
+
+ $this->assertEquals($expected, $result);
+
+
+ }
+
+ public function testUpdateAddressBookSuccess() {
+
+ $result = $this->backend->updateAddressBook(1, array(
+ '{DAV:}displayname' => 'updated',
+ '{' . CardDAV\Plugin::NS_CARDDAV . '}addressbook-description' => 'updated',
+ ));
+
+ $this->assertTrue($result);
+
+ $result = $this->backend->getAddressBooksForUser('principals/user1');
+
+ $expected = array(
+ array(
+ 'id' => 1,
+ 'uri' => 'book1',
+ 'principaluri' => 'principals/user1',
+ '{DAV:}displayname' => 'updated',
+ '{' . CardDAV\Plugin::NS_CARDDAV . '}addressbook-description' => 'updated',
+ '{http://calendarserver.org/ns/}getctag' => 2,
+ '{' . CardDAV\Plugin::NS_CARDDAV . '}supported-address-data' => new CardDAV\Property\SupportedAddressData(),
+ )
+ );
+
+ $this->assertEquals($expected, $result);
+
+
+ }
+
+ public function testDeleteAddressBook() {
+
+ $this->backend->deleteAddressBook(1);
+
+ $this->assertEquals(array(), $this->backend->getAddressBooksForUser('principals/user1'));
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\BadRequest
+ */
+ public function testCreateAddressBookUnsupportedProp() {
+
+ $this->backend->createAddressBook('principals/user1','book2', array(
+ '{DAV:}foo' => 'bar',
+ ));
+
+ }
+
+ public function testCreateAddressBookSuccess() {
+
+ $this->backend->createAddressBook('principals/user1','book2', array(
+ '{DAV:}displayname' => 'book2',
+ '{' . CardDAV\Plugin::NS_CARDDAV . '}addressbook-description' => 'addressbook 2',
+ ));
+
+ $expected = array(
+ array(
+ 'id' => 1,
+ 'uri' => 'book1',
+ 'principaluri' => 'principals/user1',
+ '{DAV:}displayname' => 'book1',
+ '{' . CardDAV\Plugin::NS_CARDDAV . '}addressbook-description' => 'addressbook 1',
+ '{http://calendarserver.org/ns/}getctag' => 1,
+ '{' . CardDAV\Plugin::NS_CARDDAV . '}supported-address-data' => new CardDAV\Property\SupportedAddressData(),
+ ),
+ array(
+ 'id' => 2,
+ 'uri' => 'book2',
+ 'principaluri' => 'principals/user1',
+ '{DAV:}displayname' => 'book2',
+ '{' . CardDAV\Plugin::NS_CARDDAV . '}addressbook-description' => 'addressbook 2',
+ '{http://calendarserver.org/ns/}getctag' => 1,
+ '{' . CardDAV\Plugin::NS_CARDDAV . '}supported-address-data' => new CardDAV\Property\SupportedAddressData(),
+ )
+ );
+ $result = $this->backend->getAddressBooksForUser('principals/user1');
+ $this->assertEquals($expected, $result);
+
+ }
+
+ public function testGetCards() {
+
+ $result = $this->backend->getCards(1);
+
+ $expected = array(
+ array(
+ 'id' => 1,
+ 'uri' => 'card1',
+ 'carddata' => 'card1',
+ 'lastmodified' => 0,
+ )
+ );
+
+ $this->assertEquals($expected, $result);
+
+ }
+
+ public function testGetCard() {
+
+ $result = $this->backend->getCard(1,'card1');
+
+ $expected = array(
+ 'id' => 1,
+ 'uri' => 'card1',
+ 'carddata' => 'card1',
+ 'lastmodified' => 0,
+ );
+
+ $this->assertEquals($expected, $result);
+
+ }
+
+ /**
+ * @depends testGetCard
+ */
+ public function testCreateCard() {
+
+ $result = $this->backend->createCard(1, 'card2', 'data2');
+ $this->assertEquals('"' . md5('data2') . '"', $result);
+ $result = $this->backend->getCard(1,'card2');
+ $this->assertEquals(2, $result['id']);
+ $this->assertEquals('card2', $result['uri']);
+ $this->assertEquals('data2', $result['carddata']);
+
+ }
+
+ /**
+ * @depends testGetCard
+ */
+ public function testUpdateCard() {
+
+ $result = $this->backend->updateCard(1, 'card1', 'newdata');
+ $this->assertEquals('"' . md5('newdata') . '"', $result);
+
+ $result = $this->backend->getCard(1,'card1');
+ $this->assertEquals(1, $result['id']);
+ $this->assertEquals('newdata', $result['carddata']);
+
+ }
+
+ /**
+ * @depends testGetCard
+ */
+ public function testDeleteCard() {
+
+ $this->backend->deleteCard(1, 'card1');
+ $result = $this->backend->getCard(1,'card1');
+ $this->assertFalse($result);
+
+ }
+}
+
diff --git a/vendor/sabre/dav/tests/Sabre/CardDAV/Backend/Mock.php b/vendor/sabre/dav/tests/Sabre/CardDAV/Backend/Mock.php
new file mode 100644
index 000000000..ab7ac4e6a
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CardDAV/Backend/Mock.php
@@ -0,0 +1,130 @@
+<?php
+
+namespace Sabre\CardDAV\Backend;
+
+class Mock extends AbstractBackend {
+
+ public $addressBooks;
+ public $cards;
+
+ function __construct($addressBooks = null, $cards = null) {
+
+ $this->addressBooks = $addressBooks;
+ $this->cards = $cards;
+
+ if (is_null($this->addressBooks)) {
+ $this->addressBooks = array(
+ array(
+ 'id' => 'foo',
+ 'uri' => 'book1',
+ 'principaluri' => 'principals/user1',
+ '{DAV:}displayname' => 'd-name',
+ ),
+ );
+
+ $card2 = fopen('php://memory','r+');
+ fwrite($card2,"BEGIN:VCARD\nVERSION:3.0\nUID:45678\nEND:VCARD");
+ rewind($card2);
+ $this->cards = array(
+ 'foo' => array(
+ 'card1' => "BEGIN:VCARD\nVERSION:3.0\nUID:12345\nEND:VCARD",
+ 'card2' => $card2,
+ ),
+ );
+ }
+
+ }
+
+
+ function getAddressBooksForUser($principalUri) {
+
+ $books = array();
+ foreach($this->addressBooks as $book) {
+ if ($book['principaluri'] === $principalUri) {
+ $books[] = $book;
+ }
+ }
+ return $books;
+
+ }
+
+ function updateAddressBook($addressBookId, array $mutations) {
+
+ foreach($this->addressBooks as &$book) {
+ if ($book['id'] !== $addressBookId)
+ continue;
+
+ foreach($mutations as $key=>$value) {
+ $book[$key] = $value;
+ }
+ return true;
+ }
+ return false;
+
+ }
+
+ function createAddressBook($principalUri, $url, array $properties) {
+
+ $this->addressBooks[] = array_merge($properties, array(
+ 'id' => $url,
+ 'uri' => $url,
+ 'principaluri' => $principalUri,
+ ));
+
+ }
+
+ function deleteAddressBook($addressBookId) {
+
+ foreach($this->addressBooks as $key=>$value) {
+ if ($value['id'] === $addressBookId)
+ unset($this->addressBooks[$key]);
+ }
+ unset($this->cards[$addressBookId]);
+
+ }
+
+ function getCards($addressBookId) {
+
+ $cards = array();
+ foreach($this->cards[$addressBookId] as $uri=>$data) {
+ $cards[] = array(
+ 'uri' => $uri,
+ 'carddata' => $data,
+ );
+ }
+ return $cards;
+
+ }
+
+ function getCard($addressBookId, $cardUri) {
+
+ if (!isset($this->cards[$addressBookId][$cardUri])) {
+ return false;
+ }
+
+ return array(
+ 'uri' => $cardUri,
+ 'carddata' => $this->cards[$addressBookId][$cardUri],
+ );
+
+ }
+
+ function createCard($addressBookId, $cardUri, $cardData) {
+
+ $this->cards[$addressBookId][$cardUri] = $cardData;
+
+ }
+
+ function updateCard($addressBookId, $cardUri, $cardData) {
+
+ $this->cards[$addressBookId][$cardUri] = $cardData;
+
+ }
+
+ function deleteCard($addressBookId, $cardUri) {
+
+ unset($this->cards[$addressBookId][$cardUri]);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CardDAV/Backend/PDOMySQLTest.php b/vendor/sabre/dav/tests/Sabre/CardDAV/Backend/PDOMySQLTest.php
new file mode 100644
index 000000000..b2f871f6e
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CardDAV/Backend/PDOMySQLTest.php
@@ -0,0 +1,60 @@
+<?php
+
+namespace Sabre\CardDAV\Backend;
+
+require_once 'Sabre/TestUtil.php';
+
+class PDOMySQLTest extends AbstractPDOTest {
+
+ /**
+ * @return PDO
+ */
+ public function getPDO() {
+
+ if (!SABRE_HASMYSQL) $this->markTestSkipped('MySQL driver is not available, or not properly configured');
+
+ $pdo = \Sabre\TestUtil::getMySQLDB();
+ if (!$pdo) $this->markTestSkipped('Could not connect to MySQL database');
+
+ $pdo->query("DROP TABLE IF EXISTS addressbooks");
+ $pdo->query("DROP TABLE IF EXISTS cards");
+ $pdo->query("
+CREATE TABLE addressbooks (
+ id INT(11) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ principaluri VARCHAR(255),
+ displayname VARCHAR(255),
+ uri VARCHAR(100),
+ description TEXT,
+ ctag INT(11) UNSIGNED NOT NULL DEFAULT '1'
+);
+");
+
+ $pdo->query("
+INSERT INTO addressbooks
+ (principaluri, displayname, uri, description, ctag)
+VALUES
+ ('principals/user1', 'book1', 'book1', 'addressbook 1', 1);
+");
+
+ $pdo->query("
+CREATE TABLE cards (
+ id INT(11) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ addressbookid INT(11) UNSIGNED NOT NULL,
+ carddata TEXT,
+ uri VARCHAR(100),
+ lastmodified INT(11) UNSIGNED
+);
+");
+
+ $pdo->query("
+INSERT INTO cards
+ (addressbookid, carddata, uri, lastmodified)
+VALUES
+ (1, 'card1', 'card1', 0);
+");
+ return $pdo;
+
+ }
+
+}
+
diff --git a/vendor/sabre/dav/tests/Sabre/CardDAV/Backend/PDOSqliteTest.php b/vendor/sabre/dav/tests/Sabre/CardDAV/Backend/PDOSqliteTest.php
new file mode 100644
index 000000000..a9bbb0bd1
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CardDAV/Backend/PDOSqliteTest.php
@@ -0,0 +1,69 @@
+<?php
+
+namespace Sabre\CardDAV\Backend;
+
+require_once 'Sabre/TestUtil.php';
+
+class PDOSqliteTest extends AbstractPDOTest {
+
+ function tearDown() {
+
+ if (file_exists(SABRE_TEMPDIR . '/pdobackend')) unlink(SABRE_TEMPDIR . '/pdobackend');
+ if (file_exists(SABRE_TEMPDIR . '/pdobackend2')) unlink(SABRE_TEMPDIR . '/pdobackend2');
+
+ }
+
+ /**
+ * @return PDO
+ */
+ function getPDO() {
+
+ if (!SABRE_HASSQLITE) $this->markTestSkipped('SQLite driver is not available');
+ $pdo = new \PDO('sqlite:'.SABRE_TEMPDIR.'/pdobackend');
+ $pdo->setAttribute(\PDO::ATTR_ERRMODE,\PDO::ERRMODE_EXCEPTION);
+
+ $pdo->query("DROP TABLE IF EXISTS addressbooks");
+ $pdo->query("DROP TABLE IF EXISTS cards");
+ $pdo->query("
+CREATE TABLE addressbooks (
+ id integer primary key asc,
+ principaluri text,
+ displayname text,
+ uri text,
+ description text,
+ ctag integer
+);
+
+");
+
+ $pdo->query("
+INSERT INTO addressbooks
+ (principaluri, displayname, uri, description, ctag)
+VALUES
+ ('principals/user1', 'book1', 'book1', 'addressbook 1', 1);
+");
+
+ $pdo->query("
+
+CREATE TABLE cards (
+ id integer primary key asc,
+ addressbookid integer,
+ carddata text,
+ uri text,
+ lastmodified integer
+);
+
+");
+ $pdo->query("
+INSERT INTO cards
+ (addressbookid, carddata, uri, lastmodified)
+VALUES
+ (1, 'card1', 'card1', 0);
+");
+
+ return $pdo;
+
+ }
+
+}
+
diff --git a/vendor/sabre/dav/tests/Sabre/CardDAV/CardTest.php b/vendor/sabre/dav/tests/Sabre/CardDAV/CardTest.php
new file mode 100644
index 000000000..438bd2ea5
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CardDAV/CardTest.php
@@ -0,0 +1,184 @@
+<?php
+
+namespace Sabre\CardDAV;
+
+class CardTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * @var Sabre\CardDAV\Card
+ */
+ protected $card;
+ /**
+ * @var Sabre\CardDAV\MockBackend
+ */
+ protected $backend;
+
+ function setUp() {
+
+ $this->backend = new Backend\Mock();
+ $this->card = new Card(
+ $this->backend,
+ array(
+ 'uri' => 'book1',
+ 'id' => 'foo',
+ 'principaluri' => 'principals/user1',
+ ),
+ array(
+ 'uri' => 'card1',
+ 'addressbookid' => 'foo',
+ 'carddata' => 'card',
+ )
+ );
+
+ }
+
+ function testGet() {
+
+ $result = $this->card->get();
+ $this->assertEquals('card', $result);
+
+ }
+ function testGet2() {
+
+ $this->card = new Card(
+ $this->backend,
+ array(
+ 'uri' => 'book1',
+ 'id' => 'foo',
+ 'principaluri' => 'principals/user1',
+ ),
+ array(
+ 'uri' => 'card1',
+ 'addressbookid' => 'foo',
+ )
+ );
+ $result = $this->card->get();
+ $this->assertEquals("BEGIN:VCARD\nVERSION:3.0\nUID:12345\nEND:VCARD", $result);
+
+ }
+
+
+ /**
+ * @depends testGet
+ */
+ function testPut() {
+
+ $file = fopen('php://memory','r+');
+ fwrite($file, 'newdata');
+ rewind($file);
+ $this->card->put($file);
+ $result = $this->card->get();
+ $this->assertEquals('newdata', $result);
+
+ }
+
+
+ function testDelete() {
+
+ $this->card->delete();
+ $this->assertEquals(1, count($this->backend->cards['foo']));
+
+ }
+
+ function testGetContentType() {
+
+ $this->assertEquals('text/x-vcard; charset=utf-8', $this->card->getContentType());
+
+ }
+
+ function testGetETag() {
+
+ $this->assertEquals('"' . md5('card') . '"' , $this->card->getETag());
+
+ }
+
+ function testGetETag2() {
+
+ $card = new Card(
+ $this->backend,
+ array(
+ 'uri' => 'book1',
+ 'id' => 'foo',
+ 'principaluri' => 'principals/user1',
+ ),
+ array(
+ 'uri' => 'card1',
+ 'addressbookid' => 'foo',
+ 'carddata' => 'card',
+ 'etag' => '"blabla"',
+ )
+ );
+ $this->assertEquals('"blabla"' , $card->getETag());
+
+ }
+
+ function testGetLastModified() {
+
+ $this->assertEquals(null, $this->card->getLastModified());
+
+ }
+
+ function testGetSize() {
+
+ $this->assertEquals(4, $this->card->getSize());
+ $this->assertEquals(4, $this->card->getSize());
+
+ }
+
+ function testGetSize2() {
+
+ $card = new Card(
+ $this->backend,
+ array(
+ 'uri' => 'book1',
+ 'id' => 'foo',
+ 'principaluri' => 'principals/user1',
+ ),
+ array(
+ 'uri' => 'card1',
+ 'addressbookid' => 'foo',
+ 'etag' => '"blabla"',
+ 'size' => 4,
+ )
+ );
+ $this->assertEquals(4, $card->getSize());
+
+ }
+
+ function testACLMethods() {
+
+ $this->assertEquals('principals/user1', $this->card->getOwner());
+ $this->assertNull($this->card->getGroup());
+ $this->assertEquals(array(
+ array(
+ 'privilege' => '{DAV:}read',
+ 'principal' => 'principals/user1',
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}write',
+ 'principal' => 'principals/user1',
+ 'protected' => true,
+ ),
+ ), $this->card->getACL());
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\MethodNotAllowed
+ */
+ function testSetACL() {
+
+ $this->card->setACL(array());
+
+ }
+
+ function testGetSupportedPrivilegeSet() {
+
+ $this->assertNull(
+ $this->card->getSupportedPrivilegeSet()
+ );
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CardDAV/IDirectoryTest.php b/vendor/sabre/dav/tests/Sabre/CardDAV/IDirectoryTest.php
new file mode 100644
index 000000000..431cd2524
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CardDAV/IDirectoryTest.php
@@ -0,0 +1,30 @@
+<?php
+
+namespace Sabre\CardDAV;
+
+use Sabre\DAV;
+
+class IDirectoryTest extends \PHPUnit_Framework_TestCase {
+
+ function testResourceType() {
+
+ $tree = array(
+ new DirectoryMock('directory')
+ );
+
+ $server = new DAV\Server($tree);
+ $plugin = new Plugin();
+ $server->addPlugin($plugin);
+
+ $props = $server->getProperties('directory', array('{DAV:}resourcetype'));
+ $this->assertTrue($props['{DAV:}resourcetype']->is('{' . Plugin::NS_CARDDAV . '}directory'));
+
+ }
+
+}
+
+class DirectoryMock extends DAV\SimpleCollection implements IDirectory {
+
+
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CardDAV/MultiGetTest.php b/vendor/sabre/dav/tests/Sabre/CardDAV/MultiGetTest.php
new file mode 100644
index 000000000..12922c6fd
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CardDAV/MultiGetTest.php
@@ -0,0 +1,55 @@
+<?php
+
+namespace Sabre\CardDAV;
+
+use Sabre\HTTP;
+use Sabre\DAV;
+
+require_once 'Sabre/HTTP/ResponseMock.php';
+
+class MultiGetTest extends AbstractPluginTest {
+
+ function testMultiGet() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'REPORT',
+ 'REQUEST_URI' => '/addressbooks/user1/book1',
+ ));
+
+ $request->setBody(
+'<?xml version="1.0"?>
+<c:addressbook-multiget xmlns:d="DAV:" xmlns:c="urn:ietf:params:xml:ns:carddav">
+ <d:prop>
+ <d:getetag />
+ <c:address-data />
+ </d:prop>
+ <d:href>/addressbooks/user1/book1/card1</d:href>
+</c:addressbook-multiget>'
+ );
+
+ $response = new HTTP\ResponseMock();
+
+ $this->server->httpRequest = $request;
+ $this->server->httpResponse = $response;
+
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 207 Multi-Status', $response->status, 'Incorrect status code. Full response body:' . $response->body);
+
+ // using the client for parsing
+ $client = new DAV\Client(array('baseUri'=>'/'));
+
+ $result = $client->parseMultiStatus($response->body);
+
+ $this->assertEquals(array(
+ '/addressbooks/user1/book1/card1' => array(
+ 200 => array(
+ '{DAV:}getetag' => '"' . md5("BEGIN:VCARD\nVERSION:3.0\nUID:12345\nEND:VCARD") . '"',
+ '{urn:ietf:params:xml:ns:carddav}address-data' => "BEGIN:VCARD\nVERSION:3.0\nUID:12345\nEND:VCARD",
+ )
+ )
+ ), $result);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CardDAV/PluginTest.php b/vendor/sabre/dav/tests/Sabre/CardDAV/PluginTest.php
new file mode 100644
index 000000000..297ebf496
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CardDAV/PluginTest.php
@@ -0,0 +1,149 @@
+<?php
+
+namespace Sabre\CardDAV;
+
+use Sabre\DAV;
+
+require_once 'Sabre/CardDAV/AbstractPluginTest.php';
+
+class PluginTest extends AbstractPluginTest {
+
+ function testConstruct() {
+
+ $this->assertEquals('card', $this->server->xmlNamespaces[Plugin::NS_CARDDAV]);
+ $this->assertEquals('{' . Plugin::NS_CARDDAV . '}addressbook', $this->server->resourceTypeMapping['Sabre\\CardDAV\\IAddressBook']);
+
+ $this->assertTrue(in_array('addressbook', $this->plugin->getFeatures()));
+
+ }
+
+ function testSupportedReportSet() {
+
+ $this->assertEquals(array(
+ '{' . Plugin::NS_CARDDAV . '}addressbook-multiget',
+ '{' . Plugin::NS_CARDDAV . '}addressbook-query',
+ ), $this->plugin->getSupportedReportSet('addressbooks/user1/book1'));
+
+ }
+
+ function testSupportedReportSetEmpty() {
+
+ $this->assertEquals(array(
+ ), $this->plugin->getSupportedReportSet(''));
+
+ }
+
+ function testAddressBookHomeSet() {
+
+ $result = $this->server->getProperties('principals/user1', array('{' . Plugin::NS_CARDDAV . '}addressbook-home-set'));
+
+ $this->assertEquals(1, count($result));
+ $this->assertTrue(isset($result['{' . Plugin::NS_CARDDAV . '}addressbook-home-set']));
+ $this->assertEquals('addressbooks/user1/', $result['{' . Plugin::NS_CARDDAV . '}addressbook-home-set']->getHref());
+
+ }
+
+ function testMeCardTest() {
+
+ $result = $this->server->getProperties(
+ 'addressbooks/user1',
+ array(
+ '{http://calendarserver.org/ns/}me-card',
+ )
+ );
+
+ $this->assertEquals(
+ array(
+ '{http://calendarserver.org/ns/}me-card' =>
+ new DAV\Property\Href('addressbooks/user1/book1/vcard1.vcf')
+ ),
+ $result
+ );
+
+ }
+
+ function testDirectoryGateway() {
+
+ $result = $this->server->getProperties('principals/user1', array('{' . Plugin::NS_CARDDAV . '}directory-gateway'));
+
+ $this->assertEquals(1, count($result));
+ $this->assertTrue(isset($result['{' . Plugin::NS_CARDDAV . '}directory-gateway']));
+ $this->assertEquals(array('directory'), $result['{' . Plugin::NS_CARDDAV . '}directory-gateway']->getHrefs());
+
+ }
+
+ function testReportPassThrough() {
+
+ $this->assertNull($this->plugin->report('{DAV:}foo', new \DomDocument()));
+
+ }
+
+ function testHTMLActionsPanel() {
+
+ $output = '';
+ $r = $this->server->broadcastEvent('onHTMLActionsPanel', array($this->server->tree->getNodeForPath('addressbooks/user1'), &$output));
+ $this->assertFalse($r);
+
+ $this->assertTrue(!!strpos($output,'Display name'));
+
+ }
+
+ function testBrowserPostAction() {
+
+ $r = $this->server->broadcastEvent('onBrowserPostAction', array('addressbooks/user1', 'mkaddressbook', array(
+ 'name' => 'NEWADDRESSBOOK',
+ '{DAV:}displayname' => 'foo',
+ )));
+ $this->assertFalse($r);
+
+ $addressbooks = $this->backend->getAddressBooksforUser('principals/user1');
+ $this->assertEquals(2, count($addressbooks));
+
+ $newAddressBook = null;
+ foreach($addressbooks as $addressbook) {
+ if ($addressbook['uri'] === 'NEWADDRESSBOOK') {
+ $newAddressBook = $addressbook;
+ break;
+ }
+ }
+ if (!$newAddressBook)
+ $this->fail('Could not find newly created addressbook');
+
+ }
+
+ function testUpdatePropertiesMeCard() {
+
+ $result = $this->server->updateProperties('addressbooks/user1', array(
+ '{http://calendarserver.org/ns/}me-card' => new DAV\Property\Href('/addressbooks/user1/book1/vcard2',true),
+ ));
+
+ $this->assertEquals(
+ array(
+ 'href' => 'addressbooks/user1',
+ 200 => array(
+ '{http://calendarserver.org/ns/}me-card' => null,
+ ),
+ ),
+ $result
+ );
+
+ }
+
+ function testUpdatePropertiesMeCardBadValue() {
+
+ $result = $this->server->updateProperties('addressbooks/user1', array(
+ '{http://calendarserver.org/ns/}me-card' => new DAV\Property\HrefList(array()),
+ ));
+
+ $this->assertEquals(
+ array(
+ 'href' => 'addressbooks/user1',
+ 400 => array(
+ '{http://calendarserver.org/ns/}me-card' => null,
+ ),
+ ),
+ $result
+ );
+
+ }
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CardDAV/Property/SupportedAddressDataTest.php b/vendor/sabre/dav/tests/Sabre/CardDAV/Property/SupportedAddressDataTest.php
new file mode 100644
index 000000000..a0e4130d5
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CardDAV/Property/SupportedAddressDataTest.php
@@ -0,0 +1,44 @@
+<?php
+
+namespace Sabre\CardDAV\Property;
+
+use Sabre\CardDAV;
+use Sabre\DAV;
+
+class SupportedAddressDataDataTest extends \PHPUnit_Framework_TestCase {
+
+ function testSimple() {
+
+ $property = new SupportedAddressData();
+
+ }
+
+ /**
+ * @depends testSimple
+ */
+ function testSerialize() {
+
+ $property = new SupportedAddressData();
+
+ $doc = new \DOMDocument();
+ $root = $doc->createElementNS(CardDAV\Plugin::NS_CARDDAV, 'card:root');
+ $root->setAttribute('xmlns:d','DAV:');
+
+ $doc->appendChild($root);
+ $server = new DAV\Server();
+
+ $property->serialize($server, $root);
+
+ $xml = $doc->saveXML();
+
+ $this->assertEquals(
+'<?xml version="1.0"?>
+<card:root xmlns:card="' . CardDAV\Plugin::NS_CARDDAV . '" xmlns:d="DAV:">' .
+'<card:address-data-type content-type="text/vcard" version="3.0"/>' .
+//'<card:address-data-type content-type="text/vcard" version="4.0"/>' .
+'</card:root>
+', $xml);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CardDAV/SogoStripContentTypeTest.php b/vendor/sabre/dav/tests/Sabre/CardDAV/SogoStripContentTypeTest.php
new file mode 100644
index 000000000..2a62bd2f9
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CardDAV/SogoStripContentTypeTest.php
@@ -0,0 +1,43 @@
+<?php
+
+namespace Sabre\CardDAV;
+
+use Sabre\HTTP;
+
+class SogoStripContentType extends \Sabre\DAVServerTest {
+
+ protected $setupCardDAV = true;
+ protected $carddavAddressBooks = array(
+ array(
+ 'id' => 1,
+ 'uri' => 'book1',
+ 'principaluri' => 'principals/user1',
+ ),
+ );
+ protected $carddavCards = array(
+ 1 => array(
+ 'card1.vcf' => "BEGIN:VCARD\nVERSION:3.0\nUID:12345\nEND:VCARD",
+ ),
+ );
+
+ function testDontStrip() {
+
+ $result = $this->server->getProperties('addressbooks/user1/book1/card1.vcf',array('{DAV:}getcontenttype'));
+ $this->assertEquals(array(
+ '{DAV:}getcontenttype' => 'text/x-vcard; charset=utf-8'
+ ), $result);
+
+ }
+ function testStrip() {
+
+ $this->server->httpRequest = new HTTP\Request(array(
+ 'HTTP_USER_AGENT' => 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:10.0.2) Gecko/20120216 Thunderbird/10.0.2 Lightning/1.2.1',
+ ));
+ $result = $this->server->getProperties('addressbooks/user1/book1/card1.vcf',array('{DAV:}getcontenttype'));
+ $this->assertEquals(array(
+ '{DAV:}getcontenttype' => 'text/x-vcard'
+ ), $result);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CardDAV/TestUtil.php b/vendor/sabre/dav/tests/Sabre/CardDAV/TestUtil.php
new file mode 100644
index 000000000..9f84566af
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CardDAV/TestUtil.php
@@ -0,0 +1,68 @@
+<?php
+
+namespace Sabre\CardDAV;
+
+use PDO;
+
+class TestUtil {
+
+ static function getBackend() {
+
+ $backend = new Backend\PDO(self::getSQLiteDB());
+ return $backend;
+
+ }
+
+ static function getSQLiteDB() {
+
+ if (file_exists(SABRE_TEMPDIR . '/testdb.sqlite'))
+ unlink(SABRE_TEMPDIR . '/testdb.sqlite');
+
+ $pdo = new PDO('sqlite:' . SABRE_TEMPDIR . '/testdb.sqlite');
+ $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
+
+ // Yup this is definitely not 'fool proof', but good enough for now.
+ $queries = explode(';', file_get_contents(__DIR__ . '/../../../examples/sql/sqlite.addressbooks.sql'));
+ foreach($queries as $query) {
+ $pdo->exec($query);
+ }
+ // Inserting events through a backend class.
+ $backend = new Backend\PDO($pdo);
+ $addressbookId = $backend->createAddressBook(
+ 'principals/user1',
+ 'UUID-123467',
+ array(
+ '{DAV:}displayname' => 'user1 addressbook',
+ '{urn:ietf:params:xml:ns:carddav}addressbook-description' => 'AddressBook description',
+ )
+ );
+ $backend->createAddressBook(
+ 'principals/user1',
+ 'UUID-123468',
+ array(
+ '{DAV:}displayname' => 'user1 addressbook2',
+ '{urn:ietf:params:xml:ns:carddav}addressbook-description' => 'AddressBook description',
+ )
+ );
+ $backend->createCard($addressbookId, 'UUID-2345', self::getTestCardData());
+ return $pdo;
+
+ }
+
+ static function getTestCardData($type = 1) {
+
+ $addressbookData = 'BEGIN:VCARD
+VERSION:3.0
+PRODID:-//Acme Inc.//RoadRunner 1.0//EN
+FN:Wile E. Coyote
+N:Coyote;Wile;Erroll;;
+ORG:Acme Inc.
+UID:39A6B5ED-DD51-4AFE-A683-C35EE3749627
+REV:2012-06-20T07:00:39+00:00
+END:VCARD';
+
+ return $addressbookData;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CardDAV/UserAddressBooksTest.php b/vendor/sabre/dav/tests/Sabre/CardDAV/UserAddressBooksTest.php
new file mode 100644
index 000000000..a6ecf3e47
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CardDAV/UserAddressBooksTest.php
@@ -0,0 +1,162 @@
+<?php
+
+namespace Sabre\CardDAV;
+
+class UserAddressBooksTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * @var Sabre\CardDAV\UserAddressBooks
+ */
+ protected $s;
+ protected $backend;
+
+ function setUp() {
+
+ $this->backend = new Backend\Mock();
+ $this->s = new UserAddressBooks(
+ $this->backend,
+ 'principals/user1'
+ );
+
+ }
+
+ function testGetName() {
+
+ $this->assertEquals('user1', $this->s->getName());
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\MethodNotAllowed
+ */
+ function testSetName() {
+
+ $this->s->setName('user2');
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\MethodNotAllowed
+ */
+ function testDelete() {
+
+ $this->s->delete();
+
+ }
+
+ function testGetLastModified() {
+
+ $this->assertNull($this->s->getLastModified());
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\MethodNotAllowed
+ */
+ function testCreateFile() {
+
+ $this->s->createFile('bla');
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\MethodNotAllowed
+ */
+ function testCreateDirectory() {
+
+ $this->s->createDirectory('bla');
+
+ }
+
+ function testGetChild() {
+
+ $child = $this->s->getChild('book1');
+ $this->assertInstanceOf('Sabre\\CardDAV\\AddressBook', $child);
+ $this->assertEquals('book1', $child->getName());
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\NotFound
+ */
+ function testGetChild404() {
+
+ $this->s->getChild('book2');
+
+ }
+
+ function testGetChildren() {
+
+ $children = $this->s->getChildren();
+ $this->assertEquals(1, count($children));
+ $this->assertInstanceOf('Sabre\\CardDAV\\AddressBook', $children[0]);
+ $this->assertEquals('book1', $children[0]->getName());
+
+ }
+
+ function testCreateExtendedCollection() {
+
+ $resourceType = array(
+ '{' . Plugin::NS_CARDDAV . '}addressbook',
+ '{DAV:}collection',
+ );
+ $this->s->createExtendedCollection('book2', $resourceType, array('{DAV:}displayname' => 'a-book 2'));
+
+ $this->assertEquals(array(
+ 'id' => 'book2',
+ 'uri' => 'book2',
+ '{DAV:}displayname' => 'a-book 2',
+ 'principaluri' => 'principals/user1',
+ ), $this->backend->addressBooks[1]);
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\InvalidResourceType
+ */
+ function testCreateExtendedCollectionInvalid() {
+
+ $resourceType = array(
+ '{DAV:}collection',
+ );
+ $this->s->createExtendedCollection('book2', $resourceType, array('{DAV:}displayname' => 'a-book 2'));
+
+ }
+
+
+ function testACLMethods() {
+
+ $this->assertEquals('principals/user1', $this->s->getOwner());
+ $this->assertNull($this->s->getGroup());
+ $this->assertEquals(array(
+ array(
+ 'privilege' => '{DAV:}read',
+ 'principal' => 'principals/user1',
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}write',
+ 'principal' => 'principals/user1',
+ 'protected' => true,
+ ),
+ ), $this->s->getACL());
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\MethodNotAllowed
+ */
+ function testSetACL() {
+
+ $this->s->setACL(array());
+
+ }
+
+ function testGetSupportedPrivilegeSet() {
+
+ $this->assertNull(
+ $this->s->getSupportedPrivilegeSet()
+ );
+
+ }
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CardDAV/VCFExportTest.php b/vendor/sabre/dav/tests/Sabre/CardDAV/VCFExportTest.php
new file mode 100644
index 000000000..84da59311
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CardDAV/VCFExportTest.php
@@ -0,0 +1,75 @@
+<?php
+
+namespace Sabre\CardDAV;
+
+use Sabre\HTTP;
+
+class VCFExportTest extends \Sabre\DAVServerTest {
+
+ protected $setupCardDAV = true;
+ protected $autoLogin = 'user1';
+ protected $setupACL = true;
+
+ protected $carddavAddressBooks = array(
+ array(
+ 'id' => 'book1',
+ 'uri' => 'book1',
+ 'principaluri' => 'principals/user1',
+ )
+ );
+ protected $carddavCards = array(
+ 'book1' => array(
+ "card1" => "BEGIN:VCARD\r\nFN:Person1\r\nEND:VCARD\r\n",
+ "card2" => "BEGIN:VCARD\r\nFN:Person2\r\nEND:VCARD",
+ "card3" => "BEGIN:VCARD\r\nFN:Person3\r\nEND:VCARD\r\n",
+ "card4" => "BEGIN:VCARD\nFN:Person4\nEND:VCARD\n",
+ )
+ );
+
+ function setUp() {
+
+ parent::setUp();
+ $this->server->addPlugin(
+ new VCFExportPlugin()
+ );
+
+ }
+
+ function testSimple() {
+
+ $this->assertInstanceOf('Sabre\\CardDAV\\VCFExportPlugin', $this->server->getPlugin('Sabre\\CardDAV\\VCFExportPlugin'));
+
+ }
+
+ function testExport() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_URI' => '/addressbooks/user1/book1?export',
+ 'QUERY_STRING' => 'export',
+ 'REQUEST_METHOD' => 'GET',
+ ));
+
+ $response = $this->request($request);
+ $this->assertEquals('HTTP/1.1 200 OK', $response->status, $response->body);
+
+ $expected = "BEGIN:VCARD
+FN:Person1
+END:VCARD
+BEGIN:VCARD
+FN:Person2
+END:VCARD
+BEGIN:VCARD
+FN:Person3
+END:VCARD
+BEGIN:VCARD
+FN:Person4
+END:VCARD
+";
+ // We actually expected windows line endings
+ $expected = str_replace("\n","\r\n", $expected);
+
+ $this->assertEquals($expected, $response->body);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CardDAV/ValidateFilterTest.php b/vendor/sabre/dav/tests/Sabre/CardDAV/ValidateFilterTest.php
new file mode 100644
index 000000000..c87716c10
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CardDAV/ValidateFilterTest.php
@@ -0,0 +1,204 @@
+<?php
+
+namespace Sabre\CardDAV;
+
+require_once 'Sabre/CardDAV/AbstractPluginTest.php';
+
+class ValidateFilterTest extends AbstractPluginTest {
+
+ /**
+ * @dataProvider data
+ */
+ function testFilter($input, $filters, $test, $result, $message = null) {
+
+ if ($result) {
+ $this->assertTrue($this->plugin->validateFilters($input, $filters, $test), $message);
+ } else {
+ $this->assertFalse($this->plugin->validateFilters($input, $filters, $test), $message);
+ }
+
+ }
+
+ function data() {
+
+ $body1 = <<<HELLO
+BEGIN:VCARD
+VERSION:3.0
+ORG:Company;
+TITLE:Title
+TEL;TYPE=IPHONE;TYPE=pref:(222) 22 22 22
+TEL;TYPE=HOME:(33) 333 66 66
+TEL;TYPE=WORK:(444) 44 44 44
+TEL;TYPE=MAIN:(55) 555 55 55
+ITEM4.TEL:(111) 11 11 11
+ITEM5.TEL:(6) 66 66 66 66
+ITEM6.TEL:(77) 777 77 77
+UID:3151DE6A-BC35-4612-B340-B53A034A2B27
+ITEM1.EMAIL:1111@111.com
+ITEM2.EMAIL:bbbbb@bbbb.com
+ITEM3.EMAIL:ccccc@ccccc.com
+FN:First Last
+N:Last;First;Middle;Dr
+BDAY:1985-07-20
+ADR;TYPE=HOME:;;Street;City;;3556;Montenegro
+ADR;TYPE=WORK:;;Street\\nStreet2;Harkema;;35444;Australia
+URL:http://google.com
+END:VCARD
+HELLO;
+
+ // Check if TITLE is defined
+ $filter1 =
+ array('name' => 'title', 'is-not-defined' => false, 'param-filters' => array(), 'text-matches' => array());
+
+ // Check if FOO is defined
+ $filter2 =
+ array('name' => 'foo', 'is-not-defined' => false, 'param-filters' => array(), 'text-matches' => array());
+
+ // Check if TITLE is not defined
+ $filter3 =
+ array('name' => 'title', 'is-not-defined' => true, 'param-filters' => array(), 'text-matches' => array());
+
+ // Check if FOO is not defined
+ $filter4 =
+ array('name' => 'foo', 'is-not-defined' => true, 'param-filters' => array(), 'text-matches' => array());
+
+ // Check if TEL[TYPE] is defined
+ $filter5 =
+ array(
+ 'name' => 'tel',
+ 'is-not-defined' => false,
+ 'test' => 'anyof',
+ 'param-filters' => array(
+ array(
+ 'name' => 'type',
+ 'is-not-defined' => false,
+ 'text-match' => null
+ ),
+ ),
+ 'text-matches' => array(),
+ );
+
+ // Check if TEL[FOO] is defined
+ $filter6 = $filter5;
+ $filter6['param-filters'][0]['name'] = 'FOO';
+
+ // Check if TEL[TYPE] is not defined
+ $filter7 = $filter5;
+ $filter7['param-filters'][0]['is-not-defined'] = true;
+
+ // Check if TEL[FOO] is not defined
+ $filter8 = $filter5;
+ $filter8['param-filters'][0]['name'] = 'FOO';
+ $filter8['param-filters'][0]['is-not-defined'] = true;
+
+ // Combining property filters
+ $filter9 = $filter5;
+ $filter9['param-filters'][] = $filter6['param-filters'][0];
+
+ $filter10 = $filter5;
+ $filter10['param-filters'][] = $filter6['param-filters'][0];
+ $filter10['test'] = 'allof';
+
+ // Check if URL contains 'google'
+ $filter11 =
+ array(
+ 'name' => 'url',
+ 'is-not-defined' => false,
+ 'test' => 'anyof',
+ 'param-filters' => array(),
+ 'text-matches' => array(
+ array(
+ 'match-type' => 'contains',
+ 'value' => 'google',
+ 'negate-condition' => false,
+ 'collation' => 'i;octet',
+ ),
+ ),
+ );
+
+ // Check if URL contains 'bing'
+ $filter12 = $filter11;
+ $filter12['text-matches'][0]['value'] = 'bing';
+
+ // Check if URL does not contain 'google'
+ $filter13 = $filter11;
+ $filter13['text-matches'][0]['negate-condition'] = true;
+
+ // Check if URL does not contain 'bing'
+ $filter14 = $filter11;
+ $filter14['text-matches'][0]['value'] = 'bing';
+ $filter14['text-matches'][0]['negate-condition'] = true;
+
+ // Param filter with text
+ $filter15 = $filter5;
+ $filter15['param-filters'][0]['text-match'] = array(
+ 'match-type' => 'contains',
+ 'value' => 'WORK',
+ 'collation' => 'i;octet',
+ 'negate-condition' => false,
+ );
+ $filter16 = $filter15;
+ $filter16['param-filters'][0]['text-match']['negate-condition'] = true;
+
+
+ // Param filter + text filter
+ $filter17 = $filter5;
+ $filter17['test'] = 'anyof';
+ $filter17['text-matches'][] = array(
+ 'match-type' => 'contains',
+ 'value' => '444',
+ 'collation' => 'i;octet',
+ 'negate-condition' => false,
+ );
+
+ $filter18 = $filter17;
+ $filter18['text-matches'][0]['negate-condition'] = true;
+
+ $filter18['test'] = 'allof';
+
+ return array(
+
+ // Basic filters
+ array($body1, array($filter1), 'anyof',true),
+ array($body1, array($filter2), 'anyof',false),
+ array($body1, array($filter3), 'anyof',false),
+ array($body1, array($filter4), 'anyof',true),
+
+ // Combinations
+ array($body1, array($filter1, $filter2), 'anyof',true),
+ array($body1, array($filter1, $filter2), 'allof',false),
+ array($body1, array($filter1, $filter4), 'anyof',true),
+ array($body1, array($filter1, $filter4), 'allof',true),
+ array($body1, array($filter2, $filter3), 'anyof',false),
+ array($body1, array($filter2, $filter3), 'allof',false),
+
+ // Basic parameters
+ array($body1, array($filter5), 'anyof', true, 'TEL;TYPE is defined, so this should return true'),
+ array($body1, array($filter6), 'anyof', false, 'TEL;FOO is not defined, so this should return false'),
+
+ array($body1, array($filter7), 'anyof', false, 'TEL;TYPE is defined, so this should return false'),
+ array($body1, array($filter8), 'anyof', true, 'TEL;TYPE is not defined, so this should return true'),
+
+ // Combined parameters
+ array($body1, array($filter9), 'anyof', true),
+ array($body1, array($filter10), 'anyof', false),
+
+ // Text-filters
+ array($body1, array($filter11), 'anyof', true),
+ array($body1, array($filter12), 'anyof', false),
+ array($body1, array($filter13), 'anyof', false),
+ array($body1, array($filter14), 'anyof', true),
+
+ // Param filter with text-match
+ array($body1, array($filter15), 'anyof', true),
+ array($body1, array($filter16), 'anyof', false),
+
+ // Param filter + text filter
+ array($body1, array($filter17), 'anyof', true),
+ array($body1, array($filter18), 'anyof', false),
+ array($body1, array($filter18), 'anyof', false),
+ );
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CardDAV/ValidateVCardTest.php b/vendor/sabre/dav/tests/Sabre/CardDAV/ValidateVCardTest.php
new file mode 100644
index 000000000..1f52f30a7
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CardDAV/ValidateVCardTest.php
@@ -0,0 +1,155 @@
+<?php
+
+namespace Sabre\CardDAV;
+
+use Sabre\DAV;
+use Sabre\HTTP;
+use Sabre\DAVACL;
+
+require_once 'Sabre/HTTP/ResponseMock.php';
+
+class ValidateVCardTest extends \PHPUnit_Framework_TestCase {
+
+ protected $server;
+ protected $cardBackend;
+
+ function setUp() {
+
+ $addressbooks = array(
+ array(
+ 'id' => 'addressbook1',
+ 'principaluri' => 'principals/admin',
+ 'uri' => 'addressbook1',
+ )
+ );
+
+ $this->cardBackend = new Backend\Mock($addressbooks,array());
+ $principalBackend = new DAVACL\PrincipalBackend\Mock();
+
+ $tree = array(
+ new AddressBookRoot($principalBackend, $this->cardBackend),
+ );
+
+ $this->server = new DAV\Server($tree);
+ $this->server->debugExceptions = true;
+
+ $plugin = new Plugin();
+ $this->server->addPlugin($plugin);
+
+ $response = new HTTP\ResponseMock();
+ $this->server->httpResponse = $response;
+
+ }
+
+ function request(HTTP\Request $request) {
+
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ return $this->server->httpResponse;
+
+ }
+
+ function testCreateFile() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'PUT',
+ 'REQUEST_URI' => '/addressbooks/admin/addressbook1/blabla.vcf',
+ ));
+
+ $response = $this->request($request);
+
+ $this->assertEquals('HTTP/1.1 415 Unsupported Media Type', $response->status);
+
+ }
+
+ function testCreateFileValid() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'PUT',
+ 'REQUEST_URI' => '/addressbooks/admin/addressbook1/blabla.vcf',
+ ));
+ $request->setBody("BEGIN:VCARD\r\nUID:foo\r\nEND:VCARD\r\n");
+
+ $response = $this->request($request);
+
+ $this->assertEquals('HTTP/1.1 201 Created', $response->status, 'Incorrect status returned! Full response body: ' . $response->body);
+ $expected = array(
+ 'uri' => 'blabla.vcf',
+ 'carddata' => "BEGIN:VCARD\r\nUID:foo\r\nEND:VCARD\r\n",
+ );
+
+ $this->assertEquals($expected, $this->cardBackend->getCard('addressbook1','blabla.vcf'));
+
+ }
+
+ function testCreateFileNoUID() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'PUT',
+ 'REQUEST_URI' => '/addressbooks/admin/addressbook1/blabla.vcf',
+ ));
+ $request->setBody("BEGIN:VCARD\r\nEND:VCARD\r\n");
+
+ $response = $this->request($request);
+
+ $this->assertEquals('HTTP/1.1 201 Created', $response->status, 'Incorrect status returned! Full response body: ' . $response->body);
+
+ $foo = $this->cardBackend->getCard('addressbook1','blabla.vcf');
+ $this->assertTrue(strpos($foo['carddata'],'UID')!==false);
+ }
+
+
+ function testCreateFileVCalendar() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'PUT',
+ 'REQUEST_URI' => '/addressbooks/admin/addressbook1/blabla.vcf',
+ ));
+ $request->setBody("BEGIN:VCALENDAR\r\nEND:VCALENDAR\r\n");
+
+ $response = $this->request($request);
+
+ $this->assertEquals('HTTP/1.1 415 Unsupported Media Type', $response->status, 'Incorrect status returned! Full response body: ' . $response->body);
+
+ }
+
+ function testUpdateFile() {
+
+ $this->cardBackend->createCard('addressbook1','blabla.vcf','foo');
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'PUT',
+ 'REQUEST_URI' => '/addressbooks/admin/addressbook1/blabla.vcf',
+ ));
+
+ $response = $this->request($request);
+
+ $this->assertEquals('HTTP/1.1 415 Unsupported Media Type', $response->status);
+
+ }
+
+ function testUpdateFileParsableBody() {
+
+ $this->cardBackend->createCard('addressbook1','blabla.vcf','foo');
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'PUT',
+ 'REQUEST_URI' => '/addressbooks/admin/addressbook1/blabla.vcf',
+ ));
+ $body = "BEGIN:VCARD\r\nUID:foo\r\nEND:VCARD\r\n";
+ $request->setBody($body);
+
+ $response = $this->request($request);
+
+ $this->assertEquals('HTTP/1.1 204 No Content', $response->status);
+
+ $expected = array(
+ 'uri' => 'blabla.vcf',
+ 'carddata' => $body,
+ );
+
+ $this->assertEquals($expected, $this->cardBackend->getCard('addressbook1','blabla.vcf'));
+
+ }
+}
+
+?>
diff --git a/vendor/sabre/dav/tests/Sabre/CardDAV/VersionTest.php b/vendor/sabre/dav/tests/Sabre/CardDAV/VersionTest.php
new file mode 100644
index 000000000..02943b2d3
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CardDAV/VersionTest.php
@@ -0,0 +1,17 @@
+<?php
+
+namespace Sabre\CardDAV;
+
+class VersionTest extends \PHPUnit_Framework_TestCase {
+
+ function testString() {
+
+ $v = Version::VERSION;
+ $this->assertEquals(-1, version_compare('0.1',$v));
+
+ $s = Version::STABILITY;
+ $this->assertTrue($s == 'alpha' || $s == 'beta' || $s =='stable');
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/AbstractServer.php b/vendor/sabre/dav/tests/Sabre/DAV/AbstractServer.php
new file mode 100644
index 000000000..357675686
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/AbstractServer.php
@@ -0,0 +1,64 @@
+<?php
+
+namespace Sabre\DAV;
+
+use Sabre\HTTP;
+
+require_once 'Sabre/HTTP/ResponseMock.php';
+
+abstract class AbstractServer extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * @var Sabre\HTTP\ResponseMock
+ */
+ protected $response;
+ protected $request;
+ /**
+ * @var Sabre\DAV\Server
+ */
+ protected $server;
+ protected $tempDir = SABRE_TEMPDIR;
+
+ function setUp() {
+
+ $this->response = new HTTP\ResponseMock();
+ $this->server = new Server($this->getRootNode());
+ $this->server->httpResponse = $this->response;
+ $this->server->debugExceptions = true;
+ file_put_contents(SABRE_TEMPDIR . '/test.txt', 'Test contents');
+ mkdir(SABRE_TEMPDIR . '/dir');
+ file_put_contents(SABRE_TEMPDIR . '/dir/child.txt', 'Child contents');
+
+
+ }
+
+ function tearDown() {
+
+ $this->deleteTree(SABRE_TEMPDIR,false);
+
+ }
+
+ protected function getRootNode() {
+
+ return new FS\Directory(SABRE_TEMPDIR);
+
+ }
+
+ private function deleteTree($path,$deleteRoot = true) {
+
+ foreach(scandir($path) as $node) {
+
+ if ($node=='.' || $node=='.svn' || $node=='..') continue;
+ $myPath = $path.'/'. $node;
+ if (is_file($myPath)) {
+ unlink($myPath);
+ } else {
+ $this->deleteTree($myPath);
+ }
+
+ }
+ if ($deleteRoot) rmdir($path);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/Auth/Backend/AbstractBasicTest.php b/vendor/sabre/dav/tests/Sabre/DAV/Auth/Backend/AbstractBasicTest.php
new file mode 100644
index 000000000..36d23c5c0
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/Auth/Backend/AbstractBasicTest.php
@@ -0,0 +1,91 @@
+<?php
+
+namespace Sabre\DAV\Auth\Backend;
+
+use Sabre\DAV;
+use Sabre\HTTP;
+
+require_once 'Sabre/HTTP/ResponseMock.php';
+
+class AbstractBasicTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * @expectedException Sabre\DAV\Exception\NotAuthenticated
+ */
+ public function testAuthenticateNoHeaders() {
+
+ $response = new HTTP\ResponseMock();
+ $server = new DAV\Server();
+ $server->httpResponse = $response;
+
+ $backend = new AbstractBasicMock();
+ $backend->authenticate($server,'myRealm');
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\NotAuthenticated
+ */
+ public function testAuthenticateUnknownUser() {
+
+ $response = new HTTP\ResponseMock();
+ $tree = new DAV\ObjectTree(new DAV\SimpleCollection('bla'));
+ $server = new DAV\Server($tree);
+ $server->httpResponse = $response;
+
+ $request = new HTTP\Request(array(
+ 'PHP_AUTH_USER' => 'username',
+ 'PHP_AUTH_PW' => 'wrongpassword',
+ ));
+ $server->httpRequest = $request;
+
+ $backend = new AbstractBasicMock();
+ $backend->authenticate($server,'myRealm');
+
+ }
+
+ public function testAuthenticate() {
+
+ $response = new HTTP\ResponseMock();
+ $tree = new DAV\ObjectTree(new DAV\SimpleCollection('bla'));
+ $server = new DAV\Server($tree);
+ $server->httpResponse = $response;
+
+ $request = new HTTP\Request(array(
+ 'PHP_AUTH_USER' => 'username',
+ 'PHP_AUTH_PW' => 'password',
+ ));
+ $server->httpRequest = $request;
+
+ $backend = new AbstractBasicMock();
+ $this->assertTrue($backend->authenticate($server,'myRealm'));
+
+ $result = $backend->getCurrentUser();
+
+ $this->assertEquals('username', $result);
+
+ }
+
+
+}
+
+
+class AbstractBasicMock extends AbstractBasic {
+
+ /**
+ * Validates a username and password
+ *
+ * This method should return true or false depending on if login
+ * succeeded.
+ *
+ * @param string $username
+ * @param string $password
+ * @return bool
+ */
+ function validateUserPass($username, $password) {
+
+ return ($username == 'username' && $password == 'password');
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/Auth/Backend/AbstractDigestTest.php b/vendor/sabre/dav/tests/Sabre/DAV/Auth/Backend/AbstractDigestTest.php
new file mode 100644
index 000000000..495690c4e
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/Auth/Backend/AbstractDigestTest.php
@@ -0,0 +1,149 @@
+<?php
+
+namespace Sabre\DAV\Auth\Backend;
+
+use Sabre\DAV;
+use Sabre\HTTP;
+
+require_once 'Sabre/HTTP/ResponseMock.php';
+
+class AbstractDigestTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * @expectedException Sabre\DAV\Exception\NotAuthenticated
+ */
+ public function testAuthenticateNoHeaders() {
+
+ $response = new HTTP\ResponseMock();
+ $server = new DAV\Server();
+ $server->httpResponse = $response;
+
+ $backend = new AbstractDigestMock();
+ $backend->authenticate($server,'myRealm');
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception
+ */
+ public function testAuthenticateBadGetUserInfoResponse() {
+
+ $response = new HTTP\ResponseMock();
+ $server = new DAV\Server();
+ $server->httpResponse = $response;
+
+ $header = 'username=null, realm=myRealm, nonce=12345, uri=/, response=HASH, opaque=1, qop=auth, nc=1, cnonce=1';
+ $request = new HTTP\Request(array(
+ 'PHP_AUTH_DIGEST' => $header,
+ ));
+ $server->httpRequest = $request;
+
+ $backend = new AbstractDigestMock();
+ $backend->authenticate($server,'myRealm');
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception
+ */
+ public function testAuthenticateBadGetUserInfoResponse2() {
+
+ $response = new HTTP\ResponseMock();
+ $server = new DAV\Server();
+ $server->httpResponse = $response;
+
+ $header = 'username=array, realm=myRealm, nonce=12345, uri=/, response=HASH, opaque=1, qop=auth, nc=1, cnonce=1';
+ $request = new HTTP\Request(array(
+ 'PHP_AUTH_DIGEST' => $header,
+ ));
+ $server->httpRequest = $request;
+
+ $backend = new AbstractDigestMock();
+ $backend->authenticate($server,'myRealm');
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\NotAuthenticated
+ */
+ public function testAuthenticateUnknownUser() {
+
+ $response = new HTTP\ResponseMock();
+ $server = new DAV\Server();
+ $server->httpResponse = $response;
+
+ $header = 'username=false, realm=myRealm, nonce=12345, uri=/, response=HASH, opaque=1, qop=auth, nc=1, cnonce=1';
+ $request = new HTTP\Request(array(
+ 'PHP_AUTH_DIGEST' => $header,
+ ));
+ $server->httpRequest = $request;
+
+ $backend = new AbstractDigestMock();
+ $backend->authenticate($server,'myRealm');
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\NotAuthenticated
+ */
+ public function testAuthenticateBadPassword() {
+
+ $response = new HTTP\ResponseMock();
+ $server = new DAV\Server();
+ $server->httpResponse = $response;
+
+ $header = 'username=user, realm=myRealm, nonce=12345, uri=/, response=HASH, opaque=1, qop=auth, nc=1, cnonce=1';
+ $request = new HTTP\Request(array(
+ 'PHP_AUTH_DIGEST' => $header,
+ 'REQUEST_METHOD' => 'PUT',
+ ));
+ $server->httpRequest = $request;
+
+ $backend = new AbstractDigestMock();
+ $backend->authenticate($server,'myRealm');
+
+ }
+
+ public function testAuthenticate() {
+
+ $response = new HTTP\ResponseMock();
+ $server = new DAV\Server();
+ $server->httpResponse = $response;
+
+ $digestHash = md5('HELLO:12345:1:1:auth:' . md5('GET:/'));
+ $header = 'username=user, realm=myRealm, nonce=12345, uri=/, response='.$digestHash.', opaque=1, qop=auth, nc=1, cnonce=1';
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'GET',
+ 'PHP_AUTH_DIGEST' => $header,
+ 'REQUEST_URI' => '/',
+ ));
+ $server->httpRequest = $request;
+
+ $backend = new AbstractDigestMock();
+ $this->assertTrue($backend->authenticate($server,'myRealm'));
+
+ $result = $backend->getCurrentUser();
+
+ $this->assertEquals('user', $result);
+ $this->assertEquals('HELLO', $backend->getDigestHash('myRealm', $result));
+
+ }
+
+
+}
+
+
+class AbstractDigestMock extends AbstractDigest {
+
+ function getDigestHash($realm, $userName) {
+
+ switch($userName) {
+ case 'null' : return null;
+ case 'false' : return false;
+ case 'array' : return array();
+ case 'user' : return 'HELLO';
+ }
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/Auth/Backend/AbstractPDOTest.php b/vendor/sabre/dav/tests/Sabre/DAV/Auth/Backend/AbstractPDOTest.php
new file mode 100644
index 000000000..d22923d51
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/Auth/Backend/AbstractPDOTest.php
@@ -0,0 +1,35 @@
+<?php
+
+namespace Sabre\DAV\Auth\Backend;
+
+use Sabre\DAV;
+
+abstract class AbstractPDOTest extends \PHPUnit_Framework_TestCase {
+
+ abstract function getPDO();
+
+ function testConstruct() {
+
+ $pdo = $this->getPDO();
+ $backend = new PDO($pdo);
+ $this->assertTrue($backend instanceof PDO);
+
+ }
+
+ /**
+ * @depends testConstruct
+ */
+ function testUserInfo() {
+
+ $pdo = $this->getPDO();
+ $backend = new PDO($pdo);
+
+ $this->assertNull($backend->getDigestHash('realm','blabla'));
+
+ $expected = 'hash';
+
+ $this->assertEquals($expected, $backend->getDigestHash('realm','user'));
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/Auth/Backend/ApacheTest.php b/vendor/sabre/dav/tests/Sabre/DAV/Auth/Backend/ApacheTest.php
new file mode 100644
index 000000000..b1ed555d4
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/Auth/Backend/ApacheTest.php
@@ -0,0 +1,45 @@
+<?php
+
+namespace Sabre\DAV\Auth\Backend;
+
+use Sabre\DAV;
+use Sabre\HTTP;
+
+class ApacheTest extends \PHPUnit_Framework_TestCase {
+
+ function testConstruct() {
+
+ $backend = new Apache();
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception
+ */
+ function testNoHeader() {
+
+ $server = new DAV\Server();
+ $backend = new Apache();
+ $backend->authenticate($server,'Realm');
+
+ }
+
+ function testRemoteUser() {
+
+ $backend = new Apache();
+
+ $server = new DAV\Server();
+ $request = new HTTP\Request(array(
+ 'REMOTE_USER' => 'username',
+ ));
+ $server->httpRequest = $request;
+
+ $this->assertTrue($backend->authenticate($server, 'Realm'));
+
+ $userInfo = 'username';
+
+ $this->assertEquals($userInfo, $backend->getCurrentUser());
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/Auth/Backend/FileTest.php b/vendor/sabre/dav/tests/Sabre/DAV/Auth/Backend/FileTest.php
new file mode 100644
index 000000000..72f150ab6
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/Auth/Backend/FileTest.php
@@ -0,0 +1,42 @@
+<?php
+
+namespace Sabre\DAV\Auth\Backend;
+
+class FileTest extends \PHPUnit_Framework_TestCase {
+
+ function tearDown() {
+
+ if (file_exists(SABRE_TEMPDIR . '/filebackend')) unlink(SABRE_TEMPDIR .'/filebackend');
+
+ }
+
+ function testConstruct() {
+
+ $file = new File();
+ $this->assertTrue($file instanceof File);
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception
+ */
+ function testLoadFileBroken() {
+
+ file_put_contents(SABRE_TEMPDIR . '/backend','user:realm:hash');
+ $file = new File();
+ $file->loadFile(SABRE_TEMPDIR .'/backend');
+
+ }
+
+ function testLoadFile() {
+
+ file_put_contents(SABRE_TEMPDIR . '/backend','user:realm:' . md5('user:realm:password'));
+ $file = new File();
+ $file->loadFile(SABRE_TEMPDIR . '/backend');
+
+ $this->assertFalse($file->getDigestHash('realm','blabla'));
+ $this->assertEquals(md5('user:realm:password'), $file->getDigesthash('realm','user'));
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/Auth/Backend/Mock.php b/vendor/sabre/dav/tests/Sabre/DAV/Auth/Backend/Mock.php
new file mode 100644
index 000000000..fdad8a605
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/Auth/Backend/Mock.php
@@ -0,0 +1,37 @@
+<?php
+
+namespace Sabre\DAV\Auth\Backend;
+
+use Sabre\DAV;
+
+class Mock implements BackendInterface {
+
+ protected $currentUser;
+
+ public $defaultUser = 'admin';
+
+ /**
+ * @param Sabre\DAV\Server $server
+ * @param string $realm
+ * @throws Sabre\DAV\Exception\NotAuthenticated
+ */
+ function authenticate(DAV\Server $server, $realm) {
+
+ if ($realm=='failme') throw new DAV\Exception\NotAuthenticated('deliberate fail');
+ $this->currentUser = $this->defaultUser;
+
+ }
+
+ function setCurrentUser($user) {
+
+ $this->currentUser = $user;
+
+ }
+
+ function getCurrentUser() {
+
+ return $this->currentUser;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/Auth/Backend/PDOMySQLTest.php b/vendor/sabre/dav/tests/Sabre/DAV/Auth/Backend/PDOMySQLTest.php
new file mode 100644
index 000000000..ede432de2
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/Auth/Backend/PDOMySQLTest.php
@@ -0,0 +1,31 @@
+<?php
+
+namespace Sabre\DAV\Auth\Backend;
+
+require_once 'Sabre/TestUtil.php';
+
+class PDOMySQLTest extends AbstractPDOTest {
+
+ function getPDO() {
+
+ if (!SABRE_HASMYSQL) $this->markTestSkipped('MySQL driver is not available, or not properly configured');
+ $pdo = \Sabre\TestUtil::getMySQLDB();
+ if (!$pdo) $this->markTestSkipped('Could not connect to MySQL database');
+ $pdo->query("DROP TABLE IF EXISTS users");
+ $pdo->query("
+create table users (
+ id integer unsigned not null primary key auto_increment,
+ username varchar(50),
+ digesta1 varchar(32),
+ email varchar(80),
+ displayname varchar(80),
+ unique(username)
+);");
+
+ $pdo->query("INSERT INTO users (username,digesta1,email,displayname) VALUES ('user','hash','user@example.org','User')");
+
+ return $pdo;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/Auth/Backend/PDOSqliteTest.php b/vendor/sabre/dav/tests/Sabre/DAV/Auth/Backend/PDOSqliteTest.php
new file mode 100644
index 000000000..abfb031bb
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/Auth/Backend/PDOSqliteTest.php
@@ -0,0 +1,28 @@
+<?php
+
+namespace Sabre\DAV\Auth\Backend;
+
+require_once 'Sabre/DAV/Auth/Backend/AbstractPDOTest.php';
+
+class PDOSQLiteTest extends AbstractPDOTest {
+
+ function tearDown() {
+
+ if (file_exists(SABRE_TEMPDIR . '/pdobackend')) unlink(SABRE_TEMPDIR . '/pdobackend');
+ if (file_exists(SABRE_TEMPDIR . '/pdobackend2')) unlink(SABRE_TEMPDIR . '/pdobackend2');
+
+ }
+
+ function getPDO() {
+
+ if (!SABRE_HASSQLITE) $this->markTestSkipped('SQLite driver is not available');
+ $pdo = new \PDO('sqlite:'.SABRE_TEMPDIR.'/pdobackend');
+ $pdo->setAttribute(\PDO::ATTR_ERRMODE,\PDO::ERRMODE_EXCEPTION);
+ $pdo->query('CREATE TABLE users (username TEXT, digesta1 TEXT, email VARCHAR(80), displayname VARCHAR(80))');
+ $pdo->query('INSERT INTO users VALUES ("user","hash","user@example.org","User")');
+
+ return $pdo;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/Auth/PluginTest.php b/vendor/sabre/dav/tests/Sabre/DAV/Auth/PluginTest.php
new file mode 100644
index 000000000..2096a04d7
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/Auth/PluginTest.php
@@ -0,0 +1,84 @@
+<?php
+
+namespace Sabre\DAV\Auth;
+
+use Sabre\HTTP;
+use Sabre\DAV;
+
+require_once 'Sabre/HTTP/ResponseMock.php';
+
+class PluginTest extends \PHPUnit_Framework_TestCase {
+
+ function testInit() {
+
+ $fakeServer = new DAV\Server( new DAV\SimpleCollection('bla'));
+ $plugin = new Plugin(new Backend\Mock(),'realm');
+ $this->assertTrue($plugin instanceof Plugin);
+ $fakeServer->addPlugin($plugin);
+ $this->assertEquals($plugin, $fakeServer->getPlugin('auth'));
+
+ }
+
+ /**
+ * @depends testInit
+ */
+ function testAuthenticate() {
+
+ $fakeServer = new DAV\Server( new DAV\SimpleCollection('bla'));
+ $plugin = new Plugin(new Backend\Mock(),'realm');
+ $fakeServer->addPlugin($plugin);
+ $fakeServer->broadCastEvent('beforeMethod',array('GET','/'));
+
+ }
+
+
+
+ /**
+ * @depends testInit
+ * @expectedException Sabre\DAV\Exception\NotAuthenticated
+ */
+ function testAuthenticateFail() {
+
+ $fakeServer = new DAV\Server( new DAV\SimpleCollection('bla'));
+ $plugin = new Plugin(new Backend\Mock(),'failme');
+ $fakeServer->addPlugin($plugin);
+ $fakeServer->broadCastEvent('beforeMethod',array('GET','/'));
+
+ }
+
+ function testReportPassThrough() {
+
+ $fakeServer = new DAV\Server(new DAV\SimpleCollection('bla'));
+ $plugin = new Plugin(new Backend\Mock(),'realm');
+ $fakeServer->addPlugin($plugin);
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'REPORT',
+ 'HTTP_CONTENT_TYPE' => 'application/xml',
+ 'REQUEST_URI' => '/',
+ ));
+ $request->setBody('<?xml version="1.0"?><s:somereport xmlns:s="http://www.rooftopsolutions.nl/NS/example" />');
+
+ $fakeServer->httpRequest = $request;
+ $fakeServer->httpResponse = new HTTP\ResponseMock();
+ $fakeServer->exec();
+
+ $this->assertEquals('HTTP/1.1 403 Forbidden', $fakeServer->httpResponse->status);
+
+ }
+
+ /**
+ * @depends testInit
+ */
+ function testGetCurrentUserPrincipal() {
+
+ $fakeServer = new DAV\Server( new DAV\SimpleCollection('bla'));
+ $plugin = new Plugin(new Backend\Mock(),'realm');
+ $fakeServer->addPlugin($plugin);
+ $fakeServer->broadCastEvent('beforeMethod',array('GET','/'));
+ $this->assertEquals('admin', $plugin->getCurrentUser());
+
+ }
+
+}
+
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/BasicNodeTest.php b/vendor/sabre/dav/tests/Sabre/DAV/BasicNodeTest.php
new file mode 100644
index 000000000..fdc2403db
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/BasicNodeTest.php
@@ -0,0 +1,234 @@
+<?php
+
+namespace Sabre\DAV;
+
+class BasicNodeTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * @expectedException Sabre\DAV\Exception\Forbidden
+ */
+ public function testPut() {
+
+ $file = new FileMock();
+ $file->put('hi');
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\Forbidden
+ */
+ public function testGet() {
+
+ $file = new FileMock();
+ $file->get();
+
+ }
+
+ public function testGetSize() {
+
+ $file = new FileMock();
+ $this->assertEquals(0,$file->getSize());
+
+ }
+
+
+ public function testGetETag() {
+
+ $file = new FileMock();
+ $this->assertNull($file->getETag());
+
+ }
+
+ public function testGetContentType() {
+
+ $file = new FileMock();
+ $this->assertNull($file->getContentType());
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\Forbidden
+ */
+ public function testDelete() {
+
+ $file = new FileMock();
+ $file->delete();
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\Forbidden
+ */
+ public function testSetName() {
+
+ $file = new FileMock();
+ $file->setName('hi');
+
+ }
+
+ public function testGetLastModified() {
+
+ $file = new FileMock();
+ // checking if lastmod is within the range of a few seconds
+ $lastMod = $file->getLastModified();
+ $compareTime = ($lastMod + 1)-time();
+ $this->assertTrue($compareTime < 3);
+
+ }
+
+ public function testGetChild() {
+
+ $dir = new DirectoryMock();
+ $file = $dir->getChild('mockfile');
+ $this->assertTrue($file instanceof FileMock);
+
+ }
+
+ public function testChildExists() {
+
+ $dir = new DirectoryMock();
+ $this->assertTrue($dir->childExists('mockfile'));
+
+ }
+
+ public function testChildExistsFalse() {
+
+ $dir = new DirectoryMock();
+ $this->assertFalse($dir->childExists('mockfile2'));
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\NotFound
+ */
+ public function testGetChild404() {
+
+ $dir = new DirectoryMock();
+ $file = $dir->getChild('blabla');
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\Forbidden
+ */
+ public function testCreateFile() {
+
+ $dir = new DirectoryMock();
+ $dir->createFile('hello','data');
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\Forbidden
+ */
+ public function testCreateDirectory() {
+
+ $dir = new DirectoryMock();
+ $dir->createDirectory('hello');
+
+ }
+
+ public function testSimpleDirectoryConstruct() {
+
+ $dir = new SimpleCollection('simpledir',array());
+
+ }
+
+ /**
+ * @depends testSimpleDirectoryConstruct
+ */
+ public function testSimpleDirectoryConstructChild() {
+
+ $file = new FileMock();
+ $dir = new SimpleCollection('simpledir',array($file));
+ $file2 = $dir->getChild('mockfile');
+
+ $this->assertEquals($file,$file2);
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception
+ * @depends testSimpleDirectoryConstruct
+ */
+ public function testSimpleDirectoryBadParam() {
+
+ $dir = new SimpleCollection('simpledir',array('string shouldn\'t be here'));
+
+ }
+
+ /**
+ * @depends testSimpleDirectoryConstruct
+ */
+ public function testSimpleDirectoryAddChild() {
+
+ $file = new FileMock();
+ $dir = new SimpleCollection('simpledir');
+ $dir->addChild($file);
+ $file2 = $dir->getChild('mockfile');
+
+ $this->assertEquals($file,$file2);
+
+ }
+
+ /**
+ * @depends testSimpleDirectoryConstruct
+ * @depends testSimpleDirectoryAddChild
+ */
+ public function testSimpleDirectoryGetChildren() {
+
+ $file = new FileMock();
+ $dir = new SimpleCollection('simpledir');
+ $dir->addChild($file);
+
+ $this->assertEquals(array($file),$dir->getChildren());
+
+ }
+
+ /*
+ * @depends testSimpleDirectoryConstruct
+ */
+ public function testSimpleDirectoryGetName() {
+
+ $dir = new SimpleCollection('simpledir');
+ $this->assertEquals('simpledir',$dir->getName());
+
+ }
+
+ /**
+ * @depends testSimpleDirectoryConstruct
+ * @expectedException Sabre\DAV\Exception\NotFound
+ */
+ public function testSimpleDirectoryGetChild404() {
+
+ $dir = new SimpleCollection('simpledir');
+ $dir->getChild('blabla');
+
+ }
+}
+
+class DirectoryMock extends Collection {
+
+ function getName() {
+
+ return 'mockdir';
+
+ }
+
+ function getChildren() {
+
+ return array(new FileMock());
+
+ }
+
+}
+
+class FileMock extends File {
+
+ function getName() {
+
+ return 'mockfile';
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/Browser/GuessContentTypeTest.php b/vendor/sabre/dav/tests/Sabre/DAV/Browser/GuessContentTypeTest.php
new file mode 100644
index 000000000..6fc65f9e8
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/Browser/GuessContentTypeTest.php
@@ -0,0 +1,68 @@
+<?php
+
+namespace Sabre\DAV\Browser;
+
+use Sabre\DAV;
+
+require_once 'Sabre/DAV/AbstractServer.php';
+class GuessContentTypeTest extends DAV\AbstractServer {
+
+ function setUp() {
+
+ parent::setUp();
+ file_put_contents(SABRE_TEMPDIR . '/somefile.jpg','blabla');
+ file_put_contents(SABRE_TEMPDIR . '/somefile.hoi','blabla');
+
+ }
+
+ function tearDown() {
+
+ unlink(SABRE_TEMPDIR . '/somefile.jpg');
+ parent::tearDown();
+ }
+
+ function testGetProperties() {
+
+ $properties = array(
+ '{DAV:}getcontenttype',
+ );
+ $result = $this->server->getPropertiesForPath('/somefile.jpg',$properties);
+ $this->assertArrayHasKey(0,$result);
+ $this->assertArrayHasKey(404,$result[0]);
+ $this->assertArrayHasKey('{DAV:}getcontenttype',$result[0][404]);
+
+ }
+
+ /**
+ * @depends testGetProperties
+ */
+ function testGetPropertiesPluginEnabled() {
+
+ $this->server->addPlugin(new GuessContentType());
+ $properties = array(
+ '{DAV:}getcontenttype',
+ );
+ $result = $this->server->getPropertiesForPath('/somefile.jpg',$properties);
+ $this->assertArrayHasKey(0,$result);
+ $this->assertArrayHasKey(200,$result[0]);
+ $this->assertArrayHasKey('{DAV:}getcontenttype',$result[0][200]);
+ $this->assertEquals('image/jpeg',$result[0][200]['{DAV:}getcontenttype']);
+
+ }
+
+ /**
+ * @depends testGetPropertiesPluginEnabled
+ */
+ function testGetPropertiesUnknown() {
+
+ $this->server->addPlugin(new GuessContentType());
+ $properties = array(
+ '{DAV:}getcontenttype',
+ );
+ $result = $this->server->getPropertiesForPath('/somefile.hoi',$properties);
+ $this->assertArrayHasKey(0,$result);
+ $this->assertArrayHasKey(404,$result[0]);
+ $this->assertArrayHasKey('{DAV:}getcontenttype',$result[0][404]);
+
+ }
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/Browser/MapGetToPropFindTest.php b/vendor/sabre/dav/tests/Sabre/DAV/Browser/MapGetToPropFindTest.php
new file mode 100644
index 000000000..169675e7e
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/Browser/MapGetToPropFindTest.php
@@ -0,0 +1,44 @@
+<?php
+
+namespace Sabre\DAV\Browser;
+
+use Sabre\DAV;
+use Sabre\HTTP;
+
+require_once 'Sabre/DAV/AbstractServer.php';
+
+class MapGetToPropFindTest extends DAV\AbstractServer {
+
+ function setUp() {
+
+ parent::setUp();
+ $this->server->addPlugin(new MapGetToPropFind());
+
+ }
+
+ function testCollectionGet() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/',
+ 'REQUEST_METHOD' => 'GET',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('');
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml; charset=utf-8',
+ 'DAV' => '1, 3, extended-mkcol',
+ 'Vary' => 'Brief,Prefer',
+ ),
+ $this->response->headers
+ );
+
+ $this->assertEquals('HTTP/1.1 207 Multi-Status',$this->response->status,'Incorrect status response received. Full response body: ' . $this->response->body);
+
+ }
+
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/Browser/PluginTest.php b/vendor/sabre/dav/tests/Sabre/DAV/Browser/PluginTest.php
new file mode 100644
index 000000000..c3c4bdebb
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/Browser/PluginTest.php
@@ -0,0 +1,114 @@
+<?php
+
+namespace Sabre\DAV\Browser;
+
+use Sabre\DAV;
+use Sabre\HTTP;
+
+require_once 'Sabre/DAV/AbstractServer.php';
+
+class PluginTest extends DAV\AbstractServer{
+
+ function setUp() {
+
+ parent::setUp();
+ $this->server->addPlugin(new Plugin());
+
+ }
+
+ function testCollectionGet() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/dir',
+ 'REQUEST_METHOD' => 'GET',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 200 OK',$this->response->status);
+ $this->assertEquals(array(
+ 'Content-Type' => 'text/html; charset=utf-8',
+ ),
+ $this->response->headers
+ );
+
+ $this->assertTrue(strpos($this->response->body, 'Index for dir/') !== false);
+ $this->assertTrue(strpos($this->response->body, '<a href="/dir/child.txt"><img src="/?sabreAction=asset&assetName=icons%2Ffile.png" alt="" width="24" />')!==false);
+
+ }
+
+ function testNotFound() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/random',
+ 'REQUEST_METHOD' => 'GET',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 404 Not Found',$this->response->status);
+
+ }
+
+ function testPostOtherContentType() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/',
+ 'REQUEST_METHOD' => 'POST',
+ 'CONTENT_TYPE' => 'text/xml',
+ );
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 501 Not Implemented', $this->response->status);
+
+ }
+
+ function testPostNoSabreAction() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/',
+ 'REQUEST_METHOD' => 'POST',
+ 'CONTENT_TYPE' => 'application/x-www-form-urlencoded',
+ );
+ $postVars = array();
+
+ $request = new HTTP\Request($serverVars,$postVars);
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 501 Not Implemented', $this->response->status);
+
+ }
+
+ function testPostMkCol() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/',
+ 'REQUEST_METHOD' => 'POST',
+ 'CONTENT_TYPE' => 'application/x-www-form-urlencoded',
+ );
+ $postVars = array(
+ 'sabreAction' => 'mkcol',
+ 'name' => 'new_collection',
+ );
+
+ $request = new HTTP\Request($serverVars,$postVars);
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 302 Found', $this->response->status);
+ $this->assertEquals(array(
+ 'Location' => '/',
+ ), $this->response->headers);
+
+ $this->assertTrue(is_dir(SABRE_TEMPDIR . '/new_collection'));
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/ClientMock.php b/vendor/sabre/dav/tests/Sabre/DAV/ClientMock.php
new file mode 100644
index 000000000..6e74e6ec0
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/ClientMock.php
@@ -0,0 +1,32 @@
+<?php
+
+namespace Sabre\DAV;
+
+class ClientMock extends Client {
+
+ public $response;
+
+ public $url;
+ public $curlSettings;
+
+ protected function curlRequest($url, $curlSettings) {
+
+ $this->url = $url;
+ $this->curlSettings = $curlSettings;
+ return $this->response;
+
+ }
+
+ /**
+ * Just making this method public
+ *
+ * @param string $url
+ * @return string
+ */
+ public function getAbsoluteUrl($url) {
+
+ return parent::getAbsoluteUrl($url);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/ClientTest.php b/vendor/sabre/dav/tests/Sabre/DAV/ClientTest.php
new file mode 100644
index 000000000..9c3532a47
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/ClientTest.php
@@ -0,0 +1,949 @@
+<?php
+
+namespace Sabre\DAV;
+
+require_once 'Sabre/DAV/ClientMock.php';
+
+class ClientTest extends \PHPUnit_Framework_TestCase {
+
+ function testConstruct() {
+
+ $client = new ClientMock(array(
+ 'baseUri' => '/',
+ ));
+
+ }
+
+ /**
+ * @expectedException InvalidArgumentException
+ */
+ function testConstructNoBaseUri() {
+
+ $client = new ClientMock(array());
+
+ }
+
+ function testRequest() {
+
+ $client = new ClientMock(array(
+ 'baseUri' => 'http://example.org/foo/bar/',
+ ));
+
+ $responseBlob = array(
+ "HTTP/1.1 200 OK",
+ "Content-Type: text/plain",
+ "",
+ "Hello there!"
+ );
+
+ $client->response = array(
+ implode("\r\n", $responseBlob),
+ array(
+ 'header_size' => 45,
+ 'http_code' => 200,
+ ),
+ 0,
+ ""
+ );
+
+ $result = $client->request('POST', 'baz', 'sillybody', array('Content-Type' => 'text/plain'));
+
+ $this->assertEquals('http://example.org/foo/bar/baz', $client->url);
+ $this->assertEquals(array(
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_MAXREDIRS => 5,
+ CURLOPT_CUSTOMREQUEST => 'POST',
+ CURLOPT_POSTFIELDS => 'sillybody',
+ CURLOPT_HEADER => true,
+ CURLOPT_HTTPHEADER => array('Content-Type: text/plain'),
+ ), $client->curlSettings);
+
+ $this->assertEquals(array(
+ 'statusCode' => 200,
+ 'headers' => array(
+ 'content-type' => 'text/plain',
+ ),
+ 'body' => 'Hello there!'
+ ), $result);
+
+
+ }
+
+
+ function testRequestProxy() {
+
+ $client = new ClientMock(array(
+ 'baseUri' => 'http://example.org/foo/bar/',
+ 'proxy' => 'http://localhost:8000/',
+ ));
+
+ $responseBlob = array(
+ "HTTP/1.1 200 OK",
+ "Content-Type: text/plain",
+ "",
+ "Hello there!"
+ );
+
+ $client->response = array(
+ implode("\r\n", $responseBlob),
+ array(
+ 'header_size' => 45,
+ 'http_code' => 200,
+ ),
+ 0,
+ ""
+ );
+
+ $result = $client->request('POST', 'baz', 'sillybody', array('Content-Type' => 'text/plain'));
+
+ $this->assertEquals('http://example.org/foo/bar/baz', $client->url);
+ $this->assertEquals(array(
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_MAXREDIRS => 5,
+ CURLOPT_CUSTOMREQUEST => 'POST',
+ CURLOPT_POSTFIELDS => 'sillybody',
+ CURLOPT_HEADER => true,
+ CURLOPT_HTTPHEADER => array('Content-Type: text/plain'),
+ CURLOPT_PROXY => 'http://localhost:8000/',
+ ), $client->curlSettings);
+
+ $this->assertEquals(array(
+ 'statusCode' => 200,
+ 'headers' => array(
+ 'content-type' => 'text/plain',
+ ),
+ 'body' => 'Hello there!'
+ ), $result);
+
+ }
+
+ function testRequestCAInfo() {
+
+ $client = new ClientMock(array(
+ 'baseUri' => 'http://example.org/foo/bar/',
+ ));
+
+ $responseBlob = array(
+ "HTTP/1.1 200 OK",
+ "Content-Type: text/plain",
+ "",
+ "Hello there!"
+ );
+
+ $client->response = array(
+ implode("\r\n", $responseBlob),
+ array(
+ 'header_size' => 45,
+ 'http_code' => 200,
+ ),
+ 0,
+ ""
+ );
+
+ $client->addTrustedCertificates('bla');
+
+ $result = $client->request('POST', 'baz', 'sillybody', array('Content-Type' => 'text/plain'));
+
+ $this->assertEquals('http://example.org/foo/bar/baz', $client->url);
+ $this->assertEquals(array(
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_MAXREDIRS => 5,
+ CURLOPT_CUSTOMREQUEST => 'POST',
+ CURLOPT_POSTFIELDS => 'sillybody',
+ CURLOPT_HEADER => true,
+ CURLOPT_CAINFO => 'bla',
+ CURLOPT_HTTPHEADER => array('Content-Type: text/plain'),
+ ), $client->curlSettings);
+
+ }
+
+ function testRequestSslPeer() {
+
+ $client = new ClientMock(array(
+ 'baseUri' => 'http://example.org/foo/bar/',
+ ));
+
+ $responseBlob = array(
+ "HTTP/1.1 200 OK",
+ "Content-Type: text/plain",
+ "",
+ "Hello there!"
+ );
+
+ $client->response = array(
+ implode("\r\n", $responseBlob),
+ array(
+ 'header_size' => 45,
+ 'http_code' => 200,
+ ),
+ 0,
+ ""
+ );
+
+ $client->setVerifyPeer(true);
+
+ $result = $client->request('POST', 'baz', 'sillybody', array('Content-Type' => 'text/plain'));
+
+ $this->assertEquals('http://example.org/foo/bar/baz', $client->url);
+ $this->assertEquals(array(
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_MAXREDIRS => 5,
+ CURLOPT_CUSTOMREQUEST => 'POST',
+ CURLOPT_POSTFIELDS => 'sillybody',
+ CURLOPT_HEADER => true,
+ CURLOPT_HTTPHEADER => array('Content-Type: text/plain'),
+ CURLOPT_SSL_VERIFYPEER => true
+ ), $client->curlSettings);
+
+ }
+
+ function testRequestAuth() {
+
+ $client = new ClientMock(array(
+ 'baseUri' => 'http://example.org/foo/bar/',
+ 'userName' => 'user',
+ 'password' => 'password',
+ ));
+
+ $responseBlob = array(
+ "HTTP/1.1 200 OK",
+ "Content-Type: text/plain",
+ "",
+ "Hello there!"
+ );
+
+ $client->response = array(
+ implode("\r\n", $responseBlob),
+ array(
+ 'header_size' => 45,
+ 'http_code' => 200,
+ ),
+ 0,
+ ""
+ );
+
+ $result = $client->request('POST', 'baz', 'sillybody', array('Content-Type' => 'text/plain'));
+
+ $this->assertEquals('http://example.org/foo/bar/baz', $client->url);
+ $this->assertEquals(array(
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_MAXREDIRS => 5,
+ CURLOPT_CUSTOMREQUEST => 'POST',
+ CURLOPT_POSTFIELDS => 'sillybody',
+ CURLOPT_HEADER => true,
+ CURLOPT_HTTPHEADER => array('Content-Type: text/plain'),
+ CURLOPT_HTTPAUTH => CURLAUTH_BASIC | CURLAUTH_DIGEST,
+ CURLOPT_USERPWD => 'user:password'
+ ), $client->curlSettings);
+
+ $this->assertEquals(array(
+ 'statusCode' => 200,
+ 'headers' => array(
+ 'content-type' => 'text/plain',
+ ),
+ 'body' => 'Hello there!'
+ ), $result);
+
+ }
+
+ function testRequestAuthBasic() {
+
+ $client = new ClientMock(array(
+ 'baseUri' => 'http://example.org/foo/bar/',
+ 'userName' => 'user',
+ 'password' => 'password',
+ 'authType' => Client::AUTH_BASIC,
+ ));
+
+ $responseBlob = array(
+ "HTTP/1.1 200 OK",
+ "Content-Type: text/plain",
+ "",
+ "Hello there!"
+ );
+
+ $client->response = array(
+ implode("\r\n", $responseBlob),
+ array(
+ 'header_size' => 45,
+ 'http_code' => 200,
+ ),
+ 0,
+ ""
+ );
+
+ $result = $client->request('POST', 'baz', 'sillybody', array('Content-Type' => 'text/plain'));
+
+ $this->assertEquals('http://example.org/foo/bar/baz', $client->url);
+ $this->assertEquals(array(
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_MAXREDIRS => 5,
+ CURLOPT_CUSTOMREQUEST => 'POST',
+ CURLOPT_POSTFIELDS => 'sillybody',
+ CURLOPT_HEADER => true,
+ CURLOPT_HTTPHEADER => array('Content-Type: text/plain'),
+ CURLOPT_HTTPAUTH => CURLAUTH_BASIC,
+ CURLOPT_USERPWD => 'user:password'
+ ), $client->curlSettings);
+
+ $this->assertEquals(array(
+ 'statusCode' => 200,
+ 'headers' => array(
+ 'content-type' => 'text/plain',
+ ),
+ 'body' => 'Hello there!'
+ ), $result);
+
+ }
+
+ function testRequestAuthDigest() {
+
+ $client = new ClientMock(array(
+ 'baseUri' => 'http://example.org/foo/bar/',
+ 'userName' => 'user',
+ 'password' => 'password',
+ 'authType' => Client::AUTH_DIGEST,
+ ));
+
+ $responseBlob = array(
+ "HTTP/1.1 200 OK",
+ "Content-Type: text/plain",
+ "",
+ "Hello there!"
+ );
+
+ $client->response = array(
+ implode("\r\n", $responseBlob),
+ array(
+ 'header_size' => 45,
+ 'http_code' => 200,
+ ),
+ 0,
+ ""
+ );
+
+ $result = $client->request('POST', 'baz', 'sillybody', array('Content-Type' => 'text/plain'));
+
+ $this->assertEquals('http://example.org/foo/bar/baz', $client->url);
+ $this->assertEquals(array(
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_MAXREDIRS => 5,
+ CURLOPT_CUSTOMREQUEST => 'POST',
+ CURLOPT_POSTFIELDS => 'sillybody',
+ CURLOPT_HEADER => true,
+ CURLOPT_HTTPHEADER => array('Content-Type: text/plain'),
+ CURLOPT_HTTPAUTH => CURLAUTH_DIGEST,
+ CURLOPT_USERPWD => 'user:password'
+ ), $client->curlSettings);
+
+ $this->assertEquals(array(
+ 'statusCode' => 200,
+ 'headers' => array(
+ 'content-type' => 'text/plain',
+ ),
+ 'body' => 'Hello there!'
+ ), $result);
+
+ }
+ function testRequestError() {
+
+ $client = new ClientMock(array(
+ 'baseUri' => 'http://example.org/foo/bar/',
+ ));
+
+ $responseBlob = array(
+ "HTTP/1.1 200 OK",
+ "Content-Type: text/plain",
+ "",
+ "Hello there!"
+ );
+
+ $client->response = array(
+ implode("\r\n", $responseBlob),
+ array(
+ 'header_size' => 45,
+ 'http_code' => 200,
+ ),
+ CURLE_COULDNT_CONNECT,
+ "Could not connect, or something"
+ );
+
+ $caught = false;
+ try {
+ $client->request('POST', 'baz', 'sillybody', array('Content-Type' => 'text/plain'));
+ } catch (Exception $e) {
+ $caught = true;
+ }
+ if (!$caught) {
+ $this->markTestFailed('Exception was not thrown');
+ }
+
+ }
+
+ function testRequestHTTPError() {
+
+ $client = new ClientMock(array(
+ 'baseUri' => 'http://example.org/foo/bar/',
+ ));
+
+ $responseBlob = array(
+ "HTTP/1.1 400 Bad Request",
+ "Content-Type: text/plain",
+ "",
+ "Hello there!"
+ );
+
+ $client->response = array(
+ implode("\r\n", $responseBlob),
+ array(
+ 'header_size' => 45,
+ 'http_code' => 400,
+ ),
+ 0,
+ ""
+ );
+
+ $caught = false;
+ try {
+ $client->request('POST', 'baz', 'sillybody', array('Content-Type' => 'text/plain'));
+ } catch (Exception $e) {
+ $caught = true;
+ }
+ if (!$caught) {
+ $this->fail('Exception was not thrown');
+ }
+
+ }
+
+ function testRequestHTTP404() {
+
+ $client = new ClientMock(array(
+ 'baseUri' => 'http://example.org/foo/bar/',
+ ));
+
+ $responseBlob = array(
+ "HTTP/1.1 404 Not Found",
+ "Content-Type: text/plain",
+ "",
+ "Hello there!"
+ );
+
+ $client->response = array(
+ implode("\r\n", $responseBlob),
+ array(
+ 'header_size' => 45,
+ 'http_code' => 404,
+ ),
+ 0,
+ ""
+ );
+
+ $caught = false;
+ try {
+ $client->request('POST', 'baz', 'sillybody', array('Content-Type' => 'text/plain'));
+ } catch (Exception\NotFound $e) {
+ $caught = true;
+ }
+ if (!$caught) {
+ $this->fail('Exception was not thrown');
+ }
+
+ }
+
+ /**
+ * @dataProvider supportedHTTPCodes
+ */
+ function testSpecificHTTPErrors($error) {
+
+ $client = new ClientMock(array(
+ 'baseUri' => 'http://example.org/foo/bar/',
+ ));
+
+ $responseBlob = array(
+ "HTTP/1.1 $error blabla",
+ "Content-Type: text/plain",
+ "",
+ "Hello there!"
+ );
+
+ $client->response = array(
+ implode("\r\n", $responseBlob),
+ array(
+ 'header_size' => 42,
+ 'http_code' => $error,
+ ),
+ 0,
+ ""
+ );
+
+ try {
+ $client->request('POST', 'baz', 'sillybody', array('Content-Type' => 'text/plain'));
+ $this->fail('Exception was not thrown');
+ } catch (Exception $e) {
+ $this->assertEquals($e->getHTTPCode(), $error);
+ }
+
+
+ }
+
+ public function supportedHTTPCodes() {
+
+ return array(
+ array(400),
+ array(401),
+ array(402),
+ array(403),
+ array(404),
+ array(405),
+ array(409),
+ array(412),
+ array(416),
+ array(500),
+ array(501),
+ array(507),
+ );
+
+ }
+
+ function testUnsupportedHTTPError() {
+
+ $client = new ClientMock(array(
+ 'baseUri' => 'http://example.org/foo/bar/',
+ ));
+
+ $responseBlob = array(
+ "HTTP/1.1 580 blabla",
+ "Content-Type: text/plain",
+ "",
+ "Hello there!"
+ );
+
+ $client->response = array(
+ implode("\r\n", $responseBlob),
+ array(
+ 'header_size' => 42,
+ 'http_code' => "580"
+ ),
+ 0,
+ ""
+ );
+
+ try {
+ $client->request('POST', 'baz', 'sillybody', array('Content-Type' => 'text/plain'));
+ $this->fail('Exception was not thrown');
+ } catch (Exception $e) {
+ $this->assertEquals(500, $e->getHTTPCode());
+ }
+
+
+ }
+
+ function testGetAbsoluteUrl() {
+
+ $client = new ClientMock(array(
+ 'baseUri' => 'http://example.org/foo/',
+ ));
+
+ $this->assertEquals(
+ 'http://example.org/foo/bar',
+ $client->getAbsoluteUrl('bar')
+ );
+
+ $this->assertEquals(
+ 'http://example.org/bar',
+ $client->getAbsoluteUrl('/bar')
+ );
+
+ $this->assertEquals(
+ 'http://example.com/bar',
+ $client->getAbsoluteUrl('http://example.com/bar')
+ );
+
+ }
+
+ function testOptions() {
+
+ $client = new ClientMock(array(
+ 'baseUri' => 'http://example.org/foo/bar/',
+ ));
+
+ $responseBlob = array(
+ "HTTP/1.1 200 OK",
+ "DAV: feature1, feature2",
+ "",
+ );
+
+ $client->response = array(
+ implode("\r\n", $responseBlob),
+ array(
+ 'header_size' => 40,
+ 'http_code' => 200,
+ ),
+ 0,
+ ""
+ );
+
+ $result = $client->options();
+ $this->assertEquals(
+ array('feature1', 'feature2'),
+ $result
+ );
+
+ }
+
+ function testOptionsNoDav() {
+
+ $client = new ClientMock(array(
+ 'baseUri' => 'http://example.org/foo/bar/',
+ ));
+
+ $responseBlob = array(
+ "HTTP/1.1 200 OK",
+ "",
+ );
+
+ $client->response = array(
+ implode("\r\n", $responseBlob),
+ array(
+ 'header_size' => 20,
+ 'http_code' => 200,
+ ),
+ 0,
+ ""
+ );
+
+ $result = $client->options();
+ $this->assertEquals(
+ array(),
+ $result
+ );
+
+ }
+
+ /**
+ * @expectedException InvalidArgumentException
+ */
+ function testPropFindNoXML() {
+
+ $client = new ClientMock(array(
+ 'baseUri' => 'http://example.org/foo/bar/',
+ ));
+
+ $responseBlob = array(
+ "HTTP/1.1 200 OK",
+ "",
+ );
+
+ $client->response = array(
+ implode("\r\n", $responseBlob),
+ array(
+ 'header_size' => 20,
+ 'http_code' => 200,
+ ),
+ 0,
+ ""
+ );
+
+ $client->propfind('', array('{DAV:}foo','{DAV:}bar'));
+
+ }
+
+ function testPropFind() {
+
+ $client = new ClientMock(array(
+ 'baseUri' => 'http://example.org/foo/bar/',
+ ));
+
+ $responseBlob = array(
+ "HTTP/1.1 200 OK",
+ "",
+ "<?xml version=\"1.0\"?>",
+ "<d:multistatus xmlns:d=\"DAV:\">",
+ " <d:response>",
+ " <d:href>/foo/bar/</d:href>",
+ " <d:propstat>",
+ " <d:prop>",
+ " <d:foo>hello</d:foo>",
+ " </d:prop>",
+ " <d:status>HTTP/1.1 200 OK</d:status>",
+ " </d:propstat>",
+ " <d:propstat>",
+ " <d:prop>",
+ " <d:bar />",
+ " </d:prop>",
+ " <d:status>HTTP/1.1 404 Not Found</d:status>",
+ " </d:propstat>",
+ " </d:response>",
+ "</d:multistatus>",
+ );
+
+ $client->response = array(
+ implode("\r\n", $responseBlob),
+ array(
+ 'header_size' => 19,
+ 'http_code' => 200,
+ ),
+ 0,
+ ""
+ );
+
+ $result = $client->propfind('', array('{DAV:}foo','{DAV:}bar'));
+
+ $this->assertEquals(array(
+ '{DAV:}foo' => 'hello',
+ ), $result);
+
+ $requestBody = array(
+ '<?xml version="1.0"?>',
+ '<d:propfind xmlns:d="DAV:">',
+ ' <d:prop>',
+ ' <d:foo />',
+ ' <d:bar />',
+ ' </d:prop>',
+ '</d:propfind>'
+ );
+ $requestBody = implode("\n", $requestBody);
+
+ $this->assertEquals($requestBody, $client->curlSettings[CURLOPT_POSTFIELDS]);
+
+ }
+
+ /**
+ * This was reported in Issue 235.
+ *
+ * If no '200 Ok' properties are returned, the client will throw an
+ * E_NOTICE.
+ */
+ function testPropFindNo200s() {
+
+ $client = new ClientMock(array(
+ 'baseUri' => 'http://example.org/foo/bar/',
+ ));
+
+ $responseBlob = array(
+ "HTTP/1.1 200 OK",
+ "",
+ "<?xml version=\"1.0\"?>",
+ "<d:multistatus xmlns:d=\"DAV:\">",
+ " <d:response>",
+ " <d:href>/foo/bar/</d:href>",
+ " <d:propstat>",
+ " <d:prop>",
+ " <d:bar />",
+ " </d:prop>",
+ " <d:status>HTTP/1.1 404 Not Found</d:status>",
+ " </d:propstat>",
+ " </d:response>",
+ "</d:multistatus>",
+ );
+
+ $client->response = array(
+ implode("\r\n", $responseBlob),
+ array(
+ 'header_size' => 19,
+ 'http_code' => 200,
+ ),
+ 0,
+ ""
+ );
+
+ $result = $client->propfind('', array('{DAV:}foo','{DAV:}bar'));
+
+ $this->assertEquals(array(
+ ), $result);
+
+ }
+
+ function testPropFindDepth1CustomProp() {
+
+ $client = new ClientMock(array(
+ 'baseUri' => 'http://example.org/foo/bar/',
+ ));
+
+ $responseBlob = array(
+ "HTTP/1.1 200 OK",
+ "",
+ "<?xml version=\"1.0\"?>",
+ "<d:multistatus xmlns:d=\"DAV:\" xmlns:x=\"urn:custom\">",
+ " <d:response>",
+ " <d:href>/foo/bar/</d:href>",
+ " <d:propstat>",
+ " <d:prop>",
+ " <d:foo>hello</d:foo>",
+ " <x:bar>world</x:bar>",
+ " </d:prop>",
+ " <d:status>HTTP/1.1 200 OK</d:status>",
+ " </d:propstat>",
+ " </d:response>",
+ "</d:multistatus>",
+ );
+
+ $client->response = array(
+ implode("\r\n", $responseBlob),
+ array(
+ 'header_size' => 19,
+ 'http_code' => 200,
+ ),
+ 0,
+ ""
+ );
+
+ $result = $client->propfind('', array('{DAV:}foo','{urn:custom}bar'),1);
+
+ $this->assertEquals(array(
+ "/foo/bar/" => array(
+ '{DAV:}foo' => 'hello',
+ '{urn:custom}bar' => 'world',
+ ),
+ ), $result);
+
+ $requestBody = array(
+ '<?xml version="1.0"?>',
+ '<d:propfind xmlns:d="DAV:">',
+ ' <d:prop>',
+ ' <d:foo />',
+ ' <x:bar xmlns:x="urn:custom"/>',
+ ' </d:prop>',
+ '</d:propfind>'
+ );
+ $requestBody = implode("\n", $requestBody);
+
+ $this->assertEquals($requestBody, $client->curlSettings[CURLOPT_POSTFIELDS]);
+
+ }
+
+ function testPropPatch() {
+
+ $client = new ClientMock(array(
+ 'baseUri' => 'http://example.org/foo/bar/',
+ ));
+
+ $responseBlob = array(
+ "HTTP/1.1 200 OK",
+ "",
+ );
+
+ $client->response = array(
+ implode("\r\n", $responseBlob),
+ array(
+ 'header_size' => 20,
+ 'http_code' => 200,
+ ),
+ 0,
+ ""
+ );
+
+ $client->proppatch('', array(
+ '{DAV:}foo' => 'newvalue',
+ '{urn:custom}foo' => 'newvalue2',
+ '{DAV:}bar' => null,
+ '{urn:custom}bar' => null,
+ ));
+
+ $requestBody = array(
+ '<?xml version="1.0"?>',
+ '<d:propertyupdate xmlns:d="DAV:">',
+ '<d:set><d:prop>',
+ ' <d:foo>newvalue</d:foo>',
+ '</d:prop></d:set>',
+ '<d:set><d:prop>',
+ ' <x:foo xmlns:x="urn:custom">newvalue2</x:foo>',
+ '</d:prop></d:set>',
+ '<d:remove><d:prop>',
+ ' <d:bar />',
+ '</d:prop></d:remove>',
+ '<d:remove><d:prop>',
+ ' <x:bar xmlns:x="urn:custom"/>',
+ '</d:prop></d:remove>',
+ '</d:propertyupdate>'
+ );
+ $requestBody = implode("\n", $requestBody);
+
+ $this->assertEquals($requestBody, $client->curlSettings[CURLOPT_POSTFIELDS]);
+
+ }
+
+ function testHEADRequest() {
+
+ $client = new ClientMock(array(
+ 'baseUri' => 'http://example.org/foo/bar/',
+ ));
+
+ $responseBlob = array(
+ "HTTP/1.1 200 OK",
+ "Content-Type: text/plain",
+ "",
+ "Hello there!"
+ );
+
+ $client->response = array(
+ implode("\r\n", $responseBlob),
+ array(
+ 'header_size' => 45,
+ 'http_code' => 200,
+ ),
+ 0,
+ ""
+ );
+
+ $result = $client->request('HEAD', 'baz');
+
+ $this->assertEquals('http://example.org/foo/bar/baz', $client->url);
+ $this->assertEquals(array(
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_MAXREDIRS => 5,
+ CURLOPT_CUSTOMREQUEST => 'HEAD',
+ CURLOPT_NOBODY => true,
+ CURLOPT_HEADER => true,
+ CURLOPT_HTTPHEADER => array(),
+ CURLOPT_POSTFIELDS => null,
+ ), $client->curlSettings);
+
+ }
+
+ function testPUTRequest() {
+
+ $client = new ClientMock(array(
+ 'baseUri' => 'http://example.org/foo/bar/',
+ ));
+
+ $responseBlob = array(
+ "HTTP/1.1 200 OK",
+ "Content-Type: text/plain",
+ "",
+ "Hello there!"
+ );
+
+ $client->response = array(
+ implode("\r\n", $responseBlob),
+ array(
+ 'header_size' => 45,
+ 'http_code' => 200,
+ ),
+ 0,
+ ""
+ );
+
+ $result = $client->request('PUT', 'bar','newcontent');
+
+ $this->assertEquals('http://example.org/foo/bar/bar', $client->url);
+ $this->assertEquals(array(
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_MAXREDIRS => 5,
+ CURLOPT_CUSTOMREQUEST => "PUT",
+ CURLOPT_POSTFIELDS => 'newcontent',
+ CURLOPT_HEADER => true,
+ CURLOPT_HTTPHEADER => array(),
+ ), $client->curlSettings);
+
+ }
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/Exception/LockedTest.php b/vendor/sabre/dav/tests/Sabre/DAV/Exception/LockedTest.php
new file mode 100644
index 000000000..c06d6aa1f
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/Exception/LockedTest.php
@@ -0,0 +1,68 @@
+<?php
+
+namespace Sabre\DAV\Exception;
+
+use
+ Sabre\DAV,
+ DOMDocument;
+
+class LockedTest extends \PHPUnit_Framework_TestCase {
+
+ function testSerialize() {
+
+ $dom = new DOMDocument('1.0');
+ $dom->formatOutput = true;
+ $root = $dom->createElement('d:root');
+
+ $dom->appendChild($root);
+ $root->setAttribute('xmlns:d','DAV:');
+
+ $lockInfo = new DAV\Locks\LockInfo();
+ $lockInfo->uri = '/foo';
+ $locked = new Locked($lockInfo);
+
+ $locked->serialize(new DAV\Server(), $root);
+
+ $output = $dom->saveXML();
+
+ $expected = '<?xml version="1.0"?>
+<d:root xmlns:d="DAV:">
+ <d:lock-token-submitted xmlns:d="DAV:">
+ <d:href>/foo</d:href>
+ </d:lock-token-submitted>
+</d:root>
+';
+
+ $this->assertEquals($expected, $output);
+
+ }
+
+ function testSerializeAmpersand() {
+
+ $dom = new DOMDocument('1.0');
+ $dom->formatOutput = true;
+ $root = $dom->createElement('d:root');
+
+ $dom->appendChild($root);
+ $root->setAttribute('xmlns:d','DAV:');
+
+ $lockInfo = new DAV\Locks\LockInfo();
+ $lockInfo->uri = '/foo&bar';
+ $locked = new Locked($lockInfo);
+
+ $locked->serialize(new DAV\Server(), $root);
+
+ $output = $dom->saveXML();
+
+ $expected = '<?xml version="1.0"?>
+<d:root xmlns:d="DAV:">
+ <d:lock-token-submitted xmlns:d="DAV:">
+ <d:href>/foo&amp;bar</d:href>
+ </d:lock-token-submitted>
+</d:root>
+';
+
+ $this->assertEquals($expected, $output);
+
+ }
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/Exception/PaymentRequiredTest.php b/vendor/sabre/dav/tests/Sabre/DAV/Exception/PaymentRequiredTest.php
new file mode 100644
index 000000000..7142937b4
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/Exception/PaymentRequiredTest.php
@@ -0,0 +1,14 @@
+<?php
+
+namespace Sabre\DAV\Exception;
+
+class PaymentRequiredTest extends \PHPUnit_Framework_TestCase {
+
+ function testGetHTTPCode() {
+
+ $ex = new PaymentRequired();
+ $this->assertEquals(402, $ex->getHTTPCode());
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/ExceptionTest.php b/vendor/sabre/dav/tests/Sabre/DAV/ExceptionTest.php
new file mode 100644
index 000000000..6d6bf5668
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/ExceptionTest.php
@@ -0,0 +1,30 @@
+<?php
+
+namespace Sabre\DAV;
+
+class ExceptionTest extends \PHPUnit_Framework_TestCase {
+
+ function testStatus() {
+
+ $e = new Exception();
+ $this->assertEquals(500,$e->getHTTPCode());
+
+ }
+
+ function testExceptionStatuses() {
+
+ $c = array(
+ 'Sabre\\DAV\\Exception\\NotAuthenticated' => 401,
+ 'Sabre\\DAV\\Exception\\InsufficientStorage' => 507,
+ );
+
+ foreach($c as $class=>$status) {
+
+ $obj = new $class();
+ $this->assertEquals($status, $obj->getHTTPCode());
+
+ }
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/FSExt/FileTest.php b/vendor/sabre/dav/tests/Sabre/DAV/FSExt/FileTest.php
new file mode 100644
index 000000000..265f9f1c1
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/FSExt/FileTest.php
@@ -0,0 +1,95 @@
+<?php
+
+namespace Sabre\DAV\FSExt;
+
+use Sabre\DAV;
+
+require_once 'Sabre/TestUtil.php';
+
+class FileTest extends \PHPUnit_Framework_TestCase {
+
+ function setUp() {
+
+ file_put_contents(SABRE_TEMPDIR . '/file.txt', 'Contents');
+
+ }
+
+ function tearDown() {
+
+ \Sabre\TestUtil::clearTempDir();
+
+ }
+
+ function testPut() {
+
+ $file = new File(SABRE_TEMPDIR . '/file.txt');
+ $result = $file->put('New contents');
+
+ $this->assertEquals('New contents',file_get_contents(SABRE_TEMPDIR . '/file.txt'));
+ $this->assertEquals('"' . md5('New contents') . '"', $result);
+
+ }
+
+ function testRange() {
+
+ $file = new File(SABRE_TEMPDIR . '/file.txt');
+ $file->put('0000000');
+ $file->putRange('111',3);
+
+ $this->assertEquals('0011100',file_get_contents(SABRE_TEMPDIR . '/file.txt'));
+
+ }
+
+ function testRangeStream() {
+
+ $stream = fopen('php://memory','r+');
+ fwrite($stream, "222");
+ rewind($stream);
+
+ $file = new File(SABRE_TEMPDIR . '/file.txt');
+ $file->put('0000000');
+ $file->putRange($stream,3);
+
+ $this->assertEquals('0022200',file_get_contents(SABRE_TEMPDIR . '/file.txt'));
+
+ }
+
+
+ function testGet() {
+
+ $file = new File(SABRE_TEMPDIR . '/file.txt');
+ $this->assertEquals('Contents',stream_get_contents($file->get()));
+
+ }
+
+ function testDelete() {
+
+ $file = new File(SABRE_TEMPDIR . '/file.txt');
+ $file->delete();
+
+ $this->assertFalse(file_exists(SABRE_TEMPDIR . '/file.txt'));
+
+ }
+
+ function testGetETag() {
+
+ $file = new File(SABRE_TEMPDIR . '/file.txt');
+ $this->assertEquals('"' . md5('Contents') . '"',$file->getETag());
+
+ }
+
+ function testGetContentType() {
+
+ $file = new File(SABRE_TEMPDIR . '/file.txt');
+ $this->assertNull($file->getContentType());
+
+ }
+
+ function testGetSize() {
+
+ $file = new File(SABRE_TEMPDIR . '/file.txt');
+ $this->assertEquals(8,$file->getSize());
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/FSExt/NodeTest.php b/vendor/sabre/dav/tests/Sabre/DAV/FSExt/NodeTest.php
new file mode 100644
index 000000000..275075b4c
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/FSExt/NodeTest.php
@@ -0,0 +1,178 @@
+<?php
+
+namespace Sabre\DAV\FSExt;
+use Sabre\DAV;
+
+require_once 'Sabre/TestUtil.php';
+
+class NodeTest extends \PHPUnit_Framework_TestCase {
+
+ function setUp() {
+
+ mkdir(SABRE_TEMPDIR . '/dir');
+ file_put_contents(SABRE_TEMPDIR . '/dir/file.txt', 'Contents');
+ file_put_contents(SABRE_TEMPDIR . '/dir/file2.txt', 'Contents2');
+
+ }
+
+ function tearDown() {
+
+ \Sabre\TestUtil::clearTempDir();
+
+ }
+
+ function testUpdateProperties() {
+
+ $file = new File(SABRE_TEMPDIR . '/dir/file.txt');
+ $properties = array(
+ '{http://sabredav.org/NS/2010}test1' => 'foo',
+ '{http://sabredav.org/NS/2010}test2' => 'bar',
+ );
+
+ $result = $file->updateProperties($properties);
+ $expected = true;
+
+ $this->assertEquals($expected, $result);
+
+ $getProperties = $file->getProperties(array_keys($properties));
+
+ $this->assertEquals($properties, $getProperties);
+
+ }
+
+ /**
+ * @depends testUpdateProperties
+ */
+ function testUpdatePropertiesAgain() {
+
+ $file = new File(SABRE_TEMPDIR . '/dir/file.txt');
+ $mutations = array(
+ '{http://sabredav.org/NS/2010}test1' => 'foo',
+ '{http://sabredav.org/NS/2010}test2' => 'bar',
+ );
+
+ $result = $file->updateProperties($mutations);
+
+ $this->assertEquals(true, $result);
+
+ $mutations = array(
+ '{http://sabredav.org/NS/2010}test1' => 'foo',
+ '{http://sabredav.org/NS/2010}test3' => 'baz',
+ );
+
+ $result = $file->updateProperties($mutations);
+
+ $this->assertEquals(true, $result);
+ }
+
+ /**
+ * @depends testUpdateProperties
+ */
+ function testUpdatePropertiesDelete() {
+
+ $file = new File(SABRE_TEMPDIR . '/dir/file.txt');
+
+ $mutations = array(
+ '{http://sabredav.org/NS/2010}test1' => 'foo',
+ '{http://sabredav.org/NS/2010}test2' => 'bar',
+ );
+
+ $result = $file->updateProperties($mutations);
+
+ $this->assertEquals(true, $result);
+
+ $mutations = array(
+ '{http://sabredav.org/NS/2010}test1' => null,
+ '{http://sabredav.org/NS/2010}test3' => null
+ );
+
+ $result = $file->updateProperties($mutations);
+
+ $this->assertEquals(true, $result);
+
+ $properties = $file->getProperties(array('http://sabredav.org/NS/2010}test1','{http://sabredav.org/NS/2010}test2','{http://sabredav.org/NS/2010}test3'));
+
+ $this->assertEquals(array(
+ '{http://sabredav.org/NS/2010}test2' => 'bar',
+ ), $properties);
+ }
+
+ /**
+ * @depends testUpdateProperties
+ */
+ function testUpdatePropertiesMove() {
+
+ $file = new File(SABRE_TEMPDIR . '/dir/file.txt');
+
+ $mutations = array(
+ '{http://sabredav.org/NS/2010}test1' => 'foo',
+ '{http://sabredav.org/NS/2010}test2' => 'bar',
+ );
+
+ $result = $file->updateProperties($mutations);
+
+ $this->assertEquals(true, $result);
+
+ $properties = $file->getProperties(array('{http://sabredav.org/NS/2010}test1','{http://sabredav.org/NS/2010}test2','{http://sabredav.org/NS/2010}test3'));
+
+ $this->assertEquals(array(
+ '{http://sabredav.org/NS/2010}test1' => 'foo',
+ '{http://sabredav.org/NS/2010}test2' => 'bar',
+ ), $properties);
+
+ // Renaming
+ $file->setName('file3.txt');
+
+ $this->assertFalse(file_exists(SABRE_TEMPDIR . '/dir/file.txt'));
+ $this->assertTrue(file_exists(SABRE_TEMPDIR . '/dir/file3.txt'));
+ $this->assertEquals('file3.txt',$file->getName());
+
+ $newFile = new File(SABRE_TEMPDIR . '/dir/file3.txt');
+ $this->assertEquals('file3.txt',$newFile->getName());
+
+ $properties = $newFile->getProperties(array('{http://sabredav.org/NS/2010}test1','{http://sabredav.org/NS/2010}test2','{http://sabredav.org/NS/2010}test3'));
+
+ $this->assertEquals(array(
+ '{http://sabredav.org/NS/2010}test1' => 'foo',
+ '{http://sabredav.org/NS/2010}test2' => 'bar',
+ ), $properties);
+ }
+
+ /**
+ * @depends testUpdatePropertiesMove
+ */
+ function testUpdatePropertiesDeleteBleed() {
+
+ $file = new File(SABRE_TEMPDIR . '/dir/file.txt');
+ $mutations = array(
+ '{http://sabredav.org/NS/2010}test1' => 'foo',
+ '{http://sabredav.org/NS/2010}test2' => 'bar',
+ );
+
+ $result = $file->updateProperties($mutations);
+
+ $this->assertEquals(true, $result);
+
+ $properties = $file->getProperties(array('{http://sabredav.org/NS/2010}test1','{http://sabredav.org/NS/2010}test2','{http://sabredav.org/NS/2010}test3'));
+
+ $this->assertEquals(array(
+ '{http://sabredav.org/NS/2010}test1' => 'foo',
+ '{http://sabredav.org/NS/2010}test2' => 'bar',
+ ), $properties);
+
+ // Deleting
+ $file->delete();
+
+ $this->assertFalse(file_exists(SABRE_TEMPDIR . '/dir/file.txt'));
+
+ // Creating it again
+ file_put_contents(SABRE_TEMPDIR . '/dir/file.txt','New Contents');
+ $file = new File(SABRE_TEMPDIR . '/dir/file.txt');
+
+ $properties = $file->getProperties(array('http://sabredav.org/NS/2010}test1','{http://sabredav.org/NS/2010}test2','{http://sabredav.org/NS/2010}test3'));
+
+ $this->assertEquals(array(), $properties);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/FSExt/ServerTest.php b/vendor/sabre/dav/tests/Sabre/DAV/FSExt/ServerTest.php
new file mode 100644
index 000000000..907ede40b
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/FSExt/ServerTest.php
@@ -0,0 +1,224 @@
+<?php
+
+namespace Sabre\DAV\FSExt;
+
+use Sabre\DAV;
+use Sabre\HTTP;
+
+require_once 'Sabre/DAV/AbstractServer.php';
+
+class ServerTest extends DAV\AbstractServer{
+
+ protected function getRootNode() {
+
+ return new Directory($this->tempDir);
+
+ }
+
+ function testGet() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'GET',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/octet-stream',
+ 'Content-Length' => 13,
+ 'Last-Modified' => HTTP\Util::toHTTPDate(new \DateTime('@' . filemtime($this->tempDir . '/test.txt'))),
+ 'ETag' => '"' .md5_file($this->tempDir . '/test.txt') . '"',
+ ),
+ $this->response->headers
+ );
+
+ $this->assertEquals('HTTP/1.1 200 OK',$this->response->status);
+ $this->assertEquals('Test contents', stream_get_contents($this->response->body));
+
+ }
+
+ function testHEAD() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'HEAD',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/octet-stream',
+ 'Content-Length' => 13,
+ 'Last-Modified' => HTTP\Util::toHTTPDate(new \DateTime('@' . filemtime($this->tempDir . '/test.txt'))),
+ 'ETag' => '"' . md5_file($this->tempDir . '/test.txt') . '"',
+ ),
+ $this->response->headers
+ );
+
+ $this->assertEquals('HTTP/1.1 200 OK',$this->response->status);
+ $this->assertEquals('', $this->response->body);
+
+ }
+
+ function testPut() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/testput.txt',
+ 'REQUEST_METHOD' => 'PUT',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('Testing new file');
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Length' => 0,
+ 'ETag' => '"' . md5('Testing new file') . '"',
+ ), $this->response->headers);
+
+ $this->assertEquals('HTTP/1.1 201 Created',$this->response->status);
+ $this->assertEquals('', $this->response->body);
+ $this->assertEquals('Testing new file',file_get_contents($this->tempDir . '/testput.txt'));
+
+ }
+
+ function testPutAlreadyExists() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'PUT',
+ 'HTTP_IF_NONE_MATCH' => '*',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('Testing new file');
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml; charset=utf-8',
+ ),$this->response->headers);
+
+ $this->assertEquals('HTTP/1.1 412 Precondition failed',$this->response->status);
+ $this->assertNotEquals('Testing new file',file_get_contents($this->tempDir . '/test.txt'));
+
+ }
+
+ function testMkcol() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/testcol',
+ 'REQUEST_METHOD' => 'MKCOL',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody("");
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Length' => '0',
+ ),$this->response->headers);
+
+ $this->assertEquals('HTTP/1.1 201 Created',$this->response->status);
+ $this->assertEquals('', $this->response->body);
+ $this->assertTrue(is_dir($this->tempDir . '/testcol'));
+
+ }
+
+ function testPutUpdate() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'PUT',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('Testing updated file');
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals('0', $this->response->headers['Content-Length']);
+
+ $this->assertEquals('HTTP/1.1 204 No Content',$this->response->status);
+ $this->assertEquals('', $this->response->body);
+ $this->assertEquals('Testing updated file',file_get_contents($this->tempDir . '/test.txt'));
+
+ }
+
+ function testDelete() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'DELETE',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Length' => '0',
+ ),$this->response->headers);
+
+ $this->assertEquals('HTTP/1.1 204 No Content',$this->response->status);
+ $this->assertEquals('', $this->response->body);
+ $this->assertFalse(file_exists($this->tempDir . '/test.txt'));
+
+ }
+
+ function testDeleteDirectory() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/testcol',
+ 'REQUEST_METHOD' => 'DELETE',
+ );
+
+ mkdir($this->tempDir.'/testcol');
+ file_put_contents($this->tempDir.'/testcol/test.txt','Hi! I\'m a file with a short lifespan');
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Length' => '0',
+ ),$this->response->headers);
+ $this->assertEquals('HTTP/1.1 204 No Content',$this->response->status);
+ $this->assertEquals('', $this->response->body);
+ $this->assertFalse(file_exists($this->tempDir . '/col'));
+
+ }
+
+ function testOptions() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/',
+ 'REQUEST_METHOD' => 'OPTIONS',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'DAV' => '1, 3, extended-mkcol',
+ 'MS-Author-Via' => 'DAV',
+ 'Allow' => 'OPTIONS, GET, HEAD, DELETE, PROPFIND, PUT, PROPPATCH, COPY, MOVE, REPORT',
+ 'Accept-Ranges' => 'bytes',
+ 'Content-Length' => '0',
+ 'X-Sabre-Version'=> DAV\Version::VERSION,
+ ),$this->response->headers);
+
+ $this->assertEquals('HTTP/1.1 200 OK',$this->response->status);
+ $this->assertEquals('', $this->response->body);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/HTTPPreferParsingTest.php b/vendor/sabre/dav/tests/Sabre/DAV/HTTPPreferParsingTest.php
new file mode 100644
index 000000000..45865b2a1
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/HTTPPreferParsingTest.php
@@ -0,0 +1,200 @@
+<?php
+
+namespace Sabre\DAV;
+
+use Sabre\HTTP;
+
+class HTTPPReferParsingTest extends \Sabre\DAVServerTest {
+
+ function testParseSimple() {
+
+ $httpRequest = new HTTP\Request(array(
+ 'HTTP_PREFER' => 'return-asynch',
+ ));
+
+ $server = new Server();
+ $server->httpRequest = $httpRequest;
+
+ $this->assertEquals(array(
+ 'return-asynch' => true,
+ 'return-minimal' => false,
+ 'return-representation' => false,
+ 'strict' => false,
+ 'lenient' => false,
+ 'wait' => null,
+ ), $server->getHTTPPrefer());
+
+ }
+
+ function testParseValue() {
+
+ $httpRequest = new HTTP\Request(array(
+ 'HTTP_PREFER' => 'wait=10',
+ ));
+
+ $server = new Server();
+ $server->httpRequest = $httpRequest;
+
+ $this->assertEquals(array(
+ 'return-asynch' => false,
+ 'return-minimal' => false,
+ 'return-representation' => false,
+ 'strict' => false,
+ 'lenient' => false,
+ 'wait' => 10,
+ ), $server->getHTTPPrefer());
+
+ }
+
+ function testParseMultiple() {
+
+ $httpRequest = new HTTP\Request(array(
+ 'HTTP_PREFER' => 'return-minimal, strict,lenient',
+ ));
+
+ $server = new Server();
+ $server->httpRequest = $httpRequest;
+
+ $this->assertEquals(array(
+ 'return-asynch' => false,
+ 'return-minimal' => true,
+ 'return-representation' => false,
+ 'strict' => true,
+ 'lenient' => true,
+ 'wait' => null,
+ ), $server->getHTTPPrefer());
+
+ }
+
+ function testParseWeirdValue() {
+
+ $httpRequest = new HTTP\Request(array(
+ 'HTTP_PREFER' => 'BOOOH',
+ ));
+
+ $server = new Server();
+ $server->httpRequest = $httpRequest;
+
+ $this->assertEquals(array(
+ 'strict' => false,
+ 'lenient' => false,
+ 'wait' => null,
+ 'return-asynch' => false,
+ 'return-minimal' => false,
+ 'return-representation' => false,
+ ), $server->getHTTPPrefer());
+
+ }
+
+ function testBrief() {
+
+ $httpRequest = new HTTP\Request(array(
+ 'HTTP_BRIEF' => 't',
+ ));
+
+ $server = new Server();
+ $server->httpRequest = $httpRequest;
+
+ $this->assertEquals(array(
+ 'strict' => false,
+ 'lenient' => false,
+ 'wait' => null,
+ 'return-asynch' => false,
+ 'return-minimal' => true,
+ 'return-representation' => false,
+ ), $server->getHTTPPrefer());
+
+ }
+
+ /**
+ * propfindMinimal
+ *
+ * @return void
+ */
+ function testpropfindMinimal() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'PROPFIND',
+ 'REQUEST_URI' => '/',
+ 'HTTP_PREFER' => 'return-minimal',
+ ));
+ $request->setBody(<<<BLA
+<?xml version="1.0"?>
+<d:propfind xmlns:d="DAV:">
+ <d:prop>
+ <d:something />
+ <d:resourcetype />
+ </d:prop>
+</d:propfind>
+BLA
+ );
+
+ $response = $this->request($request);
+
+ $this->assertTrue(strpos($response->body, 'resourcetype')!==false);
+ $this->assertTrue(strpos($response->body, 'something')===false);
+
+ }
+
+ function testproppatchMinimal() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'PROPPATCH',
+ 'REQUEST_URI' => '/',
+ 'HTTP_PREFER' => 'return-minimal',
+ ));
+ $request->setBody(<<<BLA
+<?xml version="1.0"?>
+<d:proppatch xmlns:d="DAV:">
+ <d:set>
+ <d:prop>
+ <d:something>nope!</d:something>
+ </d:prop>
+ </d:set>
+</d:proppatch>
+BLA
+ );
+
+ $this->server->subscribeEvent('updateProperties', function(&$props, &$result) {
+
+ if (isset($props['{DAV:}something'])) {
+ unset($props['{DAV:}something']);
+ $result[200]['{DAV:}something'] = null;
+ }
+
+ });
+
+ $response = $this->request($request);
+
+ $this->assertEquals(0, strlen($response->body), 'Expected empty body: ' . $response->body);
+ $this->assertEquals('HTTP/1.1 204 No Content', $response->status);
+
+ }
+
+ function testproppatchMinimalError() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'PROPPATCH',
+ 'REQUEST_URI' => '/',
+ 'HTTP_PREFER' => 'return-minimal',
+ ));
+ $request->setBody(<<<BLA
+<?xml version="1.0"?>
+<d:proppatch xmlns:d="DAV:">
+ <d:set>
+ <d:prop>
+ <d:something>nope!</d:something>
+ </d:prop>
+ </d:set>
+</d:proppatch>
+BLA
+ );
+
+ $response = $this->request($request);
+
+ $this->assertEquals('HTTP/1.1 207 Multi-Status', $response->status);
+ $this->assertTrue(strpos($response->body, 'something')!==false);
+ $this->assertTrue(strpos($response->body, 'HTTP/1.1 403 Forbidden')!==false);
+
+ }
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/Issue33Test.php b/vendor/sabre/dav/tests/Sabre/DAV/Issue33Test.php
new file mode 100644
index 000000000..c3fba4aae
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/Issue33Test.php
@@ -0,0 +1,105 @@
+<?php
+
+namespace Sabre\DAV;
+
+use Sabre\HTTP;
+
+require_once 'Sabre/TestUtil.php';
+
+class Issue33Test extends \PHPUnit_Framework_TestCase {
+
+ function setUp() {
+
+ \Sabre\TestUtil::clearTempDir();
+
+ }
+
+ function testCopyMoveInfo() {
+
+ $bar = new SimpleCollection('bar');
+ $root = new SimpleCollection('webdav',array($bar));
+
+ $server = new Server($root);
+ $server->setBaseUri('/webdav/');
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/webdav/bar',
+ 'HTTP_DESTINATION' => 'http://dev2.tribalos.com/webdav/%C3%A0fo%C3%B3',
+ 'HTTP_OVERWRITE' => 'F',
+ );
+
+ $request = new HTTP\Request($serverVars);
+
+ $server->httpRequest = $request;
+
+ $info = $server->getCopyAndMoveInfo();
+
+ $this->assertEquals('%C3%A0fo%C3%B3', urlencode($info['destination']));
+ $this->assertFalse($info['destinationExists']);
+ $this->assertFalse($info['destinationNode']);
+
+ }
+
+ function testTreeMove() {
+
+ mkdir(SABRE_TEMPDIR . '/issue33');
+ $dir = new FS\Directory(SABRE_TEMPDIR . '/issue33');
+
+ $dir->createDirectory('bar');
+
+ $tree = new ObjectTree($dir);
+ $tree->move('bar',urldecode('%C3%A0fo%C3%B3'));
+
+ $node = $tree->getNodeForPath(urldecode('%C3%A0fo%C3%B3'));
+ $this->assertEquals(urldecode('%C3%A0fo%C3%B3'),$node->getName());
+
+ }
+
+ function testDirName() {
+
+ $dirname1 = 'bar';
+ $dirname2 = urlencode('%C3%A0fo%C3%B3');;
+
+ $this->assertTrue(dirname($dirname1)==dirname($dirname2));
+
+ }
+
+ /**
+ * @depends testTreeMove
+ * @depends testCopyMoveInfo
+ */
+ function testEverything() {
+
+ // Request object
+ $serverVars = array(
+ 'REQUEST_METHOD' => 'MOVE',
+ 'REQUEST_URI' => '/webdav/bar',
+ 'HTTP_DESTINATION' => 'http://dev2.tribalos.com/webdav/%C3%A0fo%C3%B3',
+ 'HTTP_OVERWRITE' => 'F',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('');
+
+ $response = new HTTP\ResponseMock();
+
+ // Server setup
+ mkdir(SABRE_TEMPDIR . '/issue33');
+ $dir = new FS\Directory(SABRE_TEMPDIR . '/issue33');
+
+ $dir->createDirectory('bar');
+
+ $tree = new ObjectTree($dir);
+
+ $server = new Server($tree);
+ $server->setBaseUri('/webdav/');
+
+ $server->httpRequest = $request;
+ $server->httpResponse = $response;
+ $server->exec();
+
+ $this->assertTrue(file_exists(SABRE_TEMPDIR . '/issue33/' . urldecode('%C3%A0fo%C3%B3')));
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/Locks/Backend/AbstractTest.php b/vendor/sabre/dav/tests/Sabre/DAV/Locks/Backend/AbstractTest.php
new file mode 100644
index 000000000..f39e9a036
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/Locks/Backend/AbstractTest.php
@@ -0,0 +1,196 @@
+<?php
+
+namespace Sabre\DAV\Locks\Backend;
+
+use Sabre\DAV;
+
+abstract class AbstractTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * @abstract
+ * @return AbstractBackend
+ */
+ abstract function getBackend();
+
+ function testSetup() {
+
+ $backend = $this->getBackend();
+ $this->assertInstanceOf('Sabre\\DAV\\Locks\\Backend\\AbstractBackend', $backend);
+
+ }
+
+ /**
+ * @depends testSetup
+ */
+ function testGetLocks() {
+
+ $backend = $this->getBackend();
+
+ $lock = new DAV\Locks\LockInfo();
+ $lock->owner = 'Sinterklaas';
+ $lock->timeout = 60;
+ $lock->created = time();
+ $lock->token = 'MY-UNIQUE-TOKEN';
+ $lock->uri ='someuri';
+
+ $this->assertTrue($backend->lock('someuri', $lock));
+
+ $locks = $backend->getLocks('someuri', false);
+
+ $this->assertEquals(1,count($locks));
+ $this->assertEquals('Sinterklaas',$locks[0]->owner);
+ $this->assertEquals('someuri',$locks[0]->uri);
+
+ }
+
+ /**
+ * @depends testGetLocks
+ */
+ function testGetLocksParent() {
+
+ $backend = $this->getBackend();
+
+ $lock = new DAV\Locks\LockInfo();
+ $lock->owner = 'Sinterklaas';
+ $lock->timeout = 60;
+ $lock->created = time();
+ $lock->depth = DAV\Server::DEPTH_INFINITY;
+ $lock->token = 'MY-UNIQUE-TOKEN';
+
+ $this->assertTrue($backend->lock('someuri', $lock));
+
+ $locks = $backend->getLocks('someuri/child', false);
+
+ $this->assertEquals(1,count($locks));
+ $this->assertEquals('Sinterklaas',$locks[0]->owner);
+ $this->assertEquals('someuri',$locks[0]->uri);
+
+ }
+
+
+ /**
+ * @depends testGetLocks
+ */
+ function testGetLocksParentDepth0() {
+
+ $backend = $this->getBackend();
+
+ $lock = new DAV\Locks\LockInfo();
+ $lock->owner = 'Sinterklaas';
+ $lock->timeout = 60;
+ $lock->created = time();
+ $lock->depth = 0;
+ $lock->token = 'MY-UNIQUE-TOKEN';
+
+ $this->assertTrue($backend->lock('someuri', $lock));
+
+ $locks = $backend->getLocks('someuri/child', false);
+
+ $this->assertEquals(0,count($locks));
+
+ }
+
+ function testGetLocksChildren() {
+
+ $backend = $this->getBackend();
+
+ $lock = new DAV\Locks\LockInfo();
+ $lock->owner = 'Sinterklaas';
+ $lock->timeout = 60;
+ $lock->created = time();
+ $lock->depth = 0;
+ $lock->token = 'MY-UNIQUE-TOKEN';
+
+ $this->assertTrue($backend->lock('someuri/child', $lock));
+
+ $locks = $backend->getLocks('someuri/child', false);
+ $this->assertEquals(1,count($locks));
+
+ $locks = $backend->getLocks('someuri', false);
+ $this->assertEquals(0,count($locks));
+
+ $locks = $backend->getLocks('someuri', true);
+ $this->assertEquals(1,count($locks));
+
+ }
+
+ /**
+ * @depends testGetLocks
+ */
+ function testLockRefresh() {
+
+ $backend = $this->getBackend();
+
+ $lock = new DAV\Locks\LockInfo();
+ $lock->owner = 'Sinterklaas';
+ $lock->timeout = 60;
+ $lock->created = time();
+ $lock->token = 'MY-UNIQUE-TOKEN';
+
+ $this->assertTrue($backend->lock('someuri', $lock));
+ /* Second time */
+
+ $lock->owner = 'Santa Clause';
+ $this->assertTrue($backend->lock('someuri', $lock));
+
+ $locks = $backend->getLocks('someuri', false);
+
+ $this->assertEquals(1,count($locks));
+
+ $this->assertEquals('Santa Clause',$locks[0]->owner);
+ $this->assertEquals('someuri',$locks[0]->uri);
+
+ }
+
+ /**
+ * @depends testGetLocks
+ */
+ function testUnlock() {
+
+ $backend = $this->getBackend();
+
+ $lock = new DAV\Locks\LockInfo();
+ $lock->owner = 'Sinterklaas';
+ $lock->timeout = 60;
+ $lock->created = time();
+ $lock->token = 'MY-UNIQUE-TOKEN';
+
+ $this->assertTrue($backend->lock('someuri', $lock));
+
+ $locks = $backend->getLocks('someuri', false);
+ $this->assertEquals(1,count($locks));
+
+ $this->assertTrue($backend->unlock('someuri',$lock));
+
+ $locks = $backend->getLocks('someuri', false);
+ $this->assertEquals(0,count($locks));
+
+ }
+
+ /**
+ * @depends testUnlock
+ */
+ function testUnlockUnknownToken() {
+
+ $backend = $this->getBackend();
+
+ $lock = new DAV\Locks\LockInfo();
+ $lock->owner = 'Sinterklaas';
+ $lock->timeout = 60;
+ $lock->created = time();
+ $lock->token = 'MY-UNIQUE-TOKEN';
+
+ $this->assertTrue($backend->lock('someuri', $lock));
+
+ $locks = $backend->getLocks('someuri', false);
+ $this->assertEquals(1,count($locks));
+
+ $lock->token = 'SOME-OTHER-TOKEN';
+ $this->assertFalse($backend->unlock('someuri',$lock));
+
+ $locks = $backend->getLocks('someuri', false);
+ $this->assertEquals(1,count($locks));
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/Locks/Backend/FSTest.php b/vendor/sabre/dav/tests/Sabre/DAV/Locks/Backend/FSTest.php
new file mode 100644
index 000000000..651abf786
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/Locks/Backend/FSTest.php
@@ -0,0 +1,31 @@
+<?php
+
+namespace Sabre\DAV\Locks\Backend;
+
+require_once 'Sabre/TestUtil.php';
+
+class FSTest extends AbstractTest {
+
+ function getBackend() {
+
+ \Sabre\TestUtil::clearTempDir();
+ mkdir(SABRE_TEMPDIR . '/locks');
+ $backend = new FS(SABRE_TEMPDIR . '/locks/');
+ return $backend;
+
+ }
+
+ function tearDown() {
+
+ \Sabre\TestUtil::clearTempDir();
+
+ }
+
+ function testGetLocksChildren() {
+
+ // We're skipping this test. This doesn't work, and it will
+ // never. The class is deprecated anyway.
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/Locks/Backend/FileTest.php b/vendor/sabre/dav/tests/Sabre/DAV/Locks/Backend/FileTest.php
new file mode 100644
index 000000000..537996f3b
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/Locks/Backend/FileTest.php
@@ -0,0 +1,24 @@
+<?php
+
+namespace Sabre\DAV\Locks\Backend;
+
+require_once 'Sabre/TestUtil.php';
+
+class FileTest extends AbstractTest {
+
+ function getBackend() {
+
+ \Sabre\TestUtil::clearTempDir();
+ $backend = new File(SABRE_TEMPDIR . '/lockdb');
+ return $backend;
+
+ }
+
+
+ function tearDown() {
+
+ \Sabre\TestUtil::clearTempDir();
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/Locks/Backend/PDOMySQLTest.php b/vendor/sabre/dav/tests/Sabre/DAV/Locks/Backend/PDOMySQLTest.php
new file mode 100644
index 000000000..b6f06224c
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/Locks/Backend/PDOMySQLTest.php
@@ -0,0 +1,32 @@
+<?php
+
+namespace Sabre\DAV\Locks\Backend;
+
+require_once 'Sabre/TestUtil.php';
+
+class PDOMySQLTest extends AbstractTest {
+
+ function getBackend() {
+
+ if (!SABRE_HASMYSQL) $this->markTestSkipped('MySQL driver is not available, or it was not properly configured');
+ $pdo = \Sabre\TestUtil::getMySQLDB();
+ if (!$pdo) $this->markTestSkipped('Could not connect to MySQL database');
+ $pdo->query('DROP TABLE IF EXISTS locks;');
+ $pdo->query("
+CREATE TABLE locks (
+ id INTEGER UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ owner VARCHAR(100),
+ timeout INTEGER UNSIGNED,
+ created INTEGER,
+ token VARCHAR(100),
+ scope TINYINT,
+ depth TINYINT,
+ uri text
+);");
+
+ $backend = new PDO($pdo);
+ return $backend;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/Locks/Backend/PDOTest.php b/vendor/sabre/dav/tests/Sabre/DAV/Locks/Backend/PDOTest.php
new file mode 100644
index 000000000..d6336c7b2
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/Locks/Backend/PDOTest.php
@@ -0,0 +1,29 @@
+<?php
+
+namespace Sabre\DAV\Locks\Backend;
+
+require_once 'Sabre/TestUtil.php';
+require_once 'Sabre/DAV/Locks/Backend/AbstractTest.php';
+
+class PDOTest extends AbstractTest {
+
+ function getBackend() {
+
+ if (!SABRE_HASSQLITE) $this->markTestSkipped('SQLite driver is not available');
+ \Sabre\TestUtil::clearTempDir();
+ mkdir(SABRE_TEMPDIR . '/pdolocks');
+ $pdo = new \PDO('sqlite:' . SABRE_TEMPDIR . '/pdolocks/db.sqlite');
+ $pdo->setAttribute(\PDO::ATTR_ERRMODE,\PDO::ERRMODE_EXCEPTION);
+ $pdo->query('CREATE TABLE locks ( id integer primary key asc, owner text, timeout text, created integer, token text, scope integer, depth integer, uri text)');
+ $backend = new PDO($pdo);
+ return $backend;
+
+ }
+
+ function tearDown() {
+
+ \Sabre\TestUtil::clearTempDir();
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/Locks/GetIfConditionsTest.php b/vendor/sabre/dav/tests/Sabre/DAV/Locks/GetIfConditionsTest.php
new file mode 100644
index 000000000..7b2cd0db0
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/Locks/GetIfConditionsTest.php
@@ -0,0 +1,375 @@
+<?php
+
+namespace Sabre\DAV\Locks;
+
+use Sabre\DAV;
+use Sabre\HTTP;
+
+require_once 'Sabre/HTTP/ResponseMock.php';
+require_once 'Sabre/DAV/AbstractServer.php';
+
+class GetIfConditionsTest extends DAV\AbstractServer {
+
+ /**
+ * @var Sabre\DAV\Locks\Plugin
+ */
+ protected $locksPlugin;
+
+ function setUp() {
+
+ parent::setUp();
+ $locksPlugin = new Plugin();
+ $this->server->addPlugin($locksPlugin);
+ $this->locksPlugin = $locksPlugin;
+
+ }
+
+ function testNoConditions() {
+
+ $serverVars = array(
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+
+ $conditions = $this->locksPlugin->getIfConditions();
+ $this->assertEquals(array(),$conditions);
+
+ }
+
+ function testLockToken() {
+
+ $serverVars = array(
+ 'HTTP_IF' => '(<opaquelocktoken:token1>)',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+
+ $conditions = $this->locksPlugin->getIfConditions();
+
+ $compare = array(
+
+ array(
+ 'uri' => '',
+ 'tokens' => array(
+ array(
+ 1,
+ 'opaquelocktoken:token1',
+ '',
+ ),
+ ),
+
+ ),
+
+ );
+
+ $this->assertEquals($compare,$conditions);
+
+ }
+
+ function testNotLockToken() {
+
+ $serverVars = array(
+ 'HTTP_IF' => '(Not <opaquelocktoken:token1>)',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+
+ $conditions = $this->locksPlugin->getIfConditions();
+
+ $compare = array(
+
+ array(
+ 'uri' => '',
+ 'tokens' => array(
+ array(
+ 0,
+ 'opaquelocktoken:token1',
+ '',
+ ),
+ ),
+
+ ),
+
+ );
+ $this->assertEquals($compare,$conditions);
+
+ }
+
+ function testLockTokenUrl() {
+
+ $serverVars = array(
+ 'HTTP_IF' => '<http://www.example.com/> (<opaquelocktoken:token1>)',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+
+ $conditions = $this->locksPlugin->getIfConditions();
+
+ $compare = array(
+
+ array(
+ 'uri' => 'http://www.example.com/',
+ 'tokens' => array(
+ array(
+ 1,
+ 'opaquelocktoken:token1',
+ '',
+ ),
+ ),
+
+ ),
+
+ );
+ $this->assertEquals($compare,$conditions);
+
+ }
+
+ function test2LockTokens() {
+
+ $serverVars = array(
+ 'HTTP_IF' => '(<opaquelocktoken:token1>) (Not <opaquelocktoken:token2>)',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+
+ $conditions = $this->locksPlugin->getIfConditions();
+
+ $compare = array(
+
+ array(
+ 'uri' => '',
+ 'tokens' => array(
+ array(
+ 1,
+ 'opaquelocktoken:token1',
+ '',
+ ),
+ array(
+ 0,
+ 'opaquelocktoken:token2',
+ '',
+ ),
+ ),
+
+ ),
+
+ );
+ $this->assertEquals($compare,$conditions);
+
+ }
+
+ function test2UriLockTokens() {
+
+ $serverVars = array(
+ 'HTTP_IF' => '<http://www.example.org/node1> (<opaquelocktoken:token1>) <http://www.example.org/node2> (Not <opaquelocktoken:token2>)',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+
+ $conditions = $this->locksPlugin->getIfConditions();
+
+ $compare = array(
+
+ array(
+ 'uri' => 'http://www.example.org/node1',
+ 'tokens' => array(
+ array(
+ 1,
+ 'opaquelocktoken:token1',
+ '',
+ ),
+ ),
+ ),
+ array(
+ 'uri' => 'http://www.example.org/node2',
+ 'tokens' => array(
+ array(
+ 0,
+ 'opaquelocktoken:token2',
+ '',
+ ),
+ ),
+
+ ),
+
+ );
+ $this->assertEquals($compare,$conditions);
+
+ }
+
+ function test2UriMultiLockTokens() {
+
+ $serverVars = array(
+ 'HTTP_IF' => '<http://www.example.org/node1> (<opaquelocktoken:token1>) (<opaquelocktoken:token2>) <http://www.example.org/node2> (Not <opaquelocktoken:token3>)',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+
+ $conditions = $this->locksPlugin->getIfConditions();
+
+ $compare = array(
+
+ array(
+ 'uri' => 'http://www.example.org/node1',
+ 'tokens' => array(
+ array(
+ 1,
+ 'opaquelocktoken:token1',
+ '',
+ ),
+ array(
+ 1,
+ 'opaquelocktoken:token2',
+ '',
+ ),
+ ),
+ ),
+ array(
+ 'uri' => 'http://www.example.org/node2',
+ 'tokens' => array(
+ array(
+ 0,
+ 'opaquelocktoken:token3',
+ '',
+ ),
+ ),
+
+ ),
+
+ );
+ $this->assertEquals($compare,$conditions);
+
+ }
+
+ function testEtag() {
+
+ $serverVars = array(
+ 'HTTP_IF' => '([etag1])',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+
+ $conditions = $this->locksPlugin->getIfConditions();
+
+ $compare = array(
+
+ array(
+ 'uri' => '',
+ 'tokens' => array(
+ array(
+ 1,
+ '',
+ 'etag1',
+ ),
+ ),
+ ),
+
+ );
+ $this->assertEquals($compare,$conditions);
+
+ }
+
+ function test2Etags() {
+
+ $serverVars = array(
+ 'HTTP_IF' => '<http://www.example.org/> ([etag1]) ([etag2])',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+
+ $conditions = $this->locksPlugin->getIfConditions();
+
+ $compare = array(
+
+ array(
+ 'uri' => 'http://www.example.org/',
+ 'tokens' => array(
+ array(
+ 1,
+ '',
+ 'etag1',
+ ),
+ array(
+ 1,
+ '',
+ 'etag2',
+ ),
+ ),
+ ),
+
+ );
+ $this->assertEquals($compare,$conditions);
+
+ }
+
+ function testComplexIf() {
+
+ $serverVars = array(
+ 'HTTP_IF' => '<http://www.example.org/node1> (<opaquelocktoken:token1> [etag1]) ' .
+ '(Not <opaquelocktoken:token2>) ([etag2]) <http://www.example.org/node2> ' .
+ '(<opaquelocktoken:token3>) (Not <opaquelocktoken:token4>) ([etag3])',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+
+ $conditions = $this->locksPlugin->getIfConditions();
+
+ $compare = array(
+
+ array(
+ 'uri' => 'http://www.example.org/node1',
+ 'tokens' => array(
+ array(
+ 1,
+ 'opaquelocktoken:token1',
+ 'etag1',
+ ),
+ array(
+ 0,
+ 'opaquelocktoken:token2',
+ '',
+ ),
+ array(
+ 1,
+ '',
+ 'etag2',
+ ),
+ ),
+ ),
+ array(
+ 'uri' => 'http://www.example.org/node2',
+ 'tokens' => array(
+ array(
+ 1,
+ 'opaquelocktoken:token3',
+ '',
+ ),
+ array(
+ 0,
+ 'opaquelocktoken:token4',
+ '',
+ ),
+ array(
+ 1,
+ '',
+ 'etag3',
+ ),
+ ),
+ ),
+
+ );
+ $this->assertEquals($compare,$conditions);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/Locks/MSWordTest.php b/vendor/sabre/dav/tests/Sabre/DAV/Locks/MSWordTest.php
new file mode 100644
index 000000000..b3d7d447b
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/Locks/MSWordTest.php
@@ -0,0 +1,123 @@
+<?php
+
+namespace Sabre\DAV\Locks;
+
+use Sabre\HTTP;
+use Sabre\DAV;
+
+require_once 'Sabre/HTTP/ResponseMock.php';
+require_once 'Sabre/TestUtil.php';
+
+class MSWordTest extends \PHPUnit_Framework_TestCase {
+
+ function testLockEtc() {
+
+ mkdir(SABRE_TEMPDIR . '/mstest');
+ $tree = new DAV\FS\Directory(SABRE_TEMPDIR . '/mstest');
+
+ $server = new DAV\Server($tree);
+ $server->debugExceptions = true;
+ $locksBackend = new Backend\File(SABRE_TEMPDIR . '/locksdb');
+ $locksPlugin = new Plugin($locksBackend);
+ $server->addPlugin($locksPlugin);
+
+ $response1 = new HTTP\ResponseMock();
+
+ $server->httpRequest = $this->getLockRequest();
+ $server->httpResponse = $response1;
+ $server->exec();
+
+ $this->assertEquals('HTTP/1.1 201 Created', $server->httpResponse->status);
+ $this->assertTrue(isset($server->httpResponse->headers['Lock-Token']));
+ $lockToken = $server->httpResponse->headers['Lock-Token'];
+
+ //sleep(10);
+
+ $response2 = new HTTP\ResponseMock();
+
+ $server->httpRequest = $this->getLockRequest2();
+ $server->httpResponse = $response2;
+ $server->exec();
+
+ $this->assertEquals('HTTP/1.1 201 Created', $server->httpResponse->status);
+ $this->assertTrue(isset($server->httpResponse->headers['Lock-Token']));
+
+ //sleep(10);
+
+ $response3 = new HTTP\ResponseMock();
+ $server->httpRequest = $this->getPutRequest($lockToken);
+ $server->httpResponse = $response3;
+ $server->exec();
+
+ $this->assertEquals('HTTP/1.1 204 No Content', $server->httpResponse->status);
+
+ }
+
+ function tearDown() {
+
+ \Sabre\TestUtil::clearTempDir();
+
+ }
+
+ function getLockRequest() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'LOCK',
+ 'HTTP_CONTENT_TYPE' => 'application/xml',
+ 'HTTP_TIMEOUT' => 'Second-3600',
+ 'REQUEST_URI' => '/Nouveau%20Microsoft%20Office%20Excel%20Worksheet.xlsx',
+ ));
+
+ $request->setBody('<D:lockinfo xmlns:D="DAV:">
+ <D:lockscope>
+ <D:exclusive />
+ </D:lockscope>
+ <D:locktype>
+ <D:write />
+ </D:locktype>
+ <D:owner>
+ <D:href>PC-Vista\User</D:href>
+ </D:owner>
+</D:lockinfo>');
+
+ return $request;
+
+ }
+ function getLockRequest2() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'LOCK',
+ 'HTTP_CONTENT_TYPE' => 'application/xml',
+ 'HTTP_TIMEOUT' => 'Second-3600',
+ 'REQUEST_URI' => '/~$Nouveau%20Microsoft%20Office%20Excel%20Worksheet.xlsx',
+ ));
+
+ $request->setBody('<D:lockinfo xmlns:D="DAV:">
+ <D:lockscope>
+ <D:exclusive />
+ </D:lockscope>
+ <D:locktype>
+ <D:write />
+ </D:locktype>
+ <D:owner>
+ <D:href>PC-Vista\User</D:href>
+ </D:owner>
+</D:lockinfo>');
+
+ return $request;
+
+ }
+
+ function getPutRequest($lockToken) {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'PUT',
+ 'REQUEST_URI' => '/Nouveau%20Microsoft%20Office%20Excel%20Worksheet.xlsx',
+ 'HTTP_IF' => 'If: ('.$lockToken.')',
+ ));
+ $request->setBody('FAKE BODY');
+ return $request;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/Locks/PluginTest.php b/vendor/sabre/dav/tests/Sabre/DAV/Locks/PluginTest.php
new file mode 100644
index 000000000..a45dafdf1
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/Locks/PluginTest.php
@@ -0,0 +1,966 @@
+<?php
+
+namespace Sabre\DAV\Locks;
+
+use Sabre\HTTP;
+use Sabre\DAV;
+
+require_once 'Sabre/DAV/AbstractServer.php';
+
+class PluginTest extends DAV\AbstractServer {
+
+ /**
+ * @var Sabre\DAV\Locks\Plugin
+ */
+ protected $locksPlugin;
+
+ function setUp() {
+
+ parent::setUp();
+ $locksBackend = new Backend\File(SABRE_TEMPDIR . '/locksdb');
+ $locksPlugin = new Plugin($locksBackend);
+ $this->server->addPlugin($locksPlugin);
+ $this->locksPlugin = $locksPlugin;
+
+ }
+
+ function testGetFeatures() {
+
+ $this->assertEquals(array(2),$this->locksPlugin->getFeatures());
+
+ }
+
+ function testGetHTTPMethods() {
+
+ $this->assertEquals(array('LOCK','UNLOCK'),$this->locksPlugin->getHTTPMethods(''));
+
+ }
+
+ function testGetHTTPMethodsNoBackend() {
+
+ $locksPlugin = new Plugin();
+ $this->server->addPlugin($locksPlugin);
+ $this->assertEquals(array(),$locksPlugin->getHTTPMethods(''));
+
+ }
+
+ function testUnknownMethodPassthough() {
+
+ $this->assertNull($this->locksPlugin->unknownMethod('BLA','/'));
+
+ }
+
+ function testLockNoBody() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'LOCK',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('');
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml; charset=utf-8',
+ ),
+ $this->response->headers
+ );
+
+ $this->assertEquals('HTTP/1.1 400 Bad request',$this->response->status);
+
+ }
+
+ function testLock() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'LOCK',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('<?xml version="1.0"?>
+<D:lockinfo xmlns:D="DAV:">
+ <D:lockscope><D:exclusive/></D:lockscope>
+ <D:locktype><D:write/></D:locktype>
+ <D:owner>
+ <D:href>http://example.org/~ejw/contact.html</D:href>
+ </D:owner>
+</D:lockinfo>');
+
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('application/xml; charset=utf-8',$this->response->headers['Content-Type']);
+ $this->assertTrue(preg_match('/^<opaquelocktoken:(.*)>$/',$this->response->headers['Lock-Token'])===1,'We did not get a valid Locktoken back (' . $this->response->headers['Lock-Token'] . ')');
+
+ $this->assertEquals('HTTP/1.1 200 OK',$this->response->status,'Got an incorrect status back. Response body: ' . $this->response->body);
+
+ $body = preg_replace("/xmlns(:[A-Za-z0-9_])?=(\"|\')DAV:(\"|\')/","xmlns\\1=\"urn:DAV\"",$this->response->body);
+ $xml = simplexml_load_string($body);
+ $xml->registerXPathNamespace('d','urn:DAV');
+
+ $elements = array(
+ '/d:prop',
+ '/d:prop/d:lockdiscovery',
+ '/d:prop/d:lockdiscovery/d:activelock',
+ '/d:prop/d:lockdiscovery/d:activelock/d:locktype',
+ '/d:prop/d:lockdiscovery/d:activelock/d:lockroot',
+ '/d:prop/d:lockdiscovery/d:activelock/d:lockroot/d:href',
+ '/d:prop/d:lockdiscovery/d:activelock/d:locktype/d:write',
+ '/d:prop/d:lockdiscovery/d:activelock/d:lockscope',
+ '/d:prop/d:lockdiscovery/d:activelock/d:lockscope/d:exclusive',
+ '/d:prop/d:lockdiscovery/d:activelock/d:depth',
+ '/d:prop/d:lockdiscovery/d:activelock/d:owner',
+ '/d:prop/d:lockdiscovery/d:activelock/d:timeout',
+ '/d:prop/d:lockdiscovery/d:activelock/d:locktoken',
+ '/d:prop/d:lockdiscovery/d:activelock/d:locktoken/d:href',
+ );
+
+ foreach($elements as $elem) {
+ $data = $xml->xpath($elem);
+ $this->assertEquals(1,count($data),'We expected 1 match for the xpath expression "' . $elem . '". ' . count($data) . ' were found. Full response body: ' . $this->response->body);
+ }
+
+ $depth = $xml->xpath('/d:prop/d:lockdiscovery/d:activelock/d:depth');
+ $this->assertEquals('infinity',(string)$depth[0]);
+
+ $token = $xml->xpath('/d:prop/d:lockdiscovery/d:activelock/d:locktoken/d:href');
+ $this->assertEquals($this->response->headers['Lock-Token'],'<' . (string)$token[0] . '>','Token in response body didn\'t match token in response header.');
+
+ }
+
+ /**
+ * @depends testLock
+ */
+ function testDoubleLock() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'LOCK',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('<?xml version="1.0"?>
+<D:lockinfo xmlns:D="DAV:">
+ <D:lockscope><D:exclusive/></D:lockscope>
+ <D:locktype><D:write/></D:locktype>
+ <D:owner>
+ <D:href>http://example.org/~ejw/contact.html</D:href>
+ </D:owner>
+</D:lockinfo>');
+
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->response = new HTTP\ResponseMock();
+ $this->server->httpResponse = $this->response;
+
+ $this->server->exec();
+
+ $this->assertEquals('application/xml; charset=utf-8',$this->response->headers['Content-Type']);
+
+ $this->assertEquals('HTTP/1.1 423 Locked',$this->response->status);
+
+ }
+
+ /**
+ * @depends testLock
+ */
+ function testLockRefresh() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'LOCK',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('<?xml version="1.0"?>
+<D:lockinfo xmlns:D="DAV:">
+ <D:lockscope><D:exclusive/></D:lockscope>
+ <D:locktype><D:write/></D:locktype>
+ <D:owner>
+ <D:href>http://example.org/~ejw/contact.html</D:href>
+ </D:owner>
+</D:lockinfo>');
+
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $lockToken = $this->response->headers['Lock-Token'];
+
+ $this->response = new HTTP\ResponseMock();
+ $this->server->httpResponse = $this->response;
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'LOCK',
+ 'HTTP_IF' => '(' . $lockToken . ')',
+ );
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('');
+ $this->server->httpRequest = $request;
+
+ $this->server->exec();
+
+ $this->assertEquals('application/xml; charset=utf-8',$this->response->headers['Content-Type']);
+
+ $this->assertEquals('HTTP/1.1 200 OK',$this->response->status,'We received an incorrect status code. Full response body: ' . $this->response->body);
+
+ }
+
+ /**
+ * @depends testLock
+ */
+ function testLockNoFile() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/notfound.txt',
+ 'REQUEST_METHOD' => 'LOCK',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('<?xml version="1.0"?>
+<D:lockinfo xmlns:D="DAV:">
+ <D:lockscope><D:exclusive/></D:lockscope>
+ <D:locktype><D:write/></D:locktype>
+ <D:owner>
+ <D:href>http://example.org/~ejw/contact.html</D:href>
+ </D:owner>
+</D:lockinfo>');
+
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('application/xml; charset=utf-8',$this->response->headers['Content-Type']);
+ $this->assertTrue(preg_match('/^<opaquelocktoken:(.*)>$/',$this->response->headers['Lock-Token'])===1,'We did not get a valid Locktoken back (' . $this->response->headers['Lock-Token'] . ')');
+
+ $this->assertEquals('HTTP/1.1 201 Created',$this->response->status);
+
+ }
+
+ /**
+ * @depends testLock
+ */
+ function testUnlockNoToken() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'UNLOCK',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml; charset=utf-8',
+ ),
+ $this->response->headers
+ );
+
+ $this->assertEquals('HTTP/1.1 400 Bad request',$this->response->status);
+
+ }
+
+ /**
+ * @depends testLock
+ */
+ function testUnlockBadToken() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'UNLOCK',
+ 'HTTP_LOCK_TOKEN' => '<opaquelocktoken:blablabla>',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml; charset=utf-8',
+ ),
+ $this->response->headers
+ );
+
+ $this->assertEquals('HTTP/1.1 409 Conflict',$this->response->status,'Got an incorrect status code. Full response body: ' . $this->response->body);
+
+ }
+
+ /**
+ * @depends testLock
+ */
+ function testLockPutNoToken() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'LOCK',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('<?xml version="1.0"?>
+<D:lockinfo xmlns:D="DAV:">
+ <D:lockscope><D:exclusive/></D:lockscope>
+ <D:locktype><D:write/></D:locktype>
+ <D:owner>
+ <D:href>http://example.org/~ejw/contact.html</D:href>
+ </D:owner>
+</D:lockinfo>');
+
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('application/xml; charset=utf-8',$this->response->headers['Content-Type']);
+ $this->assertTrue(preg_match('/^<opaquelocktoken:(.*)>$/',$this->response->headers['Lock-Token'])===1,'We did not get a valid Locktoken back (' . $this->response->headers['Lock-Token'] . ')');
+
+ $this->assertEquals('HTTP/1.1 200 OK',$this->response->status);
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'PUT',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('newbody');
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('application/xml; charset=utf-8',$this->response->headers['Content-Type']);
+ $this->assertTrue(preg_match('/^<opaquelocktoken:(.*)>$/',$this->response->headers['Lock-Token'])===1,'We did not get a valid Locktoken back (' . $this->response->headers['Lock-Token'] . ')');
+
+ $this->assertEquals('HTTP/1.1 423 Locked',$this->response->status);
+
+ }
+
+ /**
+ * @depends testLock
+ */
+ function testUnlock() {
+
+ $request = new HTTP\Request(array());
+ $this->server->httpRequest = $request;
+
+ $request->setBody('<?xml version="1.0"?>
+<D:lockinfo xmlns:D="DAV:">
+ <D:lockscope><D:exclusive/></D:lockscope>
+ <D:locktype><D:write/></D:locktype>
+ <D:owner>
+ <D:href>http://example.org/~ejw/contact.html</D:href>
+ </D:owner>
+</D:lockinfo>');
+
+ $this->server->invokeMethod('LOCK','test.txt');
+ $lockToken = $this->server->httpResponse->headers['Lock-Token'];
+
+ $serverVars = array(
+ 'HTTP_LOCK_TOKEN' => $lockToken,
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->httpResponse = new HTTP\ResponseMock();
+ $this->server->invokeMethod('UNLOCK', 'test.txt');
+
+ $this->assertEquals('HTTP/1.1 204 No Content',$this->server->httpResponse->status,'Got an incorrect status code. Full response body: ' . $this->response->body);
+ $this->assertEquals(array(
+ 'Content-Length' => '0',
+ ),
+ $this->server->httpResponse->headers
+ );
+
+
+ }
+
+ /**
+ * @depends testLock
+ */
+ function testUnlockWindowsBug() {
+
+ $request = new HTTP\Request(array());
+ $this->server->httpRequest = $request;
+
+ $request->setBody('<?xml version="1.0"?>
+<D:lockinfo xmlns:D="DAV:">
+ <D:lockscope><D:exclusive/></D:lockscope>
+ <D:locktype><D:write/></D:locktype>
+ <D:owner>
+ <D:href>http://example.org/~ejw/contact.html</D:href>
+ </D:owner>
+</D:lockinfo>');
+
+ $this->server->invokeMethod('LOCK','test.txt');
+ $lockToken = $this->server->httpResponse->headers['Lock-Token'];
+
+ // See Issue 123
+ $lockToken = trim($lockToken,'<>');
+
+ $serverVars = array(
+ 'HTTP_LOCK_TOKEN' => $lockToken,
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->httpResponse = new HTTP\ResponseMock();
+ $this->server->invokeMethod('UNLOCK', 'test.txt');
+
+ $this->assertEquals('HTTP/1.1 204 No Content',$this->server->httpResponse->status,'Got an incorrect status code. Full response body: ' . $this->response->body);
+ $this->assertEquals(array(
+ 'Content-Length' => '0',
+ ),
+ $this->server->httpResponse->headers
+ );
+
+
+ }
+
+ /**
+ * @depends testLock
+ */
+ function testLockRetainOwner() {
+
+ $request = new HTTP\Request(array());
+ $this->server->httpRequest = $request;
+
+ $request->setBody('<?xml version="1.0"?>
+<D:lockinfo xmlns:D="DAV:">
+ <D:lockscope><D:exclusive/></D:lockscope>
+ <D:locktype><D:write/></D:locktype>
+ <D:owner>Evert</D:owner>
+</D:lockinfo>');
+
+ $this->server->invokeMethod('LOCK','test.txt');
+ $lockToken = $this->server->httpResponse->headers['Lock-Token'];
+
+ $locks = $this->locksPlugin->getLocks('test.txt');
+ $this->assertEquals(1,count($locks));
+ $this->assertEquals('Evert',$locks[0]->owner);
+
+
+ }
+
+ /**
+ * @depends testLock
+ */
+ function testLockPutBadToken() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'LOCK',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('<?xml version="1.0"?>
+<D:lockinfo xmlns:D="DAV:">
+ <D:lockscope><D:exclusive/></D:lockscope>
+ <D:locktype><D:write/></D:locktype>
+ <D:owner>
+ <D:href>http://example.org/~ejw/contact.html</D:href>
+ </D:owner>
+</D:lockinfo>');
+
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('application/xml; charset=utf-8',$this->response->headers['Content-Type']);
+ $this->assertTrue(preg_match('/^<opaquelocktoken:(.*)>$/',$this->response->headers['Lock-Token'])===1,'We did not get a valid Locktoken back (' . $this->response->headers['Lock-Token'] . ')');
+
+ $this->assertEquals('HTTP/1.1 200 OK',$this->response->status);
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'PUT',
+ 'HTTP_IF' => '(<opaquelocktoken:token1>)',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('newbody');
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('application/xml; charset=utf-8',$this->response->headers['Content-Type']);
+ $this->assertTrue(preg_match('/^<opaquelocktoken:(.*)>$/',$this->response->headers['Lock-Token'])===1,'We did not get a valid Locktoken back (' . $this->response->headers['Lock-Token'] . ')');
+
+ $this->assertEquals('HTTP/1.1 412 Precondition failed',$this->response->status);
+
+ }
+
+ /**
+ * @depends testLock
+ */
+ function testLockDeleteParent() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/dir/child.txt',
+ 'REQUEST_METHOD' => 'LOCK',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('<?xml version="1.0"?>
+<D:lockinfo xmlns:D="DAV:">
+ <D:lockscope><D:exclusive/></D:lockscope>
+ <D:locktype><D:write/></D:locktype>
+ <D:owner>
+ <D:href>http://example.org/~ejw/contact.html</D:href>
+ </D:owner>
+</D:lockinfo>');
+
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('application/xml; charset=utf-8',$this->response->headers['Content-Type']);
+ $this->assertTrue(preg_match('/^<opaquelocktoken:(.*)>$/',$this->response->headers['Lock-Token'])===1,'We did not get a valid Locktoken back (' . $this->response->headers['Lock-Token'] . ')');
+
+ $this->assertEquals('HTTP/1.1 200 OK',$this->response->status);
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/dir',
+ 'REQUEST_METHOD' => 'DELETE',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 423 Locked',$this->response->status);
+ $this->assertEquals('application/xml; charset=utf-8',$this->response->headers['Content-Type']);
+
+ }
+ /**
+ * @depends testLock
+ */
+ function testLockDeleteSucceed() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/dir/child.txt',
+ 'REQUEST_METHOD' => 'LOCK',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('<?xml version="1.0"?>
+<D:lockinfo xmlns:D="DAV:">
+ <D:lockscope><D:exclusive/></D:lockscope>
+ <D:locktype><D:write/></D:locktype>
+ <D:owner>
+ <D:href>http://example.org/~ejw/contact.html</D:href>
+ </D:owner>
+</D:lockinfo>');
+
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('application/xml; charset=utf-8',$this->response->headers['Content-Type']);
+ $this->assertTrue(preg_match('/^<opaquelocktoken:(.*)>$/',$this->response->headers['Lock-Token'])===1,'We did not get a valid Locktoken back (' . $this->response->headers['Lock-Token'] . ')');
+
+ $this->assertEquals('HTTP/1.1 200 OK',$this->response->status);
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/dir/child.txt',
+ 'REQUEST_METHOD' => 'DELETE',
+ 'HTTP_IF' => '(' . $this->response->headers['Lock-Token'] . ')',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 204 No Content',$this->response->status);
+ $this->assertEquals('application/xml; charset=utf-8',$this->response->headers['Content-Type']);
+
+ }
+
+ /**
+ * @depends testLock
+ */
+ function testLockCopyLockSource() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/dir/child.txt',
+ 'REQUEST_METHOD' => 'LOCK',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('<?xml version="1.0"?>
+<D:lockinfo xmlns:D="DAV:">
+ <D:lockscope><D:exclusive/></D:lockscope>
+ <D:locktype><D:write/></D:locktype>
+ <D:owner>
+ <D:href>http://example.org/~ejw/contact.html</D:href>
+ </D:owner>
+</D:lockinfo>');
+
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('application/xml; charset=utf-8',$this->response->headers['Content-Type']);
+ $this->assertTrue(preg_match('/^<opaquelocktoken:(.*)>$/',$this->response->headers['Lock-Token'])===1,'We did not get a valid Locktoken back (' . $this->response->headers['Lock-Token'] . ')');
+
+ $this->assertEquals('HTTP/1.1 200 OK',$this->response->status);
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/dir/child.txt',
+ 'REQUEST_METHOD' => 'COPY',
+ 'HTTP_DESTINATION' => '/dir/child2.txt',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 201 Created',$this->response->status,'Copy must succeed if only the source is locked, but not the destination');
+ $this->assertEquals('application/xml; charset=utf-8',$this->response->headers['Content-Type']);
+
+ }
+ /**
+ * @depends testLock
+ */
+ function testLockCopyLockDestination() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/dir/child2.txt',
+ 'REQUEST_METHOD' => 'LOCK',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('<?xml version="1.0"?>
+<D:lockinfo xmlns:D="DAV:">
+ <D:lockscope><D:exclusive/></D:lockscope>
+ <D:locktype><D:write/></D:locktype>
+ <D:owner>
+ <D:href>http://example.org/~ejw/contact.html</D:href>
+ </D:owner>
+</D:lockinfo>');
+
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('application/xml; charset=utf-8',$this->response->headers['Content-Type']);
+ $this->assertTrue(preg_match('/^<opaquelocktoken:(.*)>$/',$this->response->headers['Lock-Token'])===1,'We did not get a valid Locktoken back (' . $this->response->headers['Lock-Token'] . ')');
+
+ $this->assertEquals('HTTP/1.1 201 Created',$this->response->status);
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/dir/child.txt',
+ 'REQUEST_METHOD' => 'COPY',
+ 'HTTP_DESTINATION' => '/dir/child2.txt',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 423 Locked',$this->response->status,'Copy must succeed if only the source is locked, but not the destination');
+ $this->assertEquals('application/xml; charset=utf-8',$this->response->headers['Content-Type']);
+
+ }
+
+ /**
+ * @depends testLock
+ */
+ function testLockMoveLockSourceLocked() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/dir/child.txt',
+ 'REQUEST_METHOD' => 'LOCK',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('<?xml version="1.0"?>
+<D:lockinfo xmlns:D="DAV:">
+ <D:lockscope><D:exclusive/></D:lockscope>
+ <D:locktype><D:write/></D:locktype>
+ <D:owner>
+ <D:href>http://example.org/~ejw/contact.html</D:href>
+ </D:owner>
+</D:lockinfo>');
+
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('application/xml; charset=utf-8',$this->response->headers['Content-Type']);
+ $this->assertTrue(preg_match('/^<opaquelocktoken:(.*)>$/',$this->response->headers['Lock-Token'])===1,'We did not get a valid Locktoken back (' . $this->response->headers['Lock-Token'] . ')');
+
+ $this->assertEquals('HTTP/1.1 200 OK',$this->response->status);
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/dir/child.txt',
+ 'REQUEST_METHOD' => 'MOVE',
+ 'HTTP_DESTINATION' => '/dir/child2.txt',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 423 Locked',$this->response->status,'Copy must succeed if only the source is locked, but not the destination');
+ $this->assertEquals('application/xml; charset=utf-8',$this->response->headers['Content-Type']);
+
+ }
+
+ /**
+ * @depends testLock
+ */
+ function testLockMoveLockSourceSucceed() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/dir/child.txt',
+ 'REQUEST_METHOD' => 'LOCK',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('<?xml version="1.0"?>
+<D:lockinfo xmlns:D="DAV:">
+ <D:lockscope><D:exclusive/></D:lockscope>
+ <D:locktype><D:write/></D:locktype>
+ <D:owner>
+ <D:href>http://example.org/~ejw/contact.html</D:href>
+ </D:owner>
+</D:lockinfo>');
+
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('application/xml; charset=utf-8',$this->response->headers['Content-Type']);
+ $this->assertTrue(preg_match('/^<opaquelocktoken:(.*)>$/',$this->response->headers['Lock-Token'])===1,'We did not get a valid Locktoken back (' . $this->response->headers['Lock-Token'] . ')');
+
+ $this->assertEquals('HTTP/1.1 200 OK',$this->response->status);
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/dir/child.txt',
+ 'REQUEST_METHOD' => 'MOVE',
+ 'HTTP_DESTINATION' => '/dir/child2.txt',
+ 'HTTP_IF' => '(' . $this->response->headers['Lock-Token'] . ')',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 201 Created',$this->response->status,'A valid lock-token was provided for the source, so this MOVE operation must succeed. Full response body: ' . $this->response->body);
+
+ }
+
+ /**
+ * @depends testLock
+ */
+ function testLockMoveLockDestination() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/dir/child2.txt',
+ 'REQUEST_METHOD' => 'LOCK',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('<?xml version="1.0"?>
+<D:lockinfo xmlns:D="DAV:">
+ <D:lockscope><D:exclusive/></D:lockscope>
+ <D:locktype><D:write/></D:locktype>
+ <D:owner>
+ <D:href>http://example.org/~ejw/contact.html</D:href>
+ </D:owner>
+</D:lockinfo>');
+
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('application/xml; charset=utf-8',$this->response->headers['Content-Type']);
+ $this->assertTrue(preg_match('/^<opaquelocktoken:(.*)>$/',$this->response->headers['Lock-Token'])===1,'We did not get a valid Locktoken back (' . $this->response->headers['Lock-Token'] . ')');
+
+ $this->assertEquals('HTTP/1.1 201 Created',$this->response->status);
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/dir/child.txt',
+ 'REQUEST_METHOD' => 'MOVE',
+ 'HTTP_DESTINATION' => '/dir/child2.txt',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 423 Locked',$this->response->status,'Copy must succeed if only the source is locked, but not the destination');
+ $this->assertEquals('application/xml; charset=utf-8',$this->response->headers['Content-Type']);
+
+ }
+ /**
+ * @depends testLock
+ */
+ function testLockMoveLockParent() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/dir',
+ 'REQUEST_METHOD' => 'LOCK',
+ 'HTTP_DEPTH' => 'infinite',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('<?xml version="1.0"?>
+<D:lockinfo xmlns:D="DAV:">
+ <D:lockscope><D:exclusive/></D:lockscope>
+ <D:locktype><D:write/></D:locktype>
+ <D:owner>
+ <D:href>http://example.org/~ejw/contact.html</D:href>
+ </D:owner>
+</D:lockinfo>');
+
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('application/xml; charset=utf-8',$this->response->headers['Content-Type']);
+ $this->assertTrue(preg_match('/^<opaquelocktoken:(.*)>$/',$this->response->headers['Lock-Token'])===1,'We did not get a valid Locktoken back (' . $this->response->headers['Lock-Token'] . ')');
+
+ $this->assertEquals('HTTP/1.1 200 OK',$this->response->status);
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/dir/child.txt',
+ 'REQUEST_METHOD' => 'MOVE',
+ 'HTTP_DESTINATION' => '/dir/child2.txt',
+ 'HTTP_IF' => '</dir> (' . $this->response->headers['Lock-Token'] . ')',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 201 Created',$this->response->status,'We locked the parent of both the source and destination, but the move didn\'t succeed.');
+ $this->assertEquals('application/xml; charset=utf-8',$this->response->headers['Content-Type']);
+
+ }
+
+ /**
+ * @depends testLock
+ */
+ function testLockPutGoodToken() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'LOCK',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('<?xml version="1.0"?>
+<D:lockinfo xmlns:D="DAV:">
+ <D:lockscope><D:exclusive/></D:lockscope>
+ <D:locktype><D:write/></D:locktype>
+ <D:owner>
+ <D:href>http://example.org/~ejw/contact.html</D:href>
+ </D:owner>
+</D:lockinfo>');
+
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('application/xml; charset=utf-8',$this->response->headers['Content-Type']);
+ $this->assertTrue(preg_match('/^<opaquelocktoken:(.*)>$/',$this->response->headers['Lock-Token'])===1,'We did not get a valid Locktoken back (' . $this->response->headers['Lock-Token'] . ')');
+
+ $this->assertEquals('HTTP/1.1 200 OK',$this->response->status);
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'PUT',
+ 'HTTP_IF' => '('.$this->response->headers['Lock-Token'].')',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('newbody');
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('application/xml; charset=utf-8',$this->response->headers['Content-Type']);
+ $this->assertTrue(preg_match('/^<opaquelocktoken:(.*)>$/',$this->response->headers['Lock-Token'])===1,'We did not get a valid Locktoken back (' . $this->response->headers['Lock-Token'] . ')');
+
+ $this->assertEquals('HTTP/1.1 204 No Content',$this->response->status);
+
+ }
+
+ function testPutWithIncorrectETag() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'PUT',
+ 'HTTP_IF' => '(["etag1"])',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('newbody');
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+ $this->assertEquals('HTTP/1.1 412 Precondition failed',$this->response->status);
+
+ }
+
+ /**
+ * @depends testPutWithIncorrectETag
+ */
+ function testPutWithCorrectETag() {
+
+ // We need an etag-enabled file node.
+ $tree = new DAV\ObjectTree(new DAV\FSExt\Directory(SABRE_TEMPDIR));
+ $this->server->tree = $tree;
+
+ $etag = md5(file_get_contents(SABRE_TEMPDIR . '/test.txt'));
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'PUT',
+ 'HTTP_IF' => '(["'.$etag.'"])',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('newbody');
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+ $this->assertEquals('HTTP/1.1 204 No Content',$this->response->status, 'Incorrect status received. Full response body:' . $this->response->body);
+
+ }
+
+ function testGetTimeoutHeader() {
+
+ $request = new HTTP\Request(array(
+ 'HTTP_TIMEOUT' => 'second-100',
+ ));
+
+ $this->server->httpRequest = $request;
+ $this->assertEquals(100, $this->locksPlugin->getTimeoutHeader());
+
+ }
+
+
+ function testGetTimeoutHeaderNotSet() {
+
+ $request = new HTTP\Request(array(
+ ));
+
+ $this->server->httpRequest = $request;
+ $this->assertEquals(0, $this->locksPlugin->getTimeoutHeader());
+
+ }
+
+
+ function testGetTimeoutHeaderInfinite() {
+
+ $request = new HTTP\Request(array(
+ 'HTTP_TIMEOUT' => 'infinite',
+ ));
+
+ $this->server->httpRequest = $request;
+ $this->assertEquals(LockInfo::TIMEOUT_INFINITE, $this->locksPlugin->getTimeoutHeader());
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\BadRequest
+ */
+ function testGetTimeoutHeaderInvalid() {
+
+ $request = new HTTP\Request(array(
+ 'HTTP_TIMEOUT' => 'yourmom',
+ ));
+
+ $this->server->httpRequest = $request;
+ $this->locksPlugin->getTimeoutHeader();
+
+ }
+
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/Mount/PluginTest.php b/vendor/sabre/dav/tests/Sabre/DAV/Mount/PluginTest.php
new file mode 100644
index 000000000..e818fe043
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/Mount/PluginTest.php
@@ -0,0 +1,58 @@
+<?php
+
+namespace Sabre\DAV\Mount;
+
+use Sabre\DAV;
+use Sabre\HTTP;
+
+require_once 'Sabre/DAV/AbstractServer.php';
+
+class PluginTest extends DAV\AbstractServer {
+
+ function setUp() {
+
+ parent::setUp();
+ $this->server->addPlugin(new Plugin());
+
+ }
+
+ function testPassThrough() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/',
+ 'REQUEST_METHOD' => 'GET',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 501 Not Implemented',$this->response->status,'We expected GET to not be implemented for Directories. Response body: ' . $this->response->body);
+
+ }
+
+ function testMountResponse() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/?mount',
+ 'REQUEST_METHOD' => 'GET',
+ 'QUERY_STRING' => 'mount',
+ 'HTTP_HOST' => 'example.org',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 200 OK',$this->response->status);
+
+ $xml = simplexml_load_string($this->response->body);
+ $this->assertTrue($xml==true,'Response was not a valid xml document');
+
+ $xml->registerXPathNamespace('dm','http://purl.org/NET/webdav/mount');
+ $url = $xml->xpath('//dm:url');
+ $this->assertEquals('http://example.org/',(string)$url[0]);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/ObjectTreeTest.php b/vendor/sabre/dav/tests/Sabre/DAV/ObjectTreeTest.php
new file mode 100644
index 000000000..330058b6d
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/ObjectTreeTest.php
@@ -0,0 +1,100 @@
+<?php
+
+namespace Sabre\DAV;
+
+require_once 'Sabre/TestUtil.php';
+
+class ObjectTreeTest extends \PHPUnit_Framework_TestCase {
+
+ protected $tree;
+
+ function setup() {
+
+ \Sabre\TestUtil::clearTempDir();
+ mkdir(SABRE_TEMPDIR . '/root');
+ mkdir(SABRE_TEMPDIR . '/root/subdir');
+ file_put_contents(SABRE_TEMPDIR . '/root/file.txt','contents');
+ file_put_contents(SABRE_TEMPDIR . '/root/subdir/subfile.txt','subcontents');
+ $rootNode = new FSExt\Directory(SABRE_TEMPDIR . '/root');
+ $this->tree = new ObjectTree($rootNode);
+
+ }
+
+ function teardown() {
+
+ \Sabre\TestUtil::clearTempDir();
+
+ }
+
+ function testGetRootNode() {
+
+ $root = $this->tree->getNodeForPath('');
+ $this->assertInstanceOf('Sabre\\DAV\\FSExt\\Directory',$root);
+
+ }
+
+ function testGetSubDir() {
+
+ $root = $this->tree->getNodeForPath('subdir');
+ $this->assertInstanceOf('Sabre\\DAV\\FSExt\\Directory',$root);
+
+ }
+
+ function testCopyFile() {
+
+ $this->tree->copy('file.txt','file2.txt');
+ $this->assertTrue(file_exists(SABRE_TEMPDIR.'/root/file2.txt'));
+ $this->assertEquals('contents',file_get_contents(SABRE_TEMPDIR.'/root/file2.txt'));
+
+ }
+
+ /**
+ * @depends testCopyFile
+ */
+ function testCopyDirectory() {
+
+ $this->tree->copy('subdir','subdir2');
+ $this->assertTrue(file_exists(SABRE_TEMPDIR.'/root/subdir2'));
+ $this->assertTrue(file_exists(SABRE_TEMPDIR.'/root/subdir2/subfile.txt'));
+ $this->assertEquals('subcontents',file_get_contents(SABRE_TEMPDIR.'/root/subdir2/subfile.txt'));
+
+ }
+
+ /**
+ * @depends testCopyFile
+ */
+ function testMoveFile() {
+
+ $this->tree->move('file.txt','file2.txt');
+ $this->assertTrue(file_exists(SABRE_TEMPDIR.'/root/file2.txt'));
+ $this->assertFalse(file_exists(SABRE_TEMPDIR.'/root/file.txt'));
+ $this->assertEquals('contents',file_get_contents(SABRE_TEMPDIR.'/root/file2.txt'));
+
+ }
+
+ /**
+ * @depends testMoveFile
+ */
+ function testMoveFileNewParent() {
+
+ $this->tree->move('file.txt','subdir/file2.txt');
+ $this->assertTrue(file_exists(SABRE_TEMPDIR.'/root/subdir/file2.txt'));
+ $this->assertFalse(file_exists(SABRE_TEMPDIR.'/root/file.txt'));
+ $this->assertEquals('contents',file_get_contents(SABRE_TEMPDIR.'/root/subdir/file2.txt'));
+
+ }
+
+ /**
+ * @depends testCopyDirectory
+ */
+ function testMoveDirectory() {
+
+ $this->tree->move('subdir','subdir2');
+ $this->assertTrue(file_exists(SABRE_TEMPDIR.'/root/subdir2'));
+ $this->assertTrue(file_exists(SABRE_TEMPDIR.'/root/subdir2/subfile.txt'));
+ $this->assertFalse(file_exists(SABRE_TEMPDIR.'/root/subdir'));
+ $this->assertEquals('subcontents',file_get_contents(SABRE_TEMPDIR.'/root/subdir2/subfile.txt'));
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/PartialUpdate/FileMock.php b/vendor/sabre/dav/tests/Sabre/DAV/PartialUpdate/FileMock.php
new file mode 100644
index 000000000..e8cdc1666
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/PartialUpdate/FileMock.php
@@ -0,0 +1,79 @@
+<?php
+
+namespace Sabre\DAV\PartialUpdate;
+use Sabre\DAV;
+
+class FileMock implements IFile {
+
+ protected $data = '';
+
+ function put($str) {
+
+ if (is_resource($str)) {
+ $str = stream_get_contents($str);
+ }
+ $this->data = $str;
+
+ }
+
+ function putRange($str,$start) {
+
+ if (is_resource($str)) {
+ $str = stream_get_contents($str);
+ }
+ $this->data = substr($this->data, 0, $start) . $str . substr($this->data, $start + strlen($str));
+
+
+
+ }
+
+ function get() {
+
+ return $this->data;
+
+ }
+
+ function getContentType() {
+
+ return 'text/plain';
+
+ }
+
+ function getSize() {
+
+ return strlen($this->data);
+
+ }
+
+ function getETag() {
+
+ return '"' . $this->data . '"';
+
+ }
+
+ function delete() {
+
+ throw new DAV\Exception\MethodNotAllowed();
+
+ }
+
+ function setName($name) {
+
+ throw new DAV\Exception\MethodNotAllowed();
+
+ }
+
+ function getName() {
+
+ return 'partial';
+
+ }
+
+ function getLastModified() {
+
+ return null;
+
+ }
+
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/PartialUpdate/PluginTest.php b/vendor/sabre/dav/tests/Sabre/DAV/PartialUpdate/PluginTest.php
new file mode 100644
index 000000000..7b90429d4
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/PartialUpdate/PluginTest.php
@@ -0,0 +1,130 @@
+<?php
+
+namespace Sabre\DAV\PartialUpdate;
+
+use Sabre\DAV;
+use Sabre\HTTP;
+
+require_once 'Sabre/DAV/PartialUpdate/FileMock.php';
+
+class PluginTest extends \Sabre\DAVServerTest {
+
+ protected $node;
+ protected $plugin;
+
+ public function setUp() {
+
+ $this->node = new FileMock();
+ $this->tree[] = $this->node;
+
+ parent::setUp();
+
+ $this->plugin = new Plugin();
+ $this->server->addPlugin($this->plugin);
+
+
+
+ }
+
+ public function testInit() {
+
+ $this->assertEquals('partialupdate', $this->plugin->getPluginName());
+ $this->assertEquals(array('sabredav-partialupdate'), $this->plugin->getFeatures());
+ $this->assertEquals(array(
+ 'PATCH'
+ ), $this->plugin->getHTTPMethods('partial'));
+ $this->assertEquals(array(
+ ), $this->plugin->getHTTPMethods(''));
+
+ $this->assertNull($this->plugin->unknownMethod('FOO','partial'));
+
+ }
+
+ public function testPatchNoRange() {
+
+ $this->node->put('00000000');
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'PATCH',
+ 'REQUEST_URI' => '/partial',
+ ));
+ $response = $this->request($request);
+
+ $this->assertEquals('HTTP/1.1 400 Bad request', $response->status, 'Full response body:' . $response->body);
+
+ }
+
+ public function testPatchNotSupported() {
+
+ $this->node->put('00000000');
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'PATCH',
+ 'REQUEST_URI' => '/',
+ 'X_UPDATE_RANGE' => '3-4',
+
+ ));
+ $request->setBody(
+ '111'
+ );
+ $response = $this->request($request);
+
+ $this->assertEquals('HTTP/1.1 405 Method Not Allowed', $response->status, 'Full response body:' . $response->body);
+
+ }
+
+ public function testPatchNoContentType() {
+
+ $this->node->put('00000000');
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'PATCH',
+ 'REQUEST_URI' => '/partial',
+ 'HTTP_X_UPDATE_RANGE' => 'bytes=3-4',
+
+ ));
+ $request->setBody(
+ '111'
+ );
+ $response = $this->request($request);
+
+ $this->assertEquals('HTTP/1.1 415 Unsupported Media Type', $response->status, 'Full response body:' . $response->body);
+
+ }
+
+ public function testPatchBadRange() {
+
+ $this->node->put('00000000');
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'PATCH',
+ 'REQUEST_URI' => '/partial',
+ 'HTTP_X_UPDATE_RANGE' => 'bytes=3-4',
+ 'HTTP_CONTENT_TYPE' => 'application/x-sabredav-partialupdate',
+ ));
+ $request->setBody(
+ '111'
+ );
+ $response = $this->request($request);
+
+ $this->assertEquals('HTTP/1.1 416 Requested Range Not Satisfiable', $response->status, 'Full response body:' . $response->body);
+
+ }
+
+ public function testPatchSuccess() {
+
+ $this->node->put('00000000');
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'PATCH',
+ 'REQUEST_URI' => '/partial',
+ 'HTTP_X_UPDATE_RANGE' => 'bytes=3-5',
+ 'HTTP_CONTENT_TYPE' => 'application/x-sabredav-partialupdate',
+ 'HTTP_CONTENT_LENGTH' => 3,
+ ));
+ $request->setBody(
+ '111'
+ );
+ $response = $this->request($request);
+
+ $this->assertEquals('HTTP/1.1 204 No Content', $response->status, 'Full response body:' . $response->body);
+ $this->assertEquals('00111000', $this->node->get());
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/Property/GetLastModifiedTest.php b/vendor/sabre/dav/tests/Sabre/DAV/Property/GetLastModifiedTest.php
new file mode 100644
index 000000000..de8ca1283
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/Property/GetLastModifiedTest.php
@@ -0,0 +1,75 @@
+<?php
+
+namespace Sabre\DAV\Property;
+
+use Sabre\DAV;
+use Sabre\HTTP;
+
+class GetLastModifiedTest extends \PHPUnit_Framework_TestCase {
+
+ function testConstructDateTime() {
+
+ $dt = new \DateTime('2010-03-14 16:35', new \DateTimeZone('UTC'));
+ $lastMod = new GetLastModified($dt);
+ $this->assertEquals($dt->format(\DateTime::ATOM), $lastMod->getTime()->format(\DateTime::ATOM));
+
+ }
+
+ function testConstructString() {
+
+ $dt = new \DateTime('2010-03-14 16:35', new \DateTimeZone('UTC'));
+ $lastMod = new GetLastModified('2010-03-14 16:35');
+ $this->assertEquals($dt->format(\DateTime::ATOM), $lastMod->getTime()->format(\DateTime::ATOM));
+
+ }
+
+ function testConstructInt() {
+
+ $dt = new \DateTime('2010-03-14 16:35', new \DateTimeZone('UTC'));
+ $lastMod = new GetLastModified((int)$dt->format('U'));
+ $this->assertEquals($dt->format(\DateTime::ATOM), $lastMod->getTime()->format(\DateTime::ATOM));
+
+ }
+
+ function testSerialize() {
+
+ $dt = new \DateTime('2010-03-14 16:35', new \DateTimeZone('UTC'));
+ $lastMod = new GetLastModified($dt);
+
+ $doc = new \DOMDocument();
+ $root = $doc->createElement('d:getlastmodified');
+ $root->setAttribute('xmlns:d','DAV:');
+
+ $doc->appendChild($root);
+ $server = new DAV\Server();
+
+ $lastMod->serialize($server, $root);
+
+ $xml = $doc->saveXML();
+
+ /*
+ $this->assertEquals(
+'<?xml version="1.0"?>
+<d:getlastmodified xmlns:d="DAV:" xmlns:b="urn:uuid:c2f41010-65b3-11d1-a29f-00aa00c14882/" b:dt="dateTime.rfc1123">' .
+HTTP\Util::toHTTPDate($dt) .
+'</d:getlastmodified>
+', $xml);
+ */
+ $this->assertEquals(
+'<?xml version="1.0"?>
+<d:getlastmodified xmlns:d="DAV:">' .
+HTTP\Util::toHTTPDate($dt) .
+'</d:getlastmodified>
+', $xml);
+
+ $ok = false;
+ try {
+ GetLastModified::unserialize(DAV\XMLUtil::loadDOMDocument($xml)->firstChild);
+ } catch (DAV\Exception $e) {
+ $ok = true;
+ }
+ if (!$ok) $this->markTestFailed('Unserialize should not be supported');
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/Property/HrefListTest.php b/vendor/sabre/dav/tests/Sabre/DAV/Property/HrefListTest.php
new file mode 100644
index 000000000..fe2bc81f9
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/Property/HrefListTest.php
@@ -0,0 +1,91 @@
+<?php
+
+namespace Sabre\DAV\Property;
+use Sabre\DAV;
+
+class HrefListTest extends \PHPUnit_Framework_TestCase {
+
+ function testConstruct() {
+
+ $href = new HrefList(array('foo','bar'));
+ $this->assertEquals(array('foo','bar'),$href->getHrefs());
+
+ }
+
+ function testSerialize() {
+
+ $href = new HrefList(array('foo','bar'));
+ $this->assertEquals(array('foo','bar'),$href->getHrefs());
+
+ $doc = new \DOMDocument();
+ $root = $doc->createElement('d:anything');
+ $root->setAttribute('xmlns:d','DAV:');
+
+ $doc->appendChild($root);
+ $server = new DAV\Server();
+ $server->setBaseUri('/bla/');
+
+ $href->serialize($server, $root);
+
+ $xml = $doc->saveXML();
+
+ $this->assertEquals(
+'<?xml version="1.0"?>
+<d:anything xmlns:d="DAV:"><d:href>/bla/foo</d:href><d:href>/bla/bar</d:href></d:anything>
+', $xml);
+
+ }
+
+ function testSerializeNoPrefix() {
+
+ $href = new HrefList(array('foo','bar'), false);
+ $this->assertEquals(array('foo','bar'),$href->getHrefs());
+
+ $doc = new \DOMDocument();
+ $root = $doc->createElement('d:anything');
+ $root->setAttribute('xmlns:d','DAV:');
+
+ $doc->appendChild($root);
+ $server = new DAV\Server();
+ $server->setBaseUri('/bla/');
+
+ $href->serialize($server, $root);
+
+ $xml = $doc->saveXML();
+
+ $this->assertEquals(
+'<?xml version="1.0"?>
+<d:anything xmlns:d="DAV:"><d:href>foo</d:href><d:href>bar</d:href></d:anything>
+', $xml);
+
+ }
+
+ function testUnserialize() {
+
+ $xml = '<?xml version="1.0"?>
+<d:anything xmlns:d="urn:DAV"><d:href>/bla/foo</d:href><d:href>/bla/bar</d:href></d:anything>
+';
+
+ $dom = new \DOMDocument();
+ $dom->loadXML($xml);
+
+ $href = HrefList::unserialize($dom->firstChild);
+ $this->assertEquals(array('/bla/foo','/bla/bar'),$href->getHrefs());
+
+ }
+
+ function testUnserializeIncompatible() {
+
+ $xml = '<?xml version="1.0"?>
+<d:anything xmlns:d="urn:DAV"><d:href2>/bla/foo</d:href2></d:anything>
+';
+
+ $dom = new \DOMDocument();
+ $dom->loadXML($xml);
+
+ $href = HrefList::unserialize($dom->firstChild);
+ $this->assertEquals(array(), $href->getHrefs());
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/Property/HrefTest.php b/vendor/sabre/dav/tests/Sabre/DAV/Property/HrefTest.php
new file mode 100644
index 000000000..e5607f51b
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/Property/HrefTest.php
@@ -0,0 +1,119 @@
+<?php
+
+namespace Sabre\DAV\Property;
+
+use Sabre\DAV;
+
+class HrefTest extends \PHPUnit_Framework_TestCase {
+
+ function testConstruct() {
+
+ $href = new Href('path');
+ $this->assertEquals('path',$href->getHref());
+
+ }
+
+ function testSerialize() {
+
+ $href = new Href('path');
+ $this->assertEquals('path',$href->getHref());
+
+ $doc = new \DOMDocument();
+ $root = $doc->createElement('d:anything');
+ $root->setAttribute('xmlns:d','DAV:');
+
+ $doc->appendChild($root);
+ $server = new DAV\Server();
+ $server->setBaseUri('/bla/');
+
+ $href->serialize($server, $root);
+
+ $xml = $doc->saveXML();
+
+ $this->assertEquals(
+'<?xml version="1.0"?>
+<d:anything xmlns:d="DAV:"><d:href>/bla/path</d:href></d:anything>
+', $xml);
+
+ }
+
+ function testSerializeNoPrefix() {
+
+ $href = new Href('path',false);
+ $this->assertEquals('path',$href->getHref());
+
+ $doc = new \DOMDocument();
+ $root = $doc->createElement('d:anything');
+ $root->setAttribute('xmlns:d','DAV:');
+
+ $doc->appendChild($root);
+ $server = new DAV\Server();
+ $server->setBaseUri('/bla/');
+
+ $href->serialize($server, $root);
+
+ $xml = $doc->saveXML();
+
+ $this->assertEquals(
+'<?xml version="1.0"?>
+<d:anything xmlns:d="DAV:"><d:href>path</d:href></d:anything>
+', $xml);
+
+ }
+
+ function testUnserialize() {
+
+ $xml = '<?xml version="1.0"?>
+<d:anything xmlns:d="urn:DAV"><d:href>/bla/path</d:href></d:anything>
+';
+
+ $dom = new \DOMDocument();
+ $dom->loadXML($xml);
+
+ $href = Href::unserialize($dom->firstChild);
+ $this->assertEquals('/bla/path',$href->getHref());
+
+ }
+
+ function testUnserializeIncompatible() {
+
+ $xml = '<?xml version="1.0"?>
+<d:anything xmlns:d="urn:DAV"><d:href2>/bla/path</d:href2></d:anything>
+';
+
+ $dom = new \DOMDocument();
+ $dom->loadXML($xml);
+
+ $href = Href::unserialize($dom->firstChild);
+ $this->assertNull($href);
+
+ }
+
+ /**
+ * This method tests if hrefs containing & are correctly encoded.
+ */
+ function testSerializeEntity() {
+
+ $href = new Href('http://example.org/?a&b', false);
+ $this->assertEquals('http://example.org/?a&b',$href->getHref());
+
+ $doc = new \DOMDocument();
+ $root = $doc->createElement('d:anything');
+ $root->setAttribute('xmlns:d','DAV:');
+
+ $doc->appendChild($root);
+ $server = new DAV\Server();
+ $server->setBaseUri('/bla/');
+
+ $href->serialize($server, $root);
+
+ $xml = $doc->saveXML();
+
+ $this->assertEquals(
+'<?xml version="1.0"?>
+<d:anything xmlns:d="DAV:"><d:href>http://example.org/?a&amp;b</d:href></d:anything>
+', $xml);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/Property/ResourceTypeTest.php b/vendor/sabre/dav/tests/Sabre/DAV/Property/ResourceTypeTest.php
new file mode 100644
index 000000000..8a579baec
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/Property/ResourceTypeTest.php
@@ -0,0 +1,111 @@
+<?php
+
+namespace Sabre\DAV\Property;
+
+use Sabre\DAV;
+
+class ResourceTypeTest extends \PHPUnit_Framework_TestCase {
+
+ function testConstruct() {
+
+ $resourceType = new ResourceType(array('{DAV:}collection'));
+ $this->assertEquals(array('{DAV:}collection'),$resourceType->getValue());
+
+ $resourceType = new ResourceType(DAV\Server::NODE_FILE);
+ $this->assertEquals(array(),$resourceType->getValue());
+
+ $resourceType = new ResourceType(DAV\Server::NODE_DIRECTORY);
+ $this->assertEquals(array('{DAV:}collection'),$resourceType->getValue());
+
+ $resourceType = new ResourceType('{DAV:}principal');
+ $this->assertEquals(array('{DAV:}principal'),$resourceType->getValue());
+
+ }
+
+ /**
+ * @depends testConstruct
+ */
+ function testSerialize() {
+
+ $resourceType = new ResourceType(array('{DAV:}collection','{DAV:}principal'));
+
+ $doc = new \DOMDocument();
+ $root = $doc->createElement('d:anything');
+ $root->setAttribute('xmlns:d','DAV:');
+
+ $doc->appendChild($root);
+ $server = new DAV\Server();
+ $resourceType->serialize($server, $root);
+
+ $xml = $doc->saveXML();
+
+ $this->assertEquals(
+'<?xml version="1.0"?>
+<d:anything xmlns:d="DAV:"><d:collection/><d:principal/></d:anything>
+', $xml);
+
+ }
+
+ /**
+ * @depends testSerialize
+ */
+ function testSerializeCustomNS() {
+
+ $resourceType = new ResourceType(array('{http://example.org/NS}article'));
+
+ $doc = new \DOMDocument();
+ $root = $doc->createElement('d:anything');
+ $root->setAttribute('xmlns:d','DAV:');
+
+ $doc->appendChild($root);
+ $server = new DAV\Server();
+ $resourceType->serialize($server, $root);
+
+ $xml = $doc->saveXML();
+
+ $this->assertEquals(
+'<?xml version="1.0"?>
+<d:anything xmlns:d="DAV:"><custom:article xmlns:custom="http://example.org/NS"/></d:anything>
+', $xml);
+
+ }
+
+ /**
+ * @depends testConstruct
+ */
+ function testIs() {
+
+ $resourceType = new ResourceType(array('{DAV:}collection','{DAV:}principal'));
+ $this->assertTrue($resourceType->is('{DAV:}collection'));
+ $this->assertFalse($resourceType->is('{DAV:}blabla'));
+
+ }
+
+ /**
+ * @depends testConstruct
+ */
+ function testAdd() {
+
+ $resourceType = new ResourceType(array('{DAV:}collection','{DAV:}principal'));
+ $resourceType->add('{DAV:}foo');
+ $this->assertEquals(array('{DAV:}collection','{DAV:}principal','{DAV:}foo'), $resourceType->getValue());
+
+ }
+
+ /**
+ * @depends testConstruct
+ */
+ function testUnserialize() {
+
+ $xml ='<?xml version="1.0"?>
+<d:anything xmlns:d="DAV:"><d:collection/><d:principal/></d:anything>
+';
+
+ $dom = DAV\XMLUtil::loadDOMDocument($xml);
+
+ $resourceType = ResourceType::unserialize($dom->firstChild);
+ $this->assertEquals(array('{DAV:}collection','{DAV:}principal'),$resourceType->getValue());
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/Property/ResponseListTest.php b/vendor/sabre/dav/tests/Sabre/DAV/Property/ResponseListTest.php
new file mode 100644
index 000000000..d13066b80
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/Property/ResponseListTest.php
@@ -0,0 +1,19 @@
+<?php
+
+namespace Sabre\DAV\Property;
+
+class ResponseListTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * This was the only part not yet covered by other tests, so I'm going to
+ * be lazy and (for now) only test this case.
+ *
+ * @expectedException InvalidArgumentException
+ */
+ public function testInvalidArg() {
+
+ $response = new ResponseList(array(1,2));
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/Property/ResponseTest.php b/vendor/sabre/dav/tests/Sabre/DAV/Property/ResponseTest.php
new file mode 100644
index 000000000..073cbb2ce
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/Property/ResponseTest.php
@@ -0,0 +1,230 @@
+<?php
+
+namespace Sabre\DAV\Property;
+
+use Sabre\DAV;
+
+class ResponseTest extends \PHPUnit_Framework_TestCase {
+
+ function testSimple() {
+
+ $innerProps = array(
+ 200 => array(
+ '{DAV:}displayname' => 'my file',
+ ),
+ 404 => array(
+ '{DAV:}owner' => null,
+ )
+ );
+
+ $property = new Response('uri',$innerProps);
+
+ $this->assertEquals('uri',$property->getHref());
+ $this->assertEquals($innerProps,$property->getResponseProperties());
+
+
+ }
+
+ /**
+ * @depends testSimple
+ */
+ function testSerialize() {
+
+ $innerProps = array(
+ 200 => array(
+ '{DAV:}displayname' => 'my file',
+ ),
+ 404 => array(
+ '{DAV:}owner' => null,
+ )
+ );
+
+ $property = new Response('uri',$innerProps);
+
+ $doc = new \DOMDocument();
+ $root = $doc->createElement('d:root');
+ $root->setAttribute('xmlns:d','DAV:');
+
+ $doc->appendChild($root);
+ $server = new DAV\Server();
+
+ $property->serialize($server, $root);
+
+ $xml = $doc->saveXML();
+
+ $this->assertEquals(
+'<?xml version="1.0"?>
+<d:root xmlns:d="DAV:">' .
+'<d:response>' .
+'<d:href>/uri</d:href>' .
+'<d:propstat>' .
+'<d:prop>' .
+'<d:displayname>my file</d:displayname>' .
+'</d:prop>' .
+'<d:status>HTTP/1.1 200 OK</d:status>' .
+'</d:propstat>' .
+'<d:propstat>' .
+'<d:prop>' .
+'<d:owner/>' .
+'</d:prop>' .
+'<d:status>HTTP/1.1 404 Not Found</d:status>' .
+'</d:propstat>' .
+'</d:response>' .
+'</d:root>
+', $xml);
+
+ }
+
+ /**
+ * This one is specifically for testing properties with no namespaces, which is legal xml
+ *
+ * @depends testSerialize
+ */
+ function testSerializeEmptyNamespace() {
+
+ $innerProps = array(
+ 200 => array(
+ '{}propertyname' => 'value',
+ ),
+ );
+
+ $property = new Response('uri',$innerProps);
+
+ $doc = new \DOMDocument();
+ $root = $doc->createElement('d:root');
+ $root->setAttribute('xmlns:d','DAV:');
+
+ $doc->appendChild($root);
+ $server = new DAV\Server();
+
+ $property->serialize($server, $root);
+
+ $xml = $doc->saveXML();
+
+ $this->assertEquals(
+'<?xml version="1.0"?>
+<d:root xmlns:d="DAV:">' .
+'<d:response>' .
+'<d:href>/uri</d:href>' .
+'<d:propstat>' .
+'<d:prop>' .
+'<propertyname xmlns="">value</propertyname>' .
+'</d:prop>' .
+'<d:status>HTTP/1.1 200 OK</d:status>' .
+'</d:propstat>' .
+'</d:response>' .
+'</d:root>
+', $xml);
+
+ }
+
+ /**
+ * This one is specifically for testing properties with no namespaces, which is legal xml
+ *
+ * @depends testSerialize
+ */
+ function testSerializeCustomNamespace() {
+
+ $innerProps = array(
+ 200 => array(
+ '{http://sabredav.org/NS/example}propertyname' => 'value',
+ ),
+ );
+
+ $property = new Response('uri',$innerProps);
+
+ $doc = new \DOMDocument();
+ $root = $doc->createElement('d:root');
+ $root->setAttribute('xmlns:d','DAV:');
+
+ $doc->appendChild($root);
+ $server = new DAV\Server();
+
+ $property->serialize($server, $root);
+
+ $xml = $doc->saveXML();
+
+ $this->assertEquals(
+'<?xml version="1.0"?>
+<d:root xmlns:d="DAV:">' .
+'<d:response>' .
+'<d:href>/uri</d:href>' .
+'<d:propstat>' .
+'<d:prop>' .
+'<x2:propertyname xmlns:x2="http://sabredav.org/NS/example">value</x2:propertyname>' .
+'</d:prop>' .
+'<d:status>HTTP/1.1 200 OK</d:status>' .
+'</d:propstat>' .
+'</d:response>' .
+'</d:root>
+', $xml);
+
+ }
+
+ /**
+ * @depends testSerialize
+ */
+ function testSerializeComplexProperty() {
+
+ $innerProps = array(
+ 200 => array(
+ '{DAV:}link' => new Href('http://sabredav.org/', false)
+ ),
+ );
+
+ $property = new Response('uri',$innerProps);
+
+ $doc = new \DOMDocument();
+ $root = $doc->createElement('d:root');
+ $root->setAttribute('xmlns:d','DAV:');
+
+ $doc->appendChild($root);
+ $server = new DAV\Server();
+
+ $property->serialize($server, $root);
+
+ $xml = $doc->saveXML();
+
+ $this->assertEquals(
+'<?xml version="1.0"?>
+<d:root xmlns:d="DAV:">' .
+'<d:response>' .
+'<d:href>/uri</d:href>' .
+'<d:propstat>' .
+'<d:prop>' .
+'<d:link><d:href>http://sabredav.org/</d:href></d:link>' .
+'</d:prop>' .
+'<d:status>HTTP/1.1 200 OK</d:status>' .
+'</d:propstat>' .
+'</d:response>' .
+'</d:root>
+', $xml);
+
+ }
+
+ /**
+ * @depends testSerialize
+ * @expectedException Sabre\DAV\Exception
+ */
+ function testSerializeBreak() {
+
+ $innerProps = array(
+ 200 => array(
+ '{DAV:}link' => new \STDClass()
+ ),
+ );
+
+ $property = new Response('uri',$innerProps);
+
+ $doc = new \DOMDocument();
+ $root = $doc->createElement('d:root');
+ $root->setAttribute('xmlns:d','DAV:');
+
+ $doc->appendChild($root);
+ $server = new DAV\Server();
+
+ $property->serialize($server, $root);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/Property/SupportedReportSetTest.php b/vendor/sabre/dav/tests/Sabre/DAV/Property/SupportedReportSetTest.php
new file mode 100644
index 000000000..445e22ab3
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/Property/SupportedReportSetTest.php
@@ -0,0 +1,128 @@
+<?php
+
+namespace Sabre\DAV\Property;
+
+use Sabre\DAV;
+use Sabre\HTTP;
+
+require_once 'Sabre/HTTP/ResponseMock.php';
+require_once 'Sabre/DAV/AbstractServer.php';
+
+class SupportedReportSetTest extends DAV\AbstractServer {
+
+ public function sendPROPFIND($body) {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/',
+ 'REQUEST_METHOD' => 'PROPFIND',
+ 'HTTP_DEPTH' => '0',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody($body);
+
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ }
+
+ /**
+ * @covers Sabre\DAV\Property\SupportedReportSet
+ */
+ function testNoReports() {
+
+ $xml = '<?xml version="1.0"?>
+<d:propfind xmlns:d="DAV:">
+ <d:prop>
+ <d:supported-report-set />
+ </d:prop>
+</d:propfind>';
+
+ $this->sendPROPFIND($xml);
+
+ $this->assertEquals('HTTP/1.1 207 Multi-Status',$this->response->status,'We expected a multi-status response. Full response body: ' . $this->response->body);
+
+ $body = preg_replace("/xmlns(:[A-Za-z0-9_])?=(\"|\')DAV:(\"|\')/","xmlns\\1=\"urn:DAV\"",$this->response->body);
+ $xml = simplexml_load_string($body);
+ $xml->registerXPathNamespace('d','urn:DAV');
+
+ $data = $xml->xpath('/d:multistatus/d:response/d:propstat/d:prop');
+ $this->assertEquals(1,count($data),'We expected 1 \'d:prop\' element');
+
+ $data = $xml->xpath('/d:multistatus/d:response/d:propstat/d:prop/d:supported-report-set');
+ $this->assertEquals(1,count($data),'We expected 1 \'d:supported-report-set\' element');
+
+ $data = $xml->xpath('/d:multistatus/d:response/d:propstat/d:status');
+ $this->assertEquals(1,count($data),'We expected 1 \'d:status\' element');
+
+ $this->assertEquals('HTTP/1.1 200 OK',(string)$data[0],'The status for this property should have been 200');
+
+ }
+
+ /**
+ * @covers Sabre\DAV\Property\SupportedReportSet
+ * @depends testNoReports
+ */
+ function testCustomReport() {
+
+ // Intercepting the report property
+ $this->server->subscribeEvent('afterGetProperties',array($this,'addProp'));
+
+ $xml = '<?xml version="1.0"?>
+<d:propfind xmlns:d="DAV:">
+ <d:prop>
+ <d:supported-report-set />
+ </d:prop>
+</d:propfind>';
+
+ $this->sendPROPFIND($xml);
+
+ $this->assertEquals('HTTP/1.1 207 Multi-Status',$this->response->status,'We expected a multi-status response. Full response body: ' . $this->response->body);
+
+ $body = preg_replace("/xmlns(:[A-Za-z0-9_])?=(\"|\')DAV:(\"|\')/","xmlns\\1=\"urn:DAV\"",$this->response->body);
+ $xml = simplexml_load_string($body);
+ $xml->registerXPathNamespace('d','urn:DAV');
+ $xml->registerXPathNamespace('x','http://www.rooftopsolutions.nl/testnamespace');
+
+ $data = $xml->xpath('/d:multistatus/d:response/d:propstat/d:prop');
+ $this->assertEquals(1,count($data),'We expected 1 \'d:prop\' element');
+
+ $data = $xml->xpath('/d:multistatus/d:response/d:propstat/d:prop/d:supported-report-set');
+ $this->assertEquals(1,count($data),'We expected 1 \'d:supported-report-set\' element');
+
+ $data = $xml->xpath('/d:multistatus/d:response/d:propstat/d:prop/d:supported-report-set/d:supported-report');
+ $this->assertEquals(2,count($data),'We expected 2 \'d:supported-report\' elements');
+
+ $data = $xml->xpath('/d:multistatus/d:response/d:propstat/d:prop/d:supported-report-set/d:supported-report/d:report');
+ $this->assertEquals(2,count($data),'We expected 2 \'d:report\' elements');
+
+ $data = $xml->xpath('/d:multistatus/d:response/d:propstat/d:prop/d:supported-report-set/d:supported-report/d:report/x:myreport');
+ $this->assertEquals(1,count($data),'We expected 1 \'x:myreport\' element. Full body: ' . $this->response->body);
+
+ $data = $xml->xpath('/d:multistatus/d:response/d:propstat/d:prop/d:supported-report-set/d:supported-report/d:report/d:anotherreport');
+ $this->assertEquals(1,count($data),'We expected 1 \'d:anotherreport\' element. Full body: ' . $this->response->body);
+
+ $data = $xml->xpath('/d:multistatus/d:response/d:propstat/d:status');
+ $this->assertEquals(1,count($data),'We expected 1 \'d:status\' element');
+
+ $this->assertEquals('HTTP/1.1 200 OK',(string)$data[0],'The status for this property should have been 200');
+
+ }
+
+ /**
+ * This method is used as a callback for afterGetProperties
+ */
+ function addProp($path, &$properties) {
+
+ if (isset($properties[200]['{DAV:}supported-report-set'])) {
+ $properties[200]['{DAV:}supported-report-set']->addReport('{http://www.rooftopsolutions.nl/testnamespace}myreport');
+ $properties[200]['{DAV:}supported-report-set']->addReport('{DAV:}anotherreport');
+ }
+
+ }
+
+
+
+}
+
+?>
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/ServerCopyMoveTest.php b/vendor/sabre/dav/tests/Sabre/DAV/ServerCopyMoveTest.php
new file mode 100644
index 000000000..88e107c19
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/ServerCopyMoveTest.php
@@ -0,0 +1,268 @@
+<?php
+
+namespace Sabre\DAV;
+
+use Sabre\HTTP;
+
+require_once 'Sabre/HTTP/ResponseMock.php';
+
+class ServerCopyMoveTest extends \PHPUnit_Framework_TestCase {
+
+ private $response;
+ /**
+ * @var Server
+ */
+ private $server;
+
+ function setUp() {
+
+ $this->response = new HTTP\ResponseMock();
+ $dir = new FS\Directory(SABRE_TEMPDIR);
+ $tree = new ObjectTree($dir);
+ $this->server = new Server($tree);
+ $this->server->debugExceptions = true;
+ $this->server->httpResponse = $this->response;
+ file_put_contents(SABRE_TEMPDIR . '/test.txt', 'Test contents');
+ file_put_contents(SABRE_TEMPDIR . '/test2.txt', 'Test contents2');
+ mkdir(SABRE_TEMPDIR . '/col');
+ file_put_contents(SABRE_TEMPDIR . 'col/test.txt', 'Test contents');
+
+ }
+
+ function tearDown() {
+
+ $cleanUp = array('test.txt','testput.txt','testcol','test2.txt','test3.txt','col/test.txt','col','col2/test.txt','col2');
+ foreach($cleanUp as $file) {
+ $tmpFile = SABRE_TEMPDIR . '/' . $file;
+ if (file_exists($tmpFile)) {
+
+ if (is_dir($tmpFile)) {
+ rmdir($tmpFile);
+ } else {
+ unlink($tmpFile);
+ }
+
+ }
+ }
+
+ }
+
+
+ function testCopyOverWrite() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'COPY',
+ 'HTTP_DESTINATION' => '/test2.txt',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 204 No Content',$this->response->status,'Received an incorrect HTTP status. Full body inspection: ' . $this->response->body);
+ $this->assertEquals(array(
+ 'Content-Length' => '0',
+ ),
+ $this->response->headers
+ );
+
+ $this->assertEquals('Test contents',file_get_contents(SABRE_TEMPDIR. '/test2.txt'));
+
+ }
+
+ function testCopyToSelf() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'COPY',
+ 'HTTP_DESTINATION' => '/test.txt',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 403 Forbidden',$this->response->status,'Received an incorrect HTTP status. Full body inspection: ' . $this->response->body);
+ $this->assertEquals('Test contents',file_get_contents(SABRE_TEMPDIR. '/test.txt'));
+
+ }
+
+ function testMoveToSelf() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'MOVE',
+ 'HTTP_DESTINATION' => '/test.txt',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 403 Forbidden',$this->response->status,'Received an incorrect HTTP status. Full body inspection: ' . $this->response->body);
+ $this->assertEquals('Test contents',file_get_contents(SABRE_TEMPDIR. '/test.txt'));
+
+ }
+
+ function testMoveOverWrite() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'MOVE',
+ 'HTTP_DESTINATION' => '/test2.txt',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Length' => 0,
+ ),
+ $this->response->headers
+ );
+
+ $this->assertEquals('HTTP/1.1 204 No Content',$this->response->status);
+ $this->assertEquals('Test contents',file_get_contents(SABRE_TEMPDIR . '/test2.txt'));
+ $this->assertFalse(file_exists(SABRE_TEMPDIR . '/test.txt'),'The sourcefile test.txt should no longer exist at this point');
+
+ }
+
+ function testBlockedOverWrite() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'COPY',
+ 'HTTP_DESTINATION' => '/test2.txt',
+ 'HTTP_OVERWRITE' => 'F',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml; charset=utf-8',
+ ),
+ $this->response->headers
+ );
+
+ $this->assertEquals('HTTP/1.1 412 Precondition failed',$this->response->status);
+ $this->assertEquals('Test contents2',file_get_contents(SABRE_TEMPDIR . '/test2.txt'));
+
+
+ }
+
+ function testNonExistantParent() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'COPY',
+ 'HTTP_DESTINATION' => '/testcol2/test2.txt',
+ 'HTTP_OVERWRITE' => 'F',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml; charset=utf-8',
+ ),
+ $this->response->headers
+ );
+
+ $this->assertEquals('HTTP/1.1 409 Conflict',$this->response->status);
+
+ }
+
+ function testRandomOverwriteHeader() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'COPY',
+ 'HTTP_DESTINATION' => '/testcol2/test2.txt',
+ 'HTTP_OVERWRITE' => 'SURE!',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 400 Bad request',$this->response->status);
+
+ }
+
+ function testCopyDirectory() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/col',
+ 'REQUEST_METHOD' => 'COPY',
+ 'HTTP_DESTINATION' => '/col2',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Length' => '0',
+ ),
+ $this->response->headers
+ );
+
+ $this->assertEquals('HTTP/1.1 201 Created',$this->response->status);
+ $this->assertEquals('Test contents',file_get_contents(SABRE_TEMPDIR . '/col2/test.txt'));
+
+ }
+
+ function testSimpleCopyFile() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'COPY',
+ 'HTTP_DESTINATION' => '/test3.txt',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Length' => '0',
+ ),
+ $this->response->headers
+ );
+
+ $this->assertEquals('HTTP/1.1 201 Created',$this->response->status);
+ $this->assertEquals('Test contents',file_get_contents(SABRE_TEMPDIR . '/test3.txt'));
+
+ }
+
+ function testSimpleCopyCollection() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/col',
+ 'REQUEST_METHOD' => 'COPY',
+ 'HTTP_DESTINATION' => '/col2',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 201 Created',$this->response->status,'Incorrect status received. Full response body: ' . $this->response->body);
+
+ $this->assertEquals(array(
+ 'Content-Length' => '0',
+ ),
+ $this->response->headers
+ );
+
+
+ $this->assertEquals('Test contents',file_get_contents(SABRE_TEMPDIR . '/col2/test.txt'));
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/ServerEventsTest.php b/vendor/sabre/dav/tests/Sabre/DAV/ServerEventsTest.php
new file mode 100644
index 000000000..2c7a074df
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/ServerEventsTest.php
@@ -0,0 +1,76 @@
+<?php
+
+namespace Sabre\DAV;
+use Sabre\HTTP;
+
+require_once 'Sabre/DAV/AbstractServer.php';
+
+class ServerEventsTest extends AbstractServer {
+
+ private $tempPath;
+
+ private $exception;
+
+ function testAfterBind() {
+
+ $this->server->subscribeEvent('afterBind',array($this,'afterBindHandler'));
+ $newPath = 'afterBind';
+
+ $this->tempPath = '';
+ $this->server->createFile($newPath,'body');
+ $this->assertEquals($newPath, $this->tempPath);
+
+ }
+
+ function afterBindHandler($path) {
+
+ $this->tempPath = $path;
+
+ }
+
+ function testBeforeBindCancel() {
+
+ $this->server->subscribeEvent('beforeBind', array($this,'beforeBindCancelHandler'));
+ $this->assertFalse($this->server->createFile('bla','body'));
+
+ // Also testing put()
+ $req = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'PUT',
+ 'REQUEST_URI' => '/barbar',
+ ));
+
+ $this->server->httpRequest = $req;
+ $this->server->exec();
+
+ $this->assertEquals('',$this->server->httpResponse->status);
+
+ }
+
+ function beforeBindCancelHandler() {
+
+ return false;
+
+ }
+
+ function testException() {
+
+ $this->server->subscribeEvent('exception', array($this, 'exceptionHandler'));
+
+ $req = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'GET',
+ 'REQUEST_URI' => '/not/exisitng',
+ ));
+ $this->server->httpRequest = $req;
+ $this->server->exec();
+
+ $this->assertInstanceOf('Sabre\\DAV\\Exception\\NotFound', $this->exception);
+
+ }
+
+ function exceptionHandler(Exception $exception) {
+
+ $this->exception = $exception;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/ServerFinderBlockTest.php b/vendor/sabre/dav/tests/Sabre/DAV/ServerFinderBlockTest.php
new file mode 100644
index 000000000..180f27b2a
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/ServerFinderBlockTest.php
@@ -0,0 +1,53 @@
+<?php
+
+namespace Sabre\DAV;
+
+use Sabre\HTTP;
+
+require_once 'Sabre/HTTP/ResponseMock.php';
+require_once 'Sabre/DAV/AbstractServer.php';
+
+class ServerFinderBlockTest extends AbstractServer{
+
+ function testPut() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/testput.txt',
+ 'REQUEST_METHOD' => 'PUT',
+ 'HTTP_X_EXPECTED_ENTITY_LENGTH' => '20',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('Testing finder');
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('', $this->response->body);
+ $this->assertEquals('HTTP/1.1 201 Created',$this->response->status);
+ $this->assertEquals('0', $this->response->headers['Content-Length']);
+
+ $this->assertEquals('Testing finder',file_get_contents(SABRE_TEMPDIR . '/testput.txt'));
+
+ }
+
+ function testPutFail() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/testput.txt',
+ 'REQUEST_METHOD' => 'PUT',
+ 'HTTP_X_EXPECTED_ENTITY_LENGTH' => '20',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('');
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 403 Forbidden',$this->response->status);
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml; charset=utf-8',
+ ),$this->response->headers);
+
+ $this->assertFalse(file_exists(SABRE_TEMPDIR . '/testput.txt'));
+ }
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/ServerMKCOLTest.php b/vendor/sabre/dav/tests/Sabre/DAV/ServerMKCOLTest.php
new file mode 100644
index 000000000..34b084dcd
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/ServerMKCOLTest.php
@@ -0,0 +1,371 @@
+<?php
+
+namespace Sabre\DAV;
+
+use Sabre\HTTP;
+
+require_once 'Sabre/HTTP/ResponseMock.php';
+require_once 'Sabre/DAV/AbstractServer.php';
+require_once 'Sabre/DAV/Exception.php';
+
+class ServerMKCOLTest extends AbstractServer {
+
+ function testMkcol() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/testcol',
+ 'REQUEST_METHOD' => 'MKCOL',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody("");
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Length' => '0',
+ ),$this->response->headers);
+
+ $this->assertEquals('HTTP/1.1 201 Created',$this->response->status);
+ $this->assertEquals('', $this->response->body);
+ $this->assertTrue(is_dir($this->tempDir . '/testcol'));
+
+ }
+
+ /**
+ * @depends testMkcol
+ */
+ function testMKCOLUnknownBody() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/testcol',
+ 'REQUEST_METHOD' => 'MKCOL',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody("Hello");
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml; charset=utf-8',
+ ),$this->response->headers);
+
+ $this->assertEquals('HTTP/1.1 415 Unsupported Media Type',$this->response->status);
+
+ }
+
+ /**
+ * @depends testMkcol
+ */
+ function testMKCOLBrokenXML() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/testcol',
+ 'REQUEST_METHOD' => 'MKCOL',
+ 'HTTP_CONTENT_TYPE' => 'application/xml',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody("Hello");
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml; charset=utf-8',
+ ),$this->response->headers);
+
+ $this->assertEquals('HTTP/1.1 400 Bad request',$this->response->status);
+
+ }
+
+ /**
+ * @depends testMkcol
+ */
+ function testMKCOLUnknownXML() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/testcol',
+ 'REQUEST_METHOD' => 'MKCOL',
+ 'HTTP_CONTENT_TYPE' => 'application/xml',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('<?xml version="1.0"?><html></html>');
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml; charset=utf-8',
+ ),$this->response->headers);
+
+ $this->assertEquals('HTTP/1.1 415 Unsupported Media Type',$this->response->status);
+
+ }
+
+ /**
+ * @depends testMkcol
+ */
+ function testMKCOLNoResourceType() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/testcol',
+ 'REQUEST_METHOD' => 'MKCOL',
+ 'HTTP_CONTENT_TYPE' => 'application/xml',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('<?xml version="1.0"?>
+<mkcol xmlns="DAV:">
+ <set>
+ <prop>
+ <displayname>Evert</displayname>
+ </prop>
+ </set>
+</mkcol>');
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml; charset=utf-8',
+ ),$this->response->headers);
+
+ $this->assertEquals('HTTP/1.1 400 Bad request',$this->response->status,'Wrong statuscode received. Full response body: ' .$this->response->body);
+
+ }
+
+ /**
+ * @depends testMKCOLNoResourceType
+ */
+ function testMKCOLIncorrectResourceType() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/testcol',
+ 'REQUEST_METHOD' => 'MKCOL',
+ 'HTTP_CONTENT_TYPE' => 'application/xml',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('<?xml version="1.0"?>
+<mkcol xmlns="DAV:">
+ <set>
+ <prop>
+ <resourcetype><blabla /></resourcetype>
+ </prop>
+ </set>
+</mkcol>');
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml; charset=utf-8',
+ ),$this->response->headers);
+
+ $this->assertEquals('HTTP/1.1 403 Forbidden',$this->response->status,'Wrong statuscode received. Full response body: ' .$this->response->body);
+
+ }
+
+ /**
+ * @depends testMKCOLIncorrectResourceType
+ */
+ function testMKCOLIncorrectResourceType2() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/testcol',
+ 'REQUEST_METHOD' => 'MKCOL',
+ 'HTTP_CONTENT_TYPE' => 'application/xml',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('<?xml version="1.0"?>
+<mkcol xmlns="DAV:">
+ <set>
+ <prop>
+ <resourcetype><collection /><blabla /></resourcetype>
+ </prop>
+ </set>
+</mkcol>');
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml; charset=utf-8',
+ ),$this->response->headers);
+
+ $this->assertEquals('HTTP/1.1 403 Forbidden',$this->response->status,'Wrong statuscode received. Full response body: ' .$this->response->body);
+
+ }
+
+ /**
+ * @depends testMKCOLIncorrectResourceType2
+ */
+ function testMKCOLSuccess() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/testcol',
+ 'REQUEST_METHOD' => 'MKCOL',
+ 'HTTP_CONTENT_TYPE' => 'application/xml',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('<?xml version="1.0"?>
+<mkcol xmlns="DAV:">
+ <set>
+ <prop>
+ <resourcetype><collection /></resourcetype>
+ </prop>
+ </set>
+</mkcol>');
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Length' => '0',
+ ),$this->response->headers);
+
+ $this->assertEquals('HTTP/1.1 201 Created',$this->response->status,'Wrong statuscode received. Full response body: ' .$this->response->body);
+
+ }
+
+ /**
+ * @depends testMKCOLIncorrectResourceType2
+ */
+ function testMKCOLWhiteSpaceResourceType() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/testcol',
+ 'REQUEST_METHOD' => 'MKCOL',
+ 'HTTP_CONTENT_TYPE' => 'application/xml',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('<?xml version="1.0"?>
+<mkcol xmlns="DAV:">
+ <set>
+ <prop>
+ <resourcetype>
+ <collection />
+ </resourcetype>
+ </prop>
+ </set>
+</mkcol>');
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Length' => '0',
+ ),$this->response->headers);
+
+ $this->assertEquals('HTTP/1.1 201 Created',$this->response->status,'Wrong statuscode received. Full response body: ' .$this->response->body);
+
+ }
+
+ /**
+ * @depends testMKCOLIncorrectResourceType2
+ */
+ function testMKCOLNoParent() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/testnoparent/409me',
+ 'REQUEST_METHOD' => 'MKCOL',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('');
+
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml; charset=utf-8',
+ ),$this->response->headers);
+
+ $this->assertEquals('HTTP/1.1 409 Conflict',$this->response->status,'Wrong statuscode received. Full response body: ' .$this->response->body);
+
+ }
+
+ /**
+ * @depends testMKCOLIncorrectResourceType2
+ */
+ function testMKCOLParentIsNoCollection() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt/409me',
+ 'REQUEST_METHOD' => 'MKCOL',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('');
+
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml; charset=utf-8',
+ ),$this->response->headers);
+
+ $this->assertEquals('HTTP/1.1 409 Conflict',$this->response->status,'Wrong statuscode received. Full response body: ' .$this->response->body);
+
+ }
+
+ /**
+ * @depends testMKCOLIncorrectResourceType2
+ */
+ function testMKCOLAlreadyExists() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'MKCOL',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('');
+
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml; charset=utf-8',
+ 'Allow' => 'OPTIONS, GET, HEAD, DELETE, PROPFIND, PUT, PROPPATCH, COPY, MOVE, REPORT',
+ ),$this->response->headers);
+
+ $this->assertEquals('HTTP/1.1 405 Method Not Allowed',$this->response->status,'Wrong statuscode received. Full response body: ' .$this->response->body);
+
+ }
+
+ /**
+ * @depends testMKCOLSuccess
+ * @depends testMKCOLAlreadyExists
+ */
+ function testMKCOLAndProps() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/testcol',
+ 'REQUEST_METHOD' => 'MKCOL',
+ 'HTTP_CONTENT_TYPE' => 'application/xml',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('<?xml version="1.0"?>
+<mkcol xmlns="DAV:">
+ <set>
+ <prop>
+ <resourcetype><collection /></resourcetype>
+ <displayname>my new collection</displayname>
+ </prop>
+ </set>
+</mkcol>');
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 207 Multi-Status',$this->response->status,'Wrong statuscode received. Full response body: ' .$this->response->body);
+
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml; charset=utf-8',
+ ),$this->response->headers);
+
+
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/ServerPluginTest.php b/vendor/sabre/dav/tests/Sabre/DAV/ServerPluginTest.php
new file mode 100644
index 000000000..8f1451b49
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/ServerPluginTest.php
@@ -0,0 +1,98 @@
+<?php
+
+namespace Sabre\DAV;
+use Sabre\HTTP;
+
+require_once 'Sabre/DAV/AbstractServer.php';
+require_once 'Sabre/DAV/TestPlugin.php';
+
+class ServerPluginTest extends AbstractServer {
+
+ /**
+ * @var Sabre\DAV\TestPlugin
+ */
+ protected $testPlugin;
+
+ function setUp() {
+
+ parent::setUp();
+
+ $testPlugin = new TestPlugin();
+ $this->server->addPlugin($testPlugin);
+ $this->testPlugin = $testPlugin;
+
+ }
+
+ /**
+ * @covers \Sabre\DAV\ServerPlugin
+ */
+ function testBaseClass() {
+
+ $p = new ServerPluginMock();
+ $this->assertEquals(array(),$p->getFeatures());
+ $this->assertEquals(array(),$p->getHTTPMethods(''));
+
+ }
+
+ function testOptions() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/',
+ 'REQUEST_METHOD' => 'OPTIONS',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'DAV' => '1, 3, extended-mkcol, drinking',
+ 'MS-Author-Via' => 'DAV',
+ 'Allow' => 'OPTIONS, GET, HEAD, DELETE, PROPFIND, PUT, PROPPATCH, COPY, MOVE, REPORT, BEER, WINE',
+ 'Accept-Ranges' => 'bytes',
+ 'Content-Length' => '0',
+ 'X-Sabre-Version' => Version::VERSION,
+ ),$this->response->headers);
+
+ $this->assertEquals('HTTP/1.1 200 OK',$this->response->status);
+ $this->assertEquals('', $this->response->body);
+ $this->assertEquals('OPTIONS',$this->testPlugin->beforeMethod);
+
+
+ }
+
+ function testGetPlugin() {
+
+ $this->assertEquals($this->testPlugin,$this->server->getPlugin(get_class($this->testPlugin)));
+
+ }
+
+ function testUnknownPlugin() {
+
+ $this->assertNull($this->server->getPlugin('SomeRandomClassName'));
+
+ }
+
+ function testGetSupportedReportSet() {
+
+ $this->assertEquals(array(), $this->testPlugin->getSupportedReportSet('/'));
+
+ }
+
+ function testGetPlugins() {
+
+ $this->assertEquals(
+ array(get_class($this->testPlugin) => $this->testPlugin),
+ $this->server->getPlugins()
+ );
+
+ }
+
+
+}
+
+class ServerPluginMock extends ServerPlugin {
+
+ function initialize(Server $s) { }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/ServerPreconditionTest.php b/vendor/sabre/dav/tests/Sabre/DAV/ServerPreconditionTest.php
new file mode 100644
index 000000000..ea09852a7
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/ServerPreconditionTest.php
@@ -0,0 +1,395 @@
+<?php
+
+namespace Sabre\DAV;
+
+use Sabre\HTTP;
+
+require_once 'Sabre/HTTP/ResponseMock.php';
+
+class ServerPreconditionsTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * @covers Sabre\DAV\Server::checkPreconditions
+ * @expectedException Sabre\DAV\Exception\PreconditionFailed
+ */
+ function testIfMatchNoNode() {
+
+ $root = new SimpleCollection('root',array(new ServerPreconditionsNode()));
+ $server = new Server($root);
+ $httpRequest = new HTTP\Request(array(
+ 'HTTP_IF_MATCH' => '*',
+ 'REQUEST_URI' => '/bar'
+ ));
+ $server->httpRequest = $httpRequest;
+
+ $server->checkPreconditions();
+
+ }
+
+ /**
+ * @covers \Sabre\DAV\Server::checkPreconditions
+ */
+ function testIfMatchHasNode() {
+
+ $root = new SimpleCollection('root',array(new ServerPreconditionsNode()));
+ $server = new Server($root);
+ $httpRequest = new HTTP\Request(array(
+ 'HTTP_IF_MATCH' => '*',
+ 'REQUEST_URI' => '/foo'
+ ));
+ $server->httpRequest = $httpRequest;
+
+ $this->assertTrue($server->checkPreconditions());
+
+ }
+
+ /**
+ * @covers \Sabre\DAV\Server::checkPreconditions
+ * @expectedException Sabre\DAV\Exception\PreconditionFailed
+ */
+ function testIfMatchWrongEtag() {
+
+ $root = new SimpleCollection('root',array(new ServerPreconditionsNode()));
+ $server = new Server($root);
+ $httpRequest = new HTTP\Request(array(
+ 'HTTP_IF_MATCH' => '1234',
+ 'REQUEST_URI' => '/foo'
+ ));
+ $server->httpRequest = $httpRequest;
+
+ $server->checkPreconditions();
+
+ }
+
+ /**
+ * @covers \Sabre\DAV\Server::checkPreconditions
+ */
+ function testIfMatchCorrectEtag() {
+
+ $root = new SimpleCollection('root',array(new ServerPreconditionsNode()));
+ $server = new Server($root);
+ $httpRequest = new HTTP\Request(array(
+ 'HTTP_IF_MATCH' => '"abc123"',
+ 'REQUEST_URI' => '/foo'
+ ));
+ $server->httpRequest = $httpRequest;
+
+ $this->assertTrue($server->checkPreconditions());
+
+ }
+
+ /**
+ * Evolution sometimes uses \" instead of " for If-Match headers.
+ *
+ * @covers \Sabre\DAV\Server::checkPreconditions
+ * @depends testIfMatchCorrectEtag
+ */
+ function testIfMatchEvolutionEtag() {
+
+ $root = new SimpleCollection('root',array(new ServerPreconditionsNode()));
+ $server = new Server($root);
+ $httpRequest = new HTTP\Request(array(
+ 'HTTP_IF_MATCH' => '\\"abc123\\"',
+ 'REQUEST_URI' => '/foo'
+ ));
+ $server->httpRequest = $httpRequest;
+
+ $this->assertTrue($server->checkPreconditions());
+
+ }
+
+ /**
+ * @covers \Sabre\DAV\Server::checkPreconditions
+ */
+ function testIfMatchMultiple() {
+
+ $root = new SimpleCollection('root',array(new ServerPreconditionsNode()));
+ $server = new Server($root);
+ $httpRequest = new HTTP\Request(array(
+ 'HTTP_IF_MATCH' => '"hellothere", "abc123"',
+ 'REQUEST_URI' => '/foo'
+ ));
+ $server->httpRequest = $httpRequest;
+
+ $this->assertTrue($server->checkPreconditions());
+
+ }
+
+ /**
+ * @covers \Sabre\DAV\Server::checkPreconditions
+ */
+ function testIfNoneMatchNoNode() {
+
+ $root = new SimpleCollection('root',array(new ServerPreconditionsNode()));
+ $server = new Server($root);
+ $httpRequest = new HTTP\Request(array(
+ 'HTTP_IF_NONE_MATCH' => '*',
+ 'REQUEST_URI' => '/bar'
+ ));
+ $server->httpRequest = $httpRequest;
+
+ $this->assertTrue($server->checkPreconditions());
+
+ }
+
+ /**
+ * @covers \Sabre\DAV\Server::checkPreconditions
+ * @expectedException Sabre\DAV\Exception\PreconditionFailed
+ */
+ function testIfNoneMatchHasNode() {
+
+ $root = new SimpleCollection('root',array(new ServerPreconditionsNode()));
+ $server = new Server($root);
+ $httpRequest = new HTTP\Request(array(
+ 'HTTP_IF_NONE_MATCH' => '*',
+ 'REQUEST_URI' => '/foo'
+ ));
+ $server->httpRequest = $httpRequest;
+
+ $server->checkPreconditions();
+
+ }
+
+ /**
+ * @covers \Sabre\DAV\Server::checkPreconditions
+ */
+ function testIfNoneMatchWrongEtag() {
+
+ $root = new SimpleCollection('root',array(new ServerPreconditionsNode()));
+ $server = new Server($root);
+ $httpRequest = new HTTP\Request(array(
+ 'HTTP_IF_NONE_MATCH' => '"1234"',
+ 'REQUEST_URI' => '/foo'
+ ));
+ $server->httpRequest = $httpRequest;
+
+ $this->assertTrue($server->checkPreconditions());
+
+ }
+
+ /**
+ * @covers \Sabre\DAV\Server::checkPreconditions
+ */
+ function testIfNoneMatchWrongEtagMultiple() {
+
+ $root = new SimpleCollection('root',array(new ServerPreconditionsNode()));
+ $server = new Server($root);
+ $httpRequest = new HTTP\Request(array(
+ 'HTTP_IF_NONE_MATCH' => '"1234", "5678"',
+ 'REQUEST_URI' => '/foo'
+ ));
+ $server->httpRequest = $httpRequest;
+
+ $this->assertTrue($server->checkPreconditions());
+
+ }
+
+ /**
+ * @covers \Sabre\DAV\Server::checkPreconditions
+ * @expectedException Sabre\DAV\Exception\PreconditionFailed
+ */
+ public function testIfNoneMatchCorrectEtag() {
+
+ $root = new SimpleCollection('root',array(new ServerPreconditionsNode()));
+ $server = new Server($root);
+ $httpRequest = new HTTP\Request(array(
+ 'HTTP_IF_NONE_MATCH' => '"abc123"',
+ 'REQUEST_URI' => '/foo'
+ ));
+ $server->httpRequest = $httpRequest;
+
+ $server->checkPreconditions();
+
+ }
+
+ /**
+ * @covers \Sabre\DAV\Server::checkPreconditions
+ * @expectedException Sabre\DAV\Exception\PreconditionFailed
+ */
+ public function testIfNoneMatchCorrectEtagMultiple() {
+
+ $root = new SimpleCollection('root',array(new ServerPreconditionsNode()));
+ $server = new Server($root);
+ $httpRequest = new HTTP\Request(array(
+ 'HTTP_IF_NONE_MATCH' => '"1234", "abc123"',
+ 'REQUEST_URI' => '/foo'
+ ));
+ $server->httpRequest = $httpRequest;
+
+ $server->checkPreconditions();
+
+ }
+
+ /**
+ * @covers \Sabre\DAV\Server::checkPreconditions
+ */
+ public function testIfNoneMatchCorrectEtagAsGet() {
+
+ $root = new SimpleCollection('root',array(new ServerPreconditionsNode()));
+ $server = new Server($root);
+ $httpRequest = new HTTP\Request(array(
+ 'HTTP_IF_NONE_MATCH' => '"abc123"',
+ 'REQUEST_URI' => '/foo'
+ ));
+ $server->httpRequest = $httpRequest;
+ $server->httpResponse = new HTTP\ResponseMock();
+
+ $this->assertFalse($server->checkPreconditions(true));
+ $this->assertEquals('HTTP/1.1 304 Not Modified',$server->httpResponse->status);
+
+ }
+
+ /**
+ * @covers \Sabre\DAV\Server::checkPreconditions
+ */
+ public function testIfModifiedSinceUnModified() {
+
+ $root = new SimpleCollection('root',array(new ServerPreconditionsNode()));
+ $server = new Server($root);
+ $httpRequest = new HTTP\Request(array(
+ 'HTTP_IF_MODIFIED_SINCE' => 'Sun, 06 Nov 1994 08:49:37 GMT',
+ 'REQUEST_URI' => '/foo'
+ ));
+ $server->httpRequest = $httpRequest;
+ $server->httpResponse = new HTTP\ResponseMock();
+ $this->assertFalse($server->checkPreconditions());
+
+ $this->assertEquals('HTTP/1.1 304 Not Modified',$server->httpResponse->status);
+ $this->assertEquals(array(
+ 'Last-Modified' => 'Sat, 06 Apr 1985 23:30:00 GMT',
+ ), $server->httpResponse->headers);
+
+ }
+
+
+ /**
+ * @covers \Sabre\DAV\Server::checkPreconditions
+ */
+ public function testIfModifiedSinceModified() {
+
+ $root = new SimpleCollection('root',array(new ServerPreconditionsNode()));
+ $server = new Server($root);
+ $httpRequest = new HTTP\Request(array(
+ 'HTTP_IF_MODIFIED_SINCE' => 'Tue, 06 Nov 1984 08:49:37 GMT',
+ 'REQUEST_URI' => '/foo'
+ ));
+ $server->httpRequest = $httpRequest;
+ $server->httpResponse = new HTTP\ResponseMock();
+ $this->assertTrue($server->checkPreconditions());
+
+ }
+
+ /**
+ * @covers \Sabre\DAV\Server::checkPreconditions
+ */
+ public function testIfModifiedSinceInvalidDate() {
+
+ $root = new SimpleCollection('root',array(new ServerPreconditionsNode()));
+ $server = new Server($root);
+ $httpRequest = new HTTP\Request(array(
+ 'HTTP_IF_MODIFIED_SINCE' => 'Your mother',
+ 'REQUEST_URI' => '/foo'
+ ));
+ $server->httpRequest = $httpRequest;
+ $server->httpResponse = new HTTP\ResponseMock();
+
+ // Invalid dates must be ignored, so this should return true
+ $this->assertTrue($server->checkPreconditions());
+
+ }
+
+ /**
+ * @covers \Sabre\DAV\Server::checkPreconditions
+ */
+ public function testIfModifiedSinceInvalidDate2() {
+
+ $root = new SimpleCollection('root',array(new ServerPreconditionsNode()));
+ $server = new Server($root);
+ $httpRequest = new HTTP\Request(array(
+ 'HTTP_IF_MODIFIED_SINCE' => 'Sun, 06 Nov 1994 08:49:37 EST',
+ 'REQUEST_URI' => '/foo'
+ ));
+ $server->httpRequest = $httpRequest;
+ $server->httpResponse = new HTTP\ResponseMock();
+ $this->assertTrue($server->checkPreconditions());
+
+ }
+
+
+ /**
+ * @covers \Sabre\DAV\Server::checkPreconditions
+ */
+ public function testIfUnmodifiedSinceUnModified() {
+
+ $root = new SimpleCollection('root',array(new ServerPreconditionsNode()));
+ $server = new Server($root);
+ $httpRequest = new HTTP\Request(array(
+ 'HTTP_IF_UNMODIFIED_SINCE' => 'Sun, 06 Nov 1994 08:49:37 GMT',
+ 'REQUEST_URI' => '/foo'
+ ));
+ $server->httpRequest = $httpRequest;
+ $this->assertTrue($server->checkPreconditions());
+
+ }
+
+
+ /**
+ * @covers \Sabre\DAV\Server::checkPreconditions
+ * @expectedException Sabre\DAV\Exception\PreconditionFailed
+ */
+ public function testIfUnmodifiedSinceModified() {
+
+ $root = new SimpleCollection('root',array(new ServerPreconditionsNode()));
+ $server = new Server($root);
+ $httpRequest = new HTTP\Request(array(
+ 'HTTP_IF_UNMODIFIED_SINCE' => 'Tue, 06 Nov 1984 08:49:37 GMT',
+ 'REQUEST_URI' => '/foo'
+ ));
+ $server->httpRequest = $httpRequest;
+ $server->httpResponse = new HTTP\ResponseMock();
+ $server->checkPreconditions();
+
+ }
+
+ /**
+ * @covers \Sabre\DAV\Server::checkPreconditions
+ */
+ public function testIfUnmodifiedSinceInvalidDate() {
+
+ $root = new SimpleCollection('root',array(new ServerPreconditionsNode()));
+ $server = new Server($root);
+ $httpRequest = new HTTP\Request(array(
+ 'HTTP_IF_UNMODIFIED_SINCE' => 'Sun, 06 Nov 1984 08:49:37 CET',
+ 'REQUEST_URI' => '/foo'
+ ));
+ $server->httpRequest = $httpRequest;
+ $server->httpResponse = new HTTP\ResponseMock();
+ $this->assertTrue($server->checkPreconditions());
+
+ }
+
+
+}
+
+class ServerPreconditionsNode extends File {
+
+ function getETag() {
+
+ return '"abc123"';
+
+ }
+
+ function getLastModified() {
+
+ /* my birthday & time, I believe */
+ return strtotime('1985-04-07 01:30 +02:00');
+
+ }
+
+ function getName() {
+
+ return 'foo';
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/ServerPropsTest.php b/vendor/sabre/dav/tests/Sabre/DAV/ServerPropsTest.php
new file mode 100644
index 000000000..859a91070
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/ServerPropsTest.php
@@ -0,0 +1,413 @@
+<?php
+
+namespace Sabre\DAV;
+use Sabre\HTTP;
+
+require_once 'Sabre/HTTP/ResponseMock.php';
+require_once 'Sabre/DAV/AbstractServer.php';
+
+class ServerPropsTest extends AbstractServer {
+
+ protected function getRootNode() {
+
+ return new FSExt\Directory(SABRE_TEMPDIR);
+
+ }
+
+ function setUp() {
+
+ if (file_exists(SABRE_TEMPDIR.'../.sabredav')) unlink(SABRE_TEMPDIR.'../.sabredav');
+ parent::setUp();
+ file_put_contents(SABRE_TEMPDIR . '/test2.txt', 'Test contents2');
+ mkdir(SABRE_TEMPDIR . '/col');
+ file_put_contents(SABRE_TEMPDIR . 'col/test.txt', 'Test contents');
+ $this->server->addPlugin(new Locks\Plugin(new Locks\Backend\File(SABRE_TEMPDIR . '/.locksdb')));
+
+ }
+
+ function tearDown() {
+
+ parent::tearDown();
+ if (file_exists(SABRE_TEMPDIR.'../.locksdb')) unlink(SABRE_TEMPDIR.'../.locksdb');
+
+ }
+
+ private function sendRequest($body) {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/',
+ 'REQUEST_METHOD' => 'PROPFIND',
+ 'HTTP_DEPTH' => '0',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody($body);
+
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ }
+
+ public function testPropFindEmptyBody() {
+
+ $hasFired = false;
+
+ $self = $this;
+ // Also testing the beforeGetPropertiesForPath event.
+ $this->server->subscribeEvent('beforeGetPropertiesForPath', function($path, $properties, $depth) use ($self, &$hasFired) {
+
+ $hasFired = true;
+ $self->assertEquals('', $path);
+ $self->assertEquals(array(), $properties);
+ $self->assertEquals(0, $depth);
+
+ });
+
+ $this->sendRequest("");
+
+ $this->assertTrue($hasFired);
+
+ $this->assertEquals('HTTP/1.1 207 Multi-Status',$this->response->status);
+
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml; charset=utf-8',
+ 'DAV' => '1, 3, extended-mkcol, 2',
+ 'Vary' => 'Brief,Prefer',
+ ),
+ $this->response->headers
+ );
+
+ $body = preg_replace("/xmlns(:[A-Za-z0-9_])?=(\"|\')DAV:(\"|\')/","xmlns\\1=\"urn:DAV\"",$this->response->body);
+ $xml = simplexml_load_string($body);
+ $xml->registerXPathNamespace('d','urn:DAV');
+
+ list($data) = $xml->xpath('/d:multistatus/d:response/d:href');
+ $this->assertEquals('/',(string)$data,'href element should have been /');
+
+ $data = $xml->xpath('/d:multistatus/d:response/d:propstat/d:prop/d:resourcetype');
+ $this->assertEquals(1,count($data));
+
+ }
+
+ function testSupportedLocks() {
+
+ $xml = '<?xml version="1.0"?>
+<d:propfind xmlns:d="DAV:">
+ <d:prop>
+ <d:supportedlock />
+ </d:prop>
+</d:propfind>';
+
+ $this->sendRequest($xml);
+
+ $body = preg_replace("/xmlns(:[A-Za-z0-9_])?=(\"|\')DAV:(\"|\')/","xmlns\\1=\"urn:DAV\"",$this->response->body);
+ $xml = simplexml_load_string($body);
+ $xml->registerXPathNamespace('d','urn:DAV');
+
+ $data = $xml->xpath('/d:multistatus/d:response/d:propstat/d:prop/d:supportedlock/d:lockentry');
+ $this->assertEquals(2,count($data),'We expected two \'d:lockentry\' tags');
+
+ $data = $xml->xpath('/d:multistatus/d:response/d:propstat/d:prop/d:supportedlock/d:lockentry/d:lockscope');
+ $this->assertEquals(2,count($data),'We expected two \'d:lockscope\' tags');
+
+ $data = $xml->xpath('/d:multistatus/d:response/d:propstat/d:prop/d:supportedlock/d:lockentry/d:locktype');
+ $this->assertEquals(2,count($data),'We expected two \'d:locktype\' tags');
+
+ $data = $xml->xpath('/d:multistatus/d:response/d:propstat/d:prop/d:supportedlock/d:lockentry/d:lockscope/d:shared');
+ $this->assertEquals(1,count($data),'We expected a \'d:shared\' tag');
+
+ $data = $xml->xpath('/d:multistatus/d:response/d:propstat/d:prop/d:supportedlock/d:lockentry/d:lockscope/d:exclusive');
+ $this->assertEquals(1,count($data),'We expected a \'d:exclusive\' tag');
+
+ $data = $xml->xpath('/d:multistatus/d:response/d:propstat/d:prop/d:supportedlock/d:lockentry/d:locktype/d:write');
+ $this->assertEquals(2,count($data),'We expected two \'d:write\' tags');
+ }
+
+ function testLockDiscovery() {
+
+ $xml = '<?xml version="1.0"?>
+<d:propfind xmlns:d="DAV:">
+ <d:prop>
+ <d:lockdiscovery />
+ </d:prop>
+</d:propfind>';
+
+ $this->sendRequest($xml);
+
+ $body = preg_replace("/xmlns(:[A-Za-z0-9_])?=(\"|\')DAV:(\"|\')/","xmlns\\1=\"urn:DAV\"",$this->response->body);
+ $xml = simplexml_load_string($body);
+ $xml->registerXPathNamespace('d','urn:DAV');
+
+ $data = $xml->xpath('/d:multistatus/d:response/d:propstat/d:prop/d:lockdiscovery');
+ $this->assertEquals(1,count($data),'We expected a \'d:lockdiscovery\' tag');
+
+ }
+
+ function testUnknownProperty() {
+
+ $xml = '<?xml version="1.0"?>
+<d:propfind xmlns:d="DAV:">
+ <d:prop>
+ <d:macaroni />
+ </d:prop>
+</d:propfind>';
+
+ $this->sendRequest($xml);
+ $body = preg_replace("/xmlns(:[A-Za-z0-9_])?=(\"|\')DAV:(\"|\')/","xmlns\\1=\"urn:DAV\"",$this->response->body);
+ $xml = simplexml_load_string($body);
+ $xml->registerXPathNamespace('d','urn:DAV');
+ $pathTests = array(
+ '/d:multistatus',
+ '/d:multistatus/d:response',
+ '/d:multistatus/d:response/d:propstat',
+ '/d:multistatus/d:response/d:propstat/d:status',
+ '/d:multistatus/d:response/d:propstat/d:prop',
+ '/d:multistatus/d:response/d:propstat/d:prop/d:macaroni',
+ );
+ foreach($pathTests as $test) {
+ $this->assertTrue(count($xml->xpath($test))==true,'We expected the ' . $test . ' element to appear in the response, we got: ' . $body);
+ }
+
+ $val = $xml->xpath('/d:multistatus/d:response/d:propstat/d:status');
+ $this->assertEquals(1,count($val),$body);
+ $this->assertEquals('HTTP/1.1 404 Not Found',(string)$val[0]);
+
+ }
+
+ /**
+ * @covers Sabre\DAV\Server::parsePropPatchRequest
+ */
+ public function testParsePropPatchRequest() {
+
+ $body = '<?xml version="1.0"?>
+<d:propertyupdate xmlns:d="DAV:" xmlns:s="http://sabredav.org/NS/test">
+ <d:set><d:prop><s:someprop>somevalue</s:someprop></d:prop></d:set>
+ <d:remove><d:prop><s:someprop2 /></d:prop></d:remove>
+ <d:set><d:prop><s:someprop3>removeme</s:someprop3></d:prop></d:set>
+ <d:remove><d:prop><s:someprop3 /></d:prop></d:remove>
+</d:propertyupdate>';
+
+ $result = $this->server->parsePropPatchRequest($body);
+ $this->assertEquals(array(
+ '{http://sabredav.org/NS/test}someprop' => 'somevalue',
+ '{http://sabredav.org/NS/test}someprop2' => null,
+ '{http://sabredav.org/NS/test}someprop3' => null,
+ ), $result);
+
+ }
+
+ /**
+ * @covers Sabre\DAV\Server::updateProperties
+ */
+ public function testUpdateProperties() {
+
+ $props = array(
+ '{http://sabredav.org/NS/test}someprop' => 'somevalue',
+ );
+
+ $result = $this->server->updateProperties('/test2.txt',$props);
+
+ $this->assertEquals(array(
+ '200' => array('{http://sabredav.org/NS/test}someprop' => null),
+ 'href' => '/test2.txt',
+ ), $result);
+
+ }
+
+ /**
+ * @covers Sabre\DAV\Server::updateProperties
+ * @depends testUpdateProperties
+ */
+ public function testUpdatePropertiesProtected() {
+
+ $props = array(
+ '{http://sabredav.org/NS/test}someprop' => 'somevalue',
+ '{DAV:}getcontentlength' => 50,
+ );
+
+ $result = $this->server->updateProperties('/test2.txt',$props);
+
+ $this->assertEquals(array(
+ '424' => array('{http://sabredav.org/NS/test}someprop' => null),
+ '403' => array('{DAV:}getcontentlength' => null),
+ 'href' => '/test2.txt',
+ ), $result);
+
+ }
+
+ /**
+ * @covers Sabre\DAV\Server::updateProperties
+ * @depends testUpdateProperties
+ */
+ public function testUpdatePropertiesFail1() {
+
+ $dir = new PropTestDirMock('updatepropsfalse');
+ $objectTree = new ObjectTree($dir);
+ $this->server->tree = $objectTree;
+
+ $props = array(
+ '{http://sabredav.org/NS/test}someprop' => 'somevalue',
+ );
+
+ $result = $this->server->updateProperties('/',$props);
+
+ $this->assertEquals(array(
+ '403' => array('{http://sabredav.org/NS/test}someprop' => null),
+ 'href' => '/',
+ ), $result);
+
+ }
+
+ /**
+ * @covers Sabre\DAV\Server::updateProperties
+ * @depends testUpdateProperties
+ */
+ public function testUpdatePropertiesFail2() {
+
+ $dir = new PropTestDirMock('updatepropsarray');
+ $objectTree = new ObjectTree($dir);
+ $this->server->tree = $objectTree;
+
+ $props = array(
+ '{http://sabredav.org/NS/test}someprop' => 'somevalue',
+ );
+
+ $result = $this->server->updateProperties('/',$props);
+
+ $this->assertEquals(array(
+ '402' => array('{http://sabredav.org/NS/test}someprop' => null),
+ 'href' => '/',
+ ), $result);
+
+ }
+
+ /**
+ * @covers Sabre\DAV\Server::updateProperties
+ * @depends testUpdateProperties
+ * @expectedException Sabre\DAV\Exception
+ */
+ public function testUpdatePropertiesFail3() {
+
+ $dir = new PropTestDirMock('updatepropsobj');
+ $objectTree = new ObjectTree($dir);
+ $this->server->tree = $objectTree;
+
+ $props = array(
+ '{http://sabredav.org/NS/test}someprop' => 'somevalue',
+ );
+
+ $result = $this->server->updateProperties('/',$props);
+
+ }
+
+ /**
+ * @depends testParsePropPatchRequest
+ * @depends testUpdateProperties
+ * @covers Sabre\DAV\Server::httpPropPatch
+ */
+ public function testPropPatch() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/',
+ 'REQUEST_METHOD' => 'PROPPATCH',
+ );
+
+ $body = '<?xml version="1.0"?>
+<d:propertyupdate xmlns:d="DAV:" xmlns:s="http://www.rooftopsolutions.nl/testnamespace">
+ <d:set><d:prop><s:someprop>somevalue</s:someprop></d:prop></d:set>
+</d:propertyupdate>';
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody($body);
+
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml; charset=utf-8',
+ 'Vary' => 'Brief,Prefer',
+ ),
+ $this->response->headers
+ );
+
+ $this->assertEquals('HTTP/1.1 207 Multi-Status',$this->response->status,'We got the wrong status. Full XML response: ' . $this->response->body);
+
+ $body = preg_replace("/xmlns(:[A-Za-z0-9_])?=(\"|\')DAV:(\"|\')/","xmlns\\1=\"urn:DAV\"",$this->response->body);
+ $xml = simplexml_load_string($body);
+ $xml->registerXPathNamespace('d','urn:DAV');
+ $xml->registerXPathNamespace('bla','http://www.rooftopsolutions.nl/testnamespace');
+
+ $data = $xml->xpath('/d:multistatus/d:response/d:propstat/d:prop');
+ $this->assertEquals(1,count($data),'We expected one \'d:prop\' element. Response body: ' . $body);
+
+ $data = $xml->xpath('//bla:someprop');
+ $this->assertEquals(1,count($data),'We expected one \'s:someprop\' element. Response body: ' . $body);
+
+ $data = $xml->xpath('/d:multistatus/d:response/d:propstat/d:status');
+ $this->assertEquals(1,count($data),'We expected one \'s:status\' element. Response body: ' . $body);
+
+ $this->assertEquals('HTTP/1.1 200 OK',(string)$data[0]);
+
+ }
+
+ /**
+ * @depends testPropPatch
+ */
+ public function testPropPatchAndFetch() {
+
+ $this->testPropPatch();
+ $xml = '<?xml version="1.0"?>
+<d:propfind xmlns:d="DAV:" xmlns:s="http://www.rooftopsolutions.nl/testnamespace">
+ <d:prop>
+ <s:someprop />
+ </d:prop>
+</d:propfind>';
+
+ $this->sendRequest($xml);
+
+ $body = preg_replace("/xmlns(:[A-Za-z0-9_])?=(\"|\')DAV:(\"|\')/","xmlns\\1=\"urn:DAV\"",$this->response->body);
+ $xml = simplexml_load_string($body);
+ $xml->registerXPathNamespace('d','urn:DAV');
+ $xml->registerXPathNamespace('bla','http://www.rooftopsolutions.nl/testnamespace');
+
+ $xpath='//bla:someprop';
+ $result = $xml->xpath($xpath);
+ $this->assertEquals(1,count($result),'We couldn\'t find our new property in the response. Full response body:' . "\n" . $body);
+ $this->assertEquals('somevalue',(string)$result[0],'We couldn\'t find our new property in the response. Full response body:' . "\n" . $body);
+
+ }
+
+}
+
+class PropTestDirMock extends SimpleCollection implements IProperties {
+
+ public $type;
+
+ function __construct($type) {
+
+ $this->type =$type;
+ parent::__construct('root');
+
+ }
+
+ function updateProperties($updateProperties) {
+
+ switch($this->type) {
+ case 'updatepropsfalse' : return false;
+ case 'updatepropsarray' :
+ $r = array(402 => array());
+ foreach($updateProperties as $k=>$v) $r[402][$k] = null;
+ return $r;
+ case 'updatepropsobj' :
+ return new \STDClass();
+ }
+
+ }
+
+ function getProperties($requestedPropeties) {
+
+ return array();
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/ServerRangeTest.php b/vendor/sabre/dav/tests/Sabre/DAV/ServerRangeTest.php
new file mode 100644
index 000000000..a06fcb0be
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/ServerRangeTest.php
@@ -0,0 +1,274 @@
+<?php
+
+namespace Sabre\DAV;
+use Sabre\HTTP;
+
+require_once 'Sabre/DAV/AbstractServer.php';
+
+class ServerRangeTest extends AbstractServer{
+
+ protected function getRootNode() {
+
+ return new FSExt\Directory(SABRE_TEMPDIR);
+
+ }
+
+ function testRange() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'GET',
+ 'HTTP_RANGE' => 'bytes=2-5',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/octet-stream',
+ 'Content-Length' => 4,
+ 'Content-Range' => 'bytes 2-5/13',
+ 'Last-Modified' => HTTP\Util::toHTTPDate(new \DateTime('@' . filemtime($this->tempDir . '/test.txt'))),
+ 'ETag' => '"' . md5(file_get_contents(SABRE_TEMPDIR . '/test.txt')). '"',
+ ),
+ $this->response->headers
+ );
+
+ $this->assertEquals('HTTP/1.1 206 Partial Content',$this->response->status);
+ $this->assertEquals('st c', stream_get_contents($this->response->body));
+
+ }
+
+ /**
+ * @depends testRange
+ */
+ function testStartRange() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'GET',
+ 'HTTP_RANGE' => 'bytes=2-',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/octet-stream',
+ 'Content-Length' => 11,
+ 'Content-Range' => 'bytes 2-12/13',
+ 'Last-Modified' => HTTP\Util::toHTTPDate(new \DateTime('@' . filemtime($this->tempDir . '/test.txt'))),
+ 'ETag' => '"' . md5(file_get_contents(SABRE_TEMPDIR . '/test.txt')) . '"',
+ ),
+ $this->response->headers
+ );
+
+ $this->assertEquals('HTTP/1.1 206 Partial Content',$this->response->status);
+ $this->assertEquals('st contents', stream_get_contents($this->response->body));
+
+ }
+
+ /**
+ * @depends testRange
+ */
+ function testEndRange() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'GET',
+ 'HTTP_RANGE' => 'bytes=-8',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/octet-stream',
+ 'Content-Length' => 8,
+ 'Content-Range' => 'bytes 5-12/13',
+ 'Last-Modified' => HTTP\Util::toHTTPDate(new \DateTime('@' . filemtime($this->tempDir . '/test.txt'))),
+ 'ETag' => '"' . md5(file_get_contents(SABRE_TEMPDIR . '/test.txt')). '"',
+ ),
+ $this->response->headers
+ );
+
+ $this->assertEquals('HTTP/1.1 206 Partial Content',$this->response->status);
+ $this->assertEquals('contents', stream_get_contents($this->response->body));
+
+ }
+
+ /**
+ * @depends testRange
+ */
+ function testTooHighRange() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'GET',
+ 'HTTP_RANGE' => 'bytes=100-200',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 416 Requested Range Not Satisfiable',$this->response->status);
+
+ }
+
+ /**
+ * @depends testRange
+ */
+ function testCrazyRange() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'GET',
+ 'HTTP_RANGE' => 'bytes=8-4',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 416 Requested Range Not Satisfiable',$this->response->status);
+
+ }
+
+ /**
+ * @depends testRange
+ * @covers \Sabre\DAV\Server::httpGet
+ */
+ function testIfRangeEtag() {
+
+ $node = $this->server->tree->getNodeForPath('test.txt');
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'GET',
+ 'HTTP_RANGE' => 'bytes=2-5',
+ 'HTTP_IF_RANGE' => $node->getETag(),
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/octet-stream',
+ 'Content-Length' => 4,
+ 'Content-Range' => 'bytes 2-5/13',
+ 'Last-Modified' => HTTP\Util::toHTTPDate(new \DateTime('@' . filemtime($this->tempDir . '/test.txt'))),
+ 'ETag' => '"' . md5(file_get_contents(SABRE_TEMPDIR . '/test.txt')) . '"',
+ ),
+ $this->response->headers
+ );
+
+ $this->assertEquals('HTTP/1.1 206 Partial Content',$this->response->status);
+ $this->assertEquals('st c', stream_get_contents($this->response->body));
+
+ }
+
+ /**
+ * @depends testRange
+ * @covers \Sabre\DAV\Server::httpGet
+ */
+ function testIfRangeEtagIncorrect() {
+
+ $node = $this->server->tree->getNodeForPath('test.txt');
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'GET',
+ 'HTTP_RANGE' => 'bytes=2-5',
+ 'HTTP_IF_RANGE' => $node->getETag() . 'blabla',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/octet-stream',
+ 'Content-Length' => 13,
+ 'Last-Modified' => HTTP\Util::toHTTPDate(new \DateTime('@' . filemtime($this->tempDir . '/test.txt'))),
+ 'ETag' => '"' . md5(file_get_contents(SABRE_TEMPDIR . '/test.txt')) . '"',
+ ),
+ $this->response->headers
+ );
+
+ $this->assertEquals('HTTP/1.1 200 OK',$this->response->status);
+ $this->assertEquals('Test contents', stream_get_contents($this->response->body));
+
+ }
+
+ /**
+ * @depends testRange
+ * @covers \Sabre\DAV\Server::httpGet
+ */
+ function testIfRangeModificationDate() {
+
+ $node = $this->server->tree->getNodeForPath('test.txt');
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'GET',
+ 'HTTP_RANGE' => 'bytes=2-5',
+ 'HTTP_IF_RANGE' => 'tomorrow',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/octet-stream',
+ 'Content-Length' => 4,
+ 'Content-Range' => 'bytes 2-5/13',
+ 'Last-Modified' => HTTP\Util::toHTTPDate(new \DateTime('@' . filemtime($this->tempDir . '/test.txt'))),
+ 'ETag' => '"' . md5(file_get_contents(SABRE_TEMPDIR . '/test.txt')) . '"',
+ ),
+ $this->response->headers
+ );
+
+ $this->assertEquals('HTTP/1.1 206 Partial Content',$this->response->status);
+ $this->assertEquals('st c', stream_get_contents($this->response->body));
+
+ }
+
+ /**
+ * @depends testRange
+ * @covers \Sabre\DAV\Server::httpGet
+ */
+ function testIfRangeModificationDateModified() {
+
+ $node = $this->server->tree->getNodeForPath('test.txt');
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'GET',
+ 'HTTP_RANGE' => 'bytes=2-5',
+ 'HTTP_IF_RANGE' => '-2 years',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/octet-stream',
+ 'Content-Length' => 13,
+ 'Last-Modified' => HTTP\Util::toHTTPDate(new \DateTime('@' . filemtime($this->tempDir . '/test.txt'))),
+ 'ETag' => '"' . md5(file_get_contents(SABRE_TEMPDIR . '/test.txt')) . '"',
+ ),
+ $this->response->headers
+ );
+
+ $this->assertEquals('HTTP/1.1 200 OK',$this->response->status);
+ $this->assertEquals('Test contents', stream_get_contents($this->response->body));
+
+ }
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/ServerSimpleTest.php b/vendor/sabre/dav/tests/Sabre/DAV/ServerSimpleTest.php
new file mode 100644
index 000000000..afcd5c98f
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/ServerSimpleTest.php
@@ -0,0 +1,767 @@
+<?php
+
+namespace Sabre\DAV;
+
+use Sabre\HTTP;
+
+require_once 'Sabre/HTTP/ResponseMock.php';
+require_once 'Sabre/DAV/AbstractServer.php';
+require_once 'Sabre/DAV/Exception.php';
+
+class ServerSimpleTest extends AbstractServer{
+
+ function testConstructArray() {
+
+ $nodes = array(
+ new SimpleCollection('hello')
+ );
+
+ $server = new Server($nodes);
+ $this->assertEquals($nodes[0], $server->tree->getNodeForPath('hello'));
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception
+ */
+ function testConstructIncorrectObj() {
+
+ $nodes = array(
+ new SimpleCollection('hello'),
+ new \STDClass(),
+ );
+
+ $server = new Server($nodes);
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception
+ */
+ function testConstructInvalidArg() {
+
+ $server = new Server(1);
+
+ }
+
+ function testGet() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'GET',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/octet-stream',
+ 'Content-Length' => 13,
+ 'Last-Modified' => HTTP\Util::toHTTPDate(new \DateTime('@' . filemtime($this->tempDir . '/test.txt'))),
+ ),
+ $this->response->headers
+ );
+
+ $this->assertEquals('HTTP/1.1 200 OK',$this->response->status);
+ $this->assertEquals('Test contents', stream_get_contents($this->response->body));
+
+ }
+ function testGetHttp10() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'GET',
+ 'SERVER_PROTOCOL' => 'HTTP/1.0',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/octet-stream',
+ 'Content-Length' => 13,
+ 'Last-Modified' => HTTP\Util::toHTTPDate(new \DateTime('@' . filemtime($this->tempDir . '/test.txt'))),
+ ),
+ $this->response->headers
+ );
+
+ $this->assertEquals('HTTP/1.0 200 OK',$this->response->status);
+ $this->assertEquals('Test contents', stream_get_contents($this->response->body));
+
+ }
+
+ function testGetDoesntExist() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt_randomblbla',
+ 'REQUEST_METHOD' => 'GET',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+ $this->assertEquals('HTTP/1.1 404 Not Found',$this->response->status);
+
+ }
+
+ function testGetDoesntExist2() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt/randomblbla',
+ 'REQUEST_METHOD' => 'GET',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+ $this->assertEquals('HTTP/1.1 404 Not Found',$this->response->status);
+
+ }
+
+ /**
+ * This test should have the exact same result as testGet.
+ *
+ * The idea is that double slashes // are converted to single ones /
+ *
+ */
+ function testGetDoubleSlash() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '//test.txt',
+ 'REQUEST_METHOD' => 'GET',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/octet-stream',
+ 'Content-Length' => 13,
+ 'Last-Modified' => HTTP\Util::toHTTPDate(new \DateTime('@' . filemtime($this->tempDir . '/test.txt'))),
+ ),
+ $this->response->headers
+ );
+
+ $this->assertEquals('HTTP/1.1 200 OK',$this->response->status);
+ $this->assertEquals('Test contents', stream_get_contents($this->response->body));
+
+ }
+
+
+ function testHEAD() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'HEAD',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/octet-stream',
+ 'Content-Length' => 13,
+ 'Last-Modified' => HTTP\Util::toHTTPDate(new \DateTime('@' . filemtime($this->tempDir . '/test.txt'))),
+ ),
+ $this->response->headers
+ );
+
+ $this->assertEquals('HTTP/1.1 200 OK',$this->response->status);
+ $this->assertEquals('', $this->response->body);
+
+ }
+
+ function testPut() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/testput.txt',
+ 'REQUEST_METHOD' => 'PUT',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('Testing new file');
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals('', $this->response->body);
+ $this->assertEquals('HTTP/1.1 201 Created',$this->response->status);
+ $this->assertEquals(array(
+ "Content-Length" => "0",
+ ), $this->response->headers);
+
+ $this->assertEquals('Testing new file',file_get_contents($this->tempDir . '/testput.txt'));
+
+ }
+
+ function testPutAlreadyExists() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'PUT',
+ 'HTTP_IF_NONE_MATCH' => '*',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('Testing new file');
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml; charset=utf-8',
+ ),$this->response->headers);
+
+ $this->assertEquals('HTTP/1.1 412 Precondition failed',$this->response->status);
+ $this->assertNotEquals('Testing new file',file_get_contents($this->tempDir . '/test.txt'));
+
+ }
+
+ function testPutUpdate() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'PUT',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('Testing updated file');
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals('0', $this->response->headers['Content-Length']);
+
+ $this->assertEquals('HTTP/1.1 204 No Content',$this->response->status);
+ $this->assertEquals('', $this->response->body);
+ $this->assertEquals('Testing updated file',file_get_contents($this->tempDir . '/test.txt'));
+
+ }
+
+ function testPutNoParentCollection() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt/item.txt',
+ 'REQUEST_METHOD' => 'PUT',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('Testing updated file');
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 409 Conflict',$this->response->status);
+
+ }
+
+ function testPutContentRange() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/testput.txt',
+ 'REQUEST_METHOD' => 'PUT',
+ 'HTTP_CONTENT_RANGE' => 'bytes/100-200',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('Testing new file');
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 501 Not Implemented',$this->response->status);
+
+ }
+
+
+ function testDelete() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'DELETE',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Length' => '0',
+ ),$this->response->headers);
+
+ $this->assertEquals('HTTP/1.1 204 No Content',$this->response->status);
+ $this->assertEquals('', $this->response->body);
+ $this->assertFalse(file_exists($this->tempDir . '/test.txt'));
+
+ }
+
+ function testDeleteDirectory() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/testcol',
+ 'REQUEST_METHOD' => 'DELETE',
+ );
+
+ mkdir($this->tempDir.'/testcol');
+ file_put_contents($this->tempDir.'/testcol/test.txt','Hi! I\'m a file with a short lifespan');
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Length' => '0',
+ ),$this->response->headers);
+ $this->assertEquals('HTTP/1.1 204 No Content',$this->response->status);
+ $this->assertEquals('', $this->response->body);
+ $this->assertFalse(file_exists($this->tempDir . '/col'));
+
+ }
+
+ function testOptions() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/',
+ 'REQUEST_METHOD' => 'OPTIONS',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'DAV' => '1, 3, extended-mkcol',
+ 'MS-Author-Via' => 'DAV',
+ 'Allow' => 'OPTIONS, GET, HEAD, DELETE, PROPFIND, PUT, PROPPATCH, COPY, MOVE, REPORT',
+ 'Accept-Ranges' => 'bytes',
+ 'Content-Length' => '0',
+ 'X-Sabre-Version' => Version::VERSION,
+ ),$this->response->headers);
+
+ $this->assertEquals('HTTP/1.1 200 OK',$this->response->status);
+ $this->assertEquals('', $this->response->body);
+
+
+ }
+ function testNonExistantMethod() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/',
+ 'REQUEST_METHOD' => 'BLABLA',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml; charset=utf-8',
+ ),$this->response->headers);
+
+ $this->assertEquals('HTTP/1.1 501 Not Implemented',$this->response->status);
+
+
+ }
+
+ function testGETOnCollection() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/',
+ 'REQUEST_METHOD' => 'GET',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml; charset=utf-8',
+ ),$this->response->headers);
+
+ $this->assertEquals('HTTP/1.1 501 Not Implemented',$this->response->status);
+
+ }
+
+ function testHEADOnCollection() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/',
+ 'REQUEST_METHOD' => 'HEAD',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 200 OK',$this->response->status);
+
+ }
+
+ function testBaseUri() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/blabla/test.txt',
+ 'REQUEST_METHOD' => 'GET',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->setBaseUri('/blabla/');
+ $this->assertEquals('/blabla/',$this->server->getBaseUri());
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/octet-stream',
+ 'Content-Length' => 13,
+ 'Last-Modified' => HTTP\Util::toHTTPDate(new \DateTime('@' . filemtime($this->tempDir . '/test.txt'))),
+ ),
+ $this->response->headers
+ );
+
+ $this->assertEquals('HTTP/1.1 200 OK',$this->response->status);
+ $this->assertEquals('Test contents', stream_get_contents($this->response->body));
+
+ }
+
+ function testBaseUriAddSlash() {
+
+ $tests = array(
+ '/' => '/',
+ '/foo' => '/foo/',
+ '/foo/' => '/foo/',
+ '/foo/bar' => '/foo/bar/',
+ '/foo/bar/' => '/foo/bar/',
+ );
+
+ foreach($tests as $test=>$result) {
+ $this->server->setBaseUri($test);
+
+ $this->assertEquals($result, $this->server->getBaseUri());
+
+ }
+
+ }
+
+ function testCalculateUri() {
+
+ $uris = array(
+ 'http://www.example.org/root/somepath',
+ '/root/somepath',
+ '/root/somepath/',
+ );
+
+ $this->server->setBaseUri('/root/');
+
+ foreach($uris as $uri) {
+
+ $this->assertEquals('somepath',$this->server->calculateUri($uri));
+
+ }
+
+ $this->server->setBaseUri('/root');
+
+ foreach($uris as $uri) {
+
+ $this->assertEquals('somepath',$this->server->calculateUri($uri));
+
+ }
+
+ $this->assertEquals('', $this->server->calculateUri('/root'));
+
+ }
+
+ function testCalculateUriSpecialChars() {
+
+ $uris = array(
+ 'http://www.example.org/root/%C3%A0fo%C3%B3',
+ '/root/%C3%A0fo%C3%B3',
+ '/root/%C3%A0fo%C3%B3/'
+ );
+
+ $this->server->setBaseUri('/root/');
+
+ foreach($uris as $uri) {
+
+ $this->assertEquals("\xc3\xa0fo\xc3\xb3",$this->server->calculateUri($uri));
+
+ }
+
+ $this->server->setBaseUri('/root');
+
+ foreach($uris as $uri) {
+
+ $this->assertEquals("\xc3\xa0fo\xc3\xb3",$this->server->calculateUri($uri));
+
+ }
+
+ $this->server->setBaseUri('/');
+
+ foreach($uris as $uri) {
+
+ $this->assertEquals("root/\xc3\xa0fo\xc3\xb3",$this->server->calculateUri($uri));
+
+ }
+
+ }
+
+ function testBaseUriCheck() {
+
+ $uris = array(
+ 'http://www.example.org/root/somepath',
+ '/root/somepath',
+ '/root/somepath/'
+ );
+
+ try {
+
+ $this->server->setBaseUri('root/');
+ $this->server->calculateUri('/root/testuri');
+
+ $this->fail('Expected an exception');
+
+ } catch (Exception\Forbidden $e) {
+
+ // This was expected
+
+ }
+
+ }
+
+ /**
+ * @covers \Sabre\DAV\Server::guessBaseUri
+ */
+ function testGuessBaseUri() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/index.php/root',
+ 'PATH_INFO' => '/root',
+ );
+
+ $httpRequest = new HTTP\Request($serverVars);
+ $server = new Server();
+ $server->httpRequest = $httpRequest;
+
+ $this->assertEquals('/index.php/', $server->guessBaseUri());
+
+ }
+
+ /**
+ * @depends testGuessBaseUri
+ * @covers Sabre\DAV\Server::guessBaseUri
+ */
+ function testGuessBaseUriPercentEncoding() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/index.php/dir/path2/path%20with%20spaces',
+ 'PATH_INFO' => '/dir/path2/path with spaces',
+ );
+
+ $httpRequest = new HTTP\Request($serverVars);
+ $server = new Server();
+ $server->httpRequest = $httpRequest;
+
+ $this->assertEquals('/index.php/', $server->guessBaseUri());
+
+ }
+
+ /**
+ * @depends testGuessBaseUri
+ * @covers \Sabre\DAV\Server::guessBaseUri
+ */
+ /*
+ function testGuessBaseUriPercentEncoding2() {
+
+ $this->markTestIncomplete('This behaviour is not yet implemented');
+ $serverVars = array(
+ 'REQUEST_URI' => '/some%20directory+mixed/index.php/dir/path2/path%20with%20spaces',
+ 'PATH_INFO' => '/dir/path2/path with spaces',
+ );
+
+ $httpRequest = new HTTP\Request($serverVars);
+ $server = new Server();
+ $server->httpRequest = $httpRequest;
+
+ $this->assertEquals('/some%20directory+mixed/index.php/', $server->guessBaseUri());
+
+ }*/
+
+ function testGuessBaseUri2() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/index.php/root/',
+ 'PATH_INFO' => '/root/',
+ );
+
+ $httpRequest = new HTTP\Request($serverVars);
+ $server = new Server();
+ $server->httpRequest = $httpRequest;
+
+ $this->assertEquals('/index.php/', $server->guessBaseUri());
+
+ }
+
+ function testGuessBaseUriNoPathInfo() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/index.php/root',
+ );
+
+ $httpRequest = new HTTP\Request($serverVars);
+ $server = new Server();
+ $server->httpRequest = $httpRequest;
+
+ $this->assertEquals('/', $server->guessBaseUri());
+
+ }
+
+ function testGuessBaseUriNoPathInfo2() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/a/b/c/test.php',
+ );
+
+ $httpRequest = new HTTP\Request($serverVars);
+ $server = new Server();
+ $server->httpRequest = $httpRequest;
+
+ $this->assertEquals('/', $server->guessBaseUri());
+
+ }
+
+
+ /**
+ * @covers \Sabre\DAV\Server::guessBaseUri
+ * @depends testGuessBaseUri
+ */
+ function testGuessBaseUriQueryString() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/index.php/root?query_string=blabla',
+ 'PATH_INFO' => '/root',
+ );
+
+ $httpRequest = new HTTP\Request($serverVars);
+ $server = new Server();
+ $server->httpRequest = $httpRequest;
+
+ $this->assertEquals('/index.php/', $server->guessBaseUri());
+
+ }
+
+ /**
+ * @covers \Sabre\DAV\Server::guessBaseUri
+ * @depends testGuessBaseUri
+ * @expectedException \Sabre\DAV\Exception
+ */
+ function testGuessBaseUriBadConfig() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/index.php/root/heyyy',
+ 'PATH_INFO' => '/root',
+ );
+
+ $httpRequest = new HTTP\Request($serverVars);
+ $server = new Server();
+ $server->httpRequest = $httpRequest;
+
+ $server->guessBaseUri();
+
+ }
+
+ function testTriggerException() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/',
+ 'REQUEST_METHOD' => 'FOO',
+ );
+
+ $httpRequest = new HTTP\Request($serverVars);
+ $this->server->httpRequest = $httpRequest;
+ $this->server->subscribeEvent('beforeMethod',array($this,'exceptionTrigger'));
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml; charset=utf-8',
+ ),$this->response->headers);
+
+ $this->assertEquals('HTTP/1.1 500 Internal Server Error',$this->response->status);
+
+ }
+
+ function exceptionTrigger() {
+
+ throw new Exception('Hola');
+
+ }
+
+ function testReportNotFound() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/',
+ 'REQUEST_METHOD' => 'REPORT',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->httpRequest->setBody('<?xml version="1.0"?><bla:myreport xmlns:bla="http://www.rooftopsolutions.nl/NS"></bla:myreport>');
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml; charset=utf-8',
+ ),
+ $this->response->headers
+ );
+
+ $this->assertEquals('HTTP/1.1 403 Forbidden',$this->response->status,'We got an incorrect status back. Full response body follows: ' . $this->response->body);
+
+ }
+
+ function testReportIntercepted() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/',
+ 'REQUEST_METHOD' => 'REPORT',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->httpRequest->setBody('<?xml version="1.0"?><bla:myreport xmlns:bla="http://www.rooftopsolutions.nl/NS"></bla:myreport>');
+ $this->server->subscribeEvent('report',array($this,'reportHandler'));
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'testheader' => 'testvalue',
+ ),
+ $this->response->headers
+ );
+
+ $this->assertEquals('HTTP/1.1 418 I\'m a teapot',$this->response->status,'We got an incorrect status back. Full response body follows: ' . $this->response->body);
+
+ }
+
+ function reportHandler($reportName) {
+
+ if ($reportName=='{http://www.rooftopsolutions.nl/NS}myreport') {
+ $this->server->httpResponse->sendStatus(418);
+ $this->server->httpResponse->setHeader('testheader','testvalue');
+ return false;
+ }
+ else return;
+
+ }
+
+ function testGetPropertiesForChildren() {
+
+ $result = $this->server->getPropertiesForChildren('',array(
+ '{DAV:}getcontentlength',
+ ));
+
+ $expected = array(
+ 'test.txt' => array('{DAV:}getcontentlength' => 13),
+ 'dir/' => array(),
+ );
+
+ $this->assertEquals($expected,$result);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/ServerUpdatePropertiesTest.php b/vendor/sabre/dav/tests/Sabre/DAV/ServerUpdatePropertiesTest.php
new file mode 100644
index 000000000..a73e8d13f
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/ServerUpdatePropertiesTest.php
@@ -0,0 +1,130 @@
+<?php
+
+namespace Sabre\DAV;
+use Sabre\HTTP;
+
+class ServerUpdatePropertiesTest extends \PHPUnit_Framework_TestCase {
+
+ function testUpdatePropertiesFail() {
+
+ $tree = array(
+ new SimpleCollection('foo'),
+ );
+ $server = new Server($tree);
+
+ $result = $server->updateProperties('foo', array(
+ '{DAV:}foo' => 'bar'
+ ));
+
+ $expected = array(
+ 'href' => 'foo',
+ '403' => array(
+ '{DAV:}foo' => null,
+ ),
+ );
+ $this->assertEquals($expected, $result);
+
+ }
+
+ function testUpdatePropertiesProtected() {
+
+ $tree = array(
+ new SimpleCollection('foo'),
+ );
+ $server = new Server($tree);
+
+ $result = $server->updateProperties('foo', array(
+ '{DAV:}getetag' => 'bla',
+ '{DAV:}foo' => 'bar'
+ ));
+
+ $expected = array(
+ 'href' => 'foo',
+ '403' => array(
+ '{DAV:}getetag' => null,
+ ),
+ '424' => array(
+ '{DAV:}foo' => null,
+ ),
+ );
+ $this->assertEquals($expected, $result);
+
+ }
+
+ function testUpdatePropertiesEventFail() {
+
+ $tree = array(
+ new SimpleCollection('foo'),
+ );
+ $server = new Server($tree);
+ $server->subscribeEvent('updateProperties', array($this,'updatepropfail'));
+
+ $result = $server->updateProperties('foo', array(
+ '{DAV:}foo' => 'bar',
+ '{DAV:}foo2' => 'bla',
+ ));
+
+ $expected = array(
+ 'href' => 'foo',
+ '404' => array(
+ '{DAV:}foo' => null,
+ ),
+ '424' => array(
+ '{DAV:}foo2' => null,
+ ),
+ );
+ $this->assertEquals($expected, $result);
+
+ }
+
+ function updatePropFail(&$propertyDelta, &$result, $node) {
+
+ $result[404] = array(
+ '{DAV:}foo' => null,
+ );
+ unset($propertyDelta['{DAV:}foo']);
+ return false;
+
+ }
+
+
+ function testUpdatePropertiesEventSuccess() {
+
+ $tree = array(
+ new SimpleCollection('foo'),
+ );
+ $server = new Server($tree);
+ $server->subscribeEvent('updateProperties', array($this,'updatepropsuccess'));
+
+ $result = $server->updateProperties('foo', array(
+ '{DAV:}foo' => 'bar',
+ '{DAV:}foo2' => 'bla',
+ ));
+
+ $expected = array(
+ 'href' => 'foo',
+ '200' => array(
+ '{DAV:}foo' => null,
+ ),
+ '201' => array(
+ '{DAV:}foo2' => null,
+ ),
+ );
+ $this->assertEquals($expected, $result);
+
+ }
+
+ function updatePropSuccess(&$propertyDelta, &$result, $node) {
+
+ $result[200] = array(
+ '{DAV:}foo' => null,
+ );
+ $result[201] = array(
+ '{DAV:}foo2' => null,
+ );
+ unset($propertyDelta['{DAV:}foo']);
+ unset($propertyDelta['{DAV:}foo2']);
+ return;
+
+ }
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/SimpleFileTest.php b/vendor/sabre/dav/tests/Sabre/DAV/SimpleFileTest.php
new file mode 100644
index 000000000..de8b05734
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/SimpleFileTest.php
@@ -0,0 +1,19 @@
+<?php
+
+namespace Sabre\DAV;
+
+class SimpleFileTest extends \PHPUnit_Framework_TestCase {
+
+ function testAll() {
+
+ $file = new SimpleFile('filename.txt','contents','text/plain');
+
+ $this->assertEquals('filename.txt', $file->getName());
+ $this->assertEquals('contents', $file->get());
+ $this->assertEquals('8', $file->getSize());
+ $this->assertEquals('"' . md5('contents') . '"', $file->getETag());
+ $this->assertEquals('text/plain', $file->getContentType());
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/StringUtilTest.php b/vendor/sabre/dav/tests/Sabre/DAV/StringUtilTest.php
new file mode 100644
index 000000000..941d1f913
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/StringUtilTest.php
@@ -0,0 +1,122 @@
+<?php
+
+namespace Sabre\DAV;
+
+class StringUtilTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * @dataProvider dataset
+ */
+ function testTextMatch($haystack, $needle, $collation, $matchType, $result) {
+
+ $this->assertEquals($result, StringUtil::textMatch($haystack, $needle, $collation, $matchType));
+
+ }
+
+ function dataset() {
+
+ return array(
+ array('FOOBAR', 'FOO', 'i;octet', 'contains', true),
+ array('FOOBAR', 'foo', 'i;octet', 'contains', false),
+ array('FÖÖBAR', 'FÖÖ', 'i;octet', 'contains', true),
+ array('FÖÖBAR', 'föö', 'i;octet', 'contains', false),
+ array('FOOBAR', 'FOOBAR', 'i;octet', 'equals', true),
+ array('FOOBAR', 'fooBAR', 'i;octet', 'equals', false),
+ array('FOOBAR', 'FOO', 'i;octet', 'starts-with', true),
+ array('FOOBAR', 'foo', 'i;octet', 'starts-with', false),
+ array('FOOBAR', 'BAR', 'i;octet', 'starts-with', false),
+ array('FOOBAR', 'bar', 'i;octet', 'starts-with', false),
+ array('FOOBAR', 'FOO', 'i;octet', 'ends-with', false),
+ array('FOOBAR', 'foo', 'i;octet', 'ends-with', false),
+ array('FOOBAR', 'BAR', 'i;octet', 'ends-with', true),
+ array('FOOBAR', 'bar', 'i;octet', 'ends-with', false),
+
+ array('FOOBAR', 'FOO', 'i;ascii-casemap', 'contains', true),
+ array('FOOBAR', 'foo', 'i;ascii-casemap', 'contains', true),
+ array('FÖÖBAR', 'FÖÖ', 'i;ascii-casemap', 'contains', true),
+ array('FÖÖBAR', 'föö', 'i;ascii-casemap', 'contains', false),
+ array('FOOBAR', 'FOOBAR', 'i;ascii-casemap', 'equals', true),
+ array('FOOBAR', 'fooBAR', 'i;ascii-casemap', 'equals', true),
+ array('FOOBAR', 'FOO', 'i;ascii-casemap', 'starts-with', true),
+ array('FOOBAR', 'foo', 'i;ascii-casemap', 'starts-with', true),
+ array('FOOBAR', 'BAR', 'i;ascii-casemap', 'starts-with', false),
+ array('FOOBAR', 'bar', 'i;ascii-casemap', 'starts-with', false),
+ array('FOOBAR', 'FOO', 'i;ascii-casemap', 'ends-with', false),
+ array('FOOBAR', 'foo', 'i;ascii-casemap', 'ends-with', false),
+ array('FOOBAR', 'BAR', 'i;ascii-casemap', 'ends-with', true),
+ array('FOOBAR', 'bar', 'i;ascii-casemap', 'ends-with', true),
+
+ array('FOOBAR', 'FOO', 'i;unicode-casemap', 'contains', true),
+ array('FOOBAR', 'foo', 'i;unicode-casemap', 'contains', true),
+ array('FÖÖBAR', 'FÖÖ', 'i;unicode-casemap', 'contains', true),
+ array('FÖÖBAR', 'föö', 'i;unicode-casemap', 'contains', true),
+ array('FOOBAR', 'FOOBAR', 'i;unicode-casemap', 'equals', true),
+ array('FOOBAR', 'fooBAR', 'i;unicode-casemap', 'equals', true),
+ array('FOOBAR', 'FOO', 'i;unicode-casemap', 'starts-with', true),
+ array('FOOBAR', 'foo', 'i;unicode-casemap', 'starts-with', true),
+ array('FOOBAR', 'BAR', 'i;unicode-casemap', 'starts-with', false),
+ array('FOOBAR', 'bar', 'i;unicode-casemap', 'starts-with', false),
+ array('FOOBAR', 'FOO', 'i;unicode-casemap', 'ends-with', false),
+ array('FOOBAR', 'foo', 'i;unicode-casemap', 'ends-with', false),
+ array('FOOBAR', 'BAR', 'i;unicode-casemap', 'ends-with', true),
+ array('FOOBAR', 'bar', 'i;unicode-casemap', 'ends-with', true),
+ );
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\BadRequest
+ */
+ public function testBadCollation() {
+
+ StringUtil::textMatch('foobar','foo','blabla','contains');
+
+ }
+
+
+ /**
+ * @expectedException Sabre\DAV\Exception\BadRequest
+ */
+ public function testBadMatchType() {
+
+ StringUtil::textMatch('foobar','foo','i;octet','booh');
+
+ }
+
+ public function testEnsureUTF8_ascii() {
+
+ $inputString = "harkema";
+ $outputString = "harkema";
+
+ $this->assertEquals(
+ $outputString,
+ StringUtil::ensureUTF8($inputString)
+ );
+
+ }
+
+ public function testEnsureUTF8_latin1() {
+
+ $inputString = "m\xfcnster";
+ $outputString = "münster";
+
+ $this->assertEquals(
+ $outputString,
+ StringUtil::ensureUTF8($inputString)
+ );
+
+ }
+
+ public function testEnsureUTF8_utf8() {
+
+ $inputString = "m\xc3\xbcnster";
+ $outputString = "münster";
+
+ $this->assertEquals(
+ $outputString,
+ StringUtil::ensureUTF8($inputString)
+ );
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/TemporaryFileFilterTest.php b/vendor/sabre/dav/tests/Sabre/DAV/TemporaryFileFilterTest.php
new file mode 100644
index 000000000..d136eeb17
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/TemporaryFileFilterTest.php
@@ -0,0 +1,252 @@
+<?php
+
+namespace Sabre\DAV;
+
+use Sabre\HTTP;
+
+class TemporaryFileFilterTest extends AbstractServer {
+
+ function setUp() {
+
+ parent::setUp();
+ $plugin = new TemporaryFileFilterPlugin(SABRE_TEMPDIR . '/tff');
+ $this->server->addPlugin($plugin);
+
+ }
+
+ function testPutNormal() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/testput.txt',
+ 'REQUEST_METHOD' => 'PUT',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('Testing new file');
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals('', $this->response->body);
+ $this->assertEquals('HTTP/1.1 201 Created',$this->response->status);
+ $this->assertEquals('0', $this->response->headers['Content-Length']);
+
+ $this->assertEquals('Testing new file',file_get_contents(SABRE_TEMPDIR . '/testput.txt'));
+
+ }
+
+ function testPutTemp() {
+
+ // mimicking an OS/X resource fork
+ $serverVars = array(
+ 'REQUEST_URI' => '/._testput.txt',
+ 'REQUEST_METHOD' => 'PUT',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('Testing new file');
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals('', $this->response->body);
+ $this->assertEquals('HTTP/1.1 201 Created',$this->response->status);
+ $this->assertEquals(array(
+ 'X-Sabre-Temp' => 'true',
+ ),$this->response->headers);
+
+ $this->assertFalse(file_exists(SABRE_TEMPDIR . '/._testput.txt'),'._testput.txt should not exist in the regular file structure.');
+
+ }
+
+ function testPutTempIfNoneMatch() {
+
+ // mimicking an OS/X resource fork
+ $serverVars = array(
+ 'REQUEST_URI' => '/._testput.txt',
+ 'REQUEST_METHOD' => 'PUT',
+ 'HTTP_IF_NONE_MATCH' => '*',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('Testing new file');
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals('', $this->response->body);
+ $this->assertEquals('HTTP/1.1 201 Created',$this->response->status);
+ $this->assertEquals(array(
+ 'X-Sabre-Temp' => 'true',
+ ),$this->response->headers);
+
+ $this->assertFalse(file_exists(SABRE_TEMPDIR . '/._testput.txt'),'._testput.txt should not exist in the regular file structure.');
+
+
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 412 Precondition failed',$this->response->status);
+ $this->assertEquals(array(
+ 'X-Sabre-Temp' => 'true',
+ 'Content-Type' => 'application/xml; charset=utf-8',
+ ),$this->response->headers);
+
+ }
+
+ function testPutGet() {
+
+ // mimicking an OS/X resource fork
+ $serverVars = array(
+ 'REQUEST_URI' => '/._testput.txt',
+ 'REQUEST_METHOD' => 'PUT',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('Testing new file');
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals('', $this->response->body);
+ $this->assertEquals('HTTP/1.1 201 Created',$this->response->status);
+ $this->assertEquals(array(
+ 'X-Sabre-Temp' => 'true',
+ ),$this->response->headers);
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/._testput.txt',
+ 'REQUEST_METHOD' => 'GET',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 200 OK',$this->response->status);
+ $this->assertEquals(array(
+ 'X-Sabre-Temp' => 'true',
+ 'Content-Length' => 16,
+ 'Content-Type' => 'application/octet-stream',
+ ),$this->response->headers);
+
+ $this->assertEquals('Testing new file',stream_get_contents($this->response->body));
+
+ }
+
+ function testLockNonExistant() {
+
+ mkdir(SABRE_TEMPDIR . '/locksdir');
+ $locksBackend = new Locks\Backend\FS(SABRE_TEMPDIR . '/locksdir');
+ $locksPlugin = new Locks\Plugin($locksBackend);
+ $this->server->addPlugin($locksPlugin);
+
+ // mimicking an OS/X resource fork
+ $serverVars = array(
+ 'REQUEST_URI' => '/._testlock.txt',
+ 'REQUEST_METHOD' => 'LOCK',
+ );
+
+ $request = new HTTP\Request($serverVars);
+
+ $request->setBody('<?xml version="1.0"?>
+<D:lockinfo xmlns:D="DAV:">
+ <D:lockscope><D:exclusive/></D:lockscope>
+ <D:locktype><D:write/></D:locktype>
+ <D:owner>
+ <D:href>http://example.org/~ejw/contact.html</D:href>
+ </D:owner>
+</D:lockinfo>');
+
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 201 Created',$this->response->status);
+ $this->assertEquals('application/xml; charset=utf-8',$this->response->headers['Content-Type']);
+ $this->assertTrue(preg_match('/^<opaquelocktoken:(.*)>$/',$this->response->headers['Lock-Token'])===1,'We did not get a valid Locktoken back (' . $this->response->headers['Lock-Token'] . ')');
+ $this->assertEquals('true',$this->response->headers['X-Sabre-Temp']);
+
+ $this->assertFalse(file_exists(SABRE_TEMPDIR . '/._testlock.txt'),'._testlock.txt should not exist in the regular file structure.');
+
+ }
+
+ function testPutDelete() {
+
+ // mimicking an OS/X resource fork
+ $serverVars = array(
+ 'REQUEST_URI' => '/._testput.txt',
+ 'REQUEST_METHOD' => 'PUT',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('Testing new file');
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals('', $this->response->body);
+ $this->assertEquals('HTTP/1.1 201 Created',$this->response->status);
+ $this->assertEquals(array(
+ 'X-Sabre-Temp' => 'true',
+ ),$this->response->headers);
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/._testput.txt',
+ 'REQUEST_METHOD' => 'DELETE',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 204 No Content',$this->response->status, "Incorrect status code received. Full body:\n". $this->response->body);
+ $this->assertEquals(array(
+ 'X-Sabre-Temp' => 'true',
+ ),$this->response->headers);
+
+ $this->assertEquals('',$this->response->body);
+
+ }
+
+ function testPutPropfind() {
+
+ // mimicking an OS/X resource fork
+ $serverVars = array(
+ 'REQUEST_URI' => '/._testput.txt',
+ 'REQUEST_METHOD' => 'PUT',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('Testing new file');
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals('', $this->response->body);
+ $this->assertEquals('HTTP/1.1 201 Created',$this->response->status);
+ $this->assertEquals(array(
+ 'X-Sabre-Temp' => 'true',
+ ),$this->response->headers);
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/._testput.txt',
+ 'REQUEST_METHOD' => 'PROPFIND',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('');
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 207 Multi-Status',$this->response->status,'Incorrect status code returned. Body: ' . $this->response->body);
+ $this->assertEquals(array(
+ 'X-Sabre-Temp' => 'true',
+ 'Content-Type' => 'application/xml; charset=utf-8',
+ ),$this->response->headers);
+
+ $body = preg_replace("/xmlns(:[A-Za-z0-9_])?=(\"|\')DAV:(\"|\')/","xmlns\\1=\"urn:DAV\"",$this->response->body);
+ $xml = simplexml_load_string($body);
+ $xml->registerXPathNamespace('d','urn:DAV');
+
+ list($data) = $xml->xpath('/d:multistatus/d:response/d:href');
+ $this->assertEquals('/._testput.txt',(string)$data,'href element should have been /._testput.txt');
+
+ $data = $xml->xpath('/d:multistatus/d:response/d:propstat/d:prop/d:resourcetype');
+ $this->assertEquals(1,count($data));
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/TestPlugin.php b/vendor/sabre/dav/tests/Sabre/DAV/TestPlugin.php
new file mode 100644
index 000000000..9cf5edbb0
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/TestPlugin.php
@@ -0,0 +1,34 @@
+<?php
+
+namespace Sabre\DAV;
+
+class TestPlugin extends ServerPlugin {
+
+ public $beforeMethod;
+
+ function getFeatures() {
+
+ return array('drinking');
+
+ }
+
+ function getHTTPMethods($uri) {
+
+ return array('BEER','WINE');
+
+ }
+
+ function initialize(Server $server) {
+
+ $server->subscribeEvent('beforeMethod',array($this,'beforeMethod'));
+
+ }
+
+ function beforeMethod($method) {
+
+ $this->beforeMethod = $method;
+ return true;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/Tree/FilesystemTest.php b/vendor/sabre/dav/tests/Sabre/DAV/Tree/FilesystemTest.php
new file mode 100644
index 000000000..19b08460f
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/Tree/FilesystemTest.php
@@ -0,0 +1,88 @@
+<?php
+
+namespace Sabre\DAV\Tree;
+
+use Sabre\DAV;
+
+/**
+ * @covers Sabre\DAV\Tree
+ * @covers Sabre\DAV\Tree\Filesystem
+ * @covers Sabre\DAV\FS\Node
+ * @covers Sabre\DAV\FS\File
+ * @covers Sabre\DAV\FS\Directory
+ */
+class FilesystemTest extends \PHPUnit_Framework_TestCase {
+
+ function setUp() {
+
+ \Sabre\TestUtil::clearTempDir();
+ file_put_contents(SABRE_TEMPDIR. '/file.txt','Body');
+ mkdir(SABRE_TEMPDIR.'/dir');
+ file_put_contents(SABRE_TEMPDIR.'/dir/subfile.txt','Body');
+
+ }
+
+ function tearDown() {
+
+ \Sabre\TestUtil::clearTempDir();
+
+ }
+
+ function testGetNodeForPath_File() {
+
+ $fs = new Filesystem(SABRE_TEMPDIR);
+ $node = $fs->getNodeForPath('file.txt');
+ $this->assertTrue($node instanceof DAV\FS\File);
+
+ }
+
+ /**
+ * @expectedException \Sabre\DAV\Exception\NotFound
+ */
+ function testGetNodeForPath_DoesntExist() {
+
+ $fs = new Filesystem(SABRE_TEMPDIR);
+ $node = $fs->getNodeForPath('whoop/file.txt');
+
+ }
+
+ function testGetNodeForPath_Directory() {
+
+ $fs = new Filesystem(SABRE_TEMPDIR);
+ $node = $fs->getNodeForPath('dir');
+ $this->assertTrue($node instanceof DAV\FS\Directory);
+ $this->assertEquals('dir', $node->getName());
+ $this->assertInternalType('array', $node->getChildren());
+
+ }
+
+ function testCopy() {
+
+ $fs = new Filesystem(SABRE_TEMPDIR);
+ $fs->copy('file.txt','file2.txt');
+ $this->assertTrue(file_exists(SABRE_TEMPDIR . '/file2.txt'));
+ $this->assertEquals('Body',file_get_contents(SABRE_TEMPDIR . '/file2.txt'));
+
+ }
+
+ function testCopyDir() {
+
+ $fs = new Filesystem(SABRE_TEMPDIR);
+ $fs->copy('dir','dir2');
+ $this->assertTrue(file_exists(SABRE_TEMPDIR . '/dir2'));
+ $this->assertEquals('Body',file_get_contents(SABRE_TEMPDIR . '/dir2/subfile.txt'));
+
+ }
+
+ function testMove() {
+
+ $fs = new Filesystem(SABRE_TEMPDIR);
+ $fs->move('file.txt','file2.txt');
+ $this->assertTrue(file_exists(SABRE_TEMPDIR . '/file2.txt'));
+ $this->assertTrue(!file_exists(SABRE_TEMPDIR . '/file.txt'));
+ $this->assertEquals('Body',file_get_contents(SABRE_TEMPDIR . '/file2.txt'));
+
+ }
+
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/TreeTest.php b/vendor/sabre/dav/tests/Sabre/DAV/TreeTest.php
new file mode 100644
index 000000000..90df6427e
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/TreeTest.php
@@ -0,0 +1,175 @@
+<?php
+
+namespace Sabre\DAV;
+
+/**
+ * @covers \Sabre\DAV\Tree
+ */
+class TreeTest extends \PHPUnit_Framework_TestCase {
+
+ function testNodeExists() {
+
+ $tree = new TreeMock();
+
+ $this->assertTrue($tree->nodeExists('hi'));
+ $this->assertFalse($tree->nodeExists('hello'));
+
+ }
+
+ function testCopy() {
+
+ $tree = new TreeMock();
+ $tree->copy('hi','hi2');
+
+ $this->assertArrayHasKey('hi2', $tree->getNodeForPath('')->newDirectories);
+ $this->assertEquals('foobar', $tree->getNodeForPath('hi/file')->get());
+ $this->assertEquals(array('test1'=>'value'), $tree->getNodeForPath('hi/file')->getProperties(array()));
+
+ }
+
+ function testMove() {
+
+ $tree = new TreeMock();
+ $tree->move('hi','hi2');
+
+ $this->assertEquals('hi2', $tree->getNodeForPath('hi')->getName());
+ $this->assertTrue($tree->getNodeForPath('hi')->isRenamed);
+
+ }
+
+ function testDeepMove() {
+
+ $tree = new TreeMock();
+ $tree->move('hi/sub','hi2');
+
+ $this->assertArrayHasKey('hi2', $tree->getNodeForPath('')->newDirectories);
+ $this->assertTrue($tree->getNodeForPath('hi/sub')->isDeleted);
+
+ }
+
+ function testDelete() {
+
+ $tree = new TreeMock();
+ $tree->delete('hi');
+ $this->assertTrue($tree->getNodeForPath('hi')->isDeleted);
+
+ }
+
+ function testGetChildren() {
+
+ $tree = new TreeMock();
+ $children = $tree->getChildren('');
+ $this->assertEquals(1,count($children));
+ $this->assertEquals('hi', $children[0]->getName());
+
+ }
+
+}
+
+class TreeMock extends Tree {
+
+ private $nodes = array();
+
+ function __construct() {
+
+ $this->nodes['hi/sub'] = new TreeDirectoryTester('sub');
+ $this->nodes['hi/file'] = new TreeFileTester('file');
+ $this->nodes['hi/file']->properties = array('test1' => 'value');
+ $this->nodes['hi/file']->data = 'foobar';
+ $this->nodes['hi'] = new TreeDirectoryTester('hi',array($this->nodes['hi/sub'], $this->nodes['hi/file']));
+ $this->nodes[''] = new TreeDirectoryTester('hi', array($this->nodes['hi']));
+
+ }
+
+ function getNodeForPath($path) {
+
+ if (isset($this->nodes[$path])) return $this->nodes[$path];
+ throw new Exception\NotFound('item not found');
+
+ }
+
+}
+
+class TreeDirectoryTester extends SimpleCollection {
+
+ public $newDirectories = array();
+ public $newFiles = array();
+ public $isDeleted = false;
+ public $isRenamed = false;
+
+ function createDirectory($name) {
+
+ $this->newDirectories[$name] = true;
+
+ }
+
+ function createFile($name,$data = null) {
+
+ $this->newFiles[$name] = $data;
+
+ }
+
+ function getChild($name) {
+
+ if (isset($this->newDirectories[$name])) return new TreeDirectoryTester($name);
+ if (isset($this->newFiles[$name])) return new TreeFileTester($name, $this->newFiles[$name]);
+ return parent::getChild($name);
+
+ }
+
+ function delete() {
+
+ $this->isDeleted = true;
+
+ }
+
+ function setName($name) {
+
+ $this->isRenamed = true;
+ $this->name = $name;
+
+ }
+
+}
+
+class TreeFileTester extends File implements IProperties {
+
+ public $name;
+ public $data;
+ public $properties;
+
+ function __construct($name, $data = null) {
+
+ $this->name = $name;
+ if (is_null($data)) $data = 'bla';
+ $this->data = $data;
+
+ }
+
+ function getName() {
+
+ return $this->name;
+
+ }
+
+ function get() {
+
+ return $this->data;
+
+ }
+
+ function getProperties($properties) {
+
+ return $this->properties;
+
+ }
+
+ function updateProperties($properties) {
+
+ $this->properties = $properties;
+ return true;
+
+ }
+
+}
+
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/URLUtilTest.php b/vendor/sabre/dav/tests/Sabre/DAV/URLUtilTest.php
new file mode 100644
index 000000000..f17ca4b85
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/URLUtilTest.php
@@ -0,0 +1,131 @@
+<?php
+
+namespace Sabre\DAV;
+
+class URLUtilTest extends \PHPUnit_Framework_TestCase{
+
+ function testEncodePath() {
+
+ $str = '';
+ for($i=0;$i<128;$i++) $str.=chr($i);
+
+ $newStr = URLUtil::encodePath($str);
+
+ $this->assertEquals(
+ '%00%01%02%03%04%05%06%07%08%09%0a%0b%0c%0d%0e%0f'.
+ '%10%11%12%13%14%15%16%17%18%19%1a%1b%1c%1d%1e%1f'.
+ '%20%21%22%23%24%25%26%27()%2a%2b%2c-./'.
+ '0123456789%3a%3b%3c%3d%3e%3f'.
+ '%40ABCDEFGHIJKLMNO' .
+ 'PQRSTUVWXYZ%5b%5c%5d%5e_' .
+ '%60abcdefghijklmno' .
+ 'pqrstuvwxyz%7b%7c%7d~%7f',
+ $newStr);
+
+ $this->assertEquals($str,URLUtil::decodePath($newStr));
+
+ }
+
+ function testEncodePathSegment() {
+
+ $str = '';
+ for($i=0;$i<128;$i++) $str.=chr($i);
+
+ $newStr = URLUtil::encodePathSegment($str);
+
+ // Note: almost exactly the same as the last test, with the
+ // exception of the encoding of / (ascii code 2f)
+ $this->assertEquals(
+ '%00%01%02%03%04%05%06%07%08%09%0a%0b%0c%0d%0e%0f'.
+ '%10%11%12%13%14%15%16%17%18%19%1a%1b%1c%1d%1e%1f'.
+ '%20%21%22%23%24%25%26%27()%2a%2b%2c-.%2f'.
+ '0123456789%3a%3b%3c%3d%3e%3f'.
+ '%40ABCDEFGHIJKLMNO' .
+ 'PQRSTUVWXYZ%5b%5c%5d%5e_' .
+ '%60abcdefghijklmno' .
+ 'pqrstuvwxyz%7b%7c%7d~%7f',
+ $newStr);
+
+ $this->assertEquals($str,URLUtil::decodePathSegment($newStr));
+
+ }
+
+ function testDecode() {
+
+ $str = 'Hello%20Test+Test2.txt';
+ $newStr = URLUtil::decodePath($str);
+ $this->assertEquals('Hello Test+Test2.txt',$newStr);
+
+ }
+
+ /**
+ * @depends testDecode
+ */
+ function testDecodeUmlaut() {
+
+ $str = 'Hello%C3%BC.txt';
+ $newStr = URLUtil::decodePath($str);
+ $this->assertEquals("Hello\xC3\xBC.txt",$newStr);
+
+ }
+
+ /**
+ * @depends testDecodeUmlaut
+ */
+ function testDecodeUmlautLatin1() {
+
+ $str = 'Hello%FC.txt';
+ $newStr = URLUtil::decodePath($str);
+ $this->assertEquals("Hello\xC3\xBC.txt",$newStr);
+
+ }
+
+ /**
+ * This testcase was sent by a bug reporter
+ *
+ * @depends testDecode
+ */
+ function testDecodeAccentsWindows7() {
+
+ $str = '/webdav/%C3%A0fo%C3%B3';
+ $newStr = URLUtil::decodePath($str);
+ $this->assertEquals(strtolower($str),URLUtil::encodePath($newStr));
+
+ }
+
+ function testSplitPath() {
+
+ $strings = array(
+
+ // input // expected result
+ '/foo/bar' => array('/foo','bar'),
+ '/foo/bar/' => array('/foo','bar'),
+ 'foo/bar/' => array('foo','bar'),
+ 'foo/bar' => array('foo','bar'),
+ 'foo/bar/baz' => array('foo/bar','baz'),
+ 'foo/bar/baz/' => array('foo/bar','baz'),
+ 'foo' => array('','foo'),
+ 'foo/' => array('','foo'),
+ '/foo/' => array('','foo'),
+ '/foo' => array('','foo'),
+ '' => array(null,null),
+
+ // UTF-8
+ "/\xC3\xA0fo\xC3\xB3/bar" => array("/\xC3\xA0fo\xC3\xB3",'bar'),
+ "/\xC3\xA0foo/b\xC3\xBCr/" => array("/\xC3\xA0foo","b\xC3\xBCr"),
+ "foo/\xC3\xA0\xC3\xBCr" => array("foo","\xC3\xA0\xC3\xBCr"),
+
+ );
+
+ foreach($strings as $input => $expected) {
+
+ $output = URLUtil::splitPath($input);
+ $this->assertEquals($expected, $output, 'The expected output for \'' . $input . '\' was incorrect');
+
+
+ }
+
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/UUIDUtilTest.php b/vendor/sabre/dav/tests/Sabre/DAV/UUIDUtilTest.php
new file mode 100644
index 000000000..f005ecc75
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/UUIDUtilTest.php
@@ -0,0 +1,25 @@
+<?php
+
+namespace Sabre\DAV;
+
+class UUIDUtilTest extends \PHPUnit_Framework_TestCase {
+
+ function testValidateUUID() {
+
+ $this->assertTrue(
+ UUIDUtil::validateUUID('11111111-2222-3333-4444-555555555555')
+ );
+ $this->assertFalse(
+ UUIDUtil::validateUUID(' 11111111-2222-3333-4444-555555555555')
+ );
+ $this->assertTrue(
+ UUIDUtil::validateUUID('ffffffff-2222-3333-4444-555555555555')
+ );
+ $this->assertFalse(
+ UUIDUtil::validateUUID('fffffffg-2222-3333-4444-555555555555')
+ );
+
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/XMLUtilTest.php b/vendor/sabre/dav/tests/Sabre/DAV/XMLUtilTest.php
new file mode 100644
index 000000000..1d2bfd133
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/XMLUtilTest.php
@@ -0,0 +1,284 @@
+<?php
+
+namespace Sabre\DAV;
+
+class XMLUtilTest extends \PHPUnit_Framework_TestCase {
+
+ function testToClarkNotation() {
+
+ $dom = new \DOMDocument();
+ $dom->loadXML('<?xml version="1.0"?><test1 xmlns="http://www.example.org/">Testdoc</test1>');
+
+ $this->assertEquals(
+ '{http://www.example.org/}test1',
+ XMLUtil::toClarkNotation($dom->firstChild)
+ );
+
+ }
+
+ function testToClarkNotation2() {
+
+ $dom = new \DOMDocument();
+ $dom->loadXML('<?xml version="1.0"?><s:test1 xmlns:s="http://www.example.org/">Testdoc</s:test1>');
+
+ $this->assertEquals(
+ '{http://www.example.org/}test1',
+ XMLUtil::toClarkNotation($dom->firstChild)
+ );
+
+ }
+
+ function testToClarkNotationDAVNamespace() {
+
+ $dom = new \DOMDocument();
+ $dom->loadXML('<?xml version="1.0"?><s:test1 xmlns:s="urn:DAV">Testdoc</s:test1>');
+
+ $this->assertEquals(
+ '{DAV:}test1',
+ XMLUtil::toClarkNotation($dom->firstChild)
+ );
+
+ }
+
+ function testToClarkNotationNoElem() {
+
+ $dom = new \DOMDocument();
+ $dom->loadXML('<?xml version="1.0"?><s:test1 xmlns:s="urn:DAV">Testdoc</s:test1>');
+
+ $this->assertNull(
+ XMLUtil::toClarkNotation($dom->firstChild->firstChild)
+ );
+
+ }
+
+ function testConvertDAVNamespace() {
+
+ $xml='<?xml version="1.0"?><document xmlns="DAV:">blablabla</document>';
+ $this->assertEquals(
+ '<?xml version="1.0"?><document xmlns="urn:DAV">blablabla</document>',
+ XMLUtil::convertDAVNamespace($xml)
+ );
+
+ }
+
+ function testConvertDAVNamespace2() {
+
+ $xml='<?xml version="1.0"?><s:document xmlns:s="DAV:">blablabla</s:document>';
+ $this->assertEquals(
+ '<?xml version="1.0"?><s:document xmlns:s="urn:DAV">blablabla</s:document>',
+ XMLUtil::convertDAVNamespace($xml)
+ );
+
+ }
+
+ function testConvertDAVNamespace3() {
+
+ $xml='<?xml version="1.0"?><s:document xmlns="http://bla" xmlns:s="DAV:" xmlns:z="http://othernamespace">blablabla</s:document>';
+ $this->assertEquals(
+ '<?xml version="1.0"?><s:document xmlns="http://bla" xmlns:s="urn:DAV" xmlns:z="http://othernamespace">blablabla</s:document>',
+ XMLUtil::convertDAVNamespace($xml)
+ );
+
+ }
+
+ function testConvertDAVNamespace4() {
+
+ $xml='<?xml version="1.0"?><document xmlns=\'DAV:\'>blablabla</document>';
+ $this->assertEquals(
+ '<?xml version="1.0"?><document xmlns=\'urn:DAV\'>blablabla</document>',
+ XMLUtil::convertDAVNamespace($xml)
+ );
+
+ }
+
+ function testConvertDAVNamespaceMixedQuotes() {
+
+ $xml='<?xml version="1.0"?><document xmlns=\'DAV:" xmlns="Another attribute\'>blablabla</document>';
+ $this->assertEquals(
+ $xml,
+ XMLUtil::convertDAVNamespace($xml)
+ );
+
+ }
+
+ /**
+ * @depends testConvertDAVNamespace
+ */
+ function testLoadDOMDocument() {
+
+ $xml='<?xml version="1.0"?><document></document>';
+ $dom = XMLUtil::loadDOMDocument($xml);
+ $this->assertTrue($dom instanceof \DOMDocument);
+
+ }
+
+ /**
+ * @depends testLoadDOMDocument
+ * @expectedException Sabre\DAV\Exception\BadRequest
+ */
+ function testLoadDOMDocumentEmpty() {
+
+ XMLUtil::loadDOMDocument('');
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\BadRequest
+ * @depends testConvertDAVNamespace
+ */
+ function testLoadDOMDocumentInvalid() {
+
+ $xml='<?xml version="1.0"?><document></docu';
+ $dom = XMLUtil::loadDOMDocument($xml);
+
+ }
+
+ /**
+ * @depends testLoadDOMDocument
+ */
+ function testLoadDOMDocumentUTF16() {
+
+ $xml='<?xml version="1.0" encoding="UTF-16"?><root xmlns="DAV:">blabla</root>';
+ $xml = iconv('UTF-8','UTF-16LE',$xml);
+ $dom = XMLUtil::loadDOMDocument($xml);
+ $this->assertEquals('blabla',$dom->firstChild->nodeValue);
+
+ }
+
+
+ function testParseProperties() {
+
+ $xml='<?xml version="1.0"?>
+<root xmlns="DAV:">
+ <prop>
+ <displayname>Calendars</displayname>
+ </prop>
+</root>';
+
+ $dom = XMLUtil::loadDOMDocument($xml);
+ $properties = XMLUtil::parseProperties($dom->firstChild);
+
+ $this->assertEquals(array(
+ '{DAV:}displayname' => 'Calendars',
+ ), $properties);
+
+
+
+ }
+
+ /**
+ * @depends testParseProperties
+ */
+ function testParsePropertiesEmpty() {
+
+ $xml='<?xml version="1.0"?>
+<root xmlns="DAV:" xmlns:s="http://www.rooftopsolutions.nl/example">
+ <prop>
+ <displayname>Calendars</displayname>
+ </prop>
+ <prop>
+ <s:example />
+ </prop>
+</root>';
+
+ $dom = XMLUtil::loadDOMDocument($xml);
+ $properties = XMLUtil::parseProperties($dom->firstChild);
+
+ $this->assertEquals(array(
+ '{DAV:}displayname' => 'Calendars',
+ '{http://www.rooftopsolutions.nl/example}example' => null
+ ), $properties);
+
+ }
+
+
+ /**
+ * @depends testParseProperties
+ */
+ function testParsePropertiesComplex() {
+
+ $xml='<?xml version="1.0"?>
+<root xmlns="DAV:">
+ <prop>
+ <displayname>Calendars</displayname>
+ </prop>
+ <prop>
+ <someprop>Complex value <b>right here</b></someprop>
+ </prop>
+</root>';
+
+ $dom = XMLUtil::loadDOMDocument($xml);
+ $properties = XMLUtil::parseProperties($dom->firstChild);
+
+ $this->assertEquals(array(
+ '{DAV:}displayname' => 'Calendars',
+ '{DAV:}someprop' => 'Complex value right here',
+ ), $properties);
+
+ }
+
+
+ /**
+ * @depends testParseProperties
+ */
+ function testParsePropertiesNoProperties() {
+
+ $xml='<?xml version="1.0"?>
+<root xmlns="DAV:">
+ <prop>
+ </prop>
+</root>';
+
+ $dom = XMLUtil::loadDOMDocument($xml);
+ $properties = XMLUtil::parseProperties($dom->firstChild);
+
+ $this->assertEquals(array(), $properties);
+
+ }
+
+ function testParsePropertiesMapHref() {
+
+ $xml='<?xml version="1.0"?>
+<root xmlns="DAV:">
+ <prop>
+ <displayname>Calendars</displayname>
+ </prop>
+ <prop>
+ <someprop><href>http://sabredav.org/</href></someprop>
+ </prop>
+</root>';
+
+ $dom = XMLUtil::loadDOMDocument($xml);
+ $properties = XMLUtil::parseProperties($dom->firstChild,array('{DAV:}someprop'=>'Sabre\\DAV\\Property\\Href'));
+
+ $this->assertEquals(array(
+ '{DAV:}displayname' => 'Calendars',
+ '{DAV:}someprop' => new Property\Href('http://sabredav.org/',false),
+ ), $properties);
+
+ }
+
+ function testParseClarkNotation() {
+
+ $this->assertEquals(array(
+ 'DAV:',
+ 'foo',
+ ), XMLUtil::parseClarkNotation('{DAV:}foo'));
+
+ $this->assertEquals(array(
+ 'http://example.org/ns/bla',
+ 'bar-soap',
+ ), XMLUtil::parseClarkNotation('{http://example.org/ns/bla}bar-soap'));
+ }
+
+ /**
+ * @expectedException InvalidArgumentException
+ */
+ function testParseClarkNotationFail() {
+
+ XMLUtil::parseClarkNotation('}foo');
+
+ }
+
+}
+
diff --git a/vendor/sabre/dav/tests/Sabre/DAVACL/ACLMethodTest.php b/vendor/sabre/dav/tests/Sabre/DAVACL/ACLMethodTest.php
new file mode 100644
index 000000000..9960180a3
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAVACL/ACLMethodTest.php
@@ -0,0 +1,331 @@
+<?php
+
+namespace Sabre\DAVACL;
+
+use Sabre\DAV;
+use Sabre\HTTP;
+
+class ACLMethodTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * @expectedException Sabre\DAV\Exception\BadRequest
+ */
+ function testCallback() {
+
+ $acl = new Plugin();
+ $server = new DAV\Server();
+ $server->addPlugin($acl);
+
+ $acl->unknownMethod('ACL','test');
+
+ }
+
+ function testCallbackPassthru() {
+
+ $acl = new Plugin();
+ $server = new DAV\Server();
+ $server->addPlugin($acl);
+
+ $this->assertNull($acl->unknownMethod('FOO','test'));
+
+ }
+
+ /**
+
+ /**
+ * @expectedException Sabre\DAV\Exception\MethodNotAllowed
+ */
+ function testNotSupportedByNode() {
+
+ $tree = array(
+ new DAV\SimpleCollection('test'),
+ );
+ $acl = new Plugin();
+ $server = new DAV\Server($tree);
+ $server->httpRequest = new HTTP\Request();
+ $body = '<?xml version="1.0"?>
+<d:acl xmlns:d="DAV:">
+</d:acl>';
+ $server->httpRequest->setBody($body);
+ $server->addPlugin($acl);
+
+ $acl->httpACL('test');
+
+ }
+
+ function testSuccessSimple() {
+
+ $tree = array(
+ new MockACLNode('test',array()),
+ );
+ $acl = new Plugin();
+ $server = new DAV\Server($tree);
+ $server->httpRequest = new HTTP\Request();
+ $body = '<?xml version="1.0"?>
+<d:acl xmlns:d="DAV:">
+</d:acl>';
+ $server->httpRequest->setBody($body);
+ $server->addPlugin($acl);
+
+ $this->assertNull($acl->httpACL('test'));
+
+ }
+
+ /**
+ * @expectedException Sabre\DAVACL\Exception\NotRecognizedPrincipal
+ */
+ function testUnrecognizedPrincipal() {
+
+ $tree = array(
+ new MockACLNode('test',array()),
+ );
+ $acl = new Plugin();
+ $server = new DAV\Server($tree);
+ $server->httpRequest = new HTTP\Request();
+ $body = '<?xml version="1.0"?>
+<d:acl xmlns:d="DAV:">
+ <d:ace>
+ <d:grant><d:privilege><d:read /></d:privilege></d:grant>
+ <d:principal><d:href>/principals/notfound</d:href></d:principal>
+ </d:ace>
+</d:acl>';
+ $server->httpRequest->setBody($body);
+ $server->addPlugin($acl);
+
+ $acl->httpACL('test');
+
+ }
+
+ /**
+ * @expectedException Sabre\DAVACL\Exception\NotRecognizedPrincipal
+ */
+ function testUnrecognizedPrincipal2() {
+
+ $tree = array(
+ new MockACLNode('test',array()),
+ new DAV\SimpleCollection('principals',array(
+ new DAV\SimpleCollection('notaprincipal'),
+ )),
+ );
+ $acl = new Plugin();
+ $server = new DAV\Server($tree);
+ $server->httpRequest = new HTTP\Request();
+ $body = '<?xml version="1.0"?>
+<d:acl xmlns:d="DAV:">
+ <d:ace>
+ <d:grant><d:privilege><d:read /></d:privilege></d:grant>
+ <d:principal><d:href>/principals/notaprincipal</d:href></d:principal>
+ </d:ace>
+</d:acl>';
+ $server->httpRequest->setBody($body);
+ $server->addPlugin($acl);
+
+ $acl->httpACL('test');
+
+ }
+
+ /**
+ * @expectedException Sabre\DAVACL\Exception\NotSupportedPrivilege
+ */
+ function testUnknownPrivilege() {
+
+ $tree = array(
+ new MockACLNode('test',array()),
+ );
+ $acl = new Plugin();
+ $server = new DAV\Server($tree);
+ $server->httpRequest = new HTTP\Request();
+ $body = '<?xml version="1.0"?>
+<d:acl xmlns:d="DAV:">
+ <d:ace>
+ <d:grant><d:privilege><d:bananas /></d:privilege></d:grant>
+ <d:principal><d:href>/principals/notfound</d:href></d:principal>
+ </d:ace>
+</d:acl>';
+ $server->httpRequest->setBody($body);
+ $server->addPlugin($acl);
+
+ $acl->httpACL('test');
+
+ }
+
+ /**
+ * @expectedException Sabre\DAVACL\Exception\NoAbstract
+ */
+ function testAbstractPrivilege() {
+
+ $tree = array(
+ new MockACLNode('test',array()),
+ );
+ $acl = new Plugin();
+ $server = new DAV\Server($tree);
+ $server->httpRequest = new HTTP\Request();
+ $body = '<?xml version="1.0"?>
+<d:acl xmlns:d="DAV:">
+ <d:ace>
+ <d:grant><d:privilege><d:read-acl /></d:privilege></d:grant>
+ <d:principal><d:href>/principals/notfound</d:href></d:principal>
+ </d:ace>
+</d:acl>';
+ $server->httpRequest->setBody($body);
+ $server->addPlugin($acl);
+
+ $acl->httpACL('test');
+
+ }
+
+ /**
+ * @expectedException Sabre\DAVACL\Exception\AceConflict
+ */
+ function testUpdateProtectedPrivilege() {
+
+ $oldACL = array(
+ array(
+ 'principal' => 'principals/notfound',
+ 'privilege' => '{DAV:}write',
+ 'protected' => true,
+ ),
+ );
+
+ $tree = array(
+ new MockACLNode('test',$oldACL),
+ );
+ $acl = new Plugin();
+ $server = new DAV\Server($tree);
+ $server->httpRequest = new HTTP\Request();
+ $body = '<?xml version="1.0"?>
+<d:acl xmlns:d="DAV:">
+ <d:ace>
+ <d:grant><d:privilege><d:read /></d:privilege></d:grant>
+ <d:principal><d:href>/principals/notfound</d:href></d:principal>
+ </d:ace>
+</d:acl>';
+ $server->httpRequest->setBody($body);
+ $server->addPlugin($acl);
+
+ $acl->httpACL('test');
+
+ }
+
+ /**
+ * @expectedException Sabre\DAVACL\Exception\AceConflict
+ */
+ function testUpdateProtectedPrivilege2() {
+
+ $oldACL = array(
+ array(
+ 'principal' => 'principals/notfound',
+ 'privilege' => '{DAV:}write',
+ 'protected' => true,
+ ),
+ );
+
+ $tree = array(
+ new MockACLNode('test',$oldACL),
+ );
+ $acl = new Plugin();
+ $server = new DAV\Server($tree);
+ $server->httpRequest = new HTTP\Request();
+ $body = '<?xml version="1.0"?>
+<d:acl xmlns:d="DAV:">
+ <d:ace>
+ <d:grant><d:privilege><d:write /></d:privilege></d:grant>
+ <d:principal><d:href>/principals/foo</d:href></d:principal>
+ </d:ace>
+</d:acl>';
+ $server->httpRequest->setBody($body);
+ $server->addPlugin($acl);
+
+ $acl->httpACL('test');
+
+ }
+
+ /**
+ * @expectedException Sabre\DAVACL\Exception\AceConflict
+ */
+ function testUpdateProtectedPrivilege3() {
+
+ $oldACL = array(
+ array(
+ 'principal' => 'principals/notfound',
+ 'privilege' => '{DAV:}write',
+ 'protected' => true,
+ ),
+ );
+
+ $tree = array(
+ new MockACLNode('test',$oldACL),
+ );
+ $acl = new Plugin();
+ $server = new DAV\Server($tree);
+ $server->httpRequest = new HTTP\Request();
+ $body = '<?xml version="1.0"?>
+<d:acl xmlns:d="DAV:">
+ <d:ace>
+ <d:grant><d:privilege><d:write /></d:privilege></d:grant>
+ <d:principal><d:href>/principals/notfound</d:href></d:principal>
+ </d:ace>
+</d:acl>';
+ $server->httpRequest->setBody($body);
+ $server->addPlugin($acl);
+
+ $acl->httpACL('test');
+
+ }
+
+ function testSuccessComplex () {
+
+ $oldACL = array(
+ array(
+ 'principal' => 'principals/foo',
+ 'privilege' => '{DAV:}write',
+ 'protected' => true,
+ ),
+ array(
+ 'principal' => 'principals/bar',
+ 'privilege' => '{DAV:}read',
+ ),
+ );
+
+ $tree = array(
+ $node = new MockACLNode('test',$oldACL),
+ new DAV\SimpleCollection('principals', array(
+ new MockPrincipal('foo','principals/foo'),
+ new MockPrincipal('baz','principals/baz'),
+ )),
+ );
+ $acl = new Plugin();
+ $server = new DAV\Server($tree);
+ $server->httpRequest = new HTTP\Request();
+ $body = '<?xml version="1.0"?>
+<d:acl xmlns:d="DAV:">
+ <d:ace>
+ <d:grant><d:privilege><d:write /></d:privilege></d:grant>
+ <d:principal><d:href>/principals/foo</d:href></d:principal>
+ <d:protected />
+ </d:ace>
+ <d:ace>
+ <d:grant><d:privilege><d:write /></d:privilege></d:grant>
+ <d:principal><d:href>/principals/baz</d:href></d:principal>
+ </d:ace>
+</d:acl>';
+ $server->httpRequest->setBody($body);
+ $server->addPlugin($acl);
+
+ $this->assertFalse($acl->unknownMethod('ACL','test'));
+
+ $this->assertEquals(array(
+ array(
+ 'principal' => 'principals/foo',
+ 'privilege' => '{DAV:}write',
+ 'protected' => true,
+ ),
+ array(
+ 'principal' => 'principals/baz',
+ 'privilege' => '{DAV:}write',
+ 'protected' => false,
+ ),
+ ), $node->getACL());
+
+ }
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAVACL/AllowAccessTest.php b/vendor/sabre/dav/tests/Sabre/DAVACL/AllowAccessTest.php
new file mode 100644
index 000000000..3a9b35b45
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAVACL/AllowAccessTest.php
@@ -0,0 +1,139 @@
+<?php
+
+namespace Sabre\DAVACL;
+
+use Sabre\DAV;
+use Sabre\HTTP;
+
+class AllowAccessTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * @var DAV\Server
+ */
+ protected $server;
+
+ function setUp() {
+
+ $nodes = array(
+ new DAV\SimpleCollection('testdir'),
+ );
+
+ $this->server = new DAV\Server($nodes);
+ $aclPlugin = new Plugin();
+ $aclPlugin->allowAccessToNodesWithoutACL = true;
+ $this->server->addPlugin($aclPlugin);
+
+ }
+
+ function testGet() {
+
+ $this->assertTrue($this->server->broadcastEvent('beforeMethod',array('GET','testdir')));
+
+ }
+
+ function testGetDoesntExist() {
+
+ $r = $this->server->broadcastEvent('beforeMethod',array('GET','foo'));
+ $this->assertTrue($r);
+
+ }
+
+ function testHEAD() {
+
+ $this->assertTrue($this->server->broadcastEvent('beforeMethod',array('HEAD','testdir')));
+
+ }
+
+ function testOPTIONS() {
+
+ $this->assertTrue($this->server->broadcastEvent('beforeMethod',array('OPTIONS','testdir')));
+
+ }
+
+ function testPUT() {
+
+ $this->assertTrue($this->server->broadcastEvent('beforeMethod',array('PUT','testdir')));
+
+ }
+
+ function testACL() {
+
+ $this->assertTrue($this->server->broadcastEvent('beforeMethod',array('ACL','testdir')));
+
+ }
+
+ function testPROPPATCH() {
+
+ $this->assertTrue($this->server->broadcastEvent('beforeMethod',array('PROPPATCH','testdir')));
+
+ }
+
+ function testCOPY() {
+
+ $this->assertTrue($this->server->broadcastEvent('beforeMethod',array('COPY','testdir')));
+
+ }
+
+ function testMOVE() {
+
+ $this->assertTrue($this->server->broadcastEvent('beforeMethod',array('MOVE','testdir')));
+
+ }
+
+ function testLOCK() {
+
+ $this->assertTrue($this->server->broadcastEvent('beforeMethod',array('LOCK','testdir')));
+
+ }
+
+ function testBeforeBind() {
+
+ $this->assertTrue($this->server->broadcastEvent('beforeBind',array('testdir/file')));
+
+ }
+
+
+ function testBeforeUnbind() {
+
+ $this->assertTrue($this->server->broadcastEvent('beforeUnbind',array('testdir')));
+
+ }
+
+ function testAfterGetProperties() {
+
+ $properties = array(
+ 'href' => 'foo',
+ '200' => array(
+ '{DAV:}displayname' => 'foo',
+ '{DAV:}getcontentlength' => 500,
+ ),
+ '404' => array(
+ '{DAV:}bar' => null,
+ ),
+ '403' => array(
+ '{DAV:}owner' => null,
+ ),
+ );
+
+ $expected = array(
+ 'href' => 'foo',
+ '200' => array(
+ '{DAV:}displayname' => 'foo',
+ '{DAV:}getcontentlength' => 500,
+ ),
+ '404' => array(
+ '{DAV:}bar' => null,
+ ),
+ '403' => array(
+ '{DAV:}owner' => null,
+ ),
+ );
+
+ $r = $this->server->broadcastEvent('afterGetProperties',array('testdir',&$properties));
+ $this->assertTrue($r);
+
+ $this->assertEquals($expected, $properties);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAVACL/BlockAccessTest.php b/vendor/sabre/dav/tests/Sabre/DAVACL/BlockAccessTest.php
new file mode 100644
index 000000000..345d2cc5d
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAVACL/BlockAccessTest.php
@@ -0,0 +1,190 @@
+<?php
+
+namespace Sabre\DAVACL;
+
+use Sabre\DAV;
+use Sabre\HTTP;
+
+class BlockAccessTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * @var DAV\Server
+ */
+ protected $server;
+ protected $plugin;
+
+ function setUp() {
+
+ $nodes = array(
+ new DAV\SimpleCollection('testdir'),
+ );
+
+ $this->server = new DAV\Server($nodes);
+ $this->plugin = new Plugin();
+ $this->plugin->allowAccessToNodesWithoutACL = false;
+ $this->server->addPlugin($this->plugin);
+
+ }
+
+ /**
+ * @expectedException Sabre\DAVACL\Exception\NeedPrivileges
+ */
+ function testGet() {
+
+ $this->server->broadcastEvent('beforeMethod',array('GET','testdir'));
+
+ }
+
+ function testGetDoesntExist() {
+
+ $r = $this->server->broadcastEvent('beforeMethod',array('GET','foo'));
+ $this->assertTrue($r);
+
+ }
+
+ /**
+ * @expectedException Sabre\DAVACL\Exception\NeedPrivileges
+ */
+ function testHEAD() {
+
+ $this->server->broadcastEvent('beforeMethod',array('HEAD','testdir'));
+
+ }
+
+ /**
+ * @expectedException Sabre\DAVACL\Exception\NeedPrivileges
+ */
+ function testOPTIONS() {
+
+ $this->server->broadcastEvent('beforeMethod',array('OPTIONS','testdir'));
+
+ }
+
+ /**
+ * @expectedException Sabre\DAVACL\Exception\NeedPrivileges
+ */
+ function testPUT() {
+
+ $this->server->broadcastEvent('beforeMethod',array('PUT','testdir'));
+
+ }
+
+ /**
+ * @expectedException Sabre\DAVACL\Exception\NeedPrivileges
+ */
+ function testPROPPATCH() {
+
+ $this->server->broadcastEvent('beforeMethod',array('PROPPATCH','testdir'));
+
+ }
+
+ /**
+ * @expectedException Sabre\DAVACL\Exception\NeedPrivileges
+ */
+ function testCOPY() {
+
+ $this->server->broadcastEvent('beforeMethod',array('COPY','testdir'));
+
+ }
+
+ /**
+ * @expectedException Sabre\DAVACL\Exception\NeedPrivileges
+ */
+ function testMOVE() {
+
+ $this->server->broadcastEvent('beforeMethod',array('MOVE','testdir'));
+
+ }
+
+ /**
+ * @expectedException Sabre\DAVACL\Exception\NeedPrivileges
+ */
+ function testACL() {
+
+ $this->server->broadcastEvent('beforeMethod',array('ACL','testdir'));
+
+ }
+
+ /**
+ * @expectedException Sabre\DAVACL\Exception\NeedPrivileges
+ */
+ function testLOCK() {
+
+ $this->server->broadcastEvent('beforeMethod',array('LOCK','testdir'));
+
+ }
+
+ /**
+ * @expectedException Sabre\DAVACL\Exception\NeedPrivileges
+ */
+ function testBeforeBind() {
+
+ $this->server->broadcastEvent('beforeBind',array('testdir/file'));
+
+ }
+
+ /**
+ * @expectedException Sabre\DAVACL\Exception\NeedPrivileges
+ */
+ function testBeforeUnbind() {
+
+ $this->server->broadcastEvent('beforeUnbind',array('testdir'));
+
+ }
+
+ function testBeforeGetProperties() {
+
+ $requestedProperties = array(
+ '{DAV:}displayname',
+ '{DAV:}getcontentlength',
+ '{DAV:}bar',
+ '{DAV:}owner',
+ );
+ $returnedProperties = array();
+
+ $arguments = array(
+ 'testdir',
+ new DAV\SimpleCollection('testdir'),
+ &$requestedProperties,
+ &$returnedProperties
+ );
+ $r = $this->server->broadcastEvent('beforeGetProperties',$arguments);
+ $this->assertTrue($r);
+
+ $expected = array(
+ '403' => array(
+ '{DAV:}displayname' => null,
+ '{DAV:}getcontentlength' => null,
+ '{DAV:}bar' => null,
+ '{DAV:}owner' => null,
+ ),
+ );
+
+ $this->assertEquals($expected, $returnedProperties);
+ $this->assertEquals(array(), $requestedProperties);
+
+ }
+
+ function testBeforeGetPropertiesNoListing() {
+
+ $this->plugin->hideNodesFromListings = true;
+
+ $requestedProperties = array(
+ '{DAV:}displayname',
+ '{DAV:}getcontentlength',
+ '{DAV:}bar',
+ '{DAV:}owner',
+ );
+ $returnedProperties = array();
+
+ $arguments = array(
+ 'testdir',
+ new DAV\SimpleCollection('testdir'),
+ &$requestedProperties,
+ &$returnedProperties
+ );
+ $r = $this->server->broadcastEvent('beforeGetProperties',$arguments);
+ $this->assertFalse($r);
+
+ }
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAVACL/Exception/AceConflictTest.php b/vendor/sabre/dav/tests/Sabre/DAVACL/Exception/AceConflictTest.php
new file mode 100644
index 000000000..fc48af67f
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAVACL/Exception/AceConflictTest.php
@@ -0,0 +1,39 @@
+<?php
+
+namespace Sabre\DAVACL\Exception;
+
+use Sabre\DAV;
+
+class AceConflictTest extends \PHPUnit_Framework_TestCase {
+
+ function testSerialize() {
+
+ $ex = new AceConflict('message');
+
+ $server = new DAV\Server();
+ $dom = new \DOMDocument('1.0','utf-8');
+ $root = $dom->createElementNS('DAV:','d:root');
+ $dom->appendChild($root);
+
+ $ex->serialize($server, $root);
+
+ $xpaths = array(
+ '/d:root' => 1,
+ '/d:root/d:no-ace-conflict' => 1,
+ );
+
+ // Reloading because PHP DOM sucks
+ $dom2 = new \DOMDocument('1.0', 'utf-8');
+ $dom2->loadXML($dom->saveXML());
+
+ $dxpath = new \DOMXPath($dom2);
+ $dxpath->registerNamespace('d','DAV:');
+ foreach($xpaths as $xpath=>$count) {
+
+ $this->assertEquals($count, $dxpath->query($xpath)->length, 'Looking for : ' . $xpath . ', we could only find ' . $dxpath->query($xpath)->length . ' elements, while we expected ' . $count);
+
+ }
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAVACL/Exception/NeedPrivilegesExceptionTest.php b/vendor/sabre/dav/tests/Sabre/DAVACL/Exception/NeedPrivilegesExceptionTest.php
new file mode 100644
index 000000000..7e66adab6
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAVACL/Exception/NeedPrivilegesExceptionTest.php
@@ -0,0 +1,49 @@
+<?php
+
+namespace Sabre\DAVACL\Exception;
+
+use Sabre\DAV;
+
+class NeedPrivilegesTest extends \PHPUnit_Framework_TestCase {
+
+ function testSerialize() {
+
+ $uri = 'foo';
+ $privileges = array(
+ '{DAV:}read',
+ '{DAV:}write',
+ );
+ $ex = new NeedPrivileges($uri, $privileges);
+
+ $server = new DAV\Server();
+ $dom = new \DOMDocument('1.0','utf-8');
+ $root = $dom->createElementNS('DAV:','d:root');
+ $dom->appendChild($root);
+
+ $ex->serialize($server, $root);
+
+ $xpaths = array(
+ '/d:root' => 1,
+ '/d:root/d:need-privileges' => 1,
+ '/d:root/d:need-privileges/d:resource' => 2,
+ '/d:root/d:need-privileges/d:resource/d:href' => 2,
+ '/d:root/d:need-privileges/d:resource/d:privilege' => 2,
+ '/d:root/d:need-privileges/d:resource/d:privilege/d:read' => 1,
+ '/d:root/d:need-privileges/d:resource/d:privilege/d:write' => 1,
+ );
+
+ // Reloading because PHP DOM sucks
+ $dom2 = new \DOMDocument('1.0', 'utf-8');
+ $dom2->loadXML($dom->saveXML());
+
+ $dxpath = new \DOMXPath($dom2);
+ $dxpath->registerNamespace('d','DAV:');
+ foreach($xpaths as $xpath=>$count) {
+
+ $this->assertEquals($count, $dxpath->query($xpath)->length, 'Looking for : ' . $xpath . ', we could only find ' . $dxpath->query($xpath)->length . ' elements, while we expected ' . $count);
+
+ }
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAVACL/Exception/NoAbstractTest.php b/vendor/sabre/dav/tests/Sabre/DAVACL/Exception/NoAbstractTest.php
new file mode 100644
index 000000000..2406c1c38
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAVACL/Exception/NoAbstractTest.php
@@ -0,0 +1,39 @@
+<?php
+
+namespace Sabre\DAVACL\Exception;
+
+use Sabre\DAV;
+
+class NoAbstractTest extends \PHPUnit_Framework_TestCase {
+
+ function testSerialize() {
+
+ $ex = new NoAbstract('message');
+
+ $server = new DAV\Server();
+ $dom = new \DOMDocument('1.0','utf-8');
+ $root = $dom->createElementNS('DAV:','d:root');
+ $dom->appendChild($root);
+
+ $ex->serialize($server, $root);
+
+ $xpaths = array(
+ '/d:root' => 1,
+ '/d:root/d:no-abstract' => 1,
+ );
+
+ // Reloading because PHP DOM sucks
+ $dom2 = new \DOMDocument('1.0', 'utf-8');
+ $dom2->loadXML($dom->saveXML());
+
+ $dxpath = new \DOMXPath($dom2);
+ $dxpath->registerNamespace('d','DAV:');
+ foreach($xpaths as $xpath=>$count) {
+
+ $this->assertEquals($count, $dxpath->query($xpath)->length, 'Looking for : ' . $xpath . ', we could only find ' . $dxpath->query($xpath)->length . ' elements, while we expected ' . $count);
+
+ }
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAVACL/Exception/NotRecognizedPrincipalTest.php b/vendor/sabre/dav/tests/Sabre/DAVACL/Exception/NotRecognizedPrincipalTest.php
new file mode 100644
index 000000000..6077b0ba5
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAVACL/Exception/NotRecognizedPrincipalTest.php
@@ -0,0 +1,39 @@
+<?php
+
+namespace Sabre\DAVACL\Exception;
+
+use Sabre\DAV;
+
+class NotRecognizedPrincipalTest extends \PHPUnit_Framework_TestCase {
+
+ function testSerialize() {
+
+ $ex = new NotRecognizedPrincipal('message');
+
+ $server = new DAV\Server();
+ $dom = new \DOMDocument('1.0','utf-8');
+ $root = $dom->createElementNS('DAV:','d:root');
+ $dom->appendChild($root);
+
+ $ex->serialize($server, $root);
+
+ $xpaths = array(
+ '/d:root' => 1,
+ '/d:root/d:recognized-principal' => 1,
+ );
+
+ // Reloading because PHP DOM sucks
+ $dom2 = new \DOMDocument('1.0', 'utf-8');
+ $dom2->loadXML($dom->saveXML());
+
+ $dxpath = new \DOMXPath($dom2);
+ $dxpath->registerNamespace('d','DAV:');
+ foreach($xpaths as $xpath=>$count) {
+
+ $this->assertEquals($count, $dxpath->query($xpath)->length, 'Looking for : ' . $xpath . ', we could only find ' . $dxpath->query($xpath)->length . ' elements, while we expected ' . $count);
+
+ }
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAVACL/Exception/NotSupportedPrivilegeTest.php b/vendor/sabre/dav/tests/Sabre/DAVACL/Exception/NotSupportedPrivilegeTest.php
new file mode 100644
index 000000000..8e7b3685d
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAVACL/Exception/NotSupportedPrivilegeTest.php
@@ -0,0 +1,39 @@
+<?php
+
+namespace Sabre\DAVACL\Exception;
+
+use Sabre\DAV;
+
+class NotSupportedPrivilegeTest extends \PHPUnit_Framework_TestCase {
+
+ function testSerialize() {
+
+ $ex = new NotSupportedPrivilege('message');
+
+ $server = new DAV\Server();
+ $dom = new \DOMDocument('1.0','utf-8');
+ $root = $dom->createElementNS('DAV:','d:root');
+ $dom->appendChild($root);
+
+ $ex->serialize($server, $root);
+
+ $xpaths = array(
+ '/d:root' => 1,
+ '/d:root/d:not-supported-privilege' => 1,
+ );
+
+ // Reloading because PHP DOM sucks
+ $dom2 = new \DOMDocument('1.0', 'utf-8');
+ $dom2->loadXML($dom->saveXML());
+
+ $dxpath = new \DOMXPath($dom2);
+ $dxpath->registerNamespace('d','DAV:');
+ foreach($xpaths as $xpath=>$count) {
+
+ $this->assertEquals($count, $dxpath->query($xpath)->length, 'Looking for : ' . $xpath . ', we could only find ' . $dxpath->query($xpath)->length . ' elements, while we expected ' . $count);
+
+ }
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAVACL/ExpandPropertiesTest.php b/vendor/sabre/dav/tests/Sabre/DAVACL/ExpandPropertiesTest.php
new file mode 100644
index 000000000..324788d4a
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAVACL/ExpandPropertiesTest.php
@@ -0,0 +1,358 @@
+<?php
+
+namespace Sabre\DAVACL;
+
+use Sabre\DAV;
+use Sabre\HTTP;
+
+require_once 'Sabre/HTTP/ResponseMock.php';
+
+class ExpandPropertiesTest extends \PHPUnit_Framework_TestCase {
+
+ function getServer() {
+
+ $tree = array(
+ new MockPropertyNode('node1', array(
+ '{http://sabredav.org/ns}simple' => 'foo',
+ '{http://sabredav.org/ns}href' => new DAV\Property\Href('node2'),
+ '{DAV:}displayname' => 'Node 1',
+ )),
+ new MockPropertyNode('node2', array(
+ '{http://sabredav.org/ns}simple' => 'simple',
+ '{http://sabredav.org/ns}hreflist' => new DAV\Property\HrefList(array('node1','node3')),
+ '{DAV:}displayname' => 'Node 2',
+ )),
+ new MockPropertyNode('node3', array(
+ '{http://sabredav.org/ns}simple' => 'simple',
+ '{DAV:}displayname' => 'Node 3',
+ )),
+ );
+
+ $fakeServer = new DAV\Server($tree);
+ $fakeServer->debugExceptions = true;
+ $fakeServer->httpResponse = new HTTP\ResponseMock();
+ $plugin = new Plugin();
+ $plugin->allowAccessToNodesWithoutACL = true;
+
+ $this->assertTrue($plugin instanceof Plugin);
+ $fakeServer->addPlugin($plugin);
+ $this->assertEquals($plugin, $fakeServer->getPlugin('acl'));
+
+ return $fakeServer;
+
+ }
+
+ function testSimple() {
+
+ $xml = '<?xml version="1.0"?>
+<d:expand-property xmlns:d="DAV:">
+ <d:property name="displayname" />
+ <d:property name="foo" namespace="http://www.sabredav.org/NS/2010/nonexistant" />
+ <d:property name="simple" namespace="http://sabredav.org/ns" />
+ <d:property name="href" namespace="http://sabredav.org/ns" />
+</d:expand-property>';
+
+ $serverVars = array(
+ 'REQUEST_METHOD' => 'REPORT',
+ 'HTTP_DEPTH' => '0',
+ 'REQUEST_URI' => '/node1',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody($xml);
+
+ $server = $this->getServer();
+ $server->httpRequest = $request;
+
+ $server->exec();
+
+ $this->assertEquals('HTTP/1.1 207 Multi-Status', $server->httpResponse->status,'Incorrect status code received. Full body: ' . $server->httpResponse->body);
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml; charset=utf-8',
+ ), $server->httpResponse->headers);
+
+
+ $check = array(
+ '/d:multistatus',
+ '/d:multistatus/d:response' => 1,
+ '/d:multistatus/d:response/d:href' => 1,
+ '/d:multistatus/d:response/d:propstat' => 2,
+ '/d:multistatus/d:response/d:propstat/d:prop' => 2,
+ '/d:multistatus/d:response/d:propstat/d:prop/d:displayname' => 1,
+ '/d:multistatus/d:response/d:propstat/d:prop/s:simple' => 1,
+ '/d:multistatus/d:response/d:propstat/d:prop/s:href' => 1,
+ '/d:multistatus/d:response/d:propstat/d:prop/s:href/d:href' => 1,
+ );
+
+ $xml = simplexml_load_string($server->httpResponse->body);
+ $xml->registerXPathNamespace('d','DAV:');
+ $xml->registerXPathNamespace('s','http://sabredav.org/ns');
+ foreach($check as $v1=>$v2) {
+
+ $xpath = is_int($v1)?$v2:$v1;
+
+ $result = $xml->xpath($xpath);
+
+ $count = 1;
+ if (!is_int($v1)) $count = $v2;
+
+ $this->assertEquals($count,count($result), 'we expected ' . $count . ' appearances of ' . $xpath . ' . We found ' . count($result) . '. Full response: ' . $server->httpResponse->body);
+
+ }
+
+ }
+
+ /**
+ * @depends testSimple
+ */
+ function testExpand() {
+
+ $xml = '<?xml version="1.0"?>
+<d:expand-property xmlns:d="DAV:">
+ <d:property name="href" namespace="http://sabredav.org/ns">
+ <d:property name="displayname" />
+ </d:property>
+</d:expand-property>';
+
+ $serverVars = array(
+ 'REQUEST_METHOD' => 'REPORT',
+ 'HTTP_DEPTH' => '0',
+ 'REQUEST_URI' => '/node1',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody($xml);
+
+ $server = $this->getServer();
+ $server->httpRequest = $request;
+
+ $server->exec();
+
+ $this->assertEquals('HTTP/1.1 207 Multi-Status', $server->httpResponse->status, 'Incorrect response status received. Full response body: ' . $server->httpResponse->body);
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml; charset=utf-8',
+ ), $server->httpResponse->headers);
+
+
+ $check = array(
+ '/d:multistatus',
+ '/d:multistatus/d:response' => 1,
+ '/d:multistatus/d:response/d:href' => 1,
+ '/d:multistatus/d:response/d:propstat' => 1,
+ '/d:multistatus/d:response/d:propstat/d:prop' => 1,
+ '/d:multistatus/d:response/d:propstat/d:prop/s:href' => 1,
+ '/d:multistatus/d:response/d:propstat/d:prop/s:href/d:response' => 1,
+ '/d:multistatus/d:response/d:propstat/d:prop/s:href/d:response/d:href' => 1,
+ '/d:multistatus/d:response/d:propstat/d:prop/s:href/d:response/d:propstat' => 1,
+ '/d:multistatus/d:response/d:propstat/d:prop/s:href/d:response/d:propstat/d:prop' => 1,
+ '/d:multistatus/d:response/d:propstat/d:prop/s:href/d:response/d:propstat/d:prop/d:displayname' => 1,
+ );
+
+ $xml = simplexml_load_string($server->httpResponse->body);
+ $xml->registerXPathNamespace('d','DAV:');
+ $xml->registerXPathNamespace('s','http://sabredav.org/ns');
+ foreach($check as $v1=>$v2) {
+
+ $xpath = is_int($v1)?$v2:$v1;
+
+ $result = $xml->xpath($xpath);
+
+ $count = 1;
+ if (!is_int($v1)) $count = $v2;
+
+ $this->assertEquals($count,count($result), 'we expected ' . $count . ' appearances of ' . $xpath . ' . We found ' . count($result));
+
+ }
+
+ }
+
+ /**
+ * @depends testSimple
+ */
+ function testExpandHrefList() {
+
+ $xml = '<?xml version="1.0"?>
+<d:expand-property xmlns:d="DAV:">
+ <d:property name="hreflist" namespace="http://sabredav.org/ns">
+ <d:property name="displayname" />
+ </d:property>
+</d:expand-property>';
+
+ $serverVars = array(
+ 'REQUEST_METHOD' => 'REPORT',
+ 'HTTP_DEPTH' => '0',
+ 'REQUEST_URI' => '/node2',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody($xml);
+
+ $server = $this->getServer();
+ $server->httpRequest = $request;
+
+ $server->exec();
+
+ $this->assertEquals('HTTP/1.1 207 Multi-Status', $server->httpResponse->status);
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml; charset=utf-8',
+ ), $server->httpResponse->headers);
+
+
+ $check = array(
+ '/d:multistatus',
+ '/d:multistatus/d:response' => 1,
+ '/d:multistatus/d:response/d:href' => 1,
+ '/d:multistatus/d:response/d:propstat' => 1,
+ '/d:multistatus/d:response/d:propstat/d:prop' => 1,
+ '/d:multistatus/d:response/d:propstat/d:prop/s:hreflist' => 1,
+ '/d:multistatus/d:response/d:propstat/d:prop/s:hreflist/d:response' => 2,
+ '/d:multistatus/d:response/d:propstat/d:prop/s:hreflist/d:response/d:href' => 2,
+ '/d:multistatus/d:response/d:propstat/d:prop/s:hreflist/d:response/d:propstat' => 2,
+ '/d:multistatus/d:response/d:propstat/d:prop/s:hreflist/d:response/d:propstat/d:prop' => 2,
+ '/d:multistatus/d:response/d:propstat/d:prop/s:hreflist/d:response/d:propstat/d:prop/d:displayname' => 2,
+ );
+
+ $xml = simplexml_load_string($server->httpResponse->body);
+ $xml->registerXPathNamespace('d','DAV:');
+ $xml->registerXPathNamespace('s','http://sabredav.org/ns');
+ foreach($check as $v1=>$v2) {
+
+ $xpath = is_int($v1)?$v2:$v1;
+
+ $result = $xml->xpath($xpath);
+
+ $count = 1;
+ if (!is_int($v1)) $count = $v2;
+
+ $this->assertEquals($count,count($result), 'we expected ' . $count . ' appearances of ' . $xpath . ' . We found ' . count($result));
+
+ }
+
+ }
+
+ /**
+ * @depends testExpand
+ */
+ function testExpandDeep() {
+
+ $xml = '<?xml version="1.0"?>
+<d:expand-property xmlns:d="DAV:">
+ <d:property name="hreflist" namespace="http://sabredav.org/ns">
+ <d:property name="href" namespace="http://sabredav.org/ns">
+ <d:property name="displayname" />
+ </d:property>
+ <d:property name="displayname" />
+ </d:property>
+</d:expand-property>';
+
+ $serverVars = array(
+ 'REQUEST_METHOD' => 'REPORT',
+ 'HTTP_DEPTH' => '0',
+ 'REQUEST_URI' => '/node2',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody($xml);
+
+ $server = $this->getServer();
+ $server->httpRequest = $request;
+
+ $server->exec();
+
+ $this->assertEquals('HTTP/1.1 207 Multi-Status', $server->httpResponse->status);
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml; charset=utf-8',
+ ), $server->httpResponse->headers);
+
+
+ $check = array(
+ '/d:multistatus',
+ '/d:multistatus/d:response' => 1,
+ '/d:multistatus/d:response/d:href' => 1,
+ '/d:multistatus/d:response/d:propstat' => 1,
+ '/d:multistatus/d:response/d:propstat/d:prop' => 1,
+ '/d:multistatus/d:response/d:propstat/d:prop/s:hreflist' => 1,
+ '/d:multistatus/d:response/d:propstat/d:prop/s:hreflist/d:response' => 2,
+ '/d:multistatus/d:response/d:propstat/d:prop/s:hreflist/d:response/d:href' => 2,
+ '/d:multistatus/d:response/d:propstat/d:prop/s:hreflist/d:response/d:propstat' => 3,
+ '/d:multistatus/d:response/d:propstat/d:prop/s:hreflist/d:response/d:propstat/d:prop' => 3,
+ '/d:multistatus/d:response/d:propstat/d:prop/s:hreflist/d:response/d:propstat/d:prop/d:displayname' => 2,
+ '/d:multistatus/d:response/d:propstat/d:prop/s:hreflist/d:response/d:propstat/d:prop/s:href' => 2,
+ '/d:multistatus/d:response/d:propstat/d:prop/s:hreflist/d:response/d:propstat/d:prop/s:href/d:response' => 1,
+ '/d:multistatus/d:response/d:propstat/d:prop/s:hreflist/d:response/d:propstat/d:prop/s:href/d:response/d:href' => 1,
+ '/d:multistatus/d:response/d:propstat/d:prop/s:hreflist/d:response/d:propstat/d:prop/s:href/d:response/d:propstat' => 1,
+ '/d:multistatus/d:response/d:propstat/d:prop/s:hreflist/d:response/d:propstat/d:prop/s:href/d:response/d:propstat/d:prop' => 1,
+ '/d:multistatus/d:response/d:propstat/d:prop/s:hreflist/d:response/d:propstat/d:prop/s:href/d:response/d:propstat/d:prop/d:displayname' => 1,
+ );
+
+ $xml = simplexml_load_string($server->httpResponse->body);
+ $xml->registerXPathNamespace('d','DAV:');
+ $xml->registerXPathNamespace('s','http://sabredav.org/ns');
+ foreach($check as $v1=>$v2) {
+
+ $xpath = is_int($v1)?$v2:$v1;
+
+ $result = $xml->xpath($xpath);
+
+ $count = 1;
+ if (!is_int($v1)) $count = $v2;
+
+ $this->assertEquals($count,count($result), 'we expected ' . $count . ' appearances of ' . $xpath . ' . We found ' . count($result));
+
+ }
+
+ }
+}
+class MockPropertyNode implements DAV\INode, DAV\IProperties {
+
+ function __construct($name, array $properties) {
+
+ $this->name = $name;
+ $this->properties = $properties;
+
+ }
+
+ function getName() {
+
+ return $this->name;
+
+ }
+
+ function getProperties($requestedProperties) {
+
+ $returnedProperties = array();
+ foreach($requestedProperties as $requestedProperty) {
+ if (isset($this->properties[$requestedProperty])) {
+ $returnedProperties[$requestedProperty] =
+ $this->properties[$requestedProperty];
+ }
+ }
+ return $returnedProperties;
+
+ }
+
+ function delete() {
+
+ throw new DAV\Exception('Not implemented');
+
+ }
+
+ function setName($name) {
+
+ throw new DAV\Exception('Not implemented');
+
+ }
+
+ function getLastModified() {
+
+ return null;
+
+ }
+
+ function updateProperties($properties) {
+
+ throw new DAV\Exception('Not implemented');
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAVACL/MockACLNode.php b/vendor/sabre/dav/tests/Sabre/DAVACL/MockACLNode.php
new file mode 100644
index 000000000..7b3e8fc12
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAVACL/MockACLNode.php
@@ -0,0 +1,56 @@
+<?php
+
+namespace Sabre\DAVACL;
+
+use Sabre\DAV;
+use Sabre\HTTP;
+
+class MockACLNode extends DAV\Node implements IACL {
+
+ public $name;
+ public $acl;
+
+ function __construct($name, array $acl = array()) {
+
+ $this->name = $name;
+ $this->acl = $acl;
+
+ }
+
+ function getName() {
+
+ return $this->name;
+
+ }
+
+ function getOwner() {
+
+ return null;
+
+ }
+
+ function getGroup() {
+
+ return null;
+
+ }
+
+ function getACL() {
+
+ return $this->acl;
+
+ }
+
+ function setACL(array $acl) {
+
+ $this->acl = $acl;
+
+ }
+
+ function getSupportedPrivilegeSet() {
+
+ return null;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAVACL/MockPrincipal.php b/vendor/sabre/dav/tests/Sabre/DAVACL/MockPrincipal.php
new file mode 100644
index 000000000..dd8542b8d
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAVACL/MockPrincipal.php
@@ -0,0 +1,66 @@
+<?php
+
+namespace Sabre\DAVACL;
+
+use Sabre\DAV;
+use Sabre\HTTP;
+
+class MockPrincipal extends DAV\Node implements IPrincipal {
+
+ public $name;
+ public $principalUrl;
+ public $groupMembership = array();
+ public $groupMemberSet = array();
+
+ function __construct($name,$principalUrl,array $groupMembership = array(), array $groupMemberSet = array()) {
+
+ $this->name = $name;
+ $this->principalUrl = $principalUrl;
+ $this->groupMembership = $groupMembership;
+ $this->groupMemberSet = $groupMemberSet;
+
+ }
+
+ function getName() {
+
+ return $this->name;
+
+ }
+
+ function getDisplayName() {
+
+ return $this->getName();
+
+ }
+
+ function getAlternateUriSet() {
+
+ return array();
+
+ }
+
+ function getPrincipalUrl() {
+
+ return $this->principalUrl;
+
+ }
+
+ function getGroupMemberSet() {
+
+ return $this->groupMemberSet;
+
+ }
+
+ function getGroupMemberShip() {
+
+ return $this->groupMembership;
+
+ }
+
+ function setGroupMemberSet(array $groupMemberSet) {
+
+ $this->groupMemberSet = $groupMemberSet;
+
+ }
+}
+
diff --git a/vendor/sabre/dav/tests/Sabre/DAVACL/PluginAdminTest.php b/vendor/sabre/dav/tests/Sabre/DAVACL/PluginAdminTest.php
new file mode 100644
index 000000000..23c4b6e85
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAVACL/PluginAdminTest.php
@@ -0,0 +1,83 @@
+<?php
+
+namespace Sabre\DAVACL;
+
+use Sabre\DAV;
+use Sabre\HTTP;
+
+
+require_once 'Sabre/DAVACL/MockACLNode.php';
+require_once 'Sabre/HTTP/ResponseMock.php';
+
+class PluginAdminTest extends \PHPUnit_Framework_TestCase {
+
+ function testNoAdminAccess() {
+
+ $principalBackend = new PrincipalBackend\Mock();
+
+ $tree = array(
+ new MockACLNode('adminonly', array()),
+ new PrincipalCollection($principalBackend),
+ );
+
+ $fakeServer = new DAV\Server($tree);
+ $plugin = new DAV\Auth\Plugin(new DAV\Auth\Backend\Mock(),'realm');
+ $fakeServer->addPlugin($plugin);
+ $plugin = new Plugin();
+ $fakeServer->addPlugin($plugin);
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'OPTIONS',
+ 'HTTP_DEPTH' => 1,
+ 'REQUEST_URI' => '/adminonly',
+ ));
+
+ $response = new HTTP\ResponseMock();
+
+ $fakeServer->httpRequest = $request;
+ $fakeServer->httpResponse = $response;
+
+ $fakeServer->exec();
+
+ $this->assertEquals('HTTP/1.1 403 Forbidden', $response->status);
+
+ }
+
+ /**
+ * @depends testNoAdminAccess
+ */
+ function testAdminAccess() {
+
+ $principalBackend = new PrincipalBackend\Mock();
+
+ $tree = array(
+ new MockACLNode('adminonly', array()),
+ new PrincipalCollection($principalBackend),
+ );
+
+ $fakeServer = new DAV\Server($tree);
+ $plugin = new DAV\Auth\Plugin(new DAV\Auth\Backend\Mock(),'realm');
+ $fakeServer->addPlugin($plugin);
+ $plugin = new Plugin();
+ $plugin->adminPrincipals = array(
+ 'principals/admin',
+ );
+ $fakeServer->addPlugin($plugin);
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'OPTIONS',
+ 'HTTP_DEPTH' => 1,
+ 'REQUEST_URI' => '/adminonly',
+ ));
+
+ $response = new HTTP\ResponseMock();
+
+ $fakeServer->httpRequest = $request;
+ $fakeServer->httpResponse = $response;
+
+ $fakeServer->exec();
+
+ $this->assertEquals('HTTP/1.1 200 OK', $response->status);
+
+ }
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAVACL/PluginPropertiesTest.php b/vendor/sabre/dav/tests/Sabre/DAVACL/PluginPropertiesTest.php
new file mode 100644
index 000000000..8c0626e50
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAVACL/PluginPropertiesTest.php
@@ -0,0 +1,407 @@
+<?php
+
+namespace Sabre\DAVACL;
+
+use Sabre\DAV;
+use Sabre\HTTP;
+
+
+class PluginPropertiesTest extends \PHPUnit_Framework_TestCase {
+
+ function testPrincipalCollectionSet() {
+
+ $plugin = new Plugin();
+ $plugin->principalCollectionSet = array(
+ 'principals1',
+ 'principals2',
+ );
+
+ $requestedProperties = array(
+ '{DAV:}principal-collection-set',
+ );
+
+ $returnedProperties = array(
+ 200 => array(),
+ 404 => array(),
+ );
+
+ $server = new DAV\Server();
+ $server->addPlugin($plugin);
+
+ $this->assertNull($plugin->beforeGetProperties('', new DAV\SimpleCollection('root'), $requestedProperties, $returnedProperties));
+
+ $this->assertEquals(1,count($returnedProperties[200]));
+ $this->assertArrayHasKey('{DAV:}principal-collection-set',$returnedProperties[200]);
+ $this->assertInstanceOf('Sabre\\DAV\\Property\\HrefList', $returnedProperties[200]['{DAV:}principal-collection-set']);
+
+ $expected = array(
+ 'principals1/',
+ 'principals2/',
+ );
+
+
+ $this->assertEquals($expected, $returnedProperties[200]['{DAV:}principal-collection-set']->getHrefs());
+
+
+ }
+
+ function testCurrentUserPrincipal() {
+
+ $fakeServer = new DAV\Server();
+ $plugin = new DAV\Auth\Plugin(new DAV\Auth\Backend\Mock(),'realm');
+ $fakeServer->addPlugin($plugin);
+ $plugin = new Plugin();
+ $fakeServer->addPlugin($plugin);
+
+
+ $requestedProperties = array(
+ '{DAV:}current-user-principal',
+ );
+
+ $returnedProperties = array(
+ 200 => array(),
+ 404 => array(),
+ );
+
+ $this->assertNull($plugin->beforeGetProperties('', new DAV\SimpleCollection('root'), $requestedProperties, $returnedProperties));
+
+ $this->assertEquals(1,count($returnedProperties[200]));
+ $this->assertArrayHasKey('{DAV:}current-user-principal',$returnedProperties[200]);
+ $this->assertInstanceOf('Sabre\DAVACL\Property\Principal', $returnedProperties[200]['{DAV:}current-user-principal']);
+ $this->assertEquals(Property\Principal::UNAUTHENTICATED, $returnedProperties[200]['{DAV:}current-user-principal']->getType());
+
+ // This will force the login
+ $fakeServer->broadCastEvent('beforeMethod',array('GET',''));
+
+
+ $requestedProperties = array(
+ '{DAV:}current-user-principal',
+ );
+
+ $returnedProperties = array(
+ 200 => array(),
+ 404 => array(),
+ );
+
+
+ $this->assertNull($plugin->beforeGetProperties('', new DAV\SimpleCollection('root'), $requestedProperties, $returnedProperties));
+
+
+ $this->assertEquals(1,count($returnedProperties[200]));
+ $this->assertArrayHasKey('{DAV:}current-user-principal',$returnedProperties[200]);
+ $this->assertInstanceOf('Sabre\DAVACL\Property\Principal', $returnedProperties[200]['{DAV:}current-user-principal']);
+ $this->assertEquals(Property\Principal::HREF, $returnedProperties[200]['{DAV:}current-user-principal']->getType());
+ $this->assertEquals('principals/admin/', $returnedProperties[200]['{DAV:}current-user-principal']->getHref());
+
+ }
+
+ function testSupportedPrivilegeSet() {
+
+ $plugin = new Plugin();
+ $server = new DAV\Server();
+ $server->addPlugin($plugin);
+
+ $requestedProperties = array(
+ '{DAV:}supported-privilege-set',
+ );
+
+ $returnedProperties = array(
+ 200 => array(),
+ 404 => array(),
+ );
+
+
+ $this->assertNull($plugin->beforeGetProperties('', new DAV\SimpleCollection('root'), $requestedProperties, $returnedProperties));
+
+ $this->assertEquals(1,count($returnedProperties[200]));
+ $this->assertArrayHasKey('{DAV:}supported-privilege-set',$returnedProperties[200]);
+ $this->assertInstanceOf('Sabre\\DAVACL\\Property\\SupportedPrivilegeSet', $returnedProperties[200]['{DAV:}supported-privilege-set']);
+
+ $server = new DAV\Server();
+ $prop = $returnedProperties[200]['{DAV:}supported-privilege-set'];
+
+ $dom = new \DOMDocument('1.0', 'utf-8');
+ $root = $dom->createElement('d:root');
+ $root->setAttribute('xmlns:d','DAV:');
+ $dom->appendChild($root);
+ $prop->serialize($server, $root);
+
+
+ $xpaths = array(
+ '/d:root' => 1,
+ '/d:root/d:supported-privilege' => 1,
+ '/d:root/d:supported-privilege/d:privilege' => 1,
+ '/d:root/d:supported-privilege/d:privilege/d:all' => 1,
+ '/d:root/d:supported-privilege/d:abstract' => 1,
+ '/d:root/d:supported-privilege/d:supported-privilege' => 2,
+ '/d:root/d:supported-privilege/d:supported-privilege/d:privilege' => 2,
+ '/d:root/d:supported-privilege/d:supported-privilege/d:privilege/d:read' => 1,
+ '/d:root/d:supported-privilege/d:supported-privilege/d:privilege/d:write' => 1,
+ '/d:root/d:supported-privilege/d:supported-privilege/d:supported-privilege' => 8,
+ '/d:root/d:supported-privilege/d:supported-privilege/d:supported-privilege/d:privilege' => 8,
+ '/d:root/d:supported-privilege/d:supported-privilege/d:supported-privilege/d:privilege/d:read-acl' => 1,
+ '/d:root/d:supported-privilege/d:supported-privilege/d:supported-privilege/d:privilege/d:read-current-user-privilege-set' => 1,
+ '/d:root/d:supported-privilege/d:supported-privilege/d:supported-privilege/d:privilege/d:write-content' => 1,
+ '/d:root/d:supported-privilege/d:supported-privilege/d:supported-privilege/d:privilege/d:write-properties' => 1,
+ '/d:root/d:supported-privilege/d:supported-privilege/d:supported-privilege/d:privilege/d:write-acl' => 1,
+ '/d:root/d:supported-privilege/d:supported-privilege/d:supported-privilege/d:privilege/d:bind' => 1,
+ '/d:root/d:supported-privilege/d:supported-privilege/d:supported-privilege/d:privilege/d:unbind' => 1,
+ '/d:root/d:supported-privilege/d:supported-privilege/d:supported-privilege/d:privilege/d:unlock' => 1,
+ '/d:root/d:supported-privilege/d:supported-privilege/d:supported-privilege/d:abstract' => 8,
+ );
+
+
+ // reloading because php dom sucks
+ $dom2 = new \DOMDocument('1.0', 'utf-8');
+ $dom2->loadXML($dom->saveXML());
+
+ $dxpath = new \DOMXPath($dom2);
+ $dxpath->registerNamespace('d','DAV:');
+ foreach($xpaths as $xpath=>$count) {
+
+ $this->assertEquals($count, $dxpath->query($xpath)->length, 'Looking for : ' . $xpath . ', we could only find ' . $dxpath->query($xpath)->length . ' elements, while we expected ' . $count);
+
+ }
+
+ }
+
+ function testACL() {
+
+ $plugin = new Plugin();
+
+ $nodes = array(
+ new MockACLNode('foo', array(
+ array(
+ 'principal' => 'principals/admin',
+ 'privilege' => '{DAV:}read',
+ )
+ )),
+ new DAV\SimpleCollection('principals', array(
+ $principal = new MockPrincipal('admin','principals/admin'),
+ )),
+
+ );
+
+ $server = new DAV\Server($nodes);
+ $server->addPlugin($plugin);
+ $authPlugin = new DAV\Auth\Plugin(new DAV\Auth\Backend\Mock(),'realm');
+ $server->addPlugin($authPlugin);
+
+ // Force login
+ $authPlugin->beforeMethod('BLA','foo');
+
+ $requestedProperties = array(
+ '{DAV:}acl',
+ );
+
+ $returnedProperties = array(
+ 200 => array(),
+ 404 => array(),
+ );
+
+
+ $this->assertNull($plugin->beforeGetProperties('foo', $nodes[0], $requestedProperties, $returnedProperties));
+
+ $this->assertEquals(1,count($returnedProperties[200]),'The {DAV:}acl property did not return from the list. Full list: ' . print_r($returnedProperties,true));
+ $this->assertArrayHasKey('{DAV:}acl',$returnedProperties[200]);
+ $this->assertInstanceOf('Sabre\\DAVACL\\Property\\ACL', $returnedProperties[200]['{DAV:}acl']);
+
+ }
+
+ function testACLRestrictions() {
+
+ $plugin = new Plugin();
+
+ $nodes = array(
+ new MockACLNode('foo', array(
+ array(
+ 'principal' => 'principals/admin',
+ 'privilege' => '{DAV:}read',
+ )
+ )),
+ new DAV\SimpleCollection('principals', array(
+ $principal = new MockPrincipal('admin','principals/admin'),
+ )),
+
+ );
+
+ $server = new DAV\Server($nodes);
+ $server->addPlugin($plugin);
+ $authPlugin = new DAV\Auth\Plugin(new DAV\Auth\Backend\Mock(),'realm');
+ $server->addPlugin($authPlugin);
+
+ // Force login
+ $authPlugin->beforeMethod('BLA','foo');
+
+ $requestedProperties = array(
+ '{DAV:}acl-restrictions',
+ );
+
+ $returnedProperties = array(
+ 200 => array(),
+ 404 => array(),
+ );
+
+
+ $this->assertNull($plugin->beforeGetProperties('foo', $nodes[0], $requestedProperties, $returnedProperties));
+
+ $this->assertEquals(1,count($returnedProperties[200]),'The {DAV:}acl-restrictions property did not return from the list. Full list: ' . print_r($returnedProperties,true));
+ $this->assertArrayHasKey('{DAV:}acl-restrictions',$returnedProperties[200]);
+ $this->assertInstanceOf('Sabre\\DAVACL\\Property\\ACLRestrictions', $returnedProperties[200]['{DAV:}acl-restrictions']);
+
+ }
+
+ function testAlternateUriSet() {
+
+ $tree = array(
+ new DAV\SimpleCollection('principals', array(
+ $principal = new MockPrincipal('user','principals/user'),
+ )),
+ );
+
+ $fakeServer = new DAV\Server($tree);
+ //$plugin = new DAV\Auth\Plugin(new DAV\Auth\MockBackend(),'realm');
+ //$fakeServer->addPlugin($plugin);
+ $plugin = new Plugin();
+ $fakeServer->addPlugin($plugin);
+
+ $requestedProperties = array(
+ '{DAV:}alternate-URI-set',
+ );
+ $returnedProperties = array();
+
+ $result = $plugin->beforeGetProperties('principals/user',$principal,$requestedProperties,$returnedProperties);
+
+ $this->assertNull($result);
+
+ $this->assertTrue(isset($returnedProperties[200]));
+ $this->assertTrue(isset($returnedProperties[200]['{DAV:}alternate-URI-set']));
+ $this->assertInstanceOf('Sabre\\DAV\\Property\\HrefList', $returnedProperties[200]['{DAV:}alternate-URI-set']);
+
+ $this->assertEquals(array(), $returnedProperties[200]['{DAV:}alternate-URI-set']->getHrefs());
+
+ }
+
+ function testPrincipalURL() {
+
+ $tree = array(
+ new DAV\SimpleCollection('principals', array(
+ $principal = new MockPrincipal('user','principals/user'),
+ )),
+ );
+
+ $fakeServer = new DAV\Server($tree);
+ //$plugin = new DAV\Auth\Plugin(new DAV\Auth\MockBackend(),'realm');
+ //$fakeServer->addPlugin($plugin);
+ $plugin = new Plugin();
+ $fakeServer->addPlugin($plugin);
+
+ $requestedProperties = array(
+ '{DAV:}principal-URL',
+ );
+ $returnedProperties = array();
+
+ $result = $plugin->beforeGetProperties('principals/user',$principal,$requestedProperties,$returnedProperties);
+
+ $this->assertNull($result);
+
+ $this->assertTrue(isset($returnedProperties[200]));
+ $this->assertTrue(isset($returnedProperties[200]['{DAV:}principal-URL']));
+ $this->assertInstanceOf('Sabre\\DAV\\Property\\Href', $returnedProperties[200]['{DAV:}principal-URL']);
+
+ $this->assertEquals('principals/user/', $returnedProperties[200]['{DAV:}principal-URL']->getHref());
+
+ }
+
+ function testGroupMemberSet() {
+
+ $tree = array(
+ new DAV\SimpleCollection('principals', array(
+ $principal = new MockPrincipal('user','principals/user'),
+ )),
+ );
+
+ $fakeServer = new DAV\Server($tree);
+ //$plugin = new DAV\Auth\Plugin(new DAV\Auth\MockBackend(),'realm');
+ //$fakeServer->addPlugin($plugin);
+ $plugin = new Plugin();
+ $fakeServer->addPlugin($plugin);
+
+ $requestedProperties = array(
+ '{DAV:}group-member-set',
+ );
+ $returnedProperties = array();
+
+ $result = $plugin->beforeGetProperties('principals/user',$principal,$requestedProperties,$returnedProperties);
+
+ $this->assertNull($result);
+
+ $this->assertTrue(isset($returnedProperties[200]));
+ $this->assertTrue(isset($returnedProperties[200]['{DAV:}group-member-set']));
+ $this->assertInstanceOf('Sabre\\DAV\\Property\\HrefList', $returnedProperties[200]['{DAV:}group-member-set']);
+
+ $this->assertEquals(array(), $returnedProperties[200]['{DAV:}group-member-set']->getHrefs());
+
+ }
+
+ function testGroupMemberShip() {
+
+ $tree = array(
+ new DAV\SimpleCollection('principals', array(
+ $principal = new MockPrincipal('user','principals/user'),
+ )),
+ );
+
+ $fakeServer = new DAV\Server($tree);
+ //$plugin = new DAV\Auth\Plugin(new DAV\Auth\MockBackend(),'realm');
+ //$fakeServer->addPlugin($plugin);
+ $plugin = new Plugin();
+ $fakeServer->addPlugin($plugin);
+
+ $requestedProperties = array(
+ '{DAV:}group-membership',
+ );
+ $returnedProperties = array();
+
+ $result = $plugin->beforeGetProperties('principals/user',$principal,$requestedProperties,$returnedProperties);
+
+ $this->assertNull($result);
+
+ $this->assertTrue(isset($returnedProperties[200]));
+ $this->assertTrue(isset($returnedProperties[200]['{DAV:}group-membership']));
+ $this->assertInstanceOf('Sabre\\DAV\\Property\\HrefList', $returnedProperties[200]['{DAV:}group-membership']);
+
+ $this->assertEquals(array(), $returnedProperties[200]['{DAV:}group-membership']->getHrefs());
+
+ }
+
+ function testGetDisplayName() {
+
+ $tree = array(
+ new DAV\SimpleCollection('principals', array(
+ $principal = new MockPrincipal('user','principals/user'),
+ )),
+ );
+
+ $fakeServer = new DAV\Server($tree);
+ //$plugin = new DAV\Auth\Plugin(new DAV\Auth\MockBackend(),'realm');
+ //$fakeServer->addPlugin($plugin);
+ $plugin = new Plugin();
+ $fakeServer->addPlugin($plugin);
+
+ $requestedProperties = array(
+ '{DAV:}displayname',
+ );
+ $returnedProperties = array();
+
+ $result = $plugin->beforeGetProperties('principals/user',$principal,$requestedProperties,$returnedProperties);
+
+ $this->assertNull($result);
+
+ $this->assertTrue(isset($returnedProperties[200]));
+ $this->assertTrue(isset($returnedProperties[200]['{DAV:}displayname']));
+
+ $this->assertEquals('user', $returnedProperties[200]['{DAV:}displayname']);
+
+ }
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAVACL/PluginUpdatePropertiesTest.php b/vendor/sabre/dav/tests/Sabre/DAVACL/PluginUpdatePropertiesTest.php
new file mode 100644
index 000000000..53568654f
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAVACL/PluginUpdatePropertiesTest.php
@@ -0,0 +1,127 @@
+<?php
+
+namespace Sabre\DAVACL;
+
+use Sabre\DAV;
+use Sabre\HTTP;
+
+
+require_once 'Sabre/DAVACL/MockPrincipal.php';
+
+class PluginUpdatePropertiesTest extends \PHPUnit_Framework_TestCase {
+
+ public function testUpdatePropertiesPassthrough() {
+
+ $tree = array(
+ new DAV\SimpleCollection('foo'),
+ );
+ $server = new DAV\Server($tree);
+ $server->addPlugin(new Plugin());
+
+ $result = $server->updateProperties('foo', array(
+ '{DAV:}foo' => 'bar',
+ ));
+
+ $expected = array(
+ 'href' => 'foo',
+ '403' => array(
+ '{DAV:}foo' => null,
+ ),
+ );
+
+ $this->assertEquals($expected, $result);
+
+ }
+
+ public function testRemoveGroupMembers() {
+
+ $tree = array(
+ new MockPrincipal('foo','foo'),
+ );
+ $server = new DAV\Server($tree);
+ $server->addPlugin(new Plugin());
+
+ $result = $server->updateProperties('foo', array(
+ '{DAV:}group-member-set' => null,
+ ));
+
+ $expected = array(
+ 'href' => 'foo',
+ '200' => array(
+ '{DAV:}group-member-set' => null,
+ ),
+ );
+
+ $this->assertEquals($expected, $result);
+ $this->assertEquals(array(),$tree[0]->getGroupMemberSet());
+
+ }
+
+ public function testSetGroupMembers() {
+
+ $tree = array(
+ new MockPrincipal('foo','foo'),
+ );
+ $server = new DAV\Server($tree);
+ $server->addPlugin(new Plugin());
+
+ $result = $server->updateProperties('foo', array(
+ '{DAV:}group-member-set' => new DAV\Property\HrefList(array('/bar','/baz'), true),
+ ));
+
+ $expected = array(
+ 'href' => 'foo',
+ '200' => array(
+ '{DAV:}group-member-set' => null,
+ ),
+ );
+
+ $this->assertEquals($expected, $result);
+ $this->assertEquals(array('bar','baz'),$tree[0]->getGroupMemberSet());
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception
+ */
+ public function testSetBadValue() {
+
+ $tree = array(
+ new MockPrincipal('foo','foo'),
+ );
+ $server = new DAV\Server($tree);
+ $server->addPlugin(new Plugin());
+
+ $result = $server->updateProperties('foo', array(
+ '{DAV:}group-member-set' => new \StdClass(),
+ ));
+
+ }
+
+ public function testSetBadNode() {
+
+ $tree = array(
+ new DAV\SimpleCollection('foo'),
+ );
+ $server = new DAV\Server($tree);
+ $server->addPlugin(new Plugin());
+
+ $result = $server->updateProperties('foo', array(
+ '{DAV:}group-member-set' => new DAV\Property\HrefList(array('/bar','/baz'),false),
+ '{DAV:}bar' => 'baz',
+ ));
+
+ $expected = array(
+ 'href' => 'foo',
+ '403' => array(
+ '{DAV:}group-member-set' => null,
+ ),
+ '424' => array(
+ '{DAV:}bar' => null,
+ ),
+ );
+
+ $this->assertEquals($expected, $result);
+
+ }
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAVACL/PrincipalBackend/AbstractPDOTest.php b/vendor/sabre/dav/tests/Sabre/DAVACL/PrincipalBackend/AbstractPDOTest.php
new file mode 100644
index 000000000..3fe75ca0e
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAVACL/PrincipalBackend/AbstractPDOTest.php
@@ -0,0 +1,178 @@
+<?php
+
+namespace Sabre\DAVACL\PrincipalBackend;
+
+use Sabre\DAV;
+use Sabre\HTTP;
+
+
+abstract class AbstractPDOTest extends \PHPUnit_Framework_TestCase {
+
+ abstract function getPDO();
+
+ function testConstruct() {
+
+ $pdo = $this->getPDO();
+ $backend = new PDO($pdo);
+ $this->assertTrue($backend instanceof PDO);
+
+ }
+
+ /**
+ * @depends testConstruct
+ */
+ function testGetPrincipalsByPrefix() {
+
+ $pdo = $this->getPDO();
+ $backend = new PDO($pdo);
+
+ $expected = array(
+ array(
+ 'uri' => 'principals/user',
+ '{http://sabredav.org/ns}email-address' => 'user@example.org',
+ '{DAV:}displayname' => 'User',
+ ),
+ array(
+ 'uri' => 'principals/group',
+ '{http://sabredav.org/ns}email-address' => 'group@example.org',
+ '{DAV:}displayname' => 'Group',
+ ),
+ );
+
+ $this->assertEquals($expected, $backend->getPrincipalsByPrefix('principals'));
+ $this->assertEquals(array(), $backend->getPrincipalsByPrefix('foo'));
+
+ }
+
+ /**
+ * @depends testConstruct
+ */
+ function testGetPrincipalByPath() {
+
+ $pdo = $this->getPDO();
+ $backend = new PDO($pdo);
+
+ $expected = array(
+ 'id' => 1,
+ 'uri' => 'principals/user',
+ '{http://sabredav.org/ns}email-address' => 'user@example.org',
+ '{DAV:}displayname' => 'User',
+ );
+
+ $this->assertEquals($expected, $backend->getPrincipalByPath('principals/user'));
+ $this->assertEquals(null, $backend->getPrincipalByPath('foo'));
+
+ }
+
+ function testGetGroupMemberSet() {
+
+ $pdo = $this->getPDO();
+ $backend = new PDO($pdo);
+ $expected = array('principals/user');
+
+ $this->assertEquals($expected,$backend->getGroupMemberSet('principals/group'));
+
+ }
+
+ function testGetGroupMembership() {
+
+ $pdo = $this->getPDO();
+ $backend = new PDO($pdo);
+ $expected = array('principals/group');
+
+ $this->assertEquals($expected,$backend->getGroupMembership('principals/user'));
+
+ }
+
+ function testSetGroupMemberSet() {
+
+ $pdo = $this->getPDO();
+
+ // Start situation
+ $backend = new PDO($pdo);
+ $this->assertEquals(array('principals/user'), $backend->getGroupMemberSet('principals/group'));
+
+ // Removing all principals
+ $backend->setGroupMemberSet('principals/group', array());
+ $this->assertEquals(array(), $backend->getGroupMemberSet('principals/group'));
+
+ // Adding principals again
+ $backend->setGroupMemberSet('principals/group', array('principals/user'));
+ $this->assertEquals(array('principals/user'), $backend->getGroupMemberSet('principals/group'));
+
+
+ }
+
+ function testSearchPrincipals() {
+
+ $pdo = $this->getPDO();
+
+ $backend = new PDO($pdo);
+
+ $result = $backend->searchPrincipals('principals', array('{DAV:}blabla' => 'foo'));
+ $this->assertEquals(array(), $result);
+
+ $result = $backend->searchPrincipals('principals', array('{DAV:}displayname' => 'ou'));
+ $this->assertEquals(array('principals/group'), $result);
+
+ $result = $backend->searchPrincipals('principals', array('{DAV:}displayname' => 'UsEr', '{http://sabredav.org/ns}email-address' => 'USER@EXAMPLE'));
+ $this->assertEquals(array('principals/user'), $result);
+
+ $result = $backend->searchPrincipals('mom', array('{DAV:}displayname' => 'UsEr', '{http://sabredav.org/ns}email-address' => 'USER@EXAMPLE'));
+ $this->assertEquals(array(), $result);
+
+ }
+
+ function testUpdatePrincipal() {
+
+ $pdo = $this->getPDO();
+ $backend = new PDO($pdo);
+
+ $result = $backend->updatePrincipal('principals/user', array(
+ '{DAV:}displayname' => 'pietje',
+ '{http://sabredav.org/ns}vcard-url' => 'blabla',
+ ));
+
+ $this->assertTrue($result);
+
+ $this->assertEquals(array(
+ 'id' => 1,
+ 'uri' => 'principals/user',
+ '{DAV:}displayname' => 'pietje',
+ '{http://sabredav.org/ns}vcard-url' => 'blabla',
+ '{http://sabredav.org/ns}email-address' => 'user@example.org',
+ ), $backend->getPrincipalByPath('principals/user'));
+
+ }
+
+ function testUpdatePrincipalUnknownField() {
+
+ $pdo = $this->getPDO();
+ $backend = new PDO($pdo);
+
+ $result = $backend->updatePrincipal('principals/user', array(
+ '{DAV:}displayname' => 'pietje',
+ '{http://sabredav.org/ns}vcard-url' => 'blabla',
+ '{DAV:}unknown' => 'foo',
+ ));
+
+ $this->assertEquals(array(
+ 424 => array(
+ '{DAV:}displayname' => null,
+ '{http://sabredav.org/ns}vcard-url' => null,
+ ),
+ 403 => array(
+ '{DAV:}unknown' => null,
+ ),
+ ), $result);
+
+ $this->assertEquals(array(
+ 'id' => '1',
+ 'uri' => 'principals/user',
+ '{DAV:}displayname' => 'User',
+ '{http://sabredav.org/ns}email-address' => 'user@example.org',
+ ), $backend->getPrincipalByPath('principals/user'));
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAVACL/PrincipalBackend/Mock.php b/vendor/sabre/dav/tests/Sabre/DAVACL/PrincipalBackend/Mock.php
new file mode 100644
index 000000000..354446e34
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAVACL/PrincipalBackend/Mock.php
@@ -0,0 +1,184 @@
+<?php
+
+namespace Sabre\DAVACL\PrincipalBackend;
+
+class Mock extends AbstractBackend {
+
+ public $groupMembers = array();
+ public $principals;
+
+ function __construct() {
+
+ $this->principals = array(
+ array(
+ 'uri' => 'principals/user1',
+ '{DAV:}displayname' => 'User 1',
+ '{http://sabredav.org/ns}email-address' => 'user1.sabredav@sabredav.org',
+ '{http://sabredav.org/ns}vcard-url' => 'addressbooks/user1/book1/vcard1.vcf',
+ ),
+ array(
+ 'uri' => 'principals/admin',
+ '{DAV:}displayname' => 'Admin',
+ ),
+ array(
+ 'uri' => 'principals/user2',
+ '{DAV:}displayname' => 'User 2',
+ '{http://sabredav.org/ns}email-address' => 'user2.sabredav@sabredav.org',
+ ),
+ );
+
+
+ }
+
+ function getPrincipalsByPrefix($prefix) {
+
+ $prefix = trim($prefix,'/') . '/';
+ $return = array();
+
+ foreach($this->principals as $principal) {
+
+ if (strpos($principal['uri'], $prefix)!==0) continue;
+
+ $return[] = $principal;
+
+ }
+
+ return $return;
+
+ }
+
+ function addPrincipal(array $principal) {
+
+ $this->principals[] = $principal;
+
+ }
+
+ function getPrincipalByPath($path) {
+
+ foreach($this->getPrincipalsByPrefix('principals') as $principal) {
+ if ($principal['uri'] === $path) return $principal;
+ }
+
+ }
+
+ function searchPrincipals($prefixPath, array $searchProperties) {
+
+ $matches = array();
+ foreach($this->getPrincipalsByPrefix($prefixPath) as $principal) {
+
+ foreach($searchProperties as $key=>$value) {
+
+ if (!isset($principal[$key])) {
+ continue 2;
+ }
+ if (mb_stripos($principal[$key],$value, 0, 'UTF-8')===false) {
+ continue 2;
+ }
+
+ }
+ $matches[] = $principal['uri'];
+
+ }
+ return $matches;
+
+ }
+
+ function getGroupMemberSet($path) {
+
+ return isset($this->groupMembers[$path]) ? $this->groupMembers[$path] : array();
+
+ }
+
+ function getGroupMembership($path) {
+
+ $membership = array();
+ foreach($this->groupMembers as $group=>$members) {
+ if (in_array($path, $members)) $membership[] = $group;
+ }
+ return $membership;
+
+ }
+
+ function setGroupMemberSet($path, array $members) {
+
+ $this->groupMembers[$path] = $members;
+
+ }
+
+ /**
+ * Updates one ore more webdav properties on a principal.
+ *
+ * The list of mutations is supplied as an array. Each key in the array is
+ * a propertyname, such as {DAV:}displayname.
+ *
+ * Each value is the actual value to be updated. If a value is null, it
+ * must be deleted.
+ *
+ * This method should be atomic. It must either completely succeed, or
+ * completely fail. Success and failure can simply be returned as 'true' or
+ * 'false'.
+ *
+ * It is also possible to return detailed failure information. In that case
+ * an array such as this should be returned:
+ *
+ * array(
+ * 200 => array(
+ * '{DAV:}prop1' => null,
+ * ),
+ * 201 => array(
+ * '{DAV:}prop2' => null,
+ * ),
+ * 403 => array(
+ * '{DAV:}prop3' => null,
+ * ),
+ * 424 => array(
+ * '{DAV:}prop4' => null,
+ * ),
+ * );
+ *
+ * In this previous example prop1 was successfully updated or deleted, and
+ * prop2 was succesfully created.
+ *
+ * prop3 failed to update due to '403 Forbidden' and because of this prop4
+ * also could not be updated with '424 Failed dependency'.
+ *
+ * This last example was actually incorrect. While 200 and 201 could appear
+ * in 1 response, if there's any error (403) the other properties should
+ * always fail with 423 (failed dependency).
+ *
+ * But anyway, if you don't want to scratch your head over this, just
+ * return true or false.
+ *
+ * @param string $path
+ * @param array $mutations
+ * @return array|bool
+ */
+ public function updatePrincipal($path, $mutations) {
+
+ $value = null;
+ foreach($this->principals as $principalIndex=>$value) {
+ if ($value['uri'] === $path) {
+ $principal = $value;
+ break;
+ }
+ }
+ if (!$principal) return false;
+
+ foreach($mutations as $prop=>$value) {
+
+ if (is_null($value) && isset($principal[$prop])) {
+ unset($principal[$prop]);
+ } else {
+ $principal[$prop] = $value;
+ }
+
+ }
+
+ $this->principals[$principalIndex] = $principal;
+
+ return true;
+
+ }
+
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAVACL/PrincipalBackend/PDOMySQLTest.php b/vendor/sabre/dav/tests/Sabre/DAVACL/PrincipalBackend/PDOMySQLTest.php
new file mode 100644
index 000000000..84ba062ca
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAVACL/PrincipalBackend/PDOMySQLTest.php
@@ -0,0 +1,45 @@
+<?php
+
+namespace Sabre\DAVACL\PrincipalBackend;
+
+use Sabre\DAV;
+use Sabre\HTTP;
+
+
+require_once 'Sabre/TestUtil.php';
+
+class PDOMySQLTest extends AbstractPDOTest {
+
+ function getPDO() {
+
+ if (!SABRE_HASMYSQL) $this->markTestSkipped('MySQL driver is not available, or not properly configured');
+ $pdo = \Sabre\TestUtil::getMySQLDB();
+ if (!$pdo) $this->markTestSkipped('Could not connect to MySQL database');
+ $pdo->query("DROP TABLE IF EXISTS principals");
+ $pdo->query("
+create table principals (
+ id integer unsigned not null primary key auto_increment,
+ uri varchar(50),
+ email varchar(80),
+ displayname VARCHAR(80),
+ vcardurl VARCHAR(80),
+ unique(uri)
+);");
+
+ $pdo->query("INSERT INTO principals (uri,email,displayname) VALUES ('principals/user','user@example.org','User')");
+ $pdo->query("INSERT INTO principals (uri,email,displayname) VALUES ('principals/group','group@example.org','Group')");
+ $pdo->query("DROP TABLE IF EXISTS groupmembers");
+ $pdo->query("CREATE TABLE groupmembers (
+ id INTEGER UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ principal_id INTEGER UNSIGNED NOT NULL,
+ member_id INTEGER UNSIGNED NOT NULL,
+ UNIQUE(principal_id, member_id)
+ );");
+
+ $pdo->query("INSERT INTO groupmembers (principal_id,member_id) VALUES (2,1)");
+
+ return $pdo;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAVACL/PrincipalBackend/PDOSqliteTest.php b/vendor/sabre/dav/tests/Sabre/DAVACL/PrincipalBackend/PDOSqliteTest.php
new file mode 100644
index 000000000..192e188f9
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAVACL/PrincipalBackend/PDOSqliteTest.php
@@ -0,0 +1,42 @@
+<?php
+
+namespace Sabre\DAVACL\PrincipalBackend;
+
+use Sabre\DAV;
+use Sabre\HTTP;
+
+
+require_once 'Sabre/DAV/Auth/Backend/AbstractPDOTest.php';
+
+class PDOSQLiteTest extends AbstractPDOTest {
+
+ function tearDown() {
+
+ if (file_exists(SABRE_TEMPDIR . '/pdobackend')) unlink(SABRE_TEMPDIR . '/pdobackend');
+ if (file_exists(SABRE_TEMPDIR . '/pdobackend2')) unlink(SABRE_TEMPDIR . '/pdobackend2');
+
+ }
+
+ function getPDO() {
+
+ if (!SABRE_HASSQLITE) $this->markTestSkipped('SQLite driver is not available');
+ $pdo = new \PDO('sqlite:'.SABRE_TEMPDIR.'/pdobackend');
+ $pdo->setAttribute(\PDO::ATTR_ERRMODE,\PDO::ERRMODE_EXCEPTION);
+ $pdo->query('CREATE TABLE principals (id INTEGER PRIMARY KEY ASC, uri TEXT, email VARCHAR(80), displayname VARCHAR(80), vcardurl VARCHAR(80))');
+ $pdo->query('INSERT INTO principals VALUES (1, "principals/user","user@example.org","User",null)');
+ $pdo->query('INSERT INTO principals VALUES (2, "principals/group","group@example.org","Group",null)');
+
+ $pdo->query("CREATE TABLE groupmembers (
+ id INTEGER PRIMARY KEY ASC,
+ principal_id INT,
+ member_id INT,
+ UNIQUE(principal_id, member_id)
+ );");
+
+ $pdo->query("INSERT INTO groupmembers (principal_id,member_id) VALUES (2,1)");
+
+ return $pdo;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAVACL/PrincipalCollectionTest.php b/vendor/sabre/dav/tests/Sabre/DAVACL/PrincipalCollectionTest.php
new file mode 100644
index 000000000..10b0c04da
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAVACL/PrincipalCollectionTest.php
@@ -0,0 +1,52 @@
+<?php
+
+namespace Sabre\DAVACL;
+
+use Sabre\DAV;
+use Sabre\HTTP;
+
+
+class PrincipalCollectionTest extends \PHPUnit_Framework_TestCase {
+
+ public function testBasic() {
+
+ $backend = new PrincipalBackend\Mock();
+ $pc = new PrincipalCollection($backend);
+ $this->assertTrue($pc instanceof PrincipalCollection);
+
+ $this->assertEquals('principals',$pc->getName());
+
+ }
+
+ /**
+ * @depends testBasic
+ */
+ public function testGetChildren() {
+
+ $backend = new PrincipalBackend\Mock();
+ $pc = new PrincipalCollection($backend);
+
+ $children = $pc->getChildren();
+ $this->assertTrue(is_array($children));
+
+ foreach($children as $child) {
+ $this->assertTrue($child instanceof IPrincipal);
+ }
+
+ }
+
+ /**
+ * @depends testBasic
+ * @expectedException Sabre\DAV\Exception\MethodNotAllowed
+ */
+ public function testGetChildrenDisable() {
+
+ $backend = new PrincipalBackend\Mock();
+ $pc = new PrincipalCollection($backend);
+ $pc->disableListing = true;
+
+ $children = $pc->getChildren();
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAVACL/PrincipalPropertySearchTest.php b/vendor/sabre/dav/tests/Sabre/DAVACL/PrincipalPropertySearchTest.php
new file mode 100644
index 000000000..9c3be4f9a
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAVACL/PrincipalPropertySearchTest.php
@@ -0,0 +1,246 @@
+<?php
+
+namespace Sabre\DAVACL;
+
+use Sabre\DAV;
+use Sabre\HTTP;
+
+require_once 'Sabre/HTTP/ResponseMock.php';
+
+class PrincipalPropertySearchTest extends \PHPUnit_Framework_TestCase {
+
+ function getServer() {
+
+ $backend = new PrincipalBackend\Mock();
+
+ $dir = new DAV\SimpleCollection('root');
+ $principals = new PrincipalCollection($backend);
+ $dir->addChild($principals);
+
+ $fakeServer = new DAV\Server(new DAV\ObjectTree($dir));
+ $fakeServer->httpResponse = new HTTP\ResponseMock();
+ $fakeServer->debugExceptions = true;
+ $plugin = new MockPlugin($backend,'realm');
+ $plugin->allowAccessToNodesWithoutACL = true;
+
+ $this->assertTrue($plugin instanceof Plugin);
+ $fakeServer->addPlugin($plugin);
+ $this->assertEquals($plugin, $fakeServer->getPlugin('acl'));
+
+ return $fakeServer;
+
+ }
+
+ function testDepth1() {
+
+ $xml = '<?xml version="1.0"?>
+<d:principal-property-search xmlns:d="DAV:">
+ <d:property-search>
+ <d:prop>
+ <d:displayname />
+ </d:prop>
+ <d:match>user</d:match>
+ </d:property-search>
+ <d:prop>
+ <d:displayname />
+ <d:getcontentlength />
+ </d:prop>
+</d:principal-property-search>';
+
+ $serverVars = array(
+ 'REQUEST_METHOD' => 'REPORT',
+ 'HTTP_DEPTH' => '1',
+ 'REQUEST_URI' => '/principals',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody($xml);
+
+ $server = $this->getServer();
+ $server->httpRequest = $request;
+
+ $server->exec();
+
+ $this->assertEquals('HTTP/1.1 400 Bad request', $server->httpResponse->status);
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml; charset=utf-8',
+ ), $server->httpResponse->headers);
+
+ }
+
+
+ function testUnknownSearchField() {
+
+ $xml = '<?xml version="1.0"?>
+<d:principal-property-search xmlns:d="DAV:">
+ <d:property-search>
+ <d:prop>
+ <d:yourmom />
+ </d:prop>
+ <d:match>user</d:match>
+ </d:property-search>
+ <d:prop>
+ <d:displayname />
+ <d:getcontentlength />
+ </d:prop>
+</d:principal-property-search>';
+
+ $serverVars = array(
+ 'REQUEST_METHOD' => 'REPORT',
+ 'HTTP_DEPTH' => '0',
+ 'REQUEST_URI' => '/principals',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody($xml);
+
+ $server = $this->getServer();
+ $server->httpRequest = $request;
+
+ $server->exec();
+
+ $this->assertEquals('HTTP/1.1 207 Multi-Status', $server->httpResponse->status);
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml; charset=utf-8',
+ 'Vary' => 'Brief,Prefer',
+ ), $server->httpResponse->headers);
+
+ }
+
+ function testCorrect() {
+
+ $xml = '<?xml version="1.0"?>
+<d:principal-property-search xmlns:d="DAV:">
+ <d:apply-to-principal-collection-set />
+ <d:property-search>
+ <d:prop>
+ <d:displayname />
+ </d:prop>
+ <d:match>user</d:match>
+ </d:property-search>
+ <d:prop>
+ <d:displayname />
+ <d:getcontentlength />
+ </d:prop>
+</d:principal-property-search>';
+
+ $serverVars = array(
+ 'REQUEST_METHOD' => 'REPORT',
+ 'HTTP_DEPTH' => '0',
+ 'REQUEST_URI' => '/',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody($xml);
+
+ $server = $this->getServer();
+ $server->httpRequest = $request;
+
+ $server->exec();
+
+ $this->assertEquals('HTTP/1.1 207 Multi-Status', $server->httpResponse->status, $server->httpResponse->body);
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml; charset=utf-8',
+ 'Vary' => 'Brief,Prefer',
+ ), $server->httpResponse->headers);
+
+
+ $check = array(
+ '/d:multistatus',
+ '/d:multistatus/d:response' => 2,
+ '/d:multistatus/d:response/d:href' => 2,
+ '/d:multistatus/d:response/d:propstat' => 4,
+ '/d:multistatus/d:response/d:propstat/d:prop' => 4,
+ '/d:multistatus/d:response/d:propstat/d:prop/d:displayname' => 2,
+ '/d:multistatus/d:response/d:propstat/d:prop/d:getcontentlength' => 2,
+ '/d:multistatus/d:response/d:propstat/d:status' => 4,
+ );
+
+ $xml = simplexml_load_string($server->httpResponse->body);
+ $xml->registerXPathNamespace('d','DAV:');
+ foreach($check as $v1=>$v2) {
+
+ $xpath = is_int($v1)?$v2:$v1;
+
+ $result = $xml->xpath($xpath);
+
+ $count = 1;
+ if (!is_int($v1)) $count = $v2;
+
+ $this->assertEquals($count,count($result), 'we expected ' . $count . ' appearances of ' . $xpath . ' . We found ' . count($result) . '. Full response body: ' . $server->httpResponse->body);
+
+ }
+
+ }
+ function testWrongUri() {
+
+ $xml = '<?xml version="1.0"?>
+<d:principal-property-search xmlns:d="DAV:">
+ <d:property-search>
+ <d:prop>
+ <d:displayname />
+ </d:prop>
+ <d:match>user</d:match>
+ </d:property-search>
+ <d:prop>
+ <d:displayname />
+ <d:getcontentlength />
+ </d:prop>
+</d:principal-property-search>';
+
+ $serverVars = array(
+ 'REQUEST_METHOD' => 'REPORT',
+ 'HTTP_DEPTH' => '0',
+ 'REQUEST_URI' => '/',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody($xml);
+
+ $server = $this->getServer();
+ $server->httpRequest = $request;
+
+ $server->exec();
+
+ $this->assertEquals('HTTP/1.1 207 Multi-Status', $server->httpResponse->status, $server->httpResponse->body);
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml; charset=utf-8',
+ 'Vary' => 'Brief,Prefer',
+ ), $server->httpResponse->headers);
+
+
+ $check = array(
+ '/d:multistatus',
+ '/d:multistatus/d:response' => 0,
+ );
+
+ $xml = simplexml_load_string($server->httpResponse->body);
+ $xml->registerXPathNamespace('d','DAV:');
+ foreach($check as $v1=>$v2) {
+
+ $xpath = is_int($v1)?$v2:$v1;
+
+ $result = $xml->xpath($xpath);
+
+ $count = 1;
+ if (!is_int($v1)) $count = $v2;
+
+ $this->assertEquals($count,count($result), 'we expected ' . $count . ' appearances of ' . $xpath . ' . We found ' . count($result) . '. Full response body: ' . $server->httpResponse->body);
+
+ }
+
+ }
+}
+
+class MockPlugin extends Plugin {
+
+ function getCurrentUserPrivilegeSet($node) {
+
+ return array(
+ '{DAV:}read',
+ '{DAV:}write',
+ );
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAVACL/PrincipalSearchPropertySetTest.php b/vendor/sabre/dav/tests/Sabre/DAVACL/PrincipalSearchPropertySetTest.php
new file mode 100644
index 000000000..412389e8b
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAVACL/PrincipalSearchPropertySetTest.php
@@ -0,0 +1,135 @@
+<?php
+
+namespace Sabre\DAVACL;
+
+use Sabre\DAV;
+use Sabre\HTTP;
+
+require_once 'Sabre/HTTP/ResponseMock.php';
+
+class PrincipalSearchPropertySetTest extends \PHPUnit_Framework_TestCase {
+
+ function getServer() {
+
+ $backend = new PrincipalBackend\Mock();
+
+ $dir = new DAV\SimpleCollection('root');
+ $principals = new PrincipalCollection($backend);
+ $dir->addChild($principals);
+
+ $fakeServer = new DAV\Server(new DAV\ObjectTree($dir));
+ $fakeServer->httpResponse = new HTTP\ResponseMock();
+ $plugin = new Plugin($backend,'realm');
+ $this->assertTrue($plugin instanceof Plugin);
+ $fakeServer->addPlugin($plugin);
+ $this->assertEquals($plugin, $fakeServer->getPlugin('acl'));
+
+ return $fakeServer;
+
+ }
+
+ function testDepth1() {
+
+ $xml = '<?xml version="1.0"?>
+<d:principal-search-property-set xmlns:d="DAV:" />';
+
+ $serverVars = array(
+ 'REQUEST_METHOD' => 'REPORT',
+ 'HTTP_DEPTH' => '1',
+ 'REQUEST_URI' => '/principals',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody($xml);
+
+ $server = $this->getServer();
+ $server->httpRequest = $request;
+
+ $server->exec();
+
+ $this->assertEquals('HTTP/1.1 400 Bad request', $server->httpResponse->status);
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml; charset=utf-8',
+ ), $server->httpResponse->headers);
+
+ }
+
+ function testDepthIncorrectXML() {
+
+ $xml = '<?xml version="1.0"?>
+<d:principal-search-property-set xmlns:d="DAV:"><d:ohell /></d:principal-search-property-set>';
+
+ $serverVars = array(
+ 'REQUEST_METHOD' => 'REPORT',
+ 'HTTP_DEPTH' => '0',
+ 'REQUEST_URI' => '/principals',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody($xml);
+
+ $server = $this->getServer();
+ $server->httpRequest = $request;
+
+ $server->exec();
+
+ $this->assertEquals('HTTP/1.1 400 Bad request', $server->httpResponse->status, $server->httpResponse->body);
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml; charset=utf-8',
+ ), $server->httpResponse->headers);
+
+ }
+
+ function testCorrect() {
+
+ $xml = '<?xml version="1.0"?>
+<d:principal-search-property-set xmlns:d="DAV:"/>';
+
+ $serverVars = array(
+ 'REQUEST_METHOD' => 'REPORT',
+ 'HTTP_DEPTH' => '0',
+ 'REQUEST_URI' => '/principals',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody($xml);
+
+ $server = $this->getServer();
+ $server->httpRequest = $request;
+
+ $server->exec();
+
+ $this->assertEquals('HTTP/1.1 200 OK', $server->httpResponse->status, $server->httpResponse->body);
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml; charset=utf-8',
+ ), $server->httpResponse->headers);
+
+
+ $check = array(
+ '/d:principal-search-property-set',
+ '/d:principal-search-property-set/d:principal-search-property' => 2,
+ '/d:principal-search-property-set/d:principal-search-property/d:prop' => 2,
+ '/d:principal-search-property-set/d:principal-search-property/d:prop/d:displayname' => 1,
+ '/d:principal-search-property-set/d:principal-search-property/d:prop/s:email-address' => 1,
+ '/d:principal-search-property-set/d:principal-search-property/d:description' => 2,
+ );
+
+ $xml = simplexml_load_string($server->httpResponse->body);
+ $xml->registerXPathNamespace('d','DAV:');
+ $xml->registerXPathNamespace('s','http://sabredav.org/ns');
+ foreach($check as $v1=>$v2) {
+
+ $xpath = is_int($v1)?$v2:$v1;
+
+ $result = $xml->xpath($xpath);
+
+ $count = 1;
+ if (!is_int($v1)) $count = $v2;
+
+ $this->assertEquals($count,count($result), 'we expected ' . $count . ' appearances of ' . $xpath . ' . We found ' . count($result) . '. Full response body: ' . $server->httpResponse->body);
+
+ }
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAVACL/PrincipalTest.php b/vendor/sabre/dav/tests/Sabre/DAVACL/PrincipalTest.php
new file mode 100644
index 000000000..2d4371138
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAVACL/PrincipalTest.php
@@ -0,0 +1,204 @@
+<?php
+
+namespace Sabre\DAVACL;
+
+use Sabre\DAV;
+use Sabre\HTTP;
+
+class PrincipalTest extends \PHPUnit_Framework_TestCase {
+
+ public function testConstruct() {
+
+ $principalBackend = new PrincipalBackend\Mock();
+ $principal = new Principal($principalBackend, array('uri' => 'principals/admin'));
+ $this->assertTrue($principal instanceof Principal);
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception
+ */
+ public function testConstructNoUri() {
+
+ $principalBackend = new PrincipalBackend\Mock();
+ $principal = new Principal($principalBackend, array());
+
+ }
+
+ public function testGetName() {
+
+ $principalBackend = new PrincipalBackend\Mock();
+ $principal = new Principal($principalBackend, array('uri' => 'principals/admin'));
+ $this->assertEquals('admin',$principal->getName());
+
+ }
+
+ public function testGetDisplayName() {
+
+ $principalBackend = new PrincipalBackend\Mock();
+ $principal = new Principal($principalBackend, array('uri' => 'principals/admin'));
+ $this->assertEquals('admin',$principal->getDisplayname());
+
+ $principal = new Principal($principalBackend, array(
+ 'uri' => 'principals/admin',
+ '{DAV:}displayname' => 'Mr. Admin'
+ ));
+ $this->assertEquals('Mr. Admin',$principal->getDisplayname());
+
+ }
+
+ public function testGetProperties() {
+
+ $principalBackend = new PrincipalBackend\Mock();
+ $principal = new Principal($principalBackend, array(
+ 'uri' => 'principals/admin',
+ '{DAV:}displayname' => 'Mr. Admin',
+ '{http://www.example.org/custom}custom' => 'Custom',
+ '{http://sabredav.org/ns}email-address' => 'admin@example.org',
+ ));
+
+ $keys = array(
+ '{DAV:}displayname',
+ '{http://www.example.org/custom}custom',
+ '{http://sabredav.org/ns}email-address',
+ );
+ $props = $principal->getProperties($keys);
+
+ foreach($keys as $key) $this->assertArrayHasKey($key,$props);
+
+ $this->assertEquals('Mr. Admin',$props['{DAV:}displayname']);
+
+ $this->assertEquals('admin@example.org', $props['{http://sabredav.org/ns}email-address']);
+ }
+
+ public function testUpdateProperties() {
+
+ $principalBackend = new PrincipalBackend\Mock();
+ $principal = new Principal($principalBackend, array('uri' => 'principals/admin'));
+ $result = $principal->updateProperties(array('{DAV:}yourmom'=>'test'));
+ $this->assertEquals(true,$result);
+
+ }
+
+ public function testGetPrincipalUrl() {
+
+ $principalBackend = new PrincipalBackend\Mock();
+ $principal = new Principal($principalBackend, array('uri' => 'principals/admin'));
+ $this->assertEquals('principals/admin',$principal->getPrincipalUrl());
+
+ }
+
+ public function testGetAlternateUriSet() {
+
+ $principalBackend = new PrincipalBackend\Mock();
+ $principal = new Principal($principalBackend, array(
+ 'uri' => 'principals/admin',
+ '{DAV:}displayname' => 'Mr. Admin',
+ '{http://www.example.org/custom}custom' => 'Custom',
+ '{http://sabredav.org/ns}email-address' => 'admin@example.org',
+ '{DAV:}alternate-URI-set' => array(
+ 'mailto:admin+1@example.org',
+ 'mailto:admin+2@example.org',
+ 'mailto:admin@example.org',
+ ),
+ ));
+
+ $expected = array(
+ 'mailto:admin+1@example.org',
+ 'mailto:admin+2@example.org',
+ 'mailto:admin@example.org',
+ );
+
+ $this->assertEquals($expected,$principal->getAlternateUriSet());
+
+ }
+ public function testGetAlternateUriSetEmpty() {
+
+ $principalBackend = new PrincipalBackend\Mock();
+ $principal = new Principal($principalBackend, array(
+ 'uri' => 'principals/admin',
+ ));
+
+ $expected = array();
+
+ $this->assertEquals($expected,$principal->getAlternateUriSet());
+
+ }
+
+ public function testGetGroupMemberSet() {
+
+ $principalBackend = new PrincipalBackend\Mock();
+ $principal = new Principal($principalBackend, array('uri' => 'principals/admin'));
+ $this->assertEquals(array(),$principal->getGroupMemberSet());
+
+ }
+ public function testGetGroupMembership() {
+
+ $principalBackend = new PrincipalBackend\Mock();
+ $principal = new Principal($principalBackend, array('uri' => 'principals/admin'));
+ $this->assertEquals(array(),$principal->getGroupMembership());
+
+ }
+
+ public function testSetGroupMemberSet() {
+
+ $principalBackend = new PrincipalBackend\Mock();
+ $principal = new Principal($principalBackend, array('uri' => 'principals/admin'));
+ $principal->setGroupMemberSet(array('principals/foo'));
+
+ $this->assertEquals(array(
+ 'principals/admin' => array('principals/foo'),
+ ), $principalBackend->groupMembers);
+
+ }
+
+ public function testGetOwner() {
+
+ $principalBackend = new PrincipalBackend\Mock();
+ $principal = new Principal($principalBackend, array('uri' => 'principals/admin'));
+ $this->assertEquals('principals/admin',$principal->getOwner());
+
+ }
+
+ public function testGetGroup() {
+
+ $principalBackend = new PrincipalBackend\Mock();
+ $principal = new Principal($principalBackend, array('uri' => 'principals/admin'));
+ $this->assertNull($principal->getGroup());
+
+ }
+
+ public function testGetACl() {
+
+ $principalBackend = new PrincipalBackend\Mock();
+ $principal = new Principal($principalBackend, array('uri' => 'principals/admin'));
+ $this->assertEquals(array(
+ array(
+ 'privilege' => '{DAV:}read',
+ 'principal' => 'principals/admin',
+ 'protected' => true,
+ )
+ ),$principal->getACL());
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\MethodNotAllowed
+ */
+ public function testSetACl() {
+
+ $principalBackend = new PrincipalBackend\Mock();
+ $principal = new Principal($principalBackend, array('uri' => 'principals/admin'));
+ $principal->setACL(array());
+
+ }
+
+ public function testGetSupportedPrivilegeSet() {
+
+ $principalBackend = new PrincipalBackend\Mock();
+ $principal = new Principal($principalBackend, array('uri' => 'principals/admin'));
+ $this->assertNull($principal->getSupportedPrivilegeSet());
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAVACL/Property/ACLRestrictionsTest.php b/vendor/sabre/dav/tests/Sabre/DAVACL/Property/ACLRestrictionsTest.php
new file mode 100644
index 000000000..72a2f36a4
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAVACL/Property/ACLRestrictionsTest.php
@@ -0,0 +1,35 @@
+<?php
+
+namespace Sabre\DAVACL\Property;
+
+use Sabre\DAV;
+use Sabre\HTTP;
+
+class ACLRestrictionsTest extends \PHPUnit_Framework_TestCase {
+
+ function testConstruct() {
+
+ $prop = new AclRestrictions();
+
+ }
+
+ function testSerializeEmpty() {
+
+ $dom = new \DOMDocument('1.0');
+ $root = $dom->createElementNS('DAV:','d:root');
+
+ $dom->appendChild($root);
+
+ $acl = new AclRestrictions();
+ $acl->serialize(new DAV\Server(), $root);
+
+ $xml = $dom->saveXML();
+ $expected = '<?xml version="1.0"?>
+<d:root xmlns:d="DAV:"><d:grant-only/><d:no-invert/></d:root>
+';
+ $this->assertEquals($expected, $xml);
+
+ }
+
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAVACL/Property/ACLTest.php b/vendor/sabre/dav/tests/Sabre/DAVACL/Property/ACLTest.php
new file mode 100644
index 000000000..7f2014df3
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAVACL/Property/ACLTest.php
@@ -0,0 +1,335 @@
+<?php
+
+namespace Sabre\DAVACL\Property;
+
+use Sabre\DAV;
+use Sabre\HTTP;
+
+
+class ACLTest extends \PHPUnit_Framework_TestCase {
+
+ function testConstruct() {
+
+ $acl = new Acl(array());
+
+ }
+
+ function testSerializeEmpty() {
+
+ $dom = new \DOMDocument('1.0');
+ $root = $dom->createElementNS('DAV:','d:root');
+
+ $dom->appendChild($root);
+
+ $acl = new Acl(array());
+ $acl->serialize(new DAV\Server(), $root);
+
+ $xml = $dom->saveXML();
+ $expected = '<?xml version="1.0"?>
+<d:root xmlns:d="DAV:"/>
+';
+ $this->assertEquals($expected, $xml);
+
+ }
+
+ function testSerialize() {
+
+ $dom = new \DOMDocument('1.0');
+ $root = $dom->createElementNS('DAV:','d:root');
+
+ $dom->appendChild($root);
+
+ $privileges = array(
+ array(
+ 'principal' => 'principals/evert',
+ 'privilege' => '{DAV:}write',
+ 'uri' => 'articles',
+ ),
+ array(
+ 'principal' => 'principals/foo',
+ 'privilege' => '{DAV:}read',
+ 'uri' => 'articles',
+ 'protected' => true,
+ ),
+ );
+
+ $acl = new Acl($privileges);
+ $acl->serialize(new DAV\Server(), $root);
+
+ $dom->formatOutput = true;
+
+ $xml = $dom->saveXML();
+ $expected = '<?xml version="1.0"?>
+<d:root xmlns:d="DAV:">
+ <d:ace>
+ <d:principal>
+ <d:href>/principals/evert/</d:href>
+ </d:principal>
+ <d:grant>
+ <d:privilege>
+ <d:write/>
+ </d:privilege>
+ </d:grant>
+ </d:ace>
+ <d:ace>
+ <d:principal>
+ <d:href>/principals/foo/</d:href>
+ </d:principal>
+ <d:grant>
+ <d:privilege>
+ <d:read/>
+ </d:privilege>
+ </d:grant>
+ <d:protected/>
+ </d:ace>
+</d:root>
+';
+ $this->assertEquals($expected, $xml);
+
+ }
+
+ function testSerializeSpecialPrincipals() {
+
+ $dom = new \DOMDocument('1.0');
+ $root = $dom->createElementNS('DAV:','d:root');
+
+ $dom->appendChild($root);
+
+ $privileges = array(
+ array(
+ 'principal' => '{DAV:}authenticated',
+ 'privilege' => '{DAV:}write',
+ 'uri' => 'articles',
+ ),
+ array(
+ 'principal' => '{DAV:}unauthenticated',
+ 'privilege' => '{DAV:}write',
+ 'uri' => 'articles',
+ ),
+ array(
+ 'principal' => '{DAV:}all',
+ 'privilege' => '{DAV:}write',
+ 'uri' => 'articles',
+ ),
+
+ );
+
+ $acl = new Acl($privileges);
+ $acl->serialize(new DAV\Server(), $root);
+
+ $dom->formatOutput = true;
+
+ $xml = $dom->saveXML();
+ $expected = '<?xml version="1.0"?>
+<d:root xmlns:d="DAV:">
+ <d:ace>
+ <d:principal>
+ <d:authenticated/>
+ </d:principal>
+ <d:grant>
+ <d:privilege>
+ <d:write/>
+ </d:privilege>
+ </d:grant>
+ </d:ace>
+ <d:ace>
+ <d:principal>
+ <d:unauthenticated/>
+ </d:principal>
+ <d:grant>
+ <d:privilege>
+ <d:write/>
+ </d:privilege>
+ </d:grant>
+ </d:ace>
+ <d:ace>
+ <d:principal>
+ <d:all/>
+ </d:principal>
+ <d:grant>
+ <d:privilege>
+ <d:write/>
+ </d:privilege>
+ </d:grant>
+ </d:ace>
+</d:root>
+';
+ $this->assertEquals($expected, $xml);
+
+ }
+
+ function testUnserialize() {
+
+ $source = '<?xml version="1.0"?>
+<d:root xmlns:d="DAV:">
+ <d:ace>
+ <d:principal>
+ <d:href>/principals/evert/</d:href>
+ </d:principal>
+ <d:grant>
+ <d:privilege>
+ <d:write/>
+ </d:privilege>
+ </d:grant>
+ </d:ace>
+ <d:ace>
+ <d:principal>
+ <d:href>/principals/foo/</d:href>
+ </d:principal>
+ <d:grant>
+ <d:privilege>
+ <d:read/>
+ </d:privilege>
+ </d:grant>
+ <d:protected/>
+ </d:ace>
+</d:root>
+';
+
+ $dom = DAV\XMLUtil::loadDOMDocument($source);
+ $result = Acl::unserialize($dom->firstChild);
+
+ $this->assertInstanceOf('Sabre\\DAVACL\\Property\\ACL', $result);
+
+ $expected = array(
+ array(
+ 'principal' => '/principals/evert/',
+ 'protected' => false,
+ 'privilege' => '{DAV:}write',
+ ),
+ array(
+ 'principal' => '/principals/foo/',
+ 'protected' => true,
+ 'privilege' => '{DAV:}read',
+ ),
+ );
+
+ $this->assertEquals($expected, $result->getPrivileges());
+
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\BadRequest
+ */
+ function testUnserializeNoPrincipal() {
+
+ $source = '<?xml version="1.0"?>
+<d:root xmlns:d="DAV:">
+ <d:ace>
+ <d:grant>
+ <d:privilege>
+ <d:write/>
+ </d:privilege>
+ </d:grant>
+ </d:ace>
+</d:root>
+';
+
+ $dom = DAV\XMLUtil::loadDOMDocument($source);
+ Acl::unserialize($dom->firstChild);
+
+ }
+
+ function testUnserializeOtherPrincipal() {
+
+ $source = '<?xml version="1.0"?>
+<d:root xmlns:d="DAV:">
+ <d:ace>
+ <d:grant>
+ <d:privilege>
+ <d:write/>
+ </d:privilege>
+ </d:grant>
+ <d:principal><d:authenticated /></d:principal>
+ </d:ace>
+ <d:ace>
+ <d:grant>
+ <d:privilege>
+ <d:write/>
+ </d:privilege>
+ </d:grant>
+ <d:principal><d:unauthenticated /></d:principal>
+ </d:ace>
+ <d:ace>
+ <d:grant>
+ <d:privilege>
+ <d:write/>
+ </d:privilege>
+ </d:grant>
+ <d:principal><d:all /></d:principal>
+ </d:ace>
+</d:root>
+';
+
+ $dom = DAV\XMLUtil::loadDOMDocument($source);
+ $result = Acl::unserialize($dom->firstChild);
+
+ $this->assertInstanceOf('Sabre\\DAVACL\\Property\\Acl', $result);
+
+ $expected = array(
+ array(
+ 'principal' => '{DAV:}authenticated',
+ 'protected' => false,
+ 'privilege' => '{DAV:}write',
+ ),
+ array(
+ 'principal' => '{DAV:}unauthenticated',
+ 'protected' => false,
+ 'privilege' => '{DAV:}write',
+ ),
+ array(
+ 'principal' => '{DAV:}all',
+ 'protected' => false,
+ 'privilege' => '{DAV:}write',
+ ),
+ );
+
+ $this->assertEquals($expected, $result->getPrivileges());
+
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\NotImplemented
+ */
+ function testUnserializeDeny() {
+
+ $source = '<?xml version="1.0"?>
+<d:root xmlns:d="DAV:">
+ <d:ace>
+ <d:deny>
+ <d:privilege>
+ <d:write/>
+ </d:privilege>
+ </d:deny>
+ <d:principal><d:href>/principals/evert</d:href></d:principal>
+ </d:ace>
+</d:root>
+';
+
+ $dom = DAV\XMLUtil::loadDOMDocument($source);
+ Acl::unserialize($dom->firstChild);
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\BadRequest
+ */
+ function testUnserializeMissingPriv() {
+
+ $source = '<?xml version="1.0"?>
+<d:root xmlns:d="DAV:">
+ <d:ace>
+ <d:grant>
+ <d:privilege />
+ </d:grant>
+ <d:principal><d:href>/principals/evert</d:href></d:principal>
+ </d:ace>
+</d:root>
+';
+
+ $dom = DAV\XMLUtil::loadDOMDocument($source);
+ Acl::unserialize($dom->firstChild);
+
+ }
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAVACL/Property/CurrentUserPrivilegeSetTest.php b/vendor/sabre/dav/tests/Sabre/DAVACL/Property/CurrentUserPrivilegeSetTest.php
new file mode 100644
index 000000000..e71addb65
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAVACL/Property/CurrentUserPrivilegeSetTest.php
@@ -0,0 +1,68 @@
+<?php
+
+namespace Sabre\DAVACL\Property;
+
+use Sabre\DAV;
+use Sabre\HTTP;
+
+
+class CurrentUserPrivilegeSetTest extends \PHPUnit_Framework_TestCase {
+
+ function testSerialize() {
+
+ $privileges = array(
+ '{DAV:}read',
+ '{DAV:}write',
+ );
+ $prop = new CurrentUserPrivilegeSet($privileges);
+
+ $server = new DAV\Server();
+ $dom = new \DOMDocument('1.0','utf-8');
+ $root = $dom->createElementNS('DAV:','d:root');
+ $dom->appendChild($root);
+
+ $prop->serialize($server, $root);
+
+ $xpaths = array(
+ '/d:root' => 1,
+ '/d:root/d:privilege' => 2,
+ '/d:root/d:privilege/d:read' => 1,
+ '/d:root/d:privilege/d:write' => 1,
+ );
+
+ // Reloading because PHP DOM sucks
+ $dom2 = new \DOMDocument('1.0', 'utf-8');
+ $dom2->loadXML($dom->saveXML());
+
+ $dxpath = new \DOMXPath($dom2);
+ $dxpath->registerNamespace('d','DAV:');
+ foreach($xpaths as $xpath=>$count) {
+
+ $this->assertEquals($count, $dxpath->query($xpath)->length, 'Looking for : ' . $xpath . ', we could only find ' . $dxpath->query($xpath)->length . ' elements, while we expected ' . $count);
+
+ }
+
+ }
+
+ function testUnserialize() {
+
+ $source = '<?xml version="1.0"?>
+<d:root xmlns:d="DAV:">
+ <d:privilege>
+ <d:write-properties />
+ </d:privilege>
+ <d:privilege>
+ <d:read />
+ </d:privilege>
+</d:root>
+';
+
+ $dom = DAV\XMLUtil::loadDOMDocument($source);
+ $result = CurrentUserPrivilegeSet::unserialize($dom->firstChild, array());
+ $this->assertTrue($result->has('{DAV:}read'));
+ $this->assertTrue($result->has('{DAV:}write-properties'));
+ $this->assertFalse($result->has('{DAV:}bind'));
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAVACL/Property/PrincipalTest.php b/vendor/sabre/dav/tests/Sabre/DAVACL/Property/PrincipalTest.php
new file mode 100644
index 000000000..be12c79ee
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAVACL/Property/PrincipalTest.php
@@ -0,0 +1,181 @@
+<?php
+
+namespace Sabre\DAVACL\Property;
+
+use Sabre\DAV;
+use Sabre\HTTP;
+
+class PrincipalTest extends \PHPUnit_Framework_TestCase {
+
+ function testSimple() {
+
+ $principal = new Principal(Principal::UNAUTHENTICATED);
+ $this->assertEquals(Principal::UNAUTHENTICATED, $principal->getType());
+ $this->assertNull($principal->getHref());
+
+ $principal = new Principal(Principal::AUTHENTICATED);
+ $this->assertEquals(Principal::AUTHENTICATED, $principal->getType());
+ $this->assertNull($principal->getHref());
+
+ $principal = new Principal(Principal::HREF,'admin');
+ $this->assertEquals(Principal::HREF, $principal->getType());
+ $this->assertEquals('admin',$principal->getHref());
+
+ }
+
+ /**
+ * @depends testSimple
+ * @expectedException Sabre\DAV\Exception
+ */
+ function testNoHref() {
+
+ $principal = new Principal(Principal::HREF);
+
+ }
+
+ /**
+ * @depends testSimple
+ */
+ function testSerializeUnAuthenticated() {
+
+ $prin = new Principal(Principal::UNAUTHENTICATED);
+
+ $doc = new \DOMDocument();
+ $root = $doc->createElement('d:principal');
+ $root->setAttribute('xmlns:d','DAV:');
+
+ $doc->appendChild($root);
+ $objectTree = new DAV\ObjectTree(new DAV\SimpleCollection('rootdir'));
+ $server = new DAV\Server($objectTree);
+
+ $prin->serialize($server, $root);
+
+ $xml = $doc->saveXML();
+
+ $this->assertEquals(
+'<?xml version="1.0"?>
+<d:principal xmlns:d="DAV:">' .
+'<d:unauthenticated/>' .
+'</d:principal>
+', $xml);
+
+ }
+
+
+ /**
+ * @depends testSerializeUnAuthenticated
+ */
+ function testSerializeAuthenticated() {
+
+ $prin = new Principal(Principal::AUTHENTICATED);
+
+ $doc = new \DOMDocument();
+ $root = $doc->createElement('d:principal');
+ $root->setAttribute('xmlns:d','DAV:');
+
+ $doc->appendChild($root);
+ $objectTree = new DAV\ObjectTree(new DAV\SimpleCollection('rootdir'));
+ $server = new DAV\Server($objectTree);
+
+ $prin->serialize($server, $root);
+
+ $xml = $doc->saveXML();
+
+ $this->assertEquals(
+'<?xml version="1.0"?>
+<d:principal xmlns:d="DAV:">' .
+'<d:authenticated/>' .
+'</d:principal>
+', $xml);
+
+ }
+
+
+ /**
+ * @depends testSerializeUnAuthenticated
+ */
+ function testSerializeHref() {
+
+ $prin = new Principal(Principal::HREF,'principals/admin');
+
+ $doc = new \DOMDocument();
+ $root = $doc->createElement('d:principal');
+ $root->setAttribute('xmlns:d','DAV:');
+
+ $doc->appendChild($root);
+ $objectTree = new DAV\ObjectTree(new DAV\SimpleCollection('rootdir'));
+ $server = new DAV\Server($objectTree);
+
+ $prin->serialize($server, $root);
+
+ $xml = $doc->saveXML();
+
+ $this->assertEquals(
+'<?xml version="1.0"?>
+<d:principal xmlns:d="DAV:">' .
+'<d:href>/principals/admin</d:href>' .
+'</d:principal>
+', $xml);
+
+ }
+
+ function testUnserializeHref() {
+
+ $xml = '<?xml version="1.0"?>
+<d:principal xmlns:d="DAV:">' .
+'<d:href>/principals/admin</d:href>' .
+'</d:principal>';
+
+ $dom = DAV\XMLUtil::loadDOMDocument($xml);
+
+ $principal = Principal::unserialize($dom->firstChild);
+ $this->assertEquals(Principal::HREF, $principal->getType());
+ $this->assertEquals('/principals/admin', $principal->getHref());
+
+ }
+
+ function testUnserializeAuthenticated() {
+
+ $xml = '<?xml version="1.0"?>
+<d:principal xmlns:d="DAV:">' .
+' <d:authenticated />' .
+'</d:principal>';
+
+ $dom = DAV\XMLUtil::loadDOMDocument($xml);
+
+ $principal = Principal::unserialize($dom->firstChild);
+ $this->assertEquals(Principal::AUTHENTICATED, $principal->getType());
+
+ }
+
+ function testUnserializeUnauthenticated() {
+
+ $xml = '<?xml version="1.0"?>
+<d:principal xmlns:d="DAV:">' .
+' <d:unauthenticated />' .
+'</d:principal>';
+
+ $dom = DAV\XMLUtil::loadDOMDocument($xml);
+
+ $principal = Principal::unserialize($dom->firstChild);
+ $this->assertEquals(Principal::UNAUTHENTICATED, $principal->getType());
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\BadRequest
+ */
+ function testUnserializeUnknown() {
+
+ $xml = '<?xml version="1.0"?>
+<d:principal xmlns:d="DAV:">' .
+' <d:foo />' .
+'</d:principal>';
+
+ $dom = DAV\XMLUtil::loadDOMDocument($xml);
+
+ Principal::unserialize($dom->firstChild);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAVACL/Property/SupportedPrivilegeSetTest.php b/vendor/sabre/dav/tests/Sabre/DAVACL/Property/SupportedPrivilegeSetTest.php
new file mode 100644
index 000000000..943316331
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAVACL/Property/SupportedPrivilegeSetTest.php
@@ -0,0 +1,106 @@
+<?php
+
+namespace Sabre\DAVACL\Property;
+
+use Sabre\DAV;
+use Sabre\HTTP;
+
+
+
+class SupportedPrivilegeSetTest extends \PHPUnit_Framework_TestCase {
+
+ function testSimple() {
+
+ $prop = new SupportedPrivilegeSet(array(
+ 'privilege' => '{DAV:}all',
+ ));
+
+ }
+
+
+ /**
+ * @depends testSimple
+ */
+ function testSerializeSimple() {
+
+ $prop = new SupportedPrivilegeSet(array(
+ 'privilege' => '{DAV:}all',
+ ));
+
+ $doc = new \DOMDocument();
+ $root = $doc->createElementNS('DAV:', 'd:supported-privilege-set');
+
+ $doc->appendChild($root);
+
+ $server = new DAV\Server();
+ $prop->serialize($server, $root);
+
+ $xml = $doc->saveXML();
+
+ $this->assertEquals(
+'<?xml version="1.0"?>
+<d:supported-privilege-set xmlns:d="DAV:">' .
+'<d:supported-privilege>' .
+'<d:privilege>' .
+'<d:all/>' .
+'</d:privilege>' .
+'</d:supported-privilege>' .
+'</d:supported-privilege-set>
+', $xml);
+
+ }
+
+ /**
+ * @depends testSimple
+ */
+ function testSerializeAggregate() {
+
+ $prop = new SupportedPrivilegeSet(array(
+ 'privilege' => '{DAV:}all',
+ 'abstract' => true,
+ 'aggregates' => array(
+ array(
+ 'privilege' => '{DAV:}read',
+ ),
+ array(
+ 'privilege' => '{DAV:}write',
+ 'description' => 'booh',
+ ),
+ ),
+ ));
+
+ $doc = new \DOMDocument();
+ $root = $doc->createElementNS('DAV:', 'd:supported-privilege-set');
+
+ $doc->appendChild($root);
+
+ $server = new DAV\Server();
+ $prop->serialize($server, $root);
+
+ $xml = $doc->saveXML();
+
+ $this->assertEquals(
+'<?xml version="1.0"?>
+<d:supported-privilege-set xmlns:d="DAV:">' .
+'<d:supported-privilege>' .
+'<d:privilege>' .
+'<d:all/>' .
+'</d:privilege>' .
+'<d:abstract/>' .
+'<d:supported-privilege>' .
+'<d:privilege>' .
+'<d:read/>' .
+'</d:privilege>' .
+'</d:supported-privilege>' .
+'<d:supported-privilege>' .
+'<d:privilege>' .
+'<d:write/>' .
+'</d:privilege>' .
+'<d:description>booh</d:description>' .
+'</d:supported-privilege>' .
+'</d:supported-privilege>' .
+'</d:supported-privilege-set>
+', $xml);
+
+ }
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAVACL/SimplePluginTest.php b/vendor/sabre/dav/tests/Sabre/DAVACL/SimplePluginTest.php
new file mode 100644
index 000000000..04ed5c330
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAVACL/SimplePluginTest.php
@@ -0,0 +1,322 @@
+<?php
+
+namespace Sabre\DAVACL;
+
+use Sabre\DAV;
+use Sabre\HTTP;
+
+
+require_once 'Sabre/DAVACL/MockPrincipal.php';
+require_once 'Sabre/DAVACL/MockACLNode.php';
+
+class SimplePluginTest extends \PHPUnit_Framework_TestCase {
+
+ function testValues() {
+
+ $aclPlugin = new Plugin();
+ $this->assertEquals('acl',$aclPlugin->getPluginName());
+ $this->assertEquals(
+ array('access-control', 'calendarserver-principal-property-search'),
+ $aclPlugin->getFeatures()
+ );
+
+ $this->assertEquals(
+ array(
+ '{DAV:}expand-property',
+ '{DAV:}principal-property-search',
+ '{DAV:}principal-search-property-set'
+ ),
+ $aclPlugin->getSupportedReportSet(''));
+
+ $this->assertEquals(array('ACL'), $aclPlugin->getMethods(''));
+
+ }
+
+ function testGetFlatPrivilegeSet() {
+
+ $expected = array(
+ '{DAV:}all' => array(
+ 'privilege' => '{DAV:}all',
+ 'abstract' => true,
+ 'aggregates' => array(
+ '{DAV:}read',
+ '{DAV:}write',
+ ),
+ 'concrete' => null,
+ ),
+ '{DAV:}read' => array(
+ 'privilege' => '{DAV:}read',
+ 'abstract' => false,
+ 'aggregates' => array(
+ '{DAV:}read-acl',
+ '{DAV:}read-current-user-privilege-set',
+ ),
+ 'concrete' => '{DAV:}read',
+ ),
+ '{DAV:}read-acl' => array(
+ 'privilege' => '{DAV:}read-acl',
+ 'abstract' => true,
+ 'aggregates' => array(),
+ 'concrete' => '{DAV:}read',
+ ),
+ '{DAV:}read-current-user-privilege-set' => array(
+ 'privilege' => '{DAV:}read-current-user-privilege-set',
+ 'abstract' => true,
+ 'aggregates' => array(),
+ 'concrete' => '{DAV:}read',
+ ),
+ '{DAV:}write' => array(
+ 'privilege' => '{DAV:}write',
+ 'abstract' => false,
+ 'aggregates' => array(
+ '{DAV:}write-acl',
+ '{DAV:}write-properties',
+ '{DAV:}write-content',
+ '{DAV:}bind',
+ '{DAV:}unbind',
+ '{DAV:}unlock',
+ ),
+ 'concrete' => '{DAV:}write',
+ ),
+ '{DAV:}write-acl' => array(
+ 'privilege' => '{DAV:}write-acl',
+ 'abstract' => true,
+ 'aggregates' => array(),
+ 'concrete' => '{DAV:}write',
+ ),
+ '{DAV:}write-properties' => array(
+ 'privilege' => '{DAV:}write-properties',
+ 'abstract' => true,
+ 'aggregates' => array(),
+ 'concrete' => '{DAV:}write',
+ ),
+ '{DAV:}write-content' => array(
+ 'privilege' => '{DAV:}write-content',
+ 'abstract' => true,
+ 'aggregates' => array(),
+ 'concrete' => '{DAV:}write',
+ ),
+ '{DAV:}unlock' => array(
+ 'privilege' => '{DAV:}unlock',
+ 'abstract' => true,
+ 'aggregates' => array(),
+ 'concrete' => '{DAV:}write',
+ ),
+ '{DAV:}bind' => array(
+ 'privilege' => '{DAV:}bind',
+ 'abstract' => true,
+ 'aggregates' => array(),
+ 'concrete' => '{DAV:}write',
+ ),
+ '{DAV:}unbind' => array(
+ 'privilege' => '{DAV:}unbind',
+ 'abstract' => true,
+ 'aggregates' => array(),
+ 'concrete' => '{DAV:}write',
+ ),
+
+ );
+
+ $plugin = new Plugin();
+ $server = new DAV\Server();
+ $server->addPlugin($plugin);
+ $this->assertEquals($expected, $plugin->getFlatPrivilegeSet(''));
+
+ }
+
+ function testCurrentUserPrincipalsNotLoggedIn() {
+
+ $acl = new Plugin();
+ $server = new DAV\Server();
+ $server->addPlugin($acl);
+
+ $this->assertEquals(array(),$acl->getCurrentUserPrincipals());
+
+ }
+
+ function testCurrentUserPrincipalsSimple() {
+
+ $tree = array(
+
+ new DAV\SimpleCollection('principals', array(
+ new MockPrincipal('admin','principals/admin'),
+ ))
+
+ );
+
+ $acl = new Plugin();
+ $server = new DAV\Server($tree);
+ $server->addPlugin($acl);
+
+ $auth = new DAV\Auth\Plugin(new DAV\Auth\Backend\Mock(),'SabreDAV');
+ $server->addPlugin($auth);
+
+ //forcing login
+ $auth->beforeMethod('GET','/');
+
+ $this->assertEquals(array('principals/admin'),$acl->getCurrentUserPrincipals());
+
+ }
+
+ function testCurrentUserPrincipalsGroups() {
+
+ $tree = array(
+
+ new DAV\SimpleCollection('principals', array(
+ new MockPrincipal('admin','principals/admin',array('principals/administrators', 'principals/everyone')),
+ new MockPrincipal('administrators','principals/administrators',array('principals/groups'), array('principals/admin')),
+ new MockPrincipal('everyone','principals/everyone',array(), array('principals/admin')),
+ new MockPrincipal('groups','principals/groups',array(), array('principals/administrators')),
+ ))
+
+ );
+
+ $acl = new Plugin();
+ $server = new DAV\Server($tree);
+ $server->addPlugin($acl);
+
+ $auth = new DAV\Auth\Plugin(new DAV\Auth\Backend\Mock(),'SabreDAV');
+ $server->addPlugin($auth);
+
+ //forcing login
+ $auth->beforeMethod('GET','/');
+
+ $expected = array(
+ 'principals/admin',
+ 'principals/administrators',
+ 'principals/everyone',
+ 'principals/groups',
+ );
+
+ $this->assertEquals($expected,$acl->getCurrentUserPrincipals());
+
+ // The second one should trigger the cache and be identical
+ $this->assertEquals($expected,$acl->getCurrentUserPrincipals());
+
+ }
+
+ function testGetACL() {
+
+ $acl = array(
+ array(
+ 'principal' => 'principals/admin',
+ 'privilege' => '{DAV:}read',
+ ),
+ array(
+ 'principal' => 'principals/admin',
+ 'privilege' => '{DAV:}write',
+ ),
+ );
+
+
+ $tree = array(
+ new MockACLNode('foo',$acl),
+ );
+
+ $server = new DAV\Server($tree);
+ $aclPlugin = new Plugin();
+ $server->addPlugin($aclPlugin);
+
+ $this->assertEquals($acl,$aclPlugin->getACL('foo'));
+
+ }
+
+ function testGetCurrentUserPrivilegeSet() {
+
+ $acl = array(
+ array(
+ 'principal' => 'principals/admin',
+ 'privilege' => '{DAV:}read',
+ ),
+ array(
+ 'principal' => 'principals/user1',
+ 'privilege' => '{DAV:}read',
+ ),
+ array(
+ 'principal' => 'principals/admin',
+ 'privilege' => '{DAV:}write',
+ ),
+ );
+
+
+ $tree = array(
+ new MockACLNode('foo',$acl),
+
+ new DAV\SimpleCollection('principals', array(
+ new MockPrincipal('admin','principals/admin'),
+ )),
+
+ );
+
+ $server = new DAV\Server($tree);
+ $aclPlugin = new Plugin();
+ $server->addPlugin($aclPlugin);
+
+ $auth = new DAV\Auth\Plugin(new DAV\Auth\Backend\Mock(),'SabreDAV');
+ $server->addPlugin($auth);
+
+ //forcing login
+ $auth->beforeMethod('GET','/');
+
+ $expected = array(
+ '{DAV:}write',
+ '{DAV:}write-acl',
+ '{DAV:}write-properties',
+ '{DAV:}write-content',
+ '{DAV:}bind',
+ '{DAV:}unbind',
+ '{DAV:}unlock',
+ '{DAV:}read',
+ '{DAV:}read-acl',
+ '{DAV:}read-current-user-privilege-set',
+ );
+
+ $this->assertEquals($expected,$aclPlugin->getCurrentUserPrivilegeSet('foo'));
+
+ }
+
+ function testCheckPrivileges() {
+
+ $acl = array(
+ array(
+ 'principal' => 'principals/admin',
+ 'privilege' => '{DAV:}read',
+ ),
+ array(
+ 'principal' => 'principals/user1',
+ 'privilege' => '{DAV:}read',
+ ),
+ array(
+ 'principal' => 'principals/admin',
+ 'privilege' => '{DAV:}write',
+ ),
+ );
+
+
+ $tree = array(
+ new MockACLNode('foo',$acl),
+
+ new DAV\SimpleCollection('principals', array(
+ new MockPrincipal('admin','principals/admin'),
+ )),
+
+ );
+
+ $server = new DAV\Server($tree);
+ $aclPlugin = new Plugin();
+ $server->addPlugin($aclPlugin);
+
+ $auth = new DAV\Auth\Plugin(new DAV\Auth\Backend\Mock(),'SabreDAV');
+ $server->addPlugin($auth);
+
+ //forcing login
+ //$auth->beforeMethod('GET','/');
+
+ $this->assertFalse($aclPlugin->checkPrivileges('foo', array('{DAV:}read'), Plugin::R_PARENT, false));
+
+ }
+}
+
+
+
+
diff --git a/vendor/sabre/dav/tests/Sabre/DAVACL/VersionTest.php b/vendor/sabre/dav/tests/Sabre/DAVACL/VersionTest.php
new file mode 100644
index 000000000..c432527dc
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAVACL/VersionTest.php
@@ -0,0 +1,17 @@
+<?php
+
+namespace Sabre\DAVACL;
+
+class VersionTest extends \PHPUnit_Framework_TestCase {
+
+ function testString() {
+
+ $v = Version::VERSION;
+ $this->assertEquals(-1, version_compare('1.0.0',$v));
+
+ $s = Version::STABILITY;
+ $this->assertTrue($s == 'alpha' || $s == 'beta' || $s =='stable');
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAVServerTest.php b/vendor/sabre/dav/tests/Sabre/DAVServerTest.php
new file mode 100644
index 000000000..5dc72fda0
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAVServerTest.php
@@ -0,0 +1,179 @@
+<?php
+
+namespace Sabre;
+
+require_once 'Sabre/HTTP/ResponseMock.php';
+require_once 'Sabre/CalDAV/Backend/Mock.php';
+require_once 'Sabre/CardDAV/Backend/Mock.php';
+require_once 'Sabre/DAVACL/PrincipalBackend/Mock.php';
+require_once 'Sabre/DAV/Auth/Backend/Mock.php';
+
+/**
+ * This class may be used as a basis for other webdav-related unittests.
+ *
+ * This class is supposed to provide a reasonably big framework to quickly get
+ * a testing environment running.
+ *
+ * @package Sabre
+ * @copyright Copyright (C) 2007-2013 Rooftop Solutions. All rights reserved.
+ * @author Evert Pot (http://www.rooftopsolutions.nl/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+abstract class DAVServerTest extends \PHPUnit_Framework_TestCase {
+
+ protected $setupCalDAV = false;
+ protected $setupCardDAV = false;
+ protected $setupACL = false;
+ protected $setupCalDAVSharing = false;
+
+ protected $caldavCalendars = array();
+ protected $caldavCalendarObjects = array();
+
+ protected $carddavAddressBooks = array();
+ protected $carddavCards = array();
+
+ /**
+ * @var Sabre\DAV\Server
+ */
+ protected $server;
+ protected $tree = array();
+
+ protected $caldavBackend;
+ protected $carddavBackend;
+ protected $principalBackend;
+
+ /**
+ * @var Sabre\CalDAV\Plugin
+ */
+ protected $caldavPlugin;
+
+ /**
+ * @var Sabre\CardDAV\Plugin
+ */
+ protected $carddavPlugin;
+
+ /**
+ * @var Sabre\DAVACL\Plugin
+ */
+ protected $aclPlugin;
+
+ /**
+ * @var Sabre\CalDAV\SharingPlugin
+ */
+ protected $caldavSharingPlugin;
+
+ /**
+ * @var Sabre\DAV\Auth\Plugin
+ */
+ protected $authPlugin;
+
+ /**
+ * If this string is set, we will automatically log in the user with this
+ * name.
+ */
+ protected $autoLogin = null;
+
+ function setUp() {
+
+ $this->setUpBackends();
+ $this->setUpTree();
+
+ $this->server = new DAV\Server($this->tree);
+ $this->server->debugExceptions = true;
+
+ if ($this->setupCalDAV) {
+ $this->caldavPlugin = new CalDAV\Plugin();
+ $this->server->addPlugin($this->caldavPlugin);
+ }
+ if ($this->setupCalDAVSharing) {
+ $this->caldavSharingPlugin = new CalDAV\SharingPlugin();
+ $this->server->addPlugin($this->caldavSharingPlugin);
+ }
+ if ($this->setupCardDAV) {
+ $this->carddavPlugin = new CardDAV\Plugin();
+ $this->server->addPlugin($this->carddavPlugin);
+ }
+ if ($this->setupACL) {
+ $this->aclPlugin = new DAVACL\Plugin();
+ $this->server->addPlugin($this->aclPlugin);
+ }
+ if ($this->autoLogin) {
+ $authBackend = new DAV\Auth\Backend\Mock();
+ $authBackend->defaultUser = $this->autoLogin;
+ $this->authPlugin = new DAV\Auth\Plugin($authBackend, 'SabreDAV');
+ $this->server->addPlugin($this->authPlugin);
+
+ // This will trigger the actual login procedure
+ $this->authPlugin->beforeMethod('OPTIONS','/');
+ }
+
+ }
+
+ /**
+ * Makes a request, and returns a response object.
+ *
+ * You can either pass an instance of Sabre\HTTP\Request, or an array,
+ * which will then be used as the _SERVER array.
+ *
+ * @param array|\Sabre\HTTP\Request $request
+ * @return \Sabre\HTTP\Response
+ */
+ function request($request) {
+
+ if (is_array($request)) {
+ $request = new HTTP\Request($request);
+ }
+ $this->server->httpRequest = $request;
+ $this->server->httpResponse = new HTTP\ResponseMock();
+ $this->server->exec();
+
+ return $this->server->httpResponse;
+
+ }
+
+ function setUpTree() {
+
+ if ($this->setupCalDAV) {
+ $this->tree[] = new CalDAV\CalendarRootNode(
+ $this->principalBackend,
+ $this->caldavBackend
+ );
+ }
+ if ($this->setupCardDAV) {
+ $this->tree[] = new CardDAV\AddressBookRoot(
+ $this->principalBackend,
+ $this->carddavBackend
+ );
+ }
+
+ if ($this->setupCardDAV || $this->setupCalDAV) {
+ $this->tree[] = new DAVACL\PrincipalCollection(
+ $this->principalBackend
+ );
+ }
+
+ }
+
+ function setUpBackends() {
+
+ if ($this->setupCalDAV && is_null($this->caldavBackend)) {
+ $this->caldavBackend = new CalDAV\Backend\Mock($this->caldavCalendars, $this->caldavCalendarObjects);
+ }
+ if ($this->setupCardDAV && is_null($this->carddavBackend)) {
+ $this->carddavBackend = new CardDAV\Backend\Mock($this->carddavAddressBooks, $this->carddavCards);
+ }
+ if ($this->setupCardDAV || $this->setupCalDAV) {
+ $this->principalBackend = new DAVACL\PrincipalBackend\Mock();
+ }
+
+ }
+
+
+ function assertHTTPStatus($expectedStatus, HTTP\Request $req) {
+
+ $resp = $this->request($req);
+ $this->assertEquals($resp->getStatusMessage($expectedStatus), $resp->status,'Incorrect HTTP status received: ' . $resp->body);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/HTTP/AWSAuthTest.php b/vendor/sabre/dav/tests/Sabre/HTTP/AWSAuthTest.php
new file mode 100644
index 000000000..569ec2e7d
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/HTTP/AWSAuthTest.php
@@ -0,0 +1,242 @@
+<?php
+
+namespace Sabre\HTTP;
+
+require_once 'Sabre/HTTP/ResponseMock.php';
+
+class AWSAuthTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * @var Sabre\HTTP\ResponseMock
+ */
+ private $response;
+ /**
+ * @var Sabre\HTTP\AWSAuth
+ */
+ private $auth;
+
+ const REALM = 'SabreDAV unittest';
+
+ public function setUp() {
+
+ $this->response = new ResponseMock();
+ $this->auth = new AWSAuth();
+ $this->auth->setRealm(self::REALM);
+ $this->auth->setHTTPResponse($this->response);
+
+ }
+
+ public function testNoHeader() {
+
+ $request = new Request(array(
+ 'REQUEST_METHOD' => 'GET',
+ ));
+
+ $this->auth->setHTTPRequest($request);
+
+ $result = $this->auth->init();
+
+ $this->assertFalse($result,'No AWS Authorization header was supplied, so we should have gotten false');
+ $this->assertEquals(AWSAuth::ERR_NOAWSHEADER,$this->auth->errorCode);
+
+ }
+
+ public function testIncorrectContentMD5() {
+
+ $accessKey = 'accessKey';
+ $secretKey = 'secretKey';
+
+ $request = new Request(array(
+ 'REQUEST_METHOD' => 'GET',
+ 'HTTP_AUTHORIZATION' => "AWS $accessKey:sig",
+ 'HTTP_CONTENT_MD5' => 'garbage',
+ 'REQUEST_URI' => '/',
+ ));
+
+ $this->auth->setHTTPRequest($request);
+ $this->auth->init();
+ $result = $this->auth->validate($secretKey);
+
+ $this->assertFalse($result);
+ $this->assertEquals(AWSAuth::ERR_MD5CHECKSUMWRONG,$this->auth->errorCode);
+
+ }
+
+ public function testNoDate() {
+
+ $accessKey = 'accessKey';
+ $secretKey = 'secretKey';
+ $content = 'thisisthebody';
+ $contentMD5 = base64_encode(md5($content,true));
+
+
+ $request = new Request(array(
+ 'REQUEST_METHOD' => 'POST',
+ 'HTTP_AUTHORIZATION' => "AWS $accessKey:sig",
+ 'HTTP_CONTENT_MD5' => $contentMD5,
+ ));
+
+ $request->setBody($content);
+
+ $this->auth->setHTTPRequest($request);
+ $this->auth->init();
+ $result = $this->auth->validate($secretKey);
+
+ $this->assertFalse($result);
+ $this->assertEquals(AWSAuth::ERR_INVALIDDATEFORMAT,$this->auth->errorCode);
+
+ }
+
+ public function testFutureDate() {
+
+ $accessKey = 'accessKey';
+ $secretKey = 'secretKey';
+ $content = 'thisisthebody';
+ $contentMD5 = base64_encode(md5($content,true));
+
+ $date = new \DateTime('@' . (time() + (60*20)));
+ $date->setTimeZone(new \DateTimeZone('GMT'));
+ $date = $date->format('D, d M Y H:i:s \\G\\M\\T');
+
+ $request = new Request(array(
+ 'REQUEST_METHOD' => 'POST',
+ 'HTTP_AUTHORIZATION' => "AWS $accessKey:sig",
+ 'HTTP_CONTENT_MD5' => $contentMD5,
+ 'HTTP_DATE' => $date,
+ ));
+
+ $request->setBody($content);
+
+ $this->auth->setHTTPRequest($request);
+ $this->auth->init();
+ $result = $this->auth->validate($secretKey);
+
+ $this->assertFalse($result);
+ $this->assertEquals(AWSAuth::ERR_REQUESTTIMESKEWED,$this->auth->errorCode);
+
+ }
+
+ public function testPastDate() {
+
+ $accessKey = 'accessKey';
+ $secretKey = 'secretKey';
+ $content = 'thisisthebody';
+ $contentMD5 = base64_encode(md5($content,true));
+
+ $date = new \DateTime('@' . (time() - (60*20)));
+ $date->setTimeZone(new \DateTimeZone('GMT'));
+ $date = $date->format('D, d M Y H:i:s \\G\\M\\T');
+
+ $request = new Request(array(
+ 'REQUEST_METHOD' => 'POST',
+ 'HTTP_AUTHORIZATION' => "AWS $accessKey:sig",
+ 'HTTP_CONTENT_MD5' => $contentMD5,
+ 'HTTP_X_AMZ_DATE' => $date,
+ ));
+
+ $request->setBody($content);
+
+ $this->auth->setHTTPRequest($request);
+ $this->auth->init();
+ $result = $this->auth->validate($secretKey);
+
+ $this->assertFalse($result);
+ $this->assertEquals(AWSAuth::ERR_REQUESTTIMESKEWED,$this->auth->errorCode);
+
+ }
+
+ public function testIncorrectSignature() {
+
+ $accessKey = 'accessKey';
+ $secretKey = 'secretKey';
+ $content = 'thisisthebody';
+
+ $contentMD5 = base64_encode(md5($content,true));
+
+ $date = new \DateTime('now');
+ $date->setTimeZone(new \DateTimeZone('GMT'));
+ $date = $date->format('D, d M Y H:i:s \\G\\M\\T');
+
+ $request = new Request(array(
+ 'REQUEST_METHOD' => 'POST',
+ 'HTTP_AUTHORIZATION' => "AWS $accessKey:sig",
+ 'HTTP_CONTENT_MD5' => $contentMD5,
+ 'HTTP_X_AMZ_DATE' => $date,
+ 'REQUEST_URI' => '/',
+ ));
+
+ $request->setBody($content);
+
+ $this->auth->setHTTPRequest($request);
+ $this->auth->init();
+ $result = $this->auth->validate($secretKey);
+
+ $this->assertFalse($result);
+ $this->assertEquals(AWSAuth::ERR_INVALIDSIGNATURE,$this->auth->errorCode);
+
+ }
+
+ public function testValidRequest() {
+
+ $accessKey = 'accessKey';
+ $secretKey = 'secretKey';
+ $content = 'thisisthebody';
+ $contentMD5 = base64_encode(md5($content,true));
+
+ $date = new \DateTime('now');
+ $date->setTimeZone(new \DateTimeZone('GMT'));
+ $date = $date->format('D, d M Y H:i:s \\G\\M\\T');
+
+
+ $sig = base64_encode($this->hmacsha1($secretKey,
+ "POST\n$contentMD5\n\n$date\nx-amz-date:$date\n/evert"
+ ));
+
+ $request = new Request(array(
+ 'REQUEST_METHOD' => 'POST',
+ 'HTTP_AUTHORIZATION' => "AWS $accessKey:$sig",
+ 'HTTP_CONTENT_MD5' => $contentMD5,
+ 'HTTP_X_AMZ_DATE' => $date,
+ 'REQUEST_URI' => '/evert',
+ ));
+
+ $request->setBody($content);
+
+ $this->auth->setHTTPRequest($request);
+ $this->auth->init();
+ $result = $this->auth->validate($secretKey);
+
+ $this->assertTrue($result,'Signature did not validate, got errorcode ' . $this->auth->errorCode);
+ $this->assertEquals($accessKey,$this->auth->getAccessKey());
+
+ }
+
+ public function test401() {
+
+ $this->auth->requireLogin();
+ $test = preg_match('/^AWS$/',$this->response->headers['WWW-Authenticate'],$matches);
+ $this->assertTrue($test==true,'The WWW-Authenticate response didn\'t match our pattern');
+
+ }
+
+ /**
+ * Generates an HMAC-SHA1 signature
+ *
+ * @param string $key
+ * @param string $message
+ * @return string
+ */
+ private function hmacsha1($key, $message) {
+
+ $blocksize=64;
+ if (strlen($key)>$blocksize)
+ $key=pack('H*', sha1($key));
+ $key=str_pad($key,$blocksize,chr(0x00));
+ $ipad=str_repeat(chr(0x36),$blocksize);
+ $opad=str_repeat(chr(0x5c),$blocksize);
+ $hmac = pack('H*',sha1(($key^$opad).pack('H*',sha1(($key^$ipad).$message))));
+ return $hmac;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/HTTP/BasicAuthTest.php b/vendor/sabre/dav/tests/Sabre/HTTP/BasicAuthTest.php
new file mode 100644
index 000000000..77c5c7179
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/HTTP/BasicAuthTest.php
@@ -0,0 +1,132 @@
+<?php
+
+namespace Sabre\HTTP;
+
+require_once 'Sabre/HTTP/ResponseMock.php';
+
+class BasicAuthTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * @var Sabre\HTTP\ResponseMock
+ */
+ private $response;
+ /**
+ * @var Sabre\HTTP\BasicAuth
+ */
+ private $basicAuth;
+
+ function setUp() {
+
+ $this->response = new ResponseMock();
+ $this->basicAuth = new BasicAuth();
+ $this->basicAuth->setHTTPResponse($this->response);
+
+ }
+
+ function testGetUserPassApache() {
+
+ $server = array(
+ 'PHP_AUTH_USER' => 'admin',
+ 'PHP_AUTH_PW' => '1234',
+ );
+
+ $request = new Request($server);
+ $this->basicAuth->setHTTPRequest($request);
+
+ $userPass = $this->basicAuth->getUserPass();
+
+ $this->assertEquals(
+ array('admin','1234'),
+ $userPass,
+ 'We did not get the username and password we expected'
+ );
+
+ }
+
+ function testGetUserPassIIS() {
+
+ $server = array(
+ 'HTTP_AUTHORIZATION' => 'Basic ' . base64_encode('admin:1234'),
+ );
+
+ $request = new Request($server);
+ $this->basicAuth->setHTTPRequest($request);
+
+ $userPass = $this->basicAuth->getUserPass();
+
+ $this->assertEquals(
+ array('admin','1234'),
+ $userPass,
+ 'We did not get the username and password we expected'
+ );
+
+ }
+
+ function testGetUserPassWithColon() {
+
+ $server = array(
+ 'HTTP_AUTHORIZATION' => 'Basic ' . base64_encode('admin:1234:5678'),
+ );
+
+ $request = new Request($server);
+ $this->basicAuth->setHTTPRequest($request);
+
+ $userPass = $this->basicAuth->getUserPass();
+
+ $this->assertEquals(
+ array('admin','1234:5678'),
+ $userPass,
+ 'We did not get the username and password we expected'
+ );
+
+ }
+
+ function testGetUserPassApacheEdgeCase() {
+
+ $server = array(
+ 'REDIRECT_HTTP_AUTHORIZATION' => 'Basic ' . base64_encode('admin:1234'),
+ );
+
+ $request = new Request($server);
+ $this->basicAuth->setHTTPRequest($request);
+
+ $userPass = $this->basicAuth->getUserPass();
+
+ $this->assertEquals(
+ array('admin','1234'),
+ $userPass,
+ 'We did not get the username and password we expected'
+ );
+
+ }
+
+ function testGetUserPassNothing() {
+
+ $this->assertEquals(
+ false,
+ $this->basicAuth->getUserPass()
+ );
+
+ }
+
+ function testRequireLogin() {
+
+ $this->basicAuth->requireLogin();
+ $this->assertEquals('SabreDAV',$this->basicAuth->getRealm());
+ $this->assertEquals(
+ 'HTTP/1.1 401 Unauthorized',
+ $this->response->status,
+ 'We expected a 401 status to be set'
+ );
+
+ $this->assertEquals(
+ 'Basic realm="SabreDAV"',
+ $this->response->headers['WWW-Authenticate'],
+ 'The WWW-Autenticate header was not set!'
+ );
+
+
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/HTTP/DigestAuthTest.php b/vendor/sabre/dav/tests/Sabre/HTTP/DigestAuthTest.php
new file mode 100644
index 000000000..576a00d4a
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/HTTP/DigestAuthTest.php
@@ -0,0 +1,228 @@
+<?php
+
+namespace Sabre\HTTP;
+
+require_once 'Sabre/HTTP/ResponseMock.php';
+
+class DigestAuthTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * @var Sabre\HTTP\ResponseMock
+ */
+ private $response;
+ /**
+ * @var Sabre\HTTP\DigestAuth
+ */
+ private $auth;
+
+ const REALM = 'SabreDAV unittest';
+
+ public function setUp() {
+
+ $this->response = new ResponseMock();
+ $this->auth = new DigestAuth();
+ $this->auth->setRealm(self::REALM);
+ $this->auth->setHTTPResponse($this->response);
+
+ }
+
+ public function testDigest() {
+
+ list($nonce,$opaque) = $this->getServerTokens();
+
+ $username = 'admin';
+ $password = 12345;
+ $nc = '00002';
+ $cnonce = uniqid();
+
+ $digestHash = md5(
+ md5($username . ':' . self::REALM . ':' . $password) . ':' .
+ $nonce . ':' .
+ $nc . ':' .
+ $cnonce . ':' .
+ 'auth:' .
+ md5('GET' . ':' . '/')
+ );
+
+ $request = new Request(array(
+ 'REQUEST_METHOD' => 'GET',
+ 'PHP_AUTH_DIGEST' => 'username="'.$username.'", realm="' . self::REALM . '", nonce="' . $nonce . '", uri="/", response="' . $digestHash . '", opaque="' . $opaque . '", qop=auth,nc='.$nc.',cnonce="' . $cnonce . '"',
+ ));
+
+ $this->auth->setHTTPRequest($request);
+ $this->auth->init();
+
+ $this->assertEquals($username,$this->auth->getUserName());
+ $this->assertEquals(self::REALM,$this->auth->getRealm());
+ $this->assertTrue($this->auth->validateA1(md5($username . ':' . self::REALM . ':' . $password)),'Authentication is deemed invalid through validateA1');
+ $this->assertTrue($this->auth->validatePassword($password),'Authentication is deemed invalid through validatePassword');
+
+ }
+
+ public function testDigestCGIFormat() {
+
+ list($nonce,$opaque) = $this->getServerTokens();
+
+ $username = 'admin';
+ $password = 12345;
+ $nc = '00002';
+ $cnonce = uniqid();
+
+ $digestHash = md5(
+ md5($username . ':' . self::REALM . ':' . $password) . ':' .
+ $nonce . ':' .
+ $nc . ':' .
+ $cnonce . ':' .
+ 'auth:' .
+ md5('GET' . ':' . '/')
+ );
+
+ $request = new Request(array(
+ 'REQUEST_METHOD' => 'GET',
+ 'HTTP_AUTHORIZATION' => 'Digest username="'.$username.'", realm="' . self::REALM . '", nonce="' . $nonce . '", uri="/", response="' . $digestHash . '", opaque="' . $opaque . '", qop=auth,nc='.$nc.',cnonce="' . $cnonce . '"',
+ ));
+
+ $this->auth->setHTTPRequest($request);
+ $this->auth->init();
+
+ $this->assertTrue($this->auth->validateA1(md5($username . ':' . self::REALM . ':' . $password)),'Authentication is deemed invalid through validateA1');
+ $this->assertTrue($this->auth->validatePassword($password),'Authentication is deemed invalid through validatePassword');
+
+ }
+
+ public function testDigestApacheEdgeCase() {
+
+ list($nonce,$opaque) = $this->getServerTokens();
+
+ $username = 'admin';
+ $password = 12345;
+ $nc = '00002';
+ $cnonce = uniqid();
+
+ $digestHash = md5(
+ md5($username . ':' . self::REALM . ':' . $password) . ':' .
+ $nonce . ':' .
+ $nc . ':' .
+ $cnonce . ':' .
+ 'auth:' .
+ md5('GET' . ':' . '/')
+ );
+
+ $request = new Request(array(
+ 'REQUEST_METHOD' => 'GET',
+ 'REDIRECT_HTTP_AUTHORIZATION' => 'Digest username="'.$username.'", realm="' . self::REALM . '", nonce="' . $nonce . '", uri="/", response="' . $digestHash . '", opaque="' . $opaque . '", qop=auth,nc='.$nc.',cnonce="' . $cnonce . '"',
+ ));
+
+ $this->auth->setHTTPRequest($request);
+ $this->auth->init();
+
+ $this->assertTrue($this->auth->validateA1(md5($username . ':' . self::REALM . ':' . $password)),'Authentication is deemed invalid through validateA1');
+ $this->assertTrue($this->auth->validatePassword($password),'Authentication is deemed invalid through validatePassword');
+
+ }
+
+ public function testInvalidDigest() {
+
+ list($nonce,$opaque) = $this->getServerTokens();
+
+ $username = 'admin';
+ $password = 12345;
+ $nc = '00002';
+ $cnonce = uniqid();
+
+ $digestHash = md5(
+ md5($username . ':' . self::REALM . ':' . $password) . ':' .
+ $nonce . ':' .
+ $nc . ':' .
+ $cnonce . ':' .
+ 'auth:' .
+ md5('GET' . ':' . '/')
+ );
+
+ $request = new Request(array(
+ 'REQUEST_METHOD' => 'GET',
+ 'PHP_AUTH_DIGEST' => 'username="'.$username.'", realm="' . self::REALM . '", nonce="' . $nonce . '", uri="/", response="' . $digestHash . '", opaque="' . $opaque . '", qop=auth,nc='.$nc.',cnonce="' . $cnonce . '"',
+ ));
+
+ $this->auth->setHTTPRequest($request);
+ $this->auth->init();
+
+ $this->assertFalse($this->auth->validateA1(md5($username . ':' . self::REALM . ':' . ($password . 'randomness'))),'Authentication is deemed invalid through validateA1');
+
+ }
+
+ public function testInvalidDigest2() {
+
+ $request = new Request(array(
+ 'REQUEST_METHOD' => 'GET',
+ 'HTTP_AUTHORIZATION' => 'basic blablabla',
+ ));
+
+ $this->auth->setHTTPRequest($request);
+ $this->auth->init();
+
+ $this->assertFalse($this->auth->validateA1(md5('user:realm:password')));
+
+ }
+
+
+ public function testDigestAuthInt() {
+
+ $this->auth->setQOP(DigestAuth::QOP_AUTHINT | DigestAuth::QOP_AUTH);
+ list($nonce,$opaque) = $this->getServerTokens(DigestAuth::QOP_AUTHINT| DigestAuth::QOP_AUTH);
+
+ $username = 'admin';
+ $password = 12345;
+ $nc = '00003';
+ $cnonce = uniqid();
+
+ $digestHash = md5(
+ md5($username . ':' . self::REALM . ':' . $password) . ':' .
+ $nonce . ':' .
+ $nc . ':' .
+ $cnonce . ':' .
+ 'auth-int:' .
+ md5('POST' . ':' . '/' . ':' . md5('body'))
+ );
+
+ $request = new Request(array(
+ 'REQUEST_METHOD' => 'POST',
+ 'PHP_AUTH_DIGEST' => 'username="'.$username.'", realm="' . self::REALM . '", nonce="' . $nonce . '", uri="/", response="' . $digestHash . '", opaque="' . $opaque . '", qop=auth-int,nc='.$nc.',cnonce="' . $cnonce . '"',
+ ));
+ $request->setBody('body');
+
+ $this->auth->setHTTPRequest($request);
+
+ $this->auth->init();
+
+ $this->assertTrue($this->auth->validateA1(md5($username . ':' . self::REALM . ':' . $password)),'Authentication is deemed invalid through validateA1');
+
+ }
+
+ private function getServerTokens($qop = DigestAuth::QOP_AUTH) {
+
+ $this->auth->requireLogin();
+
+ switch($qop) {
+ case DigestAuth::QOP_AUTH : $qopstr='auth'; break;
+ case DigestAuth::QOP_AUTHINT : $qopstr='auth-int'; break;
+ default : $qopstr='auth,auth-int'; break;
+ }
+
+ $test = preg_match('/Digest realm="'.self::REALM.'",qop="'.$qopstr.'",nonce="([0-9a-f]*)",opaque="([0-9a-f]*)"/',
+ $this->response->headers['WWW-Authenticate'],$matches);
+
+ $this->assertTrue($test==true,'The WWW-Authenticate response didn\'t match our pattern. We received: ' . $this->response->headers['WWW-Authenticate']);
+
+ $nonce = $matches[1];
+ $opaque = $matches[2];
+
+ // Reset our environment
+ $this->setUp();
+ $this->auth->setQOP($qop);
+
+ return array($nonce,$opaque);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/HTTP/RequestTest.php b/vendor/sabre/dav/tests/Sabre/HTTP/RequestTest.php
new file mode 100644
index 000000000..c52ce351d
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/HTTP/RequestTest.php
@@ -0,0 +1,150 @@
+<?php
+
+namespace Sabre\HTTP;
+
+/**
+ * @covers Sabre\HTTP\Request
+ */
+class RequestTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * @var Sabre\HTTP\Request
+ */
+ private $request;
+
+ function setUp() {
+
+ $server = array(
+ 'HTTP_HOST' => 'www.example.org',
+ 'REQUEST_METHOD' => 'PUT',
+ 'REQUEST_URI' => '/testuri/',
+ 'CONTENT_TYPE' => 'text/xml',
+ );
+
+ $this->request = new Request($server);
+
+ }
+
+ function testGetHeader() {
+
+ $this->assertEquals('www.example.org', $this->request->getHeader('Host'));
+ $this->assertEquals('text/xml', $this->request->getHeader('Content-Type'));
+
+ }
+
+ function testGetNonExistantHeader() {
+
+ $this->assertNull($this->request->getHeader('doesntexist'));
+ $this->assertNull($this->request->getHeader('Content-Length'));
+
+ }
+
+ function testGetHeaders() {
+
+ $expected = array(
+ 'host' => 'www.example.org',
+ 'content-type' => 'text/xml',
+ );
+
+ $this->assertEquals($expected, $this->request->getHeaders());
+
+ }
+
+ function testGetMethod() {
+
+ $this->assertEquals('PUT', $this->request->getMethod(), 'It seems as if we didn\'t get a valid HTTP Request method back');
+
+ }
+
+ function testGetUri() {
+
+ $this->assertEquals('/testuri/', $this->request->getUri(), 'We got an invalid uri back');
+
+ }
+
+ function testSetGetBody() {
+
+ $h = fopen('php://memory','r+');
+ fwrite($h,'testing');
+ rewind($h);
+ $this->request->setBody($h);
+ $this->assertEquals('testing',$this->request->getBody(true),'We didn\'t get our testbody back');
+
+ }
+
+ function testSetGetBodyStream() {
+
+ $h = fopen('php://memory','r+');
+ fwrite($h,'testing');
+ rewind($h);
+ $this->request->setBody($h);
+ $this->assertEquals('testing',stream_get_contents($this->request->getBody()),'We didn\'t get our testbody back');
+
+ }
+
+
+ function testDefaultInputStream() {
+
+ $h = fopen('php://memory','r+');
+ fwrite($h,'testing');
+ rewind($h);
+
+ $previousValue = Request::$defaultInputStream;
+ Request::$defaultInputStream = $h;
+
+ $this->assertEquals('testing',$this->request->getBody(true),'We didn\'t get our testbody back');
+ Request::$defaultInputStream = $previousValue;
+
+ }
+
+ function testGetAbsoluteUri() {
+
+ $s = array(
+ 'HTTP_HOST' => 'sabredav.org',
+ 'REQUEST_URI' => '/foo'
+ );
+
+ $r = new Request($s);
+
+ $this->assertEquals('http://sabredav.org/foo', $r->getAbsoluteUri());
+
+ $s = array(
+ 'HTTP_HOST' => 'sabredav.org',
+ 'REQUEST_URI' => '/foo',
+ 'HTTPS' => 'on',
+ );
+
+ $r = new Request($s);
+
+ $this->assertEquals('https://sabredav.org/foo', $r->getAbsoluteUri());
+
+ }
+
+ function testGetQueryString() {
+
+ $s = array(
+ 'QUERY_STRING' => 'bla',
+ );
+
+ $r = new Request($s);
+ $this->assertEquals('bla', $r->getQueryString());
+
+ $s = array();
+
+ $r = new Request($s);
+ $this->assertEquals('', $r->getQueryString());
+
+ }
+
+ function testGetPostVars() {
+
+ $post = array(
+ 'bla' => 'foo',
+ );
+ $r = new Request(array(),$post);
+ $this->assertEquals($post, $r->getPostVars('bla'));
+
+ }
+
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/HTTP/ResponseMock.php b/vendor/sabre/dav/tests/Sabre/HTTP/ResponseMock.php
new file mode 100644
index 000000000..16c034099
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/HTTP/ResponseMock.php
@@ -0,0 +1,29 @@
+<?php
+
+namespace Sabre\HTTP;
+
+class ResponseMock extends Response {
+
+ public $headers = array();
+ public $status = '';
+ public $body = '';
+
+ function setHeader($name,$value,$overwrite = true) {
+
+ $this->headers[$name] = $value;
+
+ }
+
+ function sendStatus($code) {
+
+ $this->status = $this->getStatusMessage($code, $this->defaultHttpVersion);
+
+ }
+
+ function sendBody($body) {
+
+ $this->body = $body;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/HTTP/ResponseTest.php b/vendor/sabre/dav/tests/Sabre/HTTP/ResponseTest.php
new file mode 100644
index 000000000..f5302c993
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/HTTP/ResponseTest.php
@@ -0,0 +1,70 @@
+<?php
+
+namespace Sabre\HTTP;
+
+require_once 'Sabre/HTTP/ResponseMock.php';
+
+class ResponseTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * @var Sabre\HTTP\ResponseMock
+ */
+ private $response;
+
+ function setUp() {
+
+ $this->response = new ResponseMock();
+
+ }
+
+ function testGetStatusMessage() {
+
+ $msg = $this->response->getStatusMessage(200);
+ $this->assertEquals('HTTP/1.1 200 OK',$msg);
+
+ }
+
+ function testSetHeader() {
+
+ $this->response->setHeader('Content-Type','text/html');
+ $this->assertEquals('text/html', $this->response->headers['Content-Type']);
+
+
+ }
+ function testSetHeaders() {
+
+ $this->response->setHeaders(array('Content-Type'=>'text/html'));
+ $this->assertEquals('text/html', $this->response->headers['Content-Type']);
+
+
+ }
+
+ function testSendStatus() {
+
+ $this->response->sendStatus(404);
+ $this->assertEquals('HTTP/1.1 404 Not Found', $this->response->status);
+
+ }
+
+ function testSendBody() {
+
+ ob_start();
+ $response = new Response();
+ $response->sendBody('hello');
+ $this->assertEquals('hello',ob_get_clean());
+
+ }
+
+ function testSendBodyStream() {
+
+ ob_start();
+ $stream = fopen('php://memory','r+');
+ fwrite($stream,'hello');
+ rewind($stream);
+ $response = new Response();
+ $response->sendBody($stream);
+ $this->assertEquals('hello',ob_get_clean());
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/HTTP/UtilTest.php b/vendor/sabre/dav/tests/Sabre/HTTP/UtilTest.php
new file mode 100644
index 000000000..47a7b98bd
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/HTTP/UtilTest.php
@@ -0,0 +1,78 @@
+<?php
+
+namespace Sabre\HTTP;
+
+class UtilTest extends \PHPUnit_Framework_TestCase {
+
+ function testParseHTTPDate() {
+
+ $times = array(
+ 'Wed, 13 Oct 2010 10:26:00 GMT',
+ 'Wednesday, 13-Oct-10 10:26:00 GMT',
+ 'Wed Oct 13 10:26:00 2010',
+ );
+
+ $expected = 1286965560;
+
+ foreach($times as $time) {
+ $result = Util::parseHTTPDate($time);
+ $this->assertEquals($expected, $result->format('U'));
+ }
+
+ $result = Util::parseHTTPDate('Wed Oct 6 10:26:00 2010');
+ $this->assertEquals(1286360760, $result->format('U'));
+
+ }
+
+ function testParseHTTPDateFail() {
+
+ $times = array(
+ //random string
+ 'NOW',
+ // not-GMT timezone
+ 'Wednesday, 13-Oct-10 10:26:00 UTC',
+ // No space before the 6
+ 'Wed Oct 6 10:26:00 2010',
+ );
+
+ foreach($times as $time) {
+ $this->assertFalse(Util::parseHTTPDate($time), 'We used the string: ' . $time);
+ }
+
+ }
+
+ function testTimezones() {
+
+ $default = date_default_timezone_get();
+ date_default_timezone_set('Europe/Amsterdam');
+
+ $this->testParseHTTPDate();
+
+ date_default_timezone_set($default);
+
+ }
+
+ function testToHTTPDate() {
+
+ $dt = new \DateTime('2011-12-10 12:00:00 +0200');
+
+ $this->assertEquals(
+ 'Sat, 10 Dec 2011 10:00:00 GMT',
+ Util::toHTTPDate($dt)
+ );
+
+ }
+
+ function testStrtotimeFail() {
+
+ // Strtotime may return -1 when the date cannot be parsed.
+ // We are simulating this situation by testing a date that actually
+ // results in -1. (because I have found no other way to break this
+ // code)
+
+ $time = 'Wed, 13 Oct 1960 10:26:00 GMT';
+
+ $this->assertNull(Util::parseHTTPDate($time));
+
+ }
+}
diff --git a/vendor/sabre/dav/tests/Sabre/HTTP/VersionTest.php b/vendor/sabre/dav/tests/Sabre/HTTP/VersionTest.php
new file mode 100644
index 000000000..c7094b3bc
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/HTTP/VersionTest.php
@@ -0,0 +1,17 @@
+<?php
+
+namespace Sabre\HTTP;
+
+class VersionTest extends \PHPUnit_Framework_TestCase {
+
+ function testString() {
+
+ $v = Version::VERSION;
+ $this->assertEquals(-1, version_compare('1.0.0',$v));
+
+ $s = Version::STABILITY;
+ $this->assertTrue($s == 'alpha' || $s == 'beta' || $s =='stable');
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/TestUtil.php b/vendor/sabre/dav/tests/Sabre/TestUtil.php
new file mode 100644
index 000000000..5a9062498
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/TestUtil.php
@@ -0,0 +1,51 @@
+<?php
+
+namespace Sabre;
+
+class TestUtil {
+
+ /**
+ * This function deletes all the contents of the temporary directory.
+ *
+ * @return void
+ */
+ static function clearTempDir() {
+
+ self::deleteTree(SABRE_TEMPDIR,false);
+
+ }
+
+
+ static private function deleteTree($path,$deleteRoot = true) {
+
+ foreach(scandir($path) as $node) {
+
+ if ($node=='.' || $node=='..') continue;
+ $myPath = $path.'/'. $node;
+ if (is_file($myPath)) {
+ unlink($myPath);
+ } else {
+ self::deleteTree($myPath);
+ }
+
+ }
+ if ($deleteRoot) {
+ rmdir($path);
+ }
+
+ }
+
+ static function getMySQLDB() {
+
+ try {
+ $pdo = new \PDO(SABRE_MYSQLDSN,SABRE_MYSQLUSER,SABRE_MYSQLPASS);
+ $pdo->setAttribute(\PDO::ATTR_ERRMODE,\PDO::ERRMODE_EXCEPTION);
+ return $pdo;
+ } catch (\PDOException $e) {
+ return null;
+ }
+
+ }
+
+
+}
diff --git a/vendor/sabre/dav/tests/bootstrap.php b/vendor/sabre/dav/tests/bootstrap.php
new file mode 100644
index 000000000..c3be7366c
--- /dev/null
+++ b/vendor/sabre/dav/tests/bootstrap.php
@@ -0,0 +1,22 @@
+<?php
+
+define('SABRE_MYSQLDSN','mysql:host=127.0.0.1;dbname=sabredav');
+define('SABRE_MYSQLUSER','root');
+define('SABRE_MYSQLPASS','');
+
+set_include_path(__DIR__ . '/../lib/' . PATH_SEPARATOR . __DIR__ . PATH_SEPARATOR . get_include_path());
+
+include __DIR__ . '/../vendor/autoload.php';
+include 'Sabre/DAVServerTest.php';
+
+date_default_timezone_set('GMT');
+
+define("SABRE_TEMPDIR",dirname(__FILE__) . '/temp/');
+
+// If sqlite is not available, this constant is used to skip the relevant
+// tests
+define('SABRE_HASSQLITE',in_array('sqlite',PDO::getAvailableDrivers()));
+define('SABRE_HASMYSQL', in_array('mysql',PDO::getAvailableDrivers()) && defined('SABRE_MYSQLDSN') && defined('SABRE_MYSQLUSER') && defined('SABRE_MYSQLPASS'));
+
+if (!file_exists(SABRE_TEMPDIR)) mkdir(SABRE_TEMPDIR);
+if (file_exists('.sabredav')) unlink('.sabredav');
diff --git a/vendor/sabre/dav/tests/phpunit.xml b/vendor/sabre/dav/tests/phpunit.xml
new file mode 100644
index 000000000..e93933049
--- /dev/null
+++ b/vendor/sabre/dav/tests/phpunit.xml
@@ -0,0 +1,29 @@
+<phpunit
+ colors="true"
+ bootstrap="bootstrap.php"
+ convertErrorsToExceptions="true"
+ convertNoticesToExceptions="true"
+ convertWarningsToExceptions="true"
+ >
+ <testsuite name="sabre-dav">
+ <directory>Sabre/</directory>
+ </testsuite>
+ <testsuite name="sabre-vobject">
+ <directory>../vendor/sabre/vobject/tests/Sabre/VObject</directory>
+ </testsuite>
+
+ <filter>
+ <whitelist addUncoveredFilesFromWhitelist="true">
+ <directory suffix=".php">../lib/</directory>
+ <exclude>
+ <file>../lib/Sabre/autoload.php</file>
+ <file>../lib/Sabre/CalDAV/includes.php</file>
+ <file>../lib/Sabre/CardDAV/includes.php</file>
+ <file>../lib/Sabre/DAVACL/includes.php</file>
+ <file>../lib/Sabre/HTTP/includes.php</file>
+ <file>../lib/Sabre/DAV/includes.php</file>
+ <file>../lib/Sabre/VObject/includes.php</file>
+ </exclude>
+ </whitelist>
+ </filter>
+</phpunit>
diff --git a/vendor/sabre/vobject/.gitignore b/vendor/sabre/vobject/.gitignore
new file mode 100644
index 000000000..a46b19e2a
--- /dev/null
+++ b/vendor/sabre/vobject/.gitignore
@@ -0,0 +1,4 @@
+# Composer stuff
+vendor/
+composer.lock
+tests/cov/
diff --git a/vendor/sabre/vobject/.travis.yml b/vendor/sabre/vobject/.travis.yml
new file mode 100644
index 000000000..6bf8b7592
--- /dev/null
+++ b/vendor/sabre/vobject/.travis.yml
@@ -0,0 +1,9 @@
+language: php
+php:
+ - 5.3
+ - 5.4
+ - 5.5
+
+script: phpunit --configuration tests/phpunit.xml
+
+before_script: composer install
diff --git a/vendor/sabre/vobject/ChangeLog b/vendor/sabre/vobject/ChangeLog
new file mode 100644
index 000000000..616c7ce26
--- /dev/null
+++ b/vendor/sabre/vobject/ChangeLog
@@ -0,0 +1,84 @@
+2.1.3-stable (2013-10-02)
+ * Fixed: Issue #55. \r must be stripped from property values.
+ * Fixed: Issue #65. Putting quotes around parameter values that contain a
+ colon.
+
+2.1.2-stable (2013-08-02)
+ * Fixed: Issue #53. A regression in RecurrenceIterator.
+
+2.1.1-stable (2013-07-27)
+ * Fixed: Issue #50. RecurrenceIterator gives incorrect result when
+ exception events are out of order in the iCalendar file.
+ * Fixed: Issue #48. Overridden events in the recurrence iterator that were
+ past the UNTIL date were ignored.
+
+2.1.0-stable (2013-06-17)
+ * This version is fully backwards compatible with 2.0.*. However, it
+ contains a few new API's that mimic the VObject 3 API. This allows it to
+ be used a 'bridge' version.
+ Specifically, this new version exists so SabreDAV 1.7 and 1.8 can run with
+ both the 2 and 3 versions of this library.
+ * Added: Property\DateTime::hasTime().
+ * Added: Property\MultiDateTime::hasTime().
+ * Added: Property::getValue().
+ * Added: Document class.
+ * Added: Document::createComponent and Document::createProperty.
+ * Added: Parameter::getValue().
+
+
+2.0.7-stable (2013-03-05)
+ * Fixed: Microsoft re-uses their magic numbers for different timezones,
+ specifically id 2 for both Sarajevo and Lisbon). A workaround was added
+ to deal with this.
+
+2.0.6-stable (2013-02-17)
+ * Fixed: The reader now properly parses parameters without a value.
+
+2.0.5-stable (2012-11-05)
+ * Fixed: The FreeBusyGenerator is now properly using the factory methods
+ for creation of components and properties.
+
+2.0.4-stable (2012-11-02)
+ * Added: Known Lotus Notes / Domino timezone id's.
+
+2.0.3-stable (2012-10-29)
+ * Added: Support for 'GMT+????' format in TZID's.
+ * Added: Support for formats like SystemV/EST5EDT in TZID's.
+ * Fixed: RecurrenceIterator now repairs recurrence rules where UNTIL < DTSTART.
+ * Added: Support for BYHOUR in FREQ=DAILY (@hollodk).
+ * Added: Support for BYHOUR and BYDAY in FREQ=WEEKLY.
+
+2.0.2-stable (2012-10-06)
+ * Added: includes.php file, to load the entire library in one go.
+ * Fixed: A problem with determining alarm triggers for TODO's.
+
+2.0.1-stable (2012-09-22)
+ * Removed: Element class. It wasn't used.
+ * Added: Basic validation and repair methods for broken input data.
+ * Fixed: RecurrenceIterator could infinitely loop when an INTERVAL of 0
+ was specified.
+ * Added: A cli script that can validate and automatically repair vcards
+ and iCalendar objects.
+ * Added: A new 'Compound' property, that can automatically split up parts
+ for properties such as N, ADR, ORG and CATEGORIES.
+ * Added: Splitter classes, that can split up large objects (such as exports)
+ into individual objects (thanks @DominikTO and @armin-hackmann).
+ * Added: VFREEBUSY component, which allows easily checking wether
+ timeslots are available.
+ * Added: The Reader class now has a 'FORGIVING' option, which allows it to
+ parse properties with incorrect characters in the name (at this time, it
+ just allows underscores).
+ * Added: Also added the 'IGNORE_INVALID_LINES' option, to completely
+ disregard any invalid lines.
+ * Fixed: A bug in Windows timezone-id mappings for times created in
+ Greenlands timezone (sorry Greenlanders! I do care!).
+ * Fixed: DTEND was not generated correctly for VFREEBUSY reports.
+ * Fixed: Parser is at least 25% faster with real-world data.
+
+2.0.0-stable (2012-08-08)
+ * VObject is now a separate project from SabreDAV. See the SabreDAV
+ changelog for version information before 2.0.
+ * New: VObject library now uses PHP 5.3 namespaces.
+ * New: It's possible to specify lists of parameters when constructing
+ properties.
+ * New: made it easier to construct the FreeBusyGenerator.
diff --git a/vendor/sabre/vobject/LICENSE b/vendor/sabre/vobject/LICENSE
new file mode 100644
index 000000000..628c60c78
--- /dev/null
+++ b/vendor/sabre/vobject/LICENSE
@@ -0,0 +1,27 @@
+Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/)
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+ * Neither the name Sabre nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND 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.
diff --git a/vendor/sabre/vobject/README.md b/vendor/sabre/vobject/README.md
new file mode 100644
index 000000000..c7541eaca
--- /dev/null
+++ b/vendor/sabre/vobject/README.md
@@ -0,0 +1,384 @@
+SabreTooth VObject library
+==========================
+
+[![Build Status](https://secure.travis-ci.org/fruux/sabre-vobject.png?branch=master)](http://travis-ci.org/fruux/sabre-vobject)
+
+The VObject library allows you to easily parse and manipulate [iCalendar](https://tools.ietf.org/html/rfc5545)
+and [vCard](https://tools.ietf.org/html/rfc6350) objects using PHP.
+The goal of the VObject library is to create a very complete library, with an easy to use API.
+
+This project is a spin-off from [SabreDAV](http://code.google.com/p/sabredav/), where it has
+been used for several years. The VObject library has 100% unittest coverage.
+
+Installation
+------------
+
+VObject requires PHP 5.3, and should be installed using composer.
+The general composer instructions can be found on the [composer website](http://getcomposer.org/doc/00-intro.md composer website).
+
+After that, just declare the vobject dependency as follows:
+
+```
+"require" : {
+ "sabre/vobject" : "2.0.*"
+}
+```
+
+Then, run `composer.phar update` and you should be good.
+
+Usage
+-----
+
+### Parsing
+
+For our example, we will be using the following vcard:
+
+```
+BEGIN:VCARD
+VERSION:3.0
+PRODID:-//Sabre//Sabre VObject 2.0//EN
+N:Planck;Max;;;
+FN:Max Planck
+EMAIL;TYPE=WORK:mplanck@example.org
+item1.TEL;TYPE=CELL:(+49)3144435678
+item1.X-ABLabel:Private cell
+item2.TEL;TYPE=WORK:(+49)5554564744
+item2.X-ABLabel:Work
+END:VCARD
+```
+
+
+If we want to just print out Max' full name, you can just use property access:
+
+
+```php
+use Sabre\VObject;
+
+$card = VObject\Reader::read($data);
+echo $card->FN;
+```
+
+### Changing properties
+
+Creating properties is pretty similar. If we like to add his birthday, we just
+set the property:
+
+```php
+$card->BDAY = '1858-04-23';
+```
+
+Note that in the previous example, we're actually updating any existing BDAY that
+may already exist. If we want to add a new property, without overwriting the previous
+we can do this with the `add` method.
+
+```php
+$card->add('EMAIL','max@example.org');
+```
+
+### Parameters
+
+If we want to also specify that this is max' home email addresses, we can do this with
+a third parameter:
+
+```
+$card->add('EMAIL', 'max@example'org', array('type' => 'HOME'));
+```
+
+If we want to read out all the email addresses and their type, this would look something
+like this:
+
+```
+foreach($card->EMAIL as $email) {
+
+ echo $email['TYPE'], ' - ', $email;
+
+}
+```
+
+### Groups
+
+In our example, you can see that the TEL properties are prefixed. These are 'groups' and
+allow you to group multiple related properties together. The group can be any user-defined
+name.
+
+This particular example as generated by the OS X addressbook, which uses the `X-ABLabel`
+to allow the user to specify custom labels for properties. OS X addressbook uses groups
+to tie the label to the property.
+
+The VObject library simply ignores the group if you don't specify it, so this will work:
+
+```php
+foreach($card->TEL as $tel) {
+ echo $tel, "\n";
+}
+```
+
+But if you would like to target a specific group + property, this is possible too:
+
+```php
+echo $card->{'ITEM1.TEL'};
+```
+
+So if you would like to show all the phone numbers, along with their custom label, the
+following syntax is used:
+
+```php
+foreach($card->TEL as $tel) {
+
+ echo $card->{$tel->group . '.X-ABLABEL'}, ": ";
+ echo $tel, "\n";
+
+}
+```
+
+### Serializing / Saving
+
+If you want to generate your updated VObject, you can simply call the serialize() method.
+
+```php
+echo $card->serialize();
+```
+
+### Components
+
+iCalendar, unlike vCards always have sub-components. Where vCards are often just a flat
+list, iCalendar objects tend to have a tree-like structure. For the following paragraphs,
+we will use the following object as the example:
+
+```
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Sabre//Sabre VObject 2.0//EN
+BEGIN:VEVENT
+SUMMARY:Curiosity landing
+DTSTART:20120806T051439Z
+LOCATION:Mars
+END:VEVENT
+END:VCALENDAR
+```
+
+Since events, tasks and journals are always in a sub component, this is also how we
+access them.
+
+```php
+use Sabre\VObject;
+
+$calendar = VObject\Reader::read($data);
+echo $calendar->VEVENT->SUMMARY;
+```
+
+Adding components to a calendar is done with a factory method:
+
+```php
+$event = VObject\Component::create('VEVENT');
+$calendar->add($event);
+
+$event->SUMMARY = 'Curiosity launch';
+$event->DTSTART = '20111126T150202Z';
+$event->LOCATION = 'Cape Carnival';
+```
+
+By the way.. cloning also works as expected, as the entire structure is cloned along with it:
+
+```php
+$clonedEvent = clone $calendar->VEVENT[0];
+$calendar->add($clonedEvent);
+```
+
+### Date and time handling
+
+If you ever had to deal with iCalendar timezones, you know it can be complicated.
+The way timezones are specified is flawed, which is something I may write an essay about some
+day. VObject does its best to determine the correct timezone. Many standard formats
+have been tested and verified, and special code has been implemented for special-casing
+microsoft generated timezone information, and others.
+
+To get a real php `DateTime` object, you can request this as follows:
+
+```php
+$event = $calendar->VEVENT;
+$start = $event->DTSTART->getDateTime();
+echo $start->format(\DateTime::W3C);
+```
+
+To set the property with a DateTime object, you can use the following syntax:
+
+```php
+$dateTime = new \DateTime('2012-08-07 23:53:00', new DateTimeZone('Europe/Amsterdam'));
+$event->DTSTART->setDateTime($dateTime, VObject\Property\DateTime::DATE);
+```
+
+The second argument specifies the type of date you're setting. The following three
+options exist:
+
+1. `LOCAL` This is a floating time, with no timezone information. This basically specifies that the event happens in whatever the timezone's currently in. This would be encoded as `DTSTART;VALUE=DATE-TIME:20120807235300`
+2. `UTC` This specifies that the time should be encoded as a UTC time. This is encoded as `DTSTART;VALUE=DATE-TIME:20120807205300Z`. Note the extra Z and the fact that it's two hours 'earlier'.
+3. `LOCALTZ` specifies that it's supposed to be encoded in its local timezone. For example `DTSTART;VALUE=DATE-TIME;TZID=Europe/Amsterdam:20120807235300`.
+4. `DATE` This is a date-only, and does not contain the time. In this case this would be encoded as `DTSTART;VALUE=DATE:20120807`.
+
+A few important notes:
+
+* When a `TZID` is specified, there should also be a matching `VTIMEZONE` object with all the timezone information. VObject cannot currently automatically embed this. However, in reality other clients seem to do fine without this information. Yet, for completeness, this will be added in the future.
+* As mentioned, the timezone-determination process may sometimes fail. Report any issues you find, and I'll be quick to add workarounds!
+
+### Recurrence rules
+
+Recurrence rules allow events to recur, for example for a weekly meeting, or an anniversary.
+This is done with the `RRULE` property. The `RRULE` property allows for a LOT of different
+rules. VObject only implements the ones that actually appear in calendar software.
+
+To read more about `RRULE` and all the options, check out [RFC5545](https://tools.ietf.org/html/rfc5545#section-3.8.5).
+VObject supports the following options:
+
+1. `UNTIL` for an end date.
+2. `INTERVAL` for for example "every 2 days".
+3. `COUNT` to stop recurring after x items.
+4. `FREQ=DAILY` to recur every day, and `BYDAY` to limit it to certain days.
+5. `FREQ=WEEKLY` to recur every week, `BYDAY` to expand this to multiple weekdays in every week and `WKST` to specify on which day the week starts.
+6. `FREQ=MONTHLY` to recur every month, `BYMONTHDAY` to expand this to certain days in a month, `BYDAY` to expand it to certain weekdays occuring in a month, and `BYSETPOS` to limit the last two expansions.
+7. `FREQ=YEARLY` to recur every year, `BYMONTH` to expand that to certain months in a year, and `BYDAY` and `BYWEEKDAY` to expand the `BYMONTH` rule even further.
+
+VObject supports the `EXDATE` property for exclusions, but not yet the `RDATE` and `EXRULE`
+properties. If you're interested in this, please file a github issue, as this will put it
+on my radar.
+
+This is a bit of a complex subject to go in excruciating detail. The
+[RFC](https://tools.ietf.org/html/rfc5545#section-3.8.5) has a lot of examples though.
+
+The hard part is not to write the RRULE, it is to expand them. The most complex and
+hard-to-read code is hidden in this component. Dragons be here.
+
+So, if we have a meeting every 2nd monday of the month, this would be specified as such:
+
+```
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Sabre//Sabre VObject 2.0//EN
+BEGIN:VEVENT
+UID:1102c450-e0d7-11e1-9b23-0800200c9a66
+DTSTART:20120109T140000Z
+RRULE:FREQ=MONTHLY;BYDAY=MO;BYSETPOS=2
+END:VEVENT
+END:VCALENDAR
+```
+
+Note that normally it's not allowed to indent the object like this, but it does make
+it easier to read. This is also the first time I added in a UID, which is required
+for all VEVENT, VTODO and VJOURNAL objects!
+
+To figure out all the meetings for this year, we can use the following syntax:
+
+```php
+use Sabre\VObject;
+
+$calendar = VObject\Reader::read($data);
+$calendar->expand(new DateTime('2012-01-01'), new DateTime('2012-12-31'));
+```
+
+What the expand method does, is look at its inner events, and expand the recurring
+rule. Our calendar now contains 12 events. The first will have its RRULE stripped,
+and every subsequent VEVENT has the correct meeting date and a `RECURRENCE-ID` set.
+
+This results in something like this:
+
+```
+BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//Sabre//Sabre VObject 2.0//EN
+ BEGIN:VEVENT
+ UID:1102c450-e0d7-11e1-9b23-0800200c9a66
+ DTSTART:20120109T140000Z
+ END:VEVENT
+ BEGIN:VEVENT
+ UID:1102c450-e0d7-11e1-9b23-0800200c9a66
+ RECURRENCE-ID:20120213T140000Z
+ DTSTART:20120213T140000Z
+ END:VEVENT
+ BEGIN:VEVENT
+ UID:1102c450-e0d7-11e1-9b23-0800200c9a66
+ RECURRENCE-ID:20120312T140000Z
+ DTSTART:20120312T140000Z
+ END:VEVENT
+ ..etc..
+END:VCALENDAR
+```
+
+To show the list of dates, we would do this as such:
+
+```php
+foreach($calendar->VEVENT as $event) {
+ echo $event->DTSTART->getDateTime()->format(\DateTime::ATOM);
+}
+```
+
+In a recurring event, single instances can also be overriden. VObject also takes these
+into consideration. The reason we needed to specify a start and end-date, is because
+some recurrence rules can be 'never ending'.
+
+You should make sure you pick a sane date-range. Because if you pick a 50 year
+time-range, for a daily recurring event; this would result in over 18K objects.
+
+Free-busy report generation
+---------------------------
+
+Some calendaring software can make use of FREEBUSY reports to show when people are
+available.
+
+You can automatically generate these reports from calendars using the `FreeBusyGenerator`.
+
+Example based on our last event:
+
+```php
+// We're giving it the calendar object. It's also possible to specify multiple objects,
+// by setting them as an array.
+//
+// We must also specify a start and end date, because recurring events are expanded.
+$fbGenerator = new VObject\FreeBusyGenerator(
+ new DateTime('2012-01-01'),
+ new DateTime('2012-12-31'),
+ $calendar
+);
+
+// Grabbing the report
+$freebusy = $fbGenerator->result();
+
+// The freebusy report is another VCALENDAR object, so we can serialize it as usual:
+echo $freebusy->serialize();
+```
+
+The output of this script will look like this:
+
+```
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Sabre//Sabre VObject 2.0//EN
+CALSCALE:GREGORIAN
+BEGIN:VFREEBUSY
+DTSTART;VALUE=DATE-TIME:20111231T230000Z
+DTEND;VALUE=DATE-TIME:20111231T230000Z
+DTSTAMP;VALUE=DATE-TIME:20120808T131628Z
+FREEBUSY;FBTYPE=BUSY:20120109T140000Z/20120109T140000Z
+FREEBUSY;FBTYPE=BUSY:20120213T140000Z/20120213T140000Z
+FREEBUSY;FBTYPE=BUSY:20120312T140000Z/20120312T140000Z
+FREEBUSY;FBTYPE=BUSY:20120409T140000Z/20120409T140000Z
+FREEBUSY;FBTYPE=BUSY:20120514T140000Z/20120514T140000Z
+FREEBUSY;FBTYPE=BUSY:20120611T140000Z/20120611T140000Z
+FREEBUSY;FBTYPE=BUSY:20120709T140000Z/20120709T140000Z
+FREEBUSY;FBTYPE=BUSY:20120813T140000Z/20120813T140000Z
+FREEBUSY;FBTYPE=BUSY:20120910T140000Z/20120910T140000Z
+FREEBUSY;FBTYPE=BUSY:20121008T140000Z/20121008T140000Z
+FREEBUSY;FBTYPE=BUSY:20121112T140000Z/20121112T140000Z
+FREEBUSY;FBTYPE=BUSY:20121210T140000Z/20121210T140000Z
+END:VFREEBUSY
+END:VCALENDAR
+```
+
+Support
+-------
+
+Head over to the [SabreDAV mailing list](http://groups.google.com/group/sabredav-discuss) for any questions.
+
+Made at fruux
+-------------
+
+This library is being developed by [fruux](https://fruux.com/). Drop us a line for commercial services or enterprise support.
diff --git a/vendor/sabre/vobject/bin/bench.php b/vendor/sabre/vobject/bin/bench.php
new file mode 100755
index 000000000..b949c8ea4
--- /dev/null
+++ b/vendor/sabre/vobject/bin/bench.php
@@ -0,0 +1,12 @@
+#!/usr/bin/env php
+<?php
+
+include __DIR__ . '/../vendor/autoload.php';
+
+$data = stream_get_contents(STDIN);
+
+$start = microtime(true);
+
+$lol = Sabre\VObject\Reader::read($data);
+
+echo "time: " . (microtime(true)-$start) . "\n";
diff --git a/vendor/sabre/vobject/bin/generateicalendardata.php b/vendor/sabre/vobject/bin/generateicalendardata.php
new file mode 100755
index 000000000..92c8c106d
--- /dev/null
+++ b/vendor/sabre/vobject/bin/generateicalendardata.php
@@ -0,0 +1,91 @@
+#!/usr/bin/env php
+<?php
+
+use Sabre\VObject;
+
+if ($argc<2) {
+ $cmd = $argv[0];
+ fwrite(STDERR, <<<HI
+Fruux test data generator
+
+This script generates a lot of test data. This is used for profiling and stuff.
+Currently it just generates events in a single calendar.
+
+The iCalendar output goes to stdout. Other messages to stderr.
+
+{$cmd} [events]
+
+
+HI
+ );
+ die();
+}
+
+$events = 100;
+
+if (isset($argv[1])) $events = (int)$argv[1];
+
+include __DIR__ . '/../vendor/autoload.php';
+
+fwrite(STDERR, "Generating " . $events . " events\n");
+
+$currentDate = new DateTime('-' . round($events/2) . ' days');
+
+$calendar = VObject\Component::create('VCALENDAR');
+$calendar->version = '2.0';
+$calendar->calscale = 'GREGORIAN';
+
+$ii=0;
+
+while($ii < $events) {
+
+ $ii++;
+
+ $event = VObject\Component::create('VEVENT');
+ $event->DTSTART = 'bla';
+ $event->SUMMARY = 'Event #' . $ii;
+ $event->UID = md5(microtime(true));
+
+ $doctorRandom = mt_rand(1,1000);
+
+ switch($doctorRandom) {
+ // All-day event
+ case 1 :
+ $event->DTEND = 'bla';
+ $dtStart = clone $currentDate;
+ $dtEnd = clone $currentDate;
+ $dtEnd->modify('+' . mt_rand(1,3) . ' days');
+ $event->DTSTART->setDateTime($dtStart, VObject\Property\DateTime::DATE);
+ $event->DTEND->setDateTime($dtEnd, VObject\Property\DateTime::DATE);
+ break;
+ case 2 :
+ $event->RRULE = 'FREQ=DAILY;COUNT=' . mt_rand(1,10);
+ // No break intentional
+ default :
+ $dtStart = clone $currentDate;
+ $dtStart->setTime(mt_rand(1,23), mt_rand(0,59), mt_rand(0,59));
+ $event->DTSTART->setDateTime($dtStart, VObject\Property\DateTime::UTC);
+ $event->DURATION = 'PT'.mt_rand(1,3).'H';
+ break;
+
+ }
+
+ $calendar->add($event);
+ $currentDate->modify('+ ' . mt_rand(0,3) . ' days');
+
+}
+fwrite(STDERR, "Validating\n");
+
+$result = $calendar->validate();
+if ($result) {
+ fwrite(STDERR, "Errors!\n");
+ fwrite(STDERR, print_r($result,true));
+ die(-1);
+}
+
+fwrite(STDERR, "Serializing this beast\n");
+
+echo $calendar->serialize();
+
+fwrite(STDERR, "done.\n");
+
diff --git a/vendor/sabre/vobject/bin/vobjectvalidate.php b/vendor/sabre/vobject/bin/vobjectvalidate.php
new file mode 100755
index 000000000..e0b2a479f
--- /dev/null
+++ b/vendor/sabre/vobject/bin/vobjectvalidate.php
@@ -0,0 +1,139 @@
+#!/usr/bin/env php
+<?php
+
+namespace Sabre\VObject;
+
+// This sucks.. we have to try to find the composer autoloader. But chances
+// are, we can't find it this way. So we'll do our bestest
+$paths = array(
+ __DIR__ . '/../vendor/autoload.php', // In case vobject is cloned directly
+ __DIR__ . '/../../../autoload.php', // In case vobject is a composer dependency.
+);
+
+foreach($paths as $path) {
+ if (file_exists($path)) {
+ include $path;
+ break;
+ }
+}
+
+if (!class_exists('Sabre\\VObject\\Version')) {
+ fwrite(STDERR, "Composer autoloader could not be properly loaded.\n");
+ die(1);
+}
+
+fwrite(STDERR, "SabreTooth VObject validator " . Version::VERSION . "\n");
+
+
+$repair = false;
+$posArgs = array();
+
+// Argument parsing:
+foreach($argv as $k=>$v) {
+
+ if ($k===0) {
+ continue;
+ }
+ if (substr($v,0,2)==='--') {
+ switch($v) {
+ case '--repair' :
+ $repair = true;
+ break;
+ default :
+ throw new InvalidArgumentException('Unknown option: ' . $v);
+ break;
+ }
+ continue;
+ }
+ $posArgs[] = $v;
+
+}
+
+function help() {
+
+ global $argv;
+
+ fwrite(STDERR, <<<HELP
+Usage instructions:
+
+ {$argv[0]} [--repair] inputfile [outputfile]
+
+ inputfile Input .vcf or .ics file.
+ outputfile Output .vcf or .ics file. This is only used with --repair.
+ --repair Attempt to automatically repair broken files.
+
+For both the output- and inputfile "-" can be specified, to use STDIN and STDOUT
+respectively.
+
+All other output from this script is sent to STDERR.
+
+https://github.com/fruux/sabre-vobject
+
+HELP
+);
+
+}
+
+if (count($posArgs) < 1) {
+ help();
+ die();
+}
+
+if ($posArgs[0]!=='-') {
+ $input = fopen($posArgs[0],'r');
+} else {
+ $input = STDIN;
+}
+
+if (isset($posArgs[1]) && $posArgs[1]!=='-') {
+ $output = fopen($posArgs[1],'w');
+} else {
+ $output = STDOUT;
+}
+
+// This is a bit of a hack to easily support multiple objects in a single file.
+$inputStr = "BEGIN:X-SABRE-WRAPPER\r\n" . stream_get_contents($input);
+
+$inputStr = rtrim($inputStr, "\r\n") . "\r\nEND:X-SABRE-WRAPPER\r\n";
+
+// Now the actual work.
+$vObj = Reader::read($inputStr);
+
+$objects = $vObj->children();
+
+foreach($objects as $child) {
+
+ switch($child->name) {
+ case 'VCALENDAR' :
+ fwrite(STDERR, "iCalendar: " . (string)$child->VERSION . "\n");
+ break;
+ case 'VCARD' :
+ fwrite(STDERR, "vCard: " . (string)$child->VERSION . "\n");
+ break;
+ default :
+ fwrite(STDERR, "This was an unknown object, but it did parse. It's likely that validation will give you unexpected results.\n");
+ break;
+ }
+
+ $options = 0;
+ if ($repair) $options |= Node::REPAIR;
+
+ $warnings = $child->validate($options);
+
+ if (!count($warnings)) {
+ fwrite(STDERR, "[GOOD NEWS] No warnings!\n");
+ } else {
+ foreach($warnings as $warn) {
+
+ fwrite(STDERR, $warn['message'] . "\n");
+
+ }
+
+ }
+
+ if ($repair) {
+ fwrite($output, $child->serialize());
+ }
+
+}
+
diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/Component.php b/vendor/sabre/vobject/lib/Sabre/VObject/Component.php
new file mode 100644
index 000000000..1c1d92444
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Sabre/VObject/Component.php
@@ -0,0 +1,405 @@
+<?php
+
+namespace Sabre\VObject;
+
+/**
+ * VObject Component
+ *
+ * This class represents a VCALENDAR/VCARD component. A component is for example
+ * VEVENT, VTODO and also VCALENDAR. It starts with BEGIN:COMPONENTNAME and
+ * ends with END:COMPONENTNAME
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Component extends Node {
+
+ /**
+ * Name, for example VEVENT
+ *
+ * @var string
+ */
+ public $name;
+
+ /**
+ * Children properties and components
+ *
+ * @var array
+ */
+ public $children = array();
+
+ /**
+ * If components are added to this map, they will be automatically mapped
+ * to their respective classes, if parsed by the reader or constructed with
+ * the 'create' method.
+ *
+ * @var array
+ */
+ static public $classMap = array(
+ 'VALARM' => 'Sabre\\VObject\\Component\\VAlarm',
+ 'VCALENDAR' => 'Sabre\\VObject\\Component\\VCalendar',
+ 'VCARD' => 'Sabre\\VObject\\Component\\VCard',
+ 'VEVENT' => 'Sabre\\VObject\\Component\\VEvent',
+ 'VJOURNAL' => 'Sabre\\VObject\\Component\\VJournal',
+ 'VTODO' => 'Sabre\\VObject\\Component\\VTodo',
+ 'VFREEBUSY' => 'Sabre\\VObject\\Component\\VFreeBusy',
+ );
+
+ /**
+ * Creates the new component by name, but in addition will also see if
+ * there's a class mapped to the property name.
+ *
+ * @param string $name
+ * @param string $value
+ * @return Component
+ */
+ static public function create($name, $value = null) {
+
+ $name = strtoupper($name);
+
+ if (isset(self::$classMap[$name])) {
+ return new self::$classMap[$name]($name, $value);
+ } else {
+ return new self($name, $value);
+ }
+
+ }
+
+ /**
+ * Creates a new component.
+ *
+ * By default this object will iterate over its own children, but this can
+ * be overridden with the iterator argument
+ *
+ * @param string $name
+ * @param ElementList $iterator
+ */
+ public function __construct($name, ElementList $iterator = null) {
+
+ $this->name = strtoupper($name);
+ if (!is_null($iterator)) $this->iterator = $iterator;
+
+ }
+
+ /**
+ * Turns the object back into a serialized blob.
+ *
+ * @return string
+ */
+ public function serialize() {
+
+ $str = "BEGIN:" . $this->name . "\r\n";
+
+ /**
+ * Gives a component a 'score' for sorting purposes.
+ *
+ * This is solely used by the childrenSort method.
+ *
+ * A higher score means the item will be lower in the list.
+ * To avoid score collisions, each "score category" has a reasonable
+ * space to accomodate elements. The $key is added to the $score to
+ * preserve the original relative order of elements.
+ *
+ * @param int $key
+ * @param array $array
+ * @return int
+ */
+ $sortScore = function($key, $array) {
+
+ if ($array[$key] instanceof Component) {
+
+ // We want to encode VTIMEZONE first, this is a personal
+ // preference.
+ if ($array[$key]->name === 'VTIMEZONE') {
+ $score=300000000;
+ return $score+$key;
+ } else {
+ $score=400000000;
+ return $score+$key;
+ }
+ } else {
+ // Properties get encoded first
+ // VCARD version 4.0 wants the VERSION property to appear first
+ if ($array[$key] instanceof Property) {
+ if ($array[$key]->name === 'VERSION') {
+ $score=100000000;
+ return $score+$key;
+ } else {
+ // All other properties
+ $score=200000000;
+ return $score+$key;
+ }
+ }
+ }
+
+ };
+
+ $tmp = $this->children;
+ uksort($this->children, function($a, $b) use ($sortScore, $tmp) {
+
+ $sA = $sortScore($a, $tmp);
+ $sB = $sortScore($b, $tmp);
+
+ if ($sA === $sB) return 0;
+
+ return ($sA < $sB) ? -1 : 1;
+
+ });
+
+ foreach($this->children as $child) $str.=$child->serialize();
+ $str.= "END:" . $this->name . "\r\n";
+
+ return $str;
+
+ }
+
+ /**
+ * Adds a new component or element
+ *
+ * You can call this method with the following syntaxes:
+ *
+ * add(Node $node)
+ * add(string $name, $value, array $parameters = array())
+ *
+ * The first version adds an Element
+ * The second adds a property as a string.
+ *
+ * @param mixed $item
+ * @param mixed $itemValue
+ * @return void
+ */
+ public function add($item, $itemValue = null, array $parameters = array()) {
+
+ if ($item instanceof Node) {
+ if (!is_null($itemValue)) {
+ throw new \InvalidArgumentException('The second argument must not be specified, when passing a VObject Node');
+ }
+ $item->parent = $this;
+ $this->children[] = $item;
+ } elseif(is_string($item)) {
+
+ $item = Property::create($item,$itemValue, $parameters);
+ $item->parent = $this;
+ $this->children[] = $item;
+
+ } else {
+
+ throw new \InvalidArgumentException('The first argument must either be a \\Sabre\\VObject\\Node or a string');
+
+ }
+
+ }
+
+ /**
+ * Returns an iterable list of children
+ *
+ * @return ElementList
+ */
+ public function children() {
+
+ return new ElementList($this->children);
+
+ }
+
+ /**
+ * Returns an array with elements that match the specified name.
+ *
+ * This function is also aware of MIME-Directory groups (as they appear in
+ * vcards). This means that if a property is grouped as "HOME.EMAIL", it
+ * will also be returned when searching for just "EMAIL". If you want to
+ * search for a property in a specific group, you can select on the entire
+ * string ("HOME.EMAIL"). If you want to search on a specific property that
+ * has not been assigned a group, specify ".EMAIL".
+ *
+ * Keys are retained from the 'children' array, which may be confusing in
+ * certain cases.
+ *
+ * @param string $name
+ * @return array
+ */
+ public function select($name) {
+
+ $group = null;
+ $name = strtoupper($name);
+ if (strpos($name,'.')!==false) {
+ list($group,$name) = explode('.', $name, 2);
+ }
+
+ $result = array();
+ foreach($this->children as $key=>$child) {
+
+ if (
+ strtoupper($child->name) === $name &&
+ (is_null($group) || ( $child instanceof Property && strtoupper($child->group) === $group))
+ ) {
+
+ $result[$key] = $child;
+
+ }
+ }
+
+ reset($result);
+ return $result;
+
+ }
+
+ /**
+ * This method only returns a list of sub-components. Properties are
+ * ignored.
+ *
+ * @return array
+ */
+ public function getComponents() {
+
+ $result = array();
+ foreach($this->children as $child) {
+ if ($child instanceof Component) {
+ $result[] = $child;
+ }
+ }
+
+ return $result;
+
+ }
+
+ /**
+ * Validates the node for correctness.
+ *
+ * The following options are supported:
+ * - Node::REPAIR - If something is broken, and automatic repair may
+ * be attempted.
+ *
+ * An array is returned with warnings.
+ *
+ * Every item in the array has the following properties:
+ * * level - (number between 1 and 3 with severity information)
+ * * message - (human readable message)
+ * * node - (reference to the offending node)
+ *
+ * @param int $options
+ * @return array
+ */
+ public function validate($options = 0) {
+
+ $result = array();
+ foreach($this->children as $child) {
+ $result = array_merge($result, $child->validate($options));
+ }
+ return $result;
+
+ }
+
+ /* Magic property accessors {{{ */
+
+ /**
+ * Using 'get' you will either get a property or component,
+ *
+ * If there were no child-elements found with the specified name,
+ * null is returned.
+ *
+ * @param string $name
+ * @return Property
+ */
+ public function __get($name) {
+
+ $matches = $this->select($name);
+ if (count($matches)===0) {
+ return null;
+ } else {
+ $firstMatch = current($matches);
+ /** @var $firstMatch Property */
+ $firstMatch->setIterator(new ElementList(array_values($matches)));
+ return $firstMatch;
+ }
+
+ }
+
+ /**
+ * This method checks if a sub-element with the specified name exists.
+ *
+ * @param string $name
+ * @return bool
+ */
+ public function __isset($name) {
+
+ $matches = $this->select($name);
+ return count($matches)>0;
+
+ }
+
+ /**
+ * Using the setter method you can add properties or subcomponents
+ *
+ * You can either pass a Component, Property
+ * object, or a string to automatically create a Property.
+ *
+ * If the item already exists, it will be removed. If you want to add
+ * a new item with the same name, always use the add() method.
+ *
+ * @param string $name
+ * @param mixed $value
+ * @return void
+ */
+ public function __set($name, $value) {
+
+ $matches = $this->select($name);
+ $overWrite = count($matches)?key($matches):null;
+
+ if ($value instanceof Component || $value instanceof Property) {
+ $value->parent = $this;
+ if (!is_null($overWrite)) {
+ $this->children[$overWrite] = $value;
+ } else {
+ $this->children[] = $value;
+ }
+ } elseif (is_scalar($value)) {
+ $property = Property::create($name,$value);
+ $property->parent = $this;
+ if (!is_null($overWrite)) {
+ $this->children[$overWrite] = $property;
+ } else {
+ $this->children[] = $property;
+ }
+ } else {
+ throw new \InvalidArgumentException('You must pass a \\Sabre\\VObject\\Component, \\Sabre\\VObject\\Property or scalar type');
+ }
+
+ }
+
+ /**
+ * Removes all properties and components within this component.
+ *
+ * @param string $name
+ * @return void
+ */
+ public function __unset($name) {
+
+ $matches = $this->select($name);
+ foreach($matches as $k=>$child) {
+
+ unset($this->children[$k]);
+ $child->parent = null;
+
+ }
+
+ }
+
+ /* }}} */
+
+ /**
+ * This method is automatically called when the object is cloned.
+ * Specifically, this will ensure all child elements are also cloned.
+ *
+ * @return void
+ */
+ public function __clone() {
+
+ foreach($this->children as $key=>$child) {
+ $this->children[$key] = clone $child;
+ $this->children[$key]->parent = $this;
+ }
+
+ }
+
+}
diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/Component/VAlarm.php b/vendor/sabre/vobject/lib/Sabre/VObject/Component/VAlarm.php
new file mode 100644
index 000000000..2f86c44fd
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Sabre/VObject/Component/VAlarm.php
@@ -0,0 +1,108 @@
+<?php
+
+namespace Sabre\VObject\Component;
+use Sabre\VObject;
+
+/**
+ * VAlarm component
+ *
+ * This component contains some additional functionality specific for VALARMs.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class VAlarm extends VObject\Component {
+
+ /**
+ * Returns a DateTime object when this alarm is going to trigger.
+ *
+ * This ignores repeated alarm, only the first trigger is returned.
+ *
+ * @return DateTime
+ */
+ public function getEffectiveTriggerTime() {
+
+ $trigger = $this->TRIGGER;
+ if(!isset($trigger['VALUE']) || strtoupper($trigger['VALUE']) === 'DURATION') {
+ $triggerDuration = VObject\DateTimeParser::parseDuration($this->TRIGGER);
+ $related = (isset($trigger['RELATED']) && strtoupper($trigger['RELATED']) == 'END') ? 'END' : 'START';
+
+ $parentComponent = $this->parent;
+ if ($related === 'START') {
+
+ if ($parentComponent->name === 'VTODO') {
+ $propName = 'DUE';
+ } else {
+ $propName = 'DTSTART';
+ }
+
+ $effectiveTrigger = clone $parentComponent->$propName->getDateTime();
+ $effectiveTrigger->add($triggerDuration);
+ } else {
+ if ($parentComponent->name === 'VTODO') {
+ $endProp = 'DUE';
+ } elseif ($parentComponent->name === 'VEVENT') {
+ $endProp = 'DTEND';
+ } else {
+ throw new \LogicException('time-range filters on VALARM components are only supported when they are a child of VTODO or VEVENT');
+ }
+
+ if (isset($parentComponent->$endProp)) {
+ $effectiveTrigger = clone $parentComponent->$endProp->getDateTime();
+ $effectiveTrigger->add($triggerDuration);
+ } elseif (isset($parentComponent->DURATION)) {
+ $effectiveTrigger = clone $parentComponent->DTSTART->getDateTime();
+ $duration = VObject\DateTimeParser::parseDuration($parentComponent->DURATION);
+ $effectiveTrigger->add($duration);
+ $effectiveTrigger->add($triggerDuration);
+ } else {
+ $effectiveTrigger = clone $parentComponent->DTSTART->getDateTime();
+ $effectiveTrigger->add($triggerDuration);
+ }
+ }
+ } else {
+ $effectiveTrigger = $trigger->getDateTime();
+ }
+ return $effectiveTrigger;
+
+ }
+
+ /**
+ * Returns true or false depending on if the event falls in the specified
+ * time-range. This is used for filtering purposes.
+ *
+ * The rules used to determine if an event falls within the specified
+ * time-range is based on the CalDAV specification.
+ *
+ * @param \DateTime $start
+ * @param \DateTime $end
+ * @return bool
+ */
+ public function isInTimeRange(\DateTime $start, \DateTime $end) {
+
+ $effectiveTrigger = $this->getEffectiveTriggerTime();
+
+ if (isset($this->DURATION)) {
+ $duration = VObject\DateTimeParser::parseDuration($this->DURATION);
+ $repeat = (string)$this->repeat;
+ if (!$repeat) {
+ $repeat = 1;
+ }
+
+ $period = new \DatePeriod($effectiveTrigger, $duration, (int)$repeat);
+
+ foreach($period as $occurrence) {
+
+ if ($start <= $occurrence && $end > $occurrence) {
+ return true;
+ }
+ }
+ return false;
+ } else {
+ return ($start <= $effectiveTrigger && $end > $effectiveTrigger);
+ }
+
+ }
+
+}
diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/Component/VCalendar.php b/vendor/sabre/vobject/lib/Sabre/VObject/Component/VCalendar.php
new file mode 100644
index 000000000..9de67982e
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Sabre/VObject/Component/VCalendar.php
@@ -0,0 +1,244 @@
+<?php
+
+namespace Sabre\VObject\Component;
+
+use Sabre\VObject;
+
+/**
+ * The VCalendar component
+ *
+ * This component adds functionality to a component, specific for a VCALENDAR.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class VCalendar extends VObject\Document {
+
+ static $defaultName = 'VCALENDAR';
+
+ /**
+ * Returns a list of all 'base components'. For instance, if an Event has
+ * a recurrence rule, and one instance is overridden, the overridden event
+ * will have the same UID, but will be excluded from this list.
+ *
+ * VTIMEZONE components will always be excluded.
+ *
+ * @param string $componentName filter by component name
+ * @return array
+ */
+ public function getBaseComponents($componentName = null) {
+
+ $components = array();
+ foreach($this->children as $component) {
+
+ if (!$component instanceof VObject\Component)
+ continue;
+
+ if (isset($component->{'RECURRENCE-ID'}))
+ continue;
+
+ if ($componentName && $component->name !== strtoupper($componentName))
+ continue;
+
+ if ($component->name === 'VTIMEZONE')
+ continue;
+
+ $components[] = $component;
+
+ }
+
+ return $components;
+
+ }
+
+ /**
+ * If this calendar object, has events with recurrence rules, this method
+ * can be used to expand the event into multiple sub-events.
+ *
+ * Each event will be stripped from it's recurrence information, and only
+ * the instances of the event in the specified timerange will be left
+ * alone.
+ *
+ * In addition, this method will cause timezone information to be stripped,
+ * and normalized to UTC.
+ *
+ * This method will alter the VCalendar. This cannot be reversed.
+ *
+ * This functionality is specifically used by the CalDAV standard. It is
+ * possible for clients to request expand events, if they are rather simple
+ * clients and do not have the possibility to calculate recurrences.
+ *
+ * @param DateTime $start
+ * @param DateTime $end
+ * @return void
+ */
+ public function expand(\DateTime $start, \DateTime $end) {
+
+ $newEvents = array();
+
+ foreach($this->select('VEVENT') as $key=>$vevent) {
+
+ if (isset($vevent->{'RECURRENCE-ID'})) {
+ unset($this->children[$key]);
+ continue;
+ }
+
+
+ if (!$vevent->rrule) {
+ unset($this->children[$key]);
+ if ($vevent->isInTimeRange($start, $end)) {
+ $newEvents[] = $vevent;
+ }
+ continue;
+ }
+
+ $uid = (string)$vevent->uid;
+ if (!$uid) {
+ throw new \LogicException('Event did not have a UID!');
+ }
+
+ $it = new VObject\RecurrenceIterator($this, $vevent->uid);
+ $it->fastForward($start);
+
+ while($it->valid() && $it->getDTStart() < $end) {
+
+ if ($it->getDTEnd() > $start) {
+
+ $newEvents[] = $it->getEventObject();
+
+ }
+ $it->next();
+
+ }
+ unset($this->children[$key]);
+
+ }
+
+ foreach($newEvents as $newEvent) {
+
+ foreach($newEvent->children as $child) {
+ if ($child instanceof VObject\Property\DateTime &&
+ $child->getDateType() == VObject\Property\DateTime::LOCALTZ) {
+ $child->setDateTime($child->getDateTime(),VObject\Property\DateTime::UTC);
+ }
+ }
+
+ $this->add($newEvent);
+
+ }
+
+ // Removing all VTIMEZONE components
+ unset($this->VTIMEZONE);
+
+ }
+
+ /**
+ * Validates the node for correctness.
+ * An array is returned with warnings.
+ *
+ * Every item in the array has the following properties:
+ * * level - (number between 1 and 3 with severity information)
+ * * message - (human readable message)
+ * * node - (reference to the offending node)
+ *
+ * @return array
+ */
+ /*
+ public function validate() {
+
+ $warnings = array();
+
+ $version = $this->select('VERSION');
+ if (count($version)!==1) {
+ $warnings[] = array(
+ 'level' => 1,
+ 'message' => 'The VERSION property must appear in the VCALENDAR component exactly 1 time',
+ 'node' => $this,
+ );
+ } else {
+ if ((string)$this->VERSION !== '2.0') {
+ $warnings[] = array(
+ 'level' => 1,
+ 'message' => 'Only iCalendar version 2.0 as defined in rfc5545 is supported.',
+ 'node' => $this,
+ );
+ }
+ }
+ $version = $this->select('PRODID');
+ if (count($version)!==1) {
+ $warnings[] = array(
+ 'level' => 2,
+ 'message' => 'The PRODID property must appear in the VCALENDAR component exactly 1 time',
+ 'node' => $this,
+ );
+ }
+ if (count($this->CALSCALE) > 1) {
+ $warnings[] = array(
+ 'level' => 2,
+ 'message' => 'The CALSCALE property must not be specified more than once.',
+ 'node' => $this,
+ );
+ }
+ if (count($this->METHOD) > 1) {
+ $warnings[] = array(
+ 'level' => 2,
+ 'message' => 'The METHOD property must not be specified more than once.',
+ 'node' => $this,
+ );
+ }
+
+ $allowedComponents = array(
+ 'VEVENT',
+ 'VTODO',
+ 'VJOURNAL',
+ 'VFREEBUSY',
+ 'VTIMEZONE',
+ );
+ $allowedProperties = array(
+ 'PRODID',
+ 'VERSION',
+ 'CALSCALE',
+ 'METHOD',
+ );
+ $componentsFound = 0;
+ foreach($this->children as $child) {
+ if($child instanceof Component) {
+ $componentsFound++;
+ if (!in_array($child->name, $allowedComponents)) {
+ $warnings[] = array(
+ 'level' => 1,
+ 'message' => 'The ' . $child->name . " component is not allowed in the VCALENDAR component",
+ 'node' => $this,
+ );
+ }
+ }
+ if ($child instanceof Property) {
+ if (!in_array($child->name, $allowedProperties)) {
+ $warnings[] = array(
+ 'level' => 2,
+ 'message' => 'The ' . $child->name . " property is not allowed in the VCALENDAR component",
+ 'node' => $this,
+ );
+ }
+ }
+ }
+
+ if ($componentsFound===0) {
+ $warnings[] = array(
+ 'level' => 1,
+ 'message' => 'An iCalendar object must have at least 1 component.',
+ 'node' => $this,
+ );
+ }
+
+ return array_merge(
+ $warnings,
+ parent::validate()
+ );
+
+ }
+ */
+
+}
+
diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/Component/VCard.php b/vendor/sabre/vobject/lib/Sabre/VObject/Component/VCard.php
new file mode 100644
index 000000000..0fc8b7020
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Sabre/VObject/Component/VCard.php
@@ -0,0 +1,107 @@
+<?php
+
+namespace Sabre\VObject\Component;
+
+use Sabre\VObject;
+
+/**
+ * The VCard component
+ *
+ * This component represents the BEGIN:VCARD and END:VCARD found in every
+ * vcard.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class VCard extends VObject\Component {
+
+ static $defaultName = 'VCARD';
+
+ /**
+ * VCards with version 2.1, 3.0 and 4.0 are found.
+ *
+ * If the VCARD doesn't know its version, 4.0 is assumed.
+ */
+ const DEFAULT_VERSION = '4.0';
+
+ /**
+ * Validates the node for correctness.
+ *
+ * The following options are supported:
+ * - Node::REPAIR - If something is broken, and automatic repair may
+ * be attempted.
+ *
+ * An array is returned with warnings.
+ *
+ * Every item in the array has the following properties:
+ * * level - (number between 1 and 3 with severity information)
+ * * message - (human readable message)
+ * * node - (reference to the offending node)
+ *
+ * @param int $options
+ * @return array
+ */
+ public function validate($options = 0) {
+
+ $warnings = array();
+
+ $version = $this->select('VERSION');
+ if (count($version)!==1) {
+ $warnings[] = array(
+ 'level' => 1,
+ 'message' => 'The VERSION property must appear in the VCARD component exactly 1 time',
+ 'node' => $this,
+ );
+ if ($options & self::REPAIR) {
+ $this->VERSION = self::DEFAULT_VERSION;
+ }
+ } else {
+ $version = (string)$this->VERSION;
+ if ($version!=='2.1' && $version!=='3.0' && $version!=='4.0') {
+ $warnings[] = array(
+ 'level' => 1,
+ 'message' => 'Only vcard version 4.0 (RFC6350), version 3.0 (RFC2426) or version 2.1 (icm-vcard-2.1) are supported.',
+ 'node' => $this,
+ );
+ if ($options & self::REPAIR) {
+ $this->VERSION = '4.0';
+ }
+ }
+
+ }
+ $fn = $this->select('FN');
+ if (count($fn)!==1) {
+ $warnings[] = array(
+ 'level' => 1,
+ 'message' => 'The FN property must appear in the VCARD component exactly 1 time',
+ 'node' => $this,
+ );
+ if (($options & self::REPAIR) && count($fn) === 0) {
+ // We're going to try to see if we can use the contents of the
+ // N property.
+ if (isset($this->N)) {
+ $value = explode(';', (string)$this->N);
+ if (isset($value[1]) && $value[1]) {
+ $this->FN = $value[1] . ' ' . $value[0];
+ } else {
+ $this->FN = $value[0];
+ }
+
+ // Otherwise, the ORG property may work
+ } elseif (isset($this->ORG)) {
+ $this->FN = (string)$this->ORG;
+ }
+
+ }
+ }
+
+ return array_merge(
+ parent::validate($options),
+ $warnings
+ );
+
+ }
+
+}
+
diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/Component/VEvent.php b/vendor/sabre/vobject/lib/Sabre/VObject/Component/VEvent.php
new file mode 100644
index 000000000..2375c5317
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Sabre/VObject/Component/VEvent.php
@@ -0,0 +1,70 @@
+<?php
+
+namespace Sabre\VObject\Component;
+use Sabre\VObject;
+
+/**
+ * VEvent component
+ *
+ * This component contains some additional functionality specific for VEVENT's.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class VEvent extends VObject\Component {
+
+ /**
+ * Returns true or false depending on if the event falls in the specified
+ * time-range. This is used for filtering purposes.
+ *
+ * The rules used to determine if an event falls within the specified
+ * time-range is based on the CalDAV specification.
+ *
+ * @param \DateTime $start
+ * @param \DateTime $end
+ * @return bool
+ */
+ public function isInTimeRange(\DateTime $start, \DateTime $end) {
+
+ if ($this->RRULE) {
+ $it = new VObject\RecurrenceIterator($this);
+ $it->fastForward($start);
+
+ // We fast-forwarded to a spot where the end-time of the
+ // recurrence instance exceeded the start of the requested
+ // time-range.
+ //
+ // If the starttime of the recurrence did not exceed the
+ // end of the time range as well, we have a match.
+ return ($it->getDTStart() < $end && $it->getDTEnd() > $start);
+
+ }
+
+ $effectiveStart = $this->DTSTART->getDateTime();
+ if (isset($this->DTEND)) {
+
+ // The DTEND property is considered non inclusive. So for a 3 day
+ // event in july, dtstart and dtend would have to be July 1st and
+ // July 4th respectively.
+ //
+ // See:
+ // http://tools.ietf.org/html/rfc5545#page-54
+ $effectiveEnd = $this->DTEND->getDateTime();
+
+ } elseif (isset($this->DURATION)) {
+ $effectiveEnd = clone $effectiveStart;
+ $effectiveEnd->add( VObject\DateTimeParser::parseDuration($this->DURATION) );
+ } elseif ($this->DTSTART->getDateType() == VObject\Property\DateTime::DATE) {
+ $effectiveEnd = clone $effectiveStart;
+ $effectiveEnd->modify('+1 day');
+ } else {
+ $effectiveEnd = clone $effectiveStart;
+ }
+ return (
+ ($start <= $effectiveEnd) && ($end > $effectiveStart)
+ );
+
+ }
+
+}
diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/Component/VFreeBusy.php b/vendor/sabre/vobject/lib/Sabre/VObject/Component/VFreeBusy.php
new file mode 100644
index 000000000..7afe9fdb3
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Sabre/VObject/Component/VFreeBusy.php
@@ -0,0 +1,68 @@
+<?php
+
+namespace Sabre\VObject\Component;
+
+use Sabre\VObject;
+
+/**
+ * The VFreeBusy component
+ *
+ * This component adds functionality to a component, specific for VFREEBUSY
+ * components.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class VFreeBusy extends VObject\Component {
+
+ /**
+ * Checks based on the contained FREEBUSY information, if a timeslot is
+ * available.
+ *
+ * @param DateTime $start
+ * @param Datetime $end
+ * @return bool
+ */
+ public function isFree(\DateTime $start, \Datetime $end) {
+
+ foreach($this->select('FREEBUSY') as $freebusy) {
+
+ // We are only interested in FBTYPE=BUSY (the default),
+ // FBTYPE=BUSY-TENTATIVE or FBTYPE=BUSY-UNAVAILABLE.
+ if (isset($freebusy['FBTYPE']) && strtoupper(substr((string)$freebusy['FBTYPE'],0,4))!=='BUSY') {
+ continue;
+ }
+
+ // The freebusy component can hold more than 1 value, separated by
+ // commas.
+ $periods = explode(',', (string)$freebusy);
+
+ foreach($periods as $period) {
+ // Every period is formatted as [start]/[end]. The start is an
+ // absolute UTC time, the end may be an absolute UTC time, or
+ // duration (relative) value.
+ list($busyStart, $busyEnd) = explode('/', $period);
+
+ $busyStart = VObject\DateTimeParser::parse($busyStart);
+ $busyEnd = VObject\DateTimeParser::parse($busyEnd);
+ if ($busyEnd instanceof \DateInterval) {
+ $tmp = clone $busyStart;
+ $tmp->add($busyEnd);
+ $busyEnd = $tmp;
+ }
+
+ if($start < $busyEnd && $end > $busyStart) {
+ return false;
+ }
+
+ }
+
+ }
+
+ return true;
+
+ }
+
+}
+
diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/Component/VJournal.php b/vendor/sabre/vobject/lib/Sabre/VObject/Component/VJournal.php
new file mode 100644
index 000000000..232887879
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Sabre/VObject/Component/VJournal.php
@@ -0,0 +1,46 @@
+<?php
+
+namespace Sabre\VObject\Component;
+
+use Sabre\VObject;
+
+/**
+ * VJournal component
+ *
+ * This component contains some additional functionality specific for VJOURNALs.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class VJournal extends VObject\Component {
+
+ /**
+ * Returns true or false depending on if the event falls in the specified
+ * time-range. This is used for filtering purposes.
+ *
+ * The rules used to determine if an event falls within the specified
+ * time-range is based on the CalDAV specification.
+ *
+ * @param DateTime $start
+ * @param DateTime $end
+ * @return bool
+ */
+ public function isInTimeRange(\DateTime $start, \DateTime $end) {
+
+ $dtstart = isset($this->DTSTART)?$this->DTSTART->getDateTime():null;
+ if ($dtstart) {
+ $effectiveEnd = clone $dtstart;
+ if ($this->DTSTART->getDateType() == VObject\Property\DateTime::DATE) {
+ $effectiveEnd->modify('+1 day');
+ }
+
+ return ($start <= $effectiveEnd && $end > $dtstart);
+
+ }
+ return false;
+
+
+ }
+
+}
diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/Component/VTodo.php b/vendor/sabre/vobject/lib/Sabre/VObject/Component/VTodo.php
new file mode 100644
index 000000000..b1579cf74
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Sabre/VObject/Component/VTodo.php
@@ -0,0 +1,68 @@
+<?php
+
+namespace Sabre\VObject\Component;
+
+use Sabre\VObject;
+
+/**
+ * VTodo component
+ *
+ * This component contains some additional functionality specific for VTODOs.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class VTodo extends VObject\Component {
+
+ /**
+ * Returns true or false depending on if the event falls in the specified
+ * time-range. This is used for filtering purposes.
+ *
+ * The rules used to determine if an event falls within the specified
+ * time-range is based on the CalDAV specification.
+ *
+ * @param DateTime $start
+ * @param DateTime $end
+ * @return bool
+ */
+ public function isInTimeRange(\DateTime $start, \DateTime $end) {
+
+ $dtstart = isset($this->DTSTART)?$this->DTSTART->getDateTime():null;
+ $duration = isset($this->DURATION)?VObject\DateTimeParser::parseDuration($this->DURATION):null;
+ $due = isset($this->DUE)?$this->DUE->getDateTime():null;
+ $completed = isset($this->COMPLETED)?$this->COMPLETED->getDateTime():null;
+ $created = isset($this->CREATED)?$this->CREATED->getDateTime():null;
+
+ if ($dtstart) {
+ if ($duration) {
+ $effectiveEnd = clone $dtstart;
+ $effectiveEnd->add($duration);
+ return $start <= $effectiveEnd && $end > $dtstart;
+ } elseif ($due) {
+ return
+ ($start < $due || $start <= $dtstart) &&
+ ($end > $dtstart || $end >= $due);
+ } else {
+ return $start <= $dtstart && $end > $dtstart;
+ }
+ }
+ if ($due) {
+ return ($start < $due && $end >= $due);
+ }
+ if ($completed && $created) {
+ return
+ ($start <= $created || $start <= $completed) &&
+ ($end >= $created || $end >= $completed);
+ }
+ if ($completed) {
+ return ($start <= $completed && $end >= $completed);
+ }
+ if ($created) {
+ return ($end > $created);
+ }
+ return true;
+
+ }
+
+}
diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/DateTimeParser.php b/vendor/sabre/vobject/lib/Sabre/VObject/DateTimeParser.php
new file mode 100644
index 000000000..03600506d
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Sabre/VObject/DateTimeParser.php
@@ -0,0 +1,181 @@
+<?php
+
+namespace Sabre\VObject;
+
+/**
+ * DateTimeParser
+ *
+ * This class is responsible for parsing the several different date and time
+ * formats iCalendar and vCards have.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class DateTimeParser {
+
+ /**
+ * Parses an iCalendar (rfc5545) formatted datetime and returns a DateTime object
+ *
+ * Specifying a reference timezone is optional. It will only be used
+ * if the non-UTC format is used. The argument is used as a reference, the
+ * returned DateTime object will still be in the UTC timezone.
+ *
+ * @param string $dt
+ * @param DateTimeZone $tz
+ * @return DateTime
+ */
+ static public function parseDateTime($dt,\DateTimeZone $tz = null) {
+
+ // Format is YYYYMMDD + "T" + hhmmss
+ $result = preg_match('/^([1-4][0-9]{3})([0-1][0-9])([0-3][0-9])T([0-2][0-9])([0-5][0-9])([0-5][0-9])([Z]?)$/',$dt,$matches);
+
+ if (!$result) {
+ throw new \LogicException('The supplied iCalendar datetime value is incorrect: ' . $dt);
+ }
+
+ if ($matches[7]==='Z' || is_null($tz)) {
+ $tz = new \DateTimeZone('UTC');
+ }
+ $date = new \DateTime($matches[1] . '-' . $matches[2] . '-' . $matches[3] . ' ' . $matches[4] . ':' . $matches[5] .':' . $matches[6], $tz);
+
+ // Still resetting the timezone, to normalize everything to UTC
+ $date->setTimeZone(new \DateTimeZone('UTC'));
+ return $date;
+
+ }
+
+ /**
+ * Parses an iCalendar (rfc5545) formatted date and returns a DateTime object
+ *
+ * @param string $date
+ * @return DateTime
+ */
+ static public function parseDate($date) {
+
+ // Format is YYYYMMDD
+ $result = preg_match('/^([1-4][0-9]{3})([0-1][0-9])([0-3][0-9])$/',$date,$matches);
+
+ if (!$result) {
+ throw new \LogicException('The supplied iCalendar date value is incorrect: ' . $date);
+ }
+
+ $date = new \DateTime($matches[1] . '-' . $matches[2] . '-' . $matches[3], new \DateTimeZone('UTC'));
+ return $date;
+
+ }
+
+ /**
+ * Parses an iCalendar (RFC5545) formatted duration value.
+ *
+ * This method will either return a DateTimeInterval object, or a string
+ * suitable for strtotime or DateTime::modify.
+ *
+ * @param string $duration
+ * @param bool $asString
+ * @return DateInterval|string
+ */
+ static public function parseDuration($duration, $asString = false) {
+
+ $result = preg_match('/^(?P<plusminus>\+|-)?P((?P<week>\d+)W)?((?P<day>\d+)D)?(T((?P<hour>\d+)H)?((?P<minute>\d+)M)?((?P<second>\d+)S)?)?$/', $duration, $matches);
+ if (!$result) {
+ throw new \LogicException('The supplied iCalendar duration value is incorrect: ' . $duration);
+ }
+
+ if (!$asString) {
+ $invert = false;
+ if ($matches['plusminus']==='-') {
+ $invert = true;
+ }
+
+
+ $parts = array(
+ 'week',
+ 'day',
+ 'hour',
+ 'minute',
+ 'second',
+ );
+ foreach($parts as $part) {
+ $matches[$part] = isset($matches[$part])&&$matches[$part]?(int)$matches[$part]:0;
+ }
+
+
+ // We need to re-construct the $duration string, because weeks and
+ // days are not supported by DateInterval in the same string.
+ $duration = 'P';
+ $days = $matches['day'];
+ if ($matches['week']) {
+ $days+=$matches['week']*7;
+ }
+ if ($days)
+ $duration.=$days . 'D';
+
+ if ($matches['minute'] || $matches['second'] || $matches['hour']) {
+ $duration.='T';
+
+ if ($matches['hour'])
+ $duration.=$matches['hour'].'H';
+
+ if ($matches['minute'])
+ $duration.=$matches['minute'].'M';
+
+ if ($matches['second'])
+ $duration.=$matches['second'].'S';
+
+ }
+
+ if ($duration==='P') {
+ $duration = 'PT0S';
+ }
+ $iv = new \DateInterval($duration);
+ if ($invert) $iv->invert = true;
+
+ return $iv;
+
+ }
+
+
+
+ $parts = array(
+ 'week',
+ 'day',
+ 'hour',
+ 'minute',
+ 'second',
+ );
+
+ $newDur = '';
+ foreach($parts as $part) {
+ if (isset($matches[$part]) && $matches[$part]) {
+ $newDur.=' '.$matches[$part] . ' ' . $part . 's';
+ }
+ }
+
+ $newDur = ($matches['plusminus']==='-'?'-':'+') . trim($newDur);
+ if ($newDur === '+') { $newDur = '+0 seconds'; };
+ return $newDur;
+
+ }
+
+ /**
+ * Parses either a Date or DateTime, or Duration value.
+ *
+ * @param string $date
+ * @param DateTimeZone|string $referenceTZ
+ * @return DateTime|DateInterval
+ */
+ static public function parse($date, $referenceTZ = null) {
+
+ if ($date[0]==='P' || ($date[0]==='-' && $date[1]==='P')) {
+ return self::parseDuration($date);
+ } elseif (strlen($date)===8) {
+ return self::parseDate($date);
+ } else {
+ return self::parseDateTime($date, $referenceTZ);
+ }
+
+ }
+
+
+}
diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/Document.php b/vendor/sabre/vobject/lib/Sabre/VObject/Document.php
new file mode 100644
index 000000000..50a662ee9
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Sabre/VObject/Document.php
@@ -0,0 +1,109 @@
+<?php
+
+namespace Sabre\VObject;
+
+/**
+ * Document
+ *
+ * A document is just like a component, except that it's also the top level
+ * element.
+ *
+ * Both a VCALENDAR and a VCARD are considered documents.
+ *
+ * This class also provides a registry for document types.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH. All rights reserved.
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+abstract class Document extends Component {
+
+ /**
+ * The default name for this component.
+ *
+ * This should be 'VCALENDAR' or 'VCARD'.
+ *
+ * @var string
+ */
+ static $defaultName;
+
+ /**
+ * Creates a new document.
+ *
+ * We're changing the default behavior slightly here. First, we don't want
+ * to have to specify a name (we already know it), and we want to allow
+ * children to be specified in the first argument.
+ *
+ * But, the default behavior also works.
+ *
+ * So the two sigs:
+ *
+ * new Document(array $children = array());
+ * new Document(string $name, array $children = array())
+ *
+ * @return void
+ */
+ public function __construct() {
+
+ $args = func_get_args();
+ if (count($args)===0 || is_array($args[0])) {
+ array_unshift($args, static::$defaultName);
+ call_user_func_array(array('parent', '__construct'), $args);
+ } else {
+ call_user_func_array(array('parent', '__construct'), $args);
+ }
+
+ }
+
+ /**
+ * Creates a new component
+ *
+ * This method automatically searches for the correct component class, based
+ * on its name.
+ *
+ * You can specify the children either in key=>value syntax, in which case
+ * properties will automatically be created, or you can just pass a list of
+ * Component and Property object.
+ *
+ * @param string $name
+ * @param array $children
+ * @return Component
+ */
+ public function createComponent($name, array $children = array()) {
+
+ $component = Component::create($name);
+ foreach($children as $k=>$v) {
+
+ if ($v instanceof Node) {
+ $component->add($v);
+ } else {
+ $component->add($k, $v);
+ }
+
+ }
+ return $component;
+
+ }
+
+ /**
+ * Factory method for creating new properties
+ *
+ * This method automatically searches for the correct property class, based
+ * on its name.
+ *
+ * You can specify the parameters either in key=>value syntax, in which case
+ * parameters will automatically be created, or you can just pass a list of
+ * Parameter objects.
+ *
+ * @param string $name
+ * @param mixed $value
+ * @param array $parameters
+ * @return Property
+ */
+ public function createProperty($name, $value = null, array $parameters = array()) {
+
+ return Property::create($name, $value, $parameters);
+
+ }
+
+}
diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/ElementList.php b/vendor/sabre/vobject/lib/Sabre/VObject/ElementList.php
new file mode 100644
index 000000000..1c203708e
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Sabre/VObject/ElementList.php
@@ -0,0 +1,172 @@
+<?php
+
+namespace Sabre\VObject;
+
+/**
+ * VObject ElementList
+ *
+ * This class represents a list of elements. Lists are the result of queries,
+ * such as doing $vcalendar->vevent where there's multiple VEVENT objects.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class ElementList implements \Iterator, \Countable, \ArrayAccess {
+
+ /**
+ * Inner elements
+ *
+ * @var array
+ */
+ protected $elements = array();
+
+ /**
+ * Creates the element list.
+ *
+ * @param array $elements
+ */
+ public function __construct(array $elements) {
+
+ $this->elements = $elements;
+
+ }
+
+ /* {{{ Iterator interface */
+
+ /**
+ * Current position
+ *
+ * @var int
+ */
+ private $key = 0;
+
+ /**
+ * Returns current item in iteration
+ *
+ * @return Element
+ */
+ public function current() {
+
+ return $this->elements[$this->key];
+
+ }
+
+ /**
+ * To the next item in the iterator
+ *
+ * @return void
+ */
+ public function next() {
+
+ $this->key++;
+
+ }
+
+ /**
+ * Returns the current iterator key
+ *
+ * @return int
+ */
+ public function key() {
+
+ return $this->key;
+
+ }
+
+ /**
+ * Returns true if the current position in the iterator is a valid one
+ *
+ * @return bool
+ */
+ public function valid() {
+
+ return isset($this->elements[$this->key]);
+
+ }
+
+ /**
+ * Rewinds the iterator
+ *
+ * @return void
+ */
+ public function rewind() {
+
+ $this->key = 0;
+
+ }
+
+ /* }}} */
+
+ /* {{{ Countable interface */
+
+ /**
+ * Returns the number of elements
+ *
+ * @return int
+ */
+ public function count() {
+
+ return count($this->elements);
+
+ }
+
+ /* }}} */
+
+ /* {{{ ArrayAccess Interface */
+
+
+ /**
+ * Checks if an item exists through ArrayAccess.
+ *
+ * @param int $offset
+ * @return bool
+ */
+ public function offsetExists($offset) {
+
+ return isset($this->elements[$offset]);
+
+ }
+
+ /**
+ * Gets an item through ArrayAccess.
+ *
+ * @param int $offset
+ * @return mixed
+ */
+ public function offsetGet($offset) {
+
+ return $this->elements[$offset];
+
+ }
+
+ /**
+ * Sets an item through ArrayAccess.
+ *
+ * @param int $offset
+ * @param mixed $value
+ * @return void
+ */
+ public function offsetSet($offset,$value) {
+
+ throw new \LogicException('You can not add new objects to an ElementList');
+
+ }
+
+ /**
+ * Sets an item through ArrayAccess.
+ *
+ * This method just forwards the request to the inner iterator
+ *
+ * @param int $offset
+ * @return void
+ */
+ public function offsetUnset($offset) {
+
+ throw new \LogicException('You can not remove objects from an ElementList');
+
+ }
+
+ /* }}} */
+
+}
diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/FreeBusyGenerator.php b/vendor/sabre/vobject/lib/Sabre/VObject/FreeBusyGenerator.php
new file mode 100644
index 000000000..96d0be5ac
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Sabre/VObject/FreeBusyGenerator.php
@@ -0,0 +1,322 @@
+<?php
+
+namespace Sabre\VObject;
+
+/**
+ * This class helps with generating FREEBUSY reports based on existing sets of
+ * objects.
+ *
+ * It only looks at VEVENT and VFREEBUSY objects from the sourcedata, and
+ * generates a single VFREEBUSY object.
+ *
+ * VFREEBUSY components are described in RFC5545, The rules for what should
+ * go in a single freebusy report is taken from RFC4791, section 7.10.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class FreeBusyGenerator {
+
+ /**
+ * Input objects
+ *
+ * @var array
+ */
+ protected $objects;
+
+ /**
+ * Start of range
+ *
+ * @var DateTime|null
+ */
+ protected $start;
+
+ /**
+ * End of range
+ *
+ * @var DateTime|null
+ */
+ protected $end;
+
+ /**
+ * VCALENDAR object
+ *
+ * @var Component
+ */
+ protected $baseObject;
+
+ /**
+ * Creates the generator.
+ *
+ * Check the setTimeRange and setObjects methods for details about the
+ * arguments.
+ *
+ * @param DateTime $start
+ * @param DateTime $end
+ * @param mixed $objects
+ * @return void
+ */
+ public function __construct(\DateTime $start = null, \DateTime $end = null, $objects = null) {
+
+ if ($start && $end) {
+ $this->setTimeRange($start, $end);
+ }
+
+ if ($objects) {
+ $this->setObjects($objects);
+ }
+
+ }
+
+ /**
+ * Sets the VCALENDAR object.
+ *
+ * If this is set, it will not be generated for you. You are responsible
+ * for setting things like the METHOD, CALSCALE, VERSION, etc..
+ *
+ * The VFREEBUSY object will be automatically added though.
+ *
+ * @param Component $vcalendar
+ * @return void
+ */
+ public function setBaseObject(Component $vcalendar) {
+
+ $this->baseObject = $vcalendar;
+
+ }
+
+ /**
+ * Sets the input objects
+ *
+ * You must either specify a valendar object as a strong, or as the parse
+ * Component.
+ * It's also possible to specify multiple objects as an array.
+ *
+ * @param mixed $objects
+ * @return void
+ */
+ public function setObjects($objects) {
+
+ if (!is_array($objects)) {
+ $objects = array($objects);
+ }
+
+ $this->objects = array();
+ foreach($objects as $object) {
+
+ if (is_string($object)) {
+ $this->objects[] = Reader::read($object);
+ } elseif ($object instanceof Component) {
+ $this->objects[] = $object;
+ } else {
+ throw new \InvalidArgumentException('You can only pass strings or \\Sabre\\VObject\\Component arguments to setObjects');
+ }
+
+ }
+
+ }
+
+ /**
+ * Sets the time range
+ *
+ * Any freebusy object falling outside of this time range will be ignored.
+ *
+ * @param DateTime $start
+ * @param DateTime $end
+ * @return void
+ */
+ public function setTimeRange(\DateTime $start = null, \DateTime $end = null) {
+
+ $this->start = $start;
+ $this->end = $end;
+
+ }
+
+ /**
+ * Parses the input data and returns a correct VFREEBUSY object, wrapped in
+ * a VCALENDAR.
+ *
+ * @return Component
+ */
+ public function getResult() {
+
+ $busyTimes = array();
+
+ foreach($this->objects as $object) {
+
+ foreach($object->getBaseComponents() as $component) {
+
+ switch($component->name) {
+
+ case 'VEVENT' :
+
+ $FBTYPE = 'BUSY';
+ if (isset($component->TRANSP) && (strtoupper($component->TRANSP) === 'TRANSPARENT')) {
+ break;
+ }
+ if (isset($component->STATUS)) {
+ $status = strtoupper($component->STATUS);
+ if ($status==='CANCELLED') {
+ break;
+ }
+ if ($status==='TENTATIVE') {
+ $FBTYPE = 'BUSY-TENTATIVE';
+ }
+ }
+
+ $times = array();
+
+ if ($component->RRULE) {
+
+ $iterator = new RecurrenceIterator($object, (string)$component->uid);
+ if ($this->start) {
+ $iterator->fastForward($this->start);
+ }
+
+ $maxRecurrences = 200;
+
+ while($iterator->valid() && --$maxRecurrences) {
+
+ $startTime = $iterator->getDTStart();
+ if ($this->end && $startTime > $this->end) {
+ break;
+ }
+ $times[] = array(
+ $iterator->getDTStart(),
+ $iterator->getDTEnd(),
+ );
+
+ $iterator->next();
+
+ }
+
+ } else {
+
+ $startTime = $component->DTSTART->getDateTime();
+ if ($this->end && $startTime > $this->end) {
+ break;
+ }
+ $endTime = null;
+ if (isset($component->DTEND)) {
+ $endTime = $component->DTEND->getDateTime();
+ } elseif (isset($component->DURATION)) {
+ $duration = DateTimeParser::parseDuration((string)$component->DURATION);
+ $endTime = clone $startTime;
+ $endTime->add($duration);
+ } elseif ($component->DTSTART->getDateType() === Property\DateTime::DATE) {
+ $endTime = clone $startTime;
+ $endTime->modify('+1 day');
+ } else {
+ // The event had no duration (0 seconds)
+ break;
+ }
+
+ $times[] = array($startTime, $endTime);
+
+ }
+
+ foreach($times as $time) {
+
+ if ($this->end && $time[0] > $this->end) break;
+ if ($this->start && $time[1] < $this->start) break;
+
+ $busyTimes[] = array(
+ $time[0],
+ $time[1],
+ $FBTYPE,
+ );
+ }
+ break;
+
+ case 'VFREEBUSY' :
+ foreach($component->FREEBUSY as $freebusy) {
+
+ $fbType = isset($freebusy['FBTYPE'])?strtoupper($freebusy['FBTYPE']):'BUSY';
+
+ // Skipping intervals marked as 'free'
+ if ($fbType==='FREE')
+ continue;
+
+ $values = explode(',', $freebusy);
+ foreach($values as $value) {
+ list($startTime, $endTime) = explode('/', $value);
+ $startTime = DateTimeParser::parseDateTime($startTime);
+
+ if (substr($endTime,0,1)==='P' || substr($endTime,0,2)==='-P') {
+ $duration = DateTimeParser::parseDuration($endTime);
+ $endTime = clone $startTime;
+ $endTime->add($duration);
+ } else {
+ $endTime = DateTimeParser::parseDateTime($endTime);
+ }
+
+ if($this->start && $this->start > $endTime) continue;
+ if($this->end && $this->end < $startTime) continue;
+ $busyTimes[] = array(
+ $startTime,
+ $endTime,
+ $fbType
+ );
+
+ }
+
+
+ }
+ break;
+
+
+
+ }
+
+
+ }
+
+ }
+
+ if ($this->baseObject) {
+ $calendar = $this->baseObject;
+ } else {
+ $calendar = Component::create('VCALENDAR');
+ $calendar->version = '2.0';
+ $calendar->prodid = '-//Sabre//Sabre VObject ' . Version::VERSION . '//EN';
+ $calendar->calscale = 'GREGORIAN';
+ }
+
+ $vfreebusy = Component::create('VFREEBUSY');
+ $calendar->add($vfreebusy);
+
+ if ($this->start) {
+ $dtstart = Property::create('DTSTART');
+ $dtstart->setDateTime($this->start,Property\DateTime::UTC);
+ $vfreebusy->add($dtstart);
+ }
+ if ($this->end) {
+ $dtend = Property::create('DTEND');
+ $dtend->setDateTime($this->end,Property\DateTime::UTC);
+ $vfreebusy->add($dtend);
+ }
+ $dtstamp = Property::create('DTSTAMP');
+ $dtstamp->setDateTime(new \DateTime('now'), Property\DateTime::UTC);
+ $vfreebusy->add($dtstamp);
+
+ foreach($busyTimes as $busyTime) {
+
+ $busyTime[0]->setTimeZone(new \DateTimeZone('UTC'));
+ $busyTime[1]->setTimeZone(new \DateTimeZone('UTC'));
+
+ $prop = Property::create(
+ 'FREEBUSY',
+ $busyTime[0]->format('Ymd\\THis\\Z') . '/' . $busyTime[1]->format('Ymd\\THis\\Z')
+ );
+ $prop['FBTYPE'] = $busyTime[2];
+ $vfreebusy->add($prop);
+
+ }
+
+ return $calendar;
+
+ }
+
+}
+
diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/Node.php b/vendor/sabre/vobject/lib/Sabre/VObject/Node.php
new file mode 100644
index 000000000..bee68ec2a
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Sabre/VObject/Node.php
@@ -0,0 +1,187 @@
+<?php
+
+namespace Sabre\VObject;
+
+/**
+ * Base class for all nodes
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+abstract class Node implements \IteratorAggregate, \ArrayAccess, \Countable {
+
+ /**
+ * The following constants are used by the validate() method.
+ */
+ const REPAIR = 1;
+
+ /**
+ * Turns the object back into a serialized blob.
+ *
+ * @return string
+ */
+ abstract function serialize();
+
+ /**
+ * Iterator override
+ *
+ * @var ElementList
+ */
+ protected $iterator = null;
+
+ /**
+ * A link to the parent node
+ *
+ * @var Node
+ */
+ public $parent = null;
+
+ /**
+ * Validates the node for correctness.
+ *
+ * The following options are supported:
+ * - Node::REPAIR - If something is broken, and automatic repair may
+ * be attempted.
+ *
+ * An array is returned with warnings.
+ *
+ * Every item in the array has the following properties:
+ * * level - (number between 1 and 3 with severity information)
+ * * message - (human readable message)
+ * * node - (reference to the offending node)
+ *
+ * @param int $options
+ * @return array
+ */
+ public function validate($options = 0) {
+
+ return array();
+
+ }
+
+ /* {{{ IteratorAggregator interface */
+
+ /**
+ * Returns the iterator for this object
+ *
+ * @return ElementList
+ */
+ public function getIterator() {
+
+ if (!is_null($this->iterator))
+ return $this->iterator;
+
+ return new ElementList(array($this));
+
+ }
+
+ /**
+ * Sets the overridden iterator
+ *
+ * Note that this is not actually part of the iterator interface
+ *
+ * @param ElementList $iterator
+ * @return void
+ */
+ public function setIterator(ElementList $iterator) {
+
+ $this->iterator = $iterator;
+
+ }
+
+ /* }}} */
+
+ /* {{{ Countable interface */
+
+ /**
+ * Returns the number of elements
+ *
+ * @return int
+ */
+ public function count() {
+
+ $it = $this->getIterator();
+ return $it->count();
+
+ }
+
+ /* }}} */
+
+ /* {{{ ArrayAccess Interface */
+
+
+ /**
+ * Checks if an item exists through ArrayAccess.
+ *
+ * This method just forwards the request to the inner iterator
+ *
+ * @param int $offset
+ * @return bool
+ */
+ public function offsetExists($offset) {
+
+ $iterator = $this->getIterator();
+ return $iterator->offsetExists($offset);
+
+ }
+
+ /**
+ * Gets an item through ArrayAccess.
+ *
+ * This method just forwards the request to the inner iterator
+ *
+ * @param int $offset
+ * @return mixed
+ */
+ public function offsetGet($offset) {
+
+ $iterator = $this->getIterator();
+ return $iterator->offsetGet($offset);
+
+ }
+
+ /**
+ * Sets an item through ArrayAccess.
+ *
+ * This method just forwards the request to the inner iterator
+ *
+ * @param int $offset
+ * @param mixed $value
+ * @return void
+ */
+ public function offsetSet($offset,$value) {
+
+ $iterator = $this->getIterator();
+ $iterator->offsetSet($offset,$value);
+
+ // @codeCoverageIgnoreStart
+ //
+ // This method always throws an exception, so we ignore the closing
+ // brace
+ }
+ // @codeCoverageIgnoreEnd
+
+ /**
+ * Sets an item through ArrayAccess.
+ *
+ * This method just forwards the request to the inner iterator
+ *
+ * @param int $offset
+ * @return void
+ */
+ public function offsetUnset($offset) {
+
+ $iterator = $this->getIterator();
+ $iterator->offsetUnset($offset);
+
+ // @codeCoverageIgnoreStart
+ //
+ // This method always throws an exception, so we ignore the closing
+ // brace
+ }
+ // @codeCoverageIgnoreEnd
+
+ /* }}} */
+
+}
diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/Parameter.php b/vendor/sabre/vobject/lib/Sabre/VObject/Parameter.php
new file mode 100644
index 000000000..72bf03b47
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Sabre/VObject/Parameter.php
@@ -0,0 +1,104 @@
+<?php
+
+namespace Sabre\VObject;
+
+/**
+ * VObject Parameter
+ *
+ * This class represents a parameter. A parameter is always tied to a property.
+ * In the case of:
+ * DTSTART;VALUE=DATE:20101108
+ * VALUE=DATE would be the parameter name and value.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Parameter extends Node {
+
+ /**
+ * Parameter name
+ *
+ * @var string
+ */
+ public $name;
+
+ /**
+ * Parameter value
+ *
+ * @var string
+ */
+ public $value;
+
+ /**
+ * Sets up the object
+ *
+ * @param string $name
+ * @param string $value
+ */
+ public function __construct($name, $value = null) {
+
+ if (!is_scalar($value) && !is_null($value)) {
+ throw new \InvalidArgumentException('The value argument must be a scalar value or null');
+ }
+
+ $this->name = strtoupper($name);
+ $this->value = $value;
+
+ }
+
+ /**
+ * Returns the parameter's internal value.
+ *
+ * @return string
+ */
+ public function getValue() {
+
+ return $this->value;
+
+ }
+
+
+ /**
+ * Turns the object back into a serialized blob.
+ *
+ * @return string
+ */
+ public function serialize() {
+
+ if (is_null($this->value)) {
+ return $this->name;
+ }
+ $src = array(
+ '\\',
+ "\n",
+ ';',
+ ',',
+ );
+ $out = array(
+ '\\\\',
+ '\n',
+ '\;',
+ '\,',
+ );
+
+ $value = str_replace($src, $out, $this->value);
+ if (strpos($value,":")!==false) {
+ $value = '"' . $value . '"';
+ }
+ return $this->name . '=' . $value;
+
+ }
+
+ /**
+ * Called when this object is being cast to a string
+ *
+ * @return string
+ */
+ public function __toString() {
+
+ return $this->value;
+
+ }
+
+}
diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/ParseException.php b/vendor/sabre/vobject/lib/Sabre/VObject/ParseException.php
new file mode 100644
index 000000000..66b49c606
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Sabre/VObject/ParseException.php
@@ -0,0 +1,12 @@
+<?php
+
+namespace Sabre\VObject;
+
+/**
+ * Exception thrown by Reader if an invalid object was attempted to be parsed.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class ParseException extends \Exception { }
diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/Property.php b/vendor/sabre/vobject/lib/Sabre/VObject/Property.php
new file mode 100644
index 000000000..63ae64574
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Sabre/VObject/Property.php
@@ -0,0 +1,444 @@
+<?php
+
+namespace Sabre\VObject;
+
+/**
+ * VObject Property
+ *
+ * A property in VObject is usually in the form PARAMNAME:paramValue.
+ * An example is : SUMMARY:Weekly meeting
+ *
+ * Properties can also have parameters:
+ * SUMMARY;LANG=en:Weekly meeting.
+ *
+ * Parameters can be accessed using the ArrayAccess interface.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Property extends Node {
+
+ /**
+ * Propertyname
+ *
+ * @var string
+ */
+ public $name;
+
+ /**
+ * Group name
+ *
+ * This may be something like 'HOME' for vcards.
+ *
+ * @var string
+ */
+ public $group;
+
+ /**
+ * Property parameters
+ *
+ * @var array
+ */
+ public $parameters = array();
+
+ /**
+ * Property value
+ *
+ * @var string
+ */
+ public $value;
+
+ /**
+ * If properties are added to this map, they will be automatically mapped
+ * to their respective classes, if parsed by the reader or constructed with
+ * the 'create' method.
+ *
+ * @var array
+ */
+ static public $classMap = array(
+ 'COMPLETED' => 'Sabre\\VObject\\Property\\DateTime',
+ 'CREATED' => 'Sabre\\VObject\\Property\\DateTime',
+ 'DTEND' => 'Sabre\\VObject\\Property\\DateTime',
+ 'DTSTAMP' => 'Sabre\\VObject\\Property\\DateTime',
+ 'DTSTART' => 'Sabre\\VObject\\Property\\DateTime',
+ 'DUE' => 'Sabre\\VObject\\Property\\DateTime',
+ 'EXDATE' => 'Sabre\\VObject\\Property\\MultiDateTime',
+ 'LAST-MODIFIED' => 'Sabre\\VObject\\Property\\DateTime',
+ 'RECURRENCE-ID' => 'Sabre\\VObject\\Property\\DateTime',
+ 'TRIGGER' => 'Sabre\\VObject\\Property\\DateTime',
+ 'N' => 'Sabre\\VObject\\Property\\Compound',
+ 'ORG' => 'Sabre\\VObject\\Property\\Compound',
+ 'ADR' => 'Sabre\\VObject\\Property\\Compound',
+ 'CATEGORIES' => 'Sabre\\VObject\\Property\\Compound',
+ );
+
+ /**
+ * Creates the new property by name, but in addition will also see if
+ * there's a class mapped to the property name.
+ *
+ * Parameters can be specified with the optional third argument. Parameters
+ * must be a key->value map of the parameter name, and value. If the value
+ * is specified as an array, it is assumed that multiple parameters with
+ * the same name should be added.
+ *
+ * @param string $name
+ * @param string $value
+ * @param array $parameters
+ * @return Property
+ */
+ static public function create($name, $value = null, array $parameters = array()) {
+
+ $name = strtoupper($name);
+ $shortName = $name;
+ $group = null;
+ if (strpos($shortName,'.')!==false) {
+ list($group, $shortName) = explode('.', $shortName);
+ }
+
+ if (isset(self::$classMap[$shortName])) {
+ return new self::$classMap[$shortName]($name, $value, $parameters);
+ } else {
+ return new self($name, $value, $parameters);
+ }
+
+ }
+
+ /**
+ * Creates a new property object
+ *
+ * Parameters can be specified with the optional third argument. Parameters
+ * must be a key->value map of the parameter name, and value. If the value
+ * is specified as an array, it is assumed that multiple parameters with
+ * the same name should be added.
+ *
+ * @param string $name
+ * @param string $value
+ * @param array $parameters
+ */
+ public function __construct($name, $value = null, array $parameters = array()) {
+
+ if (!is_scalar($value) && !is_null($value)) {
+ throw new \InvalidArgumentException('The value argument must be scalar or null');
+ }
+
+ $name = strtoupper($name);
+ $group = null;
+ if (strpos($name,'.')!==false) {
+ list($group, $name) = explode('.', $name);
+ }
+ $this->name = $name;
+ $this->group = $group;
+ $this->setValue($value);
+
+ foreach($parameters as $paramName => $paramValues) {
+
+ if (!is_array($paramValues)) {
+ $paramValues = array($paramValues);
+ }
+
+ foreach($paramValues as $paramValue) {
+ $this->add($paramName, $paramValue);
+ }
+
+ }
+
+ }
+
+ /**
+ * Updates the internal value
+ *
+ * @param string $value
+ * @return void
+ */
+ public function setValue($value) {
+
+ $this->value = $value;
+
+ }
+
+ /**
+ * Returns the internal value
+ *
+ * @param string $value
+ * @return string
+ */
+ public function getValue() {
+
+ return $this->value;
+
+ }
+
+ /**
+ * Turns the object back into a serialized blob.
+ *
+ * @return string
+ */
+ public function serialize() {
+
+ $str = $this->name;
+ if ($this->group) $str = $this->group . '.' . $this->name;
+
+ foreach($this->parameters as $param) {
+
+ $str.=';' . $param->serialize();
+
+ }
+
+ $src = array(
+ '\\',
+ "\n",
+ "\r",
+ );
+ $out = array(
+ '\\\\',
+ '\n',
+ '',
+ );
+ $str.=':' . str_replace($src, $out, $this->value);
+
+ $out = '';
+ while(strlen($str)>0) {
+ if (strlen($str)>75) {
+ $out.= mb_strcut($str,0,75,'utf-8') . "\r\n";
+ $str = ' ' . mb_strcut($str,75,strlen($str),'utf-8');
+ } else {
+ $out.=$str . "\r\n";
+ $str='';
+ break;
+ }
+ }
+
+ return $out;
+
+ }
+
+ /**
+ * Adds a new componenten or element
+ *
+ * You can call this method with the following syntaxes:
+ *
+ * add(Parameter $element)
+ * add(string $name, $value)
+ *
+ * The first version adds an Parameter
+ * The second adds a property as a string.
+ *
+ * @param mixed $item
+ * @param mixed $itemValue
+ * @return void
+ */
+ public function add($item, $itemValue = null) {
+
+ if ($item instanceof Parameter) {
+ if (!is_null($itemValue)) {
+ throw new \InvalidArgumentException('The second argument must not be specified, when passing a VObject');
+ }
+ $item->parent = $this;
+ $this->parameters[] = $item;
+ } elseif(is_string($item)) {
+
+ $parameter = new Parameter($item,$itemValue);
+ $parameter->parent = $this;
+ $this->parameters[] = $parameter;
+
+ } else {
+
+ throw new \InvalidArgumentException('The first argument must either be a Node a string');
+
+ }
+
+ }
+
+ /* ArrayAccess interface {{{ */
+
+ /**
+ * Checks if an array element exists
+ *
+ * @param mixed $name
+ * @return bool
+ */
+ public function offsetExists($name) {
+
+ if (is_int($name)) return parent::offsetExists($name);
+
+ $name = strtoupper($name);
+
+ foreach($this->parameters as $parameter) {
+ if ($parameter->name == $name) return true;
+ }
+ return false;
+
+ }
+
+ /**
+ * Returns a parameter, or parameter list.
+ *
+ * @param string $name
+ * @return Node
+ */
+ public function offsetGet($name) {
+
+ if (is_int($name)) return parent::offsetGet($name);
+ $name = strtoupper($name);
+
+ $result = array();
+ foreach($this->parameters as $parameter) {
+ if ($parameter->name == $name)
+ $result[] = $parameter;
+ }
+
+ if (count($result)===0) {
+ return null;
+ } elseif (count($result)===1) {
+ return $result[0];
+ } else {
+ $result[0]->setIterator(new ElementList($result));
+ return $result[0];
+ }
+
+ }
+
+ /**
+ * Creates a new parameter
+ *
+ * @param string $name
+ * @param mixed $value
+ * @return void
+ */
+ public function offsetSet($name, $value) {
+
+ if (is_int($name)) parent::offsetSet($name, $value);
+
+ if (is_scalar($value)) {
+ if (!is_string($name))
+ throw new \InvalidArgumentException('A parameter name must be specified. This means you cannot use the $array[]="string" to add parameters.');
+
+ $this->offsetUnset($name);
+ $parameter = new Parameter($name, $value);
+ $parameter->parent = $this;
+ $this->parameters[] = $parameter;
+
+ } elseif ($value instanceof Parameter) {
+ if (!is_null($name))
+ throw new \InvalidArgumentException('Don\'t specify a parameter name if you\'re passing a \\Sabre\\VObject\\Parameter. Add using $array[]=$parameterObject.');
+
+ $value->parent = $this;
+ $this->parameters[] = $value;
+ } else {
+ throw new \InvalidArgumentException('You can only add parameters to the property object');
+ }
+
+ }
+
+ /**
+ * Removes one or more parameters with the specified name
+ *
+ * @param string $name
+ * @return void
+ */
+ public function offsetUnset($name) {
+
+ if (is_int($name)) parent::offsetUnset($name);
+ $name = strtoupper($name);
+
+ foreach($this->parameters as $key=>$parameter) {
+ if ($parameter->name == $name) {
+ $parameter->parent = null;
+ unset($this->parameters[$key]);
+ }
+
+ }
+
+ }
+
+ /* }}} */
+
+ /**
+ * Called when this object is being cast to a string
+ *
+ * @return string
+ */
+ public function __toString() {
+
+ return (string)$this->value;
+
+ }
+
+ /**
+ * This method is automatically called when the object is cloned.
+ * Specifically, this will ensure all child elements are also cloned.
+ *
+ * @return void
+ */
+ public function __clone() {
+
+ foreach($this->parameters as $key=>$child) {
+ $this->parameters[$key] = clone $child;
+ $this->parameters[$key]->parent = $this;
+ }
+
+ }
+
+ /**
+ * Validates the node for correctness.
+ *
+ * The following options are supported:
+ * - Node::REPAIR - If something is broken, and automatic repair may
+ * be attempted.
+ *
+ * An array is returned with warnings.
+ *
+ * Every item in the array has the following properties:
+ * * level - (number between 1 and 3 with severity information)
+ * * message - (human readable message)
+ * * node - (reference to the offending node)
+ *
+ * @param int $options
+ * @return array
+ */
+ public function validate($options = 0) {
+
+ $warnings = array();
+
+ // Checking if our value is UTF-8
+ if (!StringUtil::isUTF8($this->value)) {
+ $warnings[] = array(
+ 'level' => 1,
+ 'message' => 'Property is not valid UTF-8!',
+ 'node' => $this,
+ );
+ if ($options & self::REPAIR) {
+ $this->value = StringUtil::convertToUTF8($this->value);
+ }
+ }
+
+ // Checking if the propertyname does not contain any invalid bytes.
+ if (!preg_match('/^([A-Z0-9-]+)$/', $this->name)) {
+ $warnings[] = array(
+ 'level' => 1,
+ 'message' => 'The propertyname: ' . $this->name . ' contains invalid characters. Only A-Z, 0-9 and - are allowed',
+ 'node' => $this,
+ );
+ if ($options & self::REPAIR) {
+ // Uppercasing and converting underscores to dashes.
+ $this->name = strtoupper(
+ str_replace('_', '-', $this->name)
+ );
+ // Removing every other invalid character
+ $this->name = preg_replace('/([^A-Z0-9-])/u', '', $this->name);
+
+ }
+
+ }
+
+ // Validating inner parameters
+ foreach($this->parameters as $param) {
+ $warnings = array_merge($warnings, $param->validate($options));
+ }
+
+ return $warnings;
+
+ }
+
+}
diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/Property/Compound.php b/vendor/sabre/vobject/lib/Sabre/VObject/Property/Compound.php
new file mode 100644
index 000000000..26f090069
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Sabre/VObject/Property/Compound.php
@@ -0,0 +1,125 @@
+<?php
+
+namespace Sabre\VObject\Property;
+
+use Sabre\VObject;
+
+/**
+ * Compound property.
+ *
+ * This class adds (de)serialization of compound properties to/from arrays.
+ *
+ * Currently the following properties from RFC 6350 are mapped to use this
+ * class:
+ *
+ * N: Section 6.2.2
+ * ADR: Section 6.3.1
+ * ORG: Section 6.6.4
+ * CATEGORIES: Section 6.7.1
+ *
+ * In order to use this correctly, you must call setParts and getParts to
+ * retrieve and modify dates respectively.
+ *
+ * @author Thomas Tanghus (http://tanghus.net/)
+ * @author Lars Kneschke
+ * @author Evert Pot (http://evertpot.com/)
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Compound extends VObject\Property {
+
+ /**
+ * If property names are added to this map, they will be (de)serialised as arrays
+ * using the getParts() and setParts() methods.
+ * The keys are the property names, values are delimiter chars.
+ *
+ * @var array
+ */
+ static public $delimiterMap = array(
+ 'N' => ';',
+ 'ADR' => ';',
+ 'ORG' => ';',
+ 'CATEGORIES' => ',',
+ );
+
+ /**
+ * The currently used delimiter.
+ *
+ * @var string
+ */
+ protected $delimiter = null;
+
+ /**
+ * Get a compound value as an array.
+ *
+ * @param $name string
+ * @return array
+ */
+ public function getParts() {
+
+ if (is_null($this->value)) {
+ return array();
+ }
+
+ $delimiter = $this->getDelimiter();
+
+ // split by any $delimiter which is NOT prefixed by a slash.
+ // Note that this is not a a perfect solution. If a value is prefixed
+ // by two slashes, it should actually be split anyway.
+ //
+ // Hopefully we can fix this better in a future version, where we can
+ // break compatibility a bit.
+ $compoundValues = preg_split("/(?<!\\\)$delimiter/", $this->value);
+
+ // remove slashes from any semicolon and comma left escaped in the single values
+ $compoundValues = array_map(
+ function($val) {
+ return strtr($val, array('\,' => ',', '\;' => ';'));
+ }, $compoundValues);
+
+ return $compoundValues;
+
+ }
+
+ /**
+ * Returns the delimiter for this property.
+ *
+ * @return string
+ */
+ public function getDelimiter() {
+
+ if (!$this->delimiter) {
+ if (isset(self::$delimiterMap[$this->name])) {
+ $this->delimiter = self::$delimiterMap[$this->name];
+ } else {
+ // To be a bit future proof, we are going to default the
+ // delimiter to ;
+ $this->delimiter = ';';
+ }
+ }
+ return $this->delimiter;
+
+ }
+
+ /**
+ * Set a compound value as an array.
+ *
+ *
+ * @param $name string
+ * @return array
+ */
+ public function setParts(array $values) {
+
+ // add slashes to all semicolons and commas in the single values
+ $values = array_map(
+ function($val) {
+ return strtr($val, array(',' => '\,', ';' => '\;'));
+ }, $values);
+
+ $this->setValue(
+ implode($this->getDelimiter(), $values)
+ );
+
+ }
+
+}
diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/Property/DateTime.php b/vendor/sabre/vobject/lib/Sabre/VObject/Property/DateTime.php
new file mode 100644
index 000000000..95e9b0209
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Sabre/VObject/Property/DateTime.php
@@ -0,0 +1,245 @@
+<?php
+
+namespace Sabre\VObject\Property;
+
+use Sabre\VObject;
+
+/**
+ * DateTime property
+ *
+ * This element is used for iCalendar properties such as the DTSTART property.
+ * It basically provides a few helper functions that make it easier to deal
+ * with these. It supports both DATE-TIME and DATE values.
+ *
+ * In order to use this correctly, you must call setDateTime and getDateTime to
+ * retrieve and modify dates respectively.
+ *
+ * If you use the 'value' or properties directly, this object does not keep
+ * reference and results might appear incorrectly.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class DateTime extends VObject\Property {
+
+ /**
+ * Local 'floating' time
+ */
+ const LOCAL = 1;
+
+ /**
+ * UTC-based time
+ */
+ const UTC = 2;
+
+ /**
+ * Local time plus timezone
+ */
+ const LOCALTZ = 3;
+
+ /**
+ * Only a date, time is ignored
+ */
+ const DATE = 4;
+
+ /**
+ * DateTime representation
+ *
+ * @var \DateTime
+ */
+ protected $dateTime;
+
+ /**
+ * dateType
+ *
+ * @var int
+ */
+ protected $dateType;
+
+ /**
+ * Updates the Date and Time.
+ *
+ * @param \DateTime $dt
+ * @param int $dateType
+ * @return void
+ */
+ public function setDateTime(\DateTime $dt, $dateType = self::LOCALTZ) {
+
+ switch($dateType) {
+
+ case self::LOCAL :
+ $this->setValue($dt->format('Ymd\\THis'));
+ $this->offsetUnset('VALUE');
+ $this->offsetUnset('TZID');
+ $this->offsetSet('VALUE','DATE-TIME');
+ break;
+ case self::UTC :
+ $dt->setTimeZone(new \DateTimeZone('UTC'));
+ $this->setValue($dt->format('Ymd\\THis\\Z'));
+ $this->offsetUnset('VALUE');
+ $this->offsetUnset('TZID');
+ $this->offsetSet('VALUE','DATE-TIME');
+ break;
+ case self::LOCALTZ :
+ $this->setValue($dt->format('Ymd\\THis'));
+ $this->offsetUnset('VALUE');
+ $this->offsetUnset('TZID');
+ $this->offsetSet('VALUE','DATE-TIME');
+ $this->offsetSet('TZID', $dt->getTimeZone()->getName());
+ break;
+ case self::DATE :
+ $this->setValue($dt->format('Ymd'));
+ $this->offsetUnset('VALUE');
+ $this->offsetUnset('TZID');
+ $this->offsetSet('VALUE','DATE');
+ break;
+ default :
+ throw new \InvalidArgumentException('You must pass a valid dateType constant');
+
+ }
+ $this->dateTime = $dt;
+ $this->dateType = $dateType;
+
+ }
+
+ /**
+ * Returns the current DateTime value.
+ *
+ * If no value was set, this method returns null.
+ *
+ * @return \DateTime|null
+ */
+ public function getDateTime() {
+
+ if ($this->dateTime)
+ return $this->dateTime;
+
+ list(
+ $this->dateType,
+ $this->dateTime
+ ) = self::parseData($this->value, $this);
+ return $this->dateTime;
+
+ }
+
+ /**
+ * Returns the type of Date format.
+ *
+ * This method returns one of the format constants. If no date was set,
+ * this method will return null.
+ *
+ * @return int|null
+ */
+ public function getDateType() {
+
+ if ($this->dateType)
+ return $this->dateType;
+
+ list(
+ $this->dateType,
+ $this->dateTime,
+ ) = self::parseData($this->value, $this);
+ return $this->dateType;
+
+ }
+
+ /**
+ * This method will return true, if the property had a date and a time, as
+ * opposed to only a date.
+ *
+ * @return bool
+ */
+ public function hasTime() {
+
+ return $this->getDateType()!==self::DATE;
+
+ }
+
+ /**
+ * Parses the internal data structure to figure out what the current date
+ * and time is.
+ *
+ * The returned array contains two elements:
+ * 1. A 'DateType' constant (as defined on this class), or null.
+ * 2. A DateTime object (or null)
+ *
+ * @param string|null $propertyValue The string to parse (yymmdd or
+ * ymmddThhmmss, etc..)
+ * @param \Sabre\VObject\Property|null $property The instance of the
+ * property we're parsing.
+ * @return array
+ */
+ static public function parseData($propertyValue, VObject\Property $property = null) {
+
+ if (is_null($propertyValue)) {
+ return array(null, null);
+ }
+
+ $date = '(?P<year>[1-2][0-9]{3})(?P<month>[0-1][0-9])(?P<date>[0-3][0-9])';
+ $time = '(?P<hour>[0-2][0-9])(?P<minute>[0-5][0-9])(?P<second>[0-5][0-9])';
+ $regex = "/^$date(T$time(?P<isutc>Z)?)?$/";
+
+ if (!preg_match($regex, $propertyValue, $matches)) {
+ throw new \InvalidArgumentException($propertyValue . ' is not a valid \DateTime or Date string');
+ }
+
+ if (!isset($matches['hour'])) {
+ // Date-only
+ return array(
+ self::DATE,
+ new \DateTime($matches['year'] . '-' . $matches['month'] . '-' . $matches['date'] . ' 00:00:00', new \DateTimeZone('UTC')),
+ );
+ }
+
+ $dateStr =
+ $matches['year'] .'-' .
+ $matches['month'] . '-' .
+ $matches['date'] . ' ' .
+ $matches['hour'] . ':' .
+ $matches['minute'] . ':' .
+ $matches['second'];
+
+ if (isset($matches['isutc'])) {
+ $dt = new \DateTime($dateStr,new \DateTimeZone('UTC'));
+ $dt->setTimeZone(new \DateTimeZone('UTC'));
+ return array(
+ self::UTC,
+ $dt
+ );
+ }
+
+ // Finding the timezone.
+ $tzid = $property['TZID'];
+ if (!$tzid) {
+ // This was a floating time string. This implies we use the
+ // timezone from date_default_timezone_set / date.timezone ini
+ // setting.
+ return array(
+ self::LOCAL,
+ new \DateTime($dateStr)
+ );
+ }
+
+ // To look up the timezone, we must first find the VCALENDAR component.
+ $root = $property;
+ while($root->parent) {
+ $root = $root->parent;
+ }
+ if ($root->name === 'VCALENDAR') {
+ $tz = VObject\TimeZoneUtil::getTimeZone((string)$tzid, $root);
+ } else {
+ $tz = VObject\TimeZoneUtil::getTimeZone((string)$tzid);
+ }
+
+ $dt = new \DateTime($dateStr, $tz);
+ $dt->setTimeZone($tz);
+
+ return array(
+ self::LOCALTZ,
+ $dt
+ );
+
+ }
+
+}
diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/Property/MultiDateTime.php b/vendor/sabre/vobject/lib/Sabre/VObject/Property/MultiDateTime.php
new file mode 100644
index 000000000..f01491b66
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Sabre/VObject/Property/MultiDateTime.php
@@ -0,0 +1,180 @@
+<?php
+
+namespace Sabre\VObject\Property;
+
+use Sabre\VObject;
+
+/**
+ * Multi-DateTime property
+ *
+ * This element is used for iCalendar properties such as the EXDATE property.
+ * It basically provides a few helper functions that make it easier to deal
+ * with these. It supports both DATE-TIME and DATE values.
+ *
+ * In order to use this correctly, you must call setDateTimes and getDateTimes
+ * to retrieve and modify dates respectively.
+ *
+ * If you use the 'value' or properties directly, this object does not keep
+ * reference and results might appear incorrectly.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class MultiDateTime extends VObject\Property {
+
+ /**
+ * DateTime representation
+ *
+ * @var DateTime[]
+ */
+ protected $dateTimes;
+
+ /**
+ * dateType
+ *
+ * This is one of the Sabre\VObject\Property\DateTime constants.
+ *
+ * @var int
+ */
+ protected $dateType;
+
+ /**
+ * Updates the value
+ *
+ * @param array $dt Must be an array of DateTime objects.
+ * @param int $dateType
+ * @return void
+ */
+ public function setDateTimes(array $dt, $dateType = VObject\Property\DateTime::LOCALTZ) {
+
+ foreach($dt as $i)
+ if (!$i instanceof \DateTime)
+ throw new \InvalidArgumentException('You must pass an array of DateTime objects');
+
+ $this->offsetUnset('VALUE');
+ $this->offsetUnset('TZID');
+ switch($dateType) {
+
+ case DateTime::LOCAL :
+ $val = array();
+ foreach($dt as $i) {
+ $val[] = $i->format('Ymd\\THis');
+ }
+ $this->setValue(implode(',',$val));
+ $this->offsetSet('VALUE','DATE-TIME');
+ break;
+ case DateTime::UTC :
+ $val = array();
+ foreach($dt as $i) {
+ $i->setTimeZone(new \DateTimeZone('UTC'));
+ $val[] = $i->format('Ymd\\THis\\Z');
+ }
+ $this->setValue(implode(',',$val));
+ $this->offsetSet('VALUE','DATE-TIME');
+ break;
+ case DateTime::LOCALTZ :
+ $val = array();
+ foreach($dt as $i) {
+ $val[] = $i->format('Ymd\\THis');
+ }
+ $this->setValue(implode(',',$val));
+ $this->offsetSet('VALUE','DATE-TIME');
+ $this->offsetSet('TZID', $dt[0]->getTimeZone()->getName());
+ break;
+ case DateTime::DATE :
+ $val = array();
+ foreach($dt as $i) {
+ $val[] = $i->format('Ymd');
+ }
+ $this->setValue(implode(',',$val));
+ $this->offsetSet('VALUE','DATE');
+ break;
+ default :
+ throw new \InvalidArgumentException('You must pass a valid dateType constant');
+
+ }
+ $this->dateTimes = $dt;
+ $this->dateType = $dateType;
+
+ }
+
+ /**
+ * Returns the current DateTime value.
+ *
+ * If no value was set, this method returns null.
+ *
+ * @return array|null
+ */
+ public function getDateTimes() {
+
+ if ($this->dateTimes)
+ return $this->dateTimes;
+
+ $dts = array();
+
+ if (!$this->value) {
+ $this->dateTimes = null;
+ $this->dateType = null;
+ return null;
+ }
+
+ foreach(explode(',',$this->value) as $val) {
+ list(
+ $type,
+ $dt
+ ) = DateTime::parseData($val, $this);
+ $dts[] = $dt;
+ $this->dateType = $type;
+ }
+ $this->dateTimes = $dts;
+ return $this->dateTimes;
+
+ }
+
+ /**
+ * Returns the type of Date format.
+ *
+ * This method returns one of the format constants. If no date was set,
+ * this method will return null.
+ *
+ * @return int|null
+ */
+ public function getDateType() {
+
+ if ($this->dateType)
+ return $this->dateType;
+
+ if (!$this->value) {
+ $this->dateTimes = null;
+ $this->dateType = null;
+ return null;
+ }
+
+ $dts = array();
+ foreach(explode(',',$this->value) as $val) {
+ list(
+ $type,
+ $dt
+ ) = DateTime::parseData($val, $this);
+ $dts[] = $dt;
+ $this->dateType = $type;
+ }
+ $this->dateTimes = $dts;
+ return $this->dateType;
+
+ }
+
+ /**
+ * This method will return true, if the property had a date and a time, as
+ * opposed to only a date.
+ *
+ * @return bool
+ */
+ public function hasTime() {
+
+ return $this->getDateType()!==DateTime::DATE;
+
+ }
+
+}
diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/Reader.php b/vendor/sabre/vobject/lib/Sabre/VObject/Reader.php
new file mode 100644
index 000000000..a001b2bf1
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Sabre/VObject/Reader.php
@@ -0,0 +1,223 @@
+<?php
+
+namespace Sabre\VObject;
+
+/**
+ * VCALENDAR/VCARD reader
+ *
+ * This class reads the vobject file, and returns a full element tree.
+ *
+ * TODO: this class currently completely works 'statically'. This is pointless,
+ * and defeats OOP principals. Needs refactoring in a future version.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Reader {
+
+ /**
+ * If this option is passed to the reader, it will be less strict about the
+ * validity of the lines.
+ *
+ * Currently using this option just means, that it will accept underscores
+ * in property names.
+ */
+ const OPTION_FORGIVING = 1;
+
+ /**
+ * If this option is turned on, any lines we cannot parse will be ignored
+ * by the reader.
+ */
+ const OPTION_IGNORE_INVALID_LINES = 2;
+
+ /**
+ * Parses the file and returns the top component
+ *
+ * The options argument is a bitfield. Pass any of the OPTIONS constant to
+ * alter the parsers' behaviour.
+ *
+ * @param string $data
+ * @param int $options
+ * @return Node
+ */
+ static function read($data, $options = 0) {
+
+ // Normalizing newlines
+ $data = str_replace(array("\r","\n\n"), array("\n","\n"), $data);
+
+ $lines = explode("\n", $data);
+
+ // Unfolding lines
+ $lines2 = array();
+ foreach($lines as $line) {
+
+ // Skipping empty lines
+ if (!$line) continue;
+
+ if ($line[0]===" " || $line[0]==="\t") {
+ $lines2[count($lines2)-1].=substr($line,1);
+ } else {
+ $lines2[] = $line;
+ }
+
+ }
+
+ unset($lines);
+
+ reset($lines2);
+
+ return self::readLine($lines2, $options);
+
+ }
+
+ /**
+ * Reads and parses a single line.
+ *
+ * This method receives the full array of lines. The array pointer is used
+ * to traverse.
+ *
+ * This method returns null if an invalid line was encountered, and the
+ * IGNORE_INVALID_LINES option was turned on.
+ *
+ * @param array $lines
+ * @param int $options See the OPTIONS constants.
+ * @return Node
+ */
+ static private function readLine(&$lines, $options = 0) {
+
+ $line = current($lines);
+ $lineNr = key($lines);
+ next($lines);
+
+ // Components
+ if (strtoupper(substr($line,0,6)) === "BEGIN:") {
+
+ $componentName = strtoupper(substr($line,6));
+ $obj = Component::create($componentName);
+
+ $nextLine = current($lines);
+
+ while(strtoupper(substr($nextLine,0,4))!=="END:") {
+
+ $parsedLine = self::readLine($lines, $options);
+ $nextLine = current($lines);
+
+ if (is_null($parsedLine)) {
+ continue;
+ }
+ $obj->add($parsedLine);
+
+ if ($nextLine===false)
+ throw new ParseException('Invalid VObject. Document ended prematurely.');
+
+ }
+
+ // Checking component name of the 'END:' line.
+ if (substr($nextLine,4)!==$obj->name) {
+ throw new ParseException('Invalid VObject, expected: "END:' . $obj->name . '" got: "' . $nextLine . '"');
+ }
+ next($lines);
+
+ return $obj;
+
+ }
+
+ // Properties
+ //$result = preg_match('/(?P<name>[A-Z0-9-]+)(?:;(?P<parameters>^(?<!:):))(.*)$/',$line,$matches);
+
+ if ($options & self::OPTION_FORGIVING) {
+ $token = '[A-Z0-9-\._]+';
+ } else {
+ $token = '[A-Z0-9-\.]+';
+ }
+ $parameters = "(?:;(?P<parameters>([^:^\"]|\"([^\"]*)\")*))?";
+ $regex = "/^(?P<name>$token)$parameters:(?P<value>.*)$/i";
+
+ $result = preg_match($regex,$line,$matches);
+
+ if (!$result) {
+ if ($options & self::OPTION_IGNORE_INVALID_LINES) {
+ return null;
+ } else {
+ throw new ParseException('Invalid VObject, line ' . ($lineNr+1) . ' did not follow the icalendar/vcard format');
+ }
+ }
+
+ $propertyName = strtoupper($matches['name']);
+ $propertyValue = preg_replace_callback('#(\\\\(\\\\|N|n))#',function($matches) {
+ if ($matches[2]==='n' || $matches[2]==='N') {
+ return "\n";
+ } else {
+ return $matches[2];
+ }
+ }, $matches['value']);
+
+ $obj = Property::create($propertyName, $propertyValue);
+
+ if ($matches['parameters']) {
+
+ foreach(self::readParameters($matches['parameters']) as $param) {
+ $obj->add($param);
+ }
+
+ }
+
+ return $obj;
+
+
+ }
+
+ /**
+ * Reads a parameter list from a property
+ *
+ * This method returns an array of Parameter
+ *
+ * @param string $parameters
+ * @return array
+ */
+ static private function readParameters($parameters) {
+
+ $token = '[A-Z0-9-]+';
+
+ $paramValue = '(?P<paramValue>[^\"^;]*|"[^"]*")';
+
+ $regex = "/(?<=^|;)(?P<paramName>$token)(=$paramValue(?=$|;))?/i";
+ preg_match_all($regex, $parameters, $matches, PREG_SET_ORDER);
+
+ $params = array();
+ foreach($matches as $match) {
+
+ if (!isset($match['paramValue'])) {
+
+ $value = null;
+
+ } else {
+
+ $value = $match['paramValue'];
+
+ if (isset($value[0]) && $value[0]==='"') {
+ // Stripping quotes, if needed
+ $value = substr($value,1,strlen($value)-2);
+ }
+
+ $value = preg_replace_callback('#(\\\\(\\\\|N|n|;|,))#',function($matches) {
+ if ($matches[2]==='n' || $matches[2]==='N') {
+ return "\n";
+ } else {
+ return $matches[2];
+ }
+ }, $value);
+
+ }
+
+ $params[] = new Parameter($match['paramName'], $value);
+
+ }
+
+ return $params;
+
+ }
+
+
+}
diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/RecurrenceIterator.php b/vendor/sabre/vobject/lib/Sabre/VObject/RecurrenceIterator.php
new file mode 100644
index 000000000..8bd4ed224
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Sabre/VObject/RecurrenceIterator.php
@@ -0,0 +1,1144 @@
+<?php
+
+namespace Sabre\VObject;
+
+/**
+ * This class is used to determine new for a recurring event, when the next
+ * events occur.
+ *
+ * This iterator may loop infinitely in the future, therefore it is important
+ * that if you use this class, you set hard limits for the amount of iterations
+ * you want to handle.
+ *
+ * Note that currently there is not full support for the entire iCalendar
+ * specification, as it's very complex and contains a lot of permutations
+ * that's not yet used very often in software.
+ *
+ * For the focus has been on features as they actually appear in Calendaring
+ * software, but this may well get expanded as needed / on demand
+ *
+ * The following RRULE properties are supported
+ * * UNTIL
+ * * INTERVAL
+ * * COUNT
+ * * FREQ=DAILY
+ * * BYDAY
+ * * BYHOUR
+ * * FREQ=WEEKLY
+ * * BYDAY
+ * * BYHOUR
+ * * WKST
+ * * FREQ=MONTHLY
+ * * BYMONTHDAY
+ * * BYDAY
+ * * BYSETPOS
+ * * FREQ=YEARLY
+ * * BYMONTH
+ * * BYMONTHDAY (only if BYMONTH is also set)
+ * * BYDAY (only if BYMONTH is also set)
+ *
+ * Anything beyond this is 'undefined', which means that it may get ignored, or
+ * you may get unexpected results. The effect is that in some applications the
+ * specified recurrence may look incorrect, or is missing.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class RecurrenceIterator implements \Iterator {
+
+ /**
+ * The initial event date
+ *
+ * @var DateTime
+ */
+ public $startDate;
+
+ /**
+ * The end-date of the initial event
+ *
+ * @var DateTime
+ */
+ public $endDate;
+
+ /**
+ * The 'current' recurrence.
+ *
+ * This will be increased for every iteration.
+ *
+ * @var DateTime
+ */
+ public $currentDate;
+
+
+ /**
+ * List of dates that are excluded from the rules.
+ *
+ * This list contains the items that have been overriden by the EXDATE
+ * property.
+ *
+ * @var array
+ */
+ public $exceptionDates = array();
+
+ /**
+ * Base event
+ *
+ * @var Component\VEvent
+ */
+ public $baseEvent;
+
+ /**
+ * List of dates that are overridden by other events.
+ * Similar to $overriddenEvents, but this just contains the original dates.
+ *
+ * @var array
+ */
+ public $overriddenDates = array();
+
+ /**
+ * list of events that are 'overridden'.
+ *
+ * This is an array of Component\VEvent objects.
+ *
+ * @var array
+ */
+ public $overriddenEvents = array();
+
+ /**
+ * Frequency is one of: secondly, minutely, hourly, daily, weekly, monthly,
+ * yearly.
+ *
+ * @var string
+ */
+ public $frequency;
+
+ /**
+ * The last instance of this recurrence, inclusively
+ *
+ * @var DateTime|null
+ */
+ public $until;
+
+ /**
+ * The number of recurrences, or 'null' if infinitely recurring.
+ *
+ * @var int
+ */
+ public $count;
+
+ /**
+ * The interval.
+ *
+ * If for example frequency is set to daily, interval = 2 would mean every
+ * 2 days.
+ *
+ * @var int
+ */
+ public $interval = 1;
+
+ /**
+ * Which seconds to recur.
+ *
+ * This is an array of integers (between 0 and 60)
+ *
+ * @var array
+ */
+ public $bySecond;
+
+ /**
+ * Which minutes to recur
+ *
+ * This is an array of integers (between 0 and 59)
+ *
+ * @var array
+ */
+ public $byMinute;
+
+ /**
+ * Which hours to recur
+ *
+ * This is an array of integers (between 0 and 23)
+ *
+ * @var array
+ */
+ public $byHour;
+
+ /**
+ * Which weekdays to recur.
+ *
+ * This is an array of weekdays
+ *
+ * This may also be preceeded by a positive or negative integer. If present,
+ * this indicates the nth occurrence of a specific day within the monthly or
+ * yearly rrule. For instance, -2TU indicates the second-last tuesday of
+ * the month, or year.
+ *
+ * @var array
+ */
+ public $byDay;
+
+ /**
+ * Which days of the month to recur
+ *
+ * This is an array of days of the months (1-31). The value can also be
+ * negative. -5 for instance means the 5th last day of the month.
+ *
+ * @var array
+ */
+ public $byMonthDay;
+
+ /**
+ * Which days of the year to recur.
+ *
+ * This is an array with days of the year (1 to 366). The values can also
+ * be negative. For instance, -1 will always represent the last day of the
+ * year. (December 31st).
+ *
+ * @var array
+ */
+ public $byYearDay;
+
+ /**
+ * Which week numbers to recur.
+ *
+ * This is an array of integers from 1 to 53. The values can also be
+ * negative. -1 will always refer to the last week of the year.
+ *
+ * @var array
+ */
+ public $byWeekNo;
+
+ /**
+ * Which months to recur
+ *
+ * This is an array of integers from 1 to 12.
+ *
+ * @var array
+ */
+ public $byMonth;
+
+ /**
+ * Which items in an existing st to recur.
+ *
+ * These numbers work together with an existing by* rule. It specifies
+ * exactly which items of the existing by-rule to filter.
+ *
+ * Valid values are 1 to 366 and -1 to -366. As an example, this can be
+ * used to recur the last workday of the month.
+ *
+ * This would be done by setting frequency to 'monthly', byDay to
+ * 'MO,TU,WE,TH,FR' and bySetPos to -1.
+ *
+ * @var array
+ */
+ public $bySetPos;
+
+ /**
+ * When a week starts
+ *
+ * @var string
+ */
+ public $weekStart = 'MO';
+
+ /**
+ * The current item in the list
+ *
+ * @var int
+ */
+ public $counter = 0;
+
+ /**
+ * Simple mapping from iCalendar day names to day numbers
+ *
+ * @var array
+ */
+ private $dayMap = array(
+ 'SU' => 0,
+ 'MO' => 1,
+ 'TU' => 2,
+ 'WE' => 3,
+ 'TH' => 4,
+ 'FR' => 5,
+ 'SA' => 6,
+ );
+
+ /**
+ * Mappings between the day number and english day name.
+ *
+ * @var array
+ */
+ private $dayNames = array(
+ 0 => 'Sunday',
+ 1 => 'Monday',
+ 2 => 'Tuesday',
+ 3 => 'Wednesday',
+ 4 => 'Thursday',
+ 5 => 'Friday',
+ 6 => 'Saturday',
+ );
+
+ /**
+ * If the current iteration of the event is an overriden event, this
+ * property will hold the VObject
+ *
+ * @var Component
+ */
+ private $currentOverriddenEvent;
+
+ /**
+ * This property may contain the date of the next not-overridden event.
+ * This date is calculated sometimes a bit early, before overridden events
+ * are evaluated.
+ *
+ * @var DateTime
+ */
+ private $nextDate;
+
+ /**
+ * This counts the number of overridden events we've handled so far
+ *
+ * @var int
+ */
+ private $handledOverridden = 0;
+
+ /**
+ * Creates the iterator
+ *
+ * You should pass a VCALENDAR component, as well as the UID of the event
+ * we're going to traverse.
+ *
+ * @param Component $vcal
+ * @param string|null $uid
+ */
+ public function __construct(Component $vcal, $uid=null) {
+
+ if (is_null($uid)) {
+ if ($vcal->name === 'VCALENDAR') {
+ throw new \InvalidArgumentException('If you pass a VCALENDAR object, you must pass a uid argument as well');
+ }
+ $components = array($vcal);
+ $uid = (string)$vcal->uid;
+ } else {
+ $components = $vcal->select('VEVENT');
+ }
+ foreach($components as $component) {
+ if ((string)$component->uid == $uid) {
+ if (isset($component->{'RECURRENCE-ID'})) {
+ $this->overriddenEvents[$component->DTSTART->getDateTime()->getTimeStamp()] = $component;
+ $this->overriddenDates[] = $component->{'RECURRENCE-ID'}->getDateTime();
+ } else {
+ $this->baseEvent = $component;
+ }
+ }
+ }
+
+ ksort($this->overriddenEvents);
+
+ if (!$this->baseEvent) {
+ throw new \InvalidArgumentException('Could not find a base event with uid: ' . $uid);
+ }
+
+ $this->startDate = clone $this->baseEvent->DTSTART->getDateTime();
+
+ $this->endDate = null;
+ if (isset($this->baseEvent->DTEND)) {
+ $this->endDate = clone $this->baseEvent->DTEND->getDateTime();
+ } else {
+ $this->endDate = clone $this->startDate;
+ if (isset($this->baseEvent->DURATION)) {
+ $this->endDate->add(DateTimeParser::parse($this->baseEvent->DURATION->value));
+ } elseif ($this->baseEvent->DTSTART->getDateType()===Property\DateTime::DATE) {
+ $this->endDate->modify('+1 day');
+ }
+ }
+ $this->currentDate = clone $this->startDate;
+
+ $rrule = (string)$this->baseEvent->RRULE;
+
+ $parts = explode(';', $rrule);
+
+ // If no rrule was specified, we create a default setting
+ if (!$rrule) {
+ $this->frequency = 'daily';
+ $this->count = 1;
+ } else foreach($parts as $part) {
+
+ list($key, $value) = explode('=', $part, 2);
+
+ switch(strtoupper($key)) {
+
+ case 'FREQ' :
+ if (!in_array(
+ strtolower($value),
+ array('secondly','minutely','hourly','daily','weekly','monthly','yearly')
+ )) {
+ throw new \InvalidArgumentException('Unknown value for FREQ=' . strtoupper($value));
+
+ }
+ $this->frequency = strtolower($value);
+ break;
+
+ case 'UNTIL' :
+ $this->until = DateTimeParser::parse($value);
+
+ // In some cases events are generated with an UNTIL=
+ // parameter before the actual start of the event.
+ //
+ // Not sure why this is happening. We assume that the
+ // intention was that the event only recurs once.
+ //
+ // So we are modifying the parameter so our code doesn't
+ // break.
+ if($this->until < $this->baseEvent->DTSTART->getDateTime()) {
+ $this->until = $this->baseEvent->DTSTART->getDateTime();
+ }
+ break;
+
+ case 'COUNT' :
+ $this->count = (int)$value;
+ break;
+
+ case 'INTERVAL' :
+ $this->interval = (int)$value;
+ if ($this->interval < 1) {
+ throw new \InvalidArgumentException('INTERVAL in RRULE must be a positive integer!');
+ }
+ break;
+
+ case 'BYSECOND' :
+ $this->bySecond = explode(',', $value);
+ break;
+
+ case 'BYMINUTE' :
+ $this->byMinute = explode(',', $value);
+ break;
+
+ case 'BYHOUR' :
+ $this->byHour = explode(',', $value);
+ break;
+
+ case 'BYDAY' :
+ $this->byDay = explode(',', strtoupper($value));
+ break;
+
+ case 'BYMONTHDAY' :
+ $this->byMonthDay = explode(',', $value);
+ break;
+
+ case 'BYYEARDAY' :
+ $this->byYearDay = explode(',', $value);
+ break;
+
+ case 'BYWEEKNO' :
+ $this->byWeekNo = explode(',', $value);
+ break;
+
+ case 'BYMONTH' :
+ $this->byMonth = explode(',', $value);
+ break;
+
+ case 'BYSETPOS' :
+ $this->bySetPos = explode(',', $value);
+ break;
+
+ case 'WKST' :
+ $this->weekStart = strtoupper($value);
+ break;
+
+ }
+
+ }
+
+ // Parsing exception dates
+ if (isset($this->baseEvent->EXDATE)) {
+ foreach($this->baseEvent->EXDATE as $exDate) {
+
+ foreach(explode(',', (string)$exDate) as $exceptionDate) {
+
+ $this->exceptionDates[] =
+ DateTimeParser::parse($exceptionDate, $this->startDate->getTimeZone());
+
+ }
+
+ }
+
+ }
+
+ }
+
+ /**
+ * Returns the current item in the list
+ *
+ * @return DateTime
+ */
+ public function current() {
+
+ if (!$this->valid()) return null;
+ return clone $this->currentDate;
+
+ }
+
+ /**
+ * This method returns the startdate for the current iteration of the
+ * event.
+ *
+ * @return DateTime
+ */
+ public function getDtStart() {
+
+ if (!$this->valid()) return null;
+ return clone $this->currentDate;
+
+ }
+
+ /**
+ * This method returns the enddate for the current iteration of the
+ * event.
+ *
+ * @return DateTime
+ */
+ public function getDtEnd() {
+
+ if (!$this->valid()) return null;
+ $dtEnd = clone $this->currentDate;
+ $dtEnd->add( $this->startDate->diff( $this->endDate ) );
+ return clone $dtEnd;
+
+ }
+
+ /**
+ * Returns a VEVENT object with the updated start and end date.
+ *
+ * Any recurrence information is removed, and this function may return an
+ * 'overridden' event instead.
+ *
+ * This method always returns a cloned instance.
+ *
+ * @return Component\VEvent
+ */
+ public function getEventObject() {
+
+ if ($this->currentOverriddenEvent) {
+ return clone $this->currentOverriddenEvent;
+ }
+ $event = clone $this->baseEvent;
+ unset($event->RRULE);
+ unset($event->EXDATE);
+ unset($event->RDATE);
+ unset($event->EXRULE);
+
+ $event->DTSTART->setDateTime($this->getDTStart(), $event->DTSTART->getDateType());
+ if (isset($event->DTEND)) {
+ $event->DTEND->setDateTime($this->getDtEnd(), $event->DTSTART->getDateType());
+ }
+ if ($this->counter > 0) {
+ $event->{'RECURRENCE-ID'} = (string)$event->DTSTART;
+ }
+
+ return $event;
+
+ }
+
+ /**
+ * Returns the current item number
+ *
+ * @return int
+ */
+ public function key() {
+
+ return $this->counter;
+
+ }
+
+ /**
+ * Whether or not there is a 'next item'
+ *
+ * @return bool
+ */
+ public function valid() {
+
+ if (!is_null($this->count)) {
+ return $this->counter < $this->count;
+ }
+ if (!is_null($this->until) && $this->currentDate > $this->until) {
+
+ // Need to make sure there's no overridden events past the
+ // until date.
+ foreach($this->overriddenEvents as $overriddenEvent) {
+
+ if ($overriddenEvent->DTSTART->getDateTime() >= $this->currentDate) {
+
+ return true;
+ }
+ }
+ return false;
+ }
+ return true;
+
+ }
+
+ /**
+ * Resets the iterator
+ *
+ * @return void
+ */
+ public function rewind() {
+
+ $this->currentDate = clone $this->startDate;
+ $this->counter = 0;
+
+ }
+
+ /**
+ * This method allows you to quickly go to the next occurrence after the
+ * specified date.
+ *
+ * Note that this checks the current 'endDate', not the 'stardDate'. This
+ * means that if you forward to January 1st, the iterator will stop at the
+ * first event that ends *after* January 1st.
+ *
+ * @param DateTime $dt
+ * @return void
+ */
+ public function fastForward(\DateTime $dt) {
+
+ while($this->valid() && $this->getDTEnd() <= $dt) {
+ $this->next();
+ }
+
+ }
+
+ /**
+ * Returns true if this recurring event never ends.
+ *
+ * @return bool
+ */
+ public function isInfinite() {
+
+ return !$this->count && !$this->until;
+
+ }
+
+ /**
+ * Goes on to the next iteration
+ *
+ * @return void
+ */
+ public function next() {
+
+ $previousStamp = $this->currentDate->getTimeStamp();
+
+ // Finding the next overridden event in line, and storing that for
+ // later use.
+ $overriddenEvent = null;
+ $overriddenDate = null;
+ $this->currentOverriddenEvent = null;
+
+ foreach($this->overriddenEvents as $index=>$event) {
+ if ($index > $previousStamp) {
+ $overriddenEvent = $event;
+ $overriddenDate = clone $event->DTSTART->getDateTime();
+ break;
+ }
+ }
+
+ // If we have a stored 'next date', we will use that.
+ if ($this->nextDate) {
+ if (!$overriddenDate || $this->nextDate < $overriddenDate) {
+ $this->currentDate = $this->nextDate;
+ $currentStamp = $this->currentDate->getTimeStamp();
+ $this->nextDate = null;
+ } else {
+ $this->currentDate = clone $overriddenDate;
+ $this->currentOverriddenEvent = $overriddenEvent;
+ }
+ $this->counter++;
+ return;
+ }
+
+ while(true) {
+
+ // Otherwise, we find the next event in the normal RRULE
+ // sequence.
+ switch($this->frequency) {
+
+ case 'hourly' :
+ $this->nextHourly();
+ break;
+
+ case 'daily' :
+ $this->nextDaily();
+ break;
+
+ case 'weekly' :
+ $this->nextWeekly();
+ break;
+
+ case 'monthly' :
+ $this->nextMonthly();
+ break;
+
+ case 'yearly' :
+ $this->nextYearly();
+ break;
+
+ }
+ $currentStamp = $this->currentDate->getTimeStamp();
+
+
+ // Checking exception dates
+ foreach($this->exceptionDates as $exceptionDate) {
+ if ($this->currentDate == $exceptionDate) {
+ $this->counter++;
+ continue 2;
+ }
+ }
+ foreach($this->overriddenDates as $check) {
+ if ($this->currentDate == $check) {
+ continue 2;
+ }
+ }
+ break;
+
+ }
+
+
+
+ // Is the date we have actually higher than the next overiddenEvent?
+ if ($overriddenDate && $this->currentDate > $overriddenDate) {
+ $this->nextDate = clone $this->currentDate;
+ $this->currentDate = clone $overriddenDate;
+ $this->currentOverriddenEvent = $overriddenEvent;
+ $this->handledOverridden++;
+ }
+ $this->counter++;
+
+
+ /*
+ * If we have overridden events left in the queue, but our counter is
+ * running out, we should grab one of those.
+ */
+ if (!is_null($overriddenEvent) && !is_null($this->count) && count($this->overriddenEvents) - $this->handledOverridden >= ($this->count - $this->counter)) {
+
+ $this->currentOverriddenEvent = $overriddenEvent;
+ $this->currentDate = clone $overriddenDate;
+ $this->handledOverridden++;
+
+ }
+
+ }
+
+ /**
+ * Does the processing for advancing the iterator for hourly frequency.
+ *
+ * @return void
+ */
+ protected function nextHourly() {
+
+ if (!$this->byHour) {
+ $this->currentDate->modify('+' . $this->interval . ' hours');
+ return;
+ }
+ }
+
+ /**
+ * Does the processing for advancing the iterator for daily frequency.
+ *
+ * @return void
+ */
+ protected function nextDaily() {
+
+ if (!$this->byHour && !$this->byDay) {
+ $this->currentDate->modify('+' . $this->interval . ' days');
+ return;
+ }
+
+ if (isset($this->byHour)) {
+ $recurrenceHours = $this->getHours();
+ }
+
+ if (isset($this->byDay)) {
+ $recurrenceDays = $this->getDays();
+ }
+
+ do {
+
+ if ($this->byHour) {
+ if ($this->currentDate->format('G') == '23') {
+ // to obey the interval rule
+ $this->currentDate->modify('+' . $this->interval-1 . ' days');
+ }
+
+ $this->currentDate->modify('+1 hours');
+
+ } else {
+ $this->currentDate->modify('+' . $this->interval . ' days');
+
+ }
+
+ // Current day of the week
+ $currentDay = $this->currentDate->format('w');
+
+ // Current hour of the day
+ $currentHour = $this->currentDate->format('G');
+
+ } while (($this->byDay && !in_array($currentDay, $recurrenceDays)) || ($this->byHour && !in_array($currentHour, $recurrenceHours)));
+
+ }
+
+ /**
+ * Does the processing for advancing the iterator for weekly frequency.
+ *
+ * @return void
+ */
+ protected function nextWeekly() {
+
+ if (!$this->byHour && !$this->byDay) {
+ $this->currentDate->modify('+' . $this->interval . ' weeks');
+ return;
+ }
+
+ if ($this->byHour) {
+ $recurrenceHours = $this->getHours();
+ }
+
+ if ($this->byDay) {
+ $recurrenceDays = $this->getDays();
+ }
+
+ // First day of the week:
+ $firstDay = $this->dayMap[$this->weekStart];
+
+ do {
+
+ if ($this->byHour) {
+ $this->currentDate->modify('+1 hours');
+ } else {
+ $this->currentDate->modify('+1 days');
+ }
+
+ // Current day of the week
+ $currentDay = (int) $this->currentDate->format('w');
+
+ // Current hour of the day
+ $currentHour = (int) $this->currentDate->format('G');
+
+ // We need to roll over to the next week
+ if ($currentDay === $firstDay && (!$this->byHour || $currentHour == '0')) {
+ $this->currentDate->modify('+' . $this->interval-1 . ' weeks');
+
+ // We need to go to the first day of this week, but only if we
+ // are not already on this first day of this week.
+ if($this->currentDate->format('w') != $firstDay) {
+ $this->currentDate->modify('last ' . $this->dayNames[$this->dayMap[$this->weekStart]]);
+ }
+ }
+
+ // We have a match
+ } while (($this->byDay && !in_array($currentDay, $recurrenceDays)) || ($this->byHour && !in_array($currentHour, $recurrenceHours)));
+ }
+
+ /**
+ * Does the processing for advancing the iterator for monthly frequency.
+ *
+ * @return void
+ */
+ protected function nextMonthly() {
+
+ $currentDayOfMonth = $this->currentDate->format('j');
+ if (!$this->byMonthDay && !$this->byDay) {
+
+ // If the current day is higher than the 28th, rollover can
+ // occur to the next month. We Must skip these invalid
+ // entries.
+ if ($currentDayOfMonth < 29) {
+ $this->currentDate->modify('+' . $this->interval . ' months');
+ } else {
+ $increase = 0;
+ do {
+ $increase++;
+ $tempDate = clone $this->currentDate;
+ $tempDate->modify('+ ' . ($this->interval*$increase) . ' months');
+ } while ($tempDate->format('j') != $currentDayOfMonth);
+ $this->currentDate = $tempDate;
+ }
+ return;
+ }
+
+ while(true) {
+
+ $occurrences = $this->getMonthlyOccurrences();
+
+ foreach($occurrences as $occurrence) {
+
+ // The first occurrence thats higher than the current
+ // day of the month wins.
+ if ($occurrence > $currentDayOfMonth) {
+ break 2;
+ }
+
+ }
+
+ // If we made it all the way here, it means there were no
+ // valid occurrences, and we need to advance to the next
+ // month.
+ $this->currentDate->modify('first day of this month');
+ $this->currentDate->modify('+ ' . $this->interval . ' months');
+
+ // This goes to 0 because we need to start counting at hte
+ // beginning.
+ $currentDayOfMonth = 0;
+
+ }
+
+ $this->currentDate->setDate($this->currentDate->format('Y'), $this->currentDate->format('n'), $occurrence);
+
+ }
+
+ /**
+ * Does the processing for advancing the iterator for yearly frequency.
+ *
+ * @return void
+ */
+ protected function nextYearly() {
+
+ $currentMonth = $this->currentDate->format('n');
+ $currentYear = $this->currentDate->format('Y');
+ $currentDayOfMonth = $this->currentDate->format('j');
+
+ // No sub-rules, so we just advance by year
+ if (!$this->byMonth) {
+
+ // Unless it was a leap day!
+ if ($currentMonth==2 && $currentDayOfMonth==29) {
+
+ $counter = 0;
+ do {
+ $counter++;
+ // Here we increase the year count by the interval, until
+ // we hit a date that's also in a leap year.
+ //
+ // We could just find the next interval that's dividable by
+ // 4, but that would ignore the rule that there's no leap
+ // year every year that's dividable by a 100, but not by
+ // 400. (1800, 1900, 2100). So we just rely on the datetime
+ // functions instead.
+ $nextDate = clone $this->currentDate;
+ $nextDate->modify('+ ' . ($this->interval*$counter) . ' years');
+ } while ($nextDate->format('n')!=2);
+ $this->currentDate = $nextDate;
+
+ return;
+
+ }
+
+ // The easiest form
+ $this->currentDate->modify('+' . $this->interval . ' years');
+ return;
+
+ }
+
+ $currentMonth = $this->currentDate->format('n');
+ $currentYear = $this->currentDate->format('Y');
+ $currentDayOfMonth = $this->currentDate->format('j');
+
+ $advancedToNewMonth = false;
+
+ // If we got a byDay or getMonthDay filter, we must first expand
+ // further.
+ if ($this->byDay || $this->byMonthDay) {
+
+ while(true) {
+
+ $occurrences = $this->getMonthlyOccurrences();
+
+ foreach($occurrences as $occurrence) {
+
+ // The first occurrence that's higher than the current
+ // day of the month wins.
+ // If we advanced to the next month or year, the first
+ // occurrence is always correct.
+ if ($occurrence > $currentDayOfMonth || $advancedToNewMonth) {
+ break 2;
+ }
+
+ }
+
+ // If we made it here, it means we need to advance to
+ // the next month or year.
+ $currentDayOfMonth = 1;
+ $advancedToNewMonth = true;
+ do {
+
+ $currentMonth++;
+ if ($currentMonth>12) {
+ $currentYear+=$this->interval;
+ $currentMonth = 1;
+ }
+ } while (!in_array($currentMonth, $this->byMonth));
+
+ $this->currentDate->setDate($currentYear, $currentMonth, $currentDayOfMonth);
+
+ }
+
+ // If we made it here, it means we got a valid occurrence
+ $this->currentDate->setDate($currentYear, $currentMonth, $occurrence);
+ return;
+
+ } else {
+
+ // These are the 'byMonth' rules, if there are no byDay or
+ // byMonthDay sub-rules.
+ do {
+
+ $currentMonth++;
+ if ($currentMonth>12) {
+ $currentYear+=$this->interval;
+ $currentMonth = 1;
+ }
+ } while (!in_array($currentMonth, $this->byMonth));
+ $this->currentDate->setDate($currentYear, $currentMonth, $currentDayOfMonth);
+
+ return;
+
+ }
+
+ }
+
+ /**
+ * Returns all the occurrences for a monthly frequency with a 'byDay' or
+ * 'byMonthDay' expansion for the current month.
+ *
+ * The returned list is an array of integers with the day of month (1-31).
+ *
+ * @return array
+ */
+ protected function getMonthlyOccurrences() {
+
+ $startDate = clone $this->currentDate;
+
+ $byDayResults = array();
+
+ // Our strategy is to simply go through the byDays, advance the date to
+ // that point and add it to the results.
+ if ($this->byDay) foreach($this->byDay as $day) {
+
+ $dayName = $this->dayNames[$this->dayMap[substr($day,-2)]];
+
+ // Dayname will be something like 'wednesday'. Now we need to find
+ // all wednesdays in this month.
+ $dayHits = array();
+
+ $checkDate = clone $startDate;
+ $checkDate->modify('first day of this month');
+ $checkDate->modify($dayName);
+
+ do {
+ $dayHits[] = $checkDate->format('j');
+ $checkDate->modify('next ' . $dayName);
+ } while ($checkDate->format('n') === $startDate->format('n'));
+
+ // So now we have 'all wednesdays' for month. It is however
+ // possible that the user only really wanted the 1st, 2nd or last
+ // wednesday.
+ if (strlen($day)>2) {
+ $offset = (int)substr($day,0,-2);
+
+ if ($offset>0) {
+ // It is possible that the day does not exist, such as a
+ // 5th or 6th wednesday of the month.
+ if (isset($dayHits[$offset-1])) {
+ $byDayResults[] = $dayHits[$offset-1];
+ }
+ } else {
+
+ // if it was negative we count from the end of the array
+ $byDayResults[] = $dayHits[count($dayHits) + $offset];
+ }
+ } else {
+ // There was no counter (first, second, last wednesdays), so we
+ // just need to add the all to the list).
+ $byDayResults = array_merge($byDayResults, $dayHits);
+
+ }
+
+ }
+
+ $byMonthDayResults = array();
+ if ($this->byMonthDay) foreach($this->byMonthDay as $monthDay) {
+
+ // Removing values that are out of range for this month
+ if ($monthDay > $startDate->format('t') ||
+ $monthDay < 0-$startDate->format('t')) {
+ continue;
+ }
+ if ($monthDay>0) {
+ $byMonthDayResults[] = $monthDay;
+ } else {
+ // Negative values
+ $byMonthDayResults[] = $startDate->format('t') + 1 + $monthDay;
+ }
+ }
+
+ // If there was just byDay or just byMonthDay, they just specify our
+ // (almost) final list. If both were provided, then byDay limits the
+ // list.
+ if ($this->byMonthDay && $this->byDay) {
+ $result = array_intersect($byMonthDayResults, $byDayResults);
+ } elseif ($this->byMonthDay) {
+ $result = $byMonthDayResults;
+ } else {
+ $result = $byDayResults;
+ }
+ $result = array_unique($result);
+ sort($result, SORT_NUMERIC);
+
+ // The last thing that needs checking is the BYSETPOS. If it's set, it
+ // means only certain items in the set survive the filter.
+ if (!$this->bySetPos) {
+ return $result;
+ }
+
+ $filteredResult = array();
+ foreach($this->bySetPos as $setPos) {
+
+ if ($setPos<0) {
+ $setPos = count($result)-($setPos+1);
+ }
+ if (isset($result[$setPos-1])) {
+ $filteredResult[] = $result[$setPos-1];
+ }
+ }
+
+ sort($filteredResult, SORT_NUMERIC);
+ return $filteredResult;
+
+ }
+
+ protected function getHours()
+ {
+ $recurrenceHours = array();
+ foreach($this->byHour as $byHour) {
+ $recurrenceHours[] = $byHour;
+ }
+
+ return $recurrenceHours;
+ }
+
+ protected function getDays()
+ {
+ $recurrenceDays = array();
+ foreach($this->byDay as $byDay) {
+
+ // The day may be preceeded with a positive (+n) or
+ // negative (-n) integer. However, this does not make
+ // sense in 'weekly' so we ignore it here.
+ $recurrenceDays[] = $this->dayMap[substr($byDay,-2)];
+
+ }
+
+ return $recurrenceDays;
+ }
+}
+
diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/Splitter/ICalendar.php b/vendor/sabre/vobject/lib/Sabre/VObject/Splitter/ICalendar.php
new file mode 100644
index 000000000..657cfb810
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Sabre/VObject/Splitter/ICalendar.php
@@ -0,0 +1,111 @@
+<?php
+
+namespace Sabre\VObject\Splitter;
+
+use Sabre\VObject;
+
+/**
+ * Splitter
+ *
+ * This class is responsible for splitting up iCalendar objects.
+ *
+ * This class expects a single VCALENDAR object with one or more
+ * calendar-objects inside. Objects with identical UID's will be combined into
+ * a single object.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Dominik Tobschall
+ * @author Armin Hackmann
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class ICalendar implements SplitterInterface {
+
+ /**
+ * Timezones
+ *
+ * @var array
+ */
+ protected $vtimezones = array();
+
+ /**
+ * iCalendar objects
+ *
+ * @var array
+ */
+ protected $objects = array();
+
+ /**
+ * Constructor
+ *
+ * The splitter should receive an readable file stream as it's input.
+ *
+ * @param resource $input
+ */
+ public function __construct($input) {
+
+ $data = VObject\Reader::read(stream_get_contents($input));
+ $vtimezones = array();
+ $components = array();
+
+ foreach($data->children as $component) {
+ if (!$component instanceof VObject\Component) {
+ continue;
+ }
+
+ // Get all timezones
+ if ($component->name === 'VTIMEZONE') {
+ $this->vtimezones[(string)$component->TZID] = $component;
+ continue;
+ }
+
+ // Get component UID for recurring Events search
+ if($component->UID) {
+ $uid = (string)$component->UID;
+ } else {
+ // Generating a random UID
+ $uid = sha1(microtime()) . '-vobjectimport';
+ }
+
+ // Take care of recurring events
+ if (!array_key_exists($uid, $this->objects)) {
+ $this->objects[$uid] = VObject\Component::create('VCALENDAR');
+ }
+
+ $this->objects[$uid]->add(clone $component);
+ }
+
+ }
+
+ /**
+ * Every time getNext() is called, a new object will be parsed, until we
+ * hit the end of the stream.
+ *
+ * When the end is reached, null will be returned.
+ *
+ * @return Sabre\VObject\Component|null
+ */
+ public function getNext() {
+
+ if($object=array_shift($this->objects)) {
+
+ // create our baseobject
+ $object->version = '2.0';
+ $object->prodid = '-//Sabre//Sabre VObject ' . VObject\Version::VERSION . '//EN';
+ $object->calscale = 'GREGORIAN';
+
+ // add vtimezone information to obj (if we have it)
+ foreach ($this->vtimezones as $vtimezone) {
+ $object->add($vtimezone);
+ }
+
+ return $object;
+
+ } else {
+
+ return null;
+
+ }
+
+ }
+
+}
diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/Splitter/SplitterInterface.php b/vendor/sabre/vobject/lib/Sabre/VObject/Splitter/SplitterInterface.php
new file mode 100644
index 000000000..c0126883a
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Sabre/VObject/Splitter/SplitterInterface.php
@@ -0,0 +1,39 @@
+<?php
+
+namespace Sabre\VObject\Splitter;
+
+/**
+ * VObject splitter
+ *
+ * The splitter is responsible for reading a large vCard or iCalendar object,
+ * and splitting it into multiple objects.
+ *
+ * This is for example for Card and CalDAV, which require every event and vcard
+ * to exist in their own objects, instead of one large one.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Dominik Tobschall
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+interface SplitterInterface {
+
+ /**
+ * Constructor
+ *
+ * The splitter should receive an readable file stream as it's input.
+ *
+ * @param resource $input
+ */
+ function __construct($input);
+
+ /**
+ * Every time getNext() is called, a new object will be parsed, until we
+ * hit the end of the stream.
+ *
+ * When the end is reached, null will be returned.
+ *
+ * @return Sabre\VObject\Component|null
+ */
+ function getNext();
+
+}
diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/Splitter/VCard.php b/vendor/sabre/vobject/lib/Sabre/VObject/Splitter/VCard.php
new file mode 100644
index 000000000..7a8718c00
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Sabre/VObject/Splitter/VCard.php
@@ -0,0 +1,76 @@
+<?php
+
+namespace Sabre\VObject\Splitter;
+
+use Sabre\VObject;
+
+/**
+ * Splitter
+ *
+ * This class is responsible for splitting up VCard objects.
+ *
+ * It is assumed that the input stream contains 1 or more VCARD objects. This
+ * class checks for BEGIN:VCARD and END:VCARD and parses each encountered
+ * component individually.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Dominik Tobschall
+ * @author Armin Hackmann
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class VCard implements SplitterInterface {
+
+ /**
+ * File handle
+ *
+ * @var resource
+ */
+ protected $input;
+
+ /**
+ * Constructor
+ *
+ * The splitter should receive an readable file stream as it's input.
+ *
+ * @param resource $input
+ */
+ public function __construct($input) {
+
+ $this->input = $input;
+
+ }
+
+ /**
+ * Every time getNext() is called, a new object will be parsed, until we
+ * hit the end of the stream.
+ *
+ * When the end is reached, null will be returned.
+ *
+ * @return Sabre\VObject\Component|null
+ */
+ public function getNext() {
+
+ $vcard = '';
+
+ do {
+
+ if (feof($this->input)) {
+ return false;
+ }
+
+ $line = fgets($this->input);
+ $vcard .= $line;
+
+ } while(strtoupper(substr($line,0,4))!=="END:");
+
+ $object = VObject\Reader::read($vcard);
+
+ if($object->name !== 'VCARD') {
+ throw new \InvalidArgumentException("Thats no vCard!", 1);
+ }
+
+ return $object;
+
+ }
+
+}
diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/StringUtil.php b/vendor/sabre/vobject/lib/Sabre/VObject/StringUtil.php
new file mode 100644
index 000000000..ea88e1e86
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Sabre/VObject/StringUtil.php
@@ -0,0 +1,61 @@
+<?php
+
+namespace Sabre\VObject;
+
+/**
+ * Useful utilities for working with various strings.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class StringUtil {
+
+ /**
+ * Returns true or false depending on if a string is valid UTF-8
+ *
+ * @param string $str
+ * @return bool
+ */
+ static function isUTF8($str) {
+
+ // First check.. mb_check_encoding
+ if (!mb_check_encoding($str, 'UTF-8')) {
+ return false;
+ }
+
+ // Control characters
+ if (preg_match('%(?:[\x00-\x08\x0B-\x0C\x0E\x0F])%', $str)) {
+ return false;
+ }
+
+ return true;
+
+ }
+
+ /**
+ * This method tries its best to convert the input string to UTF-8.
+ *
+ * Currently only ISO-5991-1 input and UTF-8 input is supported, but this
+ * may be expanded upon if we receive other examples.
+ *
+ * @param string $str
+ * @return string
+ */
+ static function convertToUTF8($str) {
+
+ $encoding = mb_detect_encoding($str , array('UTF-8','ISO-8859-1'), true);
+
+ if ($encoding === 'ISO-8859-1') {
+ $newStr = utf8_encode($str);
+ } else {
+ $newStr = $str;
+ }
+
+ // Removing any control characters
+ return (preg_replace('%(?:[\x00-\x08\x0B-\x0C\x0E\x0F])%', '', $newStr));
+
+ }
+
+}
+
diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/TimeZoneUtil.php b/vendor/sabre/vobject/lib/Sabre/VObject/TimeZoneUtil.php
new file mode 100644
index 000000000..6f5b69f3f
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Sabre/VObject/TimeZoneUtil.php
@@ -0,0 +1,482 @@
+<?php
+
+namespace Sabre\VObject;
+
+/**
+ * Time zone name translation
+ *
+ * This file translates well-known time zone names into "Olson database" time zone names.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Frank Edelhaeuser (fedel@users.sourceforge.net)
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class TimeZoneUtil {
+
+ public static $map = array(
+
+ // from http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/zone_tzid.html
+ // snapshot taken on 2012/01/16
+
+ // windows
+ 'AUS Central Standard Time'=>'Australia/Darwin',
+ 'AUS Eastern Standard Time'=>'Australia/Sydney',
+ 'Afghanistan Standard Time'=>'Asia/Kabul',
+ 'Alaskan Standard Time'=>'America/Anchorage',
+ 'Arab Standard Time'=>'Asia/Riyadh',
+ 'Arabian Standard Time'=>'Asia/Dubai',
+ 'Arabic Standard Time'=>'Asia/Baghdad',
+ 'Argentina Standard Time'=>'America/Buenos_Aires',
+ 'Armenian Standard Time'=>'Asia/Yerevan',
+ 'Atlantic Standard Time'=>'America/Halifax',
+ 'Azerbaijan Standard Time'=>'Asia/Baku',
+ 'Azores Standard Time'=>'Atlantic/Azores',
+ 'Bangladesh Standard Time'=>'Asia/Dhaka',
+ 'Canada Central Standard Time'=>'America/Regina',
+ 'Cape Verde Standard Time'=>'Atlantic/Cape_Verde',
+ 'Caucasus Standard Time'=>'Asia/Yerevan',
+ 'Cen. Australia Standard Time'=>'Australia/Adelaide',
+ 'Central America Standard Time'=>'America/Guatemala',
+ 'Central Asia Standard Time'=>'Asia/Almaty',
+ 'Central Brazilian Standard Time'=>'America/Cuiaba',
+ 'Central Europe Standard Time'=>'Europe/Budapest',
+ 'Central European Standard Time'=>'Europe/Warsaw',
+ 'Central Pacific Standard Time'=>'Pacific/Guadalcanal',
+ 'Central Standard Time'=>'America/Chicago',
+ 'Central Standard Time (Mexico)'=>'America/Mexico_City',
+ 'China Standard Time'=>'Asia/Shanghai',
+ 'Dateline Standard Time'=>'Etc/GMT+12',
+ 'E. Africa Standard Time'=>'Africa/Nairobi',
+ 'E. Australia Standard Time'=>'Australia/Brisbane',
+ 'E. Europe Standard Time'=>'Europe/Minsk',
+ 'E. South America Standard Time'=>'America/Sao_Paulo',
+ 'Eastern Standard Time'=>'America/New_York',
+ 'Egypt Standard Time'=>'Africa/Cairo',
+ 'Ekaterinburg Standard Time'=>'Asia/Yekaterinburg',
+ 'FLE Standard Time'=>'Europe/Kiev',
+ 'Fiji Standard Time'=>'Pacific/Fiji',
+ 'GMT Standard Time'=>'Europe/London',
+ 'GTB Standard Time'=>'Europe/Istanbul',
+ 'Georgian Standard Time'=>'Asia/Tbilisi',
+ 'Greenland Standard Time'=>'America/Godthab',
+ 'Greenwich Standard Time'=>'Atlantic/Reykjavik',
+ 'Hawaiian Standard Time'=>'Pacific/Honolulu',
+ 'India Standard Time'=>'Asia/Calcutta',
+ 'Iran Standard Time'=>'Asia/Tehran',
+ 'Israel Standard Time'=>'Asia/Jerusalem',
+ 'Jordan Standard Time'=>'Asia/Amman',
+ 'Kamchatka Standard Time'=>'Asia/Kamchatka',
+ 'Korea Standard Time'=>'Asia/Seoul',
+ 'Magadan Standard Time'=>'Asia/Magadan',
+ 'Mauritius Standard Time'=>'Indian/Mauritius',
+ 'Mexico Standard Time'=>'America/Mexico_City',
+ 'Mexico Standard Time 2'=>'America/Chihuahua',
+ 'Mid-Atlantic Standard Time'=>'Etc/GMT-2',
+ 'Middle East Standard Time'=>'Asia/Beirut',
+ 'Montevideo Standard Time'=>'America/Montevideo',
+ 'Morocco Standard Time'=>'Africa/Casablanca',
+ 'Mountain Standard Time'=>'America/Denver',
+ 'Mountain Standard Time (Mexico)'=>'America/Chihuahua',
+ 'Myanmar Standard Time'=>'Asia/Rangoon',
+ 'N. Central Asia Standard Time'=>'Asia/Novosibirsk',
+ 'Namibia Standard Time'=>'Africa/Windhoek',
+ 'Nepal Standard Time'=>'Asia/Katmandu',
+ 'New Zealand Standard Time'=>'Pacific/Auckland',
+ 'Newfoundland Standard Time'=>'America/St_Johns',
+ 'North Asia East Standard Time'=>'Asia/Irkutsk',
+ 'North Asia Standard Time'=>'Asia/Krasnoyarsk',
+ 'Pacific SA Standard Time'=>'America/Santiago',
+ 'Pacific Standard Time'=>'America/Los_Angeles',
+ 'Pacific Standard Time (Mexico)'=>'America/Santa_Isabel',
+ 'Pakistan Standard Time'=>'Asia/Karachi',
+ 'Paraguay Standard Time'=>'America/Asuncion',
+ 'Romance Standard Time'=>'Europe/Paris',
+ 'Russian Standard Time'=>'Europe/Moscow',
+ 'SA Eastern Standard Time'=>'America/Cayenne',
+ 'SA Pacific Standard Time'=>'America/Bogota',
+ 'SA Western Standard Time'=>'America/La_Paz',
+ 'SE Asia Standard Time'=>'Asia/Bangkok',
+ 'Samoa Standard Time'=>'Pacific/Apia',
+ 'Singapore Standard Time'=>'Asia/Singapore',
+ 'South Africa Standard Time'=>'Africa/Johannesburg',
+ 'Sri Lanka Standard Time'=>'Asia/Colombo',
+ 'Syria Standard Time'=>'Asia/Damascus',
+ 'Taipei Standard Time'=>'Asia/Taipei',
+ 'Tasmania Standard Time'=>'Australia/Hobart',
+ 'Tokyo Standard Time'=>'Asia/Tokyo',
+ 'Tonga Standard Time'=>'Pacific/Tongatapu',
+ 'US Eastern Standard Time'=>'America/Indianapolis',
+ 'US Mountain Standard Time'=>'America/Phoenix',
+ 'UTC+12'=>'Etc/GMT-12',
+ 'UTC-02'=>'Etc/GMT+2',
+ 'UTC-11'=>'Etc/GMT+11',
+ 'Ulaanbaatar Standard Time'=>'Asia/Ulaanbaatar',
+ 'Venezuela Standard Time'=>'America/Caracas',
+ 'Vladivostok Standard Time'=>'Asia/Vladivostok',
+ 'W. Australia Standard Time'=>'Australia/Perth',
+ 'W. Central Africa Standard Time'=>'Africa/Lagos',
+ 'W. Europe Standard Time'=>'Europe/Berlin',
+ 'West Asia Standard Time'=>'Asia/Tashkent',
+ 'West Pacific Standard Time'=>'Pacific/Port_Moresby',
+ 'Yakutsk Standard Time'=>'Asia/Yakutsk',
+
+ // Microsoft exchange timezones
+ // Source:
+ // http://msdn.microsoft.com/en-us/library/ms988620%28v=exchg.65%29.aspx
+ //
+ // Correct timezones deduced with help from:
+ // http://en.wikipedia.org/wiki/List_of_tz_database_time_zones
+ 'Universal Coordinated Time' => 'UTC',
+ 'Casablanca, Monrovia' => 'Africa/Casablanca',
+ 'Greenwich Mean Time: Dublin, Edinburgh, Lisbon, London' => 'Europe/Lisbon',
+ 'Greenwich Mean Time; Dublin, Edinburgh, London' => 'Europe/London',
+ 'Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna' => 'Europe/Berlin',
+ 'Belgrade, Pozsony, Budapest, Ljubljana, Prague' => 'Europe/Prague',
+ 'Brussels, Copenhagen, Madrid, Paris' => 'Europe/Paris',
+ 'Paris, Madrid, Brussels, Copenhagen' => 'Europe/Paris',
+ 'Prague, Central Europe' => 'Europe/Prague',
+ 'Sarajevo, Skopje, Sofija, Vilnius, Warsaw, Zagreb' => 'Europe/Sarajevo',
+ 'West Central Africa' => 'Africa/Luanda', // This was a best guess
+ 'Athens, Istanbul, Minsk' => 'Europe/Athens',
+ 'Bucharest' => 'Europe/Bucharest',
+ 'Cairo' => 'Africa/Cairo',
+ 'Harare, Pretoria' => 'Africa/Harare',
+ 'Helsinki, Riga, Tallinn' => 'Europe/Helsinki',
+ 'Israel, Jerusalem Standard Time' => 'Asia/Jerusalem',
+ 'Baghdad' => 'Asia/Baghdad',
+ 'Arab, Kuwait, Riyadh' => 'Asia/Kuwait',
+ 'Moscow, St. Petersburg, Volgograd' => 'Europe/Moscow',
+ 'East Africa, Nairobi' => 'Africa/Nairobi',
+ 'Tehran' => 'Asia/Tehran',
+ 'Abu Dhabi, Muscat' => 'Asia/Muscat', // Best guess
+ 'Baku, Tbilisi, Yerevan' => 'Asia/Baku',
+ 'Kabul' => 'Asia/Kabul',
+ 'Ekaterinburg' => 'Asia/Yekaterinburg',
+ 'Islamabad, Karachi, Tashkent' => 'Asia/Karachi',
+ 'Kolkata, Chennai, Mumbai, New Delhi, India Standard Time' => 'Asia/Calcutta',
+ 'Kathmandu, Nepal' => 'Asia/Kathmandu',
+ 'Almaty, Novosibirsk, North Central Asia' => 'Asia/Almaty',
+ 'Astana, Dhaka' => 'Asia/Dhaka',
+ 'Sri Jayawardenepura, Sri Lanka' => 'Asia/Colombo',
+ 'Rangoon' => 'Asia/Rangoon',
+ 'Bangkok, Hanoi, Jakarta' => 'Asia/Bangkok',
+ 'Krasnoyarsk' => 'Asia/Krasnoyarsk',
+ 'Beijing, Chongqing, Hong Kong SAR, Urumqi' => 'Asia/Shanghai',
+ 'Irkutsk, Ulaan Bataar' => 'Asia/Irkutsk',
+ 'Kuala Lumpur, Singapore' => 'Asia/Singapore',
+ 'Perth, Western Australia' => 'Australia/Perth',
+ 'Taipei' => 'Asia/Taipei',
+ 'Osaka, Sapporo, Tokyo' => 'Asia/Tokyo',
+ 'Seoul, Korea Standard time' => 'Asia/Seoul',
+ 'Yakutsk' => 'Asia/Yakutsk',
+ 'Adelaide, Central Australia' => 'Australia/Adelaide',
+ 'Darwin' => 'Australia/Darwin',
+ 'Brisbane, East Australia' => 'Australia/Brisbane',
+ 'Canberra, Melbourne, Sydney, Hobart (year 2000 only)' => 'Australia/Sydney',
+ 'Guam, Port Moresby' => 'Pacific/Guam',
+ 'Hobart, Tasmania' => 'Australia/Hobart',
+ 'Vladivostok' => 'Asia/Vladivostok',
+ 'Magadan, Solomon Is., New Caledonia' => 'Asia/Magadan',
+ 'Auckland, Wellington' => 'Pacific/Auckland',
+ 'Fiji Islands, Kamchatka, Marshall Is.' => 'Pacific/Fiji',
+ 'Nuku\'alofa, Tonga' => 'Pacific/Tongatapu',
+ 'Azores' => 'Atlantic/Azores',
+ 'Cape Verde Is.' => 'Atlantic/Cape_Verde',
+ 'Mid-Atlantic' => 'America/Noronha',
+ 'Brasilia' => 'America/Sao_Paulo', // Best guess
+ 'Buenos Aires' => 'America/Argentina/Buenos_Aires',
+ 'Greenland' => 'America/Godthab',
+ 'Newfoundland' => 'America/St_Johns',
+ 'Atlantic Time (Canada)' => 'America/Halifax',
+ 'Caracas, La Paz' => 'America/Caracas',
+ 'Santiago' => 'America/Santiago',
+ 'Bogota, Lima, Quito' => 'America/Bogota',
+ 'Eastern Time (US & Canada)' => 'America/New_York',
+ 'Indiana (East)' => 'America/Indiana/Indianapolis',
+ 'Central America' => 'America/Guatemala',
+ 'Central Time (US & Canada)' => 'America/Chicago',
+ 'Mexico City, Tegucigalpa' => 'America/Mexico_City',
+ 'Saskatchewan' => 'America/Edmonton',
+ 'Arizona' => 'America/Phoenix',
+ 'Mountain Time (US & Canada)' => 'America/Denver', // Best guess
+ 'Pacific Time (US & Canada); Tijuana' => 'America/Los_Angeles', // Best guess
+ 'Alaska' => 'America/Anchorage',
+ 'Hawaii' => 'Pacific/Honolulu',
+ 'Midway Island, Samoa' => 'Pacific/Midway',
+ 'Eniwetok, Kwajalein, Dateline Time' => 'Pacific/Kwajalein',
+
+ // The following list are timezone names that could be generated by
+ // Lotus / Domino
+ 'Dateline' => 'Etc/GMT-12',
+ 'Samoa' => 'Pacific/Apia',
+ 'Hawaiian' => 'Pacific/Honolulu',
+ 'Alaskan' => 'America/Anchorage',
+ 'Pacific' => 'America/Los_Angeles',
+ 'Pacific Standard Time' => 'America/Los_Angeles',
+ 'Mexico Standard Time 2' => 'America/Chihuahua',
+ 'Mountain' => 'America/Denver',
+ 'Mountain Standard Time' => 'America/Chihuahua',
+ 'US Mountain' => 'America/Phoenix',
+ 'Canada Central' => 'America/Edmonton',
+ 'Central America' => 'America/Guatemala',
+ 'Central' => 'America/Chicago',
+ 'Central Standard Time' => 'America/Mexico_City',
+ 'Mexico' => 'America/Mexico_City',
+ 'Eastern' => 'America/New_York',
+ 'SA Pacific' => 'America/Bogota',
+ 'US Eastern' => 'America/Indiana/Indianapolis',
+ 'Venezuela' => 'America/Caracas',
+ 'Atlantic' => 'America/Halifax',
+ 'Central Brazilian' => 'America/Manaus',
+ 'Pacific SA' => 'America/Santiago',
+ 'SA Western' => 'America/La_Paz',
+ 'Newfoundland' => 'America/St_Johns',
+ 'Argentina' => 'America/Argentina/Buenos_Aires',
+ 'E. South America' => 'America/Belem',
+ 'Greenland' => 'America/Godthab',
+ 'Montevideo' => 'America/Montevideo',
+ 'SA Eastern' => 'America/Belem',
+ 'Mid-Atlantic' => 'Etc/GMT-2',
+ 'Azores' => 'Atlantic/Azores',
+ 'Cape Verde' => 'Atlantic/Cape_Verde',
+ 'Greenwich' => 'Atlantic/Reykjavik', // No I'm serious.. Greenwich is not GMT.
+ 'Morocco' => 'Africa/Casablanca',
+ 'Central Europe' => 'Europe/Prague',
+ 'Central European' => 'Europe/Sarajevo',
+ 'Romance' => 'Europe/Paris',
+ 'W. Central Africa' => 'Africa/Lagos', // Best guess
+ 'W. Europe' => 'Europe/Amsterdam',
+ 'E. Europe' => 'Europe/Minsk',
+ 'Egypt' => 'Africa/Cairo',
+ 'FLE' => 'Europe/Helsinki',
+ 'GTB' => 'Europe/Athens',
+ 'Israel' => 'Asia/Jerusalem',
+ 'Jordan' => 'Asia/Amman',
+ 'Middle East' => 'Asia/Beirut',
+ 'Namibia' => 'Africa/Windhoek',
+ 'South Africa' => 'Africa/Harare',
+ 'Arab' => 'Asia/Kuwait',
+ 'Arabic' => 'Asia/Baghdad',
+ 'E. Africa' => 'Africa/Nairobi',
+ 'Georgian' => 'Asia/Tbilisi',
+ 'Russian' => 'Europe/Moscow',
+ 'Iran' => 'Asia/Tehran',
+ 'Arabian' => 'Asia/Muscat',
+ 'Armenian' => 'Asia/Yerevan',
+ 'Azerbijan' => 'Asia/Baku',
+ 'Caucasus' => 'Asia/Yerevan',
+ 'Mauritius' => 'Indian/Mauritius',
+ 'Afghanistan' => 'Asia/Kabul',
+ 'Ekaterinburg' => 'Asia/Yekaterinburg',
+ 'Pakistan' => 'Asia/Karachi',
+ 'West Asia' => 'Asia/Tashkent',
+ 'India' => 'Asia/Calcutta',
+ 'Sri Lanka' => 'Asia/Colombo',
+ 'Nepal' => 'Asia/Kathmandu',
+ 'Central Asia' => 'Asia/Dhaka',
+ 'N. Central Asia' => 'Asia/Almaty',
+ 'Myanmar' => 'Asia/Rangoon',
+ 'North Asia' => 'Asia/Krasnoyarsk',
+ 'SE Asia' => 'Asia/Bangkok',
+ 'China' => 'Asia/Shanghai',
+ 'North Asia East' => 'Asia/Irkutsk',
+ 'Singapore' => 'Asia/Singapore',
+ 'Taipei' => 'Asia/Taipei',
+ 'W. Australia' => 'Australia/Perth',
+ 'Korea' => 'Asia/Seoul',
+ 'Tokyo' => 'Asia/Tokyo',
+ 'Yakutsk' => 'Asia/Yakutsk',
+ 'AUS Central' => 'Australia/Darwin',
+ 'Cen. Australia' => 'Australia/Adelaide',
+ 'AUS Eastern' => 'Australia/Sydney',
+ 'E. Australia' => 'Australia/Brisbane',
+ 'Tasmania' => 'Australia/Hobart',
+ 'Vladivostok' => 'Asia/Vladivostok',
+ 'West Pacific' => 'Pacific/Guam',
+ 'Central Pacific' => 'Asia/Magadan',
+ 'Fiji' => 'Pacific/Fiji',
+ 'New Zealand' => 'Pacific/Auckland',
+ 'Tonga' => 'Pacific/Tongatapu',
+ );
+
+ /**
+ * List of microsoft exchange timezone ids.
+ *
+ * Source: http://msdn.microsoft.com/en-us/library/aa563018(loband).aspx
+ */
+ public static $microsoftExchangeMap = array(
+ 0 => 'UTC',
+ 31 => 'Africa/Casablanca',
+
+ // Insanely, id #2 is used for both Europe/Lisbon, and Europe/Sarajevo.
+ // I'm not even kidding.. We handle this special case in the
+ // getTimeZone method.
+ 2 => 'Europe/Lisbon',
+ 1 => 'Europe/London',
+ 4 => 'Europe/Berlin',
+ 6 => 'Europe/Prague',
+ 3 => 'Europe/Paris',
+ 69 => 'Africa/Luanda', // This was a best guess
+ 7 => 'Europe/Athens',
+ 5 => 'Europe/Bucharest',
+ 49 => 'Africa/Cairo',
+ 50 => 'Africa/Harare',
+ 59 => 'Europe/Helsinki',
+ 27 => 'Asia/Jerusalem',
+ 26 => 'Asia/Baghdad',
+ 74 => 'Asia/Kuwait',
+ 51 => 'Europe/Moscow',
+ 56 => 'Africa/Nairobi',
+ 25 => 'Asia/Tehran',
+ 24 => 'Asia/Muscat', // Best guess
+ 54 => 'Asia/Baku',
+ 48 => 'Asia/Kabul',
+ 58 => 'Asia/Yekaterinburg',
+ 47 => 'Asia/Karachi',
+ 23 => 'Asia/Calcutta',
+ 62 => 'Asia/Kathmandu',
+ 46 => 'Asia/Almaty',
+ 71 => 'Asia/Dhaka',
+ 66 => 'Asia/Colombo',
+ 61 => 'Asia/Rangoon',
+ 22 => 'Asia/Bangkok',
+ 64 => 'Asia/Krasnoyarsk',
+ 45 => 'Asia/Shanghai',
+ 63 => 'Asia/Irkutsk',
+ 21 => 'Asia/Singapore',
+ 73 => 'Australia/Perth',
+ 75 => 'Asia/Taipei',
+ 20 => 'Asia/Tokyo',
+ 72 => 'Asia/Seoul',
+ 70 => 'Asia/Yakutsk',
+ 19 => 'Australia/Adelaide',
+ 44 => 'Australia/Darwin',
+ 18 => 'Australia/Brisbane',
+ 76 => 'Australia/Sydney',
+ 43 => 'Pacific/Guam',
+ 42 => 'Australia/Hobart',
+ 68 => 'Asia/Vladivostok',
+ 41 => 'Asia/Magadan',
+ 17 => 'Pacific/Auckland',
+ 40 => 'Pacific/Fiji',
+ 67 => 'Pacific/Tongatapu',
+ 29 => 'Atlantic/Azores',
+ 53 => 'Atlantic/Cape_Verde',
+ 30 => 'America/Noronha',
+ 8 => 'America/Sao_Paulo', // Best guess
+ 32 => 'America/Argentina/Buenos_Aires',
+ 60 => 'America/Godthab',
+ 28 => 'America/St_Johns',
+ 9 => 'America/Halifax',
+ 33 => 'America/Caracas',
+ 65 => 'America/Santiago',
+ 35 => 'America/Bogota',
+ 10 => 'America/New_York',
+ 34 => 'America/Indiana/Indianapolis',
+ 55 => 'America/Guatemala',
+ 11 => 'America/Chicago',
+ 37 => 'America/Mexico_City',
+ 36 => 'America/Edmonton',
+ 38 => 'America/Phoenix',
+ 12 => 'America/Denver', // Best guess
+ 13 => 'America/Los_Angeles', // Best guess
+ 14 => 'America/Anchorage',
+ 15 => 'Pacific/Honolulu',
+ 16 => 'Pacific/Midway',
+ 39 => 'Pacific/Kwajalein',
+ );
+
+ /**
+ * This method will try to find out the correct timezone for an iCalendar
+ * date-time value.
+ *
+ * You must pass the contents of the TZID parameter, as well as the full
+ * calendar.
+ *
+ * If the lookup fails, this method will return the default PHP timezone
+ * (as configured using date_default_timezone_set, or the date.timezone ini
+ * setting).
+ *
+ * Alternatively, if $failIfUncertain is set to true, it will throw an
+ * exception if we cannot accurately determine the timezone.
+ *
+ * @param string $tzid
+ * @param Sabre\VObject\Component $vcalendar
+ * @return DateTimeZone
+ */
+ static public function getTimeZone($tzid, Component $vcalendar = null, $failIfUncertain = false) {
+
+ // First we will just see if the tzid is a support timezone identifier.
+ try {
+ return new \DateTimeZone($tzid);
+ } catch (\Exception $e) {
+ }
+
+ // Next, we check if the tzid is somewhere in our tzid map.
+ if (isset(self::$map[$tzid])) {
+ return new \DateTimeZone(self::$map[$tzid]);
+ }
+
+ // Maybe the author was hyper-lazy and just included an offset. We
+ // support it, but we aren't happy about it.
+ if (preg_match('/^GMT(\+|-)([0-9]{4})$/', $tzid, $matches)) {
+ return new \DateTimeZone('Etc/GMT' . $matches[1] . ltrim(substr($matches[2],0,2),'0'));
+ }
+
+ if ($vcalendar) {
+
+ // If that didn't work, we will scan VTIMEZONE objects
+ foreach($vcalendar->select('VTIMEZONE') as $vtimezone) {
+
+ if ((string)$vtimezone->TZID === $tzid) {
+
+ // Some clients add 'X-LIC-LOCATION' with the olson name.
+ if (isset($vtimezone->{'X-LIC-LOCATION'})) {
+
+ $lic = (string)$vtimezone->{'X-LIC-LOCATION'};
+
+ // Libical generators may specify strings like
+ // "SystemV/EST5EDT". For those we must remove the
+ // SystemV part.
+ if (substr($lic,0,8)==='SystemV/') {
+ $lic = substr($lic,8);
+ }
+
+ try {
+ return new \DateTimeZone($lic);
+ } catch (\Exception $e) {
+ }
+
+ }
+ // Microsoft may add a magic number, which we also have an
+ // answer for.
+ if (isset($vtimezone->{'X-MICROSOFT-CDO-TZID'})) {
+ $cdoId = (int)$vtimezone->{'X-MICROSOFT-CDO-TZID'}->value;
+
+ // 2 can mean both Europe/Lisbon and Europe/Sarajevo.
+ if ($cdoId===2 && strpos((string)$vtimezone->TZID, 'Sarajevo')!==false) {
+ return new \DateTimeZone('Europe/Sarajevo');
+ }
+
+ if (isset(self::$microsoftExchangeMap[$cdoId])) {
+ return new \DateTimeZone(self::$microsoftExchangeMap[$cdoId]);
+ }
+ }
+
+ }
+
+ }
+
+ }
+
+ if ($failIfUncertain) {
+ throw new \InvalidArgumentException('We were unable to determine the correct PHP timezone for tzid: ' . $tzid);
+ }
+
+ // If we got all the way here, we default to UTC.
+ return new \DateTimeZone(date_default_timezone_get());
+
+ }
+
+}
diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/Version.php b/vendor/sabre/vobject/lib/Sabre/VObject/Version.php
new file mode 100644
index 000000000..2a64140f4
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Sabre/VObject/Version.php
@@ -0,0 +1,24 @@
+<?php
+
+namespace Sabre\VObject;
+
+/**
+ * This class contains the version number for the VObject package
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Version {
+
+ /**
+ * Full version number
+ */
+ const VERSION = '2.1.3';
+
+ /**
+ * Stability : alpha, beta, stable
+ */
+ const STABILITY = 'stable';
+
+}
diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/includes.php b/vendor/sabre/vobject/lib/Sabre/VObject/includes.php
new file mode 100644
index 000000000..d15329a6a
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Sabre/VObject/includes.php
@@ -0,0 +1,41 @@
+<?php
+
+/**
+ * Includes file
+ *
+ * This file includes the entire VObject library in one go.
+ * The benefit is that an autoloader is not needed, which is often faster.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+
+// Begin includes
+include __DIR__ . '/DateTimeParser.php';
+include __DIR__ . '/ElementList.php';
+include __DIR__ . '/FreeBusyGenerator.php';
+include __DIR__ . '/Node.php';
+include __DIR__ . '/Parameter.php';
+include __DIR__ . '/ParseException.php';
+include __DIR__ . '/Property.php';
+include __DIR__ . '/Reader.php';
+include __DIR__ . '/RecurrenceIterator.php';
+include __DIR__ . '/Splitter/SplitterInterface.php';
+include __DIR__ . '/StringUtil.php';
+include __DIR__ . '/TimeZoneUtil.php';
+include __DIR__ . '/Version.php';
+include __DIR__ . '/Splitter/VCard.php';
+include __DIR__ . '/Component.php';
+include __DIR__ . '/Document.php';
+include __DIR__ . '/Property/Compound.php';
+include __DIR__ . '/Property/DateTime.php';
+include __DIR__ . '/Property/MultiDateTime.php';
+include __DIR__ . '/Splitter/ICalendar.php';
+include __DIR__ . '/Component/VAlarm.php';
+include __DIR__ . '/Component/VCalendar.php';
+include __DIR__ . '/Component/VEvent.php';
+include __DIR__ . '/Component/VFreeBusy.php';
+include __DIR__ . '/Component/VJournal.php';
+include __DIR__ . '/Component/VTodo.php';
+// End includes
diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/Component/VAlarmTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/Component/VAlarmTest.php
new file mode 100644
index 000000000..d57be7aa5
--- /dev/null
+++ b/vendor/sabre/vobject/tests/Sabre/VObject/Component/VAlarmTest.php
@@ -0,0 +1,175 @@
+<?php
+
+namespace Sabre\VObject\Component;
+
+use Sabre\VObject\Component;
+use DateTime;
+use Sabre\VObject\Reader;
+
+class VAlarmTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * @dataProvider timeRangeTestData
+ */
+ public function testInTimeRange(VAlarm $valarm,$start,$end,$outcome) {
+
+ $this->assertEquals($outcome, $valarm->isInTimeRange($start, $end));
+
+ }
+
+ public function timeRangeTestData() {
+
+ $tests = array();
+
+ // Hard date and time
+ $valarm1 = Component::create('VALARM');
+ $valarm1->TRIGGER = '20120312T130000Z';
+ $valarm1->TRIGGER['VALUE'] = 'DATE-TIME';
+
+ $tests[] = array($valarm1, new DateTime('2012-03-01 01:00:00'), new DateTime('2012-04-01 01:00:00'), true);
+ $tests[] = array($valarm1, new DateTime('2012-03-01 01:00:00'), new DateTime('2012-03-10 01:00:00'), false);
+
+ // Relation to start time of event
+ $valarm2 = Component::create('VALARM');
+ $valarm2->TRIGGER = '-P1D';
+ $valarm2->TRIGGER['VALUE'] = 'DURATION';
+
+ $vevent2 = Component::create('VEVENT');
+ $vevent2->DTSTART = '20120313T130000Z';
+ $vevent2->add($valarm2);
+
+ $tests[] = array($valarm2, new DateTime('2012-03-01 01:00:00'), new DateTime('2012-04-01 01:00:00'), true);
+ $tests[] = array($valarm2, new DateTime('2012-03-01 01:00:00'), new DateTime('2012-03-10 01:00:00'), false);
+
+ // Relation to end time of event
+ $valarm3 = Component::create('VALARM');
+ $valarm3->TRIGGER = '-P1D';
+ $valarm3->TRIGGER['VALUE'] = 'DURATION';
+ $valarm3->TRIGGER['RELATED']= 'END';
+
+ $vevent3 = Component::create('VEVENT');
+ $vevent3->DTSTART = '20120301T130000Z';
+ $vevent3->DTEND = '20120401T130000Z';
+ $vevent3->add($valarm3);
+
+ $tests[] = array($valarm3, new DateTime('2012-02-25 01:00:00'), new DateTime('2012-03-05 01:00:00'), false);
+ $tests[] = array($valarm3, new DateTime('2012-03-25 01:00:00'), new DateTime('2012-04-05 01:00:00'), true);
+
+ // Relation to end time of todo
+ $valarm4 = Component::create('VALARM');
+ $valarm4->TRIGGER = '-P1D';
+ $valarm4->TRIGGER['VALUE'] = 'DURATION';
+ $valarm4->TRIGGER['RELATED']= 'END';
+
+ $vtodo4 = Component::create('VTODO');
+ $vtodo4->DTSTART = '20120301T130000Z';
+ $vtodo4->DUE = '20120401T130000Z';
+ $vtodo4->add($valarm4);
+
+ $tests[] = array($valarm4, new DateTime('2012-02-25 01:00:00'), new DateTime('2012-03-05 01:00:00'), false);
+ $tests[] = array($valarm4, new DateTime('2012-03-25 01:00:00'), new DateTime('2012-04-05 01:00:00'), true);
+
+ // Relation to start time of event + repeat
+ $valarm5 = Component::create('VALARM');
+ $valarm5->TRIGGER = '-P1D';
+ $valarm5->TRIGGER['VALUE'] = 'DURATION';
+ $valarm5->REPEAT = 10;
+ $valarm5->DURATION = 'P1D';
+
+ $vevent5 = Component::create('VEVENT');
+ $vevent5->DTSTART = '20120301T130000Z';
+ $vevent5->add($valarm5);
+
+ $tests[] = array($valarm5, new DateTime('2012-03-09 01:00:00'), new DateTime('2012-03-10 01:00:00'), true);
+
+ // Relation to start time of event + duration, but no repeat
+ $valarm6 = Component::create('VALARM');
+ $valarm6->TRIGGER = '-P1D';
+ $valarm6->TRIGGER['VALUE'] = 'DURATION';
+ $valarm6->DURATION = 'P1D';
+
+ $vevent6 = Component::create('VEVENT');
+ $vevent6->DTSTART = '20120313T130000Z';
+ $vevent6->add($valarm6);
+
+ $tests[] = array($valarm6, new DateTime('2012-03-01 01:00:00'), new DateTime('2012-04-01 01:00:00'), true);
+ $tests[] = array($valarm6, new DateTime('2012-03-01 01:00:00'), new DateTime('2012-03-10 01:00:00'), false);
+
+
+ // Relation to end time of event (DURATION instead of DTEND)
+ $valarm7 = Component::create('VALARM');
+ $valarm7->TRIGGER = '-P1D';
+ $valarm7->TRIGGER['VALUE'] = 'DURATION';
+ $valarm7->TRIGGER['RELATED']= 'END';
+
+ $vevent7 = Component::create('VEVENT');
+ $vevent7->DTSTART = '20120301T130000Z';
+ $vevent7->DURATION = 'P30D';
+ $vevent7->add($valarm7);
+
+ $tests[] = array($valarm7, new DateTime('2012-02-25 01:00:00'), new DateTime('2012-03-05 01:00:00'), false);
+ $tests[] = array($valarm7, new DateTime('2012-03-25 01:00:00'), new DateTime('2012-04-05 01:00:00'), true);
+
+ // Relation to end time of event (No DTEND or DURATION)
+ $valarm7 = Component::create('VALARM');
+ $valarm7->TRIGGER = '-P1D';
+ $valarm7->TRIGGER['VALUE'] = 'DURATION';
+ $valarm7->TRIGGER['RELATED']= 'END';
+
+ $vevent7 = Component::create('VEVENT');
+ $vevent7->DTSTART = '20120301T130000Z';
+ $vevent7->add($valarm7);
+
+ $tests[] = array($valarm7, new DateTime('2012-02-25 01:00:00'), new DateTime('2012-03-05 01:00:00'), true);
+ $tests[] = array($valarm7, new DateTime('2012-03-25 01:00:00'), new DateTime('2012-04-05 01:00:00'), false);
+
+
+ return $tests;
+ }
+
+ /**
+ * @expectedException LogicException
+ */
+ public function testInTimeRangeInvalidComponent() {
+
+ $valarm = Component::create('VALARM');
+ $valarm->TRIGGER = '-P1D';
+ $valarm->TRIGGER['RELATED'] = 'END';
+
+ $vjournal = Component::create('VJOURNAL');
+ $vjournal->add($valarm);
+
+ $valarm->isInTimeRange(new DateTime('2012-02-25 01:00:00'), new DateTime('2012-03-05 01:00:00'));
+
+ }
+
+ /**
+ * This bug was found and reported on the mailing list.
+ */
+ public function testInTimeRangeBuggy() {
+
+$input = <<<BLA
+BEGIN:VCALENDAR
+BEGIN:VTODO
+DTSTAMP:20121003T064931Z
+UID:b848cb9a7bb16e464a06c222ca1f8102@examle.com
+STATUS:NEEDS-ACTION
+DUE:20121005T000000Z
+SUMMARY:Task 1
+CATEGORIES:AlarmCategory
+BEGIN:VALARM
+TRIGGER:-PT10M
+ACTION:DISPLAY
+DESCRIPTION:Task 1
+END:VALARM
+END:VTODO
+END:VCALENDAR
+BLA;
+
+ $vobj = Reader::read($input);
+
+ $this->assertTrue($vobj->VTODO->VALARM->isInTimeRange(new \DateTime('2012-10-01 00:00:00'), new \DateTime('2012-11-01 00:00:00')));
+
+ }
+}
+
diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/Component/VCalendarTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/Component/VCalendarTest.php
new file mode 100644
index 000000000..1d7e0c603
--- /dev/null
+++ b/vendor/sabre/vobject/tests/Sabre/VObject/Component/VCalendarTest.php
@@ -0,0 +1,244 @@
+<?php
+
+namespace Sabre\VObject\Component;
+
+use Sabre\VObject;
+
+class VCalendarTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * @dataProvider expandData
+ */
+ public function testExpand($input, $output) {
+
+ $vcal = VObject\Reader::read($input);
+ $vcal->expand(
+ new \DateTime('2011-12-01'),
+ new \DateTime('2011-12-31')
+ );
+
+ // This will normalize the output
+ $output = VObject\Reader::read($output)->serialize();
+
+ $this->assertEquals($output, $vcal->serialize());
+
+ }
+
+ public function expandData() {
+
+ $tests = array();
+
+ // No data
+ $input = 'BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+VERSION:2.0
+END:VCALENDAR
+';
+
+ $output = $input;
+ $tests[] = array($input,$output);
+
+
+ // Simple events
+ $input = 'BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+VERSION:2.0
+BEGIN:VEVENT
+UID:bla
+SUMMARY:InExpand
+DTSTART;VALUE=DATE:20111202
+END:VEVENT
+BEGIN:VEVENT
+UID:bla2
+SUMMARY:NotInExpand
+DTSTART;VALUE=DATE:20120101
+END:VEVENT
+END:VCALENDAR
+';
+
+ $output = 'BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+VERSION:2.0
+BEGIN:VEVENT
+UID:bla
+SUMMARY:InExpand
+DTSTART;VALUE=DATE:20111202
+END:VEVENT
+END:VCALENDAR
+';
+
+ $tests[] = array($input, $output);
+
+ // Removing timezone info
+ $input = 'BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:Europe/Paris
+END:VTIMEZONE
+BEGIN:VEVENT
+UID:bla4
+SUMMARY:RemoveTZ info
+DTSTART;TZID=Europe/Paris:20111203T130102
+END:VEVENT
+END:VCALENDAR
+';
+
+ $output = 'BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+VERSION:2.0
+BEGIN:VEVENT
+UID:bla4
+SUMMARY:RemoveTZ info
+DTSTART;VALUE=DATE-TIME:20111203T120102Z
+END:VEVENT
+END:VCALENDAR
+';
+
+ $tests[] = array($input, $output);
+
+ // Recurrence rule
+ $input = 'BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+VERSION:2.0
+BEGIN:VEVENT
+UID:bla6
+SUMMARY:Testing RRule
+DTSTART:20111125T120000Z
+DTEND:20111125T130000Z
+RRULE:FREQ=WEEKLY
+END:VEVENT
+END:VCALENDAR
+';
+
+ $output = 'BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+VERSION:2.0
+BEGIN:VEVENT
+UID:bla6
+SUMMARY:Testing RRule
+DTSTART;VALUE=DATE-TIME:20111202T120000Z
+DTEND;VALUE=DATE-TIME:20111202T130000Z
+RECURRENCE-ID:20111202T120000Z
+END:VEVENT
+BEGIN:VEVENT
+UID:bla6
+SUMMARY:Testing RRule
+DTSTART;VALUE=DATE-TIME:20111209T120000Z
+DTEND;VALUE=DATE-TIME:20111209T130000Z
+RECURRENCE-ID:20111209T120000Z
+END:VEVENT
+BEGIN:VEVENT
+UID:bla6
+SUMMARY:Testing RRule
+DTSTART;VALUE=DATE-TIME:20111216T120000Z
+DTEND;VALUE=DATE-TIME:20111216T130000Z
+RECURRENCE-ID:20111216T120000Z
+END:VEVENT
+BEGIN:VEVENT
+UID:bla6
+SUMMARY:Testing RRule
+DTSTART;VALUE=DATE-TIME:20111223T120000Z
+DTEND;VALUE=DATE-TIME:20111223T130000Z
+RECURRENCE-ID:20111223T120000Z
+END:VEVENT
+BEGIN:VEVENT
+UID:bla6
+SUMMARY:Testing RRule
+DTSTART;VALUE=DATE-TIME:20111230T120000Z
+DTEND;VALUE=DATE-TIME:20111230T130000Z
+RECURRENCE-ID:20111230T120000Z
+END:VEVENT
+END:VCALENDAR
+';
+
+ // Recurrence rule + override
+ $input = 'BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+VERSION:2.0
+BEGIN:VEVENT
+UID:bla6
+SUMMARY:Testing RRule2
+DTSTART:20111125T120000Z
+DTEND:20111125T130000Z
+RRULE:FREQ=WEEKLY
+END:VEVENT
+BEGIN:VEVENT
+UID:bla6
+RECURRENCE-ID:20111209T120000Z
+DTSTART:20111209T140000Z
+DTEND:20111209T150000Z
+SUMMARY:Override!
+END:VEVENT
+END:VCALENDAR
+';
+
+ $output = 'BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+VERSION:2.0
+BEGIN:VEVENT
+UID:bla6
+SUMMARY:Testing RRule2
+DTSTART;VALUE=DATE-TIME:20111202T120000Z
+DTEND;VALUE=DATE-TIME:20111202T130000Z
+RECURRENCE-ID:20111202T120000Z
+END:VEVENT
+BEGIN:VEVENT
+UID:bla6
+RECURRENCE-ID:20111209T120000Z
+DTSTART:20111209T140000Z
+DTEND:20111209T150000Z
+SUMMARY:Override!
+END:VEVENT
+BEGIN:VEVENT
+UID:bla6
+SUMMARY:Testing RRule2
+DTSTART;VALUE=DATE-TIME:20111216T120000Z
+DTEND;VALUE=DATE-TIME:20111216T130000Z
+RECURRENCE-ID:20111216T120000Z
+END:VEVENT
+BEGIN:VEVENT
+UID:bla6
+SUMMARY:Testing RRule2
+DTSTART;VALUE=DATE-TIME:20111223T120000Z
+DTEND;VALUE=DATE-TIME:20111223T130000Z
+RECURRENCE-ID:20111223T120000Z
+END:VEVENT
+BEGIN:VEVENT
+UID:bla6
+SUMMARY:Testing RRule2
+DTSTART;VALUE=DATE-TIME:20111230T120000Z
+DTEND;VALUE=DATE-TIME:20111230T130000Z
+RECURRENCE-ID:20111230T120000Z
+END:VEVENT
+END:VCALENDAR
+';
+
+ $tests[] = array($input, $output);
+ return $tests;
+
+ }
+
+ /**
+ * @expectedException LogicException
+ */
+ public function testBrokenEventExpand() {
+
+ $input = 'BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+VERSION:2.0
+BEGIN:VEVENT
+RRULE:FREQ=WEEKLY
+DTSTART;VALUE=DATE:20111202
+END:VEVENT
+END:VCALENDAR
+';
+ $vcal = VObject\Reader::read($input);
+ $vcal->expand(
+ new \DateTime('2011-12-01'),
+ new \DateTime('2011-12-31')
+ );
+
+ }
+
+}
diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/Component/VCardTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/Component/VCardTest.php
new file mode 100644
index 000000000..584a007d9
--- /dev/null
+++ b/vendor/sabre/vobject/tests/Sabre/VObject/Component/VCardTest.php
@@ -0,0 +1,100 @@
+<?php
+
+namespace Sabre\VObject\Component;
+
+use Sabre\VObject;
+
+class VCardTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * @dataProvider validateData
+ */
+ function testValidate($input, $expectedWarnings, $expectedRepairedOutput) {
+
+ $vcard = VObject\Reader::read($input);
+
+ $warnings = $vcard->validate();
+
+ $warnMsg = array();
+ foreach($warnings as $warning) {
+ $warnMsg[] = $warning['message'];
+ }
+
+ $this->assertEquals($expectedWarnings, $warnMsg);
+
+ $vcard->validate(VObject\Component::REPAIR);
+
+ $this->assertEquals(
+ $expectedRepairedOutput,
+ $vcard->serialize()
+ );
+
+ }
+
+ public function validateData() {
+
+ $tests = array();
+
+ // Correct
+ $tests[] = array(
+ "BEGIN:VCARD\r\nVERSION:4.0\r\nFN:John Doe\r\nEND:VCARD\r\n",
+ array(),
+ "BEGIN:VCARD\r\nVERSION:4.0\r\nFN:John Doe\r\nEND:VCARD\r\n",
+ );
+
+ // No VERSION
+ $tests[] = array(
+ "BEGIN:VCARD\r\nFN:John Doe\r\nEND:VCARD\r\n",
+ array(
+ 'The VERSION property must appear in the VCARD component exactly 1 time',
+ ),
+ "BEGIN:VCARD\r\nVERSION:4.0\r\nFN:John Doe\r\nEND:VCARD\r\n",
+ );
+
+ // Unknown version
+ $tests[] = array(
+ "BEGIN:VCARD\r\nVERSION:2.2\r\nFN:John Doe\r\nEND:VCARD\r\n",
+ array(
+ 'Only vcard version 4.0 (RFC6350), version 3.0 (RFC2426) or version 2.1 (icm-vcard-2.1) are supported.',
+ ),
+ "BEGIN:VCARD\r\nVERSION:4.0\r\nFN:John Doe\r\nEND:VCARD\r\n",
+ );
+
+ // No FN
+ $tests[] = array(
+ "BEGIN:VCARD\r\nVERSION:4.0\r\nEND:VCARD\r\n",
+ array(
+ 'The FN property must appear in the VCARD component exactly 1 time',
+ ),
+ "BEGIN:VCARD\r\nVERSION:4.0\r\nEND:VCARD\r\n",
+ );
+ // No FN, N fallback
+ $tests[] = array(
+ "BEGIN:VCARD\r\nVERSION:4.0\r\nN:Doe;John;;;;;\r\nEND:VCARD\r\n",
+ array(
+ 'The FN property must appear in the VCARD component exactly 1 time',
+ ),
+ "BEGIN:VCARD\r\nVERSION:4.0\r\nN:Doe;John;;;;;\r\nFN:John Doe\r\nEND:VCARD\r\n",
+ );
+ // No FN, N fallback, no first name
+ $tests[] = array(
+ "BEGIN:VCARD\r\nVERSION:4.0\r\nN:Doe;;;;;;\r\nEND:VCARD\r\n",
+ array(
+ 'The FN property must appear in the VCARD component exactly 1 time',
+ ),
+ "BEGIN:VCARD\r\nVERSION:4.0\r\nN:Doe;;;;;;\r\nFN:Doe\r\nEND:VCARD\r\n",
+ );
+
+ // No FN, ORG fallback
+ $tests[] = array(
+ "BEGIN:VCARD\r\nVERSION:4.0\r\nORG:Acme Co.\r\nEND:VCARD\r\n",
+ array(
+ 'The FN property must appear in the VCARD component exactly 1 time',
+ ),
+ "BEGIN:VCARD\r\nVERSION:4.0\r\nORG:Acme Co.\r\nFN:Acme Co.\r\nEND:VCARD\r\n",
+ );
+ return $tests;
+
+ }
+
+}
diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/Component/VEventTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/Component/VEventTest.php
new file mode 100644
index 000000000..616da4ac7
--- /dev/null
+++ b/vendor/sabre/vobject/tests/Sabre/VObject/Component/VEventTest.php
@@ -0,0 +1,74 @@
+<?php
+
+namespace Sabre\VObject\Component;
+
+use Sabre\VObject;
+
+class VEventTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * @dataProvider timeRangeTestData
+ */
+ public function testInTimeRange(VEvent $vevent,$start,$end,$outcome) {
+
+ $this->assertEquals($outcome, $vevent->isInTimeRange($start, $end));
+
+ }
+
+ public function timeRangeTestData() {
+
+ $tests = array();
+
+ $vevent = new VEvent('VEVENT');
+ $vevent->DTSTART = '20111223T120000Z';
+ $tests[] = array($vevent, new \DateTime('2011-01-01'), new \DateTime('2012-01-01'), true);
+ $tests[] = array($vevent, new \DateTime('2011-01-01'), new \DateTime('2011-11-01'), false);
+
+ $vevent2 = clone $vevent;
+ $vevent2->DTEND = '20111225T120000Z';
+ $tests[] = array($vevent2, new \DateTime('2011-01-01'), new \DateTime('2012-01-01'), true);
+ $tests[] = array($vevent2, new \DateTime('2011-01-01'), new \DateTime('2011-11-01'), false);
+
+ $vevent3 = clone $vevent;
+ $vevent3->DURATION = 'P1D';
+ $tests[] = array($vevent3, new \DateTime('2011-01-01'), new \DateTime('2012-01-01'), true);
+ $tests[] = array($vevent3, new \DateTime('2011-01-01'), new \DateTime('2011-11-01'), false);
+
+ $vevent4 = clone $vevent;
+ $vevent4->DTSTART = '20111225';
+ $vevent4->DTSTART['VALUE'] = 'DATE';
+ $tests[] = array($vevent4, new \DateTime('2011-01-01'), new \DateTime('2012-01-01'), true);
+ $tests[] = array($vevent4, new \DateTime('2011-01-01'), new \DateTime('2011-11-01'), false);
+ // Event with no end date should be treated as lasting the entire day.
+ $tests[] = array($vevent4, new \DateTime('2011-12-25 16:00:00'), new \DateTime('2011-12-25 17:00:00'), true);
+
+
+ $vevent5 = clone $vevent;
+ $vevent5->DURATION = 'P1D';
+ $vevent5->RRULE = 'FREQ=YEARLY';
+ $tests[] = array($vevent5, new \DateTime('2011-01-01'), new \DateTime('2012-01-01'), true);
+ $tests[] = array($vevent5, new \DateTime('2011-01-01'), new \DateTime('2011-11-01'), false);
+ $tests[] = array($vevent5, new \DateTime('2013-12-01'), new \DateTime('2013-12-31'), true);
+
+ $vevent6 = clone $vevent;
+ $vevent6->DTSTART = '20111225';
+ $vevent6->DTSTART['VALUE'] = 'DATE';
+ $vevent6->DTEND = '20111225';
+ $vevent6->DTEND['VALUE'] = 'DATE';
+
+ $tests[] = array($vevent6, new \DateTime('2011-01-01'), new \DateTime('2012-01-01'), true);
+ $tests[] = array($vevent6, new \DateTime('2011-01-01'), new \DateTime('2011-11-01'), false);
+
+ // Added this test to ensure that recurrence rules with no DTEND also
+ // get checked for the entire day.
+ $vevent7 = clone $vevent;
+ $vevent7->DTSTART = '20120101';
+ $vevent7->DTSTART['VALUE'] = 'DATE';
+ $vevent7->RRULE = 'FREQ=MONTHLY';
+ $tests[] = array($vevent7, new \DateTime('2012-02-01 15:00:00'), new \DateTime('2012-02-02'), true);
+ return $tests;
+
+ }
+
+}
+
diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/Component/VFreeBusyTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/Component/VFreeBusyTest.php
new file mode 100644
index 000000000..031c3c684
--- /dev/null
+++ b/vendor/sabre/vobject/tests/Sabre/VObject/Component/VFreeBusyTest.php
@@ -0,0 +1,39 @@
+<?php
+
+namespace Sabre\VObject\Component;
+use Sabre\VObject;
+
+class VFreeBusyTest extends \PHPUnit_Framework_TestCase {
+
+ function testIsFree() {
+
+ $input = <<<BLA
+BEGIN:VCALENDAR
+BEGIN:VFREEBUSY
+FREEBUSY;FBTYPE=FREE:20120912T000500Z/PT1H
+FREEBUSY;FBTYPE=BUSY:20120912T010000Z/20120912T020000Z
+FREEBUSY;FBTYPE=BUSY-TENTATIVE:20120912T020000Z/20120912T030000Z
+FREEBUSY;FBTYPE=BUSY-UNAVAILABLE:20120912T030000Z/20120912T040000Z
+FREEBUSY;FBTYPE=BUSY:20120912T050000Z/20120912T060000Z,20120912T080000Z/20120912T090000Z
+FREEBUSY;FBTYPE=BUSY:20120912T100000Z/PT1H
+END:VFREEBUSY
+END:VCALENDAR
+BLA;
+
+ $obj = VObject\Reader::read($input);
+ $vfb = $obj->VFREEBUSY;
+
+ $tz = new \DateTimeZone('UTC');
+
+ $this->assertFalse($vfb->isFree(new \DateTime('2012-09-12 01:15:00', $tz), new \DateTime('2012-09-12 01:45:00', $tz)));
+ $this->assertFalse($vfb->isFree(new \DateTime('2012-09-12 08:05:00', $tz), new \DateTime('2012-09-12 08:10:00', $tz)));
+ $this->assertFalse($vfb->isFree(new \DateTime('2012-09-12 10:15:00', $tz), new \DateTime('2012-09-12 10:45:00', $tz)));
+
+ // Checking whether the end time is treated as non-inclusive
+ $this->assertTrue($vfb->isFree(new \DateTime('2012-09-12 09:00:00', $tz), new \DateTime('2012-09-12 09:15:00', $tz)));
+ $this->assertTrue($vfb->isFree(new \DateTime('2012-09-12 09:45:00', $tz), new \DateTime('2012-09-12 10:00:00', $tz)));
+ $this->assertTrue($vfb->isFree(new \DateTime('2012-09-12 11:00:00', $tz), new \DateTime('2012-09-12 12:00:00', $tz)));
+
+ }
+
+}
diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/Component/VJournalTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/Component/VJournalTest.php
new file mode 100644
index 000000000..46ecb992b
--- /dev/null
+++ b/vendor/sabre/vobject/tests/Sabre/VObject/Component/VJournalTest.php
@@ -0,0 +1,41 @@
+<?php
+
+namespace Sabre\VObject\Component;
+
+use Sabre\VObject\Component;
+
+class VJournalTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * @dataProvider timeRangeTestData
+ */
+ public function testInTimeRange(VJournal $vtodo,$start,$end,$outcome) {
+
+ $this->assertEquals($outcome, $vtodo->isInTimeRange($start, $end));
+
+ }
+
+ public function timeRangeTestData() {
+
+ $tests = array();
+
+ $vjournal = Component::create('VJOURNAL');
+ $vjournal->DTSTART = '20111223T120000Z';
+ $tests[] = array($vjournal, new \DateTime('2011-01-01'), new \DateTime('2012-01-01'), true);
+ $tests[] = array($vjournal, new \DateTime('2011-01-01'), new \DateTime('2011-11-01'), false);
+
+ $vjournal2 = Component::create('VJOURNAL');
+ $vjournal2->DTSTART = '20111223';
+ $vjournal2->DTSTART['VALUE'] = 'DATE';
+ $tests[] = array($vjournal2, new \DateTime('2011-01-01'), new \DateTime('2012-01-01'), true);
+ $tests[] = array($vjournal2, new \DateTime('2011-01-01'), new \DateTime('2011-11-01'), false);
+
+ $vjournal3 = Component::create('VJOURNAL');
+ $tests[] = array($vjournal3, new \DateTime('2011-01-01'), new \DateTime('2012-01-01'), false);
+ $tests[] = array($vjournal3, new \DateTime('2011-01-01'), new \DateTime('2011-11-01'), false);
+
+ return $tests;
+ }
+
+}
+
diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/Component/VTodoTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/Component/VTodoTest.php
new file mode 100644
index 000000000..a84da5cdf
--- /dev/null
+++ b/vendor/sabre/vobject/tests/Sabre/VObject/Component/VTodoTest.php
@@ -0,0 +1,67 @@
+<?php
+
+namespace Sabre\VObject\Component;
+
+use Sabre\VObject\Component;
+
+class VTodoTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * @dataProvider timeRangeTestData
+ */
+ public function testInTimeRange(VTodo $vtodo,$start,$end,$outcome) {
+
+ $this->assertEquals($outcome, $vtodo->isInTimeRange($start, $end));
+
+ }
+
+ public function timeRangeTestData() {
+
+ $tests = array();
+
+ $vtodo = Component::create('VTODO');
+ $vtodo->DTSTART = '20111223T120000Z';
+ $tests[] = array($vtodo, new \DateTime('2011-01-01'), new \DateTime('2012-01-01'), true);
+ $tests[] = array($vtodo, new \DateTime('2011-01-01'), new \DateTime('2011-11-01'), false);
+
+ $vtodo2 = clone $vtodo;
+ $vtodo2->DURATION = 'P1D';
+ $tests[] = array($vtodo2, new \DateTime('2011-01-01'), new \DateTime('2012-01-01'), true);
+ $tests[] = array($vtodo2, new \DateTime('2011-01-01'), new \DateTime('2011-11-01'), false);
+
+ $vtodo3 = clone $vtodo;
+ $vtodo3->DUE = '20111225';
+ $tests[] = array($vtodo3, new \DateTime('2011-01-01'), new \DateTime('2012-01-01'), true);
+ $tests[] = array($vtodo3, new \DateTime('2011-01-01'), new \DateTime('2011-11-01'), false);
+
+ $vtodo4 = Component::create('VTODO');
+ $vtodo4->DUE = '20111225';
+ $tests[] = array($vtodo4, new \DateTime('2011-01-01'), new \DateTime('2012-01-01'), true);
+ $tests[] = array($vtodo4, new \DateTime('2011-01-01'), new \DateTime('2011-11-01'), false);
+
+ $vtodo5 = Component::create('VTODO');
+ $vtodo5->COMPLETED = '20111225';
+ $tests[] = array($vtodo5, new \DateTime('2011-01-01'), new \DateTime('2012-01-01'), true);
+ $tests[] = array($vtodo5, new \DateTime('2011-01-01'), new \DateTime('2011-11-01'), false);
+
+ $vtodo6 = Component::create('VTODO');
+ $vtodo6->CREATED = '20111225';
+ $tests[] = array($vtodo6, new \DateTime('2011-01-01'), new \DateTime('2012-01-01'), true);
+ $tests[] = array($vtodo6, new \DateTime('2011-01-01'), new \DateTime('2011-11-01'), false);
+
+ $vtodo7 = Component::create('VTODO');
+ $vtodo7->CREATED = '20111225';
+ $vtodo7->COMPLETED = '20111226';
+ $tests[] = array($vtodo7, new \DateTime('2011-01-01'), new \DateTime('2012-01-01'), true);
+ $tests[] = array($vtodo7, new \DateTime('2011-01-01'), new \DateTime('2011-11-01'), false);
+
+ $vtodo7 = Component::create('VTODO');
+ $tests[] = array($vtodo7, new \DateTime('2011-01-01'), new \DateTime('2012-01-01'), true);
+ $tests[] = array($vtodo7, new \DateTime('2011-01-01'), new \DateTime('2011-11-01'), true);
+
+ return $tests;
+
+ }
+
+}
+
diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/ComponentTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/ComponentTest.php
new file mode 100644
index 000000000..07000bda0
--- /dev/null
+++ b/vendor/sabre/vobject/tests/Sabre/VObject/ComponentTest.php
@@ -0,0 +1,413 @@
+<?php
+
+namespace Sabre\VObject;
+
+class ComponentTest extends \PHPUnit_Framework_TestCase {
+
+ function testIterate() {
+
+ $comp = new Component('VCALENDAR');
+
+ $sub = new Component('VEVENT');
+ $comp->children[] = $sub;
+
+ $sub = new Component('VTODO');
+ $comp->children[] = $sub;
+
+ $count = 0;
+ foreach($comp->children() as $key=>$subcomponent) {
+
+ $count++;
+ $this->assertInstanceOf('Sabre\\VObject\\Component',$subcomponent);
+
+ }
+ $this->assertEquals(2,$count);
+ $this->assertEquals(1,$key);
+
+ }
+
+ function testMagicGet() {
+
+ $comp = new Component('VCALENDAR');
+
+ $sub = new Component('VEVENT');
+ $comp->children[] = $sub;
+
+ $sub = new Component('VTODO');
+ $comp->children[] = $sub;
+
+ $event = $comp->vevent;
+ $this->assertInstanceOf('Sabre\\VObject\\Component', $event);
+ $this->assertEquals('VEVENT', $event->name);
+
+ $this->assertInternalType('null', $comp->vjournal);
+
+ }
+
+ function testMagicGetGroups() {
+
+ $comp = new Component('VCARD');
+
+ $sub = new Property('GROUP1.EMAIL','1@1.com');
+ $comp->children[] = $sub;
+
+ $sub = new Property('GROUP2.EMAIL','2@2.com');
+ $comp->children[] = $sub;
+
+ $sub = new Property('EMAIL','3@3.com');
+ $comp->children[] = $sub;
+
+ $emails = $comp->email;
+ $this->assertEquals(3, count($emails));
+
+ $email1 = $comp->{"group1.email"};
+ $this->assertEquals('EMAIL', $email1[0]->name);
+ $this->assertEquals('GROUP1', $email1[0]->group);
+
+ $email3 = $comp->{".email"};
+ $this->assertEquals('EMAIL', $email3[0]->name);
+ $this->assertEquals(null, $email3[0]->group);
+
+ }
+
+ function testMagicIsset() {
+
+ $comp = new Component('VCALENDAR');
+
+ $sub = new Component('VEVENT');
+ $comp->children[] = $sub;
+
+ $sub = new Component('VTODO');
+ $comp->children[] = $sub;
+
+ $this->assertTrue(isset($comp->vevent));
+ $this->assertTrue(isset($comp->vtodo));
+ $this->assertFalse(isset($comp->vjournal));
+
+ }
+
+ function testMagicSetScalar() {
+
+ $comp = new Component('VCALENDAR');
+ $comp->myProp = 'myValue';
+
+ $this->assertInstanceOf('Sabre\\VObject\\Property',$comp->MYPROP);
+ $this->assertEquals('myValue',$comp->MYPROP->value);
+
+
+ }
+
+ function testMagicSetScalarTwice() {
+
+ $comp = new Component('VCALENDAR');
+ $comp->myProp = 'myValue';
+ $comp->myProp = 'myValue';
+
+ $this->assertEquals(1,count($comp->children));
+ $this->assertInstanceOf('Sabre\\VObject\\Property',$comp->MYPROP);
+ $this->assertEquals('myValue',$comp->MYPROP->value);
+
+ }
+
+ function testMagicSetComponent() {
+
+ $comp = new Component('VCALENDAR');
+
+ // Note that 'myProp' is ignored here.
+ $comp->myProp = new Component('VEVENT');
+
+ $this->assertEquals(1, count($comp->children));
+
+ $this->assertEquals('VEVENT',$comp->VEVENT->name);
+
+ }
+
+ function testMagicSetTwice() {
+
+ $comp = new Component('VCALENDAR');
+
+ $comp->VEVENT = new Component('VEVENT');
+ $comp->VEVENT = new Component('VEVENT');
+
+ $this->assertEquals(1, count($comp->children));
+
+ $this->assertEquals('VEVENT',$comp->VEVENT->name);
+
+ }
+
+ function testArrayAccessGet() {
+
+ $comp = new Component('VCALENDAR');
+
+ $event = new Component('VEVENT');
+ $event->summary = 'Event 1';
+
+ $comp->add($event);
+
+ $event2 = clone $event;
+ $event2->summary = 'Event 2';
+
+ $comp->add($event2);
+
+ $this->assertEquals(2,count($comp->children()));
+ $this->assertTrue($comp->vevent[1] instanceof Component);
+ $this->assertEquals('Event 2', (string)$comp->vevent[1]->summary);
+
+ }
+
+ function testArrayAccessExists() {
+
+ $comp = new Component('VCALENDAR');
+
+ $event = new Component('VEVENT');
+ $event->summary = 'Event 1';
+
+ $comp->add($event);
+
+ $event2 = clone $event;
+ $event2->summary = 'Event 2';
+
+ $comp->add($event2);
+
+ $this->assertTrue(isset($comp->vevent[0]));
+ $this->assertTrue(isset($comp->vevent[1]));
+
+ }
+
+ /**
+ * @expectedException LogicException
+ */
+ function testArrayAccessSet() {
+
+ $comp = new Component('VCALENDAR');
+ $comp['hey'] = 'hi there';
+
+ }
+ /**
+ * @expectedException LogicException
+ */
+ function testArrayAccessUnset() {
+
+ $comp = new Component('VCALENDAR');
+ unset($comp[0]);
+
+ }
+
+ function testAddScalar() {
+
+ $comp = new Component('VCALENDAR');
+
+ $comp->add('myprop','value');
+
+ $this->assertEquals(1, count($comp->children));
+
+ $this->assertTrue($comp->children[0] instanceof Property);
+ $this->assertEquals('MYPROP',$comp->children[0]->name);
+ $this->assertEquals('value',$comp->children[0]->value);
+
+ }
+
+ function testAddScalarParams() {
+
+ $comp = Component::create('VCALENDAR');
+
+ $comp->add('myprop','value',array('param1'=>'value1'));
+
+ $this->assertEquals(1, count($comp->children));
+
+ $this->assertTrue($comp->children[0] instanceof Property);
+ $this->assertEquals('MYPROP',$comp->children[0]->name);
+ $this->assertEquals('value',$comp->children[0]->value);
+
+ $this->assertEquals(1, count($comp->children[0]->parameters));
+
+ $this->assertTrue($comp->children[0]->parameters[0] instanceof Parameter);
+ $this->assertEquals('PARAM1',$comp->children[0]->parameters[0]->name);
+ $this->assertEquals('value1',$comp->children[0]->parameters[0]->value);
+
+ }
+
+
+ function testAddComponent() {
+
+ $comp = new Component('VCALENDAR');
+
+ $comp->add(new Component('VEVENT'));
+
+ $this->assertEquals(1, count($comp->children));
+
+ $this->assertEquals('VEVENT',$comp->VEVENT->name);
+
+ }
+
+ function testAddComponentTwice() {
+
+ $comp = new Component('VCALENDAR');
+
+ $comp->add(new Component('VEVENT'));
+ $comp->add(new Component('VEVENT'));
+
+ $this->assertEquals(2, count($comp->children));
+
+ $this->assertEquals('VEVENT',$comp->VEVENT->name);
+
+ }
+
+ /**
+ * @expectedException InvalidArgumentException
+ */
+ function testAddArgFail() {
+
+ $comp = new Component('VCALENDAR');
+ $comp->add(new Component('VEVENT'),'hello');
+
+ }
+
+ /**
+ * @expectedException InvalidArgumentException
+ */
+ function testAddArgFail2() {
+
+ $comp = new Component('VCALENDAR');
+ $comp->add(array());
+
+ }
+
+ /**
+ * @expectedException InvalidArgumentException
+ */
+ function testAddArgFail3() {
+
+ $comp = new Component('VCALENDAR');
+ $comp->add('hello',array());
+
+ }
+
+ /**
+ * @expectedException InvalidArgumentException
+ */
+ function testMagicSetInvalid() {
+
+ $comp = new Component('VCALENDAR');
+
+ // Note that 'myProp' is ignored here.
+ $comp->myProp = new \StdClass();
+
+ $this->assertEquals(1, count($comp->children));
+
+ $this->assertEquals('VEVENT',$comp->VEVENT->name);
+
+ }
+
+ function testMagicUnset() {
+
+ $comp = new Component('VCALENDAR');
+ $comp->add(new Component('VEVENT'));
+
+ unset($comp->vevent);
+
+ $this->assertEquals(array(), $comp->children);
+
+ }
+
+
+ function testCount() {
+
+ $comp = new Component('VCALENDAR');
+ $this->assertEquals(1,$comp->count());
+
+ }
+
+ function testChildren() {
+
+ $comp = new Component('VCALENDAR');
+
+ // Note that 'myProp' is ignored here.
+ $comp->children = array(
+ new Component('VEVENT'),
+ new Component('VTODO')
+ );
+
+ $r = $comp->children();
+ $this->assertTrue($r instanceof ElementList);
+ $this->assertEquals(2,count($r));
+ }
+
+ function testGetComponents() {
+
+ $comp = new Component('VCALENDAR');
+
+ // Note that 'myProp' is ignored here.
+ $comp->children = array(
+ new Property('FOO','BAR'),
+ new Component('VTODO')
+ );
+
+ $r = $comp->getComponents();
+ $this->assertInternalType('array', $r);
+ $this->assertEquals(1, count($r));
+ $this->assertEquals('VTODO', $r[0]->name);
+ }
+
+ function testSerialize() {
+
+ $comp = new Component('VCALENDAR');
+ $this->assertEquals("BEGIN:VCALENDAR\r\nEND:VCALENDAR\r\n", $comp->serialize());
+
+ }
+
+ function testSerializeChildren() {
+
+ $comp = new Component('VCALENDAR');
+ $comp->children = array(
+ new Component('VEVENT'),
+ new Component('VTODO')
+ );
+
+ $str = $comp->serialize();
+
+ $this->assertEquals("BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\nEND:VEVENT\r\nBEGIN:VTODO\r\nEND:VTODO\r\nEND:VCALENDAR\r\n", $str);
+
+ }
+
+ function testSerializeOrderCompAndProp() {
+
+ $comp = new Component('VCALENDAR');
+ $comp->add(new Component('VEVENT'));
+ $comp->add('PROP1','BLABLA');
+ $comp->add('VERSION','2.0');
+ $comp->add(new Component('VTIMEZONE'));
+
+ $str = $comp->serialize();
+
+ $this->assertEquals("BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPROP1:BLABLA\r\nBEGIN:VTIMEZONE\r\nEND:VTIMEZONE\r\nBEGIN:VEVENT\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", $str);
+
+ }
+
+ function testAnotherSerializeOrderProp() {
+
+ $prop4s=array('1', '2', '3', '4', '5', '6', '7', '8', '9', '10');
+
+ $comp = new Component('VCARD');
+ $comp->__set('SOMEPROP','FOO');
+ $comp->__set('ANOTHERPROP','FOO');
+ $comp->__set('THIRDPROP','FOO');
+ foreach ($prop4s as $prop4) {
+ $comp->add('PROP4', 'FOO '.$prop4);
+ }
+ $comp->__set('PROPNUMBERFIVE', 'FOO');
+ $comp->__set('PROPNUMBERSIX', 'FOO');
+ $comp->__set('PROPNUMBERSEVEN', 'FOO');
+ $comp->__set('PROPNUMBEREIGHT', 'FOO');
+ $comp->__set('PROPNUMBERNINE', 'FOO');
+ $comp->__set('PROPNUMBERTEN', 'FOO');
+ $comp->__set('VERSION','2.0');
+ $comp->__set('UID', 'FOO');
+
+ $str = $comp->serialize();
+
+ $this->assertEquals("BEGIN:VCARD\r\nVERSION:2.0\r\nSOMEPROP:FOO\r\nANOTHERPROP:FOO\r\nTHIRDPROP:FOO\r\nPROP4:FOO 1\r\nPROP4:FOO 2\r\nPROP4:FOO 3\r\nPROP4:FOO 4\r\nPROP4:FOO 5\r\nPROP4:FOO 6\r\nPROP4:FOO 7\r\nPROP4:FOO 8\r\nPROP4:FOO 9\r\nPROP4:FOO 10\r\nPROPNUMBERFIVE:FOO\r\nPROPNUMBERSIX:FOO\r\nPROPNUMBERSEVEN:FOO\r\nPROPNUMBEREIGHT:FOO\r\nPROPNUMBERNINE:FOO\r\nPROPNUMBERTEN:FOO\r\nUID:FOO\r\nEND:VCARD\r\n", $str);
+
+ }
+
+}
diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/DateTimeParserTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/DateTimeParserTest.php
new file mode 100644
index 000000000..6ea2faed9
--- /dev/null
+++ b/vendor/sabre/vobject/tests/Sabre/VObject/DateTimeParserTest.php
@@ -0,0 +1,153 @@
+<?php
+
+namespace Sabre\VObject;
+
+use DateTime;
+use DateTimeZone;
+use DateInterval;
+
+class DateTimeParserTest extends \PHPUnit_Framework_TestCase {
+
+ function testParseICalendarDuration() {
+
+ $this->assertEquals('+1 weeks', DateTimeParser::parseDuration('P1W',true));
+ $this->assertEquals('+5 days', DateTimeParser::parseDuration('P5D',true));
+ $this->assertEquals('+5 days 3 hours 50 minutes 12 seconds', DateTimeParser::parseDuration('P5DT3H50M12S',true));
+ $this->assertEquals('-1 weeks 50 minutes', DateTimeParser::parseDuration('-P1WT50M',true));
+ $this->assertEquals('+50 days 3 hours 2 seconds', DateTimeParser::parseDuration('+P50DT3H2S',true));
+ $this->assertEquals(new DateInterval('PT0S'), DateTimeParser::parseDuration('PT0S'));
+
+ }
+
+ function testParseICalendarDurationDateInterval() {
+
+ $expected = new DateInterval('P7D');
+ $this->assertEquals($expected, DateTimeParser::parseDuration('P1W'));
+ $this->assertEquals($expected, DateTimeParser::parse('P1W'));
+
+ $expected = new DateInterval('PT3M');
+ $expected->invert = true;
+ $this->assertEquals($expected, DateTimeParser::parseDuration('-PT3M'));
+
+ }
+
+ /**
+ * @expectedException LogicException
+ */
+ function testParseICalendarDurationFail() {
+
+ DateTimeParser::parseDuration('P1X',true);
+
+ }
+
+ function testParseICalendarDateTime() {
+
+ $dateTime = DateTimeParser::parseDateTime('20100316T141405');
+
+ $compare = new DateTime('2010-03-16 14:14:05',new DateTimeZone('UTC'));
+
+ $this->assertEquals($compare, $dateTime);
+
+ }
+
+ /**
+ * @depends testParseICalendarDateTime
+ * @expectedException LogicException
+ */
+ function testParseICalendarDateTimeBadFormat() {
+
+ $dateTime = DateTimeParser::parseDateTime('20100316T141405 ');
+
+ }
+
+ /**
+ * @depends testParseICalendarDateTime
+ */
+ function testParseICalendarDateTimeUTC() {
+
+ $dateTime = DateTimeParser::parseDateTime('20100316T141405Z');
+
+ $compare = new DateTime('2010-03-16 14:14:05',new DateTimeZone('UTC'));
+ $this->assertEquals($compare, $dateTime);
+
+ }
+
+ /**
+ * @depends testParseICalendarDateTime
+ */
+ function testParseICalendarDateTimeUTC2() {
+
+ $dateTime = DateTimeParser::parseDateTime('20101211T160000Z');
+
+ $compare = new DateTime('2010-12-11 16:00:00',new DateTimeZone('UTC'));
+ $this->assertEquals($compare, $dateTime);
+
+ }
+
+ /**
+ * @depends testParseICalendarDateTime
+ */
+ function testParseICalendarDateTimeCustomTimeZone() {
+
+ $dateTime = DateTimeParser::parseDateTime('20100316T141405', new DateTimeZone('Europe/Amsterdam'));
+
+ $compare = new DateTime('2010-03-16 13:14:05',new DateTimeZone('UTC'));
+ $this->assertEquals($compare, $dateTime);
+
+ }
+
+ function testParseICalendarDate() {
+
+ $dateTime = DateTimeParser::parseDate('20100316');
+
+ $expected = new DateTime('2010-03-16 00:00:00',new DateTimeZone('UTC'));
+
+ $this->assertEquals($expected, $dateTime);
+
+ $dateTime = DateTimeParser::parse('20100316');
+ $this->assertEquals($expected, $dateTime);
+
+ }
+
+ /**
+ * TCheck if a date with year > 4000 will not throw an exception. iOS seems to use 45001231 in yearly recurring events
+ */
+ function testParseICalendarDateGreaterThan4000() {
+
+ $dateTime = DateTimeParser::parseDate('45001231');
+
+ $expected = new DateTime('4500-12-31 00:00:00',new DateTimeZone('UTC'));
+
+ $this->assertEquals($expected, $dateTime);
+
+ $dateTime = DateTimeParser::parse('45001231');
+ $this->assertEquals($expected, $dateTime);
+
+ }
+
+ /**
+ * Check if a datetime with year > 4000 will not throw an exception. iOS seems to use 45001231T235959 in yearly recurring events
+ */
+ function testParseICalendarDateTimeGreaterThan4000() {
+
+ $dateTime = DateTimeParser::parseDateTime('45001231T235959');
+
+ $expected = new DateTime('4500-12-31 23:59:59',new DateTimeZone('UTC'));
+
+ $this->assertEquals($expected, $dateTime);
+
+ $dateTime = DateTimeParser::parse('45001231T235959');
+ $this->assertEquals($expected, $dateTime);
+
+ }
+
+ /**
+ * @depends testParseICalendarDate
+ * @expectedException LogicException
+ */
+ function testParseICalendarDateBadFormat() {
+
+ $dateTime = DateTimeParser::parseDate('20100316T141405');
+
+ }
+}
diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/DocumentTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/DocumentTest.php
new file mode 100644
index 000000000..5fd2a2a78
--- /dev/null
+++ b/vendor/sabre/vobject/tests/Sabre/VObject/DocumentTest.php
@@ -0,0 +1,26 @@
+<?php
+
+namespace Sabre\VObject;
+
+class DocumentTest extends \PHPUnit_Framework_TestCase {
+
+ function testCreateComponent() {
+
+ $vcal = new Component\VCalendar();
+
+ $event = $vcal->createComponent('VEVENT');
+
+ $this->assertInstanceOf('Sabre\VObject\Component\VEvent', $event);
+ $vcal->add($event);
+
+ $prop = $vcal->createProperty('X-PROP','1234256',array('X-PARAM' => '3'));
+ $this->assertInstanceOf('Sabre\VObject\Property', $prop);
+
+ $event->add($prop);
+
+ $out = $vcal->serialize();
+ $this->assertEquals("BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\nX-PROP;X-PARAM=3:1234256\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", $out);
+
+ }
+
+}
diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/ElementListTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/ElementListTest.php
new file mode 100644
index 000000000..84e1bcbe9
--- /dev/null
+++ b/vendor/sabre/vobject/tests/Sabre/VObject/ElementListTest.php
@@ -0,0 +1,32 @@
+<?php
+
+namespace Sabre\VObject;
+
+class ElementListTest extends \PHPUnit_Framework_TestCase {
+
+ function testIterate() {
+
+ $sub = new Component('VEVENT');
+
+ $elems = array(
+ $sub,
+ clone $sub,
+ clone $sub
+ );
+
+ $elemList = new ElementList($elems);
+
+ $count = 0;
+ foreach($elemList as $key=>$subcomponent) {
+
+ $count++;
+ $this->assertInstanceOf('Sabre\\VObject\\Component',$subcomponent);
+
+ }
+ $this->assertEquals(3,$count);
+ $this->assertEquals(2,$key);
+
+ }
+
+
+}
diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/EmClientTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/EmClientTest.php
new file mode 100644
index 000000000..69d410fe7
--- /dev/null
+++ b/vendor/sabre/vobject/tests/Sabre/VObject/EmClientTest.php
@@ -0,0 +1,55 @@
+<?php
+
+namespace Sabre\VObject;
+
+class EmClientTest extends \PHPUnit_Framework_TestCase {
+
+ function testParseTz() {
+
+ $str = 'BEGIN:VCALENDAR
+X-WR-CALNAME:Blackhawks Schedule 2011-12
+X-APPLE-CALENDAR-COLOR:#E51717
+X-WR-TIMEZONE:America/Chicago
+CALSCALE:GREGORIAN
+PRODID:-//eM Client/4.0.13961.0
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:America/Chicago
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+RRULE:FREQ=YEARLY;BYDAY=2SU;BYMONTH=3
+DTSTART:20070311T020000
+TZNAME:CDT
+TZOFFSETTO:-0500
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=11
+DTSTART:20071104T020000
+TZNAME:CST
+TZOFFSETTO:-0600
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+CREATED:20110624T181236Z
+UID:be3bbfff-96e8-4c66-9908-ab791a62231d
+DTEND;TZID="America/Chicago":20111008T223000
+TRANSP:OPAQUE
+SUMMARY:Stars @ Blackhawks (Home Opener)
+DTSTART;TZID="America/Chicago":20111008T193000
+DTSTAMP:20120330T013232Z
+SEQUENCE:2
+X-MICROSOFT-CDO-BUSYSTATUS:BUSY
+LAST-MODIFIED:20120330T013237Z
+CLASS:PUBLIC
+END:VEVENT
+END:VCALENDAR';
+
+ $vObject = Reader::read($str);
+ $dt = $vObject->VEVENT->DTSTART->getDateTime();
+ $this->assertEquals(new \DateTime('2011-10-08 19:30:00', new \DateTimeZone('America/Chicago')), $dt);
+
+ }
+
+}
+
diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/FreeBusyGeneratorTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/FreeBusyGeneratorTest.php
new file mode 100644
index 000000000..1f79e0a47
--- /dev/null
+++ b/vendor/sabre/vobject/tests/Sabre/VObject/FreeBusyGeneratorTest.php
@@ -0,0 +1,246 @@
+<?php
+
+namespace Sabre\VObject;
+
+class FreeBusyGeneratorTest extends \PHPUnit_Framework_TestCase {
+
+ function getInput() {
+
+ // shows up
+$blob1 = <<<ICS
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+DTSTART:20110101T120000Z
+DTEND:20110101T130000Z
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+ // opaque, shows up
+$blob2 = <<<ICS
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+TRANSP:OPAQUE
+DTSTART:20110101T130000Z
+DTEND:20110101T140000Z
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+ // transparent, hidden
+$blob3 = <<<ICS
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+TRANSP:TRANSPARENT
+DTSTART:20110101T140000Z
+DTEND:20110101T150000Z
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+ // cancelled, hidden
+$blob4 = <<<ICS
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+STATUS:CANCELLED
+DTSTART:20110101T160000Z
+DTEND:20110101T170000Z
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+ // tentative, shows up
+$blob5 = <<<ICS
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+STATUS:TENTATIVE
+DTSTART:20110101T180000Z
+DTEND:20110101T190000Z
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+ // outside of time-range, hidden
+$blob6 = <<<ICS
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+DTSTART:20110101T090000Z
+DTEND:20110101T100000Z
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+ // outside of time-range, hidden
+$blob7 = <<<ICS
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+DTSTART:20110104T090000Z
+DTEND:20110104T100000Z
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+ // using duration, shows up
+$blob8 = <<<ICS
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+DTSTART:20110101T190000Z
+DURATION:PT1H
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+ // Day-long event, shows up
+$blob9 = <<<ICS
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+DTSTART;TYPE=DATE:20110102
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+// No duration, does not show up
+$blob10 = <<<ICS
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+DTSTART:20110101T200000Z
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+// encoded as object, shows up
+$blob11 = <<<ICS
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+DTSTART:20110101T210000Z
+DURATION:PT1H
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+// Freebusy. Some parts show up
+$blob12 = <<<ICS
+BEGIN:VCALENDAR
+BEGIN:VFREEBUSY
+FREEBUSY:20110103T010000Z/20110103T020000Z
+FREEBUSY;FBTYPE=FREE:20110103T020000Z/20110103T030000Z
+FREEBUSY:20110103T030000Z/20110103T040000Z,20110103T040000Z/20110103T050000Z
+FREEBUSY:20120101T000000Z/20120101T010000Z
+FREEBUSY:20110103T050000Z/PT1H
+END:VFREEBUSY
+END:VCALENDAR
+ICS;
+
+// Yearly recurrence rule, shows up
+$blob13 = <<<ICS
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+DTSTART:20100101T220000Z
+DTEND:20100101T230000Z
+RRULE:FREQ=YEARLY
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+// Yearly recurrence rule + duration, shows up
+$blob14 = <<<ICS
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+DTSTART:20100101T230000Z
+DURATION:PT1H
+RRULE:FREQ=YEARLY
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+
+ return array(
+ $blob1,
+ $blob2,
+ $blob3,
+ $blob4,
+ $blob5,
+ $blob6,
+ $blob7,
+ $blob8,
+ $blob9,
+ $blob10,
+ Reader::read($blob11),
+ $blob12,
+ $blob13,
+ $blob14,
+ );
+
+ }
+
+ function testGenerator() {
+
+ $gen = new FreeBusyGenerator(
+ new \DateTime('20110101T110000Z', new \DateTimeZone('UTC')),
+ new \DateTime('20110103T110000Z', new \DateTimeZone('UTC')),
+ $this->getInput()
+ );
+
+ $result = $gen->getResult();
+
+ $expected = array(
+ '20110101T120000Z/20110101T130000Z',
+ '20110101T130000Z/20110101T140000Z',
+ '20110101T180000Z/20110101T190000Z',
+ '20110101T190000Z/20110101T200000Z',
+ '20110102T000000Z/20110103T000000Z',
+ '20110101T210000Z/20110101T220000Z',
+
+ '20110103T010000Z/20110103T020000Z',
+ '20110103T030000Z/20110103T040000Z',
+ '20110103T040000Z/20110103T050000Z',
+ '20110103T050000Z/20110103T060000Z',
+
+ '20110101T220000Z/20110101T230000Z',
+ '20110101T230000Z/20110102T000000Z',
+ );
+
+ foreach($result->VFREEBUSY->FREEBUSY as $fb) {
+
+ $this->assertContains((string)$fb, $expected);
+
+ $k = array_search((string)$fb, $expected);
+ unset($expected[$k]);
+
+ }
+ if (count($expected)>0) {
+ $this->fail('There were elements in the expected array that were not found in the output: ' . "\n" . print_r($expected,true) . "\n" . $result->serialize());
+
+ }
+
+ }
+
+ function testGeneratorBaseObject() {
+
+ $obj = new Component('VCALENDAR');
+ $obj->METHOD = 'PUBLISH';
+
+ $gen = new FreeBusyGenerator();
+ $gen->setObjects(array());
+ $gen->setBaseObject($obj);
+
+ $result = $gen->getResult();
+
+ $this->assertEquals('PUBLISH', $result->METHOD->value);
+
+ }
+
+ /**
+ * @expectedException InvalidArgumentException
+ */
+ function testInvalidArg() {
+
+ $gen = new FreeBusyGenerator(
+ new \DateTime('2012-01-01'),
+ new \DateTime('2012-12-31'),
+ new \StdClass()
+ );
+
+ }
+
+}
diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/Issue153Test.php b/vendor/sabre/vobject/tests/Sabre/VObject/Issue153Test.php
new file mode 100644
index 000000000..1cc14c161
--- /dev/null
+++ b/vendor/sabre/vobject/tests/Sabre/VObject/Issue153Test.php
@@ -0,0 +1,14 @@
+<?php
+
+namespace Sabre\VObject;
+
+class Issue153Test extends \PHPUnit_Framework_TestCase {
+
+ function testRead() {
+
+ $obj = Reader::read(file_get_contents(dirname(__FILE__) . '/issue153.vcf'));
+ $this->assertEquals('Test Benutzer', (string)$obj->fn);
+
+ }
+
+}
diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/Issue154Test.php b/vendor/sabre/vobject/tests/Sabre/VObject/Issue154Test.php
new file mode 100644
index 000000000..ed9c7c3f4
--- /dev/null
+++ b/vendor/sabre/vobject/tests/Sabre/VObject/Issue154Test.php
@@ -0,0 +1,29 @@
+<?php
+
+namespace Sabre\VObject;
+
+class Issue154Test extends \PHPUnit_Framework_TestCase {
+
+ function testStuff() {
+
+ $vcard = new Component('VCARD');
+ $vcard->VERSION = '3.0';
+ $vcard->PHOTO = base64_encode('random_stuff');
+ $vcard->PHOTO->add('BASE64',null);
+ $vcard->UID = 'foo-bar';
+
+ $result = $vcard->serialize();
+ $expected = array(
+ "BEGIN:VCARD",
+ "VERSION:3.0",
+ "PHOTO;BASE64:" . base64_encode('random_stuff'),
+ "UID:foo-bar",
+ "END:VCARD",
+ "",
+ );
+
+ $this->assertEquals(implode("\r\n", $expected), $result);
+
+ }
+
+}
diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/Issue48Test.php b/vendor/sabre/vobject/tests/Sabre/VObject/Issue48Test.php
new file mode 100644
index 000000000..980d432b9
--- /dev/null
+++ b/vendor/sabre/vobject/tests/Sabre/VObject/Issue48Test.php
@@ -0,0 +1,47 @@
+<?php
+
+namespace Sabre\VObject;
+
+use
+ DateTime,
+ DateTimeZone;
+
+class Issue48Test extends \PHPUnit_Framework_TestCase {
+
+ function testExpand() {
+
+ $input = <<<ICS
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+UID:foo
+DTEND;TZID=Europe/Moscow:20130710T120000
+DTSTART;TZID=Europe/Moscow:20130710T110000
+RRULE:FREQ=DAILY;UNTIL=20130712T195959Z
+END:VEVENT
+BEGIN:VEVENT
+UID:foo
+DTEND;TZID=Europe/Moscow:20130713T120000
+DTSTART;TZID=Europe/Moscow:20130713T110000
+RECURRENCE-ID;TZID=Europe/Moscow:20130711T110000
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+ $vcal = Reader::read($input);
+ $this->assertInstanceOf('Sabre\\VObject\\Component\\VCalendar', $vcal);
+
+ $it = new RecurrenceIterator($vcal, 'foo');
+
+ $result = iterator_to_array($it);
+
+ $tz = new DateTimeZone('Europe/Moscow');
+
+ $this->assertEquals(array(
+ new DateTime('2013-07-10 11:00:00', $tz),
+ new DateTime('2013-07-12 11:00:00', $tz),
+ new DateTime('2013-07-13 11:00:00', $tz),
+ ), $result);
+
+ }
+
+}
diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/Issue50Test.php b/vendor/sabre/vobject/tests/Sabre/VObject/Issue50Test.php
new file mode 100644
index 000000000..fdb012ba2
--- /dev/null
+++ b/vendor/sabre/vobject/tests/Sabre/VObject/Issue50Test.php
@@ -0,0 +1,128 @@
+<?php
+
+namespace Sabre\VObject;
+
+use
+ DateTime,
+ DateTimeZone;
+
+class Issue50Test extends \PHPUnit_Framework_TestCase {
+
+ function testExpand() {
+
+ $input = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN
+BEGIN:VTIMEZONE
+TZID:Europe/Brussels
+X-LIC-LOCATION:Europe/Brussels
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19700329T020000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=3
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19701025T030000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+CREATED:20130705T142510Z
+LAST-MODIFIED:20130715T132556Z
+DTSTAMP:20130715T132556Z
+UID:1aef0b27-3d92-4581-829a-11999dd36724
+SUMMARY:Werken
+RRULE:FREQ=DAILY;COUNT=5
+DTSTART;TZID=Europe/Brussels:20130715T090000
+DTEND;TZID=Europe/Brussels:20130715T170000
+LOCATION:Job
+DESCRIPTION:Vrij
+X-MOZ-GENERATION:9
+END:VEVENT
+BEGIN:VEVENT
+CREATED:20130715T081654Z
+LAST-MODIFIED:20130715T110931Z
+DTSTAMP:20130715T110931Z
+UID:1aef0b27-3d92-4581-829a-11999dd36724
+SUMMARY:Werken
+RECURRENCE-ID;TZID=Europe/Brussels:20130719T090000
+DTSTART;TZID=Europe/Brussels:20130719T070000
+DTEND;TZID=Europe/Brussels:20130719T150000
+SEQUENCE:1
+LOCATION:Job
+DESCRIPTION:Vrij
+X-MOZ-GENERATION:1
+END:VEVENT
+BEGIN:VEVENT
+CREATED:20130715T111654Z
+LAST-MODIFIED:20130715T132556Z
+DTSTAMP:20130715T132556Z
+UID:1aef0b27-3d92-4581-829a-11999dd36724
+SUMMARY:Werken
+RECURRENCE-ID;TZID=Europe/Brussels:20130716T090000
+DTSTART;TZID=Europe/Brussels:20130716T070000
+DTEND;TZID=Europe/Brussels:20130716T150000
+SEQUENCE:1
+LOCATION:Job
+X-MOZ-GENERATION:2
+END:VEVENT
+BEGIN:VEVENT
+CREATED:20130715T125942Z
+LAST-MODIFIED:20130715T130023Z
+DTSTAMP:20130715T130023Z
+UID:1aef0b27-3d92-4581-829a-11999dd36724
+SUMMARY:Werken
+RECURRENCE-ID;TZID=Europe/Brussels:20130717T090000
+DTSTART;TZID=Europe/Brussels:20130717T070000
+DTEND;TZID=Europe/Brussels:20130717T150000
+SEQUENCE:1
+LOCATION:Job
+X-MOZ-GENERATION:3
+END:VEVENT
+BEGIN:VEVENT
+CREATED:20130715T130024Z
+LAST-MODIFIED:20130715T130034Z
+DTSTAMP:20130715T130034Z
+UID:1aef0b27-3d92-4581-829a-11999dd36724
+SUMMARY:Werken
+RECURRENCE-ID;TZID=Europe/Brussels:20130718T090000
+DTSTART;TZID=Europe/Brussels:20130718T090000
+DTEND;TZID=Europe/Brussels:20130718T170000
+LOCATION:Job
+X-MOZ-GENERATION:5
+DESCRIPTION:Vrij
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+ $vcal = Reader::read($input);
+ $this->assertInstanceOf('Sabre\\VObject\\Component\\VCalendar', $vcal);
+
+ $it = new RecurrenceIterator($vcal, '1aef0b27-3d92-4581-829a-11999dd36724');
+
+ $result = array();
+ foreach($it as $instance) {
+
+ $result[] = $instance;
+
+ }
+
+ $tz = new DateTimeZone('Europe/Brussels');
+
+ $this->assertEquals(array(
+ new DateTime('2013-07-15 09:00:00', $tz),
+ new DateTime('2013-07-16 07:00:00', $tz),
+ new DateTime('2013-07-17 07:00:00', $tz),
+ new DateTime('2013-07-18 09:00:00', $tz),
+ new DateTime('2013-07-19 07:00:00', $tz),
+ ), $result);
+
+ }
+
+}
diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/ParameterTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/ParameterTest.php
new file mode 100644
index 000000000..90eb5d2aa
--- /dev/null
+++ b/vendor/sabre/vobject/tests/Sabre/VObject/ParameterTest.php
@@ -0,0 +1,44 @@
+<?php
+
+namespace Sabre\VObject;
+
+class ParameterTest extends \PHPUnit_Framework_TestCase {
+
+ function testSetup() {
+
+ $param = new Parameter('name','value');
+ $this->assertEquals('NAME',$param->name);
+ $this->assertEquals('value',$param->value);
+ $this->assertEquals('value',$param->getValue());
+
+ }
+
+ function testCastToString() {
+
+ $param = new Parameter('name','value');
+ $this->assertEquals('value',$param->__toString());
+ $this->assertEquals('value',(string)$param);
+
+ }
+
+ function testSerialize() {
+
+ $param = new Parameter('name','value');
+ $this->assertEquals('NAME=value',$param->serialize());
+
+ }
+
+ function testSerializeEmpty() {
+
+ $param = new Parameter('name',null);
+ $this->assertEquals('NAME',$param->serialize());
+
+ }
+
+ function testSerializeColon() {
+
+ $param = new Parameter('name','va:lue');
+ $this->assertEquals('NAME="va:lue"',$param->serialize());
+
+ }
+}
diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/Property/CompoundTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/Property/CompoundTest.php
new file mode 100644
index 000000000..5d8cdaabb
--- /dev/null
+++ b/vendor/sabre/vobject/tests/Sabre/VObject/Property/CompoundTest.php
@@ -0,0 +1,59 @@
+<?php
+
+namespace Sabre\VObject\Property;
+use Sabre\VObject\Component;
+
+class CompoundTest extends \PHPUnit_Framework_TestCase {
+
+ function testSetParts() {
+
+ $arr = array(
+ 'ABC, Inc.',
+ 'North American Division',
+ 'Marketing;Sales',
+ );
+
+ $elem = new Compound('ORG');
+ $elem->setParts($arr);
+
+ $this->assertEquals('ABC\, Inc.;North American Division;Marketing\;Sales', $elem->value);
+ $this->assertEquals(3, count($elem->getParts()));
+ $parts = $elem->getParts();
+ $this->assertEquals('Marketing;Sales', $parts[2]);
+
+ }
+
+ function testGetParts() {
+
+ $str = 'ABC\, Inc.;North American Division;Marketing\;Sales';
+
+ $elem = new Compound('ORG', $str);
+
+ $this->assertEquals(3, count($elem->getParts()));
+ $parts = $elem->getParts();
+ $this->assertEquals('Marketing;Sales', $parts[2]);
+ }
+
+ function testGetPartsDefaultDelimiter() {
+
+ $str = 'Hi!;Hello!';
+
+ $elem = new Compound('X-FOO', $str);
+
+ $this->assertEquals(array(
+ 'Hi!',
+ 'Hello!',
+ ), $elem->getParts());
+
+ }
+
+ function testGetPartsNull() {
+
+ $str = 'ABC\, Inc.;North American Division;Marketing\;Sales';
+
+ $elem = new Compound('ORG', null);
+
+ $this->assertEquals(0, count($elem->getParts()));
+
+ }
+}
diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/Property/DateTimeTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/Property/DateTimeTest.php
new file mode 100644
index 000000000..b5b522e7d
--- /dev/null
+++ b/vendor/sabre/vobject/tests/Sabre/VObject/Property/DateTimeTest.php
@@ -0,0 +1,240 @@
+<?php
+
+namespace Sabre\VObject\Property;
+use Sabre\VObject\Component;
+
+class DateTimeTest extends \PHPUnit_Framework_TestCase {
+
+ function testSetDateTime() {
+
+ $tz = new \DateTimeZone('Europe/Amsterdam');
+ $dt = new \DateTime('1985-07-04 01:30:00', $tz);
+ $dt->setTimeZone($tz);
+
+ $elem = new DateTime('DTSTART');
+ $elem->setDateTime($dt);
+
+ $this->assertEquals('19850704T013000', $elem->value);
+ $this->assertEquals('Europe/Amsterdam', (string)$elem['TZID']);
+ $this->assertEquals('DATE-TIME', (string)$elem['VALUE']);
+
+ $this->assertTrue($elem->hasTime());
+
+ }
+
+ function testSetDateTimeLOCAL() {
+
+ $tz = new \DateTimeZone('Europe/Amsterdam');
+ $dt = new \DateTime('1985-07-04 01:30:00', $tz);
+ $dt->setTimeZone($tz);
+
+ $elem = new DateTime('DTSTART');
+ $elem->setDateTime($dt, DateTime::LOCAL);
+
+ $this->assertEquals('19850704T013000', $elem->value);
+ $this->assertNull($elem['TZID']);
+ $this->assertEquals('DATE-TIME', (string)$elem['VALUE']);
+
+ $this->assertTrue($elem->hasTime());
+ }
+
+ function testSetDateTimeUTC() {
+
+ $tz = new \DateTimeZone('GMT');
+ $dt = new \DateTime('1985-07-04 01:30:00', $tz);
+ $dt->setTimeZone($tz);
+
+ $elem = new DateTime('DTSTART');
+ $elem->setDateTime($dt, DateTime::UTC);
+
+ $this->assertEquals('19850704T013000Z', $elem->value);
+ $this->assertNull($elem['TZID']);
+ $this->assertEquals('DATE-TIME', (string)$elem['VALUE']);
+
+ $this->assertTrue($elem->hasTime());
+ }
+
+ function testSetDateTimeLOCALTZ() {
+
+ $tz = new \DateTimeZone('Europe/Amsterdam');
+ $dt = new \DateTime('1985-07-04 01:30:00', $tz);
+ $dt->setTimeZone($tz);
+
+ $elem = new DateTime('DTSTART');
+ $elem->setDateTime($dt, DateTime::LOCALTZ);
+
+ $this->assertEquals('19850704T013000', $elem->value);
+ $this->assertEquals('Europe/Amsterdam', (string)$elem['TZID']);
+ $this->assertEquals('DATE-TIME', (string)$elem['VALUE']);
+
+ $this->assertTrue($elem->hasTime());
+ }
+
+ function testSetDateTimeDATE() {
+
+ $tz = new \DateTimeZone('Europe/Amsterdam');
+ $dt = new \DateTime('1985-07-04 01:30:00', $tz);
+ $dt->setTimeZone($tz);
+
+ $elem = new DateTime('DTSTART');
+ $elem->setDateTime($dt, DateTime::DATE);
+
+ $this->assertEquals('19850704', $elem->value);
+ $this->assertNull($elem['TZID']);
+ $this->assertEquals('DATE', (string)$elem['VALUE']);
+
+ $this->assertFalse($elem->hasTime());
+ }
+
+ /**
+ * @expectedException InvalidArgumentException
+ */
+ function testSetDateTimeInvalid() {
+
+ $tz = new \DateTimeZone('Europe/Amsterdam');
+ $dt = new \DateTime('1985-07-04 01:30:00', $tz);
+ $dt->setTimeZone($tz);
+
+ $elem = new DateTime('DTSTART');
+ $elem->setDateTime($dt, 7);
+
+ }
+
+ function testGetDateTimeCached() {
+
+ $tz = new \DateTimeZone('Europe/Amsterdam');
+ $dt = new \DateTime('1985-07-04 01:30:00', $tz);
+ $dt->setTimeZone($tz);
+
+ $elem = new DateTime('DTSTART');
+ $elem->setDateTime($dt);
+
+ $this->assertEquals($elem->getDateTime(), $dt);
+
+ }
+
+ function testGetDateTimeDateNULL() {
+
+ $elem = new DateTime('DTSTART');
+ $dt = $elem->getDateTime();
+
+ $this->assertNull($dt);
+ $this->assertNull($elem->getDateType());
+
+ }
+
+ function testGetDateTimeDateDATE() {
+
+ $elem = new DateTime('DTSTART','19850704');
+ $dt = $elem->getDateTime();
+
+ $this->assertInstanceOf('DateTime', $dt);
+ $this->assertEquals('1985-07-04 00:00:00', $dt->format('Y-m-d H:i:s'));
+ $this->assertEquals(DateTime::DATE, $elem->getDateType());
+
+ }
+
+
+ function testGetDateTimeDateLOCAL() {
+
+ $elem = new DateTime('DTSTART','19850704T013000');
+ $dt = $elem->getDateTime();
+
+ $this->assertInstanceOf('DateTime', $dt);
+ $this->assertEquals('1985-07-04 01:30:00', $dt->format('Y-m-d H:i:s'));
+ $this->assertEquals(DateTime::LOCAL, $elem->getDateType());
+
+ }
+
+ function testGetDateTimeDateUTC() {
+
+ $elem = new DateTime('DTSTART','19850704T013000Z');
+ $dt = $elem->getDateTime();
+
+ $this->assertInstanceOf('DateTime', $dt);
+ $this->assertEquals('1985-07-04 01:30:00', $dt->format('Y-m-d H:i:s'));
+ $this->assertEquals('UTC', $dt->getTimeZone()->getName());
+ $this->assertEquals(DateTime::UTC, $elem->getDateType());
+
+ }
+
+ function testGetDateTimeDateLOCALTZ() {
+
+ $elem = new DateTime('DTSTART','19850704T013000');
+ $elem['TZID'] = 'Europe/Amsterdam';
+
+ $dt = $elem->getDateTime();
+
+ $this->assertInstanceOf('DateTime', $dt);
+ $this->assertEquals('1985-07-04 01:30:00', $dt->format('Y-m-d H:i:s'));
+ $this->assertEquals('Europe/Amsterdam', $dt->getTimeZone()->getName());
+ $this->assertEquals(DateTime::LOCALTZ, $elem->getDateType());
+
+ }
+
+ /**
+ * @expectedException InvalidArgumentException
+ */
+ function testGetDateTimeDateInvalid() {
+
+ $elem = new DateTime('DTSTART','bla');
+ $dt = $elem->getDateTime();
+
+ }
+
+ function testGetDateTimeWeirdTZ() {
+
+ $elem = new DateTime('DTSTART','19850704T013000');
+ $elem['TZID'] = '/freeassociation.sourceforge.net/Tzfile/Europe/Amsterdam';
+
+
+ $event = new Component('VEVENT');
+ $event->add($elem);
+
+ $timezone = new Component('VTIMEZONE');
+ $timezone->TZID = '/freeassociation.sourceforge.net/Tzfile/Europe/Amsterdam';
+ $timezone->{'X-LIC-LOCATION'} = 'Europe/Amsterdam';
+
+ $calendar = new Component('VCALENDAR');
+ $calendar->add($event);
+ $calendar->add($timezone);
+
+ $dt = $elem->getDateTime();
+
+ $this->assertInstanceOf('DateTime', $dt);
+ $this->assertEquals('1985-07-04 01:30:00', $dt->format('Y-m-d H:i:s'));
+ $this->assertEquals('Europe/Amsterdam', $dt->getTimeZone()->getName());
+ $this->assertEquals(DateTime::LOCALTZ, $elem->getDateType());
+
+ }
+
+ function testGetDateTimeBadTimeZone() {
+
+ $default = date_default_timezone_get();
+ date_default_timezone_set('Canada/Eastern');
+
+ $elem = new DateTime('DTSTART','19850704T013000');
+ $elem['TZID'] = 'Moon';
+
+
+ $event = new Component('VEVENT');
+ $event->add($elem);
+
+ $timezone = new Component('VTIMEZONE');
+ $timezone->TZID = 'Moon';
+ $timezone->{'X-LIC-LOCATION'} = 'Moon';
+
+ $calendar = new Component('VCALENDAR');
+ $calendar->add($event);
+ $calendar->add($timezone);
+
+ $dt = $elem->getDateTime();
+
+ $this->assertInstanceOf('DateTime', $dt);
+ $this->assertEquals('1985-07-04 01:30:00', $dt->format('Y-m-d H:i:s'));
+ $this->assertEquals('Canada/Eastern', $dt->getTimeZone()->getName());
+ $this->assertEquals(DateTime::LOCALTZ, $elem->getDateType());
+ date_default_timezone_set($default);
+
+ }
+}
diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/Property/MultiDateTimeTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/Property/MultiDateTimeTest.php
new file mode 100644
index 000000000..177616652
--- /dev/null
+++ b/vendor/sabre/vobject/tests/Sabre/VObject/Property/MultiDateTimeTest.php
@@ -0,0 +1,208 @@
+<?php
+
+namespace Sabre\VObject\Property;
+
+class MultiDateTimeTest extends \PHPUnit_Framework_TestCase {
+
+ function testSetDateTime() {
+
+ $tz = new \DateTimeZone('Europe/Amsterdam');
+ $dt1 = new \DateTime('1985-07-04 01:30:00', $tz);
+ $dt2 = new \DateTime('1986-07-04 01:30:00', $tz);
+ $dt1->setTimeZone($tz);
+ $dt2->setTimeZone($tz);
+
+ $elem = new MultiDateTime('DTSTART');
+ $elem->setDateTimes(array($dt1,$dt2));
+
+ $this->assertEquals('19850704T013000,19860704T013000', $elem->value);
+ $this->assertEquals('Europe/Amsterdam', (string)$elem['TZID']);
+ $this->assertEquals('DATE-TIME', (string)$elem['VALUE']);
+
+ $this->assertTrue($elem->hasTime());
+
+ }
+
+ function testSetDateTimeLOCAL() {
+
+ $tz = new \DateTimeZone('Europe/Amsterdam');
+ $dt1 = new \DateTime('1985-07-04 01:30:00', $tz);
+ $dt2 = new \DateTime('1986-07-04 01:30:00', $tz);
+ $dt1->setTimeZone($tz);
+ $dt2->setTimeZone($tz);
+
+ $elem = new MultiDateTime('DTSTART');
+ $elem->setDateTimes(array($dt1,$dt2), DateTime::LOCAL);
+
+ $this->assertEquals('19850704T013000,19860704T013000', $elem->value);
+ $this->assertNull($elem['TZID']);
+ $this->assertEquals('DATE-TIME', (string)$elem['VALUE']);
+
+ $this->assertTrue($elem->hasTime());
+ }
+
+ function testSetDateTimeUTC() {
+
+ $tz = new \DateTimeZone('GMT');
+ $dt1 = new \DateTime('1985-07-04 01:30:00', $tz);
+ $dt2 = new \DateTime('1986-07-04 01:30:00', $tz);
+ $dt1->setTimeZone($tz);
+ $dt2->setTimeZone($tz);
+
+ $elem = new MultiDateTime('DTSTART');
+ $elem->setDateTimes(array($dt1,$dt2), DateTime::UTC);
+
+ $this->assertEquals('19850704T013000Z,19860704T013000Z', $elem->value);
+ $this->assertNull($elem['TZID']);
+ $this->assertEquals('DATE-TIME', (string)$elem['VALUE']);
+
+ $this->assertTrue($elem->hasTime());
+ }
+
+ function testSetDateTimeLOCALTZ() {
+
+ $tz = new \DateTimeZone('Europe/Amsterdam');
+ $dt1 = new \DateTime('1985-07-04 01:30:00', $tz);
+ $dt2 = new \DateTime('1986-07-04 01:30:00', $tz);
+ $dt1->setTimeZone($tz);
+ $dt2->setTimeZone($tz);
+
+ $elem = new MultiDateTime('DTSTART');
+ $elem->setDateTimes(array($dt1,$dt2), DateTime::LOCALTZ);
+
+ $this->assertEquals('19850704T013000,19860704T013000', $elem->value);
+ $this->assertEquals('Europe/Amsterdam', (string)$elem['TZID']);
+ $this->assertEquals('DATE-TIME', (string)$elem['VALUE']);
+
+ $this->assertTrue($elem->hasTime());
+ }
+
+ function testSetDateTimeDATE() {
+
+ $tz = new \DateTimeZone('Europe/Amsterdam');
+ $dt1 = new \DateTime('1985-07-04 01:30:00', $tz);
+ $dt2 = new \DateTime('1986-07-04 01:30:00', $tz);
+ $dt1->settimezone($tz);
+ $dt2->settimezone($tz);
+
+ $elem = new MultiDateTime('DTSTART');
+ $elem->setDateTimes(array($dt1,$dt2), DateTime::DATE);
+
+ $this->assertEquals('19850704,19860704', $elem->value);
+ $this->assertNull($elem['TZID']);
+ $this->assertEquals('DATE', (string)$elem['VALUE']);
+
+ $this->assertFalse($elem->hasTime());
+ }
+
+ /**
+ * @expectedException InvalidArgumentException
+ */
+ function testSetDateTimeInvalid() {
+
+ $tz = new \DateTimeZone('Europe/Amsterdam');
+ $dt = new \DateTime('1985-07-04 01:30:00', $tz);
+ $dt->setTimeZone($tz);
+
+ $elem = new MultiDateTime('DTSTART');
+ $elem->setDateTimes(array($dt), 7);
+
+ }
+
+ function testGetDateTimeCached() {
+
+ $tz = new \DateTimeZone('Europe/Amsterdam');
+ $dt1 = new \DateTime('1985-07-04 01:30:00', $tz);
+ $dt2 = new \DateTime('1986-07-04 01:30:00', $tz);
+ $dt1->settimezone($tz);
+ $dt2->settimezone($tz);
+
+ $elem = new MultiDateTime('DTSTART');
+ $elem->setDateTimes(array($dt1,$dt2));
+
+ $this->assertEquals($elem->getDateTimes(), array($dt1,$dt2));
+
+ }
+
+ function testGetDateTimeDateNULL() {
+
+ $elem = new MultiDateTime('DTSTART');
+ $dt = $elem->getDateTimes();
+
+ $this->assertNull($dt);
+ $this->assertNull($elem->getDateType());
+
+ }
+
+ function testGetDateTimeDateDATE() {
+
+ $elem = new MultiDateTime('DTSTART','19850704,19860704');
+ $dt = $elem->getDateTimes();
+
+ $this->assertEquals('1985-07-04 00:00:00', $dt[0]->format('Y-m-d H:i:s'));
+ $this->assertEquals('1986-07-04 00:00:00', $dt[1]->format('Y-m-d H:i:s'));
+ $this->assertEquals(DateTime::DATE, $elem->getDateType());
+
+ }
+
+ function testGetDateTimeDateDATEReverse() {
+
+ $elem = new MultiDateTime('DTSTART','19850704,19860704');
+
+ $this->assertEquals(DateTime::DATE, $elem->getDateType());
+
+ $dt = $elem->getDateTimes();
+ $this->assertEquals('1985-07-04 00:00:00', $dt[0]->format('Y-m-d H:i:s'));
+ $this->assertEquals('1986-07-04 00:00:00', $dt[1]->format('Y-m-d H:i:s'));
+
+ }
+
+
+ function testGetDateTimeDateLOCAL() {
+
+ $elem = new DateTime('DTSTART','19850704T013000');
+ $dt = $elem->getDateTime();
+
+ $this->assertInstanceOf('DateTime', $dt);
+ $this->assertEquals('1985-07-04 01:30:00', $dt->format('Y-m-d H:i:s'));
+ $this->assertEquals(DateTime::LOCAL, $elem->getDateType());
+
+ }
+
+ function testGetDateTimeDateUTC() {
+
+ $elem = new DateTime('DTSTART','19850704T013000Z');
+ $dt = $elem->getDateTime();
+
+ $this->assertInstanceOf('DateTime', $dt);
+ $this->assertEquals('1985-07-04 01:30:00', $dt->format('Y-m-d H:i:s'));
+ $this->assertEquals('UTC', $dt->getTimeZone()->getName());
+ $this->assertEquals(DateTime::UTC, $elem->getDateType());
+
+ }
+
+ function testGetDateTimeDateLOCALTZ() {
+
+ $elem = new DateTime('DTSTART','19850704T013000');
+ $elem['TZID'] = 'Europe/Amsterdam';
+
+ $dt = $elem->getDateTime();
+
+ $this->assertInstanceOf('DateTime', $dt);
+ $this->assertEquals('1985-07-04 01:30:00', $dt->format('Y-m-d H:i:s'));
+ $this->assertEquals('Europe/Amsterdam', $dt->getTimeZone()->getName());
+ $this->assertEquals(DateTime::LOCALTZ, $elem->getDateType());
+
+ }
+
+ /**
+ * @expectedException InvalidArgumentException
+ */
+ function testGetDateTimeDateInvalid() {
+
+ $elem = new DateTime('DTSTART','bla');
+ $dt = $elem->getDateTime();
+
+ }
+
+}
diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/PropertyTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/PropertyTest.php
new file mode 100644
index 000000000..3bb289567
--- /dev/null
+++ b/vendor/sabre/vobject/tests/Sabre/VObject/PropertyTest.php
@@ -0,0 +1,324 @@
+<?php
+
+namespace Sabre\VObject;
+
+class PropertyTest extends \PHPUnit_Framework_TestCase {
+
+ public function testToString() {
+
+ $property = new Property('propname','propvalue');
+ $this->assertEquals('PROPNAME', $property->name);
+ $this->assertEquals('propvalue', $property->value);
+ $this->assertEquals('propvalue', $property->__toString());
+ $this->assertEquals('propvalue', (string)$property);
+ $this->assertEquals('propvalue', $property->getValue());
+
+ }
+
+ /**
+ * @expectedException InvalidArgumentException
+ */
+ public function testCreateNonScalar() {
+
+ $property = new Property('propname',array());
+
+ }
+
+ public function testParameterExists() {
+
+ $property = new Property('propname','propvalue');
+ $property->parameters[] = new Parameter('paramname','paramvalue');
+
+ $this->assertTrue(isset($property['PARAMNAME']));
+ $this->assertTrue(isset($property['paramname']));
+ $this->assertFalse(isset($property['foo']));
+
+ }
+
+ public function testParameterGet() {
+
+ $property = new Property('propname','propvalue');
+ $property->parameters[] = new Parameter('paramname','paramvalue');
+
+ $this->assertInstanceOf('Sabre\\VObject\\Parameter',$property['paramname']);
+
+ }
+
+ public function testParameterNotExists() {
+
+ $property = new Property('propname','propvalue');
+ $property->parameters[] = new Parameter('paramname','paramvalue');
+
+ $this->assertInternalType('null',$property['foo']);
+
+ }
+
+ public function testParameterMultiple() {
+
+ $property = new Property('propname','propvalue');
+ $property->parameters[] = new Parameter('paramname','paramvalue');
+ $property->parameters[] = new Parameter('paramname','paramvalue');
+
+ $this->assertInstanceOf('Sabre\\VObject\\Parameter',$property['paramname']);
+ $this->assertEquals(2,count($property['paramname']));
+
+ }
+
+ public function testSetParameterAsString() {
+
+ $property = new Property('propname','propvalue');
+ $property['paramname'] = 'paramvalue';
+
+ $this->assertEquals(1,count($property->parameters));
+ $this->assertInstanceOf('Sabre\\VObject\\Parameter', $property->parameters[0]);
+ $this->assertEquals('PARAMNAME',$property->parameters[0]->name);
+ $this->assertEquals('paramvalue',$property->parameters[0]->value);
+
+ }
+
+ /**
+ * @expectedException InvalidArgumentException
+ */
+ public function testSetParameterAsStringNoKey() {
+
+ $property = new Property('propname','propvalue');
+ $property[] = 'paramvalue';
+
+ }
+
+ public function testSetParameterObject() {
+
+ $property = new Property('propname','propvalue');
+ $param = new Parameter('paramname','paramvalue');
+
+ $property[] = $param;
+
+ $this->assertEquals(1,count($property->parameters));
+ $this->assertEquals($param, $property->parameters[0]);
+
+ }
+
+ /**
+ * @expectedException InvalidArgumentException
+ */
+ public function testSetParameterObjectWithKey() {
+
+ $property = new Property('propname','propvalue');
+ $param = new Parameter('paramname','paramvalue');
+
+ $property['key'] = $param;
+
+ }
+
+
+ /**
+ * @expectedException InvalidArgumentException
+ */
+ public function testSetParameterObjectRandomObject() {
+
+ $property = new Property('propname','propvalue');
+ $property[] = new \StdClass();
+
+ }
+
+ public function testUnsetParameter() {
+
+ $property = new Property('propname','propvalue');
+ $param = new Parameter('paramname','paramvalue');
+ $property->parameters[] = $param;
+
+ unset($property['PARAMNAME']);
+ $this->assertEquals(0,count($property->parameters));
+
+ }
+
+ public function testParamCount() {
+
+ $property = new Property('propname','propvalue');
+ $param = new Parameter('paramname','paramvalue');
+ $property->parameters[] = $param;
+ $property->parameters[] = clone $param;
+
+ $this->assertEquals(2,count($property->parameters));
+
+ }
+
+ public function testSerialize() {
+
+ $property = new Property('propname','propvalue');
+
+ $this->assertEquals("PROPNAME:propvalue\r\n",$property->serialize());
+
+ }
+
+ public function testSerializeParam() {
+
+ $property = new Property('propname','propvalue');
+ $property->parameters[] = new Parameter('paramname','paramvalue');
+ $property->parameters[] = new Parameter('paramname2','paramvalue2');
+
+ $this->assertEquals("PROPNAME;PARAMNAME=paramvalue;PARAMNAME2=paramvalue2:propvalue\r\n",$property->serialize());
+
+ }
+
+ public function testSerializeNewLine() {
+
+ $property = new Property('propname',"line1\nline2");
+
+ $this->assertEquals("PROPNAME:line1\\nline2\r\n",$property->serialize());
+
+ }
+
+ public function testSerializeLongLine() {
+
+ $value = str_repeat('!',200);
+ $property = new Property('propname',$value);
+
+ $expected = "PROPNAME:" . str_repeat('!',66) . "\r\n " . str_repeat('!',74) . "\r\n " . str_repeat('!',60) . "\r\n";
+
+ $this->assertEquals($expected,$property->serialize());
+
+ }
+
+ public function testSerializeUTF8LineFold() {
+
+ $value = str_repeat('!',65) . "\xc3\xa4bla"; // inserted umlaut-a
+ $property = new Property('propname', $value);
+ $expected = "PROPNAME:" . str_repeat('!',65) . "\r\n \xc3\xa4bla\r\n";
+ $this->assertEquals($expected, $property->serialize());
+
+ }
+
+ public function testGetIterator() {
+
+ $it = new ElementList(array());
+ $property = new Property('propname','propvalue');
+ $property->setIterator($it);
+ $this->assertEquals($it,$property->getIterator());
+
+ }
+
+
+ public function testGetIteratorDefault() {
+
+ $property = new Property('propname','propvalue');
+ $it = $property->getIterator();
+ $this->assertTrue($it instanceof ElementList);
+ $this->assertEquals(1,count($it));
+
+ }
+
+ function testAddScalar() {
+
+ $property = new Property('EMAIL');
+
+ $property->add('myparam','value');
+
+ $this->assertEquals(1, count($property->parameters));
+
+ $this->assertTrue($property->parameters[0] instanceof Parameter);
+ $this->assertEquals('MYPARAM',$property->parameters[0]->name);
+ $this->assertEquals('value',$property->parameters[0]->value);
+
+ }
+
+ function testAddParameter() {
+
+ $prop = new Property('EMAIL');
+
+ $prop->add(new Parameter('MYPARAM','value'));
+
+ $this->assertEquals(1, count($prop->parameters));
+ $this->assertEquals('MYPARAM',$prop['myparam']->name);
+
+ }
+
+ function testAddParameterTwice() {
+
+ $prop = new Property('EMAIL');
+
+ $prop->add(new Parameter('MYPARAM', 'value1'));
+ $prop->add(new Parameter('MYPARAM', 'value2'));
+
+ $this->assertEquals(2, count($prop->parameters));
+
+ $this->assertEquals('MYPARAM',$prop['MYPARAM']->name);
+
+ }
+
+ /**
+ * @expectedException InvalidArgumentException
+ */
+ function testAddArgFail() {
+
+ $prop = new Property('EMAIL');
+ $prop->add(new Parameter('MPARAM'),'hello');
+
+ }
+
+ /**
+ * @expectedException InvalidArgumentException
+ */
+ function testAddArgFail2() {
+
+ $property = new Property('EMAIL','value');
+ $property->add(array());
+
+ }
+
+ /**
+ * @expectedException InvalidArgumentException
+ */
+ function testAddArgFail3() {
+
+ $property = new Property('EMAIL','value');
+ $property->add('hello',array());
+
+ }
+
+ function testClone() {
+
+ $property = new Property('EMAIL','value');
+ $property['FOO'] = 'BAR';
+
+ $property2 = clone $property;
+
+ $property['FOO'] = 'BAZ';
+ $this->assertEquals('BAR', (string)$property2['FOO']);
+
+ }
+
+ function testCreateParams() {
+
+ $property = Property::create('X-PROP', 'value', array(
+ 'param1' => 'value1',
+ 'param2' => array('value2', 'value3')
+ ));
+
+ $this->assertEquals(1, count($property['PARAM1']));
+ $this->assertEquals(2, count($property['PARAM2']));
+
+ }
+
+ function testValidateNonUTF8() {
+
+ $property = Property::create('X-PROP', "Bla\x00");
+ $result = $property->validate(Property::REPAIR);
+
+ $this->assertEquals('Property is not valid UTF-8!', $result[0]['message']);
+ $this->assertEquals('Bla', $property->value);
+
+ }
+
+
+ function testValidateBadPropertyName() {
+
+ $property = Property::create("X_*&PROP*", "Bla");
+ $result = $property->validate(Property::REPAIR);
+
+ $this->assertEquals($result[0]['message'], 'The propertyname: X_*&PROP* contains invalid characters. Only A-Z, 0-9 and - are allowed');
+ $this->assertEquals('X-PROP', $property->name);
+
+ }
+
+}
diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/ReaderTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/ReaderTest.php
new file mode 100644
index 000000000..0969c6e52
--- /dev/null
+++ b/vendor/sabre/vobject/tests/Sabre/VObject/ReaderTest.php
@@ -0,0 +1,367 @@
+<?php
+
+namespace Sabre\VObject;
+
+class ReaderTest extends \PHPUnit_Framework_TestCase {
+
+ function testReadComponent() {
+
+ $data = "BEGIN:VCALENDAR\r\nEND:VCALENDAR";
+
+ $result = Reader::read($data);
+
+ $this->assertInstanceOf('Sabre\\VObject\\Component', $result);
+ $this->assertEquals('VCALENDAR', $result->name);
+ $this->assertEquals(0, count($result->children));
+
+ }
+
+ function testReadComponentUnixNewLine() {
+
+ $data = "BEGIN:VCALENDAR\nEND:VCALENDAR";
+
+ $result = Reader::read($data);
+
+ $this->assertInstanceOf('Sabre\\VObject\\Component', $result);
+ $this->assertEquals('VCALENDAR', $result->name);
+ $this->assertEquals(0, count($result->children));
+
+ }
+
+ function testReadComponentMacNewLine() {
+
+ $data = "BEGIN:VCALENDAR\rEND:VCALENDAR";
+
+ $result = Reader::read($data);
+
+ $this->assertInstanceOf('Sabre\\VObject\\Component', $result);
+ $this->assertEquals('VCALENDAR', $result->name);
+ $this->assertEquals(0, count($result->children));
+
+ }
+
+ function testReadComponentLineFold() {
+
+ $data = "BEGIN:\r\n\tVCALENDAR\r\nE\r\n ND:VCALENDAR";
+
+ $result = Reader::read($data);
+
+ $this->assertInstanceOf('Sabre\\VObject\\Component', $result);
+ $this->assertEquals('VCALENDAR', $result->name);
+ $this->assertEquals(0, count($result->children));
+
+ }
+
+ /**
+ * @expectedException Sabre\VObject\ParseException
+ */
+ function testReadCorruptComponent() {
+
+ $data = "BEGIN:VCALENDAR\r\nEND:FOO";
+
+ $result = Reader::read($data);
+
+ }
+
+ function testReadProperty() {
+
+ $data = "PROPNAME:propValue";
+ $result = Reader::read($data);
+
+ $this->assertInstanceOf('Sabre\\VObject\\Property', $result);
+ $this->assertEquals('PROPNAME', $result->name);
+ $this->assertEquals('propValue', $result->value);
+
+ }
+
+ function testReadPropertyWithNewLine() {
+
+ $data = 'PROPNAME:Line1\\nLine2\\NLine3\\\\Not the 4th line!';
+ $result = Reader::read($data);
+
+ $this->assertInstanceOf('Sabre\\VObject\\Property', $result);
+ $this->assertEquals('PROPNAME', $result->name);
+ $this->assertEquals("Line1\nLine2\nLine3\\Not the 4th line!", $result->value);
+
+ }
+
+ function testReadMappedProperty() {
+
+ $data = "DTSTART:20110529";
+ $result = Reader::read($data);
+
+ $this->assertInstanceOf('Sabre\\VObject\\Property\\DateTime', $result);
+ $this->assertEquals('DTSTART', $result->name);
+ $this->assertEquals('20110529', $result->value);
+
+ }
+
+ function testReadMappedPropertyGrouped() {
+
+ $data = "foo.DTSTART:20110529";
+ $result = Reader::read($data);
+
+ $this->assertInstanceOf('Sabre\\VObject\\Property\\DateTime', $result);
+ $this->assertEquals('DTSTART', $result->name);
+ $this->assertEquals('20110529', $result->value);
+
+ }
+
+
+ /**
+ * @expectedException Sabre\VObject\ParseException
+ */
+ function testReadBrokenLine() {
+
+ $data = "PROPNAME;propValue";
+ $result = Reader::read($data);
+
+ }
+
+ function testReadPropertyInComponent() {
+
+ $data = array(
+ "BEGIN:VCALENDAR",
+ "PROPNAME:propValue",
+ "END:VCALENDAR"
+ );
+
+ $result = Reader::read(implode("\r\n",$data));
+
+ $this->assertInstanceOf('Sabre\\VObject\\Component', $result);
+ $this->assertEquals('VCALENDAR', $result->name);
+ $this->assertEquals(1, count($result->children));
+ $this->assertInstanceOf('Sabre\\VObject\\Property', $result->children[0]);
+ $this->assertEquals('PROPNAME', $result->children[0]->name);
+ $this->assertEquals('propValue', $result->children[0]->value);
+
+ }
+ function testReadNestedComponent() {
+
+ $data = array(
+ "BEGIN:VCALENDAR",
+ "BEGIN:VTIMEZONE",
+ "BEGIN:DAYLIGHT",
+ "END:DAYLIGHT",
+ "END:VTIMEZONE",
+ "END:VCALENDAR"
+ );
+
+ $result = Reader::read(implode("\r\n",$data));
+
+ $this->assertInstanceOf('Sabre\\VObject\\Component', $result);
+ $this->assertEquals('VCALENDAR', $result->name);
+ $this->assertEquals(1, count($result->children));
+ $this->assertInstanceOf('Sabre\\VObject\\Component', $result->children[0]);
+ $this->assertEquals('VTIMEZONE', $result->children[0]->name);
+ $this->assertEquals(1, count($result->children[0]->children));
+ $this->assertInstanceOf('Sabre\\VObject\\Component', $result->children[0]->children[0]);
+ $this->assertEquals('DAYLIGHT', $result->children[0]->children[0]->name);
+
+
+ }
+
+ function testReadPropertyParameter() {
+
+ $data = "PROPNAME;PARAMNAME=paramvalue:propValue";
+ $result = Reader::read($data);
+
+ $this->assertInstanceOf('Sabre\\VObject\\Property', $result);
+ $this->assertEquals('PROPNAME', $result->name);
+ $this->assertEquals('propValue', $result->value);
+ $this->assertEquals(1, count($result->parameters));
+ $this->assertEquals('PARAMNAME', $result->parameters[0]->name);
+ $this->assertEquals('paramvalue', $result->parameters[0]->value);
+
+ }
+
+ function testReadPropertyNoValue() {
+
+ $data = "PROPNAME;PARAMNAME:propValue";
+ $result = Reader::read($data);
+
+ $this->assertInstanceOf('Sabre\\VObject\\Property', $result);
+ $this->assertEquals('PROPNAME', $result->name);
+ $this->assertEquals('propValue', $result->value);
+ $this->assertEquals(1, count($result->parameters));
+ $this->assertEquals('PARAMNAME', $result->parameters[0]->name);
+
+ $this->assertNull($result->parameters[0]->value);
+
+ }
+
+ function testReadPropertyParameterExtraColon() {
+
+ $data = "PROPNAME;PARAMNAME=paramvalue:propValue:anotherrandomstring";
+ $result = Reader::read($data);
+
+ $this->assertInstanceOf('Sabre\\VObject\\Property', $result);
+ $this->assertEquals('PROPNAME', $result->name);
+ $this->assertEquals('propValue:anotherrandomstring', $result->value);
+ $this->assertEquals(1, count($result->parameters));
+ $this->assertEquals('PARAMNAME', $result->parameters[0]->name);
+ $this->assertEquals('paramvalue', $result->parameters[0]->value);
+
+ }
+
+ function testReadProperty2Parameters() {
+
+ $data = "PROPNAME;PARAMNAME=paramvalue;PARAMNAME2=paramvalue2:propValue";
+ $result = Reader::read($data);
+
+ $this->assertInstanceOf('Sabre\\VObject\\Property', $result);
+ $this->assertEquals('PROPNAME', $result->name);
+ $this->assertEquals('propValue', $result->value);
+ $this->assertEquals(2, count($result->parameters));
+ $this->assertEquals('PARAMNAME', $result->parameters[0]->name);
+ $this->assertEquals('paramvalue', $result->parameters[0]->value);
+ $this->assertEquals('PARAMNAME2', $result->parameters[1]->name);
+ $this->assertEquals('paramvalue2', $result->parameters[1]->value);
+
+ }
+
+ function testReadPropertyParameterQuoted() {
+
+ $data = "PROPNAME;PARAMNAME=\"paramvalue\":propValue";
+ $result = Reader::read($data);
+
+ $this->assertInstanceOf('Sabre\\VObject\\Property', $result);
+ $this->assertEquals('PROPNAME', $result->name);
+ $this->assertEquals('propValue', $result->value);
+ $this->assertEquals(1, count($result->parameters));
+ $this->assertEquals('PARAMNAME', $result->parameters[0]->name);
+ $this->assertEquals('paramvalue', $result->parameters[0]->value);
+
+ }
+ function testReadPropertyParameterNewLines() {
+
+ $data = "PROPNAME;PARAMNAME=paramvalue1\\nvalue2\\\\nvalue3:propValue";
+ $result = Reader::read($data);
+
+ $this->assertInstanceOf('Sabre\\VObject\\Property', $result);
+ $this->assertEquals('PROPNAME', $result->name);
+ $this->assertEquals('propValue', $result->value);
+
+ $this->assertEquals(1, count($result->parameters));
+ $this->assertEquals('PARAMNAME', $result->parameters[0]->name);
+ $this->assertEquals("paramvalue1\nvalue2\\nvalue3", $result->parameters[0]->value);
+
+ }
+
+ function testReadPropertyParameterQuotedColon() {
+
+ $data = "PROPNAME;PARAMNAME=\"param:value\":propValue";
+ $result = Reader::read($data);
+
+ $this->assertInstanceOf('Sabre\\VObject\\Property', $result);
+ $this->assertEquals('PROPNAME', $result->name);
+ $this->assertEquals('propValue', $result->value);
+ $this->assertEquals(1, count($result->parameters));
+ $this->assertEquals('PARAMNAME', $result->parameters[0]->name);
+ $this->assertEquals('param:value', $result->parameters[0]->value);
+
+ }
+
+ function testReadForgiving() {
+
+ $data = array(
+ "BEGIN:VCALENDAR",
+ "X_PROP:propValue",
+ "END:VCALENDAR"
+ );
+
+ $caught = false;
+ try {
+ $result = Reader::read(implode("\r\n",$data));
+ } catch (ParseException $e) {
+ $caught = true;
+ }
+
+ $this->assertEquals(true, $caught);
+
+ $result = Reader::read(implode("\r\n",$data), Reader::OPTION_FORGIVING);
+
+ $expected = implode("\r\n", array(
+ "BEGIN:VCALENDAR",
+ "X_PROP:propValue",
+ "END:VCALENDAR",
+ ""
+ ));
+
+ $this->assertEquals($expected, $result->serialize());
+
+
+ }
+
+ function testReadWithInvalidLine() {
+
+ $data = array(
+ "BEGIN:VCALENDAR",
+ "DESCRIPTION:propValue",
+ "Yes, we've actually seen a file with non-idented property values on multiple lines",
+ "END:VCALENDAR"
+ );
+
+ $caught = false;
+ try {
+ $result = Reader::read(implode("\r\n",$data));
+ } catch (ParseException $e) {
+ $caught = true;
+ }
+
+ $this->assertEquals(true, $caught);
+
+ $result = Reader::read(implode("\r\n",$data), Reader::OPTION_IGNORE_INVALID_LINES);
+
+ $expected = implode("\r\n", array(
+ "BEGIN:VCALENDAR",
+ "DESCRIPTION:propValue",
+ "END:VCALENDAR",
+ ""
+ ));
+
+ $this->assertEquals($expected, $result->serialize());
+
+
+ }
+
+ /**
+ * Reported as Issue 32.
+ *
+ * @expectedException \Sabre\VObject\ParseException
+ */
+ function testReadIncompleteFile() {
+
+ $input = <<<ICS
+BEGIN:VCALENDAR
+VERSION:1.0
+BEGIN:VEVENT
+X-FUNAMBOL-FOLDER:DEFAULT_FOLDER
+X-FUNAMBOL-ALLDAY:0
+DTSTART:20111017T110000Z
+DTEND:20111017T123000Z
+X-MICROSOFT-CDO-BUSYSTATUS:BUSY
+CATEGORIES:
+LOCATION;ENCODING=QUOTED-PRINTABLE;CHARSET=UTF-8:Netviewer Meeting
+PRIORITY:1
+STATUS:3
+X-MICROSOFT-CDO-REPLYTIME:20111017T064200Z
+SUMMARY;ENCODING=QUOTED-PRINTABLE;CHARSET=UTF-8:Kopieren: test
+CLASS:PUBLIC
+AALARM:
+RRULE:
+X-FUNAMBOL-BILLINGINFO:
+X-FUNAMBOL-COMPANIES:
+X-FUNAMBOL-MILEAGE:
+X-FUNAMBOL-NOAGING:0
+ATTENDEE;STATUS=NEEDS ACTION;ENCODING=QUOTED-PRINTABLE;CHARSET=UTF-8:'Heino' heino@test.com
+ATTENDEE;STATUS=NEEDS ACTION;ENCODING=QUOTED-PRINTABLE;CHARSET=UTF-8:'Markus' test@test.com
+ATTENDEE;STATUS=NEEDS AC
+ICS;
+
+ Reader::read($input);
+
+ }
+
+
+}
diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/RecurrenceIteratorFifthTuesdayProblemTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/RecurrenceIteratorFifthTuesdayProblemTest.php
new file mode 100644
index 000000000..069832a0f
--- /dev/null
+++ b/vendor/sabre/vobject/tests/Sabre/VObject/RecurrenceIteratorFifthTuesdayProblemTest.php
@@ -0,0 +1,44 @@
+<?php
+
+namespace Sabre\VObject;
+
+class RecurrenceIteratorFifthTuesdayProblemTest extends \PHPUnit_Framework_TestCase {
+
+ function testGetDTEnd() {
+
+ $ics = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Apple Inc.//iCal 4.0.4//EN
+CALSCALE:GREGORIAN
+BEGIN:VEVENT
+TRANSP:OPAQUE
+DTEND;TZID=America/New_York:20070925T170000
+UID:uuid
+DTSTAMP:19700101T000000Z
+LOCATION:
+DESCRIPTION:
+STATUS:CONFIRMED
+SEQUENCE:18
+SUMMARY:Stuff
+DTSTART;TZID=America/New_York:20070925T160000
+CREATED:20071004T144642Z
+RRULE:FREQ=MONTHLY;INTERVAL=1;UNTIL=20071030T035959Z;BYDAY=5TU
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+ $vObject = Reader::read($ics);
+ $it = new RecurrenceIterator($vObject, (string)$vObject->VEVENT->UID);
+
+ while($it->valid()) {
+ $it->next();
+ }
+
+ // If we got here, it means we were successful. The bug that was in the
+ // system before would fail on the 5th tuesday of the month, if the 5th
+ // tuesday did not exist.
+
+ }
+
+}
diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/RecurrenceIteratorIncorrectExpandTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/RecurrenceIteratorIncorrectExpandTest.php
new file mode 100644
index 000000000..9adc8537f
--- /dev/null
+++ b/vendor/sabre/vobject/tests/Sabre/VObject/RecurrenceIteratorIncorrectExpandTest.php
@@ -0,0 +1,62 @@
+<?php
+
+namespace Sabre\VObject;
+
+use
+ DateTime,
+ DateTimeZone;
+
+/**
+ * This is a unittest for Issue #53.
+ */
+class RecurrenceIteratorIncorrectExpandTest extends \PHPUnit_Framework_TestCase {
+
+ function testExpand() {
+
+ $input = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:foo
+DTSTART:20130711T050000Z
+DTEND:20130711T053000Z
+RRULE:FREQ=DAILY;INTERVAL=1;COUNT=2
+END:VEVENT
+BEGIN:VEVENT
+UID:foo
+DTSTART:20130719T050000Z
+DTEND:20130719T053000Z
+RECURRENCE-ID:20130712T050000Z
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+ $vcal = Reader::read($input);
+ $this->assertInstanceOf('Sabre\\VObject\\Component\\VCalendar', $vcal);
+
+ $vcal->expand(new DateTime('2011-01-01'), new DateTime('2014-01-01'));
+
+ $result = $vcal->serialize();
+
+ $output = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:foo
+DTSTART;VALUE=DATE-TIME:20130711T050000Z
+DTEND;VALUE=DATE-TIME:20130711T053000Z
+END:VEVENT
+BEGIN:VEVENT
+UID:foo
+DTSTART:20130719T050000Z
+DTEND:20130719T053000Z
+RECURRENCE-ID:20130712T050000Z
+END:VEVENT
+END:VCALENDAR
+
+ICS;
+ $this->assertEquals($output, str_replace("\r", "", $result));
+
+ }
+
+}
diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/RecurrenceIteratorInfiniteLoopProblemTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/RecurrenceIteratorInfiniteLoopProblemTest.php
new file mode 100644
index 000000000..670c39bae
--- /dev/null
+++ b/vendor/sabre/vobject/tests/Sabre/VObject/RecurrenceIteratorInfiniteLoopProblemTest.php
@@ -0,0 +1,91 @@
+<?php
+
+namespace Sabre\VObject;
+
+use DateTime;
+use DateTimeZone;
+
+class RecurrenceIteratorInfiniteLoopProblemTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * This bug came from a Fruux customer. This would result in a never-ending
+ * request.
+ */
+ function testFastForwardTooFar() {
+
+ $ev = Component::create('VEVENT');
+ $ev->DTSTART = '20090420T180000Z';
+ $ev->RRULE = 'FREQ=WEEKLY;BYDAY=MO;UNTIL=20090704T205959Z;INTERVAL=1';
+
+ $this->assertFalse($ev->isInTimeRange(new DateTime('2012-01-01 12:00:00'),new DateTime('3000-01-01 00:00:00')));
+
+ }
+
+ /**
+ * Different bug, also likely an infinite loop.
+ */
+ function testYearlyByMonthLoop() {
+
+ $ev = Component::create('VEVENT');
+ $ev->UID = 'uuid';
+ $ev->DTSTART = '20120101T154500';
+ $ev->DTSTART['TZID'] = 'Europe/Berlin';
+ $ev->RRULE = 'FREQ=YEARLY;INTERVAL=1;UNTIL=20120203T225959Z;BYMONTH=2;BYSETPOS=1;BYDAY=SU,MO,TU,WE,TH,FR,SA';
+ $ev->DTEND = '20120101T164500';
+ $ev->DTEND['TZID'] = 'Europe/Berlin';
+
+ // This recurrence rule by itself is a yearly rule that should happen
+ // every february.
+ //
+ // The BYDAY part expands this to every day of the month, but the
+ // BYSETPOS limits this to only the 1st day of the month. Very crazy
+ // way to specify this, and could have certainly been a lot easier.
+ $cal = Component::create('VCALENDAR');
+ $cal->add($ev);
+
+ $it = new RecurrenceIterator($cal,'uuid');
+ $it->fastForward(new DateTime('2012-01-29 23:00:00', new DateTimeZone('UTC')));
+
+ $collect = array();
+
+ while($it->valid()) {
+ $collect[] = $it->getDTSTART();
+ if ($it->getDTSTART() > new DateTime('2013-02-05 22:59:59', new DateTimeZone('UTC'))) {
+ break;
+ }
+ $it->next();
+
+ }
+
+ $this->assertEquals(
+ array(new DateTime('2012-02-01 15:45:00', new DateTimeZone('Europe/Berlin'))),
+ $collect
+ );
+
+ }
+
+ /**
+ * Something, somewhere produced an ics with an interval set to 0. Because
+ * this means we increase the current day (or week, month) by 0, this also
+ * results in an infinite loop.
+ *
+ * @expectedException InvalidArgumentException
+ * @return void
+ */
+ function testZeroInterval() {
+
+ $ev = Component::create('VEVENT');
+ $ev->UID = 'uuid';
+ $ev->DTSTART = '20120824T145700Z';
+ $ev->RRULE = 'FREQ=YEARLY;INTERVAL=0';
+ $cal = Component::create('VCALENDAR');
+ $cal->add($ev);
+
+ $it = new RecurrenceIterator($cal,'uuid');
+ $it->fastForward(new DateTime('2013-01-01 23:00:00', new DateTimeZone('UTC')));
+
+ // if we got this far.. it means we are no longer infinitely looping
+
+ }
+
+}
diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/RecurrenceIteratorMinusOneProblemTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/RecurrenceIteratorMinusOneProblemTest.php
new file mode 100644
index 000000000..2c17f9f6b
--- /dev/null
+++ b/vendor/sabre/vobject/tests/Sabre/VObject/RecurrenceIteratorMinusOneProblemTest.php
@@ -0,0 +1,30 @@
+<?php
+
+namespace Sabre\VObject;
+
+class RecurrenceIteratorMinusOneProblemTest extends \PHPUnit_Framework_TestCase {
+
+ function testMinusOne() {
+
+ $ics = <<<ICS
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+DTSTAMP:20120314T203127Z
+UID:foo
+SUMMARY:foo
+RRULE:FREQ=YEARLY;UNTIL=20120314
+DTSTART;VALUE=DATE:20120315
+DTEND;VALUE=DATE:20120316
+SEQUENCE:1
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+ $vObject = Reader::read($ics);
+ $it = new RecurrenceIterator($vObject, (string)$vObject->VEVENT->UID);
+
+ $this->assertTrue($it->valid());
+
+ }
+
+}
diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/RecurrenceIteratorMissingOverriddenTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/RecurrenceIteratorMissingOverriddenTest.php
new file mode 100644
index 000000000..f311329db
--- /dev/null
+++ b/vendor/sabre/vobject/tests/Sabre/VObject/RecurrenceIteratorMissingOverriddenTest.php
@@ -0,0 +1,63 @@
+<?php
+
+namespace Sabre\VObject;
+
+use
+ DateTime,
+ DateTimeZone;
+
+class RecurrenceIteratorMissingOverriddenTest extends \PHPUnit_Framework_TestCase {
+
+ function testExpand() {
+
+ $input = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:foo
+DTSTART:20130727T120000Z
+DURATION:PT1H
+RRULE:FREQ=DAILY;COUNT=2
+SUMMARY:A
+END:VEVENT
+BEGIN:VEVENT
+RECURRENCE-ID:20130728T120000Z
+UID:foo
+DTSTART:20140101T120000Z
+DURATION:PT1H
+SUMMARY:B
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+ $vcal = Reader::read($input);
+ $this->assertInstanceOf('Sabre\\VObject\\Component\\VCalendar', $vcal);
+
+ $vcal->expand(new DateTime('2011-01-01'), new DateTime('2015-01-01'));
+
+ $result = $vcal->serialize();
+
+ $output = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:foo
+DTSTART;VALUE=DATE-TIME:20130727T120000Z
+DURATION:PT1H
+SUMMARY:A
+END:VEVENT
+BEGIN:VEVENT
+RECURRENCE-ID:20130728T120000Z
+UID:foo
+DTSTART:20140101T120000Z
+DURATION:PT1H
+SUMMARY:B
+END:VEVENT
+END:VCALENDAR
+
+ICS;
+ $this->assertEquals($output, str_replace("\r","",$result));
+
+ }
+
+}
diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/RecurrenceIteratorTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/RecurrenceIteratorTest.php
new file mode 100644
index 000000000..1811d8b6f
--- /dev/null
+++ b/vendor/sabre/vobject/tests/Sabre/VObject/RecurrenceIteratorTest.php
@@ -0,0 +1,1425 @@
+<?php
+
+namespace Sabre\VObject;
+
+use DateTime;
+use DateTimeZone;
+
+class RecurrenceIteratorTest extends \PHPUnit_Framework_TestCase {
+
+ function testValues() {
+
+ $ev = new Component('VEVENT');
+ $ev->UID = 'bla';
+ $ev->RRULE = 'FREQ=DAILY;BYHOUR=10;BYMINUTE=5;BYSECOND=16;BYWEEKNO=32;BYYEARDAY=100,200';
+ $dtStart = new Property\DateTime('DTSTART');
+ $dtStart->setDateTime(new DateTime('2011-10-07'),Property\DateTime::UTC);
+
+ $ev->add($dtStart);
+
+ $vcal = Component::create('VCALENDAR');
+ $vcal->add($ev);
+
+ $it = new RecurrenceIterator($vcal,(string)$ev->uid);
+
+ $this->assertTrue($it->isInfinite());
+ $this->assertEquals(array(10), $it->byHour);
+ $this->assertEquals(array(5), $it->byMinute);
+ $this->assertEquals(array(16), $it->bySecond);
+ $this->assertEquals(array(32), $it->byWeekNo);
+ $this->assertEquals(array(100,200), $it->byYearDay);
+
+ }
+
+ /**
+ * @expectedException InvalidArgumentException
+ * @depends testValues
+ */
+ function testInvalidFreq() {
+
+ $ev = new Component('VEVENT');
+ $ev->RRULE = 'FREQ=SMONTHLY;INTERVAL=3;UNTIL=20111025T000000Z';
+ $dtStart = new Property\DateTime('DTSTART');
+ $dtStart->setDateTime(new DateTime('2011-10-07'),Property\DateTime::UTC);
+
+ $ev->add($dtStart);
+
+ $vcal = Component::create('VCALENDAR');
+ $vcal->add($ev);
+
+ $it = new RecurrenceIterator($vcal,(string)$ev->uid);
+
+ }
+
+ /**
+ * @expectedException InvalidArgumentException
+ */
+ function testVCalendarNoUID() {
+
+ $vcal = new Component('VCALENDAR');
+ $it = new RecurrenceIterator($vcal);
+
+ }
+
+ /**
+ * @expectedException InvalidArgumentException
+ */
+ function testVCalendarInvalidUID() {
+
+ $vcal = new Component('VCALENDAR');
+ $it = new RecurrenceIterator($vcal,'foo');
+
+ }
+
+ /**
+ * @depends testValues
+ */
+ function testHourly() {
+
+ $ev = new Component('VEVENT');
+ $ev->UID = 'bla';
+ $ev->RRULE = 'FREQ=HOURLY;INTERVAL=3;UNTIL=20111025T000000Z';
+ $dtStart = new Property\DateTime('DTSTART');
+ $dtStart->setDateTime(new DateTime('2011-10-07 12:00:00', new DateTimeZone('UTC')),Property\DateTime::UTC);
+
+ $ev->add($dtStart);
+
+ $vcal = Component::create('VCALENDAR');
+ $vcal->add($ev);
+
+ $it = new RecurrenceIterator($vcal,$ev->uid);
+
+ $this->assertEquals('hourly', $it->frequency);
+ $this->assertEquals(3, $it->interval);
+ $this->assertEquals(new DateTime('2011-10-25', new DateTimeZone('UTC')), $it->until);
+
+ // Max is to prevent overflow
+ $max = 12;
+ $result = array();
+ foreach($it as $item) {
+
+ $result[] = $item;
+ $max--;
+
+ if (!$max) break;
+
+ }
+
+ $tz = new DateTimeZone('UTC');
+
+ $this->assertEquals(
+ array(
+ new DateTime('2011-10-07 12:00:00', $tz),
+ new DateTime('2011-10-07 15:00:00', $tz),
+ new DateTime('2011-10-07 18:00:00', $tz),
+ new DateTime('2011-10-07 21:00:00', $tz),
+ new DateTime('2011-10-08 00:00:00', $tz),
+ new DateTime('2011-10-08 03:00:00', $tz),
+ new DateTime('2011-10-08 06:00:00', $tz),
+ new DateTime('2011-10-08 09:00:00', $tz),
+ new DateTime('2011-10-08 12:00:00', $tz),
+ new DateTime('2011-10-08 15:00:00', $tz),
+ new DateTime('2011-10-08 18:00:00', $tz),
+ new DateTime('2011-10-08 21:00:00', $tz),
+ ),
+ $result
+ );
+
+ }
+
+ /**
+ * @depends testValues
+ */
+ function testDaily() {
+
+ $ev = new Component('VEVENT');
+ $ev->UID = 'bla';
+ $ev->RRULE = 'FREQ=DAILY;INTERVAL=3;UNTIL=20111025T000000Z';
+ $dtStart = new Property\DateTime('DTSTART');
+ $dtStart->setDateTime(new DateTime('2011-10-07', new DateTimeZone('UTC')),Property\DateTime::UTC);
+
+ $ev->add($dtStart);
+
+ $vcal = Component::create('VCALENDAR');
+ $vcal->add($ev);
+
+ $it = new RecurrenceIterator($vcal,$ev->uid);
+
+ $this->assertEquals('daily', $it->frequency);
+ $this->assertEquals(3, $it->interval);
+ $this->assertEquals(new DateTime('2011-10-25', new DateTimeZone('UTC')), $it->until);
+
+ // Max is to prevent overflow
+ $max = 12;
+ $result = array();
+ foreach($it as $item) {
+
+ $result[] = $item;
+ $max--;
+
+ if (!$max) break;
+
+ }
+
+ $tz = new DateTimeZone('UTC');
+
+ $this->assertEquals(
+ array(
+ new DateTime('2011-10-07', $tz),
+ new DateTime('2011-10-10', $tz),
+ new DateTime('2011-10-13', $tz),
+ new DateTime('2011-10-16', $tz),
+ new DateTime('2011-10-19', $tz),
+ new DateTime('2011-10-22', $tz),
+ new DateTime('2011-10-25', $tz),
+ ),
+ $result
+ );
+
+ }
+
+ /**
+ * @depends testValues
+ */
+ function testNoRRULE() {
+
+ $ev = new Component('VEVENT');
+ $ev->UID = 'bla';
+ $dtStart = new Property\DateTime('DTSTART');
+ $dtStart->setDateTime(new DateTime('2011-10-07', new DateTimeZone('UTC')),Property\DateTime::UTC);
+
+ $ev->add($dtStart);
+
+ $vcal = Component::create('VCALENDAR');
+ $vcal->add($ev);
+
+ $it = new RecurrenceIterator($vcal,$ev->uid);
+
+ $this->assertEquals('daily', $it->frequency);
+ $this->assertEquals(1, $it->interval);
+
+ // Max is to prevent overflow
+ $max = 12;
+ $result = array();
+ foreach($it as $item) {
+
+ $result[] = $item;
+ $max--;
+
+ if (!$max) break;
+
+ }
+
+ $tz = new DateTimeZone('UTC');
+
+ $this->assertEquals(
+ array(
+ new DateTime('2011-10-07', $tz),
+ ),
+ $result
+ );
+
+ }
+
+ /**
+ * @depends testValues
+ */
+ function testDailyByDayByHour() {
+
+ $ev = new Component('VEVENT');
+ $ev->UID = 'bla';
+ $ev->RRULE = 'FREQ=DAILY;BYDAY=SA,SU;BYHOUR=6,7';
+ $dtStart = new Property\DateTime('DTSTART');
+ $dtStart->setDateTime(new DateTime('2011-10-08 06:00:00', new DateTimeZone('UTC')),Property\DateTime::UTC);
+
+ $ev->add($dtStart);
+
+ $vcal = Component::create('VCALENDAR');
+ $vcal->add($ev);
+
+ $it = new RecurrenceIterator($vcal,(string)$ev->uid);
+
+ $this->assertEquals('daily', $it->frequency);
+ $this->assertEquals(1, $it->interval);
+ $this->assertEquals(array('6','7'), $it->byHour);
+ $this->assertEquals(array('SA','SU'), $it->byDay);
+
+ // Grabbing the next 12 items
+ $max = 12;
+ $result = array();
+ foreach($it as $item) {
+
+ $result[] = $item;
+ $max--;
+
+ if (!$max) break;
+
+ }
+
+ $tz = new DateTimeZone('UTC');
+
+ $this->assertEquals(
+ array(
+ new datetime('2011-10-08 06:00:00', $tz),
+ new datetime('2011-10-08 07:00:00', $tz),
+ new datetime('2011-10-09 06:00:00', $tz),
+ new datetime('2011-10-09 07:00:00', $tz),
+ new datetime('2011-10-15 06:00:00', $tz),
+ new datetime('2011-10-15 07:00:00', $tz),
+ new datetime('2011-10-16 06:00:00', $tz),
+ new datetime('2011-10-16 07:00:00', $tz),
+ new datetime('2011-10-22 06:00:00', $tz),
+ new datetime('2011-10-22 07:00:00', $tz),
+ new datetime('2011-10-23 06:00:00', $tz),
+ new datetime('2011-10-23 07:00:00', $tz),
+ ),
+ $result
+ );
+
+ }
+
+ /**
+ * @depends testValues
+ */
+ function testDailyByHour() {
+
+ $ev = new Component('VEVENT');
+ $ev->UID = 'bla';
+ $ev->RRULE = 'FREQ=DAILY;INTERVAL=2;BYHOUR=10,11,12,13,14,15';
+ $dtStart = new Property\DateTime('DTSTART');
+ $dtStart->setDateTime(new DateTime('2012-10-11 12:00:00', new DateTimeZone('UTC')),Property\DateTime::UTC);
+
+ $ev->add($dtStart);
+
+ $vcal = Component::create('VCALENDAR');
+ $vcal->add($ev);
+
+ $it = new RecurrenceIterator($vcal,(string)$ev->uid);
+
+ $this->assertEquals('daily', $it->frequency);
+ $this->assertEquals(2, $it->interval);
+ $this->assertEquals(array('10','11','12','13','14','15'), $it->byHour);
+
+ // Grabbing the next 12 items
+ $max = 12;
+ $result = array();
+ foreach($it as $item) {
+
+ $result[] = $item;
+ $max--;
+
+ if (!$max) break;
+
+ }
+
+ $tz = new DateTimeZone('UTC');
+
+ $this->assertEquals(
+ array(
+ new datetime('2012-10-11 12:00:00', $tz),
+ new datetime('2012-10-11 13:00:00', $tz),
+ new datetime('2012-10-11 14:00:00', $tz),
+ new datetime('2012-10-11 15:00:00', $tz),
+ new datetime('2012-10-13 10:00:00', $tz),
+ new datetime('2012-10-13 11:00:00', $tz),
+ new datetime('2012-10-13 12:00:00', $tz),
+ new datetime('2012-10-13 13:00:00', $tz),
+ new datetime('2012-10-13 14:00:00', $tz),
+ new datetime('2012-10-13 15:00:00', $tz),
+ new datetime('2012-10-15 10:00:00', $tz),
+ new datetime('2012-10-15 11:00:00', $tz),
+ ),
+ $result
+ );
+
+ }
+
+ /**
+ * @depends testValues
+ */
+ function testDailyByDay() {
+
+ $ev = new Component('VEVENT');
+ $ev->UID = 'bla';
+ $ev->RRULE = 'FREQ=DAILY;INTERVAL=2;BYDAY=TU,WE,FR';
+ $dtStart = new Property\DateTime('DTSTART');
+ $dtStart->setDateTime(new DateTime('2011-10-07', new DateTimeZone('UTC')),Property\DateTime::UTC);
+
+ $ev->add($dtStart);
+
+ $vcal = Component::create('VCALENDAR');
+ $vcal->add($ev);
+
+ $it = new RecurrenceIterator($vcal,(string)$ev->uid);
+
+ $this->assertEquals('daily', $it->frequency);
+ $this->assertEquals(2, $it->interval);
+ $this->assertEquals(array('TU','WE','FR'), $it->byDay);
+
+ // Grabbing the next 12 items
+ $max = 12;
+ $result = array();
+ foreach($it as $item) {
+
+ $result[] = $item;
+ $max--;
+
+ if (!$max) break;
+
+ }
+
+ $tz = new DateTimeZone('UTC');
+
+ $this->assertEquals(
+ array(
+ new DateTime('2011-10-07', $tz),
+ new DateTime('2011-10-11', $tz),
+ new DateTime('2011-10-19', $tz),
+ new DateTime('2011-10-21', $tz),
+ new DateTime('2011-10-25', $tz),
+ new DateTime('2011-11-02', $tz),
+ new DateTime('2011-11-04', $tz),
+ new DateTime('2011-11-08', $tz),
+ new DateTime('2011-11-16', $tz),
+ new DateTime('2011-11-18', $tz),
+ new DateTime('2011-11-22', $tz),
+ new DateTime('2011-11-30', $tz),
+ ),
+ $result
+ );
+
+ }
+
+ /**
+ * @depends testValues
+ */
+ function testWeekly() {
+
+ $ev = new Component('VEVENT');
+ $ev->UID = 'bla';
+ $ev->RRULE = 'FREQ=WEEKLY;INTERVAL=2;COUNT=10';
+ $dtStart = new Property\DateTime('DTSTART');
+ $dtStart->setDateTime(new DateTime('2011-10-07', new DateTimeZone('UTC')),Property\DateTime::UTC);
+
+ $ev->add($dtStart);
+
+ $vcal = Component::create('VCALENDAR');
+ $vcal->add($ev);
+
+ $it = new RecurrenceIterator($vcal,(string)$ev->uid);
+
+ $this->assertEquals('weekly', $it->frequency);
+ $this->assertEquals(2, $it->interval);
+ $this->assertEquals(10, $it->count);
+
+ // Max is to prevent overflow
+ $max = 12;
+ $result = array();
+ foreach($it as $item) {
+
+ $result[] = $item;
+ $max--;
+
+ if (!$max) break;
+
+ }
+
+ $tz = new DateTimeZone('UTC');
+
+ $this->assertEquals(
+ array(
+ new DateTime('2011-10-07', $tz),
+ new DateTime('2011-10-21', $tz),
+ new DateTime('2011-11-04', $tz),
+ new DateTime('2011-11-18', $tz),
+ new DateTime('2011-12-02', $tz),
+ new DateTime('2011-12-16', $tz),
+ new DateTime('2011-12-30', $tz),
+ new DateTime('2012-01-13', $tz),
+ new DateTime('2012-01-27', $tz),
+ new DateTime('2012-02-10', $tz),
+ ),
+ $result
+ );
+
+ }
+
+ /**
+ * @depends testValues
+ */
+ function testWeeklyByDayByHour() {
+
+ $ev = new Component('VEVENT');
+ $ev->UID = 'bla';
+ $ev->RRULE = 'FREQ=WEEKLY;INTERVAL=2;BYDAY=TU,WE,FR;WKST=MO;BYHOUR=8,9,10';
+ $dtStart = new Property\DateTime('DTSTART');
+ $dtStart->setDateTime(new DateTime('2011-10-07 08:00:00', new DateTimeZone('UTC')),Property\DateTime::UTC);
+
+ $ev->add($dtStart);
+
+ $vcal = Component::create('VCALENDAR');
+ $vcal->add($ev);
+
+ $it = new RecurrenceIterator($vcal,(string)$ev->uid);
+
+ $this->assertEquals('weekly', $it->frequency);
+ $this->assertEquals(2, $it->interval);
+ $this->assertEquals(array('TU','WE','FR'), $it->byDay);
+ $this->assertEquals(array('8','9','10'), $it->byHour);
+ $this->assertEquals('MO', $it->weekStart);
+
+ // Grabbing the next 12 items
+ $max = 15;
+ $result = array();
+ foreach($it as $item) {
+
+ $result[] = $item;
+ $max--;
+
+ if (!$max) break;
+
+ }
+
+ $tz = new DateTimeZone('UTC');
+
+ $this->assertEquals(
+ array(
+ new DateTime('2011-10-07 08:00:00', $tz),
+ new DateTime('2011-10-07 09:00:00', $tz),
+ new DateTime('2011-10-07 10:00:00', $tz),
+ new DateTime('2011-10-18 08:00:00', $tz),
+ new DateTime('2011-10-18 09:00:00', $tz),
+ new DateTime('2011-10-18 10:00:00', $tz),
+ new DateTime('2011-10-19 08:00:00', $tz),
+ new DateTime('2011-10-19 09:00:00', $tz),
+ new DateTime('2011-10-19 10:00:00', $tz),
+ new DateTime('2011-10-21 08:00:00', $tz),
+ new DateTime('2011-10-21 09:00:00', $tz),
+ new DateTime('2011-10-21 10:00:00', $tz),
+ new DateTime('2011-11-01 08:00:00', $tz),
+ new DateTime('2011-11-01 09:00:00', $tz),
+ new DateTime('2011-11-01 10:00:00', $tz),
+ ),
+ $result
+ );
+
+ }
+
+ /**
+ * @depends testValues
+ */
+ function testWeeklyByDaySpecificHour() {
+
+ $ev = new Component('VEVENT');
+ $ev->UID = 'bla';
+ $ev->RRULE = 'FREQ=WEEKLY;INTERVAL=2;BYDAY=TU,WE,FR;WKST=SU';
+ $dtStart = new Property\DateTime('DTSTART');
+ $dtStart->setDateTime(new DateTime('2011-10-07 18:00:00', new DateTimeZone('UTC')),Property\DateTime::UTC);
+
+ $ev->add($dtStart);
+
+ $vcal = Component::create('VCALENDAR');
+ $vcal->add($ev);
+
+ $it = new RecurrenceIterator($vcal,(string)$ev->uid);
+
+ $this->assertEquals('weekly', $it->frequency);
+ $this->assertEquals(2, $it->interval);
+ $this->assertEquals(array('TU','WE','FR'), $it->byDay);
+ $this->assertEquals('SU', $it->weekStart);
+
+ // Grabbing the next 12 items
+ $max = 12;
+ $result = array();
+ foreach($it as $item) {
+
+ $result[] = $item;
+ $max--;
+
+ if (!$max) break;
+
+ }
+
+ $tz = new DateTimeZone('UTC');
+
+ $this->assertEquals(
+ array(
+ new DateTime('2011-10-07 18:00:00', $tz),
+ new DateTime('2011-10-18 18:00:00', $tz),
+ new DateTime('2011-10-19 18:00:00', $tz),
+ new DateTime('2011-10-21 18:00:00', $tz),
+ new DateTime('2011-11-01 18:00:00', $tz),
+ new DateTime('2011-11-02 18:00:00', $tz),
+ new DateTime('2011-11-04 18:00:00', $tz),
+ new DateTime('2011-11-15 18:00:00', $tz),
+ new DateTime('2011-11-16 18:00:00', $tz),
+ new DateTime('2011-11-18 18:00:00', $tz),
+ new DateTime('2011-11-29 18:00:00', $tz),
+ new DateTime('2011-11-30 18:00:00', $tz),
+ ),
+ $result
+ );
+
+ }
+
+ /**
+ * @depends testValues
+ */
+ function testWeeklyByDay() {
+
+ $ev = new Component('VEVENT');
+ $ev->UID = 'bla';
+ $ev->RRULE = 'FREQ=WEEKLY;INTERVAL=2;BYDAY=TU,WE,FR;WKST=SU';
+ $dtStart = new Property\DateTime('DTSTART');
+ $dtStart->setDateTime(new DateTime('2011-10-07', new DateTimeZone('UTC')),Property\DateTime::UTC);
+
+ $ev->add($dtStart);
+
+ $vcal = Component::create('VCALENDAR');
+ $vcal->add($ev);
+
+ $it = new RecurrenceIterator($vcal,(string)$ev->uid);
+
+ $this->assertEquals('weekly', $it->frequency);
+ $this->assertEquals(2, $it->interval);
+ $this->assertEquals(array('TU','WE','FR'), $it->byDay);
+ $this->assertEquals('SU', $it->weekStart);
+
+ // Grabbing the next 12 items
+ $max = 12;
+ $result = array();
+ foreach($it as $item) {
+
+ $result[] = $item;
+ $max--;
+
+ if (!$max) break;
+
+ }
+
+ $tz = new DateTimeZone('UTC');
+
+ $this->assertEquals(
+ array(
+ new DateTime('2011-10-07', $tz),
+ new DateTime('2011-10-18', $tz),
+ new DateTime('2011-10-19', $tz),
+ new DateTime('2011-10-21', $tz),
+ new DateTime('2011-11-01', $tz),
+ new DateTime('2011-11-02', $tz),
+ new DateTime('2011-11-04', $tz),
+ new DateTime('2011-11-15', $tz),
+ new DateTime('2011-11-16', $tz),
+ new DateTime('2011-11-18', $tz),
+ new DateTime('2011-11-29', $tz),
+ new DateTime('2011-11-30', $tz),
+ ),
+ $result
+ );
+
+ }
+
+ /**
+ * @depends testValues
+ */
+ function testMonthly() {
+
+ $ev = new Component('VEVENT');
+ $ev->UID = 'bla';
+ $ev->RRULE = 'FREQ=MONTHLY;INTERVAL=3;COUNT=5';
+ $dtStart = new Property\DateTime('DTSTART');
+ $dtStart->setDateTime(new DateTime('2011-12-05', new DateTimeZone('UTC')),Property\DateTime::UTC);
+
+ $ev->add($dtStart);
+
+ $vcal = Component::create('VCALENDAR');
+ $vcal->add($ev);
+
+ $it = new RecurrenceIterator($vcal,(string)$ev->uid);
+
+ $this->assertEquals('monthly', $it->frequency);
+ $this->assertEquals(3, $it->interval);
+ $this->assertEquals(5, $it->count);
+
+ $max = 14;
+ $result = array();
+ foreach($it as $item) {
+
+ $result[] = $item;
+ $max--;
+
+ if (!$max) break;
+
+ }
+
+ $tz = new DateTimeZone('UTC');
+
+ $this->assertEquals(
+ array(
+ new DateTime('2011-12-05', $tz),
+ new DateTime('2012-03-05', $tz),
+ new DateTime('2012-06-05', $tz),
+ new DateTime('2012-09-05', $tz),
+ new DateTime('2012-12-05', $tz),
+ ),
+ $result
+ );
+
+
+ }
+
+ /**
+ * @depends testValues
+ */
+ function testMonthlyEndOfMonth() {
+
+ $ev = new Component('VEVENT');
+ $ev->UID = 'bla';
+ $ev->RRULE = 'FREQ=MONTHLY;INTERVAL=2;COUNT=12';
+ $dtStart = new Property\DateTime('DTSTART');
+ $dtStart->setDateTime(new DateTime('2011-12-31', new DateTimeZone('UTC')),Property\DateTime::UTC);
+
+ $ev->add($dtStart);
+
+ $vcal = Component::create('VCALENDAR');
+ $vcal->add($ev);
+
+ $it = new RecurrenceIterator($vcal,(string)$ev->uid);
+
+ $this->assertEquals('monthly', $it->frequency);
+ $this->assertEquals(2, $it->interval);
+ $this->assertEquals(12, $it->count);
+
+ $max = 14;
+ $result = array();
+ foreach($it as $item) {
+
+ $result[] = $item;
+ $max--;
+
+ if (!$max) break;
+
+ }
+
+ $tz = new DateTimeZone('UTC');
+
+ $this->assertEquals(
+ array(
+ new DateTime('2011-12-31', $tz),
+ new DateTime('2012-08-31', $tz),
+ new DateTime('2012-10-31', $tz),
+ new DateTime('2012-12-31', $tz),
+ new DateTime('2013-08-31', $tz),
+ new DateTime('2013-10-31', $tz),
+ new DateTime('2013-12-31', $tz),
+ new DateTime('2014-08-31', $tz),
+ new DateTime('2014-10-31', $tz),
+ new DateTime('2014-12-31', $tz),
+ new DateTime('2015-08-31', $tz),
+ new DateTime('2015-10-31', $tz),
+ ),
+ $result
+ );
+
+
+ }
+
+ /**
+ * @depends testValues
+ */
+ function testMonthlyByMonthDay() {
+
+ $ev = new Component('VEVENT');
+ $ev->UID = 'bla';
+ $ev->RRULE = 'FREQ=MONTHLY;INTERVAL=5;COUNT=9;BYMONTHDAY=1,31,-7';
+ $dtStart = new Property\DateTime('DTSTART');
+ $dtStart->setDateTime(new DateTime('2011-01-01', new DateTimeZone('UTC')),Property\DateTime::UTC);
+
+ $ev->add($dtStart);
+
+ $vcal = Component::create('VCALENDAR');
+ $vcal->add($ev);
+
+ $it = new RecurrenceIterator($vcal,(string)$ev->uid);
+
+ $this->assertEquals('monthly', $it->frequency);
+ $this->assertEquals(5, $it->interval);
+ $this->assertEquals(9, $it->count);
+ $this->assertEquals(array(1, 31, -7), $it->byMonthDay);
+
+ $max = 14;
+ $result = array();
+ foreach($it as $item) {
+
+ $result[] = $item;
+ $max--;
+
+ if (!$max) break;
+
+ }
+
+ $tz = new DateTimeZone('UTC');
+
+ $this->assertEquals(
+ array(
+ new DateTime('2011-01-01', $tz),
+ new DateTime('2011-01-25', $tz),
+ new DateTime('2011-01-31', $tz),
+ new DateTime('2011-06-01', $tz),
+ new DateTime('2011-06-24', $tz),
+ new DateTime('2011-11-01', $tz),
+ new DateTime('2011-11-24', $tz),
+ new DateTime('2012-04-01', $tz),
+ new DateTime('2012-04-24', $tz),
+ ),
+ $result
+ );
+
+ }
+
+ /**
+ * @depends testValues
+ */
+ function testMonthlyByDay() {
+
+ $ev = new Component('VEVENT');
+ $ev->UID = 'bla';
+ $ev->RRULE = 'FREQ=MONTHLY;INTERVAL=2;COUNT=16;BYDAY=MO,-2TU,+1WE,3TH';
+ $dtStart = new Property\DateTime('DTSTART');
+ $dtStart->setDateTime(new DateTime('2011-01-03', new DateTimeZone('UTC')),Property\DateTime::UTC);
+
+ $ev->add($dtStart);
+
+ $vcal = Component::create('VCALENDAR');
+ $vcal->add($ev);
+
+ $it = new RecurrenceIterator($vcal,(string)$ev->uid);
+
+ $this->assertEquals('monthly', $it->frequency);
+ $this->assertEquals(2, $it->interval);
+ $this->assertEquals(16, $it->count);
+ $this->assertEquals(array('MO','-2TU','+1WE','3TH'), $it->byDay);
+
+ $max = 20;
+ $result = array();
+ foreach($it as $k=>$item) {
+
+ $result[] = $item;
+ $max--;
+
+ if (!$max) break;
+
+ }
+
+ $tz = new DateTimeZone('UTC');
+
+ $this->assertEquals(
+ array(
+ new DateTime('2011-01-03', $tz),
+ new DateTime('2011-01-05', $tz),
+ new DateTime('2011-01-10', $tz),
+ new DateTime('2011-01-17', $tz),
+ new DateTime('2011-01-18', $tz),
+ new DateTime('2011-01-20', $tz),
+ new DateTime('2011-01-24', $tz),
+ new DateTime('2011-01-31', $tz),
+ new DateTime('2011-03-02', $tz),
+ new DateTime('2011-03-07', $tz),
+ new DateTime('2011-03-14', $tz),
+ new DateTime('2011-03-17', $tz),
+ new DateTime('2011-03-21', $tz),
+ new DateTime('2011-03-22', $tz),
+ new DateTime('2011-03-28', $tz),
+ new DateTime('2011-05-02', $tz),
+ ),
+ $result
+ );
+
+ }
+
+ /**
+ * @depends testValues
+ */
+ function testMonthlyByDayByMonthDay() {
+
+ $ev = new Component('VEVENT');
+ $ev->UID = 'bla';
+ $ev->RRULE = 'FREQ=MONTHLY;COUNT=10;BYDAY=MO;BYMONTHDAY=1';
+ $dtStart = new Property\DateTime('DTSTART');
+ $dtStart->setDateTime(new DateTime('2011-08-01', new DateTimeZone('UTC')),Property\DateTime::UTC);
+
+ $ev->add($dtStart);
+
+ $vcal = Component::create('VCALENDAR');
+ $vcal->add($ev);
+
+ $it = new RecurrenceIterator($vcal,(string)$ev->uid);
+
+ $this->assertEquals('monthly', $it->frequency);
+ $this->assertEquals(1, $it->interval);
+ $this->assertEquals(10, $it->count);
+ $this->assertEquals(array('MO'), $it->byDay);
+ $this->assertEquals(array(1), $it->byMonthDay);
+
+ $max = 20;
+ $result = array();
+ foreach($it as $k=>$item) {
+
+ $result[] = $item;
+ $max--;
+
+ if (!$max) break;
+
+ }
+
+ $tz = new DateTimeZone('UTC');
+
+ $this->assertEquals(
+ array(
+ new DateTime('2011-08-01', $tz),
+ new DateTime('2012-10-01', $tz),
+ new DateTime('2013-04-01', $tz),
+ new DateTime('2013-07-01', $tz),
+ new DateTime('2014-09-01', $tz),
+ new DateTime('2014-12-01', $tz),
+ new DateTime('2015-06-01', $tz),
+ new DateTime('2016-02-01', $tz),
+ new DateTime('2016-08-01', $tz),
+ new DateTime('2017-05-01', $tz),
+ ),
+ $result
+ );
+
+ }
+
+ /**
+ * @depends testValues
+ */
+ function testMonthlyByDayBySetPos() {
+
+ $ev = new Component('VEVENT');
+ $ev->UID = 'bla';
+ $ev->RRULE = 'FREQ=MONTHLY;COUNT=10;BYDAY=MO,TU,WE,TH,FR;BYSETPOS=1,-1';
+ $dtStart = new Property\DateTime('DTSTART');
+ $dtStart->setDateTime(new DateTime('2011-01-03', new DateTimeZone('UTC')),Property\DateTime::UTC);
+
+ $ev->add($dtStart);
+
+ $vcal = Component::create('VCALENDAR');
+ $vcal->add($ev);
+
+ $it = new RecurrenceIterator($vcal,(string)$ev->uid);
+
+ $this->assertEquals('monthly', $it->frequency);
+ $this->assertEquals(1, $it->interval);
+ $this->assertEquals(10, $it->count);
+ $this->assertEquals(array('MO','TU','WE','TH','FR'), $it->byDay);
+ $this->assertEquals(array(1,-1), $it->bySetPos);
+
+ $max = 20;
+ $result = array();
+ foreach($it as $k=>$item) {
+
+ $result[] = $item;
+ $max--;
+
+ if (!$max) break;
+
+ }
+
+ $tz = new DateTimeZone('UTC');
+
+ $this->assertEquals(
+ array(
+ new DateTime('2011-01-03', $tz),
+ new DateTime('2011-01-31', $tz),
+ new DateTime('2011-02-01', $tz),
+ new DateTime('2011-02-28', $tz),
+ new DateTime('2011-03-01', $tz),
+ new DateTime('2011-03-31', $tz),
+ new DateTime('2011-04-01', $tz),
+ new DateTime('2011-04-29', $tz),
+ new DateTime('2011-05-02', $tz),
+ new DateTime('2011-05-31', $tz),
+ ),
+ $result
+ );
+
+ }
+
+ /**
+ * @depends testValues
+ */
+ function testYearly() {
+
+ $ev = new Component('VEVENT');
+ $ev->UID = 'bla';
+ $ev->RRULE = 'FREQ=YEARLY;COUNT=10;INTERVAL=3';
+ $dtStart = new Property\DateTime('DTSTART');
+ $dtStart->setDateTime(new DateTime('2011-01-01', new DateTimeZone('UTC')),Property\DateTime::UTC);
+
+ $ev->add($dtStart);
+
+ $vcal = Component::create('VCALENDAR');
+ $vcal->add($ev);
+
+ $it = new RecurrenceIterator($vcal,(string)$ev->uid);
+
+ $this->assertEquals('yearly', $it->frequency);
+ $this->assertEquals(3, $it->interval);
+ $this->assertEquals(10, $it->count);
+
+ $max = 20;
+ $result = array();
+ foreach($it as $k=>$item) {
+
+ $result[] = $item;
+ $max--;
+
+ if (!$max) break;
+
+ }
+
+ $tz = new DateTimeZone('UTC');
+
+ $this->assertEquals(
+ array(
+ new DateTime('2011-01-01', $tz),
+ new DateTime('2014-01-01', $tz),
+ new DateTime('2017-01-01', $tz),
+ new DateTime('2020-01-01', $tz),
+ new DateTime('2023-01-01', $tz),
+ new DateTime('2026-01-01', $tz),
+ new DateTime('2029-01-01', $tz),
+ new DateTime('2032-01-01', $tz),
+ new DateTime('2035-01-01', $tz),
+ new DateTime('2038-01-01', $tz),
+ ),
+ $result
+ );
+
+ }
+
+ /**
+ * @depends testValues
+ */
+ function testYearlyLeapYear() {
+
+ $ev = new Component('VEVENT');
+ $ev->UID = 'bla';
+ $ev->RRULE = 'FREQ=YEARLY;COUNT=3';
+ $dtStart = new Property\DateTime('DTSTART');
+ $dtStart->setDateTime(new DateTime('2012-02-29', new DateTimeZone('UTC')),Property\DateTime::UTC);
+
+ $ev->add($dtStart);
+
+ $vcal = Component::create('VCALENDAR');
+ $vcal->add($ev);
+
+ $it = new RecurrenceIterator($vcal,(string)$ev->uid);
+
+ $this->assertEquals('yearly', $it->frequency);
+ $this->assertEquals(3, $it->count);
+
+ $max = 20;
+ $result = array();
+ foreach($it as $k=>$item) {
+
+ $result[] = $item;
+ $max--;
+
+ if (!$max) break;
+
+ }
+
+ $tz = new DateTimeZone('UTC');
+
+ $this->assertEquals(
+ array(
+ new DateTime('2012-02-29', $tz),
+ new DateTime('2016-02-29', $tz),
+ new DateTime('2020-02-29', $tz),
+ ),
+ $result
+ );
+
+ }
+
+ /**
+ * @depends testValues
+ */
+ function testYearlyByMonth() {
+
+ $ev = new Component('VEVENT');
+ $ev->UID = 'bla';
+ $ev->RRULE = 'FREQ=YEARLY;COUNT=8;INTERVAL=4;BYMONTH=4,10';
+ $dtStart = new Property\DateTime('DTSTART');
+ $dtStart->setDateTime(new DateTime('2011-04-07', new DateTimeZone('UTC')),Property\DateTime::UTC);
+
+ $ev->add($dtStart);
+
+ $vcal = Component::create('VCALENDAR');
+ $vcal->add($ev);
+
+ $it = new RecurrenceIterator($vcal,(string)$ev->uid);
+
+ $this->assertEquals('yearly', $it->frequency);
+ $this->assertEquals(4, $it->interval);
+ $this->assertEquals(8, $it->count);
+ $this->assertEquals(array(4,10), $it->byMonth);
+
+ $max = 20;
+ $result = array();
+ foreach($it as $k=>$item) {
+
+ $result[] = $item;
+ $max--;
+
+ if (!$max) break;
+
+ }
+
+ $tz = new DateTimeZone('UTC');
+
+ $this->assertEquals(
+ array(
+ new DateTime('2011-04-07', $tz),
+ new DateTime('2011-10-07', $tz),
+ new DateTime('2015-04-07', $tz),
+ new DateTime('2015-10-07', $tz),
+ new DateTime('2019-04-07', $tz),
+ new DateTime('2019-10-07', $tz),
+ new DateTime('2023-04-07', $tz),
+ new DateTime('2023-10-07', $tz),
+ ),
+ $result
+ );
+
+ }
+
+ /**
+ * @depends testValues
+ */
+ function testYearlyByMonthByDay() {
+
+ $ev = new Component('VEVENT');
+ $ev->UID = 'bla';
+ $ev->RRULE = 'FREQ=YEARLY;COUNT=8;INTERVAL=5;BYMONTH=4,10;BYDAY=1MO,-1SU';
+ $dtStart = new Property\DateTime('DTSTART');
+ $dtStart->setDateTime(new DateTime('2011-04-04', new DateTimeZone('UTC')),Property\DateTime::UTC);
+
+ $ev->add($dtStart);
+
+ $vcal = Component::create('VCALENDAR');
+ $vcal->add($ev);
+
+ $it = new RecurrenceIterator($vcal,(string)$ev->uid);
+
+ $this->assertEquals('yearly', $it->frequency);
+ $this->assertEquals(5, $it->interval);
+ $this->assertEquals(8, $it->count);
+ $this->assertEquals(array(4,10), $it->byMonth);
+ $this->assertEquals(array('1MO','-1SU'), $it->byDay);
+
+ $max = 20;
+ $result = array();
+ foreach($it as $k=>$item) {
+
+ $result[] = $item;
+ $max--;
+
+ if (!$max) break;
+
+ }
+
+ $tz = new DateTimeZone('UTC');
+
+ $this->assertEquals(
+ array(
+ new DateTime('2011-04-04', $tz),
+ new DateTime('2011-04-24', $tz),
+ new DateTime('2011-10-03', $tz),
+ new DateTime('2011-10-30', $tz),
+ new DateTime('2016-04-04', $tz),
+ new DateTime('2016-04-24', $tz),
+ new DateTime('2016-10-03', $tz),
+ new DateTime('2016-10-30', $tz),
+ ),
+ $result
+ );
+
+ }
+
+ /**
+ * @depends testValues
+ */
+ function testFastForward() {
+
+ $ev = new Component('VEVENT');
+ $ev->UID = 'bla';
+ $ev->RRULE = 'FREQ=YEARLY;COUNT=8;INTERVAL=5;BYMONTH=4,10;BYDAY=1MO,-1SU';
+ $dtStart = new Property\DateTime('DTSTART');
+ $dtStart->setDateTime(new DateTime('2011-04-04', new DateTimeZone('UTC')),Property\DateTime::UTC);
+
+ $ev->add($dtStart);
+
+ $vcal = Component::create('VCALENDAR');
+ $vcal->add($ev);
+
+ $it = new RecurrenceIterator($vcal,(string)$ev->uid);
+
+ // The idea is that we're fast-forwarding too far in the future, so
+ // there will be no results left.
+ $it->fastForward(new DateTime('2020-05-05', new DateTimeZone('UTC')));
+
+ $max = 20;
+ $result = array();
+ while($item = $it->current()) {
+
+ $result[] = $item;
+ $max--;
+
+ if (!$max) break;
+ $it->next();
+
+ }
+
+ $tz = new DateTimeZone('UTC');
+ $this->assertEquals(array(), $result);
+
+ }
+
+ /**
+ * @depends testValues
+ */
+ function testComplexExclusions() {
+
+ $ev = new Component('VEVENT');
+ $ev->UID = 'bla';
+ $ev->RRULE = 'FREQ=YEARLY;COUNT=10';
+ $dtStart = new Property\DateTime('DTSTART');
+
+ $tz = new DateTimeZone('Canada/Eastern');
+ $dtStart->setDateTime(new DateTime('2011-01-01 13:50:20', $tz),Property\DateTime::LOCALTZ);
+
+ $exDate1 = new Property\MultiDateTime('EXDATE');
+ $exDate1->setDateTimes(array(new DateTime('2012-01-01 13:50:20', $tz), new DateTime('2014-01-01 13:50:20', $tz)), Property\DateTime::LOCALTZ);
+ $exDate2 = new Property\MultiDateTime('EXDATE');
+ $exDate2->setDateTimes(array(new DateTime('2016-01-01 13:50:20', $tz)), Property\DateTime::LOCALTZ);
+
+ $ev->add($dtStart);
+ $ev->add($exDate1);
+ $ev->add($exDate2);
+
+ $vcal = Component::create('VCALENDAR');
+ $vcal->add($ev);
+
+ $it = new RecurrenceIterator($vcal,(string)$ev->uid);
+
+ $this->assertEquals('yearly', $it->frequency);
+ $this->assertEquals(1, $it->interval);
+ $this->assertEquals(10, $it->count);
+
+ $max = 20;
+ $result = array();
+ foreach($it as $k=>$item) {
+
+ $result[] = $item;
+ $max--;
+
+ if (!$max) break;
+
+ }
+
+ $this->assertEquals(
+ array(
+ new DateTime('2011-01-01 13:50:20', $tz),
+ new DateTime('2013-01-01 13:50:20', $tz),
+ new DateTime('2015-01-01 13:50:20', $tz),
+ new DateTime('2017-01-01 13:50:20', $tz),
+ new DateTime('2018-01-01 13:50:20', $tz),
+ new DateTime('2019-01-01 13:50:20', $tz),
+ new DateTime('2020-01-01 13:50:20', $tz),
+ ),
+ $result
+ );
+
+ }
+
+ /**
+ * @depends testValues
+ */
+ function testOverridenEvent() {
+
+ $vcal = Component::create('VCALENDAR');
+
+ $ev1 = Component::create('VEVENT');
+ $ev1->UID = 'overridden';
+ $ev1->RRULE = 'FREQ=DAILY;COUNT=10';
+ $ev1->DTSTART = '20120107T120000Z';
+ $ev1->SUMMARY = 'baseEvent';
+
+ $vcal->add($ev1);
+
+ // ev2 overrides an event, and puts it on 2pm instead.
+ $ev2 = Component::create('VEVENT');
+ $ev2->UID = 'overridden';
+ $ev2->{'RECURRENCE-ID'} = '20120110T120000Z';
+ $ev2->DTSTART = '20120110T140000Z';
+ $ev2->SUMMARY = 'Event 2';
+
+ $vcal->add($ev2);
+
+ // ev3 overrides an event, and puts it 2 days and 2 hours later
+ $ev3 = Component::create('VEVENT');
+ $ev3->UID = 'overridden';
+ $ev3->{'RECURRENCE-ID'} = '20120113T120000Z';
+ $ev3->DTSTART = '20120115T140000Z';
+ $ev3->SUMMARY = 'Event 3';
+
+ $vcal->add($ev3);
+
+ $it = new RecurrenceIterator($vcal,'overridden');
+
+ $dates = array();
+ $summaries = array();
+ while($it->valid()) {
+
+ $dates[] = $it->getDTStart();
+ $summaries[] = (string)$it->getEventObject()->SUMMARY;
+ $it->next();
+
+ }
+
+ $tz = new DateTimeZone('GMT');
+ $this->assertEquals(array(
+ new DateTime('2012-01-07 12:00:00',$tz),
+ new DateTime('2012-01-08 12:00:00',$tz),
+ new DateTime('2012-01-09 12:00:00',$tz),
+ new DateTime('2012-01-10 14:00:00',$tz),
+ new DateTime('2012-01-11 12:00:00',$tz),
+ new DateTime('2012-01-12 12:00:00',$tz),
+ new DateTime('2012-01-14 12:00:00',$tz),
+ new DateTime('2012-01-15 12:00:00',$tz),
+ new DateTime('2012-01-15 14:00:00',$tz),
+ new DateTime('2012-01-16 12:00:00',$tz),
+ ), $dates);
+
+ $this->assertEquals(array(
+ 'baseEvent',
+ 'baseEvent',
+ 'baseEvent',
+ 'Event 2',
+ 'baseEvent',
+ 'baseEvent',
+ 'baseEvent',
+ 'baseEvent',
+ 'Event 3',
+ 'baseEvent',
+ ), $summaries);
+
+ }
+
+ /**
+ * @depends testValues
+ */
+ function testOverridenEvent2() {
+
+ $vcal = Component::create('VCALENDAR');
+
+ $ev1 = Component::create('VEVENT');
+ $ev1->UID = 'overridden';
+ $ev1->RRULE = 'FREQ=WEEKLY;COUNT=3';
+ $ev1->DTSTART = '20120112T120000Z';
+ $ev1->SUMMARY = 'baseEvent';
+
+ $vcal->add($ev1);
+
+ // ev2 overrides an event, and puts it 6 days earlier instead.
+ $ev2 = Component::create('VEVENT');
+ $ev2->UID = 'overridden';
+ $ev2->{'RECURRENCE-ID'} = '20120119T120000Z';
+ $ev2->DTSTART = '20120113T120000Z';
+ $ev2->SUMMARY = 'Override!';
+
+ $vcal->add($ev2);
+
+ $it = new RecurrenceIterator($vcal,'overridden');
+
+ $dates = array();
+ $summaries = array();
+ while($it->valid()) {
+
+ $dates[] = $it->getDTStart();
+ $summaries[] = (string)$it->getEventObject()->SUMMARY;
+ $it->next();
+
+ }
+
+ $tz = new DateTimeZone('GMT');
+ $this->assertEquals(array(
+ new DateTime('2012-01-12 12:00:00',$tz),
+ new DateTime('2012-01-13 12:00:00',$tz),
+ new DateTime('2012-01-26 12:00:00',$tz),
+
+ ), $dates);
+
+ $this->assertEquals(array(
+ 'baseEvent',
+ 'Override!',
+ 'baseEvent',
+ ), $summaries);
+
+ }
+
+ /**
+ * @depends testValues
+ */
+ function testOverridenEventNoValuesExpected() {
+
+ $vcal = Component::create('VCALENDAR');
+
+ $ev1 = Component::create('VEVENT');
+ $ev1->UID = 'overridden';
+ $ev1->RRULE = 'FREQ=WEEKLY;COUNT=3';
+ $ev1->DTSTART = '20120124T120000Z';
+ $ev1->SUMMARY = 'baseEvent';
+
+ $vcal->add($ev1);
+
+ // ev2 overrides an event, and puts it 6 days earlier instead.
+ $ev2 = Component::create('VEVENT');
+ $ev2->UID = 'overridden';
+ $ev2->{'RECURRENCE-ID'} = '20120131T120000Z';
+ $ev2->DTSTART = '20120125T120000Z';
+ $ev2->SUMMARY = 'Override!';
+
+ $vcal->add($ev2);
+
+ $it = new RecurrenceIterator($vcal,'overridden');
+
+ $dates = array();
+ $summaries = array();
+
+ // The reported problem was specifically related to the VCALENDAR
+ // expansion. In this parcitular case, we had to forward to the 28th of
+ // january.
+ $it->fastForward(new DateTime('2012-01-28 23:00:00'));
+
+ // We stop the loop when it hits the 6th of februari. Normally this
+ // iterator would hit 24, 25 (overriden from 31) and 7 feb but because
+ // we 'filter' from the 28th till the 6th, we should get 0 results.
+ while($it->valid() && $it->getDTSTart() < new DateTime('2012-02-06 23:00:00')) {
+
+ $dates[] = $it->getDTStart();
+ $summaries[] = (string)$it->getEventObject()->SUMMARY;
+ $it->next();
+
+ }
+
+ $this->assertEquals(array(), $dates);
+ $this->assertEquals(array(), $summaries);
+
+ }
+}
+
diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/SlashRTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/SlashRTest.php
new file mode 100644
index 000000000..ebbfb04a7
--- /dev/null
+++ b/vendor/sabre/vobject/tests/Sabre/VObject/SlashRTest.php
@@ -0,0 +1,19 @@
+<?php
+
+namespace Sabre\VObject;
+
+/**
+ * This issue was pointed out in Issue 55. \r should be stripped completely
+ * when encoding property values.
+ */
+class SlashRTest extends \PHPUnit_Framework_TestCase {
+
+ function testEncode() {
+
+ $prop = new \Sabre\VObject\Property('test', "abc\r\ndef");
+ $this->assertEquals("TEST:abc\\ndef\r\n", $prop->serialize());
+
+ }
+
+
+}
diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/Splitter/ICalendarTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/Splitter/ICalendarTest.php
new file mode 100644
index 000000000..43613350f
--- /dev/null
+++ b/vendor/sabre/vobject/tests/Sabre/VObject/Splitter/ICalendarTest.php
@@ -0,0 +1,283 @@
+<?php
+
+namespace Sabre\VObject\Splitter;
+
+use Sabre\VObject;
+
+class ICalendarSplitterTest extends \PHPUnit_Framework_TestCase {
+
+ protected $version;
+
+ function setup() {
+ $this->version = VObject\Version::VERSION;
+ }
+
+ function createStream($data) {
+
+ $stream = fopen('php://memory','r+');
+ fwrite($stream, $data);
+ rewind($stream);
+ return $stream;
+
+ }
+
+ function testICalendarImportValidEvent() {
+
+ $data = <<<EOT
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+UID:foo
+END:VEVENT
+END:VCALENDAR
+EOT;
+ $tempFile = $this->createStream($data);
+
+ $objects = new ICalendar($tempFile);
+
+ $return = "";
+ while($object=$objects->getNext()) {
+ $return .= $object->serialize();
+ }
+ $this->assertEquals(array(), VObject\Reader::read($return)->validate());
+ }
+
+ function testICalendarImportEndOfData() {
+ $data = <<<EOT
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+UID:foo
+END:VEVENT
+END:VCALENDAR
+EOT;
+ $tempFile = $this->createStream($data);
+
+ $objects = new ICalendar($tempFile);
+
+ $return = "";
+ while($object=$objects->getNext()) {
+ $return .= $object->serialize();
+ }
+ $this->assertNull($object=$objects->getNext());
+ }
+
+ /**
+ * @expectedException Sabre\VObject\ParseException
+ */
+ function testICalendarImportInvalidEvent() {
+ $data = <<<EOT
+EOT;
+ $tempFile = $this->createStream($data);
+
+ $objects = new ICalendar($tempFile);
+ }
+
+ function testICalendarImportMultipleValidEvents() {
+
+ $event[] = <<<EOT
+BEGIN:VEVENT
+UID:foo1
+END:VEVENT
+EOT;
+
+$event[] = <<<EOT
+BEGIN:VEVENT
+UID:foo2
+END:VEVENT
+EOT;
+
+ $data = <<<EOT
+BEGIN:VCALENDAR
+$event[0]
+$event[1]
+END:VCALENDAR
+
+EOT;
+ $tempFile = $this->createStream($data);
+
+ $objects = new ICalendar($tempFile);
+
+ $return = "";
+ $i = 0;
+ while($object=$objects->getNext()) {
+
+ $expected = <<<EOT
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Sabre//Sabre VObject $this->version//EN
+CALSCALE:GREGORIAN
+$event[$i]
+END:VCALENDAR
+
+EOT;
+
+ $return .= $object->serialize();
+ $expected = str_replace("\n", "\r\n", $expected);
+ $this->assertEquals($expected, $object->serialize());
+ $i++;
+ }
+ $this->assertEquals(array(), VObject\Reader::read($return)->validate());
+ }
+
+ function testICalendarImportEventWithoutUID() {
+
+ $data = <<<EOT
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Sabre//Sabre VObject $this->version//EN
+CALSCALE:GREGORIAN
+BEGIN:VEVENT
+END:VEVENT
+END:VCALENDAR
+
+EOT;
+ $tempFile = $this->createStream($data);
+
+ $objects = new ICalendar($tempFile);
+
+ $return = "";
+ while($object=$objects->getNext()) {
+ $expected = str_replace("\n", "\r\n", $data);
+ $this->assertEquals($expected, $object->serialize());
+ $return .= $object->serialize();
+ }
+
+ $this->assertEquals(array(), VObject\Reader::read($return)->validate());
+ }
+
+ function testICalendarImportMultipleVTIMEZONESAndMultipleValidEvents() {
+
+ $timezones = <<<EOT
+BEGIN:VTIMEZONE
+TZID:Europe/Berlin
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+DTSTART:19810329T020000
+TZNAME:MESZ
+TZOFFSETTO:+0200
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+DTSTART:19961027T030000
+TZNAME:MEZ
+TZOFFSETTO:+0100
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VTIMEZONE
+TZID:Europe/London
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+DTSTART:19810329T010000
+TZNAME:GMT+01:00
+TZOFFSETTO:+0100
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+DTSTART:19961027T020000
+TZNAME:GMT
+TZOFFSETTO:+0000
+END:STANDARD
+END:VTIMEZONE
+EOT;
+
+ $event[] = <<<EOT
+BEGIN:VEVENT
+UID:foo1
+END:VEVENT
+EOT;
+
+ $event[] = <<<EOT
+BEGIN:VEVENT
+UID:foo2
+END:VEVENT
+EOT;
+
+ $event[] = <<<EOT
+BEGIN:VEVENT
+UID:foo3
+END:VEVENT
+EOT;
+
+ $data = <<<EOT
+BEGIN:VCALENDAR
+$timezones
+$event[0]
+$event[1]
+$event[2]
+END:VCALENDAR
+
+EOT;
+ $tempFile = $this->createStream($data);
+
+ $objects = new ICalendar($tempFile);
+
+ $return = "";
+ $i = 0;
+ while($object=$objects->getNext()) {
+
+ $expected = <<<EOT
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Sabre//Sabre VObject $this->version//EN
+CALSCALE:GREGORIAN
+$timezones
+$event[$i]
+END:VCALENDAR
+
+EOT;
+ $expected = str_replace("\n", "\r\n", $expected);
+
+ $this->assertEquals($expected, $object->serialize());
+ $return .= $object->serialize();
+ $i++;
+
+ }
+
+ $this->assertEquals(array(), VObject\Reader::read($return)->validate());
+ $this->assertEquals(array(), VObject\Reader::read($return)->validate());
+ }
+
+ function testICalendarImportWithOutVTIMEZONES() {
+
+ $data = <<<EOT
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Apple Inc.//Mac OS X 10.8//EN
+CALSCALE:GREGORIAN
+BEGIN:VEVENT
+CREATED:20120605T072109Z
+UID:D6716295-C10F-4B20-82F9-E1A3026C7DCF
+DTEND;VALUE=DATE:20120717
+TRANSP:TRANSPARENT
+SUMMARY:Start Vorbereitung
+DTSTART;VALUE=DATE:20120716
+DTSTAMP:20120605T072115Z
+SEQUENCE:2
+BEGIN:VALARM
+X-WR-ALARMUID:A99EDA6A-35EB-4446-B8BC-CDA3C60C627D
+UID:A99EDA6A-35EB-4446-B8BC-CDA3C60C627D
+TRIGGER:-PT15H
+X-APPLE-DEFAULT-ALARM:TRUE
+ATTACH;VALUE=URI:Basso
+ACTION:AUDIO
+END:VALARM
+END:VEVENT
+END:VCALENDAR
+
+EOT;
+ $tempFile = $this->createStream($data);
+
+ $objects = new ICalendar($tempFile);
+
+ $return = "";
+ while($object=$objects->getNext()) {
+ $return .= $object->serialize();
+ }
+
+ $this->assertEquals(array(), VObject\Reader::read($return)->validate());
+ }
+
+}
diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/Splitter/VCardTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/Splitter/VCardTest.php
new file mode 100644
index 000000000..b6b41925f
--- /dev/null
+++ b/vendor/sabre/vobject/tests/Sabre/VObject/Splitter/VCardTest.php
@@ -0,0 +1,138 @@
+<?php
+
+namespace Sabre\VObject\Splitter;
+
+use Sabre\VObject;
+
+class VCardSplitterTest extends \PHPUnit_Framework_TestCase {
+
+ function createStream($data) {
+
+ $stream = fopen('php://memory','r+');
+ fwrite($stream, $data);
+ rewind($stream);
+ return $stream;
+
+ }
+
+ function testVCardImportValidVCard() {
+ $data = <<<EOT
+BEGIN:VCARD
+UID:foo
+END:VCARD
+EOT;
+ $tempFile = $this->createStream($data);
+
+ $objects = new VCard($tempFile);
+
+ $return = "";
+ while($object=$objects->getNext()) {
+ $return .= $object->serialize();
+ }
+
+ VObject\Reader::read($return);
+ }
+
+ function testVCardImportValidVCardsWithCategories() {
+ $data = <<<EOT
+BEGIN:VCARD
+UID:card-in-foo1-and-foo2
+CATEGORIES:foo1\,foo2
+END:VCARD
+BEGIN:VCARD
+UID:card-in-foo1
+CATEGORIES:foo1
+END:VCARD
+BEGIN:VCARD
+UID:card-in-foo3
+CATEGORIES:foo3
+END:VCARD
+BEGIN:VCARD
+UID:card-in-foo1-and-foo3
+CATEGORIES:foo1\,foo3
+END:VCARD
+EOT;
+ $tempFile = $this->createStream($data);
+
+ $objects = new VCard($tempFile);
+
+ $return = "";
+ while($object=$objects->getNext()) {
+ $return .= $object->serialize();
+ }
+
+ VObject\Reader::read($return);
+ }
+
+ function testVCardImportEndOfData() {
+ $data = <<<EOT
+BEGIN:VCARD
+UID:foo
+END:VCARD
+EOT;
+ $tempFile = $this->createStream($data);
+
+ $objects = new VCard($tempFile);
+ $object=$objects->getNext();
+
+ $this->assertFalse($object=$objects->getNext());
+
+
+ }
+
+ /**
+ * @expectedException InvalidArgumentException
+ */
+ function testVCardImportCheckInvalidArgumentException() {
+ $data = <<<EOT
+BEGIN:FOO
+END:FOO
+EOT;
+ $tempFile = $this->createStream($data);
+
+ $objects = new VCard($tempFile);
+ while($object=$objects->getNext()) {
+ $return .= $object->serialize();
+ }
+
+ }
+
+ function testVCardImportMultipleValidVCards() {
+ $data = <<<EOT
+BEGIN:VCARD
+UID:foo
+END:VCARD
+BEGIN:VCARD
+UID:foo
+END:VCARD
+EOT;
+ $tempFile = $this->createStream($data);
+
+ $objects = new VCard($tempFile);
+
+ $return = "";
+ while($object=$objects->getNext()) {
+ $return .= $object->serialize();
+ }
+
+ VObject\Reader::read($return);
+ }
+
+ function testVCardImportVCardWithoutUID() {
+ $data = <<<EOT
+BEGIN:VCARD
+END:VCARD
+EOT;
+ $tempFile = $this->createStream($data);
+
+ $objects = new VCard($tempFile);
+
+ $return = "";
+ while($object=$objects->getNext()) {
+ $return .= $object->serialize();
+ }
+
+ VObject\Reader::read($return);
+ }
+
+}
diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/StringUtilTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/StringUtilTest.php
new file mode 100644
index 000000000..59a83d294
--- /dev/null
+++ b/vendor/sabre/vobject/tests/Sabre/VObject/StringUtilTest.php
@@ -0,0 +1,59 @@
+<?php
+
+namespace Sabre\VObject;
+
+class StringUtilTest extends \PHPUnit_Framework_TestCase {
+
+ function testNonUTF8() {
+
+ $string = StringUtil::isUTF8(chr('0xbf'));
+
+ $this->assertEquals(false, $string);
+
+ }
+
+ function testIsUTF8() {
+
+ $string = StringUtil::isUTF8('I 💚 SabreDAV');
+
+ $this->assertEquals(true, $string);
+
+ }
+
+ function testUTF8ControlChar() {
+
+ $string = StringUtil::isUTF8(chr('0x00'));
+
+ $this->assertEquals(false, $string);
+
+ }
+
+ function testConvertToUTF8nonUTF8() {
+
+ $string = StringUtil::convertToUTF8(chr('0xbf'));
+
+ $this->assertEquals(utf8_encode(chr('0xbf')), $string);
+
+ }
+
+ function testConvertToUTF8IsUTF8() {
+
+ $string = StringUtil::convertToUTF8('I 💚 SabreDAV');
+
+ $this->assertEquals('I 💚 SabreDAV', $string);
+
+ }
+
+ function testConvertToUTF8ControlChar() {
+
+ $string = StringUtil::convertToUTF8(chr(0x00));
+
+ $this->assertEquals('', $string);
+
+ }
+
+
+
+
+
+}
diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/TimeZoneUtilTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/TimeZoneUtilTest.php
new file mode 100644
index 000000000..7f76353d2
--- /dev/null
+++ b/vendor/sabre/vobject/tests/Sabre/VObject/TimeZoneUtilTest.php
@@ -0,0 +1,297 @@
+<?php
+
+namespace Sabre\VObject;
+
+class TimezoneUtilTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * @dataProvider getMapping
+ */
+ function testCorrectTZ($timezoneName) {
+
+ $tz = new \DateTimeZone($timezoneName);
+
+ }
+
+ function getMapping() {
+
+ // PHPUNit requires an array of arrays
+ return array_map(
+ function($value) {
+ return array($value);
+ },
+ TimeZoneUtil::$map
+ );
+
+ }
+
+ function testExchangeMap() {
+
+ $vobj = <<<HI
+BEGIN:VCALENDAR
+METHOD:REQUEST
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:foo
+X-MICROSOFT-CDO-TZID:2
+BEGIN:STANDARD
+DTSTART:16010101T030000
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+RRULE:FREQ=YEARLY;WKST=MO;INTERVAL=1;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:16010101T020000
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+RRULE:FREQ=YEARLY;WKST=MO;INTERVAL=1;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+END:VTIMEZONE
+BEGIN:VEVENT
+DTSTAMP:20120416T092149Z
+DTSTART;TZID="foo":20120418T1
+ 00000
+SUMMARY:Begin Unterhaltsreinigung
+UID:040000008200E00074C5B7101A82E0080000000010DA091DC31BCD01000000000000000
+ 0100000008FECD2E607780649BE5A4C9EE6418CBC
+ 000
+END:VEVENT
+END:VCALENDAR
+HI;
+
+ $tz = TimeZoneUtil::getTimeZone('foo', Reader::read($vobj));
+ $ex = new \DateTimeZone('Europe/Lisbon');
+
+ $this->assertEquals($ex->getName(), $tz->getName());
+
+ }
+
+ function testWetherMicrosoftIsStillInsane() {
+
+ $vobj = <<<HI
+BEGIN:VCALENDAR
+METHOD:REQUEST
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:(GMT+01.00) Sarajevo/Warsaw/Zagreb
+X-MICROSOFT-CDO-TZID:2
+BEGIN:STANDARD
+DTSTART:16010101T030000
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+RRULE:FREQ=YEARLY;WKST=MO;INTERVAL=1;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
+HI;
+
+ $tz = TimeZoneUtil::getTimeZone('(GMT+01.00) Sarajevo/Warsaw/Zagreb', Reader::read($vobj));
+ $ex = new \DateTimeZone('Europe/Sarajevo');
+
+ $this->assertEquals($ex->getName(), $tz->getName());
+
+ }
+
+ function testUnknownExchangeId() {
+
+ $vobj = <<<HI
+BEGIN:VCALENDAR
+METHOD:REQUEST
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:foo
+X-MICROSOFT-CDO-TZID:2000
+BEGIN:STANDARD
+DTSTART:16010101T030000
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+RRULE:FREQ=YEARLY;WKST=MO;INTERVAL=1;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:16010101T020000
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+RRULE:FREQ=YEARLY;WKST=MO;INTERVAL=1;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+END:VTIMEZONE
+BEGIN:VEVENT
+DTSTAMP:20120416T092149Z
+DTSTART;TZID="foo":20120418T1
+ 00000
+SUMMARY:Begin Unterhaltsreinigung
+UID:040000008200E00074C5B7101A82E0080000000010DA091DC31BCD01000000000000000
+ 0100000008FECD2E607780649BE5A4C9EE6418CBC
+DTEND;TZID="Sarajevo, Skopje, Sofija, Vilnius, Warsaw, Zagreb":20120418T103
+ 000
+END:VEVENT
+END:VCALENDAR
+HI;
+
+ $tz = TimeZoneUtil::getTimeZone('foo', Reader::read($vobj));
+ $ex = new \DateTimeZone(date_default_timezone_get());
+ $this->assertEquals($ex->getName(), $tz->getName());
+
+ }
+
+ function testWindowsTimeZone() {
+
+ $tz = TimeZoneUtil::getTimeZone('Eastern Standard Time');
+ $ex = new \DateTimeZone('America/New_York');
+ $this->assertEquals($ex->getName(), $tz->getName());
+
+ }
+
+ function testTimezoneOffset() {
+
+ $tz = TimeZoneUtil::getTimeZone('GMT-0400', null, true);
+ $ex = new \DateTimeZone('Etc/GMT-4');
+ $this->assertEquals($ex->getName(), $tz->getName());
+
+ }
+
+ /**
+ * @expectedException InvalidArgumentException
+ */
+ function testTimezoneFail() {
+
+ $tz = TimeZoneUtil::getTimeZone('FooBar',null,true);
+
+ }
+
+ function testFallBack() {
+
+ $vobj = <<<HI
+BEGIN:VCALENDAR
+METHOD:REQUEST
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:foo
+BEGIN:STANDARD
+DTSTART:16010101T030000
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+RRULE:FREQ=YEARLY;WKST=MO;INTERVAL=1;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:16010101T020000
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+RRULE:FREQ=YEARLY;WKST=MO;INTERVAL=1;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+END:VTIMEZONE
+BEGIN:VEVENT
+DTSTAMP:20120416T092149Z
+DTSTART;TZID="foo":20120418T1
+ 00000
+SUMMARY:Begin Unterhaltsreinigung
+UID:040000008200E00074C5B7101A82E0080000000010DA091DC31BCD01000000000000000
+ 0100000008FECD2E607780649BE5A4C9EE6418CBC
+ 000
+END:VEVENT
+END:VCALENDAR
+HI;
+
+ $tz = TimeZoneUtil::getTimeZone('foo', Reader::read($vobj));
+ $ex = new \DateTimeZone(date_default_timezone_get());
+ $this->assertEquals($ex->getName(), $tz->getName());
+
+ }
+
+ function testLjubljanaBug() {
+
+ $vobj = <<<HI
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+PRODID:-//Ximian//NONSGML Evolution Calendar//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/freeassociation.sourceforge.net/Tzfile/Europe/Ljubljana
+X-LIC-LOCATION:Europe/Ljubljana
+BEGIN:STANDARD
+TZNAME:CET
+DTSTART:19701028T030000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:CEST
+DTSTART:19700325T020000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=3
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+END:DAYLIGHT
+END:VTIMEZONE
+BEGIN:VEVENT
+UID:foo
+DTSTART;TZID=/freeassociation.sourceforge.net/Tzfile/Europe/Ljubljana:
+ 20121003T080000
+DTEND;TZID=/freeassociation.sourceforge.net/Tzfile/Europe/Ljubljana:
+ 20121003T083000
+TRANSP:OPAQUE
+SEQUENCE:2
+SUMMARY:testing
+CREATED:20121002T172613Z
+LAST-MODIFIED:20121002T172613Z
+END:VEVENT
+END:VCALENDAR
+
+HI;
+
+
+ $tz = TimeZoneUtil::getTimeZone('/freeassociation.sourceforge.net/Tzfile/Europe/Ljubljana', Reader::read($vobj));
+ $ex = new \DateTimeZone('Europe/Ljubljana');
+ $this->assertEquals($ex->getName(), $tz->getName());
+
+ }
+
+ function testWeirdSystemVLICs() {
+
+$vobj = <<<HI
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+PRODID:-//Ximian//NONSGML Evolution Calendar//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/freeassociation.sourceforge.net/Tzfile/SystemV/EST5EDT
+X-LIC-LOCATION:SystemV/EST5EDT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19701104T020000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=11
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19700311T020000
+RRULE:FREQ=YEARLY;BYDAY=2SU;BYMONTH=3
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+END:VTIMEZONE
+BEGIN:VEVENT
+UID:20121026T021107Z-6301-1000-1-0@chAir
+DTSTAMP:20120905T172126Z
+DTSTART;TZID=/freeassociation.sourceforge.net/Tzfile/SystemV/EST5EDT:
+ 20121026T153000
+DTEND;TZID=/freeassociation.sourceforge.net/Tzfile/SystemV/EST5EDT:
+ 20121026T160000
+TRANSP:OPAQUE
+SEQUENCE:5
+SUMMARY:pick up Ibby
+CLASS:PUBLIC
+CREATED:20121026T021108Z
+LAST-MODIFIED:20121026T021118Z
+X-EVOLUTION-MOVE-CALENDAR:1
+END:VEVENT
+END:VCALENDAR
+HI;
+
+ $tz = TimeZoneUtil::getTimeZone('/freeassociation.sourceforge.net/Tzfile/SystemV/EST5EDT', Reader::read($vobj), true);
+ $ex = new \DateTimeZone('EST5EDT');
+ $this->assertEquals($ex->getName(), $tz->getName());
+
+ }
+
+}
diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/VersionTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/VersionTest.php
new file mode 100644
index 000000000..ae6855e85
--- /dev/null
+++ b/vendor/sabre/vobject/tests/Sabre/VObject/VersionTest.php
@@ -0,0 +1,17 @@
+<?php
+
+namespace Sabre\VObject;
+
+class VersionTest extends \PHPUnit_Framework_TestCase {
+
+ function testString() {
+
+ $v = Version::VERSION;
+ $this->assertEquals(-1, version_compare('0.9.0',$v));
+
+ $s = Version::STABILITY;
+ $this->assertTrue($s == 'alpha' || $s == 'beta' || $s =='stable');
+
+ }
+
+}
diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/issue153.vcf b/vendor/sabre/vobject/tests/Sabre/VObject/issue153.vcf
new file mode 100644
index 000000000..5fb0fa297
--- /dev/null
+++ b/vendor/sabre/vobject/tests/Sabre/VObject/issue153.vcf
@@ -0,0 +1,352 @@
+BEGIN:VCARD
+VERSION:3.0
+N:Benutzer;Test;;;
+FN:Test Benutzer
+PHOTO;BASE64:
+ /9j/4AAQSkZJRgABAQAAAQABAAD/4QBYRXhpZgAATU0AKgAAAAgAAgESAAMAAAABAAEAAIdpAAQA
+ AAABAAAAJgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAABQKADAAQAAAABAAABQAAAAAD/2wBD
+ AAIBAQIBAQICAQICAgICAwUDAwMDAwYEBAMFBwYHBwcGBgYHCAsJBwgKCAYGCQ0JCgsLDAwMBwkN
+ Dg0MDgsMDAv/2wBDAQICAgMCAwUDAwULCAYICwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsL
+ CwsLCwsLCwsLCwsLCwsLCwsLCwv/wAARCAFAAUADASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAA
+ AAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKB
+ kaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZn
+ aGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT
+ 1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcI
+ CQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAV
+ YnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6
+ goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk
+ 5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD8J7JbO8tYo1tIFCDLOVG5qfdaVZRwmSOFWzyA
+ F4H1rLt5WViMhdp6HgmtKK8O3B+4Rhx6fSgBI9FtjaNN5aErwRjilSys7lFAt41xyTtqc2yJCVlY
+ 7eqgGqv2jyLcebjZnGPWncdzT0+w0u5eQXtrGiBcIyoPmNMXwpb/AGMTSRRbH6YAyPwqK21GKdfL
+ BAVfu+1SQX4jnjKFsp03dPypCKN9oEaKSkC7R0bGKpnSlSPdHErZOORXV3Ouy337sCLB6kpx+FY0
+ t+VfyrgcbuCB1oAfoMemrcImq2sZX+I7ATXS618PdK1DRlvvDEaMq5LoV2nisx4LVrUfu5BOePau
+ m8EQS6PY3HmFXjljKhTzjOf1oA4mz8OxvMrLbW5RD8wbByKg1LRrRriRYY408w/KAMba1pRaWt/H
+ a6a7CVm2u7N8lUPEujzaRekzSK6tgqVNAGNBZJauY5Yon92GTRJp0ROY0Un0A4q3c2odkaYOMjii
+ KL7NIDGcj1NDAZBplmmWv1xnoFHStfS/DFpewqYoYm3DutZ8lv8AapdyOqk8EVteEbSe3KBSrDrQ
+ BT8S+HbawiiWGCAPjsuMnPesqHS4JSFlSMP7DitbXbvfrkkM2eGw3p+FMfTh5X+hr8w7t3oAhOhW
+ u8MkMZUY3fL0Heo9UsrN5FFrbxKmMBgoG41fWFra0Acjpzg9aoXjtgRoo29vagCoun27kbY059qn
+ bwykskYjRArdTT7GEl2UqMr2q/JtVU27iR15NADdK8DC/wBPle2iicxNg5ALH6Umm6FZ/a3ttQt4
+ g2Cqnb0PbJ+tamn3j6ZCW0nILfeBORWVfO4dhLw7fMW7560AZuqeHf7MuTFcRpv6qVGVx70q2Eci
+ QwyW0SsPvOqjJrUtb6S9tHQKGeMZYuM8VUs7gRxbrncy9mWgB1x4QtTHvsQWkHJVhhax3tkhugHh
+ UkfeAXIFdPZ3v2uxkQ9G4jI6/j+tYun3r2Fy6yxeb2Py5IoAqXenJ5xaGNNvXH/1qcLSGeBdkSg9
+ CcdaswC3be0pfexOMnpn2qaS1KQkQASKoydvLCgDNi09RKTNCuO2BxVjSobc6gqXMERQHkleDUsc
+ u9VADbG6qOWAp11bLbptkjlCkZRsde9AFi5sbO3kKfZYTnkHaOlVbuO2F5thtYcADjaKXUpHj8ku
+ Co2VDFL5wLeg696YFwQ2z7Qtlb8HJO0c1Zsr7T7a9kL6XazZ4CmMFRWfHdkEgjGRjPpU9raP5LSP
+ j5h2pAWdQ0+z1KdG+y21qvcRqBn8qXSvC+iTu63ssqyE/IAuR+NQwSrGm1g+c8E9qiSQW9wPNYYP
+ OR2oAW68GNa28k3lwGNHwvzDJGfSqM9nHBgm3j59QMVdmma4zIjsUBHy5OKp6o8s2BJjZjjAoAro
+ /nysbgYY9zWmLPCR+WQQwyaz4k2F/Pbft/GtKxvUeFN+B2x+NAEptsWpZSdo9etZe8su2X7pPFdU
+ LeOazKqVwevNYt7pw5EA5HIxQBQA8tAIeGz1NWIJvJlhW5OQBzjrUMR/eN9pwoXjB4qQ3ERJeYcy
+ 9P8AZoA0jf8AmybVxsHAFS6jp63ixmwjIwOfrWfaou12GcDpmt/w5qJhXc6hh2GM0AZkHiRpblVl
+ G0RjGMdxXQ+H/E0Rm+bjdw1crqEHm3EksY4Y9PTmq0cskc42qUOfpmgDovHOhLBOZ9O+aEnIUdRW
+ QZft1sgum/1Ywua3fDfiFDL5WoEPEwxzzirPizwTFPZC60kYUjcAp4NAHPSq91EoRS3061DHD9nb
+ 94Mkfw020v57GbcCRt4IIqzNcedIH2jc3JyOaAIYrRZmJxtNdB4fkGn2hluBgBR+NZ2n2X9ozAQD
+ 5qvaxGbKIRXkuFU4C96AMDxBKZdQkuEUkStuUegpNM1eWScAkqpHTHNPlwbjMzExZ4Pal1PS/s6+
+ dY/6vuwPSgC9G8c0A+1xEknrnpUVxaeXNm2dVUfjVazvEZAEkMrccZzV1YYyBIhJP8SZ6fhQBSmV
+ 4JfMVT+96UJdSQdcMO4A6fjVmTUoJiqTOMJ/q+elRyQs0TtaxF0PVhzmgCzpd55r7YI2HHPTmrV0
+ sDTF7gnJXGO4OKyNKgn80NbFhjoBzWjqdg6SISPmIBOaAKVnI1leyhsMJOD7CqOqRtZqotjiFulW
+ rhsSMshKH1ogsZbmF475TKifdf0oApabevHIAhCYOdxp0t59luS0I+995uxqpdRyWsrqmXGeCR/K
+ rVlZfaogqv8AvD/CaAIY42kV3K5zzn1p9jNLp6u/A80YPNWWsJNPAVpC4JAZT2HfFWJoVmVVjhVk
+ HTPrQBPoi2wsoo4APtBHL+tP1mS5uVEFxgJGNqH15plp5WmyBriMRsowM8UybXTNdbrpd6A/KKAD
+ xbJAGs44FIPlnd9c/wD16ynt/LiDW2SR2qa5vP7RnMs6BNuQMd6jhkAUb2K8+tADYp0fhj8w6itC
+ yQ3CFYeAOoqi8Uew+UMuf4u9T2NwIW+UgMetO4FmS6RJ1ik6HqxHAqC+gimUiA8DvjrU0kcE8ieY
+ itu+8c0+bShaWxksSZoM4b0SkBTgha0cq33Cuc1SvrrLFV6jpWqbuGe1HnnDdAKy7i3WSY7OT2NN
+ AMulWSV8ZDNzxV7SlbaFjClx69Kpww7W3ct7jpUtnNJHd5UjZnt1NIDdt7h7NQ7qGfpt7VR1XVEh
+ dhEpP94/4VpafexTy7ZlbBGDVHxFbQh1j04HaOTkdKAM5ZVlYso3E+tVp4w8gx0Bqd7QxNu+6D6V
+ DIoVySxAx2NAFyNmli2pjYBz61paW3lWrFS3BwP8/hWJbTBFJy2D6HgfWtiTWPsqxraBHyOeBg0A
+ RSoLSTdIepzz0606exTWyQGMXljORTNT1B7+ECZR5fHzDqapfbHjbFkTsIwSTQA43ptyyS44Paun
+ 8N64Z7Bre4YlZBtU5+7XLTQbjwN4Pb+IfWn2lw9uyrIw2Z5HpQBv3GirHc7LxWVZOVI71FNp7WDg
+ QYlIIGD6VvaPdi+tljb5yeAzcn8DT9YtbPSpVhDM87jJ3Htjnn6UAUIrJreD7Si7MDoKhv8AUxqt
+ pGt5GqIOr9zRfLM8ZFgZGtex2nGe4zWKN8rsDhYx2JpJ3Atx+HxcRSzWcpcL/CRwaj0zW1sQy3cS
+ nsFPSoYJpbIl7dm8tT8wzV7+0hqEO1Y4lQ9cqMn9KoCp9kW7kaaxU+Yx+5j5etWrb/RGxfr5bkdu
+ lW7KFILpfspDbVyc1fjNnrLtHqOYWP8AFjGfxpAc/e6Ql/GzW4AfqBWfpupS6Xer5vPlHmMjg10V
+ 5pp0u4JhYNGvAYHrUn2WLWrVo41AvSMRZAC/8CPr1oAvafdWOuNG+lqDekY+zg8MPXPX/wDXWZrF
+ tcWNw0erKElB4Rf4R6c1BpqyaBdbrnEcwyAc4x06H0rQS9a9jUTgOXPzMwycexoAw7u1jYb3zkU3
+ Srtgdk54PFamv2C2pDQbWjcfKCeSa56aJld23YA6ZOKFqBrXGjjULuOKxKuZOTn+H/OKwr/ztOvs
+ uCrg7RgVLYapPbXAEW4EkHJNdBNBH4gtgyhFmXuw60AVpbT7VpiPJ94jLetQWsDRSIYz8mec1c0+
+ 1nexdrw7GjJXk/epsFtDPG0bOdw+b5SaAKWsXA+14Y71FQi5S4RvlAC8A0y5hHmHarhvQ9BVGSQx
+ sUXPHX3oAmDCJ8rzgHg96gQ+ZGWbg9vahNRG7EnalkkF6hEXyD270MCWF3aEhdue1OsmNnMAih/r
+ VaBgAUY8561PaubdnMxJXseuKANhIY5Assp2v12itZtAgubEi2nb5xuKYHWubstQaO6SVzujTqpP
+ X8K2rXWLRF8xZJPMfjAzgUAcxcNiaRSpUocc96sW+yNgZCMVF4lvJdRvTOYkj52jbgZ98D6VWmlY
+ 2qCUnJOKaVwCzviibANwYc8Utkdl7tbKhjxmpUspvm8tgn16ipigSEG4G4pxu9TSA27GeFbRlGGm
+ P3cdhUN8GEP2hV3JjafrWfpU/wBmuAcZLA4/Sr1trkarJHcRmSEZO3uTQBmrcbZCLoDZ2x1qOHSi
+ yebJIAPQipp4kmbzI1EQJ6GtCxsoHP8Ap91GB2yDQBlSWO+M/ZsBHHzZ71XkfMIWNgGU9vSt3U9N
+ t9m21uonz0Iz/hVCfRkjg82FhtHDGgCuZ8EMjDZjBzSZ8pAwU7XbGT0pWtEjjAZgV4PFOml2QKqk
+ OoOcU1qBNYRSrdkrhw3BIrah8KwXoV/m3PyVzyDWNp999kccgZq/ea7PFAGgZlJ6EUgN23thpdi4
+ V1Eucr7ev9K53V/ER1a/MkuWdBtG04zioLrXJ5wDK2XAxmqVqmZ2YPtHJ/GgDsvC3i0ppr2d2ish
+ yFAHIz706bRLNdOPnErKw4y3NcvZ3pjA8o4kB61o3OpSX9nbx3QIkU/MwoAj/sGaPzFjlWSJjk46
+ ioYYwqssjIHHAHpWm4ESN9nYDIFZV+I7uVI1wrY5b1oAtafcvb3W4MM9Nx6U/VZpNRys54ToU4zW
+ KXaDKrJuC8cVdtpi1gzs43HNAD9N195bdYtRIUR4wD1NX2KuA9uThuSQelcsZwzq9xyzfezV/SdX
+ e3m8pXJhkPKkUAdYZk8RywjVVJES7U2cE/WtA+HDHohuY3Uxg7RF/GeaPBlxaawMW6rHKnAU9SOO
+ lX/FFv8A2bpzTQk+cpAAz93nrQBx+r4c5CODEOA3Y+wrKu5V1C1GFKznkk9K6Wzv49fs8Xf7y7DY
+ MhGNgrmtX0s2t66WknnKvUp0/WgCnbrJFdot0NwJxkDFdDYp86oMjjIArJivxbR7LuMyEjKitS21
+ MW8auuW44H93/PFAG15aXdr5Uv7uULkA/wCFc+Yvstw0at8+eoq/p+rm6vRJMNwIx9KranYySXSy
+ WEZZHOCw7UARXFyj5STAk7ntWVf2gALLyfUVoataLbfLO2SO/Ws2c+VwhLK3QDpQBmz2xAyCG56d
+ 6uWPlnCkFcjoTzUBkMc/3cZpwn8oZkDFs8HsKALN1apDIHOeaiLkRkMOtSXE6yxAsRUcdxldswIJ
+ HANMCuJW8xQgOP51oacWPPGAeRUUOIZQzDhecd6mbIcbPusM0gLmq6bHPohlhDeZuH4c1zzF1+Rs
+ HByDXTae0s0IhjjZg3GPWqOs+HpLCTbNGyb+cHrQBZitjPEzW/LL97vinw2v2m2aORec9AKXQbsw
+ ygBBiX72TWxfaS8kiGFQAwz8vWkncDlbqNraT5cjb/n+lMGckx8kjOa1tU2TxkPkMpxyKyrhJ4Wa
+ KIDbTAkgvIp7URzgBwe/BpZYrd4vmZWNZ81x5cgBXDdzVlIvtUOGIBHpQA2aEROpR8DsB2q3bvG9
+ iySzEsTkLnrVMqViCZzt7nrT7GBVuQRnODQA6Q+Sx80A4HApEJB3BAR9K19EmhkvCJ0ZsKe3tUc8
+ Mc1yy7cpn6YoAzoUiclnYYY8AHpUl8zRxqpPy9qtC2tULgSMAvQ460lzIl9b7YiDt4GaAKMMQlJ5
+ z9Kj8gIW5yKnS3Crlzhh6d6k0mbyZT565Q5z60ANtrRpPmhzWhbwy7DJcDhhwMdKlt7aK+gb+z33
+ yKdxVuMCqaz5cqGYfWgB6yu8rBB8o6Gs/UpjGQXBGPTvVmSfyImyepqrqjbIw3WgCDz1ib9yOTg4
+ NbVlNBJYvlVBHt1rBaPzQWU4IHSn2FwRJslJxQA6e3M0O4oAzdB6VXR2iKGQENGOK0ms1eAkFjF/
+ BjrVGaAo371smgC7pety2kwl06Vo5AOWXmuwm+Itv4g8Ota30aWlySAJQfmkP/1zXIeG4Y5SVBB3
+ evamXGly2tydwG0nKkHpQBZ86fRbpBLI252y4PGRWhO8Ml1IbJhHn+BTnNU9O1oRwvDqqhB2lHJP
+ 4U6awb+z4JdKbzdh5ZurDHtQBat5LaRHiaOP7QejEZKD/Oauy+FI7W3Bsroyhxkq3QH8q5a7ujM8
+ nWOQnBqTR9burCT98xdR60AbbaHc6ZG3ymJsZC/3hVnw/fNIXt7hygHzZp2oeIBqCxzqfmCgEe3+
+ RVdrmLVAEtf3bxfOW/ve36UAV7+7DXMu5Q4/Os2e3eRWkiAGOijtWrPodxfQmeNVAPOPWsppJIpi
+ JxsKcY9aAMwRyTSbpflx68VOYvOXb97OKtXAiZdzkqT0AGc037BIIRLHjsR60AVprZrZwGj4qTY0
+ xyRj3PUVMJDduFfqvFRzxJCzrCzEr60ALEu+YI53c4qeGB7lGCnBU4FUopTBLvfk1at9R2sAMjNA
+ GtaXsnhy2FzPHvC46jgnNQ33imTXrkz3oVFAwo9Kfrtq03hAzEfJ5gyc81hWM5hhKrhgT0NPcByS
+ P5g2uVI98Vp6X4uuNGlyzCQIQR0bI7/1rNQxqW+05J7Y4qK5ZYUP2ZCW9TSA7SR9M8V30X9nMFZw
+ WfcNi5qPWPDtjo0pE7O03U/Mf055rmtFmN9E0DEox+atPWbiW7lSO8Ja4jQbcDC4A9PXFADYtM0+
+ 6nc3u7aOm3IP6Vnak9tYt/xL/M445zTIbieOdmWNsE46cip42EkyC4hYx469KAFsrT7XEJgFPOT6
+ 1s+H9PD3XlzxnL/MDtqn9pghgb7GjL/eJORWqfEnmrA9oFRoxjJ5BoAp6NqDW2pzRXtuyIAw3FMf
+ rVS4iF08pydmeCDxWvqeuC+Ro9qglcMw71mwReXD5aAlFJPPU0AZ0cEsbkSZKH15FD2xJJiJVj6c
+ VfnzLGEXAA71PFpDPaebE6/KOh60AYVws8TBgrFe57CmHUG25RVJA7AVozzSLbNvX5T1AHNY/m/Z
+ nPlqwDetAEtvqzJNu3FZBwQBjI96vPqkd3mRtokH31UYx+VZqWruxaFl+frkZxT1tvs1ujJgEH5m
+ PR/pQAXl2S371XAHI+Wkaf7VD8hGR2arKySylRccQ98DmiS0jifdsdgeODQBQd9x3IBx1xTYlBm3
+ En86sXUAwPswKg9QeaBErIEj6nrQC0NHRtUjt0K3AHzDABGcVW1fTzJL51jyOpz0NVooispebBI4
+ wK2YFEthk8qR07igDAgJil+TKtnnHFaP2h5yI3ZsgdSfaqd2P3im3BGM9aktsjmRgCOaAJZrMwR7
+ 3A5PT0pdMvZtOning+byzuVDyh/A8VHczSzDPy7RwOKgiuHEewjKeoFAzp7TUNM8XXEw8RhYNQmP
+ 7ny18uNeOM7cCtMfDiS8uY0tDEYghyynjPbn864htP8ANhLIehzWzovxDvtFsDB9+PI4I/rQI0r3
+ wNc6DO0N2VaQqW2q24YxmqFhYRgE/vkkDfMGBBP4GrSeJ7tZd6SxvIfmK4yQP84p0XiyC71gS65G
+ 00zAKGX5Qv4UAbFpd28WnIsBLsDzmub1+AXt1LJEoQqfu4xu+lbWsWgs4/NsCXjPIbqK5+5kklmE
+ rDD54BFAGb5cjybCrAnnB6ipEvXil2sM4GMVpFY7m4UNmNyOWJ4qteaM0BISVZe+RQBFHC2/zISg
+ B69KlIVhIHA3HuR70lqotlBulY5P4Vcls44k3u6N5oyoHb60wM6O1SRir5LemOKv2vhuW4iLg7VA
+ 6k4FTR2ax4aaVIwR3HWqGua5PcQm1WRBH6jqaQFzWbE2nhzynuIi+8HaHyKweJSEQEN6jpVcKyOw
+ cMVznOeKmtZvOPDKuOKAJbi0JYFf4eue9IW8sncfvdqnlvVFyFyu09abI0bysMZx0oArC4eCTcgb
+ juK2dNvE1N1M0ohljGQzc5A7cfSs6aweWAk7kTuapQysIT9mOSvG49aAOkvzLMxk06QNuG1l7j3r
+ PlnnJAuGJij+nNQ6XqT7wEYqyn5v9utLULaW7j321uiEjLqMkKKAIotbghb/AI8hKGPIBHNXLG6t
+ 7uzk3RLbKG/iP+Fc+8f2d1eFztzyD2q5p2oCFWRoxOX52nPFAGgLyC2lyZFKdB70r69buxRJBHjr
+ nvWVdeXLE7xE8fwnoPpVKZUnQPkBhwRmgDq7a9tLyARWiiWYngL1qG4gurJ28+NowO2a5a3v3smD
+ aa5WUd1HNbC6zI0KSX13JO7D5lbHFAE4V7pi0b5x1GazdUtXSM7v4iPw5rQ0/XrcXX75FgUdxzuq
+ /qFrp+sWRe3uDkc4BFAHLRDY42ycd6uPOXiiV+RGPlWnXOg3IQvEmIB/Ft6/jUUEZmMcgydvzECg
+ C1G2+Ly3YAvyM9qY88kaFcmmp807uwPJ4FS3do+Fzn5ulAFVrjbgS8Z4yah2C03SMffNWZdPknVA
+ iluQOnHWmX9pILvyY13HHK46UAVre7LSyOCTmtjSiy7VijLeZ0IqO08OzPIUiTI74Ga6bRP7O01F
+ h1KYJOv3V4BoA4zU1lExMrkbOAvpVcSifhjgrzmtjxPp7pO7SggOcqfUViy25hG5fSgC8rrLAojb
+ d7d6SexlEgwpRfTNV7e5LFBbKAwPNWHeX7TguxI7GmBPBExhaNVIJ6egqOVknO1fkx1J61aj1gLC
+ UEKlk4LVWvozC67kCFxkD1pAQ24e3uDLC3z9CR3H/wCqrczJdOGiOxvYc5/CocMYhtUBj3xU8Qjk
+ XbKPIZOjqclvzoAu2HiO60xPKvd7wY/1fGBWnJo8WuW6y6XIPMYZEAzuH9KxISonAuzuRzgk9qtR
+ 79KmMuhTt5cRyxznFADLzS2tMw6pAY5OoDEZ/Sm20TQQ74YwVQckGtMatB4kUpqreVIRw5+8aqXF
+ jc6bAsbD9yThWz94UAOmmjvrRCMJjOQRVS0sD9pLyABM5Of6Vdtrdn+RUGcZqO6uRBG0MuFI79KA
+ MfV7r7ZqDI7kohAVT6U2eJNimJQOuTnpSXFussrMvBz1pJov3YUsR9O9ABblRncQ3bAqY2EUwIiA
+ Vqr20ojfYqZx3q9bSKAGcYJPIoAoq7OCEQBffrRDGEcleM8nNPjuGkhHmbB74ApvmxltsuTnuDQA
+ +SFEjDwu5buD0qpLL5vMg2kEdOlXECMAyZGOMMePyprQRI5N0rt3BXO326UAV4b0Wt0pC5HrXS2W
+ qq9zE7jcO+OhFc81kbg7iMqeAFHSpLa8eymaNOUIwD6UAavjPQYYybq1bBmXcF9O39Kw4iXdDKcE
+ DAxW3q7NdWELISdiYIz71kz6ZNZNHI0cjqQfujIFAEtzAtu/7vODzmqlyzNyAo9vWp7uWSWJd+AM
+ jjGGqOWCSWRVVW2+uKAKskpWU5TP0p8c+ExsPPNTmCVD+5U/QrzRJHJGymeOQc45HFAFczh497KR
+ jirWlEsAudvII9znitEeBp7yAPZvEVPJUsP5ZqCO3j0yYDUNwliI6dOPpQBt/wDCR3Wj6eHFujvI
+ do3DIX9KoHXoL6J11CJYZAONlaWueIYtY8Nwx6ZHu2MdxVeTXKG0eaXKRuCeuBQB0mn+HRe2Yeze
+ MqRkFmwfyra0rwsIrRmvZICcgDLVw7xXFuFd2uEQfeAJAxUkkjSxh4J7gjPAErf40Abvjq1i0y4S
+ KByCdrfL+FUI7SR4Wc+WzMOCW5qhf3Mt9cCV2ZiihRk5qpdTSBgRI+R2DnFAFw2k6AqJZMjuD1qn
+ cxzyyAkPuiP3ieT/AJzV+01R7a2RpMZPVmGQ1WVuTqLDCptcfMBwRQBEkst/YMCSTH8vJqtJaoYQ
+ JPv1o+ZDZKAo+UnBpmrCBpRNp4/0crgZ9f8A9dAzCdGgkOynxSus2xjkj+L1qW5/fxYj+8D+NRWz
+ R4fzCd2O9Ai0lzI6mPaMOcZqW4uI7rbtJ3IMc1XScKqncQT0olPlKWfBz6UATKjSDcmdoFWtPCyR
+ kzckHiqUV0623lKVIPzHHWp7Ic/vSRz0zQBcCqdyT4J7YqC3uZdKv1a2UupO7B6H2NMglMUsmcnd
+ 0Lc4q3BmaMBiDjr60AWJRBfyb9P2RueWJ6KfQVLHqMdtcEysxJXayN0x0yKyWihWQBdwTOSdxHNb
+ zWEF5ErXhX7QQAMNge2f0oAnhs4rq2kksHwirkg9SfauXnJnmL3AbL9jXSRWh0N28x1cEfMqtnA/
+ Cs+70+O9/fWRIb+76fhSTuBimbyyyKDgnipLk7AML1pZbCWO7Hnjn26U6ZykRL+veqAryuvm/Jwf
+ Sk3mo2AyHyCT6Ux5pLU5Gwg88gGkBPNAILUO3KmooyjL8ueegzTvPMsRjG4qBwKrW1sxJZzsIPGa
+ AJbmfp5q7MZx71NZawEi8qZSyHg4NRGLzCPtB3eme1R3Nutocodyd8UAaVtqEUDlI8/N3PaqV2Ht
+ X2x4lIOSwHFSWkEFyo+cD1BpbmNbNdkh20AMh1UiJ1c9RzWj/wAJa1vYiK1RmRvvetY5gDENxgnp
+ UlhN5TiI4O4845oAmu51lXzFDGQ8jnpTra4uJkBAOQavXvhG8tIhPawvJAfmY9gKE1COwgIiAZiO
+ 3rQBV866T52Qsw6YrXguZNTs0WSJ8IPnHr9KwZNamNumZSpPU4pbPxBeRy/uJjtXqfWgDodMtnXK
+ QjYeo3VnalpiXjMzXMKS9O9VV1ydCXkmLY/SorWwTVJTmQEt81AHTeCY49Mik+0SJKmOg71W1bxH
+ HLdgaXaSRNnjdzWapGlBBG2ec4GKtQ6yZD5hjLMvbIzQBfutWC2ajV4ywwN2OM/Sql/JY2kKGzU/
+ McnBBqlf3Lam5e8lKMv3Yz2FU4VjgzsGQ3WgDa0ya0u7kxzgqCCcn1q43hizkEjRkOoXcAOua5Ka
+ 6Mc3ygEVb0nW57ac/ZC4Xuo5zQBBeZjcwuMxRn5fUUmnySx6kv2cgg98deK1LjT31pTLpymSVuWi
+ Xqv17U2GzFgFBUCVOo7igCTT7cnTp/ty5ZnyCvGOKz2uwimOY7geQB0FWY7tzu8xiqk8A96qOvmy
+ MSowOc0AVpkkgk3uAiP39KkjtonYtnO4cKOP1q1Z3K+X5V2N6OeM8gfWiewaxiKhDsAyJB2oAk0u
+ 1juAwniYshwoB61FLZfaJDv/AHWexpulXRNwpjkP7s8nu1Wd4uC7zfezxQBTjxZTHzlMigbdy8Up
+ YXEv7nPvk1aNqbhDhgARnFZMCvbzuWZgc/nQBo2l6qs63AJA6VIsiG4DI4jXP8XeqcbrK5JH3xkH
+ 0pWhWVR52CF6UAa8kUd7H8rD5f1p5txHAfNPasWRCjgh8D0BrV0a+DgCdfM3DaB9RigCml/JFPyB
+ 159xV+C/wfNHAbtUN9orxO3k5dhycfw1XmT7JarIjb1k6U2BcuNSVGDSAPu6be1QTXcO0CVSwbPA
+ 7VRtpftEmxW2Mx6HvUv2V1J2jkdaQBFJB5jBVYemetRyW6SqTKCfTFNllCHBX5vWkLBPvk4NADTG
+ 0ePKB5qdLN5NjycqvNQIpZAFVj71LsaJQBuGaAH3aCVwycKODUMsZgJjxv8AXIzUs0DpHhmBycjm
+ gOd37wdRjNAFETeTcARAbSeTViApfrhjufHXNJNCsUu18Z61Xit3Q5JxQBdW0MYKyn5hSf2BPIjS
+ 24I29T6f5xUMMrs5HOF71ooVmtMyu3ynAAzQBqeCfG7aaPsmuYkiYFG3HseKq67YQW2rSNpLCS0l
+ GQ5GSh74xWZc2SyxK4OZl5x7d/0rV0K+j+xPFOu4Pwpx0oAo3OnFreM7AR9Kp/2eYpxtyCx6VoXd
+ g2nSlQzMh6UxJdjqSpKgfN6mgCOLSZGkKyYw/wCn+c1YltRodoWA+Y8Z+taPhWz866DQqxLdmq34
+ x0ZbS23yY3NgkUAcZcSyrjcc7zw3YU62meOeTazdOhrZ07TYLkYvSFVfmqveQWkDj7CW9zg0AZs9
+ 8wbO3L8ZpvmGRsyZQDsO9WLu0EwZojwMc1DJCrsA5we1AFmGVZLc7Y1bA6nvU1gIyNzgxtnoKr7I
+ NgHO8dx0pJ3AYG3UnHegDRS+NpL5lsxh3dQverj38OtL/pKCKSPhWU/f+tYEt98xMnC9qgludrrJ
+ GzFl7DvQBq6pYNGdzHGO3aqS33kEBhlSME0+01z7OcXGXRupJ5H0q5fafFqNuJLLnofmGDRsBmJe
+ DzMEZGevpW7o8sN/bzLqTBML8oB71k/2YYh83FQRqbdtr7sDv60AX7jSo4ZsiVo067hj9anuNHey
+ jVizMj8gkdaqQyi+UxjO7O0A96tXDz6rEFucp5HygUANGEQKjDJGaqzWbzgyn5QOPY1p2xZtOaGN
+ VMo5BPoKqxa1NHHtmij+Q4xkUAUraZFiYScMOgNMf76CIZHf2q5KRq8arEjK4OTsGaki0oKwAEhP
+ uDmgCohEsqq/O6rrMNMj3AEdgfQmn3tqUgEcaYz1JFMtLdn0wpFGxYHhjQBa026M0XM2WQ/NnHzU
+ 6Yw6tCPt6rbpH0CdvzrPtrZ45ceU4cHk9qtzW6XLOjqwY9+1AEa+HWun8zR28xU5LAZx+VLaGSV9
+ jrkr145amvEY4hGkjKMg5XoPY/571vaHFDr95HHqDMkoU4C9G+uKAOevoo5iSBjBxVYwLdRkL1Xt
+ XSeK/CdzpkjRMqyJ95SjbsD3rmJbUwoeuGOCfSgC9eWc9rcbbdA0KHPmhcq39Ka8e9DkBS5zk1X0
+ /wAR3dvEtuTm3AwVzW/D4w0xIEivbOaSTAVWBAH40AYMu6CZDkFcHcTz6UrtkYlwVHIwOtb91olr
+ qtuRZSL5h5EX8VY97pc1jKAqZ2jB/wA/nQBRJhubjE4YOOnNMC+S+DzmrMkIA819wPTbjmqwfzcM
+ 4w3vQA9mbYwgIz/ENvSm2t+6jZsYKeTkVYjn/eqwGAOp9aeW+2sdkgVf5UAQLKY5MHGferNv+6IM
+ XT07CmyaeZIS1vtmkUdQKbZ+akOZoyqMe45oAvRzjUJPLLgSds8/zqyPDzwETagy4U8YwARWMbcw
+ NuDDePenPrbXEfkTn5hwrdqAO709LPSbbzlZdvqD0Ncnr/iufX793uWQrGdmFGBjpmstdQeFRHKx
+ 2Nn5f73+f61E7iLCxDnrjvQBaubtNypAxyRzg0q263DMsJIzzyc1mwyDeSD82e9XIGUIrSyBNw+X
+ 2+tAD3tSpcFvufrVZbdL2XbnDdjnGKnhs2nkYtcIEJ6461HMiJIApBVe5HWgB8mmtpzDzSrrkZYU
+ 65mRGYoBgirEkCStiJlC7c5IqjLNsYhtu0d6AKkshbAZcAdc81Gdwb5SD6cVZjYy5WXBVu/pWppn
+ h63urfdLdxR47MDk0AYjnhehxntVq11OVANuTj8q2/8AhBZ7mwkm00CYKQBtHXrWe+kTWS7J4zE+
+ OQ1ACQX/ANrkC3DD0wODV280KQwM0jxheueKdZWcCrvkjYYHUHvRe6jFLapHtLKeDjg0AVrDQ5xd
+ xuhIUEMHx8pH1roZtH+2W+dPIbHDMOcms+81YNoqWltlFKhQD1HNP0e5udHsHFkcyMRkDoaALUPh
+ aa1n8yUgqRgjPOO/eq+reDkvHzoQYIB85JzzW5HBLqWmCSWQJM3UEdB3/Sk0S3uNPmIkBlgJyXAw
+ o/Ci4EHh3QYfDsfm3mHklGGLdFqS91HSYpvMw0jjkhTx/KqXjLUg8hihYiMn746H6Vg+QYxuV9vH
+ 1oA3xrem38TNe28rqp+VUyD+gpbTU7O6ylvEYoEBPzjDAjp2HeuUk1aeyfNqMH+8BTrvVhqEAMuP
+ O7n1oA3X1Q3U0klp5S7OGHFZt7rj4DwxlTJ6riqMTiDZsHTn6/WpbfU5EP8AxMVMqdFIOMfWgCZb
+ lpEO/GDgn9K6bwZpktjcC7lUsAMYPvj/AArBi0lrpc2sqbZsHbjkV20SvDp8UUZBcDp60AY+ueIZ
+ dIu3Frh0lbD+YNxAPXBPSqLrpuunyNPBSSM7mZyQpJ/KtWQ2uqvNDcjypQjAFjnJx0rhNYhntbvy
+ 7jcucgIe9AEUMOy5ImYgg4xViVVa4UFSoToc9a6DxZoEdqv2rTsHzDlx/dFcujFpG27vlPGe9AEi
+ anPpV359o7b143jqo/yP0rWs/FSavF9l1JltlB3tOerd+axl3XGfMXC9896iu7UbtyYIxg0AdTc2
+ Vrqe3+zZxIF4Uj+I1S1Hwpexu0kts8aL7Vg2t9JZ8REjJ+UD+Guh0TxjeaW3/EwAuFAxh260AY8y
+ ujfLkBOCOuabHcqgCxYAbrz0rsbSysfHdzks1rO33Y0AwTWd4h+D2r6M5mmt0ER5D85P1oAxLfWZ
+ LSYrbnAb5eKnudVnyELFkHOcCqUmjzRzBWyD9K6W38JtLo6TtkLzmgDHtryGZiZUDZqDU1Vl3wp8
+ g+9jsf8AOKmGnw2cpE8jFR1I7VdGjRXMQa0kdoSPmHrQBn6bYnWz5NydjgZVgORWeztBK8ZBJQld
+ x6nFdZ4ZtoNI1QPI7O+OB7VX8faO9rdC7ESrC4BJHqaAOcgUTtuORiraW0M9yiXLAIeoPc+1RWar
+ u6Haxq7e6ekEZkBGzGVz1ptgVprUw3ku3iJDgDPUYFEzAwZRN2CDgUw3JEkezD7+xolvytwn2pVV
+ RkADv060gLVlMk4aLIDHp7+1Vbu1+yzgThiHOOelElyIZl8v5CDkVtxWkGtaYs0bMblCcr/KgDCe
+ 3LzsN20L2HepUQJnHI9KsX+gT29pHKCd79qWw0u4aPcwU4796AL+meIr2G1aDSbiWHOMhR1qxZXz
+ xXBl1n/iYBBlg/FR6VZW1nciS9mdJADgYGO1Q3pIOOu5hz60AO1vxLDqluP7Pt47eJSQ2KzvtiSg
+ eWuPpU89gsfzH5cc+1ZaSpbXRZT8tAGjjz237gNuPwrc0O48uUPOM4GBXORXC3HmJD1bB/QVZivZ
+ fLwp+71oA6fVfEiwXC+UBGjfKTj14qZbi7gtJWjkY2zx5C9s4rnbCRdZiaOUkFQTke3P9KbYa1c6
+ XcBARLEWxhzwBU2AotqzH5Ls5YdFPOKmiu1KgxfvCOqHrXTL4EXxLbl9MO6bGRkYzXPal4TuNLu2
+ ju/3csfUD9KoDO19yChhO3OcqO1VoZEUbHVckZL9x3q09s8a5uDkZxUDWX2i4OzgHvQBLCwkwyEF
+ c4z6VNDZm7utkROCfwqCzAhuGRhhV/WtR5okjjkQ7ST2oAlSRtMdUjHzR1p2OuOI2Ly4kHQViS3K
+ iYBMsW5zSNF9klEjPnPSgC1dzm4uVKSMZd4JP41oeJPD8+r6ZHLbwmW5H3yCMqvr/Os6xu/tDfvU
+ CqSOfWuj0yf7OxLO2CAG9x6UAZs6vcIqSiVw3GQMisR7RVvpFkGFU46e1dN4c1hYmCXm0quDIO9c
+ 54quVl16drdDHGzZX6UAV5bTzWIi4Ws6/DQEoQSpI5q9BfywxkS7WU9OOlMa3F8hG7bj5sn86AKc
+ ErggKVA96lFwLcYHX3NQPAHnYD5e26pAnluA/JoAu6JevFqsEqs4YN0HQV39p8aL+CJVnWKWOP5c
+ OAf6VwCzrbxAIMMefpT48zEFD9RQB6hZ+PNE8YqsfiJFt5GOC0abcH6ioPF+i2/hiGK50xmuLOQ4
+ AjO9s/T8a8wlzLIdxKkHIwcc1s6R43vdJi2xurxsdriQbto9RnpQBal1C1urtzcIVjfqu3FRMNM8
+ zbpplViehyAKnuU0/X4N+ixtFdR/67e2fN+g4xzWPcWzWFyDL8gP3Qw+9+NAGhqulSWzpJHt/wBn
+ Bzj2NejeHLG28f8Ahox6/HsmA2DHBGO9eTrrksUTKSOD0Par+n/EnVdMRVsZYgpHIK9u9KwEvjn4
+ eTeF9UY2Jie3HI+bJFc6b6eMkt909j2rsrTxpYa7bGHWYpXlc8Ord/yrOu/B8gEjQul3Ao6RjLL9
+ cGhaAcu0skr7mK8HtTjEAcMMk881Zm0l7JXxg7uQBywqqzysygDBPr1qgHSWqzANL6UunXjWBOxW
+ KsaZcggbu4HSlindrf5ANxNIDqblPteiWrESNC2fujJ7Vd0bRY7KLfZswWYZYSdT2/pWJ4Q8ST21
+ 1b2krIYj8pBFdd4k024ht0nsdpjA4AHNAHO6npkSs2SwPase6ieJcSYdenB+atGbWykgF9G2cHvi
+ qGqMxiWW0GFyCSRnFAFeSN4yGiLE9we1QXYEhzMo+bnAqaC9YzbpSGY8CoL/ACwDQ80AV1mxdJwQ
+ q9h1qd71WHU/QdqgDO0gJAyevFE4WI8dW60AafhzUHt5v3ZAzxVzXNFku/38Odg9KwbK4ELA4z+N
+ ddourgQKJsMv92gCr4Y8Qy6VGUmkdLcDjn5/8a6vS5tM8SWTG3kkaZeP3xIyfxrmPEuk/ZXF9akG
+ CY/LHj7tZy38tvcxSwnYw7DpQB0viLwrIigwhcHqAeKxDpbmcgJtKjOfStXRPHgjlEeuAzZ6bf4e
+ lajX+navE4gZIyQcFmxQBxd5ZPG+9iuDxmqitHGR5oO09M+tdDqmjNsDl90YPBHSsJ4N7uH7dOOt
+ MByxj+EkE/d5qwYGkUNu+VetUgxVz6gVNAryx7Y84J5PpSAeZWjG8A/Lg1sabqn2hF8wnniqPkK6
+ qk/z/TilaEWo/cgqKANPSbRba8zM6MXGDzVPxHYPPOzOOVPy471R03XmSRXlQEHv6VstqaakgJKh
+ h0X1oA5jBjYrP8uTkA9TQ0qoxLHqPyrQ1+z6TMu104x65/8A1ViSsVc5GdwoAseWbkDyQWC01QVv
+ S+5WGcbe9OguTFZqIjhxnPHWnWTCO6LyKjPnpQBDfs4n3sMc8Y7VPBKWT922498U7X0RCjRnJmAL
+ KP4aq2rtA/ycBu5HXFAGkYg0GT8rY5J5qIw5jyMORxU28zwAou5jxj1pnktAzCUlT1xQBHFP/Z8w
+ dpNsg6ccj8a6jQPFNjqdqbfxJbvPM/yxTE/LF9c1zsNsJ1U3EYIP8VPe1iicCORsnnHTBoAtat4Z
+ mS92Wn79WBK7aw0ia3uXW4jdChxkjvW/Z+KLjTZFd4hKwyAc44qy+nwazpxEOPNdvMdx1UdTQBzb
+ AbSNyqGPf+lWvDPiW58IXDtZzOIpRiVVON4qS/0ePcG04/aYV4Z8YwaoPGJrgq2AqnAPY0AdVdww
+ eJLX7XoxSKfbnyRwzn61zGooyMzsreYpwQTyn+P/ANap9NvX0S4DQtzu7dhW/rel2viWzWfRiPtC
+ L88a/wAfuaAOQEvyDepIOOamtbFJZWKzrH7Gpk02QRBLgYYHkDtSTaf5LBgM7u1AEVxbS2aiSNfm
+ xw3St7RfiTLFZi2vUe4VRt44xWJDczTzoLoFgvO096bMomlkaJfI5ztFAG7Jqdlrcm2WNYHA+82C
+ KidbiCAoVLWzfKoHOawo1dyGO4bQcc9frWppOvSwQLDcDzQSOvbmgCjcWBQsqDYwOTmo44BdAZfG
+ OeuK1NYdZLjzCdu8dAKzpLYQt+6OKAK88ciXREQ3AY5/Ckmt3dlMoznPSrMU2zJxgD2zSSRmX5kY
+ gdiO9AFWO3KSDgqMjrXQ6fYuUAjG3HO7rWRawNeSDLYKnHPeunVG0bR4ruTnc20g96AHxn7ZbNA7
+ qzgcVzup2s2mzOl0CAT8jYzvrb1TxpZ3tgr6fBFFL/EUqpp+pJqpxeqJAPulucfSgDDfcjgxAqSP
+ mB60xXXlZFBPXpV2+tms5W2oTnpk1nht0uZCAfTFAG9oOvCJBb6jueJj8qj+Grer6XFCqvHMvHTA
+ zmuajlMUmWHznoKvQ6tLDEPtKeZnsT0oAkaBVLGX7x54qOG6NvkEEA/rV2dYLi08y3fMhH3e4rMR
+ mkDLOMkHg9KALcN7vXI4Iq9ZyG5jw7An1rFuWMWMAopxTzqMkIxZAuOpINAD7ZAcg9F6VqaXdRFg
+ pX5h92sPzRbfKQdvr61c0+4MjDyxsYHkkUAdA2lvdQ+ZcDIPGOuawNY0wWNywjwVbocdK2E1ubTF
+ +T5gw5yM1Lc2kOqaX5kXMxG4nPT8KAOSUSKu5VGM03aZmRo22k9Tird26Fgp+6hwcVAZfNmCnBVu
+ mKAJp7N71FDcuOI8d6pJlLlt+d44PoK0dTZLKCI2HmCZQCd33c+1R6iqXKpJBu34+bPQGmBNpzND
+ bgH7zHjPapLiXMhEvzMRwarQXG+ILcfMP7w7VZjdHj+QgMOmaQCRF7AsVBZO2am2G5t2kIAJ9O1V
+ 2vzM21l+UU9Cjj5M8eh4NAAIXjUeRl8/pUa6k1hGFtWyG6n+lWYX25Y8dsUs9t5tkVkK7Tz7+tAE
+ 9l4hAj8q/RUf+Db0P1qZ/DUWrTO0paK9cfLGg+Qn61zc0SeYc53DgVr+HNfk0u623LgwSDaxHLY9
+ QaYFa80a60G58vU1VmbqF5AFWdC1k6PqaTW6qyEbSD+FdRJd2s8IikZJbO46MTmRB7nr2/WsrxD4
+ QjtohLo+9kHXPb0pAd6uh6Lrekm6hkkQSRgNtQfK/p+dc1f/AAsuGUnSWSVScgynbisHQfGFxpki
+ RKw8tRyD0z/nNWPFHji/1lFihkCxKMAocUAaNt8NNSt3bzYrYsnT5xTLvwZYQTIuqzlLh/vqigqP
+ xrk/7QuIwRHcXG4jnMpP9ary3kzhvtUkrSH7p3E0AdXqPgvT1vI47K4kfcCcYAx0/wAar2ngu2uW
+ ZIJX3pnjHFc3DqUikfPIGHU5PFb2ka3PDe7dPZGGzGW7/wCc0AX7LRLSzcxb3eXrhhxVG78JeVcA
+ bvvcVfEgudqaoyrOrbiV9Pwpmo311pMnmWmySH3w1AGRrXh6TRfLMq8yfcHGPxqxZ6fpmnmNddml
+ jlk5+RQRx/8ArqO51ptT3vMwWU9iOF/CsOZHnkIkYu3YnmgDo7qPTtPszcWTu5LcAr1ycVl6p4hk
+ 1BRbsCEXkCqEGqz20wEWGEZGAeRxVy+vRqV2JpUVJiACQMAUAZ0+mvaNuuz88hwAOmaktbt7C4Ub
+ c8jvW5rGkp/YUEsRM0nLSf7PFYogSWEF/lJ6CgDWcjXyuMhwOAO9Y09hLbSyKy9+pqzpM9xo90Jr
+ co2OMMM5ropr2PxBYGK7VVXBbIXG4jnrQByUI8xSADs6HPWpPLIjGxssvr3pxQmcqx+VGwFHenJI
+ gOF5oAW0jZB5nQnnH6Usnzjrg0rW2/8AeISD1x2pWR5VySNo60AQBX2EzHIXpSQJ5kjOOFpLgrtI
+ iLFvWi2Y3CFYuoNAEt4myTBBQ46Gq6OyHKjGTzSyyyXUm+/cnHc0+PY42RtuDcDigDS03UzdQlHG
+ WHFSw3/2CX99lo+hA64NUorOeyG9FJA68VJFaLqNu0hkIlXkgelAF3VtEjvNMF1pKOctyPTFc/bw
+ tGVeMfMRzW54f119M8yJ2IjlGzk9B/k1p6f4fsmi2xXsUmeP88U7gYV5Et3aQlWCsox+NR2eUnWG
+ 7bdvrZ1TRY7FXjuQsatzHJ7VkyeXbxnz38xl6NmkBFfiXR3MDKQjHI9xUMV0ijMnNdBZWbeJbUcC
+ SZU+U454rFu/DF7byNJcW0qxqeeOtAE0EcbI+4nax49qnKNY7CCG46Vjw3DRHO1gtaNrqPnBRKu1
+ R0Y80AXYDHPAzlPmzzTWG2Evn8KafMMWIsFfamKxcAyjAHbNAFSeRJpOBg0xrXykVjyp6VLqFv5b
+ AqwTI6dal02ZZ5VjuMNGentQBJZxXFtFuUZDcitDSPFrwOYrkFkfj6Vl30l7p87RpKRDn92eoIqG
+ 31gRxk3qMzqRnmgC/wCJtIa2uzLYfMjgEj2rNs70woyIMjPLHtW7Y3y38gkUnGBke1R6p4dS/mNx
+ obeZgfvIVH3Pf3oAz7W3EmGzgrSSRqszF13+4/hqOOLdGSrk5HO0d6WCUxYaUMYhw4HegCM6TLcy
+ Ztkd0wckd6jtZZbPiI+aqnlem2tTStXNvcbYZyiSA4QcdMf41Y8Taf8A2dZieGMR7sAkc7s8H+dA
+ GVJqTT3AKtjIxtrStNVy/kyLuUj1rAlhG4NtKqOc/wB+l+2SpP8AcKMn3s07gdJdeHPtLRS2zpCr
+ csD171laro72bGSFWZRwzHpQdUe8hTDEMg5xU0N7Pcx7GVpIf4lzSAwlk2yAoevUDpWpa2hvYeTg
+ 0mo2UM8w8lPs4HUDvRpsFz9oYW6NKB07U0BbjvptGhkgJDRMu01VLRyyIYQSgA3HstVdVMiSlZyx
+ bPKiksbyS1hdWUmKQ5K0gJpt8UgAw69iKn0/UyJdrdOmKIPIvW/cyLEqj7p4zUEUIEr+blHXJBx1
+ oAk1O28q6VoSFVhk1GbZQ25TzUlvcfakIucKAcAnqaWK1cyFkQlB70AJvJdNq5I4+tBcbCnCjv71
+ LIVcAowVhxj0qO2t9zkXHKt0bsKAIpbPIHlKWUjk06wgaNiqIBzViF/kKKwBHA9aguI5oX3REk9j
+ TQErWypGPOGc/pTLTy47gMFyob5fetB7EmcG3G6N8hSTjNWRpgsws/y7ouWB70gKd5dGSRcfKnIP
+ HFXrHSYL61e4kfyVVcYA61lC7OrxurAKxbIHtUtxfC2sTDA/A49KAEazRmkEw+TqG9as+H7YSTeX
+ bvu7ccYrIt7qRdobPLc59K6jw9pf2KUXcJBVjuI/z9aALF88MsJh1AiRoPl54Iqt5GmXUG3ABx1x
+ 0/WneMbGfTryO8VB5d2N6qfTJHP5VBoNtFqUb/b28uU/d2d6AJLPV4dGtP8AQyokHGKgu/Fwu9wl
+ PXgj0pmpaSmnOxmYEdu5rOht2knZ4FX3oAimiju3AtlAznrVWSAW7OC2HQ/d7VdNjLaMjurbSeMC
+ s+4WS41BjyEB5zQBcgnk2ARnJbqKZcydmZt3fFVxB+9DRkjHfNWLh/KKGTp/6FQBGLg3C5PzFeBT
+ LeT5yEzlB0p1zb7wGtzt9RTNhWVQOHPWgDc0iUajbPbTgM5GE9aydTtPKk8sKcDrk9adZX5+0FLc
+ FZM/K1dPpmgReJLR2nOyZDhQT1z60AYWgXYtrvy5cFXBXA9+OtGpLceH9YIsZ3BwGI4+YHsaNR09
+ 9C1ERTFTMjBgE6YyO9S+IoDqHlag5++RGPfGKALelpb+IbtA+Ldk+ZkXofxqHxFpn2Vpv7OXdGOW
+ 56Vk3GpCBQB8pB429a0bHXN8kX2gKY1ILju1AGakfmFfJXLN0/z+VdZYQG503yda5xyPp/8AqqXw
+ 2LKJJvsqbjIdwDL936Viarq8u9nhA8sNg88/TFAGrdeFbeWBHscSL/AM9DWRqnhObyS7KUYdfetH
+ wkx1Gdnm3rECAB6Vu674psYbIRxeZuHBJHWgDzZw2nybQMluDVnT9T2PsJK56Ve1OS1vJ/OhOfXj
+ pWVdWctu/mJhgTxQBeYrOS0xAxTojJHKHspCQ3GPSqaXCTuqpnf+lTQIJ5XRXwy0AaN7YxzWzT3I
+ /fSHp6VnS2LI8Yt13kj5ucAU17me4hYbvkHXJ5qvJfDMYDNlevqeaAJTAVJGBuHPFSWuoMN32iNW
+ UgjOelVo5vNUvg8HGKVollOIG4HNAGhb6dHewhrVy8gPK4qaFTZZRssT1GKzLWd7C5zDlS1a9rq5
+ vU2uFAIznuaAK93po2GSIEjqefu1C8QZApc+uBxWnbQpeyCG1OB1cnjmi5sUuTlxgpTQFBAYCWEQ
+ bjrmmsHvDypH0qYqYGPlk56DPSnWFuz3BN2MCkB0niGK10bw/ExCyMxwhVskH8K5O98SPfWixqPm
+ AxkjBNEkkz2iQSzgqn3U54rPm4RkY4YEfhQBd0gPBMGnwc8fSpvElpFBIGU5Y4Ix0qjcanIkKBG5
+ 7VGzPdIHvF3P9aAHpGtymc4Ira0fU5YYUG7KA5P0rAEgjOFjfHtVqzndD8ilFkGKAPTri4h1fRrW
+ DVAojmjwjdwPY/XNcJK6aTfubdjhDgc9a19PnbUYLW2upsRJ8o61S8WeH1sryKJ2AeRSUb1oApTX
+ TXpaQMWJGcdal8PSf6UTcj5WOKz5YW0zgTKZG44Bq4THLpSqj7LhWJdsdfSgDo9e16OGFba0ji3p
+ wZCBzXOoYZp2N2u0Mecd6Zp12cIbkfIBzTbwRG53W4wp5oAbeWVmgY2ZYeuTVC4SWFAzjdGO5qws
+ HmK28jaTVi1vhaR+XfRGeJhtVR69jz6dfwpgZEcrPcAp92pl2IzMxLuRwamfSJZCXtnRhnLgcFR6
+ VWc7J9mNpbtikAW9w0MheQj5ea3NG1Y2sPmWhCvjuf5Vk7UadY48RseW960rDS11C3b7EMzL3oAt
+ 6hpn9pZu4GzGq7djH5g2PzpPDsMV/Y3Fveg/uVZl+vNJYRy2KhXfcB972q5aRw310/2eZLbcuCWH
+ X8qaA4yTeT845B4qaEqjZlVtzflV+80qY31z/Z8T3ENqMs8ZAAGcd6zoZMncEwH6H0pAdDpusLZQ
+ 7Rjc3ApkFoZJHmY4iAPXpms8R7oh/Gc5HtXQaALbUtGMN6ApPHrzQA/TvEdsdOWD92rRk8gcmud8
+ QXkl1cZzlfapr3QP7NujGjfKTlSKzr2Jmdgx/wBX096AIkn8ucBQQjdat/bWMLZKOOnOOKzdjL0P
+ BoiXe2Cu7vQBpxC0KAyK2488Hiql3LskbaDtbpjrV+3tlubYC2TExGBVe+tJNOAF4PmHNAFO0meG
+ R1bI9jU0iK23zcbsdagWYO+xOH7mrkMWYcNgkUAQwKGA4JC5pzyFmPlEADt61asYIgSJWA3dOKv6
+ zosFpdxPaBGVlG445BwKAMwuWADAbqs6eI/3hl++Pu1cj8NFyrRncAdxb0psElpY37NMhljD4YKe
+ poAsWmm/aIjKknlsvUnoalhtHLcbiueucA1Uu9UMs8wt4SsOfkUnkCrOmXcotj9rkV0HSLnmgDoD
+ 4JSXSzPNNFJhdwCkZX9a5+K9gD+XPgDdjNTpez6ZZywwPskcZbk/KK5qZ2llPmvvYnrQATr8zE5D
+ N1zxRbou7951anhZNYuUVFw7dvSp59IltXdZ1IZKAGvpLNGfLAfufaqDCSKUEkgdMkVd07VWs7oG
+ XLL0x60+7ePUjyCpByMUAV3bBGxsk1ZikV4gAMkHOKpzW5SUmN849qjjnlil3KODxj0oA6KykW7t
+ yJW8pk4BFdxrGhwax4TS5JWWaEBEY9QDn/CvNrPUfJmBcZDHLV0s2vsfDMwt2ZYy4z7cGgDHv9NK
+ yjfD+8bgYFUNRtTps4S6HlkjIBPU/wCcVeN86xKZmJlyMc5p/ifU5L/RYVmto9wJUyZ5oAy01Dfb
+ qZV2xnoKbfX6NEv2ZcHHWmPLFJYQx2ZLTL1U1EIJA+2bAJ6Y5oAIboyDb0PU1c8xLkBJLna4Hy44
+ 5x06VAbZbdcyZ3elNBXeCRjnOaAG2808N5syYmJ7fx+5q7tW5QCZQso/iqsULT7rXLr6k4xVi0dX
+ +9kmgBlxpbI7SxqZAoGWz0p+i3txZ3AezJAHXjrWlZ26mFyzEnPC+vStzTLO3vZ1M8Yjwp6Hr0oA
+ 5/xFqyrIggQKrLlsdc96xpQZ5wySbu2DVnVYQ9/MJCSitxVOQFW4G1aAOm+H3iGPSbie1upBDBqC
+ CKRugwOfwrI8VWsenazNHZtvs0fEb/3h6j171Elg02N65x6Gt200i18VwwwXcjQ3Fou2NQMiTvye
+ 3WgDn4riKEhkfKf3h6+9aFlGLeyS8eT5DIMoDnv3FXZ9I0iwhJFxJLMpwY2ACg1TvvISzMs77S5w
+ EUcUAW9dH9qW6y6ZKBgcgdawoNOu7iWMmNiWOMDtT4Jxb5e1bKuMEHsfWpNM1ZrG4WWFmct0BHSg
+ CprWivp0u193mMeR6VHa2jmQbVH0zV3WNRkv5mkn5YnjFRJGBMjRMScdKANvR7OO1u4pS+SGGV68
+ d61/GnhSHUYReQyqsZXiPI64rK0S5hRNzfePXvWr5w1KIwwucAccUAefW1q8kqiT+WK0RpdzFFuE
+ bFT0bHBqxrFj/Z87LjDZ/Km2ctw7Kgk3KO3SgDPQPuHmqNynv2rRs7hrhjDIcDqD6VPeafDfWbbC
+ UnUjav8AeHfn8qsaL4bl2pLcYWJT85PYdzQBq6dfjRtKX7QnmC4JQH07f1rIl0SztbsSrcoQnJQH
+ qaseJ7mBVT7PIXtDwrYwQ3esOO4RrxvLZmjI+90P5UAXrm881T9lHOeAOareXPH+8BKOB19Kb9rF
+ pcq0ILDPc8mp7m+S6k3fdKj7vWgB8Gtj7Oq3AZ3fCs7DmorqxQTbl+oAqJJlu4gJMKwIxT3kNq+H
+ G5/7o7D1zTA7Pwpd6NBrk5vQwMv3Pl+7UnjAwwXX7tFe3l5UjBbHvXP3GnCOxhuo2IL1G+qPcFYX
+ cknoT/n2pbgVZtGFxZvNbH5VOBk+vt+FZ8lrPakrcqyHGcEYzWidWS3lCxAlVPUdDWxf6pa6nLH/
+ AGlH99QoI4wTwKbA45pHEirjk1asbxYZCsoDYH1rV17wyumSKVbeGG4Y6gVk/wBn7UdgCpPc0gLw
+ aEwtLKMDtWhoNykVwHdd8JGCjDIrDkSW1g2zOhVhkVLo+puSVlKlccYoA6Dxf4PbSLRb21wto7DG
+ W7ntj61mpKdXtxaOQvlfMCSBuJrqLfWIfEvhg2muKzQoN4CnBJHT9cVyU5hEjNbB0CHABPNAGTPa
+ fZriQONjqcZ6flUtqqB1SRmMr/dJzWlDaLrEUh1Qbnx+628ZNZE1s9nfctxEccjpQBO9tLcy7Zjw
+ vfNQ31q9oee3A75qe2Yyzby5OKiutRMsjKQDg4FG4EVvEyfM5xnsD1q5bbzKHBAB9KrCJN4YMd3p
+ V+wt8szRZUCnYDXsWSGPz7jGI+SMVVuvErXKEWuRk9QMYqXVyLXTUyRmRcmsSC4EAO8D2pAXxbma
+ IMR8w7+tVdRtkUAT9ew71as7wsF2nFGsKodDOMzHo/YU0rgULe7j098qW545Gaki1FIbwzeYyzfw
+ EdvyqkyGSfaw+bvRcQLayqyEnAyaQHR6gi6/pXnBER0IGFHzN15rnmlXyTGRuQHByeQau2GrS20G
+ 9OhO3H1//VWhf6RprXbXmnrMtuYsOjNk78DkfiDQBi2rpHIVQjb1otHPnBZAMAdRVUQiW6Bgyis2
+ Buq29q2nXJjn/eDsycUAOLCG8yg9zkcVCzeVIZY+cenekN0LqYRSHAHA9aLMCOTy5BlTyPegCxa6
+ ltkL2+ORzxjFWbTXpLSV3Y84+XFVJvLilKjgVFMpAyBxQBq6prEF7bQSzA+ZJ97jpVRGjDbUJAB+
+ U+tUywlJUdE6VteHLK3kuoDqQZ0zyAcYFAG3feVo+io90u2d13R/LyR35rm77VZNSmzC5SEj5hnH
+ 14/Otu+hv/FN3gTWywW4KRqQM4/OsUeFZp5miaVAc9R0oAaXWa0EUWCIjuA9PeqEMbCYM3G77oAr
+ bi8Gz2YDmeLc3ygev61X1CxnnuTE8TvPb9fKXigDMuIJFlBdtzHnAPSrEF0IwDCm5hw2VNRzxTWt
+ 0BeKVMnTIxj8KZ/ahtgY49uT7UAX7VH1K63oERVOTxiuu0ex0nS7L7chJkm+R1kwwyPQZrh4JJDw
+ zbVbk4/OrNpefLsnyyg5UUAf/9k=
+END:VCARD
diff --git a/vendor/sabre/vobject/tests/bootstrap.php b/vendor/sabre/vobject/tests/bootstrap.php
new file mode 100644
index 000000000..3608abec1
--- /dev/null
+++ b/vendor/sabre/vobject/tests/bootstrap.php
@@ -0,0 +1,15 @@
+<?php
+
+date_default_timezone_set('UTC');
+
+$try = array(
+ __DIR__ . '/../vendor/autoload.php',
+ __DIR__ . '/../../../autoload.php',
+);
+
+foreach($try as $path) {
+ if (file_exists($path)) {
+ include $path;
+ break;
+ }
+}
diff --git a/vendor/sabre/vobject/tests/phpunit.xml b/vendor/sabre/vobject/tests/phpunit.xml
new file mode 100644
index 000000000..8aeb65aa0
--- /dev/null
+++ b/vendor/sabre/vobject/tests/phpunit.xml
@@ -0,0 +1,17 @@
+<phpunit
+ colors="true"
+ bootstrap="bootstrap.php"
+ convertErrorsToExceptions="true"
+ convertNoticesToExceptions="true"
+ convertWarningsToExceptions="true"
+ >
+ <testsuite name="Sabre_VObject">
+ <directory>Sabre/</directory>
+ </testsuite>
+
+ <filter>
+ <whitelist addUncoveredFilesFromWhitelist="true">
+ <directory suffix=".php">../lib/</directory>
+ </whitelist>
+ </filter>
+</phpunit>
diff --git a/version.inc b/version.inc
index c07f843b6..8bc3bd5a8 100644
--- a/version.inc
+++ b/version.inc
@@ -1 +1 @@
-2013-02-19.229
+2014-01-15.558
diff --git a/view/cs/follow_notify_eml.tpl b/view/cs/follow_notify_eml.tpl
index 440ba9ca4..ba07b19da 100644
--- a/view/cs/follow_notify_eml.tpl
+++ b/view/cs/follow_notify_eml.tpl
@@ -1,14 +1,14 @@
-Milý/Milá $username,
+Dear {{$myname}},
-Máte nového následovatele na $sitename - '$requestor'.
+You have a new follower at {{$sitename}} - '{{$requestor}}'.
-Můžete si prohlédnout jeho/její profil na $url.
+You may visit their profile at {{$url}}.
-Přihlaste se na váš server k odsouhlasení nebo ignorování/zrušení žádosti.
+Please login to your site to approve or ignore/cancel the request.
-$siteurl
+{{$siteurl}}
-S pozdravem,
+Regards,
- $sitename administrátor
+ {{$sitename}} administrator
diff --git a/view/cs/friend_complete_eml.tpl b/view/cs/friend_complete_eml.tpl
index 50bb7e105..1c647b994 100644
--- a/view/cs/friend_complete_eml.tpl
+++ b/view/cs/friend_complete_eml.tpl
@@ -1,17 +1,22 @@
-Milý/Milá $username,
+Dear {{$username}},
- Skvělé zprávy... '$fn' na '$dfrn_url' odsouhlasil Váš požadavek na spojení na '$sitename'.
+ Great news... '{{$fn}}' at '{{$dfrn_url}}' has accepted
+your connection request at '{{$sitename}}'.
-Jste nyní přátelé a můžete si vyměňovat aktualizace statusu, fotek a e-mailů bez omezení.
+You are now mutual friends and may exchange status updates, photos, and email
+without restriction.
-Pokud budete chtít tento vztah jakkoliv upravit, navštivte Vaši stránku "Kontakty" na $sitename.
+Please visit your 'Connnections' page at {{$sitename}} if you wish to make
+any changes to this relationship.
-$siteurl
+{{$siteurl}}
-(Nyní můžete například vytvořit separátní profil s informacemi, které nebudou viditelné veřejně, a nastavit právo pro zobrazení tohoto profilu pro '$fn').
+[For instance, you may create a separate profile with information that is not
+available to the general public - and assign viewing rights to '{{$fn}}'].
-S pozdravem,
+Sincerely,
- $sitename administrátor
+ {{$sitename}} Administrator
+
diff --git a/view/cs/htconfig.tpl b/view/cs/htconfig.tpl
new file mode 100644
index 000000000..493cb5d00
--- /dev/null
+++ b/view/cs/htconfig.tpl
@@ -0,0 +1,70 @@
+<?php
+
+// Set the following for your MySQL installation
+// Copy or rename this file to .htconfig.php
+
+$db_host = '{{$dbhost}}';
+$db_port = '{{$dbport}}';
+$db_user = '{{$dbuser}}';
+$db_pass = '{{$dbpass}}';
+$db_data = '{{$dbdata}}';
+
+/*
+ * Notice: Many of the following settings will be available in the admin panel
+ * after a successful site install. Once they are set in the admin panel, they
+ * are stored in the DB - and the DB setting will over-ride any corresponding
+ * setting in this file
+ *
+ * The command-line tool util/config is able to query and set the DB items
+ * directly if for some reason the admin panel is not available and a system
+ * setting requires modification.
+ *
+ */
+
+
+// Choose a legal default timezone. If you are unsure, use "America/Los_Angeles".
+// It can be changed later and only applies to timestamps for anonymous viewers.
+
+$default_timezone = '{{$timezone}}';
+
+// What is your site name?
+
+$a->config['system']['baseurl'] = '{{$siteurl}}';
+$a->config['system']['sitename'] = "Red Matrix";
+$a->config['system']['location_hash'] = '{{$site_id}}';
+
+// Your choices are REGISTER_OPEN, REGISTER_APPROVE, or REGISTER_CLOSED.
+// Be certain to create your own personal account before setting
+// REGISTER_CLOSED. 'register_text' (if set) will be displayed prominently on
+// the registration page. REGISTER_APPROVE requires you set 'admin_email'
+// to the email address of an already registered person who can authorise
+// and/or approve/deny the request.
+
+$a->config['system']['register_policy'] = REGISTER_OPEN;
+$a->config['system']['register_text'] = '';
+$a->config['system']['admin_email'] = '{{$adminmail}}';
+
+// Maximum size of an imported message, 0 is unlimited
+
+$a->config['system']['max_import_size'] = 200000;
+
+// maximum size of uploaded photos
+
+$a->config['system']['maximagesize'] = 800000;
+
+// Location of PHP command line processor
+
+$a->config['system']['php_path'] = '{{$phpath}}';
+
+// Configure how we communicate with directory servers.
+// DIRECTORY_MODE_NORMAL = directory client, we will find a directory
+// DIRECTORY_MODE_SECONDARY = caching directory or mirror
+// DIRECTORY_MODE_PRIMARY = main directory server
+// DIRECTORY_MODE_STANDALONE = "off the grid" or private directory services
+
+$a->config['system']['directory_mode'] = DIRECTORY_MODE_NORMAL;
+
+// default system theme
+
+$a->config['system']['theme'] = 'redbasic';
+
diff --git a/view/cs/intro_complete_eml.tpl b/view/cs/intro_complete_eml.tpl
index 91753f35d..2c2428d68 100644
--- a/view/cs/intro_complete_eml.tpl
+++ b/view/cs/intro_complete_eml.tpl
@@ -1,17 +1,22 @@
-Milý/Milá $username,
+Dear {{$username}},
+ '{{$fn}}' at '{{$dfrn_url}}' has accepted
+your connection request at '{{$sitename}}'.
- '$fn' na '$dfrn_url' odsouhlasil Váš požadavek na spojení na '$sitename'.
+ '{{$fn}}' has chosen to accept you a "fan", which restricts
+some forms of communication - such as private messaging and some profile
+interactions. If this is a celebrity or community page, these settings were
+applied automatically.
- '$fn' Vás oznaÄil za svého "fanouÅ¡ka", což jistým způsobem omezuje komunikaci (například v oblasti soukromých zpráv a nÄ›kterých profilových interakcí. Pokud je toto celebritní nebo komunitní stránka, bylo toto nastavení byla pÅ™ijato automaticky.
+ '{{$fn}}' may choose to extend this into a two-way or more permissive
+relationship in the future.
- '$fn' může v budoucnu rozšířit toto spojení na oboustranné nebo jinak méně restriktivní.
+ You will start receiving public status updates from '{{$fn}}',
+which will appear on your 'Matrix' page at
- Nyní zaÄnete dostávat veÅ™ejné aktualizace statusu od '$fn', které se objeví ve Vaší stránce "Síť" na webu
+{{$siteurl}}
-$siteurl
+Sincerely,
-S pozdravem,
-
- $sitename administrátor
+ {{$sitename}} Administrator
diff --git a/view/cs/lostpass_eml.tpl b/view/cs/lostpass_eml.tpl
index 05042ddce..3b79d2791 100644
--- a/view/cs/lostpass_eml.tpl
+++ b/view/cs/lostpass_eml.tpl
@@ -1,23 +1,32 @@
-Milý/Milá $username,
- Na webu $sitename byl zaregistrován požadavek na znovunastavení hesla k VaÅ¡emu úÄtu. Pro potvrzení této žádosti prosím kliknÄ›te na potvrzovací odkaz níže, nebo si tento odkaz zkopírujte do adresního řádku prohlížeÄe.
-Pokud jste o znovunastavení hesla NEŽÃDALI, prosím NEKLIKEJTE na tento odkaz a ignorujte tento e-mail nebo ho rovnou smažte.
+Dear {{$username}},
+ A request was recently received at {{$sitename}} to reset your account
+password. In order to confirm this request, please select the verification link
+below or paste it into your web browser address bar.
-Vaše heslo nebude změněno, dokud nebudeme mít potvrzení, že jste o tento požadavek zažádali právě Vy.
+If you did NOT request this change, please DO NOT follow the link
+provided and ignore and/or delete this email.
-Klikněte na tento odkaz pro prověření Vaší identity:
+Your password will not be changed unless we can verify that you
+issued this request.
-$reset_link
+Follow this link to verify your identity:
-Poté obdržíte další zprávu obsahující nové heslo.
+{{$reset_link}}
-NáslednÄ› si toto heslo můžete zmÄ›nit z vaÅ¡eho úÄtu na stránce Nastavení.
+You will then receive a follow-up message containing the new password.
-Přihlašovací údaje jsou tato:
+You may change that password from your account settings page after logging in.
-Adresa webu: $siteurl
-Přihlašovací jméno: $email
+The login details are as follows:
-S pozdravem,
+Site Location: {{$siteurl}}
+Login Name: {{$email}}
- $sitename administrátor
+
+
+
+Sincerely,
+ {{$sitename}} Administrator
+
+
diff --git a/view/cs/passchanged_eml.tpl b/view/cs/passchanged_eml.tpl
index 5447d2e80..0d94be3c2 100644
--- a/view/cs/passchanged_eml.tpl
+++ b/view/cs/passchanged_eml.tpl
@@ -1,14 +1,20 @@
-Milý/Milá $username,
- Vaše heslo bylo na Vaši žádost změněno. Prosím zaznamenejte si tuto informaci (nebo si Vaše heslo změňte na nějaké, které si budete pamatovat).
-
-Vaše přihlašovací údaje jsou tato:
+Dear {{$username}},
+ Your password has been changed as requested. Please retain this
+information for your records (or change your password immediately to
+something that you will remember).
+
+
+Your login details are as follows:
-Adresa webu: $siteurl
-Přihlašovací jméno: $email
-Heslo: $new_password
+Site Location: {{$siteurl}}
+Login Name: {{$email}}
+Password: {{$new_password}}
-Toto heslo si můžete zmÄ›nit z vaÅ¡eho úÄtu na stránce Nastavení poté, co se pÅ™ihlásíte.
+You may change that password from your account settings page after logging in.
-S pozdravem,
- $sitename administrátor
+
+Sincerely,
+ {{$sitename}} Administrator
+
+
diff --git a/view/cs/register_open_eml.tpl b/view/cs/register_open_eml.tpl
index f8e42678b..4b397201c 100644
--- a/view/cs/register_open_eml.tpl
+++ b/view/cs/register_open_eml.tpl
@@ -1,23 +1,19 @@
-Milý/milá $username,
- Díky za registraci na $sitename. Váš úÄet byl vytvoÅ™en.
-Vaše přihlašovací údaje jsou tato:
-Adresa webu: $siteurl
-Přihlašovací jméno: $email
-Heslo: $password
+An account has been created at {{$sitename}} for this email address.
+The login details are as follows:
-Toto heslo si můžete zmÄ›nit z vaÅ¡eho úÄtu na stránce "Nastavení" poté, co se pÅ™ihlásíte.
+Site Location: {{$siteurl}}
+Login: {{$email}}
+Password: (the password which was provided during registration)
-VÄ›nujte prosím chvíli revizi dalších nastavení VaÅ¡eho úÄtu na této stránce.
+If this account was created without your knowledge and is not desired, you may
+visit this site and reset the password. This will allow you to remove the
+account from the links on the Settings page, and we
+apologise for any inconvenience.
-Můžete také pÅ™idat nÄ›které základní informace do VaÅ¡eho defaultního profilu (na stránce "Profily"), Äímž umožníte jiným lidem Vás snadnÄ›ji nalézt.
+Thank you and welcome to {{$sitename}}.
-DoporuÄujeme nastavit celé jméno, pÅ™idat profilové foto, pÅ™idat nÄ›jaká profilová "klíÄová slova" (což je velmi užiteÄné pro hledání nových přátel) a zemi, ve které žijete. Nemusíte zadávat víc informací.
+Sincerely,
+ {{$sitename}} Administrator
-Plně respektujeme Vaše právo na soukromí a žádná z výše uvedených položek není povinná.
-Pokud jste nový a neznáte na tomto webu nikoho jiného, zadáním těchto položek můžete získat nové a zajímavé přátele.
-
-Díky a vítejte na $sitename.
-
-S pozdravem,
- $sitename administrátor
+
diff --git a/view/cs/register_verify_eml.tpl b/view/cs/register_verify_eml.tpl
index 4b34c6b6d..85d9a12d3 100644
--- a/view/cs/register_verify_eml.tpl
+++ b/view/cs/register_verify_eml.tpl
@@ -1,22 +1,25 @@
-Na webu $sitename byla vytvořena nová uživatelská registrace, která vyžaduje Vaše schválení.
+A new user registration request was received at {{$sitename}} which requires
+your approval.
-Přihlašovací údaje jsou tato:
-Celé jméno: $username
-Adresa webu: $siteurl
-Přihlašovací jméno: $email
+The login details are as follows:
-Pro odsouhlasení tohoto požadavku prosím klikněte na následující odkaz:
+Site Location: {{$siteurl}}
+Login Name: {{$email}}
+IP Address: {{$details}}
+To approve this request please visit the following link:
-$siteurl/regmod/allow/$hash
+{{$siteurl}}/regmod/allow/{{$hash}}
-Pro zamítnutí žádosti a odstranÄ›ní úÄtu prosím kliknÄ›te na tento odkaz:
+To deny the request and remove the account, please visit:
-$siteurl/regmod/deny/$hash
+{{$siteurl}}/regmod/deny/{{$hash}}
+
+
+Thank you.
-Díky.
diff --git a/view/cs/request_notify_eml.tpl b/view/cs/request_notify_eml.tpl
index 74010c79c..d01b8ff27 100644
--- a/view/cs/request_notify_eml.tpl
+++ b/view/cs/request_notify_eml.tpl
@@ -1,15 +1,17 @@
-Milý/Milá $username,
+Dear {{$myname}},
-Právě jste obdržel/obdržela požadavek na spojení na webu $sitename
+You have just received a connection request at {{$sitename}}
-od '$requestor'.
+from '{{$requestor}}'.
-Můžete navštívit jeho/její profil na následujícím odkazu $url.
+You may visit their profile at {{$url}}.
-Přihlaste se na Váš web k zobrazení kompletní žádosti a odsouhlaste nebo ignorujte/zrušte tuto žádost.
+Please login to your site to view the complete introduction
+and approve or ignore/cancel the request.
-$siteurl
+{{$siteurl}}
-S pozdravem,
- $sitename administrátor
+Regards,
+
+ {{$sitename}} administrator
diff --git a/view/cs/update_fail_eml.tpl b/view/cs/update_fail_eml.tpl
new file mode 100644
index 000000000..a7df8fc2f
--- /dev/null
+++ b/view/cs/update_fail_eml.tpl
@@ -0,0 +1,13 @@
+Hey,
+I'm the web server at {{$sitename}};
+
+The Red Matrix developers released update {{$update}} recently,
+but when I tried to install it, something went terribly wrong.
+This needs to be fixed soon and it requires human intervention.
+Please contact a Red developer if you can not figure out how to
+fix it on your own. My database might be invalid.
+
+The error message is '{{$error}}'.
+
+Apologies for the inconvenience,
+ your web server at {{$siteurl}} \ No newline at end of file
diff --git a/view/css/bootstrap-red.css b/view/css/bootstrap-red.css
new file mode 100644
index 000000000..73c06fd4b
--- /dev/null
+++ b/view/css/bootstrap-red.css
@@ -0,0 +1,67 @@
+/* override some bootstrap settings */
+*,
+*:before,
+*:after {
+ -webkit-box-sizing: content-box;
+ -moz-box-sizing: content-box;
+ box-sizing: content-box;
+}
+
+html {
+font-size: 100%;
+}
+
+.panel-body .form-control{
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+}
+.profile-jot-text{
+ -webkit-box-sizing: content-box;
+ -moz-box-sizing: content-box;
+ box-sizing: content-box;
+}
+
+
+h1,
+.h1 {
+ font-size: 24px;
+}
+
+h2,
+.h2 {
+ font-size: 18px;
+}
+
+h3,
+.h3 {
+ font-size: 16px;
+}
+
+h4,
+.h4 {
+ font-size: 14px;
+}
+
+h5,
+.h5 {
+ font-size: 12px;
+}
+
+h6,
+.h6 {
+ font-size: 10px;
+}
+textarea {
+line-height: initial;
+}
+
+.radio, .checkbox{
+padding-left: 0px;
+margin-left: 0px;
+}
+
+.checkbox input[type="checkbox"], inline input[type="checkbox"]{
+float:none;
+margin-left:0px;
+}
diff --git a/view/css/conversation.css b/view/css/conversation.css
new file mode 100644
index 000000000..3396863e7
--- /dev/null
+++ b/view/css/conversation.css
@@ -0,0 +1,436 @@
+/* jot */
+
+#profile-jot-wrapper {
+ margin-top: 25px;
+}
+
+#jot-title,
+#jot-category,
+#jot-pagetitle {
+ border: 0px;
+ margin: 0px;
+ padding: 8px;
+ height: 1.8em;
+ width: 530px;
+ margin-bottom: 5px;
+}
+
+.jothidden {
+ display:none;
+}
+
+#profile-jot-text {
+ height: 1.8em;
+ padding: 8px;
+ margin-right: 0px;
+ width: 90%;
+}
+
+#profile-jot-text-loading {
+ float: left;
+ margin: 14px 0px 0px 12px;
+}
+
+#profile-jot-submit-wrapper {
+ margin-top: 10px;
+ width: 90%;
+}
+
+#profile-jot-submit {
+ height: 22px;
+ width: 70px;
+ float: right;
+}
+
+#profile-upload-wrapper,
+#wall-image-upload-div,
+#wall-image-upload,
+#wall-file-upload-div,
+#wall-file-upload,
+#profile-link,
+#profile-video,
+#profile-audio,
+#profile-location,
+#profile-nolocation,
+#profile-expires,
+#profile-expires,
+#jot-perms-icon,
+#jot-preview-link,
+#profile-encrypt,
+.hover, .focus {
+ cursor: pointer;
+}
+
+#profile-upload-wrapper,
+#profile-attach-wrapper,
+#profile-link-wrapper,
+#profile-video-wrapper,
+#profile-audio-wrapper,
+#profile-location-wrapper,
+#profile-nolocation-wrapper,
+#profile-expire-wrapper,
+#profile-encrypt-wrapper {
+ float: left;
+ margin-left: 15px;
+}
+
+#profile-jot-perms {
+ float: right;
+ padding: 6px;
+}
+
+#jot-perms-icon {
+ float: left;
+}
+
+#jot-preview-link {
+ float: left;
+ margin-left: 45px;
+ margin-top: 0px;
+}
+
+#profile-jot-perms-end {
+ height: 30px;
+}
+
+#profile-jot-end {
+ margin-bottom: 30px;
+}
+
+#profile-rotator {
+ float: left;
+ margin: 8px 0px 0px 20px;
+}
+
+/* this is referenced in js/acl.js - not sure if it is still needed. */
+.profile-jot-net {
+ float: left;
+ margin-right: 10px;
+ margin-top: 5px;
+ margin-bottom: 5px;
+}
+
+/* conversation */
+
+.thread-wrapper.toplevel_item {
+ width: 92%;
+}
+
+/* conv_item */
+
+.hide-comments-outer {
+ margin-left: 10px;
+}
+
+.wall-item-content-wrapper {
+ margin-top: 10px;
+ position: relative;
+}
+
+.wall-item-content-wrapper .wall-item-delete-wrapper {
+ opacity: 0;
+}
+
+.wall-item-content-wrapper:hover .wall-item-delete-wrapper {
+ opacity: 1;
+}
+
+.wall-item-info {
+ display: block;
+ float: left;
+ width:110px;
+ margin-right:10px;
+}
+
+.comment .wall-item-info {
+ width: 70px;
+}
+
+.wallwall .wwto {
+ left: 50px;
+ margin: 0;
+ position: absolute;
+ width: 30px
+}
+
+.wallwall .wwto img {
+ width: 30px !important;
+ height: 30px !important;
+}
+
+.wallwall .wall-item-photo-end {
+ clear: both;
+}
+
+.wall-item-photo-wrapper {
+ margin-top: 0px;
+ margin-left: 10px;
+ margin-bottom: 10px;
+ width: 100px;
+}
+
+.wall-item-photo-menu-button {
+ left:10px;
+ display: block;
+ position: absolute;
+ margin: 0px;
+ padding: 0px;
+ width: 16px;
+ height: 16px;
+ overflow: hidden;
+ text-indent: 40px;
+ display: none;
+}
+
+.wall-item-photo-menu {
+ left:10px;
+ width: auto;
+ position: absolute;
+ display: none;
+ z-index: 10000;
+}
+
+.wall-item-photo-menu ul {
+ margin:0px;
+ padding: 0px;
+}
+
+.wall-item-photo-menu li a {
+ display: block;
+ padding: 2px;
+}
+
+.wall-item-arrowphoto-wrapper {
+ position: absolute;
+ z-index: 99;
+}
+
+.wall-item-wrapper {
+ margin-left:10px;
+}
+
+
+.wall-item-arrowphoto-wrapper {
+ left: 75px;
+}
+
+.wall-item-lock {
+ position: absolute;
+ left: 105px;
+ top: 1px;
+}
+
+.comment .wall-item-lock {
+ left: 65px;
+}
+
+.wall-item-lock {
+
+}
+
+.lockview {
+ cursor: pointer;
+}
+
+.wall-item-location {
+ overflow: hidden;
+ /* add ellipsis on text overflow */
+ /* this work on safari, opera, ie, chrome. */
+ /* firefox users have to wait support or we */
+ /* can use a jquery plugin http://bit.ly/zJskg */
+ text-overflow: ellipsis;
+ -o-text-overflow: ellipsis;
+ width: 100%;
+}
+
+.wall-item-author {
+ margin-top: 10px;
+}
+
+
+.wall-item-ago .icon-ok {
+ cursor: pointer;
+}
+
+.wall-item-content {
+ margin-left: 10px;
+ overflow: auto;
+}
+
+.wall-item-content img {
+ max-width: 95% !important;
+}
+
+.wall-item-title {
+ float: left;
+ font-weight: bold;
+}
+
+.wall-item-title-end {
+ clear: both;
+}
+
+.wall-item-body {
+ margin-top: 10px;
+}
+
+.wall-item-body.divmore {
+ padding-bottom: 15px;
+}
+
+.body-tag, .filesavetags, .categorytags {
+ opacity: 0.5;
+ filter:alpha(opacity=50);
+}
+
+.body-tag:hover, .filesavetags:hover, .categorytags:hover {
+ opacity: 1.0 !important;
+ filter:alpha(opacity=100) !important;
+}
+
+.body-tag {
+ margin-top: 15px;
+}
+
+.wall-item-tools {
+ clear: both;
+ padding: 5px 10px;
+}
+
+.item-tool {
+ float: left;
+ margin-right: 8px;
+ cursor: pointer;
+}
+
+.like-rotator {
+ float: left;
+ margin: 8px;
+ color: $toolicon_colour;
+}
+
+.wall-item-delete-wrapper {
+ float: right;
+}
+
+.wall-item-delete-end {
+ clear: both;
+}
+
+.item-select {
+ opacity: 0.1;
+ filter:alpha(opacity=10);
+ float: right;
+ margin-right: 10px;
+
+}
+
+.item-select:hover,
+.checkeditem {
+ opacity: 1;
+ filter:alpha(opacity=100);
+}
+
+.wall-item-like,
+.wall-item-dislike {
+ margin-top: 5px;
+}
+
+.wall-item-wrapper-end {
+ clear: both;
+}
+
+/* comment_item */
+
+.comment-wwedit-wrapper.threaded > .comment-edit-form > .comment-edit-photo {
+ width: 40px;
+}
+
+.comment-wwedit-wrapper.threaded > .comment-edit-form > .comment-edit-text-empty {
+ height: 1.5em;
+}
+
+.comment-wwedit-wrapper.threaded > .comment-edit-form > .comment-edit-submit-wrapper > .comment-edit-submit {
+ margin-left: 50px;
+}
+
+.comment-edit-photo {
+ margin-top: 10px;
+ margin-left: 10px;
+ margin-bottom: 10px;
+ width: 100px;
+ float: left;
+}
+
+[class^="comment-edit-bb"] {
+ display: none;
+ margin: 0px 0 -5px 0px;
+ padding: 0px;
+ width: 75%;
+}
+
+[class^="comment-edit-bb"] > li {
+ display: inline-block;
+ margin: 10px 10px 0 0;
+ visibility: none;
+}
+
+[class^="comment-edit-bb-end"] {
+ clear: both;
+}
+
+.comment-edit-text-empty, .comment-edit-text-full {
+ float: left;
+ margin-top: 10px;
+ padding: 3px 1px 1px 3px;
+ padding: 8px;
+}
+
+.comment-edit-text-empty {
+ height: 1.0em;
+ width: 270px;
+ overflow: auto;
+ margin-bottom: 10px;
+}
+
+.comment-edit-text-full {
+ height: 150px;
+ width: 80%;
+ overflow: auto;
+}
+
+.qcomment {
+ border: 1px solid #EEE;
+ padding: 3px;
+ margin-top: 15px;
+ margin-left: 25px;
+ width: 125px;
+ overflow-y: auto;
+}
+
+.qcomment option {
+ width: 125px;
+ overflow-x: hidden;
+}
+
+.qcomment {
+ opacity: 0.3;
+ filter:alpha(opacity=30);
+}
+
+.qcomment:hover {
+ opacity: 1.0;
+ filter:alpha(opacity=100);
+}
+
+.comment-edit-text-end {
+ clear: both;
+}
+
+.comment-edit-submit {
+ margin: 10px 0px 10px 110px;
+}
+
+.comment-preview-icon {
+ margin-left: 15px;
+}
diff --git a/view/css/default.css b/view/css/default.css
index f3b34a86d..27df38dee 100644
--- a/view/css/default.css
+++ b/view/css/default.css
@@ -1,10 +1,14 @@
nav {
- height: 94px;
+ height: 24px;
display: block;
+ position: fixed;
+ width: 100%;
+ z-index: 100;
+ background-color: #ff0000;
}
-aside {
+aside#region_1 {
display: block;
width: 210px;
position: absolute;
@@ -13,6 +17,10 @@ aside {
margin-left: 10px;
}
+aside input[type='text'] {
+ width: 174px;
+}
+
section {
position: absolute;
@@ -22,5 +30,3 @@ section {
right: 15px;
padding-bottom: 350px;
}
-
-
diff --git a/view/css/full.css b/view/css/full.css
index 5819b6b3a..2e710df1d 100644
--- a/view/css/full.css
+++ b/view/css/full.css
@@ -1,6 +1,6 @@
nav {
- height: 94px;
+ height: 24px;
display: block;
}
diff --git a/view/css/mod_admin.css b/view/css/mod_admin.css
new file mode 100644
index 000000000..6ceec3ac5
--- /dev/null
+++ b/view/css/mod_admin.css
@@ -0,0 +1,63 @@
+
+
+/**
+ * ADMIN
+ */
+#pending-update {
+ float:right;
+ color: #ffffff;
+ font-weight: bold;
+ background-color: #FF0000;
+ padding: 0em 0.3em;
+
+}
+#adminpage dl {
+ clear: left;
+ margin-bottom: 2px;
+ padding-bottom: 2px;
+ border-bottom: 1px solid black;
+}
+#adminpage dt {
+ width: 200px;
+ float: left;
+ font-weight: bold;
+}
+#adminpage dd {
+ margin-left: 200px;
+}
+
+#adminpage h3 {
+ border-bottom: 1px solid #cccccc;
+}
+#adminpage .field label {
+ font-weight: bold;
+}
+#adminpage .submit {
+ clear:left;
+ text-align: right;
+}
+
+#adminpage #pluginslist {
+ margin: 0px; padding: 0px;
+}
+#adminpage .plugin {
+ list-style: none;
+ display: block;
+ border: 1px solid #888888;
+ padding: 1em;
+ margin-bottom: 5px;
+ clear: left;
+}
+#adminpage .plugin .desc { margin-left: 2.5em;}
+#adminpage .toggleplugin {
+ float:left;
+ margin-right: 1em;
+}
+
+#adminpage table {width:100%; border-bottom: 1px solid #000000; margin: 5px 0px;}
+#adminpage table th { text-align: left;}
+#adminpage td .icon { float: left;}
+#adminpage table#users img { width: 16px; height: 16px; }
+#adminpage table tr:hover { background-color: #bbc7d7; }
+#adminpage .selectall { text-align: right; }
+
diff --git a/view/css/mod_connect.css b/view/css/mod_connect.css
new file mode 100644
index 000000000..d1a46ec48
--- /dev/null
+++ b/view/css/mod_connect.css
@@ -0,0 +1,11 @@
+.sellpage-body {
+ margin-top: 25px;
+}
+
+.sellpage-final {
+ margin-top: 25px;
+}
+
+#sellpage-edit label{
+ width: 300px;
+} \ No newline at end of file
diff --git a/view/css/mod_connections.css b/view/css/mod_connections.css
new file mode 100644
index 000000000..c460fec28
--- /dev/null
+++ b/view/css/mod_connections.css
@@ -0,0 +1,137 @@
+
+.field_abook_help {
+ color: #000;
+}
+.abook-them {
+ margin-left: 375px;
+ margin-bottom: 15px;
+}
+.abook-me {
+ margin-left: 36px;
+ margin-bottom: 15px;
+}
+.acheckbox {
+ margin-bottom: 5px !important;
+}
+
+.abook-pending-contact {
+ background: orange;
+ font-weight: bold;
+ margin: 10px;
+ padding: 20px 5px 10px;
+}
+
+#contact-slider {
+ width: 600px !important;
+}
+
+.abook-edit-them, .abook-edit-me {
+ float: left;
+ width: 100px !important;
+}
+.field_abook_help {
+ float: left;
+}
+
+#contacts-main {
+ margin-top: 20px;
+ margin-bottom: 20px;
+}
+
+
+
+#contact-edit-wrapper {
+ margin-top: 10px;
+}
+
+#contact-edit-banner-name {
+ font-size: 1.4em;
+ font-weight: bold;
+}
+
+#contact-edit-poll-wrapper {
+ margin-top: 15px;
+}
+
+#contact-edit-poll-text {
+ margin-top: 15px;
+ margin-bottom: 5px;
+}
+
+#contact-edit-update-now {
+ margin-top: 15px;
+}
+
+#contact-edit-links{
+ clear: both;
+}
+
+#contact-edit-links ul {
+ list-style: none;
+ list-style-type: none;
+ margin-left: 0px;
+ padding-left: 0px;
+}
+
+#contact-edit-links li {
+ margin-top: 5px;
+}
+
+#contact-edit-drop-link {
+ float: right;
+ margin-right: 20px;
+}
+
+#contact-edit-nav-end {
+ clear: both;
+}
+
+#contact-edit-wrapper {
+ width: 100%;
+}
+
+#contact-edit-end {
+ clear: both;
+ margin-top: 15px;
+}
+
+#contact-profile-selector {
+ width: 175px;
+ margin-left: 175px;
+}
+
+.contact-edit-submit {
+ margin-top: 20px;
+}
+
+.contact-entry-wrapper {
+ float: left;
+ width: 120px;
+ height: 120px;
+ padding: 10px;
+}
+
+#contacts-search {
+ font-size: 1em;
+ width: 300px;
+}
+
+#contacts-search-end {
+ margin-bottom: 10px;
+}
+
+.contact-entry-photo-end {
+ clear: both;
+}
+
+.contact-entry-name {
+ float: left;
+ margin-left: 0px;
+ margin-right: 10px;
+ width: 120px;
+ overflow: hidden;
+}
+
+.contact-entry-end {
+ clear: both;
+}
diff --git a/view/css/mod_connedit.css b/view/css/mod_connedit.css
new file mode 100644
index 000000000..c460fec28
--- /dev/null
+++ b/view/css/mod_connedit.css
@@ -0,0 +1,137 @@
+
+.field_abook_help {
+ color: #000;
+}
+.abook-them {
+ margin-left: 375px;
+ margin-bottom: 15px;
+}
+.abook-me {
+ margin-left: 36px;
+ margin-bottom: 15px;
+}
+.acheckbox {
+ margin-bottom: 5px !important;
+}
+
+.abook-pending-contact {
+ background: orange;
+ font-weight: bold;
+ margin: 10px;
+ padding: 20px 5px 10px;
+}
+
+#contact-slider {
+ width: 600px !important;
+}
+
+.abook-edit-them, .abook-edit-me {
+ float: left;
+ width: 100px !important;
+}
+.field_abook_help {
+ float: left;
+}
+
+#contacts-main {
+ margin-top: 20px;
+ margin-bottom: 20px;
+}
+
+
+
+#contact-edit-wrapper {
+ margin-top: 10px;
+}
+
+#contact-edit-banner-name {
+ font-size: 1.4em;
+ font-weight: bold;
+}
+
+#contact-edit-poll-wrapper {
+ margin-top: 15px;
+}
+
+#contact-edit-poll-text {
+ margin-top: 15px;
+ margin-bottom: 5px;
+}
+
+#contact-edit-update-now {
+ margin-top: 15px;
+}
+
+#contact-edit-links{
+ clear: both;
+}
+
+#contact-edit-links ul {
+ list-style: none;
+ list-style-type: none;
+ margin-left: 0px;
+ padding-left: 0px;
+}
+
+#contact-edit-links li {
+ margin-top: 5px;
+}
+
+#contact-edit-drop-link {
+ float: right;
+ margin-right: 20px;
+}
+
+#contact-edit-nav-end {
+ clear: both;
+}
+
+#contact-edit-wrapper {
+ width: 100%;
+}
+
+#contact-edit-end {
+ clear: both;
+ margin-top: 15px;
+}
+
+#contact-profile-selector {
+ width: 175px;
+ margin-left: 175px;
+}
+
+.contact-edit-submit {
+ margin-top: 20px;
+}
+
+.contact-entry-wrapper {
+ float: left;
+ width: 120px;
+ height: 120px;
+ padding: 10px;
+}
+
+#contacts-search {
+ font-size: 1em;
+ width: 300px;
+}
+
+#contacts-search-end {
+ margin-bottom: 10px;
+}
+
+.contact-entry-photo-end {
+ clear: both;
+}
+
+.contact-entry-name {
+ float: left;
+ margin-left: 0px;
+ margin-right: 10px;
+ width: 120px;
+ overflow: hidden;
+}
+
+.contact-entry-end {
+ clear: both;
+}
diff --git a/view/css/mod_directory.css b/view/css/mod_directory.css
new file mode 100644
index 000000000..bc8054937
--- /dev/null
+++ b/view/css/mod_directory.css
@@ -0,0 +1,44 @@
+
+.directory-end {
+ clear: both;
+}
+.directory-name {
+ text-align: center;
+}
+.directory-photo {
+ margin-left: 25px;
+}
+.directory-details {
+ text-align: center;
+ margin-left: 5px;
+ margin-right: 5px;
+}
+.directory-item {
+ float: left;
+ width: 225px;
+ height: 260px;
+ overflow: hidden;
+ margin: 2px;
+}
+
+#directory-search-wrapper {
+ margin-top: 20px;
+ margin-right: 20px;
+ margin-bottom: 50px;
+}
+
+#directory-search-end {
+}
+
+.directory-photo-img {
+ border: none;
+}
+
+div.dirtagblock.widget {
+ overflow: hidden;
+}
+
+.dirpopup {
+ float: left;
+ width: 225px;
+}
diff --git a/view/css/mod_filestorage.css b/view/css/mod_filestorage.css
new file mode 100644
index 000000000..98fa8e93d
--- /dev/null
+++ b/view/css/mod_filestorage.css
@@ -0,0 +1,11 @@
+#attach-edit-backlink, #cutpasteinput, #linkpasteinput {
+ margin-bottom: 10px;
+}
+
+#attach-edit-submit {
+ margin-top: 20px;
+}
+
+#cutpasteinput, #linkpasteinput {
+ width: 600px;
+} \ No newline at end of file
diff --git a/view/css/mod_group.css b/view/css/mod_group.css
new file mode 100644
index 000000000..cc5f15843
--- /dev/null
+++ b/view/css/mod_group.css
@@ -0,0 +1,66 @@
+
+#group-new-submit-wrapper {
+ margin-top: 30px;
+}
+
+#group-edit-form label {
+ float: left;
+ width: 300px;
+}
+
+#group-edit-form input {
+ float: left;
+ width: 175px;
+}
+
+#group-edit-form .field {
+ clear: both;
+}
+
+#group-edit-submit-wrapper input {
+ clear: both;
+ width: 100px;
+}
+
+#group-edit-select-end {
+ clear: both;
+}
+
+#group-edit-name-label {
+ float: left;
+ width: 175px;
+ margin-top: 20px;
+ margin-bottom: 20px;
+}
+
+#group-edit-name {
+ float: left;
+ width: 225px;
+ margin-top: 20px;
+ margin-bottom: 20px;
+}
+
+#group-edit-name-wrapper {
+
+
+}
+
+
+#group_members_select_label {
+ display: block;
+ float: left;
+ width: 175px;
+}
+
+.group_members_select {
+ float: left;
+ width: 230px;
+ overflow: auto;
+}
+
+#group_members_select_end {
+ clear: both;
+}
+#group-edit-name-end {
+ clear: both;
+}
diff --git a/view/css/mod_mail.css b/view/css/mod_mail.css
new file mode 100644
index 000000000..c278f4d53
--- /dev/null
+++ b/view/css/mod_mail.css
@@ -0,0 +1,100 @@
+/* message */
+
+#mail-list-wrapper {
+ border-top: 1px solid #ccc;
+ padding: 5px 5px 5px 5px;
+}
+
+span.mail-list {
+ float: left;
+ width: 20%;
+}
+
+img.mail-list-sender-photo {
+ height: 24px;
+ width: 24px;
+ float: left;
+ margin-right: 30px;
+}
+
+.mail-list-remove {
+ width: 5% !important;
+}
+
+/* message/new */
+
+#prvmail-to-label,
+#prvmail-subject-label,
+#prvmail-expires-label,
+#prvmail-message-label {
+ margin-bottom: 10px;
+ margin-top: 20px;
+}
+
+#prvmail-submit {
+ float: left;
+ margin-top: 10px;
+ margin-right: 30px;
+}
+
+#prvmail-upload-wrapper,
+#prvmail-attach-wrapper,
+#prvmail-link-wrapper,
+#prvmail-expire-wrapper,
+#prvmail-encrypt-wrapper,
+#prvmail-rotator-wrapper {
+ float: left;
+ margin-top: 10px;
+ margin-right: 10px;
+ width: 24px;
+ cursor: pointer;
+}
+
+#prvmail-end {
+ clear: both;
+}
+
+/* message/id */
+
+.mail-conv-outside-wrapper {
+ margin-top: 30px;
+}
+
+.mail-conv-sender,
+.mail-conv-detail {
+ float: left;
+}
+
+.mail-conv-detail {
+ margin-left: 20px;
+ width: 500px;
+}
+
+.mail-conv-subject {
+ font-size: 1.4em;
+ margin: 10px 0;
+}
+
+.mail-conv-delete-wrapper {
+ float: right;
+ margin-right: 30px;
+ margin-top: 15px;
+}
+
+.mail-conv-delete-icon {
+ border: none;
+}
+
+.mail-conv-recall-wrapper {
+ float: right;
+ margin-right: 10px;
+ margin-top: 15px;
+}
+
+.mail-conv-outside-wrapper-end {
+ clear: both;
+}
+
+.mail-conv-break {
+ clear: both;
+}
diff --git a/view/css/mod_manage.css b/view/css/mod_manage.css
index 51f5062ae..58f9d3159 100644
--- a/view/css/mod_manage.css
+++ b/view/css/mod_manage.css
@@ -1,8 +1,8 @@
#channels-selected {
color: #666666;
font-size: 1.2em;
- margin-top: 20px;
- margin-bottom: 10px;
+ width: 120px;
+ margin: 20px auto 10px auto;
}
#channels-desc {
@@ -12,12 +12,23 @@
margin-bottom: 20px;
}
+#selected-channel {
+ width: 200px;
+ margin: 0px auto 0px auto;
+}
+
+#selected-channel .channel-selection {
+ clear: both;
+ width: 120px;
+ margin: 0px auto 0px auto;
+}
+
.channel-selection-default {
font-size: 0.8em;
margin-bottom: 10px;
}
-.channel-selection {
+#all-channels .channel-selection {
width: 120px;
float: left;
}
diff --git a/view/css/mod_message.css b/view/css/mod_message.css
new file mode 100644
index 000000000..c278f4d53
--- /dev/null
+++ b/view/css/mod_message.css
@@ -0,0 +1,100 @@
+/* message */
+
+#mail-list-wrapper {
+ border-top: 1px solid #ccc;
+ padding: 5px 5px 5px 5px;
+}
+
+span.mail-list {
+ float: left;
+ width: 20%;
+}
+
+img.mail-list-sender-photo {
+ height: 24px;
+ width: 24px;
+ float: left;
+ margin-right: 30px;
+}
+
+.mail-list-remove {
+ width: 5% !important;
+}
+
+/* message/new */
+
+#prvmail-to-label,
+#prvmail-subject-label,
+#prvmail-expires-label,
+#prvmail-message-label {
+ margin-bottom: 10px;
+ margin-top: 20px;
+}
+
+#prvmail-submit {
+ float: left;
+ margin-top: 10px;
+ margin-right: 30px;
+}
+
+#prvmail-upload-wrapper,
+#prvmail-attach-wrapper,
+#prvmail-link-wrapper,
+#prvmail-expire-wrapper,
+#prvmail-encrypt-wrapper,
+#prvmail-rotator-wrapper {
+ float: left;
+ margin-top: 10px;
+ margin-right: 10px;
+ width: 24px;
+ cursor: pointer;
+}
+
+#prvmail-end {
+ clear: both;
+}
+
+/* message/id */
+
+.mail-conv-outside-wrapper {
+ margin-top: 30px;
+}
+
+.mail-conv-sender,
+.mail-conv-detail {
+ float: left;
+}
+
+.mail-conv-detail {
+ margin-left: 20px;
+ width: 500px;
+}
+
+.mail-conv-subject {
+ font-size: 1.4em;
+ margin: 10px 0;
+}
+
+.mail-conv-delete-wrapper {
+ float: right;
+ margin-right: 30px;
+ margin-top: 15px;
+}
+
+.mail-conv-delete-icon {
+ border: none;
+}
+
+.mail-conv-recall-wrapper {
+ float: right;
+ margin-right: 10px;
+ margin-top: 15px;
+}
+
+.mail-conv-outside-wrapper-end {
+ clear: both;
+}
+
+.mail-conv-break {
+ clear: both;
+}
diff --git a/view/css/mod_photos.css b/view/css/mod_photos.css
new file mode 100644
index 000000000..58a9bea38
--- /dev/null
+++ b/view/css/mod_photos.css
@@ -0,0 +1,167 @@
+
+
+.photo-top-photo, .photo-album-photo {
+ padding: 10px;
+ max-width: 300px;
+}
+
+
+.photos-end {
+ clear: both;
+ margin-bottom: 25px;
+}
+
+#photo-prev-link, #photo-next-link {
+ padding: 10px;
+ float: left;
+}
+
+#photo-photo {
+ float: left;
+}
+
+#photo-photo-end {
+ clear: both;
+}
+
+.photo-album-image-wrapper {
+ float: left;
+ margin-top: 15px;
+ margin-right: 15px;
+ margin-left: 15px;
+}
+.photo-album-image-wrapper .caption {
+ display: none;
+ width: 100%;
+ bottom: 0px;
+ padding: 0.5em 0.5em 0px 0.5em;
+ margin: 0px;
+}
+.photo-album-image-wrapper a:hover .caption {
+ display:block;
+}
+
+#photo-album-end {
+ clear: both;
+ margin-bottom: 25px;
+}
+
+.photo-top-image-wrapper {
+ float: left;
+ margin-top: 15px;
+ margin-right: 15px;
+ margin-left: 15px;
+ margin-bottom: 15px;
+}
+.photo-top-album-name {
+ width: 100%;
+ min-height: 2em;
+ bottom: 0px;
+ padding: 0px 3px;
+ padding-top: 0.5em;
+}
+#photo-top-end {
+ clear: both;
+}
+
+#photo-top-links {
+ margin-bottom: 30px;
+ margin-left: 30px;
+}
+
+#photos-upload-newalbum-div {
+ float: left;
+ width: 175px;
+}
+
+#photos-upload-noshare {
+ margin-bottom: 10px;
+}
+#photos-upload-existing-album-text {
+ float: left;
+ width: 175px;
+}
+#photos-upload-newalbum {
+ float: left;
+}
+#photos-upload-album-select {
+ float: left;
+}
+
+#photos-upload-spacer {
+ margin-top: 25px;
+}
+#photos-upload-new-end, #photos-upload-exist-end {
+ clear: both;
+}
+#photos-upload-exist-end {
+ margin-bottom: 15px;
+}
+#photos-upload-submit {
+ margin-top: 15px;
+}
+
+
+#photos-upload-select-files-text {
+ margin-top: 15px;
+ margin-bottom: 15px;
+}
+
+#photo-edit-caption-label, #photo-edit-tags-label, #photo-edit-albumname-label, #photo-edit-rotate-label {
+ float: left;
+ width: 150px;
+}
+
+#photo-edit-perms-end {
+ margin-bottom: 15px;
+}
+
+#photo-edit-caption, #photo-edit-newtag, #photo-edit-albumname, #photo-edit-rotate {
+ float: left;
+ margin-bottom: 25px;
+}
+#photo-edit-link-wrap {
+ margin-bottom: 15px;
+}
+#photo-like-div {
+ margin-bottom: 25px;
+}
+
+#photo-edit-caption-end, #photo-edit-tags-end, #photo-edit-albumname-end, #photo-edit-rotate-end {
+ clear: both;
+}
+
+#photo-edit-rotate-end {
+ margin-bottom: 15px;
+}
+
+#photo-edit-delete-button {
+ margin-left: 200px;
+}
+#photo-edit-end {
+ margin-bottom: 35px;
+}
+#photo-caption {
+ margin-top: 15px;
+ margin-bottom: 15px;
+}
+
+#in-this-photo-text {
+ margin-left: 30px;
+}
+
+#in-this-photo {
+ margin-left: 60px;
+ margin-top: 10px;
+ margin-bottom: 20px;
+}
+
+#photo-album-edit-submit, #photo-album-edit-drop {
+ margin-top: 15px;
+ margin-bottom: 15px;
+}
+
+#photo-album-edit-drop {
+ margin-left: 200px;
+}
+
diff --git a/view/css/mod_profiles.css b/view/css/mod_profiles.css
new file mode 100644
index 000000000..5f930248f
--- /dev/null
+++ b/view/css/mod_profiles.css
@@ -0,0 +1,156 @@
+#profile-edit-default-desc {
+ color: #FF0000;
+ border: 1px solid #FF8888;
+ background-color: #FFEEEE;
+ padding: 7px;
+}
+
+#profile-edit-clone-link-wrapper {
+ float: left;
+ margin-left: 50px;
+ margin-bottom: 20px;
+ width: 300px;
+}
+
+
+#profile-listing-desc, #profile-stuff-link {
+ margin-left: 30px;
+}
+
+#profile-listing-new-link-wrapper {
+ margin-left: 30px;
+ margin-bottom: 30px;
+}
+
+
+#profile-edit-links-end {
+ clear: both;
+ margin-bottom: 15px;
+}
+
+.profile-listing-photo {
+ border: none;
+}
+
+.profile-edit-submit-wrapper {
+ margin-top: 20px;
+ margin-bottom: 20px;
+}
+
+#profile-photo-link-select-wrapper {
+ margin-top: 2em;
+}
+
+#profile-photo-submit-wrapper {
+ margin-top: 10px;
+}
+
+#profile-edit-with-label, #profile-edit-howlong-label {
+
+ width: 175px;
+ margin-left: 50px;
+ margin-bottom: 20px;
+}
+
+#profile-edit-profile-name-label,
+#profile-edit-name-label,
+#profile-edit-pdesc-label,
+#profile-edit-gender-label,
+#profile-edit-dob-label,
+#profile-edit-address-label,
+#profile-edit-locality-label,
+#profile-edit-region-label,
+#profile-edit-postal-code-label,
+#profile-edit-country-name-label,
+#profile-edit-marital-label,
+#profile-edit-sexual-label,
+#profile-edit-politic-label,
+#profile-edit-religion-label,
+#profile-edit-pubkeywords-label,
+#profile-edit-prvkeywords-label,
+#profile-edit-homepage-label,
+#profile-edit-hometown-label {
+ float: left;
+ width: 175px;
+}
+
+#profile-edit-profile-name,
+#profile-edit-name,
+#profile-edit-pdesc,
+#gender-select,
+#profile-edit-dob,
+#profile-edit-address,
+#profile-edit-locality,
+#profile-edit-region,
+#profile-edit-postal-code,
+#profile-edit-country-name,
+#marital-select,
+#sexual-select,
+#profile-edit-politic,
+#profile-edit-religion,
+#profile-edit-pubkeywords,
+#profile-edit-prvkeywords,
+#profile-in-dir-yes,
+#profile-in-dir-no,
+#profile-in-netdir-yes,
+#profile-in-netdir-no,
+#hide-wall-yes,
+#hide-wall-no,
+#hide-friends-yes,
+#hide-friends-no {
+ float: left;
+ margin-bottom: 20px;
+}
+
+
+#profile-edit-pdesc-desc,
+#profile-edit-pubkeywords-desc,
+#profile-edit-prvkeywords-desc {
+ float: left;
+ margin-left: 20px;
+}
+
+
+#profile-edit-homepage, #profile-edit-hometown {
+ float: left;
+ margin-bottom: 35px;
+}
+
+#profile-edit-profile-name-end,
+#profile-edit-name-end,
+#profile-edit-pdesc-end,
+#profile-edit-gender-end,
+#profile-edit-dob-end,
+#profile-edit-address-end,
+#profile-edit-locality-end,
+#profile-edit-region-end,
+#profile-edit-postal-code-end,
+#profile-edit-country-name-end,
+#profile-edit-marital-end,
+#profile-edit-sexual-end,
+#profile-edit-politic-end,
+#profile-edit-religion-end,
+#profile-edit-pubkeywords-end,
+#profile-edit-prvkeywords-end,
+#profile-edit-homepage-end,
+#profile-edit-hometown-end,
+#profile-in-dir-break,
+#profile-in-dir-end,
+#profile-in-netdir-break,
+#profile-in-netdir-end,
+#hide-wall-break,
+#hide-wall-end,
+#hide-friends-break,
+#hide-friends-end {
+ clear: both;
+}
+
+
+#gender-select, #marital-select, #sexual-select {
+ width: 220px;
+}
+
+#profile-edit-profile-name-wrapper .required {
+ color: #FF0000;
+ float: left;
+}
diff --git a/view/css/mod_register.css b/view/css/mod_register.css
index aca6ee002..b662610ae 100644
--- a/view/css/mod_register.css
+++ b/view/css/mod_register.css
@@ -10,6 +10,13 @@ h2 {
margin-top: 5%;
}
+#register-desc, #register-text, #register-sites {
+ font-weight: bold;
+ margin-bottom: 15px;
+ padding: 8px;
+ border: 1px solid #ccc;
+}
+
.register-label {
float: left;
width: 275px;
diff --git a/view/css/mod_settings.css b/view/css/mod_settings.css
index 0532268f1..601cb2e0e 100644
--- a/view/css/mod_settings.css
+++ b/view/css/mod_settings.css
@@ -13,3 +13,14 @@
margin-top: 15px;
margin-bottom: 45px;
}
+
+
+
+#settings-notifications label {
+ margin-left: 20px;
+}
+#settings-notify-desc, #settings-activity-desc {
+ font-weight: bold;
+ margin-bottom: 15px;
+}
+
diff --git a/view/css/mod_setup.css b/view/css/mod_setup.css
new file mode 100644
index 000000000..ee725d055
--- /dev/null
+++ b/view/css/mod_setup.css
@@ -0,0 +1,34 @@
+#install-dbhost-label,
+#install-dbuser-label,
+#install-dbpass-label,
+#install-dbdata-label,
+#install-tz-desc {
+ float: left;
+ width: 250px;
+ margin-top: 10px;
+ margin-bottom: 10px;
+
+}
+
+#install-dbhost,
+#install-dbuser,
+#install-dbpass,
+#install-dbdata {
+ float: left;
+ width: 200px;
+ margin-left: 20px;
+}
+
+#install-dbhost-end,
+#install-dbuser-end,
+#install-dbpass-end,
+#install-dbdata-end,
+#install-tz-end {
+ clear: both;
+}
+
+#install-form select#timezone_select {
+ float: left;
+ margin-top: 18px;
+ margin-left: 20px;
+}
diff --git a/view/css/mod_thing.css b/view/css/mod_thing.css
new file mode 100644
index 000000000..2a2ba7c92
--- /dev/null
+++ b/view/css/mod_thing.css
@@ -0,0 +1,27 @@
+
+
+.thing-profile #contact-profile-selector {
+ margin-left: 0;
+}
+
+.thing-verb-label {
+ margin-top: 15px;
+}
+
+.thing-verb {
+ margin-bottom: 15px;
+}
+
+.thing-label {
+ float: left;
+ width: 250px;
+}
+
+.thing-input {
+ float: left;
+ margin-bottom: 15px;
+}
+
+.thing-field-end {
+ clear: both;
+} \ No newline at end of file
diff --git a/view/css/widgets.css b/view/css/widgets.css
new file mode 100644
index 000000000..a34508961
--- /dev/null
+++ b/view/css/widgets.css
@@ -0,0 +1,123 @@
+.widget {
+ padding: 8px;
+ margin-top: 5px;
+}
+
+/* suggest */
+
+.suggest-widget-more {
+ margin-top: 10px;
+}
+
+/* follow */
+
+#side-follow-url {
+ margin-top: 5px;
+}
+
+#side-follow-submit {
+ margin-top: 15px;
+}
+
+/* notes */
+
+#note-text {
+ width: 190px;
+ max-width: 190px;
+ height: 150px;
+}
+
+#note-save {
+ margin-top: 10px;
+}
+
+/* saved searches */
+
+.saved-search-li {
+ margin-top: 3px;
+}
+
+.saved-search-li i {
+ opacity: 0;
+}
+
+.saved-search-li:hover i {
+ opacity: 1;
+}
+
+.savedsearchterm {
+ margin-left: 10px;
+}
+
+/* fileas */
+
+.fileas-ul li {
+ margin-top: 10px;
+}
+
+.fileas-link {
+ margin-left: 24px;
+}
+
+.fileas-all {
+ margin-left: 0px;
+}
+
+/* posted date */
+
+#datebrowse-sidebar select {
+ width: 190px;
+ max-width: 190px;
+ height: 150px;
+}
+
+/* categories */
+
+.categories-ul li {
+ margin-top: 10px;
+}
+
+.categories-link {
+ margin-left: 24px;
+}
+
+.categories-all {
+ margin-left: 0px;
+}
+
+/* group */
+
+#group-sidebar {
+ margin-bottom: 10px;
+}
+
+#sidebar-group-list .icon, #sidebar-group-list .iconspacer {
+ display: inline-block;
+ height: 12px;
+ width: 12px;
+}
+
+#sidebar-group-list li {
+ margin-top: 3px;
+}
+
+.groupsideedit {
+ margin-right: 10px;
+}
+
+.group-edit-icon {
+ opacity: 0;
+}
+
+/* affinity - slider */
+
+#main-slider {
+ position: relative;
+ left: 5px;
+ width: 90%;
+}
+
+.slider {
+ margin-top: 10px;
+ margin-bottom: 45px;
+}
diff --git a/view/de/follow_notify_eml.tpl b/view/de/follow_notify_eml.tpl
index a866a08a2..ba07b19da 100644
--- a/view/de/follow_notify_eml.tpl
+++ b/view/de/follow_notify_eml.tpl
@@ -1,14 +1,14 @@
-Hallo $[myname],
+Dear {{$myname}},
-Du hast einen neuen Anhänger auf $[sitename] - '$[requestor]'.
+You have a new follower at {{$sitename}} - '{{$requestor}}'.
-Du kannst das Profil unter $[url] besuchen.
+You may visit their profile at {{$url}}.
-Bitte melde dich an um die Anfrage zu bestätigen oder sie zu ignorieren bzw. abzulehnen.
+Please login to your site to approve or ignore/cancel the request.
-$[siteurl]
+{{$siteurl}}
-beste Grüße,
+Regards,
- $[sitename] Administrator \ No newline at end of file
+ {{$sitename}} administrator
diff --git a/view/de/friend_complete_eml.tpl b/view/de/friend_complete_eml.tpl
index 39f2725ea..1c647b994 100644
--- a/view/de/friend_complete_eml.tpl
+++ b/view/de/friend_complete_eml.tpl
@@ -1,22 +1,22 @@
-Hallo $[username],
+Dear {{$username}},
- Großartige Neuigkeiten... '$[fn]' auf '$[dfrn_url]' hat
-deine Kontaktanfrage auf '$[sitename]' bestätigt.
+ Great news... '{{$fn}}' at '{{$dfrn_url}}' has accepted
+your connection request at '{{$sitename}}'.
-Ihr seid nun beidseitige Freunde und könnt Statusmitteilungen, Bilder und Emails
-ohne Einschränkungen austauschen.
+You are now mutual friends and may exchange status updates, photos, and email
+without restriction.
-Rufe deine 'Kontakte' Seite auf $[sitename] auf, wenn du
-Änderungen an diesem Kontakt vornehmen willst.
+Please visit your 'Connnections' page at {{$sitename}} if you wish to make
+any changes to this relationship.
-$[siteurl]
+{{$siteurl}}
-[Du könntest z.B. ein spezielles Profil anlegen, das Informationen enthält,
-die nicht für die breite Öffentlichkeit sichtbar sein sollen und es für '$[fn]' zum Betrachten freigeben].
+[For instance, you may create a separate profile with information that is not
+available to the general public - and assign viewing rights to '{{$fn}}'].
-Beste Grüße,
+Sincerely,
- $[sitename] Administrator
+ {{$sitename}} Administrator
- \ No newline at end of file
+
diff --git a/view/de/htconfig.tpl b/view/de/htconfig.tpl
new file mode 100644
index 000000000..493cb5d00
--- /dev/null
+++ b/view/de/htconfig.tpl
@@ -0,0 +1,70 @@
+<?php
+
+// Set the following for your MySQL installation
+// Copy or rename this file to .htconfig.php
+
+$db_host = '{{$dbhost}}';
+$db_port = '{{$dbport}}';
+$db_user = '{{$dbuser}}';
+$db_pass = '{{$dbpass}}';
+$db_data = '{{$dbdata}}';
+
+/*
+ * Notice: Many of the following settings will be available in the admin panel
+ * after a successful site install. Once they are set in the admin panel, they
+ * are stored in the DB - and the DB setting will over-ride any corresponding
+ * setting in this file
+ *
+ * The command-line tool util/config is able to query and set the DB items
+ * directly if for some reason the admin panel is not available and a system
+ * setting requires modification.
+ *
+ */
+
+
+// Choose a legal default timezone. If you are unsure, use "America/Los_Angeles".
+// It can be changed later and only applies to timestamps for anonymous viewers.
+
+$default_timezone = '{{$timezone}}';
+
+// What is your site name?
+
+$a->config['system']['baseurl'] = '{{$siteurl}}';
+$a->config['system']['sitename'] = "Red Matrix";
+$a->config['system']['location_hash'] = '{{$site_id}}';
+
+// Your choices are REGISTER_OPEN, REGISTER_APPROVE, or REGISTER_CLOSED.
+// Be certain to create your own personal account before setting
+// REGISTER_CLOSED. 'register_text' (if set) will be displayed prominently on
+// the registration page. REGISTER_APPROVE requires you set 'admin_email'
+// to the email address of an already registered person who can authorise
+// and/or approve/deny the request.
+
+$a->config['system']['register_policy'] = REGISTER_OPEN;
+$a->config['system']['register_text'] = '';
+$a->config['system']['admin_email'] = '{{$adminmail}}';
+
+// Maximum size of an imported message, 0 is unlimited
+
+$a->config['system']['max_import_size'] = 200000;
+
+// maximum size of uploaded photos
+
+$a->config['system']['maximagesize'] = 800000;
+
+// Location of PHP command line processor
+
+$a->config['system']['php_path'] = '{{$phpath}}';
+
+// Configure how we communicate with directory servers.
+// DIRECTORY_MODE_NORMAL = directory client, we will find a directory
+// DIRECTORY_MODE_SECONDARY = caching directory or mirror
+// DIRECTORY_MODE_PRIMARY = main directory server
+// DIRECTORY_MODE_STANDALONE = "off the grid" or private directory services
+
+$a->config['system']['directory_mode'] = DIRECTORY_MODE_NORMAL;
+
+// default system theme
+
+$a->config['system']['theme'] = 'redbasic';
+
diff --git a/view/de/intro_complete_eml.tpl b/view/de/intro_complete_eml.tpl
index 9d47a6fb1..2c2428d68 100644
--- a/view/de/intro_complete_eml.tpl
+++ b/view/de/intro_complete_eml.tpl
@@ -1,22 +1,22 @@
-Hallo $[username],
+Dear {{$username}},
- '$[fn]' auf '$[dfrn_url]' hat deine Verbindungsanfrage
-auf '$[sitename]' akzeptiert.
+ '{{$fn}}' at '{{$dfrn_url}}' has accepted
+your connection request at '{{$sitename}}'.
- '$[fn]' hat entschieden Dich als "Fan" zu akzeptieren, was zu einigen
-Einschränkungen bei der Kommunikation führt - wie zB das Schreiben von privaten Nachrichten und einige Profil
-Interaktionen. Sollte dies ein Promi-Konto oder eine Forum-Seite sein, werden die Einstellungen
-automatisch angewandt.
+ '{{$fn}}' has chosen to accept you a "fan", which restricts
+some forms of communication - such as private messaging and some profile
+interactions. If this is a celebrity or community page, these settings were
+applied automatically.
- '$[fn]' kann wählen, ob die Freundschaft in eine beidseitige oder alles erlaubende
-Beziehung in der Zukunft erweitert wird.
+ '{{$fn}}' may choose to extend this into a two-way or more permissive
+relationship in the future.
- Du empfängst ab sofort die öffentlichen Beiträge von '$[fn]',
-auf deiner "Netzwerk" Seite.
+ You will start receiving public status updates from '{{$fn}}',
+which will appear on your 'Matrix' page at
-$[siteurl]
+{{$siteurl}}
-Beste Grüße,
+Sincerely,
- $[sitename] Administrator \ No newline at end of file
+ {{$sitename}} Administrator
diff --git a/view/de/lostpass_eml.tpl b/view/de/lostpass_eml.tpl
index 9f71bbfb1..3b79d2791 100644
--- a/view/de/lostpass_eml.tpl
+++ b/view/de/lostpass_eml.tpl
@@ -1,32 +1,32 @@
-Hallo $[username],
- Auf $[sitename] wurde eine Anfrage zum Zurücksetzen deines
-Passworts empfangen. Um diese zu bestätigen folge bitte dem Link
-weiter unten oder kopiere ihn in die Adressleiste deines Browsers.
+Dear {{$username}},
+ A request was recently received at {{$sitename}} to reset your account
+password. In order to confirm this request, please select the verification link
+below or paste it into your web browser address bar.
-Wenn du die Anfrage NICHT gesendet haben solltest, dann IGNORIERE
-bitte diese Mail und den Link.
+If you did NOT request this change, please DO NOT follow the link
+provided and ignore and/or delete this email.
-Dein Passwort wird nicht geändert werden solange wir nicht überprüfen
-konnten, dass du die Anfrage gestellt hast.
+Your password will not be changed unless we can verify that you
+issued this request.
-Folge diesem Link um deine Identität zu verifizieren:
+Follow this link to verify your identity:
-$[reset_link]
+{{$reset_link}}
-Du wirst eine weitere Email erhalten mit dem neuen Passwort.
+You will then receive a follow-up message containing the new password.
-Das Passwort kannst du anschließend wie gewohnt in deinen Account Einstellungen ändern.
+You may change that password from your account settings page after logging in.
-Die Login-Details sind die folgenden:
+The login details are as follows:
-Adresse der Seite: $[siteurl]
-Login Name: $[email]
+Site Location: {{$siteurl}}
+Login Name: {{$email}}
-Grüße,
- $[sitename] Administrator
+Sincerely,
+ {{$sitename}} Administrator
- \ No newline at end of file
+
diff --git a/view/de/messages.po b/view/de/messages.po
index 341cad3ad..c1d036c13 100644
--- a/view/de/messages.po
+++ b/view/de/messages.po
@@ -1,7628 +1,7134 @@
-# FRIENDICA Distributed Social Network
-# Copyright (C) 2010, 2011 the Friendica Project
-# This file is distributed under the same license as the Friendica package.
+# Red Communications Project
+# Copyright (C) 2013 the Red Matrix Project
+# This file is distributed under the same license as the Red package.
#
# Translators:
-# bavatar <tobias.diekershoff@gmx.net>, 2011.
-# Erkan Yilmaz <erkan77@gmail.com>, 2011.
-# Fabian Dost <friends@dostmusik.de>, 2012.
-# <friends@dostmusik.de>, 2012.
-# <greeneyedred@googlemail.com>, 2012.
-# <hzuehl@phone-talk.de>, 2011, 2012.
-# <leberwurscht@hoegners.de>, 2012.
-# <marmor69@web.de>, 2012.
-# Martin Schmitt <mas@scsy.de>, 2012.
-# <tobias.diekershoff@gmx.net>, 2011, 2012.
-# <transifex@zottel.net>, 2011, 2012.
-# <ts+transifex@ml.tschlotfeldt.de>, 2011.
+# alexej <info@pixelbits.de>, 2013
+# alexej <info@pixelbits.de>, 2013
+# balder <andreas.bauer@ymail.com>, 2013
+# balder <andreas.bauer@ymail.com>, 2013
+# bavatar <tobias.diekershoff@gmx.net>, 2013
+# EinerVonVielen <tom@jfellow.net>, 2013
+# EinerVonVielen <tom@jfellow.net>, 2013
+# Fraengii <frank@lumina-verte.org>, 2013
+# Fraengii <frank@lumina-verte.org>, 2013
+# Oliver <post@toktan.org>, 2013
+# bavatar <tobias.diekershoff@gmx.net>, 2013-2014
+# zottel <transifex@zottel.net>, 2013
msgid ""
msgstr ""
-"Project-Id-Version: friendica\n"
-"Report-Msgid-Bugs-To: http://bugs.friendica.com/\n"
-"POT-Creation-Date: 2012-06-17 10:00-0700\n"
-"PO-Revision-Date: 2012-06-18 22:04+0000\n"
-"Last-Translator: Fabian Dost <friends@dostmusik.de>\n"
-"Language-Team: German (http://www.transifex.net/projects/p/friendica/language/de/)\n"
+"Project-Id-Version: Red Matrix\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2014-01-10 00:02-0800\n"
+"PO-Revision-Date: 2014-01-13 06:23+0000\n"
+"Last-Translator: bavatar <tobias.diekershoff@gmx.net>\n"
+"Language-Team: German (http://www.transifex.com/projects/p/red-matrix/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"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: ../../mod/oexchange.php:25
-msgid "Post successful."
-msgstr "Beitrag erfolgreich veröffentlicht."
+#: ../../include/acl_selectors.php:235
+msgid "Visible to everybody"
+msgstr "Für jeden sichtbar"
-#: ../../mod/update_notes.php:41 ../../mod/update_community.php:18
-#: ../../mod/update_network.php:22 ../../mod/update_profile.php:41
-msgid "[Embedded content - reload page to view]"
-msgstr "[Eingebetteter Inhalt - Seite neu laden zum Betrachten]"
-
-#: ../../mod/crepair.php:102
-msgid "Contact settings applied."
-msgstr "Einstellungen zum Kontakt angewandt."
-
-#: ../../mod/crepair.php:104
-msgid "Contact update failed."
-msgstr "Konnte den Kontakt nicht aktualisieren."
-
-#: ../../mod/crepair.php:115 ../../mod/wall_attach.php:44
-#: ../../mod/fsuggest.php:78 ../../mod/events.php:138 ../../mod/api.php:26
-#: ../../mod/api.php:31 ../../mod/photos.php:133 ../../mod/photos.php:928
-#: ../../mod/editpost.php:10 ../../mod/install.php:151
-#: ../../mod/notifications.php:66 ../../mod/contacts.php:145
-#: ../../mod/settings.php:106 ../../mod/settings.php:537
-#: ../../mod/settings.php:542 ../../mod/manage.php:86 ../../mod/network.php:6
-#: ../../mod/notes.php:20 ../../mod/wallmessage.php:9
-#: ../../mod/wallmessage.php:33 ../../mod/wallmessage.php:79
-#: ../../mod/wallmessage.php:103 ../../mod/attach.php:33
-#: ../../mod/group.php:19 ../../mod/viewconnections.php:22
-#: ../../mod/register.php:38 ../../mod/regmod.php:116 ../../mod/item.php:124
-#: ../../mod/item.php:140 ../../mod/profile_photo.php:19
-#: ../../mod/profile_photo.php:141 ../../mod/profile_photo.php:152
-#: ../../mod/profile_photo.php:165 ../../mod/message.php:45
-#: ../../mod/message.php:97 ../../mod/allfriends.php:9
-#: ../../mod/nogroup.php:25 ../../mod/wall_upload.php:53
-#: ../../mod/follow.php:9 ../../mod/display.php:138 ../../mod/profiles.php:7
-#: ../../mod/profiles.php:385 ../../mod/delegate.php:6
-#: ../../mod/suggest.php:28 ../../mod/invite.php:13 ../../mod/invite.php:81
-#: ../../mod/dfrn_confirm.php:53 ../../addon/facebook/facebook.php:507
-#: ../../addon/dav/layout.fnk.php:353 ../../include/items.php:3387
-#: ../../index.php:299
-msgid "Permission denied."
-msgstr "Zugriff verweigert."
+#: ../../include/acl_selectors.php:236
+msgid "show"
+msgstr "zeigen"
-#: ../../mod/crepair.php:129 ../../mod/fsuggest.php:20
-#: ../../mod/fsuggest.php:92 ../../mod/dfrn_confirm.php:118
-msgid "Contact not found."
-msgstr "Kontakt nicht gefunden."
+#: ../../include/acl_selectors.php:237
+msgid "don't show"
+msgstr "Verbergen"
-#: ../../mod/crepair.php:135
-msgid "Repair Contact Settings"
-msgstr "Kontakteinstellungen reparieren"
+#: ../../include/activities.php:39
+msgid " and "
+msgstr "und"
-#: ../../mod/crepair.php:137
-msgid ""
-"<strong>WARNING: This is highly advanced</strong> and if you enter incorrect"
-" information your communications with this contact may stop working."
-msgstr "<strong>ACHTUNG: Das sind Experten-Einstellungen!</strong> Wenn Du etwas Falsches eingibst, funktioniert die Kommunikation mit diesem Kontakt evtl. nicht mehr."
+#: ../../include/activities.php:47
+msgid "public profile"
+msgstr "öffentliches Profil"
-#: ../../mod/crepair.php:138
-msgid ""
-"Please use your browser 'Back' button <strong>now</strong> if you are "
-"uncertain what to do on this page."
-msgstr "Bitte nutze den Zurück-Button deines Browsers <strong>jetzt</strong>, wenn du dir unsicher bist, was du tun willst."
+#: ../../include/activities.php:52
+#, php-format
+msgid "%1$s changed %2$s to &ldquo;%3$s&rdquo;"
+msgstr "%1$s hat %2$s auf &ldquo;%3$s&rdquo; geändert"
-#: ../../mod/crepair.php:144
-msgid "Return to contact editor"
-msgstr "Zurück zum Kontakteditor"
+#: ../../include/activities.php:53
+#, php-format
+msgid "Visit %1$s's %2$s"
+msgstr "Besuche %1$s's %2$s"
-#: ../../mod/crepair.php:148 ../../mod/settings.php:557
-#: ../../mod/settings.php:583 ../../mod/admin.php:659 ../../mod/admin.php:668
-msgid "Name"
-msgstr "Name"
+#: ../../include/activities.php:56
+#, php-format
+msgid "%1$s has an updated %2$s, changing %3$s."
+msgstr "%1$s hat ein aktualisiertes %2$s, %3$s wurde verändert."
-#: ../../mod/crepair.php:149
-msgid "Account Nickname"
-msgstr "Konto-Spitzname"
-
-#: ../../mod/crepair.php:150
-msgid "@Tagname - overrides Name/Nickname"
-msgstr "@Tagname - überschreibt Name/Spitzname"
-
-#: ../../mod/crepair.php:151
-msgid "Account URL"
-msgstr "Konto-URL"
-
-#: ../../mod/crepair.php:152
-msgid "Friend Request URL"
-msgstr "URL für Freundschaftsanfragen"
-
-#: ../../mod/crepair.php:153
-msgid "Friend Confirm URL"
-msgstr "URL für Bestätigungen von Freundschaftsanfragen"
-
-#: ../../mod/crepair.php:154
-msgid "Notification Endpoint URL"
-msgstr "URL-Endpunkt für Benachrichtigungen"
-
-#: ../../mod/crepair.php:155
-msgid "Poll/Feed URL"
-msgstr "Pull/Feed-URL"
-
-#: ../../mod/crepair.php:156
-msgid "New photo from this URL"
-msgstr "Neues Foto von dieser URL"
-
-#: ../../mod/crepair.php:166 ../../mod/fsuggest.php:107
-#: ../../mod/events.php:428 ../../mod/photos.php:963 ../../mod/photos.php:1021
-#: ../../mod/photos.php:1266 ../../mod/photos.php:1306
-#: ../../mod/photos.php:1346 ../../mod/photos.php:1377
-#: ../../mod/install.php:246 ../../mod/install.php:284
-#: ../../mod/localtime.php:45 ../../mod/contacts.php:343
-#: ../../mod/settings.php:555 ../../mod/settings.php:701
-#: ../../mod/settings.php:762 ../../mod/settings.php:969
-#: ../../mod/group.php:85 ../../mod/message.php:216 ../../mod/admin.php:420
-#: ../../mod/admin.php:656 ../../mod/admin.php:792 ../../mod/admin.php:991
-#: ../../mod/admin.php:1078 ../../mod/profiles.php:554
-#: ../../mod/invite.php:119 ../../addon/facebook/facebook.php:609
-#: ../../addon/snautofollow/snautofollow.php:64
-#: ../../addon/yourls/yourls.php:76 ../../addon/ljpost/ljpost.php:93
-#: ../../addon/nsfw/nsfw.php:57 ../../addon/planets/planets.php:158
-#: ../../addon/uhremotestorage/uhremotestorage.php:89
-#: ../../addon/randplace/randplace.php:177 ../../addon/dwpost/dwpost.php:93
-#: ../../addon/drpost/drpost.php:110 ../../addon/startpage/startpage.php:92
-#: ../../addon/geonames/geonames.php:187 ../../addon/oembed.old/oembed.php:41
-#: ../../addon/impressum/impressum.php:82
-#: ../../addon/notimeline/notimeline.php:64 ../../addon/blockem/blockem.php:57
-#: ../../addon/qcomment/qcomment.php:61
-#: ../../addon/openstreetmap/openstreetmap.php:70
-#: ../../addon/libertree/libertree.php:90 ../../addon/mathjax/mathjax.php:42
-#: ../../addon/editplain/editplain.php:84 ../../addon/blackout/blackout.php:98
-#: ../../addon/gravatar/gravatar.php:86
-#: ../../addon/pageheader/pageheader.php:55 ../../addon/ijpost/ijpost.php:93
-#: ../../addon/jappixmini/jappixmini.php:302
-#: ../../addon/statusnet/statusnet.php:278
-#: ../../addon/statusnet/statusnet.php:292
-#: ../../addon/statusnet/statusnet.php:318
-#: ../../addon/statusnet/statusnet.php:325
-#: ../../addon/statusnet/statusnet.php:353
-#: ../../addon/statusnet/statusnet.php:561 ../../addon/tumblr/tumblr.php:90
-#: ../../addon/numfriends/numfriends.php:85 ../../addon/gnot/gnot.php:88
-#: ../../addon/wppost/wppost.php:110 ../../addon/showmore/showmore.php:48
-#: ../../addon/piwik/piwik.php:89 ../../addon/twitter/twitter.php:180
-#: ../../addon/twitter/twitter.php:209 ../../addon/twitter/twitter.php:381
-#: ../../addon/irc/irc.php:55 ../../addon/blogger/blogger.php:102
-#: ../../addon/posterous/posterous.php:103
-#: ../../view/theme/cleanzero/config.php:80
-#: ../../view/theme/diabook/theme.php:757
-#: ../../view/theme/diabook/config.php:190
-#: ../../view/theme/quattro/config.php:52 ../../view/theme/dispy/config.php:70
-#: ../../include/conversation.php:580
-msgid "Submit"
-msgstr "Senden"
+#: ../../include/api.php:973
+msgid "Public Timeline"
+msgstr "Öffentliche Zeitleiste"
-#: ../../mod/help.php:30
-msgid "Help:"
-msgstr "Hilfe:"
+#: ../../include/nav.php:72 ../../include/nav.php:87 ../../boot.php:1415
+msgid "Logout"
+msgstr "Abmelden"
-#: ../../mod/help.php:34 ../../addon/dav/layout.fnk.php:116
-#: ../../include/nav.php:86
-msgid "Help"
-msgstr "Hilfe"
+#: ../../include/nav.php:72 ../../include/nav.php:87
+msgid "End this session"
+msgstr "Beende diese Sitzung"
-#: ../../mod/help.php:38 ../../index.php:218
-msgid "Not Found"
-msgstr "Nicht gefunden"
+#: ../../include/nav.php:75 ../../include/nav.php:121
+msgid "Home"
+msgstr "Home"
-#: ../../mod/help.php:41 ../../index.php:221
-msgid "Page not found."
-msgstr "Seite nicht gefunden."
+#: ../../include/nav.php:75
+msgid "Your posts and conversations"
+msgstr "Deine Beiträge und Unterhaltungen"
-#: ../../mod/wall_attach.php:58
-#, php-format
-msgid "File exceeds size limit of %d"
-msgstr "Die Datei ist größer als das erlaubte Limit von %d"
+#: ../../include/nav.php:76 ../../include/conversation.php:932
+#: ../../mod/connedit.php:309 ../../mod/connedit.php:423
+msgid "View Profile"
+msgstr "Profil ansehen"
-#: ../../mod/wall_attach.php:86 ../../mod/wall_attach.php:97
-msgid "File upload failed."
-msgstr "Hochladen der Datei fehlgeschlagen."
+#: ../../include/nav.php:76
+msgid "Your profile page"
+msgstr "Deine Profilseite"
-#: ../../mod/fsuggest.php:63
-msgid "Friend suggestion sent."
-msgstr "Kontaktvorschlag gesendet."
+#: ../../include/nav.php:78
+msgid "Edit Profiles"
+msgstr "Profile bearbeiten"
-#: ../../mod/fsuggest.php:97
-msgid "Suggest Friends"
-msgstr "Kontakte vorschlagen"
+#: ../../include/nav.php:78
+msgid "Manage/Edit Profiles"
+msgstr "Verwalte/Bearbeite Profile"
-#: ../../mod/fsuggest.php:99
+#: ../../include/nav.php:79 ../../include/conversation.php:1462
+#: ../../mod/fbrowser.php:25
+msgid "Photos"
+msgstr "Fotos"
+
+#: ../../include/nav.php:79
+msgid "Your photos"
+msgstr "Deine Bilder"
+
+#: ../../include/nav.php:85 ../../boot.php:1416
+msgid "Login"
+msgstr "Anmelden"
+
+#: ../../include/nav.php:85
+msgid "Sign in"
+msgstr "Anmelden"
+
+#: ../../include/nav.php:102
#, php-format
-msgid "Suggest a friend for %s"
-msgstr "Schlage %s einen Kontakt vor"
+msgid "%s - click to logout"
+msgstr "%s - Klick zum Abmelden"
-#: ../../mod/events.php:65
-msgid "Event description and start time are required."
-msgstr "Ereignisbeschreibung und Startzeit sind erforderlich."
+#: ../../include/nav.php:107
+msgid "Click to authenticate to your home hub"
+msgstr "Klick zum Authentifizieren bei Deinem Heimat-Hub"
-#: ../../mod/events.php:258
-msgid "l, F j"
-msgstr "l, F j"
+#: ../../include/nav.php:121
+msgid "Home Page"
+msgstr "Homepage"
-#: ../../mod/events.php:280
-msgid "Edit event"
-msgstr "Veranstaltung bearbeiten"
+#: ../../include/nav.php:125 ../../mod/register.php:206 ../../boot.php:1392
+msgid "Register"
+msgstr "Registrieren"
-#: ../../mod/events.php:300 ../../include/text.php:1065
-msgid "link to source"
-msgstr "Link zum Originalbeitrag"
+#: ../../include/nav.php:125
+msgid "Create an account"
+msgstr "Erzeuge ein Konto"
-#: ../../mod/events.php:324 ../../view/theme/diabook/theme.php:131
-#: ../../include/nav.php:52 ../../boot.php:1529
-msgid "Events"
-msgstr "Veranstaltungen"
+#: ../../include/nav.php:130 ../../mod/help.php:60 ../../mod/help.php:64
+msgid "Help"
+msgstr "Hilfe"
-#: ../../mod/events.php:325
-msgid "Create New Event"
-msgstr "Neue Veranstaltung erstellen"
+#: ../../include/nav.php:130
+msgid "Help and documentation"
+msgstr "Hilfe und Dokumentation"
-#: ../../mod/events.php:326 ../../addon/dav/layout.fnk.php:154
-msgid "Previous"
-msgstr "Vorherige"
+#: ../../include/nav.php:133
+msgid "Apps"
+msgstr "Apps"
-#: ../../mod/events.php:327 ../../mod/install.php:205
-#: ../../addon/dav/layout.fnk.php:157
-msgid "Next"
-msgstr "Nächste"
+#: ../../include/nav.php:133
+msgid "Addon applications, utilities, games"
+msgstr "Addon Programme, Helferlein, Spiele"
-#: ../../mod/events.php:399
-msgid "hour:minute"
-msgstr "Stunde:Minute"
+#: ../../include/nav.php:135 ../../include/text.php:736
+#: ../../include/text.php:750 ../../mod/search.php:28
+msgid "Search"
+msgstr "Suche"
-#: ../../mod/events.php:408
-msgid "Event details"
-msgstr "Veranstaltungsdetails"
+#: ../../include/nav.php:135
+msgid "Search site content"
+msgstr "Durchsuche Seiten-Inhalt"
-#: ../../mod/events.php:409
-#, php-format
-msgid "Format is %s %s. Starting date and Description are required."
-msgstr "Format ist %s %s. Anfangsdatum und Beschreibung sind notwendig."
+#: ../../include/nav.php:138 ../../mod/directory.php:209
+msgid "Directory"
+msgstr "Verzeichnis"
-#: ../../mod/events.php:411
-msgid "Event Starts:"
-msgstr "Veranstaltungsbeginn:"
+#: ../../include/nav.php:138
+msgid "Channel Locator"
+msgstr "Kanal-Anzeiger"
-#: ../../mod/events.php:414
-msgid "Finish date/time is not known or not relevant"
-msgstr "Enddatum/-zeit ist nicht bekannt oder nicht relevant"
+#: ../../include/nav.php:149
+msgid "Matrix"
+msgstr "Matrix"
-#: ../../mod/events.php:416
-msgid "Event Finishes:"
-msgstr "Veranstaltungsende:"
+#: ../../include/nav.php:149
+msgid "Your matrix"
+msgstr "Deine Matrix"
-#: ../../mod/events.php:419
-msgid "Adjust for viewer timezone"
-msgstr "An Zeitzone des Betrachters anpassen"
+#: ../../include/nav.php:150
+msgid "Mark all matrix notifications seen"
+msgstr "Markiere alle Matrix-Benachrichtigungen als angesehen"
-#: ../../mod/events.php:421
-msgid "Description:"
-msgstr "Beschreibung"
+#: ../../include/nav.php:152
+msgid "Channel Home"
+msgstr "Mein Kanal"
-#: ../../mod/events.php:423 ../../include/event.php:37
-#: ../../include/bb2diaspora.php:265 ../../boot.php:1109
-msgid "Location:"
-msgstr "Ort:"
+#: ../../include/nav.php:152
+msgid "Channel home"
+msgstr "Mein Kanal"
-#: ../../mod/events.php:425
-msgid "Share this event"
-msgstr "Veranstaltung teilen"
+#: ../../include/nav.php:153
+msgid "Mark all channel notifications seen"
+msgstr "Markiere alle Kanal-Benachrichtigungen als angesehen"
-#: ../../mod/tagrm.php:11 ../../mod/tagrm.php:94
-#: ../../mod/dfrn_request.php:845 ../../mod/settings.php:556
-#: ../../mod/settings.php:582 ../../addon/js_upload/js_upload.php:45
-msgid "Cancel"
-msgstr "Abbrechen"
+#: ../../include/nav.php:156
+msgid "Intros"
+msgstr "Vorstellungen"
-#: ../../mod/tagrm.php:41
-msgid "Tag removed"
-msgstr "Tag entfernt"
+#: ../../include/nav.php:156 ../../mod/connections.php:242
+msgid "New Connections"
+msgstr "Neue Verbindungen"
-#: ../../mod/tagrm.php:79
-msgid "Remove Item Tag"
-msgstr "Gegenstands-Tag entfernen"
+#: ../../include/nav.php:159
+msgid "Notices"
+msgstr "Benachrichtigungen"
-#: ../../mod/tagrm.php:81
-msgid "Select a tag to remove: "
-msgstr "Wähle ein Tag zum Entfernen aus: "
+#: ../../include/nav.php:159
+msgid "Notifications"
+msgstr "Benachrichtigungen"
-#: ../../mod/tagrm.php:93 ../../mod/delegate.php:130
-msgid "Remove"
-msgstr "Entfernen"
+#: ../../include/nav.php:160
+msgid "See all notifications"
+msgstr "Alle Benachrichtigungen ansehen"
-#: ../../mod/dfrn_poll.php:94 ../../mod/dfrn_poll.php:522
-#, php-format
-msgid "%s welcomes %s"
-msgstr "%s heißt %s herzlich willkommen"
+#: ../../include/nav.php:161
+msgid "Mark all system notifications seen"
+msgstr "Markiere alle System-Benachrichtigungen als gesehen"
-#: ../../mod/api.php:76 ../../mod/api.php:102
-msgid "Authorize application connection"
-msgstr "Verbindung der Applikation autorisieren"
+#: ../../include/nav.php:163
+msgid "Mail"
+msgstr "Mail"
-#: ../../mod/api.php:77
-msgid "Return to your app and insert this Securty Code:"
-msgstr "Gehe zu deiner Anwendung zurück und trage dort folgenden Sicherheitscode ein:"
+#: ../../include/nav.php:163
+msgid "Private mail"
+msgstr "Persönliche Mail"
-#: ../../mod/api.php:89
-msgid "Please login to continue."
-msgstr "Bitte melde dich an um fortzufahren."
+#: ../../include/nav.php:164
+msgid "See all private messages"
+msgstr "Alle persönlichen Nachrichten ansehen"
-#: ../../mod/api.php:104
-msgid ""
-"Do you want to authorize this application to access your posts and contacts,"
-" and/or create new posts for you?"
-msgstr "Möchtest du dieser Anwendung den Zugriff auf deine Beiträge und Kontakte, sowie das Erstellen neuer Beiträge in deinem Namen gestatten?"
-
-#: ../../mod/api.php:105 ../../mod/dfrn_request.php:833
-#: ../../mod/settings.php:879 ../../mod/settings.php:885
-#: ../../mod/settings.php:893 ../../mod/settings.php:897
-#: ../../mod/settings.php:902 ../../mod/settings.php:908
-#: ../../mod/settings.php:914 ../../mod/settings.php:920
-#: ../../mod/settings.php:956 ../../mod/settings.php:957
-#: ../../mod/settings.php:958 ../../mod/settings.php:959
-#: ../../mod/settings.php:960 ../../mod/register.php:234
-#: ../../mod/profiles.php:531
-msgid "Yes"
-msgstr "Ja"
+#: ../../include/nav.php:165
+msgid "Mark all private messages seen"
+msgstr "Markiere alle persönlichen Nachrichten als gesehen"
-#: ../../mod/api.php:106 ../../mod/dfrn_request.php:834
-#: ../../mod/settings.php:879 ../../mod/settings.php:885
-#: ../../mod/settings.php:893 ../../mod/settings.php:897
-#: ../../mod/settings.php:902 ../../mod/settings.php:908
-#: ../../mod/settings.php:914 ../../mod/settings.php:920
-#: ../../mod/settings.php:956 ../../mod/settings.php:957
-#: ../../mod/settings.php:958 ../../mod/settings.php:959
-#: ../../mod/settings.php:960 ../../mod/register.php:235
-#: ../../mod/profiles.php:532
-msgid "No"
-msgstr "Nein"
+#: ../../include/nav.php:166
+msgid "Inbox"
+msgstr "Eingang"
-#: ../../mod/photos.php:44 ../../boot.php:1523
-msgid "Photo Albums"
-msgstr "Fotoalben"
+#: ../../include/nav.php:167
+msgid "Outbox"
+msgstr "Ausgang"
-#: ../../mod/photos.php:52 ../../mod/photos.php:154 ../../mod/photos.php:942
-#: ../../mod/photos.php:1013 ../../mod/photos.php:1028
-#: ../../mod/photos.php:1455 ../../mod/photos.php:1467
-#: ../../addon/communityhome/communityhome.php:110
-#: ../../view/theme/diabook/theme.php:598
-msgid "Contact Photos"
-msgstr "Kontaktbilder"
+#: ../../include/nav.php:168 ../../include/widgets.php:509
+msgid "New Message"
+msgstr "Neue Nachricht"
-#: ../../mod/photos.php:59 ../../mod/photos.php:1038 ../../mod/photos.php:1505
-msgid "Upload New Photos"
-msgstr "Weitere Fotos hochladen"
+#: ../../include/nav.php:171 ../../include/conversation.php:1482
+#: ../../mod/events.php:354
+msgid "Events"
+msgstr "Veranstaltungen"
-#: ../../mod/photos.php:70 ../../mod/settings.php:21
-msgid "everybody"
-msgstr "jeder"
-
-#: ../../mod/photos.php:143
-msgid "Contact information unavailable"
-msgstr "Kontaktinformationen nicht verfügbar"
-
-#: ../../mod/photos.php:154 ../../mod/photos.php:656 ../../mod/photos.php:1013
-#: ../../mod/photos.php:1028 ../../mod/profile_photo.php:60
-#: ../../mod/profile_photo.php:67 ../../mod/profile_photo.php:74
-#: ../../mod/profile_photo.php:176 ../../mod/profile_photo.php:254
-#: ../../mod/profile_photo.php:263
-#: ../../addon/communityhome/communityhome.php:111
-#: ../../view/theme/diabook/theme.php:599 ../../include/user.php:298
-#: ../../include/user.php:305 ../../include/user.php:312
-msgid "Profile Photos"
-msgstr "Profilbilder"
+#: ../../include/nav.php:171
+msgid "Event Calendar"
+msgstr "Veranstaltungskalender"
-#: ../../mod/photos.php:164
-msgid "Album not found."
-msgstr "Album nicht gefunden."
+#: ../../include/nav.php:172
+msgid "See all events"
+msgstr "Alle Ereignisse ansehen"
-#: ../../mod/photos.php:182 ../../mod/photos.php:1022
-msgid "Delete Album"
-msgstr "Album löschen"
+#: ../../include/nav.php:173
+msgid "Mark all events seen"
+msgstr "Markiere alle Ereignisse als gesehen"
-#: ../../mod/photos.php:245 ../../mod/photos.php:1267
-msgid "Delete Photo"
-msgstr "Foto löschen"
+#: ../../include/nav.php:175
+msgid "Channel Select"
+msgstr "Kanal-Auswahl"
-#: ../../mod/photos.php:587
-msgid "was tagged in a"
-msgstr "wurde getaggt in einem"
+#: ../../include/nav.php:175
+msgid "Manage Your Channels"
+msgstr "Verwalte Deine Kanäle"
-#: ../../mod/photos.php:587 ../../mod/like.php:185 ../../mod/tagger.php:70
-#: ../../addon/communityhome/communityhome.php:163
-#: ../../view/theme/diabook/theme.php:570 ../../include/text.php:1316
-#: ../../include/diaspora.php:1709 ../../include/conversation.php:53
-#: ../../include/conversation.php:126
-msgid "photo"
-msgstr "Foto"
+#: ../../include/nav.php:177 ../../include/widgets.php:487
+#: ../../mod/admin.php:785 ../../mod/admin.php:990
+msgid "Settings"
+msgstr "Einstellungen"
-#: ../../mod/photos.php:587
-msgid "by"
-msgstr "von"
+#: ../../include/nav.php:177
+msgid "Account/Channel Settings"
+msgstr "Konto-/Kanal-Einstellungen"
-#: ../../mod/photos.php:692 ../../addon/js_upload/js_upload.php:315
-msgid "Image exceeds size limit of "
-msgstr "Die Bildgröße übersteigt das Limit von "
+#: ../../include/nav.php:179 ../../mod/connections.php:349
+msgid "Connections"
+msgstr "Verbindungen"
-#: ../../mod/photos.php:700
-msgid "Image file is empty."
-msgstr "Bilddatei ist leer."
+#: ../../include/nav.php:179
+msgid "Manage/Edit Friends and Connections"
+msgstr "Verwalte/Bearbeite Freunde und Verbindungen"
-#: ../../mod/photos.php:714 ../../mod/profile_photo.php:126
-#: ../../mod/wall_upload.php:86
-msgid "Unable to process image."
-msgstr "Konnte das Bild nicht bearbeiten."
+#: ../../include/nav.php:186 ../../mod/admin.php:111
+msgid "Admin"
+msgstr "Admin"
-#: ../../mod/photos.php:734 ../../mod/profile_photo.php:259
-#: ../../mod/wall_upload.php:105
-msgid "Image upload failed."
-msgstr "Hochladen des Bildes gescheitert."
+#: ../../include/nav.php:186
+msgid "Site Setup and Configuration"
+msgstr "Seiten-Einrichtung und -Konfiguration"
-#: ../../mod/photos.php:820 ../../mod/community.php:16
-#: ../../mod/dfrn_request.php:759 ../../mod/viewconnections.php:17
-#: ../../mod/display.php:7 ../../mod/search.php:71 ../../mod/directory.php:29
-msgid "Public access denied."
-msgstr "Öffentlicher Zugriff verweigert."
+#: ../../include/nav.php:212
+msgid "Nothing new here"
+msgstr "Nichts Neues hier"
-#: ../../mod/photos.php:830
-msgid "No photos selected"
-msgstr "Keine Bilder ausgewählt"
+#: ../../include/nav.php:217
+msgid "Please wait..."
+msgstr "Bitte warten..."
-#: ../../mod/photos.php:909
-msgid "Access to this item is restricted."
-msgstr "Zugriff zu diesem Eintrag wurde eingeschränkt."
+#: ../../include/reddav.php:940
+msgid "Edit File properties"
+msgstr "Dateieigenschaften ändern"
-#: ../../mod/photos.php:970
-msgid "Upload Photos"
-msgstr "Bilder hochladen"
+#: ../../include/Contact.php:104 ../../include/widgets.php:115
+#: ../../include/widgets.php:155 ../../include/identity.php:625
+#: ../../mod/directory.php:182 ../../mod/match.php:62 ../../mod/suggest.php:51
+#: ../../mod/dirprofile.php:165
+msgid "Connect"
+msgstr "Verbinden"
-#: ../../mod/photos.php:973 ../../mod/photos.php:1017
-msgid "New album name: "
-msgstr "Name des neuen Albums: "
+#: ../../include/Contact.php:120
+msgid "New window"
+msgstr "Neues Fenster"
-#: ../../mod/photos.php:974
-msgid "or existing album name: "
-msgstr "oder existierender Albumname: "
+#: ../../include/Contact.php:121
+msgid "Open the selected location in a different window or browser tab"
+msgstr "Öffne die markierte Adresse in einem neuen Browser Fenster oder Tab"
-#: ../../mod/photos.php:975
-msgid "Do not show a status post for this upload"
-msgstr "Keine Status-Mitteilung für diesen Beitrag anzeigen"
+#: ../../include/widgets.php:29 ../../include/contact_widgets.php:87
+msgid "Categories"
+msgstr "Kategorien"
-#: ../../mod/photos.php:977 ../../mod/photos.php:1262
-msgid "Permissions"
-msgstr "Berechtigungen"
+#: ../../include/widgets.php:117 ../../mod/suggest.php:53
+msgid "Ignore/Hide"
+msgstr "Ignorieren/Verstecken"
-#: ../../mod/photos.php:1032
-msgid "Edit Album"
-msgstr "Album bearbeiten"
+#: ../../include/widgets.php:123 ../../mod/connections.php:236
+msgid "Suggestions"
+msgstr "Vorschläge"
-#: ../../mod/photos.php:1056 ../../mod/photos.php:1488
-msgid "View Photo"
-msgstr "Fotos betrachten"
+#: ../../include/widgets.php:124
+msgid "See more..."
+msgstr "Mehr anzeigen..."
-#: ../../mod/photos.php:1091
-msgid "Permission denied. Access to this item may be restricted."
-msgstr "Zugriff verweigert. Zugriff zu diesem Eintrag könnte eingeschränkt sein."
+#: ../../include/widgets.php:146
+#, php-format
+msgid "You have %1$.0f of %2$.0f allowed connections."
+msgstr "Du bist %1$.0f von %2$.0f erlaubten Verbindungen eingegangen."
-#: ../../mod/photos.php:1093
-msgid "Photo not available"
-msgstr "Foto nicht verfügbar"
+#: ../../include/widgets.php:152
+msgid "Add New Connection"
+msgstr "Neue Verbindung hinzufügen"
-#: ../../mod/photos.php:1143
-msgid "View photo"
-msgstr "Fotos ansehen"
+#: ../../include/widgets.php:153
+msgid "Enter the channel address"
+msgstr "Adresse des Kanals eingeben"
-#: ../../mod/photos.php:1143
-msgid "Edit photo"
-msgstr "Foto bearbeiten"
+#: ../../include/widgets.php:154
+msgid "Example: bob@example.com, http://example.com/barbara"
+msgstr "Beispiel: bob@beispiel.com, http://beispiel.com/barbara"
-#: ../../mod/photos.php:1144
-msgid "Use as profile photo"
-msgstr "Als Profilbild verwenden"
+#: ../../include/widgets.php:171
+msgid "Notes"
+msgstr "Notizen"
-#: ../../mod/photos.php:1150 ../../include/conversation.php:490
-msgid "Private Message"
-msgstr "Private Nachricht"
+#: ../../include/widgets.php:173 ../../include/text.php:738
+#: ../../include/text.php:752 ../../mod/filer.php:36
+msgid "Save"
+msgstr "Speichern"
-#: ../../mod/photos.php:1172
-msgid "View Full Size"
-msgstr "Betrachte Originalgröße"
+#: ../../include/widgets.php:243
+msgid "Remove term"
+msgstr "Eintrag löschen"
-#: ../../mod/photos.php:1240
-msgid "Tags: "
-msgstr "Tags: "
+#: ../../include/widgets.php:252 ../../include/features.php:50
+msgid "Saved Searches"
+msgstr "Gesicherte Suchanfragen"
-#: ../../mod/photos.php:1243
-msgid "[Remove any tag]"
-msgstr "[Tag entfernen]"
+#: ../../include/widgets.php:253 ../../include/group.php:290
+msgid "add"
+msgstr "hinzufügen"
-#: ../../mod/photos.php:1253
-msgid "Rotate CW"
-msgstr "Im Uhrzeigersinn rotieren"
+#: ../../include/widgets.php:283 ../../include/features.php:64
+#: ../../include/contact_widgets.php:53
+msgid "Saved Folders"
+msgstr "Gesicherte Ordner"
-#: ../../mod/photos.php:1255
-msgid "New album name"
-msgstr "Name des neuen Albums"
+#: ../../include/widgets.php:286 ../../include/contact_widgets.php:56
+#: ../../include/contact_widgets.php:90
+msgid "Everything"
+msgstr "Alles"
-#: ../../mod/photos.php:1258
-msgid "Caption"
-msgstr "Bildunterschrift"
+#: ../../include/widgets.php:318 ../../include/items.php:3566
+msgid "Archives"
+msgstr "Archive"
-#: ../../mod/photos.php:1260
-msgid "Add a Tag"
-msgstr "Tag hinzufügen"
+#: ../../include/widgets.php:370
+msgid "Refresh"
+msgstr "Aktualisieren"
-#: ../../mod/photos.php:1264
-msgid ""
-"Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"
-msgstr "Beispiel: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"
+#: ../../include/widgets.php:371 ../../mod/connedit.php:386
+msgid "Me"
+msgstr "Ich"
-#: ../../mod/photos.php:1284 ../../include/conversation.php:554
-msgid "I like this (toggle)"
-msgstr "Ich mag das (toggle)"
+#: ../../include/widgets.php:372 ../../mod/connedit.php:388
+msgid "Best Friends"
+msgstr "Beste Freunde"
-#: ../../mod/photos.php:1285 ../../include/conversation.php:555
-msgid "I don't like this (toggle)"
-msgstr "Ich mag das nicht (toggle)"
+#: ../../include/widgets.php:373 ../../include/profile_selectors.php:42
+#: ../../include/identity.php:310 ../../mod/connedit.php:389
+msgid "Friends"
+msgstr "Freunde"
-#: ../../mod/photos.php:1286 ../../include/conversation.php:989
-msgid "Share"
-msgstr "Teilen"
+#: ../../include/widgets.php:374
+msgid "Co-workers"
+msgstr "Kollegen"
-#: ../../mod/photos.php:1287 ../../mod/editpost.php:104
-#: ../../mod/wallmessage.php:145 ../../mod/message.php:215
-#: ../../mod/message.php:410 ../../include/conversation.php:371
-#: ../../include/conversation.php:731 ../../include/conversation.php:1008
-msgid "Please wait"
-msgstr "Bitte warten"
+#: ../../include/widgets.php:375 ../../mod/connedit.php:390
+msgid "Former Friends"
+msgstr "ehem. Freunde"
-#: ../../mod/photos.php:1303 ../../mod/photos.php:1343
-#: ../../mod/photos.php:1374 ../../include/conversation.php:577
-msgid "This is you"
-msgstr "Das bist du"
+#: ../../include/widgets.php:376 ../../mod/connedit.php:391
+msgid "Acquaintances"
+msgstr "Bekanntschaften"
-#: ../../mod/photos.php:1305 ../../mod/photos.php:1345
-#: ../../mod/photos.php:1376 ../../include/conversation.php:579
-#: ../../boot.php:523
-msgid "Comment"
-msgstr "Kommentar"
+#: ../../include/widgets.php:377
+msgid "Everybody"
+msgstr "Jeder"
-#: ../../mod/photos.php:1307 ../../mod/editpost.php:125
-#: ../../include/conversation.php:589 ../../include/conversation.php:1026
-msgid "Preview"
-msgstr "Vorschau"
+#: ../../include/widgets.php:409
+msgid "Account settings"
+msgstr "Konto-Einstellungen"
-#: ../../mod/photos.php:1404 ../../mod/settings.php:618
-#: ../../mod/settings.php:699 ../../mod/group.php:168 ../../mod/admin.php:663
-#: ../../include/conversation.php:328 ../../include/conversation.php:609
-msgid "Delete"
-msgstr "Löschen"
+#: ../../include/widgets.php:415
+msgid "Channel settings"
+msgstr "Kanal-Einstellungen"
-#: ../../mod/photos.php:1494
-msgid "View Album"
-msgstr "Album betrachten"
+#: ../../include/widgets.php:421
+msgid "Additional features"
+msgstr "Zusätzliche Funktionen"
-#: ../../mod/photos.php:1503
-msgid "Recent Photos"
-msgstr "Neueste Fotos"
+#: ../../include/widgets.php:427
+msgid "Feature settings"
+msgstr "Funktions-Einstellungen"
-#: ../../mod/community.php:21
-msgid "Not available."
-msgstr "Nicht verfügbar."
+#: ../../include/widgets.php:433
+msgid "Display settings"
+msgstr "Anzeige-Einstellungen"
-#: ../../mod/community.php:30 ../../view/theme/diabook/theme.php:133
-#: ../../include/nav.php:101
-msgid "Community"
-msgstr "Gemeinschaft"
+#: ../../include/widgets.php:439
+msgid "Connected apps"
+msgstr "Verbundene Apps"
-#: ../../mod/community.php:61 ../../mod/search.php:144
-msgid "No results."
-msgstr "Keine Ergebnisse."
+#: ../../include/widgets.php:445
+msgid "Export channel"
+msgstr "Kanal exportieren"
-#: ../../mod/friendica.php:55
-msgid "This is Friendica, version"
-msgstr "Dies ist Friendica, Version"
+#: ../../include/widgets.php:457
+msgid "Automatic Permissions (Advanced)"
+msgstr "Automatische Berechtigungen (Erweitert)"
-#: ../../mod/friendica.php:56
-msgid "running at web location"
-msgstr "die unter folgender Webadresse zu finden ist"
+#: ../../include/widgets.php:467
+msgid "Premium Channel Settings"
+msgstr "Prämium-Kanal Einstellungen"
-#: ../../mod/friendica.php:58
-msgid ""
-"Please visit <a href=\"http://friendica.com\">Friendica.com</a> to learn "
-"more about the Friendica project."
-msgstr "Bitte besuche <a href=\"http://friendica.com\">Friendica.com</a>, um mehr über das Friendica Projekt zu erfahren."
+#: ../../include/widgets.php:476 ../../include/features.php:41
+#: ../../mod/sources.php:81
+msgid "Channel Sources"
+msgstr "Kanal Quellen"
-#: ../../mod/friendica.php:60
-msgid "Bug reports and issues: please visit"
-msgstr "Probleme oder Fehler gefunden? Bitte besuche"
+#: ../../include/widgets.php:504
+msgid "Check Mail"
+msgstr "E-Mails abrufen"
-#: ../../mod/friendica.php:61
-msgid ""
-"Suggestions, praise, donations, etc. - please email \"Info\" at Friendica - "
-"dot com"
-msgstr "Vorschläge, Lob, Spenden usw.: E-Mail an \"Info\" at Friendica - dot com"
+#: ../../include/contact_selectors.php:30
+msgid "Unknown | Not categorised"
+msgstr "Unbekannt | Nicht kategorisiert"
-#: ../../mod/friendica.php:75
-msgid "Installed plugins/addons/apps:"
-msgstr "Installierte Plugins/Erweiterungen/Apps"
+#: ../../include/contact_selectors.php:31
+msgid "Block immediately"
+msgstr "Sofort blockieren"
-#: ../../mod/friendica.php:88
-msgid "No installed plugins/addons/apps"
-msgstr "Keine Plugins/Erweiterungen/Apps installiert"
+#: ../../include/contact_selectors.php:32
+msgid "Shady, spammer, self-marketer"
+msgstr "Zwielichtig, Spammer, Selbstdarsteller"
-#: ../../mod/editpost.php:17 ../../mod/editpost.php:27
-msgid "Item not found"
-msgstr "Beitrag nicht gefunden"
+#: ../../include/contact_selectors.php:33
+msgid "Known to me, but no opinion"
+msgstr "Mir bekannt, aber keine Meinung"
-#: ../../mod/editpost.php:36
-msgid "Edit post"
-msgstr "Beitrag bearbeiten"
+#: ../../include/contact_selectors.php:34
+msgid "OK, probably harmless"
+msgstr "Ok, wahrscheinlich harmlos"
-#: ../../mod/editpost.php:80 ../../include/conversation.php:975
-msgid "Post to Email"
-msgstr "An E-Mail senden"
+#: ../../include/contact_selectors.php:35
+msgid "Reputable, has my trust"
+msgstr "Seriös, hat mein Vertrauen"
-#: ../../mod/editpost.php:95 ../../mod/settings.php:617
-#: ../../include/conversation.php:596
-msgid "Edit"
-msgstr "Bearbeiten"
+#: ../../include/contact_selectors.php:54
+msgid "Frequently"
+msgstr "Häufig"
-#: ../../mod/editpost.php:96 ../../mod/wallmessage.php:143
-#: ../../mod/message.php:213 ../../mod/message.php:408
-#: ../../include/conversation.php:990
-msgid "Upload photo"
-msgstr "Foto hochladen"
+#: ../../include/contact_selectors.php:55
+msgid "Hourly"
+msgstr "Stündlich"
-#: ../../mod/editpost.php:97 ../../include/conversation.php:992
-msgid "Attach file"
-msgstr "Datei anhängen"
+#: ../../include/contact_selectors.php:56
+msgid "Twice daily"
+msgstr "Zwei Mal am Tag"
-#: ../../mod/editpost.php:98 ../../mod/wallmessage.php:144
-#: ../../mod/message.php:214 ../../mod/message.php:409
-#: ../../include/conversation.php:994
-msgid "Insert web link"
-msgstr "einen Link einfügen"
+#: ../../include/contact_selectors.php:57
+msgid "Daily"
+msgstr "Täglich"
-#: ../../mod/editpost.php:99
-msgid "Insert YouTube video"
-msgstr "YouTube-Video einfügen"
+#: ../../include/contact_selectors.php:58
+msgid "Weekly"
+msgstr "Wöchentlich"
-#: ../../mod/editpost.php:100
-msgid "Insert Vorbis [.ogg] video"
-msgstr "Vorbis [.ogg] Video einfügen"
+#: ../../include/contact_selectors.php:59
+msgid "Monthly"
+msgstr "Monatlich"
-#: ../../mod/editpost.php:101
-msgid "Insert Vorbis [.ogg] audio"
-msgstr "Vorbis [.ogg] Audio einfügen"
+#: ../../include/contact_selectors.php:74
+msgid "Friendica"
+msgstr "Friendica"
-#: ../../mod/editpost.php:102 ../../include/conversation.php:1000
-msgid "Set your location"
-msgstr "Deinen Standort festlegen"
+#: ../../include/contact_selectors.php:75
+msgid "OStatus"
+msgstr "OStatus"
-#: ../../mod/editpost.php:103 ../../include/conversation.php:1002
-msgid "Clear browser location"
-msgstr "Browser-Standort leeren"
+#: ../../include/contact_selectors.php:76
+msgid "RSS/Atom"
+msgstr "RSS/Atom"
-#: ../../mod/editpost.php:105 ../../include/conversation.php:1009
-msgid "Permission settings"
-msgstr "Berechtigungseinstellungen"
+#: ../../include/contact_selectors.php:77 ../../mod/admin.php:689
+#: ../../mod/admin.php:698 ../../boot.php:1418
+msgid "Email"
+msgstr "E-Mail"
-#: ../../mod/editpost.php:113 ../../include/conversation.php:1018
-msgid "CC: email addresses"
-msgstr "Cc:-E-Mail-Addressen"
+#: ../../include/contact_selectors.php:78
+msgid "Diaspora"
+msgstr "Diaspora"
-#: ../../mod/editpost.php:114 ../../include/conversation.php:1019
-msgid "Public post"
-msgstr "Öffentlicher Beitrag"
+#: ../../include/contact_selectors.php:79
+msgid "Facebook"
+msgstr "Facebook"
-#: ../../mod/editpost.php:117 ../../include/conversation.php:1005
-msgid "Set title"
-msgstr "Titel setzen"
+#: ../../include/contact_selectors.php:80
+msgid "Zot!"
+msgstr "Zot!"
-#: ../../mod/editpost.php:119 ../../include/conversation.php:1007
-msgid "Categories (comma-separated list)"
-msgstr "Kategorien (kommasepariert)"
+#: ../../include/contact_selectors.php:81
+msgid "LinkedIn"
+msgstr "LinkedIn"
-#: ../../mod/editpost.php:120 ../../include/conversation.php:1021
-msgid "Example: bob@example.com, mary@example.com"
-msgstr "Z.B.: bob@example.com, mary@example.com"
+#: ../../include/contact_selectors.php:82
+msgid "XMPP/IM"
+msgstr "XMPP/IM"
-#: ../../mod/dfrn_request.php:93
-msgid "This introduction has already been accepted."
-msgstr "Diese Kontaktanfrage wurde bereits akzeptiert."
+#: ../../include/contact_selectors.php:83
+msgid "MySpace"
+msgstr "MySpace"
-#: ../../mod/dfrn_request.php:118 ../../mod/dfrn_request.php:512
-msgid "Profile location is not valid or does not contain profile information."
-msgstr "Profiladresse ist ungültig oder stellt einige Profildaten nicht zur Verfügung."
+#: ../../include/datetime.php:43 ../../include/datetime.php:45
+msgid "Miscellaneous"
+msgstr "Verschiedenes"
-#: ../../mod/dfrn_request.php:123 ../../mod/dfrn_request.php:517
-msgid "Warning: profile location has no identifiable owner name."
-msgstr "Warnung: Es konnte kein Name des Besitzers von der angegebenen Profiladresse gefunden werden."
+#: ../../include/datetime.php:152 ../../include/datetime.php:284
+msgid "year"
+msgstr "Jahr"
-#: ../../mod/dfrn_request.php:125 ../../mod/dfrn_request.php:519
-msgid "Warning: profile location has no profile photo."
-msgstr "Warnung: Es konnte kein Profilbild bei der angegebenen Profiladresse gefunden werden."
+#: ../../include/datetime.php:157 ../../include/datetime.php:285
+msgid "month"
+msgstr "Monat"
-#: ../../mod/dfrn_request.php:128 ../../mod/dfrn_request.php:522
-#, php-format
-msgid "%d required parameter was not found at the given location"
-msgid_plural "%d required parameters were not found at the given location"
-msgstr[0] "%d benötigter Parameter wurde an der angegebenen Stelle nicht gefunden"
-msgstr[1] "%d benötigte Parameter wurden an der angegebenen Stelle nicht gefunden"
+#: ../../include/datetime.php:162 ../../include/datetime.php:287
+msgid "day"
+msgstr "Tag"
-#: ../../mod/dfrn_request.php:170
-msgid "Introduction complete."
-msgstr "Kontaktanfrage abgeschlossen."
+#: ../../include/datetime.php:275
+msgid "never"
+msgstr "Nie"
-#: ../../mod/dfrn_request.php:209
-msgid "Unrecoverable protocol error."
-msgstr "Nicht behebbarer Protokollfehler."
+#: ../../include/datetime.php:281
+msgid "less than a second ago"
+msgstr "Vor weniger als einer Sekunde"
-#: ../../mod/dfrn_request.php:237
-msgid "Profile unavailable."
-msgstr "Profil nicht verfügbar."
+#: ../../include/datetime.php:284
+msgid "years"
+msgstr "Jahre"
-#: ../../mod/dfrn_request.php:262
-#, php-format
-msgid "%s has received too many connection requests today."
-msgstr "%s hat heute zu viele Freundschaftsanfragen erhalten."
+#: ../../include/datetime.php:285
+msgid "months"
+msgstr "Monate"
-#: ../../mod/dfrn_request.php:263
-msgid "Spam protection measures have been invoked."
-msgstr "Maßnahmen zum Spamschutz wurden ergriffen."
+#: ../../include/datetime.php:286
+msgid "week"
+msgstr "Woche"
-#: ../../mod/dfrn_request.php:264
-msgid "Friends are advised to please try again in 24 hours."
-msgstr "Freunde sind angehalten, es in 24 Stunden erneut zu versuchen."
+#: ../../include/datetime.php:286
+msgid "weeks"
+msgstr "Wochen"
-#: ../../mod/dfrn_request.php:326
-msgid "Invalid locator"
-msgstr "Ungültiger Locator"
+#: ../../include/datetime.php:287
+msgid "days"
+msgstr "Tage"
-#: ../../mod/dfrn_request.php:335
-msgid "Invalid email address."
-msgstr "Ungültige E-Mail Adresse."
+#: ../../include/datetime.php:288
+msgid "hour"
+msgstr "Stunde"
+
+#: ../../include/datetime.php:288
+msgid "hours"
+msgstr "Stunden"
+
+#: ../../include/datetime.php:289
+msgid "minute"
+msgstr "Minute"
-#: ../../mod/dfrn_request.php:361
-msgid "This account has not been configured for email. Request failed."
-msgstr "Dieses Konto ist nicht für E-Mail konfiguriert. Anfrage fehlgeschlagen."
+#: ../../include/datetime.php:289
+msgid "minutes"
+msgstr "Minuten"
-#: ../../mod/dfrn_request.php:457
-msgid "Unable to resolve your name at the provided location."
-msgstr "Konnte deinen Namen an der angegebenen Stelle nicht finden."
+#: ../../include/datetime.php:290
+msgid "second"
+msgstr "Sekunde"
-#: ../../mod/dfrn_request.php:470
-msgid "You have already introduced yourself here."
-msgstr "Du hast dich hier bereits vorgestellt."
+#: ../../include/datetime.php:290
+msgid "seconds"
+msgstr "Sekunden"
-#: ../../mod/dfrn_request.php:474
+#: ../../include/datetime.php:299
#, php-format
-msgid "Apparently you are already friends with %s."
-msgstr "Es scheint so, als ob du bereits mit %s befreundet bist."
+msgid "%1$d %2$s ago"
+msgstr "vor %1$d %2$s"
-#: ../../mod/dfrn_request.php:495
-msgid "Invalid profile URL."
-msgstr "Ungültige Profil-URL."
+#: ../../include/dba/dba_driver.php:50
+#, php-format
+msgid "Cannot locate DNS info for database server '%s'"
+msgstr "Kann die DNS Information für den Datenbank Server '%s' nicht finden"
-#: ../../mod/dfrn_request.php:501 ../../include/follow.php:27
-msgid "Disallowed profile URL."
-msgstr "Nicht erlaubte Profil-URL."
+#: ../../include/event.php:11 ../../include/bb2diaspora.php:433
+msgid "l F d, Y \\@ g:i A"
+msgstr "l, d. F Y\\\\, H:i"
-#: ../../mod/dfrn_request.php:570 ../../mod/contacts.php:122
-msgid "Failed to update contact record."
-msgstr "Aktualisierung der Kontaktdaten fehlgeschlagen."
+#: ../../include/event.php:20 ../../include/bb2diaspora.php:439
+msgid "Starts:"
+msgstr "Beginnt:"
-#: ../../mod/dfrn_request.php:591
-msgid "Your introduction has been sent."
-msgstr "Deine Kontaktanfrage wurde gesendet."
+#: ../../include/event.php:30 ../../include/bb2diaspora.php:447
+msgid "Finishes:"
+msgstr "Endet:"
-#: ../../mod/dfrn_request.php:644
-msgid "Please login to confirm introduction."
-msgstr "Bitte melde dich an, um die Kontaktanfrage zu bestätigen."
+#: ../../include/event.php:40 ../../include/identity.php:676
+#: ../../include/bb2diaspora.php:455 ../../mod/events.php:463
+#: ../../mod/directory.php:156 ../../mod/dirprofile.php:108
+msgid "Location:"
+msgstr "Ort:"
-#: ../../mod/dfrn_request.php:658
-msgid ""
-"Incorrect identity currently logged in. Please login to "
-"<strong>this</strong> profile."
-msgstr "Momentan bist du mit einer anderen Identität angemeldet. Bitte melde Dich mit <strong>diesem</strong> Profil an."
+#: ../../include/text.php:315
+msgid "prev"
+msgstr "vorherige"
-#: ../../mod/dfrn_request.php:669
-msgid "Hide this contact"
-msgstr "Verberge diese Kontakt"
+#: ../../include/text.php:317
+msgid "first"
+msgstr "erste"
-#: ../../mod/dfrn_request.php:672
-#, php-format
-msgid "Welcome home %s."
-msgstr "Willkommen zurück %s."
+#: ../../include/text.php:346
+msgid "last"
+msgstr "letzte"
-#: ../../mod/dfrn_request.php:673
-#, php-format
-msgid "Please confirm your introduction/connection request to %s."
-msgstr "Bitte bestätige deine Kontaktanfrage bei %s."
+#: ../../include/text.php:349
+msgid "next"
+msgstr "nächste"
-#: ../../mod/dfrn_request.php:674
-msgid "Confirm"
-msgstr "Bestätigen"
+#: ../../include/text.php:361
+msgid "older"
+msgstr "älter"
-#: ../../mod/dfrn_request.php:715 ../../include/items.php:2783
-msgid "[Name Withheld]"
-msgstr "[Name unterdrückt]"
+#: ../../include/text.php:363
+msgid "newer"
+msgstr "neuer"
-#: ../../mod/dfrn_request.php:808
-msgid ""
-"Please enter your 'Identity Address' from one of the following supported "
-"communications networks:"
-msgstr "Bitte gib die Adresse deines Profils in einem der unterstützten sozialen Netzwerke an:"
+#: ../../include/text.php:654
+msgid "No connections"
+msgstr "Keine Verbindungen"
-#: ../../mod/dfrn_request.php:824
-msgid "<strike>Connect as an email follower</strike> (Coming soon)"
-msgstr "<strike>Als E-Mail-Kontakt verbinden</strike> (In Kürze verfügbar)"
+#: ../../include/text.php:665
+#, php-format
+msgid "%d Connection"
+msgid_plural "%d Connections"
+msgstr[0] "%d Verbindung"
+msgstr[1] "%d Verbindungen"
-#: ../../mod/dfrn_request.php:826
-msgid ""
-"If you are not yet a member of the free social web, <a "
-"href=\"http://dir.friendica.com/siteinfo\">follow this link to find a public"
-" Friendica site and join us today</a>."
-msgstr "Wenn du noch kein Mitglied dieses freien sozialen Netzwerks bist, <a href=\"http://dir.friendica.com/siteinfo\">folge diesem Link</a> um einen öffentlichen Friendica-Server zu finden und beizutreten."
+#: ../../include/text.php:677
+msgid "View Connections"
+msgstr "Zeige Verbindungen"
-#: ../../mod/dfrn_request.php:829
-msgid "Friend/Connection Request"
-msgstr "Freundschafts-/Kontaktanfrage"
+#: ../../include/text.php:818
+msgid "poke"
+msgstr "anstupsen"
-#: ../../mod/dfrn_request.php:830
-msgid ""
-"Examples: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, "
-"testuser@identi.ca"
-msgstr "Beispiele: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, testuser@identi.ca"
+#: ../../include/text.php:818 ../../include/conversation.php:240
+msgid "poked"
+msgstr "stupste"
-#: ../../mod/dfrn_request.php:831
-msgid "Please answer the following:"
-msgstr "Bitte beantworte Folgendes:"
+#: ../../include/text.php:819
+msgid "ping"
+msgstr "anpingen"
-#: ../../mod/dfrn_request.php:832
-#, php-format
-msgid "Does %s know you?"
-msgstr "Kennt %s dich?"
+#: ../../include/text.php:819
+msgid "pinged"
+msgstr "pingte"
-#: ../../mod/dfrn_request.php:835
-msgid "Add a personal note:"
-msgstr "Eine persönliche Notiz beifügen:"
+#: ../../include/text.php:820
+msgid "prod"
+msgstr "knuffen"
-#: ../../mod/dfrn_request.php:837 ../../include/contact_selectors.php:76
-msgid "Friendica"
-msgstr "Friendica"
+#: ../../include/text.php:820
+msgid "prodded"
+msgstr "knuffte"
-#: ../../mod/dfrn_request.php:838
-msgid "StatusNet/Federated Social Web"
-msgstr "StatusNet/Federated Social Web"
+#: ../../include/text.php:821
+msgid "slap"
+msgstr "ohrfeigen"
-#: ../../mod/dfrn_request.php:839 ../../mod/settings.php:652
-#: ../../include/contact_selectors.php:80
-msgid "Diaspora"
-msgstr "Diaspora"
+#: ../../include/text.php:821
+msgid "slapped"
+msgstr "ohrfeigte"
-#: ../../mod/dfrn_request.php:840
-#, php-format
-msgid ""
-" - please do not use this form. Instead, enter %s into your Diaspora search"
-" bar."
-msgstr " - bitte verwende dieses Formular nicht. Stattdessen suche nach %s in deiner Diaspora Suchleiste."
+#: ../../include/text.php:822
+msgid "finger"
+msgstr "befummeln"
-#: ../../mod/dfrn_request.php:841
-msgid "Your Identity Address:"
-msgstr "Adresse deines Profils:"
+#: ../../include/text.php:822
+msgid "fingered"
+msgstr "befummelte"
-#: ../../mod/dfrn_request.php:844
-msgid "Submit Request"
-msgstr "Anfrage abschicken"
+#: ../../include/text.php:823
+msgid "rebuff"
+msgstr "eine Abfuhr erteilen"
-#: ../../mod/install.php:117
-msgid "Friendica Social Communications Server - Setup"
-msgstr "Friendica-Server für soziale Netzwerke – Setup"
+#: ../../include/text.php:823
+msgid "rebuffed"
+msgstr "abfuhrerteilte"
-#: ../../mod/install.php:123
-msgid "Could not connect to database."
-msgstr "Verbindung zur Datenbank gescheitert"
+#: ../../include/text.php:835
+msgid "happy"
+msgstr "glücklich"
-#: ../../mod/install.php:127
-msgid "Could not create table."
-msgstr "Konnte Tabelle nicht erstellen."
+#: ../../include/text.php:836
+msgid "sad"
+msgstr "traurig"
-#: ../../mod/install.php:133
-msgid "Your Friendica site database has been installed."
-msgstr "Die Datenbank deiner Friendica Seite wurde installiert."
+#: ../../include/text.php:837
+msgid "mellow"
+msgstr "sanft"
-#: ../../mod/install.php:138
-msgid ""
-"You may need to import the file \"database.sql\" manually using phpmyadmin "
-"or mysql."
-msgstr "Möglicherweise musst du die Datei \"database.sql\" manuell mit phpmyadmin oder mysql importieren."
+#: ../../include/text.php:838
+msgid "tired"
+msgstr "müde"
-#: ../../mod/install.php:139 ../../mod/install.php:204
-#: ../../mod/install.php:489
-msgid "Please see the file \"INSTALL.txt\"."
-msgstr "Lies bitte die \"INSTALL.txt\"."
+#: ../../include/text.php:839
+msgid "perky"
+msgstr "frech"
-#: ../../mod/install.php:201
-msgid "System check"
-msgstr "Systemtest"
+#: ../../include/text.php:840
+msgid "angry"
+msgstr "sauer"
-#: ../../mod/install.php:206
-msgid "Check again"
-msgstr "Noch einmal testen"
+#: ../../include/text.php:841
+msgid "stupified"
+msgstr "verblüfft"
-#: ../../mod/install.php:225
-msgid "Database connection"
-msgstr "Datenbankverbindung"
+#: ../../include/text.php:842
+msgid "puzzled"
+msgstr "verwirrt"
-#: ../../mod/install.php:226
-msgid ""
-"In order to install Friendica we need to know how to connect to your "
-"database."
-msgstr "Um Friendica installieren zu können, müssen wir wissen, wie wir zu deiner Datenbank Kontakt aufnehmen können."
+#: ../../include/text.php:843
+msgid "interested"
+msgstr "interessiert"
-#: ../../mod/install.php:227
-msgid ""
-"Please contact your hosting provider or site administrator if you have "
-"questions about these settings."
-msgstr "Bitte kontaktiere den Hosting Provider oder den Administrator der Seite, falls du Fragen zu diesen Einstellungen haben solltest."
+#: ../../include/text.php:844
+msgid "bitter"
+msgstr "verbittert"
-#: ../../mod/install.php:228
-msgid ""
-"The database you specify below should already exist. If it does not, please "
-"create it before continuing."
-msgstr "Die Datenbank, die du unten angibst, sollte bereits existieren. Ist dies noch nicht der Fall, erzeuge sie bitte bevor du mit der Installation fortfährst."
+#: ../../include/text.php:845
+msgid "cheerful"
+msgstr "fröhlich"
-#: ../../mod/install.php:232
-msgid "Database Server Name"
-msgstr "Datenbank-Server"
+#: ../../include/text.php:846
+msgid "alive"
+msgstr "lebendig"
-#: ../../mod/install.php:233
-msgid "Database Login Name"
-msgstr "Datenbank-Nutzer"
+#: ../../include/text.php:847
+msgid "annoyed"
+msgstr "verärgert"
-#: ../../mod/install.php:234
-msgid "Database Login Password"
-msgstr "Datenbank-Passwort"
+#: ../../include/text.php:848
+msgid "anxious"
+msgstr "unruhig"
-#: ../../mod/install.php:235
-msgid "Database Name"
-msgstr "Datenbank-Name"
+#: ../../include/text.php:849
+msgid "cranky"
+msgstr "schrullig"
-#: ../../mod/install.php:236 ../../mod/install.php:275
-msgid "Site administrator email address"
-msgstr "E-Mail-Adresse des Administrators"
+#: ../../include/text.php:850
+msgid "disturbed"
+msgstr "verstört"
-#: ../../mod/install.php:236 ../../mod/install.php:275
-msgid ""
-"Your account email address must match this in order to use the web admin "
-"panel."
-msgstr "Die E-Mail-Adresse, die in deinem Friendica-Account eingetragen ist, muss mit dieser Adresse übereinstimmen, damit du das Admin-Panel benutzen kannst."
+#: ../../include/text.php:851
+msgid "frustrated"
+msgstr "frustriert"
-#: ../../mod/install.php:240 ../../mod/install.php:278
-msgid "Please select a default timezone for your website"
-msgstr "Bitte wähle die Standardzeitzone deiner Webseite"
+#: ../../include/text.php:852
+msgid "motivated"
+msgstr "motiviert"
-#: ../../mod/install.php:265
-msgid "Site settings"
-msgstr "Server-Einstellungen"
+#: ../../include/text.php:853
+msgid "relaxed"
+msgstr "entspannt"
-#: ../../mod/install.php:318
-msgid "Could not find a command line version of PHP in the web server PATH."
-msgstr "Konnte keine Kommandozeilenversion von PHP im PATH des Servers finden."
+#: ../../include/text.php:854
+msgid "surprised"
+msgstr "überrascht"
-#: ../../mod/install.php:319
-msgid ""
-"If you don't have a command line version of PHP installed on server, you "
-"will not be able to run background polling via cron. See <a "
-"href='http://friendica.com/node/27'>'Activating scheduled tasks'</a>"
-msgstr "Wenn du keine Kommandozeilen Version von PHP auf deinem Server installiert hast, kannst du keine Hintergrundprozesse via cron starten. Siehe <a href='http://friendica.com/node/27'>'Activating scheduled tasks'</a>"
+#: ../../include/text.php:1016
+msgid "Monday"
+msgstr "Montag"
-#: ../../mod/install.php:323
-msgid "PHP executable path"
-msgstr "Pfad zu PHP"
+#: ../../include/text.php:1016
+msgid "Tuesday"
+msgstr "Dienstag"
-#: ../../mod/install.php:323
-msgid ""
-"Enter full path to php executable. You can leave this blank to continue the "
-"installation."
-msgstr "Gib den kompletten Pfad zur ausführbaren Datei von PHP an. Du kannst diesen Feld auch frei lassen und mit der Installation fortfahren."
+#: ../../include/text.php:1016
+msgid "Wednesday"
+msgstr "Mittwoch"
-#: ../../mod/install.php:328
-msgid "Command line PHP"
-msgstr "Kommandozeilen-PHP"
+#: ../../include/text.php:1016
+msgid "Thursday"
+msgstr "Donnerstag"
-#: ../../mod/install.php:337
-msgid ""
-"The command line version of PHP on your system does not have "
-"\"register_argc_argv\" enabled."
-msgstr "Die Kommandozeilenversion von PHP auf deinem System hat \"register_argc_argv\" nicht aktiviert."
+#: ../../include/text.php:1016
+msgid "Friday"
+msgstr "Freitag"
-#: ../../mod/install.php:338
-msgid "This is required for message delivery to work."
-msgstr "Dies wird für die Auslieferung von Nachrichten benötigt."
+#: ../../include/text.php:1016
+msgid "Saturday"
+msgstr "Samstag"
-#: ../../mod/install.php:340
-msgid "PHP register_argc_argv"
-msgstr "PHP register_argc_argv"
+#: ../../include/text.php:1016
+msgid "Sunday"
+msgstr "Sonntag"
-#: ../../mod/install.php:361
-msgid ""
-"Error: the \"openssl_pkey_new\" function on this system is not able to "
-"generate encryption keys"
-msgstr "Fehler: Die Funktion \"openssl_pkey_new\" auf diesem System ist nicht in der Lage, Verschlüsselungsschlüssel zu erzeugen"
+#: ../../include/text.php:1020
+msgid "January"
+msgstr "Januar"
-#: ../../mod/install.php:362
-msgid ""
-"If running under Windows, please see "
-"\"http://www.php.net/manual/en/openssl.installation.php\"."
-msgstr "Wenn der Server unter Windows läuft, schau dir bitte \"http://www.php.net/manual/en/openssl.installation.php\" an."
+#: ../../include/text.php:1020
+msgid "February"
+msgstr "Februar"
-#: ../../mod/install.php:364
-msgid "Generate encryption keys"
-msgstr "Schlüssel erzeugen"
+#: ../../include/text.php:1020
+msgid "March"
+msgstr "März"
-#: ../../mod/install.php:371
-msgid "libCurl PHP module"
-msgstr "PHP: libCurl-Modul"
+#: ../../include/text.php:1020
+msgid "April"
+msgstr "April"
-#: ../../mod/install.php:372
-msgid "GD graphics PHP module"
-msgstr "PHP: GD-Grafikmodul"
+#: ../../include/text.php:1020
+msgid "May"
+msgstr "Mai"
-#: ../../mod/install.php:373
-msgid "OpenSSL PHP module"
-msgstr "PHP: OpenSSL-Modul"
+#: ../../include/text.php:1020
+msgid "June"
+msgstr "Juni"
-#: ../../mod/install.php:374
-msgid "mysqli PHP module"
-msgstr "PHP: mysqli-Modul"
+#: ../../include/text.php:1020
+msgid "July"
+msgstr "Juli"
-#: ../../mod/install.php:375
-msgid "mb_string PHP module"
-msgstr "PHP: mb_string-Modul"
+#: ../../include/text.php:1020
+msgid "August"
+msgstr "August"
-#: ../../mod/install.php:380 ../../mod/install.php:382
-msgid "Apache mod_rewrite module"
-msgstr "Apache mod_rewrite module"
+#: ../../include/text.php:1020
+msgid "September"
+msgstr "September"
-#: ../../mod/install.php:380
-msgid ""
-"Error: Apache webserver mod-rewrite module is required but not installed."
-msgstr "Fehler: Das Apache-Modul mod-rewrite wird benötigt, es ist allerdings nicht installiert."
+#: ../../include/text.php:1020
+msgid "October"
+msgstr "Oktober"
-#: ../../mod/install.php:388
-msgid "Error: libCURL PHP module required but not installed."
-msgstr "Fehler: Das libCURL PHP Modul wird benötigt ist aber nicht installiert."
+#: ../../include/text.php:1020
+msgid "November"
+msgstr "November"
-#: ../../mod/install.php:392
-msgid ""
-"Error: GD graphics PHP module with JPEG support required but not installed."
-msgstr "Fehler: Das GD-Graphikmodul für PHP mit JPEG-Unterstützung ist nicht installiert."
+#: ../../include/text.php:1020
+msgid "December"
+msgstr "Dezember"
-#: ../../mod/install.php:396
-msgid "Error: openssl PHP module required but not installed."
-msgstr "Fehler: Das openssl-Modul von PHP ist nicht installiert."
+#: ../../include/text.php:1098
+msgid "unknown.???"
+msgstr "unbekannt.???"
-#: ../../mod/install.php:400
-msgid "Error: mysqli PHP module required but not installed."
-msgstr "Fehler: Das mysqli-Modul von PHP ist nicht installiert."
+#: ../../include/text.php:1099
+msgid "bytes"
+msgstr "Bytes"
-#: ../../mod/install.php:404
-msgid "Error: mb_string PHP module required but not installed."
-msgstr "Fehler: mb_string PHP Module wird benötigt ist aber nicht installiert."
+#: ../../include/text.php:1134
+msgid "remove category"
+msgstr "Kategorie entfernen"
-#: ../../mod/install.php:421
-msgid ""
-"The web installer needs to be able to create a file called \".htconfig.php\""
-" in the top folder of your web server and it is unable to do so."
-msgstr "Der Installationswizard muss in der Lage sein, eine Datei im Stammverzeichnis deines Webservers anzulegen, ist allerdings derzeit nicht in der Lage, dies zu tun."
+#: ../../include/text.php:1156
+msgid "remove from file"
+msgstr "aus der Datei entfernen"
-#: ../../mod/install.php:422
-msgid ""
-"This is most often a permission setting, as the web server may not be able "
-"to write files in your folder - even if you can."
-msgstr "In den meisten Fällen ist dies ein Problem mit den Schreibrechten, der Webserver könnte keine Schreiberlaubnis haben, selbst wenn du sie hast."
+#: ../../include/text.php:1214 ../../include/text.php:1226
+msgid "Click to open/close"
+msgstr "Klicke zum Öffnen/Schließen"
-#: ../../mod/install.php:423
-msgid ""
-"At the end of this procedure, we will give you a text to save in a file "
-"named .htconfig.php in your Friendica top folder."
-msgstr "Nachdem du alles ausgefüllt hast, erhältst du einen Text, den du in eine Datei namens .htconfig.php in deinem Friendica-Wurzelverzeichnis kopieren musst."
+#: ../../include/text.php:1402 ../../mod/events.php:332
+msgid "link to source"
+msgstr "Link zum Originalbeitrag"
-#: ../../mod/install.php:424
-msgid ""
-"You can alternatively skip this procedure and perform a manual installation."
-" Please see the file \"INSTALL.txt\" for instructions."
-msgstr "Alternativ kannst du diesen Schritt aber auch überspringen und die Installation manuell durchführen. Eine Anleitung dazu (Englisch) findest du in der Datei INSTALL.txt."
+#: ../../include/text.php:1421
+msgid "Select a page layout: "
+msgstr "Ein Seiten-Layout auswählen"
-#: ../../mod/install.php:427
-msgid ".htconfig.php is writable"
-msgstr "Schreibrechte auf .htconfig.php"
+#: ../../include/text.php:1424 ../../include/text.php:1489
+msgid "default"
+msgstr "Standard"
-#: ../../mod/install.php:439
-msgid ""
-"Url rewrite in .htaccess is not working. Check your server configuration."
-msgstr "Umschreiben der URLs in der .htaccess funktioniert nicht. Überprüfe die Konfiguration des Servers."
+#: ../../include/text.php:1460
+msgid "Page content type: "
+msgstr "Content-Typ der Seite"
-#: ../../mod/install.php:441
-msgid "Url rewrite is working"
-msgstr "URL rewrite funktioniert"
+#: ../../include/text.php:1501
+msgid "Select an alternate language"
+msgstr "Wähle eine alternative Sprache"
-#: ../../mod/install.php:451
-msgid ""
-"The database configuration file \".htconfig.php\" could not be written. "
-"Please use the enclosed text to create a configuration file in your web "
-"server root."
-msgstr "Die Konfigurationsdatei \".htconfig.php\" konnte nicht angelegt werden. Bitte verwende den angefügten Text, um die Datei im Stammverzeichnis deiner Friendica-Installation zu erzeugen."
+#: ../../include/text.php:1653 ../../include/conversation.php:117
+#: ../../mod/like.php:103 ../../mod/subthread.php:89 ../../mod/tagger.php:45
+msgid "photo"
+msgstr "Foto"
-#: ../../mod/install.php:476
-msgid "Errors encountered creating database tables."
-msgstr "Fehler aufgetreten während der Erzeugung der Datenbanktabellen."
+#: ../../include/text.php:1656 ../../include/conversation.php:120
+#: ../../mod/tagger.php:49
+msgid "event"
+msgstr "Ereignis"
-#: ../../mod/install.php:487
-msgid "<h1>What next</h1>"
-msgstr "<h1>Wie geht es weiter?</h1>"
+#: ../../include/text.php:1659 ../../include/conversation.php:145
+#: ../../mod/like.php:103 ../../mod/subthread.php:89 ../../mod/tagger.php:53
+msgid "status"
+msgstr "Status"
-#: ../../mod/install.php:488
-msgid ""
-"IMPORTANT: You will need to [manually] setup a scheduled task for the "
-"poller."
-msgstr "WICHTIG: Du musst [manuell] einen Cronjob (o.ä.) für den Poller einrichten."
+#: ../../include/text.php:1661 ../../include/conversation.php:147
+#: ../../mod/tagger.php:55
+msgid "comment"
+msgstr "Kommentar"
-#: ../../mod/localtime.php:12 ../../include/event.php:11
-#: ../../include/bb2diaspora.php:243
-msgid "l F d, Y \\@ g:i A"
-msgstr "l F d, Y \\@ g:i A"
+#: ../../include/text.php:1666
+msgid "activity"
+msgstr "Aktivität"
-#: ../../mod/localtime.php:24
-msgid "Time Conversion"
-msgstr "Zeitumrechnung"
+#: ../../include/text.php:1928
+msgid "Design"
+msgstr "Design"
-#: ../../mod/localtime.php:26
-msgid ""
-"Friendika provides this service for sharing events with other networks and "
-"friends in unknown timezones."
-msgstr "Friendica bietet diese Funktion an, um das Teilen von Events mit den Kontakten zu vereinfachen, deren Zeitzone nicht ermittelt werden kann."
+#: ../../include/text.php:1930
+msgid "Blocks"
+msgstr "Blöcke"
-#: ../../mod/localtime.php:30
-#, php-format
-msgid "UTC time: %s"
-msgstr "UTC Zeit: %s"
+#: ../../include/text.php:1931
+msgid "Menus"
+msgstr "Menüs"
-#: ../../mod/localtime.php:33
-#, php-format
-msgid "Current timezone: %s"
-msgstr "Aktuelle Zeitzone: %s"
+#: ../../include/text.php:1932
+msgid "Layouts"
+msgstr "Layouts"
-#: ../../mod/localtime.php:36
-#, php-format
-msgid "Converted localtime: %s"
-msgstr "Umgerechnete lokale Zeit: %s"
+#: ../../include/text.php:1933
+msgid "Pages"
+msgstr "Seiten"
-#: ../../mod/localtime.php:41
-msgid "Please select your timezone:"
-msgstr "Bitte wähle deine Zeitzone."
+#: ../../include/group.php:25
+msgid ""
+"A deleted group with this name was revived. Existing item permissions "
+"<strong>may</strong> apply to this group and any future members. If this is "
+"not what you intended, please create another group with a different name."
+msgstr "Ein gelöschte Gruppe mit diesem Namen wurde gefunden. Existierende Zugangsregeln für Elemente <strong>könnten</strong> für diese Gruppe angewendet werden, sowie für alle zukünftigen Elemente."
-#: ../../mod/match.php:12
-msgid "Profile Match"
-msgstr "Profilübereinstimmungen"
+#: ../../include/group.php:223
+msgid "Default privacy group for new contacts"
+msgstr "Standard-Privatsphärengruppe für neue Kontakte"
-#: ../../mod/match.php:20
-msgid "No keywords to match. Please add keywords to your default profile."
-msgstr "Keine Schlüsselwörter zum Abgleichen gefunden. Bitte füge einige Schlüsselwörter zu deinem Standardprofil hinzu."
+#: ../../include/group.php:242 ../../mod/admin.php:698
+msgid "All Channels"
+msgstr "Alle Kanäle"
-#: ../../mod/match.php:57
-msgid "is interested in:"
-msgstr "ist interessiert an:"
+#: ../../include/group.php:264
+msgid "edit"
+msgstr "Bearbeiten"
-#: ../../mod/match.php:58 ../../mod/suggest.php:59
-#: ../../include/contact_widgets.php:9 ../../boot.php:1053
-msgid "Connect"
-msgstr "Verbinden"
+#: ../../include/group.php:285
+msgid "Collections"
+msgstr "Sammlungen"
-#: ../../mod/match.php:65 ../../mod/dirfind.php:60
-msgid "No matches"
-msgstr "Keine Ãœbereinstimmungen"
+#: ../../include/group.php:286
+msgid "Edit collection"
+msgstr "Bearbeite Sammlungen"
-#: ../../mod/lockview.php:39
-msgid "Remote privacy information not available."
-msgstr "Entfernte Privatsphäreneinstellungen nicht verfügbar."
+#: ../../include/group.php:287
+msgid "Create a new collection"
+msgstr "Neue Sammlung erzeugen"
-#: ../../mod/lockview.php:43
-msgid "Visible to:"
-msgstr "Sichtbar für:"
+#: ../../include/group.php:288
+msgid "Channels not in any collection"
+msgstr "Kanäle, die nicht in einer Sammlung sind"
-#: ../../mod/home.php:26 ../../addon/communityhome/communityhome.php:179
-#, php-format
-msgid "Welcome to %s"
-msgstr "Willkommen zu %s"
+#: ../../include/js_strings.php:5
+msgid "Delete this item?"
+msgstr "Dieses Element löschen?"
-#: ../../mod/notifications.php:26
-msgid "Invalid request identifier."
-msgstr "Invalid request identifier."
+#: ../../include/js_strings.php:6 ../../include/ItemObject.php:536
+#: ../../mod/photos.php:1099 ../../mod/photos.php:1186
+msgid "Comment"
+msgstr "Kommentar"
-#: ../../mod/notifications.php:35 ../../mod/notifications.php:161
-#: ../../mod/notifications.php:207
-msgid "Discard"
-msgstr "Verwerfen"
+#: ../../include/js_strings.php:7 ../../include/contact_widgets.php:125
+#: ../../include/ItemObject.php:270
+msgid "show more"
+msgstr "mehr zeigen"
-#: ../../mod/notifications.php:51 ../../mod/notifications.php:160
-#: ../../mod/notifications.php:206 ../../mod/contacts.php:316
-#: ../../mod/contacts.php:370
-msgid "Ignore"
-msgstr "Ignorieren"
+#: ../../include/js_strings.php:8
+msgid "show fewer"
+msgstr "Zeige weniger"
-#: ../../mod/notifications.php:75
-msgid "System"
-msgstr "System"
+#: ../../include/js_strings.php:9
+msgid "Password too short"
+msgstr "Kennwort zu kurz"
-#: ../../mod/notifications.php:80 ../../include/nav.php:113
-msgid "Network"
-msgstr "Netzwerk"
+#: ../../include/js_strings.php:10
+msgid "Passwords do not match"
+msgstr "Kennwörter stimmen nicht überein"
-#: ../../mod/notifications.php:85 ../../mod/network.php:300
-msgid "Personal"
-msgstr "Persönlich"
+#: ../../include/js_strings.php:11 ../../mod/photos.php:39
+msgid "everybody"
+msgstr "alle"
-#: ../../mod/notifications.php:90 ../../view/theme/diabook/theme.php:127
-#: ../../include/nav.php:77 ../../include/nav.php:115
-msgid "Home"
-msgstr "Pinnwand"
+#: ../../include/js_strings.php:12
+msgid "Secret Passphrase"
+msgstr "geheime Passwort-Phrase"
-#: ../../mod/notifications.php:95 ../../include/nav.php:121
-msgid "Introductions"
-msgstr "Kontaktanfragen"
+#: ../../include/js_strings.php:13
+msgid "Passphrase hint"
+msgstr "Hinweis zur Phrase"
-#: ../../mod/notifications.php:100 ../../mod/message.php:105
-#: ../../include/nav.php:128
-msgid "Messages"
-msgstr "Nachrichten"
+#: ../../include/js_strings.php:15
+msgid "timeago.prefixAgo"
+msgstr "timeago.prefixAgo"
+
+#: ../../include/js_strings.php:16
+msgid "timeago.suffixAgo"
+msgstr "timeago.suffixAgo"
-#: ../../mod/notifications.php:119
-msgid "Show Ignored Requests"
-msgstr "Zeige ignorierte Anfragen"
+#: ../../include/js_strings.php:17
+msgid "ago"
+msgstr "her"
-#: ../../mod/notifications.php:119
-msgid "Hide Ignored Requests"
-msgstr "Verberge ignorierte Anfragen"
+#: ../../include/js_strings.php:18
+msgid "from now"
+msgstr "von jetzt"
-#: ../../mod/notifications.php:145 ../../mod/notifications.php:191
-msgid "Notification type: "
-msgstr "Benachrichtigungstyp: "
+#: ../../include/js_strings.php:19
+msgid "less than a minute"
+msgstr "weniger als eine Minute"
-#: ../../mod/notifications.php:146
-msgid "Friend Suggestion"
-msgstr "Kontaktvorschlag"
+#: ../../include/js_strings.php:20
+msgid "about a minute"
+msgstr "ungefähr eine Minute"
-#: ../../mod/notifications.php:148
+#: ../../include/js_strings.php:21
#, php-format
-msgid "suggested by %s"
-msgstr "vorgeschlagen von %s"
+msgid "%d minutes"
+msgstr "%d Minuten"
-#: ../../mod/notifications.php:153 ../../mod/notifications.php:200
-#: ../../mod/contacts.php:376
-msgid "Hide this contact from others"
-msgstr "Verberge diesen Kontakt vor anderen"
+#: ../../include/js_strings.php:22
+msgid "about an hour"
+msgstr "ungefähr eine Stunde"
-#: ../../mod/notifications.php:154 ../../mod/notifications.php:201
-msgid "Post a new friend activity"
-msgstr "Neue-Kontakt Nachricht senden"
+#: ../../include/js_strings.php:23
+#, php-format
+msgid "about %d hours"
+msgstr "ungefähr %d Stunden"
-#: ../../mod/notifications.php:154 ../../mod/notifications.php:201
-msgid "if applicable"
-msgstr "falls anwendbar"
+#: ../../include/js_strings.php:24
+msgid "a day"
+msgstr "ein Tag"
-#: ../../mod/notifications.php:157 ../../mod/notifications.php:204
-#: ../../mod/admin.php:661
-msgid "Approve"
-msgstr "Genehmigen"
+#: ../../include/js_strings.php:25
+#, php-format
+msgid "%d days"
+msgstr "%d Tage"
-#: ../../mod/notifications.php:177
-msgid "Claims to be known to you: "
-msgstr "Behauptet dich zu kennen: "
+#: ../../include/js_strings.php:26
+msgid "about a month"
+msgstr "ungefähr ein Monat"
-#: ../../mod/notifications.php:177
-msgid "yes"
-msgstr "ja"
+#: ../../include/js_strings.php:27
+#, php-format
+msgid "%d months"
+msgstr "%d Monate"
-#: ../../mod/notifications.php:177
-msgid "no"
-msgstr "nein"
+#: ../../include/js_strings.php:28
+msgid "about a year"
+msgstr "ungefähr ein Jahr"
-#: ../../mod/notifications.php:184
-msgid "Approve as: "
-msgstr "Genehmigen als: "
+#: ../../include/js_strings.php:29
+#, php-format
+msgid "%d years"
+msgstr "%d Jahre"
-#: ../../mod/notifications.php:185
-msgid "Friend"
-msgstr "Freund"
+#: ../../include/js_strings.php:30
+msgid " "
+msgstr " "
-#: ../../mod/notifications.php:186
-msgid "Sharer"
-msgstr "Teilenden"
+#: ../../include/js_strings.php:31
+msgid "timeago.numbers"
+msgstr "timeago.numbers"
-#: ../../mod/notifications.php:186
-msgid "Fan/Admirer"
-msgstr "Fan/Verehrer"
+#: ../../include/message.php:18
+msgid "No recipient provided."
+msgstr "Kein Empfänger angegeben"
-#: ../../mod/notifications.php:192
-msgid "Friend/Connect Request"
-msgstr "Kontakt-/Freundschaftsanfrage"
+#: ../../include/message.php:23
+msgid "[no subject]"
+msgstr "[no subject]"
-#: ../../mod/notifications.php:192
-msgid "New Follower"
-msgstr "Neuer Bewunderer"
+#: ../../include/message.php:42
+msgid "Unable to determine sender."
+msgstr "Kann Absender nicht bestimmen."
-#: ../../mod/notifications.php:213
-msgid "No introductions."
-msgstr "Keine Kontaktanfragen."
+#: ../../include/message.php:143
+msgid "Stored post could not be verified."
+msgstr "Gespeicherter Beitrag konnten nicht überprüft werden."
-#: ../../mod/notifications.php:216 ../../include/nav.php:122
-msgid "Notifications"
-msgstr "Benachrichtigungen"
+#: ../../include/photo/photo_driver.php:637 ../../include/photos.php:51
+#: ../../mod/photos.php:91 ../../mod/photos.php:783 ../../mod/photos.php:805
+#: ../../mod/profile_photo.php:78 ../../mod/profile_photo.php:225
+#: ../../mod/profile_photo.php:336
+msgid "Profile Photos"
+msgstr "Profilfotos"
-#: ../../mod/notifications.php:253 ../../mod/notifications.php:378
-#: ../../mod/notifications.php:465
-#, php-format
-msgid "%s liked %s's post"
-msgstr "%s mag %ss Beitrag"
+#: ../../include/network.php:640
+msgid "view full size"
+msgstr "In Vollbildansicht anschauen"
-#: ../../mod/notifications.php:262 ../../mod/notifications.php:387
-#: ../../mod/notifications.php:474
-#, php-format
-msgid "%s disliked %s's post"
-msgstr "%s mag %ss Beitrag nicht"
+#: ../../include/bbcode.php:94 ../../include/bbcode.php:509
+#: ../../include/bbcode.php:512
+msgid "Image/photo"
+msgstr "Bild/Foto"
-#: ../../mod/notifications.php:276 ../../mod/notifications.php:401
-#: ../../mod/notifications.php:488
-#, php-format
-msgid "%s is now friends with %s"
-msgstr "%s ist jetzt mit %s befreundet"
+#: ../../include/bbcode.php:129 ../../include/bbcode.php:517
+msgid "Encrypted content"
+msgstr "Verschlüsselter Inhalt"
-#: ../../mod/notifications.php:283 ../../mod/notifications.php:408
-#, php-format
-msgid "%s created a new post"
-msgstr "%s hat einen neuen Beitrag erstellt"
+#: ../../include/bbcode.php:136
+msgid "QR code"
+msgstr "QR Code"
-#: ../../mod/notifications.php:284 ../../mod/notifications.php:409
-#: ../../mod/notifications.php:497
+#: ../../include/bbcode.php:179
#, php-format
-msgid "%s commented on %s's post"
-msgstr "%s hat %ss Beitrag kommentiert"
+msgid "%1$s wrote the following %2$s %3$s"
+msgstr "%1$s schrieb den folgenden %2$s %3$s"
-#: ../../mod/notifications.php:298
-msgid "No more network notifications."
-msgstr "Keine weiteren Netzwerk-Benachrichtigungen."
+#: ../../include/bbcode.php:181
+msgid "post"
+msgstr "Beitrag"
-#: ../../mod/notifications.php:302
-msgid "Network Notifications"
-msgstr "Netzwerk Benachrichtigungen"
+#: ../../include/bbcode.php:469 ../../include/bbcode.php:489
+msgid "$1 wrote:"
+msgstr "$1 schrieb:"
-#: ../../mod/notifications.php:328 ../../mod/notify.php:61
-msgid "No more system notifications."
-msgstr "Keine weiteren Systembenachrichtigungen."
+#: ../../include/oembed.php:150
+msgid "Embedded content"
+msgstr "Eingebetteter Inhalt"
-#: ../../mod/notifications.php:332 ../../mod/notify.php:65
-msgid "System Notifications"
-msgstr "Systembenachrichtigungen"
+#: ../../include/oembed.php:159
+msgid "Embedding disabled"
+msgstr "Einbetten ausgeschaltet"
-#: ../../mod/notifications.php:423
-msgid "No more personal notifications."
-msgstr "Keine weiteren persönlichen Benachrichtigungen"
+#: ../../include/features.php:21
+msgid "General Features"
+msgstr "Allgemeine Funktionen"
-#: ../../mod/notifications.php:427
-msgid "Personal Notifications"
-msgstr "Persönliche Benachrichtigungen"
+#: ../../include/features.php:23
+msgid "Content Expiration"
+msgstr "Verfall von Inhalten"
-#: ../../mod/notifications.php:504
-msgid "No more home notifications."
-msgstr "Keine weiteren Pinnwand-Benachrichtigungen"
+#: ../../include/features.php:23
+msgid "Remove posts/comments and/or private messages at a future time"
+msgstr "Lösche Beiträge, Kommentare und/oder private Nachrichten automatisch zu einem zukünftigen Datum."
-#: ../../mod/notifications.php:508
-msgid "Home Notifications"
-msgstr "Pinnwand Benachrichtigungen"
+#: ../../include/features.php:24
+msgid "Multiple Profiles"
+msgstr "Mehrfachprofile"
-#: ../../mod/contacts.php:83 ../../mod/contacts.php:163
-msgid "Could not access contact record."
-msgstr "Konnte nicht auf die Kontaktdaten zugreifen."
+#: ../../include/features.php:24
+msgid "Ability to create multiple profiles"
+msgstr "Mehrfachprofile anlegen können"
-#: ../../mod/contacts.php:97
-msgid "Could not locate selected profile."
-msgstr "Konnte das ausgewählte Profil nicht finden."
+#: ../../include/features.php:25
+msgid "Web Pages"
+msgstr "Webseiten"
-#: ../../mod/contacts.php:120
-msgid "Contact updated."
-msgstr "Kontakt aktualisiert."
+#: ../../include/features.php:25
+msgid "Provide managed web pages on your channel"
+msgstr "Stelle verwaltete Webseiten in Deinem Kanal zur Verfügung"
-#: ../../mod/contacts.php:185
-msgid "Contact has been blocked"
-msgstr "Kontakt wurde blockiert"
+#: ../../include/features.php:26
+msgid "Private Notes"
+msgstr "private Notizen"
-#: ../../mod/contacts.php:185
-msgid "Contact has been unblocked"
-msgstr "Kontakt wurde wieder freigegeben"
+#: ../../include/features.php:26
+msgid "Enables a tool to store notes and reminders"
+msgstr "Werkzeug zum Speichern von Notizen und Erinnerungen aktivieren"
-#: ../../mod/contacts.php:199
-msgid "Contact has been ignored"
-msgstr "Kontakt wurde ignoriert"
+#: ../../include/features.php:31
+msgid "Extended Identity Sharing"
+msgstr "Erweitertes Teilen von Identitäten"
-#: ../../mod/contacts.php:199
-msgid "Contact has been unignored"
-msgstr "Kontakt wird nicht mehr ignoriert"
+#: ../../include/features.php:31
+msgid ""
+"Share your identity with all websites on the internet. When disabled, "
+"identity is only shared with sites in the matrix."
+msgstr "Teile deine Identität mit allen Webseiten im Internet. Ist dies deaktiviert wird deine Identität nur mit Seiten der Matrix geteilt."
-#: ../../mod/contacts.php:215
-msgid "Contact has been archived"
-msgstr "Kontakt wurde archiviert"
+#: ../../include/features.php:32
+msgid "Expert Mode"
+msgstr "Expertenmodus"
-#: ../../mod/contacts.php:215
-msgid "Contact has been unarchived"
-msgstr "Kontakt wurde aus dem Archiv geholt"
+#: ../../include/features.php:32
+msgid "Enable Expert Mode to provide advanced configuration options"
+msgstr "Aktiviere Expertenmodus, um fortgeschrittene Konfiguration zur Verfügung zu stellen"
-#: ../../mod/contacts.php:228
-msgid "Contact has been removed."
-msgstr "Kontakt wurde entfernt."
+#: ../../include/features.php:33
+msgid "Premium Channel"
+msgstr "Premium-Kanal"
-#: ../../mod/contacts.php:258
-#, php-format
-msgid "You are mutual friends with %s"
-msgstr "Du hast mit %s eine beidseitige Freundschaft"
+#: ../../include/features.php:33
+msgid ""
+"Allows you to set restrictions and terms on those that connect with your "
+"channel"
+msgstr "Erlaubt es dir Einschränkungen für Kontakte und bestimmte Bedingungen an Kontakte zu diesem Kanal zu stellen"
-#: ../../mod/contacts.php:262
-#, php-format
-msgid "You are sharing with %s"
-msgstr "Du teilst mit %s"
+#: ../../include/features.php:38
+msgid "Post Composition Features"
+msgstr "Nachbearbeitungsfunktionen"
-#: ../../mod/contacts.php:267
-#, php-format
-msgid "%s is sharing with you"
-msgstr "%s teilt mit Dir"
+#: ../../include/features.php:39
+msgid "Richtext Editor"
+msgstr "Formatierungseditor"
-#: ../../mod/contacts.php:284
-msgid "Private communications are not available for this contact."
-msgstr "Private Kommunikation ist für diesen Kontakt nicht verfügbar."
+#: ../../include/features.php:39
+msgid "Enable richtext editor"
+msgstr "Aktiviere Formatierungseditor"
-#: ../../mod/contacts.php:287
-msgid "Never"
-msgstr "Niemals"
+#: ../../include/features.php:40
+msgid "Post Preview"
+msgstr "Voransicht"
-#: ../../mod/contacts.php:291
-msgid "(Update was successful)"
-msgstr "(Aktualisierung war erfolgreich)"
+#: ../../include/features.php:40
+msgid "Allow previewing posts and comments before publishing them"
+msgstr "Erlaube Voransicht von Beiträgen und Kommentaren vor Veröffentlichung"
-#: ../../mod/contacts.php:291
-msgid "(Update was not successful)"
-msgstr "(Aktualisierung war nicht erfolgreich)"
+#: ../../include/features.php:41
+msgid "Automatically import channel content from other channels or feeds"
+msgstr "Importiere automatisch Inhalte für diesen Kanal von anderen Kanälen oder Feeds."
-#: ../../mod/contacts.php:293
-msgid "Suggest friends"
-msgstr "Kontakte vorschlagen"
+#: ../../include/features.php:42
+msgid "Even More Encryption"
+msgstr "Noch mehr Verschlüsselung"
-#: ../../mod/contacts.php:297
-#, php-format
-msgid "Network type: %s"
-msgstr "Netzwerk Typ: %s"
+#: ../../include/features.php:42
+msgid ""
+"Allow optional encryption of content end-to-end with a shared secret key"
+msgstr "Erlaube optionale Verschlüsselung von Inhalten (Ende-zu-Ende mit geteiltem Sicherheitsschlüssel)"
-#: ../../mod/contacts.php:300 ../../include/contact_widgets.php:183
-#, php-format
-msgid "%d contact in common"
-msgid_plural "%d contacts in common"
-msgstr[0] "%d gemeinsamer Kontakt"
-msgstr[1] "%d gemeinsame Kontakte"
+#: ../../include/features.php:47
+msgid "Network and Stream Filtering"
+msgstr "Netzwerk- und Stream-Filter"
-#: ../../mod/contacts.php:305
-msgid "View all contacts"
-msgstr "Alle Kontakte anzeigen"
+#: ../../include/features.php:48
+msgid "Search by Date"
+msgstr "Suche nach Datum"
-#: ../../mod/contacts.php:310 ../../mod/contacts.php:369
-#: ../../mod/admin.php:665
-msgid "Unblock"
-msgstr "Entsperren"
+#: ../../include/features.php:48
+msgid "Ability to select posts by date ranges"
+msgstr "Möglichkeit, Beiträge nach Zeiträumen auszuwählen"
-#: ../../mod/contacts.php:310 ../../mod/contacts.php:369
-#: ../../mod/admin.php:664
-msgid "Block"
-msgstr "Sperren"
+#: ../../include/features.php:49
+msgid "Collections Filter"
+msgstr "Filter für Sammlung"
-#: ../../mod/contacts.php:313
-msgid "Toggle Blocked status"
-msgstr "Geblockt-Status ein-/ausschalten"
+#: ../../include/features.php:49
+msgid "Enable widget to display Network posts only from selected collections"
+msgstr "Aktiviere nur Netzwerk-Beiträge von ausgewählten Sammlungen"
-#: ../../mod/contacts.php:316 ../../mod/contacts.php:370
-msgid "Unignore"
-msgstr "Ignorieren aufheben"
+#: ../../include/features.php:50
+msgid "Save search terms for re-use"
+msgstr "Gesicherte Suchbegriffe zur Wiederverwendung"
-#: ../../mod/contacts.php:319
-msgid "Toggle Ignored status"
-msgstr "Ignoriert-Status ein-/ausschalten"
+#: ../../include/features.php:51
+msgid "Network Personal Tab"
+msgstr "Persönlicher Netzwerkreiter"
-#: ../../mod/contacts.php:323
-msgid "Unarchive"
-msgstr "Unarchivieren"
+#: ../../include/features.php:51
+msgid "Enable tab to display only Network posts that you've interacted on"
+msgstr "Aktiviere Reiter nur für die Netzwerk-Beiträge, mit denen Du interagiert hast"
-#: ../../mod/contacts.php:323
-msgid "Archive"
-msgstr "Archivieren"
+#: ../../include/features.php:52
+msgid "Network New Tab"
+msgstr "Netzwerkreiter Neu"
-#: ../../mod/contacts.php:326
-msgid "Toggle Archive status"
-msgstr "Archiviert-Status ein-/ausschalten"
+#: ../../include/features.php:52
+msgid "Enable tab to display all new Network activity"
+msgstr "Aktiviere Reiter, um alle neuen Netzwerkaktivitäten zu zeigen"
-#: ../../mod/contacts.php:329
-msgid "Repair"
-msgstr "Reparieren"
+#: ../../include/features.php:53
+msgid "Affinity Tool"
+msgstr "Beziehungs-Tool"
-#: ../../mod/contacts.php:332
-msgid "Advanced Contact Settings"
-msgstr "Fortgeschrittene Kontakteinstellungen"
+#: ../../include/features.php:53
+msgid "Filter stream activity by depth of relationships"
+msgstr "Filter Aktivitätenstream nach Tiefe der Beziehung"
-#: ../../mod/contacts.php:338
-msgid "Communications lost with this contact!"
-msgstr "Verbindungen mit diesem Kontakt verloren!"
+#: ../../include/features.php:54
+msgid "Suggest Channels"
+msgstr "Kanäle Vorschlagen"
-#: ../../mod/contacts.php:341
-msgid "Contact Editor"
-msgstr "Kontakt Editor"
+#: ../../include/features.php:54
+msgid "Show channel suggestions"
+msgstr "Kanal-Vorschläge anzeigen"
-#: ../../mod/contacts.php:344
-msgid "Profile Visibility"
-msgstr "Profil-Sichtbarkeit"
+#: ../../include/features.php:59
+msgid "Post/Comment Tools"
+msgstr "Beitrag-/Kommentar-Tools"
-#: ../../mod/contacts.php:345
-#, php-format
-msgid ""
-"Please choose the profile you would like to display to %s when viewing your "
-"profile securely."
-msgstr "Bitte wähle eines deiner Profile das angezeigt werden soll, wenn %s dein Profil aufruft."
+#: ../../include/features.php:61
+msgid "Edit Sent Posts"
+msgstr "Bearbeite gesendete Beiträge"
-#: ../../mod/contacts.php:346
-msgid "Contact Information / Notes"
-msgstr "Kontakt Informationen / Notizen"
+#: ../../include/features.php:61
+msgid "Edit and correct posts and comments after sending"
+msgstr "Bearbeite und korrigiere Beiträge und Kommentare nach dem Senden"
-#: ../../mod/contacts.php:347
-msgid "Edit contact notes"
-msgstr "Notizen zum Kontakt bearbiten"
+#: ../../include/features.php:62
+msgid "Tagging"
+msgstr "Verschlagworten"
-#: ../../mod/contacts.php:352 ../../mod/contacts.php:544
-#: ../../mod/viewconnections.php:62 ../../mod/nogroup.php:40
-#, php-format
-msgid "Visit %s's profile [%s]"
-msgstr "Besuche %ss Profil [%s]"
+#: ../../include/features.php:62
+msgid "Ability to tag existing posts"
+msgstr "Möglichkeit, um existierende Beiträge zu verschlagworten"
-#: ../../mod/contacts.php:353
-msgid "Block/Unblock contact"
-msgstr "Kontakt blockieren/freischalten"
+#: ../../include/features.php:63
+msgid "Post Categories"
+msgstr "Beitrags-Kategorien"
-#: ../../mod/contacts.php:354
-msgid "Ignore contact"
-msgstr "Ignoriere den Kontakt"
+#: ../../include/features.php:63
+msgid "Add categories to your posts"
+msgstr "Kategorien für Beiträge"
-#: ../../mod/contacts.php:355
-msgid "Repair URL settings"
-msgstr "URL Einstellungen reparieren"
+#: ../../include/features.php:64
+msgid "Ability to file posts under folders"
+msgstr "Möglichkeit, Beiträge in Verzeichnissen zu sammeln"
-#: ../../mod/contacts.php:356
-msgid "View conversations"
-msgstr "Unterhaltungen anzeigen"
+#: ../../include/features.php:65
+msgid "Dislike Posts"
+msgstr "Gefällt-mir-nicht Beiträge"
-#: ../../mod/contacts.php:358
-msgid "Delete contact"
-msgstr "Lösche den Kontakt"
+#: ../../include/features.php:65
+msgid "Ability to dislike posts/comments"
+msgstr "Möglichkeit für Gefällt-mir-nicht für Beiträge/Kommentare"
-#: ../../mod/contacts.php:362
-msgid "Last update:"
-msgstr "letzte Aktualisierung:"
+#: ../../include/features.php:66
+msgid "Star Posts"
+msgstr "Beiträge mit Sternchen versehen"
-#: ../../mod/contacts.php:364
-msgid "Update public posts"
-msgstr "Öffentliche Beiträge aktualisieren"
+#: ../../include/features.php:66
+msgid "Ability to mark special posts with a star indicator"
+msgstr "Möglichkeit, spezielle Beiträge mit Sternchen-Symbol zu markieren"
-#: ../../mod/contacts.php:366 ../../mod/admin.php:1136
-msgid "Update now"
-msgstr "Jetzt aktualisieren"
+#: ../../include/features.php:67
+msgid "Tag Cloud"
+msgstr "Tag Wolke"
-#: ../../mod/contacts.php:373
-msgid "Currently blocked"
-msgstr "Derzeit geblockt"
+#: ../../include/features.php:67
+msgid "Provide a personal tag cloud on your channel page"
+msgstr "Persönliche Schlagwort-Wolke für deine Kanal-Seite anlegen"
-#: ../../mod/contacts.php:374
-msgid "Currently ignored"
-msgstr "Derzeit ignoriert"
+#: ../../include/conversation.php:123
+msgid "channel"
+msgstr "Kanal"
-#: ../../mod/contacts.php:375
-msgid "Currently archived"
-msgstr "Momentan archiviert"
+#: ../../include/conversation.php:161 ../../mod/like.php:134
+#, php-format
+msgid "%1$s likes %2$s's %3$s"
+msgstr "%1$s mag %2$s's %3$s"
-#: ../../mod/contacts.php:376
-msgid ""
-"Replies/likes to your public posts <strong>may</strong> still be visible"
-msgstr "Antworten/Likes auf deine öffentlichen Beiträge <strong>könnten</strong> weiterhin sichtbar sein"
+#: ../../include/conversation.php:164 ../../mod/like.php:136
+#, php-format
+msgid "%1$s doesn't like %2$s's %3$s"
+msgstr "%1$s mag %2$s's %3$s nicht"
-#: ../../mod/contacts.php:429
-msgid "Suggestions"
-msgstr "Kontaktvorschläge"
+#: ../../include/conversation.php:201
+#, php-format
+msgid "%1$s is now connected with %2$s"
+msgstr "%1$s ist jetzt mit %2$s verbunden"
-#: ../../mod/contacts.php:432
-msgid "Suggest potential friends"
-msgstr "Freunde vorschlagen"
+#: ../../include/conversation.php:236
+#, php-format
+msgid "%1$s poked %2$s"
+msgstr "%1$s stupste %2$s"
-#: ../../mod/contacts.php:435 ../../mod/group.php:191
-msgid "All Contacts"
-msgstr "Alle Kontakte"
+#: ../../include/conversation.php:258 ../../mod/mood.php:63
+#, php-format
+msgid "%1$s is currently %2$s"
+msgstr "%1$s ist momentan %2$s"
-#: ../../mod/contacts.php:438
-msgid "Show all contacts"
-msgstr "Alle Kontakte anzeigen"
+#: ../../include/conversation.php:631 ../../include/ItemObject.php:114
+msgid "Select"
+msgstr "Auswählen"
-#: ../../mod/contacts.php:441
-msgid "Unblocked"
-msgstr "Ungeblockt"
+#: ../../include/conversation.php:632 ../../include/ItemObject.php:108
+#: ../../mod/thing.php:230 ../../mod/connedit.php:356 ../../mod/admin.php:693
+#: ../../mod/group.php:176 ../../mod/photos.php:1150
+#: ../../mod/filestorage.php:172 ../../mod/settings.php:570
+msgid "Delete"
+msgstr "Löschen"
-#: ../../mod/contacts.php:444
-msgid "Only show unblocked contacts"
-msgstr "Nur nicht-blockierte Kontakte anzeigen"
+#: ../../include/conversation.php:642 ../../include/ItemObject.php:161
+msgid "Message is verified"
+msgstr "Nachricht überprüft"
-#: ../../mod/contacts.php:448
-msgid "Blocked"
-msgstr "Geblockt"
+#: ../../include/conversation.php:662
+#, php-format
+msgid "View %s's profile @ %s"
+msgstr "Schaue Dir %s's Profil auf %s an."
-#: ../../mod/contacts.php:451
-msgid "Only show blocked contacts"
-msgstr "Nur blockierte Kontakte anzeigen"
+#: ../../include/conversation.php:676
+msgid "Categories:"
+msgstr "Kategorien:"
-#: ../../mod/contacts.php:455
-msgid "Ignored"
-msgstr "Ignoriert"
+#: ../../include/conversation.php:677
+msgid "Filed under:"
+msgstr "Gespeichert unter:"
-#: ../../mod/contacts.php:458
-msgid "Only show ignored contacts"
-msgstr "Nur ignorierte Kontakte anzeigen"
+#: ../../include/conversation.php:686 ../../include/ItemObject.php:217
+#, php-format
+msgid " from %s"
+msgstr "von %s"
-#: ../../mod/contacts.php:462
-msgid "Archived"
-msgstr "Archiviert"
+#: ../../include/conversation.php:689 ../../include/ItemObject.php:220
+#, php-format
+msgid "last edited: %s"
+msgstr "zuletzt bearbeitet: %s"
-#: ../../mod/contacts.php:465
-msgid "Only show archived contacts"
-msgstr "Nur archivierte Kontakte anzeigen"
+#: ../../include/conversation.php:704
+msgid "View in context"
+msgstr "Im Zusammenhang anschauen"
-#: ../../mod/contacts.php:469
-msgid "Hidden"
-msgstr "Verborgen"
+#: ../../include/conversation.php:706 ../../include/conversation.php:1119
+#: ../../include/ItemObject.php:248 ../../mod/photos.php:1081
+#: ../../mod/mail.php:222 ../../mod/mail.php:336 ../../mod/editlayout.php:110
+#: ../../mod/editpost.php:107 ../../mod/editwebpage.php:153
+#: ../../mod/editblock.php:124
+msgid "Please wait"
+msgstr "Bitte warten"
-#: ../../mod/contacts.php:472
-msgid "Only show hidden contacts"
-msgstr "Nur verborgene Kontakte anzeigen"
+#: ../../include/conversation.php:833
+msgid "remove"
+msgstr "lösche"
-#: ../../mod/contacts.php:520
-msgid "Mutual Friendship"
-msgstr "Beidseitige Freundschaft"
+#: ../../include/conversation.php:837
+msgid "Loading..."
+msgstr "Lädt ..."
-#: ../../mod/contacts.php:524
-msgid "is a fan of yours"
-msgstr "ist ein Fan von dir"
+#: ../../include/conversation.php:838
+msgid "Delete Selected Items"
+msgstr "Lösche die ausgewählten Elemente"
-#: ../../mod/contacts.php:528
-msgid "you are a fan of"
-msgstr "du bist Fan von"
+#: ../../include/conversation.php:929
+msgid "View Source"
+msgstr "Quelle anzeigen"
-#: ../../mod/contacts.php:545 ../../mod/nogroup.php:41
-msgid "Edit contact"
-msgstr "Kontakt bearbeiten"
+#: ../../include/conversation.php:930
+msgid "Follow Thread"
+msgstr "Unterhaltung folgen"
-#: ../../mod/contacts.php:566 ../../view/theme/diabook/theme.php:129
-#: ../../include/nav.php:139
-msgid "Contacts"
-msgstr "Kontakte"
+#: ../../include/conversation.php:931
+msgid "View Status"
+msgstr "Status ansehen"
-#: ../../mod/contacts.php:570
-msgid "Search your contacts"
-msgstr "Suche in deinen Kontakten"
+#: ../../include/conversation.php:933
+msgid "View Photos"
+msgstr "Fotos ansehen"
-#: ../../mod/contacts.php:571 ../../mod/directory.php:57
-msgid "Finding: "
-msgstr "Funde: "
+#: ../../include/conversation.php:934
+msgid "Matrix Activity"
+msgstr "Matrix Aktivität"
-#: ../../mod/contacts.php:572 ../../mod/directory.php:59
-#: ../../include/contact_widgets.php:33
-msgid "Find"
-msgstr "Finde"
+#: ../../include/conversation.php:935
+msgid "Edit Contact"
+msgstr "Kontakt bearbeiten"
-#: ../../mod/lostpass.php:16
-msgid "No valid account found."
-msgstr "Kein gültiges Konto gefunden."
+#: ../../include/conversation.php:936
+msgid "Send PM"
+msgstr "Sende PN"
-#: ../../mod/lostpass.php:32
-msgid "Password reset request issued. Check your email."
-msgstr "Zurücksetzen des Passworts eingeleitet. Bitte überprüfe deine E-Mail."
+#: ../../include/conversation.php:937
+msgid "Poke"
+msgstr "Anstupsen"
-#: ../../mod/lostpass.php:43
+#: ../../include/conversation.php:999
#, php-format
-msgid "Password reset requested at %s"
-msgstr "Anfrage zum Zurücksetzen des Passworts auf %s erhalten"
-
-#: ../../mod/lostpass.php:45 ../../mod/lostpass.php:107
-#: ../../mod/register.php:90 ../../mod/register.php:144
-#: ../../mod/regmod.php:54 ../../mod/dfrn_confirm.php:752
-#: ../../addon/facebook/facebook.php:692
-#: ../../addon/facebook/facebook.php:1182
-#: ../../addon/public_server/public_server.php:62
-#: ../../addon/testdrive/testdrive.php:67 ../../include/items.php:2792
-#: ../../boot.php:703
-msgid "Administrator"
-msgstr "Administrator"
-
-#: ../../mod/lostpass.php:65
-msgid ""
-"Request could not be verified. (You may have previously submitted it.) "
-"Password reset failed."
-msgstr "Anfrage konnte nicht verifiziert werden. (Eventuell hast du bereits eine ähnliche Anfrage gestellt.) Zurücksetzen des Passworts gescheitert."
-
-#: ../../mod/lostpass.php:83 ../../boot.php:835
-msgid "Password Reset"
-msgstr "Passwort zurücksetzen"
+msgid "%s likes this."
+msgstr "%s gefällt das."
-#: ../../mod/lostpass.php:84
-msgid "Your password has been reset as requested."
-msgstr "Dein Passwort wurde wie gewünscht zurückgesetzt."
+#: ../../include/conversation.php:999
+#, php-format
+msgid "%s doesn't like this."
+msgstr "%s gefällt das nicht."
-#: ../../mod/lostpass.php:85
-msgid "Your new password is"
-msgstr "Dein neues Passwort lautet"
+#: ../../include/conversation.php:1003
+#, php-format
+msgid "<span %1$s>%2$d people</span> like this."
+msgid_plural "<span %1$s>%2$d people</span> like this."
+msgstr[0] "<span %1$s>%2$d Person</span> gefällt das."
+msgstr[1] "<span %1$s>%2$d Leuten</span> gefällt das."
-#: ../../mod/lostpass.php:86
-msgid "Save or copy your new password - and then"
-msgstr "Speichere oder kopiere dein neues Passwort - und dann"
+#: ../../include/conversation.php:1005
+#, php-format
+msgid "<span %1$s>%2$d people</span> don't like this."
+msgid_plural "<span %1$s>%2$d people</span> don't like this."
+msgstr[0] "<span %1$s>%2$d Person</span> gefällt das nicht."
+msgstr[1] "<span %1$s>%2$d Leuten</span> gefällt das nicht."
-#: ../../mod/lostpass.php:87
-msgid "click here to login"
-msgstr "hier klicken, um dich anzumelden"
+#: ../../include/conversation.php:1011
+msgid "and"
+msgstr "und"
-#: ../../mod/lostpass.php:88
-msgid ""
-"Your password may be changed from the <em>Settings</em> page after "
-"successful login."
-msgstr "Du kannst das Passwort in den <em>Einstellungen</em> ändern, sobald du dich erfolgreich angemeldet hast."
+#: ../../include/conversation.php:1014
+#, php-format
+msgid ", and %d other people"
+msgid_plural ", and %d other people"
+msgstr[0] ""
+msgstr[1] ", und %d andere"
-#: ../../mod/lostpass.php:119
-msgid "Forgot your Password?"
-msgstr "Hast du dein Passwort vergessen?"
+#: ../../include/conversation.php:1015
+#, php-format
+msgid "%s like this."
+msgstr "%s gefällt das."
-#: ../../mod/lostpass.php:120
-msgid ""
-"Enter your email address and submit to have your password reset. Then check "
-"your email for further instructions."
-msgstr "Gib deine Email-Adresse an und fordere ein neues Passwort an. Es werden dir dann weitere Informationen per Mail zugesendet."
+#: ../../include/conversation.php:1015
+#, php-format
+msgid "%s don't like this."
+msgstr "%s gefällt das nicht."
-#: ../../mod/lostpass.php:121
-msgid "Nickname or Email: "
-msgstr "Spitzname oder Email:"
+#: ../../include/conversation.php:1065
+msgid "Visible to <strong>everybody</strong>"
+msgstr "Sichtbar für <strong>jeden</strong>"
-#: ../../mod/lostpass.php:122
-msgid "Reset"
-msgstr "Zurücksetzen"
+#: ../../include/conversation.php:1066 ../../mod/mail.php:171
+#: ../../mod/mail.php:269
+msgid "Please enter a link URL:"
+msgstr "Gib eine URL ein:"
-#: ../../mod/settings.php:50 ../../include/nav.php:137
-msgid "Account settings"
-msgstr "Kontoeinstellungen"
+#: ../../include/conversation.php:1067
+msgid "Please enter a video link/URL:"
+msgstr "Gib einen Video-Link/URL ein:"
-#: ../../mod/settings.php:55
-msgid "Display settings"
-msgstr "Anzeige-Einstellungen"
+#: ../../include/conversation.php:1068
+msgid "Please enter an audio link/URL:"
+msgstr "Gib einen Audio-Link/URL ein:"
-#: ../../mod/settings.php:61
-msgid "Connector settings"
-msgstr "Connector-Einstellungen"
+#: ../../include/conversation.php:1069
+msgid "Tag term:"
+msgstr "Schlagwort:"
-#: ../../mod/settings.php:66
-msgid "Plugin settings"
-msgstr "Plugin-Einstellungen"
+#: ../../include/conversation.php:1070 ../../mod/filer.php:35
+msgid "Save to Folder:"
+msgstr "Speichern in Ordner:"
-#: ../../mod/settings.php:71
-msgid "Connected apps"
-msgstr "Verbundene Programme"
+#: ../../include/conversation.php:1071
+msgid "Where are you right now?"
+msgstr "Wo bist du jetzt grade?"
-#: ../../mod/settings.php:76
-msgid "Export personal data"
-msgstr "Persönliche Daten exportieren"
+#: ../../include/conversation.php:1072 ../../mod/mail.php:172
+#: ../../mod/mail.php:270 ../../mod/editpost.php:52
+msgid "Expires YYYY-MM-DD HH:MM"
+msgstr "Verfällt YYYY-MM-DD HH;MM"
-#: ../../mod/settings.php:81
-msgid "Remove account"
-msgstr "Konto löschen"
+#: ../../include/conversation.php:1082 ../../include/ItemObject.php:546
+#: ../../mod/webpages.php:122 ../../mod/photos.php:1101
+#: ../../mod/editlayout.php:130 ../../mod/editpost.php:127
+#: ../../mod/editwebpage.php:177 ../../mod/editblock.php:145
+msgid "Preview"
+msgstr "Vorschau"
-#: ../../mod/settings.php:89 ../../mod/admin.php:751 ../../mod/admin.php:956
-#: ../../addon/dav/layout.fnk.php:116 ../../addon/mathjax/mathjax.php:36
-#: ../../view/theme/diabook/theme.php:643
-#: ../../view/theme/diabook/theme.php:773 ../../include/nav.php:137
-msgid "Settings"
-msgstr "Einstellungen"
+#: ../../include/conversation.php:1096 ../../mod/photos.php:1080
+msgid "Share"
+msgstr "Teilen"
-#: ../../mod/settings.php:133
-msgid "Missing some important data!"
-msgstr "Wichtige Daten fehlen!"
+#: ../../include/conversation.php:1098 ../../mod/editwebpage.php:140
+msgid "Page link title"
+msgstr "Seitentitel-Link"
-#: ../../mod/settings.php:136 ../../mod/settings.php:581
-msgid "Update"
-msgstr "Aktualisierungen"
+#: ../../include/conversation.php:1100 ../../mod/mail.php:219
+#: ../../mod/mail.php:332 ../../mod/editlayout.php:102
+#: ../../mod/editpost.php:99 ../../mod/editwebpage.php:145
+#: ../../mod/editblock.php:116
+msgid "Upload photo"
+msgstr "Foto hochladen"
-#: ../../mod/settings.php:241
-msgid "Failed to connect with email account using the settings provided."
-msgstr "Verbindung zum E-Mail-Konto mit den angegebenen Einstellungen nicht möglich."
+#: ../../include/conversation.php:1101
+msgid "upload photo"
+msgstr "Foto hochladen"
-#: ../../mod/settings.php:246
-msgid "Email settings updated."
-msgstr "EMail Einstellungen bearbeitet."
+#: ../../include/conversation.php:1102 ../../mod/mail.php:220
+#: ../../mod/mail.php:333 ../../mod/editlayout.php:103
+#: ../../mod/editpost.php:100 ../../mod/editwebpage.php:146
+#: ../../mod/editblock.php:117
+msgid "Attach file"
+msgstr "Datei anhängen"
-#: ../../mod/settings.php:305
-msgid "Passwords do not match. Password unchanged."
-msgstr "Die Passwörter stimmen nicht überein. Das Passwort bleibt unverändert."
+#: ../../include/conversation.php:1103
+msgid "attach file"
+msgstr "Datei anfügen"
-#: ../../mod/settings.php:310
-msgid "Empty passwords are not allowed. Password unchanged."
-msgstr "Leere Passwörter sind nicht erlaubt. Passwort bleibt unverändert."
+#: ../../include/conversation.php:1104 ../../mod/mail.php:221
+#: ../../mod/mail.php:334 ../../mod/editlayout.php:104
+#: ../../mod/editpost.php:101 ../../mod/editwebpage.php:147
+#: ../../mod/editblock.php:118
+msgid "Insert web link"
+msgstr "Link einfügen"
-#: ../../mod/settings.php:321
-msgid "Password changed."
-msgstr "Passwort ändern."
+#: ../../include/conversation.php:1105
+msgid "web link"
+msgstr "Web-Link"
-#: ../../mod/settings.php:323
-msgid "Password update failed. Please try again."
-msgstr "Aktualisierung des Passworts gescheitert, bitte versuche es noch einmal."
+#: ../../include/conversation.php:1106
+msgid "Insert video link"
+msgstr "Video-Link einfügen"
-#: ../../mod/settings.php:386
-msgid " Please use a shorter name."
-msgstr " Bitte verwende einen kürzeren Namen."
+#: ../../include/conversation.php:1107
+msgid "video link"
+msgstr "Video-Link"
-#: ../../mod/settings.php:388
-msgid " Name too short."
-msgstr " Name ist zu kurz."
+#: ../../include/conversation.php:1108
+msgid "Insert audio link"
+msgstr "Audio-Link einfügen"
-#: ../../mod/settings.php:394
-msgid " Not valid email."
-msgstr " Keine gültige E-Mail."
+#: ../../include/conversation.php:1109
+msgid "audio link"
+msgstr "Audio-Link"
-#: ../../mod/settings.php:396
-msgid " Cannot change to that email."
-msgstr "Ändern der E-Mail nicht möglich. "
+#: ../../include/conversation.php:1110 ../../mod/editlayout.php:108
+#: ../../mod/editpost.php:105 ../../mod/editwebpage.php:151
+#: ../../mod/editblock.php:122
+msgid "Set your location"
+msgstr "Standort"
-#: ../../mod/settings.php:450
-msgid "Private forum has no privacy permissions. Using default privacy group."
-msgstr "Für das private Forum sind keine Zugriffsrechte eingestellt. Die voreingestellte Gruppe für neue Kontakte wird benutzt."
+#: ../../include/conversation.php:1111
+msgid "set location"
+msgstr "Standort"
-#: ../../mod/settings.php:454
-msgid "Private forum has no privacy permissions and no default privacy group."
-msgstr "Für das private Forum sind keine Zugriffsrechte eingestellt, und es gibt keine voreingestellte Gruppe für neue Kontakte."
+#: ../../include/conversation.php:1112 ../../mod/editlayout.php:109
+#: ../../mod/editpost.php:106 ../../mod/editwebpage.php:152
+#: ../../mod/editblock.php:123
+msgid "Clear browser location"
+msgstr "Browser-Standort löschen"
-#: ../../mod/settings.php:484 ../../addon/facebook/facebook.php:492
-#: ../../addon/impressum/impressum.php:77
-#: ../../addon/openstreetmap/openstreetmap.php:80
-#: ../../addon/mathjax/mathjax.php:66 ../../addon/piwik/piwik.php:105
-#: ../../addon/twitter/twitter.php:376
-msgid "Settings updated."
-msgstr "Einstellungen aktualisiert."
+#: ../../include/conversation.php:1113
+msgid "clear location"
+msgstr "Standort löschen"
-#: ../../mod/settings.php:554 ../../mod/settings.php:580
-#: ../../mod/settings.php:616
-msgid "Add application"
-msgstr "Programm hinzufügen"
+#: ../../include/conversation.php:1115 ../../mod/editlayout.php:122
+#: ../../mod/editpost.php:119 ../../mod/editwebpage.php:169
+#: ../../mod/editblock.php:137
+msgid "Set title"
+msgstr "Titel"
-#: ../../mod/settings.php:558 ../../mod/settings.php:584
-#: ../../addon/statusnet/statusnet.php:555
-msgid "Consumer Key"
-msgstr "Consumer Key"
+#: ../../include/conversation.php:1118 ../../mod/editlayout.php:124
+#: ../../mod/editpost.php:121 ../../mod/editwebpage.php:171
+#: ../../mod/editblock.php:139
+msgid "Categories (comma-separated list)"
+msgstr "Kategorien (Kommagetrennte Liste)"
-#: ../../mod/settings.php:559 ../../mod/settings.php:585
-#: ../../addon/statusnet/statusnet.php:554
-msgid "Consumer Secret"
-msgstr "Consumer Secret"
+#: ../../include/conversation.php:1120 ../../mod/editlayout.php:111
+#: ../../mod/editpost.php:108 ../../mod/editwebpage.php:154
+#: ../../mod/editblock.php:125
+msgid "Permission settings"
+msgstr "Berechtigungs-Einstellungen"
-#: ../../mod/settings.php:560 ../../mod/settings.php:586
-msgid "Redirect"
-msgstr "Umleiten"
+#: ../../include/conversation.php:1121
+msgid "permissions"
+msgstr "Berechtigungen"
-#: ../../mod/settings.php:561 ../../mod/settings.php:587
-msgid "Icon url"
-msgstr "Icon URL"
+#: ../../include/conversation.php:1129 ../../mod/editlayout.php:119
+#: ../../mod/editpost.php:116 ../../mod/editwebpage.php:164
+#: ../../mod/editblock.php:134
+msgid "Public post"
+msgstr "Öffentlicher Beitrag"
-#: ../../mod/settings.php:572
-msgid "You can't edit this application."
-msgstr "Du kannst dieses Programm nicht bearbeiten."
+#: ../../include/conversation.php:1131 ../../mod/editlayout.php:125
+#: ../../mod/editpost.php:122 ../../mod/editwebpage.php:172
+#: ../../mod/editblock.php:140
+msgid "Example: bob@example.com, mary@example.com"
+msgstr "Beispiel: bob@example.com, mary@example.com"
+
+#: ../../include/conversation.php:1144 ../../mod/mail.php:226
+#: ../../mod/mail.php:339 ../../mod/editlayout.php:135
+#: ../../mod/editpost.php:133 ../../mod/editwebpage.php:182
+#: ../../mod/editblock.php:150
+msgid "Set expiration date"
+msgstr "Verfallsdatum"
+
+#: ../../include/conversation.php:1146 ../../include/ItemObject.php:549
+#: ../../mod/mail.php:228 ../../mod/mail.php:341 ../../mod/editpost.php:135
+msgid "Encrypt text"
+msgstr "Text verschlüsseln"
+
+#: ../../include/conversation.php:1148 ../../mod/editpost.php:136
+msgid "OK"
+msgstr "OK"
+
+#: ../../include/conversation.php:1149 ../../mod/tagrm.php:11
+#: ../../mod/tagrm.php:94 ../../mod/settings.php:508
+#: ../../mod/settings.php:534 ../../mod/editpost.php:137
+#: ../../mod/fbrowser.php:82 ../../mod/fbrowser.php:117
+msgid "Cancel"
+msgstr "Abbrechen"
-#: ../../mod/settings.php:615
-msgid "Connected Apps"
-msgstr "Verbundene Programme"
+#: ../../include/conversation.php:1376
+msgid "Commented Order"
+msgstr "Neueste Kommentare"
-#: ../../mod/settings.php:619
-msgid "Client key starts with"
-msgstr "Anwenderschlüssel beginnt mit"
+#: ../../include/conversation.php:1379
+msgid "Sort by Comment Date"
+msgstr "Nach Kommentardatum sortiert"
-#: ../../mod/settings.php:620
-msgid "No name"
-msgstr "Kein Name"
+#: ../../include/conversation.php:1382
+msgid "Posted Order"
+msgstr "Neueste Beiträge"
-#: ../../mod/settings.php:621
-msgid "Remove authorization"
-msgstr "Autorisierung entziehen"
+#: ../../include/conversation.php:1385
+msgid "Sort by Post Date"
+msgstr "Nach Beitragsdatum sortiert"
-#: ../../mod/settings.php:632
-msgid "No Plugin settings configured"
-msgstr "Keine Plugin-Einstellungen konfiguriert"
+#: ../../include/conversation.php:1389
+msgid "Personal"
+msgstr "Persönlich"
-#: ../../mod/settings.php:640 ../../addon/widgets/widgets.php:123
-msgid "Plugin Settings"
-msgstr "Plugin-Einstellungen"
+#: ../../include/conversation.php:1392
+msgid "Posts that mention or involve you"
+msgstr "Beiträge, in denen es um dich geht"
-#: ../../mod/settings.php:652 ../../mod/settings.php:653
-#, php-format
-msgid "Built-in support for %s connectivity is %s"
-msgstr "Eingebaute Unterstützung für Verbindungen zu %s ist %s"
+#: ../../include/conversation.php:1395 ../../mod/menu.php:57
+#: ../../mod/connections.php:209
+msgid "New"
+msgstr "Neu"
-#: ../../mod/settings.php:652 ../../mod/settings.php:653
-msgid "enabled"
-msgstr "eingeschaltet"
+#: ../../include/conversation.php:1398
+msgid "Activity Stream - by date"
+msgstr "Activity Stream - nach Datum sortiert"
-#: ../../mod/settings.php:652 ../../mod/settings.php:653
-msgid "disabled"
-msgstr "ausgeschaltet"
+#: ../../include/conversation.php:1405
+msgid "Starred"
+msgstr "Markiert"
-#: ../../mod/settings.php:653
-msgid "StatusNet"
-msgstr "StatusNet"
+#: ../../include/conversation.php:1408
+msgid "Favourite Posts"
+msgstr "Beiträge mit Sternchen"
-#: ../../mod/settings.php:683
-msgid "Connector Settings"
-msgstr "Verbindungs-Einstellungen"
+#: ../../include/conversation.php:1415
+msgid "Spam"
+msgstr "Spam"
-#: ../../mod/settings.php:688
-msgid "Email/Mailbox Setup"
-msgstr "E-Mail/Postfach-Einstellungen"
+#: ../../include/conversation.php:1418
+msgid "Posts flagged as SPAM"
+msgstr "Nachrichten die als SPAM markiert wurden"
-#: ../../mod/settings.php:689
-msgid ""
-"If you wish to communicate with email contacts using this service "
-"(optional), please specify how to connect to your mailbox."
-msgstr "Wenn du mit E-Mail-Kontakten über diesen Service kommunizieren möchtest (optional), gib bitte die Einstellungen für dein Postfach an."
+#: ../../include/conversation.php:1448
+msgid "Channel"
+msgstr "Kanal"
-#: ../../mod/settings.php:690
-msgid "Last successful email check:"
-msgstr "Letzter erfolgreicher Email Check"
+#: ../../include/conversation.php:1451
+msgid "Status Messages and Posts"
+msgstr "Statusnachrichten und Beiträge"
-#: ../../mod/settings.php:691
-msgid "Email access is disabled on this site."
-msgstr "Zugriff auf E-Mails für diese Seite deaktiviert."
+#: ../../include/conversation.php:1455
+msgid "About"
+msgstr "Ãœber"
-#: ../../mod/settings.php:692
-msgid "IMAP server name:"
-msgstr "IMAP-Server-Name:"
+#: ../../include/conversation.php:1458
+msgid "Profile Details"
+msgstr "Profil-Details"
-#: ../../mod/settings.php:693
-msgid "IMAP port:"
-msgstr "IMAP-Port:"
+#: ../../include/conversation.php:1465 ../../include/photos.php:297
+msgid "Photo Albums"
+msgstr "Fotoalben"
-#: ../../mod/settings.php:694
-msgid "Security:"
-msgstr "Sicherheit:"
+#: ../../include/conversation.php:1470 ../../mod/fbrowser.php:114
+msgid "Files"
+msgstr "Dateien"
-#: ../../mod/settings.php:694 ../../mod/settings.php:699
-msgid "None"
-msgstr "Keine"
+#: ../../include/conversation.php:1473
+msgid "Files and Storage"
+msgstr "Dateien und Speicher"
-#: ../../mod/settings.php:695
-msgid "Email login name:"
-msgstr "E-Mail-Login-Name:"
+#: ../../include/conversation.php:1485
+msgid "Events and Calendar"
+msgstr "Veranstaltungen und Kalender"
+
+#: ../../include/conversation.php:1490
+msgid "Webpages"
+msgstr "Webseiten"
+
+#: ../../include/conversation.php:1493
+msgid "Manage Webpages"
+msgstr "Webseiten verwalten"
+
+#: ../../include/notify.php:23
+msgid "created a new post"
+msgstr "Neuer Beitrag wurde erzeugt"
+
+#: ../../include/notify.php:24
+#, php-format
+msgid "commented on %s's post"
+msgstr "hat %s's Beitrag kommentiert"
+
+#: ../../include/photos.php:15 ../../include/attach.php:97
+#: ../../include/attach.php:128 ../../include/attach.php:184
+#: ../../include/attach.php:199 ../../include/attach.php:232
+#: ../../include/attach.php:246 ../../include/attach.php:267
+#: ../../include/attach.php:461 ../../include/attach.php:539
+#: ../../include/items.php:3445 ../../mod/common.php:35
+#: ../../mod/events.php:140 ../../mod/thing.php:241 ../../mod/thing.php:257
+#: ../../mod/thing.php:291 ../../mod/invite.php:13 ../../mod/invite.php:104
+#: ../../mod/connedit.php:179 ../../mod/webpages.php:40 ../../mod/api.php:26
+#: ../../mod/api.php:31 ../../mod/page.php:30 ../../mod/page.php:80
+#: ../../mod/setup.php:200 ../../mod/viewconnections.php:22
+#: ../../mod/viewconnections.php:27 ../../mod/delegate.php:6
+#: ../../mod/sources.php:62 ../../mod/mitem.php:73 ../../mod/group.php:9
+#: ../../mod/photos.php:68 ../../mod/photos.php:653 ../../mod/viewsrc.php:12
+#: ../../mod/menu.php:40 ../../mod/connections.php:167
+#: ../../mod/layouts.php:27 ../../mod/layouts.php:42 ../../mod/network.php:12
+#: ../../mod/profiles.php:152 ../../mod/profiles.php:465
+#: ../../mod/new_channel.php:66 ../../mod/new_channel.php:97
+#: ../../mod/achievements.php:27 ../../mod/filestorage.php:10
+#: ../../mod/filestorage.php:59 ../../mod/filestorage.php:76
+#: ../../mod/filestorage.php:99 ../../mod/manage.php:6
+#: ../../mod/settings.php:484 ../../mod/mail.php:108
+#: ../../mod/editlayout.php:48 ../../mod/profile_photo.php:187
+#: ../../mod/profile_photo.php:200 ../../mod/editpost.php:13
+#: ../../mod/notifications.php:66 ../../mod/blocks.php:29
+#: ../../mod/blocks.php:44 ../../mod/editwebpage.php:44
+#: ../../mod/editwebpage.php:83 ../../mod/poke.php:128
+#: ../../mod/channel.php:88 ../../mod/channel.php:225
+#: ../../mod/fsuggest.php:78 ../../mod/editblock.php:48
+#: ../../mod/suggest.php:26 ../../mod/message.php:16 ../../mod/register.php:68
+#: ../../mod/regmod.php:18 ../../mod/authtest.php:13 ../../mod/item.php:182
+#: ../../mod/item.php:190 ../../mod/mood.php:119 ../../index.php:176
+#: ../../index.php:344
+msgid "Permission denied."
+msgstr "Zugang verweigert"
-#: ../../mod/settings.php:696
-msgid "Email password:"
-msgstr "E-Mail-Passwort:"
+#: ../../include/photos.php:88
+#, php-format
+msgid "Image exceeds website size limit of %lu bytes"
+msgstr "Bild überschreitet das Limit der Webseite von %lu bytes"
-#: ../../mod/settings.php:697
-msgid "Reply-to address:"
-msgstr "Reply-to Adresse:"
+#: ../../include/photos.php:95
+msgid "Image file is empty."
+msgstr "Bilddatei ist leer."
-#: ../../mod/settings.php:698
-msgid "Send public posts to all email contacts:"
-msgstr "Sende öffentliche Beiträge an alle E-Mail-Kontakte:"
+#: ../../include/photos.php:122 ../../mod/profile_photo.php:147
+msgid "Unable to process image"
+msgstr "Kann Bild nicht verarbeiten"
-#: ../../mod/settings.php:699
-msgid "Action after import:"
-msgstr "Aktion nach Import:"
+#: ../../include/photos.php:184
+msgid "Photo storage failed."
+msgstr "Foto speichern schlug fehl"
-#: ../../mod/settings.php:699
-msgid "Mark as seen"
-msgstr "Als gelesen markieren"
+#: ../../include/photos.php:301 ../../mod/photos.php:821
+#: ../../mod/photos.php:1296
+msgid "Upload New Photos"
+msgstr "Lade neue Fotos hoch"
-#: ../../mod/settings.php:699
-msgid "Move to folder"
-msgstr "In einen Ordner verschieben"
+#: ../../include/profile_selectors.php:6
+msgid "Male"
+msgstr "Männlich"
-#: ../../mod/settings.php:700
-msgid "Move to folder:"
-msgstr "In diesen Ordner verschieben:"
+#: ../../include/profile_selectors.php:6
+msgid "Female"
+msgstr "Weiblich"
-#: ../../mod/settings.php:760
-msgid "Display Settings"
-msgstr "Anzeige-Einstellungen"
+#: ../../include/profile_selectors.php:6
+msgid "Currently Male"
+msgstr "Momentan männlich"
-#: ../../mod/settings.php:766
-msgid "Display Theme:"
-msgstr "Theme:"
+#: ../../include/profile_selectors.php:6
+msgid "Currently Female"
+msgstr "Momentan weiblich"
-#: ../../mod/settings.php:767
-msgid "Update browser every xx seconds"
-msgstr "Browser alle xx Sekunden aktualisieren"
+#: ../../include/profile_selectors.php:6
+msgid "Mostly Male"
+msgstr "Größtenteils männlich"
-#: ../../mod/settings.php:767
-msgid "Minimum of 10 seconds, no maximum"
-msgstr "Minimal 10 Sekunden, kein Maximum"
+#: ../../include/profile_selectors.php:6
+msgid "Mostly Female"
+msgstr "Größtenteils weiblich"
-#: ../../mod/settings.php:768
-msgid "Number of items to display on the network page:"
-msgstr "Zahl der Beiträge, die pro Netzwerkseite angezeigt werden sollen: "
+#: ../../include/profile_selectors.php:6
+msgid "Transgender"
+msgstr "Transsexuell"
-#: ../../mod/settings.php:768
-msgid "Maximum of 100 items"
-msgstr "Maximal 100 Beiträge"
+#: ../../include/profile_selectors.php:6
+msgid "Intersex"
+msgstr "Zwischengeschlechtlich"
-#: ../../mod/settings.php:769
-msgid "Don't show emoticons"
-msgstr "Keine Smilies anzeigen"
+#: ../../include/profile_selectors.php:6
+msgid "Transsexual"
+msgstr "Transsexuell"
-#: ../../mod/settings.php:840
-msgid "Normal Account Page"
-msgstr "Normales Konto"
+#: ../../include/profile_selectors.php:6
+msgid "Hermaphrodite"
+msgstr "Zwitter"
-#: ../../mod/settings.php:841
-msgid "This account is a normal personal profile"
-msgstr "Dieses Konto ist ein normales persönliches Profil"
+#: ../../include/profile_selectors.php:6
+msgid "Neuter"
+msgstr "Geschlechtslos"
-#: ../../mod/settings.php:844
-msgid "Soapbox Page"
-msgstr "Marktschreier-Konto"
+#: ../../include/profile_selectors.php:6
+msgid "Non-specific"
+msgstr "unklar"
-#: ../../mod/settings.php:845
-msgid "Automatically approve all connection/friend requests as read-only fans"
-msgstr "Kontaktanfragen werden automatisch als Nurlese-Fans akzeptiert"
+#: ../../include/profile_selectors.php:6
+msgid "Other"
+msgstr "Anders"
-#: ../../mod/settings.php:848
-msgid "Community Forum/Celebrity Account"
-msgstr "Forum/Promi-Konto"
+#: ../../include/profile_selectors.php:6
+msgid "Undecided"
+msgstr "Unentschieden"
-#: ../../mod/settings.php:849
-msgid ""
-"Automatically approve all connection/friend requests as read-write fans"
-msgstr "Kontaktanfragen werden automatisch als Lese-und-Schreib-Fans akzeptiert"
+#: ../../include/profile_selectors.php:23
+msgid "Males"
+msgstr "Männer"
-#: ../../mod/settings.php:852
-msgid "Automatic Friend Page"
-msgstr "Automatische Freunde Seite"
+#: ../../include/profile_selectors.php:23
+msgid "Females"
+msgstr "Frauen"
-#: ../../mod/settings.php:853
-msgid "Automatically approve all connection/friend requests as friends"
-msgstr "Kontaktanfragen werden automatisch als Freund akzeptiert"
+#: ../../include/profile_selectors.php:23
+msgid "Gay"
+msgstr "Schwul"
-#: ../../mod/settings.php:856
-msgid "Private Forum [Experimental]"
-msgstr "Privates Forum [Versuchsstadium]"
+#: ../../include/profile_selectors.php:23
+msgid "Lesbian"
+msgstr "Lesbisch"
-#: ../../mod/settings.php:857
-msgid "Private forum - approved members only"
-msgstr "Privates Forum, nur für Mitglieder"
+#: ../../include/profile_selectors.php:23
+msgid "No Preference"
+msgstr "Keine Bevorzugung"
-#: ../../mod/settings.php:869
-msgid "OpenID:"
-msgstr "OpenID:"
+#: ../../include/profile_selectors.php:23
+msgid "Bisexual"
+msgstr "Bisexuell"
-#: ../../mod/settings.php:869
-msgid "(Optional) Allow this OpenID to login to this account."
-msgstr "(Optional) Erlaube die Anmeldung für dieses Konto mit dieser OpenID."
+#: ../../include/profile_selectors.php:23
+msgid "Autosexual"
+msgstr "Autosexuell"
-#: ../../mod/settings.php:879
-msgid "Publish your default profile in your local site directory?"
-msgstr "Darf dein Standardprofil im Verzeichnis dieses Servers veröffentlicht werden?"
+#: ../../include/profile_selectors.php:23
+msgid "Abstinent"
+msgstr "Enthaltsam"
-#: ../../mod/settings.php:885
-msgid "Publish your default profile in the global social directory?"
-msgstr "Darf dein Standardprofil im weltweiten Verzeichnis veröffentlicht werden?"
+#: ../../include/profile_selectors.php:23
+msgid "Virgin"
+msgstr "Jungfräulich"
-#: ../../mod/settings.php:893
-msgid "Hide your contact/friend list from viewers of your default profile?"
-msgstr "Liste der Kontakte vor Betrachtern des Standardprofils verbergen?"
+#: ../../include/profile_selectors.php:23
+msgid "Deviant"
+msgstr "Abweichend"
-#: ../../mod/settings.php:897
-msgid "Hide your profile details from unknown viewers?"
-msgstr "Profil-Details vor unbekannten Betrachtern verbergen?"
+#: ../../include/profile_selectors.php:23
+msgid "Fetish"
+msgstr "Fetisch"
-#: ../../mod/settings.php:902
-msgid "Allow friends to post to your profile page?"
-msgstr "Dürfen deine Kontakte auf deine Pinnwand schreiben?"
+#: ../../include/profile_selectors.php:23
+msgid "Oodles"
+msgstr "Unmengen"
-#: ../../mod/settings.php:908
-msgid "Allow friends to tag your posts?"
-msgstr "Dürfen deine Kontakte deine Beiträge mit Schlagwörtern versehen?"
+#: ../../include/profile_selectors.php:23
+msgid "Nonsexual"
+msgstr "Sexlos"
-#: ../../mod/settings.php:914
-msgid "Allow us to suggest you as a potential friend to new members?"
-msgstr "Dürfen wir dich neuen Mitgliedern als potentiellen Kontakt vorschlagen?"
+#: ../../include/profile_selectors.php:42
+msgid "Single"
+msgstr "Single"
-#: ../../mod/settings.php:920
-msgid "Permit unknown people to send you private mail?"
-msgstr "Dürfen dir Unbekannte private Nachrichten schicken?"
+#: ../../include/profile_selectors.php:42
+msgid "Lonely"
+msgstr "Einsam"
-#: ../../mod/settings.php:931
-msgid "Profile is <strong>not published</strong>."
-msgstr "Profil ist <strong>nicht veröffentlicht</strong>."
+#: ../../include/profile_selectors.php:42
+msgid "Available"
+msgstr "Verfügbar"
-#: ../../mod/settings.php:937 ../../mod/profile_photo.php:213
-msgid "or"
-msgstr "oder"
+#: ../../include/profile_selectors.php:42
+msgid "Unavailable"
+msgstr "Nicht verfügbar"
-#: ../../mod/settings.php:942
-msgid "Your Identity Address is"
-msgstr "Die Adresse deines Profils lautet:"
+#: ../../include/profile_selectors.php:42
+msgid "Has crush"
+msgstr "Verguckt"
-#: ../../mod/settings.php:953
-msgid "Automatically expire posts after this many days:"
-msgstr "Beiträge verfallen automatisch nach dieser Anzahl von Tagen:"
+#: ../../include/profile_selectors.php:42
+msgid "Infatuated"
+msgstr "Verknallt"
-#: ../../mod/settings.php:953
-msgid "If empty, posts will not expire. Expired posts will be deleted"
-msgstr "Wenn leer verfallen Beiträge nie automatisch. Verfallene Beiträge werden gelöscht."
+#: ../../include/profile_selectors.php:42
+msgid "Dating"
+msgstr "Lerne gerade jemanden kennen"
-#: ../../mod/settings.php:954
-msgid "Advanced expiration settings"
-msgstr "Erweiterte Verfallseinstellungen"
+#: ../../include/profile_selectors.php:42
+msgid "Unfaithful"
+msgstr "Treulos"
-#: ../../mod/settings.php:955
-msgid "Advanced Expiration"
-msgstr "Erweitertes Verfallen"
+#: ../../include/profile_selectors.php:42
+msgid "Sex Addict"
+msgstr "Sexabhängig"
-#: ../../mod/settings.php:956
-msgid "Expire posts:"
-msgstr "Beiträge verfallen lassen:"
+#: ../../include/profile_selectors.php:42
+msgid "Friends/Benefits"
+msgstr "Freunde/Begünstigte"
-#: ../../mod/settings.php:957
-msgid "Expire personal notes:"
-msgstr "Persönliche Notizen verfallen lassen:"
+#: ../../include/profile_selectors.php:42
+msgid "Casual"
+msgstr "Lose"
-#: ../../mod/settings.php:958
-msgid "Expire starred posts:"
-msgstr "Markierte Beiträge verfallen lassen:"
+#: ../../include/profile_selectors.php:42
+msgid "Engaged"
+msgstr "Verlobt"
-#: ../../mod/settings.php:959
-msgid "Expire photos:"
-msgstr "Fotos verfallen lassen:"
+#: ../../include/profile_selectors.php:42
+msgid "Married"
+msgstr "Verheiratet"
-#: ../../mod/settings.php:960
-msgid "Only expire posts by others:"
-msgstr "Nur Beiträge anderer verfallen:"
+#: ../../include/profile_selectors.php:42
+msgid "Imaginarily married"
+msgstr "Gewissermaßen verheiratet"
-#: ../../mod/settings.php:967
-msgid "Account Settings"
-msgstr "Kontoeinstellungen"
+#: ../../include/profile_selectors.php:42
+msgid "Partners"
+msgstr "Partner"
-#: ../../mod/settings.php:975
-msgid "Password Settings"
-msgstr "Passwort-Einstellungen"
+#: ../../include/profile_selectors.php:42
+msgid "Cohabiting"
+msgstr "Lebensgemeinschaft"
-#: ../../mod/settings.php:976
-msgid "New Password:"
-msgstr "Neues Passwort:"
+#: ../../include/profile_selectors.php:42
+msgid "Common law"
+msgstr "Informelle Ehe"
-#: ../../mod/settings.php:977
-msgid "Confirm:"
-msgstr "Bestätigen:"
+#: ../../include/profile_selectors.php:42
+msgid "Happy"
+msgstr "Glücklich"
-#: ../../mod/settings.php:977
-msgid "Leave password fields blank unless changing"
-msgstr "Lass die Passwort-Felder leer, außer du willst das Passwort ändern"
+#: ../../include/profile_selectors.php:42
+msgid "Not looking"
+msgstr "Nicht Ausschau haltend"
-#: ../../mod/settings.php:981
-msgid "Basic Settings"
-msgstr "Grundeinstellungen"
+#: ../../include/profile_selectors.php:42
+msgid "Swinger"
+msgstr "Swinger"
-#: ../../mod/settings.php:982 ../../include/profile_advanced.php:15
-msgid "Full Name:"
-msgstr "Kompletter Name:"
+#: ../../include/profile_selectors.php:42
+msgid "Betrayed"
+msgstr "Betrogen"
-#: ../../mod/settings.php:983
-msgid "Email Address:"
-msgstr "E-Mail-Adresse:"
+#: ../../include/profile_selectors.php:42
+msgid "Separated"
+msgstr "Getrennt"
-#: ../../mod/settings.php:984
-msgid "Your Timezone:"
-msgstr "Deine Zeitzone:"
+#: ../../include/profile_selectors.php:42
+msgid "Unstable"
+msgstr "Labil"
-#: ../../mod/settings.php:985
-msgid "Default Post Location:"
-msgstr "Standardstandort:"
+#: ../../include/profile_selectors.php:42
+msgid "Divorced"
+msgstr "Geschieden"
-#: ../../mod/settings.php:986
-msgid "Use Browser Location:"
-msgstr "Standort des Browsers verwenden:"
+#: ../../include/profile_selectors.php:42
+msgid "Imaginarily divorced"
+msgstr "Gewissermaßen geschieden"
-#: ../../mod/settings.php:989
-msgid "Security and Privacy Settings"
-msgstr "Sicherheits- und Privatsphäre-Einstellungen"
+#: ../../include/profile_selectors.php:42
+msgid "Widowed"
+msgstr "Verwitwet"
-#: ../../mod/settings.php:991
-msgid "Maximum Friend Requests/Day:"
-msgstr "Maximale Anzahl von Freundschaftsanfragen/Tag:"
+#: ../../include/profile_selectors.php:42
+msgid "Uncertain"
+msgstr "Ungewiss"
-#: ../../mod/settings.php:991 ../../mod/settings.php:1010
-msgid "(to prevent spam abuse)"
-msgstr "(um SPAM zu vermeiden)"
+#: ../../include/profile_selectors.php:42
+msgid "It's complicated"
+msgstr "Es ist kompliziert"
-#: ../../mod/settings.php:992
-msgid "Default Post Permissions"
-msgstr "Standard-Zugriffsrechte für Beiträge"
+#: ../../include/profile_selectors.php:42
+msgid "Don't care"
+msgstr "Interessiert mich nicht"
-#: ../../mod/settings.php:993
-msgid "(click to open/close)"
-msgstr "(klicke zum öffnen/schließen)"
+#: ../../include/profile_selectors.php:42
+msgid "Ask me"
+msgstr "Frag mich mal"
-#: ../../mod/settings.php:1010
-msgid "Maximum private messages per day from unknown people:"
-msgstr "Maximale Anzahl privater Nachrichten von Unbekannten pro Tag:"
+#: ../../include/attach.php:179 ../../include/attach.php:227
+msgid "Item was not found."
+msgstr "Beitrag wurde nicht gefunden."
-#: ../../mod/settings.php:1013
-msgid "Notification Settings"
-msgstr "Benachrichtigungseinstellungen"
+#: ../../include/attach.php:280
+msgid "No source file."
+msgstr "Keine Quelldatei."
-#: ../../mod/settings.php:1014
-msgid "By default post a status message when:"
-msgstr "Standardmäßig eine Statusnachricht posten, wenn:"
+#: ../../include/attach.php:297
+msgid "Cannot locate file to replace"
+msgstr "Kann Datei zum Ersetzen nicht finden"
-#: ../../mod/settings.php:1015
-msgid "accepting a friend request"
-msgstr "– du eine Kontaktanfrage akzeptierst"
+#: ../../include/attach.php:315
+msgid "Cannot locate file to revise/update"
+msgstr "Kann Datei zum Prüfen/Aktualisieren nicht finden"
-#: ../../mod/settings.php:1016
-msgid "joining a forum/community"
-msgstr "– du einem Forum/einer Gemeinschaftsseite beitrittst"
+#: ../../include/attach.php:326
+#, php-format
+msgid "File exceeds size limit of %d"
+msgstr "Datei überschreitet das Größen-Limit von %d"
-#: ../../mod/settings.php:1017
-msgid "making an <em>interesting</em> profile change"
-msgstr "– du eine <em>interessante</em> Änderung an deinem Profil durchführst"
+#: ../../include/attach.php:337
+#, php-format
+msgid "You have reached your limit of %1$.0f Mbytes attachment storage."
+msgstr "Die Größe deiner Datei-Anhänge haben das Maximum von %1$.0f MByte erreicht."
-#: ../../mod/settings.php:1018
-msgid "Send a notification email when:"
-msgstr "Benachrichtigungs-E-Mail senden wenn:"
+#: ../../include/attach.php:421
+msgid "File upload failed. Possible system limit or action terminated."
+msgstr "Datei-Upload fehlgeschlagen. Mögliche Systembegrenzung oder abgebrochener Prozess."
-#: ../../mod/settings.php:1019
-msgid "You receive an introduction"
-msgstr "– du eine Kontaktanfrage erhältst"
+#: ../../include/attach.php:433
+msgid "Stored file could not be verified. Upload failed."
+msgstr "Gespeichert Datei konnte nicht verifiziert werden. Upload abgebrochen."
-#: ../../mod/settings.php:1020
-msgid "Your introductions are confirmed"
-msgstr "– eine deiner Kontaktanfragen akzeptiert wurde"
+#: ../../include/attach.php:477 ../../include/attach.php:494
+msgid "Path not available."
+msgstr "Pfad nicht verfügbar."
-#: ../../mod/settings.php:1021
-msgid "Someone writes on your profile wall"
-msgstr "– jemand etwas auf deine Pinnwand schreibt"
+#: ../../include/attach.php:544
+msgid "Empty pathname"
+msgstr "leere Pfadangabe"
-#: ../../mod/settings.php:1022
-msgid "Someone writes a followup comment"
-msgstr "– jemand auch einen Kommentar verfasst"
+#: ../../include/attach.php:562
+msgid "duplicate filename or path"
+msgstr "doppelter Dateiname oder Pfad"
-#: ../../mod/settings.php:1023
-msgid "You receive a private message"
-msgstr "– du eine private Nachricht erhältst"
+#: ../../include/attach.php:587
+msgid "Path not found."
+msgstr "Pfad nicht gefunden."
-#: ../../mod/settings.php:1024
-msgid "You receive a friend suggestion"
-msgstr "– du eine Empfehlung erhältst"
+#: ../../include/attach.php:632
+msgid "mkdir failed."
+msgstr "mkdir fehlgeschlagen."
-#: ../../mod/settings.php:1025
-msgid "You are tagged in a post"
-msgstr "– du in einem Beitrag erwähnt wirst"
+#: ../../include/attach.php:636
+msgid "database storage failed."
+msgstr "Speichern in der Datenbank fehlgeschlagen."
-#: ../../mod/settings.php:1028
-msgid "Advanced Account/Page Type Settings"
-msgstr "Erweiterte Konto-/Seitentyp-Einstellungen"
+#: ../../include/taxonomy.php:210
+msgid "Tags"
+msgstr "Tags"
-#: ../../mod/settings.php:1029
-msgid "Change the behaviour of this account for special situations"
-msgstr "Verhalten dieses Kontos in bestimmten Situationen:"
+#: ../../include/taxonomy.php:227
+msgid "Keywords"
+msgstr "Schlüsselbegriffe"
-#: ../../mod/manage.php:90
-msgid "Manage Identities and/or Pages"
-msgstr "Verwalte Identitäten und/oder Seiten"
+#: ../../include/taxonomy.php:252
+msgid "have"
+msgstr "habe"
-#: ../../mod/manage.php:93
-msgid ""
-"Toggle between different identities or community/group pages which share "
-"your account details or which you have been granted \"manage\" permissions"
-msgstr "Zwischen verschiedenen Identitäten oder Foren wechseln, die deine Zugangsdaten (E-Mail und Passwort) teilen oder zu denen du „Verwalten“-Befugnisse bekommen hast."
+#: ../../include/taxonomy.php:252
+msgid "has"
+msgstr "hat"
-#: ../../mod/manage.php:95
-msgid "Select an identity to manage: "
-msgstr "Wähle eine Identität zum Verwalten: "
+#: ../../include/taxonomy.php:253
+msgid "want"
+msgstr "will"
-#: ../../mod/network.php:97
-msgid "Search Results For:"
-msgstr "Suchergebnisse für:"
+#: ../../include/taxonomy.php:253
+msgid "wants"
+msgstr "will"
-#: ../../mod/network.php:137 ../../mod/search.php:16
-msgid "Remove term"
-msgstr "Begriff entfernen"
+#: ../../include/taxonomy.php:254 ../../include/ItemObject.php:175
+msgid "like"
+msgstr "Gefällt-mir"
-#: ../../mod/network.php:146 ../../mod/search.php:13
-msgid "Saved Searches"
-msgstr "Gespeicherte Suchen"
+#: ../../include/taxonomy.php:254
+msgid "likes"
+msgstr "Gefällt-mir"
-#: ../../mod/network.php:147 ../../include/group.php:244
-msgid "add"
-msgstr "hinzufügen"
+#: ../../include/taxonomy.php:255 ../../include/ItemObject.php:176
+msgid "dislike"
+msgstr "Gefällt-mir-nicht"
-#: ../../mod/network.php:287
-msgid "Commented Order"
-msgstr "Neueste Kommentare"
+#: ../../include/taxonomy.php:255
+msgid "dislikes"
+msgstr "Gefällt-mir-nicht"
-#: ../../mod/network.php:290
-msgid "Sort by Comment Date"
-msgstr "Nach Kommentardatum sortieren"
+#: ../../include/account.php:23
+msgid "Not a valid email address"
+msgstr "Ungültige E-Mail-Adresse"
-#: ../../mod/network.php:293
-msgid "Posted Order"
-msgstr "Neueste Beiträge"
+#: ../../include/account.php:25
+msgid "Your email domain is not among those allowed on this site"
+msgstr "Deine E-Mail-Adresse ist nicht unter denen, die auf dieser Seite erlaubt sind"
-#: ../../mod/network.php:296
-msgid "Sort by Post Date"
-msgstr "Nach Beitragsdatum sortieren"
+#: ../../include/account.php:31
+msgid "Your email address is already registered at this site."
+msgstr "Deine E-Mail-Adresse ist auf dieser Seite bereits registriert."
-#: ../../mod/network.php:303
-msgid "Posts that mention or involve you"
-msgstr "Beiträge, in denen es um Dich geht"
+#: ../../include/account.php:64
+msgid "An invitation is required."
+msgstr "Eine Einladung wird benötigt"
-#: ../../mod/network.php:306
-msgid "New"
-msgstr "Neue"
+#: ../../include/account.php:68
+msgid "Invitation could not be verified."
+msgstr "Die Einladung konnte nicht bestätigt werden"
-#: ../../mod/network.php:309
-msgid "Activity Stream - by date"
-msgstr "Aktivitäten-Stream - nach Datum"
+#: ../../include/account.php:119
+msgid "Please enter the required information."
+msgstr "Bitte gib die benötigten Informationen ein."
-#: ../../mod/network.php:312
-msgid "Starred"
-msgstr "Markierte"
+#: ../../include/account.php:187
+msgid "Failed to store account information."
+msgstr "Speichern der Account-Informationen fehlgeschlagen"
-#: ../../mod/network.php:315
-msgid "Favourite Posts"
-msgstr "Favorisierte Beiträge"
+#: ../../include/account.php:273
+#, php-format
+msgid "Registration request at %s"
+msgstr "Registrierungsanfrage auf %s"
-#: ../../mod/network.php:318
-msgid "Shared Links"
-msgstr "Geteilte Links"
+#: ../../include/account.php:275 ../../include/account.php:302
+#: ../../include/account.php:359
+msgid "Administrator"
+msgstr "Administrator"
-#: ../../mod/network.php:321
-msgid "Interesting Links"
-msgstr "Interessante Links"
+#: ../../include/account.php:297
+msgid "your registration password"
+msgstr "dein Registrierungspasswort"
-#: ../../mod/network.php:388
+#: ../../include/account.php:300 ../../include/account.php:357
#, php-format
-msgid "Warning: This group contains %s member from an insecure network."
-msgid_plural ""
-"Warning: This group contains %s members from an insecure network."
-msgstr[0] "Warnung: Diese Gruppe beinhaltet %s Person aus einem unsicheren Netzwerk."
-msgstr[1] "Warnung: Diese Gruppe beinhaltet %s Personen aus unsicheren Netzwerken."
+msgid "Registration details for %s"
+msgstr "Registrierungsdetails für %s"
-#: ../../mod/network.php:391
-msgid "Private messages to this group are at risk of public disclosure."
-msgstr "Private Nachrichten an diese Gruppe könnten an die Öffentlichkeit geraten."
+#: ../../include/account.php:366
+msgid "Account approved."
+msgstr "Account bestätigt."
-#: ../../mod/network.php:436
-msgid "No such group"
-msgstr "Es gibt keine solche Gruppe"
+#: ../../include/account.php:400
+#, php-format
+msgid "Registration revoked for %s"
+msgstr "Registrierung für %s widerrufen"
-#: ../../mod/network.php:447
-msgid "Group is empty"
-msgstr "Gruppe ist leer"
+#: ../../include/dir_fns.php:15
+msgid "Sort Options"
+msgstr "Sortieroptionen"
-#: ../../mod/network.php:451
-msgid "Group: "
-msgstr "Gruppe: "
+#: ../../include/dir_fns.php:16
+msgid "Alphabetic"
+msgstr "alphabetisch"
-#: ../../mod/network.php:461
-msgid "Contact: "
-msgstr "Kontakt: "
+#: ../../include/dir_fns.php:17
+msgid "Reverse Alphabetic"
+msgstr "Entgegengesetzt alphabetisch"
-#: ../../mod/network.php:463
-msgid "Private messages to this person are at risk of public disclosure."
-msgstr "Private Nachrichten an diese Person könnten an die Öffentlichkeit gelangen."
+#: ../../include/dir_fns.php:18
+msgid "Newest to Oldest"
+msgstr "Neueste zuerst"
-#: ../../mod/network.php:468
-msgid "Invalid contact."
-msgstr "Ungültiger Kontakt."
+#: ../../include/dir_fns.php:30
+msgid "Enable Safe Search"
+msgstr "Sichere Suche einschalten"
-#: ../../mod/notes.php:44 ../../boot.php:1535
-msgid "Personal Notes"
-msgstr "Persönliche Notizen"
+#: ../../include/dir_fns.php:32
+msgid "Disable Safe Search"
+msgstr "Sichere Suche ausschalten"
-#: ../../mod/notes.php:63 ../../mod/filer.php:30
-#: ../../addon/facebook/facebook.php:760
-#: ../../addon/privacy_image_cache/privacy_image_cache.php:185
-#: ../../addon/dav/layout.fnk.php:384 ../../include/text.php:652
-msgid "Save"
-msgstr "Speichern"
+#: ../../include/dir_fns.php:34
+msgid "Safe Mode"
+msgstr "Sicherer Modus"
-#: ../../mod/wallmessage.php:42 ../../mod/wallmessage.php:112
-#, php-format
-msgid "Number of daily wall messages for %s exceeded. Message failed."
-msgstr "Maximale Anzahl der täglichen Pinnwand Nachrichten für %s ist überschritten. Zustellung fehlgeschlagen."
+#: ../../include/enotify.php:40
+msgid "Red Matrix Notification"
+msgstr "Red Matrix Benachrichtigung"
-#: ../../mod/wallmessage.php:56 ../../mod/message.php:66
-msgid "No recipient selected."
-msgstr "Kein Empfänger gewählt."
+#: ../../include/enotify.php:41
+msgid "redmatrix"
+msgstr "redmatrix"
-#: ../../mod/wallmessage.php:59
-msgid "Unable to check your home location."
-msgstr "Konnte deinen Heimatort nicht bestimmen."
+#: ../../include/enotify.php:43
+msgid "Thank You,"
+msgstr "Danke."
-#: ../../mod/wallmessage.php:62 ../../mod/message.php:73
-msgid "Message could not be sent."
-msgstr "Nachricht konnte nicht gesendet werden."
+#: ../../include/enotify.php:45
+#, php-format
+msgid "%s Administrator"
+msgstr "%s Administrator"
-#: ../../mod/wallmessage.php:65 ../../mod/message.php:76
-msgid "Message collection failure."
-msgstr "Konnte Nachrichten nicht abrufen."
+#: ../../include/enotify.php:80
+#, php-format
+msgid "%s <!item_type!>"
+msgstr "%s <!item_type!>"
-#: ../../mod/wallmessage.php:68 ../../mod/message.php:79
-msgid "Message sent."
-msgstr "Nachricht gesendet."
+#: ../../include/enotify.php:84
+#, php-format
+msgid "[Red:Notify] New mail received at %s"
+msgstr "[Red Notify] Neue Mail auf %s empfangen"
-#: ../../mod/wallmessage.php:86 ../../mod/wallmessage.php:95
-msgid "No recipient."
-msgstr "Kein Empfänger."
+#: ../../include/enotify.php:86
+#, php-format
+msgid "%1$s, %2$s sent you a new private message at %3$s."
+msgstr "%1$s, %2$s hat dir eine private Nachricht auf %3$s gesendet."
-#: ../../mod/wallmessage.php:124 ../../mod/message.php:172
-#: ../../include/conversation.php:943
-msgid "Please enter a link URL:"
-msgstr "Bitte gib die URL des Links ein:"
+#: ../../include/enotify.php:87
+#, php-format
+msgid "%1$s sent you %2$s."
+msgstr "%1$s hat dir %2$s geschickt."
-#: ../../mod/wallmessage.php:131 ../../mod/message.php:200
-msgid "Send Private Message"
-msgstr "Private Nachricht senden"
+#: ../../include/enotify.php:87
+msgid "a private message"
+msgstr "eine private Nachricht"
-#: ../../mod/wallmessage.php:132
+#: ../../include/enotify.php:88
#, php-format
-msgid ""
-"If you wish for %s to respond, please check that the privacy settings on "
-"your site allow private mail from unknown senders."
-msgstr "Wenn du möchtest, dass %s dir antworten kann, überprüfe deine Privatsphären-Einstellungen und erlaube private Nachrichten von unbekannten Absendern."
+msgid "Please visit %s to view and/or reply to your private messages."
+msgstr "Bitte besuche %s, um die private Nachricht anzusehen und/oder darauf zu antworten."
-#: ../../mod/wallmessage.php:133 ../../mod/message.php:201
-#: ../../mod/message.php:399
-msgid "To:"
-msgstr "An:"
+#: ../../include/enotify.php:142
+#, php-format
+msgid "%1$s, %2$s commented on [zrl=%3$s]a %4$s[/zrl]"
+msgstr "%1$s, %2$s hat [zrl=%3$s]a %4$s[/zrl] kommentiert"
-#: ../../mod/wallmessage.php:134 ../../mod/message.php:206
-#: ../../mod/message.php:401
-msgid "Subject:"
-msgstr "Betreff:"
+#: ../../include/enotify.php:150
+#, php-format
+msgid "%1$s, %2$s commented on [zrl=%3$s]%4$s's %5$s[/zrl]"
+msgstr "%1$s, %2$s hat [zrl=%3$s]%4$ss %5$s[/zrl] kommentiert"
-#: ../../mod/wallmessage.php:140 ../../mod/message.php:210
-#: ../../mod/message.php:404 ../../mod/invite.php:113
-msgid "Your message:"
-msgstr "Deine Nachricht:"
+#: ../../include/enotify.php:159
+#, php-format
+msgid "%1$s, %2$s commented on [zrl=%3$s]your %4$s[/zrl]"
+msgstr "%1$s, %2$s hat [zrl=%3$s]deinen %4$s[/zrl] kommentiert"
-#: ../../mod/newmember.php:6
-msgid "Welcome to Friendica"
-msgstr "Willkommen bei Friendica"
+#: ../../include/enotify.php:170
+#, php-format
+msgid "[Red:Notify] Comment to conversation #%1$d by %2$s"
+msgstr "[Red:Notify] Kommentar in Unterhaltung #%1$d von %2$s"
-#: ../../mod/newmember.php:8
-msgid "New Member Checklist"
-msgstr "Checkliste für neue Mitglieder"
+#: ../../include/enotify.php:171
+#, php-format
+msgid "%1$s, %2$s commented on an item/conversation you have been following."
+msgstr "%1$s, %2$s hat ein Thema kommentiert, dem du folgst."
-#: ../../mod/newmember.php:12
-msgid ""
-"We would like to offer some tips and links to help make your experience "
-"enjoyable. Click any item to visit the relevant page. A link to this page "
-"will be visible from your home page for two weeks after your initial "
-"registration and then will quietly disappear."
-msgstr "Wir möchten Dir einige Tipps und Links anbieten, die Dir helfen könnten, den Einstieg angenehmer zu machen. Klicke auf ein Element, um die entsprechende Seite zu besuchen. Ein Link zu dieser Seite hier bleibt für Dich an Deiner Pinnwand für zwei Wochen nach dem Registrierungsdatum sichtbar und wird dann verschwinden."
+#: ../../include/enotify.php:174 ../../include/enotify.php:189
+#: ../../include/enotify.php:215 ../../include/enotify.php:234
+#: ../../include/enotify.php:248
+#, php-format
+msgid "Please visit %s to view and/or reply to the conversation."
+msgstr "Bitte besuche %s, um die Konversation anzusehen und/oder zu kommentieren."
-#: ../../mod/newmember.php:16
-msgid ""
-"On your <em>Quick Start</em> page - find a brief introduction to your "
-"profile and network tabs, connect to Facebook, make some new connections, "
-"and find some groups to join."
-msgstr "Auf der <em>Quick Start</em> Seite findest du eine kurze Einleitung in die einzelnen Funktionen deines Profils und die Netzwerk-Reiter, wo du interessante Foren findest, wie du alte Freunde von Facebook wieder findest und neue Kontakte knüpfst."
+#: ../../include/enotify.php:180
+#, php-format
+msgid "[Red:Notify] %s posted to your profile wall"
+msgstr "[Red:Hinweis] %s schrieb auf Deine Pinnwand"
-#: ../../mod/newmember.php:18
-msgid ""
-"On your <em>Settings</em> page - change your initial password. Also make a "
-"note of your Identity Address. This looks just like an email address - and "
-"will be useful in making friends on the free social web."
-msgstr "Ändere bitte unter <em>Einstellungen</em> Dein Passwort. Außerdem merke Dir Deine Indentifikations-Adresse. Diese sieht aus wie eine E-Mail-Adresse und wird benötigt, um Freundschaften mit anderen im Friendica Netzwerk zu schliessen."
+#: ../../include/enotify.php:182
+#, php-format
+msgid "%1$s, %2$s posted to your profile wall at %3$s"
+msgstr "%1$s, %2$s hat auf deine Pinnwand auf %3$s geschrieben"
-#: ../../mod/newmember.php:20
-msgid ""
-"Review the other settings, particularly the privacy settings. An unpublished"
-" directory listing is like having an unlisted phone number. In general, you "
-"should probably publish your listing - unless all of your friends and "
-"potential friends know exactly how to find you."
-msgstr "Überprüfe die restlichen Einstellungen, insbesondere die Einstellungen zur Privatsphäre. Wenn du dein Profil nicht veröffentlichst, ist das als wenn Du Deine Telefonnummer nicht ins Telefonbuch einträgst. Im Allgemeinen solltest du es veröffentlichen - außer all deine Freunde und potentiellen Freunde wissen genau, wie sie dich finden können."
+#: ../../include/enotify.php:184
+#, php-format
+msgid "%1$s, %2$s posted to [zrl=%3$s]your wall[/zrl]"
+msgstr "%1$s, %2$s hat auf [zrl=%3$s]deine Pinnwand[/zrl] geschrieben"
-#: ../../mod/newmember.php:22
-msgid ""
-"Upload a profile photo if you have not done so already. Studies have shown "
-"that people with real photos of themselves are ten times more likely to make"
-" friends than people who do not."
-msgstr "Lade ein Profilbild hoch falls du es noch nicht getan hast. Studien haben gezeigt, dass es zehnmal wahrscheinlicher ist neue Freunde zu finden, wenn du ein Bild von dir selbst verwendest, als wenn du dies nicht tust."
+#: ../../include/enotify.php:208
+#, php-format
+msgid "[Red:Notify] %s tagged you"
+msgstr "[Red Notify] %s hat dich getaggt"
-#: ../../mod/newmember.php:25
-msgid ""
-"Authorise the Facebook Connector if you currently have a Facebook account "
-"and we will (optionally) import all your Facebook friends and conversations."
-msgstr "Richte die Verbindung zu Facebook ein, wenn du im Augenblick ein Facebook-Konto hast, und (optional) deine Facebook-Freunde und -Unterhaltungen importieren willst."
+#: ../../include/enotify.php:209
+#, php-format
+msgid "%1$s, %2$s tagged you at %3$s"
+msgstr "%1$s, %2$s hat dich auf %3$s getaggt"
-#: ../../mod/newmember.php:27
-msgid ""
-"<em>If</em> this is your own personal server, installing the Facebook addon "
-"may ease your transition to the free social web."
-msgstr "<em>Wenn</em> dies dein privater Server ist, könnte die Installation des Facebook Connectors deinen Umzug ins freie soziale Netz angenehmer gestalten."
+#: ../../include/enotify.php:210
+#, php-format
+msgid "%1$s, %2$s [zrl=%3$s]tagged you[/zrl]."
+msgstr "%1$s, %2$s [zrl=%3$s]hat dich erwähnt[/zrl]."
-#: ../../mod/newmember.php:32
-msgid ""
-"Enter your email access information on your Connector Settings page if you "
-"wish to import and interact with friends or mailing lists from your email "
-"INBOX"
-msgstr "Gib deine E-Mail-Zugangsinformationen auf der Connector-Einstellungsseite ein, falls du E-Mails aus deinem Posteingang importieren und mit Freunden und Mailinglisten interagieren willlst."
+#: ../../include/enotify.php:223
+#, php-format
+msgid "[Red:Notify] %1$s poked you"
+msgstr "[Red Notify] %1$s hat dich angestupst"
-#: ../../mod/newmember.php:34
-msgid ""
-"Edit your <strong>default</strong> profile to your liking. Review the "
-"settings for hiding your list of friends and hiding the profile from unknown"
-" visitors."
-msgstr "Editiere dein <strong>Standard</strong> Profil nach deinen Vorlieben. Überprüfe die Einstellungen zum Verbergen deiner Freundesliste vor unbekannten Betrachtern des Profils."
+#: ../../include/enotify.php:224
+#, php-format
+msgid "%1$s, %2$s poked you at %3$s"
+msgstr "%1$s, %2$s hat dich auf %3$s angestubst"
-#: ../../mod/newmember.php:36
-msgid ""
-"Set some public keywords for your default profile which describe your "
-"interests. We may be able to find other people with similar interests and "
-"suggest friendships."
-msgstr "Trage ein paar öffentliche Stichwörter in dein Standardprofil ein, die deine Interessen beschreiben. Eventuell sind wir in der Lage Leute zu finden, die deine Interessen teilen und können dir dann Kontakte vorschlagen."
+#: ../../include/enotify.php:225
+#, php-format
+msgid "%1$s, %2$s [zrl=%2$s]poked you[/zrl]."
+msgstr "%1$s, %2$s [zrl=%2$s]hat dich angestupst[/zrl]."
-#: ../../mod/newmember.php:38
-msgid ""
-"Your Contacts page is your gateway to managing friendships and connecting "
-"with friends on other networks. Typically you enter their address or site "
-"URL in the <em>Add New Contact</em> dialog."
-msgstr "Die Kontakte-Seite ist die Einstiegsseite, von der aus du Kontakte verwalten und dich mit Freunden in anderen Netzwerken verbinden kannst. Normalerweise gibst du dazu einfach ihre Adresse oder die URL der Seite im Kasten <em>Neuen Kontakt hinzufügen</em> ein."
+#: ../../include/enotify.php:241
+#, php-format
+msgid "[Red:Notify] %s tagged your post"
+msgstr "[Red:Hinweis] %s hat Dich getagged"
-#: ../../mod/newmember.php:40
-msgid ""
-"The Directory page lets you find other people in this network or other "
-"federated sites. Look for a <em>Connect</em> or <em>Follow</em> link on "
-"their profile page. Provide your own Identity Address if requested."
-msgstr "Über die Verzeichnisseite kannst du andere Personen auf diesem Server oder anderen verknüpften Seiten finden. Halte nach einem <em>Verbinden</em> oder <em>Folgen</em> Link auf deren Profilseiten Ausschau und gib deine eigene Profiladresse an, falls du danach gefragt wirst."
+#: ../../include/enotify.php:242
+#, php-format
+msgid "%1$s, %2$s tagged your post at %3$s"
+msgstr "%1$s, %2$s hat deinen Beitrag auf %3$s getaggt"
-#: ../../mod/newmember.php:42
-msgid ""
-"On the side panel of the Contacts page are several tools to find new "
-"friends. We can match people by interest, look up people by name or "
-"interest, and provide suggestions based on network relationships. On a brand"
-" new site, friend suggestions will usually begin to be populated within 24 "
-"hours."
-msgstr "Im seitlichen Bedienfeld der Kontakteseite gibt es diverse Werkzeuge, um neue Freunde zu finden. Wir können Menschen mit den gleichen Interessen finden, anhand von Namen oder Interessen suchen oder aber aufgrund vorhandener Kontakte neue Freunde vorschlagen.\nAuf einer brandneuen - soeben erstellten - Seite starten die Kontaktvorschläge innerhalb von 24 Stunden."
+#: ../../include/enotify.php:243
+#, php-format
+msgid "%1$s, %2$s tagged [zrl=%3$s]your post[/zrl]"
+msgstr "%1$s, %2$s hat [zrl=%3$s]deinen Beitrag[/zrl] getaggt"
-#: ../../mod/newmember.php:44
-msgid ""
-"Once you have made some friends, organize them into private conversation "
-"groups from the sidebar of your Contacts page and then you can interact with"
-" each group privately on your Network page."
-msgstr "Sobald du einige Freunde gefunden hast, organisiere sie in Gruppen zur privaten Kommunikation im Seitenmenü der Kontakte-Seite. Du kannst dann mit jeder dieser Gruppen von der Netzwerkseite aus privat interagieren."
+#: ../../include/enotify.php:255
+msgid "[Red:Notify] Introduction received"
+msgstr "[Red:Notify] Vorstellung erhalten"
-#: ../../mod/newmember.php:46
-msgid ""
-"Our <strong>help</strong> pages may be consulted for detail on other program"
-" features and resources."
-msgstr "Unsere <strong>Hilfe</strong> Seiten können herangezogen werden, um weitere Einzelheiten zu andern Programm Features zu erhalten."
+#: ../../include/enotify.php:256
+#, php-format
+msgid "%1$s, you've received an introduction from '%2$s' at %3$s"
+msgstr "%1$s, du hast eine Vorstellung von „%2$s“ auf %3$s erhalten"
-#: ../../mod/attach.php:8
-msgid "Item not available."
-msgstr "Beitrag nicht verfügbar."
+#: ../../include/enotify.php:257
+#, php-format
+msgid "%1$s, you've received [zrl=%2$s]an introduction[/zrl] from %3$s."
+msgstr "%1$s, du hast [zrl=%2$s]eine Vorstellung[/zrl] von %3$s erhalten."
-#: ../../mod/attach.php:20
-msgid "Item was not found."
-msgstr "Beitrag konnte nicht gefunden werden."
+#: ../../include/enotify.php:261 ../../include/enotify.php:280
+#, php-format
+msgid "You may visit their profile at %s"
+msgstr "Du kannst Dir das Profil unter %s ansehen"
-#: ../../mod/group.php:29
-msgid "Group created."
-msgstr "Gruppe erstellt."
+#: ../../include/enotify.php:263
+#, php-format
+msgid "Please visit %s to approve or reject the introduction."
+msgstr "Bitte besuche %s um sie anzunehmen oder abzulehnen."
-#: ../../mod/group.php:35
-msgid "Could not create group."
-msgstr "Konnte die Gruppe nicht erstellen."
+#: ../../include/enotify.php:270
+msgid "[Red:Notify] Friend suggestion received"
+msgstr "[Red:Hinweis] Freundschaftsvorschlag erhalten"
-#: ../../mod/group.php:47 ../../mod/group.php:137
-msgid "Group not found."
-msgstr "Gruppe nicht gefunden."
+#: ../../include/enotify.php:271
+#, php-format
+msgid "%1$s, you've received a friend suggestion from '%2$s' at %3$s"
+msgstr "%1$s, du hast einen Freundschaftsvorschlag von „%2$s“ auf %3$s erhalten"
-#: ../../mod/group.php:60
-msgid "Group name changed."
-msgstr "Gruppenname geändert."
+#: ../../include/enotify.php:272
+#, php-format
+msgid ""
+"%1$s, you've received [zrl=%2$s]a friend suggestion[/zrl] for %3$s from "
+"%4$s."
+msgstr "%1$s, du hast [zrl=%2$s]einen Freundschaftvorschlag[/zrl] für %3$s von %4$s erhalten."
-#: ../../mod/group.php:72 ../../mod/profperm.php:19 ../../index.php:298
-msgid "Permission denied"
-msgstr "Zugriff verweigert"
+#: ../../include/enotify.php:278
+msgid "Name:"
+msgstr "Name:"
-#: ../../mod/group.php:90
-msgid "Create a group of contacts/friends."
-msgstr "Eine Gruppe von Kontakten/Freunden anlegen."
+#: ../../include/enotify.php:279
+msgid "Photo:"
+msgstr "Foto:"
-#: ../../mod/group.php:91 ../../mod/group.php:177
-msgid "Group Name: "
-msgstr "Gruppenname:"
+#: ../../include/enotify.php:282
+#, php-format
+msgid "Please visit %s to approve or reject the suggestion."
+msgstr "Bitte besuche %s um den Vorschlag zu akzeptieren oder abzulehnen."
-#: ../../mod/group.php:110
-msgid "Group removed."
-msgstr "Gruppe entfernt."
+#: ../../include/auth.php:69
+msgid "Logged out."
+msgstr "Ausgeloggt."
-#: ../../mod/group.php:112
-msgid "Unable to remove group."
-msgstr "Konnte die Gruppe nicht entfernen."
+#: ../../include/auth.php:181
+msgid "Failed authentication"
+msgstr "Authentifizierung fehlgeschlagen"
-#: ../../mod/group.php:176
-msgid "Group Editor"
-msgstr "Gruppeneditor"
+#: ../../include/auth.php:190
+msgid "Login failed."
+msgstr "Login fehlgeschlagen."
-#: ../../mod/group.php:189
-msgid "Members"
-msgstr "Mitglieder"
+#: ../../include/contact_widgets.php:14
+#, php-format
+msgid "%d invitation available"
+msgid_plural "%d invitations available"
+msgstr[0] "%d Einladung verfügbar"
+msgstr[1] "%d Einladungen verfügbar"
-#: ../../mod/group.php:221 ../../mod/profperm.php:105
-msgid "Click on a contact to add or remove."
-msgstr "Klicke einen Kontakt an, um ihn hinzuzufügen oder zu entfernen"
+#: ../../include/contact_widgets.php:20
+msgid "Find Channels"
+msgstr "Finde Kanäle"
-#: ../../mod/profperm.php:25 ../../mod/profperm.php:55
-msgid "Invalid profile identifier."
-msgstr "Ungültiger Profil-Bezeichner"
+#: ../../include/contact_widgets.php:21
+msgid "Enter name or interest"
+msgstr "Name oder Interessen eingeben"
-#: ../../mod/profperm.php:101
-msgid "Profile Visibility Editor"
-msgstr "Editor für die Profil-Sichtbarkeit"
+#: ../../include/contact_widgets.php:22
+msgid "Connect/Follow"
+msgstr "Verbinden/Folgen"
-#: ../../mod/profperm.php:103 ../../view/theme/diabook/theme.php:128
-#: ../../include/profile_advanced.php:7 ../../include/profile_advanced.php:79
-#: ../../include/nav.php:50 ../../boot.php:1514
-msgid "Profile"
-msgstr "Profil"
+#: ../../include/contact_widgets.php:23
+msgid "Examples: Robert Morgenstein, Fishing"
+msgstr "Beispiele: Robert Morgenstein, Angeln"
-#: ../../mod/profperm.php:114
-msgid "Visible To"
-msgstr "Sichtbar für"
+#: ../../include/contact_widgets.php:24 ../../mod/directory.php:205
+#: ../../mod/directory.php:210 ../../mod/connections.php:355
+msgid "Find"
+msgstr "Finde"
-#: ../../mod/profperm.php:130
-msgid "All Contacts (with secure profile access)"
-msgstr "Alle Kontakte (mit gesichertem Profilzugriff)"
+#: ../../include/contact_widgets.php:25 ../../mod/suggest.php:59
+msgid "Channel Suggestions"
+msgstr "Kanal-Vorschläge"
-#: ../../mod/viewconnections.php:39
-msgid "No contacts."
-msgstr "Keine Kontakte."
+#: ../../include/contact_widgets.php:27
+msgid "Random Profile"
+msgstr "Zufallsprofil"
-#: ../../mod/viewconnections.php:76 ../../include/text.php:589
-msgid "View Contacts"
-msgstr "Kontakte anzeigen"
+#: ../../include/contact_widgets.php:28
+msgid "Invite Friends"
+msgstr "Lade Freunde ein"
-#: ../../mod/register.php:88 ../../mod/regmod.php:52
+#: ../../include/contact_widgets.php:120
#, php-format
-msgid "Registration details for %s"
-msgstr "Details der Registration von %s"
+msgid "%d connection in common"
+msgid_plural "%d connections in common"
+msgstr[0] "%d gemeinsame Verbindung"
+msgstr[1] "%d gemeinsame Verbindungen"
-#: ../../mod/register.php:96
-msgid ""
-"Registration successful. Please check your email for further instructions."
-msgstr "Registrierung erfolgreich. Eine E-Mail mit weiteren Anweisungen wurde an dich gesendet."
+#: ../../include/page_widgets.php:6
+msgid "New Page"
+msgstr "Neue Seite"
-#: ../../mod/register.php:100
-msgid "Failed to send email message. Here is the message that failed."
-msgstr "Konnte die E-Mail nicht versenden. Hier ist die Nachricht, die nicht gesendet werden konnte."
+#: ../../include/page_widgets.php:8 ../../include/ItemObject.php:96
+#: ../../mod/thing.php:229 ../../mod/webpages.php:118 ../../mod/menu.php:55
+#: ../../mod/layouts.php:102 ../../mod/filestorage.php:171
+#: ../../mod/settings.php:569 ../../mod/editlayout.php:101
+#: ../../mod/editpost.php:98 ../../mod/blocks.php:93
+#: ../../mod/editwebpage.php:144 ../../mod/editblock.php:115
+msgid "Edit"
+msgstr "Bearbeiten"
-#: ../../mod/register.php:105
-msgid "Your registration can not be processed."
-msgstr "Deine Registrierung konnte nicht verarbeitet werden."
+#: ../../include/plugin.php:475 ../../include/plugin.php:477
+msgid "Click here to upgrade."
+msgstr "Klicke hier, um das Upgrade durchzuführen."
-#: ../../mod/register.php:142
-#, php-format
-msgid "Registration request at %s"
-msgstr "Registrierungsanfrage auf %s"
+#: ../../include/plugin.php:483
+msgid "This action exceeds the limits set by your subscription plan."
+msgstr "Diese Aktion überschreitet die Grenzen Ihres Abonnements."
-#: ../../mod/register.php:151
-msgid "Your registration is pending approval by the site owner."
-msgstr "Deine Registrierung muss noch vom Betreiber der Seite freigegeben werden."
+#: ../../include/plugin.php:488
+msgid "This action is not available under your subscription plan."
+msgstr "Diese Aktion ist in Ihrem Abonnement nicht verfügbar."
-#: ../../mod/register.php:189
-msgid ""
-"This site has exceeded the number of allowed daily account registrations. "
-"Please try again tomorrow."
-msgstr "Die maximale Anzahl täglicher Registrierungen auf dieser Seite wurde überschritten. Bitte versuche es morgen noch einmal."
+#: ../../include/follow.php:21
+msgid "Channel is blocked on this site."
+msgstr "Der Kanal ist auf dieser Seite blockiert "
-#: ../../mod/register.php:215
-msgid ""
-"You may (optionally) fill in this form via OpenID by supplying your OpenID "
-"and clicking 'Register'."
-msgstr "Du kannst dieses Formular auch (optional) mit deiner OpenID ausfüllen, indem du deine OpenID angibst und 'Registrieren' klickst."
+#: ../../include/follow.php:26
+msgid "Channel location missing."
+msgstr "Adresse des Kanals fehlt."
-#: ../../mod/register.php:216
-msgid ""
-"If you are not familiar with OpenID, please leave that field blank and fill "
-"in the rest of the items."
-msgstr "Wenn du nicht mit OpenID vertraut bist, lass dieses Feld bitte leer und fülle die restlichen Felder aus."
+#: ../../include/follow.php:43
+msgid "Channel discovery failed. Website may be down or misconfigured."
+msgstr "Auffinden des Kanals schlug fehl. Die Webseite könnte falsch konfiguriert oder abgeschaltet sein."
-#: ../../mod/register.php:217
-msgid "Your OpenID (optional): "
-msgstr "Deine OpenID (optional): "
+#: ../../include/follow.php:51
+msgid "Response from remote channel was not understood."
+msgstr "Antwort des entfernten Kanals war unverständlich."
-#: ../../mod/register.php:231
-msgid "Include your profile in member directory?"
-msgstr "Soll dein Profil im Nutzerverzeichnis angezeigt werden?"
+#: ../../include/follow.php:58
+msgid "Response from remote channel was incomplete."
+msgstr "Antwort des entfernten Kanals war unvollständig."
-#: ../../mod/register.php:251
-msgid "Membership on this site is by invitation only."
-msgstr "Mitgliedschaft auf dieser Seite ist nur nach vorheriger Einladung möglich."
+#: ../../include/follow.php:129
+msgid "local account not found."
+msgstr "Lokales Konto nicht gefunden."
-#: ../../mod/register.php:252
-msgid "Your invitation ID: "
-msgstr "ID deiner Einladung: "
+#: ../../include/follow.php:138
+msgid "Cannot connect to yourself."
+msgstr "Du kannst dich nicht mit dir selbst verbinden."
-#: ../../mod/register.php:255 ../../mod/admin.php:421
-msgid "Registration"
-msgstr "Registrierung"
+#: ../../include/permissions.php:13
+msgid "Can view my \"public\" stream and posts"
+msgstr "Kann meinen öffentlichen Stream und Beiträge sehen"
-#: ../../mod/register.php:263
-msgid "Your Full Name (e.g. Joe Smith): "
-msgstr "Vollständiger Name (z.B. Max Mustermann): "
+#: ../../include/permissions.php:14
+msgid "Can view my \"public\" channel profile"
+msgstr "Kann meinen öffentliches Kanal-Profil sehen"
-#: ../../mod/register.php:264
-msgid "Your Email Address: "
-msgstr "Deine E-Mail-Adresse: "
+#: ../../include/permissions.php:15
+msgid "Can view my \"public\" photo albums"
+msgstr "Kann meine öffentlichen Fotoalben sehen"
-#: ../../mod/register.php:265
-msgid ""
-"Choose a profile nickname. This must begin with a text character. Your "
-"profile address on this site will then be "
-"'<strong>nickname@$sitename</strong>'."
-msgstr "Wähle einen Spitznamen für dein Profil. Dieser muss mit einem Buchstaben beginnen. Die Adresse deines Profils auf dieser Seite wird '<strong>spitzname@$sitename</strong>' sein."
+#: ../../include/permissions.php:16
+msgid "Can view my \"public\" address book"
+msgstr "Kann mein öffentliches Adressbuch sehen"
-#: ../../mod/register.php:266
-msgid "Choose a nickname: "
-msgstr "Spitznamen wählen: "
+#: ../../include/permissions.php:17
+msgid "Can view my \"public\" file storage"
+msgstr "Kann meinen öffentlichen Dateiordner sehen"
-#: ../../mod/register.php:269 ../../include/nav.php:81 ../../boot.php:801
-msgid "Register"
-msgstr "Registrieren"
+#: ../../include/permissions.php:18
+msgid "Can view my \"public\" pages"
+msgstr "Kann meine öffentlichen Seiten sehen"
-#: ../../mod/dirfind.php:26
-msgid "People Search"
-msgstr "Personen Suche"
-
-#: ../../mod/like.php:185 ../../mod/like.php:259 ../../mod/tagger.php:70
-#: ../../addon/facebook/facebook.php:1576
-#: ../../addon/communityhome/communityhome.php:158
-#: ../../addon/communityhome/communityhome.php:167
-#: ../../view/theme/diabook/theme.php:565
-#: ../../view/theme/diabook/theme.php:574 ../../include/diaspora.php:1709
-#: ../../include/conversation.php:48 ../../include/conversation.php:57
-#: ../../include/conversation.php:121 ../../include/conversation.php:130
-msgid "status"
-msgstr "Status"
+#: ../../include/permissions.php:21
+msgid "Can send me their channel stream and posts"
+msgstr "Können mir den Stream und die Beiträge aus ihrem Kanal schicken"
-#: ../../mod/like.php:202 ../../addon/facebook/facebook.php:1580
-#: ../../addon/communityhome/communityhome.php:172
-#: ../../view/theme/diabook/theme.php:579 ../../include/diaspora.php:1725
-#: ../../include/conversation.php:65
-#, php-format
-msgid "%1$s likes %2$s's %3$s"
-msgstr "%1$s mag %2$ss %3$s"
+#: ../../include/permissions.php:22
+msgid "Can post on my channel page (\"wall\")"
+msgstr "Kann auf meiner Kanal-Seite (\"wall\") Beiträge veröffentlichen"
-#: ../../mod/like.php:204 ../../include/conversation.php:68
-#, php-format
-msgid "%1$s doesn't like %2$s's %3$s"
-msgstr "%1$s mag %2$ss %3$s nicht"
+#: ../../include/permissions.php:23
+msgid "Can comment on my posts"
+msgstr "Kann meine Beiträge kommentieren"
-#: ../../mod/notice.php:15 ../../mod/viewsrc.php:15 ../../mod/admin.php:159
-#: ../../mod/admin.php:700 ../../mod/admin.php:899 ../../mod/display.php:37
-#: ../../mod/display.php:142 ../../include/items.php:3234
-msgid "Item not found."
-msgstr "Beitrag nicht gefunden."
+#: ../../include/permissions.php:24
+msgid "Can send me private mail messages"
+msgstr "Kann mir private Nachrichten schicken"
-#: ../../mod/viewsrc.php:7
-msgid "Access denied."
-msgstr "Zugriff verweigert."
+#: ../../include/permissions.php:25
+msgid "Can post photos to my photo albums"
+msgstr "Kann Fotos in meinen Fotoalben veröffentlichen"
-#: ../../mod/fbrowser.php:25 ../../view/theme/diabook/theme.php:130
-#: ../../include/nav.php:51 ../../boot.php:1520
-msgid "Photos"
-msgstr "Bilder"
+#: ../../include/permissions.php:26
+msgid "Can forward to all my channel contacts via post @mentions"
+msgstr "Kann an alle meine Kontakte via @-Erwähnung Nachrichten weiterleiten"
-#: ../../mod/fbrowser.php:96
-msgid "Files"
-msgstr "Dateien"
+#: ../../include/permissions.php:26
+msgid "Advanced - useful for creating group forum channels"
+msgstr "Fortgeschritten - sinnvoll, um Gruppen-Kanäle/-Foren zu erstellen"
-#: ../../mod/regmod.php:61
-msgid "Account approved."
-msgstr "Konto freigegeben."
+#: ../../include/permissions.php:27
+msgid "Can chat with me (when available)"
+msgstr "Kann mit mir chatten (wenn verfügbar)"
-#: ../../mod/regmod.php:98
-#, php-format
-msgid "Registration revoked for %s"
-msgstr "Registrierung für %s wurde zurückgezogen"
+#: ../../include/permissions.php:27
+msgid "Requires compatible chat plugin"
+msgstr "Benötigt ein kompatibles Chat-Plugin"
-#: ../../mod/regmod.php:110
-msgid "Please login."
-msgstr "Bitte melde dich an."
+#: ../../include/permissions.php:28
+msgid "Can write to my \"public\" file storage"
+msgstr "Kann in meinen öffentlichen Dateiordner schreiben"
-#: ../../mod/item.php:89
-msgid "Unable to locate original post."
-msgstr "Konnte den Originalbeitrag nicht finden."
+#: ../../include/permissions.php:29
+msgid "Can edit my \"public\" pages"
+msgstr "Kann meine öffentlichen Seiten bearbeiten"
-#: ../../mod/item.php:258
-msgid "Empty post discarded."
-msgstr "Leerer Beitrag wurde verworfen."
+#: ../../include/permissions.php:31
+msgid "Can source my \"public\" posts in derived channels"
+msgstr "Kann meine \"öffentlichen\" Beiträge als Quellen von Kanälen verwenden"
-#: ../../mod/item.php:379 ../../mod/wall_upload.php:102
-#: ../../mod/wall_upload.php:111 ../../mod/wall_upload.php:118
-#: ../../include/message.php:144
-msgid "Wall Photos"
-msgstr "Pinnwand-Bilder"
+#: ../../include/permissions.php:31
+msgid "Somewhat advanced - very useful in open communities"
+msgstr "Etwas Fortgeschritten - sehr nützlich in offenen Gemeinschaften."
-#: ../../mod/item.php:800
-msgid "System error. Post not saved."
-msgstr "Systemfehler. Beitrag konnte nicht gespeichert werden."
+#: ../../include/permissions.php:32
+msgid "Can administer my channel resources"
+msgstr "Kann meine Kanäle administrieren"
-#: ../../mod/item.php:825
-#, php-format
+#: ../../include/permissions.php:32
msgid ""
-"This message was sent to you by %s, a member of the Friendica social "
-"network."
-msgstr "Diese Nachricht wurde dir von %s geschickt, einem Mitglied des Sozialen Netzwerks Friendica."
+"Extremely advanced. Leave this alone unless you know what you are doing"
+msgstr "Sehr fortgeschritten. Bearbeite dies nur, wenn du genau weißt, was du machst"
-#: ../../mod/item.php:827
-#, php-format
-msgid "You may visit them online at %s"
-msgstr "Du kannst sie online unter %s besuchen"
+#: ../../include/comanche.php:35 ../../view/theme/redbasic/php/config.php:62
+#: ../../view/theme/apw/php/config.php:176
+msgid "Default"
+msgstr "Standard"
-#: ../../mod/item.php:828
-msgid ""
-"Please contact the sender by replying to this post if you do not wish to "
-"receive these messages."
-msgstr "Falls du diese Beiträge nicht erhalten möchtest, kontaktiere bitte den Autor, indem du auf diese Nachricht antwortest."
+#: ../../include/identity.php:29 ../../mod/item.php:1143
+msgid "Unable to obtain identity information from database"
+msgstr "Kann keine Identitäts-Informationen aus Datenbank beziehen"
-#: ../../mod/item.php:830
-#, php-format
-msgid "%s posted an update."
-msgstr "%s hat ein Update veröffentlicht."
+#: ../../include/identity.php:62
+msgid "Empty name"
+msgstr "Namensfeld leer"
-#: ../../mod/profile_photo.php:30
-msgid "Image uploaded but image cropping failed."
-msgstr "Bilder hochgeladen, aber das Zuschneiden ist fehlgeschlagen."
+#: ../../include/identity.php:64
+msgid "Name too long"
+msgstr "Name ist zu lang"
-#: ../../mod/profile_photo.php:63 ../../mod/profile_photo.php:70
-#: ../../mod/profile_photo.php:77 ../../mod/profile_photo.php:266
-#, php-format
-msgid "Image size reduction [%s] failed."
-msgstr "Verkleinern der Bildgröße von [%s] ist gescheitert."
+#: ../../include/identity.php:143
+msgid "No account identifier"
+msgstr "Keine Account-Kennung"
+
+#: ../../include/identity.php:153
+msgid "Nickname is required."
+msgstr "Spitzname ist erforderlich."
-#: ../../mod/profile_photo.php:91
+#: ../../include/identity.php:167
msgid ""
-"Shift-reload the page or clear browser cache if the new photo does not "
-"display immediately."
-msgstr "Drücke Umschalt+Neu Laden oder leere den Browser-Cache, falls das neue Foto nicht gleich angezeigt wird."
+"Nickname has unsupported characters or is already being used on this site."
+msgstr "Der Spitzname enthält nicht-unterstütze Zeichen oder wird bereits auf dieser Seite genutzt."
-#: ../../mod/profile_photo.php:101
-msgid "Unable to process image"
-msgstr "Bild konnte nicht verarbeitet werden"
+#: ../../include/identity.php:226
+msgid "Unable to retrieve created identity"
+msgstr "Kann die erstellte Identität nicht empfangen"
-#: ../../mod/profile_photo.php:117 ../../mod/wall_upload.php:77
-#, php-format
-msgid "Image exceeds size limit of %d"
-msgstr "Bildgröße überschreitet das Limit von %d"
+#: ../../include/identity.php:285
+msgid "Default Profile"
+msgstr "Standard-Profil"
-#: ../../mod/profile_photo.php:209
-msgid "Upload File:"
-msgstr "Datei hochladen:"
+#: ../../include/identity.php:477
+msgid "Requested channel is not available."
+msgstr "Angeforderte Kanal nicht verfügbar."
-#: ../../mod/profile_photo.php:210
-msgid "Upload Profile Photo"
-msgstr "Profilbild hochladen"
+#: ../../include/identity.php:489
+msgid " Sorry, you don't have the permission to view this profile. "
+msgstr "Entschuldigung, aber du besitzt nicht die nötigen Rechte um dieses Profil ansehen zu dürfen."
-#: ../../mod/profile_photo.php:211
-msgid "Upload"
-msgstr "Hochladen"
+#: ../../include/identity.php:524 ../../mod/webpages.php:8
+#: ../../mod/connect.php:13 ../../mod/layouts.php:8
+#: ../../mod/achievements.php:8 ../../mod/filestorage.php:40
+#: ../../mod/blocks.php:10 ../../mod/profile.php:16
+msgid "Requested profile is not available."
+msgstr "Erwünschte Profil ist nicht verfügbar."
-#: ../../mod/profile_photo.php:213
-msgid "skip this step"
-msgstr "diesen Schritt überspringen"
+#: ../../include/identity.php:639 ../../mod/profiles.php:615
+msgid "Change profile photo"
+msgstr "Ändere das Profilfoto"
-#: ../../mod/profile_photo.php:213
-msgid "select a photo from your photo albums"
-msgstr "wähle ein Foto von deinen Fotoalben"
+#: ../../include/identity.php:645
+msgid "Profiles"
+msgstr "Profile"
-#: ../../mod/profile_photo.php:226
-msgid "Crop Image"
-msgstr "Bild zurechtschneiden"
+#: ../../include/identity.php:645
+msgid "Manage/edit profiles"
+msgstr "Verwalte/Bearbeite Profile"
-#: ../../mod/profile_photo.php:227
-msgid "Please adjust the image cropping for optimum viewing."
-msgstr "Passe bitte den Bildausschnitt an, damit das Bild optimal dargestellt werden kann."
+#: ../../include/identity.php:646 ../../mod/profiles.php:616
+msgid "Create New Profile"
+msgstr "Neues Profil erstellen"
-#: ../../mod/profile_photo.php:229
-msgid "Done Editing"
-msgstr "Bearbeitung abgeschlossen"
+#: ../../include/identity.php:649
+msgid "Edit Profile"
+msgstr "Profile bearbeiten"
-#: ../../mod/profile_photo.php:257
-msgid "Image uploaded successfully."
-msgstr "Bild erfolgreich auf den Server geladen."
+#: ../../include/identity.php:660 ../../mod/profiles.php:627
+msgid "Profile Image"
+msgstr "Profilfoto:"
-#: ../../mod/hcard.php:10
-msgid "No profile"
-msgstr "Kein Profil"
+#: ../../include/identity.php:663 ../../mod/profiles.php:630
+msgid "visible to everybody"
+msgstr "sichtbar für jeden"
-#: ../../mod/removeme.php:45 ../../mod/removeme.php:48
-msgid "Remove My Account"
-msgstr "Konto löschen"
+#: ../../include/identity.php:664 ../../mod/profiles.php:631
+msgid "Edit visibility"
+msgstr "Sichtbarkeit bearbeiten"
-#: ../../mod/removeme.php:46
-msgid ""
-"This will completely remove your account. Once this has been done it is not "
-"recoverable."
-msgstr "Dein Konto wird endgültig gelöscht. Es gibt keine Möglichkeit, es wiederherzustellen."
+#: ../../include/identity.php:678 ../../include/identity.php:903
+#: ../../mod/directory.php:158
+msgid "Gender:"
+msgstr "Geschlecht:"
-#: ../../mod/removeme.php:47
-msgid "Please enter your password for verification:"
-msgstr "Bitte gib dein Passwort zur Verifikation ein:"
+#: ../../include/identity.php:679 ../../include/identity.php:923
+#: ../../mod/directory.php:160
+msgid "Status:"
+msgstr "Status:"
-#: ../../mod/message.php:9 ../../include/nav.php:131
-msgid "New Message"
-msgstr "Neue Nachricht"
+#: ../../include/identity.php:680 ../../include/identity.php:934
+#: ../../mod/directory.php:162
+msgid "Homepage:"
+msgstr "Homepage:"
-#: ../../mod/message.php:70
-msgid "Unable to locate contact information."
-msgstr "Konnte die Kontaktinformationen nicht finden."
+#: ../../include/identity.php:747 ../../include/identity.php:827
+#: ../../mod/ping.php:230
+msgid "g A l F d"
+msgstr "l, d. F G \\\\U\\\\h\\\\r"
-#: ../../mod/message.php:120
-msgid "Message deleted."
-msgstr "Nachricht gelöscht."
+#: ../../include/identity.php:748 ../../include/identity.php:828
+msgid "F d"
+msgstr "d. F"
-#: ../../mod/message.php:150
-msgid "Conversation removed."
-msgstr "Unterhaltung gelöscht."
+#: ../../include/identity.php:793 ../../include/identity.php:868
+#: ../../mod/ping.php:252
+msgid "[today]"
+msgstr "[Heute]"
-#: ../../mod/message.php:247
-msgid "No messages."
-msgstr "Keine Nachrichten."
+#: ../../include/identity.php:805
+msgid "Birthday Reminders"
+msgstr "Geburtstags Erinnerungen"
-#: ../../mod/message.php:254
-#, php-format
-msgid "Unknown sender - %s"
-msgstr "'Unbekannter Absender - %s"
+#: ../../include/identity.php:806
+msgid "Birthdays this week:"
+msgstr "Geburtstage in dieser Woche:"
-#: ../../mod/message.php:257
-#, php-format
-msgid "You and %s"
-msgstr "Du und %s"
+#: ../../include/identity.php:861
+msgid "[No description]"
+msgstr "[Keine Beschreibung]"
-#: ../../mod/message.php:260
-#, php-format
-msgid "%s and You"
-msgstr "%s und Du"
+#: ../../include/identity.php:879
+msgid "Event Reminders"
+msgstr "Veranstaltungs- Erinnerungen"
-#: ../../mod/message.php:270 ../../mod/message.php:392
-msgid "Delete conversation"
-msgstr "Unterhaltung löschen"
+#: ../../include/identity.php:880
+msgid "Events this week:"
+msgstr "Veranstaltungen in dieser Woche:"
-#: ../../mod/message.php:273
-msgid "D, d M Y - g:i A"
-msgstr "D, d. M Y - g:i A"
+#: ../../include/identity.php:893 ../../include/identity.php:975
+#: ../../mod/profperm.php:103
+msgid "Profile"
+msgstr "Profil"
-#: ../../mod/message.php:275
-#, php-format
-msgid "%d message"
-msgid_plural "%d messages"
-msgstr[0] "%d Nachricht"
-msgstr[1] "%d Nachrichten"
+#: ../../include/identity.php:901 ../../mod/settings.php:911
+msgid "Full Name:"
+msgstr "Voller Name:"
-#: ../../mod/message.php:310
-msgid "Message not available."
-msgstr "Nachricht nicht verfügbar."
+#: ../../include/identity.php:908
+msgid "j F, Y"
+msgstr "j F, Y"
-#: ../../mod/message.php:375
-msgid "Delete message"
-msgstr "Nachricht löschen"
+#: ../../include/identity.php:909
+msgid "j F"
+msgstr "j F"
-#: ../../mod/message.php:394
-msgid ""
-"No secure communications available. You <strong>may</strong> be able to "
-"respond from the sender's profile page."
-msgstr "Sichere Kommunikation ist nicht verfügbar. <strong>Eventuell</strong> kannst du auf der Profilseite des Absenders antworten."
+#: ../../include/identity.php:916
+msgid "Birthday:"
+msgstr "Geburtstag:"
-#: ../../mod/message.php:398
-msgid "Send Reply"
-msgstr "Antwort senden"
+#: ../../include/identity.php:920
+msgid "Age:"
+msgstr "Alter:"
-#: ../../mod/allfriends.php:34
+#: ../../include/identity.php:929
#, php-format
-msgid "Friends of %s"
-msgstr "Freunde von %s"
+msgid "for %1$d %2$s"
+msgstr "für %1$d %2$s"
-#: ../../mod/allfriends.php:40
-msgid "No friends to display."
-msgstr "Keine Freunde zum Anzeigen."
+#: ../../include/identity.php:932 ../../mod/profiles.php:538
+msgid "Sexual Preference:"
+msgstr "Sexuelle Orientierung:"
-#: ../../mod/admin.php:55
-msgid "Theme settings updated."
-msgstr "Themeneinstellungen aktualisiert."
+#: ../../include/identity.php:936 ../../mod/profiles.php:540
+msgid "Hometown:"
+msgstr "Heimatstadt:"
-#: ../../mod/admin.php:96 ../../mod/admin.php:419
-msgid "Site"
-msgstr "Seite"
+#: ../../include/identity.php:938
+msgid "Tags:"
+msgstr "Schlagworte:"
-#: ../../mod/admin.php:97 ../../mod/admin.php:655 ../../mod/admin.php:667
-msgid "Users"
-msgstr "Nutzer"
+#: ../../include/identity.php:940 ../../mod/profiles.php:541
+msgid "Political Views:"
+msgstr "Politische Ansichten:"
-#: ../../mod/admin.php:98 ../../mod/admin.php:749 ../../mod/admin.php:791
-msgid "Plugins"
-msgstr "Plugins"
+#: ../../include/identity.php:942
+msgid "Religion:"
+msgstr "Religion:"
-#: ../../mod/admin.php:99 ../../mod/admin.php:954 ../../mod/admin.php:990
-msgid "Themes"
-msgstr "Themen"
+#: ../../include/identity.php:944 ../../mod/directory.php:164
+msgid "About:"
+msgstr "Ãœber:"
-#: ../../mod/admin.php:100
-msgid "DB updates"
-msgstr "DB Updates"
+#: ../../include/identity.php:946
+msgid "Hobbies/Interests:"
+msgstr "Hobbys/Interessen:"
-#: ../../mod/admin.php:115 ../../mod/admin.php:122 ../../mod/admin.php:1077
-msgid "Logs"
-msgstr "Protokolle"
+#: ../../include/identity.php:948 ../../mod/profiles.php:544
+msgid "Likes:"
+msgstr "Gefällt-mir:"
-#: ../../mod/admin.php:120 ../../include/nav.php:146
-msgid "Admin"
-msgstr "Administration"
+#: ../../include/identity.php:950 ../../mod/profiles.php:545
+msgid "Dislikes:"
+msgstr "Gefällt-mir-nicht:"
-#: ../../mod/admin.php:121
-msgid "Plugin Features"
-msgstr "Plugin Features"
+#: ../../include/identity.php:953
+msgid "Contact information and Social Networks:"
+msgstr "Kontaktinformation und soziale Netzwerke:"
-#: ../../mod/admin.php:123
-msgid "User registrations waiting for confirmation"
-msgstr "Nutzeranmeldungen die auf Bestätigung warten"
+#: ../../include/identity.php:955
+msgid "Musical interests:"
+msgstr "Musikalische Interessen:"
-#: ../../mod/admin.php:183 ../../mod/admin.php:637
-msgid "Normal Account"
-msgstr "Normales Konto"
+#: ../../include/identity.php:957
+msgid "Books, literature:"
+msgstr "Bücher, Literatur:"
-#: ../../mod/admin.php:184 ../../mod/admin.php:638
-msgid "Soapbox Account"
-msgstr "Marktschreier-Konto"
+#: ../../include/identity.php:959
+msgid "Television:"
+msgstr "Fernsehen:"
-#: ../../mod/admin.php:185 ../../mod/admin.php:639
-msgid "Community/Celebrity Account"
-msgstr "Forum/Promi-Konto"
+#: ../../include/identity.php:961
+msgid "Film/dance/culture/entertainment:"
+msgstr "Film/Tanz/Kultur/Unterhaltung:"
-#: ../../mod/admin.php:186 ../../mod/admin.php:640
-msgid "Automatic Friend Account"
-msgstr "Automatisches Freundekonto"
+#: ../../include/identity.php:963
+msgid "Love/Romance:"
+msgstr "Liebe/Romantik:"
-#: ../../mod/admin.php:205
-msgid "Message queues"
-msgstr "Nachrichten-Warteschlangen"
+#: ../../include/identity.php:965
+msgid "Work/employment:"
+msgstr "Arbeit/Anstellung:"
-#: ../../mod/admin.php:210 ../../mod/admin.php:418 ../../mod/admin.php:654
-#: ../../mod/admin.php:748 ../../mod/admin.php:790 ../../mod/admin.php:953
-#: ../../mod/admin.php:989 ../../mod/admin.php:1076
-msgid "Administration"
-msgstr "Administration"
+#: ../../include/identity.php:967
+msgid "School/education:"
+msgstr "Schule/Ausbildung:"
-#: ../../mod/admin.php:211
-msgid "Summary"
-msgstr "Zusammenfassung"
+#: ../../include/items.php:201 ../../mod/like.php:55 ../../mod/group.php:68
+#: ../../mod/profperm.php:19 ../../index.php:343
+msgid "Permission denied"
+msgstr "Keine Berechtigung"
-#: ../../mod/admin.php:213
-msgid "Registered users"
-msgstr "Registrierte Nutzer"
+#: ../../include/items.php:3383 ../../mod/thing.php:74 ../../mod/admin.php:150
+#: ../../mod/admin.php:730 ../../mod/admin.php:933 ../../mod/viewsrc.php:18
+#: ../../mod/home.php:63 ../../mod/filestorage.php:18 ../../mod/display.php:32
+#: ../../mod/channel.php:182
+msgid "Item not found."
+msgstr "Element nicht gefunden."
-#: ../../mod/admin.php:215
-msgid "Pending registrations"
-msgstr "Anstehende Anmeldungen"
+#: ../../include/items.php:3734 ../../mod/group.php:38 ../../mod/group.php:140
+msgid "Collection not found."
+msgstr "Sammlung nicht gefunden"
-#: ../../mod/admin.php:216
-msgid "Version"
-msgstr "Version"
+#: ../../include/items.php:3749
+msgid "Collection is empty."
+msgstr "Sammlung ist leer."
-#: ../../mod/admin.php:218
-msgid "Active plugins"
-msgstr "Aktive Plugins"
+#: ../../include/items.php:3756
+#, php-format
+msgid "Collection: %s"
+msgstr "Sammlung: %s"
-#: ../../mod/admin.php:357
-msgid "Site settings updated."
-msgstr "Seiteneinstellungen aktualisiert."
+#: ../../include/items.php:3767
+#, php-format
+msgid "Connection: %s"
+msgstr "Verbindung: %s"
-#: ../../mod/admin.php:405
-msgid "Closed"
-msgstr "Geschlossen"
+#: ../../include/items.php:3770
+msgid "Connection not found."
+msgstr "Die Verbindung wurde nicht gefunden."
-#: ../../mod/admin.php:406
-msgid "Requires approval"
-msgstr "Bedarf der Zustimmung"
+#: ../../include/ItemObject.php:89 ../../mod/photos.php:972
+msgid "Private Message"
+msgstr "Private Nachricht"
-#: ../../mod/admin.php:407
-msgid "Open"
-msgstr "Offen"
+#: ../../include/ItemObject.php:118
+msgid "save to folder"
+msgstr "In Ordner speichern"
-#: ../../mod/admin.php:411
-msgid "No SSL policy, links will track page SSL state"
-msgstr "Keine SSL Richtlinie, Links werden das verwendete Protokoll beibehalten"
+#: ../../include/ItemObject.php:146
+msgid "add star"
+msgstr "markieren"
-#: ../../mod/admin.php:412
-msgid "Force all links to use SSL"
-msgstr "SSL für alle Links erzwingen"
+#: ../../include/ItemObject.php:147
+msgid "remove star"
+msgstr "Markierung entfernen"
-#: ../../mod/admin.php:413
-msgid "Self-signed certificate, use SSL for local links only (discouraged)"
-msgstr "Selbst-unterzeichnetes Zertifikat, SSL nur für lokale Links verwenden (nicht empfohlen)"
+#: ../../include/ItemObject.php:148
+msgid "toggle star status"
+msgstr "Stern-Status umschalten"
-#: ../../mod/admin.php:422
-msgid "File upload"
-msgstr "Datei hochladen"
+#: ../../include/ItemObject.php:152
+msgid "starred"
+msgstr "markiert"
-#: ../../mod/admin.php:423
-msgid "Policies"
-msgstr "Regeln"
+#: ../../include/ItemObject.php:169
+msgid "add tag"
+msgstr "Schlagwort hinzufügen"
-#: ../../mod/admin.php:424
-msgid "Advanced"
-msgstr "Erweitert"
+#: ../../include/ItemObject.php:175 ../../mod/photos.php:1078
+msgid "I like this (toggle)"
+msgstr "Ich mag das (Umschalter)"
-#: ../../mod/admin.php:428 ../../addon/statusnet/statusnet.php:552
-msgid "Site name"
-msgstr "Seitenname"
+#: ../../include/ItemObject.php:176 ../../mod/photos.php:1079
+msgid "I don't like this (toggle)"
+msgstr "Ich mag das nicht (Umschalter)"
-#: ../../mod/admin.php:429
-msgid "Banner/Logo"
-msgstr "Banner/Logo"
+#: ../../include/ItemObject.php:178
+msgid "Share this"
+msgstr "Teile dies"
-#: ../../mod/admin.php:430
-msgid "System language"
-msgstr "Systemsprache"
+#: ../../include/ItemObject.php:178
+msgid "share"
+msgstr "Teilen"
-#: ../../mod/admin.php:431
-msgid "System theme"
-msgstr "Systemweites Thema"
+#: ../../include/ItemObject.php:202 ../../include/ItemObject.php:203
+#, php-format
+msgid "View %s's profile - %s"
+msgstr "Schaue dir %s's Profil an - %s"
-#: ../../mod/admin.php:431
-msgid ""
-"Default system theme - may be over-ridden by user profiles - <a href='#' "
-"id='cnftheme'>change theme settings</a>"
-msgstr "Vorgabe für das System-Theme - kann von Benutzerprofilen überschrieben werden - <a href='#' id='cnftheme'>Theme-Einstellungen ändern</a>"
+#: ../../include/ItemObject.php:204
+msgid "to"
+msgstr "zu"
-#: ../../mod/admin.php:432
-msgid "SSL link policy"
-msgstr "Regeln für SSL Links"
+#: ../../include/ItemObject.php:205
+msgid "via"
+msgstr "via"
-#: ../../mod/admin.php:432
-msgid "Determines whether generated links should be forced to use SSL"
-msgstr "Bestimmt, ob generierte Links SSL verwenden müssen"
+#: ../../include/ItemObject.php:206
+msgid "Wall-to-Wall"
+msgstr "Wall-to-Wall"
-#: ../../mod/admin.php:433
-msgid "Maximum image size"
-msgstr "Maximale Größe von Bildern"
+#: ../../include/ItemObject.php:207
+msgid "via Wall-To-Wall:"
+msgstr "via Wall-To-Wall:"
-#: ../../mod/admin.php:433
-msgid ""
-"Maximum size in bytes of uploaded images. Default is 0, which means no "
-"limits."
-msgstr "Maximale Upload-Größe von Bildern in Bytes. Standard ist 0, d.h. ohne Limit."
+#: ../../include/ItemObject.php:221
+#, php-format
+msgid "Expires: %s"
+msgstr "Verfällt: %s"
-#: ../../mod/admin.php:435
-msgid "Register policy"
-msgstr "Registrierungsmethode"
+#: ../../include/ItemObject.php:269
+#, php-format
+msgid "%d comment"
+msgid_plural "%d comments"
+msgstr[0] "%d Kommentar"
+msgstr[1] "%d Kommentare"
-#: ../../mod/admin.php:436
-msgid "Register text"
-msgstr "Registrierungstext"
+#: ../../include/ItemObject.php:534 ../../mod/photos.php:1097
+#: ../../mod/photos.php:1184
+msgid "This is you"
+msgstr "Das bist du"
-#: ../../mod/admin.php:436
-msgid "Will be displayed prominently on the registration page."
-msgstr "Wird gut sichtbar auf der Registrierungsseite angezeigt."
+#: ../../include/ItemObject.php:537 ../../mod/events.php:470
+#: ../../mod/thing.php:276 ../../mod/thing.php:318 ../../mod/invite.php:156
+#: ../../mod/connedit.php:434 ../../mod/setup.php:304 ../../mod/setup.php:347
+#: ../../mod/connect.php:92 ../../mod/sources.php:97 ../../mod/sources.php:131
+#: ../../mod/admin.php:420 ../../mod/admin.php:686 ../../mod/admin.php:826
+#: ../../mod/admin.php:1025 ../../mod/admin.php:1112 ../../mod/group.php:81
+#: ../../mod/photos.php:693 ../../mod/photos.php:798 ../../mod/photos.php:1060
+#: ../../mod/photos.php:1100 ../../mod/photos.php:1187
+#: ../../mod/profiles.php:518 ../../mod/filestorage.php:132
+#: ../../mod/import.php:387 ../../mod/settings.php:507
+#: ../../mod/settings.php:619 ../../mod/settings.php:647
+#: ../../mod/settings.php:671 ../../mod/settings.php:742
+#: ../../mod/settings.php:903 ../../mod/mail.php:223 ../../mod/mail.php:335
+#: ../../mod/poke.php:166 ../../mod/fsuggest.php:108 ../../mod/mood.php:142
+#: ../../view/theme/redbasic/php/config.php:85
+#: ../../view/theme/apw/php/config.php:231
+#: ../../view/theme/blogga/view/theme/blog/config.php:67
+#: ../../view/theme/blogga/php/config.php:67
+msgid "Submit"
+msgstr "Bestätigen"
-#: ../../mod/admin.php:437
-msgid "Accounts abandoned after x days"
-msgstr "Nutzerkonten gelten nach x Tagen als unbenutzt"
+#: ../../include/ItemObject.php:538
+msgid "Bold"
+msgstr "Fett"
-#: ../../mod/admin.php:437
-msgid ""
-"Will not waste system resources polling external sites for abandonded "
-"accounts. Enter 0 for no time limit."
-msgstr "Verschwende keine System-Ressourcen auf das Pollen externer Seiten, wenn Konten nicht mehr benutzt werden. 0 eingeben für kein Limit."
+#: ../../include/ItemObject.php:539
+msgid "Italic"
+msgstr "Kursiv"
-#: ../../mod/admin.php:438
-msgid "Allowed friend domains"
-msgstr "Erlaubte Domains für Kontakte"
+#: ../../include/ItemObject.php:540
+msgid "Underline"
+msgstr "Unterstrichen"
-#: ../../mod/admin.php:438
-msgid ""
-"Comma separated list of domains which are allowed to establish friendships "
-"with this site. Wildcards are accepted. Empty to allow any domains"
-msgstr "Liste der Domains, die für Freundschaften erlaubt sind, durch Kommas getrennt. Platzhalter werden akzeptiert. Leer lassen, um alle Domains zu erlauben."
+#: ../../include/ItemObject.php:541
+msgid "Quote"
+msgstr "Zitat"
-#: ../../mod/admin.php:439
-msgid "Allowed email domains"
-msgstr "Erlaubte Domains für Emails"
+#: ../../include/ItemObject.php:542
+msgid "Code"
+msgstr "Code"
-#: ../../mod/admin.php:439
-msgid ""
-"Comma separated list of domains which are allowed in email addresses for "
-"registrations to this site. Wildcards are accepted. Empty to allow any "
-"domains"
-msgstr "Liste der Domains, die für E-Mail-Adressen bei der Registrierung erlaubt sind, durch Kommas getrennt. Platzhalter werden akzeptiert. Leer lassen, um alle Domains zu erlauben."
+#: ../../include/ItemObject.php:543
+msgid "Image"
+msgstr "Bild"
-#: ../../mod/admin.php:440
-msgid "Block public"
-msgstr "Öffentlichen Zugriff blockieren"
+#: ../../include/ItemObject.php:544
+msgid "Link"
+msgstr "Link"
-#: ../../mod/admin.php:440
-msgid ""
-"Check to block public access to all otherwise public personal pages on this "
-"site unless you are currently logged in."
-msgstr "Klicken, um öffentlichen Zugriff auf sonst öffentliche Profile zu blockieren, wenn man nicht eingeloggt ist."
+#: ../../include/ItemObject.php:545
+msgid "Video"
+msgstr "Video"
-#: ../../mod/admin.php:441
-msgid "Force publish"
-msgstr "Erzwinge Veröffentlichung"
+#: ../../include/security.php:49
+msgid "Welcome "
+msgstr "Willkommen"
-#: ../../mod/admin.php:441
-msgid ""
-"Check to force all profiles on this site to be listed in the site directory."
-msgstr "Klicken, um Anzeige aller Profile dieses Servers im Verzeichnis zu erzwingen."
+#: ../../include/security.php:50
+msgid "Please upload a profile photo."
+msgstr "Bitte lade ein Profilfoto hoch."
-#: ../../mod/admin.php:442
-msgid "Global directory update URL"
-msgstr "URL für Updates beim weltweiten Verzeichnis"
+#: ../../include/security.php:53
+msgid "Welcome back "
+msgstr "Willkommen zurück"
-#: ../../mod/admin.php:442
+#: ../../include/security.php:360
msgid ""
-"URL to update the global directory. If this is not set, the global directory"
-" is completely unavailable to the application."
-msgstr "URL für Update des globalen Verzeichnisses. Wenn nichts eingetragen ist, bleibt das globale Verzeichnis unerreichbar."
-
-#: ../../mod/admin.php:444
-msgid "Block multiple registrations"
-msgstr "Unterbinde Mehrfachregistrierung"
+"The form security token was not correct. This probably happened because the "
+"form has been opened for too long (>3 hours) before submitting it."
+msgstr "Das Security-Token des Formulars war nicht korrekt. Das ist wahrscheinlich passiert, weil das Formular zu lange (>3 Stunden) offen war, bevor es abgeschickt wurde."
-#: ../../mod/admin.php:444
-msgid "Disallow users to register additional accounts for use as pages."
-msgstr "Benutzern nicht erlauben, weitere Konten als zusätzliche Profile anzulegen."
+#: ../../include/zot.php:545
+msgid "Invalid data packet"
+msgstr "Ungültiges Datenpaket"
-#: ../../mod/admin.php:445
-msgid "OpenID support"
-msgstr "OpenID Unterstützung"
+#: ../../include/zot.php:555
+msgid "Unable to verify channel signature"
+msgstr "Konnte die Signatur des Kanals nicht verifizieren"
-#: ../../mod/admin.php:445
-msgid "OpenID support for registration and logins."
-msgstr "OpenID-Unterstützung für Registrierung und Login."
+#: ../../include/zot.php:732
+#, php-format
+msgid "Unable to verify site signature for %s"
+msgstr "Kann die Signatur der Seite von %s nicht verifizieren"
-#: ../../mod/admin.php:446
-msgid "Fullname check"
-msgstr "Namen auf Vollständigkeit überprüfen"
+#: ../../mod/common.php:10
+msgid "No channel."
+msgstr "Kein Channel."
-#: ../../mod/admin.php:446
-msgid ""
-"Force users to register with a space between firstname and lastname in Full "
-"name, as an antispam measure"
-msgstr "Leerzeichen zwischen Vor- und Nachname im vollständigen Namen erzwingen, um SPAM zu vermeiden."
+#: ../../mod/common.php:39
+msgid "Common connections"
+msgstr "Gemeinsame Verbindungen"
-#: ../../mod/admin.php:447
-msgid "UTF-8 Regular expressions"
-msgstr "UTF-8 Reguläre Ausdrücke"
+#: ../../mod/common.php:44
+msgid "No connections in common."
+msgstr "Keine gemeinsamen Verbindungen."
-#: ../../mod/admin.php:447
-msgid "Use PHP UTF8 regular expressions"
-msgstr "PHP UTF8 Ausdrücke verwenden"
+#: ../../mod/events.php:72
+msgid "Event title and start time are required."
+msgstr "Veranstaltungs- Titel und Startzeit sind erforderlich."
-#: ../../mod/admin.php:448
-msgid "Show Community Page"
-msgstr "Gemeinschaftsseite anzeigen"
+#: ../../mod/events.php:287
+msgid "l, F j"
+msgstr "l, F j"
-#: ../../mod/admin.php:448
-msgid ""
-"Display a Community page showing all recent public postings on this site."
-msgstr "Zeige die Gemeinschaftsseite mit allen öffentlichen Beiträgen auf diesem Server."
+#: ../../mod/events.php:309
+msgid "Edit event"
+msgstr "Veranstaltung bearbeiten"
-#: ../../mod/admin.php:449
-msgid "Enable OStatus support"
-msgstr "OStatus Unterstützung aktivieren"
+#: ../../mod/events.php:355
+msgid "Create New Event"
+msgstr "Neue Veranstaltung erstellen"
-#: ../../mod/admin.php:449
-msgid ""
-"Provide built-in OStatus (identi.ca, status.net, etc.) compatibility. All "
-"communications in OStatus are public, so privacy warnings will be "
-"occasionally displayed."
-msgstr "Biete die eingebaute OStatus (identi.ca, status.net, etc.) Unterstützung an. Jede Kommunikation in OStatus ist öffentlich, so Privatsphäre Warnungen werden bei Bedarf angezeigt."
+#: ../../mod/events.php:356
+msgid "Previous"
+msgstr "Voriges"
-#: ../../mod/admin.php:450
-msgid "Enable Diaspora support"
-msgstr "Diaspora-Support aktivieren"
+#: ../../mod/events.php:357 ../../mod/setup.php:258
+msgid "Next"
+msgstr "Nächste"
-#: ../../mod/admin.php:450
-msgid "Provide built-in Diaspora network compatibility."
-msgstr "Verwende die eingebaute Diaspora-Verknüpfung."
+#: ../../mod/events.php:429
+msgid "hour:minute"
+msgstr "Stunde:Minute"
-#: ../../mod/admin.php:451
-msgid "Only allow Friendica contacts"
-msgstr "Nur Friendica-Kontakte erlauben"
+#: ../../mod/events.php:448
+msgid "Event details"
+msgstr "Veranstaltungs-Details"
-#: ../../mod/admin.php:451
-msgid ""
-"All contacts must use Friendica protocols. All other built-in communication "
-"protocols disabled."
-msgstr "Alle Kontakte müssen das Friendica Protokoll nutzen. Alle anderen Kommunikationsprotokolle werden deaktiviert."
+#: ../../mod/events.php:449
+#, php-format
+msgid "Format is %s %s. Starting date and Title are required."
+msgstr "Format ist %s %s. Startzeit und Titel sind erforderlich."
-#: ../../mod/admin.php:452
-msgid "Verify SSL"
-msgstr "SSL Überprüfen"
+#: ../../mod/events.php:451
+msgid "Event Starts:"
+msgstr "Veranstaltung startet:"
-#: ../../mod/admin.php:452
-msgid ""
-"If you wish, you can turn on strict certificate checking. This will mean you"
-" cannot connect (at all) to self-signed SSL sites."
-msgstr "Wenn gewollt, kann man hier eine strenge Zertifikatkontrolle einstellen. Das bedeutet, dass man zu keinen Seiten mit selbst unterzeichnetem SSL eine Verbindung herstellen kann."
+#: ../../mod/events.php:451 ../../mod/events.php:465
+msgid "Required"
+msgstr "Benötigt"
-#: ../../mod/admin.php:453
-msgid "Proxy user"
-msgstr "Proxy Nutzer"
+#: ../../mod/events.php:454
+msgid "Finish date/time is not known or not relevant"
+msgstr "Ende Datum/Zeit sind unbekannt oder unwichtig"
-#: ../../mod/admin.php:454
-msgid "Proxy URL"
-msgstr "Proxy URL"
+#: ../../mod/events.php:456
+msgid "Event Finishes:"
+msgstr "Veranstaltung endet:"
-#: ../../mod/admin.php:455
-msgid "Network timeout"
-msgstr "Netzwerk Wartezeit"
+#: ../../mod/events.php:459
+msgid "Adjust for viewer timezone"
+msgstr "An die Zeitzone des Betrachters anpassen"
-#: ../../mod/admin.php:455
-msgid "Value is in seconds. Set to 0 for unlimited (not recommended)."
-msgstr "Der Wert ist in Sekunden. Setze 0 für unbegrenzt (nicht empfohlen)."
+#: ../../mod/events.php:461
+msgid "Description:"
+msgstr "Beschreibung:"
-#: ../../mod/admin.php:456
-msgid "Delivery interval"
-msgstr "Zustellungsintervall"
+#: ../../mod/events.php:465
+msgid "Title:"
+msgstr "Titel:"
-#: ../../mod/admin.php:456
-msgid ""
-"Delay background delivery processes by this many seconds to reduce system "
-"load. Recommend: 4-5 for shared hosts, 2-3 for virtual private servers. 0-1 "
-"for large dedicated servers."
-msgstr "Verzögere im Hintergrund laufende Auslieferungsprozesse um die angegebene Anzahl an Sekunden, um die Systemlast zu verringern. Empfehlungen: 4-5 für Shared-Hosts, 2-3 für VPS, 0-1 für große dedizierte Server."
+#: ../../mod/events.php:467
+msgid "Share this event"
+msgstr "Die Veranstaltung teilen"
-#: ../../mod/admin.php:457
-msgid "Poll interval"
-msgstr "Abfrageintervall"
+#: ../../mod/thing.php:94
+msgid "Thing updated"
+msgstr "Ding aktualisiert"
-#: ../../mod/admin.php:457
-msgid ""
-"Delay background polling processes by this many seconds to reduce system "
-"load. If 0, use delivery interval."
-msgstr "Verzögere Hintergrundprozesse, um diese Anzahl an Sekunden um die Systemlast zu reduzieren. Bei 0 Sekunden wird das Auslieferungsintervall verwendet."
+#: ../../mod/thing.php:153
+msgid "Object store: failed"
+msgstr "Speichern des Objekts fehlgeschlagen"
-#: ../../mod/admin.php:458
-msgid "Maximum Load Average"
-msgstr "Maximum Load Average"
+#: ../../mod/thing.php:157
+msgid "Thing added"
+msgstr "Ding hinzugefügt"
-#: ../../mod/admin.php:458
-msgid ""
-"Maximum system load before delivery and poll processes are deferred - "
-"default 50."
-msgstr "Maximale Systemlast bevor Verteil- und Empfangsprozesse verschoben werden - Standard 50"
+#: ../../mod/thing.php:175
+#, php-format
+msgid "OBJ: %1$s %2$s %3$s"
+msgstr "OBJ: %1$s %2$s %3$s"
-#: ../../mod/admin.php:472
-msgid "Update has been marked successful"
-msgstr "Update wurde als erfolgreich markiert"
+#: ../../mod/thing.php:228
+msgid "Show Thing"
+msgstr "Ding anzeigen"
-#: ../../mod/admin.php:482
-#, php-format
-msgid "Executing %s failed. Check system logs."
-msgstr "Ausführung von %s schlug fehl. Systemprotokolle prüfen."
+#: ../../mod/thing.php:235
+msgid "item not found."
+msgstr "Eintrag nicht gefunden"
-#: ../../mod/admin.php:485
-#, php-format
-msgid "Update %s was successfully applied."
-msgstr "Update %s war erfolgreich."
+#: ../../mod/thing.php:263
+msgid "Edit Thing"
+msgstr "Ding bearbeiten"
-#: ../../mod/admin.php:489
-#, php-format
-msgid "Update %s did not return a status. Unknown if it succeeded."
-msgstr "Update %s hat keinen Status zurückgegeben. Unbekannter Status."
+#: ../../mod/thing.php:265 ../../mod/thing.php:311
+msgid "Select a profile"
+msgstr "Wähle ein Profil"
-#: ../../mod/admin.php:492
-#, php-format
-msgid "Update function %s could not be found."
-msgstr "Updatefunktion %s konnte nicht gefunden werden."
+#: ../../mod/thing.php:267 ../../mod/thing.php:313
+msgid "Select a category of stuff. e.g. I ______ something"
+msgstr "Wähle eine Kategorie für das Zeugs, z.B. Ich ______ etwas"
-#: ../../mod/admin.php:507
-msgid "No failed updates."
-msgstr "Keine fehlgeschlagenen Updates."
+#: ../../mod/thing.php:270 ../../mod/thing.php:315
+msgid "Name of thing e.g. something"
+msgstr "Name des Dings, z.B. Etwas"
-#: ../../mod/admin.php:511
-msgid "Failed Updates"
-msgstr "Fehlgeschlagene Updates"
+#: ../../mod/thing.php:272 ../../mod/thing.php:316
+msgid "URL of thing (optional)"
+msgstr "URL des Dings (optional)"
-#: ../../mod/admin.php:512
-msgid ""
-"This does not include updates prior to 1139, which did not return a status."
-msgstr "Ohne Updates vor 1139, da diese keinen Status zurückgegeben haben."
+#: ../../mod/thing.php:274 ../../mod/thing.php:317
+msgid "URL for photo of thing (optional)"
+msgstr "URL eines Fotos von dem Ding (optional)"
-#: ../../mod/admin.php:513
-msgid "Mark success (if update was manually applied)"
-msgstr "Als erfolgreich markieren (falls das Update manuell installiert wurde)"
+#: ../../mod/thing.php:309
+msgid "Add Thing to your Profile"
+msgstr "Das Ding deinem Profil hinzufügen"
-#: ../../mod/admin.php:514
-msgid "Attempt to execute this update step automatically"
-msgstr "Versuchen, diesen Schritt automatisch auszuführen"
+#: ../../mod/invite.php:25
+msgid "Total invitation limit exceeded."
+msgstr "Limit der maximalen Einladungen überschritten."
-#: ../../mod/admin.php:539
+#: ../../mod/invite.php:49
#, php-format
-msgid "%s user blocked/unblocked"
-msgid_plural "%s users blocked/unblocked"
-msgstr[0] "%s Benutzer geblockt/freigegeben"
-msgstr[1] "%s Benutzer geblockt/freigegeben"
+msgid "%s : Not a valid email address."
+msgstr "%s : Keine gültige Email Adresse."
-#: ../../mod/admin.php:546
-#, php-format
-msgid "%s user deleted"
-msgid_plural "%s users deleted"
-msgstr[0] "%s Nutzer gelöscht"
-msgstr[1] "%s Nutzer gelöscht"
+#: ../../mod/invite.php:76
+msgid "Please join us on Red"
+msgstr "Bitte schließe Dich uns an und werde Teil der Red Matrix"
-#: ../../mod/admin.php:585
-#, php-format
-msgid "User '%s' deleted"
-msgstr "Nutzer '%s' gelöscht"
+#: ../../mod/invite.php:87
+msgid "Invitation limit exceeded. Please contact your site administrator."
+msgstr "Einladungslimit überschritten. Bitte kontaktiere den Administrator deiner Seite."
-#: ../../mod/admin.php:593
+#: ../../mod/invite.php:92
#, php-format
-msgid "User '%s' unblocked"
-msgstr "Nutzer '%s' entsperrt"
+msgid "%s : Message delivery failed."
+msgstr "%s : Nachricht konnte nicht zugestellt werden."
-#: ../../mod/admin.php:593
+#: ../../mod/invite.php:96
#, php-format
-msgid "User '%s' blocked"
-msgstr "Nutzer '%s' gesperrt"
-
-#: ../../mod/admin.php:657
-msgid "select all"
-msgstr "Alle auswählen"
+msgid "%d message sent."
+msgid_plural "%d messages sent."
+msgstr[0] "%d Nachricht gesendet."
+msgstr[1] "%d Nachrichten gesendet."
-#: ../../mod/admin.php:658
-msgid "User registrations waiting for confirm"
-msgstr "Neuanmeldungen, die auf deine Bestätigung warten"
+#: ../../mod/invite.php:115
+msgid "You have no more invitations available"
+msgstr "Du hast keine weiteren verfügbare Einladungen"
-#: ../../mod/admin.php:659
-msgid "Request date"
-msgstr "Anfragedatum"
+#: ../../mod/invite.php:141
+msgid "Send invitations"
+msgstr "Einladungen senden"
-#: ../../mod/admin.php:659 ../../mod/admin.php:668
-#: ../../include/contact_selectors.php:79
-msgid "Email"
-msgstr "Email"
+#: ../../mod/invite.php:142
+msgid "Enter email addresses, one per line:"
+msgstr "Email-Adressen eintragen, eine pro Zeile:"
-#: ../../mod/admin.php:660
-msgid "No registrations."
-msgstr "Keine Neuanmeldungen."
+#: ../../mod/invite.php:143 ../../mod/mail.php:216 ../../mod/mail.php:328
+msgid "Your message:"
+msgstr "Deine Nachricht:"
-#: ../../mod/admin.php:662
-msgid "Deny"
-msgstr "Verwehren"
+#: ../../mod/invite.php:144
+msgid ""
+"You are cordially invited to join me and some other close friends on the Red"
+" Matrix - a revolutionary new decentralised communication and information "
+"tool."
+msgstr "Du bist herzlich eingeladen, mir und einigen anderen guten Freunden in die Red-Matrix zu folgen – einem revolutionär neuen, dezentralisierten Kommunikations- und Informationsnetzwerk."
-#: ../../mod/admin.php:668
-msgid "Register date"
-msgstr "Anmeldedatum"
+#: ../../mod/invite.php:146
+msgid "You will need to supply this invitation code: $invite_code"
+msgstr "Du musst dann den folgenden Einladungs-Code angeben: $invite_code"
-#: ../../mod/admin.php:668
-msgid "Last login"
-msgstr "Letzte Anmeldung"
+#: ../../mod/invite.php:147
+msgid "Please visit my channel at"
+msgstr "Bitte besuche meinen Kanal auf"
-#: ../../mod/admin.php:668
-msgid "Last item"
-msgstr "Letzter Beitrag"
+#: ../../mod/invite.php:151
+msgid ""
+"Once you have registered (on ANY Red Matrix site - they are all inter-"
+"connected), please connect with my Red Matrix channel address:"
+msgstr "Wenn du dich registriert hast (egal auf welcher Seite in der Red Matrix, sie sind alle miteinander verbunden) verbinde dich bitte mit meinem Kanal in der Matrix. Adresse:"
-#: ../../mod/admin.php:668
-msgid "Account"
-msgstr "Nutzerkonto"
+#: ../../mod/invite.php:153
+msgid "Click the [Register] link on the following page to join."
+msgstr "Klicke den [Registrieren]-Link auf der nächsten Seite, um dich anzumelden."
-#: ../../mod/admin.php:670
+#: ../../mod/invite.php:155
msgid ""
-"Selected users will be deleted!\\n\\nEverything these users had posted on "
-"this site will be permanently deleted!\\n\\nAre you sure?"
-msgstr "Die markierten Nutzer werden gelöscht!\\n\\nAlle Beiträge, die diese Nutzer auf dieser Seite veröffentlicht haben, werden permanent gelöscht!\\n\\nBist du sicher?"
+"For more information about the Red Matrix Project and why it has the "
+"potential to change the internet as we know it, please visit "
+"http://getzot.com"
+msgstr "Für weitere Informationen über das Red Matrix Projekt und warum es das Potential hat das Internet wie wir es kennen grundlegend zu verändern schau dir bitte http://getzot.com an"
-#: ../../mod/admin.php:671
-msgid ""
-"The user {0} will be deleted!\\n\\nEverything this user has posted on this "
-"site will be permanently deleted!\\n\\nAre you sure?"
-msgstr "Der Nutzer {0} wird gelöscht!\\n\\nAlles was dieser Nutzer auf dieser Seite veröffentlicht hat, wird permanent gelöscht!\\n\\nBist du sicher?"
+#: ../../mod/connedit.php:49 ../../mod/connections.php:37
+msgid "Could not access contact record."
+msgstr "Konnte auf den Kontakteintrag nicht zugreifen."
-#: ../../mod/admin.php:712
-#, php-format
-msgid "Plugin %s disabled."
-msgstr "Plugin %s deaktiviert."
+#: ../../mod/connedit.php:63 ../../mod/connections.php:51
+msgid "Could not locate selected profile."
+msgstr "Konnte das gewählte Profil nicht finden."
-#: ../../mod/admin.php:716
-#, php-format
-msgid "Plugin %s enabled."
-msgstr "Plugin %s aktiviert."
+#: ../../mod/connedit.php:104 ../../mod/connections.php:92
+msgid "Connection updated."
+msgstr "Verbindung aktualisiert."
-#: ../../mod/admin.php:726 ../../mod/admin.php:924
-msgid "Disable"
-msgstr "Ausschalten"
+#: ../../mod/connedit.php:106 ../../mod/connections.php:94
+msgid "Failed to update connection record."
+msgstr "Konnte den Verbindungseintrag nicht aktualisieren."
-#: ../../mod/admin.php:728 ../../mod/admin.php:926
-msgid "Enable"
-msgstr "Einschalten"
+#: ../../mod/connedit.php:201
+msgid "Could not access address book record."
+msgstr "Konnte nicht auf den Eintrag im Adressbuch zugreifen."
-#: ../../mod/admin.php:750 ../../mod/admin.php:955
-msgid "Toggle"
-msgstr "Umschalten"
+#: ../../mod/connedit.php:215
+msgid "Refresh failed - channel is currently unavailable."
+msgstr "Aktualisierung fehlgeschlagen – der Kanal ist im Moment nicht erreichbar."
-#: ../../mod/admin.php:758 ../../mod/admin.php:965
-msgid "Author: "
-msgstr "Autor:"
+#: ../../mod/connedit.php:222
+msgid "Channel has been unblocked"
+msgstr "Kanal nicht mehr blockiert"
-#: ../../mod/admin.php:759 ../../mod/admin.php:966
-msgid "Maintainer: "
-msgstr "Betreuer:"
+#: ../../mod/connedit.php:223
+msgid "Channel has been blocked"
+msgstr "Kanal blockiert"
-#: ../../mod/admin.php:888
-msgid "No themes found."
-msgstr "Keine Themen gefunden."
+#: ../../mod/connedit.php:227 ../../mod/connedit.php:239
+#: ../../mod/connedit.php:251 ../../mod/connedit.php:263
+#: ../../mod/connedit.php:278
+msgid "Unable to set address book parameters."
+msgstr "Konnte die Adressbuch Parameter nicht setzen."
-#: ../../mod/admin.php:947
-msgid "Screenshot"
-msgstr "Bildschirmfoto"
+#: ../../mod/connedit.php:234
+msgid "Channel has been unignored"
+msgstr "Kanal wird nicht mehr ignoriert"
-#: ../../mod/admin.php:995
-msgid "[Experimental]"
-msgstr "[Experimentell]"
+#: ../../mod/connedit.php:235
+msgid "Channel has been ignored"
+msgstr "Kanal wird ignoriert"
-#: ../../mod/admin.php:996
-msgid "[Unsupported]"
-msgstr "[Nicht unterstützt]"
+#: ../../mod/connedit.php:246
+msgid "Channel has been unarchived"
+msgstr "Kanal wurde aus dem Archiv zurück geholt"
-#: ../../mod/admin.php:1023
-msgid "Log settings updated."
-msgstr "Protokolleinstellungen aktualisiert."
+#: ../../mod/connedit.php:247
+msgid "Channel has been archived"
+msgstr "Kanal wurde archiviert"
-#: ../../mod/admin.php:1079
-msgid "Clear"
-msgstr "löschen"
+#: ../../mod/connedit.php:258
+msgid "Channel has been unhidden"
+msgstr "Kanal wird nicht mehr versteckt"
-#: ../../mod/admin.php:1085
-msgid "Debugging"
-msgstr "Protokoll führen"
+#: ../../mod/connedit.php:259
+msgid "Channel has been hidden"
+msgstr "Kanal wurde versteckt"
-#: ../../mod/admin.php:1086
-msgid "Log file"
-msgstr "Protokolldatei"
+#: ../../mod/connedit.php:273
+msgid "Channel has been approved"
+msgstr "Kanal wurde zugelassen"
-#: ../../mod/admin.php:1086
-msgid ""
-"Must be writable by web server. Relative to your Friendica top-level "
-"directory."
-msgstr "Webserver muss Schreibrechte besitzen. Abhängig vom Friendica-Installationsverzeichnis."
+#: ../../mod/connedit.php:274
+msgid "Channel has been unapproved"
+msgstr "Zulassung des Kanals entfernt"
-#: ../../mod/admin.php:1087
-msgid "Log level"
-msgstr "Protokoll-Level"
+#: ../../mod/connedit.php:292
+msgid "Contact has been removed."
+msgstr "Kontakt wurde entfernt."
-#: ../../mod/admin.php:1137
-msgid "Close"
-msgstr "Schließen"
+#: ../../mod/connedit.php:312
+#, php-format
+msgid "View %s's profile"
+msgstr "%s's Profil ansehen"
-#: ../../mod/admin.php:1143
-msgid "FTP Host"
-msgstr "FTP Host"
+#: ../../mod/connedit.php:316
+msgid "Refresh Permissions"
+msgstr "Zugriffsrechte auffrischen"
-#: ../../mod/admin.php:1144
-msgid "FTP Path"
-msgstr "FTP Pfad"
+#: ../../mod/connedit.php:319
+msgid "Fetch updated permissions"
+msgstr "Aktualisierte Zugriffsrechte abfragen"
-#: ../../mod/admin.php:1145
-msgid "FTP User"
-msgstr "FTP Nutzername"
+#: ../../mod/connedit.php:323
+msgid "Recent Activity"
+msgstr "Kürzliche Aktivitäten"
-#: ../../mod/admin.php:1146
-msgid "FTP Password"
-msgstr "FTP Passwort"
+#: ../../mod/connedit.php:326
+msgid "View recent posts and comments"
+msgstr "Betrachte die neuesten Beiträge und Kommentare"
-#: ../../mod/profile.php:21 ../../boot.php:966
-msgid "Requested profile is not available."
-msgstr "Das angefragte Profil ist nicht vorhanden."
+#: ../../mod/connedit.php:330 ../../mod/connedit.php:472
+#: ../../mod/admin.php:695
+msgid "Unblock"
+msgstr "Freigeben"
-#: ../../mod/profile.php:141 ../../mod/display.php:75
-msgid "Access to this profile has been restricted."
-msgstr "Der Zugriff zu diesem Profil wurde eingeschränkt."
+#: ../../mod/connedit.php:330 ../../mod/connedit.php:472
+#: ../../mod/admin.php:694
+msgid "Block"
+msgstr "Blockieren"
-#: ../../mod/profile.php:166
-msgid "Tips for New Members"
-msgstr "Tipps für neue Nutzer"
+#: ../../mod/connedit.php:333
+msgid "Block or Unblock this connection"
+msgstr "Verbindung blockieren oder frei geben"
-#: ../../mod/ping.php:185
-msgid "{0} wants to be your friend"
-msgstr "{0} möchte mit dir in Kontakt treten"
+#: ../../mod/connedit.php:337 ../../mod/connedit.php:473
+msgid "Unignore"
+msgstr "Nicht ignorieren"
-#: ../../mod/ping.php:190
-msgid "{0} sent you a message"
-msgstr "{0} hat dir eine Nachricht geschickt"
+#: ../../mod/connedit.php:337 ../../mod/connedit.php:473
+#: ../../mod/notifications.php:51
+msgid "Ignore"
+msgstr "Ignorieren"
-#: ../../mod/ping.php:195
-msgid "{0} requested registration"
-msgstr "{0} möchte sich registrieren"
+#: ../../mod/connedit.php:340
+msgid "Ignore or Unignore this connection"
+msgstr "Verbindung ignorieren oder wieder beachten"
-#: ../../mod/ping.php:201
-#, php-format
-msgid "{0} commented %s's post"
-msgstr "{0} kommentierte einen Beitrag von %s"
+#: ../../mod/connedit.php:343
+msgid "Unarchive"
+msgstr "Aus Archiv zurückholen"
-#: ../../mod/ping.php:206
-#, php-format
-msgid "{0} liked %s's post"
-msgstr "{0} mag %ss Beitrag"
+#: ../../mod/connedit.php:343
+msgid "Archive"
+msgstr "Archivieren"
-#: ../../mod/ping.php:211
-#, php-format
-msgid "{0} disliked %s's post"
-msgstr "{0} mag %ss Beitrag nicht"
+#: ../../mod/connedit.php:346
+msgid "Archive or Unarchive this connection"
+msgstr "Archiviere diese Verbindung oder hole sie aus dem Archiv zurück"
-#: ../../mod/ping.php:216
-#, php-format
-msgid "{0} is now friends with %s"
-msgstr "{0} ist jetzt mit %s befreundet"
+#: ../../mod/connedit.php:349
+msgid "Unhide"
+msgstr "aufdecken"
-#: ../../mod/ping.php:221
-msgid "{0} posted"
-msgstr "{0} hat etwas veröffentlicht"
+#: ../../mod/connedit.php:349
+msgid "Hide"
+msgstr "Verbergen"
-#: ../../mod/ping.php:226
-#, php-format
-msgid "{0} tagged %s's post with #%s"
-msgstr "{0} hat %ss Beitrag mit dem Schlagwort #%s versehen"
+#: ../../mod/connedit.php:352
+msgid "Hide or Unhide this connection"
+msgstr "Diese Verbindung verstecken oder aufdecken"
-#: ../../mod/ping.php:232
-msgid "{0} mentioned you in a post"
-msgstr "{0} hat dich in einem Beitrag erwähnt"
+#: ../../mod/connedit.php:359
+msgid "Delete this connection"
+msgstr "Verbindung löschen"
-#: ../../mod/nogroup.php:58
-msgid "Contacts who are not members of a group"
-msgstr "Kontakte, die keiner Gruppe zugewiesen sind"
+#: ../../mod/connedit.php:392
+msgid "Unknown"
+msgstr "Unbekannt"
-#: ../../mod/openid.php:24
-msgid "OpenID protocol error. No ID returned."
-msgstr "OpenID Protokollfehler. Keine ID zurückgegeben."
+#: ../../mod/connedit.php:402 ../../mod/connedit.php:431
+msgid "Approve this connection"
+msgstr "Verbindung genehmigen"
-#: ../../mod/openid.php:53
-msgid ""
-"Account not found and OpenID registration is not permitted on this site."
-msgstr "Nutzerkonto wurde nicht gefunden, und OpenID-Registrierung ist auf diesem Server nicht gestattet."
+#: ../../mod/connedit.php:402
+msgid "Accept connection to allow communication"
+msgstr "Aktzeptiere die Verbindung um Kommunikation zu ermöglichen"
-#: ../../mod/openid.php:93 ../../include/auth.php:99
-#: ../../include/auth.php:162
-msgid "Login failed."
-msgstr "Anmeldung fehlgeschlagen."
+#: ../../mod/connedit.php:418
+msgid "Automatic Permissions Settings"
+msgstr "Automatische Berechtigungs-Einstellungen"
-#: ../../mod/follow.php:27
-msgid "Contact added"
-msgstr "Kontakt hinzugefügt"
+#: ../../mod/connedit.php:418
+#, php-format
+msgid "Connections: settings for %s"
+msgstr "Verbindungseinstellungen für %s"
-#: ../../mod/common.php:42
-msgid "Common Friends"
-msgstr "Gemeinsame Freunde"
+#: ../../mod/connedit.php:422
+msgid ""
+"When receiving a channel introduction, any permissions provided here will be"
+" applied to the new connection automatically and the introduction approved. "
+"Leave this page if you do not wish to use this feature."
+msgstr "Wenn eine Kanal-Vorstellung empfangen wird, werden die hier getroffenen Einstellungen automatisch angewandt und der Anfrage wird stattgegeben. Verlasse diese Seite, wenn du dieses Feature nicht verwanden möchtest."
-#: ../../mod/common.php:78
-msgid "No contacts in common."
-msgstr "Keine gemeinsamen Kontakte."
+#: ../../mod/connedit.php:424
+msgid "Slide to adjust your degree of friendship"
+msgstr "Schieben um den Grad der Freundschaft zu wählen"
-#: ../../mod/display.php:135
-msgid "Item has been removed."
-msgstr "Eintrag wurde entfernt."
+#: ../../mod/connedit.php:430
+msgid "inherited"
+msgstr "Geerbt"
-#: ../../mod/apps.php:4
-msgid "Applications"
-msgstr "Anwendungen"
+#: ../../mod/connedit.php:432
+msgid "Connection has no individual permissions!"
+msgstr "Diese Verbindung hat keine individuellen Zugriffseinstellungen."
-#: ../../mod/apps.php:7
-msgid "No installed applications."
-msgstr "Keine Applikationen installiert."
+#: ../../mod/connedit.php:433
+msgid ""
+"This may be appropriate based on your <a href=\"settings\">privacy "
+"settings</a>, though you may wish to review the \"Advanced Permissions\"."
+msgstr "Abhängig von deinen <a href=\"settings\">Privatsphären Einstellungen</a> könnte dies angebracht sein, eventuell solltest du aber die \"Erweiterte Zugriffsrechte\" überprüfen."
-#: ../../mod/search.php:83 ../../include/text.php:649
-#: ../../include/text.php:650 ../../include/nav.php:91
-msgid "Search"
-msgstr "Suche"
+#: ../../mod/connedit.php:435
+msgid "Profile Visibility"
+msgstr "Sichtbarkeit des Profils"
-#: ../../mod/profiles.php:21 ../../mod/profiles.php:395
-#: ../../mod/profiles.php:509 ../../mod/dfrn_confirm.php:62
-msgid "Profile not found."
-msgstr "Profil nicht gefunden."
+#: ../../mod/connedit.php:436
+#, php-format
+msgid ""
+"Please choose the profile you would like to display to %s when viewing your "
+"profile securely."
+msgstr "Bitte wähle ein Profil, das wir %s zeigen sollen, wenn deine Profilseite über eine verifizierte Verbindung aufgerufen wird."
-#: ../../mod/profiles.php:31
-msgid "Profile Name is required."
-msgstr "Profilname ist erforderlich."
+#: ../../mod/connedit.php:437
+msgid "Contact Information / Notes"
+msgstr "Kontaktinformationen / Notizen"
-#: ../../mod/profiles.php:152
-msgid "Marital Status"
-msgstr "Familienstand"
+#: ../../mod/connedit.php:438
+msgid "Edit contact notes"
+msgstr "Kontaktnotizen editieren"
-#: ../../mod/profiles.php:156
-msgid "Romantic Partner"
-msgstr "Romanze"
+#: ../../mod/connedit.php:440
+msgid "Their Settings"
+msgstr "Deren Einstellungen"
-#: ../../mod/profiles.php:160
-msgid "Work/Employment"
-msgstr "Arbeit / Beschäftigung"
+#: ../../mod/connedit.php:441
+msgid "My Settings"
+msgstr "Meine Einstellungen"
-#: ../../mod/profiles.php:163
-msgid "Religion"
-msgstr "Religion"
+#: ../../mod/connedit.php:443
+msgid "Forum Members"
+msgstr "Forum Mitglieder"
-#: ../../mod/profiles.php:167
-msgid "Political Views"
-msgstr "Politische Ansichten"
+#: ../../mod/connedit.php:444
+msgid "Soapbox"
+msgstr "Marktschreier"
-#: ../../mod/profiles.php:171
-msgid "Gender"
-msgstr "Geschlecht"
+#: ../../mod/connedit.php:445
+msgid "Full Sharing"
+msgstr "Volles Teilen"
-#: ../../mod/profiles.php:175
-msgid "Sexual Preference"
-msgstr "Sexuelle Vorlieben"
+#: ../../mod/connedit.php:446
+msgid "Cautious Sharing"
+msgstr "Vorsichtiges Teilen"
-#: ../../mod/profiles.php:179
-msgid "Homepage"
-msgstr "Webseite"
+#: ../../mod/connedit.php:447
+msgid "Follow Only"
+msgstr "Nur Folgen"
-#: ../../mod/profiles.php:183
-msgid "Interests"
-msgstr "Interessen"
+#: ../../mod/connedit.php:448
+msgid "Individual Permissions"
+msgstr "Individuelle Zugriffseinstellungen"
-#: ../../mod/profiles.php:187
-msgid "Address"
-msgstr "Adresse"
+#: ../../mod/connedit.php:449
+msgid ""
+"Some permissions may be inherited from your channel <a "
+"href=\"settings\">privacy settings</a>, which have higher priority. Changing"
+" those inherited settings on this page will have no effect."
+msgstr "Einige Genehmigungen können von deinen <a href=\"settings\">Sicherheits- und Datenschutz-Einstellungen</a> geerbt sein (siehe Kennzeichnung), da diese eine höhere Priorität haben. Wenn du solche Genehmigungen hier änderst, hat das keine Auswirkungen."
-#: ../../mod/profiles.php:194 ../../addon/dav/layout.fnk.php:310
-msgid "Location"
-msgstr "Wohnort"
+#: ../../mod/connedit.php:450
+msgid "Advanced Permissions"
+msgstr "Erweiterte Zugriffsrechte"
-#: ../../mod/profiles.php:273
-msgid "Profile updated."
-msgstr "Profil aktualisiert."
+#: ../../mod/connedit.php:451
+msgid "Quick Links"
+msgstr "Quick Links"
-#: ../../mod/profiles.php:340
-msgid " and "
-msgstr " und "
+#: ../../mod/connedit.php:455
+#, php-format
+msgid "Visit %s's profile - %s"
+msgstr "%s's Profil besuchen - %s"
-#: ../../mod/profiles.php:348
-msgid "public profile"
-msgstr "öffentliches Profil"
+#: ../../mod/connedit.php:456
+msgid "Block/Unblock contact"
+msgstr "Geblockt Status ein- / ausschalten"
-#: ../../mod/profiles.php:351
-#, php-format
-msgid "%1$s changed %2$s to &ldquo;%3$s&rdquo;"
-msgstr "%1$s hat %2$s geändert auf &ldquo;%3$s&rdquo;"
+#: ../../mod/connedit.php:457
+msgid "Ignore contact"
+msgstr "Kontakt ignorieren"
-#: ../../mod/profiles.php:352
-#, php-format
-msgid " - Visit %1$s's %2$s"
-msgstr " – %1$ss %2$s besuchen"
+#: ../../mod/connedit.php:458
+msgid "Repair URL settings"
+msgstr "URL Einstellungen reparieren"
-#: ../../mod/profiles.php:355
-#, php-format
-msgid "%1$s has an updated %2$s, changing %3$s."
-msgstr "%1$s hat folgendes aktualisiert %2$s, verändert wurde %3$s."
+#: ../../mod/connedit.php:459
+msgid "View conversations"
+msgstr "Unterhaltungen anzeigen"
-#: ../../mod/profiles.php:414
-msgid "Profile deleted."
-msgstr "Profil gelöscht."
+#: ../../mod/connedit.php:461
+msgid "Delete contact"
+msgstr "Kontakt löschen"
-#: ../../mod/profiles.php:432 ../../mod/profiles.php:466
-msgid "Profile-"
-msgstr "Profil-"
+#: ../../mod/connedit.php:464
+msgid "Last update:"
+msgstr "Letzte Aktualisierung:"
-#: ../../mod/profiles.php:451 ../../mod/profiles.php:493
-msgid "New profile created."
-msgstr "Neues Profil angelegt."
+#: ../../mod/connedit.php:466
+msgid "Update public posts"
+msgstr "Öffentliche Beiträge aktualisieren"
-#: ../../mod/profiles.php:472
-msgid "Profile unavailable to clone."
-msgstr "Profil nicht zum Duplizieren verfügbar."
+#: ../../mod/connedit.php:468
+msgid "Update now"
+msgstr "Jetzt aktualisieren"
-#: ../../mod/profiles.php:530
-msgid "Hide your contact/friend list from viewers of this profile?"
-msgstr "Liste der Kontakte vor Betrachtern dieses Profils verbergen?"
+#: ../../mod/connedit.php:474
+msgid "Currently blocked"
+msgstr "Derzeit blockiert"
-#: ../../mod/profiles.php:553
-msgid "Edit Profile Details"
-msgstr "Profil bearbeiten"
+#: ../../mod/connedit.php:475
+msgid "Currently ignored"
+msgstr "Derzeit ignoriert"
-#: ../../mod/profiles.php:555
-msgid "View this profile"
-msgstr "Dieses Profil anzeigen"
+#: ../../mod/connedit.php:476
+msgid "Currently archived"
+msgstr "Derzeit archiviert"
-#: ../../mod/profiles.php:556
-msgid "Create a new profile using these settings"
-msgstr "Neues Profil anlegen und diese Einstellungen verwenden"
+#: ../../mod/connedit.php:477
+msgid "Currently pending"
+msgstr "Derzeit anstehend"
-#: ../../mod/profiles.php:557
-msgid "Clone this profile"
-msgstr "Dieses Profil duplizieren"
+#: ../../mod/connedit.php:478
+msgid "Hide this contact from others"
+msgstr "Diese Verbindung vor den anderen verbergen."
-#: ../../mod/profiles.php:558
-msgid "Delete this profile"
-msgstr "Dieses Profil löschen"
+#: ../../mod/connedit.php:478
+msgid ""
+"Replies/likes to your public posts <strong>may</strong> still be visible"
+msgstr "Antworten/Likes auf deine öffentlichen Beiträge <strong>können</strong> immer noch sichtbar sein"
-#: ../../mod/profiles.php:559
-msgid "Profile Name:"
-msgstr "Profilname:"
+#: ../../mod/webpages.php:121 ../../mod/layouts.php:105
+#: ../../mod/blocks.php:96
+msgid "View"
+msgstr "Ansicht"
-#: ../../mod/profiles.php:560
-msgid "Your Full Name:"
-msgstr "Dein kompletter Name:"
+#: ../../mod/api.php:76 ../../mod/api.php:102
+msgid "Authorize application connection"
+msgstr "Zugriff der Anwendung authorizieren"
-#: ../../mod/profiles.php:561
-msgid "Title/Description:"
-msgstr "Titel/Beschreibung:"
+#: ../../mod/api.php:77
+msgid "Return to your app and insert this Securty Code:"
+msgstr "Trage folgenden Sicherheitscode bei der Anwendung ein:"
-#: ../../mod/profiles.php:562
-msgid "Your Gender:"
-msgstr "Dein Geschlecht:"
+#: ../../mod/api.php:89
+msgid "Please login to continue."
+msgstr "Zum Weitermachen, bitte einloggen."
-#: ../../mod/profiles.php:563
-#, php-format
-msgid "Birthday (%s):"
-msgstr "Geburtstag (%s):"
+#: ../../mod/api.php:104
+msgid ""
+"Do you want to authorize this application to access your posts and contacts,"
+" and/or create new posts for you?"
+msgstr "Möchtest du der Anwendung erlauben deine Nachrichten und Kontakte abzurufen und/oder neue Nachrichten für dich zu erstellen?"
-#: ../../mod/profiles.php:564
-msgid "Street Address:"
-msgstr "Adresse:"
+#: ../../mod/api.php:105 ../../mod/profiles.php:495 ../../mod/settings.php:865
+#: ../../mod/settings.php:870
+msgid "Yes"
+msgstr "Ja"
-#: ../../mod/profiles.php:565
-msgid "Locality/City:"
-msgstr "Wohnort:"
+#: ../../mod/api.php:106 ../../mod/profiles.php:496 ../../mod/settings.php:865
+#: ../../mod/settings.php:870
+msgid "No"
+msgstr "Nein"
-#: ../../mod/profiles.php:566
-msgid "Postal/Zip Code:"
-msgstr "Postleitzahl:"
+#: ../../mod/apps.php:8
+msgid "No installed applications."
+msgstr "Keine installierten Applikationen"
-#: ../../mod/profiles.php:567
-msgid "Country:"
-msgstr "Land:"
+#: ../../mod/apps.php:13
+msgid "Applications"
+msgstr "Anwendungen"
-#: ../../mod/profiles.php:568
-msgid "Region/State:"
-msgstr "Region/Bundesstaat:"
+#: ../../mod/page.php:35
+msgid "Invalid item."
+msgstr "Ungültiges Element."
-#: ../../mod/profiles.php:569
-msgid "<span class=\"heart\">&hearts;</span> Marital Status:"
-msgstr "<span class=\"heart\">&hearts;</span> Beziehungsstatus:"
+#: ../../mod/page.php:47 ../../mod/chanview.php:77 ../../mod/home.php:50
+#: ../../mod/wall_upload.php:35
+msgid "Channel not found."
+msgstr "Kanal nicht gefunden."
-#: ../../mod/profiles.php:570
-msgid "Who: (if applicable)"
-msgstr "Wer: (falls anwendbar)"
+#: ../../mod/page.php:83 ../../mod/help.php:71 ../../mod/display.php:100
+#: ../../index.php:227
+msgid "Page not found."
+msgstr "Seite nicht gefunden."
-#: ../../mod/profiles.php:571
-msgid "Examples: cathy123, Cathy Williams, cathy@example.com"
-msgstr "Beispiele: cathy123, Cathy Williams, cathy@example.com"
+#: ../../mod/attach.php:9
+msgid "Item not available."
+msgstr "Element nicht verfügbar."
-#: ../../mod/profiles.php:572
-msgid "Since [date]:"
-msgstr "Seit [Datum]:"
+#: ../../mod/setup.php:161
+msgid "Red Matrix Server - Setup"
+msgstr "Red Matrix Server - Installation"
-#: ../../mod/profiles.php:573 ../../include/profile_advanced.php:46
-msgid "Sexual Preference:"
-msgstr "Sexuelle Vorlieben:"
+#: ../../mod/setup.php:167
+msgid "Could not connect to database."
+msgstr "Kann nicht mit der Datenbank verbinden."
-#: ../../mod/profiles.php:574
-msgid "Homepage URL:"
-msgstr "Adresse der Homepage:"
+#: ../../mod/setup.php:171
+msgid ""
+"Could not connect to specified site URL. Possible SSL certificate or DNS "
+"issue."
+msgstr "Konnte die angegebene Webseiten URL nicht erreichen. Möglicherweise ein Problem mit dem SSL Zertifikat oder dem DNS."
-#: ../../mod/profiles.php:575 ../../include/profile_advanced.php:50
-msgid "Hometown:"
-msgstr "Heimatort:"
+#: ../../mod/setup.php:176
+msgid "Could not create table."
+msgstr "Kann Tabelle nicht erstellen."
-#: ../../mod/profiles.php:576 ../../include/profile_advanced.php:54
-msgid "Political Views:"
-msgstr "Politische Ansichten:"
+#: ../../mod/setup.php:182
+msgid "Your site database has been installed."
+msgstr "Die Datenbank deiner Seite wurde installiert."
-#: ../../mod/profiles.php:577
-msgid "Religious Views:"
-msgstr "Religiöse Ansichten:"
+#: ../../mod/setup.php:187
+msgid ""
+"You may need to import the file \"install/database.sql\" manually using "
+"phpmyadmin or mysql."
+msgstr "Eventuell musst du die Datei \"install/database.sql\" händisch mit phpmyadmin oder mysql importieren."
-#: ../../mod/profiles.php:578
-msgid "Public Keywords:"
-msgstr "Öffentliche Schlüsselwörter:"
+#: ../../mod/setup.php:188 ../../mod/setup.php:257 ../../mod/setup.php:606
+msgid "Please see the file \"install/INSTALL.txt\"."
+msgstr "Lies die Datei \"install/INSTALL.txt\"."
-#: ../../mod/profiles.php:579
-msgid "Private Keywords:"
-msgstr "Private Schlüsselwörter:"
+#: ../../mod/setup.php:254
+msgid "System check"
+msgstr "Systemprüfung"
-#: ../../mod/profiles.php:580
-msgid "Example: fishing photography software"
-msgstr "Beispiel: Fischen Fotografie Software"
+#: ../../mod/setup.php:259
+msgid "Check again"
+msgstr "Bitte nochmal prüfen"
-#: ../../mod/profiles.php:581
-msgid "(Used for suggesting potential friends, can be seen by others)"
-msgstr "(Wird verwendet, um potentielle Freunde zu finden, könnte von Fremden eingesehen werden)"
+#: ../../mod/setup.php:281
+msgid "Database connection"
+msgstr "Datenbank Verbindung"
-#: ../../mod/profiles.php:582
-msgid "(Used for searching profiles, never shown to others)"
-msgstr "(Wird für die Suche nach Profilen verwendet und niemals veröffentlicht)"
+#: ../../mod/setup.php:282
+msgid ""
+"In order to install Red Matrix we need to know how to connect to your "
+"database."
+msgstr "Um die Red Matrix installieren zu können, müssen wir wissen wie wir deine Datenbank kontaktieren können."
-#: ../../mod/profiles.php:583
-msgid "Tell us about yourself..."
-msgstr "Erzähle uns ein bisschen von dir …"
+#: ../../mod/setup.php:283
+msgid ""
+"Please contact your hosting provider or site administrator if you have "
+"questions about these settings."
+msgstr "Bitte kontaktiere deinen Hosting Provider oder den Administrator der Seite wenn du Fragen zu diesen Einstellungen haben solltest."
-#: ../../mod/profiles.php:584
-msgid "Hobbies/Interests"
-msgstr "Hobbies/Interessen"
+#: ../../mod/setup.php:284
+msgid ""
+"The database you specify below should already exist. If it does not, please "
+"create it before continuing."
+msgstr "Die Datenbank, die du weiter unten angibst, sollte bereits existieren. Sollte das noch nicht der Fall sein, erzeuge sie bitte bevor du fortfährst."
-#: ../../mod/profiles.php:585
-msgid "Contact information and Social Networks"
-msgstr "Kontaktinformationen und Soziale Netzwerke"
+#: ../../mod/setup.php:288
+msgid "Database Server Name"
+msgstr "Datenbank-Servername"
-#: ../../mod/profiles.php:586
-msgid "Musical interests"
-msgstr "Musikalische Interessen"
+#: ../../mod/setup.php:288
+msgid "Default is localhost"
+msgstr "Standard ist localhost"
-#: ../../mod/profiles.php:587
-msgid "Books, literature"
-msgstr "Literatur/Bücher"
+#: ../../mod/setup.php:289
+msgid "Database Port"
+msgstr "Datenbank-Port"
-#: ../../mod/profiles.php:588
-msgid "Television"
-msgstr "Fernsehen"
+#: ../../mod/setup.php:289
+msgid "Communication port number - use 0 for default"
+msgstr "Port Nummer zur Kommunikation - verwende 0 für die Standardeinstellung:"
-#: ../../mod/profiles.php:589
-msgid "Film/dance/culture/entertainment"
-msgstr "Filme/Tänze/Kultur/Unterhaltung"
+#: ../../mod/setup.php:290
+msgid "Database Login Name"
+msgstr "Datenbank-Benutzername"
-#: ../../mod/profiles.php:590
-msgid "Love/romance"
-msgstr "Liebesleben"
+#: ../../mod/setup.php:291
+msgid "Database Login Password"
+msgstr "Datenbank-Kennwort"
-#: ../../mod/profiles.php:591
-msgid "Work/employment"
-msgstr "Arbeit/Beschäftigung"
+#: ../../mod/setup.php:292
+msgid "Database Name"
+msgstr "Datenbank-Name"
-#: ../../mod/profiles.php:592
-msgid "School/education"
-msgstr "Schule/Ausbildung"
+#: ../../mod/setup.php:294 ../../mod/setup.php:336
+msgid "Site administrator email address"
+msgstr "E-Mail Adresse des Seiten-Administrators"
-#: ../../mod/profiles.php:597
+#: ../../mod/setup.php:294 ../../mod/setup.php:336
msgid ""
-"This is your <strong>public</strong> profile.<br />It <strong>may</strong> "
-"be visible to anybody using the internet."
-msgstr "Dies ist dein <strong>öffentliches</strong> Profil.<br />Es <strong>könnte</strong> für jeden Nutzer des Internets sichtbar sein."
+"Your account email address must match this in order to use the web admin "
+"panel."
+msgstr "Die Email-Adresse deines Accounts muss dieser Adresse entsprechen, damit du Zugriff zum Admin Panel erhältst."
-#: ../../mod/profiles.php:607 ../../mod/directory.php:111
-msgid "Age: "
-msgstr "Alter: "
+#: ../../mod/setup.php:295 ../../mod/setup.php:338
+msgid "Website URL"
+msgstr "Webseiten URL"
-#: ../../mod/profiles.php:644
-msgid "Edit/Manage Profiles"
-msgstr "Verwalte/Editiere Profile"
+#: ../../mod/setup.php:295 ../../mod/setup.php:338
+msgid "Please use SSL (https) URL if available."
+msgstr "Nutze wenn möglich eine SSL-URL (https)."
-#: ../../mod/profiles.php:645 ../../boot.php:1075
-msgid "Change profile photo"
-msgstr "Profilbild ändern"
+#: ../../mod/setup.php:298 ../../mod/setup.php:341
+msgid "Please select a default timezone for your website"
+msgstr "Standard-Zeitzone für deine Website"
-#: ../../mod/profiles.php:646 ../../boot.php:1076
-msgid "Create New Profile"
-msgstr "Neues Profil anlegen"
+#: ../../mod/setup.php:325
+msgid "Site settings"
+msgstr "Seiteneinstellungen"
-#: ../../mod/profiles.php:657 ../../boot.php:1086
-msgid "Profile Image"
-msgstr "Profilbild"
+#: ../../mod/setup.php:381
+msgid "Could not find a command line version of PHP in the web server PATH."
+msgstr "Konnte die Kommandozeilen Version von PHP nicht im PATH des Servers finden."
-#: ../../mod/profiles.php:659 ../../boot.php:1089
-msgid "visible to everybody"
-msgstr "sichtbar für jeden"
+#: ../../mod/setup.php:382
+msgid ""
+"If you don't have a command line version of PHP installed on server, you "
+"will not be able to run background polling via cron."
+msgstr "Solltest du keine Kommandozeilen Version von PHP auf dem Server installiert haben wirst du nicht in der Lage sein Hintergrundprozesse via cron auszuführen."
-#: ../../mod/profiles.php:660 ../../boot.php:1090
-msgid "Edit visibility"
-msgstr "Sichtbarkeit bearbeiten"
+#: ../../mod/setup.php:386
+msgid "PHP executable path"
+msgstr "PHP Pfad zu ausführbarer Datei"
-#: ../../mod/filer.php:29 ../../include/conversation.php:947
-msgid "Save to Folder:"
-msgstr "In diesen Ordner verschieben:"
+#: ../../mod/setup.php:386
+msgid ""
+"Enter full path to php executable. You can leave this blank to continue the "
+"installation."
+msgstr "Gib den vollen Pfad zum PHP Interpreter an. Du kannst dieses Felds frei lassen und mit der Installation fortfahren."
-#: ../../mod/filer.php:29
-msgid "- select -"
-msgstr "- auswählen -"
+#: ../../mod/setup.php:391
+msgid "Command line PHP"
+msgstr "PHP Befehlszeile"
-#: ../../mod/tagger.php:103 ../../include/conversation.php:138
-#, php-format
-msgid "%1$s tagged %2$s's %3$s with %4$s"
-msgstr "%1$s hat %2$ss %3$s mit %4$s getaggt"
+#: ../../mod/setup.php:400
+msgid ""
+"The command line version of PHP on your system does not have "
+"\"register_argc_argv\" enabled."
+msgstr "Die Kommandozeilen Version von PHP auf deinem System hat \"register_argc_argv\" nicht aktiviert."
-#: ../../mod/delegate.php:95
-msgid "No potential page delegates located."
-msgstr "Keine potentiellen Bevollmächtigten für die Seite gefunden."
+#: ../../mod/setup.php:401
+msgid "This is required for message delivery to work."
+msgstr "Dies wird benötigt, damit die Auslieferung von Nachrichten funktioniert."
-#: ../../mod/delegate.php:121
-msgid "Delegate Page Management"
-msgstr "Delegiere das Management für die Seite"
+#: ../../mod/setup.php:403
+msgid "PHP register_argc_argv"
+msgstr "PHP register_argc_argv"
-#: ../../mod/delegate.php:123
+#: ../../mod/setup.php:424
msgid ""
-"Delegates are able to manage all aspects of this account/page except for "
-"basic account settings. Please do not delegate your personal account to "
-"anybody that you do not trust completely."
-msgstr "Bevollmächtigte sind in der Lage, alle Aspekte dieses Kontos/dieser Seite zu verwalten, abgesehen von den Grundeinstellungen des Kontos. Bitte gib niemandem eine Bevollmächtigung für deinen privaten Account, dem du nicht absolut vertraust!"
+"Error: the \"openssl_pkey_new\" function on this system is not able to "
+"generate encryption keys"
+msgstr "Fehler: Die \"openssl_pkey_new\" Funktion auf diesem System ist nicht in der Lage Schlüssel für die Verschlüsselung zu erzeugen."
-#: ../../mod/delegate.php:124
-msgid "Existing Page Managers"
-msgstr "Vorhandene Seiten Manager"
+#: ../../mod/setup.php:425
+msgid ""
+"If running under Windows, please see "
+"\"http://www.php.net/manual/en/openssl.installation.php\"."
+msgstr "Wenn du Windows verwendest, siehe http://www.php.net/manual/en/openssl.installation.php für eine Installationsanleitung."
-#: ../../mod/delegate.php:126
-msgid "Existing Page Delegates"
-msgstr "Vorhandene Bevollmächtigte für die Seite"
+#: ../../mod/setup.php:427
+msgid "Generate encryption keys"
+msgstr "Verschlüsselungsschlüssel generieren"
-#: ../../mod/delegate.php:128
-msgid "Potential Delegates"
-msgstr "Potentielle Bevollmächtigte"
+#: ../../mod/setup.php:434
+msgid "libCurl PHP module"
+msgstr "libCurl PHP Modul"
-#: ../../mod/delegate.php:131
-msgid "Add"
-msgstr "Hinzufügen"
+#: ../../mod/setup.php:435
+msgid "GD graphics PHP module"
+msgstr "GD Graphik PHP Modul"
-#: ../../mod/delegate.php:132
-msgid "No entries."
-msgstr "Keine Einträge"
+#: ../../mod/setup.php:436
+msgid "OpenSSL PHP module"
+msgstr "OpenSSL PHP Modul"
-#: ../../mod/suggest.php:38 ../../view/theme/diabook/theme.php:626
-#: ../../include/contact_widgets.php:34
-msgid "Friend Suggestions"
-msgstr "Kontaktvorschläge"
+#: ../../mod/setup.php:437
+msgid "mysqli PHP module"
+msgstr "mysqli PHP Modul"
-#: ../../mod/suggest.php:44
-msgid ""
-"No suggestions available. If this is a new site, please try again in 24 "
-"hours."
-msgstr "Keine Vorschläge. Falls der Server frisch aufgesetzt wurde, versuche es bitte in 24 Stunden noch einmal."
+#: ../../mod/setup.php:438
+msgid "mb_string PHP module"
+msgstr "mb_string PHP Modul"
-#: ../../mod/suggest.php:61
-msgid "Ignore/Hide"
-msgstr "Ignorieren/Verbergen"
+#: ../../mod/setup.php:439
+msgid "mcrypt PHP module"
+msgstr "mcrypt PHP Modul"
-#: ../../mod/directory.php:47 ../../view/theme/diabook/theme.php:624
-msgid "Global Directory"
-msgstr "Weltweites Verzeichnis"
+#: ../../mod/setup.php:444 ../../mod/setup.php:446
+msgid "Apache mod_rewrite module"
+msgstr "Apache mod_rewrite Modul"
-#: ../../mod/directory.php:55
-msgid "Find on this site"
-msgstr "Auf diesem Server suchen"
+#: ../../mod/setup.php:444
+msgid ""
+"Error: Apache webserver mod-rewrite module is required but not installed."
+msgstr "Fehler: Das Apache Modul mod-rewrite wird benötigt ist aber nicht installiert."
-#: ../../mod/directory.php:58
-msgid "Site Directory"
-msgstr "Verzeichnis"
+#: ../../mod/setup.php:450 ../../mod/setup.php:453
+msgid "proc_open"
+msgstr "proc_open"
-#: ../../mod/directory.php:114
-msgid "Gender: "
-msgstr "Geschlecht:"
+#: ../../mod/setup.php:450
+msgid ""
+"Error: proc_open is required but is either not installed or has been "
+"disabled in php.ini"
+msgstr "Fehler: proc_open wird benötigt ist aber entweder nicht installiert oder wurde in der php.ini deaktiviert"
-#: ../../mod/directory.php:140
-msgid "No entries (some entries may be hidden)."
-msgstr "Keine Einträge (einige Einträge könnten versteckt sein)."
+#: ../../mod/setup.php:458
+msgid "Error: libCURL PHP module required but not installed."
+msgstr "Fehler: das PHP Modul libCURL wird benütigt ist aber nicht installiert."
-#: ../../mod/invite.php:35
-#, php-format
-msgid "%s : Not a valid email address."
-msgstr "%s: Keine gültige Email Adresse."
+#: ../../mod/setup.php:462
+msgid ""
+"Error: GD graphics PHP module with JPEG support required but not installed."
+msgstr "Fehler: das PHP Modul GD Grafik mit JPEG Unterstützung wird benötigt ist aber nicht installiert."
-#: ../../mod/invite.php:59
-msgid "Please join us on Friendica"
-msgstr "Bitte trete uns auf Friendica bei"
+#: ../../mod/setup.php:466
+msgid "Error: openssl PHP module required but not installed."
+msgstr "Fehler: das OpenSSL PHP Modul wird benötigt ist aber nicht installiert."
-#: ../../mod/invite.php:69
-#, php-format
-msgid "%s : Message delivery failed."
-msgstr "%s: Zustellung der Nachricht fehlgeschlagen."
+#: ../../mod/setup.php:470
+msgid "Error: mysqli PHP module required but not installed."
+msgstr "Fehler: das PHP Modul mysqli wird benötigt ist aber nicht installiert."
-#: ../../mod/invite.php:73
-#, php-format
-msgid "%d message sent."
-msgid_plural "%d messages sent."
-msgstr[0] "%d Nachricht gesendet."
-msgstr[1] "%d Nachrichten gesendet."
+#: ../../mod/setup.php:474
+msgid "Error: mb_string PHP module required but not installed."
+msgstr "Fehler: das PHP Modul mb_string wird benötigt ist aber nicht installiert."
-#: ../../mod/invite.php:92
-msgid "You have no more invitations available"
-msgstr "Du hast keine weiteren Einladungen"
+#: ../../mod/setup.php:478
+msgid "Error: mcrypt PHP module required but not installed."
+msgstr "Fehler: das PHP Modul mcrypt wird benötigt ist aber nicht installiert."
-#: ../../mod/invite.php:100
-#, php-format
+#: ../../mod/setup.php:494
msgid ""
-"Visit %s for a list of public sites that you can join. Friendica members on "
-"other sites can all connect with each other, as well as with members of many"
-" other social networks."
-msgstr "Besuche %s für eine Liste der öffentlichen Server, denen du beitreten kannst. Friendica Mitglieder unterschiedlicher Server können sich sowohl alle miteinander verbinden, als auch mit Mitgliedern anderer Sozialer Netzwerke."
+"The web installer needs to be able to create a file called \".htconfig.php\""
+" in the top folder of your web server and it is unable to do so."
+msgstr "Der Installations-Assistent muss in der Lage sein die Datei \".htconfig.php\" im Stammverzeichnis des Web-Servers anzulegen, ist es aber nicht."
-#: ../../mod/invite.php:102
-#, php-format
+#: ../../mod/setup.php:495
msgid ""
-"To accept this invitation, please visit and register at %s or any other "
-"public Friendica website."
-msgstr "Um diese Kontaktanfrage zu akzeptieren, besuche und registriere dich bitte bei %s oder einer anderen öffentlichen Friendica Website."
+"This is most often a permission setting, as the web server may not be able "
+"to write files in your folder - even if you can."
+msgstr "Meist liegt dies daran, dass der Nutzer unter dem der Web-Server läuft keine Rechte zum Schreiben in dem Verzeichnis hat - selbst wenn du das kannst."
-#: ../../mod/invite.php:103
-#, php-format
+#: ../../mod/setup.php:496
msgid ""
-"Friendica sites all inter-connect to create a huge privacy-enhanced social "
-"web that is owned and controlled by its members. They can also connect with "
-"many traditional social networks. See %s for a list of alternate Friendica "
-"sites you can join."
-msgstr "Friendica Server verbinden sich alle untereinander, um ein großes datenschutzorientiertes Soziales Netzwerk zu bilden, das von seinen Mitgliedern betrieben und kontrolliert wird. Sie können sich auch mit vielen üblichen Sozialen Netzwerken verbinden. Besuche %s für eine Liste alternativer Friendica Server, denen du beitreten kannst."
+"At the end of this procedure, we will give you a text to save in a file "
+"named .htconfig.php in your Red top folder."
+msgstr "Am Schluss des Vorgangs wird ein Text generiert, den du unter dem Dateinamen .htconfig.php im Stammverzeichnis deiner Red Installation speichern."
-#: ../../mod/invite.php:106
+#: ../../mod/setup.php:497
msgid ""
-"Our apologies. This system is not currently configured to connect with other"
-" public sites or invite members."
-msgstr "Es tut uns Leid. Dieses System ist zurzeit nicht dafür konfiguriert, sich mit anderen öffentlichen Seiten zu verbinden oder Mitglieder einzuladen."
-
-#: ../../mod/invite.php:111
-msgid "Send invitations"
-msgstr "Einladungen senden"
+"You can alternatively skip this procedure and perform a manual installation."
+" Please see the file \"install/INSTALL.txt\" for instructions."
+msgstr "Alternativ kannst du diesen Schritt überspringen und die Installation manuell vornehmen. Lies dazu die Datei install/INSTALL.txt."
-#: ../../mod/invite.php:112
-msgid "Enter email addresses, one per line:"
-msgstr "E-Mail-Adressen eingeben, eine pro Zeile:"
+#: ../../mod/setup.php:500
+msgid ".htconfig.php is writable"
+msgstr ".htconfig.php ist beschreibbar"
-#: ../../mod/invite.php:114
+#: ../../mod/setup.php:510
msgid ""
-"You are cordially invited to join me and other close friends on Friendica - "
-"and help us to create a better social web."
-msgstr "Du bist herzlich dazu eingeladen, dich mir und anderen guten Freunden auf Friendica anzuschließen - und ein besseres Soziales Netz aufzubauen."
+"Red uses the Smarty3 template engine to render its web views. Smarty3 "
+"compiles templates to PHP to speed up rendering."
+msgstr "Red verwendet Smarty3 um Vorlagen für die Webdarstellung zu übersetzen. Smarty3 übersetzt diese Vorlagen nach PHP um die Darstellung zu beschleunigen."
-#: ../../mod/invite.php:116
-msgid "You will need to supply this invitation code: $invite_code"
-msgstr "Du benötigst den folgenden Einladungscode: $invite_code"
-
-#: ../../mod/invite.php:116
+#: ../../mod/setup.php:511
msgid ""
-"Once you have registered, please connect with me via my profile page at:"
-msgstr "Sobald du registriert bist, kontaktiere mich bitte auf meiner Profilseite:"
+"In order to store these compiled templates, the web server needs to have "
+"write access to the directory view/tpl/smarty3/ under the Red top level "
+"folder."
+msgstr "Um die übersetzten Vorlagen speichern zu können muss der Webserver schreib Zugriff auf das Verzeichnis view/tpl/smarty3/ unterhalb des Red Stammverzeichnisses haben."
-#: ../../mod/invite.php:118
+#: ../../mod/setup.php:512 ../../mod/setup.php:530
msgid ""
-"For more information about the Friendica project and why we feel it is "
-"important, please visit http://friendica.com"
-msgstr "Für weitere Informationen über das Friendica Projekt und warum wir es für ein wichtiges Projekt halten, besuche bitte http://friendica.com"
+"Please ensure that the user that your web server runs as (e.g. www-data) has"
+" write access to this folder."
+msgstr "Bitte stelle sicher, dass der Nutzer unter dem der Webserver läuft (z.B. www-data) Zugriff zum Schreiben auf dieses Verzeichnis hat."
-#: ../../mod/dfrn_confirm.php:119
+#: ../../mod/setup.php:513
msgid ""
-"This may occasionally happen if contact was requested by both persons and it"
-" has already been approved."
-msgstr "Das kann passieren, wenn sich zwei Kontakte gegenseitig eingeladen haben und bereits einer angenommen wurde."
+"Note: as a security measure, you should give the web server write access to "
+"view/tpl/smarty3/ only--not the template files (.tpl) that it contains."
+msgstr "Hinweis: Als Sicherheitsvorkehrung solltest du dem Webserver nur Schreib-Zugriff auf das Verzeichnis view/tpl/smarty3 geben, nicht dem Vorlagen (.tpl) die in diesem Verzeichnis liegen."
-#: ../../mod/dfrn_confirm.php:237
-msgid "Response from remote site was not understood."
-msgstr "Antwort der Gegenstelle unverständlich."
+#: ../../mod/setup.php:516
+msgid "view/tpl/smarty3 is writable"
+msgstr "view/tpl/smarty3 ist beschreibbar"
-#: ../../mod/dfrn_confirm.php:246
-msgid "Unexpected response from remote site: "
-msgstr "Unerwartete Antwort der Gegenstelle: "
+#: ../../mod/setup.php:529
+msgid ""
+"Red uses the store directory to save uploaded files. The web server needs to"
+" have write access to the store directory under the Red top level folder"
+msgstr "Red benutzt das store Verzeichnis um hochgeladene Dateien zu speichern. Der Web-Server benötigt Schreibrechte für dieses Verzeichnis direkt unterhalb des Red Stammverzeichnis."
-#: ../../mod/dfrn_confirm.php:254
-msgid "Confirmation completed successfully."
-msgstr "Bestätigung erfolgreich abgeschlossen."
+#: ../../mod/setup.php:533
+msgid "store is writable"
+msgstr "store ist schreibbar"
-#: ../../mod/dfrn_confirm.php:256 ../../mod/dfrn_confirm.php:270
-#: ../../mod/dfrn_confirm.php:277
-msgid "Remote site reported: "
-msgstr "Gegenstelle meldet: "
+#: ../../mod/setup.php:548
+msgid "SSL certificate validation"
+msgstr "SSL Zertifikatverifizierung"
-#: ../../mod/dfrn_confirm.php:268
-msgid "Temporary failure. Please wait and try again."
-msgstr "Zeitweiser Fehler. Bitte warte einige Momente und versuche es dann noch einmal."
+#: ../../mod/setup.php:548
+msgid ""
+"SSL certificate cannot be validated. Fix certificate or disable https access"
+" to this site."
+msgstr "Das SSL Zertifikat konnte nicht validiert werden. Korrigiere das Zertifikat oder schalte HTTPS ab um auf diese Seite zuzugreifen."
-#: ../../mod/dfrn_confirm.php:275
-msgid "Introduction failed or was revoked."
-msgstr "Kontaktanfrage schlug fehl oder wurde zurück gezogen."
+#: ../../mod/setup.php:555
+msgid ""
+"Url rewrite in .htaccess is not working. Check your server configuration."
+msgstr "URL rewrite funktioniert in der .htaccess nicht. Überprüfe deine Server-Konfiguration."
-#: ../../mod/dfrn_confirm.php:420
-msgid "Unable to set contact photo."
-msgstr "Konnte das Bild des Kontakts nicht speichern."
+#: ../../mod/setup.php:557
+msgid "Url rewrite is working"
+msgstr "Url rewrite funktioniert"
-#: ../../mod/dfrn_confirm.php:477 ../../include/diaspora.php:510
-#: ../../include/conversation.php:101
-#, php-format
-msgid "%1$s is now friends with %2$s"
-msgstr "%1$s ist nun mit %2$s befreundet"
+#: ../../mod/setup.php:567
+msgid ""
+"The database configuration file \".htconfig.php\" could not be written. "
+"Please use the enclosed text to create a configuration file in your web "
+"server root."
+msgstr "Die Datenbank Konfigurationsdatei \".htconfig.php\" konnte nicht geschrieben werden. Bitte verwende den unten angegebenen Text um die Konfigurationsdatei im Stammverzeichnis des Webservers anzulegen."
-#: ../../mod/dfrn_confirm.php:562
-#, php-format
-msgid "No user record found for '%s' "
-msgstr "Für '%s' wurde kein Nutzer gefunden"
+#: ../../mod/setup.php:591
+msgid "Errors encountered creating database tables."
+msgstr "Fehler während des Anlegens der Datenbank Tabellen aufgetreten."
-#: ../../mod/dfrn_confirm.php:572
-msgid "Our site encryption key is apparently messed up."
-msgstr "Der Verschlüsselungsschlüssel unserer Seite ist anscheinend im Arsch."
+#: ../../mod/setup.php:604
+msgid "<h1>What next</h1>"
+msgstr "<h1>Was als Nächstes</h1>"
-#: ../../mod/dfrn_confirm.php:583
-msgid "Empty site URL was provided or URL could not be decrypted by us."
-msgstr "Leere URL für die Seite erhalten oder die URL konnte nicht entschlüsselt werden."
+#: ../../mod/setup.php:605
+msgid ""
+"IMPORTANT: You will need to [manually] setup a scheduled task for the "
+"poller."
+msgstr "WICHTIG: Du musst die geplanten Aufgaben für den Poller [manuell] einrichten."
-#: ../../mod/dfrn_confirm.php:604
-msgid "Contact record was not found for you on our site."
-msgstr "Für diesen Kontakt wurde auf unserer Seite kein Eintrag gefunden."
+#: ../../mod/rpost.php:84 ../../mod/editpost.php:42
+msgid "Edit post"
+msgstr "Bearbeite Beitrag"
-#: ../../mod/dfrn_confirm.php:618
+#: ../../mod/subthread.php:105
#, php-format
-msgid "Site public key not available in contact record for URL %s."
-msgstr "Die Kontaktdaten für URL %s enthalten keinen Public Key für den Server."
+msgid "%1$s is following %2$s's %3$s"
+msgstr "%1$s folgt nun %2$s's %3$s"
-#: ../../mod/dfrn_confirm.php:638
-msgid ""
-"The ID provided by your system is a duplicate on our system. It should work "
-"if you try again."
-msgstr "Die ID, die uns dein System angeboten hat, ist hier bereits vergeben. Bitte versuche es noch einmal."
-
-#: ../../mod/dfrn_confirm.php:649
-msgid "Unable to set your contact credentials on our system."
-msgstr "Deine Kontaktreferenzen konnten nicht in unserem System gespeichert werden."
+#: ../../mod/update_network.php:23 ../../mod/update_channel.php:43
+#: ../../mod/update_search.php:46 ../../mod/update_display.php:25
+#: ../../mod/update_community.php:18
+msgid "[Embedded content - reload page to view]"
+msgstr "[Eingebetteter Inhalte - bitte lade die Seite zur Anzeige neu]"
-#: ../../mod/dfrn_confirm.php:716
-msgid "Unable to update your contact profile details on our system"
-msgstr "Die Updates für dein Profil konnten nicht gespeichert werden"
+#: ../../mod/chanview.php:97
+msgid "toggle full screen mode"
+msgstr "auf Vollbildmodus umschalten"
-#: ../../mod/dfrn_confirm.php:750
+#: ../../mod/tagger.php:98
#, php-format
-msgid "Connection accepted at %s"
-msgstr "Auf %s wurde die Verbindung akzeptiert"
+msgid "%1$s tagged %2$s's %3$s with %4$s"
+msgstr "%1$s hat %2$s's %3$s mit %4$s getaggt"
+
+#: ../../mod/viewconnections.php:17 ../../mod/search.php:12
+#: ../../mod/photos.php:573 ../../mod/directory.php:15 ../../mod/display.php:9
+#: ../../mod/community.php:18 ../../mod/dirprofile.php:9
+msgid "Public access denied."
+msgstr "Öffentlicher Zugang verweigert."
+
+#: ../../mod/viewconnections.php:43
+msgid "No connections."
+msgstr "Keine Verbindungen."
-#: ../../mod/dfrn_confirm.php:799
+#: ../../mod/viewconnections.php:55
#, php-format
-msgid "%1$s has joined %2$s"
-msgstr "%1$s ist %2$s beigetreten"
+msgid "Visit %s's profile [%s]"
+msgstr "Besuche %s's Profil [%s]"
-#: ../../addon/facebook/facebook.php:513
-msgid "Facebook disabled"
-msgstr "Facebook deaktiviert"
+#: ../../mod/viewconnections.php:70
+msgid "View Connnections"
+msgstr "Zeige Verbindungen"
-#: ../../addon/facebook/facebook.php:518
-msgid "Updating contacts"
-msgstr "Aktualisiere Kontakte"
+#: ../../mod/tagrm.php:41
+msgid "Tag removed"
+msgstr "Schlagwort entfernt"
-#: ../../addon/facebook/facebook.php:541
-msgid "Facebook API key is missing."
-msgstr "Facebook-API-Schlüssel nicht gefunden"
+#: ../../mod/tagrm.php:79
+msgid "Remove Item Tag"
+msgstr "Schlagwort des Beitrags entfernen"
-#: ../../addon/facebook/facebook.php:548
-msgid "Facebook Connect"
-msgstr "Mit Facebook verbinden"
+#: ../../mod/tagrm.php:81
+msgid "Select a tag to remove: "
+msgstr "Schlagwort zum entfernen auswählen:"
-#: ../../addon/facebook/facebook.php:554
-msgid "Install Facebook connector for this account."
-msgstr "Facebook-Connector für dieses Konto installieren."
+#: ../../mod/tagrm.php:93 ../../mod/delegate.php:130
+msgid "Remove"
+msgstr "Entferne"
-#: ../../addon/facebook/facebook.php:561
-msgid "Remove Facebook connector"
-msgstr "Facebook-Connector entfernen"
+#: ../../mod/connect.php:55 ../../mod/connect.php:103
+msgid "Continue"
+msgstr "Fortfahren"
-#: ../../addon/facebook/facebook.php:566
-msgid ""
-"Re-authenticate [This is necessary whenever your Facebook password is "
-"changed.]"
-msgstr "Neu authentifizieren [Das ist immer dann nötig, wenn Du Dein Facebook-Passwort geändert hast.]"
+#: ../../mod/connect.php:84
+msgid "Premium Channel Setup"
+msgstr "Prämium-Kanal Einrichtung"
-#: ../../addon/facebook/facebook.php:573
-msgid "Post to Facebook by default"
-msgstr "Veröffentliche standardmäßig bei Facebook"
+#: ../../mod/connect.php:86
+msgid "Enable premium channel connection restrictions"
+msgstr "Einschränkungen für den Prämium-Kanal aktivieren"
-#: ../../addon/facebook/facebook.php:579
+#: ../../mod/connect.php:87
msgid ""
-"Facebook friend linking has been disabled on this site. The following "
-"settings will have no effect."
-msgstr "Das Verlinken von Facebookkontakten wurde auf dieser Seite deaktiviert. Die folgenden Einstellungen haben keinen Effekt."
+"Please enter your restrictions or conditions, such as paypal receipt, usage "
+"guidelines, etc."
+msgstr "Bitte gib deine Nutzungseinschränkungen ein, z.B. Paypal Quittung, Nutzungsbestimmungen etc."
-#: ../../addon/facebook/facebook.php:583
+#: ../../mod/connect.php:89 ../../mod/connect.php:109
msgid ""
-"Facebook friend linking has been disabled on this site. If you disable it, "
-"you will be unable to re-enable it."
-msgstr "Das Verlinken von Facebookkontakten wurde auf dieser Seite deaktiviert. Wenn du es ausgeschaltet hast, kannst du es nicht wieder aktivieren."
+"This channel may require additional steps or acknowledgement of the "
+"following conditions prior to connecting:"
+msgstr "Unter Umständen sind weitere Schritte oder die Bestätigung der folgenden Bedingungen, vor dem Verbinden mit diesem Kanal nötig."
-#: ../../addon/facebook/facebook.php:586
-msgid "Link all your Facebook friends and conversations on this website"
-msgstr "All meine Facebook-Kontakte und -Konversationen hier auf diese Website importieren"
+#: ../../mod/connect.php:90
+msgid ""
+"Potential connections will then see the following text before proceeding:"
+msgstr "Potentielle Verbindungen werden den folgenden Text sehen bevor fortgefahren wird:"
-#: ../../addon/facebook/facebook.php:588
+#: ../../mod/connect.php:91 ../../mod/connect.php:112
msgid ""
-"Facebook conversations consist of your <em>profile wall</em> and your friend"
-" <em>stream</em>."
-msgstr "Facebook-Konversationen bestehen aus deinen Beiträgen auf deiner<em>Pinnwand</em>, sowie den Beiträgen deiner Freunde <em>Stream</em>."
+"By continuing, I certify that I have complied with any instructions provided"
+" on this page."
+msgstr "Mit dem fortfahren bestätige ich die Erfüllung aller Anweisungen die vom Seitenbetreiber erteilt wurden."
-#: ../../addon/facebook/facebook.php:589
-msgid "On this website, your Facebook friend stream is only visible to you."
-msgstr "Hier auf dieser Webseite kannst nur du die Beiträge Deiner Facebook-Freunde (Stream) sehen."
+#: ../../mod/connect.php:100
+msgid "(No specific instructions have been provided by the channel owner.)"
+msgstr "(Der Seitenbetreiber hat keine speziellen Anweisungen für Kanal-Betreiber hinterlegt.)"
-#: ../../addon/facebook/facebook.php:590
-msgid ""
-"The following settings determine the privacy of your Facebook profile wall "
-"on this website."
-msgstr "Mit den folgenden Einstellungen kannst Du die Privatsphäre der Kopie Deiner Facebook-Pinnwand hier auf dieser Seite einstellen."
+#: ../../mod/connect.php:108
+msgid "Restricted or Premium Channel"
+msgstr "Eingeschränkter oder Prämium-Kanal"
-#: ../../addon/facebook/facebook.php:594
-msgid ""
-"On this website your Facebook profile wall conversations will only be "
-"visible to you"
-msgstr "Meine Facebook-Pinnwand hier auf dieser Webseite nur für mich sichtbar machen"
+#: ../../mod/delegate.php:95
+msgid "No potential page delegates located."
+msgstr "Keine potentiellen Bevollmächtigten für die Seite gefunden."
-#: ../../addon/facebook/facebook.php:599
-msgid "Do not import your Facebook profile wall conversations"
-msgstr "Facebook-Pinnwand nicht importieren"
+#: ../../mod/delegate.php:121
+msgid "Delegate Page Management"
+msgstr "Delegiere das Management für die Seite"
-#: ../../addon/facebook/facebook.php:601
+#: ../../mod/delegate.php:123
msgid ""
-"If you choose to link conversations and leave both of these boxes unchecked,"
-" your Facebook profile wall will be merged with your profile wall on this "
-"website and your privacy settings on this website will be used to determine "
-"who may see the conversations."
-msgstr "Wenn Du Facebook-Konversationen importierst und diese beiden Häkchen nicht setzt, wird Deine Facebook-Pinnwand mit der Pinnwand hier auf dieser Webseite vereinigt. Die Privatsphäre-Einstellungen für Deine Pinnwand auf dieser Webseite geben dann an, wer die Konversationen sehen kann."
+"Delegates are able to manage all aspects of this account/page except for "
+"basic account settings. Please do not delegate your personal account to "
+"anybody that you do not trust completely."
+msgstr "Bevollmächtigte sind in der Lage, alle Aspekte dieses Kontos/dieser Seite zu verwalten, abgesehen von den Grundeinstellungen des Kontos. Bitte gib niemandem eine Bevollmächtigung für deinen privaten Account, dem du nicht absolut vertraust!"
-#: ../../addon/facebook/facebook.php:606
-msgid "Comma separated applications to ignore"
-msgstr "Kommaseparierte Anwendungen, die ignoriert werden sollen"
+#: ../../mod/delegate.php:124
+msgid "Existing Page Managers"
+msgstr "Vorhandene Seitenmanager"
-#: ../../addon/facebook/facebook.php:690
-msgid "Problems with Facebook Real-Time Updates"
-msgstr "Probleme mit Facebook Echtzeit-Updates"
+#: ../../mod/delegate.php:126
+msgid "Existing Page Delegates"
+msgstr "Vorhandene Bevollmächtigte für die Seite"
-#: ../../addon/facebook/facebook.php:718
-#: ../../include/contact_selectors.php:81
-msgid "Facebook"
-msgstr "Facebook"
+#: ../../mod/delegate.php:128
+msgid "Potential Delegates"
+msgstr "Potentielle Bevollmächtigte"
-#: ../../addon/facebook/facebook.php:719
-msgid "Facebook Connector Settings"
-msgstr "Facebook-Verbindungseinstellungen"
+#: ../../mod/delegate.php:131
+msgid "Add"
+msgstr "Hinzufügen"
-#: ../../addon/facebook/facebook.php:734
-msgid "Facebook API Key"
-msgstr "Facebook API Schlüssel"
+#: ../../mod/delegate.php:132
+msgid "No entries."
+msgstr "Keine Einträge."
-#: ../../addon/facebook/facebook.php:744
-msgid ""
-"Error: it appears that you have specified the App-ID and -Secret in your "
-".htconfig.php file. As long as they are specified there, they cannot be set "
-"using this form.<br><br>"
-msgstr "Fehler: du scheinst die App-ID und das App-Geheimnis in deiner .htconfig.php Datei angegeben zu haben. Solange sie dort festgelegt werden kannst du dieses Formular hier nicht verwenden.<br><br>"
+#: ../../mod/sources.php:28
+msgid "Failed to create source. No channel selected."
+msgstr "Konnte die Quelle nicht anlegen. Kein Kanal ausgewählt."
-#: ../../addon/facebook/facebook.php:749
-msgid ""
-"Error: the given API Key seems to be incorrect (the application access token"
-" could not be retrieved)."
-msgstr "Fehler: der angegebene API Schlüssel scheint nicht korrekt zu sein (Zugriffstoken konnte nicht empfangen werden)."
+#: ../../mod/sources.php:41
+msgid "Source created."
+msgstr "Quelle erstellt."
-#: ../../addon/facebook/facebook.php:751
-msgid "The given API Key seems to work correctly."
-msgstr "Der angegebene API Schlüssel scheint korrekt zu funktionieren."
+#: ../../mod/sources.php:53
+msgid "Source updated."
+msgstr "Quelle aktualisiert."
-#: ../../addon/facebook/facebook.php:753
-msgid ""
-"The correctness of the API Key could not be detected. Somthing strange's "
-"going on."
-msgstr "Die Echtheit des API Schlüssels konnte nicht überprüft werden. Etwas Merkwürdiges ist hier im Gange."
+#: ../../mod/sources.php:82
+msgid "Manage remote sources of content for your channel."
+msgstr "Entfernte Quellen von Inhalten deines Kanals verwalten."
-#: ../../addon/facebook/facebook.php:756
-msgid "App-ID / API-Key"
-msgstr "App-ID / API-Key"
+#: ../../mod/sources.php:83 ../../mod/sources.php:93
+msgid "New Source"
+msgstr "Neue Quelle"
-#: ../../addon/facebook/facebook.php:757
-msgid "Application secret"
-msgstr "Anwendungs-Geheimnis"
+#: ../../mod/sources.php:94 ../../mod/sources.php:126
+msgid ""
+"Import all or selected content from the following channel into this channel "
+"and distribute it according to your channel settings."
+msgstr "Importiere alle oder ausgewählte Inhalte des folgenden Kanals in diesen Kanal und verteile sie gemäß der Einstellungen dieses Kanals."
-#: ../../addon/facebook/facebook.php:758
-#, php-format
-msgid "Polling Interval in minutes (minimum %1$s minutes)"
-msgstr "Abfrageintervall in Minuten (min %1$s Minuten)"
+#: ../../mod/sources.php:95 ../../mod/sources.php:127
+msgid "Only import content with these words (one per line)"
+msgstr "Importiere ausschließlich Beiträge, die folgende Wörter (eines pro Zeile) enthalten"
-#: ../../addon/facebook/facebook.php:759
-msgid ""
-"Synchronize comments (no comments on Facebook are missed, at the cost of "
-"increased system load)"
-msgstr "Kommentare synchronisieren (Kein Kommentar von Facebook geht verloren, verursacht höhere Last auf dem Server)"
+#: ../../mod/sources.php:95 ../../mod/sources.php:127
+msgid "Leave blank to import all public content"
+msgstr "Leer lassen um alle öffentlichen Beiträge zu importieren"
-#: ../../addon/facebook/facebook.php:763
-msgid "Real-Time Updates"
-msgstr "Echtzeit Aktualisierungen"
+#: ../../mod/sources.php:96 ../../mod/sources.php:130
+#: ../../mod/new_channel.php:110
+msgid "Channel Name"
+msgstr "Channel-Name"
-#: ../../addon/facebook/facebook.php:767
-msgid "Real-Time Updates are activated."
-msgstr "Echtzeit-Updates sind aktiviert."
+#: ../../mod/sources.php:116 ../../mod/sources.php:143
+msgid "Source not found."
+msgstr "Quelle nicht gefunden."
-#: ../../addon/facebook/facebook.php:768
-msgid "Deactivate Real-Time Updates"
-msgstr "Echtzeit-Updates deaktivieren"
+#: ../../mod/sources.php:123
+msgid "Edit Source"
+msgstr "Quelle bearbeiten"
-#: ../../addon/facebook/facebook.php:770
-msgid "Real-Time Updates not activated."
-msgstr "Echtzeit-Updates nicht aktiviert."
+#: ../../mod/sources.php:124
+msgid "Delete Source"
+msgstr "Quelle löschen"
-#: ../../addon/facebook/facebook.php:770
-msgid "Activate Real-Time Updates"
-msgstr "Echtzeit-Updates aktivieren"
+#: ../../mod/sources.php:151
+msgid "Source removed"
+msgstr "Quelle gelöscht"
-#: ../../addon/facebook/facebook.php:789 ../../addon/dav/layout.fnk.php:360
-msgid "The new values have been saved."
-msgstr "Die neuen Einstellungen wurden gespeichert."
+#: ../../mod/sources.php:153
+msgid "Unable to remove source."
+msgstr "Konnte die Quelle nicht löschen."
-#: ../../addon/facebook/facebook.php:813
-msgid "Post to Facebook"
-msgstr "Bei Facebook veröffentlichen"
+#: ../../mod/admin.php:48
+msgid "Theme settings updated."
+msgstr "Theme-Einstellungen aktualisiert."
-#: ../../addon/facebook/facebook.php:911
-msgid ""
-"Post to Facebook cancelled because of multi-network access permission "
-"conflict."
-msgstr "Beitrag wurde nicht bei Facebook veröffentlicht, da Konflikte bei den Multi-Netzwerk-Zugriffsrechten vorliegen."
+#: ../../mod/admin.php:87 ../../mod/admin.php:419
+msgid "Site"
+msgstr "Seite"
-#: ../../addon/facebook/facebook.php:1131
-msgid "View on Friendica"
-msgstr "In Friendica betrachten"
+#: ../../mod/admin.php:88 ../../mod/admin.php:685 ../../mod/admin.php:697
+msgid "Users"
+msgstr "Benutzer"
-#: ../../addon/facebook/facebook.php:1164
-msgid "Facebook post failed. Queued for retry."
-msgstr "Veröffentlichung bei Facebook gescheitert. Wir versuchen es später erneut."
+#: ../../mod/admin.php:89 ../../mod/admin.php:783 ../../mod/admin.php:825
+msgid "Plugins"
+msgstr "Plug-Ins"
-#: ../../addon/facebook/facebook.php:1204
-msgid "Your Facebook connection became invalid. Please Re-authenticate."
-msgstr "Deine Facebook Anmeldedaten sind ungültig geworden. Bitte re-authentifiziere dich."
+#: ../../mod/admin.php:90 ../../mod/admin.php:988 ../../mod/admin.php:1024
+msgid "Themes"
+msgstr "Themes"
-#: ../../addon/facebook/facebook.php:1205
-msgid "Facebook connection became invalid"
-msgstr "Facebook Anmeldedaten sind ungültig geworden"
+#: ../../mod/admin.php:91 ../../mod/admin.php:478
+msgid "Server"
+msgstr "Server"
-#: ../../addon/facebook/facebook.php:1206
-#, php-format
-msgid ""
-"Hi %1$s,\n"
-"\n"
-"The connection between your accounts on %2$s and Facebook became invalid. This usually happens after you change your Facebook-password. To enable the connection again, you have to %3$sre-authenticate the Facebook-connector%4$s."
-msgstr "Hallo %1$s,\n\ndie Verbindung zwischen deinem Account auf %2$s und Facebook funktioniert derzeit nicht. Dies ist normalerweise das Ergebnis einer Passwortänderung bei Facebook. Um die Verbindung wieder zu aktivieren musst du %3$sden Facebook-Connector neu authentifizieren%4$s."
+#: ../../mod/admin.php:92
+msgid "DB updates"
+msgstr "DB-Aktualisierungen"
-#: ../../addon/snautofollow/snautofollow.php:32
-msgid "StatusNet AutoFollow settings updated."
-msgstr "StatusNet AutoFollow Einstellungen aktualisiert."
+#: ../../mod/admin.php:106 ../../mod/admin.php:113 ../../mod/admin.php:1111
+msgid "Logs"
+msgstr "Protokolle"
-#: ../../addon/snautofollow/snautofollow.php:56
-msgid "StatusNet AutoFollow Settings"
-msgstr "StatusNet AutoFollow Einstellungen"
+#: ../../mod/admin.php:112
+msgid "Plugin Features"
+msgstr "Plug-In Funktionen"
-#: ../../addon/snautofollow/snautofollow.php:58
-msgid "Automatically follow any StatusNet followers/mentioners"
-msgstr "Automatisch allen StatusNet Followern/Erwähnungen folgen"
+#: ../../mod/admin.php:114
+msgid "User registrations waiting for confirmation"
+msgstr "Nutzer Anmeldungen die auf Bestätigung warten"
-#: ../../addon/privacy_image_cache/privacy_image_cache.php:182
-msgid "Lifetime of the cache (in hours)"
-msgstr "Lebenszeit des Caches (in Stunden)"
+#: ../../mod/admin.php:188
+msgid "Message queues"
+msgstr "Nachrichten Warteschlange"
-#: ../../addon/privacy_image_cache/privacy_image_cache.php:187
-msgid "Cache Statistics"
-msgstr "Cache Statistik"
+#: ../../mod/admin.php:193 ../../mod/admin.php:418 ../../mod/admin.php:477
+#: ../../mod/admin.php:684 ../../mod/admin.php:782 ../../mod/admin.php:824
+#: ../../mod/admin.php:987 ../../mod/admin.php:1023 ../../mod/admin.php:1110
+msgid "Administration"
+msgstr "Administration"
-#: ../../addon/privacy_image_cache/privacy_image_cache.php:190
-msgid "Number of items"
-msgstr "Anzahl der Einträge"
+#: ../../mod/admin.php:194
+msgid "Summary"
+msgstr "Zusammenfassung"
-#: ../../addon/privacy_image_cache/privacy_image_cache.php:192
-msgid "Size of the cache"
-msgstr "Größe des Caches"
+#: ../../mod/admin.php:196
+msgid "Registered users"
+msgstr "Registrierte Benutzer"
-#: ../../addon/privacy_image_cache/privacy_image_cache.php:194
-msgid "Delete the whole cache"
-msgstr "Cache leeren"
+#: ../../mod/admin.php:198 ../../mod/admin.php:481
+msgid "Pending registrations"
+msgstr "Ausstehende Registrierungen"
-#: ../../addon/widgets/widget_like.php:58
-#, php-format
-msgid "%d person likes this"
-msgid_plural "%d people like this"
-msgstr[0] "%d Person mag das"
-msgstr[1] "%d Leuten mögen das"
+#: ../../mod/admin.php:199
+msgid "Version"
+msgstr "Version"
-#: ../../addon/widgets/widget_like.php:61
-#, php-format
-msgid "%d person doesn't like this"
-msgid_plural "%d people don't like this"
-msgstr[0] " %d Person mag das nicht"
-msgstr[1] "%d Leute mögen das nicht"
+#: ../../mod/admin.php:201 ../../mod/admin.php:482
+msgid "Active plugins"
+msgstr "Aktive Plug-Ins"
-#: ../../addon/widgets/widget_friendheader.php:40
-msgid "Get added to this list!"
-msgstr "Werde Mitglied dieser Liste"
+#: ../../mod/admin.php:342
+msgid "Site settings updated."
+msgstr "Site-Einstellungen aktualisiert."
-#: ../../addon/widgets/widgets.php:56
-msgid "Generate new key"
-msgstr "Neuen Schlüssel erstellen"
+#: ../../mod/admin.php:371 ../../mod/settings.php:700
+msgid "No special theme for mobile devices"
+msgstr "Keine spezielle Theme für mobile Geräte"
-#: ../../addon/widgets/widgets.php:59
-msgid "Widgets key"
-msgstr "Widgets Schlüssel"
+#: ../../mod/admin.php:373
+msgid "No special theme for accessibility"
+msgstr "Kein spezielles Accessibility Theme vorhanden"
-#: ../../addon/widgets/widgets.php:61
-msgid "Widgets available"
-msgstr "Verfügbare Widgets"
+#: ../../mod/admin.php:398
+msgid "Closed"
+msgstr "Geschlossen"
-#: ../../addon/widgets/widget_friends.php:40
-msgid "Connect on Friendica!"
-msgstr "In Friendica verbinden!"
+#: ../../mod/admin.php:399
+msgid "Requires approval"
+msgstr "Genehmigung erforderlich"
-#: ../../addon/yourls/yourls.php:55
-msgid "YourLS Settings"
-msgstr "YourLS Einstellungen"
+#: ../../mod/admin.php:400
+msgid "Open"
+msgstr "Offen"
-#: ../../addon/yourls/yourls.php:57
-msgid "URL: http://"
-msgstr "URL: http://"
+#: ../../mod/admin.php:405
+msgid "Private"
+msgstr "Privat"
-#: ../../addon/yourls/yourls.php:62
-msgid "Username:"
-msgstr "Nutzername:"
+#: ../../mod/admin.php:406
+msgid "Paid Access"
+msgstr "Kostenpflichtiger Zugang"
-#: ../../addon/yourls/yourls.php:67
-msgid "Password:"
-msgstr "Passwort:"
+#: ../../mod/admin.php:407
+msgid "Free Access"
+msgstr "Kostenloser Zugang"
-#: ../../addon/yourls/yourls.php:72
-msgid "Use SSL "
-msgstr "SSL Verwenden "
+#: ../../mod/admin.php:408
+msgid "Tiered Access"
+msgstr "Abgestufter Zugang"
-#: ../../addon/yourls/yourls.php:92
-msgid "yourls Settings saved."
-msgstr "yourls Einstellungen gespeichert"
+#: ../../mod/admin.php:421 ../../mod/register.php:189
+msgid "Registration"
+msgstr "Registrierung"
-#: ../../addon/ljpost/ljpost.php:39
-msgid "Post to LiveJournal"
-msgstr "In LiveJournal veröffentlichen."
+#: ../../mod/admin.php:422
+msgid "File upload"
+msgstr "Dateiupload"
-#: ../../addon/ljpost/ljpost.php:70
-msgid "LiveJournal Post Settings"
-msgstr "LiveJournal Veröffentlichungs-Einstellungen"
+#: ../../mod/admin.php:423
+msgid "Policies"
+msgstr "Richtlinien"
-#: ../../addon/ljpost/ljpost.php:72
-msgid "Enable LiveJournal Post Plugin"
-msgstr "LiveJournal Post Plugin aktivieren"
+#: ../../mod/admin.php:424
+msgid "Advanced"
+msgstr "Fortgeschritten"
-#: ../../addon/ljpost/ljpost.php:77
-msgid "LiveJournal username"
-msgstr "LiveJournal Benutzername"
+#: ../../mod/admin.php:428
+msgid "Site name"
+msgstr "Seitenname"
-#: ../../addon/ljpost/ljpost.php:82
-msgid "LiveJournal password"
-msgstr "LiveJournal Passwort"
+#: ../../mod/admin.php:429
+msgid "Banner/Logo"
+msgstr "Banner/Logo"
-#: ../../addon/ljpost/ljpost.php:87
-msgid "Post to LiveJournal by default"
-msgstr "Standardmäßig bei LiveJournal veröffentlichen"
+#: ../../mod/admin.php:430
+msgid "System language"
+msgstr "System-Sprache"
-#: ../../addon/nsfw/nsfw.php:47
-msgid "Not Safe For Work (General Purpose Content Filter) settings"
-msgstr "Not Safe for Work (allg. Filter für ungewollte Inhalte) Einstellungen:"
+#: ../../mod/admin.php:431
+msgid "System theme"
+msgstr "System-Theme"
-#: ../../addon/nsfw/nsfw.php:49
+#: ../../mod/admin.php:431
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. Du kannst beliebige Wörter in der Filterliste angeben und ihn so als allgemeinen Filter verwenden."
-
-#: ../../addon/nsfw/nsfw.php:50
-msgid "Enable Content filter"
-msgstr "Aktiviere den Inhaltsfilter"
-
-#: ../../addon/nsfw/nsfw.php:53
-msgid "Comma separated list of keywords to hide"
-msgstr "Durch Komma getrennte Liste von Schlüsselwörtern die verborgen werden sollen"
-
-#: ../../addon/nsfw/nsfw.php:58
-msgid "Use /expression/ to provide regular expressions"
-msgstr "Verwende /expression/ um reguläre Ausdrücke zu verwenden"
-
-#: ../../addon/nsfw/nsfw.php:74
-msgid "NSFW Settings saved."
-msgstr "NSFW-Einstellungen gespeichert"
-
-#: ../../addon/nsfw/nsfw.php:121
-#, php-format
-msgid "%s - Click to open/close"
-msgstr "%s – Zum Öffnen/Schließen klicken"
+"Default system theme - may be over-ridden by user profiles - <a href='#' "
+"id='cnftheme'>change theme settings</a>"
+msgstr "Standard System-Theme - kann durch Nutzerprofile überschieben werden - <a href='#' id='cnftheme'>Theme.Einstellungen ändern</a>"
-#: ../../addon/page/page.php:48
-msgid "Forums"
-msgstr "Foren"
+#: ../../mod/admin.php:432
+msgid "Mobile system theme"
+msgstr "Mobile System-Theme:"
-#: ../../addon/page/page.php:63 ../../addon/showmore/showmore.php:87
-#: ../../include/contact_widgets.php:188 ../../include/conversation.php:476
-#: ../../boot.php:524
-msgid "show more"
-msgstr "mehr anzeigen"
+#: ../../mod/admin.php:432
+msgid "Theme for mobile devices"
+msgstr "Theme für mobile Geräte"
-#: ../../addon/planets/planets.php:150
-msgid "Planets Settings"
-msgstr "Planeten Einstellungen"
+#: ../../mod/admin.php:433
+msgid "Accessibility system theme"
+msgstr "Accessibility System-Theme"
-#: ../../addon/planets/planets.php:152
-msgid "Enable Planets Plugin"
-msgstr "Aktiviere Planeten Plugin"
+#: ../../mod/admin.php:433
+msgid "Accessibility theme"
+msgstr "Accessibility Theme"
-#: ../../addon/communityhome/communityhome.php:28
-#: ../../addon/communityhome/communityhome.php:34
-#: ../../addon/communityhome/twillingham/communityhome.php:28
-#: ../../addon/communityhome/twillingham/communityhome.php:34
-#: ../../include/nav.php:64 ../../boot.php:822
-msgid "Login"
-msgstr "Anmeldung"
+#: ../../mod/admin.php:434
+msgid "Channel to use for this website's static pages"
+msgstr "Kanal für die statischen Seiten dieser Webseite verwenden"
-#: ../../addon/communityhome/communityhome.php:29
-#: ../../addon/communityhome/twillingham/communityhome.php:29
-msgid "OpenID"
-msgstr "OpenID"
+#: ../../mod/admin.php:434
+msgid "Site Channel"
+msgstr "Seiten Kanal"
-#: ../../addon/communityhome/communityhome.php:38
-#: ../../addon/communityhome/twillingham/communityhome.php:38
-msgid "Latest users"
-msgstr "Letzte Benutzer"
+#: ../../mod/admin.php:436
+msgid "Maximum image size"
+msgstr "Maximale Bildgröße"
-#: ../../addon/communityhome/communityhome.php:81
-#: ../../addon/communityhome/twillingham/communityhome.php:81
-msgid "Most active users"
-msgstr "Aktivste Nutzer"
+#: ../../mod/admin.php:436
+msgid ""
+"Maximum size in bytes of uploaded images. Default is 0, which means no "
+"limits."
+msgstr "Maximale Größe in Bytes von hochgeladenen Bildern. Standard ist 0, was keine Einschränkung bedeutet."
-#: ../../addon/communityhome/communityhome.php:98
-msgid "Latest photos"
-msgstr "Neueste Fotos"
+#: ../../mod/admin.php:437
+msgid "Register policy"
+msgstr "Registrierungsmethode"
-#: ../../addon/communityhome/communityhome.php:133
-msgid "Latest likes"
-msgstr "Neueste Favoriten"
+#: ../../mod/admin.php:438
+msgid "Access policy"
+msgstr "Zugangsrichtlinien"
-#: ../../addon/communityhome/communityhome.php:155
-#: ../../view/theme/diabook/theme.php:562 ../../include/text.php:1314
-#: ../../include/conversation.php:45 ../../include/conversation.php:118
-msgid "event"
-msgstr "Veranstaltung"
-
-#: ../../addon/dav/common/wdcal_configuration.php:126
-msgid "U.S. Time Format (mm/dd/YYYY)"
-msgstr "U.S. Datumsformat (mm/dd/YYYY)"
-
-#: ../../addon/dav/common/wdcal_configuration.php:205
-msgid "German Time Format (dd.mm.YYYY)"
-msgstr "Deutsches Datumsformat (dd.mm.YYYY)"
-
-#: ../../addon/dav/common/calendar.fnk.php:517
-#: ../../addon/dav/common/calendar.fnk.php:533
-#: ../../addon/dav/layout.fnk.php:200
-msgid "Error"
-msgstr "Fehler"
-
-#: ../../addon/dav/common/calendar.fnk.php:568
-#: ../../addon/dav/common/calendar.fnk.php:637
-#: ../../addon/dav/common/calendar.fnk.php:664
-#: ../../addon/dav/layout.fnk.php:231
-msgid "No access"
-msgstr "Kein Zugriff"
-
-#: ../../addon/dav/layout.fnk.php:119
-msgid "New event"
-msgstr "Neue Veranstaltung"
-
-#: ../../addon/dav/layout.fnk.php:123
-msgid "Today"
-msgstr "Heute"
-
-#: ../../addon/dav/layout.fnk.php:132
-msgid "Day"
-msgstr "Tag"
+#: ../../mod/admin.php:439
+msgid "Register text"
+msgstr "Registrierungstext"
-#: ../../addon/dav/layout.fnk.php:139
-msgid "Week"
-msgstr "Woche"
+#: ../../mod/admin.php:439
+msgid "Will be displayed prominently on the registration page."
+msgstr "Wird gut sichtbar auf der Registrierungsseite angezeigt."
-#: ../../addon/dav/layout.fnk.php:146
-msgid "Month"
-msgstr "Monat"
+#: ../../mod/admin.php:440
+msgid "Accounts abandoned after x days"
+msgstr "Accounts gelten nach X Tagen als unbenutzt"
-#: ../../addon/dav/layout.fnk.php:151
-msgid "Reload"
-msgstr "Neu Laden"
+#: ../../mod/admin.php:440
+msgid ""
+"Will not waste system resources polling external sites for abandonded "
+"accounts. Enter 0 for no time limit."
+msgstr "Verschwende keine Systemressourchen auf das Pollen von externen Seiten wenn das Konto nicht mehr benutzt wird. Trage hier 0 für kein zeitliches Limit."
-#: ../../addon/dav/layout.fnk.php:162
-msgid "Date"
-msgstr "Datum"
+#: ../../mod/admin.php:441
+msgid "Allowed friend domains"
+msgstr "Erlaubte Domains für Kontakte"
-#: ../../addon/dav/layout.fnk.php:224
-msgid "Not found"
-msgstr "Nicht gefunden"
+#: ../../mod/admin.php:441
+msgid ""
+"Comma separated list of domains which are allowed to establish friendships "
+"with this site. Wildcards are accepted. Empty to allow any domains"
+msgstr "Liste der Domains, die für Freundschaften erlaubt sind, durch Kommas getrennt. Platzhalter werden akzeptiert. Leer lassen, um alle Domains zu erlauben."
-#: ../../addon/dav/layout.fnk.php:292 ../../addon/dav/layout.fnk.php:365
-msgid "Go back to the calendar"
-msgstr "Zurück zum Kalender"
+#: ../../mod/admin.php:442
+msgid "Allowed email domains"
+msgstr "Erlaubte Domains für E-Mails"
-#: ../../addon/dav/layout.fnk.php:300
-msgid "Starts"
-msgstr "Beginnt"
+#: ../../mod/admin.php:442
+msgid ""
+"Comma separated list of domains which are allowed in email addresses for "
+"registrations to this site. Wildcards are accepted. Empty to allow any "
+"domains"
+msgstr "Liste der Domains, die für E-Mail-Adressen bei der Registrierung erlaubt sind, durch Kommas getrennt. Platzhalter werden akzeptiert. Leer lassen, um alle Domains zu erlauben."
-#: ../../addon/dav/layout.fnk.php:305
-msgid "Ends"
-msgstr "Endet"
+#: ../../mod/admin.php:443
+msgid "Block public"
+msgstr "Öffentlichen Zugriff blockieren"
-#: ../../addon/dav/layout.fnk.php:312
-msgid "Description"
-msgstr "Beschreibung"
+#: ../../mod/admin.php:443
+msgid ""
+"Check to block public access to all otherwise public personal pages on this "
+"site unless you are currently logged in."
+msgstr "Klicken, um öffentlichen Zugriff auf sonst öffentliche Profile zu blockieren, wenn man nicht eingeloggt ist."
-#: ../../addon/dav/layout.fnk.php:315
-msgid "Notification"
-msgstr "Benachrichtigung"
+#: ../../mod/admin.php:444
+msgid "Force publish"
+msgstr "Veröffentlichung erzwingen"
-#: ../../addon/dav/layout.fnk.php:324
-msgid "Minutes"
-msgstr "Minuten"
+#: ../../mod/admin.php:444
+msgid ""
+"Check to force all profiles on this site to be listed in the site directory."
+msgstr "Klicken, um Anzeige aller Profile dieses Servers im Verzeichnis zu erzwingen."
-#: ../../addon/dav/layout.fnk.php:327
-msgid "Hours"
-msgstr "Stunden"
+#: ../../mod/admin.php:445
+msgid "No login on Homepage"
+msgstr "Kein Login auf der Homepage"
-#: ../../addon/dav/layout.fnk.php:330
-msgid "Days"
-msgstr "Tage"
+#: ../../mod/admin.php:445
+msgid ""
+"Check to hide the login form from your sites homepage when visitors arrive "
+"who are not logged in (e.g. when you put the content of the homepage in via "
+"the site channel)."
+msgstr "Wählen um das Login Formular auf der Startseite der Seite zu verbergen, z.B. weil es das Layout der Homepage des Seiten-Kanals stört."
-#: ../../addon/dav/layout.fnk.php:331
-msgid "before"
-msgstr "vorher"
+#: ../../mod/admin.php:447
+msgid "Proxy user"
+msgstr "Proxy Benutzer"
-#: ../../addon/dav/layout.fnk.php:367
-msgid "Calendar Settings"
-msgstr "Kalender Einstellungen"
+#: ../../mod/admin.php:448
+msgid "Proxy URL"
+msgstr "Proxy URL"
-#: ../../addon/dav/layout.fnk.php:373
-msgid "Date format"
-msgstr "Datumsformat"
+#: ../../mod/admin.php:449
+msgid "Network timeout"
+msgstr "Netzwerk-Timeout"
-#: ../../addon/dav/layout.fnk.php:382
-msgid "Time zone"
-msgstr "Zeitzone"
+#: ../../mod/admin.php:449
+msgid "Value is in seconds. Set to 0 for unlimited (not recommended)."
+msgstr "Der Wert ist in Sekunden. Setze 0 für unbegrenzt (nicht empfohlen)."
-#: ../../addon/dav/layout.fnk.php:387
-msgid "Limitations"
-msgstr "Einschränkungen"
+#: ../../mod/admin.php:450
+msgid "Delivery interval"
+msgstr "Auslieferung Intervall"
-#: ../../addon/dav/layout.fnk.php:391
-msgid "Warning"
-msgstr "Warnung"
+#: ../../mod/admin.php:450
+msgid ""
+"Delay background delivery processes by this many seconds to reduce system "
+"load. Recommend: 4-5 for shared hosts, 2-3 for virtual private servers. 0-1 "
+"for large dedicated servers."
+msgstr "Verzögere im Hintergrund laufende Auslieferungsprozesse um die angegebene Anzahl an Sekunden, um die Systemlast zu verringern. Empfehlungen: 4-5 für Shared-Hosts, 2-3 für VPS, 0-1 für große dedizierte Server."
-#: ../../addon/dav/layout.fnk.php:395
-msgid "Synchronization (iPhone, Thunderbird Lightning, Android, ...)"
-msgstr "Synchronisation (iPhone, Thunderbird Lightning, Android, ...)"
+#: ../../mod/admin.php:451
+msgid "Poll interval"
+msgstr "Abfrageintervall"
-#: ../../addon/dav/layout.fnk.php:402
-msgid "Synchronizing this calendar with the iPhone"
-msgstr "Diesen Kalender mit dem iPhone synchronisieren"
+#: ../../mod/admin.php:451
+msgid ""
+"Delay background polling processes by this many seconds to reduce system "
+"load. If 0, use delivery interval."
+msgstr "Verzögere Hintergrundprozesse, um diese Anzahl an Sekunden um die Systemlast zu reduzieren. Bei 0 Sekunden wird das Auslieferungsintervall verwendet."
-#: ../../addon/dav/layout.fnk.php:413
-msgid "Synchronizing your Friendica-Contacts with the iPhone"
-msgstr "Friendica-Kontakte mit dem iPhone synchronisieren"
+#: ../../mod/admin.php:452
+msgid "Maximum Load Average"
+msgstr "Maximum Load Average"
+
+#: ../../mod/admin.php:452
+msgid ""
+"Maximum system load before delivery and poll processes are deferred - "
+"default 50."
+msgstr "Maximale Systemlast bevor Verteil- und Empfangsprozesse verschoben werden - Standard 50"
-#: ../../addon/dav/dav_carddav_backend_friendica_community.inc.php:37
-msgid "Friendica-Contacts"
-msgstr "Friendica-Kontakte"
+#: ../../mod/admin.php:469
+msgid "No server found"
+msgstr "Kein Server gefunden"
-#: ../../addon/dav/dav_carddav_backend_friendica_community.inc.php:38
-msgid "Your Friendica-Contacts"
-msgstr "Deine Friendica-Kontakte"
+#: ../../mod/admin.php:476 ../../mod/admin.php:698
+msgid "ID"
+msgstr "ID"
-#: ../../addon/dav/main.php:244
-msgid "Calendar"
-msgstr "Kalender"
+#: ../../mod/admin.php:476
+msgid "for channel"
+msgstr "für Kanal"
-#: ../../addon/dav/main.php:247
-msgid "Extended calendar with CalDAV-support"
-msgstr "Erweiterter Kalender mit CalDAV Unterstützung."
+#: ../../mod/admin.php:476
+msgid "on server"
+msgstr "auf Server"
-#: ../../addon/dav/main.php:263
-msgid "The database tables have been installed."
-msgstr "Die Datenbank-Tabellen wurden installiert."
+#: ../../mod/admin.php:476
+msgid "Status"
+msgstr "Status"
-#: ../../addon/dav/main.php:264
-msgid "An error occurred during the installation."
-msgstr "Während der Installation trat ein Fehler auf."
+#: ../../mod/admin.php:496
+msgid "Update has been marked successful"
+msgstr "Update wurde als erfolgreich markiert"
-#: ../../addon/dav/main.php:280
-msgid "No system-wide settings yet."
-msgstr "Momentan keine systemweiten Einstellungen."
+#: ../../mod/admin.php:506
+#, php-format
+msgid "Executing %s failed. Check system logs."
+msgstr "Aufrufen von %s fehlgeschlagen. Überprüfe die Systemlogs."
-#: ../../addon/dav/main.php:283
-msgid "Database status"
-msgstr "Datenbank Status"
+#: ../../mod/admin.php:509
+#, php-format
+msgid "Update %s was successfully applied."
+msgstr "Update %s wurde erfolgreich angewandt."
-#: ../../addon/dav/main.php:286
-msgid "Installed"
-msgstr "Installiert"
+#: ../../mod/admin.php:513
+#, php-format
+msgid "Update %s did not return a status. Unknown if it succeeded."
+msgstr "Update %s liefert keinen Rückgabewert. Unbekannt ob es erfolgreich war."
-#: ../../addon/dav/main.php:289
-msgid "Upgrade needed"
-msgstr "Upgrade erforderlich"
+#: ../../mod/admin.php:516
+#, php-format
+msgid "Update function %s could not be found."
+msgstr "Update Funktion %s konnte nicht gefunden werden."
-#: ../../addon/dav/main.php:289
-msgid "Upgrade"
-msgstr "Upgrade"
+#: ../../mod/admin.php:531
+msgid "No failed updates."
+msgstr "Keine fehlgeschlagenen Aktualisierungen."
-#: ../../addon/dav/main.php:292
-msgid "Not installed"
-msgstr "Nicht installiert"
+#: ../../mod/admin.php:535
+msgid "Failed Updates"
+msgstr "Fehlgeschlagene Aktualisierungen"
-#: ../../addon/dav/main.php:292
-msgid "Install"
-msgstr "Installieren"
+#: ../../mod/admin.php:537
+msgid "Mark success (if update was manually applied)"
+msgstr "Als erfolgreich markieren (wenn das Update manuell angewandt wurde)"
-#: ../../addon/dav/main.php:297
-msgid "Troubleshooting"
-msgstr "Problembehebung"
+#: ../../mod/admin.php:538
+msgid "Attempt to execute this update step automatically"
+msgstr "Versuche diesen Updateschritt automatisch anzuwenden"
-#: ../../addon/dav/main.php:298
-msgid "Manual creation of the database tables:"
-msgstr "Manuelles anlegen der Datenbank Tabellen:"
+#: ../../mod/admin.php:564
+#, php-format
+msgid "%s user blocked/unblocked"
+msgid_plural "%s users blocked/unblocked"
+msgstr[0] "%s Nutzer blockiert/freigegeben"
+msgstr[1] "%s Nutzer blockiert/freigegeben"
-#: ../../addon/dav/main.php:299
-msgid "Show SQL-statements"
-msgstr "SQL-Anweisungen anzeigen"
+#: ../../mod/admin.php:571
+#, php-format
+msgid "%s user deleted"
+msgid_plural "%s users deleted"
+msgstr[0] "%s Nutzer gelöscht"
+msgstr[1] "%s Nutzer gelöscht"
-#: ../../addon/dav/calendar.friendica.fnk.php:151
-msgid "Private Calendar"
-msgstr "Privater Kalender"
+#: ../../mod/admin.php:602
+msgid "Account not found"
+msgstr "Konto nicht gefunden"
-#: ../../addon/dav/calendar.friendica.fnk.php:158
-msgid "Friendica Events: Mine"
-msgstr "Meine Friendica-Veranstaltungen"
+#: ../../mod/admin.php:613
+#, php-format
+msgid "User '%s' deleted"
+msgstr "Benutzer '%s' gelöscht"
-#: ../../addon/dav/calendar.friendica.fnk.php:161
-msgid "Friendica Events: Contacts"
-msgstr "Friendica Veranstaltungen meiner Kontakte"
+#: ../../mod/admin.php:622
+#, php-format
+msgid "User '%s' unblocked"
+msgstr "Benutzer '%s' freigegeben"
-#: ../../addon/uhremotestorage/uhremotestorage.php:84
+#: ../../mod/admin.php:622
#, php-format
-msgid ""
-"Allow to use your friendica id (%s) to connecto to external unhosted-enabled"
-" storage (like ownCloud). See <a "
-"href=\"http://www.w3.org/community/unhosted/wiki/RemoteStorage#WebFinger\">RemoteStorage"
-" WebFinger</a>"
-msgstr "Ermöglicht dir, deine friendica id (%s) mit externen unhosted-fähigen Speichern (z.B. ownCloud) zu verbinden. Siehe <a href=\"http://www.w3.org/community/unhosted/wiki/RemoteStorage#WebFinger\">RemoteStorage WebFinger</a>"
+msgid "User '%s' blocked"
+msgstr "Benutzer '%s' blockiert"
-#: ../../addon/uhremotestorage/uhremotestorage.php:85
-msgid "Template URL (with {category})"
-msgstr "Vorlagen URL (mit {Kategorie})"
+#: ../../mod/admin.php:687
+msgid "select all"
+msgstr "Alle auswählen"
-#: ../../addon/uhremotestorage/uhremotestorage.php:86
-msgid "OAuth end-point"
-msgstr "OAuth end-point"
+#: ../../mod/admin.php:688
+msgid "User registrations waiting for confirm"
+msgstr "Neuanmeldungen, die auf deine Bestätigung warten"
+
+#: ../../mod/admin.php:689
+msgid "Request date"
+msgstr "Antragsdatum"
+
+#: ../../mod/admin.php:689 ../../mod/settings.php:509
+#: ../../mod/settings.php:535
+msgid "Name"
+msgstr "Name"
-#: ../../addon/uhremotestorage/uhremotestorage.php:87
-msgid "Api"
-msgstr "Api"
+#: ../../mod/admin.php:690
+msgid "No registrations."
+msgstr "Keine Registrierungen."
-#: ../../addon/membersince/membersince.php:18
-msgid "Member since:"
-msgstr "Mitglied seit:"
+#: ../../mod/admin.php:691
+msgid "Approve"
+msgstr "Genehmigen"
-#: ../../addon/tictac/tictac.php:20
-msgid "Three Dimensional Tic-Tac-Toe"
-msgstr "Dreidimensionales Tic-Tac-Toe"
+#: ../../mod/admin.php:692
+msgid "Deny"
+msgstr "Verweigern"
-#: ../../addon/tictac/tictac.php:53
-msgid "3D Tic-Tac-Toe"
-msgstr "3D Tic-Tac-Toe"
+#: ../../mod/admin.php:698
+msgid "Register date"
+msgstr "Registrierungs-Datum"
-#: ../../addon/tictac/tictac.php:58
-msgid "New game"
-msgstr "Neues Spiel"
+#: ../../mod/admin.php:698
+msgid "Last login"
+msgstr "Letzte Anmeldung"
-#: ../../addon/tictac/tictac.php:59
-msgid "New game with handicap"
-msgstr "Neues Handicap Spiel"
+#: ../../mod/admin.php:698
+msgid "Expires"
+msgstr "Verfällt"
-#: ../../addon/tictac/tictac.php:60
-msgid ""
-"Three dimensional tic-tac-toe is just like the traditional game except that "
-"it is played on multiple levels simultaneously. "
-msgstr "3D-Tic-Tac-Toe ist genauso wie das herkömmliche Spiel, nur dass man es auf mehreren Ebenen gleichzeitig spielt."
+#: ../../mod/admin.php:698
+msgid "Service Class"
+msgstr "Service-Klasse"
-#: ../../addon/tictac/tictac.php:61
+#: ../../mod/admin.php:700
msgid ""
-"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."
-msgstr "In diesem Fall sind es drei Ebenen. Man gewinnt indem man drei in einer Reihe auf einer beliebigen Reihe schafft, oder drei übereinander oder diagonal auf verschiedenen Ebenen."
+"Selected users will be deleted!\\n\\nEverything these users had posted on "
+"this site will be permanently deleted!\\n\\nAre you sure?"
+msgstr "Markierte Nutzer werden gelöscht\\n\\nAlles was diese Nutzer auf dieser Seite veröffentlicht haben wird permanent gelöscht\\n\\nBist du sicher?"
-#: ../../addon/tictac/tictac.php:63
+#: ../../mod/admin.php:701
msgid ""
-"The handicap game disables the center position on the middle level because "
-"the player claiming this square often has an unfair advantage."
-msgstr "Beim Handicap-Spiel wird die zentrale Position der mittleren Ebene gesperrt, da der Spieler, der diese Ebene besitzt, oft einen unfairen Vorteil genießt."
-
-#: ../../addon/tictac/tictac.php:182
-msgid "You go first..."
-msgstr "Du fängst an..."
-
-#: ../../addon/tictac/tictac.php:187
-msgid "I'm going first this time..."
-msgstr "Diesmal fange ich an..."
-
-#: ../../addon/tictac/tictac.php:193
-msgid "You won!"
-msgstr "Du gewinnst!"
-
-#: ../../addon/tictac/tictac.php:199 ../../addon/tictac/tictac.php:224
-msgid "\"Cat\" game!"
-msgstr "Unentschieden!"
-
-#: ../../addon/tictac/tictac.php:222
-msgid "I won!"
-msgstr "Ich gewinne!"
+"The user {0} will be deleted!\\n\\nEverything this user has posted on this "
+"site will be permanently deleted!\\n\\nAre you sure?"
+msgstr "Der Nutzer {0} wird gelöscht\\n\\nAlles was dieser Nutzer auf dieser Seite veröffentlicht hat wird permanent gelöscht werden\\n\\nBist du sicher?"
-#: ../../addon/randplace/randplace.php:169
-msgid "Randplace Settings"
-msgstr "Randplace-Einstellungen"
+#: ../../mod/admin.php:742
+#, php-format
+msgid "Plugin %s disabled."
+msgstr "Plug-In %s deaktiviert."
-#: ../../addon/randplace/randplace.php:171
-msgid "Enable Randplace Plugin"
-msgstr "Randplace-Plugin aktivieren"
+#: ../../mod/admin.php:746
+#, php-format
+msgid "Plugin %s enabled."
+msgstr "Plug-In %s aktiviert."
-#: ../../addon/dwpost/dwpost.php:39
-msgid "Post to Dreamwidth"
-msgstr "In Dreamwidth veröffentlichen"
+#: ../../mod/admin.php:756 ../../mod/admin.php:958
+msgid "Disable"
+msgstr "Deaktivieren"
-#: ../../addon/dwpost/dwpost.php:70
-msgid "Dreamwidth Post Settings"
-msgstr "Dreamwidth Veröffentlichungs-Einstellungen"
+#: ../../mod/admin.php:758 ../../mod/admin.php:960
+msgid "Enable"
+msgstr "Aktivieren"
-#: ../../addon/dwpost/dwpost.php:72
-msgid "Enable dreamwidth Post Plugin"
-msgstr "Dreamwidth Post Plugin aktivieren"
+#: ../../mod/admin.php:784 ../../mod/admin.php:989
+msgid "Toggle"
+msgstr "Umschalten"
-#: ../../addon/dwpost/dwpost.php:77
-msgid "dreamwidth username"
-msgstr "Dreamwidth Benutzername"
+#: ../../mod/admin.php:792 ../../mod/admin.php:999
+msgid "Author: "
+msgstr "Autor: "
-#: ../../addon/dwpost/dwpost.php:82
-msgid "dreamwidth password"
-msgstr "Dreamwidth Passwort"
+#: ../../mod/admin.php:793 ../../mod/admin.php:1000
+msgid "Maintainer: "
+msgstr "Betreuer:"
-#: ../../addon/dwpost/dwpost.php:87
-msgid "Post to dreamwidth by default"
-msgstr "Standardmäßig bei Dreamwidth veröffentlichen"
+#: ../../mod/admin.php:922
+msgid "No themes found."
+msgstr "Keine Theme gefunden."
-#: ../../addon/drpost/drpost.php:35
-msgid "Post to Drupal"
-msgstr "Bei Drupal veröffentlichen"
+#: ../../mod/admin.php:981
+msgid "Screenshot"
+msgstr "Bildschirmfoto"
-#: ../../addon/drpost/drpost.php:72
-msgid "Drupal Post Settings"
-msgstr "Drupal-Beitragseinstellungen"
+#: ../../mod/admin.php:1029
+msgid "[Experimental]"
+msgstr "[Experimentell]"
-#: ../../addon/drpost/drpost.php:74
-msgid "Enable Drupal Post Plugin"
-msgstr "Veröffentlichung bei Drupal erlauben"
+#: ../../mod/admin.php:1030
+msgid "[Unsupported]"
+msgstr "[Nicht unterstützt]"
-#: ../../addon/drpost/drpost.php:79
-msgid "Drupal username"
-msgstr "Drupal Nutzername"
+#: ../../mod/admin.php:1057
+msgid "Log settings updated."
+msgstr "Protokoll-Einstellungen aktualisiert."
-#: ../../addon/drpost/drpost.php:84
-msgid "Drupal password"
-msgstr "Drupal Passwort"
+#: ../../mod/admin.php:1113
+msgid "Clear"
+msgstr "Leeren"
-#: ../../addon/drpost/drpost.php:89
-msgid "Post Type - article,page,or blog"
-msgstr "Beitragstyp - Artikel, Seite oder Blog"
+#: ../../mod/admin.php:1119
+msgid "Debugging"
+msgstr "Debugging"
-#: ../../addon/drpost/drpost.php:94
-msgid "Drupal site URL"
-msgstr "URL der Drupal Seite"
+#: ../../mod/admin.php:1120
+msgid "Log file"
+msgstr "Protokolldatei"
-#: ../../addon/drpost/drpost.php:99
-msgid "Drupal site uses clean URLS"
-msgstr "Drupal Seite verwendet bereinigte URLs"
+#: ../../mod/admin.php:1120
+msgid ""
+"Must be writable by web server. Relative to your Red top-level directory."
+msgstr "Muss für den Web-Server schreibbar sein. Relativ zum Red Stammverzeichnis."
-#: ../../addon/drpost/drpost.php:104
-msgid "Post to Drupal by default"
-msgstr "Veröffentliche öffentliche Beiträge standardmäßig bei Drupal"
+#: ../../mod/admin.php:1121
+msgid "Log level"
+msgstr "Protokollstufe"
-#: ../../addon/drpost/drpost.php:184 ../../addon/wppost/wppost.php:199
-#: ../../addon/blogger/blogger.php:172 ../../addon/posterous/posterous.php:189
-msgid "Post from Friendica"
-msgstr "Beitrag via Friendica"
+#: ../../mod/mitem.php:14 ../../mod/menu.php:87
+msgid "Menu not found."
+msgstr "Menü nicht gefunden"
-#: ../../addon/startpage/startpage.php:83
-msgid "Startpage Settings"
-msgstr "Startseiten-Einstellungen"
+#: ../../mod/mitem.php:47
+msgid "Menu element updated."
+msgstr "Menü-Element aktualisiert."
-#: ../../addon/startpage/startpage.php:85
-msgid "Home page to load after login - leave blank for profile wall"
-msgstr "Seite, die nach dem Anmelden geladen werden soll. Leer = Pinnwand"
+#: ../../mod/mitem.php:51
+msgid "Unable to update menu element."
+msgstr "Kann Menü-Element nicht aktualisieren."
-#: ../../addon/startpage/startpage.php:88
-msgid "Examples: &quot;network&quot; or &quot;notifications/system&quot;"
-msgstr "Beispiele: network, notifications/system"
+#: ../../mod/mitem.php:57
+msgid "Menu element added."
+msgstr "Menü-Bestandteil hinzugefügt."
-#: ../../addon/geonames/geonames.php:143
-msgid "Geonames settings updated."
-msgstr "Geonames Einstellungen aktualisiert"
+#: ../../mod/mitem.php:61
+msgid "Unable to add menu element."
+msgstr "Kann Menü-Bestandteil nicht hinzufügen."
-#: ../../addon/geonames/geonames.php:179
-msgid "Geonames Settings"
-msgstr "Geonames Einstellungen"
+#: ../../mod/mitem.php:78 ../../mod/xchan.php:25 ../../mod/menu.php:113
+#: ../../mod/dirprofile.php:176
+msgid "Not found."
+msgstr "Nicht gefunden."
-#: ../../addon/geonames/geonames.php:181
-msgid "Enable Geonames Plugin"
-msgstr "Geonames Plugin aktivieren"
+#: ../../mod/mitem.php:96
+msgid "Manage Menu Elements"
+msgstr "Menü-Bestandteile verwalten"
-#: ../../addon/public_server/public_server.php:126
-#: ../../addon/testdrive/testdrive.php:94
-#, php-format
-msgid "Your account on %s will expire in a few days."
-msgstr "Dein Konto auf %s wird in ein paar Tagen verfallen."
+#: ../../mod/mitem.php:99
+msgid "Edit menu"
+msgstr "Menü bearbeiten"
-#: ../../addon/public_server/public_server.php:127
-msgid "Your Friendica account is about to expire."
-msgstr "Dein Friendica-Konto wird in Kürze auslaufen."
+#: ../../mod/mitem.php:102
+msgid "Edit element"
+msgstr "Bestandteil bearbeiten"
-#: ../../addon/public_server/public_server.php:128
-#, php-format
-msgid ""
-"Hi %1$s,\n"
-"\n"
-"Your 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"
-msgstr "Hallo %1$s,\n\ndein Account auf %2$s wird in weniger als fünf Tagen auslaufen. Du kannst das verhindern, indem du dich mindestens einmal alle 30 Tage anmeldest."
-
-#: ../../addon/js_upload/js_upload.php:43
-msgid "Upload a file"
-msgstr "Datei hochladen"
-
-#: ../../addon/js_upload/js_upload.php:44
-msgid "Drop files here to upload"
-msgstr "Ziehe Dateien hierher, um sie hochzuladen"
-
-#: ../../addon/js_upload/js_upload.php:46
-msgid "Failed"
-msgstr "Fehlgeschlagen"
-
-#: ../../addon/js_upload/js_upload.php:297
-msgid "No files were uploaded."
-msgstr "Keine Dateien hochgeladen."
-
-#: ../../addon/js_upload/js_upload.php:303
-msgid "Uploaded file is empty"
-msgstr "Hochgeladene Datei ist leer"
-
-#: ../../addon/js_upload/js_upload.php:326
-msgid "File has an invalid extension, it should be one of "
-msgstr "Die Dateierweiterung ist nicht erlaubt, sie muss eine der folgenden sein "
-
-#: ../../addon/js_upload/js_upload.php:337
-msgid "Upload was cancelled, or server error encountered"
-msgstr "Upload abgebrochen oder Serverfehler aufgetreten"
-
-#: ../../addon/oembed.old/oembed.php:30
-msgid "OEmbed settings updated"
-msgstr "OEmbed Einstellungen aktualisiert."
-
-#: ../../addon/oembed.old/oembed.php:43
-msgid "Use OEmbed for YouTube videos"
-msgstr "OEmbed für Youtube Videos verwenden"
-
-#: ../../addon/oembed.old/oembed.php:71
-msgid "URL to embed:"
-msgstr "URL zum Einbetten:"
-
-#: ../../addon/impressum/impressum.php:36
-msgid "Impressum"
-msgstr "Impressum"
-
-#: ../../addon/impressum/impressum.php:49
-#: ../../addon/impressum/impressum.php:51
-#: ../../addon/impressum/impressum.php:83
-msgid "Site Owner"
-msgstr "Betreiber der Seite"
-
-#: ../../addon/impressum/impressum.php:49
-#: ../../addon/impressum/impressum.php:87
-msgid "Email Address"
-msgstr "Email Adresse"
+#: ../../mod/mitem.php:103
+msgid "Drop element"
+msgstr "Bestandteil löschen"
-#: ../../addon/impressum/impressum.php:54
-#: ../../addon/impressum/impressum.php:85
-msgid "Postal Address"
-msgstr "Postalische Anschrift"
+#: ../../mod/mitem.php:104
+msgid "New element"
+msgstr "Neues Bestandteil"
-#: ../../addon/impressum/impressum.php:60
-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."
+#: ../../mod/mitem.php:105
+msgid "Edit this menu container"
+msgstr "Diesen Menü-Container bearbeiten"
-#: ../../addon/impressum/impressum.php:83
-msgid "The page operators name."
-msgstr "Name des Serveradministrators"
+#: ../../mod/mitem.php:106
+msgid "Add menu element"
+msgstr "Menüelement hinzufügen"
-#: ../../addon/impressum/impressum.php:84
-msgid "Site Owners Profile"
-msgstr "Profil des Seitenbetreibers"
+#: ../../mod/mitem.php:107
+msgid "Delete this menu item"
+msgstr "Lösche dieses Menü-Bestandteil"
-#: ../../addon/impressum/impressum.php:84
-msgid "Profile address of the operator."
-msgstr "Profil-Adresse des Serveradministrators"
+#: ../../mod/mitem.php:108
+msgid "Edit this menu item"
+msgstr "Bearbeite dieses Menü-Bestandteil"
-#: ../../addon/impressum/impressum.php:85
-msgid "How to contact the operator via snail mail. You can use BBCode here."
-msgstr "Kontaktmöglichkeiten zum Administrator via Schneckenpost. Du kannst BBCode verwenden."
+#: ../../mod/mitem.php:131
+msgid "New Menu Element"
+msgstr "Neues Menü-Bestandteil"
-#: ../../addon/impressum/impressum.php:86
-msgid "Notes"
-msgstr "Hinweise"
+#: ../../mod/mitem.php:133 ../../mod/mitem.php:176
+msgid "Menu Item Permissions"
+msgstr "Menü-Element Zugriffsrechte"
-#: ../../addon/impressum/impressum.php:86
-msgid ""
-"Additional notes that are displayed beneath the contact information. You can"
-" use BBCode here."
-msgstr "Zusätzliche Informationen die neben den Kontaktmöglichkeiten angezeigt werden. Du kannst BBCode verwenden."
+#: ../../mod/mitem.php:134 ../../mod/mitem.php:177 ../../mod/settings.php:930
+msgid "(click to open/close)"
+msgstr "(zum öffnen/schließen anklicken)"
-#: ../../addon/impressum/impressum.php:87
-msgid "How to contact the operator via email. (will be displayed obfuscated)"
-msgstr "Wie man den Betreiber per Email erreicht. (Adresse wird verschleiert dargestellt)"
+#: ../../mod/mitem.php:136 ../../mod/mitem.php:180
+msgid "Link text"
+msgstr "Link Text"
-#: ../../addon/impressum/impressum.php:88
-msgid "Footer note"
-msgstr "Fußnote"
+#: ../../mod/mitem.php:137 ../../mod/mitem.php:181
+msgid "URL of link"
+msgstr "URL des Links"
-#: ../../addon/impressum/impressum.php:88
-msgid "Text for the footer. You can use BBCode here."
-msgstr "Text für die Fußzeile. Du kannst BBCode verwenden."
+#: ../../mod/mitem.php:138 ../../mod/mitem.php:182
+msgid "Use Red magic-auth if available"
+msgstr "Verwende Red Magic-Auth wenn verfügbar"
-#: ../../addon/buglink/buglink.php:15
-msgid "Report Bug"
-msgstr "Fehlerreport erstellen"
+#: ../../mod/mitem.php:139 ../../mod/mitem.php:183
+msgid "Open link in new window"
+msgstr "Öffne Link in neuem Fenster"
-#: ../../addon/notimeline/notimeline.php:32
-msgid "No Timeline settings updated."
-msgstr "Keine Timeline-Einstellungen aktualisiert."
+#: ../../mod/mitem.php:141 ../../mod/mitem.php:185
+msgid "Order in list"
+msgstr "Reihenfolge in der Liste"
-#: ../../addon/notimeline/notimeline.php:56
-msgid "No Timeline Settings"
-msgstr "Keine Timeline-Einstellungen"
+#: ../../mod/mitem.php:141 ../../mod/mitem.php:185
+msgid "Higher numbers will sink to bottom of listing"
+msgstr "Größere Nummern werden weiter unten in der Auflistung einsortiert"
-#: ../../addon/notimeline/notimeline.php:58
-msgid "Disable Archive selector on profile wall"
-msgstr "Deaktiviere Archiv-Auswahl auf Deiner Pinnwand"
+#: ../../mod/mitem.php:142 ../../mod/menu.php:79 ../../mod/new_channel.php:117
+msgid "Create"
+msgstr "Erstelle"
-#: ../../addon/blockem/blockem.php:51
-msgid "\"Blockem\" Settings"
-msgstr "\"Blockem\"-Einstellungen"
+#: ../../mod/mitem.php:154
+msgid "Menu item not found."
+msgstr "Menü-Bestandteil nicht gefunden."
-#: ../../addon/blockem/blockem.php:53
-msgid "Comma separated profile URLS to block"
-msgstr "Profil-URLs, die blockiert werden sollen (durch Kommas getrennt)"
+#: ../../mod/mitem.php:163
+msgid "Menu item deleted."
+msgstr "Menü-Bestandteil gelöscht."
-#: ../../addon/blockem/blockem.php:70
-msgid "BLOCKEM Settings saved."
-msgstr "BLOCKEM-Einstellungen gesichert."
+#: ../../mod/mitem.php:165
+msgid "Menu item could not be deleted."
+msgstr "Menü-Bestandteil kann nicht gelöscht werden."
-#: ../../addon/blockem/blockem.php:105
-#, php-format
-msgid "Blocked %s - Click to open/close"
-msgstr "%s blockiert - Zum Öffnen/Schließen klicken"
+#: ../../mod/mitem.php:174
+msgid "Edit Menu Element"
+msgstr "Bearbeite Menü-Bestandteil"
-#: ../../addon/blockem/blockem.php:160
-msgid "Unblock Author"
-msgstr "Autor freischalten"
+#: ../../mod/mitem.php:186 ../../mod/menu.php:107
+msgid "Modify"
+msgstr "Ändern"
-#: ../../addon/blockem/blockem.php:162
-msgid "Block Author"
-msgstr "Autor blockieren"
+#: ../../mod/group.php:20
+msgid "Collection created."
+msgstr "Sammlung erstellt."
-#: ../../addon/blockem/blockem.php:194
-msgid "blockem settings updated"
-msgstr "blockem Einstellungen aktualisiert"
+#: ../../mod/group.php:26
+msgid "Could not create collection."
+msgstr "Sammlung kann nicht erstellt werden."
-#: ../../addon/qcomment/qcomment.php:51
-msgid ":-)"
-msgstr ":-)"
+#: ../../mod/group.php:54
+msgid "Collection updated."
+msgstr "Sammlung aktualisiert."
-#: ../../addon/qcomment/qcomment.php:51
-msgid ":-("
-msgstr ":-("
+#: ../../mod/group.php:86
+msgid "Create a collection of channels."
+msgstr "Erstelle eine Sammlung von Kanälen."
-#: ../../addon/qcomment/qcomment.php:51
-msgid "lol"
-msgstr "lol"
+#: ../../mod/group.php:87 ../../mod/group.php:183
+msgid "Collection Name: "
+msgstr "Name der Sammlung:"
-#: ../../addon/qcomment/qcomment.php:54
-msgid "Quick Comment Settings"
-msgstr "Schnell-Kommentar Einstellungen"
+#: ../../mod/group.php:89 ../../mod/group.php:186
+msgid "Members are visible to other channels"
+msgstr "Mitglieder sind sichtbar für andere Kanäle"
-#: ../../addon/qcomment/qcomment.php:56
-msgid ""
-"Quick comments are found near comment boxes, sometimes hidden. Click them to"
-" provide simple replies."
-msgstr "Kurzkommentare findet man in der Nähe der Kommentarboxen. Ein Klick darauf erstellt einfache Antworten."
+#: ../../mod/group.php:107
+msgid "Collection removed."
+msgstr "Sammlung gelöscht."
-#: ../../addon/qcomment/qcomment.php:57
-msgid "Enter quick comments, one per line"
-msgstr "Gib einen Schnell-Kommentar pro Zeile ein"
+#: ../../mod/group.php:109
+msgid "Unable to remove collection."
+msgstr "Löschen der Sammlung nicht möglich."
-#: ../../addon/qcomment/qcomment.php:75
-msgid "Quick Comment settings saved."
-msgstr "Schnell-Kommentare Einstellungen gespeichert"
+#: ../../mod/group.php:182
+msgid "Collection Editor"
+msgstr "Sammlung-Editor"
-#: ../../addon/openstreetmap/openstreetmap.php:71
-msgid "Tile Server URL"
-msgstr "Tile Server URL"
+#: ../../mod/group.php:196
+msgid "Members"
+msgstr "Mitglieder"
-#: ../../addon/openstreetmap/openstreetmap.php:71
-msgid ""
-"A list of <a href=\"http://wiki.openstreetmap.org/wiki/TMS\" "
-"target=\"_blank\">public tile servers</a>"
-msgstr "Eine Liste <a href=\"http://wiki.openstreetmap.org/wiki/TMS\" target=\"_blank\">öffentlicher Tile Server</a>"
+#: ../../mod/group.php:198
+msgid "All Connected Channels"
+msgstr "Alle verbundene Channels"
-#: ../../addon/openstreetmap/openstreetmap.php:72
-msgid "Default zoom"
-msgstr "Standard Zoom"
+#: ../../mod/group.php:231
+msgid "Click on a channel to add or remove."
+msgstr "Wähle einen Kanal zum hinzufügen oder entfernen aus."
-#: ../../addon/openstreetmap/openstreetmap.php:72
-msgid "The default zoom level. (1:world, 18:highest)"
-msgstr "Standard Zoomlevel (1: Welt; 18: höchstes)"
+#: ../../mod/photos.php:77
+msgid "Page owner information could not be retrieved."
+msgstr "Informationen über den Betreiber der Seite konnten nicht gefunden werden."
-#: ../../addon/libertree/libertree.php:36
-msgid "Post to libertree"
-msgstr "bei libertree veröffentlichen"
+#: ../../mod/photos.php:97
+msgid "Album not found."
+msgstr "Album nicht gefunden."
-#: ../../addon/libertree/libertree.php:67
-msgid "libertree Post Settings"
-msgstr "libertree Post Einstellungen"
+#: ../../mod/photos.php:119 ../../mod/photos.php:799
+msgid "Delete Album"
+msgstr "Album löschen"
-#: ../../addon/libertree/libertree.php:69
-msgid "Enable Libertree Post Plugin"
-msgstr "Libertree Post Plugin aktivieren"
+#: ../../mod/photos.php:159 ../../mod/photos.php:1061
+msgid "Delete Photo"
+msgstr "Foto löschen"
-#: ../../addon/libertree/libertree.php:74
-msgid "Libertree API token"
-msgstr "Libertree API Token"
+#: ../../mod/photos.php:500
+#, php-format
+msgid "%1$s was tagged in %2$s by %3$s"
+msgstr "%1$s wurde auf %2$s von %3$s getaggt"
-#: ../../addon/libertree/libertree.php:79
-msgid "Libertree site URL"
-msgstr "Libertree URL"
+#: ../../mod/photos.php:500
+msgid "a photo"
+msgstr "Foto"
-#: ../../addon/libertree/libertree.php:84
-msgid "Post to Libertree by default"
-msgstr "Standardmäßig bei libertree veröffentlichen"
+#: ../../mod/photos.php:583
+msgid "No photos selected"
+msgstr "Keine Fotos ausgewählt"
-#: ../../addon/mathjax/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 "Mit dem MathJax Addon können mathematische Formeln, die mit LaTeX geschrieben wurden, dargestellt werden. Die Formel wird mit den üblichen $$ oder einem eqnarray Block gekennzeichnet. Formeln werden in allen Beiträgen auf deiner Pinnwand, dem Netzwerkstream sowie privaten Nachrichten gerendert."
+#: ../../mod/photos.php:630
+msgid "Access to this item is restricted."
+msgstr "Zugriff auf dieses Foto wurde eingeschränkt."
-#: ../../addon/mathjax/mathjax.php:38
-msgid "Use the MathJax renderer"
-msgstr "MathJax verwenden"
+#: ../../mod/photos.php:704
+#, php-format
+msgid "You have used %1$.2f Mbytes of %2$.2f Mbytes photo storage."
+msgstr "Du benutzt %1$.2f MBytes deines %2$.2f MBytes großen Bilder-Speichers."
-#: ../../addon/mathjax/mathjax.php:74
-msgid "MathJax Base URL"
-msgstr "MathJax Basis-URL"
+#: ../../mod/photos.php:707
+#, php-format
+msgid "You have used %1$.2f Mbytes of photo storage."
+msgstr "Du verwendets %1$.2f MBytes deines Foto-Speichers."
-#: ../../addon/mathjax/mathjax.php:74
-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 "Die URL der MathJax Javascript-Datei, die verwendet werden soll. Diese kann entweder aus der MathJax CDN oder einer anderen Quelle stammen."
+#: ../../mod/photos.php:726
+msgid "Upload Photos"
+msgstr "Fotos hochladen"
-#: ../../addon/editplain/editplain.php:46
-msgid "Editplain settings updated."
-msgstr "Editplain Einstellungen aktualisiert"
+#: ../../mod/photos.php:730 ../../mod/photos.php:794
+msgid "New album name: "
+msgstr "Name des neuen Albums:"
-#: ../../addon/editplain/editplain.php:76
-msgid "Editplain Settings"
-msgstr "Editplain Einstellungen"
+#: ../../mod/photos.php:731
+msgid "or existing album name: "
+msgstr "oder bestehenden Album Namen:"
-#: ../../addon/editplain/editplain.php:78
-msgid "Disable richtext status editor"
-msgstr "RichText Editor deaktivieren"
+#: ../../mod/photos.php:732
+msgid "Do not show a status post for this upload"
+msgstr "Keine Statusnachricht für diesen Upload senden"
-#: ../../addon/gravatar/gravatar.php:71
-msgid "generic profile image"
-msgstr "allgemeines Profilbild"
+#: ../../mod/photos.php:734 ../../mod/photos.php:1056
+#: ../../mod/filestorage.php:125
+msgid "Permissions"
+msgstr "Berechtigungen"
-#: ../../addon/gravatar/gravatar.php:72
-msgid "random geometric pattern"
-msgstr "zufällig erzeugtes geometrisches Muster"
+#: ../../mod/photos.php:783 ../../mod/photos.php:805 ../../mod/photos.php:1232
+#: ../../mod/photos.php:1247
+msgid "Contact Photos"
+msgstr "Kontakt Bilder"
-#: ../../addon/gravatar/gravatar.php:73
-msgid "monster face"
-msgstr "Monstergesicht"
+#: ../../mod/photos.php:809
+msgid "Edit Album"
+msgstr "Album bearbeiten"
+
+#: ../../mod/photos.php:815
+msgid "Show Newest First"
+msgstr "Zeige neueste zuerst"
-#: ../../addon/gravatar/gravatar.php:74
-msgid "computer generated face"
-msgstr "Computergesicht"
+#: ../../mod/photos.php:817
+msgid "Show Oldest First"
+msgstr "Zeige älteste zuerst"
-#: ../../addon/gravatar/gravatar.php:75
-msgid "retro arcade style face"
-msgstr "Retro Arcade Design Gesicht"
+#: ../../mod/photos.php:860 ../../mod/photos.php:1279
+msgid "View Photo"
+msgstr "Foto ansehen"
-#: ../../addon/gravatar/gravatar.php:87
-msgid "Default avatar image"
-msgstr "Standard Profilbild "
+#: ../../mod/photos.php:906
+msgid "Permission denied. Access to this item may be restricted."
+msgstr "Berechtigung verweigert. Der Zugriff ist wahrscheinlich eingeschränkt worden."
-#: ../../addon/gravatar/gravatar.php:87
-msgid "Select default avatar image if none was found at Gravatar. See README"
-msgstr "Wähle das Standardgesicht, wenn kein Bild auf Gravatar gefunden wurde. Schaue auch sonst im README nach."
+#: ../../mod/photos.php:908
+msgid "Photo not available"
+msgstr "Foto nicht verfügbar"
-#: ../../addon/gravatar/gravatar.php:88
-msgid "Rating of images"
-msgstr "Bildbewertung"
+#: ../../mod/photos.php:966
+msgid "Use as profile photo"
+msgstr "Als Profilfoto verwenden"
-#: ../../addon/gravatar/gravatar.php:88
-msgid "Select the appropriate avatar rating for your site. See README"
-msgstr "Wähle eine angemessene Bildbewertung für Deinen Server. Schaue auch sonst im README nach."
+#: ../../mod/photos.php:990
+msgid "View Full Size"
+msgstr "In voller Größe anzeigen"
-#: ../../addon/gravatar/gravatar.php:102
-msgid "Gravatar settings updated."
-msgstr "Gravatar Einstellungen aktualisiert."
+#: ../../mod/photos.php:1044
+msgid "Edit photo"
+msgstr "Foto bearbeiten"
-#: ../../addon/testdrive/testdrive.php:95
-msgid "Your Friendica test account is about to expire."
-msgstr "Dein Friendica-Testkonto wird bald verfallen."
+#: ../../mod/photos.php:1046
+msgid "Rotate CW (right)"
+msgstr "Drehen US (rechts)"
-#: ../../addon/testdrive/testdrive.php:96
-#, php-format
-msgid ""
-"Hi %1$s,\n"
-"\n"
-"Your 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 http://dir.friendica.com/siteinfo - and for more information on setting up your own Friendica server please see the Friendica project website at http://friendica.com."
-msgstr "Hallo %1$s,\n\ndein Testkonto auf %2$s wird in weniger als fünf Tagen verfallen. Wir hoffen, dass dir dieser Testlauf gefallen hat, so dass du die Gelegenheit nutzt und dir einen normalen Friendica-Server für deine integrierte Social-Network-Kommunikation suchst. Eine Liste öffentlicher Server findest du auf http://dir.friendica.com/siteinfo . Um mehr Information darüber zu bekommen, wie man einen eigenen Friendica-Server aufsetzt, kannst du auch einen Blick auf die Friendica-Projektseite werfen: http://friendica.com"
+#: ../../mod/photos.php:1047
+msgid "Rotate CCW (left)"
+msgstr "Drehen EUS (links)"
-#: ../../addon/pageheader/pageheader.php:50
-msgid "\"pageheader\" Settings"
-msgstr "\"pageheader\"-Einstellungen"
+#: ../../mod/photos.php:1049
+msgid "New album name"
+msgstr "Name des neuen Albums:"
-#: ../../addon/pageheader/pageheader.php:68
-msgid "pageheader Settings saved."
-msgstr "pageheader-Einstellungen gespeichert."
+#: ../../mod/photos.php:1052
+msgid "Caption"
+msgstr "Bildunterschrift"
-#: ../../addon/ijpost/ijpost.php:39
-msgid "Post to Insanejournal"
-msgstr "Auf InsaneJournal posten."
+#: ../../mod/photos.php:1054
+msgid "Add a Tag"
+msgstr "Schlagwort hinzufügen"
-#: ../../addon/ijpost/ijpost.php:70
-msgid "InsaneJournal Post Settings"
-msgstr "InsaneJournal Beitrags-Einstellungen"
+#: ../../mod/photos.php:1058
+msgid ""
+"Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"
+msgstr "Beispiel: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"
-#: ../../addon/ijpost/ijpost.php:72
-msgid "Enable InsaneJournal Post Plugin"
-msgstr "InsaneJournal Plugin aktivieren"
+#: ../../mod/photos.php:1285
+msgid "View Album"
+msgstr "Album ansehen"
-#: ../../addon/ijpost/ijpost.php:77
-msgid "InsaneJournal username"
-msgstr "InsaneJournal Benutzername"
+#: ../../mod/photos.php:1294
+msgid "Recent Photos"
+msgstr "Neueste Fotos"
-#: ../../addon/ijpost/ijpost.php:82
-msgid "InsaneJournal password"
-msgstr "InsaneJournal Passwort"
+#: ../../mod/filer.php:35
+msgid "- select -"
+msgstr "-auswählen-"
-#: ../../addon/ijpost/ijpost.php:87
-msgid "Post to InsaneJournal by default"
-msgstr "Standardmäßig auf InsaneJournal posten."
+#: ../../mod/menu.php:17
+msgid "Menu updated."
+msgstr "Menü aktualisiert."
-#: ../../addon/viewsrc/viewsrc.php:37
-msgid "View Source"
-msgstr "Quelle ansehen"
+#: ../../mod/menu.php:21
+msgid "Unable to update menu."
+msgstr "Kann Menü nicht aktualisieren."
-#: ../../addon/statusnet/statusnet.php:134
-msgid "Post to StatusNet"
-msgstr "Bei StatusNet veröffentlichen"
+#: ../../mod/menu.php:26
+msgid "Menu created."
+msgstr "Menü erstellt."
-#: ../../addon/statusnet/statusnet.php:176
-msgid ""
-"Please contact your site administrator.<br />The provided API URL is not "
-"valid."
-msgstr "Bitte kontaktiere den Administrator des Servers.<br />Die angegebene API-URL ist nicht gültig."
+#: ../../mod/menu.php:30
+msgid "Unable to create menu."
+msgstr "Kann Menü nicht erstellen."
-#: ../../addon/statusnet/statusnet.php:204
-msgid "We could not contact the StatusNet API with the Path you entered."
-msgstr "Die StatusNet-API konnte mit dem angegebenen Pfad nicht erreicht werden."
+#: ../../mod/menu.php:53
+msgid "Manage Menus"
+msgstr "Menüs verwalten"
-#: ../../addon/statusnet/statusnet.php:232
-msgid "StatusNet settings updated."
-msgstr "StatusNet Einstellungen aktualisiert."
+#: ../../mod/menu.php:56
+msgid "Drop"
+msgstr "Löschen"
-#: ../../addon/statusnet/statusnet.php:257
-msgid "StatusNet Posting Settings"
-msgstr "StatusNet-Beitragseinstellungen"
+#: ../../mod/menu.php:58
+msgid "Create a new menu"
+msgstr "Neues Menü erstellen"
-#: ../../addon/statusnet/statusnet.php:271
-msgid "Globally Available StatusNet OAuthKeys"
-msgstr "Verfügbare OAuth Schlüssel für StatusNet"
+#: ../../mod/menu.php:59
+msgid "Delete this menu"
+msgstr "Lösche dieses Menü"
-#: ../../addon/statusnet/statusnet.php:272
-msgid ""
-"There are preconfigured OAuth key pairs for some StatusNet servers "
-"available. If you are useing one of them, please use these credentials. If "
-"not feel free to connect to any other StatusNet instance (see below)."
-msgstr "Für einige StatusNet Server sind voreingestellt OAuth Schlüsselpaare verfügbar. Solltest du einen dieser Server benutzen, dann verwende bitte diese Schlüssel. Falls nicht, stellen stattdessen eine Verbindung zu irgend einem anderen StatusNet Server her (siehe unten)."
+#: ../../mod/menu.php:60 ../../mod/menu.php:104
+msgid "Edit menu contents"
+msgstr "Bearbeite Menü Inhalte"
-#: ../../addon/statusnet/statusnet.php:280
-msgid "Provide your own OAuth Credentials"
-msgstr "Eigene OAuth Schlüssel eintragen"
+#: ../../mod/menu.php:61
+msgid "Edit this menu"
+msgstr "Dieses Menü bearbeiten"
-#: ../../addon/statusnet/statusnet.php:281
-msgid ""
-"No consumer key pair for StatusNet found. Register your Friendica Account as"
-" an desktop client on your StatusNet 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 StatusNet installation."
-msgstr "Kein Consumer-Schlüsselpaar für StatusNet gefunden. Registriere deinen Friendica-Account als Desktop-Client, kopiere das Consumer-Schlüsselpaar hierher und gib die API-URL ein.<br />Bevor du dein eigenes Consumer-Schlüsselpaar registrierst, frage den Administrator dieses Friendica-Servers, ob schon ein Schlüsselpaar für diesen Friendica-Server auf diesem StatusNet-Server existiert."
-
-#: ../../addon/statusnet/statusnet.php:283
-msgid "OAuth Consumer Key"
-msgstr "OAuth Consumer Key"
-
-#: ../../addon/statusnet/statusnet.php:286
-msgid "OAuth Consumer Secret"
-msgstr "OAuth Consumer Secret"
-
-#: ../../addon/statusnet/statusnet.php:289
-msgid "Base API Path (remember the trailing /)"
-msgstr "Basis-URL der StatusNet-API (vergiss den abschließenden / nicht)"
-
-#: ../../addon/statusnet/statusnet.php:310
-msgid ""
-"To connect to your StatusNet account click the button below to get a "
-"security code from StatusNet which you have to copy into the input box below"
-" and submit the form. Only your <strong>public</strong> posts will be posted"
-" to StatusNet."
-msgstr "Um dein Konto mit einem StatusNet-Konto zu verknüpfen, klicke den Button an, um einen Sicherheitscode von StatusNet zu erhalten, und kopiere diesen in das Eingabefeld weiter unten. Es werden ausschließlich deine <strong>öffentlichen</strong> Nachrichten an StatusNet gesendet."
+#: ../../mod/menu.php:76
+msgid "New Menu"
+msgstr "Neues Menü"
-#: ../../addon/statusnet/statusnet.php:311
-msgid "Log in with StatusNet"
-msgstr "Bei StatusNet anmelden"
+#: ../../mod/menu.php:77 ../../mod/menu.php:105
+msgid "Menu name"
+msgstr "Menü Name"
-#: ../../addon/statusnet/statusnet.php:313
-msgid "Copy the security code from StatusNet here"
-msgstr "Kopiere den Sicherheitscode von StatusNet hier hin"
+#: ../../mod/menu.php:77 ../../mod/menu.php:105
+msgid "Must be unique, only seen by you"
+msgstr "Muss unverwechselbar sein, nur für dich sichtbar"
-#: ../../addon/statusnet/statusnet.php:319
-msgid "Cancel Connection Process"
-msgstr "Verbindungsprozess abbrechen"
+#: ../../mod/menu.php:78 ../../mod/menu.php:106
+msgid "Menu title"
+msgstr "Menü Titel"
-#: ../../addon/statusnet/statusnet.php:321
-msgid "Current StatusNet API is"
-msgstr "Derzeitige StatusNet-API-URL lautet"
+#: ../../mod/menu.php:78 ../../mod/menu.php:106
+msgid "Menu title as seen by others"
+msgstr "Menü Titel wie er von anderen gesehen wird"
-#: ../../addon/statusnet/statusnet.php:322
-msgid "Cancel StatusNet Connection"
-msgstr "Verbindung zum StatusNet Server abbrechen"
+#: ../../mod/menu.php:93
+msgid "Menu deleted."
+msgstr "Menü gelöscht."
-#: ../../addon/statusnet/statusnet.php:333 ../../addon/twitter/twitter.php:189
-msgid "Currently connected to: "
-msgstr "Momentan verbunden mit: "
+#: ../../mod/menu.php:95
+msgid "Menu could not be deleted."
+msgstr "Menü konnte nicht gelöscht werden."
-#: ../../addon/statusnet/statusnet.php:334
-msgid ""
-"If enabled all your <strong>public</strong> postings can be posted to the "
-"associated StatusNet 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 StatusNet-Konto veröffentlicht werden. Du kannst das (hier) als Standardverhalten einstellen oder beim Schreiben eines Beitrags in den Beitragsoptionen festlegen."
+#: ../../mod/menu.php:101
+msgid "Edit Menu"
+msgstr "Menü bearbeiten"
-#: ../../addon/statusnet/statusnet.php:336
-msgid ""
-"<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 StatusNet 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 deinen StatusNet-Beitrag angehängt wird, um auf den Originalbeitrag zu verweisen, den Betrachter auf eine leere Seite führen, die ihn darüber informiert, dass der Zugriff eingeschränkt wurde."
+#: ../../mod/menu.php:103
+msgid "Add or remove entries to this menu"
+msgstr "Einträge zu diesem Menü hinzufügen oder entfernen"
-#: ../../addon/statusnet/statusnet.php:339
-msgid "Allow posting to StatusNet"
-msgstr "Veröffentlichung bei StatusNet erlauben"
+#: ../../mod/home.php:89
+#, php-format
+msgid "Welcome to %s"
+msgstr "Willkommen auf %s"
-#: ../../addon/statusnet/statusnet.php:342
-msgid "Send public postings to StatusNet by default"
-msgstr "Veröffentliche öffentliche Beiträge standardmäßig bei StatusNet"
+#: ../../mod/directory.php:143 ../../mod/profiles.php:573
+#: ../../mod/dirprofile.php:95
+msgid "Age: "
+msgstr "Alter:"
+
+#: ../../mod/directory.php:146 ../../mod/dirprofile.php:98
+msgid "Gender: "
+msgstr "Geschlecht:"
-#: ../../addon/statusnet/statusnet.php:345
-msgid "Send linked #-tags and @-names to StatusNet"
-msgstr "Sende verlinkte #-Tags und @-Namen nach StatusNet"
+#: ../../mod/directory.php:206
+msgid "Finding:"
+msgstr "Ergebnisse:"
-#: ../../addon/statusnet/statusnet.php:350 ../../addon/twitter/twitter.php:206
-msgid "Clear OAuth configuration"
-msgstr "OAuth-Konfiguration löschen"
+#: ../../mod/directory.php:214
+msgid "next page"
+msgstr "nächste Seite"
-#: ../../addon/statusnet/statusnet.php:553
-msgid "API URL"
-msgstr "API-URL"
+#: ../../mod/directory.php:214
+msgid "previous page"
+msgstr "vorige Seite"
-#: ../../addon/infiniteimprobabilitydrive/infiniteimprobabilitydrive.php:19
-msgid "Infinite Improbability Drive"
-msgstr "Infinite Improbability Drive"
+#: ../../mod/directory.php:221
+msgid "No entries (some entries may be hidden)."
+msgstr "Keine Einträge gefunden (einige könnten versteckt sein)."
+
+#: ../../mod/connections.php:189 ../../mod/connections.php:261
+msgid "Blocked"
+msgstr "Blockiert"
+
+#: ../../mod/connections.php:194 ../../mod/connections.php:268
+msgid "Ignored"
+msgstr "Ignoriert"
-#: ../../addon/tumblr/tumblr.php:36
-msgid "Post to Tumblr"
-msgstr "Bei Tumblr veröffentlichen"
+#: ../../mod/connections.php:199 ../../mod/connections.php:282
+msgid "Hidden"
+msgstr "Versteckt"
-#: ../../addon/tumblr/tumblr.php:67
-msgid "Tumblr Post Settings"
-msgstr "Tumblr-Beitragseinstellungen"
+#: ../../mod/connections.php:204 ../../mod/connections.php:275
+msgid "Archived"
+msgstr "Archiviert"
-#: ../../addon/tumblr/tumblr.php:69
-msgid "Enable Tumblr Post Plugin"
-msgstr "Tumblr-Plugin aktivieren"
+#: ../../mod/connections.php:215
+msgid "All"
+msgstr "Alle"
-#: ../../addon/tumblr/tumblr.php:74
-msgid "Tumblr login"
-msgstr "Tumblr Login"
+#: ../../mod/connections.php:239
+msgid "Suggest new connections"
+msgstr "Neue Verbindungen vorschlagen"
-#: ../../addon/tumblr/tumblr.php:79
-msgid "Tumblr password"
-msgstr "Tumblr Passwort"
+#: ../../mod/connections.php:245
+msgid "Show pending (new) connections"
+msgstr "Zeige schwebende (neue) Verbindungen"
-#: ../../addon/tumblr/tumblr.php:84
-msgid "Post to Tumblr by default"
-msgstr "Standardmäßig bei Tumblr veröffentlichen"
+#: ../../mod/connections.php:248
+msgid "All Connections"
+msgstr "Alle Verbindungen"
-#: ../../addon/numfriends/numfriends.php:46
-msgid "Numfriends settings updated."
-msgstr "Numfriends Einstellungen aktualisiert"
+#: ../../mod/connections.php:251
+msgid "Show all connections"
+msgstr "Zeige alle Verbindungen"
-#: ../../addon/numfriends/numfriends.php:77
-msgid "Numfriends Settings"
-msgstr "Numfriends Einstellungen"
+#: ../../mod/connections.php:254
+msgid "Unblocked"
+msgstr "Freigegeben"
-#: ../../addon/numfriends/numfriends.php:79
-msgid "How many contacts to display on profile sidebar"
-msgstr "Wie viele Kontakte sollen in der Seitenleiste angezeigt werden"
+#: ../../mod/connections.php:257
+msgid "Only show unblocked connections"
+msgstr "Zeige nur freigegebene Verbindungen"
-#: ../../addon/gnot/gnot.php:48
-msgid "Gnot settings updated."
-msgstr "Gnot Einstellungen aktualisiert."
+#: ../../mod/connections.php:264
+msgid "Only show blocked connections"
+msgstr "Zeige nur blockierte Verbindungen"
-#: ../../addon/gnot/gnot.php:79
-msgid "Gnot Settings"
-msgstr "Gnot Einstellungen"
+#: ../../mod/connections.php:271
+msgid "Only show ignored connections"
+msgstr "Zeige nur ignorierte Verbindungen"
-#: ../../addon/gnot/gnot.php:81
-msgid ""
-"Allows threading of email comment notifications on Gmail and anonymising the"
-" subject line."
-msgstr "Erlaubt das Veröffentlichen von E-Mail Kommentar Benachrichtigungen bei Gmail mit anonymisiertem Betreff"
+#: ../../mod/connections.php:278
+msgid "Only show archived connections"
+msgstr "Zeige nur archivierte Verbindungen"
-#: ../../addon/gnot/gnot.php:82
-msgid "Enable this plugin/addon?"
-msgstr "Dieses Plugin/Addon aktivieren?"
+#: ../../mod/connections.php:285
+msgid "Only show hidden connections"
+msgstr "Zeige nur versteckte Verbindungen"
-#: ../../addon/gnot/gnot.php:97
+#: ../../mod/connections.php:329
#, php-format
-msgid "[Friendica:Notify] Comment to conversation #%d"
-msgstr "[Friendica Meldung] Kommentar zum Beitrag #%d"
+msgid "%1$s [%2$s]"
+msgstr "%1$s [%2$s]"
-#: ../../addon/wppost/wppost.php:42
-msgid "Post to Wordpress"
-msgstr "Bei WordPress veröffentlichen"
+#: ../../mod/connections.php:330
+msgid "Edit contact"
+msgstr "Kontakt bearbeiten"
-#: ../../addon/wppost/wppost.php:76
-msgid "WordPress Post Settings"
-msgstr "WordPress-Beitragseinstellungen"
+#: ../../mod/connections.php:353
+msgid "Search your connections"
+msgstr "Verbindungen durchsuchen"
-#: ../../addon/wppost/wppost.php:78
-msgid "Enable WordPress Post Plugin"
-msgstr "WordPress-Plugin aktivieren."
+#: ../../mod/connections.php:354
+msgid "Finding: "
+msgstr "Ergebnisse:"
+
+#: ../../mod/layouts.php:52
+msgid "Layout Help"
+msgstr "Layout Hilfe"
+
+#: ../../mod/layouts.php:55
+msgid "Help with this feature"
+msgstr "Hilfe zu diesem Feature"
-#: ../../addon/wppost/wppost.php:83
-msgid "WordPress username"
-msgstr "WordPress-Benutzername"
+#: ../../mod/layouts.php:74
+msgid "Layout Name"
+msgstr "Layout Name"
-#: ../../addon/wppost/wppost.php:88
-msgid "WordPress password"
-msgstr "WordPress-Passwort"
+#: ../../mod/help.php:43 ../../mod/help.php:49 ../../mod/help.php:55
+msgid "Help:"
+msgstr "Hilfe:"
-#: ../../addon/wppost/wppost.php:93
-msgid "WordPress API URL"
-msgstr "WordPress-API-URL"
+#: ../../mod/help.php:68 ../../index.php:224
+msgid "Not Found"
+msgstr "Nicht gefunden"
-#: ../../addon/wppost/wppost.php:98
-msgid "Post to WordPress by default"
-msgstr "Standardmäßig auf WordPress veröffentlichen"
+#: ../../mod/rmagic.php:56
+msgid "Remote Authentication"
+msgstr "Entfernte Authentifizierung"
-#: ../../addon/wppost/wppost.php:103
-msgid "Provide a backlink to the Friendica post"
-msgstr "Einen zurück zum Friendica-Beitrag hinzufügen"
+#: ../../mod/rmagic.php:57
+msgid "Enter your channel address (e.g. channel@example.com)"
+msgstr "Deine Kanal-Adresse (z.B. channel@example.com)"
-#: ../../addon/wppost/wppost.php:205
-msgid "Read the original post and comment stream on Friendica"
-msgstr "Den Original-Beitrag samt Kommentaren bei Friendica lesen"
+#: ../../mod/rmagic.php:58
+msgid "Authenticate"
+msgstr "Authentifizieren"
-#: ../../addon/showmore/showmore.php:38
-msgid "\"Show more\" Settings"
-msgstr "\"Mehr zeigen\" Einstellungen"
+#: ../../mod/network.php:79
+msgid "No such group"
+msgstr "Gruppe existiert nicht"
-#: ../../addon/showmore/showmore.php:41
-msgid "Enable Show More"
-msgstr "Aktiviere \"Mehr zeigen\""
+#: ../../mod/network.php:118
+msgid "Search Results For:"
+msgstr "Suchergebnisse für:"
-#: ../../addon/showmore/showmore.php:44
-msgid "Cutting posts after how much characters"
-msgstr "Begrenze Beiträge nach einer bestimmten Anzahl an Buchstaben"
+#: ../../mod/network.php:172
+msgid "Collection is empty"
+msgstr "Sammlung ist leer"
-#: ../../addon/showmore/showmore.php:65
-msgid "Show More Settings saved."
-msgstr "\"Mehr zeigen\" Einstellungen gesichert."
+#: ../../mod/network.php:180
+msgid "Collection: "
+msgstr "Sammlung:"
-#: ../../addon/piwik/piwik.php:79
-msgid ""
-"This website is tracked using the <a href='http://www.piwik.org'>Piwik</a> "
-"analytics tool."
-msgstr "Diese Website benutzt <a href='http://www.piwik.org'>Piwik</a>, eine Open Source-Software zur statistischen Auswertung der Besucherzugriffe."
+#: ../../mod/network.php:193
+msgid "Connection: "
+msgstr "Verbindung:"
-#: ../../addon/piwik/piwik.php:82
-#, php-format
-msgid ""
-"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)."
-msgstr "Wenn Du nicht willst, dass Deine Besuche auf diese Weise gespeichert werden, kannst Du <a href='%s'>ein Cookie setzen</a>. Dann wird Piwik Dich auf dieser Website nicht mehr verfolgen (opt-out)."
+#: ../../mod/network.php:196
+msgid "Invalid connection."
+msgstr "Ungültige Verbindung."
-#: ../../addon/piwik/piwik.php:90
-msgid "Piwik Base URL"
-msgstr "Piwik Basis URL"
+#: ../../mod/follow.php:25
+msgid "Channel added."
+msgstr "Kanal hinzugefügt."
-#: ../../addon/piwik/piwik.php:90
+#: ../../mod/post.php:226
msgid ""
-"Absolute path to your Piwik installation. (without protocol (http/s), with "
-"trailing slash)"
-msgstr "Absoluter Pfad zu deiner Piwik Installation (ohne Protokoll (http/s) und mit abschließendem Schrägstrich)"
+"Remote authentication blocked. You are logged into this site locally. Please"
+" logout and retry."
+msgstr "Entfernte Authentifizierung blockiert. Du bist lokal auf dieser Seite angemeldet. Bitte melde dich ab und versuche es erneut."
-#: ../../addon/piwik/piwik.php:91
-msgid "Site ID"
-msgstr "Seiten ID"
+#: ../../mod/post.php:256
+#, php-format
+msgid "Welcome %s. Remote authentication successful."
+msgstr "Willkommen %s. Entfernte Authentifizierung erfolgreich."
-#: ../../addon/piwik/piwik.php:92
-msgid "Show opt-out cookie link?"
-msgstr "Link zum Setzen des Opt-Out Cookies anzeigen?"
+#: ../../mod/dirsearch.php:21
+msgid "This site is not a directory server"
+msgstr "Diese Website ist kein Verzeichnis-Server"
-#: ../../addon/piwik/piwik.php:93
-msgid "Asynchronous tracking"
-msgstr "Asynchrones Tracken"
+#: ../../mod/lockview.php:34
+msgid "Remote privacy information not available."
+msgstr "Entfernte Privatsphären Einstellungen sind nicht verfügbar."
-#: ../../addon/twitter/twitter.php:73
-msgid "Post to Twitter"
-msgstr "Bei Twitter veröffentlichen"
+#: ../../mod/lockview.php:43
+msgid "Visible to:"
+msgstr "Sichtbar für:"
-#: ../../addon/twitter/twitter.php:122
-msgid "Twitter settings updated."
-msgstr "Twitter Einstellungen aktualisiert."
+#: ../../mod/magic.php:70
+msgid "Hub not found."
+msgstr "Server nicht gefunden."
-#: ../../addon/twitter/twitter.php:146
-msgid "Twitter Posting Settings"
-msgstr "Twitter-Beitragseinstellungen"
+#: ../../mod/profiles.php:18 ../../mod/profiles.php:138
+#: ../../mod/profiles.php:168 ../../mod/profiles.php:475
+msgid "Profile not found."
+msgstr "Profil nicht gefunden."
-#: ../../addon/twitter/twitter.php:153
-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."
+#: ../../mod/profiles.php:38
+msgid "Profile deleted."
+msgstr "Profil gelöscht."
-#: ../../addon/twitter/twitter.php:172
-msgid ""
-"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."
-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."
-
-#: ../../addon/twitter/twitter.php:173
-msgid "Log in with Twitter"
-msgstr "bei Twitter anmelden"
-
-#: ../../addon/twitter/twitter.php:175
-msgid "Copy the PIN from Twitter here"
-msgstr "Kopiere die Twitter-PIN hier her"
-
-#: ../../addon/twitter/twitter.php:190
-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."
+#: ../../mod/profiles.php:56 ../../mod/profiles.php:92
+msgid "Profile-"
+msgstr "Profil-"
-#: ../../addon/twitter/twitter.php:192
-msgid ""
-"<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."
-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-Beitrag angehängt wird, um auf den Originalbeitrag zu verweisen, den Betrachter auf eine leere Seite führen, die ihn darüber informiert, dass der Zugriff eingeschränkt wurde."
-
-#: ../../addon/twitter/twitter.php:195
-msgid "Allow posting to Twitter"
-msgstr "Veröffentlichung bei Twitter erlauben"
-
-#: ../../addon/twitter/twitter.php:198
-msgid "Send public postings to Twitter by default"
-msgstr "Veröffentliche öffentliche Beiträge standardmäßig bei Twitter"
-
-#: ../../addon/twitter/twitter.php:201
-msgid "Send linked #-tags and @-names to Twitter"
-msgstr "Sende verlinkte #-Tags und @-Namen nach Twitter"
-
-#: ../../addon/twitter/twitter.php:383
-msgid "Consumer key"
-msgstr "Consumer Key"
+#: ../../mod/profiles.php:77 ../../mod/profiles.php:120
+msgid "New profile created."
+msgstr "Neues Profil erstellt."
-#: ../../addon/twitter/twitter.php:384
-msgid "Consumer secret"
-msgstr "Consumer Secret"
+#: ../../mod/profiles.php:98
+msgid "Profile unavailable to clone."
+msgstr "Profil kann nicht geklont werden."
-#: ../../addon/irc/irc.php:44
-msgid "IRC Settings"
-msgstr "IRC Einstellungen"
+#: ../../mod/profiles.php:178
+msgid "Profile Name is required."
+msgstr "Profil-Name erforderlich."
-#: ../../addon/irc/irc.php:46
-msgid "Channel(s) to auto connect (comma separated)"
-msgstr "mit diesen Kanälen soll man automatisch verbunden werden (Komma getrennt)"
+#: ../../mod/profiles.php:306
+msgid "Marital Status"
+msgstr "Familienstand"
-#: ../../addon/irc/irc.php:51
-msgid "Popular Channels (comma separated)"
-msgstr "Beliebte Kanäle (mit Komma getrennt)"
+#: ../../mod/profiles.php:310
+msgid "Romantic Partner"
+msgstr "Romantische Partner"
-#: ../../addon/irc/irc.php:69
-msgid "IRC settings saved."
-msgstr "IRC Einstellungen gespeichert."
+#: ../../mod/profiles.php:314
+msgid "Likes"
+msgstr "Gefällt-mir"
-#: ../../addon/irc/irc.php:74
-msgid "IRC Chatroom"
-msgstr "IRC Chatraum"
+#: ../../mod/profiles.php:318
+msgid "Dislikes"
+msgstr "Gefällt-mir-nicht"
-#: ../../addon/irc/irc.php:96
-msgid "Popular Channels"
-msgstr "Beliebte Räume"
+#: ../../mod/profiles.php:322
+msgid "Work/Employment"
+msgstr "Arbeit/Anstellung"
-#: ../../addon/blogger/blogger.php:42
-msgid "Post to blogger"
-msgstr "Auf Blogger posten"
+#: ../../mod/profiles.php:325
+msgid "Religion"
+msgstr "Religion"
-#: ../../addon/blogger/blogger.php:74
-msgid "Blogger Post Settings"
-msgstr "Einstellungen zum posten auf Blogger"
+#: ../../mod/profiles.php:329
+msgid "Political Views"
+msgstr "Politische Anscihten"
-#: ../../addon/blogger/blogger.php:76
-msgid "Enable Blogger Post Plugin"
-msgstr "Blogger-Post-Plugin aktivieren"
+#: ../../mod/profiles.php:333
+msgid "Gender"
+msgstr "Geschlecht"
-#: ../../addon/blogger/blogger.php:81
-msgid "Blogger username"
-msgstr "Blogger-Benutzername"
+#: ../../mod/profiles.php:337
+msgid "Sexual Preference"
+msgstr "Sexuelle Orientierung"
-#: ../../addon/blogger/blogger.php:86
-msgid "Blogger password"
-msgstr "Blogger-Passwort"
+#: ../../mod/profiles.php:341
+msgid "Homepage"
+msgstr "Webseite"
-#: ../../addon/blogger/blogger.php:91
-msgid "Blogger API URL"
-msgstr "Blogger-API-URL"
+#: ../../mod/profiles.php:345
+msgid "Interests"
+msgstr "Hobbys/Interessen"
-#: ../../addon/blogger/blogger.php:96
-msgid "Post to Blogger by default"
-msgstr "Standardmäßig auf Blogger posten"
+#: ../../mod/profiles.php:349
+msgid "Address"
+msgstr "Adresse"
-#: ../../addon/posterous/posterous.php:37
-msgid "Post to Posterous"
-msgstr "Nach Posterous senden"
+#: ../../mod/profiles.php:356 ../../mod/pubsites.php:31
+msgid "Location"
+msgstr "Ort"
-#: ../../addon/posterous/posterous.php:70
-msgid "Posterous Post Settings"
-msgstr "Posterous Beitrags-Einstellungen"
+#: ../../mod/profiles.php:439
+msgid "Profile updated."
+msgstr "Profil aktualisiert."
-#: ../../addon/posterous/posterous.php:72
-msgid "Enable Posterous Post Plugin"
-msgstr "Posterous-Plugin aktivieren"
+#: ../../mod/profiles.php:494
+msgid "Hide your contact/friend list from viewers of this profile?"
+msgstr "Verberge die Liste deiner Kontakte vor Betrachtern dieses Profils"
-#: ../../addon/posterous/posterous.php:77
-msgid "Posterous login"
-msgstr "Posterous-Anmeldename"
+#: ../../mod/profiles.php:517
+msgid "Edit Profile Details"
+msgstr "Bearbeite Profil-Details"
-#: ../../addon/posterous/posterous.php:82
-msgid "Posterous password"
-msgstr "Posterous-Passwort"
+#: ../../mod/profiles.php:519
+msgid "View this profile"
+msgstr "Dieses Profil ansehen"
-#: ../../addon/posterous/posterous.php:87
-msgid "Posterous site ID"
-msgstr "Posterous site ID"
+#: ../../mod/profiles.php:520
+msgid "Change Profile Photo"
+msgstr "Profilfoto ändern"
-#: ../../addon/posterous/posterous.php:92
-msgid "Posterous API token"
-msgstr "Posterous API token"
+#: ../../mod/profiles.php:521
+msgid "Create a new profile using these settings"
+msgstr "Neues Profil anlegen und diese Einstellungen übernehmen"
-#: ../../addon/posterous/posterous.php:97
-msgid "Post to Posterous by default"
-msgstr "Veröffentliche öffentliche Beiträge standardmäßig bei Posterous"
+#: ../../mod/profiles.php:522
+msgid "Clone this profile"
+msgstr "Dieses Profil klonen"
-#: ../../view/theme/cleanzero/config.php:82
-#: ../../view/theme/diabook/config.php:192
-#: ../../view/theme/quattro/config.php:54 ../../view/theme/dispy/config.php:72
-msgid "Theme settings"
-msgstr "Themeneinstellungen"
+#: ../../mod/profiles.php:523
+msgid "Delete this profile"
+msgstr "Dieses Profil löschen"
-#: ../../view/theme/cleanzero/config.php:83
-msgid "Set resize level for images in posts and comments (width and height)"
-msgstr "Wähle das Vergrößerungsmaß für Bilder in Beiträgen und Kommentaren (Höhe und Breite)"
+#: ../../mod/profiles.php:524
+msgid "Profile Name:"
+msgstr "Profilname:"
-#: ../../view/theme/cleanzero/config.php:84
-#: ../../view/theme/diabook/config.php:193
-#: ../../view/theme/dispy/config.php:73
-msgid "Set font-size for posts and comments"
-msgstr "Schriftgröße für Beiträge und Kommentare festlegen"
+#: ../../mod/profiles.php:525
+msgid "Your Full Name:"
+msgstr "Dein voller Name:"
-#: ../../view/theme/cleanzero/config.php:85
-msgid "Set theme width"
-msgstr "Theme Breite festlegen"
+#: ../../mod/profiles.php:526
+msgid "Title/Description:"
+msgstr "Titel/Beschreibung:"
-#: ../../view/theme/cleanzero/config.php:86
-#: ../../view/theme/quattro/config.php:56
-msgid "Color scheme"
-msgstr "Farbschema"
+#: ../../mod/profiles.php:527
+msgid "Your Gender:"
+msgstr "Dein Geschlecht:"
-#: ../../view/theme/diabook/theme.php:127 ../../include/nav.php:49
-#: ../../include/nav.php:115
-msgid "Your posts and conversations"
-msgstr "Deine Beiträge und Unterhaltungen"
+#: ../../mod/profiles.php:528
+#, php-format
+msgid "Birthday (%s):"
+msgstr "Geburtstag (%s):"
-#: ../../view/theme/diabook/theme.php:128 ../../include/nav.php:50
-msgid "Your profile page"
-msgstr "Deine Profilseite"
+#: ../../mod/profiles.php:529
+msgid "Street Address:"
+msgstr "Straße und Hausnummer:"
-#: ../../view/theme/diabook/theme.php:129
-msgid "Your contacts"
-msgstr "Deine Kontakte"
+#: ../../mod/profiles.php:530
+msgid "Locality/City:"
+msgstr "Wohnort:"
-#: ../../view/theme/diabook/theme.php:130 ../../include/nav.php:51
-msgid "Your photos"
-msgstr "Deine Fotos"
-
-#: ../../view/theme/diabook/theme.php:131 ../../include/nav.php:52
-msgid "Your events"
-msgstr "Deine Ereignisse"
-
-#: ../../view/theme/diabook/theme.php:132 ../../include/nav.php:53
-msgid "Personal notes"
-msgstr "Persönliche Notizen"
-
-#: ../../view/theme/diabook/theme.php:132 ../../include/nav.php:53
-msgid "Your personal photos"
-msgstr "Deine privaten Fotos"
-
-#: ../../view/theme/diabook/theme.php:134
-#: ../../view/theme/diabook/theme.php:643
-#: ../../view/theme/diabook/theme.php:747
-#: ../../view/theme/diabook/config.php:201
-msgid "Community Pages"
-msgstr "Foren"
-
-#: ../../view/theme/diabook/theme.php:490
-#: ../../view/theme/diabook/theme.php:749
-#: ../../view/theme/diabook/config.php:203
-msgid "Community Profiles"
-msgstr "Community-Profile"
-
-#: ../../view/theme/diabook/theme.php:511
-#: ../../view/theme/diabook/theme.php:754
-#: ../../view/theme/diabook/config.php:208
-msgid "Last users"
-msgstr "Letzte Nutzer"
-
-#: ../../view/theme/diabook/theme.php:540
-#: ../../view/theme/diabook/theme.php:756
-#: ../../view/theme/diabook/config.php:210
-msgid "Last likes"
-msgstr "Zuletzt gemocht"
-
-#: ../../view/theme/diabook/theme.php:585
-#: ../../view/theme/diabook/theme.php:755
-#: ../../view/theme/diabook/config.php:209
-msgid "Last photos"
-msgstr "Letzte Fotos"
-
-#: ../../view/theme/diabook/theme.php:622
-#: ../../view/theme/diabook/theme.php:752
-#: ../../view/theme/diabook/config.php:206
-msgid "Find Friends"
-msgstr "Freunde finden"
-
-#: ../../view/theme/diabook/theme.php:623
-msgid "Local Directory"
-msgstr "Lokales Verzeichnis"
-
-#: ../../view/theme/diabook/theme.php:625 ../../include/contact_widgets.php:35
-msgid "Similar Interests"
-msgstr "Ähnliche Interessen"
-
-#: ../../view/theme/diabook/theme.php:627 ../../include/contact_widgets.php:37
-msgid "Invite Friends"
-msgstr "Freunde einladen"
-
-#: ../../view/theme/diabook/theme.php:678
-#: ../../view/theme/diabook/theme.php:748
-#: ../../view/theme/diabook/config.php:202
-msgid "Earth Layers"
-msgstr "Earth Layers"
-
-#: ../../view/theme/diabook/theme.php:683
-msgid "Set zoomfactor for Earth Layers"
-msgstr "Zoomfaktor der Earth Layer"
-
-#: ../../view/theme/diabook/theme.php:684
-#: ../../view/theme/diabook/config.php:199
-msgid "Set longitude (X) for Earth Layers"
-msgstr "Longitude (X) der Earth Layer"
-
-#: ../../view/theme/diabook/theme.php:685
-#: ../../view/theme/diabook/config.php:200
-msgid "Set latitude (Y) for Earth Layers"
-msgstr "Latitude (Y) der Earth Layer"
-
-#: ../../view/theme/diabook/theme.php:698
-#: ../../view/theme/diabook/theme.php:750
-#: ../../view/theme/diabook/config.php:204
-msgid "Help or @NewHere ?"
-msgstr "Hilfe oder @NewHere"
-
-#: ../../view/theme/diabook/theme.php:705
-#: ../../view/theme/diabook/theme.php:751
-#: ../../view/theme/diabook/config.php:205
-msgid "Connect Services"
-msgstr "Verbinde Dienste"
-
-#: ../../view/theme/diabook/theme.php:712
-#: ../../view/theme/diabook/theme.php:753
-msgid "Last Tweets"
-msgstr "Neueste Tweets"
-
-#: ../../view/theme/diabook/theme.php:715
-#: ../../view/theme/diabook/config.php:197
-msgid "Set twitter search term"
-msgstr "Twitter Suchbegriff"
-
-#: ../../view/theme/diabook/theme.php:735
-#: ../../view/theme/diabook/theme.php:736
-#: ../../view/theme/diabook/theme.php:737
-#: ../../view/theme/diabook/theme.php:738
-#: ../../view/theme/diabook/theme.php:739
-#: ../../view/theme/diabook/theme.php:740
-#: ../../view/theme/diabook/theme.php:741
-#: ../../view/theme/diabook/theme.php:742
-#: ../../view/theme/diabook/theme.php:743
-#: ../../view/theme/diabook/theme.php:744 ../../include/acl_selectors.php:288
-msgid "don't show"
-msgstr "nicht zeigen"
-
-#: ../../view/theme/diabook/theme.php:735
-#: ../../view/theme/diabook/theme.php:736
-#: ../../view/theme/diabook/theme.php:737
-#: ../../view/theme/diabook/theme.php:738
-#: ../../view/theme/diabook/theme.php:739
-#: ../../view/theme/diabook/theme.php:740
-#: ../../view/theme/diabook/theme.php:741
-#: ../../view/theme/diabook/theme.php:742
-#: ../../view/theme/diabook/theme.php:743
-#: ../../view/theme/diabook/theme.php:744 ../../include/acl_selectors.php:287
-msgid "show"
-msgstr "zeigen"
+#: ../../mod/profiles.php:531
+msgid "Postal/Zip Code:"
+msgstr "Postleitzahl:"
-#: ../../view/theme/diabook/theme.php:745
-msgid "Show/hide boxes at right-hand column:"
-msgstr "Rahmen auf der rechten Seite anzeigen/verbergen"
+#: ../../mod/profiles.php:532
+msgid "Country:"
+msgstr "Land:"
-#: ../../view/theme/diabook/config.php:194
-#: ../../view/theme/dispy/config.php:74
-msgid "Set line-height for posts and comments"
-msgstr "Liniengröße für Beiträge und Kommantare festlegen"
+#: ../../mod/profiles.php:533
+msgid "Region/State:"
+msgstr "Region/Bundesstaat"
-#: ../../view/theme/diabook/config.php:195
-msgid "Set resolution for middle column"
-msgstr "Auflösung für die Mittelspalte setzen"
+#: ../../mod/profiles.php:534
+msgid "<span class=\"heart\">&hearts;</span> Marital Status:"
+msgstr "<span class=\"heart\">&hearts;</span> Beziehungsstatus:"
-#: ../../view/theme/diabook/config.php:196
-msgid "Set color scheme"
-msgstr "Wähle Farbschema"
+#: ../../mod/profiles.php:535
+msgid "Who: (if applicable)"
+msgstr "Wer: (falls anwendbar)"
-#: ../../view/theme/diabook/config.php:198
-msgid "Set zoomfactor for Earth Layer"
-msgstr "Zoomfaktor der Earth Layer"
+#: ../../mod/profiles.php:536
+msgid "Examples: cathy123, Cathy Williams, cathy@example.com"
+msgstr "Beispiele: cathy123, Cathy Williams, cathy@example.com"
-#: ../../view/theme/diabook/config.php:207
-msgid "Last tweets"
-msgstr "Neueste Tweets"
+#: ../../mod/profiles.php:537
+msgid "Since [date]:"
+msgstr "Seit [Datum]:"
-#: ../../view/theme/quattro/config.php:55
-msgid "Alignment"
-msgstr "Ausrichtung"
+#: ../../mod/profiles.php:539
+msgid "Homepage URL:"
+msgstr "Homepage URL:"
-#: ../../view/theme/quattro/config.php:55
-msgid "Left"
-msgstr "Links"
+#: ../../mod/profiles.php:542
+msgid "Religious Views:"
+msgstr "Religiöse Ansichten:"
-#: ../../view/theme/quattro/config.php:55
-msgid "Center"
-msgstr "Mitte"
+#: ../../mod/profiles.php:543
+msgid "Keywords:"
+msgstr "Schlüsselwörter:"
-#: ../../view/theme/dispy/config.php:75
-msgid "Set colour scheme"
-msgstr "Farbschema wählen"
+#: ../../mod/profiles.php:546
+msgid "Example: fishing photography software"
+msgstr "Beispiel: fischen Fotografie Software"
-#: ../../include/profile_advanced.php:17 ../../boot.php:1111
-msgid "Gender:"
-msgstr "Geschlecht:"
+#: ../../mod/profiles.php:547
+msgid "Used in directory listings"
+msgstr "Wird in Verzeichnis Auflistungen verwendet"
-#: ../../include/profile_advanced.php:22
-msgid "j F, Y"
-msgstr "j F, Y"
+#: ../../mod/profiles.php:548
+msgid "Tell us about yourself..."
+msgstr "Erzähl uns ein wenig von Dir..."
-#: ../../include/profile_advanced.php:23
-msgid "j F"
-msgstr "j F"
+#: ../../mod/profiles.php:549
+msgid "Hobbies/Interests"
+msgstr "Hobbys/Interessen"
-#: ../../include/profile_advanced.php:30 ../../include/datetime.php:450
-#: ../../include/items.php:1446
-msgid "Birthday:"
-msgstr "Geburtstag:"
+#: ../../mod/profiles.php:550
+msgid "Contact information and Social Networks"
+msgstr "Kontaktinformation und soziale Netzwerke"
-#: ../../include/profile_advanced.php:34
-msgid "Age:"
-msgstr "Alter:"
+#: ../../mod/profiles.php:551
+msgid "My other channels"
+msgstr "Meine anderen Channels"
-#: ../../include/profile_advanced.php:37 ../../boot.php:1114
-msgid "Status:"
-msgstr "Status:"
+#: ../../mod/profiles.php:552
+msgid "Musical interests"
+msgstr "Musikalische Interessen"
-#: ../../include/profile_advanced.php:43
-#, php-format
-msgid "for %1$d %2$s"
-msgstr "für %1$d %2$s"
+#: ../../mod/profiles.php:553
+msgid "Books, literature"
+msgstr "Bücher, Literatur"
-#: ../../include/profile_advanced.php:48 ../../boot.php:1116
-msgid "Homepage:"
-msgstr "Homepage:"
+#: ../../mod/profiles.php:554
+msgid "Television"
+msgstr "Fernsehen"
-#: ../../include/profile_advanced.php:52
-msgid "Tags:"
-msgstr "Tags"
+#: ../../mod/profiles.php:555
+msgid "Film/dance/culture/entertainment"
+msgstr "Film/Tanz/Kultur/Unterhaltung"
-#: ../../include/profile_advanced.php:56
-msgid "Religion:"
-msgstr "Religion:"
+#: ../../mod/profiles.php:556
+msgid "Love/romance"
+msgstr "Liebe/Romantik"
-#: ../../include/profile_advanced.php:58
-msgid "About:"
-msgstr "Ãœber:"
+#: ../../mod/profiles.php:557
+msgid "Work/employment"
+msgstr "Arbeit/Anstellung"
-#: ../../include/profile_advanced.php:60
-msgid "Hobbies/Interests:"
-msgstr "Hobbies/Interessen:"
+#: ../../mod/profiles.php:558
+msgid "School/education"
+msgstr "Schule/Ausbildung"
-#: ../../include/profile_advanced.php:62
-msgid "Contact information and Social Networks:"
-msgstr "Kontaktinformationen und Soziale Netzwerke:"
+#: ../../mod/profiles.php:563
+msgid ""
+"This is your <strong>public</strong> profile.<br />It <strong>may</strong> "
+"be visible to anybody using the internet."
+msgstr "Dies ist Dein <strong>öffentliches</strong> Profil.<br />Es <strong>könnte</strong> für jeden im Internet sichtbar sein."
-#: ../../include/profile_advanced.php:64
-msgid "Musical interests:"
-msgstr "Musikalische Interessen:"
+#: ../../mod/profiles.php:612
+msgid "Edit/Manage Profiles"
+msgstr "Bearbeite/Verwalte Profile"
-#: ../../include/profile_advanced.php:66
-msgid "Books, literature:"
-msgstr "Literatur/Bücher:"
+#: ../../mod/profiles.php:613
+msgid "Add profile things"
+msgstr "Profil-Dinge hinzufügen"
-#: ../../include/profile_advanced.php:68
-msgid "Television:"
-msgstr "Fernsehen:"
+#: ../../mod/profiles.php:614
+msgid "Include desirable objects in your profile"
+msgstr "binde begehrenswerte Dinge in dein Profil ein"
-#: ../../include/profile_advanced.php:70
-msgid "Film/dance/culture/entertainment:"
-msgstr "Filme/Tänze/Kultur/Unterhaltung:"
+#: ../../mod/new_channel.php:107
+msgid "Add a Channel"
+msgstr "Channel hinzufügen"
-#: ../../include/profile_advanced.php:72
-msgid "Love/Romance:"
-msgstr "Liebesleben:"
+#: ../../mod/new_channel.php:108
+msgid ""
+"A channel is your own collection of related web pages. A channel can be used"
+" to hold social network profiles, blogs, conversation groups and forums, "
+"celebrity pages, and much more. You may create as many channels as your "
+"service provider allows."
+msgstr "Ein Kanal ist deine eigene Sammlung von verbundenen Webseiten. Ein Kanal kann genutzt werden, um Social Network-Profile, Blogs, Gesprächsgruppen und Foren, Promi-Seiten und viel mehr zu erfassen. Du kannst so viele Kanäle erstellen, wie es der Betreiber deiner Seite zulässt."
-#: ../../include/profile_advanced.php:74
-msgid "Work/employment:"
-msgstr "Arbeit/Beschäftigung:"
+#: ../../mod/new_channel.php:111
+msgid "Examples: \"Bob Jameson\", \"Lisa and her Horses\", \"Soccer\", \"Aviation Group\" "
+msgstr "Beispiele: \"Bob Jameson\", \"Lisa and her Horses\", \"Soccer\", \"Aviation Group\" "
-#: ../../include/profile_advanced.php:76
-msgid "School/education:"
-msgstr "Schule/Ausbildung:"
+#: ../../mod/new_channel.php:112
+msgid "Choose a short nickname"
+msgstr "Wähle einen kurzen Spitznahmen"
-#: ../../include/contact_selectors.php:32
-msgid "Unknown | Not categorised"
-msgstr "Unbekannt | Nicht kategorisiert"
+#: ../../mod/new_channel.php:113
+msgid ""
+"Your nickname will be used to create an easily remembered channel address "
+"(like an email address) which you can share with others."
+msgstr "Dein Spitzname wird verwendet, um eine einfach zu erinnernde Kanal-Adresse (ähnlich einer E-Mail Adresse) zu erzeugen, die Du mit anderen austauschen kannst."
-#: ../../include/contact_selectors.php:33
-msgid "Block immediately"
-msgstr "Sofort blockieren"
+#: ../../mod/new_channel.php:114
+msgid "Or <a href=\"import\">import an existing channel</a> from another location"
+msgstr "Oder <a href=\"import\">importiere einen bestehenden Kanal</a> von einem anderen Ort"
-#: ../../include/contact_selectors.php:34
-msgid "Shady, spammer, self-marketer"
-msgstr "Zwielichtig, Spammer, Selbstdarsteller"
+#: ../../mod/filestorage.php:68
+msgid "Permission Denied."
+msgstr "Zugriff verweigert."
-#: ../../include/contact_selectors.php:35
-msgid "Known to me, but no opinion"
-msgstr "Ist mir bekannt, hab aber keine Meinung"
+#: ../../mod/filestorage.php:86
+msgid "File not found."
+msgstr "Datei nicht gefunden"
-#: ../../include/contact_selectors.php:36
-msgid "OK, probably harmless"
-msgstr "OK, wahrscheinlich harmlos"
+#: ../../mod/filestorage.php:120
+msgid "Edit file permissions"
+msgstr "Dateiberechtigungen bearbeiten"
-#: ../../include/contact_selectors.php:37
-msgid "Reputable, has my trust"
-msgstr "Seriös, hat mein Vertrauen"
+#: ../../mod/filestorage.php:127
+msgid "Include all files and sub folders"
+msgstr "Alle Dateien und Unterverzeichnisse einbinden"
-#: ../../include/contact_selectors.php:56
-msgid "Frequently"
-msgstr "immer wieder"
+#: ../../mod/filestorage.php:128
+msgid "Return to file list"
+msgstr "Zurück zur Dateiliste"
-#: ../../include/contact_selectors.php:57
-msgid "Hourly"
-msgstr "Stündlich"
+#: ../../mod/filestorage.php:130
+msgid "Copy/paste this code to attach file to a post"
+msgstr "Diesen Code kopieren/einfügen um die Datei an einen Beitrag anzuhängen"
-#: ../../include/contact_selectors.php:58
-msgid "Twice daily"
-msgstr "Zweimal täglich"
+#: ../../mod/filestorage.php:131
+msgid "Copy/paste this URL to link file from a web page"
+msgstr "Diese URL verwenden um auf die Datei von einer Webseite aus zu verweisen"
-#: ../../include/contact_selectors.php:59
-msgid "Daily"
-msgstr "Täglich"
+#: ../../mod/filestorage.php:168
+msgid "Download"
+msgstr "Download"
-#: ../../include/contact_selectors.php:60
-msgid "Weekly"
-msgstr "Wöchentlich"
+#: ../../mod/filestorage.php:174
+msgid "Used: "
+msgstr "Verwendet:"
-#: ../../include/contact_selectors.php:61
-msgid "Monthly"
-msgstr "Monatlich"
+#: ../../mod/filestorage.php:175
+msgid "[directory]"
+msgstr "[Verzeichnis]"
-#: ../../include/contact_selectors.php:77
-msgid "OStatus"
-msgstr "OStatus"
+#: ../../mod/filestorage.php:177
+msgid "Limit: "
+msgstr "Limit:"
-#: ../../include/contact_selectors.php:78
-msgid "RSS/Atom"
-msgstr "RSS/Atom"
+#: ../../mod/lostpass.php:15
+msgid "No valid account found."
+msgstr "Kein gültiges Konto gefunden."
-#: ../../include/contact_selectors.php:82
-msgid "Zot!"
-msgstr "Zott"
+#: ../../mod/lostpass.php:29
+msgid "Password reset request issued. Check your email."
+msgstr "Zurücksetzen des Passworts veranlasst. Rufe bitte Deine E-Mails ab."
-#: ../../include/contact_selectors.php:83
-msgid "LinkedIn"
-msgstr "LinkedIn"
+#: ../../mod/lostpass.php:35 ../../mod/lostpass.php:102
+#, php-format
+msgid "Site Member (%s)"
+msgstr "Seiten Mitglied (%s)"
-#: ../../include/contact_selectors.php:84
-msgid "XMPP/IM"
-msgstr "XMPP/Chat"
+#: ../../mod/lostpass.php:40
+#, php-format
+msgid "Password reset requested at %s"
+msgstr "Passwort Rücksetzung auf %s angefordert"
-#: ../../include/contact_selectors.php:85
-msgid "MySpace"
-msgstr "MySpace"
+#: ../../mod/lostpass.php:63
+msgid ""
+"Request could not be verified. (You may have previously submitted it.) "
+"Password reset failed."
+msgstr "Die Anfrage konnte nicht verifiziert werden. (Es könnte sein, dass du vorher bereits eine Anfrage eingereicht hast.) Passwort Anforderung fehlgeschlagen."
-#: ../../include/profile_selectors.php:6
-msgid "Male"
-msgstr "Männlich"
+#: ../../mod/lostpass.php:85 ../../boot.php:1426
+msgid "Password Reset"
+msgstr "Zurücksetzen des Kennworts"
-#: ../../include/profile_selectors.php:6
-msgid "Female"
-msgstr "Weiblich"
+#: ../../mod/lostpass.php:86
+msgid "Your password has been reset as requested."
+msgstr "Dein Passwort wurde wie angefordert neu erstellt."
-#: ../../include/profile_selectors.php:6
-msgid "Currently Male"
-msgstr "Momentan männlich"
+#: ../../mod/lostpass.php:87
+msgid "Your new password is"
+msgstr "Dein neues Passwort lautet"
-#: ../../include/profile_selectors.php:6
-msgid "Currently Female"
-msgstr "Momentan weiblich"
+#: ../../mod/lostpass.php:88
+msgid "Save or copy your new password - and then"
+msgstr "Speichere oder kopiere dein neues Passwort - und dann"
-#: ../../include/profile_selectors.php:6
-msgid "Mostly Male"
-msgstr "Hauptsächlich männlich"
+#: ../../mod/lostpass.php:89
+msgid "click here to login"
+msgstr "Klicke hier, um dich anzumelden"
-#: ../../include/profile_selectors.php:6
-msgid "Mostly Female"
-msgstr "Hauptsächlich weiblich"
+#: ../../mod/lostpass.php:90
+msgid ""
+"Your password may be changed from the <em>Settings</em> page after "
+"successful login."
+msgstr "Dein Passwort kann unter <em>Einstellungen</em> nach einer erfolgreichen Anmeldung geändert werden."
-#: ../../include/profile_selectors.php:6
-msgid "Transgender"
-msgstr "Transgender"
+#: ../../mod/lostpass.php:107
+#, php-format
+msgid "Your password has changed at %s"
+msgstr "Auf %s wurde dein Passwort geändert"
-#: ../../include/profile_selectors.php:6
-msgid "Intersex"
-msgstr "Intersex"
+#: ../../mod/lostpass.php:122
+msgid "Forgot your Password?"
+msgstr "Kennwort vergessen?"
-#: ../../include/profile_selectors.php:6
-msgid "Transsexual"
-msgstr "Transsexuell"
+#: ../../mod/lostpass.php:123
+msgid ""
+"Enter your email address and submit to have your password reset. Then check "
+"your email for further instructions."
+msgstr "Gib deine E-Mail-Adresse an und fordere ein neues Passwort an. Es werden dir dann weitere Informationen per Mail zugesendet."
-#: ../../include/profile_selectors.php:6
-msgid "Hermaphrodite"
-msgstr "Hermaphrodit"
+#: ../../mod/lostpass.php:124
+msgid "Email Address"
+msgstr "E-Mail Adresse"
-#: ../../include/profile_selectors.php:6
-msgid "Neuter"
-msgstr "Neuter"
+#: ../../mod/lostpass.php:125
+msgid "Reset"
+msgstr "Zurücksetzen"
-#: ../../include/profile_selectors.php:6
-msgid "Non-specific"
-msgstr "Nicht spezifiziert"
+#: ../../mod/import.php:36
+msgid "Nothing to import."
+msgstr "Nichts zu importieren."
-#: ../../include/profile_selectors.php:6
-msgid "Other"
-msgstr "Andere"
+#: ../../mod/import.php:58
+msgid "Unable to download data from old server"
+msgstr "Daten können vom alten Server nicht heruntergeladen werden"
-#: ../../include/profile_selectors.php:6
-msgid "Undecided"
-msgstr "Unentschieden"
+#: ../../mod/import.php:64
+msgid "Imported file is empty."
+msgstr "Die importierte Datei ist leer."
-#: ../../include/profile_selectors.php:23
-msgid "Males"
-msgstr "Männer"
+#: ../../mod/import.php:88
+msgid ""
+"Cannot create a duplicate channel identifier on this system. Import failed."
+msgstr "Kann auf diesem System keinen duplizierten Kanal-Identifikator erzeugen. Import fehlgeschlagen."
-#: ../../include/profile_selectors.php:23
-msgid "Females"
-msgstr "Frauen"
+#: ../../mod/import.php:106
+msgid "Channel clone failed. Import failed."
+msgstr "Klonen des Kanals fehlgeschlagen. Import fehlgeschlagen."
-#: ../../include/profile_selectors.php:23
-msgid "Gay"
-msgstr "Schwul"
+#: ../../mod/import.php:116
+msgid "Cloned channel not found. Import failed."
+msgstr "Geklonter Kanal nicht gefunden. Import fehlgeschlagen."
-#: ../../include/profile_selectors.php:23
-msgid "Lesbian"
-msgstr "Lesbisch"
+#: ../../mod/import.php:358
+msgid "Import completed."
+msgstr "Import abgeschlossen."
-#: ../../include/profile_selectors.php:23
-msgid "No Preference"
-msgstr "Keine Vorlieben"
+#: ../../mod/import.php:371
+msgid "You must be logged in to use this feature."
+msgstr "Du musst angemeldet sein um diese Funktion zu nutzen."
-#: ../../include/profile_selectors.php:23
-msgid "Bisexual"
-msgstr "Bisexuell"
+#: ../../mod/import.php:376
+msgid "Import Channel"
+msgstr "Kanal importieren"
-#: ../../include/profile_selectors.php:23
-msgid "Autosexual"
-msgstr "Autosexual"
+#: ../../mod/import.php:377
+msgid ""
+"Use this form to import an existing channel from a different server/hub. You"
+" may retrieve the channel identity from the old server/hub via the network "
+"or provide an export file. Only identity and connections/relationships will "
+"be imported. Importation of content is not yet available."
+msgstr "Verwende dieses Formular um einen existierenden Kanal von einem anderen Server/Hub zu importieren. Du kannst die Kanal-Identität vom alten Server/Hub über das Netzwerk erhalten oder über eine exportierte Sicherungskopie. Es werden ausschließlich die Identität und die Verbindungen/Beziehungen importiert. Das Importieren von Inhalten ist derzeit nicht möglich."
-#: ../../include/profile_selectors.php:23
-msgid "Abstinent"
-msgstr "Abstinent"
+#: ../../mod/import.php:378
+msgid "File to Upload"
+msgstr "Hochzuladende Datei:"
-#: ../../include/profile_selectors.php:23
-msgid "Virgin"
-msgstr "Jungfrauen"
+#: ../../mod/import.php:379
+msgid "Or provide the old server/hub details"
+msgstr "Oder gib die Deteils deines alten Server/Hubs an"
-#: ../../include/profile_selectors.php:23
-msgid "Deviant"
-msgstr "Deviant"
+#: ../../mod/import.php:380
+msgid "Your old identity address (xyz@example.com)"
+msgstr "Die alte Adresse der Identität (xyz@example.com)"
-#: ../../include/profile_selectors.php:23
-msgid "Fetish"
-msgstr "Fetish"
+#: ../../mod/import.php:381
+msgid "Your old login email address"
+msgstr "Ihre alte Login E-Mail Adresse"
-#: ../../include/profile_selectors.php:23
-msgid "Oodles"
-msgstr "Oodles"
+#: ../../mod/import.php:382
+msgid "Your old login password"
+msgstr "Ihr altes Login Kennwort"
-#: ../../include/profile_selectors.php:23
-msgid "Nonsexual"
-msgstr "Nonsexual"
+#: ../../mod/import.php:383
+msgid ""
+"For either option, please choose whether to make this hub your new primary "
+"address, or whether your old location should continue this role. You will be"
+" able to post from either location, but only one can be marked as the "
+"primary location for files, photos, and media."
+msgstr "Egal welche Option du wählst, bitte lege fest, ob dieser Hub deine neue primäre Adresse sein soll oder ob dein alter Hub diese Rolle weiterhin wahrnimmt. Du kannst von beiden Orten aus neue Dinge posten, aber nur einer kann die primäre Adresse deiner Dateien, Fotos und anderen Mediendaten sein."
-#: ../../include/profile_selectors.php:42
-msgid "Single"
-msgstr "Single"
+#: ../../mod/import.php:384
+msgid "Make this hub my primary location"
+msgstr "Dieser Hub ist mein primärer Server."
-#: ../../include/profile_selectors.php:42
-msgid "Lonely"
-msgstr "Einsam"
+#: ../../mod/manage.php:63
+#, php-format
+msgid "You have created %1$.0f of %2$.0f allowed channels."
+msgstr "Du hast %1$.0f von %2$.0f erlaubten Kanälen eingerichtet."
-#: ../../include/profile_selectors.php:42
-msgid "Available"
-msgstr "Verfügbar"
+#: ../../mod/manage.php:71
+msgid "Create a new channel"
+msgstr "Erzeuge neues Kanal"
-#: ../../include/profile_selectors.php:42
-msgid "Unavailable"
-msgstr "Nicht verfügbar"
+#: ../../mod/manage.php:76
+msgid "Channel Manager"
+msgstr "Kanal-Manager"
-#: ../../include/profile_selectors.php:42
-msgid "Has crush"
-msgstr "verknallt"
+#: ../../mod/manage.php:77
+msgid "Current Channel"
+msgstr "Aktueller Kanal"
-#: ../../include/profile_selectors.php:42
-msgid "Infatuated"
-msgstr "verliebt"
+#: ../../mod/manage.php:79
+msgid "Attach to one of your channels by selecting it."
+msgstr "Wähle einen deiner Kanäle aus um ihn zu verwenden."
-#: ../../include/profile_selectors.php:42
-msgid "Dating"
-msgstr "Dating"
+#: ../../mod/manage.php:80
+msgid "Default Channel"
+msgstr "Standard Kanal"
-#: ../../include/profile_selectors.php:42
-msgid "Unfaithful"
-msgstr "Untreu"
+#: ../../mod/manage.php:81
+msgid "Make Default"
+msgstr "Zum Standard machen"
-#: ../../include/profile_selectors.php:42
-msgid "Sex Addict"
-msgstr "Sexbesessen"
+#: ../../mod/vote.php:97
+msgid "Total votes"
+msgstr "Stimmen gesamt"
-#: ../../include/profile_selectors.php:42 ../../include/user.php:272
-msgid "Friends"
-msgstr "Freunde"
+#: ../../mod/vote.php:98
+msgid "Average Rating"
+msgstr "durchschnittliche Bewertung"
-#: ../../include/profile_selectors.php:42
-msgid "Friends/Benefits"
-msgstr "Freunde/Zuwendungen"
+#: ../../mod/match.php:16
+msgid "Profile Match"
+msgstr "Profil-Ãœbereinstimmungen"
-#: ../../include/profile_selectors.php:42
-msgid "Casual"
-msgstr "Casual"
+#: ../../mod/match.php:24
+msgid "No keywords to match. Please add keywords to your default profile."
+msgstr "Keine Schlüsselbegriffe für den Abgleich gefunden. Bitte füge Schlüsselbegriffe zu deinem Standardprofil hinzu."
-#: ../../include/profile_selectors.php:42
-msgid "Engaged"
-msgstr "Verlobt"
+#: ../../mod/match.php:61
+msgid "is interested in:"
+msgstr "interessiert sich für:"
-#: ../../include/profile_selectors.php:42
-msgid "Married"
-msgstr "Verheiratet"
+#: ../../mod/match.php:69
+msgid "No matches"
+msgstr "Keine Ãœbereinstimmungen"
-#: ../../include/profile_selectors.php:42
-msgid "Imaginarily married"
-msgstr "imaginär verheiratet"
+#: ../../mod/zfinger.php:23
+msgid "invalid target signature"
+msgstr "Ungültige Signatur des Ziels"
-#: ../../include/profile_selectors.php:42
-msgid "Partners"
-msgstr "Partner"
+#: ../../mod/settings.php:71
+msgid "Name is required"
+msgstr "Name wird benötigt"
-#: ../../include/profile_selectors.php:42
-msgid "Cohabiting"
-msgstr "zusammenlebend"
+#: ../../mod/settings.php:75
+msgid "Key and Secret are required"
+msgstr "Schlüssel und Geheimnis werden benötigt"
-#: ../../include/profile_selectors.php:42
-msgid "Common law"
-msgstr "wilde Ehe"
+#: ../../mod/settings.php:79 ../../mod/settings.php:533
+msgid "Update"
+msgstr "Update"
-#: ../../include/profile_selectors.php:42
-msgid "Happy"
-msgstr "Glücklich"
+#: ../../mod/settings.php:192
+msgid "Passwords do not match. Password unchanged."
+msgstr "Kennwörter stimmen nicht überein. Kennwort nicht verändert."
-#: ../../include/profile_selectors.php:42
-msgid "Not looking"
-msgstr "Nicht auf der Suche"
+#: ../../mod/settings.php:196
+msgid "Empty passwords are not allowed. Password unchanged."
+msgstr "Leere Kennwörter sind nicht erlaubt. Kennwort nicht verändert."
-#: ../../include/profile_selectors.php:42
-msgid "Swinger"
-msgstr "Swinger"
+#: ../../mod/settings.php:209
+msgid "Password changed."
+msgstr "Kennwort geändert."
-#: ../../include/profile_selectors.php:42
-msgid "Betrayed"
-msgstr "Betrogen"
+#: ../../mod/settings.php:211
+msgid "Password update failed. Please try again."
+msgstr "Kennwortänderung fehlgeschlagen. Bitte versuche es noch einmal."
-#: ../../include/profile_selectors.php:42
-msgid "Separated"
-msgstr "Getrennt"
+#: ../../mod/settings.php:225
+msgid "Not valid email."
+msgstr "Keine gültige E-Mail Adresse."
-#: ../../include/profile_selectors.php:42
-msgid "Unstable"
-msgstr "Unstabil"
+#: ../../mod/settings.php:228
+msgid "Protected email address. Cannot change to that email."
+msgstr "Geschützte E-Mail Adresse. Diese kann nicht verändert werden."
-#: ../../include/profile_selectors.php:42
-msgid "Divorced"
-msgstr "Geschieden"
+#: ../../mod/settings.php:237
+msgid "System failure storing new email. Please try again."
+msgstr "Systemfehler während des Speicherns der neuen Mail. Bitte versuche es noch einmal."
-#: ../../include/profile_selectors.php:42
-msgid "Imaginarily divorced"
-msgstr "imaginär geschieden"
+#: ../../mod/settings.php:435
+msgid "Settings updated."
+msgstr "Einstellungen aktualisiert."
-#: ../../include/profile_selectors.php:42
-msgid "Widowed"
-msgstr "Verwitwet"
+#: ../../mod/settings.php:506 ../../mod/settings.php:532
+#: ../../mod/settings.php:568
+msgid "Add application"
+msgstr "Anwendung hinzufügen"
-#: ../../include/profile_selectors.php:42
-msgid "Uncertain"
-msgstr "Unsicher"
+#: ../../mod/settings.php:509
+msgid "Name of application"
+msgstr "Name der Anwendung"
-#: ../../include/profile_selectors.php:42
-msgid "It's complicated"
-msgstr "Ist kompliziert"
+#: ../../mod/settings.php:510 ../../mod/settings.php:536
+msgid "Consumer Key"
+msgstr "Consumer Key"
-#: ../../include/profile_selectors.php:42
-msgid "Don't care"
-msgstr "Ist mir nicht wichtig"
+#: ../../mod/settings.php:510 ../../mod/settings.php:511
+msgid "Automatically generated - change if desired. Max length 20"
+msgstr "Automatisch erzeugt - ändern falls erwünscht. Maximale Länge 20"
-#: ../../include/profile_selectors.php:42
-msgid "Ask me"
-msgstr "Frag mich"
+#: ../../mod/settings.php:511 ../../mod/settings.php:537
+msgid "Consumer Secret"
+msgstr "Consumer Secret"
-#: ../../include/event.php:17 ../../include/bb2diaspora.php:249
-msgid "Starts:"
-msgstr "Beginnt:"
+#: ../../mod/settings.php:512 ../../mod/settings.php:538
+msgid "Redirect"
+msgstr "Umleitung"
-#: ../../include/event.php:27 ../../include/bb2diaspora.php:257
-msgid "Finishes:"
-msgstr "Endet:"
+#: ../../mod/settings.php:512
+msgid ""
+"Redirect URI - leave blank unless your application specifically requires "
+"this"
+msgstr "Umleitungs-URl - lasse dies frei außer deine Anwendung erfordert dies explizit"
-#: ../../include/delivery.php:456 ../../include/notifier.php:678
-msgid "(no subject)"
-msgstr "(kein Betreff)"
+#: ../../mod/settings.php:513 ../../mod/settings.php:539
+msgid "Icon url"
+msgstr "Symbol-URL"
-#: ../../include/delivery.php:463 ../../include/enotify.php:26
-#: ../../include/notifier.php:685
-msgid "noreply"
-msgstr "noreply"
+#: ../../mod/settings.php:513
+msgid "Optional"
+msgstr "Optional"
-#: ../../include/text.php:243
-msgid "prev"
-msgstr "vorige"
+#: ../../mod/settings.php:524
+msgid "You can't edit this application."
+msgstr "Diese Anwendung kann nicht bearbeitet werden."
-#: ../../include/text.php:245
-msgid "first"
-msgstr "erste"
+#: ../../mod/settings.php:567
+msgid "Connected Apps"
+msgstr "Verbundene Apps"
-#: ../../include/text.php:274
-msgid "last"
-msgstr "letzte"
+#: ../../mod/settings.php:571
+msgid "Client key starts with"
+msgstr "Client key beginnt mit"
-#: ../../include/text.php:277
-msgid "next"
-msgstr "nächste"
+#: ../../mod/settings.php:572
+msgid "No name"
+msgstr "Kein Name"
-#: ../../include/text.php:568
-msgid "No contacts"
-msgstr "Keine Kontakte"
+#: ../../mod/settings.php:573
+msgid "Remove authorization"
+msgstr "Authorisierung aufheben"
-#: ../../include/text.php:577
-#, php-format
-msgid "%d Contact"
-msgid_plural "%d Contacts"
-msgstr[0] "%d Kontakt"
-msgstr[1] "%d Kontakte"
+#: ../../mod/settings.php:584
+msgid "No feature settings configured"
+msgstr "Keine Funktions-Einstellungen konfiguriert"
-#: ../../include/text.php:835
-msgid "Monday"
-msgstr "Montag"
+#: ../../mod/settings.php:592
+msgid "Feature Settings"
+msgstr "Funktions-Einstellungen"
-#: ../../include/text.php:835
-msgid "Tuesday"
-msgstr "Dienstag"
+#: ../../mod/settings.php:615
+msgid "Account Settings"
+msgstr "Konto-Einstellungen"
-#: ../../include/text.php:835
-msgid "Wednesday"
-msgstr "Mittwoch"
+#: ../../mod/settings.php:616
+msgid "Password Settings"
+msgstr "Kennwort-Einstellungen"
-#: ../../include/text.php:835
-msgid "Thursday"
-msgstr "Donnerstag"
+#: ../../mod/settings.php:617
+msgid "New Password:"
+msgstr "Neues Passwort:"
-#: ../../include/text.php:835
-msgid "Friday"
-msgstr "Freitag"
+#: ../../mod/settings.php:618
+msgid "Confirm:"
+msgstr "Bestätigen:"
-#: ../../include/text.php:835
-msgid "Saturday"
-msgstr "Samstag"
+#: ../../mod/settings.php:618
+msgid "Leave password fields blank unless changing"
+msgstr "Lasse die Passwort -Felder leer außer du möchtest das Passwort ändern"
-#: ../../include/text.php:835
-msgid "Sunday"
-msgstr "Sonntag"
+#: ../../mod/settings.php:620 ../../mod/settings.php:912
+msgid "Email Address:"
+msgstr "Email Adresse:"
-#: ../../include/text.php:839
-msgid "January"
-msgstr "Januar"
+#: ../../mod/settings.php:621
+msgid "Remove Account"
+msgstr "Konto entfernen"
-#: ../../include/text.php:839
-msgid "February"
-msgstr "Februar"
+#: ../../mod/settings.php:622
+msgid "Warning: This action is permanent and cannot be reversed."
+msgstr "Achtung: Diese Aktion ist permanent und kann nicht rückgänging gemacht werden."
-#: ../../include/text.php:839
-msgid "March"
-msgstr "März"
+#: ../../mod/settings.php:638
+msgid "Off"
+msgstr "Aus"
-#: ../../include/text.php:839
-msgid "April"
-msgstr "April"
+#: ../../mod/settings.php:638
+msgid "On"
+msgstr "An"
-#: ../../include/text.php:839
-msgid "May"
-msgstr "Mai"
+#: ../../mod/settings.php:645
+msgid "Additional Features"
+msgstr "Zusätzliche Funktionen"
-#: ../../include/text.php:839
-msgid "June"
-msgstr "Juni"
+#: ../../mod/settings.php:670
+msgid "Connector Settings"
+msgstr "Connector-Einstellungen"
-#: ../../include/text.php:839
-msgid "July"
-msgstr "Juli"
+#: ../../mod/settings.php:740
+msgid "Display Settings"
+msgstr "Anzeige-Einstellungen"
-#: ../../include/text.php:839
-msgid "August"
-msgstr "August"
+#: ../../mod/settings.php:746
+msgid "Display Theme:"
+msgstr "Anzeige Theme:"
-#: ../../include/text.php:839
-msgid "September"
-msgstr "September"
+#: ../../mod/settings.php:747
+msgid "Mobile Theme:"
+msgstr "Mobile Theme:"
-#: ../../include/text.php:839
-msgid "October"
-msgstr "Oktober"
+#: ../../mod/settings.php:748
+msgid "Update browser every xx seconds"
+msgstr "Browser alle xx Sekunden aktualisieren"
-#: ../../include/text.php:839
-msgid "November"
-msgstr "November"
+#: ../../mod/settings.php:748
+msgid "Minimum of 10 seconds, no maximum"
+msgstr "Minimum von 10 Sekunden, kein Maximum"
-#: ../../include/text.php:839
-msgid "December"
-msgstr "Dezember"
+#: ../../mod/settings.php:749
+msgid "Maximum number of conversations to load at any time:"
+msgstr "Maximale Anzahl von Unterhaltungen die gleichzeitig geladen werden sollen:"
-#: ../../include/text.php:925
-msgid "bytes"
-msgstr "Byte"
+#: ../../mod/settings.php:749
+msgid "Maximum of 100 items"
+msgstr "Maximum von 100 Beiträgen"
-#: ../../include/text.php:945 ../../include/text.php:960
-msgid "remove"
-msgstr "löschen"
+#: ../../mod/settings.php:750
+msgid "Don't show emoticons"
+msgstr "Emoticons nicht zeigen"
-#: ../../include/text.php:945 ../../include/text.php:960
-msgid "[remove]"
-msgstr "[löschen]"
+#: ../../mod/settings.php:786
+msgid "Nobody except yourself"
+msgstr "Niemand außer du selbst"
-#: ../../include/text.php:948
-msgid "Categories:"
-msgstr "Kategorien:"
+#: ../../mod/settings.php:787
+msgid "Only those you specifically allow"
+msgstr "Nur die, denen du es explizit erlaubst"
-#: ../../include/text.php:963
-msgid "Filed under:"
-msgstr "Abgelegt unter:"
+#: ../../mod/settings.php:788
+msgid "Anybody in your address book"
+msgstr "Jeder aus Ihrem Adressbuch"
-#: ../../include/text.php:979 ../../include/text.php:991
-msgid "Click to open/close"
-msgstr "Zum öffnen/schließen klicken"
+#: ../../mod/settings.php:789
+msgid "Anybody on this website"
+msgstr "Jeder auf dieser Website"
-#: ../../include/text.php:1096 ../../include/user.php:230
-msgid "default"
-msgstr "standard"
+#: ../../mod/settings.php:790
+msgid "Anybody in this network"
+msgstr "Jeder in diesem Netzwerk"
-#: ../../include/text.php:1108
-msgid "Select an alternate language"
-msgstr "Alternative Sprache auswählen"
+#: ../../mod/settings.php:791
+msgid "Anybody on the internet"
+msgstr "Jeder im Internet"
-#: ../../include/text.php:1318
-msgid "activity"
-msgstr "Aktivität"
+#: ../../mod/settings.php:865
+msgid "Publish your default profile in the network directory"
+msgstr "Veröffentliche dein Standard-Profil im Netzwerk-Verzeichnis"
-#: ../../include/text.php:1320
-msgid "comment"
-msgstr "Kommentar"
+#: ../../mod/settings.php:870
+msgid "Allow us to suggest you as a potential friend to new members?"
+msgstr "Dürfen wir dich neuen Mitgliedern als potentiellen Kontakt vorschlagen?"
-#: ../../include/text.php:1321
-msgid "post"
-msgstr "Beitrag"
+#: ../../mod/settings.php:874 ../../mod/profile_photo.php:288
+msgid "or"
+msgstr "oder"
-#: ../../include/text.php:1476
-msgid "Item filed"
-msgstr "Beitrag abgelegt"
+#: ../../mod/settings.php:879
+msgid "Your channel address is"
+msgstr "Deine Kanal-Adresse lautet"
-#: ../../include/diaspora.php:593
-msgid "Sharing notification from Diaspora network"
-msgstr "Freigabe-Benachrichtigung von Diaspora"
+#: ../../mod/settings.php:901
+msgid "Channel Settings"
+msgstr "Channel-Einstellungen"
-#: ../../include/diaspora.php:2074
-msgid "Attachments:"
-msgstr "Anhänge:"
+#: ../../mod/settings.php:910
+msgid "Basic Settings"
+msgstr "Grundeinstellungen"
-#: ../../include/network.php:827
-msgid "view full size"
-msgstr "Volle Größe anzeigen"
+#: ../../mod/settings.php:913
+msgid "Your Timezone:"
+msgstr "Ihre Zeitzone:"
-#: ../../include/oembed.php:134
-msgid "Embedded content"
-msgstr "Eingebetteter Inhalt"
+#: ../../mod/settings.php:914
+msgid "Default Post Location:"
+msgstr "Standardstandort:"
-#: ../../include/oembed.php:143
-msgid "Embedding disabled"
-msgstr "Einbettungen deaktiviert"
+#: ../../mod/settings.php:915
+msgid "Use Browser Location:"
+msgstr "Standort des Browsers verwenden:"
-#: ../../include/group.php:25
-msgid ""
-"A deleted group with this name was revived. Existing item permissions "
-"<strong>may</strong> apply to this group and any future members. If this is "
-"not what you intended, please create another group with a different name."
-msgstr "Eine gelöschte Gruppe mit diesem Namen wurde wiederbelebt. Bestehende Berechtigungseinstellungen <strong>könnten</strong> auf diese Gruppe oder zukünftige Mitglieder angewandt werden. Falls du dies nicht möchtest, erstelle bitte eine andere Gruppe mit einem anderen Namen."
+#: ../../mod/settings.php:917
+msgid "Adult Content"
+msgstr "Nicht Jugendfreie-Inhalte"
-#: ../../include/group.php:176
-msgid "Default privacy group for new contacts"
-msgstr "Voreingestellte Gruppe für neue Kontakte"
+#: ../../mod/settings.php:917
+msgid "This channel publishes adult content."
+msgstr "Dieser Kanal veröffentlicht nicht Jugendfreie-Inhalte"
-#: ../../include/group.php:195
-msgid "Everybody"
-msgstr "Alle Kontakte"
+#: ../../mod/settings.php:919
+msgid "Security and Privacy Settings"
+msgstr "Sicherheits- und Datenschutz-Einstellungen"
-#: ../../include/group.php:218
-msgid "edit"
-msgstr "bearbeiten"
+#: ../../mod/settings.php:921
+msgid "Quick Privacy Settings:"
+msgstr "Schnelle Datenschutz-Einstellungen:"
-#: ../../include/group.php:239
-msgid "Groups"
-msgstr "Gruppen"
+#: ../../mod/settings.php:922
+msgid "Very Public - extremely permissive"
+msgstr "Sehr offen - extrem freizügig"
-#: ../../include/group.php:240
-msgid "Edit group"
-msgstr "Gruppe bearbeiten"
+#: ../../mod/settings.php:923
+msgid "Typical - default public, privacy when desired"
+msgstr "Typisch - Standard öffentlich, Privatheit wenn gewünscht"
-#: ../../include/group.php:241
-msgid "Create a new group"
-msgstr "Neue Gruppe erstellen"
+#: ../../mod/settings.php:924
+msgid "Private - default private, rarely open or public"
+msgstr "Privat - Standard privat, selten offen oder öffentlich"
-#: ../../include/group.php:242
-msgid "Contacts not in any group"
-msgstr "Kontakte in keiner Gruppe"
+#: ../../mod/settings.php:925
+msgid "Blocked - default blocked to/from everybody"
+msgstr "Geschlossen - Standard zu und von jedem geblockt"
-#: ../../include/nav.php:46 ../../boot.php:821
-msgid "Logout"
-msgstr "Abmelden"
+#: ../../mod/settings.php:928
+msgid "Maximum Friend Requests/Day:"
+msgstr "Maximale Kontaktanfragen pro Tag:"
-#: ../../include/nav.php:46
-msgid "End this session"
-msgstr "Diese Sitzung beenden"
+#: ../../mod/settings.php:928
+msgid "May reduce spam activity"
+msgstr "Kann die Spam-Aktivität verringern"
-#: ../../include/nav.php:49 ../../boot.php:1508
-msgid "Status"
-msgstr "Status"
+#: ../../mod/settings.php:929
+msgid "Default Post Permissions"
+msgstr "Beitragszugriffrechte Standardeinstellungen"
-#: ../../include/nav.php:64
-msgid "Sign in"
-msgstr "Anmelden"
+#: ../../mod/settings.php:941
+msgid "Maximum private messages per day from unknown people:"
+msgstr "Maximale Anzahl privater Nachrichten pro Tag von unbekannten Leuten:"
-#: ../../include/nav.php:77
-msgid "Home Page"
-msgstr "Homepage"
+#: ../../mod/settings.php:941
+msgid "Useful to reduce spamming"
+msgstr "Nützlich um Spam zu verringern"
-#: ../../include/nav.php:81
-msgid "Create an account"
-msgstr "Nutzerkonto erstellen"
+#: ../../mod/settings.php:944
+msgid "Notification Settings"
+msgstr "Benachrichtigungs-Einstellungen"
-#: ../../include/nav.php:86
-msgid "Help and documentation"
-msgstr "Hilfe und Dokumentation"
+#: ../../mod/settings.php:945
+msgid "By default post a status message when:"
+msgstr "Sende standardmäßig Status-Nachrichten wenn:"
-#: ../../include/nav.php:89
-msgid "Apps"
-msgstr "Apps"
+#: ../../mod/settings.php:946
+msgid "accepting a friend request"
+msgstr "einer Kontaktanfrage stattgegeben wurde"
-#: ../../include/nav.php:89
-msgid "Addon applications, utilities, games"
-msgstr "Addon Anwendungen, Dienstprogramme, Spiele"
+#: ../../mod/settings.php:947
+msgid "joining a forum/community"
+msgstr "ein Forum beigetreten wurde"
-#: ../../include/nav.php:91
-msgid "Search site content"
-msgstr "Inhalt der Seite durchsuchen"
+#: ../../mod/settings.php:948
+msgid "making an <em>interesting</em> profile change"
+msgstr "eine <em>interessante</em> Änderung am Profil vorgenommen wurde"
-#: ../../include/nav.php:101
-msgid "Conversations on this site"
-msgstr "Unterhaltungen auf dieser Seite"
+#: ../../mod/settings.php:949
+msgid "Send a notification email when:"
+msgstr "Eine Email Benachrichtigung senden wenn:"
-#: ../../include/nav.php:103
-msgid "Directory"
-msgstr "Verzeichnis"
+#: ../../mod/settings.php:950
+msgid "You receive an introduction"
+msgstr "Du eine Vorstellung erhältst"
-#: ../../include/nav.php:103
-msgid "People directory"
-msgstr "Nutzerverzeichnis"
+#: ../../mod/settings.php:951
+msgid "Your introductions are confirmed"
+msgstr "Deine Vorstellung bestätigt wurde."
-#: ../../include/nav.php:113
-msgid "Conversations from your friends"
-msgstr "Unterhaltungen deiner Kontakte"
+#: ../../mod/settings.php:952
+msgid "Someone writes on your profile wall"
+msgstr "Jemand auf deine Pinnwand schreibt"
-#: ../../include/nav.php:121
-msgid "Friend Requests"
-msgstr "Kontaktanfragen"
+#: ../../mod/settings.php:953
+msgid "Someone writes a followup comment"
+msgstr "Jemand einen Beitrag kommentiert"
-#: ../../include/nav.php:123
-msgid "See all notifications"
-msgstr "Alle Benachrichtigungen anzeigen"
+#: ../../mod/settings.php:954
+msgid "You receive a private message"
+msgstr "Du eine private Nachricht erhältst"
-#: ../../include/nav.php:124
-msgid "Mark all system notifications seen"
-msgstr "Markiere alle Systembenachrichtigungen als gelesen"
+#: ../../mod/settings.php:955
+msgid "You receive a friend suggestion"
+msgstr "Du einen Kontaktvorschlag erhältst"
-#: ../../include/nav.php:128
-msgid "Private mail"
-msgstr "Private Email"
+#: ../../mod/settings.php:956
+msgid "You are tagged in a post"
+msgstr "Du wurdest in einem Beitrag getaggt"
-#: ../../include/nav.php:129
-msgid "Inbox"
-msgstr "Eingang"
+#: ../../mod/settings.php:957
+msgid "You are poked/prodded/etc. in a post"
+msgstr "Du in einer Nachricht angestupst/geknufft/o.ä. wirst"
-#: ../../include/nav.php:130
-msgid "Outbox"
-msgstr "Ausgang"
+#: ../../mod/settings.php:960
+msgid "Advanced Account/Page Type Settings"
+msgstr "Erweiterte Account / Seiten Arten Einstellungen"
-#: ../../include/nav.php:134
-msgid "Manage"
-msgstr "Verwalten"
+#: ../../mod/settings.php:961
+msgid "Change the behaviour of this account for special situations"
+msgstr "Ändere das Verhalten dieses Accounts unter speziellen Umständen"
-#: ../../include/nav.php:134
-msgid "Manage other pages"
-msgstr "Andere Seiten verwalten"
+#: ../../mod/mail.php:33
+msgid "Unable to lookup recipient."
+msgstr "Konnte den Empfänger nicht finden."
-#: ../../include/nav.php:138 ../../boot.php:1069
-msgid "Profiles"
-msgstr "Profile"
+#: ../../mod/mail.php:41
+msgid "Unable to communicate with requested channel."
+msgstr "Die Kommunikation mit dem ausgewählten Kanal ist fehlgeschlagen."
-#: ../../include/nav.php:138 ../../boot.php:1069
-msgid "Manage/edit profiles"
-msgstr "Profile verwalten/editieren"
+#: ../../mod/mail.php:48
+msgid "Cannot verify requested channel."
+msgstr "Verifizierung des angeforderten Kanals fehlgeschlagen."
-#: ../../include/nav.php:139
-msgid "Manage/edit friends and contacts"
-msgstr "Freunde und Kontakte verwalten/editieren"
+#: ../../mod/mail.php:74
+msgid "Selected channel has private message restrictions. Send failed."
+msgstr "Der ausgewählte Kanal hat Einschränkungen bzgl. privater Nachrichten. Senden fehlgeschlagen."
-#: ../../include/nav.php:146
-msgid "Site setup and configuration"
-msgstr "Einstellungen der Seite und Konfiguration"
+#: ../../mod/mail.php:121 ../../mod/message.php:31
+msgid "Messages"
+msgstr "Nachrichten"
-#: ../../include/nav.php:169
-msgid "Nothing new here"
-msgstr "Keine Neuigkeiten."
+#: ../../mod/mail.php:132
+msgid "Message deleted."
+msgstr "Nachricht gelöscht."
-#: ../../include/contact_widgets.php:6
-msgid "Add New Contact"
-msgstr "Neuen Kontakt hinzufügen"
+#: ../../mod/mail.php:149
+msgid "Message recalled."
+msgstr "Nachricht widerrufen."
-#: ../../include/contact_widgets.php:7
-msgid "Enter address or web location"
-msgstr "Adresse oder Web-Link eingeben"
+#: ../../mod/mail.php:206
+msgid "Send Private Message"
+msgstr "Private Nachricht senden"
-#: ../../include/contact_widgets.php:8
-msgid "Example: bob@example.com, http://example.com/barbara"
-msgstr "Beispiel: bob@example.com, http://example.com/barbara"
+#: ../../mod/mail.php:207 ../../mod/mail.php:323
+msgid "To:"
+msgstr "An:"
-#: ../../include/contact_widgets.php:23
-#, php-format
-msgid "%d invitation available"
-msgid_plural "%d invitations available"
-msgstr[0] "%d Einladung verfügbar"
-msgstr[1] "%d Einladungen verfügbar"
+#: ../../mod/mail.php:212 ../../mod/mail.php:325
+msgid "Subject:"
+msgstr "Betreff:"
-#: ../../include/contact_widgets.php:29
-msgid "Find People"
-msgstr "Leute finden"
+#: ../../mod/mail.php:249
+msgid "Message not found."
+msgstr "Nachricht nicht gefunden."
-#: ../../include/contact_widgets.php:30
-msgid "Enter name or interest"
-msgstr "Name oder Interessen eingeben"
+#: ../../mod/mail.php:292 ../../mod/message.php:72
+msgid "Delete message"
+msgstr "Nachricht löschen"
-#: ../../include/contact_widgets.php:31
-msgid "Connect/Follow"
-msgstr "Verbinden/Folgen"
+#: ../../mod/mail.php:293
+msgid "Recall message"
+msgstr "Widerrufe die Nachricht"
-#: ../../include/contact_widgets.php:32
-msgid "Examples: Robert Morgenstein, Fishing"
-msgstr "Beispiel: Robert Morgenstein, Angeln"
+#: ../../mod/mail.php:295
+msgid "Message has been recalled."
+msgstr "Die Nachricht wurde widerrufen."
-#: ../../include/contact_widgets.php:36
-msgid "Random Profile"
-msgstr "Zufälliges Profil"
+#: ../../mod/mail.php:312
+msgid "Private Conversation"
+msgstr "Private Unterhaltung"
-#: ../../include/contact_widgets.php:68
-msgid "Networks"
-msgstr "Netzwerke"
+#: ../../mod/mail.php:316
+msgid "Delete conversation"
+msgstr "Unterhaltung löschen"
-#: ../../include/contact_widgets.php:71
-msgid "All Networks"
-msgstr "Alle Netzwerke"
+#: ../../mod/mail.php:318
+msgid ""
+"No secure communications available. You <strong>may</strong> be able to "
+"respond from the sender's profile page."
+msgstr "Keine sichere Kommunikation verfügbar. <strong>Eventuell</strong> kannst du von der Profilseite des Absenders antworten."
-#: ../../include/contact_widgets.php:98
-msgid "Saved Folders"
-msgstr "Gespeicherte Ordner"
+#: ../../mod/mail.php:322
+msgid "Send Reply"
+msgstr "Antwort senden"
-#: ../../include/contact_widgets.php:101 ../../include/contact_widgets.php:129
-msgid "Everything"
-msgstr "Alles"
+#: ../../mod/editlayout.php:36 ../../mod/editpost.php:20
+#: ../../mod/editwebpage.php:32 ../../mod/editblock.php:36
+msgid "Item not found"
+msgstr "Element nicht gefunden"
-#: ../../include/contact_widgets.php:126
-msgid "Categories"
-msgstr "Kategorien"
+#: ../../mod/editlayout.php:68
+msgid "Edit Layout"
+msgstr "Layout bearbeiten"
-#: ../../include/auth.php:36
-msgid "Logged out."
-msgstr "Abgemeldet."
+#: ../../mod/editlayout.php:105 ../../mod/editpost.php:102
+#: ../../mod/editwebpage.php:148 ../../mod/editblock.php:119
+msgid "Insert YouTube video"
+msgstr "YouTube-Video einfügen"
-#: ../../include/auth.php:115
-msgid ""
-"We encountered a problem while logging in with the OpenID you provided. "
-"Please check the correct spelling of the ID."
-msgstr "Beim Versuch dich mit der von dir angegebenen OpenID anzumelden trat ein Problem auf. Bitte überprüfe, dass du die OpenID richtig geschrieben hast."
+#: ../../mod/editlayout.php:106 ../../mod/editpost.php:103
+#: ../../mod/editwebpage.php:149 ../../mod/editblock.php:120
+msgid "Insert Vorbis [.ogg] video"
+msgstr "Vorbis [.ogg]-Video einfügen"
-#: ../../include/auth.php:115
-msgid "The error message was:"
-msgstr "Die Fehlermeldung lautete:"
+#: ../../mod/editlayout.php:107 ../../mod/editpost.php:104
+#: ../../mod/editwebpage.php:150 ../../mod/editblock.php:121
+msgid "Insert Vorbis [.ogg] audio"
+msgstr "Vorbis [.ogg]-Audio einfügen"
-#: ../../include/datetime.php:43 ../../include/datetime.php:45
-msgid "Miscellaneous"
-msgstr "Verschiedenes"
+#: ../../mod/editlayout.php:141
+msgid "Delete Layout"
+msgstr "Layout löschen"
-#: ../../include/datetime.php:131 ../../include/datetime.php:263
-msgid "year"
-msgstr "Jahr"
+#: ../../mod/profile_photo.php:44
+msgid "Image uploaded but image cropping failed."
+msgstr "Bild hochgeladen, aber das zurecht schneiden schlug fehl."
-#: ../../include/datetime.php:136 ../../include/datetime.php:264
-msgid "month"
-msgstr "Monat"
+#: ../../mod/profile_photo.php:97
+msgid "Image resize failed."
+msgstr "Bild-Anpassung fehlgeschlagen."
-#: ../../include/datetime.php:141 ../../include/datetime.php:266
-msgid "day"
-msgstr "Tag"
+#: ../../mod/profile_photo.php:141
+msgid ""
+"Shift-reload the page or clear browser cache if the new photo does not "
+"display immediately."
+msgstr "Leere den Browser Cache oder nutze Umschalten-Neu Laden sollte das neue Foto nicht sofort angezeigt werden."
-#: ../../include/datetime.php:254
-msgid "never"
-msgstr "nie"
+#: ../../mod/profile_photo.php:163
+#, php-format
+msgid "Image exceeds size limit of %d"
+msgstr "Bild ist größer als das Limit von %d"
-#: ../../include/datetime.php:260
-msgid "less than a second ago"
-msgstr "vor weniger als einer Sekunde"
+#: ../../mod/profile_photo.php:172
+msgid "Unable to process image."
+msgstr "Kann Bild nicht verarbeiten."
-#: ../../include/datetime.php:263
-msgid "years"
-msgstr "Jahre"
+#: ../../mod/profile_photo.php:214 ../../mod/profile_photo.php:262
+msgid "Photo not available."
+msgstr "Foto nicht verfügbar."
-#: ../../include/datetime.php:264
-msgid "months"
-msgstr "Monate"
+#: ../../mod/profile_photo.php:281
+msgid "Upload File:"
+msgstr "Datei hochladen:"
-#: ../../include/datetime.php:265
-msgid "week"
-msgstr "Woche"
+#: ../../mod/profile_photo.php:282
+msgid "Select a profile:"
+msgstr "Wählen Sie ein Profil:"
-#: ../../include/datetime.php:265
-msgid "weeks"
-msgstr "Wochen"
+#: ../../mod/profile_photo.php:283
+msgid "Upload Profile Photo"
+msgstr "Lade neues Profilfoto hoch"
-#: ../../include/datetime.php:266
-msgid "days"
-msgstr "Tage"
+#: ../../mod/profile_photo.php:284
+msgid "Upload"
+msgstr "Hochladen"
-#: ../../include/datetime.php:267
-msgid "hour"
-msgstr "Stunde"
+#: ../../mod/profile_photo.php:288
+msgid "skip this step"
+msgstr "diesen Schritt überspringen"
-#: ../../include/datetime.php:267
-msgid "hours"
-msgstr "Stunden"
+#: ../../mod/profile_photo.php:288
+msgid "select a photo from your photo albums"
+msgstr "ein Foto aus meinen Fotoalben"
-#: ../../include/datetime.php:268
-msgid "minute"
-msgstr "Minute"
+#: ../../mod/profile_photo.php:302
+msgid "Crop Image"
+msgstr "Bild zuschneiden"
-#: ../../include/datetime.php:268
-msgid "minutes"
-msgstr "Minuten"
+#: ../../mod/profile_photo.php:303
+msgid "Please adjust the image cropping for optimum viewing."
+msgstr "Bitte passe das Bild zur optimalen Anzeige an."
-#: ../../include/datetime.php:269
-msgid "second"
-msgstr "Sekunde"
+#: ../../mod/profile_photo.php:305
+msgid "Done Editing"
+msgstr "Bearbeitung fertigstellen"
-#: ../../include/datetime.php:269
-msgid "seconds"
-msgstr "Sekunden"
+#: ../../mod/profile_photo.php:340
+msgid "Image uploaded successfully."
+msgstr "Bild erfolgreich hochgeladen."
+
+#: ../../mod/profile_photo.php:342
+msgid "Image upload failed."
+msgstr "Hochladen des Bilds fehlgeschlagen."
-#: ../../include/datetime.php:278
+#: ../../mod/profile_photo.php:351
#, php-format
-msgid "%1$d %2$s ago"
-msgstr "%1$d %2$s her"
+msgid "Image size reduction [%s] failed."
+msgstr "Reduzierung der Bildgröße [%s] fehlgeschlagen."
-#: ../../include/onepoll.php:399
-msgid "From: "
-msgstr "Von: "
+#: ../../mod/editpost.php:31
+msgid "Item is not editable"
+msgstr "Element kann nicht bearbeitet werden."
-#: ../../include/bbcode.php:210 ../../include/bbcode.php:230
-msgid "$1 wrote:"
-msgstr "$1 hat geschrieben:"
+#: ../../mod/editpost.php:53
+msgid "Delete item?"
+msgstr "Eintrag löschen?"
-#: ../../include/bbcode.php:245 ../../include/bbcode.php:314
-msgid "Image/photo"
-msgstr "Bild/Foto"
+#: ../../mod/notifications.php:26
+msgid "Invalid request identifier."
+msgstr "Ungültige Anfrage Identifikator."
-#: ../../include/dba.php:41
-#, php-format
-msgid "Cannot locate DNS info for database server '%s'"
-msgstr "Kann die DNS Informationen für den Datenbanken Server '%s' nicht ermitteln."
+#: ../../mod/notifications.php:35
+msgid "Discard"
+msgstr "Verwerfen"
-#: ../../include/message.php:15 ../../include/message.php:171
-msgid "[no subject]"
-msgstr "[kein Betreff]"
+#: ../../mod/notifications.php:93 ../../mod/notify.php:54
+msgid "No more system notifications."
+msgstr "Keine System-Benachrichtigungen mehr."
-#: ../../include/acl_selectors.php:286
-msgid "Visible to everybody"
-msgstr "Für jeden sichtbar"
+#: ../../mod/notifications.php:97 ../../mod/notify.php:58
+msgid "System Notifications"
+msgstr "System-Benachrichtigungen"
-#: ../../include/enotify.php:14
-msgid "Friendica Notification"
-msgstr "Friendica-Benachrichtigung"
+#: ../../mod/blocks.php:65
+msgid "Block Name"
+msgstr "Block Name"
-#: ../../include/enotify.php:17
-msgid "Thank You,"
-msgstr "Danke,"
+#: ../../mod/oexchange.php:23
+msgid "Unable to find your hub."
+msgstr "Konnte den Hub nicht finden."
-#: ../../include/enotify.php:19
-#, php-format
-msgid "%s Administrator"
-msgstr "der Administrator von %s"
+#: ../../mod/oexchange.php:37
+msgid "Post successful."
+msgstr "Veröffentlichung erfolgreich."
-#: ../../include/enotify.php:38
-#, php-format
-msgid "%s <!item_type!>"
-msgstr "%s <!item_type!>"
+#: ../../mod/editwebpage.php:106
+msgid "Edit Webpage"
+msgstr "Webseite bearbeiten"
-#: ../../include/enotify.php:42
-#, php-format
-msgid "[Friendica:Notify] New mail received at %s"
-msgstr "[Friendica Meldung] Neue Nachricht erhalten von %s"
+#: ../../mod/editwebpage.php:116
+msgid "Delete webpage?"
+msgstr "Webseite löschen?"
-#: ../../include/enotify.php:44
-#, php-format
-msgid "%1$s sent you a new private message at %2$s."
-msgstr "%1$s hat Dir eine neues private Nachricht geschickt auf %2$s."
+#: ../../mod/editwebpage.php:189
+msgid "Delete Webpage"
+msgstr "Webseite löschen"
-#: ../../include/enotify.php:45
-#, php-format
-msgid "%1$s sent you %2$s."
-msgstr "%1$s schickte Dir %2$s."
+#: ../../mod/profile.php:64 ../../mod/profile.php:72
+msgid "Access to this profile has been restricted."
+msgstr "Der Zugang zu diesem Profil ist begrenzt."
-#: ../../include/enotify.php:45
-msgid "a private message"
-msgstr "eine private Nachricht"
+#: ../../mod/poke.php:159
+msgid "Poke/Prod"
+msgstr "Anstupsen/Kuffen"
-#: ../../include/enotify.php:46
-#, php-format
-msgid "Please visit %s to view and/or reply to your private messages."
-msgstr "Bitte besuche %s, um deine privaten Nachrichten anzusehen und/oder zu beantworten."
+#: ../../mod/poke.php:160
+msgid "poke, prod or do other things to somebody"
+msgstr "Stupse Leute an oder mache anderes mit ihnen"
-#: ../../include/enotify.php:73
-#, php-format
-msgid "%1$s commented on [url=%2$s]a %3$s[/url]"
-msgstr "%1$s kommentierte [url=%2$s]a %3$s[/url]"
+#: ../../mod/poke.php:161
+msgid "Recipient"
+msgstr "Empfänger"
-#: ../../include/enotify.php:80
-#, php-format
-msgid "%1$s commented on [url=%2$s]%3$s's %4$s[/url]"
-msgstr "%1$s kommentierte [url=%2$s]%3$s's %4$s[/url]"
+#: ../../mod/poke.php:162
+msgid "Choose what you wish to do to recipient"
+msgstr "Wähle was du mit dem/r Empfänger/in tun willst"
-#: ../../include/enotify.php:88
-#, php-format
-msgid "%1$s commented on [url=%2$s]your %3$s[/url]"
-msgstr "%1$s kommentierte [url=%2$s]Deinen Beitrag %3$s[/url]"
+#: ../../mod/poke.php:165
+msgid "Make this post private"
+msgstr "Diesen Beitrag privat machen"
-#: ../../include/enotify.php:98
-#, php-format
-msgid "[Friendica:Notify] Comment to conversation #%1$d by %2$s"
-msgstr "[Friendica Meldung] Kommentar zum Beitrag #%1$d von %2$s"
+#: ../../mod/wall_upload.php:41 ../../mod/item.php:1068
+msgid "Wall Photos"
+msgstr "Wall Fotos"
-#: ../../include/enotify.php:99
-#, php-format
-msgid "%s commented on an item/conversation you have been following."
-msgstr "%s hat einen Beitrag kommentiert, dem du folgst."
+#: ../../mod/channel.php:25
+msgid "You must be logged in to see this page."
+msgstr "Du musst angemeldet sein um diese Seite betrachten zu können."
-#: ../../include/enotify.php:102 ../../include/enotify.php:117
-#: ../../include/enotify.php:130 ../../include/enotify.php:143
-#, php-format
-msgid "Please visit %s to view and/or reply to the conversation."
-msgstr "Bitte besuche %s, um die Konversation anzusehen und/oder zu kommentieren."
+#: ../../mod/channel.php:85
+msgid "Insufficient permissions. Request redirected to profile page."
+msgstr "Unzureichende Zugriffsrechte. Die Anfrage wurde zur Profil-Seite umgeleitet."
-#: ../../include/enotify.php:109
-#, php-format
-msgid "[Friendica:Notify] %s posted to your profile wall"
-msgstr "[Friendica Meldung] %s hat auf Deine Pinnwand geschrieben"
+#: ../../mod/community.php:23
+msgid "Not available."
+msgstr "Nicht verfügbar."
-#: ../../include/enotify.php:111
-#, php-format
-msgid "%1$s posted to your profile wall at %2$s"
-msgstr "%1$s schrieb auf Deine Pinnwand auf %2$s"
+#: ../../mod/community.php:32
+msgid "Community"
+msgstr "Gemeinschaft"
-#: ../../include/enotify.php:113
-#, php-format
-msgid "%1$s posted to [url=%2s]your wall[/url]"
-msgstr "%1$s schrieb auf [url=%2s]Deine Pinnwand[/url]"
+#: ../../mod/community.php:63 ../../mod/community.php:88
+msgid "No results."
+msgstr "Keine Ergebnisse."
-#: ../../include/enotify.php:124
-#, php-format
-msgid "[Friendica:Notify] %s tagged you"
-msgstr "[Friendica Meldung] %s hat Dich erwähnt"
+#: ../../mod/fsuggest.php:20 ../../mod/fsuggest.php:92
+msgid "Contact not found."
+msgstr "Kontakt nicht gefunden"
-#: ../../include/enotify.php:125
-#, php-format
-msgid "%1$s tagged you at %2$s"
-msgstr "%1$s erwähnte Dich auf %2$s"
+#: ../../mod/fsuggest.php:63
+msgid "Friend suggestion sent."
+msgstr "Freundschaftsempfehlung senden."
-#: ../../include/enotify.php:126
-#, php-format
-msgid "%1$s [url=%2s]tagged you[/url]."
-msgstr "%1$s [url=%2s]erwähnte Dich[/url]."
+#: ../../mod/fsuggest.php:97
+msgid "Suggest Friends"
+msgstr "Kontakte Vorschlagen"
-#: ../../include/enotify.php:137
+#: ../../mod/fsuggest.php:99
#, php-format
-msgid "[Friendica:Notify] %s tagged your post"
-msgstr "[Friendica Meldung] %s markierte Deinen Beitrag"
+msgid "Suggest a friend for %s"
+msgstr "Schlage %s einen Kontakt vor"
-#: ../../include/enotify.php:138
-#, php-format
-msgid "%1$s tagged your post at %2$s"
-msgstr "%1$s erwähnte Deinen Beitrag auf %2$s"
+#: ../../mod/editblock.php:82
+msgid "Edit Block"
+msgstr "Block bearbeiten"
-#: ../../include/enotify.php:139
-#, php-format
-msgid "%1$s tagged [url=%2$s]your post[/url]"
-msgstr "%1$s erwähnte [url=%2$s]Deinen Beitrag[/url]"
+#: ../../mod/editblock.php:157
+msgid "Delete Block"
+msgstr "Block löschen"
-#: ../../include/enotify.php:150
-msgid "[Friendica:Notify] Introduction received"
-msgstr "[Friendica Meldung] Kontaktanfrage erhalten"
+#: ../../mod/profperm.php:25 ../../mod/profperm.php:55
+msgid "Invalid profile identifier."
+msgstr "Ungültiger Profil Identifikator"
-#: ../../include/enotify.php:151
-#, php-format
-msgid "You've received an introduction from '%1$s' at %2$s"
-msgstr "Du hast eine Kontaktanfrage erhalten von '%1$s' auf %2$s"
+#: ../../mod/profperm.php:101
+msgid "Profile Visibility Editor"
+msgstr "Profil-Sichtbarkeits Editor"
-#: ../../include/enotify.php:152
-#, php-format
-msgid "You've received [url=%1$s]an introduction[/url] from %2$s."
-msgstr "Du hast eine [url=%1$s]Kontaktanfrage[/url] erhalten von %2$s."
+#: ../../mod/profperm.php:105
+msgid "Click on a contact to add or remove."
+msgstr "Wähle einen Kontakt zum Hinzufügen oder Löschen aus."
-#: ../../include/enotify.php:155 ../../include/enotify.php:173
-#, php-format
-msgid "You may visit their profile at %s"
-msgstr "Hier kannst du das Profil betrachten: %s"
+#: ../../mod/profperm.php:114
+msgid "Visible To"
+msgstr "Sichtbar für"
+
+#: ../../mod/profperm.php:130
+msgid "All Contacts (with secure profile access)"
+msgstr "Alle Kontakte (mit sicherem Zuging zum Profil)"
-#: ../../include/enotify.php:157
+#: ../../mod/siteinfo.php:57
#, php-format
-msgid "Please visit %s to approve or reject the introduction."
-msgstr "Bitte besuche %s, um die Kontaktanfrage anzunehmen oder abzulehnen."
+msgid "Version %s"
+msgstr "Version %s"
-#: ../../include/enotify.php:164
-msgid "[Friendica:Notify] Friend suggestion received"
-msgstr "[Friendica Meldung] Kontaktvorschlag erhalten"
+#: ../../mod/siteinfo.php:76
+msgid "Installed plugins/addons/apps:"
+msgstr "Installierte Plugins/Addons/Apps"
-#: ../../include/enotify.php:165
-#, php-format
-msgid "You've received a friend suggestion from '%1$s' at %2$s"
-msgstr "Du hast einen Freunde-Vorschlag erhalten von '%1$s' auf %2$s"
+#: ../../mod/siteinfo.php:89
+msgid "No installed plugins/addons/apps"
+msgstr "Keine installierten Plugins/Addons/Apps"
-#: ../../include/enotify.php:166
-#, php-format
+#: ../../mod/siteinfo.php:92
+msgid "Red"
+msgstr "Red"
+
+#: ../../mod/siteinfo.php:93
msgid ""
-"You've received [url=%1$s]a friend suggestion[/url] for %2$s from %3$s."
-msgstr "Du hast einen [url=%1$s]Freunde-Vorschlag[/url] erhalten %2$s von %3$s."
+"This is a hub of the Red Matrix - a global cooperative network of "
+"decentralised privacy enhanced websites."
+msgstr "Dieser Server ist Teil der Red-Matrix – einem global vernetzten Verbund aus dezentralen Websites mit Rücksicht auf die Privatsphäre."
-#: ../../include/enotify.php:171
-msgid "Name:"
-msgstr "Name:"
+#: ../../mod/siteinfo.php:96
+msgid "Running at web location"
+msgstr "Erreichbar unter der Web-Adresse"
-#: ../../include/enotify.php:172
-msgid "Photo:"
-msgstr "Foto:"
+#: ../../mod/siteinfo.php:97
+msgid ""
+"Please visit <a href=\"http://getzot.com\">GetZot.com</a> to learn more "
+"about the Red Matrix."
+msgstr "Besuche <a href=\"http://getzot.com\">GetZot.com</a> um mehr über die Red Matrix zu erfahren."
-#: ../../include/enotify.php:175
-#, php-format
-msgid "Please visit %s to approve or reject the suggestion."
-msgstr "Bitte besuche %s, um den Vorschlag zu akzeptieren oder abzulehnen."
+#: ../../mod/siteinfo.php:98
+msgid "Bug reports and issues: please visit"
+msgstr "Probleme oder Fehler gefunden? Bitte besuche"
-#: ../../include/follow.php:32
-msgid "Connect URL missing."
-msgstr "Connect-URL fehlt"
+#: ../../mod/siteinfo.php:101
+msgid ""
+"Suggestions, praise, donations, etc. - please email \"redmatrix\" at "
+"librelist - dot com"
+msgstr "Vorschläge, Lob, Spenden usw.: E-Mail an 'redmatrix' at librelist - dot - com"
-#: ../../include/follow.php:59
+#: ../../mod/suggest.php:35
msgid ""
-"This site is not configured to allow communications with other networks."
-msgstr "Diese Seite ist so konfiguriert, dass keine Kommunikation mit anderen Netzwerken erfolgen kann."
+"No suggestions available. If this is a new site, please try again in 24 "
+"hours."
+msgstr "Keine Vorschläge vorhanden. Wenn dies eine neue Seite ist versuche es bitte in 24 Stunden erneut."
-#: ../../include/follow.php:60 ../../include/follow.php:75
-msgid "No compatible communication protocols or feeds were discovered."
-msgstr "Es wurden keine kompatiblen Kommunikationsprotokolle oder Feeds gefunden."
+#: ../../mod/message.php:41
+msgid "Conversation removed."
+msgstr "Unterhaltung gelöscht."
-#: ../../include/follow.php:73
-msgid "The profile address specified does not provide adequate information."
-msgstr "Die angegebene Profiladresse liefert unzureichende Informationen."
+#: ../../mod/message.php:56
+msgid "No messages."
+msgstr "Keine Nachrichten."
-#: ../../include/follow.php:77
-msgid "An author or name was not found."
-msgstr "Es wurde kein Autor oder Name gefunden."
+#: ../../mod/message.php:74
+msgid "D, d M Y - g:i A"
+msgstr "D, d. M Y - g:i A"
-#: ../../include/follow.php:79
-msgid "No browser URL could be matched to this address."
-msgstr "Zu dieser Adresse konnte keine passende Browser URL gefunden werden."
+#: ../../mod/pubsites.php:22
+msgid "Public Sites"
+msgstr "Öffentliche Seiten"
-#: ../../include/follow.php:81
+#: ../../mod/pubsites.php:25
msgid ""
-"Unable to match @-style Identity Address with a known protocol or email "
-"contact."
-msgstr "Konnte die @-Adresse mit keinem der bekannten Protokolle oder Email-Kontakte abgleichen."
+"The listed sites allow public registration into the Red Matrix. All sites in"
+" the matrix are interlinked so membership on any of them conveys membership "
+"in the matrix as a whole. Some sites may require subscription or provide "
+"tiered service plans. The provider links <strong>may</strong> provide "
+"additional details."
+msgstr "Die hier aufgeführten Seiten erlauben dir einen Account in der Red Matrix anzulegen. Alle Seiten der Matrix sind mit einander verbunden, so dass die Mitgliedschaft auf einer Seite die Mitgliedschaft auf einer beliebigen anderen Seite der Matrix beinhaltet. Es könnte sein, dass einige dieser Seiten Abonnements benötigen oder abgestufte Service-Pläne anbieten. Auf den jeweiligen Seiten <strong>könnten</strong> nähere Details diesbezüglich stehen."
-#: ../../include/follow.php:82
-msgid "Use mailto: in front of address to force email check."
-msgstr "Verwende mailto: vor der Email Adresse um eine Überprüfung der Email Adresse zu erzwingen."
+#: ../../mod/pubsites.php:31
+msgid "Site URL"
+msgstr "URL der Seite"
-#: ../../include/follow.php:88
-msgid ""
-"The profile address specified belongs to a network which has been disabled "
-"on this site."
-msgstr "Die Adresse dieses Profils gehört zu einem Netzwerk, mit dem die Kommunikation auf dieser Seite ausgeschaltet wurde."
+#: ../../mod/pubsites.php:31
+msgid "Access Type"
+msgstr "Zugangs Typ"
-#: ../../include/follow.php:93
-msgid ""
-"Limited profile. This person will be unable to receive direct/personal "
-"notifications from you."
-msgstr "Eingeschränktes Profil. Diese Person wird keine direkten/privaten Nachrichten von dir erhalten können."
+#: ../../mod/pubsites.php:31
+msgid "Registration Policy"
+msgstr "Registrierungsrichtlinien"
-#: ../../include/follow.php:169
-msgid "Unable to retrieve contact information."
-msgstr "Konnte die Kontaktinformationen nicht empfangen."
+#: ../../mod/register.php:43
+msgid "Maximum daily site registrations exceeded. Please try again tomorrow."
+msgstr "Maximale Anzahl von Neuanmeldungen erreicht. Bitte versuche es morgen noch einmal."
-#: ../../include/follow.php:223
-msgid "following"
-msgstr "folgen"
+#: ../../mod/register.php:49
+msgid ""
+"Please indicate acceptance of the Terms of Service. Registration failed."
+msgstr "Bitte stimme den Nutzungsbedingungen zu. Anmeldung fehlgeschlagen."
-#: ../../include/items.php:2790
-msgid "A new person is sharing with you at "
-msgstr "Eine neue Person teilt mit dir auf "
+#: ../../mod/register.php:77
+msgid "Passwords do not match."
+msgstr "Passwörter stimmen nicht überein."
-#: ../../include/items.php:2790
-msgid "You have a new follower at "
-msgstr "Du hast einen neuen Kontakt auf "
+#: ../../mod/register.php:105
+msgid ""
+"Registration successful. Please check your email for validation "
+"instructions."
+msgstr "Registrierung erfolgreich. Eine E-Mail mit weiteren Anweisungen wurde an dich gesendet."
-#: ../../include/items.php:3452
-msgid "Archives"
-msgstr "Archiv"
+#: ../../mod/register.php:111
+msgid "Your registration is pending approval by the site owner."
+msgstr "Deine Registrierung muss noch vom Betreiber der Seite freigegeben werden."
-#: ../../include/bb2diaspora.php:102 ../../include/bb2diaspora.php:112
-#: ../../include/bb2diaspora.php:113
-msgid "image/photo"
-msgstr "Bild/Foto"
+#: ../../mod/register.php:114
+msgid "Your registration can not be processed."
+msgstr "Deine Registrierung konnte nicht verarbeitet werden."
-#: ../../include/bb2diaspora.php:102
-msgid "link"
-msgstr "Verweis"
+#: ../../mod/register.php:147
+msgid "Registration on this site/hub is by approval only."
+msgstr "Anmeldungen auf dieser Seite / diesem Hub benötigen Zustimmung durch den Administrator"
-#: ../../include/user.php:38
-msgid "An invitation is required."
-msgstr "Du benötigst eine Einladung."
+#: ../../mod/register.php:148
+msgid "<a href=\"pubsites\">Register at another affiliated site/hub</a>"
+msgstr "<a href=\"pubsites\">Registrierung auf einer angeschlossenen Seite</a>"
-#: ../../include/user.php:43
-msgid "Invitation could not be verified."
-msgstr "Die Einladung konnte nicht überprüft werden."
+#: ../../mod/register.php:156
+msgid ""
+"This site has exceeded the number of allowed daily account registrations. "
+"Please try again tomorrow."
+msgstr "Die maximale Anzahl täglicher Registrierungen auf dieser Seite wurde überschritten. Bitte versuche es morgen noch einmal."
-#: ../../include/user.php:51
-msgid "Invalid OpenID url"
-msgstr "Ungültige OpenID URL"
+#: ../../mod/register.php:167
+msgid "Terms of Service"
+msgstr "Nutzungsbedingungen"
-#: ../../include/user.php:66
-msgid "Please enter the required information."
-msgstr "Bitte trage die erforderlichen Informationen ein."
+#: ../../mod/register.php:173
+#, php-format
+msgid "I accept the %s for this website"
+msgstr "Ich akzeptiere die %s für diese Webseite"
-#: ../../include/user.php:80
-msgid "Please use a shorter name."
-msgstr "Bitte verwende einen kürzeren Namen."
+#: ../../mod/register.php:175
+#, php-format
+msgid "I am over 13 years of age and accept the %s for this website"
+msgstr "Ich bin älter als 13 Jahre und akzeptiere die %s dieser Webseite"
-#: ../../include/user.php:82
-msgid "Name too short."
-msgstr "Der Name ist zu kurz."
+#: ../../mod/register.php:194
+msgid "Membership on this site is by invitation only."
+msgstr "Mitgliedschaft auf dieser Seite ist nur nach vorheriger Einladung möglich."
-#: ../../include/user.php:97
-msgid "That doesn't appear to be your full (First Last) name."
-msgstr "Das scheint nicht dein kompletter Name (Vor- und Nachname) zu sein."
+#: ../../mod/register.php:195
+msgid "Please enter your invitation code"
+msgstr "Bitte trage deinen Einladungs-Code ein"
-#: ../../include/user.php:102
-msgid "Your email domain is not among those allowed on this site."
-msgstr "Die Domain deiner E-Mail Adresse ist auf dieser Seite nicht erlaubt."
+#: ../../mod/register.php:198
+msgid "Your email address"
+msgstr "Ihre E-Mail Adresse"
-#: ../../include/user.php:105
-msgid "Not a valid email address."
-msgstr "Keine gültige E-Mail-Adresse."
+#: ../../mod/register.php:199
+msgid "Choose a password"
+msgstr "Passwort"
-#: ../../include/user.php:115
-msgid "Cannot use that email."
-msgstr "Konnte diese E-Mail-Adresse nicht verwenden."
+#: ../../mod/register.php:200
+msgid "Please re-enter your password"
+msgstr "Bitte gib dein Passwort noch einmal ein"
-#: ../../include/user.php:121
-msgid ""
-"Your \"nickname\" can only contain \"a-z\", \"0-9\", \"-\", and \"_\", and "
-"must also begin with a letter."
-msgstr "Dein Spitzname darf nur aus Buchstaben und Zahlen (\"a-z\",\"0-9\", \"_\" und \"-\") bestehen, außerdem muss er mit einem Buchstaben beginnen."
+#: ../../mod/regmod.php:12
+msgid "Please login."
+msgstr "Bitte melde dich an."
-#: ../../include/user.php:127 ../../include/user.php:219
-msgid "Nickname is already registered. Please choose another."
-msgstr "Dieser Spitzname ist bereits vergeben. Bitte wähle einen anderen."
+#: ../../mod/removeme.php:49
+msgid "Remove This Channel"
+msgstr "Diesen Kanal löschen!"
-#: ../../include/user.php:137
+#: ../../mod/removeme.php:50
msgid ""
-"Nickname was once registered here and may not be re-used. Please choose "
-"another."
-msgstr "Dieser Spitzname ist bereits vergeben. Bitte wähle einen anderen."
+"This will completely remove this channel from the network. Once this has "
+"been done it is not recoverable."
+msgstr "Hiermit wird dieser Kanal komplett aus dem Netzwerk gelöscht. Einmal eingeleitet ist dieser Prozess nicht widerrufbar."
-#: ../../include/user.php:153
-msgid "SERIOUS ERROR: Generation of security keys failed."
-msgstr "FATALER FEHLER: Sicherheitsschlüssel konnten nicht erzeugt werden."
+#: ../../mod/removeme.php:51
+msgid "Please enter your password for verification:"
+msgstr "Bitte gib zur Bestätigung dein Passwort ein:"
-#: ../../include/user.php:205
-msgid "An error occurred during registration. Please try again."
-msgstr "Wärend der Anmeldung ist ein Fehler aufgetreten. Bitte versuche es noch einmal."
+#: ../../mod/removeme.php:52
+msgid "Remove this channel and all its clones from the network"
+msgstr "Lösche diesen Kanal und all seine Klone aus dem Netzwerk"
-#: ../../include/user.php:240
-msgid "An error occurred creating your default profile. Please try again."
-msgstr "Bei der Erstellung des Standardprofils ist ein Fehler aufgetreten. Bitte versuche es noch einmal."
+#: ../../mod/removeme.php:52
+msgid ""
+"By default only the instance of the channel located on this hub will be "
+"removed from the network"
+msgstr "Standartmäßig wird der Kanal nur auf diesem Knoten gelöscht, seine Klone verbleiben im Netzwerk"
-#: ../../include/security.php:21
-msgid "Welcome "
-msgstr "Willkommen "
+#: ../../mod/removeme.php:53
+msgid "Remove My Account"
+msgstr "Mein Konto entfernen"
-#: ../../include/security.php:22
-msgid "Please upload a profile photo."
-msgstr "Bitte lade ein Profilbild hoch."
+#: ../../mod/item.php:145
+msgid "Unable to locate original post."
+msgstr "Originalbeitrag kann nicht gefunden werden."
-#: ../../include/security.php:25
-msgid "Welcome back "
-msgstr "Willkommen zurück "
+#: ../../mod/item.php:343
+msgid "Empty post discarded."
+msgstr "Leerer Beitrag verworfen."
-#: ../../include/security.php:329
-msgid ""
-"The form security token was not correct. This probably happened because the "
-"form has been opened for too long (>3 hours) before submitting it."
-msgstr "Das Sicherheitsmerkmal war nicht korrekt. Das passiert meistens wenn das Formular vor dem Absenden zu lange geöffnet war (länger als 3 Stunden)."
+#: ../../mod/item.php:385
+msgid "Executable content type not permitted to this channel."
+msgstr "Ausführbarer Content-Typ ist für diesen Kanal nicht freigegeben."
-#: ../../include/Contact.php:111
-msgid "stopped following"
-msgstr "wird nicht mehr gefolgt"
+#: ../../mod/item.php:812
+msgid "System error. Post not saved."
+msgstr "Systemfehler. Beitrag nicht gespeichert."
-#: ../../include/Contact.php:218 ../../include/conversation.php:842
-msgid "View Status"
-msgstr "Pinnwand anschauen"
+#: ../../mod/item.php:1148
+#, php-format
+msgid "You have reached your limit of %1$.0f top level posts."
+msgstr "Du hast die maximale Anzahl von %1$.0f Beiträgen erreicht."
-#: ../../include/Contact.php:219 ../../include/conversation.php:843
-msgid "View Profile"
-msgstr "Profil anschauen"
+#: ../../mod/item.php:1154
+#, php-format
+msgid "You have reached your limit of %1$.0f webpages."
+msgstr "Du hast die maximale Anzahl von %1$.0f Webseiten erreicht."
-#: ../../include/Contact.php:220 ../../include/conversation.php:844
-msgid "View Photos"
-msgstr "Bilder anschauen"
+#: ../../mod/mood.php:138
+msgid "Mood"
+msgstr "Laune"
-#: ../../include/Contact.php:221 ../../include/Contact.php:234
-#: ../../include/conversation.php:845
-msgid "Network Posts"
-msgstr "Netzwerkbeiträge"
+#: ../../mod/mood.php:139
+msgid "Set your current mood and tell your friends"
+msgstr "Wähle deine aktuelle Stimmung und erzähle sie deinen Freunden"
-#: ../../include/Contact.php:222 ../../include/Contact.php:234
-#: ../../include/conversation.php:846
-msgid "Edit Contact"
-msgstr "Kontakt bearbeiten"
+#: ../../mod/ping.php:160
+msgid "sent you a private message"
+msgstr "eine private Nachricht schicken"
-#: ../../include/Contact.php:223 ../../include/Contact.php:234
-#: ../../include/conversation.php:847
-msgid "Send PM"
-msgstr "Private Nachricht senden"
+#: ../../mod/ping.php:218
+msgid "added your channel"
+msgstr "hat deinen Kanal hinzugefügt"
-#: ../../include/conversation.php:163
-msgid "post/item"
-msgstr "Nachricht/Beitrag"
+#: ../../mod/ping.php:262
+msgid "posted an event"
+msgstr "hat eine Veranstaltung veröffentlicht"
-#: ../../include/conversation.php:164
-#, php-format
-msgid "%1$s marked %2$s's %3$s as favorite"
-msgstr "%1$s hat %2$s\\s %3$s als Favorit markiert"
+#: ../../mod/dirprofile.php:111
+msgid "Status: "
+msgstr "Status:"
-#: ../../include/conversation.php:327 ../../include/conversation.php:608
-msgid "Select"
-msgstr "Auswählen"
+#: ../../mod/dirprofile.php:112
+msgid "Sexual Preference: "
+msgstr "Sexuelle Vorlieben:"
-#: ../../include/conversation.php:344 ../../include/conversation.php:701
-#: ../../include/conversation.php:702
-#, php-format
-msgid "View %s's profile @ %s"
-msgstr "Das Profil von %s auf %s betrachten."
+#: ../../mod/dirprofile.php:114
+msgid "Homepage: "
+msgstr "Webseite:"
-#: ../../include/conversation.php:354 ../../include/conversation.php:713
-#, php-format
-msgid "%s from %s"
-msgstr "%s von %s"
+#: ../../mod/dirprofile.php:115
+msgid "Hometown: "
+msgstr "Wohnort:"
-#: ../../include/conversation.php:369
-msgid "View in context"
-msgstr "Im Zusammenhang betrachten"
+#: ../../mod/dirprofile.php:117
+msgid "About: "
+msgstr "Ãœber:"
-#: ../../include/conversation.php:475
-#, php-format
-msgid "%d comment"
-msgid_plural "%d comments"
-msgstr[0] "%d Kommentar"
-msgstr[1] "%d Kommentare"
+#: ../../mod/dirprofile.php:163
+msgid "Keywords: "
+msgstr "Schlüsselbegriffe:"
-#: ../../include/conversation.php:554
-msgid "like"
-msgstr "mag ich"
+#: ../../view/theme/redbasic/php/config.php:74
+msgid "Scheme Default"
+msgstr "Standard-Schema"
-#: ../../include/conversation.php:555
-msgid "dislike"
-msgstr "mag ich nicht"
+#: ../../view/theme/redbasic/php/config.php:75
+msgid "red"
+msgstr "Rot"
-#: ../../include/conversation.php:557
-msgid "Share this"
-msgstr "Weitersagen"
+#: ../../view/theme/redbasic/php/config.php:76
+msgid "black"
+msgstr "Schwarz"
-#: ../../include/conversation.php:557
-msgid "share"
-msgstr "Teilen"
+#: ../../view/theme/redbasic/php/config.php:77
+msgid "silver"
+msgstr "Silber"
-#: ../../include/conversation.php:581
-msgid "Bold"
-msgstr "Fett"
+#: ../../view/theme/redbasic/php/config.php:88
+#: ../../view/theme/apw/php/config.php:234
+#: ../../view/theme/blogga/view/theme/blog/config.php:69
+#: ../../view/theme/blogga/php/config.php:69
+msgid "Theme settings"
+msgstr "Theme-Einstellungen"
-#: ../../include/conversation.php:582
-msgid "Italic"
-msgstr "Kursiv"
+#: ../../view/theme/redbasic/php/config.php:89
+#: ../../view/theme/apw/php/config.php:235
+msgid "Set scheme"
+msgstr "Schema"
-#: ../../include/conversation.php:583
-msgid "Underline"
-msgstr "Unterstrichen"
+#: ../../view/theme/redbasic/php/config.php:90
+msgid "Navigation bar colour"
+msgstr "Farbe der Navigationsleiste"
-#: ../../include/conversation.php:584
-msgid "Quote"
-msgstr "Zitat"
+#: ../../view/theme/redbasic/php/config.php:91
+msgid "Set font-colour for banner"
+msgstr "Farbe des Banners"
-#: ../../include/conversation.php:585
-msgid "Code"
-msgstr "Code"
+#: ../../view/theme/redbasic/php/config.php:92
+msgid "Set the background colour"
+msgstr "Hintergrundfarbe"
-#: ../../include/conversation.php:586
-msgid "Image"
-msgstr "Bild"
+#: ../../view/theme/redbasic/php/config.php:93
+msgid "Set the background image"
+msgstr "Hintergrundbild"
-#: ../../include/conversation.php:587
-msgid "Link"
-msgstr "Verweis"
+#: ../../view/theme/redbasic/php/config.php:94
+msgid "Set the background colour of items"
+msgstr "Hintergrundfarbe von Beiträgen"
-#: ../../include/conversation.php:588
-msgid "Video"
-msgstr "Video"
+#: ../../view/theme/redbasic/php/config.php:95
+msgid "Set the opacity of items"
+msgstr "Deckkraft von Beiträgen"
-#: ../../include/conversation.php:621
-msgid "add star"
-msgstr "markieren"
+#: ../../view/theme/redbasic/php/config.php:96
+msgid "Set the basic colour for item icons"
+msgstr "Basisfarbe der Beitrags-Icons"
-#: ../../include/conversation.php:622
-msgid "remove star"
-msgstr "Markierung entfernen"
+#: ../../view/theme/redbasic/php/config.php:97
+msgid "Set the hover colour for item icons"
+msgstr "Farbe für Beitrags-Icons unter dem Mauszeiger"
-#: ../../include/conversation.php:623
-msgid "toggle star status"
-msgstr "Markierung umschalten"
+#: ../../view/theme/redbasic/php/config.php:98
+msgid "Set font-size for the entire application"
+msgstr "Schriftgröße für die ganze Applikation"
-#: ../../include/conversation.php:626
-msgid "starred"
-msgstr "markiert"
+#: ../../view/theme/redbasic/php/config.php:99
+#: ../../view/theme/apw/php/config.php:236
+msgid "Set font-size for posts and comments"
+msgstr "Wähle die Schriftgröße für Beiträge und Kommentare"
-#: ../../include/conversation.php:627
-msgid "add tag"
-msgstr "Tag hinzufügen"
+#: ../../view/theme/redbasic/php/config.php:100
+msgid "Set font-colour for posts and comments"
+msgstr "Schriftfarbe für Beiträge und Kommentare"
-#: ../../include/conversation.php:631
-msgid "save to folder"
-msgstr "In Ordner speichern"
+#: ../../view/theme/redbasic/php/config.php:101
+msgid "Set radius of corners"
+msgstr "Ecken-Radius"
-#: ../../include/conversation.php:703
-msgid "to"
-msgstr "zu"
+#: ../../view/theme/redbasic/php/config.php:102
+msgid "Set shadow depth of photos"
+msgstr "Schattentiefe von Fotos"
-#: ../../include/conversation.php:704
-msgid "Wall-to-Wall"
-msgstr "Wall-to-Wall"
+#: ../../view/theme/redbasic/php/config.php:103
+msgid "Set maximum width of conversation regions"
+msgstr "Maximalbreite der Konversationsbereiche"
-#: ../../include/conversation.php:705
-msgid "via Wall-To-Wall:"
-msgstr "via Wall-To-Wall:"
+#: ../../view/theme/redbasic/php/config.php:104
+msgid "Set minimum opacity of nav bar - to hide it"
+msgstr "Mindest-Deckkraft der Navigationsleiste ( - versteckt sie)"
-#: ../../include/conversation.php:750
-msgid "Delete Selected Items"
-msgstr "Lösche die markierten Beiträge"
+#: ../../view/theme/redbasic/php/config.php:105
+msgid "Set size of conversation author photo"
+msgstr "Größe der Avatare von Themenstartern"
-#: ../../include/conversation.php:901
-#, php-format
-msgid "%s likes this."
-msgstr "%s mag das."
+#: ../../view/theme/redbasic/php/config.php:106
+msgid "Set size of followup author photos"
+msgstr "Größe der Avatare von Kommentatoren"
-#: ../../include/conversation.php:901
-#, php-format
-msgid "%s doesn't like this."
-msgstr "%s mag das nicht."
+#: ../../view/theme/redbasic/php/config.php:107
+msgid "Sloppy photo albums"
+msgstr "Schräge Fotoalben"
-#: ../../include/conversation.php:905
-#, php-format
-msgid "<span %1$s>%2$d people</span> like this."
-msgstr "<span %1$s>%2$d Leute</span> mögen das."
+#: ../../view/theme/redbasic/php/config.php:107
+msgid "Are you a clean desk or a messy desk person?"
+msgstr "Bist du jemand der einen aufgeräumten Schreibtisch hat, oder eher einen chaotischen?"
-#: ../../include/conversation.php:907
-#, php-format
-msgid "<span %1$s>%2$d people</span> don't like this."
-msgstr "<span %1$s>%2$d Leute</span> mögen das nicht."
+#: ../../view/theme/apw/php/config.php:193
+#: ../../view/theme/apw/php/config.php:211
+msgid "Schema Default"
+msgstr "Standard-Schema"
-#: ../../include/conversation.php:913
-msgid "and"
-msgstr "und"
+#: ../../view/theme/apw/php/config.php:194
+msgid "Sans-Serif"
+msgstr "Sans-Serif"
-#: ../../include/conversation.php:916
-#, php-format
-msgid ", and %d other people"
-msgstr " und %d andere"
+#: ../../view/theme/apw/php/config.php:195
+msgid "Monospace"
+msgstr "Monospace"
-#: ../../include/conversation.php:917
-#, php-format
-msgid "%s like this."
-msgstr "%s mögen das."
+#: ../../view/theme/apw/php/config.php:237
+msgid "Set font face"
+msgstr "Schriftart"
-#: ../../include/conversation.php:917
-#, php-format
-msgid "%s don't like this."
-msgstr "%s mögen das nicht."
+#: ../../view/theme/apw/php/config.php:238
+msgid "Set iconset"
+msgstr "Iconset"
-#: ../../include/conversation.php:942
-msgid "Visible to <strong>everybody</strong>"
-msgstr "Für <strong>jedermann</strong> sichtbar"
+#: ../../view/theme/apw/php/config.php:239
+msgid "Set big shadow size, default 15px 15px 15px"
+msgstr "Ausmaß der großen Schatten (Default 15px 15px 15px)"
-#: ../../include/conversation.php:944
-msgid "Please enter a video link/URL:"
-msgstr "Bitte Link/URL zum Video einfügen:"
+#: ../../view/theme/apw/php/config.php:240
+msgid "Set small shadow size, default 5px 5px 5px"
+msgstr "Ausmaß der kleinen Schatten (Default 5px 5px 5px)"
-#: ../../include/conversation.php:945
-msgid "Please enter an audio link/URL:"
-msgstr "Bitte Link/URL zum Audio einfügen:"
+#: ../../view/theme/apw/php/config.php:241
+msgid "Set shadow colour, default #000"
+msgstr "Farbe der Schatten (Default #000)"
-#: ../../include/conversation.php:946
-msgid "Tag term:"
-msgstr "Tag:"
+#: ../../view/theme/apw/php/config.php:242
+msgid "Set radius size, default 5px"
+msgstr "Ecken-Radius (Default 5px)"
-#: ../../include/conversation.php:948
-msgid "Where are you right now?"
-msgstr "Wo hältst du dich jetzt gerade auf?"
+#: ../../view/theme/apw/php/config.php:243
+msgid "Set line-height for posts and comments"
+msgstr "Wähle die Zeilenhöhe in Beiträgen und Kommentaren"
-#: ../../include/conversation.php:991
-msgid "upload photo"
-msgstr "Bild hochladen"
+#: ../../view/theme/apw/php/config.php:244
+msgid "Set background image"
+msgstr "Hintergrundbild"
-#: ../../include/conversation.php:993
-msgid "attach file"
-msgstr "Datei anhängen"
+#: ../../view/theme/apw/php/config.php:245
+msgid "Set background colour"
+msgstr "Hintergrundfarbe"
-#: ../../include/conversation.php:995
-msgid "web link"
-msgstr "Weblink"
+#: ../../view/theme/apw/php/config.php:246
+msgid "Set section background image"
+msgstr "Hintergrundbild des mittleren Bereichs"
-#: ../../include/conversation.php:996
-msgid "Insert video link"
-msgstr "Video-Adresse einfügen"
+#: ../../view/theme/apw/php/config.php:247
+msgid "Set section background colour"
+msgstr "Hintergrundfarbe des mittleren Bereichs"
-#: ../../include/conversation.php:997
-msgid "video link"
-msgstr "Video-Link"
+#: ../../view/theme/apw/php/config.php:248
+msgid "Set colour of items - use hex"
+msgstr "Farbe von Beiträgen (HEX)"
-#: ../../include/conversation.php:998
-msgid "Insert audio link"
-msgstr "Audio-Adresse einfügen"
+#: ../../view/theme/apw/php/config.php:249
+msgid "Set colour of links - use hex"
+msgstr "Farbe von Links (HEX)"
-#: ../../include/conversation.php:999
-msgid "audio link"
-msgstr "Audio-Link"
+#: ../../view/theme/apw/php/config.php:250
+msgid "Set max-width for items. Default 400px"
+msgstr "Maximalbreite von Beiträgen (Default 400px)"
-#: ../../include/conversation.php:1001
-msgid "set location"
-msgstr "Ort setzen"
+#: ../../view/theme/apw/php/config.php:251
+msgid "Set min-width for items. Default 240px"
+msgstr "Minimalbreite von Beiträgen (Default 240px)"
-#: ../../include/conversation.php:1003
-msgid "clear location"
-msgstr "Ort löschen"
+#: ../../view/theme/apw/php/config.php:252
+msgid "Set the generic content wrapper width. Default 48%"
+msgstr "Breite des „generic content wrapper“ (Default 48%)"
-#: ../../include/conversation.php:1010
-msgid "permissions"
-msgstr "Zugriffsrechte"
+#: ../../view/theme/apw/php/config.php:253
+msgid "Set colour of fonts - use hex"
+msgstr "Schriftfarbe (HEX)"
-#: ../../boot.php:522
-msgid "Delete this item?"
-msgstr "Diesen Beitrag löschen?"
+#: ../../view/theme/apw/php/config.php:254
+msgid "Set background-size element"
+msgstr "Größe des Hintergrund-Elements"
-#: ../../boot.php:525
-msgid "show fewer"
-msgstr "weniger anzeigen"
+#: ../../view/theme/apw/php/config.php:255
+msgid "Item opacity"
+msgstr "Opazität von Beiträgen"
-#: ../../boot.php:698
-#, php-format
-msgid "Update %s failed. See error logs."
-msgstr "Update %s fehlgeschlagen. Bitte Fehlerprotokoll überprüfen."
+#: ../../view/theme/apw/php/config.php:256
+msgid "Display post previews only"
+msgstr "Nur Beitragsvorschau anzeigen"
-#: ../../boot.php:700
-#, php-format
-msgid "Update Error at %s"
-msgstr "Updatefehler bei %s"
+#: ../../view/theme/apw/php/config.php:257
+msgid "Display side bar on channel page"
+msgstr "Zeige die Seitenleiste auf der Kanal-Seite"
-#: ../../boot.php:800
-msgid "Create a New Account"
-msgstr "Neues Konto erstellen"
+#: ../../view/theme/apw/php/config.php:258
+msgid "Colour of the navigation bar"
+msgstr "Farbe der Navigationsleiste"
-#: ../../boot.php:824
-msgid "Nickname or Email address: "
-msgstr "Spitzname oder Email-Adresse: "
+#: ../../view/theme/apw/php/config.php:259
+msgid "Item float"
+msgstr "Beitragsfluss"
-#: ../../boot.php:825
-msgid "Password: "
-msgstr "Passwort: "
+#: ../../view/theme/apw/php/config.php:260
+msgid "Left offset of the section element"
+msgstr "Linker Rand des mittleren Bereichs"
-#: ../../boot.php:828
-msgid "Or login using OpenID: "
-msgstr "Oder melde dich mit deiner OpenID an: "
+#: ../../view/theme/apw/php/config.php:261
+msgid "Right offset of the section element"
+msgstr "Rechter Rand des mittleren Bereichs"
-#: ../../boot.php:834
-msgid "Forgot your password?"
-msgstr "Passwort vergessen?"
+#: ../../view/theme/apw/php/config.php:262
+msgid "Section width"
+msgstr "Breite des mittleren Bereichs"
-#: ../../boot.php:1001
-msgid "Edit profile"
-msgstr "Profil bearbeiten"
+#: ../../view/theme/apw/php/config.php:263
+msgid "Left offset of the aside"
+msgstr "Linker Rand des seitlichen Bereichs"
-#: ../../boot.php:1061
-msgid "Message"
-msgstr "Nachricht"
+#: ../../view/theme/apw/php/config.php:264
+msgid "Right offset of the aside element"
+msgstr "Rechter Rand des seitlichen Bereichs"
-#: ../../boot.php:1177 ../../boot.php:1253
-msgid "g A l F d"
-msgstr "l, d. F G \\U\\h\\r"
+#: ../../view/theme/blogga/view/theme/blog/config.php:47
+#: ../../view/theme/blogga/php/config.php:47
+msgid "None"
+msgstr "Keine"
-#: ../../boot.php:1178 ../../boot.php:1254
-msgid "F d"
-msgstr "d. F"
+#: ../../view/theme/blogga/view/theme/blog/config.php:70
+#: ../../view/theme/blogga/php/config.php:70
+msgid "Header image"
+msgstr "Titelbild"
-#: ../../boot.php:1223 ../../boot.php:1294
-msgid "[today]"
-msgstr "[heute]"
+#: ../../view/theme/blogga/view/theme/blog/config.php:71
+#: ../../view/theme/blogga/php/config.php:71
+msgid "Header image only on profile pages"
+msgstr "Titelbild nur auf Profil-Seiten anzeigen"
-#: ../../boot.php:1235
-msgid "Birthday Reminders"
-msgstr "Geburtstagserinnerungen"
+#: ../../boot.php:1224
+#, php-format
+msgid "Update %s failed. See error logs."
+msgstr "Aktualisierung %s fehlgeschlagen. Details in den Fehlerprotokollen."
-#: ../../boot.php:1236
-msgid "Birthdays this week:"
-msgstr "Geburtstage diese Woche:"
+#: ../../boot.php:1227
+#, php-format
+msgid "Update Error at %s"
+msgstr "Aktualisierungsfehler auf %s"
-#: ../../boot.php:1287
-msgid "[No description]"
-msgstr "[keine Beschreibung]"
+#: ../../boot.php:1391
+msgid ""
+"Create an account to access services and applications within the Red Matrix"
+msgstr "Erstelle einen Account um Anwendungen und Dienste innerhalb der Red Matrix verwenden zu können."
-#: ../../boot.php:1305
-msgid "Event Reminders"
-msgstr "Veranstaltungserinnerungen"
+#: ../../boot.php:1419
+msgid "Password"
+msgstr "Kennwort"
-#: ../../boot.php:1306
-msgid "Events this week:"
-msgstr "Veranstaltungen diese Woche"
+#: ../../boot.php:1420
+msgid "Remember me"
+msgstr "Angaben speichern"
-#: ../../boot.php:1511
-msgid "Status Messages and Posts"
-msgstr "Statusnachrichten und Beiträge"
+#: ../../boot.php:1425
+msgid "Forgot your password?"
+msgstr "Passwort vergessen?"
-#: ../../boot.php:1517
-msgid "Profile Details"
-msgstr "Profildetails"
+#: ../../boot.php:1490
+msgid "permission denied"
+msgstr "Zugriff verweigert"
-#: ../../boot.php:1532
-msgid "Events and Calendar"
-msgstr "Ereignisse und Kalender"
+#: ../../boot.php:1491
+msgid "Got Zot?"
+msgstr "Haste schon Zot?"
-#: ../../boot.php:1538
-msgid "Only You Can See This"
-msgstr "Nur Du Kannst Das Sehen"
+#: ../../boot.php:1887
+msgid "toggle mobile"
+msgstr "auf/von Mobile Ansicht wechseln"
diff --git a/view/de/passchanged_eml.tpl b/view/de/passchanged_eml.tpl
index dcabbbe49..0d94be3c2 100644
--- a/view/de/passchanged_eml.tpl
+++ b/view/de/passchanged_eml.tpl
@@ -1,20 +1,20 @@
-Hallo $[username],
- Dein Passwort wurde wie gewünscht geändert. Bitte bewahre diese
-Informationen in deinen Unterlagen auf (oder ändere dein Passwort sofort
-in etwas, was du dir merken kannst).
+Dear {{$username}},
+ Your password has been changed as requested. Please retain this
+information for your records (or change your password immediately to
+something that you will remember).
-Deine Login Daten wurden wie folgt geändert:
+Your login details are as follows:
-Adresse der Seite: $[siteurl]
-Login Name: $[email]
-Passwort: $[new_password]
+Site Location: {{$siteurl}}
+Login Name: {{$email}}
+Password: {{$new_password}}
-Du kannst dein Passwort unter deinen Account-Einstellungen ändern, wenn du angemeldet bist.
+You may change that password from your account settings page after logging in.
-Beste Grüße,
- $[sitename] Administrator
+Sincerely,
+ {{$sitename}} Administrator
- \ No newline at end of file
+
diff --git a/view/de/register_open_eml.tpl b/view/de/register_open_eml.tpl
index 4392e8da2..4b397201c 100644
--- a/view/de/register_open_eml.tpl
+++ b/view/de/register_open_eml.tpl
@@ -1,34 +1,19 @@
-Hallo $[username],
- Danke für deine Anmeldung auf $[sitename]. Dein Account wurde angelegt.
-Hier die Login Details:
+An account has been created at {{$sitename}} for this email address.
+The login details are as follows:
+Site Location: {{$siteurl}}
+Login: {{$email}}
+Password: (the password which was provided during registration)
-Adresse der Seite: $[siteurl]
-Login Name: $[email]
-Passwort: $[password]
+If this account was created without your knowledge and is not desired, you may
+visit this site and reset the password. This will allow you to remove the
+account from the links on the Settings page, and we
+apologise for any inconvenience.
-Du kannst und solltest das Passwort in den "Einstellungen" zu deinem Account ändern,
-nachdem du dich erstmalig eingeloggt hast.
+Thank you and welcome to {{$sitename}}.
-Bitte nimm dir einige Augenblicke Zeit, um die anderen Einstellungen auf der Seite kennenzulernen und zu überprüfen.
+Sincerely,
+ {{$sitename}} Administrator
-Eventuell möchtest du außerdem einige grundlegende Informationen in deinem Standardprofil (auf der "Profile" Seite) eintragen,
-damit andere Leute dich einfacher finden können.
-
-Wir empfehlen den kompletten Namen anzugeben, ein eigenes Profilbild hochzuladen,
-sowie ein paar "Profil-Schlüsselwörter" einzutragen (um leichter Menschen mit gleichen Interessen zu finden) - und
-vielleicht auch in welchen Land du lebst; falls du nicht konkreter
-werden möchtest.
-
-Wir respektieren dein Recht auf Privatsphäre und keine dieser Angaben ist notwendig.
-Wenn du ganz neu bei Friendica bist und niemanden kennst, werden sie dir aber helfen
-ein paar neue und interessante Freunde zu finden.
-
-
-Danke und willkommen auf $[sitename].
-
-Beste Grüße,
- $[sitename] Administrator
-
- \ No newline at end of file
+
diff --git a/view/de/register_verify_eml.tpl b/view/de/register_verify_eml.tpl
index 8f25f5c36..85d9a12d3 100644
--- a/view/de/register_verify_eml.tpl
+++ b/view/de/register_verify_eml.tpl
@@ -1,25 +1,25 @@
-Eine Neuanmeldung auf $[sitename] benötigt
-deine Aufmerksamkeit.
+A new user registration request was received at {{$sitename}} which requires
+your approval.
-Die Login-Einzelheiten sind die folgenden:
+The login details are as follows:
-Kompletter Name: $[username]
-Adresse der Seite: $[siteurl]
-Login Name: $[email]
+Site Location: {{$siteurl}}
+Login Name: {{$email}}
+IP Address: {{$details}}
+To approve this request please visit the following link:
-Um die Anfrage zu bestätigen besuche bitte:
+{{$siteurl}}/regmod/allow/{{$hash}}
-$[siteurl]/regmod/allow/$[hash]
+To deny the request and remove the account, please visit:
-Um die Anfrage abzulehnen und den Account zu löschen besuche bitte:
+{{$siteurl}}/regmod/deny/{{$hash}}
-$[siteurl]/regmod/deny/$[hash]
+Thank you.
-Danke!
diff --git a/view/de/request_notify_eml.tpl b/view/de/request_notify_eml.tpl
index 057044e8c..d01b8ff27 100644
--- a/view/de/request_notify_eml.tpl
+++ b/view/de/request_notify_eml.tpl
@@ -1,17 +1,17 @@
-Hallo $[myname],
+Dear {{$myname}},
-du hast eine Kontaktanfrage von '$[requestor]' auf $[sitename]
+You have just received a connection request at {{$sitename}}
-erhalten.
+from '{{$requestor}}'.
-Du kannst sein/ihr Profil unter $[url] finden.
+You may visit their profile at {{$url}}.
-Bitte melde dich an um die komplette Vorstellung einzusehen
-und die Anfrage zu bestätigen oder zu ignorieren oder abzulehnen.
+Please login to your site to view the complete introduction
+and approve or ignore/cancel the request.
-$[siteurl]
+{{$siteurl}}
-Beste Grüße,
+Regards,
- $[sitename] Administrator \ No newline at end of file
+ {{$sitename}} administrator
diff --git a/view/de/strings.php b/view/de/strings.php
index 206f4da95..1dbbb36cc 100644
--- a/view/de/strings.php
+++ b/view/de/strings.php
@@ -1,1747 +1,1686 @@
<?php
function string_plural_select_de($n){
- return ($n != 1);
+ return ($n != 1);;
}
;
-$a->strings["Post successful."] = "Beitrag erfolgreich veröffentlicht.";
-$a->strings["[Embedded content - reload page to view]"] = "[Eingebetteter Inhalt - Seite neu laden zum Betrachten]";
-$a->strings["Contact settings applied."] = "Einstellungen zum Kontakt angewandt.";
-$a->strings["Contact update failed."] = "Konnte den Kontakt nicht aktualisieren.";
-$a->strings["Permission denied."] = "Zugriff verweigert.";
-$a->strings["Contact not found."] = "Kontakt nicht gefunden.";
-$a->strings["Repair Contact Settings"] = "Kontakteinstellungen reparieren";
-$a->strings["<strong>WARNING: This is highly advanced</strong> and if you enter incorrect information your communications with this contact may stop working."] = "<strong>ACHTUNG: Das sind Experten-Einstellungen!</strong> Wenn Du etwas Falsches eingibst, funktioniert die Kommunikation mit diesem Kontakt evtl. nicht mehr.";
-$a->strings["Please use your browser 'Back' button <strong>now</strong> if you are uncertain what to do on this page."] = "Bitte nutze den Zurück-Button deines Browsers <strong>jetzt</strong>, wenn du dir unsicher bist, was du tun willst.";
-$a->strings["Return to contact editor"] = "Zurück zum Kontakteditor";
-$a->strings["Name"] = "Name";
-$a->strings["Account Nickname"] = "Konto-Spitzname";
-$a->strings["@Tagname - overrides Name/Nickname"] = "@Tagname - überschreibt Name/Spitzname";
-$a->strings["Account URL"] = "Konto-URL";
-$a->strings["Friend Request URL"] = "URL für Freundschaftsanfragen";
-$a->strings["Friend Confirm URL"] = "URL für Bestätigungen von Freundschaftsanfragen";
-$a->strings["Notification Endpoint URL"] = "URL-Endpunkt für Benachrichtigungen";
-$a->strings["Poll/Feed URL"] = "Pull/Feed-URL";
-$a->strings["New photo from this URL"] = "Neues Foto von dieser URL";
-$a->strings["Submit"] = "Senden";
-$a->strings["Help:"] = "Hilfe:";
+$a->strings["Visible to everybody"] = "Für jeden sichtbar";
+$a->strings["show"] = "zeigen";
+$a->strings["don't show"] = "Verbergen";
+$a->strings[" and "] = "und";
+$a->strings["public profile"] = "öffentliches Profil";
+$a->strings["%1\$s changed %2\$s to &ldquo;%3\$s&rdquo;"] = "%1\$s hat %2\$s auf &ldquo;%3\$s&rdquo; geändert";
+$a->strings["Visit %1\$s's %2\$s"] = "Besuche %1\$s's %2\$s";
+$a->strings["%1\$s has an updated %2\$s, changing %3\$s."] = "%1\$s hat ein aktualisiertes %2\$s, %3\$s wurde verändert.";
+$a->strings["Public Timeline"] = "Öffentliche Zeitleiste";
+$a->strings["Logout"] = "Abmelden";
+$a->strings["End this session"] = "Beende diese Sitzung";
+$a->strings["Home"] = "Home";
+$a->strings["Your posts and conversations"] = "Deine Beiträge und Unterhaltungen";
+$a->strings["View Profile"] = "Profil ansehen";
+$a->strings["Your profile page"] = "Deine Profilseite";
+$a->strings["Edit Profiles"] = "Profile bearbeiten";
+$a->strings["Manage/Edit Profiles"] = "Verwalte/Bearbeite Profile";
+$a->strings["Photos"] = "Fotos";
+$a->strings["Your photos"] = "Deine Bilder";
+$a->strings["Login"] = "Anmelden";
+$a->strings["Sign in"] = "Anmelden";
+$a->strings["%s - click to logout"] = "%s - Klick zum Abmelden";
+$a->strings["Click to authenticate to your home hub"] = "Klick zum Authentifizieren bei Deinem Heimat-Hub";
+$a->strings["Home Page"] = "Homepage";
+$a->strings["Register"] = "Registrieren";
+$a->strings["Create an account"] = "Erzeuge ein Konto";
$a->strings["Help"] = "Hilfe";
-$a->strings["Not Found"] = "Nicht gefunden";
-$a->strings["Page not found."] = "Seite nicht gefunden.";
-$a->strings["File exceeds size limit of %d"] = "Die Datei ist größer als das erlaubte Limit von %d";
-$a->strings["File upload failed."] = "Hochladen der Datei fehlgeschlagen.";
-$a->strings["Friend suggestion sent."] = "Kontaktvorschlag gesendet.";
-$a->strings["Suggest Friends"] = "Kontakte vorschlagen";
-$a->strings["Suggest a friend for %s"] = "Schlage %s einen Kontakt vor";
-$a->strings["Event description and start time are required."] = "Ereignisbeschreibung und Startzeit sind erforderlich.";
-$a->strings["l, F j"] = "l, F j";
-$a->strings["Edit event"] = "Veranstaltung bearbeiten";
-$a->strings["link to source"] = "Link zum Originalbeitrag";
+$a->strings["Help and documentation"] = "Hilfe und Dokumentation";
+$a->strings["Apps"] = "Apps";
+$a->strings["Addon applications, utilities, games"] = "Addon Programme, Helferlein, Spiele";
+$a->strings["Search"] = "Suche";
+$a->strings["Search site content"] = "Durchsuche Seiten-Inhalt";
+$a->strings["Directory"] = "Verzeichnis";
+$a->strings["Channel Locator"] = "Kanal-Anzeiger";
+$a->strings["Matrix"] = "Matrix";
+$a->strings["Your matrix"] = "Deine Matrix";
+$a->strings["Mark all matrix notifications seen"] = "Markiere alle Matrix-Benachrichtigungen als angesehen";
+$a->strings["Channel Home"] = "Mein Kanal";
+$a->strings["Channel home"] = "Mein Kanal";
+$a->strings["Mark all channel notifications seen"] = "Markiere alle Kanal-Benachrichtigungen als angesehen";
+$a->strings["Intros"] = "Vorstellungen";
+$a->strings["New Connections"] = "Neue Verbindungen";
+$a->strings["Notices"] = "Benachrichtigungen";
+$a->strings["Notifications"] = "Benachrichtigungen";
+$a->strings["See all notifications"] = "Alle Benachrichtigungen ansehen";
+$a->strings["Mark all system notifications seen"] = "Markiere alle System-Benachrichtigungen als gesehen";
+$a->strings["Mail"] = "Mail";
+$a->strings["Private mail"] = "Persönliche Mail";
+$a->strings["See all private messages"] = "Alle persönlichen Nachrichten ansehen";
+$a->strings["Mark all private messages seen"] = "Markiere alle persönlichen Nachrichten als gesehen";
+$a->strings["Inbox"] = "Eingang";
+$a->strings["Outbox"] = "Ausgang";
+$a->strings["New Message"] = "Neue Nachricht";
$a->strings["Events"] = "Veranstaltungen";
-$a->strings["Create New Event"] = "Neue Veranstaltung erstellen";
-$a->strings["Previous"] = "Vorherige";
-$a->strings["Next"] = "Nächste";
-$a->strings["hour:minute"] = "Stunde:Minute";
-$a->strings["Event details"] = "Veranstaltungsdetails";
-$a->strings["Format is %s %s. Starting date and Description are required."] = "Format ist %s %s. Anfangsdatum und Beschreibung sind notwendig.";
-$a->strings["Event Starts:"] = "Veranstaltungsbeginn:";
-$a->strings["Finish date/time is not known or not relevant"] = "Enddatum/-zeit ist nicht bekannt oder nicht relevant";
-$a->strings["Event Finishes:"] = "Veranstaltungsende:";
-$a->strings["Adjust for viewer timezone"] = "An Zeitzone des Betrachters anpassen";
-$a->strings["Description:"] = "Beschreibung";
+$a->strings["Event Calendar"] = "Veranstaltungskalender";
+$a->strings["See all events"] = "Alle Ereignisse ansehen";
+$a->strings["Mark all events seen"] = "Markiere alle Ereignisse als gesehen";
+$a->strings["Channel Select"] = "Kanal-Auswahl";
+$a->strings["Manage Your Channels"] = "Verwalte Deine Kanäle";
+$a->strings["Settings"] = "Einstellungen";
+$a->strings["Account/Channel Settings"] = "Konto-/Kanal-Einstellungen";
+$a->strings["Connections"] = "Verbindungen";
+$a->strings["Manage/Edit Friends and Connections"] = "Verwalte/Bearbeite Freunde und Verbindungen";
+$a->strings["Admin"] = "Admin";
+$a->strings["Site Setup and Configuration"] = "Seiten-Einrichtung und -Konfiguration";
+$a->strings["Nothing new here"] = "Nichts Neues hier";
+$a->strings["Please wait..."] = "Bitte warten...";
+$a->strings["Edit File properties"] = "Dateieigenschaften ändern";
+$a->strings["Connect"] = "Verbinden";
+$a->strings["New window"] = "Neues Fenster";
+$a->strings["Open the selected location in a different window or browser tab"] = "Öffne die markierte Adresse in einem neuen Browser Fenster oder Tab";
+$a->strings["Categories"] = "Kategorien";
+$a->strings["Ignore/Hide"] = "Ignorieren/Verstecken";
+$a->strings["Suggestions"] = "Vorschläge";
+$a->strings["See more..."] = "Mehr anzeigen...";
+$a->strings["You have %1$.0f of %2$.0f allowed connections."] = "Du bist %1$.0f von %2$.0f erlaubten Verbindungen eingegangen.";
+$a->strings["Add New Connection"] = "Neue Verbindung hinzufügen";
+$a->strings["Enter the channel address"] = "Adresse des Kanals eingeben";
+$a->strings["Example: bob@example.com, http://example.com/barbara"] = "Beispiel: bob@beispiel.com, http://beispiel.com/barbara";
+$a->strings["Notes"] = "Notizen";
+$a->strings["Save"] = "Speichern";
+$a->strings["Remove term"] = "Eintrag löschen";
+$a->strings["Saved Searches"] = "Gesicherte Suchanfragen";
+$a->strings["add"] = "hinzufügen";
+$a->strings["Saved Folders"] = "Gesicherte Ordner";
+$a->strings["Everything"] = "Alles";
+$a->strings["Archives"] = "Archive";
+$a->strings["Refresh"] = "Aktualisieren";
+$a->strings["Me"] = "Ich";
+$a->strings["Best Friends"] = "Beste Freunde";
+$a->strings["Friends"] = "Freunde";
+$a->strings["Co-workers"] = "Kollegen";
+$a->strings["Former Friends"] = "ehem. Freunde";
+$a->strings["Acquaintances"] = "Bekanntschaften";
+$a->strings["Everybody"] = "Jeder";
+$a->strings["Account settings"] = "Konto-Einstellungen";
+$a->strings["Channel settings"] = "Kanal-Einstellungen";
+$a->strings["Additional features"] = "Zusätzliche Funktionen";
+$a->strings["Feature settings"] = "Funktions-Einstellungen";
+$a->strings["Display settings"] = "Anzeige-Einstellungen";
+$a->strings["Connected apps"] = "Verbundene Apps";
+$a->strings["Export channel"] = "Kanal exportieren";
+$a->strings["Automatic Permissions (Advanced)"] = "Automatische Berechtigungen (Erweitert)";
+$a->strings["Premium Channel Settings"] = "Prämium-Kanal Einstellungen";
+$a->strings["Channel Sources"] = "Kanal Quellen";
+$a->strings["Check Mail"] = "E-Mails abrufen";
+$a->strings["Unknown | Not categorised"] = "Unbekannt | Nicht kategorisiert";
+$a->strings["Block immediately"] = "Sofort blockieren";
+$a->strings["Shady, spammer, self-marketer"] = "Zwielichtig, Spammer, Selbstdarsteller";
+$a->strings["Known to me, but no opinion"] = "Mir bekannt, aber keine Meinung";
+$a->strings["OK, probably harmless"] = "Ok, wahrscheinlich harmlos";
+$a->strings["Reputable, has my trust"] = "Seriös, hat mein Vertrauen";
+$a->strings["Frequently"] = "Häufig";
+$a->strings["Hourly"] = "Stündlich";
+$a->strings["Twice daily"] = "Zwei Mal am Tag";
+$a->strings["Daily"] = "Täglich";
+$a->strings["Weekly"] = "Wöchentlich";
+$a->strings["Monthly"] = "Monatlich";
+$a->strings["Friendica"] = "Friendica";
+$a->strings["OStatus"] = "OStatus";
+$a->strings["RSS/Atom"] = "RSS/Atom";
+$a->strings["Email"] = "E-Mail";
+$a->strings["Diaspora"] = "Diaspora";
+$a->strings["Facebook"] = "Facebook";
+$a->strings["Zot!"] = "Zot!";
+$a->strings["LinkedIn"] = "LinkedIn";
+$a->strings["XMPP/IM"] = "XMPP/IM";
+$a->strings["MySpace"] = "MySpace";
+$a->strings["Miscellaneous"] = "Verschiedenes";
+$a->strings["year"] = "Jahr";
+$a->strings["month"] = "Monat";
+$a->strings["day"] = "Tag";
+$a->strings["never"] = "Nie";
+$a->strings["less than a second ago"] = "Vor weniger als einer Sekunde";
+$a->strings["years"] = "Jahre";
+$a->strings["months"] = "Monate";
+$a->strings["week"] = "Woche";
+$a->strings["weeks"] = "Wochen";
+$a->strings["days"] = "Tage";
+$a->strings["hour"] = "Stunde";
+$a->strings["hours"] = "Stunden";
+$a->strings["minute"] = "Minute";
+$a->strings["minutes"] = "Minuten";
+$a->strings["second"] = "Sekunde";
+$a->strings["seconds"] = "Sekunden";
+$a->strings["%1\$d %2\$s ago"] = "vor %1\$d %2\$s";
+$a->strings["Cannot locate DNS info for database server '%s'"] = "Kann die DNS Information für den Datenbank Server '%s' nicht finden";
+$a->strings["l F d, Y \\@ g:i A"] = "l, d. F Y\\\\, H:i";
+$a->strings["Starts:"] = "Beginnt:";
+$a->strings["Finishes:"] = "Endet:";
$a->strings["Location:"] = "Ort:";
-$a->strings["Share this event"] = "Veranstaltung teilen";
-$a->strings["Cancel"] = "Abbrechen";
-$a->strings["Tag removed"] = "Tag entfernt";
-$a->strings["Remove Item Tag"] = "Gegenstands-Tag entfernen";
-$a->strings["Select a tag to remove: "] = "Wähle ein Tag zum Entfernen aus: ";
-$a->strings["Remove"] = "Entfernen";
-$a->strings["%s welcomes %s"] = "%s heißt %s herzlich willkommen";
-$a->strings["Authorize application connection"] = "Verbindung der Applikation autorisieren";
-$a->strings["Return to your app and insert this Securty Code:"] = "Gehe zu deiner Anwendung zurück und trage dort folgenden Sicherheitscode ein:";
-$a->strings["Please login to continue."] = "Bitte melde dich an um fortzufahren.";
-$a->strings["Do you want to authorize this application to access your posts and contacts, and/or create new posts for you?"] = "Möchtest du dieser Anwendung den Zugriff auf deine Beiträge und Kontakte, sowie das Erstellen neuer Beiträge in deinem Namen gestatten?";
-$a->strings["Yes"] = "Ja";
-$a->strings["No"] = "Nein";
-$a->strings["Photo Albums"] = "Fotoalben";
-$a->strings["Contact Photos"] = "Kontaktbilder";
-$a->strings["Upload New Photos"] = "Weitere Fotos hochladen";
-$a->strings["everybody"] = "jeder";
-$a->strings["Contact information unavailable"] = "Kontaktinformationen nicht verfügbar";
-$a->strings["Profile Photos"] = "Profilbilder";
-$a->strings["Album not found."] = "Album nicht gefunden.";
-$a->strings["Delete Album"] = "Album löschen";
-$a->strings["Delete Photo"] = "Foto löschen";
-$a->strings["was tagged in a"] = "wurde getaggt in einem";
+$a->strings["prev"] = "vorherige";
+$a->strings["first"] = "erste";
+$a->strings["last"] = "letzte";
+$a->strings["next"] = "nächste";
+$a->strings["older"] = "älter";
+$a->strings["newer"] = "neuer";
+$a->strings["No connections"] = "Keine Verbindungen";
+$a->strings["%d Connection"] = array(
+ 0 => "%d Verbindung",
+ 1 => "%d Verbindungen",
+);
+$a->strings["View Connections"] = "Zeige Verbindungen";
+$a->strings["poke"] = "anstupsen";
+$a->strings["poked"] = "stupste";
+$a->strings["ping"] = "anpingen";
+$a->strings["pinged"] = "pingte";
+$a->strings["prod"] = "knuffen";
+$a->strings["prodded"] = "knuffte";
+$a->strings["slap"] = "ohrfeigen";
+$a->strings["slapped"] = "ohrfeigte";
+$a->strings["finger"] = "befummeln";
+$a->strings["fingered"] = "befummelte";
+$a->strings["rebuff"] = "eine Abfuhr erteilen";
+$a->strings["rebuffed"] = "abfuhrerteilte";
+$a->strings["happy"] = "glücklich";
+$a->strings["sad"] = "traurig";
+$a->strings["mellow"] = "sanft";
+$a->strings["tired"] = "müde";
+$a->strings["perky"] = "frech";
+$a->strings["angry"] = "sauer";
+$a->strings["stupified"] = "verblüfft";
+$a->strings["puzzled"] = "verwirrt";
+$a->strings["interested"] = "interessiert";
+$a->strings["bitter"] = "verbittert";
+$a->strings["cheerful"] = "fröhlich";
+$a->strings["alive"] = "lebendig";
+$a->strings["annoyed"] = "verärgert";
+$a->strings["anxious"] = "unruhig";
+$a->strings["cranky"] = "schrullig";
+$a->strings["disturbed"] = "verstört";
+$a->strings["frustrated"] = "frustriert";
+$a->strings["motivated"] = "motiviert";
+$a->strings["relaxed"] = "entspannt";
+$a->strings["surprised"] = "überrascht";
+$a->strings["Monday"] = "Montag";
+$a->strings["Tuesday"] = "Dienstag";
+$a->strings["Wednesday"] = "Mittwoch";
+$a->strings["Thursday"] = "Donnerstag";
+$a->strings["Friday"] = "Freitag";
+$a->strings["Saturday"] = "Samstag";
+$a->strings["Sunday"] = "Sonntag";
+$a->strings["January"] = "Januar";
+$a->strings["February"] = "Februar";
+$a->strings["March"] = "März";
+$a->strings["April"] = "April";
+$a->strings["May"] = "Mai";
+$a->strings["June"] = "Juni";
+$a->strings["July"] = "Juli";
+$a->strings["August"] = "August";
+$a->strings["September"] = "September";
+$a->strings["October"] = "Oktober";
+$a->strings["November"] = "November";
+$a->strings["December"] = "Dezember";
+$a->strings["unknown.???"] = "unbekannt.???";
+$a->strings["bytes"] = "Bytes";
+$a->strings["remove category"] = "Kategorie entfernen";
+$a->strings["remove from file"] = "aus der Datei entfernen";
+$a->strings["Click to open/close"] = "Klicke zum Öffnen/Schließen";
+$a->strings["link to source"] = "Link zum Originalbeitrag";
+$a->strings["Select a page layout: "] = "Ein Seiten-Layout auswählen";
+$a->strings["default"] = "Standard";
+$a->strings["Page content type: "] = "Content-Typ der Seite";
+$a->strings["Select an alternate language"] = "Wähle eine alternative Sprache";
$a->strings["photo"] = "Foto";
-$a->strings["by"] = "von";
-$a->strings["Image exceeds size limit of "] = "Die Bildgröße übersteigt das Limit von ";
-$a->strings["Image file is empty."] = "Bilddatei ist leer.";
-$a->strings["Unable to process image."] = "Konnte das Bild nicht bearbeiten.";
-$a->strings["Image upload failed."] = "Hochladen des Bildes gescheitert.";
-$a->strings["Public access denied."] = "Öffentlicher Zugriff verweigert.";
-$a->strings["No photos selected"] = "Keine Bilder ausgewählt";
-$a->strings["Access to this item is restricted."] = "Zugriff zu diesem Eintrag wurde eingeschränkt.";
-$a->strings["Upload Photos"] = "Bilder hochladen";
-$a->strings["New album name: "] = "Name des neuen Albums: ";
-$a->strings["or existing album name: "] = "oder existierender Albumname: ";
-$a->strings["Do not show a status post for this upload"] = "Keine Status-Mitteilung für diesen Beitrag anzeigen";
-$a->strings["Permissions"] = "Berechtigungen";
-$a->strings["Edit Album"] = "Album bearbeiten";
-$a->strings["View Photo"] = "Fotos betrachten";
-$a->strings["Permission denied. Access to this item may be restricted."] = "Zugriff verweigert. Zugriff zu diesem Eintrag könnte eingeschränkt sein.";
-$a->strings["Photo not available"] = "Foto nicht verfügbar";
-$a->strings["View photo"] = "Fotos ansehen";
-$a->strings["Edit photo"] = "Foto bearbeiten";
-$a->strings["Use as profile photo"] = "Als Profilbild verwenden";
-$a->strings["Private Message"] = "Private Nachricht";
-$a->strings["View Full Size"] = "Betrachte Originalgröße";
-$a->strings["Tags: "] = "Tags: ";
-$a->strings["[Remove any tag]"] = "[Tag entfernen]";
-$a->strings["Rotate CW"] = "Im Uhrzeigersinn rotieren";
-$a->strings["New album name"] = "Name des neuen Albums";
-$a->strings["Caption"] = "Bildunterschrift";
-$a->strings["Add a Tag"] = "Tag hinzufügen";
-$a->strings["Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"] = "Beispiel: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping";
-$a->strings["I like this (toggle)"] = "Ich mag das (toggle)";
-$a->strings["I don't like this (toggle)"] = "Ich mag das nicht (toggle)";
-$a->strings["Share"] = "Teilen";
-$a->strings["Please wait"] = "Bitte warten";
-$a->strings["This is you"] = "Das bist du";
+$a->strings["event"] = "Ereignis";
+$a->strings["status"] = "Status";
+$a->strings["comment"] = "Kommentar";
+$a->strings["activity"] = "Aktivität";
+$a->strings["Design"] = "Design";
+$a->strings["Blocks"] = "Blöcke";
+$a->strings["Menus"] = "Menüs";
+$a->strings["Layouts"] = "Layouts";
+$a->strings["Pages"] = "Seiten";
+$a->strings["A deleted group with this name was revived. Existing item permissions <strong>may</strong> apply to this group and any future members. If this is not what you intended, please create another group with a different name."] = "Ein gelöschte Gruppe mit diesem Namen wurde gefunden. Existierende Zugangsregeln für Elemente <strong>könnten</strong> für diese Gruppe angewendet werden, sowie für alle zukünftigen Elemente.";
+$a->strings["Default privacy group for new contacts"] = "Standard-Privatsphärengruppe für neue Kontakte";
+$a->strings["All Channels"] = "Alle Kanäle";
+$a->strings["edit"] = "Bearbeiten";
+$a->strings["Collections"] = "Sammlungen";
+$a->strings["Edit collection"] = "Bearbeite Sammlungen";
+$a->strings["Create a new collection"] = "Neue Sammlung erzeugen";
+$a->strings["Channels not in any collection"] = "Kanäle, die nicht in einer Sammlung sind";
+$a->strings["Delete this item?"] = "Dieses Element löschen?";
$a->strings["Comment"] = "Kommentar";
-$a->strings["Preview"] = "Vorschau";
+$a->strings["show more"] = "mehr zeigen";
+$a->strings["show fewer"] = "Zeige weniger";
+$a->strings["Password too short"] = "Kennwort zu kurz";
+$a->strings["Passwords do not match"] = "Kennwörter stimmen nicht überein";
+$a->strings["everybody"] = "alle";
+$a->strings["Secret Passphrase"] = "geheime Passwort-Phrase";
+$a->strings["Passphrase hint"] = "Hinweis zur Phrase";
+$a->strings["timeago.prefixAgo"] = "timeago.prefixAgo";
+$a->strings["timeago.suffixAgo"] = "timeago.suffixAgo";
+$a->strings["ago"] = "her";
+$a->strings["from now"] = "von jetzt";
+$a->strings["less than a minute"] = "weniger als eine Minute";
+$a->strings["about a minute"] = "ungefähr eine Minute";
+$a->strings["%d minutes"] = "%d Minuten";
+$a->strings["about an hour"] = "ungefähr eine Stunde";
+$a->strings["about %d hours"] = "ungefähr %d Stunden";
+$a->strings["a day"] = "ein Tag";
+$a->strings["%d days"] = "%d Tage";
+$a->strings["about a month"] = "ungefähr ein Monat";
+$a->strings["%d months"] = "%d Monate";
+$a->strings["about a year"] = "ungefähr ein Jahr";
+$a->strings["%d years"] = "%d Jahre";
+$a->strings[" "] = " ";
+$a->strings["timeago.numbers"] = "timeago.numbers";
+$a->strings["No recipient provided."] = "Kein Empfänger angegeben";
+$a->strings["[no subject]"] = "[no subject]";
+$a->strings["Unable to determine sender."] = "Kann Absender nicht bestimmen.";
+$a->strings["Stored post could not be verified."] = "Gespeicherter Beitrag konnten nicht überprüft werden.";
+$a->strings["Profile Photos"] = "Profilfotos";
+$a->strings["view full size"] = "In Vollbildansicht anschauen";
+$a->strings["Image/photo"] = "Bild/Foto";
+$a->strings["Encrypted content"] = "Verschlüsselter Inhalt";
+$a->strings["QR code"] = "QR Code";
+$a->strings["%1\$s wrote the following %2\$s %3\$s"] = "%1\$s schrieb den folgenden %2\$s %3\$s";
+$a->strings["post"] = "Beitrag";
+$a->strings["$1 wrote:"] = "$1 schrieb:";
+$a->strings["Embedded content"] = "Eingebetteter Inhalt";
+$a->strings["Embedding disabled"] = "Einbetten ausgeschaltet";
+$a->strings["General Features"] = "Allgemeine Funktionen";
+$a->strings["Content Expiration"] = "Verfall von Inhalten";
+$a->strings["Remove posts/comments and/or private messages at a future time"] = "Lösche Beiträge, Kommentare und/oder private Nachrichten automatisch zu einem zukünftigen Datum.";
+$a->strings["Multiple Profiles"] = "Mehrfachprofile";
+$a->strings["Ability to create multiple profiles"] = "Mehrfachprofile anlegen können";
+$a->strings["Web Pages"] = "Webseiten";
+$a->strings["Provide managed web pages on your channel"] = "Stelle verwaltete Webseiten in Deinem Kanal zur Verfügung";
+$a->strings["Private Notes"] = "private Notizen";
+$a->strings["Enables a tool to store notes and reminders"] = "Werkzeug zum Speichern von Notizen und Erinnerungen aktivieren";
+$a->strings["Extended Identity Sharing"] = "Erweitertes Teilen von Identitäten";
+$a->strings["Share your identity with all websites on the internet. When disabled, identity is only shared with sites in the matrix."] = "Teile deine Identität mit allen Webseiten im Internet. Ist dies deaktiviert wird deine Identität nur mit Seiten der Matrix geteilt.";
+$a->strings["Expert Mode"] = "Expertenmodus";
+$a->strings["Enable Expert Mode to provide advanced configuration options"] = "Aktiviere Expertenmodus, um fortgeschrittene Konfiguration zur Verfügung zu stellen";
+$a->strings["Premium Channel"] = "Premium-Kanal";
+$a->strings["Allows you to set restrictions and terms on those that connect with your channel"] = "Erlaubt es dir Einschränkungen für Kontakte und bestimmte Bedingungen an Kontakte zu diesem Kanal zu stellen";
+$a->strings["Post Composition Features"] = "Nachbearbeitungsfunktionen";
+$a->strings["Richtext Editor"] = "Formatierungseditor";
+$a->strings["Enable richtext editor"] = "Aktiviere Formatierungseditor";
+$a->strings["Post Preview"] = "Voransicht";
+$a->strings["Allow previewing posts and comments before publishing them"] = "Erlaube Voransicht von Beiträgen und Kommentaren vor Veröffentlichung";
+$a->strings["Automatically import channel content from other channels or feeds"] = "Importiere automatisch Inhalte für diesen Kanal von anderen Kanälen oder Feeds.";
+$a->strings["Even More Encryption"] = "Noch mehr Verschlüsselung";
+$a->strings["Allow optional encryption of content end-to-end with a shared secret key"] = "Erlaube optionale Verschlüsselung von Inhalten (Ende-zu-Ende mit geteiltem Sicherheitsschlüssel)";
+$a->strings["Network and Stream Filtering"] = "Netzwerk- und Stream-Filter";
+$a->strings["Search by Date"] = "Suche nach Datum";
+$a->strings["Ability to select posts by date ranges"] = "Möglichkeit, Beiträge nach Zeiträumen auszuwählen";
+$a->strings["Collections Filter"] = "Filter für Sammlung";
+$a->strings["Enable widget to display Network posts only from selected collections"] = "Aktiviere nur Netzwerk-Beiträge von ausgewählten Sammlungen";
+$a->strings["Save search terms for re-use"] = "Gesicherte Suchbegriffe zur Wiederverwendung";
+$a->strings["Network Personal Tab"] = "Persönlicher Netzwerkreiter";
+$a->strings["Enable tab to display only Network posts that you've interacted on"] = "Aktiviere Reiter nur für die Netzwerk-Beiträge, mit denen Du interagiert hast";
+$a->strings["Network New Tab"] = "Netzwerkreiter Neu";
+$a->strings["Enable tab to display all new Network activity"] = "Aktiviere Reiter, um alle neuen Netzwerkaktivitäten zu zeigen";
+$a->strings["Affinity Tool"] = "Beziehungs-Tool";
+$a->strings["Filter stream activity by depth of relationships"] = "Filter Aktivitätenstream nach Tiefe der Beziehung";
+$a->strings["Suggest Channels"] = "Kanäle Vorschlagen";
+$a->strings["Show channel suggestions"] = "Kanal-Vorschläge anzeigen";
+$a->strings["Post/Comment Tools"] = "Beitrag-/Kommentar-Tools";
+$a->strings["Edit Sent Posts"] = "Bearbeite gesendete Beiträge";
+$a->strings["Edit and correct posts and comments after sending"] = "Bearbeite und korrigiere Beiträge und Kommentare nach dem Senden";
+$a->strings["Tagging"] = "Verschlagworten";
+$a->strings["Ability to tag existing posts"] = "Möglichkeit, um existierende Beiträge zu verschlagworten";
+$a->strings["Post Categories"] = "Beitrags-Kategorien";
+$a->strings["Add categories to your posts"] = "Kategorien für Beiträge";
+$a->strings["Ability to file posts under folders"] = "Möglichkeit, Beiträge in Verzeichnissen zu sammeln";
+$a->strings["Dislike Posts"] = "Gefällt-mir-nicht Beiträge";
+$a->strings["Ability to dislike posts/comments"] = "Möglichkeit für Gefällt-mir-nicht für Beiträge/Kommentare";
+$a->strings["Star Posts"] = "Beiträge mit Sternchen versehen";
+$a->strings["Ability to mark special posts with a star indicator"] = "Möglichkeit, spezielle Beiträge mit Sternchen-Symbol zu markieren";
+$a->strings["Tag Cloud"] = "Tag Wolke";
+$a->strings["Provide a personal tag cloud on your channel page"] = "Persönliche Schlagwort-Wolke für deine Kanal-Seite anlegen";
+$a->strings["channel"] = "Kanal";
+$a->strings["%1\$s likes %2\$s's %3\$s"] = "%1\$s mag %2\$s's %3\$s";
+$a->strings["%1\$s doesn't like %2\$s's %3\$s"] = "%1\$s mag %2\$s's %3\$s nicht";
+$a->strings["%1\$s is now connected with %2\$s"] = "%1\$s ist jetzt mit %2\$s verbunden";
+$a->strings["%1\$s poked %2\$s"] = "%1\$s stupste %2\$s";
+$a->strings["%1\$s is currently %2\$s"] = "%1\$s ist momentan %2\$s";
+$a->strings["Select"] = "Auswählen";
$a->strings["Delete"] = "Löschen";
-$a->strings["View Album"] = "Album betrachten";
-$a->strings["Recent Photos"] = "Neueste Fotos";
-$a->strings["Not available."] = "Nicht verfügbar.";
-$a->strings["Community"] = "Gemeinschaft";
-$a->strings["No results."] = "Keine Ergebnisse.";
-$a->strings["This is Friendica, version"] = "Dies ist Friendica, Version";
-$a->strings["running at web location"] = "die unter folgender Webadresse zu finden ist";
-$a->strings["Please visit <a href=\"http://friendica.com\">Friendica.com</a> to learn more about the Friendica project."] = "Bitte besuche <a href=\"http://friendica.com\">Friendica.com</a>, um mehr über das Friendica Projekt zu erfahren.";
-$a->strings["Bug reports and issues: please visit"] = "Probleme oder Fehler gefunden? Bitte besuche";
-$a->strings["Suggestions, praise, donations, etc. - please email \"Info\" at Friendica - dot com"] = "Vorschläge, Lob, Spenden usw.: E-Mail an \"Info\" at Friendica - dot com";
-$a->strings["Installed plugins/addons/apps:"] = "Installierte Plugins/Erweiterungen/Apps";
-$a->strings["No installed plugins/addons/apps"] = "Keine Plugins/Erweiterungen/Apps installiert";
-$a->strings["Item not found"] = "Beitrag nicht gefunden";
-$a->strings["Edit post"] = "Beitrag bearbeiten";
-$a->strings["Post to Email"] = "An E-Mail senden";
-$a->strings["Edit"] = "Bearbeiten";
+$a->strings["Message is verified"] = "Nachricht überprüft";
+$a->strings["View %s's profile @ %s"] = "Schaue Dir %s's Profil auf %s an.";
+$a->strings["Categories:"] = "Kategorien:";
+$a->strings["Filed under:"] = "Gespeichert unter:";
+$a->strings[" from %s"] = "von %s";
+$a->strings["last edited: %s"] = "zuletzt bearbeitet: %s";
+$a->strings["View in context"] = "Im Zusammenhang anschauen";
+$a->strings["Please wait"] = "Bitte warten";
+$a->strings["remove"] = "lösche";
+$a->strings["Loading..."] = "Lädt ...";
+$a->strings["Delete Selected Items"] = "Lösche die ausgewählten Elemente";
+$a->strings["View Source"] = "Quelle anzeigen";
+$a->strings["Follow Thread"] = "Unterhaltung folgen";
+$a->strings["View Status"] = "Status ansehen";
+$a->strings["View Photos"] = "Fotos ansehen";
+$a->strings["Matrix Activity"] = "Matrix Aktivität";
+$a->strings["Edit Contact"] = "Kontakt bearbeiten";
+$a->strings["Send PM"] = "Sende PN";
+$a->strings["Poke"] = "Anstupsen";
+$a->strings["%s likes this."] = "%s gefällt das.";
+$a->strings["%s doesn't like this."] = "%s gefällt das nicht.";
+$a->strings["<span %1\$s>%2\$d people</span> like this."] = array(
+ 0 => "<span %1\$s>%2\$d Person</span> gefällt das.",
+ 1 => "<span %1\$s>%2\$d Leuten</span> gefällt das.",
+);
+$a->strings["<span %1\$s>%2\$d people</span> don't like this."] = array(
+ 0 => "<span %1\$s>%2\$d Person</span> gefällt das nicht.",
+ 1 => "<span %1\$s>%2\$d Leuten</span> gefällt das nicht.",
+);
+$a->strings["and"] = "und";
+$a->strings[", and %d other people"] = array(
+ 0 => "",
+ 1 => ", und %d andere",
+);
+$a->strings["%s like this."] = "%s gefällt das.";
+$a->strings["%s don't like this."] = "%s gefällt das nicht.";
+$a->strings["Visible to <strong>everybody</strong>"] = "Sichtbar für <strong>jeden</strong>";
+$a->strings["Please enter a link URL:"] = "Gib eine URL ein:";
+$a->strings["Please enter a video link/URL:"] = "Gib einen Video-Link/URL ein:";
+$a->strings["Please enter an audio link/URL:"] = "Gib einen Audio-Link/URL ein:";
+$a->strings["Tag term:"] = "Schlagwort:";
+$a->strings["Save to Folder:"] = "Speichern in Ordner:";
+$a->strings["Where are you right now?"] = "Wo bist du jetzt grade?";
+$a->strings["Expires YYYY-MM-DD HH:MM"] = "Verfällt YYYY-MM-DD HH;MM";
+$a->strings["Preview"] = "Vorschau";
+$a->strings["Share"] = "Teilen";
+$a->strings["Page link title"] = "Seitentitel-Link";
$a->strings["Upload photo"] = "Foto hochladen";
+$a->strings["upload photo"] = "Foto hochladen";
$a->strings["Attach file"] = "Datei anhängen";
-$a->strings["Insert web link"] = "einen Link einfügen";
-$a->strings["Insert YouTube video"] = "YouTube-Video einfügen";
-$a->strings["Insert Vorbis [.ogg] video"] = "Vorbis [.ogg] Video einfügen";
-$a->strings["Insert Vorbis [.ogg] audio"] = "Vorbis [.ogg] Audio einfügen";
-$a->strings["Set your location"] = "Deinen Standort festlegen";
-$a->strings["Clear browser location"] = "Browser-Standort leeren";
-$a->strings["Permission settings"] = "Berechtigungseinstellungen";
-$a->strings["CC: email addresses"] = "Cc:-E-Mail-Addressen";
+$a->strings["attach file"] = "Datei anfügen";
+$a->strings["Insert web link"] = "Link einfügen";
+$a->strings["web link"] = "Web-Link";
+$a->strings["Insert video link"] = "Video-Link einfügen";
+$a->strings["video link"] = "Video-Link";
+$a->strings["Insert audio link"] = "Audio-Link einfügen";
+$a->strings["audio link"] = "Audio-Link";
+$a->strings["Set your location"] = "Standort";
+$a->strings["set location"] = "Standort";
+$a->strings["Clear browser location"] = "Browser-Standort löschen";
+$a->strings["clear location"] = "Standort löschen";
+$a->strings["Set title"] = "Titel";
+$a->strings["Categories (comma-separated list)"] = "Kategorien (Kommagetrennte Liste)";
+$a->strings["Permission settings"] = "Berechtigungs-Einstellungen";
+$a->strings["permissions"] = "Berechtigungen";
$a->strings["Public post"] = "Öffentlicher Beitrag";
-$a->strings["Set title"] = "Titel setzen";
-$a->strings["Categories (comma-separated list)"] = "Kategorien (kommasepariert)";
-$a->strings["Example: bob@example.com, mary@example.com"] = "Z.B.: bob@example.com, mary@example.com";
-$a->strings["This introduction has already been accepted."] = "Diese Kontaktanfrage wurde bereits akzeptiert.";
-$a->strings["Profile location is not valid or does not contain profile information."] = "Profiladresse ist ungültig oder stellt einige Profildaten nicht zur Verfügung.";
-$a->strings["Warning: profile location has no identifiable owner name."] = "Warnung: Es konnte kein Name des Besitzers von der angegebenen Profiladresse gefunden werden.";
-$a->strings["Warning: profile location has no profile photo."] = "Warnung: Es konnte kein Profilbild bei der angegebenen Profiladresse gefunden werden.";
-$a->strings["%d required parameter was not found at the given location"] = array(
- 0 => "%d benötigter Parameter wurde an der angegebenen Stelle nicht gefunden",
- 1 => "%d benötigte Parameter wurden an der angegebenen Stelle nicht gefunden",
-);
-$a->strings["Introduction complete."] = "Kontaktanfrage abgeschlossen.";
-$a->strings["Unrecoverable protocol error."] = "Nicht behebbarer Protokollfehler.";
-$a->strings["Profile unavailable."] = "Profil nicht verfügbar.";
-$a->strings["%s has received too many connection requests today."] = "%s hat heute zu viele Freundschaftsanfragen erhalten.";
-$a->strings["Spam protection measures have been invoked."] = "Maßnahmen zum Spamschutz wurden ergriffen.";
-$a->strings["Friends are advised to please try again in 24 hours."] = "Freunde sind angehalten, es in 24 Stunden erneut zu versuchen.";
-$a->strings["Invalid locator"] = "Ungültiger Locator";
-$a->strings["Invalid email address."] = "Ungültige E-Mail Adresse.";
-$a->strings["This account has not been configured for email. Request failed."] = "Dieses Konto ist nicht für E-Mail konfiguriert. Anfrage fehlgeschlagen.";
-$a->strings["Unable to resolve your name at the provided location."] = "Konnte deinen Namen an der angegebenen Stelle nicht finden.";
-$a->strings["You have already introduced yourself here."] = "Du hast dich hier bereits vorgestellt.";
-$a->strings["Apparently you are already friends with %s."] = "Es scheint so, als ob du bereits mit %s befreundet bist.";
-$a->strings["Invalid profile URL."] = "Ungültige Profil-URL.";
-$a->strings["Disallowed profile URL."] = "Nicht erlaubte Profil-URL.";
-$a->strings["Failed to update contact record."] = "Aktualisierung der Kontaktdaten fehlgeschlagen.";
-$a->strings["Your introduction has been sent."] = "Deine Kontaktanfrage wurde gesendet.";
-$a->strings["Please login to confirm introduction."] = "Bitte melde dich an, um die Kontaktanfrage zu bestätigen.";
-$a->strings["Incorrect identity currently logged in. Please login to <strong>this</strong> profile."] = "Momentan bist du mit einer anderen Identität angemeldet. Bitte melde Dich mit <strong>diesem</strong> Profil an.";
-$a->strings["Hide this contact"] = "Verberge diese Kontakt";
-$a->strings["Welcome home %s."] = "Willkommen zurück %s.";
-$a->strings["Please confirm your introduction/connection request to %s."] = "Bitte bestätige deine Kontaktanfrage bei %s.";
-$a->strings["Confirm"] = "Bestätigen";
-$a->strings["[Name Withheld]"] = "[Name unterdrückt]";
-$a->strings["Please enter your 'Identity Address' from one of the following supported communications networks:"] = "Bitte gib die Adresse deines Profils in einem der unterstützten sozialen Netzwerke an:";
-$a->strings["<strike>Connect as an email follower</strike> (Coming soon)"] = "<strike>Als E-Mail-Kontakt verbinden</strike> (In Kürze verfügbar)";
-$a->strings["If you are not yet a member of the free social web, <a href=\"http://dir.friendica.com/siteinfo\">follow this link to find a public Friendica site and join us today</a>."] = "Wenn du noch kein Mitglied dieses freien sozialen Netzwerks bist, <a href=\"http://dir.friendica.com/siteinfo\">folge diesem Link</a> um einen öffentlichen Friendica-Server zu finden und beizutreten.";
-$a->strings["Friend/Connection Request"] = "Freundschafts-/Kontaktanfrage";
-$a->strings["Examples: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, testuser@identi.ca"] = "Beispiele: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, testuser@identi.ca";
-$a->strings["Please answer the following:"] = "Bitte beantworte Folgendes:";
-$a->strings["Does %s know you?"] = "Kennt %s dich?";
-$a->strings["Add a personal note:"] = "Eine persönliche Notiz beifügen:";
-$a->strings["Friendica"] = "Friendica";
-$a->strings["StatusNet/Federated Social Web"] = "StatusNet/Federated Social Web";
-$a->strings["Diaspora"] = "Diaspora";
-$a->strings[" - please do not use this form. Instead, enter %s into your Diaspora search bar."] = " - bitte verwende dieses Formular nicht. Stattdessen suche nach %s in deiner Diaspora Suchleiste.";
-$a->strings["Your Identity Address:"] = "Adresse deines Profils:";
-$a->strings["Submit Request"] = "Anfrage abschicken";
-$a->strings["Friendica Social Communications Server - Setup"] = "Friendica-Server für soziale Netzwerke – Setup";
-$a->strings["Could not connect to database."] = "Verbindung zur Datenbank gescheitert";
-$a->strings["Could not create table."] = "Konnte Tabelle nicht erstellen.";
-$a->strings["Your Friendica site database has been installed."] = "Die Datenbank deiner Friendica Seite wurde installiert.";
-$a->strings["You may need to import the file \"database.sql\" manually using phpmyadmin or mysql."] = "Möglicherweise musst du die Datei \"database.sql\" manuell mit phpmyadmin oder mysql importieren.";
-$a->strings["Please see the file \"INSTALL.txt\"."] = "Lies bitte die \"INSTALL.txt\".";
-$a->strings["System check"] = "Systemtest";
-$a->strings["Check again"] = "Noch einmal testen";
-$a->strings["Database connection"] = "Datenbankverbindung";
-$a->strings["In order to install Friendica we need to know how to connect to your database."] = "Um Friendica installieren zu können, müssen wir wissen, wie wir zu deiner Datenbank Kontakt aufnehmen können.";
-$a->strings["Please contact your hosting provider or site administrator if you have questions about these settings."] = "Bitte kontaktiere den Hosting Provider oder den Administrator der Seite, falls du Fragen zu diesen Einstellungen haben solltest.";
-$a->strings["The database you specify below should already exist. If it does not, please create it before continuing."] = "Die Datenbank, die du unten angibst, sollte bereits existieren. Ist dies noch nicht der Fall, erzeuge sie bitte bevor du mit der Installation fortfährst.";
-$a->strings["Database Server Name"] = "Datenbank-Server";
-$a->strings["Database Login Name"] = "Datenbank-Nutzer";
-$a->strings["Database Login Password"] = "Datenbank-Passwort";
-$a->strings["Database Name"] = "Datenbank-Name";
-$a->strings["Site administrator email address"] = "E-Mail-Adresse des Administrators";
-$a->strings["Your account email address must match this in order to use the web admin panel."] = "Die E-Mail-Adresse, die in deinem Friendica-Account eingetragen ist, muss mit dieser Adresse übereinstimmen, damit du das Admin-Panel benutzen kannst.";
-$a->strings["Please select a default timezone for your website"] = "Bitte wähle die Standardzeitzone deiner Webseite";
-$a->strings["Site settings"] = "Server-Einstellungen";
-$a->strings["Could not find a command line version of PHP in the web server PATH."] = "Konnte keine Kommandozeilenversion von PHP im PATH des Servers finden.";
-$a->strings["If you don't have a command line version of PHP installed on server, you will not be able to run background polling via cron. See <a href='http://friendica.com/node/27'>'Activating scheduled tasks'</a>"] = "Wenn du keine Kommandozeilen Version von PHP auf deinem Server installiert hast, kannst du keine Hintergrundprozesse via cron starten. Siehe <a href='http://friendica.com/node/27'>'Activating scheduled tasks'</a>";
-$a->strings["PHP executable path"] = "Pfad zu PHP";
-$a->strings["Enter full path to php executable. You can leave this blank to continue the installation."] = "Gib den kompletten Pfad zur ausführbaren Datei von PHP an. Du kannst diesen Feld auch frei lassen und mit der Installation fortfahren.";
-$a->strings["Command line PHP"] = "Kommandozeilen-PHP";
-$a->strings["The command line version of PHP on your system does not have \"register_argc_argv\" enabled."] = "Die Kommandozeilenversion von PHP auf deinem System hat \"register_argc_argv\" nicht aktiviert.";
-$a->strings["This is required for message delivery to work."] = "Dies wird für die Auslieferung von Nachrichten benötigt.";
-$a->strings["PHP register_argc_argv"] = "PHP register_argc_argv";
-$a->strings["Error: the \"openssl_pkey_new\" function on this system is not able to generate encryption keys"] = "Fehler: Die Funktion \"openssl_pkey_new\" auf diesem System ist nicht in der Lage, Verschlüsselungsschlüssel zu erzeugen";
-$a->strings["If running under Windows, please see \"http://www.php.net/manual/en/openssl.installation.php\"."] = "Wenn der Server unter Windows läuft, schau dir bitte \"http://www.php.net/manual/en/openssl.installation.php\" an.";
-$a->strings["Generate encryption keys"] = "Schlüssel erzeugen";
-$a->strings["libCurl PHP module"] = "PHP: libCurl-Modul";
-$a->strings["GD graphics PHP module"] = "PHP: GD-Grafikmodul";
-$a->strings["OpenSSL PHP module"] = "PHP: OpenSSL-Modul";
-$a->strings["mysqli PHP module"] = "PHP: mysqli-Modul";
-$a->strings["mb_string PHP module"] = "PHP: mb_string-Modul";
-$a->strings["Apache mod_rewrite module"] = "Apache mod_rewrite module";
-$a->strings["Error: Apache webserver mod-rewrite module is required but not installed."] = "Fehler: Das Apache-Modul mod-rewrite wird benötigt, es ist allerdings nicht installiert.";
-$a->strings["Error: libCURL PHP module required but not installed."] = "Fehler: Das libCURL PHP Modul wird benötigt ist aber nicht installiert.";
-$a->strings["Error: GD graphics PHP module with JPEG support required but not installed."] = "Fehler: Das GD-Graphikmodul für PHP mit JPEG-Unterstützung ist nicht installiert.";
-$a->strings["Error: openssl PHP module required but not installed."] = "Fehler: Das openssl-Modul von PHP ist nicht installiert.";
-$a->strings["Error: mysqli PHP module required but not installed."] = "Fehler: Das mysqli-Modul von PHP ist nicht installiert.";
-$a->strings["Error: mb_string PHP module required but not installed."] = "Fehler: mb_string PHP Module wird benötigt ist aber nicht installiert.";
-$a->strings["The web installer needs to be able to create a file called \".htconfig.php\ in the top folder of your web server and it is unable to do so."] = "Der Installationswizard muss in der Lage sein, eine Datei im Stammverzeichnis deines Webservers anzulegen, ist allerdings derzeit nicht in der Lage, dies zu tun.";
-$a->strings["This is most often a permission setting, as the web server may not be able to write files in your folder - even if you can."] = "In den meisten Fällen ist dies ein Problem mit den Schreibrechten, der Webserver könnte keine Schreiberlaubnis haben, selbst wenn du sie hast.";
-$a->strings["At the end of this procedure, we will give you a text to save in a file named .htconfig.php in your Friendica top folder."] = "Nachdem du alles ausgefüllt hast, erhältst du einen Text, den du in eine Datei namens .htconfig.php in deinem Friendica-Wurzelverzeichnis kopieren musst.";
-$a->strings["You can alternatively skip this procedure and perform a manual installation. Please see the file \"INSTALL.txt\" for instructions."] = "Alternativ kannst du diesen Schritt aber auch überspringen und die Installation manuell durchführen. Eine Anleitung dazu (Englisch) findest du in der Datei INSTALL.txt.";
-$a->strings[".htconfig.php is writable"] = "Schreibrechte auf .htconfig.php";
-$a->strings["Url rewrite in .htaccess is not working. Check your server configuration."] = "Umschreiben der URLs in der .htaccess funktioniert nicht. Überprüfe die Konfiguration des Servers.";
-$a->strings["Url rewrite is working"] = "URL rewrite funktioniert";
-$a->strings["The database configuration file \".htconfig.php\" could not be written. Please use the enclosed text to create a configuration file in your web server root."] = "Die Konfigurationsdatei \".htconfig.php\" konnte nicht angelegt werden. Bitte verwende den angefügten Text, um die Datei im Stammverzeichnis deiner Friendica-Installation zu erzeugen.";
-$a->strings["Errors encountered creating database tables."] = "Fehler aufgetreten während der Erzeugung der Datenbanktabellen.";
-$a->strings["<h1>What next</h1>"] = "<h1>Wie geht es weiter?</h1>";
-$a->strings["IMPORTANT: You will need to [manually] setup a scheduled task for the poller."] = "WICHTIG: Du musst [manuell] einen Cronjob (o.ä.) für den Poller einrichten.";
-$a->strings["l F d, Y \\@ g:i A"] = "l F d, Y \\@ g:i A";
-$a->strings["Time Conversion"] = "Zeitumrechnung";
-$a->strings["Friendika provides this service for sharing events with other networks and friends in unknown timezones."] = "Friendica bietet diese Funktion an, um das Teilen von Events mit den Kontakten zu vereinfachen, deren Zeitzone nicht ermittelt werden kann.";
-$a->strings["UTC time: %s"] = "UTC Zeit: %s";
-$a->strings["Current timezone: %s"] = "Aktuelle Zeitzone: %s";
-$a->strings["Converted localtime: %s"] = "Umgerechnete lokale Zeit: %s";
-$a->strings["Please select your timezone:"] = "Bitte wähle deine Zeitzone.";
-$a->strings["Profile Match"] = "Profilübereinstimmungen";
-$a->strings["No keywords to match. Please add keywords to your default profile."] = "Keine Schlüsselwörter zum Abgleichen gefunden. Bitte füge einige Schlüsselwörter zu deinem Standardprofil hinzu.";
-$a->strings["is interested in:"] = "ist interessiert an:";
-$a->strings["Connect"] = "Verbinden";
-$a->strings["No matches"] = "Keine Ãœbereinstimmungen";
-$a->strings["Remote privacy information not available."] = "Entfernte Privatsphäreneinstellungen nicht verfügbar.";
-$a->strings["Visible to:"] = "Sichtbar für:";
-$a->strings["Welcome to %s"] = "Willkommen zu %s";
-$a->strings["Invalid request identifier."] = "Invalid request identifier.";
-$a->strings["Discard"] = "Verwerfen";
-$a->strings["Ignore"] = "Ignorieren";
-$a->strings["System"] = "System";
-$a->strings["Network"] = "Netzwerk";
+$a->strings["Example: bob@example.com, mary@example.com"] = "Beispiel: bob@example.com, mary@example.com";
+$a->strings["Set expiration date"] = "Verfallsdatum";
+$a->strings["Encrypt text"] = "Text verschlüsseln";
+$a->strings["OK"] = "OK";
+$a->strings["Cancel"] = "Abbrechen";
+$a->strings["Commented Order"] = "Neueste Kommentare";
+$a->strings["Sort by Comment Date"] = "Nach Kommentardatum sortiert";
+$a->strings["Posted Order"] = "Neueste Beiträge";
+$a->strings["Sort by Post Date"] = "Nach Beitragsdatum sortiert";
$a->strings["Personal"] = "Persönlich";
-$a->strings["Home"] = "Pinnwand";
-$a->strings["Introductions"] = "Kontaktanfragen";
-$a->strings["Messages"] = "Nachrichten";
-$a->strings["Show Ignored Requests"] = "Zeige ignorierte Anfragen";
-$a->strings["Hide Ignored Requests"] = "Verberge ignorierte Anfragen";
-$a->strings["Notification type: "] = "Benachrichtigungstyp: ";
-$a->strings["Friend Suggestion"] = "Kontaktvorschlag";
-$a->strings["suggested by %s"] = "vorgeschlagen von %s";
-$a->strings["Hide this contact from others"] = "Verberge diesen Kontakt vor anderen";
-$a->strings["Post a new friend activity"] = "Neue-Kontakt Nachricht senden";
-$a->strings["if applicable"] = "falls anwendbar";
-$a->strings["Approve"] = "Genehmigen";
-$a->strings["Claims to be known to you: "] = "Behauptet dich zu kennen: ";
-$a->strings["yes"] = "ja";
-$a->strings["no"] = "nein";
-$a->strings["Approve as: "] = "Genehmigen als: ";
-$a->strings["Friend"] = "Freund";
-$a->strings["Sharer"] = "Teilenden";
-$a->strings["Fan/Admirer"] = "Fan/Verehrer";
-$a->strings["Friend/Connect Request"] = "Kontakt-/Freundschaftsanfrage";
-$a->strings["New Follower"] = "Neuer Bewunderer";
-$a->strings["No introductions."] = "Keine Kontaktanfragen.";
-$a->strings["Notifications"] = "Benachrichtigungen";
-$a->strings["%s liked %s's post"] = "%s mag %ss Beitrag";
-$a->strings["%s disliked %s's post"] = "%s mag %ss Beitrag nicht";
-$a->strings["%s is now friends with %s"] = "%s ist jetzt mit %s befreundet";
-$a->strings["%s created a new post"] = "%s hat einen neuen Beitrag erstellt";
-$a->strings["%s commented on %s's post"] = "%s hat %ss Beitrag kommentiert";
-$a->strings["No more network notifications."] = "Keine weiteren Netzwerk-Benachrichtigungen.";
-$a->strings["Network Notifications"] = "Netzwerk Benachrichtigungen";
-$a->strings["No more system notifications."] = "Keine weiteren Systembenachrichtigungen.";
-$a->strings["System Notifications"] = "Systembenachrichtigungen";
-$a->strings["No more personal notifications."] = "Keine weiteren persönlichen Benachrichtigungen";
-$a->strings["Personal Notifications"] = "Persönliche Benachrichtigungen";
-$a->strings["No more home notifications."] = "Keine weiteren Pinnwand-Benachrichtigungen";
-$a->strings["Home Notifications"] = "Pinnwand Benachrichtigungen";
-$a->strings["Could not access contact record."] = "Konnte nicht auf die Kontaktdaten zugreifen.";
-$a->strings["Could not locate selected profile."] = "Konnte das ausgewählte Profil nicht finden.";
-$a->strings["Contact updated."] = "Kontakt aktualisiert.";
-$a->strings["Contact has been blocked"] = "Kontakt wurde blockiert";
-$a->strings["Contact has been unblocked"] = "Kontakt wurde wieder freigegeben";
-$a->strings["Contact has been ignored"] = "Kontakt wurde ignoriert";
-$a->strings["Contact has been unignored"] = "Kontakt wird nicht mehr ignoriert";
-$a->strings["Contact has been archived"] = "Kontakt wurde archiviert";
-$a->strings["Contact has been unarchived"] = "Kontakt wurde aus dem Archiv geholt";
-$a->strings["Contact has been removed."] = "Kontakt wurde entfernt.";
-$a->strings["You are mutual friends with %s"] = "Du hast mit %s eine beidseitige Freundschaft";
-$a->strings["You are sharing with %s"] = "Du teilst mit %s";
-$a->strings["%s is sharing with you"] = "%s teilt mit Dir";
-$a->strings["Private communications are not available for this contact."] = "Private Kommunikation ist für diesen Kontakt nicht verfügbar.";
-$a->strings["Never"] = "Niemals";
-$a->strings["(Update was successful)"] = "(Aktualisierung war erfolgreich)";
-$a->strings["(Update was not successful)"] = "(Aktualisierung war nicht erfolgreich)";
-$a->strings["Suggest friends"] = "Kontakte vorschlagen";
-$a->strings["Network type: %s"] = "Netzwerk Typ: %s";
-$a->strings["%d contact in common"] = array(
- 0 => "%d gemeinsamer Kontakt",
- 1 => "%d gemeinsame Kontakte",
+$a->strings["Posts that mention or involve you"] = "Beiträge, in denen es um dich geht";
+$a->strings["New"] = "Neu";
+$a->strings["Activity Stream - by date"] = "Activity Stream - nach Datum sortiert";
+$a->strings["Starred"] = "Markiert";
+$a->strings["Favourite Posts"] = "Beiträge mit Sternchen";
+$a->strings["Spam"] = "Spam";
+$a->strings["Posts flagged as SPAM"] = "Nachrichten die als SPAM markiert wurden";
+$a->strings["Channel"] = "Kanal";
+$a->strings["Status Messages and Posts"] = "Statusnachrichten und Beiträge";
+$a->strings["About"] = "Ãœber";
+$a->strings["Profile Details"] = "Profil-Details";
+$a->strings["Photo Albums"] = "Fotoalben";
+$a->strings["Files"] = "Dateien";
+$a->strings["Files and Storage"] = "Dateien und Speicher";
+$a->strings["Events and Calendar"] = "Veranstaltungen und Kalender";
+$a->strings["Webpages"] = "Webseiten";
+$a->strings["Manage Webpages"] = "Webseiten verwalten";
+$a->strings["created a new post"] = "Neuer Beitrag wurde erzeugt";
+$a->strings["commented on %s's post"] = "hat %s's Beitrag kommentiert";
+$a->strings["Permission denied."] = "Zugang verweigert";
+$a->strings["Image exceeds website size limit of %lu bytes"] = "Bild überschreitet das Limit der Webseite von %lu bytes";
+$a->strings["Image file is empty."] = "Bilddatei ist leer.";
+$a->strings["Unable to process image"] = "Kann Bild nicht verarbeiten";
+$a->strings["Photo storage failed."] = "Foto speichern schlug fehl";
+$a->strings["Upload New Photos"] = "Lade neue Fotos hoch";
+$a->strings["Male"] = "Männlich";
+$a->strings["Female"] = "Weiblich";
+$a->strings["Currently Male"] = "Momentan männlich";
+$a->strings["Currently Female"] = "Momentan weiblich";
+$a->strings["Mostly Male"] = "Größtenteils männlich";
+$a->strings["Mostly Female"] = "Größtenteils weiblich";
+$a->strings["Transgender"] = "Transsexuell";
+$a->strings["Intersex"] = "Zwischengeschlechtlich";
+$a->strings["Transsexual"] = "Transsexuell";
+$a->strings["Hermaphrodite"] = "Zwitter";
+$a->strings["Neuter"] = "Geschlechtslos";
+$a->strings["Non-specific"] = "unklar";
+$a->strings["Other"] = "Anders";
+$a->strings["Undecided"] = "Unentschieden";
+$a->strings["Males"] = "Männer";
+$a->strings["Females"] = "Frauen";
+$a->strings["Gay"] = "Schwul";
+$a->strings["Lesbian"] = "Lesbisch";
+$a->strings["No Preference"] = "Keine Bevorzugung";
+$a->strings["Bisexual"] = "Bisexuell";
+$a->strings["Autosexual"] = "Autosexuell";
+$a->strings["Abstinent"] = "Enthaltsam";
+$a->strings["Virgin"] = "Jungfräulich";
+$a->strings["Deviant"] = "Abweichend";
+$a->strings["Fetish"] = "Fetisch";
+$a->strings["Oodles"] = "Unmengen";
+$a->strings["Nonsexual"] = "Sexlos";
+$a->strings["Single"] = "Single";
+$a->strings["Lonely"] = "Einsam";
+$a->strings["Available"] = "Verfügbar";
+$a->strings["Unavailable"] = "Nicht verfügbar";
+$a->strings["Has crush"] = "Verguckt";
+$a->strings["Infatuated"] = "Verknallt";
+$a->strings["Dating"] = "Lerne gerade jemanden kennen";
+$a->strings["Unfaithful"] = "Treulos";
+$a->strings["Sex Addict"] = "Sexabhängig";
+$a->strings["Friends/Benefits"] = "Freunde/Begünstigte";
+$a->strings["Casual"] = "Lose";
+$a->strings["Engaged"] = "Verlobt";
+$a->strings["Married"] = "Verheiratet";
+$a->strings["Imaginarily married"] = "Gewissermaßen verheiratet";
+$a->strings["Partners"] = "Partner";
+$a->strings["Cohabiting"] = "Lebensgemeinschaft";
+$a->strings["Common law"] = "Informelle Ehe";
+$a->strings["Happy"] = "Glücklich";
+$a->strings["Not looking"] = "Nicht Ausschau haltend";
+$a->strings["Swinger"] = "Swinger";
+$a->strings["Betrayed"] = "Betrogen";
+$a->strings["Separated"] = "Getrennt";
+$a->strings["Unstable"] = "Labil";
+$a->strings["Divorced"] = "Geschieden";
+$a->strings["Imaginarily divorced"] = "Gewissermaßen geschieden";
+$a->strings["Widowed"] = "Verwitwet";
+$a->strings["Uncertain"] = "Ungewiss";
+$a->strings["It's complicated"] = "Es ist kompliziert";
+$a->strings["Don't care"] = "Interessiert mich nicht";
+$a->strings["Ask me"] = "Frag mich mal";
+$a->strings["Item was not found."] = "Beitrag wurde nicht gefunden.";
+$a->strings["No source file."] = "Keine Quelldatei.";
+$a->strings["Cannot locate file to replace"] = "Kann Datei zum Ersetzen nicht finden";
+$a->strings["Cannot locate file to revise/update"] = "Kann Datei zum Prüfen/Aktualisieren nicht finden";
+$a->strings["File exceeds size limit of %d"] = "Datei überschreitet das Größen-Limit von %d";
+$a->strings["You have reached your limit of %1$.0f Mbytes attachment storage."] = "Die Größe deiner Datei-Anhänge haben das Maximum von %1$.0f MByte erreicht.";
+$a->strings["File upload failed. Possible system limit or action terminated."] = "Datei-Upload fehlgeschlagen. Mögliche Systembegrenzung oder abgebrochener Prozess.";
+$a->strings["Stored file could not be verified. Upload failed."] = "Gespeichert Datei konnte nicht verifiziert werden. Upload abgebrochen.";
+$a->strings["Path not available."] = "Pfad nicht verfügbar.";
+$a->strings["Empty pathname"] = "leere Pfadangabe";
+$a->strings["duplicate filename or path"] = "doppelter Dateiname oder Pfad";
+$a->strings["Path not found."] = "Pfad nicht gefunden.";
+$a->strings["mkdir failed."] = "mkdir fehlgeschlagen.";
+$a->strings["database storage failed."] = "Speichern in der Datenbank fehlgeschlagen.";
+$a->strings["Tags"] = "Tags";
+$a->strings["Keywords"] = "Schlüsselbegriffe";
+$a->strings["have"] = "habe";
+$a->strings["has"] = "hat";
+$a->strings["want"] = "will";
+$a->strings["wants"] = "will";
+$a->strings["like"] = "Gefällt-mir";
+$a->strings["likes"] = "Gefällt-mir";
+$a->strings["dislike"] = "Gefällt-mir-nicht";
+$a->strings["dislikes"] = "Gefällt-mir-nicht";
+$a->strings["Not a valid email address"] = "Ungültige E-Mail-Adresse";
+$a->strings["Your email domain is not among those allowed on this site"] = "Deine E-Mail-Adresse ist nicht unter denen, die auf dieser Seite erlaubt sind";
+$a->strings["Your email address is already registered at this site."] = "Deine E-Mail-Adresse ist auf dieser Seite bereits registriert.";
+$a->strings["An invitation is required."] = "Eine Einladung wird benötigt";
+$a->strings["Invitation could not be verified."] = "Die Einladung konnte nicht bestätigt werden";
+$a->strings["Please enter the required information."] = "Bitte gib die benötigten Informationen ein.";
+$a->strings["Failed to store account information."] = "Speichern der Account-Informationen fehlgeschlagen";
+$a->strings["Registration request at %s"] = "Registrierungsanfrage auf %s";
+$a->strings["Administrator"] = "Administrator";
+$a->strings["your registration password"] = "dein Registrierungspasswort";
+$a->strings["Registration details for %s"] = "Registrierungsdetails für %s";
+$a->strings["Account approved."] = "Account bestätigt.";
+$a->strings["Registration revoked for %s"] = "Registrierung für %s widerrufen";
+$a->strings["Sort Options"] = "Sortieroptionen";
+$a->strings["Alphabetic"] = "alphabetisch";
+$a->strings["Reverse Alphabetic"] = "Entgegengesetzt alphabetisch";
+$a->strings["Newest to Oldest"] = "Neueste zuerst";
+$a->strings["Enable Safe Search"] = "Sichere Suche einschalten";
+$a->strings["Disable Safe Search"] = "Sichere Suche ausschalten";
+$a->strings["Safe Mode"] = "Sicherer Modus";
+$a->strings["Red Matrix Notification"] = "Red Matrix Benachrichtigung";
+$a->strings["redmatrix"] = "redmatrix";
+$a->strings["Thank You,"] = "Danke.";
+$a->strings["%s Administrator"] = "%s Administrator";
+$a->strings["%s <!item_type!>"] = "%s <!item_type!>";
+$a->strings["[Red:Notify] New mail received at %s"] = "[Red Notify] Neue Mail auf %s empfangen";
+$a->strings["%1\$s, %2\$s sent you a new private message at %3\$s."] = "%1\$s, %2\$s hat dir eine private Nachricht auf %3\$s gesendet.";
+$a->strings["%1\$s sent you %2\$s."] = "%1\$s hat dir %2\$s geschickt.";
+$a->strings["a private message"] = "eine private Nachricht";
+$a->strings["Please visit %s to view and/or reply to your private messages."] = "Bitte besuche %s, um die private Nachricht anzusehen und/oder darauf zu antworten.";
+$a->strings["%1\$s, %2\$s commented on [zrl=%3\$s]a %4\$s[/zrl]"] = "%1\$s, %2\$s hat [zrl=%3\$s]a %4\$s[/zrl] kommentiert";
+$a->strings["%1\$s, %2\$s commented on [zrl=%3\$s]%4\$s's %5\$s[/zrl]"] = "%1\$s, %2\$s hat [zrl=%3\$s]%4\$ss %5\$s[/zrl] kommentiert";
+$a->strings["%1\$s, %2\$s commented on [zrl=%3\$s]your %4\$s[/zrl]"] = "%1\$s, %2\$s hat [zrl=%3\$s]deinen %4\$s[/zrl] kommentiert";
+$a->strings["[Red:Notify] Comment to conversation #%1\$d by %2\$s"] = "[Red:Notify] Kommentar in Unterhaltung #%1\$d von %2\$s";
+$a->strings["%1\$s, %2\$s commented on an item/conversation you have been following."] = "%1\$s, %2\$s hat ein Thema kommentiert, dem du folgst.";
+$a->strings["Please visit %s to view and/or reply to the conversation."] = "Bitte besuche %s, um die Konversation anzusehen und/oder zu kommentieren.";
+$a->strings["[Red:Notify] %s posted to your profile wall"] = "[Red:Hinweis] %s schrieb auf Deine Pinnwand";
+$a->strings["%1\$s, %2\$s posted to your profile wall at %3\$s"] = "%1\$s, %2\$s hat auf deine Pinnwand auf %3\$s geschrieben";
+$a->strings["%1\$s, %2\$s posted to [zrl=%3\$s]your wall[/zrl]"] = "%1\$s, %2\$s hat auf [zrl=%3\$s]deine Pinnwand[/zrl] geschrieben";
+$a->strings["[Red:Notify] %s tagged you"] = "[Red Notify] %s hat dich getaggt";
+$a->strings["%1\$s, %2\$s tagged you at %3\$s"] = "%1\$s, %2\$s hat dich auf %3\$s getaggt";
+$a->strings["%1\$s, %2\$s [zrl=%3\$s]tagged you[/zrl]."] = "%1\$s, %2\$s [zrl=%3\$s]hat dich erwähnt[/zrl].";
+$a->strings["[Red:Notify] %1\$s poked you"] = "[Red Notify] %1\$s hat dich angestupst";
+$a->strings["%1\$s, %2\$s poked you at %3\$s"] = "%1\$s, %2\$s hat dich auf %3\$s angestubst";
+$a->strings["%1\$s, %2\$s [zrl=%2\$s]poked you[/zrl]."] = "%1\$s, %2\$s [zrl=%2\$s]hat dich angestupst[/zrl].";
+$a->strings["[Red:Notify] %s tagged your post"] = "[Red:Hinweis] %s hat Dich getagged";
+$a->strings["%1\$s, %2\$s tagged your post at %3\$s"] = "%1\$s, %2\$s hat deinen Beitrag auf %3\$s getaggt";
+$a->strings["%1\$s, %2\$s tagged [zrl=%3\$s]your post[/zrl]"] = "%1\$s, %2\$s hat [zrl=%3\$s]deinen Beitrag[/zrl] getaggt";
+$a->strings["[Red:Notify] Introduction received"] = "[Red:Notify] Vorstellung erhalten";
+$a->strings["%1\$s, you've received an introduction from '%2\$s' at %3\$s"] = "%1\$s, du hast eine Vorstellung von „%2\$s“ auf %3\$s erhalten";
+$a->strings["%1\$s, you've received [zrl=%2\$s]an introduction[/zrl] from %3\$s."] = "%1\$s, du hast [zrl=%2\$s]eine Vorstellung[/zrl] von %3\$s erhalten.";
+$a->strings["You may visit their profile at %s"] = "Du kannst Dir das Profil unter %s ansehen";
+$a->strings["Please visit %s to approve or reject the introduction."] = "Bitte besuche %s um sie anzunehmen oder abzulehnen.";
+$a->strings["[Red:Notify] Friend suggestion received"] = "[Red:Hinweis] Freundschaftsvorschlag erhalten";
+$a->strings["%1\$s, you've received a friend suggestion from '%2\$s' at %3\$s"] = "%1\$s, du hast einen Freundschaftsvorschlag von „%2\$s“ auf %3\$s erhalten";
+$a->strings["%1\$s, you've received [zrl=%2\$s]a friend suggestion[/zrl] for %3\$s from %4\$s."] = "%1\$s, du hast [zrl=%2\$s]einen Freundschaftvorschlag[/zrl] für %3\$s von %4\$s erhalten.";
+$a->strings["Name:"] = "Name:";
+$a->strings["Photo:"] = "Foto:";
+$a->strings["Please visit %s to approve or reject the suggestion."] = "Bitte besuche %s um den Vorschlag zu akzeptieren oder abzulehnen.";
+$a->strings["Logged out."] = "Ausgeloggt.";
+$a->strings["Failed authentication"] = "Authentifizierung fehlgeschlagen";
+$a->strings["Login failed."] = "Login fehlgeschlagen.";
+$a->strings["%d invitation available"] = array(
+ 0 => "%d Einladung verfügbar",
+ 1 => "%d Einladungen verfügbar",
+);
+$a->strings["Find Channels"] = "Finde Kanäle";
+$a->strings["Enter name or interest"] = "Name oder Interessen eingeben";
+$a->strings["Connect/Follow"] = "Verbinden/Folgen";
+$a->strings["Examples: Robert Morgenstein, Fishing"] = "Beispiele: Robert Morgenstein, Angeln";
+$a->strings["Find"] = "Finde";
+$a->strings["Channel Suggestions"] = "Kanal-Vorschläge";
+$a->strings["Random Profile"] = "Zufallsprofil";
+$a->strings["Invite Friends"] = "Lade Freunde ein";
+$a->strings["%d connection in common"] = array(
+ 0 => "%d gemeinsame Verbindung",
+ 1 => "%d gemeinsame Verbindungen",
);
-$a->strings["View all contacts"] = "Alle Kontakte anzeigen";
-$a->strings["Unblock"] = "Entsperren";
-$a->strings["Block"] = "Sperren";
-$a->strings["Toggle Blocked status"] = "Geblockt-Status ein-/ausschalten";
-$a->strings["Unignore"] = "Ignorieren aufheben";
-$a->strings["Toggle Ignored status"] = "Ignoriert-Status ein-/ausschalten";
-$a->strings["Unarchive"] = "Unarchivieren";
+$a->strings["New Page"] = "Neue Seite";
+$a->strings["Edit"] = "Bearbeiten";
+$a->strings["Click here to upgrade."] = "Klicke hier, um das Upgrade durchzuführen.";
+$a->strings["This action exceeds the limits set by your subscription plan."] = "Diese Aktion überschreitet die Grenzen Ihres Abonnements.";
+$a->strings["This action is not available under your subscription plan."] = "Diese Aktion ist in Ihrem Abonnement nicht verfügbar.";
+$a->strings["Channel is blocked on this site."] = "Der Kanal ist auf dieser Seite blockiert ";
+$a->strings["Channel location missing."] = "Adresse des Kanals fehlt.";
+$a->strings["Channel discovery failed. Website may be down or misconfigured."] = "Auffinden des Kanals schlug fehl. Die Webseite könnte falsch konfiguriert oder abgeschaltet sein.";
+$a->strings["Response from remote channel was not understood."] = "Antwort des entfernten Kanals war unverständlich.";
+$a->strings["Response from remote channel was incomplete."] = "Antwort des entfernten Kanals war unvollständig.";
+$a->strings["local account not found."] = "Lokales Konto nicht gefunden.";
+$a->strings["Cannot connect to yourself."] = "Du kannst dich nicht mit dir selbst verbinden.";
+$a->strings["Can view my \"public\" stream and posts"] = "Kann meinen öffentlichen Stream und Beiträge sehen";
+$a->strings["Can view my \"public\" channel profile"] = "Kann meinen öffentliches Kanal-Profil sehen";
+$a->strings["Can view my \"public\" photo albums"] = "Kann meine öffentlichen Fotoalben sehen";
+$a->strings["Can view my \"public\" address book"] = "Kann mein öffentliches Adressbuch sehen";
+$a->strings["Can view my \"public\" file storage"] = "Kann meinen öffentlichen Dateiordner sehen";
+$a->strings["Can view my \"public\" pages"] = "Kann meine öffentlichen Seiten sehen";
+$a->strings["Can send me their channel stream and posts"] = "Können mir den Stream und die Beiträge aus ihrem Kanal schicken";
+$a->strings["Can post on my channel page (\"wall\")"] = "Kann auf meiner Kanal-Seite (\"wall\") Beiträge veröffentlichen";
+$a->strings["Can comment on my posts"] = "Kann meine Beiträge kommentieren";
+$a->strings["Can send me private mail messages"] = "Kann mir private Nachrichten schicken";
+$a->strings["Can post photos to my photo albums"] = "Kann Fotos in meinen Fotoalben veröffentlichen";
+$a->strings["Can forward to all my channel contacts via post @mentions"] = "Kann an alle meine Kontakte via @-Erwähnung Nachrichten weiterleiten";
+$a->strings["Advanced - useful for creating group forum channels"] = "Fortgeschritten - sinnvoll, um Gruppen-Kanäle/-Foren zu erstellen";
+$a->strings["Can chat with me (when available)"] = "Kann mit mir chatten (wenn verfügbar)";
+$a->strings["Requires compatible chat plugin"] = "Benötigt ein kompatibles Chat-Plugin";
+$a->strings["Can write to my \"public\" file storage"] = "Kann in meinen öffentlichen Dateiordner schreiben";
+$a->strings["Can edit my \"public\" pages"] = "Kann meine öffentlichen Seiten bearbeiten";
+$a->strings["Can source my \"public\" posts in derived channels"] = "Kann meine \"öffentlichen\" Beiträge als Quellen von Kanälen verwenden";
+$a->strings["Somewhat advanced - very useful in open communities"] = "Etwas Fortgeschritten - sehr nützlich in offenen Gemeinschaften.";
+$a->strings["Can administer my channel resources"] = "Kann meine Kanäle administrieren";
+$a->strings["Extremely advanced. Leave this alone unless you know what you are doing"] = "Sehr fortgeschritten. Bearbeite dies nur, wenn du genau weißt, was du machst";
+$a->strings["Default"] = "Standard";
+$a->strings["Unable to obtain identity information from database"] = "Kann keine Identitäts-Informationen aus Datenbank beziehen";
+$a->strings["Empty name"] = "Namensfeld leer";
+$a->strings["Name too long"] = "Name ist zu lang";
+$a->strings["No account identifier"] = "Keine Account-Kennung";
+$a->strings["Nickname is required."] = "Spitzname ist erforderlich.";
+$a->strings["Nickname has unsupported characters or is already being used on this site."] = "Der Spitzname enthält nicht-unterstütze Zeichen oder wird bereits auf dieser Seite genutzt.";
+$a->strings["Unable to retrieve created identity"] = "Kann die erstellte Identität nicht empfangen";
+$a->strings["Default Profile"] = "Standard-Profil";
+$a->strings["Requested channel is not available."] = "Angeforderte Kanal nicht verfügbar.";
+$a->strings[" Sorry, you don't have the permission to view this profile. "] = "Entschuldigung, aber du besitzt nicht die nötigen Rechte um dieses Profil ansehen zu dürfen.";
+$a->strings["Requested profile is not available."] = "Erwünschte Profil ist nicht verfügbar.";
+$a->strings["Change profile photo"] = "Ändere das Profilfoto";
+$a->strings["Profiles"] = "Profile";
+$a->strings["Manage/edit profiles"] = "Verwalte/Bearbeite Profile";
+$a->strings["Create New Profile"] = "Neues Profil erstellen";
+$a->strings["Edit Profile"] = "Profile bearbeiten";
+$a->strings["Profile Image"] = "Profilfoto:";
+$a->strings["visible to everybody"] = "sichtbar für jeden";
+$a->strings["Edit visibility"] = "Sichtbarkeit bearbeiten";
+$a->strings["Gender:"] = "Geschlecht:";
+$a->strings["Status:"] = "Status:";
+$a->strings["Homepage:"] = "Homepage:";
+$a->strings["g A l F d"] = "l, d. F G \\\\U\\\\h\\\\r";
+$a->strings["F d"] = "d. F";
+$a->strings["[today]"] = "[Heute]";
+$a->strings["Birthday Reminders"] = "Geburtstags Erinnerungen";
+$a->strings["Birthdays this week:"] = "Geburtstage in dieser Woche:";
+$a->strings["[No description]"] = "[Keine Beschreibung]";
+$a->strings["Event Reminders"] = "Veranstaltungs- Erinnerungen";
+$a->strings["Events this week:"] = "Veranstaltungen in dieser Woche:";
+$a->strings["Profile"] = "Profil";
+$a->strings["Full Name:"] = "Voller Name:";
+$a->strings["j F, Y"] = "j F, Y";
+$a->strings["j F"] = "j F";
+$a->strings["Birthday:"] = "Geburtstag:";
+$a->strings["Age:"] = "Alter:";
+$a->strings["for %1\$d %2\$s"] = "für %1\$d %2\$s";
+$a->strings["Sexual Preference:"] = "Sexuelle Orientierung:";
+$a->strings["Hometown:"] = "Heimatstadt:";
+$a->strings["Tags:"] = "Schlagworte:";
+$a->strings["Political Views:"] = "Politische Ansichten:";
+$a->strings["Religion:"] = "Religion:";
+$a->strings["About:"] = "Ãœber:";
+$a->strings["Hobbies/Interests:"] = "Hobbys/Interessen:";
+$a->strings["Likes:"] = "Gefällt-mir:";
+$a->strings["Dislikes:"] = "Gefällt-mir-nicht:";
+$a->strings["Contact information and Social Networks:"] = "Kontaktinformation und soziale Netzwerke:";
+$a->strings["Musical interests:"] = "Musikalische Interessen:";
+$a->strings["Books, literature:"] = "Bücher, Literatur:";
+$a->strings["Television:"] = "Fernsehen:";
+$a->strings["Film/dance/culture/entertainment:"] = "Film/Tanz/Kultur/Unterhaltung:";
+$a->strings["Love/Romance:"] = "Liebe/Romantik:";
+$a->strings["Work/employment:"] = "Arbeit/Anstellung:";
+$a->strings["School/education:"] = "Schule/Ausbildung:";
+$a->strings["Permission denied"] = "Keine Berechtigung";
+$a->strings["Item not found."] = "Element nicht gefunden.";
+$a->strings["Collection not found."] = "Sammlung nicht gefunden";
+$a->strings["Collection is empty."] = "Sammlung ist leer.";
+$a->strings["Collection: %s"] = "Sammlung: %s";
+$a->strings["Connection: %s"] = "Verbindung: %s";
+$a->strings["Connection not found."] = "Die Verbindung wurde nicht gefunden.";
+$a->strings["Private Message"] = "Private Nachricht";
+$a->strings["save to folder"] = "In Ordner speichern";
+$a->strings["add star"] = "markieren";
+$a->strings["remove star"] = "Markierung entfernen";
+$a->strings["toggle star status"] = "Stern-Status umschalten";
+$a->strings["starred"] = "markiert";
+$a->strings["add tag"] = "Schlagwort hinzufügen";
+$a->strings["I like this (toggle)"] = "Ich mag das (Umschalter)";
+$a->strings["I don't like this (toggle)"] = "Ich mag das nicht (Umschalter)";
+$a->strings["Share this"] = "Teile dies";
+$a->strings["share"] = "Teilen";
+$a->strings["View %s's profile - %s"] = "Schaue dir %s's Profil an - %s";
+$a->strings["to"] = "zu";
+$a->strings["via"] = "via";
+$a->strings["Wall-to-Wall"] = "Wall-to-Wall";
+$a->strings["via Wall-To-Wall:"] = "via Wall-To-Wall:";
+$a->strings["Expires: %s"] = "Verfällt: %s";
+$a->strings["%d comment"] = array(
+ 0 => "%d Kommentar",
+ 1 => "%d Kommentare",
+);
+$a->strings["This is you"] = "Das bist du";
+$a->strings["Submit"] = "Bestätigen";
+$a->strings["Bold"] = "Fett";
+$a->strings["Italic"] = "Kursiv";
+$a->strings["Underline"] = "Unterstrichen";
+$a->strings["Quote"] = "Zitat";
+$a->strings["Code"] = "Code";
+$a->strings["Image"] = "Bild";
+$a->strings["Link"] = "Link";
+$a->strings["Video"] = "Video";
+$a->strings["Welcome "] = "Willkommen";
+$a->strings["Please upload a profile photo."] = "Bitte lade ein Profilfoto hoch.";
+$a->strings["Welcome back "] = "Willkommen zurück";
+$a->strings["The form security token was not correct. This probably happened because the form has been opened for too long (>3 hours) before submitting it."] = "Das Security-Token des Formulars war nicht korrekt. Das ist wahrscheinlich passiert, weil das Formular zu lange (>3 Stunden) offen war, bevor es abgeschickt wurde.";
+$a->strings["Invalid data packet"] = "Ungültiges Datenpaket";
+$a->strings["Unable to verify channel signature"] = "Konnte die Signatur des Kanals nicht verifizieren";
+$a->strings["Unable to verify site signature for %s"] = "Kann die Signatur der Seite von %s nicht verifizieren";
+$a->strings["No channel."] = "Kein Channel.";
+$a->strings["Common connections"] = "Gemeinsame Verbindungen";
+$a->strings["No connections in common."] = "Keine gemeinsamen Verbindungen.";
+$a->strings["Event title and start time are required."] = "Veranstaltungs- Titel und Startzeit sind erforderlich.";
+$a->strings["l, F j"] = "l, F j";
+$a->strings["Edit event"] = "Veranstaltung bearbeiten";
+$a->strings["Create New Event"] = "Neue Veranstaltung erstellen";
+$a->strings["Previous"] = "Voriges";
+$a->strings["Next"] = "Nächste";
+$a->strings["hour:minute"] = "Stunde:Minute";
+$a->strings["Event details"] = "Veranstaltungs-Details";
+$a->strings["Format is %s %s. Starting date and Title are required."] = "Format ist %s %s. Startzeit und Titel sind erforderlich.";
+$a->strings["Event Starts:"] = "Veranstaltung startet:";
+$a->strings["Required"] = "Benötigt";
+$a->strings["Finish date/time is not known or not relevant"] = "Ende Datum/Zeit sind unbekannt oder unwichtig";
+$a->strings["Event Finishes:"] = "Veranstaltung endet:";
+$a->strings["Adjust for viewer timezone"] = "An die Zeitzone des Betrachters anpassen";
+$a->strings["Description:"] = "Beschreibung:";
+$a->strings["Title:"] = "Titel:";
+$a->strings["Share this event"] = "Die Veranstaltung teilen";
+$a->strings["Thing updated"] = "Ding aktualisiert";
+$a->strings["Object store: failed"] = "Speichern des Objekts fehlgeschlagen";
+$a->strings["Thing added"] = "Ding hinzugefügt";
+$a->strings["OBJ: %1\$s %2\$s %3\$s"] = "OBJ: %1\$s %2\$s %3\$s";
+$a->strings["Show Thing"] = "Ding anzeigen";
+$a->strings["item not found."] = "Eintrag nicht gefunden";
+$a->strings["Edit Thing"] = "Ding bearbeiten";
+$a->strings["Select a profile"] = "Wähle ein Profil";
+$a->strings["Select a category of stuff. e.g. I ______ something"] = "Wähle eine Kategorie für das Zeugs, z.B. Ich ______ etwas";
+$a->strings["Name of thing e.g. something"] = "Name des Dings, z.B. Etwas";
+$a->strings["URL of thing (optional)"] = "URL des Dings (optional)";
+$a->strings["URL for photo of thing (optional)"] = "URL eines Fotos von dem Ding (optional)";
+$a->strings["Add Thing to your Profile"] = "Das Ding deinem Profil hinzufügen";
+$a->strings["Total invitation limit exceeded."] = "Limit der maximalen Einladungen überschritten.";
+$a->strings["%s : Not a valid email address."] = "%s : Keine gültige Email Adresse.";
+$a->strings["Please join us on Red"] = "Bitte schließe Dich uns an und werde Teil der Red Matrix";
+$a->strings["Invitation limit exceeded. Please contact your site administrator."] = "Einladungslimit überschritten. Bitte kontaktiere den Administrator deiner Seite.";
+$a->strings["%s : Message delivery failed."] = "%s : Nachricht konnte nicht zugestellt werden.";
+$a->strings["%d message sent."] = array(
+ 0 => "%d Nachricht gesendet.",
+ 1 => "%d Nachrichten gesendet.",
+);
+$a->strings["You have no more invitations available"] = "Du hast keine weiteren verfügbare Einladungen";
+$a->strings["Send invitations"] = "Einladungen senden";
+$a->strings["Enter email addresses, one per line:"] = "Email-Adressen eintragen, eine pro Zeile:";
+$a->strings["Your message:"] = "Deine Nachricht:";
+$a->strings["You are cordially invited to join me and some other close friends on the Red Matrix - a revolutionary new decentralised communication and information tool."] = "Du bist herzlich eingeladen, mir und einigen anderen guten Freunden in die Red-Matrix zu folgen – einem revolutionär neuen, dezentralisierten Kommunikations- und Informationsnetzwerk.";
+$a->strings["You will need to supply this invitation code: \$invite_code"] = "Du musst dann den folgenden Einladungs-Code angeben: \$invite_code";
+$a->strings["Please visit my channel at"] = "Bitte besuche meinen Kanal auf";
+$a->strings["Once you have registered (on ANY Red Matrix site - they are all inter-connected), please connect with my Red Matrix channel address:"] = "Wenn du dich registriert hast (egal auf welcher Seite in der Red Matrix, sie sind alle miteinander verbunden) verbinde dich bitte mit meinem Kanal in der Matrix. Adresse:";
+$a->strings["Click the [Register] link on the following page to join."] = "Klicke den [Registrieren]-Link auf der nächsten Seite, um dich anzumelden.";
+$a->strings["For more information about the Red Matrix Project and why it has the potential to change the internet as we know it, please visit http://getzot.com"] = "Für weitere Informationen über das Red Matrix Projekt und warum es das Potential hat das Internet wie wir es kennen grundlegend zu verändern schau dir bitte http://getzot.com an";
+$a->strings["Could not access contact record."] = "Konnte auf den Kontakteintrag nicht zugreifen.";
+$a->strings["Could not locate selected profile."] = "Konnte das gewählte Profil nicht finden.";
+$a->strings["Connection updated."] = "Verbindung aktualisiert.";
+$a->strings["Failed to update connection record."] = "Konnte den Verbindungseintrag nicht aktualisieren.";
+$a->strings["Could not access address book record."] = "Konnte nicht auf den Eintrag im Adressbuch zugreifen.";
+$a->strings["Refresh failed - channel is currently unavailable."] = "Aktualisierung fehlgeschlagen – der Kanal ist im Moment nicht erreichbar.";
+$a->strings["Channel has been unblocked"] = "Kanal nicht mehr blockiert";
+$a->strings["Channel has been blocked"] = "Kanal blockiert";
+$a->strings["Unable to set address book parameters."] = "Konnte die Adressbuch Parameter nicht setzen.";
+$a->strings["Channel has been unignored"] = "Kanal wird nicht mehr ignoriert";
+$a->strings["Channel has been ignored"] = "Kanal wird ignoriert";
+$a->strings["Channel has been unarchived"] = "Kanal wurde aus dem Archiv zurück geholt";
+$a->strings["Channel has been archived"] = "Kanal wurde archiviert";
+$a->strings["Channel has been unhidden"] = "Kanal wird nicht mehr versteckt";
+$a->strings["Channel has been hidden"] = "Kanal wurde versteckt";
+$a->strings["Channel has been approved"] = "Kanal wurde zugelassen";
+$a->strings["Channel has been unapproved"] = "Zulassung des Kanals entfernt";
+$a->strings["Contact has been removed."] = "Kontakt wurde entfernt.";
+$a->strings["View %s's profile"] = "%s's Profil ansehen";
+$a->strings["Refresh Permissions"] = "Zugriffsrechte auffrischen";
+$a->strings["Fetch updated permissions"] = "Aktualisierte Zugriffsrechte abfragen";
+$a->strings["Recent Activity"] = "Kürzliche Aktivitäten";
+$a->strings["View recent posts and comments"] = "Betrachte die neuesten Beiträge und Kommentare";
+$a->strings["Unblock"] = "Freigeben";
+$a->strings["Block"] = "Blockieren";
+$a->strings["Block or Unblock this connection"] = "Verbindung blockieren oder frei geben";
+$a->strings["Unignore"] = "Nicht ignorieren";
+$a->strings["Ignore"] = "Ignorieren";
+$a->strings["Ignore or Unignore this connection"] = "Verbindung ignorieren oder wieder beachten";
+$a->strings["Unarchive"] = "Aus Archiv zurückholen";
$a->strings["Archive"] = "Archivieren";
-$a->strings["Toggle Archive status"] = "Archiviert-Status ein-/ausschalten";
-$a->strings["Repair"] = "Reparieren";
-$a->strings["Advanced Contact Settings"] = "Fortgeschrittene Kontakteinstellungen";
-$a->strings["Communications lost with this contact!"] = "Verbindungen mit diesem Kontakt verloren!";
-$a->strings["Contact Editor"] = "Kontakt Editor";
-$a->strings["Profile Visibility"] = "Profil-Sichtbarkeit";
-$a->strings["Please choose the profile you would like to display to %s when viewing your profile securely."] = "Bitte wähle eines deiner Profile das angezeigt werden soll, wenn %s dein Profil aufruft.";
-$a->strings["Contact Information / Notes"] = "Kontakt Informationen / Notizen";
-$a->strings["Edit contact notes"] = "Notizen zum Kontakt bearbiten";
-$a->strings["Visit %s's profile [%s]"] = "Besuche %ss Profil [%s]";
-$a->strings["Block/Unblock contact"] = "Kontakt blockieren/freischalten";
-$a->strings["Ignore contact"] = "Ignoriere den Kontakt";
+$a->strings["Archive or Unarchive this connection"] = "Archiviere diese Verbindung oder hole sie aus dem Archiv zurück";
+$a->strings["Unhide"] = "aufdecken";
+$a->strings["Hide"] = "Verbergen";
+$a->strings["Hide or Unhide this connection"] = "Diese Verbindung verstecken oder aufdecken";
+$a->strings["Delete this connection"] = "Verbindung löschen";
+$a->strings["Unknown"] = "Unbekannt";
+$a->strings["Approve this connection"] = "Verbindung genehmigen";
+$a->strings["Accept connection to allow communication"] = "Aktzeptiere die Verbindung um Kommunikation zu ermöglichen";
+$a->strings["Automatic Permissions Settings"] = "Automatische Berechtigungs-Einstellungen";
+$a->strings["Connections: settings for %s"] = "Verbindungseinstellungen für %s";
+$a->strings["When receiving a channel introduction, any permissions provided here will be applied to the new connection automatically and the introduction approved. Leave this page if you do not wish to use this feature."] = "Wenn eine Kanal-Vorstellung empfangen wird, werden die hier getroffenen Einstellungen automatisch angewandt und der Anfrage wird stattgegeben. Verlasse diese Seite, wenn du dieses Feature nicht verwanden möchtest.";
+$a->strings["Slide to adjust your degree of friendship"] = "Schieben um den Grad der Freundschaft zu wählen";
+$a->strings["inherited"] = "Geerbt";
+$a->strings["Connection has no individual permissions!"] = "Diese Verbindung hat keine individuellen Zugriffseinstellungen.";
+$a->strings["This may be appropriate based on your <a href=\"settings\">privacy settings</a>, though you may wish to review the \"Advanced Permissions\"."] = "Abhängig von deinen <a href=\"settings\">Privatsphären Einstellungen</a> könnte dies angebracht sein, eventuell solltest du aber die \"Erweiterte Zugriffsrechte\" überprüfen.";
+$a->strings["Profile Visibility"] = "Sichtbarkeit des Profils";
+$a->strings["Please choose the profile you would like to display to %s when viewing your profile securely."] = "Bitte wähle ein Profil, das wir %s zeigen sollen, wenn deine Profilseite über eine verifizierte Verbindung aufgerufen wird.";
+$a->strings["Contact Information / Notes"] = "Kontaktinformationen / Notizen";
+$a->strings["Edit contact notes"] = "Kontaktnotizen editieren";
+$a->strings["Their Settings"] = "Deren Einstellungen";
+$a->strings["My Settings"] = "Meine Einstellungen";
+$a->strings["Forum Members"] = "Forum Mitglieder";
+$a->strings["Soapbox"] = "Marktschreier";
+$a->strings["Full Sharing"] = "Volles Teilen";
+$a->strings["Cautious Sharing"] = "Vorsichtiges Teilen";
+$a->strings["Follow Only"] = "Nur Folgen";
+$a->strings["Individual Permissions"] = "Individuelle Zugriffseinstellungen";
+$a->strings["Some permissions may be inherited from your channel <a href=\"settings\">privacy settings</a>, which have higher priority. Changing those inherited settings on this page will have no effect."] = "Einige Genehmigungen können von deinen <a href=\"settings\">Sicherheits- und Datenschutz-Einstellungen</a> geerbt sein (siehe Kennzeichnung), da diese eine höhere Priorität haben. Wenn du solche Genehmigungen hier änderst, hat das keine Auswirkungen.";
+$a->strings["Advanced Permissions"] = "Erweiterte Zugriffsrechte";
+$a->strings["Quick Links"] = "Quick Links";
+$a->strings["Visit %s's profile - %s"] = "%s's Profil besuchen - %s";
+$a->strings["Block/Unblock contact"] = "Geblockt Status ein- / ausschalten";
+$a->strings["Ignore contact"] = "Kontakt ignorieren";
$a->strings["Repair URL settings"] = "URL Einstellungen reparieren";
$a->strings["View conversations"] = "Unterhaltungen anzeigen";
-$a->strings["Delete contact"] = "Lösche den Kontakt";
-$a->strings["Last update:"] = "letzte Aktualisierung:";
+$a->strings["Delete contact"] = "Kontakt löschen";
+$a->strings["Last update:"] = "Letzte Aktualisierung:";
$a->strings["Update public posts"] = "Öffentliche Beiträge aktualisieren";
$a->strings["Update now"] = "Jetzt aktualisieren";
-$a->strings["Currently blocked"] = "Derzeit geblockt";
+$a->strings["Currently blocked"] = "Derzeit blockiert";
$a->strings["Currently ignored"] = "Derzeit ignoriert";
-$a->strings["Currently archived"] = "Momentan archiviert";
-$a->strings["Replies/likes to your public posts <strong>may</strong> still be visible"] = "Antworten/Likes auf deine öffentlichen Beiträge <strong>könnten</strong> weiterhin sichtbar sein";
-$a->strings["Suggestions"] = "Kontaktvorschläge";
-$a->strings["Suggest potential friends"] = "Freunde vorschlagen";
-$a->strings["All Contacts"] = "Alle Kontakte";
-$a->strings["Show all contacts"] = "Alle Kontakte anzeigen";
-$a->strings["Unblocked"] = "Ungeblockt";
-$a->strings["Only show unblocked contacts"] = "Nur nicht-blockierte Kontakte anzeigen";
-$a->strings["Blocked"] = "Geblockt";
-$a->strings["Only show blocked contacts"] = "Nur blockierte Kontakte anzeigen";
-$a->strings["Ignored"] = "Ignoriert";
-$a->strings["Only show ignored contacts"] = "Nur ignorierte Kontakte anzeigen";
-$a->strings["Archived"] = "Archiviert";
-$a->strings["Only show archived contacts"] = "Nur archivierte Kontakte anzeigen";
-$a->strings["Hidden"] = "Verborgen";
-$a->strings["Only show hidden contacts"] = "Nur verborgene Kontakte anzeigen";
-$a->strings["Mutual Friendship"] = "Beidseitige Freundschaft";
-$a->strings["is a fan of yours"] = "ist ein Fan von dir";
-$a->strings["you are a fan of"] = "du bist Fan von";
-$a->strings["Edit contact"] = "Kontakt bearbeiten";
-$a->strings["Contacts"] = "Kontakte";
-$a->strings["Search your contacts"] = "Suche in deinen Kontakten";
-$a->strings["Finding: "] = "Funde: ";
-$a->strings["Find"] = "Finde";
-$a->strings["No valid account found."] = "Kein gültiges Konto gefunden.";
-$a->strings["Password reset request issued. Check your email."] = "Zurücksetzen des Passworts eingeleitet. Bitte überprüfe deine E-Mail.";
-$a->strings["Password reset requested at %s"] = "Anfrage zum Zurücksetzen des Passworts auf %s erhalten";
-$a->strings["Administrator"] = "Administrator";
-$a->strings["Request could not be verified. (You may have previously submitted it.) Password reset failed."] = "Anfrage konnte nicht verifiziert werden. (Eventuell hast du bereits eine ähnliche Anfrage gestellt.) Zurücksetzen des Passworts gescheitert.";
-$a->strings["Password Reset"] = "Passwort zurücksetzen";
-$a->strings["Your password has been reset as requested."] = "Dein Passwort wurde wie gewünscht zurückgesetzt.";
-$a->strings["Your new password is"] = "Dein neues Passwort lautet";
-$a->strings["Save or copy your new password - and then"] = "Speichere oder kopiere dein neues Passwort - und dann";
-$a->strings["click here to login"] = "hier klicken, um dich anzumelden";
-$a->strings["Your password may be changed from the <em>Settings</em> page after successful login."] = "Du kannst das Passwort in den <em>Einstellungen</em> ändern, sobald du dich erfolgreich angemeldet hast.";
-$a->strings["Forgot your Password?"] = "Hast du dein Passwort vergessen?";
-$a->strings["Enter your email address and submit to have your password reset. Then check your email for further instructions."] = "Gib deine Email-Adresse an und fordere ein neues Passwort an. Es werden dir dann weitere Informationen per Mail zugesendet.";
-$a->strings["Nickname or Email: "] = "Spitzname oder Email:";
-$a->strings["Reset"] = "Zurücksetzen";
-$a->strings["Account settings"] = "Kontoeinstellungen";
-$a->strings["Display settings"] = "Anzeige-Einstellungen";
-$a->strings["Connector settings"] = "Connector-Einstellungen";
-$a->strings["Plugin settings"] = "Plugin-Einstellungen";
-$a->strings["Connected apps"] = "Verbundene Programme";
-$a->strings["Export personal data"] = "Persönliche Daten exportieren";
-$a->strings["Remove account"] = "Konto löschen";
-$a->strings["Settings"] = "Einstellungen";
-$a->strings["Missing some important data!"] = "Wichtige Daten fehlen!";
-$a->strings["Update"] = "Aktualisierungen";
-$a->strings["Failed to connect with email account using the settings provided."] = "Verbindung zum E-Mail-Konto mit den angegebenen Einstellungen nicht möglich.";
-$a->strings["Email settings updated."] = "EMail Einstellungen bearbeitet.";
-$a->strings["Passwords do not match. Password unchanged."] = "Die Passwörter stimmen nicht überein. Das Passwort bleibt unverändert.";
-$a->strings["Empty passwords are not allowed. Password unchanged."] = "Leere Passwörter sind nicht erlaubt. Passwort bleibt unverändert.";
-$a->strings["Password changed."] = "Passwort ändern.";
-$a->strings["Password update failed. Please try again."] = "Aktualisierung des Passworts gescheitert, bitte versuche es noch einmal.";
-$a->strings[" Please use a shorter name."] = " Bitte verwende einen kürzeren Namen.";
-$a->strings[" Name too short."] = " Name ist zu kurz.";
-$a->strings[" Not valid email."] = " Keine gültige E-Mail.";
-$a->strings[" Cannot change to that email."] = "Ändern der E-Mail nicht möglich. ";
-$a->strings["Private forum has no privacy permissions. Using default privacy group."] = "Für das private Forum sind keine Zugriffsrechte eingestellt. Die voreingestellte Gruppe für neue Kontakte wird benutzt.";
-$a->strings["Private forum has no privacy permissions and no default privacy group."] = "Für das private Forum sind keine Zugriffsrechte eingestellt, und es gibt keine voreingestellte Gruppe für neue Kontakte.";
-$a->strings["Settings updated."] = "Einstellungen aktualisiert.";
-$a->strings["Add application"] = "Programm hinzufügen";
-$a->strings["Consumer Key"] = "Consumer Key";
-$a->strings["Consumer Secret"] = "Consumer Secret";
-$a->strings["Redirect"] = "Umleiten";
-$a->strings["Icon url"] = "Icon URL";
-$a->strings["You can't edit this application."] = "Du kannst dieses Programm nicht bearbeiten.";
-$a->strings["Connected Apps"] = "Verbundene Programme";
-$a->strings["Client key starts with"] = "Anwenderschlüssel beginnt mit";
-$a->strings["No name"] = "Kein Name";
-$a->strings["Remove authorization"] = "Autorisierung entziehen";
-$a->strings["No Plugin settings configured"] = "Keine Plugin-Einstellungen konfiguriert";
-$a->strings["Plugin Settings"] = "Plugin-Einstellungen";
-$a->strings["Built-in support for %s connectivity is %s"] = "Eingebaute Unterstützung für Verbindungen zu %s ist %s";
-$a->strings["enabled"] = "eingeschaltet";
-$a->strings["disabled"] = "ausgeschaltet";
-$a->strings["StatusNet"] = "StatusNet";
-$a->strings["Connector Settings"] = "Verbindungs-Einstellungen";
-$a->strings["Email/Mailbox Setup"] = "E-Mail/Postfach-Einstellungen";
-$a->strings["If you wish to communicate with email contacts using this service (optional), please specify how to connect to your mailbox."] = "Wenn du mit E-Mail-Kontakten über diesen Service kommunizieren möchtest (optional), gib bitte die Einstellungen für dein Postfach an.";
-$a->strings["Last successful email check:"] = "Letzter erfolgreicher Email Check";
-$a->strings["Email access is disabled on this site."] = "Zugriff auf E-Mails für diese Seite deaktiviert.";
-$a->strings["IMAP server name:"] = "IMAP-Server-Name:";
-$a->strings["IMAP port:"] = "IMAP-Port:";
-$a->strings["Security:"] = "Sicherheit:";
-$a->strings["None"] = "Keine";
-$a->strings["Email login name:"] = "E-Mail-Login-Name:";
-$a->strings["Email password:"] = "E-Mail-Passwort:";
-$a->strings["Reply-to address:"] = "Reply-to Adresse:";
-$a->strings["Send public posts to all email contacts:"] = "Sende öffentliche Beiträge an alle E-Mail-Kontakte:";
-$a->strings["Action after import:"] = "Aktion nach Import:";
-$a->strings["Mark as seen"] = "Als gelesen markieren";
-$a->strings["Move to folder"] = "In einen Ordner verschieben";
-$a->strings["Move to folder:"] = "In diesen Ordner verschieben:";
-$a->strings["Display Settings"] = "Anzeige-Einstellungen";
-$a->strings["Display Theme:"] = "Theme:";
-$a->strings["Update browser every xx seconds"] = "Browser alle xx Sekunden aktualisieren";
-$a->strings["Minimum of 10 seconds, no maximum"] = "Minimal 10 Sekunden, kein Maximum";
-$a->strings["Number of items to display on the network page:"] = "Zahl der Beiträge, die pro Netzwerkseite angezeigt werden sollen: ";
-$a->strings["Maximum of 100 items"] = "Maximal 100 Beiträge";
-$a->strings["Don't show emoticons"] = "Keine Smilies anzeigen";
-$a->strings["Normal Account Page"] = "Normales Konto";
-$a->strings["This account is a normal personal profile"] = "Dieses Konto ist ein normales persönliches Profil";
-$a->strings["Soapbox Page"] = "Marktschreier-Konto";
-$a->strings["Automatically approve all connection/friend requests as read-only fans"] = "Kontaktanfragen werden automatisch als Nurlese-Fans akzeptiert";
-$a->strings["Community Forum/Celebrity Account"] = "Forum/Promi-Konto";
-$a->strings["Automatically approve all connection/friend requests as read-write fans"] = "Kontaktanfragen werden automatisch als Lese-und-Schreib-Fans akzeptiert";
-$a->strings["Automatic Friend Page"] = "Automatische Freunde Seite";
-$a->strings["Automatically approve all connection/friend requests as friends"] = "Kontaktanfragen werden automatisch als Freund akzeptiert";
-$a->strings["Private Forum [Experimental]"] = "Privates Forum [Versuchsstadium]";
-$a->strings["Private forum - approved members only"] = "Privates Forum, nur für Mitglieder";
-$a->strings["OpenID:"] = "OpenID:";
-$a->strings["(Optional) Allow this OpenID to login to this account."] = "(Optional) Erlaube die Anmeldung für dieses Konto mit dieser OpenID.";
-$a->strings["Publish your default profile in your local site directory?"] = "Darf dein Standardprofil im Verzeichnis dieses Servers veröffentlicht werden?";
-$a->strings["Publish your default profile in the global social directory?"] = "Darf dein Standardprofil im weltweiten Verzeichnis veröffentlicht werden?";
-$a->strings["Hide your contact/friend list from viewers of your default profile?"] = "Liste der Kontakte vor Betrachtern des Standardprofils verbergen?";
-$a->strings["Hide your profile details from unknown viewers?"] = "Profil-Details vor unbekannten Betrachtern verbergen?";
-$a->strings["Allow friends to post to your profile page?"] = "Dürfen deine Kontakte auf deine Pinnwand schreiben?";
-$a->strings["Allow friends to tag your posts?"] = "Dürfen deine Kontakte deine Beiträge mit Schlagwörtern versehen?";
-$a->strings["Allow us to suggest you as a potential friend to new members?"] = "Dürfen wir dich neuen Mitgliedern als potentiellen Kontakt vorschlagen?";
-$a->strings["Permit unknown people to send you private mail?"] = "Dürfen dir Unbekannte private Nachrichten schicken?";
-$a->strings["Profile is <strong>not published</strong>."] = "Profil ist <strong>nicht veröffentlicht</strong>.";
-$a->strings["or"] = "oder";
-$a->strings["Your Identity Address is"] = "Die Adresse deines Profils lautet:";
-$a->strings["Automatically expire posts after this many days:"] = "Beiträge verfallen automatisch nach dieser Anzahl von Tagen:";
-$a->strings["If empty, posts will not expire. Expired posts will be deleted"] = "Wenn leer verfallen Beiträge nie automatisch. Verfallene Beiträge werden gelöscht.";
-$a->strings["Advanced expiration settings"] = "Erweiterte Verfallseinstellungen";
-$a->strings["Advanced Expiration"] = "Erweitertes Verfallen";
-$a->strings["Expire posts:"] = "Beiträge verfallen lassen:";
-$a->strings["Expire personal notes:"] = "Persönliche Notizen verfallen lassen:";
-$a->strings["Expire starred posts:"] = "Markierte Beiträge verfallen lassen:";
-$a->strings["Expire photos:"] = "Fotos verfallen lassen:";
-$a->strings["Only expire posts by others:"] = "Nur Beiträge anderer verfallen:";
-$a->strings["Account Settings"] = "Kontoeinstellungen";
-$a->strings["Password Settings"] = "Passwort-Einstellungen";
-$a->strings["New Password:"] = "Neues Passwort:";
-$a->strings["Confirm:"] = "Bestätigen:";
-$a->strings["Leave password fields blank unless changing"] = "Lass die Passwort-Felder leer, außer du willst das Passwort ändern";
-$a->strings["Basic Settings"] = "Grundeinstellungen";
-$a->strings["Full Name:"] = "Kompletter Name:";
-$a->strings["Email Address:"] = "E-Mail-Adresse:";
-$a->strings["Your Timezone:"] = "Deine Zeitzone:";
-$a->strings["Default Post Location:"] = "Standardstandort:";
-$a->strings["Use Browser Location:"] = "Standort des Browsers verwenden:";
-$a->strings["Security and Privacy Settings"] = "Sicherheits- und Privatsphäre-Einstellungen";
-$a->strings["Maximum Friend Requests/Day:"] = "Maximale Anzahl von Freundschaftsanfragen/Tag:";
-$a->strings["(to prevent spam abuse)"] = "(um SPAM zu vermeiden)";
-$a->strings["Default Post Permissions"] = "Standard-Zugriffsrechte für Beiträge";
-$a->strings["(click to open/close)"] = "(klicke zum öffnen/schließen)";
-$a->strings["Maximum private messages per day from unknown people:"] = "Maximale Anzahl privater Nachrichten von Unbekannten pro Tag:";
-$a->strings["Notification Settings"] = "Benachrichtigungseinstellungen";
-$a->strings["By default post a status message when:"] = "Standardmäßig eine Statusnachricht posten, wenn:";
-$a->strings["accepting a friend request"] = "– du eine Kontaktanfrage akzeptierst";
-$a->strings["joining a forum/community"] = "– du einem Forum/einer Gemeinschaftsseite beitrittst";
-$a->strings["making an <em>interesting</em> profile change"] = "– du eine <em>interessante</em> Änderung an deinem Profil durchführst";
-$a->strings["Send a notification email when:"] = "Benachrichtigungs-E-Mail senden wenn:";
-$a->strings["You receive an introduction"] = "– du eine Kontaktanfrage erhältst";
-$a->strings["Your introductions are confirmed"] = "– eine deiner Kontaktanfragen akzeptiert wurde";
-$a->strings["Someone writes on your profile wall"] = "– jemand etwas auf deine Pinnwand schreibt";
-$a->strings["Someone writes a followup comment"] = "– jemand auch einen Kommentar verfasst";
-$a->strings["You receive a private message"] = "– du eine private Nachricht erhältst";
-$a->strings["You receive a friend suggestion"] = "– du eine Empfehlung erhältst";
-$a->strings["You are tagged in a post"] = "– du in einem Beitrag erwähnt wirst";
-$a->strings["Advanced Account/Page Type Settings"] = "Erweiterte Konto-/Seitentyp-Einstellungen";
-$a->strings["Change the behaviour of this account for special situations"] = "Verhalten dieses Kontos in bestimmten Situationen:";
-$a->strings["Manage Identities and/or Pages"] = "Verwalte Identitäten und/oder Seiten";
-$a->strings["Toggle between different identities or community/group pages which share your account details or which you have been granted \"manage\" permissions"] = "Zwischen verschiedenen Identitäten oder Foren wechseln, die deine Zugangsdaten (E-Mail und Passwort) teilen oder zu denen du „Verwalten“-Befugnisse bekommen hast.";
-$a->strings["Select an identity to manage: "] = "Wähle eine Identität zum Verwalten: ";
-$a->strings["Search Results For:"] = "Suchergebnisse für:";
-$a->strings["Remove term"] = "Begriff entfernen";
-$a->strings["Saved Searches"] = "Gespeicherte Suchen";
-$a->strings["add"] = "hinzufügen";
-$a->strings["Commented Order"] = "Neueste Kommentare";
-$a->strings["Sort by Comment Date"] = "Nach Kommentardatum sortieren";
-$a->strings["Posted Order"] = "Neueste Beiträge";
-$a->strings["Sort by Post Date"] = "Nach Beitragsdatum sortieren";
-$a->strings["Posts that mention or involve you"] = "Beiträge, in denen es um Dich geht";
-$a->strings["New"] = "Neue";
-$a->strings["Activity Stream - by date"] = "Aktivitäten-Stream - nach Datum";
-$a->strings["Starred"] = "Markierte";
-$a->strings["Favourite Posts"] = "Favorisierte Beiträge";
-$a->strings["Shared Links"] = "Geteilte Links";
-$a->strings["Interesting Links"] = "Interessante Links";
-$a->strings["Warning: This group contains %s member from an insecure network."] = array(
- 0 => "Warnung: Diese Gruppe beinhaltet %s Person aus einem unsicheren Netzwerk.",
- 1 => "Warnung: Diese Gruppe beinhaltet %s Personen aus unsicheren Netzwerken.",
-);
-$a->strings["Private messages to this group are at risk of public disclosure."] = "Private Nachrichten an diese Gruppe könnten an die Öffentlichkeit geraten.";
-$a->strings["No such group"] = "Es gibt keine solche Gruppe";
-$a->strings["Group is empty"] = "Gruppe ist leer";
-$a->strings["Group: "] = "Gruppe: ";
-$a->strings["Contact: "] = "Kontakt: ";
-$a->strings["Private messages to this person are at risk of public disclosure."] = "Private Nachrichten an diese Person könnten an die Öffentlichkeit gelangen.";
-$a->strings["Invalid contact."] = "Ungültiger Kontakt.";
-$a->strings["Personal Notes"] = "Persönliche Notizen";
-$a->strings["Save"] = "Speichern";
-$a->strings["Number of daily wall messages for %s exceeded. Message failed."] = "Maximale Anzahl der täglichen Pinnwand Nachrichten für %s ist überschritten. Zustellung fehlgeschlagen.";
-$a->strings["No recipient selected."] = "Kein Empfänger gewählt.";
-$a->strings["Unable to check your home location."] = "Konnte deinen Heimatort nicht bestimmen.";
-$a->strings["Message could not be sent."] = "Nachricht konnte nicht gesendet werden.";
-$a->strings["Message collection failure."] = "Konnte Nachrichten nicht abrufen.";
-$a->strings["Message sent."] = "Nachricht gesendet.";
-$a->strings["No recipient."] = "Kein Empfänger.";
-$a->strings["Please enter a link URL:"] = "Bitte gib die URL des Links ein:";
-$a->strings["Send Private Message"] = "Private Nachricht senden";
-$a->strings["If you wish for %s to respond, please check that the privacy settings on your site allow private mail from unknown senders."] = "Wenn du möchtest, dass %s dir antworten kann, überprüfe deine Privatsphären-Einstellungen und erlaube private Nachrichten von unbekannten Absendern.";
-$a->strings["To:"] = "An:";
-$a->strings["Subject:"] = "Betreff:";
-$a->strings["Your message:"] = "Deine Nachricht:";
-$a->strings["Welcome to Friendica"] = "Willkommen bei Friendica";
-$a->strings["New Member Checklist"] = "Checkliste für neue Mitglieder";
-$a->strings["We would like to offer some tips and links to help make your experience enjoyable. Click any item to visit the relevant page. A link to this page will be visible from your home page for two weeks after your initial registration and then will quietly disappear."] = "Wir möchten Dir einige Tipps und Links anbieten, die Dir helfen könnten, den Einstieg angenehmer zu machen. Klicke auf ein Element, um die entsprechende Seite zu besuchen. Ein Link zu dieser Seite hier bleibt für Dich an Deiner Pinnwand für zwei Wochen nach dem Registrierungsdatum sichtbar und wird dann verschwinden.";
-$a->strings["On your <em>Quick Start</em> page - find a brief introduction to your profile and network tabs, connect to Facebook, make some new connections, and find some groups to join."] = "Auf der <em>Quick Start</em> Seite findest du eine kurze Einleitung in die einzelnen Funktionen deines Profils und die Netzwerk-Reiter, wo du interessante Foren findest, wie du alte Freunde von Facebook wieder findest und neue Kontakte knüpfst.";
-$a->strings["On your <em>Settings</em> page - change your initial password. Also make a note of your Identity Address. This looks just like an email address - and will be useful in making friends on the free social web."] = "Ändere bitte unter <em>Einstellungen</em> Dein Passwort. Außerdem merke Dir Deine Indentifikations-Adresse. Diese sieht aus wie eine E-Mail-Adresse und wird benötigt, um Freundschaften mit anderen im Friendica Netzwerk zu schliessen.";
-$a->strings["Review the other settings, particularly the privacy settings. An unpublished directory listing is like having an unlisted phone number. In general, you should probably publish your listing - unless all of your friends and potential friends know exactly how to find you."] = "Überprüfe die restlichen Einstellungen, insbesondere die Einstellungen zur Privatsphäre. Wenn du dein Profil nicht veröffentlichst, ist das als wenn Du Deine Telefonnummer nicht ins Telefonbuch einträgst. Im Allgemeinen solltest du es veröffentlichen - außer all deine Freunde und potentiellen Freunde wissen genau, wie sie dich finden können.";
-$a->strings["Upload a profile photo if you have not done so already. Studies have shown that people with real photos of themselves are ten times more likely to make friends than people who do not."] = "Lade ein Profilbild hoch falls du es noch nicht getan hast. Studien haben gezeigt, dass es zehnmal wahrscheinlicher ist neue Freunde zu finden, wenn du ein Bild von dir selbst verwendest, als wenn du dies nicht tust.";
-$a->strings["Authorise the Facebook Connector if you currently have a Facebook account and we will (optionally) import all your Facebook friends and conversations."] = "Richte die Verbindung zu Facebook ein, wenn du im Augenblick ein Facebook-Konto hast, und (optional) deine Facebook-Freunde und -Unterhaltungen importieren willst.";
-$a->strings["<em>If</em> this is your own personal server, installing the Facebook addon may ease your transition to the free social web."] = "<em>Wenn</em> dies dein privater Server ist, könnte die Installation des Facebook Connectors deinen Umzug ins freie soziale Netz angenehmer gestalten.";
-$a->strings["Enter your email access information on your Connector Settings page if you wish to import and interact with friends or mailing lists from your email INBOX"] = "Gib deine E-Mail-Zugangsinformationen auf der Connector-Einstellungsseite ein, falls du E-Mails aus deinem Posteingang importieren und mit Freunden und Mailinglisten interagieren willlst.";
-$a->strings["Edit your <strong>default</strong> profile to your liking. Review the settings for hiding your list of friends and hiding the profile from unknown visitors."] = "Editiere dein <strong>Standard</strong> Profil nach deinen Vorlieben. Überprüfe die Einstellungen zum Verbergen deiner Freundesliste vor unbekannten Betrachtern des Profils.";
-$a->strings["Set some public keywords for your default profile which describe your interests. We may be able to find other people with similar interests and suggest friendships."] = "Trage ein paar öffentliche Stichwörter in dein Standardprofil ein, die deine Interessen beschreiben. Eventuell sind wir in der Lage Leute zu finden, die deine Interessen teilen und können dir dann Kontakte vorschlagen.";
-$a->strings["Your Contacts page is your gateway to managing friendships and connecting with friends on other networks. Typically you enter their address or site URL in the <em>Add New Contact</em> dialog."] = "Die Kontakte-Seite ist die Einstiegsseite, von der aus du Kontakte verwalten und dich mit Freunden in anderen Netzwerken verbinden kannst. Normalerweise gibst du dazu einfach ihre Adresse oder die URL der Seite im Kasten <em>Neuen Kontakt hinzufügen</em> ein.";
-$a->strings["The Directory page lets you find other people in this network or other federated sites. Look for a <em>Connect</em> or <em>Follow</em> link on their profile page. Provide your own Identity Address if requested."] = "Über die Verzeichnisseite kannst du andere Personen auf diesem Server oder anderen verknüpften Seiten finden. Halte nach einem <em>Verbinden</em> oder <em>Folgen</em> Link auf deren Profilseiten Ausschau und gib deine eigene Profiladresse an, falls du danach gefragt wirst.";
-$a->strings["On the side panel of the Contacts page are several tools to find new friends. We can match people by interest, look up people by name or interest, and provide suggestions based on network relationships. On a brand new site, friend suggestions will usually begin to be populated within 24 hours."] = "Im seitlichen Bedienfeld der Kontakteseite gibt es diverse Werkzeuge, um neue Freunde zu finden. Wir können Menschen mit den gleichen Interessen finden, anhand von Namen oder Interessen suchen oder aber aufgrund vorhandener Kontakte neue Freunde vorschlagen.\nAuf einer brandneuen - soeben erstellten - Seite starten die Kontaktvorschläge innerhalb von 24 Stunden.";
-$a->strings["Once you have made some friends, organize them into private conversation groups from the sidebar of your Contacts page and then you can interact with each group privately on your Network page."] = "Sobald du einige Freunde gefunden hast, organisiere sie in Gruppen zur privaten Kommunikation im Seitenmenü der Kontakte-Seite. Du kannst dann mit jeder dieser Gruppen von der Netzwerkseite aus privat interagieren.";
-$a->strings["Our <strong>help</strong> pages may be consulted for detail on other program features and resources."] = "Unsere <strong>Hilfe</strong> Seiten können herangezogen werden, um weitere Einzelheiten zu andern Programm Features zu erhalten.";
-$a->strings["Item not available."] = "Beitrag nicht verfügbar.";
-$a->strings["Item was not found."] = "Beitrag konnte nicht gefunden werden.";
-$a->strings["Group created."] = "Gruppe erstellt.";
-$a->strings["Could not create group."] = "Konnte die Gruppe nicht erstellen.";
-$a->strings["Group not found."] = "Gruppe nicht gefunden.";
-$a->strings["Group name changed."] = "Gruppenname geändert.";
-$a->strings["Permission denied"] = "Zugriff verweigert";
-$a->strings["Create a group of contacts/friends."] = "Eine Gruppe von Kontakten/Freunden anlegen.";
-$a->strings["Group Name: "] = "Gruppenname:";
-$a->strings["Group removed."] = "Gruppe entfernt.";
-$a->strings["Unable to remove group."] = "Konnte die Gruppe nicht entfernen.";
-$a->strings["Group Editor"] = "Gruppeneditor";
-$a->strings["Members"] = "Mitglieder";
-$a->strings["Click on a contact to add or remove."] = "Klicke einen Kontakt an, um ihn hinzuzufügen oder zu entfernen";
-$a->strings["Invalid profile identifier."] = "Ungültiger Profil-Bezeichner";
-$a->strings["Profile Visibility Editor"] = "Editor für die Profil-Sichtbarkeit";
-$a->strings["Profile"] = "Profil";
-$a->strings["Visible To"] = "Sichtbar für";
-$a->strings["All Contacts (with secure profile access)"] = "Alle Kontakte (mit gesichertem Profilzugriff)";
-$a->strings["No contacts."] = "Keine Kontakte.";
-$a->strings["View Contacts"] = "Kontakte anzeigen";
-$a->strings["Registration details for %s"] = "Details der Registration von %s";
-$a->strings["Registration successful. Please check your email for further instructions."] = "Registrierung erfolgreich. Eine E-Mail mit weiteren Anweisungen wurde an dich gesendet.";
-$a->strings["Failed to send email message. Here is the message that failed."] = "Konnte die E-Mail nicht versenden. Hier ist die Nachricht, die nicht gesendet werden konnte.";
-$a->strings["Your registration can not be processed."] = "Deine Registrierung konnte nicht verarbeitet werden.";
-$a->strings["Registration request at %s"] = "Registrierungsanfrage auf %s";
-$a->strings["Your registration is pending approval by the site owner."] = "Deine Registrierung muss noch vom Betreiber der Seite freigegeben werden.";
-$a->strings["This site has exceeded the number of allowed daily account registrations. Please try again tomorrow."] = "Die maximale Anzahl täglicher Registrierungen auf dieser Seite wurde überschritten. Bitte versuche es morgen noch einmal.";
-$a->strings["You may (optionally) fill in this form via OpenID by supplying your OpenID and clicking 'Register'."] = "Du kannst dieses Formular auch (optional) mit deiner OpenID ausfüllen, indem du deine OpenID angibst und 'Registrieren' klickst.";
-$a->strings["If you are not familiar with OpenID, please leave that field blank and fill in the rest of the items."] = "Wenn du nicht mit OpenID vertraut bist, lass dieses Feld bitte leer und fülle die restlichen Felder aus.";
-$a->strings["Your OpenID (optional): "] = "Deine OpenID (optional): ";
-$a->strings["Include your profile in member directory?"] = "Soll dein Profil im Nutzerverzeichnis angezeigt werden?";
-$a->strings["Membership on this site is by invitation only."] = "Mitgliedschaft auf dieser Seite ist nur nach vorheriger Einladung möglich.";
-$a->strings["Your invitation ID: "] = "ID deiner Einladung: ";
-$a->strings["Registration"] = "Registrierung";
-$a->strings["Your Full Name (e.g. Joe Smith): "] = "Vollständiger Name (z.B. Max Mustermann): ";
-$a->strings["Your Email Address: "] = "Deine E-Mail-Adresse: ";
-$a->strings["Choose a profile nickname. This must begin with a text character. Your profile address on this site will then be '<strong>nickname@\$sitename</strong>'."] = "Wähle einen Spitznamen für dein Profil. Dieser muss mit einem Buchstaben beginnen. Die Adresse deines Profils auf dieser Seite wird '<strong>spitzname@\$sitename</strong>' sein.";
-$a->strings["Choose a nickname: "] = "Spitznamen wählen: ";
-$a->strings["Register"] = "Registrieren";
-$a->strings["People Search"] = "Personen Suche";
-$a->strings["status"] = "Status";
-$a->strings["%1\$s likes %2\$s's %3\$s"] = "%1\$s mag %2\$ss %3\$s";
-$a->strings["%1\$s doesn't like %2\$s's %3\$s"] = "%1\$s mag %2\$ss %3\$s nicht";
-$a->strings["Item not found."] = "Beitrag nicht gefunden.";
-$a->strings["Access denied."] = "Zugriff verweigert.";
-$a->strings["Photos"] = "Bilder";
-$a->strings["Files"] = "Dateien";
-$a->strings["Account approved."] = "Konto freigegeben.";
-$a->strings["Registration revoked for %s"] = "Registrierung für %s wurde zurückgezogen";
-$a->strings["Please login."] = "Bitte melde dich an.";
-$a->strings["Unable to locate original post."] = "Konnte den Originalbeitrag nicht finden.";
-$a->strings["Empty post discarded."] = "Leerer Beitrag wurde verworfen.";
-$a->strings["Wall Photos"] = "Pinnwand-Bilder";
-$a->strings["System error. Post not saved."] = "Systemfehler. Beitrag konnte nicht gespeichert werden.";
-$a->strings["This message was sent to you by %s, a member of the Friendica social network."] = "Diese Nachricht wurde dir von %s geschickt, einem Mitglied des Sozialen Netzwerks Friendica.";
-$a->strings["You may visit them online at %s"] = "Du kannst sie online unter %s besuchen";
-$a->strings["Please contact the sender by replying to this post if you do not wish to receive these messages."] = "Falls du diese Beiträge nicht erhalten möchtest, kontaktiere bitte den Autor, indem du auf diese Nachricht antwortest.";
-$a->strings["%s posted an update."] = "%s hat ein Update veröffentlicht.";
-$a->strings["Image uploaded but image cropping failed."] = "Bilder hochgeladen, aber das Zuschneiden ist fehlgeschlagen.";
-$a->strings["Image size reduction [%s] failed."] = "Verkleinern der Bildgröße von [%s] ist gescheitert.";
-$a->strings["Shift-reload the page or clear browser cache if the new photo does not display immediately."] = "Drücke Umschalt+Neu Laden oder leere den Browser-Cache, falls das neue Foto nicht gleich angezeigt wird.";
-$a->strings["Unable to process image"] = "Bild konnte nicht verarbeitet werden";
-$a->strings["Image exceeds size limit of %d"] = "Bildgröße überschreitet das Limit von %d";
-$a->strings["Upload File:"] = "Datei hochladen:";
-$a->strings["Upload Profile Photo"] = "Profilbild hochladen";
-$a->strings["Upload"] = "Hochladen";
-$a->strings["skip this step"] = "diesen Schritt überspringen";
-$a->strings["select a photo from your photo albums"] = "wähle ein Foto von deinen Fotoalben";
-$a->strings["Crop Image"] = "Bild zurechtschneiden";
-$a->strings["Please adjust the image cropping for optimum viewing."] = "Passe bitte den Bildausschnitt an, damit das Bild optimal dargestellt werden kann.";
-$a->strings["Done Editing"] = "Bearbeitung abgeschlossen";
-$a->strings["Image uploaded successfully."] = "Bild erfolgreich auf den Server geladen.";
-$a->strings["No profile"] = "Kein Profil";
-$a->strings["Remove My Account"] = "Konto löschen";
-$a->strings["This will completely remove your account. Once this has been done it is not recoverable."] = "Dein Konto wird endgültig gelöscht. Es gibt keine Möglichkeit, es wiederherzustellen.";
-$a->strings["Please enter your password for verification:"] = "Bitte gib dein Passwort zur Verifikation ein:";
-$a->strings["New Message"] = "Neue Nachricht";
-$a->strings["Unable to locate contact information."] = "Konnte die Kontaktinformationen nicht finden.";
-$a->strings["Message deleted."] = "Nachricht gelöscht.";
-$a->strings["Conversation removed."] = "Unterhaltung gelöscht.";
-$a->strings["No messages."] = "Keine Nachrichten.";
-$a->strings["Unknown sender - %s"] = "'Unbekannter Absender - %s";
-$a->strings["You and %s"] = "Du und %s";
-$a->strings["%s and You"] = "%s und Du";
-$a->strings["Delete conversation"] = "Unterhaltung löschen";
-$a->strings["D, d M Y - g:i A"] = "D, d. M Y - g:i A";
-$a->strings["%d message"] = array(
- 0 => "%d Nachricht",
- 1 => "%d Nachrichten",
-);
-$a->strings["Message not available."] = "Nachricht nicht verfügbar.";
-$a->strings["Delete message"] = "Nachricht löschen";
-$a->strings["No secure communications available. You <strong>may</strong> be able to respond from the sender's profile page."] = "Sichere Kommunikation ist nicht verfügbar. <strong>Eventuell</strong> kannst du auf der Profilseite des Absenders antworten.";
-$a->strings["Send Reply"] = "Antwort senden";
-$a->strings["Friends of %s"] = "Freunde von %s";
-$a->strings["No friends to display."] = "Keine Freunde zum Anzeigen.";
-$a->strings["Theme settings updated."] = "Themeneinstellungen aktualisiert.";
+$a->strings["Currently archived"] = "Derzeit archiviert";
+$a->strings["Currently pending"] = "Derzeit anstehend";
+$a->strings["Hide this contact from others"] = "Diese Verbindung vor den anderen verbergen.";
+$a->strings["Replies/likes to your public posts <strong>may</strong> still be visible"] = "Antworten/Likes auf deine öffentlichen Beiträge <strong>können</strong> immer noch sichtbar sein";
+$a->strings["View"] = "Ansicht";
+$a->strings["Authorize application connection"] = "Zugriff der Anwendung authorizieren";
+$a->strings["Return to your app and insert this Securty Code:"] = "Trage folgenden Sicherheitscode bei der Anwendung ein:";
+$a->strings["Please login to continue."] = "Zum Weitermachen, bitte einloggen.";
+$a->strings["Do you want to authorize this application to access your posts and contacts, and/or create new posts for you?"] = "Möchtest du der Anwendung erlauben deine Nachrichten und Kontakte abzurufen und/oder neue Nachrichten für dich zu erstellen?";
+$a->strings["Yes"] = "Ja";
+$a->strings["No"] = "Nein";
+$a->strings["No installed applications."] = "Keine installierten Applikationen";
+$a->strings["Applications"] = "Anwendungen";
+$a->strings["Invalid item."] = "Ungültiges Element.";
+$a->strings["Channel not found."] = "Kanal nicht gefunden.";
+$a->strings["Page not found."] = "Seite nicht gefunden.";
+$a->strings["Item not available."] = "Element nicht verfügbar.";
+$a->strings["Red Matrix Server - Setup"] = "Red Matrix Server - Installation";
+$a->strings["Could not connect to database."] = "Kann nicht mit der Datenbank verbinden.";
+$a->strings["Could not connect to specified site URL. Possible SSL certificate or DNS issue."] = "Konnte die angegebene Webseiten URL nicht erreichen. Möglicherweise ein Problem mit dem SSL Zertifikat oder dem DNS.";
+$a->strings["Could not create table."] = "Kann Tabelle nicht erstellen.";
+$a->strings["Your site database has been installed."] = "Die Datenbank deiner Seite wurde installiert.";
+$a->strings["You may need to import the file \"install/database.sql\" manually using phpmyadmin or mysql."] = "Eventuell musst du die Datei \"install/database.sql\" händisch mit phpmyadmin oder mysql importieren.";
+$a->strings["Please see the file \"install/INSTALL.txt\"."] = "Lies die Datei \"install/INSTALL.txt\".";
+$a->strings["System check"] = "Systemprüfung";
+$a->strings["Check again"] = "Bitte nochmal prüfen";
+$a->strings["Database connection"] = "Datenbank Verbindung";
+$a->strings["In order to install Red Matrix we need to know how to connect to your database."] = "Um die Red Matrix installieren zu können, müssen wir wissen wie wir deine Datenbank kontaktieren können.";
+$a->strings["Please contact your hosting provider or site administrator if you have questions about these settings."] = "Bitte kontaktiere deinen Hosting Provider oder den Administrator der Seite wenn du Fragen zu diesen Einstellungen haben solltest.";
+$a->strings["The database you specify below should already exist. If it does not, please create it before continuing."] = "Die Datenbank, die du weiter unten angibst, sollte bereits existieren. Sollte das noch nicht der Fall sein, erzeuge sie bitte bevor du fortfährst.";
+$a->strings["Database Server Name"] = "Datenbank-Servername";
+$a->strings["Default is localhost"] = "Standard ist localhost";
+$a->strings["Database Port"] = "Datenbank-Port";
+$a->strings["Communication port number - use 0 for default"] = "Port Nummer zur Kommunikation - verwende 0 für die Standardeinstellung:";
+$a->strings["Database Login Name"] = "Datenbank-Benutzername";
+$a->strings["Database Login Password"] = "Datenbank-Kennwort";
+$a->strings["Database Name"] = "Datenbank-Name";
+$a->strings["Site administrator email address"] = "E-Mail Adresse des Seiten-Administrators";
+$a->strings["Your account email address must match this in order to use the web admin panel."] = "Die Email-Adresse deines Accounts muss dieser Adresse entsprechen, damit du Zugriff zum Admin Panel erhältst.";
+$a->strings["Website URL"] = "Webseiten URL";
+$a->strings["Please use SSL (https) URL if available."] = "Nutze wenn möglich eine SSL-URL (https).";
+$a->strings["Please select a default timezone for your website"] = "Standard-Zeitzone für deine Website";
+$a->strings["Site settings"] = "Seiteneinstellungen";
+$a->strings["Could not find a command line version of PHP in the web server PATH."] = "Konnte die Kommandozeilen Version von PHP nicht im PATH des Servers finden.";
+$a->strings["If you don't have a command line version of PHP installed on server, you will not be able to run background polling via cron."] = "Solltest du keine Kommandozeilen Version von PHP auf dem Server installiert haben wirst du nicht in der Lage sein Hintergrundprozesse via cron auszuführen.";
+$a->strings["PHP executable path"] = "PHP Pfad zu ausführbarer Datei";
+$a->strings["Enter full path to php executable. You can leave this blank to continue the installation."] = "Gib den vollen Pfad zum PHP Interpreter an. Du kannst dieses Felds frei lassen und mit der Installation fortfahren.";
+$a->strings["Command line PHP"] = "PHP Befehlszeile";
+$a->strings["The command line version of PHP on your system does not have \"register_argc_argv\" enabled."] = "Die Kommandozeilen Version von PHP auf deinem System hat \"register_argc_argv\" nicht aktiviert.";
+$a->strings["This is required for message delivery to work."] = "Dies wird benötigt, damit die Auslieferung von Nachrichten funktioniert.";
+$a->strings["PHP register_argc_argv"] = "PHP register_argc_argv";
+$a->strings["Error: the \"openssl_pkey_new\" function on this system is not able to generate encryption keys"] = "Fehler: Die \"openssl_pkey_new\" Funktion auf diesem System ist nicht in der Lage Schlüssel für die Verschlüsselung zu erzeugen.";
+$a->strings["If running under Windows, please see \"http://www.php.net/manual/en/openssl.installation.php\"."] = "Wenn du Windows verwendest, siehe http://www.php.net/manual/en/openssl.installation.php für eine Installationsanleitung.";
+$a->strings["Generate encryption keys"] = "Verschlüsselungsschlüssel generieren";
+$a->strings["libCurl PHP module"] = "libCurl PHP Modul";
+$a->strings["GD graphics PHP module"] = "GD Graphik PHP Modul";
+$a->strings["OpenSSL PHP module"] = "OpenSSL PHP Modul";
+$a->strings["mysqli PHP module"] = "mysqli PHP Modul";
+$a->strings["mb_string PHP module"] = "mb_string PHP Modul";
+$a->strings["mcrypt PHP module"] = "mcrypt PHP Modul";
+$a->strings["Apache mod_rewrite module"] = "Apache mod_rewrite Modul";
+$a->strings["Error: Apache webserver mod-rewrite module is required but not installed."] = "Fehler: Das Apache Modul mod-rewrite wird benötigt ist aber nicht installiert.";
+$a->strings["proc_open"] = "proc_open";
+$a->strings["Error: proc_open is required but is either not installed or has been disabled in php.ini"] = "Fehler: proc_open wird benötigt ist aber entweder nicht installiert oder wurde in der php.ini deaktiviert";
+$a->strings["Error: libCURL PHP module required but not installed."] = "Fehler: das PHP Modul libCURL wird benütigt ist aber nicht installiert.";
+$a->strings["Error: GD graphics PHP module with JPEG support required but not installed."] = "Fehler: das PHP Modul GD Grafik mit JPEG Unterstützung wird benötigt ist aber nicht installiert.";
+$a->strings["Error: openssl PHP module required but not installed."] = "Fehler: das OpenSSL PHP Modul wird benötigt ist aber nicht installiert.";
+$a->strings["Error: mysqli PHP module required but not installed."] = "Fehler: das PHP Modul mysqli wird benötigt ist aber nicht installiert.";
+$a->strings["Error: mb_string PHP module required but not installed."] = "Fehler: das PHP Modul mb_string wird benötigt ist aber nicht installiert.";
+$a->strings["Error: mcrypt PHP module required but not installed."] = "Fehler: das PHP Modul mcrypt wird benötigt ist aber nicht installiert.";
+$a->strings["The web installer needs to be able to create a file called \".htconfig.php\ in the top folder of your web server and it is unable to do so."] = "Der Installations-Assistent muss in der Lage sein die Datei \".htconfig.php\" im Stammverzeichnis des Web-Servers anzulegen, ist es aber nicht.";
+$a->strings["This is most often a permission setting, as the web server may not be able to write files in your folder - even if you can."] = "Meist liegt dies daran, dass der Nutzer unter dem der Web-Server läuft keine Rechte zum Schreiben in dem Verzeichnis hat - selbst wenn du das kannst.";
+$a->strings["At the end of this procedure, we will give you a text to save in a file named .htconfig.php in your Red top folder."] = "Am Schluss des Vorgangs wird ein Text generiert, den du unter dem Dateinamen .htconfig.php im Stammverzeichnis deiner Red Installation speichern.";
+$a->strings["You can alternatively skip this procedure and perform a manual installation. Please see the file \"install/INSTALL.txt\" for instructions."] = "Alternativ kannst du diesen Schritt überspringen und die Installation manuell vornehmen. Lies dazu die Datei install/INSTALL.txt.";
+$a->strings[".htconfig.php is writable"] = ".htconfig.php ist beschreibbar";
+$a->strings["Red uses the Smarty3 template engine to render its web views. Smarty3 compiles templates to PHP to speed up rendering."] = "Red verwendet Smarty3 um Vorlagen für die Webdarstellung zu übersetzen. Smarty3 übersetzt diese Vorlagen nach PHP um die Darstellung zu beschleunigen.";
+$a->strings["In order to store these compiled templates, the web server needs to have write access to the directory view/tpl/smarty3/ under the Red top level folder."] = "Um die übersetzten Vorlagen speichern zu können muss der Webserver schreib Zugriff auf das Verzeichnis view/tpl/smarty3/ unterhalb des Red Stammverzeichnisses haben.";
+$a->strings["Please ensure that the user that your web server runs as (e.g. www-data) has write access to this folder."] = "Bitte stelle sicher, dass der Nutzer unter dem der Webserver läuft (z.B. www-data) Zugriff zum Schreiben auf dieses Verzeichnis hat.";
+$a->strings["Note: as a security measure, you should give the web server write access to view/tpl/smarty3/ only--not the template files (.tpl) that it contains."] = "Hinweis: Als Sicherheitsvorkehrung solltest du dem Webserver nur Schreib-Zugriff auf das Verzeichnis view/tpl/smarty3 geben, nicht dem Vorlagen (.tpl) die in diesem Verzeichnis liegen.";
+$a->strings["view/tpl/smarty3 is writable"] = "view/tpl/smarty3 ist beschreibbar";
+$a->strings["Red uses the store directory to save uploaded files. The web server needs to have write access to the store directory under the Red top level folder"] = "Red benutzt das store Verzeichnis um hochgeladene Dateien zu speichern. Der Web-Server benötigt Schreibrechte für dieses Verzeichnis direkt unterhalb des Red Stammverzeichnis.";
+$a->strings["store is writable"] = "store ist schreibbar";
+$a->strings["SSL certificate validation"] = "SSL Zertifikatverifizierung";
+$a->strings["SSL certificate cannot be validated. Fix certificate or disable https access to this site."] = "Das SSL Zertifikat konnte nicht validiert werden. Korrigiere das Zertifikat oder schalte HTTPS ab um auf diese Seite zuzugreifen.";
+$a->strings["Url rewrite in .htaccess is not working. Check your server configuration."] = "URL rewrite funktioniert in der .htaccess nicht. Überprüfe deine Server-Konfiguration.";
+$a->strings["Url rewrite is working"] = "Url rewrite funktioniert";
+$a->strings["The database configuration file \".htconfig.php\" could not be written. Please use the enclosed text to create a configuration file in your web server root."] = "Die Datenbank Konfigurationsdatei \".htconfig.php\" konnte nicht geschrieben werden. Bitte verwende den unten angegebenen Text um die Konfigurationsdatei im Stammverzeichnis des Webservers anzulegen.";
+$a->strings["Errors encountered creating database tables."] = "Fehler während des Anlegens der Datenbank Tabellen aufgetreten.";
+$a->strings["<h1>What next</h1>"] = "<h1>Was als Nächstes</h1>";
+$a->strings["IMPORTANT: You will need to [manually] setup a scheduled task for the poller."] = "WICHTIG: Du musst die geplanten Aufgaben für den Poller [manuell] einrichten.";
+$a->strings["Edit post"] = "Bearbeite Beitrag";
+$a->strings["%1\$s is following %2\$s's %3\$s"] = "%1\$s folgt nun %2\$s's %3\$s";
+$a->strings["[Embedded content - reload page to view]"] = "[Eingebetteter Inhalte - bitte lade die Seite zur Anzeige neu]";
+$a->strings["toggle full screen mode"] = "auf Vollbildmodus umschalten";
+$a->strings["%1\$s tagged %2\$s's %3\$s with %4\$s"] = "%1\$s hat %2\$s's %3\$s mit %4\$s getaggt";
+$a->strings["Public access denied."] = "Öffentlicher Zugang verweigert.";
+$a->strings["No connections."] = "Keine Verbindungen.";
+$a->strings["Visit %s's profile [%s]"] = "Besuche %s's Profil [%s]";
+$a->strings["View Connnections"] = "Zeige Verbindungen";
+$a->strings["Tag removed"] = "Schlagwort entfernt";
+$a->strings["Remove Item Tag"] = "Schlagwort des Beitrags entfernen";
+$a->strings["Select a tag to remove: "] = "Schlagwort zum entfernen auswählen:";
+$a->strings["Remove"] = "Entferne";
+$a->strings["Continue"] = "Fortfahren";
+$a->strings["Premium Channel Setup"] = "Prämium-Kanal Einrichtung";
+$a->strings["Enable premium channel connection restrictions"] = "Einschränkungen für den Prämium-Kanal aktivieren";
+$a->strings["Please enter your restrictions or conditions, such as paypal receipt, usage guidelines, etc."] = "Bitte gib deine Nutzungseinschränkungen ein, z.B. Paypal Quittung, Nutzungsbestimmungen etc.";
+$a->strings["This channel may require additional steps or acknowledgement of the following conditions prior to connecting:"] = "Unter Umständen sind weitere Schritte oder die Bestätigung der folgenden Bedingungen, vor dem Verbinden mit diesem Kanal nötig.";
+$a->strings["Potential connections will then see the following text before proceeding:"] = "Potentielle Verbindungen werden den folgenden Text sehen bevor fortgefahren wird:";
+$a->strings["By continuing, I certify that I have complied with any instructions provided on this page."] = "Mit dem fortfahren bestätige ich die Erfüllung aller Anweisungen die vom Seitenbetreiber erteilt wurden.";
+$a->strings["(No specific instructions have been provided by the channel owner.)"] = "(Der Seitenbetreiber hat keine speziellen Anweisungen für Kanal-Betreiber hinterlegt.)";
+$a->strings["Restricted or Premium Channel"] = "Eingeschränkter oder Prämium-Kanal";
+$a->strings["No potential page delegates located."] = "Keine potentiellen Bevollmächtigten für die Seite gefunden.";
+$a->strings["Delegate Page Management"] = "Delegiere das Management für die Seite";
+$a->strings["Delegates are able to manage all aspects of this account/page except for basic account settings. Please do not delegate your personal account to anybody that you do not trust completely."] = "Bevollmächtigte sind in der Lage, alle Aspekte dieses Kontos/dieser Seite zu verwalten, abgesehen von den Grundeinstellungen des Kontos. Bitte gib niemandem eine Bevollmächtigung für deinen privaten Account, dem du nicht absolut vertraust!";
+$a->strings["Existing Page Managers"] = "Vorhandene Seitenmanager";
+$a->strings["Existing Page Delegates"] = "Vorhandene Bevollmächtigte für die Seite";
+$a->strings["Potential Delegates"] = "Potentielle Bevollmächtigte";
+$a->strings["Add"] = "Hinzufügen";
+$a->strings["No entries."] = "Keine Einträge.";
+$a->strings["Failed to create source. No channel selected."] = "Konnte die Quelle nicht anlegen. Kein Kanal ausgewählt.";
+$a->strings["Source created."] = "Quelle erstellt.";
+$a->strings["Source updated."] = "Quelle aktualisiert.";
+$a->strings["Manage remote sources of content for your channel."] = "Entfernte Quellen von Inhalten deines Kanals verwalten.";
+$a->strings["New Source"] = "Neue Quelle";
+$a->strings["Import all or selected content from the following channel into this channel and distribute it according to your channel settings."] = "Importiere alle oder ausgewählte Inhalte des folgenden Kanals in diesen Kanal und verteile sie gemäß der Einstellungen dieses Kanals.";
+$a->strings["Only import content with these words (one per line)"] = "Importiere ausschließlich Beiträge, die folgende Wörter (eines pro Zeile) enthalten";
+$a->strings["Leave blank to import all public content"] = "Leer lassen um alle öffentlichen Beiträge zu importieren";
+$a->strings["Channel Name"] = "Channel-Name";
+$a->strings["Source not found."] = "Quelle nicht gefunden.";
+$a->strings["Edit Source"] = "Quelle bearbeiten";
+$a->strings["Delete Source"] = "Quelle löschen";
+$a->strings["Source removed"] = "Quelle gelöscht";
+$a->strings["Unable to remove source."] = "Konnte die Quelle nicht löschen.";
+$a->strings["Theme settings updated."] = "Theme-Einstellungen aktualisiert.";
$a->strings["Site"] = "Seite";
-$a->strings["Users"] = "Nutzer";
-$a->strings["Plugins"] = "Plugins";
-$a->strings["Themes"] = "Themen";
-$a->strings["DB updates"] = "DB Updates";
+$a->strings["Users"] = "Benutzer";
+$a->strings["Plugins"] = "Plug-Ins";
+$a->strings["Themes"] = "Themes";
+$a->strings["Server"] = "Server";
+$a->strings["DB updates"] = "DB-Aktualisierungen";
$a->strings["Logs"] = "Protokolle";
-$a->strings["Admin"] = "Administration";
-$a->strings["Plugin Features"] = "Plugin Features";
-$a->strings["User registrations waiting for confirmation"] = "Nutzeranmeldungen die auf Bestätigung warten";
-$a->strings["Normal Account"] = "Normales Konto";
-$a->strings["Soapbox Account"] = "Marktschreier-Konto";
-$a->strings["Community/Celebrity Account"] = "Forum/Promi-Konto";
-$a->strings["Automatic Friend Account"] = "Automatisches Freundekonto";
-$a->strings["Message queues"] = "Nachrichten-Warteschlangen";
+$a->strings["Plugin Features"] = "Plug-In Funktionen";
+$a->strings["User registrations waiting for confirmation"] = "Nutzer Anmeldungen die auf Bestätigung warten";
+$a->strings["Message queues"] = "Nachrichten Warteschlange";
$a->strings["Administration"] = "Administration";
$a->strings["Summary"] = "Zusammenfassung";
-$a->strings["Registered users"] = "Registrierte Nutzer";
-$a->strings["Pending registrations"] = "Anstehende Anmeldungen";
+$a->strings["Registered users"] = "Registrierte Benutzer";
+$a->strings["Pending registrations"] = "Ausstehende Registrierungen";
$a->strings["Version"] = "Version";
-$a->strings["Active plugins"] = "Aktive Plugins";
-$a->strings["Site settings updated."] = "Seiteneinstellungen aktualisiert.";
+$a->strings["Active plugins"] = "Aktive Plug-Ins";
+$a->strings["Site settings updated."] = "Site-Einstellungen aktualisiert.";
+$a->strings["No special theme for mobile devices"] = "Keine spezielle Theme für mobile Geräte";
+$a->strings["No special theme for accessibility"] = "Kein spezielles Accessibility Theme vorhanden";
$a->strings["Closed"] = "Geschlossen";
-$a->strings["Requires approval"] = "Bedarf der Zustimmung";
+$a->strings["Requires approval"] = "Genehmigung erforderlich";
$a->strings["Open"] = "Offen";
-$a->strings["No SSL policy, links will track page SSL state"] = "Keine SSL Richtlinie, Links werden das verwendete Protokoll beibehalten";
-$a->strings["Force all links to use SSL"] = "SSL für alle Links erzwingen";
-$a->strings["Self-signed certificate, use SSL for local links only (discouraged)"] = "Selbst-unterzeichnetes Zertifikat, SSL nur für lokale Links verwenden (nicht empfohlen)";
-$a->strings["File upload"] = "Datei hochladen";
-$a->strings["Policies"] = "Regeln";
-$a->strings["Advanced"] = "Erweitert";
+$a->strings["Private"] = "Privat";
+$a->strings["Paid Access"] = "Kostenpflichtiger Zugang";
+$a->strings["Free Access"] = "Kostenloser Zugang";
+$a->strings["Tiered Access"] = "Abgestufter Zugang";
+$a->strings["Registration"] = "Registrierung";
+$a->strings["File upload"] = "Dateiupload";
+$a->strings["Policies"] = "Richtlinien";
+$a->strings["Advanced"] = "Fortgeschritten";
$a->strings["Site name"] = "Seitenname";
$a->strings["Banner/Logo"] = "Banner/Logo";
-$a->strings["System language"] = "Systemsprache";
-$a->strings["System theme"] = "Systemweites Thema";
-$a->strings["Default system theme - may be over-ridden by user profiles - <a href='#' id='cnftheme'>change theme settings</a>"] = "Vorgabe für das System-Theme - kann von Benutzerprofilen überschrieben werden - <a href='#' id='cnftheme'>Theme-Einstellungen ändern</a>";
-$a->strings["SSL link policy"] = "Regeln für SSL Links";
-$a->strings["Determines whether generated links should be forced to use SSL"] = "Bestimmt, ob generierte Links SSL verwenden müssen";
-$a->strings["Maximum image size"] = "Maximale Größe von Bildern";
-$a->strings["Maximum size in bytes of uploaded images. Default is 0, which means no limits."] = "Maximale Upload-Größe von Bildern in Bytes. Standard ist 0, d.h. ohne Limit.";
+$a->strings["System language"] = "System-Sprache";
+$a->strings["System theme"] = "System-Theme";
+$a->strings["Default system theme - may be over-ridden by user profiles - <a href='#' id='cnftheme'>change theme settings</a>"] = "Standard System-Theme - kann durch Nutzerprofile überschieben werden - <a href='#' id='cnftheme'>Theme.Einstellungen ändern</a>";
+$a->strings["Mobile system theme"] = "Mobile System-Theme:";
+$a->strings["Theme for mobile devices"] = "Theme für mobile Geräte";
+$a->strings["Accessibility system theme"] = "Accessibility System-Theme";
+$a->strings["Accessibility theme"] = "Accessibility Theme";
+$a->strings["Channel to use for this website's static pages"] = "Kanal für die statischen Seiten dieser Webseite verwenden";
+$a->strings["Site Channel"] = "Seiten Kanal";
+$a->strings["Maximum image size"] = "Maximale Bildgröße";
+$a->strings["Maximum size in bytes of uploaded images. Default is 0, which means no limits."] = "Maximale Größe in Bytes von hochgeladenen Bildern. Standard ist 0, was keine Einschränkung bedeutet.";
$a->strings["Register policy"] = "Registrierungsmethode";
+$a->strings["Access policy"] = "Zugangsrichtlinien";
$a->strings["Register text"] = "Registrierungstext";
$a->strings["Will be displayed prominently on the registration page."] = "Wird gut sichtbar auf der Registrierungsseite angezeigt.";
-$a->strings["Accounts abandoned after x days"] = "Nutzerkonten gelten nach x Tagen als unbenutzt";
-$a->strings["Will not waste system resources polling external sites for abandonded accounts. Enter 0 for no time limit."] = "Verschwende keine System-Ressourcen auf das Pollen externer Seiten, wenn Konten nicht mehr benutzt werden. 0 eingeben für kein Limit.";
+$a->strings["Accounts abandoned after x days"] = "Accounts gelten nach X Tagen als unbenutzt";
+$a->strings["Will not waste system resources polling external sites for abandonded accounts. Enter 0 for no time limit."] = "Verschwende keine Systemressourchen auf das Pollen von externen Seiten wenn das Konto nicht mehr benutzt wird. Trage hier 0 für kein zeitliches Limit.";
$a->strings["Allowed friend domains"] = "Erlaubte Domains für Kontakte";
$a->strings["Comma separated list of domains which are allowed to establish friendships with this site. Wildcards are accepted. Empty to allow any domains"] = "Liste der Domains, die für Freundschaften erlaubt sind, durch Kommas getrennt. Platzhalter werden akzeptiert. Leer lassen, um alle Domains zu erlauben.";
-$a->strings["Allowed email domains"] = "Erlaubte Domains für Emails";
+$a->strings["Allowed email domains"] = "Erlaubte Domains für E-Mails";
$a->strings["Comma separated list of domains which are allowed in email addresses for registrations to this site. Wildcards are accepted. Empty to allow any domains"] = "Liste der Domains, die für E-Mail-Adressen bei der Registrierung erlaubt sind, durch Kommas getrennt. Platzhalter werden akzeptiert. Leer lassen, um alle Domains zu erlauben.";
$a->strings["Block public"] = "Öffentlichen Zugriff blockieren";
$a->strings["Check to block public access to all otherwise public personal pages on this site unless you are currently logged in."] = "Klicken, um öffentlichen Zugriff auf sonst öffentliche Profile zu blockieren, wenn man nicht eingeloggt ist.";
-$a->strings["Force publish"] = "Erzwinge Veröffentlichung";
+$a->strings["Force publish"] = "Veröffentlichung erzwingen";
$a->strings["Check to force all profiles on this site to be listed in the site directory."] = "Klicken, um Anzeige aller Profile dieses Servers im Verzeichnis zu erzwingen.";
-$a->strings["Global directory update URL"] = "URL für Updates beim weltweiten Verzeichnis";
-$a->strings["URL to update the global directory. If this is not set, the global directory is completely unavailable to the application."] = "URL für Update des globalen Verzeichnisses. Wenn nichts eingetragen ist, bleibt das globale Verzeichnis unerreichbar.";
-$a->strings["Block multiple registrations"] = "Unterbinde Mehrfachregistrierung";
-$a->strings["Disallow users to register additional accounts for use as pages."] = "Benutzern nicht erlauben, weitere Konten als zusätzliche Profile anzulegen.";
-$a->strings["OpenID support"] = "OpenID Unterstützung";
-$a->strings["OpenID support for registration and logins."] = "OpenID-Unterstützung für Registrierung und Login.";
-$a->strings["Fullname check"] = "Namen auf Vollständigkeit überprüfen";
-$a->strings["Force users to register with a space between firstname and lastname in Full name, as an antispam measure"] = "Leerzeichen zwischen Vor- und Nachname im vollständigen Namen erzwingen, um SPAM zu vermeiden.";
-$a->strings["UTF-8 Regular expressions"] = "UTF-8 Reguläre Ausdrücke";
-$a->strings["Use PHP UTF8 regular expressions"] = "PHP UTF8 Ausdrücke verwenden";
-$a->strings["Show Community Page"] = "Gemeinschaftsseite anzeigen";
-$a->strings["Display a Community page showing all recent public postings on this site."] = "Zeige die Gemeinschaftsseite mit allen öffentlichen Beiträgen auf diesem Server.";
-$a->strings["Enable OStatus support"] = "OStatus Unterstützung aktivieren";
-$a->strings["Provide built-in OStatus (identi.ca, status.net, etc.) compatibility. All communications in OStatus are public, so privacy warnings will be occasionally displayed."] = "Biete die eingebaute OStatus (identi.ca, status.net, etc.) Unterstützung an. Jede Kommunikation in OStatus ist öffentlich, so Privatsphäre Warnungen werden bei Bedarf angezeigt.";
-$a->strings["Enable Diaspora support"] = "Diaspora-Support aktivieren";
-$a->strings["Provide built-in Diaspora network compatibility."] = "Verwende die eingebaute Diaspora-Verknüpfung.";
-$a->strings["Only allow Friendica contacts"] = "Nur Friendica-Kontakte erlauben";
-$a->strings["All contacts must use Friendica protocols. All other built-in communication protocols disabled."] = "Alle Kontakte müssen das Friendica Protokoll nutzen. Alle anderen Kommunikationsprotokolle werden deaktiviert.";
-$a->strings["Verify SSL"] = "SSL Überprüfen";
-$a->strings["If you wish, you can turn on strict certificate checking. This will mean you cannot connect (at all) to self-signed SSL sites."] = "Wenn gewollt, kann man hier eine strenge Zertifikatkontrolle einstellen. Das bedeutet, dass man zu keinen Seiten mit selbst unterzeichnetem SSL eine Verbindung herstellen kann.";
-$a->strings["Proxy user"] = "Proxy Nutzer";
+$a->strings["No login on Homepage"] = "Kein Login auf der Homepage";
+$a->strings["Check to hide the login form from your sites homepage when visitors arrive who are not logged in (e.g. when you put the content of the homepage in via the site channel)."] = "Wählen um das Login Formular auf der Startseite der Seite zu verbergen, z.B. weil es das Layout der Homepage des Seiten-Kanals stört.";
+$a->strings["Proxy user"] = "Proxy Benutzer";
$a->strings["Proxy URL"] = "Proxy URL";
-$a->strings["Network timeout"] = "Netzwerk Wartezeit";
+$a->strings["Network timeout"] = "Netzwerk-Timeout";
$a->strings["Value is in seconds. Set to 0 for unlimited (not recommended)."] = "Der Wert ist in Sekunden. Setze 0 für unbegrenzt (nicht empfohlen).";
-$a->strings["Delivery interval"] = "Zustellungsintervall";
+$a->strings["Delivery interval"] = "Auslieferung Intervall";
$a->strings["Delay background delivery processes by this many seconds to reduce system load. Recommend: 4-5 for shared hosts, 2-3 for virtual private servers. 0-1 for large dedicated servers."] = "Verzögere im Hintergrund laufende Auslieferungsprozesse um die angegebene Anzahl an Sekunden, um die Systemlast zu verringern. Empfehlungen: 4-5 für Shared-Hosts, 2-3 für VPS, 0-1 für große dedizierte Server.";
$a->strings["Poll interval"] = "Abfrageintervall";
$a->strings["Delay background polling processes by this many seconds to reduce system load. If 0, use delivery interval."] = "Verzögere Hintergrundprozesse, um diese Anzahl an Sekunden um die Systemlast zu reduzieren. Bei 0 Sekunden wird das Auslieferungsintervall verwendet.";
$a->strings["Maximum Load Average"] = "Maximum Load Average";
$a->strings["Maximum system load before delivery and poll processes are deferred - default 50."] = "Maximale Systemlast bevor Verteil- und Empfangsprozesse verschoben werden - Standard 50";
+$a->strings["No server found"] = "Kein Server gefunden";
+$a->strings["ID"] = "ID";
+$a->strings["for channel"] = "für Kanal";
+$a->strings["on server"] = "auf Server";
+$a->strings["Status"] = "Status";
$a->strings["Update has been marked successful"] = "Update wurde als erfolgreich markiert";
-$a->strings["Executing %s failed. Check system logs."] = "Ausführung von %s schlug fehl. Systemprotokolle prüfen.";
-$a->strings["Update %s was successfully applied."] = "Update %s war erfolgreich.";
-$a->strings["Update %s did not return a status. Unknown if it succeeded."] = "Update %s hat keinen Status zurückgegeben. Unbekannter Status.";
-$a->strings["Update function %s could not be found."] = "Updatefunktion %s konnte nicht gefunden werden.";
-$a->strings["No failed updates."] = "Keine fehlgeschlagenen Updates.";
-$a->strings["Failed Updates"] = "Fehlgeschlagene Updates";
-$a->strings["This does not include updates prior to 1139, which did not return a status."] = "Ohne Updates vor 1139, da diese keinen Status zurückgegeben haben.";
-$a->strings["Mark success (if update was manually applied)"] = "Als erfolgreich markieren (falls das Update manuell installiert wurde)";
-$a->strings["Attempt to execute this update step automatically"] = "Versuchen, diesen Schritt automatisch auszuführen";
+$a->strings["Executing %s failed. Check system logs."] = "Aufrufen von %s fehlgeschlagen. Überprüfe die Systemlogs.";
+$a->strings["Update %s was successfully applied."] = "Update %s wurde erfolgreich angewandt.";
+$a->strings["Update %s did not return a status. Unknown if it succeeded."] = "Update %s liefert keinen Rückgabewert. Unbekannt ob es erfolgreich war.";
+$a->strings["Update function %s could not be found."] = "Update Funktion %s konnte nicht gefunden werden.";
+$a->strings["No failed updates."] = "Keine fehlgeschlagenen Aktualisierungen.";
+$a->strings["Failed Updates"] = "Fehlgeschlagene Aktualisierungen";
+$a->strings["Mark success (if update was manually applied)"] = "Als erfolgreich markieren (wenn das Update manuell angewandt wurde)";
+$a->strings["Attempt to execute this update step automatically"] = "Versuche diesen Updateschritt automatisch anzuwenden";
$a->strings["%s user blocked/unblocked"] = array(
- 0 => "%s Benutzer geblockt/freigegeben",
- 1 => "%s Benutzer geblockt/freigegeben",
+ 0 => "%s Nutzer blockiert/freigegeben",
+ 1 => "%s Nutzer blockiert/freigegeben",
);
$a->strings["%s user deleted"] = array(
0 => "%s Nutzer gelöscht",
1 => "%s Nutzer gelöscht",
);
-$a->strings["User '%s' deleted"] = "Nutzer '%s' gelöscht";
-$a->strings["User '%s' unblocked"] = "Nutzer '%s' entsperrt";
-$a->strings["User '%s' blocked"] = "Nutzer '%s' gesperrt";
+$a->strings["Account not found"] = "Konto nicht gefunden";
+$a->strings["User '%s' deleted"] = "Benutzer '%s' gelöscht";
+$a->strings["User '%s' unblocked"] = "Benutzer '%s' freigegeben";
+$a->strings["User '%s' blocked"] = "Benutzer '%s' blockiert";
$a->strings["select all"] = "Alle auswählen";
$a->strings["User registrations waiting for confirm"] = "Neuanmeldungen, die auf deine Bestätigung warten";
-$a->strings["Request date"] = "Anfragedatum";
-$a->strings["Email"] = "Email";
-$a->strings["No registrations."] = "Keine Neuanmeldungen.";
-$a->strings["Deny"] = "Verwehren";
-$a->strings["Register date"] = "Anmeldedatum";
+$a->strings["Request date"] = "Antragsdatum";
+$a->strings["Name"] = "Name";
+$a->strings["No registrations."] = "Keine Registrierungen.";
+$a->strings["Approve"] = "Genehmigen";
+$a->strings["Deny"] = "Verweigern";
+$a->strings["Register date"] = "Registrierungs-Datum";
$a->strings["Last login"] = "Letzte Anmeldung";
-$a->strings["Last item"] = "Letzter Beitrag";
-$a->strings["Account"] = "Nutzerkonto";
-$a->strings["Selected users will be deleted!\\n\\nEverything these users had posted on this site will be permanently deleted!\\n\\nAre you sure?"] = "Die markierten Nutzer werden gelöscht!\\n\\nAlle Beiträge, die diese Nutzer auf dieser Seite veröffentlicht haben, werden permanent gelöscht!\\n\\nBist du sicher?";
-$a->strings["The user {0} will be deleted!\\n\\nEverything this user has posted on this site will be permanently deleted!\\n\\nAre you sure?"] = "Der Nutzer {0} wird gelöscht!\\n\\nAlles was dieser Nutzer auf dieser Seite veröffentlicht hat, wird permanent gelöscht!\\n\\nBist du sicher?";
-$a->strings["Plugin %s disabled."] = "Plugin %s deaktiviert.";
-$a->strings["Plugin %s enabled."] = "Plugin %s aktiviert.";
-$a->strings["Disable"] = "Ausschalten";
-$a->strings["Enable"] = "Einschalten";
+$a->strings["Expires"] = "Verfällt";
+$a->strings["Service Class"] = "Service-Klasse";
+$a->strings["Selected users will be deleted!\\n\\nEverything these users had posted on this site will be permanently deleted!\\n\\nAre you sure?"] = "Markierte Nutzer werden gelöscht\\n\\nAlles was diese Nutzer auf dieser Seite veröffentlicht haben wird permanent gelöscht\\n\\nBist du sicher?";
+$a->strings["The user {0} will be deleted!\\n\\nEverything this user has posted on this site will be permanently deleted!\\n\\nAre you sure?"] = "Der Nutzer {0} wird gelöscht\\n\\nAlles was dieser Nutzer auf dieser Seite veröffentlicht hat wird permanent gelöscht werden\\n\\nBist du sicher?";
+$a->strings["Plugin %s disabled."] = "Plug-In %s deaktiviert.";
+$a->strings["Plugin %s enabled."] = "Plug-In %s aktiviert.";
+$a->strings["Disable"] = "Deaktivieren";
+$a->strings["Enable"] = "Aktivieren";
$a->strings["Toggle"] = "Umschalten";
-$a->strings["Author: "] = "Autor:";
+$a->strings["Author: "] = "Autor: ";
$a->strings["Maintainer: "] = "Betreuer:";
-$a->strings["No themes found."] = "Keine Themen gefunden.";
+$a->strings["No themes found."] = "Keine Theme gefunden.";
$a->strings["Screenshot"] = "Bildschirmfoto";
$a->strings["[Experimental]"] = "[Experimentell]";
$a->strings["[Unsupported]"] = "[Nicht unterstützt]";
-$a->strings["Log settings updated."] = "Protokolleinstellungen aktualisiert.";
-$a->strings["Clear"] = "löschen";
-$a->strings["Debugging"] = "Protokoll führen";
+$a->strings["Log settings updated."] = "Protokoll-Einstellungen aktualisiert.";
+$a->strings["Clear"] = "Leeren";
+$a->strings["Debugging"] = "Debugging";
$a->strings["Log file"] = "Protokolldatei";
-$a->strings["Must be writable by web server. Relative to your Friendica top-level directory."] = "Webserver muss Schreibrechte besitzen. Abhängig vom Friendica-Installationsverzeichnis.";
-$a->strings["Log level"] = "Protokoll-Level";
-$a->strings["Close"] = "Schließen";
-$a->strings["FTP Host"] = "FTP Host";
-$a->strings["FTP Path"] = "FTP Pfad";
-$a->strings["FTP User"] = "FTP Nutzername";
-$a->strings["FTP Password"] = "FTP Passwort";
-$a->strings["Requested profile is not available."] = "Das angefragte Profil ist nicht vorhanden.";
-$a->strings["Access to this profile has been restricted."] = "Der Zugriff zu diesem Profil wurde eingeschränkt.";
-$a->strings["Tips for New Members"] = "Tipps für neue Nutzer";
-$a->strings["{0} wants to be your friend"] = "{0} möchte mit dir in Kontakt treten";
-$a->strings["{0} sent you a message"] = "{0} hat dir eine Nachricht geschickt";
-$a->strings["{0} requested registration"] = "{0} möchte sich registrieren";
-$a->strings["{0} commented %s's post"] = "{0} kommentierte einen Beitrag von %s";
-$a->strings["{0} liked %s's post"] = "{0} mag %ss Beitrag";
-$a->strings["{0} disliked %s's post"] = "{0} mag %ss Beitrag nicht";
-$a->strings["{0} is now friends with %s"] = "{0} ist jetzt mit %s befreundet";
-$a->strings["{0} posted"] = "{0} hat etwas veröffentlicht";
-$a->strings["{0} tagged %s's post with #%s"] = "{0} hat %ss Beitrag mit dem Schlagwort #%s versehen";
-$a->strings["{0} mentioned you in a post"] = "{0} hat dich in einem Beitrag erwähnt";
-$a->strings["Contacts who are not members of a group"] = "Kontakte, die keiner Gruppe zugewiesen sind";
-$a->strings["OpenID protocol error. No ID returned."] = "OpenID Protokollfehler. Keine ID zurückgegeben.";
-$a->strings["Account not found and OpenID registration is not permitted on this site."] = "Nutzerkonto wurde nicht gefunden, und OpenID-Registrierung ist auf diesem Server nicht gestattet.";
-$a->strings["Login failed."] = "Anmeldung fehlgeschlagen.";
-$a->strings["Contact added"] = "Kontakt hinzugefügt";
-$a->strings["Common Friends"] = "Gemeinsame Freunde";
-$a->strings["No contacts in common."] = "Keine gemeinsamen Kontakte.";
-$a->strings["Item has been removed."] = "Eintrag wurde entfernt.";
-$a->strings["Applications"] = "Anwendungen";
-$a->strings["No installed applications."] = "Keine Applikationen installiert.";
-$a->strings["Search"] = "Suche";
+$a->strings["Must be writable by web server. Relative to your Red top-level directory."] = "Muss für den Web-Server schreibbar sein. Relativ zum Red Stammverzeichnis.";
+$a->strings["Log level"] = "Protokollstufe";
+$a->strings["Menu not found."] = "Menü nicht gefunden";
+$a->strings["Menu element updated."] = "Menü-Element aktualisiert.";
+$a->strings["Unable to update menu element."] = "Kann Menü-Element nicht aktualisieren.";
+$a->strings["Menu element added."] = "Menü-Bestandteil hinzugefügt.";
+$a->strings["Unable to add menu element."] = "Kann Menü-Bestandteil nicht hinzufügen.";
+$a->strings["Not found."] = "Nicht gefunden.";
+$a->strings["Manage Menu Elements"] = "Menü-Bestandteile verwalten";
+$a->strings["Edit menu"] = "Menü bearbeiten";
+$a->strings["Edit element"] = "Bestandteil bearbeiten";
+$a->strings["Drop element"] = "Bestandteil löschen";
+$a->strings["New element"] = "Neues Bestandteil";
+$a->strings["Edit this menu container"] = "Diesen Menü-Container bearbeiten";
+$a->strings["Add menu element"] = "Menüelement hinzufügen";
+$a->strings["Delete this menu item"] = "Lösche dieses Menü-Bestandteil";
+$a->strings["Edit this menu item"] = "Bearbeite dieses Menü-Bestandteil";
+$a->strings["New Menu Element"] = "Neues Menü-Bestandteil";
+$a->strings["Menu Item Permissions"] = "Menü-Element Zugriffsrechte";
+$a->strings["(click to open/close)"] = "(zum öffnen/schließen anklicken)";
+$a->strings["Link text"] = "Link Text";
+$a->strings["URL of link"] = "URL des Links";
+$a->strings["Use Red magic-auth if available"] = "Verwende Red Magic-Auth wenn verfügbar";
+$a->strings["Open link in new window"] = "Öffne Link in neuem Fenster";
+$a->strings["Order in list"] = "Reihenfolge in der Liste";
+$a->strings["Higher numbers will sink to bottom of listing"] = "Größere Nummern werden weiter unten in der Auflistung einsortiert";
+$a->strings["Create"] = "Erstelle";
+$a->strings["Menu item not found."] = "Menü-Bestandteil nicht gefunden.";
+$a->strings["Menu item deleted."] = "Menü-Bestandteil gelöscht.";
+$a->strings["Menu item could not be deleted."] = "Menü-Bestandteil kann nicht gelöscht werden.";
+$a->strings["Edit Menu Element"] = "Bearbeite Menü-Bestandteil";
+$a->strings["Modify"] = "Ändern";
+$a->strings["Collection created."] = "Sammlung erstellt.";
+$a->strings["Could not create collection."] = "Sammlung kann nicht erstellt werden.";
+$a->strings["Collection updated."] = "Sammlung aktualisiert.";
+$a->strings["Create a collection of channels."] = "Erstelle eine Sammlung von Kanälen.";
+$a->strings["Collection Name: "] = "Name der Sammlung:";
+$a->strings["Members are visible to other channels"] = "Mitglieder sind sichtbar für andere Kanäle";
+$a->strings["Collection removed."] = "Sammlung gelöscht.";
+$a->strings["Unable to remove collection."] = "Löschen der Sammlung nicht möglich.";
+$a->strings["Collection Editor"] = "Sammlung-Editor";
+$a->strings["Members"] = "Mitglieder";
+$a->strings["All Connected Channels"] = "Alle verbundene Channels";
+$a->strings["Click on a channel to add or remove."] = "Wähle einen Kanal zum hinzufügen oder entfernen aus.";
+$a->strings["Page owner information could not be retrieved."] = "Informationen über den Betreiber der Seite konnten nicht gefunden werden.";
+$a->strings["Album not found."] = "Album nicht gefunden.";
+$a->strings["Delete Album"] = "Album löschen";
+$a->strings["Delete Photo"] = "Foto löschen";
+$a->strings["%1\$s was tagged in %2\$s by %3\$s"] = "%1\$s wurde auf %2\$s von %3\$s getaggt";
+$a->strings["a photo"] = "Foto";
+$a->strings["No photos selected"] = "Keine Fotos ausgewählt";
+$a->strings["Access to this item is restricted."] = "Zugriff auf dieses Foto wurde eingeschränkt.";
+$a->strings["You have used %1$.2f Mbytes of %2$.2f Mbytes photo storage."] = "Du benutzt %1$.2f MBytes deines %2$.2f MBytes großen Bilder-Speichers.";
+$a->strings["You have used %1$.2f Mbytes of photo storage."] = "Du verwendets %1$.2f MBytes deines Foto-Speichers.";
+$a->strings["Upload Photos"] = "Fotos hochladen";
+$a->strings["New album name: "] = "Name des neuen Albums:";
+$a->strings["or existing album name: "] = "oder bestehenden Album Namen:";
+$a->strings["Do not show a status post for this upload"] = "Keine Statusnachricht für diesen Upload senden";
+$a->strings["Permissions"] = "Berechtigungen";
+$a->strings["Contact Photos"] = "Kontakt Bilder";
+$a->strings["Edit Album"] = "Album bearbeiten";
+$a->strings["Show Newest First"] = "Zeige neueste zuerst";
+$a->strings["Show Oldest First"] = "Zeige älteste zuerst";
+$a->strings["View Photo"] = "Foto ansehen";
+$a->strings["Permission denied. Access to this item may be restricted."] = "Berechtigung verweigert. Der Zugriff ist wahrscheinlich eingeschränkt worden.";
+$a->strings["Photo not available"] = "Foto nicht verfügbar";
+$a->strings["Use as profile photo"] = "Als Profilfoto verwenden";
+$a->strings["View Full Size"] = "In voller Größe anzeigen";
+$a->strings["Edit photo"] = "Foto bearbeiten";
+$a->strings["Rotate CW (right)"] = "Drehen US (rechts)";
+$a->strings["Rotate CCW (left)"] = "Drehen EUS (links)";
+$a->strings["New album name"] = "Name des neuen Albums:";
+$a->strings["Caption"] = "Bildunterschrift";
+$a->strings["Add a Tag"] = "Schlagwort hinzufügen";
+$a->strings["Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"] = "Beispiel: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping";
+$a->strings["View Album"] = "Album ansehen";
+$a->strings["Recent Photos"] = "Neueste Fotos";
+$a->strings["- select -"] = "-auswählen-";
+$a->strings["Menu updated."] = "Menü aktualisiert.";
+$a->strings["Unable to update menu."] = "Kann Menü nicht aktualisieren.";
+$a->strings["Menu created."] = "Menü erstellt.";
+$a->strings["Unable to create menu."] = "Kann Menü nicht erstellen.";
+$a->strings["Manage Menus"] = "Menüs verwalten";
+$a->strings["Drop"] = "Löschen";
+$a->strings["Create a new menu"] = "Neues Menü erstellen";
+$a->strings["Delete this menu"] = "Lösche dieses Menü";
+$a->strings["Edit menu contents"] = "Bearbeite Menü Inhalte";
+$a->strings["Edit this menu"] = "Dieses Menü bearbeiten";
+$a->strings["New Menu"] = "Neues Menü";
+$a->strings["Menu name"] = "Menü Name";
+$a->strings["Must be unique, only seen by you"] = "Muss unverwechselbar sein, nur für dich sichtbar";
+$a->strings["Menu title"] = "Menü Titel";
+$a->strings["Menu title as seen by others"] = "Menü Titel wie er von anderen gesehen wird";
+$a->strings["Menu deleted."] = "Menü gelöscht.";
+$a->strings["Menu could not be deleted."] = "Menü konnte nicht gelöscht werden.";
+$a->strings["Edit Menu"] = "Menü bearbeiten";
+$a->strings["Add or remove entries to this menu"] = "Einträge zu diesem Menü hinzufügen oder entfernen";
+$a->strings["Welcome to %s"] = "Willkommen auf %s";
+$a->strings["Age: "] = "Alter:";
+$a->strings["Gender: "] = "Geschlecht:";
+$a->strings["Finding:"] = "Ergebnisse:";
+$a->strings["next page"] = "nächste Seite";
+$a->strings["previous page"] = "vorige Seite";
+$a->strings["No entries (some entries may be hidden)."] = "Keine Einträge gefunden (einige könnten versteckt sein).";
+$a->strings["Blocked"] = "Blockiert";
+$a->strings["Ignored"] = "Ignoriert";
+$a->strings["Hidden"] = "Versteckt";
+$a->strings["Archived"] = "Archiviert";
+$a->strings["All"] = "Alle";
+$a->strings["Suggest new connections"] = "Neue Verbindungen vorschlagen";
+$a->strings["Show pending (new) connections"] = "Zeige schwebende (neue) Verbindungen";
+$a->strings["All Connections"] = "Alle Verbindungen";
+$a->strings["Show all connections"] = "Zeige alle Verbindungen";
+$a->strings["Unblocked"] = "Freigegeben";
+$a->strings["Only show unblocked connections"] = "Zeige nur freigegebene Verbindungen";
+$a->strings["Only show blocked connections"] = "Zeige nur blockierte Verbindungen";
+$a->strings["Only show ignored connections"] = "Zeige nur ignorierte Verbindungen";
+$a->strings["Only show archived connections"] = "Zeige nur archivierte Verbindungen";
+$a->strings["Only show hidden connections"] = "Zeige nur versteckte Verbindungen";
+$a->strings["%1\$s [%2\$s]"] = "%1\$s [%2\$s]";
+$a->strings["Edit contact"] = "Kontakt bearbeiten";
+$a->strings["Search your connections"] = "Verbindungen durchsuchen";
+$a->strings["Finding: "] = "Ergebnisse:";
+$a->strings["Layout Help"] = "Layout Hilfe";
+$a->strings["Help with this feature"] = "Hilfe zu diesem Feature";
+$a->strings["Layout Name"] = "Layout Name";
+$a->strings["Help:"] = "Hilfe:";
+$a->strings["Not Found"] = "Nicht gefunden";
+$a->strings["Remote Authentication"] = "Entfernte Authentifizierung";
+$a->strings["Enter your channel address (e.g. channel@example.com)"] = "Deine Kanal-Adresse (z.B. channel@example.com)";
+$a->strings["Authenticate"] = "Authentifizieren";
+$a->strings["No such group"] = "Gruppe existiert nicht";
+$a->strings["Search Results For:"] = "Suchergebnisse für:";
+$a->strings["Collection is empty"] = "Sammlung ist leer";
+$a->strings["Collection: "] = "Sammlung:";
+$a->strings["Connection: "] = "Verbindung:";
+$a->strings["Invalid connection."] = "Ungültige Verbindung.";
+$a->strings["Channel added."] = "Kanal hinzugefügt.";
+$a->strings["Remote authentication blocked. You are logged into this site locally. Please logout and retry."] = "Entfernte Authentifizierung blockiert. Du bist lokal auf dieser Seite angemeldet. Bitte melde dich ab und versuche es erneut.";
+$a->strings["Welcome %s. Remote authentication successful."] = "Willkommen %s. Entfernte Authentifizierung erfolgreich.";
+$a->strings["This site is not a directory server"] = "Diese Website ist kein Verzeichnis-Server";
+$a->strings["Remote privacy information not available."] = "Entfernte Privatsphären Einstellungen sind nicht verfügbar.";
+$a->strings["Visible to:"] = "Sichtbar für:";
+$a->strings["Hub not found."] = "Server nicht gefunden.";
$a->strings["Profile not found."] = "Profil nicht gefunden.";
-$a->strings["Profile Name is required."] = "Profilname ist erforderlich.";
+$a->strings["Profile deleted."] = "Profil gelöscht.";
+$a->strings["Profile-"] = "Profil-";
+$a->strings["New profile created."] = "Neues Profil erstellt.";
+$a->strings["Profile unavailable to clone."] = "Profil kann nicht geklont werden.";
+$a->strings["Profile Name is required."] = "Profil-Name erforderlich.";
$a->strings["Marital Status"] = "Familienstand";
-$a->strings["Romantic Partner"] = "Romanze";
-$a->strings["Work/Employment"] = "Arbeit / Beschäftigung";
+$a->strings["Romantic Partner"] = "Romantische Partner";
+$a->strings["Likes"] = "Gefällt-mir";
+$a->strings["Dislikes"] = "Gefällt-mir-nicht";
+$a->strings["Work/Employment"] = "Arbeit/Anstellung";
$a->strings["Religion"] = "Religion";
-$a->strings["Political Views"] = "Politische Ansichten";
+$a->strings["Political Views"] = "Politische Anscihten";
$a->strings["Gender"] = "Geschlecht";
-$a->strings["Sexual Preference"] = "Sexuelle Vorlieben";
+$a->strings["Sexual Preference"] = "Sexuelle Orientierung";
$a->strings["Homepage"] = "Webseite";
-$a->strings["Interests"] = "Interessen";
+$a->strings["Interests"] = "Hobbys/Interessen";
$a->strings["Address"] = "Adresse";
-$a->strings["Location"] = "Wohnort";
+$a->strings["Location"] = "Ort";
$a->strings["Profile updated."] = "Profil aktualisiert.";
-$a->strings[" and "] = " und ";
-$a->strings["public profile"] = "öffentliches Profil";
-$a->strings["%1\$s changed %2\$s to &ldquo;%3\$s&rdquo;"] = "%1\$s hat %2\$s geändert auf &ldquo;%3\$s&rdquo;";
-$a->strings[" - Visit %1\$s's %2\$s"] = " – %1\$ss %2\$s besuchen";
-$a->strings["%1\$s has an updated %2\$s, changing %3\$s."] = "%1\$s hat folgendes aktualisiert %2\$s, verändert wurde %3\$s.";
-$a->strings["Profile deleted."] = "Profil gelöscht.";
-$a->strings["Profile-"] = "Profil-";
-$a->strings["New profile created."] = "Neues Profil angelegt.";
-$a->strings["Profile unavailable to clone."] = "Profil nicht zum Duplizieren verfügbar.";
-$a->strings["Hide your contact/friend list from viewers of this profile?"] = "Liste der Kontakte vor Betrachtern dieses Profils verbergen?";
-$a->strings["Edit Profile Details"] = "Profil bearbeiten";
-$a->strings["View this profile"] = "Dieses Profil anzeigen";
-$a->strings["Create a new profile using these settings"] = "Neues Profil anlegen und diese Einstellungen verwenden";
-$a->strings["Clone this profile"] = "Dieses Profil duplizieren";
+$a->strings["Hide your contact/friend list from viewers of this profile?"] = "Verberge die Liste deiner Kontakte vor Betrachtern dieses Profils";
+$a->strings["Edit Profile Details"] = "Bearbeite Profil-Details";
+$a->strings["View this profile"] = "Dieses Profil ansehen";
+$a->strings["Change Profile Photo"] = "Profilfoto ändern";
+$a->strings["Create a new profile using these settings"] = "Neues Profil anlegen und diese Einstellungen übernehmen";
+$a->strings["Clone this profile"] = "Dieses Profil klonen";
$a->strings["Delete this profile"] = "Dieses Profil löschen";
$a->strings["Profile Name:"] = "Profilname:";
-$a->strings["Your Full Name:"] = "Dein kompletter Name:";
+$a->strings["Your Full Name:"] = "Dein voller Name:";
$a->strings["Title/Description:"] = "Titel/Beschreibung:";
$a->strings["Your Gender:"] = "Dein Geschlecht:";
$a->strings["Birthday (%s):"] = "Geburtstag (%s):";
-$a->strings["Street Address:"] = "Adresse:";
+$a->strings["Street Address:"] = "Straße und Hausnummer:";
$a->strings["Locality/City:"] = "Wohnort:";
$a->strings["Postal/Zip Code:"] = "Postleitzahl:";
$a->strings["Country:"] = "Land:";
-$a->strings["Region/State:"] = "Region/Bundesstaat:";
+$a->strings["Region/State:"] = "Region/Bundesstaat";
$a->strings["<span class=\"heart\">&hearts;</span> Marital Status:"] = "<span class=\"heart\">&hearts;</span> Beziehungsstatus:";
$a->strings["Who: (if applicable)"] = "Wer: (falls anwendbar)";
$a->strings["Examples: cathy123, Cathy Williams, cathy@example.com"] = "Beispiele: cathy123, Cathy Williams, cathy@example.com";
$a->strings["Since [date]:"] = "Seit [Datum]:";
-$a->strings["Sexual Preference:"] = "Sexuelle Vorlieben:";
-$a->strings["Homepage URL:"] = "Adresse der Homepage:";
-$a->strings["Hometown:"] = "Heimatort:";
-$a->strings["Political Views:"] = "Politische Ansichten:";
+$a->strings["Homepage URL:"] = "Homepage URL:";
$a->strings["Religious Views:"] = "Religiöse Ansichten:";
-$a->strings["Public Keywords:"] = "Öffentliche Schlüsselwörter:";
-$a->strings["Private Keywords:"] = "Private Schlüsselwörter:";
-$a->strings["Example: fishing photography software"] = "Beispiel: Fischen Fotografie Software";
-$a->strings["(Used for suggesting potential friends, can be seen by others)"] = "(Wird verwendet, um potentielle Freunde zu finden, könnte von Fremden eingesehen werden)";
-$a->strings["(Used for searching profiles, never shown to others)"] = "(Wird für die Suche nach Profilen verwendet und niemals veröffentlicht)";
-$a->strings["Tell us about yourself..."] = "Erzähle uns ein bisschen von dir …";
-$a->strings["Hobbies/Interests"] = "Hobbies/Interessen";
-$a->strings["Contact information and Social Networks"] = "Kontaktinformationen und Soziale Netzwerke";
+$a->strings["Keywords:"] = "Schlüsselwörter:";
+$a->strings["Example: fishing photography software"] = "Beispiel: fischen Fotografie Software";
+$a->strings["Used in directory listings"] = "Wird in Verzeichnis Auflistungen verwendet";
+$a->strings["Tell us about yourself..."] = "Erzähl uns ein wenig von Dir...";
+$a->strings["Hobbies/Interests"] = "Hobbys/Interessen";
+$a->strings["Contact information and Social Networks"] = "Kontaktinformation und soziale Netzwerke";
+$a->strings["My other channels"] = "Meine anderen Channels";
$a->strings["Musical interests"] = "Musikalische Interessen";
-$a->strings["Books, literature"] = "Literatur/Bücher";
+$a->strings["Books, literature"] = "Bücher, Literatur";
$a->strings["Television"] = "Fernsehen";
-$a->strings["Film/dance/culture/entertainment"] = "Filme/Tänze/Kultur/Unterhaltung";
-$a->strings["Love/romance"] = "Liebesleben";
-$a->strings["Work/employment"] = "Arbeit/Beschäftigung";
+$a->strings["Film/dance/culture/entertainment"] = "Film/Tanz/Kultur/Unterhaltung";
+$a->strings["Love/romance"] = "Liebe/Romantik";
+$a->strings["Work/employment"] = "Arbeit/Anstellung";
$a->strings["School/education"] = "Schule/Ausbildung";
-$a->strings["This is your <strong>public</strong> profile.<br />It <strong>may</strong> be visible to anybody using the internet."] = "Dies ist dein <strong>öffentliches</strong> Profil.<br />Es <strong>könnte</strong> für jeden Nutzer des Internets sichtbar sein.";
-$a->strings["Age: "] = "Alter: ";
-$a->strings["Edit/Manage Profiles"] = "Verwalte/Editiere Profile";
-$a->strings["Change profile photo"] = "Profilbild ändern";
-$a->strings["Create New Profile"] = "Neues Profil anlegen";
-$a->strings["Profile Image"] = "Profilbild";
-$a->strings["visible to everybody"] = "sichtbar für jeden";
-$a->strings["Edit visibility"] = "Sichtbarkeit bearbeiten";
-$a->strings["Save to Folder:"] = "In diesen Ordner verschieben:";
-$a->strings["- select -"] = "- auswählen -";
-$a->strings["%1\$s tagged %2\$s's %3\$s with %4\$s"] = "%1\$s hat %2\$ss %3\$s mit %4\$s getaggt";
-$a->strings["No potential page delegates located."] = "Keine potentiellen Bevollmächtigten für die Seite gefunden.";
-$a->strings["Delegate Page Management"] = "Delegiere das Management für die Seite";
-$a->strings["Delegates are able to manage all aspects of this account/page except for basic account settings. Please do not delegate your personal account to anybody that you do not trust completely."] = "Bevollmächtigte sind in der Lage, alle Aspekte dieses Kontos/dieser Seite zu verwalten, abgesehen von den Grundeinstellungen des Kontos. Bitte gib niemandem eine Bevollmächtigung für deinen privaten Account, dem du nicht absolut vertraust!";
-$a->strings["Existing Page Managers"] = "Vorhandene Seiten Manager";
-$a->strings["Existing Page Delegates"] = "Vorhandene Bevollmächtigte für die Seite";
-$a->strings["Potential Delegates"] = "Potentielle Bevollmächtigte";
-$a->strings["Add"] = "Hinzufügen";
-$a->strings["No entries."] = "Keine Einträge";
-$a->strings["Friend Suggestions"] = "Kontaktvorschläge";
-$a->strings["No suggestions available. If this is a new site, please try again in 24 hours."] = "Keine Vorschläge. Falls der Server frisch aufgesetzt wurde, versuche es bitte in 24 Stunden noch einmal.";
-$a->strings["Ignore/Hide"] = "Ignorieren/Verbergen";
-$a->strings["Global Directory"] = "Weltweites Verzeichnis";
-$a->strings["Find on this site"] = "Auf diesem Server suchen";
-$a->strings["Site Directory"] = "Verzeichnis";
-$a->strings["Gender: "] = "Geschlecht:";
-$a->strings["No entries (some entries may be hidden)."] = "Keine Einträge (einige Einträge könnten versteckt sein).";
-$a->strings["%s : Not a valid email address."] = "%s: Keine gültige Email Adresse.";
-$a->strings["Please join us on Friendica"] = "Bitte trete uns auf Friendica bei";
-$a->strings["%s : Message delivery failed."] = "%s: Zustellung der Nachricht fehlgeschlagen.";
-$a->strings["%d message sent."] = array(
- 0 => "%d Nachricht gesendet.",
- 1 => "%d Nachrichten gesendet.",
-);
-$a->strings["You have no more invitations available"] = "Du hast keine weiteren Einladungen";
-$a->strings["Visit %s for a list of public sites that you can join. Friendica members on other sites can all connect with each other, as well as with members of many other social networks."] = "Besuche %s für eine Liste der öffentlichen Server, denen du beitreten kannst. Friendica Mitglieder unterschiedlicher Server können sich sowohl alle miteinander verbinden, als auch mit Mitgliedern anderer Sozialer Netzwerke.";
-$a->strings["To accept this invitation, please visit and register at %s or any other public Friendica website."] = "Um diese Kontaktanfrage zu akzeptieren, besuche und registriere dich bitte bei %s oder einer anderen öffentlichen Friendica Website.";
-$a->strings["Friendica sites all inter-connect to create a huge privacy-enhanced social web that is owned and controlled by its members. They can also connect with many traditional social networks. See %s for a list of alternate Friendica sites you can join."] = "Friendica Server verbinden sich alle untereinander, um ein großes datenschutzorientiertes Soziales Netzwerk zu bilden, das von seinen Mitgliedern betrieben und kontrolliert wird. Sie können sich auch mit vielen üblichen Sozialen Netzwerken verbinden. Besuche %s für eine Liste alternativer Friendica Server, denen du beitreten kannst.";
-$a->strings["Our apologies. This system is not currently configured to connect with other public sites or invite members."] = "Es tut uns Leid. Dieses System ist zurzeit nicht dafür konfiguriert, sich mit anderen öffentlichen Seiten zu verbinden oder Mitglieder einzuladen.";
-$a->strings["Send invitations"] = "Einladungen senden";
-$a->strings["Enter email addresses, one per line:"] = "E-Mail-Adressen eingeben, eine pro Zeile:";
-$a->strings["You are cordially invited to join me and other close friends on Friendica - and help us to create a better social web."] = "Du bist herzlich dazu eingeladen, dich mir und anderen guten Freunden auf Friendica anzuschließen - und ein besseres Soziales Netz aufzubauen.";
-$a->strings["You will need to supply this invitation code: \$invite_code"] = "Du benötigst den folgenden Einladungscode: \$invite_code";
-$a->strings["Once you have registered, please connect with me via my profile page at:"] = "Sobald du registriert bist, kontaktiere mich bitte auf meiner Profilseite:";
-$a->strings["For more information about the Friendica project and why we feel it is important, please visit http://friendica.com"] = "Für weitere Informationen über das Friendica Projekt und warum wir es für ein wichtiges Projekt halten, besuche bitte http://friendica.com";
-$a->strings["This may occasionally happen if contact was requested by both persons and it has already been approved."] = "Das kann passieren, wenn sich zwei Kontakte gegenseitig eingeladen haben und bereits einer angenommen wurde.";
-$a->strings["Response from remote site was not understood."] = "Antwort der Gegenstelle unverständlich.";
-$a->strings["Unexpected response from remote site: "] = "Unerwartete Antwort der Gegenstelle: ";
-$a->strings["Confirmation completed successfully."] = "Bestätigung erfolgreich abgeschlossen.";
-$a->strings["Remote site reported: "] = "Gegenstelle meldet: ";
-$a->strings["Temporary failure. Please wait and try again."] = "Zeitweiser Fehler. Bitte warte einige Momente und versuche es dann noch einmal.";
-$a->strings["Introduction failed or was revoked."] = "Kontaktanfrage schlug fehl oder wurde zurück gezogen.";
-$a->strings["Unable to set contact photo."] = "Konnte das Bild des Kontakts nicht speichern.";
-$a->strings["%1\$s is now friends with %2\$s"] = "%1\$s ist nun mit %2\$s befreundet";
-$a->strings["No user record found for '%s' "] = "Für '%s' wurde kein Nutzer gefunden";
-$a->strings["Our site encryption key is apparently messed up."] = "Der Verschlüsselungsschlüssel unserer Seite ist anscheinend im Arsch.";
-$a->strings["Empty site URL was provided or URL could not be decrypted by us."] = "Leere URL für die Seite erhalten oder die URL konnte nicht entschlüsselt werden.";
-$a->strings["Contact record was not found for you on our site."] = "Für diesen Kontakt wurde auf unserer Seite kein Eintrag gefunden.";
-$a->strings["Site public key not available in contact record for URL %s."] = "Die Kontaktdaten für URL %s enthalten keinen Public Key für den Server.";
-$a->strings["The ID provided by your system is a duplicate on our system. It should work if you try again."] = "Die ID, die uns dein System angeboten hat, ist hier bereits vergeben. Bitte versuche es noch einmal.";
-$a->strings["Unable to set your contact credentials on our system."] = "Deine Kontaktreferenzen konnten nicht in unserem System gespeichert werden.";
-$a->strings["Unable to update your contact profile details on our system"] = "Die Updates für dein Profil konnten nicht gespeichert werden";
-$a->strings["Connection accepted at %s"] = "Auf %s wurde die Verbindung akzeptiert";
-$a->strings["%1\$s has joined %2\$s"] = "%1\$s ist %2\$s beigetreten";
-$a->strings["Facebook disabled"] = "Facebook deaktiviert";
-$a->strings["Updating contacts"] = "Aktualisiere Kontakte";
-$a->strings["Facebook API key is missing."] = "Facebook-API-Schlüssel nicht gefunden";
-$a->strings["Facebook Connect"] = "Mit Facebook verbinden";
-$a->strings["Install Facebook connector for this account."] = "Facebook-Connector für dieses Konto installieren.";
-$a->strings["Remove Facebook connector"] = "Facebook-Connector entfernen";
-$a->strings["Re-authenticate [This is necessary whenever your Facebook password is changed.]"] = "Neu authentifizieren [Das ist immer dann nötig, wenn Du Dein Facebook-Passwort geändert hast.]";
-$a->strings["Post to Facebook by default"] = "Veröffentliche standardmäßig bei Facebook";
-$a->strings["Facebook friend linking has been disabled on this site. The following settings will have no effect."] = "Das Verlinken von Facebookkontakten wurde auf dieser Seite deaktiviert. Die folgenden Einstellungen haben keinen Effekt.";
-$a->strings["Facebook friend linking has been disabled on this site. If you disable it, you will be unable to re-enable it."] = "Das Verlinken von Facebookkontakten wurde auf dieser Seite deaktiviert. Wenn du es ausgeschaltet hast, kannst du es nicht wieder aktivieren.";
-$a->strings["Link all your Facebook friends and conversations on this website"] = "All meine Facebook-Kontakte und -Konversationen hier auf diese Website importieren";
-$a->strings["Facebook conversations consist of your <em>profile wall</em> and your friend <em>stream</em>."] = "Facebook-Konversationen bestehen aus deinen Beiträgen auf deiner<em>Pinnwand</em>, sowie den Beiträgen deiner Freunde <em>Stream</em>.";
-$a->strings["On this website, your Facebook friend stream is only visible to you."] = "Hier auf dieser Webseite kannst nur du die Beiträge Deiner Facebook-Freunde (Stream) sehen.";
-$a->strings["The following settings determine the privacy of your Facebook profile wall on this website."] = "Mit den folgenden Einstellungen kannst Du die Privatsphäre der Kopie Deiner Facebook-Pinnwand hier auf dieser Seite einstellen.";
-$a->strings["On this website your Facebook profile wall conversations will only be visible to you"] = "Meine Facebook-Pinnwand hier auf dieser Webseite nur für mich sichtbar machen";
-$a->strings["Do not import your Facebook profile wall conversations"] = "Facebook-Pinnwand nicht importieren";
-$a->strings["If you choose to link conversations and leave both of these boxes unchecked, your Facebook profile wall will be merged with your profile wall on this website and your privacy settings on this website will be used to determine who may see the conversations."] = "Wenn Du Facebook-Konversationen importierst und diese beiden Häkchen nicht setzt, wird Deine Facebook-Pinnwand mit der Pinnwand hier auf dieser Webseite vereinigt. Die Privatsphäre-Einstellungen für Deine Pinnwand auf dieser Webseite geben dann an, wer die Konversationen sehen kann.";
-$a->strings["Comma separated applications to ignore"] = "Kommaseparierte Anwendungen, die ignoriert werden sollen";
-$a->strings["Problems with Facebook Real-Time Updates"] = "Probleme mit Facebook Echtzeit-Updates";
-$a->strings["Facebook"] = "Facebook";
-$a->strings["Facebook Connector Settings"] = "Facebook-Verbindungseinstellungen";
-$a->strings["Facebook API Key"] = "Facebook API Schlüssel";
-$a->strings["Error: it appears that you have specified the App-ID and -Secret in your .htconfig.php file. As long as they are specified there, they cannot be set using this form.<br><br>"] = "Fehler: du scheinst die App-ID und das App-Geheimnis in deiner .htconfig.php Datei angegeben zu haben. Solange sie dort festgelegt werden kannst du dieses Formular hier nicht verwenden.<br><br>";
-$a->strings["Error: the given API Key seems to be incorrect (the application access token could not be retrieved)."] = "Fehler: der angegebene API Schlüssel scheint nicht korrekt zu sein (Zugriffstoken konnte nicht empfangen werden).";
-$a->strings["The given API Key seems to work correctly."] = "Der angegebene API Schlüssel scheint korrekt zu funktionieren.";
-$a->strings["The correctness of the API Key could not be detected. Somthing strange's going on."] = "Die Echtheit des API Schlüssels konnte nicht überprüft werden. Etwas Merkwürdiges ist hier im Gange.";
-$a->strings["App-ID / API-Key"] = "App-ID / API-Key";
-$a->strings["Application secret"] = "Anwendungs-Geheimnis";
-$a->strings["Polling Interval in minutes (minimum %1\$s minutes)"] = "Abfrageintervall in Minuten (min %1\$s Minuten)";
-$a->strings["Synchronize comments (no comments on Facebook are missed, at the cost of increased system load)"] = "Kommentare synchronisieren (Kein Kommentar von Facebook geht verloren, verursacht höhere Last auf dem Server)";
-$a->strings["Real-Time Updates"] = "Echtzeit Aktualisierungen";
-$a->strings["Real-Time Updates are activated."] = "Echtzeit-Updates sind aktiviert.";
-$a->strings["Deactivate Real-Time Updates"] = "Echtzeit-Updates deaktivieren";
-$a->strings["Real-Time Updates not activated."] = "Echtzeit-Updates nicht aktiviert.";
-$a->strings["Activate Real-Time Updates"] = "Echtzeit-Updates aktivieren";
-$a->strings["The new values have been saved."] = "Die neuen Einstellungen wurden gespeichert.";
-$a->strings["Post to Facebook"] = "Bei Facebook veröffentlichen";
-$a->strings["Post to Facebook cancelled because of multi-network access permission conflict."] = "Beitrag wurde nicht bei Facebook veröffentlicht, da Konflikte bei den Multi-Netzwerk-Zugriffsrechten vorliegen.";
-$a->strings["View on Friendica"] = "In Friendica betrachten";
-$a->strings["Facebook post failed. Queued for retry."] = "Veröffentlichung bei Facebook gescheitert. Wir versuchen es später erneut.";
-$a->strings["Your Facebook connection became invalid. Please Re-authenticate."] = "Deine Facebook Anmeldedaten sind ungültig geworden. Bitte re-authentifiziere dich.";
-$a->strings["Facebook connection became invalid"] = "Facebook Anmeldedaten sind ungültig geworden";
-$a->strings["Hi %1\$s,\n\nThe connection between your accounts on %2\$s and Facebook became invalid. This usually happens after you change your Facebook-password. To enable the connection again, you have to %3\$sre-authenticate the Facebook-connector%4\$s."] = "Hallo %1\$s,\n\ndie Verbindung zwischen deinem Account auf %2\$s und Facebook funktioniert derzeit nicht. Dies ist normalerweise das Ergebnis einer Passwortänderung bei Facebook. Um die Verbindung wieder zu aktivieren musst du %3\$sden Facebook-Connector neu authentifizieren%4\$s.";
-$a->strings["StatusNet AutoFollow settings updated."] = "StatusNet AutoFollow Einstellungen aktualisiert.";
-$a->strings["StatusNet AutoFollow Settings"] = "StatusNet AutoFollow Einstellungen";
-$a->strings["Automatically follow any StatusNet followers/mentioners"] = "Automatisch allen StatusNet Followern/Erwähnungen folgen";
-$a->strings["Lifetime of the cache (in hours)"] = "Lebenszeit des Caches (in Stunden)";
-$a->strings["Cache Statistics"] = "Cache Statistik";
-$a->strings["Number of items"] = "Anzahl der Einträge";
-$a->strings["Size of the cache"] = "Größe des Caches";
-$a->strings["Delete the whole cache"] = "Cache leeren";
-$a->strings["%d person likes this"] = array(
- 0 => "%d Person mag das",
- 1 => "%d Leuten mögen das",
-);
-$a->strings["%d person doesn't like this"] = array(
- 0 => " %d Person mag das nicht",
- 1 => "%d Leute mögen das nicht",
-);
-$a->strings["Get added to this list!"] = "Werde Mitglied dieser Liste";
-$a->strings["Generate new key"] = "Neuen Schlüssel erstellen";
-$a->strings["Widgets key"] = "Widgets Schlüssel";
-$a->strings["Widgets available"] = "Verfügbare Widgets";
-$a->strings["Connect on Friendica!"] = "In Friendica verbinden!";
-$a->strings["YourLS Settings"] = "YourLS Einstellungen";
-$a->strings["URL: http://"] = "URL: http://";
-$a->strings["Username:"] = "Nutzername:";
-$a->strings["Password:"] = "Passwort:";
-$a->strings["Use SSL "] = "SSL Verwenden ";
-$a->strings["yourls Settings saved."] = "yourls Einstellungen gespeichert";
-$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["LiveJournal username"] = "LiveJournal Benutzername";
-$a->strings["LiveJournal password"] = "LiveJournal Passwort";
-$a->strings["Post to LiveJournal by default"] = "Standardmäßig bei LiveJournal veröffentlichen";
-$a->strings["Not Safe For Work (General Purpose Content Filter) settings"] = "Not Safe for Work (allg. 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. Du kannst beliebige Wörter in der Filterliste angeben und ihn so als allgemeinen Filter verwenden.";
-$a->strings["Enable Content filter"] = "Aktiviere den Inhaltsfilter";
-$a->strings["Comma separated list of keywords to hide"] = "Durch Komma getrennte Liste von Schlüsselwörtern die verborgen werden sollen";
-$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";
-$a->strings["Forums"] = "Foren";
-$a->strings["show more"] = "mehr anzeigen";
-$a->strings["Planets Settings"] = "Planeten Einstellungen";
-$a->strings["Enable Planets Plugin"] = "Aktiviere Planeten Plugin";
-$a->strings["Login"] = "Anmeldung";
-$a->strings["OpenID"] = "OpenID";
-$a->strings["Latest users"] = "Letzte Benutzer";
-$a->strings["Most active users"] = "Aktivste Nutzer";
-$a->strings["Latest photos"] = "Neueste Fotos";
-$a->strings["Latest likes"] = "Neueste Favoriten";
-$a->strings["event"] = "Veranstaltung";
-$a->strings["U.S. Time Format (mm/dd/YYYY)"] = "U.S. Datumsformat (mm/dd/YYYY)";
-$a->strings["German Time Format (dd.mm.YYYY)"] = "Deutsches Datumsformat (dd.mm.YYYY)";
-$a->strings["Error"] = "Fehler";
-$a->strings["No access"] = "Kein Zugriff";
-$a->strings["New event"] = "Neue Veranstaltung";
-$a->strings["Today"] = "Heute";
-$a->strings["Day"] = "Tag";
-$a->strings["Week"] = "Woche";
-$a->strings["Month"] = "Monat";
-$a->strings["Reload"] = "Neu Laden";
-$a->strings["Date"] = "Datum";
-$a->strings["Not found"] = "Nicht gefunden";
-$a->strings["Go back to the calendar"] = "Zurück zum Kalender";
-$a->strings["Starts"] = "Beginnt";
-$a->strings["Ends"] = "Endet";
-$a->strings["Description"] = "Beschreibung";
-$a->strings["Notification"] = "Benachrichtigung";
-$a->strings["Minutes"] = "Minuten";
-$a->strings["Hours"] = "Stunden";
-$a->strings["Days"] = "Tage";
-$a->strings["before"] = "vorher";
-$a->strings["Calendar Settings"] = "Kalender Einstellungen";
-$a->strings["Date format"] = "Datumsformat";
-$a->strings["Time zone"] = "Zeitzone";
-$a->strings["Limitations"] = "Einschränkungen";
-$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["Friendica-Contacts"] = "Friendica-Kontakte";
-$a->strings["Your Friendica-Contacts"] = "Deine Friendica-Kontakte";
-$a->strings["Calendar"] = "Kalender";
-$a->strings["Extended calendar with CalDAV-support"] = "Erweiterter Kalender mit CalDAV Unterstützung.";
-$a->strings["The database tables have been installed."] = "Die Datenbank-Tabellen wurden installiert.";
-$a->strings["An error occurred during the installation."] = "Während der Installation trat ein Fehler auf.";
-$a->strings["No system-wide settings yet."] = "Momentan keine systemweiten Einstellungen.";
-$a->strings["Database status"] = "Datenbank Status";
-$a->strings["Installed"] = "Installiert";
-$a->strings["Upgrade needed"] = "Upgrade erforderlich";
-$a->strings["Upgrade"] = "Upgrade";
-$a->strings["Not installed"] = "Nicht installiert";
-$a->strings["Install"] = "Installieren";
-$a->strings["Troubleshooting"] = "Problembehebung";
-$a->strings["Manual creation of the database tables:"] = "Manuelles anlegen der Datenbank Tabellen:";
-$a->strings["Show SQL-statements"] = "SQL-Anweisungen anzeigen";
-$a->strings["Private Calendar"] = "Privater Kalender";
-$a->strings["Friendica Events: Mine"] = "Meine Friendica-Veranstaltungen";
-$a->strings["Friendica Events: Contacts"] = "Friendica Veranstaltungen meiner Kontakte";
-$a->strings["Allow to use your friendica id (%s) to connecto to external unhosted-enabled storage (like ownCloud). See <a href=\"http://www.w3.org/community/unhosted/wiki/RemoteStorage#WebFinger\">RemoteStorage WebFinger</a>"] = "Ermöglicht dir, deine friendica id (%s) mit externen unhosted-fähigen Speichern (z.B. ownCloud) zu verbinden. Siehe <a href=\"http://www.w3.org/community/unhosted/wiki/RemoteStorage#WebFinger\">RemoteStorage WebFinger</a>";
-$a->strings["Template URL (with {category})"] = "Vorlagen URL (mit {Kategorie})";
-$a->strings["OAuth end-point"] = "OAuth end-point";
-$a->strings["Api"] = "Api";
-$a->strings["Member since:"] = "Mitglied seit:";
-$a->strings["Three Dimensional Tic-Tac-Toe"] = "Dreidimensionales Tic-Tac-Toe";
-$a->strings["3D Tic-Tac-Toe"] = "3D Tic-Tac-Toe";
-$a->strings["New game"] = "Neues Spiel";
-$a->strings["New game with handicap"] = "Neues Handicap Spiel";
-$a->strings["Three dimensional tic-tac-toe is just like the traditional game except that it is played on multiple levels simultaneously. "] = "3D-Tic-Tac-Toe ist genauso wie das herkömmliche Spiel, nur dass man es auf mehreren Ebenen gleichzeitig spielt.";
-$a->strings["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."] = "In diesem Fall sind es drei Ebenen. Man gewinnt indem man drei in einer Reihe auf einer beliebigen Reihe schafft, oder drei übereinander oder diagonal auf verschiedenen Ebenen.";
-$a->strings["The handicap game disables the center position on the middle level because the player claiming this square often has an unfair advantage."] = "Beim Handicap-Spiel wird die zentrale Position der mittleren Ebene gesperrt, da der Spieler, der diese Ebene besitzt, oft einen unfairen Vorteil genießt.";
-$a->strings["You go first..."] = "Du fängst an...";
-$a->strings["I'm going first this time..."] = "Diesmal fange ich an...";
-$a->strings["You won!"] = "Du gewinnst!";
-$a->strings["\"Cat\" game!"] = "Unentschieden!";
-$a->strings["I won!"] = "Ich gewinne!";
-$a->strings["Randplace Settings"] = "Randplace-Einstellungen";
-$a->strings["Enable Randplace Plugin"] = "Randplace-Plugin aktivieren";
-$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["dreamwidth username"] = "Dreamwidth Benutzername";
-$a->strings["dreamwidth password"] = "Dreamwidth Passwort";
-$a->strings["Post to dreamwidth by default"] = "Standardmäßig bei Dreamwidth veröffentlichen";
-$a->strings["Post to Drupal"] = "Bei Drupal veröffentlichen";
-$a->strings["Drupal Post Settings"] = "Drupal-Beitragseinstellungen";
-$a->strings["Enable Drupal Post Plugin"] = "Veröffentlichung bei Drupal erlauben";
-$a->strings["Drupal username"] = "Drupal Nutzername";
-$a->strings["Drupal password"] = "Drupal Passwort";
-$a->strings["Post Type - article,page,or blog"] = "Beitragstyp - Artikel, Seite oder Blog";
-$a->strings["Drupal site URL"] = "URL der Drupal Seite";
-$a->strings["Drupal site uses clean URLS"] = "Drupal Seite verwendet bereinigte URLs";
-$a->strings["Post to Drupal by default"] = "Veröffentliche öffentliche Beiträge standardmäßig bei Drupal";
-$a->strings["Post from Friendica"] = "Beitrag via Friendica";
-$a->strings["Startpage Settings"] = "Startseiten-Einstellungen";
-$a->strings["Home page to load after login - leave blank for profile wall"] = "Seite, die nach dem Anmelden geladen werden soll. Leer = Pinnwand";
-$a->strings["Examples: &quot;network&quot; or &quot;notifications/system&quot;"] = "Beispiele: network, notifications/system";
-$a->strings["Geonames settings updated."] = "Geonames Einstellungen aktualisiert";
-$a->strings["Geonames Settings"] = "Geonames Einstellungen";
-$a->strings["Enable Geonames Plugin"] = "Geonames Plugin aktivieren";
-$a->strings["Your account on %s will expire in a few days."] = "Dein Konto auf %s wird in ein paar Tagen verfallen.";
-$a->strings["Your Friendica account is about to expire."] = "Dein Friendica-Konto wird in Kürze auslaufen.";
-$a->strings["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"] = "Hallo %1\$s,\n\ndein Account auf %2\$s wird in weniger als fünf Tagen auslaufen. Du kannst das verhindern, indem du dich mindestens einmal alle 30 Tage anmeldest.";
-$a->strings["Upload a file"] = "Datei hochladen";
-$a->strings["Drop files here to upload"] = "Ziehe Dateien hierher, um sie hochzuladen";
-$a->strings["Failed"] = "Fehlgeschlagen";
-$a->strings["No files were uploaded."] = "Keine Dateien hochgeladen.";
-$a->strings["Uploaded file is empty"] = "Hochgeladene Datei ist leer";
-$a->strings["File has an invalid extension, it should be one of "] = "Die Dateierweiterung ist nicht erlaubt, sie muss eine der folgenden sein ";
-$a->strings["Upload was cancelled, or server error encountered"] = "Upload abgebrochen oder Serverfehler aufgetreten";
-$a->strings["OEmbed settings updated"] = "OEmbed Einstellungen aktualisiert.";
-$a->strings["Use OEmbed for YouTube videos"] = "OEmbed für Youtube Videos verwenden";
-$a->strings["URL to embed:"] = "URL zum Einbetten:";
-$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 page operators name."] = "Name des Serveradministrators";
-$a->strings["Site Owners Profile"] = "Profil des Seitenbetreibers";
-$a->strings["Profile address of the operator."] = "Profil-Adresse des Serveradministrators";
-$a->strings["How to contact the operator via snail mail. You can use BBCode here."] = "Kontaktmöglichkeiten zum Administrator via Schneckenpost. Du kannst BBCode verwenden.";
-$a->strings["Notes"] = "Hinweise";
-$a->strings["Additional notes that are displayed beneath the contact information. You can use BBCode here."] = "Zusätzliche Informationen die neben den Kontaktmöglichkeiten angezeigt werden. Du kannst BBCode verwenden.";
-$a->strings["How to contact the operator via email. (will be displayed obfuscated)"] = "Wie man den Betreiber per Email erreicht. (Adresse wird verschleiert dargestellt)";
-$a->strings["Footer note"] = "Fußnote";
-$a->strings["Text for the footer. You can use BBCode here."] = "Text für die Fußzeile. Du kannst BBCode verwenden.";
-$a->strings["Report Bug"] = "Fehlerreport erstellen";
-$a->strings["No Timeline settings updated."] = "Keine Timeline-Einstellungen aktualisiert.";
-$a->strings["No Timeline Settings"] = "Keine Timeline-Einstellungen";
-$a->strings["Disable Archive selector on profile wall"] = "Deaktiviere Archiv-Auswahl auf Deiner Pinnwand";
-$a->strings["\"Blockem\" Settings"] = "\"Blockem\"-Einstellungen";
-$a->strings["Comma separated profile URLS to block"] = "Profil-URLs, die blockiert werden sollen (durch Kommas getrennt)";
-$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["Unblock Author"] = "Autor freischalten";
-$a->strings["Block Author"] = "Autor blockieren";
-$a->strings["blockem settings updated"] = "blockem Einstellungen aktualisiert";
-$a->strings[":-)"] = ":-)";
-$a->strings[":-("] = ":-(";
-$a->strings["lol"] = "lol";
-$a->strings["Quick Comment Settings"] = "Schnell-Kommentar Einstellungen";
-$a->strings["Quick comments are found near comment boxes, sometimes hidden. Click them to provide simple replies."] = "Kurzkommentare findet man in der Nähe der Kommentarboxen. Ein Klick darauf erstellt einfache Antworten.";
-$a->strings["Enter quick comments, one per line"] = "Gib einen Schnell-Kommentar pro Zeile ein";
-$a->strings["Quick Comment settings saved."] = "Schnell-Kommentare Einstellungen gespeichert";
-$a->strings["Tile Server URL"] = "Tile Server URL";
-$a->strings["A list of <a href=\"http://wiki.openstreetmap.org/wiki/TMS\" target=\"_blank\">public tile servers</a>"] = "Eine Liste <a href=\"http://wiki.openstreetmap.org/wiki/TMS\" target=\"_blank\">öffentlicher Tile Server</a>";
-$a->strings["Default zoom"] = "Standard Zoom";
-$a->strings["The default zoom level. (1:world, 18:highest)"] = "Standard Zoomlevel (1: Welt; 18: höchstes)";
-$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["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";
-$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."] = "Mit dem MathJax Addon können mathematische Formeln, die mit LaTeX geschrieben wurden, dargestellt werden. Die Formel wird mit den üblichen $$ oder einem eqnarray Block gekennzeichnet. Formeln werden in allen Beiträgen auf deiner Pinnwand, dem Netzwerkstream sowie privaten Nachrichten gerendert.";
-$a->strings["Use the MathJax renderer"] = "MathJax verwenden";
-$a->strings["MathJax Base URL"] = "MathJax Basis-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."] = "Die URL der MathJax Javascript-Datei, die verwendet werden soll. Diese kann entweder aus der MathJax CDN oder einer anderen Quelle stammen.";
-$a->strings["Editplain settings updated."] = "Editplain Einstellungen aktualisiert";
-$a->strings["Editplain Settings"] = "Editplain Einstellungen";
-$a->strings["Disable richtext status editor"] = "RichText Editor deaktivieren";
-$a->strings["generic profile image"] = "allgemeines Profilbild";
-$a->strings["random geometric pattern"] = "zufällig erzeugtes geometrisches Muster";
-$a->strings["monster face"] = "Monstergesicht";
-$a->strings["computer generated face"] = "Computergesicht";
-$a->strings["retro arcade style face"] = "Retro Arcade Design Gesicht";
-$a->strings["Default avatar image"] = "Standard Profilbild ";
-$a->strings["Select default avatar image if none was found at Gravatar. See README"] = "Wähle das Standardgesicht, wenn kein Bild auf Gravatar gefunden wurde. Schaue auch sonst im README nach.";
-$a->strings["Rating of images"] = "Bildbewertung";
-$a->strings["Select the appropriate avatar rating for your site. See README"] = "Wähle eine angemessene Bildbewertung für Deinen Server. Schaue auch sonst im README nach.";
-$a->strings["Gravatar settings updated."] = "Gravatar Einstellungen aktualisiert.";
-$a->strings["Your Friendica test account is about to expire."] = "Dein Friendica-Testkonto wird bald verfallen.";
-$a->strings["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 http://dir.friendica.com/siteinfo - and for more information on setting up your own Friendica server please see the Friendica project website at http://friendica.com."] = "Hallo %1\$s,\n\ndein Testkonto auf %2\$s wird in weniger als fünf Tagen verfallen. Wir hoffen, dass dir dieser Testlauf gefallen hat, so dass du die Gelegenheit nutzt und dir einen normalen Friendica-Server für deine integrierte Social-Network-Kommunikation suchst. Eine Liste öffentlicher Server findest du auf http://dir.friendica.com/siteinfo . Um mehr Information darüber zu bekommen, wie man einen eigenen Friendica-Server aufsetzt, kannst du auch einen Blick auf die Friendica-Projektseite werfen: http://friendica.com";
-$a->strings["\"pageheader\" Settings"] = "\"pageheader\"-Einstellungen";
-$a->strings["pageheader Settings saved."] = "pageheader-Einstellungen gespeichert.";
-$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["InsaneJournal username"] = "InsaneJournal Benutzername";
-$a->strings["InsaneJournal password"] = "InsaneJournal Passwort";
-$a->strings["Post to InsaneJournal by default"] = "Standardmäßig auf InsaneJournal posten.";
-$a->strings["View Source"] = "Quelle ansehen";
-$a->strings["Post to StatusNet"] = "Bei StatusNet veröffentlichen";
-$a->strings["Please contact your site administrator.<br />The provided API URL is not valid."] = "Bitte kontaktiere den Administrator des Servers.<br />Die angegebene API-URL ist nicht gültig.";
-$a->strings["We could not contact the StatusNet API with the Path you entered."] = "Die StatusNet-API konnte mit dem angegebenen Pfad nicht erreicht werden.";
-$a->strings["StatusNet settings updated."] = "StatusNet Einstellungen aktualisiert.";
-$a->strings["StatusNet Posting Settings"] = "StatusNet-Beitragseinstellungen";
-$a->strings["Globally Available StatusNet OAuthKeys"] = "Verfügbare OAuth Schlüssel für StatusNet";
-$a->strings["There are preconfigured OAuth key pairs for some StatusNet servers available. If you are useing one of them, please use these credentials. If not feel free to connect to any other StatusNet instance (see below)."] = "Für einige StatusNet Server sind voreingestellt OAuth Schlüsselpaare verfügbar. Solltest du einen dieser Server benutzen, dann verwende bitte diese Schlüssel. Falls nicht, stellen stattdessen eine Verbindung zu irgend einem anderen StatusNet Server her (siehe unten).";
-$a->strings["Provide your own OAuth Credentials"] = "Eigene OAuth Schlüssel eintragen";
-$a->strings["No consumer key pair for StatusNet found. Register your Friendica Account as an desktop client on your StatusNet 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 StatusNet installation."] = "Kein Consumer-Schlüsselpaar für StatusNet gefunden. Registriere deinen Friendica-Account als Desktop-Client, kopiere das Consumer-Schlüsselpaar hierher und gib die API-URL ein.<br />Bevor du dein eigenes Consumer-Schlüsselpaar registrierst, frage den Administrator dieses Friendica-Servers, ob schon ein Schlüsselpaar für diesen Friendica-Server auf diesem StatusNet-Server existiert.";
-$a->strings["OAuth Consumer Key"] = "OAuth Consumer Key";
-$a->strings["OAuth Consumer Secret"] = "OAuth Consumer Secret";
-$a->strings["Base API Path (remember the trailing /)"] = "Basis-URL der StatusNet-API (vergiss den abschließenden / nicht)";
-$a->strings["To connect to your StatusNet account click the button below to get a security code from StatusNet which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to StatusNet."] = "Um dein Konto mit einem StatusNet-Konto zu verknüpfen, klicke den Button an, um einen Sicherheitscode von StatusNet zu erhalten, und kopiere diesen in das Eingabefeld weiter unten. Es werden ausschließlich deine <strong>öffentlichen</strong> Nachrichten an StatusNet gesendet.";
-$a->strings["Log in with StatusNet"] = "Bei StatusNet anmelden";
-$a->strings["Copy the security code from StatusNet here"] = "Kopiere den Sicherheitscode von StatusNet hier hin";
-$a->strings["Cancel Connection Process"] = "Verbindungsprozess abbrechen";
-$a->strings["Current StatusNet API is"] = "Derzeitige StatusNet-API-URL lautet";
-$a->strings["Cancel StatusNet Connection"] = "Verbindung zum StatusNet Server abbrechen";
-$a->strings["Currently connected to: "] = "Momentan verbunden mit: ";
-$a->strings["If enabled all your <strong>public</strong> postings can be posted to the associated StatusNet 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 StatusNet-Konto veröffentlicht werden. Du kannst das (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 StatusNet 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 deinen StatusNet-Beitrag angehängt wird, um auf den Originalbeitrag zu verweisen, den Betrachter auf eine leere Seite führen, die ihn darüber informiert, dass der Zugriff eingeschränkt wurde.";
-$a->strings["Allow posting to StatusNet"] = "Veröffentlichung bei StatusNet erlauben";
-$a->strings["Send public postings to StatusNet by default"] = "Veröffentliche öffentliche Beiträge standardmäßig bei StatusNet";
-$a->strings["Send linked #-tags and @-names to StatusNet"] = "Sende verlinkte #-Tags und @-Namen nach StatusNet";
-$a->strings["Clear OAuth configuration"] = "OAuth-Konfiguration löschen";
-$a->strings["API URL"] = "API-URL";
-$a->strings["Infinite Improbability Drive"] = "Infinite Improbability Drive";
-$a->strings["Post to Tumblr"] = "Bei Tumblr veröffentlichen";
-$a->strings["Tumblr Post Settings"] = "Tumblr-Beitragseinstellungen";
-$a->strings["Enable Tumblr Post Plugin"] = "Tumblr-Plugin aktivieren";
-$a->strings["Tumblr login"] = "Tumblr Login";
-$a->strings["Tumblr password"] = "Tumblr Passwort";
-$a->strings["Post to Tumblr by default"] = "Standardmäßig bei Tumblr veröffentlichen";
-$a->strings["Numfriends settings updated."] = "Numfriends Einstellungen aktualisiert";
-$a->strings["Numfriends Settings"] = "Numfriends Einstellungen";
-$a->strings["How many contacts to display on profile sidebar"] = "Wie viele Kontakte sollen in der Seitenleiste angezeigt werden";
-$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["[Friendica:Notify] Comment to conversation #%d"] = "[Friendica Meldung] Kommentar zum Beitrag #%d";
-$a->strings["Post to Wordpress"] = "Bei WordPress veröffentlichen";
-$a->strings["WordPress Post Settings"] = "WordPress-Beitragseinstellungen";
-$a->strings["Enable WordPress Post Plugin"] = "WordPress-Plugin aktivieren.";
-$a->strings["WordPress username"] = "WordPress-Benutzername";
-$a->strings["WordPress password"] = "WordPress-Passwort";
-$a->strings["WordPress API URL"] = "WordPress-API-URL";
-$a->strings["Post to WordPress by default"] = "Standardmäßig auf WordPress veröffentlichen";
-$a->strings["Provide a backlink to the Friendica post"] = "Einen zurück zum Friendica-Beitrag hinzufügen";
-$a->strings["Read the original post and comment stream on Friendica"] = "Den Original-Beitrag samt Kommentaren bei Friendica lesen";
-$a->strings["\"Show more\" Settings"] = "\"Mehr zeigen\" Einstellungen";
-$a->strings["Enable Show More"] = "Aktiviere \"Mehr zeigen\"";
-$a->strings["Cutting posts after how much characters"] = "Begrenze Beiträge nach einer bestimmten Anzahl an Buchstaben";
-$a->strings["Show More Settings saved."] = "\"Mehr zeigen\" Einstellungen gesichert.";
-$a->strings["This website is tracked using the <a href='http://www.piwik.org'>Piwik</a> analytics tool."] = "Diese Website benutzt <a href='http://www.piwik.org'>Piwik</a>, eine Open Source-Software zur statistischen Auswertung der Besucherzugriffe.";
-$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)."] = "Wenn Du nicht willst, dass Deine Besuche auf diese Weise gespeichert werden, kannst Du <a href='%s'>ein Cookie setzen</a>. Dann wird Piwik Dich auf dieser Website nicht mehr verfolgen (opt-out).";
-$a->strings["Piwik Base URL"] = "Piwik Basis URL";
-$a->strings["Absolute path to your Piwik installation. (without protocol (http/s), with trailing slash)"] = "Absoluter Pfad zu deiner Piwik Installation (ohne Protokoll (http/s) und mit abschließendem Schrägstrich)";
-$a->strings["Site ID"] = "Seiten ID";
-$a->strings["Show opt-out cookie link?"] = "Link zum Setzen des Opt-Out Cookies anzeigen?";
-$a->strings["Asynchronous tracking"] = "Asynchrones Tracken";
-$a->strings["Post to Twitter"] = "Bei Twitter veröffentlichen";
-$a->strings["Twitter settings updated."] = "Twitter Einstellungen aktualisiert.";
-$a->strings["Twitter Posting Settings"] = "Twitter-Beitragseinstellungen";
-$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["Log in with Twitter"] = "bei Twitter anmelden";
-$a->strings["Copy the PIN from Twitter here"] = "Kopiere die Twitter-PIN hier her";
-$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-Beitrag angehängt wird, um auf den Originalbeitrag zu verweisen, den Betrachter auf eine leere Seite führen, die ihn darüber informiert, dass der Zugriff eingeschränkt wurde.";
-$a->strings["Allow posting to Twitter"] = "Veröffentlichung bei Twitter erlauben";
-$a->strings["Send public postings to Twitter by default"] = "Veröffentliche öffentliche Beiträge standardmäßig bei Twitter";
-$a->strings["Send linked #-tags and @-names to Twitter"] = "Sende verlinkte #-Tags und @-Namen nach Twitter";
-$a->strings["Consumer key"] = "Consumer Key";
-$a->strings["Consumer secret"] = "Consumer Secret";
-$a->strings["IRC Settings"] = "IRC Einstellungen";
-$a->strings["Channel(s) to auto connect (comma separated)"] = "mit diesen Kanälen soll man automatisch verbunden werden (Komma getrennt)";
-$a->strings["Popular Channels (comma separated)"] = "Beliebte Kanäle (mit Komma getrennt)";
-$a->strings["IRC settings saved."] = "IRC Einstellungen gespeichert.";
-$a->strings["IRC Chatroom"] = "IRC Chatraum";
-$a->strings["Popular Channels"] = "Beliebte Räume";
-$a->strings["Post to blogger"] = "Auf Blogger posten";
-$a->strings["Blogger Post Settings"] = "Einstellungen zum posten auf Blogger";
-$a->strings["Enable Blogger Post Plugin"] = "Blogger-Post-Plugin aktivieren";
-$a->strings["Blogger username"] = "Blogger-Benutzername";
-$a->strings["Blogger password"] = "Blogger-Passwort";
-$a->strings["Blogger API URL"] = "Blogger-API-URL";
-$a->strings["Post to Blogger by default"] = "Standardmäßig auf Blogger posten";
-$a->strings["Post to Posterous"] = "Nach Posterous senden";
-$a->strings["Posterous Post Settings"] = "Posterous Beitrags-Einstellungen";
-$a->strings["Enable Posterous Post Plugin"] = "Posterous-Plugin aktivieren";
-$a->strings["Posterous login"] = "Posterous-Anmeldename";
-$a->strings["Posterous password"] = "Posterous-Passwort";
-$a->strings["Posterous site ID"] = "Posterous site ID";
-$a->strings["Posterous API token"] = "Posterous API token";
-$a->strings["Post to Posterous by default"] = "Veröffentliche öffentliche Beiträge standardmäßig bei Posterous";
-$a->strings["Theme settings"] = "Themeneinstellungen";
-$a->strings["Set resize level for images in posts and comments (width and height)"] = "Wähle das Vergrößerungsmaß für Bilder in Beiträgen und Kommentaren (Höhe und Breite)";
-$a->strings["Set font-size for posts and comments"] = "Schriftgröße für Beiträge und Kommentare festlegen";
-$a->strings["Set theme width"] = "Theme Breite festlegen";
-$a->strings["Color scheme"] = "Farbschema";
-$a->strings["Your posts and conversations"] = "Deine Beiträge und Unterhaltungen";
-$a->strings["Your profile page"] = "Deine Profilseite";
-$a->strings["Your contacts"] = "Deine Kontakte";
-$a->strings["Your photos"] = "Deine Fotos";
-$a->strings["Your events"] = "Deine Ereignisse";
-$a->strings["Personal notes"] = "Persönliche Notizen";
-$a->strings["Your personal photos"] = "Deine privaten Fotos";
-$a->strings["Community Pages"] = "Foren";
-$a->strings["Community Profiles"] = "Community-Profile";
-$a->strings["Last users"] = "Letzte Nutzer";
-$a->strings["Last likes"] = "Zuletzt gemocht";
-$a->strings["Last photos"] = "Letzte Fotos";
-$a->strings["Find Friends"] = "Freunde finden";
-$a->strings["Local Directory"] = "Lokales Verzeichnis";
-$a->strings["Similar Interests"] = "Ähnliche Interessen";
-$a->strings["Invite Friends"] = "Freunde einladen";
-$a->strings["Earth Layers"] = "Earth Layers";
-$a->strings["Set zoomfactor for Earth Layers"] = "Zoomfaktor der Earth Layer";
-$a->strings["Set longitude (X) for Earth Layers"] = "Longitude (X) der Earth Layer";
-$a->strings["Set latitude (Y) for Earth Layers"] = "Latitude (Y) der Earth Layer";
-$a->strings["Help or @NewHere ?"] = "Hilfe oder @NewHere";
-$a->strings["Connect Services"] = "Verbinde Dienste";
-$a->strings["Last Tweets"] = "Neueste Tweets";
-$a->strings["Set twitter search term"] = "Twitter Suchbegriff";
-$a->strings["don't show"] = "nicht zeigen";
-$a->strings["show"] = "zeigen";
-$a->strings["Show/hide boxes at right-hand column:"] = "Rahmen auf der rechten Seite anzeigen/verbergen";
-$a->strings["Set line-height for posts and comments"] = "Liniengröße für Beiträge und Kommantare festlegen";
-$a->strings["Set resolution for middle column"] = "Auflösung für die Mittelspalte setzen";
-$a->strings["Set color scheme"] = "Wähle Farbschema";
-$a->strings["Set zoomfactor for Earth Layer"] = "Zoomfaktor der Earth Layer";
-$a->strings["Last tweets"] = "Neueste Tweets";
-$a->strings["Alignment"] = "Ausrichtung";
-$a->strings["Left"] = "Links";
-$a->strings["Center"] = "Mitte";
-$a->strings["Set colour scheme"] = "Farbschema wählen";
-$a->strings["Gender:"] = "Geschlecht:";
-$a->strings["j F, Y"] = "j F, Y";
-$a->strings["j F"] = "j F";
-$a->strings["Birthday:"] = "Geburtstag:";
-$a->strings["Age:"] = "Alter:";
-$a->strings["Status:"] = "Status:";
-$a->strings["for %1\$d %2\$s"] = "für %1\$d %2\$s";
-$a->strings["Homepage:"] = "Homepage:";
-$a->strings["Tags:"] = "Tags";
-$a->strings["Religion:"] = "Religion:";
-$a->strings["About:"] = "Ãœber:";
-$a->strings["Hobbies/Interests:"] = "Hobbies/Interessen:";
-$a->strings["Contact information and Social Networks:"] = "Kontaktinformationen und Soziale Netzwerke:";
-$a->strings["Musical interests:"] = "Musikalische Interessen:";
-$a->strings["Books, literature:"] = "Literatur/Bücher:";
-$a->strings["Television:"] = "Fernsehen:";
-$a->strings["Film/dance/culture/entertainment:"] = "Filme/Tänze/Kultur/Unterhaltung:";
-$a->strings["Love/Romance:"] = "Liebesleben:";
-$a->strings["Work/employment:"] = "Arbeit/Beschäftigung:";
-$a->strings["School/education:"] = "Schule/Ausbildung:";
-$a->strings["Unknown | Not categorised"] = "Unbekannt | Nicht kategorisiert";
-$a->strings["Block immediately"] = "Sofort blockieren";
-$a->strings["Shady, spammer, self-marketer"] = "Zwielichtig, Spammer, Selbstdarsteller";
-$a->strings["Known to me, but no opinion"] = "Ist mir bekannt, hab aber keine Meinung";
-$a->strings["OK, probably harmless"] = "OK, wahrscheinlich harmlos";
-$a->strings["Reputable, has my trust"] = "Seriös, hat mein Vertrauen";
-$a->strings["Frequently"] = "immer wieder";
-$a->strings["Hourly"] = "Stündlich";
-$a->strings["Twice daily"] = "Zweimal täglich";
-$a->strings["Daily"] = "Täglich";
-$a->strings["Weekly"] = "Wöchentlich";
-$a->strings["Monthly"] = "Monatlich";
-$a->strings["OStatus"] = "OStatus";
-$a->strings["RSS/Atom"] = "RSS/Atom";
-$a->strings["Zot!"] = "Zott";
-$a->strings["LinkedIn"] = "LinkedIn";
-$a->strings["XMPP/IM"] = "XMPP/Chat";
-$a->strings["MySpace"] = "MySpace";
-$a->strings["Male"] = "Männlich";
-$a->strings["Female"] = "Weiblich";
-$a->strings["Currently Male"] = "Momentan männlich";
-$a->strings["Currently Female"] = "Momentan weiblich";
-$a->strings["Mostly Male"] = "Hauptsächlich männlich";
-$a->strings["Mostly Female"] = "Hauptsächlich weiblich";
-$a->strings["Transgender"] = "Transgender";
-$a->strings["Intersex"] = "Intersex";
-$a->strings["Transsexual"] = "Transsexuell";
-$a->strings["Hermaphrodite"] = "Hermaphrodit";
-$a->strings["Neuter"] = "Neuter";
-$a->strings["Non-specific"] = "Nicht spezifiziert";
-$a->strings["Other"] = "Andere";
-$a->strings["Undecided"] = "Unentschieden";
-$a->strings["Males"] = "Männer";
-$a->strings["Females"] = "Frauen";
-$a->strings["Gay"] = "Schwul";
-$a->strings["Lesbian"] = "Lesbisch";
-$a->strings["No Preference"] = "Keine Vorlieben";
-$a->strings["Bisexual"] = "Bisexuell";
-$a->strings["Autosexual"] = "Autosexual";
-$a->strings["Abstinent"] = "Abstinent";
-$a->strings["Virgin"] = "Jungfrauen";
-$a->strings["Deviant"] = "Deviant";
-$a->strings["Fetish"] = "Fetish";
-$a->strings["Oodles"] = "Oodles";
-$a->strings["Nonsexual"] = "Nonsexual";
-$a->strings["Single"] = "Single";
-$a->strings["Lonely"] = "Einsam";
-$a->strings["Available"] = "Verfügbar";
-$a->strings["Unavailable"] = "Nicht verfügbar";
-$a->strings["Has crush"] = "verknallt";
-$a->strings["Infatuated"] = "verliebt";
-$a->strings["Dating"] = "Dating";
-$a->strings["Unfaithful"] = "Untreu";
-$a->strings["Sex Addict"] = "Sexbesessen";
-$a->strings["Friends"] = "Freunde";
-$a->strings["Friends/Benefits"] = "Freunde/Zuwendungen";
-$a->strings["Casual"] = "Casual";
-$a->strings["Engaged"] = "Verlobt";
-$a->strings["Married"] = "Verheiratet";
-$a->strings["Imaginarily married"] = "imaginär verheiratet";
-$a->strings["Partners"] = "Partner";
-$a->strings["Cohabiting"] = "zusammenlebend";
-$a->strings["Common law"] = "wilde Ehe";
-$a->strings["Happy"] = "Glücklich";
-$a->strings["Not looking"] = "Nicht auf der Suche";
-$a->strings["Swinger"] = "Swinger";
-$a->strings["Betrayed"] = "Betrogen";
-$a->strings["Separated"] = "Getrennt";
-$a->strings["Unstable"] = "Unstabil";
-$a->strings["Divorced"] = "Geschieden";
-$a->strings["Imaginarily divorced"] = "imaginär geschieden";
-$a->strings["Widowed"] = "Verwitwet";
-$a->strings["Uncertain"] = "Unsicher";
-$a->strings["It's complicated"] = "Ist kompliziert";
-$a->strings["Don't care"] = "Ist mir nicht wichtig";
-$a->strings["Ask me"] = "Frag mich";
-$a->strings["Starts:"] = "Beginnt:";
-$a->strings["Finishes:"] = "Endet:";
-$a->strings["(no subject)"] = "(kein Betreff)";
-$a->strings["noreply"] = "noreply";
-$a->strings["prev"] = "vorige";
-$a->strings["first"] = "erste";
-$a->strings["last"] = "letzte";
-$a->strings["next"] = "nächste";
-$a->strings["No contacts"] = "Keine Kontakte";
-$a->strings["%d Contact"] = array(
- 0 => "%d Kontakt",
- 1 => "%d Kontakte",
-);
-$a->strings["Monday"] = "Montag";
-$a->strings["Tuesday"] = "Dienstag";
-$a->strings["Wednesday"] = "Mittwoch";
-$a->strings["Thursday"] = "Donnerstag";
-$a->strings["Friday"] = "Freitag";
-$a->strings["Saturday"] = "Samstag";
-$a->strings["Sunday"] = "Sonntag";
-$a->strings["January"] = "Januar";
-$a->strings["February"] = "Februar";
-$a->strings["March"] = "März";
-$a->strings["April"] = "April";
-$a->strings["May"] = "Mai";
-$a->strings["June"] = "Juni";
-$a->strings["July"] = "Juli";
-$a->strings["August"] = "August";
-$a->strings["September"] = "September";
-$a->strings["October"] = "Oktober";
-$a->strings["November"] = "November";
-$a->strings["December"] = "Dezember";
-$a->strings["bytes"] = "Byte";
-$a->strings["remove"] = "löschen";
-$a->strings["[remove]"] = "[löschen]";
-$a->strings["Categories:"] = "Kategorien:";
-$a->strings["Filed under:"] = "Abgelegt unter:";
-$a->strings["Click to open/close"] = "Zum öffnen/schließen klicken";
-$a->strings["default"] = "standard";
-$a->strings["Select an alternate language"] = "Alternative Sprache auswählen";
-$a->strings["activity"] = "Aktivität";
-$a->strings["comment"] = "Kommentar";
-$a->strings["post"] = "Beitrag";
-$a->strings["Item filed"] = "Beitrag abgelegt";
-$a->strings["Sharing notification from Diaspora network"] = "Freigabe-Benachrichtigung von Diaspora";
-$a->strings["Attachments:"] = "Anhänge:";
-$a->strings["view full size"] = "Volle Größe anzeigen";
-$a->strings["Embedded content"] = "Eingebetteter Inhalt";
-$a->strings["Embedding disabled"] = "Einbettungen deaktiviert";
-$a->strings["A deleted group with this name was revived. Existing item permissions <strong>may</strong> apply to this group and any future members. If this is not what you intended, please create another group with a different name."] = "Eine gelöschte Gruppe mit diesem Namen wurde wiederbelebt. Bestehende Berechtigungseinstellungen <strong>könnten</strong> auf diese Gruppe oder zukünftige Mitglieder angewandt werden. Falls du dies nicht möchtest, erstelle bitte eine andere Gruppe mit einem anderen Namen.";
-$a->strings["Default privacy group for new contacts"] = "Voreingestellte Gruppe für neue Kontakte";
-$a->strings["Everybody"] = "Alle Kontakte";
-$a->strings["edit"] = "bearbeiten";
-$a->strings["Groups"] = "Gruppen";
-$a->strings["Edit group"] = "Gruppe bearbeiten";
-$a->strings["Create a new group"] = "Neue Gruppe erstellen";
-$a->strings["Contacts not in any group"] = "Kontakte in keiner Gruppe";
-$a->strings["Logout"] = "Abmelden";
-$a->strings["End this session"] = "Diese Sitzung beenden";
-$a->strings["Status"] = "Status";
-$a->strings["Sign in"] = "Anmelden";
-$a->strings["Home Page"] = "Homepage";
-$a->strings["Create an account"] = "Nutzerkonto erstellen";
-$a->strings["Help and documentation"] = "Hilfe und Dokumentation";
-$a->strings["Apps"] = "Apps";
-$a->strings["Addon applications, utilities, games"] = "Addon Anwendungen, Dienstprogramme, Spiele";
-$a->strings["Search site content"] = "Inhalt der Seite durchsuchen";
-$a->strings["Conversations on this site"] = "Unterhaltungen auf dieser Seite";
-$a->strings["Directory"] = "Verzeichnis";
-$a->strings["People directory"] = "Nutzerverzeichnis";
-$a->strings["Conversations from your friends"] = "Unterhaltungen deiner Kontakte";
-$a->strings["Friend Requests"] = "Kontaktanfragen";
-$a->strings["See all notifications"] = "Alle Benachrichtigungen anzeigen";
-$a->strings["Mark all system notifications seen"] = "Markiere alle Systembenachrichtigungen als gelesen";
-$a->strings["Private mail"] = "Private Email";
-$a->strings["Inbox"] = "Eingang";
-$a->strings["Outbox"] = "Ausgang";
-$a->strings["Manage"] = "Verwalten";
-$a->strings["Manage other pages"] = "Andere Seiten verwalten";
-$a->strings["Profiles"] = "Profile";
-$a->strings["Manage/edit profiles"] = "Profile verwalten/editieren";
-$a->strings["Manage/edit friends and contacts"] = "Freunde und Kontakte verwalten/editieren";
-$a->strings["Site setup and configuration"] = "Einstellungen der Seite und Konfiguration";
-$a->strings["Nothing new here"] = "Keine Neuigkeiten.";
-$a->strings["Add New Contact"] = "Neuen Kontakt hinzufügen";
-$a->strings["Enter address or web location"] = "Adresse oder Web-Link eingeben";
-$a->strings["Example: bob@example.com, http://example.com/barbara"] = "Beispiel: bob@example.com, http://example.com/barbara";
-$a->strings["%d invitation available"] = array(
- 0 => "%d Einladung verfügbar",
- 1 => "%d Einladungen verfügbar",
-);
-$a->strings["Find People"] = "Leute finden";
-$a->strings["Enter name or interest"] = "Name oder Interessen eingeben";
-$a->strings["Connect/Follow"] = "Verbinden/Folgen";
-$a->strings["Examples: Robert Morgenstein, Fishing"] = "Beispiel: Robert Morgenstein, Angeln";
-$a->strings["Random Profile"] = "Zufälliges Profil";
-$a->strings["Networks"] = "Netzwerke";
-$a->strings["All Networks"] = "Alle Netzwerke";
-$a->strings["Saved Folders"] = "Gespeicherte Ordner";
-$a->strings["Everything"] = "Alles";
-$a->strings["Categories"] = "Kategorien";
-$a->strings["Logged out."] = "Abgemeldet.";
-$a->strings["We encountered a problem while logging in with the OpenID you provided. Please check the correct spelling of the ID."] = "Beim Versuch dich mit der von dir angegebenen OpenID anzumelden trat ein Problem auf. Bitte überprüfe, dass du die OpenID richtig geschrieben hast.";
-$a->strings["The error message was:"] = "Die Fehlermeldung lautete:";
-$a->strings["Miscellaneous"] = "Verschiedenes";
-$a->strings["year"] = "Jahr";
-$a->strings["month"] = "Monat";
-$a->strings["day"] = "Tag";
-$a->strings["never"] = "nie";
-$a->strings["less than a second ago"] = "vor weniger als einer Sekunde";
-$a->strings["years"] = "Jahre";
-$a->strings["months"] = "Monate";
-$a->strings["week"] = "Woche";
-$a->strings["weeks"] = "Wochen";
-$a->strings["days"] = "Tage";
-$a->strings["hour"] = "Stunde";
-$a->strings["hours"] = "Stunden";
-$a->strings["minute"] = "Minute";
-$a->strings["minutes"] = "Minuten";
-$a->strings["second"] = "Sekunde";
-$a->strings["seconds"] = "Sekunden";
-$a->strings["%1\$d %2\$s ago"] = "%1\$d %2\$s her";
-$a->strings["From: "] = "Von: ";
-$a->strings["$1 wrote:"] = "$1 hat geschrieben:";
-$a->strings["Image/photo"] = "Bild/Foto";
-$a->strings["Cannot locate DNS info for database server '%s'"] = "Kann die DNS Informationen für den Datenbanken Server '%s' nicht ermitteln.";
-$a->strings["[no subject]"] = "[kein Betreff]";
-$a->strings["Visible to everybody"] = "Für jeden sichtbar";
-$a->strings["Friendica Notification"] = "Friendica-Benachrichtigung";
-$a->strings["Thank You,"] = "Danke,";
-$a->strings["%s Administrator"] = "der Administrator von %s";
-$a->strings["%s <!item_type!>"] = "%s <!item_type!>";
-$a->strings["[Friendica:Notify] New mail received at %s"] = "[Friendica Meldung] Neue Nachricht erhalten von %s";
-$a->strings["%1\$s sent you a new private message at %2\$s."] = "%1\$s hat Dir eine neues private Nachricht geschickt auf %2\$s.";
-$a->strings["%1\$s sent you %2\$s."] = "%1\$s schickte Dir %2\$s.";
-$a->strings["a private message"] = "eine private Nachricht";
-$a->strings["Please visit %s to view and/or reply to your private messages."] = "Bitte besuche %s, um deine privaten Nachrichten anzusehen und/oder zu beantworten.";
-$a->strings["%1\$s commented on [url=%2\$s]a %3\$s[/url]"] = "%1\$s kommentierte [url=%2\$s]a %3\$s[/url]";
-$a->strings["%1\$s commented on [url=%2\$s]%3\$s's %4\$s[/url]"] = "%1\$s kommentierte [url=%2\$s]%3\$s's %4\$s[/url]";
-$a->strings["%1\$s commented on [url=%2\$s]your %3\$s[/url]"] = "%1\$s kommentierte [url=%2\$s]Deinen Beitrag %3\$s[/url]";
-$a->strings["[Friendica:Notify] Comment to conversation #%1\$d by %2\$s"] = "[Friendica Meldung] Kommentar zum Beitrag #%1\$d von %2\$s";
-$a->strings["%s commented on an item/conversation you have been following."] = "%s hat einen Beitrag kommentiert, dem du folgst.";
-$a->strings["Please visit %s to view and/or reply to the conversation."] = "Bitte besuche %s, um die Konversation anzusehen und/oder zu kommentieren.";
-$a->strings["[Friendica:Notify] %s posted to your profile wall"] = "[Friendica Meldung] %s hat auf Deine Pinnwand geschrieben";
-$a->strings["%1\$s posted to your profile wall at %2\$s"] = "%1\$s schrieb auf Deine Pinnwand auf %2\$s";
-$a->strings["%1\$s posted to [url=%2s]your wall[/url]"] = "%1\$s schrieb auf [url=%2s]Deine Pinnwand[/url]";
-$a->strings["[Friendica:Notify] %s tagged you"] = "[Friendica Meldung] %s hat Dich erwähnt";
-$a->strings["%1\$s tagged you at %2\$s"] = "%1\$s erwähnte Dich auf %2\$s";
-$a->strings["%1\$s [url=%2s]tagged you[/url]."] = "%1\$s [url=%2s]erwähnte Dich[/url].";
-$a->strings["[Friendica:Notify] %s tagged your post"] = "[Friendica Meldung] %s markierte Deinen Beitrag";
-$a->strings["%1\$s tagged your post at %2\$s"] = "%1\$s erwähnte Deinen Beitrag auf %2\$s";
-$a->strings["%1\$s tagged [url=%2\$s]your post[/url]"] = "%1\$s erwähnte [url=%2\$s]Deinen Beitrag[/url]";
-$a->strings["[Friendica:Notify] Introduction received"] = "[Friendica Meldung] Kontaktanfrage erhalten";
-$a->strings["You've received an introduction from '%1\$s' at %2\$s"] = "Du hast eine Kontaktanfrage erhalten von '%1\$s' auf %2\$s";
-$a->strings["You've received [url=%1\$s]an introduction[/url] from %2\$s."] = "Du hast eine [url=%1\$s]Kontaktanfrage[/url] erhalten von %2\$s.";
-$a->strings["You may visit their profile at %s"] = "Hier kannst du das Profil betrachten: %s";
-$a->strings["Please visit %s to approve or reject the introduction."] = "Bitte besuche %s, um die Kontaktanfrage anzunehmen oder abzulehnen.";
-$a->strings["[Friendica:Notify] Friend suggestion received"] = "[Friendica Meldung] Kontaktvorschlag erhalten";
-$a->strings["You've received a friend suggestion from '%1\$s' at %2\$s"] = "Du hast einen Freunde-Vorschlag erhalten von '%1\$s' auf %2\$s";
-$a->strings["You've received [url=%1\$s]a friend suggestion[/url] for %2\$s from %3\$s."] = "Du hast einen [url=%1\$s]Freunde-Vorschlag[/url] erhalten %2\$s von %3\$s.";
-$a->strings["Name:"] = "Name:";
-$a->strings["Photo:"] = "Foto:";
-$a->strings["Please visit %s to approve or reject the suggestion."] = "Bitte besuche %s, um den Vorschlag zu akzeptieren oder abzulehnen.";
-$a->strings["Connect URL missing."] = "Connect-URL fehlt";
-$a->strings["This site is not configured to allow communications with other networks."] = "Diese Seite ist so konfiguriert, dass keine Kommunikation mit anderen Netzwerken erfolgen kann.";
-$a->strings["No compatible communication protocols or feeds were discovered."] = "Es wurden keine kompatiblen Kommunikationsprotokolle oder Feeds gefunden.";
-$a->strings["The profile address specified does not provide adequate information."] = "Die angegebene Profiladresse liefert unzureichende Informationen.";
-$a->strings["An author or name was not found."] = "Es wurde kein Autor oder Name gefunden.";
-$a->strings["No browser URL could be matched to this address."] = "Zu dieser Adresse konnte keine passende Browser URL gefunden werden.";
-$a->strings["Unable to match @-style Identity Address with a known protocol or email contact."] = "Konnte die @-Adresse mit keinem der bekannten Protokolle oder Email-Kontakte abgleichen.";
-$a->strings["Use mailto: in front of address to force email check."] = "Verwende mailto: vor der Email Adresse um eine Überprüfung der Email Adresse zu erzwingen.";
-$a->strings["The profile address specified belongs to a network which has been disabled on this site."] = "Die Adresse dieses Profils gehört zu einem Netzwerk, mit dem die Kommunikation auf dieser Seite ausgeschaltet wurde.";
-$a->strings["Limited profile. This person will be unable to receive direct/personal notifications from you."] = "Eingeschränktes Profil. Diese Person wird keine direkten/privaten Nachrichten von dir erhalten können.";
-$a->strings["Unable to retrieve contact information."] = "Konnte die Kontaktinformationen nicht empfangen.";
-$a->strings["following"] = "folgen";
-$a->strings["A new person is sharing with you at "] = "Eine neue Person teilt mit dir auf ";
-$a->strings["You have a new follower at "] = "Du hast einen neuen Kontakt auf ";
-$a->strings["Archives"] = "Archiv";
-$a->strings["image/photo"] = "Bild/Foto";
-$a->strings["link"] = "Verweis";
-$a->strings["An invitation is required."] = "Du benötigst eine Einladung.";
-$a->strings["Invitation could not be verified."] = "Die Einladung konnte nicht überprüft werden.";
-$a->strings["Invalid OpenID url"] = "Ungültige OpenID URL";
-$a->strings["Please enter the required information."] = "Bitte trage die erforderlichen Informationen ein.";
-$a->strings["Please use a shorter name."] = "Bitte verwende einen kürzeren Namen.";
-$a->strings["Name too short."] = "Der Name ist zu kurz.";
-$a->strings["That doesn't appear to be your full (First Last) name."] = "Das scheint nicht dein kompletter Name (Vor- und Nachname) zu sein.";
-$a->strings["Your email domain is not among those allowed on this site."] = "Die Domain deiner E-Mail Adresse ist auf dieser Seite nicht erlaubt.";
-$a->strings["Not a valid email address."] = "Keine gültige E-Mail-Adresse.";
-$a->strings["Cannot use that email."] = "Konnte diese E-Mail-Adresse nicht verwenden.";
-$a->strings["Your \"nickname\" can only contain \"a-z\", \"0-9\", \"-\", and \"_\", and must also begin with a letter."] = "Dein Spitzname darf nur aus Buchstaben und Zahlen (\"a-z\",\"0-9\", \"_\" und \"-\") bestehen, außerdem muss er mit einem Buchstaben beginnen.";
-$a->strings["Nickname is already registered. Please choose another."] = "Dieser Spitzname ist bereits vergeben. Bitte wähle einen anderen.";
-$a->strings["Nickname was once registered here and may not be re-used. Please choose another."] = "Dieser Spitzname ist bereits vergeben. Bitte wähle einen anderen.";
-$a->strings["SERIOUS ERROR: Generation of security keys failed."] = "FATALER FEHLER: Sicherheitsschlüssel konnten nicht erzeugt werden.";
-$a->strings["An error occurred during registration. Please try again."] = "Wärend der Anmeldung ist ein Fehler aufgetreten. Bitte versuche es noch einmal.";
-$a->strings["An error occurred creating your default profile. Please try again."] = "Bei der Erstellung des Standardprofils ist ein Fehler aufgetreten. Bitte versuche es noch einmal.";
-$a->strings["Welcome "] = "Willkommen ";
-$a->strings["Please upload a profile photo."] = "Bitte lade ein Profilbild hoch.";
-$a->strings["Welcome back "] = "Willkommen zurück ";
-$a->strings["The form security token was not correct. This probably happened because the form has been opened for too long (>3 hours) before submitting it."] = "Das Sicherheitsmerkmal war nicht korrekt. Das passiert meistens wenn das Formular vor dem Absenden zu lange geöffnet war (länger als 3 Stunden).";
-$a->strings["stopped following"] = "wird nicht mehr gefolgt";
-$a->strings["View Status"] = "Pinnwand anschauen";
-$a->strings["View Profile"] = "Profil anschauen";
-$a->strings["View Photos"] = "Bilder anschauen";
-$a->strings["Network Posts"] = "Netzwerkbeiträge";
-$a->strings["Edit Contact"] = "Kontakt bearbeiten";
-$a->strings["Send PM"] = "Private Nachricht senden";
-$a->strings["post/item"] = "Nachricht/Beitrag";
-$a->strings["%1\$s marked %2\$s's %3\$s as favorite"] = "%1\$s hat %2\$s\\s %3\$s als Favorit markiert";
-$a->strings["Select"] = "Auswählen";
-$a->strings["View %s's profile @ %s"] = "Das Profil von %s auf %s betrachten.";
-$a->strings["%s from %s"] = "%s von %s";
-$a->strings["View in context"] = "Im Zusammenhang betrachten";
-$a->strings["%d comment"] = array(
- 0 => "%d Kommentar",
- 1 => "%d Kommentare",
-);
-$a->strings["like"] = "mag ich";
-$a->strings["dislike"] = "mag ich nicht";
-$a->strings["Share this"] = "Weitersagen";
-$a->strings["share"] = "Teilen";
-$a->strings["Bold"] = "Fett";
-$a->strings["Italic"] = "Kursiv";
-$a->strings["Underline"] = "Unterstrichen";
-$a->strings["Quote"] = "Zitat";
-$a->strings["Code"] = "Code";
-$a->strings["Image"] = "Bild";
-$a->strings["Link"] = "Verweis";
-$a->strings["Video"] = "Video";
-$a->strings["add star"] = "markieren";
-$a->strings["remove star"] = "Markierung entfernen";
-$a->strings["toggle star status"] = "Markierung umschalten";
-$a->strings["starred"] = "markiert";
-$a->strings["add tag"] = "Tag hinzufügen";
-$a->strings["save to folder"] = "In Ordner speichern";
-$a->strings["to"] = "zu";
-$a->strings["Wall-to-Wall"] = "Wall-to-Wall";
-$a->strings["via Wall-To-Wall:"] = "via Wall-To-Wall:";
-$a->strings["Delete Selected Items"] = "Lösche die markierten Beiträge";
-$a->strings["%s likes this."] = "%s mag das.";
-$a->strings["%s doesn't like this."] = "%s mag das nicht.";
-$a->strings["<span %1\$s>%2\$d people</span> like this."] = "<span %1\$s>%2\$d Leute</span> mögen das.";
-$a->strings["<span %1\$s>%2\$d people</span> don't like this."] = "<span %1\$s>%2\$d Leute</span> mögen das nicht.";
-$a->strings["and"] = "und";
-$a->strings[", and %d other people"] = " und %d andere";
-$a->strings["%s like this."] = "%s mögen das.";
-$a->strings["%s don't like this."] = "%s mögen das nicht.";
-$a->strings["Visible to <strong>everybody</strong>"] = "Für <strong>jedermann</strong> sichtbar";
-$a->strings["Please enter a video link/URL:"] = "Bitte Link/URL zum Video einfügen:";
-$a->strings["Please enter an audio link/URL:"] = "Bitte Link/URL zum Audio einfügen:";
-$a->strings["Tag term:"] = "Tag:";
-$a->strings["Where are you right now?"] = "Wo hältst du dich jetzt gerade auf?";
-$a->strings["upload photo"] = "Bild hochladen";
-$a->strings["attach file"] = "Datei anhängen";
-$a->strings["web link"] = "Weblink";
-$a->strings["Insert video link"] = "Video-Adresse einfügen";
-$a->strings["video link"] = "Video-Link";
-$a->strings["Insert audio link"] = "Audio-Adresse einfügen";
-$a->strings["audio link"] = "Audio-Link";
-$a->strings["set location"] = "Ort setzen";
-$a->strings["clear location"] = "Ort löschen";
-$a->strings["permissions"] = "Zugriffsrechte";
-$a->strings["Delete this item?"] = "Diesen Beitrag löschen?";
-$a->strings["show fewer"] = "weniger anzeigen";
-$a->strings["Update %s failed. See error logs."] = "Update %s fehlgeschlagen. Bitte Fehlerprotokoll überprüfen.";
-$a->strings["Update Error at %s"] = "Updatefehler bei %s";
-$a->strings["Create a New Account"] = "Neues Konto erstellen";
-$a->strings["Nickname or Email address: "] = "Spitzname oder Email-Adresse: ";
-$a->strings["Password: "] = "Passwort: ";
-$a->strings["Or login using OpenID: "] = "Oder melde dich mit deiner OpenID an: ";
+$a->strings["This is your <strong>public</strong> profile.<br />It <strong>may</strong> be visible to anybody using the internet."] = "Dies ist Dein <strong>öffentliches</strong> Profil.<br />Es <strong>könnte</strong> für jeden im Internet sichtbar sein.";
+$a->strings["Edit/Manage Profiles"] = "Bearbeite/Verwalte Profile";
+$a->strings["Add profile things"] = "Profil-Dinge hinzufügen";
+$a->strings["Include desirable objects in your profile"] = "binde begehrenswerte Dinge in dein Profil ein";
+$a->strings["Add a Channel"] = "Channel hinzufügen";
+$a->strings["A channel is your own collection of related web pages. A channel can be used to hold social network profiles, blogs, conversation groups and forums, celebrity pages, and much more. You may create as many channels as your service provider allows."] = "Ein Kanal ist deine eigene Sammlung von verbundenen Webseiten. Ein Kanal kann genutzt werden, um Social Network-Profile, Blogs, Gesprächsgruppen und Foren, Promi-Seiten und viel mehr zu erfassen. Du kannst so viele Kanäle erstellen, wie es der Betreiber deiner Seite zulässt.";
+$a->strings["Examples: \"Bob Jameson\", \"Lisa and her Horses\", \"Soccer\", \"Aviation Group\" "] = "Beispiele: \"Bob Jameson\", \"Lisa and her Horses\", \"Soccer\", \"Aviation Group\" ";
+$a->strings["Choose a short nickname"] = "Wähle einen kurzen Spitznahmen";
+$a->strings["Your nickname will be used to create an easily remembered channel address (like an email address) which you can share with others."] = "Dein Spitzname wird verwendet, um eine einfach zu erinnernde Kanal-Adresse (ähnlich einer E-Mail Adresse) zu erzeugen, die Du mit anderen austauschen kannst.";
+$a->strings["Or <a href=\"import\">import an existing channel</a> from another location"] = "Oder <a href=\"import\">importiere einen bestehenden Kanal</a> von einem anderen Ort";
+$a->strings["Permission Denied."] = "Zugriff verweigert.";
+$a->strings["File not found."] = "Datei nicht gefunden";
+$a->strings["Edit file permissions"] = "Dateiberechtigungen bearbeiten";
+$a->strings["Include all files and sub folders"] = "Alle Dateien und Unterverzeichnisse einbinden";
+$a->strings["Return to file list"] = "Zurück zur Dateiliste";
+$a->strings["Copy/paste this code to attach file to a post"] = "Diesen Code kopieren/einfügen um die Datei an einen Beitrag anzuhängen";
+$a->strings["Copy/paste this URL to link file from a web page"] = "Diese URL verwenden um auf die Datei von einer Webseite aus zu verweisen";
+$a->strings["Download"] = "Download";
+$a->strings["Used: "] = "Verwendet:";
+$a->strings["[directory]"] = "[Verzeichnis]";
+$a->strings["Limit: "] = "Limit:";
+$a->strings["No valid account found."] = "Kein gültiges Konto gefunden.";
+$a->strings["Password reset request issued. Check your email."] = "Zurücksetzen des Passworts veranlasst. Rufe bitte Deine E-Mails ab.";
+$a->strings["Site Member (%s)"] = "Seiten Mitglied (%s)";
+$a->strings["Password reset requested at %s"] = "Passwort Rücksetzung auf %s angefordert";
+$a->strings["Request could not be verified. (You may have previously submitted it.) Password reset failed."] = "Die Anfrage konnte nicht verifiziert werden. (Es könnte sein, dass du vorher bereits eine Anfrage eingereicht hast.) Passwort Anforderung fehlgeschlagen.";
+$a->strings["Password Reset"] = "Zurücksetzen des Kennworts";
+$a->strings["Your password has been reset as requested."] = "Dein Passwort wurde wie angefordert neu erstellt.";
+$a->strings["Your new password is"] = "Dein neues Passwort lautet";
+$a->strings["Save or copy your new password - and then"] = "Speichere oder kopiere dein neues Passwort - und dann";
+$a->strings["click here to login"] = "Klicke hier, um dich anzumelden";
+$a->strings["Your password may be changed from the <em>Settings</em> page after successful login."] = "Dein Passwort kann unter <em>Einstellungen</em> nach einer erfolgreichen Anmeldung geändert werden.";
+$a->strings["Your password has changed at %s"] = "Auf %s wurde dein Passwort geändert";
+$a->strings["Forgot your Password?"] = "Kennwort vergessen?";
+$a->strings["Enter your email address and submit to have your password reset. Then check your email for further instructions."] = "Gib deine E-Mail-Adresse an und fordere ein neues Passwort an. Es werden dir dann weitere Informationen per Mail zugesendet.";
+$a->strings["Email Address"] = "E-Mail Adresse";
+$a->strings["Reset"] = "Zurücksetzen";
+$a->strings["Nothing to import."] = "Nichts zu importieren.";
+$a->strings["Unable to download data from old server"] = "Daten können vom alten Server nicht heruntergeladen werden";
+$a->strings["Imported file is empty."] = "Die importierte Datei ist leer.";
+$a->strings["Cannot create a duplicate channel identifier on this system. Import failed."] = "Kann auf diesem System keinen duplizierten Kanal-Identifikator erzeugen. Import fehlgeschlagen.";
+$a->strings["Channel clone failed. Import failed."] = "Klonen des Kanals fehlgeschlagen. Import fehlgeschlagen.";
+$a->strings["Cloned channel not found. Import failed."] = "Geklonter Kanal nicht gefunden. Import fehlgeschlagen.";
+$a->strings["Import completed."] = "Import abgeschlossen.";
+$a->strings["You must be logged in to use this feature."] = "Du musst angemeldet sein um diese Funktion zu nutzen.";
+$a->strings["Import Channel"] = "Kanal importieren";
+$a->strings["Use this form to import an existing channel from a different server/hub. You may retrieve the channel identity from the old server/hub via the network or provide an export file. Only identity and connections/relationships will be imported. Importation of content is not yet available."] = "Verwende dieses Formular um einen existierenden Kanal von einem anderen Server/Hub zu importieren. Du kannst die Kanal-Identität vom alten Server/Hub über das Netzwerk erhalten oder über eine exportierte Sicherungskopie. Es werden ausschließlich die Identität und die Verbindungen/Beziehungen importiert. Das Importieren von Inhalten ist derzeit nicht möglich.";
+$a->strings["File to Upload"] = "Hochzuladende Datei:";
+$a->strings["Or provide the old server/hub details"] = "Oder gib die Deteils deines alten Server/Hubs an";
+$a->strings["Your old identity address (xyz@example.com)"] = "Die alte Adresse der Identität (xyz@example.com)";
+$a->strings["Your old login email address"] = "Ihre alte Login E-Mail Adresse";
+$a->strings["Your old login password"] = "Ihr altes Login Kennwort";
+$a->strings["For either option, please choose whether to make this hub your new primary address, or whether your old location should continue this role. You will be able to post from either location, but only one can be marked as the primary location for files, photos, and media."] = "Egal welche Option du wählst, bitte lege fest, ob dieser Hub deine neue primäre Adresse sein soll oder ob dein alter Hub diese Rolle weiterhin wahrnimmt. Du kannst von beiden Orten aus neue Dinge posten, aber nur einer kann die primäre Adresse deiner Dateien, Fotos und anderen Mediendaten sein.";
+$a->strings["Make this hub my primary location"] = "Dieser Hub ist mein primärer Server.";
+$a->strings["You have created %1$.0f of %2$.0f allowed channels."] = "Du hast %1$.0f von %2$.0f erlaubten Kanälen eingerichtet.";
+$a->strings["Create a new channel"] = "Erzeuge neues Kanal";
+$a->strings["Channel Manager"] = "Kanal-Manager";
+$a->strings["Current Channel"] = "Aktueller Kanal";
+$a->strings["Attach to one of your channels by selecting it."] = "Wähle einen deiner Kanäle aus um ihn zu verwenden.";
+$a->strings["Default Channel"] = "Standard Kanal";
+$a->strings["Make Default"] = "Zum Standard machen";
+$a->strings["Total votes"] = "Stimmen gesamt";
+$a->strings["Average Rating"] = "durchschnittliche Bewertung";
+$a->strings["Profile Match"] = "Profil-Ãœbereinstimmungen";
+$a->strings["No keywords to match. Please add keywords to your default profile."] = "Keine Schlüsselbegriffe für den Abgleich gefunden. Bitte füge Schlüsselbegriffe zu deinem Standardprofil hinzu.";
+$a->strings["is interested in:"] = "interessiert sich für:";
+$a->strings["No matches"] = "Keine Ãœbereinstimmungen";
+$a->strings["invalid target signature"] = "Ungültige Signatur des Ziels";
+$a->strings["Name is required"] = "Name wird benötigt";
+$a->strings["Key and Secret are required"] = "Schlüssel und Geheimnis werden benötigt";
+$a->strings["Update"] = "Update";
+$a->strings["Passwords do not match. Password unchanged."] = "Kennwörter stimmen nicht überein. Kennwort nicht verändert.";
+$a->strings["Empty passwords are not allowed. Password unchanged."] = "Leere Kennwörter sind nicht erlaubt. Kennwort nicht verändert.";
+$a->strings["Password changed."] = "Kennwort geändert.";
+$a->strings["Password update failed. Please try again."] = "Kennwortänderung fehlgeschlagen. Bitte versuche es noch einmal.";
+$a->strings["Not valid email."] = "Keine gültige E-Mail Adresse.";
+$a->strings["Protected email address. Cannot change to that email."] = "Geschützte E-Mail Adresse. Diese kann nicht verändert werden.";
+$a->strings["System failure storing new email. Please try again."] = "Systemfehler während des Speicherns der neuen Mail. Bitte versuche es noch einmal.";
+$a->strings["Settings updated."] = "Einstellungen aktualisiert.";
+$a->strings["Add application"] = "Anwendung hinzufügen";
+$a->strings["Name of application"] = "Name der Anwendung";
+$a->strings["Consumer Key"] = "Consumer Key";
+$a->strings["Automatically generated - change if desired. Max length 20"] = "Automatisch erzeugt - ändern falls erwünscht. Maximale Länge 20";
+$a->strings["Consumer Secret"] = "Consumer Secret";
+$a->strings["Redirect"] = "Umleitung";
+$a->strings["Redirect URI - leave blank unless your application specifically requires this"] = "Umleitungs-URl - lasse dies frei außer deine Anwendung erfordert dies explizit";
+$a->strings["Icon url"] = "Symbol-URL";
+$a->strings["Optional"] = "Optional";
+$a->strings["You can't edit this application."] = "Diese Anwendung kann nicht bearbeitet werden.";
+$a->strings["Connected Apps"] = "Verbundene Apps";
+$a->strings["Client key starts with"] = "Client key beginnt mit";
+$a->strings["No name"] = "Kein Name";
+$a->strings["Remove authorization"] = "Authorisierung aufheben";
+$a->strings["No feature settings configured"] = "Keine Funktions-Einstellungen konfiguriert";
+$a->strings["Feature Settings"] = "Funktions-Einstellungen";
+$a->strings["Account Settings"] = "Konto-Einstellungen";
+$a->strings["Password Settings"] = "Kennwort-Einstellungen";
+$a->strings["New Password:"] = "Neues Passwort:";
+$a->strings["Confirm:"] = "Bestätigen:";
+$a->strings["Leave password fields blank unless changing"] = "Lasse die Passwort -Felder leer außer du möchtest das Passwort ändern";
+$a->strings["Email Address:"] = "Email Adresse:";
+$a->strings["Remove Account"] = "Konto entfernen";
+$a->strings["Warning: This action is permanent and cannot be reversed."] = "Achtung: Diese Aktion ist permanent und kann nicht rückgänging gemacht werden.";
+$a->strings["Off"] = "Aus";
+$a->strings["On"] = "An";
+$a->strings["Additional Features"] = "Zusätzliche Funktionen";
+$a->strings["Connector Settings"] = "Connector-Einstellungen";
+$a->strings["Display Settings"] = "Anzeige-Einstellungen";
+$a->strings["Display Theme:"] = "Anzeige Theme:";
+$a->strings["Mobile Theme:"] = "Mobile Theme:";
+$a->strings["Update browser every xx seconds"] = "Browser alle xx Sekunden aktualisieren";
+$a->strings["Minimum of 10 seconds, no maximum"] = "Minimum von 10 Sekunden, kein Maximum";
+$a->strings["Maximum number of conversations to load at any time:"] = "Maximale Anzahl von Unterhaltungen die gleichzeitig geladen werden sollen:";
+$a->strings["Maximum of 100 items"] = "Maximum von 100 Beiträgen";
+$a->strings["Don't show emoticons"] = "Emoticons nicht zeigen";
+$a->strings["Nobody except yourself"] = "Niemand außer du selbst";
+$a->strings["Only those you specifically allow"] = "Nur die, denen du es explizit erlaubst";
+$a->strings["Anybody in your address book"] = "Jeder aus Ihrem Adressbuch";
+$a->strings["Anybody on this website"] = "Jeder auf dieser Website";
+$a->strings["Anybody in this network"] = "Jeder in diesem Netzwerk";
+$a->strings["Anybody on the internet"] = "Jeder im Internet";
+$a->strings["Publish your default profile in the network directory"] = "Veröffentliche dein Standard-Profil im Netzwerk-Verzeichnis";
+$a->strings["Allow us to suggest you as a potential friend to new members?"] = "Dürfen wir dich neuen Mitgliedern als potentiellen Kontakt vorschlagen?";
+$a->strings["or"] = "oder";
+$a->strings["Your channel address is"] = "Deine Kanal-Adresse lautet";
+$a->strings["Channel Settings"] = "Channel-Einstellungen";
+$a->strings["Basic Settings"] = "Grundeinstellungen";
+$a->strings["Your Timezone:"] = "Ihre Zeitzone:";
+$a->strings["Default Post Location:"] = "Standardstandort:";
+$a->strings["Use Browser Location:"] = "Standort des Browsers verwenden:";
+$a->strings["Adult Content"] = "Nicht Jugendfreie-Inhalte";
+$a->strings["This channel publishes adult content."] = "Dieser Kanal veröffentlicht nicht Jugendfreie-Inhalte";
+$a->strings["Security and Privacy Settings"] = "Sicherheits- und Datenschutz-Einstellungen";
+$a->strings["Quick Privacy Settings:"] = "Schnelle Datenschutz-Einstellungen:";
+$a->strings["Very Public - extremely permissive"] = "Sehr offen - extrem freizügig";
+$a->strings["Typical - default public, privacy when desired"] = "Typisch - Standard öffentlich, Privatheit wenn gewünscht";
+$a->strings["Private - default private, rarely open or public"] = "Privat - Standard privat, selten offen oder öffentlich";
+$a->strings["Blocked - default blocked to/from everybody"] = "Geschlossen - Standard zu und von jedem geblockt";
+$a->strings["Maximum Friend Requests/Day:"] = "Maximale Kontaktanfragen pro Tag:";
+$a->strings["May reduce spam activity"] = "Kann die Spam-Aktivität verringern";
+$a->strings["Default Post Permissions"] = "Beitragszugriffrechte Standardeinstellungen";
+$a->strings["Maximum private messages per day from unknown people:"] = "Maximale Anzahl privater Nachrichten pro Tag von unbekannten Leuten:";
+$a->strings["Useful to reduce spamming"] = "Nützlich um Spam zu verringern";
+$a->strings["Notification Settings"] = "Benachrichtigungs-Einstellungen";
+$a->strings["By default post a status message when:"] = "Sende standardmäßig Status-Nachrichten wenn:";
+$a->strings["accepting a friend request"] = "einer Kontaktanfrage stattgegeben wurde";
+$a->strings["joining a forum/community"] = "ein Forum beigetreten wurde";
+$a->strings["making an <em>interesting</em> profile change"] = "eine <em>interessante</em> Änderung am Profil vorgenommen wurde";
+$a->strings["Send a notification email when:"] = "Eine Email Benachrichtigung senden wenn:";
+$a->strings["You receive an introduction"] = "Du eine Vorstellung erhältst";
+$a->strings["Your introductions are confirmed"] = "Deine Vorstellung bestätigt wurde.";
+$a->strings["Someone writes on your profile wall"] = "Jemand auf deine Pinnwand schreibt";
+$a->strings["Someone writes a followup comment"] = "Jemand einen Beitrag kommentiert";
+$a->strings["You receive a private message"] = "Du eine private Nachricht erhältst";
+$a->strings["You receive a friend suggestion"] = "Du einen Kontaktvorschlag erhältst";
+$a->strings["You are tagged in a post"] = "Du wurdest in einem Beitrag getaggt";
+$a->strings["You are poked/prodded/etc. in a post"] = "Du in einer Nachricht angestupst/geknufft/o.ä. wirst";
+$a->strings["Advanced Account/Page Type Settings"] = "Erweiterte Account / Seiten Arten Einstellungen";
+$a->strings["Change the behaviour of this account for special situations"] = "Ändere das Verhalten dieses Accounts unter speziellen Umständen";
+$a->strings["Unable to lookup recipient."] = "Konnte den Empfänger nicht finden.";
+$a->strings["Unable to communicate with requested channel."] = "Die Kommunikation mit dem ausgewählten Kanal ist fehlgeschlagen.";
+$a->strings["Cannot verify requested channel."] = "Verifizierung des angeforderten Kanals fehlgeschlagen.";
+$a->strings["Selected channel has private message restrictions. Send failed."] = "Der ausgewählte Kanal hat Einschränkungen bzgl. privater Nachrichten. Senden fehlgeschlagen.";
+$a->strings["Messages"] = "Nachrichten";
+$a->strings["Message deleted."] = "Nachricht gelöscht.";
+$a->strings["Message recalled."] = "Nachricht widerrufen.";
+$a->strings["Send Private Message"] = "Private Nachricht senden";
+$a->strings["To:"] = "An:";
+$a->strings["Subject:"] = "Betreff:";
+$a->strings["Message not found."] = "Nachricht nicht gefunden.";
+$a->strings["Delete message"] = "Nachricht löschen";
+$a->strings["Recall message"] = "Widerrufe die Nachricht";
+$a->strings["Message has been recalled."] = "Die Nachricht wurde widerrufen.";
+$a->strings["Private Conversation"] = "Private Unterhaltung";
+$a->strings["Delete conversation"] = "Unterhaltung löschen";
+$a->strings["No secure communications available. You <strong>may</strong> be able to respond from the sender's profile page."] = "Keine sichere Kommunikation verfügbar. <strong>Eventuell</strong> kannst du von der Profilseite des Absenders antworten.";
+$a->strings["Send Reply"] = "Antwort senden";
+$a->strings["Item not found"] = "Element nicht gefunden";
+$a->strings["Edit Layout"] = "Layout bearbeiten";
+$a->strings["Insert YouTube video"] = "YouTube-Video einfügen";
+$a->strings["Insert Vorbis [.ogg] video"] = "Vorbis [.ogg]-Video einfügen";
+$a->strings["Insert Vorbis [.ogg] audio"] = "Vorbis [.ogg]-Audio einfügen";
+$a->strings["Delete Layout"] = "Layout löschen";
+$a->strings["Image uploaded but image cropping failed."] = "Bild hochgeladen, aber das zurecht schneiden schlug fehl.";
+$a->strings["Image resize failed."] = "Bild-Anpassung fehlgeschlagen.";
+$a->strings["Shift-reload the page or clear browser cache if the new photo does not display immediately."] = "Leere den Browser Cache oder nutze Umschalten-Neu Laden sollte das neue Foto nicht sofort angezeigt werden.";
+$a->strings["Image exceeds size limit of %d"] = "Bild ist größer als das Limit von %d";
+$a->strings["Unable to process image."] = "Kann Bild nicht verarbeiten.";
+$a->strings["Photo not available."] = "Foto nicht verfügbar.";
+$a->strings["Upload File:"] = "Datei hochladen:";
+$a->strings["Select a profile:"] = "Wählen Sie ein Profil:";
+$a->strings["Upload Profile Photo"] = "Lade neues Profilfoto hoch";
+$a->strings["Upload"] = "Hochladen";
+$a->strings["skip this step"] = "diesen Schritt überspringen";
+$a->strings["select a photo from your photo albums"] = "ein Foto aus meinen Fotoalben";
+$a->strings["Crop Image"] = "Bild zuschneiden";
+$a->strings["Please adjust the image cropping for optimum viewing."] = "Bitte passe das Bild zur optimalen Anzeige an.";
+$a->strings["Done Editing"] = "Bearbeitung fertigstellen";
+$a->strings["Image uploaded successfully."] = "Bild erfolgreich hochgeladen.";
+$a->strings["Image upload failed."] = "Hochladen des Bilds fehlgeschlagen.";
+$a->strings["Image size reduction [%s] failed."] = "Reduzierung der Bildgröße [%s] fehlgeschlagen.";
+$a->strings["Item is not editable"] = "Element kann nicht bearbeitet werden.";
+$a->strings["Delete item?"] = "Eintrag löschen?";
+$a->strings["Invalid request identifier."] = "Ungültige Anfrage Identifikator.";
+$a->strings["Discard"] = "Verwerfen";
+$a->strings["No more system notifications."] = "Keine System-Benachrichtigungen mehr.";
+$a->strings["System Notifications"] = "System-Benachrichtigungen";
+$a->strings["Block Name"] = "Block Name";
+$a->strings["Unable to find your hub."] = "Konnte den Hub nicht finden.";
+$a->strings["Post successful."] = "Veröffentlichung erfolgreich.";
+$a->strings["Edit Webpage"] = "Webseite bearbeiten";
+$a->strings["Delete webpage?"] = "Webseite löschen?";
+$a->strings["Delete Webpage"] = "Webseite löschen";
+$a->strings["Access to this profile has been restricted."] = "Der Zugang zu diesem Profil ist begrenzt.";
+$a->strings["Poke/Prod"] = "Anstupsen/Kuffen";
+$a->strings["poke, prod or do other things to somebody"] = "Stupse Leute an oder mache anderes mit ihnen";
+$a->strings["Recipient"] = "Empfänger";
+$a->strings["Choose what you wish to do to recipient"] = "Wähle was du mit dem/r Empfänger/in tun willst";
+$a->strings["Make this post private"] = "Diesen Beitrag privat machen";
+$a->strings["Wall Photos"] = "Wall Fotos";
+$a->strings["You must be logged in to see this page."] = "Du musst angemeldet sein um diese Seite betrachten zu können.";
+$a->strings["Insufficient permissions. Request redirected to profile page."] = "Unzureichende Zugriffsrechte. Die Anfrage wurde zur Profil-Seite umgeleitet.";
+$a->strings["Not available."] = "Nicht verfügbar.";
+$a->strings["Community"] = "Gemeinschaft";
+$a->strings["No results."] = "Keine Ergebnisse.";
+$a->strings["Contact not found."] = "Kontakt nicht gefunden";
+$a->strings["Friend suggestion sent."] = "Freundschaftsempfehlung senden.";
+$a->strings["Suggest Friends"] = "Kontakte Vorschlagen";
+$a->strings["Suggest a friend for %s"] = "Schlage %s einen Kontakt vor";
+$a->strings["Edit Block"] = "Block bearbeiten";
+$a->strings["Delete Block"] = "Block löschen";
+$a->strings["Invalid profile identifier."] = "Ungültiger Profil Identifikator";
+$a->strings["Profile Visibility Editor"] = "Profil-Sichtbarkeits Editor";
+$a->strings["Click on a contact to add or remove."] = "Wähle einen Kontakt zum Hinzufügen oder Löschen aus.";
+$a->strings["Visible To"] = "Sichtbar für";
+$a->strings["All Contacts (with secure profile access)"] = "Alle Kontakte (mit sicherem Zuging zum Profil)";
+$a->strings["Version %s"] = "Version %s";
+$a->strings["Installed plugins/addons/apps:"] = "Installierte Plugins/Addons/Apps";
+$a->strings["No installed plugins/addons/apps"] = "Keine installierten Plugins/Addons/Apps";
+$a->strings["Red"] = "Red";
+$a->strings["This is a hub of the Red Matrix - a global cooperative network of decentralised privacy enhanced websites."] = "Dieser Server ist Teil der Red-Matrix – einem global vernetzten Verbund aus dezentralen Websites mit Rücksicht auf die Privatsphäre.";
+$a->strings["Running at web location"] = "Erreichbar unter der Web-Adresse";
+$a->strings["Please visit <a href=\"http://getzot.com\">GetZot.com</a> to learn more about the Red Matrix."] = "Besuche <a href=\"http://getzot.com\">GetZot.com</a> um mehr über die Red Matrix zu erfahren.";
+$a->strings["Bug reports and issues: please visit"] = "Probleme oder Fehler gefunden? Bitte besuche";
+$a->strings["Suggestions, praise, donations, etc. - please email \"redmatrix\" at librelist - dot com"] = "Vorschläge, Lob, Spenden usw.: E-Mail an 'redmatrix' at librelist - dot - com";
+$a->strings["No suggestions available. If this is a new site, please try again in 24 hours."] = "Keine Vorschläge vorhanden. Wenn dies eine neue Seite ist versuche es bitte in 24 Stunden erneut.";
+$a->strings["Conversation removed."] = "Unterhaltung gelöscht.";
+$a->strings["No messages."] = "Keine Nachrichten.";
+$a->strings["D, d M Y - g:i A"] = "D, d. M Y - g:i A";
+$a->strings["Public Sites"] = "Öffentliche Seiten";
+$a->strings["The listed sites allow public registration into the Red Matrix. All sites in the matrix are interlinked so membership on any of them conveys membership in the matrix as a whole. Some sites may require subscription or provide tiered service plans. The provider links <strong>may</strong> provide additional details."] = "Die hier aufgeführten Seiten erlauben dir einen Account in der Red Matrix anzulegen. Alle Seiten der Matrix sind mit einander verbunden, so dass die Mitgliedschaft auf einer Seite die Mitgliedschaft auf einer beliebigen anderen Seite der Matrix beinhaltet. Es könnte sein, dass einige dieser Seiten Abonnements benötigen oder abgestufte Service-Pläne anbieten. Auf den jeweiligen Seiten <strong>könnten</strong> nähere Details diesbezüglich stehen.";
+$a->strings["Site URL"] = "URL der Seite";
+$a->strings["Access Type"] = "Zugangs Typ";
+$a->strings["Registration Policy"] = "Registrierungsrichtlinien";
+$a->strings["Maximum daily site registrations exceeded. Please try again tomorrow."] = "Maximale Anzahl von Neuanmeldungen erreicht. Bitte versuche es morgen noch einmal.";
+$a->strings["Please indicate acceptance of the Terms of Service. Registration failed."] = "Bitte stimme den Nutzungsbedingungen zu. Anmeldung fehlgeschlagen.";
+$a->strings["Passwords do not match."] = "Passwörter stimmen nicht überein.";
+$a->strings["Registration successful. Please check your email for validation instructions."] = "Registrierung erfolgreich. Eine E-Mail mit weiteren Anweisungen wurde an dich gesendet.";
+$a->strings["Your registration is pending approval by the site owner."] = "Deine Registrierung muss noch vom Betreiber der Seite freigegeben werden.";
+$a->strings["Your registration can not be processed."] = "Deine Registrierung konnte nicht verarbeitet werden.";
+$a->strings["Registration on this site/hub is by approval only."] = "Anmeldungen auf dieser Seite / diesem Hub benötigen Zustimmung durch den Administrator";
+$a->strings["<a href=\"pubsites\">Register at another affiliated site/hub</a>"] = "<a href=\"pubsites\">Registrierung auf einer angeschlossenen Seite</a>";
+$a->strings["This site has exceeded the number of allowed daily account registrations. Please try again tomorrow."] = "Die maximale Anzahl täglicher Registrierungen auf dieser Seite wurde überschritten. Bitte versuche es morgen noch einmal.";
+$a->strings["Terms of Service"] = "Nutzungsbedingungen";
+$a->strings["I accept the %s for this website"] = "Ich akzeptiere die %s für diese Webseite";
+$a->strings["I am over 13 years of age and accept the %s for this website"] = "Ich bin älter als 13 Jahre und akzeptiere die %s dieser Webseite";
+$a->strings["Membership on this site is by invitation only."] = "Mitgliedschaft auf dieser Seite ist nur nach vorheriger Einladung möglich.";
+$a->strings["Please enter your invitation code"] = "Bitte trage deinen Einladungs-Code ein";
+$a->strings["Your email address"] = "Ihre E-Mail Adresse";
+$a->strings["Choose a password"] = "Passwort";
+$a->strings["Please re-enter your password"] = "Bitte gib dein Passwort noch einmal ein";
+$a->strings["Please login."] = "Bitte melde dich an.";
+$a->strings["Remove This Channel"] = "Diesen Kanal löschen!";
+$a->strings["This will completely remove this channel from the network. Once this has been done it is not recoverable."] = "Hiermit wird dieser Kanal komplett aus dem Netzwerk gelöscht. Einmal eingeleitet ist dieser Prozess nicht widerrufbar.";
+$a->strings["Please enter your password for verification:"] = "Bitte gib zur Bestätigung dein Passwort ein:";
+$a->strings["Remove this channel and all its clones from the network"] = "Lösche diesen Kanal und all seine Klone aus dem Netzwerk";
+$a->strings["By default only the instance of the channel located on this hub will be removed from the network"] = "Standartmäßig wird der Kanal nur auf diesem Knoten gelöscht, seine Klone verbleiben im Netzwerk";
+$a->strings["Remove My Account"] = "Mein Konto entfernen";
+$a->strings["Unable to locate original post."] = "Originalbeitrag kann nicht gefunden werden.";
+$a->strings["Empty post discarded."] = "Leerer Beitrag verworfen.";
+$a->strings["Executable content type not permitted to this channel."] = "Ausführbarer Content-Typ ist für diesen Kanal nicht freigegeben.";
+$a->strings["System error. Post not saved."] = "Systemfehler. Beitrag nicht gespeichert.";
+$a->strings["You have reached your limit of %1$.0f top level posts."] = "Du hast die maximale Anzahl von %1$.0f Beiträgen erreicht.";
+$a->strings["You have reached your limit of %1$.0f webpages."] = "Du hast die maximale Anzahl von %1$.0f Webseiten erreicht.";
+$a->strings["Mood"] = "Laune";
+$a->strings["Set your current mood and tell your friends"] = "Wähle deine aktuelle Stimmung und erzähle sie deinen Freunden";
+$a->strings["sent you a private message"] = "eine private Nachricht schicken";
+$a->strings["added your channel"] = "hat deinen Kanal hinzugefügt";
+$a->strings["posted an event"] = "hat eine Veranstaltung veröffentlicht";
+$a->strings["Status: "] = "Status:";
+$a->strings["Sexual Preference: "] = "Sexuelle Vorlieben:";
+$a->strings["Homepage: "] = "Webseite:";
+$a->strings["Hometown: "] = "Wohnort:";
+$a->strings["About: "] = "Ãœber:";
+$a->strings["Keywords: "] = "Schlüsselbegriffe:";
+$a->strings["Scheme Default"] = "Standard-Schema";
+$a->strings["red"] = "Rot";
+$a->strings["black"] = "Schwarz";
+$a->strings["silver"] = "Silber";
+$a->strings["Theme settings"] = "Theme-Einstellungen";
+$a->strings["Set scheme"] = "Schema";
+$a->strings["Navigation bar colour"] = "Farbe der Navigationsleiste";
+$a->strings["Set font-colour for banner"] = "Farbe des Banners";
+$a->strings["Set the background colour"] = "Hintergrundfarbe";
+$a->strings["Set the background image"] = "Hintergrundbild";
+$a->strings["Set the background colour of items"] = "Hintergrundfarbe von Beiträgen";
+$a->strings["Set the opacity of items"] = "Deckkraft von Beiträgen";
+$a->strings["Set the basic colour for item icons"] = "Basisfarbe der Beitrags-Icons";
+$a->strings["Set the hover colour for item icons"] = "Farbe für Beitrags-Icons unter dem Mauszeiger";
+$a->strings["Set font-size for the entire application"] = "Schriftgröße für die ganze Applikation";
+$a->strings["Set font-size for posts and comments"] = "Wähle die Schriftgröße für Beiträge und Kommentare";
+$a->strings["Set font-colour for posts and comments"] = "Schriftfarbe für Beiträge und Kommentare";
+$a->strings["Set radius of corners"] = "Ecken-Radius";
+$a->strings["Set shadow depth of photos"] = "Schattentiefe von Fotos";
+$a->strings["Set maximum width of conversation regions"] = "Maximalbreite der Konversationsbereiche";
+$a->strings["Set minimum opacity of nav bar - to hide it"] = "Mindest-Deckkraft der Navigationsleiste ( - versteckt sie)";
+$a->strings["Set size of conversation author photo"] = "Größe der Avatare von Themenstartern";
+$a->strings["Set size of followup author photos"] = "Größe der Avatare von Kommentatoren";
+$a->strings["Sloppy photo albums"] = "Schräge Fotoalben";
+$a->strings["Are you a clean desk or a messy desk person?"] = "Bist du jemand der einen aufgeräumten Schreibtisch hat, oder eher einen chaotischen?";
+$a->strings["Schema Default"] = "Standard-Schema";
+$a->strings["Sans-Serif"] = "Sans-Serif";
+$a->strings["Monospace"] = "Monospace";
+$a->strings["Set font face"] = "Schriftart";
+$a->strings["Set iconset"] = "Iconset";
+$a->strings["Set big shadow size, default 15px 15px 15px"] = "Ausmaß der großen Schatten (Default 15px 15px 15px)";
+$a->strings["Set small shadow size, default 5px 5px 5px"] = "Ausmaß der kleinen Schatten (Default 5px 5px 5px)";
+$a->strings["Set shadow colour, default #000"] = "Farbe der Schatten (Default #000)";
+$a->strings["Set radius size, default 5px"] = "Ecken-Radius (Default 5px)";
+$a->strings["Set line-height for posts and comments"] = "Wähle die Zeilenhöhe in Beiträgen und Kommentaren";
+$a->strings["Set background image"] = "Hintergrundbild";
+$a->strings["Set background colour"] = "Hintergrundfarbe";
+$a->strings["Set section background image"] = "Hintergrundbild des mittleren Bereichs";
+$a->strings["Set section background colour"] = "Hintergrundfarbe des mittleren Bereichs";
+$a->strings["Set colour of items - use hex"] = "Farbe von Beiträgen (HEX)";
+$a->strings["Set colour of links - use hex"] = "Farbe von Links (HEX)";
+$a->strings["Set max-width for items. Default 400px"] = "Maximalbreite von Beiträgen (Default 400px)";
+$a->strings["Set min-width for items. Default 240px"] = "Minimalbreite von Beiträgen (Default 240px)";
+$a->strings["Set the generic content wrapper width. Default 48%"] = "Breite des „generic content wrapper“ (Default 48%)";
+$a->strings["Set colour of fonts - use hex"] = "Schriftfarbe (HEX)";
+$a->strings["Set background-size element"] = "Größe des Hintergrund-Elements";
+$a->strings["Item opacity"] = "Opazität von Beiträgen";
+$a->strings["Display post previews only"] = "Nur Beitragsvorschau anzeigen";
+$a->strings["Display side bar on channel page"] = "Zeige die Seitenleiste auf der Kanal-Seite";
+$a->strings["Colour of the navigation bar"] = "Farbe der Navigationsleiste";
+$a->strings["Item float"] = "Beitragsfluss";
+$a->strings["Left offset of the section element"] = "Linker Rand des mittleren Bereichs";
+$a->strings["Right offset of the section element"] = "Rechter Rand des mittleren Bereichs";
+$a->strings["Section width"] = "Breite des mittleren Bereichs";
+$a->strings["Left offset of the aside"] = "Linker Rand des seitlichen Bereichs";
+$a->strings["Right offset of the aside element"] = "Rechter Rand des seitlichen Bereichs";
+$a->strings["None"] = "Keine";
+$a->strings["Header image"] = "Titelbild";
+$a->strings["Header image only on profile pages"] = "Titelbild nur auf Profil-Seiten anzeigen";
+$a->strings["Update %s failed. See error logs."] = "Aktualisierung %s fehlgeschlagen. Details in den Fehlerprotokollen.";
+$a->strings["Update Error at %s"] = "Aktualisierungsfehler auf %s";
+$a->strings["Create an account to access services and applications within the Red Matrix"] = "Erstelle einen Account um Anwendungen und Dienste innerhalb der Red Matrix verwenden zu können.";
+$a->strings["Password"] = "Kennwort";
+$a->strings["Remember me"] = "Angaben speichern";
$a->strings["Forgot your password?"] = "Passwort vergessen?";
-$a->strings["Edit profile"] = "Profil bearbeiten";
-$a->strings["Message"] = "Nachricht";
-$a->strings["g A l F d"] = "l, d. F G \\U\\h\\r";
-$a->strings["F d"] = "d. F";
-$a->strings["[today]"] = "[heute]";
-$a->strings["Birthday Reminders"] = "Geburtstagserinnerungen";
-$a->strings["Birthdays this week:"] = "Geburtstage diese Woche:";
-$a->strings["[No description]"] = "[keine Beschreibung]";
-$a->strings["Event Reminders"] = "Veranstaltungserinnerungen";
-$a->strings["Events this week:"] = "Veranstaltungen diese Woche";
-$a->strings["Status Messages and Posts"] = "Statusnachrichten und Beiträge";
-$a->strings["Profile Details"] = "Profildetails";
-$a->strings["Events and Calendar"] = "Ereignisse und Kalender";
-$a->strings["Only You Can See This"] = "Nur Du Kannst Das Sehen";
+$a->strings["permission denied"] = "Zugriff verweigert";
+$a->strings["Got Zot?"] = "Haste schon Zot?";
+$a->strings["toggle mobile"] = "auf/von Mobile Ansicht wechseln";
diff --git a/view/de/update_fail_eml.tpl b/view/de/update_fail_eml.tpl
index cfb55e240..a7df8fc2f 100644
--- a/view/de/update_fail_eml.tpl
+++ b/view/de/update_fail_eml.tpl
@@ -1,11 +1,13 @@
-Hi,
-ich bin $sitename.
-Die friendica Entwickler haben jüngst Update $update veröffentlicht,
-aber als ich versucht habe es zu installieren ist etwas schrecklich schief gegangen.
-Das sollte schnellst möglichst behoben werden und ich kann das nicht alleine machen.
-Bitte wende dich an einen friendica Entwickler, falls du mir nicht alleine helfen kannst. Meine Datenbank könnte unbrauchbar sein.
+Hey,
+I'm the web server at {{$sitename}};
+
+The Red Matrix developers released update {{$update}} recently,
+but when I tried to install it, something went terribly wrong.
+This needs to be fixed soon and it requires human intervention.
+Please contact a Red developer if you can not figure out how to
+fix it on your own. My database might be invalid.
-Die Fehlermeldung lautet '$error'.
+The error message is '{{$error}}'.
-Tut mir Leid!
-Deine friendica Instanz auf $siteurl \ No newline at end of file
+Apologies for the inconvenience,
+ your web server at {{$siteurl}} \ No newline at end of file
diff --git a/view/en/follow_notify_eml.tpl b/view/en/follow_notify_eml.tpl
index 917024b84..ba07b19da 100644
--- a/view/en/follow_notify_eml.tpl
+++ b/view/en/follow_notify_eml.tpl
@@ -1,14 +1,14 @@
-Dear $[myname],
+Dear {{$myname}},
-You have a new follower at $[sitename] - '$[requestor]'.
+You have a new follower at {{$sitename}} - '{{$requestor}}'.
-You may visit their profile at $[url].
+You may visit their profile at {{$url}}.
Please login to your site to approve or ignore/cancel the request.
-$[siteurl]
+{{$siteurl}}
Regards,
- $[sitename] administrator
+ {{$sitename}} administrator
diff --git a/view/en/friend_complete_eml.tpl b/view/en/friend_complete_eml.tpl
index 89f578388..1c647b994 100644
--- a/view/en/friend_complete_eml.tpl
+++ b/view/en/friend_complete_eml.tpl
@@ -1,22 +1,22 @@
-Dear $[username],
+Dear {{$username}},
- Great news... '$[fn]' at '$[dfrn_url]' has accepted
-your connection request at '$[sitename]'.
+ Great news... '{{$fn}}' at '{{$dfrn_url}}' has accepted
+your connection request at '{{$sitename}}'.
You are now mutual friends and may exchange status updates, photos, and email
without restriction.
-Please visit your 'Contacts' page at $[sitename] if you wish to make
+Please visit your 'Connnections' page at {{$sitename}} if you wish to make
any changes to this relationship.
-$[siteurl]
+{{$siteurl}}
[For instance, you may create a separate profile with information that is not
-available to the general public - and assign viewing rights to '$[fn]'].
+available to the general public - and assign viewing rights to '{{$fn}}'].
Sincerely,
- $[sitename] Administrator
+ {{$sitename}} Administrator
diff --git a/view/en/htconfig.tpl b/view/en/htconfig.tpl
index 6f22f8476..28fdd04f0 100644
--- a/view/en/htconfig.tpl
+++ b/view/en/htconfig.tpl
@@ -3,10 +3,11 @@
// Set the following for your MySQL installation
// Copy or rename this file to .htconfig.php
-$db_host = '$dbhost';
-$db_user = '$dbuser';
-$db_pass = '$dbpass';
-$db_data = '$dbdata';
+$db_host = '{{$dbhost}}';
+$db_port = '{{$dbport}}';
+$db_user = '{{$dbuser}}';
+$db_pass = '{{$dbpass}}';
+$db_data = '{{$dbdata}}';
/*
* Notice: Many of the following settings will be available in the admin panel
@@ -24,13 +25,14 @@ $db_data = '$dbdata';
// Choose a legal default timezone. If you are unsure, use "America/Los_Angeles".
// It can be changed later and only applies to timestamps for anonymous viewers.
-$default_timezone = '$timezone';
+$default_timezone = '{{$timezone}}';
// What is your site name?
-$a->config['system']['baseurl'] = '$siteurl';
+$a->config['system']['baseurl'] = '{{$siteurl}}';
$a->config['system']['sitename'] = "Red Matrix";
-$a->config['system']['location_hash'] = '$site_id';
+$a->config['system']['location_hash'] = '{{$site_id}}';
+
// Your choices are REGISTER_OPEN, REGISTER_APPROVE, or REGISTER_CLOSED.
// Be certain to create your own personal account before setting
@@ -41,7 +43,26 @@ $a->config['system']['location_hash'] = '$site_id';
$a->config['system']['register_policy'] = REGISTER_OPEN;
$a->config['system']['register_text'] = '';
-$a->config['system']['admin_email'] = '$adminmail';
+$a->config['system']['admin_email'] = '{{$adminmail}}';
+
+
+// Site access restrictions. By default we will create private sites.
+// Your choices are ACCESS_PRIVATE, ACCESS_PAID, ACCESS_TIERED, and ACCESS_FREE.
+// If you leave REGISTER_OPEN above, anybody may register on your
+// site, however your site will not be listed anywhere as an open
+// registration hub. We will use the system access policy (below)
+// to determine whether or not to list your site in the directory
+// as an open hub where anybody may create accounts. Your choice of
+// paid, tiered, or free determines how these listings will be presented.
+
+
+$a->config['system']['access_policy'] = ACCESS_PRIVATE;
+
+// If you operate a public site, you might wish that people are directed
+// to a "sellpage" where you can describe for features or policies or service plans in depth.
+// This must be an absolute URL beginning with http:// or https:// .
+
+$a->config['system']['sellpage'] = '';
// Maximum size of an imported message, 0 is unlimited
@@ -49,11 +70,11 @@ $a->config['system']['max_import_size'] = 200000;
// maximum size of uploaded photos
-$a->config['system']['maximagesize'] = 800000;
+$a->config['system']['maximagesize'] = 3000000;
// Location of PHP command line processor
-$a->config['system']['php_path'] = '$phpath';
+$a->config['system']['php_path'] = '{{$phpath}}';
// Configure how we communicate with directory servers.
// DIRECTORY_MODE_NORMAL = directory client, we will find a directory
@@ -67,3 +88,14 @@ $a->config['system']['directory_mode'] = DIRECTORY_MODE_NORMAL;
$a->config['system']['theme'] = 'redbasic';
+
+// PHP error logging setup
+// Before doing this ensure that the webserver has permission
+// to create and write to php.out in the top level Red directory,
+// or change the name (below) to a file/path where this is allowed.
+
+// Uncomment the following 4 lines to turn on PHP error logging.
+//error_reporting(E_ERROR | E_WARNING | E_PARSE );
+//ini_set('error_log','php.out');
+//ini_set('log_errors','1');
+//ini_set('display_errors', '0');
diff --git a/view/en/intro_complete_eml.tpl b/view/en/intro_complete_eml.tpl
index cd78b2a15..2c2428d68 100644
--- a/view/en/intro_complete_eml.tpl
+++ b/view/en/intro_complete_eml.tpl
@@ -1,22 +1,22 @@
-Dear $[username],
+Dear {{$username}},
- '$[fn]' at '$[dfrn_url]' has accepted
-your connection request at '$[sitename]'.
+ '{{$fn}}' at '{{$dfrn_url}}' has accepted
+your connection request at '{{$sitename}}'.
- '$[fn]' has chosen to accept you a "fan", which restricts
+ '{{$fn}}' has chosen to accept you a "fan", which restricts
some forms of communication - such as private messaging and some profile
interactions. If this is a celebrity or community page, these settings were
applied automatically.
- '$[fn]' may choose to extend this into a two-way or more permissive
+ '{{$fn}}' may choose to extend this into a two-way or more permissive
relationship in the future.
- You will start receiving public status updates from '$[fn]',
-which will appear on your 'Network' page at
+ You will start receiving public status updates from '{{$fn}}',
+which will appear on your 'Matrix' page at
-$[siteurl]
+{{$siteurl}}
Sincerely,
- $[sitename] Administrator
+ {{$sitename}} Administrator
diff --git a/view/en/lostpass_eml.tpl b/view/en/lostpass_eml.tpl
index 1330caa12..3b79d2791 100644
--- a/view/en/lostpass_eml.tpl
+++ b/view/en/lostpass_eml.tpl
@@ -1,6 +1,6 @@
-Dear $[username],
- A request was recently received at $[sitename] to reset your account
+Dear {{$username}},
+ A request was recently received at {{$sitename}} to reset your account
password. In order to confirm this request, please select the verification link
below or paste it into your web browser address bar.
@@ -12,7 +12,7 @@ issued this request.
Follow this link to verify your identity:
-$[reset_link]
+{{$reset_link}}
You will then receive a follow-up message containing the new password.
@@ -20,13 +20,13 @@ You may change that password from your account settings page after logging in.
The login details are as follows:
-Site Location: $[siteurl]
-Login Name: $[email]
+Site Location: {{$siteurl}}
+Login Name: {{$email}}
Sincerely,
- $[sitename] Administrator
+ {{$sitename}} Administrator
diff --git a/view/en/passchanged_eml.tpl b/view/en/passchanged_eml.tpl
index e7cc0e2dc..0d94be3c2 100644
--- a/view/en/passchanged_eml.tpl
+++ b/view/en/passchanged_eml.tpl
@@ -1,5 +1,5 @@
-Dear $[username],
+Dear {{$username}},
Your password has been changed as requested. Please retain this
information for your records (or change your password immediately to
something that you will remember).
@@ -7,14 +7,14 @@ something that you will remember).
Your login details are as follows:
-Site Location: $[siteurl]
-Login Name: $[email]
-Password: $[new_password]
+Site Location: {{$siteurl}}
+Login Name: {{$email}}
+Password: {{$new_password}}
You may change that password from your account settings page after logging in.
Sincerely,
- $[sitename] Administrator
+ {{$sitename}} Administrator
diff --git a/view/en/register_open_eml.tpl b/view/en/register_open_eml.tpl
index 4191f803b..4b397201c 100644
--- a/view/en/register_open_eml.tpl
+++ b/view/en/register_open_eml.tpl
@@ -1,9 +1,9 @@
-An account has been created at $[sitename] for this email address.
+An account has been created at {{$sitename}} for this email address.
The login details are as follows:
-Site Location: $[siteurl]
-Login: $[email]
+Site Location: {{$siteurl}}
+Login: {{$email}}
Password: (the password which was provided during registration)
If this account was created without your knowledge and is not desired, you may
@@ -11,9 +11,9 @@ visit this site and reset the password. This will allow you to remove the
account from the links on the Settings page, and we
apologise for any inconvenience.
-Thank you and welcome to $[sitename].
+Thank you and welcome to {{$sitename}}.
Sincerely,
- $[sitename] Administrator
+ {{$sitename}} Administrator
diff --git a/view/en/register_verify_eml.tpl b/view/en/register_verify_eml.tpl
index c23de6a2a..85d9a12d3 100644
--- a/view/en/register_verify_eml.tpl
+++ b/view/en/register_verify_eml.tpl
@@ -1,24 +1,24 @@
-A new user registration request was received at $[sitename] which requires
+A new user registration request was received at {{$sitename}} which requires
your approval.
The login details are as follows:
-Site Location: $[siteurl]
-Login Name: $[email]
-IP Address: $[details]
+Site Location: {{$siteurl}}
+Login Name: {{$email}}
+IP Address: {{$details}}
To approve this request please visit the following link:
-$[siteurl]/regmod/allow/$[hash]
+{{$siteurl}}/regmod/allow/{{$hash}}
To deny the request and remove the account, please visit:
-$[siteurl]/regmod/deny/$[hash]
+{{$siteurl}}/regmod/deny/{{$hash}}
Thank you.
diff --git a/view/en/request_notify_eml.tpl b/view/en/request_notify_eml.tpl
index ad118a673..d01b8ff27 100644
--- a/view/en/request_notify_eml.tpl
+++ b/view/en/request_notify_eml.tpl
@@ -1,17 +1,17 @@
-Dear $[myname],
+Dear {{$myname}},
-You have just received a connection request at $[sitename]
+You have just received a connection request at {{$sitename}}
-from '$[requestor]'.
+from '{{$requestor}}'.
-You may visit their profile at $[url].
+You may visit their profile at {{$url}}.
Please login to your site to view the complete introduction
and approve or ignore/cancel the request.
-$[siteurl]
+{{$siteurl}}
Regards,
- $[sitename] administrator
+ {{$sitename}} administrator
diff --git a/view/en/update_fail_eml.tpl b/view/en/update_fail_eml.tpl
index 548e1a0df..a7df8fc2f 100644
--- a/view/en/update_fail_eml.tpl
+++ b/view/en/update_fail_eml.tpl
@@ -1,11 +1,13 @@
Hey,
-I'm $sitename;
-The friendica developers released update $update recently,
+I'm the web server at {{$sitename}};
+
+The Red Matrix developers released update {{$update}} recently,
but when I tried to install it, something went terribly wrong.
-This needs to be fixed soon and I can't do it alone. Please contact a
-friendica developer if you can not help me on your own. My database might be invalid.
+This needs to be fixed soon and it requires human intervention.
+Please contact a Red developer if you can not figure out how to
+fix it on your own. My database might be invalid.
-The error message is '$error'.
+The error message is '{{$error}}'.
-I'm sorry,
-your friendica server at $siteurl \ No newline at end of file
+Apologies for the inconvenience,
+ your web server at {{$siteurl}} \ No newline at end of file
diff --git a/view/eo/follow_notify_eml.tpl b/view/eo/follow_notify_eml.tpl
index e76453ac1..ba07b19da 100644
--- a/view/eo/follow_notify_eml.tpl
+++ b/view/eo/follow_notify_eml.tpl
@@ -1,14 +1,14 @@
-Kara $[myname],
+Dear {{$myname}},
-Vi havas novan abonanton ĉe $[sitename] - '$[requestor]'.
+You have a new follower at {{$sitename}} - '{{$requestor}}'.
-Vi povas viziti ilian profilon ĉe $[url].
+You may visit their profile at {{$url}}.
-Bonvolu ensaluti en vian retejon por aprobi au malaprobi/nuligi la peton.
+Please login to your site to approve or ignore/cancel the request.
-$[siteurl]
+{{$siteurl}}
-Salutoj,
+Regards,
- [$sitename] administranto \ No newline at end of file
+ {{$sitename}} administrator
diff --git a/view/eo/friend_complete_eml.tpl b/view/eo/friend_complete_eml.tpl
index f429ca450..1c647b994 100644
--- a/view/eo/friend_complete_eml.tpl
+++ b/view/eo/friend_complete_eml.tpl
@@ -1,22 +1,22 @@
-Kara $[username],
+Dear {{$username}},
- Boegaj novaĵoj.... '$[fn]' ĉe '$[dfrn_url]' aprobis
-vian kontaktpeton ĉe '$[sitename]'.
+ Great news... '{{$fn}}' at '{{$dfrn_url}}' has accepted
+your connection request at '{{$sitename}}'.
-Vi nun estas reciprokaj amikoj kaj povas interÅanÄi afiÅojn, bildojn kaj mesaÄojn
-senkatene.
+You are now mutual friends and may exchange status updates, photos, and email
+without restriction.
-Bonvolu viziti vian 'Kontaktoj' paÄon ĉe $[sitename] se vi volas
-Åangi la rilaton.
+Please visit your 'Connnections' page at {{$sitename}} if you wish to make
+any changes to this relationship.
-$[siteurl]
+{{$siteurl}}
-[Ekzempe, vi eble volas krei disiÄintan profilon kun informoj kiu ne
-haveblas al la komuna publiko - kaj rajtigi '$[fn]' al Äi]'
+[For instance, you may create a separate profile with information that is not
+available to the general public - and assign viewing rights to '{{$fn}}'].
-Salutoj,
+Sincerely,
- $[sitename] administranto
+ {{$sitename}} Administrator
- \ No newline at end of file
+
diff --git a/view/eo/htconfig.tpl b/view/eo/htconfig.tpl
new file mode 100644
index 000000000..493cb5d00
--- /dev/null
+++ b/view/eo/htconfig.tpl
@@ -0,0 +1,70 @@
+<?php
+
+// Set the following for your MySQL installation
+// Copy or rename this file to .htconfig.php
+
+$db_host = '{{$dbhost}}';
+$db_port = '{{$dbport}}';
+$db_user = '{{$dbuser}}';
+$db_pass = '{{$dbpass}}';
+$db_data = '{{$dbdata}}';
+
+/*
+ * Notice: Many of the following settings will be available in the admin panel
+ * after a successful site install. Once they are set in the admin panel, they
+ * are stored in the DB - and the DB setting will over-ride any corresponding
+ * setting in this file
+ *
+ * The command-line tool util/config is able to query and set the DB items
+ * directly if for some reason the admin panel is not available and a system
+ * setting requires modification.
+ *
+ */
+
+
+// Choose a legal default timezone. If you are unsure, use "America/Los_Angeles".
+// It can be changed later and only applies to timestamps for anonymous viewers.
+
+$default_timezone = '{{$timezone}}';
+
+// What is your site name?
+
+$a->config['system']['baseurl'] = '{{$siteurl}}';
+$a->config['system']['sitename'] = "Red Matrix";
+$a->config['system']['location_hash'] = '{{$site_id}}';
+
+// Your choices are REGISTER_OPEN, REGISTER_APPROVE, or REGISTER_CLOSED.
+// Be certain to create your own personal account before setting
+// REGISTER_CLOSED. 'register_text' (if set) will be displayed prominently on
+// the registration page. REGISTER_APPROVE requires you set 'admin_email'
+// to the email address of an already registered person who can authorise
+// and/or approve/deny the request.
+
+$a->config['system']['register_policy'] = REGISTER_OPEN;
+$a->config['system']['register_text'] = '';
+$a->config['system']['admin_email'] = '{{$adminmail}}';
+
+// Maximum size of an imported message, 0 is unlimited
+
+$a->config['system']['max_import_size'] = 200000;
+
+// maximum size of uploaded photos
+
+$a->config['system']['maximagesize'] = 800000;
+
+// Location of PHP command line processor
+
+$a->config['system']['php_path'] = '{{$phpath}}';
+
+// Configure how we communicate with directory servers.
+// DIRECTORY_MODE_NORMAL = directory client, we will find a directory
+// DIRECTORY_MODE_SECONDARY = caching directory or mirror
+// DIRECTORY_MODE_PRIMARY = main directory server
+// DIRECTORY_MODE_STANDALONE = "off the grid" or private directory services
+
+$a->config['system']['directory_mode'] = DIRECTORY_MODE_NORMAL;
+
+// default system theme
+
+$a->config['system']['theme'] = 'redbasic';
+
diff --git a/view/eo/intro_complete_eml.tpl b/view/eo/intro_complete_eml.tpl
index 56a4fd880..2c2428d68 100644
--- a/view/eo/intro_complete_eml.tpl
+++ b/view/eo/intro_complete_eml.tpl
@@ -1,22 +1,22 @@
-Kara $[username],
+Dear {{$username}},
- '$[fn]' ĉe '$[dfrn_url]' akceptis
-vian kontaktpeton ĉe '$[sitename]'.
+ '{{$fn}}' at '{{$dfrn_url}}' has accepted
+your connection request at '{{$sitename}}'.
- '$[fn]' elektis vin kiel "admiranto", kio malpermesas
-kelkajn komunikilojn - ekzemple privataj mesaÄoj kaj kelkaj profilrilataj
-agoj. Se tio estas konto de komunumo aÅ­ de eminentulo, tiaj agordoj
-aÅ­tomate aktiviÄis.
+ '{{$fn}}' has chosen to accept you a "fan", which restricts
+some forms of communication - such as private messaging and some profile
+interactions. If this is a celebrity or community page, these settings were
+applied automatically.
- '$[fn]' eblas konverti la rilaton al ambaÅ­direkta rilato
-aÅ­ apliki pli da permesoj.
+ '{{$fn}}' may choose to extend this into a two-way or more permissive
+relationship in the future.
- Vi ekricevos publikajn afiÅojn de '$[fn]',
-kiuj aperos sur via 'Reto' paÄo ĉe
+ You will start receiving public status updates from '{{$fn}}',
+which will appear on your 'Matrix' page at
-$[siteurl]
+{{$siteurl}}
-Salutoj,
+Sincerely,
- $[sitename] administranto \ No newline at end of file
+ {{$sitename}} Administrator
diff --git a/view/eo/lostpass_eml.tpl b/view/eo/lostpass_eml.tpl
index 26d1a3c23..3b79d2791 100644
--- a/view/eo/lostpass_eml.tpl
+++ b/view/eo/lostpass_eml.tpl
@@ -1,32 +1,32 @@
-Kara $[username],
- $[sitename] ricevis peton por rekomencigi vian pasvorton.
-Por konfirmi la peton, bonvolu klaki la sekvantan konfirmligilon
-aÅ­ alglui Äin en la adreskampo de via retumilo.
+Dear {{$username}},
+ A request was recently received at {{$sitename}} to reset your account
+password. In order to confirm this request, please select the verification link
+below or paste it into your web browser address bar.
-Se vi NE petis tiun ÅanÄon, bonvolu NE KLAKU la
-sekvantan ligilon kaj ignoru aÅ­ forvisu ĉi-mesaÄon.
+If you did NOT request this change, please DO NOT follow the link
+provided and ignore and/or delete this email.
-Ni ne ÅanÄu vian pasvorton se ni ne povas kontroli ĉu estas vi
-kiu petis la ÅanÄon.
+Your password will not be changed unless we can verify that you
+issued this request.
-Sekvu ĉi tion ligilon por konfirmi vian identecon:
+Follow this link to verify your identity:
-$[reset_link]
+{{$reset_link}}
-Poste, vi ricevos mesaÄon enhavonte la novan pasvorton.
+You will then receive a follow-up message containing the new password.
-Vi eblas Åangi la pasvorton ĉe viaj kontdoagordoj paÄo post ensaluti.
+You may change that password from your account settings page after logging in.
-La akreditaĵoj estas:
+The login details are as follows:
-Retejo:»$[siteurl]
-Salutnomo:»$[email]
+Site Location: {{$siteurl}}
+Login Name: {{$email}}
-Salutoj,
- $[sitename] administranto
+Sincerely,
+ {{$sitename}} Administrator
- \ No newline at end of file
+
diff --git a/view/eo/passchanged_eml.tpl b/view/eo/passchanged_eml.tpl
index ee775d5dd..0d94be3c2 100644
--- a/view/eo/passchanged_eml.tpl
+++ b/view/eo/passchanged_eml.tpl
@@ -1,20 +1,20 @@
-Kara $[username],
- Via pasvorto estas ÅanÄita laÅ­ via peto. Bonvolu konservi ĉi tiun
-informon (aÅ­ tuj ÅanÄu vian pasvorton al
-iu kiun vi povas memori).
+Dear {{$username}},
+ Your password has been changed as requested. Please retain this
+information for your records (or change your password immediately to
+something that you will remember).
-Jen viaj legitimaĵoj:
+Your login details are as follows:
-Retejo:»$[siteurl]
-Salutnomo:»$[email]
-Pasvorto:»$[new_password]
+Site Location: {{$siteurl}}
+Login Name: {{$email}}
+Password: {{$new_password}}
-Vi eblas ÅanÄi la pasvorton ĉe la paÄo Agordoj -> Konto kiam vi estas ensalutita.
+You may change that password from your account settings page after logging in.
-Salutoj,
- $[sitename] administranto
+Sincerely,
+ {{$sitename}} Administrator
- \ No newline at end of file
+
diff --git a/view/eo/register_open_eml.tpl b/view/eo/register_open_eml.tpl
index 735ea9a4b..4b397201c 100644
--- a/view/eo/register_open_eml.tpl
+++ b/view/eo/register_open_eml.tpl
@@ -1,34 +1,19 @@
-Kara $[username],
- Dankon pro via registrado ĉe $[sitename]. Vian konton estas kreita.
-Jen viaj legitimaĵoj:
+An account has been created at {{$sitename}} for this email address.
+The login details are as follows:
+Site Location: {{$siteurl}}
+Login: {{$email}}
+Password: (the password which was provided during registration)
-Retejo:»$[siteurl]
-Salutnomo:»$[email]
-Pasvorto:»$[password]
+If this account was created without your knowledge and is not desired, you may
+visit this site and reset the password. This will allow you to remove the
+account from the links on the Settings page, and we
+apologise for any inconvenience.
-Vi eblas ÅanÄi la pasvorton ĉe la paÄo Agordoj -> Konto kiam vi estas
-ensalutita.
+Thank you and welcome to {{$sitename}}.
-Bonvolu preni kelkajn momentoj por kontroli la aliajn kontaktagordojn.
+Sincerely,
+ {{$sitename}} Administrator
-Eble vi volas aldoni kelkajn bazajn informojn al via profilo
-(ĉe la paÄo "Profiloj"), tial vi troveblas al aliaj uzantoj.
-
-Ni rekomendas agordi vian plenan noman, aldoni profilbildon,
-kaj aldojo kelkajn Ålosilvortojn (tre utila por trovi novajn amikojn) - kaj
-eble en kiu lando vi loÄas, se vi ne volas pli specifa
-ol tio.
-
-Ni tute respektas vian privatecon, kaj neniu de tiuj agordoj necesas.
-Se vi novas kaj ne konas iun ĉi tie, ili eble helpas
-vin trovi novajn kaj interesajn amikojn.
-
-
-Dankon kaj bonvenon ĉe $[sitename].
-
-Salutoj,
- $[sitename] administranto
-
- \ No newline at end of file
+
diff --git a/view/eo/register_verify_eml.tpl b/view/eo/register_verify_eml.tpl
index cc99ab4b6..85d9a12d3 100644
--- a/view/eo/register_verify_eml.tpl
+++ b/view/eo/register_verify_eml.tpl
@@ -1,25 +1,25 @@
-Nova peto por registrado atendas ĉe $[sitename]
-kaj bezonas vian aprobon.
+A new user registration request was received at {{$sitename}} which requires
+your approval.
-Jen la detaloj de la peto:
+The login details are as follows:
-Plena Nomo:»$[username]
-Retejo:»$[siteurl]
-Salutnomo:»$[email]
+Site Location: {{$siteurl}}
+Login Name: {{$email}}
+IP Address: {{$details}}
+To approve this request please visit the following link:
-Aprobonte la peton, bonvolu klaki tiun ligilon:
+{{$siteurl}}/regmod/allow/{{$hash}}
-$[siteurl]/regmod/allow/$[hash]
+To deny the request and remove the account, please visit:
-Malaprobonte kaj forviÅonte la konton, bonvolu klaki:
+{{$siteurl}}/regmod/deny/{{$hash}}
-$[siteurl]/regmod/deny/$[hash]
+Thank you.
-Dankon!
diff --git a/view/eo/request_notify_eml.tpl b/view/eo/request_notify_eml.tpl
index eb91414b9..d01b8ff27 100644
--- a/view/eo/request_notify_eml.tpl
+++ b/view/eo/request_notify_eml.tpl
@@ -1,17 +1,17 @@
-Kara $[myname],
+Dear {{$myname}},
-Vi ĵus ricevis kontaktpeton ĉe $[sitename]
+You have just received a connection request at {{$sitename}}
-de '$[requestor]'.
+from '{{$requestor}}'.
-Vi eblas viziti la profilon de la petanto ĉe $[url].
+You may visit their profile at {{$url}}.
-Bonvolu ensaluti en la retejo por vidi la plenan prezenton
-kaj aprobi aÅ­ ignori/nuligi la peton.
+Please login to your site to view the complete introduction
+and approve or ignore/cancel the request.
-$[siteurl]
+{{$siteurl}}
-Salutoj,
+Regards,
- $[sitename] administranto \ No newline at end of file
+ {{$sitename}} administrator
diff --git a/view/eo/update_fail_eml.tpl b/view/eo/update_fail_eml.tpl
index f7e0d8bce..a7df8fc2f 100644
--- a/view/eo/update_fail_eml.tpl
+++ b/view/eo/update_fail_eml.tpl
@@ -1,11 +1,13 @@
-Saluton!
-Mi estas $sitename.
-La programistoj de Frienda eldonis Äisdatigon $update antaÅ­ ne longe,
-sed kiam mi provis instali Äin, io terure malsukcesis.
-Tio tuj bezonas riparon kaj mi ne povas fari Äin sole. Bonvolu kontakti
-Friendica programistion se vi ne povas helpi vin mem. Mia datumbazo eble ne plu validas.
+Hey,
+I'm the web server at {{$sitename}};
+
+The Red Matrix developers released update {{$update}} recently,
+but when I tried to install it, something went terribly wrong.
+This needs to be fixed soon and it requires human intervention.
+Please contact a Red developer if you can not figure out how to
+fix it on your own. My database might be invalid.
-La erarmesaÄo estas '$error'.
+The error message is '{{$error}}'.
-Mi bedaÅ­ras,
-via Friendica servilo ĉe $siteurl \ No newline at end of file
+Apologies for the inconvenience,
+ your web server at {{$siteurl}} \ No newline at end of file
diff --git a/view/es/follow_notify_eml.tpl b/view/es/follow_notify_eml.tpl
index 17bd2c01c..ba07b19da 100644
--- a/view/es/follow_notify_eml.tpl
+++ b/view/es/follow_notify_eml.tpl
@@ -1,13 +1,14 @@
-Estimado/a $myname,
+Dear {{$myname}},
-Tienes un nuevo seguidor en $sitename - '$requestor'.
+You have a new follower at {{$sitename}} - '{{$requestor}}'.
-Puedes visitar su perfil en $url.
+You may visit their profile at {{$url}}.
-Inicie sesión en su sitio para aprobar o rechazar/cancelar la solicitud.
+Please login to your site to approve or ignore/cancel the request.
-$siteurl
+{{$siteurl}}
+Regards,
- $sitename
+ {{$sitename}} administrator
diff --git a/view/es/friend_complete_eml.tpl b/view/es/friend_complete_eml.tpl
index 0dc867efd..1c647b994 100644
--- a/view/es/friend_complete_eml.tpl
+++ b/view/es/friend_complete_eml.tpl
@@ -1,19 +1,22 @@
-Estimado/a $username,
+Dear {{$username}},
- Grandes noticias... '$fn' a '$dfrn_url' ha aceptado tu solicitud de conexión en '$sitename'.
+ Great news... '{{$fn}}' at '{{$dfrn_url}}' has accepted
+your connection request at '{{$sitename}}'.
-Ahora sois amigos mutuos y podreis intercambiar actualizaciones de estado, fotos, y correo electrónico
-sin restricción alguna.
+You are now mutual friends and may exchange status updates, photos, and email
+without restriction.
-Visita tu página de 'Contactos' en $sitename si desear realizar cualquier cambio en esta relación.
+Please visit your 'Connnections' page at {{$sitename}} if you wish to make
+any changes to this relationship.
-$siteurl
+{{$siteurl}}
-[Por ejemplo, puedes crear un perfil independiente con información que no está disponible al público en general
-- y asignar derechos de visualización a '$fn'].
+[For instance, you may create a separate profile with information that is not
+available to the general public - and assign viewing rights to '{{$fn}}'].
+Sincerely,
- $sitename
+ {{$sitename}} Administrator
diff --git a/view/es/htconfig.tpl b/view/es/htconfig.tpl
new file mode 100644
index 000000000..493cb5d00
--- /dev/null
+++ b/view/es/htconfig.tpl
@@ -0,0 +1,70 @@
+<?php
+
+// Set the following for your MySQL installation
+// Copy or rename this file to .htconfig.php
+
+$db_host = '{{$dbhost}}';
+$db_port = '{{$dbport}}';
+$db_user = '{{$dbuser}}';
+$db_pass = '{{$dbpass}}';
+$db_data = '{{$dbdata}}';
+
+/*
+ * Notice: Many of the following settings will be available in the admin panel
+ * after a successful site install. Once they are set in the admin panel, they
+ * are stored in the DB - and the DB setting will over-ride any corresponding
+ * setting in this file
+ *
+ * The command-line tool util/config is able to query and set the DB items
+ * directly if for some reason the admin panel is not available and a system
+ * setting requires modification.
+ *
+ */
+
+
+// Choose a legal default timezone. If you are unsure, use "America/Los_Angeles".
+// It can be changed later and only applies to timestamps for anonymous viewers.
+
+$default_timezone = '{{$timezone}}';
+
+// What is your site name?
+
+$a->config['system']['baseurl'] = '{{$siteurl}}';
+$a->config['system']['sitename'] = "Red Matrix";
+$a->config['system']['location_hash'] = '{{$site_id}}';
+
+// Your choices are REGISTER_OPEN, REGISTER_APPROVE, or REGISTER_CLOSED.
+// Be certain to create your own personal account before setting
+// REGISTER_CLOSED. 'register_text' (if set) will be displayed prominently on
+// the registration page. REGISTER_APPROVE requires you set 'admin_email'
+// to the email address of an already registered person who can authorise
+// and/or approve/deny the request.
+
+$a->config['system']['register_policy'] = REGISTER_OPEN;
+$a->config['system']['register_text'] = '';
+$a->config['system']['admin_email'] = '{{$adminmail}}';
+
+// Maximum size of an imported message, 0 is unlimited
+
+$a->config['system']['max_import_size'] = 200000;
+
+// maximum size of uploaded photos
+
+$a->config['system']['maximagesize'] = 800000;
+
+// Location of PHP command line processor
+
+$a->config['system']['php_path'] = '{{$phpath}}';
+
+// Configure how we communicate with directory servers.
+// DIRECTORY_MODE_NORMAL = directory client, we will find a directory
+// DIRECTORY_MODE_SECONDARY = caching directory or mirror
+// DIRECTORY_MODE_PRIMARY = main directory server
+// DIRECTORY_MODE_STANDALONE = "off the grid" or private directory services
+
+$a->config['system']['directory_mode'] = DIRECTORY_MODE_NORMAL;
+
+// default system theme
+
+$a->config['system']['theme'] = 'redbasic';
+
diff --git a/view/es/intro_complete_eml.tpl b/view/es/intro_complete_eml.tpl
index a2964808c..2c2428d68 100644
--- a/view/es/intro_complete_eml.tpl
+++ b/view/es/intro_complete_eml.tpl
@@ -1,21 +1,22 @@
-Estimado/a $username,
+Dear {{$username}},
- '$fn' en '$dfrn_url' ha aceptado tu petición
-conexión a '$sitename'.
+ '{{$fn}}' at '{{$dfrn_url}}' has accepted
+your connection request at '{{$sitename}}'.
- '$fn' ha optado por aceptarte come "fan", que restringe ciertas
-formas de comunicación, como mensajes privados y algunas interacciones
-con el perfil. Si eres una "celebridad" o una página de comunidad,
-estos ajustes se aplican automáticamente
+ '{{$fn}}' has chosen to accept you a "fan", which restricts
+some forms of communication - such as private messaging and some profile
+interactions. If this is a celebrity or community page, these settings were
+applied automatically.
- '$fn' puede optar por extender esto en una relación más permisiva
-en el futuro.
+ '{{$fn}}' may choose to extend this into a two-way or more permissive
+relationship in the future.
- Empezarás a recibir las actualizaciones públicas de estado de '$fn',
-que aparecerán en tu página "Red" en
+ You will start receiving public status updates from '{{$fn}}',
+which will appear on your 'Matrix' page at
-$siteurl
+{{$siteurl}}
+Sincerely,
- $sitename
+ {{$sitename}} Administrator
diff --git a/view/es/lostpass_eml.tpl b/view/es/lostpass_eml.tpl
index 607744bfe..3b79d2791 100644
--- a/view/es/lostpass_eml.tpl
+++ b/view/es/lostpass_eml.tpl
@@ -1,34 +1,32 @@
-Estimado/a $username,
-
- Se ha recibido una solicitud en $sitename recientemente para restablecer
-tu contraseña. Para confirmar esta solicitud, por favor seleccione el enlace de
-verificación debajo o cópialo y pégalo en la barra de direcciones de tu navegador.
+Dear {{$username}},
+ A request was recently received at {{$sitename}} to reset your account
+password. In order to confirm this request, please select the verification link
+below or paste it into your web browser address bar.
-Se NO has solicitado este cambio, por favor NO sigas el enlace indicado e ignora
-y/o elimina este mensaje.
+If you did NOT request this change, please DO NOT follow the link
+provided and ignore and/or delete this email.
-Tu contraseña no se cambiará a menos que podamos verificar que eres tu quien
-emitió esta solicitud.
+Your password will not be changed unless we can verify that you
+issued this request.
-Sigue este enlace para verificar tu identidad:
+Follow this link to verify your identity:
-$reset_link
+{{$reset_link}}
-A continuación recibirás un mensaje con la nueva contraseña.
+You will then receive a follow-up message containing the new password.
-Despues de accceder, podrás cambiar la contraseña de tu cuenta en la página de
-configuración.
+You may change that password from your account settings page after logging in.
-Los datos de acceso son los siguientes:
+The login details are as follows:
-Sitio: $siteurl
-Nombre: $email
+Site Location: {{$siteurl}}
+Login Name: {{$email}}
-Saludos,
- La administración de $sitename
+Sincerely,
+ {{$sitename}} Administrator
diff --git a/view/es/passchanged_eml.tpl b/view/es/passchanged_eml.tpl
index 7959846b7..0d94be3c2 100644
--- a/view/es/passchanged_eml.tpl
+++ b/view/es/passchanged_eml.tpl
@@ -1,19 +1,20 @@
-Estimado/a $username,
+Dear {{$username}},
+ Your password has been changed as requested. Please retain this
+information for your records (or change your password immediately to
+something that you will remember).
- Tu contraseña ha sido modificada como has solicitado. Anota esta información
-(o cambia inmediatamente la contraseña con algo que recuerdes).
+Your login details are as follows:
-Tus datos de acceso son los siguientes:
+Site Location: {{$siteurl}}
+Login Name: {{$email}}
+Password: {{$new_password}}
-Sitio: $siteurl
-Nombre: $email
-Contraseña: $new_password
+You may change that password from your account settings page after logging in.
-Después de acceder puedes cambiar la contraseña desde la página de configuración de tu perfil.
-
- $sitename
+Sincerely,
+ {{$sitename}} Administrator
diff --git a/view/es/register_open_eml.tpl b/view/es/register_open_eml.tpl
index 7c7a90b40..4b397201c 100644
--- a/view/es/register_open_eml.tpl
+++ b/view/es/register_open_eml.tpl
@@ -1,21 +1,19 @@
-Estimado/a $username,
+An account has been created at {{$sitename}} for this email address.
+The login details are as follows:
- Gracias por registrarte en $sitename. Tu cuenta ha sido creada.
+Site Location: {{$siteurl}}
+Login: {{$email}}
+Password: (the password which was provided during registration)
+If this account was created without your knowledge and is not desired, you may
+visit this site and reset the password. This will allow you to remove the
+account from the links on the Settings page, and we
+apologise for any inconvenience.
-Los datos de acceso son los siguientes:
+Thank you and welcome to {{$sitename}}.
-Sitio: $siteurl
-Nombre: $email
-Contraseña: $password
-
-
-Después de acceder puedes cambiar tu contraseña en la página de "Configuración".
-
-Toma un momento para revisar las otras configuraciones de la cuenta en esa página.
-
-
-Gracias y bienvenido/a $sitename.
+Sincerely,
+ {{$sitename}} Administrator
diff --git a/view/es/register_verify_eml.tpl b/view/es/register_verify_eml.tpl
index 9f2cc4d9b..85d9a12d3 100644
--- a/view/es/register_verify_eml.tpl
+++ b/view/es/register_verify_eml.tpl
@@ -1,22 +1,25 @@
-Se ha recibido la solicitud de registro de un nuevo usuario en
-$sitename que requiere tu aprobación.
+A new user registration request was received at {{$sitename}} which requires
+your approval.
-Los datos de acceso son los siguientes:
-Nombre Completo: $username
-Sitio: $siteurl
-Nombre: $email
+The login details are as follows:
+Site Location: {{$siteurl}}
+Login Name: {{$email}}
+IP Address: {{$details}}
-Para aprobar esta solicitud, visita el siguiente enlace:
+To approve this request please visit the following link:
-$siteurl/regmod/allow/$hash
-Para denegar la solicitud y eliminar la cuenta, por favor visita:
+{{$siteurl}}/regmod/allow/{{$hash}}
-$siteurl/regmod/deny/$hash
+To deny the request and remove the account, please visit:
-Gracias.
+
+{{$siteurl}}/regmod/deny/{{$hash}}
+
+
+Thank you.
diff --git a/view/es/request_notify_eml.tpl b/view/es/request_notify_eml.tpl
index 6161c45c1..d01b8ff27 100644
--- a/view/es/request_notify_eml.tpl
+++ b/view/es/request_notify_eml.tpl
@@ -1,13 +1,17 @@
-Estimado/a $myname,
+Dear {{$myname}},
-Acabas de recibir una solicitud de conexión de '$requestor' en $sitename.
+You have just received a connection request at {{$sitename}}
-Puedes visitar su perfil en $url.
+from '{{$requestor}}'.
-Accede a tu sitio para ver la presentación completa y aceptar o ignorar/cancelar la solicitud.
+You may visit their profile at {{$url}}.
-$siteurl
+Please login to your site to view the complete introduction
+and approve or ignore/cancel the request.
+{{$siteurl}}
- $sitename
+Regards,
+
+ {{$sitename}} administrator
diff --git a/view/es/update_fail_eml.tpl b/view/es/update_fail_eml.tpl
new file mode 100644
index 000000000..a7df8fc2f
--- /dev/null
+++ b/view/es/update_fail_eml.tpl
@@ -0,0 +1,13 @@
+Hey,
+I'm the web server at {{$sitename}};
+
+The Red Matrix developers released update {{$update}} recently,
+but when I tried to install it, something went terribly wrong.
+This needs to be fixed soon and it requires human intervention.
+Please contact a Red developer if you can not figure out how to
+fix it on your own. My database might be invalid.
+
+The error message is '{{$error}}'.
+
+Apologies for the inconvenience,
+ your web server at {{$siteurl}} \ No newline at end of file
diff --git a/view/fr/follow_notify_eml.tpl b/view/fr/follow_notify_eml.tpl
index 10d0b343b..ba07b19da 100644
--- a/view/fr/follow_notify_eml.tpl
+++ b/view/fr/follow_notify_eml.tpl
@@ -1,14 +1,14 @@
-Cher(e) $myname,
+Dear {{$myname}},
-Une nouvelle personne - $requestor - vous suit désormais sur $sitename.
+You have a new follower at {{$sitename}} - '{{$requestor}}'.
-Vous pouvez consulter son profil sur $url.
+You may visit their profile at {{$url}}.
-Merci de vous connecter à votre site pour approuver ou ignorer/annuler cette demande.
+Please login to your site to approve or ignore/cancel the request.
-$siteurl
+{{$siteurl}}
-Cordialement,
+Regards,
- l'administrateur de $sitename
+ {{$sitename}} administrator
diff --git a/view/fr/friend_complete_eml.tpl b/view/fr/friend_complete_eml.tpl
index 1f2553b5e..1c647b994 100644
--- a/view/fr/friend_complete_eml.tpl
+++ b/view/fr/friend_complete_eml.tpl
@@ -1,23 +1,22 @@
-Cher(e) $username,
+Dear {{$username}},
- Grande nouvelle… « $fn » (de « $dfrn_url ») a accepté votre
-demande de connexion à « $sitename ».
+ Great news... '{{$fn}}' at '{{$dfrn_url}}' has accepted
+your connection request at '{{$sitename}}'.
-Vous êtes désormais dans une relation réciproque et pouvez échanger des
-photos, des humeurs et des messages sans restriction.
+You are now mutual friends and may exchange status updates, photos, and email
+without restriction.
-Merci de visiter votre page « Contacts » sur $sitename pour toute
-modification que vous souhaiteriez apporter à cette relation.
+Please visit your 'Connnections' page at {{$sitename}} if you wish to make
+any changes to this relationship.
-$siteurl
+{{$siteurl}}
-[Par exemple, vous pouvez créer un profil spécifique avec des informations
-cachées au grand public - et ainsi assigner des droits privilégiés à
-« $fn »]/
+[For instance, you may create a separate profile with information that is not
+available to the general public - and assign viewing rights to '{{$fn}}'].
-Sincèremment,
+Sincerely,
- l'administrateur de $sitename
+ {{$sitename}} Administrator
diff --git a/view/fr/htconfig.tpl b/view/fr/htconfig.tpl
new file mode 100644
index 000000000..493cb5d00
--- /dev/null
+++ b/view/fr/htconfig.tpl
@@ -0,0 +1,70 @@
+<?php
+
+// Set the following for your MySQL installation
+// Copy or rename this file to .htconfig.php
+
+$db_host = '{{$dbhost}}';
+$db_port = '{{$dbport}}';
+$db_user = '{{$dbuser}}';
+$db_pass = '{{$dbpass}}';
+$db_data = '{{$dbdata}}';
+
+/*
+ * Notice: Many of the following settings will be available in the admin panel
+ * after a successful site install. Once they are set in the admin panel, they
+ * are stored in the DB - and the DB setting will over-ride any corresponding
+ * setting in this file
+ *
+ * The command-line tool util/config is able to query and set the DB items
+ * directly if for some reason the admin panel is not available and a system
+ * setting requires modification.
+ *
+ */
+
+
+// Choose a legal default timezone. If you are unsure, use "America/Los_Angeles".
+// It can be changed later and only applies to timestamps for anonymous viewers.
+
+$default_timezone = '{{$timezone}}';
+
+// What is your site name?
+
+$a->config['system']['baseurl'] = '{{$siteurl}}';
+$a->config['system']['sitename'] = "Red Matrix";
+$a->config['system']['location_hash'] = '{{$site_id}}';
+
+// Your choices are REGISTER_OPEN, REGISTER_APPROVE, or REGISTER_CLOSED.
+// Be certain to create your own personal account before setting
+// REGISTER_CLOSED. 'register_text' (if set) will be displayed prominently on
+// the registration page. REGISTER_APPROVE requires you set 'admin_email'
+// to the email address of an already registered person who can authorise
+// and/or approve/deny the request.
+
+$a->config['system']['register_policy'] = REGISTER_OPEN;
+$a->config['system']['register_text'] = '';
+$a->config['system']['admin_email'] = '{{$adminmail}}';
+
+// Maximum size of an imported message, 0 is unlimited
+
+$a->config['system']['max_import_size'] = 200000;
+
+// maximum size of uploaded photos
+
+$a->config['system']['maximagesize'] = 800000;
+
+// Location of PHP command line processor
+
+$a->config['system']['php_path'] = '{{$phpath}}';
+
+// Configure how we communicate with directory servers.
+// DIRECTORY_MODE_NORMAL = directory client, we will find a directory
+// DIRECTORY_MODE_SECONDARY = caching directory or mirror
+// DIRECTORY_MODE_PRIMARY = main directory server
+// DIRECTORY_MODE_STANDALONE = "off the grid" or private directory services
+
+$a->config['system']['directory_mode'] = DIRECTORY_MODE_NORMAL;
+
+// default system theme
+
+$a->config['system']['theme'] = 'redbasic';
+
diff --git a/view/fr/intro_complete_eml.tpl b/view/fr/intro_complete_eml.tpl
index f698cfeb7..2c2428d68 100644
--- a/view/fr/intro_complete_eml.tpl
+++ b/view/fr/intro_complete_eml.tpl
@@ -1,22 +1,22 @@
-Cher(e) $username,
+Dear {{$username}},
- « $fn » du site « $dfrn_url » a accepté votre
-demande de mise en relation sur « $sitename ».
+ '{{$fn}}' at '{{$dfrn_url}}' has accepted
+your connection request at '{{$sitename}}'.
- « $fn » a décidé de vous accepter comme « fan », ce qui restreint
-certains de vos moyens de communication - tels que les messages privés et
-certaines interactions avec son profil. S'il s'agit de la page d'une
-célébrité et/ou communauté, ces réglages ont été définis automatiquement.
+ '{{$fn}}' has chosen to accept you a "fan", which restricts
+some forms of communication - such as private messaging and some profile
+interactions. If this is a celebrity or community page, these settings were
+applied automatically.
- « $fn » pourra choisir d'étendre votre relation à quelque chose de
-plus permissif dans l'avenir.
+ '{{$fn}}' may choose to extend this into a two-way or more permissive
+relationship in the future.
- Vous allez commencer à recevoir les mises à jour publiques du
-statut de « $fn », lesquelles apparaîtront sur votre page « Réseau » sur
+ You will start receiving public status updates from '{{$fn}}',
+which will appear on your 'Matrix' page at
-$siteurl
+{{$siteurl}}
-Sincèrement votre,
+Sincerely,
- l'administrateur de $sitename
+ {{$sitename}} Administrator
diff --git a/view/fr/lostpass_eml.tpl b/view/fr/lostpass_eml.tpl
index 96c11d723..3b79d2791 100644
--- a/view/fr/lostpass_eml.tpl
+++ b/view/fr/lostpass_eml.tpl
@@ -1,34 +1,32 @@
-Cher(e) $username,
+Dear {{$username}},
+ A request was recently received at {{$sitename}} to reset your account
+password. In order to confirm this request, please select the verification link
+below or paste it into your web browser address bar.
- Nous avons récemment reçu, chez $sitename, une demande de remise
-à zéro du mot de passe protégeant votre compte. Pour confirmer cette
-demande, merci de cliquer sur le lien de vérification suivant, ou de le
-coller dans la barre d'adresse de votre navigateur web.
+If you did NOT request this change, please DO NOT follow the link
+provided and ignore and/or delete this email.
-Si vous n'êtes PAS à l'origine de cette demande, merci de NE PAS suivre
-le lien en question, et d'ignorer/supprimer ce courriel.
+Your password will not be changed unless we can verify that you
+issued this request.
-Votre mot de passe ne sera réinitialisé qu'une fois que nous aurons pu
-nous assurer que vous êtes bien à l'origine de cette demande.
+Follow this link to verify your identity:
-Merci de suivre le lien suivant pour confirmer votre identité :
+{{$reset_link}}
-$reset_link
+You will then receive a follow-up message containing the new password.
-Vous recevrez en retour un message avec votre nouveau mot de passe.
+You may change that password from your account settings page after logging in.
-Vous pourrez ensuite changer ce mot de passe, après connexion, dans la
-page des réglages du compte.
+The login details are as follows:
-Les informations du compte concerné sont :
+Site Location: {{$siteurl}}
+Login Name: {{$email}}
-Site : $siteurl
-Pseudo/Courriel : $email
-Sincèrement votre,
- l'administrateur de $sitename
+Sincerely,
+ {{$sitename}} Administrator
diff --git a/view/fr/passchanged_eml.tpl b/view/fr/passchanged_eml.tpl
index 4ea8899fc..0d94be3c2 100644
--- a/view/fr/passchanged_eml.tpl
+++ b/view/fr/passchanged_eml.tpl
@@ -1,20 +1,20 @@
-Cher(e) $username,
+Dear {{$username}},
+ Your password has been changed as requested. Please retain this
+information for your records (or change your password immediately to
+something that you will remember).
- Votre mot de passe a été modifié comme demandé. Merci de conserver
-cette information pour un usage ultérieur (ou bien de changer votre mot de
-passe immédiatement en quelque chose dont vous vous souviendrez).
-Vos informations de connexion sont désormais :
+Your login details are as follows:
-Site : $siteurl
-Pseudo/Courriel : $email
-Mot de passe : $new_password
+Site Location: {{$siteurl}}
+Login Name: {{$email}}
+Password: {{$new_password}}
-Vous pouvez changer ce mot de passe depuis la page des « réglages » de votre compte,
-après connexion
+You may change that password from your account settings page after logging in.
-Sincèrement votre,
- l'administrateur de $sitename
+
+Sincerely,
+ {{$sitename}} Administrator
diff --git a/view/fr/register_open_eml.tpl b/view/fr/register_open_eml.tpl
index 5d9e737c3..4b397201c 100644
--- a/view/fr/register_open_eml.tpl
+++ b/view/fr/register_open_eml.tpl
@@ -1,22 +1,19 @@
-Cher(e) $username,
+An account has been created at {{$sitename}} for this email address.
+The login details are as follows:
- Merci de votre inscription à $sitename. Votre compte a été créé.
-Les informations de connexion sont les suivantes :
+Site Location: {{$siteurl}}
+Login: {{$email}}
+Password: (the password which was provided during registration)
-Site : $siteurl
-Pseudo/Courriel : $email
-Mot de passe : $password
+If this account was created without your knowledge and is not desired, you may
+visit this site and reset the password. This will allow you to remove the
+account from the links on the Settings page, and we
+apologise for any inconvenience.
-Vous pouvez changer de mot de passe dans la page des « Réglages » de votre compte,
-après connexion.
+Thank you and welcome to {{$sitename}}.
-Merci de prendre quelques minutes pour découvrir les autres réglages disponibles
-sur cette page.
-
-Merci, et bienvenue sur $sitename.
-
-Sincèrement votre,
- l'administrateur de $sitename
+Sincerely,
+ {{$sitename}} Administrator
diff --git a/view/fr/register_verify_eml.tpl b/view/fr/register_verify_eml.tpl
index 9cb31a6a8..85d9a12d3 100644
--- a/view/fr/register_verify_eml.tpl
+++ b/view/fr/register_verify_eml.tpl
@@ -1,27 +1,25 @@
-Une nouvelle demande d'inscription a été reçue sur $sitename, et elle
-nécessite votre approbation.
+A new user registration request was received at {{$sitename}} which requires
+your approval.
-Les informations de connexion sont les suivantes :
+The login details are as follows:
-Nom complet : $username
-Site : $siteurl
-Pseudo/Courriel : $email
+Site Location: {{$siteurl}}
+Login Name: {{$email}}
+IP Address: {{$details}}
+To approve this request please visit the following link:
-Pour approuver cette demande, merci de suivre le lien :
+{{$siteurl}}/regmod/allow/{{$hash}}
-$siteurl/regmod/allow/$hash
+To deny the request and remove the account, please visit:
-Pour rejeter cette demande et supprimer le compte associé,
-merci de suivre le lien :
+{{$siteurl}}/regmod/deny/{{$hash}}
-$siteurl/regmod/deny/$hash
-
-En vous remerçiant.
+Thank you.
diff --git a/view/fr/request_notify_eml.tpl b/view/fr/request_notify_eml.tpl
index 9234ceaaa..d01b8ff27 100644
--- a/view/fr/request_notify_eml.tpl
+++ b/view/fr/request_notify_eml.tpl
@@ -1,17 +1,17 @@
-Cher(e) $myname,
+Dear {{$myname}},
-Vous venez de recevoir une demande de mise en relation sur $sitename
+You have just received a connection request at {{$sitename}}
-venant de « $requestor ».
+from '{{$requestor}}'.
-Vous pouvez visiter son profil sur $url.
+You may visit their profile at {{$url}}.
-Vous pouvez vous connecter à votre site pour voir la demande
-complète et l'approuver ou l'ignorer/annuler.
+Please login to your site to view the complete introduction
+and approve or ignore/cancel the request.
-$siteurl
+{{$siteurl}}
-Cordialement,
+Regards,
- l'administrateur de $sitename
+ {{$sitename}} administrator
diff --git a/view/fr/update_fail_eml.tpl b/view/fr/update_fail_eml.tpl
new file mode 100644
index 000000000..a7df8fc2f
--- /dev/null
+++ b/view/fr/update_fail_eml.tpl
@@ -0,0 +1,13 @@
+Hey,
+I'm the web server at {{$sitename}};
+
+The Red Matrix developers released update {{$update}} recently,
+but when I tried to install it, something went terribly wrong.
+This needs to be fixed soon and it requires human intervention.
+Please contact a Red developer if you can not figure out how to
+fix it on your own. My database might be invalid.
+
+The error message is '{{$error}}'.
+
+Apologies for the inconvenience,
+ your web server at {{$siteurl}} \ No newline at end of file
diff --git a/view/it/follow_notify_eml.tpl b/view/it/follow_notify_eml.tpl
index c85a0cdc9..ba07b19da 100644
--- a/view/it/follow_notify_eml.tpl
+++ b/view/it/follow_notify_eml.tpl
@@ -1,14 +1,14 @@
-Ciao $[myname],
+Dear {{$myname}},
-Un nuovo utente ha iniziato a seguirti su $[sitename] - '$[requestor]'.
+You have a new follower at {{$sitename}} - '{{$requestor}}'.
-Puoi vedere il suo profilo su $[url].
+You may visit their profile at {{$url}}.
-Accedi sul tuo sito per approvare o ignorare la richiesta.
+Please login to your site to approve or ignore/cancel the request.
-$[siteurl]
+{{$siteurl}}
-Saluti,
+Regards,
- L'amministratore di $[sitename] \ No newline at end of file
+ {{$sitename}} administrator
diff --git a/view/it/friend_complete_eml.tpl b/view/it/friend_complete_eml.tpl
index 890b0148c..1c647b994 100644
--- a/view/it/friend_complete_eml.tpl
+++ b/view/it/friend_complete_eml.tpl
@@ -1,22 +1,22 @@
-Ciao $[username],
+Dear {{$username}},
- Ottime notizie... '$[fn]' di '$[dfrn_url]' ha accettato
-la tua richiesta di connessione su '$[sitename]'.
+ Great news... '{{$fn}}' at '{{$dfrn_url}}' has accepted
+your connection request at '{{$sitename}}'.
-Adesso siete amici reciproci e potete scambiarvi aggiornamenti di stato, foto ed email
-senza restrizioni.
+You are now mutual friends and may exchange status updates, photos, and email
+without restriction.
-Vai nella pagina 'Contatti' di $[sitename] se vuoi effettuare
-qualche modifica riguardo questa relazione
+Please visit your 'Connnections' page at {{$sitename}} if you wish to make
+any changes to this relationship.
-$[siteurl]
+{{$siteurl}}
-[Ad esempio, potresti creare un profilo separato con le informazioni che non
-sono disponibili pubblicamente - ed permettere di vederlo a '$[fn]'].
+[For instance, you may create a separate profile with information that is not
+available to the general public - and assign viewing rights to '{{$fn}}'].
-Saluti,
+Sincerely,
- l'amministratore di $[sitename]
+ {{$sitename}} Administrator
- \ No newline at end of file
+
diff --git a/view/it/htconfig.tpl b/view/it/htconfig.tpl
new file mode 100644
index 000000000..493cb5d00
--- /dev/null
+++ b/view/it/htconfig.tpl
@@ -0,0 +1,70 @@
+<?php
+
+// Set the following for your MySQL installation
+// Copy or rename this file to .htconfig.php
+
+$db_host = '{{$dbhost}}';
+$db_port = '{{$dbport}}';
+$db_user = '{{$dbuser}}';
+$db_pass = '{{$dbpass}}';
+$db_data = '{{$dbdata}}';
+
+/*
+ * Notice: Many of the following settings will be available in the admin panel
+ * after a successful site install. Once they are set in the admin panel, they
+ * are stored in the DB - and the DB setting will over-ride any corresponding
+ * setting in this file
+ *
+ * The command-line tool util/config is able to query and set the DB items
+ * directly if for some reason the admin panel is not available and a system
+ * setting requires modification.
+ *
+ */
+
+
+// Choose a legal default timezone. If you are unsure, use "America/Los_Angeles".
+// It can be changed later and only applies to timestamps for anonymous viewers.
+
+$default_timezone = '{{$timezone}}';
+
+// What is your site name?
+
+$a->config['system']['baseurl'] = '{{$siteurl}}';
+$a->config['system']['sitename'] = "Red Matrix";
+$a->config['system']['location_hash'] = '{{$site_id}}';
+
+// Your choices are REGISTER_OPEN, REGISTER_APPROVE, or REGISTER_CLOSED.
+// Be certain to create your own personal account before setting
+// REGISTER_CLOSED. 'register_text' (if set) will be displayed prominently on
+// the registration page. REGISTER_APPROVE requires you set 'admin_email'
+// to the email address of an already registered person who can authorise
+// and/or approve/deny the request.
+
+$a->config['system']['register_policy'] = REGISTER_OPEN;
+$a->config['system']['register_text'] = '';
+$a->config['system']['admin_email'] = '{{$adminmail}}';
+
+// Maximum size of an imported message, 0 is unlimited
+
+$a->config['system']['max_import_size'] = 200000;
+
+// maximum size of uploaded photos
+
+$a->config['system']['maximagesize'] = 800000;
+
+// Location of PHP command line processor
+
+$a->config['system']['php_path'] = '{{$phpath}}';
+
+// Configure how we communicate with directory servers.
+// DIRECTORY_MODE_NORMAL = directory client, we will find a directory
+// DIRECTORY_MODE_SECONDARY = caching directory or mirror
+// DIRECTORY_MODE_PRIMARY = main directory server
+// DIRECTORY_MODE_STANDALONE = "off the grid" or private directory services
+
+$a->config['system']['directory_mode'] = DIRECTORY_MODE_NORMAL;
+
+// default system theme
+
+$a->config['system']['theme'] = 'redbasic';
+
diff --git a/view/it/intro_complete_eml.tpl b/view/it/intro_complete_eml.tpl
index 46fe7018b..2c2428d68 100644
--- a/view/it/intro_complete_eml.tpl
+++ b/view/it/intro_complete_eml.tpl
@@ -1,22 +1,22 @@
-Ciao $[username],
+Dear {{$username}},
- '$[fn]' di '$[dfrn_url]' ha accettato
-la tua richiesta di connessione a '$[sitename]'.
+ '{{$fn}}' at '{{$dfrn_url}}' has accepted
+your connection request at '{{$sitename}}'.
- '$[fn]' ha deciso di accettarti come "fan", il che restringe
-alcune forme di comunicazione - come i messaggi privati e alcune
-interazioni. Se è la pagina di una persona famosa o di una comunità, queste impostazioni saranno
-applicate automaticamente.
+ '{{$fn}}' has chosen to accept you a "fan", which restricts
+some forms of communication - such as private messaging and some profile
+interactions. If this is a celebrity or community page, these settings were
+applied automatically.
- '$[fn]' potrebbe decidere di estendere questa relazione in una comunicazione bidirezionale o ancora più permissiva
-.
+ '{{$fn}}' may choose to extend this into a two-way or more permissive
+relationship in the future.
- Inizierai a ricevere gli aggiornamenti di stato pubblici da '$[fn]',
-che apparirà nella tua pagina 'Rete'
+ You will start receiving public status updates from '{{$fn}}',
+which will appear on your 'Matrix' page at
-$[siteurl]
+{{$siteurl}}
-Saluti,
+Sincerely,
- l'amministratore di $[sitename] \ No newline at end of file
+ {{$sitename}} Administrator
diff --git a/view/it/lostpass_eml.tpl b/view/it/lostpass_eml.tpl
index 26d3d6817..3b79d2791 100644
--- a/view/it/lostpass_eml.tpl
+++ b/view/it/lostpass_eml.tpl
@@ -1,32 +1,32 @@
-Ciao $[username],
- Su $[sitename] è stata ricevuta una richiesta di azzeramento di password per un account.
-Per confermare la richiesta, clicca sul link di verifica
-qui in fondo oppure copialo nella barra degli indirizzi del tuo browser.
+Dear {{$username}},
+ A request was recently received at {{$sitename}} to reset your account
+password. In order to confirm this request, please select the verification link
+below or paste it into your web browser address bar.
-Se NON hai richiesto l'azzeramento, NON seguire il link
-e ignora e/o cancella questa email.
+If you did NOT request this change, please DO NOT follow the link
+provided and ignore and/or delete this email.
-La tua password non sarà modificata finché non avremo verificato che
-hai fatto questa richiesta.
+Your password will not be changed unless we can verify that you
+issued this request.
-Per verificare la tua identità clicca su:
+Follow this link to verify your identity:
-$[reset_link]
+{{$reset_link}}
-Dopo la verifica riceverai un messaggio di risposta con la nuova password.
+You will then receive a follow-up message containing the new password.
-Potrai cambiare la password dalla pagina delle impostazioni dopo aver effettuato l'accesso.
+You may change that password from your account settings page after logging in.
-I dati di accesso sono i seguenti:
+The login details are as follows:
-Sito:»$[siteurl]
-Nome utente:»$[email]
+Site Location: {{$siteurl}}
+Login Name: {{$email}}
-Saluti,
- l'amministratore di $[sitename]
+Sincerely,
+ {{$sitename}} Administrator
- \ No newline at end of file
+
diff --git a/view/it/messages.po b/view/it/messages.po
index 99002d909..6941bbf53 100644
--- a/view/it/messages.po
+++ b/view/it/messages.po
@@ -1,4421 +1,4171 @@
-# FRIENDICA Distributed Social Network
-# Copyright (C) 2010, 2011 the Friendica Project
-# This file is distributed under the same license as the Friendica package.
+# Red Communications Project
+# Copyright (C) 2013 the Red Matrix Project
+# This file is distributed under the same license as the Red package.
#
# Translators:
-# fabrixxm <fabrix.xm@gmail.com>, 2011.
-# <fabrix.xm@gmail.com>, 2011, 2012.
-# Francesco Apruzzese <cescoap@gmail.com>, 2012.
-# <marco@carnazzo.it>, 2012.
-# Paolo Pa <pynolo@tarine.net>, 2012.
-msgid ""
-msgstr ""
-"Project-Id-Version: friendica\n"
-"Report-Msgid-Bugs-To: http://bugs.friendica.com/\n"
-"POT-Creation-Date: 2012-09-27 10:00-0700\n"
-"PO-Revision-Date: 2012-09-28 08:27+0000\n"
-"Last-Translator: ufic <marco@carnazzo.it>\n"
-"Language-Team: Italian (http://www.transifex.com/projects/p/friendica/language/it/)\n"
+# fabrixxm <fabrix.xm@gmail.com>, 2011
+# fabrixxm <fabrix.xm@gmail.com>, 2011-2012
+# Francesco Apruzzese <cescoap@gmail.com>, 2012-2013
+# ufic <marco@carnazzo.it>, 2012
+# tuscanhobbit Pa <pynolo@tarine.net>, 2012
+# tuscanhobbit Pa <pynolo@tarine.net>, 2013-2014
+msgid ""
+msgstr ""
+"Project-Id-Version: Red Matrix\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2014-01-10 00:02-0800\n"
+"PO-Revision-Date: 2014-01-10 18:25+0000\n"
+"Last-Translator: tuscanhobbit Pa <pynolo@tarine.net>\n"
+"Language-Team: Italian (http://www.transifex.com/projects/p/red-matrix/language/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"
-#: ../../mod/oexchange.php:25
-msgid "Post successful."
-msgstr "Inviato!"
+#: ../../include/acl_selectors.php:235
+msgid "Visible to everybody"
+msgstr "Visibile a tutti"
-#: ../../mod/update_notes.php:41 ../../mod/update_community.php:18
-#: ../../mod/update_network.php:22 ../../mod/update_profile.php:41
-msgid "[Embedded content - reload page to view]"
-msgstr "[Contenuto incorporato - ricarica la pagina per visualizzarlo correttamente]"
+#: ../../include/acl_selectors.php:236
+msgid "show"
+msgstr "mostra"
-#: ../../mod/crepair.php:102
-msgid "Contact settings applied."
-msgstr "Contatto modificato."
-
-#: ../../mod/crepair.php:104
-msgid "Contact update failed."
-msgstr "Le modifiche al contatto non sono state salvate."
-
-#: ../../mod/crepair.php:115 ../../mod/wall_attach.php:55
-#: ../../mod/fsuggest.php:78 ../../mod/events.php:140 ../../mod/api.php:26
-#: ../../mod/api.php:31 ../../mod/photos.php:128 ../../mod/photos.php:972
-#: ../../mod/editpost.php:10 ../../mod/install.php:151 ../../mod/poke.php:135
-#: ../../mod/notifications.php:66 ../../mod/contacts.php:146
-#: ../../mod/settings.php:86 ../../mod/settings.php:525
-#: ../../mod/settings.php:530 ../../mod/manage.php:87 ../../mod/network.php:6
-#: ../../mod/notes.php:20 ../../mod/wallmessage.php:9
-#: ../../mod/wallmessage.php:33 ../../mod/wallmessage.php:79
-#: ../../mod/wallmessage.php:103 ../../mod/attach.php:33
-#: ../../mod/group.php:19 ../../mod/viewconnections.php:22
-#: ../../mod/register.php:38 ../../mod/regmod.php:116 ../../mod/item.php:126
-#: ../../mod/item.php:142 ../../mod/mood.php:114
-#: ../../mod/profile_photo.php:19 ../../mod/profile_photo.php:169
-#: ../../mod/profile_photo.php:180 ../../mod/profile_photo.php:193
-#: ../../mod/message.php:38 ../../mod/message.php:168
-#: ../../mod/allfriends.php:9 ../../mod/nogroup.php:25
-#: ../../mod/wall_upload.php:64 ../../mod/follow.php:9
-#: ../../mod/display.php:141 ../../mod/profiles.php:7
-#: ../../mod/profiles.php:413 ../../mod/delegate.php:6
-#: ../../mod/suggest.php:28 ../../mod/invite.php:13 ../../mod/invite.php:81
-#: ../../mod/dfrn_confirm.php:53 ../../addon/facebook/facebook.php:510
-#: ../../addon/facebook/facebook.php:516 ../../addon/fbpost/fbpost.php:159
-#: ../../addon/fbpost/fbpost.php:165
-#: ../../addon/dav/friendica/layout.fnk.php:354 ../../include/items.php:3913
-#: ../../index.php:317
-msgid "Permission denied."
-msgstr "Permesso negato."
+#: ../../include/acl_selectors.php:237
+msgid "don't show"
+msgstr "non mostrare"
-#: ../../mod/crepair.php:129 ../../mod/fsuggest.php:20
-#: ../../mod/fsuggest.php:92 ../../mod/dfrn_confirm.php:118
-msgid "Contact not found."
-msgstr "Contatto non trovato."
+#: ../../include/activities.php:39
+msgid " and "
+msgstr "e"
-#: ../../mod/crepair.php:135
-msgid "Repair Contact Settings"
-msgstr "Ripara il contatto"
+#: ../../include/activities.php:47
+msgid "public profile"
+msgstr "profilo pubblico"
-#: ../../mod/crepair.php:137
-msgid ""
-"<strong>WARNING: This is highly advanced</strong> and if you enter incorrect"
-" information your communications with this contact may stop working."
-msgstr "<strong>ATTENZIONE: Queste sono impostazioni avanzate</strong> e se inserisci informazioni errate le tue comunicazioni con questo contatto potrebbero non funzionare più"
+#: ../../include/activities.php:52
+#, php-format
+msgid "%1$s changed %2$s to &ldquo;%3$s&rdquo;"
+msgstr "%1$s ha cambiato %2$s in &ldquo;%3$s&rdquo;"
-#: ../../mod/crepair.php:138
-msgid ""
-"Please use your browser 'Back' button <strong>now</strong> if you are "
-"uncertain what to do on this page."
-msgstr "Usa <strong>ora</strong> il tasto 'Indietro' del tuo browser se non sei sicuro di cosa fare in questa pagina."
+#: ../../include/activities.php:53
+#, php-format
+msgid "Visit %1$s's %2$s"
+msgstr "Guarda %2$s di %1$s "
-#: ../../mod/crepair.php:144
-msgid "Return to contact editor"
-msgstr "Ritorna alla modifica contatto"
+#: ../../include/activities.php:56
+#, php-format
+msgid "%1$s has an updated %2$s, changing %3$s."
+msgstr "%1$s ha aggiornato %2$s cambiando %3$s."
-#: ../../mod/crepair.php:148 ../../mod/settings.php:545
-#: ../../mod/settings.php:571 ../../mod/admin.php:692 ../../mod/admin.php:702
-msgid "Name"
-msgstr "Nome"
+#: ../../include/api.php:973
+msgid "Public Timeline"
+msgstr "Diario pubblico"
-#: ../../mod/crepair.php:149
-msgid "Account Nickname"
-msgstr "Nome utente"
-
-#: ../../mod/crepair.php:150
-msgid "@Tagname - overrides Name/Nickname"
-msgstr "@TagName - al posto del nome utente"
-
-#: ../../mod/crepair.php:151
-msgid "Account URL"
-msgstr "URL dell'utente"
-
-#: ../../mod/crepair.php:152
-msgid "Friend Request URL"
-msgstr "URL Richiesta Amicizia"
-
-#: ../../mod/crepair.php:153
-msgid "Friend Confirm URL"
-msgstr "URL Conferma Amicizia"
-
-#: ../../mod/crepair.php:154
-msgid "Notification Endpoint URL"
-msgstr "URL Notifiche"
-
-#: ../../mod/crepair.php:155
-msgid "Poll/Feed URL"
-msgstr "URL Feed"
-
-#: ../../mod/crepair.php:156
-msgid "New photo from this URL"
-msgstr "Nuova foto da questo URL"
-
-#: ../../mod/crepair.php:166 ../../mod/fsuggest.php:107
-#: ../../mod/events.php:455 ../../mod/photos.php:1005
-#: ../../mod/photos.php:1081 ../../mod/photos.php:1338
-#: ../../mod/photos.php:1378 ../../mod/photos.php:1419
-#: ../../mod/photos.php:1451 ../../mod/install.php:246
-#: ../../mod/install.php:284 ../../mod/localtime.php:45 ../../mod/poke.php:199
-#: ../../mod/content.php:693 ../../mod/contacts.php:348
-#: ../../mod/settings.php:543 ../../mod/settings.php:697
-#: ../../mod/settings.php:769 ../../mod/settings.php:976
-#: ../../mod/group.php:85 ../../mod/mood.php:137 ../../mod/message.php:294
-#: ../../mod/message.php:480 ../../mod/admin.php:443 ../../mod/admin.php:689
-#: ../../mod/admin.php:826 ../../mod/admin.php:1025 ../../mod/admin.php:1112
-#: ../../mod/profiles.php:583 ../../mod/invite.php:119
-#: ../../addon/fromgplus/fromgplus.php:40
-#: ../../addon/facebook/facebook.php:619
-#: ../../addon/snautofollow/snautofollow.php:64 ../../addon/bg/bg.php:90
-#: ../../addon/fbpost/fbpost.php:226 ../../addon/yourls/yourls.php:76
-#: ../../addon/ljpost/ljpost.php:93 ../../addon/nsfw/nsfw.php:88
-#: ../../addon/page/page.php:210 ../../addon/planets/planets.php:158
-#: ../../addon/uhremotestorage/uhremotestorage.php:89
-#: ../../addon/randplace/randplace.php:177 ../../addon/dwpost/dwpost.php:93
-#: ../../addon/drpost/drpost.php:110 ../../addon/startpage/startpage.php:92
-#: ../../addon/geonames/geonames.php:187 ../../addon/oembed.old/oembed.php:41
-#: ../../addon/forumlist/forumlist.php:163
-#: ../../addon/impressum/impressum.php:83
-#: ../../addon/notimeline/notimeline.php:64 ../../addon/blockem/blockem.php:57
-#: ../../addon/qcomment/qcomment.php:61
-#: ../../addon/openstreetmap/openstreetmap.php:70
-#: ../../addon/group_text/group_text.php:84
-#: ../../addon/libravatar/libravatar.php:99
-#: ../../addon/libertree/libertree.php:90 ../../addon/altpager/altpager.php:87
-#: ../../addon/mathjax/mathjax.php:42 ../../addon/editplain/editplain.php:84
-#: ../../addon/blackout/blackout.php:98 ../../addon/gravatar/gravatar.php:95
-#: ../../addon/pageheader/pageheader.php:55 ../../addon/ijpost/ijpost.php:93
-#: ../../addon/jappixmini/jappixmini.php:307
-#: ../../addon/statusnet/statusnet.php:278
-#: ../../addon/statusnet/statusnet.php:292
-#: ../../addon/statusnet/statusnet.php:318
-#: ../../addon/statusnet/statusnet.php:325
-#: ../../addon/statusnet/statusnet.php:353
-#: ../../addon/statusnet/statusnet.php:576 ../../addon/tumblr/tumblr.php:90
-#: ../../addon/numfriends/numfriends.php:85 ../../addon/gnot/gnot.php:88
-#: ../../addon/wppost/wppost.php:110 ../../addon/showmore/showmore.php:48
-#: ../../addon/piwik/piwik.php:89 ../../addon/twitter/twitter.php:180
-#: ../../addon/twitter/twitter.php:209 ../../addon/twitter/twitter.php:394
-#: ../../addon/irc/irc.php:55 ../../addon/fromapp/fromapp.php:77
-#: ../../addon/blogger/blogger.php:102 ../../addon/posterous/posterous.php:103
-#: ../../view/theme/cleanzero/config.php:80
-#: ../../view/theme/diabook/theme.php:757
-#: ../../view/theme/diabook/config.php:190
-#: ../../view/theme/quattro/config.php:53 ../../view/theme/dispy/config.php:70
-#: ../../object/Item.php:560
-msgid "Submit"
-msgstr "Invia"
+#: ../../include/nav.php:72 ../../include/nav.php:87 ../../boot.php:1415
+msgid "Logout"
+msgstr "Esci"
-#: ../../mod/help.php:30
-msgid "Help:"
-msgstr "Guida:"
+#: ../../include/nav.php:72 ../../include/nav.php:87
+msgid "End this session"
+msgstr "Chiudi questa sessione"
-#: ../../mod/help.php:34 ../../addon/dav/friendica/layout.fnk.php:225
-#: ../../include/nav.php:86
-msgid "Help"
-msgstr "Guida"
+#: ../../include/nav.php:75 ../../include/nav.php:121
+msgid "Home"
+msgstr "Bacheca"
-#: ../../mod/help.php:38 ../../index.php:226
-msgid "Not Found"
-msgstr "Non trovato"
+#: ../../include/nav.php:75
+msgid "Your posts and conversations"
+msgstr "I tuoi articoli e conversazioni"
-#: ../../mod/help.php:41 ../../index.php:229
-msgid "Page not found."
-msgstr "Pagina non trovata."
+#: ../../include/nav.php:76 ../../include/conversation.php:932
+#: ../../mod/connedit.php:309 ../../mod/connedit.php:423
+msgid "View Profile"
+msgstr "Profilo"
-#: ../../mod/wall_attach.php:69
-#, php-format
-msgid "File exceeds size limit of %d"
-msgstr "Il file supera la dimensione massima di %d"
+#: ../../include/nav.php:76
+msgid "Your profile page"
+msgstr "Il tuo profilo"
-#: ../../mod/wall_attach.php:110 ../../mod/wall_attach.php:121
-msgid "File upload failed."
-msgstr "Caricamento del file non riuscito."
+#: ../../include/nav.php:78
+msgid "Edit Profiles"
+msgstr "Modifica i profili"
-#: ../../mod/fsuggest.php:63
-msgid "Friend suggestion sent."
-msgstr "Suggerimento di amicizia inviato."
+#: ../../include/nav.php:78
+msgid "Manage/Edit Profiles"
+msgstr "Gestisci e modifica i profili"
-#: ../../mod/fsuggest.php:97
-msgid "Suggest Friends"
-msgstr "Suggerisci amici"
+#: ../../include/nav.php:79 ../../include/conversation.php:1462
+#: ../../mod/fbrowser.php:25
+msgid "Photos"
+msgstr "Foto"
-#: ../../mod/fsuggest.php:99
-#, php-format
-msgid "Suggest a friend for %s"
-msgstr "Suggerisci un amico a %s"
+#: ../../include/nav.php:79
+msgid "Your photos"
+msgstr "Le tue foto"
-#: ../../mod/events.php:66
-msgid "Event title and start time are required."
-msgstr ""
+#: ../../include/nav.php:85 ../../boot.php:1416
+msgid "Login"
+msgstr "Accedi"
-#: ../../mod/events.php:279
-msgid "l, F j"
-msgstr "l j F"
+#: ../../include/nav.php:85
+msgid "Sign in"
+msgstr "Entra"
-#: ../../mod/events.php:301
-msgid "Edit event"
-msgstr "Modifca l'evento"
+#: ../../include/nav.php:102
+#, php-format
+msgid "%s - click to logout"
+msgstr "%s - clicca per uscire"
-#: ../../mod/events.php:323 ../../include/text.php:1187
-msgid "link to source"
-msgstr "Collegamento all'originale"
+#: ../../include/nav.php:107
+msgid "Click to authenticate to your home hub"
+msgstr "Clicca per autenticarti sul tuo server principale"
-#: ../../mod/events.php:347 ../../view/theme/diabook/theme.php:131
-#: ../../include/nav.php:52 ../../boot.php:1689
-msgid "Events"
-msgstr "Eventi"
+#: ../../include/nav.php:121
+msgid "Home Page"
+msgstr "Bacheca"
-#: ../../mod/events.php:348
-msgid "Create New Event"
-msgstr "Crea un nuovo evento"
+#: ../../include/nav.php:125 ../../mod/register.php:206 ../../boot.php:1392
+msgid "Register"
+msgstr "Iscriviti"
-#: ../../mod/events.php:349 ../../addon/dav/friendica/layout.fnk.php:263
-msgid "Previous"
-msgstr "Precendente"
+#: ../../include/nav.php:125
+msgid "Create an account"
+msgstr "Crea un account"
-#: ../../mod/events.php:350 ../../mod/install.php:205
-#: ../../addon/dav/friendica/layout.fnk.php:266
-msgid "Next"
-msgstr "Successivo"
+#: ../../include/nav.php:130 ../../mod/help.php:60 ../../mod/help.php:64
+msgid "Help"
+msgstr "Guida"
-#: ../../mod/events.php:423
-msgid "hour:minute"
-msgstr "ora:minuti"
+#: ../../include/nav.php:130
+msgid "Help and documentation"
+msgstr "Guida e documentazione"
-#: ../../mod/events.php:433
-msgid "Event details"
-msgstr "Dettagli dell'evento"
+#: ../../include/nav.php:133
+msgid "Apps"
+msgstr "Apps"
-#: ../../mod/events.php:434
-#, php-format
-msgid "Format is %s %s. Starting date and Title are required."
-msgstr ""
+#: ../../include/nav.php:133
+msgid "Addon applications, utilities, games"
+msgstr "App, strumenti e giochi aggiuntivi"
-#: ../../mod/events.php:436
-msgid "Event Starts:"
-msgstr "L'evento inizia:"
+#: ../../include/nav.php:135 ../../include/text.php:736
+#: ../../include/text.php:750 ../../mod/search.php:28
+msgid "Search"
+msgstr "Cerca"
-#: ../../mod/events.php:436 ../../mod/events.php:450
-msgid "Required"
-msgstr ""
+#: ../../include/nav.php:135
+msgid "Search site content"
+msgstr "Cerca nel sito"
-#: ../../mod/events.php:439
-msgid "Finish date/time is not known or not relevant"
-msgstr "La data/ora di fine non è definita"
+#: ../../include/nav.php:138 ../../mod/directory.php:209
+msgid "Directory"
+msgstr "Tutti i canali"
-#: ../../mod/events.php:441
-msgid "Event Finishes:"
-msgstr "L'evento finisce:"
+#: ../../include/nav.php:138
+msgid "Channel Locator"
+msgstr "Ricerca canali"
-#: ../../mod/events.php:444
-msgid "Adjust for viewer timezone"
-msgstr "Visualizza con il fuso orario di chi legge"
+#: ../../include/nav.php:149
+msgid "Matrix"
+msgstr "La tua rete"
-#: ../../mod/events.php:446
-msgid "Description:"
-msgstr "Descrizione:"
+#: ../../include/nav.php:149
+msgid "Your matrix"
+msgstr "La tua rete"
-#: ../../mod/events.php:448 ../../mod/directory.php:134
-#: ../../include/event.php:40 ../../include/bb2diaspora.php:412
-#: ../../boot.php:1226
-msgid "Location:"
-msgstr "Posizione:"
+#: ../../include/nav.php:150
+msgid "Mark all matrix notifications seen"
+msgstr "Segna come lette le notifiche della tua rete"
-#: ../../mod/events.php:450
-msgid "Title:"
-msgstr ""
+#: ../../include/nav.php:152
+msgid "Channel Home"
+msgstr "Bacheca del canale"
-#: ../../mod/events.php:452
-msgid "Share this event"
-msgstr "Condividi questo evento"
+#: ../../include/nav.php:152
+msgid "Channel home"
+msgstr "Bacheca del canale"
-#: ../../mod/tagrm.php:11 ../../mod/tagrm.php:94 ../../mod/editpost.php:136
-#: ../../mod/dfrn_request.php:847 ../../mod/settings.php:544
-#: ../../mod/settings.php:570 ../../addon/js_upload/js_upload.php:45
-#: ../../include/conversation.php:935
-msgid "Cancel"
-msgstr "Annulla"
+#: ../../include/nav.php:153
+msgid "Mark all channel notifications seen"
+msgstr "Segna come lette le notifiche dei canali"
-#: ../../mod/tagrm.php:41
-msgid "Tag removed"
-msgstr "Tag rimosso"
+#: ../../include/nav.php:156
+msgid "Intros"
+msgstr "Richieste"
-#: ../../mod/tagrm.php:79
-msgid "Remove Item Tag"
-msgstr "Rimuovi il tag"
+#: ../../include/nav.php:156 ../../mod/connections.php:242
+msgid "New Connections"
+msgstr "Nuovi contatti"
-#: ../../mod/tagrm.php:81
-msgid "Select a tag to remove: "
-msgstr "Seleziona un tag da rimuovere: "
+#: ../../include/nav.php:159
+msgid "Notices"
+msgstr "Notifiche"
-#: ../../mod/tagrm.php:93 ../../mod/delegate.php:130
-#: ../../addon/dav/common/wdcal_edit.inc.php:468
-msgid "Remove"
-msgstr "Rimuovi"
+#: ../../include/nav.php:159
+msgid "Notifications"
+msgstr "Notifiche"
-#: ../../mod/dfrn_poll.php:99 ../../mod/dfrn_poll.php:530
-#, php-format
-msgid "%s welcomes %s"
-msgstr "%s dà il benvenuto a %s"
+#: ../../include/nav.php:160
+msgid "See all notifications"
+msgstr "Vedi tutte le notifiche"
-#: ../../mod/api.php:76 ../../mod/api.php:102
-msgid "Authorize application connection"
-msgstr "Autorizza la connessione dell'applicazione"
+#: ../../include/nav.php:161
+msgid "Mark all system notifications seen"
+msgstr "Segna come lette le notifiche di sistema"
-#: ../../mod/api.php:77
-msgid "Return to your app and insert this Securty Code:"
-msgstr "Torna alla tua applicazione e inserisci questo codice di sicurezza:"
+#: ../../include/nav.php:163
+msgid "Mail"
+msgstr "Messaggi"
-#: ../../mod/api.php:89
-msgid "Please login to continue."
-msgstr "Effettua il login per continuare."
+#: ../../include/nav.php:163
+msgid "Private mail"
+msgstr "Messaggi privati"
-#: ../../mod/api.php:104
-msgid ""
-"Do you want to authorize this application to access your posts and contacts,"
-" and/or create new posts for you?"
-msgstr "Vuoi autorizzare questa applicazione per accedere ai messaggi e ai contatti, e / o creare nuovi messaggi per te?"
-
-#: ../../mod/api.php:105 ../../mod/dfrn_request.php:835
-#: ../../mod/settings.php:892 ../../mod/settings.php:898
-#: ../../mod/settings.php:906 ../../mod/settings.php:910
-#: ../../mod/settings.php:915 ../../mod/settings.php:921
-#: ../../mod/settings.php:927 ../../mod/settings.php:933
-#: ../../mod/settings.php:963 ../../mod/settings.php:964
-#: ../../mod/settings.php:965 ../../mod/settings.php:966
-#: ../../mod/settings.php:967 ../../mod/register.php:236
-#: ../../mod/profiles.php:563
-msgid "Yes"
-msgstr "Si"
+#: ../../include/nav.php:164
+msgid "See all private messages"
+msgstr "Guarda tutti i messaggi privati"
-#: ../../mod/api.php:106 ../../mod/dfrn_request.php:836
-#: ../../mod/settings.php:892 ../../mod/settings.php:898
-#: ../../mod/settings.php:906 ../../mod/settings.php:910
-#: ../../mod/settings.php:915 ../../mod/settings.php:921
-#: ../../mod/settings.php:927 ../../mod/settings.php:933
-#: ../../mod/settings.php:963 ../../mod/settings.php:964
-#: ../../mod/settings.php:965 ../../mod/settings.php:966
-#: ../../mod/settings.php:967 ../../mod/register.php:237
-#: ../../mod/profiles.php:564
-msgid "No"
-msgstr "No"
+#: ../../include/nav.php:165
+msgid "Mark all private messages seen"
+msgstr "Segna come letti tutti i messaggi privati"
-#: ../../mod/photos.php:46 ../../boot.php:1682
-msgid "Photo Albums"
-msgstr "Album foto"
+#: ../../include/nav.php:166
+msgid "Inbox"
+msgstr "In arrivo"
-#: ../../mod/photos.php:54 ../../mod/photos.php:149 ../../mod/photos.php:986
-#: ../../mod/photos.php:1073 ../../mod/photos.php:1088
-#: ../../mod/photos.php:1530 ../../mod/photos.php:1542
-#: ../../addon/communityhome/communityhome.php:110
-#: ../../view/theme/diabook/theme.php:598
-msgid "Contact Photos"
-msgstr "Foto dei contatti"
+#: ../../include/nav.php:167
+msgid "Outbox"
+msgstr "Inviati"
-#: ../../mod/photos.php:61 ../../mod/photos.php:1104 ../../mod/photos.php:1580
-msgid "Upload New Photos"
-msgstr "Carica nuove foto"
+#: ../../include/nav.php:168 ../../include/widgets.php:509
+msgid "New Message"
+msgstr "Nuovo messaggio"
-#: ../../mod/photos.php:74 ../../mod/settings.php:23
-msgid "everybody"
-msgstr "tutti"
+#: ../../include/nav.php:171 ../../include/conversation.php:1482
+#: ../../mod/events.php:354
+msgid "Events"
+msgstr "Eventi"
-#: ../../mod/photos.php:138
-msgid "Contact information unavailable"
-msgstr "I dati di questo contatto non sono disponibili"
+#: ../../include/nav.php:171
+msgid "Event Calendar"
+msgstr "Calendario"
-#: ../../mod/photos.php:149 ../../mod/photos.php:653 ../../mod/photos.php:1073
-#: ../../mod/photos.php:1088 ../../mod/profile_photo.php:74
-#: ../../mod/profile_photo.php:81 ../../mod/profile_photo.php:88
-#: ../../mod/profile_photo.php:204 ../../mod/profile_photo.php:296
-#: ../../mod/profile_photo.php:305
-#: ../../addon/communityhome/communityhome.php:111
-#: ../../view/theme/diabook/theme.php:599 ../../include/user.php:324
-#: ../../include/user.php:331 ../../include/user.php:338
-msgid "Profile Photos"
-msgstr "Foto del profilo"
+#: ../../include/nav.php:172
+msgid "See all events"
+msgstr "Guarda tutti gli eventi"
-#: ../../mod/photos.php:159
-msgid "Album not found."
-msgstr "Album non trovato."
+#: ../../include/nav.php:173
+msgid "Mark all events seen"
+msgstr "Marca come letti tutti gli eventi"
-#: ../../mod/photos.php:177 ../../mod/photos.php:1082
-msgid "Delete Album"
-msgstr "Rimuovi album"
+#: ../../include/nav.php:175
+msgid "Channel Select"
+msgstr "Gestisci i canali"
-#: ../../mod/photos.php:240 ../../mod/photos.php:1339
-msgid "Delete Photo"
-msgstr "Rimuovi foto"
+#: ../../include/nav.php:175
+msgid "Manage Your Channels"
+msgstr "Gestisci i contatti dei tuoi canali"
-#: ../../mod/photos.php:584
-msgid "was tagged in a"
-msgstr "è stato taggato in una"
+#: ../../include/nav.php:177 ../../include/widgets.php:487
+#: ../../mod/admin.php:785 ../../mod/admin.php:990
+msgid "Settings"
+msgstr "Impostazioni"
-#: ../../mod/photos.php:584 ../../mod/like.php:145 ../../mod/tagger.php:62
-#: ../../addon/communityhome/communityhome.php:163
-#: ../../view/theme/diabook/theme.php:570 ../../include/text.php:1439
-#: ../../include/diaspora.php:1824 ../../include/conversation.php:125
-#: ../../include/conversation.php:253
-msgid "photo"
-msgstr "foto"
+#: ../../include/nav.php:177
+msgid "Account/Channel Settings"
+msgstr "Impostazioni account e canali"
-#: ../../mod/photos.php:584
-msgid "by"
-msgstr "da"
+#: ../../include/nav.php:179 ../../mod/connections.php:349
+msgid "Connections"
+msgstr "Contatti"
-#: ../../mod/photos.php:689 ../../addon/js_upload/js_upload.php:315
-msgid "Image exceeds size limit of "
-msgstr "L'immagine supera il limite di"
+#: ../../include/nav.php:179
+msgid "Manage/Edit Friends and Connections"
+msgstr "Modifica amici e contatti"
-#: ../../mod/photos.php:697
-msgid "Image file is empty."
-msgstr "Il file dell'immagine è vuoto."
+#: ../../include/nav.php:186 ../../mod/admin.php:111
+msgid "Admin"
+msgstr "Amministrazione"
-#: ../../mod/photos.php:729 ../../mod/profile_photo.php:153
-#: ../../mod/wall_upload.php:110
-msgid "Unable to process image."
-msgstr "Impossibile caricare l'immagine."
+#: ../../include/nav.php:186
+msgid "Site Setup and Configuration"
+msgstr "Configurazione del sito"
-#: ../../mod/photos.php:756 ../../mod/profile_photo.php:301
-#: ../../mod/wall_upload.php:136
-msgid "Image upload failed."
-msgstr "Caricamento immagine fallito."
+#: ../../include/nav.php:212
+msgid "Nothing new here"
+msgstr "Niente di nuovo qui"
-#: ../../mod/photos.php:842 ../../mod/community.php:18
-#: ../../mod/dfrn_request.php:760 ../../mod/viewconnections.php:17
-#: ../../mod/display.php:7 ../../mod/search.php:73 ../../mod/directory.php:31
-msgid "Public access denied."
-msgstr "Accesso negato."
+#: ../../include/nav.php:217
+msgid "Please wait..."
+msgstr "Attendere..."
-#: ../../mod/photos.php:852
-msgid "No photos selected"
-msgstr "Nessuna foto selezionata"
+#: ../../include/reddav.php:940
+msgid "Edit File properties"
+msgstr "Modifica le proprietà dei file"
-#: ../../mod/photos.php:953
-msgid "Access to this item is restricted."
-msgstr "Questo oggetto non è visibile a tutti."
+#: ../../include/Contact.php:104 ../../include/widgets.php:115
+#: ../../include/widgets.php:155 ../../include/identity.php:625
+#: ../../mod/directory.php:182 ../../mod/match.php:62 ../../mod/suggest.php:51
+#: ../../mod/dirprofile.php:165
+msgid "Connect"
+msgstr "Entra in contatto"
-#: ../../mod/photos.php:1015
-#, php-format
-msgid "You have used %1$.2f Mbytes of %2$.2f Mbytes photo storage."
-msgstr ""
+#: ../../include/Contact.php:120
+msgid "New window"
+msgstr "Nuova finestra"
-#: ../../mod/photos.php:1018
-#, php-format
-msgid "You have used %1$.2f Mbytes of photo storage."
-msgstr ""
+#: ../../include/Contact.php:121
+msgid "Open the selected location in a different window or browser tab"
+msgstr "Apri l'indirizzo selezionato in una nuova scheda o finestra"
-#: ../../mod/photos.php:1024
-msgid "Upload Photos"
-msgstr "Carica foto"
+#: ../../include/widgets.php:29 ../../include/contact_widgets.php:87
+msgid "Categories"
+msgstr "Categorie"
-#: ../../mod/photos.php:1028 ../../mod/photos.php:1077
-msgid "New album name: "
-msgstr "Nome nuovo album: "
+#: ../../include/widgets.php:117 ../../mod/suggest.php:53
+msgid "Ignore/Hide"
+msgstr "Ignora/nascondi"
-#: ../../mod/photos.php:1029
-msgid "or existing album name: "
-msgstr "o nome di un album esistente: "
+#: ../../include/widgets.php:123 ../../mod/connections.php:236
+msgid "Suggestions"
+msgstr "Suggerimenti"
-#: ../../mod/photos.php:1030
-msgid "Do not show a status post for this upload"
-msgstr "Non creare un post per questo upload"
+#: ../../include/widgets.php:124
+msgid "See more..."
+msgstr "Altro..."
-#: ../../mod/photos.php:1032 ../../mod/photos.php:1334
-msgid "Permissions"
-msgstr "Permessi"
+#: ../../include/widgets.php:146
+#, php-format
+msgid "You have %1$.0f of %2$.0f allowed connections."
+msgstr "Hai attivato %1$.0f delle %2$.0f connessioni permesse."
-#: ../../mod/photos.php:1092
-msgid "Edit Album"
-msgstr "Modifica album"
+#: ../../include/widgets.php:152
+msgid "Add New Connection"
+msgstr "Aggiungi un contatto"
-#: ../../mod/photos.php:1098
-msgid "Show Newest First"
-msgstr ""
+#: ../../include/widgets.php:153
+msgid "Enter the channel address"
+msgstr "Scrivi l'indirizzo del canale"
-#: ../../mod/photos.php:1100
-msgid "Show Oldest First"
-msgstr ""
+#: ../../include/widgets.php:154
+msgid "Example: bob@example.com, http://example.com/barbara"
+msgstr "Per esempio: mario@pippo.it oppure http://pluto.com/barbara"
-#: ../../mod/photos.php:1124 ../../mod/photos.php:1563
-msgid "View Photo"
-msgstr "Vedi foto"
+#: ../../include/widgets.php:171
+msgid "Notes"
+msgstr "Note"
-#: ../../mod/photos.php:1159
-msgid "Permission denied. Access to this item may be restricted."
-msgstr "Permesso negato. L'accesso a questo elemento può essere limitato."
+#: ../../include/widgets.php:173 ../../include/text.php:738
+#: ../../include/text.php:752 ../../mod/filer.php:36
+msgid "Save"
+msgstr "Salva"
-#: ../../mod/photos.php:1161
-msgid "Photo not available"
-msgstr "Foto non disponibile"
+#: ../../include/widgets.php:243
+msgid "Remove term"
+msgstr "Rimuovi termine"
-#: ../../mod/photos.php:1217
-msgid "View photo"
-msgstr "Vedi foto"
+#: ../../include/widgets.php:252 ../../include/features.php:50
+msgid "Saved Searches"
+msgstr "Ricerche salvate"
-#: ../../mod/photos.php:1217
-msgid "Edit photo"
-msgstr "Modifica foto"
+#: ../../include/widgets.php:253 ../../include/group.php:290
+msgid "add"
+msgstr "aggiungi"
-#: ../../mod/photos.php:1218
-msgid "Use as profile photo"
-msgstr "Usa come foto del profilo"
+#: ../../include/widgets.php:283 ../../include/features.php:64
+#: ../../include/contact_widgets.php:53
+msgid "Saved Folders"
+msgstr "Cartelle salvate"
-#: ../../mod/photos.php:1224 ../../mod/content.php:603
-#: ../../object/Item.php:103
-msgid "Private Message"
-msgstr "Messaggio privato"
+#: ../../include/widgets.php:286 ../../include/contact_widgets.php:56
+#: ../../include/contact_widgets.php:90
+msgid "Everything"
+msgstr "Tutto"
-#: ../../mod/photos.php:1243
-msgid "View Full Size"
-msgstr "Vedi dimensione intera"
+#: ../../include/widgets.php:318 ../../include/items.php:3566
+msgid "Archives"
+msgstr "Archivi"
-#: ../../mod/photos.php:1311
-msgid "Tags: "
-msgstr "Tag: "
+#: ../../include/widgets.php:370
+msgid "Refresh"
+msgstr "Aggiorna"
-#: ../../mod/photos.php:1314
-msgid "[Remove any tag]"
-msgstr "[Rimuovi tutti i tag]"
+#: ../../include/widgets.php:371 ../../mod/connedit.php:386
+msgid "Me"
+msgstr "Io"
-#: ../../mod/photos.php:1324
-msgid "Rotate CW (right)"
-msgstr ""
+#: ../../include/widgets.php:372 ../../mod/connedit.php:388
+msgid "Best Friends"
+msgstr "Buoni amici"
-#: ../../mod/photos.php:1325
-msgid "Rotate CCW (left)"
-msgstr ""
+#: ../../include/widgets.php:373 ../../include/profile_selectors.php:42
+#: ../../include/identity.php:310 ../../mod/connedit.php:389
+msgid "Friends"
+msgstr "Amici"
-#: ../../mod/photos.php:1327
-msgid "New album name"
-msgstr "Nuovo nome dell'album"
+#: ../../include/widgets.php:374
+msgid "Co-workers"
+msgstr "Colleghi"
-#: ../../mod/photos.php:1330
-msgid "Caption"
-msgstr "Titolo"
+#: ../../include/widgets.php:375 ../../mod/connedit.php:390
+msgid "Former Friends"
+msgstr "Ex amici"
-#: ../../mod/photos.php:1332
-msgid "Add a Tag"
-msgstr "Aggiungi tag"
+#: ../../include/widgets.php:376 ../../mod/connedit.php:391
+msgid "Acquaintances"
+msgstr "Conoscenti"
-#: ../../mod/photos.php:1336
-msgid ""
-"Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"
-msgstr "Esempio: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"
+#: ../../include/widgets.php:377
+msgid "Everybody"
+msgstr "Tutti"
-#: ../../mod/photos.php:1356 ../../mod/content.php:667
-#: ../../object/Item.php:196
-msgid "I like this (toggle)"
-msgstr "Mi piace (clic per cambiare)"
+#: ../../include/widgets.php:409
+msgid "Account settings"
+msgstr "Impostazioni dell'account"
-#: ../../mod/photos.php:1357 ../../mod/content.php:668
-#: ../../object/Item.php:197
-msgid "I don't like this (toggle)"
-msgstr "Non mi piace (clic per cambiare)"
+#: ../../include/widgets.php:415
+msgid "Channel settings"
+msgstr "Impostazioni del canale"
-#: ../../mod/photos.php:1358 ../../include/conversation.php:896
-msgid "Share"
-msgstr "Condividi"
+#: ../../include/widgets.php:421
+msgid "Additional features"
+msgstr "Funzionalità aggiuntive"
-#: ../../mod/photos.php:1359 ../../mod/editpost.php:112
-#: ../../mod/content.php:482 ../../mod/content.php:845
-#: ../../mod/wallmessage.php:152 ../../mod/message.php:293
-#: ../../mod/message.php:481 ../../include/conversation.php:570
-#: ../../include/conversation.php:915 ../../object/Item.php:258
-msgid "Please wait"
-msgstr "Attendi"
+#: ../../include/widgets.php:427
+msgid "Feature settings"
+msgstr "Impostazioni aggiuntive"
-#: ../../mod/photos.php:1375 ../../mod/photos.php:1416
-#: ../../mod/photos.php:1448 ../../mod/content.php:690
-#: ../../object/Item.php:557
-msgid "This is you"
-msgstr "Questo sei tu"
+#: ../../include/widgets.php:433
+msgid "Display settings"
+msgstr "Impostazioni grafiche"
-#: ../../mod/photos.php:1377 ../../mod/photos.php:1418
-#: ../../mod/photos.php:1450 ../../mod/content.php:692 ../../boot.php:574
-#: ../../object/Item.php:559
-msgid "Comment"
-msgstr "Commento"
+#: ../../include/widgets.php:439
+msgid "Connected apps"
+msgstr "App connesse"
-#: ../../mod/photos.php:1379 ../../mod/editpost.php:133
-#: ../../mod/content.php:702 ../../include/conversation.php:933
-#: ../../object/Item.php:569
-msgid "Preview"
-msgstr "Anteprima"
+#: ../../include/widgets.php:445
+msgid "Export channel"
+msgstr "Esporta il canale"
-#: ../../mod/photos.php:1479 ../../mod/content.php:439
-#: ../../mod/content.php:723 ../../mod/settings.php:606
-#: ../../mod/settings.php:695 ../../mod/group.php:168 ../../mod/admin.php:696
-#: ../../include/conversation.php:515 ../../object/Item.php:117
-msgid "Delete"
-msgstr "Rimuovi"
+#: ../../include/widgets.php:457
+msgid "Automatic Permissions (Advanced)"
+msgstr "Permessi predefiniti (avanzato)"
-#: ../../mod/photos.php:1569
-msgid "View Album"
-msgstr "Sfoglia l'album"
+#: ../../include/widgets.php:467
+msgid "Premium Channel Settings"
+msgstr "Canale premium - impostazioni"
-#: ../../mod/photos.php:1578
-msgid "Recent Photos"
-msgstr "Foto recenti"
+#: ../../include/widgets.php:476 ../../include/features.php:41
+#: ../../mod/sources.php:81
+msgid "Channel Sources"
+msgstr "Sorgenti del canale"
-#: ../../mod/community.php:23
-msgid "Not available."
-msgstr "Non disponibile."
+#: ../../include/widgets.php:504
+msgid "Check Mail"
+msgstr "Controlla i messaggi"
-#: ../../mod/community.php:32 ../../view/theme/diabook/theme.php:133
-#: ../../include/nav.php:101
-msgid "Community"
-msgstr "Comunità"
+#: ../../include/contact_selectors.php:30
+msgid "Unknown | Not categorised"
+msgstr "Sconosciuto | Senza categoria"
-#: ../../mod/community.php:63 ../../mod/community.php:88
-#: ../../mod/search.php:148 ../../mod/search.php:174
-msgid "No results."
-msgstr "Nessun risultato."
+#: ../../include/contact_selectors.php:31
+msgid "Block immediately"
+msgstr "Blocca subito"
-#: ../../mod/friendica.php:55
-msgid "This is Friendica, version"
-msgstr "Questo è Friendica, versione"
+#: ../../include/contact_selectors.php:32
+msgid "Shady, spammer, self-marketer"
+msgstr "Spammer o dedito al marketing"
-#: ../../mod/friendica.php:56
-msgid "running at web location"
-msgstr "in esecuzione sull'indirizzo web"
+#: ../../include/contact_selectors.php:33
+msgid "Known to me, but no opinion"
+msgstr "Lo conosco, ma non ho un'opinione particolare"
-#: ../../mod/friendica.php:58
-msgid ""
-"Please visit <a href=\"http://friendica.com\">Friendica.com</a> to learn "
-"more about the Friendica project."
-msgstr "Visita <a href=\"http://friendica.com\">Friendica.com</a> per saperne di più sul progetto Friendica."
+#: ../../include/contact_selectors.php:34
+msgid "OK, probably harmless"
+msgstr "È ok, probabilmente innocuo"
-#: ../../mod/friendica.php:60
-msgid "Bug reports and issues: please visit"
-msgstr "Segnalazioni di bug e problemi: visita"
+#: ../../include/contact_selectors.php:35
+msgid "Reputable, has my trust"
+msgstr "Affidabile, ha la mia fiducia"
-#: ../../mod/friendica.php:61
-msgid ""
-"Suggestions, praise, donations, etc. - please email \"Info\" at Friendica - "
-"dot com"
-msgstr "Suggerimenti, lodi, donazioni, ecc - e-mail a \"Info\" at Friendica punto com"
+#: ../../include/contact_selectors.php:54
+msgid "Frequently"
+msgstr "Frequentemente"
-#: ../../mod/friendica.php:75
-msgid "Installed plugins/addons/apps:"
-msgstr "Plugin/addon/applicazioni instalate"
+#: ../../include/contact_selectors.php:55
+msgid "Hourly"
+msgstr "Ogni ora"
-#: ../../mod/friendica.php:88
-msgid "No installed plugins/addons/apps"
-msgstr "Nessun plugin/addons/applicazione installata"
+#: ../../include/contact_selectors.php:56
+msgid "Twice daily"
+msgstr "Due volte al giorno"
-#: ../../mod/editpost.php:17 ../../mod/editpost.php:27
-msgid "Item not found"
-msgstr "Oggetto non trovato"
+#: ../../include/contact_selectors.php:57
+msgid "Daily"
+msgstr "Ogni giorno"
-#: ../../mod/editpost.php:36
-msgid "Edit post"
-msgstr "Modifica messaggio"
+#: ../../include/contact_selectors.php:58
+msgid "Weekly"
+msgstr "Ogni settimana"
-#: ../../mod/editpost.php:88 ../../include/conversation.php:882
-msgid "Post to Email"
-msgstr "Invia a email"
+#: ../../include/contact_selectors.php:59
+msgid "Monthly"
+msgstr "Ogni mese"
-#: ../../mod/editpost.php:103 ../../mod/content.php:710
-#: ../../mod/settings.php:605 ../../object/Item.php:107
-msgid "Edit"
-msgstr "Modifica"
+#: ../../include/contact_selectors.php:74
+msgid "Friendica"
+msgstr "Friendica"
-#: ../../mod/editpost.php:104 ../../mod/wallmessage.php:150
-#: ../../mod/message.php:291 ../../mod/message.php:478
-#: ../../include/conversation.php:897
-msgid "Upload photo"
-msgstr "Carica foto"
+#: ../../include/contact_selectors.php:75
+msgid "OStatus"
+msgstr "OStatus"
-#: ../../mod/editpost.php:105 ../../include/conversation.php:899
-msgid "Attach file"
-msgstr "Allega file"
+#: ../../include/contact_selectors.php:76
+msgid "RSS/Atom"
+msgstr "RSS/Atom"
-#: ../../mod/editpost.php:106 ../../mod/wallmessage.php:151
-#: ../../mod/message.php:292 ../../mod/message.php:479
-#: ../../include/conversation.php:901
-msgid "Insert web link"
-msgstr "Inserisci link"
+#: ../../include/contact_selectors.php:77 ../../mod/admin.php:689
+#: ../../mod/admin.php:698 ../../boot.php:1418
+msgid "Email"
+msgstr "Email"
-#: ../../mod/editpost.php:107
-msgid "Insert YouTube video"
-msgstr "Inserisci video da YouTube"
+#: ../../include/contact_selectors.php:78
+msgid "Diaspora"
+msgstr "Diaspora"
-#: ../../mod/editpost.php:108
-msgid "Insert Vorbis [.ogg] video"
-msgstr "Inserisci video Vorbis [.ogg]"
+#: ../../include/contact_selectors.php:79
+msgid "Facebook"
+msgstr "Facebook"
-#: ../../mod/editpost.php:109
-msgid "Insert Vorbis [.ogg] audio"
-msgstr "Inserisci audio Vorbis [.ogg]"
+#: ../../include/contact_selectors.php:80
+msgid "Zot!"
+msgstr "Zot!"
-#: ../../mod/editpost.php:110 ../../include/conversation.php:907
-msgid "Set your location"
-msgstr "La tua posizione"
+#: ../../include/contact_selectors.php:81
+msgid "LinkedIn"
+msgstr "LinkedIn"
-#: ../../mod/editpost.php:111 ../../include/conversation.php:909
-msgid "Clear browser location"
-msgstr "Rimuovi la localizzazione data dal browser"
+#: ../../include/contact_selectors.php:82
+msgid "XMPP/IM"
+msgstr "XMPP/IM"
-#: ../../mod/editpost.php:113 ../../include/conversation.php:916
-msgid "Permission settings"
-msgstr "Impostazioni permessi"
+#: ../../include/contact_selectors.php:83
+msgid "MySpace"
+msgstr "MySpace"
-#: ../../mod/editpost.php:121 ../../include/conversation.php:925
-msgid "CC: email addresses"
-msgstr "CC: indirizzi email"
+#: ../../include/datetime.php:43 ../../include/datetime.php:45
+msgid "Miscellaneous"
+msgstr "Altro"
-#: ../../mod/editpost.php:122 ../../include/conversation.php:926
-msgid "Public post"
-msgstr "Messaggio pubblico"
+#: ../../include/datetime.php:152 ../../include/datetime.php:284
+msgid "year"
+msgstr "anno"
-#: ../../mod/editpost.php:125 ../../include/conversation.php:912
-msgid "Set title"
-msgstr "Scegli un titolo"
+#: ../../include/datetime.php:157 ../../include/datetime.php:285
+msgid "month"
+msgstr "mese"
-#: ../../mod/editpost.php:127 ../../include/conversation.php:914
-msgid "Categories (comma-separated list)"
-msgstr "Categorie (lista separata da virgola)"
+#: ../../include/datetime.php:162 ../../include/datetime.php:287
+msgid "day"
+msgstr "giorno"
-#: ../../mod/editpost.php:128 ../../include/conversation.php:928
-msgid "Example: bob@example.com, mary@example.com"
-msgstr "Esempio: bob@example.com, mary@example.com"
+#: ../../include/datetime.php:275
+msgid "never"
+msgstr "mai"
-#: ../../mod/dfrn_request.php:93
-msgid "This introduction has already been accepted."
-msgstr "Questa presentazione è già stata accettata."
+#: ../../include/datetime.php:281
+msgid "less than a second ago"
+msgstr "meno di un secondo fa"
-#: ../../mod/dfrn_request.php:118 ../../mod/dfrn_request.php:512
-msgid "Profile location is not valid or does not contain profile information."
-msgstr "L'indirizzo del profilo non è valido o non contiene un profilo."
+#: ../../include/datetime.php:284
+msgid "years"
+msgstr "anni"
-#: ../../mod/dfrn_request.php:123 ../../mod/dfrn_request.php:517
-msgid "Warning: profile location has no identifiable owner name."
-msgstr "Attenzione: l'indirizzo del profilo non riporta il nome del proprietario."
+#: ../../include/datetime.php:285
+msgid "months"
+msgstr "mesi"
-#: ../../mod/dfrn_request.php:125 ../../mod/dfrn_request.php:519
-msgid "Warning: profile location has no profile photo."
-msgstr "Attenzione: l'indirizzo del profilo non ha una foto."
+#: ../../include/datetime.php:286
+msgid "week"
+msgstr "settimana"
-#: ../../mod/dfrn_request.php:128 ../../mod/dfrn_request.php:522
-#, php-format
-msgid "%d required parameter was not found at the given location"
-msgid_plural "%d required parameters were not found at the given location"
-msgstr[0] "%d parametro richiesto non è stato trovato all'indirizzo dato"
-msgstr[1] "%d parametri richiesti non sono stati trovati all'indirizzo dato"
+#: ../../include/datetime.php:286
+msgid "weeks"
+msgstr "settimane"
-#: ../../mod/dfrn_request.php:170
-msgid "Introduction complete."
-msgstr "Presentazione completa."
+#: ../../include/datetime.php:287
+msgid "days"
+msgstr "giorni"
-#: ../../mod/dfrn_request.php:209
-msgid "Unrecoverable protocol error."
-msgstr "Errore di comunicazione."
+#: ../../include/datetime.php:288
+msgid "hour"
+msgstr "ora"
-#: ../../mod/dfrn_request.php:237
-msgid "Profile unavailable."
-msgstr "Profilo non disponibile."
+#: ../../include/datetime.php:288
+msgid "hours"
+msgstr "ore"
-#: ../../mod/dfrn_request.php:262
-#, php-format
-msgid "%s has received too many connection requests today."
-msgstr "%s ha ricevuto troppe richieste di connessione per oggi."
+#: ../../include/datetime.php:289
+msgid "minute"
+msgstr "minuto"
-#: ../../mod/dfrn_request.php:263
-msgid "Spam protection measures have been invoked."
-msgstr "Sono state attivate le misure di protezione contro lo spam."
+#: ../../include/datetime.php:289
+msgid "minutes"
+msgstr "minuti"
-#: ../../mod/dfrn_request.php:264
-msgid "Friends are advised to please try again in 24 hours."
-msgstr "Gli amici sono pregati di riprovare tra 24 ore."
+#: ../../include/datetime.php:290
+msgid "second"
+msgstr "secondo"
-#: ../../mod/dfrn_request.php:326
-msgid "Invalid locator"
-msgstr "Invalid locator"
+#: ../../include/datetime.php:290
+msgid "seconds"
+msgstr "secondi"
-#: ../../mod/dfrn_request.php:335
-msgid "Invalid email address."
-msgstr "Indirizzo email non valido."
+#: ../../include/datetime.php:299
+#, php-format
+msgid "%1$d %2$s ago"
+msgstr "%1$d %2$s fa"
-#: ../../mod/dfrn_request.php:361
-msgid "This account has not been configured for email. Request failed."
-msgstr ""
+#: ../../include/dba/dba_driver.php:50
+#, php-format
+msgid "Cannot locate DNS info for database server '%s'"
+msgstr "Non trovo le informazioni DNS per il database server '%s'"
-#: ../../mod/dfrn_request.php:457
-msgid "Unable to resolve your name at the provided location."
-msgstr "Impossibile risolvere il tuo nome nella posizione indicata."
+#: ../../include/event.php:11 ../../include/bb2diaspora.php:433
+msgid "l F d, Y \\@ g:i A"
+msgstr "l d F Y \\@ G:i"
-#: ../../mod/dfrn_request.php:470
-msgid "You have already introduced yourself here."
-msgstr "Ti sei già presentato qui."
+#: ../../include/event.php:20 ../../include/bb2diaspora.php:439
+msgid "Starts:"
+msgstr "Inizio:"
-#: ../../mod/dfrn_request.php:474
-#, php-format
-msgid "Apparently you are already friends with %s."
-msgstr "Pare che tu e %s siate già amici."
+#: ../../include/event.php:30 ../../include/bb2diaspora.php:447
+msgid "Finishes:"
+msgstr "Fine:"
-#: ../../mod/dfrn_request.php:495
-msgid "Invalid profile URL."
-msgstr "Indirizzo profilo non valido."
+#: ../../include/event.php:40 ../../include/identity.php:676
+#: ../../include/bb2diaspora.php:455 ../../mod/events.php:463
+#: ../../mod/directory.php:156 ../../mod/dirprofile.php:108
+msgid "Location:"
+msgstr "Luogo:"
-#: ../../mod/dfrn_request.php:501 ../../include/follow.php:27
-msgid "Disallowed profile URL."
-msgstr "Indirizzo profilo non permesso."
+#: ../../include/text.php:315
+msgid "prev"
+msgstr "prec"
-#: ../../mod/dfrn_request.php:570 ../../mod/contacts.php:123
-msgid "Failed to update contact record."
-msgstr "Errore nell'aggiornamento del contatto."
+#: ../../include/text.php:317
+msgid "first"
+msgstr "inizio"
-#: ../../mod/dfrn_request.php:591
-msgid "Your introduction has been sent."
-msgstr "La tua presentazione è stata inviata."
+#: ../../include/text.php:346
+msgid "last"
+msgstr "fine"
-#: ../../mod/dfrn_request.php:644
-msgid "Please login to confirm introduction."
-msgstr "Accedi per confermare la presentazione."
+#: ../../include/text.php:349
+msgid "next"
+msgstr "succ"
-#: ../../mod/dfrn_request.php:658
-msgid ""
-"Incorrect identity currently logged in. Please login to "
-"<strong>this</strong> profile."
-msgstr "Non hai fatto accesso con l'identità corretta. Accedi a <strong>questo</strong> profilo."
+#: ../../include/text.php:361
+msgid "older"
+msgstr "più recenti"
-#: ../../mod/dfrn_request.php:669
-msgid "Hide this contact"
-msgstr ""
+#: ../../include/text.php:363
+msgid "newer"
+msgstr "più nuovi"
-#: ../../mod/dfrn_request.php:672
-#, php-format
-msgid "Welcome home %s."
-msgstr "Bentornato a casa %s."
+#: ../../include/text.php:654
+msgid "No connections"
+msgstr "Nessun contatto"
-#: ../../mod/dfrn_request.php:673
+#: ../../include/text.php:665
#, php-format
-msgid "Please confirm your introduction/connection request to %s."
-msgstr "Conferma la tua richiesta di connessione con %s."
+msgid "%d Connection"
+msgid_plural "%d Connections"
+msgstr[0] "%d contatto"
+msgstr[1] "%d contatti"
-#: ../../mod/dfrn_request.php:674
-msgid "Confirm"
-msgstr "Conferma"
+#: ../../include/text.php:677
+msgid "View Connections"
+msgstr "Elenco contatti"
-#: ../../mod/dfrn_request.php:715 ../../include/items.php:3292
-msgid "[Name Withheld]"
-msgstr "[Nome Nascosto]"
+#: ../../include/text.php:818
+msgid "poke"
+msgstr "poke"
-#: ../../mod/dfrn_request.php:810
-msgid ""
-"Please enter your 'Identity Address' from one of the following supported "
-"communications networks:"
-msgstr "Inserisci il tuo 'Indirizzo Identità' da uno dei seguenti network supportati:"
+#: ../../include/text.php:818 ../../include/conversation.php:240
+msgid "poked"
+msgstr "ha ricevuto un poke"
-#: ../../mod/dfrn_request.php:826
-msgid "<strike>Connect as an email follower</strike> (Coming soon)"
-msgstr "<strike>Connetti un email come follower</strike> (in arrivo)"
+#: ../../include/text.php:819
+msgid "ping"
+msgstr "ping"
-#: ../../mod/dfrn_request.php:828
-msgid ""
-"If you are not yet a member of the free social web, <a "
-"href=\"http://dir.friendica.com/siteinfo\">follow this link to find a public"
-" Friendica site and join us today</a>."
-msgstr "Se non sei un membro del web sociale libero, <a href=\"http://dir.friendica.com/siteinfo\">segui questo link per trovare un sito Friendica pubblico e unisciti a noi oggi</a>"
+#: ../../include/text.php:819
+msgid "pinged"
+msgstr "ha ricevuto un ping"
-#: ../../mod/dfrn_request.php:831
-msgid "Friend/Connection Request"
-msgstr "Richieste di amicizia/connessione"
+#: ../../include/text.php:820
+msgid "prod"
+msgstr "prod"
-#: ../../mod/dfrn_request.php:832
-msgid ""
-"Examples: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, "
-"testuser@identi.ca"
-msgstr "Esempi: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, testuser@identi.ca"
+#: ../../include/text.php:820
+msgid "prodded"
+msgstr "ha ricevuto un prod"
-#: ../../mod/dfrn_request.php:833
-msgid "Please answer the following:"
-msgstr "Rispondi:"
+#: ../../include/text.php:821
+msgid "slap"
+msgstr "schiaffo"
-#: ../../mod/dfrn_request.php:834
-#, php-format
-msgid "Does %s know you?"
-msgstr "%s ti conosce?"
+#: ../../include/text.php:821
+msgid "slapped"
+msgstr "ha ricevuto uno schiaffo"
-#: ../../mod/dfrn_request.php:837
-msgid "Add a personal note:"
-msgstr "Aggiungi una nota personale:"
+#: ../../include/text.php:822
+msgid "finger"
+msgstr "finger"
-#: ../../mod/dfrn_request.php:839 ../../include/contact_selectors.php:76
-msgid "Friendica"
-msgstr "Friendica"
+#: ../../include/text.php:822
+msgid "fingered"
+msgstr "ha ricevuto un finger"
-#: ../../mod/dfrn_request.php:840
-msgid "StatusNet/Federated Social Web"
-msgstr "StatusNet/Federated Social Web"
+#: ../../include/text.php:823
+msgid "rebuff"
+msgstr "rifiuto"
-#: ../../mod/dfrn_request.php:841 ../../mod/settings.php:640
-#: ../../include/contact_selectors.php:80
-msgid "Diaspora"
-msgstr "Diaspora"
+#: ../../include/text.php:823
+msgid "rebuffed"
+msgstr "ha ricevuto un rifiuto"
-#: ../../mod/dfrn_request.php:842
-#, php-format
-msgid ""
-" - please do not use this form. Instead, enter %s into your Diaspora search"
-" bar."
-msgstr " - per favore non usare questa form. Invece, inserisci %s nella tua barra di ricerca su Diaspora."
+#: ../../include/text.php:835
+msgid "happy"
+msgstr "allegro"
-#: ../../mod/dfrn_request.php:843
-msgid "Your Identity Address:"
-msgstr "L'indirizzo della tua identità:"
+#: ../../include/text.php:836
+msgid "sad"
+msgstr "triste"
-#: ../../mod/dfrn_request.php:846
-msgid "Submit Request"
-msgstr "Invia richiesta"
+#: ../../include/text.php:837
+msgid "mellow"
+msgstr "calmo"
-#: ../../mod/install.php:117
-msgid "Friendica Social Communications Server - Setup"
-msgstr "Friendica Social Communications Server - Setup"
+#: ../../include/text.php:838
+msgid "tired"
+msgstr "stanco"
-#: ../../mod/install.php:123
-msgid "Could not connect to database."
-msgstr " Impossibile collegarsi con il database."
+#: ../../include/text.php:839
+msgid "perky"
+msgstr "vivace"
-#: ../../mod/install.php:127
-msgid "Could not create table."
-msgstr "Impossibile creare le tabelle."
+#: ../../include/text.php:840
+msgid "angry"
+msgstr "arrabbiato"
-#: ../../mod/install.php:133
-msgid "Your Friendica site database has been installed."
-msgstr "Il tuo Friendica è stato installato."
+#: ../../include/text.php:841
+msgid "stupified"
+msgstr "stordito"
-#: ../../mod/install.php:138
-msgid ""
-"You may need to import the file \"database.sql\" manually using phpmyadmin "
-"or mysql."
-msgstr "Potresti dover importare il file \"database.sql\" manualmente con phpmyadmin o mysql"
+#: ../../include/text.php:842
+msgid "puzzled"
+msgstr "confuso"
-#: ../../mod/install.php:139 ../../mod/install.php:204
-#: ../../mod/install.php:488
-msgid "Please see the file \"INSTALL.txt\"."
-msgstr "Leggi il file \"INSTALL.txt\"."
+#: ../../include/text.php:843
+msgid "interested"
+msgstr "attento"
-#: ../../mod/install.php:201
-msgid "System check"
-msgstr "Controllo sistema"
+#: ../../include/text.php:844
+msgid "bitter"
+msgstr "amaro"
-#: ../../mod/install.php:206
-msgid "Check again"
-msgstr "Controlla ancora"
+#: ../../include/text.php:845
+msgid "cheerful"
+msgstr "allegro"
-#: ../../mod/install.php:225
-msgid "Database connection"
-msgstr "Connessione al database"
+#: ../../include/text.php:846
+msgid "alive"
+msgstr "vivace"
-#: ../../mod/install.php:226
-msgid ""
-"In order to install Friendica we need to know how to connect to your "
-"database."
-msgstr "Per installare Friendica dobbiamo sapere come collegarci al tuo database."
+#: ../../include/text.php:847
+msgid "annoyed"
+msgstr "seccato"
-#: ../../mod/install.php:227
-msgid ""
-"Please contact your hosting provider or site administrator if you have "
-"questions about these settings."
-msgstr "Contatta il tuo fornitore di hosting o l'amministratore del sito se hai domande su queste impostazioni."
+#: ../../include/text.php:848
+msgid "anxious"
+msgstr "ansioso"
-#: ../../mod/install.php:228
-msgid ""
-"The database you specify below should already exist. If it does not, please "
-"create it before continuing."
-msgstr "Il database dovrà già esistere. Se non esiste, crealo prima di continuare."
+#: ../../include/text.php:849
+msgid "cranky"
+msgstr "irritabile"
-#: ../../mod/install.php:232
-msgid "Database Server Name"
-msgstr "Nome del database server"
+#: ../../include/text.php:850
+msgid "disturbed"
+msgstr "turbato"
-#: ../../mod/install.php:233
-msgid "Database Login Name"
-msgstr "Nome utente database"
+#: ../../include/text.php:851
+msgid "frustrated"
+msgstr "frustrato"
-#: ../../mod/install.php:234
-msgid "Database Login Password"
-msgstr "Password utente database"
+#: ../../include/text.php:852
+msgid "motivated"
+msgstr "motivato"
-#: ../../mod/install.php:235
-msgid "Database Name"
-msgstr "Nome database"
+#: ../../include/text.php:853
+msgid "relaxed"
+msgstr "rilassato"
-#: ../../mod/install.php:236 ../../mod/install.php:275
-msgid "Site administrator email address"
-msgstr "Indirizzo email dell'amministratore del sito"
+#: ../../include/text.php:854
+msgid "surprised"
+msgstr "sorpreso"
-#: ../../mod/install.php:236 ../../mod/install.php:275
-msgid ""
-"Your account email address must match this in order to use the web admin "
-"panel."
-msgstr "Il tuo indirizzo email deve corrispondere a questo per poter usare il pannello di amministrazione web."
+#: ../../include/text.php:1016
+msgid "Monday"
+msgstr "lunedì"
-#: ../../mod/install.php:240 ../../mod/install.php:278
-msgid "Please select a default timezone for your website"
-msgstr "Seleziona il fuso orario predefinito per il tuo sito web"
+#: ../../include/text.php:1016
+msgid "Tuesday"
+msgstr "martedì"
-#: ../../mod/install.php:265
-msgid "Site settings"
-msgstr "Impostazioni sito"
+#: ../../include/text.php:1016
+msgid "Wednesday"
+msgstr "mercoledì"
-#: ../../mod/install.php:318
-msgid "Could not find a command line version of PHP in the web server PATH."
-msgstr "Non riesco a trovare la versione di PHP da riga di comando nel PATH del server web"
+#: ../../include/text.php:1016
+msgid "Thursday"
+msgstr "giovedì"
-#: ../../mod/install.php:319
-msgid ""
-"If you don't have a command line version of PHP installed on server, you "
-"will not be able to run background polling via cron. See <a "
-"href='http://friendica.com/node/27'>'Activating scheduled tasks'</a>"
-msgstr ""
+#: ../../include/text.php:1016
+msgid "Friday"
+msgstr "venerdì"
-#: ../../mod/install.php:323
-msgid "PHP executable path"
-msgstr "Percorso eseguibile PHP"
+#: ../../include/text.php:1016
+msgid "Saturday"
+msgstr "sabato"
-#: ../../mod/install.php:323
-msgid ""
-"Enter full path to php executable. You can leave this blank to continue the "
-"installation."
-msgstr ""
+#: ../../include/text.php:1016
+msgid "Sunday"
+msgstr "domenica"
-#: ../../mod/install.php:328
-msgid "Command line PHP"
-msgstr "PHP da riga di comando"
+#: ../../include/text.php:1020
+msgid "January"
+msgstr "gennaio"
-#: ../../mod/install.php:337
-msgid ""
-"The command line version of PHP on your system does not have "
-"\"register_argc_argv\" enabled."
-msgstr "La versione da riga di comando di PHP nel sistema non ha abilitato \"register_argc_argv\"."
+#: ../../include/text.php:1020
+msgid "February"
+msgstr "febbraio"
-#: ../../mod/install.php:338
-msgid "This is required for message delivery to work."
-msgstr "E' obbligatorio per far funzionare la consegna dei messaggi."
+#: ../../include/text.php:1020
+msgid "March"
+msgstr "marzo"
-#: ../../mod/install.php:340
-msgid "PHP register_argc_argv"
-msgstr "PHP register_argc_argv"
+#: ../../include/text.php:1020
+msgid "April"
+msgstr "aprile"
-#: ../../mod/install.php:361
-msgid ""
-"Error: the \"openssl_pkey_new\" function on this system is not able to "
-"generate encryption keys"
-msgstr "Errore: la funzione \"openssl_pkey_new\" in questo sistema non è in grado di generare le chiavi di criptazione"
+#: ../../include/text.php:1020
+msgid "May"
+msgstr "maggio"
-#: ../../mod/install.php:362
-msgid ""
-"If running under Windows, please see "
-"\"http://www.php.net/manual/en/openssl.installation.php\"."
-msgstr "Se stai eseguendo friendika su windows, guarda \"http://www.php.net/manual/en/openssl.installation.php\"."
+#: ../../include/text.php:1020
+msgid "June"
+msgstr "giugno"
-#: ../../mod/install.php:364
-msgid "Generate encryption keys"
-msgstr "Genera chiavi di criptazione"
+#: ../../include/text.php:1020
+msgid "July"
+msgstr "luglio"
-#: ../../mod/install.php:371
-msgid "libCurl PHP module"
-msgstr "modulo PHP libCurl"
+#: ../../include/text.php:1020
+msgid "August"
+msgstr "agosto"
-#: ../../mod/install.php:372
-msgid "GD graphics PHP module"
-msgstr "modulo PHP GD graphics"
+#: ../../include/text.php:1020
+msgid "September"
+msgstr "settembre"
-#: ../../mod/install.php:373
-msgid "OpenSSL PHP module"
-msgstr "modulo PHP OpenSSL"
+#: ../../include/text.php:1020
+msgid "October"
+msgstr "ottobre"
-#: ../../mod/install.php:374
-msgid "mysqli PHP module"
-msgstr "modulo PHP mysqli"
+#: ../../include/text.php:1020
+msgid "November"
+msgstr "novembre"
-#: ../../mod/install.php:375
-msgid "mb_string PHP module"
-msgstr "modulo PHP mb_string"
+#: ../../include/text.php:1020
+msgid "December"
+msgstr "dicembre"
-#: ../../mod/install.php:380 ../../mod/install.php:382
-msgid "Apache mod_rewrite module"
-msgstr ""
+#: ../../include/text.php:1098
+msgid "unknown.???"
+msgstr "sconosciuto???"
-#: ../../mod/install.php:380
-msgid ""
-"Error: Apache webserver mod-rewrite module is required but not installed."
-msgstr "Errore: il modulo mod-rewrite di Apache è richiesto ma non installato"
+#: ../../include/text.php:1099
+msgid "bytes"
+msgstr "byte"
-#: ../../mod/install.php:388
-msgid "Error: libCURL PHP module required but not installed."
-msgstr "Errore: il modulo libCURL di PHP è richiesto ma non installato."
+#: ../../include/text.php:1134
+msgid "remove category"
+msgstr "rimuovi la categoria"
-#: ../../mod/install.php:392
-msgid ""
-"Error: GD graphics PHP module with JPEG support required but not installed."
-msgstr "Errore: Il modulo GD graphics di PHP con supporto a JPEG è richiesto ma non installato."
+#: ../../include/text.php:1156
+msgid "remove from file"
+msgstr "rimuovi dal file"
-#: ../../mod/install.php:396
-msgid "Error: openssl PHP module required but not installed."
-msgstr "Errore: il modulo openssl di PHP è richiesto ma non installato."
+#: ../../include/text.php:1214 ../../include/text.php:1226
+msgid "Click to open/close"
+msgstr "Clicca per aprire/chiudere"
-#: ../../mod/install.php:400
-msgid "Error: mysqli PHP module required but not installed."
-msgstr "Errore: il modulo mysqli di PHP è richiesto ma non installato"
+#: ../../include/text.php:1402 ../../mod/events.php:332
+msgid "link to source"
+msgstr "Link all'originale"
-#: ../../mod/install.php:404
-msgid "Error: mb_string PHP module required but not installed."
-msgstr "Errore: il modulo PHP mb_string è richiesto ma non installato."
+#: ../../include/text.php:1421
+msgid "Select a page layout: "
+msgstr "Scegli il layout della pagina:"
-#: ../../mod/install.php:421
-msgid ""
-"The web installer needs to be able to create a file called \".htconfig.php\""
-" in the top folder of your web server and it is unable to do so."
-msgstr "L'installazione web deve poter creare un file chiamato \".htconfig.php\" nella cartella principale del tuo web server ma non è in grado di farlo."
+#: ../../include/text.php:1424 ../../include/text.php:1489
+msgid "default"
+msgstr "predefinito"
-#: ../../mod/install.php:422
-msgid ""
-"This is most often a permission setting, as the web server may not be able "
-"to write files in your folder - even if you can."
-msgstr "Ciò è dovuto spesso a impostazioni di permessi, dato che il web server puo' scrivere il file nella tua cartella, anche se tu puoi."
+#: ../../include/text.php:1460
+msgid "Page content type: "
+msgstr "Contenuto della pagina:"
-#: ../../mod/install.php:423
-msgid ""
-"At the end of this procedure, we will give you a text to save in a file "
-"named .htconfig.php in your Friendica top folder."
-msgstr ""
+#: ../../include/text.php:1501
+msgid "Select an alternate language"
+msgstr "Seleziona una lingua diversa"
-#: ../../mod/install.php:424
-msgid ""
-"You can alternatively skip this procedure and perform a manual installation."
-" Please see the file \"INSTALL.txt\" for instructions."
-msgstr ""
+#: ../../include/text.php:1653 ../../include/conversation.php:117
+#: ../../mod/like.php:103 ../../mod/subthread.php:89 ../../mod/tagger.php:45
+msgid "photo"
+msgstr "la foto"
-#: ../../mod/install.php:427
-msgid ".htconfig.php is writable"
-msgstr ".htconfig.php è scrivibile"
+#: ../../include/text.php:1656 ../../include/conversation.php:120
+#: ../../mod/tagger.php:49
+msgid "event"
+msgstr "l'evento"
-#: ../../mod/install.php:439
-msgid ""
-"Url rewrite in .htaccess is not working. Check your server configuration."
-msgstr ""
+#: ../../include/text.php:1659 ../../include/conversation.php:145
+#: ../../mod/like.php:103 ../../mod/subthread.php:89 ../../mod/tagger.php:53
+msgid "status"
+msgstr "il messaggio di stato"
-#: ../../mod/install.php:441
-msgid "Url rewrite is working"
-msgstr ""
+#: ../../include/text.php:1661 ../../include/conversation.php:147
+#: ../../mod/tagger.php:55
+msgid "comment"
+msgstr "il commento"
-#: ../../mod/install.php:451
-msgid ""
-"The database configuration file \".htconfig.php\" could not be written. "
-"Please use the enclosed text to create a configuration file in your web "
-"server root."
-msgstr "Il file di configurazione del database \".htconfig.php\" non puo' essere scritto. Usa il testo qui di seguito per creare un file di configurazione nella cartella principale del tuo sito."
+#: ../../include/text.php:1666
+msgid "activity"
+msgstr "l'attività"
-#: ../../mod/install.php:475
-msgid "Errors encountered creating database tables."
-msgstr "La creazione delle tabelle del database ha generato errori."
+#: ../../include/text.php:1928
+msgid "Design"
+msgstr "Design"
-#: ../../mod/install.php:486
-msgid "<h1>What next</h1>"
-msgstr ""
+#: ../../include/text.php:1930
+msgid "Blocks"
+msgstr "Riquadri"
-#: ../../mod/install.php:487
-msgid ""
-"IMPORTANT: You will need to [manually] setup a scheduled task for the "
-"poller."
-msgstr "IMPORTANTE: Devi impostare [manualmente] la pianificazione del poller."
+#: ../../include/text.php:1931
+msgid "Menus"
+msgstr "Menù"
-#: ../../mod/localtime.php:12 ../../include/event.php:11
-#: ../../include/bb2diaspora.php:390
-msgid "l F d, Y \\@ g:i A"
-msgstr "l d F Y \\@ G:i"
+#: ../../include/text.php:1932
+msgid "Layouts"
+msgstr "Layout"
-#: ../../mod/localtime.php:24
-msgid "Time Conversion"
-msgstr "Conversione Ora"
+#: ../../include/text.php:1933
+msgid "Pages"
+msgstr "Pagine"
-#: ../../mod/localtime.php:26
+#: ../../include/group.php:25
msgid ""
-"Friendika provides this service for sharing events with other networks and "
-"friends in unknown timezones."
-msgstr "Friendika fornisce questo servizio per la condivisione di eventi con altre reti e contatti in fusi orari sconosciuti."
+"A deleted group with this name was revived. Existing item permissions "
+"<strong>may</strong> apply to this group and any future members. If this is "
+"not what you intended, please create another group with a different name."
+msgstr "È stato ripristinato un insieme con lo stesso nome che era stato eliminato in precedenza. I permessi già presenti <strong>potrebbero</strong> rimanere validi per i nuovi canali. Se non vuoi che ciò accada, devi creare un altro insieme con un nome diverso."
-#: ../../mod/localtime.php:30
-#, php-format
-msgid "UTC time: %s"
-msgstr "Ora UTC: %s"
+#: ../../include/group.php:223
+msgid "Default privacy group for new contacts"
+msgstr "Insieme predefinito per i nuovi canali che aggiungi"
-#: ../../mod/localtime.php:33
-#, php-format
-msgid "Current timezone: %s"
-msgstr "Fuso orario corrente: %s"
+#: ../../include/group.php:242 ../../mod/admin.php:698
+msgid "All Channels"
+msgstr "Tutti i canali"
-#: ../../mod/localtime.php:36
-#, php-format
-msgid "Converted localtime: %s"
-msgstr "Ora locale convertita: %s"
+#: ../../include/group.php:264
+msgid "edit"
+msgstr "modifica"
-#: ../../mod/localtime.php:41
-msgid "Please select your timezone:"
-msgstr "Selezionare il tuo fuso orario:"
+#: ../../include/group.php:285
+msgid "Collections"
+msgstr "Insiemi di canali"
-#: ../../mod/poke.php:192
-msgid "Poke/Prod"
-msgstr ""
+#: ../../include/group.php:286
+msgid "Edit collection"
+msgstr "Modifica l'insieme di canali"
-#: ../../mod/poke.php:193
-msgid "poke, prod or do other things to somebody"
-msgstr ""
+#: ../../include/group.php:287
+msgid "Create a new collection"
+msgstr "Crea un nuovo insieme"
-#: ../../mod/poke.php:194
-msgid "Recipient"
-msgstr ""
+#: ../../include/group.php:288
+msgid "Channels not in any collection"
+msgstr "Canali che non sono in un insieme"
-#: ../../mod/poke.php:195
-msgid "Choose what you wish to do to recipient"
-msgstr ""
+#: ../../include/js_strings.php:5
+msgid "Delete this item?"
+msgstr "Eliminare questo elemento?"
-#: ../../mod/poke.php:198
-msgid "Make this post private"
-msgstr ""
+#: ../../include/js_strings.php:6 ../../include/ItemObject.php:536
+#: ../../mod/photos.php:1099 ../../mod/photos.php:1186
+msgid "Comment"
+msgstr "Commento"
-#: ../../mod/match.php:12
-msgid "Profile Match"
-msgstr "Profili corrispondenti"
+#: ../../include/js_strings.php:7 ../../include/contact_widgets.php:125
+#: ../../include/ItemObject.php:270
+msgid "show more"
+msgstr "mostra tutto"
-#: ../../mod/match.php:20
-msgid "No keywords to match. Please add keywords to your default profile."
-msgstr "Nessuna parola chiave per l'abbinamento. Aggiungi parole chiave al tuo profilo predefinito."
+#: ../../include/js_strings.php:8
+msgid "show fewer"
+msgstr "riduci"
-#: ../../mod/match.php:57
-msgid "is interested in:"
-msgstr "è interessato a:"
+#: ../../include/js_strings.php:9
+msgid "Password too short"
+msgstr "Password troppo corta"
-#: ../../mod/match.php:58 ../../mod/suggest.php:59
-#: ../../include/contact_widgets.php:9 ../../boot.php:1164
-msgid "Connect"
-msgstr "Connetti"
+#: ../../include/js_strings.php:10
+msgid "Passwords do not match"
+msgstr "Le password non corrispondono"
-#: ../../mod/match.php:65 ../../mod/dirfind.php:60
-msgid "No matches"
-msgstr "Nessun risultato"
+#: ../../include/js_strings.php:11 ../../mod/photos.php:39
+msgid "everybody"
+msgstr "tutti"
-#: ../../mod/lockview.php:39
-msgid "Remote privacy information not available."
-msgstr "Informazioni remote sulla privacy non disponibili."
+#: ../../include/js_strings.php:12
+msgid "Secret Passphrase"
+msgstr "Chiave segreta"
-#: ../../mod/lockview.php:43
-msgid "Visible to:"
-msgstr "Visibile a:"
+#: ../../include/js_strings.php:13
+msgid "Passphrase hint"
+msgstr "Suggerimento per la chiave segreta"
-#: ../../mod/content.php:119 ../../mod/network.php:436
-msgid "No such group"
-msgstr "Nessun gruppo"
+#: ../../include/js_strings.php:15
+msgid "timeago.prefixAgo"
+msgstr "timeago.prefixAgo"
-#: ../../mod/content.php:130 ../../mod/network.php:447
-msgid "Group is empty"
-msgstr "Il gruppo è vuoto"
+#: ../../include/js_strings.php:16
+msgid "timeago.suffixAgo"
+msgstr "timeago.suffixAgo"
-#: ../../mod/content.php:134 ../../mod/network.php:451
-msgid "Group: "
-msgstr "Gruppo: "
+#: ../../include/js_strings.php:17
+msgid "ago"
+msgstr "fa"
-#: ../../mod/content.php:438 ../../mod/content.php:722
-#: ../../include/conversation.php:514 ../../object/Item.php:116
-msgid "Select"
-msgstr "Seleziona"
+#: ../../include/js_strings.php:18
+msgid "from now"
+msgstr "da adesso"
-#: ../../mod/content.php:455 ../../mod/content.php:815
-#: ../../mod/content.php:816 ../../include/conversation.php:533
-#: ../../object/Item.php:227 ../../object/Item.php:228
-#, php-format
-msgid "View %s's profile @ %s"
-msgstr "Vedi il profilo di %s @ %s"
+#: ../../include/js_strings.php:19
+msgid "less than a minute"
+msgstr "meno di un minuto"
+
+#: ../../include/js_strings.php:20
+msgid "about a minute"
+msgstr "circa un minuto"
-#: ../../mod/content.php:465 ../../mod/content.php:827
-#: ../../include/conversation.php:553 ../../object/Item.php:240
+#: ../../include/js_strings.php:21
#, php-format
-msgid "%s from %s"
-msgstr "%s da %s"
+msgid "%d minutes"
+msgstr "%d minuti"
-#: ../../mod/content.php:480 ../../include/conversation.php:568
-msgid "View in context"
-msgstr "Vedi nel contesto"
+#: ../../include/js_strings.php:22
+msgid "about an hour"
+msgstr "circa un’ora"
-#: ../../mod/content.php:586 ../../object/Item.php:277
+#: ../../include/js_strings.php:23
#, php-format
-msgid "%d comment"
-msgid_plural "%d comments"
-msgstr[0] "%d commento"
-msgstr[1] "%d commenti"
+msgid "about %d hours"
+msgstr "circa %d ore"
-#: ../../mod/content.php:588 ../../include/text.php:1443
-#: ../../object/Item.php:279 ../../object/Item.php:292
-msgid "comment"
-msgid_plural "comments"
-msgstr[0] ""
-msgstr[1] "commento"
+#: ../../include/js_strings.php:24
+msgid "a day"
+msgstr "un giorno"
-#: ../../mod/content.php:589 ../../addon/page/page.php:76
-#: ../../addon/page/page.php:110 ../../addon/showmore/showmore.php:119
-#: ../../include/contact_widgets.php:195 ../../boot.php:575
-#: ../../object/Item.php:280
-msgid "show more"
-msgstr "mostra di più"
+#: ../../include/js_strings.php:25
+#, php-format
+msgid "%d days"
+msgstr "%d giorni"
-#: ../../mod/content.php:667 ../../object/Item.php:196
-msgid "like"
-msgstr "mi piace"
+#: ../../include/js_strings.php:26
+msgid "about a month"
+msgstr "circa un mese"
-#: ../../mod/content.php:668 ../../object/Item.php:197
-msgid "dislike"
-msgstr "non mi piace"
+#: ../../include/js_strings.php:27
+#, php-format
+msgid "%d months"
+msgstr "%d mesi"
-#: ../../mod/content.php:670 ../../object/Item.php:199
-msgid "Share this"
-msgstr "Condividi questo"
+#: ../../include/js_strings.php:28
+msgid "about a year"
+msgstr "circa un anno"
-#: ../../mod/content.php:670 ../../object/Item.php:199
-msgid "share"
-msgstr "condividi"
+#: ../../include/js_strings.php:29
+#, php-format
+msgid "%d years"
+msgstr "%d anni"
-#: ../../mod/content.php:694 ../../object/Item.php:561
-msgid "Bold"
-msgstr ""
+#: ../../include/js_strings.php:30
+msgid " "
+msgstr " "
-#: ../../mod/content.php:695 ../../object/Item.php:562
-msgid "Italic"
-msgstr ""
+#: ../../include/js_strings.php:31
+msgid "timeago.numbers"
+msgstr "timeago.numbers"
-#: ../../mod/content.php:696 ../../object/Item.php:563
-msgid "Underline"
-msgstr ""
+#: ../../include/message.php:18
+msgid "No recipient provided."
+msgstr "Devi scegliere un destinatario."
-#: ../../mod/content.php:697 ../../object/Item.php:564
-msgid "Quote"
-msgstr ""
+#: ../../include/message.php:23
+msgid "[no subject]"
+msgstr "[nessun titolo]"
-#: ../../mod/content.php:698 ../../object/Item.php:565
-msgid "Code"
-msgstr ""
+#: ../../include/message.php:42
+msgid "Unable to determine sender."
+msgstr "Impossibile determinare il mittente."
-#: ../../mod/content.php:699 ../../object/Item.php:566
-msgid "Image"
-msgstr ""
+#: ../../include/message.php:143
+msgid "Stored post could not be verified."
+msgstr "Non è stato possibile verificare l'articolo inserito."
-#: ../../mod/content.php:700 ../../object/Item.php:567
-msgid "Link"
-msgstr ""
+#: ../../include/photo/photo_driver.php:637 ../../include/photos.php:51
+#: ../../mod/photos.php:91 ../../mod/photos.php:783 ../../mod/photos.php:805
+#: ../../mod/profile_photo.php:78 ../../mod/profile_photo.php:225
+#: ../../mod/profile_photo.php:336
+msgid "Profile Photos"
+msgstr "Foto del profilo"
-#: ../../mod/content.php:701 ../../object/Item.php:568
-msgid "Video"
-msgstr ""
+#: ../../include/network.php:640
+msgid "view full size"
+msgstr "guarda nelle dimensioni reali"
-#: ../../mod/content.php:735 ../../object/Item.php:180
-msgid "add star"
-msgstr "aggiungi a speciali"
+#: ../../include/bbcode.php:94 ../../include/bbcode.php:509
+#: ../../include/bbcode.php:512
+msgid "Image/photo"
+msgstr "Immagine"
-#: ../../mod/content.php:736 ../../object/Item.php:181
-msgid "remove star"
-msgstr "rimuovi da speciali"
+#: ../../include/bbcode.php:129 ../../include/bbcode.php:517
+msgid "Encrypted content"
+msgstr "Contenuto crittografato"
-#: ../../mod/content.php:737 ../../object/Item.php:182
-msgid "toggle star status"
-msgstr "Inverti stato preferito"
+#: ../../include/bbcode.php:136
+msgid "QR code"
+msgstr "QR code"
-#: ../../mod/content.php:740 ../../object/Item.php:185
-msgid "starred"
-msgstr "preferito"
+#: ../../include/bbcode.php:179
+#, php-format
+msgid "%1$s wrote the following %2$s %3$s"
+msgstr "%1$s ha scritto %2$s seguente %3$s"
-#: ../../mod/content.php:741 ../../object/Item.php:186
-msgid "add tag"
-msgstr "aggiungi tag"
+#: ../../include/bbcode.php:181
+msgid "post"
+msgstr "l'articolo"
-#: ../../mod/content.php:745 ../../object/Item.php:120
-msgid "save to folder"
-msgstr "salva nella cartella"
+#: ../../include/bbcode.php:469 ../../include/bbcode.php:489
+msgid "$1 wrote:"
+msgstr "$1 ha scritto:"
-#: ../../mod/content.php:817 ../../object/Item.php:229
-msgid "to"
-msgstr "a"
+#: ../../include/oembed.php:150
+msgid "Embedded content"
+msgstr "Contenuti incorporati"
-#: ../../mod/content.php:818 ../../object/Item.php:230
-msgid "Wall-to-Wall"
-msgstr "Da bacheca a bacheca"
+#: ../../include/oembed.php:159
+msgid "Embedding disabled"
+msgstr "Contenuti incorporati - funzione disabilitata"
-#: ../../mod/content.php:819 ../../object/Item.php:231
-msgid "via Wall-To-Wall:"
-msgstr "da bacheca a bacheca"
+#: ../../include/features.php:21
+msgid "General Features"
+msgstr "Funzionalità generali"
-#: ../../mod/home.php:28 ../../addon/communityhome/communityhome.php:179
-#, php-format
-msgid "Welcome to %s"
-msgstr "Benvenuto su %s"
+#: ../../include/features.php:23
+msgid "Content Expiration"
+msgstr "Scadenza"
-#: ../../mod/notifications.php:26
-msgid "Invalid request identifier."
-msgstr "L'identificativo della richiesta non è valido."
+#: ../../include/features.php:23
+msgid "Remove posts/comments and/or private messages at a future time"
+msgstr "Elimina gli articoli, i commenti o i messaggi privati dopo che è trascorso del tempo"
-#: ../../mod/notifications.php:35 ../../mod/notifications.php:161
-#: ../../mod/notifications.php:207
-msgid "Discard"
-msgstr "Scarta"
+#: ../../include/features.php:24
+msgid "Multiple Profiles"
+msgstr "Profili multipli"
-#: ../../mod/notifications.php:51 ../../mod/notifications.php:160
-#: ../../mod/notifications.php:206 ../../mod/contacts.php:321
-#: ../../mod/contacts.php:375
-msgid "Ignore"
-msgstr "Ignora"
+#: ../../include/features.php:24
+msgid "Ability to create multiple profiles"
+msgstr "Abilitazione a creare profili multipli"
-#: ../../mod/notifications.php:75
-msgid "System"
-msgstr "Sistema"
+#: ../../include/features.php:25
+msgid "Web Pages"
+msgstr "Pagine web"
-#: ../../mod/notifications.php:80 ../../include/nav.php:113
-msgid "Network"
-msgstr "Rete"
+#: ../../include/features.php:25
+msgid "Provide managed web pages on your channel"
+msgstr "Attiva la creazione di pagine web sul tuo canale"
-#: ../../mod/notifications.php:85 ../../mod/network.php:300
-msgid "Personal"
-msgstr "Personale"
+#: ../../include/features.php:26
+msgid "Private Notes"
+msgstr "Note private"
-#: ../../mod/notifications.php:90 ../../view/theme/diabook/theme.php:127
-#: ../../include/nav.php:77 ../../include/nav.php:115
-msgid "Home"
-msgstr "Home"
+#: ../../include/features.php:26
+msgid "Enables a tool to store notes and reminders"
+msgstr "Abilita il riquadro per scrivere annotazioni"
-#: ../../mod/notifications.php:95 ../../include/nav.php:121
-msgid "Introductions"
-msgstr "Presentazioni"
+#: ../../include/features.php:31
+msgid "Extended Identity Sharing"
+msgstr "Condivisione avanzata dell'identità"
-#: ../../mod/notifications.php:100 ../../mod/message.php:176
-#: ../../include/nav.php:128
-msgid "Messages"
-msgstr "Messaggi"
+#: ../../include/features.php:31
+msgid ""
+"Share your identity with all websites on the internet. When disabled, "
+"identity is only shared with sites in the matrix."
+msgstr "Rendi nota la tua identità a tutti i siti internet. Se disabilitato, la tua identità sarà comunicata solo ai siti red matrix."
-#: ../../mod/notifications.php:119
-msgid "Show Ignored Requests"
-msgstr "Mostra richieste ignorate"
+#: ../../include/features.php:32
+msgid "Expert Mode"
+msgstr "Modalità esperto"
-#: ../../mod/notifications.php:119
-msgid "Hide Ignored Requests"
-msgstr "Nascondi richieste ignorate"
+#: ../../include/features.php:32
+msgid "Enable Expert Mode to provide advanced configuration options"
+msgstr "Abilita la modalità esperto per vedere le opzioni di configurazione avanzate"
-#: ../../mod/notifications.php:145 ../../mod/notifications.php:191
-msgid "Notification type: "
-msgstr "Tipo di notifica: "
+#: ../../include/features.php:33
+msgid "Premium Channel"
+msgstr "Canale premium"
-#: ../../mod/notifications.php:146
-msgid "Friend Suggestion"
-msgstr "Amico suggerito"
+#: ../../include/features.php:33
+msgid ""
+"Allows you to set restrictions and terms on those that connect with your "
+"channel"
+msgstr "Ti permette di imporre delle restrizioni e dei termini d'uso a chi segue il canale"
-#: ../../mod/notifications.php:148
-#, php-format
-msgid "suggested by %s"
-msgstr "sugerito da %s"
+#: ../../include/features.php:38
+msgid "Post Composition Features"
+msgstr "Modalità di scrittura articoli"
-#: ../../mod/notifications.php:153 ../../mod/notifications.php:200
-#: ../../mod/contacts.php:381
-msgid "Hide this contact from others"
-msgstr "Nascondi questo contatto agli altri"
+#: ../../include/features.php:39
+msgid "Richtext Editor"
+msgstr "Editor grafico"
-#: ../../mod/notifications.php:154 ../../mod/notifications.php:201
-msgid "Post a new friend activity"
-msgstr "Invia una attività \"è ora amico con\""
+#: ../../include/features.php:39
+msgid "Enable richtext editor"
+msgstr "Abilita l'editor grafico"
-#: ../../mod/notifications.php:154 ../../mod/notifications.php:201
-msgid "if applicable"
-msgstr "se applicabile"
+#: ../../include/features.php:40
+msgid "Post Preview"
+msgstr "Anteprima articolo"
-#: ../../mod/notifications.php:157 ../../mod/notifications.php:204
-#: ../../mod/admin.php:694
-msgid "Approve"
-msgstr "Approva"
+#: ../../include/features.php:40
+msgid "Allow previewing posts and comments before publishing them"
+msgstr "Abilita l'anteprima degli articoli e dei commenti prima di pubblicarli"
-#: ../../mod/notifications.php:177
-msgid "Claims to be known to you: "
-msgstr "Dice di conoscerti: "
+#: ../../include/features.php:41
+msgid "Automatically import channel content from other channels or feeds"
+msgstr "Importa automaticamente il contenuto del canale da altri canali o feed"
-#: ../../mod/notifications.php:177
-msgid "yes"
-msgstr "si"
+#: ../../include/features.php:42
+msgid "Even More Encryption"
+msgstr "Crittografia addizionale"
-#: ../../mod/notifications.php:177
-msgid "no"
-msgstr "no"
+#: ../../include/features.php:42
+msgid ""
+"Allow optional encryption of content end-to-end with a shared secret key"
+msgstr "Rendi possibile la crittografia dei contenuti tra mittente e destinatari con una chiave segreta"
-#: ../../mod/notifications.php:184
-msgid "Approve as: "
-msgstr "Approva come: "
+#: ../../include/features.php:47
+msgid "Network and Stream Filtering"
+msgstr "Filtraggio dei contenuti"
-#: ../../mod/notifications.php:185
-msgid "Friend"
-msgstr "Amico"
+#: ../../include/features.php:48
+msgid "Search by Date"
+msgstr "Ricerca per data"
-#: ../../mod/notifications.php:186
-msgid "Sharer"
-msgstr "Condivisore"
+#: ../../include/features.php:48
+msgid "Ability to select posts by date ranges"
+msgstr "Per selezionare gli articoli in un intervallo tra date"
-#: ../../mod/notifications.php:186
-msgid "Fan/Admirer"
-msgstr "Fan/Ammiratore"
+#: ../../include/features.php:49
+msgid "Collections Filter"
+msgstr "Filtra per insiemi di canali"
-#: ../../mod/notifications.php:192
-msgid "Friend/Connect Request"
-msgstr "Richiesta amicizia/connessione"
+#: ../../include/features.php:49
+msgid "Enable widget to display Network posts only from selected collections"
+msgstr "Mostra il riquadro per filtrare gli articoli di certi insiemi di canali"
-#: ../../mod/notifications.php:192
-msgid "New Follower"
-msgstr "Qualcuno inizia a seguirti"
+#: ../../include/features.php:50
+msgid "Save search terms for re-use"
+msgstr "Salva i termini delle ricerche per poterle ripetere"
-#: ../../mod/notifications.php:213
-msgid "No introductions."
-msgstr "Nessuna presentazione."
+#: ../../include/features.php:51
+msgid "Network Personal Tab"
+msgstr "Attività personale"
-#: ../../mod/notifications.php:216 ../../include/nav.php:122
-msgid "Notifications"
-msgstr "Notifiche"
+#: ../../include/features.php:51
+msgid "Enable tab to display only Network posts that you've interacted on"
+msgstr "Abilita il link per mostrare solamente i contenuti con cui hai interagito"
-#: ../../mod/notifications.php:253 ../../mod/notifications.php:378
-#: ../../mod/notifications.php:465
-#, php-format
-msgid "%s liked %s's post"
-msgstr "a %s è piaciuto il messaggio di %s"
+#: ../../include/features.php:52
+msgid "Network New Tab"
+msgstr "Contenuti nuovi"
-#: ../../mod/notifications.php:262 ../../mod/notifications.php:387
-#: ../../mod/notifications.php:474
-#, php-format
-msgid "%s disliked %s's post"
-msgstr "a %s non è piaciuto il messaggio di %s"
+#: ../../include/features.php:52
+msgid "Enable tab to display all new Network activity"
+msgstr "Abilita il link per visualizzare solo i nuovi contenuti"
-#: ../../mod/notifications.php:276 ../../mod/notifications.php:401
-#: ../../mod/notifications.php:488
-#, php-format
-msgid "%s is now friends with %s"
-msgstr "%s è ora amico di %s"
+#: ../../include/features.php:53
+msgid "Affinity Tool"
+msgstr "Filtro per affinità"
-#: ../../mod/notifications.php:283 ../../mod/notifications.php:408
-#, php-format
-msgid "%s created a new post"
-msgstr "%s a creato un nuovo messaggio"
+#: ../../include/features.php:53
+msgid "Filter stream activity by depth of relationships"
+msgstr "Permette di selezionare i contenuti in base al livello di amicizia"
-#: ../../mod/notifications.php:284 ../../mod/notifications.php:409
-#: ../../mod/notifications.php:497
-#, php-format
-msgid "%s commented on %s's post"
-msgstr "%s ha commentato il messaggio di %s"
+#: ../../include/features.php:54
+msgid "Suggest Channels"
+msgstr "Suggerisci canali"
-#: ../../mod/notifications.php:298
-msgid "No more network notifications."
-msgstr "Nessuna nuova."
+#: ../../include/features.php:54
+msgid "Show channel suggestions"
+msgstr "Mostra alcuni canali che potrebbero interessarti"
-#: ../../mod/notifications.php:302
-msgid "Network Notifications"
-msgstr "Notifiche dalla rete"
+#: ../../include/features.php:59
+msgid "Post/Comment Tools"
+msgstr "Gestione articoli e commenti"
-#: ../../mod/notifications.php:328 ../../mod/notify.php:61
-msgid "No more system notifications."
-msgstr "Nessuna nuova notifica di sistema."
+#: ../../include/features.php:61
+msgid "Edit Sent Posts"
+msgstr "Modifica gli articoli già inviati"
-#: ../../mod/notifications.php:332 ../../mod/notify.php:65
-msgid "System Notifications"
-msgstr "Notifiche di sistema"
+#: ../../include/features.php:61
+msgid "Edit and correct posts and comments after sending"
+msgstr "Modifica e correggi gli articoli o i commenti anche dopo l'invio"
-#: ../../mod/notifications.php:423
-msgid "No more personal notifications."
-msgstr "Nessuna nuova."
+#: ../../include/features.php:62
+msgid "Tagging"
+msgstr "Tag"
-#: ../../mod/notifications.php:427
-msgid "Personal Notifications"
-msgstr "Notifiche personali"
+#: ../../include/features.php:62
+msgid "Ability to tag existing posts"
+msgstr "Permetti l'aggiunta di tag su articoli già esistenti"
-#: ../../mod/notifications.php:504
-msgid "No more home notifications."
-msgstr "Nessuna nuova."
+#: ../../include/features.php:63
+msgid "Post Categories"
+msgstr "Categorie degli articoli"
-#: ../../mod/notifications.php:508
-msgid "Home Notifications"
-msgstr "Notifiche bacheca"
+#: ../../include/features.php:63
+msgid "Add categories to your posts"
+msgstr "Abilita le categorie per i tuoi articoli"
-#: ../../mod/contacts.php:84 ../../mod/contacts.php:164
-msgid "Could not access contact record."
-msgstr "Non è possibile accedere al contatto."
+#: ../../include/features.php:64
+msgid "Ability to file posts under folders"
+msgstr "Abilita la raccolta dei tuoi articoli in cartelle"
-#: ../../mod/contacts.php:98
-msgid "Could not locate selected profile."
-msgstr "Non riesco a trovare il profilo selezionato."
+#: ../../include/features.php:65
+msgid "Dislike Posts"
+msgstr "Non mi piace"
-#: ../../mod/contacts.php:121
-msgid "Contact updated."
-msgstr "Contatto aggiornato."
+#: ../../include/features.php:65
+msgid "Ability to dislike posts/comments"
+msgstr "Abilità la funzionalità \"non mi piace\" per i tuoi articoli"
-#: ../../mod/contacts.php:186
-msgid "Contact has been blocked"
-msgstr "Il contatto è stato bloccato"
+#: ../../include/features.php:66
+msgid "Star Posts"
+msgstr "Articoli stella (preferiti)"
-#: ../../mod/contacts.php:186
-msgid "Contact has been unblocked"
-msgstr "Il contatto è stato sbloccato"
+#: ../../include/features.php:66
+msgid "Ability to mark special posts with a star indicator"
+msgstr "Mostra la stella per scegliere gli articoli preferiti"
-#: ../../mod/contacts.php:200
-msgid "Contact has been ignored"
-msgstr "Il contatto è ignorato"
+#: ../../include/features.php:67
+msgid "Tag Cloud"
+msgstr "Nuvola di tag"
-#: ../../mod/contacts.php:200
-msgid "Contact has been unignored"
-msgstr "Il contatto non è più ignorato"
+#: ../../include/features.php:67
+msgid "Provide a personal tag cloud on your channel page"
+msgstr "Mostra la nuvola dei tag che usi di più sulla pagina del tuo canale"
-#: ../../mod/contacts.php:216
-msgid "Contact has been archived"
-msgstr ""
+#: ../../include/conversation.php:123
+msgid "channel"
+msgstr "canale"
-#: ../../mod/contacts.php:216
-msgid "Contact has been unarchived"
-msgstr ""
+#: ../../include/conversation.php:161 ../../mod/like.php:134
+#, php-format
+msgid "%1$s likes %2$s's %3$s"
+msgstr "A %1$s piace %3$s di %2$s"
-#: ../../mod/contacts.php:229
-msgid "Contact has been removed."
-msgstr "Il contatto è stato rimosso."
+#: ../../include/conversation.php:164 ../../mod/like.php:136
+#, php-format
+msgid "%1$s doesn't like %2$s's %3$s"
+msgstr "A %1$s non piace %3$s di %2$s"
-#: ../../mod/contacts.php:263
+#: ../../include/conversation.php:201
#, php-format
-msgid "You are mutual friends with %s"
-msgstr "Sei amico reciproco con %s"
+msgid "%1$s is now connected with %2$s"
+msgstr "%1$s adesso è connesso con %2$s"
-#: ../../mod/contacts.php:267
+#: ../../include/conversation.php:236
#, php-format
-msgid "You are sharing with %s"
-msgstr "Stai condividendo con %s"
+msgid "%1$s poked %2$s"
+msgstr "%1$s ha mandato un poke a %2$s"
-#: ../../mod/contacts.php:272
+#: ../../include/conversation.php:258 ../../mod/mood.php:63
#, php-format
-msgid "%s is sharing with you"
-msgstr "%s sta condividendo con te"
+msgid "%1$s is currently %2$s"
+msgstr "%1$s al momento è %2$s"
-#: ../../mod/contacts.php:289
-msgid "Private communications are not available for this contact."
-msgstr "Le comunicazioni private non sono disponibili per questo contatto."
+#: ../../include/conversation.php:631 ../../include/ItemObject.php:114
+msgid "Select"
+msgstr "Seleziona"
-#: ../../mod/contacts.php:292
-msgid "Never"
-msgstr "Mai"
+#: ../../include/conversation.php:632 ../../include/ItemObject.php:108
+#: ../../mod/thing.php:230 ../../mod/connedit.php:356 ../../mod/admin.php:693
+#: ../../mod/group.php:176 ../../mod/photos.php:1150
+#: ../../mod/filestorage.php:172 ../../mod/settings.php:570
+msgid "Delete"
+msgstr "Elimina"
-#: ../../mod/contacts.php:296
-msgid "(Update was successful)"
-msgstr "(L'aggiornamento è stato completato)"
+#: ../../include/conversation.php:642 ../../include/ItemObject.php:161
+msgid "Message is verified"
+msgstr "Messaggio verificato"
-#: ../../mod/contacts.php:296
-msgid "(Update was not successful)"
-msgstr "(L'aggiornamento non è stato completato)"
+#: ../../include/conversation.php:662
+#, php-format
+msgid "View %s's profile @ %s"
+msgstr "Vedi il profilo di %s @ %s"
-#: ../../mod/contacts.php:298
-msgid "Suggest friends"
-msgstr "Suggerisci amici"
+#: ../../include/conversation.php:676
+msgid "Categories:"
+msgstr "Categorie:"
-#: ../../mod/contacts.php:302
-#, php-format
-msgid "Network type: %s"
-msgstr "Tipo di rete: %s"
+#: ../../include/conversation.php:677
+msgid "Filed under:"
+msgstr "Classificato come:"
-#: ../../mod/contacts.php:305 ../../include/contact_widgets.php:190
+#: ../../include/conversation.php:686 ../../include/ItemObject.php:217
#, php-format
-msgid "%d contact in common"
-msgid_plural "%d contacts in common"
-msgstr[0] "%d contatto in comune"
-msgstr[1] "%d contatti in comune"
+msgid " from %s"
+msgstr " da %s"
-#: ../../mod/contacts.php:310
-msgid "View all contacts"
-msgstr "Vedi tutti i contatti"
+#: ../../include/conversation.php:689 ../../include/ItemObject.php:220
+#, php-format
+msgid "last edited: %s"
+msgstr "ultima modifica: %s"
-#: ../../mod/contacts.php:315 ../../mod/contacts.php:374
-#: ../../mod/admin.php:698
-msgid "Unblock"
-msgstr "Sblocca"
+#: ../../include/conversation.php:704
+msgid "View in context"
+msgstr "Vedi nel contesto"
-#: ../../mod/contacts.php:315 ../../mod/contacts.php:374
-#: ../../mod/admin.php:697
-msgid "Block"
-msgstr "Blocca"
+#: ../../include/conversation.php:706 ../../include/conversation.php:1119
+#: ../../include/ItemObject.php:248 ../../mod/photos.php:1081
+#: ../../mod/mail.php:222 ../../mod/mail.php:336 ../../mod/editlayout.php:110
+#: ../../mod/editpost.php:107 ../../mod/editwebpage.php:153
+#: ../../mod/editblock.php:124
+msgid "Please wait"
+msgstr "Attendere"
-#: ../../mod/contacts.php:318
-msgid "Toggle Blocked status"
-msgstr ""
+#: ../../include/conversation.php:833
+msgid "remove"
+msgstr "rimuovi"
-#: ../../mod/contacts.php:321 ../../mod/contacts.php:375
-msgid "Unignore"
-msgstr "Non ignorare"
+#: ../../include/conversation.php:837
+msgid "Loading..."
+msgstr "Caricamento in corso..."
-#: ../../mod/contacts.php:324
-msgid "Toggle Ignored status"
-msgstr ""
+#: ../../include/conversation.php:838
+msgid "Delete Selected Items"
+msgstr "Elimina gli oggetti selezionati"
-#: ../../mod/contacts.php:328
-msgid "Unarchive"
-msgstr ""
+#: ../../include/conversation.php:929
+msgid "View Source"
+msgstr "Vedi il sorgente"
-#: ../../mod/contacts.php:328
-msgid "Archive"
-msgstr ""
+#: ../../include/conversation.php:930
+msgid "Follow Thread"
+msgstr "Segui la discussione"
-#: ../../mod/contacts.php:331
-msgid "Toggle Archive status"
-msgstr ""
+#: ../../include/conversation.php:931
+msgid "View Status"
+msgstr "Guarda il messaggio di stato"
-#: ../../mod/contacts.php:334
-msgid "Repair"
-msgstr "Ripara"
+#: ../../include/conversation.php:933
+msgid "View Photos"
+msgstr "Guarda le foto"
-#: ../../mod/contacts.php:337
-msgid "Advanced Contact Settings"
-msgstr ""
+#: ../../include/conversation.php:934
+msgid "Matrix Activity"
+msgstr "Attività nella tua rete"
-#: ../../mod/contacts.php:343
-msgid "Communications lost with this contact!"
-msgstr ""
+#: ../../include/conversation.php:935
+msgid "Edit Contact"
+msgstr "Modifica il contatto"
-#: ../../mod/contacts.php:346
-msgid "Contact Editor"
-msgstr "Editor dei Contatti"
+#: ../../include/conversation.php:936
+msgid "Send PM"
+msgstr "Invia messaggio privato"
-#: ../../mod/contacts.php:349
-msgid "Profile Visibility"
-msgstr "Visibilità del profilo"
+#: ../../include/conversation.php:937
+msgid "Poke"
+msgstr "Poke"
-#: ../../mod/contacts.php:350
+#: ../../include/conversation.php:999
#, php-format
-msgid ""
-"Please choose the profile you would like to display to %s when viewing your "
-"profile securely."
-msgstr "Seleziona il profilo che vuoi mostrare a %s quando visita il tuo profilo in modo sicuro."
-
-#: ../../mod/contacts.php:351
-msgid "Contact Information / Notes"
-msgstr "Informazioni / Note sul contatto"
+msgid "%s likes this."
+msgstr "Piace a %s."
-#: ../../mod/contacts.php:352
-msgid "Edit contact notes"
-msgstr "Modifica note contatto"
+#: ../../include/conversation.php:999
+#, php-format
+msgid "%s doesn't like this."
+msgstr "Non piace a %s."
-#: ../../mod/contacts.php:357 ../../mod/contacts.php:549
-#: ../../mod/viewconnections.php:62 ../../mod/nogroup.php:40
+#: ../../include/conversation.php:1003
#, php-format
-msgid "Visit %s's profile [%s]"
-msgstr "Visita il profilo di %s [%s]"
+msgid "<span %1$s>%2$d people</span> like this."
+msgid_plural "<span %1$s>%2$d people</span> like this."
+msgstr[0] ""
+msgstr[1] "Piace a <span %1$s>%2$d persone</span>."
-#: ../../mod/contacts.php:358
-msgid "Block/Unblock contact"
-msgstr "Blocca/Sblocca contatto"
+#: ../../include/conversation.php:1005
+#, php-format
+msgid "<span %1$s>%2$d people</span> don't like this."
+msgid_plural "<span %1$s>%2$d people</span> don't like this."
+msgstr[0] ""
+msgstr[1] "Non piace a <span %1$s>%2$d persone</span>."
-#: ../../mod/contacts.php:359
-msgid "Ignore contact"
-msgstr "Ignora il contatto"
+#: ../../include/conversation.php:1011
+msgid "and"
+msgstr "e"
-#: ../../mod/contacts.php:360
-msgid "Repair URL settings"
-msgstr "Impostazioni riparazione URL"
+#: ../../include/conversation.php:1014
+#, php-format
+msgid ", and %d other people"
+msgid_plural ", and %d other people"
+msgstr[0] ""
+msgstr[1] "e altre %d persone"
-#: ../../mod/contacts.php:361
-msgid "View conversations"
-msgstr "Vedi conversazioni"
+#: ../../include/conversation.php:1015
+#, php-format
+msgid "%s like this."
+msgstr "Piace a %s."
-#: ../../mod/contacts.php:363
-msgid "Delete contact"
-msgstr "Rimuovi contatto"
+#: ../../include/conversation.php:1015
+#, php-format
+msgid "%s don't like this."
+msgstr "Non piace a %s."
-#: ../../mod/contacts.php:367
-msgid "Last update:"
-msgstr "Ultimo aggiornamento:"
+#: ../../include/conversation.php:1065
+msgid "Visible to <strong>everybody</strong>"
+msgstr "Visibile a <strong>tutti</strong>"
-#: ../../mod/contacts.php:369
-msgid "Update public posts"
-msgstr "Aggiorna messaggi pubblici"
+#: ../../include/conversation.php:1066 ../../mod/mail.php:171
+#: ../../mod/mail.php:269
+msgid "Please enter a link URL:"
+msgstr "Inserisci l'indirizzo del link:"
-#: ../../mod/contacts.php:371 ../../mod/admin.php:1170
-msgid "Update now"
-msgstr "Aggiorna adesso"
+#: ../../include/conversation.php:1067
+msgid "Please enter a video link/URL:"
+msgstr "Inserisci l'indirizzo del video:"
-#: ../../mod/contacts.php:378
-msgid "Currently blocked"
-msgstr "Bloccato"
+#: ../../include/conversation.php:1068
+msgid "Please enter an audio link/URL:"
+msgstr "Inserisci l'indirizzo dell'audio:"
-#: ../../mod/contacts.php:379
-msgid "Currently ignored"
-msgstr "Ignorato"
+#: ../../include/conversation.php:1069
+msgid "Tag term:"
+msgstr "Tag:"
-#: ../../mod/contacts.php:380
-msgid "Currently archived"
-msgstr ""
+#: ../../include/conversation.php:1070 ../../mod/filer.php:35
+msgid "Save to Folder:"
+msgstr "Salva nella cartella:"
-#: ../../mod/contacts.php:381
-msgid ""
-"Replies/likes to your public posts <strong>may</strong> still be visible"
-msgstr "Risposte ai tuoi post pubblici <strong>possono</strong> essere comunque visibili"
+#: ../../include/conversation.php:1071
+msgid "Where are you right now?"
+msgstr "Dove sei ora?"
-#: ../../mod/contacts.php:434
-msgid "Suggestions"
-msgstr "Suggerimenti"
+#: ../../include/conversation.php:1072 ../../mod/mail.php:172
+#: ../../mod/mail.php:270 ../../mod/editpost.php:52
+msgid "Expires YYYY-MM-DD HH:MM"
+msgstr "Scadenza il AAAA-MM-GG OO:MM"
-#: ../../mod/contacts.php:437
-msgid "Suggest potential friends"
-msgstr ""
+#: ../../include/conversation.php:1082 ../../include/ItemObject.php:546
+#: ../../mod/webpages.php:122 ../../mod/photos.php:1101
+#: ../../mod/editlayout.php:130 ../../mod/editpost.php:127
+#: ../../mod/editwebpage.php:177 ../../mod/editblock.php:145
+msgid "Preview"
+msgstr "Anteprima"
-#: ../../mod/contacts.php:440 ../../mod/group.php:191
-msgid "All Contacts"
-msgstr "Tutti i contatti"
+#: ../../include/conversation.php:1096 ../../mod/photos.php:1080
+msgid "Share"
+msgstr "Condividi"
-#: ../../mod/contacts.php:443
-msgid "Show all contacts"
-msgstr ""
+#: ../../include/conversation.php:1098 ../../mod/editwebpage.php:140
+msgid "Page link title"
+msgstr "Link del titolo"
-#: ../../mod/contacts.php:446
-msgid "Unblocked"
-msgstr ""
+#: ../../include/conversation.php:1100 ../../mod/mail.php:219
+#: ../../mod/mail.php:332 ../../mod/editlayout.php:102
+#: ../../mod/editpost.php:99 ../../mod/editwebpage.php:145
+#: ../../mod/editblock.php:116
+msgid "Upload photo"
+msgstr "Carica foto"
-#: ../../mod/contacts.php:449
-msgid "Only show unblocked contacts"
-msgstr ""
+#: ../../include/conversation.php:1101
+msgid "upload photo"
+msgstr "carica foto"
-#: ../../mod/contacts.php:453
-msgid "Blocked"
-msgstr ""
+#: ../../include/conversation.php:1102 ../../mod/mail.php:220
+#: ../../mod/mail.php:333 ../../mod/editlayout.php:103
+#: ../../mod/editpost.php:100 ../../mod/editwebpage.php:146
+#: ../../mod/editblock.php:117
+msgid "Attach file"
+msgstr "Allega file"
-#: ../../mod/contacts.php:456
-msgid "Only show blocked contacts"
-msgstr ""
+#: ../../include/conversation.php:1103
+msgid "attach file"
+msgstr "allega file"
-#: ../../mod/contacts.php:460
-msgid "Ignored"
-msgstr ""
+#: ../../include/conversation.php:1104 ../../mod/mail.php:221
+#: ../../mod/mail.php:334 ../../mod/editlayout.php:104
+#: ../../mod/editpost.php:101 ../../mod/editwebpage.php:147
+#: ../../mod/editblock.php:118
+msgid "Insert web link"
+msgstr "Inserisci un indirizzo web"
-#: ../../mod/contacts.php:463
-msgid "Only show ignored contacts"
-msgstr ""
+#: ../../include/conversation.php:1105
+msgid "web link"
+msgstr "link web"
-#: ../../mod/contacts.php:467
-msgid "Archived"
-msgstr ""
+#: ../../include/conversation.php:1106
+msgid "Insert video link"
+msgstr "Inserisci l'indirizzo di un video"
-#: ../../mod/contacts.php:470
-msgid "Only show archived contacts"
-msgstr ""
+#: ../../include/conversation.php:1107
+msgid "video link"
+msgstr "link video"
-#: ../../mod/contacts.php:474
-msgid "Hidden"
-msgstr ""
+#: ../../include/conversation.php:1108
+msgid "Insert audio link"
+msgstr "Inserisci l'indirizzo di un audio"
-#: ../../mod/contacts.php:477
-msgid "Only show hidden contacts"
-msgstr ""
+#: ../../include/conversation.php:1109
+msgid "audio link"
+msgstr "link audio"
-#: ../../mod/contacts.php:525
-msgid "Mutual Friendship"
-msgstr "Amicizia reciproca"
+#: ../../include/conversation.php:1110 ../../mod/editlayout.php:108
+#: ../../mod/editpost.php:105 ../../mod/editwebpage.php:151
+#: ../../mod/editblock.php:122
+msgid "Set your location"
+msgstr "La tua località"
-#: ../../mod/contacts.php:529
-msgid "is a fan of yours"
-msgstr "è un tuo fan"
+#: ../../include/conversation.php:1111
+msgid "set location"
+msgstr "la tua località"
-#: ../../mod/contacts.php:533
-msgid "you are a fan of"
-msgstr "sei un fan di"
+#: ../../include/conversation.php:1112 ../../mod/editlayout.php:109
+#: ../../mod/editpost.php:106 ../../mod/editwebpage.php:152
+#: ../../mod/editblock.php:123
+msgid "Clear browser location"
+msgstr "Rimuovi la località data dal browser"
-#: ../../mod/contacts.php:550 ../../mod/nogroup.php:41
-msgid "Edit contact"
-msgstr "Modifca contatto"
+#: ../../include/conversation.php:1113
+msgid "clear location"
+msgstr "rimuovi la località"
-#: ../../mod/contacts.php:571 ../../view/theme/diabook/theme.php:129
-#: ../../include/nav.php:139
-msgid "Contacts"
-msgstr "Contatti"
+#: ../../include/conversation.php:1115 ../../mod/editlayout.php:122
+#: ../../mod/editpost.php:119 ../../mod/editwebpage.php:169
+#: ../../mod/editblock.php:137
+msgid "Set title"
+msgstr "Scegli un titolo"
-#: ../../mod/contacts.php:575
-msgid "Search your contacts"
-msgstr "Cerca nei tuoi contatti"
+#: ../../include/conversation.php:1118 ../../mod/editlayout.php:124
+#: ../../mod/editpost.php:121 ../../mod/editwebpage.php:171
+#: ../../mod/editblock.php:139
+msgid "Categories (comma-separated list)"
+msgstr "Categorie (separate da virgola)"
-#: ../../mod/contacts.php:576 ../../mod/directory.php:59
-msgid "Finding: "
-msgstr "Ricerca: "
+#: ../../include/conversation.php:1120 ../../mod/editlayout.php:111
+#: ../../mod/editpost.php:108 ../../mod/editwebpage.php:154
+#: ../../mod/editblock.php:125
+msgid "Permission settings"
+msgstr "Impostazioni permessi"
-#: ../../mod/contacts.php:577 ../../mod/directory.php:61
-#: ../../include/contact_widgets.php:33
-msgid "Find"
-msgstr "Trova"
+#: ../../include/conversation.php:1121
+msgid "permissions"
+msgstr "permessi"
-#: ../../mod/lostpass.php:16
-msgid "No valid account found."
-msgstr "Nessun account valido trovato."
+#: ../../include/conversation.php:1129 ../../mod/editlayout.php:119
+#: ../../mod/editpost.php:116 ../../mod/editwebpage.php:164
+#: ../../mod/editblock.php:134
+msgid "Public post"
+msgstr "Articolo pubblico"
-#: ../../mod/lostpass.php:32
-msgid "Password reset request issued. Check your email."
-msgstr "La richiesta per reimpostare la password è stata inviata. Controlla la tua email."
+#: ../../include/conversation.php:1131 ../../mod/editlayout.php:125
+#: ../../mod/editpost.php:122 ../../mod/editwebpage.php:172
+#: ../../mod/editblock.php:140
+msgid "Example: bob@example.com, mary@example.com"
+msgstr "Per esempio: mario@esempio.com, simona@esempio.com"
+
+#: ../../include/conversation.php:1144 ../../mod/mail.php:226
+#: ../../mod/mail.php:339 ../../mod/editlayout.php:135
+#: ../../mod/editpost.php:133 ../../mod/editwebpage.php:182
+#: ../../mod/editblock.php:150
+msgid "Set expiration date"
+msgstr "Data di scadenza"
+
+#: ../../include/conversation.php:1146 ../../include/ItemObject.php:549
+#: ../../mod/mail.php:228 ../../mod/mail.php:341 ../../mod/editpost.php:135
+msgid "Encrypt text"
+msgstr "Crittografia del testo"
+
+#: ../../include/conversation.php:1148 ../../mod/editpost.php:136
+msgid "OK"
+msgstr "OK"
+
+#: ../../include/conversation.php:1149 ../../mod/tagrm.php:11
+#: ../../mod/tagrm.php:94 ../../mod/settings.php:508
+#: ../../mod/settings.php:534 ../../mod/editpost.php:137
+#: ../../mod/fbrowser.php:82 ../../mod/fbrowser.php:117
+msgid "Cancel"
+msgstr "Annulla"
-#: ../../mod/lostpass.php:43
-#, php-format
-msgid "Password reset requested at %s"
-msgstr "Richiesta reimpostazione password su %s"
-
-#: ../../mod/lostpass.php:45 ../../mod/lostpass.php:107
-#: ../../mod/register.php:90 ../../mod/register.php:144
-#: ../../mod/regmod.php:54 ../../mod/dfrn_confirm.php:752
-#: ../../addon/facebook/facebook.php:702
-#: ../../addon/facebook/facebook.php:1200 ../../addon/fbpost/fbpost.php:661
-#: ../../addon/public_server/public_server.php:62
-#: ../../addon/testdrive/testdrive.php:67 ../../include/items.php:3301
-#: ../../boot.php:788
-msgid "Administrator"
-msgstr "Amministratore"
+#: ../../include/conversation.php:1376
+msgid "Commented Order"
+msgstr "Ultimi commenti"
-#: ../../mod/lostpass.php:65
-msgid ""
-"Request could not be verified. (You may have previously submitted it.) "
-"Password reset failed."
-msgstr "La richiesta non può essere verificata. (Puoi averla già richiesta precendentemente). Reimpostazione password fallita."
+#: ../../include/conversation.php:1379
+msgid "Sort by Comment Date"
+msgstr "Per data del commento"
-#: ../../mod/lostpass.php:83 ../../boot.php:925
-msgid "Password Reset"
-msgstr "Reimpostazione password"
+#: ../../include/conversation.php:1382
+msgid "Posted Order"
+msgstr "Ultimi articoli"
-#: ../../mod/lostpass.php:84
-msgid "Your password has been reset as requested."
-msgstr "La tua password è stata reimpostata come richiesto."
+#: ../../include/conversation.php:1385
+msgid "Sort by Post Date"
+msgstr "Per data di creazione"
-#: ../../mod/lostpass.php:85
-msgid "Your new password is"
-msgstr "La tua nuova password è"
+#: ../../include/conversation.php:1389
+msgid "Personal"
+msgstr "Personali"
-#: ../../mod/lostpass.php:86
-msgid "Save or copy your new password - and then"
-msgstr "Salva o copia la tua nuova password, quindi"
+#: ../../include/conversation.php:1392
+msgid "Posts that mention or involve you"
+msgstr "Articoli che ti riguardano o ti menzionano"
-#: ../../mod/lostpass.php:87
-msgid "click here to login"
-msgstr "clicca qui per entrare"
+#: ../../include/conversation.php:1395 ../../mod/menu.php:57
+#: ../../mod/connections.php:209
+msgid "New"
+msgstr "Novità"
-#: ../../mod/lostpass.php:88
-msgid ""
-"Your password may be changed from the <em>Settings</em> page after "
-"successful login."
-msgstr "Puoi cambiare la tua password dalla pagina <em>Impostazioni</em> dopo aver effettuato l'accesso."
+#: ../../include/conversation.php:1398
+msgid "Activity Stream - by date"
+msgstr "Elenco attività - per data"
-#: ../../mod/lostpass.php:119
-msgid "Forgot your Password?"
-msgstr "Hai dimenticato la password?"
+#: ../../include/conversation.php:1405
+msgid "Starred"
+msgstr "Preferiti"
-#: ../../mod/lostpass.php:120
-msgid ""
-"Enter your email address and submit to have your password reset. Then check "
-"your email for further instructions."
-msgstr "Inserisci il tuo indirizzo email per reimpostare la password."
+#: ../../include/conversation.php:1408
+msgid "Favourite Posts"
+msgstr "Articoli preferiti"
-#: ../../mod/lostpass.php:121
-msgid "Nickname or Email: "
-msgstr "Nome utente o email: "
+#: ../../include/conversation.php:1415
+msgid "Spam"
+msgstr "Spam"
-#: ../../mod/lostpass.php:122
-msgid "Reset"
-msgstr "Reimposta"
+#: ../../include/conversation.php:1418
+msgid "Posts flagged as SPAM"
+msgstr "Articoli marcati come spam"
-#: ../../mod/settings.php:30 ../../include/nav.php:137
-msgid "Account settings"
-msgstr "Parametri account"
+#: ../../include/conversation.php:1448
+msgid "Channel"
+msgstr "Canale"
-#: ../../mod/settings.php:35
-msgid "Display settings"
-msgstr "Impostazioni grafiche"
+#: ../../include/conversation.php:1451
+msgid "Status Messages and Posts"
+msgstr "Articoli e messaggi di stato"
-#: ../../mod/settings.php:41
-msgid "Connector settings"
-msgstr "Impostazioni connettori"
+#: ../../include/conversation.php:1455
+msgid "About"
+msgstr "Informazioni"
-#: ../../mod/settings.php:46
-msgid "Plugin settings"
-msgstr "Impostazioni plugin"
+#: ../../include/conversation.php:1458
+msgid "Profile Details"
+msgstr "Dettagli del profilo"
-#: ../../mod/settings.php:51
-msgid "Connected apps"
-msgstr ""
+#: ../../include/conversation.php:1465 ../../include/photos.php:297
+msgid "Photo Albums"
+msgstr "Album foto"
-#: ../../mod/settings.php:56
-msgid "Export personal data"
-msgstr "Esporta dati personali"
+#: ../../include/conversation.php:1470 ../../mod/fbrowser.php:114
+msgid "Files"
+msgstr "Elenco file"
-#: ../../mod/settings.php:61
-msgid "Remove account"
-msgstr ""
+#: ../../include/conversation.php:1473
+msgid "Files and Storage"
+msgstr "Archivio file"
-#: ../../mod/settings.php:69 ../../mod/newmember.php:22
-#: ../../mod/admin.php:785 ../../mod/admin.php:990
-#: ../../addon/dav/friendica/layout.fnk.php:225
-#: ../../addon/mathjax/mathjax.php:36 ../../view/theme/diabook/theme.php:643
-#: ../../view/theme/diabook/theme.php:773 ../../include/nav.php:137
-msgid "Settings"
-msgstr "Impostazioni"
+#: ../../include/conversation.php:1485
+msgid "Events and Calendar"
+msgstr "Calendario eventi"
+
+#: ../../include/conversation.php:1490
+msgid "Webpages"
+msgstr "Pagine web"
+
+#: ../../include/conversation.php:1493
+msgid "Manage Webpages"
+msgstr "Gestisci le pagine web"
+
+#: ../../include/notify.php:23
+msgid "created a new post"
+msgstr "Ha creato un nuovo articolo"
+
+#: ../../include/notify.php:24
+#, php-format
+msgid "commented on %s's post"
+msgstr "ha commentato l'articolo di %s"
+
+#: ../../include/photos.php:15 ../../include/attach.php:97
+#: ../../include/attach.php:128 ../../include/attach.php:184
+#: ../../include/attach.php:199 ../../include/attach.php:232
+#: ../../include/attach.php:246 ../../include/attach.php:267
+#: ../../include/attach.php:461 ../../include/attach.php:539
+#: ../../include/items.php:3445 ../../mod/common.php:35
+#: ../../mod/events.php:140 ../../mod/thing.php:241 ../../mod/thing.php:257
+#: ../../mod/thing.php:291 ../../mod/invite.php:13 ../../mod/invite.php:104
+#: ../../mod/connedit.php:179 ../../mod/webpages.php:40 ../../mod/api.php:26
+#: ../../mod/api.php:31 ../../mod/page.php:30 ../../mod/page.php:80
+#: ../../mod/setup.php:200 ../../mod/viewconnections.php:22
+#: ../../mod/viewconnections.php:27 ../../mod/delegate.php:6
+#: ../../mod/sources.php:62 ../../mod/mitem.php:73 ../../mod/group.php:9
+#: ../../mod/photos.php:68 ../../mod/photos.php:653 ../../mod/viewsrc.php:12
+#: ../../mod/menu.php:40 ../../mod/connections.php:167
+#: ../../mod/layouts.php:27 ../../mod/layouts.php:42 ../../mod/network.php:12
+#: ../../mod/profiles.php:152 ../../mod/profiles.php:465
+#: ../../mod/new_channel.php:66 ../../mod/new_channel.php:97
+#: ../../mod/achievements.php:27 ../../mod/filestorage.php:10
+#: ../../mod/filestorage.php:59 ../../mod/filestorage.php:76
+#: ../../mod/filestorage.php:99 ../../mod/manage.php:6
+#: ../../mod/settings.php:484 ../../mod/mail.php:108
+#: ../../mod/editlayout.php:48 ../../mod/profile_photo.php:187
+#: ../../mod/profile_photo.php:200 ../../mod/editpost.php:13
+#: ../../mod/notifications.php:66 ../../mod/blocks.php:29
+#: ../../mod/blocks.php:44 ../../mod/editwebpage.php:44
+#: ../../mod/editwebpage.php:83 ../../mod/poke.php:128
+#: ../../mod/channel.php:88 ../../mod/channel.php:225
+#: ../../mod/fsuggest.php:78 ../../mod/editblock.php:48
+#: ../../mod/suggest.php:26 ../../mod/message.php:16 ../../mod/register.php:68
+#: ../../mod/regmod.php:18 ../../mod/authtest.php:13 ../../mod/item.php:182
+#: ../../mod/item.php:190 ../../mod/mood.php:119 ../../index.php:176
+#: ../../index.php:344
+msgid "Permission denied."
+msgstr "Permesso negato."
-#: ../../mod/settings.php:113
-msgid "Missing some important data!"
-msgstr "Mancano alcuni dati importanti!"
+#: ../../include/photos.php:88
+#, php-format
+msgid "Image exceeds website size limit of %lu bytes"
+msgstr "L'immagine supera il limite massimo di %lu bytes"
-#: ../../mod/settings.php:116 ../../mod/settings.php:569
-msgid "Update"
-msgstr "Aggiorna"
+#: ../../include/photos.php:95
+msgid "Image file is empty."
+msgstr "Il file dell'immagine è vuoto."
-#: ../../mod/settings.php:221
-msgid "Failed to connect with email account using the settings provided."
-msgstr "Impossibile collegarsi all'account email con i parametri forniti."
+#: ../../include/photos.php:122 ../../mod/profile_photo.php:147
+msgid "Unable to process image"
+msgstr "Impossibile elaborare l'immagine"
-#: ../../mod/settings.php:226
-msgid "Email settings updated."
-msgstr "Impostazioni e-mail aggiornate."
+#: ../../include/photos.php:184
+msgid "Photo storage failed."
+msgstr "Impossibile caricare la foto."
-#: ../../mod/settings.php:290
-msgid "Passwords do not match. Password unchanged."
-msgstr "Le password non corrispondono. Password non cambiata."
+#: ../../include/photos.php:301 ../../mod/photos.php:821
+#: ../../mod/photos.php:1296
+msgid "Upload New Photos"
+msgstr "Carica nuove foto"
-#: ../../mod/settings.php:295
-msgid "Empty passwords are not allowed. Password unchanged."
-msgstr "Le password non possono essere vuote. Password non cambiata."
+#: ../../include/profile_selectors.php:6
+msgid "Male"
+msgstr "Maschio"
-#: ../../mod/settings.php:306
-msgid "Password changed."
-msgstr "Password cambiata."
+#: ../../include/profile_selectors.php:6
+msgid "Female"
+msgstr "Femmina"
-#: ../../mod/settings.php:308
-msgid "Password update failed. Please try again."
-msgstr "Aggiornamento password fallito. Prova ancora."
+#: ../../include/profile_selectors.php:6
+msgid "Currently Male"
+msgstr "Al momento maschio"
-#: ../../mod/settings.php:373
-msgid " Please use a shorter name."
-msgstr " Usa un nome più corto."
+#: ../../include/profile_selectors.php:6
+msgid "Currently Female"
+msgstr "Al momento femmina"
-#: ../../mod/settings.php:375
-msgid " Name too short."
-msgstr " Nome troppo corto."
+#: ../../include/profile_selectors.php:6
+msgid "Mostly Male"
+msgstr "Prevalentemente maschio"
-#: ../../mod/settings.php:381
-msgid " Not valid email."
-msgstr " Email non valida."
+#: ../../include/profile_selectors.php:6
+msgid "Mostly Female"
+msgstr "Prevalentemente femmina"
-#: ../../mod/settings.php:383
-msgid " Cannot change to that email."
-msgstr "Non puoi usare quella email."
+#: ../../include/profile_selectors.php:6
+msgid "Transgender"
+msgstr "Transgender"
-#: ../../mod/settings.php:437
-msgid "Private forum has no privacy permissions. Using default privacy group."
-msgstr ""
+#: ../../include/profile_selectors.php:6
+msgid "Intersex"
+msgstr "Intersex"
-#: ../../mod/settings.php:441
-msgid "Private forum has no privacy permissions and no default privacy group."
-msgstr ""
+#: ../../include/profile_selectors.php:6
+msgid "Transsexual"
+msgstr "Transessuale"
-#: ../../mod/settings.php:471 ../../addon/facebook/facebook.php:495
-#: ../../addon/fbpost/fbpost.php:144 ../../addon/impressum/impressum.php:78
-#: ../../addon/openstreetmap/openstreetmap.php:80
-#: ../../addon/mathjax/mathjax.php:66 ../../addon/piwik/piwik.php:105
-#: ../../addon/twitter/twitter.php:389
-msgid "Settings updated."
-msgstr "Impostazioni aggiornate."
+#: ../../include/profile_selectors.php:6
+msgid "Hermaphrodite"
+msgstr "Ermafrodito"
-#: ../../mod/settings.php:542 ../../mod/settings.php:568
-#: ../../mod/settings.php:604
-msgid "Add application"
-msgstr "Aggiungi applicazione"
+#: ../../include/profile_selectors.php:6
+msgid "Neuter"
+msgstr "Neutro"
-#: ../../mod/settings.php:546 ../../mod/settings.php:572
-#: ../../addon/statusnet/statusnet.php:570
-msgid "Consumer Key"
-msgstr "Consumer Key"
+#: ../../include/profile_selectors.php:6
+msgid "Non-specific"
+msgstr "Non specificato"
-#: ../../mod/settings.php:547 ../../mod/settings.php:573
-#: ../../addon/statusnet/statusnet.php:569
-msgid "Consumer Secret"
-msgstr "Consumer Secret"
+#: ../../include/profile_selectors.php:6
+msgid "Other"
+msgstr "Altro"
-#: ../../mod/settings.php:548 ../../mod/settings.php:574
-msgid "Redirect"
-msgstr "Redirect"
+#: ../../include/profile_selectors.php:6
+msgid "Undecided"
+msgstr "Indeciso"
-#: ../../mod/settings.php:549 ../../mod/settings.php:575
-msgid "Icon url"
-msgstr "Url icona"
+#: ../../include/profile_selectors.php:23
+msgid "Males"
+msgstr "Maschi"
-#: ../../mod/settings.php:560
-msgid "You can't edit this application."
-msgstr "Non puoi modificare questa applicazione."
+#: ../../include/profile_selectors.php:23
+msgid "Females"
+msgstr "Femmine"
-#: ../../mod/settings.php:603
-msgid "Connected Apps"
-msgstr "Applicazioni Collegate"
+#: ../../include/profile_selectors.php:23
+msgid "Gay"
+msgstr "Gay"
-#: ../../mod/settings.php:607
-msgid "Client key starts with"
-msgstr "Chiave del client inizia con"
+#: ../../include/profile_selectors.php:23
+msgid "Lesbian"
+msgstr "Lesbica"
-#: ../../mod/settings.php:608
-msgid "No name"
-msgstr "Nessun nome"
+#: ../../include/profile_selectors.php:23
+msgid "No Preference"
+msgstr "Senza preferenza"
-#: ../../mod/settings.php:609
-msgid "Remove authorization"
-msgstr "Rimuovi l'autorizzazione"
+#: ../../include/profile_selectors.php:23
+msgid "Bisexual"
+msgstr "Bisessuale"
-#: ../../mod/settings.php:620
-msgid "No Plugin settings configured"
-msgstr "Nessun plugin ha impostazioni modificabili"
+#: ../../include/profile_selectors.php:23
+msgid "Autosexual"
+msgstr "Autosessuale"
-#: ../../mod/settings.php:628 ../../addon/widgets/widgets.php:123
-msgid "Plugin Settings"
-msgstr "Impostazioni plugin"
+#: ../../include/profile_selectors.php:23
+msgid "Abstinent"
+msgstr "Astinente"
-#: ../../mod/settings.php:640 ../../mod/settings.php:641
-#, php-format
-msgid "Built-in support for %s connectivity is %s"
-msgstr "Il supporto integrato per la connettività con %s è %s"
+#: ../../include/profile_selectors.php:23
+msgid "Virgin"
+msgstr "Vergine"
-#: ../../mod/settings.php:640 ../../mod/settings.php:641
-msgid "enabled"
-msgstr "abilitato"
+#: ../../include/profile_selectors.php:23
+msgid "Deviant"
+msgstr "Deviato"
-#: ../../mod/settings.php:640 ../../mod/settings.php:641
-msgid "disabled"
-msgstr "disabilitato"
+#: ../../include/profile_selectors.php:23
+msgid "Fetish"
+msgstr "Feticista"
-#: ../../mod/settings.php:641
-msgid "StatusNet"
-msgstr "StatusNet"
+#: ../../include/profile_selectors.php:23
+msgid "Oodles"
+msgstr "Un sacco"
-#: ../../mod/settings.php:673
-msgid "Email access is disabled on this site."
-msgstr "L'accesso email è disabilitato su questo sito."
+#: ../../include/profile_selectors.php:23
+msgid "Nonsexual"
+msgstr "Asessuato"
-#: ../../mod/settings.php:679
-msgid "Connector Settings"
-msgstr "Impostazioni Connettore"
+#: ../../include/profile_selectors.php:42
+msgid "Single"
+msgstr "Single"
-#: ../../mod/settings.php:684
-msgid "Email/Mailbox Setup"
-msgstr "Impostazioni email"
+#: ../../include/profile_selectors.php:42
+msgid "Lonely"
+msgstr "Da solo"
-#: ../../mod/settings.php:685
-msgid ""
-"If you wish to communicate with email contacts using this service "
-"(optional), please specify how to connect to your mailbox."
-msgstr "Se vuoi comunicare con i contatti email usando questo servizio, specifica come collegarti alla tua casella di posta. (opzionale)"
+#: ../../include/profile_selectors.php:42
+msgid "Available"
+msgstr "Disponibile"
-#: ../../mod/settings.php:686
-msgid "Last successful email check:"
-msgstr "Ultimo controllo email eseguito con successo:"
+#: ../../include/profile_selectors.php:42
+msgid "Unavailable"
+msgstr "Non disponibile"
-#: ../../mod/settings.php:688
-msgid "IMAP server name:"
-msgstr "Nome server IMAP:"
+#: ../../include/profile_selectors.php:42
+msgid "Has crush"
+msgstr "Ha una cotta"
-#: ../../mod/settings.php:689
-msgid "IMAP port:"
-msgstr "Porta IMAP:"
+#: ../../include/profile_selectors.php:42
+msgid "Infatuated"
+msgstr "Infatuato/a"
-#: ../../mod/settings.php:690
-msgid "Security:"
-msgstr "Sicurezza:"
+#: ../../include/profile_selectors.php:42
+msgid "Dating"
+msgstr "Disponibile a un incontro"
-#: ../../mod/settings.php:690 ../../mod/settings.php:695
-#: ../../addon/dav/common/wdcal_edit.inc.php:191
-msgid "None"
-msgstr "Nessuna"
+#: ../../include/profile_selectors.php:42
+msgid "Unfaithful"
+msgstr "Infedele"
-#: ../../mod/settings.php:691
-msgid "Email login name:"
-msgstr "Nome utente email:"
+#: ../../include/profile_selectors.php:42
+msgid "Sex Addict"
+msgstr "Sesso-dipendente"
-#: ../../mod/settings.php:692
-msgid "Email password:"
-msgstr "Password email:"
+#: ../../include/profile_selectors.php:42
+msgid "Friends/Benefits"
+msgstr "Amici piccanti"
-#: ../../mod/settings.php:693
-msgid "Reply-to address:"
-msgstr "Indirizzo di risposta:"
+#: ../../include/profile_selectors.php:42
+msgid "Casual"
+msgstr "Casual"
-#: ../../mod/settings.php:694
-msgid "Send public posts to all email contacts:"
-msgstr "Invia i messaggi pubblici ai contatti email:"
+#: ../../include/profile_selectors.php:42
+msgid "Engaged"
+msgstr "Impegnato"
-#: ../../mod/settings.php:695
-msgid "Action after import:"
-msgstr "Azione post importazione:"
+#: ../../include/profile_selectors.php:42
+msgid "Married"
+msgstr "Sposato/a"
-#: ../../mod/settings.php:695
-msgid "Mark as seen"
-msgstr "Segna come letto"
+#: ../../include/profile_selectors.php:42
+msgid "Imaginarily married"
+msgstr "Sogna il matrimonio"
-#: ../../mod/settings.php:695
-msgid "Move to folder"
-msgstr "Sposta nella cartella"
+#: ../../include/profile_selectors.php:42
+msgid "Partners"
+msgstr "Partner"
-#: ../../mod/settings.php:696
-msgid "Move to folder:"
-msgstr "Sposta nella cartella:"
+#: ../../include/profile_selectors.php:42
+msgid "Cohabiting"
+msgstr "Convivente"
-#: ../../mod/settings.php:727 ../../mod/admin.php:402
-msgid "No special theme for mobile devices"
-msgstr ""
+#: ../../include/profile_selectors.php:42
+msgid "Common law"
+msgstr "Matrimonio regolare"
-#: ../../mod/settings.php:767
-msgid "Display Settings"
-msgstr "Impostazioni Grafiche"
+#: ../../include/profile_selectors.php:42
+msgid "Happy"
+msgstr "Felice"
-#: ../../mod/settings.php:773 ../../mod/settings.php:784
-msgid "Display Theme:"
-msgstr "Tema:"
+#: ../../include/profile_selectors.php:42
+msgid "Not looking"
+msgstr "Non in cerca"
-#: ../../mod/settings.php:774
-msgid "Mobile Theme:"
-msgstr ""
+#: ../../include/profile_selectors.php:42
+msgid "Swinger"
+msgstr "Scambista"
-#: ../../mod/settings.php:775
-msgid "Update browser every xx seconds"
-msgstr "Aggiorna il browser ogni x secondi"
+#: ../../include/profile_selectors.php:42
+msgid "Betrayed"
+msgstr "Tradito/a"
-#: ../../mod/settings.php:775
-msgid "Minimum of 10 seconds, no maximum"
-msgstr "Minimo 10 secondi, nessun limite massimo"
+#: ../../include/profile_selectors.php:42
+msgid "Separated"
+msgstr "Separato/a"
-#: ../../mod/settings.php:776
-msgid "Number of items to display per page:"
-msgstr ""
+#: ../../include/profile_selectors.php:42
+msgid "Unstable"
+msgstr "Instabile"
-#: ../../mod/settings.php:776
-msgid "Maximum of 100 items"
-msgstr "Massimo 100 voci"
+#: ../../include/profile_selectors.php:42
+msgid "Divorced"
+msgstr "Divorziato/a"
-#: ../../mod/settings.php:777
-msgid "Don't show emoticons"
-msgstr "Non mostrare le emoticons"
+#: ../../include/profile_selectors.php:42
+msgid "Imaginarily divorced"
+msgstr "Sogna il divorzio"
-#: ../../mod/settings.php:853
-msgid "Normal Account Page"
-msgstr ""
+#: ../../include/profile_selectors.php:42
+msgid "Widowed"
+msgstr "Vedovo/a"
-#: ../../mod/settings.php:854
-msgid "This account is a normal personal profile"
-msgstr "Questo account è un normale profilo personale"
+#: ../../include/profile_selectors.php:42
+msgid "Uncertain"
+msgstr "Incerto/a"
-#: ../../mod/settings.php:857
-msgid "Soapbox Page"
-msgstr ""
+#: ../../include/profile_selectors.php:42
+msgid "It's complicated"
+msgstr "Relazione complicata"
-#: ../../mod/settings.php:858
-msgid "Automatically approve all connection/friend requests as read-only fans"
-msgstr "Chi richiede la connessione/amicizia sarà accettato automaticamente come fan che potrà solamente leggere la bacheca"
+#: ../../include/profile_selectors.php:42
+msgid "Don't care"
+msgstr "Chi se ne frega"
-#: ../../mod/settings.php:861
-msgid "Community Forum/Celebrity Account"
-msgstr ""
+#: ../../include/profile_selectors.php:42
+msgid "Ask me"
+msgstr "Chiedimelo"
-#: ../../mod/settings.php:862
-msgid ""
-"Automatically approve all connection/friend requests as read-write fans"
-msgstr "Chi richiede la connessione/amicizia sarà accettato automaticamente come fan che potrà leggere e scrivere sulla bacheca"
+#: ../../include/attach.php:179 ../../include/attach.php:227
+msgid "Item was not found."
+msgstr "Elemento non trovato."
-#: ../../mod/settings.php:865
-msgid "Automatic Friend Page"
-msgstr ""
+#: ../../include/attach.php:280
+msgid "No source file."
+msgstr "Nessun file di origine."
-#: ../../mod/settings.php:866
-msgid "Automatically approve all connection/friend requests as friends"
-msgstr "Chi richiede la connessione/amicizia sarà accettato automaticamente come amico"
+#: ../../include/attach.php:297
+msgid "Cannot locate file to replace"
+msgstr "Il file da sostituire non è stato trovato"
-#: ../../mod/settings.php:869
-msgid "Private Forum [Experimental]"
-msgstr ""
+#: ../../include/attach.php:315
+msgid "Cannot locate file to revise/update"
+msgstr "Il file da aggiornare non è stato trovato"
-#: ../../mod/settings.php:870
-msgid "Private forum - approved members only"
-msgstr ""
+#: ../../include/attach.php:326
+#, php-format
+msgid "File exceeds size limit of %d"
+msgstr "Il file supera la dimensione massima di %d"
-#: ../../mod/settings.php:882
-msgid "OpenID:"
-msgstr "OpenID:"
+#: ../../include/attach.php:337
+#, php-format
+msgid "You have reached your limit of %1$.0f Mbytes attachment storage."
+msgstr "Hai raggiunto il limite complessivo di %1$.0f Mbytes per gli allegati."
-#: ../../mod/settings.php:882
-msgid "(Optional) Allow this OpenID to login to this account."
-msgstr "(Opzionale) Consente di loggarti in questo account con questo OpenID"
+#: ../../include/attach.php:421
+msgid "File upload failed. Possible system limit or action terminated."
+msgstr "Caricamento file fallito, potrebbe aver superato i limiti o l'azione potrebbe essere stata interrotta."
-#: ../../mod/settings.php:892
-msgid "Publish your default profile in your local site directory?"
-msgstr "Pubblica il tuo profilo predefinito nell'elenco locale del sito"
+#: ../../include/attach.php:433
+msgid "Stored file could not be verified. Upload failed."
+msgstr "Il file non può essere verificato. Caricamento fallito."
-#: ../../mod/settings.php:898
-msgid "Publish your default profile in the global social directory?"
-msgstr "Pubblica il tuo profilo predefinito nell'elenco sociale globale"
+#: ../../include/attach.php:477 ../../include/attach.php:494
+msgid "Path not available."
+msgstr "Percorso non disponibile."
-#: ../../mod/settings.php:906
-msgid "Hide your contact/friend list from viewers of your default profile?"
-msgstr "Nascondi la lista dei tuoi contatti/amici dai visitatori del tuo profilo predefinito"
+#: ../../include/attach.php:544
+msgid "Empty pathname"
+msgstr "Il percorso del file è vuoto"
-#: ../../mod/settings.php:910
-msgid "Hide your profile details from unknown viewers?"
-msgstr "Nascondi i dettagli del tuo profilo ai visitatori sconosciuti?"
+#: ../../include/attach.php:562
+msgid "duplicate filename or path"
+msgstr "il file o percorso del file è duplicato"
-#: ../../mod/settings.php:915
-msgid "Allow friends to post to your profile page?"
-msgstr "Permetti agli amici di scrivere sulla tua pagina profilo?"
+#: ../../include/attach.php:587
+msgid "Path not found."
+msgstr "Percorso del file non trovato."
-#: ../../mod/settings.php:921
-msgid "Allow friends to tag your posts?"
-msgstr "Permetti agli amici di taggare i tuoi messaggi?"
+#: ../../include/attach.php:632
+msgid "mkdir failed."
+msgstr "mkdir fallito."
-#: ../../mod/settings.php:927
-msgid "Allow us to suggest you as a potential friend to new members?"
-msgstr "Ci permetti di suggerirti come potenziale amico ai nuovi membri?"
+#: ../../include/attach.php:636
+msgid "database storage failed."
+msgstr "scrittura su database fallita."
-#: ../../mod/settings.php:933
-msgid "Permit unknown people to send you private mail?"
-msgstr "Permetti a utenti sconosciuti di inviarti messaggi privati?"
+#: ../../include/taxonomy.php:210
+msgid "Tags"
+msgstr "Tag"
-#: ../../mod/settings.php:941
-msgid "Profile is <strong>not published</strong>."
-msgstr "Il profilo <strong>non è pubblicato</strong>."
+#: ../../include/taxonomy.php:227
+msgid "Keywords"
+msgstr "Parole chiave"
-#: ../../mod/settings.php:944 ../../mod/profile_photo.php:248
-msgid "or"
-msgstr "o"
+#: ../../include/taxonomy.php:252
+msgid "have"
+msgstr "ho"
-#: ../../mod/settings.php:949
-msgid "Your Identity Address is"
-msgstr "L'indirizzo della tua identità è"
+#: ../../include/taxonomy.php:252
+msgid "has"
+msgstr "ha"
-#: ../../mod/settings.php:960
-msgid "Automatically expire posts after this many days:"
-msgstr "Fai scadere i post automaticamente dopo x giorni:"
+#: ../../include/taxonomy.php:253
+msgid "want"
+msgstr "voglio"
-#: ../../mod/settings.php:960
-msgid "If empty, posts will not expire. Expired posts will be deleted"
-msgstr "Se lasciato vuoto, i messaggi non verranno cancellati."
+#: ../../include/taxonomy.php:253
+msgid "wants"
+msgstr "vuole"
-#: ../../mod/settings.php:961
-msgid "Advanced expiration settings"
-msgstr "Impostazioni avanzate di scandenza"
+#: ../../include/taxonomy.php:254 ../../include/ItemObject.php:175
+msgid "like"
+msgstr "mi piace"
-#: ../../mod/settings.php:962
-msgid "Advanced Expiration"
-msgstr "Scadenza avanzata"
+#: ../../include/taxonomy.php:254
+msgid "likes"
+msgstr "ama"
-#: ../../mod/settings.php:963
-msgid "Expire posts:"
-msgstr "Fai scadere i post:"
+#: ../../include/taxonomy.php:255 ../../include/ItemObject.php:176
+msgid "dislike"
+msgstr "non mi piace"
-#: ../../mod/settings.php:964
-msgid "Expire personal notes:"
-msgstr "Fai scadere le Note personali:"
+#: ../../include/taxonomy.php:255
+msgid "dislikes"
+msgstr "non ama"
-#: ../../mod/settings.php:965
-msgid "Expire starred posts:"
-msgstr "Fai scadere i post Speciali:"
+#: ../../include/account.php:23
+msgid "Not a valid email address"
+msgstr "Email non valida"
-#: ../../mod/settings.php:966
-msgid "Expire photos:"
-msgstr "Fai scadere le foto:"
+#: ../../include/account.php:25
+msgid "Your email domain is not among those allowed on this site"
+msgstr "Il dominio della tua email attualmente non è permesso su questo sito"
-#: ../../mod/settings.php:967
-msgid "Only expire posts by others:"
-msgstr ""
+#: ../../include/account.php:31
+msgid "Your email address is already registered at this site."
+msgstr "La tua email è già registrata su questo sito."
-#: ../../mod/settings.php:974
-msgid "Account Settings"
-msgstr "Impostazioni account"
+#: ../../include/account.php:64
+msgid "An invitation is required."
+msgstr "È necessario un invito."
-#: ../../mod/settings.php:982
-msgid "Password Settings"
-msgstr "Impostazioni password"
+#: ../../include/account.php:68
+msgid "Invitation could not be verified."
+msgstr "L'invito non può essere verificato."
-#: ../../mod/settings.php:983
-msgid "New Password:"
-msgstr "Nuova password:"
+#: ../../include/account.php:119
+msgid "Please enter the required information."
+msgstr "Inserisci le informazioni richieste."
-#: ../../mod/settings.php:984
-msgid "Confirm:"
-msgstr "Conferma:"
+#: ../../include/account.php:187
+msgid "Failed to store account information."
+msgstr "Non è stato possibile salvare le informazioni del tuo account."
-#: ../../mod/settings.php:984
-msgid "Leave password fields blank unless changing"
-msgstr "Lascia questi campi in bianco per non effettuare variazioni alla password"
+#: ../../include/account.php:273
+#, php-format
+msgid "Registration request at %s"
+msgstr "Richiesta di registrazione su %s"
-#: ../../mod/settings.php:988
-msgid "Basic Settings"
-msgstr "Impostazioni base"
+#: ../../include/account.php:275 ../../include/account.php:302
+#: ../../include/account.php:359
+msgid "Administrator"
+msgstr "Amministratore"
-#: ../../mod/settings.php:989 ../../include/profile_advanced.php:15
-msgid "Full Name:"
-msgstr "Nome completo:"
+#: ../../include/account.php:297
+msgid "your registration password"
+msgstr "la password di registrazione"
-#: ../../mod/settings.php:990
-msgid "Email Address:"
-msgstr "Indirizzo Email:"
+#: ../../include/account.php:300 ../../include/account.php:357
+#, php-format
+msgid "Registration details for %s"
+msgstr "Dettagli della registrazione di %s"
-#: ../../mod/settings.php:991
-msgid "Your Timezone:"
-msgstr "Il tuo fuso orario:"
+#: ../../include/account.php:366
+msgid "Account approved."
+msgstr "Account approvato."
-#: ../../mod/settings.php:992
-msgid "Default Post Location:"
-msgstr "Località predefinita:"
+#: ../../include/account.php:400
+#, php-format
+msgid "Registration revoked for %s"
+msgstr "Registrazione revocata per %s"
-#: ../../mod/settings.php:993
-msgid "Use Browser Location:"
-msgstr "Usa la località rilevata dal browser:"
+#: ../../include/dir_fns.php:15
+msgid "Sort Options"
+msgstr "Opzioni di ordinamento"
-#: ../../mod/settings.php:996
-msgid "Security and Privacy Settings"
-msgstr "Impostazioni di sicurezza e privacy"
+#: ../../include/dir_fns.php:16
+msgid "Alphabetic"
+msgstr "Alfabetico"
-#: ../../mod/settings.php:998
-msgid "Maximum Friend Requests/Day:"
-msgstr "Numero massimo di richieste di amicizia al giorno:"
+#: ../../include/dir_fns.php:17
+msgid "Reverse Alphabetic"
+msgstr "Alfabetico inverso"
-#: ../../mod/settings.php:998 ../../mod/settings.php:1017
-msgid "(to prevent spam abuse)"
-msgstr "(per prevenire lo spam)"
+#: ../../include/dir_fns.php:18
+msgid "Newest to Oldest"
+msgstr "Dal più nuovo al più vecchio"
-#: ../../mod/settings.php:999
-msgid "Default Post Permissions"
-msgstr "Permessi predefiniti per i messaggi"
+#: ../../include/dir_fns.php:30
+msgid "Enable Safe Search"
+msgstr "Abilita SafeSearch"
-#: ../../mod/settings.php:1000
-msgid "(click to open/close)"
-msgstr "(clicca per aprire/chiudere)"
+#: ../../include/dir_fns.php:32
+msgid "Disable Safe Search"
+msgstr "Disabilita SafeSearch"
-#: ../../mod/settings.php:1017
-msgid "Maximum private messages per day from unknown people:"
-msgstr "Numero massimo di messaggi privati da utenti sconosciuti per giorno:"
+#: ../../include/dir_fns.php:34
+msgid "Safe Mode"
+msgstr "Modalità SafeSearch"
-#: ../../mod/settings.php:1020
-msgid "Notification Settings"
-msgstr "Impostazioni notifiche"
+#: ../../include/enotify.php:40
+msgid "Red Matrix Notification"
+msgstr "Notifica di Red Matrix"
-#: ../../mod/settings.php:1021
-msgid "By default post a status message when:"
-msgstr ""
+#: ../../include/enotify.php:41
+msgid "redmatrix"
+msgstr "redmatrix"
-#: ../../mod/settings.php:1022
-msgid "accepting a friend request"
-msgstr ""
+#: ../../include/enotify.php:43
+msgid "Thank You,"
+msgstr "Grazie,"
-#: ../../mod/settings.php:1023
-msgid "joining a forum/community"
-msgstr ""
+#: ../../include/enotify.php:45
+#, php-format
+msgid "%s Administrator"
+msgstr "Amministratore %s"
-#: ../../mod/settings.php:1024
-msgid "making an <em>interesting</em> profile change"
-msgstr ""
+#: ../../include/enotify.php:80
+#, php-format
+msgid "%s <!item_type!>"
+msgstr "%s <!item_type!>"
-#: ../../mod/settings.php:1025
-msgid "Send a notification email when:"
-msgstr "Invia una mail di notifica quando:"
+#: ../../include/enotify.php:84
+#, php-format
+msgid "[Red:Notify] New mail received at %s"
+msgstr "[Red:Notifica] Nuovo messaggio ricevuto alle %s"
-#: ../../mod/settings.php:1026
-msgid "You receive an introduction"
-msgstr "Ricevi una presentazione"
+#: ../../include/enotify.php:86
+#, php-format
+msgid "%1$s, %2$s sent you a new private message at %3$s."
+msgstr "%1$s, %2$s ti ha mandato un messaggio privato alle %3$s."
-#: ../../mod/settings.php:1027
-msgid "Your introductions are confirmed"
-msgstr "Le tue presentazioni sono confermate"
+#: ../../include/enotify.php:87
+#, php-format
+msgid "%1$s sent you %2$s."
+msgstr "%1$s ti ha mandato %2$s."
-#: ../../mod/settings.php:1028
-msgid "Someone writes on your profile wall"
-msgstr "Qualcuno scrive sulla bacheca del tuo profilo"
+#: ../../include/enotify.php:87
+msgid "a private message"
+msgstr "un messaggio privato"
-#: ../../mod/settings.php:1029
-msgid "Someone writes a followup comment"
-msgstr "Qualcuno scrive un commento a un tuo messaggio"
+#: ../../include/enotify.php:88
+#, php-format
+msgid "Please visit %s to view and/or reply to your private messages."
+msgstr "Visita %s per leggere i tuoi messaggi privati e rispondere."
-#: ../../mod/settings.php:1030
-msgid "You receive a private message"
-msgstr "Ricevi un messaggio privato"
+#: ../../include/enotify.php:142
+#, php-format
+msgid "%1$s, %2$s commented on [zrl=%3$s]a %4$s[/zrl]"
+msgstr "%1$s, %2$s ha commentato [zrl=%3$s]%4$s[/zrl]"
-#: ../../mod/settings.php:1031
-msgid "You receive a friend suggestion"
-msgstr "Hai ricevuto un suggerimento di amicizia"
+#: ../../include/enotify.php:150
+#, php-format
+msgid "%1$s, %2$s commented on [zrl=%3$s]%4$s's %5$s[/zrl]"
+msgstr "%1$s, %2$s ha commentato [zrl=%3$s]%5$s di %4$s[/zrl]"
-#: ../../mod/settings.php:1032
-msgid "You are tagged in a post"
-msgstr "Sei stato taggato in un post"
+#: ../../include/enotify.php:159
+#, php-format
+msgid "%1$s, %2$s commented on [zrl=%3$s]your %4$s[/zrl]"
+msgstr "%1$s, %2$s ha commentato [zrl=%3$s]%4$s che hai creato[/zrl]"
-#: ../../mod/settings.php:1033
-msgid "You are poked/prodded/etc. in a post"
-msgstr ""
+#: ../../include/enotify.php:170
+#, php-format
+msgid "[Red:Notify] Comment to conversation #%1$d by %2$s"
+msgstr "[Red:Notifica] Nuovo commento di %2$s alla conversazione #%1$d"
-#: ../../mod/settings.php:1036
-msgid "Advanced Account/Page Type Settings"
-msgstr ""
+#: ../../include/enotify.php:171
+#, php-format
+msgid "%1$s, %2$s commented on an item/conversation you have been following."
+msgstr "%1$s, %2$s ha commentato un elemento che stavi seguendo."
-#: ../../mod/settings.php:1037
-msgid "Change the behaviour of this account for special situations"
-msgstr ""
+#: ../../include/enotify.php:174 ../../include/enotify.php:189
+#: ../../include/enotify.php:215 ../../include/enotify.php:234
+#: ../../include/enotify.php:248
+#, php-format
+msgid "Please visit %s to view and/or reply to the conversation."
+msgstr "Visita %s per leggere o commentare la conversazione."
-#: ../../mod/manage.php:91
-msgid "Manage Identities and/or Pages"
-msgstr "Gestisci indentità e/o pagine"
+#: ../../include/enotify.php:180
+#, php-format
+msgid "[Red:Notify] %s posted to your profile wall"
+msgstr "[Red:Notifica] %s ha scritto sulla tua bacheca"
-#: ../../mod/manage.php:94
-msgid ""
-"Toggle between different identities or community/group pages which share "
-"your account details or which you have been granted \"manage\" permissions"
-msgstr "Cambia tra differenti identità o pagine comunità/gruppi che condividono il tuo account o per cui hai i permessi di gestione"
+#: ../../include/enotify.php:182
+#, php-format
+msgid "%1$s, %2$s posted to your profile wall at %3$s"
+msgstr "%1$s, %2$s ha scritto sulla bacheca del tuo profilo alle %3$s"
-#: ../../mod/manage.php:96
-msgid "Select an identity to manage: "
-msgstr "Seleziona un'identità da gestire:"
+#: ../../include/enotify.php:184
+#, php-format
+msgid "%1$s, %2$s posted to [zrl=%3$s]your wall[/zrl]"
+msgstr "%1$s, %2$s ha scritto sulla [zrl=%3$s]tua bacheca[/zrl]"
-#: ../../mod/network.php:97
-msgid "Search Results For:"
-msgstr "Cerca risultati per:"
+#: ../../include/enotify.php:208
+#, php-format
+msgid "[Red:Notify] %s tagged you"
+msgstr "[Red:Notifica] %s ti ha taggato"
-#: ../../mod/network.php:137 ../../mod/search.php:16
-msgid "Remove term"
-msgstr "Rimuovi termine"
+#: ../../include/enotify.php:209
+#, php-format
+msgid "%1$s, %2$s tagged you at %3$s"
+msgstr "%1$s, %2$s ti ha taggato alle %3$s"
-#: ../../mod/network.php:146 ../../mod/search.php:13
-msgid "Saved Searches"
-msgstr "Ricerche salvate"
+#: ../../include/enotify.php:210
+#, php-format
+msgid "%1$s, %2$s [zrl=%3$s]tagged you[/zrl]."
+msgstr "%1$s, %2$s [zrl=%3$s]ti ha taggato[/zrl]."
-#: ../../mod/network.php:147 ../../include/group.php:244
-msgid "add"
-msgstr "aggiungi"
+#: ../../include/enotify.php:223
+#, php-format
+msgid "[Red:Notify] %1$s poked you"
+msgstr "[Red:Notifica] %1$s ti ha mandato un poke"
-#: ../../mod/network.php:287
-msgid "Commented Order"
-msgstr "Ordina per commento"
+#: ../../include/enotify.php:224
+#, php-format
+msgid "%1$s, %2$s poked you at %3$s"
+msgstr "%1$s, %2$s ti ha mandato un poke alle %3$s"
-#: ../../mod/network.php:290
-msgid "Sort by Comment Date"
-msgstr ""
+#: ../../include/enotify.php:225
+#, php-format
+msgid "%1$s, %2$s [zrl=%2$s]poked you[/zrl]."
+msgstr "%1$s, %2$s [zrl=%2$s]ti ha mandato un poke[/zrl]."
-#: ../../mod/network.php:293
-msgid "Posted Order"
-msgstr "Ordina per invio"
+#: ../../include/enotify.php:241
+#, php-format
+msgid "[Red:Notify] %s tagged your post"
+msgstr "[Red:Notifica] %s ha taggato il tuo articolo"
-#: ../../mod/network.php:296
-msgid "Sort by Post Date"
-msgstr ""
+#: ../../include/enotify.php:242
+#, php-format
+msgid "%1$s, %2$s tagged your post at %3$s"
+msgstr "%1$s, %2$s ha taggato il tuo articolo alle %3$s"
-#: ../../mod/network.php:303
-msgid "Posts that mention or involve you"
-msgstr ""
+#: ../../include/enotify.php:243
+#, php-format
+msgid "%1$s, %2$s tagged [zrl=%3$s]your post[/zrl]"
+msgstr "%1$s, %2$s ha taggato [zrl=%3$s]il tuo articolo[/zrl]"
-#: ../../mod/network.php:306
-msgid "New"
-msgstr "Nuovo"
+#: ../../include/enotify.php:255
+msgid "[Red:Notify] Introduction received"
+msgstr "[Red:Notifica] Hai una richiesta di amicizia"
-#: ../../mod/network.php:309
-msgid "Activity Stream - by date"
-msgstr ""
+#: ../../include/enotify.php:256
+#, php-format
+msgid "%1$s, you've received an introduction from '%2$s' at %3$s"
+msgstr "%1$s, hai ricevuto una richiesta di contatto da '%2$s' alle %3$s"
-#: ../../mod/network.php:312
-msgid "Starred"
-msgstr "Preferiti"
+#: ../../include/enotify.php:257
+#, php-format
+msgid "%1$s, you've received [zrl=%2$s]an introduction[/zrl] from %3$s."
+msgstr "%1$s, hai ricevuto [zrl=%2$s]una richiesta di amicizia[/zrl] da %3$s."
-#: ../../mod/network.php:315
-msgid "Favourite Posts"
-msgstr ""
+#: ../../include/enotify.php:261 ../../include/enotify.php:280
+#, php-format
+msgid "You may visit their profile at %s"
+msgstr "Puoi visitare il suo profilo su %s"
-#: ../../mod/network.php:318
-msgid "Shared Links"
-msgstr "Links condivisi"
+#: ../../include/enotify.php:263
+#, php-format
+msgid "Please visit %s to approve or reject the introduction."
+msgstr "Visita %s per approvare o rifiutare la richiesta."
-#: ../../mod/network.php:321
-msgid "Interesting Links"
-msgstr ""
+#: ../../include/enotify.php:270
+msgid "[Red:Notify] Friend suggestion received"
+msgstr "[Red:Notifica] Ti è stato suggerito un amico"
-#: ../../mod/network.php:388
+#: ../../include/enotify.php:271
#, php-format
-msgid "Warning: This group contains %s member from an insecure network."
-msgid_plural ""
-"Warning: This group contains %s members from an insecure network."
-msgstr[0] "Attenzione: questo gruppo contiene %s membro da un network insicuro."
-msgstr[1] "Attenzione: questo gruppo contiene %s membri da un network insicuro."
-
-#: ../../mod/network.php:391
-msgid "Private messages to this group are at risk of public disclosure."
-msgstr "I messaggi privati su questo gruppo potrebbero risultare visibili anche pubblicamente."
-
-#: ../../mod/network.php:461
-msgid "Contact: "
-msgstr "Contatto:"
-
-#: ../../mod/network.php:463
-msgid "Private messages to this person are at risk of public disclosure."
-msgstr "I messaggi privati a questa persona potrebbero risultare visibili anche pubblicamente."
-
-#: ../../mod/network.php:468
-msgid "Invalid contact."
-msgstr "Contatto non valido."
-
-#: ../../mod/notes.php:44 ../../boot.php:1696
-msgid "Personal Notes"
-msgstr "Note personali"
-
-#: ../../mod/notes.php:63 ../../mod/filer.php:30
-#: ../../addon/facebook/facebook.php:770
-#: ../../addon/privacy_image_cache/privacy_image_cache.php:263
-#: ../../addon/fbpost/fbpost.php:267
-#: ../../addon/dav/friendica/layout.fnk.php:441
-#: ../../addon/dav/friendica/layout.fnk.php:488 ../../include/text.php:681
-msgid "Save"
-msgstr "Salva"
+msgid "%1$s, you've received a friend suggestion from '%2$s' at %3$s"
+msgstr "%1$s, ti è stato suggerito un amico da '%2$s' alle %3$s"
-#: ../../mod/wallmessage.php:42 ../../mod/wallmessage.php:112
+#: ../../include/enotify.php:272
#, php-format
-msgid "Number of daily wall messages for %s exceeded. Message failed."
-msgstr "Numero giornaliero di messaggi per %s superato. Invio fallito."
+msgid ""
+"%1$s, you've received [zrl=%2$s]a friend suggestion[/zrl] for %3$s from "
+"%4$s."
+msgstr "%1$s, %4$s ti [zrl=%2$s]ha suggerito %3$s[/zrl] come amico."
-#: ../../mod/wallmessage.php:56 ../../mod/message.php:59
-msgid "No recipient selected."
-msgstr "Nessun destinatario selezionato."
+#: ../../include/enotify.php:278
+msgid "Name:"
+msgstr "Nome:"
-#: ../../mod/wallmessage.php:59
-msgid "Unable to check your home location."
-msgstr ""
+#: ../../include/enotify.php:279
+msgid "Photo:"
+msgstr "Foto:"
-#: ../../mod/wallmessage.php:62 ../../mod/message.php:66
-msgid "Message could not be sent."
-msgstr "Il messaggio non puo' essere inviato."
+#: ../../include/enotify.php:282
+#, php-format
+msgid "Please visit %s to approve or reject the suggestion."
+msgstr "Visita %s per approvare o rifiutare il suggerimento."
-#: ../../mod/wallmessage.php:65 ../../mod/message.php:69
-msgid "Message collection failure."
-msgstr "Errore recuperando il messaggio."
+#: ../../include/auth.php:69
+msgid "Logged out."
+msgstr "Uscita effettuata."
-#: ../../mod/wallmessage.php:68 ../../mod/message.php:72
-msgid "Message sent."
-msgstr "Messaggio inviato."
+#: ../../include/auth.php:181
+msgid "Failed authentication"
+msgstr "Autenticazione fallita"
-#: ../../mod/wallmessage.php:86 ../../mod/wallmessage.php:95
-msgid "No recipient."
-msgstr "Nessun destinatario."
+#: ../../include/auth.php:190
+msgid "Login failed."
+msgstr "Accesso fallito."
-#: ../../mod/wallmessage.php:123 ../../mod/wallmessage.php:131
-#: ../../mod/message.php:242 ../../mod/message.php:250
-#: ../../include/conversation.php:833 ../../include/conversation.php:850
-msgid "Please enter a link URL:"
-msgstr "Inserisci l'indirizzo del link:"
+#: ../../include/contact_widgets.php:14
+#, php-format
+msgid "%d invitation available"
+msgid_plural "%d invitations available"
+msgstr[0] "%d invito disponibile"
+msgstr[1] "%d inviti disponibili"
-#: ../../mod/wallmessage.php:138 ../../mod/message.php:278
-msgid "Send Private Message"
-msgstr "Invia un messaggio privato"
+#: ../../include/contact_widgets.php:20
+msgid "Find Channels"
+msgstr "Ricerca canali"
-#: ../../mod/wallmessage.php:139
-#, php-format
-msgid ""
-"If you wish for %s to respond, please check that the privacy settings on "
-"your site allow private mail from unknown senders."
-msgstr "Se vuoi che %s ti risponda, controlla che le tue impostazioni di privacy permettano la ricezione di messaggi privati da mittenti sconosciuti."
+#: ../../include/contact_widgets.php:21
+msgid "Enter name or interest"
+msgstr "Scrivi un nome o un interesse"
-#: ../../mod/wallmessage.php:140 ../../mod/message.php:279
-#: ../../mod/message.php:469
-msgid "To:"
-msgstr "A:"
+#: ../../include/contact_widgets.php:22
+msgid "Connect/Follow"
+msgstr "Entra in contatto"
-#: ../../mod/wallmessage.php:141 ../../mod/message.php:284
-#: ../../mod/message.php:471
-msgid "Subject:"
-msgstr "Oggetto:"
+#: ../../include/contact_widgets.php:23
+msgid "Examples: Robert Morgenstein, Fishing"
+msgstr "Per esempio: Mario Rossi, Pesca"
-#: ../../mod/wallmessage.php:147 ../../mod/message.php:288
-#: ../../mod/message.php:474 ../../mod/invite.php:113
-msgid "Your message:"
-msgstr "Il tuo messaggio:"
+#: ../../include/contact_widgets.php:24 ../../mod/directory.php:205
+#: ../../mod/directory.php:210 ../../mod/connections.php:355
+msgid "Find"
+msgstr "Cerca"
-#: ../../mod/newmember.php:6
-msgid "Welcome to Friendica"
-msgstr "Benvenuto su Friendica"
+#: ../../include/contact_widgets.php:25 ../../mod/suggest.php:59
+msgid "Channel Suggestions"
+msgstr "Canali suggeriti"
-#: ../../mod/newmember.php:8
-msgid "New Member Checklist"
-msgstr "Cose da fare per i Nuovi Utenti"
+#: ../../include/contact_widgets.php:27
+msgid "Random Profile"
+msgstr "Profilo casuale"
-#: ../../mod/newmember.php:12
-msgid ""
-"We would like to offer some tips and links to help make your experience "
-"enjoyable. Click any item to visit the relevant page. A link to this page "
-"will be visible from your home page for two weeks after your initial "
-"registration and then will quietly disappear."
-msgstr "Vorremmo offrirti qualche trucco e dei link alla guida per aiutarti ad avere un'esperienza divertente. Clicca su un qualsiasi elemento per visitare la relativa pagina. Un link a questa pagina sarà visibile nella tua home per due settimane dopo la tua registrazione."
-
-#: ../../mod/newmember.php:14
-msgid "Getting Started"
-msgstr ""
+#: ../../include/contact_widgets.php:28
+msgid "Invite Friends"
+msgstr "Invita amici"
-#: ../../mod/newmember.php:18
-msgid "Friendica Walk-Through"
-msgstr ""
+#: ../../include/contact_widgets.php:120
+#, php-format
+msgid "%d connection in common"
+msgid_plural "%d connections in common"
+msgstr[0] "%d contatto in comune"
+msgstr[1] "%d contatti in comune"
-#: ../../mod/newmember.php:18
-msgid ""
-"On your <em>Quick Start</em> page - find a brief introduction to your "
-"profile and network tabs, make some new connections, and find some groups to"
-" join."
-msgstr ""
+#: ../../include/page_widgets.php:6
+msgid "New Page"
+msgstr "Nuova pagina web"
-#: ../../mod/newmember.php:26
-msgid "Go to Your Settings"
-msgstr ""
+#: ../../include/page_widgets.php:8 ../../include/ItemObject.php:96
+#: ../../mod/thing.php:229 ../../mod/webpages.php:118 ../../mod/menu.php:55
+#: ../../mod/layouts.php:102 ../../mod/filestorage.php:171
+#: ../../mod/settings.php:569 ../../mod/editlayout.php:101
+#: ../../mod/editpost.php:98 ../../mod/blocks.php:93
+#: ../../mod/editwebpage.php:144 ../../mod/editblock.php:115
+msgid "Edit"
+msgstr "Modifica"
-#: ../../mod/newmember.php:26
-msgid ""
-"On your <em>Settings</em> page - change your initial password. Also make a "
-"note of your Identity Address. This looks just like an email address - and "
-"will be useful in making friends on the free social web."
-msgstr "Nella tua pagina <em>Impostazioni</em> - cambia la tua password iniziale. Prendi anche nota del tuo Indirizzo Identità. Assomiglia a un indirizzo email e sarà utile per stringere amicizie nel web sociale libero."
+#: ../../include/plugin.php:475 ../../include/plugin.php:477
+msgid "Click here to upgrade."
+msgstr "Clicca qui per aggiornare."
-#: ../../mod/newmember.php:28
-msgid ""
-"Review the other settings, particularly the privacy settings. An unpublished"
-" directory listing is like having an unlisted phone number. In general, you "
-"should probably publish your listing - unless all of your friends and "
-"potential friends know exactly how to find you."
-msgstr "Guarda le altre impostazioni, in particolare le impostazioni della privacy. Un profilo non pubblicato è come un numero di telefono non in elenco. In genere, dovresti pubblicare il tuo profilo - a meno che tutti i tuoi amici e potenziali tali sappiano esattamente come trovarti."
-
-#: ../../mod/newmember.php:32 ../../mod/profperm.php:103
-#: ../../view/theme/diabook/theme.php:128 ../../include/profile_advanced.php:7
-#: ../../include/profile_advanced.php:84 ../../include/nav.php:50
-#: ../../boot.php:1672
-msgid "Profile"
-msgstr "Profilo"
+#: ../../include/plugin.php:483
+msgid "This action exceeds the limits set by your subscription plan."
+msgstr "Questa operazione esce dai termini del tuo abbonamento."
-#: ../../mod/newmember.php:36 ../../mod/profile_photo.php:244
-msgid "Upload Profile Photo"
-msgstr "Carica la foto del profilo"
+#: ../../include/plugin.php:488
+msgid "This action is not available under your subscription plan."
+msgstr "Questa operazione non è prevista dal tuo abbonamento."
-#: ../../mod/newmember.php:36
-msgid ""
-"Upload a profile photo if you have not done so already. Studies have shown "
-"that people with real photos of themselves are ten times more likely to make"
-" friends than people who do not."
-msgstr "Carica una foto del profilo se non l'hai ancora fatto. Studi hanno mostrato che persone che hanno vere foto di se stessi hanno dieci volte più probabilità di fare amicizie rispetto alle persone che non ce l'hanno."
+#: ../../include/follow.php:21
+msgid "Channel is blocked on this site."
+msgstr "Il canale è bloccato per questo sito."
-#: ../../mod/newmember.php:38
-msgid "Edit Your Profile"
-msgstr ""
+#: ../../include/follow.php:26
+msgid "Channel location missing."
+msgstr "Manca l'indirizzo del canale."
-#: ../../mod/newmember.php:38
-msgid ""
-"Edit your <strong>default</strong> profile to your liking. Review the "
-"settings for hiding your list of friends and hiding the profile from unknown"
-" visitors."
-msgstr "Modifica il tuo profilo <strong>predefinito</strong> a piacimento. Rivedi le impostazioni per nascondere la tua lista di amici e nascondere il profilo ai visitatori sconosciuti."
+#: ../../include/follow.php:43
+msgid "Channel discovery failed. Website may be down or misconfigured."
+msgstr "La ricerca del canale è fallita. Il sito potrebbe avere problemi o una configurazione sbagliata."
-#: ../../mod/newmember.php:40
-msgid "Profile Keywords"
-msgstr ""
+#: ../../include/follow.php:51
+msgid "Response from remote channel was not understood."
+msgstr "La risposta dal canale non è comprensibile."
-#: ../../mod/newmember.php:40
-msgid ""
-"Set some public keywords for your default profile which describe your "
-"interests. We may be able to find other people with similar interests and "
-"suggest friendships."
-msgstr "Inserisci qualche parola chiave pubblica nel tuo profilo predefinito che descriva i tuoi interessi. Potremmo essere in grado di trovare altre persone con interessi similari e suggerirti delle amicizie."
+#: ../../include/follow.php:58
+msgid "Response from remote channel was incomplete."
+msgstr "La risposta dal canale non è completa."
-#: ../../mod/newmember.php:44
-msgid "Connecting"
-msgstr ""
+#: ../../include/follow.php:129
+msgid "local account not found."
+msgstr "l'account locale non è stato trovato."
-#: ../../mod/newmember.php:49 ../../mod/newmember.php:51
-#: ../../addon/facebook/facebook.php:728 ../../addon/fbpost/fbpost.php:239
-#: ../../include/contact_selectors.php:81
-msgid "Facebook"
-msgstr "Facebook"
+#: ../../include/follow.php:138
+msgid "Cannot connect to yourself."
+msgstr "Non puoi connetterti a te stesso."
-#: ../../mod/newmember.php:49
-msgid ""
-"Authorise the Facebook Connector if you currently have a Facebook account "
-"and we will (optionally) import all your Facebook friends and conversations."
-msgstr "Autorizza il Facebook Connector se hai un account Facebook, e noi (opzionalmente) importeremo tuti i tuoi amici e le tue conversazioni da Facebook."
+#: ../../include/permissions.php:13
+msgid "Can view my \"public\" stream and posts"
+msgstr "Può vedere i miei contenuti \"pubblici\""
-#: ../../mod/newmember.php:51
-msgid ""
-"<em>If</em> this is your own personal server, installing the Facebook addon "
-"may ease your transition to the free social web."
-msgstr "<em>Se</em questo è il tuo server personale, installare il plugin per Facebook puo' aiutarti nella transizione verso il web sociale libero."
+#: ../../include/permissions.php:14
+msgid "Can view my \"public\" channel profile"
+msgstr "Può vedere il profilo del mio canale \"pubblico\""
-#: ../../mod/newmember.php:56
-msgid "Importing Emails"
-msgstr ""
+#: ../../include/permissions.php:15
+msgid "Can view my \"public\" photo albums"
+msgstr "Può vedere il mio album fotografico \"pubblico\""
-#: ../../mod/newmember.php:56
-msgid ""
-"Enter your email access information on your Connector Settings page if you "
-"wish to import and interact with friends or mailing lists from your email "
-"INBOX"
-msgstr "Inserisci i tuoi dati di accesso all'email nella tua pagina Impostazioni Connettori se vuoi importare e interagire con amici o mailing list dalla tua casella di posta in arrivo"
+#: ../../include/permissions.php:16
+msgid "Can view my \"public\" address book"
+msgstr "Può vedere il mio elenco contatti \"pubblico\""
-#: ../../mod/newmember.php:58
-msgid "Go to Your Contacts Page"
-msgstr ""
+#: ../../include/permissions.php:17
+msgid "Can view my \"public\" file storage"
+msgstr "Può vedere il mio archivio file \"pubblico\""
-#: ../../mod/newmember.php:58
-msgid ""
-"Your Contacts page is your gateway to managing friendships and connecting "
-"with friends on other networks. Typically you enter their address or site "
-"URL in the <em>Add New Contact</em> dialog."
-msgstr "La tua pagina Contatti è il mezzo per gestire le amicizie e collegarsi con amici su altre reti. Di solito, basta inserire l'indirizzo nel campo <em>Aggiungi Nuovo Contatto</em>"
+#: ../../include/permissions.php:18
+msgid "Can view my \"public\" pages"
+msgstr "Può vedere le mie pagine web \"pubbliche\""
-#: ../../mod/newmember.php:60
-msgid "Go to Your Site's Directory"
-msgstr ""
+#: ../../include/permissions.php:21
+msgid "Can send me their channel stream and posts"
+msgstr "È tra i canali che seguo"
-#: ../../mod/newmember.php:60
-msgid ""
-"The Directory page lets you find other people in this network or other "
-"federated sites. Look for a <em>Connect</em> or <em>Follow</em> link on "
-"their profile page. Provide your own Identity Address if requested."
-msgstr "La pagina Elenco ti permette di trovare altre persone in questa rete o in altri siti. Cerca un link <em>Connetti</em> o <em>Segui</em> nella loro pagina del profilo. Inserisci il tuo Indirizzo Identità, se richiesto."
+#: ../../include/permissions.php:22
+msgid "Can post on my channel page (\"wall\")"
+msgstr "Può scrivere sulla bacheca del mio canale"
-#: ../../mod/newmember.php:62
-msgid "Finding New People"
-msgstr ""
+#: ../../include/permissions.php:23
+msgid "Can comment on my posts"
+msgstr "Può commentare i miei articoli"
-#: ../../mod/newmember.php:62
-msgid ""
-"On the side panel of the Contacts page are several tools to find new "
-"friends. We can match people by interest, look up people by name or "
-"interest, and provide suggestions based on network relationships. On a brand"
-" new site, friend suggestions will usually begin to be populated within 24 "
-"hours."
-msgstr "Nel pannello laterale nella pagina \"Contatti\", ci sono diversi strumenti per trovare nuovi amici. Possiamo confrontare le persone per interessi, cercare le persone per nome e fornire suggerimenti basati sui tuoi contatti esistenti. Su un sito nuovo, i suggerimenti sono di solito presenti dopo 24 ore."
+#: ../../include/permissions.php:24
+msgid "Can send me private mail messages"
+msgstr "Può inviarmi messaggi privati"
-#: ../../mod/newmember.php:66 ../../include/group.php:239
-msgid "Groups"
-msgstr "Grouppi"
+#: ../../include/permissions.php:25
+msgid "Can post photos to my photo albums"
+msgstr "Può aggiungere foto ai miei album"
-#: ../../mod/newmember.php:70
-msgid "Group Your Contacts"
-msgstr ""
+#: ../../include/permissions.php:26
+msgid "Can forward to all my channel contacts via post @mentions"
+msgstr "Può inoltrare articoli a tutti i contatti del canale tramite una @menzione"
-#: ../../mod/newmember.php:70
-msgid ""
-"Once you have made some friends, organize them into private conversation "
-"groups from the sidebar of your Contacts page and then you can interact with"
-" each group privately on your Network page."
-msgstr "Quando avrai alcuni amici, organizzali in gruppi di conversazioni private dalla barra laterale della tua pagina Contatti. Potrai interagire privatamente con ogni gruppo nella tua pagina Rete"
+#: ../../include/permissions.php:26
+msgid "Advanced - useful for creating group forum channels"
+msgstr "Impostazione avanzata - utile per creare un canale-forum di discussione"
-#: ../../mod/newmember.php:73
-msgid "Why Aren't My Posts Public?"
-msgstr ""
+#: ../../include/permissions.php:27
+msgid "Can chat with me (when available)"
+msgstr "Può aprire una chat con me (se disponibile)"
-#: ../../mod/newmember.php:73
-msgid ""
-"Friendica respects your privacy. By default, your posts will only show up to"
-" people you've added as friends. For more information, see the help section "
-"from the link above."
-msgstr ""
+#: ../../include/permissions.php:27
+msgid "Requires compatible chat plugin"
+msgstr "Necessita di un plugin di chat compatibile"
-#: ../../mod/newmember.php:78
-msgid "Getting Help"
-msgstr ""
+#: ../../include/permissions.php:28
+msgid "Can write to my \"public\" file storage"
+msgstr "Può scrivere sul mio archivio di file \"pubblico\""
-#: ../../mod/newmember.php:82
-msgid "Go to the Help Section"
-msgstr ""
+#: ../../include/permissions.php:29
+msgid "Can edit my \"public\" pages"
+msgstr "Può modificare le mie pagine web \"pubbliche\""
-#: ../../mod/newmember.php:82
-msgid ""
-"Our <strong>help</strong> pages may be consulted for detail on other program"
-" features and resources."
-msgstr "Le nostre pagine della <strong>guida</strong> possono essere consultate per avere dettagli su altre caratteristiche del programma e altre risorse."
+#: ../../include/permissions.php:31
+msgid "Can source my \"public\" posts in derived channels"
+msgstr "Può aggiungere i miei post \"pubblici\" a un suo canale derivato"
-#: ../../mod/attach.php:8
-msgid "Item not available."
-msgstr "Oggetto non disponibile."
+#: ../../include/permissions.php:31
+msgid "Somewhat advanced - very useful in open communities"
+msgstr "Piuttosto avanzato - molto utile nelle comunità aperte"
-#: ../../mod/attach.php:20
-msgid "Item was not found."
-msgstr "Oggetto non trovato."
+#: ../../include/permissions.php:32
+msgid "Can administer my channel resources"
+msgstr "Può amministrare i contenuti del mio canale"
-#: ../../mod/group.php:29
-msgid "Group created."
-msgstr "Gruppo creato."
+#: ../../include/permissions.php:32
+msgid ""
+"Extremely advanced. Leave this alone unless you know what you are doing"
+msgstr "Impostazione pericolosa - lasciare il valore predefinito se non si è assolutamente sicuri"
-#: ../../mod/group.php:35
-msgid "Could not create group."
-msgstr "Impossibile creare il gruppo."
+#: ../../include/comanche.php:35 ../../view/theme/redbasic/php/config.php:62
+#: ../../view/theme/apw/php/config.php:176
+msgid "Default"
+msgstr "Predefinito"
-#: ../../mod/group.php:47 ../../mod/group.php:137
-msgid "Group not found."
-msgstr "Gruppo non trovato."
+#: ../../include/identity.php:29 ../../mod/item.php:1143
+msgid "Unable to obtain identity information from database"
+msgstr "Impossibile ottenere le informazioni di identificazione dal database"
-#: ../../mod/group.php:60
-msgid "Group name changed."
-msgstr "Il nome del gruppo è cambiato."
+#: ../../include/identity.php:62
+msgid "Empty name"
+msgstr "Nome vuoto"
-#: ../../mod/group.php:72 ../../mod/profperm.php:19 ../../index.php:316
-msgid "Permission denied"
-msgstr "Permesso negato"
+#: ../../include/identity.php:64
+msgid "Name too long"
+msgstr "Nome troppo lungo"
-#: ../../mod/group.php:90
-msgid "Create a group of contacts/friends."
-msgstr "Crea un gruppo di amici/contatti."
+#: ../../include/identity.php:143
+msgid "No account identifier"
+msgstr "Account senza identificativo"
-#: ../../mod/group.php:91 ../../mod/group.php:177
-msgid "Group Name: "
-msgstr "Nome del gruppo:"
+#: ../../include/identity.php:153
+msgid "Nickname is required."
+msgstr "Il nome dell'account è obbligatorio."
-#: ../../mod/group.php:110
-msgid "Group removed."
-msgstr "Gruppo rimosso."
+#: ../../include/identity.php:167
+msgid ""
+"Nickname has unsupported characters or is already being used on this site."
+msgstr "Il nome dell'account è già in uso oppure ha dei caratteri non supportati."
-#: ../../mod/group.php:112
-msgid "Unable to remove group."
-msgstr "Impossibile rimuovere il gruppo."
+#: ../../include/identity.php:226
+msgid "Unable to retrieve created identity"
+msgstr "Impossibile caricare l'identità creata"
-#: ../../mod/group.php:176
-msgid "Group Editor"
-msgstr "Modifica gruppo"
+#: ../../include/identity.php:285
+msgid "Default Profile"
+msgstr "Profilo predefinito"
-#: ../../mod/group.php:189
-msgid "Members"
-msgstr "Membri"
+#: ../../include/identity.php:477
+msgid "Requested channel is not available."
+msgstr "Il canale che cerchi non è disponibile."
-#: ../../mod/group.php:221 ../../mod/profperm.php:105
-msgid "Click on a contact to add or remove."
-msgstr "Clicca su un contatto per aggiungerlo o rimuoverlo."
+#: ../../include/identity.php:489
+msgid " Sorry, you don't have the permission to view this profile. "
+msgstr "Purtroppo non hai il permesso di vedere questo profilo."
-#: ../../mod/profperm.php:25 ../../mod/profperm.php:55
-msgid "Invalid profile identifier."
-msgstr "Indentificativo del profilo non valido."
+#: ../../include/identity.php:524 ../../mod/webpages.php:8
+#: ../../mod/connect.php:13 ../../mod/layouts.php:8
+#: ../../mod/achievements.php:8 ../../mod/filestorage.php:40
+#: ../../mod/blocks.php:10 ../../mod/profile.php:16
+msgid "Requested profile is not available."
+msgstr "Il profilo richiesto non è disponibile."
-#: ../../mod/profperm.php:101
-msgid "Profile Visibility Editor"
-msgstr "Modifica visibilità del profilo"
+#: ../../include/identity.php:639 ../../mod/profiles.php:615
+msgid "Change profile photo"
+msgstr "Cambia la foto del profilo"
-#: ../../mod/profperm.php:114
-msgid "Visible To"
-msgstr "Visibile a"
+#: ../../include/identity.php:645
+msgid "Profiles"
+msgstr "Profili"
-#: ../../mod/profperm.php:130
-msgid "All Contacts (with secure profile access)"
-msgstr "Tutti i contatti (con profilo ad accesso sicuro)"
+#: ../../include/identity.php:645
+msgid "Manage/edit profiles"
+msgstr "Gestisci/modifica i profili"
-#: ../../mod/viewconnections.php:39
-msgid "No contacts."
-msgstr "Nessun contatto."
+#: ../../include/identity.php:646 ../../mod/profiles.php:616
+msgid "Create New Profile"
+msgstr "Crea un nuovo profilo"
-#: ../../mod/viewconnections.php:76 ../../include/text.php:618
-msgid "View Contacts"
-msgstr "Visualizza i contatti"
+#: ../../include/identity.php:649
+msgid "Edit Profile"
+msgstr "Modifica il profilo"
-#: ../../mod/register.php:88 ../../mod/regmod.php:52
-#, php-format
-msgid "Registration details for %s"
-msgstr "Dettagli della registrazione di %s"
+#: ../../include/identity.php:660 ../../mod/profiles.php:627
+msgid "Profile Image"
+msgstr "Immagine del profilo"
-#: ../../mod/register.php:96
-msgid ""
-"Registration successful. Please check your email for further instructions."
-msgstr "Registrazione completata. Controlla la tua mail per ulteriori informazioni."
+#: ../../include/identity.php:663 ../../mod/profiles.php:630
+msgid "visible to everybody"
+msgstr "visibile a tutti"
-#: ../../mod/register.php:100
-msgid "Failed to send email message. Here is the message that failed."
-msgstr "Errore nell'invio del messaggio email. Questo è il messaggio non inviato."
+#: ../../include/identity.php:664 ../../mod/profiles.php:631
+msgid "Edit visibility"
+msgstr "Cambia la visibilità"
-#: ../../mod/register.php:105
-msgid "Your registration can not be processed."
-msgstr "La tua registrazione non puo' essere elaborata."
+#: ../../include/identity.php:678 ../../include/identity.php:903
+#: ../../mod/directory.php:158
+msgid "Gender:"
+msgstr "Sesso:"
-#: ../../mod/register.php:142
-#, php-format
-msgid "Registration request at %s"
-msgstr "Richiesta di registrazione su %s"
+#: ../../include/identity.php:679 ../../include/identity.php:923
+#: ../../mod/directory.php:160
+msgid "Status:"
+msgstr "Stato:"
-#: ../../mod/register.php:151
-msgid "Your registration is pending approval by the site owner."
-msgstr "La tua richiesta è in attesa di approvazione da parte del prorietario del sito."
+#: ../../include/identity.php:680 ../../include/identity.php:934
+#: ../../mod/directory.php:162
+msgid "Homepage:"
+msgstr "Home page:"
-#: ../../mod/register.php:189
-msgid ""
-"This site has exceeded the number of allowed daily account registrations. "
-"Please try again tomorrow."
-msgstr "Questo sito ha superato il numero di registrazioni giornaliere consentite. Prova di nuovo domani."
+#: ../../include/identity.php:747 ../../include/identity.php:827
+#: ../../mod/ping.php:230
+msgid "g A l F d"
+msgstr "g A l d F"
-#: ../../mod/register.php:217
-msgid ""
-"You may (optionally) fill in this form via OpenID by supplying your OpenID "
-"and clicking 'Register'."
-msgstr "Se vuoi, puoi riempire questo modulo tramite OpenID, inserendo il tuo OpenID e cliccando 'Registra'."
+#: ../../include/identity.php:748 ../../include/identity.php:828
+msgid "F d"
+msgstr "d F"
-#: ../../mod/register.php:218
-msgid ""
-"If you are not familiar with OpenID, please leave that field blank and fill "
-"in the rest of the items."
-msgstr "Se non hai familiarità con OpenID, lascia il campo vuoto e riempi il resto della maschera."
+#: ../../include/identity.php:793 ../../include/identity.php:868
+#: ../../mod/ping.php:252
+msgid "[today]"
+msgstr "[oggi]"
-#: ../../mod/register.php:219
-msgid "Your OpenID (optional): "
-msgstr "Il tuo OpenID (opzionale): "
+#: ../../include/identity.php:805
+msgid "Birthday Reminders"
+msgstr "Promemoria compleanni"
-#: ../../mod/register.php:233
-msgid "Include your profile in member directory?"
-msgstr "Includi il tuo profilo nell'elenco pubblico?"
+#: ../../include/identity.php:806
+msgid "Birthdays this week:"
+msgstr "Compleanni questa settimana:"
-#: ../../mod/register.php:255
-msgid "Membership on this site is by invitation only."
-msgstr "La registrazione su questo sito è solo su invito."
+#: ../../include/identity.php:861
+msgid "[No description]"
+msgstr "[Nessuna descrizione]"
-#: ../../mod/register.php:256
-msgid "Your invitation ID: "
-msgstr "L'ID del tuo invito:"
+#: ../../include/identity.php:879
+msgid "Event Reminders"
+msgstr "Promemoria"
-#: ../../mod/register.php:259 ../../mod/admin.php:444
-msgid "Registration"
-msgstr "Registrazione"
+#: ../../include/identity.php:880
+msgid "Events this week:"
+msgstr "Eventi di questa settimana:"
-#: ../../mod/register.php:267
-msgid "Your Full Name (e.g. Joe Smith): "
-msgstr "Il tuo nome completo (es. Mario Rossi): "
+#: ../../include/identity.php:893 ../../include/identity.php:975
+#: ../../mod/profperm.php:103
+msgid "Profile"
+msgstr "Profilo"
-#: ../../mod/register.php:268
-msgid "Your Email Address: "
-msgstr "Il tuo indirizzo email: "
+#: ../../include/identity.php:901 ../../mod/settings.php:911
+msgid "Full Name:"
+msgstr "Nome completo:"
-#: ../../mod/register.php:269
-msgid ""
-"Choose a profile nickname. This must begin with a text character. Your "
-"profile address on this site will then be "
-"'<strong>nickname@$sitename</strong>'."
-msgstr "Scegli un nome utente. Deve cominciare con una lettera. L'indirizzo del tuo profilo sarà '<strong>soprannome@$sitename</strong>'."
+#: ../../include/identity.php:908
+msgid "j F, Y"
+msgstr "j F Y"
-#: ../../mod/register.php:270
-msgid "Choose a nickname: "
-msgstr "Scegli un nome utente: "
+#: ../../include/identity.php:909
+msgid "j F"
+msgstr "j F"
-#: ../../mod/register.php:273 ../../include/nav.php:81 ../../boot.php:887
-msgid "Register"
-msgstr "Registrati"
-
-#: ../../mod/dirfind.php:26
-msgid "People Search"
-msgstr "Cerca persone"
-
-#: ../../mod/like.php:145 ../../mod/like.php:298 ../../mod/tagger.php:62
-#: ../../addon/facebook/facebook.php:1598
-#: ../../addon/communityhome/communityhome.php:158
-#: ../../addon/communityhome/communityhome.php:167
-#: ../../view/theme/diabook/theme.php:565
-#: ../../view/theme/diabook/theme.php:574 ../../include/diaspora.php:1824
-#: ../../include/conversation.php:120 ../../include/conversation.php:129
-#: ../../include/conversation.php:248 ../../include/conversation.php:257
-msgid "status"
-msgstr "stato"
+#: ../../include/identity.php:916
+msgid "Birthday:"
+msgstr "Compleanno:"
-#: ../../mod/like.php:162 ../../addon/facebook/facebook.php:1602
-#: ../../addon/communityhome/communityhome.php:172
-#: ../../view/theme/diabook/theme.php:579 ../../include/diaspora.php:1840
-#: ../../include/conversation.php:136
-#, php-format
-msgid "%1$s likes %2$s's %3$s"
-msgstr "A %1$s piace %3$s di %2$s"
+#: ../../include/identity.php:920
+msgid "Age:"
+msgstr "Età:"
-#: ../../mod/like.php:164 ../../include/conversation.php:139
+#: ../../include/identity.php:929
#, php-format
-msgid "%1$s doesn't like %2$s's %3$s"
-msgstr "A %1$s non piace %3$s di %2$s"
-
-#: ../../mod/notice.php:15 ../../mod/viewsrc.php:15 ../../mod/admin.php:159
-#: ../../mod/admin.php:734 ../../mod/admin.php:933 ../../mod/display.php:29
-#: ../../mod/display.php:145 ../../include/items.php:3779
-msgid "Item not found."
-msgstr "Elemento non trovato."
+msgid "for %1$d %2$s"
+msgstr "per %1$d %2$s"
-#: ../../mod/viewsrc.php:7
-msgid "Access denied."
-msgstr "Accesso negato."
+#: ../../include/identity.php:932 ../../mod/profiles.php:538
+msgid "Sexual Preference:"
+msgstr "Preferenze sessuali:"
-#: ../../mod/fbrowser.php:25 ../../view/theme/diabook/theme.php:130
-#: ../../include/nav.php:51 ../../boot.php:1679
-msgid "Photos"
-msgstr "Foto"
+#: ../../include/identity.php:936 ../../mod/profiles.php:540
+msgid "Hometown:"
+msgstr "Città dove vivo:"
-#: ../../mod/fbrowser.php:96
-msgid "Files"
-msgstr ""
+#: ../../include/identity.php:938
+msgid "Tags:"
+msgstr "Tag:"
-#: ../../mod/regmod.php:61
-msgid "Account approved."
-msgstr "Account approvato."
+#: ../../include/identity.php:940 ../../mod/profiles.php:541
+msgid "Political Views:"
+msgstr "Orientamento politico:"
-#: ../../mod/regmod.php:98
-#, php-format
-msgid "Registration revoked for %s"
-msgstr "Registrazione revocata per %s"
+#: ../../include/identity.php:942
+msgid "Religion:"
+msgstr "Religione:"
-#: ../../mod/regmod.php:110
-msgid "Please login."
-msgstr "Accedi."
+#: ../../include/identity.php:944 ../../mod/directory.php:164
+msgid "About:"
+msgstr "Informazioni:"
-#: ../../mod/item.php:91
-msgid "Unable to locate original post."
-msgstr "Impossibile trovare il messaggio originale."
+#: ../../include/identity.php:946
+msgid "Hobbies/Interests:"
+msgstr "Interessi e hobby:"
-#: ../../mod/item.php:275
-msgid "Empty post discarded."
-msgstr "Messaggio vuoto scartato."
+#: ../../include/identity.php:948 ../../mod/profiles.php:544
+msgid "Likes:"
+msgstr "Mi piace:"
-#: ../../mod/item.php:407 ../../mod/wall_upload.php:133
-#: ../../mod/wall_upload.php:142 ../../mod/wall_upload.php:149
-#: ../../include/message.php:144
-msgid "Wall Photos"
-msgstr "Foto della bacheca"
+#: ../../include/identity.php:950 ../../mod/profiles.php:545
+msgid "Dislikes:"
+msgstr "Non mi piace:"
-#: ../../mod/item.php:820
-msgid "System error. Post not saved."
-msgstr "Errore di sistema. Messaggio non salvato."
+#: ../../include/identity.php:953
+msgid "Contact information and Social Networks:"
+msgstr "Contatti e social network:"
-#: ../../mod/item.php:845
-#, php-format
-msgid ""
-"This message was sent to you by %s, a member of the Friendica social "
-"network."
-msgstr "Questo messaggio ti è stato inviato da %s, un membro del social network Friendica."
+#: ../../include/identity.php:955
+msgid "Musical interests:"
+msgstr "Gusti musicali:"
-#: ../../mod/item.php:847
-#, php-format
-msgid "You may visit them online at %s"
-msgstr "Puoi visitarli online su %s"
+#: ../../include/identity.php:957
+msgid "Books, literature:"
+msgstr "Libri, letteratura:"
-#: ../../mod/item.php:848
-msgid ""
-"Please contact the sender by replying to this post if you do not wish to "
-"receive these messages."
-msgstr "Contatta il mittente rispondendo a questo post se non vuoi ricevere questi messaggi."
+#: ../../include/identity.php:959
+msgid "Television:"
+msgstr "Televisione:"
-#: ../../mod/item.php:850
-#, php-format
-msgid "%s posted an update."
-msgstr "%s ha inviato un aggiornamento."
+#: ../../include/identity.php:961
+msgid "Film/dance/culture/entertainment:"
+msgstr "Film, danza, cultura, intrattenimento:"
-#: ../../mod/mood.php:62 ../../include/conversation.php:226
-#, php-format
-msgid "%1$s is currently %2$s"
-msgstr ""
+#: ../../include/identity.php:963
+msgid "Love/Romance:"
+msgstr "Amore:"
-#: ../../mod/mood.php:133
-msgid "Mood"
-msgstr ""
+#: ../../include/identity.php:965
+msgid "Work/employment:"
+msgstr "Lavoro:"
-#: ../../mod/mood.php:134
-msgid "Set your current mood and tell your friends"
-msgstr ""
+#: ../../include/identity.php:967
+msgid "School/education:"
+msgstr "Scuola:"
-#: ../../mod/profile_photo.php:44
-msgid "Image uploaded but image cropping failed."
-msgstr "L'immagine è stata caricata, ma il non è stato possibile ritagliarla."
+#: ../../include/items.php:201 ../../mod/like.php:55 ../../mod/group.php:68
+#: ../../mod/profperm.php:19 ../../index.php:343
+msgid "Permission denied"
+msgstr "Permesso negato"
-#: ../../mod/profile_photo.php:77 ../../mod/profile_photo.php:84
-#: ../../mod/profile_photo.php:91 ../../mod/profile_photo.php:308
-#, php-format
-msgid "Image size reduction [%s] failed."
-msgstr "Il ridimensionamento del'immagine [%s] è fallito."
+#: ../../include/items.php:3383 ../../mod/thing.php:74 ../../mod/admin.php:150
+#: ../../mod/admin.php:730 ../../mod/admin.php:933 ../../mod/viewsrc.php:18
+#: ../../mod/home.php:63 ../../mod/filestorage.php:18 ../../mod/display.php:32
+#: ../../mod/channel.php:182
+msgid "Item not found."
+msgstr "Elemento non trovato."
-#: ../../mod/profile_photo.php:118
-msgid ""
-"Shift-reload the page or clear browser cache if the new photo does not "
-"display immediately."
-msgstr "Ricarica la pagina con shift+F5 o cancella la cache del browser se la nuova foto non viene mostrata immediatamente."
+#: ../../include/items.php:3734 ../../mod/group.php:38 ../../mod/group.php:140
+msgid "Collection not found."
+msgstr "Insieme non trovato."
-#: ../../mod/profile_photo.php:128
-msgid "Unable to process image"
-msgstr "Impossibile elaborare l'immagine"
+#: ../../include/items.php:3749
+msgid "Collection is empty."
+msgstr "L'insieme di canali è vuoto."
-#: ../../mod/profile_photo.php:144 ../../mod/wall_upload.php:88
+#: ../../include/items.php:3756
#, php-format
-msgid "Image exceeds size limit of %d"
-msgstr "La dimensione dell'immagine supera il limite di %d"
-
-#: ../../mod/profile_photo.php:242
-msgid "Upload File:"
-msgstr "Carica un file:"
+msgid "Collection: %s"
+msgstr "Insieme: %s"
-#: ../../mod/profile_photo.php:243
-msgid "Select a profile:"
-msgstr ""
+#: ../../include/items.php:3767
+#, php-format
+msgid "Connection: %s"
+msgstr "Contatto: %s"
-#: ../../mod/profile_photo.php:245
-#: ../../addon/dav/friendica/layout.fnk.php:152
-msgid "Upload"
-msgstr "Carica"
+#: ../../include/items.php:3770
+msgid "Connection not found."
+msgstr "Contatto non trovato."
-#: ../../mod/profile_photo.php:248
-msgid "skip this step"
-msgstr "salta questo passaggio"
+#: ../../include/ItemObject.php:89 ../../mod/photos.php:972
+msgid "Private Message"
+msgstr "Messaggio privato"
-#: ../../mod/profile_photo.php:248
-msgid "select a photo from your photo albums"
-msgstr "seleziona una foto dai tuoi album"
+#: ../../include/ItemObject.php:118
+msgid "save to folder"
+msgstr "salva in una cartella"
-#: ../../mod/profile_photo.php:262
-msgid "Crop Image"
-msgstr "Ritaglia immagine"
+#: ../../include/ItemObject.php:146
+msgid "add star"
+msgstr "aggiungi ai preferiti"
-#: ../../mod/profile_photo.php:263
-msgid "Please adjust the image cropping for optimum viewing."
-msgstr "Ritaglia l'imagine per una visualizzazione migliore."
+#: ../../include/ItemObject.php:147
+msgid "remove star"
+msgstr "rimuovi dai preferiti"
-#: ../../mod/profile_photo.php:265
-msgid "Done Editing"
-msgstr "Finito"
+#: ../../include/ItemObject.php:148
+msgid "toggle star status"
+msgstr "Attiva/disattiva preferito"
-#: ../../mod/profile_photo.php:299
-msgid "Image uploaded successfully."
-msgstr "Immagine caricata con successo."
+#: ../../include/ItemObject.php:152
+msgid "starred"
+msgstr "preferito"
-#: ../../mod/hcard.php:10
-msgid "No profile"
-msgstr "Nessun profilo"
+#: ../../include/ItemObject.php:169
+msgid "add tag"
+msgstr "Aggiungi tag"
-#: ../../mod/removeme.php:45 ../../mod/removeme.php:48
-msgid "Remove My Account"
-msgstr "Rimuovi il mio account"
+#: ../../include/ItemObject.php:175 ../../mod/photos.php:1078
+msgid "I like this (toggle)"
+msgstr "Attiva/disattiva Mi piace"
-#: ../../mod/removeme.php:46
-msgid ""
-"This will completely remove your account. Once this has been done it is not "
-"recoverable."
-msgstr "Questo comando rimuoverà completamente il tuo account. Una volta rimosso non potrai più recuperarlo."
+#: ../../include/ItemObject.php:176 ../../mod/photos.php:1079
+msgid "I don't like this (toggle)"
+msgstr "Attiva/disattiva Non mi piace"
-#: ../../mod/removeme.php:47
-msgid "Please enter your password for verification:"
-msgstr "Inserisci la tua password per verifica:"
+#: ../../include/ItemObject.php:178
+msgid "Share this"
+msgstr "Condividi"
-#: ../../mod/message.php:9 ../../include/nav.php:131
-msgid "New Message"
-msgstr "Nuovo messaggio"
+#: ../../include/ItemObject.php:178
+msgid "share"
+msgstr "condividi"
-#: ../../mod/message.php:63
-msgid "Unable to locate contact information."
-msgstr "Impossibile trovare le informazioni del contatto."
+#: ../../include/ItemObject.php:202 ../../include/ItemObject.php:203
+#, php-format
+msgid "View %s's profile - %s"
+msgstr "Guarda il profilo di %s - %s"
-#: ../../mod/message.php:191
-msgid "Message deleted."
-msgstr "Messaggio eliminato."
+#: ../../include/ItemObject.php:204
+msgid "to"
+msgstr "a"
-#: ../../mod/message.php:221
-msgid "Conversation removed."
-msgstr "Conversazione rimossa."
+#: ../../include/ItemObject.php:205
+msgid "via"
+msgstr "via"
-#: ../../mod/message.php:327
-msgid "No messages."
-msgstr "Nessun messaggio."
+#: ../../include/ItemObject.php:206
+msgid "Wall-to-Wall"
+msgstr "Da bacheca a bacheca"
-#: ../../mod/message.php:334
-#, php-format
-msgid "Unknown sender - %s"
-msgstr "Mittente sconosciuto - %s"
+#: ../../include/ItemObject.php:207
+msgid "via Wall-To-Wall:"
+msgstr "da bacheca a bacheca:"
-#: ../../mod/message.php:337
+#: ../../include/ItemObject.php:221
#, php-format
-msgid "You and %s"
-msgstr "Tu e %s"
+msgid "Expires: %s"
+msgstr "Scadenza: %s"
-#: ../../mod/message.php:340
+#: ../../include/ItemObject.php:269
#, php-format
-msgid "%s and You"
-msgstr ""
-
-#: ../../mod/message.php:350 ../../mod/message.php:462
-msgid "Delete conversation"
-msgstr "Elimina la conversazione"
+msgid "%d comment"
+msgid_plural "%d comments"
+msgstr[0] "%d commento"
+msgstr[1] "%d commenti"
-#: ../../mod/message.php:353
-msgid "D, d M Y - g:i A"
-msgstr "D d M Y - G:i"
+#: ../../include/ItemObject.php:534 ../../mod/photos.php:1097
+#: ../../mod/photos.php:1184
+msgid "This is you"
+msgstr "Questo sei tu"
-#: ../../mod/message.php:356
-#, php-format
-msgid "%d message"
-msgid_plural "%d messages"
-msgstr[0] "%d messaggio"
-msgstr[1] "%d messaggi"
+#: ../../include/ItemObject.php:537 ../../mod/events.php:470
+#: ../../mod/thing.php:276 ../../mod/thing.php:318 ../../mod/invite.php:156
+#: ../../mod/connedit.php:434 ../../mod/setup.php:304 ../../mod/setup.php:347
+#: ../../mod/connect.php:92 ../../mod/sources.php:97 ../../mod/sources.php:131
+#: ../../mod/admin.php:420 ../../mod/admin.php:686 ../../mod/admin.php:826
+#: ../../mod/admin.php:1025 ../../mod/admin.php:1112 ../../mod/group.php:81
+#: ../../mod/photos.php:693 ../../mod/photos.php:798 ../../mod/photos.php:1060
+#: ../../mod/photos.php:1100 ../../mod/photos.php:1187
+#: ../../mod/profiles.php:518 ../../mod/filestorage.php:132
+#: ../../mod/import.php:387 ../../mod/settings.php:507
+#: ../../mod/settings.php:619 ../../mod/settings.php:647
+#: ../../mod/settings.php:671 ../../mod/settings.php:742
+#: ../../mod/settings.php:903 ../../mod/mail.php:223 ../../mod/mail.php:335
+#: ../../mod/poke.php:166 ../../mod/fsuggest.php:108 ../../mod/mood.php:142
+#: ../../view/theme/redbasic/php/config.php:85
+#: ../../view/theme/apw/php/config.php:231
+#: ../../view/theme/blogga/view/theme/blog/config.php:67
+#: ../../view/theme/blogga/php/config.php:67
+msgid "Submit"
+msgstr "Salva"
-#: ../../mod/message.php:391
-msgid "Message not available."
-msgstr "Messaggio non disponibile."
+#: ../../include/ItemObject.php:538
+msgid "Bold"
+msgstr "Grassetto"
-#: ../../mod/message.php:444
-msgid "Delete message"
-msgstr "Elimina il messaggio"
+#: ../../include/ItemObject.php:539
+msgid "Italic"
+msgstr "Corsivo"
-#: ../../mod/message.php:464
-msgid ""
-"No secure communications available. You <strong>may</strong> be able to "
-"respond from the sender's profile page."
-msgstr "Nessuna comunicazione sicura disponibile, <strong>Potresti</strong> essere in grado di rispondere dalla pagina del profilo del mittente."
+#: ../../include/ItemObject.php:540
+msgid "Underline"
+msgstr "Sottolineato"
-#: ../../mod/message.php:468
-msgid "Send Reply"
-msgstr "Invia la risposta"
+#: ../../include/ItemObject.php:541
+msgid "Quote"
+msgstr "Citazione"
-#: ../../mod/allfriends.php:34
-#, php-format
-msgid "Friends of %s"
-msgstr "Amici di %s"
+#: ../../include/ItemObject.php:542
+msgid "Code"
+msgstr "Codice"
-#: ../../mod/allfriends.php:40
-msgid "No friends to display."
-msgstr "Nessun amico da visualizzare."
+#: ../../include/ItemObject.php:543
+msgid "Image"
+msgstr "Immagine"
-#: ../../mod/admin.php:55
-msgid "Theme settings updated."
-msgstr ""
+#: ../../include/ItemObject.php:544
+msgid "Link"
+msgstr "Link"
-#: ../../mod/admin.php:96 ../../mod/admin.php:442
-msgid "Site"
-msgstr "Sito"
+#: ../../include/ItemObject.php:545
+msgid "Video"
+msgstr "Video"
-#: ../../mod/admin.php:97 ../../mod/admin.php:688 ../../mod/admin.php:701
-msgid "Users"
-msgstr "Utenti"
+#: ../../include/security.php:49
+msgid "Welcome "
+msgstr "Ciao"
-#: ../../mod/admin.php:98 ../../mod/admin.php:783 ../../mod/admin.php:825
-msgid "Plugins"
-msgstr "Plugin"
+#: ../../include/security.php:50
+msgid "Please upload a profile photo."
+msgstr "Carica una foto per il profilo!"
-#: ../../mod/admin.php:99 ../../mod/admin.php:988 ../../mod/admin.php:1024
-msgid "Themes"
-msgstr "Temi"
+#: ../../include/security.php:53
+msgid "Welcome back "
+msgstr "Ciao, è bello rivederti"
-#: ../../mod/admin.php:100
-msgid "DB updates"
-msgstr ""
+#: ../../include/security.php:360
+msgid ""
+"The form security token was not correct. This probably happened because the "
+"form has been opened for too long (>3 hours) before submitting it."
+msgstr "L'identificativo di sicurezza del modulo che hai riempito non è corretto. Probabilmente è accaduto perché la pagina è stata tenuta aperta troppo a lungo (ore?) prima di inviare il contenuto."
-#: ../../mod/admin.php:115 ../../mod/admin.php:122 ../../mod/admin.php:1111
-msgid "Logs"
-msgstr "Log"
+#: ../../include/zot.php:545
+msgid "Invalid data packet"
+msgstr "Dati non validi"
-#: ../../mod/admin.php:120 ../../include/nav.php:146
-msgid "Admin"
-msgstr "Amministrazione"
+#: ../../include/zot.php:555
+msgid "Unable to verify channel signature"
+msgstr "Impossibile verificare la firma elettronica del canale"
-#: ../../mod/admin.php:121
-msgid "Plugin Features"
-msgstr ""
+#: ../../include/zot.php:732
+#, php-format
+msgid "Unable to verify site signature for %s"
+msgstr "Impossibile verificare la firma elettronica del sito %s"
-#: ../../mod/admin.php:123
-msgid "User registrations waiting for confirmation"
-msgstr "Utenti registrati in attesa di conferma"
+#: ../../mod/common.php:10
+msgid "No channel."
+msgstr "Nessun canale."
-#: ../../mod/admin.php:183 ../../mod/admin.php:669
-msgid "Normal Account"
-msgstr "Account normale"
+#: ../../mod/common.php:39
+msgid "Common connections"
+msgstr "Contatti in comune"
-#: ../../mod/admin.php:184 ../../mod/admin.php:670
-msgid "Soapbox Account"
-msgstr "Account per comunicati e annunci"
+#: ../../mod/common.php:44
+msgid "No connections in common."
+msgstr "Nessun contatto in comune."
-#: ../../mod/admin.php:185 ../../mod/admin.php:671
-msgid "Community/Celebrity Account"
-msgstr "Account per celebrità o per comunità"
+#: ../../mod/events.php:72
+msgid "Event title and start time are required."
+msgstr "Sono necessari il titolo e l'ora d'inizio dell'evento."
-#: ../../mod/admin.php:186 ../../mod/admin.php:672
-msgid "Automatic Friend Account"
-msgstr "Account per amicizia automatizzato"
+#: ../../mod/events.php:287
+msgid "l, F j"
+msgstr "l j F"
-#: ../../mod/admin.php:187
-msgid "Blog Account"
-msgstr ""
+#: ../../mod/events.php:309
+msgid "Edit event"
+msgstr "Modifica l'evento"
-#: ../../mod/admin.php:188
-msgid "Private Forum"
-msgstr ""
+#: ../../mod/events.php:355
+msgid "Create New Event"
+msgstr "Crea un nuovo evento"
-#: ../../mod/admin.php:207
-msgid "Message queues"
-msgstr ""
+#: ../../mod/events.php:356
+msgid "Previous"
+msgstr "Precendente"
-#: ../../mod/admin.php:212 ../../mod/admin.php:441 ../../mod/admin.php:687
-#: ../../mod/admin.php:782 ../../mod/admin.php:824 ../../mod/admin.php:987
-#: ../../mod/admin.php:1023 ../../mod/admin.php:1110
-msgid "Administration"
-msgstr "Amministrazione"
+#: ../../mod/events.php:357 ../../mod/setup.php:258
+msgid "Next"
+msgstr "Successivo"
-#: ../../mod/admin.php:213
-msgid "Summary"
-msgstr "Sommario"
+#: ../../mod/events.php:429
+msgid "hour:minute"
+msgstr "ora:minuti"
-#: ../../mod/admin.php:215
-msgid "Registered users"
-msgstr "Utenti registrati"
+#: ../../mod/events.php:448
+msgid "Event details"
+msgstr "Dettagli evento"
-#: ../../mod/admin.php:217
-msgid "Pending registrations"
-msgstr "Registrazioni in attesa"
+#: ../../mod/events.php:449
+#, php-format
+msgid "Format is %s %s. Starting date and Title are required."
+msgstr "Il formato è %s %s. L'inizio e il titolo sono obbligatori."
-#: ../../mod/admin.php:218
-msgid "Version"
-msgstr "Versione"
+#: ../../mod/events.php:451
+msgid "Event Starts:"
+msgstr "Inizio:"
-#: ../../mod/admin.php:220
-msgid "Active plugins"
-msgstr "Plugin attivi"
+#: ../../mod/events.php:451 ../../mod/events.php:465
+msgid "Required"
+msgstr "Obbligatorio"
-#: ../../mod/admin.php:373
-msgid "Site settings updated."
-msgstr "Impostazioni del sito aggiornate."
+#: ../../mod/events.php:454
+msgid "Finish date/time is not known or not relevant"
+msgstr "La data/ora di fine non è rilevante"
-#: ../../mod/admin.php:428
-msgid "Closed"
-msgstr "Chiusa"
+#: ../../mod/events.php:456
+msgid "Event Finishes:"
+msgstr "Fine:"
-#: ../../mod/admin.php:429
-msgid "Requires approval"
-msgstr "Richiede l'approvazione"
+#: ../../mod/events.php:459
+msgid "Adjust for viewer timezone"
+msgstr "Adatta al fuso orario di chi legge"
-#: ../../mod/admin.php:430
-msgid "Open"
-msgstr "Aperta"
+#: ../../mod/events.php:461
+msgid "Description:"
+msgstr "Descrizione:"
-#: ../../mod/admin.php:434
-msgid "No SSL policy, links will track page SSL state"
-msgstr ""
+#: ../../mod/events.php:465
+msgid "Title:"
+msgstr "Titolo:"
-#: ../../mod/admin.php:435
-msgid "Force all links to use SSL"
-msgstr "Forza tutti i linki ad usare SSL"
+#: ../../mod/events.php:467
+msgid "Share this event"
+msgstr "Condividi questo evento"
-#: ../../mod/admin.php:436
-msgid "Self-signed certificate, use SSL for local links only (discouraged)"
-msgstr ""
+#: ../../mod/thing.php:94
+msgid "Thing updated"
+msgstr "L'oggetto è stato aggiornato"
-#: ../../mod/admin.php:445
-msgid "File upload"
-msgstr "Caricamento file"
+#: ../../mod/thing.php:153
+msgid "Object store: failed"
+msgstr "Impossibile memorizzare l'oggetto."
-#: ../../mod/admin.php:446
-msgid "Policies"
-msgstr "Politiche"
+#: ../../mod/thing.php:157
+msgid "Thing added"
+msgstr "L'oggetto è stato aggiunto"
-#: ../../mod/admin.php:447
-msgid "Advanced"
-msgstr "Avanzate"
+#: ../../mod/thing.php:175
+#, php-format
+msgid "OBJ: %1$s %2$s %3$s"
+msgstr "OBJ: %1$s %2$s %3$s"
-#: ../../mod/admin.php:451 ../../addon/statusnet/statusnet.php:567
-msgid "Site name"
-msgstr "Nome del sito"
+#: ../../mod/thing.php:228
+msgid "Show Thing"
+msgstr "Mostra l'oggetto"
-#: ../../mod/admin.php:452
-msgid "Banner/Logo"
-msgstr "Banner/Logo"
+#: ../../mod/thing.php:235
+msgid "item not found."
+msgstr "non trovato."
-#: ../../mod/admin.php:453
-msgid "System language"
-msgstr "Lingua di sistema"
+#: ../../mod/thing.php:263
+msgid "Edit Thing"
+msgstr "Modifica l'oggetto"
-#: ../../mod/admin.php:454
-msgid "System theme"
-msgstr "Tema di sistema"
+#: ../../mod/thing.php:265 ../../mod/thing.php:311
+msgid "Select a profile"
+msgstr "Scegli un profilo"
-#: ../../mod/admin.php:454
-msgid ""
-"Default system theme - may be over-ridden by user profiles - <a href='#' "
-"id='cnftheme'>change theme settings</a>"
-msgstr ""
+#: ../../mod/thing.php:267 ../../mod/thing.php:313
+msgid "Select a category of stuff. e.g. I ______ something"
+msgstr "Scegli come riferirsi all'oggetto. Esempio: Io _____ l'oggetto"
-#: ../../mod/admin.php:455
-msgid "Mobile system theme"
-msgstr ""
+#: ../../mod/thing.php:270 ../../mod/thing.php:315
+msgid "Name of thing e.g. something"
+msgstr "Nome dell'oggetto"
-#: ../../mod/admin.php:455
-msgid "Theme for mobile devices"
-msgstr ""
+#: ../../mod/thing.php:272 ../../mod/thing.php:316
+msgid "URL of thing (optional)"
+msgstr "Indirizzo web dell'oggetto"
-#: ../../mod/admin.php:456
-msgid "SSL link policy"
-msgstr ""
+#: ../../mod/thing.php:274 ../../mod/thing.php:317
+msgid "URL for photo of thing (optional)"
+msgstr "Indirizzo di un'immagine dell'oggetto (facoltativo)"
-#: ../../mod/admin.php:456
-msgid "Determines whether generated links should be forced to use SSL"
-msgstr ""
+#: ../../mod/thing.php:309
+msgid "Add Thing to your Profile"
+msgstr "Aggiungi l'oggetto al tuo profilo"
-#: ../../mod/admin.php:457
-msgid "Maximum image size"
-msgstr "Massima dimensione immagini"
+#: ../../mod/invite.php:25
+msgid "Total invitation limit exceeded."
+msgstr "Hai superato il numero massimo di inviti."
-#: ../../mod/admin.php:457
-msgid ""
-"Maximum size in bytes of uploaded images. Default is 0, which means no "
-"limits."
-msgstr "Massima dimensione in byte delle immagini caricate. Il default è 0, cioè nessun limite."
+#: ../../mod/invite.php:49
+#, php-format
+msgid "%s : Not a valid email address."
+msgstr "%s: non è un indirizzo email valido."
-#: ../../mod/admin.php:458
-msgid "Maximum image length"
-msgstr ""
+#: ../../mod/invite.php:76
+msgid "Please join us on Red"
+msgstr "Vieni con noi su Red"
-#: ../../mod/admin.php:458
-msgid ""
-"Maximum length in pixels of the longest side of uploaded images. Default is "
-"-1, which means no limits."
-msgstr ""
+#: ../../mod/invite.php:87
+msgid "Invitation limit exceeded. Please contact your site administrator."
+msgstr "Hai superato il numero massimo di inviti. Contatta l'amministratore se necessario."
-#: ../../mod/admin.php:459
-msgid "JPEG image quality"
-msgstr ""
+#: ../../mod/invite.php:92
+#, php-format
+msgid "%s : Message delivery failed."
+msgstr "%s: la consegna del messaggio è fallita."
-#: ../../mod/admin.php:459
-msgid ""
-"Uploaded JPEGS will be saved at this quality setting [0-100]. Default is "
-"100, which is full quality."
-msgstr ""
+#: ../../mod/invite.php:96
+#, php-format
+msgid "%d message sent."
+msgid_plural "%d messages sent."
+msgstr[0] "%d messaggio inviato."
+msgstr[1] "%d messaggi inviati."
-#: ../../mod/admin.php:461
-msgid "Register policy"
-msgstr "Politica di registrazione"
+#: ../../mod/invite.php:115
+msgid "You have no more invitations available"
+msgstr "Non hai altri inviti disponibili"
-#: ../../mod/admin.php:462
-msgid "Register text"
-msgstr "Testo registrazione"
+#: ../../mod/invite.php:141
+msgid "Send invitations"
+msgstr "Spedisci inviti"
-#: ../../mod/admin.php:462
-msgid "Will be displayed prominently on the registration page."
-msgstr "Sarà mostrato ben visibile nella pagina di registrazione."
+#: ../../mod/invite.php:142
+msgid "Enter email addresses, one per line:"
+msgstr "Inserisci gli indirizzi email, uno per riga:"
-#: ../../mod/admin.php:463
-msgid "Accounts abandoned after x days"
-msgstr "Account abbandonati dopo x giorni"
+#: ../../mod/invite.php:143 ../../mod/mail.php:216 ../../mod/mail.php:328
+msgid "Your message:"
+msgstr "Il tuo messaggio:"
-#: ../../mod/admin.php:463
+#: ../../mod/invite.php:144
msgid ""
-"Will not waste system resources polling external sites for abandonded "
-"accounts. Enter 0 for no time limit."
-msgstr "Non spreca risorse di sistema controllando siti esterni per gli account abbandonati. Immettere 0 per nessun limite di tempo."
-
-#: ../../mod/admin.php:464
-msgid "Allowed friend domains"
-msgstr "Domini amici consentiti"
+"You are cordially invited to join me and some other close friends on the Red"
+" Matrix - a revolutionary new decentralised communication and information "
+"tool."
+msgstr "Questo è un invito cordiale ad unirti a me e ad altri miei amici stretti su Red Matrix - uno nuovo strumento di comunicazione decentralizzato e rivoluzionario."
-#: ../../mod/admin.php:464
-msgid ""
-"Comma separated list of domains which are allowed to establish friendships "
-"with this site. Wildcards are accepted. Empty to allow any domains"
-msgstr "Elenco separato da virglola dei domini che possono stabilire amicizie con questo sito. Sono accettati caratteri jolly. Lascalo vuoto per accettare qualsiasi dominio."
+#: ../../mod/invite.php:146
+msgid "You will need to supply this invitation code: $invite_code"
+msgstr "Sarà necessario fornire questo codice invito: $invite_code"
-#: ../../mod/admin.php:465
-msgid "Allowed email domains"
-msgstr "Domini email consentiti"
+#: ../../mod/invite.php:147
+msgid "Please visit my channel at"
+msgstr "Puoi visitare il mio canale su"
-#: ../../mod/admin.php:465
+#: ../../mod/invite.php:151
msgid ""
-"Comma separated list of domains which are allowed in email addresses for "
-"registrations to this site. Wildcards are accepted. Empty to allow any "
-"domains"
-msgstr "Elenco separato da virgola dei domini permessi come indirizzi email in fase di registrazione a questo sito. Sono accettati caratteri jolly. Lascalo vuoto per accettare qualsiasi dominio."
+"Once you have registered (on ANY Red Matrix site - they are all inter-"
+"connected), please connect with my Red Matrix channel address:"
+msgstr "Una volta che avrai completato la registrazione (su QUALSIASI sito Red Matrix - sono tutti interconnessi), potrai connetterti al mio canale:"
-#: ../../mod/admin.php:466
-msgid "Block public"
-msgstr "Blocca pagine pubbliche"
+#: ../../mod/invite.php:153
+msgid "Click the [Register] link on the following page to join."
+msgstr "Fai clic su [Registrati] nella pagina seguente per iscriverti."
-#: ../../mod/admin.php:466
+#: ../../mod/invite.php:155
msgid ""
-"Check to block public access to all otherwise public personal pages on this "
-"site unless you are currently logged in."
-msgstr "Seleziona per bloccare l'accesso pubblico a tutte le pagine personali di questo sito, a meno di essere loggato."
+"For more information about the Red Matrix Project and why it has the "
+"potential to change the internet as we know it, please visit "
+"http://getzot.com"
+msgstr "Per saperne di più sul progetto Red Matrix e sul perché potrebbe cambiare internet per come la conosciamo, visita http://getzot.com"
-#: ../../mod/admin.php:467
-msgid "Force publish"
-msgstr "Forza publicazione"
+#: ../../mod/connedit.php:49 ../../mod/connections.php:37
+msgid "Could not access contact record."
+msgstr "Non è possibile accedere alle informazioni sul contatto."
-#: ../../mod/admin.php:467
-msgid ""
-"Check to force all profiles on this site to be listed in the site directory."
-msgstr "Seleziona per forzare tutti i profili di questo sito ad essere compresi nell'elenco di questo sito."
+#: ../../mod/connedit.php:63 ../../mod/connections.php:51
+msgid "Could not locate selected profile."
+msgstr "Non riesco a trovare il profilo selezionato."
-#: ../../mod/admin.php:468
-msgid "Global directory update URL"
-msgstr "URL aggiornamento Elenco Globale"
+#: ../../mod/connedit.php:104 ../../mod/connections.php:92
+msgid "Connection updated."
+msgstr "Contatto aggiornato."
-#: ../../mod/admin.php:468
-msgid ""
-"URL to update the global directory. If this is not set, the global directory"
-" is completely unavailable to the application."
-msgstr "URL dell'elenco globale. Se vuoto, l'elenco globale sarà completamente disabilitato."
+#: ../../mod/connedit.php:106 ../../mod/connections.php:94
+msgid "Failed to update connection record."
+msgstr "Impossibile aggiornare le informazioni del contatto."
-#: ../../mod/admin.php:469
-msgid "Allow threaded items"
-msgstr ""
+#: ../../mod/connedit.php:201
+msgid "Could not access address book record."
+msgstr "Impossibile accedere alle informazioni della rubrica."
-#: ../../mod/admin.php:469
-msgid "Allow infinite level threading for items on this site."
-msgstr ""
+#: ../../mod/connedit.php:215
+msgid "Refresh failed - channel is currently unavailable."
+msgstr "Il canale non è disponibile - impossibile aggiornare."
-#: ../../mod/admin.php:470
-msgid "Private posts by default for new users"
-msgstr ""
+#: ../../mod/connedit.php:222
+msgid "Channel has been unblocked"
+msgstr "Il canale è stato sbloccato"
-#: ../../mod/admin.php:470
-msgid ""
-"Set default post permissions for all new members to the default privacy "
-"group rather than public."
-msgstr ""
+#: ../../mod/connedit.php:223
+msgid "Channel has been blocked"
+msgstr "Il canale è stato bloccato"
-#: ../../mod/admin.php:472
-msgid "Block multiple registrations"
-msgstr "Blocca registrazioni multiple"
+#: ../../mod/connedit.php:227 ../../mod/connedit.php:239
+#: ../../mod/connedit.php:251 ../../mod/connedit.php:263
+#: ../../mod/connedit.php:278
+msgid "Unable to set address book parameters."
+msgstr "Impossibile impostare i parametri della rubrica."
-#: ../../mod/admin.php:472
-msgid "Disallow users to register additional accounts for use as pages."
-msgstr "Non permette all'utente di registrare account extra da usare come pagine."
+#: ../../mod/connedit.php:234
+msgid "Channel has been unignored"
+msgstr "Il canale non sarà più ignorato"
-#: ../../mod/admin.php:473
-msgid "OpenID support"
-msgstr "Supporto OpenID"
+#: ../../mod/connedit.php:235
+msgid "Channel has been ignored"
+msgstr "Il canale sarà ignorato"
-#: ../../mod/admin.php:473
-msgid "OpenID support for registration and logins."
-msgstr "Supporta OpenID per la registrazione e il login"
+#: ../../mod/connedit.php:246
+msgid "Channel has been unarchived"
+msgstr "Il canale non è più archiviato"
-#: ../../mod/admin.php:474
-msgid "Fullname check"
-msgstr "Controllo nome completo"
+#: ../../mod/connedit.php:247
+msgid "Channel has been archived"
+msgstr "Il canale è stato archiviato"
-#: ../../mod/admin.php:474
-msgid ""
-"Force users to register with a space between firstname and lastname in Full "
-"name, as an antispam measure"
-msgstr "Forza gli utenti a registrarsi con uno spazio tra il nome e il cognome in \"Nome completo\", come misura antispam"
+#: ../../mod/connedit.php:258
+msgid "Channel has been unhidden"
+msgstr "Il canale non è più nascosto"
-#: ../../mod/admin.php:475
-msgid "UTF-8 Regular expressions"
-msgstr "Espressioni regolari UTF-8"
+#: ../../mod/connedit.php:259
+msgid "Channel has been hidden"
+msgstr "Il canale è stato nascosto"
-#: ../../mod/admin.php:475
-msgid "Use PHP UTF8 regular expressions"
-msgstr "Usa le espressioni regolari PHP in UTF8"
+#: ../../mod/connedit.php:273
+msgid "Channel has been approved"
+msgstr "Il canale è stato approvato"
-#: ../../mod/admin.php:476
-msgid "Show Community Page"
-msgstr "Mostra pagina Comunità"
+#: ../../mod/connedit.php:274
+msgid "Channel has been unapproved"
+msgstr "Il canale non è più approvato"
-#: ../../mod/admin.php:476
-msgid ""
-"Display a Community page showing all recent public postings on this site."
-msgstr "Mostra una pagina Comunità con tutti i recenti messaggi pubblici su questo sito."
+#: ../../mod/connedit.php:292
+msgid "Contact has been removed."
+msgstr "Il contatto è stato rimosso."
-#: ../../mod/admin.php:477
-msgid "Enable OStatus support"
-msgstr "Abilita supporto OStatus"
+#: ../../mod/connedit.php:312
+#, php-format
+msgid "View %s's profile"
+msgstr "Guarda il profilo di %s"
-#: ../../mod/admin.php:477
-msgid ""
-"Provide built-in OStatus (identi.ca, status.net, etc.) compatibility. All "
-"communications in OStatus are public, so privacy warnings will be "
-"occasionally displayed."
-msgstr "Fornisce compatibiltà OStatuts (identi.ca, status.net, etc.). Tutte le comunicazioni in OStatus sono pubbliche, per cui avvisi di provacy verranno occasionalmente mostrati."
+#: ../../mod/connedit.php:316
+msgid "Refresh Permissions"
+msgstr "Aggiorna i permessi"
-#: ../../mod/admin.php:478
-msgid "Enable Diaspora support"
-msgstr "Abilita il supporto a Diaspora"
+#: ../../mod/connedit.php:319
+msgid "Fetch updated permissions"
+msgstr "Scarica i permessi aggiornati"
-#: ../../mod/admin.php:478
-msgid "Provide built-in Diaspora network compatibility."
-msgstr "Fornisce compatibilità con il network Diaspora."
+#: ../../mod/connedit.php:323
+msgid "Recent Activity"
+msgstr "Attività recenti"
-#: ../../mod/admin.php:479
-msgid "Only allow Friendica contacts"
-msgstr "Permetti solo contatti Friendica"
+#: ../../mod/connedit.php:326
+msgid "View recent posts and comments"
+msgstr "Leggi i post recenti e i commenti"
-#: ../../mod/admin.php:479
-msgid ""
-"All contacts must use Friendica protocols. All other built-in communication "
-"protocols disabled."
-msgstr "Tutti i contatti devono usare il protocollo di Friendica. Tutti gli altri protocolli sono disabilitati."
+#: ../../mod/connedit.php:330 ../../mod/connedit.php:472
+#: ../../mod/admin.php:695
+msgid "Unblock"
+msgstr "Sblocca"
-#: ../../mod/admin.php:480
-msgid "Verify SSL"
-msgstr "Verifica SSL"
+#: ../../mod/connedit.php:330 ../../mod/connedit.php:472
+#: ../../mod/admin.php:694
+msgid "Block"
+msgstr "Blocca"
-#: ../../mod/admin.php:480
-msgid ""
-"If you wish, you can turn on strict certificate checking. This will mean you"
-" cannot connect (at all) to self-signed SSL sites."
-msgstr "Se vuoi, puoi abilitare il controllo rigoroso dei certificati.Questo significa che non potrai collegarti (del tutto) con siti con certificati SSL auto-firmati."
+#: ../../mod/connedit.php:333
+msgid "Block or Unblock this connection"
+msgstr "Per bloccare o meno questo contatto"
-#: ../../mod/admin.php:481
-msgid "Proxy user"
-msgstr "Utente Proxy"
+#: ../../mod/connedit.php:337 ../../mod/connedit.php:473
+msgid "Unignore"
+msgstr "Non ignorare"
-#: ../../mod/admin.php:482
-msgid "Proxy URL"
-msgstr "URL Proxy"
+#: ../../mod/connedit.php:337 ../../mod/connedit.php:473
+#: ../../mod/notifications.php:51
+msgid "Ignore"
+msgstr "Ignora"
-#: ../../mod/admin.php:483
-msgid "Network timeout"
-msgstr "Timeout rete"
+#: ../../mod/connedit.php:340
+msgid "Ignore or Unignore this connection"
+msgstr "Per ignorare o meno questo contatto"
-#: ../../mod/admin.php:483
-msgid "Value is in seconds. Set to 0 for unlimited (not recommended)."
-msgstr "Valore in secondi. Imposta a 0 per illimitato (non raccomandato)."
+#: ../../mod/connedit.php:343
+msgid "Unarchive"
+msgstr "Non archiviare"
-#: ../../mod/admin.php:484
-msgid "Delivery interval"
-msgstr ""
+#: ../../mod/connedit.php:343
+msgid "Archive"
+msgstr "Archivia"
-#: ../../mod/admin.php:484
-msgid ""
-"Delay background delivery processes by this many seconds to reduce system "
-"load. Recommend: 4-5 for shared hosts, 2-3 for virtual private servers. 0-1 "
-"for large dedicated servers."
-msgstr ""
+#: ../../mod/connedit.php:346
+msgid "Archive or Unarchive this connection"
+msgstr "Per archiviare o meno questo contatto"
-#: ../../mod/admin.php:485
-msgid "Poll interval"
-msgstr ""
+#: ../../mod/connedit.php:349
+msgid "Unhide"
+msgstr "Non nascondere"
-#: ../../mod/admin.php:485
-msgid ""
-"Delay background polling processes by this many seconds to reduce system "
-"load. If 0, use delivery interval."
-msgstr ""
+#: ../../mod/connedit.php:349
+msgid "Hide"
+msgstr "Nascondi"
-#: ../../mod/admin.php:486
-msgid "Maximum Load Average"
-msgstr ""
+#: ../../mod/connedit.php:352
+msgid "Hide or Unhide this connection"
+msgstr "Per nascondere o meno questo contatto"
-#: ../../mod/admin.php:486
-msgid ""
-"Maximum system load before delivery and poll processes are deferred - "
-"default 50."
-msgstr ""
+#: ../../mod/connedit.php:359
+msgid "Delete this connection"
+msgstr "Elimina questo contatto"
-#: ../../mod/admin.php:503
-msgid "Update has been marked successful"
-msgstr ""
+#: ../../mod/connedit.php:392
+msgid "Unknown"
+msgstr "Sconosciuto"
-#: ../../mod/admin.php:513
-#, php-format
-msgid "Executing %s failed. Check system logs."
-msgstr ""
+#: ../../mod/connedit.php:402 ../../mod/connedit.php:431
+msgid "Approve this connection"
+msgstr "Approva questo contatto"
-#: ../../mod/admin.php:516
-#, php-format
-msgid "Update %s was successfully applied."
-msgstr ""
+#: ../../mod/connedit.php:402
+msgid "Accept connection to allow communication"
+msgstr "Entra in contatto per poter comunicare"
-#: ../../mod/admin.php:520
-#, php-format
-msgid "Update %s did not return a status. Unknown if it succeeded."
-msgstr ""
+#: ../../mod/connedit.php:418
+msgid "Automatic Permissions Settings"
+msgstr "Permessi predefiniti"
-#: ../../mod/admin.php:523
+#: ../../mod/connedit.php:418
#, php-format
-msgid "Update function %s could not be found."
-msgstr ""
-
-#: ../../mod/admin.php:538
-msgid "No failed updates."
-msgstr ""
+msgid "Connections: settings for %s"
+msgstr "Contatti: impostazioni per %s"
-#: ../../mod/admin.php:542
-msgid "Failed Updates"
-msgstr ""
-
-#: ../../mod/admin.php:543
+#: ../../mod/connedit.php:422
msgid ""
-"This does not include updates prior to 1139, which did not return a status."
-msgstr ""
+"When receiving a channel introduction, any permissions provided here will be"
+" applied to the new connection automatically and the introduction approved. "
+"Leave this page if you do not wish to use this feature."
+msgstr "Hai ricevuto da un canale una richiesta di entrare in contatto, se prosegui la richiesta sarà approvata e saranno applicati i permessi mostrati. Lascia questa pagina se non vuoi proseguire."
-#: ../../mod/admin.php:544
-msgid "Mark success (if update was manually applied)"
-msgstr ""
+#: ../../mod/connedit.php:424
+msgid "Slide to adjust your degree of friendship"
+msgstr "Trascina per restringere il grado di amicizia da mostrare"
-#: ../../mod/admin.php:545
-msgid "Attempt to execute this update step automatically"
-msgstr ""
+#: ../../mod/connedit.php:430
+msgid "inherited"
+msgstr "derivato"
-#: ../../mod/admin.php:570
-#, php-format
-msgid "%s user blocked/unblocked"
-msgid_plural "%s users blocked/unblocked"
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../../mod/admin.php:577
-#, php-format
-msgid "%s user deleted"
-msgid_plural "%s users deleted"
-msgstr[0] "%s utente cancellato"
-msgstr[1] "%s utenti cancellati"
+#: ../../mod/connedit.php:432
+msgid "Connection has no individual permissions!"
+msgstr "Non hai assegnato permessi individuali a questo contatto!"
-#: ../../mod/admin.php:616
-#, php-format
-msgid "User '%s' deleted"
-msgstr "Utente '%s' cancellato"
+#: ../../mod/connedit.php:433
+msgid ""
+"This may be appropriate based on your <a href=\"settings\">privacy "
+"settings</a>, though you may wish to review the \"Advanced Permissions\"."
+msgstr "Questo corrisponde alle tue <a href='settings'>impostazioni di privacy</a>, ma puoi anche dare un'occhiata ai 'Permessi avanzati' per opzioni più dettagliate."
-#: ../../mod/admin.php:624
-#, php-format
-msgid "User '%s' unblocked"
-msgstr "Utente '%s' sbloccato"
+#: ../../mod/connedit.php:435
+msgid "Profile Visibility"
+msgstr "Visibilità del profilo"
-#: ../../mod/admin.php:624
+#: ../../mod/connedit.php:436
#, php-format
-msgid "User '%s' blocked"
-msgstr "Utente '%s' bloccato"
-
-#: ../../mod/admin.php:690
-msgid "select all"
-msgstr "seleziona tutti"
+msgid ""
+"Please choose the profile you would like to display to %s when viewing your "
+"profile securely."
+msgstr "Seleziona il profilo che vuoi mostrare a %s quando visita il tuo profilo in modo sicuro."
-#: ../../mod/admin.php:691
-msgid "User registrations waiting for confirm"
-msgstr "Richieste di registrazione in attesa di conferma"
+#: ../../mod/connedit.php:437
+msgid "Contact Information / Notes"
+msgstr "Informazioni e annotazioni sul contatto"
-#: ../../mod/admin.php:692
-msgid "Request date"
-msgstr "Data richiesta"
+#: ../../mod/connedit.php:438
+msgid "Edit contact notes"
+msgstr "Modifica le informazioni sul contatto"
-#: ../../mod/admin.php:692 ../../mod/admin.php:702
-#: ../../include/contact_selectors.php:79
-msgid "Email"
-msgstr "Email"
+#: ../../mod/connedit.php:440
+msgid "Their Settings"
+msgstr "Permessi concessi a te"
-#: ../../mod/admin.php:693
-msgid "No registrations."
-msgstr "Nessuna registrazione."
+#: ../../mod/connedit.php:441
+msgid "My Settings"
+msgstr "I permessi che concedo"
-#: ../../mod/admin.php:695
-msgid "Deny"
-msgstr "Nega"
+#: ../../mod/connedit.php:443
+msgid "Forum Members"
+msgstr "Membro di un forum"
-#: ../../mod/admin.php:699
-msgid "Site admin"
-msgstr ""
+#: ../../mod/connedit.php:444
+msgid "Soapbox"
+msgstr "Comunicati e annunci"
-#: ../../mod/admin.php:702
-msgid "Register date"
-msgstr "Data registrazione"
+#: ../../mod/connedit.php:445
+msgid "Full Sharing"
+msgstr "Condivisione totale"
-#: ../../mod/admin.php:702
-msgid "Last login"
-msgstr "Ultimo accesso"
+#: ../../mod/connedit.php:446
+msgid "Cautious Sharing"
+msgstr "Condivisione prudente"
-#: ../../mod/admin.php:702
-msgid "Last item"
-msgstr "Ultimo elemento"
+#: ../../mod/connedit.php:447
+msgid "Follow Only"
+msgstr "Follower"
-#: ../../mod/admin.php:702
-msgid "Account"
-msgstr "Account"
+#: ../../mod/connedit.php:448
+msgid "Individual Permissions"
+msgstr "Permessi individuali"
-#: ../../mod/admin.php:704
+#: ../../mod/connedit.php:449
msgid ""
-"Selected users will be deleted!\\n\\nEverything these users had posted on "
-"this site will be permanently deleted!\\n\\nAre you sure?"
-msgstr "Gli utenti selezionati saranno cancellati!\\n\\nTutto quello che gli utenti hanno inviato su questo sito sarà permanentemente canellato!\\n\\nSei sicuro?"
+"Some permissions may be inherited from your channel <a "
+"href=\"settings\">privacy settings</a>, which have higher priority. Changing"
+" those inherited settings on this page will have no effect."
+msgstr "Alcuni permessi derivano dalle <a href=\"settings\">impostazioni di privacy</a>, che hanno una priorità maggiore. Cambiarli in questa pagina non avrà alcun effetto."
-#: ../../mod/admin.php:705
-msgid ""
-"The user {0} will be deleted!\\n\\nEverything this user has posted on this "
-"site will be permanently deleted!\\n\\nAre you sure?"
-msgstr "L'utente {0} sarà cancellato!\\n\\nTutto quello che ha inviato su questo sito sarà permanentemente canellato!\\n\\nSei sicuro?"
+#: ../../mod/connedit.php:450
+msgid "Advanced Permissions"
+msgstr "Permessi avanzati"
-#: ../../mod/admin.php:746
-#, php-format
-msgid "Plugin %s disabled."
-msgstr "Plugin %s disabilitato."
+#: ../../mod/connedit.php:451
+msgid "Quick Links"
+msgstr "Impostazioni veloci"
-#: ../../mod/admin.php:750
+#: ../../mod/connedit.php:455
#, php-format
-msgid "Plugin %s enabled."
-msgstr "Plugin %s abilitato."
+msgid "Visit %s's profile - %s"
+msgstr "Guarda il profilo di %s - %s"
-#: ../../mod/admin.php:760 ../../mod/admin.php:958
-msgid "Disable"
-msgstr "Disabilita"
+#: ../../mod/connedit.php:456
+msgid "Block/Unblock contact"
+msgstr "Blocca/sblocca contatto"
-#: ../../mod/admin.php:762 ../../mod/admin.php:960
-msgid "Enable"
-msgstr "Abilita"
+#: ../../mod/connedit.php:457
+msgid "Ignore contact"
+msgstr "Ignora il contatto"
-#: ../../mod/admin.php:784 ../../mod/admin.php:989
-msgid "Toggle"
-msgstr "Inverti"
+#: ../../mod/connedit.php:458
+msgid "Repair URL settings"
+msgstr "Ripara le impostazioni URL"
-#: ../../mod/admin.php:792 ../../mod/admin.php:999
-msgid "Author: "
-msgstr "Autore: "
+#: ../../mod/connedit.php:459
+msgid "View conversations"
+msgstr "Leggi le conversazioni"
-#: ../../mod/admin.php:793 ../../mod/admin.php:1000
-msgid "Maintainer: "
-msgstr "Manutentore: "
+#: ../../mod/connedit.php:461
+msgid "Delete contact"
+msgstr "Elimina contatto"
-#: ../../mod/admin.php:922
-msgid "No themes found."
-msgstr "Nessun tema trovato."
+#: ../../mod/connedit.php:464
+msgid "Last update:"
+msgstr "Ultimo aggiornamento:"
-#: ../../mod/admin.php:981
-msgid "Screenshot"
-msgstr ""
+#: ../../mod/connedit.php:466
+msgid "Update public posts"
+msgstr "Aggiorna gli articoli pubblici"
-#: ../../mod/admin.php:1029
-msgid "[Experimental]"
-msgstr "[Sperimentale]"
+#: ../../mod/connedit.php:468
+msgid "Update now"
+msgstr "Aggiorna adesso"
-#: ../../mod/admin.php:1030
-msgid "[Unsupported]"
-msgstr "[Non supportato]"
+#: ../../mod/connedit.php:474
+msgid "Currently blocked"
+msgstr "Attualmente bloccato"
-#: ../../mod/admin.php:1057
-msgid "Log settings updated."
-msgstr "Impostazioni Log aggiornate."
+#: ../../mod/connedit.php:475
+msgid "Currently ignored"
+msgstr "Attualmente ignorato"
-#: ../../mod/admin.php:1113
-msgid "Clear"
-msgstr "Pulisci"
+#: ../../mod/connedit.php:476
+msgid "Currently archived"
+msgstr "Attualmente archiviato"
-#: ../../mod/admin.php:1119
-msgid "Debugging"
-msgstr "Debugging"
+#: ../../mod/connedit.php:477
+msgid "Currently pending"
+msgstr "Attualmente da approvare"
-#: ../../mod/admin.php:1120
-msgid "Log file"
-msgstr "File di Log"
+#: ../../mod/connedit.php:478
+msgid "Hide this contact from others"
+msgstr "Nascondi questo contatto agli altri"
-#: ../../mod/admin.php:1120
+#: ../../mod/connedit.php:478
msgid ""
-"Must be writable by web server. Relative to your Friendica top-level "
-"directory."
-msgstr "Deve essere scrivibile dal server web. Relativo alla tua directory Friendica."
-
-#: ../../mod/admin.php:1121
-msgid "Log level"
-msgstr "Livello di Log"
+"Replies/likes to your public posts <strong>may</strong> still be visible"
+msgstr "Le risposte ai tuoi articoli pubblici <strong>potrebbero</strong> restare comunque visibili"
-#: ../../mod/admin.php:1171
-msgid "Close"
-msgstr "Chiudi"
+#: ../../mod/webpages.php:121 ../../mod/layouts.php:105
+#: ../../mod/blocks.php:96
+msgid "View"
+msgstr "Guarda"
-#: ../../mod/admin.php:1177
-msgid "FTP Host"
-msgstr "Indirizzo FTP"
+#: ../../mod/api.php:76 ../../mod/api.php:102
+msgid "Authorize application connection"
+msgstr "Autorizza la app"
-#: ../../mod/admin.php:1178
-msgid "FTP Path"
-msgstr "Percorso FTP"
+#: ../../mod/api.php:77
+msgid "Return to your app and insert this Securty Code:"
+msgstr "Torna alla app e inserisci questo codice di sicurezza:"
-#: ../../mod/admin.php:1179
-msgid "FTP User"
-msgstr "Utente FTP"
+#: ../../mod/api.php:89
+msgid "Please login to continue."
+msgstr "Accedi al sito per continuare."
-#: ../../mod/admin.php:1180
-msgid "FTP Password"
-msgstr "Pasword FTP"
+#: ../../mod/api.php:104
+msgid ""
+"Do you want to authorize this application to access your posts and contacts,"
+" and/or create new posts for you?"
+msgstr "Vuoi autorizzare questa app ad accedere ai messaggi e ai contatti o creare nuovi messaggi per te?"
-#: ../../mod/profile.php:22 ../../boot.php:1074
-msgid "Requested profile is not available."
-msgstr "Profilo richiesto non disponibile."
+#: ../../mod/api.php:105 ../../mod/profiles.php:495 ../../mod/settings.php:865
+#: ../../mod/settings.php:870
+msgid "Yes"
+msgstr "Si"
-#: ../../mod/profile.php:152 ../../mod/display.php:77
-msgid "Access to this profile has been restricted."
-msgstr "L'accesso a questo profilo è stato limitato."
+#: ../../mod/api.php:106 ../../mod/profiles.php:496 ../../mod/settings.php:865
+#: ../../mod/settings.php:870
+msgid "No"
+msgstr "No"
-#: ../../mod/profile.php:177
-msgid "Tips for New Members"
-msgstr "Consigli per i Nuovi Utenti"
+#: ../../mod/apps.php:8
+msgid "No installed applications."
+msgstr "Nessuna app installata."
-#: ../../mod/ping.php:238
-msgid "{0} wants to be your friend"
-msgstr "{0} vuole essere tuo amico"
+#: ../../mod/apps.php:13
+msgid "Applications"
+msgstr "Applicazioni"
-#: ../../mod/ping.php:243
-msgid "{0} sent you a message"
-msgstr "{0} ti ha inviato un messaggio"
+#: ../../mod/page.php:35
+msgid "Invalid item."
+msgstr "Elemento non valido."
-#: ../../mod/ping.php:248
-msgid "{0} requested registration"
-msgstr "{0} chiede la registrazione"
+#: ../../mod/page.php:47 ../../mod/chanview.php:77 ../../mod/home.php:50
+#: ../../mod/wall_upload.php:35
+msgid "Channel not found."
+msgstr "Canale non trovato."
-#: ../../mod/ping.php:254
-#, php-format
-msgid "{0} commented %s's post"
-msgstr "{0} ha commentato il post di %s"
+#: ../../mod/page.php:83 ../../mod/help.php:71 ../../mod/display.php:100
+#: ../../index.php:227
+msgid "Page not found."
+msgstr "Pagina non trovata."
-#: ../../mod/ping.php:259
-#, php-format
-msgid "{0} liked %s's post"
-msgstr "a {0} piace il post di %s"
+#: ../../mod/attach.php:9
+msgid "Item not available."
+msgstr "Elemento non disponibile."
-#: ../../mod/ping.php:264
-#, php-format
-msgid "{0} disliked %s's post"
-msgstr "a {0} non piace il post di %s"
+#: ../../mod/setup.php:161
+msgid "Red Matrix Server - Setup"
+msgstr "Red Matrix Server - Installazione"
-#: ../../mod/ping.php:269
-#, php-format
-msgid "{0} is now friends with %s"
-msgstr "{0} ora è amico di %s"
+#: ../../mod/setup.php:167
+msgid "Could not connect to database."
+msgstr " Impossibile connettersi al database."
-#: ../../mod/ping.php:274
-msgid "{0} posted"
-msgstr "{0} ha inviato un nuovo messaggio"
+#: ../../mod/setup.php:171
+msgid ""
+"Could not connect to specified site URL. Possible SSL certificate or DNS "
+"issue."
+msgstr "Non è possibile raggiungere l'indirizzo del sito specificato. Potrebbe essere un problema di SSL o DNS."
-#: ../../mod/ping.php:279
-#, php-format
-msgid "{0} tagged %s's post with #%s"
-msgstr "{0} ha taggato il post di %s con #%s"
+#: ../../mod/setup.php:176
+msgid "Could not create table."
+msgstr "Impossibile creare le tabelle."
-#: ../../mod/ping.php:285
-msgid "{0} mentioned you in a post"
-msgstr "{0} ti ha citato in un post"
+#: ../../mod/setup.php:182
+msgid "Your site database has been installed."
+msgstr "Il database del sito è stato installato."
-#: ../../mod/nogroup.php:58
-msgid "Contacts who are not members of a group"
-msgstr ""
+#: ../../mod/setup.php:187
+msgid ""
+"You may need to import the file \"install/database.sql\" manually using "
+"phpmyadmin or mysql."
+msgstr "Potresti dover importare il file 'install/database.sql' manualmente usando phpmyadmin o mysql."
-#: ../../mod/openid.php:24
-msgid "OpenID protocol error. No ID returned."
-msgstr ""
+#: ../../mod/setup.php:188 ../../mod/setup.php:257 ../../mod/setup.php:606
+msgid "Please see the file \"install/INSTALL.txt\"."
+msgstr "Leggi il file 'install/INSTALL.txt'."
-#: ../../mod/openid.php:53
-msgid ""
-"Account not found and OpenID registration is not permitted on this site."
-msgstr ""
+#: ../../mod/setup.php:254
+msgid "System check"
+msgstr "Verifica del sistema"
-#: ../../mod/openid.php:93 ../../include/auth.php:98
-#: ../../include/auth.php:161
-msgid "Login failed."
-msgstr "Accesso fallito."
+#: ../../mod/setup.php:259
+msgid "Check again"
+msgstr "Verifica di nuovo"
-#: ../../mod/follow.php:27
-msgid "Contact added"
-msgstr ""
+#: ../../mod/setup.php:281
+msgid "Database connection"
+msgstr "Connessione al database"
-#: ../../mod/common.php:42
-msgid "Common Friends"
-msgstr "Amici in comune"
+#: ../../mod/setup.php:282
+msgid ""
+"In order to install Red Matrix we need to know how to connect to your "
+"database."
+msgstr "Per installare Red Matrix è necessario conoscere i parametri di connessione al database."
-#: ../../mod/common.php:78
-msgid "No contacts in common."
-msgstr ""
+#: ../../mod/setup.php:283
+msgid ""
+"Please contact your hosting provider or site administrator if you have "
+"questions about these settings."
+msgstr "Contatta il tuo fornitore di hosting o l'amministratore del sito se hai domande su queste impostazioni."
-#: ../../mod/share.php:28
-msgid "link"
-msgstr ""
+#: ../../mod/setup.php:284
+msgid ""
+"The database you specify below should already exist. If it does not, please "
+"create it before continuing."
+msgstr "Il database deve già esistere. Se non esiste, crealo prima di continuare."
-#: ../../mod/display.php:138
-msgid "Item has been removed."
-msgstr "L'oggetto è stato rimosso."
+#: ../../mod/setup.php:288
+msgid "Database Server Name"
+msgstr "Server del database"
-#: ../../mod/apps.php:4
-msgid "Applications"
-msgstr "Applicazioni"
+#: ../../mod/setup.php:288
+msgid "Default is localhost"
+msgstr "'localhost' è il predefinito"
-#: ../../mod/apps.php:7
-msgid "No installed applications."
-msgstr "Nessuna applicazione installata."
+#: ../../mod/setup.php:289
+msgid "Database Port"
+msgstr "Port del database"
-#: ../../mod/search.php:85 ../../include/text.php:678
-#: ../../include/text.php:679 ../../include/nav.php:91
-msgid "Search"
-msgstr "Cerca"
+#: ../../mod/setup.php:289
+msgid "Communication port number - use 0 for default"
+msgstr "Scrivi 0 per usare il valore standard"
-#: ../../mod/profiles.php:21 ../../mod/profiles.php:423
-#: ../../mod/profiles.php:537 ../../mod/dfrn_confirm.php:62
-msgid "Profile not found."
-msgstr "Profilo non trovato."
+#: ../../mod/setup.php:290
+msgid "Database Login Name"
+msgstr "Utente database"
-#: ../../mod/profiles.php:31
-msgid "Profile Name is required."
-msgstr "Il nome profilo è obbligatorio ."
+#: ../../mod/setup.php:291
+msgid "Database Login Password"
+msgstr "Password utente database"
-#: ../../mod/profiles.php:160
-msgid "Marital Status"
-msgstr ""
+#: ../../mod/setup.php:292
+msgid "Database Name"
+msgstr "Nome database"
-#: ../../mod/profiles.php:164
-msgid "Romantic Partner"
-msgstr ""
+#: ../../mod/setup.php:294 ../../mod/setup.php:336
+msgid "Site administrator email address"
+msgstr "Indirizzo email dell'amministratore del sito"
-#: ../../mod/profiles.php:168
-msgid "Likes"
-msgstr ""
+#: ../../mod/setup.php:294 ../../mod/setup.php:336
+msgid ""
+"Your account email address must match this in order to use the web admin "
+"panel."
+msgstr "Il tuo indirizzo email deve corrispondere a questo per poter usare il pannello di amministrazione web."
-#: ../../mod/profiles.php:172
-msgid "Dislikes"
-msgstr ""
+#: ../../mod/setup.php:295 ../../mod/setup.php:338
+msgid "Website URL"
+msgstr "URL completo del sito"
-#: ../../mod/profiles.php:176
-msgid "Work/Employment"
-msgstr ""
+#: ../../mod/setup.php:295 ../../mod/setup.php:338
+msgid "Please use SSL (https) URL if available."
+msgstr "Se disponibile, usa l'indirizzo SSL (https)."
-#: ../../mod/profiles.php:179
-msgid "Religion"
-msgstr "Religione"
+#: ../../mod/setup.php:298 ../../mod/setup.php:341
+msgid "Please select a default timezone for your website"
+msgstr "Seleziona il fuso orario predefinito per il tuo sito web"
-#: ../../mod/profiles.php:183
-msgid "Political Views"
-msgstr "Orientamento Politico"
+#: ../../mod/setup.php:325
+msgid "Site settings"
+msgstr "Impostazioni del sito"
-#: ../../mod/profiles.php:187
-msgid "Gender"
-msgstr "Sesso"
+#: ../../mod/setup.php:381
+msgid "Could not find a command line version of PHP in the web server PATH."
+msgstr "Non è possibile trovare la versione di PHP da riga di comando nel PATH del server web"
-#: ../../mod/profiles.php:191
-msgid "Sexual Preference"
-msgstr "Preferenza sessuale"
+#: ../../mod/setup.php:382
+msgid ""
+"If you don't have a command line version of PHP installed on server, you "
+"will not be able to run background polling via cron."
+msgstr "Se non hai installata la versione di PHP da riga di comando non potrai attivare il polling in background tramite cron."
-#: ../../mod/profiles.php:195
-msgid "Homepage"
-msgstr "Homepage"
+#: ../../mod/setup.php:386
+msgid "PHP executable path"
+msgstr "Path del comando PHP"
-#: ../../mod/profiles.php:199
-msgid "Interests"
-msgstr "Interessi"
+#: ../../mod/setup.php:386
+msgid ""
+"Enter full path to php executable. You can leave this blank to continue the "
+"installation."
+msgstr "Inserisci il percorso dell'eseguibile PHP. Puoi lasciarlo vuoto per continuare l'installazione."
-#: ../../mod/profiles.php:203
-msgid "Address"
-msgstr ""
+#: ../../mod/setup.php:391
+msgid "Command line PHP"
+msgstr "PHP da riga di comando"
-#: ../../mod/profiles.php:210 ../../addon/dav/common/wdcal_edit.inc.php:183
-msgid "Location"
-msgstr "Posizione"
+#: ../../mod/setup.php:400
+msgid ""
+"The command line version of PHP on your system does not have "
+"\"register_argc_argv\" enabled."
+msgstr "La versione da riga di comando di PHP nel sistema non ha abilitato \"register_argc_argv\"."
-#: ../../mod/profiles.php:293
-msgid "Profile updated."
-msgstr "Profilo aggiornato."
+#: ../../mod/setup.php:401
+msgid "This is required for message delivery to work."
+msgstr "E' necessario perché funzioni la consegna dei messaggi."
-#: ../../mod/profiles.php:360
-msgid " and "
-msgstr ""
+#: ../../mod/setup.php:403
+msgid "PHP register_argc_argv"
+msgstr "PHP register_argc_argv"
-#: ../../mod/profiles.php:368
-msgid "public profile"
-msgstr "profilo pubblico"
+#: ../../mod/setup.php:424
+msgid ""
+"Error: the \"openssl_pkey_new\" function on this system is not able to "
+"generate encryption keys"
+msgstr "Errore: la funzione \"openssl_pkey_new\" su questo sistema non è in grado di generare le chiavi di criptazione"
-#: ../../mod/profiles.php:371
-#, php-format
-msgid "%1$s changed %2$s to &ldquo;%3$s&rdquo;"
-msgstr ""
+#: ../../mod/setup.php:425
+msgid ""
+"If running under Windows, please see "
+"\"http://www.php.net/manual/en/openssl.installation.php\"."
+msgstr "Se stai usando un server windows, guarda \"http://www.php.net/manual/en/openssl.installation.php\"."
-#: ../../mod/profiles.php:372
-#, php-format
-msgid " - Visit %1$s's %2$s"
-msgstr ""
+#: ../../mod/setup.php:427
+msgid "Generate encryption keys"
+msgstr "Genera chiavi di criptazione"
-#: ../../mod/profiles.php:375
-#, php-format
-msgid "%1$s has an updated %2$s, changing %3$s."
-msgstr "%1$s ha un %2$s aggiornato. Ha cambiato %3$s"
+#: ../../mod/setup.php:434
+msgid "libCurl PHP module"
+msgstr "modulo PHP libCurl"
-#: ../../mod/profiles.php:442
-msgid "Profile deleted."
-msgstr "Profilo elminato."
+#: ../../mod/setup.php:435
+msgid "GD graphics PHP module"
+msgstr "modulo PHP GD graphics"
-#: ../../mod/profiles.php:460 ../../mod/profiles.php:494
-msgid "Profile-"
-msgstr "Profilo-"
+#: ../../mod/setup.php:436
+msgid "OpenSSL PHP module"
+msgstr "modulo PHP OpenSSL"
-#: ../../mod/profiles.php:479 ../../mod/profiles.php:521
-msgid "New profile created."
-msgstr "Il nuovo profilo è stato creato."
+#: ../../mod/setup.php:437
+msgid "mysqli PHP module"
+msgstr "modulo PHP mysqli"
-#: ../../mod/profiles.php:500
-msgid "Profile unavailable to clone."
-msgstr "Impossibile duplicare il profilo."
+#: ../../mod/setup.php:438
+msgid "mb_string PHP module"
+msgstr "modulo PHP mb_string"
-#: ../../mod/profiles.php:562
-msgid "Hide your contact/friend list from viewers of this profile?"
-msgstr "Nascondi la tua lista di contatti/amici ai visitatori di questo profilo?"
+#: ../../mod/setup.php:439
+msgid "mcrypt PHP module"
+msgstr "modulo PHP mcrypt"
-#: ../../mod/profiles.php:582
-msgid "Edit Profile Details"
-msgstr "Modifica i dettagli del profilo"
+#: ../../mod/setup.php:444 ../../mod/setup.php:446
+msgid "Apache mod_rewrite module"
+msgstr "modulo Apache mod_rewrite"
-#: ../../mod/profiles.php:584
-msgid "View this profile"
-msgstr "Visualizza questo profilo"
+#: ../../mod/setup.php:444
+msgid ""
+"Error: Apache webserver mod-rewrite module is required but not installed."
+msgstr "Errore: il modulo mod-rewrite di Apache è richiesto ma non installato"
-#: ../../mod/profiles.php:585
-msgid "Create a new profile using these settings"
-msgstr "Crea un nuovo profilo usando queste impostazioni"
+#: ../../mod/setup.php:450 ../../mod/setup.php:453
+msgid "proc_open"
+msgstr "proc_open"
-#: ../../mod/profiles.php:586
-msgid "Clone this profile"
-msgstr "Clona questo profilo"
+#: ../../mod/setup.php:450
+msgid ""
+"Error: proc_open is required but is either not installed or has been "
+"disabled in php.ini"
+msgstr "Errore: proc_open è richiesto ma non è installato o è disabilitato in php.ini"
-#: ../../mod/profiles.php:587
-msgid "Delete this profile"
-msgstr "Elimina questo profilo"
+#: ../../mod/setup.php:458
+msgid "Error: libCURL PHP module required but not installed."
+msgstr "Errore: il modulo libCURL di PHP è richiesto ma non installato."
-#: ../../mod/profiles.php:588
-msgid "Profile Name:"
-msgstr "Nome del profilo:"
+#: ../../mod/setup.php:462
+msgid ""
+"Error: GD graphics PHP module with JPEG support required but not installed."
+msgstr "Errore: Il modulo GD graphics di PHP con supporto a JPEG è richiesto ma non installato."
-#: ../../mod/profiles.php:589
-msgid "Your Full Name:"
-msgstr "Il tuo nome completo:"
+#: ../../mod/setup.php:466
+msgid "Error: openssl PHP module required but not installed."
+msgstr "Errore: il modulo openssl di PHP è richiesto ma non installato."
-#: ../../mod/profiles.php:590
-msgid "Title/Description:"
-msgstr "Breve descrizione (es. titolo, posizione, altro):"
+#: ../../mod/setup.php:470
+msgid "Error: mysqli PHP module required but not installed."
+msgstr "Errore: il modulo mysqli di PHP è richiesto ma non installato."
-#: ../../mod/profiles.php:591
-msgid "Your Gender:"
-msgstr "Il tuo sesso:"
+#: ../../mod/setup.php:474
+msgid "Error: mb_string PHP module required but not installed."
+msgstr "Errore: il modulo PHP mb_string è richiesto ma non installato."
-#: ../../mod/profiles.php:592
-#, php-format
-msgid "Birthday (%s):"
-msgstr "Compleanno (%s)"
+#: ../../mod/setup.php:478
+msgid "Error: mcrypt PHP module required but not installed."
+msgstr "Errore: il modulo PHP mcrypt è richiesto ma non installato."
-#: ../../mod/profiles.php:593
-msgid "Street Address:"
-msgstr "Indirizzo (via/piazza):"
+#: ../../mod/setup.php:494
+msgid ""
+"The web installer needs to be able to create a file called \".htconfig.php\""
+" in the top folder of your web server and it is unable to do so."
+msgstr "L'installazione web deve poter creare un file chiamato \".htconfig.php\" nella cartella principale del tuo web server ma non è in grado di farlo."
-#: ../../mod/profiles.php:594
-msgid "Locality/City:"
-msgstr "Località:"
+#: ../../mod/setup.php:495
+msgid ""
+"This is most often a permission setting, as the web server may not be able "
+"to write files in your folder - even if you can."
+msgstr "Spesso ciò è dovuto ai permessi di accesso al disco: il web server potrebbe non aver diritto di scrivere il file nella cartella, anche se tu puoi."
-#: ../../mod/profiles.php:595
-msgid "Postal/Zip Code:"
-msgstr "CAP:"
+#: ../../mod/setup.php:496
+msgid ""
+"At the end of this procedure, we will give you a text to save in a file "
+"named .htconfig.php in your Red top folder."
+msgstr "Alla fine di questa procedura ti sarà dato il testo da salvare in un file di nome .htconfig.php dentro la cartella principale di Red."
-#: ../../mod/profiles.php:596
-msgid "Country:"
-msgstr "Nazione:"
+#: ../../mod/setup.php:497
+msgid ""
+"You can alternatively skip this procedure and perform a manual installation."
+" Please see the file \"install/INSTALL.txt\" for instructions."
+msgstr "Puoi anche saltare questa procedura ed effettuare un'installazione manuale. Guarda il file 'install/INSTALL.txt' per le istruzioni."
-#: ../../mod/profiles.php:597
-msgid "Region/State:"
-msgstr "Regione/Stato:"
+#: ../../mod/setup.php:500
+msgid ".htconfig.php is writable"
+msgstr ".htconfig.php è scrivibile"
-#: ../../mod/profiles.php:598
-msgid "<span class=\"heart\">&hearts;</span> Marital Status:"
-msgstr "<span class=\"heart\">&hearts;</span> Stato sentimentale:"
+#: ../../mod/setup.php:510
+msgid ""
+"Red uses the Smarty3 template engine to render its web views. Smarty3 "
+"compiles templates to PHP to speed up rendering."
+msgstr "Red usa il sistema Smarty3 per costruire i suoi template grafici. Smarty3 è molto veloce perché compila i template delle pagine direttamente in PHP."
-#: ../../mod/profiles.php:599
-msgid "Who: (if applicable)"
-msgstr "Con chi: (se possibile)"
+#: ../../mod/setup.php:511
+msgid ""
+"In order to store these compiled templates, the web server needs to have "
+"write access to the directory view/tpl/smarty3/ under the Red top level "
+"folder."
+msgstr "Per poter memorizzare i template compilati, il web server deve avere accesso in scrittura alla cartella view/tpl/smarty3/ sotto la cartella di installazione di Red."
-#: ../../mod/profiles.php:600
-msgid "Examples: cathy123, Cathy Williams, cathy@example.com"
-msgstr "Esempio: cathy123, Cathy Williams, cathy@example.com"
+#: ../../mod/setup.php:512 ../../mod/setup.php:530
+msgid ""
+"Please ensure that the user that your web server runs as (e.g. www-data) has"
+" write access to this folder."
+msgstr "Assicurati che il tuo web server sia in esecuzione come un utente che ha diritto di scrittura su quella cartella (ad esempio www-data)."
-#: ../../mod/profiles.php:601
-msgid "Since [date]:"
-msgstr ""
+#: ../../mod/setup.php:513
+msgid ""
+"Note: as a security measure, you should give the web server write access to "
+"view/tpl/smarty3/ only--not the template files (.tpl) that it contains."
+msgstr "Nota bene: come precauzione, dovresti dare i diritti di scrittura solamente per view/tpl/smarty3/ non per tutti i file di template (.tpl) che contiene."
-#: ../../mod/profiles.php:602 ../../include/profile_advanced.php:46
-msgid "Sexual Preference:"
-msgstr "Preferenze sessuali:"
+#: ../../mod/setup.php:516
+msgid "view/tpl/smarty3 is writable"
+msgstr "view/tpl/smarty3 è scrivibile"
-#: ../../mod/profiles.php:603
-msgid "Homepage URL:"
-msgstr "Homepage:"
+#: ../../mod/setup.php:529
+msgid ""
+"Red uses the store directory to save uploaded files. The web server needs to"
+" have write access to the store directory under the Red top level folder"
+msgstr "Red usa un archivio per salvare i file caricati. Il server deve avere i diritti di scrittura sulla cartella dell'archivio che si trova dentro la cartella principale di Red"
-#: ../../mod/profiles.php:604 ../../include/profile_advanced.php:50
-msgid "Hometown:"
-msgstr ""
+#: ../../mod/setup.php:533
+msgid "store is writable"
+msgstr "l'archivio è scrivibile"
-#: ../../mod/profiles.php:605 ../../include/profile_advanced.php:54
-msgid "Political Views:"
-msgstr "Orientamento politico:"
+#: ../../mod/setup.php:548
+msgid "SSL certificate validation"
+msgstr "Validazione del certificato SSL"
-#: ../../mod/profiles.php:606
-msgid "Religious Views:"
-msgstr "Orientamento religioso:"
+#: ../../mod/setup.php:548
+msgid ""
+"SSL certificate cannot be validated. Fix certificate or disable https access"
+" to this site."
+msgstr "Il certificato SSL non può essere validato. Correggi l'errore o disabilita l'accesso https al sito."
-#: ../../mod/profiles.php:607
-msgid "Public Keywords:"
-msgstr "Parole chiave visibili a tutti:"
+#: ../../mod/setup.php:555
+msgid ""
+"Url rewrite in .htaccess is not working. Check your server configuration."
+msgstr "In .htaccess la funzionalità url rewrite non funziona. Controlla la configurazione del server."
-#: ../../mod/profiles.php:608
-msgid "Private Keywords:"
-msgstr "Parole chiave private:"
+#: ../../mod/setup.php:557
+msgid "Url rewrite is working"
+msgstr "Url rewrite funziona correttamente"
-#: ../../mod/profiles.php:609 ../../include/profile_advanced.php:62
-msgid "Likes:"
-msgstr ""
+#: ../../mod/setup.php:567
+msgid ""
+"The database configuration file \".htconfig.php\" could not be written. "
+"Please use the enclosed text to create a configuration file in your web "
+"server root."
+msgstr "Il file di configurazione del database \".htconfig.php\" non puo' essere scritto. Usa il testo qui di seguito per creare questo file di configurazione nella cartella principale del tuo sito."
-#: ../../mod/profiles.php:610 ../../include/profile_advanced.php:64
-msgid "Dislikes:"
-msgstr ""
+#: ../../mod/setup.php:591
+msgid "Errors encountered creating database tables."
+msgstr "La creazione delle tabelle del database ha generato errori."
-#: ../../mod/profiles.php:611
-msgid "Example: fishing photography software"
-msgstr "Esempio: pesca fotografia programmazione"
+#: ../../mod/setup.php:604
+msgid "<h1>What next</h1>"
+msgstr "<h1>I prossimi passi</h1>"
-#: ../../mod/profiles.php:612
-msgid "(Used for suggesting potential friends, can be seen by others)"
-msgstr "(E' utilizzato per suggerire potenziali amici, può essere visto da altri)"
+#: ../../mod/setup.php:605
+msgid ""
+"IMPORTANT: You will need to [manually] setup a scheduled task for the "
+"poller."
+msgstr "IMPORTANTE: Devi creare [manualmente] la pianificazione del polling."
-#: ../../mod/profiles.php:613
-msgid "(Used for searching profiles, never shown to others)"
-msgstr "(Usato per cercare tra i profili, non è mai visibile agli altri)"
+#: ../../mod/rpost.php:84 ../../mod/editpost.php:42
+msgid "Edit post"
+msgstr "Modifica articolo"
-#: ../../mod/profiles.php:614
-msgid "Tell us about yourself..."
-msgstr "Raccontaci di te..."
+#: ../../mod/subthread.php:105
+#, php-format
+msgid "%1$s is following %2$s's %3$s"
+msgstr "%1$s sta seguendo %3$s di %2$s"
-#: ../../mod/profiles.php:615
-msgid "Hobbies/Interests"
-msgstr "Hobby/interessi"
+#: ../../mod/update_network.php:23 ../../mod/update_channel.php:43
+#: ../../mod/update_search.php:46 ../../mod/update_display.php:25
+#: ../../mod/update_community.php:18
+msgid "[Embedded content - reload page to view]"
+msgstr "[Contenuto incorporato - ricarica la pagina per visualizzarlo correttamente]"
-#: ../../mod/profiles.php:616
-msgid "Contact information and Social Networks"
-msgstr "Informazioni su contatti e social network"
+#: ../../mod/chanview.php:97
+msgid "toggle full screen mode"
+msgstr "attiva/disattiva schermo intero"
-#: ../../mod/profiles.php:617
-msgid "Musical interests"
-msgstr "Interessi musicali"
+#: ../../mod/tagger.php:98
+#, php-format
+msgid "%1$s tagged %2$s's %3$s with %4$s"
+msgstr "%1$s ha taggato %3$s di %2$s con %4$s"
-#: ../../mod/profiles.php:618
-msgid "Books, literature"
-msgstr "Libri, letteratura"
+#: ../../mod/viewconnections.php:17 ../../mod/search.php:12
+#: ../../mod/photos.php:573 ../../mod/directory.php:15 ../../mod/display.php:9
+#: ../../mod/community.php:18 ../../mod/dirprofile.php:9
+msgid "Public access denied."
+msgstr "Accesso pubblico negato."
-#: ../../mod/profiles.php:619
-msgid "Television"
-msgstr "Televisione"
+#: ../../mod/viewconnections.php:43
+msgid "No connections."
+msgstr "Nessun contatto."
-#: ../../mod/profiles.php:620
-msgid "Film/dance/culture/entertainment"
-msgstr "Film/danza/cultura/intrattenimento"
+#: ../../mod/viewconnections.php:55
+#, php-format
+msgid "Visit %s's profile [%s]"
+msgstr "Visita il profilo di %s [%s]"
-#: ../../mod/profiles.php:621
-msgid "Love/romance"
-msgstr "Amore"
+#: ../../mod/viewconnections.php:70
+msgid "View Connnections"
+msgstr "Guarda i contatti"
-#: ../../mod/profiles.php:622
-msgid "Work/employment"
-msgstr "Lavoro/impiego"
+#: ../../mod/tagrm.php:41
+msgid "Tag removed"
+msgstr "Tag rimosso"
-#: ../../mod/profiles.php:623
-msgid "School/education"
-msgstr "Scuola/educazione"
+#: ../../mod/tagrm.php:79
+msgid "Remove Item Tag"
+msgstr "Rimuovi il tag"
-#: ../../mod/profiles.php:628
-msgid ""
-"This is your <strong>public</strong> profile.<br />It <strong>may</strong> "
-"be visible to anybody using the internet."
-msgstr "Questo è il tuo profilo <strong>publico</strong>.<br /><strong>Potrebbe</strong> essere visto da chiunque attraverso internet."
+#: ../../mod/tagrm.php:81
+msgid "Select a tag to remove: "
+msgstr "Seleziona un tag da rimuovere: "
-#: ../../mod/profiles.php:638 ../../mod/directory.php:111
-msgid "Age: "
-msgstr "Età : "
+#: ../../mod/tagrm.php:93 ../../mod/delegate.php:130
+msgid "Remove"
+msgstr "Rimuovi"
-#: ../../mod/profiles.php:677
-msgid "Edit/Manage Profiles"
-msgstr "Modifica / Gestisci profili"
+#: ../../mod/connect.php:55 ../../mod/connect.php:103
+msgid "Continue"
+msgstr "Continua"
-#: ../../mod/profiles.php:678 ../../boot.php:1192
-msgid "Change profile photo"
-msgstr "Cambia la foto del profilo"
+#: ../../mod/connect.php:84
+msgid "Premium Channel Setup"
+msgstr "Canale premium - installazione"
-#: ../../mod/profiles.php:679 ../../boot.php:1193
-msgid "Create New Profile"
-msgstr "Crea un nuovo profilo"
+#: ../../mod/connect.php:86
+msgid "Enable premium channel connection restrictions"
+msgstr "Abilita le restrizioni del canale premium"
-#: ../../mod/profiles.php:690 ../../boot.php:1203
-msgid "Profile Image"
-msgstr "Immagine del Profilo"
+#: ../../mod/connect.php:87
+msgid ""
+"Please enter your restrictions or conditions, such as paypal receipt, usage "
+"guidelines, etc."
+msgstr "Scrivi le condizioni d'uso e le restrizioni di questo canale, come per esempio le linee guida o il sistema di pagamento ecc."
-#: ../../mod/profiles.php:692 ../../boot.php:1206
-msgid "visible to everybody"
-msgstr "visibile a tutti"
+#: ../../mod/connect.php:89 ../../mod/connect.php:109
+msgid ""
+"This channel may require additional steps or acknowledgement of the "
+"following conditions prior to connecting:"
+msgstr "Prima di connetterti a questo canale è necessario che tu accetti le seguenti condizioni:"
-#: ../../mod/profiles.php:693 ../../boot.php:1207
-msgid "Edit visibility"
-msgstr "Modifica visibilità"
+#: ../../mod/connect.php:90
+msgid ""
+"Potential connections will then see the following text before proceeding:"
+msgstr "Il testo seguente comparirà a chi vorrà connettersi:"
-#: ../../mod/filer.php:29 ../../include/conversation.php:837
-#: ../../include/conversation.php:854
-msgid "Save to Folder:"
-msgstr ""
+#: ../../mod/connect.php:91 ../../mod/connect.php:112
+msgid ""
+"By continuing, I certify that I have complied with any instructions provided"
+" on this page."
+msgstr "Continuando dichiaro di aver seguito tutte le indicazioni e le istruzioni fornite in questa pagina."
-#: ../../mod/filer.php:29
-msgid "- select -"
-msgstr ""
+#: ../../mod/connect.php:100
+msgid "(No specific instructions have been provided by the channel owner.)"
+msgstr "(Il gestore del canale non ha fornito istruzioni specifiche)"
-#: ../../mod/tagger.php:95 ../../include/conversation.php:265
-#, php-format
-msgid "%1$s tagged %2$s's %3$s with %4$s"
-msgstr "%1$s ha taggato %3$s di %2$s con %4$s"
+#: ../../mod/connect.php:108
+msgid "Restricted or Premium Channel"
+msgstr "Canale premium - con restrizioni"
#: ../../mod/delegate.php:95
msgid "No potential page delegates located."
-msgstr "Nessun potenziale delegato per la pagina è stato trovato."
+msgstr "Impossibile trovare delegati per questa pagina."
#: ../../mod/delegate.php:121
msgid "Delegate Page Management"
@@ -4430,15 +4180,15 @@ msgstr "I Delegati sono in grando di gestire tutti gli aspetti di questa pagina,
#: ../../mod/delegate.php:124
msgid "Existing Page Managers"
-msgstr "Gestori Pagina Esistenti"
+msgstr "Gestori attuali della pagina"
#: ../../mod/delegate.php:126
msgid "Existing Page Delegates"
-msgstr "Delegati Pagina Esistenti"
+msgstr "Delegati attuali della pagina"
#: ../../mod/delegate.php:128
msgid "Potential Delegates"
-msgstr "Delegati Potenziali"
+msgstr "Delegati potenziali"
#: ../../mod/delegate.php:131
msgid "Add"
@@ -4446,4324 +4196,2933 @@ msgstr "Aggiungi"
#: ../../mod/delegate.php:132
msgid "No entries."
-msgstr "Nessun articolo."
-
-#: ../../mod/babel.php:17
-msgid "Source (bbcode) text:"
-msgstr ""
-
-#: ../../mod/babel.php:23
-msgid "Source (Diaspora) text to convert to BBcode:"
-msgstr ""
-
-#: ../../mod/babel.php:31
-msgid "Source input: "
-msgstr ""
+msgstr "Nessun risultato."
-#: ../../mod/babel.php:35
-msgid "bb2html: "
-msgstr ""
+#: ../../mod/sources.php:28
+msgid "Failed to create source. No channel selected."
+msgstr "Impossibile creare la sorgente. Nessun canale selezionato."
-#: ../../mod/babel.php:39
-msgid "bb2html2bb: "
-msgstr ""
+#: ../../mod/sources.php:41
+msgid "Source created."
+msgstr "Sorgente creata."
-#: ../../mod/babel.php:43
-msgid "bb2md: "
-msgstr ""
+#: ../../mod/sources.php:53
+msgid "Source updated."
+msgstr "Sorgente aggiornata."
-#: ../../mod/babel.php:47
-msgid "bb2md2html: "
-msgstr ""
+#: ../../mod/sources.php:82
+msgid "Manage remote sources of content for your channel."
+msgstr "Gestisci le sorgenti dei contenuti del tuo canale."
-#: ../../mod/babel.php:51
-msgid "bb2dia2bb: "
-msgstr ""
+#: ../../mod/sources.php:83 ../../mod/sources.php:93
+msgid "New Source"
+msgstr "Nuova sorgente"
-#: ../../mod/babel.php:55
-msgid "bb2md2html2bb: "
-msgstr ""
+#: ../../mod/sources.php:94 ../../mod/sources.php:126
+msgid ""
+"Import all or selected content from the following channel into this channel "
+"and distribute it according to your channel settings."
+msgstr "Importa nel tuo canale tutti o una parte dei contenuti dal canale seguente."
-#: ../../mod/babel.php:65
-msgid "Source input (Diaspora format): "
-msgstr ""
+#: ../../mod/sources.php:95 ../../mod/sources.php:127
+msgid "Only import content with these words (one per line)"
+msgstr "Importa solo i contenuti che hanno queste parole (una per riga)"
-#: ../../mod/babel.php:70
-msgid "diaspora2bb: "
-msgstr ""
+#: ../../mod/sources.php:95 ../../mod/sources.php:127
+msgid "Leave blank to import all public content"
+msgstr "Lascia vuoto per importare tutti i contenuti pubblici"
-#: ../../mod/suggest.php:38 ../../view/theme/diabook/theme.php:626
-#: ../../include/contact_widgets.php:34
-msgid "Friend Suggestions"
-msgstr "Contatti suggeriti"
+#: ../../mod/sources.php:96 ../../mod/sources.php:130
+#: ../../mod/new_channel.php:110
+msgid "Channel Name"
+msgstr "Nome del canale"
-#: ../../mod/suggest.php:44
-msgid ""
-"No suggestions available. If this is a new site, please try again in 24 "
-"hours."
-msgstr "Nessun suggerimento disponibile. Se questo è un sito nuovo, riprova tra 24 ore."
+#: ../../mod/sources.php:116 ../../mod/sources.php:143
+msgid "Source not found."
+msgstr "Sorgente non trovata."
-#: ../../mod/suggest.php:61
-msgid "Ignore/Hide"
-msgstr "Ignora / Nascondi"
+#: ../../mod/sources.php:123
+msgid "Edit Source"
+msgstr "Modifica la sorgente"
-#: ../../mod/directory.php:49 ../../view/theme/diabook/theme.php:624
-msgid "Global Directory"
-msgstr "Elenco globale"
+#: ../../mod/sources.php:124
+msgid "Delete Source"
+msgstr "Elimina la sorgente"
-#: ../../mod/directory.php:57
-msgid "Find on this site"
-msgstr "Cerca nel sito"
+#: ../../mod/sources.php:151
+msgid "Source removed"
+msgstr "Sorgente eliminata"
-#: ../../mod/directory.php:60
-msgid "Site Directory"
-msgstr "Elenco del sito"
+#: ../../mod/sources.php:153
+msgid "Unable to remove source."
+msgstr "Impossibile rimuovere la sorgente."
-#: ../../mod/directory.php:114
-msgid "Gender: "
-msgstr "Genere:"
+#: ../../mod/admin.php:48
+msgid "Theme settings updated."
+msgstr "Le impostazioni del tema sono state aggiornate."
-#: ../../mod/directory.php:136 ../../include/profile_advanced.php:17
-#: ../../boot.php:1228
-msgid "Gender:"
-msgstr "Genere:"
+#: ../../mod/admin.php:87 ../../mod/admin.php:419
+msgid "Site"
+msgstr "Sito"
-#: ../../mod/directory.php:138 ../../include/profile_advanced.php:37
-#: ../../boot.php:1231
-msgid "Status:"
-msgstr "Stato:"
+#: ../../mod/admin.php:88 ../../mod/admin.php:685 ../../mod/admin.php:697
+msgid "Users"
+msgstr "Utenti"
-#: ../../mod/directory.php:140 ../../include/profile_advanced.php:48
-#: ../../boot.php:1233
-msgid "Homepage:"
-msgstr "Homepage:"
+#: ../../mod/admin.php:89 ../../mod/admin.php:783 ../../mod/admin.php:825
+msgid "Plugins"
+msgstr "Plugin"
-#: ../../mod/directory.php:142 ../../include/profile_advanced.php:58
-msgid "About:"
-msgstr "Informazioni:"
+#: ../../mod/admin.php:90 ../../mod/admin.php:988 ../../mod/admin.php:1024
+msgid "Themes"
+msgstr "Temi"
-#: ../../mod/directory.php:180
-msgid "No entries (some entries may be hidden)."
-msgstr "Nessuna voce (qualche voce potrebbe essere nascosta)."
+#: ../../mod/admin.php:91 ../../mod/admin.php:478
+msgid "Server"
+msgstr "Server"
-#: ../../mod/invite.php:35
-#, php-format
-msgid "%s : Not a valid email address."
-msgstr "%s: non è un indirizzo email valido."
+#: ../../mod/admin.php:92
+msgid "DB updates"
+msgstr "Aggiornamenti al DB"
-#: ../../mod/invite.php:59
-msgid "Please join us on Friendica"
-msgstr ""
+#: ../../mod/admin.php:106 ../../mod/admin.php:113 ../../mod/admin.php:1111
+msgid "Logs"
+msgstr "Log"
-#: ../../mod/invite.php:69
-#, php-format
-msgid "%s : Message delivery failed."
-msgstr "%s: la consegna del messaggio fallita."
+#: ../../mod/admin.php:112
+msgid "Plugin Features"
+msgstr "Funzionalità dei componenti aggiuntivi"
-#: ../../mod/invite.php:73
-#, php-format
-msgid "%d message sent."
-msgid_plural "%d messages sent."
-msgstr[0] "%d messaggio inviato."
-msgstr[1] "%d messaggi inviati."
+#: ../../mod/admin.php:114
+msgid "User registrations waiting for confirmation"
+msgstr "Registrazioni in attesa"
-#: ../../mod/invite.php:92
-msgid "You have no more invitations available"
-msgstr "Non hai altri inviti disponibili"
+#: ../../mod/admin.php:188
+msgid "Message queues"
+msgstr "Messaggi in attesa di recapito"
-#: ../../mod/invite.php:100
-#, php-format
-msgid ""
-"Visit %s for a list of public sites that you can join. Friendica members on "
-"other sites can all connect with each other, as well as with members of many"
-" other social networks."
-msgstr ""
+#: ../../mod/admin.php:193 ../../mod/admin.php:418 ../../mod/admin.php:477
+#: ../../mod/admin.php:684 ../../mod/admin.php:782 ../../mod/admin.php:824
+#: ../../mod/admin.php:987 ../../mod/admin.php:1023 ../../mod/admin.php:1110
+msgid "Administration"
+msgstr "Amministrazione"
-#: ../../mod/invite.php:102
-#, php-format
-msgid ""
-"To accept this invitation, please visit and register at %s or any other "
-"public Friendica website."
-msgstr ""
+#: ../../mod/admin.php:194
+msgid "Summary"
+msgstr "Riepilogo"
-#: ../../mod/invite.php:103
-#, php-format
-msgid ""
-"Friendica sites all inter-connect to create a huge privacy-enhanced social "
-"web that is owned and controlled by its members. They can also connect with "
-"many traditional social networks. See %s for a list of alternate Friendica "
-"sites you can join."
-msgstr ""
+#: ../../mod/admin.php:196
+msgid "Registered users"
+msgstr "Utenti registrati"
-#: ../../mod/invite.php:106
-msgid ""
-"Our apologies. This system is not currently configured to connect with other"
-" public sites or invite members."
-msgstr ""
+#: ../../mod/admin.php:198 ../../mod/admin.php:481
+msgid "Pending registrations"
+msgstr "Registrazioni da approvare"
-#: ../../mod/invite.php:111
-msgid "Send invitations"
-msgstr "Invia inviti"
+#: ../../mod/admin.php:199
+msgid "Version"
+msgstr "Versione"
-#: ../../mod/invite.php:112
-msgid "Enter email addresses, one per line:"
-msgstr "Inserisci gli indirizzi email, uno per riga:"
+#: ../../mod/admin.php:201 ../../mod/admin.php:482
+msgid "Active plugins"
+msgstr "Plugin attivi"
-#: ../../mod/invite.php:114
-msgid ""
-"You are cordially invited to join me and other close friends on Friendica - "
-"and help us to create a better social web."
-msgstr ""
+#: ../../mod/admin.php:342
+msgid "Site settings updated."
+msgstr "Impostazioni del sito aggiornate."
-#: ../../mod/invite.php:116
-msgid "You will need to supply this invitation code: $invite_code"
-msgstr "Sarà necessario fornire questo codice invito: $invite_code"
+#: ../../mod/admin.php:371 ../../mod/settings.php:700
+msgid "No special theme for mobile devices"
+msgstr "Nessun tema per dispositivi mobili"
-#: ../../mod/invite.php:116
-msgid ""
-"Once you have registered, please connect with me via my profile page at:"
-msgstr "Una volta registrato, connettiti con me dal mio profilo:"
+#: ../../mod/admin.php:373
+msgid "No special theme for accessibility"
+msgstr "Nessun tema speciale per l'accessibilità"
-#: ../../mod/invite.php:118
-msgid ""
-"For more information about the Friendica project and why we feel it is "
-"important, please visit http://friendica.com"
-msgstr ""
+#: ../../mod/admin.php:398
+msgid "Closed"
+msgstr "Chiusa"
-#: ../../mod/dfrn_confirm.php:119
-msgid ""
-"This may occasionally happen if contact was requested by both persons and it"
-" has already been approved."
-msgstr ""
+#: ../../mod/admin.php:399
+msgid "Requires approval"
+msgstr "Richiede l'approvazione"
-#: ../../mod/dfrn_confirm.php:237
-msgid "Response from remote site was not understood."
-msgstr "Errore di comunicazione con l'altro sito."
+#: ../../mod/admin.php:400
+msgid "Open"
+msgstr "Aperta"
-#: ../../mod/dfrn_confirm.php:246
-msgid "Unexpected response from remote site: "
-msgstr "La risposta dell'altro sito non può essere gestita: "
+#: ../../mod/admin.php:405
+msgid "Private"
+msgstr "Privato"
-#: ../../mod/dfrn_confirm.php:254
-msgid "Confirmation completed successfully."
-msgstr "Conferma completata con successo."
+#: ../../mod/admin.php:406
+msgid "Paid Access"
+msgstr "Servizio a pagamento"
-#: ../../mod/dfrn_confirm.php:256 ../../mod/dfrn_confirm.php:270
-#: ../../mod/dfrn_confirm.php:277
-msgid "Remote site reported: "
-msgstr "Il sito remoto riporta: "
+#: ../../mod/admin.php:407
+msgid "Free Access"
+msgstr "Servizio gratuito"
-#: ../../mod/dfrn_confirm.php:268
-msgid "Temporary failure. Please wait and try again."
-msgstr "Problema temporaneo. Attendi e riprova."
+#: ../../mod/admin.php:408
+msgid "Tiered Access"
+msgstr "Accesso multilivello"
-#: ../../mod/dfrn_confirm.php:275
-msgid "Introduction failed or was revoked."
-msgstr "La presentazione ha generato un errore o è stata revocata."
+#: ../../mod/admin.php:421 ../../mod/register.php:189
+msgid "Registration"
+msgstr "Registrazione"
-#: ../../mod/dfrn_confirm.php:420
-msgid "Unable to set contact photo."
-msgstr "Impossibile impostare la foto del contatto."
+#: ../../mod/admin.php:422
+msgid "File upload"
+msgstr "Caricamento file"
-#: ../../mod/dfrn_confirm.php:477 ../../include/diaspora.php:608
-#: ../../include/conversation.php:171
-#, php-format
-msgid "%1$s is now friends with %2$s"
-msgstr "%1$s e %2$s adesso sono amici"
+#: ../../mod/admin.php:423
+msgid "Policies"
+msgstr "Politiche"
-#: ../../mod/dfrn_confirm.php:562
-#, php-format
-msgid "No user record found for '%s' "
-msgstr "Nessun utente trovato '%s'"
+#: ../../mod/admin.php:424
+msgid "Advanced"
+msgstr "Avanzate"
-#: ../../mod/dfrn_confirm.php:572
-msgid "Our site encryption key is apparently messed up."
-msgstr "La nostra chiave di criptazione del sito sembra essere corrotta."
+#: ../../mod/admin.php:428
+msgid "Site name"
+msgstr "Nome del sito"
-#: ../../mod/dfrn_confirm.php:583
-msgid "Empty site URL was provided or URL could not be decrypted by us."
-msgstr "E' stato fornito un indirizzo vuoto o non possiamo decrittare l'indirizzo."
+#: ../../mod/admin.php:429
+msgid "Banner/Logo"
+msgstr "Banner o logo"
-#: ../../mod/dfrn_confirm.php:604
-msgid "Contact record was not found for you on our site."
-msgstr "Il contatto non è stato trovato sul nostro sito."
+#: ../../mod/admin.php:430
+msgid "System language"
+msgstr "Lingua di sistema"
-#: ../../mod/dfrn_confirm.php:618
-#, php-format
-msgid "Site public key not available in contact record for URL %s."
-msgstr "La chiave pubblica del sito non è disponibile per l'URL %s"
+#: ../../mod/admin.php:431
+msgid "System theme"
+msgstr "Tema di sistema"
-#: ../../mod/dfrn_confirm.php:638
+#: ../../mod/admin.php:431
msgid ""
-"The ID provided by your system is a duplicate on our system. It should work "
-"if you try again."
-msgstr "L'ID fornito dal tuo sistema è duplicato sul nostro sistema. Se riprovi dovrebbe funzionare."
-
-#: ../../mod/dfrn_confirm.php:649
-msgid "Unable to set your contact credentials on our system."
-msgstr "Impossibile impostare le credenziali del tuo contatto sul nostro sistema."
+"Default system theme - may be over-ridden by user profiles - <a href='#' "
+"id='cnftheme'>change theme settings</a>"
+msgstr "Il tema di sistema può essere cambiato dai profili dei singoli utenti - <a href='#' id='cnftheme'>Cambia le impostazioni del tema</a>"
-#: ../../mod/dfrn_confirm.php:716
-msgid "Unable to update your contact profile details on our system"
-msgstr "Impossibile aggiornare i dettagli del tuo contatto sul nostro sistema"
+#: ../../mod/admin.php:432
+msgid "Mobile system theme"
+msgstr "Tema di sistema per dispositivi mobili"
-#: ../../mod/dfrn_confirm.php:750
-#, php-format
-msgid "Connection accepted at %s"
-msgstr "Connession accettata su %s"
+#: ../../mod/admin.php:432
+msgid "Theme for mobile devices"
+msgstr "Tema per i dispositivi mobili"
-#: ../../mod/dfrn_confirm.php:799
-#, php-format
-msgid "%1$s has joined %2$s"
-msgstr ""
+#: ../../mod/admin.php:433
+msgid "Accessibility system theme"
+msgstr "Tema di sistema ad alta accessibilità"
-#: ../../addon/fromgplus/fromgplus.php:29
-msgid "Google+ Import Settings"
-msgstr ""
+#: ../../mod/admin.php:433
+msgid "Accessibility theme"
+msgstr "Tema ad alta accessibilità"
-#: ../../addon/fromgplus/fromgplus.php:32
-msgid "Enable Google+ Import"
-msgstr ""
+#: ../../mod/admin.php:434
+msgid "Channel to use for this website's static pages"
+msgstr "Canale da usare per le pagine statiche di questo sito"
-#: ../../addon/fromgplus/fromgplus.php:35
-msgid "Google Account ID"
-msgstr ""
+#: ../../mod/admin.php:434
+msgid "Site Channel"
+msgstr "Canale del sito"
-#: ../../addon/fromgplus/fromgplus.php:55
-msgid "Google+ Import Settings saved."
-msgstr ""
+#: ../../mod/admin.php:436
+msgid "Maximum image size"
+msgstr "Dimensione massima immagini"
-#: ../../addon/facebook/facebook.php:523
-msgid "Facebook disabled"
-msgstr "Facebook disabilitato"
+#: ../../mod/admin.php:436
+msgid ""
+"Maximum size in bytes of uploaded images. Default is 0, which means no "
+"limits."
+msgstr "Massima dimensione in byte delle immagini caricate. Il default è 0, cioè nessun limite."
-#: ../../addon/facebook/facebook.php:528
-msgid "Updating contacts"
-msgstr "Aggiornamento contatti"
+#: ../../mod/admin.php:437
+msgid "Register policy"
+msgstr "Politica di registrazione"
-#: ../../addon/facebook/facebook.php:551 ../../addon/fbpost/fbpost.php:192
-msgid "Facebook API key is missing."
-msgstr "Chiave API Facebook mancante."
+#: ../../mod/admin.php:438
+msgid "Access policy"
+msgstr "Tipo di accesso"
-#: ../../addon/facebook/facebook.php:558
-msgid "Facebook Connect"
-msgstr "Facebook Connect"
+#: ../../mod/admin.php:439
+msgid "Register text"
+msgstr "Testo diregistrazione"
-#: ../../addon/facebook/facebook.php:564
-msgid "Install Facebook connector for this account."
-msgstr "Installa Facebook connector per questo account"
+#: ../../mod/admin.php:439
+msgid "Will be displayed prominently on the registration page."
+msgstr "Sarà mostrato ben visibile nella pagina di registrazione."
-#: ../../addon/facebook/facebook.php:571
-msgid "Remove Facebook connector"
-msgstr "Rimuovi Facebook connector"
+#: ../../mod/admin.php:440
+msgid "Accounts abandoned after x days"
+msgstr "Account abbandonati dopo X giorni"
-#: ../../addon/facebook/facebook.php:576 ../../addon/fbpost/fbpost.php:217
+#: ../../mod/admin.php:440
msgid ""
-"Re-authenticate [This is necessary whenever your Facebook password is "
-"changed.]"
-msgstr "Ri-autentica [Questo è necessario ogni volta che cambia la password di Facebook.]"
-
-#: ../../addon/facebook/facebook.php:583 ../../addon/fbpost/fbpost.php:224
-msgid "Post to Facebook by default"
-msgstr "Invia sempre a Facebook"
+"Will not waste system resources polling external sites for abandonded "
+"accounts. Enter 0 for no time limit."
+msgstr "Eviterà di sprecare risorse di sistema controllando se i siti esterni hanno account abbandonati. Immettere 0 per non imporre nessun limite di tempo."
-#: ../../addon/facebook/facebook.php:589
-msgid ""
-"Facebook friend linking has been disabled on this site. The following "
-"settings will have no effect."
-msgstr ""
+#: ../../mod/admin.php:441
+msgid "Allowed friend domains"
+msgstr "Domini fidati e consentiti"
-#: ../../addon/facebook/facebook.php:593
+#: ../../mod/admin.php:441
msgid ""
-"Facebook friend linking has been disabled on this site. If you disable it, "
-"you will be unable to re-enable it."
-msgstr ""
+"Comma separated list of domains which are allowed to establish friendships "
+"with this site. Wildcards are accepted. Empty to allow any domains"
+msgstr "Elenco separato da virglola dei domini che possono stabilire amicizie con questo sito. Sono accettati caratteri jolly. Lascia vuoto per accettare connessioni da qualsiasi dominio."
-#: ../../addon/facebook/facebook.php:596
-msgid "Link all your Facebook friends and conversations on this website"
-msgstr "Collega tutti i tuoi amici di Facebook e le conversazioni su questo sito"
+#: ../../mod/admin.php:442
+msgid "Allowed email domains"
+msgstr "Domini email consentiti"
-#: ../../addon/facebook/facebook.php:598
+#: ../../mod/admin.php:442
msgid ""
-"Facebook conversations consist of your <em>profile wall</em> and your friend"
-" <em>stream</em>."
-msgstr "Le conversazione su Facebook sono composte dai i tuoi messsaggi in bacheca e dai messaggi dei tuoi amici"
-
-#: ../../addon/facebook/facebook.php:599
-msgid "On this website, your Facebook friend stream is only visible to you."
-msgstr "Su questo sito, i messaggi dai vostri amici su Facebook è visibile solo a te."
+"Comma separated list of domains which are allowed in email addresses for "
+"registrations to this site. Wildcards are accepted. Empty to allow any "
+"domains"
+msgstr "Elenco separato da virgola dei domini permessi come indirizzi email in fase di registrazione. Sono accettati caratteri jolly. Lascia vuoto per accettare qualsiasi dominio."
-#: ../../addon/facebook/facebook.php:600
-msgid ""
-"The following settings determine the privacy of your Facebook profile wall "
-"on this website."
-msgstr "Le seguenti impostazioni determinano la privacy della vostra bacheca di Facebook su questo sito."
+#: ../../mod/admin.php:443
+msgid "Block public"
+msgstr "Blocca pagine pubbliche"
-#: ../../addon/facebook/facebook.php:604
+#: ../../mod/admin.php:443
msgid ""
-"On this website your Facebook profile wall conversations will only be "
-"visible to you"
-msgstr "Su questo sito, le conversazioni sulla tua bacheca di Facebook saranno visibili solo a te"
+"Check to block public access to all otherwise public personal pages on this "
+"site unless you are currently logged in."
+msgstr "Seleziona per impedire di vedere le pagine personali di questo sito a chi non ha effettuato l'accesso."
-#: ../../addon/facebook/facebook.php:609
-msgid "Do not import your Facebook profile wall conversations"
-msgstr "Non importare le conversazione sulla tua bacheca di Facebook"
+#: ../../mod/admin.php:444
+msgid "Force publish"
+msgstr "Forza la publicazione del profilo"
-#: ../../addon/facebook/facebook.php:611
+#: ../../mod/admin.php:444
msgid ""
-"If you choose to link conversations and leave both of these boxes unchecked,"
-" your Facebook profile wall will be merged with your profile wall on this "
-"website and your privacy settings on this website will be used to determine "
-"who may see the conversations."
-msgstr "Se scegli di collegare le conversazioni e lasci entrambi questi box non segnati, la tua bacheca di Facebook sarà fusa con la tua bacheca su questao sito, e le impostazioni di privacy su questo sito saranno usate per decidere chi potrà vedere le conversazioni."
-
-#: ../../addon/facebook/facebook.php:616
-msgid "Comma separated applications to ignore"
-msgstr "Elenco separato da virgola di applicazioni da ignorare"
-
-#: ../../addon/facebook/facebook.php:700
-msgid "Problems with Facebook Real-Time Updates"
-msgstr "Problemi con gli aggiornamenti in tempo reale con Facebook"
-
-#: ../../addon/facebook/facebook.php:729
-msgid "Facebook Connector Settings"
-msgstr "Impostazioni del connettore Facebook"
-
-#: ../../addon/facebook/facebook.php:744 ../../addon/fbpost/fbpost.php:255
-msgid "Facebook API Key"
-msgstr "Facebook API Key"
+"Check to force all profiles on this site to be listed in the site directory."
+msgstr "Seleziona per mostrare nell'elenco dei canali del sito <strong>tutti</strong> i profili registrati."
-#: ../../addon/facebook/facebook.php:754 ../../addon/fbpost/fbpost.php:262
-msgid ""
-"Error: it appears that you have specified the App-ID and -Secret in your "
-".htconfig.php file. As long as they are specified there, they cannot be set "
-"using this form.<br><br>"
-msgstr "Error: it appears that you have specified the App-ID and -Secret in your .htconfig.php file. As long as they are specified there, they cannot be set using this form.<br><br>"
+#: ../../mod/admin.php:445
+msgid "No login on Homepage"
+msgstr "Non mostrare il login sulla homepage"
-#: ../../addon/facebook/facebook.php:759
+#: ../../mod/admin.php:445
msgid ""
-"Error: the given API Key seems to be incorrect (the application access token"
-" could not be retrieved)."
-msgstr "Error: the given API Key seems to be incorrect (the application access token could not be retrieved)."
+"Check to hide the login form from your sites homepage when visitors arrive "
+"who are not logged in (e.g. when you put the content of the homepage in via "
+"the site channel)."
+msgstr "Per nascondere la possibilità di fare login ai visitatori (per esempio, quando il contenuto della homepage del sito è alimentato dal canale)."
-#: ../../addon/facebook/facebook.php:761
-msgid "The given API Key seems to work correctly."
-msgstr "L' API Key fornita sembra funzionare correttamente."
+#: ../../mod/admin.php:447
+msgid "Proxy user"
+msgstr "Utente proxy"
-#: ../../addon/facebook/facebook.php:763
-msgid ""
-"The correctness of the API Key could not be detected. Something strange's "
-"going on."
-msgstr ""
+#: ../../mod/admin.php:448
+msgid "Proxy URL"
+msgstr "URL proxy"
-#: ../../addon/facebook/facebook.php:766 ../../addon/fbpost/fbpost.php:264
-msgid "App-ID / API-Key"
-msgstr "App-ID / API-Key"
+#: ../../mod/admin.php:449
+msgid "Network timeout"
+msgstr "Timeout rete"
-#: ../../addon/facebook/facebook.php:767 ../../addon/fbpost/fbpost.php:265
-msgid "Application secret"
-msgstr "Application secret"
+#: ../../mod/admin.php:449
+msgid "Value is in seconds. Set to 0 for unlimited (not recommended)."
+msgstr "Valore in secondi. Imposta a 0 per illimitato (sconsigliato)."
-#: ../../addon/facebook/facebook.php:768
-#, php-format
-msgid "Polling Interval in minutes (minimum %1$s minutes)"
-msgstr ""
+#: ../../mod/admin.php:450
+msgid "Delivery interval"
+msgstr "Recapito ritardato"
-#: ../../addon/facebook/facebook.php:769
+#: ../../mod/admin.php:450
msgid ""
-"Synchronize comments (no comments on Facebook are missed, at the cost of "
-"increased system load)"
-msgstr ""
-
-#: ../../addon/facebook/facebook.php:773
-msgid "Real-Time Updates"
-msgstr "Aggiornamenti Real-Time"
-
-#: ../../addon/facebook/facebook.php:777
-msgid "Real-Time Updates are activated."
-msgstr "Gli aggiornamenti in tempo reale sono attivi"
-
-#: ../../addon/facebook/facebook.php:778
-msgid "Deactivate Real-Time Updates"
-msgstr "Disattiva gli aggiornamenti in tempo reale"
-
-#: ../../addon/facebook/facebook.php:780
-msgid "Real-Time Updates not activated."
-msgstr "Gli aggiornamenti in tempo reale non sono attivi"
-
-#: ../../addon/facebook/facebook.php:780
-msgid "Activate Real-Time Updates"
-msgstr "Attiva gli aggiornamenti in tempo reale"
-
-#: ../../addon/facebook/facebook.php:799 ../../addon/fbpost/fbpost.php:282
-#: ../../addon/dav/friendica/layout.fnk.php:361
-msgid "The new values have been saved."
-msgstr "I nuovi valori sono stati salvati."
+"Delay background delivery processes by this many seconds to reduce system "
+"load. Recommend: 4-5 for shared hosts, 2-3 for virtual private servers. 0-1 "
+"for large dedicated servers."
+msgstr "RItarda il processo di recapito di questo numero di secondi per ridurre il carico di sistema. Consigliati: 4-5 secondi per hosting condiviso, 2-3 per i VPS, 0-1 per grandi server dedicati."
-#: ../../addon/facebook/facebook.php:823 ../../addon/fbpost/fbpost.php:301
-msgid "Post to Facebook"
-msgstr "Invia a Facebook"
+#: ../../mod/admin.php:451
+msgid "Poll interval"
+msgstr "Intervallo di polling"
-#: ../../addon/facebook/facebook.php:921 ../../addon/fbpost/fbpost.php:399
+#: ../../mod/admin.php:451
msgid ""
-"Post to Facebook cancelled because of multi-network access permission "
-"conflict."
-msgstr "Invio su Facebook annullato per un conflitto nei permessi di accesso."
-
-#: ../../addon/facebook/facebook.php:1149 ../../addon/fbpost/fbpost.php:610
-msgid "View on Friendica"
-msgstr "Vedi su Friendica"
-
-#: ../../addon/facebook/facebook.php:1182 ../../addon/fbpost/fbpost.php:643
-msgid "Facebook post failed. Queued for retry."
-msgstr "Invio a Facebook fallito. In attesa di riprovare."
-
-#: ../../addon/facebook/facebook.php:1222 ../../addon/fbpost/fbpost.php:683
-msgid "Your Facebook connection became invalid. Please Re-authenticate."
-msgstr ""
+"Delay background polling processes by this many seconds to reduce system "
+"load. If 0, use delivery interval."
+msgstr "Ritarda i processi di polling in background di questo numero di secondi per ridurre il carico del sistema. Se 0, verrà usato lo stesso valore del 'Recapito ritardato'."
-#: ../../addon/facebook/facebook.php:1223 ../../addon/fbpost/fbpost.php:684
-msgid "Facebook connection became invalid"
-msgstr ""
+#: ../../mod/admin.php:452
+msgid "Maximum Load Average"
+msgstr "Carico massimo medio"
-#: ../../addon/facebook/facebook.php:1224 ../../addon/fbpost/fbpost.php:685
-#, php-format
+#: ../../mod/admin.php:452
msgid ""
-"Hi %1$s,\n"
-"\n"
-"The connection between your accounts on %2$s and Facebook became invalid. This usually happens after you change your Facebook-password. To enable the connection again, you have to %3$sre-authenticate the Facebook-connector%4$s."
-msgstr ""
-
-#: ../../addon/snautofollow/snautofollow.php:32
-msgid "StatusNet AutoFollow settings updated."
-msgstr ""
-
-#: ../../addon/snautofollow/snautofollow.php:56
-msgid "StatusNet AutoFollow Settings"
-msgstr ""
+"Maximum system load before delivery and poll processes are deferred - "
+"default 50."
+msgstr "Carico di sistema massimo perché i processi di recapito e polling siano ritardati - il valore predefinito è 50."
-#: ../../addon/snautofollow/snautofollow.php:58
-msgid "Automatically follow any StatusNet followers/mentioners"
-msgstr ""
+#: ../../mod/admin.php:469
+msgid "No server found"
+msgstr "Server non trovato"
-#: ../../addon/bg/bg.php:51
-msgid "Bg settings updated."
-msgstr ""
+#: ../../mod/admin.php:476 ../../mod/admin.php:698
+msgid "ID"
+msgstr "ID"
-#: ../../addon/bg/bg.php:82
-msgid "Bg Settings"
-msgstr ""
+#: ../../mod/admin.php:476
+msgid "for channel"
+msgstr "per canale"
-#: ../../addon/bg/bg.php:84 ../../addon/numfriends/numfriends.php:79
-msgid "How many contacts to display on profile sidebar"
-msgstr "Quanti contatti visualizzare nella barra laterale del profilo"
+#: ../../mod/admin.php:476
+msgid "on server"
+msgstr "sul server"
-#: ../../addon/privacy_image_cache/privacy_image_cache.php:260
-msgid "Lifetime of the cache (in hours)"
-msgstr ""
+#: ../../mod/admin.php:476
+msgid "Status"
+msgstr "Stato"
-#: ../../addon/privacy_image_cache/privacy_image_cache.php:265
-msgid "Cache Statistics"
-msgstr ""
+#: ../../mod/admin.php:496
+msgid "Update has been marked successful"
+msgstr "L'aggiornamento è stato marcato come eseguito."
-#: ../../addon/privacy_image_cache/privacy_image_cache.php:268
-msgid "Number of items"
-msgstr ""
+#: ../../mod/admin.php:506
+#, php-format
+msgid "Executing %s failed. Check system logs."
+msgstr "Fallita l'esecuzione di %s. Maggiori informazioni sui log di sistema."
-#: ../../addon/privacy_image_cache/privacy_image_cache.php:270
-msgid "Size of the cache"
-msgstr ""
+#: ../../mod/admin.php:509
+#, php-format
+msgid "Update %s was successfully applied."
+msgstr "L'aggiornamento %s è terminato correttamente."
-#: ../../addon/privacy_image_cache/privacy_image_cache.php:272
-msgid "Delete the whole cache"
-msgstr ""
+#: ../../mod/admin.php:513
+#, php-format
+msgid "Update %s did not return a status. Unknown if it succeeded."
+msgstr "L'aggiornamento %s non ha dato risposta. Impossibile determinare se è terminato correttamente."
-#: ../../addon/fbpost/fbpost.php:172
-msgid "Facebook Post disabled"
-msgstr ""
+#: ../../mod/admin.php:516
+#, php-format
+msgid "Update function %s could not be found."
+msgstr "Impossibile trovare la funzione di aggiornamento %s"
-#: ../../addon/fbpost/fbpost.php:199
-msgid "Facebook Post"
-msgstr ""
+#: ../../mod/admin.php:531
+msgid "No failed updates."
+msgstr "Nessun aggiornamento fallito."
-#: ../../addon/fbpost/fbpost.php:205
-msgid "Install Facebook Post connector for this account."
-msgstr ""
+#: ../../mod/admin.php:535
+msgid "Failed Updates"
+msgstr "Aggiornamenti falliti."
-#: ../../addon/fbpost/fbpost.php:212
-msgid "Remove Facebook Post connector"
-msgstr ""
+#: ../../mod/admin.php:537
+msgid "Mark success (if update was manually applied)"
+msgstr "Marca come eseguito (se applicato manualmente)."
-#: ../../addon/fbpost/fbpost.php:240
-msgid "Facebook Post Settings"
-msgstr ""
+#: ../../mod/admin.php:538
+msgid "Attempt to execute this update step automatically"
+msgstr "Tenta di eseguire in automatico questo passaggio dell'aggiornamento."
-#: ../../addon/widgets/widget_like.php:58
+#: ../../mod/admin.php:564
#, php-format
-msgid "%d person likes this"
-msgid_plural "%d people like this"
-msgstr[0] "piace a %d persona"
-msgstr[1] "piace a %d persone"
+msgid "%s user blocked/unblocked"
+msgid_plural "%s users blocked/unblocked"
+msgstr[0] "%s utente bloccato/sbloccato"
+msgstr[1] "%s utenti bloccati/sbloccati"
-#: ../../addon/widgets/widget_like.php:61
+#: ../../mod/admin.php:571
#, php-format
-msgid "%d person doesn't like this"
-msgid_plural "%d people don't like this"
-msgstr[0] "non piace a %d persona"
-msgstr[1] "non piace a %d persone"
-
-#: ../../addon/widgets/widget_friendheader.php:40
-msgid "Get added to this list!"
-msgstr ""
-
-#: ../../addon/widgets/widgets.php:56
-msgid "Generate new key"
-msgstr "Genera una nuova chiave"
-
-#: ../../addon/widgets/widgets.php:59
-msgid "Widgets key"
-msgstr "Chiave Widget"
-
-#: ../../addon/widgets/widgets.php:61
-msgid "Widgets available"
-msgstr "Widget disponibili"
+msgid "%s user deleted"
+msgid_plural "%s users deleted"
+msgstr[0] "%s utente cancellato"
+msgstr[1] "%s utenti cancellati"
-#: ../../addon/widgets/widget_friends.php:40
-msgid "Connect on Friendica!"
-msgstr "Connettiti su Friendica!"
+#: ../../mod/admin.php:602
+msgid "Account not found"
+msgstr "Account non trovato"
-#: ../../addon/morepokes/morepokes.php:19
-msgid "bitchslap"
-msgstr ""
+#: ../../mod/admin.php:613
+#, php-format
+msgid "User '%s' deleted"
+msgstr "Utente '%s' eliminato"
-#: ../../addon/morepokes/morepokes.php:19
-msgid "bitchslapped"
-msgstr ""
+#: ../../mod/admin.php:622
+#, php-format
+msgid "User '%s' unblocked"
+msgstr "Utente '%s' sbloccato"
-#: ../../addon/morepokes/morepokes.php:20
-msgid "shag"
-msgstr ""
+#: ../../mod/admin.php:622
+#, php-format
+msgid "User '%s' blocked"
+msgstr "Utente '%s' bloccato"
-#: ../../addon/morepokes/morepokes.php:20
-msgid "shagged"
-msgstr ""
+#: ../../mod/admin.php:687
+msgid "select all"
+msgstr "seleziona tutti"
-#: ../../addon/morepokes/morepokes.php:21
-msgid "do something obscenely biological to"
-msgstr ""
+#: ../../mod/admin.php:688
+msgid "User registrations waiting for confirm"
+msgstr "Richieste di registrazione in attesa di conferma"
-#: ../../addon/morepokes/morepokes.php:21
-msgid "did something obscenely biological to"
-msgstr ""
+#: ../../mod/admin.php:689
+msgid "Request date"
+msgstr "Data richiesta"
-#: ../../addon/morepokes/morepokes.php:22
-msgid "point out the poke feature to"
-msgstr ""
+#: ../../mod/admin.php:689 ../../mod/settings.php:509
+#: ../../mod/settings.php:535
+msgid "Name"
+msgstr "Nome"
-#: ../../addon/morepokes/morepokes.php:22
-msgid "pointed out the poke feature to"
-msgstr ""
+#: ../../mod/admin.php:690
+msgid "No registrations."
+msgstr "Nessuna registrazione."
-#: ../../addon/morepokes/morepokes.php:23
-msgid "declare undying love for"
-msgstr ""
+#: ../../mod/admin.php:691
+msgid "Approve"
+msgstr "Approva"
-#: ../../addon/morepokes/morepokes.php:23
-msgid "declared undying love for"
-msgstr ""
+#: ../../mod/admin.php:692
+msgid "Deny"
+msgstr "Nega"
-#: ../../addon/morepokes/morepokes.php:24
-msgid "patent"
-msgstr ""
+#: ../../mod/admin.php:698
+msgid "Register date"
+msgstr "Data registrazione"
-#: ../../addon/morepokes/morepokes.php:24
-msgid "patented"
-msgstr ""
+#: ../../mod/admin.php:698
+msgid "Last login"
+msgstr "Ultimo accesso"
-#: ../../addon/morepokes/morepokes.php:25
-msgid "stroke beard"
-msgstr ""
+#: ../../mod/admin.php:698
+msgid "Expires"
+msgstr "Scadenza"
-#: ../../addon/morepokes/morepokes.php:25
-msgid "stroked their beard at"
-msgstr ""
+#: ../../mod/admin.php:698
+msgid "Service Class"
+msgstr "Service Class"
-#: ../../addon/morepokes/morepokes.php:26
+#: ../../mod/admin.php:700
msgid ""
-"bemoan the declining standards of modern secondary and tertiary education to"
-msgstr ""
+"Selected users will be deleted!\\n\\nEverything these users had posted on "
+"this site will be permanently deleted!\\n\\nAre you sure?"
+msgstr "Gli utenti selezionati saranno eliminati!\\n\\nTutto quello che gli utenti hanno pubblicato su questo sito sarà permanentemente eliminato!\\n\\nConfermi?"
-#: ../../addon/morepokes/morepokes.php:26
+#: ../../mod/admin.php:701
msgid ""
-"bemoans the declining standards of modern secondary and tertiary education "
-"to"
-msgstr ""
-
-#: ../../addon/morepokes/morepokes.php:27
-msgid "hug"
-msgstr ""
-
-#: ../../addon/morepokes/morepokes.php:27
-msgid "hugged"
-msgstr ""
-
-#: ../../addon/morepokes/morepokes.php:28
-msgid "kiss"
-msgstr ""
-
-#: ../../addon/morepokes/morepokes.php:28
-msgid "kissed"
-msgstr ""
-
-#: ../../addon/morepokes/morepokes.php:29
-msgid "raise eyebrows at"
-msgstr ""
-
-#: ../../addon/morepokes/morepokes.php:29
-msgid "raised their eyebrows at"
-msgstr ""
-
-#: ../../addon/morepokes/morepokes.php:30
-msgid "insult"
-msgstr ""
-
-#: ../../addon/morepokes/morepokes.php:30
-msgid "insulted"
-msgstr ""
-
-#: ../../addon/morepokes/morepokes.php:31
-msgid "praise"
-msgstr ""
-
-#: ../../addon/morepokes/morepokes.php:31
-msgid "praised"
-msgstr ""
-
-#: ../../addon/morepokes/morepokes.php:32
-msgid "be dubious of"
-msgstr ""
-
-#: ../../addon/morepokes/morepokes.php:32
-msgid "was dubious of"
-msgstr ""
-
-#: ../../addon/morepokes/morepokes.php:33
-msgid "eat"
-msgstr ""
-
-#: ../../addon/morepokes/morepokes.php:33
-msgid "ate"
-msgstr ""
-
-#: ../../addon/morepokes/morepokes.php:34
-msgid "giggle and fawn at"
-msgstr ""
-
-#: ../../addon/morepokes/morepokes.php:34
-msgid "giggled and fawned at"
-msgstr ""
-
-#: ../../addon/morepokes/morepokes.php:35
-msgid "doubt"
-msgstr ""
-
-#: ../../addon/morepokes/morepokes.php:35
-msgid "doubted"
-msgstr ""
+"The user {0} will be deleted!\\n\\nEverything this user has posted on this "
+"site will be permanently deleted!\\n\\nAre you sure?"
+msgstr "L'utente {0} sarà eliminato!\\n\\nTutto quello che ha pubblicato su questo sito sarà permanentemente eliminato!\\n\\nConfermi?"
-#: ../../addon/morepokes/morepokes.php:36
-msgid "glare"
-msgstr ""
+#: ../../mod/admin.php:742
+#, php-format
+msgid "Plugin %s disabled."
+msgstr "Plugin %s non attivo."
-#: ../../addon/morepokes/morepokes.php:36
-msgid "glared at"
-msgstr ""
+#: ../../mod/admin.php:746
+#, php-format
+msgid "Plugin %s enabled."
+msgstr "Plugin %s attivo."
-#: ../../addon/yourls/yourls.php:55
-msgid "YourLS Settings"
-msgstr "Impostazioni YourLS"
+#: ../../mod/admin.php:756 ../../mod/admin.php:958
+msgid "Disable"
+msgstr "Disattiva"
-#: ../../addon/yourls/yourls.php:57
-msgid "URL: http://"
-msgstr "URL: http://"
+#: ../../mod/admin.php:758 ../../mod/admin.php:960
+msgid "Enable"
+msgstr "Attiva"
-#: ../../addon/yourls/yourls.php:62
-msgid "Username:"
-msgstr "Nome utente:"
+#: ../../mod/admin.php:784 ../../mod/admin.php:989
+msgid "Toggle"
+msgstr "Attiva/disattiva"
-#: ../../addon/yourls/yourls.php:67
-msgid "Password:"
-msgstr "Password:"
+#: ../../mod/admin.php:792 ../../mod/admin.php:999
+msgid "Author: "
+msgstr "Autore:"
-#: ../../addon/yourls/yourls.php:72
-msgid "Use SSL "
-msgstr "Usa SSL"
+#: ../../mod/admin.php:793 ../../mod/admin.php:1000
+msgid "Maintainer: "
+msgstr "Gestore:"
-#: ../../addon/yourls/yourls.php:92
-msgid "yourls Settings saved."
-msgstr "Impostazioni yourls salvate."
+#: ../../mod/admin.php:922
+msgid "No themes found."
+msgstr "Nessun tema trovato."
-#: ../../addon/ljpost/ljpost.php:39
-msgid "Post to LiveJournal"
-msgstr "Posta su LiveJournal"
+#: ../../mod/admin.php:981
+msgid "Screenshot"
+msgstr "Istantanea dello schermo"
-#: ../../addon/ljpost/ljpost.php:70
-msgid "LiveJournal Post Settings"
-msgstr "Impostazioni post LiveJournal"
+#: ../../mod/admin.php:1029
+msgid "[Experimental]"
+msgstr "[Sperimentale]"
-#: ../../addon/ljpost/ljpost.php:72
-msgid "Enable LiveJournal Post Plugin"
-msgstr "Abilita il plugin LiveJournal"
+#: ../../mod/admin.php:1030
+msgid "[Unsupported]"
+msgstr "[Non supportato]"
-#: ../../addon/ljpost/ljpost.php:77
-msgid "LiveJournal username"
-msgstr "LiveJournal username"
+#: ../../mod/admin.php:1057
+msgid "Log settings updated."
+msgstr "Impostazioni di log aggiornate."
-#: ../../addon/ljpost/ljpost.php:82
-msgid "LiveJournal password"
-msgstr "LiveJournal password"
+#: ../../mod/admin.php:1113
+msgid "Clear"
+msgstr "Pulisci"
-#: ../../addon/ljpost/ljpost.php:87
-msgid "Post to LiveJournal by default"
-msgstr "Posta su LiveJournal di default"
+#: ../../mod/admin.php:1119
+msgid "Debugging"
+msgstr "Debugging"
-#: ../../addon/nsfw/nsfw.php:78
-msgid "Not Safe For Work (General Purpose Content Filter) settings"
-msgstr "Impostazioni per NSWF (Filtro Contenuti Generico)"
+#: ../../mod/admin.php:1120
+msgid "Log file"
+msgstr "File di log"
-#: ../../addon/nsfw/nsfw.php:80
+#: ../../mod/admin.php:1120
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 puo' 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 puo' cercare anche qualsiasi parola che inserisci, quindi puo' essere usato come filtro di contenuti generico."
-
-#: ../../addon/nsfw/nsfw.php:81
-msgid "Enable Content filter"
-msgstr "Abilita il Filtro Contenuti"
-
-#: ../../addon/nsfw/nsfw.php:84
-msgid "Comma separated list of keywords to hide"
-msgstr "Elenco separato da virgole di parole da nascondere"
-
-#: ../../addon/nsfw/nsfw.php:89
-msgid "Use /expression/ to provide regular expressions"
-msgstr "Utilizza /espressione/ per inserire espressioni regolari"
-
-#: ../../addon/nsfw/nsfw.php:105
-msgid "NSFW Settings saved."
-msgstr "Impostazioni NSFW salvate."
-
-#: ../../addon/nsfw/nsfw.php:157
-#, php-format
-msgid "%s - Click to open/close"
-msgstr "%s - Clicca per aprire / chiudere"
-
-#: ../../addon/page/page.php:61 ../../addon/page/page.php:91
-#: ../../addon/forumlist/forumlist.php:55
-msgid "Forums"
-msgstr "Forum"
-
-#: ../../addon/page/page.php:129 ../../addon/forumlist/forumlist.php:89
-msgid "Forums:"
-msgstr ""
+"Must be writable by web server. Relative to your Red top-level directory."
+msgstr "Deve essere scrivibile dal web server. È relativa alla cartella dove è installato Red."
-#: ../../addon/page/page.php:165
-msgid "Page settings updated."
-msgstr ""
-
-#: ../../addon/page/page.php:194
-msgid "Page Settings"
-msgstr ""
-
-#: ../../addon/page/page.php:196
-msgid "How many forums to display on sidebar without paging"
-msgstr ""
-
-#: ../../addon/page/page.php:199
-msgid "Randomise Page/Forum list"
-msgstr ""
-
-#: ../../addon/page/page.php:202
-msgid "Show pages/forums on profile page"
-msgstr ""
+#: ../../mod/admin.php:1121
+msgid "Log level"
+msgstr "Livello di log"
-#: ../../addon/planets/planets.php:150
-msgid "Planets Settings"
-msgstr ""
+#: ../../mod/mitem.php:14 ../../mod/menu.php:87
+msgid "Menu not found."
+msgstr "Menù non trovato."
-#: ../../addon/planets/planets.php:152
-msgid "Enable Planets Plugin"
-msgstr ""
+#: ../../mod/mitem.php:47
+msgid "Menu element updated."
+msgstr "L'elemento del menù è stato aggiornato."
-#: ../../addon/communityhome/communityhome.php:28
-#: ../../addon/communityhome/communityhome.php:34
-#: ../../addon/communityhome/twillingham/communityhome.php:28
-#: ../../addon/communityhome/twillingham/communityhome.php:34
-#: ../../include/nav.php:64 ../../boot.php:912
-msgid "Login"
-msgstr "Accedi"
+#: ../../mod/mitem.php:51
+msgid "Unable to update menu element."
+msgstr "Non è possibile aggiornare l'elemento del menù."
-#: ../../addon/communityhome/communityhome.php:29
-#: ../../addon/communityhome/twillingham/communityhome.php:29
-msgid "OpenID"
-msgstr "OpenID"
+#: ../../mod/mitem.php:57
+msgid "Menu element added."
+msgstr "Elemento aggiunto al menù."
-#: ../../addon/communityhome/communityhome.php:38
-#: ../../addon/communityhome/twillingham/communityhome.php:38
-msgid "Latest users"
-msgstr "Ultimi utenti"
+#: ../../mod/mitem.php:61
+msgid "Unable to add menu element."
+msgstr "Impossibile aggiungere l'elemento al menù."
-#: ../../addon/communityhome/communityhome.php:81
-#: ../../addon/communityhome/twillingham/communityhome.php:81
-msgid "Most active users"
-msgstr "Utenti più attivi"
+#: ../../mod/mitem.php:78 ../../mod/xchan.php:25 ../../mod/menu.php:113
+#: ../../mod/dirprofile.php:176
+msgid "Not found."
+msgstr "Non trovato."
-#: ../../addon/communityhome/communityhome.php:98
-msgid "Latest photos"
-msgstr "Ultime foto"
+#: ../../mod/mitem.php:96
+msgid "Manage Menu Elements"
+msgstr "Gestione elementi del menù"
-#: ../../addon/communityhome/communityhome.php:133
-msgid "Latest likes"
-msgstr "Ultimi \"mi piace\""
+#: ../../mod/mitem.php:99
+msgid "Edit menu"
+msgstr "Modifica il menù"
-#: ../../addon/communityhome/communityhome.php:155
-#: ../../view/theme/diabook/theme.php:562 ../../include/text.php:1437
-#: ../../include/conversation.php:117 ../../include/conversation.php:245
-msgid "event"
-msgstr "l'evento"
+#: ../../mod/mitem.php:102
+msgid "Edit element"
+msgstr "Modifica l'elemento"
-#: ../../addon/dav/common/wdcal_backend.inc.php:92
-#: ../../addon/dav/common/wdcal_backend.inc.php:166
-#: ../../addon/dav/common/wdcal_backend.inc.php:178
-#: ../../addon/dav/common/wdcal_backend.inc.php:206
-#: ../../addon/dav/common/wdcal_backend.inc.php:214
-#: ../../addon/dav/common/wdcal_backend.inc.php:229
-msgid "No access"
-msgstr ""
+#: ../../mod/mitem.php:103
+msgid "Drop element"
+msgstr "Elimina l'elemento"
-#: ../../addon/dav/common/wdcal_edit.inc.php:30
-#: ../../addon/dav/common/wdcal_edit.inc.php:738
-msgid "Could not open component for editing"
-msgstr ""
+#: ../../mod/mitem.php:104
+msgid "New element"
+msgstr "Nuovo elemento"
-#: ../../addon/dav/common/wdcal_edit.inc.php:140
-#: ../../addon/dav/friendica/layout.fnk.php:143
-#: ../../addon/dav/friendica/layout.fnk.php:422
-msgid "Go back to the calendar"
-msgstr ""
+#: ../../mod/mitem.php:105
+msgid "Edit this menu container"
+msgstr "Modifica il contenitore del menù"
-#: ../../addon/dav/common/wdcal_edit.inc.php:144
-msgid "Event data"
-msgstr ""
+#: ../../mod/mitem.php:106
+msgid "Add menu element"
+msgstr "Aggiungi un elemento al menù"
-#: ../../addon/dav/common/wdcal_edit.inc.php:146
-#: ../../addon/dav/friendica/main.php:239
-msgid "Calendar"
-msgstr ""
+#: ../../mod/mitem.php:107
+msgid "Delete this menu item"
+msgstr "Elimina questo elemento del menù"
-#: ../../addon/dav/common/wdcal_edit.inc.php:163
-msgid "Special color"
-msgstr ""
+#: ../../mod/mitem.php:108
+msgid "Edit this menu item"
+msgstr "Modifica questo elemento del menù"
-#: ../../addon/dav/common/wdcal_edit.inc.php:169
-msgid "Subject"
-msgstr ""
+#: ../../mod/mitem.php:131
+msgid "New Menu Element"
+msgstr "Nuovo elemento del menù"
-#: ../../addon/dav/common/wdcal_edit.inc.php:173
-msgid "Starts"
-msgstr ""
+#: ../../mod/mitem.php:133 ../../mod/mitem.php:176
+msgid "Menu Item Permissions"
+msgstr "Permessi del menu"
-#: ../../addon/dav/common/wdcal_edit.inc.php:178
-msgid "Ends"
-msgstr ""
+#: ../../mod/mitem.php:134 ../../mod/mitem.php:177 ../../mod/settings.php:930
+msgid "(click to open/close)"
+msgstr "(clicca per aprire/chiudere)"
-#: ../../addon/dav/common/wdcal_edit.inc.php:185
-msgid "Description"
-msgstr ""
+#: ../../mod/mitem.php:136 ../../mod/mitem.php:180
+msgid "Link text"
+msgstr "Testo del link"
-#: ../../addon/dav/common/wdcal_edit.inc.php:188
-msgid "Recurrence"
-msgstr ""
+#: ../../mod/mitem.php:137 ../../mod/mitem.php:181
+msgid "URL of link"
+msgstr "Indirizzo del link"
-#: ../../addon/dav/common/wdcal_edit.inc.php:190
-msgid "Frequency"
-msgstr ""
+#: ../../mod/mitem.php:138 ../../mod/mitem.php:182
+msgid "Use Red magic-auth if available"
+msgstr "Usa l'autenticazione magica di Red, se disponibile"
-#: ../../addon/dav/common/wdcal_edit.inc.php:194
-#: ../../include/contact_selectors.php:59
-msgid "Daily"
-msgstr "Giornalmente"
+#: ../../mod/mitem.php:139 ../../mod/mitem.php:183
+msgid "Open link in new window"
+msgstr "Apri il link in una nuova finestra"
-#: ../../addon/dav/common/wdcal_edit.inc.php:197
-#: ../../include/contact_selectors.php:60
-msgid "Weekly"
-msgstr "Settimanalmente"
+#: ../../mod/mitem.php:141 ../../mod/mitem.php:185
+msgid "Order in list"
+msgstr "Ordine dell'elenco"
-#: ../../addon/dav/common/wdcal_edit.inc.php:200
-#: ../../include/contact_selectors.php:61
-msgid "Monthly"
-msgstr "Mensilmente"
+#: ../../mod/mitem.php:141 ../../mod/mitem.php:185
+msgid "Higher numbers will sink to bottom of listing"
+msgstr "I numeri più alti andranno in fondo all'elenco"
-#: ../../addon/dav/common/wdcal_edit.inc.php:203
-msgid "Yearly"
-msgstr ""
+#: ../../mod/mitem.php:142 ../../mod/menu.php:79 ../../mod/new_channel.php:117
+msgid "Create"
+msgstr "Crea"
-#: ../../addon/dav/common/wdcal_edit.inc.php:214
-#: ../../include/datetime.php:288
-msgid "days"
-msgstr "giorni"
+#: ../../mod/mitem.php:154
+msgid "Menu item not found."
+msgstr "L'elemento del menù non è stato trovato."
-#: ../../addon/dav/common/wdcal_edit.inc.php:215
-#: ../../include/datetime.php:287
-msgid "weeks"
-msgstr "settimane"
+#: ../../mod/mitem.php:163
+msgid "Menu item deleted."
+msgstr "L'elemento del menù è stato eliminato."
-#: ../../addon/dav/common/wdcal_edit.inc.php:216
-#: ../../include/datetime.php:286
-msgid "months"
-msgstr "mesi"
+#: ../../mod/mitem.php:165
+msgid "Menu item could not be deleted."
+msgstr "L'elemento del menù non può essere eliminato."
-#: ../../addon/dav/common/wdcal_edit.inc.php:217
-#: ../../include/datetime.php:285
-msgid "years"
-msgstr "anni"
+#: ../../mod/mitem.php:174
+msgid "Edit Menu Element"
+msgstr "Modifica l'elemento del menù"
-#: ../../addon/dav/common/wdcal_edit.inc.php:218
-msgid "Interval"
-msgstr ""
-
-#: ../../addon/dav/common/wdcal_edit.inc.php:218
-msgid "All %select% %time%"
-msgstr ""
-
-#: ../../addon/dav/common/wdcal_edit.inc.php:222
-#: ../../addon/dav/common/wdcal_edit.inc.php:260
-#: ../../addon/dav/common/wdcal_edit.inc.php:481
-msgid "Days"
-msgstr ""
-
-#: ../../addon/dav/common/wdcal_edit.inc.php:231
-#: ../../addon/dav/common/wdcal_edit.inc.php:254
-#: ../../addon/dav/common/wdcal_edit.inc.php:270
-#: ../../addon/dav/common/wdcal_edit.inc.php:293
-#: ../../addon/dav/common/wdcal_edit.inc.php:305 ../../include/text.php:917
-msgid "Sunday"
-msgstr "Domenica"
-
-#: ../../addon/dav/common/wdcal_edit.inc.php:235
-#: ../../addon/dav/common/wdcal_edit.inc.php:274
-#: ../../addon/dav/common/wdcal_edit.inc.php:308 ../../include/text.php:917
-msgid "Monday"
-msgstr "Lunedì"
-
-#: ../../addon/dav/common/wdcal_edit.inc.php:238
-#: ../../addon/dav/common/wdcal_edit.inc.php:277 ../../include/text.php:917
-msgid "Tuesday"
-msgstr "Martedì"
-
-#: ../../addon/dav/common/wdcal_edit.inc.php:241
-#: ../../addon/dav/common/wdcal_edit.inc.php:280 ../../include/text.php:917
-msgid "Wednesday"
-msgstr "Mercoledì"
+#: ../../mod/mitem.php:186 ../../mod/menu.php:107
+msgid "Modify"
+msgstr "Modifica"
-#: ../../addon/dav/common/wdcal_edit.inc.php:244
-#: ../../addon/dav/common/wdcal_edit.inc.php:283 ../../include/text.php:917
-msgid "Thursday"
-msgstr "Giovedì"
+#: ../../mod/group.php:20
+msgid "Collection created."
+msgstr "L'insieme di canali è stato creato."
-#: ../../addon/dav/common/wdcal_edit.inc.php:247
-#: ../../addon/dav/common/wdcal_edit.inc.php:286 ../../include/text.php:917
-msgid "Friday"
-msgstr "Venerdì"
+#: ../../mod/group.php:26
+msgid "Could not create collection."
+msgstr "Impossibile creare l'insieme."
-#: ../../addon/dav/common/wdcal_edit.inc.php:250
-#: ../../addon/dav/common/wdcal_edit.inc.php:289 ../../include/text.php:917
-msgid "Saturday"
-msgstr "Sabato"
+#: ../../mod/group.php:54
+msgid "Collection updated."
+msgstr "Insieme aggiornato."
-#: ../../addon/dav/common/wdcal_edit.inc.php:297
-msgid "First day of week:"
-msgstr ""
+#: ../../mod/group.php:86
+msgid "Create a collection of channels."
+msgstr "Crea un insieme di canali."
-#: ../../addon/dav/common/wdcal_edit.inc.php:350
-#: ../../addon/dav/common/wdcal_edit.inc.php:373
-msgid "Day of month"
-msgstr ""
+#: ../../mod/group.php:87 ../../mod/group.php:183
+msgid "Collection Name: "
+msgstr "Nome del'insieme:"
-#: ../../addon/dav/common/wdcal_edit.inc.php:354
-msgid "#num#th of each month"
-msgstr ""
+#: ../../mod/group.php:89 ../../mod/group.php:186
+msgid "Members are visible to other channels"
+msgstr "I membri saranno visibili agli altri canali"
-#: ../../addon/dav/common/wdcal_edit.inc.php:357
-msgid "#num#th-last of each month"
-msgstr ""
+#: ../../mod/group.php:107
+msgid "Collection removed."
+msgstr "Insieme rimosso."
-#: ../../addon/dav/common/wdcal_edit.inc.php:360
-msgid "#num#th #wkday# of each month"
-msgstr ""
+#: ../../mod/group.php:109
+msgid "Unable to remove collection."
+msgstr "Impossibile rimuovere l'insieme."
-#: ../../addon/dav/common/wdcal_edit.inc.php:363
-msgid "#num#th-last #wkday# of each month"
-msgstr ""
-
-#: ../../addon/dav/common/wdcal_edit.inc.php:372
-#: ../../addon/dav/friendica/layout.fnk.php:255
-msgid "Month"
-msgstr ""
+#: ../../mod/group.php:182
+msgid "Collection Editor"
+msgstr "Modifica l'insieme"
-#: ../../addon/dav/common/wdcal_edit.inc.php:377
-msgid "#num#th of the given month"
-msgstr ""
+#: ../../mod/group.php:196
+msgid "Members"
+msgstr "Membri"
-#: ../../addon/dav/common/wdcal_edit.inc.php:380
-msgid "#num#th-last of the given month"
-msgstr ""
+#: ../../mod/group.php:198
+msgid "All Connected Channels"
+msgstr "Tutti i canali connessi"
-#: ../../addon/dav/common/wdcal_edit.inc.php:383
-msgid "#num#th #wkday# of the given month"
-msgstr ""
+#: ../../mod/group.php:231
+msgid "Click on a channel to add or remove."
+msgstr "Clicca su un canale per aggiungerlo o rimuoverlo."
-#: ../../addon/dav/common/wdcal_edit.inc.php:386
-msgid "#num#th-last #wkday# of the given month"
-msgstr ""
+#: ../../mod/photos.php:77
+msgid "Page owner information could not be retrieved."
+msgstr "Impossibile ottenere informazioni sul proprietario della pagina."
-#: ../../addon/dav/common/wdcal_edit.inc.php:413
-msgid "Repeat until"
-msgstr ""
+#: ../../mod/photos.php:97
+msgid "Album not found."
+msgstr "Album non trovato."
-#: ../../addon/dav/common/wdcal_edit.inc.php:417
-msgid "Infinite"
-msgstr ""
+#: ../../mod/photos.php:119 ../../mod/photos.php:799
+msgid "Delete Album"
+msgstr "Elimina album"
-#: ../../addon/dav/common/wdcal_edit.inc.php:420
-msgid "Until the following date"
-msgstr ""
+#: ../../mod/photos.php:159 ../../mod/photos.php:1061
+msgid "Delete Photo"
+msgstr "Elimina foto"
-#: ../../addon/dav/common/wdcal_edit.inc.php:423
-msgid "Number of times"
-msgstr ""
+#: ../../mod/photos.php:500
+#, php-format
+msgid "%1$s was tagged in %2$s by %3$s"
+msgstr "%3$s ha taggato %1$s in %2$s"
-#: ../../addon/dav/common/wdcal_edit.inc.php:429
-msgid "Exceptions"
-msgstr ""
+#: ../../mod/photos.php:500
+msgid "a photo"
+msgstr "una foto"
-#: ../../addon/dav/common/wdcal_edit.inc.php:432
-msgid "none"
-msgstr ""
+#: ../../mod/photos.php:583
+msgid "No photos selected"
+msgstr "Nessuna foto selezionata"
-#: ../../addon/dav/common/wdcal_edit.inc.php:449
-msgid "Notification"
-msgstr ""
+#: ../../mod/photos.php:630
+msgid "Access to this item is restricted."
+msgstr "Questo elemento non è visibile a tutti."
-#: ../../addon/dav/common/wdcal_edit.inc.php:466
-msgid "Notify by"
-msgstr ""
+#: ../../mod/photos.php:704
+#, php-format
+msgid "You have used %1$.2f Mbytes of %2$.2f Mbytes photo storage."
+msgstr "Hai usato %1$.2f Mb di %2$.2f Mb disponibili per le foto."
-#: ../../addon/dav/common/wdcal_edit.inc.php:469
-msgid "E-Mail"
-msgstr ""
+#: ../../mod/photos.php:707
+#, php-format
+msgid "You have used %1$.2f Mbytes of photo storage."
+msgstr "Hai usato %1$.2f Mb di spazio per le foto."
-#: ../../addon/dav/common/wdcal_edit.inc.php:470
-msgid "On Friendica / Display"
-msgstr ""
+#: ../../mod/photos.php:726
+msgid "Upload Photos"
+msgstr "Carica foto"
-#: ../../addon/dav/common/wdcal_edit.inc.php:474
-msgid "Time"
-msgstr ""
+#: ../../mod/photos.php:730 ../../mod/photos.php:794
+msgid "New album name: "
+msgstr "Nome del nuovo album: "
-#: ../../addon/dav/common/wdcal_edit.inc.php:478
-msgid "Hours"
-msgstr ""
+#: ../../mod/photos.php:731
+msgid "or existing album name: "
+msgstr "o nome di un album esistente: "
-#: ../../addon/dav/common/wdcal_edit.inc.php:479
-msgid "Minutes"
-msgstr ""
+#: ../../mod/photos.php:732
+msgid "Do not show a status post for this upload"
+msgstr "Non creare un messaggio di stato per questo caricamento"
-#: ../../addon/dav/common/wdcal_edit.inc.php:480
-msgid "Seconds"
-msgstr ""
+#: ../../mod/photos.php:734 ../../mod/photos.php:1056
+#: ../../mod/filestorage.php:125
+msgid "Permissions"
+msgstr "Permessi"
-#: ../../addon/dav/common/wdcal_edit.inc.php:482
-msgid "Weeks"
-msgstr ""
+#: ../../mod/photos.php:783 ../../mod/photos.php:805 ../../mod/photos.php:1232
+#: ../../mod/photos.php:1247
+msgid "Contact Photos"
+msgstr "Foto dei contatti"
-#: ../../addon/dav/common/wdcal_edit.inc.php:485
-msgid "before the"
-msgstr ""
+#: ../../mod/photos.php:809
+msgid "Edit Album"
+msgstr "Modifica album"
-#: ../../addon/dav/common/wdcal_edit.inc.php:486
-msgid "start of the event"
-msgstr ""
+#: ../../mod/photos.php:815
+msgid "Show Newest First"
+msgstr "Prima i più recenti"
-#: ../../addon/dav/common/wdcal_edit.inc.php:487
-msgid "end of the event"
-msgstr ""
+#: ../../mod/photos.php:817
+msgid "Show Oldest First"
+msgstr "Prima i più vecchi"
-#: ../../addon/dav/common/wdcal_edit.inc.php:492
-msgid "Add a notification"
-msgstr ""
+#: ../../mod/photos.php:860 ../../mod/photos.php:1279
+msgid "View Photo"
+msgstr "Guarda la foto"
-#: ../../addon/dav/common/wdcal_edit.inc.php:687
-msgid "The event #name# will start at #date"
-msgstr ""
+#: ../../mod/photos.php:906
+msgid "Permission denied. Access to this item may be restricted."
+msgstr "Permesso negato. L'accesso a questo elemento può essere stato limitato."
-#: ../../addon/dav/common/wdcal_edit.inc.php:696
-msgid "#name# is about to begin."
-msgstr ""
+#: ../../mod/photos.php:908
+msgid "Photo not available"
+msgstr "Foto non disponibile"
-#: ../../addon/dav/common/wdcal_edit.inc.php:769
-msgid "Saved"
-msgstr ""
+#: ../../mod/photos.php:966
+msgid "Use as profile photo"
+msgstr "Usa come foto del profilo"
-#: ../../addon/dav/common/wdcal_configuration.php:148
-msgid "U.S. Time Format (mm/dd/YYYY)"
-msgstr ""
+#: ../../mod/photos.php:990
+msgid "View Full Size"
+msgstr "Vedi nelle dimensioni originali"
-#: ../../addon/dav/common/wdcal_configuration.php:243
-msgid "German Time Format (dd.mm.YYYY)"
-msgstr ""
+#: ../../mod/photos.php:1044
+msgid "Edit photo"
+msgstr "Modifica la foto"
-#: ../../addon/dav/common/dav_caldav_backend_private.inc.php:39
-msgid "Private Events"
-msgstr ""
+#: ../../mod/photos.php:1046
+msgid "Rotate CW (right)"
+msgstr "Ruota (senso orario)"
-#: ../../addon/dav/common/dav_carddav_backend_private.inc.php:46
-msgid "Private Addressbooks"
-msgstr ""
+#: ../../mod/photos.php:1047
+msgid "Rotate CCW (left)"
+msgstr "Ruota (senso antiorario)"
-#: ../../addon/dav/friendica/dav_caldav_backend_virtual_friendica.inc.php:36
-msgid "Friendica-Native events"
-msgstr ""
+#: ../../mod/photos.php:1049
+msgid "New album name"
+msgstr "Nuovo nome dell'album"
-#: ../../addon/dav/friendica/dav_carddav_backend_virtual_friendica.inc.php:36
-#: ../../addon/dav/friendica/dav_carddav_backend_virtual_friendica.inc.php:59
-msgid "Friendica-Contacts"
-msgstr ""
+#: ../../mod/photos.php:1052
+msgid "Caption"
+msgstr "Titolo"
-#: ../../addon/dav/friendica/dav_carddav_backend_virtual_friendica.inc.php:60
-msgid "Your Friendica-Contacts"
-msgstr ""
+#: ../../mod/photos.php:1054
+msgid "Add a Tag"
+msgstr "Aggiungi tag"
-#: ../../addon/dav/friendica/layout.fnk.php:99
-#: ../../addon/dav/friendica/layout.fnk.php:136
+#: ../../mod/photos.php:1058
msgid ""
-"Something went wrong when trying to import the file. Sorry. Maybe some "
-"events were imported anyway."
-msgstr ""
-
-#: ../../addon/dav/friendica/layout.fnk.php:131
-msgid "Something went wrong when trying to import the file. Sorry."
-msgstr ""
-
-#: ../../addon/dav/friendica/layout.fnk.php:134
-msgid "The ICS-File has been imported."
-msgstr ""
-
-#: ../../addon/dav/friendica/layout.fnk.php:138
-msgid "No file was uploaded."
-msgstr ""
-
-#: ../../addon/dav/friendica/layout.fnk.php:147
-msgid "Import a ICS-file"
-msgstr ""
-
-#: ../../addon/dav/friendica/layout.fnk.php:150
-msgid "ICS-File"
-msgstr ""
-
-#: ../../addon/dav/friendica/layout.fnk.php:151
-msgid "Overwrite all #num# existing events"
-msgstr ""
-
-#: ../../addon/dav/friendica/layout.fnk.php:228
-msgid "New event"
-msgstr ""
+"Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"
+msgstr "Per esempio: @luca, @Maria_Bianchi, @bob@example.com, #California, #camping"
-#: ../../addon/dav/friendica/layout.fnk.php:232
-msgid "Today"
-msgstr ""
+#: ../../mod/photos.php:1285
+msgid "View Album"
+msgstr "Guarda l'album"
-#: ../../addon/dav/friendica/layout.fnk.php:241
-msgid "Day"
-msgstr ""
+#: ../../mod/photos.php:1294
+msgid "Recent Photos"
+msgstr "Foto recenti"
-#: ../../addon/dav/friendica/layout.fnk.php:248
-msgid "Week"
-msgstr ""
+#: ../../mod/filer.php:35
+msgid "- select -"
+msgstr "- scegli -"
-#: ../../addon/dav/friendica/layout.fnk.php:260
-msgid "Reload"
-msgstr ""
+#: ../../mod/menu.php:17
+msgid "Menu updated."
+msgstr "Menù aggiornato."
-#: ../../addon/dav/friendica/layout.fnk.php:271
-msgid "Date"
-msgstr ""
+#: ../../mod/menu.php:21
+msgid "Unable to update menu."
+msgstr "Impossibile aggiornare il menù."
-#: ../../addon/dav/friendica/layout.fnk.php:313
-msgid "Error"
-msgstr ""
+#: ../../mod/menu.php:26
+msgid "Menu created."
+msgstr "Menù creato."
-#: ../../addon/dav/friendica/layout.fnk.php:380
-msgid "The calendar has been updated."
-msgstr ""
+#: ../../mod/menu.php:30
+msgid "Unable to create menu."
+msgstr "Impossibile creare il menù."
-#: ../../addon/dav/friendica/layout.fnk.php:393
-msgid "The new calendar has been created."
-msgstr ""
+#: ../../mod/menu.php:53
+msgid "Manage Menus"
+msgstr "Gestione menù"
-#: ../../addon/dav/friendica/layout.fnk.php:417
-msgid "The calendar has been deleted."
-msgstr ""
+#: ../../mod/menu.php:56
+msgid "Drop"
+msgstr "Elimina"
-#: ../../addon/dav/friendica/layout.fnk.php:424
-msgid "Calendar Settings"
-msgstr ""
+#: ../../mod/menu.php:58
+msgid "Create a new menu"
+msgstr "Crea un nuovo menù"
-#: ../../addon/dav/friendica/layout.fnk.php:430
-msgid "Date format"
-msgstr ""
+#: ../../mod/menu.php:59
+msgid "Delete this menu"
+msgstr "Elimina questo menù"
-#: ../../addon/dav/friendica/layout.fnk.php:439
-msgid "Time zone"
-msgstr ""
+#: ../../mod/menu.php:60 ../../mod/menu.php:104
+msgid "Edit menu contents"
+msgstr "Modifica i contenuti del menù"
-#: ../../addon/dav/friendica/layout.fnk.php:445
-msgid "Calendars"
-msgstr ""
+#: ../../mod/menu.php:61
+msgid "Edit this menu"
+msgstr "Modifica questo menù"
-#: ../../addon/dav/friendica/layout.fnk.php:487
-msgid "Create a new calendar"
-msgstr ""
+#: ../../mod/menu.php:76
+msgid "New Menu"
+msgstr "Nuovo menù"
-#: ../../addon/dav/friendica/layout.fnk.php:496
-msgid "Limitations"
-msgstr ""
+#: ../../mod/menu.php:77 ../../mod/menu.php:105
+msgid "Menu name"
+msgstr "Nome del menù"
-#: ../../addon/dav/friendica/layout.fnk.php:500
-#: ../../addon/libravatar/libravatar.php:82
-msgid "Warning"
-msgstr ""
+#: ../../mod/menu.php:77 ../../mod/menu.php:105
+msgid "Must be unique, only seen by you"
+msgstr "Deve essere unico, lo vedrai solo tu"
-#: ../../addon/dav/friendica/layout.fnk.php:504
-msgid "Synchronization (iPhone, Thunderbird Lightning, Android, ...)"
-msgstr ""
+#: ../../mod/menu.php:78 ../../mod/menu.php:106
+msgid "Menu title"
+msgstr "Titolo del menù"
-#: ../../addon/dav/friendica/layout.fnk.php:511
-msgid "Synchronizing this calendar with the iPhone"
-msgstr ""
+#: ../../mod/menu.php:78 ../../mod/menu.php:106
+msgid "Menu title as seen by others"
+msgstr "Titolo del menù come comparirà a tutti"
-#: ../../addon/dav/friendica/layout.fnk.php:522
-msgid "Synchronizing your Friendica-Contacts with the iPhone"
-msgstr ""
+#: ../../mod/menu.php:93
+msgid "Menu deleted."
+msgstr "Menù eliminato."
-#: ../../addon/dav/friendica/main.php:202
-msgid ""
-"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."
-msgstr ""
+#: ../../mod/menu.php:95
+msgid "Menu could not be deleted."
+msgstr "Il menù non può essere eliminato."
-#: ../../addon/dav/friendica/main.php:242
-msgid "Extended calendar with CalDAV-support"
-msgstr ""
-
-#: ../../addon/dav/friendica/main.php:279
-#: ../../addon/dav/friendica/main.php:280 ../../include/delivery.php:464
-#: ../../include/enotify.php:28 ../../include/notifier.php:710
-msgid "noreply"
-msgstr "nessuna risposta"
+#: ../../mod/menu.php:101
+msgid "Edit Menu"
+msgstr "Modifica menù"
-#: ../../addon/dav/friendica/main.php:282
-msgid "Notification: "
-msgstr ""
+#: ../../mod/menu.php:103
+msgid "Add or remove entries to this menu"
+msgstr "Aggiungi o rimuovi elementi di questo menù"
-#: ../../addon/dav/friendica/main.php:309
-msgid "The database tables have been installed."
-msgstr ""
+#: ../../mod/home.php:89
+#, php-format
+msgid "Welcome to %s"
+msgstr "%s ti dà il benvenuto"
-#: ../../addon/dav/friendica/main.php:310
-msgid "An error occurred during the installation."
-msgstr ""
+#: ../../mod/directory.php:143 ../../mod/profiles.php:573
+#: ../../mod/dirprofile.php:95
+msgid "Age: "
+msgstr "Età:"
-#: ../../addon/dav/friendica/main.php:316
-msgid "The database tables have been updated."
-msgstr ""
+#: ../../mod/directory.php:146 ../../mod/dirprofile.php:98
+msgid "Gender: "
+msgstr "Sesso:"
-#: ../../addon/dav/friendica/main.php:317
-msgid "An error occurred during the update."
-msgstr ""
+#: ../../mod/directory.php:206
+msgid "Finding:"
+msgstr "Ricerca:"
-#: ../../addon/dav/friendica/main.php:333
-msgid "No system-wide settings yet."
-msgstr ""
+#: ../../mod/directory.php:214
+msgid "next page"
+msgstr "pagina succ."
-#: ../../addon/dav/friendica/main.php:336
-msgid "Database status"
-msgstr ""
+#: ../../mod/directory.php:214
+msgid "previous page"
+msgstr "pagina prec."
-#: ../../addon/dav/friendica/main.php:339
-msgid "Installed"
-msgstr ""
+#: ../../mod/directory.php:221
+msgid "No entries (some entries may be hidden)."
+msgstr "Nessun risultato (qualcosa potrebbe essere nascosto)."
-#: ../../addon/dav/friendica/main.php:343
-msgid "Upgrade needed"
-msgstr ""
+#: ../../mod/connections.php:189 ../../mod/connections.php:261
+msgid "Blocked"
+msgstr "Bloccati"
-#: ../../addon/dav/friendica/main.php:343
-msgid ""
-"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."
-msgstr ""
+#: ../../mod/connections.php:194 ../../mod/connections.php:268
+msgid "Ignored"
+msgstr "Ignorati"
-#: ../../addon/dav/friendica/main.php:343
-msgid "Upgrade"
-msgstr ""
+#: ../../mod/connections.php:199 ../../mod/connections.php:282
+msgid "Hidden"
+msgstr "Nascosti"
-#: ../../addon/dav/friendica/main.php:346
-msgid "Not installed"
-msgstr ""
+#: ../../mod/connections.php:204 ../../mod/connections.php:275
+msgid "Archived"
+msgstr "Archiviati"
-#: ../../addon/dav/friendica/main.php:346
-msgid "Install"
-msgstr ""
+#: ../../mod/connections.php:215
+msgid "All"
+msgstr "Tutti"
-#: ../../addon/dav/friendica/main.php:350
-msgid "Unknown"
-msgstr ""
+#: ../../mod/connections.php:239
+msgid "Suggest new connections"
+msgstr "Suggerisci nuovi contatti"
-#: ../../addon/dav/friendica/main.php:350
-msgid ""
-"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."
-msgstr ""
+#: ../../mod/connections.php:245
+msgid "Show pending (new) connections"
+msgstr "Richieste di contatto in attesa"
-#: ../../addon/dav/friendica/main.php:355
-msgid "Troubleshooting"
-msgstr ""
+#: ../../mod/connections.php:248
+msgid "All Connections"
+msgstr "Tutti i contatti"
-#: ../../addon/dav/friendica/main.php:356
-msgid "Manual creation of the database tables:"
-msgstr ""
+#: ../../mod/connections.php:251
+msgid "Show all connections"
+msgstr "Mostra tutti i contatti"
-#: ../../addon/dav/friendica/main.php:357
-msgid "Show SQL-statements"
-msgstr ""
+#: ../../mod/connections.php:254
+msgid "Unblocked"
+msgstr "Non bloccati"
-#: ../../addon/dav/friendica/calendar.friendica.fnk.php:206
-msgid "Private Calendar"
-msgstr ""
+#: ../../mod/connections.php:257
+msgid "Only show unblocked connections"
+msgstr "Mostra solo i contatti non bloccati"
-#: ../../addon/dav/friendica/calendar.friendica.fnk.php:207
-msgid "Friendica Events: Mine"
-msgstr ""
+#: ../../mod/connections.php:264
+msgid "Only show blocked connections"
+msgstr "Mostra solo i contatti bloccati"
-#: ../../addon/dav/friendica/calendar.friendica.fnk.php:208
-msgid "Friendica Events: Contacts"
-msgstr ""
+#: ../../mod/connections.php:271
+msgid "Only show ignored connections"
+msgstr "Mostra solo i contatti ignorati"
-#: ../../addon/dav/friendica/calendar.friendica.fnk.php:248
-msgid "Private Addresses"
-msgstr ""
+#: ../../mod/connections.php:278
+msgid "Only show archived connections"
+msgstr "Mostra solo i contatti archiviati"
-#: ../../addon/dav/friendica/calendar.friendica.fnk.php:249
-msgid "Friendica Contacts"
-msgstr ""
+#: ../../mod/connections.php:285
+msgid "Only show hidden connections"
+msgstr "Mostra solo i contatti nascosti"
-#: ../../addon/uhremotestorage/uhremotestorage.php:84
+#: ../../mod/connections.php:329
#, php-format
-msgid ""
-"Allow to use your friendica id (%s) to connecto to external unhosted-enabled"
-" storage (like ownCloud). See <a "
-"href=\"http://www.w3.org/community/unhosted/wiki/RemoteStorage#WebFinger\">RemoteStorage"
-" WebFinger</a>"
-msgstr "Permette di usare il tuo id friendica (%s) per collegarsi a storage esterni che supportano unhosted (come ownCloud). Vedi <a href=\"http://www.w3.org/community/unhosted/wiki/RemoteStorage#WebFinger\">RemoteStorage WebFinger</a>"
+msgid "%1$s [%2$s]"
+msgstr "%1$s [%2$s]"
-#: ../../addon/uhremotestorage/uhremotestorage.php:85
-msgid "Template URL (with {category})"
-msgstr "Template URL (con {category})"
-
-#: ../../addon/uhremotestorage/uhremotestorage.php:86
-msgid "OAuth end-point"
-msgstr "OAuth end-point"
-
-#: ../../addon/uhremotestorage/uhremotestorage.php:87
-msgid "Api"
-msgstr "Api"
-
-#: ../../addon/membersince/membersince.php:18
-msgid "Member since:"
-msgstr "Membro dal:"
-
-#: ../../addon/tictac/tictac.php:20
-msgid "Three Dimensional Tic-Tac-Toe"
-msgstr "Tic-Tac-Toe tridimensionale"
-
-#: ../../addon/tictac/tictac.php:53
-msgid "3D Tic-Tac-Toe"
-msgstr "3D Tic-Tac-Toe"
-
-#: ../../addon/tictac/tictac.php:58
-msgid "New game"
-msgstr "Nuova partita"
-
-#: ../../addon/tictac/tictac.php:59
-msgid "New game with handicap"
-msgstr "Nuova partita con handicap"
-
-#: ../../addon/tictac/tictac.php:60
-msgid ""
-"Three dimensional tic-tac-toe is just like the traditional game except that "
-"it is played on multiple levels simultaneously. "
-msgstr "Tic-tac-toe tridimensionale è come il gioco tradizionale, solo che si gioca su livelli multipli contemporaneamente."
-
-#: ../../addon/tictac/tictac.php:61
-msgid ""
-"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."
-msgstr "In questo caso ci sono tre livelli. Puoi vincere mettendo tre segni in fila su ogni livello, anche verso l'alto, il basso e diagonalmente anche attraverso i diversi livelli."
-
-#: ../../addon/tictac/tictac.php:63
-msgid ""
-"The handicap game disables the center position on the middle level because "
-"the player claiming this square often has an unfair advantage."
-msgstr "L'handicap disabilita la casella centrale sul livello di mezzo, perchè il giocatore che si prende quella casella spesso ha un deciso vantaggio."
-
-#: ../../addon/tictac/tictac.php:182
-msgid "You go first..."
-msgstr "Cominci tu..."
-
-#: ../../addon/tictac/tictac.php:187
-msgid "I'm going first this time..."
-msgstr "Comincio io questa volta..."
-
-#: ../../addon/tictac/tictac.php:193
-msgid "You won!"
-msgstr "Hai vinto!"
-
-#: ../../addon/tictac/tictac.php:199 ../../addon/tictac/tictac.php:224
-msgid "\"Cat\" game!"
-msgstr "Stallo!"
-
-#: ../../addon/tictac/tictac.php:222
-msgid "I won!"
-msgstr "Ho vinto!"
-
-#: ../../addon/randplace/randplace.php:169
-msgid "Randplace Settings"
-msgstr "Impostazioni Randplace"
-
-#: ../../addon/randplace/randplace.php:171
-msgid "Enable Randplace Plugin"
-msgstr "Abilita il plugin Randplace"
-
-#: ../../addon/dwpost/dwpost.php:39
-msgid "Post to Dreamwidth"
-msgstr "Posta su Dreamwidth"
-
-#: ../../addon/dwpost/dwpost.php:70
-msgid "Dreamwidth Post Settings"
-msgstr "Impostazioni post Dreamwidth"
-
-#: ../../addon/dwpost/dwpost.php:72
-msgid "Enable dreamwidth Post Plugin"
-msgstr "Abilita il plugin dreamwidth"
-
-#: ../../addon/dwpost/dwpost.php:77
-msgid "dreamwidth username"
-msgstr "dreamwidth username"
+#: ../../mod/connections.php:330
+msgid "Edit contact"
+msgstr "Modifica il contatto"
-#: ../../addon/dwpost/dwpost.php:82
-msgid "dreamwidth password"
-msgstr "Password dreamwidth"
+#: ../../mod/connections.php:353
+msgid "Search your connections"
+msgstr "Cerca tra i contatti"
-#: ../../addon/dwpost/dwpost.php:87
-msgid "Post to dreamwidth by default"
-msgstr "Invia a dreamwidth per impostazione predefinita"
+#: ../../mod/connections.php:354
+msgid "Finding: "
+msgstr "Ricerca: "
-#: ../../addon/drpost/drpost.php:35
-msgid "Post to Drupal"
-msgstr "Invia a Drupal"
+#: ../../mod/layouts.php:52
+msgid "Layout Help"
+msgstr "Guida al layout"
-#: ../../addon/drpost/drpost.php:72
-msgid "Drupal Post Settings"
-msgstr "Impostazioni invio a Drupal"
+#: ../../mod/layouts.php:55
+msgid "Help with this feature"
+msgstr "La guida per questa funzionalità"
-#: ../../addon/drpost/drpost.php:74
-msgid "Enable Drupal Post Plugin"
-msgstr "Abilita il plugin di invio a Drupal"
+#: ../../mod/layouts.php:74
+msgid "Layout Name"
+msgstr "Nome layout"
-#: ../../addon/drpost/drpost.php:79
-msgid "Drupal username"
-msgstr "Drupal username"
+#: ../../mod/help.php:43 ../../mod/help.php:49 ../../mod/help.php:55
+msgid "Help:"
+msgstr "Guida:"
-#: ../../addon/drpost/drpost.php:84
-msgid "Drupal password"
-msgstr "Drupal password"
+#: ../../mod/help.php:68 ../../index.php:224
+msgid "Not Found"
+msgstr "Non disponibile"
-#: ../../addon/drpost/drpost.php:89
-msgid "Post Type - article,page,or blog"
-msgstr "Tipo di post - article,page o blog"
+#: ../../mod/rmagic.php:56
+msgid "Remote Authentication"
+msgstr "Autenticazione a distanza"
-#: ../../addon/drpost/drpost.php:94
-msgid "Drupal site URL"
-msgstr "Indirizzo del sito Drupal"
+#: ../../mod/rmagic.php:57
+msgid "Enter your channel address (e.g. channel@example.com)"
+msgstr "Inserisci l'indirizzo del tuo canale (ad esempio lucia@esempio.com)"
-#: ../../addon/drpost/drpost.php:99
-msgid "Drupal site uses clean URLS"
-msgstr "Il sito Drupal usa URL puliti"
+#: ../../mod/rmagic.php:58
+msgid "Authenticate"
+msgstr "Autenticazione"
-#: ../../addon/drpost/drpost.php:104
-msgid "Post to Drupal by default"
-msgstr "Invia a Drupal per impostazione predefinita"
+#: ../../mod/network.php:79
+msgid "No such group"
+msgstr "Impossibile trovare l'insieme"
-#: ../../addon/drpost/drpost.php:184 ../../addon/wppost/wppost.php:201
-#: ../../addon/blogger/blogger.php:172 ../../addon/posterous/posterous.php:189
-msgid "Post from Friendica"
-msgstr "Messaggio da Friendica"
+#: ../../mod/network.php:118
+msgid "Search Results For:"
+msgstr "Cerca risultati con:"
-#: ../../addon/startpage/startpage.php:83
-msgid "Startpage Settings"
-msgstr ""
+#: ../../mod/network.php:172
+msgid "Collection is empty"
+msgstr "L'insieme di canali è vuoto"
-#: ../../addon/startpage/startpage.php:85
-msgid "Home page to load after login - leave blank for profile wall"
-msgstr ""
+#: ../../mod/network.php:180
+msgid "Collection: "
+msgstr "Insieme:"
-#: ../../addon/startpage/startpage.php:88
-msgid "Examples: &quot;network&quot; or &quot;notifications/system&quot;"
-msgstr ""
+#: ../../mod/network.php:193
+msgid "Connection: "
+msgstr "Connessione:"
-#: ../../addon/geonames/geonames.php:143
-msgid "Geonames settings updated."
-msgstr "Impostazioni di geonames aggiornate."
+#: ../../mod/network.php:196
+msgid "Invalid connection."
+msgstr "Connessione non valida."
-#: ../../addon/geonames/geonames.php:179
-msgid "Geonames Settings"
-msgstr "Impostazioni Geonames"
+#: ../../mod/follow.php:25
+msgid "Channel added."
+msgstr "Canale aggiunto."
-#: ../../addon/geonames/geonames.php:181
-msgid "Enable Geonames Plugin"
-msgstr "Abilita plugin Geonames"
+#: ../../mod/post.php:226
+msgid ""
+"Remote authentication blocked. You are logged into this site locally. Please"
+" logout and retry."
+msgstr "L'autenticazione remota non è disponibile. Hai accesso solamente a questo sito. Puoi provare ad uscire per tentare di nuovo."
-#: ../../addon/public_server/public_server.php:126
-#: ../../addon/testdrive/testdrive.php:94
+#: ../../mod/post.php:256
#, php-format
-msgid "Your account on %s will expire in a few days."
-msgstr ""
+msgid "Welcome %s. Remote authentication successful."
+msgstr "Ciao %s. La tua autenticazione da remoto è avvenuta con successo."
-#: ../../addon/public_server/public_server.php:127
-msgid "Your Friendica account is about to expire."
-msgstr ""
+#: ../../mod/dirsearch.php:21
+msgid "This site is not a directory server"
+msgstr "Questo sito non fornisce l'elenco generale dei canali"
-#: ../../addon/public_server/public_server.php:128
-#, php-format
-msgid ""
-"Hi %1$s,\n"
-"\n"
-"Your 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"
-msgstr ""
+#: ../../mod/lockview.php:34
+msgid "Remote privacy information not available."
+msgstr "Le informazioni remote sulla privacy non sono disponibili."
-#: ../../addon/js_upload/js_upload.php:43
-msgid "Upload a file"
-msgstr "Carica un file"
+#: ../../mod/lockview.php:43
+msgid "Visible to:"
+msgstr "Visibile a:"
-#: ../../addon/js_upload/js_upload.php:44
-msgid "Drop files here to upload"
-msgstr "Trascina un file qui per caricarlo"
+#: ../../mod/magic.php:70
+msgid "Hub not found."
+msgstr "Server non trovato."
-#: ../../addon/js_upload/js_upload.php:46
-msgid "Failed"
-msgstr "Caricamento fallito"
+#: ../../mod/profiles.php:18 ../../mod/profiles.php:138
+#: ../../mod/profiles.php:168 ../../mod/profiles.php:475
+msgid "Profile not found."
+msgstr "Profilo non trovato."
-#: ../../addon/js_upload/js_upload.php:297
-msgid "No files were uploaded."
-msgstr "Nessun file è stato caricato."
+#: ../../mod/profiles.php:38
+msgid "Profile deleted."
+msgstr "Profilo eliminato."
-#: ../../addon/js_upload/js_upload.php:303
-msgid "Uploaded file is empty"
-msgstr "Il file caricato è vuoto"
+#: ../../mod/profiles.php:56 ../../mod/profiles.php:92
+msgid "Profile-"
+msgstr "Profilo-"
-#: ../../addon/js_upload/js_upload.php:326
-msgid "File has an invalid extension, it should be one of "
-msgstr "Il file ha un'estensione non valida, dovrebbe essere una tra "
+#: ../../mod/profiles.php:77 ../../mod/profiles.php:120
+msgid "New profile created."
+msgstr "Il nuovo profilo è stato creato."
-#: ../../addon/js_upload/js_upload.php:337
-msgid "Upload was cancelled, or server error encountered"
-msgstr "Il caricamento è stato cancellato, o si è verificato un errore sul server"
+#: ../../mod/profiles.php:98
+msgid "Profile unavailable to clone."
+msgstr "Impossibile duplicare il profilo."
-#: ../../addon/oembed.old/oembed.php:30
-msgid "OEmbed settings updated"
-msgstr "Impostazioni OEmbed aggiornate"
+#: ../../mod/profiles.php:178
+msgid "Profile Name is required."
+msgstr "Il nome del profilo è obbligatorio ."
-#: ../../addon/oembed.old/oembed.php:43
-msgid "Use OEmbed for YouTube videos"
-msgstr "Usa OEmbed per i video di YouTube"
+#: ../../mod/profiles.php:306
+msgid "Marital Status"
+msgstr "Stato sentimentale"
-#: ../../addon/oembed.old/oembed.php:71
-msgid "URL to embed:"
-msgstr "URL da incorporare:"
+#: ../../mod/profiles.php:310
+msgid "Romantic Partner"
+msgstr "Partner affettivo"
-#: ../../addon/forumlist/forumlist.php:58
-msgid "show/hide"
-msgstr ""
+#: ../../mod/profiles.php:314
+msgid "Likes"
+msgstr "Cosa gli piace"
-#: ../../addon/forumlist/forumlist.php:72
-msgid "No forum subscriptions"
-msgstr ""
+#: ../../mod/profiles.php:318
+msgid "Dislikes"
+msgstr "Cosa non gli piace"
-#: ../../addon/forumlist/forumlist.php:125
-msgid "Forumlist settings updated."
-msgstr ""
+#: ../../mod/profiles.php:322
+msgid "Work/Employment"
+msgstr "Lavoro/impiego"
-#: ../../addon/forumlist/forumlist.php:150
-msgid "Forumlist Settings"
-msgstr ""
+#: ../../mod/profiles.php:325
+msgid "Religion"
+msgstr "Religione"
-#: ../../addon/forumlist/forumlist.php:152
-msgid "Randomise forum list"
-msgstr ""
+#: ../../mod/profiles.php:329
+msgid "Political Views"
+msgstr "Orientamento politico"
-#: ../../addon/forumlist/forumlist.php:155
-msgid "Show forums on profile page"
-msgstr ""
+#: ../../mod/profiles.php:333
+msgid "Gender"
+msgstr "Sesso"
-#: ../../addon/impressum/impressum.php:37
-msgid "Impressum"
-msgstr "Impressum"
+#: ../../mod/profiles.php:337
+msgid "Sexual Preference"
+msgstr "Preferenze sessuali"
-#: ../../addon/impressum/impressum.php:50
-#: ../../addon/impressum/impressum.php:52
-#: ../../addon/impressum/impressum.php:84
-msgid "Site Owner"
-msgstr "Proprietario del sito"
+#: ../../mod/profiles.php:341
+msgid "Homepage"
+msgstr "Home page"
-#: ../../addon/impressum/impressum.php:50
-#: ../../addon/impressum/impressum.php:88
-msgid "Email Address"
-msgstr "Indirizzo email"
+#: ../../mod/profiles.php:345
+msgid "Interests"
+msgstr "Interessi"
-#: ../../addon/impressum/impressum.php:55
-#: ../../addon/impressum/impressum.php:86
-msgid "Postal Address"
+#: ../../mod/profiles.php:349
+msgid "Address"
msgstr "Indirizzo"
-#: ../../addon/impressum/impressum.php:61
-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 "Il plugin Impressum deve essere configurato!<br>Aggiungi almeno il Proprietario del sito."
-
-#: ../../addon/impressum/impressum.php:84
-msgid "The page operators name."
-msgstr "Nome del gestore della pagina."
-
-#: ../../addon/impressum/impressum.php:85
-msgid "Site Owners Profile"
-msgstr "Profilo del proprietario del sito"
-
-#: ../../addon/impressum/impressum.php:85
-msgid "Profile address of the operator."
-msgstr "Indirizzo del profilo del gestore della pagina"
-
-#: ../../addon/impressum/impressum.php:86
-msgid "How to contact the operator via snail mail. You can use BBCode here."
-msgstr ""
+#: ../../mod/profiles.php:356 ../../mod/pubsites.php:31
+msgid "Location"
+msgstr "Luogo attuale"
-#: ../../addon/impressum/impressum.php:87
-msgid "Notes"
-msgstr "Note"
+#: ../../mod/profiles.php:439
+msgid "Profile updated."
+msgstr "Profilo aggiornato."
-#: ../../addon/impressum/impressum.php:87
-msgid ""
-"Additional notes that are displayed beneath the contact information. You can"
-" use BBCode here."
-msgstr ""
+#: ../../mod/profiles.php:494
+msgid "Hide your contact/friend list from viewers of this profile?"
+msgstr "Nascondi la tua lista di contatti/amici ai visitatori di questo profilo?"
-#: ../../addon/impressum/impressum.php:88
-msgid "How to contact the operator via email. (will be displayed obfuscated)"
-msgstr ""
+#: ../../mod/profiles.php:517
+msgid "Edit Profile Details"
+msgstr "Modifica i dettagli del profilo"
-#: ../../addon/impressum/impressum.php:89
-msgid "Footer note"
-msgstr "Footer delle note"
+#: ../../mod/profiles.php:519
+msgid "View this profile"
+msgstr "Guarda questo profilo"
-#: ../../addon/impressum/impressum.php:89
-msgid "Text for the footer. You can use BBCode here."
-msgstr ""
+#: ../../mod/profiles.php:520
+msgid "Change Profile Photo"
+msgstr "Cambia la foto del profilo"
-#: ../../addon/buglink/buglink.php:15
-msgid "Report Bug"
-msgstr "Segnala un Bug"
+#: ../../mod/profiles.php:521
+msgid "Create a new profile using these settings"
+msgstr "Crea un nuovo profilo usando queste impostazioni"
-#: ../../addon/notimeline/notimeline.php:32
-msgid "No Timeline settings updated."
-msgstr ""
+#: ../../mod/profiles.php:522
+msgid "Clone this profile"
+msgstr "Clona questo profilo"
-#: ../../addon/notimeline/notimeline.php:56
-msgid "No Timeline Settings"
-msgstr ""
+#: ../../mod/profiles.php:523
+msgid "Delete this profile"
+msgstr "Elimina questo profilo"
-#: ../../addon/notimeline/notimeline.php:58
-msgid "Disable Archive selector on profile wall"
-msgstr ""
+#: ../../mod/profiles.php:524
+msgid "Profile Name:"
+msgstr "Nome del profilo:"
-#: ../../addon/blockem/blockem.php:51
-msgid "\"Blockem\" Settings"
-msgstr "Impostazioni \"Blockem\""
+#: ../../mod/profiles.php:525
+msgid "Your Full Name:"
+msgstr "Il tuo nome completo:"
-#: ../../addon/blockem/blockem.php:53
-msgid "Comma separated profile URLS to block"
-msgstr "Lista, separata da virgola, di indirizzi da bloccare"
+#: ../../mod/profiles.php:526
+msgid "Title/Description:"
+msgstr "Titolo/descrizione:"
-#: ../../addon/blockem/blockem.php:70
-msgid "BLOCKEM Settings saved."
-msgstr "Impostazioni salvate."
+#: ../../mod/profiles.php:527
+msgid "Your Gender:"
+msgstr "Sesso:"
-#: ../../addon/blockem/blockem.php:105
+#: ../../mod/profiles.php:528
#, php-format
-msgid "Blocked %s - Click to open/close"
-msgstr "%s bloccato - Clicca per aprire/chiudere"
-
-#: ../../addon/blockem/blockem.php:160
-msgid "Unblock Author"
-msgstr "Sblocca autore"
+msgid "Birthday (%s):"
+msgstr "Compleanno (%s):"
-#: ../../addon/blockem/blockem.php:162
-msgid "Block Author"
-msgstr "Blocca autore"
+#: ../../mod/profiles.php:529
+msgid "Street Address:"
+msgstr "Indirizzo (via/piazza):"
-#: ../../addon/blockem/blockem.php:194
-msgid "blockem settings updated"
-msgstr "Impostazioni 'blockem' aggiornate."
+#: ../../mod/profiles.php:530
+msgid "Locality/City:"
+msgstr "Località:"
-#: ../../addon/qcomment/qcomment.php:51
-msgid ":-)"
-msgstr ":-)"
+#: ../../mod/profiles.php:531
+msgid "Postal/Zip Code:"
+msgstr "CAP:"
-#: ../../addon/qcomment/qcomment.php:51
-msgid ":-("
-msgstr ":-("
+#: ../../mod/profiles.php:532
+msgid "Country:"
+msgstr "Nazione:"
-#: ../../addon/qcomment/qcomment.php:51
-msgid "lol"
-msgstr "lol"
+#: ../../mod/profiles.php:533
+msgid "Region/State:"
+msgstr "Regione/stato:"
-#: ../../addon/qcomment/qcomment.php:54
-msgid "Quick Comment Settings"
-msgstr "Impostazioni commento rapido"
+#: ../../mod/profiles.php:534
+msgid "<span class=\"heart\">&hearts;</span> Marital Status:"
+msgstr "<span class=\"heart\">&hearts;</span> Stato sentimentale:"
-#: ../../addon/qcomment/qcomment.php:56
-msgid ""
-"Quick comments are found near comment boxes, sometimes hidden. Click them to"
-" provide simple replies."
-msgstr "Trovi i commenti rapidi vicino al box dei commenti, a volte nascosti. Cliccali per inviare semplici risposte."
+#: ../../mod/profiles.php:535
+msgid "Who: (if applicable)"
+msgstr "Con chi: (se possibile)"
-#: ../../addon/qcomment/qcomment.php:57
-msgid "Enter quick comments, one per line"
-msgstr "Inserire un commento rapido, uno per linea"
+#: ../../mod/profiles.php:536
+msgid "Examples: cathy123, Cathy Williams, cathy@example.com"
+msgstr "Per esempio: cathy123, Cathy Williams, cathy@example.com"
-#: ../../addon/qcomment/qcomment.php:75
-msgid "Quick Comment settings saved."
-msgstr "Impostazioni commento rapido salvate."
+#: ../../mod/profiles.php:537
+msgid "Since [date]:"
+msgstr "dal [data]:"
-#: ../../addon/openstreetmap/openstreetmap.php:71
-msgid "Tile Server URL"
-msgstr ""
+#: ../../mod/profiles.php:539
+msgid "Homepage URL:"
+msgstr "Indirizzo home page:"
-#: ../../addon/openstreetmap/openstreetmap.php:71
-msgid ""
-"A list of <a href=\"http://wiki.openstreetmap.org/wiki/TMS\" "
-"target=\"_blank\">public tile servers</a>"
-msgstr ""
+#: ../../mod/profiles.php:542
+msgid "Religious Views:"
+msgstr "Orientamento religioso:"
-#: ../../addon/openstreetmap/openstreetmap.php:72
-msgid "Default zoom"
-msgstr "Default zoom"
+#: ../../mod/profiles.php:543
+msgid "Keywords:"
+msgstr "Parole chiave, tag:"
-#: ../../addon/openstreetmap/openstreetmap.php:72
-msgid "The default zoom level. (1:world, 18:highest)"
-msgstr ""
+#: ../../mod/profiles.php:546
+msgid "Example: fishing photography software"
+msgstr "Per esempio: pesca fotografia programmazione"
-#: ../../addon/group_text/group_text.php:46
-#: ../../addon/editplain/editplain.php:46
-msgid "Editplain settings updated."
-msgstr "Impostazioni 'Editplain' aggiornate."
+#: ../../mod/profiles.php:547
+msgid "Used in directory listings"
+msgstr "Visibile nell'elenco pubblico di canali"
-#: ../../addon/group_text/group_text.php:76
-msgid "Group Text"
-msgstr ""
+#: ../../mod/profiles.php:548
+msgid "Tell us about yourself..."
+msgstr "Raccontaci di te..."
-#: ../../addon/group_text/group_text.php:78
-msgid "Use a text only (non-image) group selector in the \"group edit\" menu"
-msgstr ""
+#: ../../mod/profiles.php:549
+msgid "Hobbies/Interests"
+msgstr "Hobby/interessi"
-#: ../../addon/libravatar/libravatar.php:14
-msgid "Could NOT install Libravatar successfully.<br>It requires PHP >= 5.3"
-msgstr ""
+#: ../../mod/profiles.php:550
+msgid "Contact information and Social Networks"
+msgstr "Contatti personali e i tuoi social network"
-#: ../../addon/libravatar/libravatar.php:73
-#: ../../addon/gravatar/gravatar.php:71
-msgid "generic profile image"
-msgstr "immagine generica del profilo"
+#: ../../mod/profiles.php:551
+msgid "My other channels"
+msgstr "I miei altri canali"
-#: ../../addon/libravatar/libravatar.php:74
-#: ../../addon/gravatar/gravatar.php:72
-msgid "random geometric pattern"
-msgstr ""
+#: ../../mod/profiles.php:552
+msgid "Musical interests"
+msgstr "Interessi musicali"
-#: ../../addon/libravatar/libravatar.php:75
-#: ../../addon/gravatar/gravatar.php:73
-msgid "monster face"
-msgstr ""
+#: ../../mod/profiles.php:553
+msgid "Books, literature"
+msgstr "Libri, letteratura"
-#: ../../addon/libravatar/libravatar.php:76
-#: ../../addon/gravatar/gravatar.php:74
-msgid "computer generated face"
-msgstr ""
+#: ../../mod/profiles.php:554
+msgid "Television"
+msgstr "Televisione"
-#: ../../addon/libravatar/libravatar.php:77
-#: ../../addon/gravatar/gravatar.php:75
-msgid "retro arcade style face"
-msgstr ""
+#: ../../mod/profiles.php:555
+msgid "Film/dance/culture/entertainment"
+msgstr "Film/danza/cultura/intrattenimento"
-#: ../../addon/libravatar/libravatar.php:83
-#, php-format
-msgid "Your PHP version %s is lower than the required PHP >= 5.3."
-msgstr ""
+#: ../../mod/profiles.php:556
+msgid "Love/romance"
+msgstr "Amore"
-#: ../../addon/libravatar/libravatar.php:84
-msgid "This addon is not functional on your server."
-msgstr ""
+#: ../../mod/profiles.php:557
+msgid "Work/employment"
+msgstr "Lavoro/impiego"
-#: ../../addon/libravatar/libravatar.php:93
-#: ../../addon/gravatar/gravatar.php:89
-msgid "Information"
-msgstr ""
+#: ../../mod/profiles.php:558
+msgid "School/education"
+msgstr "Scuola/educazione"
-#: ../../addon/libravatar/libravatar.php:93
+#: ../../mod/profiles.php:563
msgid ""
-"Gravatar addon is installed. Please disable the Gravatar addon.<br>The "
-"Libravatar addon will fall back to Gravatar if nothing was found at "
-"Libravatar."
-msgstr ""
-
-#: ../../addon/libravatar/libravatar.php:100
-#: ../../addon/gravatar/gravatar.php:96
-msgid "Default avatar image"
-msgstr ""
-
-#: ../../addon/libravatar/libravatar.php:100
-msgid "Select default avatar image if none was found. See README"
-msgstr ""
-
-#: ../../addon/libravatar/libravatar.php:112
-msgid "Libravatar settings updated."
-msgstr ""
-
-#: ../../addon/libertree/libertree.php:36
-msgid "Post to libertree"
-msgstr ""
-
-#: ../../addon/libertree/libertree.php:67
-msgid "libertree Post Settings"
-msgstr ""
-
-#: ../../addon/libertree/libertree.php:69
-msgid "Enable Libertree Post Plugin"
-msgstr ""
-
-#: ../../addon/libertree/libertree.php:74
-msgid "Libertree API token"
-msgstr ""
-
-#: ../../addon/libertree/libertree.php:79
-msgid "Libertree site URL"
-msgstr ""
-
-#: ../../addon/libertree/libertree.php:84
-msgid "Post to Libertree by default"
-msgstr ""
-
-#: ../../addon/altpager/altpager.php:46
-msgid "Altpager settings updated."
-msgstr ""
-
-#: ../../addon/altpager/altpager.php:79
-msgid "Alternate Pagination Setting"
-msgstr ""
+"This is your <strong>public</strong> profile.<br />It <strong>may</strong> "
+"be visible to anybody using the internet."
+msgstr "Questo è il tuo profilo <strong>publico</strong>.<br /><strong>Potrebbe</strong> essere visto da chiunque attraverso internet."
-#: ../../addon/altpager/altpager.php:81
-msgid "Use links to \"newer\" and \"older\" pages in place of page numbers?"
-msgstr ""
+#: ../../mod/profiles.php:612
+msgid "Edit/Manage Profiles"
+msgstr "Modifica/gestisci i profili"
-#: ../../addon/mathjax/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 ""
+#: ../../mod/profiles.php:613
+msgid "Add profile things"
+msgstr "Aggiungi oggetti al profilo"
-#: ../../addon/mathjax/mathjax.php:38
-msgid "Use the MathJax renderer"
-msgstr ""
+#: ../../mod/profiles.php:614
+msgid "Include desirable objects in your profile"
+msgstr "Aggiungi oggetti interessanti al tuo profilo"
-#: ../../addon/mathjax/mathjax.php:74
-msgid "MathJax Base URL"
-msgstr ""
+#: ../../mod/new_channel.php:107
+msgid "Add a Channel"
+msgstr "Aggiungi un canale"
-#: ../../addon/mathjax/mathjax.php:74
+#: ../../mod/new_channel.php:108
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 ""
+"A channel is your own collection of related web pages. A channel can be used"
+" to hold social network profiles, blogs, conversation groups and forums, "
+"celebrity pages, and much more. You may create as many channels as your "
+"service provider allows."
+msgstr "I contenuti che pubblichi finiscono in un \"canale\". Un canale può essere usato per mantenere un tuo profilo personale, per avere un blog, per creare forum di discussione o gruppi di interesse, per pagine di celebrità e molto altro. Puoi creare quanti canali vuoi a meno di limiti dati dal gestore del sito."
-#: ../../addon/editplain/editplain.php:76
-msgid "Editplain Settings"
-msgstr "Impostazioni Editplain"
+#: ../../mod/new_channel.php:111
+msgid "Examples: \"Bob Jameson\", \"Lisa and her Horses\", \"Soccer\", \"Aviation Group\" "
+msgstr "Per esempio: \"Mario Rossi\", \"Lisa e le sue ricette\", \"Il campionato\", \"Il gruppo di escursionismo\""
-#: ../../addon/editplain/editplain.php:78
-msgid "Disable richtext status editor"
-msgstr "Disabilita l'editor di testo visuale"
+#: ../../mod/new_channel.php:112
+msgid "Choose a short nickname"
+msgstr "Scegli un nome breve"
-#: ../../addon/gravatar/gravatar.php:89
+#: ../../mod/new_channel.php:113
msgid ""
-"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."
-msgstr ""
+"Your nickname will be used to create an easily remembered channel address "
+"(like an email address) which you can share with others."
+msgstr "Il nome breve sarà usato per creare un indirizzo facile da ricordare per il tuo canale (simile a una email). Così potrai condividerlo e gli altri potranno trovarti."
-#: ../../addon/gravatar/gravatar.php:96
-msgid "Select default avatar image if none was found at Gravatar. See README"
-msgstr ""
+#: ../../mod/new_channel.php:114
+msgid "Or <a href=\"import\">import an existing channel</a> from another location"
+msgstr "Oppure <a href=\"import\">importa un tuo canale esistente</a> da un altro server/hub"
-#: ../../addon/gravatar/gravatar.php:97
-msgid "Rating of images"
-msgstr ""
+#: ../../mod/filestorage.php:68
+msgid "Permission Denied."
+msgstr "Permesso negato."
-#: ../../addon/gravatar/gravatar.php:97
-msgid "Select the appropriate avatar rating for your site. See README"
-msgstr ""
+#: ../../mod/filestorage.php:86
+msgid "File not found."
+msgstr "File non trovato."
-#: ../../addon/gravatar/gravatar.php:111
-msgid "Gravatar settings updated."
-msgstr ""
+#: ../../mod/filestorage.php:120
+msgid "Edit file permissions"
+msgstr "Modifica i permessi del file"
-#: ../../addon/testdrive/testdrive.php:95
-msgid "Your Friendica test account is about to expire."
-msgstr ""
+#: ../../mod/filestorage.php:127
+msgid "Include all files and sub folders"
+msgstr "Includi tutti i file e le sottocartelle"
-#: ../../addon/testdrive/testdrive.php:96
-#, php-format
-msgid ""
-"Hi %1$s,\n"
-"\n"
-"Your 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 http://dir.friendica.com/siteinfo - and for more information on setting up your own Friendica server please see the Friendica project website at http://friendica.com."
-msgstr ""
+#: ../../mod/filestorage.php:128
+msgid "Return to file list"
+msgstr "Torna all'elenco dei file"
-#: ../../addon/pageheader/pageheader.php:50
-msgid "\"pageheader\" Settings"
-msgstr "Impostazioni \"pageheader\""
+#: ../../mod/filestorage.php:130
+msgid "Copy/paste this code to attach file to a post"
+msgstr "Copia/incolla questo codice per far comparire il file in un articolo"
-#: ../../addon/pageheader/pageheader.php:68
-msgid "pageheader Settings saved."
-msgstr "Impostazioni salvate."
+#: ../../mod/filestorage.php:131
+msgid "Copy/paste this URL to link file from a web page"
+msgstr "Copia/incolla questo indirizzo in una pagina web per avere un link al file"
-#: ../../addon/ijpost/ijpost.php:39
-msgid "Post to Insanejournal"
-msgstr ""
+#: ../../mod/filestorage.php:168
+msgid "Download"
+msgstr "Scaricamento dati"
-#: ../../addon/ijpost/ijpost.php:70
-msgid "InsaneJournal Post Settings"
-msgstr ""
+#: ../../mod/filestorage.php:174
+msgid "Used: "
+msgstr "Usato:"
-#: ../../addon/ijpost/ijpost.php:72
-msgid "Enable InsaneJournal Post Plugin"
-msgstr ""
+#: ../../mod/filestorage.php:175
+msgid "[directory]"
+msgstr "[cartella]"
-#: ../../addon/ijpost/ijpost.php:77
-msgid "InsaneJournal username"
-msgstr ""
+#: ../../mod/filestorage.php:177
+msgid "Limit: "
+msgstr "Limite:"
-#: ../../addon/ijpost/ijpost.php:82
-msgid "InsaneJournal password"
-msgstr ""
+#: ../../mod/lostpass.php:15
+msgid "No valid account found."
+msgstr "Nessun account valido trovato."
-#: ../../addon/ijpost/ijpost.php:87
-msgid "Post to InsaneJournal by default"
-msgstr ""
+#: ../../mod/lostpass.php:29
+msgid "Password reset request issued. Check your email."
+msgstr "La richiesta per reimpostare la password è stata inviata. Controlla la tua email."
-#: ../../addon/jappixmini/jappixmini.php:266
-msgid "Jappix Mini addon settings"
-msgstr ""
+#: ../../mod/lostpass.php:35 ../../mod/lostpass.php:102
+#, php-format
+msgid "Site Member (%s)"
+msgstr "Utente del sito (%s)"
-#: ../../addon/jappixmini/jappixmini.php:268
-msgid "Activate addon"
-msgstr ""
+#: ../../mod/lostpass.php:40
+#, php-format
+msgid "Password reset requested at %s"
+msgstr "È stato richiesto di reimpostare password su %s"
-#: ../../addon/jappixmini/jappixmini.php:271
+#: ../../mod/lostpass.php:63
msgid ""
-"Do <em>not</em> insert the Jappixmini Chat-Widget into the webinterface"
-msgstr ""
-
-#: ../../addon/jappixmini/jappixmini.php:274
-msgid "Jabber username"
-msgstr ""
-
-#: ../../addon/jappixmini/jappixmini.php:277
-msgid "Jabber server"
-msgstr ""
-
-#: ../../addon/jappixmini/jappixmini.php:281
-msgid "Jabber BOSH host"
-msgstr ""
-
-#: ../../addon/jappixmini/jappixmini.php:285
-msgid "Jabber password"
-msgstr ""
-
-#: ../../addon/jappixmini/jappixmini.php:290
-msgid "Encrypt Jabber password with Friendica password (recommended)"
-msgstr ""
-
-#: ../../addon/jappixmini/jappixmini.php:293
-msgid "Friendica password"
-msgstr ""
-
-#: ../../addon/jappixmini/jappixmini.php:296
-msgid "Approve subscription requests from Friendica contacts automatically"
-msgstr ""
+"Request could not be verified. (You may have previously submitted it.) "
+"Password reset failed."
+msgstr "La richiesta non può essere verificata (potresti averla già usata precedentemente). La password non può essere reimpostata."
-#: ../../addon/jappixmini/jappixmini.php:299
-msgid "Subscribe to Friendica contacts automatically"
-msgstr ""
+#: ../../mod/lostpass.php:85 ../../boot.php:1426
+msgid "Password Reset"
+msgstr "Reimposta la password"
-#: ../../addon/jappixmini/jappixmini.php:302
-msgid "Purge internal list of jabber addresses of contacts"
-msgstr ""
+#: ../../mod/lostpass.php:86
+msgid "Your password has been reset as requested."
+msgstr "La password è stata reimpostata come richiesto."
-#: ../../addon/jappixmini/jappixmini.php:308
-msgid "Add contact"
-msgstr ""
+#: ../../mod/lostpass.php:87
+msgid "Your new password is"
+msgstr "La tua nuova password è"
-#: ../../addon/viewsrc/viewsrc.php:37
-msgid "View Source"
-msgstr "Vedi sorgente"
+#: ../../mod/lostpass.php:88
+msgid "Save or copy your new password - and then"
+msgstr "Salva o copia la tua nuova password, quindi"
-#: ../../addon/statusnet/statusnet.php:134
-msgid "Post to StatusNet"
-msgstr "Invia a StatusNet"
+#: ../../mod/lostpass.php:89
+msgid "click here to login"
+msgstr "clicca qui per accedere"
-#: ../../addon/statusnet/statusnet.php:176
+#: ../../mod/lostpass.php:90
msgid ""
-"Please contact your site administrator.<br />The provided API URL is not "
-"valid."
-msgstr "Contatta l'amministratore del sito.<br/>L'URL delle API fornito non è valido."
-
-#: ../../addon/statusnet/statusnet.php:204
-msgid "We could not contact the StatusNet API with the Path you entered."
-msgstr "Non possiamo conttattare le API di StatusNet con il percorso che hai inserito."
-
-#: ../../addon/statusnet/statusnet.php:232
-msgid "StatusNet settings updated."
-msgstr "Impostazioni StatusNet aggiornate."
-
-#: ../../addon/statusnet/statusnet.php:257
-msgid "StatusNet Posting Settings"
-msgstr "Impostazioni di invio a StatusNet"
-
-#: ../../addon/statusnet/statusnet.php:271
-msgid "Globally Available StatusNet OAuthKeys"
-msgstr "OAuthKeys globali di StatusNet"
+"Your password may be changed from the <em>Settings</em> page after "
+"successful login."
+msgstr "Puoi cambiare la tua password dalla pagina delle <em>Impostazioni</em> dopo aver effettuato l'accesso."
-#: ../../addon/statusnet/statusnet.php:272
-msgid ""
-"There are preconfigured OAuth key pairs for some StatusNet servers "
-"available. If you are useing one of them, please use these credentials. If "
-"not feel free to connect to any other StatusNet instance (see below)."
-msgstr "Esistono coppie di chiavi OAuth precofigurate per alcuni server StatusNet. Se usi uno di questi server, per favore scegli queste credenziali. Altrimenti sei libero di collegarti a un'altra installazione di StatusNet (vedi sotto)."
+#: ../../mod/lostpass.php:107
+#, php-format
+msgid "Your password has changed at %s"
+msgstr "La tua password su %s è cambiata"
-#: ../../addon/statusnet/statusnet.php:280
-msgid "Provide your own OAuth Credentials"
-msgstr "Fornisci le tue credenziali OAuth"
+#: ../../mod/lostpass.php:122
+msgid "Forgot your Password?"
+msgstr "Hai dimenticato la password?"
-#: ../../addon/statusnet/statusnet.php:281
-msgid ""
-"No consumer key pair for StatusNet found. Register your Friendica Account as"
-" an desktop client on your StatusNet 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 StatusNet installation."
-msgstr "Nessuna coppia di chiavi consumer trovate per StatusNet. Registra il tuo account Friendica come un client desktop nel tuo account StatusNet, copia la coppia di chiavi consumer qui e inserisci l'url base delle API.<br/>Prima di registrare la tua coppia di chiavi OAuth, chiedi all'amministratore se esiste già una coppia di chiavi per questo sito Friendica presso la tua installazione StatusNet preferita."
-
-#: ../../addon/statusnet/statusnet.php:283
-msgid "OAuth Consumer Key"
-msgstr "OAuth Consumer Key"
-
-#: ../../addon/statusnet/statusnet.php:286
-msgid "OAuth Consumer Secret"
-msgstr "OAuth Consumer Secret"
-
-#: ../../addon/statusnet/statusnet.php:289
-msgid "Base API Path (remember the trailing /)"
-msgstr "Indirizzo di base per le API (ricorda la / alla fine)"
-
-#: ../../addon/statusnet/statusnet.php:310
+#: ../../mod/lostpass.php:123
msgid ""
-"To connect to your StatusNet account click the button below to get a "
-"security code from StatusNet which you have to copy into the input box below"
-" and submit the form. Only your <strong>public</strong> posts will be posted"
-" to StatusNet."
-msgstr "Per collegare il tuo account StatusNet, clicca sul bottone per ottenere un codice di sicurezza da StatusNet, che dovrai copiare nel box sottostante e poi inviare la form. Solo i tuoi messaggi <strong>pubblici</strong> saranno inviati a StatusNet."
-
-#: ../../addon/statusnet/statusnet.php:311
-msgid "Log in with StatusNet"
-msgstr "Accedi con StatuNet"
-
-#: ../../addon/statusnet/statusnet.php:313
-msgid "Copy the security code from StatusNet here"
-msgstr "Copia il codice di sicurezza da StatusNet qui"
+"Enter your email address and submit to have your password reset. Then check "
+"your email for further instructions."
+msgstr "Inserisci il tuo indirizzo email per reimpostare la password. Dopo aver inviato la richiesta, controlla l'email e troverai le istruzioni per continuare."
-#: ../../addon/statusnet/statusnet.php:319
-msgid "Cancel Connection Process"
-msgstr "Annulla il processo di connessione"
+#: ../../mod/lostpass.php:124
+msgid "Email Address"
+msgstr "Indirizzo email"
-#: ../../addon/statusnet/statusnet.php:321
-msgid "Current StatusNet API is"
-msgstr "Le API StatusNet correnti sono"
+#: ../../mod/lostpass.php:125
+msgid "Reset"
+msgstr "Reimposta"
-#: ../../addon/statusnet/statusnet.php:322
-msgid "Cancel StatusNet Connection"
-msgstr "Annulla la connessione a StatusNet"
+#: ../../mod/import.php:36
+msgid "Nothing to import."
+msgstr "Non c'è niente da importare."
-#: ../../addon/statusnet/statusnet.php:333 ../../addon/twitter/twitter.php:189
-msgid "Currently connected to: "
-msgstr "Al momento connesso con:"
+#: ../../mod/import.php:58
+msgid "Unable to download data from old server"
+msgstr "Impossibile importare i dati dal vecchio server"
-#: ../../addon/statusnet/statusnet.php:334
-msgid ""
-"If enabled all your <strong>public</strong> postings can be posted to the "
-"associated StatusNet 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 StatusNet associato. Puoi scegliere di farlo sempre (qui) o ogni volta che invii, nelle impostazioni di privacy del messaggio."
+#: ../../mod/import.php:64
+msgid "Imported file is empty."
+msgstr "Il file da importare è vuoto."
-#: ../../addon/statusnet/statusnet.php:336
+#: ../../mod/import.php:88
msgid ""
-"<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 StatusNet will lead the visitor to a blank page "
-"informing the visitor that the access to your profile has been restricted."
-msgstr ""
-
-#: ../../addon/statusnet/statusnet.php:339
-msgid "Allow posting to StatusNet"
-msgstr "Permetti l'invio a StatusNet"
+"Cannot create a duplicate channel identifier on this system. Import failed."
+msgstr "Non posso creare un canale con un identificativo che già esiste su questo sistema. L'importazione è fallita."
-#: ../../addon/statusnet/statusnet.php:342
-msgid "Send public postings to StatusNet by default"
-msgstr "Invia sempre i messaggi pubblici a StatusNet"
+#: ../../mod/import.php:106
+msgid "Channel clone failed. Import failed."
+msgstr "Impossibile clonare il canale. L'importazione è fallita."
-#: ../../addon/statusnet/statusnet.php:345
-msgid "Send linked #-tags and @-names to StatusNet"
-msgstr ""
+#: ../../mod/import.php:116
+msgid "Cloned channel not found. Import failed."
+msgstr "Impossibile trovare il canale clonato. L'importazione è fallita."
-#: ../../addon/statusnet/statusnet.php:350 ../../addon/twitter/twitter.php:206
-msgid "Clear OAuth configuration"
-msgstr "Rimuovi la configurazione OAuth"
+#: ../../mod/import.php:358
+msgid "Import completed."
+msgstr "L'importazione è terminata con successo!"
-#: ../../addon/statusnet/statusnet.php:568
-msgid "API URL"
-msgstr "API URL"
-
-#: ../../addon/infiniteimprobabilitydrive/infiniteimprobabilitydrive.php:19
-msgid "Infinite Improbability Drive"
-msgstr ""
+#: ../../mod/import.php:371
+msgid "You must be logged in to use this feature."
+msgstr "Per questa funzionalità devi aver effettuato l'accesso."
-#: ../../addon/tumblr/tumblr.php:36
-msgid "Post to Tumblr"
-msgstr "Pubblica su Tumblr"
+#: ../../mod/import.php:376
+msgid "Import Channel"
+msgstr "Importa un canale"
-#: ../../addon/tumblr/tumblr.php:67
-msgid "Tumblr Post Settings"
-msgstr "Impostazioni di invio a Tumblr"
-
-#: ../../addon/tumblr/tumblr.php:69
-msgid "Enable Tumblr Post Plugin"
-msgstr "Abilita Plugin Tumblr"
-
-#: ../../addon/tumblr/tumblr.php:74
-msgid "Tumblr login"
-msgstr "Tumblr login"
-
-#: ../../addon/tumblr/tumblr.php:79
-msgid "Tumblr password"
-msgstr "Tumblr password"
+#: ../../mod/import.php:377
+msgid ""
+"Use this form to import an existing channel from a different server/hub. You"
+" may retrieve the channel identity from the old server/hub via the network "
+"or provide an export file. Only identity and connections/relationships will "
+"be imported. Importation of content is not yet available."
+msgstr "Usa questo modulo per importare un tuo canale da un altro server/hub. Puoi scaricare i dati identificativi del canale direttamente dall'altro server/hub oppure tramite un file che hai esportato. Saranno importati solamente l'identità e i contatti. L'importazione dei contenuti non è ancora disponibile."
-#: ../../addon/tumblr/tumblr.php:84
-msgid "Post to Tumblr by default"
-msgstr "Pubblica su Tumblr di default"
+#: ../../mod/import.php:378
+msgid "File to Upload"
+msgstr "File da caricare"
-#: ../../addon/numfriends/numfriends.php:46
-msgid "Numfriends settings updated."
-msgstr "Impostazioni \"Numfriends' aggiornate."
+#: ../../mod/import.php:379
+msgid "Or provide the old server/hub details"
+msgstr "Oppure fornisci i dettagli del vecchio server/hub"
-#: ../../addon/numfriends/numfriends.php:77
-msgid "Numfriends Settings"
-msgstr "Impostazioni Numfriends"
+#: ../../mod/import.php:380
+msgid "Your old identity address (xyz@example.com)"
+msgstr "Il tuo vecchio identificativo (per esempio pippo@esempio.com)"
-#: ../../addon/gnot/gnot.php:48
-msgid "Gnot settings updated."
-msgstr "Impostazioni di \"Gnot\" aggiornate."
+#: ../../mod/import.php:381
+msgid "Your old login email address"
+msgstr "L'email che usavi per accedere sul vecchio server"
-#: ../../addon/gnot/gnot.php:79
-msgid "Gnot Settings"
-msgstr "Impostazioni Gnot"
+#: ../../mod/import.php:382
+msgid "Your old login password"
+msgstr "La password per il vecchio server"
-#: ../../addon/gnot/gnot.php:81
+#: ../../mod/import.php:383
msgid ""
-"Allows threading of email comment notifications on Gmail and anonymising the"
-" subject line."
-msgstr "Permetti di raggruppare le notifiche dei commenti in thread su Gmail e anonimizza l'oggetto"
+"For either option, please choose whether to make this hub your new primary "
+"address, or whether your old location should continue this role. You will be"
+" able to post from either location, but only one can be marked as the "
+"primary location for files, photos, and media."
+msgstr "Per ciascuna opzione, scegli se vuoi rendere questo server il tuo indirizzo primario, oppure se preferisci che lo rimanga il vecchio. Potrai pubblicare da entrambi i server, ma solamente uno sarà marcato come primario per i tuoi file, foto, ecc."
-#: ../../addon/gnot/gnot.php:82
-msgid "Enable this plugin/addon?"
-msgstr "Abilita questo plugin?"
+#: ../../mod/import.php:384
+msgid "Make this hub my primary location"
+msgstr "Rendi questo server il mio indirizzo primario"
-#: ../../addon/gnot/gnot.php:97
+#: ../../mod/manage.php:63
#, php-format
-msgid "[Friendica:Notify] Comment to conversation #%d"
-msgstr "[Friendica:Notifica] Commento alla conversazione #%d"
+msgid "You have created %1$.0f of %2$.0f allowed channels."
+msgstr "Hai creato %1$.0f dei %2$.0f canali permessi."
-#: ../../addon/wppost/wppost.php:42
-msgid "Post to Wordpress"
-msgstr "Pubblica su Wordpress"
+#: ../../mod/manage.php:71
+msgid "Create a new channel"
+msgstr "Crea un nuovo canale"
-#: ../../addon/wppost/wppost.php:76
-msgid "WordPress Post Settings"
-msgstr "Impostazioni invio a WordPress"
+#: ../../mod/manage.php:76
+msgid "Channel Manager"
+msgstr "Gestione canali"
-#: ../../addon/wppost/wppost.php:78
-msgid "Enable WordPress Post Plugin"
-msgstr "Abilita plugin \"invia a WordPress\""
+#: ../../mod/manage.php:77
+msgid "Current Channel"
+msgstr "Canale attuale"
-#: ../../addon/wppost/wppost.php:83
-msgid "WordPress username"
-msgstr "nome utente WordPress"
+#: ../../mod/manage.php:79
+msgid "Attach to one of your channels by selecting it."
+msgstr "Seleziona il canale a cui vuoi passare."
-#: ../../addon/wppost/wppost.php:88
-msgid "WordPress password"
-msgstr "password WordPress"
+#: ../../mod/manage.php:80
+msgid "Default Channel"
+msgstr "Canale predefinito"
-#: ../../addon/wppost/wppost.php:93
-msgid "WordPress API URL"
-msgstr "WordPress API URL"
+#: ../../mod/manage.php:81
+msgid "Make Default"
+msgstr "Rendi predefinito"
-#: ../../addon/wppost/wppost.php:98
-msgid "Post to WordPress by default"
-msgstr "Pubblica su WordPress di default"
+#: ../../mod/vote.php:97
+msgid "Total votes"
+msgstr "Totale voti"
-#: ../../addon/wppost/wppost.php:103
-msgid "Provide a backlink to the Friendica post"
-msgstr ""
-
-#: ../../addon/wppost/wppost.php:207
-msgid "Read the original post and comment stream on Friendica"
-msgstr ""
-
-#: ../../addon/showmore/showmore.php:38
-msgid "\"Show more\" Settings"
-msgstr "Impostazioni \"Mostra altro\""
-
-#: ../../addon/showmore/showmore.php:41
-msgid "Enable Show More"
-msgstr "Abilita \"Mostra altro\""
-
-#: ../../addon/showmore/showmore.php:44
-msgid "Cutting posts after how much characters"
-msgstr ""
-
-#: ../../addon/showmore/showmore.php:65
-msgid "Show More Settings saved."
-msgstr "Impostazioni \"Mostra altro\" salvate."
-
-#: ../../addon/piwik/piwik.php:79
-msgid ""
-"This website is tracked using the <a href='http://www.piwik.org'>Piwik</a> "
-"analytics tool."
-msgstr "Questo sito è monitorato con lo strumento di analisi <a href='http://www.piwik.org'>Piwik</a>."
-
-#: ../../addon/piwik/piwik.php:82
-#, php-format
-msgid ""
-"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)."
-msgstr "Se non vuoi che le tue visite vengono registrate in questo modo è possibile <a href='%s'>impostare un cookie per evitare che Piwik rintracci ulteriori visite del sito</a> (opt-out)."
-
-#: ../../addon/piwik/piwik.php:90
-msgid "Piwik Base URL"
-msgstr "Piwik Base URL"
-
-#: ../../addon/piwik/piwik.php:90
-msgid ""
-"Absolute path to your Piwik installation. (without protocol (http/s), with "
-"trailing slash)"
-msgstr ""
+#: ../../mod/vote.php:98
+msgid "Average Rating"
+msgstr "Media"
-#: ../../addon/piwik/piwik.php:91
-msgid "Site ID"
-msgstr "Site ID"
+#: ../../mod/match.php:16
+msgid "Profile Match"
+msgstr "Profili corrispondenti"
-#: ../../addon/piwik/piwik.php:92
-msgid "Show opt-out cookie link?"
-msgstr "Mostra il link per il cookie opt-out?"
+#: ../../mod/match.php:24
+msgid "No keywords to match. Please add keywords to your default profile."
+msgstr "Nessuna parola chiave per le ricerche. Aggiungi parole chiave al tuo profilo predefinito."
-#: ../../addon/piwik/piwik.php:93
-msgid "Asynchronous tracking"
-msgstr ""
+#: ../../mod/match.php:61
+msgid "is interested in:"
+msgstr "interessi personali:"
-#: ../../addon/twitter/twitter.php:73
-msgid "Post to Twitter"
-msgstr "Invia a Twitter"
+#: ../../mod/match.php:69
+msgid "No matches"
+msgstr "Nessun risultato"
-#: ../../addon/twitter/twitter.php:122
-msgid "Twitter settings updated."
-msgstr "Impostazioni di Twitter aggiornate."
+#: ../../mod/zfinger.php:23
+msgid "invalid target signature"
+msgstr "la firma riscontrata non è valida"
-#: ../../addon/twitter/twitter.php:146
-msgid "Twitter Posting Settings"
-msgstr "Impostazioni di invio a Twitter"
+#: ../../mod/settings.php:71
+msgid "Name is required"
+msgstr "Il nome è obbligatorio"
-#: ../../addon/twitter/twitter.php:153
-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."
+#: ../../mod/settings.php:75
+msgid "Key and Secret are required"
+msgstr "Chiave e Segreto sono richiesti"
-#: ../../addon/twitter/twitter.php:172
-msgid ""
-"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."
-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."
-
-#: ../../addon/twitter/twitter.php:173
-msgid "Log in with Twitter"
-msgstr "Accedi con Twitter"
-
-#: ../../addon/twitter/twitter.php:175
-msgid "Copy the PIN from Twitter here"
-msgstr "Copia il PIN da Twitter qui"
-
-#: ../../addon/twitter/twitter.php:190
-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."
+#: ../../mod/settings.php:79 ../../mod/settings.php:533
+msgid "Update"
+msgstr "Aggiorna"
-#: ../../addon/twitter/twitter.php:192
-msgid ""
-"<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."
-msgstr ""
+#: ../../mod/settings.php:192
+msgid "Passwords do not match. Password unchanged."
+msgstr "Le password non corrispondono. Password non cambiata."
-#: ../../addon/twitter/twitter.php:195
-msgid "Allow posting to Twitter"
-msgstr "Permetti l'invio a Twitter"
+#: ../../mod/settings.php:196
+msgid "Empty passwords are not allowed. Password unchanged."
+msgstr "Le password non possono essere vuote. Password non cambiata."
-#: ../../addon/twitter/twitter.php:198
-msgid "Send public postings to Twitter by default"
-msgstr "Invia sempre i messaggi pubblici a Twitter"
+#: ../../mod/settings.php:209
+msgid "Password changed."
+msgstr "Password cambiata."
-#: ../../addon/twitter/twitter.php:201
-msgid "Send linked #-tags and @-names to Twitter"
-msgstr ""
+#: ../../mod/settings.php:211
+msgid "Password update failed. Please try again."
+msgstr "Aggiornamento password fallito. Prova ancora."
-#: ../../addon/twitter/twitter.php:396
-msgid "Consumer key"
-msgstr "Consumer key"
+#: ../../mod/settings.php:225
+msgid "Not valid email."
+msgstr "Email non valida."
-#: ../../addon/twitter/twitter.php:397
-msgid "Consumer secret"
-msgstr "Consumer secret"
+#: ../../mod/settings.php:228
+msgid "Protected email address. Cannot change to that email."
+msgstr "È un indirizzo email riservato. Non puoi sceglierlo."
-#: ../../addon/irc/irc.php:44
-msgid "IRC Settings"
-msgstr "Impostazioni IRC"
+#: ../../mod/settings.php:237
+msgid "System failure storing new email. Please try again."
+msgstr "Errore di sistema. Non è stato possibile memorizzare il tuo messaggio, riprova per favore."
-#: ../../addon/irc/irc.php:46
-msgid "Channel(s) to auto connect (comma separated)"
-msgstr "Canali a cui autocollegarsi (separati da virgola)"
+#: ../../mod/settings.php:435
+msgid "Settings updated."
+msgstr "Impostazioni aggiornate."
-#: ../../addon/irc/irc.php:51
-msgid "Popular Channels (comma separated)"
-msgstr "Canali popolari (separati da virgola)"
+#: ../../mod/settings.php:506 ../../mod/settings.php:532
+#: ../../mod/settings.php:568
+msgid "Add application"
+msgstr "Aggiungi una app"
-#: ../../addon/irc/irc.php:69
-msgid "IRC settings saved."
-msgstr "Impostazioni IRC salvate."
+#: ../../mod/settings.php:509
+msgid "Name of application"
+msgstr "Nome dell'applicazione"
-#: ../../addon/irc/irc.php:74
-msgid "IRC Chatroom"
-msgstr "Stanza IRC"
+#: ../../mod/settings.php:510 ../../mod/settings.php:536
+msgid "Consumer Key"
+msgstr "Consumer Key"
-#: ../../addon/irc/irc.php:96
-msgid "Popular Channels"
-msgstr "Canali Popolari"
+#: ../../mod/settings.php:510 ../../mod/settings.php:511
+msgid "Automatically generated - change if desired. Max length 20"
+msgstr "Generato automaticamente - è possibile cambiarlo. Lunghezza massima 20"
-#: ../../addon/fromapp/fromapp.php:38
-msgid "Fromapp settings updated."
-msgstr ""
+#: ../../mod/settings.php:511 ../../mod/settings.php:537
+msgid "Consumer Secret"
+msgstr "Consumer Secret"
-#: ../../addon/fromapp/fromapp.php:64
-msgid "FromApp Settings"
-msgstr ""
+#: ../../mod/settings.php:512 ../../mod/settings.php:538
+msgid "Redirect"
+msgstr "Redirect"
-#: ../../addon/fromapp/fromapp.php:66
+#: ../../mod/settings.php:512
msgid ""
-"The application name you would like to show your posts originating from."
-msgstr ""
-
-#: ../../addon/fromapp/fromapp.php:70
-msgid "Use this application name even if another application was used."
-msgstr ""
-
-#: ../../addon/blogger/blogger.php:42
-msgid "Post to blogger"
-msgstr "Posta su blogger"
-
-#: ../../addon/blogger/blogger.php:74
-msgid "Blogger Post Settings"
-msgstr "Impostazioni post per blogger"
-
-#: ../../addon/blogger/blogger.php:76
-msgid "Enable Blogger Post Plugin"
-msgstr "Abilita il plugin Blogger"
-
-#: ../../addon/blogger/blogger.php:81
-msgid "Blogger username"
-msgstr "Blogger username"
-
-#: ../../addon/blogger/blogger.php:86
-msgid "Blogger password"
-msgstr "Blogger password"
-
-#: ../../addon/blogger/blogger.php:91
-msgid "Blogger API URL"
-msgstr "Blogger API URL"
-
-#: ../../addon/blogger/blogger.php:96
-msgid "Post to Blogger by default"
-msgstr ""
-
-#: ../../addon/posterous/posterous.php:37
-msgid "Post to Posterous"
-msgstr "Invia a Posterous"
-
-#: ../../addon/posterous/posterous.php:70
-msgid "Posterous Post Settings"
-msgstr "Impostazioni di invio a Posterous"
-
-#: ../../addon/posterous/posterous.php:72
-msgid "Enable Posterous Post Plugin"
-msgstr "Abilita il plugin di invio a Posterous"
-
-#: ../../addon/posterous/posterous.php:77
-msgid "Posterous login"
-msgstr "Posterous login"
-
-#: ../../addon/posterous/posterous.php:82
-msgid "Posterous password"
-msgstr "Posterous password"
-
-#: ../../addon/posterous/posterous.php:87
-msgid "Posterous site ID"
-msgstr ""
-
-#: ../../addon/posterous/posterous.php:92
-msgid "Posterous API token"
-msgstr ""
-
-#: ../../addon/posterous/posterous.php:97
-msgid "Post to Posterous by default"
-msgstr "Invia sempre a Posterous"
-
-#: ../../view/theme/cleanzero/config.php:82
-#: ../../view/theme/diabook/config.php:192
-#: ../../view/theme/quattro/config.php:55 ../../view/theme/dispy/config.php:72
-msgid "Theme settings"
-msgstr "Impostazioni tema"
-
-#: ../../view/theme/cleanzero/config.php:83
-msgid "Set resize level for images in posts and comments (width and height)"
-msgstr ""
-
-#: ../../view/theme/cleanzero/config.php:84
-#: ../../view/theme/diabook/config.php:193
-#: ../../view/theme/dispy/config.php:73
-msgid "Set font-size for posts and comments"
-msgstr ""
-
-#: ../../view/theme/cleanzero/config.php:85
-msgid "Set theme width"
-msgstr ""
-
-#: ../../view/theme/cleanzero/config.php:86
-#: ../../view/theme/quattro/config.php:57
-msgid "Color scheme"
-msgstr "Schema colori"
-
-#: ../../view/theme/diabook/theme.php:127 ../../include/nav.php:49
-#: ../../include/nav.php:115
-msgid "Your posts and conversations"
-msgstr "I tuoi messaggi e le tue conversazioni"
-
-#: ../../view/theme/diabook/theme.php:128 ../../include/nav.php:50
-msgid "Your profile page"
-msgstr "Pagina del tuo profilo"
-
-#: ../../view/theme/diabook/theme.php:129
-msgid "Your contacts"
-msgstr ""
-
-#: ../../view/theme/diabook/theme.php:130 ../../include/nav.php:51
-msgid "Your photos"
-msgstr "Le tue foto"
-
-#: ../../view/theme/diabook/theme.php:131 ../../include/nav.php:52
-msgid "Your events"
-msgstr "I tuoi eventi"
-
-#: ../../view/theme/diabook/theme.php:132 ../../include/nav.php:53
-msgid "Personal notes"
-msgstr "Note personali"
-
-#: ../../view/theme/diabook/theme.php:132 ../../include/nav.php:53
-msgid "Your personal photos"
-msgstr "Le tue foto personali"
-
-#: ../../view/theme/diabook/theme.php:134
-#: ../../view/theme/diabook/theme.php:643
-#: ../../view/theme/diabook/theme.php:747
-#: ../../view/theme/diabook/config.php:201
-msgid "Community Pages"
-msgstr ""
-
-#: ../../view/theme/diabook/theme.php:490
-#: ../../view/theme/diabook/theme.php:749
-#: ../../view/theme/diabook/config.php:203
-msgid "Community Profiles"
-msgstr ""
-
-#: ../../view/theme/diabook/theme.php:511
-#: ../../view/theme/diabook/theme.php:754
-#: ../../view/theme/diabook/config.php:208
-msgid "Last users"
-msgstr "Ultimi utenti"
-
-#: ../../view/theme/diabook/theme.php:540
-#: ../../view/theme/diabook/theme.php:756
-#: ../../view/theme/diabook/config.php:210
-msgid "Last likes"
-msgstr "Ultimi \"mi piace\""
-
-#: ../../view/theme/diabook/theme.php:585
-#: ../../view/theme/diabook/theme.php:755
-#: ../../view/theme/diabook/config.php:209
-msgid "Last photos"
-msgstr "Ultime foto"
-
-#: ../../view/theme/diabook/theme.php:622
-#: ../../view/theme/diabook/theme.php:752
-#: ../../view/theme/diabook/config.php:206
-msgid "Find Friends"
-msgstr "Trova Amici"
-
-#: ../../view/theme/diabook/theme.php:623
-msgid "Local Directory"
-msgstr "Elenco Locale"
-
-#: ../../view/theme/diabook/theme.php:625 ../../include/contact_widgets.php:35
-msgid "Similar Interests"
-msgstr "Interessi simili"
-
-#: ../../view/theme/diabook/theme.php:627 ../../include/contact_widgets.php:37
-msgid "Invite Friends"
-msgstr "Invita amici"
-
-#: ../../view/theme/diabook/theme.php:678
-#: ../../view/theme/diabook/theme.php:748
-#: ../../view/theme/diabook/config.php:202
-msgid "Earth Layers"
-msgstr ""
-
-#: ../../view/theme/diabook/theme.php:683
-msgid "Set zoomfactor for Earth Layers"
-msgstr ""
-
-#: ../../view/theme/diabook/theme.php:684
-#: ../../view/theme/diabook/config.php:199
-msgid "Set longitude (X) for Earth Layers"
-msgstr ""
-
-#: ../../view/theme/diabook/theme.php:685
-#: ../../view/theme/diabook/config.php:200
-msgid "Set latitude (Y) for Earth Layers"
-msgstr ""
-
-#: ../../view/theme/diabook/theme.php:698
-#: ../../view/theme/diabook/theme.php:750
-#: ../../view/theme/diabook/config.php:204
-msgid "Help or @NewHere ?"
-msgstr "Serve aiuto? Sei nuovo?"
-
-#: ../../view/theme/diabook/theme.php:705
-#: ../../view/theme/diabook/theme.php:751
-#: ../../view/theme/diabook/config.php:205
-msgid "Connect Services"
-msgstr "Servizi di conessione"
-
-#: ../../view/theme/diabook/theme.php:712
-#: ../../view/theme/diabook/theme.php:753
-msgid "Last Tweets"
-msgstr ""
-
-#: ../../view/theme/diabook/theme.php:715
-#: ../../view/theme/diabook/config.php:197
-msgid "Set twitter search term"
-msgstr ""
-
-#: ../../view/theme/diabook/theme.php:735
-#: ../../view/theme/diabook/theme.php:736
-#: ../../view/theme/diabook/theme.php:737
-#: ../../view/theme/diabook/theme.php:738
-#: ../../view/theme/diabook/theme.php:739
-#: ../../view/theme/diabook/theme.php:740
-#: ../../view/theme/diabook/theme.php:741
-#: ../../view/theme/diabook/theme.php:742
-#: ../../view/theme/diabook/theme.php:743
-#: ../../view/theme/diabook/theme.php:744 ../../include/acl_selectors.php:288
-msgid "don't show"
-msgstr "non mostrare"
-
-#: ../../view/theme/diabook/theme.php:735
-#: ../../view/theme/diabook/theme.php:736
-#: ../../view/theme/diabook/theme.php:737
-#: ../../view/theme/diabook/theme.php:738
-#: ../../view/theme/diabook/theme.php:739
-#: ../../view/theme/diabook/theme.php:740
-#: ../../view/theme/diabook/theme.php:741
-#: ../../view/theme/diabook/theme.php:742
-#: ../../view/theme/diabook/theme.php:743
-#: ../../view/theme/diabook/theme.php:744 ../../include/acl_selectors.php:287
-msgid "show"
-msgstr "mostra"
-
-#: ../../view/theme/diabook/theme.php:745
-msgid "Show/hide boxes at right-hand column:"
-msgstr ""
+"Redirect URI - leave blank unless your application specifically requires "
+"this"
+msgstr "URI ridirezionato - lasciare bianco se non richiesto specificamente dall'applicazione."
-#: ../../view/theme/diabook/config.php:194
-#: ../../view/theme/dispy/config.php:74
-msgid "Set line-height for posts and comments"
-msgstr ""
-
-#: ../../view/theme/diabook/config.php:195
-msgid "Set resolution for middle column"
-msgstr ""
-
-#: ../../view/theme/diabook/config.php:196
-msgid "Set color scheme"
-msgstr ""
-
-#: ../../view/theme/diabook/config.php:198
-msgid "Set zoomfactor for Earth Layer"
-msgstr ""
-
-#: ../../view/theme/diabook/config.php:207
-msgid "Last tweets"
-msgstr ""
-
-#: ../../view/theme/quattro/config.php:56
-msgid "Alignment"
-msgstr "Allineamento"
-
-#: ../../view/theme/quattro/config.php:56
-msgid "Left"
-msgstr "Sinistra"
-
-#: ../../view/theme/quattro/config.php:56
-msgid "Center"
-msgstr "Centrato"
-
-#: ../../view/theme/dispy/config.php:75
-msgid "Set colour scheme"
-msgstr ""
-
-#: ../../include/profile_advanced.php:22
-msgid "j F, Y"
-msgstr "j F Y"
+#: ../../mod/settings.php:513 ../../mod/settings.php:539
+msgid "Icon url"
+msgstr "Url icona"
-#: ../../include/profile_advanced.php:23
-msgid "j F"
-msgstr "j F"
+#: ../../mod/settings.php:513
+msgid "Optional"
+msgstr "Opzionale"
-#: ../../include/profile_advanced.php:30
-msgid "Birthday:"
-msgstr "Compleanno:"
+#: ../../mod/settings.php:524
+msgid "You can't edit this application."
+msgstr "Non puoi modificare questa applicazione."
-#: ../../include/profile_advanced.php:34
-msgid "Age:"
-msgstr "Età:"
+#: ../../mod/settings.php:567
+msgid "Connected Apps"
+msgstr "App connesse"
-#: ../../include/profile_advanced.php:43
-#, php-format
-msgid "for %1$d %2$s"
-msgstr ""
+#: ../../mod/settings.php:571
+msgid "Client key starts with"
+msgstr "La client key inizia con"
-#: ../../include/profile_advanced.php:52
-msgid "Tags:"
-msgstr "Tag:"
+#: ../../mod/settings.php:572
+msgid "No name"
+msgstr "Nessun nome"
-#: ../../include/profile_advanced.php:56
-msgid "Religion:"
-msgstr "Religione:"
+#: ../../mod/settings.php:573
+msgid "Remove authorization"
+msgstr "Revoca l'autorizzazione"
-#: ../../include/profile_advanced.php:60
-msgid "Hobbies/Interests:"
-msgstr "Hobby/Interessi:"
+#: ../../mod/settings.php:584
+msgid "No feature settings configured"
+msgstr "Non ci sono funzionalità aggiuntive personalizzabili"
-#: ../../include/profile_advanced.php:67
-msgid "Contact information and Social Networks:"
-msgstr "Informazioni su contatti e social network:"
+#: ../../mod/settings.php:592
+msgid "Feature Settings"
+msgstr "Impostazioni aggiuntive"
-#: ../../include/profile_advanced.php:69
-msgid "Musical interests:"
-msgstr "Interessi musicali:"
+#: ../../mod/settings.php:615
+msgid "Account Settings"
+msgstr "Impostazioni account"
-#: ../../include/profile_advanced.php:71
-msgid "Books, literature:"
-msgstr "Libri, letteratura:"
+#: ../../mod/settings.php:616
+msgid "Password Settings"
+msgstr "Impostazioni password"
-#: ../../include/profile_advanced.php:73
-msgid "Television:"
-msgstr "Televisione:"
+#: ../../mod/settings.php:617
+msgid "New Password:"
+msgstr "Nuova password:"
-#: ../../include/profile_advanced.php:75
-msgid "Film/dance/culture/entertainment:"
-msgstr "Film/danza/cultura/intrattenimento:"
+#: ../../mod/settings.php:618
+msgid "Confirm:"
+msgstr "Conferma:"
-#: ../../include/profile_advanced.php:77
-msgid "Love/Romance:"
-msgstr "Amore:"
+#: ../../mod/settings.php:618
+msgid "Leave password fields blank unless changing"
+msgstr "Lascia questi campi in bianco per non cambiare la password"
-#: ../../include/profile_advanced.php:79
-msgid "Work/employment:"
-msgstr "Lavoro:"
+#: ../../mod/settings.php:620 ../../mod/settings.php:912
+msgid "Email Address:"
+msgstr "Indirizzo email:"
-#: ../../include/profile_advanced.php:81
-msgid "School/education:"
-msgstr "Scuola:"
+#: ../../mod/settings.php:621
+msgid "Remove Account"
+msgstr "Elimina l'account"
-#: ../../include/contact_selectors.php:32
-msgid "Unknown | Not categorised"
-msgstr "Sconosciuto | non categorizzato"
+#: ../../mod/settings.php:622
+msgid "Warning: This action is permanent and cannot be reversed."
+msgstr "Attenzione: questa azione è permanente e non potrà più essere annullata."
-#: ../../include/contact_selectors.php:33
-msgid "Block immediately"
-msgstr "Blocca immediatamente"
+#: ../../mod/settings.php:638
+msgid "Off"
+msgstr "Off"
-#: ../../include/contact_selectors.php:34
-msgid "Shady, spammer, self-marketer"
-msgstr "Shady, spammer, self-marketer"
+#: ../../mod/settings.php:638
+msgid "On"
+msgstr "On"
-#: ../../include/contact_selectors.php:35
-msgid "Known to me, but no opinion"
-msgstr "Lo conosco, ma non ho un'opinione particolare"
+#: ../../mod/settings.php:645
+msgid "Additional Features"
+msgstr "Funzionalità aggiuntive"
-#: ../../include/contact_selectors.php:36
-msgid "OK, probably harmless"
-msgstr "E' ok, probabilmente innocuo"
+#: ../../mod/settings.php:670
+msgid "Connector Settings"
+msgstr "Impostazioni del connettore"
-#: ../../include/contact_selectors.php:37
-msgid "Reputable, has my trust"
-msgstr "Rispettabile, ha la mia fiducia"
+#: ../../mod/settings.php:740
+msgid "Display Settings"
+msgstr "Impostazioni grafiche"
-#: ../../include/contact_selectors.php:56
-msgid "Frequently"
-msgstr "Frequentemente"
+#: ../../mod/settings.php:746
+msgid "Display Theme:"
+msgstr "Tema per monitor:"
-#: ../../include/contact_selectors.php:57
-msgid "Hourly"
-msgstr "Ogni ora"
+#: ../../mod/settings.php:747
+msgid "Mobile Theme:"
+msgstr "Tema per dispositivi mobili:"
-#: ../../include/contact_selectors.php:58
-msgid "Twice daily"
-msgstr "Due volte al dì"
+#: ../../mod/settings.php:748
+msgid "Update browser every xx seconds"
+msgstr "Aggiorna il browser ogni x secondi"
-#: ../../include/contact_selectors.php:77
-msgid "OStatus"
-msgstr "Ostatus"
+#: ../../mod/settings.php:748
+msgid "Minimum of 10 seconds, no maximum"
+msgstr "Minimo 10 secondi, nessun limite massimo"
-#: ../../include/contact_selectors.php:78
-msgid "RSS/Atom"
-msgstr "RSS / Atom"
+#: ../../mod/settings.php:749
+msgid "Maximum number of conversations to load at any time:"
+msgstr "Massimo numero di conversazioni da mostrare ogni volta:"
-#: ../../include/contact_selectors.php:82
-msgid "Zot!"
-msgstr "Zot!"
+#: ../../mod/settings.php:749
+msgid "Maximum of 100 items"
+msgstr "Massimo 100"
-#: ../../include/contact_selectors.php:83
-msgid "LinkedIn"
-msgstr "LinkedIn"
+#: ../../mod/settings.php:750
+msgid "Don't show emoticons"
+msgstr "Non mostrare le emoticons"
-#: ../../include/contact_selectors.php:84
-msgid "XMPP/IM"
-msgstr "XMPP/IM"
+#: ../../mod/settings.php:786
+msgid "Nobody except yourself"
+msgstr "Nessuno tranne te"
-#: ../../include/contact_selectors.php:85
-msgid "MySpace"
-msgstr "MySpace"
+#: ../../mod/settings.php:787
+msgid "Only those you specifically allow"
+msgstr "Solo chi riceve il mio permesso"
-#: ../../include/profile_selectors.php:6
-msgid "Male"
-msgstr "Maschio"
+#: ../../mod/settings.php:788
+msgid "Anybody in your address book"
+msgstr "Chiunque tra i miei contatti"
-#: ../../include/profile_selectors.php:6
-msgid "Female"
-msgstr "Femmina"
+#: ../../mod/settings.php:789
+msgid "Anybody on this website"
+msgstr "Chiunque su questo sito"
-#: ../../include/profile_selectors.php:6
-msgid "Currently Male"
-msgstr "Al momento maschio"
+#: ../../mod/settings.php:790
+msgid "Anybody in this network"
+msgstr "Chiunque su Red"
-#: ../../include/profile_selectors.php:6
-msgid "Currently Female"
-msgstr "Al momento femmina"
+#: ../../mod/settings.php:791
+msgid "Anybody on the internet"
+msgstr "Chiunque su internet"
-#: ../../include/profile_selectors.php:6
-msgid "Mostly Male"
-msgstr "Prevalentemente maschio"
+#: ../../mod/settings.php:865
+msgid "Publish your default profile in the network directory"
+msgstr "Pubblica il mio profilo predefinito sull'elenco pubblico dei canali"
-#: ../../include/profile_selectors.php:6
-msgid "Mostly Female"
-msgstr "Prevalentemente femmina"
+#: ../../mod/settings.php:870
+msgid "Allow us to suggest you as a potential friend to new members?"
+msgstr "Vuoi essere suggerito come potenziale amico ai nuovi membri?"
-#: ../../include/profile_selectors.php:6
-msgid "Transgender"
-msgstr "Transgender"
+#: ../../mod/settings.php:874 ../../mod/profile_photo.php:288
+msgid "or"
+msgstr "o"
-#: ../../include/profile_selectors.php:6
-msgid "Intersex"
-msgstr "Intersex"
+#: ../../mod/settings.php:879
+msgid "Your channel address is"
+msgstr "L'indirizzo del tuo canale è"
-#: ../../include/profile_selectors.php:6
-msgid "Transsexual"
-msgstr "Transessuale"
+#: ../../mod/settings.php:901
+msgid "Channel Settings"
+msgstr "Impostazioni del canale"
-#: ../../include/profile_selectors.php:6
-msgid "Hermaphrodite"
-msgstr "Ermafrodito"
+#: ../../mod/settings.php:910
+msgid "Basic Settings"
+msgstr "Impostazioni di base"
-#: ../../include/profile_selectors.php:6
-msgid "Neuter"
-msgstr "Neutro"
+#: ../../mod/settings.php:913
+msgid "Your Timezone:"
+msgstr "Il tuo fuso orario:"
-#: ../../include/profile_selectors.php:6
-msgid "Non-specific"
-msgstr "Non specificato"
+#: ../../mod/settings.php:914
+msgid "Default Post Location:"
+msgstr "Località predefinita:"
-#: ../../include/profile_selectors.php:6
-msgid "Other"
-msgstr "Altro"
+#: ../../mod/settings.php:915
+msgid "Use Browser Location:"
+msgstr "Usa la località rilevata dal browser:"
-#: ../../include/profile_selectors.php:6
-msgid "Undecided"
-msgstr "Indeciso"
+#: ../../mod/settings.php:917
+msgid "Adult Content"
+msgstr "Contenuto per adulti"
-#: ../../include/profile_selectors.php:23
-msgid "Males"
-msgstr "Maschi"
+#: ../../mod/settings.php:917
+msgid "This channel publishes adult content."
+msgstr "Questo canale pubblica contenuto per adulti."
-#: ../../include/profile_selectors.php:23
-msgid "Females"
-msgstr "Femmine"
+#: ../../mod/settings.php:919
+msgid "Security and Privacy Settings"
+msgstr "Impostazioni di sicurezza e privacy"
-#: ../../include/profile_selectors.php:23
-msgid "Gay"
-msgstr "Gay"
+#: ../../mod/settings.php:921
+msgid "Quick Privacy Settings:"
+msgstr "Impostazioni veloci della privacy:"
-#: ../../include/profile_selectors.php:23
-msgid "Lesbian"
-msgstr "Lesbica"
+#: ../../mod/settings.php:922
+msgid "Very Public - extremely permissive"
+msgstr "Tutto pubblico - molto permissivo"
-#: ../../include/profile_selectors.php:23
-msgid "No Preference"
-msgstr "Nessuna preferenza"
+#: ../../mod/settings.php:923
+msgid "Typical - default public, privacy when desired"
+msgstr "Normale - tutto sarà pubblico tranne quel che vorrai tu"
-#: ../../include/profile_selectors.php:23
-msgid "Bisexual"
-msgstr "Bisessuale"
+#: ../../mod/settings.php:924
+msgid "Private - default private, rarely open or public"
+msgstr "Privato - i contenuti saranno privati ma, se vorrai, alcuni potrai renderli pubblici"
-#: ../../include/profile_selectors.php:23
-msgid "Autosexual"
-msgstr "Autosessuale"
+#: ../../mod/settings.php:925
+msgid "Blocked - default blocked to/from everybody"
+msgstr "Bloccato - non ci saranno interazioni con altri a meno che tu non voglia"
-#: ../../include/profile_selectors.php:23
-msgid "Abstinent"
-msgstr "Astinente"
+#: ../../mod/settings.php:928
+msgid "Maximum Friend Requests/Day:"
+msgstr "Numero massimo giornaliero di richieste di amicizia:"
-#: ../../include/profile_selectors.php:23
-msgid "Virgin"
-msgstr "Vergine"
+#: ../../mod/settings.php:928
+msgid "May reduce spam activity"
+msgstr "Serve e ridurre lo spam"
-#: ../../include/profile_selectors.php:23
-msgid "Deviant"
-msgstr "Deviato"
+#: ../../mod/settings.php:929
+msgid "Default Post Permissions"
+msgstr "Permessi predefiniti per gli articoli"
-#: ../../include/profile_selectors.php:23
-msgid "Fetish"
-msgstr "Fetish"
+#: ../../mod/settings.php:941
+msgid "Maximum private messages per day from unknown people:"
+msgstr "Numero massimo giornaliero di messaggi privati da utenti sconosciuti:"
-#: ../../include/profile_selectors.php:23
-msgid "Oodles"
-msgstr "Un sacco"
+#: ../../mod/settings.php:941
+msgid "Useful to reduce spamming"
+msgstr "Serve e ridurre lo spam"
-#: ../../include/profile_selectors.php:23
-msgid "Nonsexual"
-msgstr "Asessuato"
+#: ../../mod/settings.php:944
+msgid "Notification Settings"
+msgstr "Impostazioni di notifica"
-#: ../../include/profile_selectors.php:42
-msgid "Single"
-msgstr "Single"
+#: ../../mod/settings.php:945
+msgid "By default post a status message when:"
+msgstr "Pubblica un messaggio di stato quando:"
-#: ../../include/profile_selectors.php:42
-msgid "Lonely"
-msgstr "Solitario"
+#: ../../mod/settings.php:946
+msgid "accepting a friend request"
+msgstr "accetto una nuova amicizia"
-#: ../../include/profile_selectors.php:42
-msgid "Available"
-msgstr "Disponibile"
+#: ../../mod/settings.php:947
+msgid "joining a forum/community"
+msgstr "entro a far parte di un forum"
-#: ../../include/profile_selectors.php:42
-msgid "Unavailable"
-msgstr "Non disponibile"
+#: ../../mod/settings.php:948
+msgid "making an <em>interesting</em> profile change"
+msgstr "faccio un cambiamento <em>interessante</em> al mio profilo"
-#: ../../include/profile_selectors.php:42
-msgid "Has crush"
-msgstr ""
+#: ../../mod/settings.php:949
+msgid "Send a notification email when:"
+msgstr "Invia una email di notifica quando:"
-#: ../../include/profile_selectors.php:42
-msgid "Infatuated"
-msgstr ""
+#: ../../mod/settings.php:950
+msgid "You receive an introduction"
+msgstr "Ricevi una richiesta di amicizia"
-#: ../../include/profile_selectors.php:42
-msgid "Dating"
-msgstr "Disponibile a un incontro"
+#: ../../mod/settings.php:951
+msgid "Your introductions are confirmed"
+msgstr "Le tue richieste di amicizia sono state accettate"
-#: ../../include/profile_selectors.php:42
-msgid "Unfaithful"
-msgstr "Infedele"
+#: ../../mod/settings.php:952
+msgid "Someone writes on your profile wall"
+msgstr "Qualcuno scrive sulla tua bacheca"
-#: ../../include/profile_selectors.php:42
-msgid "Sex Addict"
-msgstr "Sesso-dipendente"
+#: ../../mod/settings.php:953
+msgid "Someone writes a followup comment"
+msgstr "Qualcuno scrive un commento a un tuo articolo"
-#: ../../include/profile_selectors.php:42 ../../include/user.php:278
-#: ../../include/user.php:282
-msgid "Friends"
-msgstr "Amici"
+#: ../../mod/settings.php:954
+msgid "You receive a private message"
+msgstr "Ricevi un messaggio privato"
-#: ../../include/profile_selectors.php:42
-msgid "Friends/Benefits"
-msgstr "Amici con benefici"
+#: ../../mod/settings.php:955
+msgid "You receive a friend suggestion"
+msgstr "Ti viene suggerito un amico"
-#: ../../include/profile_selectors.php:42
-msgid "Casual"
-msgstr "Casual"
+#: ../../mod/settings.php:956
+msgid "You are tagged in a post"
+msgstr "Sei taggato in un articolo"
-#: ../../include/profile_selectors.php:42
-msgid "Engaged"
-msgstr "Impegnato"
+#: ../../mod/settings.php:957
+msgid "You are poked/prodded/etc. in a post"
+msgstr "Ricevi un poke in un articolo"
-#: ../../include/profile_selectors.php:42
-msgid "Married"
-msgstr "Sposato"
+#: ../../mod/settings.php:960
+msgid "Advanced Account/Page Type Settings"
+msgstr "Impostazioni avanzate"
-#: ../../include/profile_selectors.php:42
-msgid "Imaginarily married"
-msgstr ""
+#: ../../mod/settings.php:961
+msgid "Change the behaviour of this account for special situations"
+msgstr "Cambia il funzionamento di questo account in situazioni particolari"
-#: ../../include/profile_selectors.php:42
-msgid "Partners"
-msgstr "Partners"
+#: ../../mod/mail.php:33
+msgid "Unable to lookup recipient."
+msgstr "Impossibile associare un destinatario."
-#: ../../include/profile_selectors.php:42
-msgid "Cohabiting"
-msgstr "Coinquilino"
+#: ../../mod/mail.php:41
+msgid "Unable to communicate with requested channel."
+msgstr "Impossibile comunicare con il canale richiesto."
-#: ../../include/profile_selectors.php:42
-msgid "Common law"
-msgstr ""
+#: ../../mod/mail.php:48
+msgid "Cannot verify requested channel."
+msgstr "Impossibile verificare il canale richiesto."
-#: ../../include/profile_selectors.php:42
-msgid "Happy"
-msgstr "Felice"
+#: ../../mod/mail.php:74
+msgid "Selected channel has private message restrictions. Send failed."
+msgstr "Il canale ha delle regole restrittive per la ricezione dei messaggi privati. Invio fallito."
-#: ../../include/profile_selectors.php:42
-msgid "Not looking"
-msgstr ""
+#: ../../mod/mail.php:121 ../../mod/message.php:31
+msgid "Messages"
+msgstr "Messaggi"
-#: ../../include/profile_selectors.php:42
-msgid "Swinger"
-msgstr "Scambista"
+#: ../../mod/mail.php:132
+msgid "Message deleted."
+msgstr "Messaggio eliminato."
-#: ../../include/profile_selectors.php:42
-msgid "Betrayed"
-msgstr "Tradito"
+#: ../../mod/mail.php:149
+msgid "Message recalled."
+msgstr "Messaggio revocato."
-#: ../../include/profile_selectors.php:42
-msgid "Separated"
-msgstr "Separato"
+#: ../../mod/mail.php:206
+msgid "Send Private Message"
+msgstr "Invia un messaggio privato"
-#: ../../include/profile_selectors.php:42
-msgid "Unstable"
-msgstr "Instabile"
+#: ../../mod/mail.php:207 ../../mod/mail.php:323
+msgid "To:"
+msgstr "A:"
-#: ../../include/profile_selectors.php:42
-msgid "Divorced"
-msgstr "Divorziato"
+#: ../../mod/mail.php:212 ../../mod/mail.php:325
+msgid "Subject:"
+msgstr "Oggetto:"
-#: ../../include/profile_selectors.php:42
-msgid "Imaginarily divorced"
-msgstr ""
+#: ../../mod/mail.php:249
+msgid "Message not found."
+msgstr "Messaggio non trovato."
-#: ../../include/profile_selectors.php:42
-msgid "Widowed"
-msgstr "Vedovo"
+#: ../../mod/mail.php:292 ../../mod/message.php:72
+msgid "Delete message"
+msgstr "Elimina il messaggio"
-#: ../../include/profile_selectors.php:42
-msgid "Uncertain"
-msgstr "Incerto"
+#: ../../mod/mail.php:293
+msgid "Recall message"
+msgstr "Revoca il messaggio"
-#: ../../include/profile_selectors.php:42
-msgid "It's complicated"
-msgstr ""
+#: ../../mod/mail.php:295
+msgid "Message has been recalled."
+msgstr "Il messaggio è stato revocato."
-#: ../../include/profile_selectors.php:42
-msgid "Don't care"
-msgstr "Non interessa"
+#: ../../mod/mail.php:312
+msgid "Private Conversation"
+msgstr "Conversazione privata"
-#: ../../include/profile_selectors.php:42
-msgid "Ask me"
-msgstr "Chiedimelo"
+#: ../../mod/mail.php:316
+msgid "Delete conversation"
+msgstr "Elimina la conversazione"
-#: ../../include/event.php:20 ../../include/bb2diaspora.php:396
-msgid "Starts:"
-msgstr "Inizia:"
+#: ../../mod/mail.php:318
+msgid ""
+"No secure communications available. You <strong>may</strong> be able to "
+"respond from the sender's profile page."
+msgstr "Non è disponibile alcun sistema per comunicare in modo sicuro. Puoi verificare se <strong>eventualmente</strong> è possibile rispondere dalla pagina del profilo del mittente."
-#: ../../include/event.php:30 ../../include/bb2diaspora.php:404
-msgid "Finishes:"
-msgstr "Finisce:"
+#: ../../mod/mail.php:322
+msgid "Send Reply"
+msgstr "Invia la risposta"
-#: ../../include/delivery.php:457 ../../include/notifier.php:703
-msgid "(no subject)"
-msgstr "(nessun oggetto)"
+#: ../../mod/editlayout.php:36 ../../mod/editpost.php:20
+#: ../../mod/editwebpage.php:32 ../../mod/editblock.php:36
+msgid "Item not found"
+msgstr "Elemento non trovato"
-#: ../../include/Scrape.php:576
-msgid " on Last.fm"
-msgstr ""
+#: ../../mod/editlayout.php:68
+msgid "Edit Layout"
+msgstr "Modifica il layout"
-#: ../../include/text.php:243
-msgid "prev"
-msgstr "prec"
+#: ../../mod/editlayout.php:105 ../../mod/editpost.php:102
+#: ../../mod/editwebpage.php:148 ../../mod/editblock.php:119
+msgid "Insert YouTube video"
+msgstr "Inserisci video da YouTube"
-#: ../../include/text.php:245
-msgid "first"
-msgstr "primo"
+#: ../../mod/editlayout.php:106 ../../mod/editpost.php:103
+#: ../../mod/editwebpage.php:149 ../../mod/editblock.php:120
+msgid "Insert Vorbis [.ogg] video"
+msgstr "Inserisci video Vorbis [.ogg]"
-#: ../../include/text.php:274
-msgid "last"
-msgstr "ultimo"
+#: ../../mod/editlayout.php:107 ../../mod/editpost.php:104
+#: ../../mod/editwebpage.php:150 ../../mod/editblock.php:121
+msgid "Insert Vorbis [.ogg] audio"
+msgstr "Inserisci audio Vorbis [.ogg]"
-#: ../../include/text.php:277
-msgid "next"
-msgstr "succ"
+#: ../../mod/editlayout.php:141
+msgid "Delete Layout"
+msgstr "Elimina il layout"
-#: ../../include/text.php:295
-msgid "newer"
-msgstr ""
+#: ../../mod/profile_photo.php:44
+msgid "Image uploaded but image cropping failed."
+msgstr "L'immagine è stata caricata, ma il non è stato possibile ritagliarla."
-#: ../../include/text.php:299
-msgid "older"
-msgstr ""
+#: ../../mod/profile_photo.php:97
+msgid "Image resize failed."
+msgstr "Il ridimensionamento dell'immagine è fallito."
-#: ../../include/text.php:597
-msgid "No contacts"
-msgstr "Nessun contatto"
+#: ../../mod/profile_photo.php:141
+msgid ""
+"Shift-reload the page or clear browser cache if the new photo does not "
+"display immediately."
+msgstr "Ricarica la pagina con shift+F5 o cancella la cache del browser se la nuova foto non viene mostrata immediatamente."
-#: ../../include/text.php:606
+#: ../../mod/profile_photo.php:163
#, php-format
-msgid "%d Contact"
-msgid_plural "%d Contacts"
-msgstr[0] "%d contatto"
-msgstr[1] "%d contatti"
-
-#: ../../include/text.php:719
-msgid "poke"
-msgstr ""
-
-#: ../../include/text.php:719 ../../include/conversation.php:210
-msgid "poked"
-msgstr ""
-
-#: ../../include/text.php:720
-msgid "ping"
-msgstr ""
-
-#: ../../include/text.php:720
-msgid "pinged"
-msgstr ""
-
-#: ../../include/text.php:721
-msgid "prod"
-msgstr ""
-
-#: ../../include/text.php:721
-msgid "prodded"
-msgstr ""
-
-#: ../../include/text.php:722
-msgid "slap"
-msgstr ""
-
-#: ../../include/text.php:722
-msgid "slapped"
-msgstr ""
-
-#: ../../include/text.php:723
-msgid "finger"
-msgstr ""
-
-#: ../../include/text.php:723
-msgid "fingered"
-msgstr ""
-
-#: ../../include/text.php:724
-msgid "rebuff"
-msgstr ""
-
-#: ../../include/text.php:724
-msgid "rebuffed"
-msgstr ""
-
-#: ../../include/text.php:736
-msgid "happy"
-msgstr ""
-
-#: ../../include/text.php:737
-msgid "sad"
-msgstr ""
-
-#: ../../include/text.php:738
-msgid "mellow"
-msgstr ""
-
-#: ../../include/text.php:739
-msgid "tired"
-msgstr ""
-
-#: ../../include/text.php:740
-msgid "perky"
-msgstr ""
-
-#: ../../include/text.php:741
-msgid "angry"
-msgstr ""
-
-#: ../../include/text.php:742
-msgid "stupified"
-msgstr ""
-
-#: ../../include/text.php:743
-msgid "puzzled"
-msgstr ""
-
-#: ../../include/text.php:744
-msgid "interested"
-msgstr ""
-
-#: ../../include/text.php:745
-msgid "bitter"
-msgstr ""
-
-#: ../../include/text.php:746
-msgid "cheerful"
-msgstr ""
-
-#: ../../include/text.php:747
-msgid "alive"
-msgstr ""
-
-#: ../../include/text.php:748
-msgid "annoyed"
-msgstr ""
-
-#: ../../include/text.php:749
-msgid "anxious"
-msgstr ""
-
-#: ../../include/text.php:750
-msgid "cranky"
-msgstr ""
-
-#: ../../include/text.php:751
-msgid "disturbed"
-msgstr ""
-
-#: ../../include/text.php:752
-msgid "frustrated"
-msgstr ""
-
-#: ../../include/text.php:753
-msgid "motivated"
-msgstr ""
-
-#: ../../include/text.php:754
-msgid "relaxed"
-msgstr ""
-
-#: ../../include/text.php:755
-msgid "surprised"
-msgstr ""
-
-#: ../../include/text.php:921
-msgid "January"
-msgstr "Gennaio"
-
-#: ../../include/text.php:921
-msgid "February"
-msgstr "Febbraio"
-
-#: ../../include/text.php:921
-msgid "March"
-msgstr "Marzo"
-
-#: ../../include/text.php:921
-msgid "April"
-msgstr "Aprile"
-
-#: ../../include/text.php:921
-msgid "May"
-msgstr "Maggio"
-
-#: ../../include/text.php:921
-msgid "June"
-msgstr "Giugno"
-
-#: ../../include/text.php:921
-msgid "July"
-msgstr "Luglio"
-
-#: ../../include/text.php:921
-msgid "August"
-msgstr "Agosto"
-
-#: ../../include/text.php:921
-msgid "September"
-msgstr "Settembre"
-
-#: ../../include/text.php:921
-msgid "October"
-msgstr "Ottobre"
-
-#: ../../include/text.php:921
-msgid "November"
-msgstr "Novembre"
-
-#: ../../include/text.php:921
-msgid "December"
-msgstr "Dicembre"
-
-#: ../../include/text.php:1007
-msgid "bytes"
-msgstr "bytes"
-
-#: ../../include/text.php:1034 ../../include/text.php:1046
-msgid "Click to open/close"
-msgstr "Clicca per aprire/chiudere"
-
-#: ../../include/text.php:1219 ../../include/user.php:236
-msgid "default"
-msgstr "default"
-
-#: ../../include/text.php:1231
-msgid "Select an alternate language"
-msgstr "Seleziona una diversa lingua"
-
-#: ../../include/text.php:1441
-msgid "activity"
-msgstr "attività"
-
-#: ../../include/text.php:1444
-msgid "post"
-msgstr "messaggio"
-
-#: ../../include/text.php:1599
-msgid "Item filed"
-msgstr ""
-
-#: ../../include/diaspora.php:691
-msgid "Sharing notification from Diaspora network"
-msgstr "Notifica di condivisione dal network Diaspora*"
+msgid "Image exceeds size limit of %d"
+msgstr "La dimensione dell'immagine supera il limite di %d"
-#: ../../include/diaspora.php:2211
-msgid "Attachments:"
-msgstr "Allegati:"
+#: ../../mod/profile_photo.php:172
+msgid "Unable to process image."
+msgstr "Impossibile elaborare l'immagine."
-#: ../../include/network.php:849
-msgid "view full size"
-msgstr "vedi a schermo intero"
+#: ../../mod/profile_photo.php:214 ../../mod/profile_photo.php:262
+msgid "Photo not available."
+msgstr "Foto non disponibile."
-#: ../../include/oembed.php:137
-msgid "Embedded content"
-msgstr "Contenuto incorporato"
+#: ../../mod/profile_photo.php:281
+msgid "Upload File:"
+msgstr "Carica un file:"
-#: ../../include/oembed.php:146
-msgid "Embedding disabled"
-msgstr "Embed disabilitato"
+#: ../../mod/profile_photo.php:282
+msgid "Select a profile:"
+msgstr "Seleziona un profilo:"
-#: ../../include/group.php:25
-msgid ""
-"A deleted group with this name was revived. Existing item permissions "
-"<strong>may</strong> apply to this group and any future members. If this is "
-"not what you intended, please create another group with a different name."
-msgstr "Un gruppo eliminato con questo nome è stato ricreato. I permessi esistenti su un elemento <strong>possono</strong> essere applicati a questo gruppo e tutti i membri futuri. Se questo non è ciò che si intende, si prega di creare un altro gruppo con un nome diverso."
+#: ../../mod/profile_photo.php:283
+msgid "Upload Profile Photo"
+msgstr "Carica la foto del profilo"
-#: ../../include/group.php:176
-msgid "Default privacy group for new contacts"
-msgstr ""
+#: ../../mod/profile_photo.php:284
+msgid "Upload"
+msgstr "Carica"
-#: ../../include/group.php:195
-msgid "Everybody"
-msgstr "Tutti"
+#: ../../mod/profile_photo.php:288
+msgid "skip this step"
+msgstr "salta questo passaggio"
-#: ../../include/group.php:218
-msgid "edit"
-msgstr "modifica"
+#: ../../mod/profile_photo.php:288
+msgid "select a photo from your photo albums"
+msgstr "seleziona una foto dai tuoi album"
-#: ../../include/group.php:240
-msgid "Edit group"
-msgstr "Modifica gruppo"
+#: ../../mod/profile_photo.php:302
+msgid "Crop Image"
+msgstr "Ritaglia immagine"
-#: ../../include/group.php:241
-msgid "Create a new group"
-msgstr "Crea un nuovo gruppo"
+#: ../../mod/profile_photo.php:303
+msgid "Please adjust the image cropping for optimum viewing."
+msgstr "Ritaglia l'immagine per migliorarne la visualizzazione."
-#: ../../include/group.php:242
-msgid "Contacts not in any group"
-msgstr "Contatti in nessun gruppo."
+#: ../../mod/profile_photo.php:305
+msgid "Done Editing"
+msgstr "Modifica terminata"
-#: ../../include/nav.php:46 ../../boot.php:911
-msgid "Logout"
-msgstr "Esci"
+#: ../../mod/profile_photo.php:340
+msgid "Image uploaded successfully."
+msgstr "Immagine caricata con successo."
-#: ../../include/nav.php:46
-msgid "End this session"
-msgstr "Finisci questa sessione"
+#: ../../mod/profile_photo.php:342
+msgid "Image upload failed."
+msgstr "Il caricamento dell'immagine è fallito."
-#: ../../include/nav.php:49 ../../boot.php:1665
-msgid "Status"
-msgstr "Stato"
+#: ../../mod/profile_photo.php:351
+#, php-format
+msgid "Image size reduction [%s] failed."
+msgstr "Il ridimensionamento del'immagine [%s] è fallito."
-#: ../../include/nav.php:64
-msgid "Sign in"
-msgstr "Entra"
+#: ../../mod/editpost.php:31
+msgid "Item is not editable"
+msgstr "L'elemento non è modificabile"
-#: ../../include/nav.php:77
-msgid "Home Page"
-msgstr "Home Page"
+#: ../../mod/editpost.php:53
+msgid "Delete item?"
+msgstr "Eliminare questo elemento?"
-#: ../../include/nav.php:81
-msgid "Create an account"
-msgstr "Crea un account"
+#: ../../mod/notifications.php:26
+msgid "Invalid request identifier."
+msgstr "L'identificativo della richiesta non è valido."
-#: ../../include/nav.php:86
-msgid "Help and documentation"
-msgstr "Guida e documentazione"
+#: ../../mod/notifications.php:35
+msgid "Discard"
+msgstr "Rifiuta"
-#: ../../include/nav.php:89
-msgid "Apps"
-msgstr "Applicazioni"
+#: ../../mod/notifications.php:93 ../../mod/notify.php:54
+msgid "No more system notifications."
+msgstr "Non ci sono nuove notifiche di sistema."
-#: ../../include/nav.php:89
-msgid "Addon applications, utilities, games"
-msgstr "Applicazioni, utilità e giochi aggiuntivi"
+#: ../../mod/notifications.php:97 ../../mod/notify.php:58
+msgid "System Notifications"
+msgstr "Notifiche di sistema"
-#: ../../include/nav.php:91
-msgid "Search site content"
-msgstr "Cerca nel contenuto del sito"
+#: ../../mod/blocks.php:65
+msgid "Block Name"
+msgstr "Nome del riquadro"
-#: ../../include/nav.php:101
-msgid "Conversations on this site"
-msgstr "Conversazioni su questo sito"
+#: ../../mod/oexchange.php:23
+msgid "Unable to find your hub."
+msgstr "Impossibile raggiungere il tuo hub."
-#: ../../include/nav.php:103
-msgid "Directory"
-msgstr "Elenco"
+#: ../../mod/oexchange.php:37
+msgid "Post successful."
+msgstr "Inviato!"
-#: ../../include/nav.php:103
-msgid "People directory"
-msgstr "Elenco delle persone"
+#: ../../mod/editwebpage.php:106
+msgid "Edit Webpage"
+msgstr "Modifica la pagina web"
-#: ../../include/nav.php:113
-msgid "Conversations from your friends"
-msgstr "Conversazioni dai tuoi amici"
+#: ../../mod/editwebpage.php:116
+msgid "Delete webpage?"
+msgstr "Vuoi eliminare questa pagina web?"
-#: ../../include/nav.php:121
-msgid "Friend Requests"
-msgstr "Richieste di amicizia"
+#: ../../mod/editwebpage.php:189
+msgid "Delete Webpage"
+msgstr "Elimina la pagina web"
-#: ../../include/nav.php:123
-msgid "See all notifications"
-msgstr "Vedi tutte le notifiche"
+#: ../../mod/profile.php:64 ../../mod/profile.php:72
+msgid "Access to this profile has been restricted."
+msgstr "L'accesso a questo profilo è stato limitato."
-#: ../../include/nav.php:124
-msgid "Mark all system notifications seen"
-msgstr ""
+#: ../../mod/poke.php:159
+msgid "Poke/Prod"
+msgstr "Poke/Prod"
-#: ../../include/nav.php:128
-msgid "Private mail"
-msgstr "Posta privata"
+#: ../../mod/poke.php:160
+msgid "poke, prod or do other things to somebody"
+msgstr "Manda un poke, un prod o altro"
-#: ../../include/nav.php:129
-msgid "Inbox"
-msgstr "In arrivo"
+#: ../../mod/poke.php:161
+msgid "Recipient"
+msgstr "Destinatario"
-#: ../../include/nav.php:130
-msgid "Outbox"
-msgstr "Inviati"
+#: ../../mod/poke.php:162
+msgid "Choose what you wish to do to recipient"
+msgstr "Scegli cosa vuoi inviare al destinatario"
-#: ../../include/nav.php:134
-msgid "Manage"
-msgstr "Gestisci"
+#: ../../mod/poke.php:165
+msgid "Make this post private"
+msgstr "Rendi privato questo articolo"
-#: ../../include/nav.php:134
-msgid "Manage other pages"
-msgstr "Gestisci altre pagine"
+#: ../../mod/wall_upload.php:41 ../../mod/item.php:1068
+msgid "Wall Photos"
+msgstr "Foto della bacheca"
-#: ../../include/nav.php:138 ../../boot.php:1186
-msgid "Profiles"
-msgstr "Profili"
+#: ../../mod/channel.php:25
+msgid "You must be logged in to see this page."
+msgstr "Devi aver effettuato l'accesso per vedere questa pagina."
-#: ../../include/nav.php:138 ../../boot.php:1186
-msgid "Manage/edit profiles"
-msgstr "Gestisci/modifica i profili"
+#: ../../mod/channel.php:85
+msgid "Insufficient permissions. Request redirected to profile page."
+msgstr "Permessi insufficienti. Sarà visualizzata la pagina del profilo."
-#: ../../include/nav.php:139
-msgid "Manage/edit friends and contacts"
-msgstr "Gestisci/modifica amici e contatti"
+#: ../../mod/community.php:23
+msgid "Not available."
+msgstr "Non disponibile."
-#: ../../include/nav.php:146
-msgid "Site setup and configuration"
-msgstr "Configurazione del sito"
+#: ../../mod/community.php:32
+msgid "Community"
+msgstr "Comunità"
-#: ../../include/nav.php:170
-msgid "Nothing new here"
-msgstr "Niente di nuovo qui"
+#: ../../mod/community.php:63 ../../mod/community.php:88
+msgid "No results."
+msgstr "Nessun risultato."
-#: ../../include/contact_widgets.php:6
-msgid "Add New Contact"
-msgstr "Aggiungi nuovo contatto"
+#: ../../mod/fsuggest.php:20 ../../mod/fsuggest.php:92
+msgid "Contact not found."
+msgstr "Contatto non trovato."
-#: ../../include/contact_widgets.php:7
-msgid "Enter address or web location"
-msgstr "Inserisci posizione o indirizzo web"
+#: ../../mod/fsuggest.php:63
+msgid "Friend suggestion sent."
+msgstr "Suggerimento di amicizia inviato."
-#: ../../include/contact_widgets.php:8
-msgid "Example: bob@example.com, http://example.com/barbara"
-msgstr "Esempio: bob@example.com, http://example.com/barbara"
+#: ../../mod/fsuggest.php:97
+msgid "Suggest Friends"
+msgstr "Suggerisci amici"
-#: ../../include/contact_widgets.php:23
+#: ../../mod/fsuggest.php:99
#, php-format
-msgid "%d invitation available"
-msgid_plural "%d invitations available"
-msgstr[0] "%d invito disponibile"
-msgstr[1] "%d inviti disponibili"
+msgid "Suggest a friend for %s"
+msgstr "Suggerisci un amico a %s"
-#: ../../include/contact_widgets.php:29
-msgid "Find People"
-msgstr "Trova persone"
+#: ../../mod/editblock.php:82
+msgid "Edit Block"
+msgstr "Modifica il riquadro"
-#: ../../include/contact_widgets.php:30
-msgid "Enter name or interest"
-msgstr "Inserisci un nome o un interesse"
+#: ../../mod/editblock.php:157
+msgid "Delete Block"
+msgstr "Elimina il riquadro"
-#: ../../include/contact_widgets.php:31
-msgid "Connect/Follow"
-msgstr "Connetti/segui"
+#: ../../mod/profperm.php:25 ../../mod/profperm.php:55
+msgid "Invalid profile identifier."
+msgstr "Indentificativo del profilo non valido."
-#: ../../include/contact_widgets.php:32
-msgid "Examples: Robert Morgenstein, Fishing"
-msgstr "Esempi: Mario Rossi, Pesca"
+#: ../../mod/profperm.php:101
+msgid "Profile Visibility Editor"
+msgstr "Modifica la visibilità del profilo"
-#: ../../include/contact_widgets.php:36
-msgid "Random Profile"
-msgstr "Profilo causale"
+#: ../../mod/profperm.php:105
+msgid "Click on a contact to add or remove."
+msgstr "Clicca su un contatto per aggiungerlo o rimuoverlo."
-#: ../../include/contact_widgets.php:68
-msgid "Networks"
-msgstr "Reti"
+#: ../../mod/profperm.php:114
+msgid "Visible To"
+msgstr "Visibile a"
-#: ../../include/contact_widgets.php:71
-msgid "All Networks"
-msgstr "Tutte le Reti"
+#: ../../mod/profperm.php:130
+msgid "All Contacts (with secure profile access)"
+msgstr "Tutti i contatti (con accesso fidato al profilo)"
-#: ../../include/contact_widgets.php:98
-msgid "Saved Folders"
-msgstr "Cartelle Salvate"
+#: ../../mod/siteinfo.php:57
+#, php-format
+msgid "Version %s"
+msgstr "Versione %s"
-#: ../../include/contact_widgets.php:101 ../../include/contact_widgets.php:129
-msgid "Everything"
-msgstr "Tutto"
+#: ../../mod/siteinfo.php:76
+msgid "Installed plugins/addons/apps:"
+msgstr "App e componenti aggiuntivi instalati:"
-#: ../../include/contact_widgets.php:126
-msgid "Categories"
-msgstr "Categorie"
+#: ../../mod/siteinfo.php:89
+msgid "No installed plugins/addons/apps"
+msgstr "Nessuna app o componente aggiuntivo installato"
-#: ../../include/auth.php:35
-msgid "Logged out."
-msgstr "Uscita effettuata."
+#: ../../mod/siteinfo.php:92
+msgid "Red"
+msgstr "Red"
-#: ../../include/auth.php:114
+#: ../../mod/siteinfo.php:93
msgid ""
-"We encountered a problem while logging in with the OpenID you provided. "
-"Please check the correct spelling of the ID."
-msgstr "Abbiamo incontrato un problema mentre contattavamo il server OpenID che ci hai fornito. Controlla di averlo scritto giusto."
-
-#: ../../include/auth.php:114
-msgid "The error message was:"
-msgstr "Il messaggio riportato era:"
+"This is a hub of the Red Matrix - a global cooperative network of "
+"decentralised privacy enhanced websites."
+msgstr "Questo è un hub di Red Matrix - una rete cooperativa e decentralizzata di siti con elevato livello di privacy. "
-#: ../../include/datetime.php:43 ../../include/datetime.php:45
-msgid "Miscellaneous"
-msgstr "Varie"
-
-#: ../../include/datetime.php:153 ../../include/datetime.php:285
-msgid "year"
-msgstr "anno"
-
-#: ../../include/datetime.php:158 ../../include/datetime.php:286
-msgid "month"
-msgstr "mese"
-
-#: ../../include/datetime.php:163 ../../include/datetime.php:288
-msgid "day"
-msgstr "giorno"
-
-#: ../../include/datetime.php:276
-msgid "never"
-msgstr "mai"
-
-#: ../../include/datetime.php:282
-msgid "less than a second ago"
-msgstr "meno di un secondo fa"
-
-#: ../../include/datetime.php:287
-msgid "week"
-msgstr "settimana"
-
-#: ../../include/datetime.php:289
-msgid "hour"
-msgstr "ora"
-
-#: ../../include/datetime.php:289
-msgid "hours"
-msgstr "ore"
-
-#: ../../include/datetime.php:290
-msgid "minute"
-msgstr "minuto"
-
-#: ../../include/datetime.php:290
-msgid "minutes"
-msgstr "minuti"
-
-#: ../../include/datetime.php:291
-msgid "second"
-msgstr "secondo"
-
-#: ../../include/datetime.php:291
-msgid "seconds"
-msgstr "secondi"
-
-#: ../../include/datetime.php:300
-#, php-format
-msgid "%1$d %2$s ago"
-msgstr "%1$d %2$s fa"
-
-#: ../../include/datetime.php:472 ../../include/items.php:1688
-#, php-format
-msgid "%s's birthday"
-msgstr ""
-
-#: ../../include/datetime.php:473 ../../include/items.php:1689
-#, php-format
-msgid "Happy Birthday %s"
-msgstr ""
+#: ../../mod/siteinfo.php:96
+msgid "Running at web location"
+msgstr "In esecuzione sull'indirizzo web"
-#: ../../include/onepoll.php:399
-msgid "From: "
-msgstr "Da: "
+#: ../../mod/siteinfo.php:97
+msgid ""
+"Please visit <a href=\"http://getzot.com\">GetZot.com</a> to learn more "
+"about the Red Matrix."
+msgstr "Visita <a href=\"http://getzot.com\">GetZot.com</a> per scoprire il progetto Red Matrix."
-#: ../../include/bbcode.php:185 ../../include/bbcode.php:406
-msgid "Image/photo"
-msgstr "Immagine/foto"
+#: ../../mod/siteinfo.php:98
+msgid "Bug reports and issues: please visit"
+msgstr "Per segnalare bug e problemi: visita"
-#: ../../include/bbcode.php:371 ../../include/bbcode.php:391
-msgid "$1 wrote:"
-msgstr "$1 ha scritto:"
+#: ../../mod/siteinfo.php:101
+msgid ""
+"Suggestions, praise, donations, etc. - please email \"redmatrix\" at "
+"librelist - dot com"
+msgstr "Per consigli, ringraziamenti, donazioni, ecc. - scrivi a \"redmatrix\" at librelist - dot com"
-#: ../../include/bbcode.php:410 ../../include/bbcode.php:411
-msgid "Encrypted content"
-msgstr ""
+#: ../../mod/suggest.php:35
+msgid ""
+"No suggestions available. If this is a new site, please try again in 24 "
+"hours."
+msgstr "Nessun suggerimento disponibile. Se questo è un sito nuovo, riprova tra 24 ore."
-#: ../../include/dba.php:41
-#, php-format
-msgid "Cannot locate DNS info for database server '%s'"
-msgstr "Non trovo le informazioni DNS per il database server '%s'"
+#: ../../mod/message.php:41
+msgid "Conversation removed."
+msgstr "Conversazione rimossa."
-#: ../../include/message.php:15 ../../include/message.php:171
-msgid "[no subject]"
-msgstr "[nessun oggetto]"
+#: ../../mod/message.php:56
+msgid "No messages."
+msgstr "Nessun messaggio."
-#: ../../include/acl_selectors.php:286
-msgid "Visible to everybody"
-msgstr "Visibile a tutti"
+#: ../../mod/message.php:74
+msgid "D, d M Y - g:i A"
+msgstr "D d M Y - G:i"
-#: ../../include/enotify.php:16
-msgid "Friendica Notification"
-msgstr "Notifica Friendica"
+#: ../../mod/pubsites.php:22
+msgid "Public Sites"
+msgstr "Siti pubblici"
-#: ../../include/enotify.php:19
-msgid "Thank You,"
-msgstr "Grazie,"
+#: ../../mod/pubsites.php:25
+msgid ""
+"The listed sites allow public registration into the Red Matrix. All sites in"
+" the matrix are interlinked so membership on any of them conveys membership "
+"in the matrix as a whole. Some sites may require subscription or provide "
+"tiered service plans. The provider links <strong>may</strong> provide "
+"additional details."
+msgstr "Gli indirizzi elencati permettono la registrazione su Red Matrix. Tutti i siti di questa rete sono interconnessi, quindi essere registrati su uno è come essere registrati ovunque. Alcuni potrebbero richiedere un'iscrizione a pagamento o prevedere tipi diversi di abbonamento. Potrai trovare maggiori informazioni al riguardo visitando ciascun sito."
-#: ../../include/enotify.php:21
-#, php-format
-msgid "%s Administrator"
-msgstr "Amministratore %s"
+#: ../../mod/pubsites.php:31
+msgid "Site URL"
+msgstr "URL del sito"
-#: ../../include/enotify.php:40
-#, php-format
-msgid "%s <!item_type!>"
-msgstr "%s <!item_type!>"
+#: ../../mod/pubsites.php:31
+msgid "Access Type"
+msgstr "Tipo di accesso"
-#: ../../include/enotify.php:44
-#, php-format
-msgid "[Friendica:Notify] New mail received at %s"
-msgstr "[Friendica:Notifica] Nuovo messaggio privato ricevuto su %s"
+#: ../../mod/pubsites.php:31
+msgid "Registration Policy"
+msgstr "Politica di registrazione"
-#: ../../include/enotify.php:46
-#, php-format
-msgid "%1$s sent you a new private message at %2$s."
-msgstr ""
+#: ../../mod/register.php:43
+msgid "Maximum daily site registrations exceeded. Please try again tomorrow."
+msgstr "È stato superato il numero massimo giornaliero di registrazioni a questo sito. Riprova domani!"
-#: ../../include/enotify.php:47
-#, php-format
-msgid "%1$s sent you %2$s."
-msgstr ""
-
-#: ../../include/enotify.php:47
-msgid "a private message"
-msgstr "un messaggio privato"
+#: ../../mod/register.php:49
+msgid ""
+"Please indicate acceptance of the Terms of Service. Registration failed."
+msgstr "Impossibile proseguire. Devi prima accettare le Condizioni d'Uso del servizio."
-#: ../../include/enotify.php:48
-#, php-format
-msgid "Please visit %s to view and/or reply to your private messages."
-msgstr "Visita %s per vedere e/o rispodere ai tuoi messaggi privati."
+#: ../../mod/register.php:77
+msgid "Passwords do not match."
+msgstr "Le password non corrispondono."
-#: ../../include/enotify.php:89
-#, php-format
-msgid "%1$s commented on [url=%2$s]a %3$s[/url]"
-msgstr ""
+#: ../../mod/register.php:105
+msgid ""
+"Registration successful. Please check your email for validation "
+"instructions."
+msgstr "La registrazione è terminata correttamente. Per continuare controlla l'email che ti è stata inviata."
-#: ../../include/enotify.php:96
-#, php-format
-msgid "%1$s commented on [url=%2$s]%3$s's %4$s[/url]"
-msgstr ""
+#: ../../mod/register.php:111
+msgid "Your registration is pending approval by the site owner."
+msgstr "La tua richiesta è in attesa di approvazione da parte dell'amministratore del sito."
-#: ../../include/enotify.php:104
-#, php-format
-msgid "%1$s commented on [url=%2$s]your %3$s[/url]"
-msgstr ""
+#: ../../mod/register.php:114
+msgid "Your registration can not be processed."
+msgstr "La tua registrazione non puo' essere acquisita."
-#: ../../include/enotify.php:114
-#, php-format
-msgid "[Friendica:Notify] Comment to conversation #%1$d by %2$s"
-msgstr ""
+#: ../../mod/register.php:147
+msgid "Registration on this site/hub is by approval only."
+msgstr "La registrazione su questo sito è soggetta ad approvazione."
-#: ../../include/enotify.php:115
-#, php-format
-msgid "%s commented on an item/conversation you have been following."
-msgstr "%s ha commentato un elemento che stavi seguendo."
+#: ../../mod/register.php:148
+msgid "<a href=\"pubsites\">Register at another affiliated site/hub</a>"
+msgstr "<a href=\"pubsites\">Registrati su un altro server affiliato</a>"
-#: ../../include/enotify.php:118 ../../include/enotify.php:133
-#: ../../include/enotify.php:146 ../../include/enotify.php:164
-#: ../../include/enotify.php:177
-#, php-format
-msgid "Please visit %s to view and/or reply to the conversation."
-msgstr "Visita %s per vedere e/o commentare la conversazione"
+#: ../../mod/register.php:156
+msgid ""
+"This site has exceeded the number of allowed daily account registrations. "
+"Please try again tomorrow."
+msgstr "Questo sito ha superato il numero di registrazioni giornaliere consentite. Prova di nuovo domani."
-#: ../../include/enotify.php:125
-#, php-format
-msgid "[Friendica:Notify] %s posted to your profile wall"
-msgstr "[Friendica:Notifica] %s ha scritto sulla tua bacheca"
+#: ../../mod/register.php:167
+msgid "Terms of Service"
+msgstr "Condizioni d'Uso"
-#: ../../include/enotify.php:127
+#: ../../mod/register.php:173
#, php-format
-msgid "%1$s posted to your profile wall at %2$s"
-msgstr ""
+msgid "I accept the %s for this website"
+msgstr "Accetto le %s di questo sito"
-#: ../../include/enotify.php:129
+#: ../../mod/register.php:175
#, php-format
-msgid "%1$s posted to [url=%2$s]your wall[/url]"
-msgstr ""
+msgid "I am over 13 years of age and accept the %s for this website"
+msgstr "Ho più di 13 anni e accetto le %s di questo sito"
-#: ../../include/enotify.php:140
-#, php-format
-msgid "[Friendica:Notify] %s tagged you"
-msgstr "[Friendica:Notifica] %s ti ha taggato"
+#: ../../mod/register.php:194
+msgid "Membership on this site is by invitation only."
+msgstr "Per registrarsi su questo sito è necessario un invito."
-#: ../../include/enotify.php:141
-#, php-format
-msgid "%1$s tagged you at %2$s"
-msgstr ""
+#: ../../mod/register.php:195
+msgid "Please enter your invitation code"
+msgstr "Inserisci il codice dell'invito"
-#: ../../include/enotify.php:142
-#, php-format
-msgid "%1$s [url=%2$s]tagged you[/url]."
-msgstr ""
+#: ../../mod/register.php:198
+msgid "Your email address"
+msgstr "Il tuo indirizzo email"
-#: ../../include/enotify.php:154
-#, php-format
-msgid "[Friendica:Notify] %1$s poked you"
-msgstr ""
+#: ../../mod/register.php:199
+msgid "Choose a password"
+msgstr "Scegli una password"
-#: ../../include/enotify.php:155
-#, php-format
-msgid "%1$s poked you at %2$s"
-msgstr ""
+#: ../../mod/register.php:200
+msgid "Please re-enter your password"
+msgstr "Ripeti la password per verifica"
-#: ../../include/enotify.php:156
-#, php-format
-msgid "%1$s [url=%2$s]poked you[/url]."
-msgstr ""
+#: ../../mod/regmod.php:12
+msgid "Please login."
+msgstr "Accedi."
-#: ../../include/enotify.php:171
-#, php-format
-msgid "[Friendica:Notify] %s tagged your post"
-msgstr "[Friendica:Notifica] %s ha taggato un tuo messaggio"
+#: ../../mod/removeme.php:49
+msgid "Remove This Channel"
+msgstr "Elimina questo canale"
-#: ../../include/enotify.php:172
-#, php-format
-msgid "%1$s tagged your post at %2$s"
-msgstr ""
+#: ../../mod/removeme.php:50
+msgid ""
+"This will completely remove this channel from the network. Once this has "
+"been done it is not recoverable."
+msgstr "Questo comando rimuoverà completamente il canale che stai usando. Una volta fatto non sarà più possibile ripristinarlo."
-#: ../../include/enotify.php:173
-#, php-format
-msgid "%1$s tagged [url=%2$s]your post[/url]"
-msgstr ""
+#: ../../mod/removeme.php:51
+msgid "Please enter your password for verification:"
+msgstr "Inserisci la tua password per verifica:"
-#: ../../include/enotify.php:184
-msgid "[Friendica:Notify] Introduction received"
-msgstr "[Friendica:Notifica] Hai ricevuto una presentazione"
+#: ../../mod/removeme.php:52
+msgid "Remove this channel and all its clones from the network"
+msgstr "Rimuovi questo canale e tutti i suoi cloni dalla rete"
-#: ../../include/enotify.php:185
-#, php-format
-msgid "You've received an introduction from '%1$s' at %2$s"
-msgstr ""
+#: ../../mod/removeme.php:52
+msgid ""
+"By default only the instance of the channel located on this hub will be "
+"removed from the network"
+msgstr "L'impostazione predefinita è che sia eliminata solo l'istanza del canale presente su questo hub, non gli eventuali cloni"
-#: ../../include/enotify.php:186
-#, php-format
-msgid "You've received [url=%1$s]an introduction[/url] from %2$s."
-msgstr ""
+#: ../../mod/removeme.php:53
+msgid "Remove My Account"
+msgstr "Elimina il mio account"
-#: ../../include/enotify.php:189 ../../include/enotify.php:207
-#, php-format
-msgid "You may visit their profile at %s"
-msgstr "Puoi visitare il suo profilo presso %s"
+#: ../../mod/item.php:145
+msgid "Unable to locate original post."
+msgstr "Impossibile trovare il messaggio originale."
-#: ../../include/enotify.php:191
-#, php-format
-msgid "Please visit %s to approve or reject the introduction."
-msgstr "Visita %s per approvare o rifiutare la presentazione."
+#: ../../mod/item.php:343
+msgid "Empty post discarded."
+msgstr "L'articolo vuoto è stato ignorato."
-#: ../../include/enotify.php:198
-msgid "[Friendica:Notify] Friend suggestion received"
-msgstr "[Friendica:Notifica] Hai ricevuto un suggerimento di amicizia"
+#: ../../mod/item.php:385
+msgid "Executable content type not permitted to this channel."
+msgstr "I contenuti eseguibili non sono permessi su questo canale."
-#: ../../include/enotify.php:199
-#, php-format
-msgid "You've received a friend suggestion from '%1$s' at %2$s"
-msgstr ""
+#: ../../mod/item.php:812
+msgid "System error. Post not saved."
+msgstr "Errore di sistema. Articolo non salvato."
-#: ../../include/enotify.php:200
+#: ../../mod/item.php:1148
#, php-format
-msgid ""
-"You've received [url=%1$s]a friend suggestion[/url] for %2$s from %3$s."
-msgstr ""
+msgid "You have reached your limit of %1$.0f top level posts."
+msgstr "Hai raggiunto il limite massimo di %1$.0f articoli sulla pagina principale."
-#: ../../include/enotify.php:205
-msgid "Name:"
-msgstr "Nome:"
-
-#: ../../include/enotify.php:206
-msgid "Photo:"
-msgstr "Foto:"
-
-#: ../../include/enotify.php:209
+#: ../../mod/item.php:1154
#, php-format
-msgid "Please visit %s to approve or reject the suggestion."
-msgstr "Visita %s per approvare o rifiutare il suggerimento."
+msgid "You have reached your limit of %1$.0f webpages."
+msgstr "Hai raggiunto il limite massimo di %1$.0f pagine web."
-#: ../../include/follow.php:32
-msgid "Connect URL missing."
-msgstr "URL di connessione mancante."
-
-#: ../../include/follow.php:59
-msgid ""
-"This site is not configured to allow communications with other networks."
-msgstr "Questo sito non è configurato per permettere la comunicazione con altri network."
-
-#: ../../include/follow.php:60 ../../include/follow.php:80
-msgid "No compatible communication protocols or feeds were discovered."
-msgstr "Non sono stati trovati protocolli di comunicazione o feed compatibili."
-
-#: ../../include/follow.php:78
-msgid "The profile address specified does not provide adequate information."
-msgstr "L'indirizzo del profilo specificato non fornisce adeguate informazioni."
-
-#: ../../include/follow.php:82
-msgid "An author or name was not found."
-msgstr "Non è stato trovato un nome o un autore"
-
-#: ../../include/follow.php:84
-msgid "No browser URL could be matched to this address."
-msgstr "Nessun URL puo' essere associato a questo indirizzo."
-
-#: ../../include/follow.php:86
-msgid ""
-"Unable to match @-style Identity Address with a known protocol or email "
-"contact."
-msgstr ""
-
-#: ../../include/follow.php:87
-msgid "Use mailto: in front of address to force email check."
-msgstr ""
-
-#: ../../include/follow.php:93
-msgid ""
-"The profile address specified belongs to a network which has been disabled "
-"on this site."
-msgstr "L'indirizzo del profilo specificato appartiene a un network che è stato disabilitato su questo sito."
+#: ../../mod/mood.php:138
+msgid "Mood"
+msgstr "Umore"
-#: ../../include/follow.php:103
-msgid ""
-"Limited profile. This person will be unable to receive direct/personal "
-"notifications from you."
-msgstr "Profilo limitato. Questa persona non sarà in grado di ricevere notifiche personali da te."
+#: ../../mod/mood.php:139
+msgid "Set your current mood and tell your friends"
+msgstr "Scegli il tuo umore attuale per mostrarlo agli amici"
-#: ../../include/follow.php:205
-msgid "Unable to retrieve contact information."
-msgstr "Impossibile recuperare informazioni sul contatto."
+#: ../../mod/ping.php:160
+msgid "sent you a private message"
+msgstr "ti ha inviato un messaggio privato"
-#: ../../include/follow.php:259
-msgid "following"
-msgstr "segue"
+#: ../../mod/ping.php:218
+msgid "added your channel"
+msgstr "ha aggiunto il tuo canale"
-#: ../../include/items.php:3299
-msgid "A new person is sharing with you at "
-msgstr "Una nuova persona sta condividendo con te da "
+#: ../../mod/ping.php:262
+msgid "posted an event"
+msgstr "ha creato un evento"
-#: ../../include/items.php:3299
-msgid "You have a new follower at "
-msgstr "Una nuova persona ti segue su "
+#: ../../mod/dirprofile.php:111
+msgid "Status: "
+msgstr "Stato:"
-#: ../../include/items.php:3980
-msgid "Archives"
-msgstr ""
+#: ../../mod/dirprofile.php:112
+msgid "Sexual Preference: "
+msgstr "Preferenza sessuale:"
-#: ../../include/user.php:38
-msgid "An invitation is required."
-msgstr "E' richiesto un invito."
+#: ../../mod/dirprofile.php:114
+msgid "Homepage: "
+msgstr "Homepage:"
-#: ../../include/user.php:43
-msgid "Invitation could not be verified."
-msgstr "L'invito non puo' essere verificato."
+#: ../../mod/dirprofile.php:115
+msgid "Hometown: "
+msgstr "Città dove vivo:"
-#: ../../include/user.php:51
-msgid "Invalid OpenID url"
-msgstr "Url OpenID non valido"
+#: ../../mod/dirprofile.php:117
+msgid "About: "
+msgstr "Informazioni:"
-#: ../../include/user.php:66
-msgid "Please enter the required information."
-msgstr "Inserisci le informazioni richieste."
+#: ../../mod/dirprofile.php:163
+msgid "Keywords: "
+msgstr "Parole chiave:"
-#: ../../include/user.php:80
-msgid "Please use a shorter name."
-msgstr "Usa un nome più corto."
+#: ../../view/theme/redbasic/php/config.php:74
+msgid "Scheme Default"
+msgstr "Schema predefinito"
-#: ../../include/user.php:82
-msgid "Name too short."
-msgstr "Il nome è troppo corto."
+#: ../../view/theme/redbasic/php/config.php:75
+msgid "red"
+msgstr "rosso"
-#: ../../include/user.php:97
-msgid "That doesn't appear to be your full (First Last) name."
-msgstr "Questo non sembra essere il tuo nome completo (Nome Cognome)."
+#: ../../view/theme/redbasic/php/config.php:76
+msgid "black"
+msgstr "nero"
-#: ../../include/user.php:102
-msgid "Your email domain is not among those allowed on this site."
-msgstr "Il dominio della tua email non è tra quelli autorizzati su questo sito."
+#: ../../view/theme/redbasic/php/config.php:77
+msgid "silver"
+msgstr "argento"
-#: ../../include/user.php:105
-msgid "Not a valid email address."
-msgstr "L'indirizzo email non è valido."
+#: ../../view/theme/redbasic/php/config.php:88
+#: ../../view/theme/apw/php/config.php:234
+#: ../../view/theme/blogga/view/theme/blog/config.php:69
+#: ../../view/theme/blogga/php/config.php:69
+msgid "Theme settings"
+msgstr "Impostazioni del tema"
-#: ../../include/user.php:115
-msgid "Cannot use that email."
-msgstr "Non puoi usare quell'email."
+#: ../../view/theme/redbasic/php/config.php:89
+#: ../../view/theme/apw/php/config.php:235
+msgid "Set scheme"
+msgstr "Schema"
-#: ../../include/user.php:121
-msgid ""
-"Your \"nickname\" can only contain \"a-z\", \"0-9\", \"-\", and \"_\", and "
-"must also begin with a letter."
-msgstr "Il tuo nome utente puo' contenere solo \"a-z\", \"0-9\", \"-\", e \"_\", e deve cominciare con una lettera."
+#: ../../view/theme/redbasic/php/config.php:90
+msgid "Navigation bar colour"
+msgstr "Colore della barra di navigazione"
-#: ../../include/user.php:127 ../../include/user.php:225
-msgid "Nickname is already registered. Please choose another."
-msgstr "Nome utente già registrato. Scegline un altro."
+#: ../../view/theme/redbasic/php/config.php:91
+msgid "Set font-colour for banner"
+msgstr "Colore del font del banner"
-#: ../../include/user.php:137
-msgid ""
-"Nickname was once registered here and may not be re-used. Please choose "
-"another."
-msgstr "Questo nome utente stato già registrato. Per favore, sceglierne uno nuovo."
+#: ../../view/theme/redbasic/php/config.php:92
+msgid "Set the background colour"
+msgstr "Colore di sfondo"
-#: ../../include/user.php:153
-msgid "SERIOUS ERROR: Generation of security keys failed."
-msgstr "ERRORE GRAVE: La generazione delle chiavi di sicurezza è fallita."
+#: ../../view/theme/redbasic/php/config.php:93
+msgid "Set the background image"
+msgstr "Immagine di sfondo"
-#: ../../include/user.php:211
-msgid "An error occurred during registration. Please try again."
-msgstr "C'è stato un errore durante la registrazione. Prova ancora."
+#: ../../view/theme/redbasic/php/config.php:94
+msgid "Set the background colour of items"
+msgstr "Colore di sfondo degli elementi della pagina"
-#: ../../include/user.php:246
-msgid "An error occurred creating your default profile. Please try again."
-msgstr "C'è stato un errore nella creazione del tuo profilo. Prova ancora."
+#: ../../view/theme/redbasic/php/config.php:95
+msgid "Set the opacity of items"
+msgstr "Opacità degli oggetti"
-#: ../../include/security.php:22
-msgid "Welcome "
-msgstr "Ciao"
+#: ../../view/theme/redbasic/php/config.php:96
+msgid "Set the basic colour for item icons"
+msgstr "Colore di base per le icone"
-#: ../../include/security.php:23
-msgid "Please upload a profile photo."
-msgstr "Carica una foto per il profilo."
+#: ../../view/theme/redbasic/php/config.php:97
+msgid "Set the hover colour for item icons"
+msgstr "Colore per le icone in evidenza"
-#: ../../include/security.php:26
-msgid "Welcome back "
-msgstr "Ciao "
+#: ../../view/theme/redbasic/php/config.php:98
+msgid "Set font-size for the entire application"
+msgstr "Dimensione font per tutto il sito"
-#: ../../include/security.php:344
-msgid ""
-"The form security token was not correct. This probably happened because the "
-"form has been opened for too long (>3 hours) before submitting it."
-msgstr ""
+#: ../../view/theme/redbasic/php/config.php:99
+#: ../../view/theme/apw/php/config.php:236
+msgid "Set font-size for posts and comments"
+msgstr "Dimensioni del carattere per articoli e commenti"
-#: ../../include/Contact.php:111
-msgid "stopped following"
-msgstr ""
+#: ../../view/theme/redbasic/php/config.php:100
+msgid "Set font-colour for posts and comments"
+msgstr "Colore del carattere per articoli e commenti"
-#: ../../include/Contact.php:220 ../../include/conversation.php:734
-msgid "Poke"
-msgstr ""
+#: ../../view/theme/redbasic/php/config.php:101
+msgid "Set radius of corners"
+msgstr "Raggio degli angoli stondati"
-#: ../../include/Contact.php:221 ../../include/conversation.php:728
-msgid "View Status"
-msgstr "Visualizza stato"
+#: ../../view/theme/redbasic/php/config.php:102
+msgid "Set shadow depth of photos"
+msgstr "Profondità dell'ombra delle foto"
-#: ../../include/Contact.php:222 ../../include/conversation.php:729
-msgid "View Profile"
-msgstr "Visualizza profilo"
+#: ../../view/theme/redbasic/php/config.php:103
+msgid "Set maximum width of conversation regions"
+msgstr "Larghezza massima delle aree delle conversazioni"
-#: ../../include/Contact.php:223 ../../include/conversation.php:730
-msgid "View Photos"
-msgstr "Visualizza foto"
+#: ../../view/theme/redbasic/php/config.php:104
+msgid "Set minimum opacity of nav bar - to hide it"
+msgstr "Imposta l'opacità minima della barra di navigazione per nasconderla"
-#: ../../include/Contact.php:224 ../../include/Contact.php:237
-#: ../../include/conversation.php:731
-msgid "Network Posts"
-msgstr ""
+#: ../../view/theme/redbasic/php/config.php:105
+msgid "Set size of conversation author photo"
+msgstr "Dimensione foto dell'autore della conversazione"
-#: ../../include/Contact.php:225 ../../include/Contact.php:237
-#: ../../include/conversation.php:732
-msgid "Edit Contact"
-msgstr "Modifica contatti"
+#: ../../view/theme/redbasic/php/config.php:106
+msgid "Set size of followup author photos"
+msgstr "Dimensione foto dei partecipanti alla conversazione"
-#: ../../include/Contact.php:226 ../../include/Contact.php:237
-#: ../../include/conversation.php:733
-msgid "Send PM"
-msgstr "Invia messaggio privato"
+#: ../../view/theme/redbasic/php/config.php:107
+msgid "Sloppy photo albums"
+msgstr "Album con foto storte"
-#: ../../include/conversation.php:206
-#, php-format
-msgid "%1$s poked %2$s"
-msgstr ""
+#: ../../view/theme/redbasic/php/config.php:107
+msgid "Are you a clean desk or a messy desk person?"
+msgstr "La tua scrivania è sempre a posto? Sei una persona disordinata?"
-#: ../../include/conversation.php:290
-msgid "post/item"
-msgstr "post/elemento"
+#: ../../view/theme/apw/php/config.php:193
+#: ../../view/theme/apw/php/config.php:211
+msgid "Schema Default"
+msgstr "Schema predefinito"
-#: ../../include/conversation.php:291
-#, php-format
-msgid "%1$s marked %2$s's %3$s as favorite"
-msgstr "%1$s ha segnato il/la %3$s di %2$s come preferito"
+#: ../../view/theme/apw/php/config.php:194
+msgid "Sans-Serif"
+msgstr "Sans-Serif"
-#: ../../include/conversation.php:545 ../../object/Item.php:218
-msgid "Categories:"
-msgstr ""
+#: ../../view/theme/apw/php/config.php:195
+msgid "Monospace"
+msgstr "Monospace"
-#: ../../include/conversation.php:546 ../../object/Item.php:219
-msgid "Filed under:"
-msgstr ""
+#: ../../view/theme/apw/php/config.php:237
+msgid "Set font face"
+msgstr "Tipo di carattere"
-#: ../../include/conversation.php:630
-msgid "remove"
-msgstr "rimuovi"
+#: ../../view/theme/apw/php/config.php:238
+msgid "Set iconset"
+msgstr "Icone"
-#: ../../include/conversation.php:634
-msgid "Delete Selected Items"
-msgstr "Cancella elementi selezionati"
+#: ../../view/theme/apw/php/config.php:239
+msgid "Set big shadow size, default 15px 15px 15px"
+msgstr "Ombra grande, predefinita 15px 15px 15px"
-#: ../../include/conversation.php:792
-#, php-format
-msgid "%s likes this."
-msgstr "Piace a %s."
+#: ../../view/theme/apw/php/config.php:240
+msgid "Set small shadow size, default 5px 5px 5px"
+msgstr "Ombra piccola, predefinita 5px 5px 5px"
-#: ../../include/conversation.php:792
-#, php-format
-msgid "%s doesn't like this."
-msgstr "Non piace a %s."
+#: ../../view/theme/apw/php/config.php:241
+msgid "Set shadow colour, default #000"
+msgstr "Colore dell'ombra, predefinito #000"
-#: ../../include/conversation.php:796
-#, php-format
-msgid "<span %1$s>%2$d people</span> like this."
-msgstr "Piace a <span %1$s>%2$d persone</span>."
+#: ../../view/theme/apw/php/config.php:242
+msgid "Set radius size, default 5px"
+msgstr "Raggio degli angoli, predefinito 5px"
-#: ../../include/conversation.php:798
-#, php-format
-msgid "<span %1$s>%2$d people</span> don't like this."
-msgstr "Non piace a <span %1$s>%2$d persone</span>."
+#: ../../view/theme/apw/php/config.php:243
+msgid "Set line-height for posts and comments"
+msgstr "Altezza della riga per articoli e commenti"
-#: ../../include/conversation.php:804
-msgid "and"
-msgstr "e"
+#: ../../view/theme/apw/php/config.php:244
+msgid "Set background image"
+msgstr "Immagine di sfondo"
-#: ../../include/conversation.php:807
-#, php-format
-msgid ", and %d other people"
-msgstr "e altre %d persone"
+#: ../../view/theme/apw/php/config.php:245
+msgid "Set background colour"
+msgstr "Colore di sfondo"
-#: ../../include/conversation.php:808
-#, php-format
-msgid "%s like this."
-msgstr "Piace a %s."
+#: ../../view/theme/apw/php/config.php:246
+msgid "Set section background image"
+msgstr "Immagine di sfondo della sezione"
-#: ../../include/conversation.php:808
-#, php-format
-msgid "%s don't like this."
-msgstr "Non piace a %s."
+#: ../../view/theme/apw/php/config.php:247
+msgid "Set section background colour"
+msgstr "Colore di sfondo della sezione"
-#: ../../include/conversation.php:832 ../../include/conversation.php:849
-msgid "Visible to <strong>everybody</strong>"
-msgstr "Visibile a <strong>tutti</strong>"
+#: ../../view/theme/apw/php/config.php:248
+msgid "Set colour of items - use hex"
+msgstr "Colore degli elementi della pagina - esadecimale"
-#: ../../include/conversation.php:834 ../../include/conversation.php:851
-msgid "Please enter a video link/URL:"
-msgstr "Inserisci un collegamento video / URL:"
+#: ../../view/theme/apw/php/config.php:249
+msgid "Set colour of links - use hex"
+msgstr "Colore dei link - esadecimale"
-#: ../../include/conversation.php:835 ../../include/conversation.php:852
-msgid "Please enter an audio link/URL:"
-msgstr "Inserisci un collegamento audio / URL:"
+#: ../../view/theme/apw/php/config.php:250
+msgid "Set max-width for items. Default 400px"
+msgstr "Larghezza massima degli elementi della pagina. Predefinita: 400px"
-#: ../../include/conversation.php:836 ../../include/conversation.php:853
-msgid "Tag term:"
-msgstr "Tag:"
+#: ../../view/theme/apw/php/config.php:251
+msgid "Set min-width for items. Default 240px"
+msgstr "Larghezza minima degli elementi della pagina. Predefinita: 240px"
-#: ../../include/conversation.php:838 ../../include/conversation.php:855
-msgid "Where are you right now?"
-msgstr "Dove sei ora?"
+#: ../../view/theme/apw/php/config.php:252
+msgid "Set the generic content wrapper width. Default 48%"
+msgstr "Larghezza di tutta l'area dei contenuti. Predefinita: 48%"
-#: ../../include/conversation.php:898
-msgid "upload photo"
-msgstr "carica foto"
+#: ../../view/theme/apw/php/config.php:253
+msgid "Set colour of fonts - use hex"
+msgstr "Colore dei caratteri - esadecimale"
-#: ../../include/conversation.php:900
-msgid "attach file"
-msgstr "allega file"
+#: ../../view/theme/apw/php/config.php:254
+msgid "Set background-size element"
+msgstr "Background-size element"
-#: ../../include/conversation.php:902
-msgid "web link"
-msgstr "link web"
+#: ../../view/theme/apw/php/config.php:255
+msgid "Item opacity"
+msgstr "Opacità degli elementi della pagina"
-#: ../../include/conversation.php:903
-msgid "Insert video link"
-msgstr "Inserire collegamento video"
+#: ../../view/theme/apw/php/config.php:256
+msgid "Display post previews only"
+msgstr "Mostra le anteprime solo degli articoli"
-#: ../../include/conversation.php:904
-msgid "video link"
-msgstr "link video"
+#: ../../view/theme/apw/php/config.php:257
+msgid "Display side bar on channel page"
+msgstr "Mostra la colonna laterale sulla pagina del canale"
-#: ../../include/conversation.php:905
-msgid "Insert audio link"
-msgstr "Inserisci collegamento audio"
+#: ../../view/theme/apw/php/config.php:258
+msgid "Colour of the navigation bar"
+msgstr "Colore della barra di navigazione"
-#: ../../include/conversation.php:906
-msgid "audio link"
-msgstr "link audio"
+#: ../../view/theme/apw/php/config.php:259
+msgid "Item float"
+msgstr "Float degli oggetti della pagina"
-#: ../../include/conversation.php:908
-msgid "set location"
-msgstr "posizione"
+#: ../../view/theme/apw/php/config.php:260
+msgid "Left offset of the section element"
+msgstr "Spazio a sinistra dell'elemento section"
-#: ../../include/conversation.php:910
-msgid "clear location"
-msgstr "canc. pos."
+#: ../../view/theme/apw/php/config.php:261
+msgid "Right offset of the section element"
+msgstr "Spazio a destra dell'elemento section"
-#: ../../include/conversation.php:917
-msgid "permissions"
-msgstr "permessi"
+#: ../../view/theme/apw/php/config.php:262
+msgid "Section width"
+msgstr "Larghezza section"
-#: ../../include/plugin.php:389 ../../include/plugin.php:391
-msgid "Click here to upgrade."
-msgstr ""
+#: ../../view/theme/apw/php/config.php:263
+msgid "Left offset of the aside"
+msgstr "Spazio a sinistra del aside"
-#: ../../include/plugin.php:397
-msgid "This action exceeds the limits set by your subscription plan."
-msgstr ""
+#: ../../view/theme/apw/php/config.php:264
+msgid "Right offset of the aside element"
+msgstr "Spazio a destra del aside"
-#: ../../include/plugin.php:402
-msgid "This action is not available under your subscription plan."
-msgstr ""
+#: ../../view/theme/blogga/view/theme/blog/config.php:47
+#: ../../view/theme/blogga/php/config.php:47
+msgid "None"
+msgstr "Nessuno"
-#: ../../boot.php:573
-msgid "Delete this item?"
-msgstr "Cancellare questo elemento?"
+#: ../../view/theme/blogga/view/theme/blog/config.php:70
+#: ../../view/theme/blogga/php/config.php:70
+msgid "Header image"
+msgstr "Immagine dell'intestazione"
-#: ../../boot.php:576
-msgid "show fewer"
-msgstr "mostra di meno"
+#: ../../view/theme/blogga/view/theme/blog/config.php:71
+#: ../../view/theme/blogga/php/config.php:71
+msgid "Header image only on profile pages"
+msgstr "È possibile mettere un'immagine solo nell'intestazione dei profili"
-#: ../../boot.php:783
+#: ../../boot.php:1224
#, php-format
msgid "Update %s failed. See error logs."
-msgstr ""
+msgstr "%s: aggiornamento fallito. Controlla i log di errore."
-#: ../../boot.php:785
+#: ../../boot.php:1227
#, php-format
msgid "Update Error at %s"
-msgstr ""
-
-#: ../../boot.php:886
-msgid "Create a New Account"
-msgstr "Crea un nuovo account"
+msgstr "Errore di aggiornamento su %s"
-#: ../../boot.php:914
-msgid "Nickname or Email address: "
-msgstr "Nome utente o indirizzo email: "
+#: ../../boot.php:1391
+msgid ""
+"Create an account to access services and applications within the Red Matrix"
+msgstr "Registrati per accedere ai servizi e alle applicazioni di Red Matrix"
-#: ../../boot.php:915
-msgid "Password: "
-msgstr "Password: "
+#: ../../boot.php:1419
+msgid "Password"
+msgstr "Password"
-#: ../../boot.php:918
-msgid "Or login using OpenID: "
-msgstr "O entra con OpenID:"
+#: ../../boot.php:1420
+msgid "Remember me"
+msgstr "Resta connesso"
-#: ../../boot.php:924
+#: ../../boot.php:1425
msgid "Forgot your password?"
msgstr "Hai dimenticato la password?"
-#: ../../boot.php:1035
-msgid "Requested account is not available."
-msgstr ""
-
-#: ../../boot.php:1112
-msgid "Edit profile"
-msgstr "Modifica il profilo"
+#: ../../boot.php:1490
+msgid "permission denied"
+msgstr "permesso negato"
-#: ../../boot.php:1178
-msgid "Message"
-msgstr "Messaggio"
+#: ../../boot.php:1491
+msgid "Got Zot?"
+msgstr "Hai Zot?"
-#: ../../boot.php:1300 ../../boot.php:1386
-msgid "g A l F d"
-msgstr "g A l d F"
-
-#: ../../boot.php:1301 ../../boot.php:1387
-msgid "F d"
-msgstr "d F"
-
-#: ../../boot.php:1346 ../../boot.php:1427
-msgid "[today]"
-msgstr "[oggi]"
-
-#: ../../boot.php:1358
-msgid "Birthday Reminders"
-msgstr "Promemoria compleanni"
-
-#: ../../boot.php:1359
-msgid "Birthdays this week:"
-msgstr "Compleanni questa settimana:"
-
-#: ../../boot.php:1420
-msgid "[No description]"
-msgstr "[Nessuna descrizione]"
-
-#: ../../boot.php:1438
-msgid "Event Reminders"
-msgstr "Promemoria"
-
-#: ../../boot.php:1439
-msgid "Events this week:"
-msgstr "Eventi di questa settimana:"
-
-#: ../../boot.php:1668
-msgid "Status Messages and Posts"
-msgstr ""
-
-#: ../../boot.php:1675
-msgid "Profile Details"
-msgstr ""
-
-#: ../../boot.php:1692
-msgid "Events and Calendar"
-msgstr ""
-
-#: ../../boot.php:1699
-msgid "Only You Can See This"
-msgstr ""
+#: ../../boot.php:1887
+msgid "toggle mobile"
+msgstr "attiva/disattiva versione mobile"
diff --git a/view/it/passchanged_eml.tpl b/view/it/passchanged_eml.tpl
index ab3f1aede..0d94be3c2 100644
--- a/view/it/passchanged_eml.tpl
+++ b/view/it/passchanged_eml.tpl
@@ -1,20 +1,20 @@
-Ciao $[username],
- La tua password è cambiata come hai richiesto. Conserva queste
-informazioni (oppure cambia immediatamente la password con
-qualcosa che ti è più facile ricordare).
+Dear {{$username}},
+ Your password has been changed as requested. Please retain this
+information for your records (or change your password immediately to
+something that you will remember).
-I tuoi dati di access sono i seguenti:
+Your login details are as follows:
-Sito:»$[siteurl]
-Nome utente:»$[email]
-Password:»$[new_password]
+Site Location: {{$siteurl}}
+Login Name: {{$email}}
+Password: {{$new_password}}
-Puoi cambiare la tua password dalla pagina delle impostazioni dopo aver effettuato l'accesso.
+You may change that password from your account settings page after logging in.
-Saluti,
- l'amministratore di $[sitename]
+Sincerely,
+ {{$sitename}} Administrator
- \ No newline at end of file
+
diff --git a/view/it/register_open_eml.tpl b/view/it/register_open_eml.tpl
index 11a7752bc..4b397201c 100644
--- a/view/it/register_open_eml.tpl
+++ b/view/it/register_open_eml.tpl
@@ -1,34 +1,19 @@
-Ciao $[username],
- Grazie per aver effettuato la registrazione a $[sitename]. Il tuo account è stato creato.
-I dettagli di accesso sono i seguenti
+An account has been created at {{$sitename}} for this email address.
+The login details are as follows:
+Site Location: {{$siteurl}}
+Login: {{$email}}
+Password: (the password which was provided during registration)
-Sito:»$[siteurl]
-Nome utente:»$[email]
-Password:»$[password]
+If this account was created without your knowledge and is not desired, you may
+visit this site and reset the password. This will allow you to remove the
+account from the links on the Settings page, and we
+apologise for any inconvenience.
-Puoi cambiare la tua password dalla pagina "Impostazioni" del tuo profilo dopo aver effettuato l'accesso
-.
+Thank you and welcome to {{$sitename}}.
-Prenditi un momento per dare un'occhiata alle altre impostazioni del tuo profilo nella stessa pagina.
+Sincerely,
+ {{$sitename}} Administrator
-Potrest voler aggiungere alcune informazioni di base a quelle predefinite del profilo
-(nella pagina "Profilo") per rendere agli altri più facile trovarti.
-
-Noi raccomandiamo di impostare il tuo nome completo, di aggiungere una foto,
-di aggiungere alcune "parole chiavi" (molto utili per farsi nuovi amici) - e
-magari il paese dove vivi; se non vuoi essere più dettagliato
-di così.
-
-Noi rispettiamo il tuo diritto alla privacy e nessuna di queste informazioni è indispensabile.
-Se ancora non conosci nessuno qui, potrebbe esserti di aiuto
-per farti nuovi e interessanti amici.
-
-
-Grazie. Siamo contenti di darti il benvenuto su $[sitename]
-
-Saluti,
- l'amministratore di $[sitename]
-
- \ No newline at end of file
+
diff --git a/view/it/register_verify_eml.tpl b/view/it/register_verify_eml.tpl
index baac57976..85d9a12d3 100644
--- a/view/it/register_verify_eml.tpl
+++ b/view/it/register_verify_eml.tpl
@@ -1,25 +1,25 @@
-Su $[sitename] è stata ricevuta una nuova richiesta di registrazione da parte di un utente che richiede
-la tua approvazione.
+A new user registration request was received at {{$sitename}} which requires
+your approval.
-I tuoi dati di accesso sono i seguenti:
+The login details are as follows:
-Nome completo:»$[username]
-Sito:»$[siteurl]
-Nome utente:»$[email]
+Site Location: {{$siteurl}}
+Login Name: {{$email}}
+IP Address: {{$details}}
+To approve this request please visit the following link:
-Per approvare questa richiesta clicca su:
+{{$siteurl}}/regmod/allow/{{$hash}}
-$[siteurl]/regmod/allow/$[hash]
+To deny the request and remove the account, please visit:
-Per negare la richiesta e rimuove il profilo, clicca su:
+{{$siteurl}}/regmod/deny/{{$hash}}
-$[siteurl]/regmod/deny/$[hash]
+Thank you.
-Grazie.
diff --git a/view/it/request_notify_eml.tpl b/view/it/request_notify_eml.tpl
index 1360be90c..d01b8ff27 100644
--- a/view/it/request_notify_eml.tpl
+++ b/view/it/request_notify_eml.tpl
@@ -1,17 +1,17 @@
-Ciao $[myname],
+Dear {{$myname}},
-Hai appena ricevuto una richiesta di connessione da $[sitename]
+You have just received a connection request at {{$sitename}}
-da '$[requestor]'.
+from '{{$requestor}}'.
-Puoi visitare il suo profilo su $[url].
+You may visit their profile at {{$url}}.
-Accedi al tuo sito per vedere la richiesta completa
-e approva o ignora/annulla la richiesta.
+Please login to your site to view the complete introduction
+and approve or ignore/cancel the request.
-$[siteurl]
+{{$siteurl}}
-Saluti,
+Regards,
- l'amministratore di $[sitename] \ No newline at end of file
+ {{$sitename}} administrator
diff --git a/view/it/strings.php b/view/it/strings.php
index 7959a67e5..01462bcb2 100644
--- a/view/it/strings.php
+++ b/view/it/strings.php
@@ -4,980 +4,1316 @@ function string_plural_select_it($n){
return ($n != 1);;
}
;
-$a->strings["Post successful."] = "Inviato!";
-$a->strings["[Embedded content - reload page to view]"] = "[Contenuto incorporato - ricarica la pagina per visualizzarlo correttamente]";
-$a->strings["Contact settings applied."] = "Contatto modificato.";
-$a->strings["Contact update failed."] = "Le modifiche al contatto non sono state salvate.";
-$a->strings["Permission denied."] = "Permesso negato.";
-$a->strings["Contact not found."] = "Contatto non trovato.";
-$a->strings["Repair Contact Settings"] = "Ripara il contatto";
-$a->strings["<strong>WARNING: This is highly advanced</strong> and if you enter incorrect information your communications with this contact may stop working."] = "<strong>ATTENZIONE: Queste sono impostazioni avanzate</strong> e se inserisci informazioni errate le tue comunicazioni con questo contatto potrebbero non funzionare più";
-$a->strings["Please use your browser 'Back' button <strong>now</strong> if you are uncertain what to do on this page."] = "Usa <strong>ora</strong> il tasto 'Indietro' del tuo browser se non sei sicuro di cosa fare in questa pagina.";
-$a->strings["Return to contact editor"] = "Ritorna alla modifica contatto";
-$a->strings["Name"] = "Nome";
-$a->strings["Account Nickname"] = "Nome utente";
-$a->strings["@Tagname - overrides Name/Nickname"] = "@TagName - al posto del nome utente";
-$a->strings["Account URL"] = "URL dell'utente";
-$a->strings["Friend Request URL"] = "URL Richiesta Amicizia";
-$a->strings["Friend Confirm URL"] = "URL Conferma Amicizia";
-$a->strings["Notification Endpoint URL"] = "URL Notifiche";
-$a->strings["Poll/Feed URL"] = "URL Feed";
-$a->strings["New photo from this URL"] = "Nuova foto da questo URL";
-$a->strings["Submit"] = "Invia";
-$a->strings["Help:"] = "Guida:";
+$a->strings["Visible to everybody"] = "Visibile a tutti";
+$a->strings["show"] = "mostra";
+$a->strings["don't show"] = "non mostrare";
+$a->strings[" and "] = "e";
+$a->strings["public profile"] = "profilo pubblico";
+$a->strings["%1\$s changed %2\$s to &ldquo;%3\$s&rdquo;"] = "%1\$s ha cambiato %2\$s in &ldquo;%3\$s&rdquo;";
+$a->strings["Visit %1\$s's %2\$s"] = "Guarda %2\$s di %1\$s ";
+$a->strings["%1\$s has an updated %2\$s, changing %3\$s."] = "%1\$s ha aggiornato %2\$s cambiando %3\$s.";
+$a->strings["Public Timeline"] = "Diario pubblico";
+$a->strings["Logout"] = "Esci";
+$a->strings["End this session"] = "Chiudi questa sessione";
+$a->strings["Home"] = "Bacheca";
+$a->strings["Your posts and conversations"] = "I tuoi articoli e conversazioni";
+$a->strings["View Profile"] = "Profilo";
+$a->strings["Your profile page"] = "Il tuo profilo";
+$a->strings["Edit Profiles"] = "Modifica i profili";
+$a->strings["Manage/Edit Profiles"] = "Gestisci e modifica i profili";
+$a->strings["Photos"] = "Foto";
+$a->strings["Your photos"] = "Le tue foto";
+$a->strings["Login"] = "Accedi";
+$a->strings["Sign in"] = "Entra";
+$a->strings["%s - click to logout"] = "%s - clicca per uscire";
+$a->strings["Click to authenticate to your home hub"] = "Clicca per autenticarti sul tuo server principale";
+$a->strings["Home Page"] = "Bacheca";
+$a->strings["Register"] = "Iscriviti";
+$a->strings["Create an account"] = "Crea un account";
$a->strings["Help"] = "Guida";
-$a->strings["Not Found"] = "Non trovato";
-$a->strings["Page not found."] = "Pagina non trovata.";
+$a->strings["Help and documentation"] = "Guida e documentazione";
+$a->strings["Apps"] = "Apps";
+$a->strings["Addon applications, utilities, games"] = "App, strumenti e giochi aggiuntivi";
+$a->strings["Search"] = "Cerca";
+$a->strings["Search site content"] = "Cerca nel sito";
+$a->strings["Directory"] = "Tutti i canali";
+$a->strings["Channel Locator"] = "Ricerca canali";
+$a->strings["Matrix"] = "La tua rete";
+$a->strings["Your matrix"] = "La tua rete";
+$a->strings["Mark all matrix notifications seen"] = "Segna come lette le notifiche della tua rete";
+$a->strings["Channel Home"] = "Bacheca del canale";
+$a->strings["Channel home"] = "Bacheca del canale";
+$a->strings["Mark all channel notifications seen"] = "Segna come lette le notifiche dei canali";
+$a->strings["Intros"] = "Richieste";
+$a->strings["New Connections"] = "Nuovi contatti";
+$a->strings["Notices"] = "Notifiche";
+$a->strings["Notifications"] = "Notifiche";
+$a->strings["See all notifications"] = "Vedi tutte le notifiche";
+$a->strings["Mark all system notifications seen"] = "Segna come lette le notifiche di sistema";
+$a->strings["Mail"] = "Messaggi";
+$a->strings["Private mail"] = "Messaggi privati";
+$a->strings["See all private messages"] = "Guarda tutti i messaggi privati";
+$a->strings["Mark all private messages seen"] = "Segna come letti tutti i messaggi privati";
+$a->strings["Inbox"] = "In arrivo";
+$a->strings["Outbox"] = "Inviati";
+$a->strings["New Message"] = "Nuovo messaggio";
+$a->strings["Events"] = "Eventi";
+$a->strings["Event Calendar"] = "Calendario";
+$a->strings["See all events"] = "Guarda tutti gli eventi";
+$a->strings["Mark all events seen"] = "Marca come letti tutti gli eventi";
+$a->strings["Channel Select"] = "Gestisci i canali";
+$a->strings["Manage Your Channels"] = "Gestisci i contatti dei tuoi canali";
+$a->strings["Settings"] = "Impostazioni";
+$a->strings["Account/Channel Settings"] = "Impostazioni account e canali";
+$a->strings["Connections"] = "Contatti";
+$a->strings["Manage/Edit Friends and Connections"] = "Modifica amici e contatti";
+$a->strings["Admin"] = "Amministrazione";
+$a->strings["Site Setup and Configuration"] = "Configurazione del sito";
+$a->strings["Nothing new here"] = "Niente di nuovo qui";
+$a->strings["Please wait..."] = "Attendere...";
+$a->strings["Edit File properties"] = "Modifica le proprietà dei file";
+$a->strings["Connect"] = "Entra in contatto";
+$a->strings["New window"] = "Nuova finestra";
+$a->strings["Open the selected location in a different window or browser tab"] = "Apri l'indirizzo selezionato in una nuova scheda o finestra";
+$a->strings["Categories"] = "Categorie";
+$a->strings["Ignore/Hide"] = "Ignora/nascondi";
+$a->strings["Suggestions"] = "Suggerimenti";
+$a->strings["See more..."] = "Altro...";
+$a->strings["You have %1$.0f of %2$.0f allowed connections."] = "Hai attivato %1$.0f delle %2$.0f connessioni permesse.";
+$a->strings["Add New Connection"] = "Aggiungi un contatto";
+$a->strings["Enter the channel address"] = "Scrivi l'indirizzo del canale";
+$a->strings["Example: bob@example.com, http://example.com/barbara"] = "Per esempio: mario@pippo.it oppure http://pluto.com/barbara";
+$a->strings["Notes"] = "Note";
+$a->strings["Save"] = "Salva";
+$a->strings["Remove term"] = "Rimuovi termine";
+$a->strings["Saved Searches"] = "Ricerche salvate";
+$a->strings["add"] = "aggiungi";
+$a->strings["Saved Folders"] = "Cartelle salvate";
+$a->strings["Everything"] = "Tutto";
+$a->strings["Archives"] = "Archivi";
+$a->strings["Refresh"] = "Aggiorna";
+$a->strings["Me"] = "Io";
+$a->strings["Best Friends"] = "Buoni amici";
+$a->strings["Friends"] = "Amici";
+$a->strings["Co-workers"] = "Colleghi";
+$a->strings["Former Friends"] = "Ex amici";
+$a->strings["Acquaintances"] = "Conoscenti";
+$a->strings["Everybody"] = "Tutti";
+$a->strings["Account settings"] = "Impostazioni dell'account";
+$a->strings["Channel settings"] = "Impostazioni del canale";
+$a->strings["Additional features"] = "Funzionalità aggiuntive";
+$a->strings["Feature settings"] = "Impostazioni aggiuntive";
+$a->strings["Display settings"] = "Impostazioni grafiche";
+$a->strings["Connected apps"] = "App connesse";
+$a->strings["Export channel"] = "Esporta il canale";
+$a->strings["Automatic Permissions (Advanced)"] = "Permessi predefiniti (avanzato)";
+$a->strings["Premium Channel Settings"] = "Canale premium - impostazioni";
+$a->strings["Channel Sources"] = "Sorgenti del canale";
+$a->strings["Check Mail"] = "Controlla i messaggi";
+$a->strings["Unknown | Not categorised"] = "Sconosciuto | Senza categoria";
+$a->strings["Block immediately"] = "Blocca subito";
+$a->strings["Shady, spammer, self-marketer"] = "Spammer o dedito al marketing";
+$a->strings["Known to me, but no opinion"] = "Lo conosco, ma non ho un'opinione particolare";
+$a->strings["OK, probably harmless"] = "È ok, probabilmente innocuo";
+$a->strings["Reputable, has my trust"] = "Affidabile, ha la mia fiducia";
+$a->strings["Frequently"] = "Frequentemente";
+$a->strings["Hourly"] = "Ogni ora";
+$a->strings["Twice daily"] = "Due volte al giorno";
+$a->strings["Daily"] = "Ogni giorno";
+$a->strings["Weekly"] = "Ogni settimana";
+$a->strings["Monthly"] = "Ogni mese";
+$a->strings["Friendica"] = "Friendica";
+$a->strings["OStatus"] = "OStatus";
+$a->strings["RSS/Atom"] = "RSS/Atom";
+$a->strings["Email"] = "Email";
+$a->strings["Diaspora"] = "Diaspora";
+$a->strings["Facebook"] = "Facebook";
+$a->strings["Zot!"] = "Zot!";
+$a->strings["LinkedIn"] = "LinkedIn";
+$a->strings["XMPP/IM"] = "XMPP/IM";
+$a->strings["MySpace"] = "MySpace";
+$a->strings["Miscellaneous"] = "Altro";
+$a->strings["year"] = "anno";
+$a->strings["month"] = "mese";
+$a->strings["day"] = "giorno";
+$a->strings["never"] = "mai";
+$a->strings["less than a second ago"] = "meno di un secondo fa";
+$a->strings["years"] = "anni";
+$a->strings["months"] = "mesi";
+$a->strings["week"] = "settimana";
+$a->strings["weeks"] = "settimane";
+$a->strings["days"] = "giorni";
+$a->strings["hour"] = "ora";
+$a->strings["hours"] = "ore";
+$a->strings["minute"] = "minuto";
+$a->strings["minutes"] = "minuti";
+$a->strings["second"] = "secondo";
+$a->strings["seconds"] = "secondi";
+$a->strings["%1\$d %2\$s ago"] = "%1\$d %2\$s fa";
+$a->strings["Cannot locate DNS info for database server '%s'"] = "Non trovo le informazioni DNS per il database server '%s'";
+$a->strings["l F d, Y \\@ g:i A"] = "l d F Y \\@ G:i";
+$a->strings["Starts:"] = "Inizio:";
+$a->strings["Finishes:"] = "Fine:";
+$a->strings["Location:"] = "Luogo:";
+$a->strings["prev"] = "prec";
+$a->strings["first"] = "inizio";
+$a->strings["last"] = "fine";
+$a->strings["next"] = "succ";
+$a->strings["older"] = "più recenti";
+$a->strings["newer"] = "più nuovi";
+$a->strings["No connections"] = "Nessun contatto";
+$a->strings["%d Connection"] = array(
+ 0 => "%d contatto",
+ 1 => "%d contatti",
+);
+$a->strings["View Connections"] = "Elenco contatti";
+$a->strings["poke"] = "poke";
+$a->strings["poked"] = "ha ricevuto un poke";
+$a->strings["ping"] = "ping";
+$a->strings["pinged"] = "ha ricevuto un ping";
+$a->strings["prod"] = "prod";
+$a->strings["prodded"] = "ha ricevuto un prod";
+$a->strings["slap"] = "schiaffo";
+$a->strings["slapped"] = "ha ricevuto uno schiaffo";
+$a->strings["finger"] = "finger";
+$a->strings["fingered"] = "ha ricevuto un finger";
+$a->strings["rebuff"] = "rifiuto";
+$a->strings["rebuffed"] = "ha ricevuto un rifiuto";
+$a->strings["happy"] = "allegro";
+$a->strings["sad"] = "triste";
+$a->strings["mellow"] = "calmo";
+$a->strings["tired"] = "stanco";
+$a->strings["perky"] = "vivace";
+$a->strings["angry"] = "arrabbiato";
+$a->strings["stupified"] = "stordito";
+$a->strings["puzzled"] = "confuso";
+$a->strings["interested"] = "attento";
+$a->strings["bitter"] = "amaro";
+$a->strings["cheerful"] = "allegro";
+$a->strings["alive"] = "vivace";
+$a->strings["annoyed"] = "seccato";
+$a->strings["anxious"] = "ansioso";
+$a->strings["cranky"] = "irritabile";
+$a->strings["disturbed"] = "turbato";
+$a->strings["frustrated"] = "frustrato";
+$a->strings["motivated"] = "motivato";
+$a->strings["relaxed"] = "rilassato";
+$a->strings["surprised"] = "sorpreso";
+$a->strings["Monday"] = "lunedì";
+$a->strings["Tuesday"] = "martedì";
+$a->strings["Wednesday"] = "mercoledì";
+$a->strings["Thursday"] = "giovedì";
+$a->strings["Friday"] = "venerdì";
+$a->strings["Saturday"] = "sabato";
+$a->strings["Sunday"] = "domenica";
+$a->strings["January"] = "gennaio";
+$a->strings["February"] = "febbraio";
+$a->strings["March"] = "marzo";
+$a->strings["April"] = "aprile";
+$a->strings["May"] = "maggio";
+$a->strings["June"] = "giugno";
+$a->strings["July"] = "luglio";
+$a->strings["August"] = "agosto";
+$a->strings["September"] = "settembre";
+$a->strings["October"] = "ottobre";
+$a->strings["November"] = "novembre";
+$a->strings["December"] = "dicembre";
+$a->strings["unknown.???"] = "sconosciuto???";
+$a->strings["bytes"] = "byte";
+$a->strings["remove category"] = "rimuovi la categoria";
+$a->strings["remove from file"] = "rimuovi dal file";
+$a->strings["Click to open/close"] = "Clicca per aprire/chiudere";
+$a->strings["link to source"] = "Link all'originale";
+$a->strings["Select a page layout: "] = "Scegli il layout della pagina:";
+$a->strings["default"] = "predefinito";
+$a->strings["Page content type: "] = "Contenuto della pagina:";
+$a->strings["Select an alternate language"] = "Seleziona una lingua diversa";
+$a->strings["photo"] = "la foto";
+$a->strings["event"] = "l'evento";
+$a->strings["status"] = "il messaggio di stato";
+$a->strings["comment"] = "il commento";
+$a->strings["activity"] = "l'attività";
+$a->strings["Design"] = "Design";
+$a->strings["Blocks"] = "Riquadri";
+$a->strings["Menus"] = "Menù";
+$a->strings["Layouts"] = "Layout";
+$a->strings["Pages"] = "Pagine";
+$a->strings["A deleted group with this name was revived. Existing item permissions <strong>may</strong> apply to this group and any future members. If this is not what you intended, please create another group with a different name."] = "È stato ripristinato un insieme con lo stesso nome che era stato eliminato in precedenza. I permessi già presenti <strong>potrebbero</strong> rimanere validi per i nuovi canali. Se non vuoi che ciò accada, devi creare un altro insieme con un nome diverso.";
+$a->strings["Default privacy group for new contacts"] = "Insieme predefinito per i nuovi canali che aggiungi";
+$a->strings["All Channels"] = "Tutti i canali";
+$a->strings["edit"] = "modifica";
+$a->strings["Collections"] = "Insiemi di canali";
+$a->strings["Edit collection"] = "Modifica l'insieme di canali";
+$a->strings["Create a new collection"] = "Crea un nuovo insieme";
+$a->strings["Channels not in any collection"] = "Canali che non sono in un insieme";
+$a->strings["Delete this item?"] = "Eliminare questo elemento?";
+$a->strings["Comment"] = "Commento";
+$a->strings["show more"] = "mostra tutto";
+$a->strings["show fewer"] = "riduci";
+$a->strings["Password too short"] = "Password troppo corta";
+$a->strings["Passwords do not match"] = "Le password non corrispondono";
+$a->strings["everybody"] = "tutti";
+$a->strings["Secret Passphrase"] = "Chiave segreta";
+$a->strings["Passphrase hint"] = "Suggerimento per la chiave segreta";
+$a->strings["timeago.prefixAgo"] = "timeago.prefixAgo";
+$a->strings["timeago.suffixAgo"] = "timeago.suffixAgo";
+$a->strings["ago"] = "fa";
+$a->strings["from now"] = "da adesso";
+$a->strings["less than a minute"] = "meno di un minuto";
+$a->strings["about a minute"] = "circa un minuto";
+$a->strings["%d minutes"] = "%d minuti";
+$a->strings["about an hour"] = "circa un’ora";
+$a->strings["about %d hours"] = "circa %d ore";
+$a->strings["a day"] = "un giorno";
+$a->strings["%d days"] = "%d giorni";
+$a->strings["about a month"] = "circa un mese";
+$a->strings["%d months"] = "%d mesi";
+$a->strings["about a year"] = "circa un anno";
+$a->strings["%d years"] = "%d anni";
+$a->strings[" "] = " ";
+$a->strings["timeago.numbers"] = "timeago.numbers";
+$a->strings["No recipient provided."] = "Devi scegliere un destinatario.";
+$a->strings["[no subject]"] = "[nessun titolo]";
+$a->strings["Unable to determine sender."] = "Impossibile determinare il mittente.";
+$a->strings["Stored post could not be verified."] = "Non è stato possibile verificare l'articolo inserito.";
+$a->strings["Profile Photos"] = "Foto del profilo";
+$a->strings["view full size"] = "guarda nelle dimensioni reali";
+$a->strings["Image/photo"] = "Immagine";
+$a->strings["Encrypted content"] = "Contenuto crittografato";
+$a->strings["QR code"] = "QR code";
+$a->strings["%1\$s wrote the following %2\$s %3\$s"] = "%1\$s ha scritto %2\$s seguente %3\$s";
+$a->strings["post"] = "l'articolo";
+$a->strings["$1 wrote:"] = "$1 ha scritto:";
+$a->strings["Embedded content"] = "Contenuti incorporati";
+$a->strings["Embedding disabled"] = "Contenuti incorporati - funzione disabilitata";
+$a->strings["General Features"] = "Funzionalità generali";
+$a->strings["Content Expiration"] = "Scadenza";
+$a->strings["Remove posts/comments and/or private messages at a future time"] = "Elimina gli articoli, i commenti o i messaggi privati dopo che è trascorso del tempo";
+$a->strings["Multiple Profiles"] = "Profili multipli";
+$a->strings["Ability to create multiple profiles"] = "Abilitazione a creare profili multipli";
+$a->strings["Web Pages"] = "Pagine web";
+$a->strings["Provide managed web pages on your channel"] = "Attiva la creazione di pagine web sul tuo canale";
+$a->strings["Private Notes"] = "Note private";
+$a->strings["Enables a tool to store notes and reminders"] = "Abilita il riquadro per scrivere annotazioni";
+$a->strings["Extended Identity Sharing"] = "Condivisione avanzata dell'identità";
+$a->strings["Share your identity with all websites on the internet. When disabled, identity is only shared with sites in the matrix."] = "Rendi nota la tua identità a tutti i siti internet. Se disabilitato, la tua identità sarà comunicata solo ai siti red matrix.";
+$a->strings["Expert Mode"] = "Modalità esperto";
+$a->strings["Enable Expert Mode to provide advanced configuration options"] = "Abilita la modalità esperto per vedere le opzioni di configurazione avanzate";
+$a->strings["Premium Channel"] = "Canale premium";
+$a->strings["Allows you to set restrictions and terms on those that connect with your channel"] = "Ti permette di imporre delle restrizioni e dei termini d'uso a chi segue il canale";
+$a->strings["Post Composition Features"] = "Modalità di scrittura articoli";
+$a->strings["Richtext Editor"] = "Editor grafico";
+$a->strings["Enable richtext editor"] = "Abilita l'editor grafico";
+$a->strings["Post Preview"] = "Anteprima articolo";
+$a->strings["Allow previewing posts and comments before publishing them"] = "Abilita l'anteprima degli articoli e dei commenti prima di pubblicarli";
+$a->strings["Automatically import channel content from other channels or feeds"] = "Importa automaticamente il contenuto del canale da altri canali o feed";
+$a->strings["Even More Encryption"] = "Crittografia addizionale";
+$a->strings["Allow optional encryption of content end-to-end with a shared secret key"] = "Rendi possibile la crittografia dei contenuti tra mittente e destinatari con una chiave segreta";
+$a->strings["Network and Stream Filtering"] = "Filtraggio dei contenuti";
+$a->strings["Search by Date"] = "Ricerca per data";
+$a->strings["Ability to select posts by date ranges"] = "Per selezionare gli articoli in un intervallo tra date";
+$a->strings["Collections Filter"] = "Filtra per insiemi di canali";
+$a->strings["Enable widget to display Network posts only from selected collections"] = "Mostra il riquadro per filtrare gli articoli di certi insiemi di canali";
+$a->strings["Save search terms for re-use"] = "Salva i termini delle ricerche per poterle ripetere";
+$a->strings["Network Personal Tab"] = "Attività personale";
+$a->strings["Enable tab to display only Network posts that you've interacted on"] = "Abilita il link per mostrare solamente i contenuti con cui hai interagito";
+$a->strings["Network New Tab"] = "Contenuti nuovi";
+$a->strings["Enable tab to display all new Network activity"] = "Abilita il link per visualizzare solo i nuovi contenuti";
+$a->strings["Affinity Tool"] = "Filtro per affinità";
+$a->strings["Filter stream activity by depth of relationships"] = "Permette di selezionare i contenuti in base al livello di amicizia";
+$a->strings["Suggest Channels"] = "Suggerisci canali";
+$a->strings["Show channel suggestions"] = "Mostra alcuni canali che potrebbero interessarti";
+$a->strings["Post/Comment Tools"] = "Gestione articoli e commenti";
+$a->strings["Edit Sent Posts"] = "Modifica gli articoli già inviati";
+$a->strings["Edit and correct posts and comments after sending"] = "Modifica e correggi gli articoli o i commenti anche dopo l'invio";
+$a->strings["Tagging"] = "Tag";
+$a->strings["Ability to tag existing posts"] = "Permetti l'aggiunta di tag su articoli già esistenti";
+$a->strings["Post Categories"] = "Categorie degli articoli";
+$a->strings["Add categories to your posts"] = "Abilita le categorie per i tuoi articoli";
+$a->strings["Ability to file posts under folders"] = "Abilita la raccolta dei tuoi articoli in cartelle";
+$a->strings["Dislike Posts"] = "Non mi piace";
+$a->strings["Ability to dislike posts/comments"] = "Abilità la funzionalità \"non mi piace\" per i tuoi articoli";
+$a->strings["Star Posts"] = "Articoli stella (preferiti)";
+$a->strings["Ability to mark special posts with a star indicator"] = "Mostra la stella per scegliere gli articoli preferiti";
+$a->strings["Tag Cloud"] = "Nuvola di tag";
+$a->strings["Provide a personal tag cloud on your channel page"] = "Mostra la nuvola dei tag che usi di più sulla pagina del tuo canale";
+$a->strings["channel"] = "canale";
+$a->strings["%1\$s likes %2\$s's %3\$s"] = "A %1\$s piace %3\$s di %2\$s";
+$a->strings["%1\$s doesn't like %2\$s's %3\$s"] = "A %1\$s non piace %3\$s di %2\$s";
+$a->strings["%1\$s is now connected with %2\$s"] = "%1\$s adesso è connesso con %2\$s";
+$a->strings["%1\$s poked %2\$s"] = "%1\$s ha mandato un poke a %2\$s";
+$a->strings["%1\$s is currently %2\$s"] = "%1\$s al momento è %2\$s";
+$a->strings["Select"] = "Seleziona";
+$a->strings["Delete"] = "Elimina";
+$a->strings["Message is verified"] = "Messaggio verificato";
+$a->strings["View %s's profile @ %s"] = "Vedi il profilo di %s @ %s";
+$a->strings["Categories:"] = "Categorie:";
+$a->strings["Filed under:"] = "Classificato come:";
+$a->strings[" from %s"] = " da %s";
+$a->strings["last edited: %s"] = "ultima modifica: %s";
+$a->strings["View in context"] = "Vedi nel contesto";
+$a->strings["Please wait"] = "Attendere";
+$a->strings["remove"] = "rimuovi";
+$a->strings["Loading..."] = "Caricamento in corso...";
+$a->strings["Delete Selected Items"] = "Elimina gli oggetti selezionati";
+$a->strings["View Source"] = "Vedi il sorgente";
+$a->strings["Follow Thread"] = "Segui la discussione";
+$a->strings["View Status"] = "Guarda il messaggio di stato";
+$a->strings["View Photos"] = "Guarda le foto";
+$a->strings["Matrix Activity"] = "Attività nella tua rete";
+$a->strings["Edit Contact"] = "Modifica il contatto";
+$a->strings["Send PM"] = "Invia messaggio privato";
+$a->strings["Poke"] = "Poke";
+$a->strings["%s likes this."] = "Piace a %s.";
+$a->strings["%s doesn't like this."] = "Non piace a %s.";
+$a->strings["<span %1\$s>%2\$d people</span> like this."] = array(
+ 0 => "",
+ 1 => "Piace a <span %1\$s>%2\$d persone</span>.",
+);
+$a->strings["<span %1\$s>%2\$d people</span> don't like this."] = array(
+ 0 => "",
+ 1 => "Non piace a <span %1\$s>%2\$d persone</span>.",
+);
+$a->strings["and"] = "e";
+$a->strings[", and %d other people"] = array(
+ 0 => "",
+ 1 => "e altre %d persone",
+);
+$a->strings["%s like this."] = "Piace a %s.";
+$a->strings["%s don't like this."] = "Non piace a %s.";
+$a->strings["Visible to <strong>everybody</strong>"] = "Visibile a <strong>tutti</strong>";
+$a->strings["Please enter a link URL:"] = "Inserisci l'indirizzo del link:";
+$a->strings["Please enter a video link/URL:"] = "Inserisci l'indirizzo del video:";
+$a->strings["Please enter an audio link/URL:"] = "Inserisci l'indirizzo dell'audio:";
+$a->strings["Tag term:"] = "Tag:";
+$a->strings["Save to Folder:"] = "Salva nella cartella:";
+$a->strings["Where are you right now?"] = "Dove sei ora?";
+$a->strings["Expires YYYY-MM-DD HH:MM"] = "Scadenza il AAAA-MM-GG OO:MM";
+$a->strings["Preview"] = "Anteprima";
+$a->strings["Share"] = "Condividi";
+$a->strings["Page link title"] = "Link del titolo";
+$a->strings["Upload photo"] = "Carica foto";
+$a->strings["upload photo"] = "carica foto";
+$a->strings["Attach file"] = "Allega file";
+$a->strings["attach file"] = "allega file";
+$a->strings["Insert web link"] = "Inserisci un indirizzo web";
+$a->strings["web link"] = "link web";
+$a->strings["Insert video link"] = "Inserisci l'indirizzo di un video";
+$a->strings["video link"] = "link video";
+$a->strings["Insert audio link"] = "Inserisci l'indirizzo di un audio";
+$a->strings["audio link"] = "link audio";
+$a->strings["Set your location"] = "La tua località";
+$a->strings["set location"] = "la tua località";
+$a->strings["Clear browser location"] = "Rimuovi la località data dal browser";
+$a->strings["clear location"] = "rimuovi la località";
+$a->strings["Set title"] = "Scegli un titolo";
+$a->strings["Categories (comma-separated list)"] = "Categorie (separate da virgola)";
+$a->strings["Permission settings"] = "Impostazioni permessi";
+$a->strings["permissions"] = "permessi";
+$a->strings["Public post"] = "Articolo pubblico";
+$a->strings["Example: bob@example.com, mary@example.com"] = "Per esempio: mario@esempio.com, simona@esempio.com";
+$a->strings["Set expiration date"] = "Data di scadenza";
+$a->strings["Encrypt text"] = "Crittografia del testo";
+$a->strings["OK"] = "OK";
+$a->strings["Cancel"] = "Annulla";
+$a->strings["Commented Order"] = "Ultimi commenti";
+$a->strings["Sort by Comment Date"] = "Per data del commento";
+$a->strings["Posted Order"] = "Ultimi articoli";
+$a->strings["Sort by Post Date"] = "Per data di creazione";
+$a->strings["Personal"] = "Personali";
+$a->strings["Posts that mention or involve you"] = "Articoli che ti riguardano o ti menzionano";
+$a->strings["New"] = "Novità";
+$a->strings["Activity Stream - by date"] = "Elenco attività - per data";
+$a->strings["Starred"] = "Preferiti";
+$a->strings["Favourite Posts"] = "Articoli preferiti";
+$a->strings["Spam"] = "Spam";
+$a->strings["Posts flagged as SPAM"] = "Articoli marcati come spam";
+$a->strings["Channel"] = "Canale";
+$a->strings["Status Messages and Posts"] = "Articoli e messaggi di stato";
+$a->strings["About"] = "Informazioni";
+$a->strings["Profile Details"] = "Dettagli del profilo";
+$a->strings["Photo Albums"] = "Album foto";
+$a->strings["Files"] = "Elenco file";
+$a->strings["Files and Storage"] = "Archivio file";
+$a->strings["Events and Calendar"] = "Calendario eventi";
+$a->strings["Webpages"] = "Pagine web";
+$a->strings["Manage Webpages"] = "Gestisci le pagine web";
+$a->strings["created a new post"] = "Ha creato un nuovo articolo";
+$a->strings["commented on %s's post"] = "ha commentato l'articolo di %s";
+$a->strings["Permission denied."] = "Permesso negato.";
+$a->strings["Image exceeds website size limit of %lu bytes"] = "L'immagine supera il limite massimo di %lu bytes";
+$a->strings["Image file is empty."] = "Il file dell'immagine è vuoto.";
+$a->strings["Unable to process image"] = "Impossibile elaborare l'immagine";
+$a->strings["Photo storage failed."] = "Impossibile caricare la foto.";
+$a->strings["Upload New Photos"] = "Carica nuove foto";
+$a->strings["Male"] = "Maschio";
+$a->strings["Female"] = "Femmina";
+$a->strings["Currently Male"] = "Al momento maschio";
+$a->strings["Currently Female"] = "Al momento femmina";
+$a->strings["Mostly Male"] = "Prevalentemente maschio";
+$a->strings["Mostly Female"] = "Prevalentemente femmina";
+$a->strings["Transgender"] = "Transgender";
+$a->strings["Intersex"] = "Intersex";
+$a->strings["Transsexual"] = "Transessuale";
+$a->strings["Hermaphrodite"] = "Ermafrodito";
+$a->strings["Neuter"] = "Neutro";
+$a->strings["Non-specific"] = "Non specificato";
+$a->strings["Other"] = "Altro";
+$a->strings["Undecided"] = "Indeciso";
+$a->strings["Males"] = "Maschi";
+$a->strings["Females"] = "Femmine";
+$a->strings["Gay"] = "Gay";
+$a->strings["Lesbian"] = "Lesbica";
+$a->strings["No Preference"] = "Senza preferenza";
+$a->strings["Bisexual"] = "Bisessuale";
+$a->strings["Autosexual"] = "Autosessuale";
+$a->strings["Abstinent"] = "Astinente";
+$a->strings["Virgin"] = "Vergine";
+$a->strings["Deviant"] = "Deviato";
+$a->strings["Fetish"] = "Feticista";
+$a->strings["Oodles"] = "Un sacco";
+$a->strings["Nonsexual"] = "Asessuato";
+$a->strings["Single"] = "Single";
+$a->strings["Lonely"] = "Da solo";
+$a->strings["Available"] = "Disponibile";
+$a->strings["Unavailable"] = "Non disponibile";
+$a->strings["Has crush"] = "Ha una cotta";
+$a->strings["Infatuated"] = "Infatuato/a";
+$a->strings["Dating"] = "Disponibile a un incontro";
+$a->strings["Unfaithful"] = "Infedele";
+$a->strings["Sex Addict"] = "Sesso-dipendente";
+$a->strings["Friends/Benefits"] = "Amici piccanti";
+$a->strings["Casual"] = "Casual";
+$a->strings["Engaged"] = "Impegnato";
+$a->strings["Married"] = "Sposato/a";
+$a->strings["Imaginarily married"] = "Sogna il matrimonio";
+$a->strings["Partners"] = "Partner";
+$a->strings["Cohabiting"] = "Convivente";
+$a->strings["Common law"] = "Matrimonio regolare";
+$a->strings["Happy"] = "Felice";
+$a->strings["Not looking"] = "Non in cerca";
+$a->strings["Swinger"] = "Scambista";
+$a->strings["Betrayed"] = "Tradito/a";
+$a->strings["Separated"] = "Separato/a";
+$a->strings["Unstable"] = "Instabile";
+$a->strings["Divorced"] = "Divorziato/a";
+$a->strings["Imaginarily divorced"] = "Sogna il divorzio";
+$a->strings["Widowed"] = "Vedovo/a";
+$a->strings["Uncertain"] = "Incerto/a";
+$a->strings["It's complicated"] = "Relazione complicata";
+$a->strings["Don't care"] = "Chi se ne frega";
+$a->strings["Ask me"] = "Chiedimelo";
+$a->strings["Item was not found."] = "Elemento non trovato.";
+$a->strings["No source file."] = "Nessun file di origine.";
+$a->strings["Cannot locate file to replace"] = "Il file da sostituire non è stato trovato";
+$a->strings["Cannot locate file to revise/update"] = "Il file da aggiornare non è stato trovato";
$a->strings["File exceeds size limit of %d"] = "Il file supera la dimensione massima di %d";
-$a->strings["File upload failed."] = "Caricamento del file non riuscito.";
-$a->strings["Friend suggestion sent."] = "Suggerimento di amicizia inviato.";
-$a->strings["Suggest Friends"] = "Suggerisci amici";
-$a->strings["Suggest a friend for %s"] = "Suggerisci un amico a %s";
-$a->strings["Event title and start time are required."] = "";
+$a->strings["You have reached your limit of %1$.0f Mbytes attachment storage."] = "Hai raggiunto il limite complessivo di %1$.0f Mbytes per gli allegati.";
+$a->strings["File upload failed. Possible system limit or action terminated."] = "Caricamento file fallito, potrebbe aver superato i limiti o l'azione potrebbe essere stata interrotta.";
+$a->strings["Stored file could not be verified. Upload failed."] = "Il file non può essere verificato. Caricamento fallito.";
+$a->strings["Path not available."] = "Percorso non disponibile.";
+$a->strings["Empty pathname"] = "Il percorso del file è vuoto";
+$a->strings["duplicate filename or path"] = "il file o percorso del file è duplicato";
+$a->strings["Path not found."] = "Percorso del file non trovato.";
+$a->strings["mkdir failed."] = "mkdir fallito.";
+$a->strings["database storage failed."] = "scrittura su database fallita.";
+$a->strings["Tags"] = "Tag";
+$a->strings["Keywords"] = "Parole chiave";
+$a->strings["have"] = "ho";
+$a->strings["has"] = "ha";
+$a->strings["want"] = "voglio";
+$a->strings["wants"] = "vuole";
+$a->strings["like"] = "mi piace";
+$a->strings["likes"] = "ama";
+$a->strings["dislike"] = "non mi piace";
+$a->strings["dislikes"] = "non ama";
+$a->strings["Not a valid email address"] = "Email non valida";
+$a->strings["Your email domain is not among those allowed on this site"] = "Il dominio della tua email attualmente non è permesso su questo sito";
+$a->strings["Your email address is already registered at this site."] = "La tua email è già registrata su questo sito.";
+$a->strings["An invitation is required."] = "È necessario un invito.";
+$a->strings["Invitation could not be verified."] = "L'invito non può essere verificato.";
+$a->strings["Please enter the required information."] = "Inserisci le informazioni richieste.";
+$a->strings["Failed to store account information."] = "Non è stato possibile salvare le informazioni del tuo account.";
+$a->strings["Registration request at %s"] = "Richiesta di registrazione su %s";
+$a->strings["Administrator"] = "Amministratore";
+$a->strings["your registration password"] = "la password di registrazione";
+$a->strings["Registration details for %s"] = "Dettagli della registrazione di %s";
+$a->strings["Account approved."] = "Account approvato.";
+$a->strings["Registration revoked for %s"] = "Registrazione revocata per %s";
+$a->strings["Sort Options"] = "Opzioni di ordinamento";
+$a->strings["Alphabetic"] = "Alfabetico";
+$a->strings["Reverse Alphabetic"] = "Alfabetico inverso";
+$a->strings["Newest to Oldest"] = "Dal più nuovo al più vecchio";
+$a->strings["Enable Safe Search"] = "Abilita SafeSearch";
+$a->strings["Disable Safe Search"] = "Disabilita SafeSearch";
+$a->strings["Safe Mode"] = "Modalità SafeSearch";
+$a->strings["Red Matrix Notification"] = "Notifica di Red Matrix";
+$a->strings["redmatrix"] = "redmatrix";
+$a->strings["Thank You,"] = "Grazie,";
+$a->strings["%s Administrator"] = "Amministratore %s";
+$a->strings["%s <!item_type!>"] = "%s <!item_type!>";
+$a->strings["[Red:Notify] New mail received at %s"] = "[Red:Notifica] Nuovo messaggio ricevuto alle %s";
+$a->strings["%1\$s, %2\$s sent you a new private message at %3\$s."] = "%1\$s, %2\$s ti ha mandato un messaggio privato alle %3\$s.";
+$a->strings["%1\$s sent you %2\$s."] = "%1\$s ti ha mandato %2\$s.";
+$a->strings["a private message"] = "un messaggio privato";
+$a->strings["Please visit %s to view and/or reply to your private messages."] = "Visita %s per leggere i tuoi messaggi privati e rispondere.";
+$a->strings["%1\$s, %2\$s commented on [zrl=%3\$s]a %4\$s[/zrl]"] = "%1\$s, %2\$s ha commentato [zrl=%3\$s]%4\$s[/zrl]";
+$a->strings["%1\$s, %2\$s commented on [zrl=%3\$s]%4\$s's %5\$s[/zrl]"] = "%1\$s, %2\$s ha commentato [zrl=%3\$s]%5\$s di %4\$s[/zrl]";
+$a->strings["%1\$s, %2\$s commented on [zrl=%3\$s]your %4\$s[/zrl]"] = "%1\$s, %2\$s ha commentato [zrl=%3\$s]%4\$s che hai creato[/zrl]";
+$a->strings["[Red:Notify] Comment to conversation #%1\$d by %2\$s"] = "[Red:Notifica] Nuovo commento di %2\$s alla conversazione #%1\$d";
+$a->strings["%1\$s, %2\$s commented on an item/conversation you have been following."] = "%1\$s, %2\$s ha commentato un elemento che stavi seguendo.";
+$a->strings["Please visit %s to view and/or reply to the conversation."] = "Visita %s per leggere o commentare la conversazione.";
+$a->strings["[Red:Notify] %s posted to your profile wall"] = "[Red:Notifica] %s ha scritto sulla tua bacheca";
+$a->strings["%1\$s, %2\$s posted to your profile wall at %3\$s"] = "%1\$s, %2\$s ha scritto sulla bacheca del tuo profilo alle %3\$s";
+$a->strings["%1\$s, %2\$s posted to [zrl=%3\$s]your wall[/zrl]"] = "%1\$s, %2\$s ha scritto sulla [zrl=%3\$s]tua bacheca[/zrl]";
+$a->strings["[Red:Notify] %s tagged you"] = "[Red:Notifica] %s ti ha taggato";
+$a->strings["%1\$s, %2\$s tagged you at %3\$s"] = "%1\$s, %2\$s ti ha taggato alle %3\$s";
+$a->strings["%1\$s, %2\$s [zrl=%3\$s]tagged you[/zrl]."] = "%1\$s, %2\$s [zrl=%3\$s]ti ha taggato[/zrl].";
+$a->strings["[Red:Notify] %1\$s poked you"] = "[Red:Notifica] %1\$s ti ha mandato un poke";
+$a->strings["%1\$s, %2\$s poked you at %3\$s"] = "%1\$s, %2\$s ti ha mandato un poke alle %3\$s";
+$a->strings["%1\$s, %2\$s [zrl=%2\$s]poked you[/zrl]."] = "%1\$s, %2\$s [zrl=%2\$s]ti ha mandato un poke[/zrl].";
+$a->strings["[Red:Notify] %s tagged your post"] = "[Red:Notifica] %s ha taggato il tuo articolo";
+$a->strings["%1\$s, %2\$s tagged your post at %3\$s"] = "%1\$s, %2\$s ha taggato il tuo articolo alle %3\$s";
+$a->strings["%1\$s, %2\$s tagged [zrl=%3\$s]your post[/zrl]"] = "%1\$s, %2\$s ha taggato [zrl=%3\$s]il tuo articolo[/zrl]";
+$a->strings["[Red:Notify] Introduction received"] = "[Red:Notifica] Hai una richiesta di amicizia";
+$a->strings["%1\$s, you've received an introduction from '%2\$s' at %3\$s"] = "%1\$s, hai ricevuto una richiesta di contatto da '%2\$s' alle %3\$s";
+$a->strings["%1\$s, you've received [zrl=%2\$s]an introduction[/zrl] from %3\$s."] = "%1\$s, hai ricevuto [zrl=%2\$s]una richiesta di amicizia[/zrl] da %3\$s.";
+$a->strings["You may visit their profile at %s"] = "Puoi visitare il suo profilo su %s";
+$a->strings["Please visit %s to approve or reject the introduction."] = "Visita %s per approvare o rifiutare la richiesta.";
+$a->strings["[Red:Notify] Friend suggestion received"] = "[Red:Notifica] Ti è stato suggerito un amico";
+$a->strings["%1\$s, you've received a friend suggestion from '%2\$s' at %3\$s"] = "%1\$s, ti è stato suggerito un amico da '%2\$s' alle %3\$s";
+$a->strings["%1\$s, you've received [zrl=%2\$s]a friend suggestion[/zrl] for %3\$s from %4\$s."] = "%1\$s, %4\$s ti [zrl=%2\$s]ha suggerito %3\$s[/zrl] come amico.";
+$a->strings["Name:"] = "Nome:";
+$a->strings["Photo:"] = "Foto:";
+$a->strings["Please visit %s to approve or reject the suggestion."] = "Visita %s per approvare o rifiutare il suggerimento.";
+$a->strings["Logged out."] = "Uscita effettuata.";
+$a->strings["Failed authentication"] = "Autenticazione fallita";
+$a->strings["Login failed."] = "Accesso fallito.";
+$a->strings["%d invitation available"] = array(
+ 0 => "%d invito disponibile",
+ 1 => "%d inviti disponibili",
+);
+$a->strings["Find Channels"] = "Ricerca canali";
+$a->strings["Enter name or interest"] = "Scrivi un nome o un interesse";
+$a->strings["Connect/Follow"] = "Entra in contatto";
+$a->strings["Examples: Robert Morgenstein, Fishing"] = "Per esempio: Mario Rossi, Pesca";
+$a->strings["Find"] = "Cerca";
+$a->strings["Channel Suggestions"] = "Canali suggeriti";
+$a->strings["Random Profile"] = "Profilo casuale";
+$a->strings["Invite Friends"] = "Invita amici";
+$a->strings["%d connection in common"] = array(
+ 0 => "%d contatto in comune",
+ 1 => "%d contatti in comune",
+);
+$a->strings["New Page"] = "Nuova pagina web";
+$a->strings["Edit"] = "Modifica";
+$a->strings["Click here to upgrade."] = "Clicca qui per aggiornare.";
+$a->strings["This action exceeds the limits set by your subscription plan."] = "Questa operazione esce dai termini del tuo abbonamento.";
+$a->strings["This action is not available under your subscription plan."] = "Questa operazione non è prevista dal tuo abbonamento.";
+$a->strings["Channel is blocked on this site."] = "Il canale è bloccato per questo sito.";
+$a->strings["Channel location missing."] = "Manca l'indirizzo del canale.";
+$a->strings["Channel discovery failed. Website may be down or misconfigured."] = "La ricerca del canale è fallita. Il sito potrebbe avere problemi o una configurazione sbagliata.";
+$a->strings["Response from remote channel was not understood."] = "La risposta dal canale non è comprensibile.";
+$a->strings["Response from remote channel was incomplete."] = "La risposta dal canale non è completa.";
+$a->strings["local account not found."] = "l'account locale non è stato trovato.";
+$a->strings["Cannot connect to yourself."] = "Non puoi connetterti a te stesso.";
+$a->strings["Can view my \"public\" stream and posts"] = "Può vedere i miei contenuti \"pubblici\"";
+$a->strings["Can view my \"public\" channel profile"] = "Può vedere il profilo del mio canale \"pubblico\"";
+$a->strings["Can view my \"public\" photo albums"] = "Può vedere il mio album fotografico \"pubblico\"";
+$a->strings["Can view my \"public\" address book"] = "Può vedere il mio elenco contatti \"pubblico\"";
+$a->strings["Can view my \"public\" file storage"] = "Può vedere il mio archivio file \"pubblico\"";
+$a->strings["Can view my \"public\" pages"] = "Può vedere le mie pagine web \"pubbliche\"";
+$a->strings["Can send me their channel stream and posts"] = "È tra i canali che seguo";
+$a->strings["Can post on my channel page (\"wall\")"] = "Può scrivere sulla bacheca del mio canale";
+$a->strings["Can comment on my posts"] = "Può commentare i miei articoli";
+$a->strings["Can send me private mail messages"] = "Può inviarmi messaggi privati";
+$a->strings["Can post photos to my photo albums"] = "Può aggiungere foto ai miei album";
+$a->strings["Can forward to all my channel contacts via post @mentions"] = "Può inoltrare articoli a tutti i contatti del canale tramite una @menzione";
+$a->strings["Advanced - useful for creating group forum channels"] = "Impostazione avanzata - utile per creare un canale-forum di discussione";
+$a->strings["Can chat with me (when available)"] = "Può aprire una chat con me (se disponibile)";
+$a->strings["Requires compatible chat plugin"] = "Necessita di un plugin di chat compatibile";
+$a->strings["Can write to my \"public\" file storage"] = "Può scrivere sul mio archivio di file \"pubblico\"";
+$a->strings["Can edit my \"public\" pages"] = "Può modificare le mie pagine web \"pubbliche\"";
+$a->strings["Can source my \"public\" posts in derived channels"] = "Può aggiungere i miei post \"pubblici\" a un suo canale derivato";
+$a->strings["Somewhat advanced - very useful in open communities"] = "Piuttosto avanzato - molto utile nelle comunità aperte";
+$a->strings["Can administer my channel resources"] = "Può amministrare i contenuti del mio canale";
+$a->strings["Extremely advanced. Leave this alone unless you know what you are doing"] = "Impostazione pericolosa - lasciare il valore predefinito se non si è assolutamente sicuri";
+$a->strings["Default"] = "Predefinito";
+$a->strings["Unable to obtain identity information from database"] = "Impossibile ottenere le informazioni di identificazione dal database";
+$a->strings["Empty name"] = "Nome vuoto";
+$a->strings["Name too long"] = "Nome troppo lungo";
+$a->strings["No account identifier"] = "Account senza identificativo";
+$a->strings["Nickname is required."] = "Il nome dell'account è obbligatorio.";
+$a->strings["Nickname has unsupported characters or is already being used on this site."] = "Il nome dell'account è già in uso oppure ha dei caratteri non supportati.";
+$a->strings["Unable to retrieve created identity"] = "Impossibile caricare l'identità creata";
+$a->strings["Default Profile"] = "Profilo predefinito";
+$a->strings["Requested channel is not available."] = "Il canale che cerchi non è disponibile.";
+$a->strings[" Sorry, you don't have the permission to view this profile. "] = "Purtroppo non hai il permesso di vedere questo profilo.";
+$a->strings["Requested profile is not available."] = "Il profilo richiesto non è disponibile.";
+$a->strings["Change profile photo"] = "Cambia la foto del profilo";
+$a->strings["Profiles"] = "Profili";
+$a->strings["Manage/edit profiles"] = "Gestisci/modifica i profili";
+$a->strings["Create New Profile"] = "Crea un nuovo profilo";
+$a->strings["Edit Profile"] = "Modifica il profilo";
+$a->strings["Profile Image"] = "Immagine del profilo";
+$a->strings["visible to everybody"] = "visibile a tutti";
+$a->strings["Edit visibility"] = "Cambia la visibilità";
+$a->strings["Gender:"] = "Sesso:";
+$a->strings["Status:"] = "Stato:";
+$a->strings["Homepage:"] = "Home page:";
+$a->strings["g A l F d"] = "g A l d F";
+$a->strings["F d"] = "d F";
+$a->strings["[today]"] = "[oggi]";
+$a->strings["Birthday Reminders"] = "Promemoria compleanni";
+$a->strings["Birthdays this week:"] = "Compleanni questa settimana:";
+$a->strings["[No description]"] = "[Nessuna descrizione]";
+$a->strings["Event Reminders"] = "Promemoria";
+$a->strings["Events this week:"] = "Eventi di questa settimana:";
+$a->strings["Profile"] = "Profilo";
+$a->strings["Full Name:"] = "Nome completo:";
+$a->strings["j F, Y"] = "j F Y";
+$a->strings["j F"] = "j F";
+$a->strings["Birthday:"] = "Compleanno:";
+$a->strings["Age:"] = "Età:";
+$a->strings["for %1\$d %2\$s"] = "per %1\$d %2\$s";
+$a->strings["Sexual Preference:"] = "Preferenze sessuali:";
+$a->strings["Hometown:"] = "Città dove vivo:";
+$a->strings["Tags:"] = "Tag:";
+$a->strings["Political Views:"] = "Orientamento politico:";
+$a->strings["Religion:"] = "Religione:";
+$a->strings["About:"] = "Informazioni:";
+$a->strings["Hobbies/Interests:"] = "Interessi e hobby:";
+$a->strings["Likes:"] = "Mi piace:";
+$a->strings["Dislikes:"] = "Non mi piace:";
+$a->strings["Contact information and Social Networks:"] = "Contatti e social network:";
+$a->strings["Musical interests:"] = "Gusti musicali:";
+$a->strings["Books, literature:"] = "Libri, letteratura:";
+$a->strings["Television:"] = "Televisione:";
+$a->strings["Film/dance/culture/entertainment:"] = "Film, danza, cultura, intrattenimento:";
+$a->strings["Love/Romance:"] = "Amore:";
+$a->strings["Work/employment:"] = "Lavoro:";
+$a->strings["School/education:"] = "Scuola:";
+$a->strings["Permission denied"] = "Permesso negato";
+$a->strings["Item not found."] = "Elemento non trovato.";
+$a->strings["Collection not found."] = "Insieme non trovato.";
+$a->strings["Collection is empty."] = "L'insieme di canali è vuoto.";
+$a->strings["Collection: %s"] = "Insieme: %s";
+$a->strings["Connection: %s"] = "Contatto: %s";
+$a->strings["Connection not found."] = "Contatto non trovato.";
+$a->strings["Private Message"] = "Messaggio privato";
+$a->strings["save to folder"] = "salva in una cartella";
+$a->strings["add star"] = "aggiungi ai preferiti";
+$a->strings["remove star"] = "rimuovi dai preferiti";
+$a->strings["toggle star status"] = "Attiva/disattiva preferito";
+$a->strings["starred"] = "preferito";
+$a->strings["add tag"] = "Aggiungi tag";
+$a->strings["I like this (toggle)"] = "Attiva/disattiva Mi piace";
+$a->strings["I don't like this (toggle)"] = "Attiva/disattiva Non mi piace";
+$a->strings["Share this"] = "Condividi";
+$a->strings["share"] = "condividi";
+$a->strings["View %s's profile - %s"] = "Guarda il profilo di %s - %s";
+$a->strings["to"] = "a";
+$a->strings["via"] = "via";
+$a->strings["Wall-to-Wall"] = "Da bacheca a bacheca";
+$a->strings["via Wall-To-Wall:"] = "da bacheca a bacheca:";
+$a->strings["Expires: %s"] = "Scadenza: %s";
+$a->strings["%d comment"] = array(
+ 0 => "%d commento",
+ 1 => "%d commenti",
+);
+$a->strings["This is you"] = "Questo sei tu";
+$a->strings["Submit"] = "Salva";
+$a->strings["Bold"] = "Grassetto";
+$a->strings["Italic"] = "Corsivo";
+$a->strings["Underline"] = "Sottolineato";
+$a->strings["Quote"] = "Citazione";
+$a->strings["Code"] = "Codice";
+$a->strings["Image"] = "Immagine";
+$a->strings["Link"] = "Link";
+$a->strings["Video"] = "Video";
+$a->strings["Welcome "] = "Ciao";
+$a->strings["Please upload a profile photo."] = "Carica una foto per il profilo!";
+$a->strings["Welcome back "] = "Ciao, è bello rivederti";
+$a->strings["The form security token was not correct. This probably happened because the form has been opened for too long (>3 hours) before submitting it."] = "L'identificativo di sicurezza del modulo che hai riempito non è corretto. Probabilmente è accaduto perché la pagina è stata tenuta aperta troppo a lungo (ore?) prima di inviare il contenuto.";
+$a->strings["Invalid data packet"] = "Dati non validi";
+$a->strings["Unable to verify channel signature"] = "Impossibile verificare la firma elettronica del canale";
+$a->strings["Unable to verify site signature for %s"] = "Impossibile verificare la firma elettronica del sito %s";
+$a->strings["No channel."] = "Nessun canale.";
+$a->strings["Common connections"] = "Contatti in comune";
+$a->strings["No connections in common."] = "Nessun contatto in comune.";
+$a->strings["Event title and start time are required."] = "Sono necessari il titolo e l'ora d'inizio dell'evento.";
$a->strings["l, F j"] = "l j F";
-$a->strings["Edit event"] = "Modifca l'evento";
-$a->strings["link to source"] = "Collegamento all'originale";
-$a->strings["Events"] = "Eventi";
+$a->strings["Edit event"] = "Modifica l'evento";
$a->strings["Create New Event"] = "Crea un nuovo evento";
$a->strings["Previous"] = "Precendente";
$a->strings["Next"] = "Successivo";
$a->strings["hour:minute"] = "ora:minuti";
-$a->strings["Event details"] = "Dettagli dell'evento";
-$a->strings["Format is %s %s. Starting date and Title are required."] = "";
-$a->strings["Event Starts:"] = "L'evento inizia:";
-$a->strings["Required"] = "";
-$a->strings["Finish date/time is not known or not relevant"] = "La data/ora di fine non è definita";
-$a->strings["Event Finishes:"] = "L'evento finisce:";
-$a->strings["Adjust for viewer timezone"] = "Visualizza con il fuso orario di chi legge";
+$a->strings["Event details"] = "Dettagli evento";
+$a->strings["Format is %s %s. Starting date and Title are required."] = "Il formato è %s %s. L'inizio e il titolo sono obbligatori.";
+$a->strings["Event Starts:"] = "Inizio:";
+$a->strings["Required"] = "Obbligatorio";
+$a->strings["Finish date/time is not known or not relevant"] = "La data/ora di fine non è rilevante";
+$a->strings["Event Finishes:"] = "Fine:";
+$a->strings["Adjust for viewer timezone"] = "Adatta al fuso orario di chi legge";
$a->strings["Description:"] = "Descrizione:";
-$a->strings["Location:"] = "Posizione:";
-$a->strings["Title:"] = "";
+$a->strings["Title:"] = "Titolo:";
$a->strings["Share this event"] = "Condividi questo evento";
-$a->strings["Cancel"] = "Annulla";
-$a->strings["Tag removed"] = "Tag rimosso";
-$a->strings["Remove Item Tag"] = "Rimuovi il tag";
-$a->strings["Select a tag to remove: "] = "Seleziona un tag da rimuovere: ";
-$a->strings["Remove"] = "Rimuovi";
-$a->strings["%s welcomes %s"] = "%s dà il benvenuto a %s";
-$a->strings["Authorize application connection"] = "Autorizza la connessione dell'applicazione";
-$a->strings["Return to your app and insert this Securty Code:"] = "Torna alla tua applicazione e inserisci questo codice di sicurezza:";
-$a->strings["Please login to continue."] = "Effettua il login per continuare.";
-$a->strings["Do you want to authorize this application to access your posts and contacts, and/or create new posts for you?"] = "Vuoi autorizzare questa applicazione per accedere ai messaggi e ai contatti, e / o creare nuovi messaggi per te?";
+$a->strings["Thing updated"] = "L'oggetto è stato aggiornato";
+$a->strings["Object store: failed"] = "Impossibile memorizzare l'oggetto.";
+$a->strings["Thing added"] = "L'oggetto è stato aggiunto";
+$a->strings["OBJ: %1\$s %2\$s %3\$s"] = "OBJ: %1\$s %2\$s %3\$s";
+$a->strings["Show Thing"] = "Mostra l'oggetto";
+$a->strings["item not found."] = "non trovato.";
+$a->strings["Edit Thing"] = "Modifica l'oggetto";
+$a->strings["Select a profile"] = "Scegli un profilo";
+$a->strings["Select a category of stuff. e.g. I ______ something"] = "Scegli come riferirsi all'oggetto. Esempio: Io _____ l'oggetto";
+$a->strings["Name of thing e.g. something"] = "Nome dell'oggetto";
+$a->strings["URL of thing (optional)"] = "Indirizzo web dell'oggetto";
+$a->strings["URL for photo of thing (optional)"] = "Indirizzo di un'immagine dell'oggetto (facoltativo)";
+$a->strings["Add Thing to your Profile"] = "Aggiungi l'oggetto al tuo profilo";
+$a->strings["Total invitation limit exceeded."] = "Hai superato il numero massimo di inviti.";
+$a->strings["%s : Not a valid email address."] = "%s: non è un indirizzo email valido.";
+$a->strings["Please join us on Red"] = "Vieni con noi su Red";
+$a->strings["Invitation limit exceeded. Please contact your site administrator."] = "Hai superato il numero massimo di inviti. Contatta l'amministratore se necessario.";
+$a->strings["%s : Message delivery failed."] = "%s: la consegna del messaggio è fallita.";
+$a->strings["%d message sent."] = array(
+ 0 => "%d messaggio inviato.",
+ 1 => "%d messaggi inviati.",
+);
+$a->strings["You have no more invitations available"] = "Non hai altri inviti disponibili";
+$a->strings["Send invitations"] = "Spedisci inviti";
+$a->strings["Enter email addresses, one per line:"] = "Inserisci gli indirizzi email, uno per riga:";
+$a->strings["Your message:"] = "Il tuo messaggio:";
+$a->strings["You are cordially invited to join me and some other close friends on the Red Matrix - a revolutionary new decentralised communication and information tool."] = "Questo è un invito cordiale ad unirti a me e ad altri miei amici stretti su Red Matrix - uno nuovo strumento di comunicazione decentralizzato e rivoluzionario.";
+$a->strings["You will need to supply this invitation code: \$invite_code"] = "Sarà necessario fornire questo codice invito: \$invite_code";
+$a->strings["Please visit my channel at"] = "Puoi visitare il mio canale su";
+$a->strings["Once you have registered (on ANY Red Matrix site - they are all inter-connected), please connect with my Red Matrix channel address:"] = "Una volta che avrai completato la registrazione (su QUALSIASI sito Red Matrix - sono tutti interconnessi), potrai connetterti al mio canale:";
+$a->strings["Click the [Register] link on the following page to join."] = "Fai clic su [Registrati] nella pagina seguente per iscriverti.";
+$a->strings["For more information about the Red Matrix Project and why it has the potential to change the internet as we know it, please visit http://getzot.com"] = "Per saperne di più sul progetto Red Matrix e sul perché potrebbe cambiare internet per come la conosciamo, visita http://getzot.com";
+$a->strings["Could not access contact record."] = "Non è possibile accedere alle informazioni sul contatto.";
+$a->strings["Could not locate selected profile."] = "Non riesco a trovare il profilo selezionato.";
+$a->strings["Connection updated."] = "Contatto aggiornato.";
+$a->strings["Failed to update connection record."] = "Impossibile aggiornare le informazioni del contatto.";
+$a->strings["Could not access address book record."] = "Impossibile accedere alle informazioni della rubrica.";
+$a->strings["Refresh failed - channel is currently unavailable."] = "Il canale non è disponibile - impossibile aggiornare.";
+$a->strings["Channel has been unblocked"] = "Il canale è stato sbloccato";
+$a->strings["Channel has been blocked"] = "Il canale è stato bloccato";
+$a->strings["Unable to set address book parameters."] = "Impossibile impostare i parametri della rubrica.";
+$a->strings["Channel has been unignored"] = "Il canale non sarà più ignorato";
+$a->strings["Channel has been ignored"] = "Il canale sarà ignorato";
+$a->strings["Channel has been unarchived"] = "Il canale non è più archiviato";
+$a->strings["Channel has been archived"] = "Il canale è stato archiviato";
+$a->strings["Channel has been unhidden"] = "Il canale non è più nascosto";
+$a->strings["Channel has been hidden"] = "Il canale è stato nascosto";
+$a->strings["Channel has been approved"] = "Il canale è stato approvato";
+$a->strings["Channel has been unapproved"] = "Il canale non è più approvato";
+$a->strings["Contact has been removed."] = "Il contatto è stato rimosso.";
+$a->strings["View %s's profile"] = "Guarda il profilo di %s";
+$a->strings["Refresh Permissions"] = "Aggiorna i permessi";
+$a->strings["Fetch updated permissions"] = "Scarica i permessi aggiornati";
+$a->strings["Recent Activity"] = "Attività recenti";
+$a->strings["View recent posts and comments"] = "Leggi i post recenti e i commenti";
+$a->strings["Unblock"] = "Sblocca";
+$a->strings["Block"] = "Blocca";
+$a->strings["Block or Unblock this connection"] = "Per bloccare o meno questo contatto";
+$a->strings["Unignore"] = "Non ignorare";
+$a->strings["Ignore"] = "Ignora";
+$a->strings["Ignore or Unignore this connection"] = "Per ignorare o meno questo contatto";
+$a->strings["Unarchive"] = "Non archiviare";
+$a->strings["Archive"] = "Archivia";
+$a->strings["Archive or Unarchive this connection"] = "Per archiviare o meno questo contatto";
+$a->strings["Unhide"] = "Non nascondere";
+$a->strings["Hide"] = "Nascondi";
+$a->strings["Hide or Unhide this connection"] = "Per nascondere o meno questo contatto";
+$a->strings["Delete this connection"] = "Elimina questo contatto";
+$a->strings["Unknown"] = "Sconosciuto";
+$a->strings["Approve this connection"] = "Approva questo contatto";
+$a->strings["Accept connection to allow communication"] = "Entra in contatto per poter comunicare";
+$a->strings["Automatic Permissions Settings"] = "Permessi predefiniti";
+$a->strings["Connections: settings for %s"] = "Contatti: impostazioni per %s";
+$a->strings["When receiving a channel introduction, any permissions provided here will be applied to the new connection automatically and the introduction approved. Leave this page if you do not wish to use this feature."] = "Hai ricevuto da un canale una richiesta di entrare in contatto, se prosegui la richiesta sarà approvata e saranno applicati i permessi mostrati. Lascia questa pagina se non vuoi proseguire.";
+$a->strings["Slide to adjust your degree of friendship"] = "Trascina per restringere il grado di amicizia da mostrare";
+$a->strings["inherited"] = "derivato";
+$a->strings["Connection has no individual permissions!"] = "Non hai assegnato permessi individuali a questo contatto!";
+$a->strings["This may be appropriate based on your <a href=\"settings\">privacy settings</a>, though you may wish to review the \"Advanced Permissions\"."] = "Questo corrisponde alle tue <a href='settings'>impostazioni di privacy</a>, ma puoi anche dare un'occhiata ai 'Permessi avanzati' per opzioni più dettagliate.";
+$a->strings["Profile Visibility"] = "Visibilità del profilo";
+$a->strings["Please choose the profile you would like to display to %s when viewing your profile securely."] = "Seleziona il profilo che vuoi mostrare a %s quando visita il tuo profilo in modo sicuro.";
+$a->strings["Contact Information / Notes"] = "Informazioni e annotazioni sul contatto";
+$a->strings["Edit contact notes"] = "Modifica le informazioni sul contatto";
+$a->strings["Their Settings"] = "Permessi concessi a te";
+$a->strings["My Settings"] = "I permessi che concedo";
+$a->strings["Forum Members"] = "Membro di un forum";
+$a->strings["Soapbox"] = "Comunicati e annunci";
+$a->strings["Full Sharing"] = "Condivisione totale";
+$a->strings["Cautious Sharing"] = "Condivisione prudente";
+$a->strings["Follow Only"] = "Follower";
+$a->strings["Individual Permissions"] = "Permessi individuali";
+$a->strings["Some permissions may be inherited from your channel <a href=\"settings\">privacy settings</a>, which have higher priority. Changing those inherited settings on this page will have no effect."] = "Alcuni permessi derivano dalle <a href=\"settings\">impostazioni di privacy</a>, che hanno una priorità maggiore. Cambiarli in questa pagina non avrà alcun effetto.";
+$a->strings["Advanced Permissions"] = "Permessi avanzati";
+$a->strings["Quick Links"] = "Impostazioni veloci";
+$a->strings["Visit %s's profile - %s"] = "Guarda il profilo di %s - %s";
+$a->strings["Block/Unblock contact"] = "Blocca/sblocca contatto";
+$a->strings["Ignore contact"] = "Ignora il contatto";
+$a->strings["Repair URL settings"] = "Ripara le impostazioni URL";
+$a->strings["View conversations"] = "Leggi le conversazioni";
+$a->strings["Delete contact"] = "Elimina contatto";
+$a->strings["Last update:"] = "Ultimo aggiornamento:";
+$a->strings["Update public posts"] = "Aggiorna gli articoli pubblici";
+$a->strings["Update now"] = "Aggiorna adesso";
+$a->strings["Currently blocked"] = "Attualmente bloccato";
+$a->strings["Currently ignored"] = "Attualmente ignorato";
+$a->strings["Currently archived"] = "Attualmente archiviato";
+$a->strings["Currently pending"] = "Attualmente da approvare";
+$a->strings["Hide this contact from others"] = "Nascondi questo contatto agli altri";
+$a->strings["Replies/likes to your public posts <strong>may</strong> still be visible"] = "Le risposte ai tuoi articoli pubblici <strong>potrebbero</strong> restare comunque visibili";
+$a->strings["View"] = "Guarda";
+$a->strings["Authorize application connection"] = "Autorizza la app";
+$a->strings["Return to your app and insert this Securty Code:"] = "Torna alla app e inserisci questo codice di sicurezza:";
+$a->strings["Please login to continue."] = "Accedi al sito per continuare.";
+$a->strings["Do you want to authorize this application to access your posts and contacts, and/or create new posts for you?"] = "Vuoi autorizzare questa app ad accedere ai messaggi e ai contatti o creare nuovi messaggi per te?";
$a->strings["Yes"] = "Si";
$a->strings["No"] = "No";
-$a->strings["Photo Albums"] = "Album foto";
-$a->strings["Contact Photos"] = "Foto dei contatti";
-$a->strings["Upload New Photos"] = "Carica nuove foto";
-$a->strings["everybody"] = "tutti";
-$a->strings["Contact information unavailable"] = "I dati di questo contatto non sono disponibili";
-$a->strings["Profile Photos"] = "Foto del profilo";
-$a->strings["Album not found."] = "Album non trovato.";
-$a->strings["Delete Album"] = "Rimuovi album";
-$a->strings["Delete Photo"] = "Rimuovi foto";
-$a->strings["was tagged in a"] = "è stato taggato in una";
-$a->strings["photo"] = "foto";
-$a->strings["by"] = "da";
-$a->strings["Image exceeds size limit of "] = "L'immagine supera il limite di";
-$a->strings["Image file is empty."] = "Il file dell'immagine è vuoto.";
-$a->strings["Unable to process image."] = "Impossibile caricare l'immagine.";
-$a->strings["Image upload failed."] = "Caricamento immagine fallito.";
-$a->strings["Public access denied."] = "Accesso negato.";
-$a->strings["No photos selected"] = "Nessuna foto selezionata";
-$a->strings["Access to this item is restricted."] = "Questo oggetto non è visibile a tutti.";
-$a->strings["You have used %1$.2f Mbytes of %2$.2f Mbytes photo storage."] = "";
-$a->strings["You have used %1$.2f Mbytes of photo storage."] = "";
-$a->strings["Upload Photos"] = "Carica foto";
-$a->strings["New album name: "] = "Nome nuovo album: ";
-$a->strings["or existing album name: "] = "o nome di un album esistente: ";
-$a->strings["Do not show a status post for this upload"] = "Non creare un post per questo upload";
-$a->strings["Permissions"] = "Permessi";
-$a->strings["Edit Album"] = "Modifica album";
-$a->strings["Show Newest First"] = "";
-$a->strings["Show Oldest First"] = "";
-$a->strings["View Photo"] = "Vedi foto";
-$a->strings["Permission denied. Access to this item may be restricted."] = "Permesso negato. L'accesso a questo elemento può essere limitato.";
-$a->strings["Photo not available"] = "Foto non disponibile";
-$a->strings["View photo"] = "Vedi foto";
-$a->strings["Edit photo"] = "Modifica foto";
-$a->strings["Use as profile photo"] = "Usa come foto del profilo";
-$a->strings["Private Message"] = "Messaggio privato";
-$a->strings["View Full Size"] = "Vedi dimensione intera";
-$a->strings["Tags: "] = "Tag: ";
-$a->strings["[Remove any tag]"] = "[Rimuovi tutti i tag]";
-$a->strings["Rotate CW (right)"] = "";
-$a->strings["Rotate CCW (left)"] = "";
-$a->strings["New album name"] = "Nuovo nome dell'album";
-$a->strings["Caption"] = "Titolo";
-$a->strings["Add a Tag"] = "Aggiungi tag";
-$a->strings["Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"] = "Esempio: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping";
-$a->strings["I like this (toggle)"] = "Mi piace (clic per cambiare)";
-$a->strings["I don't like this (toggle)"] = "Non mi piace (clic per cambiare)";
-$a->strings["Share"] = "Condividi";
-$a->strings["Please wait"] = "Attendi";
-$a->strings["This is you"] = "Questo sei tu";
-$a->strings["Comment"] = "Commento";
-$a->strings["Preview"] = "Anteprima";
-$a->strings["Delete"] = "Rimuovi";
-$a->strings["View Album"] = "Sfoglia l'album";
-$a->strings["Recent Photos"] = "Foto recenti";
-$a->strings["Not available."] = "Non disponibile.";
-$a->strings["Community"] = "Comunità";
-$a->strings["No results."] = "Nessun risultato.";
-$a->strings["This is Friendica, version"] = "Questo è Friendica, versione";
-$a->strings["running at web location"] = "in esecuzione sull'indirizzo web";
-$a->strings["Please visit <a href=\"http://friendica.com\">Friendica.com</a> to learn more about the Friendica project."] = "Visita <a href=\"http://friendica.com\">Friendica.com</a> per saperne di più sul progetto Friendica.";
-$a->strings["Bug reports and issues: please visit"] = "Segnalazioni di bug e problemi: visita";
-$a->strings["Suggestions, praise, donations, etc. - please email \"Info\" at Friendica - dot com"] = "Suggerimenti, lodi, donazioni, ecc - e-mail a \"Info\" at Friendica punto com";
-$a->strings["Installed plugins/addons/apps:"] = "Plugin/addon/applicazioni instalate";
-$a->strings["No installed plugins/addons/apps"] = "Nessun plugin/addons/applicazione installata";
-$a->strings["Item not found"] = "Oggetto non trovato";
-$a->strings["Edit post"] = "Modifica messaggio";
-$a->strings["Post to Email"] = "Invia a email";
-$a->strings["Edit"] = "Modifica";
-$a->strings["Upload photo"] = "Carica foto";
-$a->strings["Attach file"] = "Allega file";
-$a->strings["Insert web link"] = "Inserisci link";
-$a->strings["Insert YouTube video"] = "Inserisci video da YouTube";
-$a->strings["Insert Vorbis [.ogg] video"] = "Inserisci video Vorbis [.ogg]";
-$a->strings["Insert Vorbis [.ogg] audio"] = "Inserisci audio Vorbis [.ogg]";
-$a->strings["Set your location"] = "La tua posizione";
-$a->strings["Clear browser location"] = "Rimuovi la localizzazione data dal browser";
-$a->strings["Permission settings"] = "Impostazioni permessi";
-$a->strings["CC: email addresses"] = "CC: indirizzi email";
-$a->strings["Public post"] = "Messaggio pubblico";
-$a->strings["Set title"] = "Scegli un titolo";
-$a->strings["Categories (comma-separated list)"] = "Categorie (lista separata da virgola)";
-$a->strings["Example: bob@example.com, mary@example.com"] = "Esempio: bob@example.com, mary@example.com";
-$a->strings["This introduction has already been accepted."] = "Questa presentazione è già stata accettata.";
-$a->strings["Profile location is not valid or does not contain profile information."] = "L'indirizzo del profilo non è valido o non contiene un profilo.";
-$a->strings["Warning: profile location has no identifiable owner name."] = "Attenzione: l'indirizzo del profilo non riporta il nome del proprietario.";
-$a->strings["Warning: profile location has no profile photo."] = "Attenzione: l'indirizzo del profilo non ha una foto.";
-$a->strings["%d required parameter was not found at the given location"] = array(
- 0 => "%d parametro richiesto non è stato trovato all'indirizzo dato",
- 1 => "%d parametri richiesti non sono stati trovati all'indirizzo dato",
-);
-$a->strings["Introduction complete."] = "Presentazione completa.";
-$a->strings["Unrecoverable protocol error."] = "Errore di comunicazione.";
-$a->strings["Profile unavailable."] = "Profilo non disponibile.";
-$a->strings["%s has received too many connection requests today."] = "%s ha ricevuto troppe richieste di connessione per oggi.";
-$a->strings["Spam protection measures have been invoked."] = "Sono state attivate le misure di protezione contro lo spam.";
-$a->strings["Friends are advised to please try again in 24 hours."] = "Gli amici sono pregati di riprovare tra 24 ore.";
-$a->strings["Invalid locator"] = "Invalid locator";
-$a->strings["Invalid email address."] = "Indirizzo email non valido.";
-$a->strings["This account has not been configured for email. Request failed."] = "";
-$a->strings["Unable to resolve your name at the provided location."] = "Impossibile risolvere il tuo nome nella posizione indicata.";
-$a->strings["You have already introduced yourself here."] = "Ti sei già presentato qui.";
-$a->strings["Apparently you are already friends with %s."] = "Pare che tu e %s siate già amici.";
-$a->strings["Invalid profile URL."] = "Indirizzo profilo non valido.";
-$a->strings["Disallowed profile URL."] = "Indirizzo profilo non permesso.";
-$a->strings["Failed to update contact record."] = "Errore nell'aggiornamento del contatto.";
-$a->strings["Your introduction has been sent."] = "La tua presentazione è stata inviata.";
-$a->strings["Please login to confirm introduction."] = "Accedi per confermare la presentazione.";
-$a->strings["Incorrect identity currently logged in. Please login to <strong>this</strong> profile."] = "Non hai fatto accesso con l'identità corretta. Accedi a <strong>questo</strong> profilo.";
-$a->strings["Hide this contact"] = "";
-$a->strings["Welcome home %s."] = "Bentornato a casa %s.";
-$a->strings["Please confirm your introduction/connection request to %s."] = "Conferma la tua richiesta di connessione con %s.";
-$a->strings["Confirm"] = "Conferma";
-$a->strings["[Name Withheld]"] = "[Nome Nascosto]";
-$a->strings["Please enter your 'Identity Address' from one of the following supported communications networks:"] = "Inserisci il tuo 'Indirizzo Identità' da uno dei seguenti network supportati:";
-$a->strings["<strike>Connect as an email follower</strike> (Coming soon)"] = "<strike>Connetti un email come follower</strike> (in arrivo)";
-$a->strings["If you are not yet a member of the free social web, <a href=\"http://dir.friendica.com/siteinfo\">follow this link to find a public Friendica site and join us today</a>."] = "Se non sei un membro del web sociale libero, <a href=\"http://dir.friendica.com/siteinfo\">segui questo link per trovare un sito Friendica pubblico e unisciti a noi oggi</a>";
-$a->strings["Friend/Connection Request"] = "Richieste di amicizia/connessione";
-$a->strings["Examples: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, testuser@identi.ca"] = "Esempi: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, testuser@identi.ca";
-$a->strings["Please answer the following:"] = "Rispondi:";
-$a->strings["Does %s know you?"] = "%s ti conosce?";
-$a->strings["Add a personal note:"] = "Aggiungi una nota personale:";
-$a->strings["Friendica"] = "Friendica";
-$a->strings["StatusNet/Federated Social Web"] = "StatusNet/Federated Social Web";
-$a->strings["Diaspora"] = "Diaspora";
-$a->strings[" - please do not use this form. Instead, enter %s into your Diaspora search bar."] = " - per favore non usare questa form. Invece, inserisci %s nella tua barra di ricerca su Diaspora.";
-$a->strings["Your Identity Address:"] = "L'indirizzo della tua identità:";
-$a->strings["Submit Request"] = "Invia richiesta";
-$a->strings["Friendica Social Communications Server - Setup"] = "Friendica Social Communications Server - Setup";
-$a->strings["Could not connect to database."] = " Impossibile collegarsi con il database.";
+$a->strings["No installed applications."] = "Nessuna app installata.";
+$a->strings["Applications"] = "Applicazioni";
+$a->strings["Invalid item."] = "Elemento non valido.";
+$a->strings["Channel not found."] = "Canale non trovato.";
+$a->strings["Page not found."] = "Pagina non trovata.";
+$a->strings["Item not available."] = "Elemento non disponibile.";
+$a->strings["Red Matrix Server - Setup"] = "Red Matrix Server - Installazione";
+$a->strings["Could not connect to database."] = " Impossibile connettersi al database.";
+$a->strings["Could not connect to specified site URL. Possible SSL certificate or DNS issue."] = "Non è possibile raggiungere l'indirizzo del sito specificato. Potrebbe essere un problema di SSL o DNS.";
$a->strings["Could not create table."] = "Impossibile creare le tabelle.";
-$a->strings["Your Friendica site database has been installed."] = "Il tuo Friendica è stato installato.";
-$a->strings["You may need to import the file \"database.sql\" manually using phpmyadmin or mysql."] = "Potresti dover importare il file \"database.sql\" manualmente con phpmyadmin o mysql";
-$a->strings["Please see the file \"INSTALL.txt\"."] = "Leggi il file \"INSTALL.txt\".";
-$a->strings["System check"] = "Controllo sistema";
-$a->strings["Check again"] = "Controlla ancora";
+$a->strings["Your site database has been installed."] = "Il database del sito è stato installato.";
+$a->strings["You may need to import the file \"install/database.sql\" manually using phpmyadmin or mysql."] = "Potresti dover importare il file 'install/database.sql' manualmente usando phpmyadmin o mysql.";
+$a->strings["Please see the file \"install/INSTALL.txt\"."] = "Leggi il file 'install/INSTALL.txt'.";
+$a->strings["System check"] = "Verifica del sistema";
+$a->strings["Check again"] = "Verifica di nuovo";
$a->strings["Database connection"] = "Connessione al database";
-$a->strings["In order to install Friendica we need to know how to connect to your database."] = "Per installare Friendica dobbiamo sapere come collegarci al tuo database.";
+$a->strings["In order to install Red Matrix we need to know how to connect to your database."] = "Per installare Red Matrix è necessario conoscere i parametri di connessione al database.";
$a->strings["Please contact your hosting provider or site administrator if you have questions about these settings."] = "Contatta il tuo fornitore di hosting o l'amministratore del sito se hai domande su queste impostazioni.";
-$a->strings["The database you specify below should already exist. If it does not, please create it before continuing."] = "Il database dovrà già esistere. Se non esiste, crealo prima di continuare.";
-$a->strings["Database Server Name"] = "Nome del database server";
-$a->strings["Database Login Name"] = "Nome utente database";
+$a->strings["The database you specify below should already exist. If it does not, please create it before continuing."] = "Il database deve già esistere. Se non esiste, crealo prima di continuare.";
+$a->strings["Database Server Name"] = "Server del database";
+$a->strings["Default is localhost"] = "'localhost' è il predefinito";
+$a->strings["Database Port"] = "Port del database";
+$a->strings["Communication port number - use 0 for default"] = "Scrivi 0 per usare il valore standard";
+$a->strings["Database Login Name"] = "Utente database";
$a->strings["Database Login Password"] = "Password utente database";
$a->strings["Database Name"] = "Nome database";
$a->strings["Site administrator email address"] = "Indirizzo email dell'amministratore del sito";
$a->strings["Your account email address must match this in order to use the web admin panel."] = "Il tuo indirizzo email deve corrispondere a questo per poter usare il pannello di amministrazione web.";
+$a->strings["Website URL"] = "URL completo del sito";
+$a->strings["Please use SSL (https) URL if available."] = "Se disponibile, usa l'indirizzo SSL (https).";
$a->strings["Please select a default timezone for your website"] = "Seleziona il fuso orario predefinito per il tuo sito web";
-$a->strings["Site settings"] = "Impostazioni sito";
-$a->strings["Could not find a command line version of PHP in the web server PATH."] = "Non riesco a trovare la versione di PHP da riga di comando nel PATH del server web";
-$a->strings["If you don't have a command line version of PHP installed on server, you will not be able to run background polling via cron. See <a href='http://friendica.com/node/27'>'Activating scheduled tasks'</a>"] = "";
-$a->strings["PHP executable path"] = "Percorso eseguibile PHP";
-$a->strings["Enter full path to php executable. You can leave this blank to continue the installation."] = "";
+$a->strings["Site settings"] = "Impostazioni del sito";
+$a->strings["Could not find a command line version of PHP in the web server PATH."] = "Non è possibile trovare la versione di PHP da riga di comando nel PATH del server web";
+$a->strings["If you don't have a command line version of PHP installed on server, you will not be able to run background polling via cron."] = "Se non hai installata la versione di PHP da riga di comando non potrai attivare il polling in background tramite cron.";
+$a->strings["PHP executable path"] = "Path del comando PHP";
+$a->strings["Enter full path to php executable. You can leave this blank to continue the installation."] = "Inserisci il percorso dell'eseguibile PHP. Puoi lasciarlo vuoto per continuare l'installazione.";
$a->strings["Command line PHP"] = "PHP da riga di comando";
$a->strings["The command line version of PHP on your system does not have \"register_argc_argv\" enabled."] = "La versione da riga di comando di PHP nel sistema non ha abilitato \"register_argc_argv\".";
-$a->strings["This is required for message delivery to work."] = "E' obbligatorio per far funzionare la consegna dei messaggi.";
+$a->strings["This is required for message delivery to work."] = "E' necessario perché funzioni la consegna dei messaggi.";
$a->strings["PHP register_argc_argv"] = "PHP register_argc_argv";
-$a->strings["Error: the \"openssl_pkey_new\" function on this system is not able to generate encryption keys"] = "Errore: la funzione \"openssl_pkey_new\" in questo sistema non è in grado di generare le chiavi di criptazione";
-$a->strings["If running under Windows, please see \"http://www.php.net/manual/en/openssl.installation.php\"."] = "Se stai eseguendo friendika su windows, guarda \"http://www.php.net/manual/en/openssl.installation.php\".";
+$a->strings["Error: the \"openssl_pkey_new\" function on this system is not able to generate encryption keys"] = "Errore: la funzione \"openssl_pkey_new\" su questo sistema non è in grado di generare le chiavi di criptazione";
+$a->strings["If running under Windows, please see \"http://www.php.net/manual/en/openssl.installation.php\"."] = "Se stai usando un server windows, guarda \"http://www.php.net/manual/en/openssl.installation.php\".";
$a->strings["Generate encryption keys"] = "Genera chiavi di criptazione";
$a->strings["libCurl PHP module"] = "modulo PHP libCurl";
$a->strings["GD graphics PHP module"] = "modulo PHP GD graphics";
$a->strings["OpenSSL PHP module"] = "modulo PHP OpenSSL";
$a->strings["mysqli PHP module"] = "modulo PHP mysqli";
$a->strings["mb_string PHP module"] = "modulo PHP mb_string";
-$a->strings["Apache mod_rewrite module"] = "";
+$a->strings["mcrypt PHP module"] = "modulo PHP mcrypt";
+$a->strings["Apache mod_rewrite module"] = "modulo Apache mod_rewrite";
$a->strings["Error: Apache webserver mod-rewrite module is required but not installed."] = "Errore: il modulo mod-rewrite di Apache è richiesto ma non installato";
+$a->strings["proc_open"] = "proc_open";
+$a->strings["Error: proc_open is required but is either not installed or has been disabled in php.ini"] = "Errore: proc_open è richiesto ma non è installato o è disabilitato in php.ini";
$a->strings["Error: libCURL PHP module required but not installed."] = "Errore: il modulo libCURL di PHP è richiesto ma non installato.";
$a->strings["Error: GD graphics PHP module with JPEG support required but not installed."] = "Errore: Il modulo GD graphics di PHP con supporto a JPEG è richiesto ma non installato.";
$a->strings["Error: openssl PHP module required but not installed."] = "Errore: il modulo openssl di PHP è richiesto ma non installato.";
-$a->strings["Error: mysqli PHP module required but not installed."] = "Errore: il modulo mysqli di PHP è richiesto ma non installato";
+$a->strings["Error: mysqli PHP module required but not installed."] = "Errore: il modulo mysqli di PHP è richiesto ma non installato.";
$a->strings["Error: mb_string PHP module required but not installed."] = "Errore: il modulo PHP mb_string è richiesto ma non installato.";
+$a->strings["Error: mcrypt PHP module required but not installed."] = "Errore: il modulo PHP mcrypt è richiesto ma non installato.";
$a->strings["The web installer needs to be able to create a file called \".htconfig.php\ in the top folder of your web server and it is unable to do so."] = "L'installazione web deve poter creare un file chiamato \".htconfig.php\" nella cartella principale del tuo web server ma non è in grado di farlo.";
-$a->strings["This is most often a permission setting, as the web server may not be able to write files in your folder - even if you can."] = "Ciò è dovuto spesso a impostazioni di permessi, dato che il web server puo' scrivere il file nella tua cartella, anche se tu puoi.";
-$a->strings["At the end of this procedure, we will give you a text to save in a file named .htconfig.php in your Friendica top folder."] = "";
-$a->strings["You can alternatively skip this procedure and perform a manual installation. Please see the file \"INSTALL.txt\" for instructions."] = "";
+$a->strings["This is most often a permission setting, as the web server may not be able to write files in your folder - even if you can."] = "Spesso ciò è dovuto ai permessi di accesso al disco: il web server potrebbe non aver diritto di scrivere il file nella cartella, anche se tu puoi.";
+$a->strings["At the end of this procedure, we will give you a text to save in a file named .htconfig.php in your Red top folder."] = "Alla fine di questa procedura ti sarà dato il testo da salvare in un file di nome .htconfig.php dentro la cartella principale di Red.";
+$a->strings["You can alternatively skip this procedure and perform a manual installation. Please see the file \"install/INSTALL.txt\" for instructions."] = "Puoi anche saltare questa procedura ed effettuare un'installazione manuale. Guarda il file 'install/INSTALL.txt' per le istruzioni.";
$a->strings[".htconfig.php is writable"] = ".htconfig.php è scrivibile";
-$a->strings["Url rewrite in .htaccess is not working. Check your server configuration."] = "";
-$a->strings["Url rewrite is working"] = "";
-$a->strings["The database configuration file \".htconfig.php\" could not be written. Please use the enclosed text to create a configuration file in your web server root."] = "Il file di configurazione del database \".htconfig.php\" non puo' essere scritto. Usa il testo qui di seguito per creare un file di configurazione nella cartella principale del tuo sito.";
+$a->strings["Red uses the Smarty3 template engine to render its web views. Smarty3 compiles templates to PHP to speed up rendering."] = "Red usa il sistema Smarty3 per costruire i suoi template grafici. Smarty3 è molto veloce perché compila i template delle pagine direttamente in PHP.";
+$a->strings["In order to store these compiled templates, the web server needs to have write access to the directory view/tpl/smarty3/ under the Red top level folder."] = "Per poter memorizzare i template compilati, il web server deve avere accesso in scrittura alla cartella view/tpl/smarty3/ sotto la cartella di installazione di Red.";
+$a->strings["Please ensure that the user that your web server runs as (e.g. www-data) has write access to this folder."] = "Assicurati che il tuo web server sia in esecuzione come un utente che ha diritto di scrittura su quella cartella (ad esempio www-data).";
+$a->strings["Note: as a security measure, you should give the web server write access to view/tpl/smarty3/ only--not the template files (.tpl) that it contains."] = "Nota bene: come precauzione, dovresti dare i diritti di scrittura solamente per view/tpl/smarty3/ non per tutti i file di template (.tpl) che contiene.";
+$a->strings["view/tpl/smarty3 is writable"] = "view/tpl/smarty3 è scrivibile";
+$a->strings["Red uses the store directory to save uploaded files. The web server needs to have write access to the store directory under the Red top level folder"] = "Red usa un archivio per salvare i file caricati. Il server deve avere i diritti di scrittura sulla cartella dell'archivio che si trova dentro la cartella principale di Red";
+$a->strings["store is writable"] = "l'archivio è scrivibile";
+$a->strings["SSL certificate validation"] = "Validazione del certificato SSL";
+$a->strings["SSL certificate cannot be validated. Fix certificate or disable https access to this site."] = "Il certificato SSL non può essere validato. Correggi l'errore o disabilita l'accesso https al sito.";
+$a->strings["Url rewrite in .htaccess is not working. Check your server configuration."] = "In .htaccess la funzionalità url rewrite non funziona. Controlla la configurazione del server.";
+$a->strings["Url rewrite is working"] = "Url rewrite funziona correttamente";
+$a->strings["The database configuration file \".htconfig.php\" could not be written. Please use the enclosed text to create a configuration file in your web server root."] = "Il file di configurazione del database \".htconfig.php\" non puo' essere scritto. Usa il testo qui di seguito per creare questo file di configurazione nella cartella principale del tuo sito.";
$a->strings["Errors encountered creating database tables."] = "La creazione delle tabelle del database ha generato errori.";
-$a->strings["<h1>What next</h1>"] = "";
-$a->strings["IMPORTANT: You will need to [manually] setup a scheduled task for the poller."] = "IMPORTANTE: Devi impostare [manualmente] la pianificazione del poller.";
-$a->strings["l F d, Y \\@ g:i A"] = "l d F Y \\@ G:i";
-$a->strings["Time Conversion"] = "Conversione Ora";
-$a->strings["Friendika provides this service for sharing events with other networks and friends in unknown timezones."] = "Friendika fornisce questo servizio per la condivisione di eventi con altre reti e contatti in fusi orari sconosciuti.";
-$a->strings["UTC time: %s"] = "Ora UTC: %s";
-$a->strings["Current timezone: %s"] = "Fuso orario corrente: %s";
-$a->strings["Converted localtime: %s"] = "Ora locale convertita: %s";
-$a->strings["Please select your timezone:"] = "Selezionare il tuo fuso orario:";
-$a->strings["Poke/Prod"] = "";
-$a->strings["poke, prod or do other things to somebody"] = "";
-$a->strings["Recipient"] = "";
-$a->strings["Choose what you wish to do to recipient"] = "";
-$a->strings["Make this post private"] = "";
-$a->strings["Profile Match"] = "Profili corrispondenti";
-$a->strings["No keywords to match. Please add keywords to your default profile."] = "Nessuna parola chiave per l'abbinamento. Aggiungi parole chiave al tuo profilo predefinito.";
-$a->strings["is interested in:"] = "è interessato a:";
-$a->strings["Connect"] = "Connetti";
-$a->strings["No matches"] = "Nessun risultato";
-$a->strings["Remote privacy information not available."] = "Informazioni remote sulla privacy non disponibili.";
-$a->strings["Visible to:"] = "Visibile a:";
-$a->strings["No such group"] = "Nessun gruppo";
-$a->strings["Group is empty"] = "Il gruppo è vuoto";
-$a->strings["Group: "] = "Gruppo: ";
-$a->strings["Select"] = "Seleziona";
-$a->strings["View %s's profile @ %s"] = "Vedi il profilo di %s @ %s";
-$a->strings["%s from %s"] = "%s da %s";
-$a->strings["View in context"] = "Vedi nel contesto";
-$a->strings["%d comment"] = array(
- 0 => "%d commento",
- 1 => "%d commenti",
-);
-$a->strings["comment"] = array(
- 0 => "",
- 1 => "commento",
-);
-$a->strings["show more"] = "mostra di più";
-$a->strings["like"] = "mi piace";
-$a->strings["dislike"] = "non mi piace";
-$a->strings["Share this"] = "Condividi questo";
-$a->strings["share"] = "condividi";
-$a->strings["Bold"] = "";
-$a->strings["Italic"] = "";
-$a->strings["Underline"] = "";
-$a->strings["Quote"] = "";
-$a->strings["Code"] = "";
-$a->strings["Image"] = "";
-$a->strings["Link"] = "";
-$a->strings["Video"] = "";
-$a->strings["add star"] = "aggiungi a speciali";
-$a->strings["remove star"] = "rimuovi da speciali";
-$a->strings["toggle star status"] = "Inverti stato preferito";
-$a->strings["starred"] = "preferito";
-$a->strings["add tag"] = "aggiungi tag";
-$a->strings["save to folder"] = "salva nella cartella";
-$a->strings["to"] = "a";
-$a->strings["Wall-to-Wall"] = "Da bacheca a bacheca";
-$a->strings["via Wall-To-Wall:"] = "da bacheca a bacheca";
-$a->strings["Welcome to %s"] = "Benvenuto su %s";
-$a->strings["Invalid request identifier."] = "L'identificativo della richiesta non è valido.";
-$a->strings["Discard"] = "Scarta";
-$a->strings["Ignore"] = "Ignora";
-$a->strings["System"] = "Sistema";
-$a->strings["Network"] = "Rete";
-$a->strings["Personal"] = "Personale";
-$a->strings["Home"] = "Home";
-$a->strings["Introductions"] = "Presentazioni";
-$a->strings["Messages"] = "Messaggi";
-$a->strings["Show Ignored Requests"] = "Mostra richieste ignorate";
-$a->strings["Hide Ignored Requests"] = "Nascondi richieste ignorate";
-$a->strings["Notification type: "] = "Tipo di notifica: ";
-$a->strings["Friend Suggestion"] = "Amico suggerito";
-$a->strings["suggested by %s"] = "sugerito da %s";
-$a->strings["Hide this contact from others"] = "Nascondi questo contatto agli altri";
-$a->strings["Post a new friend activity"] = "Invia una attività \"è ora amico con\"";
-$a->strings["if applicable"] = "se applicabile";
-$a->strings["Approve"] = "Approva";
-$a->strings["Claims to be known to you: "] = "Dice di conoscerti: ";
-$a->strings["yes"] = "si";
-$a->strings["no"] = "no";
-$a->strings["Approve as: "] = "Approva come: ";
-$a->strings["Friend"] = "Amico";
-$a->strings["Sharer"] = "Condivisore";
-$a->strings["Fan/Admirer"] = "Fan/Ammiratore";
-$a->strings["Friend/Connect Request"] = "Richiesta amicizia/connessione";
-$a->strings["New Follower"] = "Qualcuno inizia a seguirti";
-$a->strings["No introductions."] = "Nessuna presentazione.";
-$a->strings["Notifications"] = "Notifiche";
-$a->strings["%s liked %s's post"] = "a %s è piaciuto il messaggio di %s";
-$a->strings["%s disliked %s's post"] = "a %s non è piaciuto il messaggio di %s";
-$a->strings["%s is now friends with %s"] = "%s è ora amico di %s";
-$a->strings["%s created a new post"] = "%s a creato un nuovo messaggio";
-$a->strings["%s commented on %s's post"] = "%s ha commentato il messaggio di %s";
-$a->strings["No more network notifications."] = "Nessuna nuova.";
-$a->strings["Network Notifications"] = "Notifiche dalla rete";
-$a->strings["No more system notifications."] = "Nessuna nuova notifica di sistema.";
-$a->strings["System Notifications"] = "Notifiche di sistema";
-$a->strings["No more personal notifications."] = "Nessuna nuova.";
-$a->strings["Personal Notifications"] = "Notifiche personali";
-$a->strings["No more home notifications."] = "Nessuna nuova.";
-$a->strings["Home Notifications"] = "Notifiche bacheca";
-$a->strings["Could not access contact record."] = "Non è possibile accedere al contatto.";
-$a->strings["Could not locate selected profile."] = "Non riesco a trovare il profilo selezionato.";
-$a->strings["Contact updated."] = "Contatto aggiornato.";
-$a->strings["Contact has been blocked"] = "Il contatto è stato bloccato";
-$a->strings["Contact has been unblocked"] = "Il contatto è stato sbloccato";
-$a->strings["Contact has been ignored"] = "Il contatto è ignorato";
-$a->strings["Contact has been unignored"] = "Il contatto non è più ignorato";
-$a->strings["Contact has been archived"] = "";
-$a->strings["Contact has been unarchived"] = "";
-$a->strings["Contact has been removed."] = "Il contatto è stato rimosso.";
-$a->strings["You are mutual friends with %s"] = "Sei amico reciproco con %s";
-$a->strings["You are sharing with %s"] = "Stai condividendo con %s";
-$a->strings["%s is sharing with you"] = "%s sta condividendo con te";
-$a->strings["Private communications are not available for this contact."] = "Le comunicazioni private non sono disponibili per questo contatto.";
-$a->strings["Never"] = "Mai";
-$a->strings["(Update was successful)"] = "(L'aggiornamento è stato completato)";
-$a->strings["(Update was not successful)"] = "(L'aggiornamento non è stato completato)";
-$a->strings["Suggest friends"] = "Suggerisci amici";
-$a->strings["Network type: %s"] = "Tipo di rete: %s";
-$a->strings["%d contact in common"] = array(
- 0 => "%d contatto in comune",
- 1 => "%d contatti in comune",
-);
-$a->strings["View all contacts"] = "Vedi tutti i contatti";
-$a->strings["Unblock"] = "Sblocca";
-$a->strings["Block"] = "Blocca";
-$a->strings["Toggle Blocked status"] = "";
-$a->strings["Unignore"] = "Non ignorare";
-$a->strings["Toggle Ignored status"] = "";
-$a->strings["Unarchive"] = "";
-$a->strings["Archive"] = "";
-$a->strings["Toggle Archive status"] = "";
-$a->strings["Repair"] = "Ripara";
-$a->strings["Advanced Contact Settings"] = "";
-$a->strings["Communications lost with this contact!"] = "";
-$a->strings["Contact Editor"] = "Editor dei Contatti";
-$a->strings["Profile Visibility"] = "Visibilità del profilo";
-$a->strings["Please choose the profile you would like to display to %s when viewing your profile securely."] = "Seleziona il profilo che vuoi mostrare a %s quando visita il tuo profilo in modo sicuro.";
-$a->strings["Contact Information / Notes"] = "Informazioni / Note sul contatto";
-$a->strings["Edit contact notes"] = "Modifica note contatto";
+$a->strings["<h1>What next</h1>"] = "<h1>I prossimi passi</h1>";
+$a->strings["IMPORTANT: You will need to [manually] setup a scheduled task for the poller."] = "IMPORTANTE: Devi creare [manualmente] la pianificazione del polling.";
+$a->strings["Edit post"] = "Modifica articolo";
+$a->strings["%1\$s is following %2\$s's %3\$s"] = "%1\$s sta seguendo %3\$s di %2\$s";
+$a->strings["[Embedded content - reload page to view]"] = "[Contenuto incorporato - ricarica la pagina per visualizzarlo correttamente]";
+$a->strings["toggle full screen mode"] = "attiva/disattiva schermo intero";
+$a->strings["%1\$s tagged %2\$s's %3\$s with %4\$s"] = "%1\$s ha taggato %3\$s di %2\$s con %4\$s";
+$a->strings["Public access denied."] = "Accesso pubblico negato.";
+$a->strings["No connections."] = "Nessun contatto.";
$a->strings["Visit %s's profile [%s]"] = "Visita il profilo di %s [%s]";
-$a->strings["Block/Unblock contact"] = "Blocca/Sblocca contatto";
-$a->strings["Ignore contact"] = "Ignora il contatto";
-$a->strings["Repair URL settings"] = "Impostazioni riparazione URL";
-$a->strings["View conversations"] = "Vedi conversazioni";
-$a->strings["Delete contact"] = "Rimuovi contatto";
-$a->strings["Last update:"] = "Ultimo aggiornamento:";
-$a->strings["Update public posts"] = "Aggiorna messaggi pubblici";
-$a->strings["Update now"] = "Aggiorna adesso";
-$a->strings["Currently blocked"] = "Bloccato";
-$a->strings["Currently ignored"] = "Ignorato";
-$a->strings["Currently archived"] = "";
-$a->strings["Replies/likes to your public posts <strong>may</strong> still be visible"] = "Risposte ai tuoi post pubblici <strong>possono</strong> essere comunque visibili";
-$a->strings["Suggestions"] = "Suggerimenti";
-$a->strings["Suggest potential friends"] = "";
-$a->strings["All Contacts"] = "Tutti i contatti";
-$a->strings["Show all contacts"] = "";
-$a->strings["Unblocked"] = "";
-$a->strings["Only show unblocked contacts"] = "";
-$a->strings["Blocked"] = "";
-$a->strings["Only show blocked contacts"] = "";
-$a->strings["Ignored"] = "";
-$a->strings["Only show ignored contacts"] = "";
-$a->strings["Archived"] = "";
-$a->strings["Only show archived contacts"] = "";
-$a->strings["Hidden"] = "";
-$a->strings["Only show hidden contacts"] = "";
-$a->strings["Mutual Friendship"] = "Amicizia reciproca";
-$a->strings["is a fan of yours"] = "è un tuo fan";
-$a->strings["you are a fan of"] = "sei un fan di";
-$a->strings["Edit contact"] = "Modifca contatto";
-$a->strings["Contacts"] = "Contatti";
-$a->strings["Search your contacts"] = "Cerca nei tuoi contatti";
-$a->strings["Finding: "] = "Ricerca: ";
-$a->strings["Find"] = "Trova";
-$a->strings["No valid account found."] = "Nessun account valido trovato.";
-$a->strings["Password reset request issued. Check your email."] = "La richiesta per reimpostare la password è stata inviata. Controlla la tua email.";
-$a->strings["Password reset requested at %s"] = "Richiesta reimpostazione password su %s";
-$a->strings["Administrator"] = "Amministratore";
-$a->strings["Request could not be verified. (You may have previously submitted it.) Password reset failed."] = "La richiesta non può essere verificata. (Puoi averla già richiesta precendentemente). Reimpostazione password fallita.";
-$a->strings["Password Reset"] = "Reimpostazione password";
-$a->strings["Your password has been reset as requested."] = "La tua password è stata reimpostata come richiesto.";
-$a->strings["Your new password is"] = "La tua nuova password è";
-$a->strings["Save or copy your new password - and then"] = "Salva o copia la tua nuova password, quindi";
-$a->strings["click here to login"] = "clicca qui per entrare";
-$a->strings["Your password may be changed from the <em>Settings</em> page after successful login."] = "Puoi cambiare la tua password dalla pagina <em>Impostazioni</em> dopo aver effettuato l'accesso.";
-$a->strings["Forgot your Password?"] = "Hai dimenticato la password?";
-$a->strings["Enter your email address and submit to have your password reset. Then check your email for further instructions."] = "Inserisci il tuo indirizzo email per reimpostare la password.";
-$a->strings["Nickname or Email: "] = "Nome utente o email: ";
-$a->strings["Reset"] = "Reimposta";
-$a->strings["Account settings"] = "Parametri account";
-$a->strings["Display settings"] = "Impostazioni grafiche";
-$a->strings["Connector settings"] = "Impostazioni connettori";
-$a->strings["Plugin settings"] = "Impostazioni plugin";
-$a->strings["Connected apps"] = "";
-$a->strings["Export personal data"] = "Esporta dati personali";
-$a->strings["Remove account"] = "";
-$a->strings["Settings"] = "Impostazioni";
-$a->strings["Missing some important data!"] = "Mancano alcuni dati importanti!";
-$a->strings["Update"] = "Aggiorna";
-$a->strings["Failed to connect with email account using the settings provided."] = "Impossibile collegarsi all'account email con i parametri forniti.";
-$a->strings["Email settings updated."] = "Impostazioni e-mail aggiornate.";
-$a->strings["Passwords do not match. Password unchanged."] = "Le password non corrispondono. Password non cambiata.";
-$a->strings["Empty passwords are not allowed. Password unchanged."] = "Le password non possono essere vuote. Password non cambiata.";
-$a->strings["Password changed."] = "Password cambiata.";
-$a->strings["Password update failed. Please try again."] = "Aggiornamento password fallito. Prova ancora.";
-$a->strings[" Please use a shorter name."] = " Usa un nome più corto.";
-$a->strings[" Name too short."] = " Nome troppo corto.";
-$a->strings[" Not valid email."] = " Email non valida.";
-$a->strings[" Cannot change to that email."] = "Non puoi usare quella email.";
-$a->strings["Private forum has no privacy permissions. Using default privacy group."] = "";
-$a->strings["Private forum has no privacy permissions and no default privacy group."] = "";
-$a->strings["Settings updated."] = "Impostazioni aggiornate.";
-$a->strings["Add application"] = "Aggiungi applicazione";
-$a->strings["Consumer Key"] = "Consumer Key";
-$a->strings["Consumer Secret"] = "Consumer Secret";
-$a->strings["Redirect"] = "Redirect";
-$a->strings["Icon url"] = "Url icona";
-$a->strings["You can't edit this application."] = "Non puoi modificare questa applicazione.";
-$a->strings["Connected Apps"] = "Applicazioni Collegate";
-$a->strings["Client key starts with"] = "Chiave del client inizia con";
-$a->strings["No name"] = "Nessun nome";
-$a->strings["Remove authorization"] = "Rimuovi l'autorizzazione";
-$a->strings["No Plugin settings configured"] = "Nessun plugin ha impostazioni modificabili";
-$a->strings["Plugin Settings"] = "Impostazioni plugin";
-$a->strings["Built-in support for %s connectivity is %s"] = "Il supporto integrato per la connettività con %s è %s";
-$a->strings["enabled"] = "abilitato";
-$a->strings["disabled"] = "disabilitato";
-$a->strings["StatusNet"] = "StatusNet";
-$a->strings["Email access is disabled on this site."] = "L'accesso email è disabilitato su questo sito.";
-$a->strings["Connector Settings"] = "Impostazioni Connettore";
-$a->strings["Email/Mailbox Setup"] = "Impostazioni email";
-$a->strings["If you wish to communicate with email contacts using this service (optional), please specify how to connect to your mailbox."] = "Se vuoi comunicare con i contatti email usando questo servizio, specifica come collegarti alla tua casella di posta. (opzionale)";
-$a->strings["Last successful email check:"] = "Ultimo controllo email eseguito con successo:";
-$a->strings["IMAP server name:"] = "Nome server IMAP:";
-$a->strings["IMAP port:"] = "Porta IMAP:";
-$a->strings["Security:"] = "Sicurezza:";
-$a->strings["None"] = "Nessuna";
-$a->strings["Email login name:"] = "Nome utente email:";
-$a->strings["Email password:"] = "Password email:";
-$a->strings["Reply-to address:"] = "Indirizzo di risposta:";
-$a->strings["Send public posts to all email contacts:"] = "Invia i messaggi pubblici ai contatti email:";
-$a->strings["Action after import:"] = "Azione post importazione:";
-$a->strings["Mark as seen"] = "Segna come letto";
-$a->strings["Move to folder"] = "Sposta nella cartella";
-$a->strings["Move to folder:"] = "Sposta nella cartella:";
-$a->strings["No special theme for mobile devices"] = "";
-$a->strings["Display Settings"] = "Impostazioni Grafiche";
-$a->strings["Display Theme:"] = "Tema:";
-$a->strings["Mobile Theme:"] = "";
-$a->strings["Update browser every xx seconds"] = "Aggiorna il browser ogni x secondi";
-$a->strings["Minimum of 10 seconds, no maximum"] = "Minimo 10 secondi, nessun limite massimo";
-$a->strings["Number of items to display per page:"] = "";
-$a->strings["Maximum of 100 items"] = "Massimo 100 voci";
-$a->strings["Don't show emoticons"] = "Non mostrare le emoticons";
-$a->strings["Normal Account Page"] = "";
-$a->strings["This account is a normal personal profile"] = "Questo account è un normale profilo personale";
-$a->strings["Soapbox Page"] = "";
-$a->strings["Automatically approve all connection/friend requests as read-only fans"] = "Chi richiede la connessione/amicizia sarà accettato automaticamente come fan che potrà solamente leggere la bacheca";
-$a->strings["Community Forum/Celebrity Account"] = "";
-$a->strings["Automatically approve all connection/friend requests as read-write fans"] = "Chi richiede la connessione/amicizia sarà accettato automaticamente come fan che potrà leggere e scrivere sulla bacheca";
-$a->strings["Automatic Friend Page"] = "";
-$a->strings["Automatically approve all connection/friend requests as friends"] = "Chi richiede la connessione/amicizia sarà accettato automaticamente come amico";
-$a->strings["Private Forum [Experimental]"] = "";
-$a->strings["Private forum - approved members only"] = "";
-$a->strings["OpenID:"] = "OpenID:";
-$a->strings["(Optional) Allow this OpenID to login to this account."] = "(Opzionale) Consente di loggarti in questo account con questo OpenID";
-$a->strings["Publish your default profile in your local site directory?"] = "Pubblica il tuo profilo predefinito nell'elenco locale del sito";
-$a->strings["Publish your default profile in the global social directory?"] = "Pubblica il tuo profilo predefinito nell'elenco sociale globale";
-$a->strings["Hide your contact/friend list from viewers of your default profile?"] = "Nascondi la lista dei tuoi contatti/amici dai visitatori del tuo profilo predefinito";
-$a->strings["Hide your profile details from unknown viewers?"] = "Nascondi i dettagli del tuo profilo ai visitatori sconosciuti?";
-$a->strings["Allow friends to post to your profile page?"] = "Permetti agli amici di scrivere sulla tua pagina profilo?";
-$a->strings["Allow friends to tag your posts?"] = "Permetti agli amici di taggare i tuoi messaggi?";
-$a->strings["Allow us to suggest you as a potential friend to new members?"] = "Ci permetti di suggerirti come potenziale amico ai nuovi membri?";
-$a->strings["Permit unknown people to send you private mail?"] = "Permetti a utenti sconosciuti di inviarti messaggi privati?";
-$a->strings["Profile is <strong>not published</strong>."] = "Il profilo <strong>non è pubblicato</strong>.";
-$a->strings["or"] = "o";
-$a->strings["Your Identity Address is"] = "L'indirizzo della tua identità è";
-$a->strings["Automatically expire posts after this many days:"] = "Fai scadere i post automaticamente dopo x giorni:";
-$a->strings["If empty, posts will not expire. Expired posts will be deleted"] = "Se lasciato vuoto, i messaggi non verranno cancellati.";
-$a->strings["Advanced expiration settings"] = "Impostazioni avanzate di scandenza";
-$a->strings["Advanced Expiration"] = "Scadenza avanzata";
-$a->strings["Expire posts:"] = "Fai scadere i post:";
-$a->strings["Expire personal notes:"] = "Fai scadere le Note personali:";
-$a->strings["Expire starred posts:"] = "Fai scadere i post Speciali:";
-$a->strings["Expire photos:"] = "Fai scadere le foto:";
-$a->strings["Only expire posts by others:"] = "";
-$a->strings["Account Settings"] = "Impostazioni account";
-$a->strings["Password Settings"] = "Impostazioni password";
-$a->strings["New Password:"] = "Nuova password:";
-$a->strings["Confirm:"] = "Conferma:";
-$a->strings["Leave password fields blank unless changing"] = "Lascia questi campi in bianco per non effettuare variazioni alla password";
-$a->strings["Basic Settings"] = "Impostazioni base";
-$a->strings["Full Name:"] = "Nome completo:";
-$a->strings["Email Address:"] = "Indirizzo Email:";
-$a->strings["Your Timezone:"] = "Il tuo fuso orario:";
-$a->strings["Default Post Location:"] = "Località predefinita:";
-$a->strings["Use Browser Location:"] = "Usa la località rilevata dal browser:";
-$a->strings["Security and Privacy Settings"] = "Impostazioni di sicurezza e privacy";
-$a->strings["Maximum Friend Requests/Day:"] = "Numero massimo di richieste di amicizia al giorno:";
-$a->strings["(to prevent spam abuse)"] = "(per prevenire lo spam)";
-$a->strings["Default Post Permissions"] = "Permessi predefiniti per i messaggi";
-$a->strings["(click to open/close)"] = "(clicca per aprire/chiudere)";
-$a->strings["Maximum private messages per day from unknown people:"] = "Numero massimo di messaggi privati da utenti sconosciuti per giorno:";
-$a->strings["Notification Settings"] = "Impostazioni notifiche";
-$a->strings["By default post a status message when:"] = "";
-$a->strings["accepting a friend request"] = "";
-$a->strings["joining a forum/community"] = "";
-$a->strings["making an <em>interesting</em> profile change"] = "";
-$a->strings["Send a notification email when:"] = "Invia una mail di notifica quando:";
-$a->strings["You receive an introduction"] = "Ricevi una presentazione";
-$a->strings["Your introductions are confirmed"] = "Le tue presentazioni sono confermate";
-$a->strings["Someone writes on your profile wall"] = "Qualcuno scrive sulla bacheca del tuo profilo";
-$a->strings["Someone writes a followup comment"] = "Qualcuno scrive un commento a un tuo messaggio";
-$a->strings["You receive a private message"] = "Ricevi un messaggio privato";
-$a->strings["You receive a friend suggestion"] = "Hai ricevuto un suggerimento di amicizia";
-$a->strings["You are tagged in a post"] = "Sei stato taggato in un post";
-$a->strings["You are poked/prodded/etc. in a post"] = "";
-$a->strings["Advanced Account/Page Type Settings"] = "";
-$a->strings["Change the behaviour of this account for special situations"] = "";
-$a->strings["Manage Identities and/or Pages"] = "Gestisci indentità e/o pagine";
-$a->strings["Toggle between different identities or community/group pages which share your account details or which you have been granted \"manage\" permissions"] = "Cambia tra differenti identità o pagine comunità/gruppi che condividono il tuo account o per cui hai i permessi di gestione";
-$a->strings["Select an identity to manage: "] = "Seleziona un'identità da gestire:";
-$a->strings["Search Results For:"] = "Cerca risultati per:";
-$a->strings["Remove term"] = "Rimuovi termine";
-$a->strings["Saved Searches"] = "Ricerche salvate";
-$a->strings["add"] = "aggiungi";
-$a->strings["Commented Order"] = "Ordina per commento";
-$a->strings["Sort by Comment Date"] = "";
-$a->strings["Posted Order"] = "Ordina per invio";
-$a->strings["Sort by Post Date"] = "";
-$a->strings["Posts that mention or involve you"] = "";
-$a->strings["New"] = "Nuovo";
-$a->strings["Activity Stream - by date"] = "";
-$a->strings["Starred"] = "Preferiti";
-$a->strings["Favourite Posts"] = "";
-$a->strings["Shared Links"] = "Links condivisi";
-$a->strings["Interesting Links"] = "";
-$a->strings["Warning: This group contains %s member from an insecure network."] = array(
- 0 => "Attenzione: questo gruppo contiene %s membro da un network insicuro.",
- 1 => "Attenzione: questo gruppo contiene %s membri da un network insicuro.",
-);
-$a->strings["Private messages to this group are at risk of public disclosure."] = "I messaggi privati su questo gruppo potrebbero risultare visibili anche pubblicamente.";
-$a->strings["Contact: "] = "Contatto:";
-$a->strings["Private messages to this person are at risk of public disclosure."] = "I messaggi privati a questa persona potrebbero risultare visibili anche pubblicamente.";
-$a->strings["Invalid contact."] = "Contatto non valido.";
-$a->strings["Personal Notes"] = "Note personali";
-$a->strings["Save"] = "Salva";
-$a->strings["Number of daily wall messages for %s exceeded. Message failed."] = "Numero giornaliero di messaggi per %s superato. Invio fallito.";
-$a->strings["No recipient selected."] = "Nessun destinatario selezionato.";
-$a->strings["Unable to check your home location."] = "";
-$a->strings["Message could not be sent."] = "Il messaggio non puo' essere inviato.";
-$a->strings["Message collection failure."] = "Errore recuperando il messaggio.";
-$a->strings["Message sent."] = "Messaggio inviato.";
-$a->strings["No recipient."] = "Nessun destinatario.";
-$a->strings["Please enter a link URL:"] = "Inserisci l'indirizzo del link:";
-$a->strings["Send Private Message"] = "Invia un messaggio privato";
-$a->strings["If you wish for %s to respond, please check that the privacy settings on your site allow private mail from unknown senders."] = "Se vuoi che %s ti risponda, controlla che le tue impostazioni di privacy permettano la ricezione di messaggi privati da mittenti sconosciuti.";
-$a->strings["To:"] = "A:";
-$a->strings["Subject:"] = "Oggetto:";
-$a->strings["Your message:"] = "Il tuo messaggio:";
-$a->strings["Welcome to Friendica"] = "Benvenuto su Friendica";
-$a->strings["New Member Checklist"] = "Cose da fare per i Nuovi Utenti";
-$a->strings["We would like to offer some tips and links to help make your experience enjoyable. Click any item to visit the relevant page. A link to this page will be visible from your home page for two weeks after your initial registration and then will quietly disappear."] = "Vorremmo offrirti qualche trucco e dei link alla guida per aiutarti ad avere un'esperienza divertente. Clicca su un qualsiasi elemento per visitare la relativa pagina. Un link a questa pagina sarà visibile nella tua home per due settimane dopo la tua registrazione.";
-$a->strings["Getting Started"] = "";
-$a->strings["Friendica Walk-Through"] = "";
-$a->strings["On your <em>Quick Start</em> page - find a brief introduction to your profile and network tabs, make some new connections, and find some groups to join."] = "";
-$a->strings["Go to Your Settings"] = "";
-$a->strings["On your <em>Settings</em> page - change your initial password. Also make a note of your Identity Address. This looks just like an email address - and will be useful in making friends on the free social web."] = "Nella tua pagina <em>Impostazioni</em> - cambia la tua password iniziale. Prendi anche nota del tuo Indirizzo Identità. Assomiglia a un indirizzo email e sarà utile per stringere amicizie nel web sociale libero.";
-$a->strings["Review the other settings, particularly the privacy settings. An unpublished directory listing is like having an unlisted phone number. In general, you should probably publish your listing - unless all of your friends and potential friends know exactly how to find you."] = "Guarda le altre impostazioni, in particolare le impostazioni della privacy. Un profilo non pubblicato è come un numero di telefono non in elenco. In genere, dovresti pubblicare il tuo profilo - a meno che tutti i tuoi amici e potenziali tali sappiano esattamente come trovarti.";
-$a->strings["Profile"] = "Profilo";
-$a->strings["Upload Profile Photo"] = "Carica la foto del profilo";
-$a->strings["Upload a profile photo if you have not done so already. Studies have shown that people with real photos of themselves are ten times more likely to make friends than people who do not."] = "Carica una foto del profilo se non l'hai ancora fatto. Studi hanno mostrato che persone che hanno vere foto di se stessi hanno dieci volte più probabilità di fare amicizie rispetto alle persone che non ce l'hanno.";
-$a->strings["Edit Your Profile"] = "";
-$a->strings["Edit your <strong>default</strong> profile to your liking. Review the settings for hiding your list of friends and hiding the profile from unknown visitors."] = "Modifica il tuo profilo <strong>predefinito</strong> a piacimento. Rivedi le impostazioni per nascondere la tua lista di amici e nascondere il profilo ai visitatori sconosciuti.";
-$a->strings["Profile Keywords"] = "";
-$a->strings["Set some public keywords for your default profile which describe your interests. We may be able to find other people with similar interests and suggest friendships."] = "Inserisci qualche parola chiave pubblica nel tuo profilo predefinito che descriva i tuoi interessi. Potremmo essere in grado di trovare altre persone con interessi similari e suggerirti delle amicizie.";
-$a->strings["Connecting"] = "";
-$a->strings["Facebook"] = "Facebook";
-$a->strings["Authorise the Facebook Connector if you currently have a Facebook account and we will (optionally) import all your Facebook friends and conversations."] = "Autorizza il Facebook Connector se hai un account Facebook, e noi (opzionalmente) importeremo tuti i tuoi amici e le tue conversazioni da Facebook.";
-$a->strings["<em>If</em> this is your own personal server, installing the Facebook addon may ease your transition to the free social web."] = "<em>Se</em questo è il tuo server personale, installare il plugin per Facebook puo' aiutarti nella transizione verso il web sociale libero.";
-$a->strings["Importing Emails"] = "";
-$a->strings["Enter your email access information on your Connector Settings page if you wish to import and interact with friends or mailing lists from your email INBOX"] = "Inserisci i tuoi dati di accesso all'email nella tua pagina Impostazioni Connettori se vuoi importare e interagire con amici o mailing list dalla tua casella di posta in arrivo";
-$a->strings["Go to Your Contacts Page"] = "";
-$a->strings["Your Contacts page is your gateway to managing friendships and connecting with friends on other networks. Typically you enter their address or site URL in the <em>Add New Contact</em> dialog."] = "La tua pagina Contatti è il mezzo per gestire le amicizie e collegarsi con amici su altre reti. Di solito, basta inserire l'indirizzo nel campo <em>Aggiungi Nuovo Contatto</em>";
-$a->strings["Go to Your Site's Directory"] = "";
-$a->strings["The Directory page lets you find other people in this network or other federated sites. Look for a <em>Connect</em> or <em>Follow</em> link on their profile page. Provide your own Identity Address if requested."] = "La pagina Elenco ti permette di trovare altre persone in questa rete o in altri siti. Cerca un link <em>Connetti</em> o <em>Segui</em> nella loro pagina del profilo. Inserisci il tuo Indirizzo Identità, se richiesto.";
-$a->strings["Finding New People"] = "";
-$a->strings["On the side panel of the Contacts page are several tools to find new friends. We can match people by interest, look up people by name or interest, and provide suggestions based on network relationships. On a brand new site, friend suggestions will usually begin to be populated within 24 hours."] = "Nel pannello laterale nella pagina \"Contatti\", ci sono diversi strumenti per trovare nuovi amici. Possiamo confrontare le persone per interessi, cercare le persone per nome e fornire suggerimenti basati sui tuoi contatti esistenti. Su un sito nuovo, i suggerimenti sono di solito presenti dopo 24 ore.";
-$a->strings["Groups"] = "Grouppi";
-$a->strings["Group Your Contacts"] = "";
-$a->strings["Once you have made some friends, organize them into private conversation groups from the sidebar of your Contacts page and then you can interact with each group privately on your Network page."] = "Quando avrai alcuni amici, organizzali in gruppi di conversazioni private dalla barra laterale della tua pagina Contatti. Potrai interagire privatamente con ogni gruppo nella tua pagina Rete";
-$a->strings["Why Aren't My Posts Public?"] = "";
-$a->strings["Friendica respects your privacy. By default, your posts will only show up to people you've added as friends. For more information, see the help section from the link above."] = "";
-$a->strings["Getting Help"] = "";
-$a->strings["Go to the Help Section"] = "";
-$a->strings["Our <strong>help</strong> pages may be consulted for detail on other program features and resources."] = "Le nostre pagine della <strong>guida</strong> possono essere consultate per avere dettagli su altre caratteristiche del programma e altre risorse.";
-$a->strings["Item not available."] = "Oggetto non disponibile.";
-$a->strings["Item was not found."] = "Oggetto non trovato.";
-$a->strings["Group created."] = "Gruppo creato.";
-$a->strings["Could not create group."] = "Impossibile creare il gruppo.";
-$a->strings["Group not found."] = "Gruppo non trovato.";
-$a->strings["Group name changed."] = "Il nome del gruppo è cambiato.";
-$a->strings["Permission denied"] = "Permesso negato";
-$a->strings["Create a group of contacts/friends."] = "Crea un gruppo di amici/contatti.";
-$a->strings["Group Name: "] = "Nome del gruppo:";
-$a->strings["Group removed."] = "Gruppo rimosso.";
-$a->strings["Unable to remove group."] = "Impossibile rimuovere il gruppo.";
-$a->strings["Group Editor"] = "Modifica gruppo";
-$a->strings["Members"] = "Membri";
-$a->strings["Click on a contact to add or remove."] = "Clicca su un contatto per aggiungerlo o rimuoverlo.";
-$a->strings["Invalid profile identifier."] = "Indentificativo del profilo non valido.";
-$a->strings["Profile Visibility Editor"] = "Modifica visibilità del profilo";
-$a->strings["Visible To"] = "Visibile a";
-$a->strings["All Contacts (with secure profile access)"] = "Tutti i contatti (con profilo ad accesso sicuro)";
-$a->strings["No contacts."] = "Nessun contatto.";
-$a->strings["View Contacts"] = "Visualizza i contatti";
-$a->strings["Registration details for %s"] = "Dettagli della registrazione di %s";
-$a->strings["Registration successful. Please check your email for further instructions."] = "Registrazione completata. Controlla la tua mail per ulteriori informazioni.";
-$a->strings["Failed to send email message. Here is the message that failed."] = "Errore nell'invio del messaggio email. Questo è il messaggio non inviato.";
-$a->strings["Your registration can not be processed."] = "La tua registrazione non puo' essere elaborata.";
-$a->strings["Registration request at %s"] = "Richiesta di registrazione su %s";
-$a->strings["Your registration is pending approval by the site owner."] = "La tua richiesta è in attesa di approvazione da parte del prorietario del sito.";
-$a->strings["This site has exceeded the number of allowed daily account registrations. Please try again tomorrow."] = "Questo sito ha superato il numero di registrazioni giornaliere consentite. Prova di nuovo domani.";
-$a->strings["You may (optionally) fill in this form via OpenID by supplying your OpenID and clicking 'Register'."] = "Se vuoi, puoi riempire questo modulo tramite OpenID, inserendo il tuo OpenID e cliccando 'Registra'.";
-$a->strings["If you are not familiar with OpenID, please leave that field blank and fill in the rest of the items."] = "Se non hai familiarità con OpenID, lascia il campo vuoto e riempi il resto della maschera.";
-$a->strings["Your OpenID (optional): "] = "Il tuo OpenID (opzionale): ";
-$a->strings["Include your profile in member directory?"] = "Includi il tuo profilo nell'elenco pubblico?";
-$a->strings["Membership on this site is by invitation only."] = "La registrazione su questo sito è solo su invito.";
-$a->strings["Your invitation ID: "] = "L'ID del tuo invito:";
-$a->strings["Registration"] = "Registrazione";
-$a->strings["Your Full Name (e.g. Joe Smith): "] = "Il tuo nome completo (es. Mario Rossi): ";
-$a->strings["Your Email Address: "] = "Il tuo indirizzo email: ";
-$a->strings["Choose a profile nickname. This must begin with a text character. Your profile address on this site will then be '<strong>nickname@\$sitename</strong>'."] = "Scegli un nome utente. Deve cominciare con una lettera. L'indirizzo del tuo profilo sarà '<strong>soprannome@\$sitename</strong>'.";
-$a->strings["Choose a nickname: "] = "Scegli un nome utente: ";
-$a->strings["Register"] = "Registrati";
-$a->strings["People Search"] = "Cerca persone";
-$a->strings["status"] = "stato";
-$a->strings["%1\$s likes %2\$s's %3\$s"] = "A %1\$s piace %3\$s di %2\$s";
-$a->strings["%1\$s doesn't like %2\$s's %3\$s"] = "A %1\$s non piace %3\$s di %2\$s";
-$a->strings["Item not found."] = "Elemento non trovato.";
-$a->strings["Access denied."] = "Accesso negato.";
-$a->strings["Photos"] = "Foto";
-$a->strings["Files"] = "";
-$a->strings["Account approved."] = "Account approvato.";
-$a->strings["Registration revoked for %s"] = "Registrazione revocata per %s";
-$a->strings["Please login."] = "Accedi.";
-$a->strings["Unable to locate original post."] = "Impossibile trovare il messaggio originale.";
-$a->strings["Empty post discarded."] = "Messaggio vuoto scartato.";
-$a->strings["Wall Photos"] = "Foto della bacheca";
-$a->strings["System error. Post not saved."] = "Errore di sistema. Messaggio non salvato.";
-$a->strings["This message was sent to you by %s, a member of the Friendica social network."] = "Questo messaggio ti è stato inviato da %s, un membro del social network Friendica.";
-$a->strings["You may visit them online at %s"] = "Puoi visitarli online su %s";
-$a->strings["Please contact the sender by replying to this post if you do not wish to receive these messages."] = "Contatta il mittente rispondendo a questo post se non vuoi ricevere questi messaggi.";
-$a->strings["%s posted an update."] = "%s ha inviato un aggiornamento.";
-$a->strings["%1\$s is currently %2\$s"] = "";
-$a->strings["Mood"] = "";
-$a->strings["Set your current mood and tell your friends"] = "";
-$a->strings["Image uploaded but image cropping failed."] = "L'immagine è stata caricata, ma il non è stato possibile ritagliarla.";
-$a->strings["Image size reduction [%s] failed."] = "Il ridimensionamento del'immagine [%s] è fallito.";
-$a->strings["Shift-reload the page or clear browser cache if the new photo does not display immediately."] = "Ricarica la pagina con shift+F5 o cancella la cache del browser se la nuova foto non viene mostrata immediatamente.";
-$a->strings["Unable to process image"] = "Impossibile elaborare l'immagine";
-$a->strings["Image exceeds size limit of %d"] = "La dimensione dell'immagine supera il limite di %d";
-$a->strings["Upload File:"] = "Carica un file:";
-$a->strings["Select a profile:"] = "";
-$a->strings["Upload"] = "Carica";
-$a->strings["skip this step"] = "salta questo passaggio";
-$a->strings["select a photo from your photo albums"] = "seleziona una foto dai tuoi album";
-$a->strings["Crop Image"] = "Ritaglia immagine";
-$a->strings["Please adjust the image cropping for optimum viewing."] = "Ritaglia l'imagine per una visualizzazione migliore.";
-$a->strings["Done Editing"] = "Finito";
-$a->strings["Image uploaded successfully."] = "Immagine caricata con successo.";
-$a->strings["No profile"] = "Nessun profilo";
-$a->strings["Remove My Account"] = "Rimuovi il mio account";
-$a->strings["This will completely remove your account. Once this has been done it is not recoverable."] = "Questo comando rimuoverà completamente il tuo account. Una volta rimosso non potrai più recuperarlo.";
-$a->strings["Please enter your password for verification:"] = "Inserisci la tua password per verifica:";
-$a->strings["New Message"] = "Nuovo messaggio";
-$a->strings["Unable to locate contact information."] = "Impossibile trovare le informazioni del contatto.";
-$a->strings["Message deleted."] = "Messaggio eliminato.";
-$a->strings["Conversation removed."] = "Conversazione rimossa.";
-$a->strings["No messages."] = "Nessun messaggio.";
-$a->strings["Unknown sender - %s"] = "Mittente sconosciuto - %s";
-$a->strings["You and %s"] = "Tu e %s";
-$a->strings["%s and You"] = "";
-$a->strings["Delete conversation"] = "Elimina la conversazione";
-$a->strings["D, d M Y - g:i A"] = "D d M Y - G:i";
-$a->strings["%d message"] = array(
- 0 => "%d messaggio",
- 1 => "%d messaggi",
-);
-$a->strings["Message not available."] = "Messaggio non disponibile.";
-$a->strings["Delete message"] = "Elimina il messaggio";
-$a->strings["No secure communications available. You <strong>may</strong> be able to respond from the sender's profile page."] = "Nessuna comunicazione sicura disponibile, <strong>Potresti</strong> essere in grado di rispondere dalla pagina del profilo del mittente.";
-$a->strings["Send Reply"] = "Invia la risposta";
-$a->strings["Friends of %s"] = "Amici di %s";
-$a->strings["No friends to display."] = "Nessun amico da visualizzare.";
-$a->strings["Theme settings updated."] = "";
+$a->strings["View Connnections"] = "Guarda i contatti";
+$a->strings["Tag removed"] = "Tag rimosso";
+$a->strings["Remove Item Tag"] = "Rimuovi il tag";
+$a->strings["Select a tag to remove: "] = "Seleziona un tag da rimuovere: ";
+$a->strings["Remove"] = "Rimuovi";
+$a->strings["Continue"] = "Continua";
+$a->strings["Premium Channel Setup"] = "Canale premium - installazione";
+$a->strings["Enable premium channel connection restrictions"] = "Abilita le restrizioni del canale premium";
+$a->strings["Please enter your restrictions or conditions, such as paypal receipt, usage guidelines, etc."] = "Scrivi le condizioni d'uso e le restrizioni di questo canale, come per esempio le linee guida o il sistema di pagamento ecc.";
+$a->strings["This channel may require additional steps or acknowledgement of the following conditions prior to connecting:"] = "Prima di connetterti a questo canale è necessario che tu accetti le seguenti condizioni:";
+$a->strings["Potential connections will then see the following text before proceeding:"] = "Il testo seguente comparirà a chi vorrà connettersi:";
+$a->strings["By continuing, I certify that I have complied with any instructions provided on this page."] = "Continuando dichiaro di aver seguito tutte le indicazioni e le istruzioni fornite in questa pagina.";
+$a->strings["(No specific instructions have been provided by the channel owner.)"] = "(Il gestore del canale non ha fornito istruzioni specifiche)";
+$a->strings["Restricted or Premium Channel"] = "Canale premium - con restrizioni";
+$a->strings["No potential page delegates located."] = "Impossibile trovare delegati per questa pagina.";
+$a->strings["Delegate Page Management"] = "Gestione delegati per la pagina";
+$a->strings["Delegates are able to manage all aspects of this account/page except for basic account settings. Please do not delegate your personal account to anybody that you do not trust completely."] = "I Delegati sono in grando di gestire tutti gli aspetti di questa pagina, tranne per i settaggi di base dell'account. Non delegare il tuo account personale a nessuno di cui non ti fidi ciecamente.";
+$a->strings["Existing Page Managers"] = "Gestori attuali della pagina";
+$a->strings["Existing Page Delegates"] = "Delegati attuali della pagina";
+$a->strings["Potential Delegates"] = "Delegati potenziali";
+$a->strings["Add"] = "Aggiungi";
+$a->strings["No entries."] = "Nessun risultato.";
+$a->strings["Failed to create source. No channel selected."] = "Impossibile creare la sorgente. Nessun canale selezionato.";
+$a->strings["Source created."] = "Sorgente creata.";
+$a->strings["Source updated."] = "Sorgente aggiornata.";
+$a->strings["Manage remote sources of content for your channel."] = "Gestisci le sorgenti dei contenuti del tuo canale.";
+$a->strings["New Source"] = "Nuova sorgente";
+$a->strings["Import all or selected content from the following channel into this channel and distribute it according to your channel settings."] = "Importa nel tuo canale tutti o una parte dei contenuti dal canale seguente.";
+$a->strings["Only import content with these words (one per line)"] = "Importa solo i contenuti che hanno queste parole (una per riga)";
+$a->strings["Leave blank to import all public content"] = "Lascia vuoto per importare tutti i contenuti pubblici";
+$a->strings["Channel Name"] = "Nome del canale";
+$a->strings["Source not found."] = "Sorgente non trovata.";
+$a->strings["Edit Source"] = "Modifica la sorgente";
+$a->strings["Delete Source"] = "Elimina la sorgente";
+$a->strings["Source removed"] = "Sorgente eliminata";
+$a->strings["Unable to remove source."] = "Impossibile rimuovere la sorgente.";
+$a->strings["Theme settings updated."] = "Le impostazioni del tema sono state aggiornate.";
$a->strings["Site"] = "Sito";
$a->strings["Users"] = "Utenti";
$a->strings["Plugins"] = "Plugin";
$a->strings["Themes"] = "Temi";
-$a->strings["DB updates"] = "";
+$a->strings["Server"] = "Server";
+$a->strings["DB updates"] = "Aggiornamenti al DB";
$a->strings["Logs"] = "Log";
-$a->strings["Admin"] = "Amministrazione";
-$a->strings["Plugin Features"] = "";
-$a->strings["User registrations waiting for confirmation"] = "Utenti registrati in attesa di conferma";
-$a->strings["Normal Account"] = "Account normale";
-$a->strings["Soapbox Account"] = "Account per comunicati e annunci";
-$a->strings["Community/Celebrity Account"] = "Account per celebrità o per comunità";
-$a->strings["Automatic Friend Account"] = "Account per amicizia automatizzato";
-$a->strings["Blog Account"] = "";
-$a->strings["Private Forum"] = "";
-$a->strings["Message queues"] = "";
+$a->strings["Plugin Features"] = "Funzionalità dei componenti aggiuntivi";
+$a->strings["User registrations waiting for confirmation"] = "Registrazioni in attesa";
+$a->strings["Message queues"] = "Messaggi in attesa di recapito";
$a->strings["Administration"] = "Amministrazione";
-$a->strings["Summary"] = "Sommario";
+$a->strings["Summary"] = "Riepilogo";
$a->strings["Registered users"] = "Utenti registrati";
-$a->strings["Pending registrations"] = "Registrazioni in attesa";
+$a->strings["Pending registrations"] = "Registrazioni da approvare";
$a->strings["Version"] = "Versione";
$a->strings["Active plugins"] = "Plugin attivi";
$a->strings["Site settings updated."] = "Impostazioni del sito aggiornate.";
+$a->strings["No special theme for mobile devices"] = "Nessun tema per dispositivi mobili";
+$a->strings["No special theme for accessibility"] = "Nessun tema speciale per l'accessibilità";
$a->strings["Closed"] = "Chiusa";
$a->strings["Requires approval"] = "Richiede l'approvazione";
$a->strings["Open"] = "Aperta";
-$a->strings["No SSL policy, links will track page SSL state"] = "";
-$a->strings["Force all links to use SSL"] = "Forza tutti i linki ad usare SSL";
-$a->strings["Self-signed certificate, use SSL for local links only (discouraged)"] = "";
+$a->strings["Private"] = "Privato";
+$a->strings["Paid Access"] = "Servizio a pagamento";
+$a->strings["Free Access"] = "Servizio gratuito";
+$a->strings["Tiered Access"] = "Accesso multilivello";
+$a->strings["Registration"] = "Registrazione";
$a->strings["File upload"] = "Caricamento file";
$a->strings["Policies"] = "Politiche";
$a->strings["Advanced"] = "Avanzate";
$a->strings["Site name"] = "Nome del sito";
-$a->strings["Banner/Logo"] = "Banner/Logo";
+$a->strings["Banner/Logo"] = "Banner o logo";
$a->strings["System language"] = "Lingua di sistema";
$a->strings["System theme"] = "Tema di sistema";
-$a->strings["Default system theme - may be over-ridden by user profiles - <a href='#' id='cnftheme'>change theme settings</a>"] = "";
-$a->strings["Mobile system theme"] = "";
-$a->strings["Theme for mobile devices"] = "";
-$a->strings["SSL link policy"] = "";
-$a->strings["Determines whether generated links should be forced to use SSL"] = "";
-$a->strings["Maximum image size"] = "Massima dimensione immagini";
+$a->strings["Default system theme - may be over-ridden by user profiles - <a href='#' id='cnftheme'>change theme settings</a>"] = "Il tema di sistema può essere cambiato dai profili dei singoli utenti - <a href='#' id='cnftheme'>Cambia le impostazioni del tema</a>";
+$a->strings["Mobile system theme"] = "Tema di sistema per dispositivi mobili";
+$a->strings["Theme for mobile devices"] = "Tema per i dispositivi mobili";
+$a->strings["Accessibility system theme"] = "Tema di sistema ad alta accessibilità";
+$a->strings["Accessibility theme"] = "Tema ad alta accessibilità";
+$a->strings["Channel to use for this website's static pages"] = "Canale da usare per le pagine statiche di questo sito";
+$a->strings["Site Channel"] = "Canale del sito";
+$a->strings["Maximum image size"] = "Dimensione massima immagini";
$a->strings["Maximum size in bytes of uploaded images. Default is 0, which means no limits."] = "Massima dimensione in byte delle immagini caricate. Il default è 0, cioè nessun limite.";
-$a->strings["Maximum image length"] = "";
-$a->strings["Maximum length in pixels of the longest side of uploaded images. Default is -1, which means no limits."] = "";
-$a->strings["JPEG image quality"] = "";
-$a->strings["Uploaded JPEGS will be saved at this quality setting [0-100]. Default is 100, which is full quality."] = "";
$a->strings["Register policy"] = "Politica di registrazione";
-$a->strings["Register text"] = "Testo registrazione";
+$a->strings["Access policy"] = "Tipo di accesso";
+$a->strings["Register text"] = "Testo diregistrazione";
$a->strings["Will be displayed prominently on the registration page."] = "Sarà mostrato ben visibile nella pagina di registrazione.";
-$a->strings["Accounts abandoned after x days"] = "Account abbandonati dopo x giorni";
-$a->strings["Will not waste system resources polling external sites for abandonded accounts. Enter 0 for no time limit."] = "Non spreca risorse di sistema controllando siti esterni per gli account abbandonati. Immettere 0 per nessun limite di tempo.";
-$a->strings["Allowed friend domains"] = "Domini amici consentiti";
-$a->strings["Comma separated list of domains which are allowed to establish friendships with this site. Wildcards are accepted. Empty to allow any domains"] = "Elenco separato da virglola dei domini che possono stabilire amicizie con questo sito. Sono accettati caratteri jolly. Lascalo vuoto per accettare qualsiasi dominio.";
+$a->strings["Accounts abandoned after x days"] = "Account abbandonati dopo X giorni";
+$a->strings["Will not waste system resources polling external sites for abandonded accounts. Enter 0 for no time limit."] = "Eviterà di sprecare risorse di sistema controllando se i siti esterni hanno account abbandonati. Immettere 0 per non imporre nessun limite di tempo.";
+$a->strings["Allowed friend domains"] = "Domini fidati e consentiti";
+$a->strings["Comma separated list of domains which are allowed to establish friendships with this site. Wildcards are accepted. Empty to allow any domains"] = "Elenco separato da virglola dei domini che possono stabilire amicizie con questo sito. Sono accettati caratteri jolly. Lascia vuoto per accettare connessioni da qualsiasi dominio.";
$a->strings["Allowed email domains"] = "Domini email consentiti";
-$a->strings["Comma separated list of domains which are allowed in email addresses for registrations to this site. Wildcards are accepted. Empty to allow any domains"] = "Elenco separato da virgola dei domini permessi come indirizzi email in fase di registrazione a questo sito. Sono accettati caratteri jolly. Lascalo vuoto per accettare qualsiasi dominio.";
+$a->strings["Comma separated list of domains which are allowed in email addresses for registrations to this site. Wildcards are accepted. Empty to allow any domains"] = "Elenco separato da virgola dei domini permessi come indirizzi email in fase di registrazione. Sono accettati caratteri jolly. Lascia vuoto per accettare qualsiasi dominio.";
$a->strings["Block public"] = "Blocca pagine pubbliche";
-$a->strings["Check to block public access to all otherwise public personal pages on this site unless you are currently logged in."] = "Seleziona per bloccare l'accesso pubblico a tutte le pagine personali di questo sito, a meno di essere loggato.";
-$a->strings["Force publish"] = "Forza publicazione";
-$a->strings["Check to force all profiles on this site to be listed in the site directory."] = "Seleziona per forzare tutti i profili di questo sito ad essere compresi nell'elenco di questo sito.";
-$a->strings["Global directory update URL"] = "URL aggiornamento Elenco Globale";
-$a->strings["URL to update the global directory. If this is not set, the global directory is completely unavailable to the application."] = "URL dell'elenco globale. Se vuoto, l'elenco globale sarà completamente disabilitato.";
-$a->strings["Allow threaded items"] = "";
-$a->strings["Allow infinite level threading for items on this site."] = "";
-$a->strings["Private posts by default for new users"] = "";
-$a->strings["Set default post permissions for all new members to the default privacy group rather than public."] = "";
-$a->strings["Block multiple registrations"] = "Blocca registrazioni multiple";
-$a->strings["Disallow users to register additional accounts for use as pages."] = "Non permette all'utente di registrare account extra da usare come pagine.";
-$a->strings["OpenID support"] = "Supporto OpenID";
-$a->strings["OpenID support for registration and logins."] = "Supporta OpenID per la registrazione e il login";
-$a->strings["Fullname check"] = "Controllo nome completo";
-$a->strings["Force users to register with a space between firstname and lastname in Full name, as an antispam measure"] = "Forza gli utenti a registrarsi con uno spazio tra il nome e il cognome in \"Nome completo\", come misura antispam";
-$a->strings["UTF-8 Regular expressions"] = "Espressioni regolari UTF-8";
-$a->strings["Use PHP UTF8 regular expressions"] = "Usa le espressioni regolari PHP in UTF8";
-$a->strings["Show Community Page"] = "Mostra pagina Comunità";
-$a->strings["Display a Community page showing all recent public postings on this site."] = "Mostra una pagina Comunità con tutti i recenti messaggi pubblici su questo sito.";
-$a->strings["Enable OStatus support"] = "Abilita supporto OStatus";
-$a->strings["Provide built-in OStatus (identi.ca, status.net, etc.) compatibility. All communications in OStatus are public, so privacy warnings will be occasionally displayed."] = "Fornisce compatibiltà OStatuts (identi.ca, status.net, etc.). Tutte le comunicazioni in OStatus sono pubbliche, per cui avvisi di provacy verranno occasionalmente mostrati.";
-$a->strings["Enable Diaspora support"] = "Abilita il supporto a Diaspora";
-$a->strings["Provide built-in Diaspora network compatibility."] = "Fornisce compatibilità con il network Diaspora.";
-$a->strings["Only allow Friendica contacts"] = "Permetti solo contatti Friendica";
-$a->strings["All contacts must use Friendica protocols. All other built-in communication protocols disabled."] = "Tutti i contatti devono usare il protocollo di Friendica. Tutti gli altri protocolli sono disabilitati.";
-$a->strings["Verify SSL"] = "Verifica SSL";
-$a->strings["If you wish, you can turn on strict certificate checking. This will mean you cannot connect (at all) to self-signed SSL sites."] = "Se vuoi, puoi abilitare il controllo rigoroso dei certificati.Questo significa che non potrai collegarti (del tutto) con siti con certificati SSL auto-firmati.";
-$a->strings["Proxy user"] = "Utente Proxy";
-$a->strings["Proxy URL"] = "URL Proxy";
+$a->strings["Check to block public access to all otherwise public personal pages on this site unless you are currently logged in."] = "Seleziona per impedire di vedere le pagine personali di questo sito a chi non ha effettuato l'accesso.";
+$a->strings["Force publish"] = "Forza la publicazione del profilo";
+$a->strings["Check to force all profiles on this site to be listed in the site directory."] = "Seleziona per mostrare nell'elenco dei canali del sito <strong>tutti</strong> i profili registrati.";
+$a->strings["No login on Homepage"] = "Non mostrare il login sulla homepage";
+$a->strings["Check to hide the login form from your sites homepage when visitors arrive who are not logged in (e.g. when you put the content of the homepage in via the site channel)."] = "Per nascondere la possibilità di fare login ai visitatori (per esempio, quando il contenuto della homepage del sito è alimentato dal canale).";
+$a->strings["Proxy user"] = "Utente proxy";
+$a->strings["Proxy URL"] = "URL proxy";
$a->strings["Network timeout"] = "Timeout rete";
-$a->strings["Value is in seconds. Set to 0 for unlimited (not recommended)."] = "Valore in secondi. Imposta a 0 per illimitato (non raccomandato).";
-$a->strings["Delivery interval"] = "";
-$a->strings["Delay background delivery processes by this many seconds to reduce system load. Recommend: 4-5 for shared hosts, 2-3 for virtual private servers. 0-1 for large dedicated servers."] = "";
-$a->strings["Poll interval"] = "";
-$a->strings["Delay background polling processes by this many seconds to reduce system load. If 0, use delivery interval."] = "";
-$a->strings["Maximum Load Average"] = "";
-$a->strings["Maximum system load before delivery and poll processes are deferred - default 50."] = "";
-$a->strings["Update has been marked successful"] = "";
-$a->strings["Executing %s failed. Check system logs."] = "";
-$a->strings["Update %s was successfully applied."] = "";
-$a->strings["Update %s did not return a status. Unknown if it succeeded."] = "";
-$a->strings["Update function %s could not be found."] = "";
-$a->strings["No failed updates."] = "";
-$a->strings["Failed Updates"] = "";
-$a->strings["This does not include updates prior to 1139, which did not return a status."] = "";
-$a->strings["Mark success (if update was manually applied)"] = "";
-$a->strings["Attempt to execute this update step automatically"] = "";
+$a->strings["Value is in seconds. Set to 0 for unlimited (not recommended)."] = "Valore in secondi. Imposta a 0 per illimitato (sconsigliato).";
+$a->strings["Delivery interval"] = "Recapito ritardato";
+$a->strings["Delay background delivery processes by this many seconds to reduce system load. Recommend: 4-5 for shared hosts, 2-3 for virtual private servers. 0-1 for large dedicated servers."] = "RItarda il processo di recapito di questo numero di secondi per ridurre il carico di sistema. Consigliati: 4-5 secondi per hosting condiviso, 2-3 per i VPS, 0-1 per grandi server dedicati.";
+$a->strings["Poll interval"] = "Intervallo di polling";
+$a->strings["Delay background polling processes by this many seconds to reduce system load. If 0, use delivery interval."] = "Ritarda i processi di polling in background di questo numero di secondi per ridurre il carico del sistema. Se 0, verrà usato lo stesso valore del 'Recapito ritardato'.";
+$a->strings["Maximum Load Average"] = "Carico massimo medio";
+$a->strings["Maximum system load before delivery and poll processes are deferred - default 50."] = "Carico di sistema massimo perché i processi di recapito e polling siano ritardati - il valore predefinito è 50.";
+$a->strings["No server found"] = "Server non trovato";
+$a->strings["ID"] = "ID";
+$a->strings["for channel"] = "per canale";
+$a->strings["on server"] = "sul server";
+$a->strings["Status"] = "Stato";
+$a->strings["Update has been marked successful"] = "L'aggiornamento è stato marcato come eseguito.";
+$a->strings["Executing %s failed. Check system logs."] = "Fallita l'esecuzione di %s. Maggiori informazioni sui log di sistema.";
+$a->strings["Update %s was successfully applied."] = "L'aggiornamento %s è terminato correttamente.";
+$a->strings["Update %s did not return a status. Unknown if it succeeded."] = "L'aggiornamento %s non ha dato risposta. Impossibile determinare se è terminato correttamente.";
+$a->strings["Update function %s could not be found."] = "Impossibile trovare la funzione di aggiornamento %s";
+$a->strings["No failed updates."] = "Nessun aggiornamento fallito.";
+$a->strings["Failed Updates"] = "Aggiornamenti falliti.";
+$a->strings["Mark success (if update was manually applied)"] = "Marca come eseguito (se applicato manualmente).";
+$a->strings["Attempt to execute this update step automatically"] = "Tenta di eseguire in automatico questo passaggio dell'aggiornamento.";
$a->strings["%s user blocked/unblocked"] = array(
- 0 => "",
- 1 => "",
+ 0 => "%s utente bloccato/sbloccato",
+ 1 => "%s utenti bloccati/sbloccati",
);
$a->strings["%s user deleted"] = array(
0 => "%s utente cancellato",
1 => "%s utenti cancellati",
);
-$a->strings["User '%s' deleted"] = "Utente '%s' cancellato";
+$a->strings["Account not found"] = "Account non trovato";
+$a->strings["User '%s' deleted"] = "Utente '%s' eliminato";
$a->strings["User '%s' unblocked"] = "Utente '%s' sbloccato";
$a->strings["User '%s' blocked"] = "Utente '%s' bloccato";
$a->strings["select all"] = "seleziona tutti";
$a->strings["User registrations waiting for confirm"] = "Richieste di registrazione in attesa di conferma";
$a->strings["Request date"] = "Data richiesta";
-$a->strings["Email"] = "Email";
+$a->strings["Name"] = "Nome";
$a->strings["No registrations."] = "Nessuna registrazione.";
+$a->strings["Approve"] = "Approva";
$a->strings["Deny"] = "Nega";
-$a->strings["Site admin"] = "";
$a->strings["Register date"] = "Data registrazione";
$a->strings["Last login"] = "Ultimo accesso";
-$a->strings["Last item"] = "Ultimo elemento";
-$a->strings["Account"] = "Account";
-$a->strings["Selected users will be deleted!\\n\\nEverything these users had posted on this site will be permanently deleted!\\n\\nAre you sure?"] = "Gli utenti selezionati saranno cancellati!\\n\\nTutto quello che gli utenti hanno inviato su questo sito sarà permanentemente canellato!\\n\\nSei sicuro?";
-$a->strings["The user {0} will be deleted!\\n\\nEverything this user has posted on this site will be permanently deleted!\\n\\nAre you sure?"] = "L'utente {0} sarà cancellato!\\n\\nTutto quello che ha inviato su questo sito sarà permanentemente canellato!\\n\\nSei sicuro?";
-$a->strings["Plugin %s disabled."] = "Plugin %s disabilitato.";
-$a->strings["Plugin %s enabled."] = "Plugin %s abilitato.";
-$a->strings["Disable"] = "Disabilita";
-$a->strings["Enable"] = "Abilita";
-$a->strings["Toggle"] = "Inverti";
-$a->strings["Author: "] = "Autore: ";
-$a->strings["Maintainer: "] = "Manutentore: ";
+$a->strings["Expires"] = "Scadenza";
+$a->strings["Service Class"] = "Service Class";
+$a->strings["Selected users will be deleted!\\n\\nEverything these users had posted on this site will be permanently deleted!\\n\\nAre you sure?"] = "Gli utenti selezionati saranno eliminati!\\n\\nTutto quello che gli utenti hanno pubblicato su questo sito sarà permanentemente eliminato!\\n\\nConfermi?";
+$a->strings["The user {0} will be deleted!\\n\\nEverything this user has posted on this site will be permanently deleted!\\n\\nAre you sure?"] = "L'utente {0} sarà eliminato!\\n\\nTutto quello che ha pubblicato su questo sito sarà permanentemente eliminato!\\n\\nConfermi?";
+$a->strings["Plugin %s disabled."] = "Plugin %s non attivo.";
+$a->strings["Plugin %s enabled."] = "Plugin %s attivo.";
+$a->strings["Disable"] = "Disattiva";
+$a->strings["Enable"] = "Attiva";
+$a->strings["Toggle"] = "Attiva/disattiva";
+$a->strings["Author: "] = "Autore:";
+$a->strings["Maintainer: "] = "Gestore:";
$a->strings["No themes found."] = "Nessun tema trovato.";
-$a->strings["Screenshot"] = "";
+$a->strings["Screenshot"] = "Istantanea dello schermo";
$a->strings["[Experimental]"] = "[Sperimentale]";
$a->strings["[Unsupported]"] = "[Non supportato]";
-$a->strings["Log settings updated."] = "Impostazioni Log aggiornate.";
+$a->strings["Log settings updated."] = "Impostazioni di log aggiornate.";
$a->strings["Clear"] = "Pulisci";
$a->strings["Debugging"] = "Debugging";
-$a->strings["Log file"] = "File di Log";
-$a->strings["Must be writable by web server. Relative to your Friendica top-level directory."] = "Deve essere scrivibile dal server web. Relativo alla tua directory Friendica.";
-$a->strings["Log level"] = "Livello di Log";
-$a->strings["Close"] = "Chiudi";
-$a->strings["FTP Host"] = "Indirizzo FTP";
-$a->strings["FTP Path"] = "Percorso FTP";
-$a->strings["FTP User"] = "Utente FTP";
-$a->strings["FTP Password"] = "Pasword FTP";
-$a->strings["Requested profile is not available."] = "Profilo richiesto non disponibile.";
-$a->strings["Access to this profile has been restricted."] = "L'accesso a questo profilo è stato limitato.";
-$a->strings["Tips for New Members"] = "Consigli per i Nuovi Utenti";
-$a->strings["{0} wants to be your friend"] = "{0} vuole essere tuo amico";
-$a->strings["{0} sent you a message"] = "{0} ti ha inviato un messaggio";
-$a->strings["{0} requested registration"] = "{0} chiede la registrazione";
-$a->strings["{0} commented %s's post"] = "{0} ha commentato il post di %s";
-$a->strings["{0} liked %s's post"] = "a {0} piace il post di %s";
-$a->strings["{0} disliked %s's post"] = "a {0} non piace il post di %s";
-$a->strings["{0} is now friends with %s"] = "{0} ora è amico di %s";
-$a->strings["{0} posted"] = "{0} ha inviato un nuovo messaggio";
-$a->strings["{0} tagged %s's post with #%s"] = "{0} ha taggato il post di %s con #%s";
-$a->strings["{0} mentioned you in a post"] = "{0} ti ha citato in un post";
-$a->strings["Contacts who are not members of a group"] = "";
-$a->strings["OpenID protocol error. No ID returned."] = "";
-$a->strings["Account not found and OpenID registration is not permitted on this site."] = "";
-$a->strings["Login failed."] = "Accesso fallito.";
-$a->strings["Contact added"] = "";
-$a->strings["Common Friends"] = "Amici in comune";
-$a->strings["No contacts in common."] = "";
-$a->strings["link"] = "";
-$a->strings["Item has been removed."] = "L'oggetto è stato rimosso.";
-$a->strings["Applications"] = "Applicazioni";
-$a->strings["No installed applications."] = "Nessuna applicazione installata.";
-$a->strings["Search"] = "Cerca";
+$a->strings["Log file"] = "File di log";
+$a->strings["Must be writable by web server. Relative to your Red top-level directory."] = "Deve essere scrivibile dal web server. È relativa alla cartella dove è installato Red.";
+$a->strings["Log level"] = "Livello di log";
+$a->strings["Menu not found."] = "Menù non trovato.";
+$a->strings["Menu element updated."] = "L'elemento del menù è stato aggiornato.";
+$a->strings["Unable to update menu element."] = "Non è possibile aggiornare l'elemento del menù.";
+$a->strings["Menu element added."] = "Elemento aggiunto al menù.";
+$a->strings["Unable to add menu element."] = "Impossibile aggiungere l'elemento al menù.";
+$a->strings["Not found."] = "Non trovato.";
+$a->strings["Manage Menu Elements"] = "Gestione elementi del menù";
+$a->strings["Edit menu"] = "Modifica il menù";
+$a->strings["Edit element"] = "Modifica l'elemento";
+$a->strings["Drop element"] = "Elimina l'elemento";
+$a->strings["New element"] = "Nuovo elemento";
+$a->strings["Edit this menu container"] = "Modifica il contenitore del menù";
+$a->strings["Add menu element"] = "Aggiungi un elemento al menù";
+$a->strings["Delete this menu item"] = "Elimina questo elemento del menù";
+$a->strings["Edit this menu item"] = "Modifica questo elemento del menù";
+$a->strings["New Menu Element"] = "Nuovo elemento del menù";
+$a->strings["Menu Item Permissions"] = "Permessi del menu";
+$a->strings["(click to open/close)"] = "(clicca per aprire/chiudere)";
+$a->strings["Link text"] = "Testo del link";
+$a->strings["URL of link"] = "Indirizzo del link";
+$a->strings["Use Red magic-auth if available"] = "Usa l'autenticazione magica di Red, se disponibile";
+$a->strings["Open link in new window"] = "Apri il link in una nuova finestra";
+$a->strings["Order in list"] = "Ordine dell'elenco";
+$a->strings["Higher numbers will sink to bottom of listing"] = "I numeri più alti andranno in fondo all'elenco";
+$a->strings["Create"] = "Crea";
+$a->strings["Menu item not found."] = "L'elemento del menù non è stato trovato.";
+$a->strings["Menu item deleted."] = "L'elemento del menù è stato eliminato.";
+$a->strings["Menu item could not be deleted."] = "L'elemento del menù non può essere eliminato.";
+$a->strings["Edit Menu Element"] = "Modifica l'elemento del menù";
+$a->strings["Modify"] = "Modifica";
+$a->strings["Collection created."] = "L'insieme di canali è stato creato.";
+$a->strings["Could not create collection."] = "Impossibile creare l'insieme.";
+$a->strings["Collection updated."] = "Insieme aggiornato.";
+$a->strings["Create a collection of channels."] = "Crea un insieme di canali.";
+$a->strings["Collection Name: "] = "Nome del'insieme:";
+$a->strings["Members are visible to other channels"] = "I membri saranno visibili agli altri canali";
+$a->strings["Collection removed."] = "Insieme rimosso.";
+$a->strings["Unable to remove collection."] = "Impossibile rimuovere l'insieme.";
+$a->strings["Collection Editor"] = "Modifica l'insieme";
+$a->strings["Members"] = "Membri";
+$a->strings["All Connected Channels"] = "Tutti i canali connessi";
+$a->strings["Click on a channel to add or remove."] = "Clicca su un canale per aggiungerlo o rimuoverlo.";
+$a->strings["Page owner information could not be retrieved."] = "Impossibile ottenere informazioni sul proprietario della pagina.";
+$a->strings["Album not found."] = "Album non trovato.";
+$a->strings["Delete Album"] = "Elimina album";
+$a->strings["Delete Photo"] = "Elimina foto";
+$a->strings["%1\$s was tagged in %2\$s by %3\$s"] = "%3\$s ha taggato %1\$s in %2\$s";
+$a->strings["a photo"] = "una foto";
+$a->strings["No photos selected"] = "Nessuna foto selezionata";
+$a->strings["Access to this item is restricted."] = "Questo elemento non è visibile a tutti.";
+$a->strings["You have used %1$.2f Mbytes of %2$.2f Mbytes photo storage."] = "Hai usato %1$.2f Mb di %2$.2f Mb disponibili per le foto.";
+$a->strings["You have used %1$.2f Mbytes of photo storage."] = "Hai usato %1$.2f Mb di spazio per le foto.";
+$a->strings["Upload Photos"] = "Carica foto";
+$a->strings["New album name: "] = "Nome del nuovo album: ";
+$a->strings["or existing album name: "] = "o nome di un album esistente: ";
+$a->strings["Do not show a status post for this upload"] = "Non creare un messaggio di stato per questo caricamento";
+$a->strings["Permissions"] = "Permessi";
+$a->strings["Contact Photos"] = "Foto dei contatti";
+$a->strings["Edit Album"] = "Modifica album";
+$a->strings["Show Newest First"] = "Prima i più recenti";
+$a->strings["Show Oldest First"] = "Prima i più vecchi";
+$a->strings["View Photo"] = "Guarda la foto";
+$a->strings["Permission denied. Access to this item may be restricted."] = "Permesso negato. L'accesso a questo elemento può essere stato limitato.";
+$a->strings["Photo not available"] = "Foto non disponibile";
+$a->strings["Use as profile photo"] = "Usa come foto del profilo";
+$a->strings["View Full Size"] = "Vedi nelle dimensioni originali";
+$a->strings["Edit photo"] = "Modifica la foto";
+$a->strings["Rotate CW (right)"] = "Ruota (senso orario)";
+$a->strings["Rotate CCW (left)"] = "Ruota (senso antiorario)";
+$a->strings["New album name"] = "Nuovo nome dell'album";
+$a->strings["Caption"] = "Titolo";
+$a->strings["Add a Tag"] = "Aggiungi tag";
+$a->strings["Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"] = "Per esempio: @luca, @Maria_Bianchi, @bob@example.com, #California, #camping";
+$a->strings["View Album"] = "Guarda l'album";
+$a->strings["Recent Photos"] = "Foto recenti";
+$a->strings["- select -"] = "- scegli -";
+$a->strings["Menu updated."] = "Menù aggiornato.";
+$a->strings["Unable to update menu."] = "Impossibile aggiornare il menù.";
+$a->strings["Menu created."] = "Menù creato.";
+$a->strings["Unable to create menu."] = "Impossibile creare il menù.";
+$a->strings["Manage Menus"] = "Gestione menù";
+$a->strings["Drop"] = "Elimina";
+$a->strings["Create a new menu"] = "Crea un nuovo menù";
+$a->strings["Delete this menu"] = "Elimina questo menù";
+$a->strings["Edit menu contents"] = "Modifica i contenuti del menù";
+$a->strings["Edit this menu"] = "Modifica questo menù";
+$a->strings["New Menu"] = "Nuovo menù";
+$a->strings["Menu name"] = "Nome del menù";
+$a->strings["Must be unique, only seen by you"] = "Deve essere unico, lo vedrai solo tu";
+$a->strings["Menu title"] = "Titolo del menù";
+$a->strings["Menu title as seen by others"] = "Titolo del menù come comparirà a tutti";
+$a->strings["Menu deleted."] = "Menù eliminato.";
+$a->strings["Menu could not be deleted."] = "Il menù non può essere eliminato.";
+$a->strings["Edit Menu"] = "Modifica menù";
+$a->strings["Add or remove entries to this menu"] = "Aggiungi o rimuovi elementi di questo menù";
+$a->strings["Welcome to %s"] = "%s ti dà il benvenuto";
+$a->strings["Age: "] = "Età:";
+$a->strings["Gender: "] = "Sesso:";
+$a->strings["Finding:"] = "Ricerca:";
+$a->strings["next page"] = "pagina succ.";
+$a->strings["previous page"] = "pagina prec.";
+$a->strings["No entries (some entries may be hidden)."] = "Nessun risultato (qualcosa potrebbe essere nascosto).";
+$a->strings["Blocked"] = "Bloccati";
+$a->strings["Ignored"] = "Ignorati";
+$a->strings["Hidden"] = "Nascosti";
+$a->strings["Archived"] = "Archiviati";
+$a->strings["All"] = "Tutti";
+$a->strings["Suggest new connections"] = "Suggerisci nuovi contatti";
+$a->strings["Show pending (new) connections"] = "Richieste di contatto in attesa";
+$a->strings["All Connections"] = "Tutti i contatti";
+$a->strings["Show all connections"] = "Mostra tutti i contatti";
+$a->strings["Unblocked"] = "Non bloccati";
+$a->strings["Only show unblocked connections"] = "Mostra solo i contatti non bloccati";
+$a->strings["Only show blocked connections"] = "Mostra solo i contatti bloccati";
+$a->strings["Only show ignored connections"] = "Mostra solo i contatti ignorati";
+$a->strings["Only show archived connections"] = "Mostra solo i contatti archiviati";
+$a->strings["Only show hidden connections"] = "Mostra solo i contatti nascosti";
+$a->strings["%1\$s [%2\$s]"] = "%1\$s [%2\$s]";
+$a->strings["Edit contact"] = "Modifica il contatto";
+$a->strings["Search your connections"] = "Cerca tra i contatti";
+$a->strings["Finding: "] = "Ricerca: ";
+$a->strings["Layout Help"] = "Guida al layout";
+$a->strings["Help with this feature"] = "La guida per questa funzionalità";
+$a->strings["Layout Name"] = "Nome layout";
+$a->strings["Help:"] = "Guida:";
+$a->strings["Not Found"] = "Non disponibile";
+$a->strings["Remote Authentication"] = "Autenticazione a distanza";
+$a->strings["Enter your channel address (e.g. channel@example.com)"] = "Inserisci l'indirizzo del tuo canale (ad esempio lucia@esempio.com)";
+$a->strings["Authenticate"] = "Autenticazione";
+$a->strings["No such group"] = "Impossibile trovare l'insieme";
+$a->strings["Search Results For:"] = "Cerca risultati con:";
+$a->strings["Collection is empty"] = "L'insieme di canali è vuoto";
+$a->strings["Collection: "] = "Insieme:";
+$a->strings["Connection: "] = "Connessione:";
+$a->strings["Invalid connection."] = "Connessione non valida.";
+$a->strings["Channel added."] = "Canale aggiunto.";
+$a->strings["Remote authentication blocked. You are logged into this site locally. Please logout and retry."] = "L'autenticazione remota non è disponibile. Hai accesso solamente a questo sito. Puoi provare ad uscire per tentare di nuovo.";
+$a->strings["Welcome %s. Remote authentication successful."] = "Ciao %s. La tua autenticazione da remoto è avvenuta con successo.";
+$a->strings["This site is not a directory server"] = "Questo sito non fornisce l'elenco generale dei canali";
+$a->strings["Remote privacy information not available."] = "Le informazioni remote sulla privacy non sono disponibili.";
+$a->strings["Visible to:"] = "Visibile a:";
+$a->strings["Hub not found."] = "Server non trovato.";
$a->strings["Profile not found."] = "Profilo non trovato.";
-$a->strings["Profile Name is required."] = "Il nome profilo è obbligatorio .";
-$a->strings["Marital Status"] = "";
-$a->strings["Romantic Partner"] = "";
-$a->strings["Likes"] = "";
-$a->strings["Dislikes"] = "";
-$a->strings["Work/Employment"] = "";
+$a->strings["Profile deleted."] = "Profilo eliminato.";
+$a->strings["Profile-"] = "Profilo-";
+$a->strings["New profile created."] = "Il nuovo profilo è stato creato.";
+$a->strings["Profile unavailable to clone."] = "Impossibile duplicare il profilo.";
+$a->strings["Profile Name is required."] = "Il nome del profilo è obbligatorio .";
+$a->strings["Marital Status"] = "Stato sentimentale";
+$a->strings["Romantic Partner"] = "Partner affettivo";
+$a->strings["Likes"] = "Cosa gli piace";
+$a->strings["Dislikes"] = "Cosa non gli piace";
+$a->strings["Work/Employment"] = "Lavoro/impiego";
$a->strings["Religion"] = "Religione";
-$a->strings["Political Views"] = "Orientamento Politico";
+$a->strings["Political Views"] = "Orientamento politico";
$a->strings["Gender"] = "Sesso";
-$a->strings["Sexual Preference"] = "Preferenza sessuale";
-$a->strings["Homepage"] = "Homepage";
+$a->strings["Sexual Preference"] = "Preferenze sessuali";
+$a->strings["Homepage"] = "Home page";
$a->strings["Interests"] = "Interessi";
-$a->strings["Address"] = "";
-$a->strings["Location"] = "Posizione";
+$a->strings["Address"] = "Indirizzo";
+$a->strings["Location"] = "Luogo attuale";
$a->strings["Profile updated."] = "Profilo aggiornato.";
-$a->strings[" and "] = "";
-$a->strings["public profile"] = "profilo pubblico";
-$a->strings["%1\$s changed %2\$s to &ldquo;%3\$s&rdquo;"] = "";
-$a->strings[" - Visit %1\$s's %2\$s"] = "";
-$a->strings["%1\$s has an updated %2\$s, changing %3\$s."] = "%1\$s ha un %2\$s aggiornato. Ha cambiato %3\$s";
-$a->strings["Profile deleted."] = "Profilo elminato.";
-$a->strings["Profile-"] = "Profilo-";
-$a->strings["New profile created."] = "Il nuovo profilo è stato creato.";
-$a->strings["Profile unavailable to clone."] = "Impossibile duplicare il profilo.";
$a->strings["Hide your contact/friend list from viewers of this profile?"] = "Nascondi la tua lista di contatti/amici ai visitatori di questo profilo?";
$a->strings["Edit Profile Details"] = "Modifica i dettagli del profilo";
-$a->strings["View this profile"] = "Visualizza questo profilo";
+$a->strings["View this profile"] = "Guarda questo profilo";
+$a->strings["Change Profile Photo"] = "Cambia la foto del profilo";
$a->strings["Create a new profile using these settings"] = "Crea un nuovo profilo usando queste impostazioni";
$a->strings["Clone this profile"] = "Clona questo profilo";
$a->strings["Delete this profile"] = "Elimina questo profilo";
$a->strings["Profile Name:"] = "Nome del profilo:";
$a->strings["Your Full Name:"] = "Il tuo nome completo:";
-$a->strings["Title/Description:"] = "Breve descrizione (es. titolo, posizione, altro):";
-$a->strings["Your Gender:"] = "Il tuo sesso:";
-$a->strings["Birthday (%s):"] = "Compleanno (%s)";
+$a->strings["Title/Description:"] = "Titolo/descrizione:";
+$a->strings["Your Gender:"] = "Sesso:";
+$a->strings["Birthday (%s):"] = "Compleanno (%s):";
$a->strings["Street Address:"] = "Indirizzo (via/piazza):";
$a->strings["Locality/City:"] = "Località:";
$a->strings["Postal/Zip Code:"] = "CAP:";
$a->strings["Country:"] = "Nazione:";
-$a->strings["Region/State:"] = "Regione/Stato:";
+$a->strings["Region/State:"] = "Regione/stato:";
$a->strings["<span class=\"heart\">&hearts;</span> Marital Status:"] = "<span class=\"heart\">&hearts;</span> Stato sentimentale:";
$a->strings["Who: (if applicable)"] = "Con chi: (se possibile)";
-$a->strings["Examples: cathy123, Cathy Williams, cathy@example.com"] = "Esempio: cathy123, Cathy Williams, cathy@example.com";
-$a->strings["Since [date]:"] = "";
-$a->strings["Sexual Preference:"] = "Preferenze sessuali:";
-$a->strings["Homepage URL:"] = "Homepage:";
-$a->strings["Hometown:"] = "";
-$a->strings["Political Views:"] = "Orientamento politico:";
+$a->strings["Examples: cathy123, Cathy Williams, cathy@example.com"] = "Per esempio: cathy123, Cathy Williams, cathy@example.com";
+$a->strings["Since [date]:"] = "dal [data]:";
+$a->strings["Homepage URL:"] = "Indirizzo home page:";
$a->strings["Religious Views:"] = "Orientamento religioso:";
-$a->strings["Public Keywords:"] = "Parole chiave visibili a tutti:";
-$a->strings["Private Keywords:"] = "Parole chiave private:";
-$a->strings["Likes:"] = "";
-$a->strings["Dislikes:"] = "";
-$a->strings["Example: fishing photography software"] = "Esempio: pesca fotografia programmazione";
-$a->strings["(Used for suggesting potential friends, can be seen by others)"] = "(E' utilizzato per suggerire potenziali amici, può essere visto da altri)";
-$a->strings["(Used for searching profiles, never shown to others)"] = "(Usato per cercare tra i profili, non è mai visibile agli altri)";
+$a->strings["Keywords:"] = "Parole chiave, tag:";
+$a->strings["Example: fishing photography software"] = "Per esempio: pesca fotografia programmazione";
+$a->strings["Used in directory listings"] = "Visibile nell'elenco pubblico di canali";
$a->strings["Tell us about yourself..."] = "Raccontaci di te...";
$a->strings["Hobbies/Interests"] = "Hobby/interessi";
-$a->strings["Contact information and Social Networks"] = "Informazioni su contatti e social network";
+$a->strings["Contact information and Social Networks"] = "Contatti personali e i tuoi social network";
+$a->strings["My other channels"] = "I miei altri canali";
$a->strings["Musical interests"] = "Interessi musicali";
$a->strings["Books, literature"] = "Libri, letteratura";
$a->strings["Television"] = "Televisione";
@@ -986,1021 +1322,365 @@ $a->strings["Love/romance"] = "Amore";
$a->strings["Work/employment"] = "Lavoro/impiego";
$a->strings["School/education"] = "Scuola/educazione";
$a->strings["This is your <strong>public</strong> profile.<br />It <strong>may</strong> be visible to anybody using the internet."] = "Questo è il tuo profilo <strong>publico</strong>.<br /><strong>Potrebbe</strong> essere visto da chiunque attraverso internet.";
-$a->strings["Age: "] = "Età : ";
-$a->strings["Edit/Manage Profiles"] = "Modifica / Gestisci profili";
-$a->strings["Change profile photo"] = "Cambia la foto del profilo";
-$a->strings["Create New Profile"] = "Crea un nuovo profilo";
-$a->strings["Profile Image"] = "Immagine del Profilo";
-$a->strings["visible to everybody"] = "visibile a tutti";
-$a->strings["Edit visibility"] = "Modifica visibilità";
-$a->strings["Save to Folder:"] = "";
-$a->strings["- select -"] = "";
-$a->strings["%1\$s tagged %2\$s's %3\$s with %4\$s"] = "%1\$s ha taggato %3\$s di %2\$s con %4\$s";
-$a->strings["No potential page delegates located."] = "Nessun potenziale delegato per la pagina è stato trovato.";
-$a->strings["Delegate Page Management"] = "Gestione delegati per la pagina";
-$a->strings["Delegates are able to manage all aspects of this account/page except for basic account settings. Please do not delegate your personal account to anybody that you do not trust completely."] = "I Delegati sono in grando di gestire tutti gli aspetti di questa pagina, tranne per i settaggi di base dell'account. Non delegare il tuo account personale a nessuno di cui non ti fidi ciecamente.";
-$a->strings["Existing Page Managers"] = "Gestori Pagina Esistenti";
-$a->strings["Existing Page Delegates"] = "Delegati Pagina Esistenti";
-$a->strings["Potential Delegates"] = "Delegati Potenziali";
-$a->strings["Add"] = "Aggiungi";
-$a->strings["No entries."] = "Nessun articolo.";
-$a->strings["Source (bbcode) text:"] = "";
-$a->strings["Source (Diaspora) text to convert to BBcode:"] = "";
-$a->strings["Source input: "] = "";
-$a->strings["bb2html: "] = "";
-$a->strings["bb2html2bb: "] = "";
-$a->strings["bb2md: "] = "";
-$a->strings["bb2md2html: "] = "";
-$a->strings["bb2dia2bb: "] = "";
-$a->strings["bb2md2html2bb: "] = "";
-$a->strings["Source input (Diaspora format): "] = "";
-$a->strings["diaspora2bb: "] = "";
-$a->strings["Friend Suggestions"] = "Contatti suggeriti";
-$a->strings["No suggestions available. If this is a new site, please try again in 24 hours."] = "Nessun suggerimento disponibile. Se questo è un sito nuovo, riprova tra 24 ore.";
-$a->strings["Ignore/Hide"] = "Ignora / Nascondi";
-$a->strings["Global Directory"] = "Elenco globale";
-$a->strings["Find on this site"] = "Cerca nel sito";
-$a->strings["Site Directory"] = "Elenco del sito";
-$a->strings["Gender: "] = "Genere:";
-$a->strings["Gender:"] = "Genere:";
-$a->strings["Status:"] = "Stato:";
-$a->strings["Homepage:"] = "Homepage:";
-$a->strings["About:"] = "Informazioni:";
-$a->strings["No entries (some entries may be hidden)."] = "Nessuna voce (qualche voce potrebbe essere nascosta).";
-$a->strings["%s : Not a valid email address."] = "%s: non è un indirizzo email valido.";
-$a->strings["Please join us on Friendica"] = "";
-$a->strings["%s : Message delivery failed."] = "%s: la consegna del messaggio fallita.";
-$a->strings["%d message sent."] = array(
- 0 => "%d messaggio inviato.",
- 1 => "%d messaggi inviati.",
-);
-$a->strings["You have no more invitations available"] = "Non hai altri inviti disponibili";
-$a->strings["Visit %s for a list of public sites that you can join. Friendica members on other sites can all connect with each other, as well as with members of many other social networks."] = "";
-$a->strings["To accept this invitation, please visit and register at %s or any other public Friendica website."] = "";
-$a->strings["Friendica sites all inter-connect to create a huge privacy-enhanced social web that is owned and controlled by its members. They can also connect with many traditional social networks. See %s for a list of alternate Friendica sites you can join."] = "";
-$a->strings["Our apologies. This system is not currently configured to connect with other public sites or invite members."] = "";
-$a->strings["Send invitations"] = "Invia inviti";
-$a->strings["Enter email addresses, one per line:"] = "Inserisci gli indirizzi email, uno per riga:";
-$a->strings["You are cordially invited to join me and other close friends on Friendica - and help us to create a better social web."] = "";
-$a->strings["You will need to supply this invitation code: \$invite_code"] = "Sarà necessario fornire questo codice invito: \$invite_code";
-$a->strings["Once you have registered, please connect with me via my profile page at:"] = "Una volta registrato, connettiti con me dal mio profilo:";
-$a->strings["For more information about the Friendica project and why we feel it is important, please visit http://friendica.com"] = "";
-$a->strings["This may occasionally happen if contact was requested by both persons and it has already been approved."] = "";
-$a->strings["Response from remote site was not understood."] = "Errore di comunicazione con l'altro sito.";
-$a->strings["Unexpected response from remote site: "] = "La risposta dell'altro sito non può essere gestita: ";
-$a->strings["Confirmation completed successfully."] = "Conferma completata con successo.";
-$a->strings["Remote site reported: "] = "Il sito remoto riporta: ";
-$a->strings["Temporary failure. Please wait and try again."] = "Problema temporaneo. Attendi e riprova.";
-$a->strings["Introduction failed or was revoked."] = "La presentazione ha generato un errore o è stata revocata.";
-$a->strings["Unable to set contact photo."] = "Impossibile impostare la foto del contatto.";
-$a->strings["%1\$s is now friends with %2\$s"] = "%1\$s e %2\$s adesso sono amici";
-$a->strings["No user record found for '%s' "] = "Nessun utente trovato '%s'";
-$a->strings["Our site encryption key is apparently messed up."] = "La nostra chiave di criptazione del sito sembra essere corrotta.";
-$a->strings["Empty site URL was provided or URL could not be decrypted by us."] = "E' stato fornito un indirizzo vuoto o non possiamo decrittare l'indirizzo.";
-$a->strings["Contact record was not found for you on our site."] = "Il contatto non è stato trovato sul nostro sito.";
-$a->strings["Site public key not available in contact record for URL %s."] = "La chiave pubblica del sito non è disponibile per l'URL %s";
-$a->strings["The ID provided by your system is a duplicate on our system. It should work if you try again."] = "L'ID fornito dal tuo sistema è duplicato sul nostro sistema. Se riprovi dovrebbe funzionare.";
-$a->strings["Unable to set your contact credentials on our system."] = "Impossibile impostare le credenziali del tuo contatto sul nostro sistema.";
-$a->strings["Unable to update your contact profile details on our system"] = "Impossibile aggiornare i dettagli del tuo contatto sul nostro sistema";
-$a->strings["Connection accepted at %s"] = "Connession accettata su %s";
-$a->strings["%1\$s has joined %2\$s"] = "";
-$a->strings["Google+ Import Settings"] = "";
-$a->strings["Enable Google+ Import"] = "";
-$a->strings["Google Account ID"] = "";
-$a->strings["Google+ Import Settings saved."] = "";
-$a->strings["Facebook disabled"] = "Facebook disabilitato";
-$a->strings["Updating contacts"] = "Aggiornamento contatti";
-$a->strings["Facebook API key is missing."] = "Chiave API Facebook mancante.";
-$a->strings["Facebook Connect"] = "Facebook Connect";
-$a->strings["Install Facebook connector for this account."] = "Installa Facebook connector per questo account";
-$a->strings["Remove Facebook connector"] = "Rimuovi Facebook connector";
-$a->strings["Re-authenticate [This is necessary whenever your Facebook password is changed.]"] = "Ri-autentica [Questo è necessario ogni volta che cambia la password di Facebook.]";
-$a->strings["Post to Facebook by default"] = "Invia sempre a Facebook";
-$a->strings["Facebook friend linking has been disabled on this site. The following settings will have no effect."] = "";
-$a->strings["Facebook friend linking has been disabled on this site. If you disable it, you will be unable to re-enable it."] = "";
-$a->strings["Link all your Facebook friends and conversations on this website"] = "Collega tutti i tuoi amici di Facebook e le conversazioni su questo sito";
-$a->strings["Facebook conversations consist of your <em>profile wall</em> and your friend <em>stream</em>."] = "Le conversazione su Facebook sono composte dai i tuoi messsaggi in bacheca e dai messaggi dei tuoi amici";
-$a->strings["On this website, your Facebook friend stream is only visible to you."] = "Su questo sito, i messaggi dai vostri amici su Facebook è visibile solo a te.";
-$a->strings["The following settings determine the privacy of your Facebook profile wall on this website."] = "Le seguenti impostazioni determinano la privacy della vostra bacheca di Facebook su questo sito.";
-$a->strings["On this website your Facebook profile wall conversations will only be visible to you"] = "Su questo sito, le conversazioni sulla tua bacheca di Facebook saranno visibili solo a te";
-$a->strings["Do not import your Facebook profile wall conversations"] = "Non importare le conversazione sulla tua bacheca di Facebook";
-$a->strings["If you choose to link conversations and leave both of these boxes unchecked, your Facebook profile wall will be merged with your profile wall on this website and your privacy settings on this website will be used to determine who may see the conversations."] = "Se scegli di collegare le conversazioni e lasci entrambi questi box non segnati, la tua bacheca di Facebook sarà fusa con la tua bacheca su questao sito, e le impostazioni di privacy su questo sito saranno usate per decidere chi potrà vedere le conversazioni.";
-$a->strings["Comma separated applications to ignore"] = "Elenco separato da virgola di applicazioni da ignorare";
-$a->strings["Problems with Facebook Real-Time Updates"] = "Problemi con gli aggiornamenti in tempo reale con Facebook";
-$a->strings["Facebook Connector Settings"] = "Impostazioni del connettore Facebook";
-$a->strings["Facebook API Key"] = "Facebook API Key";
-$a->strings["Error: it appears that you have specified the App-ID and -Secret in your .htconfig.php file. As long as they are specified there, they cannot be set using this form.<br><br>"] = "Error: it appears that you have specified the App-ID and -Secret in your .htconfig.php file. As long as they are specified there, they cannot be set using this form.<br><br>";
-$a->strings["Error: the given API Key seems to be incorrect (the application access token could not be retrieved)."] = "Error: the given API Key seems to be incorrect (the application access token could not be retrieved).";
-$a->strings["The given API Key seems to work correctly."] = "L' API Key fornita sembra funzionare correttamente.";
-$a->strings["The correctness of the API Key could not be detected. Something strange's going on."] = "";
-$a->strings["App-ID / API-Key"] = "App-ID / API-Key";
-$a->strings["Application secret"] = "Application secret";
-$a->strings["Polling Interval in minutes (minimum %1\$s minutes)"] = "";
-$a->strings["Synchronize comments (no comments on Facebook are missed, at the cost of increased system load)"] = "";
-$a->strings["Real-Time Updates"] = "Aggiornamenti Real-Time";
-$a->strings["Real-Time Updates are activated."] = "Gli aggiornamenti in tempo reale sono attivi";
-$a->strings["Deactivate Real-Time Updates"] = "Disattiva gli aggiornamenti in tempo reale";
-$a->strings["Real-Time Updates not activated."] = "Gli aggiornamenti in tempo reale non sono attivi";
-$a->strings["Activate Real-Time Updates"] = "Attiva gli aggiornamenti in tempo reale";
-$a->strings["The new values have been saved."] = "I nuovi valori sono stati salvati.";
-$a->strings["Post to Facebook"] = "Invia a Facebook";
-$a->strings["Post to Facebook cancelled because of multi-network access permission conflict."] = "Invio su Facebook annullato per un conflitto nei permessi di accesso.";
-$a->strings["View on Friendica"] = "Vedi su Friendica";
-$a->strings["Facebook post failed. Queued for retry."] = "Invio a Facebook fallito. In attesa di riprovare.";
-$a->strings["Your Facebook connection became invalid. Please Re-authenticate."] = "";
-$a->strings["Facebook connection became invalid"] = "";
-$a->strings["Hi %1\$s,\n\nThe connection between your accounts on %2\$s and Facebook became invalid. This usually happens after you change your Facebook-password. To enable the connection again, you have to %3\$sre-authenticate the Facebook-connector%4\$s."] = "";
-$a->strings["StatusNet AutoFollow settings updated."] = "";
-$a->strings["StatusNet AutoFollow Settings"] = "";
-$a->strings["Automatically follow any StatusNet followers/mentioners"] = "";
-$a->strings["Bg settings updated."] = "";
-$a->strings["Bg Settings"] = "";
-$a->strings["How many contacts to display on profile sidebar"] = "Quanti contatti visualizzare nella barra laterale del profilo";
-$a->strings["Lifetime of the cache (in hours)"] = "";
-$a->strings["Cache Statistics"] = "";
-$a->strings["Number of items"] = "";
-$a->strings["Size of the cache"] = "";
-$a->strings["Delete the whole cache"] = "";
-$a->strings["Facebook Post disabled"] = "";
-$a->strings["Facebook Post"] = "";
-$a->strings["Install Facebook Post connector for this account."] = "";
-$a->strings["Remove Facebook Post connector"] = "";
-$a->strings["Facebook Post Settings"] = "";
-$a->strings["%d person likes this"] = array(
- 0 => "piace a %d persona",
- 1 => "piace a %d persone",
-);
-$a->strings["%d person doesn't like this"] = array(
- 0 => "non piace a %d persona",
- 1 => "non piace a %d persone",
-);
-$a->strings["Get added to this list!"] = "";
-$a->strings["Generate new key"] = "Genera una nuova chiave";
-$a->strings["Widgets key"] = "Chiave Widget";
-$a->strings["Widgets available"] = "Widget disponibili";
-$a->strings["Connect on Friendica!"] = "Connettiti su Friendica!";
-$a->strings["bitchslap"] = "";
-$a->strings["bitchslapped"] = "";
-$a->strings["shag"] = "";
-$a->strings["shagged"] = "";
-$a->strings["do something obscenely biological to"] = "";
-$a->strings["did something obscenely biological to"] = "";
-$a->strings["point out the poke feature to"] = "";
-$a->strings["pointed out the poke feature to"] = "";
-$a->strings["declare undying love for"] = "";
-$a->strings["declared undying love for"] = "";
-$a->strings["patent"] = "";
-$a->strings["patented"] = "";
-$a->strings["stroke beard"] = "";
-$a->strings["stroked their beard at"] = "";
-$a->strings["bemoan the declining standards of modern secondary and tertiary education to"] = "";
-$a->strings["bemoans the declining standards of modern secondary and tertiary education to"] = "";
-$a->strings["hug"] = "";
-$a->strings["hugged"] = "";
-$a->strings["kiss"] = "";
-$a->strings["kissed"] = "";
-$a->strings["raise eyebrows at"] = "";
-$a->strings["raised their eyebrows at"] = "";
-$a->strings["insult"] = "";
-$a->strings["insulted"] = "";
-$a->strings["praise"] = "";
-$a->strings["praised"] = "";
-$a->strings["be dubious of"] = "";
-$a->strings["was dubious of"] = "";
-$a->strings["eat"] = "";
-$a->strings["ate"] = "";
-$a->strings["giggle and fawn at"] = "";
-$a->strings["giggled and fawned at"] = "";
-$a->strings["doubt"] = "";
-$a->strings["doubted"] = "";
-$a->strings["glare"] = "";
-$a->strings["glared at"] = "";
-$a->strings["YourLS Settings"] = "Impostazioni YourLS";
-$a->strings["URL: http://"] = "URL: http://";
-$a->strings["Username:"] = "Nome utente:";
-$a->strings["Password:"] = "Password:";
-$a->strings["Use SSL "] = "Usa SSL";
-$a->strings["yourls Settings saved."] = "Impostazioni yourls salvate.";
-$a->strings["Post to LiveJournal"] = "Posta su LiveJournal";
-$a->strings["LiveJournal Post Settings"] = "Impostazioni post LiveJournal";
-$a->strings["Enable LiveJournal Post Plugin"] = "Abilita il plugin LiveJournal";
-$a->strings["LiveJournal username"] = "LiveJournal username";
-$a->strings["LiveJournal password"] = "LiveJournal password";
-$a->strings["Post to LiveJournal by default"] = "Posta su LiveJournal di default";
-$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 puo' 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 puo' cercare anche qualsiasi parola che inserisci, quindi puo' essere usato come filtro di contenuti generico.";
-$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["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";
-$a->strings["Forums"] = "Forum";
-$a->strings["Forums:"] = "";
-$a->strings["Page settings updated."] = "";
-$a->strings["Page Settings"] = "";
-$a->strings["How many forums to display on sidebar without paging"] = "";
-$a->strings["Randomise Page/Forum list"] = "";
-$a->strings["Show pages/forums on profile page"] = "";
-$a->strings["Planets Settings"] = "";
-$a->strings["Enable Planets Plugin"] = "";
-$a->strings["Login"] = "Accedi";
-$a->strings["OpenID"] = "OpenID";
-$a->strings["Latest users"] = "Ultimi utenti";
-$a->strings["Most active users"] = "Utenti più attivi";
-$a->strings["Latest photos"] = "Ultime foto";
-$a->strings["Latest likes"] = "Ultimi \"mi piace\"";
-$a->strings["event"] = "l'evento";
-$a->strings["No access"] = "";
-$a->strings["Could not open component for editing"] = "";
-$a->strings["Go back to the calendar"] = "";
-$a->strings["Event data"] = "";
-$a->strings["Calendar"] = "";
-$a->strings["Special color"] = "";
-$a->strings["Subject"] = "";
-$a->strings["Starts"] = "";
-$a->strings["Ends"] = "";
-$a->strings["Description"] = "";
-$a->strings["Recurrence"] = "";
-$a->strings["Frequency"] = "";
-$a->strings["Daily"] = "Giornalmente";
-$a->strings["Weekly"] = "Settimanalmente";
-$a->strings["Monthly"] = "Mensilmente";
-$a->strings["Yearly"] = "";
-$a->strings["days"] = "giorni";
-$a->strings["weeks"] = "settimane";
-$a->strings["months"] = "mesi";
-$a->strings["years"] = "anni";
-$a->strings["Interval"] = "";
-$a->strings["All %select% %time%"] = "";
-$a->strings["Days"] = "";
-$a->strings["Sunday"] = "Domenica";
-$a->strings["Monday"] = "Lunedì";
-$a->strings["Tuesday"] = "Martedì";
-$a->strings["Wednesday"] = "Mercoledì";
-$a->strings["Thursday"] = "Giovedì";
-$a->strings["Friday"] = "Venerdì";
-$a->strings["Saturday"] = "Sabato";
-$a->strings["First day of week:"] = "";
-$a->strings["Day of month"] = "";
-$a->strings["#num#th of each month"] = "";
-$a->strings["#num#th-last of each month"] = "";
-$a->strings["#num#th #wkday# of each month"] = "";
-$a->strings["#num#th-last #wkday# of each month"] = "";
-$a->strings["Month"] = "";
-$a->strings["#num#th of the given month"] = "";
-$a->strings["#num#th-last of the given month"] = "";
-$a->strings["#num#th #wkday# of the given month"] = "";
-$a->strings["#num#th-last #wkday# of the given month"] = "";
-$a->strings["Repeat until"] = "";
-$a->strings["Infinite"] = "";
-$a->strings["Until the following date"] = "";
-$a->strings["Number of times"] = "";
-$a->strings["Exceptions"] = "";
-$a->strings["none"] = "";
-$a->strings["Notification"] = "";
-$a->strings["Notify by"] = "";
-$a->strings["E-Mail"] = "";
-$a->strings["On Friendica / Display"] = "";
-$a->strings["Time"] = "";
-$a->strings["Hours"] = "";
-$a->strings["Minutes"] = "";
-$a->strings["Seconds"] = "";
-$a->strings["Weeks"] = "";
-$a->strings["before the"] = "";
-$a->strings["start of the event"] = "";
-$a->strings["end of the event"] = "";
-$a->strings["Add a notification"] = "";
-$a->strings["The event #name# will start at #date"] = "";
-$a->strings["#name# is about to begin."] = "";
-$a->strings["Saved"] = "";
-$a->strings["U.S. Time Format (mm/dd/YYYY)"] = "";
-$a->strings["German Time Format (dd.mm.YYYY)"] = "";
-$a->strings["Private Events"] = "";
-$a->strings["Private Addressbooks"] = "";
-$a->strings["Friendica-Native events"] = "";
-$a->strings["Friendica-Contacts"] = "";
-$a->strings["Your Friendica-Contacts"] = "";
-$a->strings["Something went wrong when trying to import the file. Sorry. Maybe some events were imported anyway."] = "";
-$a->strings["Something went wrong when trying to import the file. Sorry."] = "";
-$a->strings["The ICS-File has been imported."] = "";
-$a->strings["No file was uploaded."] = "";
-$a->strings["Import a ICS-file"] = "";
-$a->strings["ICS-File"] = "";
-$a->strings["Overwrite all #num# existing events"] = "";
-$a->strings["New event"] = "";
-$a->strings["Today"] = "";
-$a->strings["Day"] = "";
-$a->strings["Week"] = "";
-$a->strings["Reload"] = "";
-$a->strings["Date"] = "";
-$a->strings["Error"] = "";
-$a->strings["The calendar has been updated."] = "";
-$a->strings["The new calendar has been created."] = "";
-$a->strings["The calendar has been deleted."] = "";
-$a->strings["Calendar Settings"] = "";
-$a->strings["Date format"] = "";
-$a->strings["Time zone"] = "";
-$a->strings["Calendars"] = "";
-$a->strings["Create a new calendar"] = "";
-$a->strings["Limitations"] = "";
-$a->strings["Warning"] = "";
-$a->strings["Synchronization (iPhone, Thunderbird Lightning, Android, ...)"] = "";
-$a->strings["Synchronizing this calendar with the iPhone"] = "";
-$a->strings["Synchronizing your Friendica-Contacts with the 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."] = "";
-$a->strings["Extended calendar with CalDAV-support"] = "";
-$a->strings["noreply"] = "nessuna risposta";
-$a->strings["Notification: "] = "";
-$a->strings["The database tables have been installed."] = "";
-$a->strings["An error occurred during the installation."] = "";
-$a->strings["The database tables have been updated."] = "";
-$a->strings["An error occurred during the update."] = "";
-$a->strings["No system-wide settings yet."] = "";
-$a->strings["Database status"] = "";
-$a->strings["Installed"] = "";
-$a->strings["Upgrade needed"] = "";
-$a->strings["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."] = "";
-$a->strings["Upgrade"] = "";
-$a->strings["Not installed"] = "";
-$a->strings["Install"] = "";
-$a->strings["Unknown"] = "";
-$a->strings["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."] = "";
-$a->strings["Troubleshooting"] = "";
-$a->strings["Manual creation of the database tables:"] = "";
-$a->strings["Show SQL-statements"] = "";
-$a->strings["Private Calendar"] = "";
-$a->strings["Friendica Events: Mine"] = "";
-$a->strings["Friendica Events: Contacts"] = "";
-$a->strings["Private Addresses"] = "";
-$a->strings["Friendica Contacts"] = "";
-$a->strings["Allow to use your friendica id (%s) to connecto to external unhosted-enabled storage (like ownCloud). See <a href=\"http://www.w3.org/community/unhosted/wiki/RemoteStorage#WebFinger\">RemoteStorage WebFinger</a>"] = "Permette di usare il tuo id friendica (%s) per collegarsi a storage esterni che supportano unhosted (come ownCloud). Vedi <a href=\"http://www.w3.org/community/unhosted/wiki/RemoteStorage#WebFinger\">RemoteStorage WebFinger</a>";
-$a->strings["Template URL (with {category})"] = "Template URL (con {category})";
-$a->strings["OAuth end-point"] = "OAuth end-point";
-$a->strings["Api"] = "Api";
-$a->strings["Member since:"] = "Membro dal:";
-$a->strings["Three Dimensional Tic-Tac-Toe"] = "Tic-Tac-Toe tridimensionale";
-$a->strings["3D Tic-Tac-Toe"] = "3D Tic-Tac-Toe";
-$a->strings["New game"] = "Nuova partita";
-$a->strings["New game with handicap"] = "Nuova partita con handicap";
-$a->strings["Three dimensional tic-tac-toe is just like the traditional game except that it is played on multiple levels simultaneously. "] = "Tic-tac-toe tridimensionale è come il gioco tradizionale, solo che si gioca su livelli multipli contemporaneamente.";
-$a->strings["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."] = "In questo caso ci sono tre livelli. Puoi vincere mettendo tre segni in fila su ogni livello, anche verso l'alto, il basso e diagonalmente anche attraverso i diversi livelli.";
-$a->strings["The handicap game disables the center position on the middle level because the player claiming this square often has an unfair advantage."] = "L'handicap disabilita la casella centrale sul livello di mezzo, perchè il giocatore che si prende quella casella spesso ha un deciso vantaggio.";
-$a->strings["You go first..."] = "Cominci tu...";
-$a->strings["I'm going first this time..."] = "Comincio io questa volta...";
-$a->strings["You won!"] = "Hai vinto!";
-$a->strings["\"Cat\" game!"] = "Stallo!";
-$a->strings["I won!"] = "Ho vinto!";
-$a->strings["Randplace Settings"] = "Impostazioni Randplace";
-$a->strings["Enable Randplace Plugin"] = "Abilita il plugin Randplace";
-$a->strings["Post to Dreamwidth"] = "Posta su Dreamwidth";
-$a->strings["Dreamwidth Post Settings"] = "Impostazioni post Dreamwidth";
-$a->strings["Enable dreamwidth Post Plugin"] = "Abilita il plugin dreamwidth";
-$a->strings["dreamwidth username"] = "dreamwidth username";
-$a->strings["dreamwidth password"] = "Password dreamwidth";
-$a->strings["Post to dreamwidth by default"] = "Invia a dreamwidth per impostazione predefinita";
-$a->strings["Post to Drupal"] = "Invia a Drupal";
-$a->strings["Drupal Post Settings"] = "Impostazioni invio a Drupal";
-$a->strings["Enable Drupal Post Plugin"] = "Abilita il plugin di invio a Drupal";
-$a->strings["Drupal username"] = "Drupal username";
-$a->strings["Drupal password"] = "Drupal password";
-$a->strings["Post Type - article,page,or blog"] = "Tipo di post - article,page o blog";
-$a->strings["Drupal site URL"] = "Indirizzo del sito Drupal";
-$a->strings["Drupal site uses clean URLS"] = "Il sito Drupal usa URL puliti";
-$a->strings["Post to Drupal by default"] = "Invia a Drupal per impostazione predefinita";
-$a->strings["Post from Friendica"] = "Messaggio da Friendica";
-$a->strings["Startpage Settings"] = "";
-$a->strings["Home page to load after login - leave blank for profile wall"] = "";
-$a->strings["Examples: &quot;network&quot; or &quot;notifications/system&quot;"] = "";
-$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["Your account on %s will expire in a few days."] = "";
-$a->strings["Your Friendica account is about to expire."] = "";
-$a->strings["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"] = "";
-$a->strings["Upload a file"] = "Carica un file";
-$a->strings["Drop files here to upload"] = "Trascina un file qui per caricarlo";
-$a->strings["Failed"] = "Caricamento fallito";
-$a->strings["No files were uploaded."] = "Nessun file è stato caricato.";
-$a->strings["Uploaded file is empty"] = "Il file caricato è vuoto";
-$a->strings["File has an invalid extension, it should be one of "] = "Il file ha un'estensione non valida, dovrebbe essere una tra ";
-$a->strings["Upload was cancelled, or server error encountered"] = "Il caricamento è stato cancellato, o si è verificato un errore sul server";
-$a->strings["OEmbed settings updated"] = "Impostazioni OEmbed aggiornate";
-$a->strings["Use OEmbed for YouTube videos"] = "Usa OEmbed per i video di YouTube";
-$a->strings["URL to embed:"] = "URL da incorporare:";
-$a->strings["show/hide"] = "";
-$a->strings["No forum subscriptions"] = "";
-$a->strings["Forumlist settings updated."] = "";
-$a->strings["Forumlist Settings"] = "";
-$a->strings["Randomise forum list"] = "";
-$a->strings["Show forums on profile page"] = "";
-$a->strings["Impressum"] = "Impressum";
-$a->strings["Site Owner"] = "Proprietario del sito";
+$a->strings["Edit/Manage Profiles"] = "Modifica/gestisci i profili";
+$a->strings["Add profile things"] = "Aggiungi oggetti al profilo";
+$a->strings["Include desirable objects in your profile"] = "Aggiungi oggetti interessanti al tuo profilo";
+$a->strings["Add a Channel"] = "Aggiungi un canale";
+$a->strings["A channel is your own collection of related web pages. A channel can be used to hold social network profiles, blogs, conversation groups and forums, celebrity pages, and much more. You may create as many channels as your service provider allows."] = "I contenuti che pubblichi finiscono in un \"canale\". Un canale può essere usato per mantenere un tuo profilo personale, per avere un blog, per creare forum di discussione o gruppi di interesse, per pagine di celebrità e molto altro. Puoi creare quanti canali vuoi a meno di limiti dati dal gestore del sito.";
+$a->strings["Examples: \"Bob Jameson\", \"Lisa and her Horses\", \"Soccer\", \"Aviation Group\" "] = "Per esempio: \"Mario Rossi\", \"Lisa e le sue ricette\", \"Il campionato\", \"Il gruppo di escursionismo\"";
+$a->strings["Choose a short nickname"] = "Scegli un nome breve";
+$a->strings["Your nickname will be used to create an easily remembered channel address (like an email address) which you can share with others."] = "Il nome breve sarà usato per creare un indirizzo facile da ricordare per il tuo canale (simile a una email). Così potrai condividerlo e gli altri potranno trovarti.";
+$a->strings["Or <a href=\"import\">import an existing channel</a> from another location"] = "Oppure <a href=\"import\">importa un tuo canale esistente</a> da un altro server/hub";
+$a->strings["Permission Denied."] = "Permesso negato.";
+$a->strings["File not found."] = "File non trovato.";
+$a->strings["Edit file permissions"] = "Modifica i permessi del file";
+$a->strings["Include all files and sub folders"] = "Includi tutti i file e le sottocartelle";
+$a->strings["Return to file list"] = "Torna all'elenco dei file";
+$a->strings["Copy/paste this code to attach file to a post"] = "Copia/incolla questo codice per far comparire il file in un articolo";
+$a->strings["Copy/paste this URL to link file from a web page"] = "Copia/incolla questo indirizzo in una pagina web per avere un link al file";
+$a->strings["Download"] = "Scaricamento dati";
+$a->strings["Used: "] = "Usato:";
+$a->strings["[directory]"] = "[cartella]";
+$a->strings["Limit: "] = "Limite:";
+$a->strings["No valid account found."] = "Nessun account valido trovato.";
+$a->strings["Password reset request issued. Check your email."] = "La richiesta per reimpostare la password è stata inviata. Controlla la tua email.";
+$a->strings["Site Member (%s)"] = "Utente del sito (%s)";
+$a->strings["Password reset requested at %s"] = "È stato richiesto di reimpostare password su %s";
+$a->strings["Request could not be verified. (You may have previously submitted it.) Password reset failed."] = "La richiesta non può essere verificata (potresti averla già usata precedentemente). La password non può essere reimpostata.";
+$a->strings["Password Reset"] = "Reimposta la password";
+$a->strings["Your password has been reset as requested."] = "La password è stata reimpostata come richiesto.";
+$a->strings["Your new password is"] = "La tua nuova password è";
+$a->strings["Save or copy your new password - and then"] = "Salva o copia la tua nuova password, quindi";
+$a->strings["click here to login"] = "clicca qui per accedere";
+$a->strings["Your password may be changed from the <em>Settings</em> page after successful login."] = "Puoi cambiare la tua password dalla pagina delle <em>Impostazioni</em> dopo aver effettuato l'accesso.";
+$a->strings["Your password has changed at %s"] = "La tua password su %s è cambiata";
+$a->strings["Forgot your Password?"] = "Hai dimenticato la password?";
+$a->strings["Enter your email address and submit to have your password reset. Then check your email for further instructions."] = "Inserisci il tuo indirizzo email per reimpostare la password. Dopo aver inviato la richiesta, controlla l'email e troverai le istruzioni per continuare.";
$a->strings["Email Address"] = "Indirizzo email";
-$a->strings["Postal Address"] = "Indirizzo";
-$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."] = "Il plugin Impressum deve essere configurato!<br>Aggiungi almeno il Proprietario del sito.";
-$a->strings["The page operators name."] = "Nome del gestore della pagina.";
-$a->strings["Site Owners Profile"] = "Profilo del proprietario del sito";
-$a->strings["Profile address of the operator."] = "Indirizzo del profilo del gestore della pagina";
-$a->strings["How to contact the operator via snail mail. You can use BBCode here."] = "";
-$a->strings["Notes"] = "Note";
-$a->strings["Additional notes that are displayed beneath the contact information. You can use BBCode here."] = "";
-$a->strings["How to contact the operator via email. (will be displayed obfuscated)"] = "";
-$a->strings["Footer note"] = "Footer delle note";
-$a->strings["Text for the footer. You can use BBCode here."] = "";
-$a->strings["Report Bug"] = "Segnala un Bug";
-$a->strings["No Timeline settings updated."] = "";
-$a->strings["No Timeline Settings"] = "";
-$a->strings["Disable Archive selector on profile wall"] = "";
-$a->strings["\"Blockem\" Settings"] = "Impostazioni \"Blockem\"";
-$a->strings["Comma separated profile URLS to block"] = "Lista, separata da virgola, di indirizzi da bloccare";
-$a->strings["BLOCKEM Settings saved."] = "Impostazioni 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[":-)"] = ":-)";
-$a->strings[":-("] = ":-(";
-$a->strings["lol"] = "lol";
-$a->strings["Quick Comment Settings"] = "Impostazioni commento rapido";
-$a->strings["Quick comments are found near comment boxes, sometimes hidden. Click them to provide simple replies."] = "Trovi i commenti rapidi vicino al box dei commenti, a volte nascosti. Cliccali per inviare semplici risposte.";
-$a->strings["Enter quick comments, one per line"] = "Inserire un commento rapido, uno per linea";
-$a->strings["Quick Comment settings saved."] = "Impostazioni commento rapido salvate.";
-$a->strings["Tile Server URL"] = "";
-$a->strings["A list of <a href=\"http://wiki.openstreetmap.org/wiki/TMS\" target=\"_blank\">public tile servers</a>"] = "";
-$a->strings["Default zoom"] = "Default zoom";
-$a->strings["The default zoom level. (1:world, 18:highest)"] = "";
-$a->strings["Editplain settings updated."] = "Impostazioni 'Editplain' aggiornate.";
-$a->strings["Group Text"] = "";
-$a->strings["Use a text only (non-image) group selector in the \"group edit\" menu"] = "";
-$a->strings["Could NOT install Libravatar successfully.<br>It requires PHP >= 5.3"] = "";
-$a->strings["generic profile image"] = "immagine generica del profilo";
-$a->strings["random geometric pattern"] = "";
-$a->strings["monster face"] = "";
-$a->strings["computer generated face"] = "";
-$a->strings["retro arcade style face"] = "";
-$a->strings["Your PHP version %s is lower than the required PHP >= 5.3."] = "";
-$a->strings["This addon is not functional on your server."] = "";
-$a->strings["Information"] = "";
-$a->strings["Gravatar addon is installed. Please disable the Gravatar addon.<br>The Libravatar addon will fall back to Gravatar if nothing was found at Libravatar."] = "";
-$a->strings["Default avatar image"] = "";
-$a->strings["Select default avatar image if none was found. See README"] = "";
-$a->strings["Libravatar settings updated."] = "";
-$a->strings["Post to libertree"] = "";
-$a->strings["libertree Post Settings"] = "";
-$a->strings["Enable Libertree Post Plugin"] = "";
-$a->strings["Libertree API token"] = "";
-$a->strings["Libertree site URL"] = "";
-$a->strings["Post to Libertree by default"] = "";
-$a->strings["Altpager settings updated."] = "";
-$a->strings["Alternate Pagination Setting"] = "";
-$a->strings["Use links to \"newer\" and \"older\" pages in place of page numbers?"] = "";
-$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"] = "";
-$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."] = "";
-$a->strings["Editplain Settings"] = "Impostazioni Editplain";
-$a->strings["Disable richtext status editor"] = "Disabilita l'editor di testo visuale";
-$a->strings["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."] = "";
-$a->strings["Select default avatar image if none was found at Gravatar. See README"] = "";
-$a->strings["Rating of images"] = "";
-$a->strings["Select the appropriate avatar rating for your site. See README"] = "";
-$a->strings["Gravatar settings updated."] = "";
-$a->strings["Your Friendica test account is about to expire."] = "";
-$a->strings["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 http://dir.friendica.com/siteinfo - and for more information on setting up your own Friendica server please see the Friendica project website at http://friendica.com."] = "";
-$a->strings["\"pageheader\" Settings"] = "Impostazioni \"pageheader\"";
-$a->strings["pageheader Settings saved."] = "Impostazioni salvate.";
-$a->strings["Post to Insanejournal"] = "";
-$a->strings["InsaneJournal Post Settings"] = "";
-$a->strings["Enable InsaneJournal Post Plugin"] = "";
-$a->strings["InsaneJournal username"] = "";
-$a->strings["InsaneJournal password"] = "";
-$a->strings["Post to InsaneJournal by default"] = "";
-$a->strings["Jappix Mini addon settings"] = "";
-$a->strings["Activate addon"] = "";
-$a->strings["Do <em>not</em> insert the Jappixmini Chat-Widget into the webinterface"] = "";
-$a->strings["Jabber username"] = "";
-$a->strings["Jabber server"] = "";
-$a->strings["Jabber BOSH host"] = "";
-$a->strings["Jabber password"] = "";
-$a->strings["Encrypt Jabber password with Friendica password (recommended)"] = "";
-$a->strings["Friendica password"] = "";
-$a->strings["Approve subscription requests from Friendica contacts automatically"] = "";
-$a->strings["Subscribe to Friendica contacts automatically"] = "";
-$a->strings["Purge internal list of jabber addresses of contacts"] = "";
-$a->strings["Add contact"] = "";
-$a->strings["View Source"] = "Vedi sorgente";
-$a->strings["Post to StatusNet"] = "Invia a StatusNet";
-$a->strings["Please contact your site administrator.<br />The provided API URL is not valid."] = "Contatta l'amministratore del sito.<br/>L'URL delle API fornito non è valido.";
-$a->strings["We could not contact the StatusNet API with the Path you entered."] = "Non possiamo conttattare le API di StatusNet con il percorso che hai inserito.";
-$a->strings["StatusNet settings updated."] = "Impostazioni StatusNet aggiornate.";
-$a->strings["StatusNet Posting Settings"] = "Impostazioni di invio a StatusNet";
-$a->strings["Globally Available StatusNet OAuthKeys"] = "OAuthKeys globali di StatusNet";
-$a->strings["There are preconfigured OAuth key pairs for some StatusNet servers available. If you are useing one of them, please use these credentials. If not feel free to connect to any other StatusNet instance (see below)."] = "Esistono coppie di chiavi OAuth precofigurate per alcuni server StatusNet. Se usi uno di questi server, per favore scegli queste credenziali. Altrimenti sei libero di collegarti a un'altra installazione di StatusNet (vedi sotto).";
-$a->strings["Provide your own OAuth Credentials"] = "Fornisci le tue credenziali OAuth";
-$a->strings["No consumer key pair for StatusNet found. Register your Friendica Account as an desktop client on your StatusNet 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 StatusNet installation."] = "Nessuna coppia di chiavi consumer trovate per StatusNet. Registra il tuo account Friendica come un client desktop nel tuo account StatusNet, copia la coppia di chiavi consumer qui e inserisci l'url base delle API.<br/>Prima di registrare la tua coppia di chiavi OAuth, chiedi all'amministratore se esiste già una coppia di chiavi per questo sito Friendica presso la tua installazione StatusNet preferita.";
-$a->strings["OAuth Consumer Key"] = "OAuth Consumer Key";
-$a->strings["OAuth Consumer Secret"] = "OAuth Consumer Secret";
-$a->strings["Base API Path (remember the trailing /)"] = "Indirizzo di base per le API (ricorda la / alla fine)";
-$a->strings["To connect to your StatusNet account click the button below to get a security code from StatusNet which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to StatusNet."] = "Per collegare il tuo account StatusNet, clicca sul bottone per ottenere un codice di sicurezza da StatusNet, che dovrai copiare nel box sottostante e poi inviare la form. Solo i tuoi messaggi <strong>pubblici</strong> saranno inviati a StatusNet.";
-$a->strings["Log in with StatusNet"] = "Accedi con StatuNet";
-$a->strings["Copy the security code from StatusNet here"] = "Copia il codice di sicurezza da StatusNet qui";
-$a->strings["Cancel Connection Process"] = "Annulla il processo di connessione";
-$a->strings["Current StatusNet API is"] = "Le API StatusNet correnti sono";
-$a->strings["Cancel StatusNet Connection"] = "Annulla la connessione a StatusNet";
-$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 StatusNet 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 StatusNet 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 StatusNet will lead the visitor to a blank page informing the visitor that the access to your profile has been restricted."] = "";
-$a->strings["Allow posting to StatusNet"] = "Permetti l'invio a StatusNet";
-$a->strings["Send public postings to StatusNet by default"] = "Invia sempre i messaggi pubblici a StatusNet";
-$a->strings["Send linked #-tags and @-names to StatusNet"] = "";
-$a->strings["Clear OAuth configuration"] = "Rimuovi la configurazione OAuth";
-$a->strings["API URL"] = "API URL";
-$a->strings["Infinite Improbability Drive"] = "";
-$a->strings["Post to Tumblr"] = "Pubblica su Tumblr";
-$a->strings["Tumblr Post Settings"] = "Impostazioni di invio a Tumblr";
-$a->strings["Enable Tumblr Post Plugin"] = "Abilita Plugin Tumblr";
-$a->strings["Tumblr login"] = "Tumblr login";
-$a->strings["Tumblr password"] = "Tumblr password";
-$a->strings["Post to Tumblr by default"] = "Pubblica su Tumblr di default";
-$a->strings["Numfriends settings updated."] = "Impostazioni \"Numfriends' aggiornate.";
-$a->strings["Numfriends Settings"] = "Impostazioni Numfriends";
-$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["[Friendica:Notify] Comment to conversation #%d"] = "[Friendica:Notifica] Commento alla conversazione #%d";
-$a->strings["Post to Wordpress"] = "Pubblica su Wordpress";
-$a->strings["WordPress Post Settings"] = "Impostazioni invio a WordPress";
-$a->strings["Enable WordPress Post Plugin"] = "Abilita plugin \"invia a WordPress\"";
-$a->strings["WordPress username"] = "nome utente WordPress";
-$a->strings["WordPress password"] = "password WordPress";
-$a->strings["WordPress API URL"] = "WordPress API URL";
-$a->strings["Post to WordPress by default"] = "Pubblica su WordPress di default";
-$a->strings["Provide a backlink to the Friendica post"] = "";
-$a->strings["Read the original post and comment stream on Friendica"] = "";
-$a->strings["\"Show more\" Settings"] = "Impostazioni \"Mostra altro\"";
-$a->strings["Enable Show More"] = "Abilita \"Mostra altro\"";
-$a->strings["Cutting posts after how much characters"] = "";
-$a->strings["Show More Settings saved."] = "Impostazioni \"Mostra altro\" salvate.";
-$a->strings["This website is tracked using the <a href='http://www.piwik.org'>Piwik</a> analytics tool."] = "Questo sito è monitorato con lo strumento di analisi <a href='http://www.piwik.org'>Piwik</a>.";
-$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)."] = "Se non vuoi che le tue visite vengono registrate in questo modo è possibile <a href='%s'>impostare un cookie per evitare che Piwik rintracci ulteriori visite del sito</a> (opt-out).";
-$a->strings["Piwik Base URL"] = "Piwik Base URL";
-$a->strings["Absolute path to your Piwik installation. (without protocol (http/s), with trailing slash)"] = "";
-$a->strings["Site ID"] = "Site ID";
-$a->strings["Show opt-out cookie link?"] = "Mostra il link per il cookie opt-out?";
-$a->strings["Asynchronous tracking"] = "";
-$a->strings["Post to Twitter"] = "Invia a Twitter";
-$a->strings["Twitter settings updated."] = "Impostazioni di Twitter aggiornate.";
-$a->strings["Twitter Posting Settings"] = "Impostazioni di invio a 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["Log in with Twitter"] = "Accedi con Twitter";
-$a->strings["Copy the PIN from Twitter here"] = "Copia il PIN da Twitter qui";
-$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."] = "";
-$a->strings["Allow posting to Twitter"] = "Permetti l'invio a Twitter";
-$a->strings["Send public postings to Twitter by default"] = "Invia sempre i messaggi pubblici a Twitter";
-$a->strings["Send linked #-tags and @-names to Twitter"] = "";
-$a->strings["Consumer key"] = "Consumer key";
-$a->strings["Consumer secret"] = "Consumer secret";
-$a->strings["IRC Settings"] = "Impostazioni IRC";
-$a->strings["Channel(s) to auto connect (comma separated)"] = "Canali a cui autocollegarsi (separati da virgola)";
-$a->strings["Popular Channels (comma separated)"] = "Canali popolari (separati da virgola)";
-$a->strings["IRC settings saved."] = "Impostazioni IRC salvate.";
-$a->strings["IRC Chatroom"] = "Stanza IRC";
-$a->strings["Popular Channels"] = "Canali Popolari";
-$a->strings["Fromapp settings updated."] = "";
-$a->strings["FromApp Settings"] = "";
-$a->strings["The application name you would like to show your posts originating from."] = "";
-$a->strings["Use this application name even if another application was used."] = "";
-$a->strings["Post to blogger"] = "Posta su blogger";
-$a->strings["Blogger Post Settings"] = "Impostazioni post per blogger";
-$a->strings["Enable Blogger Post Plugin"] = "Abilita il plugin Blogger";
-$a->strings["Blogger username"] = "Blogger username";
-$a->strings["Blogger password"] = "Blogger password";
-$a->strings["Blogger API URL"] = "Blogger API URL";
-$a->strings["Post to Blogger by default"] = "";
-$a->strings["Post to Posterous"] = "Invia a Posterous";
-$a->strings["Posterous Post Settings"] = "Impostazioni di invio a Posterous";
-$a->strings["Enable Posterous Post Plugin"] = "Abilita il plugin di invio a Posterous";
-$a->strings["Posterous login"] = "Posterous login";
-$a->strings["Posterous password"] = "Posterous password";
-$a->strings["Posterous site ID"] = "";
-$a->strings["Posterous API token"] = "";
-$a->strings["Post to Posterous by default"] = "Invia sempre a Posterous";
-$a->strings["Theme settings"] = "Impostazioni tema";
-$a->strings["Set resize level for images in posts and comments (width and height)"] = "";
-$a->strings["Set font-size for posts and comments"] = "";
-$a->strings["Set theme width"] = "";
-$a->strings["Color scheme"] = "Schema colori";
-$a->strings["Your posts and conversations"] = "I tuoi messaggi e le tue conversazioni";
-$a->strings["Your profile page"] = "Pagina del tuo profilo";
-$a->strings["Your contacts"] = "";
-$a->strings["Your photos"] = "Le tue foto";
-$a->strings["Your events"] = "I tuoi eventi";
-$a->strings["Personal notes"] = "Note personali";
-$a->strings["Your personal photos"] = "Le tue foto personali";
-$a->strings["Community Pages"] = "";
-$a->strings["Community Profiles"] = "";
-$a->strings["Last users"] = "Ultimi utenti";
-$a->strings["Last likes"] = "Ultimi \"mi piace\"";
-$a->strings["Last photos"] = "Ultime foto";
-$a->strings["Find Friends"] = "Trova Amici";
-$a->strings["Local Directory"] = "Elenco Locale";
-$a->strings["Similar Interests"] = "Interessi simili";
-$a->strings["Invite Friends"] = "Invita amici";
-$a->strings["Earth Layers"] = "";
-$a->strings["Set zoomfactor for Earth Layers"] = "";
-$a->strings["Set longitude (X) for Earth Layers"] = "";
-$a->strings["Set latitude (Y) for Earth Layers"] = "";
-$a->strings["Help or @NewHere ?"] = "Serve aiuto? Sei nuovo?";
-$a->strings["Connect Services"] = "Servizi di conessione";
-$a->strings["Last Tweets"] = "";
-$a->strings["Set twitter search term"] = "";
-$a->strings["don't show"] = "non mostrare";
-$a->strings["show"] = "mostra";
-$a->strings["Show/hide boxes at right-hand column:"] = "";
-$a->strings["Set line-height for posts and comments"] = "";
-$a->strings["Set resolution for middle column"] = "";
-$a->strings["Set color scheme"] = "";
-$a->strings["Set zoomfactor for Earth Layer"] = "";
-$a->strings["Last tweets"] = "";
-$a->strings["Alignment"] = "Allineamento";
-$a->strings["Left"] = "Sinistra";
-$a->strings["Center"] = "Centrato";
-$a->strings["Set colour scheme"] = "";
-$a->strings["j F, Y"] = "j F Y";
-$a->strings["j F"] = "j F";
-$a->strings["Birthday:"] = "Compleanno:";
-$a->strings["Age:"] = "Età:";
-$a->strings["for %1\$d %2\$s"] = "";
-$a->strings["Tags:"] = "Tag:";
-$a->strings["Religion:"] = "Religione:";
-$a->strings["Hobbies/Interests:"] = "Hobby/Interessi:";
-$a->strings["Contact information and Social Networks:"] = "Informazioni su contatti e social network:";
-$a->strings["Musical interests:"] = "Interessi musicali:";
-$a->strings["Books, literature:"] = "Libri, letteratura:";
-$a->strings["Television:"] = "Televisione:";
-$a->strings["Film/dance/culture/entertainment:"] = "Film/danza/cultura/intrattenimento:";
-$a->strings["Love/Romance:"] = "Amore:";
-$a->strings["Work/employment:"] = "Lavoro:";
-$a->strings["School/education:"] = "Scuola:";
-$a->strings["Unknown | Not categorised"] = "Sconosciuto | non categorizzato";
-$a->strings["Block immediately"] = "Blocca immediatamente";
-$a->strings["Shady, spammer, self-marketer"] = "Shady, spammer, self-marketer";
-$a->strings["Known to me, but no opinion"] = "Lo conosco, ma non ho un'opinione particolare";
-$a->strings["OK, probably harmless"] = "E' ok, probabilmente innocuo";
-$a->strings["Reputable, has my trust"] = "Rispettabile, ha la mia fiducia";
-$a->strings["Frequently"] = "Frequentemente";
-$a->strings["Hourly"] = "Ogni ora";
-$a->strings["Twice daily"] = "Due volte al dì";
-$a->strings["OStatus"] = "Ostatus";
-$a->strings["RSS/Atom"] = "RSS / Atom";
-$a->strings["Zot!"] = "Zot!";
-$a->strings["LinkedIn"] = "LinkedIn";
-$a->strings["XMPP/IM"] = "XMPP/IM";
-$a->strings["MySpace"] = "MySpace";
-$a->strings["Male"] = "Maschio";
-$a->strings["Female"] = "Femmina";
-$a->strings["Currently Male"] = "Al momento maschio";
-$a->strings["Currently Female"] = "Al momento femmina";
-$a->strings["Mostly Male"] = "Prevalentemente maschio";
-$a->strings["Mostly Female"] = "Prevalentemente femmina";
-$a->strings["Transgender"] = "Transgender";
-$a->strings["Intersex"] = "Intersex";
-$a->strings["Transsexual"] = "Transessuale";
-$a->strings["Hermaphrodite"] = "Ermafrodito";
-$a->strings["Neuter"] = "Neutro";
-$a->strings["Non-specific"] = "Non specificato";
-$a->strings["Other"] = "Altro";
-$a->strings["Undecided"] = "Indeciso";
-$a->strings["Males"] = "Maschi";
-$a->strings["Females"] = "Femmine";
-$a->strings["Gay"] = "Gay";
-$a->strings["Lesbian"] = "Lesbica";
-$a->strings["No Preference"] = "Nessuna preferenza";
-$a->strings["Bisexual"] = "Bisessuale";
-$a->strings["Autosexual"] = "Autosessuale";
-$a->strings["Abstinent"] = "Astinente";
-$a->strings["Virgin"] = "Vergine";
-$a->strings["Deviant"] = "Deviato";
-$a->strings["Fetish"] = "Fetish";
-$a->strings["Oodles"] = "Un sacco";
-$a->strings["Nonsexual"] = "Asessuato";
-$a->strings["Single"] = "Single";
-$a->strings["Lonely"] = "Solitario";
-$a->strings["Available"] = "Disponibile";
-$a->strings["Unavailable"] = "Non disponibile";
-$a->strings["Has crush"] = "";
-$a->strings["Infatuated"] = "";
-$a->strings["Dating"] = "Disponibile a un incontro";
-$a->strings["Unfaithful"] = "Infedele";
-$a->strings["Sex Addict"] = "Sesso-dipendente";
-$a->strings["Friends"] = "Amici";
-$a->strings["Friends/Benefits"] = "Amici con benefici";
-$a->strings["Casual"] = "Casual";
-$a->strings["Engaged"] = "Impegnato";
-$a->strings["Married"] = "Sposato";
-$a->strings["Imaginarily married"] = "";
-$a->strings["Partners"] = "Partners";
-$a->strings["Cohabiting"] = "Coinquilino";
-$a->strings["Common law"] = "";
-$a->strings["Happy"] = "Felice";
-$a->strings["Not looking"] = "";
-$a->strings["Swinger"] = "Scambista";
-$a->strings["Betrayed"] = "Tradito";
-$a->strings["Separated"] = "Separato";
-$a->strings["Unstable"] = "Instabile";
-$a->strings["Divorced"] = "Divorziato";
-$a->strings["Imaginarily divorced"] = "";
-$a->strings["Widowed"] = "Vedovo";
-$a->strings["Uncertain"] = "Incerto";
-$a->strings["It's complicated"] = "";
-$a->strings["Don't care"] = "Non interessa";
-$a->strings["Ask me"] = "Chiedimelo";
-$a->strings["Starts:"] = "Inizia:";
-$a->strings["Finishes:"] = "Finisce:";
-$a->strings["(no subject)"] = "(nessun oggetto)";
-$a->strings[" on Last.fm"] = "";
-$a->strings["prev"] = "prec";
-$a->strings["first"] = "primo";
-$a->strings["last"] = "ultimo";
-$a->strings["next"] = "succ";
-$a->strings["newer"] = "";
-$a->strings["older"] = "";
-$a->strings["No contacts"] = "Nessun contatto";
-$a->strings["%d Contact"] = array(
- 0 => "%d contatto",
- 1 => "%d contatti",
-);
-$a->strings["poke"] = "";
-$a->strings["poked"] = "";
-$a->strings["ping"] = "";
-$a->strings["pinged"] = "";
-$a->strings["prod"] = "";
-$a->strings["prodded"] = "";
-$a->strings["slap"] = "";
-$a->strings["slapped"] = "";
-$a->strings["finger"] = "";
-$a->strings["fingered"] = "";
-$a->strings["rebuff"] = "";
-$a->strings["rebuffed"] = "";
-$a->strings["happy"] = "";
-$a->strings["sad"] = "";
-$a->strings["mellow"] = "";
-$a->strings["tired"] = "";
-$a->strings["perky"] = "";
-$a->strings["angry"] = "";
-$a->strings["stupified"] = "";
-$a->strings["puzzled"] = "";
-$a->strings["interested"] = "";
-$a->strings["bitter"] = "";
-$a->strings["cheerful"] = "";
-$a->strings["alive"] = "";
-$a->strings["annoyed"] = "";
-$a->strings["anxious"] = "";
-$a->strings["cranky"] = "";
-$a->strings["disturbed"] = "";
-$a->strings["frustrated"] = "";
-$a->strings["motivated"] = "";
-$a->strings["relaxed"] = "";
-$a->strings["surprised"] = "";
-$a->strings["January"] = "Gennaio";
-$a->strings["February"] = "Febbraio";
-$a->strings["March"] = "Marzo";
-$a->strings["April"] = "Aprile";
-$a->strings["May"] = "Maggio";
-$a->strings["June"] = "Giugno";
-$a->strings["July"] = "Luglio";
-$a->strings["August"] = "Agosto";
-$a->strings["September"] = "Settembre";
-$a->strings["October"] = "Ottobre";
-$a->strings["November"] = "Novembre";
-$a->strings["December"] = "Dicembre";
-$a->strings["bytes"] = "bytes";
-$a->strings["Click to open/close"] = "Clicca per aprire/chiudere";
-$a->strings["default"] = "default";
-$a->strings["Select an alternate language"] = "Seleziona una diversa lingua";
-$a->strings["activity"] = "attività";
-$a->strings["post"] = "messaggio";
-$a->strings["Item filed"] = "";
-$a->strings["Sharing notification from Diaspora network"] = "Notifica di condivisione dal network Diaspora*";
-$a->strings["Attachments:"] = "Allegati:";
-$a->strings["view full size"] = "vedi a schermo intero";
-$a->strings["Embedded content"] = "Contenuto incorporato";
-$a->strings["Embedding disabled"] = "Embed disabilitato";
-$a->strings["A deleted group with this name was revived. Existing item permissions <strong>may</strong> apply to this group and any future members. If this is not what you intended, please create another group with a different name."] = "Un gruppo eliminato con questo nome è stato ricreato. I permessi esistenti su un elemento <strong>possono</strong> essere applicati a questo gruppo e tutti i membri futuri. Se questo non è ciò che si intende, si prega di creare un altro gruppo con un nome diverso.";
-$a->strings["Default privacy group for new contacts"] = "";
-$a->strings["Everybody"] = "Tutti";
-$a->strings["edit"] = "modifica";
-$a->strings["Edit group"] = "Modifica gruppo";
-$a->strings["Create a new group"] = "Crea un nuovo gruppo";
-$a->strings["Contacts not in any group"] = "Contatti in nessun gruppo.";
-$a->strings["Logout"] = "Esci";
-$a->strings["End this session"] = "Finisci questa sessione";
-$a->strings["Status"] = "Stato";
-$a->strings["Sign in"] = "Entra";
-$a->strings["Home Page"] = "Home Page";
-$a->strings["Create an account"] = "Crea un account";
-$a->strings["Help and documentation"] = "Guida e documentazione";
-$a->strings["Apps"] = "Applicazioni";
-$a->strings["Addon applications, utilities, games"] = "Applicazioni, utilità e giochi aggiuntivi";
-$a->strings["Search site content"] = "Cerca nel contenuto del sito";
-$a->strings["Conversations on this site"] = "Conversazioni su questo sito";
-$a->strings["Directory"] = "Elenco";
-$a->strings["People directory"] = "Elenco delle persone";
-$a->strings["Conversations from your friends"] = "Conversazioni dai tuoi amici";
-$a->strings["Friend Requests"] = "Richieste di amicizia";
-$a->strings["See all notifications"] = "Vedi tutte le notifiche";
-$a->strings["Mark all system notifications seen"] = "";
-$a->strings["Private mail"] = "Posta privata";
-$a->strings["Inbox"] = "In arrivo";
-$a->strings["Outbox"] = "Inviati";
-$a->strings["Manage"] = "Gestisci";
-$a->strings["Manage other pages"] = "Gestisci altre pagine";
-$a->strings["Profiles"] = "Profili";
-$a->strings["Manage/edit profiles"] = "Gestisci/modifica i profili";
-$a->strings["Manage/edit friends and contacts"] = "Gestisci/modifica amici e contatti";
-$a->strings["Site setup and configuration"] = "Configurazione del sito";
-$a->strings["Nothing new here"] = "Niente di nuovo qui";
-$a->strings["Add New Contact"] = "Aggiungi nuovo contatto";
-$a->strings["Enter address or web location"] = "Inserisci posizione o indirizzo web";
-$a->strings["Example: bob@example.com, http://example.com/barbara"] = "Esempio: bob@example.com, http://example.com/barbara";
-$a->strings["%d invitation available"] = array(
- 0 => "%d invito disponibile",
- 1 => "%d inviti disponibili",
-);
-$a->strings["Find People"] = "Trova persone";
-$a->strings["Enter name or interest"] = "Inserisci un nome o un interesse";
-$a->strings["Connect/Follow"] = "Connetti/segui";
-$a->strings["Examples: Robert Morgenstein, Fishing"] = "Esempi: Mario Rossi, Pesca";
-$a->strings["Random Profile"] = "Profilo causale";
-$a->strings["Networks"] = "Reti";
-$a->strings["All Networks"] = "Tutte le Reti";
-$a->strings["Saved Folders"] = "Cartelle Salvate";
-$a->strings["Everything"] = "Tutto";
-$a->strings["Categories"] = "Categorie";
-$a->strings["Logged out."] = "Uscita effettuata.";
-$a->strings["We encountered a problem while logging in with the OpenID you provided. Please check the correct spelling of the ID."] = "Abbiamo incontrato un problema mentre contattavamo il server OpenID che ci hai fornito. Controlla di averlo scritto giusto.";
-$a->strings["The error message was:"] = "Il messaggio riportato era:";
-$a->strings["Miscellaneous"] = "Varie";
-$a->strings["year"] = "anno";
-$a->strings["month"] = "mese";
-$a->strings["day"] = "giorno";
-$a->strings["never"] = "mai";
-$a->strings["less than a second ago"] = "meno di un secondo fa";
-$a->strings["week"] = "settimana";
-$a->strings["hour"] = "ora";
-$a->strings["hours"] = "ore";
-$a->strings["minute"] = "minuto";
-$a->strings["minutes"] = "minuti";
-$a->strings["second"] = "secondo";
-$a->strings["seconds"] = "secondi";
-$a->strings["%1\$d %2\$s ago"] = "%1\$d %2\$s fa";
-$a->strings["%s's birthday"] = "";
-$a->strings["Happy Birthday %s"] = "";
-$a->strings["From: "] = "Da: ";
-$a->strings["Image/photo"] = "Immagine/foto";
-$a->strings["$1 wrote:"] = "$1 ha scritto:";
-$a->strings["Encrypted content"] = "";
-$a->strings["Cannot locate DNS info for database server '%s'"] = "Non trovo le informazioni DNS per il database server '%s'";
-$a->strings["[no subject]"] = "[nessun oggetto]";
-$a->strings["Visible to everybody"] = "Visibile a tutti";
-$a->strings["Friendica Notification"] = "Notifica Friendica";
-$a->strings["Thank You,"] = "Grazie,";
-$a->strings["%s Administrator"] = "Amministratore %s";
-$a->strings["%s <!item_type!>"] = "%s <!item_type!>";
-$a->strings["[Friendica:Notify] New mail received at %s"] = "[Friendica:Notifica] Nuovo messaggio privato ricevuto su %s";
-$a->strings["%1\$s sent you a new private message at %2\$s."] = "";
-$a->strings["%1\$s sent you %2\$s."] = "";
-$a->strings["a private message"] = "un messaggio privato";
-$a->strings["Please visit %s to view and/or reply to your private messages."] = "Visita %s per vedere e/o rispodere ai tuoi messaggi privati.";
-$a->strings["%1\$s commented on [url=%2\$s]a %3\$s[/url]"] = "";
-$a->strings["%1\$s commented on [url=%2\$s]%3\$s's %4\$s[/url]"] = "";
-$a->strings["%1\$s commented on [url=%2\$s]your %3\$s[/url]"] = "";
-$a->strings["[Friendica:Notify] Comment to conversation #%1\$d by %2\$s"] = "";
-$a->strings["%s commented on an item/conversation you have been following."] = "%s ha commentato un elemento che stavi seguendo.";
-$a->strings["Please visit %s to view and/or reply to the conversation."] = "Visita %s per vedere e/o commentare la conversazione";
-$a->strings["[Friendica:Notify] %s posted to your profile wall"] = "[Friendica:Notifica] %s ha scritto sulla tua bacheca";
-$a->strings["%1\$s posted to your profile wall at %2\$s"] = "";
-$a->strings["%1\$s posted to [url=%2\$s]your wall[/url]"] = "";
-$a->strings["[Friendica:Notify] %s tagged you"] = "[Friendica:Notifica] %s ti ha taggato";
-$a->strings["%1\$s tagged you at %2\$s"] = "";
-$a->strings["%1\$s [url=%2\$s]tagged you[/url]."] = "";
-$a->strings["[Friendica:Notify] %1\$s poked you"] = "";
-$a->strings["%1\$s poked you at %2\$s"] = "";
-$a->strings["%1\$s [url=%2\$s]poked you[/url]."] = "";
-$a->strings["[Friendica:Notify] %s tagged your post"] = "[Friendica:Notifica] %s ha taggato un tuo messaggio";
-$a->strings["%1\$s tagged your post at %2\$s"] = "";
-$a->strings["%1\$s tagged [url=%2\$s]your post[/url]"] = "";
-$a->strings["[Friendica:Notify] Introduction received"] = "[Friendica:Notifica] Hai ricevuto una presentazione";
-$a->strings["You've received an introduction from '%1\$s' at %2\$s"] = "";
-$a->strings["You've received [url=%1\$s]an introduction[/url] from %2\$s."] = "";
-$a->strings["You may visit their profile at %s"] = "Puoi visitare il suo profilo presso %s";
-$a->strings["Please visit %s to approve or reject the introduction."] = "Visita %s per approvare o rifiutare la presentazione.";
-$a->strings["[Friendica:Notify] Friend suggestion received"] = "[Friendica:Notifica] Hai ricevuto un suggerimento di amicizia";
-$a->strings["You've received a friend suggestion from '%1\$s' at %2\$s"] = "";
-$a->strings["You've received [url=%1\$s]a friend suggestion[/url] for %2\$s from %3\$s."] = "";
-$a->strings["Name:"] = "Nome:";
-$a->strings["Photo:"] = "Foto:";
-$a->strings["Please visit %s to approve or reject the suggestion."] = "Visita %s per approvare o rifiutare il suggerimento.";
-$a->strings["Connect URL missing."] = "URL di connessione mancante.";
-$a->strings["This site is not configured to allow communications with other networks."] = "Questo sito non è configurato per permettere la comunicazione con altri network.";
-$a->strings["No compatible communication protocols or feeds were discovered."] = "Non sono stati trovati protocolli di comunicazione o feed compatibili.";
-$a->strings["The profile address specified does not provide adequate information."] = "L'indirizzo del profilo specificato non fornisce adeguate informazioni.";
-$a->strings["An author or name was not found."] = "Non è stato trovato un nome o un autore";
-$a->strings["No browser URL could be matched to this address."] = "Nessun URL puo' essere associato a questo indirizzo.";
-$a->strings["Unable to match @-style Identity Address with a known protocol or email contact."] = "";
-$a->strings["Use mailto: in front of address to force email check."] = "";
-$a->strings["The profile address specified belongs to a network which has been disabled on this site."] = "L'indirizzo del profilo specificato appartiene a un network che è stato disabilitato su questo sito.";
-$a->strings["Limited profile. This person will be unable to receive direct/personal notifications from you."] = "Profilo limitato. Questa persona non sarà in grado di ricevere notifiche personali da te.";
-$a->strings["Unable to retrieve contact information."] = "Impossibile recuperare informazioni sul contatto.";
-$a->strings["following"] = "segue";
-$a->strings["A new person is sharing with you at "] = "Una nuova persona sta condividendo con te da ";
-$a->strings["You have a new follower at "] = "Una nuova persona ti segue su ";
-$a->strings["Archives"] = "";
-$a->strings["An invitation is required."] = "E' richiesto un invito.";
-$a->strings["Invitation could not be verified."] = "L'invito non puo' essere verificato.";
-$a->strings["Invalid OpenID url"] = "Url OpenID non valido";
-$a->strings["Please enter the required information."] = "Inserisci le informazioni richieste.";
-$a->strings["Please use a shorter name."] = "Usa un nome più corto.";
-$a->strings["Name too short."] = "Il nome è troppo corto.";
-$a->strings["That doesn't appear to be your full (First Last) name."] = "Questo non sembra essere il tuo nome completo (Nome Cognome).";
-$a->strings["Your email domain is not among those allowed on this site."] = "Il dominio della tua email non è tra quelli autorizzati su questo sito.";
-$a->strings["Not a valid email address."] = "L'indirizzo email non è valido.";
-$a->strings["Cannot use that email."] = "Non puoi usare quell'email.";
-$a->strings["Your \"nickname\" can only contain \"a-z\", \"0-9\", \"-\", and \"_\", and must also begin with a letter."] = "Il tuo nome utente puo' contenere solo \"a-z\", \"0-9\", \"-\", e \"_\", e deve cominciare con una lettera.";
-$a->strings["Nickname is already registered. Please choose another."] = "Nome utente già registrato. Scegline un altro.";
-$a->strings["Nickname was once registered here and may not be re-used. Please choose another."] = "Questo nome utente stato già registrato. Per favore, sceglierne uno nuovo.";
-$a->strings["SERIOUS ERROR: Generation of security keys failed."] = "ERRORE GRAVE: La generazione delle chiavi di sicurezza è fallita.";
-$a->strings["An error occurred during registration. Please try again."] = "C'è stato un errore durante la registrazione. Prova ancora.";
-$a->strings["An error occurred creating your default profile. Please try again."] = "C'è stato un errore nella creazione del tuo profilo. Prova ancora.";
-$a->strings["Welcome "] = "Ciao";
-$a->strings["Please upload a profile photo."] = "Carica una foto per il profilo.";
-$a->strings["Welcome back "] = "Ciao ";
-$a->strings["The form security token was not correct. This probably happened because the form has been opened for too long (>3 hours) before submitting it."] = "";
-$a->strings["stopped following"] = "";
-$a->strings["Poke"] = "";
-$a->strings["View Status"] = "Visualizza stato";
-$a->strings["View Profile"] = "Visualizza profilo";
-$a->strings["View Photos"] = "Visualizza foto";
-$a->strings["Network Posts"] = "";
-$a->strings["Edit Contact"] = "Modifica contatti";
-$a->strings["Send PM"] = "Invia messaggio privato";
-$a->strings["%1\$s poked %2\$s"] = "";
-$a->strings["post/item"] = "post/elemento";
-$a->strings["%1\$s marked %2\$s's %3\$s as favorite"] = "%1\$s ha segnato il/la %3\$s di %2\$s come preferito";
-$a->strings["Categories:"] = "";
-$a->strings["Filed under:"] = "";
-$a->strings["remove"] = "rimuovi";
-$a->strings["Delete Selected Items"] = "Cancella elementi selezionati";
-$a->strings["%s likes this."] = "Piace a %s.";
-$a->strings["%s doesn't like this."] = "Non piace a %s.";
-$a->strings["<span %1\$s>%2\$d people</span> like this."] = "Piace a <span %1\$s>%2\$d persone</span>.";
-$a->strings["<span %1\$s>%2\$d people</span> don't like this."] = "Non piace a <span %1\$s>%2\$d persone</span>.";
-$a->strings["and"] = "e";
-$a->strings[", and %d other people"] = "e altre %d persone";
-$a->strings["%s like this."] = "Piace a %s.";
-$a->strings["%s don't like this."] = "Non piace a %s.";
-$a->strings["Visible to <strong>everybody</strong>"] = "Visibile a <strong>tutti</strong>";
-$a->strings["Please enter a video link/URL:"] = "Inserisci un collegamento video / URL:";
-$a->strings["Please enter an audio link/URL:"] = "Inserisci un collegamento audio / URL:";
-$a->strings["Tag term:"] = "Tag:";
-$a->strings["Where are you right now?"] = "Dove sei ora?";
-$a->strings["upload photo"] = "carica foto";
-$a->strings["attach file"] = "allega file";
-$a->strings["web link"] = "link web";
-$a->strings["Insert video link"] = "Inserire collegamento video";
-$a->strings["video link"] = "link video";
-$a->strings["Insert audio link"] = "Inserisci collegamento audio";
-$a->strings["audio link"] = "link audio";
-$a->strings["set location"] = "posizione";
-$a->strings["clear location"] = "canc. pos.";
-$a->strings["permissions"] = "permessi";
-$a->strings["Click here to upgrade."] = "";
-$a->strings["This action exceeds the limits set by your subscription plan."] = "";
-$a->strings["This action is not available under your subscription plan."] = "";
-$a->strings["Delete this item?"] = "Cancellare questo elemento?";
-$a->strings["show fewer"] = "mostra di meno";
-$a->strings["Update %s failed. See error logs."] = "";
-$a->strings["Update Error at %s"] = "";
-$a->strings["Create a New Account"] = "Crea un nuovo account";
-$a->strings["Nickname or Email address: "] = "Nome utente o indirizzo email: ";
-$a->strings["Password: "] = "Password: ";
-$a->strings["Or login using OpenID: "] = "O entra con OpenID:";
+$a->strings["Reset"] = "Reimposta";
+$a->strings["Nothing to import."] = "Non c'è niente da importare.";
+$a->strings["Unable to download data from old server"] = "Impossibile importare i dati dal vecchio server";
+$a->strings["Imported file is empty."] = "Il file da importare è vuoto.";
+$a->strings["Cannot create a duplicate channel identifier on this system. Import failed."] = "Non posso creare un canale con un identificativo che già esiste su questo sistema. L'importazione è fallita.";
+$a->strings["Channel clone failed. Import failed."] = "Impossibile clonare il canale. L'importazione è fallita.";
+$a->strings["Cloned channel not found. Import failed."] = "Impossibile trovare il canale clonato. L'importazione è fallita.";
+$a->strings["Import completed."] = "L'importazione è terminata con successo!";
+$a->strings["You must be logged in to use this feature."] = "Per questa funzionalità devi aver effettuato l'accesso.";
+$a->strings["Import Channel"] = "Importa un canale";
+$a->strings["Use this form to import an existing channel from a different server/hub. You may retrieve the channel identity from the old server/hub via the network or provide an export file. Only identity and connections/relationships will be imported. Importation of content is not yet available."] = "Usa questo modulo per importare un tuo canale da un altro server/hub. Puoi scaricare i dati identificativi del canale direttamente dall'altro server/hub oppure tramite un file che hai esportato. Saranno importati solamente l'identità e i contatti. L'importazione dei contenuti non è ancora disponibile.";
+$a->strings["File to Upload"] = "File da caricare";
+$a->strings["Or provide the old server/hub details"] = "Oppure fornisci i dettagli del vecchio server/hub";
+$a->strings["Your old identity address (xyz@example.com)"] = "Il tuo vecchio identificativo (per esempio pippo@esempio.com)";
+$a->strings["Your old login email address"] = "L'email che usavi per accedere sul vecchio server";
+$a->strings["Your old login password"] = "La password per il vecchio server";
+$a->strings["For either option, please choose whether to make this hub your new primary address, or whether your old location should continue this role. You will be able to post from either location, but only one can be marked as the primary location for files, photos, and media."] = "Per ciascuna opzione, scegli se vuoi rendere questo server il tuo indirizzo primario, oppure se preferisci che lo rimanga il vecchio. Potrai pubblicare da entrambi i server, ma solamente uno sarà marcato come primario per i tuoi file, foto, ecc.";
+$a->strings["Make this hub my primary location"] = "Rendi questo server il mio indirizzo primario";
+$a->strings["You have created %1$.0f of %2$.0f allowed channels."] = "Hai creato %1$.0f dei %2$.0f canali permessi.";
+$a->strings["Create a new channel"] = "Crea un nuovo canale";
+$a->strings["Channel Manager"] = "Gestione canali";
+$a->strings["Current Channel"] = "Canale attuale";
+$a->strings["Attach to one of your channels by selecting it."] = "Seleziona il canale a cui vuoi passare.";
+$a->strings["Default Channel"] = "Canale predefinito";
+$a->strings["Make Default"] = "Rendi predefinito";
+$a->strings["Total votes"] = "Totale voti";
+$a->strings["Average Rating"] = "Media";
+$a->strings["Profile Match"] = "Profili corrispondenti";
+$a->strings["No keywords to match. Please add keywords to your default profile."] = "Nessuna parola chiave per le ricerche. Aggiungi parole chiave al tuo profilo predefinito.";
+$a->strings["is interested in:"] = "interessi personali:";
+$a->strings["No matches"] = "Nessun risultato";
+$a->strings["invalid target signature"] = "la firma riscontrata non è valida";
+$a->strings["Name is required"] = "Il nome è obbligatorio";
+$a->strings["Key and Secret are required"] = "Chiave e Segreto sono richiesti";
+$a->strings["Update"] = "Aggiorna";
+$a->strings["Passwords do not match. Password unchanged."] = "Le password non corrispondono. Password non cambiata.";
+$a->strings["Empty passwords are not allowed. Password unchanged."] = "Le password non possono essere vuote. Password non cambiata.";
+$a->strings["Password changed."] = "Password cambiata.";
+$a->strings["Password update failed. Please try again."] = "Aggiornamento password fallito. Prova ancora.";
+$a->strings["Not valid email."] = "Email non valida.";
+$a->strings["Protected email address. Cannot change to that email."] = "È un indirizzo email riservato. Non puoi sceglierlo.";
+$a->strings["System failure storing new email. Please try again."] = "Errore di sistema. Non è stato possibile memorizzare il tuo messaggio, riprova per favore.";
+$a->strings["Settings updated."] = "Impostazioni aggiornate.";
+$a->strings["Add application"] = "Aggiungi una app";
+$a->strings["Name of application"] = "Nome dell'applicazione";
+$a->strings["Consumer Key"] = "Consumer Key";
+$a->strings["Automatically generated - change if desired. Max length 20"] = "Generato automaticamente - è possibile cambiarlo. Lunghezza massima 20";
+$a->strings["Consumer Secret"] = "Consumer Secret";
+$a->strings["Redirect"] = "Redirect";
+$a->strings["Redirect URI - leave blank unless your application specifically requires this"] = "URI ridirezionato - lasciare bianco se non richiesto specificamente dall'applicazione.";
+$a->strings["Icon url"] = "Url icona";
+$a->strings["Optional"] = "Opzionale";
+$a->strings["You can't edit this application."] = "Non puoi modificare questa applicazione.";
+$a->strings["Connected Apps"] = "App connesse";
+$a->strings["Client key starts with"] = "La client key inizia con";
+$a->strings["No name"] = "Nessun nome";
+$a->strings["Remove authorization"] = "Revoca l'autorizzazione";
+$a->strings["No feature settings configured"] = "Non ci sono funzionalità aggiuntive personalizzabili";
+$a->strings["Feature Settings"] = "Impostazioni aggiuntive";
+$a->strings["Account Settings"] = "Impostazioni account";
+$a->strings["Password Settings"] = "Impostazioni password";
+$a->strings["New Password:"] = "Nuova password:";
+$a->strings["Confirm:"] = "Conferma:";
+$a->strings["Leave password fields blank unless changing"] = "Lascia questi campi in bianco per non cambiare la password";
+$a->strings["Email Address:"] = "Indirizzo email:";
+$a->strings["Remove Account"] = "Elimina l'account";
+$a->strings["Warning: This action is permanent and cannot be reversed."] = "Attenzione: questa azione è permanente e non potrà più essere annullata.";
+$a->strings["Off"] = "Off";
+$a->strings["On"] = "On";
+$a->strings["Additional Features"] = "Funzionalità aggiuntive";
+$a->strings["Connector Settings"] = "Impostazioni del connettore";
+$a->strings["Display Settings"] = "Impostazioni grafiche";
+$a->strings["Display Theme:"] = "Tema per monitor:";
+$a->strings["Mobile Theme:"] = "Tema per dispositivi mobili:";
+$a->strings["Update browser every xx seconds"] = "Aggiorna il browser ogni x secondi";
+$a->strings["Minimum of 10 seconds, no maximum"] = "Minimo 10 secondi, nessun limite massimo";
+$a->strings["Maximum number of conversations to load at any time:"] = "Massimo numero di conversazioni da mostrare ogni volta:";
+$a->strings["Maximum of 100 items"] = "Massimo 100";
+$a->strings["Don't show emoticons"] = "Non mostrare le emoticons";
+$a->strings["Nobody except yourself"] = "Nessuno tranne te";
+$a->strings["Only those you specifically allow"] = "Solo chi riceve il mio permesso";
+$a->strings["Anybody in your address book"] = "Chiunque tra i miei contatti";
+$a->strings["Anybody on this website"] = "Chiunque su questo sito";
+$a->strings["Anybody in this network"] = "Chiunque su Red";
+$a->strings["Anybody on the internet"] = "Chiunque su internet";
+$a->strings["Publish your default profile in the network directory"] = "Pubblica il mio profilo predefinito sull'elenco pubblico dei canali";
+$a->strings["Allow us to suggest you as a potential friend to new members?"] = "Vuoi essere suggerito come potenziale amico ai nuovi membri?";
+$a->strings["or"] = "o";
+$a->strings["Your channel address is"] = "L'indirizzo del tuo canale è";
+$a->strings["Channel Settings"] = "Impostazioni del canale";
+$a->strings["Basic Settings"] = "Impostazioni di base";
+$a->strings["Your Timezone:"] = "Il tuo fuso orario:";
+$a->strings["Default Post Location:"] = "Località predefinita:";
+$a->strings["Use Browser Location:"] = "Usa la località rilevata dal browser:";
+$a->strings["Adult Content"] = "Contenuto per adulti";
+$a->strings["This channel publishes adult content."] = "Questo canale pubblica contenuto per adulti.";
+$a->strings["Security and Privacy Settings"] = "Impostazioni di sicurezza e privacy";
+$a->strings["Quick Privacy Settings:"] = "Impostazioni veloci della privacy:";
+$a->strings["Very Public - extremely permissive"] = "Tutto pubblico - molto permissivo";
+$a->strings["Typical - default public, privacy when desired"] = "Normale - tutto sarà pubblico tranne quel che vorrai tu";
+$a->strings["Private - default private, rarely open or public"] = "Privato - i contenuti saranno privati ma, se vorrai, alcuni potrai renderli pubblici";
+$a->strings["Blocked - default blocked to/from everybody"] = "Bloccato - non ci saranno interazioni con altri a meno che tu non voglia";
+$a->strings["Maximum Friend Requests/Day:"] = "Numero massimo giornaliero di richieste di amicizia:";
+$a->strings["May reduce spam activity"] = "Serve e ridurre lo spam";
+$a->strings["Default Post Permissions"] = "Permessi predefiniti per gli articoli";
+$a->strings["Maximum private messages per day from unknown people:"] = "Numero massimo giornaliero di messaggi privati da utenti sconosciuti:";
+$a->strings["Useful to reduce spamming"] = "Serve e ridurre lo spam";
+$a->strings["Notification Settings"] = "Impostazioni di notifica";
+$a->strings["By default post a status message when:"] = "Pubblica un messaggio di stato quando:";
+$a->strings["accepting a friend request"] = "accetto una nuova amicizia";
+$a->strings["joining a forum/community"] = "entro a far parte di un forum";
+$a->strings["making an <em>interesting</em> profile change"] = "faccio un cambiamento <em>interessante</em> al mio profilo";
+$a->strings["Send a notification email when:"] = "Invia una email di notifica quando:";
+$a->strings["You receive an introduction"] = "Ricevi una richiesta di amicizia";
+$a->strings["Your introductions are confirmed"] = "Le tue richieste di amicizia sono state accettate";
+$a->strings["Someone writes on your profile wall"] = "Qualcuno scrive sulla tua bacheca";
+$a->strings["Someone writes a followup comment"] = "Qualcuno scrive un commento a un tuo articolo";
+$a->strings["You receive a private message"] = "Ricevi un messaggio privato";
+$a->strings["You receive a friend suggestion"] = "Ti viene suggerito un amico";
+$a->strings["You are tagged in a post"] = "Sei taggato in un articolo";
+$a->strings["You are poked/prodded/etc. in a post"] = "Ricevi un poke in un articolo";
+$a->strings["Advanced Account/Page Type Settings"] = "Impostazioni avanzate";
+$a->strings["Change the behaviour of this account for special situations"] = "Cambia il funzionamento di questo account in situazioni particolari";
+$a->strings["Unable to lookup recipient."] = "Impossibile associare un destinatario.";
+$a->strings["Unable to communicate with requested channel."] = "Impossibile comunicare con il canale richiesto.";
+$a->strings["Cannot verify requested channel."] = "Impossibile verificare il canale richiesto.";
+$a->strings["Selected channel has private message restrictions. Send failed."] = "Il canale ha delle regole restrittive per la ricezione dei messaggi privati. Invio fallito.";
+$a->strings["Messages"] = "Messaggi";
+$a->strings["Message deleted."] = "Messaggio eliminato.";
+$a->strings["Message recalled."] = "Messaggio revocato.";
+$a->strings["Send Private Message"] = "Invia un messaggio privato";
+$a->strings["To:"] = "A:";
+$a->strings["Subject:"] = "Oggetto:";
+$a->strings["Message not found."] = "Messaggio non trovato.";
+$a->strings["Delete message"] = "Elimina il messaggio";
+$a->strings["Recall message"] = "Revoca il messaggio";
+$a->strings["Message has been recalled."] = "Il messaggio è stato revocato.";
+$a->strings["Private Conversation"] = "Conversazione privata";
+$a->strings["Delete conversation"] = "Elimina la conversazione";
+$a->strings["No secure communications available. You <strong>may</strong> be able to respond from the sender's profile page."] = "Non è disponibile alcun sistema per comunicare in modo sicuro. Puoi verificare se <strong>eventualmente</strong> è possibile rispondere dalla pagina del profilo del mittente.";
+$a->strings["Send Reply"] = "Invia la risposta";
+$a->strings["Item not found"] = "Elemento non trovato";
+$a->strings["Edit Layout"] = "Modifica il layout";
+$a->strings["Insert YouTube video"] = "Inserisci video da YouTube";
+$a->strings["Insert Vorbis [.ogg] video"] = "Inserisci video Vorbis [.ogg]";
+$a->strings["Insert Vorbis [.ogg] audio"] = "Inserisci audio Vorbis [.ogg]";
+$a->strings["Delete Layout"] = "Elimina il layout";
+$a->strings["Image uploaded but image cropping failed."] = "L'immagine è stata caricata, ma il non è stato possibile ritagliarla.";
+$a->strings["Image resize failed."] = "Il ridimensionamento dell'immagine è fallito.";
+$a->strings["Shift-reload the page or clear browser cache if the new photo does not display immediately."] = "Ricarica la pagina con shift+F5 o cancella la cache del browser se la nuova foto non viene mostrata immediatamente.";
+$a->strings["Image exceeds size limit of %d"] = "La dimensione dell'immagine supera il limite di %d";
+$a->strings["Unable to process image."] = "Impossibile elaborare l'immagine.";
+$a->strings["Photo not available."] = "Foto non disponibile.";
+$a->strings["Upload File:"] = "Carica un file:";
+$a->strings["Select a profile:"] = "Seleziona un profilo:";
+$a->strings["Upload Profile Photo"] = "Carica la foto del profilo";
+$a->strings["Upload"] = "Carica";
+$a->strings["skip this step"] = "salta questo passaggio";
+$a->strings["select a photo from your photo albums"] = "seleziona una foto dai tuoi album";
+$a->strings["Crop Image"] = "Ritaglia immagine";
+$a->strings["Please adjust the image cropping for optimum viewing."] = "Ritaglia l'immagine per migliorarne la visualizzazione.";
+$a->strings["Done Editing"] = "Modifica terminata";
+$a->strings["Image uploaded successfully."] = "Immagine caricata con successo.";
+$a->strings["Image upload failed."] = "Il caricamento dell'immagine è fallito.";
+$a->strings["Image size reduction [%s] failed."] = "Il ridimensionamento del'immagine [%s] è fallito.";
+$a->strings["Item is not editable"] = "L'elemento non è modificabile";
+$a->strings["Delete item?"] = "Eliminare questo elemento?";
+$a->strings["Invalid request identifier."] = "L'identificativo della richiesta non è valido.";
+$a->strings["Discard"] = "Rifiuta";
+$a->strings["No more system notifications."] = "Non ci sono nuove notifiche di sistema.";
+$a->strings["System Notifications"] = "Notifiche di sistema";
+$a->strings["Block Name"] = "Nome del riquadro";
+$a->strings["Unable to find your hub."] = "Impossibile raggiungere il tuo hub.";
+$a->strings["Post successful."] = "Inviato!";
+$a->strings["Edit Webpage"] = "Modifica la pagina web";
+$a->strings["Delete webpage?"] = "Vuoi eliminare questa pagina web?";
+$a->strings["Delete Webpage"] = "Elimina la pagina web";
+$a->strings["Access to this profile has been restricted."] = "L'accesso a questo profilo è stato limitato.";
+$a->strings["Poke/Prod"] = "Poke/Prod";
+$a->strings["poke, prod or do other things to somebody"] = "Manda un poke, un prod o altro";
+$a->strings["Recipient"] = "Destinatario";
+$a->strings["Choose what you wish to do to recipient"] = "Scegli cosa vuoi inviare al destinatario";
+$a->strings["Make this post private"] = "Rendi privato questo articolo";
+$a->strings["Wall Photos"] = "Foto della bacheca";
+$a->strings["You must be logged in to see this page."] = "Devi aver effettuato l'accesso per vedere questa pagina.";
+$a->strings["Insufficient permissions. Request redirected to profile page."] = "Permessi insufficienti. Sarà visualizzata la pagina del profilo.";
+$a->strings["Not available."] = "Non disponibile.";
+$a->strings["Community"] = "Comunità";
+$a->strings["No results."] = "Nessun risultato.";
+$a->strings["Contact not found."] = "Contatto non trovato.";
+$a->strings["Friend suggestion sent."] = "Suggerimento di amicizia inviato.";
+$a->strings["Suggest Friends"] = "Suggerisci amici";
+$a->strings["Suggest a friend for %s"] = "Suggerisci un amico a %s";
+$a->strings["Edit Block"] = "Modifica il riquadro";
+$a->strings["Delete Block"] = "Elimina il riquadro";
+$a->strings["Invalid profile identifier."] = "Indentificativo del profilo non valido.";
+$a->strings["Profile Visibility Editor"] = "Modifica la visibilità del profilo";
+$a->strings["Click on a contact to add or remove."] = "Clicca su un contatto per aggiungerlo o rimuoverlo.";
+$a->strings["Visible To"] = "Visibile a";
+$a->strings["All Contacts (with secure profile access)"] = "Tutti i contatti (con accesso fidato al profilo)";
+$a->strings["Version %s"] = "Versione %s";
+$a->strings["Installed plugins/addons/apps:"] = "App e componenti aggiuntivi instalati:";
+$a->strings["No installed plugins/addons/apps"] = "Nessuna app o componente aggiuntivo installato";
+$a->strings["Red"] = "Red";
+$a->strings["This is a hub of the Red Matrix - a global cooperative network of decentralised privacy enhanced websites."] = "Questo è un hub di Red Matrix - una rete cooperativa e decentralizzata di siti con elevato livello di privacy. ";
+$a->strings["Running at web location"] = "In esecuzione sull'indirizzo web";
+$a->strings["Please visit <a href=\"http://getzot.com\">GetZot.com</a> to learn more about the Red Matrix."] = "Visita <a href=\"http://getzot.com\">GetZot.com</a> per scoprire il progetto Red Matrix.";
+$a->strings["Bug reports and issues: please visit"] = "Per segnalare bug e problemi: visita";
+$a->strings["Suggestions, praise, donations, etc. - please email \"redmatrix\" at librelist - dot com"] = "Per consigli, ringraziamenti, donazioni, ecc. - scrivi a \"redmatrix\" at librelist - dot com";
+$a->strings["No suggestions available. If this is a new site, please try again in 24 hours."] = "Nessun suggerimento disponibile. Se questo è un sito nuovo, riprova tra 24 ore.";
+$a->strings["Conversation removed."] = "Conversazione rimossa.";
+$a->strings["No messages."] = "Nessun messaggio.";
+$a->strings["D, d M Y - g:i A"] = "D d M Y - G:i";
+$a->strings["Public Sites"] = "Siti pubblici";
+$a->strings["The listed sites allow public registration into the Red Matrix. All sites in the matrix are interlinked so membership on any of them conveys membership in the matrix as a whole. Some sites may require subscription or provide tiered service plans. The provider links <strong>may</strong> provide additional details."] = "Gli indirizzi elencati permettono la registrazione su Red Matrix. Tutti i siti di questa rete sono interconnessi, quindi essere registrati su uno è come essere registrati ovunque. Alcuni potrebbero richiedere un'iscrizione a pagamento o prevedere tipi diversi di abbonamento. Potrai trovare maggiori informazioni al riguardo visitando ciascun sito.";
+$a->strings["Site URL"] = "URL del sito";
+$a->strings["Access Type"] = "Tipo di accesso";
+$a->strings["Registration Policy"] = "Politica di registrazione";
+$a->strings["Maximum daily site registrations exceeded. Please try again tomorrow."] = "È stato superato il numero massimo giornaliero di registrazioni a questo sito. Riprova domani!";
+$a->strings["Please indicate acceptance of the Terms of Service. Registration failed."] = "Impossibile proseguire. Devi prima accettare le Condizioni d'Uso del servizio.";
+$a->strings["Passwords do not match."] = "Le password non corrispondono.";
+$a->strings["Registration successful. Please check your email for validation instructions."] = "La registrazione è terminata correttamente. Per continuare controlla l'email che ti è stata inviata.";
+$a->strings["Your registration is pending approval by the site owner."] = "La tua richiesta è in attesa di approvazione da parte dell'amministratore del sito.";
+$a->strings["Your registration can not be processed."] = "La tua registrazione non puo' essere acquisita.";
+$a->strings["Registration on this site/hub is by approval only."] = "La registrazione su questo sito è soggetta ad approvazione.";
+$a->strings["<a href=\"pubsites\">Register at another affiliated site/hub</a>"] = "<a href=\"pubsites\">Registrati su un altro server affiliato</a>";
+$a->strings["This site has exceeded the number of allowed daily account registrations. Please try again tomorrow."] = "Questo sito ha superato il numero di registrazioni giornaliere consentite. Prova di nuovo domani.";
+$a->strings["Terms of Service"] = "Condizioni d'Uso";
+$a->strings["I accept the %s for this website"] = "Accetto le %s di questo sito";
+$a->strings["I am over 13 years of age and accept the %s for this website"] = "Ho più di 13 anni e accetto le %s di questo sito";
+$a->strings["Membership on this site is by invitation only."] = "Per registrarsi su questo sito è necessario un invito.";
+$a->strings["Please enter your invitation code"] = "Inserisci il codice dell'invito";
+$a->strings["Your email address"] = "Il tuo indirizzo email";
+$a->strings["Choose a password"] = "Scegli una password";
+$a->strings["Please re-enter your password"] = "Ripeti la password per verifica";
+$a->strings["Please login."] = "Accedi.";
+$a->strings["Remove This Channel"] = "Elimina questo canale";
+$a->strings["This will completely remove this channel from the network. Once this has been done it is not recoverable."] = "Questo comando rimuoverà completamente il canale che stai usando. Una volta fatto non sarà più possibile ripristinarlo.";
+$a->strings["Please enter your password for verification:"] = "Inserisci la tua password per verifica:";
+$a->strings["Remove this channel and all its clones from the network"] = "Rimuovi questo canale e tutti i suoi cloni dalla rete";
+$a->strings["By default only the instance of the channel located on this hub will be removed from the network"] = "L'impostazione predefinita è che sia eliminata solo l'istanza del canale presente su questo hub, non gli eventuali cloni";
+$a->strings["Remove My Account"] = "Elimina il mio account";
+$a->strings["Unable to locate original post."] = "Impossibile trovare il messaggio originale.";
+$a->strings["Empty post discarded."] = "L'articolo vuoto è stato ignorato.";
+$a->strings["Executable content type not permitted to this channel."] = "I contenuti eseguibili non sono permessi su questo canale.";
+$a->strings["System error. Post not saved."] = "Errore di sistema. Articolo non salvato.";
+$a->strings["You have reached your limit of %1$.0f top level posts."] = "Hai raggiunto il limite massimo di %1$.0f articoli sulla pagina principale.";
+$a->strings["You have reached your limit of %1$.0f webpages."] = "Hai raggiunto il limite massimo di %1$.0f pagine web.";
+$a->strings["Mood"] = "Umore";
+$a->strings["Set your current mood and tell your friends"] = "Scegli il tuo umore attuale per mostrarlo agli amici";
+$a->strings["sent you a private message"] = "ti ha inviato un messaggio privato";
+$a->strings["added your channel"] = "ha aggiunto il tuo canale";
+$a->strings["posted an event"] = "ha creato un evento";
+$a->strings["Status: "] = "Stato:";
+$a->strings["Sexual Preference: "] = "Preferenza sessuale:";
+$a->strings["Homepage: "] = "Homepage:";
+$a->strings["Hometown: "] = "Città dove vivo:";
+$a->strings["About: "] = "Informazioni:";
+$a->strings["Keywords: "] = "Parole chiave:";
+$a->strings["Scheme Default"] = "Schema predefinito";
+$a->strings["red"] = "rosso";
+$a->strings["black"] = "nero";
+$a->strings["silver"] = "argento";
+$a->strings["Theme settings"] = "Impostazioni del tema";
+$a->strings["Set scheme"] = "Schema";
+$a->strings["Navigation bar colour"] = "Colore della barra di navigazione";
+$a->strings["Set font-colour for banner"] = "Colore del font del banner";
+$a->strings["Set the background colour"] = "Colore di sfondo";
+$a->strings["Set the background image"] = "Immagine di sfondo";
+$a->strings["Set the background colour of items"] = "Colore di sfondo degli elementi della pagina";
+$a->strings["Set the opacity of items"] = "Opacità degli oggetti";
+$a->strings["Set the basic colour for item icons"] = "Colore di base per le icone";
+$a->strings["Set the hover colour for item icons"] = "Colore per le icone in evidenza";
+$a->strings["Set font-size for the entire application"] = "Dimensione font per tutto il sito";
+$a->strings["Set font-size for posts and comments"] = "Dimensioni del carattere per articoli e commenti";
+$a->strings["Set font-colour for posts and comments"] = "Colore del carattere per articoli e commenti";
+$a->strings["Set radius of corners"] = "Raggio degli angoli stondati";
+$a->strings["Set shadow depth of photos"] = "Profondità dell'ombra delle foto";
+$a->strings["Set maximum width of conversation regions"] = "Larghezza massima delle aree delle conversazioni";
+$a->strings["Set minimum opacity of nav bar - to hide it"] = "Imposta l'opacità minima della barra di navigazione per nasconderla";
+$a->strings["Set size of conversation author photo"] = "Dimensione foto dell'autore della conversazione";
+$a->strings["Set size of followup author photos"] = "Dimensione foto dei partecipanti alla conversazione";
+$a->strings["Sloppy photo albums"] = "Album con foto storte";
+$a->strings["Are you a clean desk or a messy desk person?"] = "La tua scrivania è sempre a posto? Sei una persona disordinata?";
+$a->strings["Schema Default"] = "Schema predefinito";
+$a->strings["Sans-Serif"] = "Sans-Serif";
+$a->strings["Monospace"] = "Monospace";
+$a->strings["Set font face"] = "Tipo di carattere";
+$a->strings["Set iconset"] = "Icone";
+$a->strings["Set big shadow size, default 15px 15px 15px"] = "Ombra grande, predefinita 15px 15px 15px";
+$a->strings["Set small shadow size, default 5px 5px 5px"] = "Ombra piccola, predefinita 5px 5px 5px";
+$a->strings["Set shadow colour, default #000"] = "Colore dell'ombra, predefinito #000";
+$a->strings["Set radius size, default 5px"] = "Raggio degli angoli, predefinito 5px";
+$a->strings["Set line-height for posts and comments"] = "Altezza della riga per articoli e commenti";
+$a->strings["Set background image"] = "Immagine di sfondo";
+$a->strings["Set background colour"] = "Colore di sfondo";
+$a->strings["Set section background image"] = "Immagine di sfondo della sezione";
+$a->strings["Set section background colour"] = "Colore di sfondo della sezione";
+$a->strings["Set colour of items - use hex"] = "Colore degli elementi della pagina - esadecimale";
+$a->strings["Set colour of links - use hex"] = "Colore dei link - esadecimale";
+$a->strings["Set max-width for items. Default 400px"] = "Larghezza massima degli elementi della pagina. Predefinita: 400px";
+$a->strings["Set min-width for items. Default 240px"] = "Larghezza minima degli elementi della pagina. Predefinita: 240px";
+$a->strings["Set the generic content wrapper width. Default 48%"] = "Larghezza di tutta l'area dei contenuti. Predefinita: 48%";
+$a->strings["Set colour of fonts - use hex"] = "Colore dei caratteri - esadecimale";
+$a->strings["Set background-size element"] = "Background-size element";
+$a->strings["Item opacity"] = "Opacità degli elementi della pagina";
+$a->strings["Display post previews only"] = "Mostra le anteprime solo degli articoli";
+$a->strings["Display side bar on channel page"] = "Mostra la colonna laterale sulla pagina del canale";
+$a->strings["Colour of the navigation bar"] = "Colore della barra di navigazione";
+$a->strings["Item float"] = "Float degli oggetti della pagina";
+$a->strings["Left offset of the section element"] = "Spazio a sinistra dell'elemento section";
+$a->strings["Right offset of the section element"] = "Spazio a destra dell'elemento section";
+$a->strings["Section width"] = "Larghezza section";
+$a->strings["Left offset of the aside"] = "Spazio a sinistra del aside";
+$a->strings["Right offset of the aside element"] = "Spazio a destra del aside";
+$a->strings["None"] = "Nessuno";
+$a->strings["Header image"] = "Immagine dell'intestazione";
+$a->strings["Header image only on profile pages"] = "È possibile mettere un'immagine solo nell'intestazione dei profili";
+$a->strings["Update %s failed. See error logs."] = "%s: aggiornamento fallito. Controlla i log di errore.";
+$a->strings["Update Error at %s"] = "Errore di aggiornamento su %s";
+$a->strings["Create an account to access services and applications within the Red Matrix"] = "Registrati per accedere ai servizi e alle applicazioni di Red Matrix";
+$a->strings["Password"] = "Password";
+$a->strings["Remember me"] = "Resta connesso";
$a->strings["Forgot your password?"] = "Hai dimenticato la password?";
-$a->strings["Requested account is not available."] = "";
-$a->strings["Edit profile"] = "Modifica il profilo";
-$a->strings["Message"] = "Messaggio";
-$a->strings["g A l F d"] = "g A l d F";
-$a->strings["F d"] = "d F";
-$a->strings["[today]"] = "[oggi]";
-$a->strings["Birthday Reminders"] = "Promemoria compleanni";
-$a->strings["Birthdays this week:"] = "Compleanni questa settimana:";
-$a->strings["[No description]"] = "[Nessuna descrizione]";
-$a->strings["Event Reminders"] = "Promemoria";
-$a->strings["Events this week:"] = "Eventi di questa settimana:";
-$a->strings["Status Messages and Posts"] = "";
-$a->strings["Profile Details"] = "";
-$a->strings["Events and Calendar"] = "";
-$a->strings["Only You Can See This"] = "";
+$a->strings["permission denied"] = "permesso negato";
+$a->strings["Got Zot?"] = "Hai Zot?";
+$a->strings["toggle mobile"] = "attiva/disattiva versione mobile";
diff --git a/view/it/update_fail_eml.tpl b/view/it/update_fail_eml.tpl
new file mode 100644
index 000000000..a7df8fc2f
--- /dev/null
+++ b/view/it/update_fail_eml.tpl
@@ -0,0 +1,13 @@
+Hey,
+I'm the web server at {{$sitename}};
+
+The Red Matrix developers released update {{$update}} recently,
+but when I tried to install it, something went terribly wrong.
+This needs to be fixed soon and it requires human intervention.
+Please contact a Red developer if you can not figure out how to
+fix it on your own. My database might be invalid.
+
+The error message is '{{$error}}'.
+
+Apologies for the inconvenience,
+ your web server at {{$siteurl}} \ No newline at end of file
diff --git a/view/js/acl.js b/view/js/acl.js
new file mode 100644
index 000000000..84b080de2
--- /dev/null
+++ b/view/js/acl.js
@@ -0,0 +1,270 @@
+function ACL(backend_url, preset){
+ that = this;
+
+ that.url = backend_url;
+
+ that.kp_timer = null;
+
+ if (preset==undefined) preset = [];
+ that.allow_cid = (preset[0] || []);
+ that.allow_gid = (preset[1] || []);
+ that.deny_cid = (preset[2] || []);
+ that.deny_gid = (preset[3] || []);
+ that.group_uids = [];
+ that.nw = 4; //items per row. should be calulated from #acl-list.width
+
+ that.list_content = $("#acl-list-content");
+ that.item_tpl = unescape($(".acl-list-item[rel=acl-template]").html());
+ that.showall = $("#acl-showall");
+
+ if (preset.length==0) that.showall.addClass("selected");
+
+ /*events*/
+ that.showall.click(that.on_showall);
+ $(document).on('click','.acl-button-show',that.on_button_show);
+ $(document).on('click','.acl-button-hide',that.on_button_hide);
+ $("#acl-search").keypress(that.on_search);
+ $("#acl-wrapper").parents("form").submit(that.on_submit);
+
+ /* startup! */
+ that.get(0,100);
+}
+
+ACL.prototype.on_submit = function(){
+ aclfileds = $("#acl-fields").html("");
+ $(that.allow_gid).each(function(i,v){
+ aclfileds.append("<input type='hidden' name='group_allow[]' value='"+v+"'>");
+ });
+ $(that.allow_cid).each(function(i,v){
+ aclfileds.append("<input type='hidden' name='contact_allow[]' value='"+v+"'>");
+ });
+ $(that.deny_gid).each(function(i,v){
+ aclfileds.append("<input type='hidden' name='group_deny[]' value='"+v+"'>");
+ });
+ $(that.deny_cid).each(function(i,v){
+ aclfileds.append("<input type='hidden' name='contact_deny[]' value='"+v+"'>");
+ });
+}
+
+ACL.prototype.search = function(){
+ var srcstr = $("#acl-search").val();
+ that.list_content.html("");
+ that.get(0,100, srcstr);
+}
+
+ACL.prototype.on_search = function(event){
+ if (that.kp_timer) clearTimeout(that.kp_timer);
+ that.kp_timer = setTimeout( that.search, 1000);
+}
+
+ACL.prototype.on_showall = function(event){
+ event.preventDefault()
+ event.stopPropagation();
+
+ if (that.showall.hasClass("selected")){
+ return false;
+ }
+ that.showall.addClass("selected");
+
+ that.allow_cid = [];
+ that.allow_gid = [];
+ that.deny_cid = [];
+ that.deny_gid = [];
+
+ that.update_view();
+
+ return false;
+}
+
+ACL.prototype.on_button_show = function(event){
+ event.preventDefault()
+ event.stopImmediatePropagation()
+ event.stopPropagation();
+
+ /*that.showall.removeClass("selected");
+ $(this).siblings(".acl-button-hide").removeClass("selected");
+ $(this).toggleClass("selected");*/
+
+ that.set_allow($(this).parent().attr('id'));
+
+ return false;
+}
+ACL.prototype.on_button_hide = function(event){
+ event.preventDefault()
+ event.stopImmediatePropagation()
+ event.stopPropagation();
+
+ /*that.showall.removeClass("selected");
+ $(this).siblings(".acl-button-show").removeClass("selected");
+ $(this).toggleClass("selected");*/
+
+ that.set_deny($(this).parent().attr('id'));
+
+ return false;
+}
+
+ACL.prototype.set_allow = function(itemid){
+ type = itemid[0];
+ id = itemid.substr(1);
+ switch(type){
+ case "g":
+ if (that.allow_gid.indexOf(id)<0){
+ that.allow_gid.push(id)
+ }else {
+ that.allow_gid.remove(id);
+ }
+ if (that.deny_gid.indexOf(id)>=0) that.deny_gid.remove(id);
+ break;
+ case "c":
+ if (that.allow_cid.indexOf(id)<0){
+ that.allow_cid.push(id)
+ } else {
+ that.allow_cid.remove(id);
+ }
+ if (that.deny_cid.indexOf(id)>=0) that.deny_cid.remove(id);
+ break;
+ }
+ that.update_view();
+}
+
+ACL.prototype.set_deny = function(itemid){
+ type = itemid[0];
+ id = itemid.substr(1);
+ switch(type){
+ case "g":
+ if (that.deny_gid.indexOf(id)<0){
+ that.deny_gid.push(id)
+ } else {
+ that.deny_gid.remove(id);
+ }
+ if (that.allow_gid.indexOf(id)>=0) that.allow_gid.remove(id);
+ break;
+ case "c":
+ if (that.deny_cid.indexOf(id)<0){
+ that.deny_cid.push(id)
+ } else {
+ that.deny_cid.remove(id);
+ }
+ if (that.allow_cid.indexOf(id)>=0) that.allow_cid.remove(id);
+ break;
+ }
+ that.update_view();
+}
+
+ACL.prototype.update_view = function(){
+ var jotpermslock;
+ var jotpermsunlock;
+ if (document.jotpermslock == null) {
+ jotpermslock = 'lock';
+ } else {
+ jotpermslock = document.jotpermslock;
+ }
+ if (document.jotpermsunlock == null) {
+ jotpermsunlock = 'unlock';
+ } else {
+ jotpermsunlock = document.jotpermsunlock;
+ }
+ if (that.allow_gid.length==0 && that.allow_cid.length==0 &&
+ that.deny_gid.length==0 && that.deny_cid.length==0){
+ that.showall.addClass("selected");
+ /* jot acl */
+ $('#jot-perms-icon').removeClass(jotpermslock).addClass(jotpermsunlock);
+ $('#jot-public').show();
+ $('.profile-jot-net input').attr('disabled', false);
+ if(typeof editor != 'undefined' && editor != false) {
+ $('#profile-jot-desc').html(ispublic);
+ }
+
+ } else {
+ that.showall.removeClass("selected");
+ /* jot acl */
+ $('#jot-perms-icon').removeClass(jotpermsunlock).addClass(jotpermslock);
+ $('#jot-public').hide();
+ $('.profile-jot-net input').attr('disabled', 'disabled');
+ $('#profile-jot-desc').html('&nbsp;');
+ }
+ $("#acl-list-content .acl-list-item").each(function(){
+ $(this).removeClass("groupshow grouphide");
+ });
+
+ $("#acl-list-content .acl-list-item").each(function(){
+ itemid = $(this).attr('id');
+ type = itemid[0];
+ id = itemid.substr(1);
+
+ btshow = $(this).children(".acl-button-show").removeClass("selected");
+ bthide = $(this).children(".acl-button-hide").removeClass("selected");
+
+ switch(type){
+ case "g":
+ var uclass = "";
+ if (that.allow_gid.indexOf(id)>=0){
+ btshow.addClass("selected");
+ bthide.removeClass("selected");
+ uclass="groupshow";
+ }
+ if (that.deny_gid.indexOf(id)>=0){
+ btshow.removeClass("selected");
+ bthide.addClass("selected");
+ uclass="grouphide";
+ }
+
+ $(that.group_uids[id]).each(function(i,v) {
+ if(uclass == "grouphide")
+ $("#c"+v).removeClass("groupshow");
+ if(uclass != "") {
+ var cls = $("#c"+v).attr('class');
+ if( cls == undefined)
+ return true;
+ var hiding = cls.indexOf('grouphide');
+ if(hiding == -1)
+ $("#c"+v).addClass(uclass);
+ }
+ });
+
+ break;
+ case "c":
+ if (that.allow_cid.indexOf(id)>=0){
+ btshow.addClass("selected");
+ bthide.removeClass("selected");
+ }
+ if (that.deny_cid.indexOf(id)>=0){
+ btshow.removeClass("selected");
+ bthide.addClass("selected");
+ }
+ }
+
+ });
+
+}
+
+
+ACL.prototype.get = function(start,count, search){
+ var postdata = {
+ start:start,
+ count:count,
+ search:search,
+ }
+
+ $.ajax({
+ type:'POST',
+ url: that.url,
+ data: postdata,
+ dataType: 'json',
+ success:that.populate
+ });
+}
+
+ACL.prototype.populate = function(data){
+ var height = Math.ceil(data.tot / that.nw) * 42;
+ that.list_content.height(height);
+ $(data.items).each(function(){
+ html = "<div class='acl-list-item {4} {7} {5}' title='{6}' id='{2}{3}'>"+that.item_tpl+"</div>";
+ html = html.format( this.photo, this.name, this.type, this.xid, '', this.self, this.link, this.taggable );
+ if (this.uids!=undefined) that.group_uids[this.id] = this.uids;
+ //console.log(html);
+ that.list_content.append(html);
+ });
+ that.update_view();
+}
+
diff --git a/view/js/ajaxupload.js b/view/js/ajaxupload.js
new file mode 100644
index 000000000..5719f30e0
--- /dev/null
+++ b/view/js/ajaxupload.js
@@ -0,0 +1,720 @@
+/**
+ * AJAX Upload ( http://valums.com/ajax-upload/ )
+ * Copyright (c) Andris Valums
+ * Licensed under the MIT license ( http://valums.com/mit-license/ )
+ * Thanks to Gary Haran, David Mark, Corey Burns and others for contributions.
+ */
+
+(function () {
+ /* global window */
+ /* jslint browser: true, devel: true, undef: true, nomen: true, bitwise: true, regexp: true, newcap: true, immed: true */
+
+ /**
+ * Wrapper for FireBug's console.log
+ */
+ function log(){
+ if (typeof(console) != 'undefined' && typeof(console.log) == 'function'){
+ Array.prototype.unshift.call(arguments, '[Ajax Upload]');
+ console.log( Array.prototype.join.call(arguments, ' '));
+ }
+ }
+
+ /**
+ * Attaches event to a dom element.
+ * @param {Element} el
+ * @param type event name
+ * @param fn callback This refers to the passed element
+ */
+ function addEvent(el, type, fn){
+ if (el.addEventListener) {
+ el.addEventListener(type, fn, false);
+ } else if (el.attachEvent) {
+ el.attachEvent('on' + type, function(){
+ fn.call(el);
+ });
+ } else {
+ throw new Error('not supported or DOM not loaded');
+ }
+ }
+
+ /**
+ * Attaches resize event to a window, limiting
+ * number of event fired. Fires only when encounteres
+ * delay of 100 after series of events.
+ *
+ * Some browsers fire event multiple times when resizing
+ * http://www.quirksmode.org/dom/events/resize.html
+ *
+ * @param fn callback This refers to the passed element
+ */
+ function addResizeEvent(fn){
+ var timeout;
+
+ addEvent(window, 'resize', function(){
+ if (timeout){
+ clearTimeout(timeout);
+ }
+ timeout = setTimeout(fn, 100);
+ });
+ }
+
+ // Get offset adding all offsets, slow fall-back method
+ var getOffsetSlow = function(el){
+ var top = 0, left = 0;
+ do {
+ top += el.offsetTop || 0;
+ left += el.offsetLeft || 0;
+ el = el.offsetParent;
+ } while (el);
+
+ return {
+ left: left,
+ top: top
+ };
+ };
+
+
+
+
+
+ // Needs more testing, will be rewriten for next version
+ // getOffset function copied from jQuery lib (http://jquery.com/)
+ if (document.documentElement.getBoundingClientRect){
+ // Get Offset using getBoundingClientRect
+ // http://ejohn.org/blog/getboundingclientrect-is-awesome/
+ var getOffset = function(el){
+ var box = el.getBoundingClientRect();
+ var doc = el.ownerDocument;
+ var body = doc.body;
+ var docElem = doc.documentElement; // for ie
+ var clientTop = docElem.clientTop || body.clientTop || 0;
+ var clientLeft = docElem.clientLeft || body.clientLeft || 0;
+
+ // In Internet Explorer 7 getBoundingClientRect property is treated as physical,
+ // while others are logical. Make all logical, like in IE8.
+ var zoom = 1;
+ if (body.getBoundingClientRect) {
+ var bound = body.getBoundingClientRect();
+ zoom = (bound.right - bound.left) / body.clientWidth;
+ }
+
+ // some CSS layouts gives 0 width and/or bounding boxes
+ // in this case we fall back to the slow method
+ if (zoom == 0 || body.clientWidth == 0)
+ return getOffsetSlow(el);
+
+ if (zoom > 1) {
+ clientTop = 0;
+ clientLeft = 0;
+ }
+
+ var top = box.top / zoom + (window.pageYOffset || docElem && docElem.scrollTop / zoom || body.scrollTop / zoom) - clientTop, left = box.left / zoom + (window.pageXOffset || docElem && docElem.scrollLeft / zoom || body.scrollLeft / zoom) - clientLeft;
+
+ return {
+ top: top,
+ left: left
+ };
+ };
+ } else {
+// // Get offset adding all offsets
+ // var getOffset = function(el){
+ // var top = 0, left = 0;
+ // do {
+ // top += el.offsetTop || 0;
+ // left += el.offsetLeft || 0;
+ // el = el.offsetParent;
+ // } while (el);
+
+ // return {
+ // left: left,
+ // top: top
+ // };
+ // };
+ var getOffset = getOffsetSlowl
+ }
+
+ /**
+ * Returns left, top, right and bottom properties describing the border-box,
+ * in pixels, with the top-left relative to the body
+ * @param {Element} el
+ * @return {Object} Contains left, top, right,bottom
+ */
+ function getBox(el){
+ var left, right, top, bottom;
+ var offset = getOffset(el);
+ left = offset.left;
+ top = offset.top;
+
+ right = left + el.offsetWidth;
+ bottom = top + el.offsetHeight;
+
+ return {
+ left: left,
+ right: right,
+ top: top,
+ bottom: bottom
+ };
+ }
+
+ /**
+ * Helper that takes object literal
+ * and add all properties to element.style
+ * @param {Element} el
+ * @param {Object} styles
+ */
+ function addStyles(el, styles){
+ for (var name in styles) {
+ if (styles.hasOwnProperty(name)) {
+ el.style[name] = styles[name];
+ }
+ }
+ }
+
+ /**
+ * Function places an absolutely positioned
+ * element on top of the specified element
+ * copying position and dimentions.
+ * @param {Element} from
+ * @param {Element} to
+ */
+ function copyLayout(from, to){
+ var box = getBox(from);
+
+ addStyles(to, {
+ position: 'absolute',
+ left : box.left + 'px',
+ top : box.top + 'px',
+ width : from.offsetWidth + 'px',
+ height : from.offsetHeight + 'px'
+ });
+ to.title = from.title;
+
+ }
+
+ /**
+ * Creates and returns element from html chunk
+ * Uses innerHTML to create an element
+ */
+ var toElement = (function(){
+ var div = document.createElement('div');
+ return function(html){
+ div.innerHTML = html;
+ var el = div.firstChild;
+ return div.removeChild(el);
+ };
+ })();
+
+ /**
+ * Function generates unique id
+ * @return unique id
+ */
+ var getUID = (function(){
+ var id = 0;
+ return function(){
+ return 'ValumsAjaxUpload' + id++;
+ };
+ })();
+
+ /**
+ * Get file name from path
+ * @param {String} file path to file
+ * @return filename
+ */
+ function fileFromPath(file){
+ return file.replace(/.*(\/|\\)/, "");
+ }
+
+ /**
+ * Get file extension lowercase
+ * @param {String} file name
+ * @return file extenstion
+ */
+ function getExt(file){
+ return (-1 !== file.indexOf('.')) ? file.replace(/.*[.]/, '') : '';
+ }
+
+ function hasClass(el, name){
+ var re = new RegExp('\\b' + name + '\\b');
+ return re.test(el.className);
+ }
+ function addClass(el, name){
+ if ( ! hasClass(el, name)){
+ el.className += ' ' + name;
+ }
+ }
+ function removeClass(el, name){
+ var re = new RegExp('\\b' + name + '\\b');
+ el.className = el.className.replace(re, '');
+ }
+
+ function removeNode(el){
+ el.parentNode.removeChild(el);
+ }
+
+ /**
+ * Easy styling and uploading
+ * @constructor
+ * @param button An element you want convert to
+ * upload button. Tested dimentions up to 500x500px
+ * @param {Object} options See defaults below.
+ */
+ window.AjaxUpload = function(button, options){
+ this._settings = {
+ // Location of the server-side upload script
+ action: 'upload.php',
+ // File upload name
+ name: 'userfile',
+ // Additional data to send
+ data: {},
+ // Submit file as soon as it's selected
+ autoSubmit: true,
+ // The type of data that you're expecting back from the server.
+ // html and xml are detected automatically.
+ // Only useful when you are using json data as a response.
+ // Set to "json" in that case.
+ responseType: false,
+ // Class applied to button when mouse is hovered
+ hoverClass: 'hover',
+ // Class applied to button when button is focused
+ focusClass: 'focus',
+ // Class applied to button when AU is disabled
+ disabledClass: 'disabled',
+ // When user selects a file, useful with autoSubmit disabled
+ // You can return false to cancel upload
+ onChange: function(file, extension){
+ },
+ // Callback to fire before file is uploaded
+ // You can return false to cancel upload
+ onSubmit: function(file, extension){
+ },
+ // Fired when file upload is completed
+ // WARNING! DO NOT USE "FALSE" STRING AS A RESPONSE!
+ onComplete: function(file, response){
+ }
+ };
+
+ // Merge the users options with our defaults
+ for (var i in options) {
+ if (options.hasOwnProperty(i)){
+ this._settings[i] = options[i];
+ }
+ }
+
+ // button isn't necessary a dom element
+ if (button.jquery){
+ // jQuery object was passed
+ button = button[0];
+ } else if (typeof button == "string") {
+ if (/^#.*/.test(button)){
+ // If jQuery user passes #elementId don't break it
+ button = button.slice(1);
+ }
+
+ button = document.getElementById(button);
+ }
+
+ if ( ! button || button.nodeType !== 1){
+ throw new Error("Please make sure that you're passing a valid element");
+ }
+
+ if ( button.nodeName.toUpperCase() == 'A'){
+ // disable link
+ addEvent(button, 'click', function(e){
+ if (e && e.preventDefault){
+ e.preventDefault();
+ } else if (window.event){
+ window.event.returnValue = false;
+ }
+ });
+ }
+
+ // DOM element
+ this._button = button;
+ // DOM element
+ this._input = null;
+ // If disabled clicking on button won't do anything
+ this._disabled = false;
+
+ // if the button was disabled before refresh if will remain
+ // disabled in FireFox, let's fix it
+ this.enable();
+
+ this._rerouteClicks();
+ };
+
+ // assigning methods to our class
+ AjaxUpload.prototype = {
+ setData: function(data){
+ this._settings.data = data;
+ },
+ disable: function(){
+ addClass(this._button, this._settings.disabledClass);
+ this._disabled = true;
+
+ var nodeName = this._button.nodeName.toUpperCase();
+ if (nodeName == 'INPUT' || nodeName == 'BUTTON'){
+ this._button.setAttribute('disabled', 'disabled');
+ }
+
+ // hide input
+ if (this._input){
+ // We use visibility instead of display to fix problem with Safari 4
+ // The problem is that the value of input doesn't change if it
+ // has display none when user selects a file
+ this._input.parentNode.style.visibility = 'hidden';
+ }
+ },
+ enable: function(){
+ removeClass(this._button, this._settings.disabledClass);
+ this._button.removeAttribute('disabled');
+ this._disabled = false;
+
+ },
+ /**
+ * Creates invisible file input
+ * that will hover above the button
+ * <div><input type='file' /></div>
+ */
+ _createInput: function(){
+ var self = this;
+
+ var input = document.createElement("input");
+ input.setAttribute('type', 'file');
+ input.setAttribute('name', this._settings.name);
+
+ addStyles(input, {
+ 'position' : 'absolute',
+ // in Opera only 'browse' button
+ // is clickable and it is located at
+ // the right side of the input
+ 'right' : 0,
+ 'margin' : 0,
+ 'padding' : 0,
+ 'fontSize' : '480px',
+ // in Firefox if font-family is set to
+ // 'inherit' the input doesn't work
+ 'fontFamily' : 'sans-serif',
+ 'cursor' : 'pointer'
+ });
+
+ var div = document.createElement("div");
+ addStyles(div, {
+ 'display' : 'block',
+ 'position' : 'absolute',
+ 'overflow' : 'hidden',
+ 'margin' : 0,
+ 'padding' : 0,
+ 'opacity' : 0,
+ // Make sure browse button is in the right side
+ // in Internet Explorer
+ 'direction' : 'ltr',
+ //Max zIndex supported by Opera 9.0-9.2
+ 'zIndex': 2147483583,
+ 'cursor' : 'pointer'
+
+ });
+
+ // Make sure that element opacity exists.
+ // Otherwise use IE filter
+ if ( div.style.opacity !== "0") {
+ if (typeof(div.filters) == 'undefined'){
+ throw new Error('Opacity not supported by the browser');
+ }
+ div.style.filter = "alpha(opacity=0)";
+ }
+
+ addEvent(input, 'change', function(){
+
+ if ( ! input || input.value === ''){
+ return;
+ }
+
+ // Get filename from input, required
+ // as some browsers have path instead of it
+ var file = fileFromPath(input.value);
+
+ if (false === self._settings.onChange.call(self, file, getExt(file))){
+ self._clearInput();
+ return;
+ }
+
+ // Submit form when value is changed
+ if (self._settings.autoSubmit) {
+ self.submit();
+ }
+ });
+
+ addEvent(input, 'mouseover', function(){
+ addClass(self._button, self._settings.hoverClass);
+ });
+
+ addEvent(input, 'mouseout', function(){
+ removeClass(self._button, self._settings.hoverClass);
+ removeClass(self._button, self._settings.focusClass);
+
+ // We use visibility instead of display to fix problem with Safari 4
+ // The problem is that the value of input doesn't change if it
+ // has display none when user selects a file
+ input.parentNode.style.visibility = 'hidden';
+
+ });
+
+ addEvent(input, 'focus', function(){
+ addClass(self._button, self._settings.focusClass);
+ });
+
+ addEvent(input, 'blur', function(){
+ removeClass(self._button, self._settings.focusClass);
+ });
+
+ div.appendChild(input);
+ document.body.appendChild(div);
+
+ this._input = input;
+ },
+ _clearInput : function(){
+ if (!this._input){
+ return;
+ }
+
+ // this._input.value = ''; Doesn't work in IE6
+ removeNode(this._input.parentNode);
+ this._input = null;
+ this._createInput();
+
+ removeClass(this._button, this._settings.hoverClass);
+ removeClass(this._button, this._settings.focusClass);
+ },
+ /**
+ * Function makes sure that when user clicks upload button,
+ * the this._input is clicked instead
+ */
+ _rerouteClicks: function(){
+ var self = this;
+
+ // IE will later display 'access denied' error
+ // if you use using self._input.click()
+ // other browsers just ignore click()
+
+ addEvent(self._button, 'mouseover', function(){
+ if (self._disabled){
+ return;
+ }
+
+ if ( ! self._input){
+ self._createInput();
+ }
+
+ var div = self._input.parentNode;
+ copyLayout(self._button, div);
+ div.style.visibility = 'visible';
+
+ });
+
+
+ // commented because we now hide input on mouseleave
+ /**
+ * When the window is resized the elements
+ * can be misaligned if button position depends
+ * on window size
+ */
+ //addResizeEvent(function(){
+ // if (self._input){
+ // copyLayout(self._button, self._input.parentNode);
+ // }
+ //});
+
+ },
+ /**
+ * Creates iframe with unique name
+ * @return {Element} iframe
+ */
+ _createIframe: function(){
+ // We can't use getTime, because it sometimes return
+ // same value in safari :(
+ var id = getUID();
+
+ // We can't use following code as the name attribute
+ // won't be properly registered in IE6, and new window
+ // on form submit will open
+ // var iframe = document.createElement('iframe');
+ // iframe.setAttribute('name', id);
+
+ var iframe = toElement('<iframe src="javascript:false;" name="' + id + '" />');
+ // src="javascript:false; was added
+ // because it possibly removes ie6 prompt
+ // "This page contains both secure and nonsecure items"
+ // Anyway, it doesn't do any harm.
+ iframe.setAttribute('id', id);
+
+ iframe.style.display = 'none';
+ document.body.appendChild(iframe);
+
+ return iframe;
+ },
+ /**
+ * Creates form, that will be submitted to iframe
+ * @param {Element} iframe Where to submit
+ * @return {Element} form
+ */
+ _createForm: function(iframe){
+ var settings = this._settings;
+
+ // We can't use the following code in IE6
+ // var form = document.createElement('form');
+ // form.setAttribute('method', 'post');
+ // form.setAttribute('enctype', 'multipart/form-data');
+ // Because in this case file won't be attached to request
+ var form = toElement('<form method="post" enctype="multipart/form-data"></form>');
+
+ form.setAttribute('action', settings.action);
+ form.setAttribute('target', iframe.name);
+ form.style.display = 'none';
+ document.body.appendChild(form);
+
+ // Create hidden input element for each data key
+ for (var prop in settings.data) {
+ if (settings.data.hasOwnProperty(prop)){
+ var el = document.createElement("input");
+ el.setAttribute('type', 'hidden');
+ el.setAttribute('name', prop);
+ el.setAttribute('value', settings.data[prop]);
+ form.appendChild(el);
+ }
+ }
+ return form;
+ },
+ /**
+ * Gets response from iframe and fires onComplete event when ready
+ * @param iframe
+ * @param file Filename to use in onComplete callback
+ */
+ _getResponse : function(iframe, file){
+ // getting response
+ var toDeleteFlag = false, self = this, settings = this._settings;
+
+ addEvent(iframe, 'load', function(){
+
+ if (// For Safari
+ iframe.src == "javascript:'%3Chtml%3E%3C/html%3E';" ||
+ // For FF, IE
+ iframe.src == "javascript:'<html></html>';"){
+ // First time around, do not delete.
+ // We reload to blank page, so that reloading main page
+ // does not re-submit the post.
+
+ if (toDeleteFlag) {
+ // Fix busy state in FF3
+ setTimeout(function(){
+ removeNode(iframe);
+ }, 0);
+ }
+
+ return;
+ }
+
+ var doc = iframe.contentDocument ? iframe.contentDocument : window.frames[iframe.id].document;
+
+ // fixing Opera 9.26,10.00
+ if (doc.readyState && doc.readyState != 'complete') {
+ // Opera fires load event multiple times
+ // Even when the DOM is not ready yet
+ // this fix should not affect other browsers
+ return;
+ }
+
+ // fixing Opera 9.64
+ if (doc.body && doc.body.innerHTML == "false") {
+ // In Opera 9.64 event was fired second time
+ // when body.innerHTML changed from false
+ // to server response approx. after 1 sec
+ return;
+ }
+
+ var response;
+
+ if (doc.XMLDocument) {
+ // response is a xml document Internet Explorer property
+ response = doc.XMLDocument;
+ } else if (doc.body){
+ // response is html document or plain text
+ response = doc.body.innerHTML;
+
+ if (settings.responseType && settings.responseType.toLowerCase() == 'json') {
+ // If the document was sent as 'application/javascript' or
+ // 'text/javascript', then the browser wraps the text in a <pre>
+ // tag and performs html encoding on the contents. In this case,
+ // we need to pull the original text content from the text node's
+ // nodeValue property to retrieve the unmangled content.
+ // Note that IE6 only understands text/html
+ if (doc.body.firstChild && doc.body.firstChild.nodeName.toUpperCase() == 'PRE') {
+ doc.normalize();
+ response = doc.body.firstChild.firstChild.nodeValue;
+ }
+
+ if (response) {
+ response = eval("(" + response + ")");
+ } else {
+ response = {};
+ }
+ }
+ } else {
+ // response is a xml document
+ response = doc;
+ }
+
+ settings.onComplete.call(self, file, response);
+
+ // Reload blank page, so that reloading main page
+ // does not re-submit the post. Also, remember to
+ // delete the frame
+ toDeleteFlag = true;
+
+ // Fix IE mixed content issue
+ iframe.src = "javascript:'<html></html>';";
+ });
+ },
+ /**
+ * Upload file contained in this._input
+ */
+ submit: function(){
+ var self = this, settings = this._settings;
+
+ if ( ! this._input || this._input.value === ''){
+ return;
+ }
+
+ var file = fileFromPath(this._input.value);
+
+ // user returned false to cancel upload
+ if (false === settings.onSubmit.call(this, file, getExt(file))){
+ this._clearInput();
+ return;
+ }
+
+ // sending request
+ var iframe = this._createIframe();
+ var form = this._createForm(iframe);
+
+ // assuming following structure
+ // div -> input type='file'
+ removeNode(this._input.parentNode);
+ removeClass(self._button, self._settings.hoverClass);
+ removeClass(self._button, self._settings.focusClass);
+
+ form.appendChild(this._input);
+
+ form.submit();
+
+ // request set, clean up
+ removeNode(form); form = null;
+ removeNode(this._input); this._input = null;
+
+ // Get response from iframe and fire onComplete event when ready
+ this._getResponse(iframe, file);
+
+ // get ready for next request
+ this._createInput();
+ }
+ };
+})();
diff --git a/view/js/autocomplete.js b/view/js/autocomplete.js
new file mode 100644
index 000000000..763ca354d
--- /dev/null
+++ b/view/js/autocomplete.js
@@ -0,0 +1,200 @@
+/**
+ * Friendica people autocomplete
+ *
+ * require jQuery, jquery.textareas
+ */
+
+
+
+function ACPopup(elm,backend_url){
+ this.idsel=-1;
+ this.element = elm;
+ this.searchText="";
+ this.ready=true;
+ this.kp_timer = false;
+ this.url = backend_url;
+
+ var w = 530;
+ var h = 130;
+
+
+ if(typeof elm.editorId == "undefined") {
+ style = $(elm).offset();
+ w = $(elm).width();
+ h = $(elm).height();
+ }
+ else {
+ var container = elm.getContainer();
+ if(typeof container != "undefined") {
+ style = $(container).offset();
+ w = $(container).width();
+ h = $(container).height();
+ }
+ }
+
+ if(! w)
+ w = 530;
+
+ if(! h)
+ h = 130;
+
+ style.top=style.top+h;
+ style.width = w;
+ style.position = 'absolute';
+ /* style['max-height'] = '150px';
+ style.border = '1px solid red';
+ style.background = '#cccccc';
+
+ style.overflow = 'auto';
+ style['z-index'] = '100000';
+ */
+ style.display = 'none';
+
+ this.cont = $("<div class='acpopup'></div>");
+ this.cont.css(style);
+
+ $("body").append(this.cont);
+}
+ACPopup.prototype.close = function(){
+ $(this.cont).remove();
+ this.ready=false;
+}
+ACPopup.prototype.search = function(text){
+ var that = this;
+ this.searchText=text;
+ if (this.kp_timer) clearTimeout(this.kp_timer);
+ this.kp_timer = setTimeout( function(){that._search();}, 500);
+}
+ACPopup.prototype._search = function(){
+ console.log("_search");
+ var that = this;
+ var postdata = {
+ start:0,
+ count:100,
+ search:this.searchText,
+ type:'c',
+ }
+
+ $.ajax({
+ type:'POST',
+ url: this.url,
+ data: postdata,
+ dataType: 'json',
+ success:function(data){
+ that.cont.html("");
+ if (data.tot>0){
+ that.cont.show();
+ $(data.items).each(function(){
+ html = "<img src='{0}' height='16px' width='16px'>{1} ({2})".format(this.photo, this.name, this.nick)
+ that.add(this.taggable, html, this.nick.replace(' ','') + '+' + this.id + ' - ' + this.link);
+ });
+ } else {
+ that.cont.hide();
+ }
+ }
+ });
+
+}
+ACPopup.prototype.add = function(taggable, label, value){
+ var that=this;
+ var elm = $("<div class='acpopupitem " + taggable +"' title='"+value+"'>"+label+"</div>");
+ elm.click(function(e){
+ t = $(this).attr('title').replace(new RegExp(' \- .*'),'');
+ if(typeof(that.element.container) === "undefined") {
+ el=$(that.element);
+ sel = el.getSelection();
+ sel.start = sel.start- that.searchText.length;
+ el.setSelection(sel.start,sel.end).replaceSelectedText(t+' ').collapseSelection(false);
+ that.close();
+ }
+ else {
+ txt = tinyMCE.activeEditor.getContent();
+ // alert(that.searchText + ':' + t);
+ newtxt = txt.replace('@' + that.searchText, '@' + t + ' ');
+ tinyMCE.activeEditor.setContent(newtxt);
+ tinyMCE.activeEditor.focus();
+ that.close();
+ }
+ });
+ $(this.cont).append(elm);
+}
+ACPopup.prototype.onkey = function(event){
+ if (event.keyCode == '13') {
+ if(this.idsel>-1) {
+ this.cont.children()[this.idsel].click();
+ event.preventDefault();
+ }
+ else
+ this.close();
+ }
+ if (event.keyCode == '38') { //cursor up
+ cmax = this.cont.children().size()-1;
+ this.idsel--;
+ if (this.idsel<0) this.idsel=cmax;
+ event.preventDefault();
+ }
+ if (event.keyCode == '40' || event.keyCode == '9') { //cursor down
+ cmax = this.cont.children().size()-1;
+ this.idsel++;
+ if (this.idsel>cmax) this.idsel=0;
+ event.preventDefault();
+ }
+
+ if (event.keyCode == '38' || event.keyCode == '40' || event.keyCode == '9') {
+ this.cont.children().removeClass('selected');
+ $(this.cont.children()[this.idsel]).addClass('selected');
+ }
+
+ if (event.keyCode == '27') { //ESC
+ this.close();
+ }
+}
+
+function ContactAutocomplete(element,backend_url){
+ this.pattern=/@(\!*)([^ \n]+)$/;
+ this.popup=null;
+ var that = this;
+
+ $(element).unbind('keydown');
+ $(element).unbind('keyup');
+
+ $(element).keydown(function(event){
+ if (that.popup!==null) that.popup.onkey(event);
+ });
+
+ $(element).keyup(function(event){
+ cpos = $(this).getSelection();
+ if (cpos.start==cpos.end){
+ match = $(this).val().substring(0,cpos.start).match(that.pattern);
+ if (match!==null){
+ if (that.popup===null){
+ that.popup = new ACPopup(this, backend_url);
+ }
+ if (that.popup.ready && match[2]!==that.popup.searchText) that.popup.search(match[2]);
+ if (!that.popup.ready) that.popup=null;
+
+ } else {
+ if (that.popup!==null) {that.popup.close(); that.popup=null;}
+ }
+
+
+ }
+ });
+
+}
+
+
+/**
+ * jQuery plugin 'contact_autocomplete'
+ */
+(function( $ ){
+ $.fn.contact_autocomplete = function(backend_url) {
+ this.each(function(){
+ new ContactAutocomplete(this, backend_url);
+ });
+ };
+})( jQuery );
+
+
+
+
diff --git a/view/js/crypto.js b/view/js/crypto.js
new file mode 100644
index 000000000..2e6402c62
--- /dev/null
+++ b/view/js/crypto.js
@@ -0,0 +1,291 @@
+
+
+function str_rot13 (str) {
+ // http://kevin.vanzonneveld.net
+ // + original by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)
+ // + improved by: Ates Goral (http://magnetiq.com)
+ // + bugfixed by: Onno Marsman
+ // + improved by: Rafa? Kukawski (http://blog.kukawski.pl)
+ // * example 1: str_rot13('Kevin van Zonneveld');
+ // * returns 1: 'Xriva ina Mbaariryq'
+ // * example 2: str_rot13('Xriva ina Mbaariryq');
+ // * returns 2: 'Kevin van Zonneveld'
+ // * example 3: str_rot13(33);
+ // * returns 3: '33'
+ return (str + '').replace(/[a-z]/gi, function (s) {
+ return String.fromCharCode(s.charCodeAt(0) + (s.toLowerCase() < 'n' ? 13 : -13));
+ });
+}
+
+
+// Arrays for pluggable encryptors/decryptors
+
+var red_encryptors = new Array();
+var red_decryptors = new Array();
+
+// We probably just want the element where the text is and find it ourself. e.g. if
+// there is highlighted text use it, otherwise use the entire text.
+// So the third element may be useless. Fix also in view/tpl/jot.tpl before
+// adding to all the editor templates and enabling the feature
+
+// Should probably do some input sanitising and dealing with bbcode, hiding key text, and displaying
+// results in a lightbox and/or popup form are left as an exercise for the reader.
+
+
+function red_encrypt(alg, elem,text) {
+ var enc_text = '';
+ var newdiv = '';
+
+ if(typeof tinyMCE !== "undefined")
+ tinyMCE.triggerSave(false,true);
+
+ var text = $(elem).val();
+
+ // key and hint need to be localised
+
+ var enc_key = bin2hex(prompt(aStr['passphrase']));
+
+ // If you don't provide a key you get rot13, which doesn't need a key
+ // but consequently isn't secure.
+
+ if(! enc_key)
+ alg = 'rot13';
+
+ if((alg == 'rot13') || (alg == 'triple-rot13'))
+ newdiv = "[crypt alg='rot13']" + str_rot13(text) + '[/crypt]';
+
+ if(alg == 'aes256') {
+
+ // This is the prompt we're going to use when the receiver tries to open it.
+ // Maybe "Grandma's maiden name" or "our secret place" or something.
+
+ var enc_hint = bin2hex(prompt(aStr['passhint']));
+
+ enc_text = CryptoJS.AES.encrypt(text,enc_key);
+
+ encrypted = enc_text.toString();
+
+ newdiv = "[crypt alg='aes256' hint='" + enc_hint + "']" + encrypted + '[/crypt]';
+ }
+ if(alg == 'rabbit') {
+
+ // This is the prompt we're going to use when the receiver tries to open it.
+ // Maybe "Grandma's maiden name" or "our secret place" or something.
+
+ var enc_hint = bin2hex(prompt(aStr['passhint']));
+
+ enc_text = CryptoJS.Rabbit.encrypt(text,enc_key);
+ encrypted = enc_text.toString();
+
+ newdiv = "[crypt alg='rabbit' hint='" + enc_hint + "']" + encrypted + '[/crypt]';
+ }
+ if(alg == '3des') {
+
+ // This is the prompt we're going to use when the receiver tries to open it.
+ // Maybe "Grandma's maiden name" or "our secret place" or something.
+
+ var enc_hint = bin2hex(prompt(aStr['passhint']));
+
+ enc_text = CryptoJS.TripleDES.encrypt(text,enc_key);
+ encrypted = enc_text.toString();
+
+ newdiv = "[crypt alg='3des' hint='" + enc_hint + "']" + encrypted + '[/crypt]';
+ }
+ if((red_encryptors.length) && (! newdiv.length)) {
+ for(var i = 0; i < red_encryptors.length; i ++) {
+ newdiv = red_encryptors[i](alg,text);
+ if(newdiv.length)
+ break;
+ }
+ }
+
+ enc_key = '';
+
+// alert(newdiv);
+
+ // This might be a comment box on a page with a tinymce editor
+ // so check if there is a tinymce editor but also check the display
+ // property of our source element - because a tinymce instance
+ // will have display "none". If a normal textarea such as in a comment
+ // box has display "none" you wouldn't be able to type in it.
+
+ if($(elem).css('display') == 'none' && typeof tinyMCE !== "undefined") {
+ tinyMCE.activeEditor.setContent(newdiv);
+ }
+ else {
+ $(elem).val(newdiv);
+ }
+
+// textarea = document.getElementById(elem);
+// if (document.selection) {
+// textarea.focus();
+// selected = document.selection.createRange();
+// selected.text = newdiv;
+// } else if (textarea.selectionStart || textarea.selectionStart == "0") {
+// var start = textarea.selectionStart;
+// var end = textarea.selectionEnd;
+// textarea.value = textarea.value.substring(0, start) + newdiv + textarea.value.substring(end, textarea.value.length);
+// }
+}
+
+function red_decrypt(alg,hint,text,elem) {
+
+ var dec_text = '';
+
+ if(alg == 'rot13' || alg == 'triple-rot13')
+ dec_text = str_rot13(text);
+ else {
+ var enc_key = bin2hex(prompt((hint.length) ? hex2bin(hint) : aStr['passphrase']));
+ }
+
+ if(alg == 'aes256') {
+ dec_text = CryptoJS.AES.decrypt(text,enc_key);
+ }
+ if(alg == 'rabbit') {
+ dec_text = CryptoJS.Rabbit.decrypt(text,enc_key);
+ }
+ if(alg == '3des') {
+ dec_text = CryptoJS.TripleDES.decrypt(text,enc_key);
+ }
+
+ if((red_decryptors.length) && (! dec_text.length)) {
+ for(var i = 0; i < red_decryptors.length; i ++) {
+ dec_text = red_decryptors[i](alg,text,enc_key);
+ if(dec_text.length)
+ break;
+ }
+ }
+
+ enc_key = '';
+
+ // Not sure whether to drop this back in the conversation display.
+ // It probably needs a lightbox or popup window because any conversation
+ // updates could
+ // wipe out the text and make you re-enter the key if it was in the
+ // conversation. For now we do that so you can read it.
+
+ var dec_result = dec_text.toString(CryptoJS.enc.Utf8);
+ delete dec_text;
+
+ // incorrect decryptions *usually* but don't always have zero length
+ // If the person typo'd let them try again without reloading the page
+ // otherwise they'll have no "padlock" to click to try again.
+
+ if(dec_result.length) {
+ $(elem).html(b2h(dec_result));
+ dec_result = '';
+ }
+}
+
+
+
+
+
+function base64_encode (data) {
+ // http://kevin.vanzonneveld.net
+ // + original by: Tyler Akins (http://rumkin.com)
+ // + improved by: Bayron Guevara
+ // + improved by: Thunder.m
+ // + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
+ // + bugfixed by: Pellentesque Malesuada
+ // + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
+ // + improved by: Rafa? Kukawski (http://kukawski.pl)
+ // * example 1: base64_encode('Kevin van Zonneveld');
+ // * returns 1: 'S2V2aW4gdmFuIFpvbm5ldmVsZA=='
+ // mozilla has this native
+ // - but breaks in 2.0.0.12!
+ //if (typeof this.window['btoa'] === 'function') {
+ // return btoa(data);
+ //}
+ var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
+ var o1, o2, o3, h1, h2, h3, h4, bits, i = 0,
+ ac = 0,
+ enc = "",
+ tmp_arr = [];
+
+ if (!data) {
+ return data;
+ }
+
+ do { // pack three octets into four hexets
+ o1 = data.charCodeAt(i++);
+ o2 = data.charCodeAt(i++);
+ o3 = data.charCodeAt(i++);
+
+ bits = o1 << 16 | o2 << 8 | o3;
+
+ h1 = bits >> 18 & 0x3f;
+ h2 = bits >> 12 & 0x3f;
+ h3 = bits >> 6 & 0x3f;
+ h4 = bits & 0x3f;
+
+ // use hexets to index into b64, and append result to encoded string
+ tmp_arr[ac++] = b64.charAt(h1) + b64.charAt(h2) + b64.charAt(h3) + b64.charAt(h4);
+ } while (i < data.length);
+
+ enc = tmp_arr.join('');
+
+ var r = data.length % 3;
+
+ return (r ? enc.slice(0, r - 3) : enc) + '==='.slice(r || 3);
+
+}
+
+
+function base64_decode (data) {
+ // http://kevin.vanzonneveld.net
+ // + original by: Tyler Akins (http://rumkin.com)
+ // + improved by: Thunder.m
+ // + input by: Aman Gupta
+ // + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
+ // + bugfixed by: Onno Marsman
+ // + bugfixed by: Pellentesque Malesuada
+ // + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
+ // + input by: Brett Zamir (http://brett-zamir.me)
+ // + bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
+ // * example 1: base64_decode('S2V2aW4gdmFuIFpvbm5ldmVsZA==');
+ // * returns 1: 'Kevin van Zonneveld'
+ // mozilla has this native
+ // - but breaks in 2.0.0.12!
+ //if (typeof this.window['atob'] === 'function') {
+ // return atob(data);
+ //}
+ var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
+ var o1, o2, o3, h1, h2, h3, h4, bits, i = 0,
+ ac = 0,
+ dec = "",
+ tmp_arr = [];
+
+ if (!data) {
+ return data;
+ }
+
+ data += '';
+
+ do { // unpack four hexets into three octets using index points in b64
+ h1 = b64.indexOf(data.charAt(i++));
+ h2 = b64.indexOf(data.charAt(i++));
+ h3 = b64.indexOf(data.charAt(i++));
+ h4 = b64.indexOf(data.charAt(i++));
+
+ bits = h1 << 18 | h2 << 12 | h3 << 6 | h4;
+
+ o1 = bits >> 16 & 0xff;
+ o2 = bits >> 8 & 0xff;
+ o3 = bits & 0xff;
+
+ if (h3 == 64) {
+ tmp_arr[ac++] = String.fromCharCode(o1);
+ } else if (h4 == 64) {
+ tmp_arr[ac++] = String.fromCharCode(o1, o2);
+ } else {
+ tmp_arr[ac++] = String.fromCharCode(o1, o2, o3);
+ }
+ } while (i < data.length);
+
+ dec = tmp_arr.join('');
+
+ return dec;
+}
+
+
diff --git a/view/js/icon_translate.js b/view/js/icon_translate.js
new file mode 100644
index 000000000..9e69e0b7d
--- /dev/null
+++ b/view/js/icon_translate.js
@@ -0,0 +1,53 @@
+// Include this file and adjust as necessary for alternate icon sets which use different icon names.
+
+$(document).ready(function() {
+
+ $('.icon-smile').addClass('');
+ $('.icon-star-empty').addClass('');
+ $('.icon-star-full').addClass('');
+ $('.icon-star').addClass('');
+ $('.icon-remove').addClass('');
+ $('.icon-search').addClass('');
+ $('.icon-facetime-video').addClass('');
+ $('.icon-volume-up').addClass('');
+ $('.icon-picture').addClass('');
+ $('.icon-align-justify').addClass('');
+ $('.icon-question').addClass('');
+ $('.icon-ok').addClass('');
+ $('.icon-lock').addClass('');
+ $('.icon-unlock').addClass('');
+ $('.icon-th').addClass('');
+ $('.icon-home').addClass('');
+ $('.icon-envelope').addClass('');
+ $('.icon-calendar').addClass('');
+ $('.icon-user').addClass('');
+ $('.icon-exclamation').addClass('');
+ $('.icon-sitemap').addClass('');
+ $('.icon-cogs').addClass('');
+ $('.icon-paper-clip').addClass('');
+ $('.icon-pencil').addClass('');
+ $('.icon-remove').addClass('');
+ $('.icon-ok').addClass('');
+ $('.icon-folder-close').addClass('');
+ $('.icon-camera').addClass('');
+ $('.icon-paper-clip').addClass('');
+ $('.icon-link').addClass('');
+ $('.icon-eraser').addClass('');
+ $('.icon-key').addClass('');
+ $('.icon-asterisk').addClass('');
+ $('.icon-backward').addClass('');
+ $('.icon-forward').addClass('');
+ $('.icon-external-link').addClass('');
+ $('.icon-eye-open').addClass('');
+ $('.icon-bold').addClass('');
+ $('.icon-italic').addClass('');
+ $('.icon-underline').addClass('');
+ $('.icon-quote-left').addClass('');
+ $('.icon-terminal').addClass('');
+ $('.icon-camera').addClass('');
+ $('.icon-link').addClass('');
+ $('.icon-check-empty').addClass('');
+ $('.icon-check').addClass('');
+ $('.icon-globe').addClass('');
+ $('.icon-circle-blank').addClass('');
+}); \ No newline at end of file
diff --git a/view/js/jquery-compat.js b/view/js/jquery-compat.js
new file mode 100644
index 000000000..7bf912542
--- /dev/null
+++ b/view/js/jquery-compat.js
@@ -0,0 +1,71 @@
+
+// provide jquery.browser so we can get rid of the migration toolkit
+
+jQuery.uaMatch = function( ua ) {
+ ua = ua.toLowerCase();
+
+ var match = /(chrome)[ \/]([\w.]+)/.exec( ua ) ||
+ /(webkit)[ \/]([\w.]+)/.exec( ua ) ||
+ /(opera)(?:.*version|)[ \/]([\w.]+)/.exec( ua ) ||
+ /(msie) ([\w.]+)/.exec( ua ) ||
+ ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec( ua ) ||
+ [];
+
+ return {
+ browser: match[ 1 ] || "",
+ version: match[ 2 ] || "0"
+ };
+};
+
+
+// Don't clobber any existing jQuery.browser in case it's different
+if ( !jQuery.browser ) {
+ matched = jQuery.uaMatch( navigator.userAgent );
+ browser = {};
+
+ if ( matched.browser ) {
+ browser[ matched.browser ] = true;
+ browser.version = matched.version;
+ }
+
+ // Chrome is Webkit, but Webkit is also Safari.
+ if ( browser.chrome ) {
+ browser.webkit = true;
+ } else if ( browser.webkit ) {
+ browser.safari = true;
+ }
+
+ jQuery.browser = browser;
+}
+
+jQuery.fn.toggle = function( fn, fn2 ) {
+
+ // Don't mess with animation or css toggles
+ if ( !jQuery.isFunction( fn ) || !jQuery.isFunction( fn2 ) ) {
+ return oldToggle.apply( this, arguments );
+ }
+
+ // Save reference to arguments for access in closure
+ var args = arguments,
+ guid = fn.guid || jQuery.guid++,
+ i = 0,
+ toggler = function( event ) {
+ // Figure out which function to execute
+ var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i;
+ jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 );
+
+ // Make sure that clicks stop
+ event.preventDefault();
+
+ // and execute the function
+ return args[ lastToggle ].apply( this, arguments ) || false;
+ };
+
+ // link all the functions, so any of them can unbind this click handler
+ toggler.guid = guid;
+ while ( i < args.length ) {
+ args[ i++ ].guid = guid;
+ }
+
+ return this.click( toggler );
+};
diff --git a/view/js/jquery-migrate-1.1.1.js b/view/js/jquery-migrate-1.1.1.js
new file mode 100644
index 000000000..e99f954e6
--- /dev/null
+++ b/view/js/jquery-migrate-1.1.1.js
@@ -0,0 +1,511 @@
+/*!
+ * jQuery Migrate - v1.1.1 - 2013-02-16
+ * https://github.com/jquery/jquery-migrate
+ * Copyright 2005, 2013 jQuery Foundation, Inc. and other contributors; Licensed MIT
+ */
+(function( jQuery, window, undefined ) {
+// See http://bugs.jquery.com/ticket/13335
+// "use strict";
+
+
+var warnedAbout = {};
+
+// List of warnings already given; public read only
+jQuery.migrateWarnings = [];
+
+// Set to true to prevent console output; migrateWarnings still maintained
+// jQuery.migrateMute = false;
+
+// Show a message on the console so devs know we're active
+if ( !jQuery.migrateMute && window.console && console.log ) {
+ console.log("JQMIGRATE: Logging is active");
+}
+
+// Set to false to disable traces that appear with warnings
+if ( jQuery.migrateTrace === undefined ) {
+ jQuery.migrateTrace = true;
+}
+
+// Forget any warnings we've already given; public
+jQuery.migrateReset = function() {
+ warnedAbout = {};
+ jQuery.migrateWarnings.length = 0;
+};
+
+function migrateWarn( msg) {
+ if ( !warnedAbout[ msg ] ) {
+ warnedAbout[ msg ] = true;
+ jQuery.migrateWarnings.push( msg );
+ if ( window.console && console.warn && !jQuery.migrateMute ) {
+ console.warn( "JQMIGRATE: " + msg );
+ if ( jQuery.migrateTrace && console.trace ) {
+ console.trace();
+ }
+ }
+ }
+}
+
+function migrateWarnProp( obj, prop, value, msg ) {
+ if ( Object.defineProperty ) {
+ // On ES5 browsers (non-oldIE), warn if the code tries to get prop;
+ // allow property to be overwritten in case some other plugin wants it
+ try {
+ Object.defineProperty( obj, prop, {
+ configurable: true,
+ enumerable: true,
+ get: function() {
+ migrateWarn( msg );
+ return value;
+ },
+ set: function( newValue ) {
+ migrateWarn( msg );
+ value = newValue;
+ }
+ });
+ return;
+ } catch( err ) {
+ // IE8 is a dope about Object.defineProperty, can't warn there
+ }
+ }
+
+ // Non-ES5 (or broken) browser; just set the property
+ jQuery._definePropertyBroken = true;
+ obj[ prop ] = value;
+}
+
+if ( document.compatMode === "BackCompat" ) {
+ // jQuery has never supported or tested Quirks Mode
+ migrateWarn( "jQuery is not compatible with Quirks Mode" );
+}
+
+
+var attrFn = jQuery( "<input/>", { size: 1 } ).attr("size") && jQuery.attrFn,
+ oldAttr = jQuery.attr,
+ valueAttrGet = jQuery.attrHooks.value && jQuery.attrHooks.value.get ||
+ function() { return null; },
+ valueAttrSet = jQuery.attrHooks.value && jQuery.attrHooks.value.set ||
+ function() { return undefined; },
+ rnoType = /^(?:input|button)$/i,
+ rnoAttrNodeType = /^[238]$/,
+ rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
+ ruseDefault = /^(?:checked|selected)$/i;
+
+// jQuery.attrFn
+migrateWarnProp( jQuery, "attrFn", attrFn || {}, "jQuery.attrFn is deprecated" );
+
+jQuery.attr = function( elem, name, value, pass ) {
+ var lowerName = name.toLowerCase(),
+ nType = elem && elem.nodeType;
+
+ if ( pass ) {
+ // Since pass is used internally, we only warn for new jQuery
+ // versions where there isn't a pass arg in the formal params
+ if ( oldAttr.length < 4 ) {
+ migrateWarn("jQuery.fn.attr( props, pass ) is deprecated");
+ }
+ if ( elem && !rnoAttrNodeType.test( nType ) &&
+ (attrFn ? name in attrFn : jQuery.isFunction(jQuery.fn[name])) ) {
+ return jQuery( elem )[ name ]( value );
+ }
+ }
+
+ // Warn if user tries to set `type`, since it breaks on IE 6/7/8; by checking
+ // for disconnected elements we don't warn on $( "<button>", { type: "button" } ).
+ if ( name === "type" && value !== undefined && rnoType.test( elem.nodeName ) && elem.parentNode ) {
+ migrateWarn("Can't change the 'type' of an input or button in IE 6/7/8");
+ }
+
+ // Restore boolHook for boolean property/attribute synchronization
+ if ( !jQuery.attrHooks[ lowerName ] && rboolean.test( lowerName ) ) {
+ jQuery.attrHooks[ lowerName ] = {
+ get: function( elem, name ) {
+ // Align boolean attributes with corresponding properties
+ // Fall back to attribute presence where some booleans are not supported
+ var attrNode,
+ property = jQuery.prop( elem, name );
+ return property === true || typeof property !== "boolean" &&
+ ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ?
+
+ name.toLowerCase() :
+ undefined;
+ },
+ set: function( elem, value, name ) {
+ var propName;
+ if ( value === false ) {
+ // Remove boolean attributes when set to false
+ jQuery.removeAttr( elem, name );
+ } else {
+ // value is true since we know at this point it's type boolean and not false
+ // Set boolean attributes to the same name and set the DOM property
+ propName = jQuery.propFix[ name ] || name;
+ if ( propName in elem ) {
+ // Only set the IDL specifically if it already exists on the element
+ elem[ propName ] = true;
+ }
+
+ elem.setAttribute( name, name.toLowerCase() );
+ }
+ return name;
+ }
+ };
+
+ // Warn only for attributes that can remain distinct from their properties post-1.9
+ if ( ruseDefault.test( lowerName ) ) {
+ migrateWarn( "jQuery.fn.attr('" + lowerName + "') may use property instead of attribute" );
+ }
+ }
+
+ return oldAttr.call( jQuery, elem, name, value );
+};
+
+// attrHooks: value
+jQuery.attrHooks.value = {
+ get: function( elem, name ) {
+ var nodeName = ( elem.nodeName || "" ).toLowerCase();
+ if ( nodeName === "button" ) {
+ return valueAttrGet.apply( this, arguments );
+ }
+ if ( nodeName !== "input" && nodeName !== "option" ) {
+ migrateWarn("jQuery.fn.attr('value') no longer gets properties");
+ }
+ return name in elem ?
+ elem.value :
+ null;
+ },
+ set: function( elem, value ) {
+ var nodeName = ( elem.nodeName || "" ).toLowerCase();
+ if ( nodeName === "button" ) {
+ return valueAttrSet.apply( this, arguments );
+ }
+ if ( nodeName !== "input" && nodeName !== "option" ) {
+ migrateWarn("jQuery.fn.attr('value', val) no longer sets properties");
+ }
+ // Does not return so that setAttribute is also used
+ elem.value = value;
+ }
+};
+
+
+var matched, browser,
+ oldInit = jQuery.fn.init,
+ oldParseJSON = jQuery.parseJSON,
+ // Note this does NOT include the #9521 XSS fix from 1.7!
+ rquickExpr = /^(?:[^<]*(<[\w\W]+>)[^>]*|#([\w\-]*))$/;
+
+// $(html) "looks like html" rule change
+jQuery.fn.init = function( selector, context, rootjQuery ) {
+ var match;
+
+ if ( selector && typeof selector === "string" && !jQuery.isPlainObject( context ) &&
+ (match = rquickExpr.exec( selector )) && match[1] ) {
+ // This is an HTML string according to the "old" rules; is it still?
+ if ( selector.charAt( 0 ) !== "<" ) {
+ migrateWarn("$(html) HTML strings must start with '<' character");
+ }
+ // Now process using loose rules; let pre-1.8 play too
+ if ( context && context.context ) {
+ // jQuery object as context; parseHTML expects a DOM object
+ context = context.context;
+ }
+ if ( jQuery.parseHTML ) {
+ return oldInit.call( this, jQuery.parseHTML( jQuery.trim(selector), context, true ),
+ context, rootjQuery );
+ }
+ }
+ return oldInit.apply( this, arguments );
+};
+jQuery.fn.init.prototype = jQuery.fn;
+
+// Let $.parseJSON(falsy_value) return null
+jQuery.parseJSON = function( json ) {
+ if ( !json && json !== null ) {
+ migrateWarn("jQuery.parseJSON requires a valid JSON string");
+ return null;
+ }
+ return oldParseJSON.apply( this, arguments );
+};
+
+jQuery.uaMatch = function( ua ) {
+ ua = ua.toLowerCase();
+
+ var match = /(chrome)[ \/]([\w.]+)/.exec( ua ) ||
+ /(webkit)[ \/]([\w.]+)/.exec( ua ) ||
+ /(opera)(?:.*version|)[ \/]([\w.]+)/.exec( ua ) ||
+ /(msie) ([\w.]+)/.exec( ua ) ||
+ ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec( ua ) ||
+ [];
+
+ return {
+ browser: match[ 1 ] || "",
+ version: match[ 2 ] || "0"
+ };
+};
+
+// Don't clobber any existing jQuery.browser in case it's different
+if ( !jQuery.browser ) {
+ matched = jQuery.uaMatch( navigator.userAgent );
+ browser = {};
+
+ if ( matched.browser ) {
+ browser[ matched.browser ] = true;
+ browser.version = matched.version;
+ }
+
+ // Chrome is Webkit, but Webkit is also Safari.
+ if ( browser.chrome ) {
+ browser.webkit = true;
+ } else if ( browser.webkit ) {
+ browser.safari = true;
+ }
+
+ jQuery.browser = browser;
+}
+
+// Warn if the code tries to get jQuery.browser
+migrateWarnProp( jQuery, "browser", jQuery.browser, "jQuery.browser is deprecated" );
+
+jQuery.sub = function() {
+ function jQuerySub( selector, context ) {
+ return new jQuerySub.fn.init( selector, context );
+ }
+ jQuery.extend( true, jQuerySub, this );
+ jQuerySub.superclass = this;
+ jQuerySub.fn = jQuerySub.prototype = this();
+ jQuerySub.fn.constructor = jQuerySub;
+ jQuerySub.sub = this.sub;
+ jQuerySub.fn.init = function init( selector, context ) {
+ if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {
+ context = jQuerySub( context );
+ }
+
+ return jQuery.fn.init.call( this, selector, context, rootjQuerySub );
+ };
+ jQuerySub.fn.init.prototype = jQuerySub.fn;
+ var rootjQuerySub = jQuerySub(document);
+ migrateWarn( "jQuery.sub() is deprecated" );
+ return jQuerySub;
+};
+
+
+// Ensure that $.ajax gets the new parseJSON defined in core.js
+jQuery.ajaxSetup({
+ converters: {
+ "text json": jQuery.parseJSON
+ }
+});
+
+
+var oldFnData = jQuery.fn.data;
+
+jQuery.fn.data = function( name ) {
+ var ret, evt,
+ elem = this[0];
+
+ // Handles 1.7 which has this behavior and 1.8 which doesn't
+ if ( elem && name === "events" && arguments.length === 1 ) {
+ ret = jQuery.data( elem, name );
+ evt = jQuery._data( elem, name );
+ if ( ( ret === undefined || ret === evt ) && evt !== undefined ) {
+ migrateWarn("Use of jQuery.fn.data('events') is deprecated");
+ return evt;
+ }
+ }
+ return oldFnData.apply( this, arguments );
+};
+
+
+var rscriptType = /\/(java|ecma)script/i,
+ oldSelf = jQuery.fn.andSelf || jQuery.fn.addBack;
+
+jQuery.fn.andSelf = function() {
+ migrateWarn("jQuery.fn.andSelf() replaced by jQuery.fn.addBack()");
+ return oldSelf.apply( this, arguments );
+};
+
+// Since jQuery.clean is used internally on older versions, we only shim if it's missing
+if ( !jQuery.clean ) {
+ jQuery.clean = function( elems, context, fragment, scripts ) {
+ // Set context per 1.8 logic
+ context = context || document;
+ context = !context.nodeType && context[0] || context;
+ context = context.ownerDocument || context;
+
+ migrateWarn("jQuery.clean() is deprecated");
+
+ var i, elem, handleScript, jsTags,
+ ret = [];
+
+ jQuery.merge( ret, jQuery.buildFragment( elems, context ).childNodes );
+
+ // Complex logic lifted directly from jQuery 1.8
+ if ( fragment ) {
+ // Special handling of each script element
+ handleScript = function( elem ) {
+ // Check if we consider it executable
+ if ( !elem.type || rscriptType.test( elem.type ) ) {
+ // Detach the script and store it in the scripts array (if provided) or the fragment
+ // Return truthy to indicate that it has been handled
+ return scripts ?
+ scripts.push( elem.parentNode ? elem.parentNode.removeChild( elem ) : elem ) :
+ fragment.appendChild( elem );
+ }
+ };
+
+ for ( i = 0; (elem = ret[i]) != null; i++ ) {
+ // Check if we're done after handling an executable script
+ if ( !( jQuery.nodeName( elem, "script" ) && handleScript( elem ) ) ) {
+ // Append to fragment and handle embedded scripts
+ fragment.appendChild( elem );
+ if ( typeof elem.getElementsByTagName !== "undefined" ) {
+ // handleScript alters the DOM, so use jQuery.merge to ensure snapshot iteration
+ jsTags = jQuery.grep( jQuery.merge( [], elem.getElementsByTagName("script") ), handleScript );
+
+ // Splice the scripts into ret after their former ancestor and advance our index beyond them
+ ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );
+ i += jsTags.length;
+ }
+ }
+ }
+ }
+
+ return ret;
+ };
+}
+
+var eventAdd = jQuery.event.add,
+ eventRemove = jQuery.event.remove,
+ eventTrigger = jQuery.event.trigger,
+ oldToggle = jQuery.fn.toggle,
+ oldLive = jQuery.fn.live,
+ oldDie = jQuery.fn.die,
+ ajaxEvents = "ajaxStart|ajaxStop|ajaxSend|ajaxComplete|ajaxError|ajaxSuccess",
+ rajaxEvent = new RegExp( "\\b(?:" + ajaxEvents + ")\\b" ),
+ rhoverHack = /(?:^|\s)hover(\.\S+|)\b/,
+ hoverHack = function( events ) {
+ if ( typeof( events ) !== "string" || jQuery.event.special.hover ) {
+ return events;
+ }
+ if ( rhoverHack.test( events ) ) {
+ migrateWarn("'hover' pseudo-event is deprecated, use 'mouseenter mouseleave'");
+ }
+ return events && events.replace( rhoverHack, "mouseenter$1 mouseleave$1" );
+ };
+
+// Event props removed in 1.9, put them back if needed; no practical way to warn them
+if ( jQuery.event.props && jQuery.event.props[ 0 ] !== "attrChange" ) {
+ jQuery.event.props.unshift( "attrChange", "attrName", "relatedNode", "srcElement" );
+}
+
+// Undocumented jQuery.event.handle was "deprecated" in jQuery 1.7
+if ( jQuery.event.dispatch ) {
+ migrateWarnProp( jQuery.event, "handle", jQuery.event.dispatch, "jQuery.event.handle is undocumented and deprecated" );
+}
+
+// Support for 'hover' pseudo-event and ajax event warnings
+jQuery.event.add = function( elem, types, handler, data, selector ){
+ if ( elem !== document && rajaxEvent.test( types ) ) {
+ migrateWarn( "AJAX events should be attached to document: " + types );
+ }
+ eventAdd.call( this, elem, hoverHack( types || "" ), handler, data, selector );
+};
+jQuery.event.remove = function( elem, types, handler, selector, mappedTypes ){
+ eventRemove.call( this, elem, hoverHack( types ) || "", handler, selector, mappedTypes );
+};
+
+jQuery.fn.error = function() {
+ var args = Array.prototype.slice.call( arguments, 0);
+ migrateWarn("jQuery.fn.error() is deprecated");
+ args.splice( 0, 0, "error" );
+ if ( arguments.length ) {
+ return this.bind.apply( this, args );
+ }
+ // error event should not bubble to window, although it does pre-1.7
+ this.triggerHandler.apply( this, args );
+ return this;
+};
+
+jQuery.fn.toggle = function( fn, fn2 ) {
+
+ // Don't mess with animation or css toggles
+ if ( !jQuery.isFunction( fn ) || !jQuery.isFunction( fn2 ) ) {
+ return oldToggle.apply( this, arguments );
+ }
+ migrateWarn("jQuery.fn.toggle(handler, handler...) is deprecated");
+
+ // Save reference to arguments for access in closure
+ var args = arguments,
+ guid = fn.guid || jQuery.guid++,
+ i = 0,
+ toggler = function( event ) {
+ // Figure out which function to execute
+ var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i;
+ jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 );
+
+ // Make sure that clicks stop
+ event.preventDefault();
+
+ // and execute the function
+ return args[ lastToggle ].apply( this, arguments ) || false;
+ };
+
+ // link all the functions, so any of them can unbind this click handler
+ toggler.guid = guid;
+ while ( i < args.length ) {
+ args[ i++ ].guid = guid;
+ }
+
+ return this.click( toggler );
+};
+
+jQuery.fn.live = function( types, data, fn ) {
+ migrateWarn("jQuery.fn.live() is deprecated");
+ if ( oldLive ) {
+ return oldLive.apply( this, arguments );
+ }
+ jQuery( this.context ).on( types, this.selector, data, fn );
+ return this;
+};
+
+jQuery.fn.die = function( types, fn ) {
+ migrateWarn("jQuery.fn.die() is deprecated");
+ if ( oldDie ) {
+ return oldDie.apply( this, arguments );
+ }
+ jQuery( this.context ).off( types, this.selector || "**", fn );
+ return this;
+};
+
+// Turn global events into document-triggered events
+jQuery.event.trigger = function( event, data, elem, onlyHandlers ){
+ if ( !elem && !rajaxEvent.test( event ) ) {
+ migrateWarn( "Global events are undocumented and deprecated" );
+ }
+ return eventTrigger.call( this, event, data, elem || document, onlyHandlers );
+};
+jQuery.each( ajaxEvents.split("|"),
+ function( _, name ) {
+ jQuery.event.special[ name ] = {
+ setup: function() {
+ var elem = this;
+
+ // The document needs no shimming; must be !== for oldIE
+ if ( elem !== document ) {
+ jQuery.event.add( document, name + "." + jQuery.guid, function() {
+ jQuery.event.trigger( name, null, elem, true );
+ });
+ jQuery._data( this, name, jQuery.guid++ );
+ }
+ return false;
+ },
+ teardown: function() {
+ if ( this !== document ) {
+ jQuery.event.remove( document, name + "." + jQuery._data( this, name ) );
+ }
+ return false;
+ }
+ };
+ }
+);
+
+
+})( jQuery, window );
diff --git a/js/jquery.htmlstream.js b/view/js/jquery.htmlstream.js
index c62c538f7..c62c538f7 100644
--- a/js/jquery.htmlstream.js
+++ b/view/js/jquery.htmlstream.js
diff --git a/view/js/jquery.js b/view/js/jquery.js
new file mode 100644
index 000000000..006e95310
--- /dev/null
+++ b/view/js/jquery.js
@@ -0,0 +1,5 @@
+/*! jQuery v1.9.1 | (c) 2005, 2012 jQuery Foundation, Inc. | jquery.org/license
+//@ sourceMappingURL=jquery.min.map
+*/(function(e,t){var n,r,i=typeof t,o=e.document,a=e.location,s=e.jQuery,u=e.$,l={},c=[],p="1.9.1",f=c.concat,d=c.push,h=c.slice,g=c.indexOf,m=l.toString,y=l.hasOwnProperty,v=p.trim,b=function(e,t){return new b.fn.init(e,t,r)},x=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,w=/\S+/g,T=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,N=/^(?:(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,k=/^[\],:{}\s]*$/,E=/(?:^|:|,)(?:\s*\[)+/g,S=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,A=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,j=/^-ms-/,D=/-([\da-z])/gi,L=function(e,t){return t.toUpperCase()},H=function(e){(o.addEventListener||"load"===e.type||"complete"===o.readyState)&&(q(),b.ready())},q=function(){o.addEventListener?(o.removeEventListener("DOMContentLoaded",H,!1),e.removeEventListener("load",H,!1)):(o.detachEvent("onreadystatechange",H),e.detachEvent("onload",H))};b.fn=b.prototype={jquery:p,constructor:b,init:function(e,n,r){var i,a;if(!e)return this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:N.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof b?n[0]:n,b.merge(this,b.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:o,!0)),C.test(i[1])&&b.isPlainObject(n))for(i in n)b.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(a=o.getElementById(i[2]),a&&a.parentNode){if(a.id!==i[2])return r.find(e);this.length=1,this[0]=a}return this.context=o,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):b.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),b.makeArray(e,this))},selector:"",length:0,size:function(){return this.length},toArray:function(){return h.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=b.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return b.each(this,e,t)},ready:function(e){return b.ready.promise().done(e),this},slice:function(){return this.pushStack(h.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(b.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:d,sort:[].sort,splice:[].splice},b.fn.init.prototype=b.fn,b.extend=b.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},u=1,l=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},u=2),"object"==typeof s||b.isFunction(s)||(s={}),l===u&&(s=this,--u);l>u;u++)if(null!=(o=arguments[u]))for(i in o)e=s[i],r=o[i],s!==r&&(c&&r&&(b.isPlainObject(r)||(n=b.isArray(r)))?(n?(n=!1,a=e&&b.isArray(e)?e:[]):a=e&&b.isPlainObject(e)?e:{},s[i]=b.extend(c,a,r)):r!==t&&(s[i]=r));return s},b.extend({noConflict:function(t){return e.$===b&&(e.$=u),t&&e.jQuery===b&&(e.jQuery=s),b},isReady:!1,readyWait:1,holdReady:function(e){e?b.readyWait++:b.ready(!0)},ready:function(e){if(e===!0?!--b.readyWait:!b.isReady){if(!o.body)return setTimeout(b.ready);b.isReady=!0,e!==!0&&--b.readyWait>0||(n.resolveWith(o,[b]),b.fn.trigger&&b(o).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===b.type(e)},isArray:Array.isArray||function(e){return"array"===b.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?l[m.call(e)]||"object":typeof e},isPlainObject:function(e){if(!e||"object"!==b.type(e)||e.nodeType||b.isWindow(e))return!1;try{if(e.constructor&&!y.call(e,"constructor")&&!y.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}var r;for(r in e);return r===t||y.call(e,r)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||o;var r=C.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=b.buildFragment([e],t,i),i&&b(i).remove(),b.merge([],r.childNodes))},parseJSON:function(n){return e.JSON&&e.JSON.parse?e.JSON.parse(n):null===n?n:"string"==typeof n&&(n=b.trim(n),n&&k.test(n.replace(S,"@").replace(A,"]").replace(E,"")))?Function("return "+n)():(b.error("Invalid JSON: "+n),t)},parseXML:function(n){var r,i;if(!n||"string"!=typeof n)return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(o){r=t}return r&&r.documentElement&&!r.getElementsByTagName("parsererror").length||b.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&b.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(j,"ms-").replace(D,L)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,a=M(e);if(n){if(a){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(a){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:v&&!v.call("\ufeff\u00a0")?function(e){return null==e?"":v.call(e)}:function(e){return null==e?"":(e+"").replace(T,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(M(Object(e))?b.merge(n,"string"==typeof e?[e]:e):d.call(n,e)),n},inArray:function(e,t,n){var r;if(t){if(g)return g.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,o=0;if("number"==typeof r)for(;r>o;o++)e[i++]=n[o];else while(n[o]!==t)e[i++]=n[o++];return e.length=i,e},grep:function(e,t,n){var r,i=[],o=0,a=e.length;for(n=!!n;a>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,a=M(e),s=[];if(a)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(s[s.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(s[s.length]=r);return f.apply([],s)},guid:1,proxy:function(e,n){var r,i,o;return"string"==typeof n&&(o=e[n],n=e,e=o),b.isFunction(e)?(r=h.call(arguments,2),i=function(){return e.apply(n||this,r.concat(h.call(arguments)))},i.guid=e.guid=e.guid||b.guid++,i):t},access:function(e,n,r,i,o,a,s){var u=0,l=e.length,c=null==r;if("object"===b.type(r)){o=!0;for(u in r)b.access(e,n,u,r[u],!0,a,s)}else if(i!==t&&(o=!0,b.isFunction(i)||(s=!0),c&&(s?(n.call(e,i),n=null):(c=n,n=function(e,t,n){return c.call(b(e),n)})),n))for(;l>u;u++)n(e[u],r,s?i:i.call(e[u],u,n(e[u],r)));return o?e:c?n.call(e):l?n(e[0],r):a},now:function(){return(new Date).getTime()}}),b.ready.promise=function(t){if(!n)if(n=b.Deferred(),"complete"===o.readyState)setTimeout(b.ready);else if(o.addEventListener)o.addEventListener("DOMContentLoaded",H,!1),e.addEventListener("load",H,!1);else{o.attachEvent("onreadystatechange",H),e.attachEvent("onload",H);var r=!1;try{r=null==e.frameElement&&o.documentElement}catch(i){}r&&r.doScroll&&function a(){if(!b.isReady){try{r.doScroll("left")}catch(e){return setTimeout(a,50)}q(),b.ready()}}()}return n.promise(t)},b.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){l["[object "+t+"]"]=t.toLowerCase()});function M(e){var t=e.length,n=b.type(e);return b.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}r=b(o);var _={};function F(e){var t=_[e]={};return b.each(e.match(w)||[],function(e,n){t[n]=!0}),t}b.Callbacks=function(e){e="string"==typeof e?_[e]||F(e):b.extend({},e);var n,r,i,o,a,s,u=[],l=!e.once&&[],c=function(t){for(r=e.memory&&t,i=!0,a=s||0,s=0,o=u.length,n=!0;u&&o>a;a++)if(u[a].apply(t[0],t[1])===!1&&e.stopOnFalse){r=!1;break}n=!1,u&&(l?l.length&&c(l.shift()):r?u=[]:p.disable())},p={add:function(){if(u){var t=u.length;(function i(t){b.each(t,function(t,n){var r=b.type(n);"function"===r?e.unique&&p.has(n)||u.push(n):n&&n.length&&"string"!==r&&i(n)})})(arguments),n?o=u.length:r&&(s=t,c(r))}return this},remove:function(){return u&&b.each(arguments,function(e,t){var r;while((r=b.inArray(t,u,r))>-1)u.splice(r,1),n&&(o>=r&&o--,a>=r&&a--)}),this},has:function(e){return e?b.inArray(e,u)>-1:!(!u||!u.length)},empty:function(){return u=[],this},disable:function(){return u=l=r=t,this},disabled:function(){return!u},lock:function(){return l=t,r||p.disable(),this},locked:function(){return!l},fireWith:function(e,t){return t=t||[],t=[e,t.slice?t.slice():t],!u||i&&!l||(n?l.push(t):c(t)),this},fire:function(){return p.fireWith(this,arguments),this},fired:function(){return!!i}};return p},b.extend({Deferred:function(e){var t=[["resolve","done",b.Callbacks("once memory"),"resolved"],["reject","fail",b.Callbacks("once memory"),"rejected"],["notify","progress",b.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return b.Deferred(function(n){b.each(t,function(t,o){var a=o[0],s=b.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&b.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[a+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?b.extend(e,r):r}},i={};return r.pipe=r.then,b.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=h.call(arguments),r=n.length,i=1!==r||e&&b.isFunction(e.promise)?r:0,o=1===i?e:b.Deferred(),a=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?h.call(arguments):r,n===s?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},s,u,l;if(r>1)for(s=Array(r),u=Array(r),l=Array(r);r>t;t++)n[t]&&b.isFunction(n[t].promise)?n[t].promise().done(a(t,l,n)).fail(o.reject).progress(a(t,u,s)):--i;return i||o.resolveWith(l,n),o.promise()}}),b.support=function(){var t,n,r,a,s,u,l,c,p,f,d=o.createElement("div");if(d.setAttribute("className","t"),d.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",n=d.getElementsByTagName("*"),r=d.getElementsByTagName("a")[0],!n||!r||!n.length)return{};s=o.createElement("select"),l=s.appendChild(o.createElement("option")),a=d.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t={getSetAttribute:"t"!==d.className,leadingWhitespace:3===d.firstChild.nodeType,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/top/.test(r.getAttribute("style")),hrefNormalized:"/a"===r.getAttribute("href"),opacity:/^0.5/.test(r.style.opacity),cssFloat:!!r.style.cssFloat,checkOn:!!a.value,optSelected:l.selected,enctype:!!o.createElement("form").enctype,html5Clone:"<:nav></:nav>"!==o.createElement("nav").cloneNode(!0).outerHTML,boxModel:"CSS1Compat"===o.compatMode,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},a.checked=!0,t.noCloneChecked=a.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!l.disabled;try{delete d.test}catch(h){t.deleteExpando=!1}a=o.createElement("input"),a.setAttribute("value",""),t.input=""===a.getAttribute("value"),a.value="t",a.setAttribute("type","radio"),t.radioValue="t"===a.value,a.setAttribute("checked","t"),a.setAttribute("name","t"),u=o.createDocumentFragment(),u.appendChild(a),t.appendChecked=a.checked,t.checkClone=u.cloneNode(!0).cloneNode(!0).lastChild.checked,d.attachEvent&&(d.attachEvent("onclick",function(){t.noCloneEvent=!1}),d.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})d.setAttribute(c="on"+f,"t"),t[f+"Bubbles"]=c in e||d.attributes[c].expando===!1;return d.style.backgroundClip="content-box",d.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===d.style.backgroundClip,b(function(){var n,r,a,s="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",u=o.getElementsByTagName("body")[0];u&&(n=o.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",u.appendChild(n).appendChild(d),d.innerHTML="<table><tr><td></td><td>t</td></tr></table>",a=d.getElementsByTagName("td"),a[0].style.cssText="padding:0;margin:0;border:0;display:none",p=0===a[0].offsetHeight,a[0].style.display="",a[1].style.display="none",t.reliableHiddenOffsets=p&&0===a[0].offsetHeight,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",t.boxSizing=4===d.offsetWidth,t.doesNotIncludeMarginInBodyOffset=1!==u.offsetTop,e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(d,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(d,null)||{width:"4px"}).width,r=d.appendChild(o.createElement("div")),r.style.cssText=d.style.cssText=s,r.style.marginRight=r.style.width="0",d.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),typeof d.style.zoom!==i&&(d.innerHTML="",d.style.cssText=s+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=3===d.offsetWidth,d.style.display="block",d.innerHTML="<div></div>",d.firstChild.style.width="5px",t.shrinkWrapBlocks=3!==d.offsetWidth,t.inlineBlockNeedsLayout&&(u.style.zoom=1)),u.removeChild(n),n=d=a=r=null)}),n=s=u=l=r=a=null,t}();var O=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,B=/([A-Z])/g;function P(e,n,r,i){if(b.acceptData(e)){var o,a,s=b.expando,u="string"==typeof n,l=e.nodeType,p=l?b.cache:e,f=l?e[s]:e[s]&&s;if(f&&p[f]&&(i||p[f].data)||!u||r!==t)return f||(l?e[s]=f=c.pop()||b.guid++:f=s),p[f]||(p[f]={},l||(p[f].toJSON=b.noop)),("object"==typeof n||"function"==typeof n)&&(i?p[f]=b.extend(p[f],n):p[f].data=b.extend(p[f].data,n)),o=p[f],i||(o.data||(o.data={}),o=o.data),r!==t&&(o[b.camelCase(n)]=r),u?(a=o[n],null==a&&(a=o[b.camelCase(n)])):a=o,a}}function R(e,t,n){if(b.acceptData(e)){var r,i,o,a=e.nodeType,s=a?b.cache:e,u=a?e[b.expando]:b.expando;if(s[u]){if(t&&(o=n?s[u]:s[u].data)){b.isArray(t)?t=t.concat(b.map(t,b.camelCase)):t in o?t=[t]:(t=b.camelCase(t),t=t in o?[t]:t.split(" "));for(r=0,i=t.length;i>r;r++)delete o[t[r]];if(!(n?$:b.isEmptyObject)(o))return}(n||(delete s[u].data,$(s[u])))&&(a?b.cleanData([e],!0):b.support.deleteExpando||s!=s.window?delete s[u]:s[u]=null)}}}b.extend({cache:{},expando:"jQuery"+(p+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(e){return e=e.nodeType?b.cache[e[b.expando]]:e[b.expando],!!e&&!$(e)},data:function(e,t,n){return P(e,t,n)},removeData:function(e,t){return R(e,t)},_data:function(e,t,n){return P(e,t,n,!0)},_removeData:function(e,t){return R(e,t,!0)},acceptData:function(e){if(e.nodeType&&1!==e.nodeType&&9!==e.nodeType)return!1;var t=e.nodeName&&b.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),b.fn.extend({data:function(e,n){var r,i,o=this[0],a=0,s=null;if(e===t){if(this.length&&(s=b.data(o),1===o.nodeType&&!b._data(o,"parsedAttrs"))){for(r=o.attributes;r.length>a;a++)i=r[a].name,i.indexOf("data-")||(i=b.camelCase(i.slice(5)),W(o,i,s[i]));b._data(o,"parsedAttrs",!0)}return s}return"object"==typeof e?this.each(function(){b.data(this,e)}):b.access(this,function(n){return n===t?o?W(o,e,b.data(o,e)):null:(this.each(function(){b.data(this,e,n)}),t)},null,n,arguments.length>1,null,!0)},removeData:function(e){return this.each(function(){b.removeData(this,e)})}});function W(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(B,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:+r+""===r?+r:O.test(r)?b.parseJSON(r):r}catch(o){}b.data(e,n,r)}else r=t}return r}function $(e){var t;for(t in e)if(("data"!==t||!b.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}b.extend({queue:function(e,n,r){var i;return e?(n=(n||"fx")+"queue",i=b._data(e,n),r&&(!i||b.isArray(r)?i=b._data(e,n,b.makeArray(r)):i.push(r)),i||[]):t},dequeue:function(e,t){t=t||"fx";var n=b.queue(e,t),r=n.length,i=n.shift(),o=b._queueHooks(e,t),a=function(){b.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),o.cur=i,i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return b._data(e,n)||b._data(e,n,{empty:b.Callbacks("once memory").add(function(){b._removeData(e,t+"queue"),b._removeData(e,n)})})}}),b.fn.extend({queue:function(e,n){var r=2;return"string"!=typeof e&&(n=e,e="fx",r--),r>arguments.length?b.queue(this[0],e):n===t?this:this.each(function(){var t=b.queue(this,e,n);b._queueHooks(this,e),"fx"===e&&"inprogress"!==t[0]&&b.dequeue(this,e)})},dequeue:function(e){return this.each(function(){b.dequeue(this,e)})},delay:function(e,t){return e=b.fx?b.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,o=b.Deferred(),a=this,s=this.length,u=function(){--i||o.resolveWith(a,[a])};"string"!=typeof e&&(n=e,e=t),e=e||"fx";while(s--)r=b._data(a[s],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(u));return u(),o.promise(n)}});var I,z,X=/[\t\r\n]/g,U=/\r/g,V=/^(?:input|select|textarea|button|object)$/i,Y=/^(?:a|area)$/i,J=/^(?:checked|selected|autofocus|autoplay|async|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped)$/i,G=/^(?:checked|selected)$/i,Q=b.support.getSetAttribute,K=b.support.input;b.fn.extend({attr:function(e,t){return b.access(this,b.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){b.removeAttr(this,e)})},prop:function(e,t){return b.access(this,b.prop,e,t,arguments.length>1)},removeProp:function(e){return e=b.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,o,a=0,s=this.length,u="string"==typeof e&&e;if(b.isFunction(e))return this.each(function(t){b(this).addClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(X," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=b.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,a=0,s=this.length,u=0===arguments.length||"string"==typeof e&&e;if(b.isFunction(e))return this.each(function(t){b(this).removeClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(X," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?b.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e,r="boolean"==typeof t;return b.isFunction(e)?this.each(function(n){b(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var o,a=0,s=b(this),u=t,l=e.match(w)||[];while(o=l[a++])u=r?u:!s.hasClass(o),s[u?"addClass":"removeClass"](o)}else(n===i||"boolean"===n)&&(this.className&&b._data(this,"__className__",this.className),this.className=this.className||e===!1?"":b._data(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(X," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,o=this[0];{if(arguments.length)return i=b.isFunction(e),this.each(function(n){var o,a=b(this);1===this.nodeType&&(o=i?e.call(this,n,a.val()):e,null==o?o="":"number"==typeof o?o+="":b.isArray(o)&&(o=b.map(o,function(e){return null==e?"":e+""})),r=b.valHooks[this.type]||b.valHooks[this.nodeName.toLowerCase()],r&&"set"in r&&r.set(this,o,"value")!==t||(this.value=o))});if(o)return r=b.valHooks[o.type]||b.valHooks[o.nodeName.toLowerCase()],r&&"get"in r&&(n=r.get(o,"value"))!==t?n:(n=o.value,"string"==typeof n?n.replace(U,""):null==n?"":n)}}}),b.extend({valHooks:{option:{get:function(e){var t=e.attributes.value;return!t||t.specified?e.value:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,a=o?null:[],s=o?i+1:r.length,u=0>i?s:o?i:0;for(;s>u;u++)if(n=r[u],!(!n.selected&&u!==i||(b.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&b.nodeName(n.parentNode,"optgroup"))){if(t=b(n).val(),o)return t;a.push(t)}return a},set:function(e,t){var n=b.makeArray(t);return b(e).find("option").each(function(){this.selected=b.inArray(b(this).val(),n)>=0}),n.length||(e.selectedIndex=-1),n}}},attr:function(e,n,r){var o,a,s,u=e.nodeType;if(e&&3!==u&&8!==u&&2!==u)return typeof e.getAttribute===i?b.prop(e,n,r):(a=1!==u||!b.isXMLDoc(e),a&&(n=n.toLowerCase(),o=b.attrHooks[n]||(J.test(n)?z:I)),r===t?o&&a&&"get"in o&&null!==(s=o.get(e,n))?s:(typeof e.getAttribute!==i&&(s=e.getAttribute(n)),null==s?t:s):null!==r?o&&a&&"set"in o&&(s=o.set(e,r,n))!==t?s:(e.setAttribute(n,r+""),r):(b.removeAttr(e,n),t))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(w);if(o&&1===e.nodeType)while(n=o[i++])r=b.propFix[n]||n,J.test(n)?!Q&&G.test(n)?e[b.camelCase("default-"+n)]=e[r]=!1:e[r]=!1:b.attr(e,n,""),e.removeAttribute(Q?n:r)},attrHooks:{type:{set:function(e,t){if(!b.support.radioValue&&"radio"===t&&b.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(e,n,r){var i,o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return a=1!==s||!b.isXMLDoc(e),a&&(n=b.propFix[n]||n,o=b.propHooks[n]),r!==t?o&&"set"in o&&(i=o.set(e,r,n))!==t?i:e[n]=r:o&&"get"in o&&null!==(i=o.get(e,n))?i:e[n]},propHooks:{tabIndex:{get:function(e){var n=e.getAttributeNode("tabindex");return n&&n.specified?parseInt(n.value,10):V.test(e.nodeName)||Y.test(e.nodeName)&&e.href?0:t}}}}),z={get:function(e,n){var r=b.prop(e,n),i="boolean"==typeof r&&e.getAttribute(n),o="boolean"==typeof r?K&&Q?null!=i:G.test(n)?e[b.camelCase("default-"+n)]:!!i:e.getAttributeNode(n);return o&&o.value!==!1?n.toLowerCase():t},set:function(e,t,n){return t===!1?b.removeAttr(e,n):K&&Q||!G.test(n)?e.setAttribute(!Q&&b.propFix[n]||n,n):e[b.camelCase("default-"+n)]=e[n]=!0,n}},K&&Q||(b.attrHooks.value={get:function(e,n){var r=e.getAttributeNode(n);return b.nodeName(e,"input")?e.defaultValue:r&&r.specified?r.value:t},set:function(e,n,r){return b.nodeName(e,"input")?(e.defaultValue=n,t):I&&I.set(e,n,r)}}),Q||(I=b.valHooks.button={get:function(e,n){var r=e.getAttributeNode(n);return r&&("id"===n||"name"===n||"coords"===n?""!==r.value:r.specified)?r.value:t},set:function(e,n,r){var i=e.getAttributeNode(r);return i||e.setAttributeNode(i=e.ownerDocument.createAttribute(r)),i.value=n+="","value"===r||n===e.getAttribute(r)?n:t}},b.attrHooks.contenteditable={get:I.get,set:function(e,t,n){I.set(e,""===t?!1:t,n)}},b.each(["width","height"],function(e,n){b.attrHooks[n]=b.extend(b.attrHooks[n],{set:function(e,r){return""===r?(e.setAttribute(n,"auto"),r):t}})})),b.support.hrefNormalized||(b.each(["href","src","width","height"],function(e,n){b.attrHooks[n]=b.extend(b.attrHooks[n],{get:function(e){var r=e.getAttribute(n,2);return null==r?t:r}})}),b.each(["href","src"],function(e,t){b.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}})),b.support.style||(b.attrHooks.style={get:function(e){return e.style.cssText||t},set:function(e,t){return e.style.cssText=t+""}}),b.support.optSelected||(b.propHooks.selected=b.extend(b.propHooks.selected,{get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}})),b.support.enctype||(b.propFix.enctype="encoding"),b.support.checkOn||b.each(["radio","checkbox"],function(){b.valHooks[this]={get:function(e){return null===e.getAttribute("value")?"on":e.value}}}),b.each(["radio","checkbox"],function(){b.valHooks[this]=b.extend(b.valHooks[this],{set:function(e,n){return b.isArray(n)?e.checked=b.inArray(b(e).val(),n)>=0:t}})});var Z=/^(?:input|select|textarea)$/i,et=/^key/,tt=/^(?:mouse|contextmenu)|click/,nt=/^(?:focusinfocus|focusoutblur)$/,rt=/^([^.]*)(?:\.(.+)|)$/;function it(){return!0}function ot(){return!1}b.event={global:{},add:function(e,n,r,o,a){var s,u,l,c,p,f,d,h,g,m,y,v=b._data(e);if(v){r.handler&&(c=r,r=c.handler,a=c.selector),r.guid||(r.guid=b.guid++),(u=v.events)||(u=v.events={}),(f=v.handle)||(f=v.handle=function(e){return typeof b===i||e&&b.event.triggered===e.type?t:b.event.dispatch.apply(f.elem,arguments)},f.elem=e),n=(n||"").match(w)||[""],l=n.length;while(l--)s=rt.exec(n[l])||[],g=y=s[1],m=(s[2]||"").split(".").sort(),p=b.event.special[g]||{},g=(a?p.delegateType:p.bindType)||g,p=b.event.special[g]||{},d=b.extend({type:g,origType:y,data:o,handler:r,guid:r.guid,selector:a,needsContext:a&&b.expr.match.needsContext.test(a),namespace:m.join(".")},c),(h=u[g])||(h=u[g]=[],h.delegateCount=0,p.setup&&p.setup.call(e,o,m,f)!==!1||(e.addEventListener?e.addEventListener(g,f,!1):e.attachEvent&&e.attachEvent("on"+g,f))),p.add&&(p.add.call(e,d),d.handler.guid||(d.handler.guid=r.guid)),a?h.splice(h.delegateCount++,0,d):h.push(d),b.event.global[g]=!0;e=null}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,p,f,d,h,g,m=b.hasData(e)&&b._data(e);if(m&&(c=m.events)){t=(t||"").match(w)||[""],l=t.length;while(l--)if(s=rt.exec(t[l])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){p=b.event.special[d]||{},d=(r?p.delegateType:p.bindType)||d,f=c[d]||[],s=s[2]&&RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),u=o=f.length;while(o--)a=f[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(f.splice(o,1),a.selector&&f.delegateCount--,p.remove&&p.remove.call(e,a));u&&!f.length&&(p.teardown&&p.teardown.call(e,h,m.handle)!==!1||b.removeEvent(e,d,m.handle),delete c[d])}else for(d in c)b.event.remove(e,d+t[l],n,r,!0);b.isEmptyObject(c)&&(delete m.handle,b._removeData(e,"events"))}},trigger:function(n,r,i,a){var s,u,l,c,p,f,d,h=[i||o],g=y.call(n,"type")?n.type:n,m=y.call(n,"namespace")?n.namespace.split("."):[];if(l=f=i=i||o,3!==i.nodeType&&8!==i.nodeType&&!nt.test(g+b.event.triggered)&&(g.indexOf(".")>=0&&(m=g.split("."),g=m.shift(),m.sort()),u=0>g.indexOf(":")&&"on"+g,n=n[b.expando]?n:new b.Event(g,"object"==typeof n&&n),n.isTrigger=!0,n.namespace=m.join("."),n.namespace_re=n.namespace?RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,n.result=t,n.target||(n.target=i),r=null==r?[n]:b.makeArray(r,[n]),p=b.event.special[g]||{},a||!p.trigger||p.trigger.apply(i,r)!==!1)){if(!a&&!p.noBubble&&!b.isWindow(i)){for(c=p.delegateType||g,nt.test(c+g)||(l=l.parentNode);l;l=l.parentNode)h.push(l),f=l;f===(i.ownerDocument||o)&&h.push(f.defaultView||f.parentWindow||e)}d=0;while((l=h[d++])&&!n.isPropagationStopped())n.type=d>1?c:p.bindType||g,s=(b._data(l,"events")||{})[n.type]&&b._data(l,"handle"),s&&s.apply(l,r),s=u&&l[u],s&&b.acceptData(l)&&s.apply&&s.apply(l,r)===!1&&n.preventDefault();if(n.type=g,!(a||n.isDefaultPrevented()||p._default&&p._default.apply(i.ownerDocument,r)!==!1||"click"===g&&b.nodeName(i,"a")||!b.acceptData(i)||!u||!i[g]||b.isWindow(i))){f=i[u],f&&(i[u]=null),b.event.triggered=g;try{i[g]()}catch(v){}b.event.triggered=t,f&&(i[u]=f)}return n.result}},dispatch:function(e){e=b.event.fix(e);var n,r,i,o,a,s=[],u=h.call(arguments),l=(b._data(this,"events")||{})[e.type]||[],c=b.event.special[e.type]||{};if(u[0]=e,e.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,e)!==!1){s=b.event.handlers.call(this,e,l),n=0;while((o=s[n++])&&!e.isPropagationStopped()){e.currentTarget=o.elem,a=0;while((i=o.handlers[a++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(i.namespace))&&(e.handleObj=i,e.data=i.data,r=((b.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,u),r!==t&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,n){var r,i,o,a,s=[],u=n.delegateCount,l=e.target;if(u&&l.nodeType&&(!e.button||"click"!==e.type))for(;l!=this;l=l.parentNode||this)if(1===l.nodeType&&(l.disabled!==!0||"click"!==e.type)){for(o=[],a=0;u>a;a++)i=n[a],r=i.selector+" ",o[r]===t&&(o[r]=i.needsContext?b(r,this).index(l)>=0:b.find(r,this,null,[l]).length),o[r]&&o.push(i);o.length&&s.push({elem:l,handlers:o})}return n.length>u&&s.push({elem:this,handlers:n.slice(u)}),s},fix:function(e){if(e[b.expando])return e;var t,n,r,i=e.type,a=e,s=this.fixHooks[i];s||(this.fixHooks[i]=s=tt.test(i)?this.mouseHooks:et.test(i)?this.keyHooks:{}),r=s.props?this.props.concat(s.props):this.props,e=new b.Event(a),t=r.length;while(t--)n=r[t],e[n]=a[n];return e.target||(e.target=a.srcElement||o),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,a):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 null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,i,a,s=n.button,u=n.fromElement;return null==e.pageX&&null!=n.clientX&&(i=e.target.ownerDocument||o,a=i.documentElement,r=i.body,e.pageX=n.clientX+(a&&a.scrollLeft||r&&r.scrollLeft||0)-(a&&a.clientLeft||r&&r.clientLeft||0),e.pageY=n.clientY+(a&&a.scrollTop||r&&r.scrollTop||0)-(a&&a.clientTop||r&&r.clientTop||0)),!e.relatedTarget&&u&&(e.relatedTarget=u===e.target?n.toElement:u),e.which||s===t||(e.which=1&s?1:2&s?3:4&s?2:0),e}},special:{load:{noBubble:!0},click:{trigger:function(){return b.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):t}},focus:{trigger:function(){if(this!==o.activeElement&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){return this===o.activeElement&&this.blur?(this.blur(),!1):t},delegateType:"focusout"},beforeunload:{postDispatch:function(e){e.result!==t&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=b.extend(new b.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?b.event.trigger(i,null,t):b.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},b.removeEvent=o.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]===i&&(e[r]=null),e.detachEvent(r,n))},b.Event=function(e,n){return this instanceof b.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?it:ot):this.type=e,n&&b.extend(this,n),this.timeStamp=e&&e.timeStamp||b.now(),this[b.expando]=!0,t):new b.Event(e,n)},b.Event.prototype={isDefaultPrevented:ot,isPropagationStopped:ot,isImmediatePropagationStopped:ot,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=it,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=it,e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=it,this.stopPropagation()}},b.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){b.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;
+return(!i||i!==r&&!b.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),b.support.submitBubbles||(b.event.special.submit={setup:function(){return b.nodeName(this,"form")?!1:(b.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=b.nodeName(n,"input")||b.nodeName(n,"button")?n.form:t;r&&!b._data(r,"submitBubbles")&&(b.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),b._data(r,"submitBubbles",!0))}),t)},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&b.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){return b.nodeName(this,"form")?!1:(b.event.remove(this,"._submit"),t)}}),b.support.changeBubbles||(b.event.special.change={setup:function(){return Z.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(b.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._just_changed=!0)}),b.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),b.event.simulate("change",this,e,!0)})),!1):(b.event.add(this,"beforeactivate._change",function(e){var t=e.target;Z.test(t.nodeName)&&!b._data(t,"changeBubbles")&&(b.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||b.event.simulate("change",this.parentNode,e,!0)}),b._data(t,"changeBubbles",!0))}),t)},handle:function(e){var n=e.target;return this!==n||e.isSimulated||e.isTrigger||"radio"!==n.type&&"checkbox"!==n.type?e.handleObj.handler.apply(this,arguments):t},teardown:function(){return b.event.remove(this,"._change"),!Z.test(this.nodeName)}}),b.support.focusinBubbles||b.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){b.event.simulate(t,e.target,b.event.fix(e),!0)};b.event.special[t]={setup:function(){0===n++&&o.addEventListener(e,r,!0)},teardown:function(){0===--n&&o.removeEventListener(e,r,!0)}}}),b.fn.extend({on:function(e,n,r,i,o){var a,s;if("object"==typeof e){"string"!=typeof n&&(r=r||n,n=t);for(a in e)this.on(a,n,r,e[a],o);return this}if(null==r&&null==i?(i=n,r=n=t):null==i&&("string"==typeof n?(i=r,r=t):(i=r,r=n,n=t)),i===!1)i=ot;else if(!i)return this;return 1===o&&(s=i,i=function(e){return b().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=b.guid++)),this.each(function(){b.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,o;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,b(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if("object"==typeof e){for(o in e)this.off(o,n,e[o]);return this}return(n===!1||"function"==typeof n)&&(r=n,n=t),r===!1&&(r=ot),this.each(function(){b.event.remove(this,e,r,n)})},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 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},trigger:function(e,t){return this.each(function(){b.event.trigger(e,t,this)})},triggerHandler:function(e,n){var r=this[0];return r?b.event.trigger(e,n,r,!0):t}}),function(e,t){var n,r,i,o,a,s,u,l,c,p,f,d,h,g,m,y,v,x="sizzle"+-new Date,w=e.document,T={},N=0,C=0,k=it(),E=it(),S=it(),A=typeof t,j=1<<31,D=[],L=D.pop,H=D.push,q=D.slice,M=D.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},_="[\\x20\\t\\r\\n\\f]",F="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",O=F.replace("w","w#"),B="([*^$|!~]?=)",P="\\["+_+"*("+F+")"+_+"*(?:"+B+_+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+O+")|)|)"+_+"*\\]",R=":("+F+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+P.replace(3,8)+")*)|.*)\\)|)",W=RegExp("^"+_+"+|((?:^|[^\\\\])(?:\\\\.)*)"+_+"+$","g"),$=RegExp("^"+_+"*,"+_+"*"),I=RegExp("^"+_+"*([\\x20\\t\\r\\n\\f>+~])"+_+"*"),z=RegExp(R),X=RegExp("^"+O+"$"),U={ID:RegExp("^#("+F+")"),CLASS:RegExp("^\\.("+F+")"),NAME:RegExp("^\\[name=['\"]?("+F+")['\"]?\\]"),TAG:RegExp("^("+F.replace("w","w*")+")"),ATTR:RegExp("^"+P),PSEUDO:RegExp("^"+R),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+_+"*(even|odd|(([+-]|)(\\d*)n|)"+_+"*(?:([+-]|)"+_+"*(\\d+)|))"+_+"*\\)|)","i"),needsContext:RegExp("^"+_+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+_+"*((?:-\\d)?\\d*)"+_+"*\\)|)(?=[^-]|$)","i")},V=/[\x20\t\r\n\f]*[+~]/,Y=/^[^{]+\{\s*\[native code/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,G=/^(?:input|select|textarea|button)$/i,Q=/^h\d$/i,K=/'|\\/g,Z=/\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,et=/\\([\da-fA-F]{1,6}[\x20\t\r\n\f]?|.)/g,tt=function(e,t){var n="0x"+t-65536;return n!==n?t:0>n?String.fromCharCode(n+65536):String.fromCharCode(55296|n>>10,56320|1023&n)};try{q.call(w.documentElement.childNodes,0)[0].nodeType}catch(nt){q=function(e){var t,n=[];while(t=this[e++])n.push(t);return n}}function rt(e){return Y.test(e+"")}function it(){var e,t=[];return e=function(n,r){return t.push(n+=" ")>i.cacheLength&&delete e[t.shift()],e[n]=r}}function ot(e){return e[x]=!0,e}function at(e){var t=p.createElement("div");try{return e(t)}catch(n){return!1}finally{t=null}}function st(e,t,n,r){var i,o,a,s,u,l,f,g,m,v;if((t?t.ownerDocument||t:w)!==p&&c(t),t=t||p,n=n||[],!e||"string"!=typeof e)return n;if(1!==(s=t.nodeType)&&9!==s)return[];if(!d&&!r){if(i=J.exec(e))if(a=i[1]){if(9===s){if(o=t.getElementById(a),!o||!o.parentNode)return n;if(o.id===a)return n.push(o),n}else if(t.ownerDocument&&(o=t.ownerDocument.getElementById(a))&&y(t,o)&&o.id===a)return n.push(o),n}else{if(i[2])return H.apply(n,q.call(t.getElementsByTagName(e),0)),n;if((a=i[3])&&T.getByClassName&&t.getElementsByClassName)return H.apply(n,q.call(t.getElementsByClassName(a),0)),n}if(T.qsa&&!h.test(e)){if(f=!0,g=x,m=t,v=9===s&&e,1===s&&"object"!==t.nodeName.toLowerCase()){l=ft(e),(f=t.getAttribute("id"))?g=f.replace(K,"\\$&"):t.setAttribute("id",g),g="[id='"+g+"'] ",u=l.length;while(u--)l[u]=g+dt(l[u]);m=V.test(e)&&t.parentNode||t,v=l.join(",")}if(v)try{return H.apply(n,q.call(m.querySelectorAll(v),0)),n}catch(b){}finally{f||t.removeAttribute("id")}}}return wt(e.replace(W,"$1"),t,n,r)}a=st.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},c=st.setDocument=function(e){var n=e?e.ownerDocument||e:w;return n!==p&&9===n.nodeType&&n.documentElement?(p=n,f=n.documentElement,d=a(n),T.tagNameNoComments=at(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),T.attributes=at(function(e){e.innerHTML="<select></select>";var t=typeof e.lastChild.getAttribute("multiple");return"boolean"!==t&&"string"!==t}),T.getByClassName=at(function(e){return e.innerHTML="<div class='hidden e'></div><div class='hidden'></div>",e.getElementsByClassName&&e.getElementsByClassName("e").length?(e.lastChild.className="e",2===e.getElementsByClassName("e").length):!1}),T.getByName=at(function(e){e.id=x+0,e.innerHTML="<a name='"+x+"'></a><div name='"+x+"'></div>",f.insertBefore(e,f.firstChild);var t=n.getElementsByName&&n.getElementsByName(x).length===2+n.getElementsByName(x+0).length;return T.getIdNotName=!n.getElementById(x),f.removeChild(e),t}),i.attrHandle=at(function(e){return e.innerHTML="<a href='#'></a>",e.firstChild&&typeof e.firstChild.getAttribute!==A&&"#"===e.firstChild.getAttribute("href")})?{}:{href:function(e){return e.getAttribute("href",2)},type:function(e){return e.getAttribute("type")}},T.getIdNotName?(i.find.ID=function(e,t){if(typeof t.getElementById!==A&&!d){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},i.filter.ID=function(e){var t=e.replace(et,tt);return function(e){return e.getAttribute("id")===t}}):(i.find.ID=function(e,n){if(typeof n.getElementById!==A&&!d){var r=n.getElementById(e);return r?r.id===e||typeof r.getAttributeNode!==A&&r.getAttributeNode("id").value===e?[r]:t:[]}},i.filter.ID=function(e){var t=e.replace(et,tt);return function(e){var n=typeof e.getAttributeNode!==A&&e.getAttributeNode("id");return n&&n.value===t}}),i.find.TAG=T.tagNameNoComments?function(e,n){return typeof n.getElementsByTagName!==A?n.getElementsByTagName(e):t}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},i.find.NAME=T.getByName&&function(e,n){return typeof n.getElementsByName!==A?n.getElementsByName(name):t},i.find.CLASS=T.getByClassName&&function(e,n){return typeof n.getElementsByClassName===A||d?t:n.getElementsByClassName(e)},g=[],h=[":focus"],(T.qsa=rt(n.querySelectorAll))&&(at(function(e){e.innerHTML="<select><option selected=''></option></select>",e.querySelectorAll("[selected]").length||h.push("\\["+_+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),e.querySelectorAll(":checked").length||h.push(":checked")}),at(function(e){e.innerHTML="<input type='hidden' i=''/>",e.querySelectorAll("[i^='']").length&&h.push("[*^$]="+_+"*(?:\"\"|'')"),e.querySelectorAll(":enabled").length||h.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),h.push(",.*:")})),(T.matchesSelector=rt(m=f.matchesSelector||f.mozMatchesSelector||f.webkitMatchesSelector||f.oMatchesSelector||f.msMatchesSelector))&&at(function(e){T.disconnectedMatch=m.call(e,"div"),m.call(e,"[s!='']:x"),g.push("!=",R)}),h=RegExp(h.join("|")),g=RegExp(g.join("|")),y=rt(f.contains)||f.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},v=f.compareDocumentPosition?function(e,t){var r;return e===t?(u=!0,0):(r=t.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(t))?1&r||e.parentNode&&11===e.parentNode.nodeType?e===n||y(w,e)?-1:t===n||y(w,t)?1:0:4&r?-1:1:e.compareDocumentPosition?-1:1}:function(e,t){var r,i=0,o=e.parentNode,a=t.parentNode,s=[e],l=[t];if(e===t)return u=!0,0;if(!o||!a)return e===n?-1:t===n?1:o?-1:a?1:0;if(o===a)return ut(e,t);r=e;while(r=r.parentNode)s.unshift(r);r=t;while(r=r.parentNode)l.unshift(r);while(s[i]===l[i])i++;return i?ut(s[i],l[i]):s[i]===w?-1:l[i]===w?1:0},u=!1,[0,0].sort(v),T.detectDuplicates=u,p):p},st.matches=function(e,t){return st(e,null,null,t)},st.matchesSelector=function(e,t){if((e.ownerDocument||e)!==p&&c(e),t=t.replace(Z,"='$1']"),!(!T.matchesSelector||d||g&&g.test(t)||h.test(t)))try{var n=m.call(e,t);if(n||T.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(r){}return st(t,p,null,[e]).length>0},st.contains=function(e,t){return(e.ownerDocument||e)!==p&&c(e),y(e,t)},st.attr=function(e,t){var n;return(e.ownerDocument||e)!==p&&c(e),d||(t=t.toLowerCase()),(n=i.attrHandle[t])?n(e):d||T.attributes?e.getAttribute(t):((n=e.getAttributeNode(t))||e.getAttribute(t))&&e[t]===!0?t:n&&n.specified?n.value:null},st.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},st.uniqueSort=function(e){var t,n=[],r=1,i=0;if(u=!T.detectDuplicates,e.sort(v),u){for(;t=e[r];r++)t===e[r-1]&&(i=n.push(r));while(i--)e.splice(n[i],1)}return e};function ut(e,t){var n=t&&e,r=n&&(~t.sourceIndex||j)-(~e.sourceIndex||j);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function lt(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function ct(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function pt(e){return ot(function(t){return t=+t,ot(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}o=st.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=o(t);return n},i=st.selectors={cacheLength:50,createPseudo:ot,match:U,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(),"nth"===e[1].slice(0,3)?(e[3]||st.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&st.error(e[0]),e},PSEUDO:function(e){var t,n=!e[5]&&e[2];return U.CHILD.test(e[0])?null:(e[4]?e[2]=e[4]:n&&z.test(n)&&(t=ft(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){return"*"===e?function(){return!0}:(e=e.replace(et,tt).toLowerCase(),function(t){return t.nodeName&&t.nodeName.toLowerCase()===e})},CLASS:function(e){var t=k[e+" "];return t||(t=RegExp("(^|"+_+")"+e+"("+_+"|$)"))&&k(e,function(e){return t.test(e.className||typeof e.getAttribute!==A&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=st.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===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 o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,p,f,d,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!u&&!s;if(m){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){c=m[x]||(m[x]={}),l=c[e]||[],d=l[0]===N&&l[1],f=l[0]===N&&l[2],p=d&&m.childNodes[d];while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[N,d,f];break}}else if(v&&(l=(t[x]||(t[x]={}))[e])&&l[0]===N)f=l[1];else while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(v&&((p[x]||(p[x]={}))[e]=[N,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=i.pseudos[e]||i.setFilters[e.toLowerCase()]||st.error("unsupported pseudo: "+e);return r[x]?r(t):r.length>1?(n=[e,e,"",t],i.setFilters.hasOwnProperty(e.toLowerCase())?ot(function(e,n){var i,o=r(e,t),a=o.length;while(a--)i=M.call(e,o[a]),e[i]=!(n[i]=o[a])}):function(e){return r(e,0,n)}):r}},pseudos:{not:ot(function(e){var t=[],n=[],r=s(e.replace(W,"$1"));return r[x]?ot(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:ot(function(e){return function(t){return st(e,t).length>0}}),contains:ot(function(e){return function(t){return(t.textContent||t.innerText||o(t)).indexOf(e)>-1}}),lang:ot(function(e){return X.test(e||"")||st.error("unsupported lang: "+e),e=e.replace(et,tt).toLowerCase(),function(t){var n;do if(n=d?t.getAttribute("xml:lang")||t.getAttribute("lang"):t.lang)return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===f},focus:function(e){return e===p.activeElement&&(!p.hasFocus||p.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"input"===t&&!!e.checked||"option"===t&&!!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.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!i.pseudos.empty(e)},header:function(e){return Q.test(e.nodeName)},input:function(e){return G.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:pt(function(){return[0]}),last:pt(function(e,t){return[t-1]}),eq:pt(function(e,t,n){return[0>n?n+t:n]}),even:pt(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:pt(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:pt(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:pt(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}};for(n in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})i.pseudos[n]=lt(n);for(n in{submit:!0,reset:!0})i.pseudos[n]=ct(n);function ft(e,t){var n,r,o,a,s,u,l,c=E[e+" "];if(c)return t?0:c.slice(0);s=e,u=[],l=i.preFilter;while(s){(!n||(r=$.exec(s)))&&(r&&(s=s.slice(r[0].length)||s),u.push(o=[])),n=!1,(r=I.exec(s))&&(n=r.shift(),o.push({value:n,type:r[0].replace(W," ")}),s=s.slice(n.length));for(a in i.filter)!(r=U[a].exec(s))||l[a]&&!(r=l[a](r))||(n=r.shift(),o.push({value:n,type:a,matches:r}),s=s.slice(n.length));if(!n)break}return t?s.length:s?st.error(e):E(e,u).slice(0)}function dt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function ht(e,t,n){var i=t.dir,o=n&&"parentNode"===i,a=C++;return t.first?function(t,n,r){while(t=t[i])if(1===t.nodeType||o)return e(t,n,r)}:function(t,n,s){var u,l,c,p=N+" "+a;if(s){while(t=t[i])if((1===t.nodeType||o)&&e(t,n,s))return!0}else while(t=t[i])if(1===t.nodeType||o)if(c=t[x]||(t[x]={}),(l=c[i])&&l[0]===p){if((u=l[1])===!0||u===r)return u===!0}else if(l=c[i]=[p],l[1]=e(t,n,s)||r,l[1]===!0)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 mt(e,t,n,r,i){var o,a=[],s=0,u=e.length,l=null!=t;for(;u>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),l&&t.push(s));return a}function yt(e,t,n,r,i,o){return r&&!r[x]&&(r=yt(r)),i&&!i[x]&&(i=yt(i,o)),ot(function(o,a,s,u){var l,c,p,f=[],d=[],h=a.length,g=o||xt(t||"*",s.nodeType?[s]:s,[]),m=!e||!o&&t?g:mt(g,f,e,s,u),y=n?i||(o?e:h||r)?[]:a:m;if(n&&n(m,y,s,u),r){l=mt(y,d),r(l,[],s,u),c=l.length;while(c--)(p=l[c])&&(y[d[c]]=!(m[d[c]]=p))}if(o){if(i||e){if(i){l=[],c=y.length;while(c--)(p=y[c])&&l.push(m[c]=p);i(null,y=[],l,u)}c=y.length;while(c--)(p=y[c])&&(l=i?M.call(o,p):f[c])>-1&&(o[l]=!(a[l]=p))}}else y=mt(y===a?y.splice(h,y.length):y),i?i(null,a,y,u):H.apply(a,y)})}function vt(e){var t,n,r,o=e.length,a=i.relative[e[0].type],s=a||i.relative[" "],u=a?1:0,c=ht(function(e){return e===t},s,!0),p=ht(function(e){return M.call(t,e)>-1},s,!0),f=[function(e,n,r){return!a&&(r||n!==l)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;o>u;u++)if(n=i.relative[e[u].type])f=[ht(gt(f),n)];else{if(n=i.filter[e[u].type].apply(null,e[u].matches),n[x]){for(r=++u;o>r;r++)if(i.relative[e[r].type])break;return yt(u>1&&gt(f),u>1&&dt(e.slice(0,u-1)).replace(W,"$1"),n,r>u&&vt(e.slice(u,r)),o>r&&vt(e=e.slice(r)),o>r&&dt(e))}f.push(n)}return gt(f)}function bt(e,t){var n=0,o=t.length>0,a=e.length>0,s=function(s,u,c,f,d){var h,g,m,y=[],v=0,b="0",x=s&&[],w=null!=d,T=l,C=s||a&&i.find.TAG("*",d&&u.parentNode||u),k=N+=null==T?1:Math.random()||.1;for(w&&(l=u!==p&&u,r=n);null!=(h=C[b]);b++){if(a&&h){g=0;while(m=e[g++])if(m(h,u,c)){f.push(h);break}w&&(N=k,r=++n)}o&&((h=!m&&h)&&v--,s&&x.push(h))}if(v+=b,o&&b!==v){g=0;while(m=t[g++])m(x,y,u,c);if(s){if(v>0)while(b--)x[b]||y[b]||(y[b]=L.call(f));y=mt(y)}H.apply(f,y),w&&!s&&y.length>0&&v+t.length>1&&st.uniqueSort(f)}return w&&(N=k,l=T),x};return o?ot(s):s}s=st.compile=function(e,t){var n,r=[],i=[],o=S[e+" "];if(!o){t||(t=ft(e)),n=t.length;while(n--)o=vt(t[n]),o[x]?r.push(o):i.push(o);o=S(e,bt(i,r))}return o};function xt(e,t,n){var r=0,i=t.length;for(;i>r;r++)st(e,t[r],n);return n}function wt(e,t,n,r){var o,a,u,l,c,p=ft(e);if(!r&&1===p.length){if(a=p[0]=p[0].slice(0),a.length>2&&"ID"===(u=a[0]).type&&9===t.nodeType&&!d&&i.relative[a[1].type]){if(t=i.find.ID(u.matches[0].replace(et,tt),t)[0],!t)return n;e=e.slice(a.shift().value.length)}o=U.needsContext.test(e)?0:a.length;while(o--){if(u=a[o],i.relative[l=u.type])break;if((c=i.find[l])&&(r=c(u.matches[0].replace(et,tt),V.test(a[0].type)&&t.parentNode||t))){if(a.splice(o,1),e=r.length&&dt(a),!e)return H.apply(n,q.call(r,0)),n;break}}}return s(e,p)(r,t,d,n,V.test(e)),n}i.pseudos.nth=i.pseudos.eq;function Tt(){}i.filters=Tt.prototype=i.pseudos,i.setFilters=new Tt,c(),st.attr=b.attr,b.find=st,b.expr=st.selectors,b.expr[":"]=b.expr.pseudos,b.unique=st.uniqueSort,b.text=st.getText,b.isXMLDoc=st.isXML,b.contains=st.contains}(e);var at=/Until$/,st=/^(?:parents|prev(?:Until|All))/,ut=/^.[^:#\[\.,]*$/,lt=b.expr.match.needsContext,ct={children:!0,contents:!0,next:!0,prev:!0};b.fn.extend({find:function(e){var t,n,r,i=this.length;if("string"!=typeof e)return r=this,this.pushStack(b(e).filter(function(){for(t=0;i>t;t++)if(b.contains(r[t],this))return!0}));for(n=[],t=0;i>t;t++)b.find(e,this[t],n);return n=this.pushStack(i>1?b.unique(n):n),n.selector=(this.selector?this.selector+" ":"")+e,n},has:function(e){var t,n=b(e,this),r=n.length;return this.filter(function(){for(t=0;r>t;t++)if(b.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e,!1))},filter:function(e){return this.pushStack(ft(this,e,!0))},is:function(e){return!!e&&("string"==typeof e?lt.test(e)?b(e,this.context).index(this[0])>=0:b.filter(e,this).length>0:this.filter(e).length>0)},closest:function(e,t){var n,r=0,i=this.length,o=[],a=lt.test(e)||"string"!=typeof e?b(e,t||this.context):0;for(;i>r;r++){n=this[r];while(n&&n.ownerDocument&&n!==t&&11!==n.nodeType){if(a?a.index(n)>-1:b.find.matchesSelector(n,e)){o.push(n);break}n=n.parentNode}}return this.pushStack(o.length>1?b.unique(o):o)},index:function(e){return e?"string"==typeof e?b.inArray(this[0],b(e)):b.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?b(e,t):b.makeArray(e&&e.nodeType?[e]:e),r=b.merge(this.get(),n);return this.pushStack(b.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),b.fn.andSelf=b.fn.addBack;function pt(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}b.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return b.dir(e,"parentNode")},parentsUntil:function(e,t,n){return b.dir(e,"parentNode",n)},next:function(e){return pt(e,"nextSibling")},prev:function(e){return pt(e,"previousSibling")},nextAll:function(e){return b.dir(e,"nextSibling")},prevAll:function(e){return b.dir(e,"previousSibling")},nextUntil:function(e,t,n){return b.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return b.dir(e,"previousSibling",n)},siblings:function(e){return b.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return b.sibling(e.firstChild)},contents:function(e){return b.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:b.merge([],e.childNodes)}},function(e,t){b.fn[e]=function(n,r){var i=b.map(this,t,n);return at.test(e)||(r=n),r&&"string"==typeof r&&(i=b.filter(r,i)),i=this.length>1&&!ct[e]?b.unique(i):i,this.length>1&&st.test(e)&&(i=i.reverse()),this.pushStack(i)}}),b.extend({filter:function(e,t,n){return n&&(e=":not("+e+")"),1===t.length?b.find.matchesSelector(t[0],e)?[t[0]]:[]:b.find.matches(e,t)},dir:function(e,n,r){var i=[],o=e[n];while(o&&9!==o.nodeType&&(r===t||1!==o.nodeType||!b(o).is(r)))1===o.nodeType&&i.push(o),o=o[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function ft(e,t,n){if(t=t||0,b.isFunction(t))return b.grep(e,function(e,r){var i=!!t.call(e,r,e);return i===n});if(t.nodeType)return b.grep(e,function(e){return e===t===n});if("string"==typeof t){var r=b.grep(e,function(e){return 1===e.nodeType});if(ut.test(t))return b.filter(t,r,!n);t=b.filter(t,r)}return b.grep(e,function(e){return b.inArray(e,t)>=0===n})}function dt(e){var t=ht.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}var ht="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",gt=/ jQuery\d+="(?:null|\d+)"/g,mt=RegExp("<(?:"+ht+")[\\s/>]","i"),yt=/^\s+/,vt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bt=/<([\w:]+)/,xt=/<tbody/i,wt=/<|&#?\w+;/,Tt=/<(?:script|style|link)/i,Nt=/^(?:checkbox|radio)$/i,Ct=/checked\s*(?:[^=]|=\s*.checked.)/i,kt=/^$|\/(?:java|ecma)script/i,Et=/^true\/(.*)/,St=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,At={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:b.support.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},jt=dt(o),Dt=jt.appendChild(o.createElement("div"));At.optgroup=At.option,At.tbody=At.tfoot=At.colgroup=At.caption=At.thead,At.th=At.td,b.fn.extend({text:function(e){return b.access(this,function(e){return e===t?b.text(this):this.empty().append((this[0]&&this[0].ownerDocument||o).createTextNode(e))},null,e,arguments.length)},wrapAll:function(e){if(b.isFunction(e))return this.each(function(t){b(this).wrapAll(e.call(this,t))});if(this[0]){var t=b(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&1===e.firstChild.nodeType)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return b.isFunction(e)?this.each(function(t){b(this).wrapInner(e.call(this,t))}):this.each(function(){var t=b(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=b.isFunction(e);return this.each(function(n){b(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){b.nodeName(this,"body")||b(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(e){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&this.appendChild(e)})},prepend:function(){return this.domManip(arguments,!0,function(e){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&this.insertBefore(e,this.firstChild)})},before:function(){return this.domManip(arguments,!1,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,!1,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=0;for(;null!=(n=this[r]);r++)(!e||b.filter(e,[n]).length>0)&&(t||1!==n.nodeType||b.cleanData(Ot(n)),n.parentNode&&(t&&b.contains(n.ownerDocument,n)&&Mt(Ot(n,"script")),n.parentNode.removeChild(n)));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++){1===e.nodeType&&b.cleanData(Ot(e,!1));while(e.firstChild)e.removeChild(e.firstChild);e.options&&b.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return b.clone(this,e,t)})},html:function(e){return b.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return 1===n.nodeType?n.innerHTML.replace(gt,""):t;if(!("string"!=typeof e||Tt.test(e)||!b.support.htmlSerialize&&mt.test(e)||!b.support.leadingWhitespace&&yt.test(e)||At[(bt.exec(e)||["",""])[1].toLowerCase()])){e=e.replace(vt,"<$1></$2>");try{for(;i>r;r++)n=this[r]||{},1===n.nodeType&&(b.cleanData(Ot(n,!1)),n.innerHTML=e);n=0}catch(o){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(e){var t=b.isFunction(e);return t||"string"==typeof e||(e=b(e).not(this).detach()),this.domManip([e],!0,function(e){var t=this.nextSibling,n=this.parentNode;n&&(b(this).remove(),n.insertBefore(e,t))})},detach:function(e){return this.remove(e,!0)},domManip:function(e,n,r){e=f.apply([],e);var i,o,a,s,u,l,c=0,p=this.length,d=this,h=p-1,g=e[0],m=b.isFunction(g);if(m||!(1>=p||"string"!=typeof g||b.support.checkClone)&&Ct.test(g))return this.each(function(i){var o=d.eq(i);m&&(e[0]=g.call(this,i,n?o.html():t)),o.domManip(e,n,r)});if(p&&(l=b.buildFragment(e,this[0].ownerDocument,!1,this),i=l.firstChild,1===l.childNodes.length&&(l=i),i)){for(n=n&&b.nodeName(i,"tr"),s=b.map(Ot(l,"script"),Ht),a=s.length;p>c;c++)o=l,c!==h&&(o=b.clone(o,!0,!0),a&&b.merge(s,Ot(o,"script"))),r.call(n&&b.nodeName(this[c],"table")?Lt(this[c],"tbody"):this[c],o,c);if(a)for(u=s[s.length-1].ownerDocument,b.map(s,qt),c=0;a>c;c++)o=s[c],kt.test(o.type||"")&&!b._data(o,"globalEval")&&b.contains(u,o)&&(o.src?b.ajax({url:o.src,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0}):b.globalEval((o.text||o.textContent||o.innerHTML||"").replace(St,"")));l=i=null}return this}});function Lt(e,t){return e.getElementsByTagName(t)[0]||e.appendChild(e.ownerDocument.createElement(t))}function Ht(e){var t=e.getAttributeNode("type");return e.type=(t&&t.specified)+"/"+e.type,e}function qt(e){var t=Et.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function Mt(e,t){var n,r=0;for(;null!=(n=e[r]);r++)b._data(n,"globalEval",!t||b._data(t[r],"globalEval"))}function _t(e,t){if(1===t.nodeType&&b.hasData(e)){var n,r,i,o=b._data(e),a=b._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)b.event.add(t,n,s[n][r])}a.data&&(a.data=b.extend({},a.data))}}function Ft(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!b.support.noCloneEvent&&t[b.expando]){i=b._data(t);for(r in i.events)b.removeEvent(t,r,i.handle);t.removeAttribute(b.expando)}"script"===n&&t.text!==e.text?(Ht(t).text=e.text,qt(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),b.support.html5Clone&&e.innerHTML&&!b.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Nt.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}b.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){b.fn[e]=function(e){var n,r=0,i=[],o=b(e),a=o.length-1;for(;a>=r;r++)n=r===a?this:this.clone(!0),b(o[r])[t](n),d.apply(i,n.get());return this.pushStack(i)}});function Ot(e,n){var r,o,a=0,s=typeof e.getElementsByTagName!==i?e.getElementsByTagName(n||"*"):typeof e.querySelectorAll!==i?e.querySelectorAll(n||"*"):t;if(!s)for(s=[],r=e.childNodes||e;null!=(o=r[a]);a++)!n||b.nodeName(o,n)?s.push(o):b.merge(s,Ot(o,n));return n===t||n&&b.nodeName(e,n)?b.merge([e],s):s}function Bt(e){Nt.test(e.type)&&(e.defaultChecked=e.checked)}b.extend({clone:function(e,t,n){var r,i,o,a,s,u=b.contains(e.ownerDocument,e);if(b.support.html5Clone||b.isXMLDoc(e)||!mt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(Dt.innerHTML=e.outerHTML,Dt.removeChild(o=Dt.firstChild)),!(b.support.noCloneEvent&&b.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||b.isXMLDoc(e)))for(r=Ot(o),s=Ot(e),a=0;null!=(i=s[a]);++a)r[a]&&Ft(i,r[a]);if(t)if(n)for(s=s||Ot(e),r=r||Ot(o),a=0;null!=(i=s[a]);a++)_t(i,r[a]);else _t(e,o);return r=Ot(o,"script"),r.length>0&&Mt(r,!u&&Ot(e,"script")),r=s=i=null,o},buildFragment:function(e,t,n,r){var i,o,a,s,u,l,c,p=e.length,f=dt(t),d=[],h=0;for(;p>h;h++)if(o=e[h],o||0===o)if("object"===b.type(o))b.merge(d,o.nodeType?[o]:o);else if(wt.test(o)){s=s||f.appendChild(t.createElement("div")),u=(bt.exec(o)||["",""])[1].toLowerCase(),c=At[u]||At._default,s.innerHTML=c[1]+o.replace(vt,"<$1></$2>")+c[2],i=c[0];while(i--)s=s.lastChild;if(!b.support.leadingWhitespace&&yt.test(o)&&d.push(t.createTextNode(yt.exec(o)[0])),!b.support.tbody){o="table"!==u||xt.test(o)?"<table>"!==c[1]||xt.test(o)?0:s:s.firstChild,i=o&&o.childNodes.length;while(i--)b.nodeName(l=o.childNodes[i],"tbody")&&!l.childNodes.length&&o.removeChild(l)
+}b.merge(d,s.childNodes),s.textContent="";while(s.firstChild)s.removeChild(s.firstChild);s=f.lastChild}else d.push(t.createTextNode(o));s&&f.removeChild(s),b.support.appendChecked||b.grep(Ot(d,"input"),Bt),h=0;while(o=d[h++])if((!r||-1===b.inArray(o,r))&&(a=b.contains(o.ownerDocument,o),s=Ot(f.appendChild(o),"script"),a&&Mt(s),n)){i=0;while(o=s[i++])kt.test(o.type||"")&&n.push(o)}return s=null,f},cleanData:function(e,t){var n,r,o,a,s=0,u=b.expando,l=b.cache,p=b.support.deleteExpando,f=b.event.special;for(;null!=(n=e[s]);s++)if((t||b.acceptData(n))&&(o=n[u],a=o&&l[o])){if(a.events)for(r in a.events)f[r]?b.event.remove(n,r):b.removeEvent(n,r,a.handle);l[o]&&(delete l[o],p?delete n[u]:typeof n.removeAttribute!==i?n.removeAttribute(u):n[u]=null,c.push(o))}}});var Pt,Rt,Wt,$t=/alpha\([^)]*\)/i,It=/opacity\s*=\s*([^)]*)/,zt=/^(top|right|bottom|left)$/,Xt=/^(none|table(?!-c[ea]).+)/,Ut=/^margin/,Vt=RegExp("^("+x+")(.*)$","i"),Yt=RegExp("^("+x+")(?!px)[a-z%]+$","i"),Jt=RegExp("^([+-])=("+x+")","i"),Gt={BODY:"block"},Qt={position:"absolute",visibility:"hidden",display:"block"},Kt={letterSpacing:0,fontWeight:400},Zt=["Top","Right","Bottom","Left"],en=["Webkit","O","Moz","ms"];function tn(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=en.length;while(i--)if(t=en[i]+n,t in e)return t;return r}function nn(e,t){return e=t||e,"none"===b.css(e,"display")||!b.contains(e.ownerDocument,e)}function rn(e,t){var n,r,i,o=[],a=0,s=e.length;for(;s>a;a++)r=e[a],r.style&&(o[a]=b._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&nn(r)&&(o[a]=b._data(r,"olddisplay",un(r.nodeName)))):o[a]||(i=nn(r),(n&&"none"!==n||!i)&&b._data(r,"olddisplay",i?n:b.css(r,"display"))));for(a=0;s>a;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}b.fn.extend({css:function(e,n){return b.access(this,function(e,n,r){var i,o,a={},s=0;if(b.isArray(n)){for(o=Rt(e),i=n.length;i>s;s++)a[n[s]]=b.css(e,n[s],!1,o);return a}return r!==t?b.style(e,n,r):b.css(e,n)},e,n,arguments.length>1)},show:function(){return rn(this,!0)},hide:function(){return rn(this)},toggle:function(e){var t="boolean"==typeof e;return this.each(function(){(t?e:nn(this))?b(this).show():b(this).hide()})}}),b.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Wt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":b.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,a,s,u=b.camelCase(n),l=e.style;if(n=b.cssProps[u]||(b.cssProps[u]=tn(l,u)),s=b.cssHooks[n]||b.cssHooks[u],r===t)return s&&"get"in s&&(o=s.get(e,!1,i))!==t?o:l[n];if(a=typeof r,"string"===a&&(o=Jt.exec(r))&&(r=(o[1]+1)*o[2]+parseFloat(b.css(e,n)),a="number"),!(null==r||"number"===a&&isNaN(r)||("number"!==a||b.cssNumber[u]||(r+="px"),b.support.clearCloneStyle||""!==r||0!==n.indexOf("background")||(l[n]="inherit"),s&&"set"in s&&(r=s.set(e,r,i))===t)))try{l[n]=r}catch(c){}}},css:function(e,n,r,i){var o,a,s,u=b.camelCase(n);return n=b.cssProps[u]||(b.cssProps[u]=tn(e.style,u)),s=b.cssHooks[n]||b.cssHooks[u],s&&"get"in s&&(a=s.get(e,!0,r)),a===t&&(a=Wt(e,n,i)),"normal"===a&&n in Kt&&(a=Kt[n]),""===r||r?(o=parseFloat(a),r===!0||b.isNumeric(o)?o||0:a):a},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),e.getComputedStyle?(Rt=function(t){return e.getComputedStyle(t,null)},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),u=s?s.getPropertyValue(n)||s[n]:t,l=e.style;return s&&(""!==u||b.contains(e.ownerDocument,e)||(u=b.style(e,n)),Yt.test(u)&&Ut.test(n)&&(i=l.width,o=l.minWidth,a=l.maxWidth,l.minWidth=l.maxWidth=l.width=u,u=s.width,l.width=i,l.minWidth=o,l.maxWidth=a)),u}):o.documentElement.currentStyle&&(Rt=function(e){return e.currentStyle},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),u=s?s[n]:t,l=e.style;return null==u&&l&&l[n]&&(u=l[n]),Yt.test(u)&&!zt.test(n)&&(i=l.left,o=e.runtimeStyle,a=o&&o.left,a&&(o.left=e.currentStyle.left),l.left="fontSize"===n?"1em":u,u=l.pixelLeft+"px",l.left=i,a&&(o.left=a)),""===u?"auto":u});function on(e,t,n){var r=Vt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function an(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;for(;4>o;o+=2)"margin"===n&&(a+=b.css(e,n+Zt[o],!0,i)),r?("content"===n&&(a-=b.css(e,"padding"+Zt[o],!0,i)),"margin"!==n&&(a-=b.css(e,"border"+Zt[o]+"Width",!0,i))):(a+=b.css(e,"padding"+Zt[o],!0,i),"padding"!==n&&(a+=b.css(e,"border"+Zt[o]+"Width",!0,i)));return a}function sn(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=Rt(e),a=b.support.boxSizing&&"border-box"===b.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=Wt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Yt.test(i))return i;r=a&&(b.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+an(e,t,n||(a?"border":"content"),r,o)+"px"}function un(e){var t=o,n=Gt[e];return n||(n=ln(e,t),"none"!==n&&n||(Pt=(Pt||b("<iframe frameborder='0' width='0' height='0'/>").css("cssText","display:block !important")).appendTo(t.documentElement),t=(Pt[0].contentWindow||Pt[0].contentDocument).document,t.write("<!doctype html><html><body>"),t.close(),n=ln(e,t),Pt.detach()),Gt[e]=n),n}function ln(e,t){var n=b(t.createElement(e)).appendTo(t.body),r=b.css(n[0],"display");return n.remove(),r}b.each(["height","width"],function(e,n){b.cssHooks[n]={get:function(e,r,i){return r?0===e.offsetWidth&&Xt.test(b.css(e,"display"))?b.swap(e,Qt,function(){return sn(e,n,i)}):sn(e,n,i):t},set:function(e,t,r){var i=r&&Rt(e);return on(e,t,r?an(e,n,r,b.support.boxSizing&&"border-box"===b.css(e,"boxSizing",!1,i),i):0)}}}),b.support.opacity||(b.cssHooks.opacity={get:function(e,t){return It.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=b.isNumeric(t)?"alpha(opacity="+100*t+")":"",o=r&&r.filter||n.filter||"";n.zoom=1,(t>=1||""===t)&&""===b.trim(o.replace($t,""))&&n.removeAttribute&&(n.removeAttribute("filter"),""===t||r&&!r.filter)||(n.filter=$t.test(o)?o.replace($t,i):o+" "+i)}}),b(function(){b.support.reliableMarginRight||(b.cssHooks.marginRight={get:function(e,n){return n?b.swap(e,{display:"inline-block"},Wt,[e,"marginRight"]):t}}),!b.support.pixelPosition&&b.fn.position&&b.each(["top","left"],function(e,n){b.cssHooks[n]={get:function(e,r){return r?(r=Wt(e,n),Yt.test(r)?b(e).position()[n]+"px":r):t}}})}),b.expr&&b.expr.filters&&(b.expr.filters.hidden=function(e){return 0>=e.offsetWidth&&0>=e.offsetHeight||!b.support.reliableHiddenOffsets&&"none"===(e.style&&e.style.display||b.css(e,"display"))},b.expr.filters.visible=function(e){return!b.expr.filters.hidden(e)}),b.each({margin:"",padding:"",border:"Width"},function(e,t){b.cssHooks[e+t]={expand:function(n){var r=0,i={},o="string"==typeof n?n.split(" "):[n];for(;4>r;r++)i[e+Zt[r]+t]=o[r]||o[r-2]||o[0];return i}},Ut.test(e)||(b.cssHooks[e+t].set=on)});var cn=/%20/g,pn=/\[\]$/,fn=/\r?\n/g,dn=/^(?:submit|button|image|reset|file)$/i,hn=/^(?:input|select|textarea|keygen)/i;b.fn.extend({serialize:function(){return b.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=b.prop(this,"elements");return e?b.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!b(this).is(":disabled")&&hn.test(this.nodeName)&&!dn.test(e)&&(this.checked||!Nt.test(e))}).map(function(e,t){var n=b(this).val();return null==n?null:b.isArray(n)?b.map(n,function(e){return{name:t.name,value:e.replace(fn,"\r\n")}}):{name:t.name,value:n.replace(fn,"\r\n")}}).get()}}),b.param=function(e,n){var r,i=[],o=function(e,t){t=b.isFunction(t)?t():null==t?"":t,i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(n===t&&(n=b.ajaxSettings&&b.ajaxSettings.traditional),b.isArray(e)||e.jquery&&!b.isPlainObject(e))b.each(e,function(){o(this.name,this.value)});else for(r in e)gn(r,e[r],n,o);return i.join("&").replace(cn,"+")};function gn(e,t,n,r){var i;if(b.isArray(t))b.each(t,function(t,i){n||pn.test(e)?r(e,i):gn(e+"["+("object"==typeof i?t:"")+"]",i,n,r)});else if(n||"object"!==b.type(t))r(e,t);else for(i in t)gn(e+"["+i+"]",t[i],n,r)}b.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){b.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),b.fn.hover=function(e,t){return this.mouseenter(e).mouseleave(t||e)};var mn,yn,vn=b.now(),bn=/\?/,xn=/#.*$/,wn=/([?&])_=[^&]*/,Tn=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Nn=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Cn=/^(?:GET|HEAD)$/,kn=/^\/\//,En=/^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,Sn=b.fn.load,An={},jn={},Dn="*/".concat("*");try{yn=a.href}catch(Ln){yn=o.createElement("a"),yn.href="",yn=yn.href}mn=En.exec(yn.toLowerCase())||[];function Hn(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(w)||[];if(b.isFunction(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function qn(e,n,r,i){var o={},a=e===jn;function s(u){var l;return o[u]=!0,b.each(e[u]||[],function(e,u){var c=u(n,r,i);return"string"!=typeof c||a||o[c]?a?!(l=c):t:(n.dataTypes.unshift(c),s(c),!1)}),l}return s(n.dataTypes[0])||!o["*"]&&s("*")}function Mn(e,n){var r,i,o=b.ajaxSettings.flatOptions||{};for(i in n)n[i]!==t&&((o[i]?e:r||(r={}))[i]=n[i]);return r&&b.extend(!0,e,r),e}b.fn.load=function(e,n,r){if("string"!=typeof e&&Sn)return Sn.apply(this,arguments);var i,o,a,s=this,u=e.indexOf(" ");return u>=0&&(i=e.slice(u,e.length),e=e.slice(0,u)),b.isFunction(n)?(r=n,n=t):n&&"object"==typeof n&&(a="POST"),s.length>0&&b.ajax({url:e,type:a,dataType:"html",data:n}).done(function(e){o=arguments,s.html(i?b("<div>").append(b.parseHTML(e)).find(i):e)}).complete(r&&function(e,t){s.each(r,o||[e.responseText,t,e])}),this},b.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){b.fn[t]=function(e){return this.on(t,e)}}),b.each(["get","post"],function(e,n){b[n]=function(e,r,i,o){return b.isFunction(r)&&(o=o||i,i=r,r=t),b.ajax({url:e,type:n,dataType:o,data:r,success:i})}}),b.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:yn,type:"GET",isLocal:Nn.test(mn[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Dn,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"},converters:{"* text":e.String,"text html":!0,"text json":b.parseJSON,"text xml":b.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Mn(Mn(e,b.ajaxSettings),t):Mn(b.ajaxSettings,e)},ajaxPrefilter:Hn(An),ajaxTransport:Hn(jn),ajax:function(e,n){"object"==typeof e&&(n=e,e=t),n=n||{};var r,i,o,a,s,u,l,c,p=b.ajaxSetup({},n),f=p.context||p,d=p.context&&(f.nodeType||f.jquery)?b(f):b.event,h=b.Deferred(),g=b.Callbacks("once memory"),m=p.statusCode||{},y={},v={},x=0,T="canceled",N={readyState:0,getResponseHeader:function(e){var t;if(2===x){if(!c){c={};while(t=Tn.exec(a))c[t[1].toLowerCase()]=t[2]}t=c[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===x?a:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return x||(e=v[n]=v[n]||e,y[e]=t),this},overrideMimeType:function(e){return x||(p.mimeType=e),this},statusCode:function(e){var t;if(e)if(2>x)for(t in e)m[t]=[m[t],e[t]];else N.always(e[N.status]);return this},abort:function(e){var t=e||T;return l&&l.abort(t),k(0,t),this}};if(h.promise(N).complete=g.add,N.success=N.done,N.error=N.fail,p.url=((e||p.url||yn)+"").replace(xn,"").replace(kn,mn[1]+"//"),p.type=n.method||n.type||p.method||p.type,p.dataTypes=b.trim(p.dataType||"*").toLowerCase().match(w)||[""],null==p.crossDomain&&(r=En.exec(p.url.toLowerCase()),p.crossDomain=!(!r||r[1]===mn[1]&&r[2]===mn[2]&&(r[3]||("http:"===r[1]?80:443))==(mn[3]||("http:"===mn[1]?80:443)))),p.data&&p.processData&&"string"!=typeof p.data&&(p.data=b.param(p.data,p.traditional)),qn(An,p,n,N),2===x)return N;u=p.global,u&&0===b.active++&&b.event.trigger("ajaxStart"),p.type=p.type.toUpperCase(),p.hasContent=!Cn.test(p.type),o=p.url,p.hasContent||(p.data&&(o=p.url+=(bn.test(o)?"&":"?")+p.data,delete p.data),p.cache===!1&&(p.url=wn.test(o)?o.replace(wn,"$1_="+vn++):o+(bn.test(o)?"&":"?")+"_="+vn++)),p.ifModified&&(b.lastModified[o]&&N.setRequestHeader("If-Modified-Since",b.lastModified[o]),b.etag[o]&&N.setRequestHeader("If-None-Match",b.etag[o])),(p.data&&p.hasContent&&p.contentType!==!1||n.contentType)&&N.setRequestHeader("Content-Type",p.contentType),N.setRequestHeader("Accept",p.dataTypes[0]&&p.accepts[p.dataTypes[0]]?p.accepts[p.dataTypes[0]]+("*"!==p.dataTypes[0]?", "+Dn+"; q=0.01":""):p.accepts["*"]);for(i in p.headers)N.setRequestHeader(i,p.headers[i]);if(p.beforeSend&&(p.beforeSend.call(f,N,p)===!1||2===x))return N.abort();T="abort";for(i in{success:1,error:1,complete:1})N[i](p[i]);if(l=qn(jn,p,n,N)){N.readyState=1,u&&d.trigger("ajaxSend",[N,p]),p.async&&p.timeout>0&&(s=setTimeout(function(){N.abort("timeout")},p.timeout));try{x=1,l.send(y,k)}catch(C){if(!(2>x))throw C;k(-1,C)}}else k(-1,"No Transport");function k(e,n,r,i){var c,y,v,w,T,C=n;2!==x&&(x=2,s&&clearTimeout(s),l=t,a=i||"",N.readyState=e>0?4:0,r&&(w=_n(p,N,r)),e>=200&&300>e||304===e?(p.ifModified&&(T=N.getResponseHeader("Last-Modified"),T&&(b.lastModified[o]=T),T=N.getResponseHeader("etag"),T&&(b.etag[o]=T)),204===e?(c=!0,C="nocontent"):304===e?(c=!0,C="notmodified"):(c=Fn(p,w),C=c.state,y=c.data,v=c.error,c=!v)):(v=C,(e||!C)&&(C="error",0>e&&(e=0))),N.status=e,N.statusText=(n||C)+"",c?h.resolveWith(f,[y,C,N]):h.rejectWith(f,[N,C,v]),N.statusCode(m),m=t,u&&d.trigger(c?"ajaxSuccess":"ajaxError",[N,p,c?y:v]),g.fireWith(f,[N,C]),u&&(d.trigger("ajaxComplete",[N,p]),--b.active||b.event.trigger("ajaxStop")))}return N},getScript:function(e,n){return b.get(e,t,n,"script")},getJSON:function(e,t,n){return b.get(e,t,n,"json")}});function _n(e,n,r){var i,o,a,s,u=e.contents,l=e.dataTypes,c=e.responseFields;for(s in c)s in r&&(n[c[s]]=r[s]);while("*"===l[0])l.shift(),o===t&&(o=e.mimeType||n.getResponseHeader("Content-Type"));if(o)for(s in u)if(u[s]&&u[s].test(o)){l.unshift(s);break}if(l[0]in r)a=l[0];else{for(s in r){if(!l[0]||e.converters[s+" "+l[0]]){a=s;break}i||(i=s)}a=a||i}return a?(a!==l[0]&&l.unshift(a),r[a]):t}function Fn(e,t){var n,r,i,o,a={},s=0,u=e.dataTypes.slice(),l=u[0];if(e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u[1])for(i in e.converters)a[i.toLowerCase()]=e.converters[i];for(;r=u[++s];)if("*"!==r){if("*"!==l&&l!==r){if(i=a[l+" "+r]||a["* "+r],!i)for(n in a)if(o=n.split(" "),o[1]===r&&(i=a[l+" "+o[0]]||a["* "+o[0]])){i===!0?i=a[n]:a[n]!==!0&&(r=o[0],u.splice(s--,0,r));break}if(i!==!0)if(i&&e["throws"])t=i(t);else try{t=i(t)}catch(c){return{state:"parsererror",error:i?c:"No conversion from "+l+" to "+r}}}l=r}return{state:"success",data:t}}b.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(e){return b.globalEval(e),e}}}),b.ajaxPrefilter("script",function(e){e.cache===t&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),b.ajaxTransport("script",function(e){if(e.crossDomain){var n,r=o.head||b("head")[0]||o.documentElement;return{send:function(t,i){n=o.createElement("script"),n.async=!0,e.scriptCharset&&(n.charset=e.scriptCharset),n.src=e.url,n.onload=n.onreadystatechange=function(e,t){(t||!n.readyState||/loaded|complete/.test(n.readyState))&&(n.onload=n.onreadystatechange=null,n.parentNode&&n.parentNode.removeChild(n),n=null,t||i(200,"success"))},r.insertBefore(n,r.firstChild)},abort:function(){n&&n.onload(t,!0)}}}});var On=[],Bn=/(=)\?(?=&|$)|\?\?/;b.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=On.pop()||b.expando+"_"+vn++;return this[e]=!0,e}}),b.ajaxPrefilter("json jsonp",function(n,r,i){var o,a,s,u=n.jsonp!==!1&&(Bn.test(n.url)?"url":"string"==typeof n.data&&!(n.contentType||"").indexOf("application/x-www-form-urlencoded")&&Bn.test(n.data)&&"data");return u||"jsonp"===n.dataTypes[0]?(o=n.jsonpCallback=b.isFunction(n.jsonpCallback)?n.jsonpCallback():n.jsonpCallback,u?n[u]=n[u].replace(Bn,"$1"+o):n.jsonp!==!1&&(n.url+=(bn.test(n.url)?"&":"?")+n.jsonp+"="+o),n.converters["script json"]=function(){return s||b.error(o+" was not called"),s[0]},n.dataTypes[0]="json",a=e[o],e[o]=function(){s=arguments},i.always(function(){e[o]=a,n[o]&&(n.jsonpCallback=r.jsonpCallback,On.push(o)),s&&b.isFunction(a)&&a(s[0]),s=a=t}),"script"):t});var Pn,Rn,Wn=0,$n=e.ActiveXObject&&function(){var e;for(e in Pn)Pn[e](t,!0)};function In(){try{return new e.XMLHttpRequest}catch(t){}}function zn(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(t){}}b.ajaxSettings.xhr=e.ActiveXObject?function(){return!this.isLocal&&In()||zn()}:In,Rn=b.ajaxSettings.xhr(),b.support.cors=!!Rn&&"withCredentials"in Rn,Rn=b.support.ajax=!!Rn,Rn&&b.ajaxTransport(function(n){if(!n.crossDomain||b.support.cors){var r;return{send:function(i,o){var a,s,u=n.xhr();if(n.username?u.open(n.type,n.url,n.async,n.username,n.password):u.open(n.type,n.url,n.async),n.xhrFields)for(s in n.xhrFields)u[s]=n.xhrFields[s];n.mimeType&&u.overrideMimeType&&u.overrideMimeType(n.mimeType),n.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");try{for(s in i)u.setRequestHeader(s,i[s])}catch(l){}u.send(n.hasContent&&n.data||null),r=function(e,i){var s,l,c,p;try{if(r&&(i||4===u.readyState))if(r=t,a&&(u.onreadystatechange=b.noop,$n&&delete Pn[a]),i)4!==u.readyState&&u.abort();else{p={},s=u.status,l=u.getAllResponseHeaders(),"string"==typeof u.responseText&&(p.text=u.responseText);try{c=u.statusText}catch(f){c=""}s||!n.isLocal||n.crossDomain?1223===s&&(s=204):s=p.text?200:404}}catch(d){i||o(-1,d)}p&&o(s,c,p,l)},n.async?4===u.readyState?setTimeout(r):(a=++Wn,$n&&(Pn||(Pn={},b(e).unload($n)),Pn[a]=r),u.onreadystatechange=r):r()},abort:function(){r&&r(t,!0)}}}});var Xn,Un,Vn=/^(?:toggle|show|hide)$/,Yn=RegExp("^(?:([+-])=|)("+x+")([a-z%]*)$","i"),Jn=/queueHooks$/,Gn=[nr],Qn={"*":[function(e,t){var n,r,i=this.createTween(e,t),o=Yn.exec(t),a=i.cur(),s=+a||0,u=1,l=20;if(o){if(n=+o[2],r=o[3]||(b.cssNumber[e]?"":"px"),"px"!==r&&s){s=b.css(i.elem,e,!0)||n||1;do u=u||".5",s/=u,b.style(i.elem,e,s+r);while(u!==(u=i.cur()/a)&&1!==u&&--l)}i.unit=r,i.start=s,i.end=o[1]?s+(o[1]+1)*n:n}return i}]};function Kn(){return setTimeout(function(){Xn=t}),Xn=b.now()}function Zn(e,t){b.each(t,function(t,n){var r=(Qn[t]||[]).concat(Qn["*"]),i=0,o=r.length;for(;o>i;i++)if(r[i].call(e,t,n))return})}function er(e,t,n){var r,i,o=0,a=Gn.length,s=b.Deferred().always(function(){delete u.elem}),u=function(){if(i)return!1;var t=Xn||Kn(),n=Math.max(0,l.startTime+l.duration-t),r=n/l.duration||0,o=1-r,a=0,u=l.tweens.length;for(;u>a;a++)l.tweens[a].run(o);return s.notifyWith(e,[l,o,n]),1>o&&u?n:(s.resolveWith(e,[l]),!1)},l=s.promise({elem:e,props:b.extend({},t),opts:b.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:Xn||Kn(),duration:n.duration,tweens:[],createTween:function(t,n){var r=b.Tween(e,l.opts,t,n,l.opts.specialEasing[t]||l.opts.easing);return l.tweens.push(r),r},stop:function(t){var n=0,r=t?l.tweens.length:0;if(i)return this;for(i=!0;r>n;n++)l.tweens[n].run(1);return t?s.resolveWith(e,[l,t]):s.rejectWith(e,[l,t]),this}}),c=l.props;for(tr(c,l.opts.specialEasing);a>o;o++)if(r=Gn[o].call(l,e,c,l.opts))return r;return Zn(l,c),b.isFunction(l.opts.start)&&l.opts.start.call(e,l),b.fx.timer(b.extend(u,{elem:e,anim:l,queue:l.opts.queue})),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always)}function tr(e,t){var n,r,i,o,a;for(i in e)if(r=b.camelCase(i),o=t[r],n=e[i],b.isArray(n)&&(o=n[1],n=e[i]=n[0]),i!==r&&(e[r]=n,delete e[i]),a=b.cssHooks[r],a&&"expand"in a){n=a.expand(n),delete e[r];for(i in n)i in e||(e[i]=n[i],t[i]=o)}else t[r]=o}b.Animation=b.extend(er,{tweener:function(e,t){b.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");var n,r=0,i=e.length;for(;i>r;r++)n=e[r],Qn[n]=Qn[n]||[],Qn[n].unshift(t)},prefilter:function(e,t){t?Gn.unshift(e):Gn.push(e)}});function nr(e,t,n){var r,i,o,a,s,u,l,c,p,f=this,d=e.style,h={},g=[],m=e.nodeType&&nn(e);n.queue||(c=b._queueHooks(e,"fx"),null==c.unqueued&&(c.unqueued=0,p=c.empty.fire,c.empty.fire=function(){c.unqueued||p()}),c.unqueued++,f.always(function(){f.always(function(){c.unqueued--,b.queue(e,"fx").length||c.empty.fire()})})),1===e.nodeType&&("height"in t||"width"in t)&&(n.overflow=[d.overflow,d.overflowX,d.overflowY],"inline"===b.css(e,"display")&&"none"===b.css(e,"float")&&(b.support.inlineBlockNeedsLayout&&"inline"!==un(e.nodeName)?d.zoom=1:d.display="inline-block")),n.overflow&&(d.overflow="hidden",b.support.shrinkWrapBlocks||f.always(function(){d.overflow=n.overflow[0],d.overflowX=n.overflow[1],d.overflowY=n.overflow[2]}));for(i in t)if(a=t[i],Vn.exec(a)){if(delete t[i],u=u||"toggle"===a,a===(m?"hide":"show"))continue;g.push(i)}if(o=g.length){s=b._data(e,"fxshow")||b._data(e,"fxshow",{}),"hidden"in s&&(m=s.hidden),u&&(s.hidden=!m),m?b(e).show():f.done(function(){b(e).hide()}),f.done(function(){var t;b._removeData(e,"fxshow");for(t in h)b.style(e,t,h[t])});for(i=0;o>i;i++)r=g[i],l=f.createTween(r,m?s[r]:0),h[r]=s[r]||b.style(e,r),r in s||(s[r]=l.start,m&&(l.end=l.start,l.start="width"===r||"height"===r?1:0))}}function rr(e,t,n,r,i){return new rr.prototype.init(e,t,n,r,i)}b.Tween=rr,rr.prototype={constructor:rr,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(b.cssNumber[n]?"":"px")},cur:function(){var e=rr.propHooks[this.prop];return e&&e.get?e.get(this):rr.propHooks._default.get(this)},run:function(e){var t,n=rr.propHooks[this.prop];return this.pos=t=this.options.duration?b.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):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):rr.propHooks._default.set(this),this}},rr.prototype.init.prototype=rr.prototype,rr.propHooks={_default:{get:function(e){var t;return null==e.elem[e.prop]||e.elem.style&&null!=e.elem.style[e.prop]?(t=b.css(e.elem,e.prop,""),t&&"auto"!==t?t:0):e.elem[e.prop]},set:function(e){b.fx.step[e.prop]?b.fx.step[e.prop](e):e.elem.style&&(null!=e.elem.style[b.cssProps[e.prop]]||b.cssHooks[e.prop])?b.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},rr.propHooks.scrollTop=rr.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},b.each(["toggle","show","hide"],function(e,t){var n=b.fn[t];b.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(ir(t,!0),e,r,i)}}),b.fn.extend({fadeTo:function(e,t,n,r){return this.filter(nn).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=b.isEmptyObject(e),o=b.speed(t,n,r),a=function(){var t=er(this,b.extend({},e),o);a.finish=function(){t.stop(!0)},(i||b._data(this,"finish"))&&t.stop(!0)};return a.finish=a,i||o.queue===!1?this.each(a):this.queue(o.queue,a)},stop:function(e,n,r){var i=function(e){var t=e.stop;delete e.stop,t(r)};return"string"!=typeof e&&(r=n,n=e,e=t),n&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,n=null!=e&&e+"queueHooks",o=b.timers,a=b._data(this);if(n)a[n]&&a[n].stop&&i(a[n]);else for(n in a)a[n]&&a[n].stop&&Jn.test(n)&&i(a[n]);for(n=o.length;n--;)o[n].elem!==this||null!=e&&o[n].queue!==e||(o[n].anim.stop(r),t=!1,o.splice(n,1));(t||!r)&&b.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||"fx"),this.each(function(){var t,n=b._data(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=b.timers,a=r?r.length:0;for(n.finish=!0,b.queue(this,e,[]),i&&i.cur&&i.cur.finish&&i.cur.finish.call(this),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;a>t;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}});function ir(e,t){var n,r={height:e},i=0;for(t=t?1:0;4>i;i+=2-t)n=Zt[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}b.each({slideDown:ir("show"),slideUp:ir("hide"),slideToggle:ir("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){b.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),b.speed=function(e,t,n){var r=e&&"object"==typeof e?b.extend({},e):{complete:n||!n&&t||b.isFunction(e)&&e,duration:e,easing:n&&t||t&&!b.isFunction(t)&&t};return r.duration=b.fx.off?0:"number"==typeof r.duration?r.duration:r.duration in b.fx.speeds?b.fx.speeds[r.duration]:b.fx.speeds._default,(null==r.queue||r.queue===!0)&&(r.queue="fx"),r.old=r.complete,r.complete=function(){b.isFunction(r.old)&&r.old.call(this),r.queue&&b.dequeue(this,r.queue)},r},b.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},b.timers=[],b.fx=rr.prototype.init,b.fx.tick=function(){var e,n=b.timers,r=0;for(Xn=b.now();n.length>r;r++)e=n[r],e()||n[r]!==e||n.splice(r--,1);n.length||b.fx.stop(),Xn=t},b.fx.timer=function(e){e()&&b.timers.push(e)&&b.fx.start()},b.fx.interval=13,b.fx.start=function(){Un||(Un=setInterval(b.fx.tick,b.fx.interval))},b.fx.stop=function(){clearInterval(Un),Un=null},b.fx.speeds={slow:600,fast:200,_default:400},b.fx.step={},b.expr&&b.expr.filters&&(b.expr.filters.animated=function(e){return b.grep(b.timers,function(t){return e===t.elem}).length}),b.fn.offset=function(e){if(arguments.length)return e===t?this:this.each(function(t){b.offset.setOffset(this,e,t)});var n,r,o={top:0,left:0},a=this[0],s=a&&a.ownerDocument;if(s)return n=s.documentElement,b.contains(n,a)?(typeof a.getBoundingClientRect!==i&&(o=a.getBoundingClientRect()),r=or(s),{top:o.top+(r.pageYOffset||n.scrollTop)-(n.clientTop||0),left:o.left+(r.pageXOffset||n.scrollLeft)-(n.clientLeft||0)}):o},b.offset={setOffset:function(e,t,n){var r=b.css(e,"position");"static"===r&&(e.style.position="relative");var i=b(e),o=i.offset(),a=b.css(e,"top"),s=b.css(e,"left"),u=("absolute"===r||"fixed"===r)&&b.inArray("auto",[a,s])>-1,l={},c={},p,f;u?(c=i.position(),p=c.top,f=c.left):(p=parseFloat(a)||0,f=parseFloat(s)||0),b.isFunction(t)&&(t=t.call(e,n,o)),null!=t.top&&(l.top=t.top-o.top+p),null!=t.left&&(l.left=t.left-o.left+f),"using"in t?t.using.call(e,l):i.css(l)}},b.fn.extend({position:function(){if(this[0]){var e,t,n={top:0,left:0},r=this[0];return"fixed"===b.css(r,"position")?t=r.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),b.nodeName(e[0],"html")||(n=e.offset()),n.top+=b.css(e[0],"borderTopWidth",!0),n.left+=b.css(e[0],"borderLeftWidth",!0)),{top:t.top-n.top-b.css(r,"marginTop",!0),left:t.left-n.left-b.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||o.documentElement;while(e&&!b.nodeName(e,"html")&&"static"===b.css(e,"position"))e=e.offsetParent;return e||o.documentElement})}}),b.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,n){var r=/Y/.test(n);b.fn[e]=function(i){return b.access(this,function(e,i,o){var a=or(e);return o===t?a?n in a?a[n]:a.document.documentElement[i]:e[i]:(a?a.scrollTo(r?b(a).scrollLeft():o,r?o:b(a).scrollTop()):e[i]=o,t)},e,i,arguments.length,null)}});function or(e){return b.isWindow(e)?e:9===e.nodeType?e.defaultView||e.parentWindow:!1}b.each({Height:"height",Width:"width"},function(e,n){b.each({padding:"inner"+e,content:n,"":"outer"+e},function(r,i){b.fn[i]=function(i,o){var a=arguments.length&&(r||"boolean"!=typeof i),s=r||(i===!0||o===!0?"margin":"border");return b.access(this,function(n,r,i){var o;return b.isWindow(n)?n.document.documentElement["client"+e]:9===n.nodeType?(o=n.documentElement,Math.max(n.body["scroll"+e],o["scroll"+e],n.body["offset"+e],o["offset"+e],o["client"+e])):i===t?b.css(n,r,s):b.style(n,r,i,s)},n,a?i:t,a,null)}})}),e.jQuery=e.$=b,"function"==typeof define&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return b})})(window); \ No newline at end of file
diff --git a/view/js/jquery.spin.js b/view/js/jquery.spin.js
new file mode 100644
index 000000000..a35a27765
--- /dev/null
+++ b/view/js/jquery.spin.js
@@ -0,0 +1,80 @@
+/**
+ * Copyright (c) 2011-2013 Felix Gnass
+ * Licensed under the MIT license
+ */
+
+/*
+
+Basic Usage:
+============
+
+$('#el').spin(); // Creates a default Spinner using the text color of #el.
+$('#el').spin({ ... }); // Creates a Spinner using the provided options.
+
+$('#el').spin(false); // Stops and removes the spinner.
+
+Using Presets:
+==============
+
+$('#el').spin('small'); // Creates a 'small' Spinner using the text color of #el.
+$('#el').spin('large', '#fff'); // Creates a 'large' white Spinner.
+
+Adding a custom preset:
+=======================
+
+$.fn.spin.presets.flower = {
+ lines: 9
+ length: 10
+ width: 20
+ radius: 0
+}
+
+$('#el').spin('flower', 'red');
+
+*/
+
+(function(factory) {
+
+ if (typeof exports == 'object') {
+ // CommonJS
+ factory(require('jquery'), require('spin'))
+ }
+ else if (typeof define == 'function' && define.amd) {
+ // AMD, register as anonymous module
+ define(['jquery', 'spin'], factory)
+ }
+ else {
+ // Browser globals
+ if (!window.Spinner) throw new Error('Spin.js not present')
+ factory(window.jQuery, window.Spinner)
+ }
+
+}(function($, Spinner) {
+
+ $.fn.spin = function(opts, color) {
+
+ return this.each(function() {
+ var $this = $(this),
+ data = $this.data();
+
+ if (data.spinner) {
+ data.spinner.stop();
+ delete data.spinner;
+ }
+ if (opts !== false) {
+ opts = $.extend(
+ { color: color || $this.css('color') },
+ $.fn.spin.presets[opts] || opts
+ )
+ data.spinner = new Spinner(opts).spin(this)
+ }
+ })
+ }
+
+ $.fn.spin.presets = {
+ tiny: { lines: 8, length: 2, width: 2, radius: 3 },
+ small: { lines: 8, length: 4, width: 3, radius: 5 },
+ large: { lines: 10, length: 8, width: 4, radius: 8 }
+ }
+
+}));
diff --git a/js/jquery.textinputs.js b/view/js/jquery.textinputs.js
index fd6d14569..fd6d14569 100644
--- a/js/jquery.textinputs.js
+++ b/view/js/jquery.textinputs.js
diff --git a/view/js/main.js b/view/js/main.js
new file mode 100644
index 000000000..c8e9fc9a2
--- /dev/null
+++ b/view/js/main.js
@@ -0,0 +1,1211 @@
+
+ function confirmDelete() { return confirm(aStr['delitem']); }
+ function commentOpen(obj,id) {
+ if(obj.value == aStr['comment']) {
+ obj.value = '';
+ $("#comment-edit-text-" + id).addClass("comment-edit-text-full");
+ $("#comment-edit-text-" + id).removeClass("comment-edit-text-empty");
+ $("#mod-cmnt-wrap-" + id).show();
+ openMenu("comment-edit-submit-wrapper-" + id);
+ return true;
+ }
+ return false;
+ }
+ function commentClose(obj,id) {
+ if(obj.value == '') {
+ obj.value = aStr['comment'];
+ $("#comment-edit-text-" + id).removeClass("comment-edit-text-full");
+ $("#comment-edit-text-" + id).addClass("comment-edit-text-empty");
+ $("#mod-cmnt-wrap-" + id).hide();
+ closeMenu("comment-edit-submit-wrapper-" + id);
+ return true;
+ }
+ return false;
+ }
+
+ function showHideCommentBox(id) {
+ if( $('#comment-edit-form-' + id).is(':visible')) {
+ $('#comment-edit-form-' + id).hide();
+ }
+ else {
+ $('#comment-edit-form-' + id).show();
+ }
+ }
+
+
+ function commentInsert(obj,id) {
+ var tmpStr = $("#comment-edit-text-" + id).val();
+ if(tmpStr == '$comment') {
+ tmpStr = '';
+ $("#comment-edit-text-" + id).addClass("comment-edit-text-full");
+ $("#comment-edit-text-" + id).removeClass("comment-edit-text-empty");
+ openMenu("comment-edit-submit-wrapper-" + id);
+ }
+ var ins = $(obj).html();
+ ins = ins.replace('&lt;','<');
+ ins = ins.replace('&gt;','>');
+ ins = ins.replace('&amp;','&');
+ ins = ins.replace('&quot;','"');
+ $("#comment-edit-text-" + id).val(tmpStr + ins);
+ }
+
+
+ function insertbbcomment(comment,BBcode,id) {
+ // allow themes to override this
+ if(typeof(insertFormatting) != 'undefined')
+ return(insertFormatting(comment,BBcode,id));
+
+ var tmpStr = $("#comment-edit-text-" + id).val();
+ if(tmpStr == comment) {
+ tmpStr = "";
+ $("#comment-edit-text-" + id).addClass("comment-edit-text-full");
+ $("#comment-edit-text-" + id).removeClass("comment-edit-text-empty");
+ openMenu("comment-edit-submit-wrapper-" + id);
+ $("#comment-edit-text-" + id).val(tmpStr);
+ }
+
+ textarea = document.getElementById("comment-edit-text-" +id);
+ if (document.selection) {
+ textarea.focus();
+ selected = document.selection.createRange();
+ selected.text = "["+BBcode+"]" + selected.text + "[/"+BBcode+"]";
+ } else if (textarea.selectionStart || textarea.selectionStart == "0") {
+ var start = textarea.selectionStart;
+ var end = textarea.selectionEnd;
+ textarea.value = textarea.value.substring(0, start) + "["+BBcode+"]" + textarea.value.substring(start, end) + "[/"+BBcode+"]" + textarea.value.substring(end, textarea.value.length);
+ }
+ return true;
+ }
+
+
+
+
+ function qCommentInsert(obj,id) {
+ var tmpStr = $("#comment-edit-text-" + id).val();
+ if(tmpStr == aStr['comment']) {
+ tmpStr = '';
+ $("#comment-edit-text-" + id).addClass("comment-edit-text-full");
+ $("#comment-edit-text-" + id).removeClass("comment-edit-text-empty");
+ openMenu("comment-edit-submit-wrapper-" + id);
+ }
+ var ins = $(obj).val();
+ ins = ins.replace('&lt;','<');
+ ins = ins.replace('&gt;','>');
+ ins = ins.replace('&amp;','&');
+ ins = ins.replace('&quot;','"');
+ $("#comment-edit-text-" + id).val(tmpStr + ins);
+ $(obj).val('');
+ }
+
+ function showHideComments(id) {
+ if( $('#collapsed-comments-' + id).is(':visible')) {
+ $('#collapsed-comments-' + id).hide();
+ $('#hide-comments-' + id).html(aStr['showmore']);
+ }
+ else {
+ $('#collapsed-comments-' + id).show();
+ $('#hide-comments-' + id).html(aStr['showfewer']);
+ }
+ }
+
+
+ function openClose(theID) {
+ if(document.getElementById(theID).style.display == "block") {
+ document.getElementById(theID).style.display = "none"
+ }
+ else {
+ document.getElementById(theID).style.display = "block"
+ }
+ }
+
+ function openMenu(theID) {
+ document.getElementById(theID).style.display = "block"
+ }
+
+ function closeMenu(theID) {
+ document.getElementById(theID).style.display = "none"
+ }
+
+ function markRead(notifType) {
+ $.get('ping?f=&markRead='+notifType);
+ if(timer) clearTimeout(timer);
+ $('#' + notifType + '-update').html('');
+ timer = setTimeout(NavUpdate,2000);
+ }
+
+ var src = null;
+ var prev = null;
+ var livetime = null;
+ var msie = false;
+ var stopped = false;
+ var totStopped = false;
+ var timer = null;
+ var pr = 0;
+ var liking = 0;
+ var in_progress = false;
+ var langSelect = false;
+ var commentBusy = false;
+ var last_popup_menu = null;
+ var last_popup_button = null;
+ var scroll_next = false;
+ var next_page = 1;
+ var page_load = true;
+ var loadingPage = true;
+ var pageHasMoreContent = true;
+ var updateCountsOnly = false;
+
+ $(function() {
+ $.ajaxSetup({cache: false});
+
+ msie = false; // $.browser.msie ;
+
+ /* setup tooltips *//*
+ $("a,.tt").each(function(){
+ var e = $(this);
+ var pos="bottom";
+ if (e.hasClass("tttop")) pos="top";
+ if (e.hasClass("ttbottom")) pos="bottom";
+ if (e.hasClass("ttleft")) pos="left";
+ if (e.hasClass("ttright")) pos="right";
+ e.tipTip({defaultPosition: pos, edgeOffset: 8});
+ });*/
+
+ var e = document.getElementById('content-complete');
+ if(e)
+ pageHasMoreContent = false;
+
+ /* setup onoff widgets */
+ $(".onoff input").each(function(){
+ val = $(this).val();
+ id = $(this).attr("id");
+ $("#"+id+"_onoff ."+ (val==0?"on":"off")).addClass("hidden");
+
+ });
+ $(".onoff > a").click(function(event){
+ event.preventDefault();
+ var input = $(this).siblings("input");
+ var val = 1-input.val();
+ var id = input.attr("id");
+ $("#"+id+"_onoff ."+ (val==0?"on":"off")).addClass("hidden");
+ $("#"+id+"_onoff ."+ (val==1?"on":"off")).removeClass("hidden");
+ input.val(val);
+ //console.log(id);
+ });
+
+ /* setup field_richtext */
+ setupFieldRichtext();
+
+ /* popup menus */
+ function close_last_popup_menu() {
+ if(last_popup_menu) {
+ last_popup_menu.hide();
+/* last_popup_button.removeClass("selected"); */
+ last_popup_menu = null;
+ last_popup_button = null;
+ }
+ }
+
+ /* Turn elements with one of our special rel tags into popup menus */
+
+ $('a[rel^=#]').click(function(e){
+ manage_popup_menu(this,e);
+ return false;
+ });
+
+ $('span[rel^=#]').click(function(e){
+ manage_popup_menu(this,e);
+ return false;
+ });
+
+
+ function manage_popup_menu(w,e) {
+ close_last_popup_menu();
+ menu = $( $(w).attr('rel') );
+ e.preventDefault();
+ e.stopPropagation();
+ if (menu.attr('popup')=="false") return false;
+/* $(w).parent().toggleClass("selected"); */
+ /* notification menus are loaded dynamically
+ * - here we find a rel tag to figure out what type of notification to load */
+ var loader_source = $(menu).attr('rel');
+
+ if(typeof(loader_source) != 'undefined' && loader_source.length) {
+ notify_popup_loader(loader_source);
+ }
+ menu.toggle();
+ if (menu.css("display") == "none") {
+ last_popup_menu = null;
+ last_popup_button = null;
+ } else {
+ last_popup_menu = menu;
+ last_popup_button = $(w).parent();
+ }
+ return false;
+ }
+
+ $('html').click(function() {
+ close_last_popup_menu();
+ });
+
+ // fancyboxes
+ $("a.popupbox").fancybox({
+ 'transitionIn' : 'elastic',
+ 'transitionOut' : 'elastic'
+ });
+
+
+
+ NavUpdate();
+ // Allow folks to stop the ajax page updates with the pause/break key
+ $(document).keydown(function(event) {
+ if(event.keyCode == '8') {
+ var target = event.target || event.srcElement;
+ if (!/input|textarea/i.test(target.nodeName)) {
+ return false;
+ }
+ }
+ if(event.keyCode == '19' || (event.ctrlKey && event.which == '32')) {
+ event.preventDefault();
+ if(stopped == false) {
+ stopped = true;
+ if (event.ctrlKey) {
+ totStopped = true;
+ }
+ $('#pause').html('<img src="images/pause.gif" alt="pause" style="border: 1px solid black;" />');
+ } else {
+ unpause();
+ }
+ } else {
+ if (!totStopped) {
+ unpause();
+ }
+ }
+ });
+
+
+ });
+
+ function NavUpdate() {
+
+ if(liking)
+ $('.like-rotator').spin(false);
+
+ if(! stopped) {
+
+ var pingCmd = 'ping' + ((localUser != 0) ? '?f=&uid=' + localUser : '');
+
+ $.get(pingCmd,function(data) {
+
+ if(data.invalid == 1) {
+ window.location.href=window.location.href
+ }
+
+
+ if(! updateCountsOnly) {
+ // start live update
+
+ if($('#live-network').length) { src = 'network'; liveUpdate(); }
+ if($('#live-channel').length) { src = 'channel'; liveUpdate(); }
+ if($('#live-community').length) { src = 'community'; liveUpdate(); }
+ if($('#live-display').length) { src = 'display'; liveUpdate(); }
+ if($('#live-search').length) { src = 'search'; liveUpdate(); }
+
+ if($('#live-photos').length) {
+ if(liking) {
+ liking = 0;
+ window.location.href=window.location.href
+ }
+ }
+ }
+
+ updateCountsOnly = false;
+
+ if(data.network == 0) {
+ data.network = '';
+ $('#net-update').removeClass('show')
+ }
+ else {
+ $('#net-update').addClass('show')
+ }
+ $('#net-update').html(data.network);
+
+ if(data.home == 0) { data.home = ''; $('#home-update').removeClass('show') } else { $('#home-update').addClass('show') }
+ $('#home-update').html(data.home);
+
+
+ if(data.intros == 0) { data.intros = ''; $('#intro-update').removeClass('show') } else { $('#intro-update').addClass('show') }
+ $('#intro-update').html(data.intros);
+
+ if(data.mail == 0) { data.mail = ''; $('#mail-update').removeClass('show') } else { $('#mail-update').addClass('show') }
+ $('#mail-update').html(data.mail);
+
+
+ if(data.notify == 0) { data.notify = ''; $('#notify-update').removeClass('show') } else { $('#notify-update').addClass('show') }
+ $('#notify-update').html(data.notify);
+
+ if(data.register == 0) { data.register = ''; $('#register-update').removeClass('show') } else { $('#register-update').addClass('show') }
+ $('#register-update').html(data.register);
+
+ if(data.events == 0) { data.events = ''; $('#events-update').removeClass('show') } else { $('#events-update').addClass('show') }
+ $('#events-update').html(data.events);
+
+ if(data.events_today == 0) { data.events_today = ''; $('#events-today-update').removeClass('show') } else { $('#events-today-update').addClass('show') }
+ $('#events-today-update').html(data.events_today);
+
+ if(data.birthdays == 0) { data.birthdays = ''; $('#birthdays-update').removeClass('show') } else { $('#birthdays-update').addClass('show') }
+ $('#birthdays-update').html(data.birthdays);
+
+ if(data.birthdays_today == 0) { data.birthdays_today = ''; $('#birthdays-today-update').removeClass('show') } else { $('#birthdays-today-update').addClass('show') }
+ $('#birthdays-today-update').html(data.birthdays_today);
+
+ if(data.all_events == 0) { data.all_events = ''; $('#all_events-update').removeClass('show') } else { $('#all_events-update').addClass('show') }
+ $('#all_events-update').html(data.all_events);
+ if(data.all_events_today == 0) { data.all_events_today = ''; $('#all_events-today-update').removeClass('show') } else { $('#all_events-today-update').addClass('show') }
+ $('#all_events-today-update').html(data.all_events_today);
+
+
+ $(data.notice).each(function() {
+ $.jGrowl(this.message, { sticky: true, theme: 'notice' });
+ });
+
+ $(data.info).each(function(){
+ $.jGrowl(this.message, { sticky: false, theme: 'info', life: 10000 });
+ });
+
+
+
+ }) ;
+ }
+ timer = setTimeout(NavUpdate,updateInterval);
+ }
+
+
+function updateConvItems(mode,data) {
+
+
+
+ if(mode === 'update') {
+ prev = 'threads-begin';
+
+
+ $('.thread-wrapper.toplevel_item',data).each(function() {
+
+ var ident = $(this).attr('id');
+ var commentWrap = $('#'+ident+' .collapsed-comments').attr('id');
+ var itmId = 0;
+ var isVisible = false;
+
+ if(typeof commentWrap !== 'undefined')
+ itmId = commentWrap.replace('collapsed-comments-','');
+
+ if($('#' + ident).length == 0 && profile_page == 1) {
+ $('img',this).each(function() {
+ $(this).attr('src',$(this).attr('dst'));
+ });
+ if($('#collapsed-comments-'+itmId).is(':visible'))
+ isVisible = true;
+ $('#' + prev).after($(this));
+ if(isVisible)
+ showHideComments(itmId);
+ $(".autotime").timeago();
+ // divgrow doesn't prevent itself from attaching a second (or 500th)
+ // "show more" div to a content region - it also has a few other
+ // issues related to how we're trying to use it.
+ // disable for now.
+ // $("div.wall-item-body").divgrow({ initialHeight: 400 });
+ }
+ else {
+ $('img',this).each(function() {
+ $(this).attr('src',$(this).attr('dst'));
+ });
+ // more FIXME related to expanded comments
+ if($('#collapsed-comments-'+itmId).is(':visible'))
+ isVisible = true;
+ $('#' + ident).replaceWith($(this));
+ if(isVisible)
+ showHideComments(itmId);
+ $(".autotime").timeago();
+ // $("div.wall-item-body").divgrow({ initialHeight: 400 });
+
+ }
+ prev = ident;
+ });
+ }
+ if(mode === 'append') {
+
+ next = 'threads-end';
+
+
+
+ $('.thread-wrapper.toplevel_item',data).each(function() {
+
+
+ var ident = $(this).attr('id');
+ var commentWrap = $('#'+ident+' .collapsed-comments').attr('id');
+ var itmId = 0;
+ var isVisible = false;
+
+ if(typeof commentWrap !== 'undefined')
+ itmId = commentWrap.replace('collapsed-comments-','');
+
+ if($('#' + ident).length == 0) {
+ $('img',this).each(function() {
+ $(this).attr('src',$(this).attr('dst'));
+ });
+ if($('#collapsed-comments-'+itmId).is(':visible'))
+ isVisible = true;
+ $('#threads-end').before($(this));
+ if(isVisible)
+ showHideComments(itmId);
+ $(".autotime").timeago();
+ // $("div.wall-item-body").divgrow({ initialHeight: 400 });
+
+ }
+ else {
+ $('img',this).each(function() {
+ $(this).attr('src',$(this).attr('dst'));
+ });
+ if($('#collapsed-comments-'+itmId).is(':visible'))
+ isVisible = true;
+ $('#' + ident).replaceWith($(this));
+ if(isVisible)
+ showHideComments(itmId);
+ $(".autotime").timeago();
+ // $("div.wall-item-body").divgrow({ initialHeight: 400 });
+ }
+ });
+
+ if(loadingPage) {
+ loadingPage = false;
+ }
+ }
+ if(mode === 'replace') {
+ // clear existing content
+ $('.thread-wrapper').remove();
+
+ prev = 'threads-begin';
+
+ $('.thread-wrapper.toplevel_item',data).each(function() {
+
+ var ident = $(this).attr('id');
+ var commentWrap = $('#'+ident+' .collapsed-comments').attr('id');
+ var itmId = 0;
+ var isVisible = false;
+
+ if(typeof commentWrap !== 'undefined')
+ itmId = commentWrap.replace('collapsed-comments-','');
+
+ if($('#' + ident).length == 0 && profile_page == 1) {
+ $('img',this).each(function() {
+ $(this).attr('src',$(this).attr('dst'));
+ });
+
+ if($('#collapsed-comments-'+itmId).is(':visible'))
+ isVisible = true;
+ $('#' + prev).after($(this));
+ if(isVisible)
+ showHideComments(itmId);
+ $(".autotime").timeago();
+
+ // $("div.wall-item-body").divgrow({ initialHeight: 400 });
+ }
+ prev = ident;
+ });
+
+ if(loadingPage) {
+ loadingPage = false;
+ }
+ }
+
+ $('.like-rotator').spin(false);
+
+ if(commentBusy) {
+ commentBusy = false;
+ $('body').css('cursor', 'auto');
+ }
+
+ /* autocomplete @nicknames */
+ $(".comment-edit-form textarea").contact_autocomplete(baseurl+"/acl");
+
+ var bimgs = $(".wall-item-body img").not(function() { return this.complete; });
+ var bimgcount = bimgs.length;
+
+ if (bimgcount) {
+ bimgs.load(function() {
+ bimgcount--;
+ if (! bimgcount) {
+ collapseHeight();
+
+ }
+ });
+ } else {
+ collapseHeight();
+ }
+
+
+ // $(".wall-item-body").each(function() {
+ // if(! $(this).hasClass('divmore')) {
+ // $(this).divgrow({ initialHeight: 400, showBrackets: false });
+ // $(this).addClass('divmore');
+ // }
+ //});
+
+}
+
+
+ function collapseHeight() {
+ $(".wall-item-body").each(function() {
+ if($(this).height() > 410) {
+ if(! $(this).hasClass('divmore')) {
+ $(this).divgrow({ initialHeight: 400, showBrackets: false });
+ $(this).addClass('divmore');
+ }
+ }
+ });
+ }
+
+
+
+
+
+ function liveUpdate() {
+ if((src == null) || (stopped) || (! profile_uid)) { $('.like-rotator').spin(false); return; }
+ if(($('.comment-edit-text-full').length) || (in_progress)) {
+ if(livetime) {
+ clearTimeout(livetime);
+ }
+ livetime = setTimeout(liveUpdate, 10000);
+ return;
+ }
+ if(livetime != null)
+ livetime = null;
+
+ prev = 'live-' + src;
+
+ in_progress = true;
+
+ var update_url;
+
+ if(typeof buildCmd == 'function') {
+ if(scroll_next) {
+ bParam_page = next_page;
+ page_load = true;
+ }
+ else {
+ bParam_page = 1;
+ }
+ update_url = buildCmd();
+ }
+ else {
+ page_load = false;
+ var udargs = ((page_load) ? '/load' : '');
+ update_url = 'update_' + src + udargs + '&p=' + profile_uid + '&page=' + profile_page + '&msie=' + ((msie) ? 1 : 0);
+ }
+
+ if(page_load)
+ $("#page-spinner").spin('small');
+
+ $.get(update_url,function(data) {
+ var update_mode = ((page_load) ? 'replace' : 'update');
+ if(scroll_next)
+ update_mode = 'append';
+ page_load = false;
+ scroll_next = false;
+ in_progress = false;
+ updateConvItems(update_mode,data);
+ $("#page-spinner").spin(false);
+ $("#profile-jot-text-loading").spin(false);
+
+ // FIXME - the following lines were added so that almost
+ // immediately after we update the posts on the page, we
+ // re-check and update the notification counts.
+ // As it turns out this causes a bit of an inefficiency
+ // as we're pinging twice for every update, once before
+ // and once after. A btter way to do this is to rewrite
+ // NavUpdate and perhpas LiveUpdate so that we check for
+ // post updates first and only call the notification ping
+ // once.
+
+ updateCountsOnly = true;
+ if(timer) clearTimeout(timer);
+ timer = setTimeout(NavUpdate,10);
+ });
+
+
+ }
+
+
+ function imgbright(node) {
+// $(node).removeClass("drophide").addClass("drop");
+ }
+
+ function imgdull(node) {
+// $(node).removeClass("drop").addClass("drophide");
+ }
+
+ function notify_popup_loader(notifyType) {
+
+ /* notifications template */
+ var notifications_tpl= unescape($("#nav-notifications-template[rel=template]").html());
+ var notifications_all = unescape($('<div>').append( $("#nav-" + notifyType + "-see-all").clone() ).html()); //outerHtml hack
+ var notifications_mark = unescape($('<div>').append( $("#nav-" + notifyType + "-mark-all").clone() ).html()); //outerHtml hack
+ var notifications_empty = unescape($("#nav-" + notifyType + "-menu").html());
+
+ var notify_menu = $("#nav-" + notifyType + "-menu");
+
+ var pingExCmd = 'ping/' + notifyType + ((localUser != 0) ? '?f=&uid=' + localUser : '');
+ $.get(pingExCmd,function(data) {
+
+ if(data.invalid == 1) {
+ window.location.href=window.location.href
+ }
+
+
+ if(data.notify.length==0){
+ $("#nav-" + notifyType + "-menu").html(notifications_empty);
+
+ } else {
+ $("#nav-" + notifyType + "-menu").html(notifications_all + notifications_mark);
+
+
+ $(data.notify).each(function() {
+ text = "<span class='contactname'>"+this.name+"</span>" + ' ' + this.message + '<br />';
+ html = notifications_tpl.format(this.notify_link,this.photo,text,this.when,this.class);
+ $("#nav-" + notifyType + "-menu").append(html);
+ });
+
+ }
+ });
+
+ }
+
+
+ // Since our ajax calls are asynchronous, we will give a few
+ // seconds for the first ajax call (setting like/dislike), then
+ // run the updater to pick up any changes and display on the page.
+ // The updater will turn any rotators off when it's done.
+ // This function will have returned long before any of these
+ // events have completed and therefore there won't be any
+ // visible feedback that anything changed without all this
+ // trickery. This still could cause confusion if the "like" ajax call
+ // is delayed and NavUpdate runs before it completes.
+
+
+ function dolike(ident,verb) {
+ unpause();
+ $('#like-rotator-' + ident.toString()).spin('tiny');
+ $.get('like/' + ident.toString() + '?verb=' + verb, NavUpdate );
+ liking = 1;
+ }
+
+ function dosubthread(ident) {
+ unpause();
+ $('#like-rotator-' + ident.toString()).spin('tiny');
+ $.get('subthread/' + ident.toString(), NavUpdate );
+ liking = 1;
+ }
+
+
+ function dostar(ident) {
+ ident = ident.toString();
+ $('#like-rotator-' + ident).spin('tiny');
+ $.get('starred/' + ident, function(data) {
+ if(data.result == 1) {
+ $('#starred-' + ident).addClass('starred');
+ $('#starred-' + ident).removeClass('unstarred');
+ $('#starred-' + ident).addClass('icon-star-full');
+ $('#starred-' + ident).removeClass('icon-star-empty');
+ $('#star-' + ident).addClass('hidden');
+ $('#unstar-' + ident).removeClass('hidden');
+ }
+ else {
+ $('#starred-' + ident).addClass('unstarred');
+ $('#starred-' + ident).removeClass('starred');
+ $('#starred-' + ident).addClass('icon-star-empty');
+ $('#starred-' + ident).removeClass('icon-star-full');
+ $('#star-' + ident).removeClass('hidden');
+ $('#unstar-' + ident).addClass('hidden');
+ }
+ $('#like-rotator-' + ident).spin(false);
+ });
+ }
+
+ function getPosition(e) {
+ var cursor = {x:0, y:0};
+ if ( e.pageX || e.pageY ) {
+ cursor.x = e.pageX;
+ cursor.y = e.pageY;
+ }
+ else {
+ if( e.clientX || e.clientY ) {
+ cursor.x = e.clientX + (document.documentElement.scrollLeft || document.body.scrollLeft) - document.documentElement.clientLeft;
+ cursor.y = e.clientY + (document.documentElement.scrollTop || document.body.scrollTop) - document.documentElement.clientTop;
+ }
+ else {
+ if( e.x || e.y ) {
+ cursor.x = e.x;
+ cursor.y = e.y;
+ }
+ }
+ }
+ return cursor;
+ }
+
+ var lockvisible = false;
+
+ function lockview(event,id) {
+ event = event || window.event;
+ cursor = getPosition(event);
+ if(lockvisible) {
+ lockviewhide();
+ }
+ else {
+ lockvisible = true;
+ $.get('lockview/' + id, function(data) {
+ $('#panel').html(data);
+ $('#panel').css({ 'left': cursor.x + 5 , 'top': cursor.y + 5});
+ $('#panel').show();
+ });
+ }
+ }
+
+ function lockviewhide() {
+ lockvisible = false;
+ $('#panel').hide();
+ }
+
+ function post_comment(id) {
+ unpause();
+ commentBusy = true;
+ $('body').css('cursor', 'wait');
+ $("#comment-preview-inp-" + id).val("0");
+ $.post(
+ "item",
+ $("#comment-edit-form-" + id).serialize(),
+ function(data) {
+ if(data.success) {
+ $("#comment-edit-wrapper-" + id).hide();
+ $("#comment-edit-text-" + id).val('');
+ var tarea = document.getElementById("comment-edit-text-" + id);
+ if(tarea)
+ commentClose(tarea,id);
+ if(timer) clearTimeout(timer);
+ timer = setTimeout(NavUpdate,1500);
+ }
+ if(data.reload) {
+ window.location.href=data.reload;
+ }
+ },
+ "json"
+ );
+ return false;
+ }
+
+
+ function preview_comment(id) {
+ $("#comment-preview-inp-" + id).val("1");
+ $("#comment-edit-preview-" + id).show();
+ $.post(
+ "item",
+ $("#comment-edit-form-" + id).serialize(),
+ function(data) {
+ if(data.preview) {
+
+ $("#comment-edit-preview-" + id).html(data.preview);
+ $("#comment-edit-preview-" + id + " a").click(function() { return false; });
+ }
+ },
+ "json"
+ );
+ return true;
+ }
+
+
+
+ function preview_post() {
+ $("#jot-preview").val("1");
+ $("#jot-preview-content").show();
+ tinyMCE.triggerSave();
+ $.post(
+ "item",
+ $("#profile-jot-form").serialize(),
+ function(data) {
+ if(data.preview) {
+ $("#jot-preview-content").html(data.preview);
+ $("#jot-preview-content" + " a").click(function() { return false; });
+ }
+ },
+ "json"
+ );
+ $("#jot-preview").val("0");
+ return true;
+ }
+
+
+ function unpause() {
+ // unpause auto reloads if they are currently stopped
+ totStopped = false;
+ stopped = false;
+ $('#pause').html('');
+ }
+
+
+ function bin2hex(s){
+ // Converts the binary representation of data to hex
+ //
+ // version: 812.316
+ // discuss at: http://phpjs.org/functions/bin2hex
+ // + original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
+ // + bugfixed by: Onno Marsman
+ // + bugfixed by: Linuxworld
+ // * example 1: bin2hex('Kev');
+ // * returns 1: '4b6576'
+ // * example 2: bin2hex(String.fromCharCode(0x00));
+ // * returns 2: '00'
+ var v,i, f = 0, a = [];
+ s += '';
+ f = s.length;
+
+ for (i = 0; i<f; i++) {
+ a[i] = s.charCodeAt(i).toString(16).replace(/^([\da-f])$/,"0$1");
+ }
+
+ return a.join('');
+ }
+
+ function hex2bin(hex) {
+ var bytes = [], str;
+
+ for(var i=0; i< hex.length-1; i+=2)
+ bytes.push(parseInt(hex.substr(i, 2), 16));
+
+ return String.fromCharCode.apply(String, bytes);
+ }
+
+ function groupChangeMember(gid, cid, sec_token) {
+ $('body .fakelink').css('cursor', 'wait');
+ $.get('group/' + gid + '/' + cid + "?t=" + sec_token, function(data) {
+ $('#group-update-wrapper').html(data);
+ $('body .fakelink').css('cursor', 'auto');
+ });
+ }
+
+ function profChangeMember(gid,cid) {
+ $('body .fakelink').css('cursor', 'wait');
+ $.get('profperm/' + gid + '/' + cid, function(data) {
+ $('#prof-update-wrapper').html(data);
+ $('body .fakelink').css('cursor', 'auto');
+ });
+ }
+
+ function contactgroupChangeMember(gid,cid) {
+ $('body').css('cursor', 'wait');
+ $.get('contactgroup/' + gid + '/' + cid, function(data) {
+ $('body').css('cursor', 'auto');
+ });
+ }
+
+
+function checkboxhighlight(box) {
+ if($(box).is(':checked')) {
+ $(box).addClass('checkeditem');
+ }
+ else {
+ $(box).removeClass('checkeditem');
+ }
+}
+
+
+// code from http://www.tinymce.com/wiki.php/How-to_implement_a_custom_file_browser
+function fcFileBrowser (field_name, url, type, win) {
+ /* TODO: If you work with sessions in PHP and your client doesn't accept cookies you might need to carry
+ the session name and session ID in the request string (can look like this: "?PHPSESSID=88p0n70s9dsknra96qhuk6etm5").
+ These lines of code extract the necessary parameters and add them back to the filebrowser URL again. */
+
+
+ var cmsURL = baseurl+"/fbrowser/"+type+"/";
+
+ tinyMCE.activeEditor.windowManager.open({
+ file : cmsURL,
+ title : 'File Browser',
+ width : 420, // Your dimensions may differ - toy around with them!
+ height : 400,
+ resizable : "yes",
+ inline : "yes", // This parameter only has an effect if you use the inlinepopups plugin!
+ close_previous : "no"
+ }, {
+ window : win,
+ input : field_name
+ });
+ return false;
+ }
+
+function setupFieldRichtext(){
+ tinyMCE.init({
+ theme : "advanced",
+ mode : "specific_textareas",
+ editor_selector: "fieldRichtext",
+ plugins : "bbcode,paste, inlinepopups",
+ theme_advanced_buttons1 : "bold,italic,underline,undo,redo,link,unlink,image,forecolor,formatselect,code",
+ theme_advanced_buttons2 : "",
+ theme_advanced_buttons3 : "",
+ theme_advanced_toolbar_location : "top",
+ theme_advanced_toolbar_align : "center",
+ theme_advanced_blockformats : "blockquote,code",
+ paste_text_sticky : true,
+ entity_encoding : "raw",
+ add_unload_trigger : false,
+ remove_linebreaks : false,
+ force_p_newlines : false,
+ force_br_newlines : true,
+ forced_root_block : '',
+ convert_urls: false,
+ content_css: baseurl+"/view/custom_tinymce.css",
+ theme_advanced_path : false,
+ file_browser_callback : "fcFileBrowser",
+ });
+}
+
+
+/**
+ * sprintf in javascript
+ * "{0} and {1}".format('zero','uno');
+ **/
+String.prototype.format = function() {
+ var formatted = this;
+ for (var i = 0; i < arguments.length; i++) {
+ var regexp = new RegExp('\\{'+i+'\\}', 'gi');
+ formatted = formatted.replace(regexp, arguments[i]);
+ }
+ return formatted;
+};
+// Array Remove
+Array.prototype.remove = function(item) {
+ to=undefined; from=this.indexOf(item);
+ var rest = this.slice((to || from) + 1 || this.length);
+ this.length = from < 0 ? this.length + from : from;
+ return this.push.apply(this, rest);
+};
+
+function previewTheme(elm) {
+ theme = $(elm).val();
+ $.getJSON('pretheme?f=&theme=' + theme,function(data) {
+ $('#theme-preview').html('<div id="theme-desc">' + data.desc + '</div><div id="theme-version">' + data.version + '</div><div id="theme-credits">' + data.credits + '</div><a href="' + data.img + '"><img src="' + data.img + '" width="320" height="240" alt="' + theme + '" /></a>');
+ });
+
+}
+
+$(document).ready(function() {
+
+ jQuery.timeago.settings.strings = {
+ prefixAgo : aStr['t01'],
+ prefixFromNow : aStr['t02'],
+ suffixAgo : aStr['t03'],
+ suffixFromNow : aStr['t04'],
+ seconds : aStr['t05'],
+ minute : aStr['t06'],
+ minutes : aStr['t07'],
+ hour : aStr['t08'],
+ hours : aStr['t09'],
+ day : aStr['t10'],
+ days : aStr['t11'],
+ month : aStr['t12'],
+ months : aStr['t13'],
+ year : aStr['t14'],
+ years : aStr['t15'],
+ wordSeparator : aStr['t16'],
+ numbers : aStr['t17'],
+ };
+
+
+ $(".autotime").timeago();
+
+});
+
+ function zFormError(elm,x) {
+ if(x) {
+ $(elm).addClass("zform-error");
+ $(elm).removeClass("zform-ok");
+ }
+ else {
+ $(elm).addClass("zform-ok");
+ $(elm).removeClass("zform-error");
+ }
+ }
+
+
+
+$(window).scroll(function () {
+ if(typeof buildCmd == 'function') {
+ $('#more').hide();
+ $('#no-more').hide();
+
+ if($(window).scrollTop() + $(window).height() > $(document).height() - 200) {
+ $('#more').css("top","400");
+ $('#more').show();
+ }
+
+ if($(window).scrollTop() + $(window).height() == $(document).height()) {
+ if((pageHasMoreContent) && (! loadingPage)) {
+ $('#more').hide();
+ $('#no-more').hide();
+ // alert('scroll');
+ next_page++;
+ scroll_next = true;
+ loadingPage = true;
+ liveUpdate();
+ }
+
+ }
+ }
+});
+
+var chanviewFullSize = false;
+
+function chanviewFull() {
+ if(chanviewFullSize) {
+ chanviewFullSize = false;
+ $('#chanview-iframe-border').css({ 'position' : 'relative', 'z-index' : '10' });
+ $('#remote-channel').css({ 'position' : 'relative' , 'z-index' : '10' });
+ }
+ else {
+ chanviewFullSize = true;
+ $('#chanview-iframe-border').css({ 'position' : 'fixed', 'top' : '0', 'left' : '0', 'z-index' : '150001' });
+ $('#remote-channel').css({ 'position' : 'fixed', 'top' : '0', 'left' : '0', 'z-index' : '150000' });
+ resize_iframe();
+ }
+}
+
+ function addhtmltext(data) {
+ data = h2b(data);
+ addeditortext(data);
+ }
+
+ function addeditortext(data) {
+ if(plaintext == 'none') {
+ var currentText = $("#profile-jot-text").val();
+ $("#profile-jot-text").val(currentText + data);
+ }
+ else
+ tinyMCE.execCommand('mceInsertRawHTML',false,data);
+ }
+
+
+ function h2b(s) {
+ var y = s;
+ function rep(re, str) {
+ y = y.replace(re,str);
+ };
+
+ rep(/<a.*?href=\"(.*?)\".*?>(.*?)<\/a>/gi,"[url=$1]$2[/url]");
+ rep(/<span style=\"font-size:(.*?);\">(.*?)<\/span>/gi,"[size=$1]$2[/size]");
+ rep(/<span style=\"color:(.*?);\">(.*?)<\/span>/gi,"[color=$1]$2[/color]");
+ rep(/<font>(.*?)<\/font>/gi,"$1");
+ rep(/<img.*?width=\"(.*?)\".*?height=\"(.*?)\".*?src=\"(.*?)\".*?\/>/gi,"[img=$1x$2]$3[/img]");
+ rep(/<img.*?height=\"(.*?)\".*?width=\"(.*?)\".*?src=\"(.*?)\".*?\/>/gi,"[img=$2x$1]$3[/img]");
+ rep(/<img.*?src=\"(.*?)\".*?height=\"(.*?)\".*?width=\"(.*?)\".*?\/>/gi,"[img=$3x$2]$1[/img]");
+ rep(/<img.*?src=\"(.*?)\".*?width=\"(.*?)\".*?height=\"(.*?)\".*?\/>/gi,"[img=$2x$3]$1[/img]");
+ rep(/<img.*?src=\"(.*?)\".*?\/>/gi,"[img]$1[/img]");
+
+
+ rep(/<ul class=\"listbullet\" style=\"list-style-type\: circle\;\">(.*?)<\/ul>/gi,"[list]$1[/list]");
+ rep(/<ul class=\"listnone\" style=\"list-style-type\: none\;\">(.*?)<\/ul>/gi,"[list=]$1[/list]");
+ rep(/<ul class=\"listdecimal\" style=\"list-style-type\: decimal\;\">(.*?)<\/ul>/gi,"[list=1]$1[/list]");
+ rep(/<ul class=\"listlowerroman\" style=\"list-style-type\: lower-roman\;\">(.*?)<\/ul>/gi,"[list=i]$1[/list]");
+ rep(/<ul class=\"listupperroman\" style=\"list-style-type\: upper-roman\;\">(.*?)<\/ul>/gi,"[list=I]$1[/list]");
+ rep(/<ul class=\"listloweralpha\" style=\"list-style-type\: lower-alpha\;\">(.*?)<\/ul>/gi,"[list=a]$1[/list]");
+ rep(/<ul class=\"listupperalpha\" style=\"list-style-type\: upper-alpha\;\">(.*?)<\/ul>/gi,"[list=A]$1[/list]");
+ rep(/<li>(.*?)<\/li>/gi,"[li]$1[/li]");
+
+ rep(/<code>(.*?)<\/code>/gi,"[code]$1[/code]");
+ rep(/<\/(strong|b)>/gi,"[/b]");
+ rep(/<(strong|b)>/gi,"[b]");
+ rep(/<\/(em|i)>/gi,"[/i]");
+ rep(/<(em|i)>/gi,"[i]");
+ rep(/<\/u>/gi,"[/u]");
+
+
+ rep(/<span style=\"text-decoration: ?underline;\">(.*?)<\/span>/gi,"[u]$1[/u]");
+ rep(/<u>/gi,"[u]");
+ rep(/<blockquote[^>]*>/gi,"[quote]");
+ rep(/<\/blockquote>/gi,"[/quote]");
+ rep(/<hr \/>/gi,"[hr]");
+ rep(/<br (.*?)\/>/gi,"\n");
+ rep(/<br\/>/gi,"\n");
+ rep(/<br>/gi,"\n");
+ rep(/<p>/gi,"");
+ rep(/<\/p>/gi,"\n");
+ rep(/&nbsp;/gi," ");
+ rep(/&quot;/gi,"\"");
+ rep(/&lt;/gi,"<");
+ rep(/&gt;/gi,">");
+ rep(/&amp;/gi,"&");
+
+ return y;
+ };
+
+
+ function b2h(s) {
+ var y = s;
+ function rep(re, str) {
+ y = y.replace(re,str);
+ };
+
+ rep(/\&/gi,"&amp;");
+ rep(/\</gi,"&lt;");
+ rep(/\>/gi,"&gt;");
+ rep(/\"/gi,"&quot;");
+
+ rep(/\n/gi,"<br />");
+ rep(/\[b\]/gi,"<strong>");
+ rep(/\[\/b\]/gi,"</strong>");
+ rep(/\[i\]/gi,"<em>");
+ rep(/\[\/i\]/gi,"</em>");
+ rep(/\[u\]/gi,"<u>");
+ rep(/\[\/u\]/gi,"</u>");
+ rep(/\[hr\]/gi,"<hr />");
+ rep(/\[url=([^\]]+)\](.*?)\[\/url\]/gi,"<a href=\"$1\">$2</a>");
+ rep(/\[url\](.*?)\[\/url\]/gi,"<a href=\"$1\">$1</a>");
+ rep(/\[img=(.*?)x(.*?)\](.*?)\[\/img\]/gi,"<img width=\"$1\" height=\"$2\" src=\"$3\" />");
+ rep(/\[img\](.*?)\[\/img\]/gi,"<img src=\"$1\" />");
+
+ // FIXME - add zid()
+ rep(/\[zrl=([^\]]+)\](.*?)\[\/zrl\]/gi,"<a href=\"$1" + '?f=&zid=' + zid + "\">$2</a>");
+ rep(/\[zrl\](.*?)\[\/zrl\]/gi,"<a href=\"$1" + '?f=&zid=' + zid + "\">$1</a>");
+ rep(/\[zmg=(.*?)x(.*?)\](.*?)\[\/zmg\]/gi,"<img width=\"$1\" height=\"$2\" src=\"$3" + '?f=&zid=' + zid + "\" />");
+ rep(/\[zmg\](.*?)\[\/zmg\]/gi,"<img src=\"$1" + '?f=&zid=' + zid + "\" />");
+
+ rep(/\[list\](.*?)\[\/list\]/gi, '<ul class="listbullet" style="list-style-type: circle;">$1</ul>');
+ rep(/\[list=\](.*?)\[\/list\]/gi, '<ul class="listnone" style="list-style-type: none;">$1</ul>');
+ rep(/\[list=1\](.*?)\[\/list\]/gi, '<ul class="listdecimal" style="list-style-type: decimal;">$1</ul>');
+ rep(/\[list=i\](.*?)\[\/list\]/gi,'<ul class="listlowerroman" style="list-style-type: lower-roman;">$1</ul>');
+ rep(/\[list=I\](.*?)\[\/list\]/gi, '<ul class="listupperroman" style="list-style-type: upper-roman;">$1</ul>');
+ rep(/\[list=a\](.*?)\[\/list\]/gi, '<ul class="listloweralpha" style="list-style-type: lower-alpha;">$1</ul>');
+ rep(/\[list=A\](.*?)\[\/list\]/gi, '<ul class="listupperalpha" style="list-style-type: upper-alpha;">$1</ul>');
+ rep(/\[li\](.*?)\[\/li\]/gi, '<li>$1</li>');
+ rep(/\[color=(.*?)\](.*?)\[\/color\]/gi,"<span style=\"color: $1;\">$2</span>");
+ rep(/\[size=(.*?)\](.*?)\[\/size\]/gi,"<span style=\"font-size: $1;\">$2</span>");
+ rep(/\[code\](.*?)\[\/code\]/gi,"<code>$1</code>");
+ rep(/\[quote.*?\](.*?)\[\/quote\]/gi,"<blockquote>$1</blockquote>");
+
+ rep(/\[video\](.*?)\[\/video\]/gi,"<a href=\"$1\">$1</a>");
+ rep(/\[audio\](.*?)\[\/audio\]/gi,"<a href=\"$1\">$1</a>");
+
+ rep(/\[\&amp\;([#a-z0-9]+)\;\]/gi,'&$1;');
+
+ rep(/\<(.*?)(src|href)=\"[^hfm](.*?)\>/gi,'<$1$2="">');
+
+ return y;
+ };
+
+
+function zid(s) {
+ if((! s.length) || (s.indexOf('zid=') != (-1)))
+ return s;
+ if(! zid.length)
+ return s;
+ var has_params = ((s.indexOf('?') == (-1)) ? false : true);
+ var achar = ((has_params) ? '&' : '?');
+ s = s + achar + 'f=&zid=' + zid;
+ return s;
+}
diff --git a/view/js/mod_connections.js b/view/js/mod_connections.js
index 9d4a03340..8a8f2fee6 100644
--- a/view/js/mod_connections.js
+++ b/view/js/mod_connections.js
@@ -3,7 +3,8 @@ $(document).ready(function() {
a = $("#contacts-search").autocomplete({
serviceUrl: baseurl + '/acl',
minChars: 2,
- width: 350,
+ width: 250,
+ id: 'contact-search-ac',
});
a.setOptions({ autoSubmit: true, params: { type: 'a' }});
@@ -20,58 +21,3 @@ $(".autocomplete-w1 .selected").keyup(function(event){
}
});
-
-function connectFullShare() {
- $('#me_id_perms_view_stream').attr('checked','checked');
- $('#me_id_perms_view_profile').attr('checked','checked');
- $('#me_id_perms_view_photos').attr('checked','checked');
- $('#me_id_perms_view_contacts').attr('checked','checked');
- $('#me_id_perms_view_storage').attr('checked','checked');
- $('#me_id_perms_view_pages').attr('checked','checked');
- $('#me_id_perms_send_stream').attr('checked','checked');
- $('#me_id_perms_post_wall').attr('checked','checked');
- $('#me_id_perms_post_comments').attr('checked','checked');
- $('#me_id_perms_post_mail').attr('checked','checked');
- $('#me_id_perms_chat').attr('checked','checked');
- $('#me_id_perms_view_storage').attr('checked','checked');
-}
-
-function connectCautiousShare() {
- $('#me_id_perms_view_stream').attr('checked','checked');
- $('#me_id_perms_view_profile').attr('checked','checked');
- $('#me_id_perms_view_photos').attr('checked','checked');
- $('#me_id_perms_view_storage').attr('checked','checked');
- $('#me_id_perms_view_pages').attr('checked','checked');
- $('#me_id_perms_send_stream').attr('checked','checked');
- $('#me_id_perms_post_comments').attr('checked','checked');
- $('#me_id_perms_post_mail').attr('checked','checked');
-}
-
-function connectForum() {
- $('#me_id_perms_view_stream').attr('checked','checked');
- $('#me_id_perms_view_profile').attr('checked','checked');
- $('#me_id_perms_view_photos').attr('checked','checked');
- $('#me_id_perms_view_contacts').attr('checked','checked');
- $('#me_id_perms_view_storage').attr('checked','checked');
- $('#me_id_perms_view_pages').attr('checked','checked');
- $('#me_id_perms_send_stream').attr('checked','checked');
- $('#me_id_perms_post_wall').attr('checked','checked');
- $('#me_id_perms_post_comments').attr('checked','checked');
- $('#me_id_perms_post_mail').attr('checked','checked');
- $('#me_id_perms_tag_deliver').attr('checked','checked');
-}
-
-function connectSoapBox() {
- $('#me_id_perms_view_stream').attr('checked','checked');
- $('#me_id_perms_view_profile').attr('checked','checked');
- $('#me_id_perms_view_photos').attr('checked','checked');
- $('#me_id_perms_view_contacts').attr('checked','checked');
- $('#me_id_perms_view_storage').attr('checked','checked');
- $('#me_id_perms_view_pages').attr('checked','checked');
-}
-
-
-function connectFollowOnly() {
- $('#me_id_perms_send_stream').attr('checked','checked');
-}
-
diff --git a/view/js/mod_connedit.js b/view/js/mod_connedit.js
new file mode 100644
index 000000000..51dbcf4bf
--- /dev/null
+++ b/view/js/mod_connedit.js
@@ -0,0 +1,82 @@
+
+function connectFullShare() {
+ $('.abook-edit-me').each(function() {
+ if(! $(this).is(':disabled'))
+ $(this).removeAttr('checked');
+ });
+ $('#me_id_perms_view_stream').attr('checked','checked');
+ $('#me_id_perms_view_profile').attr('checked','checked');
+ $('#me_id_perms_view_photos').attr('checked','checked');
+ $('#me_id_perms_view_contacts').attr('checked','checked');
+ $('#me_id_perms_view_storage').attr('checked','checked');
+ $('#me_id_perms_view_pages').attr('checked','checked');
+ $('#me_id_perms_send_stream').attr('checked','checked');
+ $('#me_id_perms_post_wall').attr('checked','checked');
+ $('#me_id_perms_post_comments').attr('checked','checked');
+ $('#me_id_perms_post_mail').attr('checked','checked');
+ $('#me_id_perms_chat').attr('checked','checked');
+ $('#me_id_perms_view_storage').attr('checked','checked');
+ $('#me_id_perms_republish').attr('checked','checked');
+}
+
+function connectCautiousShare() {
+ $('.abook-edit-me').each(function() {
+ if(! $(this).is(':disabled'))
+ $(this).removeAttr('checked');
+ });
+
+ $('#me_id_perms_view_stream').attr('checked','checked');
+ $('#me_id_perms_view_profile').attr('checked','checked');
+ $('#me_id_perms_view_photos').attr('checked','checked');
+ $('#me_id_perms_view_storage').attr('checked','checked');
+ $('#me_id_perms_view_pages').attr('checked','checked');
+ $('#me_id_perms_send_stream').attr('checked','checked');
+ $('#me_id_perms_post_comments').attr('checked','checked');
+ $('#me_id_perms_post_mail').attr('checked','checked');
+}
+
+function connectForum() {
+ $('.abook-edit-me').each(function() {
+ if(! $(this).is(':disabled'))
+ $(this).removeAttr('checked');
+ });
+
+ $('#me_id_perms_view_stream').attr('checked','checked');
+ $('#me_id_perms_view_profile').attr('checked','checked');
+ $('#me_id_perms_view_photos').attr('checked','checked');
+ $('#me_id_perms_view_contacts').attr('checked','checked');
+ $('#me_id_perms_view_storage').attr('checked','checked');
+ $('#me_id_perms_view_pages').attr('checked','checked');
+ $('#me_id_perms_send_stream').attr('checked','checked');
+ $('#me_id_perms_post_wall').attr('checked','checked');
+ $('#me_id_perms_post_comments').attr('checked','checked');
+ $('#me_id_perms_post_mail').attr('checked','checked');
+ $('#me_id_perms_tag_deliver').attr('checked','checked');
+ $('#me_id_perms_republish').attr('checked','checked');
+
+}
+
+function connectSoapBox() {
+ $('.abook-edit-me').each(function() {
+ if(! $(this).is(':disabled'))
+ $(this).removeAttr('checked');
+ });
+
+ $('#me_id_perms_view_stream').attr('checked','checked');
+ $('#me_id_perms_view_profile').attr('checked','checked');
+ $('#me_id_perms_view_photos').attr('checked','checked');
+ $('#me_id_perms_view_contacts').attr('checked','checked');
+ $('#me_id_perms_view_storage').attr('checked','checked');
+ $('#me_id_perms_view_pages').attr('checked','checked');
+}
+
+
+function connectFollowOnly() {
+ $('.abook-edit-me').each(function() {
+ if(! $(this).is(':disabled'))
+ $(this).removeAttr('checked');
+ });
+
+ $('#me_id_perms_send_stream').attr('checked','checked');
+}
+
diff --git a/view/js/mod_directory.js b/view/js/mod_directory.js
new file mode 100644
index 000000000..291734b4f
--- /dev/null
+++ b/view/js/mod_directory.js
@@ -0,0 +1,8 @@
+function dirdetails(hash) {
+
+ $.get('dirprofile' + '?f=&hash=' + hash, function( data ) {
+ $.colorbox({ maxWidth: "50%", maxHeight: "75%", html: data });
+ });
+
+}
+
diff --git a/view/js/mod_mail.js b/view/js/mod_mail.js
new file mode 100644
index 000000000..82f60f46f
--- /dev/null
+++ b/view/js/mod_mail.js
@@ -0,0 +1,13 @@
+$(document).ready(function() {
+ var a;
+ a = $("#recip").autocomplete({
+ serviceUrl: baseurl + '/acl',
+ minChars: 2,
+ width: 250,
+ id: 'recip-ac',
+ onSelect: function(value,data) {
+ $("#recip-complete").val(data);
+ },
+ });
+
+});
diff --git a/view/js/mod_message.js b/view/js/mod_message.js
index e3318ce6b..82f60f46f 100644
--- a/view/js/mod_message.js
+++ b/view/js/mod_message.js
@@ -3,10 +3,11 @@ $(document).ready(function() {
a = $("#recip").autocomplete({
serviceUrl: baseurl + '/acl',
minChars: 2,
- width: 350,
+ width: 250,
+ id: 'recip-ac',
onSelect: function(value,data) {
$("#recip-complete").val(data);
- }
+ },
});
});
diff --git a/view/js/mod_mitem.js b/view/js/mod_mitem.js
new file mode 100644
index 000000000..d33713ee3
--- /dev/null
+++ b/view/js/mod_mitem.js
@@ -0,0 +1,22 @@
+$(document).ready(function() {
+
+ $("a#settings-default-perms-menu").colorbox({
+ 'inline' : true,
+ 'transition' : 'elastic'
+ });
+
+
+ $('#contact_allow, #contact_deny, #group_allow, #group_deny').change(function() {
+ var selstr;
+ $('#contact_allow option:selected, #contact_deny option:selected, #group_allow option:selected, #group_deny option:selected').each( function() {
+ selstr = $(this).text();
+ $('#jot-perms-icon').removeClass('unlock').addClass('lock');
+ $('#jot-public').hide();
+ });
+ if(selstr == null) {
+ $('#jot-perms-icon').removeClass('lock').addClass('unlock');
+ $('#jot-public').show();
+ }
+
+ }).trigger('change');
+});
diff --git a/view/js/mod_network.js b/view/js/mod_network.js
new file mode 100644
index 000000000..f63a57653
--- /dev/null
+++ b/view/js/mod_network.js
@@ -0,0 +1,10 @@
+$(document).ready(function() {
+ var a;
+ a = $("#search-text").autocomplete({
+ serviceUrl: baseurl + '/search_ac',
+ minChars: 2,
+ width: 250,
+ id: 'search-text-ac',
+ });
+});
+
diff --git a/view/js/mod_poke.js b/view/js/mod_poke.js
new file mode 100644
index 000000000..78972888f
--- /dev/null
+++ b/view/js/mod_poke.js
@@ -0,0 +1,14 @@
+$(document).ready(function() {
+ var a;
+ a = $("#poke-recip").autocomplete({
+ serviceUrl: baseurl + '/acl',
+ minChars: 2,
+ width: 250,
+ id: 'poke-recip-ac',
+ onSelect: function(value,data) {
+ $("#poke-recip-complete").val(data);
+ }
+ });
+ a.setOptions({ params: { type: 'a' }});
+
+});
diff --git a/view/js/mod_settings.js b/view/js/mod_settings.js
index bcfa9b574..7f9a9e960 100644
--- a/view/js/mod_settings.js
+++ b/view/js/mod_settings.js
@@ -3,6 +3,11 @@ var ispublic = aStr['everybody'] ;
$(document).ready(function() {
+ $("a#settings-default-perms-menu").colorbox({
+ 'inline' : true,
+ 'transition' : 'elastic'
+ });
+
$('#contact_allow, #contact_deny, #group_allow, #group_deny').change(function() {
var selstr;
$('#contact_allow option:selected, #contact_deny option:selected, #group_allow option:selected, #group_deny option:selected').each( function() {
@@ -19,3 +24,97 @@ $(document).ready(function() {
});
+function channel_privacy_macro(n) {
+ if(n == 0) {
+ $('#id_view_stream option').eq(0).attr('selected','selected');
+ $('#id_view_profile option').eq(0).attr('selected','selected');
+ $('#id_view_photos option').eq(0).attr('selected','selected');
+ $('#id_view_contacts option').eq(0).attr('selected','selected');
+ $('#id_view_storage option').eq(0).attr('selected','selected');
+ $('#id_view_pages option').eq(0).attr('selected','selected');
+ $('#id_send_stream option').eq(0).attr('selected','selected');
+ $('#id_post_wall option').eq(0).attr('selected','selected');
+ $('#id_post_comments option').eq(0).attr('selected','selected');
+ $('#id_post_mail option').eq(0).attr('selected','selected');
+ $('#id_post_photos option').eq(0).attr('selected','selected');
+ $('#id_tag_deliver option').eq(0).attr('selected','selected');
+ $('#id_chat option').eq(0).attr('selected','selected');
+ $('#id_write_storage option').eq(0).attr('selected','selected');
+ $('#id_write_pages option').eq(0).attr('selected','selected');
+ $('#id_delegate option').eq(0).attr('selected','selected');
+ $('#id_republish option').eq(0).attr('selected','selected');
+ $('#id_profile_in_directory_onoff .off').removeClass('hidden');
+ $('#id_profile_in_directory_onoff .on').addClass('hidden');
+ $('#id_profile_in_directory').val(0);
+ }
+ if(n == 1) {
+ $('#id_view_stream option').eq(1).attr('selected','selected');
+ $('#id_view_profile option').eq(1).attr('selected','selected');
+ $('#id_view_photos option').eq(1).attr('selected','selected');
+ $('#id_view_contacts option').eq(1).attr('selected','selected');
+ $('#id_view_storage option').eq(1).attr('selected','selected');
+ $('#id_view_pages option').eq(1).attr('selected','selected');
+ $('#id_send_stream option').eq(1).attr('selected','selected');
+ $('#id_post_wall option').eq(1).attr('selected','selected');
+ $('#id_post_comments option').eq(1).attr('selected','selected');
+ $('#id_post_mail option').eq(1).attr('selected','selected');
+ $('#id_post_photos option').eq(1).attr('selected','selected');
+ $('#id_tag_deliver option').eq(1).attr('selected','selected');
+ $('#id_chat option').eq(1).attr('selected','selected');
+ $('#id_write_storage option').eq(1).attr('selected','selected');
+ $('#id_write_pages option').eq(1).attr('selected','selected');
+ $('#id_delegate option').eq(0).attr('selected','selected');
+ $('#id_republish option').eq(0).attr('selected','selected');
+ $('#id_profile_in_directory_onoff .off').removeClass('hidden');
+ $('#id_profile_in_directory_onoff .on').addClass('hidden');
+ $('#id_profile_in_directory').val(0);
+ }
+ if(n == 2) {
+ $('#id_view_stream option').eq(5).attr('selected','selected');
+ $('#id_view_profile option').eq(5).attr('selected','selected');
+ $('#id_view_photos option').eq(5).attr('selected','selected');
+ $('#id_view_contacts option').eq(5).attr('selected','selected');
+ $('#id_view_storage option').eq(5).attr('selected','selected');
+ $('#id_view_pages option').eq(5).attr('selected','selected');
+ $('#id_send_stream option').eq(1).attr('selected','selected');
+ $('#id_post_wall option').eq(1).attr('selected','selected');
+ $('#id_post_comments option').eq(1).attr('selected','selected');
+ $('#id_post_mail option').eq(1).attr('selected','selected');
+ $('#id_post_photos option').eq(0).attr('selected','selected');
+ $('#id_tag_deliver option').eq(1).attr('selected','selected');
+ $('#id_chat option').eq(1).attr('selected','selected');
+ $('#id_write_storage option').eq(0).attr('selected','selected');
+ $('#id_write_pages option').eq(0).attr('selected','selected');
+ $('#id_delegate option').eq(0).attr('selected','selected');
+ $('#id_republish option').eq(1).attr('selected','selected');
+ $('#id_profile_in_directory_onoff .on').removeClass('hidden');
+ $('#id_profile_in_directory_onoff .off').addClass('hidden');
+ $('#id_profile_in_directory').val(1);
+ }
+ if(n == 3) {
+ $('#id_view_stream option').eq(5).attr('selected','selected');
+ $('#id_view_profile option').eq(5).attr('selected','selected');
+ $('#id_view_photos option').eq(5).attr('selected','selected');
+ $('#id_view_contacts option').eq(5).attr('selected','selected');
+ $('#id_view_storage option').eq(5).attr('selected','selected');
+ $('#id_view_pages option').eq(5).attr('selected','selected');
+ $('#id_send_stream option').eq(4).attr('selected','selected');
+ $('#id_post_wall option').eq(4).attr('selected','selected');
+ $('#id_post_comments option').eq(4).attr('selected','selected');
+ $('#id_post_mail option').eq(4).attr('selected','selected');
+ $('#id_post_photos option').eq(2).attr('selected','selected');
+ $('#id_tag_deliver option').eq(1).attr('selected','selected');
+ $('#id_chat option').eq(4).attr('selected','selected');
+ $('#id_write_storage option').eq(2).attr('selected','selected');
+ $('#id_write_pages option').eq(2).attr('selected','selected');
+ $('#id_delegate option').eq(0).attr('selected','selected');
+ $('#id_republish option').eq(4).attr('selected','selected');
+ $('#id_profile_in_directory_onoff .on').removeClass('hidden');
+ $('#id_profile_in_directory_onoff .off').addClass('hidden');
+ $('#id_profile_in_directory').val(1);
+
+ }
+
+
+
+} \ No newline at end of file
diff --git a/view/js/mod_sources.js b/view/js/mod_sources.js
new file mode 100644
index 000000000..49880b38f
--- /dev/null
+++ b/view/js/mod_sources.js
@@ -0,0 +1,15 @@
+$(document).ready(function() {
+ var a;
+ a = $("#id_name").autocomplete({
+ serviceUrl: baseurl + '/acl',
+ minChars: 2,
+ width: 250,
+ id: 'id-name-ac',
+ onSelect: function(value,data) {
+ $("#id_abook").val(data);
+ }
+ });
+
+ a.setOptions({ params: { type: 'a' }});
+
+});
diff --git a/view/js/spin.js b/view/js/spin.js
new file mode 100644
index 000000000..c66c607a7
--- /dev/null
+++ b/view/js/spin.js
@@ -0,0 +1,349 @@
+//fgnass.github.com/spin.js#v1.3
+
+/**
+ * Copyright (c) 2011-2013 Felix Gnass
+ * Licensed under the MIT license
+ */
+(function(root, factory) {
+
+ /* CommonJS */
+ if (typeof exports == 'object') module.exports = factory()
+
+ /* AMD module */
+ else if (typeof define == 'function' && define.amd) define(factory)
+
+ /* Browser global */
+ else root.Spinner = factory()
+}
+(this, function() {
+ "use strict";
+
+ var prefixes = ['webkit', 'Moz', 'ms', 'O'] /* Vendor prefixes */
+ , animations = {} /* Animation rules keyed by their name */
+ , useCssAnimations /* Whether to use CSS animations or setTimeout */
+
+ /**
+ * Utility function to create elements. If no tag name is given,
+ * a DIV is created. Optionally properties can be passed.
+ */
+ function createEl(tag, prop) {
+ var el = document.createElement(tag || 'div')
+ , n
+
+ for(n in prop) el[n] = prop[n]
+ return el
+ }
+
+ /**
+ * Appends children and returns the parent.
+ */
+ function ins(parent /* child1, child2, ...*/) {
+ for (var i=1, n=arguments.length; i<n; i++)
+ parent.appendChild(arguments[i])
+
+ return parent
+ }
+
+ /**
+ * Insert a new stylesheet to hold the @keyframe or VML rules.
+ */
+ var sheet = (function() {
+ var el = createEl('style', {type : 'text/css'})
+ ins(document.getElementsByTagName('head')[0], el)
+ return el.sheet || el.styleSheet
+ }())
+
+ /**
+ * Creates an opacity keyframe animation rule and returns its name.
+ * Since most mobile Webkits have timing issues with animation-delay,
+ * we create separate rules for each line/segment.
+ */
+ function addAnimation(alpha, trail, i, lines) {
+ var name = ['opacity', trail, ~~(alpha*100), i, lines].join('-')
+ , start = 0.01 + i/lines * 100
+ , z = Math.max(1 - (1-alpha) / trail * (100-start), alpha)
+ , prefix = useCssAnimations.substring(0, useCssAnimations.indexOf('Animation')).toLowerCase()
+ , pre = prefix && '-' + prefix + '-' || ''
+
+ if (!animations[name]) {
+ sheet.insertRule(
+ '@' + pre + 'keyframes ' + name + '{' +
+ '0%{opacity:' + z + '}' +
+ start + '%{opacity:' + alpha + '}' +
+ (start+0.01) + '%{opacity:1}' +
+ (start+trail) % 100 + '%{opacity:' + alpha + '}' +
+ '100%{opacity:' + z + '}' +
+ '}', sheet.cssRules.length)
+
+ animations[name] = 1
+ }
+
+ return name
+ }
+
+ /**
+ * Tries various vendor prefixes and returns the first supported property.
+ */
+ function vendor(el, prop) {
+ var s = el.style
+ , pp
+ , i
+
+ if(s[prop] !== undefined) return prop
+ prop = prop.charAt(0).toUpperCase() + prop.slice(1)
+ for(i=0; i<prefixes.length; i++) {
+ pp = prefixes[i]+prop
+ if(s[pp] !== undefined) return pp
+ }
+ }
+
+ /**
+ * Sets multiple style properties at once.
+ */
+ function css(el, prop) {
+ for (var n in prop)
+ el.style[vendor(el, n)||n] = prop[n]
+
+ return el
+ }
+
+ /**
+ * Fills in default values.
+ */
+ function merge(obj) {
+ for (var i=1; i < arguments.length; i++) {
+ var def = arguments[i]
+ for (var n in def)
+ if (obj[n] === undefined) obj[n] = def[n]
+ }
+ return obj
+ }
+
+ /**
+ * Returns the absolute page-offset of the given element.
+ */
+ function pos(el) {
+ var o = { x:el.offsetLeft, y:el.offsetTop }
+ while((el = el.offsetParent))
+ o.x+=el.offsetLeft, o.y+=el.offsetTop
+
+ return o
+ }
+
+ // Built-in defaults
+
+ var defaults = {
+ lines: 12, // The number of lines to draw
+ length: 7, // The length of each line
+ width: 5, // The line thickness
+ radius: 10, // The radius of the inner circle
+ rotate: 0, // Rotation offset
+ corners: 1, // Roundness (0..1)
+ color: '#000', // #rgb or #rrggbb
+ direction: 1, // 1: clockwise, -1: counterclockwise
+ speed: 1, // Rounds per second
+ trail: 100, // Afterglow percentage
+ opacity: 1/4, // Opacity of the lines
+ fps: 20, // Frames per second when using setTimeout()
+ zIndex: 2e9, // Use a high z-index by default
+ className: 'spinner', // CSS class to assign to the element
+ top: 'auto', // center vertically
+ left: 'auto', // center horizontally
+ position: 'relative' // element position
+ }
+
+ /** The constructor */
+ function Spinner(o) {
+ if (typeof this == 'undefined') return new Spinner(o)
+ this.opts = merge(o || {}, Spinner.defaults, defaults)
+ }
+
+ // Global defaults that override the built-ins:
+ Spinner.defaults = {}
+
+ merge(Spinner.prototype, {
+
+ /**
+ * Adds the spinner to the given target element. If this instance is already
+ * spinning, it is automatically removed from its previous target b calling
+ * stop() internally.
+ */
+ spin: function(target) {
+ this.stop()
+
+ var self = this
+ , o = self.opts
+ , el = self.el = css(createEl(0, {className: o.className}), {position: o.position, width: 0, zIndex: o.zIndex})
+ , mid = o.radius+o.length+o.width
+ , ep // element position
+ , tp // target position
+
+ if (target) {
+ target.insertBefore(el, target.firstChild||null)
+ tp = pos(target)
+ ep = pos(el)
+ css(el, {
+ left: (o.left == 'auto' ? tp.x-ep.x + (target.offsetWidth >> 1) : parseInt(o.left, 10) + mid) + 'px',
+ top: (o.top == 'auto' ? tp.y-ep.y + (target.offsetHeight >> 1) : parseInt(o.top, 10) + mid) + 'px'
+ })
+ }
+
+ el.setAttribute('role', 'progressbar')
+ self.lines(el, self.opts)
+
+ if (!useCssAnimations) {
+ // No CSS animation support, use setTimeout() instead
+ var i = 0
+ , start = (o.lines - 1) * (1 - o.direction) / 2
+ , alpha
+ , fps = o.fps
+ , f = fps/o.speed
+ , ostep = (1-o.opacity) / (f*o.trail / 100)
+ , astep = f/o.lines
+
+ ;(function anim() {
+ i++;
+ for (var j = 0; j < o.lines; j++) {
+ alpha = Math.max(1 - (i + (o.lines - j) * astep) % f * ostep, o.opacity)
+
+ self.opacity(el, j * o.direction + start, alpha, o)
+ }
+ self.timeout = self.el && setTimeout(anim, ~~(1000/fps))
+ })()
+ }
+ return self
+ },
+
+ /**
+ * Stops and removes the Spinner.
+ */
+ stop: function() {
+ var el = this.el
+ if (el) {
+ clearTimeout(this.timeout)
+ if (el.parentNode) el.parentNode.removeChild(el)
+ this.el = undefined
+ }
+ return this
+ },
+
+ /**
+ * Internal method that draws the individual lines. Will be overwritten
+ * in VML fallback mode below.
+ */
+ lines: function(el, o) {
+ var i = 0
+ , start = (o.lines - 1) * (1 - o.direction) / 2
+ , seg
+
+ function fill(color, shadow) {
+ return css(createEl(), {
+ position: 'absolute',
+ width: (o.length+o.width) + 'px',
+ height: o.width + 'px',
+ background: color,
+ boxShadow: shadow,
+ transformOrigin: 'left',
+ transform: 'rotate(' + ~~(360/o.lines*i+o.rotate) + 'deg) translate(' + o.radius+'px' +',0)',
+ borderRadius: (o.corners * o.width>>1) + 'px'
+ })
+ }
+
+ for (; i < o.lines; i++) {
+ seg = css(createEl(), {
+ position: 'absolute',
+ top: 1+~(o.width/2) + 'px',
+ transform: o.hwaccel ? 'translate3d(0,0,0)' : '',
+ opacity: o.opacity,
+ animation: useCssAnimations && addAnimation(o.opacity, o.trail, start + i * o.direction, o.lines) + ' ' + 1/o.speed + 's linear infinite'
+ })
+
+ if (o.shadow) ins(seg, css(fill('#000', '0 0 4px ' + '#000'), {top: 2+'px'}))
+
+ ins(el, ins(seg, fill(o.color, '0 0 1px rgba(0,0,0,.1)')))
+ }
+ return el
+ },
+
+ /**
+ * Internal method that adjusts the opacity of a single line.
+ * Will be overwritten in VML fallback mode below.
+ */
+ opacity: function(el, i, val) {
+ if (i < el.childNodes.length) el.childNodes[i].style.opacity = val
+ }
+
+ })
+
+
+ function initVML() {
+
+ /* Utility function to create a VML tag */
+ function vml(tag, attr) {
+ return createEl('<' + tag + ' xmlns="urn:schemas-microsoft.com:vml" class="spin-vml">', attr)
+ }
+
+ // No CSS transforms but VML support, add a CSS rule for VML elements:
+ sheet.addRule('.spin-vml', 'behavior:url(#default#VML)')
+
+ Spinner.prototype.lines = function(el, o) {
+ var r = o.length+o.width
+ , s = 2*r
+
+ function grp() {
+ return css(
+ vml('group', {
+ coordsize: s + ' ' + s,
+ coordorigin: -r + ' ' + -r
+ }),
+ { width: s, height: s }
+ )
+ }
+
+ var margin = -(o.width+o.length)*2 + 'px'
+ , g = css(grp(), {position: 'absolute', top: margin, left: margin})
+ , i
+
+ function seg(i, dx, filter) {
+ ins(g,
+ ins(css(grp(), {rotation: 360 / o.lines * i + 'deg', left: ~~dx}),
+ ins(css(vml('roundrect', {arcsize: o.corners}), {
+ width: r,
+ height: o.width,
+ left: o.radius,
+ top: -o.width>>1,
+ filter: filter
+ }),
+ vml('fill', {color: o.color, opacity: o.opacity}),
+ vml('stroke', {opacity: 0}) // transparent stroke to fix color bleeding upon opacity change
+ )
+ )
+ )
+ }
+
+ if (o.shadow)
+ for (i = 1; i <= o.lines; i++)
+ seg(i, -2, 'progid:DXImageTransform.Microsoft.Blur(pixelradius=2,makeshadow=1,shadowopacity=.3)')
+
+ for (i = 1; i <= o.lines; i++) seg(i)
+ return ins(el, g)
+ }
+
+ Spinner.prototype.opacity = function(el, i, val, o) {
+ var c = el.firstChild
+ o = o.shadow && o.lines || 0
+ if (c && i+o < c.childNodes.length) {
+ c = c.childNodes[i+o]; c = c && c.firstChild; c = c && c.firstChild
+ if (c) c.opacity = val
+ }
+ }
+ }
+
+ var probe = css(createEl('group'), {behavior: 'url(#default#VML)'})
+
+ if (!vendor(probe, 'transform') && probe.adj) initVML()
+ else useCssAnimations = vendor(probe, 'animation')
+
+ return Spinner
+
+}));
diff --git a/js/webtoolkit.base64.js b/view/js/webtoolkit.base64.js
index 5fa3c1ed7..5fa3c1ed7 100644
--- a/js/webtoolkit.base64.js
+++ b/view/js/webtoolkit.base64.js
diff --git a/view/nb-no/follow_notify_eml.tpl b/view/nb-no/follow_notify_eml.tpl
index 73a347027..ba07b19da 100644
--- a/view/nb-no/follow_notify_eml.tpl
+++ b/view/nb-no/follow_notify_eml.tpl
@@ -1,14 +1,14 @@
-Kjære $[myname],
+Dear {{$myname}},
-Du har en ny følgesvenn på $[sitename] - '$[requestor]'.
+You have a new follower at {{$sitename}} - '{{$requestor}}'.
-Du kan besøke profilen deres på $[url].
+You may visit their profile at {{$url}}.
-Vennligst logg inn på ditt sted for å godkjenne eller ignorere/avbryte forespørselen.
+Please login to your site to approve or ignore/cancel the request.
-$[siteurl]
+{{$siteurl}}
-Med vennlig hilsen,
+Regards,
- $[sitename] administrator \ No newline at end of file
+ {{$sitename}} administrator
diff --git a/view/nb-no/friend_complete_eml.tpl b/view/nb-no/friend_complete_eml.tpl
index 4526c94d0..1c647b994 100644
--- a/view/nb-no/friend_complete_eml.tpl
+++ b/view/nb-no/friend_complete_eml.tpl
@@ -1,22 +1,22 @@
-Kjære $[username],
+Dear {{$username}},
- Gode nyheter... '$[fn]' ved '$[dfrn_url]' har godtatt
-din forespørsel om kobling hos '$[sitename]'.
+ Great news... '{{$fn}}' at '{{$dfrn_url}}' has accepted
+your connection request at '{{$sitename}}'.
-Dere er nå gjensidige venner og kan utveksle statusoppdateringer, bilder og e-post
-uten hindringer.
+You are now mutual friends and may exchange status updates, photos, and email
+without restriction.
-Vennligst besøk din side "Kontakter" ved $[sitename] hvis du ønsker å gjøre
-noen endringer på denne forbindelsen.
+Please visit your 'Connnections' page at {{$sitename}} if you wish to make
+any changes to this relationship.
-$[siteurl]
+{{$siteurl}}
-[For eksempel, så kan du lage en egen profil med informasjon som ikke er
-tilgjengelig for alle - og angi visningsrettigheter til '$[fn]'].
+[For instance, you may create a separate profile with information that is not
+available to the general public - and assign viewing rights to '{{$fn}}'].
-Med vennlig hilsen,
+Sincerely,
- $[sitename] administrator
+ {{$sitename}} Administrator
- \ No newline at end of file
+
diff --git a/view/nb-no/htconfig.tpl b/view/nb-no/htconfig.tpl
new file mode 100644
index 000000000..493cb5d00
--- /dev/null
+++ b/view/nb-no/htconfig.tpl
@@ -0,0 +1,70 @@
+<?php
+
+// Set the following for your MySQL installation
+// Copy or rename this file to .htconfig.php
+
+$db_host = '{{$dbhost}}';
+$db_port = '{{$dbport}}';
+$db_user = '{{$dbuser}}';
+$db_pass = '{{$dbpass}}';
+$db_data = '{{$dbdata}}';
+
+/*
+ * Notice: Many of the following settings will be available in the admin panel
+ * after a successful site install. Once they are set in the admin panel, they
+ * are stored in the DB - and the DB setting will over-ride any corresponding
+ * setting in this file
+ *
+ * The command-line tool util/config is able to query and set the DB items
+ * directly if for some reason the admin panel is not available and a system
+ * setting requires modification.
+ *
+ */
+
+
+// Choose a legal default timezone. If you are unsure, use "America/Los_Angeles".
+// It can be changed later and only applies to timestamps for anonymous viewers.
+
+$default_timezone = '{{$timezone}}';
+
+// What is your site name?
+
+$a->config['system']['baseurl'] = '{{$siteurl}}';
+$a->config['system']['sitename'] = "Red Matrix";
+$a->config['system']['location_hash'] = '{{$site_id}}';
+
+// Your choices are REGISTER_OPEN, REGISTER_APPROVE, or REGISTER_CLOSED.
+// Be certain to create your own personal account before setting
+// REGISTER_CLOSED. 'register_text' (if set) will be displayed prominently on
+// the registration page. REGISTER_APPROVE requires you set 'admin_email'
+// to the email address of an already registered person who can authorise
+// and/or approve/deny the request.
+
+$a->config['system']['register_policy'] = REGISTER_OPEN;
+$a->config['system']['register_text'] = '';
+$a->config['system']['admin_email'] = '{{$adminmail}}';
+
+// Maximum size of an imported message, 0 is unlimited
+
+$a->config['system']['max_import_size'] = 200000;
+
+// maximum size of uploaded photos
+
+$a->config['system']['maximagesize'] = 800000;
+
+// Location of PHP command line processor
+
+$a->config['system']['php_path'] = '{{$phpath}}';
+
+// Configure how we communicate with directory servers.
+// DIRECTORY_MODE_NORMAL = directory client, we will find a directory
+// DIRECTORY_MODE_SECONDARY = caching directory or mirror
+// DIRECTORY_MODE_PRIMARY = main directory server
+// DIRECTORY_MODE_STANDALONE = "off the grid" or private directory services
+
+$a->config['system']['directory_mode'] = DIRECTORY_MODE_NORMAL;
+
+// default system theme
+
+$a->config['system']['theme'] = 'redbasic';
+
diff --git a/view/nb-no/intro_complete_eml.tpl b/view/nb-no/intro_complete_eml.tpl
index 17b0be5a8..2c2428d68 100644
--- a/view/nb-no/intro_complete_eml.tpl
+++ b/view/nb-no/intro_complete_eml.tpl
@@ -1,22 +1,22 @@
-Kjære $[username],
+Dear {{$username}},
- '$[fn]' ved '$[dfrn_url]' har godtatt
-din forespørsel om kobling ved $[sitename]'.
+ '{{$fn}}' at '{{$dfrn_url}}' has accepted
+your connection request at '{{$sitename}}'.
- '$[fn]' har valgt å godta deg som "fan", som begrenser
-noen typer kommunikasjon - slik som private meldinger og noen profilhandlinger.
-Hvis dette er en kjendis- eller forumside, så ble disse innstillingene
-angitt automatisk.
+ '{{$fn}}' has chosen to accept you a "fan", which restricts
+some forms of communication - such as private messaging and some profile
+interactions. If this is a celebrity or community page, these settings were
+applied automatically.
- '$[fn]' kan velge å utvide dette til en to-veis eller mer åpen
-forbindelse i fremtiden.
+ '{{$fn}}' may choose to extend this into a two-way or more permissive
+relationship in the future.
- Du vil nå motta offentlige statusoppdateringer fra '$[fn]',
-som vil vises på din "Nettverk"-side ved
+ You will start receiving public status updates from '{{$fn}}',
+which will appear on your 'Matrix' page at
-$[siteurl]
+{{$siteurl}}
-Med vennlig hilsen,
+Sincerely,
- $[sitename] administrator \ No newline at end of file
+ {{$sitename}} Administrator
diff --git a/view/nb-no/lostpass_eml.tpl b/view/nb-no/lostpass_eml.tpl
index 762c8c2e9..3b79d2791 100644
--- a/view/nb-no/lostpass_eml.tpl
+++ b/view/nb-no/lostpass_eml.tpl
@@ -1,32 +1,32 @@
-Kjære $[username],
- En forespørsel ble nylig mottatt hos $[sitename] om å tilbakestille din kontos
-passord. For å godkjenne denne forespørselen, vennligst velg bekreftelseslenken
-nedenfor eller lim den inn på adresselinjen i nettleseren din.
+Dear {{$username}},
+ A request was recently received at {{$sitename}} to reset your account
+password. In order to confirm this request, please select the verification link
+below or paste it into your web browser address bar.
-Hvis du IKKE har spurt om denne endringen, vennligst IKKE følg lenken
-som er oppgitt og ignorer og/eller slett denne e-posten.
+If you did NOT request this change, please DO NOT follow the link
+provided and ignore and/or delete this email.
-Passordet ditt vil ikke bli endret med mindre vi kan forsikre oss om at du
-sendte denne forespørselen.
+Your password will not be changed unless we can verify that you
+issued this request.
-Følg denne lenken for å bekrefte din identitet:
+Follow this link to verify your identity:
-$[reset_link]
+{{$reset_link}}
-Du vil da motta en oppfølgings melding med det nye passordet.
+You will then receive a follow-up message containing the new password.
-Du kan endre passordet på siden for dine kontoinnstillinger etter innlogging.
+You may change that password from your account settings page after logging in.
-Innloggingsdetaljene er som følger:
+The login details are as follows:
-Nettstedsadresse:»$[siteurl]
-Brukernavn:»$[email]
+Site Location: {{$siteurl}}
+Login Name: {{$email}}
-Beste hilsen,
- $[sitename] administrator
+Sincerely,
+ {{$sitename}} Administrator
- \ No newline at end of file
+
diff --git a/view/nb-no/passchanged_eml.tpl b/view/nb-no/passchanged_eml.tpl
index 6f153d38c..0d94be3c2 100644
--- a/view/nb-no/passchanged_eml.tpl
+++ b/view/nb-no/passchanged_eml.tpl
@@ -1,20 +1,20 @@
-Kjære $[username],
- Ditt passord har blitt endret som forespurt. Vennligst ta vare på denne
-meldingen for sikkerhets skyld (eller bytt passordet ditt umiddelbart til
-noe du husker).
+Dear {{$username}},
+ Your password has been changed as requested. Please retain this
+information for your records (or change your password immediately to
+something that you will remember).
-Dine logg inn-detaljer er som følger:
+Your login details are as follows:
-Nettsted:»$[siteurl]
-Brukernavn:»$[email]
-Passord:»$[new_password]
+Site Location: {{$siteurl}}
+Login Name: {{$email}}
+Password: {{$new_password}}
-Du kan endre dette passordet på din side for kontoinnstillinger etter innlogging.
+You may change that password from your account settings page after logging in.
-Med vennlig hilsen,
- $[sitename] administrator
+Sincerely,
+ {{$sitename}} Administrator
- \ No newline at end of file
+
diff --git a/view/nb-no/register_open_eml.tpl b/view/nb-no/register_open_eml.tpl
index 345ca0b65..4b397201c 100644
--- a/view/nb-no/register_open_eml.tpl
+++ b/view/nb-no/register_open_eml.tpl
@@ -1,34 +1,19 @@
-Kjære $[username],
- Takk for at du registrerte deg hos $[sitename]. Kontoen din er opprettet.
-Innloggingsdetaljene er som følger:
+An account has been created at {{$sitename}} for this email address.
+The login details are as follows:
+Site Location: {{$siteurl}}
+Login: {{$email}}
+Password: (the password which was provided during registration)
-Nettstedsadresse:»$[siteurl]
-Brukernavn:»$[email]
-Passord:»$[password]
+If this account was created without your knowledge and is not desired, you may
+visit this site and reset the password. This will allow you to remove the
+account from the links on the Settings page, and we
+apologise for any inconvenience.
-Du kan endre passordet ditt på siden "Innstillinger" etter at du har logget
-inn.
+Thank you and welcome to {{$sitename}}.
-Vennligst bruk litt tid til å se over de andre kontoinnstillingene på den siden.
+Sincerely,
+ {{$sitename}} Administrator
-Du vil antakelig ønske å legge til litt grunnleggende informasjon til standardprofilen din
-(på siden "Profiler") slik at folk lettere kan finne deg.
-
-Vi anbefaler å oppgi fullt navn, legge til et profilbilde,
-legge til noen "nøkkelord" for profilen (svært nyttig for å få nye venner) - og
-kanskje hvilket land du bor i, hvis du ikke ønsker å være mer spesifikk
-enn det.
-
-Vi respekterer ditt privatliv fullt ut, og ingen av disse elementene er nødvendige.
-Hvis du er ny og ikke kjenner noen her, så kan de hjelpe
-deg å få noen nye og interessante venner.
-
-
-Takk og velkommen til $[sitename].
-
-Beste hilsen,
- $[sitename] administrator
-
- \ No newline at end of file
+
diff --git a/view/nb-no/register_verify_eml.tpl b/view/nb-no/register_verify_eml.tpl
index 4c2176d7d..85d9a12d3 100644
--- a/view/nb-no/register_verify_eml.tpl
+++ b/view/nb-no/register_verify_eml.tpl
@@ -1,25 +1,25 @@
-En ny forespørsel om brukerregistering ble mottatt hos $[sitename] og krever
-din godkjenning.
+A new user registration request was received at {{$sitename}} which requires
+your approval.
-Innloggingsdetaljene er som følger:
+The login details are as follows:
-Fullt navn:»$[username]
-Nettstedsadresse:»$[siteurl]
-Brukernavn:»$[email]
+Site Location: {{$siteurl}}
+Login Name: {{$email}}
+IP Address: {{$details}}
+To approve this request please visit the following link:
-For å godkjenne denne forespørselen, vennligst besøk følgende lenke:
+{{$siteurl}}/regmod/allow/{{$hash}}
-$[siteurl]/regmod/allow/$[hash]
+To deny the request and remove the account, please visit:
-For å avslå denne forespørselen og fjerne kontoen, vennligst besøk:
+{{$siteurl}}/regmod/deny/{{$hash}}
-$[siteurl]/regmod/deny/$[hash]
+Thank you.
-Mange takk.
diff --git a/view/nb-no/request_notify_eml.tpl b/view/nb-no/request_notify_eml.tpl
index e6a62c51f..d01b8ff27 100644
--- a/view/nb-no/request_notify_eml.tpl
+++ b/view/nb-no/request_notify_eml.tpl
@@ -1,17 +1,17 @@
-Kjære $[myname],
+Dear {{$myname}},
-Du har akkurat mottatt en kontaktforespørsel hos $[sitename]
+You have just received a connection request at {{$sitename}}
-fra '$[requestor]'.
+from '{{$requestor}}'.
-Du kan besøke profilen på $[url].
+You may visit their profile at {{$url}}.
-Vennligst logg inn på ditt nettsted for å se hele introduksjonen
-og godkjenne eller ignorere/avbryte forespørselen.
+Please login to your site to view the complete introduction
+and approve or ignore/cancel the request.
-$[siteurl]
+{{$siteurl}}
-Beste hilsen,
+Regards,
- $[siteurl] administrator \ No newline at end of file
+ {{$sitename}} administrator
diff --git a/view/nb-no/update_fail_eml.tpl b/view/nb-no/update_fail_eml.tpl
index a4a3cf950..a7df8fc2f 100644
--- a/view/nb-no/update_fail_eml.tpl
+++ b/view/nb-no/update_fail_eml.tpl
@@ -1,11 +1,13 @@
-Hei,
-jeg er $sitename.
-Friendica-utviklerne slapp nylig oppdateringen $update,
-men da jeg prøvde å installere den, gikk noe forferdelig galt.
-Dette trenger å bli fikset raskt og jeg kan ikke gjøre det alene. Vennligst kontakt en
-Friendica-utvikler hvis du ikke kan hjelpe meg på egenhånd. Databasen min er kanskje ugyldig.
+Hey,
+I'm the web server at {{$sitename}};
+
+The Red Matrix developers released update {{$update}} recently,
+but when I tried to install it, something went terribly wrong.
+This needs to be fixed soon and it requires human intervention.
+Please contact a Red developer if you can not figure out how to
+fix it on your own. My database might be invalid.
-Feilmeldingen er '$error'.
+The error message is '{{$error}}'.
-Jeg beklager,
-din Friendica-tjener hos $siteurl \ No newline at end of file
+Apologies for the inconvenience,
+ your web server at {{$siteurl}} \ No newline at end of file
diff --git a/view/pdl/mod_blocks.pdl b/view/pdl/mod_blocks.pdl
new file mode 100644
index 000000000..cef69f194
--- /dev/null
+++ b/view/pdl/mod_blocks.pdl
@@ -0,0 +1,3 @@
+[region=aside]
+[widget=design_tools][/widget]
+[/region] \ No newline at end of file
diff --git a/view/pdl/mod_channel.pdl b/view/pdl/mod_channel.pdl
new file mode 100644
index 000000000..dde8830ee
--- /dev/null
+++ b/view/pdl/mod_channel.pdl
@@ -0,0 +1,6 @@
+[region=aside]
+[widget=fullprofile][/widget]
+[widget=archive][var=wall]1[/var][/widget]
+[widget=categories][/widget]
+[widget=tagcloud_wall][var=limit]24[/var][/widget]
+[/region]
diff --git a/view/pdl/mod_chanview.pdl b/view/pdl/mod_chanview.pdl
new file mode 100644
index 000000000..d8f50ad7a
--- /dev/null
+++ b/view/pdl/mod_chanview.pdl
@@ -0,0 +1,3 @@
+[region=aside]
+[widget=vcard][/widget]
+[/region]
diff --git a/view/pdl/mod_cloud.pdl b/view/pdl/mod_cloud.pdl
new file mode 100644
index 000000000..6b1d2a15e
--- /dev/null
+++ b/view/pdl/mod_cloud.pdl
@@ -0,0 +1,3 @@
+[region=aside]
+[widget=profile][/widget]
+[/region]
diff --git a/view/pdl/mod_common.pdl b/view/pdl/mod_common.pdl
new file mode 100644
index 000000000..f12bf39c3
--- /dev/null
+++ b/view/pdl/mod_common.pdl
@@ -0,0 +1,3 @@
+[region=aside]
+[widget=fullprofile][/widget]
+[/region]
diff --git a/view/pdl/mod_connect.pdl b/view/pdl/mod_connect.pdl
new file mode 100644
index 000000000..6b1d2a15e
--- /dev/null
+++ b/view/pdl/mod_connect.pdl
@@ -0,0 +1,3 @@
+[region=aside]
+[widget=profile][/widget]
+[/region]
diff --git a/view/pdl/mod_connections.pdl b/view/pdl/mod_connections.pdl
new file mode 100644
index 000000000..fc86e4490
--- /dev/null
+++ b/view/pdl/mod_connections.pdl
@@ -0,0 +1,5 @@
+[region=aside]
+[widget=follow][/widget]
+[widget=suggestions][/widget]
+[widget=findpeople][/widget]
+[/region]
diff --git a/view/pdl/mod_connedit.pdl b/view/pdl/mod_connedit.pdl
new file mode 100644
index 000000000..4b468e34c
--- /dev/null
+++ b/view/pdl/mod_connedit.pdl
@@ -0,0 +1,6 @@
+[region=aside]
+[widget=vcard][/widget]
+[widget=collections][var=mode]abook[/var][/widget]
+[widget=suggestions][/widget]
+[widget=findpeople][/widget]
+[/region]
diff --git a/view/pdl/mod_directory.pdl b/view/pdl/mod_directory.pdl
new file mode 100644
index 000000000..0bc8ed936
--- /dev/null
+++ b/view/pdl/mod_directory.pdl
@@ -0,0 +1,7 @@
+[region=aside]
+[widget=findpeople][/widget]
+[widget=dirsafemode][/widget]
+[widget=dirsort][/widget]
+[widget=dirtags][/widget]
+[widget=suggestions][/widget]
+[/region]
diff --git a/view/pdl/mod_group.pdl b/view/pdl/mod_group.pdl
new file mode 100644
index 000000000..8db29cf78
--- /dev/null
+++ b/view/pdl/mod_group.pdl
@@ -0,0 +1,3 @@
+[region=aside]
+[widget=collections][var=mode]groups[/var][/widget]
+[/region]
diff --git a/view/pdl/mod_layouts.pdl b/view/pdl/mod_layouts.pdl
new file mode 100644
index 000000000..cef69f194
--- /dev/null
+++ b/view/pdl/mod_layouts.pdl
@@ -0,0 +1,3 @@
+[region=aside]
+[widget=design_tools][/widget]
+[/region] \ No newline at end of file
diff --git a/view/pdl/mod_mail.pdl b/view/pdl/mod_mail.pdl
new file mode 100644
index 000000000..d8f50ad7a
--- /dev/null
+++ b/view/pdl/mod_mail.pdl
@@ -0,0 +1,3 @@
+[region=aside]
+[widget=vcard][/widget]
+[/region]
diff --git a/view/pdl/mod_menu.pdl b/view/pdl/mod_menu.pdl
new file mode 100644
index 000000000..cef69f194
--- /dev/null
+++ b/view/pdl/mod_menu.pdl
@@ -0,0 +1,3 @@
+[region=aside]
+[widget=design_tools][/widget]
+[/region] \ No newline at end of file
diff --git a/view/pdl/mod_message.pdl b/view/pdl/mod_message.pdl
new file mode 100644
index 000000000..2efb3de79
--- /dev/null
+++ b/view/pdl/mod_message.pdl
@@ -0,0 +1,3 @@
+[region=aside]
+[widget=mailmenu][/widget]
+[/region]
diff --git a/view/pdl/mod_mitem.pdl b/view/pdl/mod_mitem.pdl
new file mode 100644
index 000000000..c210606d0
--- /dev/null
+++ b/view/pdl/mod_mitem.pdl
@@ -0,0 +1,4 @@
+[region=aside]
+[widget=design_tools][/widget]
+[widget=menu_preview][/widget]
+[/region] \ No newline at end of file
diff --git a/view/pdl/mod_network.pdl b/view/pdl/mod_network.pdl
new file mode 100644
index 000000000..7624ace01
--- /dev/null
+++ b/view/pdl/mod_network.pdl
@@ -0,0 +1,15 @@
+[region=nav]$nav[/region]
+
+[region=aside]
+[widget=collections][/widget]
+[widget=archive][/widget]
+[widget=suggestions][/widget]
+[widget=savedsearch][/widget]
+[widget=filer][/widget]
+[widget=notes][/widget]
+[/region]
+
+[region=content]
+[widget=affinity][/widget]
+$content
+[/region] \ No newline at end of file
diff --git a/view/pdl/mod_new_channel.pdl b/view/pdl/mod_new_channel.pdl
new file mode 100644
index 000000000..733bc248a
--- /dev/null
+++ b/view/pdl/mod_new_channel.pdl
@@ -0,0 +1 @@
+[layout]full[/layout]
diff --git a/view/pdl/mod_photos.pdl b/view/pdl/mod_photos.pdl
new file mode 100644
index 000000000..c37cf02fe
--- /dev/null
+++ b/view/pdl/mod_photos.pdl
@@ -0,0 +1,4 @@
+[region=aside]
+[widget=vcard][/widget]
+[widget=photo_albums][/widget]
+[/region]
diff --git a/view/pdl/mod_profile.pdl b/view/pdl/mod_profile.pdl
new file mode 100644
index 000000000..f12bf39c3
--- /dev/null
+++ b/view/pdl/mod_profile.pdl
@@ -0,0 +1,3 @@
+[region=aside]
+[widget=fullprofile][/widget]
+[/region]
diff --git a/view/pdl/mod_profile_photo.pdl b/view/pdl/mod_profile_photo.pdl
new file mode 100644
index 000000000..f12bf39c3
--- /dev/null
+++ b/view/pdl/mod_profile_photo.pdl
@@ -0,0 +1,3 @@
+[region=aside]
+[widget=fullprofile][/widget]
+[/region]
diff --git a/view/pdl/mod_profiles.pdl b/view/pdl/mod_profiles.pdl
new file mode 100644
index 000000000..f12bf39c3
--- /dev/null
+++ b/view/pdl/mod_profiles.pdl
@@ -0,0 +1,3 @@
+[region=aside]
+[widget=fullprofile][/widget]
+[/region]
diff --git a/view/pdl/mod_profperm.pdl b/view/pdl/mod_profperm.pdl
new file mode 100644
index 000000000..f12bf39c3
--- /dev/null
+++ b/view/pdl/mod_profperm.pdl
@@ -0,0 +1,3 @@
+[region=aside]
+[widget=fullprofile][/widget]
+[/region]
diff --git a/view/pdl/mod_register.pdl b/view/pdl/mod_register.pdl
new file mode 100644
index 000000000..733bc248a
--- /dev/null
+++ b/view/pdl/mod_register.pdl
@@ -0,0 +1 @@
+[layout]full[/layout]
diff --git a/view/pdl/mod_search.pdl b/view/pdl/mod_search.pdl
new file mode 100644
index 000000000..7de4a270f
--- /dev/null
+++ b/view/pdl/mod_search.pdl
@@ -0,0 +1,3 @@
+[region=aside]
+[widget=savedsearch][/widget]
+[/region]
diff --git a/view/pdl/mod_settings.pdl b/view/pdl/mod_settings.pdl
new file mode 100644
index 000000000..0b0a99638
--- /dev/null
+++ b/view/pdl/mod_settings.pdl
@@ -0,0 +1,4 @@
+[region=aside]
+[widget=settings_menu][/widget]
+[/region]
+
diff --git a/view/pdl/mod_suggest.pdl b/view/pdl/mod_suggest.pdl
new file mode 100644
index 000000000..c2889f2fe
--- /dev/null
+++ b/view/pdl/mod_suggest.pdl
@@ -0,0 +1,4 @@
+[region=aside]
+[widget=follow][/widget]
+[widget=findpeople][/widget]
+[/region] \ No newline at end of file
diff --git a/view/pdl/mod_viewconnections.pdl b/view/pdl/mod_viewconnections.pdl
new file mode 100644
index 000000000..f12bf39c3
--- /dev/null
+++ b/view/pdl/mod_viewconnections.pdl
@@ -0,0 +1,3 @@
+[region=aside]
+[widget=fullprofile][/widget]
+[/region]
diff --git a/view/pdl/mod_webpages.pdl b/view/pdl/mod_webpages.pdl
new file mode 100644
index 000000000..cef69f194
--- /dev/null
+++ b/view/pdl/mod_webpages.pdl
@@ -0,0 +1,3 @@
+[region=aside]
+[widget=design_tools][/widget]
+[/region] \ No newline at end of file
diff --git a/view/php/default.php b/view/php/default.php
index 80c8070b2..3573bf829 100644
--- a/view/php/default.php
+++ b/view/php/default.php
@@ -7,12 +7,12 @@
</head>
<body>
<?php if(x($page,'nav')) echo $page['nav']; ?>
- <aside><?php if(x($page,'aside')) echo $page['aside']; ?></aside>
- <section><?php if(x($page,'content')) echo $page['content']; ?>
+ <aside id="region_1"><?php if(x($page,'aside')) echo $page['aside']; ?></aside>
+ <section id="region_2"><?php if(x($page,'content')) echo $page['content']; ?>
<div id="page-footer"></div>
- <div id="pause"></div>
- </section>
- <right_aside><?php if(x($page,'right_aside')) echo $page['right_aside']; ?></right_aside>
+ <div id="pause"></div>
+ </section>
+ <aside id="region_3"><?php if(x($page,'right_aside')) echo $page['right_aside']; ?></aside>
<footer><?php if(x($page,'footer')) echo $page['footer']; ?></footer>
</body>
</html>
diff --git a/view/php/mod_new_channel.php b/view/php/mod_new_channel.php
deleted file mode 100644
index e7709cbd8..000000000
--- a/view/php/mod_new_channel.php
+++ /dev/null
@@ -1,3 +0,0 @@
-<?php
-
-$a->page['template'] = 'full';
diff --git a/view/php/mod_register.php b/view/php/mod_register.php
deleted file mode 100644
index e7709cbd8..000000000
--- a/view/php/mod_register.php
+++ /dev/null
@@ -1,3 +0,0 @@
-<?php
-
-$a->page['template'] = 'full';
diff --git a/view/php/none.php b/view/php/none.php
new file mode 100644
index 000000000..51d0e83dc
--- /dev/null
+++ b/view/php/none.php
@@ -0,0 +1 @@
+<?php if(x($page,'content')) echo $page['content']; ?>
diff --git a/view/php/theme_init.php b/view/php/theme_init.php
index 68d6e4cd1..a8edb0673 100644
--- a/view/php/theme_init.php
+++ b/view/php/theme_init.php
@@ -1,26 +1,61 @@
<?php
-
require_once('include/plugin.php');
-
+head_add_css('library/bootstrap/css/bootstrap-theme.min.css');
+head_add_css('library/bootstrap/css/bootstrap.min.css');
head_add_css('library/fancybox/jquery.fancybox-1.3.4.css');
head_add_css('library/tiptip/tipTip.css');
head_add_css('library/jgrowl/jquery.jgrowl.css');
-head_add_css('library/jslider/bin/jquery.slider.min.css');
+head_add_css('library/jslider/css/jslider.css');
+head_add_css('library/prettyphoto/css/prettyPhoto.css');
+head_add_css('library/colorbox/colorbox.css');
+
+// head_add_css('library/font_awesome/css/font-awesome.min.css');
+head_add_css('view/css/conversation.css');
+head_add_css('view/css/bootstrap-red.css');
+head_add_css('view/css/widgets.css');
+head_add_css('library/bootstrap-datetimepicker/css/bootstrap-datetimepicker.min.css');
-head_add_js('js/jquery.js');
-head_add_js('js/jquery.textinputs.js');
-head_add_js('js/fk.autocomplete.js');
-head_add_js('library/fancybox/jquery.fancybox-1.3.4.pack.js');
+head_add_js('jquery.js');
+head_add_js('library/bootstrap/js/bootstrap.min.js');
+head_add_js('library/bootstrap/js/bootbox.min.js');
+head_add_js('jquery-migrate-1.1.1.js');
+//head_add_js('jquery-compat.js');
+head_add_js('spin.js');
+head_add_js('jquery.spin.js');
+head_add_js('jquery.textinputs.js');
+head_add_js('autocomplete.js');
+head_add_js('library/fancybox/jquery.fancybox-1.3.4.js');
head_add_js('library/jquery.timeago.js');
head_add_js('library/jquery.divgrow/jquery.divgrow-1.3.1.js');
head_add_js('library/jquery_ac/friendica.complete.js');
head_add_js('library/tiptip/jquery.tipTip.minified.js');
head_add_js('library/jgrowl/jquery.jgrowl_minimized.js');
-head_add_js('library/tinymce/jscripts/tiny_mce/tiny_mce_src.js');
-head_add_js('js/acl.js');
-head_add_js('js/webtoolkit.base64.js');
-head_add_js('js/main.js');
+head_add_js('library/tinymce/jscripts/tiny_mce/tiny_mce.js');
+head_add_js('library/cryptojs/components/core-min.js');
+head_add_js('library/cryptojs/rollups/aes.js');
+head_add_js('library/cryptojs/rollups/rabbit.js');
+head_add_js('library/cryptojs/rollups/tripledes.js');
+head_add_js('acl.js');
+head_add_js('webtoolkit.base64.js');
+head_add_js('main.js');
+head_add_js('crypto.js');
head_add_js('library/jslider/bin/jquery.slider.min.js');
head_add_js('docready.js');
+head_add_js('library/prettyphoto/js/jquery.prettyPhoto.js');
+head_add_js('library/colorbox/jquery.colorbox-min.js');
+head_add_js('library/bootstrap-datetimepicker/js/moment.js');
+head_add_js('library/bootstrap-datetimepicker/js/bootstrap-datetimepicker.min.js');
+/**
+ * Those who require this feature will know what to do with it.
+ * Those who don't, won't.
+ * Eventually this functionality needs to be provided by a module
+ * such that permissions can be enforced. At the moment it's
+ * more of a proof of concept; but sufficient for our immediate needs.
+ */
+
+$channel = get_app()->get_channel();
+if($channel && file_exists($channel['channel_address'] . '.js'))
+ head_add_js('/' . $channel['channel_address'] . '.js');
+
diff --git a/view/pt-br/follow_notify_eml.tpl b/view/pt-br/follow_notify_eml.tpl
new file mode 100644
index 000000000..ba07b19da
--- /dev/null
+++ b/view/pt-br/follow_notify_eml.tpl
@@ -0,0 +1,14 @@
+
+Dear {{$myname}},
+
+You have a new follower at {{$sitename}} - '{{$requestor}}'.
+
+You may visit their profile at {{$url}}.
+
+Please login to your site to approve or ignore/cancel the request.
+
+{{$siteurl}}
+
+Regards,
+
+ {{$sitename}} administrator
diff --git a/view/pt-br/friend_complete_eml.tpl b/view/pt-br/friend_complete_eml.tpl
new file mode 100644
index 000000000..1c647b994
--- /dev/null
+++ b/view/pt-br/friend_complete_eml.tpl
@@ -0,0 +1,22 @@
+
+Dear {{$username}},
+
+ Great news... '{{$fn}}' at '{{$dfrn_url}}' has accepted
+your connection request at '{{$sitename}}'.
+
+You are now mutual friends and may exchange status updates, photos, and email
+without restriction.
+
+Please visit your 'Connnections' page at {{$sitename}} if you wish to make
+any changes to this relationship.
+
+{{$siteurl}}
+
+[For instance, you may create a separate profile with information that is not
+available to the general public - and assign viewing rights to '{{$fn}}'].
+
+Sincerely,
+
+ {{$sitename}} Administrator
+
+
diff --git a/view/pt-br/htconfig.tpl b/view/pt-br/htconfig.tpl
new file mode 100644
index 000000000..493cb5d00
--- /dev/null
+++ b/view/pt-br/htconfig.tpl
@@ -0,0 +1,70 @@
+<?php
+
+// Set the following for your MySQL installation
+// Copy or rename this file to .htconfig.php
+
+$db_host = '{{$dbhost}}';
+$db_port = '{{$dbport}}';
+$db_user = '{{$dbuser}}';
+$db_pass = '{{$dbpass}}';
+$db_data = '{{$dbdata}}';
+
+/*
+ * Notice: Many of the following settings will be available in the admin panel
+ * after a successful site install. Once they are set in the admin panel, they
+ * are stored in the DB - and the DB setting will over-ride any corresponding
+ * setting in this file
+ *
+ * The command-line tool util/config is able to query and set the DB items
+ * directly if for some reason the admin panel is not available and a system
+ * setting requires modification.
+ *
+ */
+
+
+// Choose a legal default timezone. If you are unsure, use "America/Los_Angeles".
+// It can be changed later and only applies to timestamps for anonymous viewers.
+
+$default_timezone = '{{$timezone}}';
+
+// What is your site name?
+
+$a->config['system']['baseurl'] = '{{$siteurl}}';
+$a->config['system']['sitename'] = "Red Matrix";
+$a->config['system']['location_hash'] = '{{$site_id}}';
+
+// Your choices are REGISTER_OPEN, REGISTER_APPROVE, or REGISTER_CLOSED.
+// Be certain to create your own personal account before setting
+// REGISTER_CLOSED. 'register_text' (if set) will be displayed prominently on
+// the registration page. REGISTER_APPROVE requires you set 'admin_email'
+// to the email address of an already registered person who can authorise
+// and/or approve/deny the request.
+
+$a->config['system']['register_policy'] = REGISTER_OPEN;
+$a->config['system']['register_text'] = '';
+$a->config['system']['admin_email'] = '{{$adminmail}}';
+
+// Maximum size of an imported message, 0 is unlimited
+
+$a->config['system']['max_import_size'] = 200000;
+
+// maximum size of uploaded photos
+
+$a->config['system']['maximagesize'] = 800000;
+
+// Location of PHP command line processor
+
+$a->config['system']['php_path'] = '{{$phpath}}';
+
+// Configure how we communicate with directory servers.
+// DIRECTORY_MODE_NORMAL = directory client, we will find a directory
+// DIRECTORY_MODE_SECONDARY = caching directory or mirror
+// DIRECTORY_MODE_PRIMARY = main directory server
+// DIRECTORY_MODE_STANDALONE = "off the grid" or private directory services
+
+$a->config['system']['directory_mode'] = DIRECTORY_MODE_NORMAL;
+
+// default system theme
+
+$a->config['system']['theme'] = 'redbasic';
+
diff --git a/view/pt-br/intro_complete_eml.tpl b/view/pt-br/intro_complete_eml.tpl
new file mode 100644
index 000000000..2c2428d68
--- /dev/null
+++ b/view/pt-br/intro_complete_eml.tpl
@@ -0,0 +1,22 @@
+
+Dear {{$username}},
+
+ '{{$fn}}' at '{{$dfrn_url}}' has accepted
+your connection request at '{{$sitename}}'.
+
+ '{{$fn}}' has chosen to accept you a "fan", which restricts
+some forms of communication - such as private messaging and some profile
+interactions. If this is a celebrity or community page, these settings were
+applied automatically.
+
+ '{{$fn}}' may choose to extend this into a two-way or more permissive
+relationship in the future.
+
+ You will start receiving public status updates from '{{$fn}}',
+which will appear on your 'Matrix' page at
+
+{{$siteurl}}
+
+Sincerely,
+
+ {{$sitename}} Administrator
diff --git a/view/pt-br/lostpass_eml.tpl b/view/pt-br/lostpass_eml.tpl
new file mode 100644
index 000000000..3b79d2791
--- /dev/null
+++ b/view/pt-br/lostpass_eml.tpl
@@ -0,0 +1,32 @@
+
+Dear {{$username}},
+ A request was recently received at {{$sitename}} to reset your account
+password. In order to confirm this request, please select the verification link
+below or paste it into your web browser address bar.
+
+If you did NOT request this change, please DO NOT follow the link
+provided and ignore and/or delete this email.
+
+Your password will not be changed unless we can verify that you
+issued this request.
+
+Follow this link to verify your identity:
+
+{{$reset_link}}
+
+You will then receive a follow-up message containing the new password.
+
+You may change that password from your account settings page after logging in.
+
+The login details are as follows:
+
+Site Location: {{$siteurl}}
+Login Name: {{$email}}
+
+
+
+
+Sincerely,
+ {{$sitename}} Administrator
+
+
diff --git a/view/pt-br/passchanged_eml.tpl b/view/pt-br/passchanged_eml.tpl
new file mode 100644
index 000000000..0d94be3c2
--- /dev/null
+++ b/view/pt-br/passchanged_eml.tpl
@@ -0,0 +1,20 @@
+
+Dear {{$username}},
+ Your password has been changed as requested. Please retain this
+information for your records (or change your password immediately to
+something that you will remember).
+
+
+Your login details are as follows:
+
+Site Location: {{$siteurl}}
+Login Name: {{$email}}
+Password: {{$new_password}}
+
+You may change that password from your account settings page after logging in.
+
+
+Sincerely,
+ {{$sitename}} Administrator
+
+
diff --git a/view/pt-br/register_open_eml.tpl b/view/pt-br/register_open_eml.tpl
new file mode 100644
index 000000000..4b397201c
--- /dev/null
+++ b/view/pt-br/register_open_eml.tpl
@@ -0,0 +1,19 @@
+
+An account has been created at {{$sitename}} for this email address.
+The login details are as follows:
+
+Site Location: {{$siteurl}}
+Login: {{$email}}
+Password: (the password which was provided during registration)
+
+If this account was created without your knowledge and is not desired, you may
+visit this site and reset the password. This will allow you to remove the
+account from the links on the Settings page, and we
+apologise for any inconvenience.
+
+Thank you and welcome to {{$sitename}}.
+
+Sincerely,
+ {{$sitename}} Administrator
+
+
diff --git a/view/pt-br/register_verify_eml.tpl b/view/pt-br/register_verify_eml.tpl
new file mode 100644
index 000000000..85d9a12d3
--- /dev/null
+++ b/view/pt-br/register_verify_eml.tpl
@@ -0,0 +1,25 @@
+
+A new user registration request was received at {{$sitename}} which requires
+your approval.
+
+
+The login details are as follows:
+
+Site Location: {{$siteurl}}
+Login Name: {{$email}}
+IP Address: {{$details}}
+
+To approve this request please visit the following link:
+
+
+{{$siteurl}}/regmod/allow/{{$hash}}
+
+
+To deny the request and remove the account, please visit:
+
+
+{{$siteurl}}/regmod/deny/{{$hash}}
+
+
+Thank you.
+
diff --git a/view/pt-br/request_notify_eml.tpl b/view/pt-br/request_notify_eml.tpl
new file mode 100644
index 000000000..d01b8ff27
--- /dev/null
+++ b/view/pt-br/request_notify_eml.tpl
@@ -0,0 +1,17 @@
+
+Dear {{$myname}},
+
+You have just received a connection request at {{$sitename}}
+
+from '{{$requestor}}'.
+
+You may visit their profile at {{$url}}.
+
+Please login to your site to view the complete introduction
+and approve or ignore/cancel the request.
+
+{{$siteurl}}
+
+Regards,
+
+ {{$sitename}} administrator
diff --git a/view/pt-br/update_fail_eml.tpl b/view/pt-br/update_fail_eml.tpl
new file mode 100644
index 000000000..a7df8fc2f
--- /dev/null
+++ b/view/pt-br/update_fail_eml.tpl
@@ -0,0 +1,13 @@
+Hey,
+I'm the web server at {{$sitename}};
+
+The Red Matrix developers released update {{$update}} recently,
+but when I tried to install it, something went terribly wrong.
+This needs to be fixed soon and it requires human intervention.
+Please contact a Red developer if you can not figure out how to
+fix it on your own. My database might be invalid.
+
+The error message is '{{$error}}'.
+
+Apologies for the inconvenience,
+ your web server at {{$siteurl}} \ No newline at end of file
diff --git a/view/ru/follow_notify_eml.tpl b/view/ru/follow_notify_eml.tpl
new file mode 100644
index 000000000..ba07b19da
--- /dev/null
+++ b/view/ru/follow_notify_eml.tpl
@@ -0,0 +1,14 @@
+
+Dear {{$myname}},
+
+You have a new follower at {{$sitename}} - '{{$requestor}}'.
+
+You may visit their profile at {{$url}}.
+
+Please login to your site to approve or ignore/cancel the request.
+
+{{$siteurl}}
+
+Regards,
+
+ {{$sitename}} administrator
diff --git a/view/ru/friend_complete_eml.tpl b/view/ru/friend_complete_eml.tpl
new file mode 100644
index 000000000..1c647b994
--- /dev/null
+++ b/view/ru/friend_complete_eml.tpl
@@ -0,0 +1,22 @@
+
+Dear {{$username}},
+
+ Great news... '{{$fn}}' at '{{$dfrn_url}}' has accepted
+your connection request at '{{$sitename}}'.
+
+You are now mutual friends and may exchange status updates, photos, and email
+without restriction.
+
+Please visit your 'Connnections' page at {{$sitename}} if you wish to make
+any changes to this relationship.
+
+{{$siteurl}}
+
+[For instance, you may create a separate profile with information that is not
+available to the general public - and assign viewing rights to '{{$fn}}'].
+
+Sincerely,
+
+ {{$sitename}} Administrator
+
+
diff --git a/view/ru/htconfig.tpl b/view/ru/htconfig.tpl
new file mode 100644
index 000000000..493cb5d00
--- /dev/null
+++ b/view/ru/htconfig.tpl
@@ -0,0 +1,70 @@
+<?php
+
+// Set the following for your MySQL installation
+// Copy or rename this file to .htconfig.php
+
+$db_host = '{{$dbhost}}';
+$db_port = '{{$dbport}}';
+$db_user = '{{$dbuser}}';
+$db_pass = '{{$dbpass}}';
+$db_data = '{{$dbdata}}';
+
+/*
+ * Notice: Many of the following settings will be available in the admin panel
+ * after a successful site install. Once they are set in the admin panel, they
+ * are stored in the DB - and the DB setting will over-ride any corresponding
+ * setting in this file
+ *
+ * The command-line tool util/config is able to query and set the DB items
+ * directly if for some reason the admin panel is not available and a system
+ * setting requires modification.
+ *
+ */
+
+
+// Choose a legal default timezone. If you are unsure, use "America/Los_Angeles".
+// It can be changed later and only applies to timestamps for anonymous viewers.
+
+$default_timezone = '{{$timezone}}';
+
+// What is your site name?
+
+$a->config['system']['baseurl'] = '{{$siteurl}}';
+$a->config['system']['sitename'] = "Red Matrix";
+$a->config['system']['location_hash'] = '{{$site_id}}';
+
+// Your choices are REGISTER_OPEN, REGISTER_APPROVE, or REGISTER_CLOSED.
+// Be certain to create your own personal account before setting
+// REGISTER_CLOSED. 'register_text' (if set) will be displayed prominently on
+// the registration page. REGISTER_APPROVE requires you set 'admin_email'
+// to the email address of an already registered person who can authorise
+// and/or approve/deny the request.
+
+$a->config['system']['register_policy'] = REGISTER_OPEN;
+$a->config['system']['register_text'] = '';
+$a->config['system']['admin_email'] = '{{$adminmail}}';
+
+// Maximum size of an imported message, 0 is unlimited
+
+$a->config['system']['max_import_size'] = 200000;
+
+// maximum size of uploaded photos
+
+$a->config['system']['maximagesize'] = 800000;
+
+// Location of PHP command line processor
+
+$a->config['system']['php_path'] = '{{$phpath}}';
+
+// Configure how we communicate with directory servers.
+// DIRECTORY_MODE_NORMAL = directory client, we will find a directory
+// DIRECTORY_MODE_SECONDARY = caching directory or mirror
+// DIRECTORY_MODE_PRIMARY = main directory server
+// DIRECTORY_MODE_STANDALONE = "off the grid" or private directory services
+
+$a->config['system']['directory_mode'] = DIRECTORY_MODE_NORMAL;
+
+// default system theme
+
+$a->config['system']['theme'] = 'redbasic';
+
diff --git a/view/ru/intro_complete_eml.tpl b/view/ru/intro_complete_eml.tpl
new file mode 100644
index 000000000..2c2428d68
--- /dev/null
+++ b/view/ru/intro_complete_eml.tpl
@@ -0,0 +1,22 @@
+
+Dear {{$username}},
+
+ '{{$fn}}' at '{{$dfrn_url}}' has accepted
+your connection request at '{{$sitename}}'.
+
+ '{{$fn}}' has chosen to accept you a "fan", which restricts
+some forms of communication - such as private messaging and some profile
+interactions. If this is a celebrity or community page, these settings were
+applied automatically.
+
+ '{{$fn}}' may choose to extend this into a two-way or more permissive
+relationship in the future.
+
+ You will start receiving public status updates from '{{$fn}}',
+which will appear on your 'Matrix' page at
+
+{{$siteurl}}
+
+Sincerely,
+
+ {{$sitename}} Administrator
diff --git a/view/ru/lostpass_eml.tpl b/view/ru/lostpass_eml.tpl
new file mode 100644
index 000000000..3b79d2791
--- /dev/null
+++ b/view/ru/lostpass_eml.tpl
@@ -0,0 +1,32 @@
+
+Dear {{$username}},
+ A request was recently received at {{$sitename}} to reset your account
+password. In order to confirm this request, please select the verification link
+below or paste it into your web browser address bar.
+
+If you did NOT request this change, please DO NOT follow the link
+provided and ignore and/or delete this email.
+
+Your password will not be changed unless we can verify that you
+issued this request.
+
+Follow this link to verify your identity:
+
+{{$reset_link}}
+
+You will then receive a follow-up message containing the new password.
+
+You may change that password from your account settings page after logging in.
+
+The login details are as follows:
+
+Site Location: {{$siteurl}}
+Login Name: {{$email}}
+
+
+
+
+Sincerely,
+ {{$sitename}} Administrator
+
+
diff --git a/view/ru/passchanged_eml.tpl b/view/ru/passchanged_eml.tpl
new file mode 100644
index 000000000..0d94be3c2
--- /dev/null
+++ b/view/ru/passchanged_eml.tpl
@@ -0,0 +1,20 @@
+
+Dear {{$username}},
+ Your password has been changed as requested. Please retain this
+information for your records (or change your password immediately to
+something that you will remember).
+
+
+Your login details are as follows:
+
+Site Location: {{$siteurl}}
+Login Name: {{$email}}
+Password: {{$new_password}}
+
+You may change that password from your account settings page after logging in.
+
+
+Sincerely,
+ {{$sitename}} Administrator
+
+
diff --git a/view/ru/register_open_eml.tpl b/view/ru/register_open_eml.tpl
new file mode 100644
index 000000000..4b397201c
--- /dev/null
+++ b/view/ru/register_open_eml.tpl
@@ -0,0 +1,19 @@
+
+An account has been created at {{$sitename}} for this email address.
+The login details are as follows:
+
+Site Location: {{$siteurl}}
+Login: {{$email}}
+Password: (the password which was provided during registration)
+
+If this account was created without your knowledge and is not desired, you may
+visit this site and reset the password. This will allow you to remove the
+account from the links on the Settings page, and we
+apologise for any inconvenience.
+
+Thank you and welcome to {{$sitename}}.
+
+Sincerely,
+ {{$sitename}} Administrator
+
+
diff --git a/view/ru/register_verify_eml.tpl b/view/ru/register_verify_eml.tpl
new file mode 100644
index 000000000..85d9a12d3
--- /dev/null
+++ b/view/ru/register_verify_eml.tpl
@@ -0,0 +1,25 @@
+
+A new user registration request was received at {{$sitename}} which requires
+your approval.
+
+
+The login details are as follows:
+
+Site Location: {{$siteurl}}
+Login Name: {{$email}}
+IP Address: {{$details}}
+
+To approve this request please visit the following link:
+
+
+{{$siteurl}}/regmod/allow/{{$hash}}
+
+
+To deny the request and remove the account, please visit:
+
+
+{{$siteurl}}/regmod/deny/{{$hash}}
+
+
+Thank you.
+
diff --git a/view/ru/request_notify_eml.tpl b/view/ru/request_notify_eml.tpl
new file mode 100644
index 000000000..d01b8ff27
--- /dev/null
+++ b/view/ru/request_notify_eml.tpl
@@ -0,0 +1,17 @@
+
+Dear {{$myname}},
+
+You have just received a connection request at {{$sitename}}
+
+from '{{$requestor}}'.
+
+You may visit their profile at {{$url}}.
+
+Please login to your site to view the complete introduction
+and approve or ignore/cancel the request.
+
+{{$siteurl}}
+
+Regards,
+
+ {{$sitename}} administrator
diff --git a/view/ru/update_fail_eml.tpl b/view/ru/update_fail_eml.tpl
new file mode 100644
index 000000000..a7df8fc2f
--- /dev/null
+++ b/view/ru/update_fail_eml.tpl
@@ -0,0 +1,13 @@
+Hey,
+I'm the web server at {{$sitename}};
+
+The Red Matrix developers released update {{$update}} recently,
+but when I tried to install it, something went terribly wrong.
+This needs to be fixed soon and it requires human intervention.
+Please contact a Red developer if you can not figure out how to
+fix it on your own. My database might be invalid.
+
+The error message is '{{$error}}'.
+
+Apologies for the inconvenience,
+ your web server at {{$siteurl}} \ No newline at end of file
diff --git a/view/sv/follow_notify_eml.tpl b/view/sv/follow_notify_eml.tpl
index fee08bdca..ba07b19da 100644
--- a/view/sv/follow_notify_eml.tpl
+++ b/view/sv/follow_notify_eml.tpl
@@ -1,12 +1,14 @@
-$myname,
-'$requestor' på $sitename vill följa dina uppdateringar här på Friendika.
+Dear {{$myname}},
-Besök dennes profil på $url.
+You have a new follower at {{$sitename}} - '{{$requestor}}'.
-Logga in för att godkänna eller avslå förfrågan.
+You may visit their profile at {{$url}}.
-$siteurl
+Please login to your site to approve or ignore/cancel the request.
-Hälsningar,
-$sitename admin
+{{$siteurl}}
+
+Regards,
+
+ {{$sitename}} administrator
diff --git a/view/sv/friend_complete_eml.tpl b/view/sv/friend_complete_eml.tpl
index 2b8b0238e..1c647b994 100644
--- a/view/sv/friend_complete_eml.tpl
+++ b/view/sv/friend_complete_eml.tpl
@@ -1,17 +1,22 @@
-$username,
-Goda nyheter... '$fn' på '$dfrn_url' har accepterat din kontaktförfrågan på '$sitename'.
+Dear {{$username}},
-Ni är nu ömsesidiga vänner och kan se varandras statusuppdateringar samt skicka foton och meddelanden
-utan begränsningar.
+ Great news... '{{$fn}}' at '{{$dfrn_url}}' has accepted
+your connection request at '{{$sitename}}'.
-Gå in på din sida 'Kontakter' på $sitename om du vill göra några
-ändringar när det gäller denna kontakt.
+You are now mutual friends and may exchange status updates, photos, and email
+without restriction.
-$siteurl
+Please visit your 'Connnections' page at {{$sitename}} if you wish to make
+any changes to this relationship.
-[Du kan exempelvis skapa en separat profil med information som inte
-är tillgänglig för vem som helst, och ge visningsrättigheter till '$fn'].
+{{$siteurl}}
-Hälsningar,
-$sitename admin
+[For instance, you may create a separate profile with information that is not
+available to the general public - and assign viewing rights to '{{$fn}}'].
+
+Sincerely,
+
+ {{$sitename}} Administrator
+
+
diff --git a/view/sv/htconfig.tpl b/view/sv/htconfig.tpl
new file mode 100644
index 000000000..493cb5d00
--- /dev/null
+++ b/view/sv/htconfig.tpl
@@ -0,0 +1,70 @@
+<?php
+
+// Set the following for your MySQL installation
+// Copy or rename this file to .htconfig.php
+
+$db_host = '{{$dbhost}}';
+$db_port = '{{$dbport}}';
+$db_user = '{{$dbuser}}';
+$db_pass = '{{$dbpass}}';
+$db_data = '{{$dbdata}}';
+
+/*
+ * Notice: Many of the following settings will be available in the admin panel
+ * after a successful site install. Once they are set in the admin panel, they
+ * are stored in the DB - and the DB setting will over-ride any corresponding
+ * setting in this file
+ *
+ * The command-line tool util/config is able to query and set the DB items
+ * directly if for some reason the admin panel is not available and a system
+ * setting requires modification.
+ *
+ */
+
+
+// Choose a legal default timezone. If you are unsure, use "America/Los_Angeles".
+// It can be changed later and only applies to timestamps for anonymous viewers.
+
+$default_timezone = '{{$timezone}}';
+
+// What is your site name?
+
+$a->config['system']['baseurl'] = '{{$siteurl}}';
+$a->config['system']['sitename'] = "Red Matrix";
+$a->config['system']['location_hash'] = '{{$site_id}}';
+
+// Your choices are REGISTER_OPEN, REGISTER_APPROVE, or REGISTER_CLOSED.
+// Be certain to create your own personal account before setting
+// REGISTER_CLOSED. 'register_text' (if set) will be displayed prominently on
+// the registration page. REGISTER_APPROVE requires you set 'admin_email'
+// to the email address of an already registered person who can authorise
+// and/or approve/deny the request.
+
+$a->config['system']['register_policy'] = REGISTER_OPEN;
+$a->config['system']['register_text'] = '';
+$a->config['system']['admin_email'] = '{{$adminmail}}';
+
+// Maximum size of an imported message, 0 is unlimited
+
+$a->config['system']['max_import_size'] = 200000;
+
+// maximum size of uploaded photos
+
+$a->config['system']['maximagesize'] = 800000;
+
+// Location of PHP command line processor
+
+$a->config['system']['php_path'] = '{{$phpath}}';
+
+// Configure how we communicate with directory servers.
+// DIRECTORY_MODE_NORMAL = directory client, we will find a directory
+// DIRECTORY_MODE_SECONDARY = caching directory or mirror
+// DIRECTORY_MODE_PRIMARY = main directory server
+// DIRECTORY_MODE_STANDALONE = "off the grid" or private directory services
+
+$a->config['system']['directory_mode'] = DIRECTORY_MODE_NORMAL;
+
+// default system theme
+
+$a->config['system']['theme'] = 'redbasic';
+
diff --git a/view/sv/intro_complete_eml.tpl b/view/sv/intro_complete_eml.tpl
index 1f24af25f..2c2428d68 100644
--- a/view/sv/intro_complete_eml.tpl
+++ b/view/sv/intro_complete_eml.tpl
@@ -1,19 +1,22 @@
-$username,
-'$fn' på '$dfrn_url' har accepterat din kontaktförfrågan på '$sitename'.
+Dear {{$username}},
-'$fn' har valt att acceptera dig som ett "fan" vilket innebär vissa begränsningar
-i kommunikationen mellan er - som till exempel personliga meddelanden och viss interaktion
-mellan profiler. Om detta är en kändis eller en gemenskap så har dessa inställningar gjorts
-per automatik.
+ '{{$fn}}' at '{{$dfrn_url}}' has accepted
+your connection request at '{{$sitename}}'.
-'$fn' kan välja att utöka detta till vanlig tvåvägskommunikation eller någon annan mer
-tillåtande kommunikationsform i framtiden.
+ '{{$fn}}' has chosen to accept you a "fan", which restricts
+some forms of communication - such as private messaging and some profile
+interactions. If this is a celebrity or community page, these settings were
+applied automatically.
-Du kommer hädanefter att få statusuppdateringar från '$fn',
-vilka kommer att synas på din Nätverk-sida på
+ '{{$fn}}' may choose to extend this into a two-way or more permissive
+relationship in the future.
-$siteurl
+ You will start receiving public status updates from '{{$fn}}',
+which will appear on your 'Matrix' page at
-Hälsningar,
-$sitename admin
+{{$siteurl}}
+
+Sincerely,
+
+ {{$sitename}} Administrator
diff --git a/view/sv/lostpass_eml.tpl b/view/sv/lostpass_eml.tpl
index df338fa69..3b79d2791 100644
--- a/view/sv/lostpass_eml.tpl
+++ b/view/sv/lostpass_eml.tpl
@@ -1,29 +1,32 @@
-$username,
-En begäran om återställning av lösenord på $sitename har mottagits.
-Gå till adressen nedan för att bekräfta denna begäran. Du kan också
-klistra in länken i adressfältet i din webbläsare.
+Dear {{$username}},
+ A request was recently received at {{$sitename}} to reset your account
+password. In order to confirm this request, please select the verification link
+below or paste it into your web browser address bar.
-Gå INTE till länken nedan om du INTE har begärt lösenordsåterställning.
-Då kan du ignorera det här meddelandet.
+If you did NOT request this change, please DO NOT follow the link
+provided and ignore and/or delete this email.
-Ditt lösenord kommer inte att återställas om vi inte kan säkerställa att du
-initierat detta.
+Your password will not be changed unless we can verify that you
+issued this request.
-Med den här länken kan du bekräfta din identitet:
+Follow this link to verify your identity:
-$reset_link
+{{$reset_link}}
-Sedan kommer du att få ett meddelande med ett nytt lösenord.
+You will then receive a follow-up message containing the new password.
-Lösenordet kan sedan ändras i dina inställningar efter att du loggat in.
+You may change that password from your account settings page after logging in.
-Detaljerna ser ut så här:
+The login details are as follows:
-Webbplats: $siteurl
-Inloggningsnamn: $email
+Site Location: {{$siteurl}}
+Login Name: {{$email}}
-Hälsningar,
-$sitename admin
- \ No newline at end of file
+
+
+Sincerely,
+ {{$sitename}} Administrator
+
+
diff --git a/view/sv/passchanged_eml.tpl b/view/sv/passchanged_eml.tpl
index 590462468..0d94be3c2 100644
--- a/view/sv/passchanged_eml.tpl
+++ b/view/sv/passchanged_eml.tpl
@@ -1,18 +1,20 @@
-$username,
+Dear {{$username}},
+ Your password has been changed as requested. Please retain this
+information for your records (or change your password immediately to
+something that you will remember).
-Lösenordet har ändrats enligt din begäran. Behåll den här
-informationen om den skulle behövas i framtiden. (eller ändra lösenord
-på en gång till något som du kommer ihåg).
+Your login details are as follows:
-Här är dina inloggningsuppgifter:
+Site Location: {{$siteurl}}
+Login Name: {{$email}}
+Password: {{$new_password}}
-Webbplats: $siteurl
-Användarnamn: $email
-Lösenord: $new_password
+You may change that password from your account settings page after logging in.
-När du loggat in kan du byta lösenord bland inställningarna.
-Hälsningar,
-$sitename admin
+Sincerely,
+ {{$sitename}} Administrator
+
+
diff --git a/view/sv/register_open_eml.tpl b/view/sv/register_open_eml.tpl
index 1471c9b98..4b397201c 100644
--- a/view/sv/register_open_eml.tpl
+++ b/view/sv/register_open_eml.tpl
@@ -1,17 +1,19 @@
-$username,
-Tack för att du registrerat dig på $sitename. Kontot har skapats.
-Här är dina inloggningsuppgifter:
-Webbplats: $siteurl
-Användarnamn: $email
-Lösenord: $password
+An account has been created at {{$sitename}} for this email address.
+The login details are as follows:
-Lösenordet kan ändras på sidan Inställningar efter att du loggat in.
+Site Location: {{$siteurl}}
+Login: {{$email}}
+Password: (the password which was provided during registration)
-Ägna en liten stund åt att gå igenom alla kontoinställningar där.
+If this account was created without your knowledge and is not desired, you may
+visit this site and reset the password. This will allow you to remove the
+account from the links on the Settings page, and we
+apologise for any inconvenience.
-Välkommen till $sitename.
+Thank you and welcome to {{$sitename}}.
-Hälsningar,
-$sitename admin
+Sincerely,
+ {{$sitename}} Administrator
+
diff --git a/view/sv/register_verify_eml.tpl b/view/sv/register_verify_eml.tpl
index aa72bc9aa..85d9a12d3 100644
--- a/view/sv/register_verify_eml.tpl
+++ b/view/sv/register_verify_eml.tpl
@@ -1,17 +1,25 @@
-En registreringsförfrågan som kräver svar har mottagits
-på $sitename
+A new user registration request was received at {{$sitename}} which requires
+your approval.
-Här är inloggningsuppgifterna:
-Fullständigt namn: $username
-Webbplats: $siteurl
-Användarnamn: $email
+The login details are as follows:
+Site Location: {{$siteurl}}
+Login Name: {{$email}}
+IP Address: {{$details}}
-Gå till denna adress om du vill godkänna:
-$siteurl/regmod/allow/$hash
+To approve this request please visit the following link:
-Gå till denna adress om du vill avslå förfrågan och ta bort kontot:
-$siteurl/regmod/deny/$hash
+
+{{$siteurl}}/regmod/allow/{{$hash}}
+
+
+To deny the request and remove the account, please visit:
+
+
+{{$siteurl}}/regmod/deny/{{$hash}}
+
+
+Thank you.
diff --git a/view/sv/request_notify_eml.tpl b/view/sv/request_notify_eml.tpl
index 893bce17c..d01b8ff27 100644
--- a/view/sv/request_notify_eml.tpl
+++ b/view/sv/request_notify_eml.tpl
@@ -1,13 +1,17 @@
-$myname,
-Du har just fått en kontaktförfrågan på $sitename från '$requestor'
+Dear {{$myname}},
-Profilen finns på $url.
+You have just received a connection request at {{$sitename}}
-Logga in för att se hela förfrågan och godkänna eller
-avslå den.
+from '{{$requestor}}'.
-$siteurl
+You may visit their profile at {{$url}}.
-Hälsningar,
-$sitename admin
+Please login to your site to view the complete introduction
+and approve or ignore/cancel the request.
+
+{{$siteurl}}
+
+Regards,
+
+ {{$sitename}} administrator
diff --git a/view/sv/update_fail_eml.tpl b/view/sv/update_fail_eml.tpl
new file mode 100644
index 000000000..a7df8fc2f
--- /dev/null
+++ b/view/sv/update_fail_eml.tpl
@@ -0,0 +1,13 @@
+Hey,
+I'm the web server at {{$sitename}};
+
+The Red Matrix developers released update {{$update}} recently,
+but when I tried to install it, something went terribly wrong.
+This needs to be fixed soon and it requires human intervention.
+Please contact a Red developer if you can not figure out how to
+fix it on your own. My database might be invalid.
+
+The error message is '{{$error}}'.
+
+Apologies for the inconvenience,
+ your web server at {{$siteurl}} \ No newline at end of file
diff --git a/view/theme/fancyred/css/style.css b/view/theme/fancyred/css/style.css
deleted file mode 100644
index 8cc2d12e6..000000000
--- a/view/theme/fancyred/css/style.css
+++ /dev/null
@@ -1,3934 +0,0 @@
-/**
- * duepuntozero Frindika style
- * Fabio Comuni <fabrix.xm@gmail.com>
- */
-
-
-/* generals */
-body {
- font-family: helvetica,arial,freesans,clean,sans-serif;
- font-size: 12px;
- background-color: #ffffff;
- background-repeat: repeat;
- color: #000000;
- margin: 0px;
-}
-
-abbr {
- border-bottom: none;
-}
-
-aside {
-border: none;
-border-radius: 0px 0px 20px 0px;
-width: 160px;
-color: #d00;
-background: #fff;
-}
-
-
-/* icons */
-.icon {
- background-color: transparent ;
- background-repeat: no-repeat;
- display: block;
- overflow: hidden;
- text-indent: -9999px;
-/* min-width: 22px;
- height: 22px; */
-}
-.icon.text {
- text-indent: 0px;
-}
-.icon.notify {
- background-image: url("../img/notify_on.png");
- min-width: 22px;
- height: 22px;
- margin-top: -4px;
- background-position: left center;
- padding: 1px;
-}
-.icon.gear {
- background-image: url("../img/settings.png");
- min-width: 22px;
- height: 22px;
- background-position: left center;
- padding: 1px;
-}
-
-.icon.home {
- background-image: url("../img/home.png");
- min-width: 22px;
- height: 22px;
- background-position: left center;
- padding: 1px;
-}
-
-.icon.network {
- background-image: url("../img/network.png");
- min-width: 22px;
- height: 22px;
- background-position: left center;
- padding: 1px;
-}
-
-.icon.introductions {
- background-image: url("../img/introductions.png");
- min-width: 22px;
- height: 22px;
- background-position: left center;
- padding: 1px;
-}
-
-.icon.mail {
- background-image: url("../img/message.png");
- min-width: 22px;
- height: 22px;
- background-position: left center;
- padding: 1px;
-}
-
-.icon.events {
- background-image: url("../img/events.png");
- min-width: 22px;
- height: 22px;
- background-position: left center;
- padding: 1px;
-}
-
-a, a:visited, a:link { color: #dd0000; text-decoration: none; }
-a:hover { color: #dd0000; text-decoration: underline; }
-
-input {
- border: 1px solid #666666;
- -moz-border-radius: 5px;
- border-radius: 5px;
- padding: 3px;
-}
-
-img { border :0px; }
-
-
-
-
-code {
- font-family: Courier, monospace;
- display: block;
- overflow: auto;
- border: 1px solid #444;
- background: #EEE;
- color: #444;
- padding: 10px;
- margin-top: 20px;
- max-width: 80%;
- box-shadow: 5px 5px 5px #111;
- border-radius: 5px;
-}
-
-blockquote {
- background-color: #f4f8f9;
- border-left: 4px solid #dae4ee;
- padding: 0.4em;
-}
-
-.icollapse-wrapper, .ccollapse-wrapper {
- border: 1px solid #CCC;
- padding: 5px;
-}
-
-.hide-comments {
- margin-left: 5px;
-}
-
-#panel {
- background-color: ivory;
- position: absolute;
- z-index: 2;
- width: 30%;
- padding: 25px;
- border: 1px solid #444;
-}
-
-.heart {
- color: #FF0000;
- font-size: 100%;
- margin-right: 5px;
-}
-
-
-
-/* nav */
-nav {
- display: block;
-/* margin: 0px 10%; */
- border-bottom: 1px solid #d00;
-}
-nav #site-location {
- color: #888a85;
- font-size: 0.8em;
- position: absolute;
- border-radius: 1px solid #d00;
-}
-
-.error-message {
- color: #FF0000;
- font-size: 1.1em;
- border: 1px solid #FF8888;
- background-color: #FFEEEE;
- padding: 10px;
-}
-
-.info-message {
- color: #fff;
- font-size: 1.1em;
- background-color: #f00;
- padding: 10px;
-}
-
-
-nav #banner #logo-text a {
- font-size: 40px;
- font-weight: bold;
- margin-left: 3px;
- color: #000000;
-
-}
-nav #banner #logo-text a:hover { text-decoration: none; }
-
-header #site-location {
- display: none;
-}
-header #banner {
- overflow: hidden;
- text-align: center;
- width: 100%;
- font-size: 2.2em;
- font-family: tahoma, "Lucida Sans", sans;
- color: #eec;
- font-weight: bold;
-
-}
-header #banner a,
-header #banner a:active,
-header #banner a:visited,
-header #banner a:link,
-header #banner a:hover {
- color: #eec;
- text-decoration: none;
- outline: none;
- vertical-align: bottom;
-}
-header #banner #logo-img {
- height: 22px;
- margin-top: 5px;
-}
-header #banner #logo-text {
- font-size: 22px;
-}
-
-
-
-
-.nav-commlink, .nav-login-link {
- display: block;
- height: 15px;
- margin-top: 67px;
- margin-right: 2px;
- //padding: 6px 10px;
- padding: 6px 3px;
- float: left;
- bottom: 140px;
- border: 1px solid #babdb6;
- border-bottom: 0px;
- background-color: #aec0d3;
- color: #565854;
- -moz-border-radius: 5px 5px 0px 0px;
- border-radius: 5px 5px 0px 0px;
-}
-nav .nav-link {
- float: right;
- margin: 0.2em 0em;
- padding: 0em 0.5em;
- background-color: transparent !important;
-}
-
-.nav-commlink.selected {
- background-color: #ffffff;
- border-bottom: 1px solid #ffffff;
- color: #000000 !important;
- margin-top: 64px;
- padding-top: 6px;
- padding-bottom: 8px;
-}
-.nav-ajax-left {
- font-size: 0.8em;
- float: left;
- margin-top: 62px;
-}
-
-
-nav #nav-link-wrapper .nav-link {
- border-right: 1px solid #babdb6;
-}
-
-
-
-#dfrn-request-link {
- display: block;
- color: #FFFFFF;
- -webkit-border-radius: 5px ;
- -moz-border-radius: 5px;
- border-radius: 5px;
- padding: 5px;
- font-weight: bold;
- background: #3465a4 url('../img/friendika-16.png') no-repeat 95% center;
-}
-#wallmessage-link {
- display: block;
- color: #FFFFFF;
- -webkit-border-radius: 5px ;
- -moz-border-radius: 5px;
- border-radius: 5px;
- padding: 5px;
- font-weight: bold;
- background-color: #3465a4;
-}
-.tabs {
- list-style: none;
- margin: 15px 0px;
- padding: 0;
- }
-.tabs li {
- display: inline;
- font-weight: bold;
-}
-.tab {
- height: auto;
- background-color: #f00;
- color: #fff !important;
- font-weight: bold;
- -webkit-border-radius: 5px;
- -moz-border-radius: 5px;
- border-radius: 20px;
- margin: 0;
- width: auto;
- box-shadow: 5px 5px 5px #444;
- margin-left: 8px;
- padding: 4px;
- text-align: center;
-}
-.tab:hover, .tab.active:hover {
- background: #d00;
- color: #fff;
- ;
-}
-.tab:active {
- background: #fff;
- color: #f00;
-}
-.tab.active {
- background: #f00;
- color: #fff;
- box-shadow: 3px 3px 3px #333 inset;
- padding: 5px; /* another strageness of the human mind - has to be larger than inactive tabs, or it looks smaller than them */
-}
-
-.tab a, .settings-widget a {
- border: 0;
- text-decoration: none;
- color: #fff;
-}
-
-/* footer */
-footer {
- text-align: right;
- padding-bottom: 1em;
- padding-right: 3em;
-}
-
-#powered-by {
- position: fixed;
- bottom: 1px;
- left: 15px;
- opacity: 0.3;
- filter:alpha(opacity=30);
-
-}
-
-.birthday-today, .event-today {
- font-weight: bold;
-}
-
-div.wall-item-content-wrapper.shiny {
- opacity: 1;
-}
-
-.preview {
- background: #FFFFC8;
-}
-
-#theme-preview {
- margin: 15px 0 15px 150px;
-}
-
-/* from default */
-#jot-perms-icon,
-#profile-location,
-#profile-nolocation,
-#profile-youtube,
-#profile-video,
-#profile-audio,
-#profile-link,
-#profile-title,
-#wall-image-upload,
-#wall-file-upload,
-#profile-upload-wrapper,
-#wall-image-upload-div,
-#wall-file-upload-div,
-.hover, .focus {
- cursor: pointer;
-}
-
-#jot-perms-icon {
- float: left;
-}
-
-#jot-title, #jot-category {
- border: 0px;
- margin: 0px;
- padding: 8px;
- height: 20px;
- width: 530px;
- margin-bottom: 5px;
- font-weight: bold;
- border: solid 1px #ccc;
- box-shadow: 5px 5px 5px #666 inset;
-}
-
-#jot-title::-webkit-input-placeholder{font-weight: normal;}
-#jot-category::-webkit-input-placeholder{font-weight: normal;}
-#jot-title:-moz-placeholder{font-weight: normal;}
-#jot-category:-moz-placeholder{font-weight: normal;}
-
-
-#jot-title:hover,
-#jot-title:focus,
-#jot-category:hover,
-#jot-category:focus {
- border: 1px solid #cccccc;
-}
-
-.jothidden { display:none; }
-
-
-.fakelink, .fakelink:visited, .fakelink:link {
- color: #335577;
- text-decoration: none;
- cursor: pointer;
-}
-.fakebutton {
- margin-top: 15px;
- margin-bottom: 15px;
-}
-
-.lockview {
- cursor: pointer;
-}
-
-
-#group-sidebar {
- margin-bottom: 10px;
-}
-
-.group-selected, .nets-selected, .fileas-selected, .categories-selected {
- padding: 3px;
- -moz-border-radius: 5px;
- border-radius: 5px;
- border: 1px solid #CCCCCC;
- background: #F8F8F8;
- font-weight: bold;
-}
-
-.settings-widget .selected {
- padding: 3px;
- -moz-border-radius: 5px;
- border-radius: 5px;
- font-weight: bold;
- color: #FFD700;
-}
-
-.fakelink:hover {
- color: #5588aa;
- text-decoration: underline;
- cursor: pointer;
-}
-.smalltext {
- font-size: 0.7em;
-}
-#sysmsg {
- /*width: 600px;*/
- margin-bottom: 10px;
-}
-
-#register-fill-ext {
- margin-bottom: 25px;
-}
-
-#label-register-name, #label-register-nickname, #label-register-openid {
- float: left;
- width: 350px;
- margin-top: 10px;
-}
-
-#register-name, #register-nickname {
- float: left;
- margin-top: 10px;
- width: 150px;
-}
-
-#register-openid {
- float: left;
- margin-top: 10px;
- width: 130px;
-}
-
-#register-name-end, #register-email-end, #register-nickname-end, #register-submit-end, #register-openid-end {
- clear: both;
-}
-
-#register-nickname-desc {
- margin-top: 30px;
- width: 650px;
-}
-#register-sitename {
- float: left;
- margin-top: 10px;
-}
-
-#register-submit-button {
- margin-top: 10px;
-}
-
-#main-login {
- margin-left: 100px;
- margin-top: 50px;
-}
-
-#main-login #id_username, #main-login #id_password {
- width: 200px;
- padding: 10px;
- float: left;
-}
-
-#main-login .field_end {
- clear: both;
-}
-
-#main-login .field.input label, #main-login .field.password label {
- float: left;
- width: 100px;
-}
-
-#login_standard {
- width: 350px;
- float: left;
-}
-
-
-#login_standard input,
-#login_openid input {
- width: 180px;
-}
-
-#login-extra-links {
- clear: both;
-}
-
-#register-link, #lost-password-link {
- float: left;
- font-size: 90%;
- margin-left: 100px;
-}
-
-#login-standard-end {
- clear: both;
-}
-
-#login-submit-button {
-
- margin-left: 100px;
- margin-top: 10px;
-/* margin-left: 200px; */
-}
-
-
-input#dfrn-url {
- float: left;
- background: url(../img/friendika-16.png) no-repeat;
- background-position: 2px center;
- font-size: 17px;
- padding-left: 21px;
- height: 21px;
- background-color: #FFFFFF;
- color: #000000;
- margin-bottom: 20px;
-}
-
-#dfrn-url-label {
- float: left;
- width: 250px;
-}
-
-#dfrn-request-url-end {
- clear: both;
-}
-
-#knowyouyes, #knowyouno {
- float: left;
-}
-
-#dfrn-request-knowyou-yes-wrapper, #dfrn-request-knowyou-no-wrapper {
-
- float: none;
-}
-#dfrn-request-knowyou-yes-label, #dfrn-request-knowyou-no-label {
- float: left;
- width: 75px;
- margin-left: 50px;
- margin-bottom: 7px;
-}
-#dfrn-request-knowyou-break, #dfrn-request-knowyou-end {
- clear: both;
-
-}
-
-#dfrn-request-message-wrapper {
- margin-bottom: 50px;
-}
-#dfrn-request-submit-wrapper {
- clear: both;
- margin-left: 50px;
-}
-
-#dfrn-request-info-wrapper {
- margin-left: 50px;
-}
-
-
-
-#cropimage-wrapper, #cropimage-preview-wrapper {
- float: left;
- padding: 30px;
-}
-
-#crop-image-form {
- margin-top: 30px;
- clear: both;
-}
-
-.intro-wrapper {
- margin-top: 20px;
-}
-
-.intro-fullname {
- font-size: 1.1em;
- font-weight: bold;
-
-}
-.intro-desc {
- margin-bottom: 20px;
- font-weight: bold;
-}
-
-.intro-note {
- padding: 10px;
-}
-
-.intro-end {
- padding: 30px;
-}
-
-.intro-form {
- float: left;
-}
-.intro-approve-form {
- clear: both;
-}
-.intro-approve-as-friend-end {
- clear: both;
-}
-.intro-submit-approve, .intro-submit-ignore {
- margin-right: 20px;
-}
-.intro-submit-approve {
- margin-top: 15px;
-}
-
-.intro-approve-as-friend-label, .intro-approve-as-fan-label {
- float: left;
- width: 100px;
- margin-left: 20px;
-}
-.intro-approve-as-friend, .intro-approve-as-fan {
- float: left;
-}
-.intro-form-end {
- clear: both;
-}
-.intro-approve-as-friend-desc {
- margin-top: 15px;
-}
-.intro-approve-as-end {
- clear: both;
- margin-bottom: 10px;
-}
-
-.intro-end {
- clear: both;
- margin-bottom: 30px;
-}
-.aprofile dt {
- font-weight: bold;
-}
-#page-profile .title {
- font-weight: bold;
-}
-#profile-vcard-break {
- clear: both;
-}
-#profile-extra-links {
- clear: both;
- margin-top: 10px;
-}
-
-#profile-extra-links ul {
- list-style-type: none;
- padding: 0px;
-}
-
-
-#profile-extra-links li {
- margin-top: 5px;
-}
-
-#profile-edit-links ul {
- list-style-type: none;
-}
-
-#profile-edit-links li {
- margin-top: 10px;
-}
-.profile-edit-side-div {
- float: right;
-}
-.profile-edit-side-link {
- opacity: 0.3;
- filter:alpha(opacity=30);
- float: right;
-}
-.profile-edit-side-link:hover {
- opacity: 1.0;
- filter:alpha(opacity=100);
-}
-
-.view-contact-wrapper {
- margin-top: 20px;
- float: left;
- margin-left: 20px;
- width: 180px;
-}
-
-.contact-wrapper {
- float: left;
- width: 150px;
- height: 150px;
- overflow: auto;
-}
-
-#view-contact-end {
- clear: both;
-}
-
-
-#viewconnections {
- margin-top: 15px;
-}
-#profile-edit-default-desc {
- color: #FF0000;
- border: 1px solid #FF8888;
- background-color: #FFEEEE;
- padding: 7px;
-}
-
-#profile-edit-clone-link-wrapper {
- float: left;
- margin-left: 50px;
- margin-bottom: 20px;
- width: 300px;
-}
-
-
-#profile-edit-links-end {
- clear: both;
- margin-bottom: 15px;
-}
-
-.profile-listing-photo {
- border: none;
-}
-
-.profile-edit-submit-wrapper {
- margin-top: 20px;
- margin-bottom: 20px;
-}
-
-#profile-photo-link-select-wrapper {
- margin-top: 2em;
-}
-
-#profile-photo-submit-wrapper {
- margin-top: 10px;
-}
-
-#profile-photo-wrapper img {
- width:120px;
- height:120px;
- padding: 12px;
-}
-
-#profile-edit-profile-name-label,
-#profile-edit-name-label,
-#profile-edit-pdesc-label,
-#profile-edit-gender-label,
-#profile-edit-dob-label,
-#profile-edit-address-label,
-#profile-edit-locality-label,
-#profile-edit-region-label,
-#profile-edit-postal-code-label,
-#profile-edit-country-name-label,
-#profile-edit-marital-label,
-#profile-edit-sexual-label,
-#profile-edit-politic-label,
-#profile-edit-religion-label,
-#profile-edit-pubkeywords-label,
-#profile-edit-prvkeywords-label,
-#profile-edit-homepage-label,
-#profile-edit-hometown-label {
- float: left;
- width: 175px;
-}
-
-#profile-edit-profile-name,
-#profile-edit-name,
-#profile-edit-pdesc,
-#gender-select,
-#profile-edit-dob,
-#profile-edit-address,
-#profile-edit-locality,
-#profile-edit-region,
-#profile-edit-postal-code,
-#profile-edit-country-name,
-#marital-select,
-#sexual-select,
-#profile-edit-politic,
-#profile-edit-religion,
-#profile-edit-pubkeywords,
-#profile-edit-prvkeywords,
-#profile-in-dir-yes,
-#profile-in-dir-no,
-#profile-in-netdir-yes,
-#profile-in-netdir-no,
-#hide-wall-yes,
-#hide-wall-no,
-#hide-friends-yes,
-#hide-friends-no {
- float: left;
- margin-bottom: 20px;
-}
-#settings-normal,
-#settings-soapbox,
-#settings-freelove,
-#settings-community {
- float: left;
-}
-#settings-notifications label {
- margin-left: 20px;
-}
-#settings-notify-desc, #settings-activity-desc {
- font-weight: bold;
- margin-bottom: 15px;
-}
-#settings-pagetype-desc {
- color: #666666;
- margin-bottom: 15px;
-}
-
-#profile-in-dir-yes-label,
-#profile-in-dir-no-label,
-#profile-in-netdir-yes-label,
-#profile-in-netdir-no-label,
-#hide-wall-yes-label,
-#hide-wall-no-label,
-#hide-friends-yes-label,
-#hide-friends-no-label {
- margin-left: 125px;
- float: left;
- width: 50px;
-}
-
-#profile-edit-with-label {
- width: 175px;
- margin-left: 20px;
-}
-
-#profile-publish-yes-reg,
-#profile-publish-no-reg {
- float: left;
- margin-bottom: 10px;
-}
-
-#profile-publish-yes-label-reg,
-#profile-publish-no-label-reg {
- margin-left: 350px;
- float: left;
- width: 50px;
-}
-
-#profile-publish-break-reg,
-#profile-publish-end-reg {
- clear: both;
-}
-
-
-#profile-edit-pdesc-desc,
-#profile-edit-pubkeywords-desc,
-#profile-edit-prvkeywords-desc {
- float: left;
- margin-left: 20px;
-}
-
-
-#profile-edit-homepage, #profile-edit-hometown {
- float: left;
- margin-bottom: 35px;
-}
-#settings-normal-label,
-#settings-soapbox-label,
-#settings-community-label,
-#settings-freelove-label {
- float: left;
- width: 200px;
-}
-#settings-normal-desc,
-#settings-soapbox-desc,
-#settings-community-desc,
-#settings-freelove-desc {
- /*float: left;
- margin-left: 75px;*/
- clear: left;
- color: #666666;
- display: block;
- margin-bottom: 20px
-}
-
-#profile-edit-profile-name-end,
-#profile-edit-name-end,
-#profile-edit-pdesc-end,
-#profile-edit-gender-end,
-#profile-edit-dob-end,
-#profile-edit-address-end,
-#profile-edit-locality-end,
-#profile-edit-region-end,
-#profile-edit-postal-code-end,
-#profile-edit-country-name-end,
-#profile-edit-marital-end,
-#profile-edit-sexual-end,
-#profile-edit-politic-end,
-#profile-edit-religion-end,
-#profile-edit-pubkeywords-end,
-#profile-edit-prvkeywords-end,
-#profile-edit-homepage-end,
-#profile-edit-hometown-end,
-#profile-in-dir-break,
-#profile-in-dir-end,
-#profile-in-netdir-break,
-#profile-in-netdir-end,
-#hide-wall-break,
-#hide-wall-end,
-#hide-friends-break,
-#hide-friends-end,
-#settings-normal-break,
-#settings-soapbox-break,
-#settings-community-break,
-#settings-freelove-break {
- clear: both;
-}
-
-.settings-widget ul {
- list-style-type: none;
- padding: 0px;
-}
-
-.settings-widget li {
- height: auto;
- background-color: #f00;
- color: #fff !important;
- font-weight: bold;
- -webkit-border-radius: 5px;
- -moz-border-radius: 5px;
- border-radius: 5px;
- margin-bottom: 12px;
- width: auto;
- box-shadow: 5px 5px 5px #444;
- margin-left: 8px;
- padding: 4px;
-}
-
-
-#gender-select, #marital-select, #sexual-select {
- width: 220px;
-}
-
-#profile-edit-profile-name-wrapper .required {
- color: #FF0000;
- float: left;
-}
-
-#contacts-main {
- margin-top: 20px;
- margin-bottom: 20px;
-}
-
-.contact-entry-wrapper {
- float: left;
- width: 120px;
- height: 120px;
-}
-#contacts-search-end {
- margin-bottom: 10px;
-}
-
-.contact-entry-direction-icon {
- margin-top: 24px;
- margin-right: 2px;
-}
-
-.contact-entry-photo img {
- border: none;
-}
-.contact-entry-photo-end {
- clear: both;
-}
-.contact-entry-name {
- float: left;
- margin-left: 0px;
- margin-right: 10px;
- width: 120px;
- overflow: hidden;
-}
-.contact-entry-edit-links {
- margin-top: 6px;
- margin-left: 10px;
- width: 16px;
-}
-.contact-entry-nav-wrapper {
- float: left;
- margin-left: 10px;
-}
-
-.contact-entry-edit-links img {
- border: none;
- margin-right: 15px;
-}
-.contact-entry-photo {
- float: left;
- position: relative;
-}
-.contact-entry-end {
- clear: both;
-}
-
-#fsuggest-desc, #fsuggest-submit-wrapper {
- margin-top: 15px;
- margin-bottom: 15px;
-}
-
-#network-star-link{
- margin-top: 10px;
-}
-.network-star {
- float: left;
- margin-right: 5px;
-}
-#network-bmark-link {
- margin-top: 10px;
-}
-.thread-wrapper .wall-item-comment-wrapper {
- margin-left: 50px;
-}
-
-/* Give the top level post bigger shadows than the comments. This makes them appear "higher" and the comments "lower", which separates posts from each other reasonably without literally drawing a line under it */
-
-.wall-item-content-wrapper {
- position: relative;
- background: #fff;
- border-radius: 10px;
- box-shadow: 8px 8px 8px #000;
- border: 1px solid #eec;
- opacity: 0.8;
-}
-
-.wall-item-content-wrapper:hover {
- opacity: 1;
-}
-.thread-wrapper .thread-wrapper {
- margin-left: 50px;
-}
-
-.thread-end-wrapper {
- margin-left: 50px;
-}
-
-
-/* This shadow isn't quite right - not sure if it's colour or size */
-
-.wall-item-content-wrapper.comment {
- background: #fff;
- border-left: 1px solid #e0e0e0;
- margin-left: 50px;
- margin-top: 15px;
- box-shadow: 5px 5px 5px #222;
-
-}
-
-.wall-item-like.comment, .wall-item-dislike.comment {
- margin-left: 50px;
-}
-
-.wall-item-info {
- display: block;
- float: left;
- width:110px;
- margin-right:10px;
-}
-.comment .wall-item-info {
- width: 70px;
-}
-
-.wall-item-photo-wrapper {
- margin-top: 10px;
- margin-left: 10px;
- margin-bottom: 10px;
- width: 100px;
-}
-.wall-item-photo-menu-button {
- display: block;
- position: absolute;
- background-image: url("../img/photo-menu.jpg");
- background-position: top left;
- background-repeat: no-repeat;
- margin: 0px; padding: 0px;
- width: 16px;
- height: 16px;
- top: 74px; left:10px;
- overflow: hidden;
- text-indent: 40px;
- display: none;
-
-}
-.wall-item-photo-menu {
- width: auto;
- border: 2px solid #444444;
- background: #FFFFFF;
- position: absolute;
- left: 10px; top: 90px;
- display: none;
- z-index: 10000;
-}
-.wall-item-photo-menu ul { margin:0px; padding: 0px; list-style: none }
-.wall-item-photo-menu li a { display: block; padding: 2px; }
-.wall-item-photo-menu li a:hover { color: #FFFFFF; background: #3465A4; text-decoration: none; }
-
-
-.comment .wall-item-photo-menu-button { top: 44px;}
-.comment .wall-item-photo-menu { top: 60px; }
-
-.wallwall .wwto {
- left: 50px;
- margin: 0;
- position: absolute;
- top: 70px;
- width: 30px
-}
-.wallwall .wwto img {
- width: 30px !important;
- height: 30px !important;
-}
-
-.wallwall .wall-item-photo-end {
- clear: both;
-}
-
-.wall-item-arrowphoto-wrapper {
- position: absolute;
- left: 75px;
- top: 70px;
- z-index: 100;
-}
-.wall-item-wrapper {
- /*float: left;
- margin-right: 5px;
- width: 250px;*/
- margin-left:10px;
-}
-.wall-item-lock {
- /*height: 20px;*/
- /*margin-top: 10px;*/
- left: 105px;
- position: absolute;
- top: 1px;
-}
-.comment .wall-item-lock {
- left: 65px;
-}
-
-.wall-item-ago {
- color: #888888;
- font-size: 0.8em;
-}
-
-.wall-item-location {
- overflow: hidden;
- /* add ellipsis on text overflow */
- /* this work on safari, opera, ie, chrome. */
- /* firefox users have to wait support or we */
- /* can use a jquery plugin http://bit.ly/zJskg */
- text-overflow: ellipsis;
- -o-text-overflow: ellipsis;
- width: 100%;
-}
-
-
-.item-tool {
- float: left;
- margin-right: 8px;
-}
-
-.like-rotator {
- margin-left: 5px;
-}
-
-.wall-item-delete-wrapper {
- float: right;
-}
-
-.wall-item-delete-end {
- clear: both;
-}
-
-.wall-item-delete-icon {
- border: none;
-}
-
-.wall-item-wrapper-end {
- clear: both;
-}
-.wall-item-name-link {
- font-weight: bold;
- text-decoration: none;
- color: #3172BD;
-}
-.wall-item-photo {
- border: none;
-}
-.comment .wall-item-photo {
- width: 50px !important;
- height: 50px !important;
-}
-.wall-item-content {
- margin-left: 10px;
- overflow: auto;
-}
-
-.wall-item-content img {
- max-height: 95% !important;
- max-width: 95% !important;
- box-shadow: 8px 8px 8px #666;
-}
-
-.wall-item-content img.smiley {
- box-shadow: none;
-}
-
-a.divgrow-showmore {
-bottom: 0pt;
-left: 0pt;
-cursor: pointer;
-/*TODO make this work in not-Firefox */
-background-image: -moz-linear-gradient(center top, #ccc 0%, #000 95%);
-height: 30px;
-text-shadow: 0pt 0pt 7px #000;
-background-color: transparent;
-border-radius: 0pt 0pt 3px 3px;
-border-bottom: 2px solid #ff0;
-color: #ff0;
-font-size: 0.8em;
-line-height: 48px;
-text-align: center;
-right: 0pt;
-position: absolute;
-/*Stop it blocking wall-item-tools*/
-margin-bottom: 24px;
-/*Make it work with non-shiny posts */
-opacity: 0.6;
-
-}
-
-.wall-item-title {
- float: left;
- font-weight: bold;
- /*width: 450px;*/
-}
-
-.wall-item-title-end {
- clear: both;
-}
-
-.thread-wrapper.toplevel_item {
-padding: 30px;
-width: 90%;
-}
-
-.wall-item-body {
-/* float: left; */
- /*width: 450px;*/
- margin: 10px 10px 30px;
-}
-
-.wall-item-tools {
- clear: both;
-/* background-image: url("../img/head.jpg"); */
- background-position: 0 -20px;
- background-repeat: repeat-x;
- background: #eee;
- padding: 2px;
- border-radius: 0px 0px 10px 10px;
- border: 1px #eec solid;
-}
-
-.wall-item-like, .wall-item-dislike {
- font-size: 0.8em;
- color: #878883;
- position: relative;
- bottom: 50px;
- margin-left: 120px;
- float:left;
- opacity: 0.6;
-}
-
-/*
-.wall-item-dislike {
- font-size: 0.8em;
- color: #878883;
- position: relative;
- bottom: 50px;
- margin-left: 120px;
-}
-
-*/
-.wall-item-like:hover, .wall-item-dislike:hover{
-opacity: 1;
-}
-
-.wall-item-author {
- margin-top: 10px;
-}
-
-.comment-edit-wrapper {
- margin-top: 15px;
- background: #ffffff;
- margin-left: 50px;
-}
-
-.comment-wwedit-wrapper {
-
-}
-
-.comment-edit-photo {
- margin-top: 10px;
- margin-left: 10px;
- margin-bottom: 10px;
- width: 100px;
- float: left;
-}
-.comment-wwedit-wrapper.threaded > .comment-edit-form > .comment-edit-photo {
- width: 40px;
-}
-
-.comment-edit-photo img {
- width: 25px;
-}
-.comment-edit-text-empty, .comment-edit-text-full {
- float: left;
- margin-top: 10px;
- padding: 3px 1px 1px 3px;
- border: 1px solid #ccc;
- padding: 8px;
- border-radius: 5px 5px 5px 5px;
- box-shadow: 5px 5px 5px #666 inset;
-}
-
-.comment-edit-text-empty {
-color: gray;
-height: 1.5em;
-width: 80%; /*Too wide? */
-overflow: auto;
-margin-bottom: 10px;
-}
-
-.comment-wwedit-wrapper.threaded > .comment-edit-form > .comment-edit-text-empty {
- height: 1.5em;
-}
-
-.comment-edit-text-full {
- color: black;
- height: 150px;
- width: 80%;
- overflow: auto;
-}
-
-
-.comment-edit-text-end {
- clear: both;
-}
-
-.comment-edit-submit {
- margin: 10px 0px 10px 110px;
-}
-
-.comment-wwedit-wrapper.threaded > .comment-edit-form > .comment-edit-submit-wrapper > .comment-edit-submit {
- margin-left: 50px;
-}
-
-#profile-jot-plugin-wrapper,
-#profile-jot-submit-wrapper {
- margin-top: 15px;
- width:90%;
-}
-
-#profile-jot-submit {
- float: left;
-}
-#profile-upload-wrapper {
- float: left;
- margin-left: 30px;
-}
-#profile-attach-wrapper {
- float: left;
- margin-left: 30px;
-}
-#profile-rotator {
- float: left;
- margin-left: 30px;
-}
-#profile-link-wrapper {
- float: left;
- margin-left: 15px;
-}
-#profile-youtube-wrapper {
- float: left;
- margin-left: 15px;
-}
-#profile-video-wrapper {
- float: left;
- margin-left: 15px;
-}
-#profile-audio-wrapper {
- float: left;
- margin-left: 15px;
-}
-#profile-location-wrapper {
- float: left;
- margin-left: 15px;
-}
-#jot-preview-link {
- float: left;
- margin-left: 45px;
- margin-top: 0px !important;
-}
-
-
-#profile-nolocation-wrapper {
- float: left;
- margin-left: 15px;
-}
-#profile-title-wrapper {
- float: left;
- margin-left: 15px;
-}
-
-#profile-jot-perms {
- float: right;
- margin-left: 100px;
- font-weight: bold;
- font-size: 1.2em;
- height: auto;
- width: auto;
- background-color: #dd0000;
- border-radius: 5px;
- border: 2px outset;
- box-shadow: 5px 5px 5px #666;
- margin-right: 8px;
- padding: 4px;
-}
-
-#profile-jot-perms:active {
- box-shadow: 0 0 0 0;
-}
-
-#profile-jot-perms-end {
- /*clear: left;*/
- height: 30px;
-}
-
-#profile-jot-plugin-end{
- clear: both;
-}
-.profile-jot-net {
- float: left;
- margin-right: 10px;
- margin-top: 5px;
- margin-bottom: 5px;
-}
-
-#profile-jot-networks-end {
- clear: both;
-}
-
-#profile-jot-end {
- /*clear: both;*/
- margin-bottom: 30px;
-}
-#about-jot-submit-wrapper {
- margin-top: 15px;
-}
-#about-jot-end {
- margin-bottom: 30px;
-}
-#contacts-main {
- margin-bottom: 30px;
-}
-
-#profile-listing-desc {
- margin-left: 30px;
-}
-
-#profile-listing-new-link-wrapper {
- margin-left: 30px;
- margin-bottom: 30px;
-}
-.profile-listing-photo-wrapper {
- float: left;
-}
-
-.profile-listing-edit-buttons-wrapper {
- clear: both;
-}
-.profile-listing-photo-edit-link {
- float: left;
- width: 125px;
-}
-.profile-listing-end {
- clear: both;
-}
-.profile-listing-edit-buttons-wrapper img{
- border: none;
- margin-right: 20px;
-}
-.profile-listing {
- margin-top: 25px;
-}
-.profile-listing-name {
- float: left;
- margin-left: 32px;
- margin-top: 10px;
- color: #3172BD;
- font-weight: bold;
- width: 200px;
-
-}
-.fortune {
- margin-top: 50px;
- color: #4444FF;
- font-weight: bold;
- margin-bottom: 20px;
-}
-
-
-.directory-end {
- clear: both;
-}
-.directory-name {
- text-align: center;
-}
-.directory-photo {
- margin-left: 25px;
-}
-.directory-details {
- font-size: 0.7em;
- text-align: center;
- margin-left: 5px;
- margin-right: 5px;
-}
-.directory-item {
- float: left;
- width: 225px;
- height: 260px;
- overflow: auto;
-}
-
-#directory-search-wrapper {
- margin-top: 20px;
- margin-right: 20px;
- margin-bottom: 50px;
-}
-
-#directory-search-end {
-}
-
-.directory-photo-img {
- border: none;
-}
-
-
-.pager {
- padding: 10px;
- text-align: center;
- font-size: 1.0em;
-}
-
-
-.pager_first,
-.pager_last,
-.pager_prev,
-.pager_next,
-.pager_n {
- border: 1px solid black;
- background: #EEE;
- padding: 4px;
-}
-
-.pager_first a,
-.pager_last a,
-.pager_prev a,
-.pager_next a,
-.pager_n a {
- text-decoration: none;
-}
-
-.pager_current {
- border: 1px solid black;
- background: #FFCCCC;
- padding: 4px;
-}
-
-
-#advanced-profile-name-wrapper,
-#advanced-profile-gender-wrapper,
-#advanced-profile-dob-wrapper,
-#advanced-profile-age-wrapper,
-#advanced-profile-marital-wrapper,
-#advanced-profile-sexual-wrapper,
-#advanced-profile-homepage-wrapper,
-#advanced-profile-politic-wrapper,
-#advanced-profile-religion-wrapper,
-#advanced-profile-about-wrapper,
-#advanced-profile-interest-wrapper,
-#advanced-profile-contact-wrapper,
-#advanced-profile-music-wrapper,
-#advanced-profile-book-wrapper,
-#advanced-profile-tv-wrapper,
-#advanced-profile-film-wrapper,
-#advanced-profile-romance-wrapper,
-#advanced-profile-work-wrapper,
-#advanced-profile-education-wrapper {
- margin-top: 20px;
-}
-
-#advanced-profile-name-text,
-#advanced-profile-gender-text,
-#advanced-profile-dob-text,
-#advanced-profile-age-text,
-#advanced-profile-marital-text,
-#advanced-profile-sexual-text,
-#advanced-profile-homepage-text,
-#advanced-profile-politic-text,
-#advanced-profile-religion-text,
-#advanced-profile-about-text,
-#advanced-profile-interest-text,
-#advanced-profile-contact-text,
-#advanced-profile-music-text,
-#advanced-profile-book-text,
-#advanced-profile-tv-text,
-#advanced-profile-film-text,
-#advanced-profile-romance-text,
-#advanced-profile-work-text,
-#advanced-profile-education-text {
- width: 300px;
- float: left;
-}
-
-#advanced-profile-name-end,
-#advanced-profile-gender-end,
-#advanced-profile-dob-end,
-#advanced-profile-age-end,
-#advanced-profile-marital-end,
-#advanced-profile-sexual-end,
-#advanced-profile-homepage-end,
-#advanced-profile-politic-end,
-#advanced-profile-religion-end {
- height: 10px;
-}
-
-#advanced-profile-about-end,
-#advanced-profile-interest-end,
-#advanced-profile-contact-end,
-#advanced-profile-music-end,
-#advanced-profile-book-end,
-#advanced-profile-tv-end,
-#advanced-profile-film-end,
-#advanced-profile-romance-end,
-#advanced-profile-work-end,
-#advanced-profile-education-end {
-
-
-}
-
-#advanced-profile-name,
-#advanced-profile-gender,
-#advanced-profile-dob,
-#advanced-profile-age,
-#advanced-profile-marital,
-#advanced-profile-sexual,
-#advanced-profile-homepage,
-#advanced-profile-politic,
-#advanced-profile-religion {
- float: left;
-
-}
-
-
-#advanced-profile-about,
-#advanced-profile-interest,
-#advanced-profile-contact,
-#advanced-profile-music,
-#advanced-profile-book,
-#advanced-profile-tv,
-#advanced-profile-film,
-#advanced-profile-romance,
-#advanced-profile-work,
-#advanced-profile-education {
- margin-top: 10px;
- margin-left: 50px;
- margin-right: 20px;
- padding: 10px;
- border: 1px solid #CCCCCC;
-}
-
-#advanced-profile-with {
- float: left;
- margin-left: 15px;
-}
-
-#contact-edit-wrapper {
- margin-top: 10px;
-}
-
-#contact-edit-banner-name {
- font-size: 1.4em;
- font-weight: bold;
-}
-
-#contact-edit-poll-wrapper {
- margin-top: 15px;
-}
-
-#contact-edit-poll-text {
- margin-top: 15px;
- margin-bottom: 5px;
-}
-
-#contact-edit-update-now {
- margin-top: 15px;
-}
-
-#contact-edit-links{
- clear: both;
-}
-
-#contact-edit-links ul {
- list-style: none;
- list-style-type: none;
- margin-left: 0px;
- padding-left: 0px;
-}
-
-#contact-edit-links li {
- margin-top: 5px;
-}
-
-#contact-edit-drop-link {
- float: right;
- margin-right: 20px;
-}
-
-#contact-edit-nav-end {
- clear: both;
-}
-
-#contact-edit-wrapper {
- width: 100%;
-}
-
-#contact-edit-end {
- clear: both;
- margin-top: 15px;
-}
-
-#contact-profile-selector {
- width: 175px;
- margin-left: 175px;
-}
-
-.contact-edit-submit {
- margin-top: 20px;
-}
-
-
-.contact-photo-menu-button {
- position: absolute;
- background-image: url("../img/photo-menu.jpg");
- background-position: top left;
- background-repeat: no-repeat;
- margin: 0px; padding: 0px;
- width: 16px;
- height: 16px;
- top: 64px; left:0px;
- overflow: hidden;
- text-indent: 40px;
- display: none;
-
-}
-.contact-photo-menu {
- width: auto;
- border: 2px solid #444444;
- background: #FFFFFF;
- position: absolute;
- left: 0px; top: 90px;
- display: none;
- z-index: 10000;
-}
-.contact-photo-menu ul { margin:0px; padding: 0px; list-style: none }
-.contact-photo-menu li a { display: block; padding: 2px; }
-.contact-photo-menu li a:hover { color: #FFFFFF; background: #3465A4; text-decoration: none; }
-
-
-#block-message, #ignore-message, #archive-message, #lost-contact-message {
- color: #FF0000;
-}
-
-#profile-edit-insecure {
- margin-top: 20px;
- color: #FF0000;
- font-size: 1.1em;
- border: 1px solid #FF8888;
- background-color: #FFEEEE;
- padding-left: 5px;
- /*: 3px 3px 3px 5px; */
- width: 587px;
-}
-
-/* TinyMCE */
-
-DIV#profile-jot-text_toolbargroup{
-background: #FFF;
-border: 1px #111;
-/*box-shadow: 5px 5px 5px #000 inset;*/
-}
-
-/*
-#profile-jot-text_parent, .mceLayout {
- border-radius: 5px;
- -moz-border-radius: 5px;
- box-shadow: 4px 4px 3px 0 #444444;
-}
-*/
-
-
-iframe#profile-jot-text_ifr {
-width: 100% !important;
-height: 100% !important;
-box-shadow: 5px 5px 5px #000 inset !important;}
-
-tr.mceLast {
-
-}
-
-/* Not MCE */
-
-#profile-jot-text {
- height: 20px;
- color:#000;
- border: 1px solid #cccccc;
- padding: 10px;
- width: 90%;
- border-radius: 20px;
- box-shadow: 4px 4px 3px 0 #666 inset;
-}
-#profile-jot-text:hover {
- color: #000000;
-}
-
-.wall-item-photo, .photo, .contact-block-img, .my-comment-photo {
- border-radius: 5px;
- -moz-border-radius: 5px;
- box-shadow: 4px 4px 3px 0 #444444;
-}
-
-
-#datebrowse-sidebar select {
- margin-left: 25px;
- border-radius: 5px;
- -moz-border-radius: 5px;
- opacity: 0.3;
- filter:alpha(opacity=30);
-}
-
-#datebrowse-sidebar select:hover {
- opacity: 1.0;
- filter:alpha(opacity=100);
-}
-
-#posted-date-selector {
- margin-left: 30px !important;
- margin-top: 5px !important;
- margin-right: 0px !important;
- margin-bottom: 0px !important;
-}
-
-#posted-date-selector:hover {
- box-shadow: 4px 4px 3px 0 #444444;
- margin-left: 25px !important;
- margin-top: 0px !important;
- margin-right: 5px !important;
- margin-bottom: 5px !important;
-
-}
-
-#side-bar-photos-albums {
- margin-top: 15px;
-}
-
-#side-bar-photos-albums ul {
- list-style: none;
-}
-
-.contact-entry-photo img, .profile-match-photo img, #photo-photo img, .directory-photo-img, .photo-album-photo, .photo-top-photo, .group-selected, .nets-selected, .fileas-selected, .categories-selected {
- border-radius: 5px;
- -moz-border-radius: 5px;
- box-shadow: 4px 4px 3px 0 #444444;
-}
-
-#profile-jot-submit {
- height: auto;
- background-color: #dd0000;
- color: #eeeeec;
- font-weight: bold;
- -webkit-border-radius: 5px;
- -moz-border-radius: 5px;
- border-radius: 5px;
- border: 2px outset #222420 !important;
- margin: 0;
- float: right;
- text-shadow: 1px 1px #111;
- width: auto;
- box-shadow: 5px 5px 5px #444;
-}
-
-#profile-jot-submit:active {
- box-shadow: 0 0 0 0;
-}
-
-#sidebar-page-list .label {
- margin-left: 5px;
-}
-
-
-.photo {
- border: 1px solid #AAAAAA;
-}
-
-.photo-top-photo, .photo-album-photo {
- padding: 10px;
- max-width: 300px;
- border: 1px solid #888888;
-}
-
-.rotleft1 {
--webkit-transform: rotate(-1deg);
--moz-transform: rotate(-1deg);
--ms-transform: rotate(-1deg);
--o-transform: rotate(-1deg);
-}
-
-.rotleft2 {
--webkit-transform: rotate(-2deg);
--moz-transform: rotate(-2deg);
--ms-transform: rotate(-2deg);
--o-transform: rotate(-2deg);
-}
-
-.rotleft3 {
--webkit-transform: rotate(-3deg);
--moz-transform: rotate(-3deg);
--ms-transform: rotate(-3deg);
--o-transform: rotate(-3deg);
-}
-
-.rotleft4 {
--webkit-transform: rotate(-4deg);
--moz-transform: rotate(-4deg);
--ms-transform: rotate(-4deg);
--o-transform: rotate(-4deg);
-}
-
-
-.rotright1 {
--webkit-transform: rotate(1deg);
--moz-transform: rotate(1deg);
--ms-transform: rotate(1deg);
--o-transform: rotate(1deg);
-}
-
-.rotright2 {
--webkit-transform: rotate(2deg);
--moz-transform: rotate(2deg);
--ms-transform: rotate(2deg);
--o-transform: rotate(2deg);
-}
-
-.rotright3 {
--webkit-transform: rotate(3deg);
--moz-transform: rotate(3deg);
--ms-transform: rotate(3deg);
--o-transform: rotate(3deg);
-}
-
-.rotright4 {
--webkit-transform: rotate(4deg);
--moz-transform: rotate(4deg);
--ms-transform: rotate(4deg);
--o-transform: rotate(4deg);
-}
-
-
-
-/** acl **/
-#photo-edit-perms-select,
-#photos-upload-permissions-wrapper,
-#profile-jot-acl-wrapper{
- display:block!important;
-}
-
-#photos-usage-message {
- margin-bottom: 15px;
-}
-
-
-#acl-wrapper {
- width: 690px;
- float:left;
-}
-#acl-search {
- float:right;
- background: #ffffff url("../../../../images/search_18.png") no-repeat right center;
- padding-right:20px;
-}
-#acl-showall {
- float: left;
- display: block;
- width: auto;
- height: 18px;
- background-color: #cccccc;
- background-image: url("../../../../images/show_all_off.png");
- background-position: 7px 7px;
- background-repeat: no-repeat;
- padding: 7px 5px 0px 30px;
- -webkit-border-radius: 5px ;
- -moz-border-radius: 5px;
- border-radius: 5px;
- color: #999999;
-}
-#acl-showall.selected {
- color: #000000;
- background-color: #ff9900;
- background-image: url("../../../../images/show_all_on.png");
-}
-
-#acl-list {
- height: 210px;
- border: 1px solid #cccccc;
- clear: both;
- margin-top: 30px;
- overflow: auto;
-}
-#acl-list-content {
-
-}
-.acl-list-item {
- display: block;
- width: 150px;
- height: 30px;
- border: 1px solid #cccccc;
- margin: 5px;
- float: left;
-}
-.acl-list-item img{
- width:22px;
- height: 22px;
- float: left;
- margin: 4px;
-}
-.acl-list-item p { height: 12px; font-size: 10px; margin: 0px; padding: 2px 0px 1px; overflow: hidden;}
-.acl-list-item a {
- font-size: 8px;
- display: block;
- width: 40px;
- height: 10px;
- float: left;
- color: #999999;
- background-color: #cccccc;
- background-position: 3px 3px;
- background-repeat: no-repeat;
- margin-right: 5px;
- -webkit-border-radius: 5px ;
- -moz-border-radius: 5px;
- border-radius: 5px;
- padding-left: 15px;
-}
-#acl-wrapper a:hover {
- text-decoration: none;
- color:#000000;
-}
-.acl-button-show { background-image: url("../../../../images/show_off.png"); }
-.acl-button-hide { background-image: url("../../../../images/hide_off.png"); }
-
-.acl-button-show.selected {
- color: #000000;
- background-color: #9ade00;
- background-image: url("../../../../images/show_on.png");
-}
-.acl-button-hide.selected {
- color: #000000;
- background-color: #ff4141;
- background-image: url("../../../../images/hide_on.png");
-}
-.acl-list-item.groupshow { border-color: #9ade00; }
-.acl-list-item.grouphide { border-color: #ff4141; }
-/** /acl **/
-
-
-
-#group-new-submit-wrapper {
- margin-top: 30px;
-}
-
-#group-edit-name-label {
- float: left;
- width: 175px;
- margin-top: 20px;
- margin-bottom: 20px;
-}
-
-#group-edit-name {
- float: left;
- width: 225px;
- margin-top: 20px;
- margin-bottom: 20px;
-}
-
-#group-edit-name-wrapper {
-
-
-}
-
-
-#group_members_select_label {
- display: block;
- float: left;
- width: 175px;
-}
-
-.group_members_select {
- float: left;
- width: 230px;
- overflow: auto;
-}
-
-#group_members_select_end {
- clear: both;
-}
-#group-edit-name-end {
- clear: both;
-}
-
-#prvmail-to-label, #prvmail-subject-label, #prvmail-message-label {
- margin-bottom: 10px;
- margin-top: 20px;
-}
-
-#prvmail-submit {
- float: left;
- margin-top: 10px;
- margin-right: 30px;
-}
-#prvmail-upload-wrapper,
-#prvmail-link-wrapper,
-#prvmail-rotator-wrapper {
- float: left;
- margin-top: 10px;
- margin-right: 10px;
- width: 24px;
-}
-
-#prvmail-end {
- clear: both;
-}
-
-.mail-list-sender,
-.mail-list-detail {
- float: left;
-}
-.mail-list-detail {
- margin-left: 20px;
-}
-
-.mail-list-subject {
- font-size: 1.1em;
- margin-top: 10px;
-}
-a.mail-list-link {
- display: block;
- font-size: 1.3em;
- padding: 4px 0;
-}
-
-/*
-*a.mail-list-link:hover {
-* background-color: #15607B;
-* color: #F5F6FB;
-*}
-*/
-
-.mail-list-outside-wrapper-end {
- clear: both;
-}
-
-.mail-list-outside-wrapper {
- margin-top: 30px;
-}
-
-.mail-list-delete-wrapper {
- float: right;
- margin-right: 30px;
- margin-top: 15px;
-}
-
-.mail-list-delete-icon {
- border: none;
-}
-
-.mail-conv-sender,
-.mail-conv-detail {
- float: left;
-}
-.mail-conv-detail {
- margin-left: 20px;
- width: 500px;
-}
-
-.mail-conv-subject {
- font-size: 1.4em;
- margin: 10px 0;
-}
-
-.mail-conv-outside-wrapper-end {
- clear: both;
-}
-
-.mail-conv-outside-wrapper {
- margin-top: 30px;
-}
-
-.mail-conv-delete-wrapper {
- float: right;
- margin-right: 30px;
- margin-top: 15px;
-}
-.mail-conv-break {
- clear: both;
-}
-
-.mail-conv-delete-icon {
- border: none;
-}
-
-.message-links ul {
- list-style-type: none;
- padding: 0px;
-}
-
-.message-links li {
- margin-top: 10px;
- float: left;
-}
-.message-links a {
- padding: 3px 5px;
-}
-
-.message-links-end {
- clear: both;
-}
-
-#sidebar-group-list ul {
- list-style-type: none;
-}
-
-#sidebar-group-list .icon, #sidebar-group-list .iconspacer {
- display: inline-block;
- height: 12px;
- width: 12px;
-}
-
-#sidebar-group-list li {
- margin-top: 10px;
-}
-
-.nets-ul, .fileas-ul, .categories-ul {
- list-style-type: none;
-}
-
-.nets-ul li, .fileas-ul li, .categories-ul li {
- margin-top: 10px;
-}
-
-.nets-link {
- margin-left: 24px;
-}
-.nets-all {
- margin-left: 42px;
-}
-
-.fileas-link, .categories-link {
- margin-left: 24px;
-}
-
-.fileas-all, .categories-all {
- margin-left: 0px;
-}
-
-#search-save {
- margin-left: 5px;
-}
-.groupsideedit {
- margin-right: 10px;
-}
-#saved-search-ul {
- list-style-type: none;
-}
-.savedsearchdrop, .savedsearchterm {
- float: left;
- margin-top: 10px;
-}
-.savedsearchterm {
- margin-left: 10px;
-}
-
-
-#side-follow-wrapper {
- margin-top: 20px;
-}
-#side-follow-url, #side-peoplefind-url {
- margin-top: 5px;
-}
-#side-follow-submit, #side-peoplefind-submit {
- margin-top: 15px;
-}
-
-#side-match-link {
- margin-top: 10px;
-}
-
-aside input[type='text'] {
- width: 174px;
-}
-
-.widget {
- border-bottom: 1px solid #eec;
- padding: 8px;
- margin-top: 5px;
- -moz-border-radius:5px;
- -webkit-border-radius:5px;
- border-radius:5px;
-
-}
-
-
-/*.photos {
- height: auto;
- overflow: auto;
-}*/
-
-.photos-end {
- clear: both;
- margin-bottom: 25px;
-}
-
-.photo-album-image-wrapper {
- float: left;
- margin-top: 15px;
- margin-right: 15px;
- margin-left: 15px;
-/* width: 200px; height: 200px;
- overflow: hidden;
- position: relative; */
-}
-.photo-album-image-wrapper .caption {
- display: none;
- width: 100%;
-/* position: absolute; */
- bottom: 0px;
- padding: 0.5em 0.5em 0px 0.5em;
- background-color: rgba(245, 245, 255, 0.8);
- border-bottom: 2px solid #CCC;
- margin: 0px;
-}
-.photo-album-image-wrapper a:hover .caption {
- display:block;
-}
-
-#photo-album-end {
- clear: both;
- margin-bottom: 25px;
-}
-
-.photo-top-image-wrapper {
-/* position: relative; */
- float: left;
- margin-top: 15px;
- margin-right: 15px;
- margin-left: 15px;
- margin-bottom: 15px;
-/* width: 200px; height: 200px;
- overflow: hidden; */
-}
-.photo-top-album-name {
- width: 100%;
- min-height: 2em;
-/* position: absolute; */
- bottom: 0px;
- padding: 0px 3px;
- padding-top: 0.5em;
- background-color: rgb(255, 255, 255);
-}
-#photo-top-end {
- clear: both;
-}
-
-#photo-top-links {
- margin-bottom: 30px;
- margin-left: 30px;
-}
-
-#photos-upload-newalbum-div {
- float: left;
- width: 175px;
-}
-
-#photos-upload-noshare {
- margin-bottom: 10px;
-}
-#photos-upload-existing-album-text {
- float: left;
- width: 175px;
-}
-#photos-upload-newalbum {
- float: left;
-}
-#photos-upload-album-select {
- float: left;
-}
-
-#photos-upload-spacer {
- margin-top: 25px;
-}
-#photos-upload-new-end, #photos-upload-exist-end {
- clear: both;
-}
-#photos-upload-exist-end {
- margin-bottom: 15px;
-}
-#photos-upload-submit {
- margin-top: 15px;
-}
-
-#photos_upload_applet_wrapper {
- margin-bottom: 15px;
-}
-
-#photos-upload-no-java-message {
- margin-bottom: 15px;
-}
-
-#profile-jot-desc {
- /*float: left;*/
- width: 480px;
- color: #FF0000;
- margin-top: 10px;
- margin-bottom: 10px;
-}
-
-#character-counter {
- float: right;
- font-size: 120%;
-}
-
-#character-counter.grey {
- color: #888888;
-}
-
-#character-counter.orange {
- color: orange;
-}
-#character-counter.red {
- color: red;
-}
-
-#profile-jot-banner-end {
- /* clear: both; */
-}
-
-#photos-upload-select-files-text {
- margin-top: 15px;
- margin-bottom: 15px;
-}
-
-#photos-upload-perms-menu, #photos-upload-perms-menu:visited, #photos-upload-perms-menu:link {
- color: #8888FF;
- text-decoration: none;
- cursor: pointer;
-}
-
-#photos-upload-perms-menu:hover {
- color: #0000FF;
- text-decoration: underline;
- cursor: pointer;
-}
-
-
-#settings-default-perms-menu {
- margin-top: 15px;
- margin-bottom: 15px;
-}
-
-#photo-edit-caption-label, #photo-edit-tags-label, #photo-edit-albumname-label, #photo-edit-rotate-label {
- float: left;
- width: 150px;
-}
-
-#photo-edit-perms-end {
- margin-bottom: 15px;
-}
-
-#photo-edit-caption, #photo-edit-newtag, #photo-edit-albumname, #photo-edit-rotate {
- float: left;
- margin-bottom: 25px;
-}
-#photo-edit-link-wrap {
- margin-bottom: 15px;
-}
-#photo-like-div {
- margin-bottom: 25px;
-}
-
-#photo-edit-caption-end, #photo-edit-tags-end, #photo-edit-albumname-end, #photo-edit-rotate-end {
- clear: both;
-}
-
-#photo-edit-rotate-end {
- margin-bottom: 15px;
-}
-
-#photo-edit-delete-button {
- margin-left: 200px;
-}
-#photo-edit-end {
- margin-bottom: 35px;
-}
-#photo-caption {
- font-size: 110%;
- font-weight: bold;
- margin-top: 15px;
- margin-bottom: 15px;
-}
-
-#in-this-photo-text {
- color: #0000FF;
- margin-left: 30px;
-}
-
-#in-this-photo {
- margin-left: 60px;
- margin-top: 10px;
- margin-bottom: 20px;
-}
-
-#photo-album-edit-submit, #photo-album-edit-drop {
- margin-top: 15px;
- margin-bottom: 15px;
-}
-
-#photo-album-edit-drop {
- margin-left: 200px;
-}
-
-.group-delete-wrapper {
- float: right;
- margin-right: 50px;
-}
-
-#install-dbhost-label,
-#install-dbuser-label,
-#install-dbpass-label,
-#install-dbdata-label,
-#install-tz-desc {
- float: left;
- width: 250px;
- margin-top: 10px;
- margin-bottom: 10px;
-
-}
-
-#install-dbhost,
-#install-dbuser,
-#install-dbpass,
-#install-dbdata {
- float: left;
- width: 200px;
- margin-left: 20px;
-}
-
-#install-dbhost-end,
-#install-dbuser-end,
-#install-dbpass-end,
-#install-dbdata-end,
-#install-tz-end {
- clear: both;
-}
-
-#install-form select#timezone_select {
- float: left;
- margin-top: 18px;
- margin-left: 20px;
-}
-
-#dfrn-request-networks {
- margin-bottom: 30px;
-}
-
-#pause {
- position: fixed;
- bottom: 5px;
- right: 5px;
-}
-
-.sparkle {
- cursor: url('../img/lock.cur'), pointer;
-/* cursor: pointer !important; */
-}
-
-.contact-block-div {
- float: left;
- width: 52px;
- height: 52px;
-}
-.contact-block-textdiv {
- float: left;
- width: 150px;
- height: 34px;
-}
-
-#contact-block-end {
- clear: both;
-}
-.contact-block-link {
- float: left;
-}
-.contact-block-img {
- width:30px;
- height:30px;
-}
-
-#tag-remove {
- margin-bottom: 15px;
-}
-
-#tagrm li {
- margin-bottom: 10px;
-}
-
-#tagrm-submit, #tagrm-cancel {
- margin-top: 25px;
-}
-
-#tagrm-cancel {
- margin-left: 15px;
-}
-
-.wall-item-conv {
- margin-top: 5px;
- margin-bottom: 25px;
-}
-
-#search-submit {
- margin-left: 15px;
-}
-
-#search-box {
- margin-bottom: 25px;
-}
-
-#nav-searchbar {
- float: right;
- margin-top: 4px;
-}
-
-#nav-search-text:hover {
- background-color: #FFF;
- opacity: 1;
-}
-
-#nav-search-text {
- border-radius: 14px;
- background-color: #fff;
- opacity: 0.92;
-}
-
-#nav-user-linkmenu img {
- border-radius: 5px;
-}
-
-.location-label, .gender-label, .marital-label, .homepage-label {
- float: left;
- text-align: right;
- display: block;
- width: 65px;
-}
-
-.adr, .x-gender, .marital-text, .homepage-url {
- float: left;
- display: block;
- margin-left: 8px;
-}
-
-.profile-clear {
- clear: both;
-}
-
-
-.clear {
- clear: both;
-}
-
-.cc-license {
- margin-top: 50px;
- font-size: 70%;
-}
-
-
-#plugin-settings-link, #account-settings-link {
- margin-bottom: 10px;
-}
-
-#uexport-link {
- margin-bottom: 20px;
-}
-
-/* end from default */
-
-
-.fn {
- padding: 0px 0px 5px 0px;
- font-size: 120%;
- font-weight: bold;
- color: #dd0000;
-}
-
-.vcard .title {
- margin-bottom: 5px;
- margin-left: 12px;
-}
-
-.vcard dl {
- clear: both;
-}
-
-#birthday-title {
- float: left;
- font-weight: bold;
-}
-
-#birthday-adjust {
- float: left;
- font-size: 75%;
- margin-left: 10px;
-}
-
-#birthday-title-end {
- clear: both;
-}
-
-.birthday-list {
- margin-left: 15px;
-}
-
-#birthday-wrapper {
- margin-bottom: 20px;
-}
-
-#network-new-link {
- margin-top: 15px;
- margin-bottom: 15px;
-}
-
-
-.tool-wrapper {
- float: left;
- margin-left: 15px;
-}
-
-.tool-link {
- cursor: pointer;
-}
-
-.eventcal {
- float: left;
- font-size: 20px;
-}
-
-#event-summary-text {
- margin-top: 15px;
-}
-
-#event-share-checkbox {
- float: left;
- margin-top: 10px;
-}
-
-#event-share-text {
- float: left;
- margin-top: 10px;
- margin-left: 5px;
-}
-
-#event-share-break {
- clear: both;
- margin-bottom: 10px;
-}
-
-#event-summary {
- width: 400px;
- font-weight: bold;
- font-size:2em;
-}
-
-.vevent {
-border: 1px solid #CCCCCC;
-
-}
-
-.vevent .event-summary {
- margin-left: 10px;
- margin-right: 10px;
- font-weight: bold;
-}
-
-.vevent .event-description, .vevent .event-location {
- margin-left: 10px;
- margin-right: 10px;
-}
-.vevent .event-start {
- margin-left: 10px;
- margin-right: 10px;
-}
-
-#new-event-link {
- margin-bottom: 10px;
-}
-
-.edit-event-link, .plink-event-link {
- float: left;
- margin-top: 4px;
- margin-right: 4px;
- margin-bottom: 15px;
-}
-
-.event-description:before {
- content: url('../../../../images/calendar.png');
- margin-right: 15px;
-}
-
-.event-start, .event-end {
- margin-left: 10px;
- width: 330px;
- clear: both;
-}
-
-.event-start .dtstart, .event-end .dtend {
- float: right;
-}
-
-.event-list-date {
- margin-bottom: 10px;
-}
-
-.prevcal, .nextcal {
- float: left;
- margin-left: 32px;
- margin-right: 32px;
- margin-top: 64px;
-}
-.event-calendar-end {
- clear: both;
-}
-
-
-.calendar {
- font-family: Courier, monospace;
-}
-.today {
- font-weight: bold;
- color: #FF0000;
-}
-
-.settings-block {
- border: 1px solid #AAA;
- margin: 10px;
- padding: 10px;
-}
-
-.app-title {
- margin: 10px;
-}
-
-#identity-manage-desc {
- margin-top:15px;
- margin-bottom: 15px;
-}
-
-#identity-manage-choose {
- margin-bottom: 15px;
-}
-
-#identity-submit {
- margin-top: 20px;
-}
-
-#photo-prev-link, #photo-next-link {
- padding: 10px;
- float: left;
-}
-
-#photo-photo {
- float: left;
-}
-
-#photo-photo-end {
- clear: both;
-}
-
-.profile-match-photo {
- float: left;
- text-align: center;
- width: 120px;
-}
-
-.profile-match-name {
- float: left;
- text-align: center;
- width: 120px;
- overflow: hidden;
-}
-
-.profile-match-break,
-.profile-match-end {
- clear: both;
-}
-
-.profile-match-connect {
- text-align: center;
- font-weight: bold;
-}
-
-.profile-match-wrapper {
- float: left;
- padding: 10px;
- width: 120px;
- height: 120px;
- scroll: auto;
-}
-#profile-match-wrapper-end {
- clear: both;
-}
-.side-link {
- margin-bottom: 15px;
-}
-
-#language-selector {
- position: absolute;
- top: 0px;
- left: 16px;
-}
-
-#group-members {
- margin-top: 20px;
- padding: 10px;
- height: 250px;
- overflow: auto;
- border: 1px solid #ddd;
-}
-
-#group-members-end {
- clear: both;
-}
-
-#group-separator {
- margin-top: 10px;
- margin-bottom: 10px;
-}
-
-#group-all-contacts {
- padding: 10px;
- height: 450px;
- overflow: auto;
- border: 1px solid #ddd;
-}
-
-#group-all-contacts-end {
- clear: both;
- margin-bottom: 10px;
-}
-
-#group-edit-desc {
- margin-top: 15px;
-}
-
-
-#prof-members {
- margin-top: 20px;
- padding: 10px;
- height: 250px;
- overflow: auto;
- border: 1px solid #ddd;
-}
-
-#prof-members-end {
- clear: both;
-}
-
-#prof-separator {
- margin-top: 10px;
- margin-bottom: 10px;
-}
-
-#prof-all-contacts {
- padding: 10px;
- height: 450px;
- overflow: auto;
- border: 1px solid #ddd;
-}
-
-#prof-all-contacts-end {
- clear: both;
- margin-bottom: 10px;
-}
-
-#prof-edit-desc {
- margin-top: 15px;
-}
-
-#crepair-name-label,
-#crepair-nick-label,
-#crepair-attag-label,
-#crepair-url-label,
-#crepair-request-label,
-#crepair-confirm-label,
-#crepair-notify-label,
-#crepair-photo-label,
-#crepair-poll-label {
- float: left;
- width: 200px;
- margin-bottom: 15px;
-}
-
-#crepair-name,
-#crepair-nick,
-#crepair-attag,
-#crepair-url,
-#crepair-request,
-#crepair-confirm,
-#crepair-notify,
-#crepair-photo,
-#crepair-poll {
- float: left;
- width: 300px;
-}
-
-
-#netsearch-box {
- margin-top: 20px;
-}
-
-#netsearch-box #search-submit {
- margin: 5px 0px 0px 0px;
-}
-
-.required {
- color: #FF0000;
-}
-
-#event-start-text, #event-finish-text {
- margin-top: 10px;
- margin-bottom: 5px;
-}
-
-#event-nofinish-checkbox, #event-nofinish-text, #event-adjust-checkbox, #event-adjust-text {
- float: left;
-}
-#event-datetime-break {
- margin-bottom: 10px;
-}
-
-#event-nofinish-break, #event-adjust-break {
- clear: both;
-}
-
-#event-desc-text, #event-location-text {
- margin-top: 10px;
- margin-bottom: 5px;
-}
-#event-submit {
- margin-top: 10px;
-}
-
-.body-tag, .filesavetags, .categorytags {
- opacity: 0.5;
- filter:alpha(opacity=50);
-}
-
-.body-tag:hover, .filesavetags:hover, .categorytags:hover {
- opacity: 1.0 !important;
- filter:alpha(opacity=100) !important;
-}
-
-.item-select {
- opacity: 0.1;
- filter:alpha(opacity=10);
- float: right;
- margin-right: 10px;
-
-}
-.item-select:hover, .checkeditem {
- opacity: 1;
- filter:alpha(opacity=100);
-}
-
-
-#item-delete-selected {
- margin-top: 30px;
-}
-
-#item-delete-selected-end {
- clear: both;
-}
-#item-delete-selected-icon, #item-delete-selected-desc {
- float: left;
- margin-right: 5px;
-}
-#item-delete-selected-desc:hover {
- text-decoration: underline;
-}
-
-#lang-select-icon {
- cursor: pointer;
- position: absolute;
- left: 4px;
-/*because of the shape, if this is lined up properly it looks like it's lined up wrong...
-lining it up too high is the only way to make it look correctly aligned. The human
-brain is weird like that */
- top: 2px;
-}
-
-#lang-select-icon:hover {
- opacity: 1;
- filter:alpha(opacity=100);
-}
-
-.notif-image {
- height: 80px;
- width: 80px;
- margin-right: 15px;
-}
-.notification-listing-end {
- clear: both;
- margin-bottom: 15px;
-}
-
-
-
-/**
- * Plugins settings
- */
-
-.settings-block > h3,
-.settings-heading {
- border-bottom: 1px solid #babdb6;
-}
-
-
-/**
- * Form fields
- */
-.field {
- margin-bottom: 10px;
- padding-bottom: 10px;
- overflow: auto;
- width: 100%
-}
-
-.field label {
- float: left;
- width: 200px;
-}
-
-.field input,
-.field textarea {
- width: 400px;
-}
-.field textarea { height: 100px; }
-.field_help {
- display: block;
- margin-left: 200px;
- color: #666666;
-
-}
-
-.field_abook_help {
- color: #888;
-}
-.abook-them {
- margin-left: 225px;
- margin-bottom: 15px;
-}
-.abook-me {
- margin-left: 36px;
- margin-bottom: 15px;
-}
-.acheckbox {
- margin-bottom: 5px !important;
-}
-
-#contact-slider {
- width: 600px !important;
-}
-
-.abook-edit-them, .abook-edit-me {
- float: left;
- width: 100px !important;
-}
-.field_abook_help {
- float: left;
-}
-
-.field .onoff {
- float: left;
- width: 80px;
- margin-right: 15px;
-}
-.field .onoff a {
- display: block;
- border:1px solid #666666;
- background-image:url("../../../../images/onoff.jpg");
- background-repeat: no-repeat;
- padding: 4px 2px 2px 2px;
- height: 16px;
- text-decoration: none;
-}
-.field .onoff .off {
- border-color:#666666;
- padding-left: 40px;
- background-position: left center;
- background-color: #cccccc;
- color: #666666;
- text-align: right;
-}
-.field .onoff .on {
- border-color:#204A87;
- padding-right: 40px;
- background-position: right center;
- background-color: #D7E3F1;
- color: #204A87;
- text-align: left;
-}
-.hidden { display: none!important; }
-
-.field.radio .field_help { margin-left: 0px; }
-
-/**
- * ADMIN
- */
-#pending-update {
- float:right;
- color: #ffffff;
- font-weight: bold;
- background-color: #FF0000;
- padding: 0em 0.3em;
-
-}
-#adminpage dl {
- clear: left;
- margin-bottom: 2px;
- padding-bottom: 2px;
- border-bottom: 1px solid black;
-}
-#adminpage dt {
- width: 200px;
- float: left;
- font-weight: bold;
-}
-#adminpage dd {
- margin-left: 200px;
-}
-
-#adminpage h3 {
- border-bottom: 1px solid #cccccc;
-}
-#adminpage .field label {
- font-weight: bold;
-}
-#adminpage .submit {
- clear:left;
- text-align: right;
-}
-
-#adminpage #pluginslist {
- margin: 0px; padding: 0px;
-}
-#adminpage .plugin {
- list-style: none;
- display: block;
- border: 1px solid #888888;
- padding: 1em;
- margin-bottom: 5px;
- clear: left;
-}
-#adminpage .plugin .desc { margin-left: 2.5em;}
-#adminpage .toggleplugin {
- float:left;
- margin-right: 1em;
-}
-
-#adminpage table {width:100%; border-bottom: 1px solid #000000; margin: 5px 0px;}
-#adminpage table th { text-align: left;}
-#adminpage td .icon { float: left;}
-#adminpage table#users img { width: 16px; height: 16px; }
-#adminpage table tr:hover { background-color: #bbc7d7; }
-#adminpage .selectall { text-align: right; }
-
-/*
- * UPDATE
- */
-.popup {
- width: 100%; height: 100%;
- top:0px; left:0px;
- position: absolute;
- display: none;
-}
-
-.popup .background {
- background-color: rgba(0,0,0,128);
- opacity: 0.5;
- width: 100%; height: 100%;
- position: absolute;
- top:0px; left:0px;
-}
-.popup .panel {
- top:25%;left:25%;width:50%;height:50%;
- padding: 1em;
- position: absolute;
- border: 4px solid #000000;
- background-color: #FFFFFF;
-}
-.popup .panel .panel_text { display: block; overflow: auto; height: 80%; }
-.popup .panel .panel_in { width: 100%; height: 100%; position: relative; }
-.popup .panel .panel_actions { width: 100%; bottom: 4px; left: 0px; position: absolute; }
-.panel_text .progress { width: 50%; overflow: hidden; height: auto; border: 1px solid #cccccc; margin-bottom: 5px}
-.panel_text .progress span {float: right; display: block; width: 25%; background-color: #eeeeee; text-align: right;}
-
-/**
- * OAuth
- */
-.oauthapp {
- height: auto; overflow: auto;
- border-bottom: 2px solid #cccccc;
- padding-bottom: 1em;
- margin-bottom: 1em;
-}
-.oauthapp img {
- float: left;
- width: 48px; height: 48px;
- margin: 10px;
-}
-.oauthapp img.noicon {
- background-image: url("../../../../images/icons/48/plugin.png");
- background-position: center center;
- background-repeat: no-repeat;
-}
-.oauthapp a {
- float: left;
-}
-
-/**
- * ICONS
- */
-.iconspacer {
- display: block; width: 16px; height: 16px;
-}
-
-.icon {
- display: block; width: 16px; height: 16px;
- background-image: url('../../../../images/icons.png');
-}
-.article { background-position: 0px 0px;}
-.audio { background-position: -16px 0px;}
-.block { background-position: -32px 0px;}
-.drop { background-position: -48px 0px;}
-.drophide { background-position: -64px 0px;}
-.edit { background-position: -80px 0px;}
-.camera { background-position: -96px 0px;}
-.dislike { background-position: -112px 0px;}
-.like { background-position: -128px 0px;}
-.link { background-position: -144px 0px;}
-
-.globe { background-position: 0px -16px;}
-.noglobe { background-position: -16px -16px;}
-.no { background-position: -32px -16px;}
-.pause { background-position: -48px -16px;}
-.play { background-position: -64px -16px;}
-.pencil { background-position: -80px -16px;}
-.small-pencil { background-position: -96px -16px;}
-.recycle { background-position: -112px -16px;}
-.remote-link { background-position: -128px -16px;}
-.share { background-position: -144px -16px;}
-
-.tools { background-position: 0px -32px;}
-.lock { background-position: -16px -32px;}
-.unlock { background: url(../img/jotperms.png) no-repeat;}
-.video { background-position: -48px -32px;}
-.youtube { background-position: -64px -32px;}
-.attach { background-position: -80px -32px; }
-.language { background-position: -96px -32px; }
-.prev { background-position: -112px -32px; }
-.next { background-position: -128px -32px; }
-.on { background-position: -144px -32px; }
-
-.off { background-position: 0px -48px; }
-.starred { background-position: -16px -48px; }
-.unstarred { background-position: -32px -48px; }
-.tagged { background-position: -48px -48px; }
-.yellow { background-position: -64px -48px; }
-
-
-.filer-icon {
- display: block; width: 16px; height: 16px;
- background-image: url('../img/file.gif');
-}
-
-.icon.dim { opacity: 0.3;filter:alpha(opacity=30); }
-[class^="comment-edit-bb"] {
- list-style: none;
- display: none;
- margin: 0px 0 -5px 0px;
- padding: 0px;
- width: 75%;
-}
-[class^="comment-edit-bb"] > li {
- display: inline-block;
- margin: 10px 10px 0 0;
- visibility: none;
-}
-[class^="comment-edit-bb-end"] {
- clear: both;
-}
-.editicon {
- display: inline-block;
- width: 16px;
- height: 16px;
- background-image: url(../img/bbedit.png);
- background-color: #fff;
- text-decoration: none;
-}
-.editicon:hover {
- background-color: #ccc;
-}
-.boldbb {
- background-position: 0px 0px;
-}
-.boldbb:hover {
- background-position: 0px -16px;
-}
-.italicbb {
- background-position: -16px 0px;
-}
-.italicbb:hover {
- background-position: -16px -16px;
-}
-.underlinebb {
- background-position: -32px 0px;
-}
-.underlinebb:hover {
- background-position: -32px -16px;
-}
-.quotebb {
- background-position: -48px 0px;
-}
-.quotebb:hover {
- background-position: -48px -16px;
-}
-.codebb {
- background-position: -64px 0px;
-}
-.codebb:hover {
- background-position: -64px -16px;
-}
-.imagebb {
- background-position: -80px 0px;
-}
-.imagebb:hover {
- background-position: -80px -16px;
-}
-.urlbb {
- background-position: -96px 0px;
-}
-.urlbb:hover {
- background-position: -96px -16px;
-}
-.videobb {
- background-position: -112px 0px;
-}
-.videobb:hover {
- background-position: -112px -16px;
-}
-
-.attachtype {
- display: block; width: 20px; height: 23px;
- float: left;
- background-image: url('../../../../images/content-types.png');
-}
-
-.body-attach {
- margin-top: 10px;
-}
-
-.type-video { background-position: 0px 0px; }
-.type-image { background-position: -20px 0px; }
-.type-audio { background-position: -40px 0px; }
-.type-text { background-position: -60px 0px; }
-.type-unkn { background-position: -80px 0px; }
-
-
-/* autocomplete popup */
-.acpopup {
- max-height:150px;
- background-color:#ffffff;
- overflow:auto;
- z-index:100000;
- border:1px solid #cccccc;
-}
-.acpopupitem {
- background-color:#ffffff; padding: 4px;
- clear:left;
-}
-.acpopupitem img {
- float: left;
- margin-right: 4px;
-}
-
-.acpopupitem.selected {
- color: #FFFFFF; background: #3465A4;
-}
-
-/* popup notifications */
-div.jGrowl div.notice {
- background: #511919 url("../../../../images/icons/48/notice.png") no-repeat 5px center;
- color: #ffffff;
- padding-left: 58px;
-}
-div.jGrowl div.info {
- background: #364e59 url("../../../../images/icons/48/info.png") no-repeat 5px center;
- color: #ffffff;
- padding-left: 58px;
-}
-#jGrowl.top-right {
- top: 15px;
- right: 15px;
-}
-.qcomment {
- border: 1px solid #EEE;
- padding: 3px;
- margin-top: 15px;
- margin-left: 25px;
- width: 125px;
- overflow-y: auto;
-}
-
-
-.qcomment option {
- width: 125px;
- overflow-x: hidden;
-}
-
-.qcomment {
- opacity: 0.3;
- filter:alpha(opacity=30);
-}
-.qcomment:hover {
- opacity: 1.0;
- filter:alpha(opacity=100);
-}
-
-
-#id_term_label {
- width:75px;
-}
-#id_term {
- width:100px;
-}
-
-#recip {
-
-}
-.autocomplete-w1 { background: #ffffff; no-repeat bottom right; position:absolute; top:0px; left:0px; margin:6px 0 0 6px; /* IE6 fix: */ _background:none; _margin:1px 0 0 0; }
-.autocomplete { color:#000; border:1px solid #999; background:#FFF; cursor:default; text-align:left; max-height:350px; overflow:auto; margin:-6px 6px 6px -6px; /* IE6 specific: */ _height:350px; _margin:0; _overflow-x:hidden; }
-.autocomplete .selected { background:#F0F0F0; }
-.autocomplete div { padding:2px 5px; white-space:nowrap; overflow:hidden; }
-
-#datebrowse-sidebar select {
- margin-left: 25px;
-}
-
-
-.jslider .jslider-scale ins {
- color: #333;
- font-size: 12px;
- width: 100px;
- text-align: center;
-}
-
-/*
-Where did this come from? There isn't a ../img/slider.png. I don't remember adding this, but it used to work...
-
-.jslider .jslider-bg,
-.jslider .jslider-pointer {
- background: url("../img/slider.png") !important;
-}
-*/
-
-
-.slider {
- margin-top: 10px;
- margin-bottom: 30px;
-}
-
-
-#main-slider {
- position: relative;
- left: 5%;
- width: 90%;
-}
-
-
-#contact-slider {
- position: relative;
- left: 5%;
- width: 90%;
-}
-
-/* nav */
-nav {
- width: 100%;
- height: 32px;
- position: fixed;
- left: 0px;
- top: 0px;
- padding: 0px;
- background-color: #d00;
- color: #eec;
- z-index: 100;
- -webkit-box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.7);
- -moz-box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.7);
- box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.7);
-
-/* TODO find a better way to do this without different code for every single browser. */
-
- background-image: linear-gradient(bottom, #f00 26%, #b00 82%);
- background-image: -o-linear-gradient(bottom, #f00 26%, #b00 82%);
- background-image: -moz-linear-gradient(bottom, #000 26%, #2e2f2e 82%);
- background-image: -webkit-linear-gradient(bottom, #f00 26%, #b00 82%);
- background-image: -ms-linear-gradient(bottom, #f00 26%, #b00 82%);
-
- background-image: -webkit-gradient(
-linear,
-left bottom,
-left top,
-color-stop(0.26, #f00),
-color-stop(0.82, #b00)
-);
-}
-nav a,
-nav a:active,
-nav a:visited,
-nav a:link,
-nav a:hover {
- color: #ffffff;
- text-decoration: none;
- outline: none;
-}
-nav ul {
- margin: 0px;
- padding: 0px 20px;
-}
-nav ul li {
- list-style: none;
- margin: 0px;
- padding: 0px;
- float: left;
-}
-nav ul li .menu-popup {
- left: 0px;
- right: auto;
- top: 33px;
-}
-nav .nav-menu-icon {
- position: relative;
- height: 22px;
- padding: 5px;
- margin: 0px 10px;
- -moz-border-radius: 5px 5px 0 0;
- -webkit-border-radius: 5px 5px 0 0;
- border-radius: 5px 5px 0 0;
-}
-nav .nav-menu-icon.selected {
- background-color: #FF0000;
-}
-nav .nav-menu-icon img {
- width: 22px;
- height: 22px;
-}
-nav .nav-menu-icon .nav-notify {
- top: 3px;
-}
-nav .nav-menu {
- position: relative;
- height: 16px;
- padding: 5px;
- margin: 0px 15px;
- font-size: 14px;
-}
-nav .nav-menu.selected {
-border-bottom: 3px solid #f00;
-
-}
-nav .nav-notify {
- background-color: #0d0;
- color: #fff;
- -moz-border-radius: 5px 5px 5px 5px;
- -webkit-border-radius: 5px 5px 5px 5px;
- border-radius: 5px 5px 5px 5px;
-}
-nav .nav-notify.show {
- display: block;
-}
-nav #nav-help-link,
-nav #nav-search-link,
-nav #nav-directory-link,
-nav #nav-apps-link,
-nav #nav-user-linkmenu,
-nav #nav-site-linkmenu {
- float: right;
-}
-nav #nav-help-link .menu-popup,
-nav #nav-search-link .menu-popup,
-nav #nav-directory-link .menu-popup,
-nav #nav-apps-link .menu-popup,
-nav #nav-site-linkmenu .menu-popup {
- right: 0px;
- left: auto;
-}
-nav #nav-notifications-linkmenu.on .icon.s22.notify,
-nav #nav-notifications-linkmenu.selected .icon.s22.notify {
- background-image: url("../../../../images/icons/22/notify_on.png");
-}
-nav #nav-apps-link.selected {
- background-color: #364e59;
-}
-ul.menu-popup {
- position: absolute;
- display: none;
- width: 10em;
- background: #dd0000;
- color: #eec;
- padding: 0px;
- list-style: none;
- border-radius: 0px 0px 20px 20px;
- z-index: 100000;
- -webkit-box-shadow: 0px 5px 10px rgba(0, 0, 0, 0.7);
- -moz-box-shadow: 0px 5px 10px rgba(0, 0, 0, 0.7);
- box-shadow: 0px 5px 10px rgba(0, 0, 0, 0.7);
-}
-ul.menu-popup a {
- display: block;
- color: #eec;
- padding: 5px 10px;
- text-decoration: none;
-}
-ul.menu-popup a:hover {
- background-color: #eec;
- color: #f00;
-}
-ul.menu-popup .menu-sep {
- border-top: 1px solid #9eabb0;
-}
-ul.menu-popup li {
- float: none;
- overflow: auto;
- height: auto;
- display: block;
-}
-ul.menu-popup li img {
- float: left;
- width: 16px;
- height: 16px;
- padding-right: 5px;
-}
-ul.menu-popup .empty {
- padding: 5px;
- text-align: center;
- color: #9eabb0;
-}
-ul.menu-popup .toolbar {
- background-color: #9eabb0;
- height: auto;
- overflow: auto;
-}
-ul.menu-popup .toolbar a {
- float: right;
-}
-ul.menu-popup .toolbar a:hover {
- background-color: #ffffff;
-}
-/* header */
-header {
- position: fixed;
- left: 43%;
- right: 43%;
- top: 0px;
- margin: 0px;
- padding: 0px;
- /*width: 100%; height: 12px; */
-
- z-index: 110;
- color: #ffffff;
-}
-
-
-/* notifications popup menu */
-.nav-notify {
- display: none;
- position: absolute;
- font-size: 10px;
- padding: 1px 3px;
- top: 0px;
- right: -10px;
- min-width: 15px;
- text-align: right;
-}
-.nav-notify.show {
- display: block;
-}
-ul.menu-popup {
- position: absolute;
- display: none;
- width: 10em;
- margin: 0px;
- padding: 0px;
- list-style: none;
- z-index: 100000;
-/* top: 90px; */
-/* left: 400px; */
-}
-#nav-notifications-menu {
- width: 320px;
- max-height: 400px;
- overflow-y: scroll;overflow-style:scrollbar;
- background-color:#FFFFFF;
- -moz-border-radius: 5px;
- -webkit-border-radius: 5px;
- border-radius:5px;
- border: 1px solid #888;
-}
-#nav-notifications-menu .contactname { font-weight: bold; font-size: 0.9em; }
-#nav-notifications-menu img { float: left; margin-right: 5px; }
-#nav-notifications-menu .notif-when { font-size: 0.8em; display: block; }
-#nav-notifications-menu li {
- padding: 7px 0px 7px 10px;
- word-wrap:normal;
- border-bottom: 1px solid #000;
-}
-
-#nav-notifications-menu li:hover {
-
-}
-
-#nav-notifications-menu a:hover {
- text-decoration: underline;
-}
-
-.notif-item a {
- color: #000000;
-}
-
-.notif-item a:hover {
- text-decoration: underline;
-}
-
-.notif-image {
- width: 32px;
- height: 32px;
- padding: 7px 7px 0px 0px;
-}
-
-.notify-seen {
- background: #DDDDDD;
-}
-
diff --git a/view/theme/fancyred/img/bbedit.png b/view/theme/fancyred/img/bbedit.png
deleted file mode 100644
index b89f2f7a8..000000000
--- a/view/theme/fancyred/img/bbedit.png
+++ /dev/null
Binary files differ
diff --git a/view/theme/fancyred/img/bg.png b/view/theme/fancyred/img/bg.png
deleted file mode 100644
index eae49e037..000000000
--- a/view/theme/fancyred/img/bg.png
+++ /dev/null
Binary files differ
diff --git a/view/theme/fancyred/img/border.jpg b/view/theme/fancyred/img/border.jpg
deleted file mode 100644
index 034a1cb63..000000000
--- a/view/theme/fancyred/img/border.jpg
+++ /dev/null
Binary files differ
diff --git a/view/theme/fancyred/img/editicons.png b/view/theme/fancyred/img/editicons.png
deleted file mode 100644
index 171a40876..000000000
--- a/view/theme/fancyred/img/editicons.png
+++ /dev/null
Binary files differ
diff --git a/view/theme/fancyred/img/events.png b/view/theme/fancyred/img/events.png
deleted file mode 100644
index 96dd86899..000000000
--- a/view/theme/fancyred/img/events.png
+++ /dev/null
Binary files differ
diff --git a/view/theme/fancyred/img/ff-16.jpg b/view/theme/fancyred/img/ff-16.jpg
deleted file mode 100644
index 3621f5914..000000000
--- a/view/theme/fancyred/img/ff-16.jpg
+++ /dev/null
Binary files differ
diff --git a/view/theme/fancyred/img/file.gif b/view/theme/fancyred/img/file.gif
deleted file mode 100644
index c532335ed..000000000
--- a/view/theme/fancyred/img/file.gif
+++ /dev/null
Binary files differ
diff --git a/view/theme/fancyred/img/friendika-16.png b/view/theme/fancyred/img/friendika-16.png
deleted file mode 100644
index 1a742ecdc..000000000
--- a/view/theme/fancyred/img/friendika-16.png
+++ /dev/null
Binary files differ
diff --git a/view/theme/fancyred/img/head.jpg b/view/theme/fancyred/img/head.jpg
deleted file mode 100644
index 6210b76be..000000000
--- a/view/theme/fancyred/img/head.jpg
+++ /dev/null
Binary files differ
diff --git a/view/theme/fancyred/img/home.png b/view/theme/fancyred/img/home.png
deleted file mode 100644
index d1ba7b3f3..000000000
--- a/view/theme/fancyred/img/home.png
+++ /dev/null
Binary files differ
diff --git a/view/theme/fancyred/img/introductions.png b/view/theme/fancyred/img/introductions.png
deleted file mode 100644
index 18ba5dc81..000000000
--- a/view/theme/fancyred/img/introductions.png
+++ /dev/null
Binary files differ
diff --git a/view/theme/fancyred/img/jotperms.png b/view/theme/fancyred/img/jotperms.png
deleted file mode 100644
index d133a6e01..000000000
--- a/view/theme/fancyred/img/jotperms.png
+++ /dev/null
Binary files differ
diff --git a/view/theme/fancyred/img/lock.cur b/view/theme/fancyred/img/lock.cur
deleted file mode 100644
index 892c5e851..000000000
--- a/view/theme/fancyred/img/lock.cur
+++ /dev/null
Binary files differ
diff --git a/view/theme/fancyred/img/login-bg.gif b/view/theme/fancyred/img/login-bg.gif
deleted file mode 100644
index cde836c89..000000000
--- a/view/theme/fancyred/img/login-bg.gif
+++ /dev/null
Binary files differ
diff --git a/view/theme/fancyred/img/message.png b/view/theme/fancyred/img/message.png
deleted file mode 100644
index f3fea75ee..000000000
--- a/view/theme/fancyred/img/message.png
+++ /dev/null
Binary files differ
diff --git a/view/theme/fancyred/img/network.png b/view/theme/fancyred/img/network.png
deleted file mode 100644
index c213cee04..000000000
--- a/view/theme/fancyred/img/network.png
+++ /dev/null
Binary files differ
diff --git a/view/theme/fancyred/img/notify_on.png b/view/theme/fancyred/img/notify_on.png
deleted file mode 100644
index 18002e15c..000000000
--- a/view/theme/fancyred/img/notify_on.png
+++ /dev/null
Binary files differ
diff --git a/view/theme/fancyred/img/photo-menu.jpg b/view/theme/fancyred/img/photo-menu.jpg
deleted file mode 100644
index fde5eb535..000000000
--- a/view/theme/fancyred/img/photo-menu.jpg
+++ /dev/null
Binary files differ
diff --git a/view/theme/fancyred/img/screenshot.jpg b/view/theme/fancyred/img/screenshot.jpg
deleted file mode 100644
index 5f00ec39e..000000000
--- a/view/theme/fancyred/img/screenshot.jpg
+++ /dev/null
Binary files differ
diff --git a/view/theme/fancyred/img/settings.png b/view/theme/fancyred/img/settings.png
deleted file mode 100644
index a935b225e..000000000
--- a/view/theme/fancyred/img/settings.png
+++ /dev/null
Binary files differ
diff --git a/view/theme/fancyred/img/shiny.png b/view/theme/fancyred/img/shiny.png
deleted file mode 100644
index 994c0d05d..000000000
--- a/view/theme/fancyred/img/shiny.png
+++ /dev/null
Binary files differ
diff --git a/view/theme/fancyred/js/fancyred.js b/view/theme/fancyred/js/fancyred.js
deleted file mode 100644
index 00b8fa39f..000000000
--- a/view/theme/fancyred/js/fancyred.js
+++ /dev/null
@@ -1,89 +0,0 @@
-
-
-function insertFormatting(comment,BBcode,id) {
-
- var tmpStr = $("#comment-edit-text-" + id).val();
- if(tmpStr == comment) {
- tmpStr = "";
- $("#comment-edit-text-" + id).addClass("comment-edit-text-full");
- $("#comment-edit-text-" + id).removeClass("comment-edit-text-empty");
- openMenu("comment-edit-submit-wrapper-" + id);
- $("#comment-edit-text-" + id).val(tmpStr);
- }
-
- textarea = document.getElementById("comment-edit-text-" +id);
- if (document.selection) {
- textarea.focus();
- selected = document.selection.createRange();
- if (BBcode == "url"){
- selected.text = "["+BBcode+"]" + "http://" + selected.text + "[/"+BBcode+"]";
- } else
- selected.text = "["+BBcode+"]" + selected.text + "[/"+BBcode+"]";
- } else if (textarea.selectionStart || textarea.selectionStart == "0") {
- var start = textarea.selectionStart;
- var end = textarea.selectionEnd;
- if (BBcode == "url"){
- textarea.value = textarea.value.substring(0, start) + "["+BBcode+"]" + "http://" + textarea.value.substring(start, end) + "[/"+BBcode+"]" + textarea.value.substring(end, textarea.value.length);
- } else
- textarea.value = textarea.value.substring(0, start) + "["+BBcode+"]" + textarea.value.substring(start, end) + "[/"+BBcode+"]" + textarea.value.substring(end, textarea.value.length);
- }
- return true;
-}
-
-function cmtBbOpen(comment, id) {
- if($(comment).hasClass('comment-edit-text-full')) {
- $(".comment-edit-bb-" + id).show();
- return true;
- }
- return false;
-}
-
-function cmtBbClose(comment, id) {
-// if($(comment).hasClass('comment-edit-text-empty')) {
-// $(".comment-edit-bb-" + id).hide();
-// return true;
-// }
- return false;
-}
-
-$(document).ready(function() {
-
-$('.group-edit-icon').hover(
- function() {
- $(this).addClass('icon'); $(this).removeClass('iconspacer');},
- function() {
- $(this).removeClass('icon'); $(this).addClass('iconspacer');}
- );
-
-$('.sidebar-group-element').hover(
- function() {
- id = $(this).attr('id');
- $('#edit-' + id).addClass('icon'); $('#edit-' + id).removeClass('iconspacer');},
-
- function() {
- id = $(this).attr('id');
- $('#edit-' + id).removeClass('icon');$('#edit-' + id).addClass('iconspacer');}
- );
-
-
-$('.savedsearchdrop').hover(
- function() {
- $(this).addClass('drop'); $(this).addClass('icon'); $(this).removeClass('iconspacer');},
- function() {
- $(this).removeClass('drop'); $(this).removeClass('icon'); $(this).addClass('iconspacer');}
- );
-
-$('.savedsearchterm').hover(
- function() {
- id = $(this).attr('id');
- $('#drop-' + id).addClass('icon'); $('#drop-' + id).addClass('drophide'); $('#drop-' + id).removeClass('iconspacer');},
-
- function() {
- id = $(this).attr('id');
- $('#drop-' + id).removeClass('icon');$('#drop-' + id).removeClass('drophide'); $('#drop-' + id).addClass('iconspacer');}
- );
-
-});
-
-
-
diff --git a/view/theme/fancyred/php/config.php b/view/theme/fancyred/php/config.php
deleted file mode 100644
index 833d09050..000000000
--- a/view/theme/fancyred/php/config.php
+++ /dev/null
@@ -1,80 +0,0 @@
-<?php
-/**
- * Theme settings
- */
-
-function theme_content(&$a) {
- if(!local_user()) { return; }
-
- $font_size = get_pconfig(local_user(),'fancyred', 'font_size' );
- $line_height = get_pconfig(local_user(), 'fancyred', 'line_height' );
- $colour = get_pconfig(local_user(), 'fancyred', 'colour' );
-
- return fancyred_form($a, $font_size, $line_height, $colour);
-}
-
-function theme_post(&$a) {
- if(!local_user()) { return; }
-
- if (isset($_POST['fancyred-settings-submit'])) {
- set_pconfig(local_user(), 'fancyred', 'font_size', $_POST['fancyred_font_size']);
- set_pconfig(local_user(), 'fancyred', 'line_height', $_POST['fancyred_line_height']);
- set_pconfig(local_user(), 'fancyred', 'colour', $_POST['fancyred_colour']);
- }
-}
-
-function theme_admin(&$a) {
- $font_size = get_config('fancyred', 'font_size' );
- $line_height = get_config('fancyred', 'line_height' );
- $colour = get_config('fancyred', 'colour' );
-
- return fancyred_form($a, $font_size, $line_height, $colour);
-}
-
-function theme_admin_post(&$a) {
- if (isset($_POST['fancyred-settings-submit'])) {
- set_config('fancyred', 'font_size', $_POST['fancyred_font_size']);
- set_config('fancyred', 'line_height', $_POST['fancyred_line_height']);
- set_config('fancyred', 'colour', $_POST['fancyred_colour']);
- }
-}
-
-function fancyred_form(&$a, $font_size, $line_height, $colour) {
- $line_heights = array(
- "1.3" => "1.3",
- "---" => "---",
- "1.6" => "1.6",
- "1.5" => "1.5",
- "1.4" => "1.4",
- "1.2" => "1.2",
- "1.1" => "1.1",
- );
- $font_sizes = array(
- '12' => '12',
- '14' => '14',
- "---" => "---",
- "16" => "16",
- "15" => "15",
- '13.5' => '13.5',
- '13' => '13',
- '12.5' => '12.5',
- '12' => '12',
- );
- $colours = array(
- 'light' => 'light',
- 'dark' => 'dark',
- );
-
- $t = get_markup_template('theme_settings.tpl');
- $o .= replace_macros($t, array(
- '$submit' => t('Submit'),
- '$baseurl' => $a->get_baseurl(),
- '$title' => t("Theme settings"),
- '$font_size' => array('fancyred_font_size', t('Set font-size for posts and comments'), $font_size, '', $font_sizes),
- '$line_height' => array('fancyred_line_height', t('Set line-height for posts and comments'), $line_height, '', $line_heights),
- '$colour' => array('fancyred_colour', t('Set colour scheme'), $colour, '', $colours),
- ));
-
- return $o;
-}
-
diff --git a/view/theme/fancyred/php/style.php b/view/theme/fancyred/php/style.php
deleted file mode 100644
index 15ac47247..000000000
--- a/view/theme/fancyred/php/style.php
+++ /dev/null
@@ -1,99 +0,0 @@
-<?php
- $line_height = false;
- $fancyred_font_size = false;
- $resolution = false;
- $colour = false;
- $site_line_height = get_config("fancyred","line_height");
- $site_fancyred_font_size = get_config("fancyred", "font_size" );
- $site_colour = get_config("fancyred", "colour" );
-
- if (local_user()) {
- $line_height = get_pconfig(local_user(), "fancyred","line_height");
- $fancyred_font_size = get_pconfig(local_user(), "fancyred", "font_size");
- $colour = get_pconfig(local_user(), "fancyred", "colour");
- }
-
- if ($line_height === false) {
- $line_height = $site_line_height;
- }
- if ($line_height === false) {
- $line_height = "1.2";
- }
- if ($fancyred_font_size === false) {
- $fancyred_font_size = $site_fancyred_font_size;
- }
- if ($fancyred_font_size === false) {
- $fancyred_font_size = "12";
- }
- if ($colour === false) {
- $colour = $site_colour;
- }
- $colour = "light";
-
-
- if (file_exists("$THEMEPATH/css/style.css")) {
- echo file_get_contents("$THEMEPATH/css/style.css");
- }
-
-
- if($fancyred_font_size == "16") {
- echo ".wall-item-content {
- font-size: 16px;
- }";
- }
- if($fancyred_font_size == "15") {
- echo ".wall-item-content {
- font-size: 15px;
- }";
- }
- if($fancyred_font_size == "14") {
- echo ".wall-item-content {
- font-size: 14px;
- }";
- }
- if($fancyred_font_size == "13.5") {
- echo ".wall-item-content {
- font-size: 13.5px;
- }";
- }
- if($fancyred_font_size == "13") {
- echo ".wall-item-content {
- font-size: 13px;
- }";
- }
- if($fancyred_font_size == "12.5") {
- echo ".wall-item-content {
- font-size: 12.5px;
- }";
- }
- if($fancyred_font_size == "12") {
- echo ".wall-item-content {
- font-size: 12px;
- }";
- }
- if($line_height == "1.5") {
- echo ".wall-item-content {
- line-height: 1.5;
- }";
- }
- if($line_height == "1.4") {
- echo ".wall-item-content {
- line-height: 1.4;
- }";
- }
- if($line_height == "1.3") {
- echo ".wall-item-content {
- line-height: 1.3;
- }";
- }
- if($line_height == "1.2") {
- echo ".wall-item-content {
- line-height: 1.2;
- }";
- }
- if($line_height == "1.1") {
- echo ".wall-item-content {
- line-height: 1.1;
- }";
- }
-
diff --git a/view/theme/fancyred/php/theme.php b/view/theme/fancyred/php/theme.php
deleted file mode 100644
index 1ac6d4d21..000000000
--- a/view/theme/fancyred/php/theme.php
+++ /dev/null
@@ -1,6 +0,0 @@
-<?php
-
-function fancyred_init(&$a) {
- $a->set_template_engine('smarty3');
-// head_add_js('redbasic.js');
-}
diff --git a/view/theme/fancyred/tpl/smarty3/theme_settings.tpl b/view/theme/fancyred/tpl/smarty3/theme_settings.tpl
deleted file mode 100644
index 3401f318b..000000000
--- a/view/theme/fancyred/tpl/smarty3/theme_settings.tpl
+++ /dev/null
@@ -1,12 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-{{include file="field_select.tpl" field=$font_size}}
-
-{{include file="field_select.tpl" field=$line_height}}
-
-<div class="settings-submit-wrapper">
- <input type="submit" value="{{$submit}}" class="settings-submit" name="fancyred-settings-submit" />
-</div>
diff --git a/view/theme/fancyred/tpl/theme_settings.tpl b/view/theme/fancyred/tpl/theme_settings.tpl
deleted file mode 100644
index 797b29962..000000000
--- a/view/theme/fancyred/tpl/theme_settings.tpl
+++ /dev/null
@@ -1,7 +0,0 @@
-{{inc field_select.tpl with $field=$font_size}}{{endinc}}
-
-{{inc field_select.tpl with $field=$line_height}}{{endinc}}
-
-<div class="settings-submit-wrapper">
- <input type="submit" value="$submit" class="settings-submit" name="fancyred-settings-submit" />
-</div>
diff --git a/view/theme/redbasic/css/dark.css b/view/theme/redbasic/css/dark.css
new file mode 100644
index 000000000..3bcf15bc9
--- /dev/null
+++ b/view/theme/redbasic/css/dark.css
@@ -0,0 +1,186 @@
+/* This file is deprecated. We'll keep it here as reference until somebody
+defines a dark colour scheme */
+
+
+body { font-family: sans-serif;
+ font-size: 12px;
+ background-color: #101010;
+ background-image: -moz-linear-gradient(top, #000 16%, #101010 82%);
+ background-image: linear-gradient(bottom, #000 16%, #101010 82%);
+ background-image: -o-linear-gradient(bottom, #000 16%, #101010 82%);
+ background-image: -webkit-linear-gradient(bottom, #000 16%, #101010 82%);
+ background-image: -ms-linear-gradient(bottom, #000 16%, #101010 82%);
+ background-repeat: no-repeat;
+ background-attachment: fixed;
+ color: #eec;
+
+}
+
+aside {
+border: none;
+color: #fff;
+}
+
+.fn {
+ color: #fff;
+}
+
+.acl-list-item,
+.profile-jot-net {
+ color: #000;
+}
+
+
+.tab.active {
+ color: #fff;
+}
+
+blockquote {color: #000;}
+
+.wall-item-content-wrapper {
+ background: #262626;
+ border-radius: 5px;
+ box-shadow: 12px 12px 12px #000;
+ margin-bottom: 20px;
+}
+
+.wall-item-content-wrapper.comment {
+ margin-left: 50px;
+ box-shadow: 5px 5px 5px #000;
+}
+
+.comment-edit-text-empty, .comment-edit-text-full {
+ border-radius: 5px 5px 5px 5px;
+ box-shadow: 5px 5px 5px #000 inset;
+}
+
+
+#profile-jot-text {
+ height: 20px;
+ color:#000;
+ border: 1px solid #cccccc;
+ padding: 8px;
+ margin-right: 0px;
+ width: 90%;
+ -moz-border-radius: 5px;
+ border-radius: 5px;
+ box-shadow: 4px 4px 3px 0 #666 inset;
+}
+#profile-jot-text:hover {
+ color: #000000;
+}
+
+#profile-jot-submit {
+ height: auto;
+ background-color: #0080FF;
+ color: #eeeeec;
+ font-weight: bold;
+ -webkit-border-radius: 5px;
+ -moz-border-radius: 5px;
+ border-radius: 5px;
+ border: 2px outset #222420 !important;
+ margin: 0;
+ float: right;
+ text-shadow: 1px 1px #111;
+ width: auto;
+ box-shadow: 5px 5px 5px #444;
+}
+
+
+.widget {
+ border-bottom: 1px solid #eec;
+ padding: 8px;
+ margin-top: 5px;
+ -moz-border-radius:5px;
+ -webkit-border-radius:5px;
+ border-radius:5px;
+
+}
+
+nav a,
+nav a:active,
+nav a:visited,
+nav a:link {
+ color: #ffffff;
+ text-decoration: none;
+ outline: none;
+}
+
+.nav-menu.selected a {
+ color: #0080ff !important;
+}
+
+nav .nav-menu-icon {
+ position: relative;
+ height: 22px;
+ padding: 5px;
+/* margin: 3px 10px; */
+ -moz-border-radius: 5px 5px 0 0;
+ -webkit-border-radius: 5px 5px 0 0;
+ border-radius: 5px 5px 0 0;
+}
+
+nav .nav-notify {
+ background-color: #0080FF;
+ color: #fff;
+ -moz-border-radius: 5px 5px 5px 5px;
+ -webkit-border-radius: 5px 5px 5px 5px;
+ border-radius: 5px 5px 5px 5px;
+ opacity: 0.6;
+ filter:alpha(opacity=60);
+
+}
+.nav-notify:hover, nav .nav-notify.selected span {
+ color: #ffffff;
+}
+
+ul.menu-popup {
+
+ position: absolute;
+ display: none;
+ width: 10em;
+ background: #000;
+ color: #fff;
+ padding: 0px;
+ list-style: none;
+ border-radius: 0px 0px 20px 20px;
+ z-index: 100000;
+ -webkit-box-shadow: 0px 5px 10px rgba(0, 0, 0, 0.7);
+ -moz-box-shadow: 0px 5px 10px rgba(0, 0, 0, 0.7);
+ box-shadow: 0px 5px 10px rgba(0, 0, 0, 0.7);
+}
+ul.menu-popup a {
+ display: block;
+ color: #FFFFFF;
+ padding: 5px 10px;
+ text-decoration: none;
+}
+
+
+ul.menu-popup a:hover {
+ background-color: #888888;
+ color: #FFFFFF;
+}
+ul.menu-popup .menu-sep {
+ border-top: 1px solid #9eabb0;
+}
+
+.wall-item-photo,
+.photo,
+.contact-block-img,
+.my-comment-photo {
+ border-radius: 5px;
+ box-shadow: 4px 4px 3px #000;
+}
+
+
+div#pagelist-content-wrapper {
+width: 80%;
+background: #111;
+margin-left: auto;
+margin-right: auto;
+}
+
+div.page-list-item {
+margin: 20px;
+}
diff --git a/view/theme/redbasic/css/fancy.css b/view/theme/redbasic/css/fancy.css
new file mode 100644
index 000000000..9b8899d2f
--- /dev/null
+++ b/view/theme/redbasic/css/fancy.css
@@ -0,0 +1,107 @@
+/*This file is deprecated. We'll keep it for reference until we provide window decorations */
+
+
+aside {
+border-radius: $radiuspx;}
+
+
+.tab {
+ height: auto;
+ background-color: #f00;
+ color: #fff !important;
+ font-weight: bold;
+ -webkit-border-radius: $radiuspx;
+ -moz-border-radius: $radiuspx;
+ border-radius: $radiuspx;
+ margin: 0;
+ width: auto;
+ margin-left: 8px;
+ padding: 4px;
+ text-align: center;
+}
+.tab:hover, .tab.active:hover {
+ background: #d00;
+ color: #fff;
+ ;
+}
+.tab:active {
+ background: #fff;
+ color: #f00;
+}
+.tab.active {
+ background: #f00;
+ color: #fff;
+ box-shadow: 3px 3px 3px #333 inset;
+ padding: 5px; /* strageness of the human mind - has to be larger than inactive tabs, or it looks smaller than them */
+}
+
+
+
+.wall-item-content-wrapper {
+ position: relative;
+ border-radius: $radiuspx;
+ box-shadow: 8px 8px 8px #000;
+ border: 1px solid #eec;
+}
+
+.wall-item-content-wrapper.comment {
+ margin-top: 15px;
+}
+
+.wall-item-like:hover, .wall-item-dislike:hover{
+opacity: 1;
+}
+
+.wall-item-author {
+ margin-top: 10px;
+}
+
+.comment-edit-wrapper {
+ margin-top: 15px;
+ background: #ffffff;
+ margin-left: 50px;
+}
+
+#profile-jot-submit {
+ background-color: #dd0000;
+}
+
+ul.menu-popup {
+ background: #dd0000;
+ color: #eec;
+ border-radius: $radiuspx;
+ z-index: 100000;
+ -webkit-box-shadow: 0px 5px 10px rgba(0, 0, 0, 0.7);
+ -moz-box-shadow: 0px 5px 10px rgba(0, 0, 0, 0.7);
+ box-shadow: 0px 5px 10px rgba(0, 0, 0, 0.7);
+}
+ul.menu-popup a {
+ color: #eec;
+}
+ul.menu-popup a:hover {
+ background-color: #eec;
+ color: #f00;
+}
+
+section {
+left: 0px;
+width: 800px;
+margin-left: auto;
+margin-right: auto;
+}
+body {background-color: #d00 !important;}
+
+.page-content-wrapper {background: #fff;
+ color: #000;
+ border-radius: 20px;
+ box-shadow: 5px 5px 5px #111;
+}
+
+h3.page-title {
+padding-top: 30px;
+ color: #033}
+.page-body {padding: 40px;}
+
+.page-body strong {color: #033;}
+
+.nav-links {margin-top: 5px;}
diff --git a/view/theme/redbasic/css/mod_page.css b/view/theme/redbasic/css/mod_page.css
new file mode 100644
index 000000000..37f597fac
--- /dev/null
+++ b/view/theme/redbasic/css/mod_page.css
@@ -0,0 +1,24 @@
+/*
+section {
+left: 0px;
+width: 800px;
+margin-left: auto;
+margin-right: auto;
+}
+body {background-color: #d00 !important;}
+
+.page-content-wrapper {background: #fff;
+ color: #000;
+ border-radius: 20px;
+ box-shadow: 5px 5px 5px #111;
+}
+
+h3.page-title {
+padding-top: 30px;
+ color: #033}
+.page-body {padding: 40px;}
+
+.page-body strong {color: #033;}
+
+.nav-links {margin-top: 5px;}
+*/ \ No newline at end of file
diff --git a/view/theme/redbasic/css/sloppy_photos.css b/view/theme/redbasic/css/sloppy_photos.css
new file mode 100644
index 000000000..78aedc9cc
--- /dev/null
+++ b/view/theme/redbasic/css/sloppy_photos.css
@@ -0,0 +1,58 @@
+
+.rotleft1 {
+-webkit-transform: rotate(-1deg);
+-moz-transform: rotate(-1deg);
+-ms-transform: rotate(-1deg);
+-o-transform: rotate(-1deg);
+}
+
+.rotleft2 {
+-webkit-transform: rotate(-2deg);
+-moz-transform: rotate(-2deg);
+-ms-transform: rotate(-2deg);
+-o-transform: rotate(-2deg);
+}
+
+.rotleft3 {
+-webkit-transform: rotate(-3deg);
+-moz-transform: rotate(-3deg);
+-ms-transform: rotate(-3deg);
+-o-transform: rotate(-3deg);
+}
+
+.rotleft4 {
+-webkit-transform: rotate(-4deg);
+-moz-transform: rotate(-4deg);
+-ms-transform: rotate(-4deg);
+-o-transform: rotate(-4deg);
+}
+
+
+.rotright1 {
+-webkit-transform: rotate(1deg);
+-moz-transform: rotate(1deg);
+-ms-transform: rotate(1deg);
+-o-transform: rotate(1deg);
+}
+
+.rotright2 {
+-webkit-transform: rotate(2deg);
+-moz-transform: rotate(2deg);
+-ms-transform: rotate(2deg);
+-o-transform: rotate(2deg);
+}
+
+.rotright3 {
+-webkit-transform: rotate(3deg);
+-moz-transform: rotate(3deg);
+-ms-transform: rotate(3deg);
+-o-transform: rotate(3deg);
+}
+
+.rotright4 {
+-webkit-transform: rotate(4deg);
+-moz-transform: rotate(4deg);
+-ms-transform: rotate(4deg);
+-o-transform: rotate(4deg);
+}
+
diff --git a/view/theme/redbasic/css/style.css b/view/theme/redbasic/css/style.css
index db73e27d5..f039b7374 100644
--- a/view/theme/redbasic/css/style.css
+++ b/view/theme/redbasic/css/style.css
@@ -8,25 +8,23 @@
/* generals */
body {
- font-family: arial,freesans,clean,sans-serif;
- font-size: 12px;
- background-color: #ffffff;
- color: #000000;
+ font-family: arial,freesans,sans-serif;
+ font-size: $body_font_size;
+ background-color: $bgcolour;
+ background-image: url('$background_image');
+ background-attachment: fixed;
+ background-size: cover;
+ color: $font_colour;
margin: 0px;
}
.jslider {
- font-family: arial,freesans,clean,sans-serif;
+ font-family: arial,freesans,sans-serif;
}
abbr {
border-bottom: none;
}
-aside {
-border: none;
-color: #444444;
-}
-
/* icons */
.icon {
background-color: transparent ;
@@ -39,67 +37,6 @@ color: #444444;
.icon.text {
text-indent: 0px;
}
-.icon.notify {
- background-image: url("../img/notify_on.png");
- min-width: 22px;
- height: 22px;
- margin-top: -4px;
- background-position: left center;
- padding: 1px;
-}
-.icon.gear {
- background-image: url("../img/settings.png");
- min-width: 22px;
- height: 22px;
- margin-top: -2px;
- background-position: left center;
- padding: 1px;
-}
-
-.icon.home {
- background-image: url("../img/home.png");
- min-width: 22px;
- height: 22px;
- margin-top: -4px;
- background-position: left center;
- padding: 1px;
-}
-
-.icon.network {
- background-image: url("../img/network.png");
- min-width: 22px;
- height: 22px;
- margin-top: -3px;
- background-position: left center;
- padding: 1px;
-}
-
-.icon.introductions {
- background-image: url("../img/introductions.png");
- min-width: 22px;
- height: 22px;
- margin-top: -4px;
- background-position: left center;
- padding: 1px;
-}
-
-.icon.mail {
- background-image: url("../img/message.png");
- min-width: 22px;
- height: 22px;
- margin-top: -2px;
- background-position: left center;
- padding: 1px;
-}
-
-.icon.events {
- background-image: url("../img/events.png");
- min-width: 22px;
- height: 22px;
- margin-top: -4px;
- background-position: left center;
- padding: 1px;
-}
a, a:visited, a:link, .fakelink, .fakelink:visited, .fakelink:link {
font-weight: bold;
@@ -113,15 +50,29 @@ a:hover, .fakelink:hover { color: #44AAFF; text-decoration: underline; }
cursor: pointer;
}
+
+input[type="text"],
+input[type="password"],
+input[type="submit"],
+select,
+textarea {
+ font-family: arial,freesans,sans-serif;
+ font-size: $body_font_size;
+}
+
input {
border: 1px solid #666666;
- -moz-border-radius: 5px;
- border-radius: 5px;
+ -moz-border-radius: $radiuspx;
+ border-radius: $radiuspx;
padding: 3px;
}
-img { border :0px; }
-
+input[type="submit"] {
+ background-color: #F0F0F0;
+ font-weight: bold;
+ color: #0080FF;
+ text-decoration: none;
+}
code {
font-family: Courier, monospace;
@@ -139,6 +90,7 @@ blockquote {
background-color: #f4f8f9;
border-left: 4px solid #dae4ee;
padding: 0.4em;
+ color: #000;
}
.ccollapse-wrapper {
@@ -146,10 +98,6 @@ blockquote {
padding: 5px;
}
-.hide-comments {
- margin-left: 5px;
-}
-
#panel {
background-color: ivory;
position: absolute;
@@ -167,13 +115,6 @@ blockquote {
-/* nav */
-
-nav {
- display: block;
- border-bottom: 1px solid #d00;
-}
-
#langselector {
position: fixed;
top: 3px;
@@ -189,6 +130,30 @@ nav {
filter:alpha(opacity=100);
}
+nav {
+ background-image: linear-gradient(bottom, $nav_bg_1 26%, $nav_bg_2 82%);
+ background-image: -o-linear-gradient(bottom, $nav_bg_1 26%, $nav_bg_2 82%);
+ background-image: -moz-linear-gradient(bottom,$nav_bg_1 26%, $nav_bg_2 82%);
+ background-image: -webkit-linear-gradient(bottom, $nav_bg_1 26%, $nav_bg_2 82%);
+ background-image: -ms-linear-gradient(bottom, $nav_bg_1 26%, $nav_bg_2 82%);
+ opacity: $nav_float_min_opacity;
+ filter:alpha(opacity=$nav_percent_min_opacity);
+
+}
+
+
+
+nav:hover {
+ background-image: linear-gradient(bottom, $nav_bg_3 26%, $nav_bg_4 82%);
+ background-image: -o-linear-gradient(bottom, $nav_bg_3 26%, $nav_bg_4 82%);
+ background-image: -moz-linear-gradient(bottom, $nav_bg_3 26%, $nav_bg_4 82%);
+ background-image: -webkit-linear-gradient(bottom, $nav_bg_3 26%, $nav_bg_4 82%);
+ background-image: -ms-linear-gradient(bottom, $nav_bg_3 26%, $nav_bg_4 82%);
+ opacity: 1.0;
+ filter:alpha(opacity=100);
+
+}
+
nav #site-location {
color: #888a85;
@@ -207,10 +172,10 @@ nav #site-location {
.info-message {
font-size: 1.1em;
border: 1px solid #444;
- background-color: #ccc;
+ background-color: #F0F0F0;
padding: 10px;
- -moz-border-radius: 5px;
- border-radius: 5px;
+ -moz-border-radius: $radiuspx;
+ border-radius: $radiuspx;
}
@@ -229,21 +194,21 @@ header #site-location {
}
header #banner {
+
overflow: hidden;
text-align: center;
- width: 100%;
- font-size: 2.2em;
+ font-size: 1.4em;
font-family: tahoma, "Lucida Sans", sans;
- color: #eec;
+ color: $banner_colour;
font-weight: bold;
-
+ margin-top: 1px;
}
header #banner a,
header #banner a:active,
header #banner a:visited,
header #banner a:link,
header #banner a:hover {
- color: #eec;
+ color: #FFF;
text-decoration: none;
outline: none;
vertical-align: bottom;
@@ -256,7 +221,7 @@ header #banner #logo-text {
font-size: 22px;
}
-.nav-commlink {
+.nav-commlink, .nav-login-link {
display: block;
height: 15px;
margin-top: 67px;
@@ -268,8 +233,8 @@ header #banner #logo-text {
border-bottom: 0px;
background-color: #aec0d3;
color: #565854;
- -moz-border-radius: 5px 5px 0px 0px;
- border-radius: 5px 5px 0px 0px;
+ -moz-border-radius: $radiuspx;
+ border-radius: $radiuspx;
}
nav .nav-link {
@@ -279,7 +244,7 @@ nav .nav-link {
background-color: transparent !important;
}
-.nav-commlink.selected {
+.nav-commlink.active {
background-color: #ffffff;
border-bottom: 1px solid #ffffff;
color: #000000 !important;
@@ -300,22 +265,20 @@ nav #nav-link-wrapper .nav-link {
}
.tabs {
- height: 22px;
+ height: 28px;
border-bottom: 1px solid #aaaaaa;
padding:0px;
- margin-right: 10px;
+ width: 90%;
}
.tabs li { margin: 0px; list-style: none; }
.tab {
display:block;
float:left;
- padding: 0.4em;
- margin-right: 3px ;
+ margin-right: 15px ;
}
.tab.active {
-/* font-weight: bold; */
color: #444444;
}
@@ -324,27 +287,31 @@ ul.tabs {
margin-bottom: 0px;
list-style-type: none;
padding: 0px;
+ padding-right: 8px;
}
/* footer */
footer {
+ position:fixed;
+ bottom:1px;
text-align: right;
padding-bottom: 1em;
padding-right: 3em;
}
-#powered-by {
- position: fixed;
- bottom: 1px;
- left: 15px;
- opacity: 0.3;
- filter:alpha(opacity=30);
-
+.birthday-today, .event-today {
+ font-weight: bold;
}
-.birthday-today, .event-today {
+.warning-text {
+ font-size: 1.2em;
font-weight: bold;
+ color: #ff0000;
+}
+
+#noperm-msg {
+ margin-top: 15px;
}
.preview {
@@ -355,86 +322,14 @@ footer {
margin: 15px 0 15px 150px;
}
-/* from default */
-#jot-perms-icon,
-#profile-location,
-#profile-nolocation,
-#profile-youtube,
-#profile-video,
-#profile-audio,
-#profile-link,
-#profile-title,
-#wall-image-upload,
-#wall-file-upload,
-#profile-upload-wrapper,
-#wall-image-upload-div,
-#wall-file-upload-div,
-.hover, .focus {
- cursor: pointer;
-}
-
-#jot-perms-icon {
- float: left;
-}
-
-#jot-title, #jot-category {
- border: 0px;
- margin: 0px;
- padding: 8px;
- height: 20px;
- width: 530px;
- margin-bottom: 5px;
- font-weight: bold;
- border: solid 1px #ccc;
- border-radius: 5px;
-}
-
-#jot-title::-webkit-input-placeholder{font-weight: bold;}
-#jot-category::-webkit-input-placeholder{font-weight: bold;}
-#jot-title:-moz-placeholder{font-weight: bold;}
-#jot-category:-moz-placeholder{font-weight: bold;}
-
-#jot-title:hover,
-#jot-title:focus,
-#jot-category:hover,
-#jot-category:focus {
- border: 1px solid #cccccc;
-}
-
-.jothidden { display:none; }
-
-
-
.fakebutton {
margin-top: 15px;
margin-bottom: 15px;
}
-.lockview {
- cursor: pointer;
-}
-
-
-#group-sidebar {
- margin-bottom: 10px;
-}
-
-.group-selected, .nets-selected, .fileas-selected, .categories-selected {
- padding: 3px;
- -moz-border-radius: 5px;
- border-radius: 5px;
- border: 1px solid #CCCCCC;
- background: #F8F8F8;
- font-weight: bold;
-}
-
-.settings-widget .selected {
- padding: 3px;
- -moz-border-radius: 5px;
- border-radius: 5px;
- border: 1px solid #CCCCCC;
- background: #F8F8F8;
- font-weight: bold;
+/*TODO: we should use one class for all this. */
+.group-selected, .fileas-selected, .categories-selected, .search-selected, .active {
+ color: #444444 !important;
}
.smalltext {
@@ -495,9 +390,9 @@ footer {
clear: both;
}
-#register-link, #lost-password-link {
+#register-link,
+#lost-password-link {
float: left;
- font-size: 90%;
margin-left: 100px;
}
@@ -509,65 +404,8 @@ footer {
margin-left: 100px;
margin-top: 10px;
-/* margin-left: 200px; */
-}
-
-
-/* TODO - we don't use DFRN anymore. These probably have different names now. Check and clean up later */
-
-input#dfrn-url {
- float: left;
- background: url(../img/friendika-16.png) no-repeat;
- background-position: 2px center;
- font-size: 17px;
- padding-left: 21px;
- height: 21px;
- background-color: #FFFFFF;
- color: #000000;
- margin-bottom: 20px;
-}
-
-#dfrn-url-label {
- float: left;
- width: 250px;
-}
-
-#dfrn-request-url-end {
- clear: both;
-}
-
-#knowyouyes, #knowyouno {
- float: left;
}
-#dfrn-request-knowyou-yes-wrapper, #dfrn-request-knowyou-no-wrapper {
-
- float: none;
-}
-#dfrn-request-knowyou-yes-label, #dfrn-request-knowyou-no-label {
- float: left;
- width: 75px;
- margin-left: 50px;
- margin-bottom: 7px;
-}
-#dfrn-request-knowyou-break, #dfrn-request-knowyou-end {
- clear: both;
-
-}
-
-#dfrn-request-message-wrapper {
- margin-bottom: 50px;
-}
-#dfrn-request-submit-wrapper {
- clear: both;
- margin-left: 50px;
-}
-
-#dfrn-request-info-wrapper {
- margin-left: 50px;
-}
-
-
#cropimage-wrapper, #cropimage-preview-wrapper {
float: left;
@@ -579,67 +417,7 @@ input#dfrn-url {
clear: both;
}
-.intro-wrapper {
- margin-top: 20px;
-}
-
-.intro-fullname {
- font-size: 1.1em;
- font-weight: bold;
-
-}
-.intro-desc {
- margin-bottom: 20px;
- font-weight: bold;
-}
-
-.intro-note {
- padding: 10px;
-}
-
-.intro-end {
- padding: 30px;
-}
-
-.intro-form {
- float: left;
-}
-.intro-approve-form {
- clear: both;
-}
-.intro-approve-as-friend-end {
- clear: both;
-}
-.intro-submit-approve, .intro-submit-ignore {
- margin-right: 20px;
-}
-.intro-submit-approve {
- margin-top: 15px;
-}
-
-.intro-approve-as-friend-label, .intro-approve-as-fan-label {
- float: left;
- width: 100px;
- margin-left: 20px;
-}
-.intro-approve-as-friend, .intro-approve-as-fan {
- float: left;
-}
-.intro-form-end {
- clear: both;
-}
-.intro-approve-as-friend-desc {
- margin-top: 15px;
-}
-.intro-approve-as-end {
- clear: both;
- margin-bottom: 10px;
-}
-.intro-end {
- clear: both;
- margin-bottom: 30px;
-}
.aprofile dt {
font-weight: bold;
}
@@ -677,28 +455,13 @@ input#dfrn-url {
clear: both;
}
-#birthday-title {
- float: left;
- font-weight: bold;
-}
-
-#birthday-adjust {
- float: left;
- font-size: 75%;
- margin-left: 10px;
+.vcard-profile-edit-icon {
+ font-size: 1.2em;
}
-
-#birthday-title-end {
- clear: both;
+.vcard-profile-edit-icon:hover {
+ text-decoration: none;
}
-.birthday-list {
- margin-left: 15px;
-}
-
-#birthday-wrapper {
- margin-bottom: 20px;
-}
#profile-extra-links {
clear: both;
@@ -750,42 +513,7 @@ input#dfrn-url {
#viewconnections {
margin-top: 15px;
}
-#profile-edit-default-desc {
- color: #FF0000;
- border: 1px solid #FF8888;
- background-color: #FFEEEE;
- padding: 7px;
-}
-
-#profile-edit-clone-link-wrapper {
- float: left;
- margin-left: 50px;
- margin-bottom: 20px;
- width: 300px;
-}
-
-
-#profile-edit-links-end {
- clear: both;
- margin-bottom: 15px;
-}
-
-.profile-listing-photo {
- border: none;
-}
-
-.profile-edit-submit-wrapper {
- margin-top: 20px;
- margin-bottom: 20px;
-}
-
-#profile-photo-link-select-wrapper {
- margin-top: 2em;
-}
-#profile-photo-submit-wrapper {
- margin-top: 10px;
-}
#profile-photo-wrapper img {
width:175px;
@@ -800,72 +528,6 @@ input#dfrn-url {
}
-#profile-edit-profile-name-label,
-#profile-edit-name-label,
-#profile-edit-pdesc-label,
-#profile-edit-gender-label,
-#profile-edit-dob-label,
-#profile-edit-address-label,
-#profile-edit-locality-label,
-#profile-edit-region-label,
-#profile-edit-postal-code-label,
-#profile-edit-country-name-label,
-#profile-edit-marital-label,
-#profile-edit-sexual-label,
-#profile-edit-politic-label,
-#profile-edit-religion-label,
-#profile-edit-pubkeywords-label,
-#profile-edit-prvkeywords-label,
-#profile-edit-homepage-label,
-#profile-edit-hometown-label {
- float: left;
- width: 175px;
-}
-
-#profile-edit-profile-name,
-#profile-edit-name,
-#profile-edit-pdesc,
-#gender-select,
-#profile-edit-dob,
-#profile-edit-address,
-#profile-edit-locality,
-#profile-edit-region,
-#profile-edit-postal-code,
-#profile-edit-country-name,
-#marital-select,
-#sexual-select,
-#profile-edit-politic,
-#profile-edit-religion,
-#profile-edit-pubkeywords,
-#profile-edit-prvkeywords,
-#profile-in-dir-yes,
-#profile-in-dir-no,
-#profile-in-netdir-yes,
-#profile-in-netdir-no,
-#hide-wall-yes,
-#hide-wall-no,
-#hide-friends-yes,
-#hide-friends-no {
- float: left;
- margin-bottom: 20px;
-}
-#settings-normal,
-#settings-soapbox,
-#settings-freelove,
-#settings-community {
- float: left;
-}
-#settings-notifications label {
- margin-left: 20px;
-}
-#settings-notify-desc, #settings-activity-desc {
- font-weight: bold;
- margin-bottom: 15px;
-}
-#settings-pagetype-desc {
- color: #666666;
- margin-bottom: 15px;
-}
#profile-in-dir-yes-label,
#profile-in-dir-no-label,
@@ -880,10 +542,6 @@ input#dfrn-url {
width: 50px;
}
-#profile-edit-with-label {
- width: 175px;
- margin-left: 20px;
-}
#profile-publish-yes-reg,
#profile-publish-no-reg {
@@ -904,70 +562,6 @@ input#dfrn-url {
}
-#profile-edit-pdesc-desc,
-#profile-edit-pubkeywords-desc,
-#profile-edit-prvkeywords-desc {
- float: left;
- margin-left: 20px;
-}
-
-
-#profile-edit-homepage, #profile-edit-hometown {
- float: left;
- margin-bottom: 35px;
-}
-#settings-normal-label,
-#settings-soapbox-label,
-#settings-community-label,
-#settings-freelove-label {
- float: left;
- width: 200px;
-}
-#settings-normal-desc,
-#settings-soapbox-desc,
-#settings-community-desc,
-#settings-freelove-desc {
- /*float: left;
- margin-left: 75px;*/
- clear: left;
- color: #666666;
- display: block;
- margin-bottom: 20px
-}
-
-#profile-edit-profile-name-end,
-#profile-edit-name-end,
-#profile-edit-pdesc-end,
-#profile-edit-gender-end,
-#profile-edit-dob-end,
-#profile-edit-address-end,
-#profile-edit-locality-end,
-#profile-edit-region-end,
-#profile-edit-postal-code-end,
-#profile-edit-country-name-end,
-#profile-edit-marital-end,
-#profile-edit-sexual-end,
-#profile-edit-politic-end,
-#profile-edit-religion-end,
-#profile-edit-pubkeywords-end,
-#profile-edit-prvkeywords-end,
-#profile-edit-homepage-end,
-#profile-edit-hometown-end,
-#profile-in-dir-break,
-#profile-in-dir-end,
-#profile-in-netdir-break,
-#profile-in-netdir-end,
-#hide-wall-break,
-#hide-wall-end,
-#hide-friends-break,
-#hide-friends-end,
-#settings-normal-break,
-#settings-soapbox-break,
-#settings-community-break,
-#settings-freelove-break {
- clear: both;
-}
-
.settings-widget ul {
list-style-type: none;
padding: 0px;
@@ -979,493 +573,15 @@ input#dfrn-url {
}
-#gender-select, #marital-select, #sexual-select {
- width: 220px;
-}
-
-#profile-edit-profile-name-wrapper .required {
- color: #FF0000;
- float: left;
-}
-
-#contacts-main {
- margin-top: 20px;
- margin-bottom: 20px;
-}
-
-.contact-entry-wrapper {
- float: left;
- width: 120px;
- height: 120px;
- padding: 10px;
-}
-#contacts-search-end {
- margin-bottom: 10px;
-}
-
-.contact-entry-direction-icon {
- margin-top: 24px;
- margin-right: 2px;
-}
-
-.contact-entry-photo img {
- border: none;
-}
-.contact-entry-photo-end {
- clear: both;
-}
-.contact-entry-name {
- float: left;
- margin-left: 0px;
- margin-right: 10px;
- width: 120px;
- overflow: hidden;
-}
-.contact-entry-edit-links {
- margin-top: 6px;
- margin-left: 10px;
- width: 16px;
-}
-.contact-entry-nav-wrapper {
- float: left;
- margin-left: 10px;
-}
-
-.contact-entry-edit-links img {
- border: none;
- margin-right: 15px;
-}
-.contact-entry-photo {
- float: left;
- position: relative;
-}
-.contact-entry-end {
- clear: both;
-}
#fsuggest-desc, #fsuggest-submit-wrapper {
margin-top: 15px;
margin-bottom: 15px;
}
-#network-star-link{
- margin-top: 10px;
-}
-.network-star {
- float: left;
- margin-right: 5px;
-}
-#network-bmark-link {
- margin-top: 10px;
-}
-.thread-wrapper .wall-item-comment-wrapper {
- margin-left: 50px;
-}
-
-/* Give the top level post bigger shadows than the comments. This makes them appear "higher" and the comments "lower", which separates posts from each other reasonably without literally drawing a line under it */
-
-.wall-item-content-wrapper {
- margin-top: 10px;
- position: relative;
-/* background: #fff; */
-/* border-radius: 5px; */
-/* box-shadow: 12px 12px 12px #111; */
- border-left: 1px solid #eec;
-
-}
-.wall-item-content-wrapper.comment {
-/* background: #fff; */
- border-left: 1px solid #e0e0e0;
- margin-left: 50px;
-/* box-shadow: 5px 5px 5px #222; */
-}
-
.thread-end-wrapper {
margin-left: 50px;
}
-
-
-.wall-item-content-wrapper.comment {
- background: #ffffff;
- border-left: 1px solid #e0e0e0;
-
-}
-
-.wall-item-like.comment, .wall-item-dislike.comment {
- margin-left: 50px;
-}
-
-.wall-item-info {
- display: block;
- float: left;
- width:110px;
- margin-right:10px;
-}
-.comment .wall-item-info {
- width: 70px;
-}
-
-.wall-item-photo-wrapper {
- margin-top: 10px;
- margin-left: 10px;
- margin-bottom: 10px;
- width: 100px;
-}
-.wall-item-photo-menu-button {
- display: block;
- position: absolute;
- background-image: url("../img/photo-menu.jpg");
- background-position: top left;
- background-repeat: no-repeat;
- margin: 0px; padding: 0px;
- width: 16px;
- height: 16px;
- top: 74px; left:10px;
- overflow: hidden;
- text-indent: 40px;
- display: none;
-
-}
-.wall-item-photo-menu {
- width: auto;
- border: 2px solid #444444;
- background: #FFFFFF;
- position: absolute;
- left: 10px; top: 90px;
- display: none;
- z-index: 10000;
-}
-.wall-item-photo-menu ul { margin:0px; padding: 0px; list-style: none }
-.wall-item-photo-menu li a { display: block; padding: 2px; }
-.wall-item-photo-menu li a:hover { color: #FFFFFF; background: #3465A4; text-decoration: none; }
-
-
-.comment .wall-item-photo-menu-button { top: 44px;}
-.comment .wall-item-photo-menu { top: 60px; }
-
-.wallwall .wwto {
- left: 50px;
- margin: 0;
- position: absolute;
- top: 70px;
- width: 30px
-}
-.wallwall .wwto img {
- width: 30px !important;
- height: 30px !important;
-}
-
-.wallwall .wall-item-photo-end {
- clear: both;
-}
-
-.wall-item-arrowphoto-wrapper {
- position: absolute;
- left: 75px;
- top: 70px;
- z-index: 100;
-}
-.wall-item-wrapper {
- /*float: left;
- margin-right: 5px;
- width: 250px;*/
- margin-left:10px;
-}
-.wall-item-lock {
- /*height: 20px;*/
- /*margin-top: 10px;*/
- left: 105px;
- position: absolute;
- top: 1px;
-}
-.comment .wall-item-lock {
- left: 65px;
-}
-
-.wall-item-ago {
- color: #888888;
- font-size: 0.8em;
-}
-
-.wall-item-location {
- overflow: hidden;
- /* add ellipsis on text overflow */
- /* this work on safari, opera, ie, chrome. */
- /* firefox users have to wait support or we */
- /* can use a jquery plugin http://bit.ly/zJskg */
- text-overflow: ellipsis;
- -o-text-overflow: ellipsis;
- width: 100%;
-}
-
-
-.item-tool {
- float: left;
- margin-right: 8px;
-}
-
-.like-rotator {
- margin-left: 5px;
-}
-
-.wall-item-delete-wrapper {
- float: right;
-}
-
-.wall-item-delete-end {
- clear: both;
-}
-
-.wall-item-delete-icon {
- border: none;
-}
-
-.wall-item-wrapper-end {
- clear: both;
-}
-.wall-item-name-link {
- font-weight: bold;
- text-decoration: none;
- color: #3172BD;
-}
-.wall-item-photo {
- border: none;
-}
-.comment .wall-item-photo {
- width: 50px !important;
- height: 50px !important;
-}
-.wall-item-content {
- margin-left: 10px;
- overflow: auto;
-}
-
-.wall-item-content img {
- max-height: 95% !important;
- max-width: 95% !important;
-/* box-shadow: 8px 8px 8px #666; can't really have this because of smileys */
-}
-
-.wall-item-content img.smiley {
- box-shadow: none;
-}
-.wall-item-title {
- float: left;
- font-weight: bold;
- /*width: 450px;*/
-}
-
-.wall-item-title-end {
- clear: both;
-}
-
-.thread-wrapper.toplevel_item {
- width: 90%;
-}
-
-.wall-item-body {
-/* float: left; */
- /*width: 450px;*/
- margin-top: 10px;
-}
-
-.wall-item-tools {
- clear: both;
- padding: 5px 10px;
-}
-
-.wall-item-like, .wall-item-dislike {
- margin-left: 0px;
- margin-top: 3px;
-}
-
-.wall-item-author {
- margin-top: 10px;
-}
-
-.comment-edit-wrapper {
- margin-top: 15px;
- background: #ffffff;
- margin-left: 50px;
-}
-
-.comment-wwedit-wrapper {
- background: #ffffff;
-}
-
-.comment-edit-photo {
- margin-top: 10px;
- margin-left: 10px;
- margin-bottom: 10px;
- width: 100px;
- float: left;
-}
-.comment-wwedit-wrapper.threaded > .comment-edit-form > .comment-edit-photo {
- width: 40px;
-}
-
-.comment-edit-photo img {
- width: 25px;
-}
-.comment-edit-text-empty, .comment-edit-text-full {
- float: left;
- margin-top: 10px;
- padding: 3px 1px 1px 3px;
- border: 1px solid #ccc;
- padding: 8px;
- border-radius: 5px 5px 5px 5px;
-/* box-shadow: 5px 5px 5px #666 inset; */
-}
-
-.comment-edit-text-empty {
- color: gray;
- height: 1.5em;
- width: 80%; /*Too wide? */
- overflow: auto;
- margin-bottom: 10px;
-}
-
-.comment-wwedit-wrapper.threaded > .comment-edit-form > .comment-edit-text-empty {
- height: 1.5em;
-}
-
-.comment-edit-text-full {
- color: black;
- height: 150px;
- width: 80%;
- overflow: auto;
-}
-
-
-.comment-edit-text-end {
- clear: both;
-}
-
-.comment-edit-submit {
- margin: 10px 0px 10px 110px;
-}
-
-.comment-wwedit-wrapper.threaded > .comment-edit-form > .comment-edit-submit-wrapper > .comment-edit-submit {
- margin-left: 50px;
-}
-
-#profile-jot-plugin-wrapper,
-#profile-jot-submit-wrapper {
- margin-top: 15px;
- width:90%;
-}
-
-#profile-jot-submit {
- float: left;
-}
-#profile-upload-wrapper {
- float: left;
- margin-left: 30px;
-}
-#profile-attach-wrapper {
- float: left;
- margin-left: 30px;
-}
-#profile-rotator {
- float: left;
- margin-left: 30px;
-}
-#profile-link-wrapper {
- float: left;
- margin-left: 15px;
-}
-#profile-youtube-wrapper {
- float: left;
- margin-left: 15px;
-}
-#profile-video-wrapper {
- float: left;
- margin-left: 15px;
-}
-#profile-audio-wrapper {
- float: left;
- margin-left: 15px;
-}
-#profile-location-wrapper {
- float: left;
- margin-left: 15px;
-}
-#jot-preview-link {
- float: left;
- margin-left: 45px;
- margin-top: 0px !important;
-}
-
-
-#profile-nolocation-wrapper {
- float: left;
- margin-left: 15px;
-}
-#profile-title-wrapper {
- float: left;
- margin-left: 15px;
-}
-
-#profile-jot-perms {
- float: right;
- margin-left: 100px;
- font-weight: bold;
- font-size: 1.2em;
- height: auto;
- width: auto;
- background-color: #0080FF;
- border-radius: 5px;
- border: 2px outset;
- box-shadow: 5px 5px 5px #666;
- margin-right: 8px;
- padding: 4px;
-}
-
-#profile-jot-perms:active {
- box-shadow: 0 0 0 0;
-}
-
-#profile-jot-perms-end {
- /*clear: left;*/
- height: 30px;
-}
-
-#profile-jot-plugin-end{
- clear: both;
-}
-.profile-jot-net {
- float: left;
- margin-right: 10px;
- margin-top: 5px;
- margin-bottom: 5px;
-}
-
-#profile-jot-networks-end {
- clear: both;
-}
-
-#profile-jot-end {
- /*clear: both;*/
- margin-bottom: 30px;
-}
-#about-jot-submit-wrapper {
- margin-top: 15px;
-}
-#about-jot-end {
- margin-bottom: 30px;
-}
-#contacts-main {
- margin-bottom: 30px;
-}
-
-#profile-listing-desc {
- margin-left: 30px;
-}
-
-#profile-listing-new-link-wrapper {
- margin-left: 30px;
- margin-bottom: 30px;
-}
.profile-listing-photo-wrapper {
float: left;
}
@@ -1496,49 +612,12 @@ input#dfrn-url {
width: 200px;
}
-.fortune {
- margin-top: 50px;
- color: #4444FF;
- font-weight: bold;
- margin-bottom: 20px;
-}
-.directory-end {
- clear: both;
-}
-.directory-name {
- text-align: center;
-}
-.directory-photo {
- margin-left: 25px;
-}
+
.directory-details {
font-size: 0.7em;
- text-align: center;
- margin-left: 5px;
- margin-right: 5px;
-}
-.directory-item {
- float: left;
- width: 225px;
- height: 260px;
- overflow: auto;
-}
-
-#directory-search-wrapper {
- margin-top: 20px;
- margin-right: 20px;
- margin-bottom: 50px;
-}
-
-#directory-search-end {
-}
-
-.directory-photo-img {
- border: none;
}
-
.pager {
padding: 10px;
text-align: center;
@@ -1570,298 +649,14 @@ input#dfrn-url {
padding: 4px;
}
-
-#advanced-profile-name-wrapper,
-#advanced-profile-gender-wrapper,
-#advanced-profile-dob-wrapper,
-#advanced-profile-age-wrapper,
-#advanced-profile-marital-wrapper,
-#advanced-profile-sexual-wrapper,
-#advanced-profile-homepage-wrapper,
-#advanced-profile-politic-wrapper,
-#advanced-profile-religion-wrapper,
-#advanced-profile-about-wrapper,
-#advanced-profile-interest-wrapper,
-#advanced-profile-contact-wrapper,
-#advanced-profile-music-wrapper,
-#advanced-profile-book-wrapper,
-#advanced-profile-tv-wrapper,
-#advanced-profile-film-wrapper,
-#advanced-profile-romance-wrapper,
-#advanced-profile-work-wrapper,
-#advanced-profile-education-wrapper {
- margin-top: 20px;
-}
-
-#advanced-profile-name-text,
-#advanced-profile-gender-text,
-#advanced-profile-dob-text,
-#advanced-profile-age-text,
-#advanced-profile-marital-text,
-#advanced-profile-sexual-text,
-#advanced-profile-homepage-text,
-#advanced-profile-politic-text,
-#advanced-profile-religion-text,
-#advanced-profile-about-text,
-#advanced-profile-interest-text,
-#advanced-profile-contact-text,
-#advanced-profile-music-text,
-#advanced-profile-book-text,
-#advanced-profile-tv-text,
-#advanced-profile-film-text,
-#advanced-profile-romance-text,
-#advanced-profile-work-text,
-#advanced-profile-education-text {
- width: 300px;
- float: left;
-}
-
-#advanced-profile-name-end,
-#advanced-profile-gender-end,
-#advanced-profile-dob-end,
-#advanced-profile-age-end,
-#advanced-profile-marital-end,
-#advanced-profile-sexual-end,
-#advanced-profile-homepage-end,
-#advanced-profile-politic-end,
-#advanced-profile-religion-end {
- height: 10px;
-}
-
-#advanced-profile-about-end,
-#advanced-profile-interest-end,
-#advanced-profile-contact-end,
-#advanced-profile-music-end,
-#advanced-profile-book-end,
-#advanced-profile-tv-end,
-#advanced-profile-film-end,
-#advanced-profile-romance-end,
-#advanced-profile-work-end,
-#advanced-profile-education-end {
-
-
-}
-
-#advanced-profile-name,
-#advanced-profile-gender,
-#advanced-profile-dob,
-#advanced-profile-age,
-#advanced-profile-marital,
-#advanced-profile-sexual,
-#advanced-profile-homepage,
-#advanced-profile-politic,
-#advanced-profile-religion {
- float: left;
-
-}
-
-
-#advanced-profile-about,
-#advanced-profile-interest,
-#advanced-profile-contact,
-#advanced-profile-music,
-#advanced-profile-book,
-#advanced-profile-tv,
-#advanced-profile-film,
-#advanced-profile-romance,
-#advanced-profile-work,
-#advanced-profile-education {
- margin-top: 10px;
- margin-left: 50px;
- margin-right: 20px;
- padding: 10px;
- border: 1px solid #CCCCCC;
-}
-
-#advanced-profile-with {
- float: left;
- margin-left: 15px;
-}
-
-#contact-edit-wrapper {
- margin-top: 10px;
-}
-
-#contact-edit-banner-name {
- font-size: 1.4em;
- font-weight: bold;
-}
-
-#contact-edit-poll-wrapper {
- margin-top: 15px;
-}
-
-#contact-edit-poll-text {
- margin-top: 15px;
- margin-bottom: 5px;
-}
-
-#contact-edit-update-now {
- margin-top: 15px;
-}
-
-#contact-edit-links{
- clear: both;
-}
-
-#contact-edit-links ul {
- list-style: none;
- list-style-type: none;
- margin-left: 0px;
- padding-left: 0px;
-}
-
-#contact-edit-links li {
- margin-top: 5px;
-}
-
-#contact-edit-drop-link {
- float: right;
- margin-right: 20px;
-}
-
-#contact-edit-nav-end {
- clear: both;
-}
-
-#contact-edit-wrapper {
- width: 100%;
-}
-
-#contact-edit-end {
- clear: both;
- margin-top: 15px;
-}
-
-#contact-profile-selector {
- width: 175px;
- margin-left: 175px;
-}
-
-.contact-edit-submit {
- margin-top: 20px;
-}
-
-
-.contact-photo-menu-button {
- position: absolute;
- background-image: url("../img/photo-menu.jpg");
- background-position: top left;
- background-repeat: no-repeat;
- margin: 0px; padding: 0px;
- width: 16px;
- height: 16px;
- top: 64px; left:0px;
- overflow: hidden;
- text-indent: 40px;
- display: none;
-
-}
-.contact-photo-menu {
- width: auto;
- border: 2px solid #444444;
- background: #FFFFFF;
- position: absolute;
- left: 0px; top: 90px;
- display: none;
- z-index: 10000;
-}
-.contact-photo-menu ul { margin:0px; padding: 0px; list-style: none }
-.contact-photo-menu li a { display: block; padding: 2px; }
-.contact-photo-menu li a:hover { color: #FFFFFF; background: #3465A4; text-decoration: none; }
-
-
#block-message, #ignore-message, #archive-message, #lost-contact-message {
color: #FF0000;
}
-#profile-edit-insecure {
- margin-top: 20px;
- color: #FF0000;
- font-size: 1.1em;
- border: 1px solid #FF8888;
- background-color: #FFEEEE;
- padding-left: 5px;
- /*: 3px 3px 3px 5px; */
- width: 587px;
-}
-
-/* TinyMCE */
-
-DIV#profile-jot-text_toolbargroup{
-background: #FFF;
-border: 1px #111;
-/*box-shadow: 5px 5px 5px #000 inset;*/
-}
-
-/*
-#profile-jot-text_parent, .mceLayout {
- border-radius: 5px;
- -moz-border-radius: 5px;
- box-shadow: 4px 4px 3px 0 #444444;
-}
-*/
-
-
-iframe#profile-jot-text_ifr {
-width: 100% !important;
-height: 100% !important;
-box-shadow: 5px 5px 5px #000 inset !important;}
-
-tr.mceLast {
-
-}
-
-/* Not MCE */
-
-#profile-jot-text {
- height: 20px;
- color:#000;
- border: 1px solid #cccccc;
- padding: 8px;
- width: 90%;
- -moz-border-radius: 5px;
- border-radius: 5px;
-/* box-shadow: 4px 4px 3px 0 #666 inset; */
-}
-#profile-jot-text:hover {
- color: #000000;
-}
-
-.wall-item-photo, .photo, .contact-block-img, .my-comment-photo {
- border-radius: 5px;
- -moz-border-radius: 5px;
- box-shadow: 4px 4px 3px 0 #444444;
-}
-
-
-#datebrowse-sidebar select {
- margin-left: 25px;
- border-radius: 5px;
- -moz-border-radius: 5px;
- opacity: 0.3;
- filter:alpha(opacity=30);
-}
-
-#datebrowse-sidebar select:hover {
- opacity: 1.0;
- filter:alpha(opacity=100);
-}
-
-#posted-date-selector {
- margin-left: 30px !important;
- margin-top: 5px !important;
- margin-right: 0px !important;
- margin-bottom: 0px !important;
-}
-
-#posted-date-selector:hover {
- box-shadow: 4px 4px 3px 0 #444444;
- margin-left: 25px !important;
- margin-top: 0px !important;
- margin-right: 5px !important;
- margin-bottom: 5px !important;
-
+.photo, .contact-block-img {
+ border-radius: $radiuspx;
+ -moz-border-radius: $radiuspx;
+ box-shadow: $shadowpx $shadowpx $shadowpx 0 #444444;
}
#side-bar-photos-albums {
@@ -1872,44 +667,21 @@ tr.mceLast {
list-style: none;
}
-.contact-entry-photo img, .profile-match-photo img, #photo-photo img, .directory-photo-img, .photo-album-photo, .photo-top-photo, .group-selected, .nets-selected, .fileas-selected, .categories-selected {
- border-radius: 5px;
- -moz-border-radius: 5px;
- box-shadow: 4px 4px 3px 0 #444444;
+.profile-match-photo img, #photo-photo img, .directory-photo-img, .photo-album-photo, .photo-top-photo {
+ border-radius: $radiuspx;
+ -moz-border-radius: $radiuspx;
+ box-shadow: $shadowpx $shadowpx $shadowpx 0 #444444;
}
-#profile-jot-submit {
- height: auto;
- background-color: #0080FF;
- color: #eeeeec;
- font-weight: bold;
- -webkit-border-radius: 5px;
- -moz-border-radius: 5px;
- border-radius: 5px;
- border: 2px outset #222420 !important;
- margin: 0;
- float: right;
- text-shadow: 1px 1px #111;
- width: auto;
- box-shadow: 5px 5px 5px #444;
-}
-
-#profile-jot-submit:active {
- box-shadow: 0 0 0 0;
-}
-
-.settings-widget .selected {
- border-radius: 5px;
- -moz-border-radius: 5px;
- box-shadow: 4px 4px 3px 0 #444444;
+.profile-match-photo img {
+ width: $top_photo !important;
+ height: $top_photo !important;
}
#sidebar-page-list .label {
margin-left: 5px;
}
-/*TODO - there appears to be significant redundancy here */
-
.photo {
border: 1px solid #AAAAAA;
}
@@ -1920,176 +692,15 @@ tr.mceLast {
border: 1px solid #888888;
}
-.rotleft1 {
--webkit-transform: rotate(-1deg);
--moz-transform: rotate(-1deg);
--ms-transform: rotate(-1deg);
--o-transform: rotate(-1deg);
-}
-
-.rotleft2 {
--webkit-transform: rotate(-2deg);
--moz-transform: rotate(-2deg);
--ms-transform: rotate(-2deg);
--o-transform: rotate(-2deg);
-}
-.rotleft3 {
--webkit-transform: rotate(-3deg);
--moz-transform: rotate(-3deg);
--ms-transform: rotate(-3deg);
--o-transform: rotate(-3deg);
-}
-
-.rotleft4 {
--webkit-transform: rotate(-4deg);
--moz-transform: rotate(-4deg);
--ms-transform: rotate(-4deg);
--o-transform: rotate(-4deg);
-}
-
-
-.rotright1 {
--webkit-transform: rotate(1deg);
--moz-transform: rotate(1deg);
--ms-transform: rotate(1deg);
--o-transform: rotate(1deg);
-}
-
-.rotright2 {
--webkit-transform: rotate(2deg);
--moz-transform: rotate(2deg);
--ms-transform: rotate(2deg);
--o-transform: rotate(2deg);
-}
-
-.rotright3 {
--webkit-transform: rotate(3deg);
--moz-transform: rotate(3deg);
--ms-transform: rotate(3deg);
--o-transform: rotate(3deg);
-}
-
-.rotright4 {
--webkit-transform: rotate(4deg);
--moz-transform: rotate(4deg);
--ms-transform: rotate(4deg);
--o-transform: rotate(4deg);
-}
-
-
-
-/*.photos {
- height: auto;
- overflow: auto;
-}*/
-
-.photos-end {
- clear: both;
- margin-bottom: 25px;
-}
-
-.photo-album-image-wrapper {
- float: left;
- margin-top: 15px;
- margin-right: 15px;
- margin-left: 15px;
-/* width: 200px; height: 200px;
- overflow: hidden;
- position: relative; */
-}
.photo-album-image-wrapper .caption {
- display: none;
- width: 100%;
-/* position: absolute; */
- bottom: 0px;
- padding: 0.5em 0.5em 0px 0.5em;
background-color: rgba(245, 245, 255, 0.8);
border-bottom: 2px solid #CCC;
- margin: 0px;
-}
-.photo-album-image-wrapper a:hover .caption {
- display:block;
-}
-
-#photo-album-end {
- clear: both;
- margin-bottom: 25px;
}
-.photo-top-image-wrapper {
-/* position: relative; */
- float: left;
- margin-top: 15px;
- margin-right: 15px;
- margin-left: 15px;
- margin-bottom: 15px;
-/* width: 200px; height: 200px;
- overflow: hidden; */
-}
.photo-top-album-name {
- width: 100%;
- min-height: 2em;
-/* position: absolute; */
- bottom: 0px;
- padding: 0px 3px;
- padding-top: 0.5em;
background-color: rgb(255, 255, 255);
}
-#photo-top-end {
- clear: both;
-}
-
-#photo-top-links {
- margin-bottom: 30px;
- margin-left: 30px;
-}
-
-#photos-upload-newalbum-div {
- float: left;
- width: 175px;
-}
-
-#photos-upload-noshare {
- margin-bottom: 10px;
-}
-#photos-upload-existing-album-text {
- float: left;
- width: 175px;
-}
-#photos-upload-newalbum {
- float: left;
-}
-#photos-upload-album-select {
- float: left;
-}
-
-#photos-upload-spacer {
- margin-top: 25px;
-}
-#photos-upload-new-end, #photos-upload-exist-end {
- clear: both;
-}
-#photos-upload-exist-end {
- margin-bottom: 15px;
-}
-#photos-upload-submit {
- margin-top: 15px;
-}
-
-#photos_upload_applet_wrapper {
- margin-bottom: 15px;
-}
-
-#photos-upload-no-java-message {
- margin-bottom: 15px;
-}
-
-
-#photos-upload-select-files-text {
- margin-top: 15px;
- margin-bottom: 15px;
-}
#photos-upload-perms-menu, #photos-upload-perms-menu:visited, #photos-upload-perms-menu:link {
color: #8888FF;
@@ -2103,295 +714,42 @@ tr.mceLast {
cursor: pointer;
}
-
-#photo-edit-caption-label, #photo-edit-tags-label, #photo-edit-albumname-label, #photo-edit-rotate-label {
- float: left;
- width: 150px;
-}
-
-#photo-edit-perms-end {
- margin-bottom: 15px;
-}
-
-#photo-edit-caption, #photo-edit-newtag, #photo-edit-albumname, #photo-edit-rotate {
- float: left;
- margin-bottom: 25px;
-}
-#photo-edit-link-wrap {
- margin-bottom: 15px;
-}
-#photo-like-div {
- margin-bottom: 25px;
-}
-
-#photo-edit-caption-end, #photo-edit-tags-end, #photo-edit-albumname-end, #photo-edit-rotate-end {
- clear: both;
-}
-
-#photo-edit-rotate-end {
- margin-bottom: 15px;
-}
-
-#photo-edit-delete-button {
- margin-left: 200px;
-}
-#photo-edit-end {
- margin-bottom: 35px;
-}
#photo-caption {
font-size: 110%;
font-weight: bold;
- margin-top: 15px;
- margin-bottom: 15px;
}
#in-this-photo-text {
- color: #0000FF;
- margin-left: 30px;
+ color: #0080FF;
}
-#in-this-photo {
- margin-left: 60px;
- margin-top: 10px;
- margin-bottom: 20px;
-}
-
-#photo-album-edit-submit, #photo-album-edit-drop {
- margin-top: 15px;
- margin-bottom: 15px;
-}
-
-#photo-album-edit-drop {
- margin-left: 200px;
-}
-
-
-#group-new-submit-wrapper {
- margin-top: 30px;
-}
-
-#group-edit-name-label {
- float: left;
- width: 175px;
- margin-top: 20px;
- margin-bottom: 20px;
-}
-
-#group-edit-name {
- float: left;
- width: 225px;
- margin-top: 20px;
- margin-bottom: 20px;
-}
-
-#group-edit-name-wrapper {
+#netsearch-box { margin-bottom: 5px; }
-
-}
-
-
-#group_members_select_label {
- display: block;
- float: left;
- width: 175px;
-}
-
-.group_members_select {
- float: left;
- width: 230px;
- overflow: auto;
-}
-
-#group_members_select_end {
- clear: both;
-}
-#group-edit-name-end {
- clear: both;
+#search-save {
+ margin-left: 5px;
}
-#prvmail-to-label, #prvmail-subject-label, #prvmail-message-label {
- margin-bottom: 10px;
+#side-follow-wrapper {
margin-top: 20px;
}
-#prvmail-submit {
- float: left;
- margin-top: 10px;
- margin-right: 30px;
-}
-#prvmail-upload-wrapper,
-#prvmail-link-wrapper,
-#prvmail-rotator-wrapper {
- float: left;
- margin-top: 10px;
- margin-right: 10px;
- width: 24px;
-}
-
-#prvmail-end {
- clear: both;
-}
-
-.mail-list-sender,
-.mail-list-detail {
- float: left;
-}
-.mail-list-detail {
- margin-left: 20px;
-}
-
-.mail-list-subject {
- font-size: 1.1em;
- margin-top: 10px;
-}
-a.mail-list-link {
- font-weight: normal;
- display: block;
- font-size: 1.3em;
- padding: 4px 0;
-}
-
-
-
-/*
-*a.mail-list-link:hover {
-* background-color: #15607B;
-* color: #F5F6FB;
-*}
-*/
-
-.mail-list-outside-wrapper-end {
- clear: both;
-}
-
-.mail-list-outside-wrapper {
- margin-top: 30px;
-}
-
-.mail-list-delete-wrapper {
- float: right;
- margin-right: 30px;
- margin-top: 15px;
-}
-
-.mail-list-delete-icon {
- border: none;
-}
-
-.mail-conv-sender,
-.mail-conv-detail {
- float: left;
-}
-.mail-conv-detail {
- margin-left: 20px;
- width: 500px;
-}
-
-.mail-conv-subject {
- font-size: 1.4em;
- margin: 10px 0;
-}
-
-.mail-conv-outside-wrapper-end {
- clear: both;
-}
-
-.mail-conv-outside-wrapper {
- margin-top: 30px;
-}
-
-.mail-conv-delete-wrapper {
- float: right;
- margin-right: 30px;
- margin-top: 15px;
-}
-.mail-conv-break {
- clear: both;
-}
-
-.mail-conv-delete-icon {
- border: none;
-}
-
-.message-links ul {
- list-style-type: none;
- padding: 0px;
-}
-
-.message-links li {
- margin-top: 10px;
- float: left;
-}
-.message-links a {
- padding: 3px 5px;
-}
-
-.message-links-end {
- clear: both;
-}
-
-#sidebar-group-list ul {
- list-style-type: none;
-}
-
-#sidebar-group-list .icon, #sidebar-group-list .iconspacer {
- display: inline-block;
- height: 12px;
- width: 12px;
-}
-
-#sidebar-group-list li {
- margin-top: 10px;
-}
-
-.nets-ul, .fileas-ul, .categories-ul {
- list-style-type: none;
-}
-
-.nets-ul li, .fileas-ul li, .categories-ul li {
- margin-top: 10px;
-}
-
-.nets-link {
- margin-left: 24px;
-}
-.nets-all {
- margin-left: 42px;
+#side-peoplefind-url {
+ margin-top: 5px;
}
-.fileas-link, .categories-link {
- margin-left: 24px;
+#side-peoplefind-url {
+ font-size: 1em;
}
-.fileas-all, .categories-all {
- margin-left: 0px;
+#side-peoplefind-url::-webkit-input-placeholder {
+ font-family: FontAwesome;
}
-#search-save {
- margin-left: 5px;
-}
-.groupsideedit {
- margin-right: 10px;
-}
-#saved-search-ul {
- list-style-type: none;
-}
-.savedsearchdrop, .savedsearchterm {
- float: left;
- margin-top: 10px;
-}
-.savedsearchterm {
- margin-left: 10px;
+#side-peoplefind-url::-moz-placeholder {
+ font-family: FontAwesome;
}
-
-#side-follow-wrapper {
- margin-top: 20px;
-}
-#side-follow-url, #side-peoplefind-url {
- margin-top: 5px;
-}
-#side-follow-submit, #side-peoplefind-submit {
+#side-peoplefind-submit {
margin-top: 15px;
}
@@ -2399,100 +757,40 @@ a.mail-list-link {
margin-top: 10px;
}
-aside input[type='text'] {
- width: 174px;
-}
-.widget {
+.pmenu {
border-bottom: 1px solid #eec;
padding: 8px;
margin-top: 5px;
- -moz-border-radius:5px;
- -webkit-border-radius:5px;
- border-radius:5px;
-
-}
-
+ -moz-border-radius: $radiuspx;
+ -webkit-border-radius: $radiuspx;
+ border-radius: $radiuspx;
-#profile-jot-desc {
- /*float: left;*/
- width: 480px;
- color: #FF0000;
- margin-top: 10px;
- margin-bottom: 10px;
}
-#character-counter {
- float: right;
- font-size: 120%;
-}
-
-#character-counter.grey {
- color: #888888;
-}
-
-#character-counter.orange {
- color: orange;
-}
-#character-counter.red {
- color: red;
-}
-
-#profile-jot-banner-end {
- /* clear: both; */
-}
-
-
-
#settings-default-perms-menu {
margin-top: 15px;
margin-bottom: 15px;
}
-
.group-delete-wrapper {
float: right;
margin-right: 50px;
}
-#install-dbhost-label,
-#install-dbuser-label,
-#install-dbpass-label,
-#install-dbdata-label,
-#install-tz-desc {
- float: left;
- width: 250px;
- margin-top: 10px;
- margin-bottom: 10px;
-
-}
-
-#install-dbhost,
-#install-dbuser,
-#install-dbpass,
-#install-dbdata {
- float: left;
- width: 200px;
- margin-left: 20px;
-}
-
-#install-dbhost-end,
-#install-dbuser-end,
-#install-dbpass-end,
-#install-dbdata-end,
-#install-tz-end {
- clear: both;
-}
-
-#install-form select#timezone_select {
- float: left;
- margin-top: 18px;
- margin-left: 20px;
+.rconnect {
+ display: block;
+ color: #FFFFFF;
+ margin-top: 15px;
+ background-color: $nav_bg_2;
+ -webkit-border-radius: $radiuspx ;
+ -moz-border-radius: $radiuspx;
+ border-radius: $radiuspx;
+ padding: 5px;
+ font-weight: bold;
+ clear: both;
}
-#dfrn-request-networks {
- margin-bottom: 30px;
-}
#pause {
position: fixed;
@@ -2500,11 +798,6 @@ aside input[type='text'] {
right: 5px;
}
-.sparkle {
- cursor: url('../img/lock.cur'), pointer;
-/* cursor: pointer !important; */
-}
-
#vcard-end {
clear: both;
}
@@ -2571,38 +864,67 @@ aside input[type='text'] {
#nav-searchbar {
float: right;
- margin-top: 4px;
+ margin-top: 2px;
+ margin-right: 10px;
}
#nav-search-spinner {
float: right;
- margin-top: 8px;
- margin-left: 5px;
- margin-right: 5px;
+ margin: 12px 12px 0px 0px;
+ color: #fff;
}
-#nav-search-text:hover {
- background-color: #FFF;
+#nav-search-text:hover,
+#nav-search-text:focus {
+ background-color: #fff;
color: #000;
}
#nav-search-text {
- border-radius: 14px;
- background-color: #AAAAAA;
- color: #eec;
+ height: 20px;
+ padding: 0px 5px 0px 5px;
+ border-radius: 10px;
+ border: none;
+ background-color: $search_background;
+ transition: background-color 300ms ease 0s;
}
-/* this doesn't seem to work */
-
-#nav-search-text::-moz-placeholder { color: #444; }
#nav-search-text::-webkit-input-placeholder {
- color: #444 !important;
+ font-family: FontAwesome;
+}
+
+#nav-search-text::-moz-placeholder {
+ font-family: FontAwesome;
+}
+
+#search-text {
+ font-size: 1em;
+}
+
+#search-text::-webkit-input-placeholder {
+ font-family: FontAwesome;
+}
+
+#search-text::-moz-placeholder {
+ font-family: FontAwesome;
}
#nav-user-linkmenu img {
- border-radius: 5px;
+ border-radius: $radiuspx;
+ margin-top: -4px;
+}
+
+.nav-dropdown-indicator {
+ opacity: 0.8;
+ filter:alpha(opacity=80);
}
+.nav-dropdown-indicator:hover {
+ opacity: 1.0;
+ filter:alpha(opacity=100);
+}
+
+
.location-label, .gender-label, .marital-label, .homepage-label {
float: left;
text-align: right;
@@ -2625,12 +947,10 @@ aside input[type='text'] {
clear: both;
}
-.cc-license {
- margin-top: 50px;
- font-size: 70%;
+.descriptive-text {
+ color: #888;
}
-
#plugin-settings-link, #account-settings-link {
margin-bottom: 10px;
}
@@ -2777,19 +1097,6 @@ aside input[type='text'] {
margin-top: 20px;
}
-#photo-prev-link, #photo-next-link {
- padding: 10px;
- float: left;
-}
-
-#photo-photo {
- float: left;
-}
-
-#photo-photo-end {
- clear: both;
-}
-
.profile-match-photo {
float: left;
text-align: center;
@@ -2797,10 +1104,14 @@ aside input[type='text'] {
}
.profile-match-name {
- float: left;
text-align: center;
width: 120px;
- overflow: hidden;
+ height: 18px;
+ overflow: hidden !important;
+}
+
+.profile-match-note {
+ text-align: center;
}
.profile-match-break,
@@ -2900,33 +1211,6 @@ aside input[type='text'] {
margin-top: 15px;
}
-#crepair-name-label,
-#crepair-nick-label,
-#crepair-attag-label,
-#crepair-url-label,
-#crepair-request-label,
-#crepair-confirm-label,
-#crepair-notify-label,
-#crepair-photo-label,
-#crepair-poll-label {
- float: left;
- width: 200px;
- margin-bottom: 15px;
-}
-
-#crepair-name,
-#crepair-nick,
-#crepair-attag,
-#crepair-url,
-#crepair-request,
-#crepair-confirm,
-#crepair-notify,
-#crepair-photo,
-#crepair-poll {
- float: left;
- width: 300px;
-}
-
#netsearch-box {
margin-top: 20px;
@@ -2964,29 +1248,6 @@ aside input[type='text'] {
margin-top: 10px;
}
-.body-tag, .filesavetags, .categorytags {
- opacity: 0.5;
- filter:alpha(opacity=50);
-}
-
-.body-tag:hover, .filesavetags:hover, .categorytags:hover {
- opacity: 1.0 !important;
- filter:alpha(opacity=100) !important;
-}
-
-.item-select {
- opacity: 0.1;
- filter:alpha(opacity=10);
- float: right;
- margin-right: 10px;
-
-}
-.item-select:hover, .checkeditem {
- opacity: 1;
- filter:alpha(opacity=100);
-}
-
-
#item-delete-selected {
margin-top: 30px;
}
@@ -3051,7 +1312,7 @@ brain is weird like that */
.field label {
float: left;
- width: 200px;
+ width: 350px;
}
.field input,
@@ -3061,38 +1322,11 @@ brain is weird like that */
.field textarea { height: 100px; }
.field_help {
display: block;
- margin-left: 200px;
+ margin-left: 350px;
color: #666666;
}
-.field_abook_help {
- color: #888;
-}
-.abook-them {
- margin-left: 225px;
- margin-bottom: 15px;
-}
-.abook-me {
- margin-left: 36px;
- margin-bottom: 15px;
-}
-.acheckbox {
- margin-bottom: 5px !important;
-}
-
-#contact-slider {
- width: 600px !important;
-}
-
-.abook-edit-them, .abook-edit-me {
- float: left;
- width: 100px !important;
-}
-.field_abook_help {
- float: left;
-}
-
.field .onoff {
float: left;
width: 80px;
@@ -3128,69 +1362,6 @@ brain is weird like that */
.field.radio .field_help { margin-left: 0px; }
-
-
-/**
- * ADMIN
- */
-#pending-update {
- float:right;
- color: #ffffff;
- font-weight: bold;
- background-color: #FF0000;
- padding: 0em 0.3em;
-
-}
-#adminpage dl {
- clear: left;
- margin-bottom: 2px;
- padding-bottom: 2px;
- border-bottom: 1px solid black;
-}
-#adminpage dt {
- width: 200px;
- float: left;
- font-weight: bold;
-}
-#adminpage dd {
- margin-left: 200px;
-}
-
-#adminpage h3 {
- border-bottom: 1px solid #cccccc;
-}
-#adminpage .field label {
- font-weight: bold;
-}
-#adminpage .submit {
- clear:left;
- text-align: right;
-}
-
-#adminpage #pluginslist {
- margin: 0px; padding: 0px;
-}
-#adminpage .plugin {
- list-style: none;
- display: block;
- border: 1px solid #888888;
- padding: 1em;
- margin-bottom: 5px;
- clear: left;
-}
-#adminpage .plugin .desc { margin-left: 2.5em;}
-#adminpage .toggleplugin {
- float:left;
- margin-right: 1em;
-}
-
-#adminpage table {width:100%; border-bottom: 1px solid #000000; margin: 5px 0px;}
-#adminpage table th { text-align: left;}
-#adminpage td .icon { float: left;}
-#adminpage table#users img { width: 16px; height: 16px; }
-#adminpage table tr:hover { background-color: #bbc7d7; }
-#adminpage .selectall { text-align: right; }
-
/*
* UPDATE
@@ -3236,6 +1407,10 @@ brain is weird like that */
width: 48px; height: 48px;
margin: 10px;
}
+.oauthapp .icon {
+ margin-right: 20px;
+}
+
.oauthapp img.noicon {
background-image: url("../../../../images/icons/48/plugin.png");
background-position: center center;
@@ -3250,6 +1425,11 @@ brain is weird like that */
*/
.iconspacer {
display: block; width: 16px; height: 16px;
+/* visibility: hidden; */
+}
+
+.iconspacer:hover {
+/* visibility: visible; */
}
.icon {
@@ -3261,6 +1441,7 @@ brain is weird like that */
.block { background-position: -32px 0px;}
.drop { background-position: -48px 0px;}
.drophide { background-position: -64px 0px;}
+.delete { background-position: -64px 0px;}
.edit { background-position: -80px 0px;}
.camera { background-position: -96px 0px;}
.dislike { background-position: -112px 0px;}
@@ -3290,108 +1471,21 @@ brain is weird like that */
.on { background-position: -144px -32px; }
.off { background-position: 0px -48px; }
-.starred { background-position: -16px -48px; }
-.unstarred { background-position: -32px -48px; }
.tagged { background-position: -48px -48px; }
.yellow { background-position: -64px -48px; }
-
-.filer-icon {
- display: block; width: 16px; height: 16px;
- background-image: url('../img/file.gif');
+.starred {
+ color: gold;
}
.icon.dim { opacity: 0.3;filter:alpha(opacity=30); }
-[class^="comment-edit-bb"] {
- list-style: none;
- display: none;
- margin: 0px 0 -5px 0px;
- padding: 0px;
- width: 75%;
-}
-[class^="comment-edit-bb"] > li {
- display: inline-block;
- margin: 10px 10px 0 0;
- visibility: none;
-}
-[class^="comment-edit-bb-end"] {
- clear: both;
-}
-.editicon {
- display: inline-block;
- width: 16px;
- height: 16px;
- background-image: url(../img/bbedit.png);
- background-color: #fff;
- text-decoration: none;
-}
-.editicon:hover {
- background-color: #ccc;
-}
-.boldbb {
- background-position: 0px 0px;
-}
-.boldbb:hover {
- background-position: 0px -16px;
-}
-.italicbb {
- background-position: -16px 0px;
-}
-.italicbb:hover {
- background-position: -16px -16px;
-}
-.underlinebb {
- background-position: -32px 0px;
-}
-.underlinebb:hover {
- background-position: -32px -16px;
-}
-.quotebb {
- background-position: -48px 0px;
-}
-.quotebb:hover {
- background-position: -48px -16px;
-}
-.codebb {
- background-position: -64px 0px;
-}
-.codebb:hover {
- background-position: -64px -16px;
-}
-.imagebb {
- background-position: -80px 0px;
-}
-.imagebb:hover {
- background-position: -80px -16px;
-}
-.urlbb {
- background-position: -96px 0px;
-}
-.urlbb:hover {
- background-position: -96px -16px;
-}
-.videobb {
- background-position: -112px 0px;
-}
-.videobb:hover {
- background-position: -112px -16px;
-}
-.attachtype {
- display: block; width: 20px; height: 23px;
- float: left;
- background-image: url('../../../../images/content-types.png');
-}
+
.body-attach {
margin-top: 10px;
}
-.type-video { background-position: 0px 0px; }
-.type-image { background-position: -20px 0px; }
-.type-audio { background-position: -40px 0px; }
-.type-text { background-position: -60px 0px; }
-.type-unkn { background-position: -80px 0px; }
/* autocomplete popup */
@@ -3406,6 +1500,9 @@ brain is weird like that */
background-color:#ffffff; padding: 4px;
clear:left;
}
+.acpopupitem.taggable {
+ background-color: #ddddff;
+}
.acpopupitem img {
float: left;
margin-right: 4px;
@@ -3430,29 +1527,6 @@ div.jGrowl div.info {
top: 15px;
right: 15px;
}
-.qcomment {
- border: 1px solid #EEE;
- padding: 3px;
- margin-top: 15px;
- margin-left: 25px;
- width: 125px;
- overflow-y: auto;
-}
-
-
-.qcomment option {
- width: 125px;
- overflow-x: hidden;
-}
-
-.qcomment {
- opacity: 0.3;
- filter:alpha(opacity=30);
-}
-.qcomment:hover {
- opacity: 1.0;
- filter:alpha(opacity=100);
-}
#id_term_label {
@@ -3462,108 +1536,79 @@ div.jGrowl div.info {
width:100px;
}
-#recip {
-
+#nav-search-text-ac .autocomplete {
+ position: fixed;
+ top: 24px;
+ border: 1px solid $nav_bg_1;
+ border-top: none;
}
-.autocomplete-w1 { background: #ffffff; no-repeat bottom right; position:absolute; top:0px; left:0px; margin:6px 0 0 6px; /* IE6 fix: */ _background:none; _margin:1px 0 0 0; }
-.autocomplete { color:#000; border:1px solid #999; background:#FFF; cursor:default; text-align:left; max-height:350px; overflow:auto; margin:-6px 6px 6px -6px; /* IE6 specific: */ _height:350px; _margin:0; _overflow-x:hidden; }
-.autocomplete .selected { background:#F0F0F0; }
-.autocomplete div { padding:2px 5px; white-space:nowrap; overflow:hidden; }
-#datebrowse-sidebar select {
- margin-left: 25px;
+#search-text-ac .autocomplete,
+#recip-ac .autocomplete,
+#poke-recip-ac .autocomplete,
+#id-name-ac .autocomplete,
+#contact-search-ac .autocomplete {
+ margin-top: 2px;
+ margin-left: $radiuspx;
+ border: 1px solid #666;
+ border-top: none;
+
}
+.autocomplete {
+ color: $font_colour;
+ background: #FFF;
+ cursor: pointer;
+ text-align: left;
+ max-height: 350px;
+ overflow: auto;
+ border-bottom-left-radius: $radiuspx;
+ border-bottom-right-radius: $radiuspx;
+}
+.autocomplete .selected {
+ background: $search_background;
+}
+
+.autocomplete div {
+ padding: 2px 5px;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
.jslider .jslider-scale ins {
color: #333;
- font-size: 12px;
+ font-size: $body_font_size;
width: 100px;
text-align: center;
}
-
-.slider {
- margin-top: 10px;
- margin-bottom: 30px;
-}
-
-
-#main-slider {
- position: relative;
- left: 5%;
- width: 90%;
-}
-
-
#contact-slider {
position: relative;
left: 5%;
width: 90%;
}
-/* nav */
-nav {
- width: 100%;
- height: 32px;
- position: fixed;
-// opacity: 0.6;
-// filter:alpha(opacity=60);
-
- left: 0px;
- top: 0px;
- padding: 0px;
- background-color: #d00;
- color: #eec;
- z-index: 100;
- -webkit-box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.7);
- -moz-box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.7);
- box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.7);
-
-/* TODO find a better way to do this without different code for every single browser. */
-
- background-image: linear-gradient(bottom, #f88 26%, #b00 82%);
- background-image: -o-linear-gradient(bottom, #f88 26%, #b00 82%);
- background-image: -moz-linear-gradient(bottom, #f88 26%, #b00 82%);
- background-image: -webkit-linear-gradient(bottom, #f88 26%, #b00 82%);
- background-image: -ms-linear-gradient(bottom, #f88 26%, #b00 82%);
-
- background-image: -webkit-gradient(
-linear,
-left bottom,
-left top,
-color-stop(0.26, #f88),
-color-stop(0.82, #b00)
-);
-}
-
-nav:hover {
-
- background-image: linear-gradient(bottom, #f00 26%, #b00 82%);
- background-image: -o-linear-gradient(bottom, #f00 26%, #b00 82%);
- background-image: -moz-linear-gradient(bottom, #f00 26%, #b00 82%);
- background-image: -webkit-linear-gradient(bottom, #f00 26%, #b00 82%);
- background-image: -ms-linear-gradient(bottom, #f00 26%, #b00 82%);
-
- background-image: -webkit-gradient(
-linear,
-left bottom,
-left top,
-color-stop(0.26, #f00),
-color-stop(0.82, #b00)
-);
-}
-
+a.rconnect,
nav a,
nav a:active,
nav a:visited,
-nav a:link,
-nav a:hover {
+nav a:link {
+ color: #ffffff;
+ text-decoration: none;
+ outline: none;
+}
+
+a.rconnect:hover, nav a:hover {
+ color: #0080FF;
+}
+nav .fakelink {
color: #ffffff;
text-decoration: none;
outline: none;
}
+nav .fakelink:hover { text-decoration: none; }
#profiles-menu li a {
color: #ffffff;
@@ -3588,16 +1633,21 @@ nav ul li .menu-popup {
right: auto;
top: 33px;
}
+
+#nav-user-linkmenu {
+ margin-left: 5px;
+}
+
nav .nav-menu-icon {
position: relative;
height: 22px;
padding: 5px;
- margin: 3px 10px;
- -moz-border-radius: 5px 5px 0 0;
- -webkit-border-radius: 5px 5px 0 0;
- border-radius: 5px 5px 0 0;
+/* margin: 3px 10px; */
+ -moz-border-radius: $radiuspx;
+ -webkit-border-radius: $radiuspx;
+ border-radius: $radiuspx;
}
-nav .nav-menu-icon.selected {
+nav .nav-menu-icon.active {
background-color: #FF0000;
}
nav .nav-menu-icon img {
@@ -3611,26 +1661,33 @@ nav .nav-menu {
position: relative;
height: 16px;
padding: 5px;
- margin: 3px 15px 0px;
- font-size: 14px;
- border-bottom: 3px solid #f88;
+ margin: 0px 5px 0px;
+ font-size: 1.0em;
+/* border-bottom: 3px solid #f88; */
}
nav:hover .nav-menu {
- border-bottom: 3px solid #f00;
+/* border-bottom: 3px solid #f00; */
}
-nav .nav-menu.selected {
- border-bottom: 4px solid #CCCCCC;
+nav .nav-menu.active i {
+ color: $active_colour;
}
nav .nav-notify {
background-color: #0080FF;
color: #fff;
- -moz-border-radius: 5px 5px 5px 5px;
- -webkit-border-radius: 5px 5px 5px 5px;
- border-radius: 5px 5px 5px 5px;
+ -moz-border-radius: $radiuspx;
+ -webkit-border-radius: $radiuspx;
+ border-radius: $radiuspx;
+/* opacity: 0.6;
+ filter:alpha(opacity=60); */
+
+}
+.nav-notify:hover, nav .nav-notify.active span {
+ color: #ffffff;
}
+
nav .nav-notify.show {
display: block;
}
@@ -3638,9 +1695,7 @@ nav #nav-help-link,
nav #nav-login-link,
nav #nav-search-link,
nav #nav-directory-link,
-nav #nav-apps-link,
-nav #nav-user-linkmenu,
-nav #nav-site-linkmenu {
+nav #nav-apps-link {
float: right;
}
nav #nav-help-link .menu-popup,
@@ -3652,10 +1707,10 @@ nav #nav-site-linkmenu .menu-popup {
left: auto;
}
nav #nav-notifications-linkmenu.on .icon.s22.notify,
-nav #nav-notifications-linkmenu.selected .icon.s22.notify {
+nav #nav-notifications-linkmenu.active .icon.s22.notify {
background-image: url("../../../../images/icons/22/notify_on.png");
}
-nav #nav-apps-link.selected {
+nav #nav-apps-link.active {
background-color: #364e59;
}
ul.menu-popup {
@@ -3674,7 +1729,7 @@ ul.menu-popup {
}
ul.menu-popup a {
display: block;
- color: #;
+ color: #FFFFFF;
padding: 5px 10px;
text-decoration: none;
}
@@ -3682,7 +1737,7 @@ ul.menu-popup a {
ul.menu-popup a:hover {
background-color: #888888;
- color: #000000;
+ color: #FFFFFF;
}
ul.menu-popup .menu-sep {
border-top: 1px solid #9eabb0;
@@ -3737,7 +1792,7 @@ header {
font-size: 10px;
padding: 1px 3px;
top: 0px;
- right: -10px;
+ right: -5px;
min-width: 15px;
text-align: right;
}
@@ -3767,9 +1822,9 @@ ul.menu-popup {
max-height: 400px;
overflow-y: scroll;overflow-style:scrollbar;
background-color:#FFFFFF;
- -moz-border-radius: 5px;
- -webkit-border-radius: 5px;
- border-radius:5px;
+ -moz-border-radius: $radiuspx;
+ -webkit-border-radius: $radiuspx;
+ border-radius: $radiuspx;
border: 1px solid #888;
}
#nav-notifications-menu .contactname { font-weight: bold; font-size: 0.9em; }
@@ -3808,20 +1863,19 @@ ul.menu-popup {
}
#page-spinner {
- margin-left: 50%;
+ color: #777;
+ margin: 24px;
}
.tabs-end {
clear: both;
}
-
-
-
#acl-wrapper {
width: 690px;
float:left;
}
+
#acl-search {
float:right;
background: #ffffff url("../../../../images/search_18.png") no-repeat right center;
@@ -3837,9 +1891,9 @@ ul.menu-popup {
background-position: 7px 7px;
background-repeat: no-repeat;
padding: 7px 5px 0px 30px;
- -webkit-border-radius: 5px ;
- -moz-border-radius: 5px;
- border-radius: 5px;
+ -webkit-border-radius: $radiuspx;
+ -moz-border-radius: $radiuspx;
+ border-radius: $radiuspx;
color: #999999;
}
#acl-showall.selected {
@@ -3872,6 +1926,10 @@ ul.menu-popup {
float: left;
margin: 4px;
}
+.acl-list-item.taggable {
+ background-color: #ddddff;
+}
+
.acl-list-item p { height: 12px; font-size: 10px; margin: 0px; padding: 2px 0px 1px; overflow: hidden;}
.acl-list-item a {
font-size: 8px;
@@ -3911,4 +1969,479 @@ ul.menu-popup {
.contact-block-content {
margin-top: 8px;
+}
+
+.profile-match-connect { margin-top: 5px; }
+
+.reshared-content { margin-left: 30px; }
+.shared_header img { margin-right: 10px; }
+
+.tag1 {
+ font-size : 1.0em !important;
+ }
+.tag2 {
+ font-size : 1.2em !important;
+ }
+
+
+.tag3 {
+ font-size : 1.4em !important;
+ }
+
+
+.tag4 {
+ font-size : 1.6em !important;
+ }
+
+
+.tag5 {
+ font-size : 1.8em !important;
+ }
+
+
+.tag6 {
+ font-size : 2.0em !important;
+ }
+
+
+.tag7 {
+ font-size : 2.2em !important;
+ }
+
+
+.tag8 {
+ font-size : 2.4em !important;
+ }
+
+
+.tag9 {
+ font-size : 2.6em !important;
+ }
+
+
+.tag10 {
+ font-size : 2.8em !important;
+ }
+
+.profile-thing-list {
+ list-style-type: none;
+}
+/*
+.profile-thing-list li {
+ float: left;
+ margin-right: 25px;
+}
+*/
+
+
+div#pagelist-content-wrapper {
+width: 80%;
+background: #fff;
+margin-left: auto;
+margin-right: auto;
+}
+
+div.page-list-item {
+margin: 20px;
+}
+
+div#write-pages {
+display: block;
+position: fixed;
+top: 24px;
+z-index: 99;
+background: silver;
+width: 100%;
+}
+
+div#write-pages a {
+color: #000;
+margin-right: 50px;
+}
+
+.pmenu ul {
+ list-style-type: none;
+}
+
+.pmenu li {
+ margin-left: -20px;
+}
+
+.admin-icons {
+ font-size: 1.2em;
+ color: $toolicon_colour;
+}
+
+.nav-icon {
+ font-size: 1.4em;
+ margin-right: 15px;
+}
+
+a .drop-icons {
+ color: $toolicon_colour;;
+ font-size: 1.2em;
+ text-decoration: none;
+}
+
+a .drop-icons:hover {
+ color: #FF0000;
+}
+
+.permission-inherited {
+ float: left;
+ margin-right: 10px;
+ color: #FF0000;
+}
+
+.attachlink {
+ float: left;
+ border: 1px solid black;
+ padding: 5px;
+ margin-right: 8px;
+}
+
+.attach-icons {
+ font-size: 1.4em;
+}
+
+.attach-clip {
+ margin-right: 3px;
+ font-size: 1.8em;
+}
+
+.item-category {
+ margin-right: 10px;
+}
+
+.design-tools ul {
+ list-style-type: none;
+}
+
+.design-icons {
+ margin-right: 10px;
+}
+
+.design-icons:hover {
+text-decoration: none;
+}
+
+#menulist {
+ list-style-type: none;
+}
+
+.admin-icons {
+ color: $toolicon_colour;
+ margin-right: 10px;
+}
+
+/* message */
+
+img.mail-list-sender-photo {
+ -moz-border-radius: $radiuspx;
+ border-radius: $radiuspx;
+}
+
+/* jot */
+
+#jot-title,
+#jot-category,
+#jot-pagetitle {
+ font-weight: bold;
+ border: solid 1px #ffffff;
+ border-radius: $radiuspx;
+}
+
+#jot-category::-webkit-input-placeholder {
+ font-weight: bold;
+}
+
+#jot-category:-moz-placeholder {
+ font-weight: bold;
+}
+
+#jot-title::-webkit-input-placeholder {
+ font-weight: bold;
+}
+
+#jot-title:-moz-placeholder {
+ font-weight: bold;
+}
+
+#jot-pagetitle::-webkit-input-placeholder {
+ font-weight: bold;
+}
+
+#jot-pagetitle:-moz-placeholder {
+ font-weight: bold;
+}
+
+#jot-title:hover,
+#jot-title:focus,
+#jot-pagetitle:hover,
+#jot-pagetitle:focus,
+#jot-category:hover,
+#jot-category:focus {
+ border: 1px solid #cccccc;
+}
+
+#profile-jot-text {
+ color:#000;
+ border: 1px solid #cccccc;
+ -moz-border-radius: $radiuspx;
+ border-radius: $radiuspx;
+}
+
+#profile-jot-text::-webkit-input-placeholder {
+ font-size:1.5em;
+}
+
+#profile-jot-text::-moz-placeholder {
+ font-size:1.5em;
+}
+
+#profile-jot-text:focus::-webkit-input-placeholder {
+ color: transparent;
+}
+
+#profile-jot-text:focus::-moz-placeholder {
+ color: transparent;
+}
+
+#profile-jot-text-loading {
+ color: #777;
+}
+
+#profile-jot-submit {
+ background: linear-gradient(top, #0080ff 0%, #0080aa);
+ background: -webkit-linear-gradient(top, #0080ff 0%, #0080aa);
+ background: -moz-linear-gradient(top, #0080ff 0%, #0080aa);
+ background: -o-linear-gradient(top, #0080ff 0%, #0080aa);
+ background: -ms-linear-gradient(top, #0080ff 0%, #0080aa);
+ color: #fff;
+ font-weight: bold;
+ border-radius: 0px $radiuspx $radiuspx 0px;
+ text-shadow: 1px 1px #111;
+ cursor: pointer;
+}
+
+#profile-jot-submit:hover {
+ background: linear-gradient(top, #0080aa 0%, #0080ff);
+ background: -webkit-linear-gradient(top, #0080aa 0%, #0080ff);
+ background: -moz-linear-gradient(top, #0080aa 0%, #0080ff);
+ background: -o-linear-gradient(top, #0080aa 0%, #0080ff);
+ background: -ms-linear-gradient(top, #0080aa 0%, #0080ff);
+}
+
+#profile-jot-perms {
+ background-color: $toolicon_colour;
+ border: 1px solid #666;
+ border-right: none;
+ border-radius: $radiuspx 0px 0px $radiuspx;
+}
+
+#profile-rotator {
+ color: #777;
+}
+
+.jot-icons {
+ font-size: 1.2em;
+ color: $toolicon_colour;
+}
+
+.jot-icons:hover {
+ color: $toolicon_activecolour;
+}
+
+/* conversation */
+
+.thread-wrapper .wall-item-comment-wrapper,
+.wall-item-content-wrapper.comment {
+ margin-left: $comment_indent;
+ border-left: 2px solid #eee;
+}
+
+.thread-wrapper.toplevel_item {
+ max-width: $converse_width;
+}
+
+.wall-item-content-wrapper {
+ border-radius: $radiuspx;
+ background-color: $item_colour;
+ opacity: $item_opacity;
+}
+
+.wallwall .wwto {
+ top: $wwtop;
+}
+
+.wall-item-photo-menu-button {
+ background-image: url("../img/photo-menu.jpg");
+ background-position: top left;
+ background-repeat: no-repeat;
+ top: $pmenu_top;
+}
+
+.wall-item-photo-menu {
+ border: 2px solid #444444;
+ background: #FFFFFF;
+ top: $top_photo;
+}
+
+.wall-item-photo-menu ul {
+ list-style: none
+}
+
+.wall-item-photo-menu li a:hover {
+ color: #FFFFFF;
+ background: #3465A4;
+ text-decoration: none;
+}
+
+.comment .wall-item-photo-menu-button {
+ top: $pmenu_reply;
+}
+
+.comment .wall-item-photo-menu {
+ top: $reply_photo;
+}
+
+.wall-item-photo {
+ border: none;
+ width: $top_photo !important;
+ height: $top_photo !important;
+
+}
+
+.comment .wall-item-photo {
+ width: $reply_photo !important;
+ height: $reply_photo !important;
+}
+
+.wall-item-photo {
+ border-radius: $radiuspx;
+ -moz-border-radius: $radiuspx;
+ box-shadow: $shadowpx $shadowpx $shadowpx 0 #444444;
+}
+
+.wall-item-arrowphoto-wrapper {
+ top: $wwtop;
+}
+
+.wall-item-lock {
+ font-size: 1.2em;
+ color: $toolicon_colour;
+}
+
+.wall-item-ago .icon-ok {
+ color: darkgreen;
+}
+
+
+.wall-item-ago {
+ color: #777;
+ font-size: 0.8em;
+}
+
+.wall-item-ago i {
+ font-size: 0.6em;
+}
+
+.wall-item-content {
+ font-size: $font_size;
+}
+
+.item-tool {
+ font-size: 1.2em;
+ color: $toolicon_colour;
+}
+
+.item-tool:hover {
+ color: $toolicon_activecolour;
+}
+
+.like-rotator {
+ color: $toolicon_colour;
+}
+
+.my-comment-photo {
+ border-radius: $radiuspx;
+ -moz-border-radius: $radiuspx;
+ box-shadow: $shadowpx $shadowpx $shadowpx 0 #444444;
+}
+
+.comment-edit-photo img {
+ width: $reply_photo;
+}
+
+[class^="comment-edit-bb"] {
+ list-style: none;
+}
+
+.comment-icon {
+ font-size: 1.2em;
+ color: $toolicon_colour;
+}
+
+.comment-icon:hover {
+ color: $toolicon_activecolour;
+}
+
+.comment-edit-text-empty,
+.comment-edit-text-full {
+ border: 1px solid #ccc;
+ border-radius: $radiuspx;
+}
+
+.comment-edit-text-empty {
+ color: gray;
+}
+
+.comment-edit-text-full {
+ color: black;
+}
+
+/* widgets */
+
+.widget {
+ border-bottom: 1px solid #eec;
+ -moz-border-radius: $radiuspx;
+ -webkit-border-radius: $radiuspx;
+ border-radius: $radiuspx;
+}
+
+#note-text {
+ border: 1px solid #ccc;
+ border-radius: $radiuspx;
+ -moz-border-radius: $radiuspx;
+}
+
+#saved-search-ul {
+ list-style-type: none;
+}
+
+.fileas-ul {
+ list-style-type: none;
+}
+
+#datebrowse-sidebar select {
+ border: 1px solid #ccc;
+ border-radius: $radiuspx;
+ -moz-border-radius: $radiuspx;
+}
+
+.categories-ul {
+ list-style-type: none;
+}
+
+#sidebar-group-list ul {
+ list-style-type: none;
+}
+
+.profile-thing-list img, .thing-show img, .thing-edit-links a {
+ margin-top: 8px;
+ margin-right: 15px;
+}
+
+.abook-self {
+ background-color: #ffdddd;
} \ No newline at end of file
diff --git a/view/theme/redbasic/img/bg.png b/view/theme/redbasic/img/bg.png
deleted file mode 100644
index eae49e037..000000000
--- a/view/theme/redbasic/img/bg.png
+++ /dev/null
Binary files differ
diff --git a/view/theme/redbasic/img/events.png b/view/theme/redbasic/img/events.png
deleted file mode 100644
index 96dd86899..000000000
--- a/view/theme/redbasic/img/events.png
+++ /dev/null
Binary files differ
diff --git a/view/theme/redbasic/img/head.jpg b/view/theme/redbasic/img/head.jpg
deleted file mode 100644
index 6210b76be..000000000
--- a/view/theme/redbasic/img/head.jpg
+++ /dev/null
Binary files differ
diff --git a/view/theme/redbasic/img/home.png b/view/theme/redbasic/img/home.png
deleted file mode 100644
index d1ba7b3f3..000000000
--- a/view/theme/redbasic/img/home.png
+++ /dev/null
Binary files differ
diff --git a/view/theme/redbasic/img/introductions.png b/view/theme/redbasic/img/introductions.png
deleted file mode 100644
index 9e0498227..000000000
--- a/view/theme/redbasic/img/introductions.png
+++ /dev/null
Binary files differ
diff --git a/view/theme/redbasic/img/lock.cur b/view/theme/redbasic/img/lock.cur
deleted file mode 100644
index 892c5e851..000000000
--- a/view/theme/redbasic/img/lock.cur
+++ /dev/null
Binary files differ
diff --git a/view/theme/redbasic/img/message.png b/view/theme/redbasic/img/message.png
deleted file mode 100644
index f3fea75ee..000000000
--- a/view/theme/redbasic/img/message.png
+++ /dev/null
Binary files differ
diff --git a/view/theme/redbasic/img/network.png b/view/theme/redbasic/img/network.png
deleted file mode 100644
index f3e45c3ec..000000000
--- a/view/theme/redbasic/img/network.png
+++ /dev/null
Binary files differ
diff --git a/view/theme/redbasic/img/screenshot.jpg b/view/theme/redbasic/img/screenshot.jpg
index 5f00ec39e..51d4cbb0d 100644
--- a/view/theme/redbasic/img/screenshot.jpg
+++ b/view/theme/redbasic/img/screenshot.jpg
Binary files differ
diff --git a/view/theme/redbasic/img/settings.png b/view/theme/redbasic/img/settings.png
deleted file mode 100644
index a935b225e..000000000
--- a/view/theme/redbasic/img/settings.png
+++ /dev/null
Binary files differ
diff --git a/view/theme/redbasic/js/redbasic.js b/view/theme/redbasic/js/redbasic.js
index 00b8fa39f..e41fde2b8 100644
--- a/view/theme/redbasic/js/redbasic.js
+++ b/view/theme/redbasic/js/redbasic.js
@@ -1,35 +1,5 @@
-function insertFormatting(comment,BBcode,id) {
-
- var tmpStr = $("#comment-edit-text-" + id).val();
- if(tmpStr == comment) {
- tmpStr = "";
- $("#comment-edit-text-" + id).addClass("comment-edit-text-full");
- $("#comment-edit-text-" + id).removeClass("comment-edit-text-empty");
- openMenu("comment-edit-submit-wrapper-" + id);
- $("#comment-edit-text-" + id).val(tmpStr);
- }
-
- textarea = document.getElementById("comment-edit-text-" +id);
- if (document.selection) {
- textarea.focus();
- selected = document.selection.createRange();
- if (BBcode == "url"){
- selected.text = "["+BBcode+"]" + "http://" + selected.text + "[/"+BBcode+"]";
- } else
- selected.text = "["+BBcode+"]" + selected.text + "[/"+BBcode+"]";
- } else if (textarea.selectionStart || textarea.selectionStart == "0") {
- var start = textarea.selectionStart;
- var end = textarea.selectionEnd;
- if (BBcode == "url"){
- textarea.value = textarea.value.substring(0, start) + "["+BBcode+"]" + "http://" + textarea.value.substring(start, end) + "[/"+BBcode+"]" + textarea.value.substring(end, textarea.value.length);
- } else
- textarea.value = textarea.value.substring(0, start) + "["+BBcode+"]" + textarea.value.substring(start, end) + "[/"+BBcode+"]" + textarea.value.substring(end, textarea.value.length);
- }
- return true;
-}
-
function cmtBbOpen(comment, id) {
if($(comment).hasClass('comment-edit-text-full')) {
$(".comment-edit-bb-" + id).show();
@@ -46,44 +16,50 @@ function cmtBbClose(comment, id) {
return false;
}
+//document.jotpermslock = 'icon-lock';
+//document.jotpermsunlock = 'icon-unlock';
+
+
$(document).ready(function() {
$('.group-edit-icon').hover(
function() {
- $(this).addClass('icon'); $(this).removeClass('iconspacer');},
+ $(this).css('opacity','1.0');},
function() {
- $(this).removeClass('icon'); $(this).addClass('iconspacer');}
- );
+ $(this).css('opacity','0');}
+);
$('.sidebar-group-element').hover(
function() {
id = $(this).attr('id');
- $('#edit-' + id).addClass('icon'); $('#edit-' + id).removeClass('iconspacer');},
+ $('#edit-' + id).css('opacity','1.0');},
function() {
id = $(this).attr('id');
- $('#edit-' + id).removeClass('icon');$('#edit-' + id).addClass('iconspacer');}
+ $('#edit-' + id).css('opacity','0');}
);
$('.savedsearchdrop').hover(
function() {
- $(this).addClass('drop'); $(this).addClass('icon'); $(this).removeClass('iconspacer');},
- function() {
- $(this).removeClass('drop'); $(this).removeClass('icon'); $(this).addClass('iconspacer');}
- );
-
-$('.savedsearchterm').hover(
- function() {
- id = $(this).attr('id');
- $('#drop-' + id).addClass('icon'); $('#drop-' + id).addClass('drophide'); $('#drop-' + id).removeClass('iconspacer');},
-
+ $(this).css('opacity','1.0');},
function() {
- id = $(this).attr('id');
- $('#drop-' + id).removeClass('icon');$('#drop-' + id).removeClass('drophide'); $('#drop-' + id).addClass('iconspacer');}
+ $(this).css('opacity','0');}
);
});
-
+$(document).ready(function(){
+ var doctitle = document.title;
+ function checkNotify() {
+ var notifyUpdateElem = document.getElementById('notify-update');
+ if(notifyUpdateElem !== null) {
+ if(notifyUpdateElem.innerHTML != "")
+ document.title = "("+notifyUpdateElem.innerHTML+") " + doctitle;
+ else
+ document.title = doctitle;
+ }
+ };
+ setInterval(function () {checkNotify();}, 10 * 1000);
+});
diff --git a/view/theme/redbasic/php/config.php b/view/theme/redbasic/php/config.php
index ad5df57ce..20355197f 100644
--- a/view/theme/redbasic/php/config.php
+++ b/view/theme/redbasic/php/config.php
@@ -1,80 +1,111 @@
<?php
-/**
- * Theme settings
- */
function theme_content(&$a) {
- if(!local_user()) { return; }
+ if(!local_user()) { return;}
- $font_size = get_pconfig(local_user(),'redbasic', 'font_size' );
- $line_height = get_pconfig(local_user(), 'redbasic', 'line_height' );
- $colour = get_pconfig(local_user(), 'redbasic', 'colour' );
-
- return redbasic_form($a, $font_size, $line_height, $colour);
+ $arr = array();
+
+ $arr['schema'] = get_pconfig(local_user(),'redbasic', 'schema' );
+ $arr['nav_colour'] = get_pconfig(local_user(),'redbasic', 'nav_colour' );
+ $arr['banner_colour'] = get_pconfig(local_user(),'redbasic', 'banner_colour' );
+ $arr['bgcolour'] = get_pconfig(local_user(),'redbasic', 'background_colour' );
+ $arr['background_image'] = get_pconfig(local_user(),'redbasic', 'background_image' );
+ $arr['item_colour'] = get_pconfig(local_user(),'redbasic', 'item_colour' );
+ $arr['item_opacity'] = get_pconfig(local_user(),'redbasic', 'item_opacity' );
+ $arr['toolicon_colour'] = get_pconfig(local_user(),'redbasic','toolicon_colour');
+ $arr['toolicon_activecolour'] = get_pconfig(local_user(),'redbasic','toolicon_activecolour');
+ $arr['font_size'] = get_pconfig(local_user(),'redbasic', 'font_size' );
+ $arr['body_font_size'] = get_pconfig(local_user(),'redbasic', 'body_font_size' );
+ $arr['font_colour'] = get_pconfig(local_user(),'redbasic', 'font_colour' );
+ $arr['radius'] = get_pconfig(local_user(),'redbasic', 'radius' );
+ $arr['shadow'] = get_pconfig(local_user(),'redbasic', 'photo_shadow' );
+ $arr['converse_width']=get_pconfig(local_user(),"redbasic","converse_width");
+ $arr['nav_min_opacity']=get_pconfig(local_user(),"redbasic","nav_min_opacity");
+ $arr['top_photo']=get_pconfig(local_user(),"redbasic","top_photo");
+ $arr['reply_photo']=get_pconfig(local_user(),"redbasic","reply_photo");
+ $arr['sloppy_photos']=get_pconfig(local_user(),"redbasic","sloppy_photos");
+ return redbasic_form($a, $arr);
}
function theme_post(&$a) {
- if(!local_user()) { return; }
-
+ if(!local_user()) { return;}
+
if (isset($_POST['redbasic-settings-submit'])) {
+ set_pconfig(local_user(), 'redbasic', 'schema', $_POST['redbasic_schema']);
+ set_pconfig(local_user(), 'redbasic', 'nav_colour', $_POST['redbasic_nav_colour']);
+ set_pconfig(local_user(), 'redbasic', 'background_colour', $_POST['redbasic_background_colour']);
+ set_pconfig(local_user(), 'redbasic', 'banner_colour', $_POST['redbasic_banner_colour']);
+ set_pconfig(local_user(), 'redbasic', 'background_image', $_POST['redbasic_background_image']);
+ set_pconfig(local_user(), 'redbasic', 'item_colour', $_POST['redbasic_item_colour']);
+ set_pconfig(local_user(), 'redbasic', 'item_opacity', $_POST['redbasic_item_opacity']);
+ set_pconfig(local_user(), 'redbasic', 'toolicon_colour', $_POST['redbasic_toolicon_colour']);
+ set_pconfig(local_user(), 'redbasic', 'toolicon_activecolour', $_POST['redbasic_toolicon_activecolour']);
set_pconfig(local_user(), 'redbasic', 'font_size', $_POST['redbasic_font_size']);
- set_pconfig(local_user(), 'redbasic', 'line_height', $_POST['redbasic_line_height']);
- set_pconfig(local_user(), 'redbasic', 'colour', $_POST['redbasic_colour']);
+ set_pconfig(local_user(), 'redbasic', 'body_font_size', $_POST['redbasic_body_font_size']);
+ set_pconfig(local_user(), 'redbasic', 'font_colour', $_POST['redbasic_font_colour']);
+ set_pconfig(local_user(), 'redbasic', 'radius', $_POST['redbasic_radius']);
+ set_pconfig(local_user(), 'redbasic', 'photo_shadow', $_POST['redbasic_shadow']);
+ set_pconfig(local_user(), 'redbasic', 'converse_width', $_POST['redbasic_converse_width']);
+ set_pconfig(local_user(), 'redbasic', 'nav_min_opacity', $_POST['redbasic_nav_min_opacity']);
+ set_pconfig(local_user(), 'redbasic', 'top_photo', $_POST['redbasic_top_photo']);
+ set_pconfig(local_user(), 'redbasic', 'reply_photo', $_POST['redbasic_reply_photo']);
+ set_pconfig(local_user(), 'redbasic', 'sloppy_photos', $_POST['redbasic_sloppy_photos']);
}
}
-function theme_admin(&$a) {
- $font_size = get_config('redbasic', 'font_size' );
- $line_height = get_config('redbasic', 'line_height' );
- $colour = get_config('redbasic', 'colour' );
-
- return redbasic_form($a, $font_size, $line_height, $colour);
-}
-function theme_admin_post(&$a) {
- if (isset($_POST['redbasic-settings-submit'])) {
- set_config('redbasic', 'font_size', $_POST['redbasic_font_size']);
- set_config('redbasic', 'line_height', $_POST['redbasic_line_height']);
- set_config('redbasic', 'colour', $_POST['redbasic_colour']);
- }
-}
-function redbasic_form(&$a, $font_size, $line_height, $colour) {
- $line_heights = array(
- "1.3" => "1.3",
- "---" => "---",
- "1.6" => "1.6",
- "1.5" => "1.5",
- "1.4" => "1.4",
- "1.2" => "1.2",
- "1.1" => "1.1",
- );
- $font_sizes = array(
- '12' => '12',
- '14' => '14',
- "---" => "---",
- "16" => "16",
- "15" => "15",
- '13.5' => '13.5',
- '13' => '13',
- '12.5' => '12.5',
- '12' => '12',
- );
- $colours = array(
- 'light' => 'light',
- 'dark' => 'dark',
- );
+function redbasic_form(&$a, $arr) {
+
- $t = get_markup_template('theme_settings.tpl');
- $o .= replace_macros($t, array(
+ $scheme_choices = array();
+ $scheme_choices["---"] = t("Default");
+ $files = glob('view/theme/redbasic/schema/*.php');
+ if($files) {
+ foreach($files as $file) {
+ $f = basename($file, ".php");
+ $scheme_name = $f;
+ $scheme_choices[$f] = $scheme_name;
+ }
+ }
+
+
+ $nav_colours = array (
+ '' => t('Scheme Default'),
+ 'red' => t('red'),
+ 'black' => t('black'),
+ 'silver' => t('silver'),
+ );
+
+if(feature_enabled(local_user(),'expert'))
+ $expert = 1;
+
+ $t = get_markup_template('theme_settings.tpl');
+ $o .= replace_macros($t, array(
'$submit' => t('Submit'),
'$baseurl' => $a->get_baseurl(),
+ '$expert' => $expert,
'$title' => t("Theme settings"),
- '$font_size' => array('redbasic_font_size', t('Set font-size for posts and comments'), $font_size, '', $font_sizes),
- '$line_height' => array('redbasic_line_height', t('Set line-height for posts and comments'), $line_height, '', $line_heights),
- '$colour' => array('redbasic_colour', t('Set colour scheme'), $colour, '', $colours),
- ));
+ '$schema' => array('redbasic_schema', t('Set scheme'), $arr['schema'], '', $scheme_choices),
+ '$nav_colour' => array('redbasic_nav_colour', t('Navigation bar colour'), $arr['nav_colour'], '', $nav_colours),
+ '$banner_colour' => array('redbasic_banner_colour', t('Set font-colour for banner'), $arr['banner_colour']),
+ '$bgcolour' => array('redbasic_background_colour', t('Set the background colour'), $arr['bgcolour']),
+ '$background_image' => array('redbasic_background_image', t('Set the background image'), $arr['background_image']),
+ '$item_colour' => array('redbasic_item_colour', t('Set the background colour of items'), $arr['item_colour']),
+ '$item_opacity' => array('redbasic_item_opacity', t('Set the opacity of items'), $arr['item_opacity']),
+ '$toolicon_colour' => array('redbasic_toolicon_colour',t('Set the basic colour for item icons'),$arr['toolicon_colour']),
+ '$toolicon_activecolour' => array('redbasic_toolicon_activecolour',t('Set the hover colour for item icons'),$arr['toolicon_activecolour']),
+ '$body_font_size' => array('redbasic_body_font_size', t('Set font-size for the entire application'), $arr['body_font_size']),
+ '$font_size' => array('redbasic_font_size', t('Set font-size for posts and comments'), $arr['font_size']),
+ '$font_colour' => array('redbasic_font_colour', t('Set font-colour for posts and comments'), $arr['font_colour']),
+ '$radius' => array('redbasic_radius', t('Set radius of corners'), $arr['radius']),
+ '$shadow' => array('redbasic_shadow', t('Set shadow depth of photos'), $arr['shadow']),
+ '$converse_width' => array('redbasic_converse_width',t('Set maximum width of conversation regions'),$arr['converse_width']),
+ '$nav_min_opacity' => array('redbasic_nav_min_opacity',t('Set minimum opacity of nav bar - to hide it'),$arr['nav_min_opacity']),
+ '$top_photo' => array('redbasic_top_photo', t('Set size of conversation author photo'), $arr['top_photo']),
+ '$reply_photo' => array('redbasic_reply_photo', t('Set size of followup author photos'), $arr['reply_photo']),
+ '$sloppy_photos' => array('redbasic_sloppy_photos',t('Sloppy photo albums'),$arr['sloppy_photos'],t('Are you a clean desk or a messy desk person?')),
+ ));
return $o;
}
-
diff --git a/view/theme/redbasic/php/style.php b/view/theme/redbasic/php/style.php
index 99ad06c55..9956ccd31 100644
--- a/view/theme/redbasic/php/style.php
+++ b/view/theme/redbasic/php/style.php
@@ -1,46 +1,175 @@
<?php
- $line_height = false;
- $redbasic_font_size = false;
- $resolution = false;
- $colour = false;
- $site_line_height = get_config("redbasic","line_height");
- $site_redbasic_font_size = get_config("redbasic", "font_size" );
- $site_colour = get_config("redbasic", "colour" );
-
- if (local_user()) {
- $line_height = get_pconfig(local_user(), "redbasic","line_height");
- $redbasic_font_size = get_pconfig(local_user(), "redbasic", "font_size");
- $colour = get_pconfig(local_user(), "redbasic", "colour");
- }
-
- if ($line_height === false) {
- $line_height = $site_line_height;
- }
- if ($line_height === false) {
- $line_height = "1.2";
- }
- if ($redbasic_font_size === false) {
- $redbasic_font_size = $site_redbasic_font_size;
- }
- if ($redbasic_font_size === false) {
- $redbasic_font_size = "12";
- }
- if ($colour === false) {
- $colour = $site_colour;
+// Get the UID of the channel owner
+ $uid = get_theme_uid();
+
+ if($uid)
+ load_pconfig($uid,'redbasic');
+
+// Nav colours are mess. Set $nav_colour as a single word for the sake of letting folk pick one
+// but it actually consists of at least two colours to form a gradient - $nav_bg_1 and $nav_bg_2
+// A further two - $nav_bg_3 and $nav_bg_4 are used to create the hover, if any particular scheme
+// wants to implement that
+ $nav_colour = get_pconfig($uid, "redbasic", "nav_colour");
+
+// Load the owners pconfig
+ $banner_colour = get_pconfig($uid,'redbasic','banner_colour');
+ $schema = get_pconfig($uid,'redbasic','schema');
+ $bgcolour = get_pconfig($uid, "redbasic", "background_colour");
+ $background_image = get_pconfig($uid, "redbasic", "background_image");
+ $toolicon_colour = get_pconfig($uid,'redbasic','toolicon_colour');
+ $toolicon_activecolour = get_pconfig($uid,'redbasic','toolicon_activecolour');
+ $item_colour = get_pconfig($uid, "redbasic", "item_colour");
+ $item_opacity = get_pconfig($uid, "redbasic", "item_opacity");
+ $body_font_size = get_pconfig($uid, "redbasic", "body_font_size");
+ $font_size = get_pconfig($uid, "redbasic", "font_size");
+ $font_colour = get_pconfig($uid, "redbasic", "font_colour");
+ $radius = get_pconfig($uid, "redbasic", "radius");
+ $shadow = get_pconfig($uid,"redbasic","photo_shadow");
+ $converse_width=get_pconfig($uid,"redbasic","converse_width");
+ $nav_min_opacity=get_pconfig($uid,'redbasic','nav_min_opacity');
+ $sloppy_photos=get_pconfig($uid,'redbasic','sloppy_photos');
+ $top_photo=get_pconfig($uid,'redbasic','top_photo');
+ $reply_photo=get_pconfig($uid,'redbasic','reply_photo');
+
+// Now load the scheme. If a value is changed above, we'll keep the settings
+// If not, we'll keep those defined by the schema
+// Setting $scheme to '' wasn't working for some reason, so we'll check it's
+// not --- like the mobile theme does instead.
+
+ if (($schema) && ($schema != '---')) {
+ // Check it exists, because this setting gets distributed to clones
+ if(file_exists('view/theme/redbasic/schema/' . $schema . '.php')) {
+ $schemefile = 'view/theme/redbasic/schema/' . $schema . '.php';
+ require_once ($schemefile);
+ }
}
- if($colour === false) {
- $colour = "light";
+ // If we haven't got a schema, load the default. We shouldn't touch this - we
+ // should leave it for admins to define for themselves.
+ if (! $schema) {
+ if(file_exists('view/theme/redbasic/schema/default.php')) {
+ $schemefile = 'view/theme/redbasic/schema/' . 'default.php';
+ require_once ($schemefile);
+ }
+ }
+
+
+//Set some defaults - we have to do this after pulling owner settings, and we have to check for each setting
+//individually. If we don't, we'll have problems if a user has set one, but not all options.
+
+ if (! $nav_colour) {
+ $nav_colour = "red";
+ $nav_bg_1 = "#f88";
+ $nav_bg_2 = "#b00";
+ $nav_bg_3 = "#f00";
+ $nav_bg_4 = "#b00";
+ }
+ if (! $banner_colour)
+ $banner_colour = "fff";
+ if (! $bgcolour)
+ $bgcolour = "#fdfdfd";
+ if (! $background_image)
+ $background_image ='';
+ if (! $item_colour)
+ $item_colour = "#fdfdfd";
+ if (! $toolicon_colour)
+ $toolicon_colour = '#777777';
+ if (! $toolicon_activecolour)
+ $toolicon_activecolour = '#000';
+ if (! $item_opacity)
+ $item_opacity = "1";
+ if (! $font_size)
+ $font_size = "1.0em";
+ if (! $body_font_size)
+ $body_font_size = "11px";
+ if (! $font_colour)
+ $font_colour = "#4D4D4D";
+ if (! $radius)
+ $radius = "0";
+ if (! $shadow)
+ $shadow = "0";
+ if(! $active_colour)
+ $active_colour = '#FFFFFF';
+ if (! $converse_width)
+ $converse_width="1024px";
+ if(! $top_photo)
+ $top_photo = '64px';
+ $pmenu_top = intval($top_photo) - 16 . 'px';
+ $wwtop = intval($top_photo) - 15 . 'px';
+ $comment_indent = intval($top_photo) + 10 . 'px';
+
+ if(! $reply_photo)
+ $reply_photo = '32px';
+ $pmenu_reply = intval($reply_photo) - 16 . 'px';
+
+ if($nav_min_opacity === false || $nav_min_opacity === '') {
+ $nav_float_min_opacity = 1.0;
+ $nav_percent_min_opacity = 100;
}
-
- if(file_exists('view/theme/' . current_theme() . '/css/style.css')) {
- echo file_get_contents('view/theme/' . current_theme() . '/css/style.css');
- }
- echo "\r\n";
-
- if(($redbasic_font_size >= 10.0) && ($redbasic_font_size <= 16.0)) {
- echo ".wall-item-content { font-size: $redbasic_font_size; }\r\n";
+ else {
+ $nav_float_min_opacity = (float) $nav_min_opacity;
+ $nav_percent_min_opacity = (int) 100 * $nav_min_opacity;
}
+
+
+// Nav colours have nested values, so we have to define the actual variables
+// used in the CSS from the higher level "red", "black", etc here
+ if ($nav_colour == "red") {
+ $nav_bg_1 = $nav_bg_3 = "#ba002f";
+ $nav_bg_2 = $nav_bg_4 = "#ad002c";
+ $search_background = "#EEEEEE";
+ $active_colour = '#444444';
+ }
+
+ if ($nav_colour == "black") {
+ $nav_bg_1 = $nav_bg_3 = "#000";
+ $nav_bg_2 = $nav_bg_4 = "#222";
+ $search_background = '#EEEEEE';
+ $active_colour = '#AAAAAA';
+ }
+ if ($nav_colour == "silver") {
+ $nav_bg_1 = $nav_bg_2 = $nav_bg_3 = $nav_bg_4 = "silver";
+ $search_background = '#EEEEEE';
+ }
+
+
+// Apply the settings
+ if(file_exists('view/theme/redbasic/css/style.css')) {
+ $x = file_get_contents('view/theme/redbasic/css/style.css');
+
+$options = array (
+'$nav_bg_1' => $nav_bg_1,
+'$nav_bg_2' => $nav_bg_2,
+'$nav_bg_3' => $nav_bg_3,
+'$nav_bg_4' => $nav_bg_4,
+'$banner_colour' => $banner_colour,
+'$search_background' => $search_background,
+'$bgcolour' => $bgcolour,
+'$background_image' => $background_image,
+'$item_colour' => $item_colour,
+'$item_opacity' => $item_opacity,
+'$toolicon_colour' => $toolicon_colour,
+'$toolicon_activecolour' => $toolicon_activecolour,
+'$font_size' => $font_size,
+'$font_colour' => $font_colour,
+'$body_font_size' => $body_font_size,
+'$radius' => $radius,
+'$shadow' => $shadow,
+'$active_colour' => $active_colour,
+'$converse_width' => $converse_width,
+'$nav_float_min_opacity' => $nav_float_min_opacity,
+'$nav_percent_min_opacity' => $nav_percent_min_opacity,
+'$top_photo' => $top_photo,
+'$reply_photo' => $reply_photo,
+'$pmenu_top' => $pmenu_top,
+'$pmenu_reply' => $pmenu_reply,
+'$wwtop' => $wwtop,
+'$comment_indent' => $comment_indent
+);
+
+echo str_replace(array_keys($options), array_values($options), $x);
+
+}
- if(($line_height >= 1.0) && ($line_height <= 1.5)) {
- echo ".wall-item-content { line-height: $line_height; }\r\n";
- }
+if($sloppy_photos && file_exists('view/theme/redbasic/css/sloppy_photos.css')) {
+ echo file_get_contents('view/theme/redbasic/css/sloppy_photos.css');
+}
diff --git a/view/theme/redbasic/php/theme.php b/view/theme/redbasic/php/theme.php
index 3d69a7e22..e68533bb4 100644
--- a/view/theme/redbasic/php/theme.php
+++ b/view/theme/redbasic/php/theme.php
@@ -1,9 +1,15 @@
<?php
+/**
+ * * Name: Redbasic
+ * * Description: RedMatrix standard theme
+ * * Version: 1.0
+ * * Author: Fabrixxm
+ * * Maintainer: Mike Macgirvin
+ * * Compat: Red [*]
+ *
+ */
+
function redbasic_init(&$a) {
- if($a->config['system']['theme_engine'])
- $a->set_template_engine($a->config['system']['theme_engine']);
- else
- $a->set_template_engine('smarty3');
-// head_add_js('redbasic.js');
+
}
diff --git a/view/theme/redbasic/php/theme_init.php b/view/theme/redbasic/php/theme_init.php
new file mode 100644
index 000000000..ccb85a070
--- /dev/null
+++ b/view/theme/redbasic/php/theme_init.php
@@ -0,0 +1,5 @@
+<?php
+
+head_add_css('library/font_awesome/css/font-awesome.min.css');
+require_once('view/php/theme_init.php');
+
diff --git a/view/theme/redbasic/schema/dark.php b/view/theme/redbasic/schema/dark.php
new file mode 100644
index 000000000..bd3642914
--- /dev/null
+++ b/view/theme/redbasic/schema/dark.php
@@ -0,0 +1,10 @@
+<?php
+
+ if (! $nav_colour)
+ $nav_colour = "black";
+ if (! $bgcolour)
+ $bgcolour = '#010101';
+ if (! $item_colour)
+ $item_colour = '#111';
+ if (! $font_colour)
+ $font_colour = '#fff';
diff --git a/view/theme/redbasic/tpl/smarty3/theme_settings.tpl b/view/theme/redbasic/tpl/smarty3/theme_settings.tpl
deleted file mode 100644
index f91f24de6..000000000
--- a/view/theme/redbasic/tpl/smarty3/theme_settings.tpl
+++ /dev/null
@@ -1,12 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-{{include file="field_select.tpl" field=$font_size}}
-
-{{include file="field_select.tpl" field=$line_height}}
-
-<div class="settings-submit-wrapper">
- <input type="submit" value="{{$submit}}" class="settings-submit" name="redbasic-settings-submit" />
-</div>
diff --git a/view/theme/redbasic/tpl/theme_settings.tpl b/view/theme/redbasic/tpl/theme_settings.tpl
index d0d153e73..e0f546896 100644
--- a/view/theme/redbasic/tpl/theme_settings.tpl
+++ b/view/theme/redbasic/tpl/theme_settings.tpl
@@ -1,7 +1,28 @@
-{{inc field_select.tpl with $field=$font_size}}{{endinc}}
-
-{{inc field_select.tpl with $field=$line_height}}{{endinc}}
+{{include file="field_select.tpl" field=$schema}}
+<div class="settings-submit-wrapper">
+ <input type="submit" value="{{$submit}}" class="settings-submit" name="redbasic-settings-submit" />
+</div>
+{{if $expert}}
+{{include file="field_select.tpl" field=$nav_colour}}
+{{include file="field_input.tpl" field=$banner_colour}}
+{{include file="field_input.tpl" field=$bgcolour}}
+{{include file="field_input.tpl" field=$background_image}}
+{{include file="field_input.tpl" field=$item_colour}}
+{{include file="field_input.tpl" field=$item_opacity}}
+{{include file="field_input.tpl" field=$toolicon_colour}}
+{{include file="field_input.tpl" field=$toolicon_activecolour}}
+{{include file="field_input.tpl" field=$body_font_size}}
+{{include file="field_input.tpl" field=$font_size}}
+{{include file="field_input.tpl" field=$font_colour}}
+{{include file="field_input.tpl" field=$radius}}
+{{include file="field_input.tpl" field=$shadow}}
+{{include file="field_input.tpl" field=$converse_width}}
+{{include file="field_input.tpl" field=$nav_min_opacity}}
+{{include file="field_input.tpl" field=$top_photo}}
+{{include file="field_input.tpl" field=$reply_photo}}
+{{include file="field_checkbox.tpl" field=$sloppy_photos}}
<div class="settings-submit-wrapper">
- <input type="submit" value="$submit" class="settings-submit" name="redbasic-settings-submit" />
+ <input type="submit" value="{{$submit}}" class="settings-submit" name="redbasic-settings-submit" />
</div>
+{{/if}}
diff --git a/view/tpl/404.tpl b/view/tpl/404.tpl
index bf4d4e949..518ad1d29 100644..100755
--- a/view/tpl/404.tpl
+++ b/view/tpl/404.tpl
@@ -1 +1 @@
-<h1>$message</h1>
+<h1>{{$message}}</h1>
diff --git a/view/tpl/abook_edit.tpl b/view/tpl/abook_edit.tpl
index 7f20f3398..590213fd3 100644..100755
--- a/view/tpl/abook_edit.tpl
+++ b/view/tpl/abook_edit.tpl
@@ -1,74 +1,92 @@
+<div class="generic-content-wrapper">
+<h2>{{$header}}</h2>
-<h2>$header</h2>
+<h3>{{$addr}}</h3>
-<h3>$addr</h3>
-
-{{ if $notself }}
+{{if $notself}}
<div id="connection-flag-tabs">
-$tabs
+{{$tabs}}
</div>
-{{ endif }}
+{{/if}}
-{{ if $self }}
-<div id="autoperm-desc" class="descriptive-paragraph">$autolbl</div>
-{{ endif }}
+{{if $self}}
+<div id="autoperm-desc" class="descriptive-paragraph">{{$autolbl}}</div>
+{{/if}}
<div id="contact-edit-wrapper">
-{{ if $notself }}
-{{ if $slide }}
-<h3>$lbl_slider</h3>
+{{if $last_update}}
+{{$lastupdtext}} {{$last_update}}
+{{/if}}
+
+{{if $notself}}
+{{if $slide}}
+<h3>{{$lbl_slider}}</h3>
-$slide
+{{$slide}}
-{{ endif }}
-{{ endif }}
+{{/if}}
+{{/if}}
-<h3>$permlbl</h3>
+<h3>{{$permlbl}}</h3>
+<div id="perm-desc" class="descriptive-text">{{$permnote}}</div>
-<form id="abook-edit-form" action="connections/$contact_id" method="post" >
-<input type="hidden" name="contact_id" value="$contact_id">
-<input id="contact-closeness-mirror" type="hidden" name="closeness" value="$close" />
+<form id="abook-edit-form" action="connedit/{{$contact_id}}" method="post" >
+<input type="hidden" name="contact_id" value="{{$contact_id}}">
+<input id="contact-closeness-mirror" type="hidden" name="closeness" value="{{$close}}" />
-{{ if $noperms }}
-<div id="noperm-desc" class="descriptive-paragraph">$noperms</div>
-{{ endif }}
+{{if $noperms}}
+<div id="noperm-msg" class="warning-text">{{$noperms}}</div>
+<div id="noperm-text" class="descriptive-text">{{$noperm_desc}}</div>
+{{/if}}
-{{ if $is_pending }}
-{{inc field_checkbox.tpl with $field=$unapproved }}{{endinc}}
-{{ endif }}
+{{if $is_pending}}
+<div class="abook-pending-contact">
+{{include file="field_checkbox.tpl" field=$unapproved}}
+</div>
+{{/if}}
<br />
-<b>$quick</b>
+<b>{{$quick}}</b>
<ul>
-{{ if $self }}
-<li><span class="fakelink" onclick="connectForum(); $('#abook-edit-form').submit();">$forum</span></li>
-<li><span class="fakelink" onclick="connectSoapBox(); $('#abook-edit-form').submit();">$soapbox</span></li>
-{{ endif }}
-<li><span class="fakelink" onclick="connectFullShare(); $('#abook-edit-form').submit();">$full</span></li>
-<li><span class="fakelink" onclick="connectCautiousShare(); $('#abook-edit-form').submit();">$cautious</span></li>
-<li><span class="fakelink" onclick="connectFollowOnly(); $('#abook-edit-form').submit();">$follow</span></li>
+{{if $self}}
+<li><span class="fakelink" onclick="connectForum(); // $('#abook-edit-form').submit();">{{$forum}}</span></li>
+<li><span class="fakelink" onclick="connectSoapBox(); // $('#abook-edit-form').submit();">{{$soapbox}}</span></li>
+{{/if}}
+<li><span class="fakelink" onclick="connectFullShare(); // $('#abook-edit-form').submit();">{{$full}}</span></li>
+<li><span class="fakelink" onclick="connectCautiousShare(); // $('#abook-edit-form').submit();">{{$cautious}}</span></li>
+<li><span class="fakelink" onclick="connectFollowOnly(); // $('#abook-edit-form').submit();">{{$follow}}</span></li>
</ul>
-<div id="abook-advanced" class="fakelink" onclick="openClose('abook-advanced-panel');">$advanced</div>
+<div id="abook-advanced" class="fakelink" onclick="openClose('abook-advanced-panel');">{{$advanced}}</div>
-<div id="abook-advanced-panel" style="display: none;">
+<div id="abook-advanced-panel" style="display: block;">
-<span class="abook-them">$them</span><span class="abook-me">$me</span>
+<span class="abook-them">{{$them}}</span><span class="abook-me">{{$me}}</span>
<br />
<br />
-{{ for $perms as $prm }}
-{{inc field_acheckbox.tpl with $field=$prm }}{{endinc}}
-{{ endfor }}
+{{foreach $perms as $prm}}
+{{include file="field_acheckbox.tpl" field=$prm}}
+{{/foreach}}
<br />
</div>
-<input class="contact-edit-submit" type="submit" name="done" value="$submit" />
+{{if $multiprofs }}
+<div>
+<h3>{{$lbl_vis1}}</h3>
+<div>{{$lbl_vis2}}</div>
+
+{{$profile_select}}
+</div>
+{{/if}}
+
+<input class="contact-edit-submit" type="submit" name="done" value="{{$submit}}" />
</form>
</div>
+</div>
diff --git a/view/tpl/acl_selector.tpl b/view/tpl/acl_selector.tpl
index e5231b0f8..d21073b56 100644..100755
--- a/view/tpl/acl_selector.tpl
+++ b/view/tpl/acl_selector.tpl
@@ -1,6 +1,6 @@
<div id="acl-wrapper">
<input id="acl-search">
- <a href="#" id="acl-showall">$showall</a>
+ <a href="#" id="acl-showall">{{$showall}}</a>
<div id="acl-list">
<div id="acl-list-content">
</div>
@@ -10,8 +10,8 @@
<div class="acl-list-item" rel="acl-template" style="display:none">
<img src="{0}"><p>{1}</p>
- <a href="#" class='acl-button-show'>$show</a>
- <a href="#" class='acl-button-hide'>$hide</a>
+ <a href="#" class='acl-button-show'>{{$show}}</a>
+ <a href="#" class='acl-button-hide'>{{$hide}}</a>
</div>
<script>
@@ -20,7 +20,7 @@ $(document).ready(function() {
if(typeof acl=="undefined"){
acl = new ACL(
baseurl+"/acl",
- [ $allowcid,$allowgid,$denycid,$denygid ]
+ [ {{$allowcid}},{{$allowgid}},{{$denycid}},{{$denygid}} ]
);
}
}, 5000 );
diff --git a/view/tpl/admin_aside.tpl b/view/tpl/admin_aside.tpl
index ca1f4985c..fdf070aa2 100644..100755
--- a/view/tpl/admin_aside.tpl
+++ b/view/tpl/admin_aside.tpl
@@ -10,33 +10,34 @@
});
});
</script>
-<h4><a href="$admurl">$admtxt</a></h4>
+<h4><a href="{{$admurl}}">{{$admtxt}}</a></h4>
<ul class='admin linklist'>
- <li class='admin link button $admin.site.2'><a href='$admin.site.0'>$admin.site.1</a></li>
- <li class='admin link button $admin.users.2'><a href='$admin.users.0'>$admin.users.1</a><span id='pending-update' title='$h_pending'></span></li>
- <li class='admin link button $admin.plugins.2'><a href='$admin.plugins.0'>$admin.plugins.1</a></li>
- <li class='admin link button $admin.themes.2'><a href='$admin.themes.0'>$admin.themes.1</a></li>
- <li class='admin link button $admin.dbsync.2'><a href='$admin.dbsync.0'>$admin.dbsync.1</a></li>
+ <li class='admin link button {{$admin.site.2}}'><a href='{{$admin.site.0}}'>{{$admin.site.1}}</a></li>
+ <li class='admin link button {{$admin.users.2}}'><a href='{{$admin.users.0}}'>{{$admin.users.1}}</a><span id='pending-update' title='{{$h_pending}}'></span></li>
+ <li class='admin link button {{$admin.plugins.2}}'><a href='{{$admin.plugins.0}}'>{{$admin.plugins.1}}</a></li>
+ <li class='admin link button {{$admin.themes.2}}'><a href='{{$admin.themes.0}}'>{{$admin.themes.1}}</a></li>
+ <li class='admin link button {{$admin.hubloc.2}}'><a href='{{$admin.hubloc.0}}'>{{$admin.hubloc.1}}</a></li>
+ <li class='admin link button {{$admin.dbsync.2}}'><a href='{{$admin.dbsync.0}}'>{{$admin.dbsync.1}}</a></li>
</ul>
-{{ if $admin.update }}
+{{if $admin.update}}
<ul class='admin linklist'>
- <li class='admin link button $admin.update.2'><a href='$admin.update.0'>$admin.update.1</a></li>
- <li class='admin link button $admin.update.2'><a href='https://kakste.com/profile/inthegit'>Important Changes</a></li>
+ <li class='admin link button {{$admin.update.2}}'><a href='{{$admin.update.0}}'>{{$admin.update.1}}</a></li>
+ <li class='admin link button {{$admin.update.2}}'><a href='https://kakste.com/profile/inthegit'>Important Changes</a></li>
</ul>
-{{ endif }}
+{{/if}}
-{{ if $admin.plugins_admin }}<h4>$plugadmtxt</h4>{{ endif }}
+{{if $admin.plugins_admin}}<h4>{{$plugadmtxt}}</h4>{{/if}}
<ul class='admin linklist'>
- {{ for $admin.plugins_admin as $l }}
- <li class='admin link button $l.2'><a href='$l.0'>$l.1</a></li>
- {{ endfor }}
+ {{foreach $admin.plugins_admin as $l}}
+ <li class='admin link button {{$l.2}}'><a href='{{$l.0}}'>{{$l.1}}</a></li>
+ {{/foreach}}
</ul>
-<h4>$logtxt</h4>
+<h4>{{$logtxt}}</h4>
<ul class='admin linklist'>
- <li class='admin link button $admin.logs.2'><a href='$admin.logs.0'>$admin.logs.1</a></li>
+ <li class='admin link button {{$admin.logs.2}}'><a href='{{$admin.logs.0}}'>{{$admin.logs.1}}</a></li>
</ul>
diff --git a/view/tpl/admin_hubloc.tpl b/view/tpl/admin_hubloc.tpl
new file mode 100755
index 000000000..a9f250652
--- /dev/null
+++ b/view/tpl/admin_hubloc.tpl
@@ -0,0 +1,22 @@
+<div class="generic-content-wrapper" id='adminpage'>
+ <h1>{{$title}} - {{$page}}</h1>
+
+ <form action="{{$baseurl}}/admin/hubloc" method="post">
+ <input type='hidden' name='form_security_token' value='{{$form_security_token}}'>
+
+ <table id='server'>
+ <thead>
+ <tr>
+ {{foreach $th_hubloc as $th}}<th>{{$th}}</th>{{/foreach}}
+ </tr>
+ </thead>
+ <tbody>
+
+ {{foreach $hubloc as $hub}}<tr>
+ <td>{{$hub.hubloc_id}}</td><td>{{$hub.hubloc_addr}}</td><td>{{$hub.hubloc_host}}</td><td>{{$hub.hubloc_status}}</td>
+ </tr>{{/foreach}}
+ </tbody>
+ </table>
+
+
+</div>
diff --git a/view/tpl/admin_logs.tpl b/view/tpl/admin_logs.tpl
index b777cf420..3d2adc660 100644..100755
--- a/view/tpl/admin_logs.tpl
+++ b/view/tpl/admin_logs.tpl
@@ -1,19 +1,19 @@
-<div id='adminpage'>
- <h1>$title - $page</h1>
+<div class="generic-content-wrapper" id='adminpage'>
+ <h1>{{$title}} - {{$page}}</h1>
- <form action="$baseurl/admin/logs" method="post">
- <input type='hidden' name='form_security_token' value='$form_security_token'>
+ <form action="{{$baseurl}}/admin/logs" method="post">
+ <input type='hidden' name='form_security_token' value='{{$form_security_token}}'>
- {{ inc field_checkbox.tpl with $field=$debugging }}{{ endinc }}
- {{ inc field_input.tpl with $field=$logfile }}{{ endinc }}
- {{ inc field_select.tpl with $field=$loglevel }}{{ endinc }}
+ {{include file="field_checkbox.tpl" field=$debugging}}
+ {{include file="field_input.tpl" field=$logfile}}
+ {{include file="field_select.tpl" field=$loglevel}}
- <div class="submit"><input type="submit" name="page_logs" value="$submit" /></div>
+ <div class="submit"><input type="submit" name="page_logs" value="{{$submit}}" /></div>
</form>
- <h3>$logname</h3>
- <div style="width:100%; height:400px; overflow: auto; "><pre>$data</pre></div>
-<!-- <iframe src='$baseurl/$logname' style="width:100%; height:400px"></iframe> -->
- <!-- <div class="submit"><input type="submit" name="page_logs_clear_log" value="$clear" /></div> -->
+ <h3>{{$logname}}</h3>
+ <div style="width:100%; height:400px; overflow: auto; "><pre>{{$data}}</pre></div>
+<!-- <iframe src='{{$baseurl}}/{{$logname}}' style="width:100%; height:400px"></iframe> -->
+ <!-- <div class="submit"><input type="submit" name="page_logs_clear_log" value="{{$clear}}" /></div> -->
</div>
diff --git a/view/tpl/admin_plugins.tpl b/view/tpl/admin_plugins.tpl
index 74b56bb4e..40821c534 100644..100755
--- a/view/tpl/admin_plugins.tpl
+++ b/view/tpl/admin_plugins.tpl
@@ -1,15 +1,15 @@
-<div id='adminpage'>
- <h1>$title - $page</h1>
+<div class="generic-content-wrapper" id='adminpage'>
+ <h1>{{$title}} - {{$page}}</h1>
<ul id='pluginslist'>
- {{ for $plugins as $p }}
- <li class='plugin $p.1'>
- <a class='toggleplugin' href='$baseurl/admin/$function/$p.0?a=t&amp;t=$form_security_token' title="{{if $p.1==on }}Disable{{ else }}Enable{{ endif }}" ><span class='icon $p.1'></span></a>
- <a href='$baseurl/admin/$function/$p.0'><span class='name'>$p.2.name</span></a> - <span class="version">$p.2.version</span>
- {{ if $p.2.experimental }} $experimental {{ endif }}{{ if $p.2.unsupported }} $unsupported {{ endif }}
+ {{foreach $plugins as $p}}
+ <li class='plugin {{$p.1}}'>
+ <a class='toggleplugin' href='{{$baseurl}}/admin/{{$function}}/{{$p.0}}?a=t&amp;t={{$form_security_token}}' title="{{if $p.1==on}}Disable{{else}}Enable{{/if}}" ><i class='{{if $p.1==on}}icon-check{{else}}icon-check-empty{{/if}} admin-icons'></i></a>
+ <a href='{{$baseurl}}/admin/{{$function}}/{{$p.0}}'><span class='name'>{{$p.2.name}}</span></a> - <span class="version">{{$p.2.version}}</span>
+ {{if $p.2.experimental}} {{$experimental}} {{/if}}{{if $p.2.unsupported}} {{$unsupported}} {{/if}}
- <div class='desc'>$p.2.description</div>
+ <div class='desc'>{{$p.2.description}}</div>
</li>
- {{ endfor }}
+ {{/foreach}}
</ul>
</div>
diff --git a/view/tpl/admin_plugins_details.tpl b/view/tpl/admin_plugins_details.tpl
index 931c7b83c..1c1a59879 100644..100755
--- a/view/tpl/admin_plugins_details.tpl
+++ b/view/tpl/admin_plugins_details.tpl
@@ -1,36 +1,36 @@
-<div id='adminpage'>
- <h1>$title - $page</h1>
+<div class = "generic-content-wrapper" id='adminpage'>
+ <h1>{{$title}} - {{$page}}</h1>
- <p><span class='toggleplugin icon $status'></span> $info.name - $info.version : <a href="$baseurl/admin/$function/$plugin/?a=t&amp;t=$form_security_token">$action</a></p>
- <p>$info.description</p>
+ <p><i class='toggleplugin {{if $status==on}}icon-check{{else}}icon-check-empty{{/if}} admin-icons'></i> {{$info.name}} - {{$info.version}} : <a href="{{$baseurl}}/admin/{{$function}}/{{$plugin}}/?a=t&amp;t={{$form_security_token}}">{{$action}}</a></p>
+ <p>{{$info.description}}</p>
- <p class="author">$str_author
- {{ for $info.author as $a }}
- {{ if $a.link }}<a href="$a.link">$a.name</a>{{ else }}$a.name{{ endif }},
- {{ endfor }}
+ <p class="author">{{$str_author}}
+ {{foreach $info.author as $a}}
+ {{if $a.link}}<a href="{{$a.link}}">{{$a.name}}</a>{{else}}{{$a.name}}{{/if}},
+ {{/foreach}}
</p>
- <p class="maintainer">$str_maintainer
- {{ for $info.maintainer as $a }}
- {{ if $a.link }}<a href="$a.link">$a.name</a>{{ else }}$a.name{{ endif }},
- {{ endfor }}
+ <p class="maintainer">{{$str_maintainer}}
+ {{foreach $info.maintainer as $a}}
+ {{if $a.link}}<a href="{{$a.link}}">{{$a.name}}</a>{{else}}{{$a.name}}{{/if}},
+ {{/foreach}}
</p>
- {{ if $screenshot }}
- <a href="$screenshot.0" class='screenshot'><img src="$screenshot.0" alt="$screenshot.1" /></a>
- {{ endif }}
+ {{if $screenshot}}
+ <a href="{{$screenshot.0}}" class='screenshot'><img src="{{$screenshot.0}}" alt="{{$screenshot.1}}" /></a>
+ {{/if}}
- {{ if $admin_form }}
- <h3>$settings</h3>
- <form method="post" action="$baseurl/admin/$function/$plugin/">
- $admin_form
+ {{if $admin_form}}
+ <h3>{{$settings}}</h3>
+ <form method="post" action="{{$baseurl}}/admin/{{$function}}/{{$plugin}}/">
+ {{$admin_form}}
</form>
- {{ endif }}
+ {{/if}}
- {{ if $readme }}
+ {{if $readme}}
<h3>Readme</h3>
<div id="plugin_readme">
- $readme
+ {{$readme}}
</div>
- {{ endif }}
+ {{/if}}
</div>
diff --git a/view/tpl/admin_remoteupdate.tpl b/view/tpl/admin_remoteupdate.tpl
deleted file mode 100644
index 874c6e626..000000000
--- a/view/tpl/admin_remoteupdate.tpl
+++ /dev/null
@@ -1,98 +0,0 @@
-<script src="js/jquery.htmlstream.js"></script>
-<script>
- /* ajax updater */
- function updateEnd(data){
- //$("#updatepopup .panel_text").html(data);
- $("#remoteupdate_form").find("input").removeAttr('disabled');
- $(".panel_action_close").fadeIn()
- }
- function updateOn(data){
-
- var patt=/§([^§]*)§/g;
- var matches = data.match(patt);
- $(matches).each(function(id,data){
- data = data.replace(/§/g,"");
- d = data.split("@");
- console.log(d);
- elm = $("#updatepopup .panel_text #"+d[0]);
- html = "<div id='"+d[0]+"' class='progress'>"+d[1]+"<span>"+d[2]+"</span></div>";
- if (elm.length==0){
- $("#updatepopup .panel_text").append(html);
- } else {
- $(elm).replaceWith(html);
- }
- });
-
-
- }
-
- $(function(){
- $("#remoteupdate_form").submit(function(){
- var data={};
- $(this).find("input").each(function(i, e){
- name = $(e).attr('name');
- value = $(e).val();
- e.disabled = true;
- data[name]=value;
- });
-
- $("#updatepopup .panel_text").html("");
- $("#updatepopup").show();
- $("#updatepopup .panel").hide().slideDown(500);
- $(".panel_action_close").hide().click(function(){
- $("#updatepopup .panel").slideUp(500, function(){
- $("#updatepopup").hide();
- });
- });
-
- $.post(
- $(this).attr('action'),
- data,
- updateEnd,
- 'text',
- updateOn
- );
-
-
- return false;
- })
- });
-</script>
-<div id="updatepopup" class="popup">
- <div class="background"></div>
- <div class="panel">
- <div class="panel_in">
- <h1>Friendica Update</h1>
- <div class="panel_text"></div>
- <div class="panel_actions">
- <input type="button" value="$close" class="panel_action_close">
- </div>
- </div>
- </div>
-</div>
-<div id="adminpage">
- <dl> <dt>Your version:</dt><dd>$localversion</dd> </dl>
-{{ if $needupdate }}
- <dl> <dt>New version:</dt><dd>$remoteversion</dd> </dl>
-
- <form id="remoteupdate_form" method="POST" action="$baseurl/admin/update">
- <input type="hidden" name="$remotefile.0" value="$remotefile.2">
-
- {{ if $canwrite }}
- <div class="submit"><input type="submit" name="remoteupdate" value="$submit" /></div>
- {{ else }}
- <h3>Your friendica installation is not writable by web server.</h3>
- {{ if $canftp }}
- <p>You can try to update via FTP</p>
- {{ inc field_input.tpl with $field=$ftphost }}{{ endinc }}
- {{ inc field_input.tpl with $field=$ftppath }}{{ endinc }}
- {{ inc field_input.tpl with $field=$ftpuser }}{{ endinc }}
- {{ inc field_password.tpl with $field=$ftppwd }}{{ endinc }}
- <div class="submit"><input type="submit" name="remoteupdate" value="$submit" /></div>
- {{ endif }}
- {{ endif }}
- </form>
-{{ else }}
-<h4>No updates</h4>
-{{ endif }}
-</div>
diff --git a/view/tpl/admin_site.tpl b/view/tpl/admin_site.tpl
index e09996aee..b0f9d4a74 100644..100755
--- a/view/tpl/admin_site.tpl
+++ b/view/tpl/admin_site.tpl
@@ -6,7 +6,7 @@
autoDimensions: false,
onStart: function(){
var theme = $("#id_theme :selected").val();
- $("#cnftheme").attr('href',"$baseurl/admin/themes/"+theme);
+ $("#cnftheme").attr('href',"{{$baseurl}}/admin/themes/"+theme);
},
onComplete: function(){
$("div#fancybox-content form").submit(function(e){
@@ -34,49 +34,52 @@
});
});
</script>
-<div id='adminpage'>
- <h1>$title - $page</h1>
+<div id="adminpage" class="generic-content-wrapper">
+ <h1>{{$title}} - {{$page}}</h1>
- <form action="$baseurl/admin/site" method="post">
- <input type='hidden' name='form_security_token' value='$form_security_token'>
+ <form action="{{$baseurl}}/admin/site" method="post">
+ <input type='hidden' name='form_security_token' value='{{$form_security_token}}'>
+
+ {{include file="field_input.tpl" field=$sitename}}
+ {{include file="field_textarea.tpl" field=$banner}}
+ {{include file="field_select.tpl" field=$language}}
+ {{include file="field_select.tpl" field=$theme}}
+ {{include file="field_select.tpl" field=$theme_mobile}}
+ {{include file="field_select.tpl" field=$theme_accessibility}}
+ {{include file="field_input.tpl" field=$site_channel}}
+ {{include file="field_checkbox.tpl" field=$no_login_on_homepage}}
- {{ inc field_input.tpl with $field=$sitename }}{{ endinc }}
- {{ inc field_textarea.tpl with $field=$banner }}{{ endinc }}
- {{ inc field_select.tpl with $field=$language }}{{ endinc }}
- {{ inc field_select.tpl with $field=$theme }}{{ endinc }}
- {{ inc field_select.tpl with $field=$ssl_policy }}{{ endinc }}
- <div class="submit"><input type="submit" name="page_site" value="$submit" /></div>
+ <div class="submit"><input type="submit" name="page_site" value="{{$submit}}" /></div>
- <h3>$registration</h3>
- {{ inc field_input.tpl with $field=$register_text }}{{ endinc }}
- {{ inc field_select.tpl with $field=$register_policy }}{{ endinc }}
+ <h3>{{$registration}}</h3>
+ {{include file="field_input.tpl" field=$register_text}}
+ {{include file="field_select.tpl" field=$register_policy}}
+ {{include file="field_select.tpl" field=$access_policy}}
- <div class="submit"><input type="submit" name="page_site" value="$submit" /></div>
+ <div class="submit"><input type="submit" name="page_site" value="{{$submit}}" /></div>
- <h3>$upload</h3>
- {{ inc field_input.tpl with $field=$maximagesize }}{{ endinc }}
+ <h3>{{$upload}}</h3>
+ {{include file="field_input.tpl" field=$maximagesize}}
- <h3>$corporate</h3>
- {{ inc field_input.tpl with $field=$allowed_sites }}{{ endinc }}
- {{ inc field_input.tpl with $field=$allowed_email }}{{ endinc }}
- {{ inc field_checkbox.tpl with $field=$block_public }}{{ endinc }}
- {{ inc field_checkbox.tpl with $field=$force_publish }}{{ endinc }}
- {{ inc field_checkbox.tpl with $field=$no_community_page }}{{ endinc }}
- {{ inc field_input.tpl with $field=$global_directory }}{{ endinc }}
+ <h3>{{$corporate}}</h3>
+ {{include file="field_input.tpl" field=$allowed_sites}}
+ {{include file="field_input.tpl" field=$allowed_email}}
+ {{include file="field_checkbox.tpl" field=$block_public}}
+ {{include file="field_checkbox.tpl" field=$force_publish}}
- <div class="submit"><input type="submit" name="page_site" value="$submit" /></div>
+ <div class="submit"><input type="submit" name="page_site" value="{{$submit}}" /></div>
- <h3>$advanced</h3>
- {{ inc field_input.tpl with $field=$proxy }}{{ endinc }}
- {{ inc field_input.tpl with $field=$proxyuser }}{{ endinc }}
- {{ inc field_input.tpl with $field=$timeout }}{{ endinc }}
- {{ inc field_input.tpl with $field=$delivery_interval }}{{ endinc }}
- {{ inc field_input.tpl with $field=$poll_interval }}{{ endinc }}
- {{ inc field_input.tpl with $field=$maxloadavg }}{{ endinc }}
- {{ inc field_input.tpl with $field=$abandon_days }}{{ endinc }}
+ <h3>{{$advanced}}</h3>
+ {{include file="field_input.tpl" field=$proxy}}
+ {{include file="field_input.tpl" field=$proxyuser}}
+ {{include file="field_input.tpl" field=$timeout}}
+ {{include file="field_input.tpl" field=$delivery_interval}}
+ {{include file="field_input.tpl" field=$poll_interval}}
+ {{include file="field_input.tpl" field=$maxloadavg}}
+ {{include file="field_input.tpl" field=$abandon_days}}
- <div class="submit"><input type="submit" name="page_site" value="$submit" /></div>
+ <div class="submit"><input type="submit" name="page_site" value="{{$submit}}" /></div>
</form>
</div>
diff --git a/view/tpl/admin_summary.tpl b/view/tpl/admin_summary.tpl
index 99221c13e..24cdd57cc 100644..100755
--- a/view/tpl/admin_summary.tpl
+++ b/view/tpl/admin_summary.tpl
@@ -1,40 +1,36 @@
-<div id='adminpage'>
- <h1>$title - $page</h1>
+<div class="generic-content-wrapper" id='adminpage'>
+ <h1>{{$title}} - {{$page}}</h1>
<dl>
- <dt>$queues.label</dt>
- <dd>$queues.queue</dd>
+ <dt>{{$queues.label}}</dt>
+ <dd>{{$queues.queue}}</dd>
</dl>
<dl>
- <dt>$pending.0</dt>
- <dd>$pending.1</dt>
+ <dt>{{$pending.0}}</dt>
+ <dd>{{$pending.1}}</dt>
</dl>
<dl>
- <dt>$users.0</dt>
- <dd>$users.1</dd>
+ <dt>{{$users.0}}</dt>
+ <dd>{{$users.1}}</dd>
</dl>
- {{ for $accounts as $p }}
+ <!-- $accounts is empty
+ {{foreach $accounts as $p}}
<dl>
- <dt>$p.0</dt>
- <dd>{{ if $p.1 }}$p.1{{ else }}0{{ endif }}</dd>
+ <dt>{{$p.0}}</dt>
+ <dd>{{if $p.1}}{{$p.1}}{{else}}0{{/if}}</dd>
</dl>
- {{ endfor }}
-
-
+ {{/foreach}} -->
<dl>
- <dt>$plugins.0</dt>
-
- {{ for $plugins.1 as $p }}
- <dd>$p</dd>
- {{ endfor }}
-
+ <dt>{{$plugins.0}}</dt>
+ <dd>
+ {{foreach $plugins.1 as $p}} {{$p}} {{/foreach}}
+ &nbsp;
+ </dd>
</dl>
-
<dl>
- <dt>$version.0</dt>
- <dd>$version.1 - $build</dt>
+ <dt>{{$version.0}}</dt>
+ <dd>{{$version.1}} - {{$build}}</dd>
</dl>
-
</div>
diff --git a/view/tpl/admin_users.tpl b/view/tpl/admin_users.tpl
index 727030f5d..3549dc5c2 100644..100755
--- a/view/tpl/admin_users.tpl
+++ b/view/tpl/admin_users.tpl
@@ -1,89 +1,92 @@
<script>
function confirm_delete(uname){
- return confirm( "$confirm_delete".format(uname));
+ return confirm( "{{$confirm_delete}}".format(uname));
}
function confirm_delete_multi(){
- return confirm("$confirm_delete_multi");
+ return confirm("{{$confirm_delete_multi}}");
}
function selectall(cls){
$("."+cls).attr('checked','checked');
return false;
}
</script>
-<div id='adminpage'>
- <h1>$title - $page</h1>
+<div class = "generic-content-wrapper" id='adminpage'>
+ <h1>{{$title}} - {{$page}}</h1>
- <form action="$baseurl/admin/users" method="post">
- <input type='hidden' name='form_security_token' value='$form_security_token'>
+ <form action="{{$baseurl}}/admin/users" method="post">
+ <input type='hidden' name='form_security_token' value='{{$form_security_token}}'>
- <h3>$h_pending</h3>
- {{ if $pending }}
+ <h3>{{$h_pending}}</h3>
+ {{if $pending}}
<table id='pending'>
<thead>
<tr>
- {{ for $th_pending as $th }}<th>$th</th>{{ endfor }}
+ {{foreach $th_pending as $th}}<th>{{$th}}</th>{{/foreach}}
<th></th>
<th></th>
</tr>
</thead>
<tbody>
- {{ for $pending as $u }}
+ {{foreach $pending as $u}}
<tr>
- <td class="created">$u.created</td>
- <td class="name">$u.name</td>
- <td class="email">$u.email</td>
- <td class="checkbox"><input type="checkbox" class="pending_ckbx" id="id_pending_$u.hash" name="pending[]" value="$u.hash" /></td>
+ <td class="created">{{$u.created}}</td>
+ <td class="name">{{$u.name}}</td>
+ <td class="email">{{$u.email}}</td>
+ <td class="checkbox"><input type="checkbox" class="pending_ckbx" id="id_pending_{{$u.hash}}" name="pending[]" value="{{$u.hash}}" /></td>
<td class="tools">
- <a href="$baseurl/regmod/allow/$u.hash" title='$approve'><span class='icon like'></span></a>
- <a href="$baseurl/regmod/deny/$u.hash" title='$deny'><span class='icon dislike'></span></a>
+ <a href="{{$baseurl}}/regmod/allow/{{$u.hash}}" title='{{$approve}}'><i class='icon-thumbs-up-alt admin-icons'></i></a>
+ <a href="{{$baseurl}}/regmod/deny/{{$u.hash}}" title='{{$deny}}'><i class='icon-thumbs-down-alt admin-icons'></i></a>
</td>
</tr>
- {{ endfor }}
+ {{/foreach}}
</tbody>
</table>
- <div class='selectall'><a href='#' onclick="return selectall('pending_ckbx');">$select_all</a></div>
- <div class="submit"><input type="submit" name="page_users_deny" value="$deny"/> <input type="submit" name="page_users_approve" value="$approve" /></div>
- {{ else }}
- <p>$no_pending</p>
- {{ endif }}
+ <div class='selectall'><a href='#' onclick="return selectall('pending_ckbx');">{{$select_all}}</a></div>
+ <div class="submit"><input type="submit" name="page_users_deny" value="{{$deny}}"/> <input type="submit" name="page_users_approve" value="{{$approve}}" /></div>
+ {{else}}
+ <p>{{$no_pending}}</p>
+ {{/if}}
- <h3>$h_users</h3>
- {{ if $users }}
+ <h3>{{$h_users}}</h3>
+ {{if $users}}
<table id='users'>
<thead>
<tr>
- <th></th>
- {{ for $th_users as $th }}<th>$th</th>{{ endfor }}
+ {{foreach $th_users as $th}}<th>{{$th}}</th>{{/foreach}}
<th></th>
<th></th>
</tr>
</thead>
<tbody>
- {{ for $users as $u }}
+ {{foreach $users as $u}}
<tr>
- <td><img src="$u.micro" alt="$u.nickname" title="$u.nickname"></td>
- <td class='name'><a href="$u.url" title="$u.nickname" >$u.name</a></td>
- <td class='email'>$u.email</td>
- <td class='register_date'>$u.register_date</td>
- <td class='login_date'>$u.login_date</td>
- <td class='lastitem_date'>$u.lastitem_date</td>
- <td class='login_date'>$u.page_flags</td>
- <td class="checkbox"><input type="checkbox" class="users_ckbx" id="id_user_$u.uid" name="user[]" value="$u.uid"/></td>
+ <td class='account_id'>{{$u.account_id}}</td>
+ <td class='email'>{{if $u.blocked}}
+ <i>{{$u.account_email}}</i>
+ {{else}}
+ <strong>{{$u.account_email}}</strong>
+ {{/if}}</td>
+ <td class='channels'>{{$u.channels}}</td>
+ <td class='register_date'>{{$u.account_created}}</td>
+ <td class='login_date'>{{$u.account_lastlog}}</td>
+ <td class='account_expires'>{{$u.account_expires}}</td>
+ <td class='service_class'>{{$u.account_service_class}}</td>
+ <td class="checkbox"><input type="checkbox" class="users_ckbx" id="id_user_{{$u.account_id}}" name="user[]" value="{{$u.account_id}}"/></td>
<td class="tools">
- <a href="$baseurl/admin/users/block/$u.uid?t=$form_security_token" title='{{ if $u.blocked }}$unblock{{ else }}$block{{ endif }}'><span class='icon block {{ if $u.blocked==0 }}dim{{ endif }}'></span></a>
- <a href="$baseurl/admin/users/delete/$u.uid?t=$form_security_token" title='$delete' onclick="return confirm_delete('$u.name')"><span class='icon drop'></span></a>
+ <a href="{{$baseurl}}/admin/users/block/{{$u.account_id}}?t={{$form_security_token}}" title='{{if ($u.blocked)}}{{$unblock}}{{else}}{{$block}}{{/if}}'><i class='icon-ban-circle admin-icons {{if ($u.blocked)}}dim{{/if}}'></i></a>
+ <a href="{{$baseurl}}/admin/users/delete/{{$u.account_id}}?t={{$form_security_token}}" title='{{$delete}}' onclick="return confirm_delete('{{$u.name}}')"><i class='icon-remove admin-icons'></i></a>
</td>
</tr>
- {{ endfor }}
+ {{/foreach}}
</tbody>
</table>
- <div class='selectall'><a href='#' onclick="return selectall('users_ckbx');">$select_all</a></div>
- <div class="submit"><input type="submit" name="page_users_block" value="$block/$unblock" /> <input type="submit" name="page_users_delete" value="$delete" onclick="return confirm_delete_multi()" /></div>
- {{ else }}
+ <div class='selectall'><a href='#' onclick="return selectall('users_ckbx');">{{$select_all}}</a></div>
+ <div class="submit"><input type="submit" name="page_users_block" value="{{$block}}/{{$unblock}}" /> <input type="submit" name="page_users_delete" value="{{$delete}}" onclick="return confirm_delete_multi()" /></div>
+ {{else}}
NO USERS?!?
- {{ endif }}
+ {{/if}}
</form>
</div>
diff --git a/view/tpl/album_edit.tpl b/view/tpl/album_edit.tpl
index 56a7b73fc..61653c47c 100644..100755
--- a/view/tpl/album_edit.tpl
+++ b/view/tpl/album_edit.tpl
@@ -1,14 +1,14 @@
<div id="photo-album-edit-wrapper">
-<form name="photo-album-edit-form" id="photo-album-edit-form" action="photos/$nickname/album/$hexalbum" method="post" >
+<form name="photo-album-edit-form" id="photo-album-edit-form" action="photos/{{$nickname}}/album/{{$hexalbum}}" method="post" >
-<label id="photo-album-edit-name-label" for="photo-album-edit-name" >$nametext</label>
-<input type="text" size="64" name="albumname" value="$album" >
+<label id="photo-album-edit-name-label" for="photo-album-edit-name" >{{$nametext}}</label>
+<input type="text" size="64" name="albumname" value="{{$album}}" >
<div id="photo-album-edit-name-end"></div>
-<input id="photo-album-edit-submit" type="submit" name="submit" value="$submit" />
-<input id="photo-album-edit-drop" type="submit" name="dropalbum" value="$dropsubmit" onclick="return confirmDelete();" />
+<input id="photo-album-edit-submit" type="submit" name="submit" value="{{$submit}}" />
+<input id="photo-album-edit-drop" type="submit" name="dropalbum" value="{{$dropsubmit}}" onclick="return confirmDelete();" />
</form>
</div>
diff --git a/view/tpl/alt_pager.tpl b/view/tpl/alt_pager.tpl
new file mode 100644
index 000000000..b46dc7662
--- /dev/null
+++ b/view/tpl/alt_pager.tpl
@@ -0,0 +1,4 @@
+<div class="pager">
+{{if $has_less}}<a href="{{$url}}&page={{$prevpage}}" class="pager-prev">{{$less}}</a>{{/if}}
+{{if $has_more}}{{if $has_less}}&nbsp;|&nbsp;{{/if}}<a href="{{$url}}&page={{$nextpage}}" class="pager-next">{{$more}}</a>{{/if}}
+</div>
diff --git a/view/tpl/api_config_xml.tpl b/view/tpl/api_config_xml.tpl
index 3281e59dd..8c0766c73 100644..100755
--- a/view/tpl/api_config_xml.tpl
+++ b/view/tpl/api_config_xml.tpl
@@ -1,24 +1,24 @@
<config>
<site>
- <name>$config.site.name</name>
- <server>$config.site.server</server>
+ <name>{{$config.site.name}}</name>
+ <server>{{$config.site.server}}</server>
<theme>default</theme>
<path></path>
- <logo>$config.site.logo</logo>
+ <logo>{{$config.site.logo}}</logo>
<fancy>true</fancy>
<language>en</language>
- <email>$config.site.email</email>
+ <email>{{$config.site.email}}</email>
<broughtby></broughtby>
<broughtbyurl></broughtbyurl>
<timezone>UTC</timezone>
- <closed>$config.site.closed</closed>
+ <closed>{{$config.site.closed}}</closed>
<inviteonly>false</inviteonly>
- <private>$config.site.private</private>
- <textlimit>$config.site.textlimit</textlimit>
- <ssl>$config.site.ssl</ssl>
- <sslserver>$config.site.sslserver</sslserver>
+ <private>{{$config.site.private}}</private>
+ <textlimit>{{$config.site.textlimit}}</textlimit>
+ <ssl>{{$config.site.ssl}}</ssl>
+ <sslserver>{{$config.site.sslserver}}</sslserver>
<shorturllength>30</shorturllength>
</site>
diff --git a/view/tpl/api_friends_xml.tpl b/view/tpl/api_friends_xml.tpl
index 0ea7eb13b..f2a7234d1 100644..100755
--- a/view/tpl/api_friends_xml.tpl
+++ b/view/tpl/api_friends_xml.tpl
@@ -1,5 +1,5 @@
<users type="array">
- {{for $users as $user }}
- {{inc api_user_xml.tpl }}{{endinc}}
- {{endfor}}
+ {{foreach $users as $user}}
+ {{include file="api_user_xml.tpl"}}
+ {{/foreach}}
</users>
diff --git a/view/tpl/api_ratelimit_xml.tpl b/view/tpl/api_ratelimit_xml.tpl
index 36ec1993d..e4b470a25 100644..100755
--- a/view/tpl/api_ratelimit_xml.tpl
+++ b/view/tpl/api_ratelimit_xml.tpl
@@ -1,6 +1,6 @@
<hash>
- <remaining-hits type="integer">$hash.remaining_hits</remaining-hits>
- <hourly-limit type="integer">$hash.hourly_limit</hourly-limit>
- <reset-time type="datetime">$hash.reset_time</reset-time>
- <reset_time_in_seconds type="integer">$hash.resettime_in_seconds</reset_time_in_seconds>
+ <remaining-hits type="integer">{{$hash.remaining_hits}}</remaining-hits>
+ <hourly-limit type="integer">{{$hash.hourly_limit}}</hourly-limit>
+ <reset-time type="datetime">{{$hash.reset_time}}</reset-time>
+ <reset_time_in_seconds type="integer">{{$hash.resettime_in_seconds}}</reset_time_in_seconds>
</hash>
diff --git a/view/tpl/api_status_xml.tpl b/view/tpl/api_status_xml.tpl
index f6cd9c2c0..cbb736e22 100644..100755
--- a/view/tpl/api_status_xml.tpl
+++ b/view/tpl/api_status_xml.tpl
@@ -1,46 +1,46 @@
-<status>{{ if $status }}
- <created_at>$status.created_at</created_at>
- <id>$status.id</id>
- <text>$status.text</text>
- <source>$status.source</source>
- <truncated>$status.truncated</truncated>
- <in_reply_to_status_id>$status.in_reply_to_status_id</in_reply_to_status_id>
- <in_reply_to_user_id>$status.in_reply_to_user_id</in_reply_to_user_id>
- <favorited>$status.favorited</favorited>
- <in_reply_to_screen_name>$status.in_reply_to_screen_name</in_reply_to_screen_name>
- <geo>$status.geo</geo>
- <coordinates>$status.coordinates</coordinates>
- <place>$status.place</place>
- <contributors>$status.contributors</contributors>
+<status>{{if $status}}
+ <created_at>{{$status.created_at}}</created_at>
+ <id>{{$status.id}}</id>
+ <text>{{$status.text}}</text>
+ <source>{{$status.source}}</source>
+ <truncated>{{$status.truncated}}</truncated>
+ <in_reply_to_status_id>{{$status.in_reply_to_status_id}}</in_reply_to_status_id>
+ <in_reply_to_user_id>{{$status.in_reply_to_user_id}}</in_reply_to_user_id>
+ <favorited>{{$status.favorited}}</favorited>
+ <in_reply_to_screen_name>{{$status.in_reply_to_screen_name}}</in_reply_to_screen_name>
+ <geo>{{$status.geo}}</geo>
+ <coordinates>{{$status.coordinates}}</coordinates>
+ <place>{{$status.place}}</place>
+ <contributors>{{$status.contributors}}</contributors>
<user>
- <id>$status.user.id</id>
- <name>$status.user.name</name>
- <screen_name>$status.user.screen_name</screen_name>
- <location>$status.user.location</location>
- <description>$status.user.description</description>
- <profile_image_url>$status.user.profile_image_url</profile_image_url>
- <url>$status.user.url</url>
- <protected>$status.user.protected</protected>
- <followers_count>$status.user.followers</followers_count>
- <profile_background_color>$status.user.profile_background_color</profile_background_color>
- <profile_text_color>$status.user.profile_text_color</profile_text_color>
- <profile_link_color>$status.user.profile_link_color</profile_link_color>
- <profile_sidebar_fill_color>$status.user.profile_sidebar_fill_color</profile_sidebar_fill_color>
- <profile_sidebar_border_color>$status.user.profile_sidebar_border_color</profile_sidebar_border_color>
- <friends_count>$status.user.friends_count</friends_count>
- <created_at>$status.user.created_at</created_at>
- <favourites_count>$status.user.favourites_count</favourites_count>
- <utc_offset>$status.user.utc_offset</utc_offset>
- <time_zone>$status.user.time_zone</time_zone>
- <profile_background_image_url>$status.user.profile_background_image_url</profile_background_image_url>
- <profile_background_tile>$status.user.profile_background_tile</profile_background_tile>
- <profile_use_background_image>$status.user.profile_use_background_image</profile_use_background_image>
+ <id>{{$status.user.id}}</id>
+ <name>{{$status.user.name}}</name>
+ <screen_name>{{$status.user.screen_name}}</screen_name>
+ <location>{{$status.user.location}}</location>
+ <description>{{$status.user.description}}</description>
+ <profile_image_url>{{$status.user.profile_image_url}}</profile_image_url>
+ <url>{{$status.user.url}}</url>
+ <protected>{{$status.user.protected}}</protected>
+ <followers_count>{{$status.user.followers}}</followers_count>
+ <profile_background_color>{{$status.user.profile_background_color}}</profile_background_color>
+ <profile_text_color>{{$status.user.profile_text_color}}</profile_text_color>
+ <profile_link_color>{{$status.user.profile_link_color}}</profile_link_color>
+ <profile_sidebar_fill_color>{{$status.user.profile_sidebar_fill_color}}</profile_sidebar_fill_color>
+ <profile_sidebar_border_color>{{$status.user.profile_sidebar_border_color}}</profile_sidebar_border_color>
+ <friends_count>{{$status.user.friends_count}}</friends_count>
+ <created_at>{{$status.user.created_at}}</created_at>
+ <favourites_count>{{$status.user.favourites_count}}</favourites_count>
+ <utc_offset>{{$status.user.utc_offset}}</utc_offset>
+ <time_zone>{{$status.user.time_zone}}</time_zone>
+ <profile_background_image_url>{{$status.user.profile_background_image_url}}</profile_background_image_url>
+ <profile_background_tile>{{$status.user.profile_background_tile}}</profile_background_tile>
+ <profile_use_background_image>{{$status.user.profile_use_background_image}}</profile_use_background_image>
<notifications></notifications>
- <geo_enabled>$status.user.geo_enabled</geo_enabled>
- <verified>$status.user.verified</verified>
+ <geo_enabled>{{$status.user.geo_enabled}}</geo_enabled>
+ <verified>{{$status.user.verified}}</verified>
<following></following>
- <statuses_count>$status.user.statuses_count</statuses_count>
- <lang>$status.user.lang</lang>
- <contributors_enabled>$status.user.contributors_enabled</contributors_enabled>
+ <statuses_count>{{$status.user.statuses_count}}</statuses_count>
+ <lang>{{$status.user.lang}}</lang>
+ <contributors_enabled>{{$status.user.contributors_enabled}}</contributors_enabled>
</user>
-{{ endif }}</status>
+{{/if}}</status>
diff --git a/view/tpl/api_test_xml.tpl b/view/tpl/api_test_xml.tpl
index 7509a2dc1..80a541c39 100644..100755
--- a/view/tpl/api_test_xml.tpl
+++ b/view/tpl/api_test_xml.tpl
@@ -1 +1 @@
-<ok>$ok</ok>
+<ok>{{$ok}}</ok>
diff --git a/view/tpl/api_timeline_atom.tpl b/view/tpl/api_timeline_atom.tpl
index 9039220e7..e8bfb689e 100644..100755
--- a/view/tpl/api_timeline_atom.tpl
+++ b/view/tpl/api_timeline_atom.tpl
@@ -1,90 +1,90 @@
<feed xml:lang="en-US" xmlns="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:georss="http://www.georss.org/georss" xmlns:activity="http://activitystrea.ms/spec/1.0/" xmlns:media="http://purl.org/syndication/atommedia" xmlns:poco="http://portablecontacts.net/spec/1.0" xmlns:ostatus="http://ostatus.org/schema/1.0" xmlns:statusnet="http://status.net/schema/api/1/">
<generator uri="http://status.net" version="0.9.7">StatusNet</generator>
- <id>$rss.self</id>
+ <id>{{$rss.self}}</id>
<title>Friendika</title>
<subtitle>Friendika API feed</subtitle>
- <logo>$rss.logo</logo>
- <updated>$rss.atom_updated</updated>
- <link type="text/html" rel="alternate" href="$rss.alternate"/>
- <link type="application/atom+xml" rel="self" href="$rss.self"/>
+ <logo>{{$rss.logo}}</logo>
+ <updated>{{$rss.atom_updated}}</updated>
+ <link type="text/html" rel="alternate" href="{{$rss.alternate}}"/>
+ <link type="application/atom+xml" rel="self" href="{{$rss.self}}"/>
<author>
<activity:obj_type>http://activitystrea.ms/schema/1.0/person</activity:obj_type>
- <uri>$user.url</uri>
- <name>$user.name</name>
- <link rel="alternate" type="text/html" href="$user.url"/>
- <link rel="avatar" type="image/jpeg" media:width="106" media:height="106" href="$user.profile_image_url"/>
- <link rel="avatar" type="image/jpeg" media:width="96" media:height="96" href="$user.profile_image_url"/>
- <link rel="avatar" type="image/jpeg" media:width="48" media:height="48" href="$user.profile_image_url"/>
- <link rel="avatar" type="image/jpeg" media:width="24" media:height="24" href="$user.profile_image_url"/>
+ <uri>{{$user.url}}</uri>
+ <name>{{$user.name}}</name>
+ <link rel="alternate" type="text/html" href="{{$user.url}}"/>
+ <link rel="avatar" type="image/jpeg" media:width="106" media:height="106" href="{{$user.profile_image_url}}"/>
+ <link rel="avatar" type="image/jpeg" media:width="96" media:height="96" href="{{$user.profile_image_url}}"/>
+ <link rel="avatar" type="image/jpeg" media:width="48" media:height="48" href="{{$user.profile_image_url}}"/>
+ <link rel="avatar" type="image/jpeg" media:width="24" media:height="24" href="{{$user.profile_image_url}}"/>
<georss:point></georss:point>
- <poco:preferredUsername>$user.screen_name</poco:preferredUsername>
- <poco:displayName>$user.name</poco:displayName>
+ <poco:preferredUsername>{{$user.screen_name}}</poco:preferredUsername>
+ <poco:displayName>{{$user.name}}</poco:displayName>
<poco:urls>
<poco:type>homepage</poco:type>
- <poco:value>$user.url</poco:value>
+ <poco:value>{{$user.url}}</poco:value>
<poco:primary>true</poco:primary>
</poco:urls>
- <statusnet:profile_info local_id="$user.id"></statusnet:profile_info>
+ <statusnet:profile_info local_id="{{$user.id}}"></statusnet:profile_info>
</author>
<!--Deprecation warning: activity:subject is present only for backward compatibility. It will be removed in the next version of StatusNet.-->
<activity:subject>
<activity:obj_type>http://activitystrea.ms/schema/1.0/person</activity:obj_type>
- <id>$user.contact_url</id>
- <title>$user.name</title>
- <link rel="alternate" type="text/html" href="$user.url"/>
- <link rel="avatar" type="image/jpeg" media:width="106" media:height="106" href="$user.profile_image_url"/>
- <link rel="avatar" type="image/jpeg" media:width="96" media:height="96" href="$user.profile_image_url"/>
- <link rel="avatar" type="image/jpeg" media:width="48" media:height="48" href="$user.profile_image_url"/>
- <link rel="avatar" type="image/jpeg" media:width="24" media:height="24" href="$user.profile_image_url"/>
- <poco:preferredUsername>$user.screen_name</poco:preferredUsername>
- <poco:displayName>$user.name</poco:displayName>
+ <id>{{$user.contact_url}}</id>
+ <title>{{$user.name}}</title>
+ <link rel="alternate" type="text/html" href="{{$user.url}}"/>
+ <link rel="avatar" type="image/jpeg" media:width="106" media:height="106" href="{{$user.profile_image_url}}"/>
+ <link rel="avatar" type="image/jpeg" media:width="96" media:height="96" href="{{$user.profile_image_url}}"/>
+ <link rel="avatar" type="image/jpeg" media:width="48" media:height="48" href="{{$user.profile_image_url}}"/>
+ <link rel="avatar" type="image/jpeg" media:width="24" media:height="24" href="{{$user.profile_image_url}}"/>
+ <poco:preferredUsername>{{$user.screen_name}}</poco:preferredUsername>
+ <poco:displayName>{{$user.name}}</poco:displayName>
<poco:urls>
<poco:type>homepage</poco:type>
- <poco:value>$user.url</poco:value>
+ <poco:value>{{$user.url}}</poco:value>
<poco:primary>true</poco:primary>
</poco:urls>
- <statusnet:profile_info local_id="$user.id"></statusnet:profile_info>
+ <statusnet:profile_info local_id="{{$user.id}}"></statusnet:profile_info>
</activity:subject>
- {{ for $statuses as $status }}
+ {{foreach $statuses as $status}}
<entry>
- <activity:obj_type>$status.objecttype</activity:obj_type>
- <id>$status.message_id</id>
- <title>$status.text</title>
- <content type="html">$status.statusnet_html</content>
- <link rel="alternate" type="text/html" href="$status.url"/>
- <activity:verb>$status.verb</activity:verb>
- <published>$status.published</published>
- <updated>$status.updated</updated>
+ <activity:obj_type>{{$status.objecttype}}</activity:obj_type>
+ <id>{{$status.message_id}}</id>
+ <title>{{$status.text}}</title>
+ <content type="html">{{$status.statusnet_html}}</content>
+ <link rel="alternate" type="text/html" href="{{$status.url}}"/>
+ <activity:verb>{{$status.verb}}</activity:verb>
+ <published>{{$status.published}}</published>
+ <updated>{{$status.updated}}</updated>
- <link rel="self" type="application/atom+xml" href="$status.self"/>
- <link rel="edit" type="application/atom+xml" href="$status.edit"/>
- <statusnet:notice_info local_id="$status.id" source="$status.source" >
+ <link rel="self" type="application/atom+xml" href="{{$status.self}}"/>
+ <link rel="edit" type="application/atom+xml" href="{{$status.edit}}"/>
+ <statusnet:notice_info local_id="{{$status.id}}" source="{{$status.source}}" >
</statusnet:notice_info>
<author>
<activity:obj_type>http://activitystrea.ms/schema/1.0/person</activity:obj_type>
- <uri>$status.user.url</uri>
- <name>$status.user.name</name>
- <link rel="alternate" type="text/html" href="$status.user.url"/>
- <link rel="avatar" type="image/jpeg" media:width="48" media:height="48" href="$status.user.profile_image_url"/>
+ <uri>{{$status.user.url}}</uri>
+ <name>{{$status.user.name}}</name>
+ <link rel="alternate" type="text/html" href="{{$status.user.url}}"/>
+ <link rel="avatar" type="image/jpeg" media:width="48" media:height="48" href="{{$status.user.profile_image_url}}"/>
<georss:point/>
- <poco:preferredUsername>$status.user.screen_name</poco:preferredUsername>
- <poco:displayName>$status.user.name</poco:displayName>
+ <poco:preferredUsername>{{$status.user.screen_name}}</poco:preferredUsername>
+ <poco:displayName>{{$status.user.name}}</poco:displayName>
<poco:address/>
<poco:urls>
<poco:type>homepage</poco:type>
- <poco:value>$status.user.url</poco:value>
+ <poco:value>{{$status.user.url}}</poco:value>
<poco:primary>true</poco:primary>
</poco:urls>
</author>
- <link rel="ostatus:conversation" type="text/html" href="$status.url"/>
+ <link rel="ostatus:conversation" type="text/html" href="{{$status.url}}"/>
</entry>
- {{ endfor }}
+ {{/foreach}}
</feed>
diff --git a/view/tpl/api_timeline_rss.tpl b/view/tpl/api_timeline_rss.tpl
index 40239273c..86c645e99 100644..100755
--- a/view/tpl/api_timeline_rss.tpl
+++ b/view/tpl/api_timeline_rss.tpl
@@ -1,26 +1,26 @@
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:georss="http://www.georss.org/georss" xmlns:twitter="http://api.twitter.com">
<channel>
<title>Friendika</title>
- <link>$rss.alternate</link>
- <atom:link type="application/rss+xml" rel="self" href="$rss.self"/>
+ <link>{{$rss.alternate}}</link>
+ <atom:link type="application/rss+xml" rel="self" href="{{$rss.self}}"/>
<description>Friendika timeline</description>
- <language>$rss.language</language>
+ <language>{{$rss.language}}</language>
<ttl>40</ttl>
<image>
- <link>$user.link</link>
- <title>$user.name's items</title>
- <url>$user.profile_image_url</url>
+ <link>{{$user.link}}</link>
+ <title>{{$user.name}}'s items</title>
+ <url>{{$user.profile_image_url}}</url>
</image>
-{{ for $statuses as $status }}
+{{foreach $statuses as $status}}
<item>
- <title>$status.user.name: $status.text</title>
- <description>$status.text</description>
- <pubDate>$status.created_at</pubDate>
- <guid>$status.url</guid>
- <link>$status.url</link>
- <twitter:source>$status.source</twitter:source>
+ <title>{{$status.user.name}}: {{$status.text}}</title>
+ <description>{{$status.text}}</description>
+ <pubDate>{{$status.created_at}}</pubDate>
+ <guid>{{$status.url}}</guid>
+ <link>{{$status.url}}</link>
+ <twitter:source>{{$status.source}}</twitter:source>
</item>
-{{ endfor }}
+{{/foreach}}
</channel>
</rss>
diff --git a/view/tpl/api_timeline_xml.tpl b/view/tpl/api_timeline_xml.tpl
index 4a32b411b..f14d73e9c 100644..100755
--- a/view/tpl/api_timeline_xml.tpl
+++ b/view/tpl/api_timeline_xml.tpl
@@ -1,20 +1,20 @@
<statuses type="array" xmlns:statusnet="http://status.net/schema/api/1/">
-{{ for $statuses as $status }} <status>
- <text>$status.text</text>
- <truncated>$status.truncated</truncated>
- <created_at>$status.created_at</created_at>
- <in_reply_to_status_id>$status.in_reply_to_status_id</in_reply_to_status_id>
- <source>$status.source</source>
- <id>$status.id</id>
- <in_reply_to_user_id>$status.in_reply_to_user_id</in_reply_to_user_id>
- <in_reply_to_screen_name>$status.in_reply_to_screen_name</in_reply_to_screen_name>
- <geo>$status.geo</geo>
- <favorited>$status.favorited</favorited>
-{{ inc api_user_xml.tpl with $user=$status.user }}{{ endinc }} <statusnet:html>$status.statusnet_html</statusnet:html>
- <statusnet:conversation_id>$status.statusnet_conversation_id</statusnet:conversation_id>
- <url>$status.url</url>
- <coordinates>$status.coordinates</coordinates>
- <place>$status.place</place>
- <contributors>$status.contributors</contributors>
+{{foreach $statuses as $status}} <status>
+ <text>{{$status.text}}</text>
+ <truncated>{{$status.truncated}}</truncated>
+ <created_at>{{$status.created_at}}</created_at>
+ <in_reply_to_status_id>{{$status.in_reply_to_status_id}}</in_reply_to_status_id>
+ <source>{{$status.source}}</source>
+ <id>{{$status.id}}</id>
+ <in_reply_to_user_id>{{$status.in_reply_to_user_id}}</in_reply_to_user_id>
+ <in_reply_to_screen_name>{{$status.in_reply_to_screen_name}}</in_reply_to_screen_name>
+ <geo>{{$status.geo}}</geo>
+ <favorited>{{$status.favorited}}</favorited>
+{{include file="api_user_xml.tpl" user=$status.user}} <statusnet:html>{{$status.statusnet_html}}</statusnet:html>
+ <statusnet:conversation_id>{{$status.statusnet_conversation_id}}</statusnet:conversation_id>
+ <url>{{$status.url}}</url>
+ <coordinates>{{$status.coordinates}}</coordinates>
+ <place>{{$status.place}}</place>
+ <contributors>{{$status.contributors}}</contributors>
</status>
-{{ endfor }}</statuses>
+{{/foreach}}</statuses>
diff --git a/view/tpl/api_user_xml.tpl b/view/tpl/api_user_xml.tpl
index d286652c0..3b51992f6 100644..100755
--- a/view/tpl/api_user_xml.tpl
+++ b/view/tpl/api_user_xml.tpl
@@ -1,46 +1,46 @@
<user>
- <id>$user.id</id>
- <name>$user.name</name>
- <screen_name>$user.screen_name</screen_name>
- <location>$user.location</location>
- <description>$user.description</description>
- <profile_image_url>$user.profile_image_url</profile_image_url>
- <url>$user.url</url>
- <protected>$user.protected</protected>
- <followers_count>$user.followers_count</followers_count>
- <friends_count>$user.friends_count</friends_count>
- <created_at>$user.created_at</created_at>
- <favourites_count>$user.favourites_count</favourites_count>
- <utc_offset>$user.utc_offset</utc_offset>
- <time_zone>$user.time_zone</time_zone>
- <statuses_count>$user.statuses_count</statuses_count>
- <following>$user.following</following>
- <profile_background_color>$user.profile_background_color</profile_background_color>
- <profile_text_color>$user.profile_text_color</profile_text_color>
- <profile_link_color>$user.profile_link_color</profile_link_color>
- <profile_sidebar_fill_color>$user.profile_sidebar_fill_color</profile_sidebar_fill_color>
- <profile_sidebar_border_color>$user.profile_sidebar_border_color</profile_sidebar_border_color>
- <profile_background_image_url>$user.profile_background_image_url</profile_background_image_url>
- <profile_background_tile>$user.profile_background_tile</profile_background_tile>
- <profile_use_background_image>$user.profile_use_background_image</profile_use_background_image>
- <notifications>$user.notifications</notifications>
- <geo_enabled>$user.geo_enabled</geo_enabled>
- <verified>$user.verified</verified>
- <lang>$user.lang</lang>
- <contributors_enabled>$user.contributors_enabled</contributors_enabled>
- <status>{{ if $user.status }}
- <created_at>$user.status.created_at</created_at>
- <id>$user.status.id</id>
- <text>$user.status.text</text>
- <source>$user.status.source</source>
- <truncated>$user.status.truncated</truncated>
- <in_reply_to_status_id>$user.status.in_reply_to_status_id</in_reply_to_status_id>
- <in_reply_to_user_id>$user.status.in_reply_to_user_id</in_reply_to_user_id>
- <favorited>$user.status.favorited</favorited>
- <in_reply_to_screen_name>$user.status.in_reply_to_screen_name</in_reply_to_screen_name>
- <geo>$user.status.geo</geo>
- <coordinates>$user.status.coordinates</coordinates>
- <place>$user.status.place</place>
- <contributors>$user.status.contributors</contributors>
- {{ endif }}</status>
+ <id>{{$user.id}}</id>
+ <name>{{$user.name}}</name>
+ <screen_name>{{$user.screen_name}}</screen_name>
+ <location>{{$user.location}}</location>
+ <description>{{$user.description}}</description>
+ <profile_image_url>{{$user.profile_image_url}}</profile_image_url>
+ <url>{{$user.url}}</url>
+ <protected>{{$user.protected}}</protected>
+ <followers_count>{{$user.followers_count}}</followers_count>
+ <friends_count>{{$user.friends_count}}</friends_count>
+ <created_at>{{$user.created_at}}</created_at>
+ <favourites_count>{{$user.favourites_count}}</favourites_count>
+ <utc_offset>{{$user.utc_offset}}</utc_offset>
+ <time_zone>{{$user.time_zone}}</time_zone>
+ <statuses_count>{{$user.statuses_count}}</statuses_count>
+ <following>{{$user.following}}</following>
+ <profile_background_color>{{$user.profile_background_color}}</profile_background_color>
+ <profile_text_color>{{$user.profile_text_color}}</profile_text_color>
+ <profile_link_color>{{$user.profile_link_color}}</profile_link_color>
+ <profile_sidebar_fill_color>{{$user.profile_sidebar_fill_color}}</profile_sidebar_fill_color>
+ <profile_sidebar_border_color>{{$user.profile_sidebar_border_color}}</profile_sidebar_border_color>
+ <profile_background_image_url>{{$user.profile_background_image_url}}</profile_background_image_url>
+ <profile_background_tile>{{$user.profile_background_tile}}</profile_background_tile>
+ <profile_use_background_image>{{$user.profile_use_background_image}}</profile_use_background_image>
+ <notifications>{{$user.notifications}}</notifications>
+ <geo_enabled>{{$user.geo_enabled}}</geo_enabled>
+ <verified>{{$user.verified}}</verified>
+ <lang>{{$user.lang}}</lang>
+ <contributors_enabled>{{$user.contributors_enabled}}</contributors_enabled>
+ <status>{{if $user.status}}
+ <created_at>{{$user.status.created_at}}</created_at>
+ <id>{{$user.status.id}}</id>
+ <text>{{$user.status.text}}</text>
+ <source>{{$user.status.source}}</source>
+ <truncated>{{$user.status.truncated}}</truncated>
+ <in_reply_to_status_id>{{$user.status.in_reply_to_status_id}}</in_reply_to_status_id>
+ <in_reply_to_user_id>{{$user.status.in_reply_to_user_id}}</in_reply_to_user_id>
+ <favorited>{{$user.status.favorited}}</favorited>
+ <in_reply_to_screen_name>{{$user.status.in_reply_to_screen_name}}</in_reply_to_screen_name>
+ <geo>{{$user.status.geo}}</geo>
+ <coordinates>{{$user.status.coordinates}}</coordinates>
+ <place>{{$user.status.place}}</place>
+ <contributors>{{$user.status.contributors}}</contributors>
+ {{/if}}</status>
</user>
diff --git a/view/tpl/apps.tpl b/view/tpl/apps.tpl
index 4c7f8c94c..335e0ca97 100644..100755
--- a/view/tpl/apps.tpl
+++ b/view/tpl/apps.tpl
@@ -1,7 +1,7 @@
-<h3>$title</h3>
+<h3>{{$title}}</h3>
<ul>
- {{ for $apps as $ap }}
- <li>$ap</li>
- {{ endfor }}
+ {{foreach $apps as $ap}}
+ <li>{{$ap}}</li>
+ {{/foreach}}
</ul>
diff --git a/view/tpl/atom_feed.tpl b/view/tpl/atom_feed.tpl
index 2feb547ee..2c8024d47 100644..100755
--- a/view/tpl/atom_feed.tpl
+++ b/view/tpl/atom_feed.tpl
@@ -4,26 +4,29 @@
xmlns:at="http://purl.org/atompub/tombstones/1.0"
xmlns:media="http://purl.org/syndication/atommedia"
xmlns:dfrn="http://purl.org/macgirvin/dfrn/1.0"
+ xmlns:zot="http://purl.org/zot"
xmlns:as="http://activitystrea.ms/spec/1.0/"
xmlns:georss="http://www.georss.org/georss"
xmlns:poco="http://portablecontacts.net/spec/1.0"
xmlns:ostatus="http://ostatus.org/schema/1.0"
xmlns:statusnet="http://status.net/schema/api/1/" >
- <id>$feed_id</id>
- <title>$feed_title</title>
- <generator uri="http://friendica.com" version="$version">Friendica</generator>
+ <id>{{$feed_id}}</id>
+ <title>{{$feed_title}}</title>
+ <generator uri="http://getzot.com" version="{{$version}}">{{$red}}</generator>
<link rel="license" href="http://creativecommons.org/licenses/by/3.0/" />
- $hub
- $salmon
- $community
+{{if $hub}}
+ {{$hub}}
+{{/if}}
+{{if $salmon}}
+ {{$salmon}}
+{{/if}}
- <updated>$feed_updated</updated>
+ <updated>{{$feed_updated}}</updated>
- <dfrn:owner>
- <name dfrn:updated="$namdate" >$name</name>
- <uri dfrn:updated="$uridate" >$profile_page</uri>
- <link rel="photo" type="image/jpeg" dfrn:updated="$picdate" media:width="175" media:height="175" href="$photo" />
- <link rel="avatar" type="image/jpeg" dfrn:updated="$picdate" media:width="175" media:height="175" href="$photo" />
- $birthday
- </dfrn:owner>
+ <zot:owner>
+ <name>{{$name}}</name>
+ <uri>{{$profile_page}}</uri>
+ <link rel="photo" type="{{$mimephoto}}" media:width="175" media:height="175" href="{{$photo}}" />
+ <link rel="avatar" type="{{$mimephoto}}" media:width="175" media:height="175" href="{{$photo}}" />
+ </zot:owner>
diff --git a/view/tpl/atom_feed_dfrn.tpl b/view/tpl/atom_feed_dfrn.tpl
index 0bae62b52..307001fbe 100644..100755
--- a/view/tpl/atom_feed_dfrn.tpl
+++ b/view/tpl/atom_feed_dfrn.tpl
@@ -10,20 +10,20 @@
xmlns:ostatus="http://ostatus.org/schema/1.0"
xmlns:statusnet="http://status.net/schema/api/1/" >
- <id>$feed_id</id>
- <title>$feed_title</title>
- <generator uri="http://friendica.com" version="$version">Friendica</generator>
+ <id>{{$feed_id}}</id>
+ <title>{{$feed_title}}</title>
+ <generator uri="http://friendica.com" version="{{$version}}">Friendica</generator>
<link rel="license" href="http://creativecommons.org/licenses/by/3.0/" />
- $hub
- $salmon
- $community
+ {{$hub}}
+ {{$salmon}}
+ {{$community}}
- <updated>$feed_updated</updated>
+ <updated>{{$feed_updated}}</updated>
<author>
- <name dfrn:updated="$namdate" >$name</name>
- <uri dfrn:updated="$uridate" >$profile_page</uri>
- <link rel="photo" type="image/jpeg" dfrn:updated="$picdate" media:width="175" media:height="175" href="$photo" />
- <link rel="avatar" type="image/jpeg" dfrn:updated="$picdate" media:width="175" media:height="175" href="$photo" />
- $birthday
+ <name dfrn:updated="{{$namdate}}" >{{$name}}</name>
+ <uri dfrn:updated="{{$uridate}}" >{{$profile_page}}</uri>
+ <link rel="photo" type="image/jpeg" dfrn:updated="{{$picdate}}" media:width="175" media:height="175" href="{{$photo}}" />
+ <link rel="avatar" type="image/jpeg" dfrn:updated="{{$picdate}}" media:width="175" media:height="175" href="{{$photo}}" />
+ {{$birthday}}
</author>
diff --git a/view/tpl/atom_mail.tpl b/view/tpl/atom_mail.tpl
deleted file mode 100644
index bf7c3efc8..000000000
--- a/view/tpl/atom_mail.tpl
+++ /dev/null
@@ -1,17 +0,0 @@
-
-<dfrn:mail>
-
- <dfrn:sender>
- <dfrn:name>$name</dfrn:name>
- <dfrn:uri>$profile_page</dfrn:uri>
- <dfrn:avatar>$thumb</dfrn:avatar>
- </dfrn:sender>
-
- <dfrn:id>$item_id</dfrn:id>
- <dfrn:in-reply-to>$parent_id</dfrn:in-reply-to>
- <dfrn:sentdate>$created</dfrn:sentdate>
- <dfrn:subject>$subject</dfrn:subject>
- <dfrn:content>$content</dfrn:content>
-
-</dfrn:mail>
-
diff --git a/view/tpl/atom_suggest.tpl b/view/tpl/atom_suggest.tpl
deleted file mode 100644
index 66c61f9b6..000000000
--- a/view/tpl/atom_suggest.tpl
+++ /dev/null
@@ -1,11 +0,0 @@
-
-<dfrn:suggest>
-
- <dfrn:url>$url</dfrn:url>
- <dfrn:name>$name</dfrn:name>
- <dfrn:photo>$photo</dfrn:photo>
- <dfrn:request>$request</dfrn:request>
- <dfrn:note>$note</dfrn:note>
-
-</dfrn:suggest>
-
diff --git a/view/tpl/attach_edit.tpl b/view/tpl/attach_edit.tpl
new file mode 100644
index 000000000..f9c6e96ce
--- /dev/null
+++ b/view/tpl/attach_edit.tpl
@@ -0,0 +1,40 @@
+
+<h1>{{$header}}</h1>
+
+<h2>{{$file.filename}}</h2>
+
+
+<div id="attach-edit-backlink"><a href="filestorage/{{$channelnick}}">{{$backlink}}</a></div>
+
+
+<form action="filestorage/{{$channelnick}}/{{$file.id}}/edit" method="post" >
+
+<input type="hidden" name="channelnick" value="{{$channelnick}}" />
+<input type="hidden" name="filehash" value="{{$file.hash}}" />
+<input type="hidden" name="uid" value="{{$uid}}" />
+<input type="hidden" name="fileid" value="{{$file.id}}" />
+
+
+{{if $isadir}}
+<div id="attach-edit-recurse" >
+ <label id="attach-edit-recurse-text" for="attach-recurse-input" >{{$recurse}}</label>
+ <input id="attach-recurse-input" type="checkbox" name="recurse" value="1" />
+</div>
+{{else}}
+<div class="cut-paste-desc">{{$cpdesc}}</div>
+<input type="text" id="cutpasteinput" name="cutpastelink" value="[attachment]{{$file.hash}},{{$file.revision}}[/attachment]" onclick="this.select();" /><br />
+
+<div class="cut-paste-desc">{{$cpldesc}}</div>
+<input type="text" id="linkpasteinput" name="cutpasteextlink" value="{{$cloudpath}}" onclick="this.select();"/><br />
+
+{{/if}}
+
+<div id="attach-edit-perms" >
+{{$aclselect}}
+</div>
+
+<div class="clear"></div>
+<input id="attach-edit-submit" type="submit" name="submit" value="{{$submit}}" />
+</form>
+
+
diff --git a/view/tpl/auto_request.tpl b/view/tpl/auto_request.tpl
deleted file mode 100644
index 961de9bb3..000000000
--- a/view/tpl/auto_request.tpl
+++ /dev/null
@@ -1,37 +0,0 @@
-
-<h1>$header</h1>
-
-<p id="dfrn-request-intro">
-$page_desc<br />
-<ul id="dfrn-request-networks">
-<li><a href="http://friendica.com" title="$friendica">$friendica</a></li>
-<li><a href="http://joindiaspora.com" title="$diaspora">$diaspora</a> $diasnote</li>
-<li><a href="http://ostatus.org" title="$public_net" >$statusnet</a></li>
-{{ if $emailnet }}<li>$emailnet</li>{{ endif }}
-</ul>
-</p>
-<p>
-$invite_desc
-</p>
-<p>
-$desc
-</p>
-
-<form action="dfrn_request/$nickname" method="post" />
-
-<div id="dfrn-request-url-wrapper" >
- <label id="dfrn-url-label" for="dfrn-url" >$your_address</label>
- <input type="text" name="dfrn_url" id="dfrn-url" size="32" value="$myaddr" />
- <div id="dfrn-request-url-end"></div>
-</div>
-
-
-<div id="dfrn-request-info-wrapper" >
-
-</div>
-
- <div id="dfrn-request-submit-wrapper">
- <input type="submit" name="submit" id="dfrn-request-submit-button" value="$submit" />
- <input type="submit" name="cancel" id="dfrn-request-cancel-button" value="$cancel" />
- </div>
-</form>
diff --git a/view/tpl/birthdays_reminder.tpl b/view/tpl/birthdays_reminder.tpl
index 8db7d22f4..d0500364a 100644..100755
--- a/view/tpl/birthdays_reminder.tpl
+++ b/view/tpl/birthdays_reminder.tpl
@@ -1,10 +1,10 @@
-{{ if $count }}
-<div id="birthday-notice" class="birthday-notice fakelink $classtoday" onclick="openClose('birthday-wrapper');">$event_reminders ($count)</div>
-<div id="birthday-wrapper" style="display: none;" ><div id="birthday-title">$event_title</div>
+{{if $count}}
+<div id="birthday-notice" class="birthday-notice fakelink {{$classtoday}}" onclick="openClose('birthday-wrapper');">{{$event_reminders}} ({{$count}})</div>
+<div id="birthday-wrapper" style="display: none;" ><div id="birthday-title">{{$event_title}}</div>
<div id="birthday-title-end"></div>
-{{ for $events as $event }}
-<div class="birthday-list" id="birthday-$event.id"></a> <a href="$event.link">$event.title</a> $event.date </div>
-{{ endfor }}
+{{foreach $events as $event}}
+<div class="birthday-list" id="birthday-{{$event.id}}"></a> <a href="{{$event.link}}">{{$event.title}}</a> {{$event.date}} </div>
+{{/foreach}}
</div>
-{{ endif }}
+{{/if}}
diff --git a/view/tpl/build_query.tpl b/view/tpl/build_query.tpl
index f4795acb2..98a1c7846 100644..100755
--- a/view/tpl/build_query.tpl
+++ b/view/tpl/build_query.tpl
@@ -1,28 +1,29 @@
<script>
- var bParam_cmd = "$baseurl/update_$pgtype";
+ var bParam_cmd = "{{$baseurl}}/update_{{$pgtype}}";
- var bParam_uid = $uid;
- var bParam_gid = $gid;
- var bParam_cid = $cid;
- var bParam_cmin = $cmin;
- var bParam_cmax = $cmax;
- var bParam_star = $star;
- var bParam_liked = $liked;
- var bParam_conv = $conv;
- var bParam_spam = $spam;
- var bParam_new = $nouveau;
- var bParam_page = $page;
- var bParam_wall = $wall;
+ var bParam_uid = {{$uid}};
+ var bParam_gid = {{$gid}};
+ var bParam_cid = {{$cid}};
+ var bParam_cmin = {{$cmin}};
+ var bParam_cmax = {{$cmax}};
+ var bParam_star = {{$star}};
+ var bParam_liked = {{$liked}};
+ var bParam_conv = {{$conv}};
+ var bParam_spam = {{$spam}};
+ var bParam_new = {{$nouveau}};
+ var bParam_page = {{$page}};
+ var bParam_wall = {{$wall}};
+ var bParam_list = {{$list}};
- var bParam_search = "$search";
- var bParam_order = "$order";
- var bParam_file = "$file";
- var bParam_cats = "$cats";
- var bParam_dend = "$dend";
- var bParam_dbegin = "$dbegin";
- var bParam_uri = "$uri";
+ var bParam_search = "{{$search}}";
+ var bParam_order = "{{$order}}";
+ var bParam_file = "{{$file}}";
+ var bParam_cats = "{{$cats}}";
+ var bParam_dend = "{{$dend}}";
+ var bParam_dbegin = "{{$dbegin}}";
+ var bParam_mid = "{{$mid}}";
function buildCmd() {
var udargs = ((page_load) ? "/load" : "");
@@ -38,12 +39,14 @@
if(bParam_spam != 0) bCmd = bCmd + "&spam=" + bParam_spam;
if(bParam_new != 0) bCmd = bCmd + "&new=" + bParam_new;
if(bParam_wall != 0) bCmd = bCmd + "&wall=" + bParam_wall;
+ if(bParam_list != 0) bCmd = bCmd + "&list=" + bParam_list;
if(bParam_search != "") bCmd = bCmd + "&search=" + bParam_search;
+ if(bParam_order != "") bCmd = bCmd + "&order=" + bParam_order;
if(bParam_file != "") bCmd = bCmd + "&file=" + bParam_file;
- if(bParam_cats != "") bCmd = bCmd + "&cats=" + bParam_cats;
+ if(bParam_cats != "") bCmd = bCmd + "&cat=" + bParam_cats;
if(bParam_dend != "") bCmd = bCmd + "&dend=" + bParam_dend;
if(bParam_dbegin != "") bCmd = bCmd + "&dbegin=" + bParam_dbegin;
- if(bParam_uri != "") bCmd = bCmd + "&uri=" + bParam_uri;
+ if(bParam_mid != "") bCmd = bCmd + "&mid=" + bParam_mid;
if(bParam_page != 1) bCmd = bCmd + "&page=" + bParam_page;
return(bCmd);
}
diff --git a/view/tpl/categories_widget.tpl b/view/tpl/categories_widget.tpl
index 19e91c560..2c0b3bcc2 100644..100755
--- a/view/tpl/categories_widget.tpl
+++ b/view/tpl/categories_widget.tpl
@@ -1,12 +1,12 @@
<div id="categories-sidebar" class="widget">
- <h3>$title</h3>
- <div id="categories-sidebar-desc">$desc</div>
+ <h3>{{$title}}</h3>
+ <div id="categories-sidebar-desc">{{$desc}}</div>
<ul class="categories-ul">
- <li class="tool"><a href="$base" class="categories-link categories-all{{ if $sel_all }} categories-selected{{ endif }}">$all</a></li>
- {{ for $terms as $term }}
- <li class="tool"><a href="$base?f=&cat=$term.name" class="categories-link{{ if $term.selected }} categories-selected{{ endif }}">$term.name</a></li>
- {{ endfor }}
+ <li class="tool"><a href="{{$base}}" class="categories-link categories-all{{if $sel_all}} categories-selected{{/if}}">{{$all}}</a></li>
+ {{foreach $terms as $term}}
+ <li class="tool"><a href="{{$base}}?f=&cat={{$term.name}}" class="categories-link{{if $term.selected}} categories-selected{{/if}}">{{$term.name}}</a></li>
+ {{/foreach}}
</ul>
</div>
diff --git a/view/tpl/channel.tpl b/view/tpl/channel.tpl
index af4f9b703..d6462d1e4 100644..100755
--- a/view/tpl/channel.tpl
+++ b/view/tpl/channel.tpl
@@ -1,12 +1,12 @@
<div class="channel-selection">
-{{ if $channel.default_links }}
-{{ if $channel.default }}
-<div class="channel-selection-default default">$msg_default</div>
-{{ else }}
-<div class="channel-selection-default"><a href="manage/$channel.channel_id/default">$msg_make_default</a></div>
-{{ endif }}
-{{ endif }}
-<a href="$channel.link" class="channel-selection-photo-link" title="$channel.channel_name"><img class="channel-photo" src="$channel.xchan_photo_m" alt="$channel.channel_name" /></a>
-<a href="$channel.link" class="channel-selection-name-link" title="$channel.channel_name"><div class="channel-name">$channel.channel_name</div></a>
+{{if $channel.default_links}}
+{{if $channel.default}}
+<div class="channel-selection-default default">{{$msg_default}}</div>
+{{else}}
+<div class="channel-selection-default"><a href="manage/{{$channel.channel_id}}/default">{{$msg_make_default}}</a></div>
+{{/if}}
+{{/if}}
+<a href="{{$channel.link}}" class="channel-selection-photo-link" title="{{$channel.channel_name}}"><img class="channel-photo" src="{{$channel.xchan_photo_m}}" alt="{{$channel.channel_name}}" /></a>
+<a href="{{$channel.link}}" class="channel-selection-name-link" title="{{$channel.channel_name}}"><div class="channel-name">{{$channel.channel_name}}</div></a>
</div>
<div class="channel-selection-end"></div>
diff --git a/view/tpl/channel_import.tpl b/view/tpl/channel_import.tpl
index 8002b6e03..f7635ea52 100644..100755
--- a/view/tpl/channel_import.tpl
+++ b/view/tpl/channel_import.tpl
@@ -1,34 +1,34 @@
-<h2>$title</h2>
+<h2>{{$title}}</h2>
-<form action="import" method="post" id="import-channel-form">
+<form action="import" method="post" enctype="multipart/form-data" id="import-channel-form">
- <div id="import-desc" class="descriptive-paragraph">$desc</div>
+ <div id="import-desc" class="descriptive-paragraph">{{$desc}}</div>
- <label for="import-filename" id="label-import-filename" class="import-label" >$label_filename</label>
+ <label for="import-filename" id="label-import-filename" class="import-label" >{{$label_filename}}</label>
<input type="file" name="filename" id="import-filename" class="import-input" value="" />
<div id="import-filename-end" class="import-field-end"></div>
- <div id="import-choice" class="descriptive-paragraph">$choice</div>
+ <div id="import-choice" class="descriptive-paragraph">{{$choice}}</div>
- <label for="import-old-address" id="label-import-old-address" class="import-label" >$label_old_address</label>
+ <label for="import-old-address" id="label-import-old-address" class="import-label" >{{$label_old_address}}</label>
<input type="text" name="old_address" id="import-old-address" class="import-input" value="" />
<div id="import-old-address-end" class="import-field-end"></div>
- <label for="import-old-email" id="label-import-old-email" class="import-label" >$label_old_email</label>
- <input type="text" name="email" id="import-old-email" class="import-input" value="$email" />
+ <label for="import-old-email" id="label-import-old-email" class="import-label" >{{$label_old_email}}</label>
+ <input type="text" name="email" id="import-old-email" class="import-input" value="{{$email}}" />
<div id="import-old-email-end" class="import-field-end"></div>
- <label for="import-old-pass" id="label-import-old-pass" class="import-label" >$label_old_pass</label>
- <input type="password" name="password" id="import-old-pass" class="import-input" value="$pass" />
+ <label for="import-old-pass" id="label-import-old-pass" class="import-label" >{{$label_old_pass}}</label>
+ <input type="password" name="password" id="import-old-pass" class="import-input" value="{{$pass}}" />
<div id="import-old-pass-end" class="import-field-end"></div>
- <div id="import-common-desc" class="descriptive-paragraph">$common</div>
+ <div id="import-common-desc" class="descriptive-paragraph">{{$common}}</div>
<input type="checkbox" name="make_primary" id="import-make-primary" value="1" />
- <label for="import-make-primary" id="label-import-make-primary">$label_import_primary</label>
+ <label for="import-make-primary" id="label-import-make-primary">{{$label_import_primary}}</label>
<div id="import-make-primary-end" class="import-field-end"></div>
- <input type="submit" name="submit" id="import-submit-button" value="$submit" />
+ <input type="submit" name="submit" id="import-submit-button" value="{{$submit}}" />
<div id="import-submit-end" class="import-field-end"></div>
</form>
diff --git a/view/tpl/channels.tpl b/view/tpl/channels.tpl
index 916ba1c75..af6b36b1d 100644..100755
--- a/view/tpl/channels.tpl
+++ b/view/tpl/channels.tpl
@@ -1,22 +1,31 @@
-<h3>$header</h3>
+<h3>{{$header}}</h3>
-{{ if $links }}
-{{ for $links as $l }}
-<a class="channels-links" href="$l.0" title="$l.1">$l.2</a>
-{{ endfor }}
-{{ endif }}
+{{if $links}}
+{{foreach $links as $l}}
+<a class="channels-links" href="{{$l.0}}" title="{{$l.1}}">{{$l.2}}</a>
+{{/foreach}}
+{{/if}}
-{{ if $selected }}
-<div id="channels-selected">$msg_selected</div>
-{{ inc channel.tpl with $channel=$selected }}{{ endinc }}
+{{if $channel_usage_message}}
+<div id="channel-usage-message" class="usage-message">
+{{$channel_usage_message}}
+</div>
+{{/if}}
+{{if $selected}}
+<div id="selected-channel">
+<div id="channels-selected">{{$msg_selected}}</div>
+{{include file="channel.tpl" channel=$selected}}
<div class="channels-end selected"></div>
-{{ endif }}
+</div>
+{{/if}}
-<div id="channels-desc" class="descriptive-text">$desc</div>
+<div id="channels-desc" class="descriptive-text">{{$desc}}</div>
-{{ for $all_channels as $chn }}
-{{ inc channel.tpl with $channel=$chn }}{{ endinc }}
-{{ endfor }}
+<div id="all-channels">
+{{foreach $all_channels as $chn}}
+{{include file="channel.tpl" channel=$chn}}
+{{/foreach}}
+</div>
<div class="channels-end all"></div>
diff --git a/view/tpl/chanview.tpl b/view/tpl/chanview.tpl
index da96c9c0c..4df327bf9 100644..100755
--- a/view/tpl/chanview.tpl
+++ b/view/tpl/chanview.tpl
@@ -1,2 +1,2 @@
-<div id="chanview-iframe-border" class="fakelink" onclick="chanviewFull(); return true;" title="$full" >&#x2610;</div>
-<iframe id="remote-channel" width="100%" src="$url" onload="resize_iframe()"></iframe>
+<div id="chanview-iframe-border" class="fakelink" onclick="chanviewFull(); return true;" title="{{$full}}" >&#x2610;</div>
+<iframe id="remote-channel" width="100%" src="{{$url}}" onload="resize_iframe()"></iframe>
diff --git a/view/tpl/comment_item.tpl b/view/tpl/comment_item.tpl
index cc7153ebb..1ea619774 100644..100755
--- a/view/tpl/comment_item.tpl
+++ b/view/tpl/comment_item.tpl
@@ -1,65 +1,69 @@
- {{ if $threaded }}
- <div class="comment-wwedit-wrapper threaded" id="comment-edit-wrapper-$id" style="display: block;">
- {{ else }}
- <div class="comment-wwedit-wrapper" id="comment-edit-wrapper-$id" style="display: block;">
- {{ endif }}
- <form class="comment-edit-form" style="display: block;" id="comment-edit-form-$id" action="item" method="post" onsubmit="post_comment($id); return false;">
- <input type="hidden" name="type" value="$type" />
- <input type="hidden" name="profile_uid" value="$profile_uid" />
- <input type="hidden" name="parent" value="$parent" />
- <input type="hidden" name="return" value="$return_path" />
- <input type="hidden" name="jsreload" value="$jsreload" />
- <input type="hidden" name="preview" id="comment-preview-inp-$id" value="0" />
- <input type="hidden" name="post_id_random" value="$rand_num" />
+ {{if $threaded}}
+ <div class="comment-wwedit-wrapper threaded" id="comment-edit-wrapper-{{$id}}" style="display: block;">
+ {{else}}
+ <div class="comment-wwedit-wrapper" id="comment-edit-wrapper-{{$id}}" style="display: block;">
+ {{/if}}
+ <form class="comment-edit-form" style="display: block;" id="comment-edit-form-{{$id}}" action="item" method="post" onsubmit="post_comment({{$id}}); return false;">
+ <input type="hidden" name="type" value="{{$type}}" />
+ <input type="hidden" name="profile_uid" value="{{$profile_uid}}" />
+ <input type="hidden" name="parent" value="{{$parent}}" />
+ <input type="hidden" name="return" value="{{$return_path}}" />
+ <input type="hidden" name="jsreload" value="{{$jsreload}}" />
+ <input type="hidden" name="preview" id="comment-preview-inp-{{$id}}" value="0" />
- <div class="comment-edit-photo" id="comment-edit-photo-$id" >
- <a class="comment-edit-photo-link" href="$mylink" title="$mytitle"><img class="my-comment-photo" src="$myphoto" alt="$mytitle" title="$mytitle" /></a>
+ <div class="comment-edit-photo" id="comment-edit-photo-{{$id}}" >
+ <a class="comment-edit-photo-link" href="{{$mylink}}" title="{{$mytitle}}"><img class="my-comment-photo" src="{{$myphoto}}" alt="{{$mytitle}}" title="{{$mytitle}}" /></a>
</div>
<div class="comment-edit-photo-end"></div>
- <ul class="comment-edit-bb-$id">
- <li><a class="editicon boldbb shadow"
- style="cursor: pointer;" title="$edbold"
- onclick="insertFormatting('$comment','b', $id);"></a></li>
- <li><a class="editicon italicbb shadow"
- style="cursor: pointer;" title="$editalic"
- onclick="insertFormatting('$comment','i', $id);"></a></li>
- <li><a class="editicon underlinebb shadow"
- style="cursor: pointer;" title="$eduline"
- onclick="insertFormatting('$comment','u', $id);"></a></li>
- <li><a class="editicon quotebb shadow"
- style="cursor: pointer;" title="$edquote"
- onclick="insertFormatting('$comment','quote', $id);"></a></li>
- <li><a class="editicon codebb shadow"
- style="cursor: pointer;" title="$edcode"
- onclick="insertFormatting('$comment','code', $id);"></a></li>
- <li><a class="editicon imagebb shadow"
- style="cursor: pointer;" title="$edimg"
- onclick="insertFormatting('$comment','img', $id);"></a></li>
- <li><a class="editicon urlbb shadow"
- style="cursor: pointer;" title="$edurl"
- onclick="insertFormatting('$comment','url', $id);"></a></li>
- <li><a class="editicon videobb shadow"
- style="cursor: pointer;" title="$edvideo"
- onclick="insertFormatting('$comment','video', $id);"></a></li>
+ <ul class="comment-edit-bb-{{$id}}">
+ <li><i class="icon-bold shadow comment-icon"
+ style="cursor: pointer;" title="{{$edbold}}"
+ onclick="insertbbcomment('{{$comment}}','b', {{$id}});"></i></li>
+ <li><i class="icon-italic shadow comment-icon"
+ style="cursor: pointer;" title="{{$editalic}}"
+ onclick="insertbbcomment('{{$comment}}','i', {{$id}});"></i></li>
+ <li><i class="icon-underline shadow comment-icon"
+ style="cursor: pointer;" title="{{$eduline}}"
+ onclick="insertbbcomment('{{$comment}}','u', {{$id}});"></i></li>
+ <li><i class="icon-quote-left shadow comment-icon"
+ style="cursor: pointer;" title="{{$edquote}}"
+ onclick="insertbbcomment('{{$comment}}','quote', {{$id}});"></i></li>
+ <li><i class="icon-terminal shadow comment-icon"
+ style="cursor: pointer;" title="{{$edcode}}"
+ onclick="insertbbcomment('{{$comment}}','code', {{$id}});"></i></li>
+ <li><i class="icon-camera shadow comment-icon"
+ style="cursor: pointer;" title="{{$edimg}}"
+ onclick="insertbbcomment('{{$comment}}','img', {{$id}});"></i></li>
+ <li><i class="icon-link shadow comment-icon"
+ style="cursor: pointer;" title="{{$edurl}}"
+ onclick="insertbbcomment('{{$comment}}','url', {{$id}});"></i></li>
+ <li><i class="icon-facetime-video shadow comment-icon"
+ style="cursor: pointer;" title="{{$edvideo}}"
+ onclick="insertbbcomment('{{$comment}}','video', {{$id}});"></i></li>
+ {{if $feature_encrypt}}
+ <li><i class="icon-key shadow comment-icon"
+ style="cursor: pointer;" title="{{$encrypt}}"
+ onclick="red_encrypt('{{$cipher}}','#comment-edit-text-' + '{{$id}}',''); return false;"></i></li>
+ {{/if}}
</ul>
<div class="comment-edit-bb-end"></div>
- <textarea id="comment-edit-text-$id" class="comment-edit-text-empty" name="body" onFocus="commentOpen(this,$id);cmtBbOpen(this, $id);" onBlur="commentClose(this,$id);cmtBbClose(this,$id);" >$comment</textarea>
- {{ if $qcomment }}
- <select id="qcomment-select-$id" name="qcomment-$id" class="qcomment" onchange="qCommentInsert(this,$id);" >
+ <textarea id="comment-edit-text-{{$id}}" class="comment-edit-text-empty" name="body" onFocus="commentOpen(this,{{$id}});cmtBbOpen(this, {{$id}});" onBlur="commentClose(this,{{$id}});cmtBbClose(this,{{$id}});" >{{$comment}}</textarea>
+ {{if $qcomment}}
+ <select id="qcomment-select-{{$id}}" name="qcomment-{{$id}}" class="qcomment" onchange="qCommentInsert(this,{{$id}});" >
<option value=""></option>
- {{ for $qcomment as $qc }}
- <option value="$qc">$qc</option>
- {{ endfor }}
+ {{foreach $qcomment as $qc}}
+ <option value="{{$qc}}">{{$qc}}</option>
+ {{/foreach}}
</select>
- {{ endif }}
+ {{/if}}
<div class="comment-edit-text-end"></div>
- <div class="comment-edit-submit-wrapper" id="comment-edit-submit-wrapper-$id" style="display: none;" >
- <input type="submit" onclick="post_comment($id); return false;" id="comment-edit-submit-$id" class="comment-edit-submit" name="submit" value="$submit" />
- {{ if $preview }}
- <span onclick="preview_comment($id);" id="comment-edit-preview-link-$id" class="fakelink">$preview</span>
- <div id="comment-edit-preview-$id" class="comment-edit-preview" style="display:none;"></div>
- {{ endif }}
+ <div class="comment-edit-submit-wrapper" id="comment-edit-submit-wrapper-{{$id}}" style="display: none;" >
+ <input type="submit" onclick="post_comment({{$id}}); return false;" id="comment-edit-submit-{{$id}}" class="comment-edit-submit" name="submit" value="{{$submit}}" />
+ {{if $preview}}
+ <span onclick="preview_comment({{$id}});" id="comment-edit-preview-link-{{$id}}" class="fakelink"><i class="icon-eye-open comment-icon comment-preview-icon" title="{{$preview}}"></i></span>
+ <div id="comment-edit-preview-{{$id}}" class="comment-edit-preview" style="display:none;"></div>
+ {{/if}}
</div>
<div class="comment-edit-end"></div>
diff --git a/view/tpl/common_friends.tpl b/view/tpl/common_friends.tpl
index 1f610d8c4..489717e78 100644..100755
--- a/view/tpl/common_friends.tpl
+++ b/view/tpl/common_friends.tpl
@@ -1,12 +1,15 @@
<div class="profile-match-wrapper">
<div class="profile-match-photo">
- <a href="$url">
- <img src="$photo" alt="$name" width="80" height="80" title="$name [$url]" />
+ <a href="{{$url}}">
+ <img src="{{$photo}}" alt="{{$name}}" width="80" height="80" title="{{$name}} [{{$url}}]" />
</a>
</div>
<div class="profile-match-break"></div>
<div class="profile-match-name">
- <a href="$url" title="$name[$tags]">$name</a>
+ <a href="{{$url}}" title="{{$name}}[{{$tags}}]">{{$name}}</a>
</div>
+ {{if $note}}
+ <div class="profile-match-note">{{$note}}</div>
+ {{/if}}
<div class="profile-match-end"></div>
-</div> \ No newline at end of file
+</div>
diff --git a/view/tpl/common_tabs.tpl b/view/tpl/common_tabs.tpl
index 97b771e7a..3d34d7c57 100644..100755
--- a/view/tpl/common_tabs.tpl
+++ b/view/tpl/common_tabs.tpl
@@ -1,6 +1,6 @@
<ul class="tabs">
- {{ for $tabs as $tab }}
- <li {{ if $tab.id }}id="$tab.id"{{ endif }}><a href="$tab.url" class="tab button $tab.sel"{{ if $tab.title }} title="$tab.title"{{ endif }}>$tab.label</a></li>
- {{ endfor }}
+ {{foreach $tabs as $tab}}
+ <li {{if $tab.id}}id="{{$tab.id}}"{{/if}}><a href="{{$tab.url}}" class="tab button {{$tab.sel}}"{{if $tab.title}} title="{{$tab.title}}"{{/if}}>{{$tab.label}}</a></li>
+ {{/foreach}}
</ul>
-<div class="tabs-end"></div> \ No newline at end of file
+<div class="tabs-end"></div>
diff --git a/view/tpl/contact_block.tpl b/view/tpl/contact_block.tpl
index b90469199..d1ce5ca67 100644..100755
--- a/view/tpl/contact_block.tpl
+++ b/view/tpl/contact_block.tpl
@@ -1,12 +1,12 @@
<div id="contact-block">
-<div id="contact-block-numcontacts">$contacts</div>
-{{ if $micropro }}
- <a class="allcontact-link" href="viewconnections/$nickname">$viewconnections</a>
+<div id="contact-block-numcontacts">{{$contacts}}</div>
+{{if $micropro}}
+ <a class="allcontact-link" href="viewconnections/{{$nickname}}">{{$viewconnections}}</a>
<div class='contact-block-content'>
- {{ for $micropro as $m }}
- $m
- {{ endfor }}
+ {{foreach $micropro as $m}}
+ {{$m}}
+ {{/foreach}}
</div>
-{{ endif }}
+{{/if}}
</div>
<div class="clear"></div>
diff --git a/view/tpl/contact_edit.tpl b/view/tpl/contact_edit.tpl
deleted file mode 100644
index 4f99b4aca..000000000
--- a/view/tpl/contact_edit.tpl
+++ /dev/null
@@ -1,89 +0,0 @@
-
-<h2>$header</h2>
-
-<div id="contact-edit-wrapper" >
-
- $tab_str
-
- <div id="contact-edit-drop-link" >
- <a href="contacts/$contact_id/drop" class="icon drophide" id="contact-edit-drop-link" onclick="return confirmDelete();" title="$delete" onmouseover="imgbright(this);" onmouseout="imgdull(this);"></a>
- </div>
-
- <div id="contact-edit-drop-link-end"></div>
-
-
- <div id="contact-edit-nav-wrapper" >
- <div id="contact-edit-links">
- <ul>
- <li><div id="contact-edit-rel">$relation_text</div></li>
- <li><div id="contact-edit-nettype">$nettype</div></li>
- {{ if $lost_contact }}
- <li><div id="lost-contact-message">$lost_contact</div></li>
- {{ endif }}
- {{ if $insecure }}
- <li><div id="insecure-message">$insecure</div></li>
- {{ endif }}
- {{ if $blocked }}
- <li><div id="block-message">$blocked</div></li>
- {{ endif }}
- {{ if $ignored }}
- <li><div id="ignore-message">$ignored</div></li>
- {{ endif }}
- {{ if $archived }}
- <li><div id="archive-message">$archived</div></li>
- {{ endif }}
-
- <li>&nbsp;</li>
-
- {{ if $common_text }}
- <li><div id="contact-edit-common"><a href="$common_link">$common_text</a></div></li>
- {{ endif }}
- {{ if $all_friends }}
- <li><div id="contact-edit-allfriends"><a href="allfriends/$contact_id">$all_friends</a></div></li>
- {{ endif }}
-
-
- <li><a href="network/?cid=$contact_id" id="contact-edit-view-recent">$lblrecent</a></li>
- {{ if $lblsuggest }}
- <li><a href="fsuggest/$contact_id" id="contact-edit-suggest">$lblsuggest</a></li>
- {{ endif }}
-
- </ul>
- </div>
- </div>
- <div id="contact-edit-nav-end"></div>
-
-
-<form action="contacts/$contact_id" method="post" >
-<input type="hidden" name="contact_id" value="$contact_id">
-<input id="contact-closeness-mirror" type="hidden" name="closeness" value="$close" />
-
- {{ if $poll_enabled }}
- <div id="contact-edit-poll-wrapper">
- <div id="contact-edit-last-update-text">$lastupdtext <span id="contact-edit-last-updated">$last_update</span></div>
- <span id="contact-edit-poll-text">$updpub</span> $poll_interval <span id="contact-edit-update-now" class="button"><a href="contacts/$contact_id/update" >$udnow</a></span>
- </div>
- {{ endif }}
- <div id="contact-edit-end" ></div>
-
- {{inc field_checkbox.tpl with $field=$hidden }}{{endinc}}
-
-<div id="contact-edit-info-wrapper">
-<h4>$lbl_info1</h4>
- <textarea id="contact-edit-info" rows="8" cols="60" name="info">$info</textarea>
- <input class="contact-edit-submit" type="submit" name="submit" value="$submit" />
-</div>
-<div id="contact-edit-info-end"></div>
-
-
-<div id="contact-edit-profile-select-text">
-<h4>$lbl_vis1</h4>
-<p>$lbl_vis2</p>
-</div>
-$profile_select
-<div id="contact-edit-profile-select-end"></div>
-
-<input class="contact-edit-submit" type="submit" name="submit" value="$submit" />
-
-</form>
-</div>
diff --git a/view/tpl/contact_head.tpl b/view/tpl/contact_head.tpl
index 9cfd81710..72e7edbfb 100644..100755
--- a/view/tpl/contact_head.tpl
+++ b/view/tpl/contact_head.tpl
@@ -1,10 +1,10 @@
<script language="javascript" type="text/javascript"
- src="$baseurl/library/tinymce/jscripts/tiny_mce/tiny_mce_src.js"></script>
+ src="{{$baseurl}}/library/tinymce/jscripts/tiny_mce/tiny_mce_src.js"></script>
<script language="javascript" type="text/javascript">
tinyMCE.init({
theme : "advanced",
- mode : "$editselect",
+ mode : "{{$editselect}}",
elements: "contact-edit-info",
plugins : "bbcode",
theme_advanced_buttons1 : "bold,italic,underline,undo,redo,link,unlink,image,forecolor",
@@ -20,7 +20,7 @@ tinyMCE.init({
force_p_newlines : false,
force_br_newlines : true,
forced_root_block : '',
- content_css: "$baseurl/view/custom_tinymce.css"
+ content_css: "{{$baseurl}}/view/custom_tinymce.css"
});
diff --git a/view/tpl/contact_slider.tpl b/view/tpl/contact_slider.tpl
index 2ccb08a90..33cd3fb71 100644..100755
--- a/view/tpl/contact_slider.tpl
+++ b/view/tpl/contact_slider.tpl
@@ -1,4 +1,4 @@
-<div id="contact-slider" class="slider" style="height: 32px; position: relative; left: 5%; width: 90%;"><input id="contact-range" type="text" name="fake-closeness" value="$val" /></div>
+<div id="contact-slider" class="slider" style="height: 32px; position: relative; left: 5%; width: 90%;"><input id="contact-range" type="text" name="fake-closeness" value="{{$val}}" /></div>
<script>
- $("#contact-range").slider({ from: 0, to: 99, step: 1, scale: ['$me', '|', '$intimate', '|', '$friends', '|', '$oldfriends', '|', '$acquaintances', '|', '$world' ], onstatechange: function(v) { $("#contact-closeness-mirror").val(v); } });
+ $("#contact-range").slider({ from: 0, to: 99, step: 1, scale: ['{{$me}}', '|', '{{$intimate}}', '|', '{{$friends}}', '|', '{{$oldfriends}}', '|', '{{$acquaintances}}', '|', '{{$world}}' ], onstatechange: function(v) { $("#contact-closeness-mirror").val(v); } });
</script>
diff --git a/view/tpl/contact_template.tpl b/view/tpl/contact_template.tpl
index 7bdcd6b93..7feefa655 100644..100755
--- a/view/tpl/contact_template.tpl
+++ b/view/tpl/contact_template.tpl
@@ -1,9 +1,8 @@
-
-<div class="contact-entry-wrapper" id="contact-entry-wrapper-$contact.id" >
+<div class="contact-entry-wrapper" id="contact-entry-wrapper-{{$contact.id}}" >
<div class="contact-entry-photo-wrapper" >
- <a href="$contact.url" title="$contact.img_hover" /><img src="$contact.thumb" alt="$contact.name" /></a>
+ <a href="{{$contact.link}}" title="{{$contact.img_hover}}" /><img class="contact-block-img" src="{{$contact.thumb}}" alt="{{$contact.name}}" /></a>
</div>
<div class="contact-entry-photo-end" ></div>
- <div class="contact-entry-name" id="contact-entry-name-$contact.id" >$contact.name</div>
+ <div class="contact-entry-name" id="contact-entry-name-{{$contact.id}}" >{{$contact.name}}</div>
<div class="contact-entry-end" ></div>
</div>
diff --git a/view/tpl/contacts-template.tpl b/view/tpl/contacts-template.tpl
index ecb342bf4..0c7e01038 100644..100755
--- a/view/tpl/contacts-template.tpl
+++ b/view/tpl/contacts-template.tpl
@@ -1,25 +1,25 @@
-<h1>$header{{ if $total }} ($total){{ endif }}</h1>
+<h1>{{$header}}{{if $total}} ({{$total}}){{/if}}</h1>
-{{ if $finding }}<h4>$finding</h4>{{ endif }}
+{{if $finding}}<h4>{{$finding}}</h4>{{/if}}
<div id="contacts-search-wrapper">
-<form id="contacts-search-form" action="$cmd" method="get" >
-<span class="contacts-search-desc">$desc</span>
-<input type="text" name="search" id="contacts-search" class="search-input" onfocus="this.select();" value="$search" />
-<input type="submit" name="submit" id="contacts-search-submit" value="$submit" />
+<form id="contacts-search-form" action="{{$cmd}}" method="get" >
+<span class="contacts-search-desc">{{$desc}}</span>
+<input type="text" name="search" id="contacts-search" class="search-input" onfocus="this.select();" value="{{$search}}" />
+<input type="submit" name="submit" id="contacts-search-submit" value="{{$submit}}" />
</form>
</div>
<div id="contacts-search-end"></div>
-$tabs
+{{$tabs}}
-{{ for $contacts as $contact }}
- {{ inc contact_template.tpl }}{{ endinc }}
-{{ endfor }}
+{{foreach $contacts as $contact}}
+ {{include file="contact_template.tpl"}}
+{{/foreach}}
<div id="contact-edit-end"></div>
-$paginate
+{{$paginate}}
diff --git a/view/tpl/content.tpl b/view/tpl/content.tpl
deleted file mode 100644
index 466045d39..000000000
--- a/view/tpl/content.tpl
+++ /dev/null
@@ -1,2 +0,0 @@
-<div id="content-begin"></div>
-<div id="content-end"></div>
diff --git a/view/tpl/conv.tpl b/view/tpl/conv.tpl
index b7222f154..ddb959b84 100644..100755
--- a/view/tpl/conv.tpl
+++ b/view/tpl/conv.tpl
@@ -1,17 +1,17 @@
-{{ for $threads as $thread }}
-<div id="thread-wrapper-$thread.id" class="thread-wrapper">
- {{ for $thread.items as $item }}
+{{foreach $threads as $thread}}
+<div id="thread-wrapper-{{$thread.id}}" class="thread-wrapper">
+ {{foreach $thread.items as $item}}
{{if $item.comment_firstcollapsed}}
<div class="hide-comments-outer">
- <span id="hide-comments-total-$thread.id" class="hide-comments-total">$thread.num_comments</span> <span id="hide-comments-$thread.id" class="hide-comments fakelink" onclick="showHideComments($thread.id);">$thread.hide_text</span>
+ <span id="hide-comments-total-{{$thread.id}}" class="hide-comments-total">{{$thread.num_comments}}</span> <span id="hide-comments-{{$thread.id}}" class="hide-comments fakelink" onclick="showHideComments({{$thread.id}});">{{$thread.hide_text}}</span>
</div>
- <div id="collapsed-comments-$thread.id" class="collapsed-comments" style="display: none;">
- {{endif}}
- {{if $item.comment_lastcollapsed}}</div>{{endif}}
+ <div id="collapsed-comments-{{$thread.id}}" class="collapsed-comments" style="display: none;">
+ {{/if}}
+ {{if $item.comment_lastcollapsed}}</div>{{/if}}
- {{ inc $item.template }}{{ endinc }}
+ {{include file="{{$item.template}}"}}
- {{ endfor }}
+ {{/foreach}}
</div>
-{{ endfor }}
+{{/foreach}}
diff --git a/view/tpl/conv_frame.tpl b/view/tpl/conv_frame.tpl
index 202b095e7..aa7b55e9b 100644..100755
--- a/view/tpl/conv_frame.tpl
+++ b/view/tpl/conv_frame.tpl
@@ -1,14 +1,5 @@
<div id="threads-begin"></div>
<div id="threads-end"></div>
<div id="conversation-end"></div>
-
-{{ if $dropping }}
-<div id="item-delete-selected" class="fakelink" onclick="deleteCheckedItems();">
- <div id="item-delete-selected-icon" class="icon drophide" title="$dropping" onmouseover="imgbright(this);" onmouseout="imgdull(this);" ></div>
- <div id="item-delete-selected-desc" >$dropping</div>
-</div>
-<div id="item-delete-selected-end"></div>
-{{ endif }}
-
-<img id="page-spinner" src="images/rotator.gif" alt="$wait" title="$wait" style="display: none;" />
+<div id="page-spinner"></div>
diff --git a/view/tpl/conv_item.tpl b/view/tpl/conv_item.tpl
index 0c0553639..50a243ff4 100644..100755
--- a/view/tpl/conv_item.tpl
+++ b/view/tpl/conv_item.tpl
@@ -1,115 +1,118 @@
{{if $item.comment_firstcollapsed}}
<div class="hide-comments-outer">
- <span id="hide-comments-total-$item.id" class="hide-comments-total">$item.num_comments</span> <span id="hide-comments-$item.id" class="hide-comments fakelink" onclick="showHideComments($item.id);">$item.hide_text</span>
+ <span id="hide-comments-total-{{$item.id}}" class="hide-comments-total">{{$item.num_comments}}</span> <span id="hide-comments-{{$item.id}}" class="hide-comments fakelink" onclick="showHideComments({{$item.id}});">{{$item.hide_text}}</span>
</div>
- <div id="collapsed-comments-$item.id" class="collapsed-comments" style="display: none;">
-{{endif}}
-<div id="thread-wrapper-$item.id" class="thread-wrapper $item.toplevel">
-<a name="$item.id" ></a>
-<div class="wall-item-outside-wrapper $item.indent$item.previewing{{ if $item.owner_url }} wallwall{{ endif }}" id="wall-item-outside-wrapper-$item.id" >
- <div class="wall-item-content-wrapper $item.indent" id="wall-item-content-wrapper-$item.id" >
- <div class="wall-item-info{{ if $item.owner_url }} wallwall{{ endif }}" id="wall-item-info-$item.id">
- {{ if $item.owner_url }}
- <div class="wall-item-photo-wrapper wwto" id="wall-item-ownerphoto-wrapper-$item.id" >
- <a href="$item.owner_url" title="$item.olinktitle" class="wall-item-photo-link" id="wall-item-ownerphoto-link-$item.id">
- <img src="$item.owner_photo" class="wall-item-photo$item.osparkle" id="wall-item-ownerphoto-$item.id" style="height: 80px; width: 80px;" alt="$item.owner_name" /></a>
+ <div id="collapsed-comments-{{$item.id}}" class="collapsed-comments" style="display: none;">
+{{/if}}
+<div id="thread-wrapper-{{$item.id}}" class="thread-wrapper {{$item.toplevel}}">
+<a name="{{$item.id}}" ></a>
+<div class="wall-item-outside-wrapper {{$item.indent}}{{$item.previewing}}{{if $item.owner_url}} wallwall{{/if}}" id="wall-item-outside-wrapper-{{$item.id}}" >
+ <div class="wall-item-content-wrapper {{$item.indent}}" id="wall-item-content-wrapper-{{$item.id}}" >
+ <div class="wall-item-info{{if $item.owner_url}} wallwall{{/if}}" id="wall-item-info-{{$item.id}}">
+ {{if $item.owner_url}}
+ <div class="wall-item-photo-wrapper wwto" id="wall-item-ownerphoto-wrapper-{{$item.id}}" >
+ <a href="{{$item.owner_url}}" title="{{$item.olinktitle}}" class="wall-item-photo-link" id="wall-item-ownerphoto-link-{{$item.id}}">
+ <img src="{{$item.owner_photo}}" class="wall-item-photo{{$item.osparkle}}" id="wall-item-ownerphoto-{{$item.id}}" style="height: 80px; width: 80px;" alt="{{$item.owner_name}}" /></a>
</div>
- <div class="wall-item-arrowphoto-wrapper" ><img src="images/larrow.gif" alt="$item.wall" /></div>
- {{ endif }}
- <div class="wall-item-photo-wrapper{{ if $item.owner_url }} wwfrom{{ endif }}" id="wall-item-photo-wrapper-$item.id"
- onmouseover="if (typeof t$item.id != 'undefined') clearTimeout(t$item.id); openMenu('wall-item-photo-menu-button-$item.id')"
- onmouseout="t$item.id=setTimeout('closeMenu(\'wall-item-photo-menu-button-$item.id\'); closeMenu(\'wall-item-photo-menu-$item.id\');',200)">
- <a href="$item.profile_url" title="$item.linktitle" class="wall-item-photo-link" id="wall-item-photo-link-$item.id">
- <img src="$item.thumb" class="wall-item-photo$item.sparkle" id="wall-item-photo-$item.id" style="height: 80px; width: 80px;" alt="$item.name" /></a>
- <span onclick="openClose('wall-item-photo-menu-$item.id');" class="fakelink wall-item-photo-menu-button" id="wall-item-photo-menu-button-$item.id">menu</span>
- <div class="wall-item-photo-menu" id="wall-item-photo-menu-$item.id">
+ <div class="wall-item-arrowphoto-wrapper" ><img src="images/larrow.gif" alt="{{$item.wall}}" /></div>
+ {{/if}}
+ <div class="wall-item-photo-wrapper{{if $item.owner_url}} wwfrom{{/if}}" id="wall-item-photo-wrapper-{{$item.id}}"
+ onmouseover="if (typeof t{{$item.id}} != 'undefined') clearTimeout(t{{$item.id}}); openMenu('wall-item-photo-menu-button-{{$item.id}}')"
+ onmouseout="t{{$item.id}}=setTimeout('closeMenu(\'wall-item-photo-menu-button-{{$item.id}}\'); closeMenu(\'wall-item-photo-menu-{{$item.id}}\');',200)">
+ <a href="{{$item.profile_url}}" title="{{$item.linktitle}}" class="wall-item-photo-link" id="wall-item-photo-link-{{$item.id}}">
+ <img src="{{$item.thumb}}" class="wall-item-photo{{$item.sparkle}}" id="wall-item-photo-{{$item.id}}" style="height: 80px; width: 80px;" alt="{{$item.name}}" /></a>
+ <span onclick="openClose('wall-item-photo-menu-{{$item.id}}');" class="fakelink wall-item-photo-menu-button" id="wall-item-photo-menu-button-{{$item.id}}">menu</span>
+ <div class="wall-item-photo-menu" id="wall-item-photo-menu-{{$item.id}}">
<ul>
- $item.item_photo_menu
+ {{$item.item_photo_menu}}
</ul>
</div>
</div>
<div class="wall-item-photo-end"></div>
- <div class="wall-item-wrapper" id="wall-item-wrapper-$item.id" >
- {{ if $item.lock }}<div class="wall-item-lock"><img src="images/lock_icon.gif" class="lockview" alt="$item.lock" onclick="lockview(event,$item.id);" /></div>
- {{ else }}<div class="wall-item-lock"></div>{{ endif }}
- <div class="wall-item-location" id="wall-item-location-$item.id">$item.location</div>
+ <div class="wall-item-wrapper" id="wall-item-wrapper-{{$item.id}}" >
+ {{if $item.lock}}<i class="wall-item-lock icon-lock lockview" title="{{$item.lock}}" onclick="lockview(event,{{$item.id}});" ></i>
+ {{else}}<div class="wall-item-lock"></div>{{/if}}
+ <div class="wall-item-location" id="wall-item-location-{{$item.id}}">{{$item.location}}</div>
</div>
</div>
<div class="wall-item-author">
- <a href="$item.profile_url" title="$item.linktitle" class="wall-item-name-link"><span class="wall-item-name$item.sparkle" id="wall-item-name-$item.id" >$item.name</span></a>{{ if $item.owner_url }} $item.to <a href="$item.owner_url" title="$item.olinktitle" class="wall-item-name-link"><span class="wall-item-name$item.osparkle" id="wall-item-ownername-$item.id">$item.owner_name</span></a> $item.vwall{{ endif }}<br />
- <div class="wall-item-ago" id="wall-item-ago-$item.id" title="$item.localtime">$item.ago</div>
+ <a href="{{$item.profile_url}}" title="{{$item.linktitle}}" class="wall-item-name-link"><span class="wall-item-name{{$item.sparkle}}" id="wall-item-name-{{$item.id}}" >{{$item.name}}</span></a>{{if $item.owner_url}} {{$item.via}} <a href="{{$item.owner_url}}" title="{{$item.olinktitle}}" class="wall-item-name-link"><span class="wall-item-name{{$item.osparkle}}" id="wall-item-ownername-{{$item.id}}">{{$item.owner_name}}</span></a>{{/if}}<br />
+
+ <div class="wall-item-ago" id="wall-item-ago-{{$item.id}}">{{if $item.verified}}<i class="icon-ok" title="{{$item.verified}}"></i>&nbsp;{{/if}}<span class="autotime" title="{{$item.isotime}}">{{$item.localtime}}{{if $item.editedtime}} {{$item.editedtime}}{{/if}}{{if $item.expiretime}} {{$item.expiretime}}{{/if}}</span>{{if $item.app}}<span class="item.app">{{$item.str_app}}</span>{{/if}}</div>
</div>
- <div class="wall-item-content" id="wall-item-content-$item.id" >
- <div class="wall-item-title" id="wall-item-title-$item.id">$item.title</div>
+ <div class="wall-item-content" id="wall-item-content-{{$item.id}}" >
+ <div class="wall-item-title" id="wall-item-title-{{$item.id}}">{{$item.title}}</div>
<div class="wall-item-title-end"></div>
- <div class="wall-item-body" id="wall-item-body-$item.id" >$item.body
+ <div class="wall-item-body" id="wall-item-body-{{$item.id}}" >{{$item.body}}
<div class="body-tag">
- {{ for $item.tags as $tag }}
- <span class='tag'>$tag</span>
- {{ endfor }}
+ {{foreach $item.tags as $tag}}
+ <span class='tag'>{{$tag}}</span>
+ {{/foreach}}
</div>
- {{ if $item.has_cats }}
- <div class="categorytags"><span>$item.txt_cats {{ for $item.categories as $cat }}$cat.name <a href="$cat.removeurl" title="$remove">[$remove]</a> {{ if $cat.last }}{{ else }}, {{ endif }}{{ endfor }}
+ {{if $item.has_cats}}
+ <div class="categorytags"><span>{{$item.txt_cats}} {{foreach $item.categories as $cat}}{{$cat.name}} <a href="{{$cat.removeurl}}" title="{{$remove}}">[{{$remove}}]</a> {{if $cat.last}}{{else}}, {{/if}}{{/foreach}}
</div>
- {{ endif }}
+ {{/if}}
- {{ if $item.has_folders }}
- <div class="filesavetags"><span>$item.txt_folders {{ for $item.folders as $cat }}$cat.name <a href="$cat.removeurl" title="$remove">[$remove]</a> {{ if $cat.last }}{{ else }}, {{ endif }}{{ endfor }}
+ {{if $item.has_folders}}
+ <div class="filesavetags"><span>{{$item.txt_folders}} {{foreach $item.folders as $cat}}{{$cat.name}} <a href="{{$cat.removeurl}}" title="{{$remove}}">[{{$remove}}]</a> {{if $cat.last}}{{else}}, {{/if}}{{/foreach}}
</div>
- {{ endif }}
+ {{/if}}
</div>
</div>
- <div class="wall-item-tools" id="wall-item-tools-$item.id">
- {{ if $item.like }}
- <a href="#" class="icon like item-tool" title="$item.like.0" onclick="dolike($item.id,'like'); return false"></a>
- {{ endif }}
- {{ if $item.dislike }}
- <a href="#" class="icon dislike item-tool" title="$item.dislike.0" onclick="dolike($item.id,'dislike'); return false"></a>
- {{ endif }}
- {{ if $item.share }}
- <a href="#" class="icon recycle item-tool" title="$item.share.0" onclick="jotShare($item.id); return false"></a>
- {{ endif }}
- {{ if $item.plink }}
- <a href="$item.plink.href" title="$item.plink.title" target="external-link" class="icon item-tool remote-link$item.sparkle"></a>
- {{ endif }}
- {{ if $item.edpost }}
- <a class="editpost icon pencil item-tool" href="$item.edpost.0" title="$item.edpost.1"></a>
- {{ endif }}
- {{ if $item.star }}
- <a href="#" id="starred-$item.id" onclick="dostar($item.id); return false;" class="star-item icon item-tool $item.star.isstarred" title="$item.star.toggle"></a>
- {{ endif }}
- {{ if $item.tagger }}
- <a href="#" id="tagger-$item.id" onclick="itemTag($item.id); return false;" class="tag-item icon item-tool tagged" title="$item.tagger.tagit"></a>
- {{ endif }}
- {{ if $item.filer }}
- <a href="#" id="filer-$item.id" onclick="itemFiler($item.id); return false;" class="filer-item filer-icon item-tool" title="$item.filer"></a>
- {{ endif }}
- <img id="like-rotator-$item.id" class="like-rotator" src="images/rotator.gif" alt="$item.wait" title="$item.wait" style="display: none;" />
+ <div class="wall-item-tools" id="wall-item-tools-{{$item.id}}">
+ {{if $item.like}}
+ <i class="icon-thumbs-up-alt item-tool" title="{{$item.like.0}}" onclick="dolike({{$item.id}},'like'); return false"></i>
+ {{/if}}
+ {{if $item.dislike}}
+ <i class="icon-thumbs-down-alt item-tool" title="{{$item.dislike.0}}" onclick="dolike({{$item.id}},'dislike'); return false"></i>
+ {{/if}}
+ {{if $item.share}}
+ <i class="icon-retweet item-tool" title="{{$item.share.0}}" onclick="jotShare({{$item.id}}); return false"></i>
+ {{/if}}
+ {{if $item.plink}}
+ <a href="{{$item.plink.href}}" title="{{$item.plink.title}}" ><i class="icon-external-link item-tool"></i></a>
+ {{/if}}
+ {{if $item.edpost}}
+ <a href="{{$item.edpost.0}}" title="{{$item.edpost.1}}"><i class="editpost icon-pencil item-tool"></i></a>
+ {{/if}}
+ {{if $item.star}}
+ <i id="starred-{{$item.id}}" onclick="dostar({{$item.id}}); return false;" class="star-item item-tool {{$item.star.isstarred}}" title="{{$item.star.toggle}}"></i>
+ {{/if}}
+ {{if $item.tagger}}
+ <i id="tagger-{{$item.id}}" onclick="itemTag({{$item.id}}); return false;" class="tag-item icon-tag item-tool" title="{{$item.tagger.tagit}}"></i>
+ {{/if}}
+ {{if $item.filer}}
+ <i id="filer-{{$item.id}}" onclick="itemFiler({{$item.id}}); return false;" class="filer-item icon-folder-open item-tool" title="{{$item.filer}}"></i>
+ {{/if}}
+ <div id="like-rotator-{{$item.id}}" class="like-rotator"></div>
- <div class="wall-item-delete-wrapper" id="wall-item-delete-wrapper-$item.id" >
- {{ if $item.drop.dropping }}<a href="item/drop/$item.id" onclick="return confirmDelete();" class="icon drophide" title="$item.drop.delete" onmouseover="imgbright(this);" onmouseout="imgdull(this);" ></a>{{ endif }}
+ <div class="wall-item-delete-wrapper" id="wall-item-delete-wrapper-{{$item.id}}" >
+ {{if $item.drop.dropping}}<a href="item/drop/{{$item.id}}" onclick="return confirmDelete();" title="{{$item.drop.delete}}" ><i class="icon-remove drop-icons item-tool"></i></a>{{/if}}
</div>
- {{ if $item.drop.pagedrop }}<input type="checkbox" onclick="checkboxhighlight(this);" title="$item.drop.select" class="item-select" name="itemselected[]" value="$item.id" />{{ endif }}
+ {{if $item.drop.pagedrop}}<input type="checkbox" onclick="checkboxhighlight(this);" title="{{$item.drop.select}}" class="item-select" name="itemselected[]" value="{{$item.id}}" />{{/if}}
<div class="wall-item-delete-end"></div>
+ <div class="wall-item-like {{$item.indent}}" id="wall-item-like-{{$item.id}}">{{$item.showlike}}</div>
+ <div class="wall-item-dislike {{$item.indent}}" id="wall-item-dislike-{{$item.id}}">{{$item.showdislike}}</div>
+
</div>
</div>
+
<div class="wall-item-wrapper-end"></div>
- <div class="wall-item-like $item.indent" id="wall-item-like-$item.id">$item.showlike</div>
- <div class="wall-item-dislike $item.indent" id="wall-item-dislike-$item.id">$item.showdislike</div>
-<div class="wall-item-outside-wrapper-end $item.indent" ></div>
+<div class="wall-item-outside-wrapper-end {{$item.indent}}" ></div>
</div>
-{{ if $item.toplevel }}
-{{ for $item.children as $child }}
- {{ inc $child.template with $item=$child }}{{ endinc }}
-{{ endfor }}
-{{ endif }}
+{{if $item.toplevel}}
+{{foreach $item.children as $child}}
+ {{include file="{{$child.template}}" item=$child}}
+{{/foreach}}
+{{/if}}
<div class="wall-item-comment-wrapper" >
- $item.comment
+ {{$item.comment}}
</div>
</div>
-{{if $item.comment_lastcollapsed}}</div>{{endif}}
+{{if $item.comment_lastcollapsed}}</div>{{/if}}
diff --git a/view/tpl/conversation.tpl b/view/tpl/conversation.tpl
index 70cd389c9..97d64327a 100644..100755
--- a/view/tpl/conversation.tpl
+++ b/view/tpl/conversation.tpl
@@ -1,28 +1,20 @@
<div id="threads-begin"></div>
-{{ for $threads as $thread }}
-<div id="thread-wrapper-$thread.id" class="thread-wrapper">
- {{ for $thread.items as $item }}
+{{foreach $threads as $thread}}
+<div id="thread-wrapper-{{$thread.id}}" class="thread-wrapper">
+ {{foreach $thread.items as $item}}
{{if $item.comment_firstcollapsed}}
<div class="hide-comments-outer">
- <span id="hide-comments-total-$thread.id" class="hide-comments-total">$thread.num_comments</span> <span id="hide-comments-$thread.id" class="hide-comments fakelink" onclick="showHideComments($thread.id);">$thread.hide_text</span>
+ <span id="hide-comments-total-{{$thread.id}}" class="hide-comments-total">{{$thread.num_comments}}</span> <span id="hide-comments-{{$thread.id}}" class="hide-comments fakelink" onclick="showHideComments({{$thread.id}});">{{$thread.hide_text}}</span>
</div>
- <div id="collapsed-comments-$thread.id" class="collapsed-comments" style="display: none;">
- {{endif}}
- {{if $item.comment_lastcollapsed}}</div>{{endif}}
+ <div id="collapsed-comments-{{$thread.id}}" class="collapsed-comments" style="display: none;">
+ {{/if}}
+ {{if $item.comment_lastcollapsed}}</div>{{/if}}
- {{ inc $item.template }}{{ endinc }}
+ {{include file="{{$item.template}}"}}
- {{ endfor }}
+ {{/foreach}}
</div>
-{{ endfor }}
+{{/foreach}}
<div id="threads-end"></div>
<div id="conversation-end"></div>
-
-{{ if $dropping }}
-<div id="item-delete-selected" class="fakelink" onclick="deleteCheckedItems();">
- <div id="item-delete-selected-icon" class="icon drophide" title="$dropping" onmouseover="imgbright(this);" onmouseout="imgdull(this);" ></div>
- <div id="item-delete-selected-desc" >$dropping</div>
-</div>
-<div id="item-delete-selected-end"></div>
-{{ endif }}
diff --git a/view/tpl/convobj.tpl b/view/tpl/convobj.tpl
index a35e232e2..d5cee1170 100644..100755
--- a/view/tpl/convobj.tpl
+++ b/view/tpl/convobj.tpl
@@ -1,4 +1,4 @@
-{{ for $threads as $item }}
-{{ inc $item.template }}{{ endinc }}
-{{ endfor }}
+{{foreach $threads as $item}}
+{{include file="{{$item.template}}"}}
+{{/foreach}}
diff --git a/view/tpl/crepair.tpl b/view/tpl/crepair.tpl
index a3e532b61..1a5a019db 100644..100755
--- a/view/tpl/crepair.tpl
+++ b/view/tpl/crepair.tpl
@@ -1,45 +1,44 @@
+<form id="crepair-form" action="crepair/{{$contact_id}}" method="post" >
-<form id="crepair-form" action="crepair/$contact_id" method="post" >
+<h4>{{$contact_name}}</h4>
-<h4>$contact_name</h4>
-
-<label id="crepair-name-label" class="crepair-label" for="crepair-name">$label_name</label>
-<input type="text" id="crepair-name" class="crepair-input" name="name" value="$contact_name" />
+<label id="crepair-name-label" class="crepair-label" for="crepair-name">{{$label_name}}</label>
+<input type="text" id="crepair-name" class="crepair-input" name="name" value="{{$contact_name}}" />
<div class="clear"></div>
-<label id="crepair-nick-label" class="crepair-label" for="crepair-nick">$label_nick</label>
-<input type="text" id="crepair-nick" class="crepair-input" name="nick" value="$contact_nick" />
+<label id="crepair-nick-label" class="crepair-label" for="crepair-nick">{{$label_nick}}</label>
+<input type="text" id="crepair-nick" class="crepair-input" name="nick" value="{{$contact_nick}}" />
<div class="clear"></div>
-<label id="crepair-attag-label" class="crepair-label" for="crepair-attag">$label_attag</label>
-<input type="text" id="crepair-attag" class="crepair-input" name="attag" value="$contact_attag" />
+<label id="crepair-attag-label" class="crepair-label" for="crepair-attag">{{$label_attag}}</label>
+<input type="text" id="crepair-attag" class="crepair-input" name="attag" value="{{$contact_attag}}" />
<div class="clear"></div>
-<label id="crepair-url-label" class="crepair-label" for="crepair-url">$label_url</label>
-<input type="text" id="crepair-url" class="crepair-input" name="url" value="$contact_url" />
+<label id="crepair-url-label" class="crepair-label" for="crepair-url">{{$label_url}}</label>
+<input type="text" id="crepair-url" class="crepair-input" name="url" value="{{$contact_url}}" />
<div class="clear"></div>
-<label id="crepair-request-label" class="crepair-label" for="crepair-request">$label_request</label>
-<input type="text" id="crepair-request" class="crepair-input" name="request" value="$request" />
+<label id="crepair-request-label" class="crepair-label" for="crepair-request">{{$label_request}}</label>
+<input type="text" id="crepair-request" class="crepair-input" name="request" value="{{$request}}" />
<div class="clear"></div>
-<label id="crepair-confirm-label" class="crepair-label" for="crepair-confirm">$label_confirm</label>
-<input type="text" id="crepair-confirm" class="crepair-input" name="confirm" value="$confirm" />
+<label id="crepair-confirm-label" class="crepair-label" for="crepair-confirm">{{$label_confirm}}</label>
+<input type="text" id="crepair-confirm" class="crepair-input" name="confirm" value="{{$confirm}}" />
<div class="clear"></div>
-<label id="crepair-notify-label" class="crepair-label" for="crepair-notify">$label_notify</label>
-<input type="text" id="crepair-notify" class="crepair-input" name="notify" value="$notify" />
+<label id="crepair-notify-label" class="crepair-label" for="crepair-notify">{{$label_notify}}</label>
+<input type="text" id="crepair-notify" class="crepair-input" name="notify" value="{{$notify}}" />
<div class="clear"></div>
-<label id="crepair-poll-label" class="crepair-label" for="crepair-poll">$label_poll</label>
-<input type="text" id="crepair-poll" class="crepair-input" name="poll" value="$poll" />
+<label id="crepair-poll-label" class="crepair-label" for="crepair-poll">{{$label_poll}}</label>
+<input type="text" id="crepair-poll" class="crepair-input" name="poll" value="{{$poll}}" />
<div class="clear"></div>
-<label id="crepair-photo-label" class="crepair-label" for="crepair-photo">$label_photo</label>
+<label id="crepair-photo-label" class="crepair-label" for="crepair-photo">{{$label_photo}}</label>
<input type="text" id="crepair-photo" class="crepair-input" name="photo" value="" />
<div class="clear"></div>
-<input type="submit" name="submit" value="$lbl_submit" />
+<input type="submit" name="submit" value="{{$lbl_submit}}" />
</form>
diff --git a/view/tpl/cropbody.tpl b/view/tpl/cropbody.tpl
index 4c0ca3d63..da5b1e859 100644..100755
--- a/view/tpl/cropbody.tpl
+++ b/view/tpl/cropbody.tpl
@@ -1,9 +1,9 @@
-<h1>$title</h1>
+<h1>{{$title}}</h1>
<p id="cropimage-desc">
-$desc
+{{$desc}}
</p>
<div id="cropimage-wrapper">
-<img src="$image_url" id="croppa" class="imgCrop" alt="$title" />
+<img src="{{$image_url}}" id="croppa" class="imgCrop" alt="{{$title}}" />
</div>
<div id="cropimage-preview-wrapper" >
<div id="previewWrap" ></div>
@@ -39,10 +39,10 @@ $desc
</script>
-<form action="profile_photo/$resource" id="crop-image-form" method="post" />
-<input type='hidden' name='form_security_token' value='$form_security_token'>
+<form action="profile_photo/{{$resource}}" id="crop-image-form" method="post" />
+<input type='hidden' name='form_security_token' value='{{$form_security_token}}'>
-<input type='hidden' name='profile' value='$profile'>
+<input type='hidden' name='profile' value='{{$profile}}'>
<input type="hidden" name="cropfinal" value="1" />
<input type="hidden" name="xstart" id="x1" />
<input type="hidden" name="ystart" id="y1" />
@@ -52,7 +52,7 @@ $desc
<input type="hidden" name="width" id="width" />
<div id="crop-image-submit-wrapper" >
-<input type="submit" name="submit" value="$done" />
+<input type="submit" name="submit" value="{{$done}}" />
</div>
</form>
diff --git a/view/tpl/crophead.tpl b/view/tpl/crophead.tpl
index 48f375426..48f375426 100644..100755
--- a/view/tpl/crophead.tpl
+++ b/view/tpl/crophead.tpl
diff --git a/view/tpl/delegate.tpl b/view/tpl/delegate.tpl
index 9a7d2e18d..cbaa8da86 100644..100755
--- a/view/tpl/delegate.tpl
+++ b/view/tpl/delegate.tpl
@@ -1,57 +1,57 @@
-<h3>$header</h3>
+<h3>{{$header}}</h3>
-<div id="delegate-desc" class="delegate-desc">$desc</div>
+<div id="delegate-desc" class="delegate-desc">{{$desc}}</div>
-{{ if $managers }}
-<h3>$head_managers</h3>
+{{if $managers}}
+<h3>{{$head_managers}}</h3>
-{{ for $managers as $x }}
+{{foreach $managers as $x}}
<div class="contact-block-div">
<a class="contact-block-link" href="#" >
-<img class="contact-block-img" src="$base/photo/thumb/$x.uid" title="$x.username ($x.nickname)" />
+<img class="contact-block-img" src="{{$base}}/photo/thumb/{{$x.uid}}" title="{{$x.username}} ({{$x.nickname}})" />
</a>
</div>
-{{ endfor }}
+{{/foreach}}
<div class="clear"></div>
<hr />
-{{ endif }}
+{{/if}}
-<h3>$head_delegates</h3>
+<h3>{{$head_delegates}}</h3>
-{{ if $delegates }}
-{{ for $delegates as $x }}
+{{if $delegates}}
+{{foreach $delegates as $x}}
<div class="contact-block-div">
-<a class="contact-block-link" href="$base/delegate/remove/$x.uid" >
-<img class="contact-block-img" src="$base/photo/thumb/$x.uid" title="$x.username ($x.nickname)" />
+<a class="contact-block-link" href="{{$base}}/delegate/remove/{{$x.uid}}" >
+<img class="contact-block-img" src="{{$base}}/photo/thumb/{{$x.uid}}" title="{{$x.username}} ({{$x.nickname}})" />
</a>
</div>
-{{ endfor }}
+{{/foreach}}
<div class="clear"></div>
-{{ else }}
-$none
-{{ endif }}
+{{else}}
+{{$none}}
+{{/if}}
<hr />
-<h3>$head_potentials</h3>
-{{ if $potentials }}
-{{ for $potentials as $x }}
+<h3>{{$head_potentials}}</h3>
+{{if $potentials}}
+{{foreach $potentials as $x}}
<div class="contact-block-div">
-<a class="contact-block-link" href="$base/delegate/add/$x.uid" >
-<img class="contact-block-img" src="$base/photo/thumb/$x.uid" title="$x.username ($x.nickname)" />
+<a class="contact-block-link" href="{{$base}}/delegate/add/{{$x.uid}}" >
+<img class="contact-block-img" src="{{$base}}/photo/thumb/{{$x.uid}}" title="{{$x.username}} ({{$x.nickname}})" />
</a>
</div>
-{{ endfor }}
+{{/foreach}}
<div class="clear"></div>
-{{ else }}
-$none
-{{ endif }}
+{{else}}
+{{$none}}
+{{/if}}
<hr />
diff --git a/view/tpl/design_tools.tpl b/view/tpl/design_tools.tpl
new file mode 100644
index 000000000..80a538231
--- /dev/null
+++ b/view/tpl/design_tools.tpl
@@ -0,0 +1,9 @@
+<div id="design-tools" class="widget design-tools">
+<h3>{{$title}}</h3>
+<ul>
+<li><a href="blocks/{{$who}}">{{$blocks}}</a></li>
+<li><a href="menu">{{$menus}}</a></li>
+<li><a href="layouts/{{$who}}">{{$layout}}</a></li>
+<li><a href="webpages/{{$who}}">{{$pages}}</a></li>
+</ul>
+</div>
diff --git a/view/tpl/dfrn_req_confirm.tpl b/view/tpl/dfrn_req_confirm.tpl
deleted file mode 100644
index 6c916323c..000000000
--- a/view/tpl/dfrn_req_confirm.tpl
+++ /dev/null
@@ -1,21 +0,0 @@
-
-<p id="dfrn-request-homecoming" >
-$welcome
-<br />
-$please
-
-</p>
-<form id="dfrn-request-homecoming-form" action="dfrn_request/$nickname" method="post">
-<input type="hidden" name="dfrn_url" value="$dfrn_url" />
-<input type="hidden" name="confirm_key" value="$confirm_key" />
-<input type="hidden" name="localconfirm" value="1" />
-$aes_allow
-
-<label id="dfrn-request-homecoming-hide-label" for="dfrn-request-homecoming-hide">$hidethem</label>
-<input type="checkbox" name="hidden-contact" value="1" {{ if $hidechecked }}checked="checked" {{ endif }} />
-
-
-<div id="dfrn-request-homecoming-submit-wrapper" >
-<input id="dfrn-request-homecoming-submit" type="submit" name="submit" value="$submit" />
-</div>
-</form> \ No newline at end of file
diff --git a/view/tpl/dfrn_request.tpl b/view/tpl/dfrn_request.tpl
deleted file mode 100644
index 4f8a87ea2..000000000
--- a/view/tpl/dfrn_request.tpl
+++ /dev/null
@@ -1,59 +0,0 @@
-
-<h1>$header</h1>
-
-<p id="dfrn-request-intro">
-$page_desc<br />
-$invite_desc
-</p>
-<p>
-$desc
-</p>
-
-<form action="dfrn_request/$nickname" method="post" />
-
-<div id="dfrn-request-url-wrapper" >
- <label id="dfrn-url-label" for="dfrn-url" >$your_address</label>
- <input type="text" name="dfrn_url" id="dfrn-url" size="32" value="$myaddr" />
- <div id="dfrn-request-url-end"></div>
-</div>
-
-<p id="dfrn-request-options">
-$pls_answer
-</p>
-
-<div id="dfrn-request-info-wrapper" >
-
-
-<p id="doiknowyou">
-$does_know
-</p>
-
- <div id="dfrn-request-know-yes-wrapper">
- <label id="dfrn-request-knowyou-yes-label" for="dfrn-request-knowyouyes">$yes</label>
- <input type="radio" name="knowyou" id="knowyouyes" value="1" />
-
- <div id="dfrn-request-knowyou-break" ></div>
- </div>
- <div id="dfrn-request-know-no-wrapper">
- <label id="dfrn-request-knowyou-no-label" for="dfrn-request-knowyouno">$no</label>
- <input type="radio" name="knowyou" id="knowyouno" value="0" checked="checked" />
-
- <div id="dfrn-request-knowyou-end"></div>
- </div>
-
-
-<p id="dfrn-request-message-desc">
-$add_note
-</p>
- <div id="dfrn-request-message-wrapper">
- <textarea name="dfrn-request-message" rows="4" cols="64" ></textarea>
- </div>
-
-
-</div>
-
- <div id="dfrn-request-submit-wrapper">
- <input type="submit" name="submit" id="dfrn-request-submit-button" value="$submit" />
- <input type="submit" name="cancel" id="dfrn-request-cancel-button" value="$cancel" />
- </div>
-</form>
diff --git a/view/tpl/diasp_dec_hdr.tpl b/view/tpl/diasp_dec_hdr.tpl
deleted file mode 100644
index e87c61888..000000000
--- a/view/tpl/diasp_dec_hdr.tpl
+++ /dev/null
@@ -1,8 +0,0 @@
-<decrypted_hdeader>
- <iv>$inner_iv</iv>
- <aes_key>$inner_key</aes_key>
- <author>
- <name>$author_name</name>
- <uri>$author_uri</uri>
- </author>
-</decrypted_header>
diff --git a/view/tpl/dir_sort_links.tpl b/view/tpl/dir_sort_links.tpl
new file mode 100644
index 000000000..d78aec1f5
--- /dev/null
+++ b/view/tpl/dir_sort_links.tpl
@@ -0,0 +1,6 @@
+<div class="widget" id="dir_sort_links">
+<h3>{{$header}}</h3>
+<a href="directory?f=&order=normal">{{$normal}}</a><br />
+<a href="directory?f=&order=reverse">{{$reverse}}</a><br />
+<a href="directory?f=&order=date">{{$date}}</a><br />
+</div>
diff --git a/view/tpl/directory_header.tpl b/view/tpl/directory_header.tpl
index e1def851b..5d703e2dd 100644..100755
--- a/view/tpl/directory_header.tpl
+++ b/view/tpl/directory_header.tpl
@@ -1,14 +1,14 @@
-<h1>$dirlbl</h1>
+<h1>{{$dirlbl}}</h1>
-{{ if $search }}
-<h4>$finddsc $safetxt</h4>
-{{ endif }}
+{{if $search}}
+<h4>{{$finddsc}} {{$safetxt}}</h4>
+{{/if}}
-{{for $entries as $entry}}
+{{foreach $entries as $entry}}
-{{ inc direntry.tpl }}{{ endinc }}
+{{include file="direntry.tpl"}}
-{{ endfor }}
+{{/foreach}}
diff --git a/view/tpl/directory_item.tpl b/view/tpl/directory_item.tpl
deleted file mode 100644
index d496cb2ad..000000000
--- a/view/tpl/directory_item.tpl
+++ /dev/null
@@ -1,11 +0,0 @@
-
-<div class="directory-item lframe" id="directory-item-$id" >
- <div class="contact-photo-wrapper" id="directory-photo-wrapper-$id" >
- <div class="contact-photo" id="directory-photo-$id" >
- <a href="$profile_link" class="directory-profile-link" id="directory-profile-link-$id" ><img class="directory-photo-img" src="$photo" alt="$alt_text" title="$alt_text" /></a>
- </div>
- </div>
-
- <div class="contact-name" id="directory-name-$id">$name</div>
- <div class="contact-details">$details</div>
-</div>
diff --git a/view/tpl/direntry.tpl b/view/tpl/direntry.tpl
index e860da41c..e40504c8f 100644..100755
--- a/view/tpl/direntry.tpl
+++ b/view/tpl/direntry.tpl
@@ -1,11 +1,16 @@
+<div class="directory-item lframe" id="directory-item-{{$entry.id}}" >
+<div class="generic-content-wrapper">
-<div class="directory-item lframe" id="directory-item-$entry.id" >
- <div class="contact-photo-wrapper" id="directory-photo-wrapper-$entry.id" >
- <div class="contact-photo" id="directory-photo-$entry.id" >
- <a href="$entry.profile_link" class="directory-profile-link" id="directory-profile-link-$entry.id" ><img class="directory-photo-img" src="$entry.photo" alt="$entry.alttext" title="$entry.alttext" /></a>
- </div>
- </div>
+<div class="contact-photo-wrapper" id="directory-photo-wrapper-{{$entry.id}}" >
+<div class="contact-photo" id="directory-photo-{{$entry.id}}" >
+<a href="{{$entry.profile_link}}" class="directory-profile-link" id="directory-profile-link-{{$entry.id}}" ><img class="directory-photo-img" src="{{$entry.photo}}" alt="{{$entry.alttext}}" title="{{$entry.alttext}}" /></a>
+</div>
+</div>
- <div class="contact-name" id="directory-name-$entry.id">$entry.name</div>
- <div class="contact-details">$entry.details</div>
+<div class="contact-name" id="directory-name-{{$entry.id}}" ><span onclick="dirdetails('{{$entry.hash}}');" class="fakelink" >{{$entry.name}}</span></div>
+{{if $entry.connect}}
+<div class="directory-connect"><a href="{{$entry.connect}}">{{$entry.conn_label}}</a></div>
+{{/if}}
+<div class="contact-details">{{$entry.details}}</div>
+</div>
</div>
diff --git a/view/tpl/direntry_large.tpl b/view/tpl/direntry_large.tpl
new file mode 100755
index 000000000..befd2a27a
--- /dev/null
+++ b/view/tpl/direntry_large.tpl
@@ -0,0 +1,39 @@
+<div class="directory-popup-item lframe" id="directory-item-{{$id}}" >
+<div class="generic-content-wrapper">
+
+<div class="contact-photo-wrapper" id="directory-photo-wrapper-{{$id}}" >
+ <div class="contact-photo dirpopup" id="directory-photo-{{$id}}" >
+ <a href="{{$profile_link}}" class="directory-profile-link" id="directory-profile-link-{{$id}}" ><img class="directory-photo-img" style="height:175px; width:175px;" src="{{$photo}}" alt="{{$alttext}}" title="{{$alttext}}" /></a>
+ </div>
+ <div class="contact-photo dirpopup" id="directory-qr-{{$id}}" >
+ <img class="directory-photo-img" style="height:175px; width:175px;" src="photo/qr?f=&qr={{$qrlink}}" alt="QR" title="{{$qrlink}}" />
+ </div>
+</div>
+
+<div class="clear"></div>
+
+<div class="contact-name" id="directory-name-{{$id}}" >{{$name}}</div>
+{{if $connect}}
+<div class="directory-connect"><a href="{{$connect}}">{{$conn_label}}</a></div>
+{{/if}}
+<div class="contact-details">{{$details}}</div>
+{{if $marital}}
+<div class="directory-marital">{{$marital}} </div>
+{{/if}}
+{{if $sexual}}
+<div class="directory-sexual">{{$sexual}} </div>
+{{/if}}
+{{if $homepage}}
+<div class="directory-homepage">{{$homepage}} </div>
+{{/if}}
+{{if $hometown}}
+<div class="directory-hometown">{{$hometown}} </div>
+{{/if}}
+{{if $about}}
+<div class="directory-about">{{$about}} </div>
+{{/if}}
+{{if $kw}}
+<div class="directory-keywords">{{$kw}} {{$keywords}}</div>
+{{/if}}
+</div>
+</div>
diff --git a/view/tpl/display-head.tpl b/view/tpl/display-head.tpl
index 3d4e7e96a..3d4e7e96a 100644..100755
--- a/view/tpl/display-head.tpl
+++ b/view/tpl/display-head.tpl
diff --git a/view/tpl/edpage_head.tpl b/view/tpl/edpage_head.tpl
new file mode 100755
index 000000000..890b746bf
--- /dev/null
+++ b/view/tpl/edpage_head.tpl
@@ -0,0 +1 @@
+<h2>{{$title}}</h2>
diff --git a/view/tpl/edpost_head.tpl b/view/tpl/edpost_head.tpl
index b83e606a0..890b746bf 100644..100755
--- a/view/tpl/edpost_head.tpl
+++ b/view/tpl/edpost_head.tpl
@@ -1 +1 @@
-<h2>$title</h2>
+<h2>{{$title}}</h2>
diff --git a/view/tpl/email_notify_html.tpl b/view/tpl/email_notify_html.tpl
index 3e1a814c5..cf149341e 100644..100755
--- a/view/tpl/email_notify_html.tpl
+++ b/view/tpl/email_notify_html.tpl
@@ -1,26 +1,26 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional //EN">
<html>
<head>
- <title>$banner</title>
+ <title>{{$banner}}</title>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
</head>
<body>
-<table style="border:1px solid #ccc">
+<table style="border:1px solid #ccc; background-color: #FFFFFF; color: #000000;">
<tbody>
- <tr><td colspan="2" style="background:#ff0000; color:#FFFFFF; font-weight:bold; font-family:'lucida grande', tahoma, verdana,arial, sans-serif; padding: 4px 8px; vertical-align: middle; font-size:16px; letter-spacing: -0.03em; text-align: left;"><img style="width:32px;height:32px; float:left;" src='$siteurl/images/fred-32.png'><div style="padding:7px; margin-left: 5px; float:left; font-size:18px;letter-spacing:1px;">$product</div><div style="clear: both;"></div></td></tr>
+ <tr><td colspan="2" style="background:#c60032; color:#FFFFFF; font-weight:bold; font-family:'lucida grande', tahoma, verdana,arial, sans-serif; padding: 4px 8px; vertical-align: middle; font-size:16px; letter-spacing: -0.03em; text-align: left;"><img style="width:32px;height:32px; float:left;" src='{{$siteurl}}/images/rm-32.png'><div style="padding:7px; margin-left: 5px; float:left; font-size:18px;letter-spacing:1px;">{{$product}}</div><div style="clear: both;"></div></td></tr>
- <tr><td style="padding-top:22px;" colspan="2">$preamble</td></tr>
+ <tr><td style="padding-top:22px;" colspan="2">{{$preamble}}</td></tr>
- <tr><td style="padding-left:22px;padding-top:22px;width:60px;" valign="top" rowspan=3><a href="$source_link"><img style="border:0px;width:48px;height:48px;" src="$source_photo"></a></td>
- <td style="padding-top:22px;"><a href="$source_link">$source_name</a></td></tr>
- <tr><td style="font-weight:bold;padding-bottom:5px;">$title</td></tr>
- <tr><td style="padding-right:22px;">$htmlversion</td></tr>
- <tr><td style="padding-top:11px;" colspan="2">$hsitelink</td></tr>
- <tr><td style="padding-bottom:11px;" colspan="2">$hitemlink</td></tr>
- <tr><td></td><td>$thanks</td></tr>
- <tr><td></td><td>$site_admin</td></tr>
+ <tr><td style="padding-left:22px;padding-top:22px;width:60px;" valign="top" rowspan=3><a href="{{$source_link}}"><img style="border:0px;width:48px;height:48px;" src="{{$source_photo}}"></a></td>
+ <td style="padding-top:22px;"><a href="{{$source_link}}">{{$source_name}}</a></td></tr>
+ <tr><td style="font-weight:bold;padding-bottom:5px;">{{$title}}</td></tr>
+ <tr><td style="padding-right:22px;">{{$htmlversion}}</td></tr>
+ <tr><td style="padding-top:11px;" colspan="2">{{$hsitelink}}</td></tr>
+ <tr><td style="padding-bottom:11px;" colspan="2">{{$hitemlink}}</td></tr>
+ <tr><td></td><td>{{$thanks}}</td></tr>
+ <tr><td></td><td>{{$site_admin}}</td></tr>
</tbody>
</table>
</body>
diff --git a/view/tpl/email_notify_text.tpl b/view/tpl/email_notify_text.tpl
index 018bb6078..bdab4c273 100644..100755
--- a/view/tpl/email_notify_text.tpl
+++ b/view/tpl/email_notify_text.tpl
@@ -1,13 +1,12 @@
-
-$preamble
+{{$preamble}}
-$title
+{{$title}}
-$textversion
+{{$textversion}}
-$tsitelink
-$titemlink
+{{$tsitelink}}
+{{$titemlink}}
-$thanks
-$site_admin
+{{$thanks}}
+{{$site_admin}}
diff --git a/view/tpl/event.tpl b/view/tpl/event.tpl
index 80c1dfc55..e0977e262 100644..100755
--- a/view/tpl/event.tpl
+++ b/view/tpl/event.tpl
@@ -1,10 +1,10 @@
-{{ for $events as $event }}
+{{foreach $events as $event}}
<div class="event">
- {{ if $event.item.author-name }}<a href="$event.item.author-link" ><img src="$event.item.author-avatar" height="32" width="32" />$event.item.author-name</a>{{ endif }}
- $event.html
- {{ if $event.item.plink }}<a href="$event.plink.0" title="$event.plink.1" class="plink-event-link icon s22 remote-link"></a>{{ endif }}
- {{ if $event.edit }}<a href="$event.edit.0" title="$event.edit.1" class="edit-event-link icon s22 pencil"></a>{{ endif }}
+ {{if $event.item.author.xchan_name}}<a href="{{$event.item.author.xchan_url}}" ><img src="{{$event.item.author.xchan_photo_s}}" height="32" width="32" />{{$event.item.author.xchan_name}}</a>{{/if}}
+ {{$event.html}}
+ {{if $event.item.plink}}<a href="{{$event.plink.0}}" title="{{$event.plink.1}}" class="plink-event-link"><i class="icon-external-link" ></i></a>{{/if}}
+ {{if $event.edit}}<a href="{{$event.edit.0}}" title="{{$event.edit.1}}" class="edit-event-link"><i class="icon-pencil"></i></a>{{/if}}
</div>
<div class="clear"></div>
-{{ endfor }}
+{{/foreach}}
diff --git a/view/tpl/event_form.tpl b/view/tpl/event_form.tpl
index 536c52b0f..da4dda82e 100644..100755
--- a/view/tpl/event_form.tpl
+++ b/view/tpl/event_form.tpl
@@ -1,49 +1,49 @@
-<h3>$title</h3>
+<h3>{{$title}}</h3>
<p>
-$desc
+{{$desc}}
</p>
-<form action="$post" method="post" >
+<form action="{{$post}}" method="post" >
-<input type="hidden" name="event_id" value="$eid" />
-<input type="hidden" name="cid" value="$cid" />
-<input type="hidden" name="uri" value="$uri" />
+<input type="hidden" name="event_id" value="{{$eid}}" />
+<input type="hidden" name="xchan" value="{{$xchan}}" />
+<input type="hidden" name="mid" value="{{$mid}}" />
-<div id="event-start-text">$s_text</div>
-$s_dsel $s_tsel
+<div id="event-start-text">{{$s_text}}</div>
+{{$s_dsel}} {{$s_tsel}}
-<div id="event-finish-text">$f_text</div>
-$f_dsel $f_tsel
+<div id="event-finish-text">{{$f_text}}</div>
+{{$f_dsel}} {{$f_tsel}}
<div id="event-datetime-break"></div>
-<input type="checkbox" name="nofinish" value="1" id="event-nofinish-checkbox" $n_checked /> <div id="event-nofinish-text">$n_text</div>
+<input type="checkbox" name="nofinish" value="1" id="event-nofinish-checkbox" {{$n_checked}} /> <div id="event-nofinish-text">{{$n_text}}</div>
<div id="event-nofinish-break"></div>
-<input type="checkbox" name="adjust" value="1" id="event-adjust-checkbox" $a_checked /> <div id="event-adjust-text">$a_text</div>
+<input type="checkbox" name="adjust" value="1" id="event-adjust-checkbox" {{$a_checked}} /> <div id="event-adjust-text">{{$a_text}}</div>
<div id="event-adjust-break"></div>
-<div id="event-summary-text">$t_text</div>
-<input type="text" id="event-summary" name="summary" value="$t_orig" />
+<div id="event-summary-text">{{$t_text}}</div>
+<input type="text" id="event-summary" name="summary" value="{{$t_orig}}" />
-<div id="event-desc-text">$d_text</div>
-<textarea id="event-desc-textarea" name="desc">$d_orig</textarea>
+<div id="event-desc-text">{{$d_text}}</div>
+<textarea id="event-desc-textarea" name="desc">{{$d_orig}}</textarea>
-<div id="event-location-text">$l_text</div>
-<textarea id="event-location-textarea" name="location">$l_orig</textarea>
+<div id="event-location-text">{{$l_text}}</div>
+<textarea id="event-location-textarea" name="location">{{$l_orig}}</textarea>
-<input type="checkbox" name="share" value="1" id="event-share-checkbox" $sh_checked /> <div id="event-share-text">$sh_text</div>
+<input type="checkbox" name="share" value="1" id="event-share-checkbox" {{$sh_checked}} /> <div id="event-share-text">{{$sh_text}}</div>
<div id="event-share-break"></div>
-$acl
+{{$acl}}
<div class="clear"></div>
-<input id="event-submit" type="submit" name="submit" value="$submit" />
+<input id="event-submit" type="submit" name="submit" value="{{$submit}}" />
</form>
diff --git a/view/tpl/event_head.tpl b/view/tpl/event_head.tpl
index 471748b97..b55025f65 100644..100755
--- a/view/tpl/event_head.tpl
+++ b/view/tpl/event_head.tpl
@@ -1,11 +1,11 @@
-<link rel='stylesheet' type='text/css' href='$baseurl/library/fullcalendar/fullcalendar.css' />
+<link rel='stylesheet' type='text/css' href='{{$baseurl}}/library/fullcalendar/fullcalendar.css' />
<script language="javascript" type="text/javascript"
- src="$baseurl/library/fullcalendar/fullcalendar.min.js"></script>
+ src="{{$baseurl}}/library/fullcalendar/fullcalendar.min.js"></script>
<script>
function showEvent(eventid) {
$.get(
- '$baseurl/events/?id='+eventid,
+ '{{$baseurl}}/events/?id='+eventid,
function(data){
$.fancybox(data);
}
@@ -14,7 +14,7 @@
$(document).ready(function() {
$('#events-calendar').fullCalendar({
- events: '$baseurl/events/json/',
+ events: '{{$baseurl}}/events/json/',
header: {
left: 'prev,next today',
center: 'title',
@@ -27,21 +27,21 @@
eventRender: function(event, element, view) {
//console.log(view.name);
- if (event.item['author-name']==null) return;
+ if (event.item['author']['xchan_name']==null) return;
switch(view.name){
case "month":
element.find(".fc-event-title").html(
"<img src='{0}' style='height:10px;width:10px'>{1} : {2}".format(
- event.item['author-avatar'],
- event.item['author-name'],
+ event.item['author']['xchan_photo_s'],
+ event.item['author']['xchan_name'],
event.title
));
break;
case "agendaWeek":
element.find(".fc-event-title").html(
"<img src='{0}' style='height:12px; width:12px'>{1}<p>{2}</p><p>{3}</p>".format(
- event.item['author-avatar'],
- event.item['author-name'],
+ event.item['author']['xchan_photo_s'],
+ event.item['author']['xchan_name'],
event.item.desc,
event.item.location
));
@@ -49,8 +49,8 @@
case "agendaDay":
element.find(".fc-event-title").html(
"<img src='{0}' style='height:24px;width:24px'>{1}<p>{2}</p><p>{3}</p>".format(
- event.item['author-avatar'],
- event.item['author-name'],
+ event.item['author']['xchan_photo_s'],
+ event.item['author']['xchan_name'],
event.item.desc,
event.item.location
));
@@ -75,7 +75,7 @@
<script language="javascript" type="text/javascript"
- src="$baseurl/library/tinymce/jscripts/tiny_mce/tiny_mce_src.js"></script>
+ src="{{$baseurl}}/library/tinymce/jscripts/tiny_mce/tiny_mce_src.js"></script>
<script language="javascript" type="text/javascript">
@@ -97,7 +97,7 @@
force_p_newlines : false,
force_br_newlines : true,
forced_root_block : '',
- content_css: "$baseurl/view/custom_tinymce.css",
+ content_css: "{{$baseurl}}/view/custom_tinymce.css",
theme_advanced_path : false,
setup : function(ed) {
ed.onInit.add(function(ed) {
diff --git a/view/tpl/events-js.tpl b/view/tpl/events-js.tpl
index b0e182c56..c87d20529 100644..100755
--- a/view/tpl/events-js.tpl
+++ b/view/tpl/events-js.tpl
@@ -1,6 +1,6 @@
-$tabs
-<h2>$title</h2>
+{{$tabs}}
+<h2>{{$title}}</h2>
-<div id="new-event-link"><a href="$new_event.0" >$new_event.1</a></div>
+<div id="new-event-link"><a href="{{$new_event.0}}" >{{$new_event.1}}</a></div>
<div id="events-calendar"></div>
diff --git a/view/tpl/events.tpl b/view/tpl/events.tpl
deleted file mode 100644
index e0d830691..000000000
--- a/view/tpl/events.tpl
+++ /dev/null
@@ -1,24 +0,0 @@
-$tabs
-<h2>$title</h2>
-
-<div id="new-event-link"><a href="$new_event.0" >$new_event.1</a></div>
-
-<div id="event-calendar-wrapper">
- <a href="$previus.0" class="prevcal $previus.2"><div id="event-calendar-prev" class="icon s22 prev" title="$previus.1"></div></a>
- $calendar
- <a href="$next.0" class="nextcal $next.2"><div id="event-calendar-prev" class="icon s22 next" title="$next.1"></div></a>
-</div>
-<div class="event-calendar-end"></div>
-
-
-{{ for $events as $event }}
- <div class="event">
- {{ if $event.is_first }}<hr /><a name="link-$event.j" ><div class="event-list-date">$event.d</div></a>{{ endif }}
- {{ if $event.item.author-name }}<a href="$event.item.author-link" ><img src="$event.item.author-avatar" height="32" width="32" />$event.item.author-name</a>{{ endif }}
- $event.html
- {{ if $event.item.plink }}<a href="$event.plink.0" title="$event.plink.1" class="plink-event-link icon s22 remote-link"></a>{{ endif }}
- {{ if $event.edit }}<a href="$event.edit.0" title="$event.edit.1" class="edit-event-link icon s22 pencil"></a>{{ endif }}
- </div>
- <div class="clear"></div>
-
-{{ endfor }}
diff --git a/view/tpl/events_reminder.tpl b/view/tpl/events_reminder.tpl
index f641a5faf..fd6a1a5c7 100644..100755
--- a/view/tpl/events_reminder.tpl
+++ b/view/tpl/events_reminder.tpl
@@ -1,10 +1,10 @@
-{{ if $count }}
-<div id="event-notice" class="birthday-notice fakelink $classtoday" onclick="openClose('event-wrapper');">$event_reminders ($count)</div>
-<div id="event-wrapper" style="display: none;" ><div id="event-title">$event_title</div>
+{{if $count}}
+<div id="event-notice" class="birthday-notice fakelink {{$classtoday}}" onclick="openClose('event-wrapper');">{{$event_reminders}} ({{$count}})</div>
+<div id="event-wrapper" style="display: none;" ><div id="event-title">{{$event_title}}</div>
<div id="event-title-end"></div>
-{{ for $events as $event }}
-<div class="event-list" id="event-$event.id"></a> <a href="events/$event.link">$event.title</a> $event.date </div>
-{{ endfor }}
+{{foreach $events as $event}}
+<div class="event-list" id="event-{{$event.id}}"></a> <a href="events/{{$event.link}}">{{$event.title}}</a> {{$event.date}} </div>
+{{/foreach}}
</div>
-{{ endif }}
+{{/if}}
diff --git a/view/tpl/failed_updates.tpl b/view/tpl/failed_updates.tpl
index c6e4cb08e..68c0bcdf2 100644..100755
--- a/view/tpl/failed_updates.tpl
+++ b/view/tpl/failed_updates.tpl
@@ -1,17 +1,17 @@
-<h2>$banner</h2>
+<h2>{{$banner}}</h2>
-<div id="failed_updates_desc">$desc</div>
+<div id="failed_updates_desc">{{$desc}}</div>
-{{ if $failed }}
-{{ for $failed as $f }}
+{{if $failed}}
+{{foreach $failed as $f}}
-<h4>$f</h4>
+<h4>{{$f}}</h4>
<ul>
-<li><a href="$base/admin/dbsync/mark/$f">$mark</a></li>
-<li><a href="$base/admin/dbsync/$f">$apply</a></li>
+<li><a href="{{$base}}/admin/dbsync/mark/{{$f}}">{{$mark}}</a></li>
+<li><a href="{{$base}}/admin/dbsync/{{$f}}">{{$apply}}</a></li>
</ul>
<hr />
-{{ endfor }}
-{{ endif }}
+{{/foreach}}
+{{/if}}
diff --git a/view/tpl/fake_feed.tpl b/view/tpl/fake_feed.tpl
deleted file mode 100644
index c37071cf4..000000000
--- a/view/tpl/fake_feed.tpl
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<feed xmlns="http://www.w3.org/2005/Atom" >
-
- <id>fake feed</id>
- <title>fake title</title>
-
- <updated>1970-01-01T00:00:00Z</updated>
-
- <author>
- <name>Fake Name</name>
- <uri>http://example.com</uri>
- </author>
-
diff --git a/view/tpl/field.tpl b/view/tpl/field.tpl
index 35f5afd39..942cfcef5 100644..100755
--- a/view/tpl/field.tpl
+++ b/view/tpl/field.tpl
@@ -1,4 +1,3 @@
-
- {{ if $field.0==select }}
- {{ inc field_select.tpl }}{{ endinc }}
- {{ endif }}
+ {{if $field.0==select}}
+ {{include file="field_select.tpl"}}
+ {{/if}}
diff --git a/view/tpl/field_acheckbox.tpl b/view/tpl/field_acheckbox.tpl
index 06bed38e7..f5dda4cc0 100644..100755
--- a/view/tpl/field_acheckbox.tpl
+++ b/view/tpl/field_acheckbox.tpl
@@ -1,7 +1,6 @@
-
<div class='field acheckbox'>
- <label for='id_$field.0'>$field.1</label>
- <input type="checkbox" class="abook-edit-them" name='$field.0' id='them_id_$field.0' value="1" disabled="disabled" {{ if $field.2 }}checked="checked"{{ endif }} />
- <input type="checkbox" class="abook-edit-me" name='$field.0' id='me_id_$field.0' value="$field.4" {{ if $field.3 }}checked="checked"{{ endif }} {{ if $field.5 }} disabled="disabled" {{ endif }}/>
- <span class='field_abook_help'>$field.6</span>
+ <label for='id_{{$field.0}}'>{{$field.1}}</label>
+ <input type="checkbox" class="abook-edit-them" name='them_{{$field.0}}' id='them_id_{{$field.0}}' value="1" disabled="disabled" {{if $field.2}}checked="checked"{{/if}} />
+ <input type="checkbox" class="abook-edit-me" name='{{$field.0}}' id='me_id_{{$field.0}}' value="{{$field.4}}" {{if $field.3}}checked="checked"{{/if}} />{{if $field.5}} <span class="permission-inherited">{{$inherited}}</span> {{/if}}
+ <span class='field_abook_help'>{{$field.6}}</span>
</div>
diff --git a/view/tpl/field_checkbox.tpl b/view/tpl/field_checkbox.tpl
index afab29243..51d56f69c 100644..100755
--- a/view/tpl/field_checkbox.tpl
+++ b/view/tpl/field_checkbox.tpl
@@ -1,6 +1,5 @@
-
<div class='field checkbox'>
- <label for='id_$field.0'>$field.1</label>
- <input type="checkbox" name='$field.0' id='id_$field.0' value="1" {{ if $field.2 }}checked="checked"{{ endif }}>
- <span class='field_help'>$field.3</span>
+ <label for='id_{{$field.0}}'>{{$field.1}}</label>
+ <input type="checkbox" name='{{$field.0}}' id='id_{{$field.0}}' value="1" {{if $field.2}}checked="checked"{{/if}}>
+ <span class='field_help'>{{$field.3}}</span>
</div>
diff --git a/view/tpl/field_combobox.tpl b/view/tpl/field_combobox.tpl
index a4dc8e571..1f9218954 100644..100755
--- a/view/tpl/field_combobox.tpl
+++ b/view/tpl/field_combobox.tpl
@@ -1,18 +1,17 @@
-
<div class='field combobox'>
- <label for='id_$field.0' id='id_$field.0_label'>$field.1</label>
- {# html5 don't work on Chrome, Safari and IE9
- <input id="id_$field.0" type="text" list="data_$field.0" >
- <datalist id="data_$field.0" >
- {{ for $field.4 as $opt=>$val }}<option value="$val">{{ endfor }}
- </datalist> #}
+ <label for='id_{{$field.0}}' id='id_{{$field.0}}_label'>{{$field.1}}</label>
+ {{* html5 don't work on Chrome, Safari and IE9 see https://github.com/thgreasi/datalist-polyfill
+ <input id="id_{{$field.0}}" type="text" list="data_{{$field.0}}" >
+ <datalist id="data_{{$field.0}}" >
+ {{foreach $field.4 as $opt=>$val}}<option value="{{$val}}">{{/foreach}}
+ </datalist> *}}
- <input id="id_$field.0" type="text" value="$field.2">
- <select id="select_$field.0" onChange="$('#id_$field.0').val($(this).val())">
- <option value="">$field.5</option>
- {{ for $field.4 as $opt=>$val }}<option value="$val">$val</option>{{ endfor }}
+ <input id="id_{{$field.0}}" type="text" value="{{$field.2}}">
+ <select id="select_{{$field.0}}" onChange="$('#id_{{$field.0}}').val($(this).val())">
+ <option value="">{{$field.5}}</option>
+ {{foreach $field.4 as $opt=>$val}}<option value="{{$val}}">{{$val}}</option>{{/foreach}}
</select>
- <span class='field_help'>$field.3</span>
+ <span class='field_help'>{{$field.3}}</span>
</div>
diff --git a/view/tpl/field_custom.tpl b/view/tpl/field_custom.tpl
index be15d3f60..a6b49f6da 100644..100755
--- a/view/tpl/field_custom.tpl
+++ b/view/tpl/field_custom.tpl
@@ -1,6 +1,5 @@
-
<div class='field custom'>
- <label for='$field.0'>$field.1</label>
- $field.2
- <span class='field_help'>$field.3</span>
+ <label for='{{$field.0}}'>{{$field.1}}</label>
+ {{$field.2}}
+ <span class='field_help'>{{$field.3}}</span>
</div>
diff --git a/view/tpl/field_input.tpl b/view/tpl/field_input.tpl
index 09417deca..a584f95e7 100644..100755
--- a/view/tpl/field_input.tpl
+++ b/view/tpl/field_input.tpl
@@ -1,7 +1,6 @@
-
<div class='field input'>
- <label for='id_$field.0' id='label_$field.0'>$field.1</label>
- <input name='$field.0' id='id_$field.0' value="$field.2">
- <span id='help_$field.0' class='field_help'>$field.3</span>
- <div id='end_$field.0' class='field_end'></div>
+ <label for='id_{{$field.0}}' id='label_{{$field.0}}'>{{$field.1}}</label>
+ <input name='{{$field.0}}' id='id_{{$field.0}}' type="text" value="{{$field.2}}">{{if $field.4}} <span class="required">{{$field.4}}</span> {{/if}}
+ <span id='help_{{$field.0}}' class='field_help'>{{$field.3}}</span>
+ <div id='end_{{$field.0}}' class='field_end'></div>
</div>
diff --git a/view/tpl/field_intcheckbox.tpl b/view/tpl/field_intcheckbox.tpl
index 47a513a55..d9a8d7289 100644..100755
--- a/view/tpl/field_intcheckbox.tpl
+++ b/view/tpl/field_intcheckbox.tpl
@@ -1,6 +1,5 @@
-
<div class='field checkbox'>
- <label for='id_$field.0'>$field.1</label>
- <input type="checkbox" name='$field.0' id='id_$field.0' value="$field.3" {{ if $field.2 }}checked="true"{{ endif }}>
- <span class='field_help'>$field.4</span>
+ <label for='id_{{$field.0}}'>{{$field.1}}</label>
+ <input type="checkbox" name='{{$field.0}}' id='id_{{$field.0}}' value="{{$field.3}}" {{if $field.2}}checked="true"{{/if}}>
+ <span class='field_help'>{{$field.4}}</span>
</div>
diff --git a/view/tpl/field_openid.tpl b/view/tpl/field_openid.tpl
deleted file mode 100644
index acd93ff62..000000000
--- a/view/tpl/field_openid.tpl
+++ /dev/null
@@ -1,6 +0,0 @@
-
- <div class='field input openid'>
- <label for='id_$field.0'>$field.1</label>
- <input name='$field.0' id='id_$field.0' value="$field.2">
- <span class='field_help'>$field.3</span>
- </div>
diff --git a/view/tpl/field_password.tpl b/view/tpl/field_password.tpl
index e604b7f5d..23058f8a6 100644..100755
--- a/view/tpl/field_password.tpl
+++ b/view/tpl/field_password.tpl
@@ -1,6 +1,5 @@
-
<div class='field password'>
- <label for='id_$field.0'>$field.1</label>
- <input type='password' name='$field.0' id='id_$field.0' value="$field.2">
- <span class='field_help'>$field.3</span>
+ <label for='id_{{$field.0}}'>{{$field.1}}</label>
+ <input type='password' name='{{$field.0}}' id='id_{{$field.0}}' value="{{$field.2}}">
+ <span class='field_help'>{{$field.3}}</span>
</div>
diff --git a/view/tpl/field_radio.tpl b/view/tpl/field_radio.tpl
index a915e8eb3..147b6b834 100644..100755
--- a/view/tpl/field_radio.tpl
+++ b/view/tpl/field_radio.tpl
@@ -1,6 +1,5 @@
-
<div class='field radio'>
- <label for='id_$field.0_$field.2'>$field.1</label>
- <input type="radio" name='$field.0' id='id_$field.0_$field.2' value="$field.2" {{ if $field.4 }}checked="true"{{ endif }}>
- <span class='field_help'>$field.3</span>
+ <label for='id_{{$field.0}}_{{$field.2}}'>{{$field.1}}</label>
+ <input type="radio" name='{{$field.0}}' id='id_{{$field.0}}_{{$field.2}}' value="{{$field.2}}" {{if $field.4}}checked="true"{{/if}}>
+ <span class='field_help'>{{$field.3}}</span>
</div>
diff --git a/view/tpl/field_richtext.tpl b/view/tpl/field_richtext.tpl
index c124ee000..c8639cf10 100644..100755
--- a/view/tpl/field_richtext.tpl
+++ b/view/tpl/field_richtext.tpl
@@ -1,6 +1,5 @@
-
<div class='field richtext'>
- <label for='id_$field.0'>$field.1</label>
- <textarea name='$field.0' id='id_$field.0' class="fieldRichtext">$field.2</textarea>
- <span class='field_help'>$field.3</span>
+ <label for='id_{{$field.0}}'>{{$field.1}}</label>
+ <textarea name='{{$field.0}}' id='id_{{$field.0}}' class="fieldRichtext">{{$field.2}}</textarea>
+ <span class='field_help'>{{$field.3}}</span>
</div>
diff --git a/view/tpl/field_select.tpl b/view/tpl/field_select.tpl
index d79eb48e0..9aca26e7b 100644..100755
--- a/view/tpl/field_select.tpl
+++ b/view/tpl/field_select.tpl
@@ -1,8 +1,7 @@
-
<div class='field select'>
- <label for='id_$field.0'>$field.1</label>
- <select name='$field.0' id='id_$field.0'>
- {{ for $field.4 as $opt=>$val }}<option value="$opt" {{ if $opt==$field.2 }}selected="selected"{{ endif }}>$val</option>{{ endfor }}
+ <label for='id_{{$field.0}}'>{{$field.1}}</label>
+ <select name='{{$field.0}}' id='id_{{$field.0}}'>
+ {{foreach $field.4 as $opt=>$val}}<option value="{{$opt}}" {{if $opt==$field.2}}selected="selected"{{/if}}>{{$val}}</option>{{/foreach}}
</select>
- <span class='field_help'>$field.3</span>
+ <span class='field_help'>{{$field.3}}</span>
</div>
diff --git a/view/tpl/field_select_raw.tpl b/view/tpl/field_select_raw.tpl
index 765b285d9..861be3201 100644..100755
--- a/view/tpl/field_select_raw.tpl
+++ b/view/tpl/field_select_raw.tpl
@@ -1,8 +1,7 @@
-
<div class='field select'>
- <label for='id_$field.0'>$field.1</label>
- <select name='$field.0' id='id_$field.0'>
- $field.4
+ <label for='id_{{$field.0}}'>{{$field.1}}</label>
+ <select name='{{$field.0}}' id='id_{{$field.0}}'>
+ {{$field.4}}
</select>
- <span class='field_help'>$field.3</span>
+ <span class='field_help'>{{$field.3}}</span>
</div>
diff --git a/view/tpl/field_textarea.tpl b/view/tpl/field_textarea.tpl
index 2425cdd3b..98be8f138 100644..100755
--- a/view/tpl/field_textarea.tpl
+++ b/view/tpl/field_textarea.tpl
@@ -1,6 +1,5 @@
-
<div class='field textarea'>
- <label for='id_$field.0'>$field.1</label>
- <textarea name='$field.0' id='id_$field.0'>$field.2</textarea>
- <span class='field_help'>$field.3</span>
+ <label for='id_{{$field.0}}'>{{$field.1}}</label>
+ <textarea name='{{$field.0}}' id='id_{{$field.0}}'>{{$field.2}}</textarea>
+ <span class='field_help'>{{$field.3}}</span>
</div>
diff --git a/view/tpl/field_themeselect.tpl b/view/tpl/field_themeselect.tpl
index 1b3ede36c..c02eee328 100644..100755
--- a/view/tpl/field_themeselect.tpl
+++ b/view/tpl/field_themeselect.tpl
@@ -1,9 +1,9 @@
- <script>$(function(){ previewTheme($("#id_$field.0")[0]); });</script>
+ <script>$(function(){ previewTheme($("#id_{{$field.0}}")[0]); });</script>
<div class='field select'>
- <label for='id_$field.0'>$field.1</label>
- <select name='$field.0' id='id_$field.0' {{ if $field.5=='preview' }}onchange="previewTheme(this);"{{ endif }} >
- {{ for $field.4 as $opt=>$val }}<option value="$opt" {{ if $opt==$field.2 }}selected="selected"{{ endif }}>$val</option>{{ endfor }}
+ <label for='id_{{$field.0}}'>{{$field.1}}</label>
+ <select name='{{$field.0}}' id='id_{{$field.0}}' {{if $field.5=='preview'}}onchange="previewTheme(this);"{{/if}} >
+ {{foreach $field.4 as $opt=>$val}}<option value="{{$opt}}" {{if $opt==$field.2}}selected="selected"{{/if}}>{{$val}}</option>{{/foreach}}
</select>
- <span class='field_help'>$field.3</span>
+ <span class='field_help'>{{$field.3}}</span>
<div id="theme-preview"></div>
</div>
diff --git a/view/tpl/field_yesno.tpl b/view/tpl/field_yesno.tpl
index 5d4a775c2..e36e775c7 100644..100755
--- a/view/tpl/field_yesno.tpl
+++ b/view/tpl/field_yesno.tpl
@@ -1,13 +1,13 @@
<div class='field yesno'>
- <label for='id_$field.0'>$field.1</label>
- <div class='onoff' id="id_$field.0_onoff">
- <input type="hidden" name='$field.0' id='id_$field.0' value="$field.2">
+ <label for='id_{{$field.0}}'>{{$field.1}}</label>
+ <div class='onoff' id="id_{{$field.0}}_onoff">
+ <input type="hidden" name='{{$field.0}}' id='id_{{$field.0}}' value="{{$field.2}}">
<a href="#" class='off'>
- {{ if $field.4 }}$field.4.0{{ else }}OFF{{ endif }}
+ {{if $field.4}}{{$field.4.0}}{{else}}OFF{{/if}}
</a>
<a href="#" class='on'>
- {{ if $field.4 }}$field.4.1{{ else }}ON{{ endif }}
+ {{if $field.4}}{{$field.4.1}}{{else}}ON{{/if}}
</a>
</div>
- <span class='field_help'>$field.3</span>
+ <span class='field_help'>{{$field.3}}</span>
</div>
diff --git a/view/tpl/fileas_widget.tpl b/view/tpl/fileas_widget.tpl
index 54fba7435..70d68c56e 100644..100755
--- a/view/tpl/fileas_widget.tpl
+++ b/view/tpl/fileas_widget.tpl
@@ -1,12 +1,12 @@
<div id="fileas-sidebar" class="widget">
- <h3>$title</h3>
- <div id="nets-desc">$desc</div>
+ <h3>{{$title}}</h3>
+ <div id="nets-desc">{{$desc}}</div>
<ul class="fileas-ul">
- <li class="tool"><a href="$base" class="fileas-link fileas-all{{ if $sel_all }} fileas-selected{{ endif }}">$all</a></li>
- {{ for $terms as $term }}
- <li class="tool"><a href="$base?f=&file=$term.name" class="fileas-link{{ if $term.selected }} fileas-selected{{ endif }}">$term.name</a></li>
- {{ endfor }}
+ <li class="tool"><a href="{{$base}}" class="fileas-link fileas-all{{if $sel_all}} fileas-selected{{/if}}">{{$all}}</a></li>
+ {{foreach $terms as $term}}
+ <li class="tool"><a href="{{$base}}?f=&file={{$term.name}}" class="fileas-link{{if $term.selected}} fileas-selected{{/if}}">{{$term.name}}</a></li>
+ {{/foreach}}
</ul>
</div>
diff --git a/view/tpl/filebrowser.tpl b/view/tpl/filebrowser.tpl
index 7db31d716..787f7c0cd 100644..100755
--- a/view/tpl/filebrowser.tpl
+++ b/view/tpl/filebrowser.tpl
@@ -1,7 +1,7 @@
<!DOCTYPE html>
<html>
<head>
- <script type="text/javascript" src="$baseurl/library/tinymce/jscripts/tiny_mce/tiny_mce_popup.js"></script>
+ <script type="text/javascript" src="{{$baseurl}}/library/tinymce/jscripts/tiny_mce/tiny_mce_popup.js"></script>
<style>
.panel_wrapper div.current{.overflow: auto; height: auto!important; }
.filebrowser.path { font-family: fixed; font-size: 10px; background-color: #f0f0ee; height:auto; overflow:auto;}
@@ -60,24 +60,24 @@
<div id="general_panel" class="panel current">
<div class="filebrowser path">
- {{ for $path as $p }}<a href="$p.0">$p.1</a>{{ endfor }}
+ {{foreach $path as $p}}<a href="{{$p.0}}">{{$p.1}}</a>{{/foreach}}
</div>
<div class="filebrowser folders">
<ul>
- {{ for $folders as $f }}<li><a href="$f.0/">$f.1</a></li>{{ endfor }}
+ {{foreach $folders as $f}}<li><a href="{{$f.0}}/">{{$f.1}}</a></li>{{/foreach}}
</ul>
</div>
- <div class="filebrowser files $type">
+ <div class="filebrowser files {{$type}}">
<ul>
- {{ for $files as $f }}
- <li><a href="#" onclick="FileBrowserDialogue.mySubmit('$f.0'); return false;"><img src="$f.2"><span>$f.1</span></a></li>
- {{ endfor }}
+ {{foreach $files as $f}}
+ <li><a href="#" onclick="FileBrowserDialogue.mySubmit('{{$f.0}}'); return false;"><img src="{{$f.2}}"><span>{{$f.1}}</span></a></li>
+ {{/foreach}}
</ul>
</div>
</div>
</div>
<div class="mceActionPanel">
- <input type="button" id="cancel" name="cancel" value="$cancel" onclick="tinyMCEPopup.close();" />
+ <input type="button" id="cancel" name="cancel" value="{{$cancel}}" onclick="tinyMCEPopup.close();" />
</div>
</body>
diff --git a/view/tpl/filer_dialog.tpl b/view/tpl/filer_dialog.tpl
index ae837d6b7..ae59ab713 100644..100755
--- a/view/tpl/filer_dialog.tpl
+++ b/view/tpl/filer_dialog.tpl
@@ -1,4 +1,4 @@
-{{ inc field_combobox.tpl }}{{ endinc }}
+{{include file="field_combobox.tpl"}}
<div class="settings-submit-wrapper" >
- <input id="filer_save" type="button" class="settings-submit" value="$submit" />
+ <input id="filer_save" type="button" class="settings-submit" value="{{$submit}}" />
</div>
diff --git a/view/tpl/filestorage.tpl b/view/tpl/filestorage.tpl
new file mode 100644
index 000000000..7b88c6440
--- /dev/null
+++ b/view/tpl/filestorage.tpl
@@ -0,0 +1,22 @@
+{{if $files}}
+
+ <div class="generic-content-wrapper">
+ {{if $limit}}{{$limitlabel}}{{$limit}}{{/if}} {{if $used}} {{$usedlabel}}{{$used}}{{/if}}
+
+
+ {{foreach $files as $key => $items}}
+ {{foreach $items as $item}}
+ <div class="files-list-item">
+ <a href="{{$baseurl}}/{{$item.id}}/edit">{{$edit}}</a>&nbsp;&nbsp;&nbsp;|
+ <a href="{{$baseurl}}/{{$item.id}}/delete">{{$delete}}</a> |&nbsp;&nbsp;&nbsp;
+ {{if ! $item.dir}}<a href="attach/{{$item.download}}">{{/if}}{{$item.title}}{{if ! $item.dir}}</a>{{/if}}
+ {{if ! $item.dir}} | {{$item.size}} bytes{{else}}{{$directory}}{{/if}}
+
+</div>
+ {{/foreach}}
+ {{/foreach}}
+ </div>
+
+ <div class="clear"></div>
+
+{{/if}}
diff --git a/view/tpl/follow.tpl b/view/tpl/follow.tpl
index 259e74a93..b0597e9b6 100644..100755
--- a/view/tpl/follow.tpl
+++ b/view/tpl/follow.tpl
@@ -1,8 +1,11 @@
<div id="follow-sidebar" class="widget">
- <h3>$connect</h3>
- <div id="connect-desc">$desc</div>
+ <h3>{{$connect}}</h3>
+ <div id="connect-desc">{{$desc}}</div>
<form action="follow" method="post" />
- <input id="side-follow-url" type="text" name="url" size="24" title="$hint" /><input id="side-follow-submit" type="submit" name="submit" value="$follow" />
+ <input id="side-follow-url" type="text" name="url" size="24" title="{{$hint}}" /><input id="side-follow-submit" type="submit" name="submit" value="{{$follow}}" />
</form>
+ {{if $abook_usage_message}}
+ <div class="usage-message" id="abook-usage-message">{{$abook_usage_message}}</div>
+ {{/if}}
</div>
diff --git a/view/tpl/follow_slap.tpl b/view/tpl/follow_slap.tpl
deleted file mode 100644
index 1b1443bee..000000000
--- a/view/tpl/follow_slap.tpl
+++ /dev/null
@@ -1,25 +0,0 @@
- <entry>
- <author>
- <name>$name</name>
- <uri>$profile_page</uri>
- <link rel="photo" type="image/jpeg" media:width="80" media:height="80" href="$thumb" />
- <link rel="avatar" type="image/jpeg" media:width="80" media:height="80" href="$thumb" />
- </author>
-
- <id>$item_id</id>
- <title>$title</title>
- <published>$published</published>
- <content type="$type" >$content</content>
-
- <as:actor>
- <as:obj_type>http://activitystrea.ms/schema/1.0/person</as:obj_type>
- <id>$profile_page</id>
- <title></title>
- <link rel="avatar" type="image/jpeg" media:width="175" media:height="175" href="$photo"/>
- <link rel="avatar" type="image/jpeg" media:width="80" media:height="80" href="$thumb"/>
- <poco:preferredUsername>$nick</poco:preferredUsername>
- <poco:displayName>$name</poco:displayName>
- </as:actor>
- <as:verb>$verb</as:verb>
- $ostat_follow
- </entry>
diff --git a/view/tpl/generic_links_widget.tpl b/view/tpl/generic_links_widget.tpl
index f3404f783..5ae52aa8a 100644..100755
--- a/view/tpl/generic_links_widget.tpl
+++ b/view/tpl/generic_links_widget.tpl
@@ -1,11 +1,11 @@
-<div class="widget{{ if $class }} $class{{ endif }}">
- {{if $title}}<h3>$title</h3>{{endif}}
- {{if $desc}}<div class="desc">$desc</div>{{endif}}
+<div class="widget{{if $class}} {{$class}}{{/if}}">
+ {{if $title}}<h3>{{$title}}</h3>{{/if}}
+ {{if $desc}}<div class="desc">{{$desc}}</div>{{/if}}
<ul>
- {{ for $items as $item }}
- <li class="tool"><a href="$item.url" class="{{ if $item.selected }}selected{{ endif }}">$item.label</a></li>
- {{ endfor }}
+ {{foreach $items as $item}}
+ <li class="tool"><a href="{{$item.url}}" class="{{if $item.selected}}active{{/if}}">{{$item.label}}</a></li>
+ {{/foreach}}
</ul>
</div>
diff --git a/view/tpl/group_drop.tpl b/view/tpl/group_drop.tpl
index 2cbebbb8e..850e7101f 100644..100755
--- a/view/tpl/group_drop.tpl
+++ b/view/tpl/group_drop.tpl
@@ -1,9 +1,7 @@
-<div class="group-delete-wrapper button" id="group-delete-wrapper-$id" >
- <a href="group/drop/$id?t=$form_security_token"
+<div class="group-delete-wrapper button" id="group-delete-wrapper-{{$id}}" >
+ <a href="group/drop/{{$id}}?t={{$form_security_token}}"
onclick="return confirmDelete();"
- id="group-delete-icon-$id"
- class="icon drophide group-delete-icon"
- onmouseover="imgbright(this);"
- onmouseout="imgdull(this);" ></a>
+ id="group-delete-icon-{{$id}}"
+ class="group-delete-icon" ><i class="icon-remove drop-icons"></i></a>
</div>
<div class="group-delete-end"></div>
diff --git a/view/tpl/group_edit.tpl b/view/tpl/group_edit.tpl
index 2fa2b1a55..eb658624c 100644..100755
--- a/view/tpl/group_edit.tpl
+++ b/view/tpl/group_edit.tpl
@@ -1,23 +1,24 @@
-<h2>$title</h2>
+<h2>{{$title}}</h2>
<div id="group-edit-wrapper" >
- <form action="group/$gid" id="group-edit-form" method="post" >
- <input type='hidden' name='form_security_token' value='$form_security_token'>
+ <form action="group/{{$gid}}" id="group-edit-form" method="post" >
+ <input type='hidden' name='form_security_token' value='{{$form_security_token}}'>
- {{ inc field_input.tpl with $field=$gname }}{{ endinc }}
- {{ if $drop }}$drop{{ endif }}
+ {{include file="field_input.tpl" field=$gname}}
+ {{include file="field_checkbox.tpl" field=$public}}
+ {{if $drop}}{{$drop}}{{/if}}
<div id="group-edit-submit-wrapper" >
- <input type="submit" name="submit" value="$submit" >
+ <input type="submit" name="submit" value="{{$submit}}" >
</div>
<div id="group-edit-select-end" ></div>
</form>
</div>
-{{ if $groupeditor }}
+{{if $groupeditor}}
<div id="group-update-wrapper">
- {{ inc groupeditor.tpl }}{{ endinc }}
+ {{include file="groupeditor.tpl"}}
</div>
-{{ endif }}
-{{ if $desc }}<div id="group-edit-desc">$desc</div>{{ endif }}
+{{/if}}
+{{if $desc}}<div id="group-edit-desc">{{$desc}}</div>{{/if}}
diff --git a/view/tpl/group_selection.tpl b/view/tpl/group_selection.tpl
index 3809cb994..2223125ea 100644..100755
--- a/view/tpl/group_selection.tpl
+++ b/view/tpl/group_selection.tpl
@@ -1,8 +1,8 @@
<div class="field custom">
-<label for="group-selection" id="group-selection-lbl">$label</label>
+<label for="group-selection" id="group-selection-lbl">{{$label}}</label>
<select name="group-selection" id="group-selection" >
-{{ for $groups as $group }}
-<option value="$group.id" {{ if $group.selected }}selected="selected"{{ endif }} >$group.name</option>
-{{ endfor }}
+{{foreach $groups as $group}}
+<option value="{{$group.id}}" {{if $group.selected}}selected="selected"{{/if}} >{{$group.name}}</option>
+{{/foreach}}
</select>
</div>
diff --git a/view/tpl/group_side.tpl b/view/tpl/group_side.tpl
index ebb194d9c..a0ed7a82d 100644..100755
--- a/view/tpl/group_side.tpl
+++ b/view/tpl/group_side.tpl
@@ -1,33 +1,28 @@
<div class="widget" id="group-sidebar">
-<h3>$title</h3>
+<h3>{{$title}}</h3>
<div id="sidebar-group-list">
<ul id="sidebar-group-ul">
- {{ for $groups as $group }}
+ {{foreach $groups as $group}}
<li class="sidebar-group-li">
- {{ if $group.cid }}
+ {{if $group.cid}}
<input type="checkbox"
- class="{{ if $group.selected }}ticked{{ else }}unticked {{ endif }} action"
- onclick="contactgroupChangeMember('$group.id','$group.cid');return true;"
- {{ if $group.ismember }}checked="checked"{{ endif }}
+ class="{{if $group.selected}}ticked{{else}}unticked {{/if}} action"
+ onclick="contactgroupChangeMember('{{$group.id}}','{{$group.cid}}');return true;"
+ {{if $group.ismember}}checked="checked"{{/if}}
/>
- {{ endif }}
- {{ if $group.edit }}
- <a class="groupsideedit" href="$group.edit.href" title="$edittext"><span id="edit-sidebar-group-element-$group.id" class="group-edit-icon iconspacer small-pencil"></span></a>
- {{ endif }}
- <a id="sidebar-group-element-$group.id" class="sidebar-group-element {{ if $group.selected }}group-selected{{ endif }}" href="$group.href">$group.text</a>
+ {{/if}}
+ {{if $group.edit}}
+ <a class="groupsideedit" href="{{$group.edit.href}}" title="{{$edittext}}"><i id="edit-sidebar-group-element-{{$group.id}}" class="group-edit-icon iconspacer icon-pencil"></i></a>
+ {{/if}}
+ <a id="sidebar-group-element-{{$group.id}}" class="sidebar-group-element {{if $group.selected}}group-selected{{/if}}" href="{{$group.href}}">{{$group.text}}</a>
</li>
- {{ endfor }}
+ {{/foreach}}
</ul>
</div>
<div id="sidebar-new-group">
- <a href="group/new">$createtext</a>
+ <a href="group/new">{{$createtext}}</a>
</div>
- {{ if $ungrouped }}
- <div id="sidebar-ungrouped">
- <a href="nogroup">$ungrouped</a>
- </div>
- {{ endif }}
</div>
diff --git a/view/tpl/groupeditor.tpl b/view/tpl/groupeditor.tpl
index 755985eb3..c79bb0a2a 100644..100755
--- a/view/tpl/groupeditor.tpl
+++ b/view/tpl/groupeditor.tpl
@@ -1,16 +1,16 @@
<div id="group">
-<h3>$groupeditor.label_members</h3>
+<h3>{{$groupeditor.label_members}}</h3>
<div id="group-members" class="contact_list">
-{{ for $groupeditor.members as $c}} $c {{ endfor }}
+{{foreach $groupeditor.members as $c}} {{$c}} {{/foreach}}
</div>
<div id="group-members-end"></div>
<hr id="group-separator" />
</div>
<div id="contacts">
-<h3>$groupeditor.label_contacts</h3>
+<h3>{{$groupeditor.label_contacts}}</h3>
<div id="group-all-contacts" class="contact_list">
-{{ for $groupeditor.contacts as $m}} $m {{ endfor }}
+{{foreach $groupeditor.contacts as $m}} {{$m}} {{/foreach}}
</div>
<div id="group-all-contacts-end"></div>
</div>
diff --git a/view/tpl/head.tpl b/view/tpl/head.tpl
index 632ab21ca..eb4c6c2ad 100644..100755
--- a/view/tpl/head.tpl
+++ b/view/tpl/head.tpl
@@ -1,28 +1,29 @@
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
-<base href="$baseurl/" />
-<meta name="generator" content="$generator" />
+<base href="{{$baseurl}}/" />
+<meta name="generator" content="{{$generator}}" />
<!--[if IE]>
<script src="https://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
-$head_css
+{{$head_css}}
-$js_strings
+{{$js_strings}}
-$head_js
+{{$head_js}}
-<link rel="shortcut icon" href="$baseurl/images/red.png" />
+<link rel="shortcut icon" href="{{$icon}}" />
<link rel="search"
- href="$baseurl/opensearch"
+ href="{{$baseurl}}/opensearch"
type="application/opensearchdescription+xml"
- title="Search in Friendica" />
+ title="Search in Red" />
<script>
- var updateInterval = $update_interval;
- var localUser = {{ if $local_user }}$local_user{{ else }}false{{ endif }};
+ var updateInterval = {{$update_interval}};
+ var localUser = {{if $local_user}}{{$local_user}}{{else}}false{{/if}};
+ var zid = {{if $zid}}'{{$zid}}'{{else}}null{{/if}};
</script>
diff --git a/view/tpl/hide_comments.tpl b/view/tpl/hide_comments.tpl
index 55ee9dd7b..f4ed9c552 100644..100755
--- a/view/tpl/hide_comments.tpl
+++ b/view/tpl/hide_comments.tpl
@@ -1,4 +1,4 @@
<div class="hide-comments-outer">
-<span id="hide-comments-total-$id" class="hide-comments-total">$num_comments</span> <span id="hide-comments-$id" class="hide-comments fakelink" onclick="showHideComments($id);">$hide_text</span>
+<span id="hide-comments-total-{{$id}}" class="hide-comments-total">{{$num_comments}}</span> <span id="hide-comments-{{$id}}" class="hide-comments fakelink" onclick="showHideComments({{$id}});">{{$hide_text}}</span>
</div>
-<div id="collapsed-comments-$id" class="collapsed-comments" style="display: $display;">
+<div id="collapsed-comments-{{$id}}" class="collapsed-comments" style="display: {{$display}};">
diff --git a/view/tpl/install.tpl b/view/tpl/install.tpl
index b3a5f46ff..0e77aa97b 100644..100755
--- a/view/tpl/install.tpl
+++ b/view/tpl/install.tpl
@@ -1,10 +1,9 @@
+<h1>{{$title}}</h1>
+<h2>{{$pass}}</h2>
-<h1>$title</h1>
-<h2>$pass</h2>
+{{if $status}}
+<h3 class="error-message">{{$status}}</h3>
+{{/if}}
-{{ if $status }}
-<h3 class="error-message">$status</h3>
-{{ endif }}
-
-$text
+{{$text}}
diff --git a/view/tpl/install_checks.tpl b/view/tpl/install_checks.tpl
index 76287c4a3..2f773f746 100644..100755
--- a/view/tpl/install_checks.tpl
+++ b/view/tpl/install_checks.tpl
@@ -1,24 +1,24 @@
-<h1>$title</h1>
-<h2>$pass</h2>
-<form action="$baseurl/index.php?q=setup" method="post">
+<h1>{{$title}}</h1>
+<h2>{{$pass}}</h2>
+<form action="{{$baseurl}}/index.php?q=setup" method="post">
<table>
-{{ for $checks as $check }}
- <tr><td>$check.title </td><td><span class="icon s22 {{if $check.status}}on{{else}}{{if $check.required}}off{{else}}yellow{{endif}}{{endif}}"></td><td>{{if $check.required}}(required){{endif}}</td></tr>
- {{if $check.help }}
- <tr><td colspan="3"><blockquote>$check.help</blockquote></td></tr>
- {{endif}}
-{{ endfor }}
+{{foreach $checks as $check}}
+ <tr><td>{{$check.title}} </td><td><i class="{{if $check.status}}icon-check{{else}}{{if $check.required}}icon-check-empty{{else}}icon-exclamation{{/if}}{{/if}}"></i></td><td>{{if $check.required}}(required){{/if}}</td></tr>
+ {{if $check.help}}
+ <tr><td colspan="3"><blockquote>{{$check.help}}</blockquote></td></tr>
+ {{/if}}
+{{/foreach}}
</table>
-{{ if $phpath }}
- <input type="hidden" name="phpath" value="$phpath">
-{{ endif }}
+{{if $phpath}}
+ <input type="hidden" name="phpath" value="{{$phpath}}">
+{{/if}}
-{{ if $passed }}
+{{if $passed}}
<input type="hidden" name="pass" value="2">
- <input type="submit" value="$next">
-{{ else }}
+ <input type="submit" value="{{$next}}">
+{{else}}
<input type="hidden" name="pass" value="1">
- <input type="submit" value="$reload">
-{{ endif }}
+ <input type="submit" value="{{$reload}}">
+{{/if}}
</form>
diff --git a/view/tpl/install_db.tpl b/view/tpl/install_db.tpl
index dd8ba1302..3968d2a54 100644..100755
--- a/view/tpl/install_db.tpl
+++ b/view/tpl/install_db.tpl
@@ -1,30 +1,30 @@
-
-<h1>$title</h1>
-<h2>$pass</h2>
+<h1>{{$title}}</h1>
+<h2>{{$pass}}</h2>
<p>
-$info_01<br>
-$info_02<br>
-$info_03
+{{$info_01}}<br>
+{{$info_02}}<br>
+{{$info_03}}
</p>
-{{ if $status }}
-<h3 class="error-message">$status</h3>
-{{ endif }}
+{{if $status}}
+<h3 class="error-message">{{$status}}</h3>
+{{/if}}
-<form id="install-form" action="$baseurl/setup" method="post">
+<form id="install-form" action="{{$baseurl}}/setup" method="post">
-<input type="hidden" name="phpath" value="$phpath" />
+<input type="hidden" name="phpath" value="{{$phpath}}" />
<input type="hidden" name="pass" value="3" />
-{{ inc field_input.tpl with $field=$dbhost }}{{endinc}}
-{{ inc field_input.tpl with $field=$dbuser }}{{endinc}}
-{{ inc field_password.tpl with $field=$dbpass }}{{endinc}}
-{{ inc field_input.tpl with $field=$dbdata }}{{endinc}}
+{{include file="field_input.tpl" field=$dbhost}}
+{{include file="field_input.tpl" field=$dbport}}
+{{include file="field_input.tpl" field=$dbuser}}
+{{include file="field_password.tpl" field=$dbpass}}
+{{include file="field_input.tpl" field=$dbdata}}
-<input id="install-submit" type="submit" name="submit" value="$submit" />
+<input id="install-submit" type="submit" name="submit" value="{{$submit}}" />
</form>
diff --git a/view/tpl/install_settings.tpl b/view/tpl/install_settings.tpl
index ba39b99c5..d6fc66c87 100644..100755
--- a/view/tpl/install_settings.tpl
+++ b/view/tpl/install_settings.tpl
@@ -1,27 +1,27 @@
+<h1>{{$title}}</h1>
+<h2>{{$pass}}</h2>
-<h1>$title</h1>
-<h2>$pass</h2>
+{{if $status}}
+<h3 class="error-message">{{$status}}</h3>
+{{/if}}
-{{ if $status }}
-<h3 class="error-message">$status</h3>
-{{ endif }}
+<form id="install-form" action="{{$baseurl}}/setup" method="post">
-<form id="install-form" action="$baseurl/setup" method="post">
-
-<input type="hidden" name="phpath" value="$phpath" />
-<input type="hidden" name="dbhost" value="$dbhost" />
-<input type="hidden" name="dbuser" value="$dbuser" />
-<input type="hidden" name="dbpass" value="$dbpass" />
-<input type="hidden" name="dbdata" value="$dbdata" />
+<input type="hidden" name="phpath" value="{{$phpath}}" />
+<input type="hidden" name="dbhost" value="{{$dbhost}}" />
+<input type="hidden" name="dbport" value="{{$dbport}}" />
+<input type="hidden" name="dbuser" value="{{$dbuser}}" />
+<input type="hidden" name="dbpass" value="{{$dbpass}}" />
+<input type="hidden" name="dbdata" value="{{$dbdata}}" />
<input type="hidden" name="pass" value="4" />
-{{ inc field_input.tpl with $field=$adminmail }}{{endinc}}
-{{ inc field_input.tpl with $field=$siteurl }}{{endinc}}
+{{include file="field_input.tpl" field=$adminmail}}
+{{include file="field_input.tpl" field=$siteurl}}
-$timezone
+{{$timezone}}
-<input id="install-submit" type="submit" name="submit" value="$submit" />
+<input id="install-submit" type="submit" name="submit" value="{{$submit}}" />
</form>
diff --git a/view/tpl/intros.tpl b/view/tpl/intros.tpl
index 6d1f1baa0..a4aed3bb8 100644..100755
--- a/view/tpl/intros.tpl
+++ b/view/tpl/intros.tpl
@@ -1,18 +1,17 @@
+<div class="intro-wrapper" id="intro-{{$contact_id}}" >
-<div class="intro-wrapper" id="intro-$contact_id" >
-
-<div class="intro-fullname" id="intro-fullname-$contact_id" >$fullname</div>
-<a class="intro-url-link" id="intro-url-link-$contact_id" href="$url" ><img id="photo-$contact_id" class="intro-photo" src="$photo" width="175" height=175" title="$fullname" alt="$fullname" /></a>
-<div class="intro-wrapper-end" id="intro-wrapper-end-$contact_id"></div>
+<div class="intro-fullname" id="intro-fullname-{{$contact_id}}" >{{$fullname}}</div>
+<a class="intro-url-link" id="intro-url-link-{{$contact_id}}" href="{{$url}}" ><img id="photo-{{$contact_id}}" class="intro-photo" src="{{$photo}}" width="175" height=175" title="{{$fullname}}" alt="{{$fullname}}" /></a>
+<div class="intro-wrapper-end" id="intro-wrapper-end-{{$contact_id}}"></div>
<form class="intro-form" action="intro" method="post">
-<input class="intro-submit-ignore" type="submit" name="submit" value="$ignore" />
-<input class="intro-submit-block" type="submit" name="submit" value="$block" />
-<input class="intro-submit-discard" type="submit" name="submit" value="$discard" />
-{{inc field_checkbox.tpl with $field=$hidden }}{{endinc}}
-{# {{ inc field_checkbox.tpl with $field=$activity }}{{endinc}} #}
-<input type="hidden" name="contact_id" value="$contact_id" >
+<input class="intro-submit-ignore" type="submit" name="submit" value="{{$ignore}}" />
+<input class="intro-submit-block" type="submit" name="submit" value="{{$block}}" />
+<input class="intro-submit-discard" type="submit" name="submit" value="{{$discard}}" />
+{{include file="field_checkbox.tpl" field=$hidden}}
+{{* {{include file="field_checkbox.tpl" field=$activity}} *}}
+<input type="hidden" name="contact_id" value="{{$contact_id}}" >
-<input class="intro-submit-approve" type="submit" name="submit" value="$approve" />
+<input class="intro-submit-approve" type="submit" name="submit" value="{{$approve}}" />
</form>
</div>
<div class="intro-end"></div>
diff --git a/view/tpl/intros_header.tpl b/view/tpl/intros_header.tpl
index 17afd0cbd..15096c7f8 100644..100755
--- a/view/tpl/intros_header.tpl
+++ b/view/tpl/intros_header.tpl
@@ -1 +1 @@
-<h3>$title</h3>
+<h3>{{$title}}</h3>
diff --git a/view/tpl/invite.tpl b/view/tpl/invite.tpl
index e00d27d4a..2b7ab9cfb 100644..100755
--- a/view/tpl/invite.tpl
+++ b/view/tpl/invite.tpl
@@ -1,13 +1,13 @@
<form action="invite" method="post" id="invite-form" >
-<input type='hidden' name='form_security_token' value='$form_security_token'>
+<input type='hidden' name='form_security_token' value='{{$form_security_token}}'>
<div id="invite-wrapper">
-<h3>$invite</h3>
+<h3>{{$invite}}</h3>
<div id="invite-recipient-text">
-$addr_text
+{{$addr_text}}
</div>
<div id="invite-recipient-textarea">
@@ -15,15 +15,15 @@ $addr_text
</div>
<div id="invite-message-text">
-$msg_text
+{{$msg_text}}
</div>
<div id="invite-message-textarea">
-<textarea id="invite-message" name="message" rows="10" cols="72" >$default_message</textarea>
+<textarea id="invite-message" name="message" rows="10" cols="72" >{{$default_message}}</textarea>
</div>
<div id="invite-submit-wrapper">
-<input type="submit" name="submit" value="$submit" />
+<input type="submit" name="submit" value="{{$submit}}" />
</div>
</div>
diff --git a/view/tpl/item_attach.tpl b/view/tpl/item_attach.tpl
new file mode 100644
index 000000000..25c127a15
--- /dev/null
+++ b/view/tpl/item_attach.tpl
@@ -0,0 +1,6 @@
+<div class="body-attach">
+{{foreach $attaches as $a}}
+<a href="{{$a.url}}" title="{{$a.title}}" class="attachlink" ><i class="icon-paper-clip attach-icons attach-clip"></i><i class="{{$a.icon}} attach-icons"></i></a>
+{{/foreach}}
+<div class="clear"></div>
+</div>
diff --git a/view/tpl/item_categories.tpl b/view/tpl/item_categories.tpl
new file mode 100644
index 000000000..ec2639a6f
--- /dev/null
+++ b/view/tpl/item_categories.tpl
@@ -0,0 +1,8 @@
+{{if $categories}}
+<div class="categorytags">
+{{foreach $categories as $cat}}
+<span class="item-category"><i class="icon-asterisk cat-icons"></i>&nbsp;{{if $cat.url}}<a href="{{$cat.url}}">{{$cat.term}}</a>{{else}}{{$cat.term}}{{/if}}</span>
+{{/foreach}}
+</div>
+{{/if}}
+
diff --git a/view/tpl/item_filer.tpl b/view/tpl/item_filer.tpl
new file mode 100644
index 000000000..0e68a172a
--- /dev/null
+++ b/view/tpl/item_filer.tpl
@@ -0,0 +1,8 @@
+{{if $categories}}
+<div class="filesavetags">
+{{foreach $categories as $cat}}
+<span class="item-category"><i class="icon-folder-close cat-icons"></i>&nbsp;{{$cat.term}}&nbsp;<a href="{{$cat.removelink}}" class="category-remove-link" title="{{$remove}}"><i class="icon-remove drop-icons"></i></a></span>
+{{/foreach}}
+</div>
+{{/if}}
+
diff --git a/view/tpl/jot-header.tpl b/view/tpl/jot-header.tpl
index e4fb00b7a..878e1e7da 100644..100755
--- a/view/tpl/jot-header.tpl
+++ b/view/tpl/jot-header.tpl
@@ -1,21 +1,20 @@
-
<script language="javascript" type="text/javascript">
var editor=false;
var textlen = 0;
-var plaintext = '$editselect';
+var plaintext = '{{$editselect}}';
function initEditor(cb){
if (editor==false){
- $("#profile-jot-text-loading").show();
+ $("#profile-jot-text-loading").spin('small');
if(plaintext == 'none') {
- $("#profile-jot-text-loading").hide();
+ $("#profile-jot-text-loading").spin(false);
$("#profile-jot-text").css({ 'height': 200, 'color': '#000' });
$("#profile-jot-text").contact_autocomplete(baseurl+"/acl");
editor = true;
- $("a#jot-perms-icon").fancybox({
- 'transitionIn' : 'elastic',
- 'transitionOut' : 'elastic'
+ $("a#jot-perms-icon").colorbox({
+ 'inline' : true,
+ 'transition' : 'elastic'
});
$(".jothidden").show();
if (typeof cb!="undefined") cb();
@@ -24,7 +23,7 @@ function initEditor(cb){
tinyMCE.init({
theme : "advanced",
mode : "specific_textareas",
- editor_selector: $editselect,
+ editor_selector: {{$editselect}},
auto_focus: "profile-jot-text",
plugins : "bbcode,paste,autoresize, inlinepopups",
theme_advanced_buttons1 : "bold,italic,underline,undo,redo,link,unlink,image,forecolor,formatselect,code",
@@ -42,7 +41,7 @@ function initEditor(cb){
force_br_newlines : true,
forced_root_block : '',
convert_urls: false,
- content_css: "$baseurl/view/custom_tinymce.css",
+ content_css: "{{$baseurl}}/view/custom_tinymce.css",
theme_advanced_path : false,
file_browser_callback : "fcFileBrowser",
setup : function(ed) {
@@ -74,29 +73,11 @@ function initEditor(cb){
$('#profile-jot-desc').html('&nbsp;');
}
- //Character count
-
- if(textlen <= 140) {
- $('#character-counter').removeClass('red');
- $('#character-counter').removeClass('orange');
- $('#character-counter').addClass('grey');
- }
- if((textlen > 140) && (textlen <= 420)) {
- $('#character-counter').removeClass('grey');
- $('#character-counter').removeClass('red');
- $('#character-counter').addClass('orange');
- }
- if(textlen > 420) {
- $('#character-counter').removeClass('grey');
- $('#character-counter').removeClass('orange');
- $('#character-counter').addClass('red');
- }
- $('#character-counter').text(textlen);
});
ed.onInit.add(function(ed) {
ed.pasteAsPlainText = true;
- $("#profile-jot-text-loading").hide();
+ $("#profile-jot-text-loading").spin(false);
$(".jothidden").show();
if (typeof cb!="undefined") cb();
});
@@ -106,10 +87,10 @@ function initEditor(cb){
editor = true;
// setup acl popup
- $("a#jot-perms-icon").fancybox({
- 'transitionIn' : 'elastic',
- 'transitionOut' : 'elastic'
- });
+ $("a#jot-perms-icon").colorbox({
+ 'inline' : true,
+ 'transition' : 'elastic'
+ });
} else {
if (typeof cb!="undefined") cb();
}
@@ -122,9 +103,9 @@ function enableOnUser(){
}
</script>
-<script type="text/javascript" src="$baseurl/js/ajaxupload.js" ></script>
+<script type="text/javascript" src="{{$baseurl}}/view/js/ajaxupload.js" ></script>
<script>
- var ispublic = '$ispublic';
+ var ispublic = '{{$ispublic}}';
$(document).ready(function() {
@@ -134,23 +115,25 @@ function enableOnUser(){
var uploader = new window.AjaxUpload(
'wall-image-upload',
- { action: '$baseurl/wall_upload/$nickname',
+ { action: '{{$baseurl}}/wall_upload/{{$nickname}}',
name: 'userfile',
- onSubmit: function(file,ext) { $('#profile-rotator').show(); },
+ onSubmit: function(file,ext) { $('#profile-rotator').spin('tiny'); },
onComplete: function(file,response) {
addeditortext(response);
- $('#profile-rotator').hide();
+ $('#jot-media').val($('#jot-media').val() + response);
+ $('#profile-rotator').spin(false);
}
}
);
var file_uploader = new window.AjaxUpload(
'wall-file-upload',
- { action: '$baseurl/wall_attach/$nickname',
+ { action: '{{$baseurl}}/wall_attach/{{$nickname}}',
name: 'userfile',
- onSubmit: function(file,ext) { $('#profile-rotator').show(); },
+ onSubmit: function(file,ext) { $('#profile-rotator').spin('tiny'); },
onComplete: function(file,response) {
addeditortext(response);
- $('#profile-rotator').hide();
+ $('#jot-media').val($('#jot-media').val() + response);
+ $('#profile-rotator').spin(false);
}
}
);
@@ -177,26 +160,26 @@ function enableOnUser(){
}
function jotGetLink() {
- reply = prompt("$linkurl");
+ reply = prompt("{{$linkurl}}");
if(reply && reply.length) {
reply = bin2hex(reply);
- $('#profile-rotator').show();
- $.get('$baseurl/parse_url?binurl=' + reply, function(data) {
+ $('#profile-rotator').spin('tiny');
+ $.get('{{$baseurl}}/parse_url?binurl=' + reply, function(data) {
addeditortext(data);
- $('#profile-rotator').hide();
+ $('#profile-rotator').spin(false);
});
}
}
function jotVideoURL() {
- reply = prompt("$vidurl");
+ reply = prompt("{{$vidurl}}");
if(reply && reply.length) {
addeditortext('[video]' + reply + '[/video]');
}
}
function jotAudioURL() {
- reply = prompt("$audurl");
+ reply = prompt("{{$audurl}}");
if(reply && reply.length) {
addeditortext('[audio]' + reply + '[/audio]');
}
@@ -204,21 +187,35 @@ function enableOnUser(){
function jotGetLocation() {
- reply = prompt("$whereareu", $('#jot-location').val());
+ reply = prompt("{{$whereareu}}", $('#jot-location').val());
if(reply && reply.length) {
$('#jot-location').val(reply);
}
}
+ function jotGetExpiry() {
+ //reply = prompt("{{$expirewhen}}", $('#jot-expire').val());
+ $('#expiryModal').modal();
+ $('#expiry-modal-OKButton').on('click', function() {
+ reply=$('#expiration-date').val();
+ if(reply && reply.length) {
+ $('#jot-expire').val(reply);
+ $('#expiryModal').modal('hide');
+ }
+})
+
+
+ }
+
function jotShare(id) {
if ($('#jot-popup').length != 0) $('#jot-popup').show();
- $('#like-rotator-' + id).show();
- $.get('$baseurl/share/' + id, function(data) {
+ $('#like-rotator-' + id).spin('tiny');
+ $.get('{{$baseurl}}/share/' + id, function(data) {
if (!editor) $("#profile-jot-text").val("");
initEditor(function(){
addeditortext(data);
- $('#like-rotator-' + id).hide();
+ $('#like-rotator-' + id).spin(false);
$(window).scrollTop(0);
});
@@ -237,19 +234,19 @@ function enableOnUser(){
event.preventDefault();
if(reply && reply.length) {
reply = bin2hex(reply);
- $('#profile-rotator').show();
- $.get('$baseurl/parse_url?binurl=' + reply, function(data) {
+ $('#profile-rotator').spin('tiny');
+ $.get('{{$baseurl}}/parse_url?binurl=' + reply, function(data) {
if (!editor) $("#profile-jot-text").val("");
initEditor(function(){
addeditortext(data);
- $('#profile-rotator').hide();
+ $('#profile-rotator').spin(false);
});
});
}
}
function itemTag(id) {
- reply = prompt("$term");
+ reply = prompt("{{$term}}");
if(reply && reply.length) {
reply = reply.replace('#','');
if(reply.length) {
@@ -257,7 +254,7 @@ function enableOnUser(){
commentBusy = true;
$('body').css('cursor', 'wait');
- $.get('$baseurl/tagger/' + id + '?term=' + reply);
+ $.get('{{$baseurl}}/tagger/' + id + '?term=' + reply);
if(timer) clearTimeout(timer);
timer = setTimeout(NavUpdate,3000);
liking = 1;
@@ -270,7 +267,7 @@ function enableOnUser(){
var bordercolor = $("input").css("border-color");
$.get('filer/', function(data){
- $.fancybox(data);
+ $.colorbox({html:data});
$("#id_term").keypress(function(){
$(this).css("border-color",bordercolor);
})
@@ -284,11 +281,11 @@ function enableOnUser(){
if(reply && reply.length) {
commentBusy = true;
$('body').css('cursor', 'wait');
- $.get('$baseurl/filer/' + id + '?term=' + reply, NavUpdate);
+ $.get('{{$baseurl}}/filer/' + id + '?term=' + reply, NavUpdate);
// if(timer) clearTimeout(timer);
// timer = setTimeout(NavUpdate,3000);
liking = 1;
- $.fancybox.close();
+ $.colorbox.close();
} else {
$("#id_term").css("border-color","#FF0000");
}
@@ -303,16 +300,26 @@ function enableOnUser(){
$('#profile-nolocation-wrapper').hide();
}
- function addeditortext(data) {
- if(plaintext == 'none') {
- var currentText = $("#profile-jot-text").val();
- $("#profile-jot-text").val(currentText + data);
- }
- else
- tinyMCE.execCommand('mceInsertRawHTML',false,data);
- }
- $geotag
+
+ {{$geotag}}
</script>
+<script>
+$( document ).on( "click", ".wall-item-delete-link,.page-delete-link,.layout-delete-link,.block-delete-link", function(e) {
+ var link = $(this).attr("href"); // "get" the intended link in a var
+
+ if (typeof(eval($.fn.modal)) === 'function'){
+ e.preventDefault();
+ bootbox.confirm("<h4>{{$confirmdelete}}</h4>",function(result) {
+ if (result) {
+ document.location.href = link;}
+ });}
+ else {
+ return confirm("{{$confirmdelete}}");
+ }
+ });
+</script>
+
+
diff --git a/view/tpl/jot.tpl b/view/tpl/jot.tpl
index 29c420900..e1e1e3080 100644..100755
--- a/view/tpl/jot.tpl
+++ b/view/tpl/jot.tpl
@@ -1,86 +1,139 @@
-
<div id="profile-jot-wrapper" >
- <div id="profile-jot-banner-wrapper">
- <div id="profile-jot-desc" >&nbsp;</div>
- <div id="character-counter" class="grey"></div>
- </div>
- <div id="profile-jot-banner-end"></div>
- <form id="profile-jot-form" action="$action" method="post" >
- <input type="hidden" name="type" value="$ptyp" />
- <input type="hidden" name="profile_uid" value="$profile_uid" />
- <input type="hidden" name="return" value="$return_path" />
- <input type="hidden" name="location" id="jot-location" value="$defloc" />
+ <form id="profile-jot-form" action="{{$action}}" method="post" >
+ <input type="hidden" name="type" value="{{$ptyp}}" />
+ <input type="hidden" name="profile_uid" value="{{$profile_uid}}" />
+ <input type="hidden" name="return" value="{{$return_path}}" />
+ <input type="hidden" name="location" id="jot-location" value="{{$defloc}}" />
+ <input type="hidden" name="expire" id="jot-expire" value="{{$defexpire}}" />
+ <input type="hidden" name="media_str" id="jot-media" value="" />
+ <input type="hidden" name="source" id="jot-source" value="{{$source}}" />
<input type="hidden" name="coord" id="jot-coord" value="" />
- <input type="hidden" name="post_id" value="$post_id" />
+ <input type="hidden" name="post_id" value="{{$post_id}}" />
+ <input type="hidden" name="webpage" value="{{$webpage}}" />
<input type="hidden" name="preview" id="jot-preview" value="0" />
- <div id="jot-title-wrap"><input name="title" id="jot-title" type="text" placeholder="$placeholdertitle" value="$title" class="jothidden" style="display:none"></div>
- {{ if $catsenabled }}
- <div id="jot-category-wrap"><input name="category" id="jot-category" type="text" placeholder="$placeholdercategory" value="$category" class="jothidden" style="display:none" /></div>
- {{ endif }}
+ {{$mimeselect}}
+ {{$layoutselect}}
+
+ <div id="jot-title-wrap"><input name="title" id="jot-title" type="text" placeholder="{{$placeholdertitle}}" value="{{$title}}" class="jothidden" style="display:none"></div>
+ {{if $catsenabled}}
+ <div id="jot-category-wrap"><input name="category" id="jot-category" type="text" placeholder="{{$placeholdercategory}}" value="{{$category}}" class="jothidden" style="display:none" /></div>
+ {{/if}}
+ {{if $webpage}}
+ <div id="jot-pagetitle-wrap"><input name="pagetitle" id="jot-pagetitle" type="text" placeholder="{{$placeholdpagetitle}}" value="{{$pagetitle}}" class="jothidden" style="display:none" /></div>
+ {{/if}}
<div id="jot-text-wrap">
- <img id="profile-jot-text-loading" src="images/rotator.gif" alt="$wait" title="$wait" style="display: none;" />
- <textarea rows="5" cols="64" class="profile-jot-text" id="profile-jot-text" name="body" >{{ if $content }}$content{{ else }}$share{{ endif }}</textarea>
+ <textarea rows="5" cols="64" class="profile-jot-text" id="profile-jot-text" name="body" placeholder="{{$share}}">{{$content}}</textarea>
</div>
+ <div id="profile-jot-text-loading"></div>
<div id="profile-jot-submit-wrapper" class="jothidden">
- <input type="submit" id="profile-jot-submit" name="submit" value="$share" />
+ <input type="submit" id="profile-jot-submit" name="submit" value="{{$share}}" />
- <div id="profile-upload-wrapper" style="display: $visitor;" >
- <div id="wall-image-upload-div" ><a href="#" onclick="return false;" id="wall-image-upload" class="icon camera" title="$upload"></a></div>
+ <div id="profile-upload-wrapper" style="display: {{$visitor}};" >
+ <div id="wall-image-upload-div" ><i id="wall-image-upload" class="icon-camera jot-icons" title="{{$upload}}"></i></div>
</div>
- <div id="profile-attach-wrapper" style="display: $visitor;" >
- <div id="wall-file-upload-div" ><a href="#" onclick="return false;" id="wall-file-upload" class="icon attach" title="$attach"></a></div>
+ <div id="profile-attach-wrapper" style="display: {{$visitor}};" >
+ <div id="wall-file-upload-div" ><i id="wall-file-upload" class="icon-paper-clip jot-icons" title="{{$attach}}"></i></div>
</div>
- <div id="profile-link-wrapper" style="display: $visitor;" ondragenter="linkdropper(event);" ondragover="linkdropper(event);" ondrop="linkdrop(event);" >
- <a id="profile-link" class="icon link" title="$weblink" ondragenter="return linkdropper(event);" ondragover="return linkdropper(event);" ondrop="linkdrop(event);" onclick="jotGetLink(); return false;"></a>
+ <div id="profile-link-wrapper" style="display: {{$visitor}};" ondragenter="linkdropper(event);" ondragover="linkdropper(event);" ondrop="linkdrop(event);" >
+ <i id="profile-link" class="icon-link jot-icons" title="{{$weblink}}" ondragenter="return linkdropper(event);" ondragover="return linkdropper(event);" ondrop="linkdrop(event);" onclick="jotGetLink(); return false;"></i>
</div>
- <div id="profile-video-wrapper" style="display: $visitor;" >
- <a id="profile-video" class="icon video" title="$video" onclick="jotVideoURL();return false;"></a>
+ <div id="profile-video-wrapper" style="display: {{$visitor}};" >
+ <i id="profile-video" class="icon-facetime-video jot-icons" title="{{$video}}" onclick="jotVideoURL();return false;"></i>
</div>
- <div id="profile-audio-wrapper" style="display: $visitor;" >
- <a id="profile-audio" class="icon audio" title="$audio" onclick="jotAudioURL();return false;"></a>
+ <div id="profile-audio-wrapper" style="display: {{$visitor}};" >
+ <i id="profile-audio" class="icon-volume-up jot-icons" title="{{$audio}}" onclick="jotAudioURL();return false;"></i>
</div>
- <div id="profile-location-wrapper" style="display: $visitor;" >
- <a id="profile-location" class="icon globe" title="$setloc" onclick="jotGetLocation();return false;"></a>
+ <div id="profile-location-wrapper" style="display: {{$visitor}};" >
+ <i id="profile-location" class="icon-globe jot-icons" title="{{$setloc}}" onclick="jotGetLocation();return false;"></i>
</div>
<div id="profile-nolocation-wrapper" style="display: none;" >
- <a id="profile-nolocation" class="icon noglobe" title="$noloc" onclick="jotClearLocation();return false;"></a>
+ <i id="profile-nolocation" class="icon-circle-blank jot-icons" title="{{$noloc}}" onclick="jotClearLocation();return false;"></i>
+ </div>
+ <div id="profile-expire-wrapper" style="display: {{$feature_expire}};" >
+ <i id="profile-expires" class="icon-eraser jot-icons" title="{{$expires}}" onclick="jotGetExpiry();return false;"></i>
</div>
+ <div id="profile-encrypt-wrapper" style="display: {{$feature_encrypt}};" >
+ <i id="profile-encrypt" class="icon-key jot-icons" title="{{$encrypt}}" onclick="red_encrypt('{{$cipher}}','#profile-jot-text',$('#profile-jot-text').val());return false;"></i>
+ </div>
+
+
+ <div id="profile-rotator-wrapper" style="display: {{$visitor}};" >
+ <div id="profile-rotator"></div>
+ </div>
- <div id="profile-jot-perms" class="profile-jot-perms" style="display: $pvisit;" >
- <a href="#profile-jot-acl-wrapper" id="jot-perms-icon" class="icon $lockstate" title="$permset" ></a>$bang
+ {{if $showacl}}
+ <div id="profile-jot-perms" class="profile-jot-perms" style="display: {{$pvisit}};" >
+ <a href="#profile-jot-acl-wrapper" id="jot-perms-icon" class="icon {{$lockstate}}" title="{{$permset}}" ></a>{{$bang}}
</div>
+ {{/if}}
- {{ if $preview }}<span onclick="preview_post();" id="jot-preview-link" class="fakelink">$preview</span>{{ endif }}
+ {{if $preview}}<span onclick="preview_post();" id="jot-preview-link"><i class="icon-eye-open jot-icons" title="{{$preview}}"></i></span>{{/if}}
<div id="profile-jot-perms-end"></div>
<div id="profile-jot-plugin-wrapper">
- $jotplugins
+ {{$jotplugins}}
</div>
- <div id="profile-rotator-wrapper" style="display: $visitor;" >
- <img id="profile-rotator" src="images/rotator.gif" alt="$wait" title="$wait" style="display: none;" />
- </div>
-
<div id="jot-preview-content" style="display:none;"></div>
<div style="display: none;">
<div id="profile-jot-acl-wrapper" style="width:auto;height:auto;overflow:auto;">
- $acl
+ {{$acl}}
<hr style="clear:both"/>
- $jotnets
+ {{$jotnets}}
</div>
</div>
+<!-- Modal for item expiry-->
+<div class="modal fade" id="expiryModal" tabindex="-1" role="dialog" aria-labelledby="expiryModalLabel" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title" id="expiryModalLabel">{{$expires}}</h4>
+ </div>
+ <!-- <div class="modal-body"> -->
+ <div class="modal-body form-group" style="width:90%">
+ <div class="input-group input-group-sm date" id="datetimepicker1">
+ <span class="input-group-addon"><!-- <span class="glyphicon glyphicon-calendar"></span> -->
+ <span class="icon-calendar"></span>
+ </span>
+ <input id="expiration-date" type='text' class="form-control" data-format="YYYY-MM-DD HH:mm" size="20"/>
+ </div>
+ </div>
+ <!-- </div> -->
+ <div class="modal-footer">
+ <button type="button" class="btn btn-default" data-dismiss="modal">{{$expiryModalCANCEL}}</button>
+ <button id="expiry-modal-OKButton" type="button" class="btn btn-primary">{{$expiryModalOK}}</button>
+ </div>
+ </div><!-- /.modal-content -->
+ </div><!-- /.modal-dialog -->
+</div><!-- /.modal -->
+<script type="text/javascript">
+ $(function() {
+ $('#datetimepicker1').datetimepicker({
+ language: 'us',
+ icons: {
+ time: "icon-time",
+ date: "icon-calendar",
+ up: "icon-arrow-up",
+ down: "icon-arrow-down"
+ }
+ });
+ });
+</script>
+</div>
+
+
-</div>
<div id="profile-jot-end"></div>
</form>
</div>
- {{ if $content }}<script>initEditor();</script>{{ endif }}
+ {{if $content}}<script>initEditor();</script>{{/if}}
diff --git a/view/tpl/jot_geotag.tpl b/view/tpl/jot_geotag.tpl
index b0f71e73b..7a398b612 100644..100755
--- a/view/tpl/jot_geotag.tpl
+++ b/view/tpl/jot_geotag.tpl
@@ -1,4 +1,3 @@
-
if(navigator.geolocation) {
navigator.geolocation.getCurrentPosition(function(position) {
$('#jot-coord').val(position.coords.latitude + ' ' + position.coords.longitude);
diff --git a/view/tpl/js_strings.tpl b/view/tpl/js_strings.tpl
index babb1b219..144ecb17c 100644..100755
--- a/view/tpl/js_strings.tpl
+++ b/view/tpl/js_strings.tpl
@@ -1,33 +1,34 @@
-
<script>
var aStr = {
- 'delitem' : '$delitem',
- 'comment' : '$comment',
- 'showmore' : '$showmore',
- 'showfewer' : '$showfewer',
- 'pwshort' : '$pwshort',
- 'pwnomatch' : '$pwnomatch',
- 'everybody' : '$everybody',
+ 'delitem' : '{{$delitem}}',
+ 'comment' : '{{$comment}}',
+ 'showmore' : '{{$showmore}}',
+ 'showfewer' : '{{$showfewer}}',
+ 'pwshort' : '{{$pwshort}}',
+ 'pwnomatch' : '{{$pwnomatch}}',
+ 'everybody' : '{{$everybody}}',
+ 'passphrase' : '{{$passphrase}}',
+ 'passhint' : '{{$passhint}}',
- 't01' : $t01,
- 't02' : $t02,
- 't03' : '$t03',
- 't04' : '$t04',
- 't05' : '$t05',
- 't06' : '$t06',
- 't07' : '$t07',
- 't08' : '$t08',
- 't09' : '$t09',
- 't10' : '$t10',
- 't11' : '$t11',
- 't12' : '$t12',
- 't13' : '$t13',
- 't14' : '$t14',
- 't15' : '$t15',
- 't16' : '$t16',
- 't17' : '$t17',
+ 't01' : {{$t01}},
+ 't02' : {{$t02}},
+ 't03' : '{{$t03}}',
+ 't04' : '{{$t04}}',
+ 't05' : '{{$t05}}',
+ 't06' : '{{$t06}}',
+ 't07' : '{{$t07}}',
+ 't08' : '{{$t08}}',
+ 't09' : '{{$t09}}',
+ 't10' : '{{$t10}}',
+ 't11' : '{{$t11}}',
+ 't12' : '{{$t12}}',
+ 't13' : '{{$t13}}',
+ 't14' : '{{$t14}}',
+ 't15' : '{{$t15}}',
+ 't16' : '{{$t16}}',
+ 't17' : '{{$t17}}',
};
</script>
diff --git a/view/tpl/lang_selector.tpl b/view/tpl/lang_selector.tpl
index e777a0a86..159eeea7e 100644..100755
--- a/view/tpl/lang_selector.tpl
+++ b/view/tpl/lang_selector.tpl
@@ -1,10 +1,10 @@
-<div id="lang-select-icon" class="icon s22 language" title="$title" onclick="openClose('language-selector');" ></div>
+<div id="lang-select-icon" title="{{$title}}" onclick="openClose('language-selector');" ><i class="icon-flag"></i></div>
<div id="language-selector" style="display: none;" >
<form action="#" method="post" >
<select name="system_language" onchange="this.form.submit();" >
- {{ for $langs.0 as $v=>$l }}
- <option value="$v" {{if $v==$langs.1}}selected="selected"{{endif}}>$l</option>
- {{ endfor }}
+ {{foreach $langs.0 as $v=>$l}}
+ <option value="{{$v}}" {{if $v==$langs.1}}selected="selected"{{/if}}>{{$l}}</option>
+ {{/foreach}}
</select>
</form>
</div>
diff --git a/view/tpl/like_noshare.tpl b/view/tpl/like_noshare.tpl
index 2651ea1f8..60ba14d8c 100644..100755
--- a/view/tpl/like_noshare.tpl
+++ b/view/tpl/like_noshare.tpl
@@ -1,5 +1,5 @@
-<div class="wall-item-like-buttons" id="wall-item-like-buttons-$id">
- <a href="#" class="icon like" title="$likethis" onclick="dolike($id,'like'); return false"></a>
- <a href="#" class="icon dislike" title="$nolike" onclick="dolike($id,'dislike'); return false"></a>
- <img id="like-rotator-$id" class="like-rotator" src="images/rotator.gif" alt="$wait" title="$wait" style="display: none;" />
+<div class="wall-item-like-buttons" id="wall-item-like-buttons-{{$id}}">
+ <i class="icon-thumbs-up-alt item-tool" title="{{$likethis}}" onclick="dolike({{$id}},'like'); return false"></i>
+ <i class="icon-thumbs-down-alt item-tool" title="{{$nolike}}" onclick="dolike({{$id}},'dislike'); return false"></i>
+ <div id="like-rotator-{{$id}}" class="like-rotator"></div>
</div>
diff --git a/view/tpl/list_things.tpl b/view/tpl/list_things.tpl
new file mode 100644
index 000000000..fb8935d82
--- /dev/null
+++ b/view/tpl/list_things.tpl
@@ -0,0 +1,13 @@
+{{if $things}}
+{{foreach $things as $key => $items}}
+<b>{{$items.profile}} {{$key}}</b>
+<ul class="profile-thing-list">
+{{foreach $items as $item}}
+<li>{{if $item.img}}<img src="{{$item.img}}" width="100" height="100" alt="{{$item.term}}" />{{/if}}
+<a href="{{$item.url}}" >{{$item.term}}</a>
+</li>
+{{/foreach}}
+</ul>
+<div class="clear"></div>
+{{/foreach}}
+{{/if}}
diff --git a/view/tpl/login.tpl b/view/tpl/login.tpl
index 149c46e4c..3ca118590 100644..100755
--- a/view/tpl/login.tpl
+++ b/view/tpl/login.tpl
@@ -1,31 +1,30 @@
-
-<form action="$dest_url" id="$form_id" method="post" >
+<form action="{{$dest_url}}" id="{{$form_id}}" method="post" >
<input type="hidden" name="auth-params" value="login" />
<div id="login_standard">
- {{ inc field_input.tpl with $field=$lname }}{{ endinc }}
- {{ inc field_password.tpl with $field=$lpassword }}{{ endinc }}
+ {{include file="field_input.tpl" field=$lname}}
+ {{include file="field_password.tpl" field=$lpassword}}
</div>
<div id="login-extra-links">
- {{ if $register }}<a href="$register.link" title="$register.title" id="register-link">$register.desc</a>{{ endif }}
- <a href="lostpass" title="$lostpass" id="lost-password-link" >$lostlink</a>
+ {{if $register}}<a href="{{$register.link}}" title="{{$register.title}}" id="register-link">{{$register.desc}}</a>{{/if}}
+ <a href="lostpass" title="{{$lostpass}}" id="lost-password-link" >{{$lostlink}}</a>
</div>
- {{ inc field_checkbox.tpl with $field=$remember }}{{ endinc }}
+ {{include file="field_checkbox.tpl" field=$remember}}
<div id="login-standard-end"></div>
<div id="login-submit-wrapper" >
- <input type="submit" name="submit" id="login-submit-button" value="$login" />
+ <input type="submit" name="submit" id="login-submit-button" value="{{$login}}" />
</div>
- {{ for $hiddens as $k=>$v }}
- <input type="hidden" name="$k" value="$v" />
- {{ endfor }}
+ {{foreach $hiddens as $k=>$v}}
+ <input type="hidden" name="{{$k}}" value="{{$v}}" />
+ {{/foreach}}
</form>
-<script type="text/javascript"> $(document).ready(function() { $("#id_$lname.0").focus();} );</script>
+<script type="text/javascript"> $(document).ready(function() { $("#id_{{$lname.0}}").focus();} );</script>
diff --git a/view/tpl/logout.tpl b/view/tpl/logout.tpl
index efc971df8..7548ed196 100644..100755
--- a/view/tpl/logout.tpl
+++ b/view/tpl/logout.tpl
@@ -1,6 +1,6 @@
-<form action="$dest_url" method="post" >
+<form action="{{$dest_url}}" method="post" >
<div class="logout-wrapper">
<input type="hidden" name="auth-params" value="logout" />
-<input type="submit" name="submit" id="logout-button" value="$logout" />
+<input type="submit" name="submit" id="logout-button" value="{{$logout}}" />
</div>
</form>
diff --git a/view/tpl/lostpass.tpl b/view/tpl/lostpass.tpl
index cd3644157..f6fdb28d7 100644..100755
--- a/view/tpl/lostpass.tpl
+++ b/view/tpl/lostpass.tpl
@@ -1,17 +1,17 @@
-<h3>$title</h3>
+<h3>{{$title}}</h3>
<p id="lostpass-desc">
-$desc
+{{$desc}}
</p>
<form action="lostpass" method="post" >
<div id="login-name-wrapper">
- <label for="login-name" id="label-login-name">$name</label>
+ <label for="login-name" id="label-login-name">{{$name}}</label>
<input type="text" maxlength="60" name="login-name" id="login-name" value="" />
</div>
<div id="login-extra-end"></div>
<div id="login-submit-wrapper" >
- <input type="submit" name="submit" id="lostpass-submit-button" value="$submit" />
+ <input type="submit" name="submit" id="lostpass-submit-button" value="{{$submit}}" />
</div>
<div id="login-submit-end"></div>
</form>
diff --git a/view/tpl/magicsig.tpl b/view/tpl/magicsig.tpl
deleted file mode 100644
index 75f9bc475..000000000
--- a/view/tpl/magicsig.tpl
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<me:env xmlns:me="http://salmon-protocol.org/ns/magic-env">
-<me:data type="application/atom+xml">
-$data
-</me:data>
-<me:encoding>$encoding</me:encoding>
-<me:alg>$algorithm</me:alg>
-<me:sig key_id="$keyhash">$signature</me:sig>
-</me:env>
diff --git a/view/tpl/mail_conv.tpl b/view/tpl/mail_conv.tpl
index fe115d223..f794ffc78 100644..100755
--- a/view/tpl/mail_conv.tpl
+++ b/view/tpl/mail_conv.tpl
@@ -1,13 +1,17 @@
<div class="mail-conv-outside-wrapper">
<div class="mail-conv-sender" >
- <a href="$mail.from_url" class="mail-conv-sender-url" ><img class="mframe mail-conv-sender-photo$mail.sparkle" src="$mail.from_photo" heigth="80" width="80" alt="$mail.from_name" /></a>
- <div class="mail-conv-sender-name" >$mail.from_name</div>
+ <a href="{{$mail.from_url}}" class="mail-conv-sender-url" ><img class="mframe mail-conv-sender-photo{{$mail.sparkle}}" src="{{$mail.from_photo}}" heigth="80" width="80" alt="{{$mail.from_name}}" /></a>
+ <div class="mail-conv-sender-name" >{{$mail.from_name}}</div>
</div>
<div class="mail-conv-detail" >
- <div class="mail-conv-date">$mail.date</div>
- <div class="mail-conv-subject">$mail.subject</div>
- <div class="mail-conv-body">$mail.body</div>
- <div class="mail-conv-delete-wrapper" id="mail-conv-delete-wrapper-$mail.id" ><a href="message/drop/$mail.id" class="icon drophide delete-icon mail-list-delete-icon" onclick="return confirmDelete();" title="$mail.delete" id="mail-conv-delete-icon-$mail.id" class="mail-conv-delete-icon" onmouseover="imgbright(this);" onmouseout="imgdull(this);" ></a></div><div class="mail-conv-delete-end"></div>
+ {{if $mail.is_recalled}}<strong>{{$mail.is_recalled}}</strong>{{/if}}
+ <div class="mail-conv-date">{{$mail.date}}</div>
+ <div class="mail-conv-subject">{{$mail.subject}}</div>
+ <div class="mail-conv-body">{{$mail.body}}</div>
+ <div class="mail-conv-delete-wrapper" id="mail-conv-delete-wrapper-{{$mail.id}}" ><a href="mail/drop/{{$mail.id}}" onclick="return confirmDelete();" title="{{$mail.delete}}" id="mail-conv-delete-icon-{{$mail.id}}" class="mail-conv-delete-icon" ><i class="icon-remove mail-icons drop-icons"></i></a></div><div class="mail-conv-delete-end"></div>
+ {{if $mail.can_recall}}
+ <div class="mail-conv-recall-wrapper" id="mail-conv-recall-wrapper-{{$mail.id}}" ><a href="mail/recall/{{$mail.id}}" title="{{$mail.recall}}" id="mail-conv-recall-icon-{{$mail.id}}" class="mail-conv-recall-icon" ><i class="icon-undo mail-icons drop-icons"></i></a></div><div class="mail-conv-recall-end"></div>
+ {{/if}}
<div class="mail-conv-outside-wrapper-end"></div>
</div>
</div>
diff --git a/view/tpl/mail_display.tpl b/view/tpl/mail_display.tpl
index 8fbc12929..523a9160a 100644..100755
--- a/view/tpl/mail_display.tpl
+++ b/view/tpl/mail_display.tpl
@@ -1,10 +1,12 @@
+<h3>{{$prvmsg_header}}</h3>
+<div class="generic-content-wrapper">
+{{foreach $mails as $mail}}
+ {{include file="mail_conv.tpl"}}
+{{/foreach}}
-{{ for $mails as $mail }}
- {{ inc mail_conv.tpl }}{{endinc}}
-{{ endfor }}
-
-{{ if $canreply }}
-{{ inc prv_message.tpl }}{{ endinc }}
-{{ else }}
-$unknown_text
-{{endif }} \ No newline at end of file
+{{if $canreply}}
+{{include file="prv_message.tpl"}}
+{{else}}
+{{$unknown_text}}
+{{/if}}
+</div>
diff --git a/view/tpl/mail_head.tpl b/view/tpl/mail_head.tpl
index afb65f537..1cd7145e7 100644..100755
--- a/view/tpl/mail_head.tpl
+++ b/view/tpl/mail_head.tpl
@@ -1,3 +1,3 @@
-<h3>$messages</h3>
+<h3>{{$messages}}</h3>
-$tab_content
+{{$tab_content}}
diff --git a/view/tpl/mail_list.tpl b/view/tpl/mail_list.tpl
index 4417d1863..e17a206a0 100644..100755
--- a/view/tpl/mail_list.tpl
+++ b/view/tpl/mail_list.tpl
@@ -1,19 +1,8 @@
-<div class="mail-list-outside-wrapper">
- <div class="mail-list-sender" >
- <a href="$from_url" class="mail-list-sender-url" ><img class="mail-list-sender-photo" src="$from_photo" height="32" width="32" alt="$from_name" /></a>
- <div class="mail-list-sender-name" >$from_name</div>
- </div>
- <div class="mail-list-recip" >
- <a href="$to_url" class="mail-list-recip-url" ><img class="mail-list-recip-photo" src="$to_photo" height="32" width="32" alt="$to_name" /></a>
- <div class="mail-list-recip-name" >$to_name</div>
- </div>
- <div class="mail-list-date">$date</div>
- <div class="mail-list-subject"><a href="message/$id" class="mail-list-link">$subject</a></div>
- <div class="mail-list-delete-wrapper" id="mail-list-delete-wrapper-$id" >
- <a href="message/dropconv/$id" onclick="return confirmDelete();" title="$delete" class="icon drophide mail-list-delete delete-icon" onmouseover="imgbright(this);" onmouseout="imgdull(this);" ></a>
- </div>
+<div class="generic-content-wrapper" id="mail-list-wrapper">
+ <a href="{{$from_url}}" class ="mail-list" ><img class="mail-list-sender-photo" src="{{$from_photo}}" alt="{{$from_name}}" /></a>
+ <span class="mail-list">{{$from_name}}</span>
+ <span class="mail-list {{if $seen}}seen{{else}}unseen{{/if}}"><a href="mail/{{$id}}" class="mail-link">{{$subject}}</a></span>
+ <span class="mail-list" title="{{$date}}">{{$date}}</span>
+ <span class="mail-list mail-list-remove"><a href="message/dropconv/{{$id}}" onclick="return confirmDelete();" title="{{$delete}}" ><i class="icon-remove mail-icons drop-icons"></i></a></span>
+ <div class="clear">&nbsp;</div>
</div>
-</div>
-<div class="mail-list-delete-end"></div>
-
-<div class="mail-list-outside-wrapper-end"></div>
diff --git a/view/tpl/main_slider.tpl b/view/tpl/main_slider.tpl
index 662677684..fbc290df1 100644..100755
--- a/view/tpl/main_slider.tpl
+++ b/view/tpl/main_slider.tpl
@@ -1,17 +1,27 @@
-<div id="main-slider" class="slider" ><input id="main-range" type="text" name="cminmax" value="$val" /></div>
+<div id="main-slider" class="slider" ><input id="main-range" type="text" name="cminmax" value="{{$val}}" /></div>
<script>
- $("#main-range").slider({ from: 0, to: 99, step: 1, scale: ['$me', '|', '$intimate', '|', '$friends', '|', '$oldfriends', '|', '$acquaintances', '|', '$world' ], onstatechange: function(v) {
- var carr = v.split(";");
- bParam_cmin = carr[0];
- bParam_cmax = carr[1];
- networkRefresh();
- } });
+ var old_cmin = 0;
+ var old_cmax = 99;
+ $("#main-range").slider({ from: 0, to: 99, step: 1, scale: ['{{$me}}', '|', '{{$intimate}}', '|', '{{$friends}}', '|', '{{$oldfriends}}', '|', '{{$acquaintances}}', '|', '{{$world}}' ], onstatechange: function(v) {
+ var carr = v.split(";");
+ if(carr[0] != bParam_cmin) {
+ old_cmin = bParam_cmin;
+ bParam_cmin = carr[0];
+ }
+ if(carr[1] != bParam_cmax) {
+ old_cmax = bParam_cmax;
+ bParam_cmax = carr[1];
+ }
+ networkRefresh();
+ } });
var slideTimer = null;
function networkRefresh() {
if((document.readyState !== "complete") || (slideTimer !== null))
return;
- setTimeout(function() { $("#profile-jot-text-loading").show(); }, 1000 );
+ if((bParam_cmin == old_cmin) && (bParam_cmax == old_cmax))
+ return;
+ setTimeout(function() { $("#profile-jot-text-loading").spin('small'); }, 1000 );
slideTimer = setTimeout(networkTimerRefresh,2000);
}
diff --git a/view/tpl/match.tpl b/view/tpl/match.tpl
index b052845ae..0688ca26b 100644..100755
--- a/view/tpl/match.tpl
+++ b/view/tpl/match.tpl
@@ -1,16 +1,16 @@
<div class="profile-match-wrapper">
<div class="profile-match-photo">
- <a href="$url">
- <img src="$photo" alt="$name" title="$name[$tags]" />
+ <a href="{{$url}}">
+ <img src="{{$photo}}" alt="{{$name}}" title="{{$name}}[{{$tags}}]" />
</a>
</div>
<div class="profile-match-break"></div>
<div class="profile-match-name">
- <a href="$url" title="$name[$tags]">$name</a>
+ <a href="{{$url}}" title="{{$name}}[{{$tags}}]">{{$name}}</a>
</div>
<div class="profile-match-end"></div>
- {{ if $connlnk }}
- <div class="profile-match-connect"><a href="$connlnk" title="$conntxt">$conntxt</a></div>
- {{ endif }}
+ {{if $connlnk}}
+ <div class="profile-match-connect"><a href="{{$connlnk}}" title="{{$conntxt}}">{{$conntxt}}</a></div>
+ {{/if}}
</div>
diff --git a/view/tpl/menuedit.tpl b/view/tpl/menuedit.tpl
new file mode 100644
index 000000000..ea9e775e2
--- /dev/null
+++ b/view/tpl/menuedit.tpl
@@ -0,0 +1,21 @@
+
+<h2>{{$header}}</h2>
+
+{{if $menu_id}}
+<a href="mitem/{{$menu_id}}" title="{{$hintedit}}">{{$editcontents}}</a>
+{{/if}}
+
+<form id="menuedit" action="menu{{if $menu_id}}/{{$menu_id}}{{/if}}" method="post" >
+
+{{if $menu_id}}
+<input type="hidden" name="menu_id" value="{{$menu_id}}" />
+{{/if}}
+
+{{include file="field_input.tpl" field=$menu_name}}
+{{include file="field_input.tpl" field=$menu_desc}}
+
+<div class="menuedit-submit-wrapper" >
+<input type="submit" name="submit" class="menuedit-submit" value="{{$submit}}" />
+</div>
+
+</form>
diff --git a/view/tpl/menulist.tpl b/view/tpl/menulist.tpl
new file mode 100644
index 000000000..271bace82
--- /dev/null
+++ b/view/tpl/menulist.tpl
@@ -0,0 +1,16 @@
+<h1>{{$title}}</h1>
+
+<a href="menu/new" title="{{$hintnew}}">{{$hintnew}}</a>
+
+<br />
+
+{{if $menus }}
+<ul id="menulist">
+{{foreach $menus as $m }}
+<li><a href="menu/{{$m.menu_id}}" title="{{$hintedit}}"><i class="icon-pencil design-icons design-edit-icon"></i></a> <a href="menu/{{$m.menu_id}}/drop" title={{$hintdrop}}><i class="icon-remove drop-icons design-icons design-remove-icon"></i></a>&nbsp;&nbsp;&nbsp;&nbsp;<a href="mitem/{{$m.menu_id}}/new" title="{{$hintcontent}}">{{$m.menu_name}}</a></li>
+{{/foreach}}
+</ul>
+{{/if}}
+
+
+
diff --git a/view/tpl/message_side.tpl b/view/tpl/message_side.tpl
index fce771bd5..4db427fa7 100644..100755
--- a/view/tpl/message_side.tpl
+++ b/view/tpl/message_side.tpl
@@ -1,10 +1,11 @@
<div id="message-sidebar" class="widget">
- <div id="message-new"><a href="$new.url" class="{{ if $new.sel }}newmessage-selected{{ endif }}">$new.label</a> </div>
+ <div id="message-check"><a href="{{$check.url}}" class="{{if $check.sel}}checkmessage-selected{{/if}}">{{$check.label}}</a> </div>
+ <div id="message-new"><a href="{{$new.url}}" class="{{if $new.sel}}newmessage-selected{{/if}}">{{$new.label}}</a> </div>
<ul class="message-ul">
- {{ for $tabs as $t }}
- <li class="tool"><a href="$t.url" class="message-link{{ if $t.sel }}message-selected{{ endif }}">$t.label</a></li>
- {{ endfor }}
+ {{foreach $tabs as $t}}
+ <li class="tool"><a href="{{$t.url}}" class="message-link{{if $t.sel}}message-selected{{/if}}">{{$t.label}}</a></li>
+ {{/foreach}}
</ul>
</div>
diff --git a/view/tpl/micropro_img.tpl b/view/tpl/micropro_img.tpl
index 06df22d7b..23b7bd281 100644..100755
--- a/view/tpl/micropro_img.tpl
+++ b/view/tpl/micropro_img.tpl
@@ -1 +1 @@
-<div class="contact-block-div{{if $class}} $class{{endif}}"><a class="contact-block-link{{if $class}} $class{{endif}}{{if $click}} fakelink{{endif}}" href="{{if $click}}#{{else}}$url{{endif}}" {{if $click}}onclick="$click"{{endif}}><img class="contact-block-img{{if $class}} $class{{endif}}" src="$photo" title="$title" alt="$name" /></a></div>
+<div class="contact-block-div{{if $class}} {{$class}}{{/if}}"><a class="contact-block-link{{if $class}} {{$class}}{{/if}}{{if $click}} fakelink{{/if}}" href="{{if $click}}#{{else}}{{$url}}{{/if}}" {{if $click}}onclick="{{$click}}"{{/if}}><img class="contact-block-img{{if $class}} {{$class}}{{/if}}" src="{{$photo}}" title="{{$title}}" alt="{{$name}}" /></a></div>
diff --git a/view/tpl/micropro_txt.tpl b/view/tpl/micropro_txt.tpl
index 6a6ef6392..295e7940d 100644..100755
--- a/view/tpl/micropro_txt.tpl
+++ b/view/tpl/micropro_txt.tpl
@@ -1 +1 @@
-<div class="contact-block-textdiv{{if $class}} $class{{endif}}"><a class="contact-block-link{{if $class}} $class{{endif}}{{if $click}} fakelink{{endif}}" href="{{if $click}}#{{else}}$url{{endif}}" {{if $click}}onclick="$click"{{endif}} title="$title">$name</a></div>
+<div class="contact-block-textdiv{{if $class}} {{$class}}{{/if}}"><a class="contact-block-link{{if $class}} {{$class}}{{/if}}{{if $click}} fakelink{{/if}}" href="{{if $click}}#{{else}}{{$url}}{{/if}}" {{if $click}}onclick="{{$click}}"{{/if}} title="{{$title}}">{{$name}}</a></div>
diff --git a/view/tpl/mitemedit.tpl b/view/tpl/mitemedit.tpl
new file mode 100644
index 000000000..8f13f80c9
--- /dev/null
+++ b/view/tpl/mitemedit.tpl
@@ -0,0 +1,41 @@
+
+<h2>{{$header}}</h2>
+
+<form id="mitemedit" action="mitem/{{$menu_id}}{{if $mitem_id}}/{{$mitem_id}}{{/if}}" method="post" >
+
+<input type="hidden" name="menu_id" value="{{$menu_id}}" />
+
+{{if $mitem_id}}
+<input type="hidden" name="mitem_id" value="{{$mitem_id}}" />
+{{/if}}
+
+{{include file="field_input.tpl" field=$mitem_desc}}
+{{include file="field_input.tpl" field=$mitem_link}}
+{{include file="field_input.tpl" field=$mitem_order}}
+{{include file="field_checkbox.tpl" field=$usezid}}
+{{include file="field_checkbox.tpl" field=$newwin}}
+
+<div id="settings-default-perms" class="settings-default-perms" >
+ <a href="#profile-jot-acl-wrapper" id="settings-default-perms-menu" >{{$permissions}} {{$permdesc}}</a>
+ <div id="settings-default-perms-menu-end"></div>
+
+ <div id="settings-default-perms-select" style="display: none; margin-bottom: 20px" >
+
+ <div style="display: none;">
+ <div id="profile-jot-acl-wrapper" style="width:auto;height:auto;overflow:auto;">
+ {{$aclselect}}
+ </div>
+ </div>
+
+ </div>
+</div>
+<br/>
+<div id="settings-default-perms-end"></div>
+
+
+
+<div class="mitemedit-submit-wrapper" >
+<input type="submit" name="submit" class="mitemedit-submit" value="{{$submit}}" />
+</div>
+
+</form>
diff --git a/view/tpl/mitemlist.tpl b/view/tpl/mitemlist.tpl
new file mode 100644
index 000000000..057665d49
--- /dev/null
+++ b/view/tpl/mitemlist.tpl
@@ -0,0 +1,18 @@
+<h1>{{$title}}</h1>
+<h2>{{$menudesc}} ({{$menuname}})</h2>
+
+<a href="menu/{{$menu_id}}" title="{{$hintmenu}}">{{$edmenu}}</a><br />
+<a href="mitem/{{$menu_id}}/new" title="{{$hintnew}}">{{$hintnew}}</a>
+
+<br />
+
+{{if $mlist }}
+<ul id="mitemlist">
+{{foreach $mlist as $m }}
+<li><a href="mitem/{{$menu_id}}/{{$m.mitem_id}}" title="{{$hintedit}}">{{$edit}}</a> | <a href="mitem/{{$menu_id}}/{{$m.mitem_id}}/drop" title={{$hintdrop}}>{{$drop}}</a>&nbsp;&nbsp;&nbsp;&nbsp;<a href="mitem/{{$menu_id}}/{{$m.mitem_id}}" title="{{$hintcontent}}">{{$m.mitem_desc}}</a> ({{$m.mitem_link}})</li>
+{{/foreach}}
+</ul>
+{{/if}}
+
+
+
diff --git a/view/tpl/moderated_comment.tpl b/view/tpl/moderated_comment.tpl
deleted file mode 100644
index 911c35f33..000000000
--- a/view/tpl/moderated_comment.tpl
+++ /dev/null
@@ -1,34 +0,0 @@
- <div class="comment-wwedit-wrapper" id="comment-edit-wrapper-$id" style="display: block;">
- <form class="comment-edit-form" id="comment-edit-form-$id" action="item" method="post" onsubmit="post_comment($id); return false;">
- <input type="hidden" name="type" value="$type" />
- <input type="hidden" name="profile_uid" value="$profile_uid" />
- <input type="hidden" name="parent" value="$parent" />
- <input type="hidden" name="return" value="$return_path" />
- <input type="hidden" name="jsreload" value="$jsreload" />
- <input type="hidden" name="preview" id="comment-preview-inp-$id" value="0" />
-
- <div class="comment-edit-photo" id="comment-edit-photo-$id" >
- <a class="comment-edit-photo-link" href="$mylink" title="$mytitle"><img class="my-comment-photo" src="$myphoto" alt="$mytitle" title="$mytitle" /></a>
- </div>
- <div class="comment-edit-photo-end"></div>
- <div id="mod-cmnt-wrap-$id" class="mod-cmnt-wrap" style="display:none">
- <div id="mod-cmnt-name-lbl-$id" class="mod-cmnt-name-lbl">$lbl_modname</div>
- <input type="text" id="mod-cmnt-name-$id" class="mod-cmnt-name" name="mod-cmnt-name" value="$modname" />
- <div id="mod-cmnt-email-lbl-$id" class="mod-cmnt-email-lbl">$lbl_modemail</div>
- <input type="text" id="mod-cmnt-email-$id" class="mod-cmnt-email" name="mod-cmnt-email" value="$modemail" />
- <div id="mod-cmnt-url-lbl-$id" class="mod-cmnt-url-lbl">$lbl_modurl</div>
- <input type="text" id="mod-cmnt-url-$id" class="mod-cmnt-url" name="mod-cmnt-url" value="$modurl" />
- </div>
- <textarea id="comment-edit-text-$id" class="comment-edit-text-empty" name="body" onFocus="commentOpen(this,$id);" onBlur="commentClose(this,$id);" >$comment</textarea>
-
- <div class="comment-edit-text-end"></div>
- <div class="comment-edit-submit-wrapper" id="comment-edit-submit-wrapper-$id" style="display: none;" >
- <input type="submit" onclick="post_comment($id); return false;" id="comment-edit-submit-$id" class="comment-edit-submit" name="submit" value="$submit" />
- <span onclick="preview_comment($id);" id="comment-edit-preview-link-$id" class="fakelink">$preview</span>
- <div id="comment-edit-preview-$id" class="comment-edit-preview" style="display:none;"></div>
- </div>
-
- <div class="comment-edit-end"></div>
- </form>
-
- </div>
diff --git a/view/tpl/mood_content.tpl b/view/tpl/mood_content.tpl
index 9349c56ae..63eaa2d8d 100644..100755
--- a/view/tpl/mood_content.tpl
+++ b/view/tpl/mood_content.tpl
@@ -1,20 +1,20 @@
-<h3>$title</h3>
+<h3>{{$title}}</h3>
-<div id="mood-desc">$desc</div>
+<div id="mood-desc">{{$desc}}</div>
<form action="mood" method="get">
<br />
<br />
-<input id="mood-parent" type="hidden" value="$parent" name="parent" />
+<input id="mood-parent" type="hidden" value="{{$parent}}" name="parent" />
<select name="verb" id="mood-verb-select" >
-{{ for $verbs as $v }}
-<option value="$v.0">$v.1</option>
-{{ endfor }}
+{{foreach $verbs as $v}}
+<option value="{{$v.0}}">{{$v.1}}</option>
+{{/foreach}}
</select>
<br />
<br />
-<input type="submit" name="submit" value="$submit" />
+<input type="submit" name="submit" value="{{$submit}}" />
</form>
diff --git a/view/tpl/msg-header.tpl b/view/tpl/msg-header.tpl
index 2d1ea7a61..b6cff7c74 100644..100755
--- a/view/tpl/msg-header.tpl
+++ b/view/tpl/msg-header.tpl
@@ -1,8 +1,7 @@
-
-<script language="javascript" type="text/javascript" src="$baseurl/library/tinymce/jscripts/tiny_mce/tiny_mce_src.js"></script>
+<script language="javascript" type="text/javascript" src="{{$baseurl}}/library/tinymce/jscripts/tiny_mce/tiny_mce_src.js"></script>
<script language="javascript" type="text/javascript">
-var plaintext = '$editselect';
+var plaintext = '{{$editselect}}';
if(plaintext != 'none') {
tinyMCE.init({
@@ -25,7 +24,7 @@ if(plaintext != 'none') {
force_br_newlines : true,
forced_root_block : '',
convert_urls: false,
- content_css: "$baseurl/view/custom_tinymce.css",
+ content_css: "{{$baseurl}}/view/custom_tinymce.css",
//Character count
theme_advanced_path : false,
setup : function(ed) {
@@ -46,17 +45,29 @@ else
</script>
-<script type="text/javascript" src="js/ajaxupload.js" ></script>
+<script type="text/javascript" src="view/js/ajaxupload.js" ></script>
<script>
$(document).ready(function() {
var uploader = new window.AjaxUpload(
'prvmail-upload',
- { action: 'wall_upload/$nickname',
+ { action: 'wall_upload/{{$nickname}}',
+ name: 'userfile',
+ onSubmit: function(file,ext) { $('#profile-rotator').spin('tiny'); },
+ onComplete: function(file,response) {
+ addeditortext(response);
+ $('#profile-rotator').spin(false);
+ }
+ }
+ );
+
+ var file_uploader = new window.AjaxUpload(
+ 'prvmail-attach',
+ { action: 'wall_attach/{{$nickname}}',
name: 'userfile',
- onSubmit: function(file,ext) { $('#profile-rotator').show(); },
+ onSubmit: function(file,ext) { $('#profile-rotator').spin('tiny'); },
onComplete: function(file,response) {
- tinyMCE.execCommand('mceInsertRawHTML',false,response);
- $('#profile-rotator').hide();
+ addeditortext(response);
+ $('#profile-rotator').spin(false);
}
}
);
@@ -64,16 +75,23 @@ else
});
function jotGetLink() {
- reply = prompt("$linkurl");
+ reply = prompt("{{$linkurl}}");
if(reply && reply.length) {
- $('#profile-rotator').show();
+ $('#profile-rotator').spin('tiny');
$.get('parse_url?url=' + reply, function(data) {
- tinyMCE.execCommand('mceInsertRawHTML',false,data);
- $('#profile-rotator').hide();
+ addeditortext(response);
+ $('#profile-rotator').spin(false);
});
}
}
+ function prvmailGetExpiry() {
+ reply = prompt("{{$expireswhen}}", $('#inp-prvmail-expires').val());
+ if(reply && reply.length) {
+ $('#inp-prvmail-expires').val(reply);
+ }
+ }
+
function linkdropper(event) {
var linkFound = event.dataTransfer.types.contains("text/uri-list");
if(linkFound)
@@ -85,13 +103,24 @@ else
event.target.textContent = reply;
event.preventDefault();
if(reply && reply.length) {
- $('#profile-rotator').show();
+ $('#profile-rotator').spin('tiny');
$.get('parse_url?url=' + reply, function(data) {
- tinyMCE.execCommand('mceInsertRawHTML',false,data);
- $('#profile-rotator').hide();
+ addeditortext(response);
+ $('#profile-rotator').spin(false);
});
}
}
+ function addeditortext(data) {
+ if(plaintext == 'none') {
+ var currentText = $("#prvmail-text").val();
+ $("#prvmail-text").val(currentText + data);
+ }
+ else
+ tinyMCE.execCommand('mceInsertRawHTML',false,data);
+ }
+
+
+
</script>
diff --git a/view/tpl/nav.tpl b/view/tpl/nav.tpl
index e98621aa4..f27afed09 100644..100755
--- a/view/tpl/nav.tpl
+++ b/view/tpl/nav.tpl
@@ -1,141 +1,145 @@
<header>
- <div id="site-location">$sitelocation</div>
- <div id="banner">$banner</div>
+ <div id="site-location">{{$sitelocation}}</div>
+ <div id="banner">{{$banner}}</div>
</header>
<nav>
<ul>
- {{ if $nav.lock }}
+
+ {{if $userinfo}}
+ <li id="nav-user-linkmenu" class="nav-menu-icon"><a href="#" rel="#nav-user-menu" title="{{$userinfo.name}}"><img src="{{$userinfo.icon}}" alt="{{$userinfo.name}}"><span class="nav-dropdown-indicator">&#x25BC;</span></a>
+ {{if $localuser}}
+ <ul id="nav-user-menu" class="menu-popup">
+ {{foreach $nav.usermenu as $usermenu}}
+ <li><a class="{{$usermenu.2}}" href="{{$usermenu.0}}" title="{{$usermenu.3}}">{{$usermenu.1}}</a></li>
+ {{/foreach}}
+ {{if $nav.profiles}}<li><a class="{{$nav.profiles.2}}" href="{{$nav.profiles.0}}" title="{{$nav.profiles.3}}">{{$nav.profiles.1}}</a></li>{{/if}}
+ {{if $nav.manage}}<li><a class="{{$nav.manage.2}}" href="{{$nav.manage.0}}" title="{{$nav.manage.3}}">{{$nav.manage.1}}</a></li>{{/if}}
+ {{if $nav.contacts}}<li><a class="{{$nav.contacts.2}}" href="{{$nav.contacts.0}}" title="{{$nav.contacts.3}}" >{{$nav.contacts.1}}</a></li>{{/if}}
+ {{if $nav.settings}}<li><a class="{{$nav.settings.2}}" href="{{$nav.settings.0}}" title="{{$nav.settings.3}}">{{$nav.settings.1}}</a></li>{{/if}}
+
+ {{if $nav.admin}}<li><a class="{{$nav.admin.2}}" href="{{$nav.admin.0}}" title="{{$nav.admin.3}}" >{{$nav.admin.1}}</a></li>{{/if}}
+
+ {{if $nav.logout}}<li><a class="menu-sep {{$nav.logout.2}}" href="{{$nav.logout.0}}" title="{{$nav.logout.3}}" >{{$nav.logout.1}}</a></li>{{/if}}
+
+ </ul>
+ {{/if}}
+ </li>
+ {{/if}}
+
+
+ {{if $nav.lock}}
<li id="nav-rmagic-link" class="nav-menu-icon" >
- <a class="icon $nav.lock.2" href="$nav.lock.0" title="$nav.lock.3" >$nav.lock.1</a>
+ <i class="{{if $nav.locked}}icon-lock{{else}}icon-unlock{{/if}} fakelink nav-icon" onclick="window.location.href='{{$nav.lock.0}}'; return false;" title="{{$nav.lock.3}}" ></i>
</li>
- {{ endif }}
+ {{/if}}
- {{ if $nav.network }}
- <li id="nav-network-link" class="nav-menu $sel.network">
- <a class="$nav.network.2" href="$nav.network.0" title="$nav.network.3" ><span class="icon network">$nav.network.1</span></a>
+ {{if $nav.network}}
+ <li id="nav-network-link" class="nav-menu {{$sel.network}}">
+ <a class="{{$nav.network.2}}" href="{{$nav.network.0}}" title="{{$nav.network.3}}" ><i class="icon-th nav-icon"></i></a>
<span id="net-update" class="nav-notify fakelink" rel="#nav-network-menu"></span>
<ul id="nav-network-menu" class="menu-popup notify-menus" rel="network">
- <li id="nav-network-see-all"><a href="$nav.network.all.0">$nav.network.all.1</a></li>
- <li id="nav-network-mark-all"><a href="#" onclick="markRead('network'); return false;">$nav.network.mark.1</a></li>
- <li class="empty">$emptynotifications</li>
+ <li id="nav-network-see-all"><a href="{{$nav.network.all.0}}">{{$nav.network.all.1}}</a></li>
+ <li id="nav-network-mark-all"><a href="#" onclick="markRead('network'); return false;">{{$nav.network.mark.1}}</a></li>
+ <li class="empty">{{$emptynotifications}}</li>
</ul>
</li>
- {{ endif }}
+ {{/if}}
- {{ if $nav.home }}
- <li id="nav-home-link" class="nav-menu $sel.home">
- <a class="$nav.home.2" href="$nav.home.0" title="$nav.home.3" ><span class="icon home">$nav.home.1</span></a>
+ {{if $nav.home}}
+ <li id="nav-home-link" class="nav-menu {{$sel.home}}">
+ <a class="{{$nav.home.2}}" href="{{$nav.home.0}}" title="{{$nav.home.3}}" ><i class="icon-home nav-icon"></i></a>
<span id="home-update" class="nav-notify fakelink" rel="#nav-home-menu"></span>
<ul id="nav-home-menu" class="menu-popup notify-menus" rel="home">
- <li id="nav-home-see-all"><a href="$nav.home.all.0">$nav.home.all.1</a></li>
- <li id="nav-home-mark-all"><a href="#" onclick="markRead('home'); return false;">$nav.home.mark.1</a></li>
- <li class="empty">$emptynotifications</li>
+ <li id="nav-home-see-all"><a href="{{$nav.home.all.0}}">{{$nav.home.all.1}}</a></li>
+ <li id="nav-home-mark-all"><a href="#" onclick="markRead('home'); return false;">{{$nav.home.mark.1}}</a></li>
+ <li class="empty">{{$emptynotifications}}</li>
</ul>
</li>
- {{ endif }}
+ {{/if}}
+
+ {{if $nav.register}}<li id="nav-register-link" class="nav-menu {{$nav.register.2}}"><a href="{{$nav.register.0}}" title="{{$nav.register.3}}" >{{$nav.register.1}}</a><li>{{/if}}
- {{ if $nav.messages }}
- <li id="nav-mail-link" class="nav-menu $sel.messages">
- <a class="$nav.messages.2" href="$nav.messages.0" title="$nav.messages.3" ><span class="icon mail">$nav.messages.1</span></a>
+
+ {{if $nav.messages}}
+ <li id="nav-mail-link" class="nav-menu {{$sel.messages}}">
+ <a class="{{$nav.messages.2}}" href="{{$nav.messages.0}}" title="{{$nav.messages.3}}" ><i class="icon-envelope nav-icon"></i></a>
<span id="mail-update" class="nav-notify fakelink" rel="#nav-messages-menu"></span>
<ul id="nav-messages-menu" class="menu-popup notify-menus" rel="messages">
- <li id="nav-messages-see-all"><a href="$nav.messages.all.0">$nav.messages.all.1</a></li>
- <li id="nav-messages-mark-all"><a href="#" onclick="markRead('messages'); return false;">$nav.messages.mark.1</a></li>
- <li class="empty">$emptynotifications</li>
+ <li id="nav-messages-see-all"><a href="{{$nav.messages.all.0}}">{{$nav.messages.all.1}}</a></li>
+ <li id="nav-messages-mark-all"><a href="#" onclick="markRead('messages'); return false;">{{$nav.messages.mark.1}}</a></li>
+ <li class="empty">{{$emptynotifications}}</li>
</ul>
</li>
- {{ endif }}
+ {{/if}}
- {{ if $nav.all_events }}
- <li id="nav-all_events-link" class="nav-menu $sel.all_events">
- <a class="$nav.all_events.2" href="$nav.all_events.0" title="$nav.all_events.3" ><span class="icon events">$nav.all_events.1</span></a>
+ {{if $nav.all_events}}
+ <li id="nav-all_events-link" class="nav-menu {{$sel.all_events}}">
+ <a class="{{$nav.all_events.2}}" href="{{$nav.all_events.0}}" title="{{$nav.all_events.3}}" ><i class="icon-calendar nav-icon"></i></a>
<span id="all_events-update" class="nav-notify fakelink" rel="#nav-all_events-menu"></span>
<ul id="nav-all_events-menu" class="menu-popup notify-menus" rel="all_events">
- <li id="nav-all_events-see-all"><a href="$nav.all_events.all.0">$nav.all_events.all.1</a></li>
- <li id="nav-all_events-mark-all"><a href="#" onclick="markRead('all_events'); return false;">$nav.all_events.mark.1</a></li>
- <li class="empty">$emptynotifications</li>
+ <li id="nav-all_events-see-all"><a href="{{$nav.all_events.all.0}}">{{$nav.all_events.all.1}}</a></li>
+ <li id="nav-all_events-mark-all"><a href="#" onclick="markRead('all_events'); return false;">{{$nav.all_events.mark.1}}</a></li>
+ <li class="empty">{{$emptynotifications}}</li>
</ul>
</li>
- {{ endif }}
+ {{/if}}
- {{ if $nav.intros }}
- <li id="nav-intros-link" class="nav-menu $sel.intros">
- <a class="$nav.intros.2" href="$nav.intros.0" title="$nav.intros.3" ><span class="icon introductions">$nav.intros.1</span></a>
+ {{if $nav.intros}}
+ <li id="nav-intros-link" class="nav-menu {{$sel.intros}}">
+ <a class="{{$nav.intros.2}}" href="{{$nav.intros.0}}" title="{{$nav.intros.3}}" ><i class="icon-user nav-icon"></i></a>
<span id="intro-update" class="nav-notify fakelink" rel="#nav-intros-menu"></span>
<ul id="nav-intros-menu" class="menu-popup notify-menus" rel="intros">
- <li id="nav-intros-see-all"><a href="$nav.intros.all.0">$nav.intros.all.1</a></li>
- <li class="empty">$emptynotifications</li>
+ <li id="nav-intros-see-all"><a href="{{$nav.intros.all.0}}">{{$nav.intros.all.1}}</a></li>
+ <li class="empty">{{$emptynotifications}}</li>
</ul>
</li>
- {{ endif }}
+ {{/if}}
- {{ if $nav.notifications }}
- <li id="nav-notify-linkmenu" class="nav-menu fakelink">
- <a href="$nav.notifications.0" title="$nav.notifications.1"><span class="icon s22 notify">$nav.notifications.1</span></a>
+ {{if $nav.notifications}}
+ <li id="nav-notify-linkmenu" class="nav-menu fakelink {{$sel.notifications}}">
+ <a href="{{$nav.notifications.0}}" title="{{$nav.notifications.1}}"><i class="icon-exclamation nav-icon"></i></a>
<span id="notify-update" class="nav-notify fakelink" rel="#nav-notify-menu"></span>
<ul id="nav-notify-menu" class="menu-popup notify-menus" rel="notify">
- <li id="nav-notify-see-all"><a href="$nav.notifications.all.0">$nav.notifications.all.1</a></li>
- <li id="nav-notify-mark-all"><a href="#" onclick="markRead('notify'); return false;">$nav.notifications.mark.1</a></li>
- <li class="empty">$emptynotifications</li>
+ <li id="nav-notify-see-all"><a href="{{$nav.notifications.all.0}}">{{$nav.notifications.all.1}}</a></li>
+ <li id="nav-notify-mark-all"><a href="#" onclick="markRead('notify'); return false;">{{$nav.notifications.mark.1}}</a></li>
+ <li class="empty">{{$emptynotifications}}</li>
</ul>
</li>
- {{ endif }}
-
- {{ if $nav.settings }}
- <li id="nav-site-linkmenu" class="nav-menu-icon"><a href="#" rel="#nav-site-menu"><span class="icon s22 gear">$nav.settings.1</span></a>
- <ul id="nav-site-menu" class="menu-popup">
- {{ if $nav.settings }}<li><a class="$nav.settings.2" href="$nav.settings.0" title="$nav.settings.3">$nav.settings.1</a></li>{{ endif }}
- {{ if $nav.directory }}<li><a class="$nav.directory.2" href="$nav.directory.0" title="$nav.directory.3">$nav.directory.1</a></li>{{ endif }}
-
- {{ if $nav.admin }}<li><a class="$nav.admin.2" href="$nav.admin.0" title="$nav.admin.3" >$nav.admin.1</a></li>{{ endif }}
+ {{/if}}
+
+ {{if $nav.login}}<li id="nav-login-link" class="nav-menu {{$nav.login.2}}"><a href="{{$nav.login.0}}" title="{{$nav.login.3}}" >{{$nav.login.1}}</a><li>{{/if}}
+ {{if $nav.alogout}}<li id=nav-alogout-link" class="nav-menu {{$nav}}-alogout.2"><a href="{{$nav.alogout.0}}" title="{{$nav.alogout.3}}" >{{$nav.alogout.1}}</a></li>{{/if}}
- </ul>
+ {{if $nav.directory}}
+ <li id="nav-directory-link" class="nav-menu {{$sel.directory}}">
+ <a class="{{$nav.directory.2}}" href="{{$nav.directory.0}}" title="{{$nav.directory.3}}"><i class="icon-sitemap nav-icon"></i></a>
</li>
- {{ endif }}
+ {{/if}}
- {{ if $userinfo }}
- <li id="nav-user-linkmenu" class="nav-menu-icon"><a href="#" rel="#nav-user-menu" title="$userinfo.name"><img src="$userinfo.icon" alt="$userinfo.name"></a>
- {{ if $localuser }}
- <ul id="nav-user-menu" class="menu-popup">
- {{ for $nav.usermenu as $usermenu }}
- <li><a class="$usermenu.2" href="$usermenu.0" title="$usermenu.3">$usermenu.1</a></li>
- {{ endfor }}
- {{ if $nav.profiles }}<li><a class="$nav.profiles.2" href="$nav.profiles.0" title="$nav.profiles.3">$nav.profiles.1</a></li>{{ endif }}
- {{ if $nav.manage }}<li><a class="$nav.manage.2" href="$nav.manage.0" title="$nav.manage.3">$nav.manage.1</a></li>{{ endif }}
- {{ if $nav.contacts }}<li><a class="$nav.contacts.2" href="$nav.contacts.0" title="$nav.contacts.3" >$nav.contacts.1</a></li>{{ endif }}
- {{ if $nav.logout }}<li><a class="menu-sep $nav.logout.2" href="$nav.logout.0" title="$nav.logout.3" >$nav.logout.1</a></li>{{ endif }}
-
- </ul>
- {{ endif }}
- </li>
- {{ endif }}
-
- {{ if $nav.login }}<li id="nav-login-link" class="nav-menu $nav.login.2"><a href="$nav.login.0" title="$nav.login.3" >$nav.login.1</a><li>{{ endif }}
- {{ if $nav.alogout }}<li id=nav-alogout-link" class="nav-menu $nav-alogout.2"><a href="$nav.alogout.0" title="$nav.alogout.3" >$nav.alogout.1</a></li>{{ endif }}
- {{ if $nav.help }}
- <li id="nav-help-link" class="nav-menu $sel.help">
- <a class="$nav.help.2" target="friendika-help" href="$nav.help.0" title="$nav.help.3" >$nav.help.1</a>
+ {{if $nav.help}}
+ <li id="nav-help-link" class="nav-menu {{$sel.help}}">
+ <a class="{{$nav.help.2}}" target="friendika-help" href="{{$nav.help.0}}" title="{{$nav.help.3}}" ><i class="icon-question nav-icon"></i></a>
</li>
- {{ endif }}
+ {{/if}}
- {{ if $nav.apps }}
- <li id="nav-apps-link" class="nav-menu $sel.apps">
- <a class=" $nav.apps.2" href="#" rel="#nav-apps-menu" title="$nav.apps.3" >$nav.apps.1</a>
+ {{if $nav.apps}}
+ <li id="nav-apps-link" class="nav-menu {{$sel.apps}}">
+ <a class=" {{$nav.apps.2}}" href="#" rel="#nav-apps-menu" title="{{$nav.apps.3}}" ><i class="icon-cogs nav-icon"></i></a>
<ul id="nav-apps-menu" class="menu-popup">
- {{ for $apps as $ap }}
- <li>$ap</li>
- {{ endfor }}
+ {{foreach $apps as $ap}}
+ <li>{{$ap}}</li>
+ {{/foreach}}
</ul>
</li>
- {{ endif }}
+ {{/if}}
<li id="nav-searchbar">
<form method="get" action="search">
- <input id="nav-search-text" type="text" value="" placeholder="$nav.search.1" name="search" title="$nav.search.3" onclick="this.submit();" />
+ <input class="icon-search" id="nav-search-text" type="text" value="" placeholder="&#xf002;" name="search" title="{{$nav.search.3}}" onclick="this.submit();" />
</form>
</li>
- <img src="images/rotator.gif" id="nav-search-spinner" style="display: none;" alt="$pleasewait" />
+ <div id="nav-search-spinner"></div>
</ul>
</nav>
@@ -144,5 +148,5 @@
<li class="{4}"><a href="{0}"><img src="{1}">{2} <span class="notif-when">{3}</span></a></li>
</ul>
-<div id="langselector" >$langselector</div>
+{{if $langselector}}<div id="langselector" >{{$langselector}}</div>{{/if}}
<div id="panel" style="display: none;"></div>
diff --git a/view/tpl/netfriend.tpl b/view/tpl/netfriend.tpl
index c2a92ce9e..ec6b3b6cc 100644..100755
--- a/view/tpl/netfriend.tpl
+++ b/view/tpl/netfriend.tpl
@@ -1,14 +1,14 @@
-<div class="intro-approve-as-friend-desc">$approve_as</div>
+<div class="intro-approve-as-friend-desc">{{$approve_as}}</div>
<div class="intro-approve-as-friend-wrapper">
- <label class="intro-approve-as-friend-label" for="intro-approve-as-friend-$intro_id">$as_friend</label>
- <input type="radio" name="duplex" id="intro-approve-as-friend-$intro_id" class="intro-approve-as-friend" $friend_selected value="1" />
+ <label class="intro-approve-as-friend-label" for="intro-approve-as-friend-{{$intro_id}}">{{$as_friend}}</label>
+ <input type="radio" name="duplex" id="intro-approve-as-friend-{{$intro_id}}" class="intro-approve-as-friend" {{$friend_selected}} value="1" />
<div class="intro-approve-friend-break" ></div>
</div>
<div class="intro-approve-as-friend-end"></div>
<div class="intro-approve-as-fan-wrapper">
- <label class="intro-approve-as-fan-label" for="intro-approve-as-fan-$intro_id">$as_fan</label>
- <input type="radio" name="duplex" id="intro-approve-as-fan-$intro_id" class="intro-approve-as-fan" $fan_selected value="0" />
+ <label class="intro-approve-as-fan-label" for="intro-approve-as-fan-{{$intro_id}}">{{$as_fan}}</label>
+ <input type="radio" name="duplex" id="intro-approve-as-fan-{{$intro_id}}" class="intro-approve-as-fan" {{$fan_selected}} value="0" />
<div class="intro-approve-fan-break"></div>
</div>
<div class="intro-approve-as-end"></div>
diff --git a/view/tpl/new_channel.tpl b/view/tpl/new_channel.tpl
index 0ea764621..261f965da 100644..100755
--- a/view/tpl/new_channel.tpl
+++ b/view/tpl/new_channel.tpl
@@ -1,29 +1,29 @@
-<h2>$title</h2>
+<h2>{{$title}}</h2>
<form action="new_channel" method="post" id="newchannel-form">
- <div id="newchannel-desc" class="descriptive-paragraph">$desc</div>
+ <div id="newchannel-desc" class="descriptive-paragraph">{{$desc}}</div>
- <label for="newchannel-name" id="label-newchannel-name" class="newchannel-label" >$label_name</label>
- <input type="text" name="name" id="newchannel-name" class="newchannel-input" value="$name" />
+ <label for="newchannel-name" id="label-newchannel-name" class="newchannel-label" >{{$label_name}}</label>
+ <input type="text" name="name" id="newchannel-name" class="newchannel-input" value="{{$name}}" />
<div id="newchannel-name-feedback" class="newchannel-feedback"></div>
<div id="newchannel-name-end" class="newchannel-field-end"></div>
- <div id="newchannel-name-help" class="descriptive-paragraph">$help_name</div>
+ <div id="newchannel-name-help" class="descriptive-paragraph">{{$help_name}}</div>
- <label for="newchannel-nickname" id="label-newchannel-nickname" class="newchannel-label" >$label_nick</label>
- <input type="text" name="nickname" id="newchannel-nickname" class="newchannel-input" value="$nickname" />
+ <label for="newchannel-nickname" id="label-newchannel-nickname" class="newchannel-label" >{{$label_nick}}</label>
+ <input type="text" name="nickname" id="newchannel-nickname" class="newchannel-input" value="{{$nickname}}" />
<div id="newchannel-nickname-feedback" class="newchannel-feedback"></div>
<div id="newchannel-nickname-end" class="newchannel-field-end"></div>
- <div id="newchannel-nick-desc" class="descriptive-paragraph">$nick_desc</div>
+ <div id="newchannel-nick-desc" class="descriptive-paragraph">{{$nick_desc}}</div>
- <div id="newchannel-import-link" class="descriptive-paragraph" >$label_import</div>
+ <div id="newchannel-import-link" class="descriptive-paragraph" >{{$label_import}}</div>
<div id="newchannel-import-end" class="newchannel-field-end"></div>
- <input type="submit" name="submit" id="newchannel-submit-button" value="$submit" />
+ <input type="submit" name="submit" id="newchannel-submit-button" value="{{$submit}}" />
<div id="newchannel-submit-end" class="newchannel-field-end"></div>
</form>
diff --git a/view/tpl/nogroup-template.tpl b/view/tpl/nogroup-template.tpl
index dd00ed097..15094b2d6 100644..100755
--- a/view/tpl/nogroup-template.tpl
+++ b/view/tpl/nogroup-template.tpl
@@ -1,11 +1,11 @@
-<h1>$header</h1>
+<h1>{{$header}}</h1>
-{{ for $contacts as $contact }}
- {{ inc contact_template.tpl }}{{ endinc }}
-{{ endfor }}
+{{foreach $contacts as $contact}}
+ {{include file="contact_template.tpl"}}
+{{/foreach}}
<div id="contact-edit-end"></div>
-$paginate
+{{$paginate}}
diff --git a/view/tpl/notes.tpl b/view/tpl/notes.tpl
new file mode 100644
index 000000000..09932e545
--- /dev/null
+++ b/view/tpl/notes.tpl
@@ -0,0 +1,10 @@
+<div class="widget">
+<script>
+$("#note-text").live('input paste',function(e){
+ $.post('notes', { 'note_text' : $('#note-text').val() });
+});
+</script>
+
+<h3>{{$banner}}</h3>
+<textarea name="note_text" id="note-text">{{$text}}</textarea>
+</div>
diff --git a/view/tpl/notifications.tpl b/view/tpl/notifications.tpl
index 1a13b68b9..3015de504 100644..100755
--- a/view/tpl/notifications.tpl
+++ b/view/tpl/notifications.tpl
@@ -1,8 +1,5 @@
-
-<h1>$notif_header</h1>
-
-{{ inc common_tabs.tpl }}{{ endinc }}
+<h1>{{$notif_header}}</h1>
<div class="notif-network-wrapper">
- $notif_content
+ {{$notif_content}}
</div>
diff --git a/view/tpl/notifications_comments_item.tpl b/view/tpl/notifications_comments_item.tpl
index 73cc9f948..856955424 100644..100755
--- a/view/tpl/notifications_comments_item.tpl
+++ b/view/tpl/notifications_comments_item.tpl
@@ -1,3 +1,3 @@
<div class="notif-item">
- <a href="$item_link" target="friendica-notifications"><img src="$item_image" class="notif-image">$item_text <span class="notif-when">$item_when</span></a>
-</div> \ No newline at end of file
+ <a href="{{$item_link}}" target="friendica-notifications"><img src="{{$item_image}}" class="notif-image">{{$item_text}} <span class="notif-when">{{$item_when}}</span></a>
+</div>
diff --git a/view/tpl/notifications_dislikes_item.tpl b/view/tpl/notifications_dislikes_item.tpl
index 73cc9f948..856955424 100644..100755
--- a/view/tpl/notifications_dislikes_item.tpl
+++ b/view/tpl/notifications_dislikes_item.tpl
@@ -1,3 +1,3 @@
<div class="notif-item">
- <a href="$item_link" target="friendica-notifications"><img src="$item_image" class="notif-image">$item_text <span class="notif-when">$item_when</span></a>
-</div> \ No newline at end of file
+ <a href="{{$item_link}}" target="friendica-notifications"><img src="{{$item_image}}" class="notif-image">{{$item_text}} <span class="notif-when">{{$item_when}}</span></a>
+</div>
diff --git a/view/tpl/notifications_friends_item.tpl b/view/tpl/notifications_friends_item.tpl
index 73cc9f948..856955424 100644..100755
--- a/view/tpl/notifications_friends_item.tpl
+++ b/view/tpl/notifications_friends_item.tpl
@@ -1,3 +1,3 @@
<div class="notif-item">
- <a href="$item_link" target="friendica-notifications"><img src="$item_image" class="notif-image">$item_text <span class="notif-when">$item_when</span></a>
-</div> \ No newline at end of file
+ <a href="{{$item_link}}" target="friendica-notifications"><img src="{{$item_image}}" class="notif-image">{{$item_text}} <span class="notif-when">{{$item_when}}</span></a>
+</div>
diff --git a/view/tpl/notifications_likes_item.tpl b/view/tpl/notifications_likes_item.tpl
index 389144d9b..b2ba4024b 100644..100755
--- a/view/tpl/notifications_likes_item.tpl
+++ b/view/tpl/notifications_likes_item.tpl
@@ -1,3 +1,3 @@
<div class="notif-item">
- <a href="$item_link" target="friendica-notification"><img src="$item_image" class="notif-image">$item_text <span class="notif-when">$item_when</span></a>
-</div> \ No newline at end of file
+ <a href="{{$item_link}}" target="friendica-notification"><img src="{{$item_image}}" class="notif-image">{{$item_text}} <span class="notif-when">{{$item_when}}</span></a>
+</div>
diff --git a/view/tpl/notifications_network_item.tpl b/view/tpl/notifications_network_item.tpl
deleted file mode 100644
index 261ab3643..000000000
--- a/view/tpl/notifications_network_item.tpl
+++ /dev/null
@@ -1,3 +0,0 @@
-<div class="notif-item">
- <a href="$item_link" target="friendica-notifications"><img src="$item_image" class="notif-image">$item_text <span class="notif-when">$item_when</span></a>
-</div>
diff --git a/view/tpl/notifications_posts_item.tpl b/view/tpl/notifications_posts_item.tpl
index 73cc9f948..856955424 100644..100755
--- a/view/tpl/notifications_posts_item.tpl
+++ b/view/tpl/notifications_posts_item.tpl
@@ -1,3 +1,3 @@
<div class="notif-item">
- <a href="$item_link" target="friendica-notifications"><img src="$item_image" class="notif-image">$item_text <span class="notif-when">$item_when</span></a>
-</div> \ No newline at end of file
+ <a href="{{$item_link}}" target="friendica-notifications"><img src="{{$item_image}}" class="notif-image">{{$item_text}} <span class="notif-when">{{$item_when}}</span></a>
+</div>
diff --git a/view/tpl/notify.tpl b/view/tpl/notify.tpl
index 73cc9f948..856955424 100644..100755
--- a/view/tpl/notify.tpl
+++ b/view/tpl/notify.tpl
@@ -1,3 +1,3 @@
<div class="notif-item">
- <a href="$item_link" target="friendica-notifications"><img src="$item_image" class="notif-image">$item_text <span class="notif-when">$item_when</span></a>
-</div> \ No newline at end of file
+ <a href="{{$item_link}}" target="friendica-notifications"><img src="{{$item_image}}" class="notif-image">{{$item_text}} <span class="notif-when">{{$item_when}}</span></a>
+</div>
diff --git a/view/tpl/oauth_authorize.tpl b/view/tpl/oauth_authorize.tpl
index 31f02ac50..2b7afa80e 100644..100755
--- a/view/tpl/oauth_authorize.tpl
+++ b/view/tpl/oauth_authorize.tpl
@@ -1,10 +1,10 @@
-<h1>$title</h1>
+<h1>{{$title}}</h1>
<div class='oauthapp'>
- <img src='$app.icon'>
- <h4>$app.name</h4>
+ <img src='{{$app.icon}}'>
+ <h4>{{$app.name}}</h4>
</div>
-<h3>$authorize</h3>
+<h3>{{$authorize}}</h3>
<form method="POST">
-<div class="settings-submit-wrapper"><input class="settings-submit" type="submit" name="oauth_yes" value="$yes" /></div>
+<div class="settings-submit-wrapper"><input class="settings-submit" type="submit" name="oauth_yes" value="{{$yes}}" /></div>
</form>
diff --git a/view/tpl/oauth_authorize_done.tpl b/view/tpl/oauth_authorize_done.tpl
index 51eaea248..2e91e0125 100644..100755
--- a/view/tpl/oauth_authorize_done.tpl
+++ b/view/tpl/oauth_authorize_done.tpl
@@ -1,4 +1,4 @@
-<h1>$title</h1>
+<h1>{{$title}}</h1>
-<p>$info</p>
-<code>$code</code>
+<p>{{$info}}</p>
+<code>{{$code}}</code>
diff --git a/view/tpl/oembed_video.tpl b/view/tpl/oembed_video.tpl
index d3a9a9311..b0cfed2e5 100755
--- a/view/tpl/oembed_video.tpl
+++ b/view/tpl/oembed_video.tpl
@@ -1,4 +1,4 @@
-<a href='$embedurl' onclick='this.innerHTML=Base64.decode("$escapedhtml"); return false;' style='float:left; margin: 1em; position: relative;'>
- <img width='$tw' height='$th' src='$turl' >
- <div style='position: absolute; top: 0px; left: 0px; width: $twpx; height: $thpx; background: url($baseurl/images/icons/48/play.png) no-repeat center center;'></div>
+<a href="{{$embedurl}}" onclick="this.innerHTML=Base64.decode('{{$escapedhtml}}'); return false;" style="float:left; margin: 1em; position: relative;">
+ <img width="{{$tw}}" height="{{$th}}" src="{{$turl}}" />
+ <div style="position: absolute; top: 0px; left: 0px; width: {{$twpx}}; height: {{$thpx}}; background: url({{$baseurl}}/images/icons/48/play.png) no-repeat center center;"></div>
</a>
diff --git a/view/tpl/oexchange_xrd.tpl b/view/tpl/oexchange_xrd.tpl
index c7e6df498..74ef22874 100644..100755
--- a/view/tpl/oexchange_xrd.tpl
+++ b/view/tpl/oexchange_xrd.tpl
@@ -1,7 +1,7 @@
<?xml version='1.0' encoding='UTF-8'?>
<XRD xmlns="http://docs.oasis-open.org/ns/xri/xrd-1.0">
- <Subject>$base</Subject>
+ <Subject>{{$base}}</Subject>
<Property
type="http://www.oexchange.org/spec/0.8/prop/vendor">Friendika</Property>
@@ -14,19 +14,19 @@
<Link
rel="icon"
- href="$base/images/friendika-16.png"
+ href="{{$base}}/images/friendika-16.png"
type="image/png"
/>
<Link
rel="icon32"
- href="$base/images/friendika-32.png"
+ href="{{$base}}/images/friendika-32.png"
type="image/png"
/>
<Link
rel= "http://www.oexchange.org/spec/0.8/rel/offer"
- href="$base/oexchange"
+ href="{{$base}}/oexchange"
type="text/html"
/>
</XRD>
diff --git a/view/tpl/opensearch.tpl b/view/tpl/opensearch.tpl
index 374fcaac9..ea260c6ae 100644..100755
--- a/view/tpl/opensearch.tpl
+++ b/view/tpl/opensearch.tpl
@@ -1,13 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/">
- <ShortName>Friendika@$nodename</ShortName>
- <Description>Search in Friendika@$nodename</Description>
- <Contact>http://bugs.friendika.com/</Contact>
- <Image height="16" width="16" type="image/png">$baseurl/images/friendika-16.png</Image>
- <Image height="64" width="64" type="image/png">$baseurl/images/friendika-64.png</Image>
+ <ShortName>Red Matrix@{{$nodename}}</ShortName>
+ <Description>Search in The Red Matrix@{{$nodename}}</Description>
+ <Contact>http://github.com/friendica/red/</Contact>
+ <Image height="16" width="16" type="image/png">{{$baseurl}}/images/rm-16.png</Image>
+ <Image height="64" width="64" type="image/png">{{$baseurl}}/images/rm-64.png</Image>
<Url type="text/html"
- template="$baseurl/search?search={searchTerms}"/>
+ template="{{$baseurl}}/search?search={searchTerms}"/>
<Url type="application/opensearchdescription+xml"
rel="self"
- template="$baseurl/opensearch" />
-</OpenSearchDescription> \ No newline at end of file
+ template="{{$baseurl}}/opensearch" />
+</OpenSearchDescription>
diff --git a/view/tpl/page_display.tpl b/view/tpl/page_display.tpl
index a79d505dd..9b6b182c8 100644..100755
--- a/view/tpl/page_display.tpl
+++ b/view/tpl/page_display.tpl
@@ -1,7 +1,9 @@
-<div class=page">
- <h3 class="page-title">$title</h3>
+<div class="page">
- <div class="page-author"><a class=="page-author-link" href="$auth_url">$author</a></div>
- <div class="page-date">$date</div>
- <div class="page-body">body</div>
+<div class="generic-content-wrapper" id="page-content-wrapper" >
+ <h3 class="page-title">{{$title}}</h3>
+ <div class="page-author"><a class=="page-author-link" href="{{$auth_url}}{{if $zid}}?zid={{$zid}}{{/if}}">{{$author}}</a></div>
+ <div class="page-date">{{$date}}</div>
+ <div class="page-body">{{$body}}</div>
+</div>
</div>
diff --git a/view/tpl/pagetypes.tpl b/view/tpl/pagetypes.tpl
deleted file mode 100644
index c9022a1c1..000000000
--- a/view/tpl/pagetypes.tpl
+++ /dev/null
@@ -1,5 +0,0 @@
- {{inc field_radio.tpl with $field=$page_normal }}{{endinc}}
- {{inc field_radio.tpl with $field=$page_community }}{{endinc}}
- {{inc field_radio.tpl with $field=$page_prvgroup }}{{endinc}}
- {{inc field_radio.tpl with $field=$page_soapbox }}{{endinc}}
- {{inc field_radio.tpl with $field=$page_freelove }}{{endinc}}
diff --git a/view/tpl/peoplefind.tpl b/view/tpl/peoplefind.tpl
index 3c2692d25..45b3d7d4b 100644..100755
--- a/view/tpl/peoplefind.tpl
+++ b/view/tpl/peoplefind.tpl
@@ -1,14 +1,14 @@
<div id="peoplefind-sidebar" class="widget">
- <h3>$findpeople</h3>
- <div id="peoplefind-desc">$desc</div>
- <form action="dirfind" method="post" />
- <input id="side-peoplefind-url" type="text" name="search" size="24" title="$hint" /><input id="side-peoplefind-submit" type="submit" name="submit" value="$findthem" />
+ <h3>{{$findpeople}}</h3>
+ {{$desc}}
+ <form action="directory" method="post" />
+ <input class="icon-search" id="side-peoplefind-url" type="text" name="search" size="24" title="{{$hint}}" placeholder="&#xf002;"/>
+ <input id="side-peoplefind-submit" type="submit" name="submit" value="{{$findthem}}" />
</form>
- <div class="side-link" id="side-match-link"><a href="match" >$similar</a></div>
- <div class="side-link" id="side-suggest-link"><a href="suggest" >$suggest</a></div>
- <div class="side-link" id="side-random-profile-link" ><a href="randprof" target="extlink" >$random</a></div>
- {{ if $inv }}
- <div class="side-link" id="side-invite-link" ><a href="invite" >$inv</a></div>
- {{ endif }}
+ <br />
+ {{if $similar}}<a href="match" >{{$similar}}</a><br />{{/if}}
+ {{if $loggedin}}<a href="suggest" >{{$suggest}}</a><br />{{/if}}
+ <a href="randprof" >{{$random}}</a><br />
+ {{if $loggedin}}{{if $inv}}<a href="invite" >{{$inv}}</a>{{/if}}{{/if}}
</div>
diff --git a/view/tpl/photo_album.tpl b/view/tpl/photo_album.tpl
index cc3dcfb9c..a63bff78c 100644..100755
--- a/view/tpl/photo_album.tpl
+++ b/view/tpl/photo_album.tpl
@@ -1,7 +1,7 @@
-<div class="photo-album-image-wrapper" id="photo-album-image-wrapper-$id">
- <a href="$photolink" class="photo-album-photo-link" id="photo-album-photo-link-$id" title="$phototitle">
- <img src="$imgsrc" alt="$imgalt" title="$phototitle" class="photo-album-photo lframe resize$twist" id="photo-album-photo-$id" />
- <p class='caption'>$desc</p>
+<div class="photo-album-image-wrapper{{$twist}}" id="photo-album-image-wrapper-{{$id}}">
+ <a href="{{$photolink}}" class="photo-album-photo-link" id="photo-album-photo-link-{{$id}}" title="{{$phototitle}}" rel="{{$rel}}">
+ <img src="{{$imgsrc}}" alt="{{$imgalt}}" title="{{$phototitle}}" class="photo-album-photo lframe resize" id="photo-album-photo-{{$id}}" />
+ <p class='caption'>{{$desc}}</p>
</a>
</div>
<div class="photo-album-image-wrapper-end"></div>
diff --git a/view/tpl/photo_albums.tpl b/view/tpl/photo_albums.tpl
index eccc3660a..e83eefb39 100644..100755
--- a/view/tpl/photo_albums.tpl
+++ b/view/tpl/photo_albums.tpl
@@ -1,13 +1,13 @@
<div id="side-bar-photos-albums" class="widget">
-<h3><a href="$baseurl/photos/$nick" title="$title" >$title</a></h3>
-{{ if $albums }}
+<h3><a href="{{$baseurl}}/photos/{{$nick}}" title="{{$title}}" >{{$title}}</a></h3>
+{{if $albums}}
<ul>
-{{ for $albums as $al }}
-<li><a href="$baseurl/photos/$nick/$al.bin2hex">$al.album</a></li>
-{{ endfor }}
+{{foreach $albums as $al}}
+<li><a href="{{$baseurl}}/photos/{{$nick}}/album/{{$al.bin2hex}}">{{$al.text}}</a></li>
+{{/foreach}}
</ul>
-{{ endif }}
-{{ if $upload }}
-<div id="photo-albums-upload-link"><a href="$baseurl/photos/$nick/upload" title="$upload">$upload</a></div>
-{{ endif }}
+{{/if}}
+{{if $upload}}
+<div id="photo-albums-upload-link"><a href="{{$baseurl}}/photos/{{$nick}}/upload" title="{{$upload}}">{{$upload}}</a></div>
+{{/if}}
</div>
diff --git a/view/tpl/photo_drop.tpl b/view/tpl/photo_drop.tpl
index b4ea62b45..cb7ae17ba 100644..100755
--- a/view/tpl/photo_drop.tpl
+++ b/view/tpl/photo_drop.tpl
@@ -1,4 +1,4 @@
-<div class="wall-item-delete-wrapper" id="wall-item-delete-wrapper-$id" >
- <a href="item/drop/$id" onclick="return confirmDelete();" class="icon drophide" title="$delete" onmouseover="imgbright(this);" onmouseout="imgdull(this);" ></a>
+<div class="wall-item-delete-wrapper" id="wall-item-delete-wrapper-{{$id}}" >
+ <a href="item/drop/{{$id}}" onclick="return confirmDelete();" title="{{$delete}}" ><i class="icon-remove drop-icons"></i></a>
</div>
<div class="wall-item-delete-end"></div>
diff --git a/view/tpl/photo_edit.tpl b/view/tpl/photo_edit.tpl
deleted file mode 100644
index 53b69caae..000000000
--- a/view/tpl/photo_edit.tpl
+++ /dev/null
@@ -1,50 +0,0 @@
-
-<form action="photos/$nickname/$resource_id" method="post" id="photo_edit_form" >
-
- <input type="hidden" name="item_id" value="$item_id" />
-
- <label id="photo-edit-albumname-label" for="photo-edit-albumname">$newalbum</label>
- <input id="photo-edit-albumname" type="text" size="32" name="albname" value="$album" />
-
- <div id="photo-edit-albumname-end"></div>
-
- <label id="photo-edit-caption-label" for="photo-edit-caption">$capt_label</label>
- <input id="photo-edit-caption" type="text" size="84" name="desc" value="$caption" />
-
- <div id="photo-edit-caption-end"></div>
-
- <label id="photo-edit-tags-label" for="photo-edit-newtag" >$tag_label</label>
- <input name="newtag" id="photo-edit-newtag" size="84" title="$help_tags" type="text" />
-
- <div id="photo-edit-tags-end"></div>
- <div id="photo-edit-rotate-wrapper">
- <div id="photo-edit-rotate-label">
- $rotatecw<br>
- $rotateccw
- </div>
- <input type="radio" name="rotate" value="1" /><br>
- <input type="radio" name="rotate" value="2" />
- </div>
- <div id="photo-edit-rotate-end"></div>
-
- <div id="photo-edit-perms" class="photo-edit-perms" >
- <a href="#photo-edit-perms-select" id="photo-edit-perms-menu" class="button popupbox" title="$permissions"/>
- <span id="jot-perms-icon" class="icon $lockstate" ></span>$permissions
- </a>
- <div id="photo-edit-perms-menu-end"></div>
-
- <div style="display: none;">
- <div id="photo-edit-perms-select" >
- $aclselect
- </div>
- </div>
- </div>
- <div id="photo-edit-perms-end"></div>
-
- <input id="photo-edit-submit-button" type="submit" name="submit" value="$submit" />
- <input id="photo-edit-delete-button" type="submit" name="delete" value="$delete" onclick="return confirmDelete()"; />
-
- <div id="photo-edit-end"></div>
-</form>
-
-
diff --git a/view/tpl/photo_item.tpl b/view/tpl/photo_item.tpl
index 22884e848..e7d25fd55 100644..100755
--- a/view/tpl/photo_item.tpl
+++ b/view/tpl/photo_item.tpl
@@ -1,22 +1,22 @@
-<div class="wall-item-outside-wrapper$indent" id="wall-item-outside-wrapper-$id" >
- <div class="wall-item-photo-wrapper" id="wall-item-photo-wrapper-$id" >
- <a href="$profile_url" title="View $name's profile" class="wall-item-photo-link" id="wall-item-photo-link-$id">
- <img src="$thumb" class="wall-item-photo" id="wall-item-photo-$id" style="height: 80px; width: 80px;" alt="$name" /></a>
+<div class="wall-item-outside-wrapper{{$indent}}" id="wall-item-outside-wrapper-{{$id}}" >
+ <div class="wall-item-photo-wrapper" id="wall-item-photo-wrapper-{{$id}}" >
+ <a href="{{$profile_url}}" title="View {{$name}}'s profile" class="wall-item-photo-link" id="wall-item-photo-link-{{$id}}">
+ <img src="{{$thumb}}" class="wall-item-photo" id="wall-item-photo-{{$id}}" style="height: 80px; width: 80px;" alt="{{$name}}" /></a>
</div>
- <div class="wall-item-wrapper" id="wall-item-wrapper-$id" >
- <a href="$profile_url" title="View $name's profile" class="wall-item-name-link"><span class="wall-item-name" id="wall-item-name-$id" >$name</span></a>
- <div class="wall-item-ago" id="wall-item-ago-$id">$ago</div>
+ <div class="wall-item-wrapper" id="wall-item-wrapper-{{$id}}" >
+ <a href="{{$profile_url}}" title="View {{$name}}'s profile" class="wall-item-name-link"><span class="wall-item-name" id="wall-item-name-{{$id}}" >{{$name}}</span></a>
+ <div class="wall-item-ago" id="wall-item-ago-{{$id}}">{{$ago}}</div>
</div>
- <div class="wall-item-content" id="wall-item-content-$id" >
- <div class="wall-item-title" id="wall-item-title-$id">$title</div>
- <div class="wall-item-body" id="wall-item-body-$id" >$body</div>
+ <div class="wall-item-content" id="wall-item-content-{{$id}}" >
+ <div class="wall-item-title" id="wall-item-title-{{$id}}">{{$title}}</div>
+ <div class="wall-item-body" id="wall-item-body-{{$id}}" >{{$body}}</div>
</div>
- $drop
+ {{$drop}}
<div class="wall-item-wrapper-end"></div>
<div class="wall-item-comment-separator"></div>
- $comment
+ {{$comment}}
-<div class="wall-item-outside-wrapper-end$indent" ></div>
+<div class="wall-item-outside-wrapper-end{{$indent}}" ></div>
</div>
diff --git a/view/tpl/photo_top.tpl b/view/tpl/photo_top.tpl
index 155cab51d..944928f85 100644..100755
--- a/view/tpl/photo_top.tpl
+++ b/view/tpl/photo_top.tpl
@@ -1,8 +1,7 @@
-
-<div class="photo-top-image-wrapper lframe" id="photo-top-image-wrapper-$photo.id">
- <a href="$photo.link" class="photo-top-photo-link" id="photo-top-photo-link-$photo.id" title="$photo.title">
- <img src="$photo.src" alt="$photo.alt" title="$photo.title" class="photo-top-photo$photo.twist" id="photo-top-photo-$photo.id" />
+<div class="photo-top-image-wrapper lframe {{$photo.twist}}" id="photo-top-image-wrapper-{{$photo.id}}">
+ <a href="{{$photo.link}}" class="photo-top-photo-link" id="photo-top-photo-link-{{$photo.id}}" title="{{$photo.title}}">
+ <img src="{{$photo.src}}" alt="{{$photo.alt}}" title="{{$photo.title}}" class="photo-top-photo" id="photo-top-photo-{{$photo.id}}" />
</a>
- <div class="photo-top-album-name"><a href="$photo.album.link" class="photo-top-album-link" title="$photo.album.alt" >$photo.album.name</a></div>
+ <div class="photo-top-album-name"><a href="{{$photo.album.link}}" class="photo-top-album-link" title="{{$photo.album.alt}}" >{{$photo.album.name}}</a></div>
</div>
diff --git a/view/tpl/photo_view.tpl b/view/tpl/photo_view.tpl
index 732caf690..e56fd5b57 100644..100755
--- a/view/tpl/photo_view.tpl
+++ b/view/tpl/photo_view.tpl
@@ -1,37 +1,86 @@
<div id="live-display"></div>
-<h3><a href="$album.0">$album.1</a></h3>
+<h3><a href="{{$album.0}}">{{$album.1}}</a></h3>
<div id="photo-edit-link-wrap">
-{{ if $tools }}
-<a id="photo-edit-link" href="$tools.edit.0">$tools.edit.1</a>
-|
-<a id="photo-toprofile-link" href="$tools.profile.0">$tools.profile.1</a>
-{{ endif }}
-{{ if $lock }} | <img src="images/lock_icon.gif" class="lockview" alt="$lock" onclick="lockview(event,'photo/$id');" /> {{ endif }}
+{{if $tools}}
+<a id="photo-toprofile-link" href="{{$tools.profile.0}}">{{$tools.profile.1}}</a>
+{{/if}}
+{{if $lock}} | <i class="lockview icon-lock" title="{{$lock}}" onclick="lockview(event,'photo/{{$id}}');" ></i> {{/if}}
</div>
-{{ if $prevlink }}<div id="photo-prev-link"><a href="$prevlink.0">$prevlink.1</a></div>{{ endif }}
-<div id="photo-photo"><a href="$photo.href" title="$photo.title"><img src="$photo.src" /></a></div>
-{{ if $nextlink }}<div id="photo-next-link"><a href="$nextlink.0">$nextlink.1</a></div>{{ endif }}
+{{if $prevlink}}<div id="photo-prev-link"><a href="{{$prevlink.0}}"><i class="icon-backward photo-icons"></i></div>{{/if}}
+<div id="photo-photo"><a href="{{$photo.href}}" title="{{$photo.title}}" onclick="$.colorbox({href: '{{$photo.href}}'}); return false;" ><img src="{{$photo.src}}" /></a></div>
+{{if $nextlink}}<div id="photo-next-link"><a href="{{$nextlink.0}}"><i class="icon-forward photo-icons"></i></a></div>{{/if}}
<div id="photo-photo-end"></div>
-<div id="photo-caption">$desc</div>
-{{ if $tags }}
-<div id="in-this-photo-text">$tags.0</div>
-<div id="in-this-photo">$tags.1</div>
-{{ endif }}
-{{ if $tags.2 }}<div id="tag-remove"><a href="$tags.2">$tags.3</a></div>{{ endif }}
+<div id="photo-caption">{{$desc}}</div>
+{{if $tags}}
+<div id="in-this-photo-text">{{$tags.0}}</div>
+<div id="in-this-photo">{{$tags.1}}</div>
+{{/if}}
+{{if $tags.2}}<div id="tag-remove"><a href="{{$tags.2}}">{{$tags.3}}</a></div>{{/if}}
-{{ if $edit }}$edit{{ endif }}
+{{if $edit}}
+<div id="photo-edit-edit-wrapper" class="fakelink" onclick="openClose('photo-edit-edit');">{{$edit.edit}}</div>
+<div id="photo-edit-edit" style="display: none;">
+<form action="photos/{{$edit.nickname}}/{{$edit.resource_id}}" method="post" id="photo_edit_form" >
-{{ if $likebuttons }}
+ <input type="hidden" name="item_id" value="{{$item_id}}" />
+
+ <label id="photo-edit-albumname-label" for="photo-edit-albumname">{{$edit.newalbum}}</label>
+ <input id="photo-edit-albumname" type="text" size="32" name="albname" value="{{$edit.album}}" />
+
+ <div id="photo-edit-albumname-end"></div>
+
+ <label id="photo-edit-caption-label" for="photo-edit-caption">{{$edit.capt_label}}</label>
+ <input id="photo-edit-caption" type="text" size="84" name="desc" value="{{$edit.caption}}" />
+
+ <div id="photo-edit-caption-end"></div>
+
+ <label id="photo-edit-tags-label" for="photo-edit-newtag" >{{$edit.tag_label}}</label>
+ <input name="newtag" id="photo-edit-newtag" size="84" title="{{$edit.help_tags}}" type="text" />
+
+ <div id="photo-edit-tags-end"></div>
+ <div id="photo-edit-rotate-wrapper">
+ <div id="photo-edit-rotate-label">
+ {{$edit.rotatecw}}<br>
+ {{$edit.rotateccw}}
+ </div>
+ <input type="radio" name="rotate" value="1" /><br>
+ <input type="radio" name="rotate" value="2" />
+ </div>
+ <div id="photo-edit-rotate-end"></div>
+
+ <div id="photo-edit-perms" class="photo-edit-perms" >
+ <a href="#photo-edit-perms-select" id="photo-edit-perms-menu" class="button popupbox" title="{{$edit.permissions}}"/>
+ <span id="jot-perms-icon" class="icon {{$edit.lockstate}}" ></span>{{$edit.permissions}}
+ </a>
+ <div id="photo-edit-perms-menu-end"></div>
+
+ <div style="display: none;">
+ <div id="photo-edit-perms-select" >
+ {{$edit.aclselect}}
+ </div>
+ </div>
+ </div>
+ <div id="photo-edit-perms-end"></div>
+
+ <input id="photo-edit-submit-button" type="submit" name="submit" value="{{$edit.submit}}" />
+ <input id="photo-edit-delete-button" type="submit" name="delete" value="{{$edit.delete}}" onclick="return confirmDelete()"; />
+
+ <div id="photo-edit-end"></div>
+</form>
+</div>
+{{/if}}
+
+{{if $likebuttons}}
<div id="photo-like-div">
- $likebuttons
- $like
- $dislike
+ {{$likebuttons}}
+ {{$like}}
+ {{$dislike}}
</div>
-{{ endif }}
+{{/if}}
-$comments
+{{$comments}}
-$paginate
+{{$paginate}}
diff --git a/view/tpl/photos_recent.tpl b/view/tpl/photos_recent.tpl
index 1df78cb7b..43a22a017 100644..100755
--- a/view/tpl/photos_recent.tpl
+++ b/view/tpl/photos_recent.tpl
@@ -1,11 +1,11 @@
-<h3>$title</h3>
-{{ if $can_post }}
-<a id="photo-top-upload-link" href="$upload.1">$upload.0</a>
-{{ endif }}
+<h3>{{$title}}</h3>
+{{if $can_post}}
+<a id="photo-top-upload-link" href="{{$upload.1}}">{{$upload.0}}</a>
+{{/if}}
<div class="photos">
-{{ for $photos as $photo }}
- {{ inc photo_top.tpl }}{{ endinc }}
-{{ endfor }}
+{{foreach $photos as $photo}}
+ {{include file="photo_top.tpl"}}
+{{/foreach}}
</div>
<div class="photos-end"></div>
diff --git a/view/tpl/photos_upload.tpl b/view/tpl/photos_upload.tpl
index 93c0b7d54..102c4d872 100644..100755
--- a/view/tpl/photos_upload.tpl
+++ b/view/tpl/photos_upload.tpl
@@ -1,45 +1,46 @@
-<h3>$pagename</h3>
+<h3>{{$pagename}}</h3>
-<div id="photos-usage-message">$usage</div>
+<div id="photos-usage-message" class="usage-message">{{$usage}}</div>
-<form action="photos/$nickname" enctype="multipart/form-data" method="post" name="photos-upload-form" id="photos-upload-form" >
+<form action="photos/{{$nickname}}" enctype="multipart/form-data" method="post" name="photos-upload-form" id="photos-upload-form" >
+ <input type="hidden" id="photos-upload-source" name="source" value="photos" />
<div id="photos-upload-new-wrapper" >
<div id="photos-upload-newalbum-div">
- <label id="photos-upload-newalbum-text" for="photos-upload-newalbum" >$newalbum</label>
+ <label id="photos-upload-newalbum-text" for="photos-upload-newalbum" >{{$newalbum}}</label>
</div>
<input id="photos-upload-newalbum" type="text" name="newalbum" />
</div>
<div id="photos-upload-new-end"></div>
<div id="photos-upload-exist-wrapper">
- <div id="photos-upload-existing-album-text">$existalbumtext</div>
- $albumselect
+ <div id="photos-upload-existing-album-text">{{$existalbumtext}}</div>
+ {{$albumselect}}
</div>
<div id="photos-upload-exist-end"></div>
<div id="photos-upload-noshare-div" class="photos-upload-noshare-div" >
<input id="photos-upload-noshare" type="checkbox" name="not_visible" value="1" />
- <label id="photos-upload-noshare-text" for="photos-upload-noshare" >$nosharetext</label>
+ <label id="photos-upload-noshare-text" for="photos-upload-noshare" >{{$nosharetext}}</label>
</div>
<div id="photos-upload-perms" class="photos-upload-perms" >
<a href="#photos-upload-permissions-wrapper" id="photos-upload-perms-menu" class="button popupbox" />
- <span id="jot-perms-icon" class="icon $lockstate" ></span>$permissions
+ <span id="jot-perms-icon" class="icon {{$lockstate}}" ></span>{{$permissions}}
</a>
</div>
<div id="photos-upload-perms-end"></div>
<div style="display: none;">
<div id="photos-upload-permissions-wrapper">
- $aclselect
+ {{$aclselect}}
</div>
</div>
<div id="photos-upload-spacer"></div>
- $uploader
+ {{$uploader}}
- $default
+ {{$default}}
<div class="photos-upload-end" ></div>
</form>
diff --git a/view/tpl/poco_entry_xml.tpl b/view/tpl/poco_entry_xml.tpl
index 4d84cee41..869894852 100644..100755
--- a/view/tpl/poco_entry_xml.tpl
+++ b/view/tpl/poco_entry_xml.tpl
@@ -1,7 +1,7 @@
<entry>
-{{ if $entry.id }}<id>$entry.id</id>{{ endif }}
-{{ if $entry.displayName }}<displayName>$entry.displayName</displayName>{{ endif }}
-{{ if $entry.preferredUsername }}<preferredUsername>$entry.preferredUsername</preferredUsername>{{ endif }}
-{{ if $entry.urls }}{{ for $entry.urls as $url }}<urls><value>$url.value</value><type>$url.type</type></urls>{{ endfor }}{{ endif }}
-{{ if $entry.photos }}{{ for $entry.photos as $photo }}<photos><value>$photo.value</value><type>$photo.type</type></photos>{{ endfor }}{{ endif }}
+{{if $entry.id}}<id>{{$entry.id}}</id>{{/if}}
+{{if $entry.displayName}}<displayName>{{$entry.displayName}}</displayName>{{/if}}
+{{if $entry.preferredUsername}}<preferredUsername>{{$entry.preferredUsername}}</preferredUsername>{{/if}}
+{{if $entry.urls}}{{foreach $entry.urls as $url}}<urls><value>{{$url.value}}</value><type>{{$url.type}}</type></urls>{{/foreach}}{{/if}}
+{{if $entry.photos}}{{foreach $entry.photos as $photo}}<photos><value>{{$photo.value}}</value><type>{{$photo.type}}</type></photos>{{/foreach}}{{/if}}
</entry>
diff --git a/view/tpl/poco_xml.tpl b/view/tpl/poco_xml.tpl
index 9549b695d..0e38a692c 100644..100755
--- a/view/tpl/poco_xml.tpl
+++ b/view/tpl/poco_xml.tpl
@@ -1,18 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<response>
-{{ if $response.sorted }}<sorted>$response.sorted</sorted>{{ endif }}
-{{ if $response.filtered }}<filtered>$response.filtered</filtered>{{ endif }}
-{{ if $response.updatedSince }}<updatedSince>$response.updatedSince</updatedSince>{{ endif }}
-<startIndex>$response.startIndex</startIndex>
-<itemsPerPage>$response.itemsPerPage</itemsPerPage>
-<totalResults>$response.totalResults</totalResults>
+{{if $response.sorted}}<sorted>{{$response.sorted}}</sorted>{{/if}}
+{{if $response.filtered}}<filtered>{{$response.filtered}}</filtered>{{/if}}
+{{if $response.updatedSince}}<updatedSince>{{$response.updatedSince}}</updatedSince>{{/if}}
+<startIndex>{{$response.startIndex}}</startIndex>
+<itemsPerPage>{{$response.itemsPerPage}}</itemsPerPage>
+<totalResults>{{$response.totalResults}}</totalResults>
-{{ if $response.totalResults }}
-{{ for $response.entry as $entry }}
-{{ inc poco_entry_xml.tpl }}{{ endinc }}
-{{ endfor }}
-{{ else }}
+{{if $response.totalResults}}
+{{foreach $response.entry as $entry}}
+{{include file="poco_entry_xml.tpl"}}
+{{/foreach}}
+{{else}}
<entry></entry>
-{{ endif }}
+{{/if}}
</response>
diff --git a/view/tpl/poke_content.tpl b/view/tpl/poke_content.tpl
index b9e089f5b..22a0b291f 100644..100755
--- a/view/tpl/poke_content.tpl
+++ b/view/tpl/poke_content.tpl
@@ -1,32 +1,32 @@
-<h3>$title</h3>
+<h3>{{$title}}</h3>
-<div id="poke-desc">$desc</div>
+<div id="poke-desc">{{$desc}}</div>
<form action="poke" method="get">
<br />
<br />
-<div id="poke-recip-label">$clabel</div>
+<div id="poke-recip-label">{{$clabel}}</div>
<br />
-<input id="poke-recip" type="text" size="64" maxlength="255" value="$name" name="pokename" autocomplete="off" />
-<input id="poke-recip-complete" type="hidden" value="$id" name="cid" />
-<input id="poke-parent" type="hidden" value="$parent" name="parent" />
+<input id="poke-recip" type="text" size="64" maxlength="255" value="{{$name}}" name="pokename" autocomplete="off" />
+<input id="poke-recip-complete" type="hidden" value="{{$id}}" name="cid" />
+<input id="poke-parent" type="hidden" value="{{$parent}}" name="parent" />
<br />
<br />
-<div id="poke-action-label">$choice</div>
+<div id="poke-action-label">{{$choice}}</div>
<br />
<br />
<select name="verb" id="poke-verb-select" >
-{{ for $verbs as $v }}
-<option value="$v.0">$v.1</option>
-{{ endfor }}
+{{foreach $verbs as $v}}
+<option value="{{$v.0}}">{{$v.1}}</option>
+{{/foreach}}
</select>
<br />
<br />
-<div id="poke-private-desc">$prv_desc</div>
-<input type="checkbox" name="private" {{ if $parent }}disabled="disabled"{{ endif }} value="1" />
+<div id="poke-private-desc">{{$prv_desc}}</div>
+<input type="checkbox" name="private" {{if $parent}}disabled="disabled"{{/if}} value="1" />
<br />
<br />
-<input type="submit" name="submit" value="$submit" />
+<input type="submit" name="submit" value="{{$submit}}" />
</form>
diff --git a/view/tpl/posted_date_widget.tpl b/view/tpl/posted_date_widget.tpl
index 3e2ee5a3e..6720d3628 100644..100755
--- a/view/tpl/posted_date_widget.tpl
+++ b/view/tpl/posted_date_widget.tpl
@@ -1,9 +1,9 @@
<div id="datebrowse-sidebar" class="widget">
- <h3>$title</h3>
+ <h3>{{$title}}</h3>
<script>function dateSubmit(dateurl) { window.location.href = dateurl; } </script>
-<select id="posted-date-selector" name="posted-date-select" onchange="dateSubmit($(this).val());" size="$size">
-{{ for $dates as $d }}
-<option value="$url/$d.1/$d.2" >$d.0</option>
-{{ endfor }}
+<select id="posted-date-selector" name="posted-date-select" onchange="dateSubmit($(this).val());" size="{{$size}}">
+{{foreach $dates as $d}}
+<option value="{{$url}}?dend={{$d.1}}&dbegin={{$d.2}}" >{{$d.0}}</option>
+{{/foreach}}
</select>
</div>
diff --git a/view/tpl/profed_head.tpl b/view/tpl/profed_head.tpl
index 2477654b3..103960a76 100644..100755
--- a/view/tpl/profed_head.tpl
+++ b/view/tpl/profed_head.tpl
@@ -1,11 +1,11 @@
<script language="javascript" type="text/javascript"
- src="$baseurl/library/tinymce/jscripts/tiny_mce/tiny_mce_src.js"></script>
+ src="{{$baseurl}}/library/tinymce/jscripts/tiny_mce/tiny_mce_src.js"></script>
<script language="javascript" type="text/javascript">
tinyMCE.init({
theme : "advanced",
- mode : "$editselect",
+ mode : "{{$editselect}}",
plugins : "bbcode,paste",
theme_advanced_buttons1 : "bold,italic,underline,undo,redo,link,unlink,image,forecolor,formatselect,code",
theme_advanced_buttons2 : "",
@@ -21,7 +21,7 @@ tinyMCE.init({
force_p_newlines : false,
force_br_newlines : true,
forced_root_block : '',
- content_css: "$baseurl/view/custom_tinymce.css",
+ content_css: "{{$baseurl}}/view/custom_tinymce.css",
theme_advanced_path : false,
setup : function(ed) {
ed.onInit.add(function(ed) {
diff --git a/view/tpl/profile-hide-friends.tpl b/view/tpl/profile-hide-friends.tpl
deleted file mode 100644
index 9ecacfbe0..000000000
--- a/view/tpl/profile-hide-friends.tpl
+++ /dev/null
@@ -1,16 +0,0 @@
-<p id="hide-friends-text">
-$desc
-</p>
-
- <div id="hide-friends-yes-wrapper">
- <label id="hide-friends-yes-label" for="hide-friends-yes">$yes_str</label>
- <input type="radio" name="hide-friends" id="hide-friends-yes" $yes_selected value="1" />
-
- <div id="hide-friends-break" ></div>
- </div>
- <div id="hide-friends-no-wrapper">
- <label id="hide-friends-no-label" for="hide-friends-no">$no_str</label>
- <input type="radio" name="hide-friends" id="hide-friends-no" $no_selected value="0" />
-
- <div id="hide-friends-end"></div>
- </div>
diff --git a/view/tpl/profile-hide-wall.tpl b/view/tpl/profile-hide-wall.tpl
deleted file mode 100644
index 10185e243..000000000
--- a/view/tpl/profile-hide-wall.tpl
+++ /dev/null
@@ -1,16 +0,0 @@
-<p id="hide-wall-text">
-$desc
-</p>
-
- <div id="hide-wall-yes-wrapper">
- <label id="hide-wall-yes-label" for="hide-wall-yes">$yes_str</label>
- <input type="radio" name="hidewall" id="hide-wall-yes" $yes_selected value="1" />
-
- <div id="hide-wall-break" ></div>
- </div>
- <div id="hide-wall-no-wrapper">
- <label id="hide-wall-no-label" for="hide-wall-no">$no_str</label>
- <input type="radio" name="hidewall" id="hide-wall-no" $no_selected value="0" />
-
- <div id="hide-wall-end"></div>
- </div>
diff --git a/view/tpl/profile-in-directory.tpl b/view/tpl/profile-in-directory.tpl
deleted file mode 100644
index 56b28d37e..000000000
--- a/view/tpl/profile-in-directory.tpl
+++ /dev/null
@@ -1,16 +0,0 @@
-<p id="profile-in-directory">
-$desc
-</p>
-
- <div id="profile-in-dir-yes-wrapper">
- <label id="profile-in-dir-yes-label" for="profile-in-dir-yes">$yes_str</label>
- <input type="radio" name="profile_in_directory" id="profile-in-dir-yes" $yes_selected value="1" />
-
- <div id="profile-in-dir-break" ></div>
- </div>
- <div id="profile-in-dir-no-wrapper">
- <label id="profile-in-dir-no-label" for="profile-in-dir-no">$no_str</label>
- <input type="radio" name="profile_in_directory" id="profile-in-dir-no" $no_selected value="0" />
-
- <div id="profile-in-dir-end"></div>
- </div>
diff --git a/view/tpl/profile-in-netdir.tpl b/view/tpl/profile-in-netdir.tpl
deleted file mode 100644
index 882ad2d17..000000000
--- a/view/tpl/profile-in-netdir.tpl
+++ /dev/null
@@ -1,16 +0,0 @@
-<p id="profile-in-directory">
-$desc
-</p>
-
- <div id="profile-in-netdir-yes-wrapper">
- <label id="profile-in-netdir-yes-label" for="profile-in-netdir-yes">$yes_str</label>
- <input type="radio" name="profile_in_netdirectory" id="profile-in-netdir-yes" $yes_selected value="1" />
-
- <div id="profile-in-netdir-break" ></div>
- </div>
- <div id="profile-in-netdir-no-wrapper">
- <label id="profile-in-netdir-no-label" for="profile-in-netdir-no">$no_str</label>
- <input type="radio" name="profile_in_netdirectory" id="profile-in-netdir-no" $no_selected value="0" />
-
- <div id="profile-in-netdir-end"></div>
- </div>
diff --git a/view/tpl/profile_advanced.tpl b/view/tpl/profile_advanced.tpl
index 0bc4d3fd3..9f17a0ffa 100644..100755
--- a/view/tpl/profile_advanced.tpl
+++ b/view/tpl/profile_advanced.tpl
@@ -1,170 +1,183 @@
-<h2>$title</h2>
+<div id="profile-content-wrapper" class="generic-content-wrapper">
+<h2>{{$title}}</h2>
<dl id="aprofile-fullname" class="aprofile">
- <dt>$profile.fullname.0</dt>
- <dd>$profile.fullname.1</dd>
+ <dt>{{$profile.fullname.0}}</dt>
+ <dd>{{$profile.fullname.1}}</dd>
</dl>
-{{ if $profile.gender }}
+{{if $profile.gender}}
<dl id="aprofile-gender" class="aprofile">
- <dt>$profile.gender.0</dt>
- <dd>$profile.gender.1</dd>
+ <dt>{{$profile.gender.0}}</dt>
+ <dd>{{$profile.gender.1}}</dd>
</dl>
-{{ endif }}
+{{/if}}
-{{ if $profile.birthday }}
+{{if $profile.birthday}}
<dl id="aprofile-birthday" class="aprofile">
- <dt>$profile.birthday.0</dt>
- <dd>$profile.birthday.1</dd>
+ <dt>{{$profile.birthday.0}}</dt>
+ <dd>{{$profile.birthday.1}}</dd>
</dl>
-{{ endif }}
+{{/if}}
-{{ if $profile.age }}
+{{if $profile.age}}
<dl id="aprofile-age" class="aprofile">
- <dt>$profile.age.0</dt>
- <dd>$profile.age.1</dd>
+ <dt>{{$profile.age.0}}</dt>
+ <dd>{{$profile.age.1}}</dd>
</dl>
-{{ endif }}
+{{/if}}
-{{ if $profile.marital }}
+{{if $profile.marital}}
<dl id="aprofile-marital" class="aprofile">
- <dt><span class="heart">&hearts;</span> $profile.marital.0</dt>
- <dd>$profile.marital.1{{ if $profile.marital.with }} ($profile.marital.with){{ endif }}{{ if $profile.howlong }} $profile.howlong{{ endif }}</dd>
+ <dt><span class="heart">&hearts;</span> {{$profile.marital.0}}</dt>
+ <dd>{{$profile.marital.1}}{{if $profile.marital.with}} ({{$profile.marital.with}}){{/if}}{{if $profile.howlong}} {{$profile.howlong}}{{/if}}</dd>
</dl>
-{{ endif }}
+{{/if}}
-{{ if $profile.sexual }}
+{{if $profile.sexual}}
<dl id="aprofile-sexual" class="aprofile">
- <dt>$profile.sexual.0</dt>
- <dd>$profile.sexual.1</dd>
+ <dt>{{$profile.sexual.0}}</dt>
+ <dd>{{$profile.sexual.1}}</dd>
</dl>
-{{ endif }}
+{{/if}}
-{{ if $profile.keywords }}
+{{if $profile.keywords}}
<dl id="aprofile-tags" class="aprofile">
- <dt>$profile.keywords.0</dt>
- <dd>$profile.keywords.1</dd>
+ <dt>{{$profile.keywords.0}}</dt>
+ <dd>{{$profile.keywords.1}}</dd>
</dl>
-{{ endif }}
+{{/if}}
-{{ if $profile.homepage }}
+{{if $profile.homepage}}
<dl id="aprofile-homepage" class="aprofile">
- <dt>$profile.homepage.0</dt>
- <dd>$profile.homepage.1</dd>
+ <dt>{{$profile.homepage.0}}</dt>
+ <dd>{{$profile.homepage.1}}</dd>
</dl>
-{{ endif }}
+{{/if}}
-{{ if $profile.hometown }}
+{{if $profile.hometown}}
<dl id="aprofile-hometown" class="aprofile">
- <dt>$profile.hometown.0</dt>
- <dd>$profile.hometown.1</dd>
+ <dt>{{$profile.hometown.0}}</dt>
+ <dd>{{$profile.hometown.1}}</dd>
</dl>
-{{ endif }}
+{{/if}}
-{{ if $profile.politic }}
+{{if $profile.politic}}
<dl id="aprofile-politic" class="aprofile">
- <dt>$profile.politic.0</dt>
- <dd>$profile.politic.1</dd>
+ <dt>{{$profile.politic.0}}</dt>
+ <dd>{{$profile.politic.1}}</dd>
</dl>
-{{ endif }}
+{{/if}}
-{{ if $profile.religion }}
+{{if $profile.religion}}
<dl id="aprofile-religion" class="aprofile">
- <dt>$profile.religion.0</dt>
- <dd>$profile.religion.1</dd>
+ <dt>{{$profile.religion.0}}</dt>
+ <dd>{{$profile.religion.1}}</dd>
</dl>
-{{ endif }}
+{{/if}}
-{{ if $profile.about }}
+{{if $profile.about}}
<dl id="aprofile-about" class="aprofile">
- <dt>$profile.about.0</dt>
- <dd>$profile.about.1</dd>
+ <dt>{{$profile.about.0}}</dt>
+ <dd>{{$profile.about.1}}</dd>
</dl>
-{{ endif }}
+{{/if}}
-{{ if $profile.interest }}
+{{if $profile.interest}}
<dl id="aprofile-interest" class="aprofile">
- <dt>$profile.interest.0</dt>
- <dd>$profile.interest.1</dd>
+ <dt>{{$profile.interest.0}}</dt>
+ <dd>{{$profile.interest.1}}</dd>
</dl>
-{{ endif }}
+{{/if}}
-{{ if $profile.likes }}
+{{if $profile.likes}}
<dl id="aprofile-likes" class="aprofile">
- <dt>$profile.likes.0</dt>
- <dd>$profile.likes.1</dd>
+ <dt>{{$profile.likes.0}}</dt>
+ <dd>{{$profile.likes.1}}</dd>
</dl>
-{{ endif }}
+{{/if}}
-{{ if $profile.dislikes }}
+{{if $profile.dislikes}}
<dl id="aprofile-dislikes" class="aprofile">
- <dt>$profile.dislikes.0</dt>
- <dd>$profile.dislikes.1</dd>
+ <dt>{{$profile.dislikes.0}}</dt>
+ <dd>{{$profile.dislikes.1}}</dd>
</dl>
-{{ endif }}
+{{/if}}
-{{ if $profile.contact }}
+{{if $profile.contact}}
<dl id="aprofile-contact" class="aprofile">
- <dt>$profile.contact.0</dt>
- <dd>$profile.contact.1</dd>
+ <dt>{{$profile.contact.0}}</dt>
+ <dd>{{$profile.contact.1}}</dd>
</dl>
-{{ endif }}
+{{/if}}
-{{ if $profile.music }}
+{{if $profile.music}}
<dl id="aprofile-music" class="aprofile">
- <dt>$profile.music.0</dt>
- <dd>$profile.music.1</dd>
+ <dt>{{$profile.music.0}}</dt>
+ <dd>{{$profile.music.1}}</dd>
</dl>
-{{ endif }}
+{{/if}}
-{{ if $profile.book }}
+{{if $profile.book}}
<dl id="aprofile-book" class="aprofile">
- <dt>$profile.book.0</dt>
- <dd>$profile.book.1</dd>
+ <dt>{{$profile.book.0}}</dt>
+ <dd>{{$profile.book.1}}</dd>
</dl>
-{{ endif }}
+{{/if}}
-{{ if $profile.tv }}
+{{if $profile.tv}}
<dl id="aprofile-tv" class="aprofile">
- <dt>$profile.tv.0</dt>
- <dd>$profile.tv.1</dd>
+ <dt>{{$profile.tv.0}}</dt>
+ <dd>{{$profile.tv.1}}</dd>
</dl>
-{{ endif }}
+{{/if}}
-{{ if $profile.film }}
+{{if $profile.film}}
<dl id="aprofile-film" class="aprofile">
- <dt>$profile.film.0</dt>
- <dd>$profile.film.1</dd>
+ <dt>{{$profile.film.0}}</dt>
+ <dd>{{$profile.film.1}}</dd>
</dl>
-{{ endif }}
+{{/if}}
-{{ if $profile.romance }}
+{{if $profile.romance}}
<dl id="aprofile-romance" class="aprofile">
- <dt>$profile.romance.0</dt>
- <dd>$profile.romance.1</dd>
+ <dt>{{$profile.romance.0}}</dt>
+ <dd>{{$profile.romance.1}}</dd>
</dl>
-{{ endif }}
+{{/if}}
-{{ if $profile.work }}
+{{if $profile.work}}
<dl id="aprofile-work" class="aprofile">
- <dt>$profile.work.0</dt>
- <dd>$profile.work.1</dd>
+ <dt>{{$profile.work.0}}</dt>
+ <dd>{{$profile.work.1}}</dd>
</dl>
-{{ endif }}
+{{/if}}
-{{ if $profile.education }}
+{{if $profile.education}}
<dl id="aprofile-education" class="aprofile">
- <dt>$profile.education.0</dt>
- <dd>$profile.education.1</dd>
-</dl>
-{{ endif }}
-
-
-
-
+ <dt>{{$profile.education.0}}</dt>
+ <dd>{{$profile.education.1}}</dd>
+</dl>
+{{/if}}
+
+{{if $things}}
+{{foreach $things as $key => $items}}
+<b>{{$profile.fullname.1}} {{$key}}</b>
+<ul class="profile-thing-list">
+{{foreach $items as $item}}
+<li>{{if $item.img}}<img src="{{$item.img}}" width="100" height="100" alt="{{$item.term}}" />{{/if}}
+<a href="{{$item.url}}" >{{$item.term}}</a>
+</li>
+{{/foreach}}
+</ul>
+<div class="clear"></div>
+{{/foreach}}
+{{/if}}
+
+</div>
diff --git a/view/tpl/profile_edit.tpl b/view/tpl/profile_edit.tpl
index a498f3a65..196b3ac6d 100644..100755
--- a/view/tpl/profile_edit.tpl
+++ b/view/tpl/profile_edit.tpl
@@ -1,14 +1,14 @@
-$default
+{{$default}}
-<h1>$banner</h1>
+<h1>{{$banner}}</h1>
<div id="profile-edit-links">
<ul>
-<li><a href="profile_photo" id="profile-photo_upload-link" title="$profpic">$profpic</a></li>
-<li><a href="profile/$profile_id/view?tab=profile" id="profile-edit-view-link" title="$viewprof">$viewprof</a></li>
-<li><a href="$profile_clone_link" id="profile-edit-clone-link" title="$cr_prof">$cl_prof</a></li>
+<li><a href="profile_photo" id="profile-photo_upload-link" title="{{$profpic}}">{{$profpic}}</a></li>
+<li><a href="profile/{{$profile_id}}/view" id="profile-edit-view-link" title="{{$viewprof}}">{{$viewprof}}</a></li>
+<li><a href="{{$profile_clone_link}}" id="profile-edit-clone-link" title="{{$cr_prof}}">{{$cl_prof}}</a></li>
<li></li>
-<li><a href="$profile_drop_link" id="profile-edit-drop-link" title="$del_prof" $disabled >$del_prof</a></li>
+<li><a href="{{$profile_drop_link}}" id="profile-edit-drop-link" title="{{$del_prof}}" {{$disabled}} >{{$del_prof}}</a></li>
</ul>
</div>
@@ -17,147 +17,149 @@ $default
<div id="profile-edit-wrapper" >
-<form id="profile-edit-form" name="form1" action="profiles/$profile_id" method="post" >
-<input type='hidden' name='form_security_token' value='$form_security_token'>
+<form id="profile-edit-form" name="form1" action="profiles/{{$profile_id}}" method="post" >
+<input type='hidden' name='form_security_token' value='{{$form_security_token}}'>
<div id="profile-edit-profile-name-wrapper" >
-<label id="profile-edit-profile-name-label" for="profile-edit-profile-name" >$lbl_profname </label>
-<input type="text" size="32" name="profile_name" id="profile-edit-profile-name" value="$profile_name" /><div class="required">*</div>
+<label id="profile-edit-profile-name-label" for="profile-edit-profile-name" >{{$lbl_profname}} </label>
+<input type="text" size="32" name="profile_name" id="profile-edit-profile-name" value="{{$profile_name}}" /><div class="required">*</div>
</div>
<div id="profile-edit-profile-name-end"></div>
<div id="profile-edit-name-wrapper" >
-<label id="profile-edit-name-label" for="profile-edit-name" >$lbl_fullname </label>
-<input type="text" size="32" name="name" id="profile-edit-name" value="$name" />
+<label id="profile-edit-name-label" for="profile-edit-name" >{{$lbl_fullname}} </label>
+<input type="text" size="32" name="name" id="profile-edit-name" value="{{$name}}" />
</div>
<div id="profile-edit-name-end"></div>
<div id="profile-edit-pdesc-wrapper" >
-<label id="profile-edit-pdesc-label" for="profile-edit-pdesc" >$lbl_title </label>
-<input type="text" size="32" name="pdesc" id="profile-edit-pdesc" value="$pdesc" />
+<label id="profile-edit-pdesc-label" for="profile-edit-pdesc" >{{$lbl_title}} </label>
+<input type="text" size="32" name="pdesc" id="profile-edit-pdesc" value="{{$pdesc}}" />
</div>
<div id="profile-edit-pdesc-end"></div>
<div id="profile-edit-gender-wrapper" >
-<label id="profile-edit-gender-label" for="gender-select" >$lbl_gender </label>
-$gender
+<label id="profile-edit-gender-label" for="gender-select" >{{$lbl_gender}} </label>
+{{$gender}}
</div>
<div id="profile-edit-gender-end"></div>
<div id="profile-edit-dob-wrapper" >
-<label id="profile-edit-dob-label" for="dob-select" >$lbl_bd </label>
+<label id="profile-edit-dob-label" for="dob-select" >{{$lbl_bd}} </label>
<div id="profile-edit-dob" >
-$dob $age
+{{$dob}} {{$age}}
</div>
</div>
<div id="profile-edit-dob-end"></div>
-$hide_friends
+{{$hide_friends}}
<div class="profile-edit-submit-wrapper" >
-<input type="submit" name="submit" class="profile-edit-submit-button" value="$submit" />
+<input type="submit" name="submit" class="profile-edit-submit-button" value="{{$submit}}" />
</div>
<div class="profile-edit-submit-end"></div>
<div id="profile-edit-address-wrapper" >
-<label id="profile-edit-address-label" for="profile-edit-address" >$lbl_address </label>
-<input type="text" size="32" name="address" id="profile-edit-address" value="$address" />
+<label id="profile-edit-address-label" for="profile-edit-address" >{{$lbl_address}} </label>
+<input type="text" size="32" name="address" id="profile-edit-address" value="{{$address}}" />
</div>
<div id="profile-edit-address-end"></div>
<div id="profile-edit-locality-wrapper" >
-<label id="profile-edit-locality-label" for="profile-edit-locality" >$lbl_city </label>
-<input type="text" size="32" name="locality" id="profile-edit-locality" value="$locality" />
+<label id="profile-edit-locality-label" for="profile-edit-locality" >{{$lbl_city}} </label>
+<input type="text" size="32" name="locality" id="profile-edit-locality" value="{{$locality}}" />
</div>
<div id="profile-edit-locality-end"></div>
<div id="profile-edit-postal-code-wrapper" >
-<label id="profile-edit-postal-code-label" for="profile-edit-postal-code" >$lbl_zip </label>
-<input type="text" size="32" name="postal_code" id="profile-edit-postal-code" value="$postal_code" />
+<label id="profile-edit-postal-code-label" for="profile-edit-postal-code" >{{$lbl_zip}} </label>
+<input type="text" size="32" name="postal_code" id="profile-edit-postal-code" value="{{$postal_code}}" />
</div>
<div id="profile-edit-postal-code-end"></div>
<div id="profile-edit-region-wrapper" >
-<label id="profile-edit-region-label" for="profile-edit-region" >$lbl_region </label>
-<input type="text" size="32" name="region" id="profile-edit-region" value="$region" />
+<label id="profile-edit-region-label" for="profile-edit-region" >{{$lbl_region}} </label>
+<input type="text" size="32" name="region" id="profile-edit-region" value="{{$region}}" />
</div>
<div id="profile-edit-region-end"></div>
<div id="profile-edit-country-name-wrapper" >
-<label id="profile-edit-country-name-label" for="profile-edit-country-name" >$lbl_country </label>
-<input type="text" size="32" name="country_name" id="profile-edit-country-name" value="$country_name" />
+<label id="profile-edit-country-name-label" for="profile-edit-country-name" >{{$lbl_country}} </label>
+<input type="text" size="32" name="country_name" id="profile-edit-country-name" value="{{$country_name}}" />
</div>
<div id="profile-edit-country-name-end"></div>
<div id="profile-edit-hometown-wrapper" >
-<label id="profile-edit-hometown-label" for="profile-edit-hometown" >$lbl_hometown </label>
-<input type="text" size="32" name="hometown" id="profile-edit-hometown" value="$hometown" />
+<label id="profile-edit-hometown-label" for="profile-edit-hometown" >{{$lbl_hometown}} </label>
+<input type="text" size="32" name="hometown" id="profile-edit-hometown" value="{{$hometown}}" />
</div>
<div id="profile-edit-hometown-end"></div>
<div class="profile-edit-submit-wrapper" >
-<input type="submit" name="submit" class="profile-edit-submit-button" value="$submit" />
+<input type="submit" name="submit" class="profile-edit-submit-button" value="{{$submit}}" />
</div>
<div class="profile-edit-submit-end"></div>
<div id="profile-edit-marital-wrapper" >
-<label id="profile-edit-marital-label" for="profile-edit-marital" >$lbl_marital </label>
-$marital
+<label id="profile-edit-marital-label" for="profile-edit-marital" >{{$lbl_marital}} </label>
+{{$marital}}
</div>
-<label id="profile-edit-with-label" for="profile-edit-with" > $lbl_with </label>
-<input type="text" size="32" name="with" id="profile-edit-with" title="$lbl_ex1" value="$with" />
-<label id="profile-edit-howlong-label" for="profile-edit-howlong" > $lbl_howlong </label>
-<input type="text" size="32" name="howlong" id="profile-edit-howlong" title="$lbl_howlong" value="$howlong" />
+<div class="clear"></div>
+<label id="profile-edit-with-label" for="profile-edit-with" > {{$lbl_with}} </label>
+<input type="text" size="32" name="with" id="profile-edit-with" title="{{$lbl_ex1}}" value="{{$with}}" />
+<div class="clear"></div>
+<label id="profile-edit-howlong-label" for="profile-edit-howlong" > {{$lbl_howlong}} </label>
+<input type="text" size="32" name="howlong" id="profile-edit-howlong" title="{{$lbl_howlong}}" value="{{$howlong}}" />
<div id="profile-edit-marital-end"></div>
<div id="profile-edit-sexual-wrapper" >
-<label id="profile-edit-sexual-label" for="sexual-select" >$lbl_sexual </label>
-$sexual
+<label id="profile-edit-sexual-label" for="sexual-select" >{{$lbl_sexual}} </label>
+{{$sexual}}
</div>
<div id="profile-edit-sexual-end"></div>
<div id="profile-edit-homepage-wrapper" >
-<label id="profile-edit-homepage-label" for="profile-edit-homepage" >$lbl_homepage </label>
-<input type="text" size="32" name="homepage" id="profile-edit-homepage" value="$homepage" />
+<label id="profile-edit-homepage-label" for="profile-edit-homepage" >{{$lbl_homepage}} </label>
+<input type="text" size="32" name="homepage" id="profile-edit-homepage" value="{{$homepage}}" />
</div>
<div id="profile-edit-homepage-end"></div>
<div id="profile-edit-politic-wrapper" >
-<label id="profile-edit-politic-label" for="profile-edit-politic" >$lbl_politic </label>
-<input type="text" size="32" name="politic" id="profile-edit-politic" value="$politic" />
+<label id="profile-edit-politic-label" for="profile-edit-politic" >{{$lbl_politic}} </label>
+<input type="text" size="32" name="politic" id="profile-edit-politic" value="{{$politic}}" />
</div>
<div id="profile-edit-politic-end"></div>
<div id="profile-edit-religion-wrapper" >
-<label id="profile-edit-religion-label" for="profile-edit-religion" >$lbl_religion </label>
-<input type="text" size="32" name="religion" id="profile-edit-religion" value="$religion" />
+<label id="profile-edit-religion-label" for="profile-edit-religion" >{{$lbl_religion}} </label>
+<input type="text" size="32" name="religion" id="profile-edit-religion" value="{{$religion}}" />
</div>
<div id="profile-edit-religion-end"></div>
<div id="profile-edit-pubkeywords-wrapper" >
-<label id="profile-edit-pubkeywords-label" for="profile-edit-pubkeywords" >$lbl_pubkey </label>
-<input type="text" size="32" name="keywords" id="profile-edit-pubkeywords" title="$lbl_ex2" value="$keywords" />
-</div><div id="profile-edit-pubkeywords-desc">$lbl_pubdsc</div>
+<label id="profile-edit-pubkeywords-label" for="profile-edit-pubkeywords" >{{$lbl_pubkey}} </label>
+<input type="text" size="32" name="keywords" id="profile-edit-pubkeywords" title="{{$lbl_ex2}}" value="{{$keywords}}" />
+</div><div id="profile-edit-pubkeywords-desc">{{$lbl_pubdsc}}</div>
<div id="profile-edit-pubkeywords-end"></div>
<div class="profile-edit-submit-wrapper" >
-<input type="submit" name="submit" class="profile-edit-submit-button" value="$submit" />
+<input type="submit" name="submit" class="profile-edit-submit-button" value="{{$submit}}" />
</div>
<div class="profile-edit-submit-end"></div>
<div id="about-jot-wrapper" >
<p id="about-jot-desc" >
-$lbl_about
+{{$lbl_about}}
</p>
-<textarea rows="10" cols="72" id="profile-about-text" name="about" >$about</textarea>
+<textarea rows="10" cols="72" id="profile-about-text" name="about" >{{$about}}</textarea>
</div>
<div id="about-jot-end"></div>
@@ -165,10 +167,10 @@ $lbl_about
<div id="interest-jot-wrapper" >
<p id="interest-jot-desc" >
-$lbl_hobbies
+{{$lbl_hobbies}}
</p>
-<textarea rows="10" cols="72" id="interest-jot-text" name="interest" >$interest</textarea>
+<textarea rows="10" cols="72" id="interest-jot-text" name="interest" >{{$interest}}</textarea>
</div>
<div id="interest-jot-end"></div>
@@ -176,10 +178,10 @@ $lbl_hobbies
<div id="likes-jot-wrapper" >
<p id="likes-jot-desc" >
-$lbl_likes
+{{$lbl_likes}}
</p>
-<textarea rows="10" cols="72" id="likes-jot-text" name="likes" >$likes</textarea>
+<textarea rows="10" cols="72" id="likes-jot-text" name="likes" >{{$likes}}</textarea>
</div>
<div id="likes-jot-end"></div>
@@ -187,10 +189,10 @@ $lbl_likes
<div id="dislikes-jot-wrapper" >
<p id="dislikes-jot-desc" >
-$lbl_dislikes
+{{$lbl_dislikes}}
</p>
-<textarea rows="10" cols="72" id="dislikes-jot-text" name="dislikes" >$dislikes</textarea>
+<textarea rows="10" cols="72" id="dislikes-jot-text" name="dislikes" >{{$dislikes}}</textarea>
</div>
<div id="dislikes-jot-end"></div>
@@ -198,37 +200,46 @@ $lbl_dislikes
<div id="contact-jot-wrapper" >
<p id="contact-jot-desc" >
-$lbl_social
+{{$lbl_social}}
</p>
-<textarea rows="10" cols="72" id="contact-jot-text" name="contact" >$contact</textarea>
+<textarea rows="10" cols="72" id="contact-jot-text" name="contact" >{{$contact}}</textarea>
</div>
<div id="contact-jot-end"></div>
+<div id="channels-jot-wrapper" >
+<p id="channels-jot-desc" >
+{{$lbl_channels}}
+</p>
+
+<textarea rows="10" cols="72" id="channels-jot-text" name="channels" >{{$channels}}</textarea>
+
+</div>
+<div id="channels-jot-end"></div>
<div class="profile-edit-submit-wrapper" >
-<input type="submit" name="submit" class="profile-edit-submit-button" value="$submit" />
+<input type="submit" name="submit" class="profile-edit-submit-button" value="{{$submit}}" />
</div>
<div class="profile-edit-submit-end"></div>
<div id="music-jot-wrapper" >
<p id="music-jot-desc" >
-$lbl_music
+{{$lbl_music}}
</p>
-<textarea rows="10" cols="72" id="music-jot-text" name="music" >$music</textarea>
+<textarea rows="10" cols="72" id="music-jot-text" name="music" >{{$music}}</textarea>
</div>
<div id="music-jot-end"></div>
<div id="book-jot-wrapper" >
<p id="book-jot-desc" >
-$lbl_book
+{{$lbl_book}}
</p>
-<textarea rows="10" cols="72" id="book-jot-text" name="book" >$book</textarea>
+<textarea rows="10" cols="72" id="book-jot-text" name="book" >{{$book}}</textarea>
</div>
<div id="book-jot-end"></div>
@@ -237,10 +248,10 @@ $lbl_book
<div id="tv-jot-wrapper" >
<p id="tv-jot-desc" >
-$lbl_tv
+{{$lbl_tv}}
</p>
-<textarea rows="10" cols="72" id="tv-jot-text" name="tv" >$tv</textarea>
+<textarea rows="10" cols="72" id="tv-jot-text" name="tv" >{{$tv}}</textarea>
</div>
<div id="tv-jot-end"></div>
@@ -249,27 +260,27 @@ $lbl_tv
<div id="film-jot-wrapper" >
<p id="film-jot-desc" >
-$lbl_film
+{{$lbl_film}}
</p>
-<textarea rows="10" cols="72" id="film-jot-text" name="film" >$film</textarea>
+<textarea rows="10" cols="72" id="film-jot-text" name="film" >{{$film}}</textarea>
</div>
<div id="film-jot-end"></div>
<div class="profile-edit-submit-wrapper" >
-<input type="submit" name="submit" class="profile-edit-submit-button" value="$submit" />
+<input type="submit" name="submit" class="profile-edit-submit-button" value="{{$submit}}" />
</div>
<div class="profile-edit-submit-end"></div>
<div id="romance-jot-wrapper" >
<p id="romance-jot-desc" >
-$lbl_love
+{{$lbl_love}}
</p>
-<textarea rows="10" cols="72" id="romance-jot-text" name="romance" >$romance</textarea>
+<textarea rows="10" cols="72" id="romance-jot-text" name="romance" >{{$romance}}</textarea>
</div>
<div id="romance-jot-end"></div>
@@ -278,10 +289,10 @@ $lbl_love
<div id="work-jot-wrapper" >
<p id="work-jot-desc" >
-$lbl_work
+{{$lbl_work}}
</p>
-<textarea rows="10" cols="72" id="work-jot-text" name="work" >$work</textarea>
+<textarea rows="10" cols="72" id="work-jot-text" name="work" >{{$work}}</textarea>
</div>
<div id="work-jot-end"></div>
@@ -290,10 +301,10 @@ $lbl_work
<div id="education-jot-wrapper" >
<p id="education-jot-desc" >
-$lbl_school
+{{$lbl_school}}
</p>
-<textarea rows="10" cols="72" id="education-jot-text" name="education" >$education</textarea>
+<textarea rows="10" cols="72" id="education-jot-text" name="education" >{{$education}}</textarea>
</div>
<div id="education-jot-end"></div>
@@ -301,7 +312,7 @@ $lbl_school
<div class="profile-edit-submit-wrapper" >
-<input type="submit" name="submit" class="profile-edit-submit-button" value="$submit" />
+<input type="submit" name="submit" class="profile-edit-submit-button" value="{{$submit}}" />
</div>
<div class="profile-edit-submit-end"></div>
diff --git a/view/tpl/profile_edlink.tpl b/view/tpl/profile_edlink.tpl
deleted file mode 100644
index ea787b9f5..000000000
--- a/view/tpl/profile_edlink.tpl
+++ /dev/null
@@ -1,2 +0,0 @@
-<div class="profile-edit-side-div"><a class="profile-edit-side-link icon edit" title="$editprofile" href="profiles/$profid" ></a></div>
-<div class="clear"></div> \ No newline at end of file
diff --git a/view/tpl/profile_entry.tpl b/view/tpl/profile_entry.tpl
index 7ff6d685b..cc0f3477c 100644..100755
--- a/view/tpl/profile_entry.tpl
+++ b/view/tpl/profile_entry.tpl
@@ -1,11 +1,10 @@
-
<div class="profile-listing" >
<div class="profile-listing-photo-wrapper" >
-<a href="profiles/$id" class="profile-listing-edit-link"><img class="profile-listing-photo" id="profile-listing-photo-$id" src="$photo" alt="$alt" /></a>
+<a href="profiles/{{$id}}" class="profile-listing-edit-link"><img class="profile-listing-photo" id="profile-listing-photo-{{$id}}" src="{{$photo}}" alt="{{$alt}}" /></a>
</div>
<div class="profile-listing-photo-end"></div>
-<div class="profile-listing-name" id="profile-listing-name-$id"><a href="profiles/$id" class="profile-listing-edit-link" >$profile_name</a></div>
-<div class="profile-listing-visible">$visible</div>
+<div class="profile-listing-name" id="profile-listing-name-{{$id}}"><a href="profiles/{{$id}}" class="profile-listing-edit-link" >{{$profile_name}}</a></div>
+<div class="profile-listing-visible">{{$visible}}</div>
</div>
<div class="profile-listing-end"></div>
diff --git a/view/tpl/profile_listing_header.tpl b/view/tpl/profile_listing_header.tpl
index 61a273792..856d689f1 100644..100755
--- a/view/tpl/profile_listing_header.tpl
+++ b/view/tpl/profile_listing_header.tpl
@@ -1,8 +1,11 @@
-<h1>$header</h1>
+<h1>{{$header}}</h1>
<p id="profile-listing-desc" class="button" >
-<a href="profile_photo" >$chg_photo</a>
+<a href="profile_photo" >{{$chg_photo}}</a>
</p>
-<div id="profile-listing-new-link-wrapper" class="button" >
-<a href="$cr_new_link" id="profile-listing-new-link" title="$cr_new" >$cr_new</a>
+<p id="profile-stuff-link" class="button">
+<a href="thing" title="{{$stuff_desc}}">{{$addstuff}}</a>
+</p>
+<p id="profile-listing-new-link-wrapper" class="button" >
+<a href="{{$cr_new_link}}" id="profile-listing-new-link" title="{{$cr_new}}" >{{$cr_new}}</a>
</div>
diff --git a/view/tpl/profile_photo.tpl b/view/tpl/profile_photo.tpl
index 05952afa4..48a3c7f26 100644..100755
--- a/view/tpl/profile_photo.tpl
+++ b/view/tpl/profile_photo.tpl
@@ -1,29 +1,29 @@
-<h1>$title</h1>
+<h1>{{$title}}</h1>
<form enctype="multipart/form-data" action="profile_photo" method="post">
-<input type='hidden' name='form_security_token' value='$form_security_token'>
+<input type='hidden' name='form_security_token' value='{{$form_security_token}}'>
<div id="profile-photo-upload-wrapper">
-<label id="profile-photo-upload-label" class="form-label" for="profile-photo-upload">$lbl_upfile</label>
+<label id="profile-photo-upload-label" class="form-label" for="profile-photo-upload">{{$lbl_upfile}}</label>
<input name="userfile" class="form-input" type="file" id="profile-photo-upload" size="48" />
<div class="clear"></div>
-<label id="profile-photo-profiles-label" class="form-label" for="profile-photo-profiles">$lbl_profiles</label>
+<label id="profile-photo-profiles-label" class="form-label" for="profile-photo-profiles">{{$lbl_profiles}}</label>
<select name="profile" id="profile-photo-profiles" class="form-input" >
-{{ for $profiles as $p }}
-<option value="$p.id" {{ if $p.is_default }}selected="selected"{{ endif }}>$p.name</option>
-{{ endfor }}
+{{foreach $profiles as $p}}
+<option value="{{$p.id}}" {{if $p.is_default}}selected="selected"{{/if}}>{{$p.name}}</option>
+{{/foreach}}
</select>
<div class="clear"></div>
<div id="profile-photo-submit-wrapper">
-<input type="submit" name="submit" id="profile-photo-submit" value="$submit">
+<input type="submit" name="submit" id="profile-photo-submit" value="{{$submit}}">
</div>
</div>
</form>
<div id="profile-photo-link-select-wrapper">
-$select
-</div> \ No newline at end of file
+{{$select}}
+</div>
diff --git a/view/tpl/profile_publish.tpl b/view/tpl/profile_publish.tpl
deleted file mode 100644
index 8fd0bc913..000000000
--- a/view/tpl/profile_publish.tpl
+++ /dev/null
@@ -1,16 +0,0 @@
-<p id="profile-publish-desc-$instance">
-$pubdesc
-</p>
-
- <div id="profile-publish-yes-wrapper-$instance">
- <label id="profile-publish-yes-label-$instance" for="profile-publish-yes-$instance">$str_yes</label>
- <input type="radio" name="profile_publish_$instance" id="profile-publish-yes-$instance" $yes_selected value="1" />
-
- <div id="profile-publish-break-$instance" ></div>
- </div>
- <div id="profile-publish-no-wrapper-$instance">
- <label id="profile-publish-no-label-$instance" for="profile-publish-no-$instance">$str_no</label>
- <input type="radio" name="profile_publish_$instance" id="profile-publish-no-$instance" $no_selected value="0" />
-
- <div id="profile-publish-end-$instance"></div>
- </div>
diff --git a/view/tpl/profile_vcard.tpl b/view/tpl/profile_vcard.tpl
index 323658463..aaee02ab5 100644..100755
--- a/view/tpl/profile_vcard.tpl
+++ b/view/tpl/profile_vcard.tpl
@@ -1,52 +1,59 @@
<div class="vcard">
- {{ if $profile.edit }}
+ {{if $profile.edit}}
<div class="action">
- <a class="profile-edit-side-link icon edit" rel="#profiles-menu" title="$profile.edit.3" href="#" ><span>$profile.edit.1</span></a>
+ <a class="profile-edit-side-link" rel="#profiles-menu" title="{{$profile.edit.3}}" href="#" ><i class="icon-pencil vcard-profile-edit-icon" title="{{$profile.edit.1}}" ></i></a>
<ul id="profiles-menu" class="menu-popup">
- {{ for $profile.menu.entries as $e }}
+ {{foreach $profile.menu.entries as $e}}
<li>
- <a href="profiles/$e.id"><img src='$e.photo'>$e.profile_name</a>
+ <a href="profiles/{{$e.id}}"><img src='{{$e.photo}}'>{{$e.profile_name}}</a>
</li>
- {{ endfor }}
- <li><a href="profile_photo" >$profile.menu.chg_photo</a></li>
- <li><a href="profiles/new" id="profile-listing-new-link">$profile.menu.cr_new</a></li>
+ {{/foreach}}
+ <li><a href="profile_photo" >{{$profile.menu.chg_photo}}</a></li>
+ <li><a href="profiles/new" id="profile-listing-new-link">{{$profile.menu.cr_new}}</a></li>
</ul>
</div>
- {{ endif }}
+ {{/if}}
- <div class="fn label">$profile.name</div>
+ <div class="fn label">{{$profile.name}}</div>
- {{ if $pdesc }}<div class="title">$profile.pdesc</div>{{ endif }}
- <div id="profile-photo-wrapper"><img class="photo" width="175" height="175" src="$profile.photo?rev=$profile.picdate" alt="$profile.name"></div>
+ {{if $pdesc}}<div class="title">{{$profile.pdesc}}</div>{{/if}}
+ <div id="profile-photo-wrapper"><img class="photo" width="175" height="175" src="{{$profile.photo}}?rev={{$profile.picdate}}" alt="{{$profile.name}}"></div>
- {{ if $location }}
- <dl class="location"><dt class="location-label">$location</dt>
+ {{if $location}}
+ <dl class="location"><dt class="location-label">{{$location}}</dt>
<dd class="adr">
- {{ if $profile.address }}<div class="street-address">$profile.address</div>{{ endif }}
+ {{if $profile.address}}<div class="street-address">{{$profile.address}}</div>{{/if}}
<span class="city-state-zip">
- <span class="locality">$profile.locality</span>{{ if $profile.locality }}, {{ endif }}
- <span class="region">$profile.region</span>
- <span class="postal-code">$profile.postal_code</span>
+ <span class="locality">{{$profile.locality}}</span>{{if $profile.locality}}, {{/if}}
+ <span class="region">{{$profile.region}}</span>
+ <span class="postal-code">{{$profile.postal_code}}</span>
</span>
- {{ if $profile.country_name }}<span class="country-name">$profile.country_name</span>{{ endif }}
+ {{if $profile.country_name}}<span class="country-name">{{$profile.country_name}}</span>{{/if}}
</dd>
</dl>
- {{ endif }}
+ {{/if}}
- {{ if $gender }}<dl class="mf"><dt class="gender-label">$gender</dt> <dd class="x-gender">$profile.gender</dd></dl>{{ endif }}
+ {{if $gender}}<dl class="mf"><dt class="gender-label">{{$gender}}</dt> <dd class="x-gender">{{$profile.gender}}</dd></dl>{{/if}}
- {{ if $marital }}<dl class="marital"><dt class="marital-label"><span class="heart">&hearts;</span>$marital</dt><dd class="marital-text">$profile.marital</dd></dl>{{ endif }}
+ {{if $marital}}<dl class="marital"><dt class="marital-label"><span class="heart">&hearts;</span>{{$marital}}</dt><dd class="marital-text">{{$profile.marital}}</dd></dl>{{/if}}
- {{ if $homepage }}<dl class="homepage"><dt class="homepage-label">$homepage</dt><dd class="homepage-url"><a href="$profile.homepage" >$profile.homepage</a></dd></dl>{{ endif }}
+ {{if $homepage}}<dl class="homepage"><dt class="homepage-label">{{$homepage}}</dt><dd class="homepage-url"><a href="{{$profile.homepage}}" >{{$profile.homepage}}</a></dd></dl>{{/if}}
+
+{{if $connect}}
+<a href="{{$connect_url}}" class="rconnect">{{$connect}}</a>
+{{/if}}
</div>
<div id="vcard-end"></div>
-$contact_block
+
+{{$chanmenu}}
+
+{{$contact_block}}
diff --git a/view/tpl/prv_message.tpl b/view/tpl/prv_message.tpl
index 3f0bd937f..3330a338f 100644..100755
--- a/view/tpl/prv_message.tpl
+++ b/view/tpl/prv_message.tpl
@@ -1,37 +1,52 @@
-
-<h3>$header</h3>
+<h3>{{$header}}</h3>
<div id="prvmail-wrapper" >
-<form id="prvmail-form" action="message" method="post" >
+<form id="prvmail-form" action="mail" method="post" >
+
+{{$parent}}
-$parent
+<div id="prvmail-to-label">{{$to}}</div>
-<div id="prvmail-to-label">$to</div>
+{{if $showinputs}}
+<input type="text" id="recip" name="messagerecip" value="{{$prefill}}" maxlength="255" size="64" tabindex="10" />
+<input type="hidden" id="recip-complete" name="messageto" value="{{$preid}}">
+{{else}}
+{{$select}}
+{{/if}}
-{{ if $showinputs }}
-<input type="text" id="recip" name="messagerecip" value="$prefill" maxlength="255" size="64" tabindex="10" />
-<input type="hidden" id="recip-complete" name="messageto" value="$preid">
-{{ else }}
-$select
-{{ endif }}
+<input type="hidden" id="inp-prvmail-expires" name="expires" value="{{$defexpire}}" />
+<input type="hidden" name="media_str" id="jot-media" value="" />
-<div id="prvmail-subject-label">$subject</div>
-<input type="text" size="64" maxlength="255" id="prvmail-subject" name="subject" value="$subjtxt" $readonly tabindex="11" />
+<div id="prvmail-subject-label">{{$subject}}</div>
+<input type="text" size="64" maxlength="255" id="prvmail-subject" name="subject" value="{{$subjtxt}}" {{$readonly}} tabindex="11" />
-<div id="prvmail-message-label">$yourmessage</div>
-<textarea rows="8" cols="72" class="prvmail-text" id="prvmail-text" name="body" tabindex="12">$text</textarea>
+<div id="prvmail-message-label">{{$yourmessage}}</div>
+<textarea rows="8" cols="72" class="prvmail-text" id="prvmail-text" name="body" tabindex="12">{{$text}}</textarea>
<div id="prvmail-submit-wrapper" >
- <input type="submit" id="prvmail-submit" name="submit" value="$submit" tabindex="13" />
+ <input type="submit" id="prvmail-submit" name="submit" value="{{$submit}}" tabindex="13" />
<div id="prvmail-upload-wrapper" >
- <div id="prvmail-upload" class="icon border camera" title="$upload" ></div>
+ <i id="prvmail-upload" class="icon-camera jot-icons" title="{{$upload}}"></i>
+ </div>
+
+ <div id="prvmail-attach-wrapper" >
+ <i id="prvmail-attach" class="icon-paper-clip jot-icons" title="{{$attach}}"></i>
</div>
+
<div id="prvmail-link-wrapper" >
- <div id="prvmail-link" class="icon border link" title="$insert" onclick="jotGetLink();" ></div>
+ <i id="prvmail-link" class="icon-link jot-icons" title="{{$insert}}" onclick="jotGetLink(); return false;"></i>
+ </div>
+
+ <div id="prvmail-expire-wrapper" style="display: {{$feature_expire}};" >
+ <i id="prvmail-expires" class="icon-eraser jot-icons" title="{{$expires}}" onclick="prvmailGetExpiry();return false;"></i>
+ </div>
+ <div id="prvmail-encrypt-wrapper" style="display: {{$feature_encrypt}};" >
+ <i id="prvmail-encrypt" class="icon-key jot-icons" title="{{$encrypt}}" onclick="red_encrypt('{{$cipher}}','#prvmail-text',$('#prvmail-text').val());return false;"></i>
</div>
+
<div id="prvmail-rotator-wrapper" >
- <img id="prvmail-rotator" src="images/rotator.gif" alt="$wait" title="$wait" style="display: none;" />
+ <img id="prvmail-rotator" src="images/rotator.gif" alt="{{$wait}}" title="{{$wait}}" style="display: none;" />
</div>
</div>
<div id="prvmail-end"></div>
diff --git a/view/tpl/pwdreset.tpl b/view/tpl/pwdreset.tpl
index 497b93396..a9106343f 100644..100755
--- a/view/tpl/pwdreset.tpl
+++ b/view/tpl/pwdreset.tpl
@@ -1,17 +1,15 @@
-<h3>$lbl1</h3>
+<h3>{{$lbl1}}</h3>
<p>
-$lbl2
+{{$lbl2}}
</p>
<p>
-$lbl3
+{{$lbl3}}
</p>
+<p>{{$newpass}}</p>
<p>
-$newpass
+{{$lbl4}} {{$lbl5}}
</p>
<p>
-$lbl4 $lbl5
-</p>
-<p>
-$lbl6
+{{$lbl6}}
</p>
diff --git a/view/tpl/register.tpl b/view/tpl/register.tpl
index 4b565718d..916a946d3 100644..100755
--- a/view/tpl/register.tpl
+++ b/view/tpl/register.tpl
@@ -1,45 +1,51 @@
-<h2>$title</h2>
+<h2>{{$title}}</h2>
<form action="register" method="post" id="register-form">
-{{ if $registertext }}
-<div id="register-desc" class="descriptive-paragraph">$registertext</div>
-{{ endif }}
-{{ if $invitations }}
- <p id="register-invite-desc">$invite_desc</p>
- <label for="register-invite" id="label-register-invite" class="register-label">$label_invite</label>
- <input type="text" maxlength="72" size="32" name="invite_code" id="register-invite" class="register-input" value="$invite_code" />
+{{if $reg_is}}
+<div id="register-desc" class="descriptive-paragraph">{{$reg_is}}</div>
+{{/if}}
+{{if $registertext}}<div id="register-text" class="descriptive-paragraph">{{$registertext}}</div>
+{{/if}}
+{{if $other_sites}}<div id="register-sites" class="descriptive-paragraph">{{$other_sites}}</div>
+{{/if}}
+
+{{if $invitations}}
+ <p id="register-invite-desc">{{$invite_desc}}</p>
+
+ <label for="register-invite" id="label-register-invite" class="register-label">{{$label_invite}}</label>
+ <input type="text" maxlength="72" size="32" name="invite_code" id="register-invite" class="register-input" value="{{$invite_code}}" />
<div id="register-invite-feedback" class="register-feedback"></div>
<div id="register-invite-end" class="register-field-end"></div>
-{{ endif }}
+{{/if}}
- <label for="register-email" id="label-register-email" class="register-label" >$label_email</label>
- <input type="text" maxlength="72" size="32" name="email" id="register-email" class="register-input" value="$email" />
+ <label for="register-email" id="label-register-email" class="register-label" >{{$label_email}}</label>
+ <input type="text" maxlength="72" size="32" name="email" id="register-email" class="register-input" value="{{$email}}" />
<div id="register-email-feedback" class="register-feedback"></div>
<div id="register-email-end" class="register-field-end"></div>
- <label for="register-password" id="label-register-password" class="register-label" >$label_pass1</label>
- <input type="password" maxlength="72" size="32" name="password" id="register-password" class="register-input" value="$pass1" />
+ <label for="register-password" id="label-register-password" class="register-label" >{{$label_pass1}}</label>
+ <input type="password" maxlength="72" size="32" name="password" id="register-password" class="register-input" value="{{$pass1}}" />
<div id="register-password-feedback" class="register-feedback"></div>
<div id="register-password-end" class="register-field-end"></div>
- <label for="register-password2" id="label-register-password2" class="register-label" >$label_pass2</label>
- <input type="password" maxlength="72" size="32" name="password2" id="register-password2" class="register-input" value="$pass2" />
+ <label for="register-password2" id="label-register-password2" class="register-label" >{{$label_pass2}}</label>
+ <input type="password" maxlength="72" size="32" name="password2" id="register-password2" class="register-input" value="{{$pass2}}" />
<div id="register-password2-feedback" class="register-feedback"></div>
<div id="register-password2-end" class="register-field-end"></div>
- {{ if $enable_tos }}
+ {{if $enable_tos}}
<input type="checkbox" name="tos" id="register-tos" value="1" />
- <label for="register-tos" id="label-register-tos">$label_tos</label>
+ <label for="register-tos" id="label-register-tos">{{$label_tos}}</label>
<div id="register-tos-feedback" class="register-feedback"></div>
<div id="register-tos-end" class="register-field-end"></div>
- {{ else }}
+ {{else}}
<input type="hidden" name="tos" value="1" />
- {{ endif }}
+ {{/if}}
- <input type="submit" name="submit" id="register-submit-button" value="$submit" />
+ <input type="submit" name="submit" id="register-submit-button" value="{{$submit}}" />
<div id="register-submit-end" class="register-field-end"></div>
</form>
diff --git a/view/tpl/remote_friends_common.tpl b/view/tpl/remote_friends_common.tpl
index 48bdd548f..d6d2fd211 100644..100755
--- a/view/tpl/remote_friends_common.tpl
+++ b/view/tpl/remote_friends_common.tpl
@@ -1,21 +1,21 @@
<div id="remote-friends-in-common" class="bigwidget">
- <div id="rfic-desc">$desc &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{{ if $linkmore }}<a href="$base/common/$uid">$more</a>{{ endif }}</div>
- {{ if $items }}
- {{ for $items as $item }}
+ <div id="rfic-desc">{{$desc}} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{{if $linkmore}}<a href="{{$base}}/common/{{$uid}}">{{$more}}</a>{{/if}}</div>
+ {{if $items}}
+ {{foreach $items as $item}}
<div class="profile-match-wrapper">
<div class="profile-match-photo">
- <a href="$base/chanview?f=&url=$item.xchan_url">
- <img src="$item.xchan_photo_m" width="80" height="80" alt="$item.xchan_name" title="$item.xchan_name" />
+ <a href="{{$base}}/chanview?f=&url={{$item.xchan_url}}">
+ <img src="{{$item.xchan_photo_m}}" width="80" height="80" alt="{{$item.xchan_name}}" title="{{$item.xchan_name}}" />
</a>
</div>
<div class="profile-match-break"></div>
<div class="profile-match-name">
- <a href="$base/chanview?f=&url=$item.xchan_url" title="$item.xchan_name">$item.xchan_name</a>
+ <a href="{{$base}}/chanview?f=&url={{$item.xchan_url}}" title="{{$item.xchan_name}}">{{$item.xchan_name}}</a>
</div>
<div class="profile-match-end"></div>
</div>
- {{ endfor }}
- {{ endif }}
+ {{/foreach}}
+ {{/if}}
<div id="rfic-end" class="clear"></div>
</div>
diff --git a/view/tpl/removeme.tpl b/view/tpl/removeme.tpl
index a3ca8d4cf..c42eaf0e1 100644..100755
--- a/view/tpl/removeme.tpl
+++ b/view/tpl/removeme.tpl
@@ -1,19 +1,21 @@
-<h1>$title</h1>
+<h1>{{$title}}</h1>
<div id="remove-account-wrapper">
-<div id="remove-account-desc">$desc</div>
+<div id="remove-account-desc">{{$desc}}</div>
-<form action="$basedir/removeme" autocomplete="off" method="post" >
-<input type="hidden" name="verify" value="$hash" />
+<form action="{{$basedir}}/removeme" autocomplete="off" method="post" >
+<input type="hidden" name="verify" value="{{$hash}}" />
<div id="remove-account-pass-wrapper">
-<label id="remove-account-pass-label" for="remove-account-pass">$passwd</label>
+<label id="remove-account-pass-label" for="remove-account-pass">{{$passwd}}</label>
<input type="password" id="remove-account-pass" name="qxz_password" />
</div>
<div id="remove-account-pass-end"></div>
-<input type="submit" name="submit" value="$submit" />
+{{include file="field_checkbox.tpl" field=$global}}
+
+<input type="submit" name="submit" value="{{$submit}}" />
</form>
</div>
diff --git a/view/tpl/rmagic.tpl b/view/tpl/rmagic.tpl
index f16abe975..58df71718 100644..100755
--- a/view/tpl/rmagic.tpl
+++ b/view/tpl/rmagic.tpl
@@ -1,11 +1,11 @@
-<h3>$title</h3>
+<h3>{{$title}}</h3>
<form action="rmagic" method="post" >
- <label for="rmagic-address" id="label-rmagic-address" class="rmagic-label">$desc</label>
+ <label for="rmagic-address" id="label-rmagic-address" class="rmagic-label">{{$desc}}</label>
<input type="text" maxlength="255" size="32" name="address" id="rmagic-address" class="rmagic-input" value="" />
- <input type="submit" name="submit" id="rmagic-submit-button" value="$submit" />
+ <input type="submit" name="submit" id="rmagic-submit-button" value="{{$submit}}" />
<div id="rmagic-submit-end" class="rmagic-field-end"></div>
</form>
diff --git a/view/tpl/safesearch.tpl b/view/tpl/safesearch.tpl
new file mode 100644
index 000000000..e0b2ab538
--- /dev/null
+++ b/view/tpl/safesearch.tpl
@@ -0,0 +1,4 @@
+<div id="directory_safemode" class="widget">
+<h3>{{$safemode}}</h3>
+<a href="toggle_safesearch">{{$toggle}}</a>
+</div>
diff --git a/view/tpl/saved_searches.tpl b/view/tpl/saved_searches.tpl
new file mode 100644
index 000000000..d0f9e2b0e
--- /dev/null
+++ b/view/tpl/saved_searches.tpl
@@ -0,0 +1,14 @@
+<div class="widget" id="saved-search-list">
+ <h3 id="search">{{$title}}</h3>
+ {{$searchbox}}
+
+ <ul id="saved-search-ul">
+ {{foreach $saved as $search}}
+ <li id="search-term-{{$search.id}}" class="saved-search-li clear">
+ <a title="{{$search.delete}}" onclick="return confirmDelete();" id="drop-saved-search-term-{{$search.id}}" href="{{$search.dellink}}"><i id="dropicon-saved-search-term-{{$search.id}}" class="icon-remove drop-icons iconspacer" ></i></a>
+ <a id="saved-search-term-{{$search.id}}" class="savedsearchterm{{if $search.selected}} search-selected{{/if}}" href="{{$search.srchlink}}">{{$search.displayterm}}</a>
+ </li>
+ {{/foreach}}
+ </ul>
+ <div class="clear"></div>
+</div>
diff --git a/view/tpl/saved_searches_aside.tpl b/view/tpl/saved_searches_aside.tpl
index a204c48ff..615eca39d 100644..100755
--- a/view/tpl/saved_searches_aside.tpl
+++ b/view/tpl/saved_searches_aside.tpl
@@ -1,14 +1,14 @@
<div class="widget" id="saved-search-list">
- <h3 id="search">$title</h3>
- $searchbox
+ <h3 id="search">{{$title}}</h3>
+ {{$searchbox}}
<ul id="saved-search-ul">
- {{ for $saved as $search }}
- <li class="saved-search-li clear">
- <a title="$search.delete" onclick="return confirmDelete();" id="drop-saved-search-term-$search.id" class="iconspacer savedsearchdrop " href="network/?f=&amp;remove=1&amp;search=$search.encodedterm"></a>
- <a id="saved-search-term-$search.id" class="savedsearchterm" href="network/?f=&amp;search=$search.encodedterm">$search.displayterm</a>
+ {{foreach $saved as $search}}
+ <li id="search-term-{{$search.id}}" class="saved-search-li clear">
+ <a title="{{$search.delete}}" onclick="return confirmDelete();" id="drop-saved-search-term-{{$search.id}}" href="network/?f=&amp;remove=1&amp;search={{$search.encodedterm}}"><i id="dropicon-saved-search-term-{{$search.id}}" class="icon-remove drop-icons iconspacer savedsearchdrop" ></i></a>
+ <a id="saved-search-term-{{$search.id}}" class="savedsearchterm{{if $search.selected}} search-selected{{/if}}" href="network/?f=&amp;search={{$search.encodedterm}}">{{$search.displayterm}}</a>
</li>
- {{ endfor }}
+ {{/foreach}}
</ul>
<div class="clear"></div>
</div>
diff --git a/view/tpl/search_item.tpl b/view/tpl/search_item.tpl
index 304fca4d5..c5acfa4a4 100644..100755
--- a/view/tpl/search_item.tpl
+++ b/view/tpl/search_item.tpl
@@ -1,62 +1,54 @@
-<div id="thread-wrapper-$item.id" class="thread-wrapper $item.toplevel">
-<a name="$item.id" ></a>
-<div class="wall-item-outside-wrapper $item.indent$item.previewing" id="wall-item-outside-wrapper-$item.id" >
- <div class="wall-item-content-wrapper $item.indent$item.previewing" id="wall-item-content-wrapper-$item.id" >
- <div class="wall-item-info" id="wall-item-info-$item.id">
- <div class="wall-item-photo-wrapper" id="wall-item-photo-wrapper-$item.id"
- onmouseover="if (typeof t$item.id != 'undefined') clearTimeout(t$item.id); openMenu('wall-item-photo-menu-button-$item.id')"
- onmouseout="t$item.id=setTimeout('closeMenu(\'wall-item-photo-menu-button-$item.id\'); closeMenu(\'wall-item-photo-menu-$item.id\');',200)">
- <a href="$item.profile_url" title="$item.linktitle" class="wall-item-photo-link" id="wall-item-photo-link-$item.id">
- <img src="$item.thumb" class="wall-item-photo$item.sparkle" id="wall-item-photo-$item.id" style="height: 80px; width: 80px;" alt="$item.name" /></a>
- <span onclick="openClose('wall-item-photo-menu-$item.id');" class="fakelink wall-item-photo-menu-button" id="wall-item-photo-menu-button-$item.id">menu</span>
- <div class="wall-item-photo-menu" id="wall-item-photo-menu-$item.id">
+<div id="thread-wrapper-{{$item.id}}" class="thread-wrapper {{$item.toplevel}}">
+<a name="{{$item.id}}" ></a>
+<div class="wall-item-outside-wrapper {{$item.indent}}{{$item.previewing}}" id="wall-item-outside-wrapper-{{$item.id}}" >
+ <div class="wall-item-content-wrapper {{$item.indent}}{{$item.previewing}}" id="wall-item-content-wrapper-{{$item.id}}" >
+ <div class="wall-item-info" id="wall-item-info-{{$item.id}}">
+ <div class="wall-item-photo-wrapper" id="wall-item-photo-wrapper-{{$item.id}}"
+ onmouseover="if (typeof t{{$item.id}} != 'undefined') clearTimeout(t{{$item.id}}); openMenu('wall-item-photo-menu-button-{{$item.id}}')"
+ onmouseout="t{{$item.id}}=setTimeout('closeMenu(\'wall-item-photo-menu-button-{{$item.id}}\'); closeMenu(\'wall-item-photo-menu-{{$item.id}}\');',200)">
+ <a href="{{$item.profile_url}}" title="{{$item.linktitle}}" class="wall-item-photo-link" id="wall-item-photo-link-{{$item.id}}">
+ <img src="{{$item.thumb}}" class="wall-item-photo{{$item.sparkle}}" id="wall-item-photo-{{$item.id}}" style="height: 80px; width: 80px;" alt="{{$item.name}}" /></a>
+ <span onclick="openClose('wall-item-photo-menu-{{$item.id}}');" class="fakelink wall-item-photo-menu-button" id="wall-item-photo-menu-button-{{$item.id}}">menu</span>
+ <div class="wall-item-photo-menu" id="wall-item-photo-menu-{{$item.id}}">
<ul>
- $item.item_photo_menu
+ {{$item.item_photo_menu}}
</ul>
</div>
</div>
<div class="wall-item-photo-end"></div>
- <div class="wall-item-wrapper" id="wall-item-wrapper-$item.id" >
- {{ if $item.lock }}<div class="wall-item-lock"><img src="images/lock_icon.gif" class="lockview" alt="$item.lock" onclick="lockview(event,$item.id);" /></div>
- {{ else }}<div class="wall-item-lock"></div>{{ endif }}
- <div class="wall-item-location" id="wall-item-location-$item.id">$item.location</div>
+ <div class="wall-item-wrapper" id="wall-item-wrapper-{{$item.id}}" >
+ {{if $item.lock}}<i class="wall-item-lock icon-lock lockview" title="{{$item.lock}}" onclick="lockview(event,{{$item.id}});" /></i>
+ {{else}}<div class="wall-item-lock"></div>{{/if}}
+ <div class="wall-item-location" id="wall-item-location-{{$item.id}}">{{$item.location}}</div>
</div>
</div>
<div class="wall-item-author">
- <a href="$item.profile_url" title="$item.linktitle" class="wall-item-name-link"><span class="wall-item-name$item.sparkle" id="wall-item-name-$item.id" >$item.name</span></a>
-
- <div id="wall-item-ago-$item.id" class="wall-item-ago"><abbr class="wall-item-ago-time" title="$item.localtime">$item.ago</abbr>{{ if $item.app }}<span class="item.app">$item.str_app</span>{{ endif }}</div>
-
+ <a href="{{$item.profile_url}}" title="{{$item.linktitle}}" class="wall-item-name-link"><span class="wall-item-name{{$item.sparkle}}" id="wall-item-name-{{$item.id}}" >{{$item.name}}</span></a><br />
+ <div class="wall-item-ago" id="wall-item-ago-{{$item.id}}">{{if $item.verified}}<i class="icon-ok" title="{{$item.verified}}"></i>&nbsp;{{/if}}<span class="autotime" title="{{$item.isotime}}">{{$item.localtime}}{{if $item.editedtime}} {{$item.editedtime}}{{/if}}</span>{{if $item.app}}<span class="item.app">{{$item.str_app}}</span>{{/if}}</div>
</div>
- <div class="wall-item-content" id="wall-item-content-$item.id" >
- <div class="wall-item-title" id="wall-item-title-$item.id">$item.title</div>
+ <div class="wall-item-content" id="wall-item-content-{{$item.id}}" >
+ <div class="wall-item-title" id="wall-item-title-{{$item.id}}">{{$item.title}}</div>
<div class="wall-item-title-end"></div>
- <div class="wall-item-body" id="wall-item-body-$item.id" >$item.body
- <div class="body-tag">
- {{ for $item.tags as $tag }}
- <span class='tag'>$tag</span>
- {{ endfor }}
- </div>
- </div>
+ <div class="wall-item-body" id="wall-item-body-{{$item.id}}" >{{$item.body}}</div>
</div>
- <div class="wall-item-tools" id="wall-item-tools-$item.id">
- <div class="wall-item-delete-wrapper" id="wall-item-delete-wrapper-$item.id" >
- {{ if $item.drop.dropping }}<a href="item/drop/$item.id" onclick="return confirmDelete();" class="icon drophide" title="$item.drop.delete" onmouseover="imgbright(this);" onmouseout="imgdull(this);" ></a>{{ endif }}
+ <div class="wall-item-tools" id="wall-item-tools-{{$item.id}}">
+ <div class="wall-item-delete-wrapper" id="wall-item-delete-wrapper-{{$item.id}}" >
+ {{if $item.drop.dropping}}<a href="item/drop/{{$item.id}}" onclick="return confirmDelete();" title="{{$item.drop.delete}}" ><i class="icon-remove drop-icons item-tool"></i></a>{{/if}}
</div>
- {{ if $item.drop.pagedropping }}<input type="checkbox" onclick="checkboxhighlight(this);" title="$item.drop.select" class="item-select" name="itemselected[]" value="$item.id" />{{ endif }}
+ {{if $item.drop.pagedropping}}<input type="checkbox" onclick="checkboxhighlight(this);" title="{{$item.drop.select}}" class="item-select" name="itemselected[]" value="{{$item.id}}" />{{/if}}
<div class="wall-item-delete-end"></div>
</div>
</div>
<div class="wall-item-wrapper-end"></div>
- <div class="wall-item-conv" id="wall-item-conv-$item.id" >
- {{ if $item.conv }}
- <a href='$item.conv.href' id='context-$item.id' title='$item.conv.title'>$item.conv.title</a>
- {{ endif }}
+ <div class="wall-item-conv" id="wall-item-conv-{{$item.id}}" >
+ {{if $item.conv}}
+ <a href='{{$item.conv.href}}' id='context-{{$item.id}}' title='{{$item.conv.title}}'>{{$item.conv.title}}</a>
+ {{/if}}
</div>
-<div class="wall-item-outside-wrapper-end $item.indent" ></div>
+<div class="wall-item-outside-wrapper-end {{$item.indent}}" ></div>
</div>
</div>
diff --git a/view/tpl/sellpage_edit.tpl b/view/tpl/sellpage_edit.tpl
new file mode 100644
index 000000000..0a4726fb2
--- /dev/null
+++ b/view/tpl/sellpage_edit.tpl
@@ -0,0 +1,23 @@
+<h1>{{$header}}</h1>
+<form id="sellpage-edit" action="connect/{{$address}}" method="post">
+
+{{include file="field_checkbox.tpl" field=$premium}}
+
+<div class="descriptive-text">{{$desc}}</div>
+
+<div class="sellpage-editbody">
+<p id="sellpage-bodydesc" >
+{{$lbl_about}}
+</p>
+
+<textarea rows="10" cols="72" id="sellpage-textinp" name="text" >{{$text}}</textarea>
+
+</div>
+<div id="sellpage-editbody-end"></div>
+
+
+<div class="descriptive-text">{{$lbl2}}</div>
+<div class="sellpage-final">{{$desc2}}</div>
+
+<input type="submit" name="submit" value="{{$submit}}" />
+</form>
diff --git a/view/tpl/sellpage_submit.tpl b/view/tpl/sellpage_submit.tpl
new file mode 100644
index 000000000..2bd735ea4
--- /dev/null
+++ b/view/tpl/sellpage_submit.tpl
@@ -0,0 +1,3 @@
+<form id="sellpage-submit" action="connect/{{$address}}" method="post">
+<input type="submit" name="submit" value="{{$continue}}" />
+</form> \ No newline at end of file
diff --git a/view/tpl/sellpage_view.tpl b/view/tpl/sellpage_view.tpl
new file mode 100644
index 000000000..20a65ffbe
--- /dev/null
+++ b/view/tpl/sellpage_view.tpl
@@ -0,0 +1,11 @@
+<div class="generic-content-wrapper">
+<h1>{{$header}}</h1>
+
+<div class="descriptive-text">{{$desc}}</div>
+
+<div class="sellpage-body">{{$text}}</div>
+
+<div class="sellpage-final">{{$desc2}}</div>
+
+{{$submit}}
+</div>
diff --git a/view/tpl/settings.tpl b/view/tpl/settings.tpl
index ea44c1240..7b6add231 100644..100755
--- a/view/tpl/settings.tpl
+++ b/view/tpl/settings.tpl
@@ -1,71 +1,66 @@
-<h1>$ptitle</h1>
+<div class="generic-content-wrapper">
+<h1>{{$ptitle}}</h1>
-$nickname_block
+{{$nickname_block}}
<form action="settings" id="settings-form" method="post" autocomplete="off" >
-<input type='hidden' name='form_security_token' value='$form_security_token'>
+<input type='hidden' name='form_security_token' value='{{$form_security_token}}' />
-<h3 class="settings-heading">$h_basic</h3>
+<h3 class="settings-heading">{{$h_basic}}</h3>
-{{inc field_input.tpl with $field=$username }}{{endinc}}
-{{inc field_custom.tpl with $field=$timezone }}{{endinc}}
-{{inc field_input.tpl with $field=$defloc }}{{endinc}}
-{{inc field_checkbox.tpl with $field=$allowloc }}{{endinc}}
+{{include file="field_input.tpl" field=$username}}
+{{include file="field_custom.tpl" field=$timezone}}
+{{include file="field_input.tpl" field=$defloc}}
+{{include file="field_checkbox.tpl" field=$allowloc}}
+{{include file="field_checkbox.tpl" field=$adult}}
<div class="settings-submit-wrapper" >
-<input type="submit" name="submit" class="settings-submit" value="$submit" />
+<input type="submit" name="submit" class="settings-submit" value="{{$submit}}" />
</div>
-<h3 class="settings-heading">$h_prv</h3>
+<h3 class="settings-heading">{{$h_prv}}</h3>
+
+<div id="settings-privacy-macros">{{$lbl_pmacro}}</div>
+<ul>
+<li><a href="#" onclick="channel_privacy_macro(3); return false" id="settings_pmacro3">{{$pmacro3}}</a></li>
+<li><a href="#" onclick="channel_privacy_macro(2); return false" id="settings_pmacro2">{{$pmacro2}}</a></li>
+<li><a href="#" onclick="channel_privacy_macro(1); return false" id="settings_pmacro1">{{$pmacro1}}</a></li>
+<li><a href="#" onclick="channel_privacy_macro(0); return false" id="settings_pmacro0">{{$pmacro0}}</a></li>
+</ul>
+
<div id="settings-permissions-wrapper">
-{{ for $permiss_arr as $permit }}
-{{inc field_select.tpl with $field=$permit }}{{endinc}}
-{{ endfor }}
+{{foreach $permiss_arr as $permit}}
+{{include file="field_select.tpl" field=$permit}}
+{{/foreach}}
</div>
<div class="settings-submit-wrapper" >
-<input type="submit" name="submit" class="settings-submit" value="$submit" />
+<input type="submit" name="submit" class="settings-submit" value="{{$submit}}" />
</div>
-$profile_in_dir
-
-$suggestme
-
-{{inc field_input.tpl with $field=$maxreq }}{{endinc}}
-
-{{inc field_input.tpl with $field=$cntunkmail }}{{endinc}}
-
-{{inc field_input.tpl with $field=$expire.days }}{{endinc}}
+{{$profile_in_dir}}
+{{$suggestme}}
-<div class="field input">
- <span class="field_help"><a href="#advanced-expire-popup" id="advanced-expire" class='popupbox' title="$expire.advanced">$expire.label</a></span>
- <div style="display: none;">
- <div id="advanced-expire-popup" style="width:auto;height:auto;overflow:auto;">
- <h3>$expire.advanced</h3>
- {{ inc field_yesno.tpl with $field=$expire.items }}{{endinc}}
- {{ inc field_yesno.tpl with $field=$expire.starred }}{{endinc}}
- {{ inc field_yesno.tpl with $field=$expire.network_only }}{{endinc}}
- </div>
- </div>
+{{include file="field_input.tpl" field=$maxreq}}
-</div>
+{{include file="field_input.tpl" field=$cntunkmail}}
<div id="settings-default-perms" class="settings-default-perms" >
- <a href="#profile-jot-acl-wrapper" id="settings-default-perms-menu" class='popupbox'>$permissions $permdesc</a>
+ <a href="#profile-jot-acl-wrapper" id="settings-default-perms-menu" >{{$permissions}} {{$permdesc}}</a>
<div id="settings-default-perms-menu-end"></div>
<div id="settings-default-perms-select" style="display: none; margin-bottom: 20px" >
<div style="display: none;">
<div id="profile-jot-acl-wrapper" style="width:auto;height:auto;overflow:auto;">
- $aclselect
+ {{$aclselect}}
</div>
</div>
@@ -74,41 +69,42 @@ $suggestme
<br/>
<div id="settings-default-perms-end"></div>
-$group_select
+{{$group_select}}
<div class="settings-submit-wrapper" >
-<input type="submit" name="submit" class="settings-submit" value="$submit" />
+<input type="submit" name="submit" class="settings-submit" value="{{$submit}}" />
</div>
-<h3 class="settings-heading">$h_not</h3>
+<h3 class="settings-heading">{{$h_not}}</h3>
<div id="settings-notifications">
-<div id="settings-activity-desc">$activity_options</div>
-
-{{inc field_checkbox.tpl with $field=$post_newfriend }}{{endinc}}
-{{inc field_checkbox.tpl with $field=$post_joingroup }}{{endinc}}
-{{inc field_checkbox.tpl with $field=$post_profilechange }}{{endinc}}
+<div id="settings-activity-desc">{{$activity_options}}</div>
+{{*the next two aren't yet implemented *}}
+{{*include file="field_checkbox.tpl" field=$post_newfriend*}}
+{{*include file="field_checkbox.tpl" field=$post_joingroup*}}
+{{include file="field_checkbox.tpl" field=$post_profilechange}}
-<div id="settings-notify-desc">$lbl_not</div>
+<div id="settings-notify-desc">{{$lbl_not}}</div>
<div class="group">
-{{inc field_intcheckbox.tpl with $field=$notify1 }}{{endinc}}
-{{inc field_intcheckbox.tpl with $field=$notify2 }}{{endinc}}
-{{inc field_intcheckbox.tpl with $field=$notify3 }}{{endinc}}
-{{inc field_intcheckbox.tpl with $field=$notify4 }}{{endinc}}
-{{inc field_intcheckbox.tpl with $field=$notify5 }}{{endinc}}
-{{inc field_intcheckbox.tpl with $field=$notify6 }}{{endinc}}
-{{inc field_intcheckbox.tpl with $field=$notify7 }}{{endinc}}
-{{inc field_intcheckbox.tpl with $field=$notify8 }}{{endinc}}
+{{include file="field_intcheckbox.tpl" field=$notify1}}
+{{include file="field_intcheckbox.tpl" field=$notify2}}
+{{include file="field_intcheckbox.tpl" field=$notify3}}
+{{include file="field_intcheckbox.tpl" field=$notify4}}
+{{include file="field_intcheckbox.tpl" field=$notify5}}
+{{include file="field_intcheckbox.tpl" field=$notify6}}
+{{include file="field_intcheckbox.tpl" field=$notify7}}
+{{include file="field_intcheckbox.tpl" field=$notify8}}
</div>
</div>
<div class="settings-submit-wrapper" >
-<input type="submit" name="submit" class="settings-submit" value="$submit" />
+<input type="submit" name="submit" class="settings-submit" value="{{$submit}}" />
</div>
+</div>
diff --git a/view/tpl/settings_account.tpl b/view/tpl/settings_account.tpl
index d1a635f91..fcddb3f86 100644..100755
--- a/view/tpl/settings_account.tpl
+++ b/view/tpl/settings_account.tpl
@@ -1,28 +1,28 @@
-<h1>$title</h1>
+<div class="generic-content-wrapper">
+<h1>{{$title}}</h1>
<div id="settings-remove-account-link">
-<a href="removeme" title="$permanent" >$removeme</a>
+<a href="removeme" title="{{$permanent}}" >{{$removeme}}</a>
</div>
<form action="settings/account" id="settings-account-form" method="post" autocomplete="off" >
-<input type='hidden' name='form_security_token' value='$form_security_token'>
+<input type='hidden' name='form_security_token' value='{{$form_security_token}}'>
-{{inc field_input.tpl with $field=$email }}{{endinc}}
+{{include file="field_input.tpl" field=$email}}
-<h3 class="settings-heading">$h_pass</h3>
+<h3 class="settings-heading">{{$h_pass}}</h3>
-{{inc field_password.tpl with $field=$password1 }}{{endinc}}
-{{inc field_password.tpl with $field=$password2 }}{{endinc}}
+{{include file="field_password.tpl" field=$password1}}
+{{include file="field_password.tpl" field=$password2}}
<div class="settings-submit-wrapper" >
-<input type="submit" name="submit" class="settings-submit" value="$submit" />
+<input type="submit" name="submit" class="settings-submit" value="{{$submit}}" />
</div>
-$account_settings
-
-
+{{$account_settings}}
+</div>
diff --git a/view/tpl/settings_addons.tpl b/view/tpl/settings_addons.tpl
index 9a4f95341..3e447cd0a 100644..100755
--- a/view/tpl/settings_addons.tpl
+++ b/view/tpl/settings_addons.tpl
@@ -1,10 +1,12 @@
-<h1>$title</h1>
+<div class="generic-content-wrapper">
+<h1>{{$title}}</h1>
<form action="settings/featured" method="post" autocomplete="off">
-<input type='hidden' name='form_security_token' value='$form_security_token'>
+<input type='hidden' name='form_security_token' value='{{$form_security_token}}'>
-$settings_addons
+{{$settings_addons}}
</form>
+</div>
diff --git a/view/tpl/settings_connectors.tpl b/view/tpl/settings_connectors.tpl
index 07a86e4fe..a8bde4c1e 100644..100755
--- a/view/tpl/settings_connectors.tpl
+++ b/view/tpl/settings_connectors.tpl
@@ -1,9 +1,9 @@
-<h1>$title</h1>
+<h1>{{$title}}</h1>
<form action="settings/connectors" method="post" autocomplete="off">
-<input type='hidden' name='form_security_token' value='$form_security_token'>
+<input type='hidden' name='form_security_token' value='{{$form_security_token}}'>
-$settings_connectors
+{{$settings_connectors}}
</form>
diff --git a/view/tpl/settings_display.tpl b/view/tpl/settings_display.tpl
index 2aac64515..ddd3ca56d 100644..100755
--- a/view/tpl/settings_display.tpl
+++ b/view/tpl/settings_display.tpl
@@ -1,22 +1,24 @@
-<h1>$ptitle</h1>
+<div class="generic-content-wrapper">
+<h1>{{$ptitle}}</h1>
<form action="settings/display" id="settings-form" method="post" autocomplete="off" >
-<input type='hidden' name='form_security_token' value='$form_security_token'>
+<input type='hidden' name='form_security_token' value='{{$form_security_token}}'>
-{{inc field_themeselect.tpl with $field=$theme }}{{endinc}}
-{{inc field_themeselect.tpl with $field=$mobile_theme }}{{endinc}}
-{{inc field_input.tpl with $field=$ajaxint }}{{endinc}}
-{{inc field_input.tpl with $field=$itemspage }}{{endinc}}
-{{inc field_checkbox.tpl with $field=$nosmile}}{{endinc}}
+{{include file="field_themeselect.tpl" field=$theme}}
+{{include file="field_themeselect.tpl" field=$mobile_theme}}
+{{include file="field_input.tpl" field=$ajaxint}}
+{{include file="field_input.tpl" field=$itemspage}}
+{{include file="field_checkbox.tpl" field=$nosmile}}
<div class="settings-submit-wrapper" >
-<input type="submit" name="submit" class="settings-submit" value="$submit" />
+<input type="submit" name="submit" class="settings-submit" value="{{$submit}}" />
</div>
-{{ if $theme_config }}
+{{if $theme_config}}
<h2>Theme settings</h2>
-$theme_config
-{{ endif }}
+{{$theme_config}}
+{{/if}}
</form>
+</div>
diff --git a/view/tpl/settings_features.tpl b/view/tpl/settings_features.tpl
index fd65abebb..a03817f82 100644..100755
--- a/view/tpl/settings_features.tpl
+++ b/view/tpl/settings_features.tpl
@@ -1,20 +1,21 @@
-<h1>$title</h1>
+<div class="generic-content-wrapper">
+<h1>{{$title}}</h1>
<form action="settings/features" method="post" autocomplete="off">
-<input type='hidden' name='form_security_token' value='$form_security_token'>
+<input type='hidden' name='form_security_token' value='{{$form_security_token}}'>
-{{ for $features as $f }}
-<h3 class="settings-heading">$f.0</h3>
+{{foreach $features as $f}}
+<h3 class="settings-heading">{{$f.0}}</h3>
-{{ for $f.1 as $fcat }}
- {{ inc $field_yesno with $field=$fcat }}{{endinc}}
-{{ endfor }}
-{{ endfor }}
+{{foreach $f.1 as $fcat}}
+ {{include file="{{$field_yesno}}" field=$fcat}}
+{{/foreach}}
+{{/foreach}}
<div class="settings-submit-wrapper" >
-<input type="submit" name="submit" class="settings-features-submit" value="$submit" />
+<input type="submit" name="submit" class="settings-features-submit" value="{{$submit}}" />
</div>
</form>
-
+</div>
diff --git a/view/tpl/settings_nick_set.tpl b/view/tpl/settings_nick_set.tpl
index eb4721d50..ae11c00c8 100644..100755
--- a/view/tpl/settings_nick_set.tpl
+++ b/view/tpl/settings_nick_set.tpl
@@ -1,5 +1,4 @@
-
<div id="settings-nick-wrapper" >
-<div id="settings-nickname-desc" class="info-message">$desc <strong>'$nickname@$basepath'</strong>$subdir</div>
+<div id="settings-nickname-desc" class="info-message">{{$desc}} <strong>'{{$nickname}}@{{$basepath}}'</strong>{{$subdir}}</div>
</div>
<div id="settings-nick-end" ></div>
diff --git a/view/tpl/settings_nick_subdir.tpl b/view/tpl/settings_nick_subdir.tpl
deleted file mode 100644
index 303c24df7..000000000
--- a/view/tpl/settings_nick_subdir.tpl
+++ /dev/null
@@ -1,6 +0,0 @@
-<p>
-It appears that your website is located in a subdirectory of the<br />
-$hostname website, so this setting may not work reliably.<br />
-</p>
-<p>If you have any issues, you may have better results using the profile<br /> address '<strong>$baseurl/profile/$nickname</strong>'.
-</p> \ No newline at end of file
diff --git a/view/tpl/settings_oauth.tpl b/view/tpl/settings_oauth.tpl
index 890c4ee6c..8b76e9eec 100644..100755
--- a/view/tpl/settings_oauth.tpl
+++ b/view/tpl/settings_oauth.tpl
@@ -1,31 +1,33 @@
-<h1>$title</h1>
+<div class="generic-content-wrapper">
+<h1>{{$title}}</h1>
<form action="settings/oauth" method="post" autocomplete="off">
-<input type='hidden' name='form_security_token' value='$form_security_token'>
+<input type='hidden' name='form_security_token' value='{{$form_security_token}}'>
<div id="profile-edit-links">
<ul>
<li>
- <a id="profile-edit-view-link" href="$baseurl/settings/oauth/add">$add</a>
+ <a id="profile-edit-view-link" href="{{$baseurl}}/settings/oauth/add">{{$add}}</a>
</li>
</ul>
</div>
- {{ for $apps as $app }}
+ {{foreach $apps as $app}}
<div class='oauthapp'>
- <img src='$app.icon' class="{{ if $app.icon }} {{ else }}noicon{{ endif }}">
- {{ if $app.name }}<h4>$app.name</h4>{{ else }}<h4>$noname</h4>{{ endif }}
- {{ if $app.my }}
- {{ if $app.oauth_token }}
- <div class="settings-submit-wrapper" ><button class="settings-submit" type="submit" name="remove" value="$app.oauth_token">$remove</button></div>
- {{ endif }}
- {{ endif }}
- {{ if $app.my }}
- <a href="$baseurl/settings/oauth/edit/$app.client_id" class="icon s22 edit" title="$edit">&nbsp;</a>
- <a href="$baseurl/settings/oauth/delete/$app.client_id?t=$form_security_token" class="icon s22 delete" title="$delete">&nbsp;</a>
- {{ endif }}
+ <img src='{{$app.icon}}' class="{{if $app.icon}} {{else}}noicon{{/if}}">
+ {{if $app.name}}<h4>{{$app.name}}</h4>{{else}}<h4>{{$noname}}</h4>{{/if}}
+ {{if $app.my}}
+ {{if $app.oauth_token}}
+ <div class="settings-submit-wrapper" ><button class="settings-submit" type="submit" name="remove" value="{{$app.oauth_token}}">{{$remove}}</button></div>
+ {{/if}}
+ {{/if}}
+ {{if $app.my}}
+ <a href="{{$baseurl}}/settings/oauth/edit/{{$app.client_id}}" title="{{$edit}}"><i class="icon-pencil"></i></a>
+ <a href="{{$baseurl}}/settings/oauth/delete/{{$app.client_id}}?t={{$form_security_token}}" title="{{$delete}}"><i class="icon-remove"></i></a>
+ {{/if}}
</div>
- {{ endfor }}
+ {{/foreach}}
</form>
+</div>
diff --git a/view/tpl/settings_oauth_edit.tpl b/view/tpl/settings_oauth_edit.tpl
index e6f2abdc2..bf805363c 100644..100755
--- a/view/tpl/settings_oauth_edit.tpl
+++ b/view/tpl/settings_oauth_edit.tpl
@@ -1,17 +1,17 @@
-<h1>$title</h1>
+<h1>{{$title}}</h1>
<form method="POST">
-<input type='hidden' name='form_security_token' value='$form_security_token'>
+<input type='hidden' name='form_security_token' value='{{$form_security_token}}'>
-{{ inc field_input.tpl with $field=$name }}{{ endinc }}
-{{ inc field_input.tpl with $field=$key }}{{ endinc }}
-{{ inc field_input.tpl with $field=$secret }}{{ endinc }}
-{{ inc field_input.tpl with $field=$redirect }}{{ endinc }}
-{{ inc field_input.tpl with $field=$icon }}{{ endinc }}
+{{include file="field_input.tpl" field=$name}}
+{{include file="field_input.tpl" field=$key}}
+{{include file="field_input.tpl" field=$secret}}
+{{include file="field_input.tpl" field=$redirect}}
+{{include file="field_input.tpl" field=$icon}}
<div class="settings-submit-wrapper" >
-<input type="submit" name="submit" class="settings-submit" value="$submit" />
-<input type="submit" name="cancel" class="settings-submit" value="$cancel" />
+<input type="submit" name="submit" class="settings-submit" value="{{$submit}}" />
+<input type="submit" name="cancel" class="settings-submit" value="{{$cancel}}" />
</div>
</form>
diff --git a/view/tpl/show_thing.tpl b/view/tpl/show_thing.tpl
new file mode 100644
index 000000000..2a8c06076
--- /dev/null
+++ b/view/tpl/show_thing.tpl
@@ -0,0 +1,16 @@
+<h2>{{$header}}</h2>
+{{if $thing}}
+<div class="thing-show">
+{{if $thing.imgurl}}<img src="{{$thing.imgurl}}" width="175" height="175" alt="{{$thing.term}}" />{{/if}}
+<a href="{{$thing.url}}" >{{$thing.term}}</a>
+</div>
+{{if $canedit}}
+<div class="thing-edit-links">
+<a href="thing/edit/{{$thing.term_hash}}" title="{{$edit}}"><i class="icon-pencil thing-edit-icon"></i></a>
+<a href="thing/drop/{{$thing.term_hash}}" onclick="return confirmDelete();" title="{{$delete}}" ><i class="icon-remove drop-icons"></i></a>
+</div>
+<div class="thing-edit-links-end"></div>
+{{/if}}
+
+{{/if}}
+
diff --git a/view/tpl/siteinfo.tpl b/view/tpl/siteinfo.tpl
new file mode 100755
index 000000000..a60b406cf
--- /dev/null
+++ b/view/tpl/siteinfo.tpl
@@ -0,0 +1,14 @@
+<h3>{{$title}}</h3>
+<p></p>
+<p>{{$description}}</p>
+{{if $version}}
+<p>{{$version}}{{if $commit}}+{{$commit}}{{/if}}</p>
+{{/if}}
+<p>{{$web_location}}</p>
+<p>{{$visit}}</p>
+<p>{{$bug_text}} <a href="{{$bug_link_url}}">{{$bug_link_text}}</a></p>
+<p>{{$contact}}</p>
+<p>{{$plugins_text}}</p>
+{{if $plugins_list}}
+ <div style="margin-left: 25px; margin-right: 25px;">{{$plugins_list}}</div>
+{{/if}}
diff --git a/view/tpl/smarty3/404.tpl b/view/tpl/smarty3/404.tpl
deleted file mode 100644
index 2d581ab8d..000000000
--- a/view/tpl/smarty3/404.tpl
+++ /dev/null
@@ -1,6 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<h1>{{$message}}</h1>
diff --git a/view/tpl/smarty3/README b/view/tpl/smarty3/README
new file mode 100644
index 000000000..78ff8d9a1
--- /dev/null
+++ b/view/tpl/smarty3/README
@@ -0,0 +1,4 @@
+view/tpl/smarty3
+
+This directory must exist and be writeable by the webserver in order to store compiled template files, which are created dynamically. Please see the installation instructions.
+
diff --git a/view/tpl/smarty3/abook_edit.tpl b/view/tpl/smarty3/abook_edit.tpl
deleted file mode 100644
index 9f6556842..000000000
--- a/view/tpl/smarty3/abook_edit.tpl
+++ /dev/null
@@ -1,79 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-
-<h2>{{$header}}</h2>
-
-<h3>{{$addr}}</h3>
-
-{{if $notself}}
-<div id="connection-flag-tabs">
-{{$tabs}}
-</div>
-{{/if}}
-
-{{if $self}}
-<div id="autoperm-desc" class="descriptive-paragraph">{{$autolbl}}</div>
-{{/if}}
-
-
-<div id="contact-edit-wrapper">
-
-{{if $notself}}
-{{if $slide}}
-<h3>{{$lbl_slider}}</h3>
-
-{{$slide}}
-
-{{/if}}
-{{/if}}
-
-
-
-<h3>{{$permlbl}}</h3>
-
-<form id="abook-edit-form" action="connections/{{$contact_id}}" method="post" >
-<input type="hidden" name="contact_id" value="{{$contact_id}}">
-<input id="contact-closeness-mirror" type="hidden" name="closeness" value="{{$close}}" />
-
-{{if $noperms}}
-<div id="noperm-desc" class="descriptive-paragraph">{{$noperms}}</div>
-{{/if}}
-
-
-{{if $is_pending}}
-{{include file="field_checkbox.tpl" field=$unapproved}}
-{{/if}}
-
-<br />
-<b>{{$quick}}</b>
-<ul>
-{{if $self}}
-<li><span class="fakelink" onclick="connectForum(); $('#abook-edit-form').submit();">{{$forum}}</span></li>
-<li><span class="fakelink" onclick="connectSoapBox(); $('#abook-edit-form').submit();">{{$soapbox}}</span></li>
-{{/if}}
-<li><span class="fakelink" onclick="connectFullShare(); $('#abook-edit-form').submit();">{{$full}}</span></li>
-<li><span class="fakelink" onclick="connectCautiousShare(); $('#abook-edit-form').submit();">{{$cautious}}</span></li>
-<li><span class="fakelink" onclick="connectFollowOnly(); $('#abook-edit-form').submit();">{{$follow}}</span></li>
-</ul>
-
-<div id="abook-advanced" class="fakelink" onclick="openClose('abook-advanced-panel');">{{$advanced}}</div>
-
-<div id="abook-advanced-panel" style="display: none;">
-
-<span class="abook-them">{{$them}}</span><span class="abook-me">{{$me}}</span>
-<br />
-<br />
-{{foreach $perms as $prm}}
-{{include file="field_acheckbox.tpl" field=$prm}}
-{{/foreach}}
-<br />
-
-</div>
-
-<input class="contact-edit-submit" type="submit" name="done" value="{{$submit}}" />
-
-</form>
-</div>
diff --git a/view/tpl/smarty3/acl_selector.tpl b/view/tpl/smarty3/acl_selector.tpl
deleted file mode 100644
index aebef71ee..000000000
--- a/view/tpl/smarty3/acl_selector.tpl
+++ /dev/null
@@ -1,33 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<div id="acl-wrapper">
- <input id="acl-search">
- <a href="#" id="acl-showall">{{$showall}}</a>
- <div id="acl-list">
- <div id="acl-list-content">
- </div>
- </div>
- <span id="acl-fields"></span>
-</div>
-
-<div class="acl-list-item" rel="acl-template" style="display:none">
- <img src="{0}"><p>{1}</p>
- <a href="#" class='acl-button-show'>{{$show}}</a>
- <a href="#" class='acl-button-hide'>{{$hide}}</a>
-</div>
-
-<script>
-$(document).ready(function() {
- setTimeout( function () {
- if(typeof acl=="undefined"){
- acl = new ACL(
- baseurl+"/acl",
- [ {{$allowcid}},{{$allowgid}},{{$denycid}},{{$denygid}} ]
- );
- }
- }, 5000 );
-});
-</script>
diff --git a/view/tpl/smarty3/admin_aside.tpl b/view/tpl/smarty3/admin_aside.tpl
deleted file mode 100644
index 69445d3b1..000000000
--- a/view/tpl/smarty3/admin_aside.tpl
+++ /dev/null
@@ -1,47 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<script>
- // update pending count //
- $(function(){
-
- $("nav").bind('nav-update', function(e,data){
- var elm = $('#pending-update');
- var register = $(data).find('register').text();
- if (register=="0") { reigster=""; elm.hide();} else { elm.show(); }
- elm.html(register);
- });
- });
-</script>
-<h4><a href="{{$admurl}}">{{$admtxt}}</a></h4>
-<ul class='admin linklist'>
- <li class='admin link button {{$admin.site.2}}'><a href='{{$admin.site.0}}'>{{$admin.site.1}}</a></li>
- <li class='admin link button {{$admin.users.2}}'><a href='{{$admin.users.0}}'>{{$admin.users.1}}</a><span id='pending-update' title='{{$h_pending}}'></span></li>
- <li class='admin link button {{$admin.plugins.2}}'><a href='{{$admin.plugins.0}}'>{{$admin.plugins.1}}</a></li>
- <li class='admin link button {{$admin.themes.2}}'><a href='{{$admin.themes.0}}'>{{$admin.themes.1}}</a></li>
- <li class='admin link button {{$admin.dbsync.2}}'><a href='{{$admin.dbsync.0}}'>{{$admin.dbsync.1}}</a></li>
-</ul>
-
-{{if $admin.update}}
-<ul class='admin linklist'>
- <li class='admin link button {{$admin.update.2}}'><a href='{{$admin.update.0}}'>{{$admin.update.1}}</a></li>
- <li class='admin link button {{$admin.update.2}}'><a href='https://kakste.com/profile/inthegit'>Important Changes</a></li>
-</ul>
-{{/if}}
-
-
-{{if $admin.plugins_admin}}<h4>{{$plugadmtxt}}</h4>{{/if}}
-<ul class='admin linklist'>
- {{foreach $admin.plugins_admin as $l}}
- <li class='admin link button {{$l.2}}'><a href='{{$l.0}}'>{{$l.1}}</a></li>
- {{/foreach}}
-</ul>
-
-
-<h4>{{$logtxt}}</h4>
-<ul class='admin linklist'>
- <li class='admin link button {{$admin.logs.2}}'><a href='{{$admin.logs.0}}'>{{$admin.logs.1}}</a></li>
-</ul>
-
diff --git a/view/tpl/smarty3/admin_logs.tpl b/view/tpl/smarty3/admin_logs.tpl
deleted file mode 100644
index 6a2259500..000000000
--- a/view/tpl/smarty3/admin_logs.tpl
+++ /dev/null
@@ -1,24 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<div id='adminpage'>
- <h1>{{$title}} - {{$page}}</h1>
-
- <form action="{{$baseurl}}/admin/logs" method="post">
- <input type='hidden' name='form_security_token' value='{{$form_security_token}}'>
-
- {{include file="field_checkbox.tpl" field=$debugging}}
- {{include file="field_input.tpl" field=$logfile}}
- {{include file="field_select.tpl" field=$loglevel}}
-
- <div class="submit"><input type="submit" name="page_logs" value="{{$submit}}" /></div>
-
- </form>
-
- <h3>{{$logname}}</h3>
- <div style="width:100%; height:400px; overflow: auto; "><pre>{{$data}}</pre></div>
-<!-- <iframe src='{{$baseurl}}/{{$logname}}' style="width:100%; height:400px"></iframe> -->
- <!-- <div class="submit"><input type="submit" name="page_logs_clear_log" value="{{$clear}}" /></div> -->
-</div>
diff --git a/view/tpl/smarty3/admin_plugins.tpl b/view/tpl/smarty3/admin_plugins.tpl
deleted file mode 100644
index 307814e87..000000000
--- a/view/tpl/smarty3/admin_plugins.tpl
+++ /dev/null
@@ -1,20 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<div id='adminpage'>
- <h1>{{$title}} - {{$page}}</h1>
-
- <ul id='pluginslist'>
- {{foreach $plugins as $p}}
- <li class='plugin {{$p.1}}'>
- <a class='toggleplugin' href='{{$baseurl}}/admin/{{$function}}/{{$p.0}}?a=t&amp;t={{$form_security_token}}' title="{{if $p.1==on}}Disable{{else}}Enable{{/if}}" ><span class='icon {{$p.1}}'></span></a>
- <a href='{{$baseurl}}/admin/{{$function}}/{{$p.0}}'><span class='name'>{{$p.2.name}}</span></a> - <span class="version">{{$p.2.version}}</span>
- {{if $p.2.experimental}} {{$experimental}} {{/if}}{{if $p.2.unsupported}} {{$unsupported}} {{/if}}
-
- <div class='desc'>{{$p.2.description}}</div>
- </li>
- {{/foreach}}
- </ul>
-</div>
diff --git a/view/tpl/smarty3/admin_plugins_details.tpl b/view/tpl/smarty3/admin_plugins_details.tpl
deleted file mode 100644
index e81701732..000000000
--- a/view/tpl/smarty3/admin_plugins_details.tpl
+++ /dev/null
@@ -1,41 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<div id='adminpage'>
- <h1>{{$title}} - {{$page}}</h1>
-
- <p><span class='toggleplugin icon {{$status}}'></span> {{$info.name}} - {{$info.version}} : <a href="{{$baseurl}}/admin/{{$function}}/{{$plugin}}/?a=t&amp;t={{$form_security_token}}">{{$action}}</a></p>
- <p>{{$info.description}}</p>
-
- <p class="author">{{$str_author}}
- {{foreach $info.author as $a}}
- {{if $a.link}}<a href="{{$a.link}}">{{$a.name}}</a>{{else}}{{$a.name}}{{/if}},
- {{/foreach}}
- </p>
-
- <p class="maintainer">{{$str_maintainer}}
- {{foreach $info.maintainer as $a}}
- {{if $a.link}}<a href="{{$a.link}}">{{$a.name}}</a>{{else}}{{$a.name}}{{/if}},
- {{/foreach}}
- </p>
-
- {{if $screenshot}}
- <a href="{{$screenshot.0}}" class='screenshot'><img src="{{$screenshot.0}}" alt="{{$screenshot.1}}" /></a>
- {{/if}}
-
- {{if $admin_form}}
- <h3>{{$settings}}</h3>
- <form method="post" action="{{$baseurl}}/admin/{{$function}}/{{$plugin}}/">
- {{$admin_form}}
- </form>
- {{/if}}
-
- {{if $readme}}
- <h3>Readme</h3>
- <div id="plugin_readme">
- {{$readme}}
- </div>
- {{/if}}
-</div>
diff --git a/view/tpl/smarty3/admin_remoteupdate.tpl b/view/tpl/smarty3/admin_remoteupdate.tpl
deleted file mode 100644
index cee0ef9b8..000000000
--- a/view/tpl/smarty3/admin_remoteupdate.tpl
+++ /dev/null
@@ -1,103 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<script src="js/jquery.htmlstream.js"></script>
-<script>
- /* ajax updater */
- function updateEnd(data){
- //$("#updatepopup .panel_text").html(data);
- $("#remoteupdate_form").find("input").removeAttr('disabled');
- $(".panel_action_close").fadeIn()
- }
- function updateOn(data){
-
- var patt=/§([^§]*)§/g;
- var matches = data.match(patt);
- $(matches).each(function(id,data){
- data = data.replace(/§/g,"");
- d = data.split("@");
- console.log(d);
- elm = $("#updatepopup .panel_text #"+d[0]);
- html = "<div id='"+d[0]+"' class='progress'>"+d[1]+"<span>"+d[2]+"</span></div>";
- if (elm.length==0){
- $("#updatepopup .panel_text").append(html);
- } else {
- $(elm).replaceWith(html);
- }
- });
-
-
- }
-
- $(function(){
- $("#remoteupdate_form").submit(function(){
- var data={};
- $(this).find("input").each(function(i, e){
- name = $(e).attr('name');
- value = $(e).val();
- e.disabled = true;
- data[name]=value;
- });
-
- $("#updatepopup .panel_text").html("");
- $("#updatepopup").show();
- $("#updatepopup .panel").hide().slideDown(500);
- $(".panel_action_close").hide().click(function(){
- $("#updatepopup .panel").slideUp(500, function(){
- $("#updatepopup").hide();
- });
- });
-
- $.post(
- $(this).attr('action'),
- data,
- updateEnd,
- 'text',
- updateOn
- );
-
-
- return false;
- })
- });
-</script>
-<div id="updatepopup" class="popup">
- <div class="background"></div>
- <div class="panel">
- <div class="panel_in">
- <h1>Friendica Update</h1>
- <div class="panel_text"></div>
- <div class="panel_actions">
- <input type="button" value="{{$close}}" class="panel_action_close">
- </div>
- </div>
- </div>
-</div>
-<div id="adminpage">
- <dl> <dt>Your version:</dt><dd>{{$localversion}}</dd> </dl>
-{{if $needupdate}}
- <dl> <dt>New version:</dt><dd>{{$remoteversion}}</dd> </dl>
-
- <form id="remoteupdate_form" method="POST" action="{{$baseurl}}/admin/update">
- <input type="hidden" name="{{$remotefile.0}}" value="{{$remotefile.2}}">
-
- {{if $canwrite}}
- <div class="submit"><input type="submit" name="remoteupdate" value="{{$submit}}" /></div>
- {{else}}
- <h3>Your friendica installation is not writable by web server.</h3>
- {{if $canftp}}
- <p>You can try to update via FTP</p>
- {{include file="field_input.tpl" field=$ftphost}}
- {{include file="field_input.tpl" field=$ftppath}}
- {{include file="field_input.tpl" field=$ftpuser}}
- {{include file="field_password.tpl" field=$ftppwd}}
- <div class="submit"><input type="submit" name="remoteupdate" value="{{$submit}}" /></div>
- {{/if}}
- {{/if}}
- </form>
-{{else}}
-<h4>No updates</h4>
-{{/if}}
-</div>
diff --git a/view/tpl/smarty3/admin_site.tpl b/view/tpl/smarty3/admin_site.tpl
deleted file mode 100644
index 75a386f7d..000000000
--- a/view/tpl/smarty3/admin_site.tpl
+++ /dev/null
@@ -1,87 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<script>
- $(function(){
-
- $("#cnftheme").fancybox({
- width: 800,
- autoDimensions: false,
- onStart: function(){
- var theme = $("#id_theme :selected").val();
- $("#cnftheme").attr('href',"{{$baseurl}}/admin/themes/"+theme);
- },
- onComplete: function(){
- $("div#fancybox-content form").submit(function(e){
- var url = $(this).attr('action');
- // can't get .serialize() to work...
- var data={};
- $(this).find("input").each(function(){
- data[$(this).attr('name')] = $(this).val();
- });
- $(this).find("select").each(function(){
- data[$(this).attr('name')] = $(this).children(":selected").val();
- });
- console.log(":)", url, data);
-
- $.post(url, data, function(data) {
- if(timer) clearTimeout(timer);
- NavUpdate();
- $.fancybox.close();
- })
-
- return false;
- });
-
- }
- });
- });
-</script>
-<div id='adminpage'>
- <h1>{{$title}} - {{$page}}</h1>
-
- <form action="{{$baseurl}}/admin/site" method="post">
- <input type='hidden' name='form_security_token' value='{{$form_security_token}}'>
-
- {{include file="field_input.tpl" field=$sitename}}
- {{include file="field_textarea.tpl" field=$banner}}
- {{include file="field_select.tpl" field=$language}}
- {{include file="field_select.tpl" field=$theme}}
- {{include file="field_select.tpl" field=$ssl_policy}}
-
- <div class="submit"><input type="submit" name="page_site" value="{{$submit}}" /></div>
-
- <h3>{{$registration}}</h3>
- {{include file="field_input.tpl" field=$register_text}}
- {{include file="field_select.tpl" field=$register_policy}}
-
- <div class="submit"><input type="submit" name="page_site" value="{{$submit}}" /></div>
-
- <h3>{{$upload}}</h3>
- {{include file="field_input.tpl" field=$maximagesize}}
-
- <h3>{{$corporate}}</h3>
- {{include file="field_input.tpl" field=$allowed_sites}}
- {{include file="field_input.tpl" field=$allowed_email}}
- {{include file="field_checkbox.tpl" field=$block_public}}
- {{include file="field_checkbox.tpl" field=$force_publish}}
- {{include file="field_checkbox.tpl" field=$no_community_page}}
- {{include file="field_input.tpl" field=$global_directory}}
-
- <div class="submit"><input type="submit" name="page_site" value="{{$submit}}" /></div>
-
- <h3>{{$advanced}}</h3>
- {{include file="field_input.tpl" field=$proxy}}
- {{include file="field_input.tpl" field=$proxyuser}}
- {{include file="field_input.tpl" field=$timeout}}
- {{include file="field_input.tpl" field=$delivery_interval}}
- {{include file="field_input.tpl" field=$poll_interval}}
- {{include file="field_input.tpl" field=$maxloadavg}}
- {{include file="field_input.tpl" field=$abandon_days}}
-
- <div class="submit"><input type="submit" name="page_site" value="{{$submit}}" /></div>
-
- </form>
-</div>
diff --git a/view/tpl/smarty3/admin_summary.tpl b/view/tpl/smarty3/admin_summary.tpl
deleted file mode 100644
index 76ac23d29..000000000
--- a/view/tpl/smarty3/admin_summary.tpl
+++ /dev/null
@@ -1,45 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<div id='adminpage'>
- <h1>{{$title}} - {{$page}}</h1>
-
- <dl>
- <dt>{{$queues.label}}</dt>
- <dd>{{$queues.queue}}</dd>
- </dl>
- <dl>
- <dt>{{$pending.0}}</dt>
- <dd>{{$pending.1}}</dt>
- </dl>
-
- <dl>
- <dt>{{$users.0}}</dt>
- <dd>{{$users.1}}</dd>
- </dl>
- {{foreach $accounts as $p}}
- <dl>
- <dt>{{$p.0}}</dt>
- <dd>{{if $p.1}}{{$p.1}}{{else}}0{{/if}}</dd>
- </dl>
- {{/foreach}}
-
-
- <dl>
- <dt>{{$plugins.0}}</dt>
-
- {{foreach $plugins.1 as $p}}
- <dd>{{$p}}</dd>
- {{/foreach}}
-
- </dl>
-
- <dl>
- <dt>{{$version.0}}</dt>
- <dd>{{$version.1}} - {{$build}}</dt>
- </dl>
-
-
-</div>
diff --git a/view/tpl/smarty3/admin_users.tpl b/view/tpl/smarty3/admin_users.tpl
deleted file mode 100644
index 5448a08c4..000000000
--- a/view/tpl/smarty3/admin_users.tpl
+++ /dev/null
@@ -1,94 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<script>
- function confirm_delete(uname){
- return confirm( "{{$confirm_delete}}".format(uname));
- }
- function confirm_delete_multi(){
- return confirm("{{$confirm_delete_multi}}");
- }
- function selectall(cls){
- $("."+cls).attr('checked','checked');
- return false;
- }
-</script>
-<div id='adminpage'>
- <h1>{{$title}} - {{$page}}</h1>
-
- <form action="{{$baseurl}}/admin/users" method="post">
- <input type='hidden' name='form_security_token' value='{{$form_security_token}}'>
-
- <h3>{{$h_pending}}</h3>
- {{if $pending}}
- <table id='pending'>
- <thead>
- <tr>
- {{foreach $th_pending as $th}}<th>{{$th}}</th>{{/foreach}}
- <th></th>
- <th></th>
- </tr>
- </thead>
- <tbody>
- {{foreach $pending as $u}}
- <tr>
- <td class="created">{{$u.created}}</td>
- <td class="name">{{$u.name}}</td>
- <td class="email">{{$u.email}}</td>
- <td class="checkbox"><input type="checkbox" class="pending_ckbx" id="id_pending_{{$u.hash}}" name="pending[]" value="{{$u.hash}}" /></td>
- <td class="tools">
- <a href="{{$baseurl}}/regmod/allow/{{$u.hash}}" title='{{$approve}}'><span class='icon like'></span></a>
- <a href="{{$baseurl}}/regmod/deny/{{$u.hash}}" title='{{$deny}}'><span class='icon dislike'></span></a>
- </td>
- </tr>
- {{/foreach}}
- </tbody>
- </table>
- <div class='selectall'><a href='#' onclick="return selectall('pending_ckbx');">{{$select_all}}</a></div>
- <div class="submit"><input type="submit" name="page_users_deny" value="{{$deny}}"/> <input type="submit" name="page_users_approve" value="{{$approve}}" /></div>
- {{else}}
- <p>{{$no_pending}}</p>
- {{/if}}
-
-
-
-
- <h3>{{$h_users}}</h3>
- {{if $users}}
- <table id='users'>
- <thead>
- <tr>
- <th></th>
- {{foreach $th_users as $th}}<th>{{$th}}</th>{{/foreach}}
- <th></th>
- <th></th>
- </tr>
- </thead>
- <tbody>
- {{foreach $users as $u}}
- <tr>
- <td><img src="{{$u.micro}}" alt="{{$u.nickname}}" title="{{$u.nickname}}"></td>
- <td class='name'><a href="{{$u.url}}" title="{{$u.nickname}}" >{{$u.name}}</a></td>
- <td class='email'>{{$u.email}}</td>
- <td class='register_date'>{{$u.register_date}}</td>
- <td class='login_date'>{{$u.login_date}}</td>
- <td class='lastitem_date'>{{$u.lastitem_date}}</td>
- <td class='login_date'>{{$u.page_flags}}</td>
- <td class="checkbox"><input type="checkbox" class="users_ckbx" id="id_user_{{$u.uid}}" name="user[]" value="{{$u.uid}}"/></td>
- <td class="tools">
- <a href="{{$baseurl}}/admin/users/block/{{$u.uid}}?t={{$form_security_token}}" title='{{if $u.blocked}}{{$unblock}}{{else}}{{$block}}{{/if}}'><span class='icon block {{if $u.blocked==0}}dim{{/if}}'></span></a>
- <a href="{{$baseurl}}/admin/users/delete/{{$u.uid}}?t={{$form_security_token}}" title='{{$delete}}' onclick="return confirm_delete('{{$u.name}}')"><span class='icon drop'></span></a>
- </td>
- </tr>
- {{/foreach}}
- </tbody>
- </table>
- <div class='selectall'><a href='#' onclick="return selectall('users_ckbx');">{{$select_all}}</a></div>
- <div class="submit"><input type="submit" name="page_users_block" value="{{$block}}/{{$unblock}}" /> <input type="submit" name="page_users_delete" value="{{$delete}}" onclick="return confirm_delete_multi()" /></div>
- {{else}}
- NO USERS?!?
- {{/if}}
- </form>
-</div>
diff --git a/view/tpl/smarty3/album_edit.tpl b/view/tpl/smarty3/album_edit.tpl
deleted file mode 100644
index 36c07a9f0..000000000
--- a/view/tpl/smarty3/album_edit.tpl
+++ /dev/null
@@ -1,20 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<div id="photo-album-edit-wrapper">
-<form name="photo-album-edit-form" id="photo-album-edit-form" action="photos/{{$nickname}}/album/{{$hexalbum}}" method="post" >
-
-
-<label id="photo-album-edit-name-label" for="photo-album-edit-name" >{{$nametext}}</label>
-<input type="text" size="64" name="albumname" value="{{$album}}" >
-
-<div id="photo-album-edit-name-end"></div>
-
-<input id="photo-album-edit-submit" type="submit" name="submit" value="{{$submit}}" />
-<input id="photo-album-edit-drop" type="submit" name="dropalbum" value="{{$dropsubmit}}" onclick="return confirmDelete();" />
-
-</form>
-</div>
-<div id="photo-album-edit-end" ></div>
diff --git a/view/tpl/smarty3/api_config_xml.tpl b/view/tpl/smarty3/api_config_xml.tpl
deleted file mode 100644
index 09aa00ac4..000000000
--- a/view/tpl/smarty3/api_config_xml.tpl
+++ /dev/null
@@ -1,71 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<config>
- <site>
- <name>{{$config.site.name}}</name>
- <server>{{$config.site.server}}</server>
- <theme>default</theme>
- <path></path>
- <logo>{{$config.site.logo}}</logo>
-
- <fancy>true</fancy>
- <language>en</language>
- <email>{{$config.site.email}}</email>
- <broughtby></broughtby>
- <broughtbyurl></broughtbyurl>
- <timezone>UTC</timezone>
- <closed>{{$config.site.closed}}</closed>
-
- <inviteonly>false</inviteonly>
- <private>{{$config.site.private}}</private>
- <textlimit>{{$config.site.textlimit}}</textlimit>
- <ssl>{{$config.site.ssl}}</ssl>
- <sslserver>{{$config.site.sslserver}}</sslserver>
- <shorturllength>30</shorturllength>
-
-</site>
- <license>
- <type>cc</type>
- <owner></owner>
- <url>http://creativecommons.org/licenses/by/3.0/</url>
- <title>Creative Commons Attribution 3.0</title>
- <image>http://i.creativecommons.org/l/by/3.0/80x15.png</image>
-
-</license>
- <nickname>
- <featured></featured>
-</nickname>
- <profile>
- <biolimit></biolimit>
-</profile>
- <group>
- <desclimit></desclimit>
-</group>
- <notice>
-
- <contentlimit></contentlimit>
-</notice>
- <throttle>
- <enabled>false</enabled>
- <count>20</count>
- <timespan>600</timespan>
-</throttle>
- <xmpp>
-
- <enabled>false</enabled>
- <server>INVALID SERVER</server>
- <port>5222</port>
- <user>update</user>
-</xmpp>
- <integration>
- <source>StatusNet</source>
-
-</integration>
- <attachments>
- <uploads>false</uploads>
- <file_quota>0</file_quota>
-</attachments>
-</config>
diff --git a/view/tpl/smarty3/api_friends_xml.tpl b/view/tpl/smarty3/api_friends_xml.tpl
deleted file mode 100644
index e9c40293b..000000000
--- a/view/tpl/smarty3/api_friends_xml.tpl
+++ /dev/null
@@ -1,10 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<users type="array">
- {{foreach $users as $user}}
- {{include file="api_user_xml.tpl"}}
- {{/foreach}}
-</users>
diff --git a/view/tpl/smarty3/api_ratelimit_xml.tpl b/view/tpl/smarty3/api_ratelimit_xml.tpl
deleted file mode 100644
index a34eb6723..000000000
--- a/view/tpl/smarty3/api_ratelimit_xml.tpl
+++ /dev/null
@@ -1,11 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<hash>
- <remaining-hits type="integer">{{$hash.remaining_hits}}</remaining-hits>
- <hourly-limit type="integer">{{$hash.hourly_limit}}</hourly-limit>
- <reset-time type="datetime">{{$hash.reset_time}}</reset-time>
- <reset_time_in_seconds type="integer">{{$hash.resettime_in_seconds}}</reset_time_in_seconds>
-</hash>
diff --git a/view/tpl/smarty3/api_status_xml.tpl b/view/tpl/smarty3/api_status_xml.tpl
deleted file mode 100644
index e3e80d2b1..000000000
--- a/view/tpl/smarty3/api_status_xml.tpl
+++ /dev/null
@@ -1,51 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<status>{{if $status}}
- <created_at>{{$status.created_at}}</created_at>
- <id>{{$status.id}}</id>
- <text>{{$status.text}}</text>
- <source>{{$status.source}}</source>
- <truncated>{{$status.truncated}}</truncated>
- <in_reply_to_status_id>{{$status.in_reply_to_status_id}}</in_reply_to_status_id>
- <in_reply_to_user_id>{{$status.in_reply_to_user_id}}</in_reply_to_user_id>
- <favorited>{{$status.favorited}}</favorited>
- <in_reply_to_screen_name>{{$status.in_reply_to_screen_name}}</in_reply_to_screen_name>
- <geo>{{$status.geo}}</geo>
- <coordinates>{{$status.coordinates}}</coordinates>
- <place>{{$status.place}}</place>
- <contributors>{{$status.contributors}}</contributors>
- <user>
- <id>{{$status.user.id}}</id>
- <name>{{$status.user.name}}</name>
- <screen_name>{{$status.user.screen_name}}</screen_name>
- <location>{{$status.user.location}}</location>
- <description>{{$status.user.description}}</description>
- <profile_image_url>{{$status.user.profile_image_url}}</profile_image_url>
- <url>{{$status.user.url}}</url>
- <protected>{{$status.user.protected}}</protected>
- <followers_count>{{$status.user.followers}}</followers_count>
- <profile_background_color>{{$status.user.profile_background_color}}</profile_background_color>
- <profile_text_color>{{$status.user.profile_text_color}}</profile_text_color>
- <profile_link_color>{{$status.user.profile_link_color}}</profile_link_color>
- <profile_sidebar_fill_color>{{$status.user.profile_sidebar_fill_color}}</profile_sidebar_fill_color>
- <profile_sidebar_border_color>{{$status.user.profile_sidebar_border_color}}</profile_sidebar_border_color>
- <friends_count>{{$status.user.friends_count}}</friends_count>
- <created_at>{{$status.user.created_at}}</created_at>
- <favourites_count>{{$status.user.favourites_count}}</favourites_count>
- <utc_offset>{{$status.user.utc_offset}}</utc_offset>
- <time_zone>{{$status.user.time_zone}}</time_zone>
- <profile_background_image_url>{{$status.user.profile_background_image_url}}</profile_background_image_url>
- <profile_background_tile>{{$status.user.profile_background_tile}}</profile_background_tile>
- <profile_use_background_image>{{$status.user.profile_use_background_image}}</profile_use_background_image>
- <notifications></notifications>
- <geo_enabled>{{$status.user.geo_enabled}}</geo_enabled>
- <verified>{{$status.user.verified}}</verified>
- <following></following>
- <statuses_count>{{$status.user.statuses_count}}</statuses_count>
- <lang>{{$status.user.lang}}</lang>
- <contributors_enabled>{{$status.user.contributors_enabled}}</contributors_enabled>
- </user>
-{{/if}}</status>
diff --git a/view/tpl/smarty3/api_test_xml.tpl b/view/tpl/smarty3/api_test_xml.tpl
deleted file mode 100644
index df5009af5..000000000
--- a/view/tpl/smarty3/api_test_xml.tpl
+++ /dev/null
@@ -1,6 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<ok>{{$ok}}</ok>
diff --git a/view/tpl/smarty3/api_timeline_atom.tpl b/view/tpl/smarty3/api_timeline_atom.tpl
deleted file mode 100644
index 00a28e390..000000000
--- a/view/tpl/smarty3/api_timeline_atom.tpl
+++ /dev/null
@@ -1,95 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<feed xml:lang="en-US" xmlns="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:georss="http://www.georss.org/georss" xmlns:activity="http://activitystrea.ms/spec/1.0/" xmlns:media="http://purl.org/syndication/atommedia" xmlns:poco="http://portablecontacts.net/spec/1.0" xmlns:ostatus="http://ostatus.org/schema/1.0" xmlns:statusnet="http://status.net/schema/api/1/">
- <generator uri="http://status.net" version="0.9.7">StatusNet</generator>
- <id>{{$rss.self}}</id>
- <title>Friendika</title>
- <subtitle>Friendika API feed</subtitle>
- <logo>{{$rss.logo}}</logo>
- <updated>{{$rss.atom_updated}}</updated>
- <link type="text/html" rel="alternate" href="{{$rss.alternate}}"/>
- <link type="application/atom+xml" rel="self" href="{{$rss.self}}"/>
-
-
- <author>
- <activity:obj_type>http://activitystrea.ms/schema/1.0/person</activity:obj_type>
- <uri>{{$user.url}}</uri>
- <name>{{$user.name}}</name>
- <link rel="alternate" type="text/html" href="{{$user.url}}"/>
- <link rel="avatar" type="image/jpeg" media:width="106" media:height="106" href="{{$user.profile_image_url}}"/>
- <link rel="avatar" type="image/jpeg" media:width="96" media:height="96" href="{{$user.profile_image_url}}"/>
- <link rel="avatar" type="image/jpeg" media:width="48" media:height="48" href="{{$user.profile_image_url}}"/>
- <link rel="avatar" type="image/jpeg" media:width="24" media:height="24" href="{{$user.profile_image_url}}"/>
- <georss:point></georss:point>
- <poco:preferredUsername>{{$user.screen_name}}</poco:preferredUsername>
- <poco:displayName>{{$user.name}}</poco:displayName>
- <poco:urls>
- <poco:type>homepage</poco:type>
- <poco:value>{{$user.url}}</poco:value>
- <poco:primary>true</poco:primary>
- </poco:urls>
- <statusnet:profile_info local_id="{{$user.id}}"></statusnet:profile_info>
- </author>
-
- <!--Deprecation warning: activity:subject is present only for backward compatibility. It will be removed in the next version of StatusNet.-->
- <activity:subject>
- <activity:obj_type>http://activitystrea.ms/schema/1.0/person</activity:obj_type>
- <id>{{$user.contact_url}}</id>
- <title>{{$user.name}}</title>
- <link rel="alternate" type="text/html" href="{{$user.url}}"/>
- <link rel="avatar" type="image/jpeg" media:width="106" media:height="106" href="{{$user.profile_image_url}}"/>
- <link rel="avatar" type="image/jpeg" media:width="96" media:height="96" href="{{$user.profile_image_url}}"/>
- <link rel="avatar" type="image/jpeg" media:width="48" media:height="48" href="{{$user.profile_image_url}}"/>
- <link rel="avatar" type="image/jpeg" media:width="24" media:height="24" href="{{$user.profile_image_url}}"/>
- <poco:preferredUsername>{{$user.screen_name}}</poco:preferredUsername>
- <poco:displayName>{{$user.name}}</poco:displayName>
- <poco:urls>
- <poco:type>homepage</poco:type>
- <poco:value>{{$user.url}}</poco:value>
- <poco:primary>true</poco:primary>
- </poco:urls>
- <statusnet:profile_info local_id="{{$user.id}}"></statusnet:profile_info>
- </activity:subject>
-
-
- {{foreach $statuses as $status}}
- <entry>
- <activity:obj_type>{{$status.objecttype}}</activity:obj_type>
- <id>{{$status.message_id}}</id>
- <title>{{$status.text}}</title>
- <content type="html">{{$status.statusnet_html}}</content>
- <link rel="alternate" type="text/html" href="{{$status.url}}"/>
- <activity:verb>{{$status.verb}}</activity:verb>
- <published>{{$status.published}}</published>
- <updated>{{$status.updated}}</updated>
-
- <link rel="self" type="application/atom+xml" href="{{$status.self}}"/>
- <link rel="edit" type="application/atom+xml" href="{{$status.edit}}"/>
- <statusnet:notice_info local_id="{{$status.id}}" source="{{$status.source}}" >
- </statusnet:notice_info>
-
- <author>
- <activity:obj_type>http://activitystrea.ms/schema/1.0/person</activity:obj_type>
- <uri>{{$status.user.url}}</uri>
- <name>{{$status.user.name}}</name>
- <link rel="alternate" type="text/html" href="{{$status.user.url}}"/>
- <link rel="avatar" type="image/jpeg" media:width="48" media:height="48" href="{{$status.user.profile_image_url}}"/>
-
- <georss:point/>
- <poco:preferredUsername>{{$status.user.screen_name}}</poco:preferredUsername>
- <poco:displayName>{{$status.user.name}}</poco:displayName>
- <poco:address/>
- <poco:urls>
- <poco:type>homepage</poco:type>
- <poco:value>{{$status.user.url}}</poco:value>
- <poco:primary>true</poco:primary>
- </poco:urls>
- </author>
- <link rel="ostatus:conversation" type="text/html" href="{{$status.url}}"/>
-
- </entry>
- {{/foreach}}
-</feed>
diff --git a/view/tpl/smarty3/api_timeline_rss.tpl b/view/tpl/smarty3/api_timeline_rss.tpl
deleted file mode 100644
index afad50aab..000000000
--- a/view/tpl/smarty3/api_timeline_rss.tpl
+++ /dev/null
@@ -1,31 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:georss="http://www.georss.org/georss" xmlns:twitter="http://api.twitter.com">
- <channel>
- <title>Friendika</title>
- <link>{{$rss.alternate}}</link>
- <atom:link type="application/rss+xml" rel="self" href="{{$rss.self}}"/>
- <description>Friendika timeline</description>
- <language>{{$rss.language}}</language>
- <ttl>40</ttl>
- <image>
- <link>{{$user.link}}</link>
- <title>{{$user.name}}'s items</title>
- <url>{{$user.profile_image_url}}</url>
- </image>
-
-{{foreach $statuses as $status}}
- <item>
- <title>{{$status.user.name}}: {{$status.text}}</title>
- <description>{{$status.text}}</description>
- <pubDate>{{$status.created_at}}</pubDate>
- <guid>{{$status.url}}</guid>
- <link>{{$status.url}}</link>
- <twitter:source>{{$status.source}}</twitter:source>
- </item>
-{{/foreach}}
- </channel>
-</rss>
diff --git a/view/tpl/smarty3/api_timeline_xml.tpl b/view/tpl/smarty3/api_timeline_xml.tpl
deleted file mode 100644
index 84148d17f..000000000
--- a/view/tpl/smarty3/api_timeline_xml.tpl
+++ /dev/null
@@ -1,25 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<statuses type="array" xmlns:statusnet="http://status.net/schema/api/1/">
-{{foreach $statuses as $status}} <status>
- <text>{{$status.text}}</text>
- <truncated>{{$status.truncated}}</truncated>
- <created_at>{{$status.created_at}}</created_at>
- <in_reply_to_status_id>{{$status.in_reply_to_status_id}}</in_reply_to_status_id>
- <source>{{$status.source}}</source>
- <id>{{$status.id}}</id>
- <in_reply_to_user_id>{{$status.in_reply_to_user_id}}</in_reply_to_user_id>
- <in_reply_to_screen_name>{{$status.in_reply_to_screen_name}}</in_reply_to_screen_name>
- <geo>{{$status.geo}}</geo>
- <favorited>{{$status.favorited}}</favorited>
-{{include file="api_user_xml.tpl" user=$status.user}} <statusnet:html>{{$status.statusnet_html}}</statusnet:html>
- <statusnet:conversation_id>{{$status.statusnet_conversation_id}}</statusnet:conversation_id>
- <url>{{$status.url}}</url>
- <coordinates>{{$status.coordinates}}</coordinates>
- <place>{{$status.place}}</place>
- <contributors>{{$status.contributors}}</contributors>
- </status>
-{{/foreach}}</statuses>
diff --git a/view/tpl/smarty3/api_user_xml.tpl b/view/tpl/smarty3/api_user_xml.tpl
deleted file mode 100644
index d7efcf3fb..000000000
--- a/view/tpl/smarty3/api_user_xml.tpl
+++ /dev/null
@@ -1,51 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
- <user>
- <id>{{$user.id}}</id>
- <name>{{$user.name}}</name>
- <screen_name>{{$user.screen_name}}</screen_name>
- <location>{{$user.location}}</location>
- <description>{{$user.description}}</description>
- <profile_image_url>{{$user.profile_image_url}}</profile_image_url>
- <url>{{$user.url}}</url>
- <protected>{{$user.protected}}</protected>
- <followers_count>{{$user.followers_count}}</followers_count>
- <friends_count>{{$user.friends_count}}</friends_count>
- <created_at>{{$user.created_at}}</created_at>
- <favourites_count>{{$user.favourites_count}}</favourites_count>
- <utc_offset>{{$user.utc_offset}}</utc_offset>
- <time_zone>{{$user.time_zone}}</time_zone>
- <statuses_count>{{$user.statuses_count}}</statuses_count>
- <following>{{$user.following}}</following>
- <profile_background_color>{{$user.profile_background_color}}</profile_background_color>
- <profile_text_color>{{$user.profile_text_color}}</profile_text_color>
- <profile_link_color>{{$user.profile_link_color}}</profile_link_color>
- <profile_sidebar_fill_color>{{$user.profile_sidebar_fill_color}}</profile_sidebar_fill_color>
- <profile_sidebar_border_color>{{$user.profile_sidebar_border_color}}</profile_sidebar_border_color>
- <profile_background_image_url>{{$user.profile_background_image_url}}</profile_background_image_url>
- <profile_background_tile>{{$user.profile_background_tile}}</profile_background_tile>
- <profile_use_background_image>{{$user.profile_use_background_image}}</profile_use_background_image>
- <notifications>{{$user.notifications}}</notifications>
- <geo_enabled>{{$user.geo_enabled}}</geo_enabled>
- <verified>{{$user.verified}}</verified>
- <lang>{{$user.lang}}</lang>
- <contributors_enabled>{{$user.contributors_enabled}}</contributors_enabled>
- <status>{{if $user.status}}
- <created_at>{{$user.status.created_at}}</created_at>
- <id>{{$user.status.id}}</id>
- <text>{{$user.status.text}}</text>
- <source>{{$user.status.source}}</source>
- <truncated>{{$user.status.truncated}}</truncated>
- <in_reply_to_status_id>{{$user.status.in_reply_to_status_id}}</in_reply_to_status_id>
- <in_reply_to_user_id>{{$user.status.in_reply_to_user_id}}</in_reply_to_user_id>
- <favorited>{{$user.status.favorited}}</favorited>
- <in_reply_to_screen_name>{{$user.status.in_reply_to_screen_name}}</in_reply_to_screen_name>
- <geo>{{$user.status.geo}}</geo>
- <coordinates>{{$user.status.coordinates}}</coordinates>
- <place>{{$user.status.place}}</place>
- <contributors>{{$user.status.contributors}}</contributors>
- {{/if}}</status>
- </user>
diff --git a/view/tpl/smarty3/apps.tpl b/view/tpl/smarty3/apps.tpl
deleted file mode 100644
index 01d9bb8c8..000000000
--- a/view/tpl/smarty3/apps.tpl
+++ /dev/null
@@ -1,12 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<h3>{{$title}}</h3>
-
-<ul>
- {{foreach $apps as $ap}}
- <li>{{$ap}}</li>
- {{/foreach}}
-</ul>
diff --git a/view/tpl/smarty3/atom_feed.tpl b/view/tpl/smarty3/atom_feed.tpl
deleted file mode 100644
index db553d99f..000000000
--- a/view/tpl/smarty3/atom_feed.tpl
+++ /dev/null
@@ -1,34 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<?xml version="1.0" encoding="utf-8" ?>
-<feed xmlns="http://www.w3.org/2005/Atom"
- xmlns:thr="http://purl.org/syndication/thread/1.0"
- xmlns:at="http://purl.org/atompub/tombstones/1.0"
- xmlns:media="http://purl.org/syndication/atommedia"
- xmlns:dfrn="http://purl.org/macgirvin/dfrn/1.0"
- xmlns:as="http://activitystrea.ms/spec/1.0/"
- xmlns:georss="http://www.georss.org/georss"
- xmlns:poco="http://portablecontacts.net/spec/1.0"
- xmlns:ostatus="http://ostatus.org/schema/1.0"
- xmlns:statusnet="http://status.net/schema/api/1/" >
-
- <id>{{$feed_id}}</id>
- <title>{{$feed_title}}</title>
- <generator uri="http://friendica.com" version="{{$version}}">Friendica</generator>
- <link rel="license" href="http://creativecommons.org/licenses/by/3.0/" />
- {{$hub}}
- {{$salmon}}
- {{$community}}
-
- <updated>{{$feed_updated}}</updated>
-
- <dfrn:owner>
- <name dfrn:updated="{{$namdate}}" >{{$name}}</name>
- <uri dfrn:updated="{{$uridate}}" >{{$profile_page}}</uri>
- <link rel="photo" type="image/jpeg" dfrn:updated="{{$picdate}}" media:width="175" media:height="175" href="{{$photo}}" />
- <link rel="avatar" type="image/jpeg" dfrn:updated="{{$picdate}}" media:width="175" media:height="175" href="{{$photo}}" />
- {{$birthday}}
- </dfrn:owner>
diff --git a/view/tpl/smarty3/atom_feed_dfrn.tpl b/view/tpl/smarty3/atom_feed_dfrn.tpl
deleted file mode 100644
index 87d78a518..000000000
--- a/view/tpl/smarty3/atom_feed_dfrn.tpl
+++ /dev/null
@@ -1,34 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<?xml version="1.0" encoding="utf-8" ?>
-<feed xmlns="http://www.w3.org/2005/Atom"
- xmlns:thr="http://purl.org/syndication/thread/1.0"
- xmlns:at="http://purl.org/atompub/tombstones/1.0"
- xmlns:media="http://purl.org/syndication/atommedia"
- xmlns:dfrn="http://purl.org/macgirvin/dfrn/1.0"
- xmlns:as="http://activitystrea.ms/spec/1.0/"
- xmlns:georss="http://www.georss.org/georss"
- xmlns:poco="http://portablecontacts.net/spec/1.0"
- xmlns:ostatus="http://ostatus.org/schema/1.0"
- xmlns:statusnet="http://status.net/schema/api/1/" >
-
- <id>{{$feed_id}}</id>
- <title>{{$feed_title}}</title>
- <generator uri="http://friendica.com" version="{{$version}}">Friendica</generator>
- <link rel="license" href="http://creativecommons.org/licenses/by/3.0/" />
- {{$hub}}
- {{$salmon}}
- {{$community}}
-
- <updated>{{$feed_updated}}</updated>
-
- <author>
- <name dfrn:updated="{{$namdate}}" >{{$name}}</name>
- <uri dfrn:updated="{{$uridate}}" >{{$profile_page}}</uri>
- <link rel="photo" type="image/jpeg" dfrn:updated="{{$picdate}}" media:width="175" media:height="175" href="{{$photo}}" />
- <link rel="avatar" type="image/jpeg" dfrn:updated="{{$picdate}}" media:width="175" media:height="175" href="{{$photo}}" />
- {{$birthday}}
- </author>
diff --git a/view/tpl/smarty3/atom_mail.tpl b/view/tpl/smarty3/atom_mail.tpl
deleted file mode 100644
index adf75a3e7..000000000
--- a/view/tpl/smarty3/atom_mail.tpl
+++ /dev/null
@@ -1,22 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-
-<dfrn:mail>
-
- <dfrn:sender>
- <dfrn:name>{{$name}}</dfrn:name>
- <dfrn:uri>{{$profile_page}}</dfrn:uri>
- <dfrn:avatar>{{$thumb}}</dfrn:avatar>
- </dfrn:sender>
-
- <dfrn:id>{{$item_id}}</dfrn:id>
- <dfrn:in-reply-to>{{$parent_id}}</dfrn:in-reply-to>
- <dfrn:sentdate>{{$created}}</dfrn:sentdate>
- <dfrn:subject>{{$subject}}</dfrn:subject>
- <dfrn:content>{{$content}}</dfrn:content>
-
-</dfrn:mail>
-
diff --git a/view/tpl/smarty3/atom_suggest.tpl b/view/tpl/smarty3/atom_suggest.tpl
deleted file mode 100644
index c0d1a1b3c..000000000
--- a/view/tpl/smarty3/atom_suggest.tpl
+++ /dev/null
@@ -1,16 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-
-<dfrn:suggest>
-
- <dfrn:url>{{$url}}</dfrn:url>
- <dfrn:name>{{$name}}</dfrn:name>
- <dfrn:photo>{{$photo}}</dfrn:photo>
- <dfrn:request>{{$request}}</dfrn:request>
- <dfrn:note>{{$note}}</dfrn:note>
-
-</dfrn:suggest>
-
diff --git a/view/tpl/smarty3/auto_request.tpl b/view/tpl/smarty3/auto_request.tpl
deleted file mode 100644
index 662ca2447..000000000
--- a/view/tpl/smarty3/auto_request.tpl
+++ /dev/null
@@ -1,42 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-
-<h1>{{$header}}</h1>
-
-<p id="dfrn-request-intro">
-{{$page_desc}}<br />
-<ul id="dfrn-request-networks">
-<li><a href="http://friendica.com" title="{{$friendica}}">{{$friendica}}</a></li>
-<li><a href="http://joindiaspora.com" title="{{$diaspora}}">{{$diaspora}}</a> {{$diasnote}}</li>
-<li><a href="http://ostatus.org" title="{{$public_net}}" >{{$statusnet}}</a></li>
-{{if $emailnet}}<li>{{$emailnet}}</li>{{/if}}
-</ul>
-</p>
-<p>
-{{$invite_desc}}
-</p>
-<p>
-{{$desc}}
-</p>
-
-<form action="dfrn_request/{{$nickname}}" method="post" />
-
-<div id="dfrn-request-url-wrapper" >
- <label id="dfrn-url-label" for="dfrn-url" >{{$your_address}}</label>
- <input type="text" name="dfrn_url" id="dfrn-url" size="32" value="{{$myaddr}}" />
- <div id="dfrn-request-url-end"></div>
-</div>
-
-
-<div id="dfrn-request-info-wrapper" >
-
-</div>
-
- <div id="dfrn-request-submit-wrapper">
- <input type="submit" name="submit" id="dfrn-request-submit-button" value="{{$submit}}" />
- <input type="submit" name="cancel" id="dfrn-request-cancel-button" value="{{$cancel}}" />
- </div>
-</form>
diff --git a/view/tpl/smarty3/birthdays_reminder.tpl b/view/tpl/smarty3/birthdays_reminder.tpl
deleted file mode 100644
index 56749cd12..000000000
--- a/view/tpl/smarty3/birthdays_reminder.tpl
+++ /dev/null
@@ -1,15 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-{{if $count}}
-<div id="birthday-notice" class="birthday-notice fakelink {{$classtoday}}" onclick="openClose('birthday-wrapper');">{{$event_reminders}} ({{$count}})</div>
-<div id="birthday-wrapper" style="display: none;" ><div id="birthday-title">{{$event_title}}</div>
-<div id="birthday-title-end"></div>
-{{foreach $events as $event}}
-<div class="birthday-list" id="birthday-{{$event.id}}"></a> <a href="{{$event.link}}">{{$event.title}}</a> {{$event.date}} </div>
-{{/foreach}}
-</div>
-{{/if}}
-
diff --git a/view/tpl/smarty3/build_query.tpl b/view/tpl/smarty3/build_query.tpl
deleted file mode 100644
index 6df7f6589..000000000
--- a/view/tpl/smarty3/build_query.tpl
+++ /dev/null
@@ -1,57 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<script>
-
- var bParam_cmd = "{{$baseurl}}/update_{{$pgtype}}";
-
-
- var bParam_uid = {{$uid}};
- var bParam_gid = {{$gid}};
- var bParam_cid = {{$cid}};
- var bParam_cmin = {{$cmin}};
- var bParam_cmax = {{$cmax}};
- var bParam_star = {{$star}};
- var bParam_liked = {{$liked}};
- var bParam_conv = {{$conv}};
- var bParam_spam = {{$spam}};
- var bParam_new = {{$nouveau}};
- var bParam_page = {{$page}};
- var bParam_wall = {{$wall}};
-
- var bParam_search = "{{$search}}";
- var bParam_order = "{{$order}}";
- var bParam_file = "{{$file}}";
- var bParam_cats = "{{$cats}}";
- var bParam_dend = "{{$dend}}";
- var bParam_dbegin = "{{$dbegin}}";
- var bParam_uri = "{{$uri}}";
-
- function buildCmd() {
- var udargs = ((page_load) ? "/load" : "");
- var bCmd = bParam_cmd + udargs + "?f=" ;
- if(bParam_uid) bCmd = bCmd + "&p=" + bParam_uid;
- if(bParam_cmin != 0) bCmd = bCmd + "&cmin=" + bParam_cmin;
- if(bParam_cmax != 99) bCmd = bCmd + "&cmax=" + bParam_cmax;
- if(bParam_gid != 0) { bCmd = bCmd + "&gid=" + bParam_gid; } else
- if(bParam_cid != 0) { bCmd = bCmd + "&cid=" + bParam_cid; }
- if(bParam_star != 0) bCmd = bCmd + "&star=" + bParam_star;
- if(bParam_liked != 0) bCmd = bCmd + "&liked=" + bParam_liked;
- if(bParam_conv!= 0) bCmd = bCmd + "&conv=" + bParam_conv;
- if(bParam_spam != 0) bCmd = bCmd + "&spam=" + bParam_spam;
- if(bParam_new != 0) bCmd = bCmd + "&new=" + bParam_new;
- if(bParam_wall != 0) bCmd = bCmd + "&wall=" + bParam_wall;
- if(bParam_search != "") bCmd = bCmd + "&search=" + bParam_search;
- if(bParam_file != "") bCmd = bCmd + "&file=" + bParam_file;
- if(bParam_cats != "") bCmd = bCmd + "&cats=" + bParam_cats;
- if(bParam_dend != "") bCmd = bCmd + "&dend=" + bParam_dend;
- if(bParam_dbegin != "") bCmd = bCmd + "&dbegin=" + bParam_dbegin;
- if(bParam_uri != "") bCmd = bCmd + "&uri=" + bParam_uri;
- if(bParam_page != 1) bCmd = bCmd + "&page=" + bParam_page;
- return(bCmd);
- }
-
-</script>
-
diff --git a/view/tpl/smarty3/categories_widget.tpl b/view/tpl/smarty3/categories_widget.tpl
deleted file mode 100644
index 75da9fc43..000000000
--- a/view/tpl/smarty3/categories_widget.tpl
+++ /dev/null
@@ -1,17 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<div id="categories-sidebar" class="widget">
- <h3>{{$title}}</h3>
- <div id="categories-sidebar-desc">{{$desc}}</div>
-
- <ul class="categories-ul">
- <li class="tool"><a href="{{$base}}" class="categories-link categories-all{{if $sel_all}} categories-selected{{/if}}">{{$all}}</a></li>
- {{foreach $terms as $term}}
- <li class="tool"><a href="{{$base}}?f=&cat={{$term.name}}" class="categories-link{{if $term.selected}} categories-selected{{/if}}">{{$term.name}}</a></li>
- {{/foreach}}
- </ul>
-
-</div>
diff --git a/view/tpl/smarty3/channel.tpl b/view/tpl/smarty3/channel.tpl
deleted file mode 100644
index b49cf19cc..000000000
--- a/view/tpl/smarty3/channel.tpl
+++ /dev/null
@@ -1,17 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<div class="channel-selection">
-{{if $channel.default_links}}
-{{if $channel.default}}
-<div class="channel-selection-default default">{{$msg_default}}</div>
-{{else}}
-<div class="channel-selection-default"><a href="manage/{{$channel.channel_id}}/default">{{$msg_make_default}}</a></div>
-{{/if}}
-{{/if}}
-<a href="{{$channel.link}}" class="channel-selection-photo-link" title="{{$channel.channel_name}}"><img class="channel-photo" src="{{$channel.xchan_photo_m}}" alt="{{$channel.channel_name}}" /></a>
-<a href="{{$channel.link}}" class="channel-selection-name-link" title="{{$channel.channel_name}}"><div class="channel-name">{{$channel.channel_name}}</div></a>
-</div>
-<div class="channel-selection-end"></div>
diff --git a/view/tpl/smarty3/channel_import.tpl b/view/tpl/smarty3/channel_import.tpl
deleted file mode 100644
index 872f039b7..000000000
--- a/view/tpl/smarty3/channel_import.tpl
+++ /dev/null
@@ -1,40 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<h2>{{$title}}</h2>
-
-<form action="import" method="post" id="import-channel-form">
-
- <div id="import-desc" class="descriptive-paragraph">{{$desc}}</div>
-
- <label for="import-filename" id="label-import-filename" class="import-label" >{{$label_filename}}</label>
- <input type="file" name="filename" id="import-filename" class="import-input" value="" />
- <div id="import-filename-end" class="import-field-end"></div>
-
- <div id="import-choice" class="descriptive-paragraph">{{$choice}}</div>
-
- <label for="import-old-address" id="label-import-old-address" class="import-label" >{{$label_old_address}}</label>
- <input type="text" name="old_address" id="import-old-address" class="import-input" value="" />
- <div id="import-old-address-end" class="import-field-end"></div>
-
- <label for="import-old-email" id="label-import-old-email" class="import-label" >{{$label_old_email}}</label>
- <input type="text" name="email" id="import-old-email" class="import-input" value="{{$email}}" />
- <div id="import-old-email-end" class="import-field-end"></div>
-
- <label for="import-old-pass" id="label-import-old-pass" class="import-label" >{{$label_old_pass}}</label>
- <input type="password" name="password" id="import-old-pass" class="import-input" value="{{$pass}}" />
- <div id="import-old-pass-end" class="import-field-end"></div>
-
- <div id="import-common-desc" class="descriptive-paragraph">{{$common}}</div>
-
- <input type="checkbox" name="make_primary" id="import-make-primary" value="1" />
- <label for="import-make-primary" id="label-import-make-primary">{{$label_import_primary}}</label>
- <div id="import-make-primary-end" class="import-field-end"></div>
-
- <input type="submit" name="submit" id="import-submit-button" value="{{$submit}}" />
- <div id="import-submit-end" class="import-field-end"></div>
-
-</form>
-
diff --git a/view/tpl/smarty3/channels.tpl b/view/tpl/smarty3/channels.tpl
deleted file mode 100644
index cfb66401b..000000000
--- a/view/tpl/smarty3/channels.tpl
+++ /dev/null
@@ -1,27 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<h3>{{$header}}</h3>
-
-
-{{if $links}}
-{{foreach $links as $l}}
-<a class="channels-links" href="{{$l.0}}" title="{{$l.1}}">{{$l.2}}</a>
-{{/foreach}}
-{{/if}}
-
-{{if $selected}}
-<div id="channels-selected">{{$msg_selected}}</div>
-{{include file="channel.tpl" channel=$selected}}
-<div class="channels-end selected"></div>
-{{/if}}
-
-<div id="channels-desc" class="descriptive-text">{{$desc}}</div>
-
-{{foreach $all_channels as $chn}}
-{{include file="channel.tpl" channel=$chn}}
-{{/foreach}}
-
-<div class="channels-end all"></div>
diff --git a/view/tpl/smarty3/chanview.tpl b/view/tpl/smarty3/chanview.tpl
deleted file mode 100644
index 4b0f29f6c..000000000
--- a/view/tpl/smarty3/chanview.tpl
+++ /dev/null
@@ -1,7 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<div id="chanview-iframe-border" class="fakelink" onclick="chanviewFull(); return true;" title="{{$full}}" >&#x2610;</div>
-<iframe id="remote-channel" width="100%" src="{{$url}}" onload="resize_iframe()"></iframe>
diff --git a/view/tpl/smarty3/comment_item.tpl b/view/tpl/smarty3/comment_item.tpl
deleted file mode 100644
index cde6466f0..000000000
--- a/view/tpl/smarty3/comment_item.tpl
+++ /dev/null
@@ -1,73 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
- {{if $threaded}}
- <div class="comment-wwedit-wrapper threaded" id="comment-edit-wrapper-{{$id}}" style="display: block;">
- {{else}}
- <div class="comment-wwedit-wrapper" id="comment-edit-wrapper-{{$id}}" style="display: block;">
- {{/if}}
- <form class="comment-edit-form" style="display: block;" id="comment-edit-form-{{$id}}" action="item" method="post" onsubmit="post_comment({{$id}}); return false;">
- <input type="hidden" name="type" value="{{$type}}" />
- <input type="hidden" name="profile_uid" value="{{$profile_uid}}" />
- <input type="hidden" name="parent" value="{{$parent}}" />
- <input type="hidden" name="return" value="{{$return_path}}" />
- <input type="hidden" name="jsreload" value="{{$jsreload}}" />
- <input type="hidden" name="preview" id="comment-preview-inp-{{$id}}" value="0" />
- <input type="hidden" name="post_id_random" value="{{$rand_num}}" />
-
- <div class="comment-edit-photo" id="comment-edit-photo-{{$id}}" >
- <a class="comment-edit-photo-link" href="{{$mylink}}" title="{{$mytitle}}"><img class="my-comment-photo" src="{{$myphoto}}" alt="{{$mytitle}}" title="{{$mytitle}}" /></a>
- </div>
- <div class="comment-edit-photo-end"></div>
- <ul class="comment-edit-bb-{{$id}}">
- <li><a class="editicon boldbb shadow"
- style="cursor: pointer;" title="{{$edbold}}"
- onclick="insertFormatting('{{$comment}}','b', {{$id}});"></a></li>
- <li><a class="editicon italicbb shadow"
- style="cursor: pointer;" title="{{$editalic}}"
- onclick="insertFormatting('{{$comment}}','i', {{$id}});"></a></li>
- <li><a class="editicon underlinebb shadow"
- style="cursor: pointer;" title="{{$eduline}}"
- onclick="insertFormatting('{{$comment}}','u', {{$id}});"></a></li>
- <li><a class="editicon quotebb shadow"
- style="cursor: pointer;" title="{{$edquote}}"
- onclick="insertFormatting('{{$comment}}','quote', {{$id}});"></a></li>
- <li><a class="editicon codebb shadow"
- style="cursor: pointer;" title="{{$edcode}}"
- onclick="insertFormatting('{{$comment}}','code', {{$id}});"></a></li>
- <li><a class="editicon imagebb shadow"
- style="cursor: pointer;" title="{{$edimg}}"
- onclick="insertFormatting('{{$comment}}','img', {{$id}});"></a></li>
- <li><a class="editicon urlbb shadow"
- style="cursor: pointer;" title="{{$edurl}}"
- onclick="insertFormatting('{{$comment}}','url', {{$id}});"></a></li>
- <li><a class="editicon videobb shadow"
- style="cursor: pointer;" title="{{$edvideo}}"
- onclick="insertFormatting('{{$comment}}','video', {{$id}});"></a></li>
- </ul>
- <div class="comment-edit-bb-end"></div>
- <textarea id="comment-edit-text-{{$id}}" class="comment-edit-text-empty" name="body" onFocus="commentOpen(this,{{$id}});cmtBbOpen(this, {{$id}});" onBlur="commentClose(this,{{$id}});cmtBbClose(this,{{$id}});" >{{$comment}}</textarea>
- {{if $qcomment}}
- <select id="qcomment-select-{{$id}}" name="qcomment-{{$id}}" class="qcomment" onchange="qCommentInsert(this,{{$id}});" >
- <option value=""></option>
- {{foreach $qcomment as $qc}}
- <option value="{{$qc}}">{{$qc}}</option>
- {{/foreach}}
- </select>
- {{/if}}
-
- <div class="comment-edit-text-end"></div>
- <div class="comment-edit-submit-wrapper" id="comment-edit-submit-wrapper-{{$id}}" style="display: none;" >
- <input type="submit" onclick="post_comment({{$id}}); return false;" id="comment-edit-submit-{{$id}}" class="comment-edit-submit" name="submit" value="{{$submit}}" />
- {{if $preview}}
- <span onclick="preview_comment({{$id}});" id="comment-edit-preview-link-{{$id}}" class="fakelink">{{$preview}}</span>
- <div id="comment-edit-preview-{{$id}}" class="comment-edit-preview" style="display:none;"></div>
- {{/if}}
- </div>
-
- <div class="comment-edit-end"></div>
- </form>
-
- </div>
diff --git a/view/tpl/smarty3/common_friends.tpl b/view/tpl/smarty3/common_friends.tpl
deleted file mode 100644
index 499cfe626..000000000
--- a/view/tpl/smarty3/common_friends.tpl
+++ /dev/null
@@ -1,17 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<div class="profile-match-wrapper">
- <div class="profile-match-photo">
- <a href="{{$url}}">
- <img src="{{$photo}}" alt="{{$name}}" width="80" height="80" title="{{$name}} [{{$url}}]" />
- </a>
- </div>
- <div class="profile-match-break"></div>
- <div class="profile-match-name">
- <a href="{{$url}}" title="{{$name}}[{{$tags}}]">{{$name}}</a>
- </div>
- <div class="profile-match-end"></div>
-</div> \ No newline at end of file
diff --git a/view/tpl/smarty3/common_tabs.tpl b/view/tpl/smarty3/common_tabs.tpl
deleted file mode 100644
index 07c501499..000000000
--- a/view/tpl/smarty3/common_tabs.tpl
+++ /dev/null
@@ -1,11 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<ul class="tabs">
- {{foreach $tabs as $tab}}
- <li {{if $tab.id}}id="{{$tab.id}}"{{/if}}><a href="{{$tab.url}}" class="tab button {{$tab.sel}}"{{if $tab.title}} title="{{$tab.title}}"{{/if}}>{{$tab.label}}</a></li>
- {{/foreach}}
-</ul>
-<div class="tabs-end"></div> \ No newline at end of file
diff --git a/view/tpl/smarty3/contact_block.tpl b/view/tpl/smarty3/contact_block.tpl
deleted file mode 100644
index 3b07a1ea3..000000000
--- a/view/tpl/smarty3/contact_block.tpl
+++ /dev/null
@@ -1,17 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<div id="contact-block">
-<div id="contact-block-numcontacts">{{$contacts}}</div>
-{{if $micropro}}
- <a class="allcontact-link" href="viewconnections/{{$nickname}}">{{$viewconnections}}</a>
- <div class='contact-block-content'>
- {{foreach $micropro as $m}}
- {{$m}}
- {{/foreach}}
- </div>
-{{/if}}
-</div>
-<div class="clear"></div>
diff --git a/view/tpl/smarty3/contact_edit.tpl b/view/tpl/smarty3/contact_edit.tpl
deleted file mode 100644
index 28d067af1..000000000
--- a/view/tpl/smarty3/contact_edit.tpl
+++ /dev/null
@@ -1,94 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-
-<h2>{{$header}}</h2>
-
-<div id="contact-edit-wrapper" >
-
- {{$tab_str}}
-
- <div id="contact-edit-drop-link" >
- <a href="contacts/{{$contact_id}}/drop" class="icon drophide" id="contact-edit-drop-link" onclick="return confirmDelete();" title="{{$delete}}" onmouseover="imgbright(this);" onmouseout="imgdull(this);"></a>
- </div>
-
- <div id="contact-edit-drop-link-end"></div>
-
-
- <div id="contact-edit-nav-wrapper" >
- <div id="contact-edit-links">
- <ul>
- <li><div id="contact-edit-rel">{{$relation_text}}</div></li>
- <li><div id="contact-edit-nettype">{{$nettype}}</div></li>
- {{if $lost_contact}}
- <li><div id="lost-contact-message">{{$lost_contact}}</div></li>
- {{/if}}
- {{if $insecure}}
- <li><div id="insecure-message">{{$insecure}}</div></li>
- {{/if}}
- {{if $blocked}}
- <li><div id="block-message">{{$blocked}}</div></li>
- {{/if}}
- {{if $ignored}}
- <li><div id="ignore-message">{{$ignored}}</div></li>
- {{/if}}
- {{if $archived}}
- <li><div id="archive-message">{{$archived}}</div></li>
- {{/if}}
-
- <li>&nbsp;</li>
-
- {{if $common_text}}
- <li><div id="contact-edit-common"><a href="{{$common_link}}">{{$common_text}}</a></div></li>
- {{/if}}
- {{if $all_friends}}
- <li><div id="contact-edit-allfriends"><a href="allfriends/{{$contact_id}}">{{$all_friends}}</a></div></li>
- {{/if}}
-
-
- <li><a href="network/?cid={{$contact_id}}" id="contact-edit-view-recent">{{$lblrecent}}</a></li>
- {{if $lblsuggest}}
- <li><a href="fsuggest/{{$contact_id}}" id="contact-edit-suggest">{{$lblsuggest}}</a></li>
- {{/if}}
-
- </ul>
- </div>
- </div>
- <div id="contact-edit-nav-end"></div>
-
-
-<form action="contacts/{{$contact_id}}" method="post" >
-<input type="hidden" name="contact_id" value="{{$contact_id}}">
-<input id="contact-closeness-mirror" type="hidden" name="closeness" value="{{$close}}" />
-
- {{if $poll_enabled}}
- <div id="contact-edit-poll-wrapper">
- <div id="contact-edit-last-update-text">{{$lastupdtext}} <span id="contact-edit-last-updated">{{$last_update}}</span></div>
- <span id="contact-edit-poll-text">{{$updpub}}</span> {{$poll_interval}} <span id="contact-edit-update-now" class="button"><a href="contacts/{{$contact_id}}/update" >{{$udnow}}</a></span>
- </div>
- {{/if}}
- <div id="contact-edit-end" ></div>
-
- {{include file="field_checkbox.tpl" field=$hidden}}
-
-<div id="contact-edit-info-wrapper">
-<h4>{{$lbl_info1}}</h4>
- <textarea id="contact-edit-info" rows="8" cols="60" name="info">{{$info}}</textarea>
- <input class="contact-edit-submit" type="submit" name="submit" value="{{$submit}}" />
-</div>
-<div id="contact-edit-info-end"></div>
-
-
-<div id="contact-edit-profile-select-text">
-<h4>{{$lbl_vis1}}</h4>
-<p>{{$lbl_vis2}}</p>
-</div>
-{{$profile_select}}
-<div id="contact-edit-profile-select-end"></div>
-
-<input class="contact-edit-submit" type="submit" name="submit" value="{{$submit}}" />
-
-</form>
-</div>
diff --git a/view/tpl/smarty3/contact_head.tpl b/view/tpl/smarty3/contact_head.tpl
deleted file mode 100644
index 27bc286b1..000000000
--- a/view/tpl/smarty3/contact_head.tpl
+++ /dev/null
@@ -1,35 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<script language="javascript" type="text/javascript"
- src="{{$baseurl}}/library/tinymce/jscripts/tiny_mce/tiny_mce_src.js"></script>
- <script language="javascript" type="text/javascript">
-
-tinyMCE.init({
- theme : "advanced",
- mode : "{{$editselect}}",
- elements: "contact-edit-info",
- plugins : "bbcode",
- theme_advanced_buttons1 : "bold,italic,underline,undo,redo,link,unlink,image,forecolor",
- theme_advanced_buttons2 : "",
- theme_advanced_buttons3 : "",
- theme_advanced_toolbar_location : "top",
- theme_advanced_toolbar_align : "center",
- theme_advanced_styles : "blockquote,code",
- gecko_spellcheck : true,
- entity_encoding : "raw",
- add_unload_trigger : false,
- remove_linebreaks : false,
- force_p_newlines : false,
- force_br_newlines : true,
- forced_root_block : '',
- content_css: "{{$baseurl}}/view/custom_tinymce.css"
-
-
-});
-
-
-</script>
-
diff --git a/view/tpl/smarty3/contact_slider.tpl b/view/tpl/smarty3/contact_slider.tpl
deleted file mode 100644
index 80fa6f056..000000000
--- a/view/tpl/smarty3/contact_slider.tpl
+++ /dev/null
@@ -1,9 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<div id="contact-slider" class="slider" style="height: 32px; position: relative; left: 5%; width: 90%;"><input id="contact-range" type="text" name="fake-closeness" value="{{$val}}" /></div>
-<script>
- $("#contact-range").slider({ from: 0, to: 99, step: 1, scale: ['{{$me}}', '|', '{{$intimate}}', '|', '{{$friends}}', '|', '{{$oldfriends}}', '|', '{{$acquaintances}}', '|', '{{$world}}' ], onstatechange: function(v) { $("#contact-closeness-mirror").val(v); } });
-</script>
diff --git a/view/tpl/smarty3/contact_template.tpl b/view/tpl/smarty3/contact_template.tpl
deleted file mode 100644
index 496fb90ba..000000000
--- a/view/tpl/smarty3/contact_template.tpl
+++ /dev/null
@@ -1,14 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-
-<div class="contact-entry-wrapper" id="contact-entry-wrapper-{{$contact.id}}" >
- <div class="contact-entry-photo-wrapper" >
- <a href="{{$contact.url}}" title="{{$contact.img_hover}}" /><img src="{{$contact.thumb}}" alt="{{$contact.name}}" /></a>
- </div>
- <div class="contact-entry-photo-end" ></div>
- <div class="contact-entry-name" id="contact-entry-name-{{$contact.id}}" >{{$contact.name}}</div>
- <div class="contact-entry-end" ></div>
-</div>
diff --git a/view/tpl/smarty3/contacts-template.tpl b/view/tpl/smarty3/contacts-template.tpl
deleted file mode 100644
index 66f3f5c87..000000000
--- a/view/tpl/smarty3/contacts-template.tpl
+++ /dev/null
@@ -1,31 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<h1>{{$header}}{{if $total}} ({{$total}}){{/if}}</h1>
-
-{{if $finding}}<h4>{{$finding}}</h4>{{/if}}
-
-<div id="contacts-search-wrapper">
-<form id="contacts-search-form" action="{{$cmd}}" method="get" >
-<span class="contacts-search-desc">{{$desc}}</span>
-<input type="text" name="search" id="contacts-search" class="search-input" onfocus="this.select();" value="{{$search}}" />
-<input type="submit" name="submit" id="contacts-search-submit" value="{{$submit}}" />
-</form>
-</div>
-<div id="contacts-search-end"></div>
-
-{{$tabs}}
-
-
-{{foreach $contacts as $contact}}
- {{include file="contact_template.tpl"}}
-{{/foreach}}
-<div id="contact-edit-end"></div>
-
-{{$paginate}}
-
-
-
-
diff --git a/view/tpl/smarty3/content.tpl b/view/tpl/smarty3/content.tpl
deleted file mode 100644
index 811f92dd5..000000000
--- a/view/tpl/smarty3/content.tpl
+++ /dev/null
@@ -1,7 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<div id="content-begin"></div>
-<div id="content-end"></div>
diff --git a/view/tpl/smarty3/conv.tpl b/view/tpl/smarty3/conv.tpl
deleted file mode 100644
index c91ab635a..000000000
--- a/view/tpl/smarty3/conv.tpl
+++ /dev/null
@@ -1,22 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-{{foreach $threads as $thread}}
-<div id="thread-wrapper-{{$thread.id}}" class="thread-wrapper">
- {{foreach $thread.items as $item}}
- {{if $item.comment_firstcollapsed}}
- <div class="hide-comments-outer">
- <span id="hide-comments-total-{{$thread.id}}" class="hide-comments-total">{{$thread.num_comments}}</span> <span id="hide-comments-{{$thread.id}}" class="hide-comments fakelink" onclick="showHideComments({{$thread.id}});">{{$thread.hide_text}}</span>
- </div>
- <div id="collapsed-comments-{{$thread.id}}" class="collapsed-comments" style="display: none;">
- {{/if}}
- {{if $item.comment_lastcollapsed}}</div>{{/if}}
-
- {{include file="{{$item.template}}"}}
-
-
- {{/foreach}}
-</div>
-{{/foreach}}
diff --git a/view/tpl/smarty3/conv_frame.tpl b/view/tpl/smarty3/conv_frame.tpl
deleted file mode 100644
index 81d655be2..000000000
--- a/view/tpl/smarty3/conv_frame.tpl
+++ /dev/null
@@ -1,19 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<div id="threads-begin"></div>
-<div id="threads-end"></div>
-<div id="conversation-end"></div>
-
-{{if $dropping}}
-<div id="item-delete-selected" class="fakelink" onclick="deleteCheckedItems();">
- <div id="item-delete-selected-icon" class="icon drophide" title="{{$dropping}}" onmouseover="imgbright(this);" onmouseout="imgdull(this);" ></div>
- <div id="item-delete-selected-desc" >{{$dropping}}</div>
-</div>
-<div id="item-delete-selected-end"></div>
-{{/if}}
-
-<img id="page-spinner" src="images/rotator.gif" alt="{{$wait}}" title="{{$wait}}" style="display: none;" />
-
diff --git a/view/tpl/smarty3/conv_item.tpl b/view/tpl/smarty3/conv_item.tpl
deleted file mode 100644
index 37baa81bf..000000000
--- a/view/tpl/smarty3/conv_item.tpl
+++ /dev/null
@@ -1,120 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-{{if $item.comment_firstcollapsed}}
- <div class="hide-comments-outer">
- <span id="hide-comments-total-{{$item.id}}" class="hide-comments-total">{{$item.num_comments}}</span> <span id="hide-comments-{{$item.id}}" class="hide-comments fakelink" onclick="showHideComments({{$item.id}});">{{$item.hide_text}}</span>
- </div>
- <div id="collapsed-comments-{{$item.id}}" class="collapsed-comments" style="display: none;">
-{{/if}}
-<div id="thread-wrapper-{{$item.id}}" class="thread-wrapper {{$item.toplevel}}">
-<a name="{{$item.id}}" ></a>
-<div class="wall-item-outside-wrapper {{$item.indent}}{{$item.previewing}}{{if $item.owner_url}} wallwall{{/if}}" id="wall-item-outside-wrapper-{{$item.id}}" >
- <div class="wall-item-content-wrapper {{$item.indent}}" id="wall-item-content-wrapper-{{$item.id}}" >
- <div class="wall-item-info{{if $item.owner_url}} wallwall{{/if}}" id="wall-item-info-{{$item.id}}">
- {{if $item.owner_url}}
- <div class="wall-item-photo-wrapper wwto" id="wall-item-ownerphoto-wrapper-{{$item.id}}" >
- <a href="{{$item.owner_url}}" title="{{$item.olinktitle}}" class="wall-item-photo-link" id="wall-item-ownerphoto-link-{{$item.id}}">
- <img src="{{$item.owner_photo}}" class="wall-item-photo{{$item.osparkle}}" id="wall-item-ownerphoto-{{$item.id}}" style="height: 80px; width: 80px;" alt="{{$item.owner_name}}" /></a>
- </div>
- <div class="wall-item-arrowphoto-wrapper" ><img src="images/larrow.gif" alt="{{$item.wall}}" /></div>
- {{/if}}
- <div class="wall-item-photo-wrapper{{if $item.owner_url}} wwfrom{{/if}}" id="wall-item-photo-wrapper-{{$item.id}}"
- onmouseover="if (typeof t{{$item.id}} != 'undefined') clearTimeout(t{{$item.id}}); openMenu('wall-item-photo-menu-button-{{$item.id}}')"
- onmouseout="t{{$item.id}}=setTimeout('closeMenu(\'wall-item-photo-menu-button-{{$item.id}}\'); closeMenu(\'wall-item-photo-menu-{{$item.id}}\');',200)">
- <a href="{{$item.profile_url}}" title="{{$item.linktitle}}" class="wall-item-photo-link" id="wall-item-photo-link-{{$item.id}}">
- <img src="{{$item.thumb}}" class="wall-item-photo{{$item.sparkle}}" id="wall-item-photo-{{$item.id}}" style="height: 80px; width: 80px;" alt="{{$item.name}}" /></a>
- <span onclick="openClose('wall-item-photo-menu-{{$item.id}}');" class="fakelink wall-item-photo-menu-button" id="wall-item-photo-menu-button-{{$item.id}}">menu</span>
- <div class="wall-item-photo-menu" id="wall-item-photo-menu-{{$item.id}}">
- <ul>
- {{$item.item_photo_menu}}
- </ul>
- </div>
-
- </div>
- <div class="wall-item-photo-end"></div>
- <div class="wall-item-wrapper" id="wall-item-wrapper-{{$item.id}}" >
- {{if $item.lock}}<div class="wall-item-lock"><img src="images/lock_icon.gif" class="lockview" alt="{{$item.lock}}" onclick="lockview(event,{{$item.id}});" /></div>
- {{else}}<div class="wall-item-lock"></div>{{/if}}
- <div class="wall-item-location" id="wall-item-location-{{$item.id}}">{{$item.location}}</div>
- </div>
- </div>
- <div class="wall-item-author">
- <a href="{{$item.profile_url}}" title="{{$item.linktitle}}" class="wall-item-name-link"><span class="wall-item-name{{$item.sparkle}}" id="wall-item-name-{{$item.id}}" >{{$item.name}}</span></a>{{if $item.owner_url}} {{$item.to}} <a href="{{$item.owner_url}}" title="{{$item.olinktitle}}" class="wall-item-name-link"><span class="wall-item-name{{$item.osparkle}}" id="wall-item-ownername-{{$item.id}}">{{$item.owner_name}}</span></a> {{$item.vwall}}{{/if}}<br />
- <div class="wall-item-ago" id="wall-item-ago-{{$item.id}}" title="{{$item.localtime}}">{{$item.ago}}</div>
- </div>
- <div class="wall-item-content" id="wall-item-content-{{$item.id}}" >
- <div class="wall-item-title" id="wall-item-title-{{$item.id}}">{{$item.title}}</div>
- <div class="wall-item-title-end"></div>
- <div class="wall-item-body" id="wall-item-body-{{$item.id}}" >{{$item.body}}
- <div class="body-tag">
- {{foreach $item.tags as $tag}}
- <span class='tag'>{{$tag}}</span>
- {{/foreach}}
- </div>
- {{if $item.has_cats}}
- <div class="categorytags"><span>{{$item.txt_cats}} {{foreach $item.categories as $cat}}{{$cat.name}} <a href="{{$cat.removeurl}}" title="{{$remove}}">[{{$remove}}]</a> {{if $cat.last}}{{else}}, {{/if}}{{/foreach}}
- </div>
- {{/if}}
-
- {{if $item.has_folders}}
- <div class="filesavetags"><span>{{$item.txt_folders}} {{foreach $item.folders as $cat}}{{$cat.name}} <a href="{{$cat.removeurl}}" title="{{$remove}}">[{{$remove}}]</a> {{if $cat.last}}{{else}}, {{/if}}{{/foreach}}
- </div>
- {{/if}}
- </div>
- </div>
- <div class="wall-item-tools" id="wall-item-tools-{{$item.id}}">
- {{if $item.like}}
- <a href="#" class="icon like item-tool" title="{{$item.like.0}}" onclick="dolike({{$item.id}},'like'); return false"></a>
- {{/if}}
- {{if $item.dislike}}
- <a href="#" class="icon dislike item-tool" title="{{$item.dislike.0}}" onclick="dolike({{$item.id}},'dislike'); return false"></a>
- {{/if}}
- {{if $item.share}}
- <a href="#" class="icon recycle item-tool" title="{{$item.share.0}}" onclick="jotShare({{$item.id}}); return false"></a>
- {{/if}}
- {{if $item.plink}}
- <a href="{{$item.plink.href}}" title="{{$item.plink.title}}" target="external-link" class="icon item-tool remote-link{{$item.sparkle}}"></a>
- {{/if}}
- {{if $item.edpost}}
- <a class="editpost icon pencil item-tool" href="{{$item.edpost.0}}" title="{{$item.edpost.1}}"></a>
- {{/if}}
- {{if $item.star}}
- <a href="#" id="starred-{{$item.id}}" onclick="dostar({{$item.id}}); return false;" class="star-item icon item-tool {{$item.star.isstarred}}" title="{{$item.star.toggle}}"></a>
- {{/if}}
- {{if $item.tagger}}
- <a href="#" id="tagger-{{$item.id}}" onclick="itemTag({{$item.id}}); return false;" class="tag-item icon item-tool tagged" title="{{$item.tagger.tagit}}"></a>
- {{/if}}
- {{if $item.filer}}
- <a href="#" id="filer-{{$item.id}}" onclick="itemFiler({{$item.id}}); return false;" class="filer-item filer-icon item-tool" title="{{$item.filer}}"></a>
- {{/if}}
- <img id="like-rotator-{{$item.id}}" class="like-rotator" src="images/rotator.gif" alt="{{$item.wait}}" title="{{$item.wait}}" style="display: none;" />
-
- <div class="wall-item-delete-wrapper" id="wall-item-delete-wrapper-{{$item.id}}" >
- {{if $item.drop.dropping}}<a href="item/drop/{{$item.id}}" onclick="return confirmDelete();" class="icon drophide" title="{{$item.drop.delete}}" onmouseover="imgbright(this);" onmouseout="imgdull(this);" ></a>{{/if}}
- </div>
- {{if $item.drop.pagedrop}}<input type="checkbox" onclick="checkboxhighlight(this);" title="{{$item.drop.select}}" class="item-select" name="itemselected[]" value="{{$item.id}}" />{{/if}}
- <div class="wall-item-delete-end"></div>
- </div>
- </div>
- <div class="wall-item-wrapper-end"></div>
- <div class="wall-item-like {{$item.indent}}" id="wall-item-like-{{$item.id}}">{{$item.showlike}}</div>
- <div class="wall-item-dislike {{$item.indent}}" id="wall-item-dislike-{{$item.id}}">{{$item.showdislike}}</div>
-
-<div class="wall-item-outside-wrapper-end {{$item.indent}}" ></div>
-</div>
-{{if $item.toplevel}}
-{{foreach $item.children as $child}}
- {{include file="{{$child.template}}" item=$child}}
-{{/foreach}}
-{{/if}}
-
-<div class="wall-item-comment-wrapper" >
- {{$item.comment}}
-</div>
-
-
-</div>
-{{if $item.comment_lastcollapsed}}</div>{{/if}}
diff --git a/view/tpl/smarty3/conversation.tpl b/view/tpl/smarty3/conversation.tpl
deleted file mode 100644
index 837fbc11f..000000000
--- a/view/tpl/smarty3/conversation.tpl
+++ /dev/null
@@ -1,33 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<div id="threads-begin"></div>
-{{foreach $threads as $thread}}
-<div id="thread-wrapper-{{$thread.id}}" class="thread-wrapper">
- {{foreach $thread.items as $item}}
- {{if $item.comment_firstcollapsed}}
- <div class="hide-comments-outer">
- <span id="hide-comments-total-{{$thread.id}}" class="hide-comments-total">{{$thread.num_comments}}</span> <span id="hide-comments-{{$thread.id}}" class="hide-comments fakelink" onclick="showHideComments({{$thread.id}});">{{$thread.hide_text}}</span>
- </div>
- <div id="collapsed-comments-{{$thread.id}}" class="collapsed-comments" style="display: none;">
- {{/if}}
- {{if $item.comment_lastcollapsed}}</div>{{/if}}
-
- {{include file="{{$item.template}}"}}
-
-
- {{/foreach}}
-</div>
-{{/foreach}}
-<div id="threads-end"></div>
-<div id="conversation-end"></div>
-
-{{if $dropping}}
-<div id="item-delete-selected" class="fakelink" onclick="deleteCheckedItems();">
- <div id="item-delete-selected-icon" class="icon drophide" title="{{$dropping}}" onmouseover="imgbright(this);" onmouseout="imgdull(this);" ></div>
- <div id="item-delete-selected-desc" >{{$dropping}}</div>
-</div>
-<div id="item-delete-selected-end"></div>
-{{/if}}
diff --git a/view/tpl/smarty3/convobj.tpl b/view/tpl/smarty3/convobj.tpl
deleted file mode 100644
index 2a714c100..000000000
--- a/view/tpl/smarty3/convobj.tpl
+++ /dev/null
@@ -1,9 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-{{foreach $threads as $item}}
-{{include file="{{$item.template}}"}}
-{{/foreach}}
-
diff --git a/view/tpl/smarty3/crepair.tpl b/view/tpl/smarty3/crepair.tpl
deleted file mode 100644
index 8d3ed7df8..000000000
--- a/view/tpl/smarty3/crepair.tpl
+++ /dev/null
@@ -1,51 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-
-<form id="crepair-form" action="crepair/{{$contact_id}}" method="post" >
-
-<h4>{{$contact_name}}</h4>
-
-<label id="crepair-name-label" class="crepair-label" for="crepair-name">{{$label_name}}</label>
-<input type="text" id="crepair-name" class="crepair-input" name="name" value="{{$contact_name}}" />
-<div class="clear"></div>
-
-<label id="crepair-nick-label" class="crepair-label" for="crepair-nick">{{$label_nick}}</label>
-<input type="text" id="crepair-nick" class="crepair-input" name="nick" value="{{$contact_nick}}" />
-<div class="clear"></div>
-
-<label id="crepair-attag-label" class="crepair-label" for="crepair-attag">{{$label_attag}}</label>
-<input type="text" id="crepair-attag" class="crepair-input" name="attag" value="{{$contact_attag}}" />
-<div class="clear"></div>
-
-<label id="crepair-url-label" class="crepair-label" for="crepair-url">{{$label_url}}</label>
-<input type="text" id="crepair-url" class="crepair-input" name="url" value="{{$contact_url}}" />
-<div class="clear"></div>
-
-<label id="crepair-request-label" class="crepair-label" for="crepair-request">{{$label_request}}</label>
-<input type="text" id="crepair-request" class="crepair-input" name="request" value="{{$request}}" />
-<div class="clear"></div>
-
-<label id="crepair-confirm-label" class="crepair-label" for="crepair-confirm">{{$label_confirm}}</label>
-<input type="text" id="crepair-confirm" class="crepair-input" name="confirm" value="{{$confirm}}" />
-<div class="clear"></div>
-
-<label id="crepair-notify-label" class="crepair-label" for="crepair-notify">{{$label_notify}}</label>
-<input type="text" id="crepair-notify" class="crepair-input" name="notify" value="{{$notify}}" />
-<div class="clear"></div>
-
-<label id="crepair-poll-label" class="crepair-label" for="crepair-poll">{{$label_poll}}</label>
-<input type="text" id="crepair-poll" class="crepair-input" name="poll" value="{{$poll}}" />
-<div class="clear"></div>
-
-<label id="crepair-photo-label" class="crepair-label" for="crepair-photo">{{$label_photo}}</label>
-<input type="text" id="crepair-photo" class="crepair-input" name="photo" value="" />
-<div class="clear"></div>
-
-<input type="submit" name="submit" value="{{$lbl_submit}}" />
-
-</form>
-
-
diff --git a/view/tpl/smarty3/cropbody.tpl b/view/tpl/smarty3/cropbody.tpl
deleted file mode 100644
index e6fcd355f..000000000
--- a/view/tpl/smarty3/cropbody.tpl
+++ /dev/null
@@ -1,63 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<h1>{{$title}}</h1>
-<p id="cropimage-desc">
-{{$desc}}
-</p>
-<div id="cropimage-wrapper">
-<img src="{{$image_url}}" id="croppa" class="imgCrop" alt="{{$title}}" />
-</div>
-<div id="cropimage-preview-wrapper" >
-<div id="previewWrap" ></div>
-</div>
-
-<script type="text/javascript" language="javascript">
-
- function onEndCrop( coords, dimensions ) {
- $( 'x1' ).value = coords.x1;
- $( 'y1' ).value = coords.y1;
- $( 'x2' ).value = coords.x2;
- $( 'y2' ).value = coords.y2;
- $( 'width' ).value = dimensions.width;
- $( 'height' ).value = dimensions.height;
- }
-
- Event.observe( window, 'load', function() {
- new Cropper.ImgWithPreview(
- 'croppa',
- {
- previewWrap: 'previewWrap',
- minWidth: 175,
- minHeight: 175,
- maxWidth: 640,
- maxHeight: 640,
- ratioDim: { x: 100, y:100 },
- displayOnInit: true,
- onEndCrop: onEndCrop
- }
- );
- }
- );
-
-</script>
-
-<form action="profile_photo/{{$resource}}" id="crop-image-form" method="post" />
-<input type='hidden' name='form_security_token' value='{{$form_security_token}}'>
-
-<input type='hidden' name='profile' value='{{$profile}}'>
-<input type="hidden" name="cropfinal" value="1" />
-<input type="hidden" name="xstart" id="x1" />
-<input type="hidden" name="ystart" id="y1" />
-<input type="hidden" name="xfinal" id="x2" />
-<input type="hidden" name="yfinal" id="y2" />
-<input type="hidden" name="height" id="height" />
-<input type="hidden" name="width" id="width" />
-
-<div id="crop-image-submit-wrapper" >
-<input type="submit" name="submit" value="{{$done}}" />
-</div>
-
-</form>
diff --git a/view/tpl/smarty3/crophead.tpl b/view/tpl/smarty3/crophead.tpl
deleted file mode 100644
index d51b87d12..000000000
--- a/view/tpl/smarty3/crophead.tpl
+++ /dev/null
@@ -1,9 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
- <script type="text/javascript" src="library/cropper/lib/prototype.js" language="javascript"></script>
- <script type="text/javascript" src="library/cropper/lib/scriptaculous.js?load=effects,builder,dragdrop" language="javascript"></script>
- <script type="text/javascript" src="library/cropper/cropper.js" language="javascript"></script>
- <link rel="stylesheet" href="library/cropper/cropper.css" type="text/css" />
diff --git a/view/tpl/smarty3/delegate.tpl b/view/tpl/smarty3/delegate.tpl
deleted file mode 100644
index 7aa85cf39..000000000
--- a/view/tpl/smarty3/delegate.tpl
+++ /dev/null
@@ -1,62 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<h3>{{$header}}</h3>
-
-<div id="delegate-desc" class="delegate-desc">{{$desc}}</div>
-
-{{if $managers}}
-<h3>{{$head_managers}}</h3>
-
-{{foreach $managers as $x}}
-
-<div class="contact-block-div">
-<a class="contact-block-link" href="#" >
-<img class="contact-block-img" src="{{$base}}/photo/thumb/{{$x.uid}}" title="{{$x.username}} ({{$x.nickname}})" />
-</a>
-</div>
-
-{{/foreach}}
-<div class="clear"></div>
-<hr />
-{{/if}}
-
-
-<h3>{{$head_delegates}}</h3>
-
-{{if $delegates}}
-{{foreach $delegates as $x}}
-
-<div class="contact-block-div">
-<a class="contact-block-link" href="{{$base}}/delegate/remove/{{$x.uid}}" >
-<img class="contact-block-img" src="{{$base}}/photo/thumb/{{$x.uid}}" title="{{$x.username}} ({{$x.nickname}})" />
-</a>
-</div>
-
-{{/foreach}}
-<div class="clear"></div>
-{{else}}
-{{$none}}
-{{/if}}
-<hr />
-
-
-<h3>{{$head_potentials}}</h3>
-{{if $potentials}}
-{{foreach $potentials as $x}}
-
-<div class="contact-block-div">
-<a class="contact-block-link" href="{{$base}}/delegate/add/{{$x.uid}}" >
-<img class="contact-block-img" src="{{$base}}/photo/thumb/{{$x.uid}}" title="{{$x.username}} ({{$x.nickname}})" />
-</a>
-</div>
-
-{{/foreach}}
-<div class="clear"></div>
-{{else}}
-{{$none}}
-{{/if}}
-<hr />
-
diff --git a/view/tpl/smarty3/dfrn_req_confirm.tpl b/view/tpl/smarty3/dfrn_req_confirm.tpl
deleted file mode 100644
index c941a201d..000000000
--- a/view/tpl/smarty3/dfrn_req_confirm.tpl
+++ /dev/null
@@ -1,26 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-
-<p id="dfrn-request-homecoming" >
-{{$welcome}}
-<br />
-{{$please}}
-
-</p>
-<form id="dfrn-request-homecoming-form" action="dfrn_request/{{$nickname}}" method="post">
-<input type="hidden" name="dfrn_url" value="{{$dfrn_url}}" />
-<input type="hidden" name="confirm_key" value="{{$confirm_key}}" />
-<input type="hidden" name="localconfirm" value="1" />
-{{$aes_allow}}
-
-<label id="dfrn-request-homecoming-hide-label" for="dfrn-request-homecoming-hide">{{$hidethem}}</label>
-<input type="checkbox" name="hidden-contact" value="1" {{if $hidechecked}}checked="checked" {{/if}} />
-
-
-<div id="dfrn-request-homecoming-submit-wrapper" >
-<input id="dfrn-request-homecoming-submit" type="submit" name="submit" value="{{$submit}}" />
-</div>
-</form> \ No newline at end of file
diff --git a/view/tpl/smarty3/dfrn_request.tpl b/view/tpl/smarty3/dfrn_request.tpl
deleted file mode 100644
index b08a0b731..000000000
--- a/view/tpl/smarty3/dfrn_request.tpl
+++ /dev/null
@@ -1,64 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-
-<h1>{{$header}}</h1>
-
-<p id="dfrn-request-intro">
-{{$page_desc}}<br />
-{{$invite_desc}}
-</p>
-<p>
-{{$desc}}
-</p>
-
-<form action="dfrn_request/{{$nickname}}" method="post" />
-
-<div id="dfrn-request-url-wrapper" >
- <label id="dfrn-url-label" for="dfrn-url" >{{$your_address}}</label>
- <input type="text" name="dfrn_url" id="dfrn-url" size="32" value="{{$myaddr}}" />
- <div id="dfrn-request-url-end"></div>
-</div>
-
-<p id="dfrn-request-options">
-{{$pls_answer}}
-</p>
-
-<div id="dfrn-request-info-wrapper" >
-
-
-<p id="doiknowyou">
-{{$does_know}}
-</p>
-
- <div id="dfrn-request-know-yes-wrapper">
- <label id="dfrn-request-knowyou-yes-label" for="dfrn-request-knowyouyes">{{$yes}}</label>
- <input type="radio" name="knowyou" id="knowyouyes" value="1" />
-
- <div id="dfrn-request-knowyou-break" ></div>
- </div>
- <div id="dfrn-request-know-no-wrapper">
- <label id="dfrn-request-knowyou-no-label" for="dfrn-request-knowyouno">{{$no}}</label>
- <input type="radio" name="knowyou" id="knowyouno" value="0" checked="checked" />
-
- <div id="dfrn-request-knowyou-end"></div>
- </div>
-
-
-<p id="dfrn-request-message-desc">
-{{$add_note}}
-</p>
- <div id="dfrn-request-message-wrapper">
- <textarea name="dfrn-request-message" rows="4" cols="64" ></textarea>
- </div>
-
-
-</div>
-
- <div id="dfrn-request-submit-wrapper">
- <input type="submit" name="submit" id="dfrn-request-submit-button" value="{{$submit}}" />
- <input type="submit" name="cancel" id="dfrn-request-cancel-button" value="{{$cancel}}" />
- </div>
-</form>
diff --git a/view/tpl/smarty3/diasp_dec_hdr.tpl b/view/tpl/smarty3/diasp_dec_hdr.tpl
deleted file mode 100644
index c3305ecd0..000000000
--- a/view/tpl/smarty3/diasp_dec_hdr.tpl
+++ /dev/null
@@ -1,13 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<decrypted_hdeader>
- <iv>{{$inner_iv}}</iv>
- <aes_key>{{$inner_key}}</aes_key>
- <author>
- <name>{{$author_name}}</name>
- <uri>{{$author_uri}}</uri>
- </author>
-</decrypted_header>
diff --git a/view/tpl/smarty3/directory_header.tpl b/view/tpl/smarty3/directory_header.tpl
deleted file mode 100644
index 293e65be2..000000000
--- a/view/tpl/smarty3/directory_header.tpl
+++ /dev/null
@@ -1,21 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<h1>{{$dirlbl}}</h1>
-
-{{if $search}}
-<h4>{{$finddsc}} {{$safetxt}}</h4>
-{{/if}}
-
-{{foreach $entries as $entry}}
-
-{{include file="direntry.tpl"}}
-
-{{/foreach}}
-
-
-
-<div class="directory-end"></div>
-
diff --git a/view/tpl/smarty3/directory_item.tpl b/view/tpl/smarty3/directory_item.tpl
deleted file mode 100644
index ae52646b8..000000000
--- a/view/tpl/smarty3/directory_item.tpl
+++ /dev/null
@@ -1,16 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-
-<div class="directory-item lframe" id="directory-item-{{$id}}" >
- <div class="contact-photo-wrapper" id="directory-photo-wrapper-{{$id}}" >
- <div class="contact-photo" id="directory-photo-{{$id}}" >
- <a href="{{$profile_link}}" class="directory-profile-link" id="directory-profile-link-{{$id}}" ><img class="directory-photo-img" src="{{$photo}}" alt="{{$alt_text}}" title="{{$alt_text}}" /></a>
- </div>
- </div>
-
- <div class="contact-name" id="directory-name-{{$id}}">{{$name}}</div>
- <div class="contact-details">{{$details}}</div>
-</div>
diff --git a/view/tpl/smarty3/direntry.tpl b/view/tpl/smarty3/direntry.tpl
deleted file mode 100644
index c1009efc7..000000000
--- a/view/tpl/smarty3/direntry.tpl
+++ /dev/null
@@ -1,16 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-
-<div class="directory-item lframe" id="directory-item-{{$entry.id}}" >
- <div class="contact-photo-wrapper" id="directory-photo-wrapper-{{$entry.id}}" >
- <div class="contact-photo" id="directory-photo-{{$entry.id}}" >
- <a href="{{$entry.profile_link}}" class="directory-profile-link" id="directory-profile-link-{{$entry.id}}" ><img class="directory-photo-img" src="{{$entry.photo}}" alt="{{$entry.alttext}}" title="{{$entry.alttext}}" /></a>
- </div>
- </div>
-
- <div class="contact-name" id="directory-name-{{$entry.id}}">{{$entry.name}}</div>
- <div class="contact-details">{{$entry.details}}</div>
-</div>
diff --git a/view/tpl/smarty3/display-head.tpl b/view/tpl/smarty3/display-head.tpl
deleted file mode 100644
index 7750b655e..000000000
--- a/view/tpl/smarty3/display-head.tpl
+++ /dev/null
@@ -1,13 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<script>
-$(document).ready(function() {
- $(".comment-edit-wrapper textarea").contact_autocomplete(baseurl+"/acl");
- // make auto-complete work in more places
- $(".wall-item-comment-wrapper textarea").contact_autocomplete(baseurl+"/acl");
-});
-</script>
-
diff --git a/view/tpl/smarty3/edpost_head.tpl b/view/tpl/smarty3/edpost_head.tpl
deleted file mode 100644
index 2bf28002d..000000000
--- a/view/tpl/smarty3/edpost_head.tpl
+++ /dev/null
@@ -1,6 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<h2>{{$title}}</h2>
diff --git a/view/tpl/smarty3/email_notify_html.tpl b/view/tpl/smarty3/email_notify_html.tpl
deleted file mode 100644
index 47b476688..000000000
--- a/view/tpl/smarty3/email_notify_html.tpl
+++ /dev/null
@@ -1,32 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional //EN">
-<html>
-<head>
- <title>{{$banner}}</title>
- <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
-</head>
-<body>
-<table style="border:1px solid #ccc">
- <tbody>
- <tr><td colspan="2" style="background:#ff0000; color:#FFFFFF; font-weight:bold; font-family:'lucida grande', tahoma, verdana,arial, sans-serif; padding: 4px 8px; vertical-align: middle; font-size:16px; letter-spacing: -0.03em; text-align: left;"><img style="width:32px;height:32px; float:left;" src='{{$siteurl}}/images/fred-32.png'><div style="padding:7px; margin-left: 5px; float:left; font-size:18px;letter-spacing:1px;">{{$product}}</div><div style="clear: both;"></div></td></tr>
-
-
- <tr><td style="padding-top:22px;" colspan="2">{{$preamble}}</td></tr>
-
-
- <tr><td style="padding-left:22px;padding-top:22px;width:60px;" valign="top" rowspan=3><a href="{{$source_link}}"><img style="border:0px;width:48px;height:48px;" src="{{$source_photo}}"></a></td>
- <td style="padding-top:22px;"><a href="{{$source_link}}">{{$source_name}}</a></td></tr>
- <tr><td style="font-weight:bold;padding-bottom:5px;">{{$title}}</td></tr>
- <tr><td style="padding-right:22px;">{{$htmlversion}}</td></tr>
- <tr><td style="padding-top:11px;" colspan="2">{{$hsitelink}}</td></tr>
- <tr><td style="padding-bottom:11px;" colspan="2">{{$hitemlink}}</td></tr>
- <tr><td></td><td>{{$thanks}}</td></tr>
- <tr><td></td><td>{{$site_admin}}</td></tr>
- </tbody>
-</table>
-</body>
-</html>
diff --git a/view/tpl/smarty3/email_notify_text.tpl b/view/tpl/smarty3/email_notify_text.tpl
deleted file mode 100644
index e164f3023..000000000
--- a/view/tpl/smarty3/email_notify_text.tpl
+++ /dev/null
@@ -1,18 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-
-{{$preamble}}
-
-{{$title}}
-
-{{$textversion}}
-
-{{$tsitelink}}
-{{$titemlink}}
-
-{{$thanks}}
-{{$site_admin}}
-
diff --git a/view/tpl/smarty3/event.tpl b/view/tpl/smarty3/event.tpl
deleted file mode 100644
index 1ba472377..000000000
--- a/view/tpl/smarty3/event.tpl
+++ /dev/null
@@ -1,15 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-{{foreach $events as $event}}
- <div class="event">
-
- {{if $event.item.author-name}}<a href="{{$event.item.author-link}}" ><img src="{{$event.item.author-avatar}}" height="32" width="32" />{{$event.item.author-name}}</a>{{/if}}
- {{$event.html}}
- {{if $event.item.plink}}<a href="{{$event.plink.0}}" title="{{$event.plink.1}}" class="plink-event-link icon s22 remote-link"></a>{{/if}}
- {{if $event.edit}}<a href="{{$event.edit.0}}" title="{{$event.edit.1}}" class="edit-event-link icon s22 pencil"></a>{{/if}}
- </div>
- <div class="clear"></div>
-{{/foreach}}
diff --git a/view/tpl/smarty3/event_form.tpl b/view/tpl/smarty3/event_form.tpl
deleted file mode 100644
index 335a9480b..000000000
--- a/view/tpl/smarty3/event_form.tpl
+++ /dev/null
@@ -1,54 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<h3>{{$title}}</h3>
-
-<p>
-{{$desc}}
-</p>
-
-<form action="{{$post}}" method="post" >
-
-<input type="hidden" name="event_id" value="{{$eid}}" />
-<input type="hidden" name="cid" value="{{$cid}}" />
-<input type="hidden" name="uri" value="{{$uri}}" />
-
-<div id="event-start-text">{{$s_text}}</div>
-{{$s_dsel}} {{$s_tsel}}
-
-<div id="event-finish-text">{{$f_text}}</div>
-{{$f_dsel}} {{$f_tsel}}
-
-<div id="event-datetime-break"></div>
-
-<input type="checkbox" name="nofinish" value="1" id="event-nofinish-checkbox" {{$n_checked}} /> <div id="event-nofinish-text">{{$n_text}}</div>
-
-<div id="event-nofinish-break"></div>
-
-<input type="checkbox" name="adjust" value="1" id="event-adjust-checkbox" {{$a_checked}} /> <div id="event-adjust-text">{{$a_text}}</div>
-
-<div id="event-adjust-break"></div>
-
-<div id="event-summary-text">{{$t_text}}</div>
-<input type="text" id="event-summary" name="summary" value="{{$t_orig}}" />
-
-
-<div id="event-desc-text">{{$d_text}}</div>
-<textarea id="event-desc-textarea" name="desc">{{$d_orig}}</textarea>
-
-
-<div id="event-location-text">{{$l_text}}</div>
-<textarea id="event-location-textarea" name="location">{{$l_orig}}</textarea>
-
-<input type="checkbox" name="share" value="1" id="event-share-checkbox" {{$sh_checked}} /> <div id="event-share-text">{{$sh_text}}</div>
-<div id="event-share-break"></div>
-
-{{$acl}}
-
-<div class="clear"></div>
-<input id="event-submit" type="submit" name="submit" value="{{$submit}}" />
-</form>
-
-
diff --git a/view/tpl/smarty3/event_head.tpl b/view/tpl/smarty3/event_head.tpl
deleted file mode 100644
index 32288b7ad..000000000
--- a/view/tpl/smarty3/event_head.tpl
+++ /dev/null
@@ -1,144 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<link rel='stylesheet' type='text/css' href='{{$baseurl}}/library/fullcalendar/fullcalendar.css' />
-<script language="javascript" type="text/javascript"
- src="{{$baseurl}}/library/fullcalendar/fullcalendar.min.js"></script>
-
-<script>
- function showEvent(eventid) {
- $.get(
- '{{$baseurl}}/events/?id='+eventid,
- function(data){
- $.fancybox(data);
- }
- );
- }
-
- $(document).ready(function() {
- $('#events-calendar').fullCalendar({
- events: '{{$baseurl}}/events/json/',
- header: {
- left: 'prev,next today',
- center: 'title',
- right: 'month,agendaWeek,agendaDay'
- },
- timeFormat: 'H(:mm)',
- eventClick: function(calEvent, jsEvent, view) {
- showEvent(calEvent.id);
- },
-
- eventRender: function(event, element, view) {
- //console.log(view.name);
- if (event.item['author-name']==null) return;
- switch(view.name){
- case "month":
- element.find(".fc-event-title").html(
- "<img src='{0}' style='height:10px;width:10px'>{1} : {2}".format(
- event.item['author-avatar'],
- event.item['author-name'],
- event.title
- ));
- break;
- case "agendaWeek":
- element.find(".fc-event-title").html(
- "<img src='{0}' style='height:12px; width:12px'>{1}<p>{2}</p><p>{3}</p>".format(
- event.item['author-avatar'],
- event.item['author-name'],
- event.item.desc,
- event.item.location
- ));
- break;
- case "agendaDay":
- element.find(".fc-event-title").html(
- "<img src='{0}' style='height:24px;width:24px'>{1}<p>{2}</p><p>{3}</p>".format(
- event.item['author-avatar'],
- event.item['author-name'],
- event.item.desc,
- event.item.location
- ));
- break;
- }
- }
-
- })
-
- // center on date
- var args=location.href.replace(baseurl,"").split("/");
- if (args.length>=4) {
- $("#events-calendar").fullCalendar('gotoDate',args[2] , args[3]-1);
- }
-
- // show event popup
- var hash = location.hash.split("-")
- if (hash.length==2 && hash[0]=="#link") showEvent(hash[1]);
-
- });
-</script>
-
-
-<script language="javascript" type="text/javascript"
- src="{{$baseurl}}/library/tinymce/jscripts/tiny_mce/tiny_mce_src.js"></script>
-<script language="javascript" type="text/javascript">
-
-
- tinyMCE.init({
- theme : "advanced",
- mode : "textareas",
- plugins : "bbcode,paste",
- theme_advanced_buttons1 : "bold,italic,underline,undo,redo,link,unlink,image,forecolor,formatselect,code",
- theme_advanced_buttons2 : "",
- theme_advanced_buttons3 : "",
- theme_advanced_toolbar_location : "top",
- theme_advanced_toolbar_align : "center",
- theme_advanced_blockformats : "blockquote,code",
- gecko_spellcheck : true,
- paste_text_sticky : true,
- entity_encoding : "raw",
- add_unload_trigger : false,
- remove_linebreaks : false,
- force_p_newlines : false,
- force_br_newlines : true,
- forced_root_block : '',
- content_css: "{{$baseurl}}/view/custom_tinymce.css",
- theme_advanced_path : false,
- setup : function(ed) {
- ed.onInit.add(function(ed) {
- ed.pasteAsPlainText = true;
- });
- }
-
- });
-
-
- $(document).ready(function() {
-
- $('#event-share-checkbox').change(function() {
-
- if ($('#event-share-checkbox').is(':checked')) {
- $('#acl-wrapper').show();
- }
- else {
- $('#acl-wrapper').hide();
- }
- }).trigger('change');
-
-
- $('#contact_allow, #contact_deny, #group_allow, #group_deny').change(function() {
- var selstr;
- $('#contact_allow option:selected, #contact_deny option:selected, #group_allow option:selected, #group_deny option:selected').each( function() {
- selstr = $(this).text();
- $('#jot-public').hide();
- });
- if(selstr == null) {
- $('#jot-public').show();
- }
-
- }).trigger('change');
-
- });
-
-</script>
-
diff --git a/view/tpl/smarty3/events-js.tpl b/view/tpl/smarty3/events-js.tpl
deleted file mode 100644
index 5fa046f5a..000000000
--- a/view/tpl/smarty3/events-js.tpl
+++ /dev/null
@@ -1,11 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-{{$tabs}}
-<h2>{{$title}}</h2>
-
-<div id="new-event-link"><a href="{{$new_event.0}}" >{{$new_event.1}}</a></div>
-
-<div id="events-calendar"></div>
diff --git a/view/tpl/smarty3/events.tpl b/view/tpl/smarty3/events.tpl
deleted file mode 100644
index 45366a77d..000000000
--- a/view/tpl/smarty3/events.tpl
+++ /dev/null
@@ -1,29 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-{{$tabs}}
-<h2>{{$title}}</h2>
-
-<div id="new-event-link"><a href="{{$new_event.0}}" >{{$new_event.1}}</a></div>
-
-<div id="event-calendar-wrapper">
- <a href="{{$previus.0}}" class="prevcal {{$previus.2}}"><div id="event-calendar-prev" class="icon s22 prev" title="{{$previus.1}}"></div></a>
- {{$calendar}}
- <a href="{{$next.0}}" class="nextcal {{$next.2}}"><div id="event-calendar-prev" class="icon s22 next" title="{{$next.1}}"></div></a>
-</div>
-<div class="event-calendar-end"></div>
-
-
-{{foreach $events as $event}}
- <div class="event">
- {{if $event.is_first}}<hr /><a name="link-{{$event.j}}" ><div class="event-list-date">{{$event.d}}</div></a>{{/if}}
- {{if $event.item.author-name}}<a href="{{$event.item.author-link}}" ><img src="{{$event.item.author-avatar}}" height="32" width="32" />{{$event.item.author-name}}</a>{{/if}}
- {{$event.html}}
- {{if $event.item.plink}}<a href="{{$event.plink.0}}" title="{{$event.plink.1}}" class="plink-event-link icon s22 remote-link"></a>{{/if}}
- {{if $event.edit}}<a href="{{$event.edit.0}}" title="{{$event.edit.1}}" class="edit-event-link icon s22 pencil"></a>{{/if}}
- </div>
- <div class="clear"></div>
-
-{{/foreach}}
diff --git a/view/tpl/smarty3/events_reminder.tpl b/view/tpl/smarty3/events_reminder.tpl
deleted file mode 100644
index d8e8ceb2a..000000000
--- a/view/tpl/smarty3/events_reminder.tpl
+++ /dev/null
@@ -1,15 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-{{if $count}}
-<div id="event-notice" class="birthday-notice fakelink {{$classtoday}}" onclick="openClose('event-wrapper');">{{$event_reminders}} ({{$count}})</div>
-<div id="event-wrapper" style="display: none;" ><div id="event-title">{{$event_title}}</div>
-<div id="event-title-end"></div>
-{{foreach $events as $event}}
-<div class="event-list" id="event-{{$event.id}}"></a> <a href="events/{{$event.link}}">{{$event.title}}</a> {{$event.date}} </div>
-{{/foreach}}
-</div>
-{{/if}}
-
diff --git a/view/tpl/smarty3/failed_updates.tpl b/view/tpl/smarty3/failed_updates.tpl
deleted file mode 100644
index 8161ff2ef..000000000
--- a/view/tpl/smarty3/failed_updates.tpl
+++ /dev/null
@@ -1,22 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<h2>{{$banner}}</h2>
-
-<div id="failed_updates_desc">{{$desc}}</div>
-
-{{if $failed}}
-{{foreach $failed as $f}}
-
-<h4>{{$f}}</h4>
-<ul>
-<li><a href="{{$base}}/admin/dbsync/mark/{{$f}}">{{$mark}}</a></li>
-<li><a href="{{$base}}/admin/dbsync/{{$f}}">{{$apply}}</a></li>
-</ul>
-
-<hr />
-{{/foreach}}
-{{/if}}
-
diff --git a/view/tpl/smarty3/fake_feed.tpl b/view/tpl/smarty3/fake_feed.tpl
deleted file mode 100644
index fd875de71..000000000
--- a/view/tpl/smarty3/fake_feed.tpl
+++ /dev/null
@@ -1,18 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<?xml version="1.0" encoding="utf-8" ?>
-<feed xmlns="http://www.w3.org/2005/Atom" >
-
- <id>fake feed</id>
- <title>fake title</title>
-
- <updated>1970-01-01T00:00:00Z</updated>
-
- <author>
- <name>Fake Name</name>
- <uri>http://example.com</uri>
- </author>
-
diff --git a/view/tpl/smarty3/field.tpl b/view/tpl/smarty3/field.tpl
deleted file mode 100644
index 1bf36d84e..000000000
--- a/view/tpl/smarty3/field.tpl
+++ /dev/null
@@ -1,9 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-
- {{if $field.0==select}}
- {{include file="field_select.tpl"}}
- {{/if}}
diff --git a/view/tpl/smarty3/field_acheckbox.tpl b/view/tpl/smarty3/field_acheckbox.tpl
deleted file mode 100644
index da0d44ea6..000000000
--- a/view/tpl/smarty3/field_acheckbox.tpl
+++ /dev/null
@@ -1,12 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-
- <div class='field acheckbox'>
- <label for='id_{{$field.0}}'>{{$field.1}}</label>
- <input type="checkbox" class="abook-edit-them" name='{{$field.0}}' id='them_id_{{$field.0}}' value="1" disabled="disabled" {{if $field.2}}checked="checked"{{/if}} />
- <input type="checkbox" class="abook-edit-me" name='{{$field.0}}' id='me_id_{{$field.0}}' value="{{$field.4}}" {{if $field.3}}checked="checked"{{/if}} {{if $field.5}} disabled="disabled" {{/if}}/>
- <span class='field_abook_help'>{{$field.6}}</span>
- </div>
diff --git a/view/tpl/smarty3/field_checkbox.tpl b/view/tpl/smarty3/field_checkbox.tpl
deleted file mode 100644
index a4ec3dbba..000000000
--- a/view/tpl/smarty3/field_checkbox.tpl
+++ /dev/null
@@ -1,11 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-
- <div class='field checkbox'>
- <label for='id_{{$field.0}}'>{{$field.1}}</label>
- <input type="checkbox" name='{{$field.0}}' id='id_{{$field.0}}' value="1" {{if $field.2}}checked="checked"{{/if}}>
- <span class='field_help'>{{$field.3}}</span>
- </div>
diff --git a/view/tpl/smarty3/field_combobox.tpl b/view/tpl/smarty3/field_combobox.tpl
deleted file mode 100644
index d3cc75635..000000000
--- a/view/tpl/smarty3/field_combobox.tpl
+++ /dev/null
@@ -1,23 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-
- <div class='field combobox'>
- <label for='id_{{$field.0}}' id='id_{{$field.0}}_label'>{{$field.1}}</label>
- {{* html5 don't work on Chrome, Safari and IE9
- <input id="id_{{$field.0}}" type="text" list="data_{{$field.0}}" >
- <datalist id="data_{{$field.0}}" >
- {{foreach $field.4 as $opt=>$val}}<option value="{{$val}}">{{/foreach}}
- </datalist> *}}
-
- <input id="id_{{$field.0}}" type="text" value="{{$field.2}}">
- <select id="select_{{$field.0}}" onChange="$('#id_{{$field.0}}').val($(this).val())">
- <option value="">{{$field.5}}</option>
- {{foreach $field.4 as $opt=>$val}}<option value="{{$val}}">{{$val}}</option>{{/foreach}}
- </select>
-
- <span class='field_help'>{{$field.3}}</span>
- </div>
-
diff --git a/view/tpl/smarty3/field_custom.tpl b/view/tpl/smarty3/field_custom.tpl
deleted file mode 100644
index c2d73275c..000000000
--- a/view/tpl/smarty3/field_custom.tpl
+++ /dev/null
@@ -1,11 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-
- <div class='field custom'>
- <label for='{{$field.0}}'>{{$field.1}}</label>
- {{$field.2}}
- <span class='field_help'>{{$field.3}}</span>
- </div>
diff --git a/view/tpl/smarty3/field_input.tpl b/view/tpl/smarty3/field_input.tpl
deleted file mode 100644
index 696ebbad7..000000000
--- a/view/tpl/smarty3/field_input.tpl
+++ /dev/null
@@ -1,12 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-
- <div class='field input'>
- <label for='id_{{$field.0}}' id='label_{{$field.0}}'>{{$field.1}}</label>
- <input name='{{$field.0}}' id='id_{{$field.0}}' value="{{$field.2}}">
- <span id='help_{{$field.0}}' class='field_help'>{{$field.3}}</span>
- <div id='end_{{$field.0}}' class='field_end'></div>
- </div>
diff --git a/view/tpl/smarty3/field_intcheckbox.tpl b/view/tpl/smarty3/field_intcheckbox.tpl
deleted file mode 100644
index 54967feab..000000000
--- a/view/tpl/smarty3/field_intcheckbox.tpl
+++ /dev/null
@@ -1,11 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-
- <div class='field checkbox'>
- <label for='id_{{$field.0}}'>{{$field.1}}</label>
- <input type="checkbox" name='{{$field.0}}' id='id_{{$field.0}}' value="{{$field.3}}" {{if $field.2}}checked="true"{{/if}}>
- <span class='field_help'>{{$field.4}}</span>
- </div>
diff --git a/view/tpl/smarty3/field_openid.tpl b/view/tpl/smarty3/field_openid.tpl
deleted file mode 100644
index b00ddabcd..000000000
--- a/view/tpl/smarty3/field_openid.tpl
+++ /dev/null
@@ -1,11 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-
- <div class='field input openid'>
- <label for='id_{{$field.0}}'>{{$field.1}}</label>
- <input name='{{$field.0}}' id='id_{{$field.0}}' value="{{$field.2}}">
- <span class='field_help'>{{$field.3}}</span>
- </div>
diff --git a/view/tpl/smarty3/field_password.tpl b/view/tpl/smarty3/field_password.tpl
deleted file mode 100644
index 5889d2e9c..000000000
--- a/view/tpl/smarty3/field_password.tpl
+++ /dev/null
@@ -1,11 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-
- <div class='field password'>
- <label for='id_{{$field.0}}'>{{$field.1}}</label>
- <input type='password' name='{{$field.0}}' id='id_{{$field.0}}' value="{{$field.2}}">
- <span class='field_help'>{{$field.3}}</span>
- </div>
diff --git a/view/tpl/smarty3/field_radio.tpl b/view/tpl/smarty3/field_radio.tpl
deleted file mode 100644
index 1d7b56ec6..000000000
--- a/view/tpl/smarty3/field_radio.tpl
+++ /dev/null
@@ -1,11 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-
- <div class='field radio'>
- <label for='id_{{$field.0}}_{{$field.2}}'>{{$field.1}}</label>
- <input type="radio" name='{{$field.0}}' id='id_{{$field.0}}_{{$field.2}}' value="{{$field.2}}" {{if $field.4}}checked="true"{{/if}}>
- <span class='field_help'>{{$field.3}}</span>
- </div>
diff --git a/view/tpl/smarty3/field_richtext.tpl b/view/tpl/smarty3/field_richtext.tpl
deleted file mode 100644
index 38992f0f8..000000000
--- a/view/tpl/smarty3/field_richtext.tpl
+++ /dev/null
@@ -1,11 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-
- <div class='field richtext'>
- <label for='id_{{$field.0}}'>{{$field.1}}</label>
- <textarea name='{{$field.0}}' id='id_{{$field.0}}' class="fieldRichtext">{{$field.2}}</textarea>
- <span class='field_help'>{{$field.3}}</span>
- </div>
diff --git a/view/tpl/smarty3/field_select.tpl b/view/tpl/smarty3/field_select.tpl
deleted file mode 100644
index 2a4117a70..000000000
--- a/view/tpl/smarty3/field_select.tpl
+++ /dev/null
@@ -1,13 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-
- <div class='field select'>
- <label for='id_{{$field.0}}'>{{$field.1}}</label>
- <select name='{{$field.0}}' id='id_{{$field.0}}'>
- {{foreach $field.4 as $opt=>$val}}<option value="{{$opt}}" {{if $opt==$field.2}}selected="selected"{{/if}}>{{$val}}</option>{{/foreach}}
- </select>
- <span class='field_help'>{{$field.3}}</span>
- </div>
diff --git a/view/tpl/smarty3/field_select_raw.tpl b/view/tpl/smarty3/field_select_raw.tpl
deleted file mode 100644
index 50e34985f..000000000
--- a/view/tpl/smarty3/field_select_raw.tpl
+++ /dev/null
@@ -1,13 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-
- <div class='field select'>
- <label for='id_{{$field.0}}'>{{$field.1}}</label>
- <select name='{{$field.0}}' id='id_{{$field.0}}'>
- {{$field.4}}
- </select>
- <span class='field_help'>{{$field.3}}</span>
- </div>
diff --git a/view/tpl/smarty3/field_textarea.tpl b/view/tpl/smarty3/field_textarea.tpl
deleted file mode 100644
index 5d71999d4..000000000
--- a/view/tpl/smarty3/field_textarea.tpl
+++ /dev/null
@@ -1,11 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-
- <div class='field textarea'>
- <label for='id_{{$field.0}}'>{{$field.1}}</label>
- <textarea name='{{$field.0}}' id='id_{{$field.0}}'>{{$field.2}}</textarea>
- <span class='field_help'>{{$field.3}}</span>
- </div>
diff --git a/view/tpl/smarty3/field_themeselect.tpl b/view/tpl/smarty3/field_themeselect.tpl
deleted file mode 100644
index be24ff2c6..000000000
--- a/view/tpl/smarty3/field_themeselect.tpl
+++ /dev/null
@@ -1,14 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
- <script>$(function(){ previewTheme($("#id_{{$field.0}}")[0]); });</script>
- <div class='field select'>
- <label for='id_{{$field.0}}'>{{$field.1}}</label>
- <select name='{{$field.0}}' id='id_{{$field.0}}' {{if $field.5=='preview'}}onchange="previewTheme(this);"{{/if}} >
- {{foreach $field.4 as $opt=>$val}}<option value="{{$opt}}" {{if $opt==$field.2}}selected="selected"{{/if}}>{{$val}}</option>{{/foreach}}
- </select>
- <span class='field_help'>{{$field.3}}</span>
- <div id="theme-preview"></div>
- </div>
diff --git a/view/tpl/smarty3/field_yesno.tpl b/view/tpl/smarty3/field_yesno.tpl
deleted file mode 100644
index e982c2f05..000000000
--- a/view/tpl/smarty3/field_yesno.tpl
+++ /dev/null
@@ -1,18 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
- <div class='field yesno'>
- <label for='id_{{$field.0}}'>{{$field.1}}</label>
- <div class='onoff' id="id_{{$field.0}}_onoff">
- <input type="hidden" name='{{$field.0}}' id='id_{{$field.0}}' value="{{$field.2}}">
- <a href="#" class='off'>
- {{if $field.4}}{{$field.4.0}}{{else}}OFF{{/if}}
- </a>
- <a href="#" class='on'>
- {{if $field.4}}{{$field.4.1}}{{else}}ON{{/if}}
- </a>
- </div>
- <span class='field_help'>{{$field.3}}</span>
- </div>
diff --git a/view/tpl/smarty3/fileas_widget.tpl b/view/tpl/smarty3/fileas_widget.tpl
deleted file mode 100644
index f03f169a2..000000000
--- a/view/tpl/smarty3/fileas_widget.tpl
+++ /dev/null
@@ -1,17 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<div id="fileas-sidebar" class="widget">
- <h3>{{$title}}</h3>
- <div id="nets-desc">{{$desc}}</div>
-
- <ul class="fileas-ul">
- <li class="tool"><a href="{{$base}}" class="fileas-link fileas-all{{if $sel_all}} fileas-selected{{/if}}">{{$all}}</a></li>
- {{foreach $terms as $term}}
- <li class="tool"><a href="{{$base}}?f=&file={{$term.name}}" class="fileas-link{{if $term.selected}} fileas-selected{{/if}}">{{$term.name}}</a></li>
- {{/foreach}}
- </ul>
-
-</div>
diff --git a/view/tpl/smarty3/filebrowser.tpl b/view/tpl/smarty3/filebrowser.tpl
deleted file mode 100644
index b408ca687..000000000
--- a/view/tpl/smarty3/filebrowser.tpl
+++ /dev/null
@@ -1,89 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<!DOCTYPE html>
-<html>
- <head>
- <script type="text/javascript" src="{{$baseurl}}/library/tinymce/jscripts/tiny_mce/tiny_mce_popup.js"></script>
- <style>
- .panel_wrapper div.current{.overflow: auto; height: auto!important; }
- .filebrowser.path { font-family: fixed; font-size: 10px; background-color: #f0f0ee; height:auto; overflow:auto;}
- .filebrowser.path a { border-left: 1px solid #C0C0AA; background-color: #E0E0DD; display: block; float:left; padding: 0.3em 1em;}
- .filebrowser ul{ list-style-type: none; padding:0px; }
- .filebrowser.folders a { display: block; padding: 0.3em }
- .filebrowser.folders a:hover { background-color: #f0f0ee; }
- .filebrowser.files.image { overflow: auto; height: auto; }
- .filebrowser.files.image img { height:50px;}
- .filebrowser.files.image li { display: block; padding: 5px; float: left; }
- .filebrowser.files.image span { display: none;}
- .filebrowser.files.file img { height:16px; vertical-align: bottom;}
- .filebrowser.files a { display: block; padding: 0.3em}
- .filebrowser.files a:hover { background-color: #f0f0ee; }
- .filebrowser a { text-decoration: none; }
- </style>
- <script>
- var FileBrowserDialogue = {
- init : function () {
- // Here goes your code for setting your custom things onLoad.
- },
- mySubmit : function (URL) {
- //var URL = document.my_form.my_field.value;
- var win = tinyMCEPopup.getWindowArg("window");
-
- // insert information now
- win.document.getElementById(tinyMCEPopup.getWindowArg("input")).value = URL;
-
- // are we an image browser
- if (typeof(win.ImageDialog) != "undefined") {
- // we are, so update image dimensions...
- if (win.ImageDialog.getImageData)
- win.ImageDialog.getImageData();
-
- // ... and preview if necessary
- if (win.ImageDialog.showPreviewImage)
- win.ImageDialog.showPreviewImage(URL);
- }
-
- // close popup window
- tinyMCEPopup.close();
- }
- }
-
- tinyMCEPopup.onInit.add(FileBrowserDialogue.init, FileBrowserDialogue);
- </script>
- </head>
- <body>
-
- <div class="tabs">
- <ul >
- <li class="current"><span>FileBrowser</span></li>
- </ul>
- </div>
- <div class="panel_wrapper">
-
- <div id="general_panel" class="panel current">
- <div class="filebrowser path">
- {{foreach $path as $p}}<a href="{{$p.0}}">{{$p.1}}</a>{{/foreach}}
- </div>
- <div class="filebrowser folders">
- <ul>
- {{foreach $folders as $f}}<li><a href="{{$f.0}}/">{{$f.1}}</a></li>{{/foreach}}
- </ul>
- </div>
- <div class="filebrowser files {{$type}}">
- <ul>
- {{foreach $files as $f}}
- <li><a href="#" onclick="FileBrowserDialogue.mySubmit('{{$f.0}}'); return false;"><img src="{{$f.2}}"><span>{{$f.1}}</span></a></li>
- {{/foreach}}
- </ul>
- </div>
- </div>
- </div>
- <div class="mceActionPanel">
- <input type="button" id="cancel" name="cancel" value="{{$cancel}}" onclick="tinyMCEPopup.close();" />
- </div>
- </body>
-
-</html>
diff --git a/view/tpl/smarty3/filer_dialog.tpl b/view/tpl/smarty3/filer_dialog.tpl
deleted file mode 100644
index f17a06766..000000000
--- a/view/tpl/smarty3/filer_dialog.tpl
+++ /dev/null
@@ -1,9 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-{{include file="field_combobox.tpl"}}
-<div class="settings-submit-wrapper" >
- <input id="filer_save" type="button" class="settings-submit" value="{{$submit}}" />
-</div>
diff --git a/view/tpl/smarty3/follow.tpl b/view/tpl/smarty3/follow.tpl
deleted file mode 100644
index 2c3b451b3..000000000
--- a/view/tpl/smarty3/follow.tpl
+++ /dev/null
@@ -1,13 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<div id="follow-sidebar" class="widget">
- <h3>{{$connect}}</h3>
- <div id="connect-desc">{{$desc}}</div>
- <form action="follow" method="post" />
- <input id="side-follow-url" type="text" name="url" size="24" title="{{$hint}}" /><input id="side-follow-submit" type="submit" name="submit" value="{{$follow}}" />
- </form>
-</div>
-
diff --git a/view/tpl/smarty3/follow_slap.tpl b/view/tpl/smarty3/follow_slap.tpl
deleted file mode 100644
index b31b4ef95..000000000
--- a/view/tpl/smarty3/follow_slap.tpl
+++ /dev/null
@@ -1,30 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
- <entry>
- <author>
- <name>{{$name}}</name>
- <uri>{{$profile_page}}</uri>
- <link rel="photo" type="image/jpeg" media:width="80" media:height="80" href="{{$thumb}}" />
- <link rel="avatar" type="image/jpeg" media:width="80" media:height="80" href="{{$thumb}}" />
- </author>
-
- <id>{{$item_id}}</id>
- <title>{{$title}}</title>
- <published>{{$published}}</published>
- <content type="{{$type}}" >{{$content}}</content>
-
- <as:actor>
- <as:obj_type>http://activitystrea.ms/schema/1.0/person</as:obj_type>
- <id>{{$profile_page}}</id>
- <title></title>
- <link rel="avatar" type="image/jpeg" media:width="175" media:height="175" href="{{$photo}}"/>
- <link rel="avatar" type="image/jpeg" media:width="80" media:height="80" href="{{$thumb}}"/>
- <poco:preferredUsername>{{$nick}}</poco:preferredUsername>
- <poco:displayName>{{$name}}</poco:displayName>
- </as:actor>
- <as:verb>{{$verb}}</as:verb>
- {{$ostat_follow}}
- </entry>
diff --git a/view/tpl/smarty3/generic_links_widget.tpl b/view/tpl/smarty3/generic_links_widget.tpl
deleted file mode 100644
index c12273c7b..000000000
--- a/view/tpl/smarty3/generic_links_widget.tpl
+++ /dev/null
@@ -1,16 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<div class="widget{{if $class}} {{$class}}{{/if}}">
- {{if $title}}<h3>{{$title}}</h3>{{/if}}
- {{if $desc}}<div class="desc">{{$desc}}</div>{{/if}}
-
- <ul>
- {{foreach $items as $item}}
- <li class="tool"><a href="{{$item.url}}" class="{{if $item.selected}}selected{{/if}}">{{$item.label}}</a></li>
- {{/foreach}}
- </ul>
-
-</div>
diff --git a/view/tpl/smarty3/group_drop.tpl b/view/tpl/smarty3/group_drop.tpl
deleted file mode 100644
index 84d380e30..000000000
--- a/view/tpl/smarty3/group_drop.tpl
+++ /dev/null
@@ -1,14 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<div class="group-delete-wrapper button" id="group-delete-wrapper-{{$id}}" >
- <a href="group/drop/{{$id}}?t={{$form_security_token}}"
- onclick="return confirmDelete();"
- id="group-delete-icon-{{$id}}"
- class="icon drophide group-delete-icon"
- onmouseover="imgbright(this);"
- onmouseout="imgdull(this);" ></a>
-</div>
-<div class="group-delete-end"></div>
diff --git a/view/tpl/smarty3/group_edit.tpl b/view/tpl/smarty3/group_edit.tpl
deleted file mode 100644
index b7b14eba3..000000000
--- a/view/tpl/smarty3/group_edit.tpl
+++ /dev/null
@@ -1,28 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<h2>{{$title}}</h2>
-
-
-<div id="group-edit-wrapper" >
- <form action="group/{{$gid}}" id="group-edit-form" method="post" >
- <input type='hidden' name='form_security_token' value='{{$form_security_token}}'>
-
- {{include file="field_input.tpl" field=$gname}}
- {{if $drop}}{{$drop}}{{/if}}
- <div id="group-edit-submit-wrapper" >
- <input type="submit" name="submit" value="{{$submit}}" >
- </div>
- <div id="group-edit-select-end" ></div>
- </form>
-</div>
-
-
-{{if $groupeditor}}
- <div id="group-update-wrapper">
- {{include file="groupeditor.tpl"}}
- </div>
-{{/if}}
-{{if $desc}}<div id="group-edit-desc">{{$desc}}</div>{{/if}}
diff --git a/view/tpl/smarty3/group_selection.tpl b/view/tpl/smarty3/group_selection.tpl
deleted file mode 100644
index f16bb5159..000000000
--- a/view/tpl/smarty3/group_selection.tpl
+++ /dev/null
@@ -1,13 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<div class="field custom">
-<label for="group-selection" id="group-selection-lbl">{{$label}}</label>
-<select name="group-selection" id="group-selection" >
-{{foreach $groups as $group}}
-<option value="{{$group.id}}" {{if $group.selected}}selected="selected"{{/if}} >{{$group.name}}</option>
-{{/foreach}}
-</select>
-</div>
diff --git a/view/tpl/smarty3/group_side.tpl b/view/tpl/smarty3/group_side.tpl
deleted file mode 100644
index b6532fb6d..000000000
--- a/view/tpl/smarty3/group_side.tpl
+++ /dev/null
@@ -1,38 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<div class="widget" id="group-sidebar">
-<h3>{{$title}}</h3>
-
-<div id="sidebar-group-list">
- <ul id="sidebar-group-ul">
- {{foreach $groups as $group}}
- <li class="sidebar-group-li">
- {{if $group.cid}}
- <input type="checkbox"
- class="{{if $group.selected}}ticked{{else}}unticked {{/if}} action"
- onclick="contactgroupChangeMember('{{$group.id}}','{{$group.cid}}');return true;"
- {{if $group.ismember}}checked="checked"{{/if}}
- />
- {{/if}}
- {{if $group.edit}}
- <a class="groupsideedit" href="{{$group.edit.href}}" title="{{$edittext}}"><span id="edit-sidebar-group-element-{{$group.id}}" class="group-edit-icon iconspacer small-pencil"></span></a>
- {{/if}}
- <a id="sidebar-group-element-{{$group.id}}" class="sidebar-group-element {{if $group.selected}}group-selected{{/if}}" href="{{$group.href}}">{{$group.text}}</a>
- </li>
- {{/foreach}}
- </ul>
- </div>
- <div id="sidebar-new-group">
- <a href="group/new">{{$createtext}}</a>
- </div>
- {{if $ungrouped}}
- <div id="sidebar-ungrouped">
- <a href="nogroup">{{$ungrouped}}</a>
- </div>
- {{/if}}
-</div>
-
-
diff --git a/view/tpl/smarty3/groupeditor.tpl b/view/tpl/smarty3/groupeditor.tpl
deleted file mode 100644
index 4fad30d5a..000000000
--- a/view/tpl/smarty3/groupeditor.tpl
+++ /dev/null
@@ -1,21 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<div id="group">
-<h3>{{$groupeditor.label_members}}</h3>
-<div id="group-members" class="contact_list">
-{{foreach $groupeditor.members as $c}} {{$c}} {{/foreach}}
-</div>
-<div id="group-members-end"></div>
-<hr id="group-separator" />
-</div>
-
-<div id="contacts">
-<h3>{{$groupeditor.label_contacts}}</h3>
-<div id="group-all-contacts" class="contact_list">
-{{foreach $groupeditor.contacts as $m}} {{$m}} {{/foreach}}
-</div>
-<div id="group-all-contacts-end"></div>
-</div>
diff --git a/view/tpl/smarty3/head.tpl b/view/tpl/smarty3/head.tpl
deleted file mode 100644
index 314d159d6..000000000
--- a/view/tpl/smarty3/head.tpl
+++ /dev/null
@@ -1,35 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
-<base href="{{$baseurl}}/" />
-<meta name="generator" content="{{$generator}}" />
-
-<!--[if IE]>
-<script src="https://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
-<![endif]-->
-
-{{$head_css}}
-
-{{$js_strings}}
-
-{{$head_js}}
-
-<link rel="shortcut icon" href="{{$baseurl}}/images/red.png" />
-<link rel="search"
- href="{{$baseurl}}/opensearch"
- type="application/opensearchdescription+xml"
- title="Search in Friendica" />
-
-
-<script>
-
- var updateInterval = {{$update_interval}};
- var localUser = {{if $local_user}}{{$local_user}}{{else}}false{{/if}};
-
-</script>
-
-
-
diff --git a/view/tpl/smarty3/hide_comments.tpl b/view/tpl/smarty3/hide_comments.tpl
deleted file mode 100644
index 50a354122..000000000
--- a/view/tpl/smarty3/hide_comments.tpl
+++ /dev/null
@@ -1,9 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<div class="hide-comments-outer">
-<span id="hide-comments-total-{{$id}}" class="hide-comments-total">{{$num_comments}}</span> <span id="hide-comments-{{$id}}" class="hide-comments fakelink" onclick="showHideComments({{$id}});">{{$hide_text}}</span>
-</div>
-<div id="collapsed-comments-{{$id}}" class="collapsed-comments" style="display: {{$display}};">
diff --git a/view/tpl/smarty3/install.tpl b/view/tpl/smarty3/install.tpl
deleted file mode 100644
index cfb90e61f..000000000
--- a/view/tpl/smarty3/install.tpl
+++ /dev/null
@@ -1,15 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-
-<h1>{{$title}}</h1>
-<h2>{{$pass}}</h2>
-
-
-{{if $status}}
-<h3 class="error-message">{{$status}}</h3>
-{{/if}}
-
-{{$text}}
diff --git a/view/tpl/smarty3/install_checks.tpl b/view/tpl/smarty3/install_checks.tpl
deleted file mode 100644
index 9d5ce0eeb..000000000
--- a/view/tpl/smarty3/install_checks.tpl
+++ /dev/null
@@ -1,29 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<h1>{{$title}}</h1>
-<h2>{{$pass}}</h2>
-<form action="{{$baseurl}}/index.php?q=setup" method="post">
-<table>
-{{foreach $checks as $check}}
- <tr><td>{{$check.title}} </td><td><span class="icon s22 {{if $check.status}}on{{else}}{{if $check.required}}off{{else}}yellow{{/if}}{{/if}}"></td><td>{{if $check.required}}(required){{/if}}</td></tr>
- {{if $check.help}}
- <tr><td colspan="3"><blockquote>{{$check.help}}</blockquote></td></tr>
- {{/if}}
-{{/foreach}}
-</table>
-
-{{if $phpath}}
- <input type="hidden" name="phpath" value="{{$phpath}}">
-{{/if}}
-
-{{if $passed}}
- <input type="hidden" name="pass" value="2">
- <input type="submit" value="{{$next}}">
-{{else}}
- <input type="hidden" name="pass" value="1">
- <input type="submit" value="{{$reload}}">
-{{/if}}
-</form>
diff --git a/view/tpl/smarty3/install_db.tpl b/view/tpl/smarty3/install_db.tpl
deleted file mode 100644
index fe8aee85b..000000000
--- a/view/tpl/smarty3/install_db.tpl
+++ /dev/null
@@ -1,35 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-
-<h1>{{$title}}</h1>
-<h2>{{$pass}}</h2>
-
-
-<p>
-{{$info_01}}<br>
-{{$info_02}}<br>
-{{$info_03}}
-</p>
-
-{{if $status}}
-<h3 class="error-message">{{$status}}</h3>
-{{/if}}
-
-<form id="install-form" action="{{$baseurl}}/setup" method="post">
-
-<input type="hidden" name="phpath" value="{{$phpath}}" />
-<input type="hidden" name="pass" value="3" />
-
-{{include file="field_input.tpl" field=$dbhost}}
-{{include file="field_input.tpl" field=$dbuser}}
-{{include file="field_password.tpl" field=$dbpass}}
-{{include file="field_input.tpl" field=$dbdata}}
-
-
-<input id="install-submit" type="submit" name="submit" value="{{$submit}}" />
-
-</form>
-
diff --git a/view/tpl/smarty3/install_settings.tpl b/view/tpl/smarty3/install_settings.tpl
deleted file mode 100644
index f91122737..000000000
--- a/view/tpl/smarty3/install_settings.tpl
+++ /dev/null
@@ -1,32 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-
-<h1>{{$title}}</h1>
-<h2>{{$pass}}</h2>
-
-
-{{if $status}}
-<h3 class="error-message">{{$status}}</h3>
-{{/if}}
-
-<form id="install-form" action="{{$baseurl}}/setup" method="post">
-
-<input type="hidden" name="phpath" value="{{$phpath}}" />
-<input type="hidden" name="dbhost" value="{{$dbhost}}" />
-<input type="hidden" name="dbuser" value="{{$dbuser}}" />
-<input type="hidden" name="dbpass" value="{{$dbpass}}" />
-<input type="hidden" name="dbdata" value="{{$dbdata}}" />
-<input type="hidden" name="pass" value="4" />
-
-{{include file="field_input.tpl" field=$adminmail}}
-{{include file="field_input.tpl" field=$siteurl}}
-
-{{$timezone}}
-
-<input id="install-submit" type="submit" name="submit" value="{{$submit}}" />
-
-</form>
-
diff --git a/view/tpl/smarty3/intros.tpl b/view/tpl/smarty3/intros.tpl
deleted file mode 100644
index 4fd27d370..000000000
--- a/view/tpl/smarty3/intros.tpl
+++ /dev/null
@@ -1,23 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-
-<div class="intro-wrapper" id="intro-{{$contact_id}}" >
-
-<div class="intro-fullname" id="intro-fullname-{{$contact_id}}" >{{$fullname}}</div>
-<a class="intro-url-link" id="intro-url-link-{{$contact_id}}" href="{{$url}}" ><img id="photo-{{$contact_id}}" class="intro-photo" src="{{$photo}}" width="175" height=175" title="{{$fullname}}" alt="{{$fullname}}" /></a>
-<div class="intro-wrapper-end" id="intro-wrapper-end-{{$contact_id}}"></div>
-<form class="intro-form" action="intro" method="post">
-<input class="intro-submit-ignore" type="submit" name="submit" value="{{$ignore}}" />
-<input class="intro-submit-block" type="submit" name="submit" value="{{$block}}" />
-<input class="intro-submit-discard" type="submit" name="submit" value="{{$discard}}" />
-{{include file="field_checkbox.tpl" field=$hidden}}
-{{* {{include file="field_checkbox.tpl" field=$activity}} *}}
-<input type="hidden" name="contact_id" value="{{$contact_id}}" >
-
-<input class="intro-submit-approve" type="submit" name="submit" value="{{$approve}}" />
-</form>
-</div>
-<div class="intro-end"></div>
diff --git a/view/tpl/smarty3/intros_header.tpl b/view/tpl/smarty3/intros_header.tpl
deleted file mode 100644
index 2dbf065d7..000000000
--- a/view/tpl/smarty3/intros_header.tpl
+++ /dev/null
@@ -1,6 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<h3>{{$title}}</h3>
diff --git a/view/tpl/smarty3/invite.tpl b/view/tpl/smarty3/invite.tpl
deleted file mode 100644
index e699f1f0e..000000000
--- a/view/tpl/smarty3/invite.tpl
+++ /dev/null
@@ -1,35 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<form action="invite" method="post" id="invite-form" >
-
-<input type='hidden' name='form_security_token' value='{{$form_security_token}}'>
-
-<div id="invite-wrapper">
-
-<h3>{{$invite}}</h3>
-
-<div id="invite-recipient-text">
-{{$addr_text}}
-</div>
-
-<div id="invite-recipient-textarea">
-<textarea id="invite-recipients" name="recipients" rows="8" cols="32" ></textarea>
-</div>
-
-<div id="invite-message-text">
-{{$msg_text}}
-</div>
-
-<div id="invite-message-textarea">
-<textarea id="invite-message" name="message" rows="10" cols="72" >{{$default_message}}</textarea>
-</div>
-
-<div id="invite-submit-wrapper">
-<input type="submit" name="submit" value="{{$submit}}" />
-</div>
-
-</div>
-</form>
diff --git a/view/tpl/smarty3/jot-header.tpl b/view/tpl/smarty3/jot-header.tpl
deleted file mode 100644
index c20c7c10d..000000000
--- a/view/tpl/smarty3/jot-header.tpl
+++ /dev/null
@@ -1,323 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-
-<script language="javascript" type="text/javascript">
-
-var editor=false;
-var textlen = 0;
-var plaintext = '{{$editselect}}';
-
-function initEditor(cb){
- if (editor==false){
- $("#profile-jot-text-loading").show();
- if(plaintext == 'none') {
- $("#profile-jot-text-loading").hide();
- $("#profile-jot-text").css({ 'height': 200, 'color': '#000' });
- $("#profile-jot-text").contact_autocomplete(baseurl+"/acl");
- editor = true;
- $("a#jot-perms-icon").fancybox({
- 'transitionIn' : 'elastic',
- 'transitionOut' : 'elastic'
- });
- $(".jothidden").show();
- if (typeof cb!="undefined") cb();
- return;
- }
- tinyMCE.init({
- theme : "advanced",
- mode : "specific_textareas",
- editor_selector: {{$editselect}},
- auto_focus: "profile-jot-text",
- plugins : "bbcode,paste,autoresize, inlinepopups",
- theme_advanced_buttons1 : "bold,italic,underline,undo,redo,link,unlink,image,forecolor,formatselect,code",
- theme_advanced_buttons2 : "",
- theme_advanced_buttons3 : "",
- theme_advanced_toolbar_location : "top",
- theme_advanced_toolbar_align : "center",
- theme_advanced_blockformats : "blockquote,code",
- gecko_spellcheck : true,
- paste_text_sticky : true,
- entity_encoding : "raw",
- add_unload_trigger : false,
- remove_linebreaks : false,
- force_p_newlines : false,
- force_br_newlines : true,
- forced_root_block : '',
- convert_urls: false,
- content_css: "{{$baseurl}}/view/custom_tinymce.css",
- theme_advanced_path : false,
- file_browser_callback : "fcFileBrowser",
- setup : function(ed) {
- cPopup = null;
- ed.onKeyDown.add(function(ed,e) {
- if(cPopup !== null)
- cPopup.onkey(e);
- });
-
- ed.onKeyUp.add(function(ed, e) {
- var txt = tinyMCE.activeEditor.getContent();
- match = txt.match(/@([^ \n]+)$/);
- if(match!==null) {
- if(cPopup === null) {
- cPopup = new ACPopup(this,baseurl+"/acl");
- }
- if(cPopup.ready && match[1]!==cPopup.searchText) cPopup.search(match[1]);
- if(! cPopup.ready) cPopup = null;
- }
- else {
- if(cPopup !== null) { cPopup.close(); cPopup = null; }
- }
-
- textlen = txt.length;
- if(textlen != 0 && $('#jot-perms-icon').is('.unlock')) {
- $('#profile-jot-desc').html(ispublic);
- }
- else {
- $('#profile-jot-desc').html('&nbsp;');
- }
-
- //Character count
-
- if(textlen <= 140) {
- $('#character-counter').removeClass('red');
- $('#character-counter').removeClass('orange');
- $('#character-counter').addClass('grey');
- }
- if((textlen > 140) && (textlen <= 420)) {
- $('#character-counter').removeClass('grey');
- $('#character-counter').removeClass('red');
- $('#character-counter').addClass('orange');
- }
- if(textlen > 420) {
- $('#character-counter').removeClass('grey');
- $('#character-counter').removeClass('orange');
- $('#character-counter').addClass('red');
- }
- $('#character-counter').text(textlen);
- });
-
- ed.onInit.add(function(ed) {
- ed.pasteAsPlainText = true;
- $("#profile-jot-text-loading").hide();
- $(".jothidden").show();
- if (typeof cb!="undefined") cb();
- });
-
- }
- });
-
- editor = true;
- // setup acl popup
- $("a#jot-perms-icon").fancybox({
- 'transitionIn' : 'elastic',
- 'transitionOut' : 'elastic'
- });
- } else {
- if (typeof cb!="undefined") cb();
- }
-}
-
-function enableOnUser(){
- if (editor) return;
- $(this).val("");
- initEditor();
-}
-
-</script>
-<script type="text/javascript" src="{{$baseurl}}/js/ajaxupload.js" ></script>
-<script>
- var ispublic = '{{$ispublic}}';
-
- $(document).ready(function() {
-
- /* enable tinymce on focus and click */
- $("#profile-jot-text").focus(enableOnUser);
- $("#profile-jot-text").click(enableOnUser);
-
- var uploader = new window.AjaxUpload(
- 'wall-image-upload',
- { action: '{{$baseurl}}/wall_upload/{{$nickname}}',
- name: 'userfile',
- onSubmit: function(file,ext) { $('#profile-rotator').show(); },
- onComplete: function(file,response) {
- addeditortext(response);
- $('#profile-rotator').hide();
- }
- }
- );
- var file_uploader = new window.AjaxUpload(
- 'wall-file-upload',
- { action: '{{$baseurl}}/wall_attach/{{$nickname}}',
- name: 'userfile',
- onSubmit: function(file,ext) { $('#profile-rotator').show(); },
- onComplete: function(file,response) {
- addeditortext(response);
- $('#profile-rotator').hide();
- }
- }
- );
-
-
- });
-
- function deleteCheckedItems() {
- var checkedstr = '';
-
- $('.item-select').each( function() {
- if($(this).is(':checked')) {
- if(checkedstr.length != 0) {
- checkedstr = checkedstr + ',' + $(this).val();
- }
- else {
- checkedstr = $(this).val();
- }
- }
- });
- $.post('item', { dropitems: checkedstr }, function(data) {
- window.location.reload();
- });
- }
-
- function jotGetLink() {
- reply = prompt("{{$linkurl}}");
- if(reply && reply.length) {
- reply = bin2hex(reply);
- $('#profile-rotator').show();
- $.get('{{$baseurl}}/parse_url?binurl=' + reply, function(data) {
- addeditortext(data);
- $('#profile-rotator').hide();
- });
- }
- }
-
- function jotVideoURL() {
- reply = prompt("{{$vidurl}}");
- if(reply && reply.length) {
- addeditortext('[video]' + reply + '[/video]');
- }
- }
-
- function jotAudioURL() {
- reply = prompt("{{$audurl}}");
- if(reply && reply.length) {
- addeditortext('[audio]' + reply + '[/audio]');
- }
- }
-
-
- function jotGetLocation() {
- reply = prompt("{{$whereareu}}", $('#jot-location').val());
- if(reply && reply.length) {
- $('#jot-location').val(reply);
- }
- }
-
- function jotShare(id) {
- if ($('#jot-popup').length != 0) $('#jot-popup').show();
-
- $('#like-rotator-' + id).show();
- $.get('{{$baseurl}}/share/' + id, function(data) {
- if (!editor) $("#profile-jot-text").val("");
- initEditor(function(){
- addeditortext(data);
- $('#like-rotator-' + id).hide();
- $(window).scrollTop(0);
- });
-
- });
- }
-
- function linkdropper(event) {
- var linkFound = event.dataTransfer.types.contains("text/uri-list");
- if(linkFound)
- event.preventDefault();
- }
-
- function linkdrop(event) {
- var reply = event.dataTransfer.getData("text/uri-list");
- event.target.textContent = reply;
- event.preventDefault();
- if(reply && reply.length) {
- reply = bin2hex(reply);
- $('#profile-rotator').show();
- $.get('{{$baseurl}}/parse_url?binurl=' + reply, function(data) {
- if (!editor) $("#profile-jot-text").val("");
- initEditor(function(){
- addeditortext(data);
- $('#profile-rotator').hide();
- });
- });
- }
- }
-
- function itemTag(id) {
- reply = prompt("{{$term}}");
- if(reply && reply.length) {
- reply = reply.replace('#','');
- if(reply.length) {
-
- commentBusy = true;
- $('body').css('cursor', 'wait');
-
- $.get('{{$baseurl}}/tagger/' + id + '?term=' + reply);
- if(timer) clearTimeout(timer);
- timer = setTimeout(NavUpdate,3000);
- liking = 1;
- }
- }
- }
-
- function itemFiler(id) {
-
- var bordercolor = $("input").css("border-color");
-
- $.get('filer/', function(data){
- $.fancybox(data);
- $("#id_term").keypress(function(){
- $(this).css("border-color",bordercolor);
- })
- $("#select_term").change(function(){
- $("#id_term").css("border-color",bordercolor);
- })
-
- $("#filer_save").click(function(e){
- e.preventDefault();
- reply = $("#id_term").val();
- if(reply && reply.length) {
- commentBusy = true;
- $('body').css('cursor', 'wait');
- $.get('{{$baseurl}}/filer/' + id + '?term=' + reply, NavUpdate);
-// if(timer) clearTimeout(timer);
-// timer = setTimeout(NavUpdate,3000);
- liking = 1;
- $.fancybox.close();
- } else {
- $("#id_term").css("border-color","#FF0000");
- }
- return false;
- });
- });
-
- }
-
- function jotClearLocation() {
- $('#jot-coord').val('');
- $('#profile-nolocation-wrapper').hide();
- }
-
- function addeditortext(data) {
- if(plaintext == 'none') {
- var currentText = $("#profile-jot-text").val();
- $("#profile-jot-text").val(currentText + data);
- }
- else
- tinyMCE.execCommand('mceInsertRawHTML',false,data);
- }
-
- {{$geotag}}
-
-</script>
-
diff --git a/view/tpl/smarty3/jot.tpl b/view/tpl/smarty3/jot.tpl
deleted file mode 100644
index 87e00413c..000000000
--- a/view/tpl/smarty3/jot.tpl
+++ /dev/null
@@ -1,91 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-
-<div id="profile-jot-wrapper" >
- <div id="profile-jot-banner-wrapper">
- <div id="profile-jot-desc" >&nbsp;</div>
- <div id="character-counter" class="grey"></div>
- </div>
- <div id="profile-jot-banner-end"></div>
-
- <form id="profile-jot-form" action="{{$action}}" method="post" >
- <input type="hidden" name="type" value="{{$ptyp}}" />
- <input type="hidden" name="profile_uid" value="{{$profile_uid}}" />
- <input type="hidden" name="return" value="{{$return_path}}" />
- <input type="hidden" name="location" id="jot-location" value="{{$defloc}}" />
- <input type="hidden" name="coord" id="jot-coord" value="" />
- <input type="hidden" name="post_id" value="{{$post_id}}" />
- <input type="hidden" name="preview" id="jot-preview" value="0" />
- <div id="jot-title-wrap"><input name="title" id="jot-title" type="text" placeholder="{{$placeholdertitle}}" value="{{$title}}" class="jothidden" style="display:none"></div>
- {{if $catsenabled}}
- <div id="jot-category-wrap"><input name="category" id="jot-category" type="text" placeholder="{{$placeholdercategory}}" value="{{$category}}" class="jothidden" style="display:none" /></div>
- {{/if}}
- <div id="jot-text-wrap">
- <img id="profile-jot-text-loading" src="images/rotator.gif" alt="{{$wait}}" title="{{$wait}}" style="display: none;" />
- <textarea rows="5" cols="64" class="profile-jot-text" id="profile-jot-text" name="body" >{{if $content}}{{$content}}{{else}}{{$share}}{{/if}}</textarea>
- </div>
-
-<div id="profile-jot-submit-wrapper" class="jothidden">
- <input type="submit" id="profile-jot-submit" name="submit" value="{{$share}}" />
-
- <div id="profile-upload-wrapper" style="display: {{$visitor}};" >
- <div id="wall-image-upload-div" ><a href="#" onclick="return false;" id="wall-image-upload" class="icon camera" title="{{$upload}}"></a></div>
- </div>
- <div id="profile-attach-wrapper" style="display: {{$visitor}};" >
- <div id="wall-file-upload-div" ><a href="#" onclick="return false;" id="wall-file-upload" class="icon attach" title="{{$attach}}"></a></div>
- </div>
-
- <div id="profile-link-wrapper" style="display: {{$visitor}};" ondragenter="linkdropper(event);" ondragover="linkdropper(event);" ondrop="linkdrop(event);" >
- <a id="profile-link" class="icon link" title="{{$weblink}}" ondragenter="return linkdropper(event);" ondragover="return linkdropper(event);" ondrop="linkdrop(event);" onclick="jotGetLink(); return false;"></a>
- </div>
- <div id="profile-video-wrapper" style="display: {{$visitor}};" >
- <a id="profile-video" class="icon video" title="{{$video}}" onclick="jotVideoURL();return false;"></a>
- </div>
- <div id="profile-audio-wrapper" style="display: {{$visitor}};" >
- <a id="profile-audio" class="icon audio" title="{{$audio}}" onclick="jotAudioURL();return false;"></a>
- </div>
- <div id="profile-location-wrapper" style="display: {{$visitor}};" >
- <a id="profile-location" class="icon globe" title="{{$setloc}}" onclick="jotGetLocation();return false;"></a>
- </div>
- <div id="profile-nolocation-wrapper" style="display: none;" >
- <a id="profile-nolocation" class="icon noglobe" title="{{$noloc}}" onclick="jotClearLocation();return false;"></a>
- </div>
-
- <div id="profile-jot-perms" class="profile-jot-perms" style="display: {{$pvisit}};" >
- <a href="#profile-jot-acl-wrapper" id="jot-perms-icon" class="icon {{$lockstate}}" title="{{$permset}}" ></a>{{$bang}}
- </div>
-
- {{if $preview}}<span onclick="preview_post();" id="jot-preview-link" class="fakelink">{{$preview}}</span>{{/if}}
-
-
- <div id="profile-jot-perms-end"></div>
-
-
- <div id="profile-jot-plugin-wrapper">
- {{$jotplugins}}
- </div>
-
- <div id="profile-rotator-wrapper" style="display: {{$visitor}};" >
- <img id="profile-rotator" src="images/rotator.gif" alt="{{$wait}}" title="{{$wait}}" style="display: none;" />
- </div>
-
- <div id="jot-preview-content" style="display:none;"></div>
-
- <div style="display: none;">
- <div id="profile-jot-acl-wrapper" style="width:auto;height:auto;overflow:auto;">
- {{$acl}}
- <hr style="clear:both"/>
- {{$jotnets}}
- </div>
- </div>
-
-
-</div>
-
-<div id="profile-jot-end"></div>
-</form>
-</div>
- {{if $content}}<script>initEditor();</script>{{/if}}
diff --git a/view/tpl/smarty3/jot_geotag.tpl b/view/tpl/smarty3/jot_geotag.tpl
deleted file mode 100644
index 1ed2367aa..000000000
--- a/view/tpl/smarty3/jot_geotag.tpl
+++ /dev/null
@@ -1,13 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-
- if(navigator.geolocation) {
- navigator.geolocation.getCurrentPosition(function(position) {
- $('#jot-coord').val(position.coords.latitude + ' ' + position.coords.longitude);
- $('#profile-nolocation-wrapper').show();
- });
- }
-
diff --git a/view/tpl/smarty3/js_strings.tpl b/view/tpl/smarty3/js_strings.tpl
deleted file mode 100644
index 34337e5bb..000000000
--- a/view/tpl/smarty3/js_strings.tpl
+++ /dev/null
@@ -1,39 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-
-<script>
-
- var aStr = {
-
- 'delitem' : '{{$delitem}}',
- 'comment' : '{{$comment}}',
- 'showmore' : '{{$showmore}}',
- 'showfewer' : '{{$showfewer}}',
- 'pwshort' : '{{$pwshort}}',
- 'pwnomatch' : '{{$pwnomatch}}',
- 'everybody' : '{{$everybody}}',
-
- 't01' : {{$t01}},
- 't02' : {{$t02}},
- 't03' : '{{$t03}}',
- 't04' : '{{$t04}}',
- 't05' : '{{$t05}}',
- 't06' : '{{$t06}}',
- 't07' : '{{$t07}}',
- 't08' : '{{$t08}}',
- 't09' : '{{$t09}}',
- 't10' : '{{$t10}}',
- 't11' : '{{$t11}}',
- 't12' : '{{$t12}}',
- 't13' : '{{$t13}}',
- 't14' : '{{$t14}}',
- 't15' : '{{$t15}}',
- 't16' : '{{$t16}}',
- 't17' : '{{$t17}}',
- };
-
-</script>
-
diff --git a/view/tpl/smarty3/lang_selector.tpl b/view/tpl/smarty3/lang_selector.tpl
deleted file mode 100644
index a1aee8277..000000000
--- a/view/tpl/smarty3/lang_selector.tpl
+++ /dev/null
@@ -1,15 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<div id="lang-select-icon" class="icon s22 language" title="{{$title}}" onclick="openClose('language-selector');" ></div>
-<div id="language-selector" style="display: none;" >
- <form action="#" method="post" >
- <select name="system_language" onchange="this.form.submit();" >
- {{foreach $langs.0 as $v=>$l}}
- <option value="{{$v}}" {{if $v==$langs.1}}selected="selected"{{/if}}>{{$l}}</option>
- {{/foreach}}
- </select>
- </form>
-</div>
diff --git a/view/tpl/smarty3/like_noshare.tpl b/view/tpl/smarty3/like_noshare.tpl
deleted file mode 100644
index b8258d64a..000000000
--- a/view/tpl/smarty3/like_noshare.tpl
+++ /dev/null
@@ -1,10 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<div class="wall-item-like-buttons" id="wall-item-like-buttons-{{$id}}">
- <a href="#" class="icon like" title="{{$likethis}}" onclick="dolike({{$id}},'like'); return false"></a>
- <a href="#" class="icon dislike" title="{{$nolike}}" onclick="dolike({{$id}},'dislike'); return false"></a>
- <img id="like-rotator-{{$id}}" class="like-rotator" src="images/rotator.gif" alt="{{$wait}}" title="{{$wait}}" style="display: none;" />
-</div>
diff --git a/view/tpl/smarty3/login.tpl b/view/tpl/smarty3/login.tpl
deleted file mode 100644
index e530429b2..000000000
--- a/view/tpl/smarty3/login.tpl
+++ /dev/null
@@ -1,36 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-
-<form action="{{$dest_url}}" id="{{$form_id}}" method="post" >
- <input type="hidden" name="auth-params" value="login" />
-
- <div id="login_standard">
- {{include file="field_input.tpl" field=$lname}}
- {{include file="field_password.tpl" field=$lpassword}}
- </div>
-
- <div id="login-extra-links">
- {{if $register}}<a href="{{$register.link}}" title="{{$register.title}}" id="register-link">{{$register.desc}}</a>{{/if}}
- <a href="lostpass" title="{{$lostpass}}" id="lost-password-link" >{{$lostlink}}</a>
- </div>
-
- {{include file="field_checkbox.tpl" field=$remember}}
-
- <div id="login-standard-end"></div>
-
- <div id="login-submit-wrapper" >
- <input type="submit" name="submit" id="login-submit-button" value="{{$login}}" />
- </div>
-
- {{foreach $hiddens as $k=>$v}}
- <input type="hidden" name="{{$k}}" value="{{$v}}" />
- {{/foreach}}
-
-
-</form>
-
-
-<script type="text/javascript"> $(document).ready(function() { $("#id_{{$lname.0}}").focus();} );</script>
diff --git a/view/tpl/smarty3/logout.tpl b/view/tpl/smarty3/logout.tpl
deleted file mode 100644
index 582d77ed6..000000000
--- a/view/tpl/smarty3/logout.tpl
+++ /dev/null
@@ -1,11 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<form action="{{$dest_url}}" method="post" >
-<div class="logout-wrapper">
-<input type="hidden" name="auth-params" value="logout" />
-<input type="submit" name="submit" id="logout-button" value="{{$logout}}" />
-</div>
-</form>
diff --git a/view/tpl/smarty3/lostpass.tpl b/view/tpl/smarty3/lostpass.tpl
deleted file mode 100644
index 0e437ca48..000000000
--- a/view/tpl/smarty3/lostpass.tpl
+++ /dev/null
@@ -1,23 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<h3>{{$title}}</h3>
-
-<p id="lostpass-desc">
-{{$desc}}
-</p>
-
-<form action="lostpass" method="post" >
-<div id="login-name-wrapper">
- <label for="login-name" id="label-login-name">{{$name}}</label>
- <input type="text" maxlength="60" name="login-name" id="login-name" value="" />
-</div>
-<div id="login-extra-end"></div>
-<div id="login-submit-wrapper" >
- <input type="submit" name="submit" id="lostpass-submit-button" value="{{$submit}}" />
-</div>
-<div id="login-submit-end"></div>
-</form>
-
diff --git a/view/tpl/smarty3/magicsig.tpl b/view/tpl/smarty3/magicsig.tpl
deleted file mode 100644
index af8dbb5bc..000000000
--- a/view/tpl/smarty3/magicsig.tpl
+++ /dev/null
@@ -1,14 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<?xml version="1.0" encoding="UTF-8"?>
-<me:env xmlns:me="http://salmon-protocol.org/ns/magic-env">
-<me:data type="application/atom+xml">
-{{$data}}
-</me:data>
-<me:encoding>{{$encoding}}</me:encoding>
-<me:alg>{{$algorithm}}</me:alg>
-<me:sig key_id="{{$keyhash}}">{{$signature}}</me:sig>
-</me:env>
diff --git a/view/tpl/smarty3/mail_conv.tpl b/view/tpl/smarty3/mail_conv.tpl
deleted file mode 100644
index 8587efbb5..000000000
--- a/view/tpl/smarty3/mail_conv.tpl
+++ /dev/null
@@ -1,19 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<div class="mail-conv-outside-wrapper">
- <div class="mail-conv-sender" >
- <a href="{{$mail.from_url}}" class="mail-conv-sender-url" ><img class="mframe mail-conv-sender-photo{{$mail.sparkle}}" src="{{$mail.from_photo}}" heigth="80" width="80" alt="{{$mail.from_name}}" /></a>
- <div class="mail-conv-sender-name" >{{$mail.from_name}}</div>
- </div>
- <div class="mail-conv-detail" >
- <div class="mail-conv-date">{{$mail.date}}</div>
- <div class="mail-conv-subject">{{$mail.subject}}</div>
- <div class="mail-conv-body">{{$mail.body}}</div>
- <div class="mail-conv-delete-wrapper" id="mail-conv-delete-wrapper-{{$mail.id}}" ><a href="message/drop/{{$mail.id}}" class="icon drophide delete-icon mail-list-delete-icon" onclick="return confirmDelete();" title="{{$mail.delete}}" id="mail-conv-delete-icon-{{$mail.id}}" class="mail-conv-delete-icon" onmouseover="imgbright(this);" onmouseout="imgdull(this);" ></a></div><div class="mail-conv-delete-end"></div>
- <div class="mail-conv-outside-wrapper-end"></div>
-</div>
-</div>
-<hr class="mail-conv-break" />
diff --git a/view/tpl/smarty3/mail_display.tpl b/view/tpl/smarty3/mail_display.tpl
deleted file mode 100644
index e14d55478..000000000
--- a/view/tpl/smarty3/mail_display.tpl
+++ /dev/null
@@ -1,15 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-
-{{foreach $mails as $mail}}
- {{include file="mail_conv.tpl"}}
-{{/foreach}}
-
-{{if $canreply}}
-{{include file="prv_message.tpl"}}
-{{else}}
-{{$unknown_text}}
-{{/if}} \ No newline at end of file
diff --git a/view/tpl/smarty3/mail_head.tpl b/view/tpl/smarty3/mail_head.tpl
deleted file mode 100644
index f7a39fa8b..000000000
--- a/view/tpl/smarty3/mail_head.tpl
+++ /dev/null
@@ -1,8 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<h3>{{$messages}}</h3>
-
-{{$tab_content}}
diff --git a/view/tpl/smarty3/mail_list.tpl b/view/tpl/smarty3/mail_list.tpl
deleted file mode 100644
index ffc75b794..000000000
--- a/view/tpl/smarty3/mail_list.tpl
+++ /dev/null
@@ -1,24 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<div class="mail-list-outside-wrapper">
- <div class="mail-list-sender" >
- <a href="{{$from_url}}" class="mail-list-sender-url" ><img class="mail-list-sender-photo" src="{{$from_photo}}" height="32" width="32" alt="{{$from_name}}" /></a>
- <div class="mail-list-sender-name" >{{$from_name}}</div>
- </div>
- <div class="mail-list-recip" >
- <a href="{{$to_url}}" class="mail-list-recip-url" ><img class="mail-list-recip-photo" src="{{$to_photo}}" height="32" width="32" alt="{{$to_name}}" /></a>
- <div class="mail-list-recip-name" >{{$to_name}}</div>
- </div>
- <div class="mail-list-date">{{$date}}</div>
- <div class="mail-list-subject"><a href="message/{{$id}}" class="mail-list-link">{{$subject}}</a></div>
- <div class="mail-list-delete-wrapper" id="mail-list-delete-wrapper-{{$id}}" >
- <a href="message/dropconv/{{$id}}" onclick="return confirmDelete();" title="{{$delete}}" class="icon drophide mail-list-delete delete-icon" onmouseover="imgbright(this);" onmouseout="imgdull(this);" ></a>
- </div>
-</div>
-</div>
-<div class="mail-list-delete-end"></div>
-
-<div class="mail-list-outside-wrapper-end"></div>
diff --git a/view/tpl/smarty3/main_slider.tpl b/view/tpl/smarty3/main_slider.tpl
deleted file mode 100644
index 481e23077..000000000
--- a/view/tpl/smarty3/main_slider.tpl
+++ /dev/null
@@ -1,28 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<div id="main-slider" class="slider" ><input id="main-range" type="text" name="cminmax" value="{{$val}}" /></div>
-<script>
- $("#main-range").slider({ from: 0, to: 99, step: 1, scale: ['{{$me}}', '|', '{{$intimate}}', '|', '{{$friends}}', '|', '{{$oldfriends}}', '|', '{{$acquaintances}}', '|', '{{$world}}' ], onstatechange: function(v) {
- var carr = v.split(";");
- bParam_cmin = carr[0];
- bParam_cmax = carr[1];
- networkRefresh();
- } });
-
- var slideTimer = null;
- function networkRefresh() {
- if((document.readyState !== "complete") || (slideTimer !== null))
- return;
- setTimeout(function() { $("#profile-jot-text-loading").show(); }, 1000 );
- slideTimer = setTimeout(networkTimerRefresh,2000);
- }
-
- function networkTimerRefresh() {
- slideTimer = null;
- page_load = true;
- liveUpdate();
- }
-</script>
diff --git a/view/tpl/smarty3/match.tpl b/view/tpl/smarty3/match.tpl
deleted file mode 100644
index 14b725466..000000000
--- a/view/tpl/smarty3/match.tpl
+++ /dev/null
@@ -1,21 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<div class="profile-match-wrapper">
- <div class="profile-match-photo">
- <a href="{{$url}}">
- <img src="{{$photo}}" alt="{{$name}}" title="{{$name}}[{{$tags}}]" />
- </a>
- </div>
- <div class="profile-match-break"></div>
- <div class="profile-match-name">
- <a href="{{$url}}" title="{{$name}}[{{$tags}}]">{{$name}}</a>
- </div>
- <div class="profile-match-end"></div>
- {{if $connlnk}}
- <div class="profile-match-connect"><a href="{{$connlnk}}" title="{{$conntxt}}">{{$conntxt}}</a></div>
- {{/if}}
-
-</div>
diff --git a/view/tpl/smarty3/message_side.tpl b/view/tpl/smarty3/message_side.tpl
deleted file mode 100644
index 7da22ee3e..000000000
--- a/view/tpl/smarty3/message_side.tpl
+++ /dev/null
@@ -1,15 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<div id="message-sidebar" class="widget">
- <div id="message-new"><a href="{{$new.url}}" class="{{if $new.sel}}newmessage-selected{{/if}}">{{$new.label}}</a> </div>
-
- <ul class="message-ul">
- {{foreach $tabs as $t}}
- <li class="tool"><a href="{{$t.url}}" class="message-link{{if $t.sel}}message-selected{{/if}}">{{$t.label}}</a></li>
- {{/foreach}}
- </ul>
-
-</div>
diff --git a/view/tpl/smarty3/micropro_img.tpl b/view/tpl/smarty3/micropro_img.tpl
deleted file mode 100644
index de134adba..000000000
--- a/view/tpl/smarty3/micropro_img.tpl
+++ /dev/null
@@ -1,6 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<div class="contact-block-div{{if $class}} {{$class}}{{/if}}"><a class="contact-block-link{{if $class}} {{$class}}{{/if}}{{if $click}} fakelink{{/if}}" href="{{if $click}}#{{else}}{{$url}}{{/if}}" {{if $click}}onclick="{{$click}}"{{/if}}><img class="contact-block-img{{if $class}} {{$class}}{{/if}}" src="{{$photo}}" title="{{$title}}" alt="{{$name}}" /></a></div>
diff --git a/view/tpl/smarty3/micropro_txt.tpl b/view/tpl/smarty3/micropro_txt.tpl
deleted file mode 100644
index a6438812b..000000000
--- a/view/tpl/smarty3/micropro_txt.tpl
+++ /dev/null
@@ -1,6 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<div class="contact-block-textdiv{{if $class}} {{$class}}{{/if}}"><a class="contact-block-link{{if $class}} {{$class}}{{/if}}{{if $click}} fakelink{{/if}}" href="{{if $click}}#{{else}}{{$url}}{{/if}}" {{if $click}}onclick="{{$click}}"{{/if}} title="{{$title}}">{{$name}}</a></div>
diff --git a/view/tpl/smarty3/moderated_comment.tpl b/view/tpl/smarty3/moderated_comment.tpl
deleted file mode 100644
index 1e4e9b6d4..000000000
--- a/view/tpl/smarty3/moderated_comment.tpl
+++ /dev/null
@@ -1,39 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
- <div class="comment-wwedit-wrapper" id="comment-edit-wrapper-{{$id}}" style="display: block;">
- <form class="comment-edit-form" id="comment-edit-form-{{$id}}" action="item" method="post" onsubmit="post_comment({{$id}}); return false;">
- <input type="hidden" name="type" value="{{$type}}" />
- <input type="hidden" name="profile_uid" value="{{$profile_uid}}" />
- <input type="hidden" name="parent" value="{{$parent}}" />
- <input type="hidden" name="return" value="{{$return_path}}" />
- <input type="hidden" name="jsreload" value="{{$jsreload}}" />
- <input type="hidden" name="preview" id="comment-preview-inp-{{$id}}" value="0" />
-
- <div class="comment-edit-photo" id="comment-edit-photo-{{$id}}" >
- <a class="comment-edit-photo-link" href="{{$mylink}}" title="{{$mytitle}}"><img class="my-comment-photo" src="{{$myphoto}}" alt="{{$mytitle}}" title="{{$mytitle}}" /></a>
- </div>
- <div class="comment-edit-photo-end"></div>
- <div id="mod-cmnt-wrap-{{$id}}" class="mod-cmnt-wrap" style="display:none">
- <div id="mod-cmnt-name-lbl-{{$id}}" class="mod-cmnt-name-lbl">{{$lbl_modname}}</div>
- <input type="text" id="mod-cmnt-name-{{$id}}" class="mod-cmnt-name" name="mod-cmnt-name" value="{{$modname}}" />
- <div id="mod-cmnt-email-lbl-{{$id}}" class="mod-cmnt-email-lbl">{{$lbl_modemail}}</div>
- <input type="text" id="mod-cmnt-email-{{$id}}" class="mod-cmnt-email" name="mod-cmnt-email" value="{{$modemail}}" />
- <div id="mod-cmnt-url-lbl-{{$id}}" class="mod-cmnt-url-lbl">{{$lbl_modurl}}</div>
- <input type="text" id="mod-cmnt-url-{{$id}}" class="mod-cmnt-url" name="mod-cmnt-url" value="{{$modurl}}" />
- </div>
- <textarea id="comment-edit-text-{{$id}}" class="comment-edit-text-empty" name="body" onFocus="commentOpen(this,{{$id}});" onBlur="commentClose(this,{{$id}});" >{{$comment}}</textarea>
-
- <div class="comment-edit-text-end"></div>
- <div class="comment-edit-submit-wrapper" id="comment-edit-submit-wrapper-{{$id}}" style="display: none;" >
- <input type="submit" onclick="post_comment({{$id}}); return false;" id="comment-edit-submit-{{$id}}" class="comment-edit-submit" name="submit" value="{{$submit}}" />
- <span onclick="preview_comment({{$id}});" id="comment-edit-preview-link-{{$id}}" class="fakelink">{{$preview}}</span>
- <div id="comment-edit-preview-{{$id}}" class="comment-edit-preview" style="display:none;"></div>
- </div>
-
- <div class="comment-edit-end"></div>
- </form>
-
- </div>
diff --git a/view/tpl/smarty3/mood_content.tpl b/view/tpl/smarty3/mood_content.tpl
deleted file mode 100644
index 461303318..000000000
--- a/view/tpl/smarty3/mood_content.tpl
+++ /dev/null
@@ -1,25 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<h3>{{$title}}</h3>
-
-<div id="mood-desc">{{$desc}}</div>
-
-<form action="mood" method="get">
-<br />
-<br />
-
-<input id="mood-parent" type="hidden" value="{{$parent}}" name="parent" />
-
-<select name="verb" id="mood-verb-select" >
-{{foreach $verbs as $v}}
-<option value="{{$v.0}}">{{$v.1}}</option>
-{{/foreach}}
-</select>
-<br />
-<br />
-<input type="submit" name="submit" value="{{$submit}}" />
-</form>
-
diff --git a/view/tpl/smarty3/msg-header.tpl b/view/tpl/smarty3/msg-header.tpl
deleted file mode 100644
index 4c47e1d6d..000000000
--- a/view/tpl/smarty3/msg-header.tpl
+++ /dev/null
@@ -1,102 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-
-<script language="javascript" type="text/javascript" src="{{$baseurl}}/library/tinymce/jscripts/tiny_mce/tiny_mce_src.js"></script>
-<script language="javascript" type="text/javascript">
-
-var plaintext = '{{$editselect}}';
-
-if(plaintext != 'none') {
- tinyMCE.init({
- theme : "advanced",
- mode : "specific_textareas",
- editor_selector: /(profile-jot-text|prvmail-text)/,
- plugins : "bbcode,paste",
- theme_advanced_buttons1 : "bold,italic,underline,undo,redo,link,unlink,image,forecolor",
- theme_advanced_buttons2 : "",
- theme_advanced_buttons3 : "",
- theme_advanced_toolbar_location : "top",
- theme_advanced_toolbar_align : "center",
- theme_advanced_blockformats : "blockquote,code",
- gecko_spellcheck : true,
- paste_text_sticky : true,
- entity_encoding : "raw",
- add_unload_trigger : false,
- remove_linebreaks : false,
- force_p_newlines : false,
- force_br_newlines : true,
- forced_root_block : '',
- convert_urls: false,
- content_css: "{{$baseurl}}/view/custom_tinymce.css",
- //Character count
- theme_advanced_path : false,
- setup : function(ed) {
- ed.onInit.add(function(ed) {
- ed.pasteAsPlainText = true;
- var editorId = ed.editorId;
- var textarea = $('#'+editorId);
- if (typeof(textarea.attr('tabindex')) != "undefined") {
- $('#'+editorId+'_ifr').attr('tabindex', textarea.attr('tabindex'));
- textarea.attr('tabindex', null);
- }
- });
- }
- });
-}
-else
- $("#prvmail-text").contact_autocomplete(baseurl+"/acl");
-
-
-</script>
-<script type="text/javascript" src="js/ajaxupload.js" ></script>
-<script>
- $(document).ready(function() {
- var uploader = new window.AjaxUpload(
- 'prvmail-upload',
- { action: 'wall_upload/{{$nickname}}',
- name: 'userfile',
- onSubmit: function(file,ext) { $('#profile-rotator').show(); },
- onComplete: function(file,response) {
- tinyMCE.execCommand('mceInsertRawHTML',false,response);
- $('#profile-rotator').hide();
- }
- }
- );
-
- });
-
- function jotGetLink() {
- reply = prompt("{{$linkurl}}");
- if(reply && reply.length) {
- $('#profile-rotator').show();
- $.get('parse_url?url=' + reply, function(data) {
- tinyMCE.execCommand('mceInsertRawHTML',false,data);
- $('#profile-rotator').hide();
- });
- }
- }
-
- function linkdropper(event) {
- var linkFound = event.dataTransfer.types.contains("text/uri-list");
- if(linkFound)
- event.preventDefault();
- }
-
- function linkdrop(event) {
- var reply = event.dataTransfer.getData("text/uri-list");
- event.target.textContent = reply;
- event.preventDefault();
- if(reply && reply.length) {
- $('#profile-rotator').show();
- $.get('parse_url?url=' + reply, function(data) {
- tinyMCE.execCommand('mceInsertRawHTML',false,data);
- $('#profile-rotator').hide();
- });
- }
- }
-
-</script>
-
diff --git a/view/tpl/smarty3/nav.tpl b/view/tpl/smarty3/nav.tpl
deleted file mode 100644
index 261607e5b..000000000
--- a/view/tpl/smarty3/nav.tpl
+++ /dev/null
@@ -1,153 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<header>
- <div id="site-location">{{$sitelocation}}</div>
- <div id="banner">{{$banner}}</div>
-</header>
-<nav>
- <ul>
- {{if $nav.lock}}
- <li id="nav-rmagic-link" class="nav-menu-icon" >
- <a class="icon {{$nav.lock.2}}" href="{{$nav.lock.0}}" title="{{$nav.lock.3}}" >{{$nav.lock.1}}</a>
- </li>
- {{/if}}
-
-
- {{if $nav.network}}
- <li id="nav-network-link" class="nav-menu {{$sel.network}}">
- <a class="{{$nav.network.2}}" href="{{$nav.network.0}}" title="{{$nav.network.3}}" ><span class="icon network">{{$nav.network.1}}</span></a>
- <span id="net-update" class="nav-notify fakelink" rel="#nav-network-menu"></span>
- <ul id="nav-network-menu" class="menu-popup notify-menus" rel="network">
- <li id="nav-network-see-all"><a href="{{$nav.network.all.0}}">{{$nav.network.all.1}}</a></li>
- <li id="nav-network-mark-all"><a href="#" onclick="markRead('network'); return false;">{{$nav.network.mark.1}}</a></li>
- <li class="empty">{{$emptynotifications}}</li>
- </ul>
- </li>
- {{/if}}
-
- {{if $nav.home}}
- <li id="nav-home-link" class="nav-menu {{$sel.home}}">
- <a class="{{$nav.home.2}}" href="{{$nav.home.0}}" title="{{$nav.home.3}}" ><span class="icon home">{{$nav.home.1}}</span></a>
- <span id="home-update" class="nav-notify fakelink" rel="#nav-home-menu"></span>
- <ul id="nav-home-menu" class="menu-popup notify-menus" rel="home">
- <li id="nav-home-see-all"><a href="{{$nav.home.all.0}}">{{$nav.home.all.1}}</a></li>
- <li id="nav-home-mark-all"><a href="#" onclick="markRead('home'); return false;">{{$nav.home.mark.1}}</a></li>
- <li class="empty">{{$emptynotifications}}</li>
- </ul>
- </li>
- {{/if}}
-
- {{if $nav.messages}}
- <li id="nav-mail-link" class="nav-menu {{$sel.messages}}">
- <a class="{{$nav.messages.2}}" href="{{$nav.messages.0}}" title="{{$nav.messages.3}}" ><span class="icon mail">{{$nav.messages.1}}</span></a>
- <span id="mail-update" class="nav-notify fakelink" rel="#nav-messages-menu"></span>
- <ul id="nav-messages-menu" class="menu-popup notify-menus" rel="messages">
- <li id="nav-messages-see-all"><a href="{{$nav.messages.all.0}}">{{$nav.messages.all.1}}</a></li>
- <li id="nav-messages-mark-all"><a href="#" onclick="markRead('messages'); return false;">{{$nav.messages.mark.1}}</a></li>
- <li class="empty">{{$emptynotifications}}</li>
- </ul>
- </li>
- {{/if}}
-
- {{if $nav.all_events}}
- <li id="nav-all_events-link" class="nav-menu {{$sel.all_events}}">
- <a class="{{$nav.all_events.2}}" href="{{$nav.all_events.0}}" title="{{$nav.all_events.3}}" ><span class="icon events">{{$nav.all_events.1}}</span></a>
- <span id="all_events-update" class="nav-notify fakelink" rel="#nav-all_events-menu"></span>
- <ul id="nav-all_events-menu" class="menu-popup notify-menus" rel="all_events">
- <li id="nav-all_events-see-all"><a href="{{$nav.all_events.all.0}}">{{$nav.all_events.all.1}}</a></li>
- <li id="nav-all_events-mark-all"><a href="#" onclick="markRead('all_events'); return false;">{{$nav.all_events.mark.1}}</a></li>
- <li class="empty">{{$emptynotifications}}</li>
- </ul>
- </li>
- {{/if}}
-
- {{if $nav.intros}}
- <li id="nav-intros-link" class="nav-menu {{$sel.intros}}">
- <a class="{{$nav.intros.2}}" href="{{$nav.intros.0}}" title="{{$nav.intros.3}}" ><span class="icon introductions">{{$nav.intros.1}}</span></a>
- <span id="intro-update" class="nav-notify fakelink" rel="#nav-intros-menu"></span>
- <ul id="nav-intros-menu" class="menu-popup notify-menus" rel="intros">
- <li id="nav-intros-see-all"><a href="{{$nav.intros.all.0}}">{{$nav.intros.all.1}}</a></li>
- <li class="empty">{{$emptynotifications}}</li>
- </ul>
- </li>
- {{/if}}
-
- {{if $nav.notifications}}
- <li id="nav-notify-linkmenu" class="nav-menu fakelink">
- <a href="{{$nav.notifications.0}}" title="{{$nav.notifications.1}}"><span class="icon s22 notify">{{$nav.notifications.1}}</span></a>
- <span id="notify-update" class="nav-notify fakelink" rel="#nav-notify-menu"></span>
- <ul id="nav-notify-menu" class="menu-popup notify-menus" rel="notify">
- <li id="nav-notify-see-all"><a href="{{$nav.notifications.all.0}}">{{$nav.notifications.all.1}}</a></li>
- <li id="nav-notify-mark-all"><a href="#" onclick="markRead('notify'); return false;">{{$nav.notifications.mark.1}}</a></li>
- <li class="empty">{{$emptynotifications}}</li>
- </ul>
- </li>
- {{/if}}
-
- {{if $nav.settings}}
- <li id="nav-site-linkmenu" class="nav-menu-icon"><a href="#" rel="#nav-site-menu"><span class="icon s22 gear">{{$nav.settings.1}}</span></a>
- <ul id="nav-site-menu" class="menu-popup">
- {{if $nav.settings}}<li><a class="{{$nav.settings.2}}" href="{{$nav.settings.0}}" title="{{$nav.settings.3}}">{{$nav.settings.1}}</a></li>{{/if}}
- {{if $nav.directory}}<li><a class="{{$nav.directory.2}}" href="{{$nav.directory.0}}" title="{{$nav.directory.3}}">{{$nav.directory.1}}</a></li>{{/if}}
-
- {{if $nav.admin}}<li><a class="{{$nav.admin.2}}" href="{{$nav.admin.0}}" title="{{$nav.admin.3}}" >{{$nav.admin.1}}</a></li>{{/if}}
-
- </ul>
- </li>
- {{/if}}
-
- {{if $userinfo}}
- <li id="nav-user-linkmenu" class="nav-menu-icon"><a href="#" rel="#nav-user-menu" title="{{$userinfo.name}}"><img src="{{$userinfo.icon}}" alt="{{$userinfo.name}}"></a>
- {{if $localuser}}
- <ul id="nav-user-menu" class="menu-popup">
- {{foreach $nav.usermenu as $usermenu}}
- <li><a class="{{$usermenu.2}}" href="{{$usermenu.0}}" title="{{$usermenu.3}}">{{$usermenu.1}}</a></li>
- {{/foreach}}
- {{if $nav.profiles}}<li><a class="{{$nav.profiles.2}}" href="{{$nav.profiles.0}}" title="{{$nav.profiles.3}}">{{$nav.profiles.1}}</a></li>{{/if}}
- {{if $nav.manage}}<li><a class="{{$nav.manage.2}}" href="{{$nav.manage.0}}" title="{{$nav.manage.3}}">{{$nav.manage.1}}</a></li>{{/if}}
- {{if $nav.contacts}}<li><a class="{{$nav.contacts.2}}" href="{{$nav.contacts.0}}" title="{{$nav.contacts.3}}" >{{$nav.contacts.1}}</a></li>{{/if}}
- {{if $nav.logout}}<li><a class="menu-sep {{$nav.logout.2}}" href="{{$nav.logout.0}}" title="{{$nav.logout.3}}" >{{$nav.logout.1}}</a></li>{{/if}}
-
- </ul>
- {{/if}}
- </li>
- {{/if}}
-
- {{if $nav.login}}<li id="nav-login-link" class="nav-menu {{$nav.login.2}}"><a href="{{$nav.login.0}}" title="{{$nav.login.3}}" >{{$nav.login.1}}</a><li>{{/if}}
- {{if $nav.alogout}}<li id=nav-alogout-link" class="nav-menu {{$nav}}-alogout.2"><a href="{{$nav.alogout.0}}" title="{{$nav.alogout.3}}" >{{$nav.alogout.1}}</a></li>{{/if}}
- {{if $nav.help}}
- <li id="nav-help-link" class="nav-menu {{$sel.help}}">
- <a class="{{$nav.help.2}}" target="friendika-help" href="{{$nav.help.0}}" title="{{$nav.help.3}}" >{{$nav.help.1}}</a>
- </li>
- {{/if}}
-
- {{if $nav.apps}}
- <li id="nav-apps-link" class="nav-menu {{$sel.apps}}">
- <a class=" {{$nav.apps.2}}" href="#" rel="#nav-apps-menu" title="{{$nav.apps.3}}" >{{$nav.apps.1}}</a>
- <ul id="nav-apps-menu" class="menu-popup">
- {{foreach $apps as $ap}}
- <li>{{$ap}}</li>
- {{/foreach}}
- </ul>
- </li>
- {{/if}}
-
- <li id="nav-searchbar">
- <form method="get" action="search">
- <input id="nav-search-text" type="text" value="" placeholder="{{$nav.search.1}}" name="search" title="{{$nav.search.3}}" onclick="this.submit();" />
- </form>
- </li>
- <img src="images/rotator.gif" id="nav-search-spinner" style="display: none;" alt="{{$pleasewait}}" />
-
- </ul>
-</nav>
-
-<ul id="nav-notifications-template" style="display:none;" rel="template">
- <li class="{4}"><a href="{0}"><img src="{1}">{2} <span class="notif-when">{3}</span></a></li>
-</ul>
-
-<div id="langselector" >{{$langselector}}</div>
-<div id="panel" style="display: none;"></div>
diff --git a/view/tpl/smarty3/netfriend.tpl b/view/tpl/smarty3/netfriend.tpl
deleted file mode 100644
index e8658e0bc..000000000
--- a/view/tpl/smarty3/netfriend.tpl
+++ /dev/null
@@ -1,19 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<div class="intro-approve-as-friend-desc">{{$approve_as}}</div>
-
-<div class="intro-approve-as-friend-wrapper">
- <label class="intro-approve-as-friend-label" for="intro-approve-as-friend-{{$intro_id}}">{{$as_friend}}</label>
- <input type="radio" name="duplex" id="intro-approve-as-friend-{{$intro_id}}" class="intro-approve-as-friend" {{$friend_selected}} value="1" />
- <div class="intro-approve-friend-break" ></div>
-</div>
-<div class="intro-approve-as-friend-end"></div>
-<div class="intro-approve-as-fan-wrapper">
- <label class="intro-approve-as-fan-label" for="intro-approve-as-fan-{{$intro_id}}">{{$as_fan}}</label>
- <input type="radio" name="duplex" id="intro-approve-as-fan-{{$intro_id}}" class="intro-approve-as-fan" {{$fan_selected}} value="0" />
- <div class="intro-approve-fan-break"></div>
-</div>
-<div class="intro-approve-as-end"></div>
diff --git a/view/tpl/smarty3/new_channel.tpl b/view/tpl/smarty3/new_channel.tpl
deleted file mode 100644
index a7aa44991..000000000
--- a/view/tpl/smarty3/new_channel.tpl
+++ /dev/null
@@ -1,34 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<h2>{{$title}}</h2>
-
-<form action="new_channel" method="post" id="newchannel-form">
-
- <div id="newchannel-desc" class="descriptive-paragraph">{{$desc}}</div>
-
- <label for="newchannel-name" id="label-newchannel-name" class="newchannel-label" >{{$label_name}}</label>
- <input type="text" name="name" id="newchannel-name" class="newchannel-input" value="{{$name}}" />
- <div id="newchannel-name-feedback" class="newchannel-feedback"></div>
- <div id="newchannel-name-end" class="newchannel-field-end"></div>
-
- <div id="newchannel-name-help" class="descriptive-paragraph">{{$help_name}}</div>
-
- <label for="newchannel-nickname" id="label-newchannel-nickname" class="newchannel-label" >{{$label_nick}}</label>
- <input type="text" name="nickname" id="newchannel-nickname" class="newchannel-input" value="{{$nickname}}" />
- <div id="newchannel-nickname-feedback" class="newchannel-feedback"></div>
- <div id="newchannel-nickname-end" class="newchannel-field-end"></div>
-
- <div id="newchannel-nick-desc" class="descriptive-paragraph">{{$nick_desc}}</div>
-
-
- <div id="newchannel-import-link" class="descriptive-paragraph" >{{$label_import}}</div>
-
- <div id="newchannel-import-end" class="newchannel-field-end"></div>
-
- <input type="submit" name="submit" id="newchannel-submit-button" value="{{$submit}}" />
- <div id="newchannel-submit-end" class="newchannel-field-end"></div>
-
-</form>
diff --git a/view/tpl/smarty3/nogroup-template.tpl b/view/tpl/smarty3/nogroup-template.tpl
deleted file mode 100644
index 7d103a655..000000000
--- a/view/tpl/smarty3/nogroup-template.tpl
+++ /dev/null
@@ -1,17 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<h1>{{$header}}</h1>
-
-{{foreach $contacts as $contact}}
- {{include file="contact_template.tpl"}}
-{{/foreach}}
-<div id="contact-edit-end"></div>
-
-{{$paginate}}
-
-
-
-
diff --git a/view/tpl/smarty3/notifications.tpl b/view/tpl/smarty3/notifications.tpl
deleted file mode 100644
index 834a7a016..000000000
--- a/view/tpl/smarty3/notifications.tpl
+++ /dev/null
@@ -1,13 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-
-<h1>{{$notif_header}}</h1>
-
-{{include file="common_tabs.tpl"}}
-
-<div class="notif-network-wrapper">
- {{$notif_content}}
-</div>
diff --git a/view/tpl/smarty3/notifications_comments_item.tpl b/view/tpl/smarty3/notifications_comments_item.tpl
deleted file mode 100644
index 9913e6cf7..000000000
--- a/view/tpl/smarty3/notifications_comments_item.tpl
+++ /dev/null
@@ -1,8 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<div class="notif-item">
- <a href="{{$item_link}}" target="friendica-notifications"><img src="{{$item_image}}" class="notif-image">{{$item_text}} <span class="notif-when">{{$item_when}}</span></a>
-</div> \ No newline at end of file
diff --git a/view/tpl/smarty3/notifications_dislikes_item.tpl b/view/tpl/smarty3/notifications_dislikes_item.tpl
deleted file mode 100644
index 9913e6cf7..000000000
--- a/view/tpl/smarty3/notifications_dislikes_item.tpl
+++ /dev/null
@@ -1,8 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<div class="notif-item">
- <a href="{{$item_link}}" target="friendica-notifications"><img src="{{$item_image}}" class="notif-image">{{$item_text}} <span class="notif-when">{{$item_when}}</span></a>
-</div> \ No newline at end of file
diff --git a/view/tpl/smarty3/notifications_friends_item.tpl b/view/tpl/smarty3/notifications_friends_item.tpl
deleted file mode 100644
index 9913e6cf7..000000000
--- a/view/tpl/smarty3/notifications_friends_item.tpl
+++ /dev/null
@@ -1,8 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<div class="notif-item">
- <a href="{{$item_link}}" target="friendica-notifications"><img src="{{$item_image}}" class="notif-image">{{$item_text}} <span class="notif-when">{{$item_when}}</span></a>
-</div> \ No newline at end of file
diff --git a/view/tpl/smarty3/notifications_likes_item.tpl b/view/tpl/smarty3/notifications_likes_item.tpl
deleted file mode 100644
index 792b285bc..000000000
--- a/view/tpl/smarty3/notifications_likes_item.tpl
+++ /dev/null
@@ -1,8 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<div class="notif-item">
- <a href="{{$item_link}}" target="friendica-notification"><img src="{{$item_image}}" class="notif-image">{{$item_text}} <span class="notif-when">{{$item_when}}</span></a>
-</div> \ No newline at end of file
diff --git a/view/tpl/smarty3/notifications_network_item.tpl b/view/tpl/smarty3/notifications_network_item.tpl
deleted file mode 100644
index c3381d682..000000000
--- a/view/tpl/smarty3/notifications_network_item.tpl
+++ /dev/null
@@ -1,8 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<div class="notif-item">
- <a href="{{$item_link}}" target="friendica-notifications"><img src="{{$item_image}}" class="notif-image">{{$item_text}} <span class="notif-when">{{$item_when}}</span></a>
-</div>
diff --git a/view/tpl/smarty3/notifications_posts_item.tpl b/view/tpl/smarty3/notifications_posts_item.tpl
deleted file mode 100644
index 9913e6cf7..000000000
--- a/view/tpl/smarty3/notifications_posts_item.tpl
+++ /dev/null
@@ -1,8 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<div class="notif-item">
- <a href="{{$item_link}}" target="friendica-notifications"><img src="{{$item_image}}" class="notif-image">{{$item_text}} <span class="notif-when">{{$item_when}}</span></a>
-</div> \ No newline at end of file
diff --git a/view/tpl/smarty3/notify.tpl b/view/tpl/smarty3/notify.tpl
deleted file mode 100644
index 9913e6cf7..000000000
--- a/view/tpl/smarty3/notify.tpl
+++ /dev/null
@@ -1,8 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<div class="notif-item">
- <a href="{{$item_link}}" target="friendica-notifications"><img src="{{$item_image}}" class="notif-image">{{$item_text}} <span class="notif-when">{{$item_when}}</span></a>
-</div> \ No newline at end of file
diff --git a/view/tpl/smarty3/oauth_authorize.tpl b/view/tpl/smarty3/oauth_authorize.tpl
deleted file mode 100644
index d7f1963d2..000000000
--- a/view/tpl/smarty3/oauth_authorize.tpl
+++ /dev/null
@@ -1,15 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<h1>{{$title}}</h1>
-
-<div class='oauthapp'>
- <img src='{{$app.icon}}'>
- <h4>{{$app.name}}</h4>
-</div>
-<h3>{{$authorize}}</h3>
-<form method="POST">
-<div class="settings-submit-wrapper"><input class="settings-submit" type="submit" name="oauth_yes" value="{{$yes}}" /></div>
-</form>
diff --git a/view/tpl/smarty3/oauth_authorize_done.tpl b/view/tpl/smarty3/oauth_authorize_done.tpl
deleted file mode 100644
index 12d4c6f48..000000000
--- a/view/tpl/smarty3/oauth_authorize_done.tpl
+++ /dev/null
@@ -1,9 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<h1>{{$title}}</h1>
-
-<p>{{$info}}</p>
-<code>{{$code}}</code>
diff --git a/view/tpl/smarty3/oembed_video.tpl b/view/tpl/smarty3/oembed_video.tpl
deleted file mode 100644
index bdfa11509..000000000
--- a/view/tpl/smarty3/oembed_video.tpl
+++ /dev/null
@@ -1,9 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<a href='{{$embedurl}}' onclick='this.innerHTML=Base64.decode("{{$escapedhtml}}"); return false;' style='float:left; margin: 1em; position: relative;'>
- <img width='{{$tw}}' height='{{$th}}' src='{{$turl}}' >
- <div style='position: absolute; top: 0px; left: 0px; width: {{$twpx}}; height: {{$thpx}}; background: url({{$baseurl}}/images/icons/48/play.png) no-repeat center center;'></div>
-</a>
diff --git a/view/tpl/smarty3/oexchange_xrd.tpl b/view/tpl/smarty3/oexchange_xrd.tpl
deleted file mode 100644
index 04a8e1847..000000000
--- a/view/tpl/smarty3/oexchange_xrd.tpl
+++ /dev/null
@@ -1,38 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<?xml version='1.0' encoding='UTF-8'?>
-<XRD xmlns="http://docs.oasis-open.org/ns/xri/xrd-1.0">
-
- <Subject>{{$base}}</Subject>
-
- <Property
- type="http://www.oexchange.org/spec/0.8/prop/vendor">Friendika</Property>
- <Property
- type="http://www.oexchange.org/spec/0.8/prop/title">Friendika Social Network</Property>
- <Property
- type="http://www.oexchange.org/spec/0.8/prop/name">Friendika</Property>
- <Property
- type="http://www.oexchange.org/spec/0.8/prop/prompt">Send to Friendika</Property>
-
- <Link
- rel="icon"
- href="{{$base}}/images/friendika-16.png"
- type="image/png"
- />
-
- <Link
- rel="icon32"
- href="{{$base}}/images/friendika-32.png"
- type="image/png"
- />
-
- <Link
- rel= "http://www.oexchange.org/spec/0.8/rel/offer"
- href="{{$base}}/oexchange"
- type="text/html"
- />
-</XRD>
-
diff --git a/view/tpl/smarty3/opensearch.tpl b/view/tpl/smarty3/opensearch.tpl
deleted file mode 100644
index 63d2a1752..000000000
--- a/view/tpl/smarty3/opensearch.tpl
+++ /dev/null
@@ -1,18 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<?xml version="1.0" encoding="UTF-8"?>
-<OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/">
- <ShortName>Friendika@{{$nodename}}</ShortName>
- <Description>Search in Friendika@{{$nodename}}</Description>
- <Contact>http://bugs.friendika.com/</Contact>
- <Image height="16" width="16" type="image/png">{{$baseurl}}/images/friendika-16.png</Image>
- <Image height="64" width="64" type="image/png">{{$baseurl}}/images/friendika-64.png</Image>
- <Url type="text/html"
- template="{{$baseurl}}/search?search={searchTerms}"/>
- <Url type="application/opensearchdescription+xml"
- rel="self"
- template="{{$baseurl}}/opensearch" />
-</OpenSearchDescription> \ No newline at end of file
diff --git a/view/tpl/smarty3/page_display.tpl b/view/tpl/smarty3/page_display.tpl
deleted file mode 100644
index 0f02086f2..000000000
--- a/view/tpl/smarty3/page_display.tpl
+++ /dev/null
@@ -1,12 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<div class=page">
- <h3 class="page-title">{{$title}}</h3>
-
- <div class="page-author"><a class=="page-author-link" href="{{$auth_url}}">{{$author}}</a></div>
- <div class="page-date">{{$date}}</div>
- <div class="page-body">body</div>
-</div>
diff --git a/view/tpl/smarty3/pagetypes.tpl b/view/tpl/smarty3/pagetypes.tpl
deleted file mode 100644
index 15cd3047a..000000000
--- a/view/tpl/smarty3/pagetypes.tpl
+++ /dev/null
@@ -1,10 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
- {{include file="field_radio.tpl" field=$page_normal}}
- {{include file="field_radio.tpl" field=$page_community}}
- {{include file="field_radio.tpl" field=$page_prvgroup}}
- {{include file="field_radio.tpl" field=$page_soapbox}}
- {{include file="field_radio.tpl" field=$page_freelove}}
diff --git a/view/tpl/smarty3/peoplefind.tpl b/view/tpl/smarty3/peoplefind.tpl
deleted file mode 100644
index 5417ee0ed..000000000
--- a/view/tpl/smarty3/peoplefind.tpl
+++ /dev/null
@@ -1,19 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<div id="peoplefind-sidebar" class="widget">
- <h3>{{$findpeople}}</h3>
- <div id="peoplefind-desc">{{$desc}}</div>
- <form action="dirfind" method="post" />
- <input id="side-peoplefind-url" type="text" name="search" size="24" title="{{$hint}}" /><input id="side-peoplefind-submit" type="submit" name="submit" value="{{$findthem}}" />
- </form>
- <div class="side-link" id="side-match-link"><a href="match" >{{$similar}}</a></div>
- <div class="side-link" id="side-suggest-link"><a href="suggest" >{{$suggest}}</a></div>
- <div class="side-link" id="side-random-profile-link" ><a href="randprof" target="extlink" >{{$random}}</a></div>
- {{if $inv}}
- <div class="side-link" id="side-invite-link" ><a href="invite" >{{$inv}}</a></div>
- {{/if}}
-</div>
-
diff --git a/view/tpl/smarty3/photo_album.tpl b/view/tpl/smarty3/photo_album.tpl
deleted file mode 100644
index 56ee6b61c..000000000
--- a/view/tpl/smarty3/photo_album.tpl
+++ /dev/null
@@ -1,12 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<div class="photo-album-image-wrapper" id="photo-album-image-wrapper-{{$id}}">
- <a href="{{$photolink}}" class="photo-album-photo-link" id="photo-album-photo-link-{{$id}}" title="{{$phototitle}}">
- <img src="{{$imgsrc}}" alt="{{$imgalt}}" title="{{$phototitle}}" class="photo-album-photo lframe resize{{$twist}}" id="photo-album-photo-{{$id}}" />
- <p class='caption'>{{$desc}}</p>
- </a>
-</div>
-<div class="photo-album-image-wrapper-end"></div>
diff --git a/view/tpl/smarty3/photo_albums.tpl b/view/tpl/smarty3/photo_albums.tpl
deleted file mode 100644
index 8a31e030c..000000000
--- a/view/tpl/smarty3/photo_albums.tpl
+++ /dev/null
@@ -1,18 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<div id="side-bar-photos-albums" class="widget">
-<h3><a href="{{$baseurl}}/photos/{{$nick}}" title="{{$title}}" >{{$title}}</a></h3>
-{{if $albums}}
-<ul>
-{{foreach $albums as $al}}
-<li><a href="{{$baseurl}}/photos/{{$nick}}/{{$al.bin2hex}}">{{$al.album}}</a></li>
-{{/foreach}}
-</ul>
-{{/if}}
-{{if $upload}}
-<div id="photo-albums-upload-link"><a href="{{$baseurl}}/photos/{{$nick}}/upload" title="{{$upload}}">{{$upload}}</a></div>
-{{/if}}
-</div>
diff --git a/view/tpl/smarty3/photo_drop.tpl b/view/tpl/smarty3/photo_drop.tpl
deleted file mode 100644
index ed500fd0a..000000000
--- a/view/tpl/smarty3/photo_drop.tpl
+++ /dev/null
@@ -1,9 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<div class="wall-item-delete-wrapper" id="wall-item-delete-wrapper-{{$id}}" >
- <a href="item/drop/{{$id}}" onclick="return confirmDelete();" class="icon drophide" title="{{$delete}}" onmouseover="imgbright(this);" onmouseout="imgdull(this);" ></a>
-</div>
-<div class="wall-item-delete-end"></div>
diff --git a/view/tpl/smarty3/photo_edit.tpl b/view/tpl/smarty3/photo_edit.tpl
deleted file mode 100644
index fefe7f10b..000000000
--- a/view/tpl/smarty3/photo_edit.tpl
+++ /dev/null
@@ -1,55 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-
-<form action="photos/{{$nickname}}/{{$resource_id}}" method="post" id="photo_edit_form" >
-
- <input type="hidden" name="item_id" value="{{$item_id}}" />
-
- <label id="photo-edit-albumname-label" for="photo-edit-albumname">{{$newalbum}}</label>
- <input id="photo-edit-albumname" type="text" size="32" name="albname" value="{{$album}}" />
-
- <div id="photo-edit-albumname-end"></div>
-
- <label id="photo-edit-caption-label" for="photo-edit-caption">{{$capt_label}}</label>
- <input id="photo-edit-caption" type="text" size="84" name="desc" value="{{$caption}}" />
-
- <div id="photo-edit-caption-end"></div>
-
- <label id="photo-edit-tags-label" for="photo-edit-newtag" >{{$tag_label}}</label>
- <input name="newtag" id="photo-edit-newtag" size="84" title="{{$help_tags}}" type="text" />
-
- <div id="photo-edit-tags-end"></div>
- <div id="photo-edit-rotate-wrapper">
- <div id="photo-edit-rotate-label">
- {{$rotatecw}}<br>
- {{$rotateccw}}
- </div>
- <input type="radio" name="rotate" value="1" /><br>
- <input type="radio" name="rotate" value="2" />
- </div>
- <div id="photo-edit-rotate-end"></div>
-
- <div id="photo-edit-perms" class="photo-edit-perms" >
- <a href="#photo-edit-perms-select" id="photo-edit-perms-menu" class="button popupbox" title="{{$permissions}}"/>
- <span id="jot-perms-icon" class="icon {{$lockstate}}" ></span>{{$permissions}}
- </a>
- <div id="photo-edit-perms-menu-end"></div>
-
- <div style="display: none;">
- <div id="photo-edit-perms-select" >
- {{$aclselect}}
- </div>
- </div>
- </div>
- <div id="photo-edit-perms-end"></div>
-
- <input id="photo-edit-submit-button" type="submit" name="submit" value="{{$submit}}" />
- <input id="photo-edit-delete-button" type="submit" name="delete" value="{{$delete}}" onclick="return confirmDelete()"; />
-
- <div id="photo-edit-end"></div>
-</form>
-
-
diff --git a/view/tpl/smarty3/photo_item.tpl b/view/tpl/smarty3/photo_item.tpl
deleted file mode 100644
index 7d6ac96ee..000000000
--- a/view/tpl/smarty3/photo_item.tpl
+++ /dev/null
@@ -1,27 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<div class="wall-item-outside-wrapper{{$indent}}" id="wall-item-outside-wrapper-{{$id}}" >
- <div class="wall-item-photo-wrapper" id="wall-item-photo-wrapper-{{$id}}" >
- <a href="{{$profile_url}}" title="View {{$name}}'s profile" class="wall-item-photo-link" id="wall-item-photo-link-{{$id}}">
- <img src="{{$thumb}}" class="wall-item-photo" id="wall-item-photo-{{$id}}" style="height: 80px; width: 80px;" alt="{{$name}}" /></a>
- </div>
-
- <div class="wall-item-wrapper" id="wall-item-wrapper-{{$id}}" >
- <a href="{{$profile_url}}" title="View {{$name}}'s profile" class="wall-item-name-link"><span class="wall-item-name" id="wall-item-name-{{$id}}" >{{$name}}</span></a>
- <div class="wall-item-ago" id="wall-item-ago-{{$id}}">{{$ago}}</div>
- </div>
- <div class="wall-item-content" id="wall-item-content-{{$id}}" >
- <div class="wall-item-title" id="wall-item-title-{{$id}}">{{$title}}</div>
- <div class="wall-item-body" id="wall-item-body-{{$id}}" >{{$body}}</div>
- </div>
- {{$drop}}
- <div class="wall-item-wrapper-end"></div>
- <div class="wall-item-comment-separator"></div>
- {{$comment}}
-
-<div class="wall-item-outside-wrapper-end{{$indent}}" ></div>
-</div>
-
diff --git a/view/tpl/smarty3/photo_top.tpl b/view/tpl/smarty3/photo_top.tpl
deleted file mode 100644
index b34e1e639..000000000
--- a/view/tpl/smarty3/photo_top.tpl
+++ /dev/null
@@ -1,13 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-
-<div class="photo-top-image-wrapper lframe" id="photo-top-image-wrapper-{{$photo.id}}">
- <a href="{{$photo.link}}" class="photo-top-photo-link" id="photo-top-photo-link-{{$photo.id}}" title="{{$photo.title}}">
- <img src="{{$photo.src}}" alt="{{$photo.alt}}" title="{{$photo.title}}" class="photo-top-photo{{$photo.twist}}" id="photo-top-photo-{{$photo.id}}" />
- </a>
- <div class="photo-top-album-name"><a href="{{$photo.album.link}}" class="photo-top-album-link" title="{{$photo.album.alt}}" >{{$photo.album.name}}</a></div>
-</div>
-
diff --git a/view/tpl/smarty3/photo_view.tpl b/view/tpl/smarty3/photo_view.tpl
deleted file mode 100644
index 94f71bdd8..000000000
--- a/view/tpl/smarty3/photo_view.tpl
+++ /dev/null
@@ -1,42 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<div id="live-display"></div>
-<h3><a href="{{$album.0}}">{{$album.1}}</a></h3>
-
-<div id="photo-edit-link-wrap">
-{{if $tools}}
-<a id="photo-edit-link" href="{{$tools.edit.0}}">{{$tools.edit.1}}</a>
-|
-<a id="photo-toprofile-link" href="{{$tools.profile.0}}">{{$tools.profile.1}}</a>
-{{/if}}
-{{if $lock}} | <img src="images/lock_icon.gif" class="lockview" alt="{{$lock}}" onclick="lockview(event,'photo/{{$id}}');" /> {{/if}}
-</div>
-
-{{if $prevlink}}<div id="photo-prev-link"><a href="{{$prevlink.0}}">{{$prevlink.1}}</a></div>{{/if}}
-<div id="photo-photo"><a href="{{$photo.href}}" title="{{$photo.title}}"><img src="{{$photo.src}}" /></a></div>
-{{if $nextlink}}<div id="photo-next-link"><a href="{{$nextlink.0}}">{{$nextlink.1}}</a></div>{{/if}}
-<div id="photo-photo-end"></div>
-<div id="photo-caption">{{$desc}}</div>
-{{if $tags}}
-<div id="in-this-photo-text">{{$tags.0}}</div>
-<div id="in-this-photo">{{$tags.1}}</div>
-{{/if}}
-{{if $tags.2}}<div id="tag-remove"><a href="{{$tags.2}}">{{$tags.3}}</a></div>{{/if}}
-
-{{if $edit}}{{$edit}}{{/if}}
-
-{{if $likebuttons}}
-<div id="photo-like-div">
- {{$likebuttons}}
- {{$like}}
- {{$dislike}}
-</div>
-{{/if}}
-
-{{$comments}}
-
-{{$paginate}}
-
diff --git a/view/tpl/smarty3/photos_recent.tpl b/view/tpl/smarty3/photos_recent.tpl
deleted file mode 100644
index cb2411df3..000000000
--- a/view/tpl/smarty3/photos_recent.tpl
+++ /dev/null
@@ -1,16 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<h3>{{$title}}</h3>
-{{if $can_post}}
-<a id="photo-top-upload-link" href="{{$upload.1}}">{{$upload.0}}</a>
-{{/if}}
-
-<div class="photos">
-{{foreach $photos as $photo}}
- {{include file="photo_top.tpl"}}
-{{/foreach}}
-</div>
-<div class="photos-end"></div>
diff --git a/view/tpl/smarty3/photos_upload.tpl b/view/tpl/smarty3/photos_upload.tpl
deleted file mode 100644
index 713e1169d..000000000
--- a/view/tpl/smarty3/photos_upload.tpl
+++ /dev/null
@@ -1,51 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<h3>{{$pagename}}</h3>
-
-<div id="photos-usage-message">{{$usage}}</div>
-
-<form action="photos/{{$nickname}}" enctype="multipart/form-data" method="post" name="photos-upload-form" id="photos-upload-form" >
- <div id="photos-upload-new-wrapper" >
- <div id="photos-upload-newalbum-div">
- <label id="photos-upload-newalbum-text" for="photos-upload-newalbum" >{{$newalbum}}</label>
- </div>
- <input id="photos-upload-newalbum" type="text" name="newalbum" />
- </div>
- <div id="photos-upload-new-end"></div>
- <div id="photos-upload-exist-wrapper">
- <div id="photos-upload-existing-album-text">{{$existalbumtext}}</div>
- {{$albumselect}}
- </div>
- <div id="photos-upload-exist-end"></div>
-
- <div id="photos-upload-noshare-div" class="photos-upload-noshare-div" >
- <input id="photos-upload-noshare" type="checkbox" name="not_visible" value="1" />
- <label id="photos-upload-noshare-text" for="photos-upload-noshare" >{{$nosharetext}}</label>
- </div>
-
-
- <div id="photos-upload-perms" class="photos-upload-perms" >
- <a href="#photos-upload-permissions-wrapper" id="photos-upload-perms-menu" class="button popupbox" />
- <span id="jot-perms-icon" class="icon {{$lockstate}}" ></span>{{$permissions}}
- </a>
- </div>
- <div id="photos-upload-perms-end"></div>
-
- <div style="display: none;">
- <div id="photos-upload-permissions-wrapper">
- {{$aclselect}}
- </div>
- </div>
-
- <div id="photos-upload-spacer"></div>
-
- {{$uploader}}
-
- {{$default}}
-
- <div class="photos-upload-end" ></div>
-</form>
-
diff --git a/view/tpl/smarty3/poco_entry_xml.tpl b/view/tpl/smarty3/poco_entry_xml.tpl
deleted file mode 100644
index d6e139cb5..000000000
--- a/view/tpl/smarty3/poco_entry_xml.tpl
+++ /dev/null
@@ -1,12 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<entry>
-{{if $entry.id}}<id>{{$entry.id}}</id>{{/if}}
-{{if $entry.displayName}}<displayName>{{$entry.displayName}}</displayName>{{/if}}
-{{if $entry.preferredUsername}}<preferredUsername>{{$entry.preferredUsername}}</preferredUsername>{{/if}}
-{{if $entry.urls}}{{foreach $entry.urls as $url}}<urls><value>{{$url.value}}</value><type>{{$url.type}}</type></urls>{{/foreach}}{{/if}}
-{{if $entry.photos}}{{foreach $entry.photos as $photo}}<photos><value>{{$photo.value}}</value><type>{{$photo.type}}</type></photos>{{/foreach}}{{/if}}
-</entry>
diff --git a/view/tpl/smarty3/poco_xml.tpl b/view/tpl/smarty3/poco_xml.tpl
deleted file mode 100644
index b8cd8fc08..000000000
--- a/view/tpl/smarty3/poco_xml.tpl
+++ /dev/null
@@ -1,23 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<?xml version="1.0" encoding="utf-8"?>
-<response>
-{{if $response.sorted}}<sorted>{{$response.sorted}}</sorted>{{/if}}
-{{if $response.filtered}}<filtered>{{$response.filtered}}</filtered>{{/if}}
-{{if $response.updatedSince}}<updatedSince>{{$response.updatedSince}}</updatedSince>{{/if}}
-<startIndex>{{$response.startIndex}}</startIndex>
-<itemsPerPage>{{$response.itemsPerPage}}</itemsPerPage>
-<totalResults>{{$response.totalResults}}</totalResults>
-
-
-{{if $response.totalResults}}
-{{foreach $response.entry as $entry}}
-{{include file="poco_entry_xml.tpl"}}
-{{/foreach}}
-{{else}}
-<entry></entry>
-{{/if}}
-</response>
diff --git a/view/tpl/smarty3/poke_content.tpl b/view/tpl/smarty3/poke_content.tpl
deleted file mode 100644
index 6235aca0c..000000000
--- a/view/tpl/smarty3/poke_content.tpl
+++ /dev/null
@@ -1,37 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<h3>{{$title}}</h3>
-
-<div id="poke-desc">{{$desc}}</div>
-
-<form action="poke" method="get">
-<br />
-<br />
-
-<div id="poke-recip-label">{{$clabel}}</div>
-<br />
-<input id="poke-recip" type="text" size="64" maxlength="255" value="{{$name}}" name="pokename" autocomplete="off" />
-<input id="poke-recip-complete" type="hidden" value="{{$id}}" name="cid" />
-<input id="poke-parent" type="hidden" value="{{$parent}}" name="parent" />
-<br />
-<br />
-<div id="poke-action-label">{{$choice}}</div>
-<br />
-<br />
-<select name="verb" id="poke-verb-select" >
-{{foreach $verbs as $v}}
-<option value="{{$v.0}}">{{$v.1}}</option>
-{{/foreach}}
-</select>
-<br />
-<br />
-<div id="poke-private-desc">{{$prv_desc}}</div>
-<input type="checkbox" name="private" {{if $parent}}disabled="disabled"{{/if}} value="1" />
-<br />
-<br />
-<input type="submit" name="submit" value="{{$submit}}" />
-</form>
-
diff --git a/view/tpl/smarty3/posted_date_widget.tpl b/view/tpl/smarty3/posted_date_widget.tpl
deleted file mode 100644
index 2f5838edb..000000000
--- a/view/tpl/smarty3/posted_date_widget.tpl
+++ /dev/null
@@ -1,14 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<div id="datebrowse-sidebar" class="widget">
- <h3>{{$title}}</h3>
-<script>function dateSubmit(dateurl) { window.location.href = dateurl; } </script>
-<select id="posted-date-selector" name="posted-date-select" onchange="dateSubmit($(this).val());" size="{{$size}}">
-{{foreach $dates as $d}}
-<option value="{{$url}}/{{$d.1}}/{{$d.2}}" >{{$d.0}}</option>
-{{/foreach}}
-</select>
-</div>
diff --git a/view/tpl/smarty3/profed_head.tpl b/view/tpl/smarty3/profed_head.tpl
deleted file mode 100644
index 37a038d4f..000000000
--- a/view/tpl/smarty3/profed_head.tpl
+++ /dev/null
@@ -1,41 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<script language="javascript" type="text/javascript"
- src="{{$baseurl}}/library/tinymce/jscripts/tiny_mce/tiny_mce_src.js"></script>
- <script language="javascript" type="text/javascript">
-
-
-tinyMCE.init({
- theme : "advanced",
- mode : "{{$editselect}}",
- plugins : "bbcode,paste",
- theme_advanced_buttons1 : "bold,italic,underline,undo,redo,link,unlink,image,forecolor,formatselect,code",
- theme_advanced_buttons2 : "",
- theme_advanced_buttons3 : "",
- theme_advanced_toolbar_location : "top",
- theme_advanced_toolbar_align : "center",
- theme_advanced_blockformats : "blockquote,code",
- gecko_spellcheck : true,
- paste_text_sticky : true,
- entity_encoding : "raw",
- add_unload_trigger : false,
- remove_linebreaks : false,
- force_p_newlines : false,
- force_br_newlines : true,
- forced_root_block : '',
- content_css: "{{$baseurl}}/view/custom_tinymce.css",
- theme_advanced_path : false,
- setup : function(ed) {
- ed.onInit.add(function(ed) {
- ed.pasteAsPlainText = true;
- });
- }
-
-});
-
-
-</script>
-
diff --git a/view/tpl/smarty3/profile-hide-friends.tpl b/view/tpl/smarty3/profile-hide-friends.tpl
deleted file mode 100644
index 6e3d395d0..000000000
--- a/view/tpl/smarty3/profile-hide-friends.tpl
+++ /dev/null
@@ -1,21 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<p id="hide-friends-text">
-{{$desc}}
-</p>
-
- <div id="hide-friends-yes-wrapper">
- <label id="hide-friends-yes-label" for="hide-friends-yes">{{$yes_str}}</label>
- <input type="radio" name="hide-friends" id="hide-friends-yes" {{$yes_selected}} value="1" />
-
- <div id="hide-friends-break" ></div>
- </div>
- <div id="hide-friends-no-wrapper">
- <label id="hide-friends-no-label" for="hide-friends-no">{{$no_str}}</label>
- <input type="radio" name="hide-friends" id="hide-friends-no" {{$no_selected}} value="0" />
-
- <div id="hide-friends-end"></div>
- </div>
diff --git a/view/tpl/smarty3/profile-hide-wall.tpl b/view/tpl/smarty3/profile-hide-wall.tpl
deleted file mode 100644
index 755908d17..000000000
--- a/view/tpl/smarty3/profile-hide-wall.tpl
+++ /dev/null
@@ -1,21 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<p id="hide-wall-text">
-{{$desc}}
-</p>
-
- <div id="hide-wall-yes-wrapper">
- <label id="hide-wall-yes-label" for="hide-wall-yes">{{$yes_str}}</label>
- <input type="radio" name="hidewall" id="hide-wall-yes" {{$yes_selected}} value="1" />
-
- <div id="hide-wall-break" ></div>
- </div>
- <div id="hide-wall-no-wrapper">
- <label id="hide-wall-no-label" for="hide-wall-no">{{$no_str}}</label>
- <input type="radio" name="hidewall" id="hide-wall-no" {{$no_selected}} value="0" />
-
- <div id="hide-wall-end"></div>
- </div>
diff --git a/view/tpl/smarty3/profile-in-directory.tpl b/view/tpl/smarty3/profile-in-directory.tpl
deleted file mode 100644
index 0efd1bf5c..000000000
--- a/view/tpl/smarty3/profile-in-directory.tpl
+++ /dev/null
@@ -1,21 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<p id="profile-in-directory">
-{{$desc}}
-</p>
-
- <div id="profile-in-dir-yes-wrapper">
- <label id="profile-in-dir-yes-label" for="profile-in-dir-yes">{{$yes_str}}</label>
- <input type="radio" name="profile_in_directory" id="profile-in-dir-yes" {{$yes_selected}} value="1" />
-
- <div id="profile-in-dir-break" ></div>
- </div>
- <div id="profile-in-dir-no-wrapper">
- <label id="profile-in-dir-no-label" for="profile-in-dir-no">{{$no_str}}</label>
- <input type="radio" name="profile_in_directory" id="profile-in-dir-no" {{$no_selected}} value="0" />
-
- <div id="profile-in-dir-end"></div>
- </div>
diff --git a/view/tpl/smarty3/profile-in-netdir.tpl b/view/tpl/smarty3/profile-in-netdir.tpl
deleted file mode 100644
index b9cb456ea..000000000
--- a/view/tpl/smarty3/profile-in-netdir.tpl
+++ /dev/null
@@ -1,21 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<p id="profile-in-directory">
-{{$desc}}
-</p>
-
- <div id="profile-in-netdir-yes-wrapper">
- <label id="profile-in-netdir-yes-label" for="profile-in-netdir-yes">{{$yes_str}}</label>
- <input type="radio" name="profile_in_netdirectory" id="profile-in-netdir-yes" {{$yes_selected}} value="1" />
-
- <div id="profile-in-netdir-break" ></div>
- </div>
- <div id="profile-in-netdir-no-wrapper">
- <label id="profile-in-netdir-no-label" for="profile-in-netdir-no">{{$no_str}}</label>
- <input type="radio" name="profile_in_netdirectory" id="profile-in-netdir-no" {{$no_selected}} value="0" />
-
- <div id="profile-in-netdir-end"></div>
- </div>
diff --git a/view/tpl/smarty3/profile_advanced.tpl b/view/tpl/smarty3/profile_advanced.tpl
deleted file mode 100644
index f8743c011..000000000
--- a/view/tpl/smarty3/profile_advanced.tpl
+++ /dev/null
@@ -1,175 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<h2>{{$title}}</h2>
-
-<dl id="aprofile-fullname" class="aprofile">
- <dt>{{$profile.fullname.0}}</dt>
- <dd>{{$profile.fullname.1}}</dd>
-</dl>
-
-{{if $profile.gender}}
-<dl id="aprofile-gender" class="aprofile">
- <dt>{{$profile.gender.0}}</dt>
- <dd>{{$profile.gender.1}}</dd>
-</dl>
-{{/if}}
-
-{{if $profile.birthday}}
-<dl id="aprofile-birthday" class="aprofile">
- <dt>{{$profile.birthday.0}}</dt>
- <dd>{{$profile.birthday.1}}</dd>
-</dl>
-{{/if}}
-
-{{if $profile.age}}
-<dl id="aprofile-age" class="aprofile">
- <dt>{{$profile.age.0}}</dt>
- <dd>{{$profile.age.1}}</dd>
-</dl>
-{{/if}}
-
-{{if $profile.marital}}
-<dl id="aprofile-marital" class="aprofile">
- <dt><span class="heart">&hearts;</span> {{$profile.marital.0}}</dt>
- <dd>{{$profile.marital.1}}{{if $profile.marital.with}} ({{$profile.marital.with}}){{/if}}{{if $profile.howlong}} {{$profile.howlong}}{{/if}}</dd>
-</dl>
-{{/if}}
-
-{{if $profile.sexual}}
-<dl id="aprofile-sexual" class="aprofile">
- <dt>{{$profile.sexual.0}}</dt>
- <dd>{{$profile.sexual.1}}</dd>
-</dl>
-{{/if}}
-
-{{if $profile.keywords}}
-<dl id="aprofile-tags" class="aprofile">
- <dt>{{$profile.keywords.0}}</dt>
- <dd>{{$profile.keywords.1}}</dd>
-</dl>
-{{/if}}
-
-{{if $profile.homepage}}
-<dl id="aprofile-homepage" class="aprofile">
- <dt>{{$profile.homepage.0}}</dt>
- <dd>{{$profile.homepage.1}}</dd>
-</dl>
-{{/if}}
-
-{{if $profile.hometown}}
-<dl id="aprofile-hometown" class="aprofile">
- <dt>{{$profile.hometown.0}}</dt>
- <dd>{{$profile.hometown.1}}</dd>
-</dl>
-{{/if}}
-
-{{if $profile.politic}}
-<dl id="aprofile-politic" class="aprofile">
- <dt>{{$profile.politic.0}}</dt>
- <dd>{{$profile.politic.1}}</dd>
-</dl>
-{{/if}}
-
-{{if $profile.religion}}
-<dl id="aprofile-religion" class="aprofile">
- <dt>{{$profile.religion.0}}</dt>
- <dd>{{$profile.religion.1}}</dd>
-</dl>
-{{/if}}
-
-{{if $profile.about}}
-<dl id="aprofile-about" class="aprofile">
- <dt>{{$profile.about.0}}</dt>
- <dd>{{$profile.about.1}}</dd>
-</dl>
-{{/if}}
-
-{{if $profile.interest}}
-<dl id="aprofile-interest" class="aprofile">
- <dt>{{$profile.interest.0}}</dt>
- <dd>{{$profile.interest.1}}</dd>
-</dl>
-{{/if}}
-
-{{if $profile.likes}}
-<dl id="aprofile-likes" class="aprofile">
- <dt>{{$profile.likes.0}}</dt>
- <dd>{{$profile.likes.1}}</dd>
-</dl>
-{{/if}}
-
-{{if $profile.dislikes}}
-<dl id="aprofile-dislikes" class="aprofile">
- <dt>{{$profile.dislikes.0}}</dt>
- <dd>{{$profile.dislikes.1}}</dd>
-</dl>
-{{/if}}
-
-{{if $profile.contact}}
-<dl id="aprofile-contact" class="aprofile">
- <dt>{{$profile.contact.0}}</dt>
- <dd>{{$profile.contact.1}}</dd>
-</dl>
-{{/if}}
-
-
-{{if $profile.music}}
-<dl id="aprofile-music" class="aprofile">
- <dt>{{$profile.music.0}}</dt>
- <dd>{{$profile.music.1}}</dd>
-</dl>
-{{/if}}
-
-
-{{if $profile.book}}
-<dl id="aprofile-book" class="aprofile">
- <dt>{{$profile.book.0}}</dt>
- <dd>{{$profile.book.1}}</dd>
-</dl>
-{{/if}}
-
-
-{{if $profile.tv}}
-<dl id="aprofile-tv" class="aprofile">
- <dt>{{$profile.tv.0}}</dt>
- <dd>{{$profile.tv.1}}</dd>
-</dl>
-{{/if}}
-
-
-{{if $profile.film}}
-<dl id="aprofile-film" class="aprofile">
- <dt>{{$profile.film.0}}</dt>
- <dd>{{$profile.film.1}}</dd>
-</dl>
-{{/if}}
-
-
-{{if $profile.romance}}
-<dl id="aprofile-romance" class="aprofile">
- <dt>{{$profile.romance.0}}</dt>
- <dd>{{$profile.romance.1}}</dd>
-</dl>
-{{/if}}
-
-
-{{if $profile.work}}
-<dl id="aprofile-work" class="aprofile">
- <dt>{{$profile.work.0}}</dt>
- <dd>{{$profile.work.1}}</dd>
-</dl>
-{{/if}}
-
-{{if $profile.education}}
-<dl id="aprofile-education" class="aprofile">
- <dt>{{$profile.education.0}}</dt>
- <dd>{{$profile.education.1}}</dd>
-</dl>
-{{/if}}
-
-
-
-
diff --git a/view/tpl/smarty3/profile_edit.tpl b/view/tpl/smarty3/profile_edit.tpl
deleted file mode 100644
index 3a2652a68..000000000
--- a/view/tpl/smarty3/profile_edit.tpl
+++ /dev/null
@@ -1,316 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-{{$default}}
-
-<h1>{{$banner}}</h1>
-
-<div id="profile-edit-links">
-<ul>
-<li><a href="profile_photo" id="profile-photo_upload-link" title="{{$profpic}}">{{$profpic}}</a></li>
-<li><a href="profile/{{$profile_id}}/view?tab=profile" id="profile-edit-view-link" title="{{$viewprof}}">{{$viewprof}}</a></li>
-<li><a href="{{$profile_clone_link}}" id="profile-edit-clone-link" title="{{$cr_prof}}">{{$cl_prof}}</a></li>
-<li></li>
-<li><a href="{{$profile_drop_link}}" id="profile-edit-drop-link" title="{{$del_prof}}" {{$disabled}} >{{$del_prof}}</a></li>
-
-</ul>
-</div>
-
-<div id="profile-edit-links-end"></div>
-
-
-<div id="profile-edit-wrapper" >
-<form id="profile-edit-form" name="form1" action="profiles/{{$profile_id}}" method="post" >
-<input type='hidden' name='form_security_token' value='{{$form_security_token}}'>
-
-<div id="profile-edit-profile-name-wrapper" >
-<label id="profile-edit-profile-name-label" for="profile-edit-profile-name" >{{$lbl_profname}} </label>
-<input type="text" size="32" name="profile_name" id="profile-edit-profile-name" value="{{$profile_name}}" /><div class="required">*</div>
-</div>
-<div id="profile-edit-profile-name-end"></div>
-
-<div id="profile-edit-name-wrapper" >
-<label id="profile-edit-name-label" for="profile-edit-name" >{{$lbl_fullname}} </label>
-<input type="text" size="32" name="name" id="profile-edit-name" value="{{$name}}" />
-</div>
-<div id="profile-edit-name-end"></div>
-
-<div id="profile-edit-pdesc-wrapper" >
-<label id="profile-edit-pdesc-label" for="profile-edit-pdesc" >{{$lbl_title}} </label>
-<input type="text" size="32" name="pdesc" id="profile-edit-pdesc" value="{{$pdesc}}" />
-</div>
-<div id="profile-edit-pdesc-end"></div>
-
-
-<div id="profile-edit-gender-wrapper" >
-<label id="profile-edit-gender-label" for="gender-select" >{{$lbl_gender}} </label>
-{{$gender}}
-</div>
-<div id="profile-edit-gender-end"></div>
-
-<div id="profile-edit-dob-wrapper" >
-<label id="profile-edit-dob-label" for="dob-select" >{{$lbl_bd}} </label>
-<div id="profile-edit-dob" >
-{{$dob}} {{$age}}
-</div>
-</div>
-<div id="profile-edit-dob-end"></div>
-
-{{$hide_friends}}
-
-<div class="profile-edit-submit-wrapper" >
-<input type="submit" name="submit" class="profile-edit-submit-button" value="{{$submit}}" />
-</div>
-<div class="profile-edit-submit-end"></div>
-
-
-<div id="profile-edit-address-wrapper" >
-<label id="profile-edit-address-label" for="profile-edit-address" >{{$lbl_address}} </label>
-<input type="text" size="32" name="address" id="profile-edit-address" value="{{$address}}" />
-</div>
-<div id="profile-edit-address-end"></div>
-
-<div id="profile-edit-locality-wrapper" >
-<label id="profile-edit-locality-label" for="profile-edit-locality" >{{$lbl_city}} </label>
-<input type="text" size="32" name="locality" id="profile-edit-locality" value="{{$locality}}" />
-</div>
-<div id="profile-edit-locality-end"></div>
-
-
-<div id="profile-edit-postal-code-wrapper" >
-<label id="profile-edit-postal-code-label" for="profile-edit-postal-code" >{{$lbl_zip}} </label>
-<input type="text" size="32" name="postal_code" id="profile-edit-postal-code" value="{{$postal_code}}" />
-</div>
-<div id="profile-edit-postal-code-end"></div>
-
-
-<div id="profile-edit-region-wrapper" >
-<label id="profile-edit-region-label" for="profile-edit-region" >{{$lbl_region}} </label>
-<input type="text" size="32" name="region" id="profile-edit-region" value="{{$region}}" />
-</div>
-<div id="profile-edit-region-end"></div>
-
-<div id="profile-edit-country-name-wrapper" >
-<label id="profile-edit-country-name-label" for="profile-edit-country-name" >{{$lbl_country}} </label>
-<input type="text" size="32" name="country_name" id="profile-edit-country-name" value="{{$country_name}}" />
-</div>
-<div id="profile-edit-country-name-end"></div>
-
-<div id="profile-edit-hometown-wrapper" >
-<label id="profile-edit-hometown-label" for="profile-edit-hometown" >{{$lbl_hometown}} </label>
-<input type="text" size="32" name="hometown" id="profile-edit-hometown" value="{{$hometown}}" />
-</div>
-<div id="profile-edit-hometown-end"></div>
-
-<div class="profile-edit-submit-wrapper" >
-<input type="submit" name="submit" class="profile-edit-submit-button" value="{{$submit}}" />
-</div>
-<div class="profile-edit-submit-end"></div>
-
-<div id="profile-edit-marital-wrapper" >
-<label id="profile-edit-marital-label" for="profile-edit-marital" >{{$lbl_marital}} </label>
-{{$marital}}
-</div>
-<label id="profile-edit-with-label" for="profile-edit-with" > {{$lbl_with}} </label>
-<input type="text" size="32" name="with" id="profile-edit-with" title="{{$lbl_ex1}}" value="{{$with}}" />
-<label id="profile-edit-howlong-label" for="profile-edit-howlong" > {{$lbl_howlong}} </label>
-<input type="text" size="32" name="howlong" id="profile-edit-howlong" title="{{$lbl_howlong}}" value="{{$howlong}}" />
-
-<div id="profile-edit-marital-end"></div>
-
-<div id="profile-edit-sexual-wrapper" >
-<label id="profile-edit-sexual-label" for="sexual-select" >{{$lbl_sexual}} </label>
-{{$sexual}}
-</div>
-<div id="profile-edit-sexual-end"></div>
-
-
-
-<div id="profile-edit-homepage-wrapper" >
-<label id="profile-edit-homepage-label" for="profile-edit-homepage" >{{$lbl_homepage}} </label>
-<input type="text" size="32" name="homepage" id="profile-edit-homepage" value="{{$homepage}}" />
-</div>
-<div id="profile-edit-homepage-end"></div>
-
-<div id="profile-edit-politic-wrapper" >
-<label id="profile-edit-politic-label" for="profile-edit-politic" >{{$lbl_politic}} </label>
-<input type="text" size="32" name="politic" id="profile-edit-politic" value="{{$politic}}" />
-</div>
-<div id="profile-edit-politic-end"></div>
-
-<div id="profile-edit-religion-wrapper" >
-<label id="profile-edit-religion-label" for="profile-edit-religion" >{{$lbl_religion}} </label>
-<input type="text" size="32" name="religion" id="profile-edit-religion" value="{{$religion}}" />
-</div>
-<div id="profile-edit-religion-end"></div>
-
-<div id="profile-edit-pubkeywords-wrapper" >
-<label id="profile-edit-pubkeywords-label" for="profile-edit-pubkeywords" >{{$lbl_pubkey}} </label>
-<input type="text" size="32" name="keywords" id="profile-edit-pubkeywords" title="{{$lbl_ex2}}" value="{{$keywords}}" />
-</div><div id="profile-edit-pubkeywords-desc">{{$lbl_pubdsc}}</div>
-<div id="profile-edit-pubkeywords-end"></div>
-
-<div class="profile-edit-submit-wrapper" >
-<input type="submit" name="submit" class="profile-edit-submit-button" value="{{$submit}}" />
-</div>
-<div class="profile-edit-submit-end"></div>
-
-<div id="about-jot-wrapper" >
-<p id="about-jot-desc" >
-{{$lbl_about}}
-</p>
-
-<textarea rows="10" cols="72" id="profile-about-text" name="about" >{{$about}}</textarea>
-
-</div>
-<div id="about-jot-end"></div>
-
-
-<div id="interest-jot-wrapper" >
-<p id="interest-jot-desc" >
-{{$lbl_hobbies}}
-</p>
-
-<textarea rows="10" cols="72" id="interest-jot-text" name="interest" >{{$interest}}</textarea>
-
-</div>
-<div id="interest-jot-end"></div>
-
-
-<div id="likes-jot-wrapper" >
-<p id="likes-jot-desc" >
-{{$lbl_likes}}
-</p>
-
-<textarea rows="10" cols="72" id="likes-jot-text" name="likes" >{{$likes}}</textarea>
-
-</div>
-<div id="likes-jot-end"></div>
-
-
-<div id="dislikes-jot-wrapper" >
-<p id="dislikes-jot-desc" >
-{{$lbl_dislikes}}
-</p>
-
-<textarea rows="10" cols="72" id="dislikes-jot-text" name="dislikes" >{{$dislikes}}</textarea>
-
-</div>
-<div id="dislikes-jot-end"></div>
-
-
-<div id="contact-jot-wrapper" >
-<p id="contact-jot-desc" >
-{{$lbl_social}}
-</p>
-
-<textarea rows="10" cols="72" id="contact-jot-text" name="contact" >{{$contact}}</textarea>
-
-</div>
-<div id="contact-jot-end"></div>
-
-
-<div class="profile-edit-submit-wrapper" >
-<input type="submit" name="submit" class="profile-edit-submit-button" value="{{$submit}}" />
-</div>
-<div class="profile-edit-submit-end"></div>
-
-
-<div id="music-jot-wrapper" >
-<p id="music-jot-desc" >
-{{$lbl_music}}
-</p>
-
-<textarea rows="10" cols="72" id="music-jot-text" name="music" >{{$music}}</textarea>
-
-</div>
-<div id="music-jot-end"></div>
-
-<div id="book-jot-wrapper" >
-<p id="book-jot-desc" >
-{{$lbl_book}}
-</p>
-
-<textarea rows="10" cols="72" id="book-jot-text" name="book" >{{$book}}</textarea>
-
-</div>
-<div id="book-jot-end"></div>
-
-
-
-<div id="tv-jot-wrapper" >
-<p id="tv-jot-desc" >
-{{$lbl_tv}}
-</p>
-
-<textarea rows="10" cols="72" id="tv-jot-text" name="tv" >{{$tv}}</textarea>
-
-</div>
-<div id="tv-jot-end"></div>
-
-
-
-<div id="film-jot-wrapper" >
-<p id="film-jot-desc" >
-{{$lbl_film}}
-</p>
-
-<textarea rows="10" cols="72" id="film-jot-text" name="film" >{{$film}}</textarea>
-
-</div>
-<div id="film-jot-end"></div>
-
-
-<div class="profile-edit-submit-wrapper" >
-<input type="submit" name="submit" class="profile-edit-submit-button" value="{{$submit}}" />
-</div>
-<div class="profile-edit-submit-end"></div>
-
-
-<div id="romance-jot-wrapper" >
-<p id="romance-jot-desc" >
-{{$lbl_love}}
-</p>
-
-<textarea rows="10" cols="72" id="romance-jot-text" name="romance" >{{$romance}}</textarea>
-
-</div>
-<div id="romance-jot-end"></div>
-
-
-
-<div id="work-jot-wrapper" >
-<p id="work-jot-desc" >
-{{$lbl_work}}
-</p>
-
-<textarea rows="10" cols="72" id="work-jot-text" name="work" >{{$work}}</textarea>
-
-</div>
-<div id="work-jot-end"></div>
-
-
-
-<div id="education-jot-wrapper" >
-<p id="education-jot-desc" >
-{{$lbl_school}}
-</p>
-
-<textarea rows="10" cols="72" id="education-jot-text" name="education" >{{$education}}</textarea>
-
-</div>
-<div id="education-jot-end"></div>
-
-
-
-<div class="profile-edit-submit-wrapper" >
-<input type="submit" name="submit" class="profile-edit-submit-button" value="{{$submit}}" />
-</div>
-<div class="profile-edit-submit-end"></div>
-
-
-</form>
-</div>
-
diff --git a/view/tpl/smarty3/profile_edlink.tpl b/view/tpl/smarty3/profile_edlink.tpl
deleted file mode 100644
index 9424bcc3d..000000000
--- a/view/tpl/smarty3/profile_edlink.tpl
+++ /dev/null
@@ -1,7 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<div class="profile-edit-side-div"><a class="profile-edit-side-link icon edit" title="{{$editprofile}}" href="profiles/{{$profid}}" ></a></div>
-<div class="clear"></div> \ No newline at end of file
diff --git a/view/tpl/smarty3/profile_entry.tpl b/view/tpl/smarty3/profile_entry.tpl
deleted file mode 100644
index 4774fd11b..000000000
--- a/view/tpl/smarty3/profile_entry.tpl
+++ /dev/null
@@ -1,16 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-
-<div class="profile-listing" >
-<div class="profile-listing-photo-wrapper" >
-<a href="profiles/{{$id}}" class="profile-listing-edit-link"><img class="profile-listing-photo" id="profile-listing-photo-{{$id}}" src="{{$photo}}" alt="{{$alt}}" /></a>
-</div>
-<div class="profile-listing-photo-end"></div>
-<div class="profile-listing-name" id="profile-listing-name-{{$id}}"><a href="profiles/{{$id}}" class="profile-listing-edit-link" >{{$profile_name}}</a></div>
-<div class="profile-listing-visible">{{$visible}}</div>
-</div>
-<div class="profile-listing-end"></div>
-
diff --git a/view/tpl/smarty3/profile_listing_header.tpl b/view/tpl/smarty3/profile_listing_header.tpl
deleted file mode 100644
index f77bdcc80..000000000
--- a/view/tpl/smarty3/profile_listing_header.tpl
+++ /dev/null
@@ -1,13 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<h1>{{$header}}</h1>
-<p id="profile-listing-desc" class="button" >
-<a href="profile_photo" >{{$chg_photo}}</a>
-</p>
-<div id="profile-listing-new-link-wrapper" class="button" >
-<a href="{{$cr_new_link}}" id="profile-listing-new-link" title="{{$cr_new}}" >{{$cr_new}}</a>
-</div>
-
diff --git a/view/tpl/smarty3/profile_photo.tpl b/view/tpl/smarty3/profile_photo.tpl
deleted file mode 100644
index 8c4fbfafa..000000000
--- a/view/tpl/smarty3/profile_photo.tpl
+++ /dev/null
@@ -1,34 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<h1>{{$title}}</h1>
-
-<form enctype="multipart/form-data" action="profile_photo" method="post">
-<input type='hidden' name='form_security_token' value='{{$form_security_token}}'>
-
-<div id="profile-photo-upload-wrapper">
-
-<label id="profile-photo-upload-label" class="form-label" for="profile-photo-upload">{{$lbl_upfile}}</label>
-<input name="userfile" class="form-input" type="file" id="profile-photo-upload" size="48" />
-<div class="clear"></div>
-
-<label id="profile-photo-profiles-label" class="form-label" for="profile-photo-profiles">{{$lbl_profiles}}</label>
-<select name="profile" id="profile-photo-profiles" class="form-input" >
-{{foreach $profiles as $p}}
-<option value="{{$p.id}}" {{if $p.is_default}}selected="selected"{{/if}}>{{$p.name}}</option>
-{{/foreach}}
-</select>
-<div class="clear"></div>
-
-<div id="profile-photo-submit-wrapper">
-<input type="submit" name="submit" id="profile-photo-submit" value="{{$submit}}">
-</div>
-</div>
-
-</form>
-
-<div id="profile-photo-link-select-wrapper">
-{{$select}}
-</div> \ No newline at end of file
diff --git a/view/tpl/smarty3/profile_publish.tpl b/view/tpl/smarty3/profile_publish.tpl
deleted file mode 100644
index 1dc9eb7fc..000000000
--- a/view/tpl/smarty3/profile_publish.tpl
+++ /dev/null
@@ -1,21 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<p id="profile-publish-desc-{{$instance}}">
-{{$pubdesc}}
-</p>
-
- <div id="profile-publish-yes-wrapper-{{$instance}}">
- <label id="profile-publish-yes-label-{{$instance}}" for="profile-publish-yes-{{$instance}}">{{$str_yes}}</label>
- <input type="radio" name="profile_publish_{{$instance}}" id="profile-publish-yes-{{$instance}}" {{$yes_selected}} value="1" />
-
- <div id="profile-publish-break-{{$instance}}" ></div>
- </div>
- <div id="profile-publish-no-wrapper-{{$instance}}">
- <label id="profile-publish-no-label-{{$instance}}" for="profile-publish-no-{{$instance}}">{{$str_no}}</label>
- <input type="radio" name="profile_publish_{{$instance}}" id="profile-publish-no-{{$instance}}" {{$no_selected}} value="0" />
-
- <div id="profile-publish-end-{{$instance}}"></div>
- </div>
diff --git a/view/tpl/smarty3/profile_vcard.tpl b/view/tpl/smarty3/profile_vcard.tpl
deleted file mode 100644
index 422b43720..000000000
--- a/view/tpl/smarty3/profile_vcard.tpl
+++ /dev/null
@@ -1,57 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<div class="vcard">
-
- {{if $profile.edit}}
- <div class="action">
- <a class="profile-edit-side-link icon edit" rel="#profiles-menu" title="{{$profile.edit.3}}" href="#" ><span>{{$profile.edit.1}}</span></a>
- <ul id="profiles-menu" class="menu-popup">
- {{foreach $profile.menu.entries as $e}}
- <li>
- <a href="profiles/{{$e.id}}"><img src='{{$e.photo}}'>{{$e.profile_name}}</a>
- </li>
- {{/foreach}}
- <li><a href="profile_photo" >{{$profile.menu.chg_photo}}</a></li>
- <li><a href="profiles/new" id="profile-listing-new-link">{{$profile.menu.cr_new}}</a></li>
-
- </ul>
- </div>
- {{/if}}
-
- <div class="fn label">{{$profile.name}}</div>
-
- {{if $pdesc}}<div class="title">{{$profile.pdesc}}</div>{{/if}}
- <div id="profile-photo-wrapper"><img class="photo" width="175" height="175" src="{{$profile.photo}}?rev={{$profile.picdate}}" alt="{{$profile.name}}"></div>
-
-
-
- {{if $location}}
- <dl class="location"><dt class="location-label">{{$location}}</dt>
- <dd class="adr">
- {{if $profile.address}}<div class="street-address">{{$profile.address}}</div>{{/if}}
- <span class="city-state-zip">
- <span class="locality">{{$profile.locality}}</span>{{if $profile.locality}}, {{/if}}
- <span class="region">{{$profile.region}}</span>
- <span class="postal-code">{{$profile.postal_code}}</span>
- </span>
- {{if $profile.country_name}}<span class="country-name">{{$profile.country_name}}</span>{{/if}}
- </dd>
- </dl>
- {{/if}}
-
- {{if $gender}}<dl class="mf"><dt class="gender-label">{{$gender}}</dt> <dd class="x-gender">{{$profile.gender}}</dd></dl>{{/if}}
-
-
- {{if $marital}}<dl class="marital"><dt class="marital-label"><span class="heart">&hearts;</span>{{$marital}}</dt><dd class="marital-text">{{$profile.marital}}</dd></dl>{{/if}}
-
- {{if $homepage}}<dl class="homepage"><dt class="homepage-label">{{$homepage}}</dt><dd class="homepage-url"><a href="{{$profile.homepage}}" >{{$profile.homepage}}</a></dd></dl>{{/if}}
-
-
-</div>
-<div id="vcard-end"></div>
-{{$contact_block}}
-
-
diff --git a/view/tpl/smarty3/prv_message.tpl b/view/tpl/smarty3/prv_message.tpl
deleted file mode 100644
index 1f41d2662..000000000
--- a/view/tpl/smarty3/prv_message.tpl
+++ /dev/null
@@ -1,44 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-
-<h3>{{$header}}</h3>
-
-<div id="prvmail-wrapper" >
-<form id="prvmail-form" action="message" method="post" >
-
-{{$parent}}
-
-<div id="prvmail-to-label">{{$to}}</div>
-
-{{if $showinputs}}
-<input type="text" id="recip" name="messagerecip" value="{{$prefill}}" maxlength="255" size="64" tabindex="10" />
-<input type="hidden" id="recip-complete" name="messageto" value="{{$preid}}">
-{{else}}
-{{$select}}
-{{/if}}
-
-<div id="prvmail-subject-label">{{$subject}}</div>
-<input type="text" size="64" maxlength="255" id="prvmail-subject" name="subject" value="{{$subjtxt}}" {{$readonly}} tabindex="11" />
-
-<div id="prvmail-message-label">{{$yourmessage}}</div>
-<textarea rows="8" cols="72" class="prvmail-text" id="prvmail-text" name="body" tabindex="12">{{$text}}</textarea>
-
-
-<div id="prvmail-submit-wrapper" >
- <input type="submit" id="prvmail-submit" name="submit" value="{{$submit}}" tabindex="13" />
- <div id="prvmail-upload-wrapper" >
- <div id="prvmail-upload" class="icon border camera" title="{{$upload}}" ></div>
- </div>
- <div id="prvmail-link-wrapper" >
- <div id="prvmail-link" class="icon border link" title="{{$insert}}" onclick="jotGetLink();" ></div>
- </div>
- <div id="prvmail-rotator-wrapper" >
- <img id="prvmail-rotator" src="images/rotator.gif" alt="{{$wait}}" title="{{$wait}}" style="display: none;" />
- </div>
-</div>
-<div id="prvmail-end"></div>
-</form>
-</div>
diff --git a/view/tpl/smarty3/pwdreset.tpl b/view/tpl/smarty3/pwdreset.tpl
deleted file mode 100644
index e86e1227f..000000000
--- a/view/tpl/smarty3/pwdreset.tpl
+++ /dev/null
@@ -1,22 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<h3>{{$lbl1}}</h3>
-
-<p>
-{{$lbl2}}
-</p>
-<p>
-{{$lbl3}}
-</p>
-<p>
-{{$newpass}}
-</p>
-<p>
-{{$lbl4}} {{$lbl5}}
-</p>
-<p>
-{{$lbl6}}
-</p>
diff --git a/view/tpl/smarty3/register.tpl b/view/tpl/smarty3/register.tpl
deleted file mode 100644
index 98d888f08..000000000
--- a/view/tpl/smarty3/register.tpl
+++ /dev/null
@@ -1,50 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<h2>{{$title}}</h2>
-
-<form action="register" method="post" id="register-form">
-
-{{if $registertext}}
-<div id="register-desc" class="descriptive-paragraph">{{$registertext}}</div>
-{{/if}}
-
-{{if $invitations}}
- <p id="register-invite-desc">{{$invite_desc}}</p>
-
- <label for="register-invite" id="label-register-invite" class="register-label">{{$label_invite}}</label>
- <input type="text" maxlength="72" size="32" name="invite_code" id="register-invite" class="register-input" value="{{$invite_code}}" />
- <div id="register-invite-feedback" class="register-feedback"></div>
- <div id="register-invite-end" class="register-field-end"></div>
-{{/if}}
-
- <label for="register-email" id="label-register-email" class="register-label" >{{$label_email}}</label>
- <input type="text" maxlength="72" size="32" name="email" id="register-email" class="register-input" value="{{$email}}" />
- <div id="register-email-feedback" class="register-feedback"></div>
- <div id="register-email-end" class="register-field-end"></div>
-
- <label for="register-password" id="label-register-password" class="register-label" >{{$label_pass1}}</label>
- <input type="password" maxlength="72" size="32" name="password" id="register-password" class="register-input" value="{{$pass1}}" />
- <div id="register-password-feedback" class="register-feedback"></div>
- <div id="register-password-end" class="register-field-end"></div>
-
- <label for="register-password2" id="label-register-password2" class="register-label" >{{$label_pass2}}</label>
- <input type="password" maxlength="72" size="32" name="password2" id="register-password2" class="register-input" value="{{$pass2}}" />
- <div id="register-password2-feedback" class="register-feedback"></div>
- <div id="register-password2-end" class="register-field-end"></div>
-
- {{if $enable_tos}}
- <input type="checkbox" name="tos" id="register-tos" value="1" />
- <label for="register-tos" id="label-register-tos">{{$label_tos}}</label>
- <div id="register-tos-feedback" class="register-feedback"></div>
- <div id="register-tos-end" class="register-field-end"></div>
- {{else}}
- <input type="hidden" name="tos" value="1" />
- {{/if}}
-
- <input type="submit" name="submit" id="register-submit-button" value="{{$submit}}" />
- <div id="register-submit-end" class="register-field-end"></div>
-
-</form>
diff --git a/view/tpl/smarty3/remote_friends_common.tpl b/view/tpl/smarty3/remote_friends_common.tpl
deleted file mode 100644
index 8416b053a..000000000
--- a/view/tpl/smarty3/remote_friends_common.tpl
+++ /dev/null
@@ -1,26 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<div id="remote-friends-in-common" class="bigwidget">
- <div id="rfic-desc">{{$desc}} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{{if $linkmore}}<a href="{{$base}}/common/{{$uid}}">{{$more}}</a>{{/if}}</div>
- {{if $items}}
- {{foreach $items as $item}}
- <div class="profile-match-wrapper">
- <div class="profile-match-photo">
- <a href="{{$base}}/chanview?f=&url={{$item.xchan_url}}">
- <img src="{{$item.xchan_photo_m}}" width="80" height="80" alt="{{$item.xchan_name}}" title="{{$item.xchan_name}}" />
- </a>
- </div>
- <div class="profile-match-break"></div>
- <div class="profile-match-name">
- <a href="{{$base}}/chanview?f=&url={{$item.xchan_url}}" title="{{$item.xchan_name}}">{{$item.xchan_name}}</a>
- </div>
- <div class="profile-match-end"></div>
- </div>
- {{/foreach}}
- {{/if}}
- <div id="rfic-end" class="clear"></div>
-</div>
-
diff --git a/view/tpl/smarty3/removeme.tpl b/view/tpl/smarty3/removeme.tpl
deleted file mode 100644
index 3fe12a223..000000000
--- a/view/tpl/smarty3/removeme.tpl
+++ /dev/null
@@ -1,25 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<h1>{{$title}}</h1>
-
-<div id="remove-account-wrapper">
-
-<div id="remove-account-desc">{{$desc}}</div>
-
-<form action="{{$basedir}}/removeme" autocomplete="off" method="post" >
-<input type="hidden" name="verify" value="{{$hash}}" />
-
-<div id="remove-account-pass-wrapper">
-<label id="remove-account-pass-label" for="remove-account-pass">{{$passwd}}</label>
-<input type="password" id="remove-account-pass" name="qxz_password" />
-</div>
-<div id="remove-account-pass-end"></div>
-
-<input type="submit" name="submit" value="{{$submit}}" />
-
-</form>
-</div>
-
diff --git a/view/tpl/smarty3/rmagic.tpl b/view/tpl/smarty3/rmagic.tpl
deleted file mode 100644
index 7e4e563d9..000000000
--- a/view/tpl/smarty3/rmagic.tpl
+++ /dev/null
@@ -1,16 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<h3>{{$title}}</h3>
-
-<form action="rmagic" method="post" >
-
- <label for="rmagic-address" id="label-rmagic-address" class="rmagic-label">{{$desc}}</label>
- <input type="text" maxlength="255" size="32" name="address" id="rmagic-address" class="rmagic-input" value="" />
-
- <input type="submit" name="submit" id="rmagic-submit-button" value="{{$submit}}" />
- <div id="rmagic-submit-end" class="rmagic-field-end"></div>
-
-</form>
diff --git a/view/tpl/smarty3/saved_searches_aside.tpl b/view/tpl/smarty3/saved_searches_aside.tpl
deleted file mode 100644
index 034d1f6db..000000000
--- a/view/tpl/smarty3/saved_searches_aside.tpl
+++ /dev/null
@@ -1,19 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<div class="widget" id="saved-search-list">
- <h3 id="search">{{$title}}</h3>
- {{$searchbox}}
-
- <ul id="saved-search-ul">
- {{foreach $saved as $search}}
- <li class="saved-search-li clear">
- <a title="{{$search.delete}}" onclick="return confirmDelete();" id="drop-saved-search-term-{{$search.id}}" class="iconspacer savedsearchdrop " href="network/?f=&amp;remove=1&amp;search={{$search.encodedterm}}"></a>
- <a id="saved-search-term-{{$search.id}}" class="savedsearchterm" href="network/?f=&amp;search={{$search.encodedterm}}">{{$search.displayterm}}</a>
- </li>
- {{/foreach}}
- </ul>
- <div class="clear"></div>
-</div>
diff --git a/view/tpl/smarty3/search_item.tpl b/view/tpl/smarty3/search_item.tpl
deleted file mode 100644
index c889e227b..000000000
--- a/view/tpl/smarty3/search_item.tpl
+++ /dev/null
@@ -1,68 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<div id="thread-wrapper-{{$item.id}}" class="thread-wrapper {{$item.toplevel}}">
-<a name="{{$item.id}}" ></a>
-<div class="wall-item-outside-wrapper {{$item.indent}}{{$item.previewing}}" id="wall-item-outside-wrapper-{{$item.id}}" >
- <div class="wall-item-content-wrapper {{$item.indent}}{{$item.previewing}}" id="wall-item-content-wrapper-{{$item.id}}" >
- <div class="wall-item-info" id="wall-item-info-{{$item.id}}">
- <div class="wall-item-photo-wrapper" id="wall-item-photo-wrapper-{{$item.id}}"
- onmouseover="if (typeof t{{$item.id}} != 'undefined') clearTimeout(t{{$item.id}}); openMenu('wall-item-photo-menu-button-{{$item.id}}')"
- onmouseout="t{{$item.id}}=setTimeout('closeMenu(\'wall-item-photo-menu-button-{{$item.id}}\'); closeMenu(\'wall-item-photo-menu-{{$item.id}}\');',200)">
- <a href="{{$item.profile_url}}" title="{{$item.linktitle}}" class="wall-item-photo-link" id="wall-item-photo-link-{{$item.id}}">
- <img src="{{$item.thumb}}" class="wall-item-photo{{$item.sparkle}}" id="wall-item-photo-{{$item.id}}" style="height: 80px; width: 80px;" alt="{{$item.name}}" /></a>
- <span onclick="openClose('wall-item-photo-menu-{{$item.id}}');" class="fakelink wall-item-photo-menu-button" id="wall-item-photo-menu-button-{{$item.id}}">menu</span>
- <div class="wall-item-photo-menu" id="wall-item-photo-menu-{{$item.id}}">
- <ul>
- {{$item.item_photo_menu}}
- </ul>
- </div>
- </div>
- <div class="wall-item-photo-end"></div>
- <div class="wall-item-wrapper" id="wall-item-wrapper-{{$item.id}}" >
- {{if $item.lock}}<div class="wall-item-lock"><img src="images/lock_icon.gif" class="lockview" alt="{{$item.lock}}" onclick="lockview(event,{{$item.id}});" /></div>
- {{else}}<div class="wall-item-lock"></div>{{/if}}
- <div class="wall-item-location" id="wall-item-location-{{$item.id}}">{{$item.location}}</div>
- </div>
- </div>
- <div class="wall-item-author">
- <a href="{{$item.profile_url}}" title="{{$item.linktitle}}" class="wall-item-name-link"><span class="wall-item-name{{$item.sparkle}}" id="wall-item-name-{{$item.id}}" >{{$item.name}}</span></a>
-
- <div id="wall-item-ago-{{$item.id}}" class="wall-item-ago"><abbr class="wall-item-ago-time" title="{{$item.localtime}}">{{$item.ago}}</abbr>{{if $item.app}}<span class="item.app">{{$item.str_app}}</span>{{/if}}</div>
-
- </div>
- <div class="wall-item-content" id="wall-item-content-{{$item.id}}" >
- <div class="wall-item-title" id="wall-item-title-{{$item.id}}">{{$item.title}}</div>
- <div class="wall-item-title-end"></div>
- <div class="wall-item-body" id="wall-item-body-{{$item.id}}" >{{$item.body}}
- <div class="body-tag">
- {{foreach $item.tags as $tag}}
- <span class='tag'>{{$tag}}</span>
- {{/foreach}}
- </div>
- </div>
- </div>
- <div class="wall-item-tools" id="wall-item-tools-{{$item.id}}">
- <div class="wall-item-delete-wrapper" id="wall-item-delete-wrapper-{{$item.id}}" >
- {{if $item.drop.dropping}}<a href="item/drop/{{$item.id}}" onclick="return confirmDelete();" class="icon drophide" title="{{$item.drop.delete}}" onmouseover="imgbright(this);" onmouseout="imgdull(this);" ></a>{{/if}}
- </div>
- {{if $item.drop.pagedropping}}<input type="checkbox" onclick="checkboxhighlight(this);" title="{{$item.drop.select}}" class="item-select" name="itemselected[]" value="{{$item.id}}" />{{/if}}
- <div class="wall-item-delete-end"></div>
- </div>
- </div>
- <div class="wall-item-wrapper-end"></div>
-
-
- <div class="wall-item-conv" id="wall-item-conv-{{$item.id}}" >
- {{if $item.conv}}
- <a href='{{$item.conv.href}}' id='context-{{$item.id}}' title='{{$item.conv.title}}'>{{$item.conv.title}}</a>
- {{/if}}
- </div>
-
-<div class="wall-item-outside-wrapper-end {{$item.indent}}" ></div>
-
-</div>
-</div>
-
diff --git a/view/tpl/smarty3/settings.tpl b/view/tpl/smarty3/settings.tpl
deleted file mode 100644
index 251fa9be4..000000000
--- a/view/tpl/smarty3/settings.tpl
+++ /dev/null
@@ -1,119 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<h1>{{$ptitle}}</h1>
-
-{{$nickname_block}}
-
-<form action="settings" id="settings-form" method="post" autocomplete="off" >
-<input type='hidden' name='form_security_token' value='{{$form_security_token}}'>
-
-<h3 class="settings-heading">{{$h_basic}}</h3>
-
-{{include file="field_input.tpl" field=$username}}
-{{include file="field_custom.tpl" field=$timezone}}
-{{include file="field_input.tpl" field=$defloc}}
-{{include file="field_checkbox.tpl" field=$allowloc}}
-
-
-<div class="settings-submit-wrapper" >
-<input type="submit" name="submit" class="settings-submit" value="{{$submit}}" />
-</div>
-
-
-<h3 class="settings-heading">{{$h_prv}}</h3>
-
-
-<div id="settings-permissions-wrapper">
-{{foreach $permiss_arr as $permit}}
-{{include file="field_select.tpl" field=$permit}}
-{{/foreach}}
-</div>
-
-
-<div class="settings-submit-wrapper" >
-<input type="submit" name="submit" class="settings-submit" value="{{$submit}}" />
-</div>
-
-
-{{$profile_in_dir}}
-
-{{$suggestme}}
-
-{{include file="field_input.tpl" field=$maxreq}}
-
-{{include file="field_input.tpl" field=$cntunkmail}}
-
-{{include file="field_input.tpl" field=$expire.days}}
-
-
-<div class="field input">
- <span class="field_help"><a href="#advanced-expire-popup" id="advanced-expire" class='popupbox' title="{{$expire.advanced}}">{{$expire.label}}</a></span>
- <div style="display: none;">
- <div id="advanced-expire-popup" style="width:auto;height:auto;overflow:auto;">
- <h3>{{$expire.advanced}}</h3>
- {{include file="field_yesno.tpl" field=$expire.items}}
- {{include file="field_yesno.tpl" field=$expire.starred}}
- {{include file="field_yesno.tpl" field=$expire.network_only}}
- </div>
- </div>
-
-</div>
-
-<div id="settings-default-perms" class="settings-default-perms" >
- <a href="#profile-jot-acl-wrapper" id="settings-default-perms-menu" class='popupbox'>{{$permissions}} {{$permdesc}}</a>
- <div id="settings-default-perms-menu-end"></div>
-
- <div id="settings-default-perms-select" style="display: none; margin-bottom: 20px" >
-
- <div style="display: none;">
- <div id="profile-jot-acl-wrapper" style="width:auto;height:auto;overflow:auto;">
- {{$aclselect}}
- </div>
- </div>
-
- </div>
-</div>
-<br/>
-<div id="settings-default-perms-end"></div>
-
-{{$group_select}}
-
-
-<div class="settings-submit-wrapper" >
-<input type="submit" name="submit" class="settings-submit" value="{{$submit}}" />
-</div>
-
-
-
-<h3 class="settings-heading">{{$h_not}}</h3>
-<div id="settings-notifications">
-
-<div id="settings-activity-desc">{{$activity_options}}</div>
-
-{{include file="field_checkbox.tpl" field=$post_newfriend}}
-{{include file="field_checkbox.tpl" field=$post_joingroup}}
-{{include file="field_checkbox.tpl" field=$post_profilechange}}
-
-
-<div id="settings-notify-desc">{{$lbl_not}}</div>
-
-<div class="group">
-{{include file="field_intcheckbox.tpl" field=$notify1}}
-{{include file="field_intcheckbox.tpl" field=$notify2}}
-{{include file="field_intcheckbox.tpl" field=$notify3}}
-{{include file="field_intcheckbox.tpl" field=$notify4}}
-{{include file="field_intcheckbox.tpl" field=$notify5}}
-{{include file="field_intcheckbox.tpl" field=$notify6}}
-{{include file="field_intcheckbox.tpl" field=$notify7}}
-{{include file="field_intcheckbox.tpl" field=$notify8}}
-</div>
-
-</div>
-
-<div class="settings-submit-wrapper" >
-<input type="submit" name="submit" class="settings-submit" value="{{$submit}}" />
-</div>
-
diff --git a/view/tpl/smarty3/settings_account.tpl b/view/tpl/smarty3/settings_account.tpl
deleted file mode 100644
index a12283ff2..000000000
--- a/view/tpl/smarty3/settings_account.tpl
+++ /dev/null
@@ -1,33 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<h1>{{$title}}</h1>
-
-
-<div id="settings-remove-account-link">
-<a href="removeme" title="{{$permanent}}" >{{$removeme}}</a>
-</div>
-
-
-<form action="settings/account" id="settings-account-form" method="post" autocomplete="off" >
-<input type='hidden' name='form_security_token' value='{{$form_security_token}}'>
-
-{{include file="field_input.tpl" field=$email}}
-
-
-<h3 class="settings-heading">{{$h_pass}}</h3>
-
-{{include file="field_password.tpl" field=$password1}}
-{{include file="field_password.tpl" field=$password2}}
-
-
-<div class="settings-submit-wrapper" >
-<input type="submit" name="submit" class="settings-submit" value="{{$submit}}" />
-</div>
-
-{{$account_settings}}
-
-
-
diff --git a/view/tpl/smarty3/settings_addons.tpl b/view/tpl/smarty3/settings_addons.tpl
deleted file mode 100644
index b8613bec6..000000000
--- a/view/tpl/smarty3/settings_addons.tpl
+++ /dev/null
@@ -1,15 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<h1>{{$title}}</h1>
-
-
-<form action="settings/featured" method="post" autocomplete="off">
-<input type='hidden' name='form_security_token' value='{{$form_security_token}}'>
-
-{{$settings_addons}}
-
-</form>
-
diff --git a/view/tpl/smarty3/settings_connectors.tpl b/view/tpl/smarty3/settings_connectors.tpl
deleted file mode 100644
index 5df839411..000000000
--- a/view/tpl/smarty3/settings_connectors.tpl
+++ /dev/null
@@ -1,14 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<h1>{{$title}}</h1>
-
-<form action="settings/connectors" method="post" autocomplete="off">
-<input type='hidden' name='form_security_token' value='{{$form_security_token}}'>
-
-{{$settings_connectors}}
-
-</form>
-
diff --git a/view/tpl/smarty3/settings_display.tpl b/view/tpl/smarty3/settings_display.tpl
deleted file mode 100644
index 3558e5cc9..000000000
--- a/view/tpl/smarty3/settings_display.tpl
+++ /dev/null
@@ -1,27 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<h1>{{$ptitle}}</h1>
-
-<form action="settings/display" id="settings-form" method="post" autocomplete="off" >
-<input type='hidden' name='form_security_token' value='{{$form_security_token}}'>
-
-{{include file="field_themeselect.tpl" field=$theme}}
-{{include file="field_themeselect.tpl" field=$mobile_theme}}
-{{include file="field_input.tpl" field=$ajaxint}}
-{{include file="field_input.tpl" field=$itemspage}}
-{{include file="field_checkbox.tpl" field=$nosmile}}
-
-
-<div class="settings-submit-wrapper" >
-<input type="submit" name="submit" class="settings-submit" value="{{$submit}}" />
-</div>
-
-{{if $theme_config}}
-<h2>Theme settings</h2>
-{{$theme_config}}
-{{/if}}
-
-</form>
diff --git a/view/tpl/smarty3/settings_features.tpl b/view/tpl/smarty3/settings_features.tpl
deleted file mode 100644
index 797d3da2c..000000000
--- a/view/tpl/smarty3/settings_features.tpl
+++ /dev/null
@@ -1,25 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<h1>{{$title}}</h1>
-
-
-<form action="settings/features" method="post" autocomplete="off">
-<input type='hidden' name='form_security_token' value='{{$form_security_token}}'>
-
-{{foreach $features as $f}}
-<h3 class="settings-heading">{{$f.0}}</h3>
-
-{{foreach $f.1 as $fcat}}
- {{include file="{{$field_yesno}}" field=$fcat}}
-{{/foreach}}
-{{/foreach}}
-
-<div class="settings-submit-wrapper" >
-<input type="submit" name="submit" class="settings-features-submit" value="{{$submit}}" />
-</div>
-
-</form>
-
diff --git a/view/tpl/smarty3/settings_nick_set.tpl b/view/tpl/smarty3/settings_nick_set.tpl
deleted file mode 100644
index fb886695e..000000000
--- a/view/tpl/smarty3/settings_nick_set.tpl
+++ /dev/null
@@ -1,10 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-
-<div id="settings-nick-wrapper" >
-<div id="settings-nickname-desc" class="info-message">{{$desc}} <strong>'{{$nickname}}@{{$basepath}}'</strong>{{$subdir}}</div>
-</div>
-<div id="settings-nick-end" ></div>
diff --git a/view/tpl/smarty3/settings_nick_subdir.tpl b/view/tpl/smarty3/settings_nick_subdir.tpl
deleted file mode 100644
index 874185db5..000000000
--- a/view/tpl/smarty3/settings_nick_subdir.tpl
+++ /dev/null
@@ -1,11 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<p>
-It appears that your website is located in a subdirectory of the<br />
-{{$hostname}} website, so this setting may not work reliably.<br />
-</p>
-<p>If you have any issues, you may have better results using the profile<br /> address '<strong>{{$baseurl}}/profile/{{$nickname}}</strong>'.
-</p> \ No newline at end of file
diff --git a/view/tpl/smarty3/settings_oauth.tpl b/view/tpl/smarty3/settings_oauth.tpl
deleted file mode 100644
index feab78210..000000000
--- a/view/tpl/smarty3/settings_oauth.tpl
+++ /dev/null
@@ -1,36 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<h1>{{$title}}</h1>
-
-
-<form action="settings/oauth" method="post" autocomplete="off">
-<input type='hidden' name='form_security_token' value='{{$form_security_token}}'>
-
- <div id="profile-edit-links">
- <ul>
- <li>
- <a id="profile-edit-view-link" href="{{$baseurl}}/settings/oauth/add">{{$add}}</a>
- </li>
- </ul>
- </div>
-
- {{foreach $apps as $app}}
- <div class='oauthapp'>
- <img src='{{$app.icon}}' class="{{if $app.icon}} {{else}}noicon{{/if}}">
- {{if $app.name}}<h4>{{$app.name}}</h4>{{else}}<h4>{{$noname}}</h4>{{/if}}
- {{if $app.my}}
- {{if $app.oauth_token}}
- <div class="settings-submit-wrapper" ><button class="settings-submit" type="submit" name="remove" value="{{$app.oauth_token}}">{{$remove}}</button></div>
- {{/if}}
- {{/if}}
- {{if $app.my}}
- <a href="{{$baseurl}}/settings/oauth/edit/{{$app.client_id}}" class="icon s22 edit" title="{{$edit}}">&nbsp;</a>
- <a href="{{$baseurl}}/settings/oauth/delete/{{$app.client_id}}?t={{$form_security_token}}" class="icon s22 delete" title="{{$delete}}">&nbsp;</a>
- {{/if}}
- </div>
- {{/foreach}}
-
-</form>
diff --git a/view/tpl/smarty3/settings_oauth_edit.tpl b/view/tpl/smarty3/settings_oauth_edit.tpl
deleted file mode 100644
index e3960bf75..000000000
--- a/view/tpl/smarty3/settings_oauth_edit.tpl
+++ /dev/null
@@ -1,22 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<h1>{{$title}}</h1>
-
-<form method="POST">
-<input type='hidden' name='form_security_token' value='{{$form_security_token}}'>
-
-{{include file="field_input.tpl" field=$name}}
-{{include file="field_input.tpl" field=$key}}
-{{include file="field_input.tpl" field=$secret}}
-{{include file="field_input.tpl" field=$redirect}}
-{{include file="field_input.tpl" field=$icon}}
-
-<div class="settings-submit-wrapper" >
-<input type="submit" name="submit" class="settings-submit" value="{{$submit}}" />
-<input type="submit" name="cancel" class="settings-submit" value="{{$cancel}}" />
-</div>
-
-</form>
diff --git a/view/tpl/smarty3/suggest_friends.tpl b/view/tpl/smarty3/suggest_friends.tpl
deleted file mode 100644
index 060db0005..000000000
--- a/view/tpl/smarty3/suggest_friends.tpl
+++ /dev/null
@@ -1,21 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<div class="profile-match-wrapper">
- <a href="{{$ignlnk}}" title="{{$ignore}}" class="icon drophide profile-match-ignore" onmouseout="imgdull(this);" onmouseover="imgbright(this);" onclick="return confirmDelete();" ></a>
- <div class="profile-match-photo">
- <a href="{{$url}}">
- <img src="{{$photo}}" alt="{{$name}}" width="80" height="80" title="{{$name}} [{{$url}}]" />
- </a>
- </div>
- <div class="profile-match-break"></div>
- <div class="profile-match-name">
- <a href="{{$url}}" title="{{$name}}">{{$name}}</a>
- </div>
- <div class="profile-match-end"></div>
- {{if $connlnk}}
- <div class="profile-match-connect"><a href="{{$connlnk}}" title="{{$conntxt}}">{{$conntxt}}</a></div>
- {{/if}}
-</div> \ No newline at end of file
diff --git a/view/tpl/smarty3/suggestions.tpl b/view/tpl/smarty3/suggestions.tpl
deleted file mode 100644
index b4f0cbbe5..000000000
--- a/view/tpl/smarty3/suggestions.tpl
+++ /dev/null
@@ -1,26 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-
-<div class="intro-wrapper" >
-
-<p class="intro-desc">{{$str_notifytype}} {{$notify_type}}</p>
-<div class="intro-madeby">{{$madeby}}</div>
-<div class="intro-fullname" >{{$fullname}}</div>
-<a class="intro-url-link" href="{{$url}}" ><img class="intro-photo lframe" src="{{$photo}}" width="175" height=175" title="{{$fullname}}" alt="{{$fullname}}" /></a>
-<div class="intro-note" >{{$note}}</div>
-<div class="intro-wrapper-end"></div>
-<form class="intro-form" action="notifications/{{$intro_id}}" method="post">
-<input class="intro-submit-ignore" type="submit" name="submit" value="{{$ignore}}" />
-<input class="intro-submit-discard" type="submit" name="submit" value="{{$discard}}" />
-</form>
-<div class="intro-form-end"></div>
-
-<form class="intro-approve-form" action="{{$request}}" method="get">
-{{include file="field_checkbox.tpl" field=$hidden}}
-<input class="intro-submit-approve" type="submit" name="submit" value="{{$approve}}" />
-</form>
-</div>
-<div class="intro-end"></div>
diff --git a/view/tpl/smarty3/tag_slap.tpl b/view/tpl/smarty3/tag_slap.tpl
deleted file mode 100644
index 5521b508d..000000000
--- a/view/tpl/smarty3/tag_slap.tpl
+++ /dev/null
@@ -1,35 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
- <entry>
- <author>
- <name>{{$name}}</name>
- <uri>{{$profile_page}}</uri>
- <link rel="photo" type="image/jpeg" media:width="80" media:height="80" href="{{$thumb}}" />
- <link rel="avatar" type="image/jpeg" media:width="80" media:height="80" href="{{$thumb}}" />
- </author>
-
- <id>{{$item_id}}</id>
- <title>{{$title}}</title>
- <published>{{$published}}</published>
- <content type="{{$type}}" >{{$content}}</content>
- <link rel="mentioned" href="{{$accturi}}" />
- <as:actor>
- <as:obj_type>http://activitystrea.ms/schema/1.0/person</as:obj_type>
- <id>{{$profile_page}}</id>
- <title></title>
- <link rel="avatar" type="image/jpeg" media:width="175" media:height="175" href="{{$photo}}"/>
- <link rel="avatar" type="image/jpeg" media:width="80" media:height="80" href="{{$thumb}}"/>
- <poco:preferredUsername>{{$nick}}</poco:preferredUsername>
- <poco:displayName>{{$name}}</poco:displayName>
- </as:actor>
- <as:verb>{{$verb}}</as:verb>
- <as:object>
- <as:obj_type></as:obj_type>
- </as:object>
- <as:target>
- <as:obj_type></as:obj_type>
- </as:target>
- </entry>
diff --git a/view/tpl/smarty3/threaded_conversation.tpl b/view/tpl/smarty3/threaded_conversation.tpl
deleted file mode 100644
index a2885ddc3..000000000
--- a/view/tpl/smarty3/threaded_conversation.tpl
+++ /dev/null
@@ -1,18 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-{{foreach $threads as $thread_item}}
-{{include file="{{$thread_item.template}}" item=$thread_item}}
-{{/foreach}}
-
-<div id="conversation-end"></div>
-
-{{if $dropping}}
-<div id="item-delete-selected" class="fakelink" onclick="deleteCheckedItems();">
- <div id="item-delete-selected-icon" class="icon drophide" title="{{$dropping}}" onmouseover="imgbright(this);" onmouseout="imgdull(this);" ></div>
- <div id="item-delete-selected-desc" >{{$dropping}}</div>
-</div>
-<div id="item-delete-selected-end"></div>
-{{/if}}
diff --git a/view/tpl/smarty3/toggle_mobile_footer.tpl b/view/tpl/smarty3/toggle_mobile_footer.tpl
deleted file mode 100644
index 008d69663..000000000
--- a/view/tpl/smarty3/toggle_mobile_footer.tpl
+++ /dev/null
@@ -1,7 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<a id="toggle_mobile_link" href="{{$toggle_link}}">{{$toggle_text}}</a>
-
diff --git a/view/tpl/smarty3/viewcontact_template.tpl b/view/tpl/smarty3/viewcontact_template.tpl
deleted file mode 100644
index a9837c7f9..000000000
--- a/view/tpl/smarty3/viewcontact_template.tpl
+++ /dev/null
@@ -1,14 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<h3>{{$title}}</h3>
-
-{{foreach $contacts as $contact}}
- {{include file="contact_template.tpl"}}
-{{/foreach}}
-
-<div id="view-contact-end"></div>
-
-{{$paginate}}
diff --git a/view/tpl/smarty3/wall_item.tpl b/view/tpl/smarty3/wall_item.tpl
deleted file mode 100644
index 1ab1fbff0..000000000
--- a/view/tpl/smarty3/wall_item.tpl
+++ /dev/null
@@ -1,84 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<a name="{{$item.id}}" ></a>
-<div class="wall-item-outside-wrapper {{$item.indent}}{{$item.previewing}}" id="wall-item-outside-wrapper-{{$item.id}}" >
- <div class="wall-item-content-wrapper {{$item.indent}}" id="wall-item-content-wrapper-{{$item.id}}" >
- <div class="wall-item-info" id="wall-item-info-{{$item.id}}">
- <div class="wall-item-photo-wrapper" id="wall-item-photo-wrapper-{{$item.id}}"
- onmouseover="if (typeof t{{$item.id}} != 'undefined') clearTimeout(t{{$item.id}}); openMenu('wall-item-photo-menu-button-{{$item.id}}')"
- onmouseout="t{{$item.id}}=setTimeout('closeMenu(\'wall-item-photo-menu-button-{{$item.id}}\'); closeMenu(\'wall-item-photo-menu-{{$item.id}}\');',200)">
- <a href="{{$item.profile_url}}" title="{{$item.linktitle}}" class="wall-item-photo-link" id="wall-item-photo-link-{{$item.id}}">
- <img src="{{$item.thumb}}" class="wall-item-photo{{$item.sparkle}}" id="wall-item-photo-{{$item.id}}" style="height: 80px; width: 80px;" alt="{{$item.name}}" />
- </a>
- <span onclick="openClose('wall-item-photo-menu-{{$item.id}}');" class="fakelink wall-item-photo-menu-button" id="wall-item-photo-menu-button-{{$item.id}}">menu</span>
- <div class="wall-item-photo-menu" id="wall-item-photo-menu-{{$item.id}}">
- <ul>
- {{$item.item_photo_menu}}
- </ul>
- </div>
- </div>
- <div class="wall-item-photo-end"></div>
- <div class="wall-item-wrapper" id="wall-item-wrapper-{{$item.id}}" >
- {{if $item.lock}}<div class="wall-item-lock"><img src="images/lock_icon.gif" class="lockview" alt="{{$item.lock}}" onclick="lockview(event,{{$item.id}});" /></div>
- {{else}}<div class="wall-item-lock"></div>{{/if}}
- <div class="wall-item-location" id="wall-item-location-{{$item.id}}">{{$item.location}}</div>
- </div>
- </div>
- <div class="wall-item-author">
- <a href="{{$item.profile_url}}" title="{{$item.linktitle}}" class="wall-item-name-link"><span class="wall-item-name{{$item.sparkle}}" id="wall-item-name-{{$item.id}}" >{{$item.name}}</span></a>
- <div id="wall-item-ago-{{$item.id}}" class="wall-item-ago"><abbr class="wall-item-ago-time" title="{{$item.localtime}}">{{$item.ago}}</abbr>{{if $item.app}}<span class="item.app">{{$item.str_app}}</span>{{/if}}</div>
-
- </div>
- <div class="wall-item-content" id="wall-item-content-{{$item.id}}" >
- <div class="wall-item-title" id="wall-item-title-{{$item.id}}">{{$item.title}}</div>
- <div class="wall-item-title-end"></div>
- <div class="wall-item-body" id="wall-item-body-{{$item.id}}" >{{$item.body}}
- <div class="body-tag">
- {{foreach $item.tags as $tag}}
- <span class='tag'>{{$tag}}</span>
- {{/foreach}}
- </div>
- </div>
- </div>
- <div class="wall-item-tools" id="wall-item-tools-{{$item.id}}">
- {{if $item.vote}}
- <div class="wall-item-like-buttons" id="wall-item-like-buttons-{{$item.id}}">
- <a href="#" class="icon like" title="{{$item.vote.like.0}}" onclick="dolike({{$item.id}},'like'); return false"></a>
- <a href="#" class="icon dislike" title="{{$item.vote.dislike.0}}" onclick="dolike({{$item.id}},'dislike'); return false"></a>
- {{if $item.vote.share}}<a href="#" class="icon recycle wall-item-share-buttons" title="{{$item.vote.share.0}}" onclick="jotShare({{$item.id}}); return false"></a>{{/if}}
- <img id="like-rotator-{{$item.id}}" class="like-rotator" src="images/rotator.gif" alt="{{$item.wait}}" title="{{$item.wait}}" style="display: none;" />
- </div>
- {{/if}}
- {{if $item.plink}}
- <div class="wall-item-links-wrapper"><a href="{{$item.plink.href}}" title="{{$item.plink.title}}" class="icon remote-link{{$item.sparkle}}"></a></div>
- {{/if}}
- {{if $item.edpost}}
- <a class="editpost icon pencil" href="{{$item.edpost.0}}" title="{{$item.edpost.1}}"></a>
- {{/if}}
-
- {{if $item.star}}
- <a href="#" id="starred-{{$item.id}}" onclick="dostar({{$item.id}}); return false;" class="star-item icon {{$item.isstarred}}" title="{{$item.star.toggle}}"></a>
- <a href="#" id="tagger-{{$item.id}}" onclick="itemTag({{$item.id}}); return false;" class="tag-item icon tagged" title="{{$item.star.tagger}}"></a>
- {{/if}}
- {{if $item.filer}}
- <a href="#" id="filer-{{$item.id}}" onclick="itemFiler({{$item.id}}); return false;" class="filer-item filer-icon" title="{{$item.filer}}"></a>
- {{/if}}
- <div class="wall-item-delete-wrapper" id="wall-item-delete-wrapper-{{$item.id}}" >
- {{if $item.drop.dropping}}<a href="item/drop/{{$item.id}}" onclick="return confirmDelete();" class="icon drophide" title="{{$item.drop.delete}}" onmouseover="imgbright(this);" onmouseout="imgdull(this);" ></a>{{/if}}
- </div>
- {{if $item.drop.pagedropping}}<input type="checkbox" onclick="checkboxhighlight(this);" title="{{$item.drop.select}}" class="item-select" name="itemselected[]" value="{{$item.id}}" />{{/if}}
- <div class="wall-item-delete-end"></div>
- </div>
- </div>
- <div class="wall-item-wrapper-end"></div>
- <div class="wall-item-like {{$item.indent}}" id="wall-item-like-{{$item.id}}">{{$item.like}}</div>
- <div class="wall-item-dislike {{$item.indent}}" id="wall-item-dislike-{{$item.id}}">{{$item.dislike}}</div>
- <div class="wall-item-comment-wrapper" >
- {{$item.comment}}
- </div>
-
-<div class="wall-item-outside-wrapper-end {{$item.indent}}" ></div>
-</div>
diff --git a/view/tpl/smarty3/wall_thread.tpl b/view/tpl/smarty3/wall_thread.tpl
deleted file mode 100644
index cab43cfcf..000000000
--- a/view/tpl/smarty3/wall_thread.tpl
+++ /dev/null
@@ -1,125 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-{{if $item.comment_firstcollapsed}}
- <div class="hide-comments-outer">
- <span id="hide-comments-total-{{$item.id}}" class="hide-comments-total">{{$item.num_comments}}</span> <span id="hide-comments-{{$item.id}}" class="hide-comments fakelink" onclick="showHideComments({{$item.id}});">{{$item.hide_text}}</span>
- </div>
- <div id="collapsed-comments-{{$item.id}}" class="collapsed-comments" style="display: none;">
-{{/if}}
-<div id="thread-wrapper-{{$item.id}}" class="thread-wrapper {{$item.toplevel}}">
-<a name="{{$item.id}}" ></a>
-<div class="wall-item-outside-wrapper {{$item.indent}}{{$item.previewing}}{{if $item.owner_url}} wallwall{{/if}}" id="wall-item-outside-wrapper-{{$item.id}}" >
- <div class="wall-item-content-wrapper {{$item.indent}}" id="wall-item-content-wrapper-{{$item.id}}" >
- <div class="wall-item-info{{if $item.owner_url}} wallwall{{/if}}" id="wall-item-info-{{$item.id}}">
- {{if $item.owner_url}}
- <div class="wall-item-photo-wrapper wwto" id="wall-item-ownerphoto-wrapper-{{$item.id}}" >
- <a href="{{$item.owner_url}}" title="{{$item.olinktitle}}" class="wall-item-photo-link" id="wall-item-ownerphoto-link-{{$item.id}}">
- <img src="{{$item.owner_photo}}" class="wall-item-photo{{$item.osparkle}}" id="wall-item-ownerphoto-{{$item.id}}" style="height: 80px; width: 80px;" alt="{{$item.owner_name}}" /></a>
- </div>
- <div class="wall-item-arrowphoto-wrapper" ><img src="images/larrow.gif" alt="{{$item.wall}}" /></div>
- {{/if}}
- <div class="wall-item-photo-wrapper{{if $item.owner_url}} wwfrom{{/if}}" id="wall-item-photo-wrapper-{{$item.id}}"
- onmouseover="if (typeof t{{$item.id}} != 'undefined') clearTimeout(t{{$item.id}}); openMenu('wall-item-photo-menu-button-{{$item.id}}')"
- onmouseout="t{{$item.id}}=setTimeout('closeMenu(\'wall-item-photo-menu-button-{{$item.id}}\'); closeMenu(\'wall-item-photo-menu-{{$item.id}}\');',200)">
- <a href="{{$item.profile_url}}" title="{{$item.linktitle}}" class="wall-item-photo-link" id="wall-item-photo-link-{{$item.id}}">
- <img src="{{$item.thumb}}" class="wall-item-photo{{$item.sparkle}}" id="wall-item-photo-{{$item.id}}" style="height: 80px; width: 80px;" alt="{{$item.name}}" /></a>
- <span onclick="openClose('wall-item-photo-menu-{{$item.id}}');" class="fakelink wall-item-photo-menu-button" id="wall-item-photo-menu-button-{{$item.id}}">menu</span>
- <div class="wall-item-photo-menu" id="wall-item-photo-menu-{{$item.id}}">
- <ul>
- {{$item.item_photo_menu}}
- </ul>
- </div>
-
- </div>
- <div class="wall-item-photo-end"></div>
- <div class="wall-item-wrapper" id="wall-item-wrapper-{{$item.id}}" >
- {{if $item.lock}}<div class="wall-item-lock"><img src="images/lock_icon.gif" class="lockview" alt="{{$item.lock}}" onclick="lockview(event,{{$item.id}});" /></div>
- {{else}}<div class="wall-item-lock"></div>{{/if}}
- <div class="wall-item-location" id="wall-item-location-{{$item.id}}">{{$item.location}}</div>
- </div>
- </div>
- <div class="wall-item-author">
- <a href="{{$item.profile_url}}" title="{{$item.linktitle}}" class="wall-item-name-link"><span class="wall-item-name{{$item.sparkle}}" id="wall-item-name-{{$item.id}}" >{{$item.name}}</span></a>{{if $item.owner_url}} {{$item.to}} <a href="{{$item.owner_url}}" target="redir" title="{{$item.olinktitle}}" class="wall-item-name-link"><span class="wall-item-name{{$item.osparkle}}" id="wall-item-ownername-{{$item.id}}">{{$item.owner_name}}</span></a> {{$item.vwall}}{{/if}}<br />
- <div class="wall-item-ago" id="wall-item-ago-{{$item.id}}" title="{{$item.localtime}}">{{$item.ago}}</div>
- </div>
- <div class="wall-item-content" id="wall-item-content-{{$item.id}}" >
- <div class="wall-item-title" id="wall-item-title-{{$item.id}}">{{$item.title}}</div>
- <div class="wall-item-title-end"></div>
- <div class="wall-item-body" id="wall-item-body-{{$item.id}}" >{{$item.body}}
- <div class="body-tag">
- {{foreach $item.tags as $tag}}
- <span class='tag'>{{$tag}}</span>
- {{/foreach}}
- </div>
- {{if $item.has_cats}}
- <div class="categorytags"><span>{{$item.txt_cats}} {{foreach $item.categories as $cat}}{{$cat.name}} <a href="{{$cat.removeurl}}" title="{{$remove}}">[{{$remove}}]</a> {{if $cat.last}}{{else}}, {{/if}}{{/foreach}}
- </div>
- {{/if}}
-
- {{if $item.has_folders}}
- <div class="filesavetags"><span>{{$item.txt_folders}} {{foreach $item.folders as $cat}}{{$cat.name}} <a href="{{$cat.removeurl}}" title="{{$remove}}">[{{$remove}}]</a> {{if $cat.last}}{{else}}, {{/if}}{{/foreach}}
- </div>
- {{/if}}
- </div>
- </div>
- <div class="wall-item-tools" id="wall-item-tools-{{$item.id}}">
- {{if $item.vote}}
- <div class="wall-item-like-buttons" id="wall-item-like-buttons-{{$item.id}}">
- <a href="#" class="icon like" title="{{$item.vote.like.0}}" onclick="dolike({{$item.id}},'like'); return false"></a>
- {{if $item.nolike}}
- <a href="#" class="icon dislike" title="{{$item.vote.dislike.0}}" onclick="dolike({{$item.id}},'dislike'); return false"></a>
- {{/if}}
- {{if $item.vote.share}}<a href="#" class="icon recycle wall-item-share-buttons" title="{{$item.vote.share.0}}" onclick="jotShare({{$item.id}}); return false"></a>{{/if}}
- </div>
- {{/if}}
- {{if $item.plink}}
- <div class="wall-item-links-wrapper"><a href="{{$item.plink.href}}" title="{{$item.plink.title}}" target="external-link" class="icon remote-link{{$item.sparkle}}"></a></div>
- {{/if}}
- {{if $item.edpost}}
- <a class="editpost icon pencil" href="{{$item.edpost.0}}" title="{{$item.edpost.1}}"></a>
- {{/if}}
-
- {{if $item.star}}
- <a href="#" id="starred-{{$item.id}}" onclick="dostar({{$item.id}}); return false;" class="star-item icon {{$item.isstarred}}" title="{{$item.star.toggle}}"></a>
- <a href="#" id="tagger-{{$item.id}}" onclick="itemTag({{$item.id}}); return false;" class="tag-item icon tagged" title="{{$item.star.tagger}}"></a>
- {{/if}}
- {{if $item.filer}}
- <a href="#" id="filer-{{$item.id}}" onclick="itemFiler({{$item.id}}); return false;" class="filer-item filer-icon" title="{{$item.filer}}"></a>
- {{/if}}
- <img id="like-rotator-{{$item.id}}" class="like-rotator" src="images/rotator.gif" alt="{{$item.wait}}" title="{{$item.wait}}" style="display: none;" />
-
- <div class="wall-item-delete-wrapper" id="wall-item-delete-wrapper-{{$item.id}}" >
- {{if $item.drop.dropping}}<a href="item/drop/{{$item.id}}" onclick="return confirmDelete();" class="icon drophide" title="{{$item.drop.delete}}" onmouseover="imgbright(this);" onmouseout="imgdull(this);" ></a>{{/if}}
- </div>
- {{if $item.drop.pagedrop}}<input type="checkbox" onclick="checkboxhighlight(this);" title="{{$item.drop.select}}" class="item-select" name="itemselected[]" value="{{$item.id}}" />{{/if}}
- <div class="wall-item-delete-end"></div>
- </div>
- </div>
- <div class="wall-item-wrapper-end"></div>
- <div class="wall-item-like {{$item.indent}}" id="wall-item-like-{{$item.id}}">{{$item.like}}</div>
- <div class="wall-item-dislike {{$item.indent}}" id="wall-item-dislike-{{$item.id}}">{{$item.dislike}}</div>
-
- {{if $item.threaded}}
- {{if $item.comment}}
- <div class="wall-item-comment-wrapper {{$item.indent}}" >
- {{$item.comment}}
- </div>
- {{/if}}
- {{/if}}
-
-<div class="wall-item-outside-wrapper-end {{$item.indent}}" ></div>
-</div>
-{{foreach $item.children as $child}}
- {{include file="{{$child.template}}" item=$child}}
-{{/foreach}}
-
-{{if $item.flatten}}
-<div class="wall-item-comment-wrapper" >
- {{$item.comment}}
-</div>
-{{/if}}
-</div>
-{{if $item.comment_lastcollapsed}}</div>{{/if}}
diff --git a/view/tpl/smarty3/wallmessage.tpl b/view/tpl/smarty3/wallmessage.tpl
deleted file mode 100644
index 6eeabe9ed..000000000
--- a/view/tpl/smarty3/wallmessage.tpl
+++ /dev/null
@@ -1,37 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-
-<h3>{{$header}}</h3>
-
-<h4>{{$subheader}}</h4>
-
-<div id="prvmail-wrapper" >
-<form id="prvmail-form" action="wallmessage/{{$nickname}}" method="post" >
-
-{{$parent}}
-
-<div id="prvmail-to-label">{{$to}}</div>
-{{$recipname}}
-
-<div id="prvmail-subject-label">{{$subject}}</div>
-<input type="text" size="64" maxlength="255" id="prvmail-subject" name="subject" value="{{$subjtxt}}" {{$readonly}} tabindex="11" />
-
-<div id="prvmail-message-label">{{$yourmessage}}</div>
-<textarea rows="8" cols="72" class="prvmail-text" id="prvmail-text" name="body" tabindex="12">{{$text}}</textarea>
-
-
-<div id="prvmail-submit-wrapper" >
- <input type="submit" id="prvmail-submit" name="submit" value="Submit" tabindex="13" />
- <div id="prvmail-link-wrapper" >
- <div id="prvmail-link" class="icon border link" title="{{$insert}}" onclick="jotGetLink();" ></div>
- </div>
- <div id="prvmail-rotator-wrapper" >
- <img id="prvmail-rotator" src="images/rotator.gif" alt="{{$wait}}" title="{{$wait}}" style="display: none;" />
- </div>
-</div>
-<div id="prvmail-end"></div>
-</form>
-</div>
diff --git a/view/tpl/smarty3/wallmsg-header.tpl b/view/tpl/smarty3/wallmsg-header.tpl
deleted file mode 100644
index 1f5a1abc1..000000000
--- a/view/tpl/smarty3/wallmsg-header.tpl
+++ /dev/null
@@ -1,87 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-
-<script language="javascript" type="text/javascript" src="{{$baseurl}}/library/tinymce/jscripts/tiny_mce/tiny_mce_src.js"></script>
-<script language="javascript" type="text/javascript">
-
-var plaintext = '{{$editselect}}';
-
-if(plaintext != 'none') {
- tinyMCE.init({
- theme : "advanced",
- mode : "specific_textareas",
- editor_selector: /(profile-jot-text|prvmail-text)/,
- plugins : "bbcode,paste",
- theme_advanced_buttons1 : "bold,italic,underline,undo,redo,link,unlink,image,forecolor",
- theme_advanced_buttons2 : "",
- theme_advanced_buttons3 : "",
- theme_advanced_toolbar_location : "top",
- theme_advanced_toolbar_align : "center",
- theme_advanced_blockformats : "blockquote,code",
- gecko_spellcheck : true,
- paste_text_sticky : true,
- entity_encoding : "raw",
- add_unload_trigger : false,
- remove_linebreaks : false,
- force_p_newlines : false,
- force_br_newlines : true,
- forced_root_block : '',
- convert_urls: false,
- content_css: "{{$baseurl}}/view/custom_tinymce.css",
- //Character count
- theme_advanced_path : false,
- setup : function(ed) {
- ed.onInit.add(function(ed) {
- ed.pasteAsPlainText = true;
- var editorId = ed.editorId;
- var textarea = $('#'+editorId);
- if (typeof(textarea.attr('tabindex')) != "undefined") {
- $('#'+editorId+'_ifr').attr('tabindex', textarea.attr('tabindex'));
- textarea.attr('tabindex', null);
- }
- });
- }
- });
-}
-else
- $("#prvmail-text").contact_autocomplete(baseurl+"/acl");
-
-
-</script>
-<script>
-
- function jotGetLink() {
- reply = prompt("{{$linkurl}}");
- if(reply && reply.length) {
- $('#profile-rotator').show();
- $.get('parse_url?url=' + reply, function(data) {
- tinyMCE.execCommand('mceInsertRawHTML',false,data);
- $('#profile-rotator').hide();
- });
- }
- }
-
- function linkdropper(event) {
- var linkFound = event.dataTransfer.types.contains("text/uri-list");
- if(linkFound)
- event.preventDefault();
- }
-
- function linkdrop(event) {
- var reply = event.dataTransfer.getData("text/uri-list");
- event.target.textContent = reply;
- event.preventDefault();
- if(reply && reply.length) {
- $('#profile-rotator').show();
- $.get('parse_url?url=' + reply, function(data) {
- tinyMCE.execCommand('mceInsertRawHTML',false,data);
- $('#profile-rotator').hide();
- });
- }
- }
-
-</script>
-
diff --git a/view/tpl/smarty3/wallwall_item.tpl b/view/tpl/smarty3/wallwall_item.tpl
deleted file mode 100644
index a7430e8da..000000000
--- a/view/tpl/smarty3/wallwall_item.tpl
+++ /dev/null
@@ -1,91 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<a name="{{$item.id}}" ></a>
-<div class="wall-item-outside-wrapper {{$item.indent}}{{$item.previewing}} wallwall" id="wall-item-outside-wrapper-{{$item.id}}" >
- <div class="wall-item-content-wrapper {{$item.indent}}" id="wall-item-content-wrapper-{{$item.id}}" >
- <div class="wall-item-info wallwall" id="wall-item-info-{{$item.id}}">
- <div class="wall-item-photo-wrapper wwto" id="wall-item-ownerphoto-wrapper-{{$item.id}}" >
- <a href="{{$item.owner_url}}" title="{{$item.olinktitle}}" class="wall-item-photo-link" id="wall-item-ownerphoto-link-{{$item.id}}">
- <img src="{{$item.owner_photo}}" class="wall-item-photo{{$item.osparkle}}" id="wall-item-ownerphoto-{{$item.id}}" style="height: 80px; width: 80px;" alt="{{$item.owner_name}}" /></a>
- </div>
- <div class="wall-item-arrowphoto-wrapper" ><img src="images/larrow.gif" alt="{{$item.wall}}" /></div>
- <div class="wall-item-photo-wrapper wwfrom" id="wall-item-photo-wrapper-{{$item.id}}"
- onmouseover="if (typeof t{{$item.id}} != 'undefined') clearTimeout(t{{$item.id}}); openMenu('wall-item-photo-menu-button-{{$item.id}}')"
- onmouseout="t{{$item.id}}=setTimeout('closeMenu(\'wall-item-photo-menu-button-{{$item.id}}\'); closeMenu(\'wall-item-photo-menu-{{$item.id}}\');',200)">
- <a href="{{$item.profile_url}}" title="{{$item.linktitle}}" class="wall-item-photo-link" id="wall-item-photo-link-{{$item.id}}">
- <img src="{{$item.thumb}}" class="wall-item-photo{{$item.sparkle}}" id="wall-item-photo-{{$item.id}}" style="height: 80px; width: 80px;" alt="{{$item.name}}" /></a>
- <span onclick="openClose('wall-item-photo-menu-{{$item.id}}');" class="fakelink wall-item-photo-menu-button" id="wall-item-photo-menu-button-{{$item.id}}">menu</span>
- <div class="wall-item-photo-menu" id="wall-item-photo-menu-{{$item.id}}">
- <ul>
- {{$item.item_photo_menu}}
- </ul>
- </div>
-
- </div>
- <div class="wall-item-photo-end"></div>
- <div class="wall-item-wrapper" id="wall-item-wrapper-{{$item.id}}" >
- {{if $item.lock}}<div class="wall-item-lock"><img src="images/lock_icon.gif" class="lockview" alt="{{$item.lock}}" onclick="lockview(event,{{$item.id}});" /></div>
- {{else}}<div class="wall-item-lock"></div>{{/if}}
- <div class="wall-item-location" id="wall-item-location-{{$item.id}}">{{$item.location}}</div>
- </div>
- </div>
- <div class="wall-item-author">
- <a href="{{$item.profile_url}}" title="{{$item.linktitle}}" class="wall-item-name-link"><span class="wall-item-name{{$item.sparkle}}" id="wall-item-name-{{$item.id}}" >{{$item.name}}</span></a> {{$item.to}} <a href="{{$item.owner_url}}" title="{{$item.olinktitle}}" class="wall-item-name-link"><span class="wall-item-name{{$item.osparkle}}" id="wall-item-ownername-{{$item.id}}">{{$item.owner_name}}</span></a> {{$item.vwall}}<br />
- <div id="wall-item-ago-{{$item.id}}" class="wall-item-ago"><abbr class="wall-item-ago-time" title="{{$item.localtime}}">{{$item.ago}}</abbr>{{if $item.app}}<span class="item.app">{{$item.str_app}}</span>{{/if}}</div>
- </div>
- <div class="wall-item-content" id="wall-item-content-{{$item.id}}" >
- <div class="wall-item-title" id="wall-item-title-{{$item.id}}">{{$item.title}}</div>
- <div class="wall-item-title-end"></div>
- <div class="wall-item-body" id="wall-item-body-{{$item.id}}" >{{$item.body}}
- <div class="body-tag">
- {{foreach $item.tags as $tag}}
- <span class='tag'>{{$tag}}</span>
- {{/foreach}}
- </div>
- </div>
- </div>
- <div class="wall-item-tools" id="wall-item-tools-{{$item.id}}">
- {{if $item.vote}}
- <div class="wall-item-like-buttons" id="wall-item-like-buttons-{{$item.id}}">
- <a href="#" class="icon like" title="{{$item.vote.like.0}}" onclick="dolike({{$item.id}},'like'); return false"></a>
- <a href="#" class="icon dislike" title="{{$item.vote.dislike.0}}" onclick="dolike({{$item.id}},'dislike'); return false"></a>
- {{if $item.vote.share}}<a href="#" class="icon recycle wall-item-share-buttons" title="{{$item.vote.share.0}}" onclick="jotShare({{$item.id}}); return false"></a>{{/if}}
- <img id="like-rotator-{{$item.id}}" class="like-rotator" src="images/rotator.gif" alt="{{$item.wait}}" title="{{$item.wait}}" style="display: none;" />
- </div>
- {{/if}}
- {{if $item.plink}}
- <div class="wall-item-links-wrapper"><a href="{{$item.plink.href}}" title="{{$item.plink.title}}" class="icon remote-link{{$item.sparkle}}"></a></div>
- {{/if}}
- {{if $item.edpost}}
- <a class="editpost icon pencil" href="{{$item.edpost.0}}" title="{{$item.edpost.1}}"></a>
- {{/if}}
-
- {{if $item.star}}
- <a href="#" id="starred-{{$item.id}}" onclick="dostar({{$item.id}}); return false;" class="star-item icon {{$item.isstarred}}" title="{{$item.star.toggle}}"></a>
- <a href="#" id="tagger-{{$item.id}}" onclick="itemTag({{$item.id}}); return false;" class="tag-item icon tagged" title="{{$item.star.tagger}}"></a>
- {{/if}}
- {{if $item.filer}}
- <a href="#" id="filer-{{$item.id}}" onclick="itemFiler({{$item.id}}); return false;" class="filer-item filer-icon" title="{{$item.filer}}"></a>
- {{/if}}
-
- <div class="wall-item-delete-wrapper" id="wall-item-delete-wrapper-{{$item.id}}" >
- {{if $item.drop.dropping}}<a href="item/drop/{{$item.id}}" onclick="return confirmDelete();" class="icon drophide" title="{{$item.drop.delete}}" onmouseover="imgbright(this);" onmouseout="imgdull(this);" ></a>{{/if}}
- </div>
- {{if $item.drop.pagedropping}}<input type="checkbox" onclick="checkboxhighlight(this);" title="{{$item.drop.select}}" class="item-select" name="itemselected[]" value="{{$item.id}}" />{{/if}}
- <div class="wall-item-delete-end"></div>
- </div>
- </div>
- <div class="wall-item-wrapper-end"></div>
- <div class="wall-item-like {{$item.indent}}" id="wall-item-like-{{$item.id}}">{{$item.like}}</div>
- <div class="wall-item-dislike {{$item.indent}}" id="wall-item-dislike-{{$item.id}}">{{$item.dislike}}</div>
- <div class="wall-item-comment-separator"></div>
- <div class="wall-item-comment-wrapper">
- {{$item.comment}}
- </div>
-
-<div class="wall-item-outside-wrapper-end {{$item.indent}}" ></div>
-</div>
-
diff --git a/view/tpl/smarty3/wallwall_thread.tpl b/view/tpl/smarty3/wallwall_thread.tpl
deleted file mode 100644
index 4c17f5106..000000000
--- a/view/tpl/smarty3/wallwall_thread.tpl
+++ /dev/null
@@ -1,112 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-{{if $item.comment_firstcollapsed}}
- <div class="hide-comments-outer">
- <span id="hide-comments-total-{{$item.id}}" class="hide-comments-total">{{$item.num_comments}}</span> <span id="hide-comments-{{$item.id}}" class="hide-comments fakelink" onclick="showHideComments({{$item.id}});">{{$item.hide_text}}</span>
- </div>
- <div id="collapsed-comments-{{$item.id}}" class="collapsed-comments" style="display: none;">
-{{/if}}
-<div id="tread-wrapper-{{$item.id}}" class="tread-wrapper {{$item.toplevel}}">
-<a name="{{$item.id}}" ></a>
-<div class="wall-item-outside-wrapper {{$item.indent}}{{$item.previewing}} wallwall" id="wall-item-outside-wrapper-{{$item.id}}" >
- <div class="wall-item-content-wrapper {{$item.indent}}" id="wall-item-content-wrapper-{{$item.id}}" >
- <div class="wall-item-info wallwall" id="wall-item-info-{{$item.id}}">
- <div class="wall-item-photo-wrapper wwto" id="wall-item-ownerphoto-wrapper-{{$item.id}}" >
- <a href="{{$item.owner_url}}" title="{{$item.olinktitle}}" class="wall-item-photo-link" id="wall-item-ownerphoto-link-{{$item.id}}">
- <img src="{{$item.owner_photo}}" class="wall-item-photo{{$item.osparkle}}" id="wall-item-ownerphoto-{{$item.id}}" style="height: 80px; width: 80px;" alt="{{$item.owner_name}}" /></a>
- </div>
- <div class="wall-item-arrowphoto-wrapper" ><img src="images/larrow.gif" alt="{{$item.wall}}" /></div>
- <div class="wall-item-photo-wrapper wwfrom" id="wall-item-photo-wrapper-{{$item.id}}"
- onmouseover="if (typeof t{{$item.id}} != 'undefined') clearTimeout(t{{$item.id}}); openMenu('wall-item-photo-menu-button-{{$item.id}}')"
- onmouseout="t{{$item.id}}=setTimeout('closeMenu(\'wall-item-photo-menu-button-{{$item.id}}\'); closeMenu(\'wall-item-photo-menu-{{$item.id}}\');',200)">
- <a href="{{$item.profile_url}}" title="{{$item.linktitle}}" class="wall-item-photo-link" id="wall-item-photo-link-{{$item.id}}">
- <img src="{{$item.thumb}}" class="wall-item-photo{{$item.sparkle}}" id="wall-item-photo-{{$item.id}}" style="height: 80px; width: 80px;" alt="{{$item.name}}" /></a>
- <span onclick="openClose('wall-item-photo-menu-{{$item.id}}');" class="fakelink wall-item-photo-menu-button" id="wall-item-photo-menu-button-{{$item.id}}">menu</span>
- <div class="wall-item-photo-menu" id="wall-item-photo-menu-{{$item.id}}">
- <ul>
- {{$item.item_photo_menu}}
- </ul>
- </div>
-
- </div>
- <div class="wall-item-photo-end"></div>
- <div class="wall-item-wrapper" id="wall-item-wrapper-{{$item.id}}" >
- {{if $item.lock}}<div class="wall-item-lock"><img src="images/lock_icon.gif" class="lockview" alt="{{$item.lock}}" onclick="lockview(event,{{$item.id}});" /></div>
- {{else}}<div class="wall-item-lock"></div>{{/if}}
- <div class="wall-item-location" id="wall-item-location-{{$item.id}}">{{$item.location}}</div>
- </div>
- </div>
- <div class="wall-item-author">
- <a href="{{$item.profile_url}}" title="{{$item.linktitle}}" class="wall-item-name-link"><span class="wall-item-name{{$item.sparkle}}" id="wall-item-name-{{$item.id}}" >{{$item.name}}</span></a> {{$item.to}} <a href="{{$item.owner_url}}" title="{{$item.olinktitle}}" class="wall-item-name-link"><span class="wall-item-name{{$item.osparkle}}" id="wall-item-ownername-{{$item.id}}">{{$item.owner_name}}</span></a> {{$item.vwall}}<br />
- <div class="wall-item-ago" id="wall-item-ago-{{$item.id}}">{{$item.ago}}</div>
- </div>
- <div class="wall-item-content" id="wall-item-content-{{$item.id}}" >
- <div class="wall-item-title" id="wall-item-title-{{$item.id}}">{{$item.title}}</div>
- <div class="wall-item-title-end"></div>
- <div class="wall-item-body" id="wall-item-body-{{$item.id}}" >{{$item.body}}
- <div class="body-tag">
- {{foreach $item.tags as $tag}}
- <span class='tag'>{{$tag}}</span>
- {{/foreach}}
- </div>
- </div>
- </div>
- <div class="wall-item-tools" id="wall-item-tools-{{$item.id}}">
- {{if $item.vote}}
- <div class="wall-item-like-buttons" id="wall-item-like-buttons-{{$item.id}}">
- <a href="#" class="icon like" title="{{$item.vote.like.0}}" onclick="dolike({{$item.id}},'like'); return false"></a>
- <a href="#" class="icon dislike" title="{{$item.vote.dislike.0}}" onclick="dolike({{$item.id}},'dislike'); return false"></a>
- {{if $item.vote.share}}<a href="#" class="icon recycle wall-item-share-buttons" title="{{$item.vote.share.0}}" onclick="jotShare({{$item.id}}); return false"></a>{{/if}}
- <img id="like-rotator-{{$item.id}}" class="like-rotator" src="images/rotator.gif" alt="{{$item.wait}}" title="{{$item.wait}}" style="display: none;" />
- </div>
- {{/if}}
- {{if $item.plink}}
- <div class="wall-item-links-wrapper"><a href="{{$item.plink.href}}" title="{{$item.plink.title}}" class="icon remote-link{{$item.sparkle}}"></a></div>
- {{/if}}
- {{if $item.edpost}}
- <a class="editpost icon pencil" href="{{$item.edpost.0}}" title="{{$item.edpost.1}}"></a>
- {{/if}}
-
- {{if $item.star}}
- <a href="#" id="starred-{{$item.id}}" onclick="dostar({{$item.id}}); return false;" class="star-item icon {{$item.isstarred}}" title="{{$item.star.toggle}}"></a>
- <a href="#" id="tagger-{{$item.id}}" onclick="itemTag({{$item.id}}); return false;" class="tag-item icon tagged" title="{{$item.star.tagger}}"></a>
- {{/if}}
- {{if $item.filer}}
- <a href="#" id="filer-{{$item.id}}" onclick="itemFiler({{$item.id}}); return false;" class="filer-item filer-icon" title="{{$item.filer}}"></a>
- {{/if}}
-
- <div class="wall-item-delete-wrapper" id="wall-item-delete-wrapper-{{$item.id}}" >
- {{if $item.drop.dropping}}<a href="item/drop/{{$item.id}}" onclick="return confirmDelete();" class="icon drophide" title="{{$item.drop.delete}}" onmouseover="imgbright(this);" onmouseout="imgdull(this);" ></a>{{/if}}
- </div>
- {{if $item.drop.dropping}}<input type="checkbox" onclick="checkboxhighlight(this);" title="{{$item.drop.select}}" class="item-select" name="itemselected[]" value="{{$item.id}}" />{{/if}}
- <div class="wall-item-delete-end"></div>
- </div>
- </div>
- <div class="wall-item-wrapper-end"></div>
- <div class="wall-item-like {{$item.indent}}" id="wall-item-like-{{$item.id}}">{{$item.like}}</div>
- <div class="wall-item-dislike {{$item.indent}}" id="wall-item-dislike-{{$item.id}}">{{$item.dislike}}</div>
-
- {{if $item.threaded}}
- {{if $item.comment}}
- <div class="wall-item-comment-wrapper {{$item.indent}}" >
- {{$item.comment}}
- </div>
- {{/if}}
- {{/if}}
-
-<div class="wall-item-outside-wrapper-end {{$item.indent}}" ></div>
-</div>
-{{foreach $item.children as $item}}
- {{include file="{{$item.template}}"}}
-{{/foreach}}
-
-{{if $item.flatten}}
-<div class="wall-item-comment-wrapper" >
- {{$item.comment}}
-</div>
-{{/if}}
-</div>
-{{if $item.comment_lastcollapsed}}</div>{{/if}}
diff --git a/view/tpl/smarty3/xchan_vcard.tpl b/view/tpl/smarty3/xchan_vcard.tpl
deleted file mode 100644
index 8878a773a..000000000
--- a/view/tpl/smarty3/xchan_vcard.tpl
+++ /dev/null
@@ -1,25 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<div class="vcard">
-<div class="fn">{{$name}}</div>
-<div id="profile-photo-wrapper"><img class="vcard-photo photo" src="{{$photo}}" alt="name" /></div>
-</div>
-
-
-
-<div id="profile-extra-links">
-<ul>
-{{if $connect}}
- <li><a id="follow-link" href="follow?f=&url={{$follow}}">{{$connect}}</a></li>
-{{/if}}
-{{if $newwin}}
- <li><a id="visit-chan-link" href="{{$url}}" title="{{$newtit}}" target="_blank" >{{$newwin}}</a></li>
-{{/if}}
-</ul>
-
-
-</div>
-
diff --git a/view/tpl/smarty3/xrd_host.tpl b/view/tpl/smarty3/xrd_host.tpl
deleted file mode 100644
index 1f273e010..000000000
--- a/view/tpl/smarty3/xrd_host.tpl
+++ /dev/null
@@ -1,23 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<?xml version='1.0' encoding='UTF-8'?>
-<XRD xmlns='http://docs.oasis-open.org/ns/xri/xrd-1.0'
- xmlns:hm='http://host-meta.net/xrd/1.0'>
-
- <hm:Host>{{$zhost}}</hm:Host>
-
- <Link rel='lrdd' template='{{$domain}}/xrd/?uri={uri}' />
- <Link rel='acct-mgmt' href='{{$domain}}/amcd' />
- <Link rel='http://services.mozilla.com/amcd/0.1' href='{{$domain}}/amcd' />
- <Link rel="http://oexchange.org/spec/0.8/rel/resident-target" type="application/xrd+xml"
- href="{{$domain}}/oexchange/xrd" />
-
- <Property xmlns:mk="http://salmon-protocol.org/ns/magic-key"
- type="http://salmon-protocol.org/ns/magic-key"
- mk:key_id="1">{{$bigkey}}</Property>
-
-
-</XRD>
diff --git a/view/tpl/smarty3/xrd_person.tpl b/view/tpl/smarty3/xrd_person.tpl
deleted file mode 100644
index 2b914fa34..000000000
--- a/view/tpl/smarty3/xrd_person.tpl
+++ /dev/null
@@ -1,34 +0,0 @@
-{{*
- * AUTOMATICALLY GENERATED TEMPLATE
- * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
- *
- *}}
-<?xml version="1.0" encoding="UTF-8"?>
-<XRD xmlns="http://docs.oasis-open.org/ns/xri/xrd-1.0">
-
- <Subject>{{$accturi}}</Subject>
- <Alias>{{$accturi}}</Alias>
- <Alias>{{$profile_url}}</Alias>
-
- <Link rel="http://purl.org/macgirvin/dfrn/1.0"
- href="{{$profile_url}}" />
- <Link rel="http://schemas.google.com/g/2010#updates-from"
- type="application/atom+xml"
- href="{{$atom}}" />
- <Link rel="http://webfinger.net/rel/profile-page"
- type="text/html"
- href="{{$profile_url}}" />
- <Link rel="http://microformats.org/profile/hcard"
- type="text/html"
- href="{{$hcard_url}}" />
- <Link rel="http://portablecontacts.net/spec/1.0"
- href="{{$poco_url}}" />
- <Link rel="http://webfinger.net/rel/avatar"
- type="image/jpeg"
- href="{{$photo}}" />
-
- <Property xmlns:mk="http://salmon-protocol.org/ns/magic-key"
- type="http://salmon-protocol.org/ns/magic-key"
- mk:key_id="1">{{$bigkey}}</Property>
-
-</XRD>
diff --git a/view/tpl/sources_edit.tpl b/view/tpl/sources_edit.tpl
new file mode 100644
index 000000000..34023e03f
--- /dev/null
+++ b/view/tpl/sources_edit.tpl
@@ -0,0 +1,22 @@
+<h1>{{$title}}</h1>
+
+<div class="descriptive-text">{{$desc}}</div>
+
+<form action="sources" method="post">
+<input type="hidden" name="source" value="{{$id}}" />
+<input type="hidden" id="id_abook" name="abook" value="{{$abook}}" />
+{{include file="field_input.tpl" field=$name}}
+{{include file="field_textarea.tpl" field=$words}}
+
+<div class="sources-submit-wrapper" >
+<input type="submit" name="submit" class="sources-submit" value="{{$submit}}" />
+</div>
+</form>
+<br />
+<br />
+<a href="sources/{{$id}}/drop">{{$drop}}</a>
+
+
+
+
+
diff --git a/view/tpl/sources_list.tpl b/view/tpl/sources_list.tpl
new file mode 100644
index 000000000..5fe50ba98
--- /dev/null
+++ b/view/tpl/sources_list.tpl
@@ -0,0 +1,15 @@
+<h1>{{$title}}</h1>
+
+<div class="descriptive-text">{{$desc}}</div>
+
+<div class="sources-links">
+<a href="sources/new">{{$new}}</a>
+</div>
+
+{{if $sources}}
+<ul class="sources-list">
+{{foreach $sources as $source}}
+<li><a href="sources/{{$source.src_id}}">{{$source.xchan_name}}</a></li>
+{{/foreach}}
+</ul>
+{{/if}} \ No newline at end of file
diff --git a/view/tpl/sources_new.tpl b/view/tpl/sources_new.tpl
new file mode 100644
index 000000000..3c6a4be30
--- /dev/null
+++ b/view/tpl/sources_new.tpl
@@ -0,0 +1,15 @@
+<h1>{{$title}}</h1>
+
+<div class="descriptive-text">{{$desc}}</div>
+
+<form action="sources" method="post">
+<input type="hidden" id="id_abook" name="abook" value="{{$abook}}" />
+{{include file="field_input.tpl" field=$name}}
+{{include file="field_textarea.tpl" field=$words}}
+
+<div class="sources-submit-wrapper" >
+<input type="submit" name="submit" class="sources-submit" value="{{$submit}}" />
+</div>
+</form>
+
+
diff --git a/view/tpl/suggest_friends.tpl b/view/tpl/suggest_friends.tpl
index e97b5e8cc..0388504d2 100644..100755
--- a/view/tpl/suggest_friends.tpl
+++ b/view/tpl/suggest_friends.tpl
@@ -1,16 +1,16 @@
<div class="profile-match-wrapper">
- <a href="$ignlnk" title="$ignore" class="icon drophide profile-match-ignore" onmouseout="imgdull(this);" onmouseover="imgbright(this);" onclick="return confirmDelete();" ></a>
+ <a href="{{$entry.ignlnk}}" title="{{$entry.ignore}}" class="profile-match-ignore" onclick="return confirmDelete();" ><i class="icon-remove drop-icons"></i></a>
<div class="profile-match-photo">
- <a href="$url">
- <img src="$photo" alt="$name" width="80" height="80" title="$name [$url]" />
+ <a href="{{$entry.url}}">
+ <img src="{{$entry.photo}}" alt="{{$entry.name}}" width="80" height="80" title="{{$entry.name}} [{{$entry.profile}}]" />
</a>
</div>
<div class="profile-match-break"></div>
<div class="profile-match-name">
- <a href="$url" title="$name">$name</a>
+ <a href="{{$entry.url}}" title="{{$entry.name}}">{{$entry.name}}</a>
</div>
<div class="profile-match-end"></div>
- {{ if $connlnk }}
- <div class="profile-match-connect"><a href="$connlnk" title="$conntxt">$conntxt</a></div>
- {{ endif }}
-</div> \ No newline at end of file
+ {{if $entry.connlnk}}
+ <div class="profile-match-connect"><a href="{{$entry.connlnk}}" title="{{$entry.conntxt}}">{{$entry.conntxt}}</a></div>
+ {{/if}}
+</div>
diff --git a/view/tpl/suggest_page.tpl b/view/tpl/suggest_page.tpl
new file mode 100755
index 000000000..97837c852
--- /dev/null
+++ b/view/tpl/suggest_page.tpl
@@ -0,0 +1,9 @@
+<h3>{{$title}}</h3>
+
+{{if $entries}}
+{{foreach $entries as $child}}
+{{include file="suggest_friends.tpl" entry=$child}}
+{{/foreach}}
+{{/if}}
+
+<div class="clear"></div>
diff --git a/view/tpl/suggest_widget.tpl b/view/tpl/suggest_widget.tpl
new file mode 100644
index 000000000..eba8b496e
--- /dev/null
+++ b/view/tpl/suggest_widget.tpl
@@ -0,0 +1,10 @@
+<div class="widget">
+<h3>{{$title}}</h3>
+{{if $entries}}
+{{foreach $entries as $child}}
+{{include file="suggest_friends.tpl" entry=$child}}
+{{/foreach}}
+{{/if}}
+<div class="clear"></div>
+<div class="suggest-widget-more"><a href="suggest">{{$more}}</a></div>
+</div> \ No newline at end of file
diff --git a/view/tpl/suggestions.tpl b/view/tpl/suggestions.tpl
index 656336496..2d9cba325 100644..100755
--- a/view/tpl/suggestions.tpl
+++ b/view/tpl/suggestions.tpl
@@ -1,21 +1,20 @@
-
<div class="intro-wrapper" >
-<p class="intro-desc">$str_notifytype $notify_type</p>
-<div class="intro-madeby">$madeby</div>
-<div class="intro-fullname" >$fullname</div>
-<a class="intro-url-link" href="$url" ><img class="intro-photo lframe" src="$photo" width="175" height=175" title="$fullname" alt="$fullname" /></a>
-<div class="intro-note" >$note</div>
+<p class="intro-desc">{{$str_notifytype}} {{$notify_type}}</p>
+<div class="intro-madeby">{{$madeby}}</div>
+<div class="intro-fullname" >{{$fullname}}</div>
+<a class="intro-url-link" href="{{$url}}" ><img class="intro-photo lframe" src="{{$photo}}" width="175" height=175" title="{{$fullname}}" alt="{{$fullname}}" /></a>
+<div class="intro-note" >{{$note}}</div>
<div class="intro-wrapper-end"></div>
-<form class="intro-form" action="notifications/$intro_id" method="post">
-<input class="intro-submit-ignore" type="submit" name="submit" value="$ignore" />
-<input class="intro-submit-discard" type="submit" name="submit" value="$discard" />
+<form class="intro-form" action="notifications/{{$intro_id}}" method="post">
+<input class="intro-submit-ignore" type="submit" name="submit" value="{{$ignore}}" />
+<input class="intro-submit-discard" type="submit" name="submit" value="{{$discard}}" />
</form>
<div class="intro-form-end"></div>
-<form class="intro-approve-form" action="$request" method="get">
-{{inc field_checkbox.tpl with $field=$hidden }}{{endinc}}
-<input class="intro-submit-approve" type="submit" name="submit" value="$approve" />
+<form class="intro-approve-form" action="{{$request}}" method="get">
+{{include file="field_checkbox.tpl" field=$hidden}}
+<input class="intro-submit-approve" type="submit" name="submit" value="{{$approve}}" />
</form>
</div>
<div class="intro-end"></div>
diff --git a/view/tpl/tag_slap.tpl b/view/tpl/tag_slap.tpl
deleted file mode 100644
index 231a13f10..000000000
--- a/view/tpl/tag_slap.tpl
+++ /dev/null
@@ -1,30 +0,0 @@
- <entry>
- <author>
- <name>$name</name>
- <uri>$profile_page</uri>
- <link rel="photo" type="image/jpeg" media:width="80" media:height="80" href="$thumb" />
- <link rel="avatar" type="image/jpeg" media:width="80" media:height="80" href="$thumb" />
- </author>
-
- <id>$item_id</id>
- <title>$title</title>
- <published>$published</published>
- <content type="$type" >$content</content>
- <link rel="mentioned" href="$accturi" />
- <as:actor>
- <as:obj_type>http://activitystrea.ms/schema/1.0/person</as:obj_type>
- <id>$profile_page</id>
- <title></title>
- <link rel="avatar" type="image/jpeg" media:width="175" media:height="175" href="$photo"/>
- <link rel="avatar" type="image/jpeg" media:width="80" media:height="80" href="$thumb"/>
- <poco:preferredUsername>$nick</poco:preferredUsername>
- <poco:displayName>$name</poco:displayName>
- </as:actor>
- <as:verb>$verb</as:verb>
- <as:object>
- <as:obj_type></as:obj_type>
- </as:object>
- <as:target>
- <as:obj_type></as:obj_type>
- </as:target>
- </entry>
diff --git a/view/tpl/thing_edit.tpl b/view/tpl/thing_edit.tpl
new file mode 100644
index 000000000..8379c15ae
--- /dev/null
+++ b/view/tpl/thing_edit.tpl
@@ -0,0 +1,29 @@
+<h2>{{$thing_hdr}}</h2>
+<form action="thing" method="post" >
+<input type="hidden" name="term_hash" value="{{$thing_hash}}" />
+
+{{if $multiprof }}
+<div class="thing-profile-label">{{$profile_lbl}}</div>
+
+<div class="thing-profile">{{$profile_select}}</div>
+{{/if}}
+
+<div class="thing-verb-label">{{$verb_lbl}}</div>
+
+<div class="thing-verb">{{$verb_select}}</div>
+
+
+<label class="thing-label" for="thing-term">{{$thing_lbl}}</label>
+<input type="text" class="thing-input" id="thing-term" name="term" value="{{$thething}}" />
+<div class="thing-field-end"></div>
+<label class="thing-label" for="thing-url">{{$url_lbl}}</label>
+<input type="text" class="thing-input" id="thing-url" name="url" value="{{$theurl}}" />
+<div class="thing-field-end"></div>
+<label class="thing-label" for="thing-img">{{$img_lbl}}</label>
+<input type="text" class="thing-input" id="thing-img" name="img" value="{{$imgurl}}" />
+<div class="thing-field-end"></div>
+
+<div class="thing-end"></div>
+
+<input type="submit" class="thing-submit" name="submit" value="{{$submit}}" />
+</form>
diff --git a/view/tpl/thing_input.tpl b/view/tpl/thing_input.tpl
new file mode 100644
index 000000000..06cbfe917
--- /dev/null
+++ b/view/tpl/thing_input.tpl
@@ -0,0 +1,28 @@
+<h2>{{$thing_hdr}}</h2>
+<form action="thing" method="post" >
+
+{{if $multiprof }}
+<div class="thing-profile-label">{{$profile_lbl}}</div>
+
+<div class="thing-profile">{{$profile_select}}</div>
+{{/if}}
+
+<div class="thing-verb-label">{{$verb_lbl}}</div>
+
+<div class="thing-verb">{{$verb_select}}</div>
+
+
+<label class="thing-label" for="thing-term">{{$thing_lbl}}</label>
+<input type="text" class="thing-input" id="thing-term" name="term" />
+<div class="thing-field-end"></div>
+<label class="thing-label" for="thing-url">{{$url_lbl}}</label>
+<input type="text" class="thing-input" id="thing-url" name="url" />
+<div class="thing-field-end"></div>
+<label class="thing-label" for="thing-img">{{$img_lbl}}</label>
+<input type="text" class="thing-input" id="thing-img" name="img" />
+<div class="thing-field-end"></div>
+
+<div class="thing-end"></div>
+
+<input type="submit" class="thing-submit" name="submit" value="{{$submit}}" />
+</form>
diff --git a/view/tpl/threaded_conversation.tpl b/view/tpl/threaded_conversation.tpl
index 098e399b7..ea5c3c281 100644..100755
--- a/view/tpl/threaded_conversation.tpl
+++ b/view/tpl/threaded_conversation.tpl
@@ -1,13 +1,8 @@
-{{ for $threads as $thread_item }}
-{{ inc $thread_item.template with $item=$thread_item }}{{ endinc }}
-{{ endfor }}
+{{if $photo_item}}
+{{$photo_item}}
+{{/if}}
+{{foreach $threads as $thread_item}}
+{{include file="{{$thread_item.template}}" item=$thread_item}}
+{{/foreach}}
<div id="conversation-end"></div>
-
-{{ if $dropping }}
-<div id="item-delete-selected" class="fakelink" onclick="deleteCheckedItems();">
- <div id="item-delete-selected-icon" class="icon drophide" title="$dropping" onmouseover="imgbright(this);" onmouseout="imgdull(this);" ></div>
- <div id="item-delete-selected-desc" >$dropping</div>
-</div>
-<div id="item-delete-selected-end"></div>
-{{ endif }}
diff --git a/view/tpl/toggle_mobile_footer.tpl b/view/tpl/toggle_mobile_footer.tpl
index 58695f4df..82c0197ba 100644..100755
--- a/view/tpl/toggle_mobile_footer.tpl
+++ b/view/tpl/toggle_mobile_footer.tpl
@@ -1,2 +1,2 @@
-<a id="toggle_mobile_link" href="$toggle_link">$toggle_text</a>
+<a id="toggle_mobile_link" href="{{$toggle_link}}">{{$toggle_text}}</a>
diff --git a/view/tpl/usermenu.tpl b/view/tpl/usermenu.tpl
new file mode 100644
index 000000000..3904f4696
--- /dev/null
+++ b/view/tpl/usermenu.tpl
@@ -0,0 +1,13 @@
+<div class="pmenu">
+{{if $menu.menu_desc}}
+ <h3 class="pmenu-title">{{$menu.menu_desc}}</h3>
+{{/if}}
+{{if $items }}
+<ul class="pmenu-body">
+{{foreach $items as $mitem }}
+<li class="pmenu-item"><a href="{{$mitem.mitem_link}}" {{if $mitem.newwin}}target="_blank"{{/if}}>{{$mitem.mitem_desc}}</a></li>
+{{/foreach }}
+</ul>
+{{/if}}
+<div class="pmenu-end"></div>
+</div>
diff --git a/view/tpl/viewcontact_template.tpl b/view/tpl/viewcontact_template.tpl
index d6f01643e..18fed6bb4 100644..100755
--- a/view/tpl/viewcontact_template.tpl
+++ b/view/tpl/viewcontact_template.tpl
@@ -1,9 +1,9 @@
-<h3>$title</h3>
+<h3>{{$title}}</h3>
-{{ for $contacts as $contact }}
- {{ inc contact_template.tpl }}{{ endinc }}
-{{ endfor }}
+{{foreach $contacts as $contact}}
+ {{include file="contact_template.tpl"}}
+{{/foreach}}
<div id="view-contact-end"></div>
-$paginate
+{{$paginate}}
diff --git a/view/tpl/wall_item.tpl b/view/tpl/wall_item.tpl
deleted file mode 100644
index e3b2eca0b..000000000
--- a/view/tpl/wall_item.tpl
+++ /dev/null
@@ -1,79 +0,0 @@
-<a name="$item.id" ></a>
-<div class="wall-item-outside-wrapper $item.indent$item.previewing" id="wall-item-outside-wrapper-$item.id" >
- <div class="wall-item-content-wrapper $item.indent" id="wall-item-content-wrapper-$item.id" >
- <div class="wall-item-info" id="wall-item-info-$item.id">
- <div class="wall-item-photo-wrapper" id="wall-item-photo-wrapper-$item.id"
- onmouseover="if (typeof t$item.id != 'undefined') clearTimeout(t$item.id); openMenu('wall-item-photo-menu-button-$item.id')"
- onmouseout="t$item.id=setTimeout('closeMenu(\'wall-item-photo-menu-button-$item.id\'); closeMenu(\'wall-item-photo-menu-$item.id\');',200)">
- <a href="$item.profile_url" title="$item.linktitle" class="wall-item-photo-link" id="wall-item-photo-link-$item.id">
- <img src="$item.thumb" class="wall-item-photo$item.sparkle" id="wall-item-photo-$item.id" style="height: 80px; width: 80px;" alt="$item.name" />
- </a>
- <span onclick="openClose('wall-item-photo-menu-$item.id');" class="fakelink wall-item-photo-menu-button" id="wall-item-photo-menu-button-$item.id">menu</span>
- <div class="wall-item-photo-menu" id="wall-item-photo-menu-$item.id">
- <ul>
- $item.item_photo_menu
- </ul>
- </div>
- </div>
- <div class="wall-item-photo-end"></div>
- <div class="wall-item-wrapper" id="wall-item-wrapper-$item.id" >
- {{ if $item.lock }}<div class="wall-item-lock"><img src="images/lock_icon.gif" class="lockview" alt="$item.lock" onclick="lockview(event,$item.id);" /></div>
- {{ else }}<div class="wall-item-lock"></div>{{ endif }}
- <div class="wall-item-location" id="wall-item-location-$item.id">$item.location</div>
- </div>
- </div>
- <div class="wall-item-author">
- <a href="$item.profile_url" title="$item.linktitle" class="wall-item-name-link"><span class="wall-item-name$item.sparkle" id="wall-item-name-$item.id" >$item.name</span></a>
- <div id="wall-item-ago-$item.id" class="wall-item-ago"><abbr class="wall-item-ago-time" title="$item.localtime">$item.ago</abbr>{{ if $item.app }}<span class="item.app">$item.str_app</span>{{ endif }}</div>
-
- </div>
- <div class="wall-item-content" id="wall-item-content-$item.id" >
- <div class="wall-item-title" id="wall-item-title-$item.id">$item.title</div>
- <div class="wall-item-title-end"></div>
- <div class="wall-item-body" id="wall-item-body-$item.id" >$item.body
- <div class="body-tag">
- {{ for $item.tags as $tag }}
- <span class='tag'>$tag</span>
- {{ endfor }}
- </div>
- </div>
- </div>
- <div class="wall-item-tools" id="wall-item-tools-$item.id">
- {{ if $item.vote }}
- <div class="wall-item-like-buttons" id="wall-item-like-buttons-$item.id">
- <a href="#" class="icon like" title="$item.vote.like.0" onclick="dolike($item.id,'like'); return false"></a>
- <a href="#" class="icon dislike" title="$item.vote.dislike.0" onclick="dolike($item.id,'dislike'); return false"></a>
- {{ if $item.vote.share }}<a href="#" class="icon recycle wall-item-share-buttons" title="$item.vote.share.0" onclick="jotShare($item.id); return false"></a>{{ endif }}
- <img id="like-rotator-$item.id" class="like-rotator" src="images/rotator.gif" alt="$item.wait" title="$item.wait" style="display: none;" />
- </div>
- {{ endif }}
- {{ if $item.plink }}
- <div class="wall-item-links-wrapper"><a href="$item.plink.href" title="$item.plink.title" class="icon remote-link$item.sparkle"></a></div>
- {{ endif }}
- {{ if $item.edpost }}
- <a class="editpost icon pencil" href="$item.edpost.0" title="$item.edpost.1"></a>
- {{ endif }}
-
- {{ if $item.star }}
- <a href="#" id="starred-$item.id" onclick="dostar($item.id); return false;" class="star-item icon $item.isstarred" title="$item.star.toggle"></a>
- <a href="#" id="tagger-$item.id" onclick="itemTag($item.id); return false;" class="tag-item icon tagged" title="$item.star.tagger"></a>
- {{ endif }}
- {{ if $item.filer }}
- <a href="#" id="filer-$item.id" onclick="itemFiler($item.id); return false;" class="filer-item filer-icon" title="$item.filer"></a>
- {{ endif }}
- <div class="wall-item-delete-wrapper" id="wall-item-delete-wrapper-$item.id" >
- {{ if $item.drop.dropping }}<a href="item/drop/$item.id" onclick="return confirmDelete();" class="icon drophide" title="$item.drop.delete" onmouseover="imgbright(this);" onmouseout="imgdull(this);" ></a>{{ endif }}
- </div>
- {{ if $item.drop.pagedropping }}<input type="checkbox" onclick="checkboxhighlight(this);" title="$item.drop.select" class="item-select" name="itemselected[]" value="$item.id" />{{ endif }}
- <div class="wall-item-delete-end"></div>
- </div>
- </div>
- <div class="wall-item-wrapper-end"></div>
- <div class="wall-item-like $item.indent" id="wall-item-like-$item.id">$item.like</div>
- <div class="wall-item-dislike $item.indent" id="wall-item-dislike-$item.id">$item.dislike</div>
- <div class="wall-item-comment-wrapper" >
- $item.comment
- </div>
-
-<div class="wall-item-outside-wrapper-end $item.indent" ></div>
-</div>
diff --git a/view/tpl/wall_thread.tpl b/view/tpl/wall_thread.tpl
deleted file mode 100644
index 9a02b2103..000000000
--- a/view/tpl/wall_thread.tpl
+++ /dev/null
@@ -1,120 +0,0 @@
-{{if $item.comment_firstcollapsed}}
- <div class="hide-comments-outer">
- <span id="hide-comments-total-$item.id" class="hide-comments-total">$item.num_comments</span> <span id="hide-comments-$item.id" class="hide-comments fakelink" onclick="showHideComments($item.id);">$item.hide_text</span>
- </div>
- <div id="collapsed-comments-$item.id" class="collapsed-comments" style="display: none;">
-{{endif}}
-<div id="thread-wrapper-$item.id" class="thread-wrapper $item.toplevel">
-<a name="$item.id" ></a>
-<div class="wall-item-outside-wrapper $item.indent$item.previewing{{ if $item.owner_url }} wallwall{{ endif }}" id="wall-item-outside-wrapper-$item.id" >
- <div class="wall-item-content-wrapper $item.indent" id="wall-item-content-wrapper-$item.id" >
- <div class="wall-item-info{{ if $item.owner_url }} wallwall{{ endif }}" id="wall-item-info-$item.id">
- {{ if $item.owner_url }}
- <div class="wall-item-photo-wrapper wwto" id="wall-item-ownerphoto-wrapper-$item.id" >
- <a href="$item.owner_url" title="$item.olinktitle" class="wall-item-photo-link" id="wall-item-ownerphoto-link-$item.id">
- <img src="$item.owner_photo" class="wall-item-photo$item.osparkle" id="wall-item-ownerphoto-$item.id" style="height: 80px; width: 80px;" alt="$item.owner_name" /></a>
- </div>
- <div class="wall-item-arrowphoto-wrapper" ><img src="images/larrow.gif" alt="$item.wall" /></div>
- {{ endif }}
- <div class="wall-item-photo-wrapper{{ if $item.owner_url }} wwfrom{{ endif }}" id="wall-item-photo-wrapper-$item.id"
- onmouseover="if (typeof t$item.id != 'undefined') clearTimeout(t$item.id); openMenu('wall-item-photo-menu-button-$item.id')"
- onmouseout="t$item.id=setTimeout('closeMenu(\'wall-item-photo-menu-button-$item.id\'); closeMenu(\'wall-item-photo-menu-$item.id\');',200)">
- <a href="$item.profile_url" title="$item.linktitle" class="wall-item-photo-link" id="wall-item-photo-link-$item.id">
- <img src="$item.thumb" class="wall-item-photo$item.sparkle" id="wall-item-photo-$item.id" style="height: 80px; width: 80px;" alt="$item.name" /></a>
- <span onclick="openClose('wall-item-photo-menu-$item.id');" class="fakelink wall-item-photo-menu-button" id="wall-item-photo-menu-button-$item.id">menu</span>
- <div class="wall-item-photo-menu" id="wall-item-photo-menu-$item.id">
- <ul>
- $item.item_photo_menu
- </ul>
- </div>
-
- </div>
- <div class="wall-item-photo-end"></div>
- <div class="wall-item-wrapper" id="wall-item-wrapper-$item.id" >
- {{ if $item.lock }}<div class="wall-item-lock"><img src="images/lock_icon.gif" class="lockview" alt="$item.lock" onclick="lockview(event,$item.id);" /></div>
- {{ else }}<div class="wall-item-lock"></div>{{ endif }}
- <div class="wall-item-location" id="wall-item-location-$item.id">$item.location</div>
- </div>
- </div>
- <div class="wall-item-author">
- <a href="$item.profile_url" title="$item.linktitle" class="wall-item-name-link"><span class="wall-item-name$item.sparkle" id="wall-item-name-$item.id" >$item.name</span></a>{{ if $item.owner_url }} $item.to <a href="$item.owner_url" target="redir" title="$item.olinktitle" class="wall-item-name-link"><span class="wall-item-name$item.osparkle" id="wall-item-ownername-$item.id">$item.owner_name</span></a> $item.vwall{{ endif }}<br />
- <div class="wall-item-ago" id="wall-item-ago-$item.id" title="$item.localtime">$item.ago</div>
- </div>
- <div class="wall-item-content" id="wall-item-content-$item.id" >
- <div class="wall-item-title" id="wall-item-title-$item.id">$item.title</div>
- <div class="wall-item-title-end"></div>
- <div class="wall-item-body" id="wall-item-body-$item.id" >$item.body
- <div class="body-tag">
- {{ for $item.tags as $tag }}
- <span class='tag'>$tag</span>
- {{ endfor }}
- </div>
- {{ if $item.has_cats }}
- <div class="categorytags"><span>$item.txt_cats {{ for $item.categories as $cat }}$cat.name <a href="$cat.removeurl" title="$remove">[$remove]</a> {{ if $cat.last }}{{ else }}, {{ endif }}{{ endfor }}
- </div>
- {{ endif }}
-
- {{ if $item.has_folders }}
- <div class="filesavetags"><span>$item.txt_folders {{ for $item.folders as $cat }}$cat.name <a href="$cat.removeurl" title="$remove">[$remove]</a> {{ if $cat.last }}{{ else }}, {{ endif }}{{ endfor }}
- </div>
- {{ endif }}
- </div>
- </div>
- <div class="wall-item-tools" id="wall-item-tools-$item.id">
- {{ if $item.vote }}
- <div class="wall-item-like-buttons" id="wall-item-like-buttons-$item.id">
- <a href="#" class="icon like" title="$item.vote.like.0" onclick="dolike($item.id,'like'); return false"></a>
- {{ if $item.nolike }}
- <a href="#" class="icon dislike" title="$item.vote.dislike.0" onclick="dolike($item.id,'dislike'); return false"></a>
- {{ endif }}
- {{ if $item.vote.share }}<a href="#" class="icon recycle wall-item-share-buttons" title="$item.vote.share.0" onclick="jotShare($item.id); return false"></a>{{ endif }}
- </div>
- {{ endif }}
- {{ if $item.plink }}
- <div class="wall-item-links-wrapper"><a href="$item.plink.href" title="$item.plink.title" target="external-link" class="icon remote-link$item.sparkle"></a></div>
- {{ endif }}
- {{ if $item.edpost }}
- <a class="editpost icon pencil" href="$item.edpost.0" title="$item.edpost.1"></a>
- {{ endif }}
-
- {{ if $item.star }}
- <a href="#" id="starred-$item.id" onclick="dostar($item.id); return false;" class="star-item icon $item.isstarred" title="$item.star.toggle"></a>
- <a href="#" id="tagger-$item.id" onclick="itemTag($item.id); return false;" class="tag-item icon tagged" title="$item.star.tagger"></a>
- {{ endif }}
- {{ if $item.filer }}
- <a href="#" id="filer-$item.id" onclick="itemFiler($item.id); return false;" class="filer-item filer-icon" title="$item.filer"></a>
- {{ endif }}
- <img id="like-rotator-$item.id" class="like-rotator" src="images/rotator.gif" alt="$item.wait" title="$item.wait" style="display: none;" />
-
- <div class="wall-item-delete-wrapper" id="wall-item-delete-wrapper-$item.id" >
- {{ if $item.drop.dropping }}<a href="item/drop/$item.id" onclick="return confirmDelete();" class="icon drophide" title="$item.drop.delete" onmouseover="imgbright(this);" onmouseout="imgdull(this);" ></a>{{ endif }}
- </div>
- {{ if $item.drop.pagedrop }}<input type="checkbox" onclick="checkboxhighlight(this);" title="$item.drop.select" class="item-select" name="itemselected[]" value="$item.id" />{{ endif }}
- <div class="wall-item-delete-end"></div>
- </div>
- </div>
- <div class="wall-item-wrapper-end"></div>
- <div class="wall-item-like $item.indent" id="wall-item-like-$item.id">$item.like</div>
- <div class="wall-item-dislike $item.indent" id="wall-item-dislike-$item.id">$item.dislike</div>
-
- {{ if $item.threaded }}
- {{ if $item.comment }}
- <div class="wall-item-comment-wrapper $item.indent" >
- $item.comment
- </div>
- {{ endif }}
- {{ endif }}
-
-<div class="wall-item-outside-wrapper-end $item.indent" ></div>
-</div>
-{{ for $item.children as $child }}
- {{ inc $child.template with $item=$child }}{{ endinc }}
-{{ endfor }}
-
-{{ if $item.flatten }}
-<div class="wall-item-comment-wrapper" >
- $item.comment
-</div>
-{{ endif }}
-</div>
-{{if $item.comment_lastcollapsed}}</div>{{endif}}
diff --git a/view/tpl/wallmessage.tpl b/view/tpl/wallmessage.tpl
deleted file mode 100644
index 66b2bc3a0..000000000
--- a/view/tpl/wallmessage.tpl
+++ /dev/null
@@ -1,32 +0,0 @@
-
-<h3>$header</h3>
-
-<h4>$subheader</h4>
-
-<div id="prvmail-wrapper" >
-<form id="prvmail-form" action="wallmessage/$nickname" method="post" >
-
-$parent
-
-<div id="prvmail-to-label">$to</div>
-$recipname
-
-<div id="prvmail-subject-label">$subject</div>
-<input type="text" size="64" maxlength="255" id="prvmail-subject" name="subject" value="$subjtxt" $readonly tabindex="11" />
-
-<div id="prvmail-message-label">$yourmessage</div>
-<textarea rows="8" cols="72" class="prvmail-text" id="prvmail-text" name="body" tabindex="12">$text</textarea>
-
-
-<div id="prvmail-submit-wrapper" >
- <input type="submit" id="prvmail-submit" name="submit" value="Submit" tabindex="13" />
- <div id="prvmail-link-wrapper" >
- <div id="prvmail-link" class="icon border link" title="$insert" onclick="jotGetLink();" ></div>
- </div>
- <div id="prvmail-rotator-wrapper" >
- <img id="prvmail-rotator" src="images/rotator.gif" alt="$wait" title="$wait" style="display: none;" />
- </div>
-</div>
-<div id="prvmail-end"></div>
-</form>
-</div>
diff --git a/view/tpl/wallmsg-header.tpl b/view/tpl/wallmsg-header.tpl
deleted file mode 100644
index cb3922572..000000000
--- a/view/tpl/wallmsg-header.tpl
+++ /dev/null
@@ -1,82 +0,0 @@
-
-<script language="javascript" type="text/javascript" src="$baseurl/library/tinymce/jscripts/tiny_mce/tiny_mce_src.js"></script>
-<script language="javascript" type="text/javascript">
-
-var plaintext = '$editselect';
-
-if(plaintext != 'none') {
- tinyMCE.init({
- theme : "advanced",
- mode : "specific_textareas",
- editor_selector: /(profile-jot-text|prvmail-text)/,
- plugins : "bbcode,paste",
- theme_advanced_buttons1 : "bold,italic,underline,undo,redo,link,unlink,image,forecolor",
- theme_advanced_buttons2 : "",
- theme_advanced_buttons3 : "",
- theme_advanced_toolbar_location : "top",
- theme_advanced_toolbar_align : "center",
- theme_advanced_blockformats : "blockquote,code",
- gecko_spellcheck : true,
- paste_text_sticky : true,
- entity_encoding : "raw",
- add_unload_trigger : false,
- remove_linebreaks : false,
- force_p_newlines : false,
- force_br_newlines : true,
- forced_root_block : '',
- convert_urls: false,
- content_css: "$baseurl/view/custom_tinymce.css",
- //Character count
- theme_advanced_path : false,
- setup : function(ed) {
- ed.onInit.add(function(ed) {
- ed.pasteAsPlainText = true;
- var editorId = ed.editorId;
- var textarea = $('#'+editorId);
- if (typeof(textarea.attr('tabindex')) != "undefined") {
- $('#'+editorId+'_ifr').attr('tabindex', textarea.attr('tabindex'));
- textarea.attr('tabindex', null);
- }
- });
- }
- });
-}
-else
- $("#prvmail-text").contact_autocomplete(baseurl+"/acl");
-
-
-</script>
-<script>
-
- function jotGetLink() {
- reply = prompt("$linkurl");
- if(reply && reply.length) {
- $('#profile-rotator').show();
- $.get('parse_url?url=' + reply, function(data) {
- tinyMCE.execCommand('mceInsertRawHTML',false,data);
- $('#profile-rotator').hide();
- });
- }
- }
-
- function linkdropper(event) {
- var linkFound = event.dataTransfer.types.contains("text/uri-list");
- if(linkFound)
- event.preventDefault();
- }
-
- function linkdrop(event) {
- var reply = event.dataTransfer.getData("text/uri-list");
- event.target.textContent = reply;
- event.preventDefault();
- if(reply && reply.length) {
- $('#profile-rotator').show();
- $.get('parse_url?url=' + reply, function(data) {
- tinyMCE.execCommand('mceInsertRawHTML',false,data);
- $('#profile-rotator').hide();
- });
- }
- }
-
-</script>
-
diff --git a/view/tpl/wallwall_item.tpl b/view/tpl/wallwall_item.tpl
deleted file mode 100644
index 9c824fb3b..000000000
--- a/view/tpl/wallwall_item.tpl
+++ /dev/null
@@ -1,86 +0,0 @@
-<a name="$item.id" ></a>
-<div class="wall-item-outside-wrapper $item.indent$item.previewing wallwall" id="wall-item-outside-wrapper-$item.id" >
- <div class="wall-item-content-wrapper $item.indent" id="wall-item-content-wrapper-$item.id" >
- <div class="wall-item-info wallwall" id="wall-item-info-$item.id">
- <div class="wall-item-photo-wrapper wwto" id="wall-item-ownerphoto-wrapper-$item.id" >
- <a href="$item.owner_url" title="$item.olinktitle" class="wall-item-photo-link" id="wall-item-ownerphoto-link-$item.id">
- <img src="$item.owner_photo" class="wall-item-photo$item.osparkle" id="wall-item-ownerphoto-$item.id" style="height: 80px; width: 80px;" alt="$item.owner_name" /></a>
- </div>
- <div class="wall-item-arrowphoto-wrapper" ><img src="images/larrow.gif" alt="$item.wall" /></div>
- <div class="wall-item-photo-wrapper wwfrom" id="wall-item-photo-wrapper-$item.id"
- onmouseover="if (typeof t$item.id != 'undefined') clearTimeout(t$item.id); openMenu('wall-item-photo-menu-button-$item.id')"
- onmouseout="t$item.id=setTimeout('closeMenu(\'wall-item-photo-menu-button-$item.id\'); closeMenu(\'wall-item-photo-menu-$item.id\');',200)">
- <a href="$item.profile_url" title="$item.linktitle" class="wall-item-photo-link" id="wall-item-photo-link-$item.id">
- <img src="$item.thumb" class="wall-item-photo$item.sparkle" id="wall-item-photo-$item.id" style="height: 80px; width: 80px;" alt="$item.name" /></a>
- <span onclick="openClose('wall-item-photo-menu-$item.id');" class="fakelink wall-item-photo-menu-button" id="wall-item-photo-menu-button-$item.id">menu</span>
- <div class="wall-item-photo-menu" id="wall-item-photo-menu-$item.id">
- <ul>
- $item.item_photo_menu
- </ul>
- </div>
-
- </div>
- <div class="wall-item-photo-end"></div>
- <div class="wall-item-wrapper" id="wall-item-wrapper-$item.id" >
- {{ if $item.lock }}<div class="wall-item-lock"><img src="images/lock_icon.gif" class="lockview" alt="$item.lock" onclick="lockview(event,$item.id);" /></div>
- {{ else }}<div class="wall-item-lock"></div>{{ endif }}
- <div class="wall-item-location" id="wall-item-location-$item.id">$item.location</div>
- </div>
- </div>
- <div class="wall-item-author">
- <a href="$item.profile_url" title="$item.linktitle" class="wall-item-name-link"><span class="wall-item-name$item.sparkle" id="wall-item-name-$item.id" >$item.name</span></a> $item.to <a href="$item.owner_url" title="$item.olinktitle" class="wall-item-name-link"><span class="wall-item-name$item.osparkle" id="wall-item-ownername-$item.id">$item.owner_name</span></a> $item.vwall<br />
- <div id="wall-item-ago-$item.id" class="wall-item-ago"><abbr class="wall-item-ago-time" title="$item.localtime">$item.ago</abbr>{{ if $item.app }}<span class="item.app">$item.str_app</span>{{ endif }}</div>
- </div>
- <div class="wall-item-content" id="wall-item-content-$item.id" >
- <div class="wall-item-title" id="wall-item-title-$item.id">$item.title</div>
- <div class="wall-item-title-end"></div>
- <div class="wall-item-body" id="wall-item-body-$item.id" >$item.body
- <div class="body-tag">
- {{ for $item.tags as $tag }}
- <span class='tag'>$tag</span>
- {{ endfor }}
- </div>
- </div>
- </div>
- <div class="wall-item-tools" id="wall-item-tools-$item.id">
- {{ if $item.vote }}
- <div class="wall-item-like-buttons" id="wall-item-like-buttons-$item.id">
- <a href="#" class="icon like" title="$item.vote.like.0" onclick="dolike($item.id,'like'); return false"></a>
- <a href="#" class="icon dislike" title="$item.vote.dislike.0" onclick="dolike($item.id,'dislike'); return false"></a>
- {{ if $item.vote.share }}<a href="#" class="icon recycle wall-item-share-buttons" title="$item.vote.share.0" onclick="jotShare($item.id); return false"></a>{{ endif }}
- <img id="like-rotator-$item.id" class="like-rotator" src="images/rotator.gif" alt="$item.wait" title="$item.wait" style="display: none;" />
- </div>
- {{ endif }}
- {{ if $item.plink }}
- <div class="wall-item-links-wrapper"><a href="$item.plink.href" title="$item.plink.title" class="icon remote-link$item.sparkle"></a></div>
- {{ endif }}
- {{ if $item.edpost }}
- <a class="editpost icon pencil" href="$item.edpost.0" title="$item.edpost.1"></a>
- {{ endif }}
-
- {{ if $item.star }}
- <a href="#" id="starred-$item.id" onclick="dostar($item.id); return false;" class="star-item icon $item.isstarred" title="$item.star.toggle"></a>
- <a href="#" id="tagger-$item.id" onclick="itemTag($item.id); return false;" class="tag-item icon tagged" title="$item.star.tagger"></a>
- {{ endif }}
- {{ if $item.filer }}
- <a href="#" id="filer-$item.id" onclick="itemFiler($item.id); return false;" class="filer-item filer-icon" title="$item.filer"></a>
- {{ endif }}
-
- <div class="wall-item-delete-wrapper" id="wall-item-delete-wrapper-$item.id" >
- {{ if $item.drop.dropping }}<a href="item/drop/$item.id" onclick="return confirmDelete();" class="icon drophide" title="$item.drop.delete" onmouseover="imgbright(this);" onmouseout="imgdull(this);" ></a>{{ endif }}
- </div>
- {{ if $item.drop.pagedropping }}<input type="checkbox" onclick="checkboxhighlight(this);" title="$item.drop.select" class="item-select" name="itemselected[]" value="$item.id" />{{ endif }}
- <div class="wall-item-delete-end"></div>
- </div>
- </div>
- <div class="wall-item-wrapper-end"></div>
- <div class="wall-item-like $item.indent" id="wall-item-like-$item.id">$item.like</div>
- <div class="wall-item-dislike $item.indent" id="wall-item-dislike-$item.id">$item.dislike</div>
- <div class="wall-item-comment-separator"></div>
- <div class="wall-item-comment-wrapper">
- $item.comment
- </div>
-
-<div class="wall-item-outside-wrapper-end $item.indent" ></div>
-</div>
-
diff --git a/view/tpl/wallwall_thread.tpl b/view/tpl/wallwall_thread.tpl
deleted file mode 100644
index ecfb65aef..000000000
--- a/view/tpl/wallwall_thread.tpl
+++ /dev/null
@@ -1,107 +0,0 @@
-{{if $item.comment_firstcollapsed}}
- <div class="hide-comments-outer">
- <span id="hide-comments-total-$item.id" class="hide-comments-total">$item.num_comments</span> <span id="hide-comments-$item.id" class="hide-comments fakelink" onclick="showHideComments($item.id);">$item.hide_text</span>
- </div>
- <div id="collapsed-comments-$item.id" class="collapsed-comments" style="display: none;">
-{{endif}}
-<div id="tread-wrapper-$item.id" class="tread-wrapper $item.toplevel">
-<a name="$item.id" ></a>
-<div class="wall-item-outside-wrapper $item.indent$item.previewing wallwall" id="wall-item-outside-wrapper-$item.id" >
- <div class="wall-item-content-wrapper $item.indent" id="wall-item-content-wrapper-$item.id" >
- <div class="wall-item-info wallwall" id="wall-item-info-$item.id">
- <div class="wall-item-photo-wrapper wwto" id="wall-item-ownerphoto-wrapper-$item.id" >
- <a href="$item.owner_url" title="$item.olinktitle" class="wall-item-photo-link" id="wall-item-ownerphoto-link-$item.id">
- <img src="$item.owner_photo" class="wall-item-photo$item.osparkle" id="wall-item-ownerphoto-$item.id" style="height: 80px; width: 80px;" alt="$item.owner_name" /></a>
- </div>
- <div class="wall-item-arrowphoto-wrapper" ><img src="images/larrow.gif" alt="$item.wall" /></div>
- <div class="wall-item-photo-wrapper wwfrom" id="wall-item-photo-wrapper-$item.id"
- onmouseover="if (typeof t$item.id != 'undefined') clearTimeout(t$item.id); openMenu('wall-item-photo-menu-button-$item.id')"
- onmouseout="t$item.id=setTimeout('closeMenu(\'wall-item-photo-menu-button-$item.id\'); closeMenu(\'wall-item-photo-menu-$item.id\');',200)">
- <a href="$item.profile_url" title="$item.linktitle" class="wall-item-photo-link" id="wall-item-photo-link-$item.id">
- <img src="$item.thumb" class="wall-item-photo$item.sparkle" id="wall-item-photo-$item.id" style="height: 80px; width: 80px;" alt="$item.name" /></a>
- <span onclick="openClose('wall-item-photo-menu-$item.id');" class="fakelink wall-item-photo-menu-button" id="wall-item-photo-menu-button-$item.id">menu</span>
- <div class="wall-item-photo-menu" id="wall-item-photo-menu-$item.id">
- <ul>
- $item.item_photo_menu
- </ul>
- </div>
-
- </div>
- <div class="wall-item-photo-end"></div>
- <div class="wall-item-wrapper" id="wall-item-wrapper-$item.id" >
- {{ if $item.lock }}<div class="wall-item-lock"><img src="images/lock_icon.gif" class="lockview" alt="$item.lock" onclick="lockview(event,$item.id);" /></div>
- {{ else }}<div class="wall-item-lock"></div>{{ endif }}
- <div class="wall-item-location" id="wall-item-location-$item.id">$item.location</div>
- </div>
- </div>
- <div class="wall-item-author">
- <a href="$item.profile_url" title="$item.linktitle" class="wall-item-name-link"><span class="wall-item-name$item.sparkle" id="wall-item-name-$item.id" >$item.name</span></a> $item.to <a href="$item.owner_url" title="$item.olinktitle" class="wall-item-name-link"><span class="wall-item-name$item.osparkle" id="wall-item-ownername-$item.id">$item.owner_name</span></a> $item.vwall<br />
- <div class="wall-item-ago" id="wall-item-ago-$item.id">$item.ago</div>
- </div>
- <div class="wall-item-content" id="wall-item-content-$item.id" >
- <div class="wall-item-title" id="wall-item-title-$item.id">$item.title</div>
- <div class="wall-item-title-end"></div>
- <div class="wall-item-body" id="wall-item-body-$item.id" >$item.body
- <div class="body-tag">
- {{ for $item.tags as $tag }}
- <span class='tag'>$tag</span>
- {{ endfor }}
- </div>
- </div>
- </div>
- <div class="wall-item-tools" id="wall-item-tools-$item.id">
- {{ if $item.vote }}
- <div class="wall-item-like-buttons" id="wall-item-like-buttons-$item.id">
- <a href="#" class="icon like" title="$item.vote.like.0" onclick="dolike($item.id,'like'); return false"></a>
- <a href="#" class="icon dislike" title="$item.vote.dislike.0" onclick="dolike($item.id,'dislike'); return false"></a>
- {{ if $item.vote.share }}<a href="#" class="icon recycle wall-item-share-buttons" title="$item.vote.share.0" onclick="jotShare($item.id); return false"></a>{{ endif }}
- <img id="like-rotator-$item.id" class="like-rotator" src="images/rotator.gif" alt="$item.wait" title="$item.wait" style="display: none;" />
- </div>
- {{ endif }}
- {{ if $item.plink }}
- <div class="wall-item-links-wrapper"><a href="$item.plink.href" title="$item.plink.title" class="icon remote-link$item.sparkle"></a></div>
- {{ endif }}
- {{ if $item.edpost }}
- <a class="editpost icon pencil" href="$item.edpost.0" title="$item.edpost.1"></a>
- {{ endif }}
-
- {{ if $item.star }}
- <a href="#" id="starred-$item.id" onclick="dostar($item.id); return false;" class="star-item icon $item.isstarred" title="$item.star.toggle"></a>
- <a href="#" id="tagger-$item.id" onclick="itemTag($item.id); return false;" class="tag-item icon tagged" title="$item.star.tagger"></a>
- {{ endif }}
- {{ if $item.filer }}
- <a href="#" id="filer-$item.id" onclick="itemFiler($item.id); return false;" class="filer-item filer-icon" title="$item.filer"></a>
- {{ endif }}
-
- <div class="wall-item-delete-wrapper" id="wall-item-delete-wrapper-$item.id" >
- {{ if $item.drop.dropping }}<a href="item/drop/$item.id" onclick="return confirmDelete();" class="icon drophide" title="$item.drop.delete" onmouseover="imgbright(this);" onmouseout="imgdull(this);" ></a>{{ endif }}
- </div>
- {{ if $item.drop.dropping }}<input type="checkbox" onclick="checkboxhighlight(this);" title="$item.drop.select" class="item-select" name="itemselected[]" value="$item.id" />{{ endif }}
- <div class="wall-item-delete-end"></div>
- </div>
- </div>
- <div class="wall-item-wrapper-end"></div>
- <div class="wall-item-like $item.indent" id="wall-item-like-$item.id">$item.like</div>
- <div class="wall-item-dislike $item.indent" id="wall-item-dislike-$item.id">$item.dislike</div>
-
- {{ if $item.threaded }}
- {{ if $item.comment }}
- <div class="wall-item-comment-wrapper $item.indent" >
- $item.comment
- </div>
- {{ endif }}
- {{ endif }}
-
-<div class="wall-item-outside-wrapper-end $item.indent" ></div>
-</div>
-{{ for $item.children as $item }}
- {{ inc $item.template }}{{ endinc }}
-{{ endfor }}
-
-{{ if $item.flatten }}
-<div class="wall-item-comment-wrapper" >
- $item.comment
-</div>
-{{ endif }}
-</div>
-{{if $item.comment_lastcollapsed}}</div>{{endif}}
diff --git a/view/tpl/webpagelist.tpl b/view/tpl/webpagelist.tpl
new file mode 100644
index 000000000..c19836a28
--- /dev/null
+++ b/view/tpl/webpagelist.tpl
@@ -0,0 +1,18 @@
+{{if $pages}}
+
+ <div id="pagelist-content-wrapper" class="generic-content-wrapper">
+ {{foreach $pages as $key => $items}}
+ {{foreach $items as $item}}
+ <div class="page-list-item">
+ {{if $edit}}<a href="{{$baseurl}}/{{$item.url}}" title="{{$edit}}"><i class="icon-pencil design-icons design-edit-icon"></i></a> {{/if}}
+ {{if $view}}<a href="page/{{$channel}}/{{$item.title}}" title="{{$view}}"><i class="icon-external-link design-icons design-view-icon"></i></a> {{/if}}
+ {{if $preview}}<a href="page/{{$channel}}/{{$item.title}}?iframe=true&width=80%&height=80%" title="{{$preview}}" class="webpage-preview" ><i class="icon-eye-open design-icons design-preview-icon"></i></a> {{/if}}
+ {{$item.title}}
+ </div>
+ {{/foreach}}
+ {{/foreach}}
+ </div>
+
+ <div class="clear"></div>
+
+{{/if}}
diff --git a/view/tpl/write_pages.tpl b/view/tpl/write_pages.tpl
new file mode 100644
index 000000000..53146ee30
--- /dev/null
+++ b/view/tpl/write_pages.tpl
@@ -0,0 +1,3 @@
+<div id="write-pages" class="bigwidget">
+<span id="wp-new"><a href="{{$newurl}}">{{$new}}</a></span> <span id="wp-edit"><a href="{{$editurl}}">{{$edit}}</a></span>
+</div>
diff --git a/view/tpl/xchan_vcard.tpl b/view/tpl/xchan_vcard.tpl
index f0b623927..929965727 100644..100755
--- a/view/tpl/xchan_vcard.tpl
+++ b/view/tpl/xchan_vcard.tpl
@@ -1,20 +1,20 @@
<div class="vcard">
-<div class="fn">$name</div>
-<div id="profile-photo-wrapper"><img class="vcard-photo photo" src="$photo" alt="name" /></div>
+<div class="fn">{{$name}}</div>
+<div id="profile-photo-wrapper"><img class="vcard-photo photo" src="{{$photo}}" alt="{{$name}}" /></div>
</div>
-
+{{if $mode != 'mail'}}
<div id="profile-extra-links">
<ul>
-{{ if $connect }}
- <li><a id="follow-link" href="follow?f=&url=$follow">$connect</a></li>
-{{ endif }}
-{{ if $newwin }}
- <li><a id="visit-chan-link" href="$url" title="$newtit" target="_blank" >$newwin</a></li>
-{{ endif }}
+{{if $connect}}
+ <li><a id="follow-link" href="follow?f=&url={{$follow}}">{{$connect}}</a></li>
+{{/if}}
+{{if $newwin}}
+ <li><a id="visit-chan-link" href="{{$url}}" title="{{$newtit}}" target="_blank" >{{$newwin}}</a></li>
+{{/if}}
</ul>
</div>
-
+{{/if}}
diff --git a/view/tpl/xrd_host.tpl b/view/tpl/xrd_host.tpl
index 94e3c2146..4bcc5bbdb 100644..100755
--- a/view/tpl/xrd_host.tpl
+++ b/view/tpl/xrd_host.tpl
@@ -2,17 +2,17 @@
<XRD xmlns='http://docs.oasis-open.org/ns/xri/xrd-1.0'
xmlns:hm='http://host-meta.net/xrd/1.0'>
- <hm:Host>$zhost</hm:Host>
+ <hm:Host>{{$zhost}}</hm:Host>
- <Link rel='lrdd' template='$domain/xrd/?uri={uri}' />
- <Link rel='acct-mgmt' href='$domain/amcd' />
- <Link rel='http://services.mozilla.com/amcd/0.1' href='$domain/amcd' />
+ <Link rel='lrdd' template='{{$domain}}/xrd/?uri={uri}' />
+ <Link rel='acct-mgmt' href='{{$domain}}/amcd' />
+ <Link rel='http://services.mozilla.com/amcd/0.1' href='{{$domain}}/amcd' />
<Link rel="http://oexchange.org/spec/0.8/rel/resident-target" type="application/xrd+xml"
- href="$domain/oexchange/xrd" />
+ href="{{$domain}}/oexchange/xrd" />
<Property xmlns:mk="http://salmon-protocol.org/ns/magic-key"
type="http://salmon-protocol.org/ns/magic-key"
- mk:key_id="1">$bigkey</Property>
+ mk:key_id="1">{{$bigkey}}</Property>
</XRD>
diff --git a/view/tpl/xrd_person.tpl b/view/tpl/xrd_person.tpl
index 3a6ca7ba7..035ab251f 100644..100755
--- a/view/tpl/xrd_person.tpl
+++ b/view/tpl/xrd_person.tpl
@@ -1,29 +1,29 @@
<?xml version="1.0" encoding="UTF-8"?>
<XRD xmlns="http://docs.oasis-open.org/ns/xri/xrd-1.0">
- <Subject>$accturi</Subject>
- <Alias>$accturi</Alias>
- <Alias>$profile_url</Alias>
+ <Subject>{{$accturi}}</Subject>
+ <Alias>{{$accturi}}</Alias>
+ <Alias>{{$profile_url}}</Alias>
<Link rel="http://purl.org/macgirvin/dfrn/1.0"
- href="$profile_url" />
+ href="{{$profile_url}}" />
<Link rel="http://schemas.google.com/g/2010#updates-from"
type="application/atom+xml"
- href="$atom" />
+ href="{{$atom}}" />
<Link rel="http://webfinger.net/rel/profile-page"
type="text/html"
- href="$profile_url" />
+ href="{{$profile_url}}" />
<Link rel="http://microformats.org/profile/hcard"
type="text/html"
- href="$hcard_url" />
+ href="{{$hcard_url}}" />
<Link rel="http://portablecontacts.net/spec/1.0"
- href="$poco_url" />
+ href="{{$poco_url}}" />
<Link rel="http://webfinger.net/rel/avatar"
type="image/jpeg"
- href="$photo" />
+ href="{{$photo}}" />
<Property xmlns:mk="http://salmon-protocol.org/ns/magic-key"
type="http://salmon-protocol.org/ns/magic-key"
- mk:key_id="1">$bigkey</Property>
+ mk:key_id="1">{{$bigkey}}</Property>
</XRD>